summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre Schmitz <pierre@archlinux.de>2013-08-12 09:28:15 +0200
committerPierre Schmitz <pierre@archlinux.de>2013-08-12 09:28:15 +0200
commit08aa4418c30cfc18ccc69a0f0f9cb9e17be6c196 (patch)
tree577a29fb579188d16003a209ce2a2e9c5b0aa2bd
parentcacc939b34e315b85e2d72997811eb6677996cc1 (diff)
Update to MediaWiki 1.21.1
-rw-r--r--.gitreview6
-rw-r--r--.jshintignore28
-rw-r--r--.jshintrc25
-rw-r--r--CREDITS42
-rw-r--r--HISTORY1597
-rw-r--r--INSTALL18
-rw-r--r--README4
-rw-r--r--README.mediawiki122
-rw-r--r--RELEASE-NOTES-1.20500
-rw-r--r--RELEASE-NOTES-1.21417
-rw-r--r--StartProfiler.sample4
-rw-r--r--UPGRADE27
-rw-r--r--api.php15
-rw-r--r--api.php52
-rwxr-xr-xbin/svnstat2
-rwxr-xr-xbin/ulimit-tvf.sh6
-rw-r--r--bin/ulimit.sh7
-rwxr-xr-xbin/ulimit4.sh4
-rw-r--r--composer.json6
-rw-r--r--docs/contenthandler.txt184
-rw-r--r--docs/database.txt1
-rw-r--r--docs/databases/ibm_db2.txt3
-rw-r--r--docs/export-0.8.xsd289
-rw-r--r--docs/export-demo.xml18
-rw-r--r--docs/hooks.txt1725
-rw-r--r--docs/maintenance.txt2
-rw-r--r--docs/memcached.txt6
-rw-r--r--docs/uidesign/design.html4
-rw-r--r--extensions/Cite/Cite.i18n.php4274
-rw-r--r--extensions/Cite/Cite.php111
-rw-r--r--extensions/Cite/Cite_body.php1197
-rw-r--r--extensions/Cite/SpecialCite.alias.php409
-rw-r--r--extensions/Cite/SpecialCite.i18n.php6135
-rw-r--r--extensions/Cite/SpecialCite.php90
-rw-r--r--extensions/Cite/SpecialCite_body.php180
-rw-r--r--extensions/Cite/citeCatTreeParserTests.txt27
-rw-r--r--extensions/Cite/citeParserTests.txt449
-rw-r--r--extensions/Cite/modules/ext.cite/ext.cite.js12
-rw-r--r--extensions/Cite/modules/ext.rtlcite/ext.rtlcite.css6
-rw-r--r--extensions/Cite/modules/ext.specialcite/ext.specialcite.css14
-rw-r--r--extensions/Cite/modules/jquery.tooltip/jquery.tooltip.css9
-rw-r--r--extensions/Cite/modules/jquery.tooltip/jquery.tooltip.js294
-rw-r--r--extensions/ConfirmEdit/.gitreview5
-rw-r--r--extensions/ConfirmEdit/ApiFancyCaptchaReload.php34
-rw-r--r--extensions/ConfirmEdit/Asirra.class.php2
-rw-r--r--extensions/ConfirmEdit/Asirra.i18n.php153
-rw-r--r--extensions/ConfirmEdit/Asirra.php16
-rw-r--r--extensions/ConfirmEdit/Captcha.php26
-rw-r--r--extensions/ConfirmEdit/ConfirmEdit.alias.php5
-rw-r--r--extensions/ConfirmEdit/ConfirmEdit.i18n.php353
-rw-r--r--extensions/ConfirmEdit/ConfirmEdit.php4
-rw-r--r--extensions/ConfirmEdit/ConfirmEditHooks.php5
-rw-r--r--extensions/ConfirmEdit/FancyCaptcha.class.php114
-rw-r--r--extensions/ConfirmEdit/FancyCaptcha.i18n.php128
-rw-r--r--extensions/ConfirmEdit/FancyCaptcha.php16
-rw-r--r--extensions/ConfirmEdit/MathCaptcha.class.php5
-rw-r--r--extensions/ConfirmEdit/QuestyCaptcha.class.php1
-rw-r--r--extensions/ConfirmEdit/QuestyCaptcha.i18n.php162
-rw-r--r--extensions/ConfirmEdit/README6
-rw-r--r--extensions/ConfirmEdit/ReCaptcha.class.php12
-rw-r--r--extensions/ConfirmEdit/ReCaptcha.i18n.php70
-rw-r--r--extensions/ConfirmEdit/captcha.py5
-rw-r--r--extensions/ConfirmEdit/maintenance/GenerateFancyCaptchas.php6
-rw-r--r--extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js (renamed from extensions/ConfirmEdit/ext.confirmedit.asirra.js)0
-rw-r--r--extensions/ConfirmEdit/resources/ext.confirmEdit.fancyCaptcha.css41
-rw-r--r--extensions/ConfirmEdit/resources/ext.confirmEdit.fancyCaptcha.js37
-rw-r--r--extensions/ConfirmEdit/resources/images/ajax-loader-10x10.gifbin0 -> 6147 bytes
-rw-r--r--extensions/ConfirmEdit/resources/images/fancycaptcha-reload-icon.pngbin0 -> 307 bytes
-rw-r--r--extensions/Gadgets/.gitreview5
-rw-r--r--extensions/Gadgets/Gadgets.alias.php22
-rw-r--r--extensions/Gadgets/Gadgets.i18n.php225
-rw-r--r--extensions/Gadgets/Gadgets.php2
-rw-r--r--extensions/Gadgets/Gadgets_body.php51
-rw-r--r--extensions/Gadgets/Gadgets_tests.php81
-rw-r--r--extensions/ImageMap/ImageMap.i18n.php2122
-rw-r--r--extensions/ImageMap/ImageMap.php23
-rw-r--r--extensions/ImageMap/ImageMap_body.php391
-rw-r--r--extensions/ImageMap/desc-20.pngbin0 -> 1138 bytes
-rw-r--r--extensions/ImageMap/desc.svg299
-rw-r--r--extensions/InputBox/InputBox.classes.php593
-rw-r--r--extensions/InputBox/InputBox.hooks.php73
-rw-r--r--extensions/InputBox/InputBox.i18n.php2292
-rw-r--r--extensions/InputBox/InputBox.php54
-rw-r--r--extensions/Interwiki/Interwiki.alias.php244
-rw-r--r--extensions/Interwiki/Interwiki.css45
-rw-r--r--extensions/Interwiki/Interwiki.i18n.php5157
-rw-r--r--extensions/Interwiki/Interwiki.php75
-rw-r--r--extensions/Interwiki/Interwiki_body.php406
-rw-r--r--extensions/LocalisationUpdate/KNOWN_ISSUES.txt11
-rw-r--r--extensions/LocalisationUpdate/LocalisationUpdate.class.php588
-rw-r--r--extensions/LocalisationUpdate/LocalisationUpdate.i18n.php528
-rw-r--r--extensions/LocalisationUpdate/LocalisationUpdate.php42
-rw-r--r--extensions/LocalisationUpdate/QuickArrayReader.php187
-rw-r--r--extensions/LocalisationUpdate/README_FIRST.txt8
-rw-r--r--extensions/LocalisationUpdate/update.php38
-rw-r--r--extensions/Nuke/.gitreview5
-rw-r--r--extensions/Nuke/Nuke.alias.php16
-rw-r--r--extensions/Nuke/Nuke.i18n.php411
-rw-r--r--extensions/Nuke/Nuke_body.php2
-rw-r--r--extensions/Nuke/RELEASE-NOTES2
-rw-r--r--extensions/ParserFunctions/.gitreview5
-rw-r--r--extensions/ParserFunctions/Expr.php47
-rw-r--r--extensions/ParserFunctions/ParserFunctions.i18n.magic.php256
-rw-r--r--extensions/ParserFunctions/ParserFunctions.i18n.php301
-rw-r--r--extensions/ParserFunctions/ParserFunctions.php14
-rw-r--r--extensions/ParserFunctions/ParserFunctions_body.php12
-rw-r--r--extensions/ParserFunctions/exprTests.txt39
-rw-r--r--extensions/ParserFunctions/funcsParserTests.txt21
-rw-r--r--extensions/ParserFunctions/testExpr.php38
-rw-r--r--extensions/PdfHandler/CreatePdfThumbnailsJob.class.php126
-rw-r--r--extensions/PdfHandler/PdfHandler.i18n.php1164
-rw-r--r--extensions/PdfHandler/PdfHandler.image.php309
-rw-r--r--extensions/PdfHandler/PdfHandler.php64
-rw-r--r--extensions/PdfHandler/PdfHandler_body.php347
-rw-r--r--extensions/Poem/Poem.class.php84
-rw-r--r--extensions/Poem/Poem.i18n.php721
-rw-r--r--extensions/Poem/Poem.php33
-rw-r--r--extensions/Poem/install.settings2
-rw-r--r--extensions/Poem/poemParserTests.txt142
-rw-r--r--extensions/Renameuser/.gitreview5
-rw-r--r--extensions/Renameuser/README13
-rw-r--r--extensions/Renameuser/RenameUserJob.php6
-rw-r--r--extensions/Renameuser/Renameuser.alias.php27
-rw-r--r--extensions/Renameuser/Renameuser.hooks.php56
-rw-r--r--extensions/Renameuser/Renameuser.i18n.php1028
-rw-r--r--extensions/Renameuser/Renameuser.php83
-rw-r--r--extensions/Renameuser/RenameuserLogFormatter.php71
-rw-r--r--extensions/Renameuser/RenameuserSQL.php241
-rw-r--r--extensions/Renameuser/Renameuser_body.php577
-rw-r--r--extensions/Renameuser/SpecialRenameuser.php6
-rw-r--r--extensions/Renameuser/cleanupArchiveUserText.php59
-rw-r--r--extensions/Renameuser/hooks.txt34
-rw-r--r--extensions/Renameuser/renameUserCleanup.php2
-rw-r--r--extensions/Renameuser/specials/SpecialRenameuser.php383
-rw-r--r--extensions/SpamBlacklist/BaseBlacklist.php371
-rw-r--r--extensions/SpamBlacklist/EmailBlacklist.php59
-rw-r--r--extensions/SpamBlacklist/README148
-rw-r--r--extensions/SpamBlacklist/SpamBlacklist.i18n.php3568
-rw-r--r--extensions/SpamBlacklist/SpamBlacklist.php47
-rw-r--r--extensions/SpamBlacklist/SpamBlacklistHooks.php163
-rw-r--r--extensions/SpamBlacklist/SpamBlacklist_body.php153
-rw-r--r--extensions/SpamBlacklist/SpamRegexBatch.php175
-rw-r--r--extensions/SpamBlacklist/cleanup.php125
-rw-r--r--extensions/SyntaxHighlight_GeSHi/README73
-rw-r--r--extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php519
-rw-r--r--extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.i18n.php1293
-rw-r--r--extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.local.php15
-rw-r--r--extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php88
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/contrib/aliased.php123
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/contrib/cssgen.php466
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/contrib/cssgen2.php59
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/contrib/example.php217
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/contrib/langcheck.php769
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/contrib/langwiz.php1158
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/BUGS29
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/CHANGES923
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/COPYING340
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/README33
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/THANKS249
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/TODO71
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/__filesource/fsource_geshi_core_geshi.php.html4616
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/blank.html13
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/classtrees_geshi.html24
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/elementindex.html867
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/elementindex_geshi.html864
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/errors.html20
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/geshi/core/GeSHi.html2676
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/geshi/core/_geshi.php.html478
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/index.html24
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/li_geshi.html46
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/banner.css33
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractClass.pngbin0 -> 459 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractClass_logo.pngbin0 -> 1010 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractMethod.pngbin0 -> 566 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractPrivateClass.pngbin0 -> 646 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractPrivateClass_logo.pngbin0 -> 1331 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractPrivateMethod.pngbin0 -> 672 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Class.pngbin0 -> 438 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Class_logo.pngbin0 -> 1306 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Constant.pngbin0 -> 621 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Constructor.pngbin0 -> 666 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Destructor.pngbin0 -> 753 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Function.pngbin0 -> 478 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Global.pngbin0 -> 580 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/I.pngbin0 -> 111 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Index.pngbin0 -> 449 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Interface.pngbin0 -> 457 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Interface_logo.pngbin0 -> 1306 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/L.pngbin0 -> 118 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Lminus.pngbin0 -> 133 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Lplus.pngbin0 -> 139 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Method.pngbin0 -> 528 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Page.pngbin0 -> 460 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Page_logo.pngbin0 -> 1102 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateClass.pngbin0 -> 645 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateClass_logo.pngbin0 -> 1511 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateMethod.pngbin0 -> 710 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateVariable.pngbin0 -> 641 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/StaticMethod.pngbin0 -> 528 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/StaticVariable.pngbin0 -> 564 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/T.pngbin0 -> 119 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Tminus.pngbin0 -> 135 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Tplus.pngbin0 -> 140 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Variable.pngbin0 -> 564 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/blank.pngbin0 -> 105 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/class_folder.pngbin0 -> 497 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/empty.pngbin0 -> 90 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/file.pngbin0 -> 218 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/folder.pngbin0 -> 367 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/function_folder.pngbin0 -> 476 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/next_button.pngbin0 -> 509 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/next_button_disabled.pngbin0 -> 405 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/package.pngbin0 -> 515 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/package_folder.pngbin0 -> 419 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/previous_button.pngbin0 -> 505 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/previous_button_disabled.pngbin0 -> 405 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/private_class_logo.pngbin0 -> 1511 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/tutorial.pngbin0 -> 301 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/tutorial_folder.pngbin0 -> 425 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/up_button.pngbin0 -> 527 bytes
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/stylesheet.css146
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/packages.html29
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/api/todolist.html42
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/geshi-doc.html4077
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/geshi-doc.txt1741
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/docs/phpdoc.ini90
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi.php4775
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/4cs.php139
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/6502acme.php230
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/6502kickass.php241
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/6502tasm.php189
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/68000devpac.php168
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/abap.php1409
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/actionscript.php197
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/actionscript3.php473
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/ada.php135
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/algol68.php329
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/apache.php483
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/applescript.php157
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/apt_sources.php148
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/arm.php3318
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/asm.php603
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/asp.php164
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/asymptote.php194
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/autoconf.php512
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/autohotkey.php373
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/autoit.php1175
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/avisynth.php194
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/awk.php158
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/bascomavr.php185
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/bash.php440
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/basic4gl.php341
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/bf.php115
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/bibtex.php183
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/blitzbasic.php185
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/bnf.php119
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/boo.php217
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/c.php281
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/c_loadrunner.php323
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/c_mac.php227
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/caddcl.php126
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/cadlisp.php186
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/cfdg.php124
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/cfm.php299
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/chaiscript.php140
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/cil.php196
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/clojure.php134
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/cmake.php181
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/cobol.php244
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/coffeescript.php146
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/cpp-qt.php564
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/cpp.php240
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/csharp.php256
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/css.php226
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/cuesheet.php138
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/d.php252
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/dcl.php192
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/dcpu16.php131
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/dcs.php182
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/delphi.php301
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/diff.php196
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/div.php126
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/dos.php227
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/dot.php164
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/e.php208
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/ecmascript.php210
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/eiffel.php395
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/email.php222
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/epc.php154
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/erlang.php441
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/euphoria.php140
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/f1.php151
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/falcon.php218
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/fo.php327
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/fortran.php160
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/freebasic.php141
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/freeswitch.php168
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/fsharp.php213
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/gambas.php214
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/gdb.php198
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/genero.php463
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/genie.php157
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/gettext.php97
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/glsl.php205
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/gml.php506
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/gnuplot.php296
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/go.php375
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/groovy.php1011
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/gwbasic.php153
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/haskell.php202
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/haxe.php161
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/hicest.php108
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/hq9plus.php104
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/html4strict.php190
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/html5.php212
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/icon.php212
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/idl.php123
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/ini.php128
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/inno.php212
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/intercal.php122
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/io.php138
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/j.php190
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/java.php983
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/java5.php1037
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/javascript.php174
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/jquery.php238
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/kixtart.php329
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/klonec.php282
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/klonecpp.php310
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/latex.php223
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/lb.php162
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/ldif.php116
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/lisp.php144
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/llvm.php385
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/locobasic.php130
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/logtalk.php345
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/lolcode.php152
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/lotusformulas.php318
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/lotusscript.php191
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/lscript.php387
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/lsl2.php898
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/lua.php177
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/m68k.php143
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/magiksf.php193
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/make.php151
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/mapbasic.php908
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/matlab.php227
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/mirc.php171
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/mmix.php193
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/modula2.php136
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/modula3.php135
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/mpasm.php164
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/mxml.php145
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/mysql.php475
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/nagios.php225
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/netrexx.php163
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/newlisp.php191
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/nsis.php351
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/oberon2.php135
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/objc.php358
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/objeck.php116
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/ocaml-brief.php112
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/ocaml.php187
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/octave.php515
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/oobas.php135
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/oorexx.php171
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/oracle11.php614
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/oracle8.php496
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/oxygene.php154
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/oz.php144
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/parasail.php133
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/parigp.php277
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/pascal.php165
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/pcre.php188
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/per.php302
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/perl.php213
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/perl6.php197
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/pf.php178
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/php-brief.php222
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/php.php1117
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/pic16.php141
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/pike.php103
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/pixelbender.php176
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/pli.php200
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/plsql.php256
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/postgresql.php288
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/povray.php199
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/powerbuilder.php418
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/powershell.php277
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/proftpd.php374
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/progress.php485
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/prolog.php143
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/properties.php127
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/providex.php299
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/purebasic.php303
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/pycon.php64
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/pys60.php273
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/python.php244
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/q.php149
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/qbasic.php162
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/rails.php406
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/rebol.php196
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/reg.php233
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/rexx.php162
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/robots.php100
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/rpmspec.php133
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/rsplus.php483
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/ruby.php231
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/sas.php290
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/scala.php138
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/scheme.php170
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/scilab.php295
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/sdlbasic.php165
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/smalltalk.php154
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/smarty.php192
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/spark.php132
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/sparql.php155
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/sql.php165
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/stonescript.php307
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/systemverilog.php317
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/tcl.php194
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/teraterm.php354
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/text.php84
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/thinbasic.php868
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/tsql.php375
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/typoscript.php300
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/unicon.php210
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/upc.php270
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/urbi.php200
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/uscript.php299
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/vala.php151
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/vb.php157
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/vbnet.php182
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/vedit.php103
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/verilog.php173
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/vhdl.php183
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/vim.php420
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/visualfoxpro.php456
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/visualprolog.php129
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/whitespace.php121
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/whois.php180
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/winbatch.php369
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/xbasic.php143
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/xml.php157
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/xorg_conf.php124
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/xpp.php436
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/yaml.php150
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/z80.php144
-rw-r--r--extensions/SyntaxHighlight_GeSHi/geshi/geshi/zxbasic.php150
-rw-r--r--extensions/TitleBlacklist/TitleBlacklist.hooks.php182
-rw-r--r--extensions/TitleBlacklist/TitleBlacklist.i18n.php2454
-rw-r--r--extensions/TitleBlacklist/TitleBlacklist.list.php510
-rw-r--r--extensions/TitleBlacklist/TitleBlacklist.php86
-rw-r--r--extensions/TitleBlacklist/api/ApiQueryTitleBlacklist.php115
-rw-r--r--extensions/TitleBlacklist/modules/mediawiki.api.titleblacklist.js67
-rw-r--r--extensions/Vector/.gitreview5
-rw-r--r--extensions/Vector/Vector.hooks.php14
-rw-r--r--extensions/Vector/Vector.i18n.php205
-rw-r--r--extensions/Vector/Vector.php13
-rw-r--r--extensions/Vector/modules/ext.vector.collapsibleNav.css11
-rw-r--r--extensions/Vector/modules/ext.vector.collapsibleNav.js12
-rw-r--r--extensions/Vector/modules/ext.vector.collapsibleTabs.js136
-rw-r--r--extensions/Vector/modules/ext.vector.editWarning.js55
-rw-r--r--extensions/Vector/modules/ext.vector.footerCleanup.css34
-rw-r--r--extensions/Vector/modules/ext.vector.footerCleanup.js8
-rw-r--r--extensions/Vector/modules/ext.vector.sectionEditLinks.js14
-rw-r--r--extensions/Vector/modules/jquery.collapsibleTabs.js206
-rw-r--r--extensions/Vector/modules/jquery.footerCollapsibleList.js70
-rw-r--r--extensions/WikiEditor/.gitreview6
-rw-r--r--extensions/WikiEditor/.jshintignore2
-rw-r--r--extensions/WikiEditor/.jshintrc9
-rw-r--r--extensions/WikiEditor/README4
-rw-r--r--extensions/WikiEditor/WikiEditor.hooks.php3
-rw-r--r--extensions/WikiEditor/WikiEditor.i18n.php2578
-rw-r--r--extensions/WikiEditor/WikiEditor.php5
-rw-r--r--extensions/WikiEditor/composer.json11
-rw-r--r--extensions/WikiEditor/modules/images/dialogs/insert-link-exists.pngbin293 -> 273 bytes
-rw-r--r--extensions/WikiEditor/modules/images/dialogs/insert-link-external-rtl.pngbin234 -> 232 bytes
-rw-r--r--extensions/WikiEditor/modules/images/dialogs/insert-link-external.pngbin235 -> 230 bytes
-rw-r--r--extensions/WikiEditor/modules/images/templateEditor/dialog-collapsed.pngbin273 -> 266 bytes
-rw-r--r--extensions/WikiEditor/modules/images/templateEditor/dialog-expanded.pngbin274 -> 263 bytes
-rw-r--r--extensions/WikiEditor/modules/images/templateEditor/expand.pngbin234 -> 223 bytes
-rw-r--r--extensions/WikiEditor/modules/images/templateEditor/name-base.pngbin148 -> 138 bytes
-rw-r--r--extensions/WikiEditor/modules/images/templateEditor/text-base.pngbin96 -> 88 bytes
-rw-r--r--extensions/WikiEditor/modules/images/templateEditor/wiki-text.pngbin211 -> 206 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toc/close.pngbin319 -> 216 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toc/grab.pngbin102 -> 92 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toc/grip.pngbin119 -> 108 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toc/open.pngbin321 -> 217 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/arrow-down.pngbin145 -> 134 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/arrow-ltr.pngbin143 -> 131 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/arrow-rtl.pngbin145 -> 135 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/base.pngbin174 -> 160 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/button-sprite.pngbin19362 -> 17742 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/example-image.pngbin1005 -> 1004 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-big.pngbin577 -> 576 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-bold-L.pngbin0 -> 406 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-bold-ka.pngbin1132 -> 595 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-bold-os.pngbin0 -> 561 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-bold-ru.pngbin885 -> 880 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-bold.pngbin599 -> 595 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-indent-rtl.pngbin319 -> 317 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-indent.pngbin317 -> 316 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-italic-E.pngbin0 -> 583 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-italic.pngbin508 -> 506 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-ulist-rtl.pngbin178 -> 161 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/format-ulist.pngbin176 -> 162 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-file.pngbin1121 -> 1106 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-gallery.pngbin309 -> 297 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-ilink.pngbin286 -> 269 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-nowiki.pngbin1266 -> 1255 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-redirect-rtl.pngbin1257 -> 1248 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-redirect.pngbin1255 -> 1248 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-reference.pngbin347 -> 321 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-signature.pngbin682 -> 680 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/insert-xlink.pngbin388 -> 370 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/arrow-down.pngbin144 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/arrow-left.pngbin145 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/arrow-right.pngbin144 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-big.pngbin650 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-A.pngbin672 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-B.pngbin718 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-F.pngbin556 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-G.pngbin672 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-N.pngbin750 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-P.pngbin628 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold-V.pngbin613 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-bold.pngbin672 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-italic-A.pngbin588 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-italic-C.pngbin507 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-italic-I.pngbin417 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-italic-K.pngbin660 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-italic.pngbin588 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-olist.pngbin375 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-small.pngbin640 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-subscript.pngbin649 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-superscript.pngbin652 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/format-ulist.pngbin332 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/generate.sh12
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-file.pngbin929 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-gallery.pngbin1162 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-link.pngbin769 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-newline.pngbin834 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-nowiki.pngbin1562 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-redirect.pngbin1133 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-reference.pngbin1056 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-signature.pngbin588 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/insert-table.pngbin219 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/images/toolbar/png24/search-replace.pngbin1047 -> 0 bytes
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.css8
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js1
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.publish.js6
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.toc.js2
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js124
-rw-r--r--extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js34
-rw-r--r--extensions/WikiEditor/tests/selenium/WikiDialogs_Links.php67
-rw-r--r--extensions/WikiEditor/tests/selenium/WikiDialogs_Links_Setup.php295
-rw-r--r--extensions/WikiEditor/tests/selenium/WikiEditorConstants.php84
-rw-r--r--extensions/WikiEditor/tests/selenium/WikiEditorSeleniumConfig.php27
-rw-r--r--extensions/WikiEditor/tests/selenium/WikiEditorTestSuite.php35
-rw-r--r--img_auth.php14
-rw-r--r--img_auth.php52
-rw-r--r--includes/Action.php62
-rw-r--r--includes/AjaxResponse.php4
-rw-r--r--includes/ArrayUtils.php69
-rw-r--r--includes/Article.php282
-rw-r--r--includes/AuthPlugin.php16
-rw-r--r--includes/AutoLoader.php185
-rw-r--r--includes/Autopromote.php12
-rw-r--r--includes/BacklinkCache.php419
-rw-r--r--includes/Block.php146
-rw-r--r--includes/CacheHelper.php2
-rw-r--r--includes/Category.php92
-rw-r--r--includes/CategoryPage.php4
-rw-r--r--includes/CategoryViewer.php85
-rw-r--r--includes/Categoryfinder.php39
-rw-r--r--includes/Cdb.php8
-rw-r--r--includes/Cdb_PHP.php24
-rw-r--r--includes/ChangeTags.php33
-rw-r--r--includes/ChangesFeed.php22
-rw-r--r--includes/ChangesList.php150
-rw-r--r--includes/Collation.php295
-rw-r--r--includes/ConfEditor.php12
-rw-r--r--includes/Cookie.php31
-rw-r--r--includes/CryptRand.php22
-rw-r--r--includes/DataUpdate.php10
-rw-r--r--includes/DefaultSettings.php1266
-rw-r--r--includes/DeferredUpdates.php6
-rw-r--r--includes/Defines.php56
-rw-r--r--includes/DeprecatedGlobal.php2
-rw-r--r--includes/EditPage.php1132
-rw-r--r--includes/Exception.php87
-rw-r--r--includes/Export.php119
-rw-r--r--includes/ExternalEdit.php4
-rw-r--r--includes/ExternalStore.php172
-rw-r--r--includes/ExternalStoreDB.php185
-rw-r--r--includes/ExternalStoreHttp.php45
-rw-r--r--includes/ExternalUser.php16
-rw-r--r--includes/FakeTitle.php6
-rw-r--r--includes/Fallback.php27
-rw-r--r--includes/Feed.php28
-rw-r--r--includes/FeedUtils.php90
-rw-r--r--includes/FileDeleteForm.php18
-rw-r--r--includes/ForkController.php4
-rw-r--r--includes/FormOptions.php32
-rw-r--r--includes/GitInfo.php16
-rw-r--r--includes/GlobalFunctions.php448
-rw-r--r--includes/HTMLForm.php286
-rw-r--r--includes/HistoryBlob.php51
-rw-r--r--includes/Hooks.php120
-rw-r--r--includes/Html.php230
-rw-r--r--includes/HttpFunctions.old.php33
-rw-r--r--includes/HttpFunctions.php46
-rw-r--r--includes/IP.php42
-rw-r--r--includes/ImageGallery.php30
-rw-r--r--includes/ImagePage.php190
-rw-r--r--includes/Import.php144
-rw-r--r--includes/Init.php4
-rw-r--r--includes/Licenses.php9
-rw-r--r--includes/LinkFilter.php40
-rw-r--r--includes/Linker.php454
-rw-r--r--includes/LinksUpdate.php100
-rw-r--r--includes/LocalisationCache.php1281
-rw-r--r--includes/MagicWord.php26
-rw-r--r--includes/MappedIterator.php96
-rw-r--r--includes/Message.php165
-rw-r--r--includes/MessageBlobStore.php33
-rw-r--r--includes/Metadata.php57
-rw-r--r--includes/MimeMagic.php251
-rw-r--r--includes/Namespace.php63
-rw-r--r--includes/OutputHandler.php10
-rw-r--r--includes/OutputPage.php390
-rw-r--r--includes/PHPVersionError.php33
-rw-r--r--includes/Pager.php61
-rw-r--r--includes/PathRouter.php10
-rw-r--r--includes/PoolCounter.php14
-rw-r--r--includes/Preferences.php113
-rw-r--r--includes/PrefixSearch.php10
-rw-r--r--includes/ProtectionForm.php62
-rw-r--r--includes/ProxyTools.php6
-rw-r--r--includes/QueryPage.php86
-rw-r--r--includes/RecentChange.php235
-rw-r--r--includes/Revision.php483
-rw-r--r--includes/RevisionList.php4
-rw-r--r--includes/Sanitizer.php207
-rw-r--r--includes/ScopedCallback.php40
-rw-r--r--includes/SeleniumWebSettings.php27
-rw-r--r--includes/Setup.php36
-rw-r--r--includes/SiteConfiguration.php163
-rw-r--r--includes/SiteStats.php22
-rw-r--r--includes/Skin.php76
-rw-r--r--includes/SkinLegacy.php22
-rw-r--r--includes/SkinTemplate.php154
-rw-r--r--includes/SpecialPage.php177
-rw-r--r--includes/SpecialPageFactory.php59
-rw-r--r--includes/SqlDataUpdate.php14
-rw-r--r--includes/SquidPurgeClient.php47
-rw-r--r--includes/Status.php76
-rw-r--r--includes/StreamFile.php19
-rw-r--r--includes/StringUtils.php73
-rw-r--r--includes/StubObject.php23
-rw-r--r--includes/Timestamp.php42
-rw-r--r--includes/Title.php889
-rw-r--r--includes/TitleArray.php4
-rw-r--r--includes/UIDGenerator.php350
-rw-r--r--includes/User.php903
-rw-r--r--includes/UserMailer.php245
-rw-r--r--includes/UserRightsProxy.php14
-rw-r--r--includes/ViewCountUpdate.php17
-rw-r--r--includes/WatchedItem.php75
-rw-r--r--includes/WebRequest.php121
-rw-r--r--includes/WebResponse.php56
-rw-r--r--includes/WebStart.php19
-rw-r--r--includes/Wiki.php88
-rw-r--r--includes/WikiError.php2
-rw-r--r--includes/WikiFilePage.php9
-rw-r--r--includes/WikiMap.php26
-rw-r--r--includes/WikiPage.php1320
-rw-r--r--includes/Xml.php202
-rw-r--r--includes/XmlTypeCheck.php2
-rw-r--r--includes/ZhClient.php10
-rw-r--r--includes/ZhConversion.php792
-rw-r--r--includes/ZipDirectoryReader.php40
-rw-r--r--includes/actions/CachedAction.php36
-rw-r--r--includes/actions/CreditsAction.php13
-rw-r--r--includes/actions/DeleteAction.php11
-rw-r--r--includes/actions/EditAction.php21
-rw-r--r--includes/actions/HistoryAction.php77
-rw-r--r--includes/actions/InfoAction.php320
-rw-r--r--includes/actions/MarkpatrolledAction.php5
-rw-r--r--includes/actions/ProtectAction.php20
-rw-r--r--includes/actions/PurgeAction.php15
-rw-r--r--includes/actions/RawAction.php35
-rw-r--r--includes/actions/RenderAction.php11
-rw-r--r--includes/actions/RevertAction.php6
-rw-r--r--includes/actions/RevisiondeleteAction.php5
-rw-r--r--includes/actions/RollbackAction.php35
-rw-r--r--includes/actions/ViewAction.php11
-rw-r--r--includes/actions/WatchAction.php10
-rw-r--r--includes/api/ApiBase.php386
-rw-r--r--includes/api/ApiBlock.php29
-rw-r--r--includes/api/ApiComparePages.php22
-rw-r--r--includes/api/ApiCreateAccount.php298
-rw-r--r--includes/api/ApiDelete.php25
-rw-r--r--includes/api/ApiDisabled.php8
-rw-r--r--includes/api/ApiEditPage.php181
-rw-r--r--includes/api/ApiEmailUser.php10
-rw-r--r--includes/api/ApiExpandTemplates.php10
-rw-r--r--includes/api/ApiFeedContributions.php26
-rw-r--r--includes/api/ApiFeedWatchlist.php20
-rw-r--r--includes/api/ApiFileRevert.php16
-rw-r--r--includes/api/ApiFormatBase.php48
-rw-r--r--includes/api/ApiFormatDbg.php8
-rw-r--r--includes/api/ApiFormatDump.php8
-rw-r--r--includes/api/ApiFormatJson.php6
-rw-r--r--includes/api/ApiFormatNone.php43
-rw-r--r--includes/api/ApiFormatPhp.php8
-rw-r--r--includes/api/ApiFormatRaw.php4
-rw-r--r--includes/api/ApiFormatTxt.php8
-rw-r--r--includes/api/ApiFormatWddx.php8
-rw-r--r--includes/api/ApiFormatXml.php20
-rw-r--r--includes/api/ApiFormatYaml.php6
-rw-r--r--includes/api/ApiHelp.php91
-rw-r--r--includes/api/ApiImageRotate.php232
-rw-r--r--includes/api/ApiImport.php14
-rw-r--r--includes/api/ApiLogin.php8
-rw-r--r--includes/api/ApiLogout.php8
-rw-r--r--includes/api/ApiMain.php289
-rw-r--r--includes/api/ApiModuleManager.php171
-rw-r--r--includes/api/ApiMove.php25
-rw-r--r--includes/api/ApiOpenSearch.php8
-rw-r--r--includes/api/ApiOptions.php68
-rw-r--r--includes/api/ApiPageSet.php560
-rw-r--r--includes/api/ApiParamInfo.php114
-rw-r--r--includes/api/ApiParse.php132
-rw-r--r--includes/api/ApiPatrol.php8
-rw-r--r--includes/api/ApiProtect.php10
-rw-r--r--includes/api/ApiPurge.php142
-rw-r--r--includes/api/ApiQuery.php649
-rw-r--r--includes/api/ApiQueryAllCategories.php16
-rw-r--r--includes/api/ApiQueryAllImages.php63
-rw-r--r--includes/api/ApiQueryAllLinks.php138
-rw-r--r--includes/api/ApiQueryAllMessages.php21
-rw-r--r--includes/api/ApiQueryAllPages.php20
-rw-r--r--includes/api/ApiQueryAllUsers.php18
-rw-r--r--includes/api/ApiQueryBacklinks.php35
-rw-r--r--includes/api/ApiQueryBase.php138
-rw-r--r--includes/api/ApiQueryBlocks.php18
-rw-r--r--includes/api/ApiQueryCategories.php11
-rw-r--r--includes/api/ApiQueryCategoryInfo.php5
-rw-r--r--includes/api/ApiQueryCategoryMembers.php17
-rw-r--r--includes/api/ApiQueryDeletedrevs.php23
-rw-r--r--includes/api/ApiQueryDisabled.php8
-rw-r--r--includes/api/ApiQueryDuplicateFiles.php19
-rw-r--r--includes/api/ApiQueryExtLinksUsage.php20
-rw-r--r--includes/api/ApiQueryExternalLinks.php16
-rw-r--r--includes/api/ApiQueryFilearchive.php35
-rw-r--r--includes/api/ApiQueryIWBacklinks.php10
-rw-r--r--includes/api/ApiQueryIWLinks.php10
-rw-r--r--includes/api/ApiQueryImageInfo.php122
-rw-r--r--includes/api/ApiQueryImages.php17
-rw-r--r--includes/api/ApiQueryInfo.php149
-rw-r--r--includes/api/ApiQueryLangBacklinks.php10
-rw-r--r--includes/api/ApiQueryLangLinks.php12
-rw-r--r--includes/api/ApiQueryLinks.php17
-rw-r--r--includes/api/ApiQueryLogEvents.php51
-rw-r--r--includes/api/ApiQueryORM.php264
-rw-r--r--includes/api/ApiQueryPagePropNames.php116
-rw-r--r--includes/api/ApiQueryPageProps.php17
-rw-r--r--includes/api/ApiQueryPagesWithProp.php189
-rw-r--r--includes/api/ApiQueryProtectedTitles.php9
-rw-r--r--includes/api/ApiQueryQueryPage.php8
-rw-r--r--includes/api/ApiQueryRandom.php6
-rw-r--r--includes/api/ApiQueryRecentChanges.php63
-rw-r--r--includes/api/ApiQueryRevisions.php180
-rw-r--r--includes/api/ApiQuerySearch.php8
-rw-r--r--includes/api/ApiQuerySiteinfo.php57
-rw-r--r--includes/api/ApiQueryStashImageInfo.php7
-rw-r--r--includes/api/ApiQueryTags.php6
-rw-r--r--includes/api/ApiQueryUserContributions.php13
-rw-r--r--includes/api/ApiQueryUserInfo.php10
-rw-r--r--includes/api/ApiQueryUsers.php76
-rw-r--r--includes/api/ApiQueryWatchlist.php18
-rw-r--r--includes/api/ApiQueryWatchlistRaw.php10
-rw-r--r--includes/api/ApiResult.php99
-rw-r--r--includes/api/ApiRollback.php10
-rw-r--r--includes/api/ApiRsd.php12
-rw-r--r--includes/api/ApiSetNotificationTimestamp.php66
-rw-r--r--includes/api/ApiTokens.php70
-rw-r--r--includes/api/ApiUnblock.php8
-rw-r--r--includes/api/ApiUndelete.php18
-rw-r--r--includes/api/ApiUpload.php275
-rw-r--r--includes/api/ApiUserrights.php8
-rw-r--r--includes/api/ApiWatch.php25
-rw-r--r--includes/cache/BacklinkCache.php452
-rw-r--r--includes/cache/CacheDependency.php12
-rw-r--r--includes/cache/FileCacheBase.php6
-rw-r--r--includes/cache/GenderCache.php8
-rw-r--r--includes/cache/HTMLCacheUpdate.php226
-rw-r--r--includes/cache/HTMLFileCache.php7
-rw-r--r--includes/cache/LinkBatch.php2
-rw-r--r--includes/cache/LinkCache.php32
-rw-r--r--includes/cache/LocalisationCache.php1288
-rw-r--r--includes/cache/MessageCache.php243
-rw-r--r--includes/cache/ProcessCacheLRU.php19
-rw-r--r--includes/cache/SquidUpdate.php15
-rw-r--r--includes/cache/UserCache.php12
-rw-r--r--includes/clientpool/RedisConnectionPool.php312
-rw-r--r--includes/content/AbstractContent.php444
-rw-r--r--includes/content/Content.php508
-rw-r--r--includes/content/ContentHandler.php1114
-rw-r--r--includes/content/CssContent.php65
-rw-r--r--includes/content/CssContentHandler.php67
-rw-r--r--includes/content/JavaScriptContent.php66
-rw-r--r--includes/content/JavaScriptContentHandler.php67
-rw-r--r--includes/content/MessageContent.php158
-rw-r--r--includes/content/TextContent.php286
-rw-r--r--includes/content/TextContentHandler.php115
-rw-r--r--includes/content/WikitextContent.php322
-rw-r--r--includes/content/WikitextContentHandler.php98
-rw-r--r--includes/context/ContextSource.php22
-rw-r--r--includes/context/DerivativeContext.php24
-rw-r--r--includes/context/IContextSource.php15
-rw-r--r--includes/context/RequestContext.php137
-rw-r--r--includes/dao/DBAccessBase.php92
-rw-r--r--includes/dao/IDBAccessObject.php4
-rw-r--r--includes/db/CloneDatabase.php23
-rw-r--r--includes/db/Database.php625
-rw-r--r--includes/db/DatabaseError.php22
-rw-r--r--includes/db/DatabaseIbm_db2.php1721
-rw-r--r--includes/db/DatabaseMssql.php105
-rw-r--r--includes/db/DatabaseMysql.php61
-rw-r--r--includes/db/DatabaseOracle.php76
-rw-r--r--includes/db/DatabasePostgres.php156
-rw-r--r--includes/db/DatabaseSqlite.php47
-rw-r--r--includes/db/DatabaseUtility.php13
-rw-r--r--includes/db/IORMRow.php5
-rw-r--r--includes/db/IORMTable.php91
-rw-r--r--includes/db/LBFactory.php22
-rw-r--r--includes/db/LBFactory_Multi.php11
-rw-r--r--includes/db/LBFactory_Single.php2
-rw-r--r--includes/db/LoadBalancer.php150
-rw-r--r--includes/db/LoadMonitor.php9
-rw-r--r--includes/db/ORMIterator.php4
-rw-r--r--includes/db/ORMResult.php2
-rw-r--r--includes/db/ORMRow.php47
-rw-r--r--includes/db/ORMTable.php295
-rw-r--r--includes/debug/Debug.php11
-rw-r--r--includes/diff/DairikiDiff.php79
-rw-r--r--includes/diff/DifferenceEngine.php191
-rw-r--r--includes/diff/WikiDiff3.php5
-rw-r--r--includes/extauth/MediaWiki.php24
-rw-r--r--includes/externalstore/ExternalStore.php178
-rw-r--r--includes/externalstore/ExternalStoreDB.php181
-rw-r--r--includes/externalstore/ExternalStoreHttp.php43
-rw-r--r--includes/externalstore/ExternalStoreMedium.php60
-rw-r--r--includes/externalstore/ExternalStoreMwstore.php72
-rw-r--r--includes/filebackend/FSFile.php49
-rw-r--r--includes/filebackend/FSFileBackend.php341
-rw-r--r--includes/filebackend/FileBackend.php370
-rw-r--r--includes/filebackend/FileBackendGroup.php10
-rw-r--r--includes/filebackend/FileBackendMultiWrite.php91
-rw-r--r--includes/filebackend/FileBackendStore.php502
-rw-r--r--includes/filebackend/FileOp.php332
-rw-r--r--includes/filebackend/FileOpBatch.php62
-rw-r--r--includes/filebackend/README208
-rw-r--r--includes/filebackend/SwiftFileBackend.php483
-rw-r--r--includes/filebackend/TempFSFile.php13
-rw-r--r--includes/filebackend/filejournal/DBFileJournal.php32
-rw-r--r--includes/filebackend/filejournal/FileJournal.php65
-rw-r--r--includes/filebackend/lockmanager/DBLockManager.php227
-rw-r--r--includes/filebackend/lockmanager/FSLockManager.php42
-rw-r--r--includes/filebackend/lockmanager/LSLockManager.php8
-rw-r--r--includes/filebackend/lockmanager/LockManager.php324
-rw-r--r--includes/filebackend/lockmanager/LockManagerGroup.php54
-rw-r--r--includes/filebackend/lockmanager/MemcLockManager.php94
-rw-r--r--includes/filebackend/lockmanager/QuorumLockManager.php230
-rw-r--r--includes/filebackend/lockmanager/ScopedLock.php102
-rw-r--r--includes/filerepo/FSRepo.php8
-rw-r--r--includes/filerepo/FileRepo.php253
-rw-r--r--includes/filerepo/ForeignAPIRepo.php18
-rw-r--r--includes/filerepo/ForeignDBRepo.php2
-rw-r--r--includes/filerepo/ForeignDBViaLBRepo.php2
-rw-r--r--includes/filerepo/LocalRepo.php53
-rw-r--r--includes/filerepo/README23
-rw-r--r--includes/filerepo/RepoGroup.php24
-rw-r--r--includes/filerepo/file/ArchivedFile.php152
-rw-r--r--includes/filerepo/file/File.php208
-rw-r--r--includes/filerepo/file/ForeignAPIFile.php8
-rw-r--r--includes/filerepo/file/ForeignDBFile.php15
-rw-r--r--includes/filerepo/file/LocalFile.php281
-rw-r--r--includes/filerepo/file/OldLocalFile.php65
-rw-r--r--includes/filerepo/file/UnregisteredLocalFile.php22
-rw-r--r--includes/installer/CliInstaller.php6
-rw-r--r--includes/installer/DatabaseInstaller.php23
-rw-r--r--includes/installer/DatabaseUpdater.php449
-rw-r--r--includes/installer/Ibm_db2Installer.php270
-rw-r--r--includes/installer/Ibm_db2Updater.php91
-rw-r--r--includes/installer/InstallDocFormatter.php6
-rw-r--r--includes/installer/Installer.i18n.php3294
-rw-r--r--includes/installer/Installer.php67
-rw-r--r--includes/installer/LocalSettingsGenerator.php50
-rw-r--r--includes/installer/MysqlInstaller.php17
-rw-r--r--includes/installer/MysqlUpdater.php106
-rw-r--r--includes/installer/OracleInstaller.php9
-rw-r--r--includes/installer/OracleUpdater.php29
-rw-r--r--includes/installer/PostgresInstaller.php21
-rw-r--r--includes/installer/PostgresUpdater.php96
-rw-r--r--includes/installer/SqliteInstaller.php6
-rw-r--r--includes/installer/SqliteUpdater.php34
-rw-r--r--includes/installer/WebInstaller.php37
-rw-r--r--includes/installer/WebInstallerOutput.php8
-rw-r--r--includes/installer/WebInstallerPage.php49
-rw-r--r--includes/interwiki/Interwiki.php96
-rw-r--r--includes/job/DoubleRedirectJob.php207
-rw-r--r--includes/job/EmaillingJob.php46
-rw-r--r--includes/job/EnotifNotifyJob.php57
-rw-r--r--includes/job/Job.php416
-rw-r--r--includes/job/JobQueue.php435
-rw-r--r--includes/job/JobQueueAggregator.php139
-rw-r--r--includes/job/JobQueueAggregatorMemc.php117
-rw-r--r--includes/job/JobQueueAggregatorRedis.php165
-rw-r--r--includes/job/JobQueueDB.php716
-rw-r--r--includes/job/JobQueueGroup.php351
-rw-r--r--includes/job/README81
-rw-r--r--includes/job/RefreshLinksJob.php202
-rw-r--r--includes/job/UploadFromUrlJob.php179
-rw-r--r--includes/job/jobs/AssembleUploadChunksJob.php118
-rw-r--r--includes/job/jobs/DoubleRedirectJob.php218
-rw-r--r--includes/job/jobs/DuplicateJob.php59
-rw-r--r--includes/job/jobs/EmaillingJob.php47
-rw-r--r--includes/job/jobs/EnotifNotifyJob.php58
-rw-r--r--includes/job/jobs/HTMLCacheUpdateJob.php254
-rw-r--r--includes/job/jobs/NullJob.php60
-rw-r--r--includes/job/jobs/PublishStashedFileJob.php130
-rw-r--r--includes/job/jobs/RefreshLinksJob.php226
-rw-r--r--includes/job/jobs/UploadFromUrlJob.php179
-rw-r--r--includes/json/FormatJson.php19
-rw-r--r--includes/json/Services_JSON.php24
-rw-r--r--includes/libs/CSSJanus.php15
-rw-r--r--includes/libs/CSSMin.php14
-rw-r--r--includes/libs/GenericArrayObject.php15
-rw-r--r--includes/libs/IEContentAnalyzer.php13
-rw-r--r--includes/libs/IEUrlExtension.php12
-rw-r--r--includes/libs/JavaScriptMinifier.php20
-rw-r--r--includes/libs/jsminplus.php6
-rw-r--r--includes/limit.sh102
-rw-r--r--includes/logging/LogEntry.php78
-rw-r--r--includes/logging/LogEventsList.php84
-rw-r--r--includes/logging/LogFormatter.php234
-rw-r--r--includes/logging/LogPage.php75
-rw-r--r--includes/logging/LogPager.php44
-rw-r--r--includes/media/BMP.php2
-rw-r--r--includes/media/Bitmap.php84
-rw-r--r--includes/media/BitmapMetadataHandler.php60
-rw-r--r--includes/media/DjVu.php10
-rw-r--r--includes/media/DjVuImage.php27
-rw-r--r--includes/media/Exif.php169
-rw-r--r--includes/media/ExifBitmap.php15
-rw-r--r--includes/media/FormatMetadata.php102
-rw-r--r--includes/media/GIF.php26
-rw-r--r--includes/media/GIFMetadataExtractor.php46
-rw-r--r--includes/media/IPTC.php136
-rw-r--r--includes/media/ImageHandler.php7
-rw-r--r--includes/media/Jpeg.php35
-rw-r--r--includes/media/JpegMetadataExtractor.php57
-rw-r--r--includes/media/MediaHandler.php112
-rw-r--r--includes/media/MediaTransformOutput.php43
-rw-r--r--includes/media/PNG.php24
-rw-r--r--includes/media/PNGMetadataExtractor.php4
-rw-r--r--includes/media/SVG.php67
-rw-r--r--includes/media/SVGMetadataExtractor.php39
-rw-r--r--includes/media/Tiff.php7
-rw-r--r--includes/media/XCF.php4
-rw-r--r--includes/media/XMP.php657
-rw-r--r--includes/media/XMPInfo.php63
-rw-r--r--includes/media/XMPValidate.php193
-rw-r--r--includes/mime.types2
-rw-r--r--includes/mobile/DeviceDetection.php459
-rw-r--r--includes/normal/Makefile2
-rw-r--r--includes/normal/RandomTest.php2
-rw-r--r--includes/normal/Utf8CaseGenerate.php6
-rw-r--r--includes/normal/Utf8Test.php7
-rw-r--r--includes/normal/UtfNormal.php32
-rw-r--r--includes/normal/UtfNormalBench.php12
-rw-r--r--includes/normal/UtfNormalDefines.php4
-rw-r--r--includes/normal/UtfNormalGenerate.php4
-rw-r--r--includes/normal/UtfNormalMemStress.php10
-rw-r--r--includes/normal/UtfNormalTest.php8
-rw-r--r--includes/normal/UtfNormalTest2.php4
-rw-r--r--includes/normal/UtfNormalUtil.php6
-rw-r--r--includes/objectcache/APCBagOStuff.php43
-rw-r--r--includes/objectcache/BagOStuff.php131
-rw-r--r--includes/objectcache/DBABagOStuff.php63
-rw-r--r--includes/objectcache/EhcacheBagOStuff.php72
-rw-r--r--includes/objectcache/EmptyBagOStuff.php25
-rw-r--r--includes/objectcache/HashBagOStuff.php28
-rw-r--r--includes/objectcache/MemcachedBagOStuff.php27
-rw-r--r--includes/objectcache/MemcachedClient.php187
-rw-r--r--includes/objectcache/MemcachedPeclBagOStuff.php27
-rw-r--r--includes/objectcache/MemcachedPhpBagOStuff.php3
-rw-r--r--includes/objectcache/MultiWriteBagOStuff.php29
-rw-r--r--includes/objectcache/ObjectCache.php8
-rw-r--r--includes/objectcache/ObjectCacheSessionHandler.php8
-rw-r--r--includes/objectcache/RedisBagOStuff.php189
-rw-r--r--includes/objectcache/SqlBagOStuff.php528
-rw-r--r--includes/objectcache/WinCacheBagOStuff.php47
-rw-r--r--includes/objectcache/XCacheBagOStuff.php40
-rw-r--r--includes/parser/CacheTime.php2
-rw-r--r--includes/parser/CoreLinkFunctions.php12
-rw-r--r--includes/parser/CoreParserFunctions.php76
-rw-r--r--includes/parser/CoreTagHooks.php1
-rw-r--r--includes/parser/DateFormatter.php54
-rw-r--r--includes/parser/LinkHolderArray.php96
-rw-r--r--includes/parser/Parser.php744
-rw-r--r--includes/parser/ParserCache.php7
-rw-r--r--includes/parser/ParserOptions.php86
-rw-r--r--includes/parser/ParserOutput.php208
-rw-r--r--includes/parser/Parser_LinkHooks.php118
-rw-r--r--includes/parser/Preprocessor.php7
-rw-r--r--includes/parser/Preprocessor_DOM.php77
-rw-r--r--includes/parser/Preprocessor_Hash.php76
-rw-r--r--includes/parser/Preprocessor_HipHop.hphp2013
-rw-r--r--includes/parser/StripState.php7
-rw-r--r--includes/parser/Tidy.php58
-rw-r--r--includes/profiler/Profiler.php174
-rw-r--r--includes/profiler/ProfilerSimple.php26
-rw-r--r--includes/profiler/ProfilerSimpleText.php18
-rw-r--r--includes/profiler/ProfilerSimpleTrace.php22
-rw-r--r--includes/profiler/ProfilerSimpleUDP.php2
-rw-r--r--includes/resourceloader/ResourceLoader.php93
-rw-r--r--includes/resourceloader/ResourceLoaderContext.php18
-rw-r--r--includes/resourceloader/ResourceLoaderFileModule.php139
-rw-r--r--includes/resourceloader/ResourceLoaderLanguageDataModule.php34
-rw-r--r--includes/resourceloader/ResourceLoaderModule.php56
-rw-r--r--includes/resourceloader/ResourceLoaderNoscriptModule.php2
-rw-r--r--includes/resourceloader/ResourceLoaderSiteModule.php6
-rw-r--r--includes/resourceloader/ResourceLoaderStartUpModule.php55
-rw-r--r--includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php2
-rw-r--r--includes/resourceloader/ResourceLoaderUserTokensModule.php3
-rw-r--r--includes/resourceloader/ResourceLoaderWikiModule.php36
-rw-r--r--includes/revisiondelete/RevisionDelete.php13
-rw-r--r--includes/revisiondelete/RevisionDeleteAbstracts.php7
-rw-r--r--includes/revisiondelete/RevisionDeleter.php4
-rw-r--r--includes/search/SearchEngine.php83
-rw-r--r--includes/search/SearchIBM_DB2.php234
-rw-r--r--includes/search/SearchMssql.php19
-rw-r--r--includes/search/SearchMySQL.php8
-rw-r--r--includes/search/SearchOracle.php142
-rw-r--r--includes/search/SearchPostgres.php44
-rw-r--r--includes/search/SearchSqlite.php15
-rw-r--r--includes/search/SearchUpdate.php13
-rw-r--r--includes/site/MediaWikiSite.php352
-rw-r--r--includes/site/Site.php702
-rw-r--r--includes/site/SiteList.php300
-rw-r--r--includes/site/SiteSQLStore.php491
-rw-r--r--includes/site/SiteStore.php85
-rw-r--r--includes/specials/SpecialActiveusers.php37
-rw-r--r--includes/specials/SpecialAllmessages.php46
-rw-r--r--includes/specials/SpecialAllpages.php96
-rw-r--r--includes/specials/SpecialAncientpages.php8
-rw-r--r--includes/specials/SpecialBlankpage.php2
-rw-r--r--includes/specials/SpecialBlock.php100
-rw-r--r--includes/specials/SpecialBlockList.php34
-rw-r--r--includes/specials/SpecialBlockme.php6
-rw-r--r--includes/specials/SpecialBooksources.php42
-rw-r--r--includes/specials/SpecialBrokenRedirects.php63
-rw-r--r--includes/specials/SpecialCachedPage.php4
-rw-r--r--includes/specials/SpecialCategories.php8
-rw-r--r--includes/specials/SpecialChangeEmail.php14
-rw-r--r--includes/specials/SpecialChangePassword.php73
-rw-r--r--includes/specials/SpecialComparePages.php31
-rw-r--r--includes/specials/SpecialConfirmemail.php10
-rw-r--r--includes/specials/SpecialContributions.php89
-rw-r--r--includes/specials/SpecialDeadendpages.php4
-rw-r--r--includes/specials/SpecialDeletedContributions.php19
-rw-r--r--includes/specials/SpecialDisambiguations.php14
-rw-r--r--includes/specials/SpecialDoubleRedirects.php81
-rw-r--r--includes/specials/SpecialEditWatchlist.php57
-rw-r--r--includes/specials/SpecialEmailuser.php13
-rw-r--r--includes/specials/SpecialExport.php17
-rw-r--r--includes/specials/SpecialFewestrevisions.php5
-rw-r--r--includes/specials/SpecialFileDuplicateSearch.php24
-rw-r--r--includes/specials/SpecialFilepath.php6
-rw-r--r--includes/specials/SpecialImport.php36
-rw-r--r--includes/specials/SpecialJavaScriptTest.php19
-rw-r--r--includes/specials/SpecialLinkSearch.php45
-rw-r--r--includes/specials/SpecialListfiles.php12
-rw-r--r--includes/specials/SpecialListgrouprights.php26
-rw-r--r--includes/specials/SpecialListredirects.php20
-rw-r--r--includes/specials/SpecialListusers.php44
-rw-r--r--includes/specials/SpecialLockdb.php4
-rw-r--r--includes/specials/SpecialLog.php4
-rw-r--r--includes/specials/SpecialLonelypages.php9
-rw-r--r--includes/specials/SpecialLongpages.php4
-rw-r--r--includes/specials/SpecialMIMEsearch.php19
-rw-r--r--includes/specials/SpecialMergeHistory.php53
-rw-r--r--includes/specials/SpecialMostcategories.php13
-rw-r--r--includes/specials/SpecialMostimages.php12
-rw-r--r--includes/specials/SpecialMostinterwikis.php13
-rw-r--r--includes/specials/SpecialMostlinked.php15
-rw-r--r--includes/specials/SpecialMostlinkedcategories.php12
-rw-r--r--includes/specials/SpecialMostlinkedtemplates.php5
-rw-r--r--includes/specials/SpecialMostrevisions.php4
-rw-r--r--includes/specials/SpecialMovepage.php65
-rw-r--r--includes/specials/SpecialNewimages.php23
-rw-r--r--includes/specials/SpecialNewpages.php57
-rw-r--r--includes/specials/SpecialPagesWithProp.php138
-rw-r--r--includes/specials/SpecialPasswordReset.php26
-rw-r--r--includes/specials/SpecialPopularpages.php10
-rw-r--r--includes/specials/SpecialPreferences.php6
-rw-r--r--includes/specials/SpecialPrefixindex.php30
-rw-r--r--includes/specials/SpecialProtectedpages.php46
-rw-r--r--includes/specials/SpecialProtectedtitles.php28
-rw-r--r--includes/specials/SpecialRandompage.php10
-rw-r--r--includes/specials/SpecialRandomredirect.php2
-rw-r--r--includes/specials/SpecialRecentchanges.php100
-rw-r--r--includes/specials/SpecialRecentchangeslinked.php46
-rw-r--r--includes/specials/SpecialRevisiondelete.php45
-rw-r--r--includes/specials/SpecialSearch.php131
-rw-r--r--includes/specials/SpecialShortpages.php4
-rw-r--r--includes/specials/SpecialSpecialpages.php17
-rw-r--r--includes/specials/SpecialStatistics.php63
-rw-r--r--includes/specials/SpecialTags.php4
-rw-r--r--includes/specials/SpecialUnblock.php29
-rw-r--r--includes/specials/SpecialUncategorizedcategories.php13
-rw-r--r--includes/specials/SpecialUncategorizedimages.php3
-rw-r--r--includes/specials/SpecialUncategorizedpages.php11
-rw-r--r--includes/specials/SpecialUndelete.php352
-rw-r--r--includes/specials/SpecialUnlockdb.php4
-rw-r--r--includes/specials/SpecialUnusedcategories.php8
-rw-r--r--includes/specials/SpecialUnusedimages.php3
-rw-r--r--includes/specials/SpecialUnusedtemplates.php18
-rw-r--r--includes/specials/SpecialUnwatchedpages.php17
-rw-r--r--includes/specials/SpecialUpload.php98
-rw-r--r--includes/specials/SpecialUploadStash.php34
-rw-r--r--includes/specials/SpecialUserlogin.php330
-rw-r--r--includes/specials/SpecialUserlogout.php9
-rw-r--r--includes/specials/SpecialUserrights.php106
-rw-r--r--includes/specials/SpecialVersion.php137
-rw-r--r--includes/specials/SpecialWantedcategories.php4
-rw-r--r--includes/specials/SpecialWantedfiles.php6
-rw-r--r--includes/specials/SpecialWantedpages.php11
-rw-r--r--includes/specials/SpecialWantedtemplates.php4
-rw-r--r--includes/specials/SpecialWatchlist.php116
-rw-r--r--includes/specials/SpecialWhatlinkshere.php22
-rw-r--r--includes/specials/SpecialWithoutinterwiki.php4
-rw-r--r--includes/templates/NoLocalSettings.php4
-rw-r--r--includes/templates/Usercreate.php58
-rw-r--r--includes/templates/Userlogin.php4
-rw-r--r--includes/tidy.conf5
-rw-r--r--includes/upload/UploadBase.php159
-rw-r--r--includes/upload/UploadFromChunks.php56
-rw-r--r--includes/upload/UploadFromFile.php12
-rw-r--r--includes/upload/UploadFromStash.php17
-rw-r--r--includes/upload/UploadFromUrl.php22
-rw-r--r--includes/upload/UploadStash.php74
-rw-r--r--includes/zhtable/Makefile336
-rw-r--r--includes/zhtable/Makefile.py391
-rw-r--r--includes/zhtable/printutf8.c99
-rw-r--r--includes/zhtable/toSimp.manual165
-rw-r--r--includes/zhtable/trad2simp.manual150
-rw-r--r--includes/zhtable/tradphrases.manual4310
-rw-r--r--index.php52
-rw-r--r--languages/Language.php367
-rw-r--r--languages/LanguageConverter.php129
-rw-r--r--languages/Names.php75
-rw-r--r--languages/classes/LanguageEo.php2
-rw-r--r--languages/classes/LanguageFi.php2
-rw-r--r--languages/classes/LanguageGan.php16
-rw-r--r--languages/classes/LanguageHe.php11
-rw-r--r--languages/classes/LanguageHy.php13
-rw-r--r--languages/classes/LanguageIu.php23
-rw-r--r--languages/classes/LanguageKk.php17
-rw-r--r--languages/classes/LanguageKu.php22
-rw-r--r--languages/classes/LanguageLn.php45
-rw-r--r--languages/classes/LanguageLt.php56
-rw-r--r--languages/classes/LanguageLv.php51
-rw-r--r--languages/classes/LanguageMo.php53
-rw-r--r--languages/classes/LanguageQqx.php2
-rw-r--r--languages/classes/LanguageRo.php52
-rw-r--r--languages/classes/LanguageRu.php95
-rw-r--r--languages/classes/LanguageSe.php51
-rw-r--r--languages/classes/LanguageSgs.php52
-rw-r--r--languages/classes/LanguageShi.php23
-rw-r--r--languages/classes/LanguageSma.php51
-rw-r--r--languages/classes/LanguageSr.php22
-rw-r--r--languages/classes/LanguageUz.php6
-rw-r--r--languages/classes/LanguageZh.php16
-rw-r--r--languages/classes/LanguageZh_hans.php27
-rw-r--r--languages/data/plurals-mediawiki.xml30
-rw-r--r--languages/data/plurals.xml15
-rw-r--r--languages/messages/MessagesAce.php36
-rw-r--r--languages/messages/MessagesAeb.php17
-rw-r--r--languages/messages/MessagesAf.php161
-rw-r--r--languages/messages/MessagesAln.php17
-rw-r--r--languages/messages/MessagesAls.php12
-rw-r--r--languages/messages/MessagesAm.php32
-rw-r--r--languages/messages/MessagesAn.php34
-rw-r--r--languages/messages/MessagesAng.php18
-rw-r--r--languages/messages/MessagesAnp.php6
-rw-r--r--languages/messages/MessagesAr.php141
-rw-r--r--languages/messages/MessagesArc.php117
-rw-r--r--languages/messages/MessagesArn.php12
-rw-r--r--languages/messages/MessagesAry.php25
-rw-r--r--languages/messages/MessagesArz.php238
-rw-r--r--languages/messages/MessagesAs.php118
-rw-r--r--languages/messages/MessagesAst.php157
-rw-r--r--languages/messages/MessagesAvk.php19
-rw-r--r--languages/messages/MessagesAy.php1
-rw-r--r--languages/messages/MessagesAz.php30
-rw-r--r--languages/messages/MessagesAzb.php3820
-rw-r--r--languages/messages/MessagesBa.php188
-rw-r--r--languages/messages/MessagesBar.php57
-rw-r--r--languages/messages/MessagesBat_smg.php15
-rw-r--r--languages/messages/MessagesBcc.php24
-rw-r--r--languages/messages/MessagesBcl.php172
-rw-r--r--languages/messages/MessagesBe.php72
-rw-r--r--languages/messages/MessagesBe_tarask.php365
-rw-r--r--languages/messages/MessagesBe_x_old.php12
-rw-r--r--languages/messages/MessagesBg.php280
-rw-r--r--languages/messages/MessagesBh.php1
-rw-r--r--languages/messages/MessagesBho.php4
-rw-r--r--languages/messages/MessagesBjn.php71
-rw-r--r--languages/messages/MessagesBn.php160
-rw-r--r--languages/messages/MessagesBo.php8
-rw-r--r--languages/messages/MessagesBpy.php41
-rw-r--r--languages/messages/MessagesBqi.php2
-rw-r--r--languages/messages/MessagesBr.php77
-rw-r--r--languages/messages/MessagesBrh.php6
-rw-r--r--languages/messages/MessagesBs.php103
-rw-r--r--languages/messages/MessagesBug.php3
-rw-r--r--languages/messages/MessagesCa.php220
-rw-r--r--languages/messages/MessagesCbk_zam.php2
-rw-r--r--languages/messages/MessagesCdo.php11
-rw-r--r--languages/messages/MessagesCe.php12
-rw-r--r--languages/messages/MessagesCeb.php17
-rw-r--r--languages/messages/MessagesCh.php4
-rw-r--r--languages/messages/MessagesChr.php1
-rw-r--r--languages/messages/MessagesCkb.php154
-rw-r--r--languages/messages/MessagesCo.php5
-rw-r--r--languages/messages/MessagesCps.php12
-rw-r--r--languages/messages/MessagesCrh_cyrl.php54
-rw-r--r--languages/messages/MessagesCrh_latn.php44
-rw-r--r--languages/messages/MessagesCs.php494
-rw-r--r--languages/messages/MessagesCsb.php14
-rw-r--r--languages/messages/MessagesCu.php30
-rw-r--r--languages/messages/MessagesCv.php17
-rw-r--r--languages/messages/MessagesCy.php167
-rw-r--r--languages/messages/MessagesDa.php185
-rw-r--r--languages/messages/MessagesDe.php307
-rw-r--r--languages/messages/MessagesDe_ch.php34
-rw-r--r--languages/messages/MessagesDe_formal.php15
-rw-r--r--languages/messages/MessagesDiq.php225
-rw-r--r--languages/messages/MessagesDsb.php191
-rw-r--r--languages/messages/MessagesDtp.php21
-rw-r--r--languages/messages/MessagesDv.php15
-rw-r--r--languages/messages/MessagesEe.php6
-rw-r--r--languages/messages/MessagesEgl.php8
-rw-r--r--languages/messages/MessagesEl.php216
-rw-r--r--languages/messages/MessagesEml.php6
-rw-r--r--languages/messages/MessagesEn.php457
-rw-r--r--languages/messages/MessagesEn_gb.php4
-rw-r--r--languages/messages/MessagesEo.php146
-rw-r--r--languages/messages/MessagesEs.php146
-rw-r--r--languages/messages/MessagesEt.php149
-rw-r--r--languages/messages/MessagesEu.php62
-rw-r--r--languages/messages/MessagesExt.php24
-rw-r--r--languages/messages/MessagesFa.php310
-rw-r--r--languages/messages/MessagesFi.php426
-rw-r--r--languages/messages/MessagesFit.php7
-rw-r--r--languages/messages/MessagesFiu_vro.php12
-rw-r--r--languages/messages/MessagesFo.php74
-rw-r--r--languages/messages/MessagesFr.php396
-rw-r--r--languages/messages/MessagesFrc.php5
-rw-r--r--languages/messages/MessagesFrp.php108
-rw-r--r--languages/messages/MessagesFrr.php78
-rw-r--r--languages/messages/MessagesFur.php24
-rw-r--r--languages/messages/MessagesFy.php23
-rw-r--r--languages/messages/MessagesGa.php20
-rw-r--r--languages/messages/MessagesGag.php14
-rw-r--r--languages/messages/MessagesGan.php6
-rw-r--r--languages/messages/MessagesGan_hans.php24
-rw-r--r--languages/messages/MessagesGan_hant.php24
-rw-r--r--languages/messages/MessagesGd.php339
-rw-r--r--languages/messages/MessagesGl.php197
-rw-r--r--languages/messages/MessagesGlk.php2
-rw-r--r--languages/messages/MessagesGrc.php25
-rw-r--r--languages/messages/MessagesGsw.php59
-rw-r--r--languages/messages/MessagesGu.php104
-rw-r--r--languages/messages/MessagesGv.php20
-rw-r--r--languages/messages/MessagesHa.php6
-rw-r--r--languages/messages/MessagesHak.php22
-rw-r--r--languages/messages/MessagesHaw.php4
-rw-r--r--languages/messages/MessagesHe.php474
-rw-r--r--languages/messages/MessagesHi.php84
-rw-r--r--languages/messages/MessagesHif_latn.php99
-rw-r--r--languages/messages/MessagesHil.php35
-rw-r--r--languages/messages/MessagesHr.php101
-rw-r--r--languages/messages/MessagesHsb.php160
-rw-r--r--languages/messages/MessagesHt.php17
-rw-r--r--languages/messages/MessagesHu.php113
-rw-r--r--languages/messages/MessagesHy.php61
-rw-r--r--languages/messages/MessagesIa.php122
-rw-r--r--languages/messages/MessagesId.php165
-rw-r--r--languages/messages/MessagesIe.php17
-rw-r--r--languages/messages/MessagesIg.php29
-rw-r--r--languages/messages/MessagesIke_cans.php2
-rw-r--r--languages/messages/MessagesIke_latn.php2
-rw-r--r--languages/messages/MessagesIlo.php167
-rw-r--r--languages/messages/MessagesInh.php13
-rw-r--r--languages/messages/MessagesIo.php18
-rw-r--r--languages/messages/MessagesIs.php158
-rw-r--r--languages/messages/MessagesIt.php184
-rw-r--r--languages/messages/MessagesJa.php169
-rw-r--r--languages/messages/MessagesJam.php13
-rw-r--r--languages/messages/MessagesJut.php12
-rw-r--r--languages/messages/MessagesJv.php118
-rw-r--r--languages/messages/MessagesKa.php164
-rw-r--r--languages/messages/MessagesKaa.php26
-rw-r--r--languages/messages/MessagesKab.php40
-rw-r--r--languages/messages/MessagesKbd_cyrl.php50
-rw-r--r--languages/messages/MessagesKhw.php21
-rw-r--r--languages/messages/MessagesKiu.php23
-rw-r--r--languages/messages/MessagesKk_arab.php22
-rw-r--r--languages/messages/MessagesKk_cyrl.php25
-rw-r--r--languages/messages/MessagesKk_latn.php22
-rw-r--r--languages/messages/MessagesKm.php65
-rw-r--r--languages/messages/MessagesKn.php28
-rw-r--r--languages/messages/MessagesKo.php177
-rw-r--r--languages/messages/MessagesKoi.php6
-rw-r--r--languages/messages/MessagesKrc.php92
-rw-r--r--languages/messages/MessagesKrj.php1
-rw-r--r--languages/messages/MessagesKs_arab.php20
-rw-r--r--languages/messages/MessagesKs_deva.php19
-rw-r--r--languages/messages/MessagesKsh.php177
-rw-r--r--languages/messages/MessagesKu_arab.php4
-rw-r--r--languages/messages/MessagesKu_latn.php33
-rw-r--r--languages/messages/MessagesKw.php175
-rw-r--r--languages/messages/MessagesKy.php40
-rw-r--r--languages/messages/MessagesLa.php34
-rw-r--r--languages/messages/MessagesLad.php11
-rw-r--r--languages/messages/MessagesLb.php164
-rw-r--r--languages/messages/MessagesLez.php18
-rw-r--r--languages/messages/MessagesLfn.php2
-rw-r--r--languages/messages/MessagesLg.php12
-rw-r--r--languages/messages/MessagesLi.php27
-rw-r--r--languages/messages/MessagesLij.php16
-rw-r--r--languages/messages/MessagesLiv.php8
-rw-r--r--languages/messages/MessagesLmo.php16
-rw-r--r--languages/messages/MessagesLn.php14
-rw-r--r--languages/messages/MessagesLo.php16
-rw-r--r--languages/messages/MessagesLoz.php8
-rw-r--r--languages/messages/MessagesLt.php77
-rw-r--r--languages/messages/MessagesLtg.php10
-rw-r--r--languages/messages/MessagesLus.php37
-rw-r--r--languages/messages/MessagesLv.php44
-rw-r--r--languages/messages/MessagesLzh.php27
-rw-r--r--languages/messages/MessagesLzz.php10
-rw-r--r--languages/messages/MessagesMai.php26
-rw-r--r--languages/messages/MessagesMap_bms.php22
-rw-r--r--languages/messages/MessagesMdf.php26
-rw-r--r--languages/messages/MessagesMg.php70
-rw-r--r--languages/messages/MessagesMhr.php8
-rw-r--r--languages/messages/MessagesMin.php74
-rw-r--r--languages/messages/MessagesMk.php169
-rw-r--r--languages/messages/MessagesMl.php169
-rw-r--r--languages/messages/MessagesMn.php60
-rw-r--r--languages/messages/MessagesMo.php6
-rw-r--r--languages/messages/MessagesMr.php64
-rw-r--r--languages/messages/MessagesMrj.php6
-rw-r--r--languages/messages/MessagesMs.php172
-rw-r--r--languages/messages/MessagesMt.php95
-rw-r--r--languages/messages/MessagesMwl.php13
-rw-r--r--languages/messages/MessagesMy.php27
-rw-r--r--languages/messages/MessagesMyv.php27
-rw-r--r--languages/messages/MessagesMzn.php11
-rw-r--r--languages/messages/MessagesNah.php54
-rw-r--r--languages/messages/MessagesNan.php7
-rw-r--r--languages/messages/MessagesNap.php14
-rw-r--r--languages/messages/MessagesNb.php158
-rw-r--r--languages/messages/MessagesNds.php42
-rw-r--r--languages/messages/MessagesNds_nl.php56
-rw-r--r--languages/messages/MessagesNe.php26
-rw-r--r--languages/messages/MessagesNew.php7
-rw-r--r--languages/messages/MessagesNiu.php3
-rw-r--r--languages/messages/MessagesNl.php168
-rw-r--r--languages/messages/MessagesNl_informal.php12
-rw-r--r--languages/messages/MessagesNn.php163
-rw-r--r--languages/messages/MessagesNo.php3407
-rw-r--r--languages/messages/MessagesNov.php2
-rw-r--r--languages/messages/MessagesNso.php15
-rw-r--r--languages/messages/MessagesOc.php64
-rw-r--r--languages/messages/MessagesOr.php119
-rw-r--r--languages/messages/MessagesOs.php133
-rw-r--r--languages/messages/MessagesPa.php154
-rw-r--r--languages/messages/MessagesPag.php3
-rw-r--r--languages/messages/MessagesPam.php20
-rw-r--r--languages/messages/MessagesPap.php5
-rw-r--r--languages/messages/MessagesPcd.php16
-rw-r--r--languages/messages/MessagesPdc.php12
-rw-r--r--languages/messages/MessagesPfl.php50
-rw-r--r--languages/messages/MessagesPl.php150
-rw-r--r--languages/messages/MessagesPms.php102
-rw-r--r--languages/messages/MessagesPnb.php29
-rw-r--r--languages/messages/MessagesPnt.php18
-rw-r--r--languages/messages/MessagesPrg.php25
-rw-r--r--languages/messages/MessagesPs.php75
-rw-r--r--languages/messages/MessagesPt.php81
-rw-r--r--languages/messages/MessagesPt_br.php135
-rw-r--r--languages/messages/MessagesQqq.php341
-rw-r--r--languages/messages/MessagesQu.php170
-rw-r--r--languages/messages/MessagesQug.php10
-rw-r--r--languages/messages/MessagesRgn.php7
-rw-r--r--languages/messages/MessagesRm.php93
-rw-r--r--languages/messages/MessagesRmy.php5
-rw-r--r--languages/messages/MessagesRo.php166
-rw-r--r--languages/messages/MessagesRoa_rup.php15
-rw-r--r--languages/messages/MessagesRoa_tara.php191
-rw-r--r--languages/messages/MessagesRu.php162
-rw-r--r--languages/messages/MessagesRue.php109
-rw-r--r--languages/messages/MessagesRup.php3
-rw-r--r--languages/messages/MessagesSa.php105
-rw-r--r--languages/messages/MessagesSah.php77
-rw-r--r--languages/messages/MessagesSat.php11
-rw-r--r--languages/messages/MessagesSc.php17
-rw-r--r--languages/messages/MessagesScn.php200
-rw-r--r--languages/messages/MessagesSco.php17
-rw-r--r--languages/messages/MessagesSd.php3
-rw-r--r--languages/messages/MessagesSdc.php22
-rw-r--r--languages/messages/MessagesSe.php85
-rw-r--r--languages/messages/MessagesSei.php16
-rw-r--r--languages/messages/MessagesSg.php1
-rw-r--r--languages/messages/MessagesSgs.php22
-rw-r--r--languages/messages/MessagesSh.php110
-rw-r--r--languages/messages/MessagesShi.php12
-rw-r--r--languages/messages/MessagesSi.php56
-rw-r--r--languages/messages/MessagesSimple.php11
-rw-r--r--languages/messages/MessagesSk.php126
-rw-r--r--languages/messages/MessagesSl.php162
-rw-r--r--languages/messages/MessagesSli.php22
-rw-r--r--languages/messages/MessagesSma.php1
-rw-r--r--languages/messages/MessagesSn.php3
-rw-r--r--languages/messages/MessagesSo.php51
-rw-r--r--languages/messages/MessagesSq.php36
-rw-r--r--languages/messages/MessagesSr_ec.php75
-rw-r--r--languages/messages/MessagesSr_el.php58
-rw-r--r--languages/messages/MessagesSrn.php8
-rw-r--r--languages/messages/MessagesStq.php27
-rw-r--r--languages/messages/MessagesSu.php26
-rw-r--r--languages/messages/MessagesSv.php162
-rw-r--r--languages/messages/MessagesSw.php39
-rw-r--r--languages/messages/MessagesSzl.php25
-rw-r--r--languages/messages/MessagesTa.php64
-rw-r--r--languages/messages/MessagesTcy.php10
-rw-r--r--languages/messages/MessagesTe.php56
-rw-r--r--languages/messages/MessagesTet.php22
-rw-r--r--languages/messages/MessagesTg_cyrl.php28
-rw-r--r--languages/messages/MessagesTg_latn.php26
-rw-r--r--languages/messages/MessagesTh.php137
-rw-r--r--languages/messages/MessagesTk.php35
-rw-r--r--languages/messages/MessagesTl.php38
-rw-r--r--languages/messages/MessagesTly.php14
-rw-r--r--languages/messages/MessagesTn.php3
-rw-r--r--languages/messages/MessagesTo.php19
-rw-r--r--languages/messages/MessagesTpi.php16
-rw-r--r--languages/messages/MessagesTr.php161
-rw-r--r--languages/messages/MessagesTru.php6
-rw-r--r--languages/messages/MessagesTs.php12
-rw-r--r--languages/messages/MessagesTt_cyrl.php33
-rw-r--r--languages/messages/MessagesTt_latn.php25
-rw-r--r--languages/messages/MessagesTyv.php91
-rw-r--r--languages/messages/MessagesUg_arab.php110
-rw-r--r--languages/messages/MessagesUk.php153
-rw-r--r--languages/messages/MessagesUr.php135
-rw-r--r--languages/messages/MessagesUz.php111
-rw-r--r--languages/messages/MessagesVec.php194
-rw-r--r--languages/messages/MessagesVep.php28
-rw-r--r--languages/messages/MessagesVi.php173
-rw-r--r--languages/messages/MessagesVls.php6
-rw-r--r--languages/messages/MessagesVmf.php6
-rw-r--r--languages/messages/MessagesVo.php25
-rw-r--r--languages/messages/MessagesVot.php15
-rw-r--r--languages/messages/MessagesVro.php22
-rw-r--r--languages/messages/MessagesWa.php27
-rw-r--r--languages/messages/MessagesWar.php67
-rw-r--r--languages/messages/MessagesWo.php25
-rw-r--r--languages/messages/MessagesWuu.php18
-rw-r--r--languages/messages/MessagesXal.php20
-rw-r--r--languages/messages/MessagesXh.php3
-rw-r--r--languages/messages/MessagesXmf.php7
-rw-r--r--languages/messages/MessagesYi.php159
-rw-r--r--languages/messages/MessagesYo.php98
-rw-r--r--languages/messages/MessagesYue.php28
-rw-r--r--languages/messages/MessagesZea.php14
-rw-r--r--languages/messages/MessagesZh_classical.php14
-rw-r--r--languages/messages/MessagesZh_hans.php218
-rw-r--r--languages/messages/MessagesZh_hant.php190
-rw-r--r--languages/messages/MessagesZh_hk.php1
-rw-r--r--languages/messages/MessagesZh_min_nan.php13
-rw-r--r--languages/messages/MessagesZh_tw.php28
-rw-r--r--languages/messages/MessagesZh_yue.php13
-rw-r--r--languages/messages/MessagesZu.php7
-rw-r--r--languages/utils/CLDRPluralRuleEvaluator.php35
-rw-r--r--load.php52
-rw-r--r--maintenance/7zip.inc2
-rw-r--r--maintenance/Doxyfile7
-rw-r--r--maintenance/Maintenance.php60
-rw-r--r--maintenance/Makefile4
-rw-r--r--maintenance/README10
-rw-r--r--maintenance/archives/patch-archive-ar_content_format.sql2
-rw-r--r--maintenance/archives/patch-archive-ar_content_model.sql2
-rw-r--r--maintenance/archives/patch-archive-user-index.sql2
-rw-r--r--maintenance/archives/patch-backlinkindexes.sql8
-rw-r--r--maintenance/archives/patch-category.sql2
-rw-r--r--maintenance/archives/patch-categorylinks.sql12
-rw-r--r--maintenance/archives/patch-categorylinksindex.sql6
-rw-r--r--maintenance/archives/patch-drop-ss_admins.sql2
-rw-r--r--maintenance/archives/patch-externallinks.sql2
-rw-r--r--maintenance/archives/patch-fa_deleted.sql2
-rw-r--r--maintenance/archives/patch-fa_sha1.sql4
-rw-r--r--maintenance/archives/patch-filearchive-user-index.sql2
-rw-r--r--maintenance/archives/patch-filearchive.sql14
-rw-r--r--maintenance/archives/patch-hitcounter.sql2
-rw-r--r--maintenance/archives/patch-image-user-index.sql6
-rw-r--r--maintenance/archives/patch-img_media_mime-index.sql4
-rw-r--r--maintenance/archives/patch-img_media_type.sql4
-rw-r--r--maintenance/archives/patch-img_sha1.sql4
-rw-r--r--maintenance/archives/patch-indexes.sql6
-rw-r--r--maintenance/archives/patch-interwiki.sql6
-rw-r--r--maintenance/archives/patch-ipb_anon_only.sql14
-rw-r--r--maintenance/archives/patch-ipb_by_text.sql2
-rw-r--r--maintenance/archives/patch-ipb_deleted.sql2
-rw-r--r--maintenance/archives/patch-ipb_range_start.sql10
-rw-r--r--maintenance/archives/patch-iwlinks.sql4
-rw-r--r--maintenance/archives/patch-job.sql2
-rw-r--r--maintenance/archives/patch-job_attempts.sql4
-rw-r--r--maintenance/archives/patch-job_token.sql9
-rw-r--r--maintenance/archives/patch-langlinks.sql2
-rw-r--r--maintenance/archives/patch-linktables.sql10
-rw-r--r--maintenance/archives/patch-log_search-rename-index.sql4
-rw-r--r--maintenance/archives/patch-log_user_text.sql2
-rw-r--r--maintenance/archives/patch-logging-times-index.sql6
-rw-r--r--maintenance/archives/patch-logging.sql10
-rw-r--r--maintenance/archives/patch-mime_minor_length.sql4
-rw-r--r--maintenance/archives/patch-msg_resource.sql2
-rw-r--r--maintenance/archives/patch-oi_metadata.sql6
-rw-r--r--maintenance/archives/patch-oldimage-user-index.sql6
-rw-r--r--maintenance/archives/patch-page-page_content_model.sql2
-rw-r--r--maintenance/archives/patch-page_props-propname-page-index.sql4
-rw-r--r--maintenance/archives/patch-pagelinks.sql6
-rw-r--r--maintenance/archives/patch-parsercache.sql2
-rw-r--r--maintenance/archives/patch-pl-tl-il-unique.sql4
-rw-r--r--maintenance/archives/patch-querycache.sql6
-rw-r--r--maintenance/archives/patch-querycachetwo.sql6
-rw-r--r--maintenance/archives/patch-rc_deleted.sql2
-rw-r--r--maintenance/archives/patch-rc_id.sql2
-rw-r--r--maintenance/archives/patch-rc_ip.sql2
-rw-r--r--maintenance/archives/patch-rc_moved.sql4
-rw-r--r--maintenance/archives/patch-redirect.sql2
-rw-r--r--maintenance/archives/patch-rename-iwl_prefix.sql2
-rw-r--r--maintenance/archives/patch-restructure.sql3
-rw-r--r--maintenance/archives/patch-revision-rev_content_format.sql2
-rw-r--r--maintenance/archives/patch-revision-rev_content_model.sql2
-rw-r--r--maintenance/archives/patch-searchindex.sql6
-rw-r--r--maintenance/archives/patch-sites.sql71
-rw-r--r--maintenance/archives/patch-templatelinks.sql5
-rw-r--r--maintenance/archives/patch-testrun.sql8
-rw-r--r--maintenance/archives/patch-ufg_group-length-increase-255.sql2
-rw-r--r--maintenance/archives/patch-ufg_group-length-increase.sql2
-rw-r--r--maintenance/archives/patch-ug_group-length-increase-255.sql2
-rw-r--r--maintenance/archives/patch-ug_group-length-increase.sql2
-rw-r--r--maintenance/archives/patch-uploadstash-us_props.sql2
-rw-r--r--maintenance/archives/patch-uploadstash.sql15
-rw-r--r--maintenance/archives/patch-user-realname.sql2
-rw-r--r--maintenance/archives/patch-user_former_groups.sql4
-rw-r--r--maintenance/archives/patch-user_groups.sql4
-rw-r--r--maintenance/archives/patch-user_properties.sql4
-rw-r--r--maintenance/archives/patch-user_rights.sql4
-rw-r--r--maintenance/archives/upgradeLogging.php7
-rw-r--r--maintenance/backupPrefetch.inc4
-rw-r--r--maintenance/backupTextPass.inc4
-rw-r--r--maintenance/benchmarks/Benchmarker.php2
-rw-r--r--maintenance/benchmarks/bench_strtr_str_replace.php4
-rw-r--r--maintenance/benchmarks/bench_wfBaseConvert.php77
-rw-r--r--maintenance/changePassword.php2
-rw-r--r--maintenance/checkAutoLoader.php63
-rw-r--r--maintenance/checkBadRedirects.php2
-rw-r--r--maintenance/checkSyntax.php1
-rw-r--r--maintenance/cleanupPreferences.php104
-rw-r--r--maintenance/cleanupSpam.php14
-rw-r--r--maintenance/cleanupTitles.php2
-rw-r--r--maintenance/cleanupUploadStash.php98
-rw-r--r--maintenance/clearCacheStats.php60
-rw-r--r--maintenance/clearInterwikiCache.php (renamed from maintenance/clear_interwiki_cache.php)0
-rw-r--r--maintenance/clear_stats.php60
-rw-r--r--maintenance/compareParsers.php15
-rw-r--r--maintenance/convertUserOptions.php2
-rw-r--r--maintenance/copyFileBackend.php21
-rw-r--r--maintenance/createAndPromote.php81
-rw-r--r--maintenance/cssjanus/README24
-rw-r--r--maintenance/deleteArchivedFiles.inc11
-rw-r--r--maintenance/deleteArchivedRevisions.inc2
-rw-r--r--maintenance/deleteEqualMessages.php186
-rw-r--r--maintenance/deleteOldRevisions.php38
-rw-r--r--maintenance/deleteOrphanedRevisions.php3
-rw-r--r--maintenance/dev/includes/router.php2
-rw-r--r--maintenance/doMaintenance.php12
-rw-r--r--maintenance/dumpIterator.php2
-rw-r--r--maintenance/dumpLinks.php1
-rw-r--r--maintenance/dumpTextPass.php2
-rw-r--r--maintenance/edit.php4
-rw-r--r--maintenance/eval.php4
-rw-r--r--maintenance/fileOpPerfTest.php22
-rw-r--r--maintenance/findHooks.php7
-rw-r--r--maintenance/fixDoubleRedirects.php20
-rw-r--r--maintenance/fixSlaveDesync.php2
-rw-r--r--maintenance/formatInstallDoc.php2
-rw-r--r--maintenance/fuzz-tester.php24
-rw-r--r--maintenance/generateSitemap.php26
-rw-r--r--maintenance/getConfiguration.php89
-rw-r--r--maintenance/getText.php6
-rw-r--r--maintenance/hiphop/make18
-rw-r--r--maintenance/hiphop/run-server4
-rw-r--r--maintenance/ibm_db2/foreignkeys.sql102
-rw-r--r--maintenance/ibm_db2/patch-categorylinks-better-collation.sql21
-rw-r--r--maintenance/ibm_db2/patch-change_tag-indexes.sql5
-rw-r--r--maintenance/ibm_db2/patch-change_tag.sql8
-rw-r--r--maintenance/ibm_db2/patch-change_tag_summary.sql7
-rw-r--r--maintenance/ibm_db2/patch-change_valid_tag.sql3
-rw-r--r--maintenance/ibm_db2/patch-cl_collation-field.sql1
-rw-r--r--maintenance/ibm_db2/patch-cl_sortkey_prefix-field.sql1
-rw-r--r--maintenance/ibm_db2/patch-cl_type-field.sql1
-rw-r--r--maintenance/ibm_db2/patch-external_user.sql7
-rw-r--r--maintenance/ibm_db2/patch-ipb_allow_usertalk.sql23
-rw-r--r--maintenance/ibm_db2/patch-iw_api-field.sql1
-rw-r--r--maintenance/ibm_db2/patch-iw_api_and_wikiid.sql8
-rw-r--r--maintenance/ibm_db2/patch-iw_wikiid-field.sql1
-rw-r--r--maintenance/ibm_db2/patch-iwlinks.sql7
-rw-r--r--maintenance/ibm_db2/patch-l10n_cache.sql8
-rw-r--r--maintenance/ibm_db2/patch-log_search-rename-index.sql8
-rw-r--r--maintenance/ibm_db2/patch-log_search.sql8
-rw-r--r--maintenance/ibm_db2/patch-log_user_text.sql17
-rw-r--r--maintenance/ibm_db2/patch-module_deps.sql6
-rw-r--r--maintenance/ibm_db2/patch-msg_resource.sql8
-rw-r--r--maintenance/ibm_db2/patch-msg_resource_links.sql6
-rw-r--r--maintenance/ibm_db2/patch-rd_interwiki.sql8
-rw-r--r--maintenance/ibm_db2/patch-ss_active_users.sql11
-rw-r--r--maintenance/ibm_db2/patch-ul_value.sql3
-rw-r--r--maintenance/ibm_db2/patch-uq61_msg_resource_links.sql7
-rw-r--r--maintenance/ibm_db2/patch-uq81_msg_resource.sql7
-rw-r--r--maintenance/ibm_db2/patch-uq96_module_deps.sql7
-rw-r--r--maintenance/ibm_db2/patch-user_properties.sql10
-rw-r--r--maintenance/ibm_db2/tables.sql930
-rw-r--r--maintenance/importDump.php14
-rw-r--r--maintenance/importImages.inc8
-rw-r--r--maintenance/importImages.php55
-rw-r--r--maintenance/importSiteScripts.php3
-rw-r--r--maintenance/importTextFile.php3
-rw-r--r--maintenance/initSiteStats.php88
-rw-r--r--maintenance/initStats.php88
-rw-r--r--maintenance/install.php27
-rw-r--r--maintenance/jsduck/MetaTags.rb53
-rw-r--r--maintenance/jsduck/categories.json54
-rw-r--r--maintenance/jsduck/config.json18
-rw-r--r--maintenance/jsduck/eg-iframe.html20
-rw-r--r--maintenance/jsduck/external.js26
-rw-r--r--maintenance/jsparse.php2
-rw-r--r--maintenance/lag.php4
-rw-r--r--maintenance/language/StatOutputs.php4
-rw-r--r--maintenance/language/checkLanguage.inc6
-rw-r--r--maintenance/language/generateCollationData.php102
-rw-r--r--maintenance/language/generateNormalizerData.php6
-rw-r--r--maintenance/language/langmemusage.php11
-rw-r--r--maintenance/language/languages.inc11
-rw-r--r--maintenance/language/messageTypes.inc8
-rw-r--r--maintenance/language/messages.inc103
-rw-r--r--maintenance/language/validate.php4
-rw-r--r--maintenance/language/zhtable/Makefile2
-rw-r--r--maintenance/language/zhtable/Makefile.py391
-rw-r--r--maintenance/language/zhtable/README (renamed from includes/zhtable/README)0
-rw-r--r--maintenance/language/zhtable/simp2trad.manual (renamed from includes/zhtable/simp2trad.manual)0
-rw-r--r--maintenance/language/zhtable/simp2trad_noconvert.manual (renamed from includes/zhtable/simp2trad_noconvert.manual)0
-rw-r--r--maintenance/language/zhtable/simp2trad_supp_set.manual (renamed from includes/zhtable/simp2trad_supp_set.manual)0
-rw-r--r--maintenance/language/zhtable/simpphrases.manual (renamed from includes/zhtable/simpphrases.manual)0
-rw-r--r--maintenance/language/zhtable/simpphrases_exclude.manual (renamed from includes/zhtable/simpphrases_exclude.manual)0
-rw-r--r--maintenance/language/zhtable/toCN.manual (renamed from includes/zhtable/toCN.manual)0
-rw-r--r--maintenance/language/zhtable/toHK.manual (renamed from includes/zhtable/toHK.manual)0
-rw-r--r--maintenance/language/zhtable/toSG.manual (renamed from includes/zhtable/toSG.manual)0
-rw-r--r--maintenance/language/zhtable/toSimp.manual166
-rw-r--r--maintenance/language/zhtable/toTW.manual (renamed from includes/zhtable/toTW.manual)0
-rw-r--r--maintenance/language/zhtable/toTrad.manual (renamed from includes/zhtable/toTrad.manual)0
-rw-r--r--maintenance/language/zhtable/trad2simp.manual153
-rw-r--r--maintenance/language/zhtable/trad2simp_noconvert.manual (renamed from includes/zhtable/trad2simp_noconvert.manual)0
-rw-r--r--maintenance/language/zhtable/trad2simp_supp_set.manual (renamed from includes/zhtable/trad2simp_supp_set.manual)0
-rw-r--r--maintenance/language/zhtable/tradphrases.manual4311
-rw-r--r--maintenance/language/zhtable/tradphrases_exclude.manual (renamed from includes/zhtable/tradphrases_exclude.manual)0
-rw-r--r--maintenance/locking/LockServerDaemon.php15
-rw-r--r--maintenance/mcc.php73
-rw-r--r--maintenance/mctest.php22
-rw-r--r--maintenance/mergeMessageFileList.php8
-rw-r--r--maintenance/migrateUserGroup.php31
-rw-r--r--maintenance/minify.php2
-rw-r--r--maintenance/mssql/tables.sql30
-rw-r--r--maintenance/mwdocgen.php14
-rw-r--r--maintenance/mwjsduck-gen2
-rw-r--r--maintenance/namespaceDupes.php5
-rw-r--r--maintenance/nextJobDB.php148
-rw-r--r--maintenance/oracle/alterSharedConstraints.php23
-rw-r--r--maintenance/oracle/archives/patch-archive-ar_content_format.sql3
-rw-r--r--maintenance/oracle/archives/patch-archive-ar_content_model.sql3
-rw-r--r--maintenance/oracle/archives/patch-cat_hidden.sql4
-rw-r--r--maintenance/oracle/archives/patch-fa_sha1.sql5
-rw-r--r--maintenance/oracle/archives/patch-job_attempts.sql4
-rw-r--r--maintenance/oracle/archives/patch-job_token.sql12
-rw-r--r--maintenance/oracle/archives/patch-page-page_content_model.sql3
-rw-r--r--maintenance/oracle/archives/patch-rc_moved.sql4
-rw-r--r--maintenance/oracle/archives/patch-revision-rev_content_format.sql3
-rw-r--r--maintenance/oracle/archives/patch-revision-rev_content_model.sql3
-rw-r--r--maintenance/oracle/archives/patch-sites.sql34
-rw-r--r--maintenance/oracle/archives/patch-ss_admins.sql4
-rw-r--r--maintenance/oracle/archives/patch-testrun.sql2
-rw-r--r--maintenance/oracle/archives/patch-ufg_group-length-increase-255.sql9
-rw-r--r--maintenance/oracle/archives/patch-ufg_group-length-increase.sql9
-rw-r--r--maintenance/oracle/archives/patch-ug_group-length-increase-255.sql9
-rw-r--r--maintenance/oracle/archives/patch-ug_group-length-increase.sql9
-rw-r--r--maintenance/oracle/archives/patch-uploadstash-us_props.sql4
-rw-r--r--maintenance/oracle/archives/patch-user_former_groups.sql2
-rw-r--r--maintenance/oracle/tables.sql71
-rw-r--r--maintenance/orphans.php4
-rw-r--r--maintenance/parse.php2
-rw-r--r--maintenance/populateFilearchiveSha1.php107
-rw-r--r--maintenance/populateLogUsertext.php1
-rw-r--r--maintenance/populateRevisionLength.php15
-rw-r--r--maintenance/populateRevisionSha1.php13
-rw-r--r--maintenance/postgres/archives/patch-sites.sql31
-rw-r--r--maintenance/postgres/archives/patch-testrun.sql2
-rw-r--r--maintenance/postgres/tables.sql122
-rw-r--r--maintenance/preprocessDump.php9
-rw-r--r--maintenance/preprocessorFuzzTest.php18
-rw-r--r--maintenance/protect.php1
-rw-r--r--maintenance/proxyCheck.php70
-rw-r--r--maintenance/proxy_check.php70
-rw-r--r--maintenance/purgeList.php94
-rw-r--r--maintenance/purgeParserCache.php16
-rw-r--r--maintenance/reassignEdits.php1
-rw-r--r--maintenance/rebuildLocalisationCache.php9
-rw-r--r--maintenance/rebuildrecentchanges.php17
-rw-r--r--maintenance/rebuildtextindex.php27
-rw-r--r--maintenance/refreshFileHeaders.php93
-rw-r--r--maintenance/refreshImageMetadata.php2
-rw-r--r--maintenance/refreshLinks.php45
-rw-r--r--maintenance/removeUnusedAccounts.php15
-rw-r--r--maintenance/renderDump.php6
-rw-r--r--maintenance/runJobs.php73
-rw-r--r--maintenance/showCacheStats.php106
-rw-r--r--maintenance/showJobs.php25
-rw-r--r--maintenance/showSiteStats.php73
-rw-r--r--maintenance/showStats.php74
-rw-r--r--maintenance/sql.php34
-rw-r--r--maintenance/sqlite.inc2
-rw-r--r--maintenance/sqlite/archives/patch-drop-ss_admins.sql22
-rw-r--r--maintenance/sqlite/archives/patch-job_token.sql8
-rw-r--r--maintenance/sqlite/archives/patch-profiling.sql12
-rw-r--r--maintenance/sqlite/archives/patch-rc_moved.sql46
-rw-r--r--maintenance/sqlite/archives/patch-rename-iwl_prefix.sql2
-rw-r--r--maintenance/sqlite/archives/patch-sites.sql71
-rw-r--r--maintenance/sqlite/archives/patch-ufg_group-length-increase-255.sql15
-rw-r--r--maintenance/sqlite/archives/patch-ufg_group-length-increase.sql15
-rw-r--r--maintenance/sqlite/archives/patch-ug_group-length-increase-255.sql15
-rw-r--r--maintenance/sqlite/archives/patch-ug_group-length-increase.sql15
-rw-r--r--maintenance/sqlite/archives/searchindex-fts3.sql4
-rw-r--r--maintenance/sqlite/archives/searchindex-no-fts.sql2
-rw-r--r--maintenance/stats.php106
-rw-r--r--maintenance/storage/blobs.sql3
-rw-r--r--maintenance/storage/checkStorage.php8
-rw-r--r--maintenance/storage/compressOld.php9
-rw-r--r--maintenance/storage/drop_content_model_info.sql7
-rw-r--r--maintenance/storage/dumpRev.php9
-rw-r--r--maintenance/storage/fixBug20757.php14
-rwxr-xr-xmaintenance/storage/make-blobs4
-rw-r--r--maintenance/storage/moveToExternal.php4
-rw-r--r--maintenance/storage/orphanStats.php11
-rw-r--r--maintenance/storage/recompressTracked.php43
-rw-r--r--maintenance/storage/resolveStubs.php5
-rw-r--r--maintenance/storage/storageTypeStats.php1
-rw-r--r--maintenance/storage/testCompression.php8
-rw-r--r--maintenance/storage/trackBlobs.php10
-rw-r--r--maintenance/syncFileBackend.php48
-rw-r--r--maintenance/tables.sql155
-rw-r--r--maintenance/term/MWTerm.php7
-rw-r--r--maintenance/update.php60
-rw-r--r--maintenance/updateCollation.php65
-rw-r--r--maintenance/updateSearchIndex.php16
-rw-r--r--maintenance/updateSpecialPages.php2
-rw-r--r--maintenance/upgrade1_5.php1337
-rw-r--r--maintenance/userDupes.inc12
-rw-r--r--maintenance/userOptions.inc8
-rw-r--r--maintenance/userOptions.php1
-rw-r--r--maintenance/waitForSlave.php1
-rw-r--r--mw-config/index.php15
-rw-r--r--mw-config/index.php521
-rw-r--r--mw-config/overrides.php17
-rw-r--r--opensearch_desc.php8
-rw-r--r--opensearch_desc.php54
-rw-r--r--profileinfo.php401
-rw-r--r--redirect.php52
-rw-r--r--resources/Resources.php118
-rw-r--r--resources/Resources.php.orig968
-rw-r--r--resources/jquery.effects/jquery.effects.blind.js2
-rw-r--r--resources/jquery.effects/jquery.effects.bounce.js2
-rw-r--r--resources/jquery.effects/jquery.effects.clip.js2
-rw-r--r--resources/jquery.effects/jquery.effects.core.js4
-rw-r--r--resources/jquery.effects/jquery.effects.drop.js2
-rw-r--r--resources/jquery.effects/jquery.effects.explode.js2
-rw-r--r--resources/jquery.effects/jquery.effects.fade.js2
-rw-r--r--resources/jquery.effects/jquery.effects.fold.js2
-rw-r--r--resources/jquery.effects/jquery.effects.highlight.js2
-rw-r--r--resources/jquery.effects/jquery.effects.pulsate.js2
-rw-r--r--resources/jquery.effects/jquery.effects.scale.js2
-rw-r--r--resources/jquery.effects/jquery.effects.shake.js2
-rw-r--r--resources/jquery.effects/jquery.effects.slide.js2
-rw-r--r--resources/jquery.effects/jquery.effects.transfer.js2
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js4
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js4
-rw-r--r--resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js4
-rw-r--r--resources/jquery.ui/jquery.ui.accordion.js4
-rw-r--r--resources/jquery.ui/jquery.ui.autocomplete.js2
-rw-r--r--resources/jquery.ui/jquery.ui.button.js2
-rw-r--r--resources/jquery.ui/jquery.ui.core.js4
-rw-r--r--resources/jquery.ui/jquery.ui.datepicker.js6
-rw-r--r--resources/jquery.ui/jquery.ui.dialog.js4
-rw-r--r--resources/jquery.ui/jquery.ui.draggable.js13
-rw-r--r--resources/jquery.ui/jquery.ui.droppable.js11
-rw-r--r--resources/jquery.ui/jquery.ui.mouse.js2
-rw-r--r--resources/jquery.ui/jquery.ui.position.js2
-rw-r--r--resources/jquery.ui/jquery.ui.progressbar.js4
-rw-r--r--resources/jquery.ui/jquery.ui.resizable.js4
-rw-r--r--resources/jquery.ui/jquery.ui.selectable.js4
-rw-r--r--resources/jquery.ui/jquery.ui.slider.js4
-rw-r--r--resources/jquery.ui/jquery.ui.sortable.js34
-rw-r--r--resources/jquery.ui/jquery.ui.tabs.js4
-rw-r--r--resources/jquery.ui/jquery.ui.widget.js2
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.accordion.css2
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.autocomplete.css4
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.button.css114
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.core.css2
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.datepicker.css2
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.dialog.css2
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.progressbar.css2
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.resizable.css2
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.selectable.css2
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.slider.css2
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.tabs.css2
-rw-r--r--resources/jquery.ui/themes/default/jquery.ui.theme.css2
-rw-r--r--resources/jquery.ui/themes/vector/jquery.ui.button.css148
-rw-r--r--resources/jquery/jquery.arrowSteps.js11
-rw-r--r--resources/jquery/jquery.badge.css37
-rw-r--r--resources/jquery/jquery.badge.js121
-rw-r--r--resources/jquery/jquery.byteLimit.js5
-rw-r--r--resources/jquery/jquery.checkboxShiftClick.js10
-rw-r--r--resources/jquery/jquery.client.js152
-rw-r--r--resources/jquery/jquery.collapsibleTabs.js126
-rw-r--r--resources/jquery/jquery.colorUtil.js21
-rw-r--r--resources/jquery/jquery.delayedBind.js6
-rw-r--r--resources/jquery/jquery.expandableField.js8
-rw-r--r--resources/jquery/jquery.hidpi.js117
-rw-r--r--resources/jquery/jquery.highlightText.js2
-rw-r--r--resources/jquery/jquery.jStorage.js853
-rw-r--r--resources/jquery/jquery.js206
-rw-r--r--resources/jquery/jquery.json.js250
-rw-r--r--resources/jquery/jquery.localize.js59
-rw-r--r--resources/jquery/jquery.makeCollapsible.js621
-rw-r--r--resources/jquery/jquery.mw-jump.js10
-rw-r--r--resources/jquery/jquery.mwExtension.js5
-rw-r--r--resources/jquery/jquery.qunit.completenessTest.js4
-rw-r--r--resources/jquery/jquery.qunit.css15
-rw-r--r--resources/jquery/jquery.qunit.js493
-rw-r--r--resources/jquery/jquery.spinner.js2
-rw-r--r--resources/jquery/jquery.suggestions.js207
-rw-r--r--resources/jquery/jquery.tablesorter.js371
-rw-r--r--resources/jquery/jquery.textSelection.js111
-rw-r--r--resources/mediawiki.action/mediawiki.action.edit.js2
-rw-r--r--resources/mediawiki.action/mediawiki.action.edit.preview.js6
-rw-r--r--resources/mediawiki.action/mediawiki.action.history.diff.css80
-rw-r--r--resources/mediawiki.action/mediawiki.action.history.js2
-rw-r--r--resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js14
-rw-r--r--resources/mediawiki.action/mediawiki.action.view.postEdit.js15
-rw-r--r--resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js14
-rw-r--r--resources/mediawiki.api/mediawiki.api.category.js174
-rw-r--r--resources/mediawiki.api/mediawiki.api.edit.js85
-rw-r--r--resources/mediawiki.api/mediawiki.api.js73
-rw-r--r--resources/mediawiki.api/mediawiki.api.parse.js39
-rw-r--r--resources/mediawiki.api/mediawiki.api.titleblacklist.js52
-rw-r--r--resources/mediawiki.api/mediawiki.api.watch.js68
-rw-r--r--resources/mediawiki.language/languages/bs.js6
-rw-r--r--resources/mediawiki.language/languages/dsb.js6
-rw-r--r--resources/mediawiki.language/languages/fi.js15
-rw-r--r--resources/mediawiki.language/languages/ga.js7
-rw-r--r--resources/mediawiki.language/languages/he.js14
-rw-r--r--resources/mediawiki.language/languages/hsb.js6
-rw-r--r--resources/mediawiki.language/languages/hu.js6
-rw-r--r--resources/mediawiki.language/languages/hy.js16
-rw-r--r--resources/mediawiki.language/languages/la.js6
-rw-r--r--resources/mediawiki.language/languages/os.js29
-rw-r--r--resources/mediawiki.language/languages/ru.js46
-rw-r--r--resources/mediawiki.language/languages/sl.js6
-rw-r--r--resources/mediawiki.language/languages/uk.js28
-rw-r--r--resources/mediawiki.language/mediawiki.cldr.js23
-rw-r--r--resources/mediawiki.language/mediawiki.language.init.js4
-rw-r--r--resources/mediawiki.language/mediawiki.language.js51
-rw-r--r--resources/mediawiki.language/mediawiki.language.numbers.js243
-rw-r--r--resources/mediawiki.libs/CLDRPluralRuleParser.js1
-rw-r--r--resources/mediawiki.page/mediawiki.page.patrol.ajax.js63
-rw-r--r--resources/mediawiki.page/mediawiki.page.ready.js40
-rw-r--r--resources/mediawiki.page/mediawiki.page.watch.ajax.js17
-rw-r--r--resources/mediawiki.special/mediawiki.special.block.js78
-rw-r--r--resources/mediawiki.special/mediawiki.special.changeemail.js62
-rw-r--r--resources/mediawiki.special/mediawiki.special.changeslist.css11
-rw-r--r--resources/mediawiki.special/mediawiki.special.javaScriptTest.js2
-rw-r--r--resources/mediawiki.special/mediawiki.special.js6
-rw-r--r--resources/mediawiki.special/mediawiki.special.movePage.js9
-rw-r--r--resources/mediawiki.special/mediawiki.special.preferences.js336
-rw-r--r--resources/mediawiki.special/mediawiki.special.recentchanges.js31
-rw-r--r--resources/mediawiki.special/mediawiki.special.search.js90
-rw-r--r--resources/mediawiki.special/mediawiki.special.undelete.js13
-rw-r--r--resources/mediawiki.special/mediawiki.special.upload.js91
-rw-r--r--resources/mediawiki.special/mediawiki.special.userLogin.signup.js10
-rw-r--r--resources/mediawiki/mediawiki.Title.js103
-rw-r--r--resources/mediawiki/mediawiki.Uri.js64
-rw-r--r--resources/mediawiki/mediawiki.debug.css1
-rw-r--r--resources/mediawiki/mediawiki.debug.js6
-rw-r--r--resources/mediawiki/mediawiki.feedback.js45
-rw-r--r--resources/mediawiki/mediawiki.hidpi.js5
-rw-r--r--resources/mediawiki/mediawiki.htmlform.js112
-rw-r--r--resources/mediawiki/mediawiki.jqueryMsg.js423
-rw-r--r--resources/mediawiki/mediawiki.jqueryMsg.peg1
-rw-r--r--resources/mediawiki/mediawiki.js699
-rw-r--r--resources/mediawiki/mediawiki.log.js2
-rw-r--r--resources/mediawiki/mediawiki.notification.js145
-rw-r--r--resources/mediawiki/mediawiki.notify.js13
-rw-r--r--resources/mediawiki/mediawiki.searchSuggest.css16
-rw-r--r--resources/mediawiki/mediawiki.searchSuggest.js110
-rw-r--r--resources/mediawiki/mediawiki.user.js25
-rw-r--r--resources/mediawiki/mediawiki.util.js236
-rw-r--r--resources/startup.js23
-rw-r--r--serialized/serialize.php24
-rw-r--r--skins/ArchLinux.php36
-rw-r--r--skins/Chick.php2
-rw-r--r--skins/CologneBlue.php661
-rw-r--r--skins/Modern.php16
-rw-r--r--skins/MonoBook.php36
-rw-r--r--skins/Nostalgia.php2
-rw-r--r--skins/Standard.php18
-rw-r--r--skins/Vector.php90
-rw-r--r--skins/archlinux/main.css54
-rw-r--r--skins/cologneblue/screen.css171
-rw-r--r--skins/common/commonContent.css19
-rw-r--r--skins/common/commonElements.css7
-rw-r--r--skins/common/commonInterface.css10
-rw-r--r--skins/common/commonPrint.css4
-rw-r--r--skins/common/config.css1
-rw-r--r--skins/common/images/icons/fileicon-djvu.xcfbin83394 -> 0 bytes
-rw-r--r--skins/common/images/icons/fileicon-ogg.xcfbin40236 -> 0 bytes
-rw-r--r--skins/common/images/icons/fileicon-psd.pngbin0 -> 10376 bytes
-rw-r--r--skins/common/shared.css44
-rw-r--r--skins/common/wikibits.js3
-rw-r--r--skins/modern/main.css15
-rw-r--r--skins/monobook/main.css54
-rw-r--r--skins/simple/main.css6
-rw-r--r--skins/vector/images/border.pngbin69 -> 0 bytes
-rw-r--r--skins/vector/images/page-base.pngbin67 -> 0 bytes
-rw-r--r--skins/vector/images/preferences-base.pngbin67 -> 0 bytes
-rw-r--r--skins/vector/images/preferences-edge.pngbin67 -> 0 bytes
-rw-r--r--skins/vector/screen.css71
-rw-r--r--skins/vector/vector.js2
-rw-r--r--tests/.htaccess1
-rw-r--r--tests/RunSeleniumTests.php233
-rw-r--r--tests/TestsAutoLoader.php35
-rw-r--r--tests/jasmine/.htaccess1
-rw-r--r--tests/jasmine/SpecRunner.html28
-rw-r--r--tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE20
-rw-r--r--tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js188
-rw-r--r--tests/jasmine/lib/jasmine-1.0.1/jasmine.css166
-rw-r--r--tests/jasmine/lib/jasmine-1.0.1/jasmine.js2421
-rw-r--r--tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js488
-rw-r--r--tests/jasmine/spec/mediawiki.jqueryMsg.spec.js389
-rw-r--r--tests/jasmine/spec_makers/makeJqueryMsgSpec.php110
-rw-r--r--tests/parser/README8
-rw-r--r--tests/parser/extraParserTests.txtbin1261 -> 0 bytes
-rw-r--r--tests/parser/parserTest.inc1330
-rw-r--r--tests/parser/parserTests.txt10363
-rw-r--r--tests/parser/parserTestsParserHook.php70
-rw-r--r--tests/parser/preprocess/All_system_messages.expected5646
-rw-r--r--tests/parser/preprocess/All_system_messages.txt5645
-rw-r--r--tests/parser/preprocess/Factorial.expected17
-rw-r--r--tests/parser/preprocess/Factorial.txt16
-rw-r--r--tests/parser/preprocess/Fundraising.expected18
-rw-r--r--tests/parser/preprocess/Fundraising.txt17
-rw-r--r--tests/parser/preprocess/QuoteQuran.expected140
-rw-r--r--tests/parser/preprocess/QuoteQuran.txt139
-rw-r--r--tests/parserTests.php92
-rw-r--r--tests/phpunit/Makefile91
-rw-r--r--tests/phpunit/MediaWikiLangTestCase.php42
-rw-r--r--tests/phpunit/MediaWikiPHPUnitCommand.php76
-rw-r--r--tests/phpunit/MediaWikiTestCase.php547
-rw-r--r--tests/phpunit/README53
-rw-r--r--tests/phpunit/StructureTest.php60
-rw-r--r--tests/phpunit/TODO10
-rw-r--r--tests/phpunit/bootstrap.php32
-rw-r--r--tests/phpunit/data/db/mysql/functions.sql12
-rw-r--r--tests/phpunit/data/db/postgres/functions.sql12
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.13.sql342
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.15.sql454
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.16.sql483
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.17.sql516
-rw-r--r--tests/phpunit/data/db/sqlite/tables-1.18.sql535
-rw-r--r--tests/phpunit/data/media/1bit-png.pngbin167 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/80x60-2layers.xcfbin1162 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/80x60-Greyscale.xcfbin667 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/80x60-RGB.xcfbin677 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/Animated_PNG_example_bouncing_beach_ball.pngbin72209 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/Gtk-media-play-ltr.svg35
-rw-r--r--tests/phpunit/data/media/Png-native-test.pngbin4665 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/QA_icon.svg77
-rw-r--r--tests/phpunit/data/media/README38
-rw-r--r--tests/phpunit/data/media/Toll_Texas_1.svg150
-rw-r--r--tests/phpunit/data/media/US_states_by_total_state_tax_revenue.svg248
-rw-r--r--tests/phpunit/data/media/Wikimedia-logo.svg14
-rw-r--r--tests/phpunit/data/media/Xmp-exif-multilingual_test.jpgbin12544 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/animated-xmp.gifbin3864 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/animated.gifbin497 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/broken_exif_date.jpgbin3233 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/exif-gps.jpgbin665 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/exif-user-comment.jpgbin484 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/greyscale-na-png.pngbin365 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/greyscale-png.pngbin415 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/iptc-invalid-psir.jpgbin9574 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/iptc-timetest-invalid.jpgbin9573 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/iptc-timetest.jpgbin9573 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-comment-binary.jpgbin448 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-comment-iso8859-1.jpgbin447 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-comment-multiple.jpgbin431 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-comment-utf.jpgbin445 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-iptc-bad-hash.jpgbin499 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-iptc-good-hash.jpgbin499 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-padding-even.jpgbin450 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-padding-odd.jpgbin451 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-xmp-alt.jpgbin3255 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-xmp-psir.jpgbin3308 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/jpeg-xmp-psir.xmp35
-rw-r--r--tests/phpunit/data/media/landscape-plain.jpgbin38771 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/nonanimated.gifbin200 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/portrait-rotated.jpgbin38577 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/rgb-na-png.pngbin593 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/rgb-png.pngbin663 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/test.jpgbin437 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/test.tiffbin566 -> 0 bytes
-rw-r--r--tests/phpunit/data/media/xmp.pngbin582 -> 0 bytes
-rw-r--r--tests/phpunit/data/xmp/1.result.php8
-rw-r--r--tests/phpunit/data/xmp/1.xmp11
-rw-r--r--tests/phpunit/data/xmp/2.result.php8
-rw-r--r--tests/phpunit/data/xmp/2.xmp12
-rw-r--r--tests/phpunit/data/xmp/3-invalid.result.php7
-rw-r--r--tests/phpunit/data/xmp/3-invalid.xmp31
-rw-r--r--tests/phpunit/data/xmp/3.result.php8
-rw-r--r--tests/phpunit/data/xmp/3.xmp29
-rw-r--r--tests/phpunit/data/xmp/4.result.php7
-rw-r--r--tests/phpunit/data/xmp/4.xmp22
-rw-r--r--tests/phpunit/data/xmp/5.result.php7
-rw-r--r--tests/phpunit/data/xmp/5.xmp16
-rw-r--r--tests/phpunit/data/xmp/6.result.php8
-rw-r--r--tests/phpunit/data/xmp/6.xmp18
-rw-r--r--tests/phpunit/data/xmp/7.result.php52
-rw-r--r--tests/phpunit/data/xmp/7.xmp67
-rw-r--r--tests/phpunit/data/xmp/README3
-rw-r--r--tests/phpunit/data/xmp/bag-for-seq.result.php10
-rw-r--r--tests/phpunit/data/xmp/bag-for-seq.xmp1
-rw-r--r--tests/phpunit/data/xmp/flash.result.php8
-rw-r--r--tests/phpunit/data/xmp/flash.xmp11
-rw-r--r--tests/phpunit/data/xmp/gps.result.php12
-rw-r--r--tests/phpunit/data/xmp/gps.xmp17
-rw-r--r--tests/phpunit/data/xmp/invalid-child-not-struct.result.php7
-rw-r--r--tests/phpunit/data/xmp/invalid-child-not-struct.xmp12
-rw-r--r--tests/phpunit/data/xmp/no-namespace.result.php7
-rw-r--r--tests/phpunit/data/xmp/no-namespace.xmp11
-rw-r--r--tests/phpunit/data/xmp/no-recognized-props.result.php2
-rw-r--r--tests/phpunit/data/xmp/no-recognized-props.xmp8
-rw-r--r--tests/phpunit/data/xmp/utf16BE.result.php12
-rw-r--r--tests/phpunit/data/xmp/utf16BE.xmpbin930 -> 0 bytes
-rw-r--r--tests/phpunit/data/xmp/utf16LE.result.php12
-rw-r--r--tests/phpunit/data/xmp/utf16LE.xmpbin930 -> 0 bytes
-rw-r--r--tests/phpunit/data/xmp/utf32BE.result.php12
-rw-r--r--tests/phpunit/data/xmp/utf32BE.xmpbin1856 -> 0 bytes
-rw-r--r--tests/phpunit/data/xmp/utf32LE.result.php12
-rw-r--r--tests/phpunit/data/xmp/utf32LE.xmpbin1856 -> 0 bytes
-rw-r--r--tests/phpunit/data/xmp/xmpExt.result.php8
-rw-r--r--tests/phpunit/data/xmp/xmpExt.xmp13
-rw-r--r--tests/phpunit/data/xmp/xmpExt2.xmp8
-rw-r--r--tests/phpunit/data/zip/cd-gap.zipbin182 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/cd-truncated.zipbin171 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/class-trailing-null.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/class-trailing-slash.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/class.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/empty.zipbin22 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/looks-like-zip64.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/nosig.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/split.zipbin196 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/trail.zipbin181 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/wrong-cd-start-disk.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/data/zip/wrong-central-entry-sig.zipbin173 -> 0 bytes
-rw-r--r--tests/phpunit/docs/ExportDemoTest.php36
-rw-r--r--tests/phpunit/includes/ArticleTablesTest.php33
-rw-r--r--tests/phpunit/includes/ArticleTest.php82
-rw-r--r--tests/phpunit/includes/BlockTest.php230
-rw-r--r--tests/phpunit/includes/CdbTest.php84
-rw-r--r--tests/phpunit/includes/DiffHistoryBlobTest.php40
-rw-r--r--tests/phpunit/includes/EditPageTest.php40
-rw-r--r--tests/phpunit/includes/ExternalStoreTest.php32
-rw-r--r--tests/phpunit/includes/ExtraParserTest.php169
-rw-r--r--tests/phpunit/includes/FauxResponseTest.php70
-rw-r--r--tests/phpunit/includes/FormOptionsInitializationTest.php85
-rw-r--r--tests/phpunit/includes/FormOptionsTest.php90
-rw-r--r--tests/phpunit/includes/GlobalFunctions/GlobalTest.php598
-rw-r--r--tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php29
-rw-r--r--tests/phpunit/includes/GlobalFunctions/README2
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php111
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php133
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php36
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php80
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php35
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php90
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php28
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php134
-rw-r--r--tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php120
-rw-r--r--tests/phpunit/includes/HooksTest.php102
-rw-r--r--tests/phpunit/includes/HtmlTest.php580
-rw-r--r--tests/phpunit/includes/HttpTest.php180
-rw-r--r--tests/phpunit/includes/IPTest.php542
-rw-r--r--tests/phpunit/includes/JsonTest.php33
-rw-r--r--tests/phpunit/includes/LanguageConverterTest.php130
-rw-r--r--tests/phpunit/includes/LicensesTest.php22
-rw-r--r--tests/phpunit/includes/LinksUpdateTest.php154
-rw-r--r--tests/phpunit/includes/LocalFileTest.php108
-rw-r--r--tests/phpunit/includes/LocalisationCacheTest.php31
-rw-r--r--tests/phpunit/includes/MWFunctionTest.php86
-rw-r--r--tests/phpunit/includes/MWNamespaceTest.php628
-rw-r--r--tests/phpunit/includes/MessageTest.php64
-rw-r--r--tests/phpunit/includes/ParserOptionsTest.php35
-rw-r--r--tests/phpunit/includes/PathRouterTest.php254
-rw-r--r--tests/phpunit/includes/PreferencesTest.php75
-rw-r--r--tests/phpunit/includes/Providers.php44
-rw-r--r--tests/phpunit/includes/RecentChangeTest.php273
-rw-r--r--tests/phpunit/includes/ResourceLoaderTest.php91
-rw-r--r--tests/phpunit/includes/RevisionStorageTest.php408
-rw-r--r--tests/phpunit/includes/RevisionTest.php125
-rw-r--r--tests/phpunit/includes/SampleTest.php98
-rw-r--r--tests/phpunit/includes/SanitizerTest.php162
-rw-r--r--tests/phpunit/includes/SanitizerValidateEmailTest.php79
-rw-r--r--tests/phpunit/includes/SeleniumConfigurationTest.php228
-rw-r--r--tests/phpunit/includes/SiteConfigurationTest.php311
-rw-r--r--tests/phpunit/includes/TemplateCategoriesTest.php36
-rw-r--r--tests/phpunit/includes/TestUser.php58
-rw-r--r--tests/phpunit/includes/TimeAdjustTest.php51
-rw-r--r--tests/phpunit/includes/TimestampTest.php72
-rw-r--r--tests/phpunit/includes/TitleMethodsTest.php201
-rw-r--r--tests/phpunit/includes/TitlePermissionTest.php660
-rw-r--r--tests/phpunit/includes/TitleTest.php155
-rw-r--r--tests/phpunit/includes/UserTest.php171
-rw-r--r--tests/phpunit/includes/WebRequestTest.php216
-rw-r--r--tests/phpunit/includes/WikiPageTest.php784
-rw-r--r--tests/phpunit/includes/XmlJsTest.php9
-rw-r--r--tests/phpunit/includes/XmlSelectTest.php139
-rw-r--r--tests/phpunit/includes/XmlTest.php342
-rw-r--r--tests/phpunit/includes/ZipDirectoryReaderTest.php79
-rw-r--r--tests/phpunit/includes/api/ApiBlockTest.php117
-rw-r--r--tests/phpunit/includes/api/ApiEditPageTest.php84
-rw-r--r--tests/phpunit/includes/api/ApiOptionsTest.php276
-rw-r--r--tests/phpunit/includes/api/ApiPurgeTest.php40
-rw-r--r--tests/phpunit/includes/api/ApiQueryTest.php68
-rw-r--r--tests/phpunit/includes/api/ApiTest.php280
-rw-r--r--tests/phpunit/includes/api/ApiTestCase.php187
-rw-r--r--tests/phpunit/includes/api/ApiTestCaseUpload.php148
-rw-r--r--tests/phpunit/includes/api/ApiUploadTest.php569
-rw-r--r--tests/phpunit/includes/api/ApiWatchTest.php176
-rw-r--r--tests/phpunit/includes/api/PrefixUniquenessTest.php24
-rw-r--r--tests/phpunit/includes/api/RandomImageGenerator.php463
-rw-r--r--tests/phpunit/includes/api/format/ApiFormatPhpTest.php19
-rw-r--r--tests/phpunit/includes/api/format/ApiFormatTestBase.php22
-rw-r--r--tests/phpunit/includes/api/generateRandomImages.php51
-rw-r--r--tests/phpunit/includes/api/words.txt1000
-rw-r--r--tests/phpunit/includes/cache/GenderCacheTest.php101
-rw-r--r--tests/phpunit/includes/cache/ProcessCacheLRUTest.php239
-rw-r--r--tests/phpunit/includes/db/DatabaseSQLTest.php147
-rw-r--r--tests/phpunit/includes/db/DatabaseSqliteTest.php326
-rw-r--r--tests/phpunit/includes/db/DatabaseTest.php215
-rw-r--r--tests/phpunit/includes/db/ORMRowTest.php234
-rw-r--r--tests/phpunit/includes/db/TestORMRowTest.php174
-rw-r--r--tests/phpunit/includes/debug/MWDebugTest.php68
-rw-r--r--tests/phpunit/includes/filerepo/FileBackendTest.php1868
-rw-r--r--tests/phpunit/includes/filerepo/FileRepoTest.php45
-rw-r--r--tests/phpunit/includes/filerepo/StoreBatchTest.php123
-rw-r--r--tests/phpunit/includes/installer/InstallDocFormatterTest.php64
-rw-r--r--tests/phpunit/includes/json/ServicesJsonTest.php93
-rw-r--r--tests/phpunit/includes/libs/CSSJanusTest.php560
-rw-r--r--tests/phpunit/includes/libs/CSSMinTest.php142
-rw-r--r--tests/phpunit/includes/libs/GenericArrayObjectTest.php245
-rw-r--r--tests/phpunit/includes/libs/IEUrlExtensionTest.php118
-rw-r--r--tests/phpunit/includes/libs/JavaScriptMinifierTest.php170
-rw-r--r--tests/phpunit/includes/media/BitmapMetadataHandlerTest.php146
-rw-r--r--tests/phpunit/includes/media/BitmapScalingTest.php151
-rw-r--r--tests/phpunit/includes/media/ExifBitmapTest.php100
-rw-r--r--tests/phpunit/includes/media/ExifRotationTest.php260
-rw-r--r--tests/phpunit/includes/media/ExifTest.php48
-rw-r--r--tests/phpunit/includes/media/FormatMetadataTest.php52
-rw-r--r--tests/phpunit/includes/media/GIFMetadataExtractorTest.php96
-rw-r--r--tests/phpunit/includes/media/GIFTest.php98
-rw-r--r--tests/phpunit/includes/media/IPTCTest.php55
-rw-r--r--tests/phpunit/includes/media/JpegMetadataExtractorTest.php94
-rw-r--r--tests/phpunit/includes/media/JpegTest.php31
-rw-r--r--tests/phpunit/includes/media/MediaHandlerTest.php50
-rw-r--r--tests/phpunit/includes/media/PNGMetadataExtractorTest.php141
-rw-r--r--tests/phpunit/includes/media/PNGTest.php100
-rw-r--r--tests/phpunit/includes/media/SVGMetadataExtractorTest.php108
-rw-r--r--tests/phpunit/includes/media/TiffTest.php35
-rw-r--r--tests/phpunit/includes/media/XMPTest.php158
-rw-r--r--tests/phpunit/includes/media/XMPValidateTest.php47
-rw-r--r--tests/phpunit/includes/mobile/DeviceDetectionTest.php40
-rw-r--r--tests/phpunit/includes/normal/CleanUpTest.php382
-rw-r--r--tests/phpunit/includes/parser/MagicVariableTest.php201
-rw-r--r--tests/phpunit/includes/parser/MediaWikiParserTest.php36
-rw-r--r--tests/phpunit/includes/parser/NewParserTest.php895
-rw-r--r--tests/phpunit/includes/parser/ParserMethodsTest.php33
-rw-r--r--tests/phpunit/includes/parser/ParserPreloadTest.php67
-rw-r--r--tests/phpunit/includes/parser/PreprocessorTest.php233
-rw-r--r--tests/phpunit/includes/parser/TagHooksTest.php77
-rw-r--r--tests/phpunit/includes/search/SearchEngineTest.php163
-rw-r--r--tests/phpunit/includes/search/SearchUpdateTest.php90
-rw-r--r--tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php79
-rw-r--r--tests/phpunit/includes/specials/SpecialRecentchangesTest.php132
-rw-r--r--tests/phpunit/includes/specials/SpecialSearchTest.php116
-rw-r--r--tests/phpunit/includes/upload/UploadFromUrlTest.php351
-rw-r--r--tests/phpunit/includes/upload/UploadStashTest.php77
-rw-r--r--tests/phpunit/includes/upload/UploadTest.php141
-rw-r--r--tests/phpunit/install-phpunit.sh36
-rw-r--r--tests/phpunit/languages/LanguageAmTest.php33
-rw-r--r--tests/phpunit/languages/LanguageArTest.php78
-rw-r--r--tests/phpunit/languages/LanguageBeTest.php40
-rw-r--r--tests/phpunit/languages/LanguageBe_taraskTest.php65
-rw-r--r--tests/phpunit/languages/LanguageBhTest.php34
-rw-r--r--tests/phpunit/languages/LanguageBsTest.php41
-rw-r--r--tests/phpunit/languages/LanguageCsTest.php40
-rw-r--r--tests/phpunit/languages/LanguageCuTest.php41
-rw-r--r--tests/phpunit/languages/LanguageCyTest.php42
-rw-r--r--tests/phpunit/languages/LanguageDsbTest.php40
-rw-r--r--tests/phpunit/languages/LanguageFrTest.php34
-rw-r--r--tests/phpunit/languages/LanguageGaTest.php34
-rw-r--r--tests/phpunit/languages/LanguageGdTest.php38
-rw-r--r--tests/phpunit/languages/LanguageGvTest.php39
-rw-r--r--tests/phpunit/languages/LanguageHeTest.php48
-rw-r--r--tests/phpunit/languages/LanguageHiTest.php34
-rw-r--r--tests/phpunit/languages/LanguageHrTest.php41
-rw-r--r--tests/phpunit/languages/LanguageHsbTest.php40
-rw-r--r--tests/phpunit/languages/LanguageHuTest.php34
-rw-r--r--tests/phpunit/languages/LanguageHyTest.php34
-rw-r--r--tests/phpunit/languages/LanguageKshTest.php34
-rw-r--r--tests/phpunit/languages/LanguageLnTest.php34
-rw-r--r--tests/phpunit/languages/LanguageLtTest.php53
-rw-r--r--tests/phpunit/languages/LanguageLvTest.php39
-rw-r--r--tests/phpunit/languages/LanguageMgTest.php35
-rw-r--r--tests/phpunit/languages/LanguageMkTest.php41
-rw-r--r--tests/phpunit/languages/LanguageMlTest.php43
-rw-r--r--tests/phpunit/languages/LanguageMoTest.php43
-rw-r--r--tests/phpunit/languages/LanguageMtTest.php72
-rw-r--r--tests/phpunit/languages/LanguageNlTest.php28
-rw-r--r--tests/phpunit/languages/LanguageNsoTest.php32
-rw-r--r--tests/phpunit/languages/LanguagePlTest.php72
-rw-r--r--tests/phpunit/languages/LanguageRoTest.php43
-rw-r--r--tests/phpunit/languages/LanguageRuTest.php54
-rw-r--r--tests/phpunit/languages/LanguageSeTest.php48
-rw-r--r--tests/phpunit/languages/LanguageSgsTest.php66
-rw-r--r--tests/phpunit/languages/LanguageShTest.php32
-rw-r--r--tests/phpunit/languages/LanguageSkTest.php40
-rw-r--r--tests/phpunit/languages/LanguageSlTest.php42
-rw-r--r--tests/phpunit/languages/LanguageSmaTest.php48
-rw-r--r--tests/phpunit/languages/LanguageSrTest.php223
-rw-r--r--tests/phpunit/languages/LanguageTest.php1069
-rw-r--r--tests/phpunit/languages/LanguageTiTest.php32
-rw-r--r--tests/phpunit/languages/LanguageTlTest.php32
-rw-r--r--tests/phpunit/languages/LanguageTrTest.php68
-rw-r--r--tests/phpunit/languages/LanguageUkTest.php54
-rw-r--r--tests/phpunit/languages/LanguageUzTest.php120
-rw-r--r--tests/phpunit/languages/LanguageWaTest.php32
-rw-r--r--tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php95
-rw-r--r--tests/phpunit/maintenance/DumpTestCase.php352
-rw-r--r--tests/phpunit/maintenance/MaintenanceTest.php812
-rw-r--r--tests/phpunit/maintenance/backupPrefetchTest.php270
-rw-r--r--tests/phpunit/maintenance/backupTextPassTest.php563
-rw-r--r--tests/phpunit/maintenance/backup_LogTest.php227
-rw-r--r--tests/phpunit/maintenance/backup_PageTest.php389
-rw-r--r--tests/phpunit/maintenance/fetchTextTest.php243
-rw-r--r--tests/phpunit/maintenance/getSlaveServerTest.php69
-rw-r--r--tests/phpunit/phpunit.php107
-rw-r--r--tests/phpunit/run-tests.bat1
-rw-r--r--tests/phpunit/skins/SideBarTest.php209
-rw-r--r--tests/phpunit/suite.xml49
-rw-r--r--tests/phpunit/suites/ExtensionsTestSuite.php33
-rw-r--r--tests/phpunit/suites/UploadFromUrlTestSuite.php204
-rw-r--r--tests/qunit/.htaccess1
-rw-r--r--tests/qunit/QUnitTestResources.php63
-rw-r--r--tests/qunit/data/callMwLoaderTestCallback.js1
-rw-r--r--tests/qunit/data/load.mock.php58
-rw-r--r--tests/qunit/data/qunitOkCall.js2
-rw-r--r--tests/qunit/data/styleTest.css.php61
-rw-r--r--tests/qunit/data/testrunner.js266
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js52
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.byteLength.test.js33
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js234
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.client.test.js317
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js58
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js35
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js11
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.highlightText.test.js232
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.localize.test.js133
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js58
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js33
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js697
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.textSelection.test.js275
-rw-r--r--tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js26
-rw-r--r--tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js59
-rw-r--r--tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js62
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js200
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js388
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js74
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js97
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js62
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js394
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.test.js649
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js56
-rw-r--r--tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js288
-rw-r--r--tests/selenium/Selenium.php190
-rw-r--r--tests/selenium/SeleniumConfig.php79
-rw-r--r--tests/selenium/SeleniumLoader.php9
-rw-r--r--tests/selenium/SeleniumServerManager.php239
-rw-r--r--tests/selenium/SeleniumTestCase.php127
-rw-r--r--tests/selenium/SeleniumTestConsoleLogger.php25
-rw-r--r--tests/selenium/SeleniumTestConstants.php24
-rw-r--r--tests/selenium/SeleniumTestHTMLLogger.php36
-rw-r--r--tests/selenium/SeleniumTestListener.php68
-rw-r--r--tests/selenium/SeleniumTestSuite.php57
-rw-r--r--tests/selenium/data/SimpleSeleniumTestDB.sql1453
-rw-r--r--tests/selenium/data/SimpleSeleniumTestImages.zipbin21993 -> 0 bytes
-rw-r--r--tests/selenium/data/Wikipedia-logo-v2-de.pngbin21479 -> 0 bytes
-rw-r--r--tests/selenium/data/mediawiki118_fresh_installation.sql1543
-rw-r--r--tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php102
-rw-r--r--tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php82
-rw-r--r--tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php95
-rw-r--r--tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php136
-rw-r--r--tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php132
-rw-r--r--tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php140
-rw-r--r--tests/selenium/installer/MediaWikiInstallationCommonFunction.php283
-rw-r--r--tests/selenium/installer/MediaWikiInstallationConfig.php49
-rw-r--r--tests/selenium/installer/MediaWikiInstallationMessage.php57
-rw-r--r--tests/selenium/installer/MediaWikiInstallationVariables.php77
-rw-r--r--tests/selenium/installer/MediaWikiInstallerTestSuite.php53
-rw-r--r--tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php78
-rw-r--r--tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php79
-rw-r--r--tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php71
-rw-r--r--tests/selenium/installer/MediaWikiRestartInstallationTestCase.php115
-rw-r--r--tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php93
-rw-r--r--tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php117
-rw-r--r--tests/selenium/installer/MediaWikiUserInterfaceTestCase.php531
-rw-r--r--tests/selenium/installer/README.txt32
-rw-r--r--tests/selenium/selenium_settings.ini.sample32
-rw-r--r--tests/selenium/selenium_settings_grid.ini.sample16
-rw-r--r--tests/selenium/suites/AddContentToNewPageTestCase.php182
-rw-r--r--tests/selenium/suites/AddNewPageTestCase.php65
-rw-r--r--tests/selenium/suites/CreateAccountTestCase.php114
-rw-r--r--tests/selenium/suites/DeletePageAdminTestCase.php89
-rw-r--r--tests/selenium/suites/EmailPasswordTestCase.php81
-rw-r--r--tests/selenium/suites/MediaWikiEditorConfig.php48
-rw-r--r--tests/selenium/suites/MediaWikiEditorTestSuite.php18
-rw-r--r--tests/selenium/suites/MediaWikiExtraTestSuite.php20
-rw-r--r--tests/selenium/suites/MediawikiCoreSmokeTestCase.php69
-rw-r--r--tests/selenium/suites/MediawikiCoreSmokeTestSuite.php19
-rw-r--r--tests/selenium/suites/MovePageTestCase.php117
-rw-r--r--tests/selenium/suites/MyContributionsTestCase.php65
-rw-r--r--tests/selenium/suites/MyWatchListTestCase.php57
-rw-r--r--tests/selenium/suites/PageDeleteTestSuite.php16
-rw-r--r--tests/selenium/suites/PageSearchTestCase.php105
-rw-r--r--tests/selenium/suites/PreviewPageTestCase.php53
-rw-r--r--tests/selenium/suites/SavePageTestCase.php58
-rw-r--r--tests/selenium/suites/SimpleSeleniumConfig.php30
-rw-r--r--tests/selenium/suites/SimpleSeleniumTestCase.php39
-rw-r--r--tests/selenium/suites/SimpleSeleniumTestSuite.php26
-rw-r--r--tests/selenium/suites/UserPreferencesTestCase.php179
-rw-r--r--tests/testHelpers.inc582
-rw-r--r--thumb.php185
-rw-r--r--thumb.php54
-rw-r--r--thumb_handler.php52
2400 files changed, 208725 insertions, 130686 deletions
diff --git a/.gitreview b/.gitreview
deleted file mode 100644
index ebac82cb..00000000
--- a/.gitreview
+++ /dev/null
@@ -1,6 +0,0 @@
-[gerrit]
-host=gerrit.wikimedia.org
-port=29418
-project=mediawiki/core.git
-defaultbranch=REL1_20
-defaultrebase=0
diff --git a/.jshintignore b/.jshintignore
deleted file mode 100644
index 2f44f870..00000000
--- a/.jshintignore
+++ /dev/null
@@ -1,28 +0,0 @@
-# third-party libs
-extensions/
-node_modules/
-resources/jquery/jquery.appear.js
-resources/jquery/jquery.async.js
-resources/jquery/jquery.cycle.all.js
-resources/jquery/jquery.cookie.js
-resources/jquery/jquery.farbtastic.js
-resources/jquery/jquery.form.js
-resources/jquery/jquery.hoverIntent.js
-resources/jquery/jquery.js
-resources/jquery/jquery.json.js
-resources/jquery/jquery.jStorage.js
-resources/jquery/jquery.mockjax.js
-resources/jquery/jquery.qunit.js
-resources/jquery/jquery.validate.js
-resources/jquery/jquery.xmldom.js
-resources/jquery.effects/
-resources/jquery.tipsy/
-resources/jquery.ui/
-resources/mediawiki.libs/
-tests/jasmine/
-
-# legacy scripts
-skins/common/
-
-# github.com/jshint/jshint/issues/729
-tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
diff --git a/.jshintrc b/.jshintrc
deleted file mode 100644
index 31dc9a0c..00000000
--- a/.jshintrc
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "predef": [
- "mediaWiki",
- "jQuery",
- "QUnit",
- "mw",
- "$"
- ],
-
- "bitwise": true,
- "immed": true,
- "latedef": true,
- "newcap": true,
- "noarg": true,
- "nonew": true,
- "undef": true,
-
- "laxbreak": true,
- "loopfunc": true,
- "smarttabs": true,
- "multistr": true,
- "onecase": true,
-
- "browser": true
-}
diff --git a/CREDITS b/CREDITS
index 5ceccc53..9c49a9b4 100644
--- a/CREDITS
+++ b/CREDITS
@@ -1,10 +1,12 @@
-MediaWiki 1.20 is a collaborative project released under the
+MediaWiki 1.21 is a collaborative project released under the
GNU General Public License v2. We would like to recognize the
following names for their contribution to the product.
+<!-- Please notice that the following can be found parsed under Special:Version/Credits -->
== Developers ==
* Aaron Schulz
* Alex Z.
+* Alexander Monk
* Alexandre Emsenhuber
* Andrew Garrett
* Arthur Richards
@@ -25,7 +27,7 @@ following names for their contribution to the product.
* Derk-Jan Hartman
* Domas Mituzas
* Emufarmers
-* Fran McCrory
+* Fran Rogers
* Greg Sabino Mullane
* Guy Van den Broeck
* Happy-melon
@@ -40,10 +42,12 @@ following names for their contribution to the product.
* John Du Hart
* Jon Harald Søby
* Juliano F. Ravasi
+* Ryan Kaldari
* Leo Koppelkamm
* Leon Weber
* Leslie Hoare
* Marco Schuster
+* Marius Hoch
* Matěj Grabovský
* Matt Johnston
* Max Semenik
@@ -54,6 +58,8 @@ following names for their contribution to the product.
* Neil Kandalgaonkar
* Nicolas Dumazet
* Niklas Laxström
+* Ori Livneh
+* Patrick Reilly
* Philip Tzou
* Platonides
* Purodha Blissenbach
@@ -70,6 +76,7 @@ following names for their contribution to the product.
* Siebrand Mazeland
* SQL
* Soxred93
+* Szymon Åšwierkosz
* Thomas Bleher
* Tim Starling
* Timo Tijhof
@@ -80,6 +87,8 @@ following names for their contribution to the product.
* Yuri Astrakhan
== Patch Contributors ==
+* Aaron Pramana
+* Aaron Ball
* Agbad
* Ahmad Sherif
* Alejandro Mery
@@ -90,7 +99,9 @@ following names for their contribution to the product.
* Asier Lostalé
* Azliq7
* Bagariavivek
+* Bartosz Dziewoński
* Beau
+* Benny Situ
* Bergi
* Borislav Manolov
* Brad Jorsch
@@ -98,6 +109,7 @@ following names for their contribution to the product.
* Brianna Laugher
* Carlin
* Carsten Nielsen
+* Chris Steipp
* Christian Neubauer
* Christian Aistleitner
* Conrad Irwin
@@ -106,28 +118,36 @@ following names for their contribution to the product.
* Dan Collins
* Dan Nessett
* Daniel Arnold
+* Daniel Werner
* David Baumgarten
* Denny Vrandecic
+* Dévai Tamás
* Edward Z. Yang
* Elvis Stansvik
* Erwin Dokter
+* Federico Leva
* FunPika
* fomafix
+* Gabriel Wicke
* Gero Scholz
* Gilles van den Hoven
* Grunny
* Harry Burt
* Ireas
* Jacob Block
+* Jan Gerber
+* Jan Luca Naumann
* Jaska Zedlik
* Jeremy Baron
* Jidanni
* Jimmy Xu
* Jonathan Wiltshire
* John N
+* Jure Kajzer
* Karun Dambiec
+* Katie Filbert
+* Kevin Israel
* Kim Hyun-Joon
-* Krenair
* Lee Worden
* Lejonel
* liangent
@@ -135,12 +155,16 @@ following names for their contribution to the product.
* Lucas Garczewski
* Luigi Corsaro
* Lupo
+* Madman
* Manuel Menal
* Marcin Cieślak
* Marcus Buck
* Mark A. Pelletier
+* Mark Hershberger
+* Mark Holmquist
* Marooned
* Mathias Ertl
+* Matthias Mullie
* Matthew Britton
* mati
* Max
@@ -168,32 +192,42 @@ following names for their contribution to the product.
* Nischay Nahata
* Olaf Lenz
* Olivier Finlay Beaton
+* Patricio Molina
* Paul Copperman
* Paul Oranje
+* Peter Gehres
+* Petr Onderka
* PieRRoMaN
* quietust
* René Kijewski
* rgcjonas
+* Rob Moen
* Robert Treat
* RockMFR
* Russell Blau
* Rusty Burchfield
+* S Page
* Salvatore Ingala
+* Santhosh Thottingal
* Scott Colcord
+* Sébastien Santoro
* Simon Walker
* Solitarius
* Søren Løvborg
* Srikanth Lakshmanan
* Stefano Codari
* Str4nd
+* Subramanya Sastry
* svip
* The Evil IP address
* Tim Landscheidt
* Tisane
+* Tyler Anthony Romeo
* Umherirrender
* Van de Bugger
* Ville Stadista
* Vitaliy Filippov
+* Waldir Pimenta
* William Demchick
* Yusuke Matsubara
* Yuvaraj Pandian T
@@ -206,4 +240,4 @@ following names for their contribution to the product.
* Meno25
* Rotem Liss
* Shinjiman
-* Translatewiki.net Translators https://translatewiki.net/wiki/Special:ListUsers/translator
+* [https://translatewiki.net/wiki/Special:ListUsers/translator Translatewiki.net Translators]
diff --git a/HISTORY b/HISTORY
index 408ae384..02ba8d89 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,10 +1,815 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.20.
+Change notes from older releases. For current info see RELEASE-NOTES-1.21.
+
+== MediaWiki 1.20 ==
+
+=== PHP 5.3 now required ===
+Since 1.20, the lowest supported version of PHP is now 5.3.2. Please
+upgrade PHP if you have not done so prior to upgrading MediaWiki.
+
+=== Configuration changes in 1.20 ===
+* $wgGitRepositoryViewers defines a mapping from Git remote repository to the
+ Gitweb instance URL used in Special:Version.
+* `$wgUsePathInfo = true;` is no longer needed to make $wgArticlePath work on servers
+ using like nginx, lighttpd, and apache over fastcgi. MediaWiki now always extracts
+ path info from REQUEST_URI if it's available.
+* The user right 'upload_by_url' is no longer given to sysops by default.
+ This only affects installations which have $wgAllowCopyUploads set to true.
+* Removed f-prot support from $wgAntivirusSetup.
+* New variable $wgDBerrorLogTZ to provide dates in the error log in a
+ different timezone than the wiki timezone set by $wgLocaltimezone.
+* New variables $wgDBssl and $wgDBcompress to enable SSL and compression for database
+ connections, if either are available for the selected DB type.
+* $wgUseCombinedLoginLink now defaults to false, making MediaWiki output separate
+ login and create account links by default.
+
+=== New features in 1.20 ===
+* Added TitleIsAlwaysKnown hook which gets called when determining if a page exists.
+* Added NamespaceIsMovable hook which gets called when determining if pages in a
+ certain namespace can be moved.
+* Added SpecialPageBeforeExecute hook which gets called before SpecialPage::execute.
+* Added SpecialPageAfterExecute hook which gets called after SpecialPage::execute.
+* Added ORMTable, ORMRow and ORMResult classes for additional abstraction of
+ database interaction.
+* Added CacheHelper and associated SpecialCachedPage and CachedAction helper classes.
+* (bug 32341) Add upload by URL domain limitation.
+* &useskin=default will now always display the default skin. Useful for users with a
+ preference for the non-default skin to look at something using the default skin.
+* (bug 27619) Remove preference option to display broken links as link?
+* (bug 34896) jQuery JSON plugin upgraded to v2.3 (2011-09-17).
+* (bug 34302) Add CSS classes to email fields in user preferences.
+* Introduced $wgDebugDBTransactions to trace transaction status (currently PostgreSQL only).
+* (bug 23795) Add parser itself to ParserMakeImageParams hook.
+* Introduce a cryptographic random number generator source api for use when
+ generating various tokens.
+* (bug 30963) Option on Special:Prefixindex and Special:Allpages to not show redirects.
+* (bug 18062) New message when edit or create the local page of a shared file.
+* (bug 22870) Separate interface message when creating a page.
+* (bug 17615) nosummary option should be reassigned on preview/captcha.
+* (bug 34355) Add a variable and parser function for the namespace number.
+* (bug 35649) Special:Version now shows hashes of extensions checked out from git.
+* (bug 35728) Git revisions are now linked on Special:Version.
+* "Show Changes" on default messages shows now diff against default message text
+* (bug 23006) create #speciale parser function.
+* generateSitemap can now optionally skip redirect pages.
+* (bug 27757) New API command just for retrieving tokens (not page-based).
+* Added GitViewers hook for extensions using external git repositories to have a web-based
+ repository viewer linked to from Special:Version.
+* Memcached debug logs can now be sent to their own file logs by setting
+ $wgDebugLogFile['memcached'] to some filepath.
+* (bug 35685) api.php URL and other entry point URLs are now listed on
+ Special:Version
+* Edit notices can now be translated.
+* jQuery upgraded to 1.8.2.
+* jQuery UI upgraded to 1.8.23.
+* QUnit upgraded from v1.2.0 to v1.10.0.
+* (bug 37604) jquery.cookie upgraded to 2011 version.
+* (bug 22887) Add warning and tracking category for preprocessor errors
+* (bug 31704) Allow selection of associated namespace on the watchlist
+* (bug 5445) Now remove autoblocks when a user is unblocked.
+* Added $wgLogExceptionBacktrace, on by default, to allow logging of exception
+ backtraces.
+* Added device detection for determining device capabilities.
+* QUnit.newMwEnvironment now supports passing a custom setup and/or teardown function.
+ Arguments signature has changed. First arguments is now an options object of which
+ 'config' can be a property. Previously 'config' itself was the first and only argument.
+* New getCreator and getOldestRevision methods added to WikiPage class
+* (bug 4220) the XML dump format schema now have unique identity constraints
+ for page and revision identifiers. Patch by Elvis Stansvik.
+* cleanupSpam.php now can delete spam pages if --delete was specified instead of blanking
+ them.
+* Added new hook ChangePasswordForm to allow adding of additional fields in Special:ChangePassword
+* Added new function getDomain to AuthPlugin for getting a user's domain
+* (bug 23427) New magic word {{PAGEID}} which gives the current page ID.
+ Will be null on previewing a page being created.
+* (bug 37627) UserNotLoggedIn() exception to show a generic error page whenever
+ a user is not logged in.
+* Watched status in changes lists are no longer indicated by <strong></strong>
+ tags with class "mw-watched". Instead, each line now has a class
+ "mw-changeslist-line-watched" or "mw-changeslist-line-not-watched", and the
+ title itself is surrounded by <span></span> tags with class "mw-title".
+* Added ContribsPager::reallyDoQuery hook allowing extensions to data to MyContribs
+* Added new hook ParserAfterParse to allow extensions to affect parsed output
+ after the parse is complete but before block level processing, link holder
+ replacement, and so on.
+* (bug 34678) Added InternalParseBeforeSanitize hook which gets called during Parser's
+ internalParse method just before the parser removes unwanted/dangerous HTML tags.
+* Added new hook AfterFinalPageOutput to allow modifications to buffered page output before sent
+ to the client.
+* (bug 36783) Implement jQuery Promise interface in mediawiki.api module.
+* Make dates in sortable tables sort according to the page content language
+ instead of the site content language
+* (bug 37926) Deleterevision will no longer allow users to delete log entries,
+ the new deletelogentry permission is required for this.
+* (bug 14237) Allow PAGESINCATEGORY to distinguish between 'all', 'pages', 'files'
+ and 'subcats'
+* (bug 38362) Make Special:Listuser includeable on wiki pages.
+* Added support in jquery.localize for placeholder attributes.
+* (bug 38151) Implemented mw.user.getRights for getting and caching the current
+ user's user rights.
+* Session storage can now configured independently of general object cache
+ storage, by using $wgSessionCacheType. $wgSessionsInMemcached has been
+ renamed to $wgSessionsInObjectCache, with the old name retained for backwards
+ compatibility. When this feature is enabled, the expiry time can now be
+ configured with $wgObjectCacheSessionExpiry.
+* Added a Redis client for object caching.
+* Implemented mw.user.getGroups for getting and caching user groups.
+* (bug 37830) Added $wgRequirePasswordforEmailChange to control whether password
+ confirmation is required for changing an email address or not.
+* HTMLForm mutators can now be chained (they return $this)
+* A new message, "api-error-filetype-banned-type", is available for formatting
+ API upload errors due to the file extension blacklist.
+* New hook 'ParserTestGlobals' allows to set globals before running parser tests.
+* Allow importing pages as subpage.
+* Add lang and hreflang attributes to language links on Login page.
+* (bug 22749) Create Special:MostInterwikis.
+* Show change tags when transclude Special:Recentchanges(linked) or Special:Newpages.
+* (bug 23226) Add |class= parameter to image links in order to add class(es) to HTML img tag.
+* (bug 39431) SVG animated status is now shown in long description.
+* (bug 39376) jquery.form upgraded to 3.14.
+* SVG files will now show the actual width in the SVG's specified units
+ in the metadata box.
+* Added ResourceLoader module "jquery.jStorage" (v0.3.0, http://jStorage.info/).
+* (bug 39273) Added AJAX support for "Show changes" (diff) in LivePreview.
+* Added ResourceLoader module "jquery.badge".
+* mw.util.$content now points to the overall content area in the skin rather than just
+ page text content area. If you need the old behavior please use $( '#mw-content-text').
+* jsMessage has been replaced with a floating bubble notification system complete
+ with auto-hide, multi-message support, and message replacement tags.
+* jquery.messageBox which appears to be unused by both core and extensions has
+ been removed.
+* (bug 34939) Made link parsing insensitive ([HttP://]).
+* (bug 40072) Add CSS classes to items in output of ChangesList pages.
+* Added $wgCopyUploadProxy global to define which proxy to use for copy
+ uploads.
+* (bug 40448) mediawiki.legacy.mwsuggest has been replaced with a new module,
+ mediawiki.searchSuggest, based on SimpleSeach from Extension:Vector.
+
+=== Known issues in 1.20.0 ===
+These are issues that we're targeting to be fixed in a later release
+in the 1.20 series. Issues may be added or removed from this list as
+we see fit. For now, it is comprised of those bugs on the 1.20.0
+milestone in Bugzilla.
+
+* (bug 35894): Reports of secret key generation "hanging" on windows
+ This is probably a bug that has been fixed in PHP. If you run
+ into this, try upgrading your PHP.
+* (bug 38334): PHP Notice: Undefined index: href in /www/w/skins/Vector.php on line 416
+ We think this is a problem in some extension. If you see this,
+ try disabling your extensions and check out the logging patch on
+ this bug. Or try this patch:
+ <https://gerrit.wikimedia.org/r/#/c/27937/1/skins/Vector.php>
+* (bug 39268): [Regression] Toolbar inserts in main textarea only (instead of the focussed textarea)
+ This should only be an issue if you are using the ProofreadPage
+ extension.
+* (bug 40641): Clicking "others" in Special:Version asks to download a file
+ If you encounter this, you can tell your webserver to serve the
+ CREDITS file with text/plain MIME type to fix it.
+
+=== Bug fixes in 1.20 ===
+* (bug 40939): [Regression] InfoAction: Call to a member function getUserText() on a non-object
+* (bug 40780): searchsuggest-containing line ("containing...") doesn't include the entered text
+* (bug 37714): [Regression] Incomplete log entries
+* (bug 27202): API: Add timestamp sort to list=allimages
+* (bug 30245) Use the correct way to construct a log page title.
+* (bug 34237) Regenerate an empty user_token and save to the database
+ when we try to set the user's cookies for login.
+* (bug 32210) New edit emails for watched pages always provide a link to the
+ edit which triggered the mail.
+* (bug 12021) Added user talk link on Special:Listusers.
+* (bug 34445) section edit and TOC hide/show links are excluded from selection and
+ copy/paste on supporting browsers.
+* (bug 34428) Fixed incorrect hash mismatch errors in the DiffHistoryBlob
+ history compression method.
+* (bug 34702) Localised parentheses are now used in more special pages.
+* (bug 34723) When editing a script page on a RTL wiki the textbox should be LTR.
+* (bug 34762) Calling close() on a DatabaseBase object now clears the connection.
+* (bug 34863) Show deletion log extract on non-existent file pages if applicable.
+* (bug 28019) Let ?preloadtitle=foo be passed on to target of
+ Special:MyPage and Special:MyTalk.
+* (bug 34929) Show the correct diff when a section edit is rejected by the spam
+ filter.
+* (bug 15816) Add a switch for SETting the search_path (Postgres).
+* (bug 34521) Returning to the previous page after logging in loses any array-
+ valued parameters in the query string.
+* (bug 34735) Updated compressOld.php documentation to mention the different
+ usages of -s and -n parameters depending on compression type.
+* (bug 13896) Rendering of devanagari numbers in automatic '#' number lists.
+* (bug 33689) Upgrade to 1.19 on Postgres fails due to incomplete query when.
+ trying to defer foreign key for externallinks.
+* (bug 32748) Printer friendly version of article decode Unicode chars as a
+ pretty IRI in footer.
+* Removed white border around thumbnails in galleries.
+* (bug 31236) "Next" and "Previous" buttons are shown incorrectly in
+ an RTL environment.
+* (bug 35749) Updated maintenance/checkSyntax.php to use Git instead of
+ Subversion when invoked with the --modified option.
+* (bug 35069) On history pages, the " . . " separator after the number of
+ characters changed in a revision is now suppressed if no text would follow.
+* (bug 18704) Add a unique CSS class or ID to the tagfilter table row at RecentChanges
+* (bug 33564) transwiki import sometimes result in invalid title.
+* (bug 35572) Blocks appear to succeed even if query fails due to wrong DB structure
+* (bug 31757) Add a word-separator between help-messages in HTMLForm
+* (bug 30410) Removed deprecated $wgFilterCallback and the 'filtered' API error.
+* (bug 32604) Some messages needs escaping of wikitext inside username.
+* (bug 36537) Rename wfArrayToCGI to wfArrayToCgi for consistency with wfCgiToArray.
+* (bug 25946) The message on the top of Special:RecentChanges is now displayed.
+ in user language instead of content language.
+* (bug 35264) Wrong type used for <ns> in export.xsd
+* (bug 24985) Use $wgTmpDirectory as the default temp directory so that people
+ who don't have access to /tmp can specify an alternative.
+* (bug 27283) SqlBagOStuff breaks PostgreSQL transactions.
+* (bug 35727) mw.Api ajax() should put token parameter last.
+* (bug 37708) mw.Uri.clone() should make a deep copy.
+* (bug 38024) ResourceLoader should not create empty stylesheets for modules
+ that don't have stylesheets.
+* (bug 36812) Special:ActiveUsers "Hide bots" should hide users from any group
+ having the "bot" user right, instead of just the default "bot" user group.
+* (bug 35082) mw.util.addPortletLink incorrectly adds link to mutiple <ul> tags.
+* (bug 36991) jquery.tablesorter should extract date sort format from date
+ string instead of global config. Dates like "April 1 2012" and "1 April 2012"
+ now sort correctly regardless of the content language's DefaultDateFormat.
+* (bug 31895) mw.loader mode now correct when triggered from a $.fn.ready
+ handler that is bound before mediawiki.js's handler (e.g. browser-userscripts
+ like greasemonkey).
+* (bug 38152) jquery.tablesorter: Use .data() instead of .attr(), so that live
+ values are used instead of just the fixed values from when the tablesorter
+ was initialized.
+* (bug 38093) Gender of changed user groups missing in Special:Log/rights
+* (bug 35893) Special:Block needs to load mediawiki.special.block.js.
+* (bug 37331) ResourceLoader modules sometimes execute twice in Firefox
+* (bug 31644) GlobalUsage, CentralAuth and AbuseLog extensions should not use
+ insecure links to foreign wikis in the WikiMap.
+* (bug 36073) Avoid duplicate element IDs on File pages.
+* (bug 25095) Special:Categories should also include the first relevant item
+ when "from" is filled.
+* (bug 35526) jquery.tablesorter now uses a stable sort.
+* (bug 38953) --memory-limit switch not working for runJobs.php.
+* (bug 33037) Make subpage of Special:newfiles control how many files
+ are returned, like in previous versions.
+* (bug 36524) "Show" options on Special:RecentChanges and Special:RecentChangesLinked
+ are now remembered between successive clicks.
+* (bug 26069) Page title is no longer "Error" for all error pages.
+* (bug 39297) Show warning if thumbnail of animated image will not be animated.
+* (bug 38249) Parser will throw an exception instead of outputting gibberish if
+ PCRE is compiled without support for unicode properties.
+* (bug 30390) Suggested file name on Special:Upload should not contain
+ illegal characters.
+* EXIF below sea level GPS altitude data is now shown correctly.
+* (bug 39284) jquery.tablesorter should not consider "."" or "?"" to be a currency.
+* (bug 39273) "Show changes" should not be incorrectly displayed in the Live Preview state.
+* Made body-content lang attribute honor the variant language when it is set.
+* (bug 36761) "Mark pages as visited" now submits previously established filter options.
+* (bug 39635) PostgreSQL LOCK IN SHARE MODE option is a syntax error.
+* (bug 36329) Accesskey tooltips for Firefox 14 on Mac should use "ctrl-option-" prefix.
+* (bug 32552) Drop unused database field cat_hidden from table category.
+* (bug 24502) Do not allow multiple language links to the same language.
+* (bug 40214) Category pages no longer use deprecated "width" HTML attribute.
+* (bug 39941) Add missing stylesheets to the installer pages
+* In HTML5 mode, allow new input element types values (such as color, range..)
+* (bug 36151) mw.Title: Don't limit extension in title parsing.
+* (bug 38158) jquery.byteLimit sometimes causes an unexpected 0 maxLength being enforced.
+* (bug 38163) jquery.byteLimit incorrectly limits input when using methods other than
+ basic per-char typing.
+* (bug 34495) patrol log now credit the user patrolling (instead of patrolled
+ user).
+* (bug 31676) ResourceLoader should work around IE stylesheet limit.
+* (bug 40498) ResourceLoader should not output an empty "@media print { }" block.
+* (bug 40500) ResourceLoader should not ignore media-type for urls in debug mode.
+* (bug 40660) ResourceLoaderWikiModule should not convert "&nbsp;" to a space
+ for pages from the MediaWiki-namespace.
+* (bug 40329) (bug 40632) Removed CleanupPresentationalAttributes feature.
+
+=== API changes in 1.20 ===
+* (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
+* (bug 34313) MediaWiki API intro message about "HTML format" should mention
+ the format parameter.
+* (bug 32384) Allow descending order for list=watchlistraw.
+* (bug 31883) Limit of bkusers of list=blocks and titles of action=query is
+ not documented in API help.
+* (bug 32492) API now allows editing using pageid.
+* (bug 32497) API now allows changing of protection level using pageid.
+* (bug 32498) API now allows comparing pages using pageids.
+* (bug 30975) API import of pages with invalid characters in this wiki leads to Fatal Error.
+* (bug 30488) API now allows listing of backlinks/embeddedin/imageusage per pageid.
+* (bug 34927) Output media_type for list=filearchive.
+* (bug 28814) add properties to output of action=parse.
+* (bug 33224) add variants of content language to meta=siteinfo.
+* (bug 32643) action=purge with forcelinkupdate no longer crashes when ratelimit is reached.
+* The paraminfo module now also contains result properties for most modules.
+* (bug 32348) Allow descending order for list=alllinks.
+* (bug 31777) Upload unknown error ``fileexists-forbidden''.
+* (bug 32382) Allow descending order for list=iwbacklinks.
+* (bug 32381) Allow descending order for list=backlinks, list=embeddedin and list=imageusage.
+* (bug 32383) Allow descending order for list=langbacklinks.
+* API meta=siteinfo can now return the list of known variable IDs.
+* (bug 35980) list=deletedrevs now honors drdir correctly in "all" mode (mode #3).
+* (bug 29290) API avoids mangling fields in continuation parameters
+* (bug 36987) API avoids mangling fields in continuation parameters
+* (bug 30836) siteinfo prop=specialpagealiases will no longer return nonexistent special pages
+* (bug 38190) Add "required" flag to some token params for hint in api docs.
+* (bug 27567) Add file repo support to prop=duplicatefiles.
+* (bug 27610) Add archivename for non-latest image version to list=filearchive
+* (bug 38231) Add xml parse tree to action=parse.
+* Watchlist notification timestamp may be queried by page and may be updated via the API.
+* (bug 38904) prop=revisions&rvstart=... no longer blows up when continuing.
+* (bug 39032) ApiQuery generates help in constructor.
+* (bug 11142) Improve file extension blacklist error reporting in API upload.
+* (bug 39665) List of query generators is now not built using reflection, instead it is
+ defined in code.
+* (bug 35993) Deprecated gettoken parameter - support will be removed in 1.22.
+
+=== Languages updated in 1.20 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+* Emilian (egl) added.
+* Tornedalen Finnish (fit) added.
+* Mizo (lus) added.
+* Santali (sat) added.
+* (bug 34192) Namespace gender aliases for Albanian languages (sq & aln).
+* (bug 35541) Namespace gender aliases for Croatian (hr).
+* (bug 36012) Space in $separatorTransformTable should be non-breaking in
+ Portuguese, Esperanto and Udmurt.
+* Turoyo (tru) added.
+* Cyrillic-Latin language converter added for Uzbek (uz).
+
+=== Other changes in 1.20 ===
+* The user_token field is now left empty until a user attempts to login and
+ cookies need to be set. It is also now possible to reset every user's
+ user_token simply by clearing the values in the user_token column.
+* Removed ./tests/qunit/index.html from core. It wasn't actively maintained and
+ has been made obsolete when [[Special:JavaScriptTest/qunit]] was introduced,
+ which actually uses ResourceLoader, LocalSettings and the Skin.
+* Removed $wgDBtransactions global. This was only checked in one class
+ and only applies to MyISAM or similar DBs. Those should only be used
+ for archived sites anyway. We can't get edit conflicts on such sites,
+ so the WikiPage code wasn't useful there either.
+* Deprecated mw.user.name in favour of mw.user.getName.
+* Deprecated mw.user.anonymous in favour of mw.user.isAnon.
+* Deprecated DatabaseBase functions newFromParams(), newFromType(), set(),
+ quote_ident(), and escapeLike() were removed.
+* Use of __DIR__ instead of dirname( __FILE__ ).
+* OutputPage::wrapWikiMsg() no longer supports the 'options' parameter. It was
+ not used and complicated migration to Message class.
+* Live preview functionality has been improved and moved into the
+ 'mediawiki.action.edit.preview' module. The old 'mediawiki.legacy.preview' module
+ has been removed.
+* (bug 40448) Removed mediawiki.legacy.mwsuggest module, and removed the
+ following that has become obsolete:
+ - globals $wgEnableMWSuggest and $wgMWSuggestTemplate.
+ - mw.config.values wgMWSuggestTemplate and wgSearchNamespaces.
+ - method SearchEngine::getMWSuggestTemplate().
+
+== MediaWiki 1.19 ==
+
+== MediaWiki 1.19.2 ==
+
+This is a security release of the MediaWiki 1.19 branch
+
+=== Changes since 1.19.1 ===
+* (bug 39700) File: link to non-existing file can inject html
+* (bug 39823) Hidden block text leaking to admins
+* (bug 39184) LDAP password leakage
+* (bug 39180) Disallow framing of api results
+* (bug 37587) Enforce language codes to be html safe
+* (bug 39824) Check global blocks on account creation
+
+== MediaWiki 1.19 ==
+
+MediaWiki 1.19 is a large release that contains many new features and bug
+fixes. This is a summary of the major changes of interest to users.
+You can consult the RELEASE-NOTES-1.19 file for the full list of changes in
+this version.
+
+Our thanks go to everyone who helped to improve MediaWiki by testing the beta
+release and submitting bug reports.
+
+=== Changes since 1.19.1 ===
+* (bug 38406) Properly quote table names in DatabaseBase::tableName()
+* (bug 38249) Parser will throw an exception instead of outputting gibberish if
+ PCRE is compiled without support for unicode properties.
+
+=== Changes since 1.19.0 ===
+* (bug 36568) Fixed "Illegal string offset 'LIMIT'" warnings in updater
+* (bug 36938) Correctly escape uselang attribute to prevent xss
+* Expanded Blacklist for SVG Files
+
+=== Changes since 1.19 beta 2 ===
+* Special:Watchlist no longer sets links to feed when the user is anonymous.
+* (bug 35961) Hash comparison should always be strict.
+* Fix broken email confirmation expiration caused by MWCryptRand changes.
+* (bug 35671) PHP Notice: Undefined index: gettoken in includes/api/ApiMain.php
+ on line 598.
+* (bug 36042) 'show' causes a fatal in blocks API.
+
+=== Changes since 1.19 beta 1 ===
+* (bug 35014) Including a special page no longer sets the page's title to the
+ included page
+* (bug 35019) Edit summaries are no longer transformed in notification e-mails
+* (bug 35152) Help message for e-mail is shown again in user preferences
+* (bug 34887) $3 and $4 parameters are now substituted correctly in message
+ "movepage-moved"
+* (bug 34841) Edit links are no longer displayed when display old page versions
+* (bug 34889) User name should be normalized on Special:Contributions
+* (bug 35051) If heading has a trailing space after == then its name is not
+ preloaded into edit summary on section edit
+* (bug 31417) New ID mw-content-text around the actual page text, without categories,
+ contentSub, ... The same div often also contains the class mw-content-ltr/rtl.
+* (bug 35303) Proxy and DNS blacklist blocking works again
+* (bug 22555) Remove or skip strip markers from tag hooks like &lt;nowiki&gt; in
+ core parser functions which operate on strings, such as padleft.
+* (bug 18295) Don't expose strip markers when a tag appears inside a link
+ inside a heading.
+* (bug 34212) ApiBlock/ApiUnblock allow action to take place without a token
+ parameter present.
+* (bug 34907) Fixed exposure of tokens through load.php that could have facilitated
+ CSRF attacks.
+* (bug 35317) CSRF in Special:Upload.
+
+=== Configuration changes in 1.19 ===
+* Removed SkinTemplateSetupPageCss hook; use BeforePageDisplay instead.
+* (bug 27132) movefile right granted by default to registered users.
+* Default cookie lifetime ($wgCookieExpiration) is increased to 180 days.
+* (bug 31204) Removed old user.user_options.
+* $wgMaxImageArea now applies to jpeg files if they are not scaled with
+ ImageMagick.
+* Introduced $wgQueryPageDefaultLimit (defaults to 50) for the number of
+ items to show by default on query pages (special pages such as Whatlinkshere).
+* (bug 32470) Increase the length of ug_group.
+* (bug 32239) Removed $wgEnableTooltipsAndAccesskeys.
+* Removed $wgVectorShowVariantName.
+* Removed $wgExtensionAliasesFiles. Use $wgExtensionMessagesFiles.
+* Removed $wgResourceLoaderInlinePrivateModules , now always enabled.
+
+=== New features in 1.19 ===
+* (bug 19838) Add ability to get all interwiki prefixes also if the interwiki
+ cache is used.
+* $wgDnsBlacklistUrls now accepts an array with url and key as the
+ elements to work with DNSBLs that require keys, such as
+ Project Honeypot.
+* (bug 30022) Add support for custom loadScript sources to ResourceLoader.
+* (bug 19052) Unicode space separator characters (Zs) now terminates external
+ links and images links.
+* (bug 30160) Add public method to mw.loader to get module names from registry.
+* (bug 15558) Parameters to special pages included in wikitext can now be passed
+ as with templates.
+* Installer now issues a warning if mod_security is present.
+* (bug 29455) Add support for a filter callback function in jQuery byteLimit
+ plugin.
+* Added two new GetLocalURL hooks to better serve extensions working on a
+ limited type of titles.
+* Added a --no-updates flag to importDump.php that skips updating the links
+ tables.
+* Most presentational html attributes like valign are now converted to inline
+ css style rules. These attributes were removed from html5 and so we clean
+ them up when $wgHtml5 is enabled. This can be disabled using
+ $wgCleanupPresentationalAttributes.
+* Magic words (time and number-formatting ones, plus DIRECTIONMARK, but not
+ NAMESPACE) now depend on the page content language instead of the site
+ language. In theory this sets the right magic words in system messages,
+ although they are not used there.
+* (bug 30451) Add page_props to RefreshLinks::deleteLinksFromNonexistent.
+* (bug 30450) Clear page_props table on page deletion.
+* Hook added to check for exempt from account creation throttle.
+* (bug 30344) Add configuration variable for setting custom priorities when
+ generating sitemaps.
+* (bug 96170) Add array support for space-separated list attributes (like
+ 'class') in the Html helper class.
+* (bug 26470) Add checkered background image on hover on files pages.
+* (bug 30774) mediawiki.html: Add support for numbers and booleans in the
+ attribute values and element contents.
+* Conversion script between Tifinagh and Latin for the Tachelhit language.
+* (bug 16755) Add options 'noreplace' and 'noerror' to {{DEFAULTSORT:...}}
+ to stop it from replace an already existing default sort, and suppress error.
+* (bug 18578) Rewrote revision delete related messages to allow better
+ localisation.
+* (bug 30364) LanguageConverter now depends on the page content language
+ instead of the wiki content language.
+* Jump links will now be usable in CSS-capable browsers instead of only
+ in outdated text browsers.
+* New common*.css files usable by skins instead of having to copy piles
+ of generic styles from MonoBook or Vector's css.
+* Some deprecated presentational html attributes will now be automatically
+ converted to css.
+* (bug 31297) Add support for namespaces in Special:RecentChanges subpage filter
+ syntax.
+* The default user signature now contains a talk link in addition to the user link.
+* (bug 25306) Add link of old page title to MediaWiki:Delete_and_move_reason.
+* Added hook BitmapHandlerCheckImageArea.
+* (bug 30062) Add $wgDBprefix option to cli installer.
+* getUserPermissionsErrors and getUserPermissionsErrorsExpensive hooks are now
+ also called when checking for 'read' permission.
+* Introduce $wgEnableSearchContributorsByIP which controls whether searching
+ for an IP address redirects to the contributions list for that IP.
+* (bug 8859) Database::update should take array of tables too.
+* (bug 19698) Add "Inverse namespaces" option to Special:Contributions.
+* (bug 24037) Add byte length of revision to Special:Contributions.
+* (bug 1672) Added $wgDisableUploadScriptChecks to allow uploading of files
+ containing HTML or JS. DISABLING THESE CHECKS IS VERY DANGEROUS.
+* New path mappings can be added using the WebRequestPathInfoRouter hook
+ and adding paths to the PathRouter.
+* (bug 32666) Special:ActiveUsers now allows a subpage to be used as value for the
+ "target" query parameter (eg. Special:ActiveUsers/Username).
+* New JavaScript variable wgPageContentLanguage.
+* Added new debugging toolbar, enabled with $wgDebugToolbar.
+* Differences in the history page now uses slightly better colors for people
+ perceiving colors differently.
+* (bug 32879) Upgrade jQuery to 1.7.1.
+* jQuery UI upgraded to 1.8.17.
+* Extensions can use the 'Language::getMessagesFileName' hook to define new
+ languages using messages files outside of core.
+* (bug 32512) Add 'Associated namespace' checkbox to Special:Contributions.
+* Added $wgSend404Code, true by default, which can be set to false to send a
+ 200 status code instead of 404 for nonexistent articles.
+* (bug 33447) Link to the broken image tracking category from Special:Wantedfiles.
+* (bug 27724) Add timestamp to job queue.
+* (bug 30339) Implement SpecialPage for running javascript tests. Disabled by default, due to
+ tests potentially being harmful, not to be run on a production wiki.
+ Enable by setting $wgEnableJavaScriptTest to true.
+* Extensions can use the RequestContextCreateSkin hook to override what skin is
+ loaded in some contexts.
+* (bug 33456) Show $wgQueryCacheLimit on cached query pages.
+* (bug 10574) Add an option to allow all pages to be exported by Special:Export.
+* mediawiki.js Message object constructor is now publicly available as mw.Message.
+* (bug 29309) Allow CSS class per tooltip (tipsy).
+* (bug 33565) Add accesskey/tooltip to submit buttons on Special:EditWatchlist.
+* (bug 17959) Inline rendering/thumbnailing for Gimp XCF images.
+* (bug 27775) Namespace has it's own XML tag in the XML dump file.
+* (bug 30513) Redirect tag is now resolved in XML dump file.
+* sha1 xml tag added to XML dump file.
+* (bug 33646) Badtitle error page now emits a 400 HTTP status.
+* Special:MovePage now has a dropdown menu for namespaces.
+* (bug 34420) Special:Version now shows git HEAD sha1 when available.
+* (bug 33952) Refactor mw.toolbar to allow dynamic additions at any time.
+
+=== Bug fixes in 1.19 ===
+* $wgUploadNavigationUrl should be used for file redlinks if.
+ $wgUploadMissingFileUrl is not set. The first was used for this
+ until the second was introduced in 1.17.
+* BREAKING CHANGE: Style rules for wikitable are now more specific and prevent
+ inheritance to nested tables which caused various issues (bug 30485 and bug
+ 33434). If your wiki has overriden rules for ".wikitable", please revise them and
+ adjust where neccecary. For comparison, use the "table.wikitable" section in
+ skins/common/shared.css as base.
+* $wgUploadNavigationUrl is now used for file redlinks if
+ $wgUploadMissingFileUrl is not set. The former was used for this until the
+ second was introduced in 1.17.
+* (bug 27894) Move 'editondblclick' event listener down from body to
+ div#bodyContent.
+* (bug 30172) The check for posix_isatty() in maintenance scripts did not detect
+ when the function exists but is disabled. Introduced
+ Maintenance::posix_isatty().
+* (bug 30264) Changed installer-generated LocalSettings.php to use
+ require_once() instead require() for included extensions.
+* Do not convert text in the user interface language to another script.
+* (bug 26283) Previewing user JS/CSS pages didn't load other user JS/CSS pages.
+* (bug 26486) ResourceLoader modules with paths to nonexistent files cause PHP
+ warnings/notices to be thrown.
+* (bug 30335) Fix for HTMLForms using GET that were breaking when non-friendly
+ URLs are used.
+* (bug 28649) Preventing half truncated multi-byte unicode characters when
+ truncating log comments.
+* Show --batch-size option in help of maintenance scripts that support it.
+* (bug 4381) Magic quotes cleaning was not comprehensive, key strings were not
+ unescaped.
+* (bug 23057) Importers no longer can 'edit' or 'create' a fully-protected page by
+ importing a new revision into it.
+* Allow moving the associated talk pages of subpages even if the base page
+ has no subpage.
+* Per page edit-notices now work in namespaces without subpages enabled.
+* (bug 31081) $wgEnotifUseJobQ is no longer unconditionally enqueueing jobs.
+* (bug 30202) File names are now restricted on upload to 240 bytes, because of
+ restrictions on some of the database fields.
+* Timezones are now recognised in user preferences when offset is different
+ due to DST.
+* (bug 31692) "summary" parameter now also works when undoing revisions.
+* (bug 18823) "move succeeded" text displayed bluelinks even when redirect was
+ suppressed.
+* (bug 19186) Special:UserLogin's title on Special:SpecialPages now says
+ "create account" when the user cannot create an account.
+* (bug 31818) 'usercreated' message now supports GENDER.
+* (bug 32022) Our phpunit.php script can now be executed from another directory.
+* (bug 26020) Setting $wgEmailConfirmToEdit to true no longer removes diffs.
+ from recent changes feeds.
+* (bug 30232) add current time to message wlnote on Special:Watchlist.
+* (bug 29110) $wgFeedDiffCutoff did not affect new pages.
+* (bug 32168) Add wfRemoveDotSegments for use in wfExpandUrl.
+* (bug 32358) Do not display "No higher resolution available" for dimensionless
+ files (like audio files).
+* (bug 32168) Add wfAssembleUrl for use in wfExpandUrl.
+* (bug 32168) fixed - wfExpandUrl expands dot segments now.
+* (bug 31535) Upload comments now truncated properly, and don't have brackets.
+* (bug 32086) Special:PermanentLink now show an error message when no subpage
+ was specified.
+* (bug 30368) Special:Newpages now shows the new page name for moved pages.
+* (bug 1697) The way to search blocked usernames in block log should be clearer.
+* (bug 29747) eAccelerator shared memory caching has been removed since it is
+ now disabled by default and is buggy. APC, XCache and WinCache are not affected.
+* Installer now refuses to install if php was not compiled with Ctype support.
+* (bug 29475) Remove "trackback" feature entirely from core.
+* (bug 32665) Special:BlockList prefills the username in the input field if
+ using the Special:BlockList/username URL.
+* (bug 27721) Make JavaScript variables wgSeparatorTransformTable and
+ wgDigitTransformTable depend on page content language so the sort script
+ sorts correctly more often.
+* (bug 32230) Expose wgRedirectedFrom in JavaScript.
+* (bug 31212) History tab not collapsed when the screen is narrow.
+* (bug 15521) Use new section summary when the action of adding a new section
+ also happens to create the page.
+* (bug 32960) Remove EmailAuthenticationTimestamp from database when a
+ email address is removed.
+* (bug 32414) Empty page get a empty bytes attribute in Export/Dump.
+* (bug 33101) Viewing a User or User talk of username resembling IP ending
+ with .xxx causes Internal error.
+* Warning about undefined index in certain situations when $wgLogRestrictions
+ causes the first log type requested to be removed but not the others.
+* Use separate message ('prefixindex-namespace') for title of
+ Special:PrefixIndex rather then re-using Special:AllPages's allinnamespace.
+* (bug 33156) Special:Block now allows you to confirm you want to block yourself
+ when using non-normalized username.
+* (bug 33246) News icon shown for news:// URLs but not for news: URLs.
+* (bug 33305) Make mw.util.addCSS resistant to IE's @font-face bug by setting
+ cssText after DOM insertion.
+* (bug 30711) When adding a new section to a page with section=new, the text is
+ now always added to the current version of the page.
+* (bug 31719) Fix uploads of SVGs exported by Adobe Illustrator by expanding
+ XML entities correctly.
+* (bug 30914) Embeddable ResourceLoader modules (user.options, user.tokens)
+ should be loaded in <head> for proper dependency resolution.
+* (bug 32702) Removed method Skin::makeGlobalVariablesScript() has been readded
+ for backward compatibility.
+* (bug 31469) Make sure tracking category messages expand variables like
+ {{NAMESPACE}} relative to correct title.
+* (bug 33454) ISO-8601 week-based year number (format character 'o') is now
+ calculated correctly with respect to timezone.
+* (bug 32219) InstantCommons now fetches content from Wikimedia Commons using
+ HTTPS when the local wiki is served over HTTPS.
+* (bug 33525) clearTagHooks doesn't clear function hooks.
+* (bug 33523) Function tag hooks don't appear on Special:Version.
+* Files with IPTC blocks we can't read no longer prevent extraction of exif
+ or other metadata.
+* (bug 33587) Remove action "historysubmit" from history pages.
+* (bug 25800) mw.config wgAction should contain the actually performed action instead
+ of whatever the query value contains.
+* (bug 4438) Add CSS hook for current WikiPage action.
+* (bug 33703) Common border-bottom color for <abbr> should inherit default (text) color.
+* (bug 33819) Display file sizes in appropriate units.
+* (bug 32948) {{REVISIONID}} and related variables are no longer blank after doing
+ a null edit.
+* (bug 33880) $wgUsersNotifiedOnAllChanges should not send e-mail to user who made
+ the edit.
+* (bug 33902) Decoding %2B with mw.Uri.decode results in ' ' instead of +.
+* (bug 33762) QueryPage-based special pages no longer misses *-summary message.
+* Other sizes links are no longer generated for wikis without a 404 thumbnail handler.
+* (bug 29454) Enforce byteLimit for page title input on Special:MovePage.
+* (bug 34114) CSSMin::remap() doesn't respect its $embed parameter.
+* Special:Contributions/newbies now shows the contributions for the user "newbies".
+ New user contributions are obtained using the form or using ?contribs=newbie in URL.
+* It is now possible to delete images that have no corresponding description pages.
+* (bug 33165) GlobalFunctions.php line 1312: Call to a member function
+ getText() on a non-object.
+* (bug 31676) Group dynamically inserted CSS into a single <style> tag, to work
+ around a bug where not all styles were applied in Internet Explorer.
+* (bug 28936, bug 5280) Broken or invalid titles can't be removed from watchlist.
+* (bug 34600) Older skins using useHeadElement=false were broken in 1.18.
+* (bug 34604) [mw.config] wgActionPaths should be an object instead of a numeral
+ array.* (bug 12262) Indents and lists are now aligned
+* (bug 29753) mw.util.tooltipAccessKeyPrefix should be alt-shift for Chrome
+ on Windows
+* (bug 25095) Special:Categories should also include the first relevant item
+ when "from" is filled.
+* (bug 34972) An error occurred while changing your watchlist settings for
+ [[Special:WhatLinksHere/Example]]
+
+=== API changes in 1.19 ===
+* Made action=edit less likely to return "unknownerror", by returning the actual error
+ message (which may have come from a hook call or similar).
+* (bug 19838) siprop=interwikimap can now use the interwiki cache.
+* (bug 29748) Add API search prefix support.
+* (bug 29684) Set forgotten parameter types in ApiQueryIWLinks.
+* (bug 29685) do not output NULL parentid with list=deletedrevs&drprop=parentid.
+* siprop=interwikimap and siprop=languages can use silanguagecode to have
+ a best effort language name translation. Use CLDR extension for best result.
+* (bug 30230) action=expandtemplates should not silently override invalid title
+ inputs.
+* (bug 18634) Create API to fetch MediaWiki's language fallback tree structure.
+* (bug 26885) Allow show/hide of account blocks, temporary blocks and single IP
+ address blocks for list=blocks.
+* (bug 30591) Add support to only return keys in ApiAllMessages.
+* The API now respects $wgShowHostnames and won't share the hostname in
+ severedby if it's set to false.
+* wlexcludeuser parameter added to ApiFeedWatchlist.
+* (bug 7304) Links on redirect pages no longer cause the redirect page to show
+ up as a redirect to the linked page on Special:Whatlinkshere.
+* (bug 32609) API: Move captchaid/captchaword of action=edit from core
+ to Captcha extension(s).
+* Added 'APIGetDescription' hook.
+* (bug 32688) Paraminfo for parameter "generator" of the query module shows too
+ many types.
+* (bug 32415) Empty page get no size attribute in API output.
+* (bug 31759) Undefined property notice in querypages API.
+* (bug 32495) API should allow purge by pageids.
+* (bug 33147) API examples should explain what they do.
+* (bug 33482) Api incorrectly calls ApiBase::parseMultiValue if allowed
+ values is given as an array.
+* (bug 32948) {{REVISIONID}} and related variables are no longer blank after
+ calling action=purge&forcelinkupdate.
+* (bug 34377) action=watch now parses messages using the correct title instead
+ of "API".
+* (bug 35036) WikiLove messages were not automatically updated in JavaScript
+ after having been changed on-wiki due to a bug in core
+
+=== Languages updated in 1.19 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+* Canadian English (en-ca) (new).
+* Norwegian (bokmål) (nb) (renamed from no).
+* Uighur (Latin) (ug-latn) was incorrectly marked as right-to-left language.
+* (bug 30217) Make pt-br a fallback of pt.
+* (bug 31193) Set fallback language of Assamese from Bengali to English.
+* Update date format for dsb and hsb: month names need the genitive.
+* (bug 28643) Serbian variant conversion improvements (Nikola Smolenski).
+* (bug 29405, bug 30809) Lower diacritics are invisible in titles in Indic
+ languages Assamese, Bengali, Hindi, Malyalam and Odiya.
+* (bug 32826) Titles in indic languages are partially cut.
+* (bug 33367) Gendered namespaces for Czech.
+* (bug 33014) Language::formatSize()/formatBitrate() should be able to deal
+ with larger numbers (tera-yotta).
+
+=== Other changes in 1.19 ===
+* BREAKING CHANGE: Legacy global array 'ta' and global function 'akeytt' have
+ been removed from wikibits.js.
+* jquery.mwPrototypes module was renamed to jquery.mwExtension.
+* The maintenance script populateSha1.php was renamed to the more concise
+ populateImageSha1.php.
+* The Client-IP header is no longer checked for when trying to resolve a client's
+ real IP address.
+* (bug 22096) Although IE5.x and below was already unsupported officially, stylesheets
+ existing exclusively for IE5.0 and IE5.5 have now been removed (which were in skins
+ 'chick' and 'monobook').
+* The constructor for CategoryView has changed, the second parameter is now a
+ Context source and is required.
+* The Title::escape{Local,Full,Canonical}URL methods are deprecated, please use
+ proper html building methods to escape the normal get{...}URL methods instead.
+* The $variant arguments in the Title::get{Local,Full,Link,Canonical}URL methods
+ have been replaced with a secondary query argument.
+* The $variant argument in the hooks for the Title::get{Local,Full,Link,Canonical}URL
+ methods have been removed, the variant is now part of the $query argument.
+* Removed Title::isValidCssJsSubpage(), deprecated since 1.17 in favor of
+ using Title::isCssJsSubpage() or checking Title::isWrongCaseCssJsPage().
+* Support for the deprecated hook MagicWordMagicWords was removed.
+* The Xml::namespaceSelector method has been deprecated, please use
+ Html::namespaceSelector instead (note that the parameters have changed also).
+* (bug 33746) Preload popular ResourceLoader modules (mediawiki.util) as stop-gap
+ for scripts missing dependencies.
+ New configuration variable $wgPreloadJavaScriptMwUtil has been introduced for this
+ (set to false by default for new installations). Set to true if your wiki has a large
+ amount of user/site scripts that are lacking dependency information. In the short to
+ medium term these user/site scripts should be fixed by adding the used modules to the
+ dependencies in the module registry and/or wrapping them in a callback to mw.loader.using.
== MediaWiki 1.18 ==
+
+== MediaWiki 1.18.5 ==
+2012-08-30
+
+This is a security release of the MediaWiki 1.18 branch
+
+=== Changes since 1.18.4 ===
+* (bug 39700) File: link to non-existing file can inject html
+* (bug 39823) Hidden block text leaking to admins
+* (bug 39184) LDAP password leakage
+* (bug 39180) Disallow framing of api results
+* (bug 37587) Enforce language codes to be html safe
+* (bug 39824) Check global blocks on account creation
+
+== MediaWiki 1.18.4 ==
+2012-06-12
+
+This is a security release of the MediaWiki 1.18 branch.
+
+=== Changes since 1.18.3 ===
+* (bug 36938) Correctly escape uselang attribute to prevent xss
+* Expanded Blacklist for SVG Files
+
+== MediaWiki 1.18.3 ==
+2012-04-25
+
+This is a maintenance release of the MediaWiki 1.18 branch.
+
=== Changes since 1.18.2 ===
* (bug 35446) Using "{{nse:}}" with an invalid namespace name no longer throws
a PHP warning.
* (bug 35567) The whole password reminder e-mail is now sent in the same language.
+* (bug 35961) Hash comparison should always be strict.
+* (bug 35671) PHP Notice: Undefined index: gettoken in includes/api/ApiMain.php
+ on line 598.
+* Fix broken email confirmation expiration caused by MWCryptRand changes.
== MediaWiki 1.18.2 ==
2012-03-21
@@ -330,7 +1135,7 @@ Selected changes since MediaWiki 1.17 that may be of interest:
* New maintenance script to refresh image metadata (maintenance/refreshImageMetadata.php).
* (bug 16428) Include permalink in printable version.
* (bug 30722) Add an identity collation that sorts things based on what the
- unicode code point is (aka pre-1.17 behaviour).
+ unicode code point is (aka pre-1.17 behavior).
* (bug 30940) Add a hook in User:getDefaultOptions.
To give extensions a better and more flexible way of providing default
values for preferences a hook has been introdiced in User:getDefaultOptions().
@@ -793,97 +1598,219 @@ changes to languages because of Bugzilla reports.
== MediaWiki 1.17 ==
-=== PHP 5.2 now required ==
-Since 1.17, the lowest supported version of MediaWiki is now 5.2.3. Please
-upgrade PHP if you have not done so prior to upgrading MediaWiki.
+== MediaWiki 1.17.5 ==
+2012-06-12
-=== New installer in 1.17 ===
-MediaWiki 1.17 is shipping with a completely redesigned installer to fix
-a lot of outstanding bugs, cleanup the code quality, and make it easier to
-use. Notably, you can now run upgrades from the web without having to move
-LocalSettings.php. Also, configuration script directory has been renamed
-from config/ to mw-config/. The specific bugs are listed below in the
-general notes.
+This is a security release of the MediaWiki 1.17 branch.
-=== New ResourceLoader in 1.17 ===
-MediaWiki 1.17 ships with a ResourceLoader which combines and minifies css and
-javascript attached to the page. They are served from the new entry point load.php
-If the page is served with the &debug=true parameter, the non-minified files
-are used instead.
+=== Summary of selected changes in 1.17 ===
+
+Selected changes since MediaWiki 1.16 that may be of interest:
+
+* A new installer has been introduced. It has a wizard-style interface which is
+ translated into many languages. Many shortcomings in the old installer were
+ addressed with this rewrite. Note that it is no longer required for the config
+ directory to be made writable by the webserver. Instead the generated
+ LocalSettings.php file is offered as a download, which you must then upload
+ to the wiki's base directory.
+
+* ResourceLoader, a new framework for delivering client-side resources such as
+ JavaScript and CSS, has been introduced. These resources are now delivered
+ through the new entry point script "load.php", instead of as static files
+ served directly by the web server. This allows minification, compression and
+ client-side caching to be used more effectively, which should provide a net
+ performance improvement for most users.
+
+* Category sorting has been improved.
+** Sorting is now case insensitive.
+** Sub-categories, pages and files can now be paged separately.
+** When several pages are given the same sort key, they sort by their
+ names instead of randomly.
+
+* The lowest supported version of PHP is now 5.2.3. If necessary, please
+ upgrade PHP prior to upgrading MediaWiki.
+
+=== Changes since 1.17.4 ===
+
+* (bug 36938) Correctly escape uselang attribute to prevent xss
+* Expanded Blacklist for SVG Files
+
+=== Changes since 1.17.3 ===
+
+* (bug 35961) Hash comparison should always be strict.
+* Fix broken email confirmation expiration caused by MWCryptRand changes.
+* (bug 35671) PHP Notice: Undefined index: gettoken in includes/api/ApiMain.php
+ on line 598.
+
+=== Changes since 1.17.2 ===
+
+* (bug 22555) Remove or skip strip markers from tag hooks like &lt;nowiki&gt; in
+ core parser functions which operate on strings, such as padleft.
+* (bug 34212) ApiBlock/ApiUnblock allow action to take place without a token
+ parameter present.
+* (bug 34907) Fixed exposure of tokens through load.php that could have facilitated
+ CSRF attacks.
+* (bug 35317) CSRF in Special:Upload.
+
+=== Changes since 1.17.1 ===
+* (bug 33117) prop=revisions allows deleted text to be exposed through cache pollution.
+* (bug 32709) Private Wiki users were always taken to Special:Badtitle on login.
+
+=== Changes since 1.17.0 ===
+
+* (bug 29535) Added missing Creative Commons CC0 icon.
+* (bug 29726) Fixed failure to load internationalization messages in
+ client-side scripts on WebKit-based browsers.
+* Fixed a bug in message transformation where the previous language could leak
+ into later transformations in the UI language.
+* (bug 29091) Fixed form of native name for Ossetic language (Иронау -> Ирон)
+* Fixed maintenance scripts upgrade1_5.php and rebuildImages.php, they did not
+ work at all since 1.17 beta 1.
+* (bug 29531) Fixed img_auth.php for thumbnails and other filenames with
+ multiple dots, was broken by the fix for bug 28840.
+* In the maintenance script purgeList.php, fixed a fatal error when a page
+ title is given, instead of a URL.
+* (bug 19514) Unordered list list-style-image should be IE6-compatible (8-bit).
+* Installer checked for magic_quotes_runtime instead of register_globals.
+* $wgSVGMaxSize is now applied to the smaller of width or height, making very
+ wide pano/timeline/diagram SVGs renderable at saner sizes.
+* (bug 29959) Installer fatal when cURL and allow_url_fopen is disabled and user
+ tries to subsribe to mediawiki-announce.
+* Installer checked for magic_quotes_runtime instead of register_globals
+* (bug 30131) XCache with variable caching disabled no longer used for variable
+ caching (CACHE_ACCEL)
+* (bug 30264) Changed installer-generated LocalSettings.php to use require_once()
+ instead require() for included extensions.
+* (bug 26486) ResourceLoader modules with paths to nonexistent files cause PHP
+ warnings/notices to be thrown
+* (bug 30907) Special:Unusedcategories should sort ascendingly.
+* (bug 30219) The page shown when LocalSettings.php does not exist was broken on
+ Windows servers.
+* Hardcoded NLS_NUMERIC_CHARACTERS for Oracle DB to prevent type conversion errors.
+* Fixed recentchanges FK violation on page delete and cache purge error in updater
+ for Oracle DB.
+* (bug 32276) Skins were generating output using the internal page title which
+ would allow anonymous users to determine wheter a page exists, potentially
+ leaking private data. In fact, the curid and oldid request parameters would
+ allow page titles to be enumerated even when they are not guessable.
+* (bug 32616) action=ajax requests were dispatched to the relevant internal
+ functions without any read permission checks being done. This could lead to
+ data leakage on private wikis.
+
+=== Changes since 1.17.0rc1 ===
+
+* Fixed syntax error in generated LocalSettings.php when a non-default user
+ rights profile is chosen.
+* (bug 29399) Fixed PostgreSQL installation when the DB user for installation
+ is the same as the one for web access.
+* (bug 29233) Fixed failover for DB slave servers. When a DB slave went down,
+ an error was immediately shown to the user, instead of trying another slave.
+ Was broken since 1.17 beta 1.
+* (bug 29278) Fixed PHP fatal error when attempting to add text to a page via a
+ redirect.
+* (bug 29408) Fixed uploads of files with MIME types that aren't detected by
+ MediaWiki.
+* Removed DEFAULT '' NOT NULL field definitions from Oracle DB schema because
+ using the DEFAULT value ('') in DML broke Oracle backend as it treats an
+ empty VARCHAR2 value as NULL. Indexes on Oracle do not require NOT NULL
+ fields.
+
+=== Changes since 1.17 beta 1 ===
+
+* Fixed warning about missing file "password.js".
+* When installing on MySQL, don't attempt to create a new database user if the
+ same user is used for installation and web access.
+* Fixed SQL query errors in queries with table aliases.
+* (bug 27891) Fixed the "chronology protector", broken since 1.17beta1, which
+ ensures that when database replication is used, the new version is seen by
+ the user immediately after they create or edit an article.
+* (bug 28845) Allow PostgreSQL installation using a non-root user account which
+ has role creation abilities.
+* When installing on PostgreSQL and the install account is the same as the web
+ account, check to make sure that the account has suitable privileges in the
+ mediawiki schema.
+* (bug 28172) Fixed error in PostgreSQL installation when creating the wiki
+ sysop account.
+* Fixed an issue with the Oracle installer in cases where the user is different
+ to the database name.
+* Added "unblockself" to the list of available rights.
+* In the installer, fixed the "user rights profile" option, it never worked.
+* (bug 29117) Fixed Hebrew localisation of the installer.
+* (bug 28840) Reduce the collateral damage caused by the fix for bug 28235 (XSS
+ on Internet Explorer 6 due to a file extension in the query string) by
+ reducing the number of URLs that are blocked, and by redirecting the request
+ to a safer URL where possible instead of blocking it.
+* (bug 28812) Fixed documentation of API action=parse.
+* (bug 28979) Fixed styling of <abbr> and <acronym>.
+* Fixed the error message displayed when you try to create an account by email,
+ but an email address is not given.
+* Fixed JS error due to missing dependency for jquery.suggestions.
+* Exposed $wgExtensionAssetsPath in JavaScript.
+* (bug 28738) Made ResourceLoader support environments with small URL length
+ limits. The length limit can be configured via $wgResourceLoaderMaxQueryLength,
+ and this is set automatically in the generated LocalSettings.php when the
+ php.ini variable "suhosin.get.max_value_length" is set. When a URL exceeds
+ this limit, the request is split up. Also, reduced the average length of
+ load.php URLs by using a more compact parameter format.
+* (bug 25262) Fix for minification of hardcoded data: URIs in CSS.
+* (bug 25124) Respect $wgStyleDirectory in ResourceLoader.
+* Allow installation when no HTTP client is available, don't throw an exception.
+* (bug 27465) Fix metadata extraction for SVG files using unusual namespace
+ names.
+* (bug 29174) Fix regression in upload-by-URL: uploading files larger than the
+ PHP memory limit should work again.
+* Fixed the display of comments in the new user log.
+* (bug 28237) When installing extensions using the web-based installer, create
+ any necessary database tables.
+* (bug 28983) Fixed automated installation of extensions that overwrite $path.
+* Fixed error caused by missing magic words.
+* Fixed breakage of article editing in PostgreSQL due to text search
+ configuration errors.
+* Fixed the HTTPS client used when Curl is not available. This avoids an error
+ during install about failure of the mediawiki-announce subscription.
+* (bug 28162) When installing to PostgreSQL, respect the "database port" input,
+ it was ignored.
=== Configuration changes in 1.17 ===
-* DatabaseFunctions.php that was needed for compatibility with pre-1.3
- extensions has been removed.
-* $wgAllowImageTag can be set to true to whitelist the <img> tag in wikitext.
-* (bug 12797) Add $wgGalleryOptions for adjusting of default gallery display
- options.
-* $wgAllowUserCssPrefs option allows disabling CSS-based preferences; which can
- improve page loading speed.
+
+* $wgLogAutocreatedAccounts controls whether autocreation of accounts is logged
+ to new users log.
* (bug 22858) $wgLocalStylePath is by default set to the same value as
$wgStylePath but should never point to a different domain than the site is
on, allowing skins to use .htc files which are not cross-domain friendly.
-* (bug 20193) Added $wgVectorShowVariantName global configuration variable
- which causes Vector to render the variants drop-down menu with a label
- showing the current variant name. This is off by default, pending further
- research into its user experience implications.
-* XmlFunctions.php has been removed. Use the Xml or Html classes as appropriate.
-* Added $wgSQLMode for setting database SQL modes - either performance (null)
- or other reasons (such as enabling stricter checks)
* $wgFileStore has been deprecated. The only usage $wgFileStore['deleted'] has
been turned into $wgDeletedDirectory.
* $wgDeletedDirectory has been added to specify what directory to place deleted
uploads in.
* IBM DB2 database no longer uses the db specific $wgDBport_db2 variable but the
normal $wgDBport.
-* The upload link for missing files can now be set separately from the
- navigation link with $wgUploadMissingFileUrl.
* $wgCategoryPrefixedDefaultSortkey was removed and is now always false. This
provides more sensible sorting behavior for categories.
* Removed unused globals: $wgEnableSerializedMessages, $wgCheckSerialized,
- $wgUseMemCached, $wgDisableSearchContext, $wgColorErrors,
- $wgUseZhdaemon, $wgZhdaemonHost and $wgZhdaemonPort.
+ $wgUseMemCached, $wgDisableSearchContext, $wgColorErrors, $wgUseZhdaemon,
+ $wgZhdaemonHost and $wgZhdaemonPort.
* (bug 24408) The include_path is not modified in the default LocalSettings.php
* $wgVectorExtraStyles was removed, and is no longer in use.
-* $wgLoadScript was added to specify alternative locations for ResourceLoader
- requests.
-* $wgResourceLoaderMaxage was added to specify maxage and smaxage times for
- responses from ResourceLoader based on whether the request's URL contained a
- version parameter or not.
-* $wgResourceLoaderDebug was added to specify the default state of debug mode;
- this will still be overridden with the debug URL parameter a la
- $wgLanguageCode.
-* $wgResourceLoaderInlinePrivateModules was added to specify whether private
- modules such as user.options should be embedded in the HTML output or
- delivered through a resource loader request, which bypasses server cache (like
- squid) and checks the user parameter against $wgUser. The former adds more
- data to all pages, while the latter adds a request which cannot be cached
- server side.
-* Removed $wgUpdates for database updates; extension should use
- DatabaseUpdater::addExtensionUpdate().
+* Removed $wgUpdates for database updates; extensions should use
+ DatabaseUpdater::addExtensionUpdate() via the LoadExtensionSchemaUpdates hook.
* Removed $wgServerName. It doesn't need to be set anymore and is no longer
available as input for other configuration items, either.
-* Remove $wgRemoteUploads. It was not well supported and superseded by
- $wgUploadNavigationUrl.
-* (bug 198) $wgUpgradeKey allows unlocking the web installer for upgrades
- without having to move LocalSettings.php
-* The FailFunction "error handling" method has now been removed
-* $wgAdditionalMailParams added to allow setting extra options to mail() calls.
-* $wgSecureLogin to optionaly login using HTTPS
-* (bug 25728) Added $wgPasswordSenderName to allow customise the name associed
- with $wgPasswordSender
-* Sysops now have the "suppressredirect" right by default
-* (bug 22463) $wgFooterIcons added to allow configuration of the icons shown in
- the footers of skins.
-* $wgFileCacheDepth can be used to set the depth of the subdirectory hierarchy
- used for the file cache. Default value is 2, which matches former behavior
* It's no longer necessary for LocalSettings.php to include DefaultSettings.php.
* It's no longer necessary to set $wgCacheEpoch to the file modification time
of LocalSettings.php, in LocalSettings.php itself. Instead, this is done
automatically if $wgInvalidateCacheOnLocalSettingsChange is true (which is
the default).
-* (bug 26253) $wgPostCommitUpdateList has been removed
+* $wgCopyrightIcon is deprecated and $wgFooterIcons['copyright']['copyright']
+ should be used instead.
+* $wgSysopUserBans is deprecated, and will be made permanently true in 1.18.
+ If you need this functionality, you should use the BlockIp hook to filter and
+ reject such blocks.
+* $wgSysopRangeBans is deprecated, you should set $wgBlockCIDRLimit to maximum
+ (32 for IPv4, 128 for IPv6), equivalent to allowing rangeblocks of only 1
+ address at a time.
=== New features in 1.17 ===
+
* (bug 10183) Users can now add personal styles and scripts to all skins via
User:<name>/common.css and /common.js (if user css/js is enabled).
* (bug 22748) Add anchors on Special:ListGroupRights.
@@ -898,7 +1825,7 @@ are used instead.
changes list.
* (bug 22925) "sp-contributions-blocked-notice-anon" message now displayed when
viewing contributions of a blocked IP address.
-* (bug 22474) {{urlencode:}} now takes an optional second paramter for type of
+* (bug 22474) {{urlencode:}} now takes an optional second parameter for type of
escaping.
* Special:Listfiles now supports a username parameter.
* Special:Random carries over query string parameters.
@@ -915,16 +1842,13 @@ are used instead.
* (bug 20976) "searchmenu-new-nocreate" message now displayed when when there
is no title match in search and the user has no rights to create pages.
* (bug 23429) Added new hook WatchlistEditorBuildRemoveLine.
-* (bug 22844) Added support for WinCache object caching.
-* (bug 23580) Add two new events to LivePreview so that scripts can be
- notified about the beginning and finishing of LivePreview actions.
+* (bug 22844) Added support for WinCache object caching (for IIS).
+* (bug 23580) Add two new events to LivePreview so that scripts can be notified
+ about the beginning and finishing of LivePreview actions.
* (bug 21278) Now the sidebar allows inclusion of wiki markup.
-* (bug 23733) Add IDs to messages used on CSS/JS pages
-* (bug 21312) RevisionMove allows moving individual revisions of a page to
- another page. Introducing 'revisionmove' user right; disabled by default;
- experimental feature.
+* (bug 23733) Add IDs to messages used on CSS/JS pages.
* Show validity period of the login cookie in Special:UserLogin and
- Special:Preferences
+ Special:Preferences.
* Interlanguage links display the page title in their tooltip.
* (bug 23621) New Special:ComparePages to compare (diff) two articles.
* (bug 4597) Provide support in Special:Contributions to show only "current"
@@ -935,12 +1859,12 @@ are used instead.
* (bug 21475) \mathtt and \textsf can now be used in <math>
* texvc is now run via ulimit4.sh, to limit execution time.
* SQLite now supports $wgSharedDB.
-* (bug 8507) Group file links by namespace:title on image pages
+* (bug 8507) Group file links by namespace:title on image pages.
* Stop emitting named entities, so we can use <!DOCTYPE html> while still being
- well-formed XML
+ well-formed XML.
* texvc now supports \bcancel and \xcancel in addition to \cancel and \cancelto
-* Added scriptExtension setting to $wgForeignFileRepos
-* ForeignApiRepo uses scriptDirUrl if apiBase not set
+* Added scriptExtension setting to $wgForeignFileRepos.
+* ForeignApiRepo uses scriptDirUrl if apiBase not set.
* (bug 24212) Added MediaWiki:Filepage.css which is also included on foreign
client wikis.
* (bug 14685) Double underscore magic word usage is now tracked in the
@@ -950,71 +1874,100 @@ are used instead.
"mw-ipb-needreblock"
* Non-file pages can no longer be moved to the file namespace, nor vice versa.
* (bug 671) The <dfn>, <kbd> and <samp> elements have been whitelisted in user
- input
-* (bug 24563) Entries on Special:WhatLinksHere now have a link to their history
-* (bug 21503) There's now a "reason" field when creating account for other users
-* (bug 24418) action=markpatrolled now requires a token
+ input.
+* (bug 21503) There's now a "reason" field when creating account for other users.
+* (bug 24418) action=markpatrolled now requires a token.
* A variety of category sort-related fixes, including:
** (bug 164) In English, lowercase and uppercase letters now sort the same.
- (This should be expanded to proper sorting for other languages before the
- 1.17 release.)
** (bug 1211) Subcategories, ordinary pages, and files now page separately.
** When several pages are given the same sort key, they sort by their names
instead of randomly.
* (bug 23848) Add {{ARTICLEPATH}} Magic Word.
-* JavaScript-based password complexity checker on account creation and
- password change.
-* (bug 8140) Add dedicated CSS classes to Special:Newpages elements
-* (bug 11005) Add CSS class to empty pages in Special:Newpages
+* (bug 8140) Add dedicated CSS classes to Special:Newpages elements.
+* (bug 11005) Add CSS class to empty pages in Special:Newpages.
* The parser cache is now shared amongst users whose different settings aren't
used in the page.
* Any attribute beginning with "data-" can now be used in wikitext, per HTML5.
* (bug 24007) Diff pages now mention the number of users having edited
- intermediate revisions
-* Added new hook GetIP
+ intermediate revisions.
+* Added new hook GetIP.
* Special:Version now displays whether a SQLite database supports full-text
search.
* TS_ISO_8691_BASIC was added as a time format, which is used by ResourceLoader
- for versioning
+ for versioning.
* Maintenance scripts get a --memory-limit option to override defaults (which
- is usually to set it to -1 to disable the limit)
+ is usually to set it to -1 to disable the limit).
* (bug 25397) Allow uploading (not displaying) of WebP images, disabled
- by default
-* (bug 23194) Special:ListFiles now has thumbnails
+ by default.
+* (bug 23194) Special:ListFiles now has thumbnails.
* Use hreflang to specify canonical and alternate links, search engine friendly
when a wiki has multiple variant languages.
-* (bug 19593) Specifying --server in now works for all maintenance scripts
+* (bug 19593) Specifying --server in now works for all maintenance scripts.
* Now rebuildtextindex.php warns if SQLite doesn't support full-text search.
-* (bug 10541) Front/backend separation of installation/upgrade code
-* (bug 10596) Allow installer to enable extensions already in extensions folder
-* (bug 17394) Make installer check for latest version against MediaWiki.org
-* (bug 20627) Installer should be in languages other than English
+* (bug 10541) Front/backend separation of installation/upgrade code.
+* (bug 10596) Allow installer to enable extensions already in extensions folder.
+* (bug 20627) Installer should be in languages other than English.
* Support for metadata in SVG files (title, description).
-* Special:Search: Add CSS classes to 'none found' and 'create link' messages
+* Special:Search: Add CSS classes to 'none found' and 'create link' messages.
* Add CSS classes (including namespace and pagename) to the enhanced recent
- changes/watchlist entries
+ changes/watchlist entries.
* (bug 22463) Add hook 'SkinGetPoweredBy' to make 'powered by' icon/text
- customizable
-* Added CSS print pagination to the print stylesheets
+ customizable.
+* Added CSS print pagination to the print stylesheets.
* (bug 25960) Add <link rel=canonical"> for File pages of shared/foreign
file repositories.
* When viewing a redirect, the redirect arrow and redirection target are both
wrapped in a div that has the class "redirectMsg" so that the redirection
- arrow can be customized with CSS
+ arrow can be customized with CSS.
* (bug 21911) Hard coded limit for long page warning removed. New message
[[MediaWiki:Longpage-hint]] (empty per default) can be used instead.
Parameters: $1 shows the formatted textsize in Byte/KB/MB, $2 is the raw
- number of the textsize in Byte
-* (bug 3276) Give image <gallery>s fluid width
-* Added uploads link to page subtitle in Special:Contributions
-* Added Special:Myuploads special page that redirects to Special:Listfiles
+ number of the textsize in Byte.
+* (bug 3276) Give image <gallery>s fluid width.
+* Added uploads link to page subtitle in Special:Contributions.
+* Added Special:Myuploads special page that redirects to Special:Listfiles.
* The footerlinks used in Monobook/Vector/Modern are now part of common skin
code, SkinTemplateOutputPageBeforeExec can be used to customize the list.
* Special wrapping setups can now define MW_CONFIG_FILE to load a config file
other than LocalSettings.php. This is like MW_CONFIG_CALLBACK but works in
some cases where MW_CONFIG_CALLBACK will not work.
+* (bug 26574) Added 'upload' to $wgRestrictionTypes, allowing upload protected
+ pages to be queried via the API and Special:ProtectedPages, and allowing
+ disabling upload protection by removing it from $wgRestrictionTypes.
+* The name attribute of HTMLForm fields can now be overridden by passing a
+ 'name' key in the descriptor array. Hidden field names are now treated
+ consistently with other fields and, by default, prefixed with 'wp'.
+* (bug 27402) Add support for disabling MWSuggest.
+* (bug 26563) Add bytes changed per revision for stub and full article dumps.
+* (bug 27508) Add $wgSVGMetadataCutoff to limit the maximum amount of an svg we
+ look at when finding metadata to prevent excessive resource usage.
+* (bug 198) $wgUpgradeKey allows unlocking the web installer for upgrades
+ without having to move LocalSettings.php
+* Added $wgAllowImageTag, which can be set to true to whitelist the <img> tag
+ in wikitext.
+* (bug 12797) Add $wgGalleryOptions for adjusting of default gallery display
+ options.
+* Added the $wgAllowUserCssPrefs option which allows disabling CSS-based
+ preferences; which can improve page loading speed.
+* Added $wgSQLMode for setting database SQL modes - either performance (null)
+ or other reasons (such as enabling stricter checks).
+* (bug 20193) Added $wgVectorShowVariantName global configuration variable
+ which causes Vector to render the variants drop-down menu with a label
+ showing the current variant name. This is off by default, pending further
+ research into its user experience implications.
+* The upload link for missing files can now be set separately from the
+ navigation link with $wgUploadMissingFileUrl.
+* $wgAdditionalMailParams added to allow setting extra options to mail() calls.
+* Added $wgSecureLogin to optionally login using HTTPS.
+* (bug 25728) Added $wgPasswordSenderName to make the name associated
+ with $wgPasswordSender configurable.
+* (bug 22463) $wgFooterIcons added to allow configuration of the icons shown in
+ the footers of skins.
+* $wgFileCacheDepth can be used to set the depth of the subdirectory hierarchy.
+ used for the file cache. Default value is 2, which matches former behavior.
=== Bug fixes in 1.17 ===
+
* (bug 17560) Half-broken deletion moved image files to deletion archive
without updating database.
* (bug 22666) Submitting user block form with an invalid user name no longer
@@ -1061,7 +2014,7 @@ are used instead.
* (bug 20049) Fixed PHP notice in search highlighter that occurs in some cases.
* (bug 23017) Special:Disambiguations now list pages in content namespaces
rather than only main namespace.
-* (bug 23063) $wgMaxAnimatedGifArea is checked against the total size of all
+* (bug 23063) $wgMaxAnimatedGifArea is checked against the total size of all.
frames, and $wgMaxImageArea against the size of the first frame, rather than
the other way around. Both now default to 12.5 megapixels. Also, images
exceeding $wgMaxImageArea can still be embedded at original size.
@@ -1091,12 +2044,12 @@ are used instead.
correct link.
* (bug 23284) Times are now rounded correctly.
* (bug 23375) Added ogv, oga, spx as extensions for ogg files.
-* (bug 18408) All required permissions for uploading (upload, edit, create)
+* (bug 18408) All required permissions for uploading (upload, edit, create).
are now checked when loading Special:Upload. Toolbar link for Special:Upload
is no longer shown if the user does not have the required permissions.
-* (Bug 23397) texvc in html mode renders \sim as &tilde; not &sim;
-* (Bug 23241) Remove License selector, because it is not used when uploading a
- new version.
+* (bug 23397) texvc in html mode renders \sim as &tilde; not &sim;
+* (bug 23241) License selector should be disabled during upload of a new
+ version.
* (bug 23240) Add ID to namespace selector form on Special:Watchlist.
* The pipe | character in urls is now escaped.
* (bug 23422) mp3 files can now be moved.
@@ -1116,145 +2069,240 @@ are used instead.
* (bug 16573) Render \epsilon in math using images, in order to create
consistent and correct render results.
* (bug 22541) Support image redirects when using ForeignAPIRepo.
-* (bug 22967) Make edit summary length cut-off behave correctly for
- multibyte characters.
-* (bug 8689) Long numeric lines no longer kill the parser.
+* (bug 22967) Make edit summary length cut-off behave correctly for multibyte
+ characters.
+* (bug 8689) Long numeric lines no longer kill the parser.
* (bug 23740) Article::doRedirect() now use $extraQuery parameter correctly if
- the $noRedir parameter is set to true
+ the $noRedir parameter is set to true.
* (bug 23688) Correct mime types for Office 2007 OpenXML documents.
-* (bug 23787) Corrected $wgDefaultSkin's comment in DefaultSettings.php
-* (bug 23797) Xml::input() now allows '0' for the value parameter
+* (bug 23787) Corrected $wgDefaultSkin's comment in DefaultSettings.php.
+* (bug 23797) Xml::input() now allows '0' for the value parameter.
* (bug 23747) Make sure that on History pages, the RevDel button is not
- accidently activated when hitting enter.
-* (bug 23845) Special:ListFiles now uses correct file names without underscores
-* Ask for permanent login in Special:Preferences only if $wgCookieExpiration > 0
+ accidentally activated when hitting enter.
+* (bug 23845) Special:ListFiles now uses correct file names without underscores.
+* Ask for permanent login in Special:Preferences only if $wgCookieExpiration > 0.
* (bug 16356) Repair dumpInterwiki.inc to use proper normalization.
* (bug 24006) deleteArchivedRevisions.php maintenance script now longer throws
- a fatal error
+ a fatal error.
* (bug 23465) Don't ignore the predefined destination filename on
- Special:Upload after following a red link
+ Special:Upload after following a red link.
* (bug 23642) Recognize mime types of MS OpenXML documents.
* (bug 22784) Normalise underscores and spaces in autocomments.
-* (bug 19910) Headings of the form ===+\s+ are now displayed as valid headings
+* (bug 19910) Headings of the form ===+\s+ are now displayed as valid headings.
* (bug 24022) Only check file extensions on the uploadpage when needed.
-* (bug 24076) Recognize Office 2003 files with OpenXML trailers
-* (bug 24244) Updated comments in DefaultSettings.php to reflect
+* (bug 24076) Recognize Office 2003 files with OpenXML trailers.
+* (bug 24244) Updated comments in DefaultSettings.php to reflect.
Image: --> File: namespace rename.
* Make wfTimestamp recognize negative unix timestamp values.
* (bug 24401) SimpleSearch: No button/text indicating 'Search' if image is
- disabled
-* (bug 23293) Do not show change tags when special:recentchanges(linked)
- or special:newpages is transcluded into another page as it messes up the
- page.
+ disabled.
+* (bug 23293) Do not show change tags when Special:RecentChanges(linked) or
+ Special:Newpages is transcluded into another page as it messes up the page.
* (bug 24517) LocalFile::newFromKey() and OldLocalFile::newFromKey() no longer
- throw fatal errors
+ throw fatal errors.
* (bug 23380) Uploaded files that are larger than allowed by PHP now show a
useful error message.
* Uploading to a protected title will allow the user to choose a new name
- instead of showing an error page
+ instead of showing an error page.
* (bug 24425) Use Database::replace instead of delete/insert in
SqlBagOStuff::set to avoid query errors about duplicate keynames.
* (bug 15470) First letters of filenames are always capitalized by upload JS.
-* (bug 21215) NoLocalSettings.php doesn't tolerate rewrite rules
-* (bug 21052) Fix link color for stubs in NewPages
+* (bug 21215) NoLocalSettings.php doesn't tolerate rewrite rules.
+* (bug 21052) Fix link color for stubs in NewPages.
* (bug 24714) Usage of {{#dateformat: }} in wikis without $wgUseDynamicDates no
longer pollutes the parser cache.
* (bug 17031) Correct which characters the parser allows in tag attributes (a
letter, colon or underscore followed by 0 or more letters, numbers, colons,
underscores, hyphens, and/or periods).
-* Save 200 useless queries on each category page view
-* Shell commands will now work on Linux in filesystems mounted noexec
-* (bug 24804) Corrected commafying in Polish and Ukrainian
+* Save 200 useless queries on each category page view.
+* Shell commands will now work on Linux in filesystems mounted noexec.
+* (bug 24804) Corrected commafying in Polish and Ukrainian.
* "Difference between pages" is now displayed instead of "Difference between
- revisions" on diffs when appropriate.
+ revisions" on diffs when appropriate.
* (bug 23703) ForeignAPIRepo fails on findBySha1() when using a 1.14 install as
- a repository due to missing 'name' attribute from the API list=allimages
+ a repository due to missing 'name' attribute from the API list=allimages.
* (bug 24898) MediaWiki uses /tmp even if a vHost-specific tempdir is set, also
- make wfTempDir() return a sane value for Windows on worst-case
+ make wfTempDir() return a sane value for Windows on worst-case.
* (bug 24824) Support ImageMagick 6.5.6-2+ JPEG decoder size hint, to reduce
memory usage when such an ImageMagick is used for scaling.
-* Disable multithreaded behaviour in recent ImageMagick, to avoid a deadlock
+* Disable multithreaded behavior in recent ImageMagick, to avoid a deadlock
when a resource limit such as $wgMaxShellMemory is hit.
-* (bug 24981) Allow extensions to access SpecialUpload variables again
-* (bug 20744) Wiki forgets about an uploaded file
-* (bug 17913) Don't show "older edit" when no older edit available
-* (bug 6204) TOC not properly rendered when using $wgMaxTocLevel
-* (bug 24977) The accesskey in history page now lead directly to the diff
- instead of alterning focus between the two buttons.
-* (bug 24987) Special:ListUsers does not take external groups into account
-* (bug 20633) update.php has mixed language output
+* (bug 24981) Allow extensions to access SpecialUpload variables again.
+* (bug 20744) Wiki forgets about an uploaded file.
+* (bug 17913) Don't show "older edit" when no older edit available.
+* (bug 6204) TOC not properly rendered when using $wgMaxTocLevel.
+* (bug 24977) The accesskey in history page now lead directly to the diff.
+ instead of alternating focus between the two buttons.
+* (bug 24987) Special:ListUsers does not take external groups into account.
+* (bug 20633) update.php has mixed language output.
* SQLite system table names are now never prefixed.
* (bug 25292) SkinSubPageSubtitle hook now passes the Skin object as second
- parameter
-* (bug 25167) Correctly load JS fixes for IE6 (fixing a regression in 1.16)
+ parameter.
+* (bug 25167) Correctly load JS fixes for IE6 (fixing a regression in 1.16).
* (bug 25367) wfShellExec() is more explicit when failing due to disabled
- passthru()
-* (bug 25462) Fix double-escaping for section edit link tooltips
+ passthru().
+* (bug 25462) Fix double-escaping for section edit link tooltips.
* action=raw was removed for Special:Statistics. This information is still
- available via the API
+ available via the API.
* (bug 23934) Groups defined in $wgRevokePermissions but not in
- $wgGroupPermissions now appear on Special:ListGroupRights
+ $wgGroupPermissions now appear on Special:ListGroupRights.
* (bug 23923) Special:Prefixindex no longer shows results if nothing was
requested.
-* (bug 22308) Search now finds text in default main page immediately after setup
+* (bug 22308) Search now finds text in default main page immediately after setup.
* (bug 25697) Make sure empty lines render in diff view.
* Use an actual minus sign in diff views, instead of a hyphen.
-* (bug 23732) Clarified "n links" message on Special:MostLinkedFiles
-* (bug 23731) Clarified "n links" message on Special:MostLinkedTemplates
+* (bug 23732) Clarified "n links" message on Special:MostLinkedFiles.
+* (bug 23731) Clarified "n links" message on Special:MostLinkedTemplates.
* (bug 25642) A exception is now thrown instead of a fatal error when using
- $wgSMTP without PEAR mail package
+ $wgSMTP without PEAR mail package.
* (bug 19633) When possible, Upscale small SVGs when creating thumbnails.
-* (bug 11013) Database driver detection needs rewriting for robustness
-* (bug 13409) Installer prompts could use clarification--now has help boxes
-* (bug 16902) Installer spews warnings when exec() and dl() are not available
-* (bug 19129) Only show MyISAM/InnoDB when supported
-* (bug 17762) Only show other e-mail options when e-mail is globally enabled
-* Cache multiple sizes of InstantCommons thumbnails
+* (bug 11013) Database driver detection needs rewriting for robustness.
+* (bug 13409) Installer prompts could use clarification--now has help boxes.
+* (bug 16902) Installer spews warnings when exec() and dl() are not available.
+* (bug 19129) Only show MyISAM/InnoDB when supported.
+* (bug 17762) Only show other e-mail options when e-mail is globally enabled.
+* Cache multiple sizes of InstantCommons thumbnails.
* (bug 25488) Disallowing anonymous users to read pages no longer throws error
- on discussion pages with vector as default skin
-* (bug 24833) Files name in includes/diff/ are now less confusing
-* (bug 25713) SpecialPage::resolveAlias() now normalise spaces to underscores
+ on discussion pages with vector as default skin.
+* (bug 24833) Files name in includes/diff/ are now less confusing.
+* (bug 25713) SpecialPage::resolveAlias() now normalise spaces to underscores.
* (bug 25829) Special:Mypage and Special:Mytalk now forward oldid, diff and dir
- parameters
+ parameters.
* (bug 25175) HTML file cache now honor $wgCacheDirectory if
- $wgFileCacheDirectory is not set
-* (bug 13353) Diff3 version checks were too strict, did not detect working diff3
-* (bug 25843) Links to special pages using link= attribute on images are now
- normalised like normal links to special pages
+ $wgFileCacheDirectory is not set.
+* (bug 13353) Diff3 version checks were too strict, did not detect working diff3.
+* (bug 25843) Links to special pages using link= attribute on images are now.
+ normalised like normal links to special pages.
* (bug 21364) External links using link= attribute on images now respect
- $wgExternalLinkTarget
+ $wgExternalLinkTarget.
* (bug 17789) Added a note to the total views on Special:Statistics saying that
- is doesn't count non-existing pages and special pages
-* (bug 17996) HTTP redirects are now combined when requesting a special page
+ is doesn't count non-existing pages and special pages.
+* (bug 17996) HTTP redirects are now combined when requesting a special page.
* (bug 19944) Link on image thumbnails no longer link to "Media:" namespace in
- some cases
+ some cases.
* (bug 25670) wfFindFile() now checks the namespace of the given title, only
- "File" and "Media" are allowed now
+ "File" and "Media" are allowed now.
* (bug 25872) Rename the HttpRequest class to MWHttpRequest to avoid conflict
with php extension that defines same class.
* (bug 20591) There's now a different message on Special:MovePage when
$wgFixDoubleRedirects is set to false.
* Fixed PHP warnings when updating a broken MySQL database.
-* (bug 26023) Corrected deleteBacth.php's documentation
+* (bug 26023) Corrected deleteBacth.php's documentation.
* (bug 25451) Improved datetime representation in 32 bit php >= 5.2.
* Show "skin does not exist error" only when the skin is inputted in the wrong
case.
-* (bug 26164) Potential html injection when the database server isn't available
-* (bug 26160) Upload description set by extensions are not propagated
+* (bug 26164) Potential html injection when the database server isn't available.
+* (bug 26160) Upload description set by extensions are not propagated.
* (bug 9675) generateSitemap.php now takes an --urlpath parameter to allow
- absolute URLs in the sitemap index (as required e.g. by Google)
+ absolute URLs in the sitemap index (as required e.g. by Google).
* Partial workaround for bug 6220: at least make files on shared repositories
- show up as (struck-out) bluelinks instead of redlinks on Special:WantedFiles
-* rebuildFileCache.php no longer creates inappropriate cache files for redirects
-* (bug 18372) $wgFileExtensions will now override $wgFileBlacklist
+ show up as (struck-out) bluelinks instead of redlinks on Special:WantedFiles.
+* rebuildFileCache.php no longer creates inappropriate cache files for redirects.
* (bug 25512) Subcategory list should not include category prefix for members.
-* (bug 20244) Installer does not validate SQLite database directory for stable path
+* (bug 10871) Javascript and CSS pages in MediaWiki namespace are no longer
+ treated as wikitext on preview.
+* Page existence is now not revealed (in the colour of the tabs) to users who
+ cannot read the page in question.
+* (bug 22753) Output from update.php is more clear when things changed, entries
+ indicating nothing changed are now all prefixed by "..."
+* (bug 16019) $wgArticlePath = "/$1" no longer breaks API edit/watch actions.
+* (bug 18372) File types blacklisted by $wgFileBlacklist will no longer be shown as
+ "Permitted file types" on the upload form.
+* (bug 26540) Fixed wrong call to applyPatch in MysqlUpdater.
+* (bug 26034) Make the "View / Read" tab in content_navigation style tabs remain
+ selected when the action is "purge".
+* (bug 26733) Wrap initial table creation in transaction.
+* (bug 26208) Mark directionality of some interlanguage links.
+* (bug 26716) Provide link to instructions for external editor related preferences.
+* (bug 26961) Hide anon edits in watchlist preference now actually works.
* (bug 1379) Installer directory conflicts with some hosts' configuration panel.
-* (bug 12070) After Installation MySQL was blocked
-* Fix XML well-formedness on a few pages when $wgHtml5 is true (the default)
-* (bug 28568) Entries in the iwlinks table are now removed on page deletion
+* (bug 27781) Installer does not warn about 5.1.x. Added a compatibility function
+ for array_key_exists().
+* Fix XML well-formedness on a few pages when $wgHtml5 is true (the default).
+* (bug 28069) MediaWiki fails streaming files when mod_deflate and ob_gzhandler
+ are also set.
+* (bug 26223) Concurrently moving an article to different titles leaks a
+ redirect revision with no page.
+* (bug 15641) Fixed permissions checks in Special:Import which allowed users
+ without the 'import' permission to import pages from configured import sources.
+* (bug 26449) Keep underlines from headings outside of tables and thumbs by
+ adding overflow:hidden to h1,h2,h3,h4,h5,h6 (also fixes editsection bunching).
+* (bug 26708) Remove background-color:white from tables in Monobook and Vector.
+* (bug 26781) {{PAGENAME}} and related parser functions escape their output better.
+* (bug 26716) Provide link to instructions for external editor related preferences
+ and add a comment to the ini control file explaining what is going on.
+* (bug 28422) Remove color:black from tables in Monobook and Vector. And add it
+ to table.wikitable instead.
+* (bug 27560) Search queries no longer fail in walloon language.
+* (bug 27700) The upload protection can now also be set for files that do not
+ exist.
+* (bug 28034) uploading file to local wiki when file exists on shared repository
+ (commons) gives spurious info in the warning message.
+* Usernames get lost when selecting different sorts on Special:listfiles.
+* (bug 28166) UploadBase assumes that 'edit' and 'upload' rights are not per
+ page restrictions.
+* (bug 28242) Make redirects generated by urls containing a local interwiki
+ prefix be a 301 instead of a 302.
+* (bug 28568) Entries in the iwlinks table are now removed on page deletion.
+* (bug 28306) Fix exposure of suppressed usernames in ForeignDBRepo.
+* (bug 28444) Fix regression: edit-on-doubleclick retains revision id again.
+* UtfNormal::cleanUp on an invalid utf-8 sequence no longer returns false if
+ intl installed.
+* (bug 26729) Category pages should return 404 if they do not exist and have no
+ members.
+* (bug 28214) When page not found, sends malformed HTTP/1.x instead of HTTP/1.1
+ in header of response.
+* (bug 27634) TOC title appears in wrong language.
+* (bug 27761) Fix regression: pages with Esperanto titles containing convertible
+ character sequences became unreachable.
+* (bug 27508) SVGMetadataExtractor takes too much resources on huge svgs.
+* (bug 27465) SVG thumbnail generation.
+* (bug 27467) preload can leave UNIQ.
+* (bug 27539) Allow attributes beginning with a digit in wiktext tag parameters.
+* (bug 27328) using relative paths in CSS imports in MediaWiki:Common.css broken
+ in 1.17.
+* (bug 27333) Fix repetitive last-seen time queries on page history.
+* (bug 26250, bug 23817) Fix wfObjectToArray() to descend into arrays; fixes
+ processing of JSON return values for ForeignAPIRepo when native json module
+ not present.
+* (bug 25675) Fix search suggestions for Special: pages with spaces.
+* (bug 25571) Xml::encodeJsVar now passes floats natively instead of converting
+ to strings.
+* (bug 27338) Gallery in 1.17 breaks for audio/video + ogghandler.
+* (bug 27302) Don't append the current timestamp for user/site modules when no
+ user/site JS/CSS is present.
+* (bug 27016) dumpTextPass.php now consider the "output" parameter.
+* (bug 22606) don't send the "someone registred an account" message when setting
+ email address (i.e. old one empty) in user preferences.
+* (bug 26458) Section edit links appear on pages that user does not have right
+ to edit.
+* (bug 28611) Don't die in SqlBagOStuff::incr() if there's a race condition.
+* (bug 16886) Sister projects box moves down the extract of the first result
+ in IE 7.
+* (bug 17398) Fixed "link" parameter in image links with "thumb" or "frame"
+ parameter.
=== API changes in 1.17 ===
+
+* BREAKING CHANGE: action=patrol now requires POST.
+* BREAKING CHANGE: patrol token is no longer the same as edit token.
+* BREAKING CHANGE: Session keys returned by ApiUpload are now strings instead
+ of integers.
+* BREAKING CHANGE: (bug 25303) Fix API parameter integer validation to actually
+ enforce validation on the input values in addition to giving a warning.
+ Also add flag to enforce (die) if integer out of range.
+* (bug 24650) Fix API to work with categorylinks changes.
+* action=parse now correctly returns an error for nonexistent pages.
+* (bug 27201) Special:WhatLinksHere output no longer contains duplicate IDs.
+* (bug 26560) On allusers if limit < total number of users, last user gets
+ duplicated.
+* (bug 27715) imageinfo didn't respect revdelete.
+* (bug 27479) API error when using both prop=pageprops and
+ prop=info&inprop=displaytitle.
+* (bug 27862) Useremail module didn't properly return success on success.
+* (bug 27590) prop=imageinfo now allows querying the media type.
+* (bug 27587) list=filearchive now outputs full title info.
+* (bug 27897) list=allusers and list=users list hidden users.
* (bug 22738) Allow filtering by action type on query=logevent.
* (bug 22764) uselang parameter for action=parse.
* (bug 22944) API: watchlist options are inconsistent.
@@ -1272,106 +2320,106 @@ are used instead.
* (bug 23524) Api Modules as followup to bug 14473 (Add iwlinks table to
track inline interwiki link usage).
* Add pltitles and tltemplates to prop=links and prop=templates respectively,
- similar to prop=categories's clcategorie
+ similar to prop=categories's clcategorie.
* (bug 23834) Invalid "thumbwidth" and "thumbheight" in "imageinfo" query when
- thumbnailing larger than original image
-* (bug 23835) Need "thumbmime" result in "imageinfo" query
-* (bug 23851) Repair diff for file redirect pages
-* (bug 24009) Include implicit groups in action=query&list=users&usprop=groups
+ thumbnailing larger than original image.
+* (bug 23835) Need "thumbmime" result in "imageinfo" query.
+* (bug 23851) Repair diff for file redirect pages.
+* (bug 24009) Include implicit groups in action=query&list=users&usprop=groups.
* (bug 24016) API: Handle parameters specified in simple string syntax
- ( 'paramname' => 'defaultval' ) correctly when outputting help
-* (bug 24089) Logevents causes PHP Notice if leprop=title isn't supplied
-* (bug 23473) Give description of properties on all modules
+ ( 'paramname' => 'defaultval' ) correctly when outputting help.
+* (bug 24089) Logevents causes PHP Notice if leprop=title isn't supplied.
+* (bug 23473) Give description of properties on all modules.
* (bug 24136) unknownerror when adding new section without summary, but
- forceditsummary
-* (bug 16886) Sister projects box moves down the extract of the first result
- in IE 7.
-* (bug 22339) Added srwhat=nearmatch to list=search to get a "go" result
+ forceditsummary.
+* (bug 22339) Added srwhat=nearmatch to list=search to get a "go" result.
* (bug 24303) Added new &servedby parameter to all actions which adds the
hostname that served the request to the result. It is also added
- unconditionally on error
+ unconditionally on error.
* (bug 24185) Titles in the Media and Special namespace are now supported for
title normalization in action=query. Special pages have their name resolved
to the local alias.
* (bug 24296) Added converttitles parameter to convert titles to their
canonical language variant.
-* (bug 17398) Fixed "link" parameter in image links with "thumb" or "frame"
- parameter.
-* (bug 23936) Add "displaytitle" to query/info API
+* (bug 23936) Add "displaytitle" to query/info API.
* (bug 24485) Make iwbacklinks a generator, optionally display iwprefix and
- iwtitle
+ iwtitle.
* (bug 24564) Fix fatal errors when using list=deletedrevs, prop=revisions or
one of the backlinks generators with limit=max.
-* (bug 24656) API's parse module needs option to disable PP report
+* (bug 24656) API's parse module needs option to disable PP report.
* PARAM_REQUIRED parameter flag added. If this flag is set, and the end user
does not set the parameter, the API will automatically throw an error.
* (bug 24665) When starttimestamp is not specified, fake it by setting it to
- NOW, not to the timestamp of the last edit
+ NOW, not to the timestamp of the last edit.
* (bug 24677) axto= parameters added to allcategories, allimages, alllinks,
- allmessages, allpages, and allusers
+ allmessages, allpages, and allusers.
* (bug 24236) Add add, remove, add-self, remove-self tags to
- meta=siteinfo&siprop=usergroups
-* (bug 24484) Add prop=pageprops module
-* (bug 24330) Add &redirect parameter to ?action=edit
+ meta=siteinfo&siprop=usergroups.
+* (bug 24484) Add prop=pageprops module.
+* (bug 24330) Add &redirect parameter to ?action=edit.
* (bug 24722) For list=allusers&auprop=blockinfo, only show blockedby and
blockreason if the user is actually blocked.
-* Add format=dump and format=dumpfm, outputs results in PHP's var_dump() format
+* Add format=dump and format=dumpfm, outputs results in PHP's var_dump() format.
* For required string parameters, if '' is provided, this is now classed as
- missing
-* (bug 24724) list=allusers is out by 1 (shows total users - 1)
-* (bug 24166) API error when using rvprop=tags
+ missing.
+* (bug 24724) list=allusers is out by 1 (shows total users - 1).
+* (bug 24166) API error when using rvprop=tags.
* Introduced "asynchronous download" mode for upload-by-url. Requires
$wgAllowAsyncCopyUploads to be true.
* sinumberingroup correctly gives size of 'user' group, and omits size of
implicit groups rather than showing 0.
-* (bug 25248) API: paraminfo errors with certain modules
-* (bug 25303) Fix API parameter integer validation to actually enforce
- validation on the input values in addition to giving a warning. Also add flag
- to enforce (die) if integer out of range (breaking change!)
+* (bug 25248) API: paraminfo errors with certain modules.
* (bug 24792) API help for action=purge sometimes wrongly stated whether a
- POST request was needed due to cache pollution
-* Added iiprop=parsedcomment to prop=imageinfo, similar to prop=revisions
+ POST request was needed due to cache pollution.
+* Added iiprop=parsedcomment to prop=imageinfo, similar to prop=revisions.
* Added rvparse to parse revisions. For performance reasons if this option is
used, rvlimit is enforced to 1.
* (bug 25748) If a action=parse request provides an oldid that is actually the
- current revision id, try the parser cache, and save it to it if necessary
+ current revision id, try the parser cache, and save it to it if necessary.
* (bug 25463) Export header should not be shown if no pages were requested, to
- reduce confusion
-* (bug 25648) API discovery information has been added as RSD link in page
+ reduce confusion.
+* (bug 25648) API discovery information has been added as RSD link in page.
<head> and by providing an API module action=rsd. Added hook
ApiRsdServiceApis for extensions to add their own service to the services
list.
* The HTML of diff output markers has changed. Hyphens are now minus signs,
- empty markers are now filled with non-breaking-space characters
-* (bug 25741) Add more data to list=search's srprop
+ empty markers are now filled with non-breaking-space characters.
+* (bug 25741) Add more data to list=search's srprop.
* (bug 25760) counter property still reported by the API when
- $wgDisableCounters enabled
-* (bug 25987) prop=info&inprop=watched now also works for missing pages
-* (bug 26006) prop=langlinks now allows obtaining full URL
-* (bug 26075) ApiDelete.php now calls correctly ArticleDelete hook
-* (bug 26089) add block expiration to blockinfo
+ $wgDisableCounters enabled.
+* (bug 25987) prop=info&inprop=watched now also works for missing pages.
+* (bug 26006) prop=langlinks now allows obtaining full URL.
+* (bug 26075) ApiDelete.php now calls correctly ArticleDelete hook.
+* (bug 26089) add block expiration to blockinfo.
* (bug 26125) prop=imageinfo&iiprop=size now returns the page count if the
- file is a multi-page file
-* (bug 10268) Added linktodiffs parameter on action=feedwatchlist
-* (bug 26219) Show API limits for multi values in description
+ file is a multi-page file.
+* (bug 10268) Added linktodiffs parameter on action=feedwatchlist.
+* (bug 26219) Show API limits for multi values in description.
+* (bug 28070) Fix watchlist RSS for databases that store timestamps in a
+ real timestamp field.
+* (bug 27722) list=filearchive now supports revdel.
-=== Languages updated in 1.17 ===
+=== Language support changes in 1.17 ===
-MediaWiki supports over 330 languages. Many localisations are updated
-regularly. Below only new and removed languages are listed, as well as
-changes to languages because of Bugzilla reports.
+MediaWiki supports over 330 languages. Many localizations are updated regularly.
+
+The following languages were added:
+
+* Moroccan Spoken Arabic (ary)
+* Banjar (bjn)
+* Kabardian (kdb)
+* Kabardian (Cyrillic) (kbd-cyrl)
+* Latgalian (ltg)
+* Minangkabau (min)
+* Dutch (informal) (nl-informal)
+* Rusyn (rue)
-* Moroccan Spoken Arabic (ary) (new)
-* Banjar (bjn) (new)
-* Danish (dk) (removed deprecated language code)
-* Fiji Hindi (Devangari script) (removed)
-* Kabardian (kdb) (new, dummy)
-* Kabardian (Cyrillic) (kbd-cyrl) (new)
-* Latgalian (ltg) (new)
-* Minangkabau (min) (new)
-* Dutch (informal) (nl-informal) (new)
-* Rusyn (rue) (new)
+Other significant changes to MediaWiki's language support:
+* Fiji Hindi (Devangari script) was removed.
+* Removed deprecated language code "dk" (Danish), use "da" instead.
+* Link trail added for sl and sh.
+* (bug 27633) Add characters to linkTrail for Portuguese (pt and pt-br).
* (bug 23156) Commafy and search normalization updated for Belarusian
(Taraškievica).
* (bug 23283) Native name for Old English -> Ænglisc.
@@ -1381,6 +2429,27 @@ changes to languages because of Bugzilla reports.
* (bug 24917) Polish as fallback for Kashubia.
* (bug 24794) Tatar link trail updated.
* Esperanto date format corrected.
+* (bug 28159) Change interwiki name of language kbd to КъÑбÑÑ€Ð´ÐµÐ¸Ð±Ð·Ñ /
+ Qabardjajəbza.
+* (bug 28184) Namespaces for the Latgalian Wikipedia.
+* (bug 25010) Bashkir-language interwikis: linktext change from Башҡорт
+ to БашҡортÑа.
+* (bug 26395) Change name of Cornish language to Kernowek.
+
+=== Other changes in 1.17 ===
+
+* DatabaseFunctions.php that was needed for compatibility with pre-1.3
+ extensions has been removed.
+* XmlFunctions.php has been removed. Use the Xml or Html classes as appropriate.
+* The FailFunction "error handling" method has now been removed
+* Sysops now have the "suppressredirect" right by default
+* Removed $wgRemoteUploads. It was not well supported and superseded by
+ $wgUploadNavigationUrl.
+* (bug 26253) $wgPostCommitUpdateList has been removed
+* The PHPUnit test suite has been removed from this release due to serious issues
+ which should be resolved by the 1.18 release.
+* Oracle DB now uses the __destruct fuction to commit/close connection as it
+ doesn't commit on close if transation is triggered in OCI.
== MediaWiki 1.16 ==
@@ -1449,8 +2518,8 @@ changes to languages because of Bugzilla reports.
exist. In that case the URL will get (?|&)wpDestFile=<filename> appended to
it as appropriate.
* If $wgLocaltimezone is null, use the server's timezone as the default for
- signatures. This was always the behaviour documented in DefaultSettings.php
- but has not been the actual behaviour for some time: instead, UTC was used
+ signatures. This was always the behavior documented in DefaultSettings.php
+ but has not been the actual behavior for some time: instead, UTC was used
by default.
* Added $wgExtensionAssetsPath, to decouple assets serving from $wgScriptPath.
If not specified it will default to $wgScriptPath/extensions
@@ -3647,7 +4716,7 @@ Other changes in this release:
* (bug 12644) Template list on edit page now sorted on preview
* (bug 14058) Support pipe trick for namespaces and interwikis with "-"
* Message name filter on Special:Allmessages now case-insensitive
-* (bug 13943) Fix image redirect behaviour on image pages
+* (bug 13943) Fix image redirect behavior on image pages
* (bug 14093) Do 'sysop' => 'protect' magic in Title::isValidMoveOperation
* (bug 14063) Power search form missing <label> for redirects check
* (bug 14111) Similar filename warning links now lead to correct page
@@ -3870,7 +4939,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
to not check and assume they are always up to date)
* The rollback permission can now be rate-limited using the normal mechanism.
* New configuration variable $wgExtraLanguageNames
-* Behaviour of $wgAddGroups and $wgRemoveGroups changed. New behaviour:
+* Behavior of $wgAddGroups and $wgRemoveGroups changed. New behavior:
* * Granting the userrights privilege allows arbitrary changing of rights.
* * Without the userrights privilege, a user will be able to add and/or
remove the groups specified in $wgAddGroups and $wgRemoveGroups for
@@ -4282,7 +5351,7 @@ the removal of this double-parse. Please see the wiki page for examples.
Message transformation mode has been removed, and replaced with "preprocess"
mode. This means that some MediaWiki namespace messages may need to be updated,
-especially ones which took advantage of the terribly counterintuitive behaviour
+especially ones which took advantage of the terribly counterintuitive behavior
of the former message mode.
The header identification routines for section edit and for numbering section
@@ -4292,7 +5361,7 @@ template expansion will still be rendered into a heading tag, and will get an
entry in the TOC, but will not have a section edit link. HTML-style headings
will also not have a section edit link. Valid wikitext headings present in the
template source text will get a template section edit link. This is a major
-break from previous behaviour, but I believe the effects are almost entirely
+break from previous behavior, but I believe the effects are almost entirely
beneficial.
The main motivation for making these changes was performance. The new two-pass
@@ -4499,7 +5568,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
enabled by default.
* Added option to install to MyISAM
* (bug 9250) Remove hardcoded minimum image name length of three characters
-* Fixed DISPLAYTITLE behaviour to reject titles which don't normalise to the
+* Fixed DISPLAYTITLE behavior to reject titles which don't normalise to the
same title as the current page, and enabled per default
* Wrap site CSS and JavaScript in a <pre> tag, like user JS/CSS
* (bug 10196) Add classes and dir="ltr" to the <pre>s on CSS and JS pages (new
@@ -4781,7 +5850,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
* Fix upload form display in right-to-left languages
* Fixed regression in blocking of username '0'
* (bug 9437) Don't overwrite edit form submission handler when setting up
- edit box scroll position preserve/restore behaviour
+ edit box scroll position preserve/restore behavior
* (bug 10805) Fix "undo" link when viewing the diff of the most recent
change to a page using "diff=0"
* (bug 10765) img_auth.php will now refuse logged-out requests where
@@ -5327,7 +6396,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
to image/svg+xml after loading from the database.
* Workaround for djvutoxml bug #1704049 (poor performance). Use djvudump
instead.
-* Fixed odd behaviour in ImagePage on DjVu thumbnailing errors
+* Fixed odd behavior in ImagePage on DjVu thumbnailing errors
* (bug 5439) "Go" title search will now jump to shared/foreign Image: and
MediaWiki: pages that have not been locally edited.
* (bug 9630) Limits links in Whatlinkshere forgot about namespace filter
@@ -5933,7 +7002,7 @@ setting since version 1.2.0. If you have it on, turn it *off* if you can.
* New maintenance script to show the cached statistics : showStats.php.
* Count deleted edits when regenerating total edits in maintenance/initStats.php
* (bug 3706) Allow users to be exempted from IP blocks. The ipblock-exempt permission
- key has been added to enable this behaviour, by default assigned to sysops.
+ key has been added to enable this behavior, by default assigned to sysops.
* (bug 7948) importDump.php now warn that Recentchanges need to be rebuild.
* (bug 7667) allow XHTML namespaces customization
* (bug 8531) Correct local name of Lingála (patch by Raymond)
@@ -6212,7 +7281,7 @@ they will be run along with the main tests by maintenance/parserTests.php
* (bug 6642) Don't offer to unlock the database when it isn't locked
* cleanupTitles.php changed from --dry-run option to --fix, so default
behavior is now a non-invasive check as with namespaceDupes.php
-* (bug 6660) Fix behaviour of EditPage::blockedPage() when the article does
+* (bug 6660) Fix behavior of EditPage::blockedPage() when the article does
not exist; now doesn't show the source box if the user hasn't provided it
(blocked mid-edit) and the page doesn't exist
* Improve default value of "blockedtext"
@@ -6373,7 +7442,7 @@ they will be run along with the main tests by maintenance/parserTests.php
* (bug 6023) Fixed mismatch of 0/NULL for wl_notificationtimestamp; now notification
mails are working after 'Mark all pages visited' button on Special:Watchlist is clicked
* Made {{INT:}} a core parser function instead of a special case. The syntax
- and behaviour is largely unchanged.
+ and behavior is largely unchanged.
* (bug 7448) Fixing the native name for Ewe (ee)
* (bug 6864) Replace message 'editing' with new message 'editinguser' in Special:Userrights
to allow better localisation
@@ -9251,7 +10320,7 @@ pages for purposes of page relevancy ranking.
* (bug 1283) Use underlining and borders to highlight additions/deletions
in diff-view
* Use user's local timezone in Special:Log display
-* Show filename for images in gallery by default (restore beta 3 behaviour)
+* Show filename for images in gallery by default (restore beta 3 behavior)
* (bug 1201) Double-escaping in brokenlinks, imagelinks, categorylinks, searchindex
* When using squid reverse proxy, cache the redirect to the Main_Page
* (bug 1302) Fix Norwegian language file
diff --git a/INSTALL b/INSTALL
index c4bb8be9..891be734 100644
--- a/INSTALL
+++ b/INSTALL
@@ -18,9 +18,10 @@ work on Windows as well.
If your PHP is configured as a CGI plug-in rather than an Apache module you may
experience problems, as this configuration is not well tested. safe_mode is also
-not tested and unlikely to work.
+not tested and unlikely to work.
-If you want math support see the instructions in math/README
+Support for rendering mathematical formulas requires installing the Math extension,
+see http://www.mediawiki.org/wiki/Extension:Math
Don't forget to check the RELEASE-NOTES file...
@@ -34,7 +35,7 @@ http://www.mediawiki.org/wiki/Manual:Installation_guide
******************* WARNING *******************
-REMEMBER: ALWAYS BACK UP YOUR DATABASE BEFORE
+REMEMBER: ALWAYS BACK UP YOUR DATABASE BEFORE
ATTEMPTING TO INSTALL OR UPGRADE!!!
******************* WARNING *******************
@@ -45,12 +46,15 @@ In-place web install
Decompress the MediaWiki installation archive either on your server, or on your
local machine and upload the directory tree. Rename it from "mediawiki-1.x.x" to
-something nice, like "wiki", since it'll be in your URL.
+something nice, like "wiki", since it will be appearing in your URL,
+ie. /wiki/index.php/Article.
+--------------------------------------------------------------------------+
- | Hint: If you plan to use a fancy URL-rewriting scheme to prettify your |
- | URLs, you should put the files in a *different* directory from the |
- | virtual path where page names will appear. |
+ | Note: If you plan to use a fancy URL-rewriting scheme to prettify your |
+ | URLs, such as http://www.example.com/wiki/Article, you should put the |
+ | files in a *different* directory from the virtual path where page names |
+ | will appear. It is common in this case to use w as the folder name and |
+ | /wiki/ as the virtual article path where your articles pretend to be. |
| |
| See: http://www.mediawiki.org/wiki/Manual:Short_URL |
+--------------------------------------------------------------------------+
diff --git a/README b/README
index 805b8ee4..c9ce5db4 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-For system requirements, installation and upgrade details, see the files
+For system requirements, installation and upgrade details, see the files
RELEASE-NOTES, INSTALL, and UPGRADE.
== MediaWiki ==
@@ -62,7 +62,7 @@ Sections of code written exclusively by Lee Crocker or Erik Moeller are also
released into the public domain, which does not impair the obligations of users
under the GPL for use of the whole code or other sections thereof.
-MediaWiki makes use of the Sajax Toolkit by modernmethod,
+MediaWiki makes use of the Sajax Toolkit by modernmethod,
http://www.modernmethod.com/sajax/ which has the following license:
'This work is licensed under the Creative Commons Attribution
diff --git a/README.mediawiki b/README.mediawiki
new file mode 100644
index 00000000..c9ce5db4
--- /dev/null
+++ b/README.mediawiki
@@ -0,0 +1,122 @@
+For system requirements, installation and upgrade details, see the files
+RELEASE-NOTES, INSTALL, and UPGRADE.
+
+== MediaWiki ==
+
+MediaWiki is the software used for Wikipedia [http://www.wikipedia.org/] and the
+other Wikimedia Foundation websites. Compared to other wikis, it has an
+excellent range of features and support for high-traffic websites using
+multiple servers (Wikimedia sites peak in the 100K+ requests per second range
+as of January 2012).
+
+While quite usable on smaller sites, you may find you have to "roll your own"
+local documentation, and some aspects of configuration may seem overcomplicated
+because MediaWiki is primarily targeted as an in-house tool.
+
+The MediaWiki software was written by:
+* Lee Daniel Crocker
+* Magnus Manske
+* Jan Hidders
+* Brion Vibber
+* Axel Boldt
+* Geoffrey T. Dairiki
+* Tomasz Wegrzanowski
+* Erik Moeller
+* Tim Starling
+* Gabriel Wicke
+* Antoine Musso
+* Evan Prodromou
+* Ævar Arnfjörð Bjarmason
+* Niklas Laxström
+* Domas Mituzas
+* Rob Church
+* Jens Frank
+* Yuri Astrakhan
+* Aryeh Gregor
+* Aaron Schulz
+* Andrew Garrett
+* Raimond Spekking
+* Alexandre Emsenhuber
+* Siebrand Mazeland
+* Chad Horohoe
+* Roan Kattouw
+* Trevor Pascal
+* Bryan Tong Minh
+* Sam Reed
+* Victor Vasiliev
+* Rotem Liss
+* Platonides
+* Many others (view CREDITS for a more complete list)
+
+The contributors hold the copyright to this work, and it is licensed under the
+terms of the GNU General Public License, version 2 or later (see
+http://www.fsf.org/licensing/licenses/gpl.html). Derivative works and later
+versions of the code must be free software licensed under the same or a
+compatible license. This includes "extensions" that use MediaWiki functions or
+variables; see http://www.gnu.org/licenses/gpl-faq.html#GPLAndPlugins for
+details.
+
+The Wikimedia Foundation currently has no legal rights to the software.
+
+Sections of code written exclusively by Lee Crocker or Erik Moeller are also
+released into the public domain, which does not impair the obligations of users
+under the GPL for use of the whole code or other sections thereof.
+
+MediaWiki makes use of the Sajax Toolkit by modernmethod,
+http://www.modernmethod.com/sajax/ which has the following license:
+
+ 'This work is licensed under the Creative Commons Attribution
+ License. To view a copy of this license, visit
+ http://creativecommons.org/licenses/by/2.0/ or send a letter
+ to Creative Commons, 559 Nathan Abbott Way,
+ Stanford, California 94305, USA.'
+
+MediaWiki use Creative Commons license marks to points to their online
+licenses. This content is trademarked and used under a specific license
+available at http://creativecommons.org/policies#trademark
+The restricted content is:
+
+* skins/common/images/cc-by-nc-sa.png
+* skins/common/images/cc-by-sa.png
+
+Many thanks to the Wikimedia regulars for testing and suggestions.
+
+The official website for MediaWiki is located at:
+
+ http://www.mediawiki.org/
+
+The code is currently maintained in a Git repository at
+gerrit.wikimedia.org. See http://www.mediawiki.org/wiki/Git for details.
+
+Please report bugs and make feature requests in our Bugzilla system:
+
+* https://bugzilla.wikimedia.org/
+
+Documentation and discussion on new features may be found at:
+
+* http://www.mediawiki.org/wiki/Manual:FAQ
+* http://www.mediawiki.org/wiki/Documentation
+* http://www.mediawiki.org/wiki/Development
+
+Extensions are listed at:
+
+* http://www.mediawiki.org/wiki/Category:Extensions
+
+If you are setting up your own wiki based on this software, it is highly
+recommended that you subscribe to mediawiki-announce:
+
+* https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+
+The mailing list is very low volume, and is intended primarily for announcements
+of new versions, bug fixes, and security issues.
+
+A higher volume support mailing list can be found at:
+
+* https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+Developer discussion takes place at:
+
+* https://lists.wikimedia.org/mailman/listinfo/wikitech-l
+
+There is also a development and support channel #mediawiki on irc.freenode.net,
+and an unoffical support forum at www.mwusers.com.
diff --git a/RELEASE-NOTES-1.20 b/RELEASE-NOTES-1.20
deleted file mode 100644
index d4f399a0..00000000
--- a/RELEASE-NOTES-1.20
+++ /dev/null
@@ -1,500 +0,0 @@
-= MediaWiki release notes =
-
-Security reminder: MediaWiki does not require PHP's register_globals
-setting since version 1.2.0. If you have it on, turn it '''off''' if you can.
-
-
-== MediaWiki 1.20.6 ==
-
-This is a security and maintenance release of the MediaWiki 1.20 branch.
-
-=== Changes since 1.20.5 ===
-* (bug 48306) SECURITY: Run file validation checks on chunked uploads, and chunks
- of upload, during the upload process.
-* (bug 44327) mediawiki.user: Use session ID instead of 1-year cross-session cookies
-* (bug 47202) wikibits: FF2Fixes.css should not be loaded in Firefox 20.
-* (bug 31044) Make ResourceLoader behave in read-only mode
-
-== MediaWiki 1.20.5 ==
-
-This is a security and maintenance release of the MediaWiki 1.20 branch.
-
-=== Changes since 1.20.4 ===
-* (bug 46590) Add hook AbortChangePassword to Special:ChangePassword
-* (bug 47304) SECURITY: Check SVG xml encoding against whitelist
-* Localisation updates from http://translatewiki.net.
-* mwdocgen.php: Implement --version option.
-* Remove svnstat stuff used in Doxygen generation
-* (bug 43594) Correctly supress warnings that were missed after the upstream
- PHP change to E_STRICT being included in E_ALL.
-* jshint: Allow global mw to be set in mediawiki.js
-
-== MediaWiki 1.20.4 ==
-
-This is a security release of the MediaWiki 1.20 branch.
-
-=== Changes since 1.20.3 ===
-* (bug 47251) SECURITY: Disable external entities in Import
-* (bug 46859) SECURITY: Disable external entities in XMLReader
-* (bug 46084) SECURITY: Sanitize $limitReport before outputting
-
-== MediaWiki 1.20.3 ==
-
-This is a security and maintenance release of the MediaWiki 1.20 branch.
-
-=== Changes since 1.20.2 ===
-* New preference type - 'api'. Preferences of this type are not shown on
- Special:Preferences, but are still available via the action=options API.
-* (bug 44010) Context is passed to UserGetLanguageObject.
-* The recursion guard on RequestContext::getLanguage() was weakened.
-* (bug 40585) Don't drop 'step="any"' in HTML input fields.
-* (bug 44024) Fixed problems in ObjectCache when using XCache.
-* (bug 44010) FauxRequest leaked cookie data from primary request.
-* (bug 44135/42441) Pass '2' instead of 'true' to CURLOPT_SSL_VERIFYHOST
-* (bug 43518) API action=unblock should return the user name, not the full
- user object
-* (Bug 45355) Prevent read of arbitrary files through mwdoc-filter.php
-
-== MediaWiki 1.20.2 ==
-
-This is a maintenance release of the MediaWiki 1.20 branch.
-
-=== Changes since 1.20.1 ===
-* (bug 42638) Fix API action=options&reset=1 & unit tests.
-* (bug 42370) Fixed backport of 60cc060 to use mDoneWrites.
-
-== MediaWiki 1.20.1 ==
-
-This is a security release of the MediaWiki 1.20 branch.
-
-=== Changes since 1.20 ===
-* (bug 42202) Validate options to prevent html injection
-* (bug 40995) Prevent session fixation in Special:UserLogin (CVE-2012-5391)
-* (bug 41400) Prevent linker regex from exceeding PCRE backtrack limit
-* Javscript Lint fixes
-* (bug 40632) Remove CleanupPresentationalAttributes feature
-* [Database] Fixed case where trx idle callbacks might be lost.
-
-== MediaWiki 1.20 ==
-
-MediaWiki 1.20 is a stable release.
-
-=== PHP 5.3 now required ===
-Since 1.20, the lowest supported version of PHP is now 5.3.2. Please
-upgrade PHP if you have not done so prior to upgrading MediaWiki.
-
-=== Configuration changes in 1.20 ===
-* $wgGitRepositoryViewers defines a mapping from Git remote repository to the
- Gitweb instance URL used in Special:Version.
-* `$wgUsePathInfo = true;` is no longer needed to make $wgArticlePath work on servers
- using like nginx, lighttpd, and apache over fastcgi. MediaWiki now always extracts
- path info from REQUEST_URI if it's available.
-* The user right 'upload_by_url' is no longer given to sysops by default.
- This only affects installations which have $wgAllowCopyUploads set to true.
-* Removed f-prot support from $wgAntivirusSetup.
-* New variable $wgDBerrorLogTZ to provide dates in the error log in a
- different timezone than the wiki timezone set by $wgLocaltimezone.
-* New variables $wgDBssl and $wgDBcompress to enable SSL and compression for database
- connections, if either are available for the selected DB type.
-* $wgUseCombinedLoginLink now defaults to false, making MediaWiki output separate
- login and create account links by default.
-
-=== New features in 1.20 ===
-* Added TitleIsAlwaysKnown hook which gets called when determining if a page exists.
-* Added NamespaceIsMovable hook which gets called when determining if pages in a
- certain namespace can be moved.
-* Added SpecialPageBeforeExecute hook which gets called before SpecialPage::execute.
-* Added SpecialPageAfterExecute hook which gets called after SpecialPage::execute.
-* Added ORMTable, ORMRow and ORMResult classes for additional abstraction of
- database interaction.
-* Added CacheHelper and associated SpecialCachedPage and CachedAction helper classes.
-* (bug 32341) Add upload by URL domain limitation.
-* &useskin=default will now always display the default skin. Useful for users with a
- preference for the non-default skin to look at something using the default skin.
-* (bug 27619) Remove preference option to display broken links as link?
-* (bug 34896) jQuery JSON plugin upgraded to v2.3 (2011-09-17).
-* (bug 34302) Add CSS classes to email fields in user preferences.
-* Introduced $wgDebugDBTransactions to trace transaction status (currently PostgreSQL only).
-* (bug 23795) Add parser itself to ParserMakeImageParams hook.
-* Introduce a cryptographic random number generator source api for use when
- generating various tokens.
-* (bug 30963) Option on Special:Prefixindex and Special:Allpages to not show redirects.
-* (bug 18062) New message when edit or create the local page of a shared file.
-* (bug 22870) Separate interface message when creating a page.
-* (bug 17615) nosummary option should be reassigned on preview/captcha.
-* (bug 34355) Add a variable and parser function for the namespace number.
-* (bug 35649) Special:Version now shows hashes of extensions checked out from git.
-* (bug 35728) Git revisions are now linked on Special:Version.
-* "Show Changes" on default messages shows now diff against default message text
-* (bug 23006) create #speciale parser function.
-* generateSitemap can now optionally skip redirect pages.
-* (bug 27757) New API command just for retrieving tokens (not page-based).
-* Added GitViewers hook for extensions using external git repositories to have a web-based
- repository viewer linked to from Special:Version.
-* Memcached debug logs can now be sent to their own file logs by setting
- $wgDebugLogFile['memcached'] to some filepath.
-* (bug 35685) api.php URL and other entry point URLs are now listed on
- Special:Version
-* Edit notices can now be translated.
-* jQuery upgraded to 1.8.2.
-* jQuery UI upgraded to 1.8.23.
-* QUnit upgraded from v1.2.0 to v1.10.0.
-* (bug 37604) jquery.cookie upgraded to 2011 version.
-* (bug 22887) Add warning and tracking category for preprocessor errors
-* (bug 31704) Allow selection of associated namespace on the watchlist
-* (bug 5445) Now remove autoblocks when a user is unblocked.
-* Added $wgLogExceptionBacktrace, on by default, to allow logging of exception
- backtraces.
-* Added device detection for determining device capabilities.
-* QUnit.newMwEnvironment now supports passing a custom setup and/or teardown function.
- Arguments signature has changed. First arguments is now an options object of which
- 'config' can be a property. Previously 'config' itself was the first and only argument.
-* New getCreator and getOldestRevision methods added to WikiPage class
-* (bug 4220) the XML dump format schema now have unique identity constraints
- for page and revision identifiers. Patch by Elvis Stansvik.
-* cleanupSpam.php now can delete spam pages if --delete was specified instead of blanking
- them.
-* Added new hook ChangePasswordForm to allow adding of additional fields in Special:ChangePassword
-* Added new function getDomain to AuthPlugin for getting a user's domain
-* (bug 23427) New magic word {{PAGEID}} which gives the current page ID.
- Will be null on previewing a page being created.
-* (bug 37627) UserNotLoggedIn() exception to show a generic error page whenever
- a user is not logged in.
-* Watched status in changes lists are no longer indicated by <strong></strong>
- tags with class "mw-watched". Instead, each line now has a class
- "mw-changeslist-line-watched" or "mw-changeslist-line-not-watched", and the
- title itself is surrounded by <span></span> tags with class "mw-title".
-* Added ContribsPager::reallyDoQuery hook allowing extensions to data to MyContribs
-* Added new hook ParserAfterParse to allow extensions to affect parsed output
- after the parse is complete but before block level processing, link holder
- replacement, and so on.
-* (bug 34678) Added InternalParseBeforeSanitize hook which gets called during Parser's
- internalParse method just before the parser removes unwanted/dangerous HTML tags.
-* Added new hook AfterFinalPageOutput to allow modifications to buffered page output before sent
- to the client.
-* (bug 36783) Implement jQuery Promise interface in mediawiki.api module.
-* Make dates in sortable tables sort according to the page content language
- instead of the site content language
-* (bug 37926) Deleterevision will no longer allow users to delete log entries,
- the new deletelogentry permission is required for this.
-* (bug 14237) Allow PAGESINCATEGORY to distinguish between 'all', 'pages', 'files'
- and 'subcats'
-* (bug 38362) Make Special:Listuser includeable on wiki pages.
-* Added support in jquery.localize for placeholder attributes.
-* (bug 38151) Implemented mw.user.getRights for getting and caching the current
- user's user rights.
-* Session storage can now configured independently of general object cache
- storage, by using $wgSessionCacheType. $wgSessionsInMemcached has been
- renamed to $wgSessionsInObjectCache, with the old name retained for backwards
- compatibility. When this feature is enabled, the expiry time can now be
- configured with $wgObjectCacheSessionExpiry.
-* Added a Redis client for object caching.
-* Implemented mw.user.getGroups for getting and caching user groups.
-* (bug 37830) Added $wgRequirePasswordforEmailChange to control whether password
- confirmation is required for changing an email address or not.
-* HTMLForm mutators can now be chained (they return $this)
-* A new message, "api-error-filetype-banned-type", is available for formatting
- API upload errors due to the file extension blacklist.
-* New hook 'ParserTestGlobals' allows to set globals before running parser tests.
-* Allow importing pages as subpage.
-* Add lang and hreflang attributes to language links on Login page.
-* (bug 22749) Create Special:MostInterwikis.
-* Show change tags when transclude Special:Recentchanges(linked) or Special:Newpages.
-* (bug 23226) Add |class= parameter to image links in order to add class(es) to HTML img tag.
-* (bug 39431) SVG animated status is now shown in long description.
-* (bug 39376) jquery.form upgraded to 3.14.
-* SVG files will now show the actual width in the SVG's specified units
- in the metadata box.
-* Added ResourceLoader module "jquery.jStorage" (v0.3.0, http://jStorage.info/).
-* (bug 39273) Added AJAX support for "Show changes" (diff) in LivePreview.
-* Added ResourceLoader module "jquery.badge".
-* mw.util.$content now points to the overall content area in the skin rather than just
- page text content area. If you need the old behaviour please use $( '#mw-content-text').
-* jsMessage has been replaced with a floating bubble notification system complete
- with auto-hide, multi-message support, and message replacement tags.
-* jquery.messageBox which appears to be unused by both core and extensions has
- been removed.
-* (bug 34939) Made link parsing insensitive ([HttP://]).
-* (bug 40072) Add CSS classes to items in output of ChangesList pages.
-* Added $wgCopyUploadProxy global to define which proxy to use for copy
- uploads.
-* (bug 40448) mediawiki.legacy.mwsuggest has been replaced with a new module,
- mediawiki.searchSuggest, based on SimpleSeach from Extension:Vector.
-* New preference type - 'api'. Preferences of this type are not shown on
- Special:Preferences, but are still available via the action=options API.
-
-=== Known issues in 1.20.0 ===
-These are issues that we're targeting to be fixed in a later release
-in the 1.20 series. Issues may be added or removed from this list as
-we see fit. For now, it is comprised of those bugs on the 1.20.0
-milestone in Bugzilla.
-
-* (bug 35894): Reports of secret key generation "hanging" on windows
- This is probably a bug that has been fixed in PHP. If you run
- into this, try upgrading your PHP.
-* (bug 38334): PHP Notice: Undefined index: href in /www/w/skins/Vector.php on line 416
- We think this is a problem in some extension. If you see this,
- try disabling your extensions and check out the logging patch on
- this bug. Or try this patch:
- <https://gerrit.wikimedia.org/r/#/c/27937/1/skins/Vector.php>
-* (bug 39268): [Regression] Toolbar inserts in main textarea only (instead of the focussed textarea)
- This should only be an issue if you are using the ProofreadPage
- extension.
-* (bug 40641): Clicking "others" in Special:Version asks to download a file
- If you encounter this, you can tell your webserver to serve the
- CREDITS file with text/plain MIME type to fix it.
-
-=== Bug fixes in 1.20 ===
-* (bug 40939): [Regression] InfoAction: Call to a member function getUserText() on a non-object
-* (bug 40780): searchsuggest-containing line ("containing...") doesn't include the entered text
-* (bug 37714): [Regression] Incomplete log entries
-* (bug 27202): API: Add timestamp sort to list=allimages
-* (bug 30245) Use the correct way to construct a log page title.
-* (bug 34237) Regenerate an empty user_token and save to the database
- when we try to set the user's cookies for login.
-* (bug 32210) New edit emails for watched pages always provide a link to the
- edit which triggered the mail.
-* (bug 12021) Added user talk link on Special:Listusers.
-* (bug 34445) section edit and TOC hide/show links are excluded from selection and
- copy/paste on supporting browsers.
-* (bug 34428) Fixed incorrect hash mismatch errors in the DiffHistoryBlob
- history compression method.
-* (bug 34702) Localised parentheses are now used in more special pages.
-* (bug 34723) When editing a script page on a RTL wiki the textbox should be LTR.
-* (bug 34762) Calling close() on a DatabaseBase object now clears the connection.
-* (bug 34863) Show deletion log extract on non-existent file pages if applicable.
-* (bug 28019) Let ?preloadtitle=foo be passed on to target of
- Special:MyPage and Special:MyTalk.
-* (bug 34929) Show the correct diff when a section edit is rejected by the spam
- filter.
-* (bug 15816) Add a switch for SETting the search_path (Postgres).
-* (bug 34521) Returning to the previous page after logging in loses any array-
- valued parameters in the query string.
-* (bug 34735) Updated compressOld.php documentation to mention the different
- usages of -s and -n parameters depending on compression type.
-* (bug 13896) Rendering of devanagari numbers in automatic '#' number lists.
-* (bug 33689) Upgrade to 1.19 on Postgres fails due to incomplete query when.
- trying to defer foreign key for externallinks.
-* (bug 32748) Printer friendly version of article decode Unicode chars as a
- pretty IRI in footer.
-* Removed white border around thumbnails in galleries.
-* (bug 31236) "Next" and "Previous" buttons are shown incorrectly in
- an RTL environment.
-* (bug 35749) Updated maintenance/checkSyntax.php to use Git instead of
- Subversion when invoked with the --modified option.
-* (bug 35069) On history pages, the " . . " separator after the number of
- characters changed in a revision is now suppressed if no text would follow.
-* (bug 18704) Add a unique CSS class or ID to the tagfilter table row at RecentChanges
-* (bug 33564) transwiki import sometimes result in invalid title.
-* (bug 35572) Blocks appear to succeed even if query fails due to wrong DB structure
-* (bug 31757) Add a word-separator between help-messages in HTMLForm
-* (bug 30410) Removed deprecated $wgFilterCallback and the 'filtered' API error.
-* (bug 32604) Some messages needs escaping of wikitext inside username.
-* (bug 36537) Rename wfArrayToCGI to wfArrayToCgi for consistency with wfCgiToArray.
-* (bug 25946) The message on the top of Special:RecentChanges is now displayed.
- in user language instead of content language.
-* (bug 35264) Wrong type used for <ns> in export.xsd
-* (bug 24985) Use $wgTmpDirectory as the default temp directory so that people
- who don't have access to /tmp can specify an alternative.
-* (bug 27283) SqlBagOStuff breaks PostgreSQL transactions.
-* (bug 35727) mw.Api ajax() should put token parameter last.
-* (bug 37708) mw.Uri.clone() should make a deep copy.
-* (bug 38024) ResourceLoader should not create empty stylesheets for modules
- that don't have stylesheets.
-* (bug 36812) Special:ActiveUsers "Hide bots" should hide users from any group
- having the "bot" user right, instead of just the default "bot" user group.
-* (bug 35082) mw.util.addPortletLink incorrectly adds link to mutiple <ul> tags.
-* (bug 36991) jquery.tablesorter should extract date sort format from date
- string instead of global config. Dates like "April 1 2012" and "1 April 2012"
- now sort correctly regardless of the content language's DefaultDateFormat.
-* (bug 31895) mw.loader mode now correct when triggered from a $.fn.ready
- handler that is bound before mediawiki.js's handler (e.g. browser-userscripts
- like greasemonkey).
-* (bug 38152) jquery.tablesorter: Use .data() instead of .attr(), so that live
- values are used instead of just the fixed values from when the tablesorter
- was initialized.
-* (bug 38093) Gender of changed user groups missing in Special:Log/rights
-* (bug 35893) Special:Block needs to load mediawiki.special.block.js.
-* (bug 37331) ResourceLoader modules sometimes execute twice in Firefox
-* (bug 31644) GlobalUsage, CentralAuth and AbuseLog extensions should not use
- insecure links to foreign wikis in the WikiMap.
-* (bug 36073) Avoid duplicate element IDs on File pages.
-* (bug 25095) Special:Categories should also include the first relevant item
- when "from" is filled.
-* (bug 35526) jquery.tablesorter now uses a stable sort.
-* (bug 38953) --memory-limit switch not working for runJobs.php.
-* (bug 33037) Make subpage of Special:newfiles control how many files
- are returned, like in previous versions.
-* (bug 36524) "Show" options on Special:RecentChanges and Special:RecentChangesLinked
- are now remembered between successive clicks.
-* (bug 26069) Page title is no longer "Error" for all error pages.
-* (bug 39297) Show warning if thumbnail of animated image will not be animated.
-* (bug 38249) Parser will throw an exception instead of outputting gibberish if
- PCRE is compiled without support for unicode properties.
-* (bug 30390) Suggested file name on Special:Upload should not contain
- illegal characters.
-* EXIF below sea level GPS altitude data is now shown correctly.
-* (bug 39284) jquery.tablesorter should not consider "."" or "?"" to be a currency.
-* (bug 39273) "Show changes" should not be incorrectly displayed in the Live Preview state.
-* Made body-content lang attribute honor the variant language when it is set.
-* (bug 36761) "Mark pages as visited" now submits previously established filter options.
-* (bug 39635) PostgreSQL LOCK IN SHARE MODE option is a syntax error.
-* (bug 36329) Accesskey tooltips for Firefox 14 on Mac should use "ctrl-option-" prefix.
-* (bug 32552) Drop unused database field cat_hidden from table category.
-* (bug 40214) Category pages no longer use deprecated "width" HTML attribute.
-* (bug 39941) Add missing stylesheets to the installer pages
-* In HTML5 mode, allow new input element types values (such as color, range..)
-* (bug 36151) mw.Title: Don't limit extension in title parsing.
-* (bug 38158) jquery.byteLimit sometimes causes an unexpected 0 maxLength being enforced.
-* (bug 38163) jquery.byteLimit incorrectly limits input when using methods other than
- basic per-char typing.
-* (bug 34495) patrol log now credit the user patrolling (instead of patrolled
- user).
-* (bug 31676) ResourceLoader should work around IE stylesheet limit.
-* (bug 40498) ResourceLoader should not output an empty "@media print { }" block.
-* (bug 40500) ResourceLoader should not ignore media-type for urls in debug mode.
-* (bug 40660) ResourceLoaderWikiModule should not convert "&nbsp;" to a space
- for pages from the MediaWiki-namespace.
-* (bug 40329) (bug 40632) Removed CleanupPresentationalAttributes feature.
-
-=== API changes in 1.20 ===
-* (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
-* (bug 34313) MediaWiki API intro message about "HTML format" should mention
- the format parameter.
-* (bug 32384) Allow descending order for list=watchlistraw.
-* (bug 31883) Limit of bkusers of list=blocks and titles of action=query is
- not documented in API help.
-* (bug 32492) API now allows editing using pageid.
-* (bug 32497) API now allows changing of protection level using pageid.
-* (bug 32498) API now allows comparing pages using pageids.
-* (bug 30975) API import of pages with invalid characters in this wiki leads to Fatal Error.
-* (bug 30488) API now allows listing of backlinks/embeddedin/imageusage per pageid.
-* (bug 34927) Output media_type for list=filearchive.
-* (bug 28814) add properties to output of action=parse.
-* (bug 33224) add variants of content language to meta=siteinfo.
-* (bug 32643) action=purge with forcelinkupdate no longer crashes when ratelimit is reached.
-* The paraminfo module now also contains result properties for most modules.
-* (bug 32348) Allow descending order for list=alllinks.
-* (bug 31777) Upload unknown error ``fileexists-forbidden''.
-* (bug 32382) Allow descending order for list=iwbacklinks.
-* (bug 32381) Allow descending order for list=backlinks, list=embeddedin and list=imageusage.
-* (bug 32383) Allow descending order for list=langbacklinks.
-* API meta=siteinfo can now return the list of known variable IDs.
-* (bug 35980) list=deletedrevs now honors drdir correctly in "all" mode (mode #3).
-* (bug 29290) API avoids mangling fields in continuation parameters
-* (bug 36987) API avoids mangling fields in continuation parameters
-* (bug 30836) siteinfo prop=specialpagealiases will no longer return nonexistent special pages
-* (bug 38190) Add "required" flag to some token params for hint in api docs.
-* (bug 27567) Add file repo support to prop=duplicatefiles.
-* (bug 27610) Add archivename for non-latest image version to list=filearchive
-* (bug 38231) Add xml parse tree to action=parse.
-* Watchlist notification timestamp may be queried by page and may be updated via the API.
-* (bug 38904) prop=revisions&rvstart=... no longer blows up when continuing.
-* (bug 39032) ApiQuery generates help in constructor.
-* (bug 11142) Improve file extension blacklist error reporting in API upload.
-* (bug 39665) Cache AllowedGenerator array so it doesn't autoload all query classes
- on every request.
-
-=== Languages updated in 1.20 ===
-
-MediaWiki supports over 350 languages. Many localisations are updated
-regularly. Below only new and removed languages are listed, as well as
-changes to languages because of Bugzilla reports.
-
-* Emilian (egl) added.
-* Tornedalen Finnish (fit) added.
-* Mizo (lus) added.
-* Santali (sat) added.
-* (bug 34192) Namespace gender aliases for Albanian languages (sq & aln).
-* (bug 35541) Namespace gender aliases for Croatian (hr).
-* (bug 36012) Space in $separatorTransformTable should be non-breaking in
- Portuguese, Esperanto and Udmurt.
-* Turoyo (tru) added.
-* Cyrillic-Latin language converter added for Uzbek (uz).
-
-=== Other changes in 1.20 ===
-* The user_token field is now left empty until a user attempts to login and
- cookies need to be set. It is also now possible to reset every user's
- user_token simply by clearing the values in the user_token column.
-* Removed ./tests/qunit/index.html from core. It wasn't actively maintained and
- has been made obsolete when [[Special:JavaScriptTest/qunit]] was introduced,
- which actually uses ResourceLoader, LocalSettings and the Skin.
-* Removed $wgDBtransactions global. This was only checked in one class
- and only applies to MyISAM or similar DBs. Those should only be used
- for archived sites anyway. We can't get edit conflicts on such sites,
- so the WikiPage code wasn't useful there either.
-* Deprecated mw.user.name in favour of mw.user.getName.
-* Deprecated mw.user.anonymous in favour of mw.user.isAnon.
-* Deprecated DatabaseBase functions newFromParams(), newFromType(), set(),
- quote_ident(), and escapeLike() were removed.
-* Use of __DIR__ instead of dirname( __FILE__ ).
-* OutputPage::wrapWikiMsg() no longer supports the 'options' parameter. It was
- not used and complicated migration to Message class.
-* Live preview functionality has been improved and moved into the
- 'mediawiki.action.edit.preview' module. The old 'mediawiki.legacy.preview' module
- has been removed.
-* (bug 40448) Removed mediawiki.legacy.mwsuggest module, and removed the
- following that has become obsolete:
- - globals $wgEnableMWSuggest and $wgMWSuggestTemplate.
- - mw.config.values wgMWSuggestTemplate and wgSearchNamespaces.
- - method SearchEngine::getMWSuggestTemplate().
-
-== Compatibility ==
-
-MediaWiki 1.20 requires PHP 5.3.2. PHP 4 is no longer supported.
-
-MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for IBM
-DB2 and Oracle.
-
-The supported versions are:
-
-* MySQL 5.0.2 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-
-== Upgrading ==
-
-1.20 has several database changes since 1.19, and will not work without schema
-updates.
-
-If upgrading from before 1.11, and you are using a wiki as a commons
-repository, make sure that it is updated as well. Otherwise, errors may arise
-due to database schema changes.
-
-If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
-new database fields are filled with data.
-
-If you are upgrading from MediaWiki 1.4.x or earlier, some major database
-changes are made, and there is a slightly higher chance that things could
-break. Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.19.x and older releases, see HISTORY.
-
-== Online documentation ==
-
-Documentation for both end-users and site administrators is available on
-MediaWiki.org, and is covered under the GNU Free Documentation License (except
-for pages that explicitly state that their contents are in the public domain):
-
- https://www.mediawiki.org/wiki/Documentation
-
-== Mailing list ==
-
-A mailing list is available for MediaWiki user support and discussion:
-
- https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-A low-traffic announcements-only list is also available:
-
- https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
-
-It's highly recommended that you sign up for one of these lists if you're
-going to run a public MediaWiki, so you can be notified of security fixes.
-
-== IRC help ==
-
-There's usually someone online in #mediawiki on irc.freenode.net.
diff --git a/RELEASE-NOTES-1.21 b/RELEASE-NOTES-1.21
new file mode 100644
index 00000000..ef4f08c6
--- /dev/null
+++ b/RELEASE-NOTES-1.21
@@ -0,0 +1,417 @@
+= MediaWiki release notes =
+
+Security reminder: MediaWiki does not require PHP's register_globals. If you
+have it on, turn it '''off''' if you can.
+
+== MediaWiki 1.21.1 ==
+
+This is a maintenance release of the 1.21 branch.
+
+MediaWiki 1.21 is an stable branch and is recommended for use in production.
+
+=== Changes since 1.21.0 ===
+
+* An incorrect version number was used for 1.21.0. 1.21.1 has the correct number.
+* A problem with the Oracle SQL table creation was fixed.
+* (PdfHandler extension) Fix warning if pdfinfo fails but pdftext succeeds.
+
+=== Configuration changes in 1.21 ===
+* (bug 48306) $wgAllowChunkedUploads has been added and is false by default.
+* (bug 29374) $wgVectorUseSimpleSearch is now enabled by default.
+* Deprecated $wgAllowRealName is removed. Use $wgHiddenPrefs[] = 'realname'
+ instead.
+* (bug 39957) Added $wgUnwatchedPageThreshold, specifying minimum count
+ of page watchers required for the number to be accessible to users
+ without the unwatchedpages permission.
+* $wgBug34832TransitionalRollback has been removed.
+* (bug 29472) $wgUseDynamicDates has been removed and its functionality
+ disabled.
+
+=== New features in 1.21 ===
+* (bug 41769) Add parser method to call parser functions.
+* (bug 38110) Schema changes (adding or dropping tables, indices and
+ fields) can be now be done separately from from other changes that
+ update.php makes. This is useful in environments that use database
+ permissions to restrict schema changes but allow the DB user that
+ MediaWiki normally runs as to perform other changes that update.php
+ makes. Schema changes can be run separately. See the file UPGRADE
+ for more information.
+* (bug 34876) jquery.makeCollapsible has been improved in performance.
+* Added ContentHandler facility to allow extensions to support other content
+ than wikitext. See docs/contenthandler.txt for details.
+* New feature was developed for showing high-DPI thumbnails for high-DPI mobile
+ and desktop displays (configurable with $wgResponsiveImages).
+* Added new backend to represent and store information about sites and site
+ specific configuration.
+* jQuery upgraded from 1.8.2 to 1.8.3.
+* jQuery UI upgraded from 1.8.23 to 1.8.24.
+* Added separate fa_sha1 field to filearchive table. This allows sha1
+ searches with the api in miser mode for deleted files.
+* Add initial and programmatic sorting for tablesorter.
+* Add the event "sortEnd.tablesorter", triggered after sorting has completed.
+* The Job system was refactored to allow for different backing stores for
+ queues as well as cross-wiki access to queues, among other things. The schema
+ for the DB queue was changed to support better concurrency and reduce
+ deadlock errors.
+* Added ApiQueryORM class to facilitate creation of query API modules based on
+ tables that have a corresponding ORMTable class.
+* (bug 40876) Icon for PSD (Adobe Photoshop) file types.
+* (bug 40641) Implemented Special:Version/Credits with a list of contributors.
+* (bug 7851) Implemented one-click AJAX patrolling.
+* The <data>, <time>, <meta>, and <link> elements are allowed within WikiText
+ for use with Microdata.
+* The HTML5 <mark> tag has been whitelisted.
+* Added ParserCloned hook for when the Parser object is cloned.
+* Added AlternateEditPreview hook to allow extensions to replace the page
+ preview from the edit page.
+* Added EditPage::showStandardInputs:options hook to allow extensions to add
+ new fields to the "editOptions" area of the edit form.
+* Upload stash DB schema altered to improve upload performance.
+* The following global functions are now reporting deprecated warnings in
+ debug mode: wfMsg, wfMsgNoTrans, wfMsgForContent, wfMsgForContentNoTrans,
+ wfMsgReal, wfMsgGetKey, wfMsgHtml, wfMsgWikiHtml, wfMsgExt, wfEmptyMsg. Use
+ the Message class, or the global method wfMessage.
+* Added $wgEnableCanonicalServerLink, off by default. If enabled, a
+ <link rel=canonical> tag is added to every page indicating the correct server
+ to use.
+* Debug message emitted by wfDebugLog() will now be prefixed with the group
+ name when its logged to the default log file. That is the case whenever the
+ group has no key in wgDebugLogGroups, that will help triage the default log.
+* (bug 24620) Add types to LogFormatter.
+* jQuery JSON upgraded from 2.3 to 2.4.0.
+* Added GetDoubleUnderscoreIDs hook, for modifying the list of magic words.
+* DatabaseUpdater class has two new methods to ease extensions schema changes:
+ dropExtensionIndex and renameExtensionIndex.
+* New preference type - 'api'. Preferences of this type are not shown on
+ Special:Preferences, but are still available via the action=options API.
+* (bug 39397) Hide rollback link if a user is the only contributor of the page.
+* $wgPageInfoTransclusionLimit limits the list size of transcluded articles
+ on the info action. Default is 50.
+* Added action=createaccount to allow user account creation.
+* (bug 40124) action=options API also allows for setting of arbitrary
+ preferences, provided that their names are prefixed with 'userjs-'. This
+ officially reenables the feature that was undocumented and defective
+ in MW 1.20 (saving preferences using Special:Preferences cleared any
+ additional fields) and which has been disabled in 1.20.1 as a part of
+ a security fix (bug 42202).
+* Added option to specify "others" as author in extension credits using
+ "..." as author name.
+* Added the ability to limit the wall clock time used by shell processes,
+ as well as the CPU time. Configurable with $wgMaxShellWallClockTime.
+* Allow memory of shell subprocesses to be limited using Linux cgroups
+ instead of ulimit -v, which tends to cause deadlocks in recent versions
+ of ImageMagick. Configurable with $wgShellCgroup.
+* Added $wgWhitelistReadRegexp for regex whitelisting.
+* (bug 5346) Categories that are redirects will be displayed italic in
+ the category links section at the bottom of a page.
+* (bug 43915) New maintenance script deleteEqualMessages.php.
+* You can now create checkbox option matrices through the HTMLCheckMatrix
+ subclass in HTMLForm.
+* WikiText now permits the use of WAI-ARIA's role="presentation" inside of
+ html elements and tables. This allows presentational markup, especially
+ tables. To be marked up as such.
+* maintenance/sql.php learned the --cluster option. Let you run the script
+ on some external cluster instead of the primary cluster for a given wiki.
+* (bug 20281) test the parsing of inline URLs.
+* Added Special:PagesWithProp, which lists pages using a particular page property.
+* Implemented language-specific collations for category sorting for 67 languages
+ based in latin, greek and cyrillic alphabets. This allows one to *finally* get
+ articles to be correctly sorted on category pages. They are named
+ 'uca-<langcode>', where <langcode> is one of: af, ast, az, be, bg, br, bs, ca,
+ co, cs, cy, da, de, dsb, el, en, eo, es, et, eu, fi, fo, fr, fur, fy, ga, gd,
+ gl, hr, hsb, hu, is, it, kk, kl, ku, ky, la, lb, lt, lv, mk, mo, mt, nl, no,
+ oc, pl, pt, rm, ro, ru, rup, sco, sk, sl, smn, sq, sr, sv, tk, tl, tr, tt, uk,
+ uz, vi.
+* Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
+* Added 'HistoryRevisionTools' and 'DiffRevisionTools' hooks.
+* Added 'SpecialSearchResultsPrepend' and 'SpecialSearchResultsAppend' hooks.
+* (bug 33186) Add image rotation api "imagerotate"
+* (bug 34040) Add "User rights management" link on user page toolbox.
+* (bug 45526) Add QUnit assertion helper "QUnit.assert.htmlEqual" for asserting
+ structual equality of HTML (ignoring insignificant differences like
+ quotmarks, order and whitespace in the attribute list).
+
+=== Bug fixes in 1.21 ===
+* (bug 48306) Chunked uploads allow arbitrary data to be dropped on the server
+* (bug 47271) $wgContentHandlerUseDB should be set to false during the upgrade
+* (bug 46084) Sanitize $limitReport before outputting.
+* (bug 46859) Disable external entities in XMLReader.
+* (bug 47251) Disable external entities in Import.
+* (bug 42649) PHP Fatal error: Call to a member function isLocal() on a
+ non-object in Title.php.
+* (bug 46493) Special:ProtectedPages results in whitepage when a bad title is protected.
+* (bug 40617) Installer can now customize the logo in LocalSettings.php.
+* (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
+* (bug 40352) fixDoubleRedirects.php should support interwiki redirects.
+* (bug 9237) SpecialBrokenRedirect should not list interwiki redirects.
+* (bug 34960) Drop unused fields rc_moved_to_ns and rc_moved_to_title from
+ recentchanges table.
+* (bug 32951) Do not register internal externals with absolute protocol,
+ when server has relative protocol.
+* (bug 39005) When purging proxies listed in $wgSquidServers using HTTP PURGE
+ method requests, we now send a Host header by default, for Varnish
+ compatibility. This also works with Squid in reverse-proxy mode. If you wish
+ to support Squid configured in forward-proxy mode, set
+ $wgSquidPurgeUseHostHeader to false.
+* (bug 37020) sql.php with readline eats semicolon.
+* (bug 11748) Properly handle optionally-closed HTML tags when Tidy is
+ disabled, and don't wrap HTML-syntax definition lists in paragraphs.
+* (bug 41409) Diffs while editing an old revision should again diff against the
+ current revision.
+* (bug 41494) Honor $wgLogExceptionBacktrace when logging non-API exceptions
+ caught during API execution.
+* (bug 37963) Fixed loading process for user options.
+* (bug 26995) Update filename field on Upload page after having sanitized it.
+* (bug 41793) Contribution links to users with 0 edits on Special:ListUsers
+ didn't show up red.
+* (bug 41899) A PHP notice no longer occurs when using the "rvcontinue" API
+ parameter.
+* (bug 42036) Account creation emails now contain canonical (not
+ protocol-relative) URLs.
+* (bug 41990) Fix regression: API edit with redirect=true and lacking
+ starttimestamp and basetimestamp should not cause an edit conflict.
+* (bug 41706) EditPage: Preloaded page should be converted if possible and
+ needed.
+* (bug 41886) Rowspans are no longer exploded by tablesorter until the table is
+ actually sorted.
+* (bug 2865) User interface HTML elements don't use lang attribute.
+ (completed the fix by adding the lang attribute to firstHeading).
+* (bug 42173) Removed namespace prefixes on Special:UncategorizedCategories.
+* (bug 36053) Log in "returnto" feature forgets query parameters if no
+ title parameter was specified.
+* (bug 42410) API action=edit now returns correct timestamp for the new edit.
+* (bug 14901) Email notification mistakes log action for new page creation.
+ Enotif no longer sends "page has been created" notifications for some log
+ actions. The following events now have a correct message: page creation,
+ deletion, move, restore (undeletion), change (edit). Parameter
+ $CHANGEDORCREATED is deprecated in 'enotif_body' and scheduled for removal in
+ MediaWiki 1.23.
+* (bug 457) In the sidebar of Vector, CologneBlue, Monobook, and Monobook-based
+ skins, the heading levels have been changed from (variously per skin)
+ <h4>, <h5> or <h6> to only <h3>s, with a <h2> hidden heading above them.
+ If you are styling or scripting the headings in a custom way, this change
+ will require updates to your site's CSS or JS.
+* (bug 41342) jquery.suggestions should cancel any active (async) fetches
+ before it triggers another fetch.
+* (bug 42184) $wgUploadSizeWarning missing second variable.
+* (bug 34581) removeUnusedAccounts.php maintenance script now ignores newuser
+ log when determining whether an account is used.
+* (bug 43379) Gracefully fail if rev_len is unavailable for a revision on the
+ History page.
+* (bug 42949) API no longer assumes all exceptions are MWException.
+* (bug 41733) Hide "New user message" (.usermessage) element from printable view.
+* (bug 39062) Special:Contributions will display changes that don't have
+ a parent id instead of just an empty bullet item.
+* (bug 37209) "LinkCache doesn't currently know about this title" error fixed.
+* wfMerge() now works if $wgDiff3 contains spaces
+* (bug 43052) mediawiki.action.view.dblClickEdit.dblClickEdit should trigger
+ ca-edit click instead opening URL directly.
+* (bug 43964) Invalid value of "link" parameter in <gallery> no longer produces
+ a fatal error.
+* (bug 44775) The username field is not pre-filled when creating an account.
+* (bug 45069) wfParseUrl() no longer produces a PHP notice if passed a "mailto:"
+ URL without address
+* (bug 45012) Creating an account by e-mail can no longer show a
+ "password mismatch" error.
+* (bug 44599) On Special:Version, HEADs for submodule checkouts (e.g. for
+ extensions) performed using Git 1.7.8+ should now appear.
+* (bug 42184) $wgUploadSizeWarning missing second variable
+* (bug 40326) Check if files exist with a different extension during uploading
+* (bug 34798) Updated CSS for Atom/RSS recent changes feeds to match on-wiki diffs.
+* (bug 42430) Calling numRows on MySQL no longer propagates unrelated errors.
+* (bug 44719) Removed mention of non-existing maintenance/migrateCurStubs.php
+ script in includes/DefaultSettings.php
+* (bug 45143) jquery.badge: Treat non-Latin variants of zero as zero as well.
+* (bug 46151) mwdocgen.php should not ignore exit code of doxygen command.
+* (bug 41889) Fix $.tablesorter rowspan exploding for complex cases.
+* (bug 47489) Installer now automatically selects the next-best database type if
+ the PHP mysql extension is not loaded, preventing fatal errors in some cases.
+* (bug 47202) wikibits: FF2Fixes.css should not be loaded in Firefox 20.
+
+=== API changes in 1.21 ===
+* BREAKING CHANGE: Chunked uploads are now disabled by default. You can re-enable
+ them by setting $wgAllowChunkedUploads=true
+* BREAKING CHANGE: list=logevents output format changed for details of some log
+ types. Specifically, details that were formerly reported under a key like
+ "4::foo" will now be reported under a key of simply "foo".
+* BREAKING CHANGE: '??_badcontinue' error code was changed to '??badcontinue'
+ for all query modules.
+* prop=revisions can now report the contentmodel and contentformat.
+ See docs/contenthandler.txt.
+* action=edit and action=parse now support contentmodel and contentformat
+ parameters to control the interpretation of page content.
+ See docs/contenthandler.txt for details.
+* (bug 35693) ApiQueryImageInfo now suppresses errors when unserializing metadata.
+* (bug 40111) Disable minor edit for page/section creation by API.
+* (bug 41042) Revert change to action=parse&page=... behavior when the page
+ does not exist.
+* (bug 27202) Add timestamp sort to list=allimages.
+* (bug 43137) Don't return the sha1 of revisions through the API if the content is
+ revision-deleted.
+* ApiQueryImageInfo now also returns imageinfo for redirects.
+* list=alltransclusions added to enumerate every instance of page embedding
+* list=alllinks & alltransclusions now allow both 'from' and 'continue' in
+ the same query. When both are present, 'from' is simply ignored.
+* list=alllinks & alltransclusions now allow 'unique' in generators, to yield
+ a list of all link/template target pages instead of source pages.
+* ApiQueryBase adds 'badcontinue' error code if module has 'continue' parameter.
+* (bug 35885) Removed version parameter and all getVersion() methods.
+* action=options now takes a "resetkinds" option, which allows only resetting
+ certain types of preferences when the "reset" option is set.
+* (bug 36751) ApiQueryImageInfo now returns imageinfo for the redirect target
+ when queried with &redirects=.
+* (bug 31849) ApiQueryImageInfo no longer gets confused when asked for info on
+ a redirect and its target.
+* (bug 43849) ApiQueryImageInfo no longer throws exceptions with ForeignDBRepo
+ redirects.
+* On error, any warnings generated before that error will be shown in the result.
+* action=help supports generalized submodules (modules=query+value), querymodules obsolete
+* ApiQueryImageInfo continuation is more reliable. The only major change is
+ that the imagerepository property will no longer be set on page objects not
+ processed in the current query (i.e. non-images or those skipped due to
+ iicontinue).
+* Add supports for all pageset capabilities - generators, redirects, converttitles to
+ action=purge and action=setnotificationtimestamp.
+* (bug 43251) prop=pageprops&ppprop= now accepts multiple props to query.
+* ApiQueryImageInfo will now limit the number of calls to File::transform made
+ in any one query. If there are too many, iicontinue will be returned.
+* action=query&meta=siteinfo&siprop=general will now return the regexes used for
+ link trails and link prefixes. Added for Parsoid support.
+* Added an API query module list=pageswithprop, which lists pages using a
+ particular page property.
+* Added an API query module list=pagepropnames, which lists all page prop names
+ currently in use on the wiki.
+* (bug 44921) ApiMain::execute() will now return after the CORS check for an
+ HTTP OPTIONS request.
+* (bug 44923) action=upload works correctly if the entire file is uploaded in
+ the first chunk.
+* Added 'continue=' parameter to streamline client iteration over complex query results
+* (bug 44909) API parameters may now be marked as type "upload", which is now
+ used for action=upload's 'file' and 'chunk' parameters. This type will raise
+ an error during parameter validation if the parameter is given but not
+ recognized as an uploaded file.
+* (bug 44244) prop=info may now return the number of people watching each page.
+* (bug 33304) list=allpages will no longer return duplicate entries when
+ querying protection.
+* (bug 33304) list=allpages will now find really old indefinite protections.
+* (bug 45937) meta=allmessages will report a syntactically invalid lang as a
+ proper error instead of as an uncaught exception.
+* (bug 48542) SpecialStatistics::getOtherStats() now uses the user language.
+
+=== API internal changes in 1.21 ===
+* BREAKING CHANGE: ApiPageSet constructor now has two params instead of three, with only the
+ first one keeping its meaning. ApiPageSet is now derived from ApiBase.
+* BREAKING CHANGE: ApiQuery::newGenerator() and executeGeneratorModule() were deleted.
+* For debugging only, a new global $wgDebugAPI removes many API restrictions when true.
+ Never use on the production servers, as this flag introduces security holes.
+ Whenever enabled, a warning will also be added to all output.
+* ApiModuleManager now handles all submodules (actions,props,lists) and instantiation
+* Query stores prop/list/meta as submodules
+* ApiPageSet can now be used in any action to process titles/pageids/revids or any generator.
+* ApiQueryGeneratorBase::setGeneratorMode() now requires a pageset param.
+* $wgAPIGeneratorModules is now obsolete and will be ignored.
+* Added flags ApiResult::OVERRIDE and ADD_ON_TOP to setElement() and addValue()
+* Internal API calls will now include <warnings> in case of unused parameters
+
+=== Languages updated in 1.21 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+* South Azerbaijani (azb) added.
+* (bug 30040) Autonym for nds-nl is now 'Nedersaksies' (was 'Nedersaksisch').
+* (bug 45436) Autonym for pi (Pali) is now 'पालि' (was ''पाळि').
+* (bug 34977) Now formatted numbers in Spanish use space as separator
+ for thousands, as mandated by the Real Academia Española.
+* (bug 35031) Kurdish formatted numbers now use period and comma
+ as separators for thousands and decimals respectively.
+
+=== Other changes in 1.21 ===
+* BREAKING CHANGE: (bug 44385) Removed the jquery.collapsibleTabs module and
+ moved it to the Vector extension. It was entirely Vector-extension-specific,
+ deeply interconnected with the extension, and this functionality really
+ belongs to the extension instead of the skin anyway. In the unlikely case you
+ were using it, you have to either copy it to your extension, or install the
+ Vector extension (and possibly disable its features using config settings if
+ you don't want them).
+* BREAKING CHANGE: Filenames of maintenance scripts were standardized into
+ lowerCamelCase format, and made more explicit:
+ - clear_stats.php -> clearCacheStats.php
+ - clear_interwiki_cache.php -> clearInterwikiCache.php
+ - initStats.php -> initSiteStats.php
+ - proxy_check.php -> proxyCheck.php
+ - stats.php -> showCacheStats.php
+ - showStats.php -> showSiteStats.php.
+ Class names were renamed accordingly:
+ - clear_stats -> ClearCacheStats
+ - InitStats -> InitSiteStats
+ - CacheStats -> ShowCacheStats
+ - ShowStats -> ShowSiteStats.
+* BREAKING CHANGE: (bug 38244) Removed the mediawiki.api.titleblacklist module
+ and moved it to the TitleBlacklist extension.
+* Experimental IBM DB2 support was removed due to lack of interest and maintainership.
+
+== Compatibility ==
+
+MediaWiki 1.21 requires PHP 5.3.2 or later.
+
+MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
+support for them is somewhat less mature. There is experimental support for
+Oracle.
+
+The supported versions are:
+
+* MySQL 5.0.2 or later
+* PostgreSQL 8.3 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+
+== Upgrading ==
+
+1.21 has several database changes since 1.20, and will not work without schema
+updates. Note that due to changes to some very large tables like the revision
+table, the schema update may take quite long (minutes on a medium sized site,
+many hours on a large site).
+
+If upgrading from before 1.11, and you are using a wiki as a commons
+repository, make sure that it is updated as well. Otherwise, errors may arise
+due to database schema changes.
+
+If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
+new database fields are filled with data.
+
+If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
+1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
+with MediaWiki 1.21.
+
+Don't forget to always back up your database before upgrading!
+
+See the file UPGRADE for more detailed upgrade instructions.
+
+For notes on 1.19.x and older releases, see HISTORY.
+
+== Online documentation ==
+
+Documentation for both end-users and site administrators is available on
+MediaWiki.org, and is covered under the GNU Free Documentation License (except
+for pages that explicitly state that their contents are in the public domain):
+
+ https://www.mediawiki.org/wiki/Documentation
+
+== Mailing list ==
+
+A mailing list is available for MediaWiki user support and discussion:
+
+ https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+A low-traffic announcements-only list is also available:
+
+ https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+
+It's highly recommended that you sign up for one of these lists if you're
+going to run a public MediaWiki, so you can be notified of security fixes.
+
+== IRC help ==
+
+There's usually someone online in #mediawiki on irc.freenode.net.
diff --git a/StartProfiler.sample b/StartProfiler.sample
index 6bce634d..db5e0ff9 100644
--- a/StartProfiler.sample
+++ b/StartProfiler.sample
@@ -12,8 +12,6 @@
* } else {
* $wgProfiler['class'] = 'ProfilerStub';
* }
- *
+ *
* Configuration of the profiler output can be done in LocalSettings.php
*/
-
-
diff --git a/UPGRADE b/UPGRADE
index cdaf4f91..7987b221 100644
--- a/UPGRADE
+++ b/UPGRADE
@@ -39,8 +39,8 @@ Download the files for the new version of the software. These are available
as a compressed "tar" archive from the Wikimedia Download Service
(http://download.wikimedia.org/mediawiki).
-You can also obtain the new files directly from our Subversion source code
-repository, via a checkout or export operation.
+You can also obtain the new files directly from our Git source code
+repository.
Replace the existing MediaWiki files with the new. You should preserve the
LocalSettings.php file and the "extensions" and "images" directories.
@@ -51,10 +51,15 @@ deleted file archives, and any custom skins.
=== Perform the database upgrade ===
+As of 1.21, it is possible to separate schema changes (i.e. adding,
+dropping, or changing tables, fields, or indices) from all other
+database changes (e.g. populating fields). If you need this
+capability, see "From the command line" below.
+
==== From the web ====
-If you browse to the web-based installation script (usually at
-/mw-config/index.php) from your wiki installation you can follow the script and
+If you browse to the web-based installation script (usually at
+/mw-config/index.php) from your wiki installation you can follow the script and
upgrade your database in place.
==== From the command line ====
@@ -64,13 +69,19 @@ update.php script to check and update the schema. This will insert missing
tables, update existing tables, and move data around as needed. In most cases,
this is successful and nothing further needs to be done.
+If you need to separate out the schema changes so they can be run
+by someone with more privileges, then you can use the --schema option
+to produce a text file with the necessary commands. You can use
+--schema, --noschema, $wgAllowSchemaUpdates as well as proper database
+permissions to enforce this separation.
+
=== Check configuration settings ===
The names of configuration variables, and their default values and purposes,
can change between release branches, e.g. $wgDisableUploads in 1.4 is replaced
with $wgEnableUploads in later versions. When upgrading, consult the release
notes to check for configuration changes which would alter the expected
-behaviour of MediaWiki.
+behavior of MediaWiki.
=== Check installed extensions ===
@@ -139,9 +150,13 @@ UTF-8; an experimental command-line upgrade helper script,
'upgrade1_5.php', can do this -- run it prior to 'update.php' or
the web upgrader.
+NOTE that upgrade1_5.php does not work properly with recent version
+of MediaWiki. If upgrading a 1.4.x wiki, you should upgrade to 1.5
+first. upgrade1_5.php has been removed from MediaWiki 1.21.
+
If you absolutely cannot make the UTF-8 upgrade work, you can try
doing it by hand: dump your old database, convert the dump file
-using iconv as described here:
+using iconv as described here:
http://portal.suse.com/sdb/en/2004/05/jbartsh_utf-8.html
and then reimport it. You can also convert filenames using convmv,
but note that the old directory hashes will no longer be valid,
diff --git a/api.php b/api.php
index 7fae3731..bc902297 100644
--- a/api.php
+++ b/api.php
@@ -8,7 +8,7 @@
* as an argument in the URL ('?action=') and with write-enabled set to the
* value of $wgEnableWriteAPI as specified in LocalSettings.php.
* It then invokes "execute()" on the ApiMain object instance, which
- * produces output in the format sepecified in the URL.
+ * produces output in the format specified in the URL.
*
* Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
*
@@ -60,7 +60,7 @@ if ( !$wgEnableAPI ) {
header( $_SERVER['SERVER_PROTOCOL'] . ' 500 MediaWiki configuration Error', true, 500 );
echo( 'MediaWiki API is not enabled for this site. Add the following line to your LocalSettings.php'
. '<pre><b>$wgEnableAPI=true;</b></pre>' );
- die(1);
+ die( 1 );
}
// Set a dummy $wgTitle, because $wgTitle == null breaks various things
@@ -87,17 +87,17 @@ wfLogProfilingData();
// Log the request
if ( $wgAPIRequestLog ) {
$items = array(
- wfTimestamp( TS_MW ),
- $endtime - $starttime,
- $wgRequest->getIP(),
- $_SERVER['HTTP_USER_AGENT']
+ wfTimestamp( TS_MW ),
+ $endtime - $starttime,
+ $wgRequest->getIP(),
+ $_SERVER['HTTP_USER_AGENT']
);
$items[] = $wgRequest->wasPosted() ? 'POST' : 'GET';
$module = $processor->getModule();
if ( $module->mustBePosted() ) {
$items[] = "action=" . $wgRequest->getVal( 'action' );
} else {
- $items[] = wfArrayToCGI( $wgRequest->getValues() );
+ $items[] = wfArrayToCgi( $wgRequest->getValues() );
}
wfErrorLog( implode( ',', $items ) . "\n", $wgAPIRequestLog );
wfDebug( "Logged API request to $wgAPIRequestLog\n" );
@@ -107,4 +107,3 @@ if ( $wgAPIRequestLog ) {
// get here to worry about whether this should be = or =&, but the file has to parse properly.
$lb = wfGetLBFactory();
$lb->shutdown();
-
diff --git a/api.php5 b/api.php5
index bb515c5c..1828b7b4 100644
--- a/api.php5
+++ b/api.php5
@@ -1,7 +1,7 @@
<?php
/**
* Version of api.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
*
* 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
diff --git a/bin/svnstat b/bin/svnstat
deleted file mode 100755
index 5a2c940b..00000000
--- a/bin/svnstat
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-svn stat -v $1 | sed -n 's/^[ A-Z?\*|!]\{1,15\}[0-9]\{1,10\} \{1,15\}/r/;s/ .*//p'
diff --git a/bin/ulimit-tvf.sh b/bin/ulimit-tvf.sh
deleted file mode 100755
index 8a1eb81c..00000000
--- a/bin/ulimit-tvf.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-
-ulimit -t $1 -v $2 -f $3
-shift 3
-"$@"
-
diff --git a/bin/ulimit.sh b/bin/ulimit.sh
deleted file mode 100644
index 7a1925cc..00000000
--- a/bin/ulimit.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-
-ulimit -t $1
-ulimit -v $2
-shift 2
-"$@"
-
diff --git a/bin/ulimit4.sh b/bin/ulimit4.sh
deleted file mode 100755
index 2a840d2f..00000000
--- a/bin/ulimit4.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-ulimit -t $1 -v $2 -f $3
-eval "$4"
diff --git a/composer.json b/composer.json
index fa42c295..ded33652 100644
--- a/composer.json
+++ b/composer.json
@@ -10,12 +10,6 @@
}
],
"license": "GPL-2.0",
- "repositories": [
- {
- "type": "vcs",
- "url": "https://gerrit.wikimedia.org/r/p/mediawiki/core.git"
- }
- ],
"support": {
"issues": "https://bugzilla.wikimedia.org/",
"irc": "irc://irc.freenode.net/mediawiki",
diff --git a/docs/contenthandler.txt b/docs/contenthandler.txt
new file mode 100644
index 00000000..899554af
--- /dev/null
+++ b/docs/contenthandler.txt
@@ -0,0 +1,184 @@
+The ContentHandler facility adds support for arbitrary content types on wiki pages, instead of relying on wikitext
+for everything. It was introduced in MediaWiki 1.21.
+
+Each kind of content ("content model") supported by MediaWiki is identified by unique name. The content model determines
+how a page's content is rendered, compared, stored, edited, and so on.
+
+Built-in content types are:
+
+* wikitext - wikitext, as usual
+* javascript - user provided javascript code
+* css - user provided css code
+* text - plain text
+
+In PHP, use the corresponding CONTENT_MODEL_XXX constant.
+
+A page's content model is available using the Title::getContentModel() method. A page's default model is determined by
+ContentHandler::getDefaultModelFor($title) as follows:
+
+* The global setting $wgNamespaceContentModels specifies a content model for the given namespace.
+* The hook ContentHandlerDefaultModelFor may be used to override the page's default model.
+* Pages in NS_MEDIAWIKI and NS_USER default to the CSS or JavaScript model if they end in .js or .css, respectively.
+ Pages in NS_MEDIAWIKI default to the wikitext model otherwise.
+* The hook TitleIsCssOrJsPage may be used to force a page to use the CSS or JavaScript model.
+ This is a compatibility feature. The ContentHandlerDefaultModelFor hook should be used instead if possible.
+* The hook TitleIsWikitextPage may be used to force a page to use the wikitext model.
+ This is a compatibility feature. The ContentHandlerDefaultModelFor hook should be used instead if possible.
+* Otherwise, the wikitext model is used.
+
+Note that is currently no mechanism to convert a page from one content model to another, and there is no guarantee that
+revisions of a page will all have the same content model. Use Revision::getContentModel() to find it.
+
+
+== Architecture ==
+
+Two class hierarchies are used to provide the functionality associated with the different content models:
+
+* Content interface (and AbstractContent base class) define functionality that acts on the concrete content of a page, and
+* ContentHandler base class provides functionality specific to a content model, but not acting on concrete content.
+
+The most important function of ContentHandler is to act as a factory for the appropriate implementation of Content. These
+Content objects are to be used by MediaWiki everywhere, instead of passing page content around as text. All manipulation
+and analysis of page content must be done via the appropriate methods of the Content object.
+
+For each content model, a subclass of ContentHandler has to be registered with $wgContentHandlers. The ContentHandler
+object for a given content model can be obtained using ContentHandler::getForModelID( $id ). Also Title, WikiPage and
+Revision now have getContentHandler() methods for convenience.
+
+ContentHandler objects are singletons that provide functionality specific to the content type, but not directly acting
+on the content of some page. ContentHandler::makeEmptyContent() and ContentHandler::unserializeContent() can be used to
+create a Content object of the appropriate type. However, it is recommended to instead use WikiPage::getContent() resp.
+Revision::getContent() to get a page's content as a Content object. These two methods should be the ONLY way in which
+page content is accessed.
+
+Another important function of ContentHandler objects is to define custom action handlers for a content model, see
+ContentHandler::getActionOverrides(). This is similar to what WikiPage::getActionOverrides() was already doing.
+
+
+== Serialization ==
+
+With the ContentHandler facility, page content no longer has to be text based. Objects implementing the Content interface
+are used to represent and handle the content internally. For storage and data exchange, each content model supports
+at least one serialization format via ContentHandler::serializeContent( $content ). The list of supported formats for
+a given content model can be accessed using ContentHandler::getSupportedFormats().
+
+Content serialization formats are identified using MIME type like strings. The following formats are built in:
+
+* text/x-wiki - wikitext
+* text/javascript - for js pages
+* text/css - for css pages
+* text/plain - for future use, e.g. with plain text messages.
+* text/html - for future use, e.g. with plain html messages.
+* application/vnd.php.serialized - for future use with the api and for extensions
+* application/json - for future use with the api, and for use by extensions
+* application/xml - for future use with the api, and for use by extensions
+
+In PHP, use the corresponding CONTENT_FORMAT_XXX constant.
+
+Note that when using the API to access page content, especially action=edit, action=parse and action=query&prop=revisions,
+the model and format of the content should always be handled explicitly. Without that information, interpretation of
+the provided content is not reliable. The same applies to XML dumps generated via maintenance/dumpBackup.php or
+Special:Export.
+
+Also note that the API will provide encapsulated, serialized content - so if the API was called with format=json, and
+contentformat is also json (or rather, application/json), the page content is represented as a string containing an
+escaped json structure. Extensions that use JSON to serialize some types of page content may provide specialized API
+modules that allow access to that content in a more natural form.
+
+
+== Compatibility ==
+
+The ContentHandler facility is introduced in a way that should allow all existing code to keep functioning at least
+for pages that contain wikitext or other text based content. However, a number of functions and hooks have been
+deprecated in favor of new versions that are aware of the page's content model, and will now generate warnings when
+used.
+
+Most importantly, the following functions have been deprecated:
+
+* Revisions::getText() and Revisions::getRawText() is deprecated in favor Revisions::getContent()
+* WikiPage::getText() is deprecated in favor WikiPage::getContent()
+
+Also, the old Article::getContent() (which returns text) is superceded by Article::getContentObject(). However, both
+methods should be avoided since they do not provide clean access to the page's actual content. For instance, they may
+return a system message for non-existing pages. Use WikiPage::getContent() instead.
+
+Code that relies on a textual representation of the page content should eventually be rewritten. However,
+ContentHandler::getContentText() provides a stop-gap that can be used to get text for a page. Its behavior is controlled
+by $wgContentHandlerTextFallback; per default it will return the text for text based content, and null for any other
+content.
+
+For rendering page content, Content::getParserOutput() should be used instead of accessing the parser directly.
+ContentHandler::makeParserOptions() can be used to construct appropriate options.
+
+
+Besides some functions, some hooks have also been replaced by new versions (see hooks.txt for details).
+These hooks will now trigger a warning when used:
+
+* ArticleAfterFetchContent was replaced by ArticleAfterFetchContentObject
+* ArticleInsertComplete was replaced by PageContentInsertComplete
+* ArticleSave was replaced by PageContentSave
+* ArticleSaveComplete was replaced by PageContentSaveComplete
+* ArticleViewCustom was replaced by ArticleContentViewCustom (also consider a custom implementation of the view action)
+* EditFilterMerged was replaced by EditFilterMergedContent
+* EditPageGetDiffText was replaced by EditPageGetDiffContent
+* EditPageGetPreviewText was replaced by EditPageGetPreviewContent
+* ShowRawCssJs was deprecated in favor of custom rendering implemented in the respective ContentHandler object.
+
+
+== Database Storage ==
+
+Page content is stored in the database using the same mechanism as before. Non-text content is serialized first. The
+appropriate serialization and deserialization is handled by the Revision class.
+
+Each revision's content model and serialization format is stored in the revision table (resp. in the archive table, if
+the revision was deleted). The page's (current) content model (that is, the content model of the latest revision) is also
+stored in the page table.
+
+Note however that the content model and format is only stored if it differs from the page's default, as determined by
+ContentHandler::getDefaultModelFor( $title ). The default values are represented as NULL in the database, to preserve
+space.
+
+Storage of content model and format can be disabled altogether by setting $wgContentHandlerUseDB = false. In that case,
+the page's default model (and the model's default format) will be used everywhere. Attempts to store a revision of a page
+using a model or format different from the default will result in an error.
+
+
+== Globals ==
+
+There are some new globals that can be used to control the behavior of the ContentHandler facility:
+
+* $wgContentHandlers associates content model IDs with the names of the appropriate ContentHandler subclasses.
+
+* $wgNamespaceContentModels maps namespace IDs to a content model that should be the default for that namespace.
+
+* $wgContentHandlerUseDB determines whether each revision's content model should be stored in the database.
+ Defaults is true.
+
+* $wgContentHandlerTextFallback determines how the compatibility method ContentHandler::getContentText() will behave for
+ non-text content:
+ 'ignore' causes null to be returned for non-text content (default).
+ 'serialize' causes the serialized form of any non-text content to be returned (scary).
+ 'fail' causes an exception to be thrown for non-text content (strict).
+
+
+== Caveats ==
+
+There are some changes in behavior that might be surprising to users:
+
+* Javascript and CSS pages are no longer parsed as wikitext (though pre-save transform is still applied). Most
+importantly, this means that links, including categorization links, contained in the code will not work.
+
+* With $wgContentHandlerUseDB = false, pages can not be moved in a way that would change the
+default model. E.g. [[MediaWiki:foo.js]] can not be moved to [[MediaWiki:foo bar]], but can still be moved to
+[[User:John/foo.js]]. Also, in this mode, changing the default content model for a page (e.g. by changing
+$wgNamespaceContentModels) may cause it to become inaccessible.
+
+* action=edit will fail for pages with non-text content, unless the respective ContentHandler implementation has
+provided a specialized handler for the edit action. This is true for the API as well.
+
+* action=raw will fail for all non-text content. This seems better than serving content in other formats to an
+unsuspecting recipient. This will also cause client-side diffs to fail.
+
+* File pages provide their own action overrides that do not combine gracefully with any custom handlers defined by a
+ContentHandler. If for example a File page used a content model with a custom revert action, this would be overridden by
+WikiFilePage's handler for the revert action.
diff --git a/docs/database.txt b/docs/database.txt
index c0a2412c..65a597b3 100644
--- a/docs/database.txt
+++ b/docs/database.txt
@@ -180,7 +180,6 @@ MediaWiki does support the following other DBMSs to varying degrees.
* PostgreSQL
* SQLite
* Oracle
-* IBM DB2
* MSSQL
More information can be found about each of these databases (known issues,
diff --git a/docs/databases/ibm_db2.txt b/docs/databases/ibm_db2.txt
deleted file mode 100644
index 3c3f381c..00000000
--- a/docs/databases/ibm_db2.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-== See also ==
-*[http://www.mediawiki.org/wiki/Manual:IBM_DB2 Installation instructions]
-*[http://ca.php.net/manual/en/function.db2-connect.php PHP Manual for DB2 functions] \ No newline at end of file
diff --git a/docs/export-0.8.xsd b/docs/export-0.8.xsd
new file mode 100644
index 00000000..07b432a1
--- /dev/null
+++ b/docs/export-0.8.xsd
@@ -0,0 +1,289 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ This is an XML Schema description of the format
+ output by MediaWiki's Special:Export system.
+
+ Version 0.2 adds optional basic file upload info support,
+ which is used by our OAI export/import submodule.
+
+ Version 0.3 adds some site configuration information such
+ as a list of defined namespaces.
+
+ Version 0.4 adds per-revision delete flags, log exports,
+ discussion threading data, a per-page redirect flag, and
+ per-namespace capitalization.
+
+ Version 0.5 adds byte count per revision.
+
+ Version 0.6 adds a separate namespace tag, and resolves the
+ redirect target and adds a separate sha1 tag for each revision.
+
+ Version 0.7 adds a unique identity constraint for both page and
+ revision identifiers. See also bug 4220.
+ Fix type for <ns> from "positiveInteger" to "nonNegativeInteger" to allow 0
+ Moves <logitem> to its right location.
+ Add parentid to revision.
+ Fix type for <id> within <contributor> to "nonNegativeInteger"
+
+ Version 0.8 adds support for a <model> and a <format> tag for
+ each revision. See contenthandler.txt.
+
+ The canonical URL to the schema document is:
+ http://www.mediawiki.org/xml/export-0.8.xsd
+
+ Use the namespace:
+ http://www.mediawiki.org/xml/export-0.8/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:mw="http://www.mediawiki.org/xml/export-0.8/"
+ targetNamespace="http://www.mediawiki.org/xml/export-0.8/"
+ elementFormDefault="qualified">
+
+ <annotation>
+ <documentation xml:lang="en">
+ MediaWiki's page export format
+ </documentation>
+ </annotation>
+
+ <!-- Need this to reference xml:lang -->
+ <import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="http://www.w3.org/2001/xml.xsd" />
+
+ <!-- Our root element -->
+ <element name="mediawiki" type="mw:MediaWikiType">
+ <!-- Page ID contraint, see bug 4220 -->
+ <unique name="PageIDConstraint">
+ <selector xpath="mw:page" />
+ <field xpath="mw:id" />
+ </unique>
+ <!-- Revision ID contraint, see bug 4220 -->
+ <unique name="RevIDConstraint">
+ <selector xpath="mw:page/mw:revision" />
+ <field xpath="mw:id" />
+ </unique>
+ </element>
+
+ <complexType name="MediaWikiType">
+ <sequence>
+ <element name="siteinfo" type="mw:SiteInfoType"
+ minOccurs="0" maxOccurs="1" />
+ <element name="page" type="mw:PageType"
+ minOccurs="0" maxOccurs="unbounded" />
+ <element name="logitem" type="mw:LogItemType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attribute name="version" type="string" use="required" />
+ <attribute ref="xml:lang" use="required" />
+ </complexType>
+
+ <complexType name="SiteInfoType">
+ <sequence>
+ <element name="sitename" type="string" minOccurs="0" />
+ <element name="base" type="anyURI" minOccurs="0" />
+ <element name="generator" type="string" minOccurs="0" />
+ <element name="case" type="mw:CaseType" minOccurs="0" />
+ <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+ </sequence>
+ </complexType>
+
+ <simpleType name="CaseType">
+ <restriction base="NMTOKEN">
+ <!-- Cannot have two titles differing only by case of first letter. -->
+ <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+ <enumeration value="first-letter" />
+
+ <!-- Complete title is case-sensitive -->
+ <!-- Behavior when $wgCapitalLinks = false -->
+ <enumeration value="case-sensitive" />
+
+ <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
+ <!-- Not yet implemented as of MediaWiki 1.18 -->
+ <enumeration value="case-insensitive" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="DeletedFlagType">
+ <restriction base="NMTOKEN">
+ <enumeration value="deleted" />
+ </restriction>
+ </simpleType>
+
+ <complexType name="NamespacesType">
+ <sequence>
+ <element name="namespace" type="mw:NamespaceType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+
+ <complexType name="NamespaceType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="key" type="integer" />
+ <attribute name="case" type="mw:CaseType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="RedirectType">
+ <simpleContent>
+ <extension base="string">
+ <attribute name="title" type="string" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <simpleType name="ContentModelType">
+ <restriction base="string">
+ <pattern value="[a-zA-Z][-+./a-zA-Z0-9]*" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="ContentFormatType">
+ <restriction base="string">
+ <pattern value="[a-zA-Z][-+.a-zA-Z0-9]*/[a-zA-Z][-+.a-zA-Z0-9]*" />
+ </restriction>
+ </simpleType>
+
+ <complexType name="PageType">
+ <sequence>
+ <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+ <element name="title" type="string" />
+
+ <!-- Namespace in canonical form -->
+ <element name="ns" type="nonNegativeInteger" />
+
+ <!-- optional page ID number -->
+ <element name="id" type="positiveInteger" />
+
+ <!-- flag if the current revision is a redirect -->
+ <element name="redirect" type="mw:RedirectType" minOccurs="0" maxOccurs="1" />
+
+ <!-- comma-separated list of string tokens, if present -->
+ <element name="restrictions" type="string" minOccurs="0" />
+
+ <!-- Zero or more sets of revision or upload data -->
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element name="revision" type="mw:RevisionType" />
+ <element name="upload" type="mw:UploadType" />
+ </choice>
+
+ <!-- Zero or One sets of discussion threading data -->
+ <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+ </sequence>
+ </complexType>
+
+ <complexType name="RevisionType">
+ <sequence>
+ <element name="id" type="positiveInteger" />
+ <element name="parentid" type="positiveInteger" minOccurs="0" />
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="minor" minOccurs="0" maxOccurs="1" />
+ <element name="comment" type="mw:CommentType" minOccurs="0" maxOccurs="1" />
+ <element name="text" type="mw:TextType" />
+ <element name="sha1" type="string" />
+ <element name="model" type="mw:ContentModelType" />
+ <element name="format" type="mw:ContentFormatType" />
+ </sequence>
+ </complexType>
+
+ <complexType name="LogItemType">
+ <sequence>
+ <element name="id" type="positiveInteger" />
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="comment" type="mw:CommentType" minOccurs="0" />
+ <element name="type" type="string" />
+ <element name="action" type="string" />
+ <element name="text" type="mw:LogTextType" minOccurs="0" maxOccurs="1" />
+ <element name="logtitle" type="string" minOccurs="0" maxOccurs="1" />
+ <element name="params" type="mw:LogParamsType" minOccurs="0" maxOccurs="1" />
+ </sequence>
+ </complexType>
+
+ <complexType name="CommentType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="TextType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
+ <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
+ <!-- usage ([0-9]+) and with the "ID" type. -->
+ <attribute name="id" type="NMTOKEN" />
+ <attribute name="bytes" use="optional" type="nonNegativeInteger" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="LogTextType">
+ <simpleContent>
+ <extension base="string">
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="LogParamsType">
+ <simpleContent>
+ <extension base="string">
+ <attribute ref="xml:space" use="optional" default="preserve" />
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <complexType name="ContributorType">
+ <sequence>
+ <element name="username" type="string" minOccurs="0" />
+ <element name="id" type="nonNegativeInteger" minOccurs="0" />
+
+ <element name="ip" type="string" minOccurs="0" />
+ </sequence>
+ <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+ <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+ </complexType>
+
+ <complexType name="UploadType">
+ <sequence>
+ <!-- Revision-style data... -->
+ <element name="timestamp" type="dateTime" />
+ <element name="contributor" type="mw:ContributorType" />
+ <element name="comment" type="string" minOccurs="0" />
+
+ <!-- Filename. (Using underscores, not spaces. No 'File:' namespace marker.) -->
+ <element name="filename" type="string" />
+
+ <!-- URI at which this resource can be obtained -->
+ <element name="src" type="anyURI" />
+
+ <element name="size" type="positiveInteger" />
+
+ <!-- TODO: add other metadata fields -->
+ </sequence>
+ </complexType>
+
+ <!-- Discussion threading data for LiquidThreads -->
+ <complexType name="DiscussionThreadingInfo">
+ <sequence>
+ <element name="ThreadSubject" type="string" />
+ <element name="ThreadParent" type="positiveInteger" />
+ <element name="ThreadAncestor" type="positiveInteger" />
+ <element name="ThreadPage" type="string" />
+ <element name="ThreadID" type="positiveInteger" />
+ <element name="ThreadAuthor" type="string" />
+ <element name="ThreadEditStatus" type="string" />
+ <element name="ThreadType" type="string" />
+ </sequence>
+ </complexType>
+
+</schema>
diff --git a/docs/export-demo.xml b/docs/export-demo.xml
index d198b93c..591f675c 100644
--- a/docs/export-demo.xml
+++ b/docs/export-demo.xml
@@ -1,4 +1,4 @@
-<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">
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.8/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.8/ http://www.mediawiki.org/xml/export-0.8.xsd" version="0.8" xml:lang="en">
<!-- Optional global configuration info -->
<siteinfo>
@@ -79,8 +79,10 @@
</contributor>
<minor />
<comment>I have just one thing to say!</comment>
- <sha1>5x0ux8iwjrbmfzgv6pkketxgkcnpr7h</sha1>
<text xml:space="preserve" bytes="25">A bunch of [[text]] here.</text>
+ <sha1>5x0ux8iwjrbmfzgv6pkketxgkcnpr7h</sha1>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
</revision>
<revision>
@@ -90,8 +92,10 @@
<ip>10.0.0.2</ip>
</contributor>
<comment>new!</comment>
- <sha1>etaxt3shcge6igz1biwy3d4um2pnle4</sha1>
<text xml:space="preserve" bytes="24">An earlier [[revision]].</text>
+ <sha1>etaxt3shcge6igz1biwy3d4um2pnle4</sha1>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
</revision>
</page>
@@ -104,8 +108,10 @@
<timestamp>2001-01-15T14:03:00Z</timestamp>
<contributor><ip>10.0.0.2</ip></contributor>
<comment>hey</comment>
- <sha1>ml80vmyjlixdstnywwihx003exfzq9j</sha1>
<text xml:space="preserve" bytes="47">WHYD YOU LOCK PAGE??!!! i was editing that jerk</text>
+ <sha1>ml80vmyjlixdstnywwihx003exfzq9j</sha1>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
</revision>
</page>
@@ -118,8 +124,10 @@
<timestamp>2001-01-15T20:34:12Z</timestamp>
<contributor><username>Foobar</username><id>42</id></contributor>
<comment>My awesomeest image!</comment>
- <sha1>mehom37npwkpzhaiwu3wyr0egalumki</sha1>
<text xml:space="preserve" bytes="52">This is an awesome little imgae. I lurves it. {{PD}}</text>
+ <sha1>mehom37npwkpzhaiwu3wyr0egalumki</sha1>
+ <model>wikitext</model>
+ <format>text/x-wiki</format>
</revision>
<upload>
<timestamp>2001-01-15T20:34:12Z</timestamp>
diff --git a/docs/hooks.txt b/docs/hooks.txt
index 8fb94a41..d4a1c909 100644
--- a/docs/hooks.txt
+++ b/docs/hooks.txt
@@ -234,7 +234,9 @@ MediaWiki 1.4rc1.
This is a list of known events and parameters; please add to it if you're going
to add events to the MediaWiki code.
-'AbortAutoAccount': Return false to cancel automated local account creation, where normally authentication against an external auth plugin would be creating a local account.
+'AbortAutoAccount': Return false to cancel automated local account creation,
+where normally authentication against an external auth plugin would be creating
+a local account.
$user: the User object about to be created (read-only, incomplete)
&$abortMsg: out parameter: name of error message to be displayed to user
@@ -242,7 +244,7 @@ $user: the User object about to be created (read-only, incomplete)
$autoblockip: The IP going to be autoblocked.
$block: The block from which the autoblock is coming.
-'AbortDiffCache': Can be used to cancel the caching of a diff
+'AbortDiffCache': Can be used to cancel the caching of a diff.
&$diffEngine: DifferenceEngine object
'AbortEmailNotification': Can be used to cancel email notifications for an edit.
@@ -257,7 +259,7 @@ $password: the password being submitted, not yet checked for validity
a machine API rather than the HTML user interface.
&$msg: the message identifier for abort reason (new in 1.18, not available before 1.18)
-'AbortMove': allows to abort moving an article (title)
+'AbortMove': Allows to abort moving an article (title).
$old: old title
$nt: new title
$user: user who is doing the move
@@ -270,30 +272,36 @@ $user: the User object about to be created (read-only, incomplete)
'AbortChangePassword': Return false to cancel password change.
$user: the User object to which the password change is occuring
-$this->mOldpass: the old password provided by the user
+$mOldpass: the old password provided by the user
$newpass: the new password provided by the user
&$abortMsg: the message identifier for abort reason
-'ActionBeforeFormDisplay': before executing the HTMLForm object
+'ActionBeforeFormDisplay': Before executing the HTMLForm object.
$name: name of the action
&$form: HTMLForm object
$article: Article object
-'ActionModifyFormFields': before creating an HTMLForm object for a page action;
- allows to change the fields on the form that will be generated
+'ActionModifyFormFields': Before creating an HTMLForm object for a page action;
+Allows to change the fields on the form that will be generated.
$name: name of the action
&$fields: HTMLForm descriptor array
$article: Article object
-'AddNewAccount': after a user account is created
+'AddNewAccount': After a user account is created.
$user: the User object that was created. (Parameter added in 1.7)
$byEmail: true when account was created "by email" (added in 1.12)
-'AfterImportPage': When a page import is completed
+'AfterFinalPageOutput': At the end of OutputPage::output() but before final
+ob_end_flush() which will send the buffered output to the client. This allows
+for last-minute modification of the output within the buffer by using
+ob_get_clean().
+&$output: OutputPage object
+
+'AfterImportPage': When a page import is completed.
$title: Title under which the revisions were imported
$origTitle: Title provided by the XML file
$revCount: Number of revisions in the XML file
-$sRevCount: Number of sucessfully imported revisions
+$sRevCount: Number of successfully imported revisions
$pageInfo: associative array of page information
'AfterFinalPageOutput': Nearly at the end of OutputPage::output() but
@@ -305,153 +313,164 @@ $output: The OutputPage object where output() was called
'AjaxAddScript': Called in output page just before the initialisation
of the javascript ajax engine. The hook is only called when ajax
is enabled ( $wgUseAjax = true; ).
+&$output: OutputPage object
-'AlternateEdit': before checking if a user can edit a page and
-before showing the edit form ( EditPage::edit() ). This is triggered
-on &action=edit.
-$EditPage: the EditPage object
-
-'AlternateUserMailer': Called before mail is sent so that mail could
-be logged (or something else) instead of using PEAR or PHP's mail().
-Return false to skip the regular method of sending mail. Return a
-string to return a php-mail-error message containing the error.
-Returning true will continue with sending email in the regular way.
+'AlternateEdit': Before checking if a user can edit a page and before showing
+the edit form ( EditPage::edit() ). This is triggered on &action=edit.
+$editPage: the EditPage object
+
+'AlternateEditPreview': Before generating the preview of the page when editing
+( EditPage::getPreviewText() ).
+$editPage: the EditPage object
+&$content: the Content object for the text field from the edit page
+&$previewHTML: Text to be placed into the page for the preview
+&$parserOutput: the ParserOutput object for the preview
+return false and set $previewHTML and $parserOutput to output custom page
+preview HTML.
+
+'AlternateUserMailer': Called before mail is sent so that mail could be logged
+(or something else) instead of using PEAR or PHP's mail(). Return false to skip
+the regular method of sending mail. Return a string to return a php-mail-error
+message containing the error. Returning true will continue with sending email
+in the regular way.
$headers: Associative array of headers for the email
$to: MailAddress object or array
$from: From address
$subject: Subject of the email
$body: Body of the message
-'APIAfterExecute': after calling the execute() method of an API module.
-Use this to extend core API modules.
+'APIAfterExecute': After calling the execute() method of an API module. Use
+this to extend core API modules.
&$module: Module object
-'ApiCheckCanExecute': Called during ApiMain::checkCanExecute. Use to
-further authenticate and authorize API clients before executing the
-module. Return false and set a message to cancel the request.
+'ApiCheckCanExecute': Called during ApiMain::checkCanExecute. Use to further
+authenticate and authorize API clients before executing the module. Return
+false and set a message to cancel the request.
$module: Module object
$user: Current user
&$message: API usage message to die with, as a message key or array
as accepted by ApiBase::dieUsageMsg.
-'APIEditBeforeSave': before saving a page with api.php?action=edit,
-after processing request parameters. Return false to let the request
-fail, returning an error message or an <edit result="Failure"> tag
-if $resultArr was filled.
-$EditPage : the EditPage object
+'APIEditBeforeSave': Before saving a page with api.php?action=edit, after
+processing request parameters. Return false to let the request fail, returning
+an error message or an <edit result="Failure"> tag if $resultArr was filled.
+$editPage : the EditPage object
$text : the new text of the article (has yet to be saved)
&$resultArr : data in this array will be added to the API result
-'APIGetAllowedParams': use this hook to modify a module's parameters.
+'APIGetAllowedParams': Use this hook to modify a module's parameters.
&$module: ApiBase Module object
&$params: Array of parameters
+$flags: int zero or OR-ed flags like ApiBase::GET_VALUES_FOR_HELP
-'APIGetDescription': use this hook to modify a module's description
+'APIGetDescription': Use this hook to modify a module's description.
&$module: ApiBase Module object
&$desc: Array of descriptions
-'APIGetParamDescription': use this hook to modify a module's parameter
+'APIGetParamDescription': Use this hook to modify a module's parameter
descriptions.
&$module: ApiBase Module object
&$desc: Array of parameter descriptions
-'APIGetResultProperties': use this hook to mofify the properties
-in a module's result.
+'APIGetResultProperties': Use this hook to modify the properties in a module's
+result.
&$module: ApiBase Module object
&$properties: Array of properties
-'APIQueryAfterExecute': after calling the execute() method of an
+'APIQueryAfterExecute': After calling the execute() method of an
action=query submodule. Use this to extend core API modules.
&$module: Module object
-'APIQueryGeneratorAfterExecute': after calling the executeGenerator()
-method of an action=query submodule. Use this to extend core API modules.
+'APIQueryGeneratorAfterExecute': After calling the executeGenerator() method of
+an action=query submodule. Use this to extend core API modules.
&$module: Module object
&$resultPageSet: ApiPageSet object
-'APIQueryInfoTokens': use this hook to add custom tokens to prop=info.
-Every token has an action, which will be used in the intoken parameter
-and in the output (actiontoken="..."), and a callback function which
-should return the token, or false if the user isn't allowed to obtain
-it. The prototype of the callback function is func($pageid, $title)
-where $pageid is the page ID of the page the token is requested for
-and $title is the associated Title object. In the hook, just add
-your callback to the $tokenFunctions array and return true (returning
-false makes no sense)
+'APIQueryInfoTokens': Use this hook to add custom tokens to prop=info. Every
+token has an action, which will be used in the intoken parameter and in the
+output (actiontoken="..."), and a callback function which should return the
+token, or false if the user isn't allowed to obtain it. The prototype of the
+callback function is func($pageid, $title), where $pageid is the page ID of the
+page the token is requested for and $title is the associated Title object. In
+the hook, just add your callback to the $tokenFunctions array and return true
+(returning false makes no sense).
$tokenFunctions: array(action => callback)
-'APIQueryRevisionsTokens': use this hook to add custom tokens to prop=revisions.
-Every token has an action, which will be used in the rvtoken parameter
-and in the output (actiontoken="..."), and a callback function which
-should return the token, or false if the user isn't allowed to obtain
-it. The prototype of the callback function is func($pageid, $title, $rev)
-where $pageid is the page ID of the page associated to the revision the
-token is requested for, $title the associated Title object and $rev the
-associated Revision object. In the hook, just add your callback to the
-$tokenFunctions array and return true (returning false makes no sense)
+'APIQueryRevisionsTokens': Use this hook to add custom tokens to prop=revisions.
+Every token has an action, which will be used in the rvtoken parameter and in
+the output (actiontoken="..."), and a callback function which should return the
+token, or false if the user isn't allowed to obtain it. The prototype of the
+callback function is func($pageid, $title, $rev), where $pageid is the page ID
+of the page associated to the revision the token is requested for, $title the
+associated Title object and $rev the associated Revision object. In the hook,
+just add your callback to the $tokenFunctions array and return true (returning
+false makes no sense).
$tokenFunctions: array(action => callback)
-'APIQueryRecentChangesTokens': use this hook to add custom tokens to
-list=recentchanges.
-Every token has an action, which will be used in the rctoken parameter
-and in the output (actiontoken="..."), and a callback function which
-should return the token, or false if the user isn't allowed to obtain
-it. The prototype of the callback function is func($pageid, $title, $rc)
-where $pageid is the page ID of the page associated to the revision the
-token is requested for, $title the associated Title object and $rc the
-associated RecentChange object. In the hook, just add your callback to the
-$tokenFunctions array and return true (returning false makes no sense)
+'APIQueryRecentChangesTokens': Use this hook to add custom tokens to
+list=recentchanges. Every token has an action, which will be used in the rctoken
+parameter and in the output (actiontoken="..."), and a callback function which
+should return the token, or false if the user isn't allowed to obtain it. The
+prototype of the callback function is func($pageid, $title, $rc), where $pageid
+is the page ID of the page associated to the revision the token is requested
+for, $title the associated Title object and $rc the associated RecentChange
+object. In the hook, just add your callback to the $tokenFunctions array and
+return true (returning false makes no sense).
$tokenFunctions: array(action => callback)
-'APIQuerySiteInfoGeneralInfo': use this hook to add extra information to
-the sites general information.
+'APIQuerySiteInfoGeneralInfo': Use this hook to add extra information to the
+sites general information.
$module: the current ApiQuerySiteInfo module
&$results: array of results, add things here
-'APIQueryUsersTokens': use this hook to add custom token to list=users.
-Every token has an action, which will be used in the ustoken parameter
-and in the output (actiontoken="..."), and a callback function which
-should return the token, or false if the user isn't allowed to obtain
-it. The prototype of the callback function is func($user) where $user
-is the User object. In the hook, just add your callback to the
-$tokenFunctions array and return true (returning false makes no sense)
+'APIQueryUsersTokens': Use this hook to add custom token to list=users. Every
+token has an action, which will be used in the ustoken parameter and in the
+output (actiontoken="..."), and a callback function which should return the
+token, or false if the user isn't allowed to obtain it. The prototype of the
+callback function is func($user) where $user is the User object. In the hook,
+just add your callback to the $tokenFunctions array and return true (returning
+false makes no sense).
$tokenFunctions: array(action => callback)
-'ApiMain::onException': Called by ApiMain::executeActionWithErrorHandling()
-when an exception is thrown during API action execution.
+'ApiMain::onException': Called by ApiMain::executeActionWithErrorHandling() when
+an exception is thrown during API action execution.
$apiMain: Calling ApiMain instance.
$e: Exception object.
-'ApiRsdServiceApis': Add or remove APIs from the RSD services list.
-Each service should have its own entry in the $apis array and have a
-unique name, passed as key for the array that represents the service data.
-In this data array, the key-value-pair identified by the apiLink key is
-required.
+'ApiRsdServiceApis': Add or remove APIs from the RSD services list. Each service
+should have its own entry in the $apis array and have a unique name, passed as
+key for the array that represents the service data. In this data array, the
+key-value-pair identified by the apiLink key is required.
&$apis: array of services
-'ApiTokensGetTokenTypes': use this hook to extend action=tokens with new
-token types.
+'ApiTokensGetTokenTypes': Use this hook to extend action=tokens with new token
+types.
&$tokenTypes: supported token types in format 'type' => callback function
used to retrieve this type of tokens.
-'ArticleAfterFetchContent': after fetching content of an article from
-the database
+'ArticleAfterFetchContent': After fetching content of an article from the
+database. DEPRECATED, use ArticleAfterFetchContentObject instead.
+$article: the article (object) being loaded from the database
+&$content: the content (string) of the article
+
+'ArticleAfterFetchContentObject': After fetching content of an article from the
+database.
$article: the article (object) being loaded from the database
-$content: the content (string) of the article
+&$content: the content of the article, as a Content object
-'ArticleConfirmDelete': before writing the confirmation form for article
- deletion
+'ArticleConfirmDelete': Before writing the confirmation form for article
+deletion.
$article: the article (object) being deleted
-$output: the OutputPage object ($wgOut)
+$output: the OutputPage object
&$reason: the reason (string) the article is being deleted
-'ArticleContentOnDiff': before showing the article content below a diff.
-Use this to change the content in this area or how it is loaded.
- $diffEngine: the DifferenceEngine
- $output: the OutputPage object ($wgOut)
+'ArticleContentOnDiff': Before showing the article content below a diff. Use
+this to change the content in this area or how it is loaded.
+$diffEngine: the DifferenceEngine
+$output: the OutputPage object
-'ArticleDelete': before an article is deleted
-$article: the WikiPage (object) being deleted
+'ArticleDelete': Before an article is deleted.
+$wikiPage: the WikiPage (object) being deleted
$user: the user (object) deleting the article
$reason: the reason (string) the article is being deleted
$error: if the deletion was prohibited, the (raw HTML) error message to display
@@ -459,93 +478,97 @@ $error: if the deletion was prohibited, the (raw HTML) error message to display
$status: Status object, modify this to throw an error. Overridden by $error
(added in 1.20)
-'ArticleDeleteComplete': after an article is deleted
-$article: the WikiPage that was deleted
+'ArticleDeleteComplete': After an article is deleted.
+$wikiPage: the WikiPage that was deleted
$user: the user that deleted the article
$reason: the reason the article was deleted
$id: id of the article that was deleted
+$content: the Content of the deleted page
+$logEntry: the ManualLogEntry used to record the deletion
-'ArticleEditUpdateNewTalk': before updating user_newtalk when a user talk page
-was changed
-$article: WikiPage (object) of the user talk page
+'ArticleEditUpdateNewTalk': Before updating user_newtalk when a user talk page
+was changed.
+$wikiPage: WikiPage (object) of the user talk page
-'ArticleEditUpdates': when edit updates (mainly link tracking) are made when an
-article has been changed
-$article: the WikiPage (object)
+'ArticleEditUpdates': When edit updates (mainly link tracking) are made when an
+article has been changed.
+$wikiPage: the WikiPage (object)
$editInfo: data holder that includes the parser output ($editInfo->output) for
that page after the change
$changed: bool for if the page was changed
-'ArticleEditUpdatesDeleteFromRecentchanges': before deleting old entries from
-recentchanges table, return false to not delete old entries
-$article: WikiPage (object) being modified
+'ArticleEditUpdatesDeleteFromRecentchanges': Before deleting old entries from
+recentchanges table, return false to not delete old entries.
+$wikiPage: WikiPage (object) being modified
'ArticleFromTitle': when creating an article object from a title object using
-Wiki::articleFromTitle()
-$title: title (object) used to create the article object
-$article: article (object) that will be returned
+Wiki::articleFromTitle().
+$title: Title (object) used to create the article object
+$article: Article (object) that will be returned
-'ArticleInsertComplete': After a new article is created
-$article: WikiPage created
+'ArticleInsertComplete': After a new article is created. DEPRECATED, use
+PageContentInsertComplete.
+$wikiPage: WikiPage created
$user: User creating the article
$text: New content
$summary: Edit summary/comment
$isMinor: Whether or not the edit was marked as minor
$isWatch: (No longer used)
$section: (No longer used)
-$flags: Flags passed to Article::doEdit()
+$flags: Flags passed to WikiPage::doEditContent()
$revision: New Revision of the article
-'ArticleMergeComplete': after merging to article using Special:Mergehistory
+'ArticleMergeComplete': After merging to article using Special:Mergehistory.
$targetTitle: target title (object)
$destTitle: destination title (object)
-'ArticlePageDataAfter': after loading data of an article from the database
-$article: WikiPage (object) whose data were loaded
+'ArticlePageDataAfter': After loading data of an article from the database.
+$wikiPage: WikiPage (object) whose data were loaded
$row: row (object) returned from the database server
-'ArticlePageDataBefore': before loading data of an article from the database
-$article: WikiPage (object) that data will be loaded
-$fields: fileds (array) to load from the database
+'ArticlePageDataBefore': Before loading data of an article from the database.
+$wikiPage: WikiPage (object) that data will be loaded
+$fields: fields (array) to load from the database
-'ArticlePrepareTextForEdit': called when preparing text to be saved
-$article: the WikiPage being saved
+'ArticlePrepareTextForEdit': Called when preparing text to be saved.
+$wikiPage: the WikiPage being saved
$popts: parser options to be used for pre-save transformation
-'ArticleProtect': before an article is protected
-$article: the WikiPage being protected
+'ArticleProtect': Before an article is protected.
+$wikiPage: the WikiPage being protected
$user: the user doing the protection
$protect: boolean whether this is a protect or an unprotect
$reason: Reason for protect
$moveonly: boolean whether this is for move only or not
-'ArticleProtectComplete': after an article is protected
-$article: the WikiPage that was protected
+'ArticleProtectComplete': After an article is protected.
+$wikiPage: the WikiPage that was protected
$user: the user who did the protection
$protect: boolean whether it was a protect or an unprotect
$reason: Reason for protect
$moveonly: boolean whether it was for move only or not
-'ArticlePurge': before executing "&action=purge"
-$article: WikiPage (object) to purge
+'ArticlePurge': Before executing "&action=purge".
+$wikiPage: WikiPage (object) to purge
-'ArticleRevisionVisibilitySet': called when changing visibility of one or more
-revision of an article
-&$title: title object of the article
+'ArticleRevisionVisibilitySet': Called when changing visibility of one or more
+revisions of an article.
+&$title: Title object of the article
-'ArticleRevisionUndeleted': after an article revision is restored
+'ArticleRevisionUndeleted': After an article revision is restored.
$title: the article title
$revision: the revision
$oldPageID: the page ID of the revision when archived (may be null)
-'ArticleRollbackComplete': after an article rollback is completed
-$article: the WikiPage that was edited
+'ArticleRollbackComplete': After an article rollback is completed.
+$wikiPage: the WikiPage that was edited
$user: the user who did the rollback
$revision: the revision the page was reverted back to
$current: the reverted revision
-'ArticleSave': before an article is saved
-$article: the WikiPage (object) being saved
+'ArticleSave': Before an article is saved. DEPRECATED, use PageContentSave
+instead.
+$wikiPage: the WikiPage (object) being saved
$user: the user (object) saving the article
$text: the new article text
$summary: the article summary (comment)
@@ -553,27 +576,33 @@ $isminor: minor flag
$iswatch: watch flag
$section: section #
-'ArticleSaveComplete': After an article has been updated
-$article: WikiPage modified
+'ArticleSaveComplete': After an article has been updated. DEPRECATED, use
+PageContentSaveComplete instead.
+$wikiPage: WikiPage modified
$user: User performing the modification
$text: New content
$summary: Edit summary/comment
$isMinor: Whether or not the edit was marked as minor
$isWatch: (No longer used)
$section: (No longer used)
-$flags: Flags passed to Article::doEdit()
+$flags: Flags passed to WikiPage::doEditContent()
$revision: New Revision of the article
-$status: Status object about to be returned by doEdit()
+$status: Status object about to be returned by doEditContent()
$baseRevId: the rev ID (or false) this edit was based on
-'ArticleUndelete': When one or more revisions of an article are restored
+'ArticleUndelete': When one or more revisions of an article are restored.
$title: Title corresponding to the article restored
-$create: Whether or not the restoration caused the page to be created
-(i.e. it didn't exist before)
+$create: Whether or not the restoration caused the page to be created (i.e. it
+ didn't exist before).
$comment: The comment associated with the undeletion.
-'ArticleUpdateBeforeRedirect': After a page is updated (usually on save),
-before the user is redirected back to the page
+'ArticleUndeleteLogEntry': When a log entry is generated but not yet saved.
+$pageArchive: the PageArchive object
+&$logEntry: ManualLogEntry object
+$user: User who is performing the log action
+
+'ArticleUpdateBeforeRedirect': After a page is updated (usually on save), before
+the user is redirected back to the page.
&$article: the article
&$sectionanchor: The section anchor link (e.g. "#overview" )
&$extraq: Extra query parameters which can be added via hooked functions
@@ -588,52 +617,61 @@ viewing.
&$outputDone: whether the output for this page finished or not. Set to a ParserOutput
object to both indicate that the output is done and what parser output was used.
-'ArticleViewRedirect': before setting "Redirected from ..." subtitle when
-follwed an redirect
+'ArticleViewRedirect': Before setting "Redirected from ..." subtitle when a
+redirect was followed.
$article: target article (object)
-'ArticleViewCustom': allows to output the text of the article in a different format than wikitext
+'ArticleViewCustom': Allows to output the text of the article in a different
+format than wikitext. DEPRECATED, use ArticleContentViewCustom instead. Note
+that it is preferable to implement proper handing for a custom data type using
+the ContentHandler facility.
$text: text of the page
$title: title of the page
$output: reference to $wgOut
+'ArticleContentViewCustom': Allows to output the text of the article in a
+different format than wikitext. Note that it is preferable to implement proper
+handing for a custom data type using the ContentHandler facility.
+$content: content of the page, as a Content object
+$title: title of the page
+$output: reference to $wgOut
+
'AuthPluginAutoCreate': Called when creating a local account for an user logged
-in from an external authentication method
+in from an external authentication method.
$user: User object created locally
-'AuthPluginSetup': update or replace authentication plugin object ($wgAuth)
-Gives a chance for an extension to set it programattically to a variable class.
+'AuthPluginSetup': Update or replace authentication plugin object ($wgAuth).
+Gives a chance for an extension to set it programmatically to a variable class.
&$auth: the $wgAuth object, probably a stub
-'AutopromoteCondition': check autopromote condition for user.
+'AutopromoteCondition': Check autopromote condition for user.
$type: condition type
$args: arguments
$user: user
$result: result of checking autopromote condition
-'BacklinkCacheGetPrefix': allows to set prefix for a spefific link table
+'BacklinkCacheGetPrefix': Allows to set prefix for a specific link table.
$table: table name
&$prefix: prefix
-'BacklinkCacheGetConditions': allows to set conditions for query when links to certain title
-are fetched
+'BacklinkCacheGetConditions': Allows to set conditions for query when links to
+certain title are fetched.
$table: table name
$title: title of the page to which backlinks are sought
&$conds: query conditions
-'BadImage': When checking against the bad image list
+'BadImage': When checking against the bad image list. Change $bad and return
+false to override. If an image is "bad", it is not rendered inline in wiki
+pages or galleries in category pages.
$name: Image name being checked
&$bad: Whether or not the image is "bad"
-Change $bad and return false to override. If an image is "bad", it is not
-rendered inline in wiki pages or galleries in category pages.
-
-'BeforeDisplayNoArticleText': before displaying noarticletext or noarticletext-nopermission
-at Article::showMissingArticle()
-
+'BeforeDisplayNoArticleText': Before displaying message key "noarticletext" or
+"noarticletext-nopermission" at Article::showMissingArticle().
$article: article object
-'BeforeInitialize': before anything is initialized in MediaWiki::performRequest()
+'BeforeInitialize': Before anything is initialized in
+MediaWiki::performRequest().
&$title: Title being used for request
$unused: null
&$output: OutputPage object
@@ -641,7 +679,7 @@ $unused: null
$request: WebRequest object
$mediaWiki: Mediawiki object
-'BeforePageDisplay': Prior to outputting a page
+'BeforePageDisplay': Prior to outputting a page.
&$out: OutputPage object
&$skin: Skin object
@@ -652,27 +690,31 @@ $out: OutputPage object
&$redirect: URL, modifiable
&$code: HTTP code (eg '301' or '302'), modifiable
-'BeforeParserFetchFileAndTitle': before an image is rendered by Parser
+'BeforeParserFetchFileAndTitle': Before an image is rendered by Parser.
$parser: Parser object
$nt: the image title
&$options: array of options to RepoGroup::findFile
&$descQuery: query string to add to thumbnail URL
+FIXME: Where does the below sentence fit in?
If 'broken' is a key in $options then the file will appear as a broken thumbnail.
-'BeforeParserFetchTemplateAndtitle': before a template is fetched by Parser
+'BeforeParserFetchTemplateAndtitle': Before a template is fetched by Parser.
$parser: Parser object
$title: title of the template
&$skip: skip this template and link it?
&$id: the id of the revision being parsed
-'BeforeParserrenderImageGallery': before an image gallery is rendered by Parser
+'BeforeParserrenderImageGallery': Before an image gallery is rendered by Parser.
&$parser: Parser object
&$ig: ImageGallery object
-'BeforeWelcomeCreation': before the welcomecreation message is displayed to a newly created user
-&$welcome_creation_msg: MediaWiki message name to display on the welcome screen to a newly created user account
-&$injected_html: Any HTML to inject after the "logged in" message of a newly created user account
+'BeforeWelcomeCreation': Before the welcomecreation message is displayed to a
+newly created user.
+&$welcome_creation_msg: MediaWiki message name to display on the welcome screen
+ to a newly created user account.
+&$injected_html: Any HTML to inject after the "logged in" message of a newly
+ created user account
'BitmapHandlerTransform': before a file is transformed, gives extension the
possibility to transform it themselves
@@ -681,53 +723,87 @@ $image: File
&$scalerParams: Array with scaler parameters
&$mto: null, set to a MediaTransformOutput
-'BitmapHandlerCheckImageArea': by BitmapHandler::normaliseParams, after all normalizations have been performed, except for the $wgMaxImageArea check
+'BitmapHandlerCheckImageArea': By BitmapHandler::normaliseParams, after all
+normalizations have been performed, except for the $wgMaxImageArea check.
$image: File
&$params: Array of parameters
-&$checkImageAreaHookResult: null, set to true or false to override the $wgMaxImageArea check result
+&$checkImageAreaHookResult: null, set to true or false to override the
+ $wgMaxImageArea check result.
-'PerformRetroactiveAutoblock': called before a retroactive autoblock is applied to a user
+'PerformRetroactiveAutoblock': Called before a retroactive autoblock is applied
+to a user.
$block: Block object (which is set to be autoblocking)
&$blockIds: Array of block IDs of the autoblock
-'BlockIp': before an IP address or user is blocked
+'BlockIp': Before an IP address or user is blocked.
$block: the Block object about to be saved
$user: the user _doing_ the block (not the one being blocked)
-'BlockIpComplete': after an IP address or user is blocked
+'BlockIpComplete': After an IP address or user is blocked.
$block: the Block object that was saved
$user: the user who did the block (not the one being blocked)
-'BookInformation': Before information output on Special:Booksources
+'BookInformation': Before information output on Special:Booksources.
$isbn: ISBN to show information for
$output: OutputPage object in use
-'CanonicalNamespaces': For extensions adding their own namespaces or altering the defaults
+'CanonicalNamespaces': For extensions adding their own namespaces or altering
+the defaults.
&$namespaces: Array of namespace numbers with corresponding canonical names
-'CategoryPageView': before viewing a categorypage in CategoryPage::view
+'CategoryAfterPageAdded': After a page is added to a category.
+$category: Category that page was added to
+$wikiPage: WikiPage that was added
+
+'CategoryAfterPageRemoved': After a page is removed from a category.
+$category: Category that page was removed from
+$wikiPage: WikiPage that was removed
+
+'CategoryPageView': Before viewing a categorypage in CategoryPage::view.
$catpage: CategoryPage instance
-'ChangePasswordForm': For extensions that need to add a field to the ChangePassword form
-via the Preferences form
-&$extraFields: An array of arrays that hold fields like would be passed to the pretty function.
+'ChangePasswordForm': For extensions that need to add a field to the
+ChangePassword form via the Preferences form.
+&$extraFields: An array of arrays that hold fields like would be passed to the
+ pretty function.
'ChangesListInsertArticleLink': Override or augment link to article in RC list.
&$changesList: ChangesList instance.
&$articlelink: HTML of link to article (already filled-in).
-&$s: HTML of row that is being constructed.
-&$rc: RecentChange instance.
-$unpatrolled: Whether or not we are showing unpatrolled changes.
-$watched: Whether or not the change is watched by the user.
+&$s: HTML of row that is being constructed.
+&$rc: RecentChange instance.
+$unpatrolled: Whether or not we are showing unpatrolled changes.
+$watched: Whether or not the change is watched by the user.
-'Collation::factory': Called if $wgCategoryCollation is an unknown collation
+'Collation::factory': Called if $wgCategoryCollation is an unknown collation.
$collationName: Name of the collation in question
-&$collationObject: Null. Replace with a subclass of the Collation class that implements
-the collation given in $collationName.
+&$collationObject: Null. Replace with a subclass of the Collation class that
+ implements the collation given in $collationName.
-'ConfirmEmailComplete': Called after a user's email has been confirmed successfully
+'ConfirmEmailComplete': Called after a user's email has been confirmed
+successfully.
$user: user (object) whose email is being confirmed
+'ContentHandlerDefaultModelFor': Called when the default content model is determined
+for a given title. May be used to assign a different model for that title.
+$title: the Title in question
+&$model: the model name. Use with CONTENT_MODEL_XXX constants.
+
+'ContentHandlerForModelID': Called when a ContentHandler is requested for a given
+content model name, but no entry for that model exists in $wgContentHandlers.
+$modeName: the requested content model name
+&$handler: set this to a ContentHandler object, if desired.
+
+'ConvertContent': Called by AbstractContent::convert when a conversion to another
+content model is requested.
+$content: The Content object to be converted.
+$toModel: The ID of the content model to convert to.
+$lossy: boolean indicating whether lossy conversion is allowed.
+&$result: Output parameter, in case the handler function wants to provide a
+converted Content object. Note that $result->getContentModel() must return $toModel.
+Handler functions that modify $result should generally return false to further
+attempts at conversion.
+
'ContribsPager::getQueryInfo': Before the contributions query is about to run
&$pager: Pager object for contributions
&$queryInfo: The query for the contribs Pager
@@ -761,7 +837,7 @@ etc.
'DatabaseOraclePostInit': Called after initialising an Oracle database
&$db: the DatabaseOracle object
-'Debug': called when outputting a debug log line via wfDebug() or wfDebugLog()
+'Debug': Called when outputting a debug log line via wfDebug() or wfDebugLog()
$text: plaintext string to be output
$group: null or a string naming a logging group (as defined in $wgDebugLogGroups)
@@ -772,7 +848,12 @@ $title: the diff page title (nullable)
$old: the ?old= param value from the url
$new: the ?new= param value from the url
-'DiffViewHeader': called before diff display
+'DiffRevisionTools': Override or extend the revision tools available from the
+diff view, i.e. undo, etc.
+$rev: Revision object
+&$links: Array of HTML links
+
+'DiffViewHeader': Called before diff display
$diff: DifferenceEngine object that's calling
$oldRev: Revision object of the "old" revision (may be null/invalid)
$newRev: Revision object of the "new" revision
@@ -795,18 +876,32 @@ $tooltip: The default tooltip. Escape before using.
$lang: The language code to use for the link in the wfMessage function
'EditFilter': Perform checks on an edit
-$editor: Edit form (see includes/EditPage.php)
+$editor: EditPage instance (object). The edit form (see includes/EditPage.php)
$text: Contents of the edit box
$section: Section being edited
&$error: Error message to return
$summary: Edit summary for page
-'EditFilterMerged': Post-section-merge edit filter
+'EditFilterMerged': Post-section-merge edit filter.
+DEPRECATED, use EditFilterMergedContent instead.
$editor: EditPage instance (object)
$text: content of the edit box
&$error: error message to return
$summary: Edit summary for page
+'EditFilterMergedContent': Post-section-merge edit filter.
+This may be triggered by the EditPage or any other facility that modifies page content.
+Use the $status object to indicate whether the edit should be allowed, and to provide
+a reason for disallowing it. Return false to abort the edit, and true to continue.
+Returning true if $status->isOK() returns false means "don't save but continue user
+interaction", e.g. show the edit form.
+$context: object implementing the IContextSource interface.
+$content: content of the edit box, as a Content object.
+$status: Status object to represent errors, etc.
+$summary: Edit summary for page
+$user: the User object representing the user whois performing the edit.
+$minoredit: whether the edit was marked as minor by the user.
+
'EditFormPreloadText': Allows population of the edit form when creating
new pages
&$text: Text to preload with
@@ -816,8 +911,8 @@ new pages
pages
$editPage: EditPage object
-'EditPage::attemptSave': called before an article is
-saved, that is before Article::doEdit() is called
+'EditPage::attemptSave': Called before an article is
+saved, that is before WikiPage::doEditContent() is called
$editpage_Obj: the current EditPage object
'EditPage::importFormData': allow extensions to read additional data
@@ -840,6 +935,13 @@ yourself. Alternatively, modifying $error and returning true will cause the
contents of $error to be echoed at the top of the edit form as wikitext.
Return true without altering $error to allow the edit to proceed.
+'EditPage::showStandardInputs:options': allows injection of form fields into
+the editOptions area
+$editor: EditPage instance (object)
+$out: an OutputPage instance to write to
+&$tabindex: HTML tabindex of the last edit check/button
+return value is ignored (should always be true)
+
'EditPageBeforeConflictDiff': allows modifying the EditPage object and output
when there's an edit conflict. Return false to halt normal diff output; in
this case you're responsible for computing and outputting the entire "conflict"
@@ -848,40 +950,59 @@ sections.
&$editor: EditPage instance
&$out: OutputPage instance
-'EditPageBeforeEditButtons': allows modifying the edit buttons below the
-textarea in the edit form
+'EditPageBeforeEditButtons': Allows modifying the edit buttons below the
+textarea in the edit form.
&$editpage: The current EditPage object
&$buttons: Array of edit buttons "Save", "Preview", "Live", and "Diff"
&$tabindex: HTML tabindex of the last edit check/button
-'EditPageBeforeEditChecks': allows modifying the edit checks below the
-textarea in the edit form
+'EditPageBeforeEditChecks': Allows modifying the edit checks below the textarea
+in the edit form.
&$editpage: The current EditPage object
&$checks: Array of edit checks like "watch this page"/"minor edit"
&$tabindex: HTML tabindex of the last edit check/button
-'EditPageBeforeEditToolbar': allows modifying the edit toolbar above the
-textarea in the edit form
+'EditPageBeforeEditToolbar': Allows modifying the edit toolbar above the
+textarea in the edit form.
&$toolbar: The toolbar HTMl
-'EditPageCopyrightWarning': Allow for site and per-namespace customization of contribution/copyright notice.
+'EditPageCopyrightWarning': Allow for site and per-namespace customization of
+contribution/copyright notice.
$title: title of page being edited
-&$msg: localization message name, overridable. Default is either 'copyrightwarning' or 'copyrightwarning2'
+&$msg: localization message name, overridable. Default is either
+ 'copyrightwarning' or 'copyrightwarning2'.
+
+'EditPageGetDiffText': DEPRECATED. Use EditPageGetDiffContent instead. Allow
+modifying the wikitext that will be used in "Show changes". Note that it is
+preferable to implement diff handling for different data types using the
+ContentHandler facility.
+$editPage: EditPage object
+&$newtext: wikitext that will be used as "your version"
-'EditPageGetDiffText': Allow modifying the wikitext that will be used in
-"Show changes"
+'EditPageGetDiffContent': Allow modifying the wikitext that will be used in
+"Show changes". Note that it is preferable to implement diff handling for
+different data types using the ContentHandler facility.
$editPage: EditPage object
&$newtext: wikitext that will be used as "your version"
-'EditPageGetPreviewText': Allow modifying the wikitext that will be previewed
+'EditPageGetPreviewText': DEPRECATED. Use EditPageGetPreviewContent instead.
+Allow modifying the wikitext that will be previewed. Note that it is preferable
+to implement previews for different data types using the ContentHandler
+facility.
$editPage: EditPage object
&$toparse: wikitext that will be parsed
+'EditPageGetPreviewContent': Allow modifying the wikitext that will be
+previewed. Note that it is preferable to implement previews for different data
+types using the ContentHandler facility.
+$editPage: EditPage object
+&$content: Content object to be previewed (may be replaced by hook function)
+
'EditPageNoSuchSection': When a section edit request is given for an non-existent section
&$editpage: The current EditPage object
&$res: the HTML of the error text
-'EditPageTosSummary': Give a chance for site and per-namespace customizations
+'EditPageTosSummary': Give a chance for site and per-namespace customizations
of terms of service summary link that might exist separately from the copyright
notice.
$title: title of page being edited
@@ -895,73 +1016,80 @@ $link: Default link
&$result: Result (alter this to override the generated links)
$lang: The language code to use for the link in the wfMessage function
-'EmailConfirmed': When checking that the user's email address is "confirmed"
+'EmailConfirmed': When checking that the user's email address is "confirmed".
$user: User being checked
$confirmed: Whether or not the email address is confirmed
This runs before the other checks, such as anonymity and the real check; return
true to allow those checks to occur, and false if checking is done.
-'EmailUser': before sending email from one user to another
+'EmailUser': Before sending email from one user to another.
$to: address of receiving user
$from: address of sending user
$subject: subject of the mail
$text: text of the mail
-'EmailUserCC': before sending the copy of the email to the author
+'EmailUserCC': Before sending the copy of the email to the author.
$to: address of receiving user
$from: address of sending user
$subject: subject of the mail
$text: text of the mail
-'EmailUserComplete': after sending email from one user to another
+'EmailUserComplete': After sending email from one user to another.
$to: address of receiving user
$from: address of sending user
$subject: subject of the mail
$text: text of the mail
-'EmailUserForm': after building the email user form object
+'EmailUserForm': After building the email user form object.
$form: HTMLForm object
-'EmailUserPermissionsErrors': to retrieve permissions errors for emailing a user.
+'EmailUserPermissionsErrors': to retrieve permissions errors for emailing a
+user.
$user: The user who is trying to email another user.
$editToken: The user's edit token.
-&$hookErr: Out-param for the error. Passed as the parameters to OutputPage::showErrorPage.
+&$hookErr: Out-param for the error. Passed as the parameters to
+ OutputPage::showErrorPage.
-'ExemptFromAccountCreationThrottle': Exemption from the account creation throttle
+'ExemptFromAccountCreationThrottle': Exemption from the account creation
+throttle.
$ip: The ip address of the user
-'ExtensionTypes': called when generating the extensions credits, use this to change the tables headers
+'ExtensionTypes': Called when generating the extensions credits, use this to
+change the tables headers.
&$extTypes: associative array of extensions types
-'ExtractThumbParameters': called when extracting thumbnail parameters from a thumbnail file name
+'ExtractThumbParameters': Called when extracting thumbnail parameters from a
+thumbnail file name.
$thumbname: the base name of the thumbnail file
&$params: the currently extracted params (has source name, temp or archived zone)
-'FetchChangesList': When fetching the ChangesList derivative for
-a particular user
+'FetchChangesList': When fetching the ChangesList derivative for a particular
+user.
$user: User the list is being fetched for
&$skin: Skin object to be used with the list
-&$list: List object (defaults to NULL, change it to an object
- instance and return false override the list derivative used)
+&$list: List object (defaults to NULL, change it to an object instance and
+ return false override the list derivative used)
-'FileDeleteComplete': When a file is deleted
+'FileDeleteComplete': When a file is deleted.
$file: reference to the deleted file
$oldimage: in case of the deletion of an old image, the name of the old file
$article: in case all revisions of the file are deleted a reference to the
- WikiFilePage associated with the file.
+ WikiFilePage associated with the file.
$user: user who performed the deletion
$reason: reason
-'FileTransformed': When a file is transformed and moved into storage
+'FileTransformed': When a file is transformed and moved into storage.
$file: reference to the File object
$thumb: the MediaTransformOutput object
$tmpThumbPath: The temporary file system path of the transformed file
$thumbPath: The permanent storage path of the transformed file
-'FileUpload': When a file upload occurs
+'FileUpload': When a file upload occurs.
$file : Image object representing the file that was uploaded
-$reupload : Boolean indicating if there was a previously another image there or not (since 1.17)
-$hasDescription : Boolean indicating that there was already a description page and a new one from the comment wasn't created (since 1.17)
+$reupload : Boolean indicating if there was a previously another image there or
+ not (since 1.17)
+$hasDescription : Boolean indicating that there was already a description page
+ and a new one from the comment wasn't created (since 1.17)
'FileUndeleteComplete': When a file is undeleted
$title: title object to the file
@@ -969,28 +1097,30 @@ $fileVersions: array of undeleted versions. Empty if all versions were restored
$user: user who performed the undeletion
$reason: reason
-'FormatAutocomments': When an autocomment is formatted by the Linker
- &$comment: Reference to the accumulated comment. Initially null, when set the default code will be skipped.
+'FormatAutocomments': When an autocomment is formatted by the Linker.
+ &$comment: Reference to the accumulated comment. Initially null, when set the
+ default code will be skipped.
$pre: Initial part of the parsed comment before the call to the hook.
$auto: The extracted part of the parsed comment before the call to the hook.
$post: The final part of the parsed comment before the call to the hook.
$title: An optional title object used to links to sections. Can be null.
$local: Boolean indicating whether section links should refer to local page.
-'GetAutoPromoteGroups': When determining which autopromote groups a user
-is entitled to be in.
+'GetAutoPromoteGroups': When determining which autopromote groups a user is
+entitled to be in.
&$user: user to promote.
&$promote: groups that will be added.
'GetBlockedStatus': after loading blocking status of an user from the database
$user: user (object) being checked
-'GetCacheVaryCookies': get cookies that should vary cache options
+'GetCacheVaryCookies': Get cookies that should vary cache options.
$out: OutputPage object
&$cookies: array of cookies name, add a value to it if you want to add a cookie
- that have to vary cache options
+ that have to vary cache options
-'GetCanonicalURL': modify fully-qualified URLs used for IRC and e-mail notifications
+'GetCanonicalURL': Modify fully-qualified URLs used for IRC and e-mail
+notifications.
$title: Title object of page
$url: string value as output (out parameter, can modify)
$query: query options passed to Title::getCanonicalURL()
@@ -999,157 +1129,175 @@ $query: query options passed to Title::getCanonicalURL()
$title: Title object that we need to get a sortkey for
&$sortkey: Sortkey to use.
-'GetFullURL': modify fully-qualified URLs used in redirects/export/offsite data
+'GetDoubleUnderscoreIDs': Modify the list of behavior switch (double
+underscore) magic words. Called by MagicWord.
+&$doubleUnderscoreIDs: array of strings
+
+'GetFullURL': Modify fully-qualified URLs used in redirects/export/offsite data.
$title: Title object of page
$url: string value as output (out parameter, can modify)
$query: query options passed to Title::getFullURL()
-'GetInternalURL': modify fully-qualified URLs used for squid cache purging
+'GetInternalURL': Modify fully-qualified URLs used for squid cache purging.
$title: Title object of page
$url: string value as output (out parameter, can modify)
$query: query options passed to Title::getInternalURL()
-'GetIP': modify the ip of the current user (called only once)
+'GetIP': modify the ip of the current user (called only once).
&$ip: string holding the ip as determined so far
-'GetLinkColours': modify the CSS class of an array of page links
+'GetLinkColours': modify the CSS class of an array of page links.
$linkcolour_ids: array of prefixed DB keys of the pages linked to,
indexed by page_id.
&$colours: (output) array of CSS classes, indexed by prefixed DB keys
-'GetLocalURL': modify local URLs as output into page links. Note that if you
- are working with internal urls (non-interwiki) then it may be preferable
- to work with the GetLocalURL::Internal or GetLocalURL::Article hooks as
- GetLocalURL can be buggy for internal urls on render if you do not
- re-implement the horrible hack that Title::getLocalURL uses
- in your own extension.
+'GetLocalURL': Modify local URLs as output into page links. Note that if you are
+working with internal urls (non-interwiki) then it may be preferable to work
+with the GetLocalURL::Internal or GetLocalURL::Article hooks as GetLocalURL can
+be buggy for internal urls on render if you do not re-implement the horrible
+hack that Title::getLocalURL uses in your own extension.
$title: Title object of page
&$url: string value as output (out parameter, can modify)
$query: query options passed to Title::getLocalURL()
-'GetLocalURL::Internal': modify local URLs to internal pages.
+'GetLocalURL::Internal': Modify local URLs to internal pages.
$title: Title object of page
&$url: string value as output (out parameter, can modify)
$query: query options passed to Title::getLocalURL()
-'GetLocalURL::Article': modify local URLs specifically pointing to article paths
- without any fancy queries or variants.
+'GetLocalURL::Article': Modify local URLs specifically pointing to article paths
+without any fancy queries or variants.
$title: Title object of page
&$url: string value as output (out parameter, can modify)
-'GetMetadataVersion': modify the image metadata version currently in use. This is
- used when requesting image metadata from a ForiegnApiRepo. Media handlers
- that need to have versioned metadata should add an element to the end of
- the version array of the form 'handler_name=version'. Most media handlers
- won't need to do this unless they broke backwards compatibility with a
- previous version of the media handler metadata output.
+'GetMetadataVersion': Modify the image metadata version currently in use. This
+is used when requesting image metadata from a ForeignApiRepo. Media handlers
+that need to have versioned metadata should add an element to the end of the
+version array of the form 'handler_name=version'. Most media handlers won't need
+to do this unless they broke backwards compatibility with a previous version of
+the media handler metadata output.
&$version: Array of version strings
-'GetPreferences': modify user preferences
+'GetPreferences': Modify user preferences.
$user: User whose preferences are being modified.
&$preferences: Preferences description array, to be fed to an HTMLForm object
'getUserPermissionsErrors': Add a permissions error when permissions errors are
- checked for. Use instead of userCan for most cases. Return false if the
- user can't do it, and populate $result with the reason in the form of
- array( messagename, param1, param2, ... ). For consistency, error messages
- should be plain text with no special coloring, bolding, etc. to show that
- they're errors; presenting them properly to the user as errors is done by
- the caller.
+checked for. Use instead of userCan for most cases. Return false if the user
+can't do it, and populate $result with the reason in the form of
+array( messagename, param1, param2, ... ). For consistency, error messages
+should be plain text with no special coloring, bolding, etc. to show that
+they're errors; presenting them properly to the user as errors is done by the
+caller.
$title: Title object being checked against
$user : Current user object
$action: Action being checked
$result: User permissions error to add. If none, return true.
-'getUserPermissionsErrorsExpensive': Absolutely the same, but is called only
- if expensive checks are enabled.
+'getUserPermissionsErrorsExpensive': Equal to getUserPermissionsErrors, but is
+called only if expensive checks are enabled. Add a permissions error when
+permissions errors are checked for. Return false if the user can't do it, and
+populate $result with the reason in the form of array( messagename, param1,
+param2, ... ). For consistency, error messages should be plain text with no
+special coloring, bolding, etc. to show that they're errors; presenting them
+properly to the user as errors is done by the caller.
-'GitViewers': called when generating the list of git viewers for Special:Version, use
- this to change the list.
+$title: Title object being checked against
+$user : Current user object
+$action: Action being checked
+$result: User permissions error to add. If none, return true.
+
+'GitViewers': Called when generating the list of git viewers for
+Special:Version, use this to change the list.
&$extTypes: associative array of repo URLS to viewer URLs.
+'HistoryRevisionTools': Override or extend the revision tools available from the
+page history view, i.e. undo, rollback, etc.
+$rev: Revision object
+&$links: Array of HTML links
'ImageBeforeProduceHTML': Called before producing the HTML created by a wiki
- image insertion. You can skip the default logic entirely by returning
- false, or just modify a few things using call-by-reference.
+image insertion. You can skip the default logic entirely by returning false, or
+just modify a few things using call-by-reference.
&$skin: Skin object
&$title: Title object of the image
&$file: File object, or false if it doesn't exist
&$frameParams: Various parameters with special meanings; see documentation in
- includes/Linker.php for Linker::makeImageLink
+ includes/Linker.php for Linker::makeImageLink
&$handlerParams: Various parameters with special meanings; see documentation in
- includes/Linker.php for Linker::makeImageLink
+ includes/Linker.php for Linker::makeImageLink
&$time: Timestamp of file in 'YYYYMMDDHHIISS' string form, or false for current
&$res: Final HTML output, used if you return false
'ImageOpenShowImageInlineBefore': Call potential extension just before showing
- the image on an image page
+the image on an image page.
$imagePage: ImagePage object ($this)
$output: $wgOut
-'ImagePageAfterImageLinks': called after the image links section on an image
- page is built
+'ImagePageAfterImageLinks': Called after the image links section on an image
+page is built.
$imagePage: ImagePage object ($this)
&$html: HTML for the hook to add
-'ImagePageFileHistoryLine': called when a file history line is contructed
+'ImagePageFileHistoryLine': Called when a file history line is constructed.
$file: the file
$line: the HTML of the history line
$css: the line CSS class
-'ImagePageFindFile': called when fetching the file associated with an image page
+'ImagePageFindFile': Called when fetching the file associated with an image
+page.
$page: ImagePage object
&$file: File object
&$displayFile: displayed File object
-'ImagePageShowTOC': called when the file toc on an image page is generated
+'ImagePageShowTOC': Called when the file toc on an image page is generated.
$page: ImagePage object
&$toc: Array of <li> strings
'ImgAuthBeforeStream': executed before file is streamed to user, but only when
- using img_auth.php
+using img_auth.php.
&$title: the Title object of the file as it would appear for the upload page
&$path: the original file and path name when img_auth was invoked by the the web
- server
+ server
&$name: the name only component of the file
&$result: The location to pass back results of the hook routine (only used if
- failed)
- $result[0]=The index of the header message
- $result[1]=The index of the body text message
- $result[2 through n]=Parameters passed to body text message. Please note the
- header message cannot receive/use parameters.
+ failed)
+ $result[0]=The index of the header message
+ $result[1]=The index of the body text message
+ $result[2 through n]=Parameters passed to body text message. Please note the
+ header message cannot receive/use parameters.
-'ImportHandleLogItemXMLTag': When parsing a XML tag in a log item
+'ImportHandleLogItemXMLTag': When parsing a XML tag in a log item.
$reader: XMLReader object
$logInfo: Array of information
Return false to stop further processing of the tag
-'ImportHandlePageXMLTag': When parsing a XML tag in a page
+'ImportHandlePageXMLTag': When parsing a XML tag in a page.
$reader: XMLReader object
$pageInfo: Array of information
Return false to stop further processing of the tag
-'ImportHandleRevisionXMLTag': When parsing a XML tag in a page revision
+'ImportHandleRevisionXMLTag': When parsing a XML tag in a page revision.
$reader: XMLReader object
$pageInfo: Array of page information
$revisionInfo: Array of revision information
Return false to stop further processing of the tag
-'ImportHandleToplevelXMLTag': When parsing a top level XML tag
+'ImportHandleToplevelXMLTag': When parsing a top level XML tag.
$reader: XMLReader object
Return false to stop further processing of the tag
-'ImportHandleUploadXMLTag': When parsing a XML tag in a file upload
+'ImportHandleUploadXMLTag': When parsing a XML tag in a file upload.
$reader: XMLReader object
$revisionInfo: Array of information
Return false to stop further processing of the tag
-'InfoAction': When building information to display on the action=info page
+'InfoAction': When building information to display on the action=info page.
$context: IContextSource object
&$pageInfo: Array of information
-'InitializeArticleMaybeRedirect': MediaWiki check to see if title is a redirect
+'InitializeArticleMaybeRedirect': MediaWiki check to see if title is a redirect.
$title: Title object ($wgTitle)
$request: WebRequest
$ignoreRedirect: boolean to skip redirect check
@@ -1162,10 +1310,10 @@ $prefix: interwiki prefix we are looking for.
&$iwData: output array describing the interwiki with keys iw_url, iw_local,
iw_trans and optionally iw_api and iw_wikiid.
-'InternalParseBeforeSanitize': during Parser's internalParse method just before the
-parser removes unwanted/dangerous HTML tags and after nowiki/noinclude/includeonly/
-onlyinclude and other processings. Ideal for syntax-extensions after template/parser
-function execution which respect nowiki and HTML-comments.
+'InternalParseBeforeSanitize': during Parser's internalParse method just before
+the parser removes unwanted/dangerous HTML tags and after nowiki/noinclude/
+includeonly/onlyinclude and other processings. Ideal for syntax-extensions after
+template/parser function execution which respect nowiki and HTML-comments.
&$parser: Parser object
&$text: string containing partially parsed text
&$stripState: Parser's internal StripState object
@@ -1176,7 +1324,8 @@ but after nowiki/noinclude/includeonly/onlyinclude and other processings.
&$text: string containing partially parsed text
&$stripState: Parser's internal StripState object
-'InvalidateEmailComplete': Called after a user's email has been invalidated successfully
+'InvalidateEmailComplete': Called after a user's email has been invalidated
+successfully.
$user: user (object) whose email is being invalidated
'IRCLineURL': When constructing the URL to use in an IRC notification.
@@ -1191,8 +1340,8 @@ $article: article (object) being checked
$ip: IP being check
$result: Change this value to override the result of wfIsTrustedProxy()
-'isValidEmailAddr': Override the result of User::isValidEmailAddr(), for ins-
-tance to return false if the domain name doesn't match your organization
+'isValidEmailAddr': Override the result of User::isValidEmailAddr(), for
+instance to return false if the domain name doesn't match your organization.
$addr: The e-mail address entered by the user
&$result: Set this and return false to override the internal checks
@@ -1214,55 +1363,55 @@ CanonicalNamespaces for that.
$wgExtensionMessagesFiles instead.
Use this to define synonyms of magic words depending of the language
$magicExtensions: associative array of magic words synonyms
-$lang: laguage code (string)
+$lang: language code (string)
'LanguageGetSpecialPageAliases': DEPRECATED, use $specialPageAliases in a file
listed in $wgExtensionMessagesFiles instead.
Use to define aliases of special pages names depending of the language
$specialPageAliases: associative array of magic words synonyms
-$lang: laguage code (string)
+$lang: language code (string)
'LanguageGetTranslatedLanguageNames': Provide translated language names.
&$names: array of language code => language name
$code language of the preferred translations
'LinkBegin': Used when generating internal and interwiki links in
-Linker::link(), before processing starts. Return false to skip default proces-
-sing and return $ret. See documentation for Linker::link() for details on the
-expected meanings of parameters.
+Linker::link(), before processing starts. Return false to skip default
+processing and return $ret. See documentation for Linker::link() for details on
+the expected meanings of parameters.
$skin: the Skin object
$target: the Title that the link is pointing to
-&$html: the contents that the <a> tag should have (raw HTML); null means "de-
- fault"
-&$customAttribs: the HTML attributes that the <a> tag should have, in associa-
- tive array form, with keys and values unescaped. Should be merged with de-
- fault values, with a value of false meaning to suppress the attribute.
+&$html: the contents that the <a> tag should have (raw HTML); null means
+ "default".
+&$customAttribs: the HTML attributes that the <a> tag should have, in
+associative array form, with keys and values unescaped. Should be merged with
+default values, with a value of false meaning to suppress the attribute.
&$query: the query string to add to the generated URL (the bit after the "?"),
- in associative array form, with keys and values unescaped.
+ in associative array form, with keys and values unescaped.
&$options: array of options. Can include 'known', 'broken', 'noclasses'.
&$ret: the value to return if your hook returns false.
'LinkEnd': Used when generating internal and interwiki links in Linker::link(),
just before the function returns a value. If you return true, an <a> element
-with HTML attributes $attribs and contents $html will be returned. If you re-
-turn false, $ret will be returned.
+with HTML attributes $attribs and contents $html will be returned. If you
+return false, $ret will be returned.
$skin: the Skin object
$target: the Title object that the link is pointing to
$options: the options. Will always include either 'known' or 'broken', and may
- include 'noclasses'.
+ include 'noclasses'.
&$html: the final (raw HTML) contents of the <a> tag, after processing.
-&$attribs: the final HTML attributes of the <a> tag, after processing, in asso-
- ciative array form.
+&$attribs: the final HTML attributes of the <a> tag, after processing, in
+ associative array form.
&$ret: the value to return if your hook returns false.
'LinkerMakeExternalImage': At the end of Linker::makeExternalImage() just
-before the return
+before the return.
&$url: the image url
&$alt: the image's alt text
&$img: the new image HTML (if returning false)
'LinkerMakeExternalLink': At the end of Linker::makeExternalLink() just
-before the return
+before the return.
&$url: the link url
&$text: the link text
&$link: the new link HTML (if returning false)
@@ -1270,23 +1419,29 @@ before the return
$linkType: The external link type
'LinksUpdate': At the beginning of LinksUpdate::doUpdate() just before the
-actual update
+actual update.
&$linksUpdate: the LinksUpdate object
-'LinksUpdateComplete': At the end of LinksUpdate::doUpdate() when updating has
-completed
+'LinksUpdateAfterInsert': At the end of LinksUpdate::incrTableUpdate() after
+each link table insert. For example, pagelinks, imagelinks, externallinks.
+$linksUpdate: LinksUpdate object
+$table: the table to insert links to
+$insertions: an array of links to insert
+
+'LinksUpdateComplete': At the end of LinksUpdate::doUpdate() when updating,
+including delete and insert, has completed for all link tables
&$linksUpdate: the LinksUpdate object
-'LinksUpdateConstructed': At the end of LinksUpdate() is contruction.
+'LinksUpdateConstructed': At the end of LinksUpdate() is construction.
&$linksUpdate: the LinksUpdate object
'ListDefinedTags': When trying to find all defined tags.
&$tags: The list of tags.
-'LoadExtensionSchemaUpdates': called during database installation and updates
+'LoadExtensionSchemaUpdates': Called during database installation and updates.
&updater: A DatabaseUpdater subclass
-'LocalFile::getHistory': called before file history query performed
+'LocalFile::getHistory': Called before file history query performed.
$file: the File object
$tables: tables
$fields: select fields
@@ -1294,91 +1449,89 @@ $conds: conditions
$opts: query options
$join_conds: JOIN conditions
-'LocalFilePurgeThumbnails': called before thumbnails for a local file a purged
+'LocalFilePurgeThumbnails': Called before thumbnails for a local file a purged.
$file: the File object
$archiveName: name of an old file version or false if it's the current one
-'LocalisationCacheRecache': Called when loading the localisation data into cache
+'LocalisationCacheRecache': Called when loading the localisation data into
+cache.
$cache: The LocalisationCache object
$code: language code
&$alldata: The localisation data from core and extensions
-'LogEventsListShowLogExtract': called before the string is added to OutputPage. Returning false will prevent the string from being added to the OutputPage
+'LogEventsListShowLogExtract': Called before the string is added to OutputPage.
+Returning false will prevent the string from being added to the OutputPage.
&$s: html string to show for the log extract
$types: String or Array Log types to show
$page: String or Title The page title to show log entries for
$user: String The user who made the log entries
$param: Associative Array with the following additional options:
- - lim Integer Limit of items to show, default is 50
- - conds Array Extra conditions for the query (e.g. "log_action != 'revision'")
- - showIfEmpty boolean Set to false if you don't want any output in case the loglist is empty if set to true (default), "No matching items in log" is displayed if loglist is empty
- - msgKey Array If you want a nice box with a message, set this to the key of the message. First element is the message key, additional optional elements are parameters for the key that are processed with wfMessage()->params()->parseAsBlock()
- - offset Set to overwrite offset parameter in $wgRequest set to '' to unset offset
- - wrap String Wrap the message in html (usually something like "&lt;div ...>$1&lt;/div>").
- - flags Integer display flags (NO_ACTION_LINK,NO_EXTRA_USER_LINKS)
-
-'LoggableUserIPData': called when IP data for a user action can be logged by extensions like CheckUser.
-This is intended for when users do things that do not already create edits or log entries.
-$context: The context the of the action, which includes the user and request
-$data: Associative array of data for handlers to record. It must include values for:
- - 'namespace' Integer namespace for target title (NS_SPECIAL is allowed)
- - 'title' Database key string for target title (empty string if not applicable)
- - 'pageid' Integer page ID for target title (zero if not applicable)
- - 'action' Wikitext string in the same format as an edit summary
- - 'comment' Wikitext string in the same format as an edit summary
- - 'timestamp' Timestamp when the action occured
-
-'LoginAuthenticateAudit': a login attempt for a valid user account either
+ - lim Integer Limit of items to show, default is 50
+ - conds Array Extra conditions for the query (e.g. "log_action != 'revision'")
+ - showIfEmpty boolean Set to false if you don't want any output in case the
+ loglist is empty if set to true (default), "No matching items in log" is
+ displayed if loglist is empty
+ - msgKey Array If you want a nice box with a message, set this to the key of
+ the message. First element is the message key, additional optional elements
+ are parameters for the key that are processed with
+ wfMessage()->params()->parseAsBlock()
+ - offset Set to overwrite offset parameter in $wgRequest set to '' to unset
+ offset
+ - wrap String Wrap the message in html (usually something like
+ "&lt;div ...>$1&lt;/div>").
+ - flags Integer display flags (NO_ACTION_LINK,NO_EXTRA_USER_LINKS)
+
+'LoginAuthenticateAudit': A login attempt for a valid user account either
succeeded or failed. No return data is accepted; this hook is for auditing only.
$user: the User object being authenticated against
$password: the password being submitted and found wanting
$retval: a LoginForm class constant with authenticateUserData() return
- value (SUCCESS, WRONG_PASS, etc)
+ value (SUCCESS, WRONG_PASS, etc.).
-'LogLine': Processes a single log entry on Special:Log
+'LogLine': Processes a single log entry on Special:Log.
$log_type: string for the type of log entry (e.g. 'move'). Corresponds to
- logging.log_type database field.
+ logging.log_type database field.
$log_action: string for the type of log action (e.g. 'delete', 'block',
- 'create2'). Corresponds to logging.log_action database field.
+ 'create2'). Corresponds to logging.log_action database field.
$title: Title object that corresponds to logging.log_namespace and
- logging.log_title database fields.
+ logging.log_title database fields.
$paramArray: Array of parameters that corresponds to logging.log_params field.
- Note that only $paramArray[0] appears to contain anything.
+ Note that only $paramArray[0] appears to contain anything.
&$comment: string that corresponds to logging.log_comment database field, and
- which is displayed in the UI.
+ which is displayed in the UI.
&$revert: string that is displayed in the UI, similar to $comment.
$time: timestamp of the log entry (added in 1.12)
-'MaintenanceRefreshLinksInit': before executing the refreshLinks.php maintenance script
+'MaintenanceRefreshLinksInit': before executing the refreshLinks.php maintenance
+script.
$refreshLinks: RefreshLinks object
-'MagicWordwgVariableIDs': When definig new magic words IDs.
+'MagicWordwgVariableIDs': When defining new magic words IDs.
$variableIDs: array of strings
-'MakeGlobalVariablesScript': called right before Skin::makeVariablesScript
-is executed. Ideally, this hook should only be used to add variables that
-depend on the current page/request; static configuration should be added
-through ResourceLoaderGetConfigVars instead.
-&$vars: variable (or multiple variables) to be added into the output
- of Skin::makeVariablesScript
-$out: The OutputPage which called the hook,
- can be used to get the real title
+'MakeGlobalVariablesScript': Called right before Skin::makeVariablesScript is
+executed. Ideally, this hook should only be used to add variables that depend on
+the current page/request; static configuration should be added through
+ResourceLoaderGetConfigVars instead.
+&$vars: variable (or multiple variables) to be added into the output of
+ Skin::makeVariablesScript
+$out: The OutputPage which called the hook, can be used to get the real title.
-'MarkPatrolled': before an edit is marked patrolled
+'MarkPatrolled': Before an edit is marked patrolled.
$rcid: ID of the revision to be marked patrolled
$user: the user (object) marking the revision as patrolled
-$wcOnlySysopsCanPatrol: config setting indicating whether the user
- needs to be a sysop in order to mark an edit patrolled
+$wcOnlySysopsCanPatrol: config setting indicating whether the user needs to be a
+ sysop in order to mark an edit patrolled.
-'MarkPatrolledComplete': after an edit is marked patrolled
+'MarkPatrolledComplete': After an edit is marked patrolled.
$rcid: ID of the revision marked as patrolled
$user: user (object) who marked the edit patrolled
-$wcOnlySysopsCanPatrol: config setting indicating whether the user
- must be a sysop to patrol the edit
+$wcOnlySysopsCanPatrol: config setting indicating whether the user must be a
+ sysop to patrol the edit.
-'MediaWikiPerformAction': Override MediaWiki::performAction().
-Use this to do something completely different, after the basic
-globals have been set up, but before ordinary actions take place.
+'MediaWikiPerformAction': Override MediaWiki::performAction(). Use this to do
+something completely different, after the basic globals have been set up, but
+before ordinary actions take place.
$output: $wgOut
$article: $wgArticle
$title: $wgTitle
@@ -1386,12 +1539,12 @@ $user: $wgUser
$request: $wgRequest
$mediaWiki: The $mediawiki object
-'MessagesPreLoad': When loading a message from the database
+'MessagesPreLoad': When loading a message from the database.
$title: title of the message (string)
$message: value (string), change it to the message you want to define
-'MessageCacheReplace': When a message page is changed.
-Useful for updating caches.
+'MessageCacheReplace': When a message page is changed. Useful for updating
+caches.
$title: name of the page changed.
$text: new contents of the page.
@@ -1402,12 +1555,11 @@ $db: The database object to be queried.
&$opts: Options for the query.
&$join_conds: Join conditions for the query.
-'MonoBookTemplateToolboxEnd': Called by Monobook skin after toolbox links have
-been rendered (useful for adding more)
-Note: this is only run for the Monobook skin. This hook is deprecated and
-may be removed in the future. To add items to the toolbox you should use
-the SkinTemplateToolboxEnd hook instead, which works for all
-"SkinTemplate"-type skins.
+'MonoBookTemplateToolboxEnd': DEPRECATED. Called by Monobook skin after toolbox
+links have been rendered (useful for adding more). Note: this is only run for
+the Monobook skin. To add items to the toolbox you should use the
+SkinTemplateToolboxEnd hook instead, which works for all "SkinTemplate"-type
+skins.
$tools: array of tools
'BaseTemplateToolbox': Called by BaseTemplate when building the $toolbox array
@@ -1416,61 +1568,65 @@ still letting the skin make final decisions on skin-specific markup conventions
using this hook.
&$sk: The BaseTemplate base skin template
&$toolbox: An array of toolbox items, see BaseTemplate::getToolbox and
- BaseTemplate::makeListItem for details on the format of individual
- items inside of this array
+ BaseTemplate::makeListItem for details on the format of individual items
+ inside of this array.
-'NamespaceIsMovable': Called when determining if it is possible to pages in a namespace.
+'NamespaceIsMovable': Called when determining if it is possible to pages in a
+namespace.
$index: Integer; the index of the namespace being checked.
-$result: Boolean; whether MediaWiki currently thinks that pages in this namespace are movable.
-Hooks may change this value to override the return value of MWNamespace::isMovable()
+$result: Boolean; whether MediaWiki currently thinks that pages in this
+ namespace are movable. Hooks may change this value to override the return
+ value of MWNamespace::isMovable().
-'NewRevisionFromEditComplete': called when a revision was inserted
-due to an edit
-$article: the WikiPage edited
+'NewRevisionFromEditComplete': Called when a revision was inserted due to an
+edit.
+$wikiPage: the WikiPage edited
$rev: the new revision
$baseID: the revision ID this was based off, if any
$user: the editing user
'NormalizeMessageKey': Called before the software gets the text of a message
(stuff in the MediaWiki: namespace), useful for changing WHAT message gets
-displayed
+displayed.
&$key: the message being looked up. Change this to something else to change
- what message gets displayed (string)
+ what message gets displayed (string)
&$useDB: whether or not to look up the message in the database (bool)
&$langCode: the language code to get the message for (string) - or -
- whether to use the content language (true) or site language (false) (bool)
+ whether to use the content language (true) or site language (false) (bool)
&$transform: whether or not to expand variables and templates
- in the message (bool)
+ in the message (bool)
-'OldChangesListRecentChangesLine': Customize entire Recent Changes line.
+'OldChangesListRecentChangesLine': Customize entire recent changes line, or
+return false to omit the line from RecentChanges and Watchlist special pages.
&$changeslist: The OldChangesList instance.
&$s: HTML of the form "<li>...</li>" containing one RC entry.
&$rc: The RecentChange object.
+&$classes: array of css classes for the <li> element
-'OpenSearchUrls': Called when constructing the OpenSearch description XML.
-Hooks can alter or append to the array of URLs for search & suggestion formats.
+'OpenSearchUrls': Called when constructing the OpenSearch description XML. Hooks
+can alter or append to the array of URLs for search & suggestion formats.
&$urls: array of associative arrays with Url element attributes
'OtherBlockLogLink': Get links to the block log from extensions which blocks
- users and/or IP addresses too
+users and/or IP addresses too.
$otherBlockLink: An array with links to other block logs
$ip: The requested IP address or username
-'OutputPageBeforeHTML': a page has been processed by the parser and
-the resulting HTML is about to be displayed.
+'OutputPageBeforeHTML': A page has been processed by the parser and the
+resulting HTML is about to be displayed.
$parserOutput: the parserOutput (object) that corresponds to the page
$text: the text that will be displayed, in HTML (string)
-'OutputPageBodyAttributes': called when OutputPage::headElement is creating the body
-tag to allow for extensions to add attributes to the body of the page they might
-need. Or to allow building extensions to add body classes that aren't of high
-enough demand to be included in core.
+'OutputPageBodyAttributes': Called when OutputPage::headElement is creating the
+body tag to allow for extensions to add attributes to the body of the page they
+might need. Or to allow building extensions to add body classes that aren't of
+high enough demand to be included in core.
$out: The OutputPage which called the hook, can be used to get the real title
$sk: The Skin that called OutputPage::headElement
&$bodyAttrs: An array of attributes for the body tag passed to Html::openElement
'OutputPageCheckLastModified': when checking if the page has been modified
-since the last visit
+since the last visit.
&$modifiedTimes: array of timestamps.
The following keys are set: page, user, epoch
@@ -1478,73 +1634,114 @@ since the last visit
$out: OutputPage instance (object)
$parserOutput: parserOutput instance being added in $out
-'OutputPageMakeCategoryLinks': links are about to be generated for the page's
+'OutputPageMakeCategoryLinks': Links are about to be generated for the page's
categories. Implementations should return false if they generate the category
links, so the default link generation is skipped.
$out: OutputPage instance (object)
$categories: associative array, keys are category names, values are category
- types ("normal" or "hidden")
+ types ("normal" or "hidden")
$links: array, intended to hold the result. Must be an associative array with
- category types as keys and arrays of HTML links as values.
+ category types as keys and arrays of HTML links as values.
-'PageContentLanguage': allows changing the language in which the content of
-a page is written. Defaults to the wiki content language ($wgContLang).
+'PageContentInsertComplete': After a new article is created.
+$wikiPage: WikiPage created
+$user: User creating the article
+$content: New content as a Content object
+$summary: Edit summary/comment
+$isMinor: Whether or not the edit was marked as minor
+$isWatch: (No longer used)
+$section: (No longer used)
+$flags: Flags passed to WikiPage::doEditContent()
+$revision: New Revision of the article
+
+'PageContentLanguage': Allows changing the language in which the content of a
+page is written. Defaults to the wiki content language ($wgContLang).
$title: Title object
&$pageLang: the page content language (either an object or a language code)
$wgLang: the user language
+'PageContentSave': Before an article is saved.
+$wikiPage: the WikiPage (object) being saved
+$user: the user (object) saving the article
+$content: the new article content, as a Content object
+$summary: the article summary (comment)
+$isminor: minor flag
+$iswatch: watch flag
+$section: section #
+
+'PageContentSaveComplete': After an article has been updated.
+$wikiPage: WikiPage modified
+$user: User performing the modification
+$content: New content, as a Content object
+$summary: Edit summary/comment
+$isMinor: Whether or not the edit was marked as minor
+$isWatch: (No longer used)
+$section: (No longer used)
+$flags: Flags passed to WikiPage::doEditContent()
+$revision: New Revision of the article
+$status: Status object about to be returned by doEditContent()
+$baseRevId: the rev ID (or false) this edit was based on
+
'PageHistoryBeforeList': When a history page list is about to be constructed.
$article: the article that the history is loading for
+$context: RequestContext object
-'PageHistoryLineEnding' : right before the end <li> is added to a history line
+'PageHistoryLineEnding' : Right before the end <li> is added to a history line.
$row: the revision row for this line
$s: the string representing this parsed line
$classes: array containing the <li> element classes
-'PageHistoryPager::getQueryInfo': when a history pager query parameter set
-is constructed
+'PageHistoryPager::getQueryInfo': when a history pager query parameter set is
+constructed.
$pager: the pager
$queryInfo: the query parameters
-'PageRenderingHash': alter the parser cache option hash key
-A parser extension which depends on user options should install
-this hook and append its values to the key.
+'PageRenderingHash': Alter the parser cache option hash key. A parser extension
+which depends on user options should install this hook and append its values to
+the key.
$hash: reference to a hash key string which can be modified
'ParserAfterParse': Called from Parser::parse() just after the call to
-Parser::internalParse() returns
+Parser::internalParse() returns.
$parser: parser object
$text: text being parsed
$stripState: stripState used (object)
-'ParserAfterStrip': Same as ParserBeforeStrip
+'ParserAfterStrip': Called at end of parsing time.
+TODO: No more strip, deprecated ?
+$parser: parser object
+$text: text being parsed
+$stripState: stripState used (object)
'ParserAfterTidy': Called after Parser::tidy() in Parser::parse()
$parser: Parser object being used
-$text: text that'll be returned
+$text: text that will be returned
-'ParserBeforeInternalParse': called at the beginning of Parser::internalParse()
+'ParserBeforeInternalParse': Called at the beginning of Parser::internalParse().
$parser: Parser object
$text: text to parse
$stripState: StripState instance being used
-'ParserBeforeStrip': Called at start of parsing time
-(no more strip, deprecated ?)
+'ParserBeforeStrip': Called at start of parsing time.
+TODO: No more strip, deprecated ?
$parser: parser object
$text: text being parsed
$stripState: stripState used (object)
-'ParserBeforeTidy': called before tidy and custom tags replacements
+'ParserBeforeTidy': Called before tidy and custom tags replacements.
$parser: Parser object being used
$text: actual text
-'ParserClearState': called at the end of Parser::clearState()
+'ParserClearState': Called at the end of Parser::clearState().
$parser: Parser object being cleared
-'ParserFirstCallInit': called when the parser initialises for the first time
+'ParserCloned': Called when the parser is cloned.
+$parser: Newly-cloned Parser object
+
+'ParserFirstCallInit': Called when the parser initialises for the first time.
&$parser: Parser object being cleared
-'ParserGetVariableValueSwitch': called when the parser need the value of a
+'ParserGetVariableValueSwitch': Called when the parser need the value of a
custom magic word
$parser: Parser object
$varCache: array to store the value in case of multiples calls of the
@@ -1553,18 +1750,18 @@ $index: index (string) of the magic
$ret: value of the magic word (the hook should set it)
$frame: PPFrame object to use for expanding any template variables
-'ParserGetVariableValueTs': use this to change the value of the time for the
-{{LOCAL...}} magic word
+'ParserGetVariableValueTs': Use this to change the value of the time for the
+{{LOCAL...}} magic word.
$parser: Parser object
$time: actual time (timestamp)
-'ParserGetVariableValueVarCache': use this to change the value of the
-variable cache or return false to not use it
+'ParserGetVariableValueVarCache': use this to change the value of the variable
+cache or return false to not use it.
$parser: Parser object
-$varCache: varaiable cache (array)
+$varCache: variable cache (array)
-'ParserLimitReport': called at the end of Parser:parse() when the parser will
-include comments about size of the text parsed
+'ParserLimitReport': Called at the end of Parser:parse() when the parser will
+include comments about size of the text parsed.
$parser: Parser object
$limitReport: text that will be included (without comment tags)
@@ -1576,27 +1773,26 @@ $file: file object that will be used to create the image
$parser: Parser object that called the hook
'ParserSectionCreate': Called each time the parser creates a document section
-from wikitext. Use this to apply per-section modifications to HTML (like
+from wikitext. Use this to apply per-section modifications to HTML (like
wrapping the section in a DIV). Caveat: DIVs are valid wikitext, and a DIV
-can begin in one section and end in another. Make sure your code can handle
-that case gracefully. See the EditSectionClearerLink extension for an
-example.
+can begin in one section and end in another. Make sure your code can handle
+that case gracefully. See the EditSectionClearerLink extension for an example.
$parser: the calling Parser instance
$section: the section number, zero-based, but section 0 is usually empty
&$sectionContent: ref to the content of the section. modify this.
$showEditLinks: boolean describing whether this section has an edit link
-'ParserTestParser': called when creating a new instance of Parser in
-maintenance/parserTests.inc
+'ParserTestParser': Called when creating a new instance of Parser in
+maintenance/parserTests.inc.
$parser: Parser object created
'ParserTestGlobals': Allows to define globals for parser tests.
&$globals: Array with all the globals which should be set for parser tests.
- The arrays keys serve as the globals names, its values are the globals values.
+ The arrays keys serve as the globals names, its values are the globals values.
-'ParserTestTables': alter the list of tables to duplicate when parser tests
-are run. Use when page save hooks require the presence of custom tables
-to ensure that tests continue to run properly.
+'ParserTestTables': Alter the list of tables to duplicate when parser tests are
+run. Use when page save hooks require the presence of custom tables to ensure
+that tests continue to run properly.
&$tables: array of table names
'PersonalUrls': Alter the user-specific navigation links (e.g. "my page,
@@ -1604,21 +1800,22 @@ my talk page, my contributions" etc).
&$personal_urls: Array of link specifiers (see SkinTemplate.php)
&$title: Title object representing the current page
-'PingLimiter': Allows extensions to override the results of User::pingLimiter()
+'PingLimiter': Allows extensions to override the results of User::pingLimiter().
&$user : User performing the action
$action : Action being performed
&$result : Whether or not the action should be prevented
Change $result and return false to give a definitive answer, otherwise
the built-in rate limiting checks are used, if enabled.
-'PlaceNewSection': Override placement of new sections.
+'PlaceNewSection': Override placement of new sections. Return false and put the
+merged text into $text to override the default behavior.
$wikipage : WikiPage object
$oldtext : the text of the article before editing
$subject : subject of the new section
&$text : text of the new section
-Return false and put the merged text into $text to override the default behavior.
-'PreferencesGetLegend': Override the text used for the <legend> of a preferences section
+'PreferencesGetLegend': Override the text used for the <legend> of a
+preferences section.
$form: the PreferencesForm object. This is a ContextSource as well
$key: the section name
&$legend: the legend text. Defaults to wfMessage( "prefs-$key" )->text() but may be overridden
@@ -1630,71 +1827,82 @@ $search : search term (not guaranteed to be conveniently normalized)
$limit : maximum number of results to return
&$results : out param: array of page names (strings)
-'PrefsEmailAudit': called when user changes his email address
+'PrefsEmailAudit': Called when user changes their email address.
$user: User (object) changing his email address
$oldaddr: old email address (string)
$newaddr: new email address (string)
-'PrefsPasswordAudit': called when user changes his password
-$user: User (object) changing his passoword
+'PrefsPasswordAudit': Called when user changes his password.
+$user: User (object) changing his password
$newPass: new password
$error: error (string) 'badretype', 'wrongpassword', 'error' or 'success'
-'ProtectionForm::buildForm': called after all protection type fieldsets are made in the form
+'ProtectionForm::buildForm': Called after all protection type fieldsets are made
+in the form.
$article: the title being (un)protected
$output: a string of the form HTML so far
-'ProtectionForm::save': called when a protection form is submitted
+'ProtectionForm::save': Called when a protection form is submitted.
$article: the title being (un)protected
-$errorMsg: an html message string of an error or an array of message name and its parameters
+$errorMsg: an html message string of an error or an array of message name and
+ its parameters
-'ProtectionForm::showLogExtract': called after the protection log extract is shown
+'ProtectionForm::showLogExtract': Called after the protection log extract is
+shown.
$article: the page the form is shown for
$out: OutputPage object
-'RawPageViewBeforeOutput': Right before the text is blown out in action=raw
+'RawPageViewBeforeOutput': Right before the text is blown out in action=raw.
&$obj: RawPage object
&$text: The text that's going to be the output
-'RecentChange_save': called at the end of RecentChange::save()
+'RecentChange_save': Called at the end of RecentChange::save().
$recentChange: RecentChange object
-'RedirectSpecialArticleRedirectParams': lets you alter the set of
-parameter names such as "oldid" that are preserved when using
-redirecting special pages such as Special:MyPage and Special:MyTalk.
+'RedirectSpecialArticleRedirectParams': Lets you alter the set of parameter
+names such as "oldid" that are preserved when using redirecting special pages
+such as Special:MyPage and Special:MyTalk.
&$redirectParams: An array of parameters preserved by redirecting special pages.
-'RequestContextCreateSkin': Called when RequestContext::getSkin creates a skin instance.
-Can be used by an extension override what skin is used in certain contexts.
+'RequestContextCreateSkin': Called when RequestContext::getSkin creates a skin
+instance. Can be used by an extension override what skin is used in certain
+contexts.
IContextSource $context: The RequestContext the skin is being created for.
-&$skin: A variable reference you may set a Skin instance or string key on to override the skin that will be used for the context.
+&$skin: A variable reference you may set a Skin instance or string key on to
+ override the skin that will be used for the context.
-'ResourceLoaderGetConfigVars': called at the end of
+'ResourceLoaderGetConfigVars': Called at the end of
ResourceLoaderStartUpModule::getConfig(). Use this to export static
-configuration variables to JavaScript. Things that depend on the current
-page/request state must be added through MakeGlobalVariablesScript instead.
+configuration variables to JavaScript. Things that depend on the current page
+or request state must be added through MakeGlobalVariablesScript instead.
&$vars: array( variable name => value )
-'ResourceLoaderGetStartupModules': Run once the startup module is being generated. This allows you
-to add modules to the startup module. This hook should be used sparingly since any module added here
-will be loaded on all pages. This hook is useful if you want to make code available to module loader
+'ResourceLoaderGetStartupModules': Run once the startup module is being
+generated. This allows you to add modules to the startup module. This hook
+should be used sparingly since any module added here will be loaded on all
+pages. This hook is useful if you want to make code available to module loader
scripts.
-'ResourceLoaderRegisterModules': Right before modules information is required, such as when responding to a resource
+'ResourceLoaderRegisterModules': Right before modules information is required,
+such as when responding to a resource
loader request or generating HTML output.
&$resourceLoader: ResourceLoader object
-'ResourceLoaderTestModules': let you add new JavaScript testing modules. This is called after the addition of 'qunit' and MediaWiki testing resources.
-&testModules: array of JavaScript testing modules. The 'qunit' framework, included in core, is fed using tests/qunit/QUnitTestResources.php.
+'ResourceLoaderTestModules': Let you add new JavaScript testing modules. This is
+called after the addition of 'qunit' and MediaWiki testing resources.
+&testModules: array of JavaScript testing modules. The 'qunit' framework,
+ included in core, is fed using tests/qunit/QUnitTestResources.php.
&ResourceLoader object
+
To add a new qunit module named 'myext.tests':
testModules['qunit']['myext.tests'] = array(
'script' => 'extension/myext/tests.js',
'dependencies' => <any module dependency you might have>
);
-For qunit framework, the mediawiki.tests.qunit.testrunner dependency will be added to any module.
+For QUnit framework, the mediawiki.tests.qunit.testrunner dependency will be
+added to any module.
-'RevisionInsertComplete': called after a revision is inserted into the DB
+'RevisionInsertComplete': Called after a revision is inserted into the database.
&$revision: the Revision
$data: the data stored in old_text. The meaning depends on $flags: if external
is set, it's the URL of the revision text in external storage; otherwise,
@@ -1703,21 +1911,30 @@ $data: the data stored in old_text. The meaning depends on $flags: if external
$flags: a comma-delimited list of strings representing the options used. May
include: utf8 (this will always be set for new revisions); gzip; external.
-'SearchUpdate': Prior to search update completion
+'SearchUpdate': Prior to search update completion.
$id : Page id
$namespace : Page namespace
$title : Page title
$text : Current text being indexed
-'SearchGetNearMatchBefore': Perform exact-title-matches in "go" searches before the normal operations
+'SearchGetNearMatchBefore': Perform exact-title-matches in "go" searches before
+the normal operations.
$allSearchTerms : Array of the search terms in all content languages
&$titleResult : Outparam; the value to return. A Title object or null.
-'SearchGetNearMatch': An extra chance for exact-title-matches in "go" searches if nothing was found
+'SearchAfterNoDirectMatch': If there was no match for the exact result. This
+runs before lettercase variants are attempted, whereas 'SearchGetNearMatch'
+runs after.
+$term : Search term string
+&$title : Outparam; set to $title object and return false for a match
+
+'SearchGetNearMatch': An extra chance for exact-title-matches in "go" searches
+if nothing was found.
$term : Search term string
&$title : Outparam; set to $title object and return false for a match
-'SearchGetNearMatchComplete': A chance to modify exact-title-matches in "go" searches
+'SearchGetNearMatchComplete': A chance to modify exact-title-matches in "go"
+searches.
$term : Search term string
&$title : Current Title object that is being returned (null if none found).
@@ -1735,12 +1952,15 @@ $title : Current Title object being displayed in search results.
'SearchableNamespaces': An option to modify which namespaces are searchable.
&$arr : Array of namespaces ($nsId => $name) which will be used.
+'SeleniumSettings': TODO
+
'SetupAfterCache': Called in Setup.php, after cache objects are set
-'ShowMissingArticle': Called when generating the output for a non-existent page
+'ShowMissingArticle': Called when generating the output for a non-existent page.
$article: The article object corresponding to the page
-'ShowRawCssJs': Customise the output of raw CSS and JavaScript in page views
+'ShowRawCssJs': Customise the output of raw CSS and JavaScript in page views.
+DEPRECATED, use the ContentHandler facility to handle CSS and JavaScript!
$text: Text being shown
$title: Title of the custom script/stylesheet page
$output: Current OutputPage object
@@ -1752,47 +1972,64 @@ $result: The search result
$terms: The search terms entered
$page: The SpecialSearch object.
-'SiteNoticeBefore': Before the sitenotice/anonnotice is composed
+'ShowSearchHit': Customize display of search hit.
+$searchPage: The SpecialSearch instance.
+$result: The SearchResult to show
+$terms: Search terms, for highlighting
+&$link: HTML of link to the matching page. May be modified.
+&$redirect: HTML of redirect info. May be modified.
+&$section: HTML of matching section. May be modified.
+&$extract: HTML of content extract. May be modified.
+&$score: HTML of score. May be modified.
+&$size: HTML of page size. May be modified.
+&$date: HTML of of page modification date. May be modified.
+&$related: HTML of additional info for the matching page. May be modified.
+&$html: May be set to the full HTML that should be used to represent the search
+ hit. Must include the <li> ... </li> tags. Will only be used if the hook
+ function returned false.
+
+'SiteNoticeBefore': Before the sitenotice/anonnotice is composed. Return true to
+allow the normal method of notice selection/rendering to work, or change the
+value of $siteNotice and return false to alter it.
&$siteNotice: HTML returned as the sitenotice
$skin: Skin object
-Return true to allow the normal method of notice selection/rendering to work,
-or change the value of $siteNotice and return false to alter it.
-'SiteNoticeAfter': After the sitenotice/anonnotice is composed
-&$siteNotice: HTML sitenotice
+'SiteNoticeAfter': After the sitenotice/anonnotice is composed.
+&$siteNotice: HTML sitenotice. Alter the contents of $siteNotice to add to/alter
+ the sitenotice/anonnotice.
$skin: Skin object
-Alter the contents of $siteNotice to add to/alter the sitenotice/anonnotice.
-'SkinAfterBottomScripts': At the end of Skin::bottomScripts()
+'SkinAfterBottomScripts': At the end of Skin::bottomScripts().
$skin: Skin object
-&$text: bottomScripts Text
-Append to $text to add additional text/scripts after the stock bottom scripts.
+&$text: bottomScripts Text. Append to $text to add additional text/scripts after
+ the stock bottom scripts.
'SkinAfterContent': Allows extensions to add text after the page content and
-article metadata.
+article metadata. This hook should work in all skins. Set the &$data variable to
+the text you're going to add.
&$data: (string) Text to be printed out directly (without parsing)
$skin: Skin object
-This hook should work in all skins. Just set the &$data variable to the text
-you're going to add.
-'SkinBuildSidebar': At the end of Skin::buildSidebar()
+'SkinBuildSidebar': At the end of Skin::buildSidebar().
$skin: Skin object
&$bar: Sidebar contents
Modify $bar to add or modify sidebar portlets.
-'SkinCopyrightFooter': Allow for site and per-namespace customization of copyright notice.
+'SkinCopyrightFooter': Allow for site and per-namespace customization of
+copyright notice.
$title: displayed page title
$type: 'normal' or 'history' for old/diff views
-&$msg: overridable message; usually 'copyright' or 'history_copyright'. This message must be in HTML format, not wikitext!
+&$msg: overridable message; usually 'copyright' or 'history_copyright'. This
+ message must be in HTML format, not wikitext!
&$link: overridable HTML link to be passed into the message as $1
&$forContent: overridable flag if copyright footer is shown in content language.
-'SkinGetPoweredBy'
-&$text: additional 'powered by' icons in HTML.
-Note: Modern skin does not use the MediaWiki icon but plain text instead
+'SkinGetPoweredBy': TODO
+&$text: additional 'powered by' icons in HTML. Note: Modern skin does not use
+the MediaWiki icon but plain text instead.
$skin: Skin object
-'SkinSubPageSubtitle': At the beginning of Skin::subPageSubtitle()
+'SkinSubPageSubtitle': At the beginning of Skin::subPageSubtitle().
&$subpages: Subpage links HTML
$skin: Skin object
$out: OutputPage object
@@ -1801,25 +2038,30 @@ subPageSubtitle() generates.
If true is returned, $subpages will be ignored and the rest of
subPageSubtitle() will run.
-'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink': after creating the
-"permanent link" tab
+'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink': After creating the "permanent
+link" tab.
$sktemplate: SkinTemplate object
$nav_urls: array of tabs
-Alter the structured navigation links in SkinTemplates, there are three of these hooks called in different spots.
-'SkinTemplateNavigation': Called on content pages after the tabs have been added but before before variants have been added
-'SkinTemplateNavigation::SpecialPage': Called on special pages after the special tab is added but before variants have been added
-'SkinTemplateNavigation::Universal': Called on both content and special pages after variants have been added
+To alter the structured navigation links in SkinTemplates, there are three
+hooks called in different spots:
+
+'SkinTemplateNavigation': Called on content pages after the tabs have been
+added, but before variants have been added.
+'SkinTemplateNavigation::SpecialPage': Called on special pages after the special
+tab is added but before variants have been added.
+'SkinTemplateNavigation::Universal': Called on both content and special pages
+after variants have been added.
&$sktemplate: SkinTemplate object
-&$links: Structured navigation links
-This is used to alter the navigation for skins which use buildNavigationUrls such as Vector.
+&$links: Structured navigation links. This is used to alter the navigation for
+ skins which use buildNavigationUrls such as Vector.
-'SkinTemplateOutputPageBeforeExec': Before SkinTemplate::outputPage()
-starts page output
+'SkinTemplateOutputPageBeforeExec': Before SkinTemplate::outputPage() starts
+page output.
&$sktemplate: SkinTemplate object
&$tpl: Template engine object
-'SkinTemplatePreventOtherActiveTabs': use this to prevent showing active tabs
+'SkinTemplatePreventOtherActiveTabs': Use this to prevent showing active tabs.
$sktemplate: SkinTemplate object
$res: set to true to prevent active tabs
@@ -1836,53 +2078,56 @@ $checkEdit: Whether or not the action=edit query should be added if appropriate.
&$text: Link text.
&$result: Complete assoc. array if you want to return true.
+'SkinTemplateTabs': TODO
+
'SkinTemplateToolboxEnd': Called by SkinTemplate skins after toolbox links have
-been rendered (useful for adding more)
+been rendered (useful for adding more).
$sk: The QuickTemplate based skin template running the hook.
$dummy: Called when SkinTemplateToolboxEnd is used from a BaseTemplate skin,
- extensions that add support for BaseTemplateToolbox should watch for this dummy
- parameter with "$dummy=false" in their code and return without echoing any html
- to avoid creating duplicate toolbox items.
+ extensions that add support for BaseTemplateToolbox should watch for this
+ dummy parameter with "$dummy=false" in their code and return without echoing
+ any HTML to avoid creating duplicate toolbox items.
-'SoftwareInfo': Called by Special:Version for returning information about
-the software
-$software: The array of software in format 'name' => 'version'.
- See SpecialVersion::softwareInformation()
+'SoftwareInfo': Called by Special:Version for returning information about the
+software.
+$software: The array of software in format 'name' => 'version'. See
+ SpecialVersion::softwareInformation().
'SpecialContributionsBeforeMainOutput': Before the form on Special:Contributions
$id: User identifier
-'SpecialListusersDefaultQuery': called right before the end of
-UsersPager::getDefaultQuery()
+'SpecialListusersDefaultQuery': Called right before the end of
+UsersPager::getDefaultQuery().
$pager: The UsersPager instance
$query: The query array to be returned
-'SpecialListusersFormatRow': called right before the end of
-UsersPager::formatRow()
+'SpecialListusersFormatRow': Called right before the end of
+UsersPager::formatRow().
$item: HTML to be returned. Will be wrapped in <li></li> after the hook finishes
$row: Database row object
-'SpecialListusersHeader': called before closing the <fieldset> in
-UsersPager::getPageHeader()
+'SpecialListusersHeader': Called before closing the <fieldset> in
+UsersPager::getPageHeader().
$pager: The UsersPager instance
$out: The header HTML
-'SpecialListusersHeaderForm': called before adding the submit button in
-UsersPager::getPageHeader()
+'SpecialListusersHeaderForm': Called before adding the submit button in
+UsersPager::getPageHeader().
$pager: The UsersPager instance
$out: The header HTML
-'SpecialListusersQueryInfo': called right before the end of
+'SpecialListusersQueryInfo': Called right before the end of.
UsersPager::getQueryInfo()
$pager: The UsersPager instance
$query: The query array to be returned
-'SpecialMovepageAfterMove': called after moving a page
+'SpecialMovepageAfterMove': Called after moving a page.
$movePage: MovePageForm object
$oldTitle: old title (object)
$newTitle: new title (object)
-'SpecialNewpagesConditions': called when building sql query for Special:NewPages
+'SpecialNewpagesConditions': Called when building sql query for
+Special:NewPages.
&$special: NewPagesPager object (subclass of ReverseChronologicalPager)
$opts: FormOptions object containing special page options
&$conds: array of WHERE conditionals for query
@@ -1890,50 +2135,55 @@ $opts: FormOptions object containing special page options
&$fields: array of columns to select
&$join_conds: join conditions for the tables
-'SpecialNewPagesFilters': called after building form options at NewPages
+'SpecialNewPagesFilters': Called after building form options at NewPages.
$special: the special page object
-&$filters: associative array of filter definitions. The keys are the HTML name/URL parameters.
-Each key maps to an associative array with a 'msg' (message key) and a 'default' value.
+&$filters: associative array of filter definitions. The keys are the HTML
+ name/URL parameters. Each key maps to an associative array with a 'msg'
+ (message key) and a 'default' value.
-'SpecialPage_initList': called when setting up SpecialPage::$mList, use this
-hook to remove a core special page
+'SpecialPage_initList': Called when setting up SpecialPage::$mList, use this
+hook to remove a core special page.
$list: list (array) of core special pages
-'SpecialPageAfterExecute': called after SpecialPage::execute
+'SpecialPageAfterExecute': Called after SpecialPage::execute.
$special: the SpecialPage object
$subPage: the subpage string or null if no subpage was specified
-'SpecialPageBeforeExecute': called before SpecialPage::execute
+'SpecialPageBeforeExecute': Called before SpecialPage::execute.
$special: the SpecialPage object
$subPage: the subpage string or null if no subpage was specified
-'SpecialPasswordResetOnSubmit': when executing a form submission on Special:PasswordReset
-$users: array of User objects
+'SpecialPasswordResetOnSubmit': When executing a form submission on
+Special:PasswordReset.
+$users: array of User objects.
$data: array of data submitted by the user
-&$error: string, error code (message name) used to describe to error (out paramater).
- The hook needs to return false when setting this, otherwise it will have no effect.
+&$error: string, error code (message key) used to describe to error (out
+ parameter). The hook needs to return false when setting this, otherwise it
+ will have no effect.
-'SpecialRandomGetRandomTitle': called during the execution of Special:Random,
-use this to change some selection criteria or substitute a different title
+'SpecialRandomGetRandomTitle': Called during the execution of Special:Random,
+use this to change some selection criteria or substitute a different title.
&$randstr: The random number from wfRandom()
&$isRedir: Boolean, whether to select a redirect or non-redirect
&$namespaces: An array of namespace indexes to get the title from
&$extra: An array of extra SQL statements
&$title: If the hook returns false, a Title object to use instead of the
-result from the normal query
+ result from the normal query
-'SpecialRecentChangesFilters': called after building form options at RecentChanges
+'SpecialRecentChangesFilters': Called after building form options at
+RecentChanges.
$special: the special page object
-&$filters: associative array of filter definitions. The keys are the HTML name/URL parameters.
-Each key maps to an associative array with a 'msg' (message key) and a 'default' value.
+&$filters: associative array of filter definitions. The keys are the HTML
+ name/URL parameters. Each key maps to an associative array with a 'msg'
+ (message key) and a 'default' value.
-'SpecialRecentChangesPanel': called when building form options in
-SpecialRecentChanges
+'SpecialRecentChangesPanel': Called when building form options in
+SpecialRecentChanges.
&$extraOpts: array of added items, to which can be added
$opts: FormOptions for this request
-'SpecialRecentChangesQuery': called when building sql query for
-SpecialRecentChanges and SpecialRecentChangesLinked
+'SpecialRecentChangesQuery': Called when building SQL query for
+SpecialRecentChanges and SpecialRecentChangesLinked.
&$conds: array of WHERE conditionals for query
&$tables: array of tables to be queried
&$join_conds: join conditions for the tables
@@ -1941,210 +2191,248 @@ $opts: FormOptions for this request
&$query_options: array of options for the database request
&$select: Array of columns to select
-'SpecialSearchCreateLink': called when making the message to create a page or
-go to the existing page
+'SpecialSearchCreateLink': Called when making the message to create a page or
+go to the existing page.
$t: title object searched for
&$params: an array of the default message name and page title (as parameter)
-'SpecialSearchGo': called when user clicked the "Go"
+'SpecialSearchGo': Called when user clicked the "Go".
&$title: title object generated from the text entered by the user
&$term: the search term entered by the user
-'SpecialSearchNogomatch': called when user clicked the "Go" button but the
-target doesn't exist
+'SpecialSearchNogomatch': Called when user clicked the "Go" button but the
+target doesn't exist.
&$title: title object generated from the text entered by the user
-'SpecialSearchPowerBox': the equivalent of SpecialSearchProfileForm for
-the advanced form, a.k.a. power search box
+'SpecialSearchPowerBox': The equivalent of SpecialSearchProfileForm for
+the advanced form, a.k.a. power search box.
&$showSections: an array to add values with more options to
$term: the search term (not a title object)
$opts: an array of hidden options (containing 'redirs' and 'profile')
-'SpecialSearchProfiles': allows modification of search profiles
+'SpecialSearchProfiles': Allows modification of search profiles.
&$profiles: profiles, which can be modified.
-'SpecialSearchProfileForm': allows modification of search profile forms
+'SpecialSearchProfileForm': Allows modification of search profile forms.
$search: special page object
&$form: String: form html
$profile: String: current search profile
$term: String: search term
$opts: Array: key => value of hidden options for inclusion in custom forms
-'SpecialSearchSetupEngine': allows passing custom data to search engine
-$search: special page object
+'SpecialSearchSetupEngine': Allows passing custom data to search engine.
+$search: SpecialSearch special page object
$profile: String: current search profile
$engine: the search engine
-'SpecialSearchResults': called before search result display when there
-are matches
+'SpecialSearchResultsPrepend': Called immediately before returning HTML
+on the search results page. Useful for including an external search
+provider. To disable the output of MediaWiki search output, return
+false.
+$specialSearch: SpecialSearch object ($this)
+$output: $wgOut
+$term: Search term specified by the user
+
+'SpecialSearchResultsAppend': Called after all search results HTML has
+been output. Note that in some cases, this hook will not be called (no
+results, too many results, SpecialSearchResultsPrepend returned false,
+etc).
+$specialSearch: SpecialSearch object ($this)
+$output: $wgOut
+$term: Search term specified by the user
+
+'SpecialSearchResults': Called before search result display when there are
+matches.
$term: string of search term
&$titleMatches: empty or SearchResultSet object
&$textMatches: empty or SearchResultSet object
-'SpecialSearchNoResults': called before search result display when there are
-no matches
+'SpecialSearchNoResults': Called before search result display when there are no
+matches.
$term: string of search term
-'SpecialStatsAddExtra': add extra statistic at the end of Special:Statistics
+'SpecialStatsAddExtra': Add extra statistic at the end of Special:Statistics.
&$extraStats: Array to save the new stats
- ( $extraStats['<name of statistic>'] => <value>; )
+ ( $extraStats['<name of statistic>'] => <value>; )
'SpecialUploadComplete': Called after successfully uploading a file from
-Special:Upload
+Special:Upload.
$form: The SpecialUpload object
-'SpecialVersionExtensionTypes': called when generating the extensions credits,
-use this to change the tables headers
+'SpecialVersionExtensionTypes': Called when generating the extensions credits,
+use this to change the tables headers.
$extTypes: associative array of extensions types
-'SpecialWatchlistFilters': called after building form options at Watchlist
+'SpecialVersionVersionUrl': Called when building the URL for Special:Version.
+$wgVersion: Current $wgVersion for you to use
+&$versionUrl: Raw url to link to (eg: release notes)
+
+'SpecialWatchlistFilters': Called after building form options at Watchlist.
$special: the special page object
-&$filters: associative array of filter definitions. The keys are the HTML name/URL parameters.
-Each key maps to an associative array with a 'msg' (message key) and a 'default' value.
+&$filters: associative array of filter definitions. The keys are the HTML
+ name/URL parameters. Each key maps to an associative array with a 'msg'
+ (message key) and a 'default' value.
-'SpecialWatchlistQuery': called when building sql query for SpecialWatchlist
+'SpecialWatchlistQuery': Called when building sql query for SpecialWatchlist.
&$conds: array of WHERE conditionals for query
&$tables: array of tables to be queried
&$join_conds: join conditions for the tables
&$fields: array of query fields
+$values: array of variables with watchlist options
-'TestCanonicalRedirect': called when about to force a redirect to a canonical URL for a title when we have no other parameters on the URL. Gives a chance for extensions that alter page view behavior radically to abort that redirect or handle it manually.
+'TestCanonicalRedirect': Called when about to force a redirect to a canonical
+URL for a title when we have no other parameters on the URL. Gives a chance for
+extensions that alter page view behavior radically to abort that redirect or
+handle it manually.
$request: WebRequest
$title: Title of the currently found title obj
$output: OutputPage object
-'TitleArrayFromResult': called when creating an TitleArray object from a
-database result
+'ThumbnailBeforeProduceHTML': Called before an image HTML is about to be
+rendered (by ThumbnailImage:toHtml method).
+$thumbnail: the ThumbnailImage object
+&$attribs: image attribute array
+&$linkAttribs: image link attribute array
+
+'TitleArrayFromResult': Called when creating an TitleArray object from a
+database result.
&$titleArray: set this to an object to override the default object returned
$res: database result used to create the object
'TitleGetRestrictionTypes': Allows extensions to modify the types of protection
- that can be applied.
+that can be applied.
$title: The title in question.
&$types: The types of protection available.
-'TitleIsCssOrJsPage': Called when determining if a page is a CSS or JS page
+'TitleIsCssOrJsPage': Called when determining if a page is a CSS or JS page.
$title: Title object that is being checked
-$result: Boolean; whether MediaWiki currently thinks this is a CSS/JS page. Hooks may change this value to override the return value of Title::isCssOrJsPage()
-
-'TitleIsAlwaysKnown': Called when determining if a page exists.
-Allows overriding default behaviour for determining if a page exists.
-If $isKnown is kept as null, regular checks happen. If it's a boolean, this value is returned by the isKnown method.
+$result: Boolean; whether MediaWiki currently thinks this is a CSS/JS page.
+ Hooks may change this value to override the return value of
+ Title::isCssOrJsPage().
+
+'TitleIsAlwaysKnown': Called when determining if a page exists. Allows
+overriding default behavior for determining if a page exists. If $isKnown is
+kept as null, regular checks happen. If it's a boolean, this value is returned
+by the isKnown method.
$title: Title object that is being checked
-$result: Boolean|null; whether MediaWiki currently thinks this page is known
+&$isKnown: Boolean|null; whether MediaWiki currently thinks this page is known
-'TitleIsMovable': Called when determining if it is possible to move a page.
-Note that this hook is not called for interwiki pages or pages in immovable namespaces: for these, isMovable() always returns false.
+'TitleIsMovable': Called when determining if it is possible to move a page. Note
+that this hook is not called for interwiki pages or pages in immovable
+namespaces: for these, isMovable() always returns false.
$title: Title object that is being checked
-$result: Boolean; whether MediaWiki currently thinks this page is movable. Hooks may change this value to override the return value of Title::isMovable()
+$result: Boolean; whether MediaWiki currently thinks this page is movable.
+ Hooks may change this value to override the return value of
+ Title::isMovable().
'TitleIsWikitextPage': Called when determining if a page is a wikitext or should
-be handled by seperate handler (via ArticleViewCustom)
+be handled by separate handler (via ArticleViewCustom).
$title: Title object that is being checked
-$result: Boolean; whether MediaWiki currently thinks this is a wikitext page. Hooks may change this value to override the return value of Title::isWikitextPage()
+$result: Boolean; whether MediaWiki currently thinks this is a wikitext page.
+ Hooks may change this value to override the return value of
+ Title::isWikitextPage()
-'TitleMoveComplete': after moving an article (title)
+'TitleMoveComplete': After moving an article (title).
$old: old title
$nt: new title
$user: user who did the move
$pageid: database ID of the page that's been moved
$redirid: database ID of the created redirect
-'TitleReadWhitelist': called at the end of read permissions checks, just before
- adding the default error message if nothing allows the user to read the page.
- If a handler wants a title to *not* be whitelisted, it should also return false.
+'TitleReadWhitelist': Called at the end of read permissions checks, just before
+adding the default error message if nothing allows the user to read the page. If
+a handler wants a title to *not* be whitelisted, it should also return false.
$title: Title object being checked against
$user: Current user object
&$whitelisted: Boolean value of whether this title is whitelisted
-'UndeleteForm::showHistory': called in UndeleteForm::showHistory, after a
+'UndeleteForm::showHistory': Called in UndeleteForm::showHistory, after a
PageArchive object has been created but before any further processing is done.
&$archive: PageArchive object
$title: Title object of the page that we're viewing
-'UndeleteForm::showRevision': called in UndeleteForm::showRevision, after a
+'UndeleteForm::showRevision': Called in UndeleteForm::showRevision, after a
PageArchive object has been created but before any further processing is done.
&$archive: PageArchive object
$title: Title object of the page that we're viewing
-'UndeleteForm::undelete': called un UndeleteForm::undelete, after checking that
+'UndeleteForm::undelete': Called un UndeleteForm::undelete, after checking that
the site is not in read-only mode, that the Title object is not null and after
a PageArchive object has been constructed but before performing any further
processing.
&$archive: PageArchive object
$title: Title object of the page that we're about to undelete
-'UndeleteShowRevision': called when showing a revision in Special:Undelete
+'UndeleteShowRevision': Called when showing a revision in Special:Undelete.
$title: title object related to the revision
$rev: revision (object) that will be viewed
-'UnknownAction': An unknown "action" has occured (useful for defining
- your own actions)
+'UnknownAction': An unknown "action" has occurred (useful for defining your own
+actions).
$action: action name
$article: article "acted on"
-'UnitTestsList': Called when building a list of files with PHPUnit tests
+'UnitTestsList': Called when building a list of files with PHPUnit tests.
&$files: list of files
-'UnwatchArticle': before a watch is removed from an article
+'UnwatchArticle': Before a watch is removed from an article.
$user: user watching
$page: WikiPage object to be removed
-'UnwatchArticleComplete': after a watch is removed from an article
+'UnwatchArticleComplete': After a watch is removed from an article.
$user: user that watched
$page: WikiPage object that was watched
-'UploadForm:initial': before the upload form is generated
+'UpdateUserMailerFormattedPageStatus': Before notification email gets sent.
+$formattedPageStatus: list of valid page states
+
+'UploadForm:initial': Before the upload form is generated. You might set the
+member-variables $uploadFormTextTop and $uploadFormTextAfterSummary to inject
+text (HTML) either before or after the editform.
$form: UploadForm object
-You might set the member-variables $uploadFormTextTop and
-$uploadFormTextAfterSummary to inject text (HTML) either before
-or after the editform.
-'UploadForm:BeforeProcessing': at the beginning of processUpload()
+'UploadForm:BeforeProcessing': At the beginning of processUpload(). Lets you
+poke at member variables like $mUploadDescription before the file is saved. Do
+not use this hook to break upload processing. This will return the user to a
+blank form with no error message; use UploadVerification and UploadVerifyFile
+instead.
$form: UploadForm object
-Lets you poke at member variables like $mUploadDescription before the
-file is saved.
-Do not use this hook to break upload processing. This will return the user to
-a blank form with no error message; use UploadVerification and
-UploadVerifyFile instead
-'UploadCreateFromRequest': when UploadBase::createFromRequest has been called
+'UploadCreateFromRequest': When UploadBase::createFromRequest has been called.
$type: (string) the requested upload type
&$className: the class name of the Upload instance to be created
-'UploadComplete': when Upload completes an upload
+'UploadComplete': when Upload completes an upload.
&$upload: an UploadBase child instance
-'UploadFormInitDescriptor': after the descriptor for the upload form as been
- assembled
+'UploadFormInitDescriptor': After the descriptor for the upload form as been
+assembled.
$descriptor: (array) the HTMLForm descriptor
'UploadFormSourceDescriptors': after the standard source inputs have been
added to the descriptor
$descriptor: (array) the HTMLForm descriptor
-'UploadVerification': additional chances to reject an uploaded file. Consider
- using UploadVerifyFile instead.
+'UploadVerification': Additional chances to reject an uploaded file. Consider
+using UploadVerifyFile instead.
string $saveName: destination file name
string $tempName: filesystem path to the temporary file for checks
-string &$error: output: message key for message to show if upload canceled
- by returning false. May also be an array, where the first element
- is the message key and the remaining elements are used as parameters to
- the message.
+string &$error: output: message key for message to show if upload canceled by
+ returning false. May also be an array, where the first element is the message
+ key and the remaining elements are used as parameters to the message.
'UploadVerifyFile': extra file verification, based on mime type, etc. Preferred
- in most cases over UploadVerification.
+in most cases over UploadVerification.
object $upload: an instance of UploadBase, with all info about the upload
-string $mime: the uploaded file's mime type, as detected by MediaWiki. Handlers
- will typically only apply for specific mime types.
+string $mime: The uploaded file's mime type, as detected by MediaWiki. Handlers
+ will typically only apply for specific mime types.
object &$error: output: true if the file is valid. Otherwise, an indexed array
- representing the problem with the file, where the first element
- is the message key and the remaining elements are used as parameters to
- the message.
+ representing the problem with the file, where the first element is the message
+ key and the remaining elements are used as parameters to the message.
-'UploadComplete': Upon completion of a file upload
+'UploadComplete': Upon completion of a file upload.
$uploadBase: UploadBase (or subclass) object. File can be accessed by
- $uploadBase->getLocalFile().
+ $uploadBase->getLocalFile().
'User::mailPasswordInternal': before creation and mailing of a user's new
temporary password
@@ -2152,247 +2440,258 @@ $user: the user who sent the message out
$ip: IP of the user who sent the message out
$u: the account whose new password will be set
-'UserAddGroup': called when adding a group; return false to override
+'UserAddGroup': Called when adding a group; return false to override
stock group addition.
$user: the user object that is to have a group added
&$group: the group to add, can be modified
-'UserArrayFromResult': called when creating an UserArray object from a
-database result
+'UserArrayFromResult': Called when creating an UserArray object from a database
+result.
&$userArray: set this to an object to override the default object returned
$res: database result used to create the object
-'userCan': To interrupt/advise the "user can do X to Y article" check.
-If you want to display an error message, try getUserPermissionsErrors.
+'userCan': To interrupt/advise the "user can do X to Y article" check. If you
+want to display an error message, try getUserPermissionsErrors.
$title: Title object being checked against
$user : Current user object
$action: Action being checked
$result: Pointer to result returned if hook returns false. If null is returned,
- userCan checks are continued by internal code.
+ userCan checks are continued by internal code.
-'UserCanSendEmail': To override User::canSendEmail() permission check
+'UserCanSendEmail': To override User::canSendEmail() permission check.
$user: User (object) whose permission is being checked
&$canSend: bool set on input, can override on output
-'UserClearNewTalkNotification': called when clearing the
-"You have new messages!" message, return false to not delete it
-$user: User (object) that'll clear the message
+'UserClearNewTalkNotification': Called when clearing the "You have new
+messages!" message, return false to not delete it.
+$user: User (object) that will clear the message
-'UserComparePasswords': called when checking passwords, return false to
-override the default password checks
+'UserComparePasswords': Called when checking passwords, return false to
+override the default password checks.
&$hash: String of the password hash (from the database)
&$password: String of the plaintext password the user entered
&$userId: Integer of the user's ID or Boolean false if the user ID was not
- supplied
+ supplied
&$result: If the hook returns false, this Boolean value will be checked to
- determine if the password was valid
+ determine if the password was valid
'UserCreateForm': change to manipulate the login form
$template: SimpleTemplate instance for the form
-'UserCryptPassword': called when hashing a password, return false to implement
-your own hashing method
+'UserCryptPassword': Called when hashing a password, return false to implement
+your own hashing method.
&$password: String of the plaintext password to encrypt
&$salt: String of the password salt or Boolean false if no salt is provided
-&$wgPasswordSalt: Boolean of whether the salt is used in the default
- hashing method
+&$wgPasswordSalt: Boolean of whether the salt is used in the default hashing
+ method
&$hash: If the hook returns false, this String will be used as the hash
-'UserEffectiveGroups': Called in User::getEffectiveGroups()
+'UserEffectiveGroups': Called in User::getEffectiveGroups().
$user: User to get groups for
&$groups: Current effective groups
-'UserGetAllRights': after calculating a list of all available rights
+'UserGetAllRights': After calculating a list of all available rights.
&$rights: Array of rights, which may be added to.
-'UserGetDefaultOptions': after fetching the core default, this hook is ran
-right before returning the options to the caller. WARNING: this hook is
-called for every call to User::getDefaultOptions(), which means it's
-potentially called dozens or hundreds of times. You may want to cache
-the results of non-trivial operations in your hook function for this reason.
+'UserGetDefaultOptions': After fetching the core default, this hook is run right
+before returning the options to the caller. Warning: This hook is called for
+every call to User::getDefaultOptions(), which means it's potentially called
+dozens or hundreds of times. You may want to cache the results of non-trivial
+operations in your hook function for this reason.
&$defaultOptions: Array of preference keys and their default values.
-'UserGetEmail': called when getting an user email address
+'UserGetEmail': Called when getting an user email address.
$user: User object
&$email: email, change this to override local email
-'UserGetEmailAuthenticationTimestamp': called when getting the timestamp of
-email authentification
+'UserGetEmailAuthenticationTimestamp': Called when getting the timestamp of
+email authentication.
$user: User object
-&$timestamp: timestamp, change this to override local email authentification
- timestamp
+&$timestamp: timestamp, change this to override local email authentication
+ timestamp
-'UserGetImplicitGroups': Called in User::getImplicitGroups()
+'UserGetImplicitGroups': Called in User::getImplicitGroups().
&$groups: List of implicit (automatically-assigned) groups
-'UserGetLanguageObject': Called when getting user's interface language object
+'UserGetLanguageObject': Called when getting user's interface language object.
$user: User object
-&$code: Langauge code that will be used to create the object
+&$code: Language code that will be used to create the object
$context: RequestContext object
-'UserGetReservedNames': allows to modify $wgReservedUsernames at run time
+'UserGetReservedNames': Allows to modify $wgReservedUsernames at run time.
&$reservedUsernames: $wgReservedUsernames
-'UserGetRights': Called in User::getRights()
+'UserGetRights': Called in User::getRights().
$user: User to get rights for
&$rights: Current rights
-'UserIsBlockedFrom': Check if a user is blocked from a specific page (for specific block
- exemptions).
+'UserIsBlockedFrom': Check if a user is blocked from a specific page (for
+specific block exemptions).
$user: User in question
$title: Title of the page in question
&$blocked: Out-param, whether or not the user is blocked from that page.
-&$allowUsertalk: If the user is blocked, whether or not the block allows users to edit their
- own user talk pages.
+&$allowUsertalk: If the user is blocked, whether or not the block allows users
+ to edit their own user talk pages.
'UserIsBlockedGlobally': Check if user is blocked on all wikis.
&$user: User object
$ip: User's IP address
&$blocked: Whether the user is blocked, to be modified by the hook
-'UserLoadAfterLoadFromSession': called to authenticate users on
-external/environmental means; occurs after session is loaded
+'UserLoadAfterLoadFromSession': Called to authenticate users on external or
+environmental means; occurs after session is loaded.
$user: user object being loaded
-'UserLoadDefaults': called when loading a default user
+'UserLoadDefaults': Called when loading a default user.
$user: user object
$name: user name
-'UserLoadFromDatabase': called when loading a user from the database
+'UserLoadFromDatabase': Called when loading a user from the database.
$user: user object
&$s: database query object
-'UserLoadFromSession': called to authenticate users on external/environmental
-means; occurs before session is loaded
+'UserLoadFromSession': Called to authenticate users on external/environmental
+means; occurs before session is loaded.
$user: user object being loaded
-&$result: set this to a boolean value to abort the normal authentification
- process
+&$result: set this to a boolean value to abort the normal authentication
+ process
-'UserLoadOptions': when user options/preferences are being loaded from
-the database.
+'UserLoadOptions': When user options/preferences are being loaded from the
+database.
$user: User object
&$options: Options, can be modified.
-'UserLoginComplete': after a user has logged in
+'UserLoginComplete': After a user has logged in.
$user: the user object that was created on login
$inject_html: Any HTML to inject after the "logged in" message.
'UserLoginForm': change to manipulate the login form
$template: SimpleTemplate instance for the form
-'UserLogout': before a user logs out
+'UserLogout': Before a user logs out.
$user: the user object that is about to be logged out
-'UserLogoutComplete': after a user has logged out
+'UserLogoutComplete': After a user has logged out.
$user: the user object _after_ logout (won't have name, ID, etc.)
$inject_html: Any HTML to inject after the "logged out" message.
$oldName: name of the user before logout (string)
-'UserRemoveGroup': called when removing a group; return false to override
-stock group removal.
+'UserRemoveGroup': Called when removing a group; return false to override stock
+group removal.
$user: the user object that is to have a group removed
&$group: the group to be removed, can be modified
-'UserRights': After a user's group memberships are changed
+'UserRights': After a user's group memberships are changed.
$user : User object that was changed
$add : Array of strings corresponding to groups added
$remove: Array of strings corresponding to groups removed
-'UserRetrieveNewTalks': called when retrieving "You have new messages!"
-message(s)
+'UserRetrieveNewTalks': Called when retrieving "You have new messages!"
+message(s).
$user: user retrieving new talks messages
$talks: array of new talks page(s)
-'UserSaveSettings': called when saving user settings
+'UserSaveSettings': Called when saving user settings.
$user: User object
'UserSaveOptions': Called just before saving user preferences/options.
$user: User object
&$options: Options, modifiable
-'UserSetCookies': called when setting user cookies
+'UserSetCookies': Called when setting user cookies.
$user: User object
&$session: session array, will be added to $_SESSION
&$cookies: cookies array mapping cookie name to its value
-'UserSetEmail': called when changing user email address
+'UserSetEmail': Called when changing user email address.
$user: User object
&$email: new email, change this to override new email address
-'UserSetEmailAuthenticationTimestamp': called when setting the timestamp
-of email authentification
+'UserSetEmailAuthenticationTimestamp': Called when setting the timestamp of
+email authentication.
$user: User object
&$timestamp: new timestamp, change this to override local email
-authentification timestamp
+authentication timestamp
-'UserToolLinksEdit': Called when generating a list of user tool links, eg "Foobar (Talk | Contribs | Block)"
+'UserToolLinksEdit': Called when generating a list of user tool links, e.g.
+"Foobar (Talk | Contribs | Block)".
$userId: User id of the current user
$userText: User name of the current user
&$items: Array of user tool links as HTML fragments
-'WantedPages::getQueryInfo': called in WantedPagesPage::getQueryInfo(), can be
-used to alter the SQL query which gets the list of wanted pages
+'WantedPages::getQueryInfo': Called in WantedPagesPage::getQueryInfo(), can be
+used to alter the SQL query which gets the list of wanted pages.
&$wantedPages: WantedPagesPage object
&$query: query array, see QueryPage::getQueryInfo() for format documentation
-'WatchArticle': before a watch is added to an article
+'WatchArticle': Before a watch is added to an article.
$user: user that will watch
$page: WikiPage object to be watched
-'WatchArticleComplete': after a watch is added to an article
+'WatchArticleComplete': After a watch is added to an article.
$user: user that watched
$page: WikiPage object watched
'WatchlistEditorBuildRemoveLine': when building remove lines in
- Special:Watchlist/edit
+Special:Watchlist/edit.
&$tools: array of extra links
$title: Title object
$redirect: whether the page is a redirect
$skin: Skin object
-'WebRequestPathInfoRouter': While building the PathRouter to parse the REQUEST_URI.
+'WebRequestPathInfoRouter': While building the PathRouter to parse the
+REQUEST_URI.
$router: The PathRouter instance
'WikiExporter::dumpStableQuery': Get the SELECT query for "stable" revisions
-dumps
-One, and only one hook should set this, and return false.
+dumps. One, and only one hook should set this, and return false.
&$tables: Database tables to use in the SELECT query
&$opts: Options to use for the query
&$join: Join conditions
-'wfShellWikiCmd': Called when generating a shell-escaped command line
- string to run a MediaWiki cli script.
+'WikiPageDeletionUpdates': manipulate the list of DataUpdates to be applied when
+a page is deleted. Called in WikiPage::getDeletionUpdates(). Note that updates
+specific to a content model should be provided by the respective Content's
+getDeletionUpdates() method.
+$page: the WikiPage
+$content: the Content to generate updates for
+&$updates: the array of DataUpdate objects. Hook function may want to add to it.
+
+'wfShellWikiCmd': Called when generating a shell-escaped command line string to
+run a MediaWiki cli script.
&$script: MediaWiki cli script path
&$parameters: Array of arguments and options to the script
&$options: Associative array of options, may contain the 'php' and 'wrapper'
- keys
+ keys
-'wgQueryPages': called when initialising $wgQueryPages, use this to add new
-query pages to be updated with maintenance/updateSpecialPages.php
+'wgQueryPages': Called when initialising $wgQueryPages, use this to add new
+query pages to be updated with maintenance/updateSpecialPages.php.
$query: $wgQueryPages itself
-'XmlDumpWriterOpenPage': Called at the end of XmlDumpWriter::openPage, to allow extra
- metadata to be added.
+'XmlDumpWriterOpenPage': Called at the end of XmlDumpWriter::openPage, to allow
+extra metadata to be added.
$obj: The XmlDumpWriter object.
&$out: The output string.
$row: The database row for the page.
$title: The title of the page.
-'XmlDumpWriterWriteRevision': Called at the end of a revision in an XML dump, to add extra
- metadata.
+'XmlDumpWriterWriteRevision': Called at the end of a revision in an XML dump, to
+add extra metadata.
$obj: The XmlDumpWriter object.
&$out: The text being output.
$row: The database row for the revision.
$text: The revision text.
-'XMPGetInfo': Called when obtaining the list of XMP tags to extract. Can be used to add
- additional tags to extract.
-&$items: Array containing information on which items to extract. See XMPInfo for details on the format.
+'XMPGetInfo': Called when obtaining the list of XMP tags to extract. Can be used
+to add additional tags to extract.
+&$items: Array containing information on which items to extract. See XMPInfo for
+ details on the format.
-'XMPGetResults': Called just before returning the results array of parsing xmp data. Can be
- used to post-process the results.
-&$data: Array of metadata sections (such as $data['xmp-general']) each section is an array of
- metadata tags returned (each tag is either a value, or an array of values).
+'XMPGetResults': Called just before returning the results array of parsing xmp
+data. Can be used to post-process the results.
+&$data: Array of metadata sections (such as $data['xmp-general']) each section
+ is an array of metadata tags returned (each tag is either a value, or an array
+ of values).
More hooks might be available but undocumented, you can execute
-./maintenance/findhooks.php to find hidden one.
+'php maintenance/findHooks.php' to find hidden ones.
diff --git a/docs/maintenance.txt b/docs/maintenance.txt
index 988ff280..27619c86 100644
--- a/docs/maintenance.txt
+++ b/docs/maintenance.txt
@@ -15,7 +15,7 @@ subdirectories, all of which have unique purposes.
level /maintenance directory.
Example:
- php clear_stats.php
+ php clearCacheStats.php
The following parameters are available to all maintenance scripts
--help : Print a help message
diff --git a/docs/memcached.txt b/docs/memcached.txt
index 3872edc8..f54a4e7a 100644
--- a/docs/memcached.txt
+++ b/docs/memcached.txt
@@ -198,7 +198,7 @@ Revision text:
expriry: $wgRevisionCacheExpiry
Sessions:
- controlled by: $wgSessionsInMemcached
+ controlled by: $wgSessionsInObjectCache
key: $wgBDname:session:$id
ex: wikidb:session:38d7c5b8d3bfc51egf40c69bc40f8be3
stores: $SESSION, useful when using a multi-sever wiki
@@ -237,9 +237,9 @@ Statistics:
controlled by: $wgStatsMethod
key: $wgDBname:stats:$key
ex: wikibd:stats:request_with_session
- stores: counter for statistics (see maintenance/stats.php script)
+ stores: counter for statistics (see maintenance/showCacheStats.php script)
expiry: none (?)
- cleared by: maintenance/clear_stats.php script
+ cleared by: maintenance/clearCacheStats.php script
User:
key: $wgDBname:user:id:$sId
diff --git a/docs/uidesign/design.html b/docs/uidesign/design.html
index 20dab86e..7062a826 100644
--- a/docs/uidesign/design.html
+++ b/docs/uidesign/design.html
@@ -20,13 +20,13 @@
<span class="comment">span.comment</span>
<a class="feedlink">a.feedlink</a>
<table class="wikitable">
- <tr><th colspan="2">table.wikitable</td></tr>
+ <tr><th colspan="2">table.wikitable</th></tr>
<tr><td>cell</td><td>cell</td></tr>
<tr><td>cell</td><td>cell</td></tr>
</table>
<table class="mw-datatable">
- <tr><th colspan="2">table.mw-datatable</td></tr>
+ <tr><th colspan="2">table.mw-datatable</th></tr>
<tr><td>line with hover</td><td>line with hover</td></tr>
<tr><td>line with hover</td><td>line with hover</td></tr>
</table>
diff --git a/extensions/Cite/Cite.i18n.php b/extensions/Cite/Cite.i18n.php
new file mode 100644
index 00000000..34dc86cd
--- /dev/null
+++ b/extensions/Cite/Cite.i18n.php
@@ -0,0 +1,4274 @@
+<?php
+/**
+ * Internationalisation file for Cite extension.
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$messages = array();
+
+$messages['en'] = array(
+ 'cite-desc' => 'Adds <nowiki><ref[ name=id]></nowiki> and <nowiki><references/></nowiki> tags, for citations',
+ /*
+ Debug and errors
+ */
+ # Internal errors
+ 'cite_croak' => 'Cite died; $1: $2',
+ 'cite_error_key_str_invalid' => 'Internal error;
+invalid $str and/or $key.
+This should never occur.',
+ 'cite_error_stack_invalid_input' => 'Internal error;
+invalid stack key.
+This should never occur.',
+
+ # User errors
+ 'cite_error' => 'Cite error: $1',
+ 'cite_error_ref_numeric_key' => 'Invalid <code>&lt;ref&gt;</code> tag;
+name cannot be a simple integer. Use a descriptive title',
+ 'cite_error_ref_no_key' => 'Invalid <code>&lt;ref&gt;</code> tag;
+refs with no content must have a name',
+ 'cite_error_ref_too_many_keys' => 'Invalid <code>&lt;ref&gt;</code> tag;
+invalid names, e.g. too many',
+ 'cite_error_ref_no_input' => 'Invalid <code>&lt;ref&gt;</code> tag;
+refs with no name must have content',
+ 'cite_error_references_invalid_parameters' => 'Invalid <code>&lt;references&gt;</code> tag;
+no parameters are allowed.
+Use <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Invalid <code>&lt;references&gt;</code> tag;
+parameter "group" is allowed only.
+Use <code>&lt;references /&gt;</code>, or <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Ran out of custom backlink labels.
+Define more in the <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> message.',
+ 'cite_error_no_link_label_group' => 'Ran out of custom link labels for group "$1".
+Define more in the <nowiki>[[MediaWiki:$2]]</nowiki> message.',
+ 'cite_error_references_no_text' => 'Invalid <code>&lt;ref&gt;</code> tag;
+no text was provided for refs named <code>$1</code>',
+ 'cite_error_included_ref' => 'Closing <code>&lt;/ref&gt;</code> missing for <code>&lt;ref&gt;</code> tag',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> tags exist, but no <code>&lt;references/&gt;</code> tag was found',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> tags exist for a group named "$1", but no corresponding <code>&lt;references group="$1"/&gt;</code> tag was found',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> tag in <code>&lt;references&gt;</code> has conflicting group attribute "$1".',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> tag defined in <code>&lt;references&gt;</code> has group attribute "$1" which does not appear in prior text.',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> tag with name "$1" defined in <code>&lt;references&gt;</code> is not used in prior text.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> tag defined in <code>&lt;references&gt;</code> has no name attribute.',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> tag defined in <code>&lt;references&gt;</code> with name "$1" has no content.',
+
+ /*
+ Output formatting
+ */
+ 'cite_reference_link_key_with_num' => '$1_$2',
+ # Ids produced by <ref>
+ 'cite_reference_link_prefix' => 'cite_ref-',
+ 'cite_reference_link_suffix' => '',
+ # Ids produced by <references>
+ 'cite_references_link_prefix' => 'cite_note-',
+ 'cite_references_link_suffix' => '',
+
+ 'cite_reference_link' => '<sup id="$1" class="reference">[[#$2|<nowiki>[</nowiki>$3<nowiki>]</nowiki>]]</sup>',
+ 'cite_references_no_link' => '<p id="$1">$2</p>',
+ 'cite_references_link_one' => '<li id="$1"><span class="mw-cite-backlink">[[#$2|↑]]</span> $3</li>',
+ 'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink">↑ $2</span> $3</li>',
+ 'cite_references_link_many_format' => '<sup>[[#$1|$2]]</sup>',
+ # An item from this set is passed as $3 in the message above
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+ 'cite_references_link_many_sep' => "&#32;",
+ 'cite_references_link_many_and' => "&#32;",
+
+ # Although I could just use # instead of <li> above and nothing here that
+ # will break on input that contains linebreaks
+ 'cite_references_prefix' => '<ol class="references">',
+ 'cite_references_suffix' => '</ol>',
+);
+
+/** Message documentation (Message documentation)
+ * @author Dani
+ * @author LPfi
+ * @author Lejonel
+ * @author Mormegil
+ * @author Nike
+ * @author Purodha
+ * @author Raimond Spekking
+ * @author Raymond
+ * @author Shirayuki
+ * @author Siebrand
+ * @author The Evil IP address
+ * @author Umherirrender
+ */
+$messages['qqq'] = array(
+ 'cite-desc' => '{{desc|name=Cite|url=http://www.mediawiki.org/wiki/Extension:Cite}}',
+ 'cite_croak' => 'Used as an error message. Parameters:
+* $1 - error message. any one of the following messages:
+** {{msg-mw|Cite_error_key_str_invalid}}
+** {{msg-mw|Cite_error_stack_invalid_input}}
+* $2 - serialized error data',
+ 'cite_error_key_str_invalid' => 'Used as <code>$1</code> in {{msg-mw|Cite croak}}.
+
+<code>$str</code> and <code>$key</code> are literals, and refer to who knows which variables the code uses.',
+ 'cite_error_stack_invalid_input' => 'Used as <code>$1</code> in {{msg-mw|Cite croak}}.',
+ 'cite_error' => 'Cite extension. This is used when there are errors in ref or references tags. The parameter $1 is an error message.',
+ 'cite_error_ref_numeric_key' => 'Cite extension. Error message shown if the name of a ref tag only contains digits. Examples that cause this error are <code>&lt;ref name="123" /&gt;</code> or <code>&lt;ref name="456"&gt;input&lt;/ref&gt;</code>',
+ 'cite_error_ref_no_key' => 'Cite extension. Error message shown when ref tags without any content (that is <code>&lt;ref/&gt;</code>) are used without a name.',
+ 'cite_error_ref_too_many_keys' => 'Cite extension. Error message shown when ref tags has parameters other than name and group. Examples that cause this error are <code>&lt;ref name="name" notname="value" /&gt;</code> or <code>&lt;ref notname="value" &gt;input&lt;ref&gt;</code>',
+ 'cite_error_ref_no_input' => 'Cite extension. Error message shown when ref tags without names have no content. An example that cause this error is <code>&lt;ref&gt;&lt;/ref&gt;</code>',
+ 'cite_error_references_invalid_parameters' => 'Cite extension. Error message shown when parmeters are used in the references tag. An example that cause this error is <code>&lt;references someparameter="value" /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Cite extension. Error message shown when unknown parameters are used in the references tag. An example that cause this error is <samp><nowiki><references someparameter="value" /></nowiki></samp>',
+ 'cite_error_references_no_backlink_label' => 'Cite extension. Error message shown in the references tag when the same name is used for too many ref tags. Too many in this case is more than there are backlink labels defined in [[MediaWiki:Cite references link many format backlink labels]].
+
+It is not possible to make a clickable link to this message. "nowiki" is mandatory around [[MediaWiki:Cite references link many format backlink labels]].',
+ 'cite_error_no_link_label_group' => "*'''$1''' is the name of a reference group.
+*'''$2''' is <code>cite_link_label_group-<i>groupname</i></code>.",
+ 'cite_error_references_no_text' => 'Cite extension. This error occurs when the tag <code>&lt;ref name="something" /&gt;</code> is used with the name-option specified and no other tag specifies a cite-text for this name.',
+ 'cite_error_included_ref' => 'Error message shown if the <code>&lt;ref&gt;</code> tag is unbalanced, that means a <code>&lt;ref&gt;</code> is not followed by a <code>&lt;/ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'See also:
+* {{msg-mw|Cite error group refs without references}}',
+ 'cite_error_group_refs_without_references' => 'Parameters:
+* $1 - the group name
+
+If the group $1 is default group, instead of this message, the following message will be used:
+* {{msg-mw|Cite error refs without references}}',
+ 'cite_error_references_group_mismatch' => 'Error message shown when doing something like
+
+<pre>
+<references group="foo">
+<ref group="bar">...</ref>
+</references>
+</pre>
+
+The <code>$1</code> is the value of the <code>group</code> attribute on the inner <code>&lt;ref&gt;</code> (in the example above, “barâ€).',
+ 'cite_error_references_missing_group' => 'Error message shown when doing something like
+
+<pre>
+<references group="foo">
+<ref>...</ref>
+</references>
+</pre>
+
+and there are no <code>&lt;ref&gt;</code> tags in the page text which would use <code>group="foo"</code>.
+
+The <code>$1</code> is the name of the unused <code>group</code> (in the example above, “fooâ€).',
+ 'cite_error_references_missing_key' => 'Error message shown when using something like
+
+<pre>
+<references>
+<ref name="refname">...</ref>
+</references>
+</pre>
+
+and the reference <code>&lt;ref name="refname" /&gt;</code> is not used anywhere in the page text.
+
+The <code>$1</code> parameter contains the name of the unused reference (in the example above, “refnameâ€).',
+ 'cite_error_references_no_key' => 'Error message shown when a <code>&lt;ref&gt;</code> inside <code>&lt;references&gt;</code> does not have a <code>name</code> attribute.',
+ 'cite_error_empty_references_define' => 'Error message shown when there is a <code><ref></code> inside <code><references></code>, but it does not have any content, e.g.
+
+<pre>
+<references>
+<ref name="foo" />
+</references>
+</pre>
+
+<code>$1</code> contains the <code>name</code> of the erroneous <code>&lt;ref&gt;</code> (in the above example, “fooâ€).',
+ 'cite_reference_link_key_with_num' => '{{optional}}',
+ 'cite_reference_link_prefix' => '{{optional}}',
+ 'cite_reference_link_suffix' => '{{optional}}',
+ 'cite_references_link_prefix' => '{{optional}}',
+ 'cite_references_link_suffix' => '{{optional}}',
+ 'cite_reference_link' => '{{optional}}',
+ 'cite_references_no_link' => '{{notranslate}}',
+ 'cite_references_link_one' => '{{optional}}',
+ 'cite_references_link_many' => '{{optional}}',
+ 'cite_references_link_many_format' => '{{optional}}',
+ 'cite_references_link_many_format_backlink_labels' => '{{Optional}}',
+ 'cite_references_link_many_sep' => '{{optional}}',
+ 'cite_references_link_many_and' => '{{optional}}',
+ 'cite_references_prefix' => '{{notranslate}}',
+ 'cite_references_suffix' => '{{notranslate}}',
+);
+
+/** Afrikaans (Afrikaans)
+ * @author Naudefj
+ */
+$messages['af'] = array(
+ 'cite-desc' => 'Maak <nowiki><ref[ name=id]></nowiki> en <nowiki><references/></nowiki> etikette beskikbaar vir sitasie.',
+ 'cite_croak' => 'Probleem met Cite; $1: $2',
+ 'cite_error_key_str_invalid' => 'Interne fout;
+ongeldige $str en/of $key.
+Dit behoort nie te gebeur nie.',
+ 'cite_error_stack_invalid_input' => 'Interne fout;
+ongeldige "stack key".
+Dit behoort nie te gebeur nie.',
+ 'cite_error' => 'Citefout: $1',
+ 'cite_error_ref_numeric_key' => "Ongeldige etiket <code>&lt;ref&gt;</code>;
+die naam kan nie 'n eenvoudige heelgetal wees nie.
+Gebruik 'n beskrywende titel",
+ 'cite_error_ref_no_key' => 'Ongeldige etiket <code>&lt;ref&gt;</code>;
+"refs" sonder inhoud moet \'n naam hê',
+ 'cite_error_ref_too_many_keys' => 'Ongeldig <code>&lt;ref&gt;</code>-etiket;
+ongeldige name, byvoorbeeld te veel',
+);
+
+/** Aragonese (aragonés)
+ * @author Juanpabl
+ */
+$messages['an'] = array(
+ 'cite-desc' => 'Adibe as etiquetas <nowiki><ref[ name=id]></nowiki> y <nowiki><references/></nowiki> ta fer citas',
+ 'cite_croak' => 'Cita corrompita; $1: $2',
+ 'cite_error_key_str_invalid' => 'Error interna; $str y/u $key no conforme(s). Isto no habría d\'escaicer nunca.',
+ 'cite_error_stack_invalid_input' => "Error interna; clau de pila no conforme. Isto no habría d'escaicer nunca.",
+ 'cite_error' => 'Error en a cita: $1',
+ 'cite_error_ref_numeric_key' => "Etiqueta <code>&lt;ref&gt;</code> incorreuta; o nombre d'a etiqueta no puede estar un numero entero, faiga servir un títol descriptivo",
+ 'cite_error_ref_no_key' => 'Etiqueta <code>&lt;ref&gt;</code> incorreuta; as referencias sin de conteniu han de tener un nombre',
+ 'cite_error_ref_too_many_keys' => 'Etiqueta <code>&lt;ref&gt;</code> incorreuta; nombres de parametros incorreutos.',
+ 'cite_error_ref_no_input' => 'Etiqueta <code>&lt;ref&gt;</code> incorreuta; as referencias sin nombre no han de tener conteniu',
+ 'cite_error_references_invalid_parameters' => 'Etiqueta <code>&lt;references&gt;</code> incorreuta; no se premiten parametros, faiga servir <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Etiqueta <code>&lt;references&gt;</code> no conforme;
+nomás se premite o parametro "group".
+Faiga servir <code>&lt;references /&gt;</code>, u <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Ya no quedan etiquetas backlink presonalizatas, defina más en o mensache <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'S\'han acorau as etiquetas de vinclos personalizaus ta o grupo "$1".
+Defina-ne mas en o mensache <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => "Etiqueta <code>&lt;ref&gt;</code> incorreuta; no ha escrito garra testo t'as referencias nombratas <code>$1</code>",
+ 'cite_error_included_ref' => 'Zarrando <code>&lt;/ref&gt;</code> falta una etiqueta <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code>, pero no se trobó garra etiqueta <code>&lt;references /&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code> ta un grupo clamau "$1", pero no se trobó garra etiqueta <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'O tag <code>&lt;ref&gt;</code> en <code>&lt;references&gt;</code> presienta l\'atributo de grupo en conflicto "$1".',
+ 'cite_error_references_missing_group' => 'O tag <code>&lt;ref&gt;</code> definiu en <code>&lt;references&gt;</code> incluye l\'atributo "$1" no declarau en o texto precedente.',
+ 'cite_error_references_missing_key' => 'O tag <code>&lt;ref&gt;</code> con nombre "$1" definiu en <code>&lt;references&gt;</code> no s\'emplega en o texto precedente.',
+ 'cite_error_references_no_key' => 'O tag <code>&lt;ref&gt;</code> definiu en <code>&lt;references&gt;</code> no tiene garra atributo de nombre.',
+ 'cite_error_empty_references_define' => 'O tag <code>&lt;ref&gt;</code> definiu en <code>&lt;references&gt;</code> con nombre "$1" no tiene garra conteniu.',
+);
+
+/** Arabic (العربية)
+ * @author Aiman titi
+ * @author Meno25
+ * @author OsamaK
+ */
+$messages['ar'] = array(
+ 'cite-desc' => 'يضي٠وسوم <nowiki><ref[ name=id]></nowiki> و <nowiki><references/></nowiki> ، للاستشهادات',
+ 'cite_croak' => 'الاستشهاد مات؛ $1: $2',
+ 'cite_error_key_str_invalid' => 'خطأ داخلي؛
+$str و/أو $key غير صحيح.
+هذا لا يجب أن يحدث أبدا.',
+ 'cite_error_stack_invalid_input' => 'خطأ داخلي؛
+Ù…Ùتاح ستاك غير صحيح.
+هذا لا يجب أن يحدث أبدا.',
+ 'cite_error' => 'خطأ استشهاد: $1',
+ 'cite_error_ref_numeric_key' => 'وسم <code>&lt;ref&gt;</code> غير صحيح؛
+الاسم لا يمكن أن يكون عددا صحيحا بسيطا. استخدم عنوانا وصÙيا',
+ 'cite_error_ref_no_key' => 'وسم <code>&lt;ref&gt;</code> غير صحيح؛
+المراجع غير ذات المحتوى يجب أن تمتلك اسما',
+ 'cite_error_ref_too_many_keys' => 'وسم <code>&lt;ref&gt;</code> غير صحيح؛
+أسماء غير صحيحة، على سبيل المثال كثيرة جدا',
+ 'cite_error_ref_no_input' => 'وسم <code>&lt;ref&gt;</code> غير صحيح؛
+المراجع غير ذات الاسم يجب أن تمتلك محتوى',
+ 'cite_error_references_invalid_parameters' => 'وسم <code>&lt;references&gt;</code> غير صحيح؛
+لا محددات مسموح بها.
+استخدم <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'وسم <code>&lt;references&gt;</code> غير صحيح؛
+المحدد "group" Ùقط مسموح به.
+استخدم <code>&lt;references /&gt;</code>، أو <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Ù†Ùدت علامات الوصلات الراجعة المخصصة.
+عر٠المزيد ÙÙŠ رسالة <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'تم الإنتهاء من تسمية الارتباطات المخصصة لمجموعة "$1".
+
+للحصول على تعري٠أكثر أنظر هذه <nowiki>[[MediaWiki:$2]]</nowiki> الرسالة.',
+ 'cite_error_references_no_text' => 'وسم <code>&lt;ref&gt;</code> غير صحيح؛
+لا نص تم توÙيره للمراجع المسماة <code>$1</code>',
+ 'cite_error_included_ref' => 'إغلاق <code>&lt;/ref&gt;</code> Ù…Ùقود لوسم <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'وسم <code>&lt;ref&gt;</code> موجود، لكن لا وسم <code>&lt;references/&gt;</code> تم العثور عليه',
+ 'cite_error_group_refs_without_references' => 'وسوم <code>&lt;ref&gt;</code> موجودة لمجموعة اسمها "$1"، لكن لا وسم <code>&lt;references group="$1"/&gt;</code> مماثل تم العثور عليه',
+ 'cite_error_references_group_mismatch' => 'الوسم <code>&lt;ref&gt;</code> ÙÙŠ <code>&lt;references&gt;</code> Ùيه خاصية group متضاربة "$1".',
+ 'cite_error_references_missing_group' => 'الوسم <code>&lt;ref&gt;</code> المÙعرّ٠ÙÙŠ <code>&lt;references&gt;</code> Ùيه خاصية group "$1" التي لا تظهر ÙÙŠ النص السابق.',
+ 'cite_error_references_missing_key' => 'الوسم <code>&lt;ref&gt;</code> ذو الاسم "$1" المÙعرّ٠ÙÙŠ <code>&lt;references&gt;</code> غير مستخدم ÙÙŠ النص السابق.',
+ 'cite_error_references_no_key' => 'الوسم <code>&lt;ref&gt;</code> المعر٠ÙÙŠ <code>&lt;references&gt;</code> ليس له خاصة اسم.',
+ 'cite_error_empty_references_define' => 'الوسم <code>&lt;ref&gt;</code> المÙعرّ٠ÙÙŠ <code>&lt;references&gt;</code> بالاسم "$1" ليس له محتوى.',
+ 'cite_references_link_many_format_backlink_labels' => 'Ø£ ب ت Ø« ج Ø­ Ø® د Ø° ر ز س Ø´ ص ض Ø· ظ ع غ Ù Ù‚ Ùƒ Ù„ Ù… Ù† Ù‡ Ùˆ ÙŠ أأ أب أت أث أج أح أخ أد أذ أر أز أس أش أص أض أط أظ أع أغ أ٠أق أك أل أم أن أه أو أي بأ بب بت بث بج بح بخ بد بذ بر بز بس بش بص بض بط بظ بع بغ ب٠بق بك بل بم بن به بو بي تأ تب تت تث تج تح تخ تد تذ تر تز تس تش تص تض تط تظ تع تغ ت٠تق تك تل تم تن ته تو تي ثأ ثب ثت ثث ثج ثح ثخ ثد ثذ ثر ثز ثس ثش ثص ثض ثط ثظ ثع ثغ ث٠ثق ثك ثل ثم ثن ثه ثو ثي جأ جب جت جث جج جح جخ جد جذ جر جز جس جش جص جض جط جظ جع جغ ج٠جق جك جل جم جن جه جو جي حأ حب حت حث حج حح حخ حد حذ حر حز حس حش حص حض حط حظ حع حغ ح٠حق حك حل حم حن حه حو حي خأ خب خت خث خج خح خخ خد خذ خر خز خس خش خص خض خط خظ خع خغ خ٠خق خك خل خم خن خه خو خي دأ دب دت دث دج دح دخ دد دذ در دز دس دش دص دض دط دظ دع دغ د٠دق دك دل دم دن ده دو دي ذأ ذب ذت ذث ذج ذح ذخ ذد ذذ ذر ذز ذس ذش ذص ذض ذط ذظ ذع ذغ ذ٠ذق ذك ذل ذم ذن ذه ذو ذي رأ رب رت رث رج رح رخ رد رذ رر رز رس رش رص رض رط رظ رع رغ ر٠رق رك رل رم رن ره رو ري زأ زب زت زث زج زح زخ زد زذ زر زز زس زش زص زض زط زظ زع زغ ز٠زق زك زل زم زن زه زو زي سأ سب ست سث سج سح سخ سد سذ سر سز سس سش سص سض سط سظ سع سغ س٠سق سك سل سم سن سه سو سي شأ شب شت شث شج شح شخ شد شذ شر شز شس شش شص شض شط شظ شع شغ ش٠شق شك شل شم شن شه شو شي صأ صب صت صث صج صح صخ صد صذ صر صز صس صش صص صض صط صظ صع صغ ص٠صق صك صل صم صن صه صو صي ضأ ضب ضت ضث ضج ضح ضخ ضد ضذ ضر ضز ضس ضش ضص ضض ضط ضظ ضع ضغ ض٠ضق ضك ضل ضم ضن ضه ضو ضي طأ طب طت طث طج طح طخ طد طذ طر طز طس طش طص طض طط طظ طع طغ ط٠طق طك طل طم طن طه طو طي ظأ ظب ظت ظث ظج ظح ظخ ظد ظذ ظر ظز ظس ظش ظص ظض ظط ظظ ظع ظغ ظ٠ظق ظك ظل ظم ظن ظه ظو ظي عأ عب عت عث عج عح عخ عد عذ عر عز عس عش عص عض عط عظ عع عغ ع٠عق عك عل عم عن عه عو عي غأ غب غت غث غج غح غخ غد غذ غر غز غس غش غص غض غط غظ غع غغ غ٠غق غك غل غم غن غه غو غي ÙØ£ Ùب Ùت ÙØ« Ùج ÙØ­ ÙØ® Ùد ÙØ° Ùر Ùز Ùس ÙØ´ Ùص Ùض ÙØ· Ùظ Ùع Ùغ ÙÙ ÙÙ‚ ÙÙƒ ÙÙ„ ÙÙ… ÙÙ† ÙÙ‡ ÙÙˆ ÙÙŠ قأ قب قت قث قج قح قخ قد قذ قر قز قس قش قص قض قط قظ قع قغ ق٠قق قك قل قم قن قه قو قي كأ كب كت كث كج كح كخ كد كذ كر كز كس كش كص كض كط كظ كع كغ ك٠كق كك كل كم كن كه كو كي لأ لب لت لث لج لح لخ لد لذ لر لز لس لش لص لض لط لظ لع لغ ل٠لق لك لل لم لن له لو لي مأ مب مت مث مج مح مخ مد مذ مر مز مس مش مص مض مط مظ مع مغ م٠مق مك مل مم من مه مو مي نأ نب نت نث نج نح نخ ند نذ نر نز نس نش نص نض نط نظ نع نغ ن٠نق نك نل نم نن نه نو ني هأ هب هت هث هج هح هخ هد هذ هر هز هس هش هص هض هط هظ هع هغ ه٠هق هك هل هم هن هه هو هي وأ وب وت وث وج وح وخ ود وذ ور وز وس وش وص وض وط وظ وع وغ و٠وق وك ول وم ون وه وو وي يأ يب يت يث يج يح يخ يد يذ ير يز يس يش يص يض يط يظ يع يغ ي٠يق يك يل يم ين يه يو يي',
+);
+
+/** Aramaic (ÜܪܡÜÜ)
+ * @author Basharh
+ */
+$messages['arc'] = array(
+ 'cite_error' => 'Ü¦Ü˜Ü•Ü Ü’Ü¡Ü£Ü—Ü•Ü¢Ü˜Ü¬Ü: $1',
+);
+
+/** Egyptian Spoken Arabic (مصرى)
+ * @author Ghaly
+ * @author Meno25
+ * @author Ramsis II
+ */
+$messages['arz'] = array(
+ 'cite-desc' => 'بيضي٠التاجز <nowiki><ref[ name=id]></nowiki> و <nowiki><references/></nowiki> ، للاستشهاد',
+ 'cite_croak' => 'المرجع مات; $1: $2',
+ 'cite_error_key_str_invalid' => 'غلط داخلى؛
+$str و/أو $key غلط.
+ده لازم مايحصلش ابدا.',
+ 'cite_error_stack_invalid_input' => 'غلط داخلى؛
+Ù…Ùتاح ستاك مش صحيح.
+ده لازم مايحصلش ابدا',
+ 'cite_error' => 'المرجع غلط: $1',
+ 'cite_error_ref_numeric_key' => 'التاج <code>&lt;ref&gt;</code> مش صحيح؛
+الاسم ماينÙعش يكون عدد صحيح بسيط. استخدم عنوان بيوصÙ',
+ 'cite_error_ref_no_key' => 'التاج <code>&lt;ref&gt;</code> مش صحيح؛
+المراجع اللى من غير محتوى لازميكون ليها اسم',
+ 'cite_error_ref_too_many_keys' => 'التاج <code>&lt;ref&gt;</code> مش صحيح؛
+أسامى مش صحيحة، يعنى مثلا: كتير قوي',
+ 'cite_error_ref_no_input' => 'تاج <code>&lt;ref&gt;</code> مش صحيح؛
+المراجع اللى من غير اسم لازم يكون ليها محتوى',
+ 'cite_error_references_invalid_parameters' => 'مش صحيح <code>&lt;references&gt;</code> تاج;
+ماÙيش محددات مسموح بيها.
+استخدم <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'مش صحيح <code>&lt;references&gt;</code> تاج;
+محدد "group" مسموح بيه بس.
+استخدم <code>&lt;references /&gt;</code>, or <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'علامات الوصلات الراجعة المخصصة خلصت.
+عر٠اكتر ÙÙ‰ رسالة <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_references_no_text' => 'مش صحيح <code>&lt;ref&gt;</code> تاج;
+ماÙيش نص متواÙر ÙÙ‰ المراجع اللى اسمها<code>$1</code>',
+ 'cite_error_included_ref' => 'إغلاق <code>&lt;/ref&gt;</code> Ù…Ùقود لوسم <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> التاجز موجوده, بس ماÙيش <code>&lt;references/&gt;</code> تاجز اتلقت',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> ÙÙ‰ تاجز موجوده لمجموعه اسمها "$1", بس ماÙيش مقابلها تاجز <code>&lt;references group="$1"/&gt;</code> اتلقت',
+ 'cite_references_link_many_format_backlink_labels' => 'Ø£ ب ت Ø« ج Ø­ Ø® د Ø° ر ز س Ø´ ص ض Ø· ظ ع غ Ù Ù‚ Ùƒ Ù„ Ù… Ù† Ù‡ Ùˆ Ù‰ أأ أب أت أث أج أح أخ أد أذ أر أز أس أش أص أض أط أظ أع أغ أ٠أق أك أل أم أن أه أو أى بأ بب بت بث بج بح بخ بد بذ بر بز بس بش بص بض بط بظ بع بغ ب٠بق بك بل بم بن به بو بى تأ تب تت تث تج تح تخ تد تذ تر تز تس تش تص تض تط تظ تع تغ ت٠تق تك تل تم تن ته تو تى ثأ ثب ثت ثث ثج ثح ثخ ثد ثذ ثر ثز ثس ثش ثص ثض ثط ثظ ثع ثغ ث٠ثق ثك ثل ثم ثن ثه ثو ثى جأ جب جت جث جج جح جخ جد جذ جر جز جس جش جص جض جط جظ جع جغ ج٠جق جك جل جم جن جه جو جى حأ حب حت حث حج حح حخ حد حذ حر حز حس حش حص حض حط حظ حع حغ ح٠حق حك حل حم حن حه حو حى خأ خب خت خث خج خح خخ خد خذ خر خز خس خش خص خض خط خظ خع خغ خ٠خق خك خل خم خن خه خو خى دأ دب دت دث دج دح دخ دد دذ در دز دس دش دص دض دط دظ دع دغ د٠دق دك دل دم دن ده دو دى ذأ ذب ذت ذث ذج ذح ذخ ذد ذذ ذر ذز ذس ذش ذص ذض ذط ذظ ذع ذغ ذ٠ذق ذك ذل ذم ذن ذه ذو ذى رأ رب رت رث رج رح رخ رد رذ رر رز رس رش رص رض رط رظ رع رغ ر٠رق رك رل رم رن ره رو رى زأ زب زت زث زج زح زخ زد زذ زر زز زس زش زص زض زط زظ زع زغ ز٠زق زك زل زم زن زه زو زى سأ سب ست سث سج سح سخ سد سذ سر سز سس سش سص سض سط سظ سع سغ س٠سق سك سل سم سن سه سو سى شأ شب شت شث شج شح شخ شد شذ شر شز شس شش شص شض شط شظ شع شغ ش٠شق شك شل شم شن شه شو شى صأ صب صت صث صج صح صخ صد صذ صر صز صس صش صص صض صط صظ صع صغ ص٠صق صك صل صم صن صه صو صى ضأ ضب ضت ضث ضج ضح ضخ ضد ضذ ضر ضز ضس ضش ضص ضض ضط ضظ ضع ضغ ض٠ضق ضك ضل ضم ضن ضه ضو ضى طأ طب طت طث طج طح طخ طد طذ طر طز طس طش طص طض طط طظ طع طغ ط٠طق طك طل طم طن طه طو طى ظأ ظب ظت ظث ظج ظح ظخ ظد ظذ ظر ظز ظس ظش ظص ظض ظط ظظ ظع ظغ ظ٠ظق ظك ظل ظم ظن ظه ظو ظى عأ عب عت عث عج عح عخ عد عذ عر عز عس عش عص عض عط عظ عع عغ ع٠عق عك عل عم عن عه عو عى غأ غب غت غث غج غح غخ غد غذ غر غز غس غش غص غض غط غظ غع غغ غ٠غق غك غل غم غن غه غو غى ÙØ£ Ùب Ùت ÙØ« Ùج ÙØ­ ÙØ® Ùد ÙØ° Ùر Ùز Ùس ÙØ´ Ùص Ùض ÙØ· Ùظ Ùع Ùغ ÙÙ ÙÙ‚ ÙÙƒ ÙÙ„ ÙÙ… ÙÙ† ÙÙ‡ ÙÙˆ ÙÙ‰ قأ قب قت قث قج قح قخ قد قذ قر قز قس قش قص قض قط قظ قع قغ ق٠قق قك قل قم قن قه قو قى كأ كب كت كث كج كح كخ كد كذ كر كز كس كش كص كض كط كظ كع كغ ك٠كق كك كل كم كن كه كو كى لأ لب لت لث لج لح لخ لد لذ لر لز لس لش لص لض لط لظ لع لغ ل٠لق لك لل لم لن له لو لى مأ مب مت مث مج مح مخ مد مذ مر مز مس مش مص مض مط مظ مع مغ م٠مق مك مل مم من مه مو مى نأ نب نت نث نج نح نخ ند نذ نر نز نس نش نص نض نط نظ نع نغ ن٠نق نك نل نم نن نه نو نى هأ هب هت هث هج هح هخ هد هذ هر هز هس هش هص هض هط هظ هع هغ ه٠هق هك هل هم هن هه هو هى وأ وب وت وث وج وح وخ ود وذ ور وز وس وش وص وض وط وظ وع وغ و٠وق وك ول وم ون وه وو وى يأ يب يت يث يج يح يخ يد يذ ير يز يس يش يص يض يط يظ يع يغ ي٠يق يك يل يم ين يه يو يى',
+);
+
+/** Assamese (অসমীয়া)
+ * @author Bishnu Saikia
+ * @author Gitartha.bordoloi
+ * @author Reedy
+ */
+$messages['as'] = array(
+ 'cite-desc' => 'উদà§à¦§à§ƒà¦¤à¦¿à§° বাবে <nowiki><ref[ name=id]></nowiki> আৰৠ<nowiki><references/></nowiki> টেগà§â€Œà¦¸à¦®à§‚হ যোগ কৰে',
+ 'cite_croak' => 'উদà§à¦§à§ƒà¦¤à¦¿à§° অনà§à¦¤ পৰিছে; $1: $2',
+ 'cite_error_key_str_invalid' => 'আভà§à¦¯à¦¨à§à¦¤à§°à§€à¦£ তà§à§°à§à¦Ÿà¦¿;
+অবৈধ $str আৰà§/বা $key।
+à¦à¦‡à¦Ÿà§‹ কেতিয়াও হোৱা উচিত নহয়।',
+ 'cite_error_stack_invalid_input' => 'আভà§à¦¯à¦¨à§à¦¤à§°à§€à¦£ তà§à§°à§à¦Ÿà¦¿;
+অবৈধ ষà§à¦Ÿà§‡à¦• কী।
+à¦à¦‡à¦Ÿà§‹ কেতিয়াও হোৱা উচিত নহয়।',
+ 'cite_error' => 'উদà§à¦§à§ƒà¦¤à¦¿ তà§à§°à§à¦Ÿà¦¿: $1',
+ 'cite_error_ref_numeric_key' => "অবৈধ <code>&lt;ref&gt;</code> টেগ;
+নাম কোনো সৰল পূৰà§à¦£à¦¸à¦‚খà§à¦¯à¦¾ হ'ব নোৱাৰে। à¦à¦Ÿà¦¾ বৰà§à¦£à¦¨à¦¾à¦®à§‚লক শিৰোনাম বà§à¦¯à§±à¦¹à¦¾à§° কৰক।",
+ 'cite_error_ref_no_key' => 'অবৈধ <code>&lt;ref&gt;</code> টেগ;
+সমলবিহীন refসমূহৰ অৱশà§à¦¯à§‡à¦‡ à¦à¦Ÿà¦¾ নাম থাকিব লাগিব।',
+ 'cite_error_ref_too_many_keys' => 'অবৈধ <code>&lt;ref&gt;</code> টেগ;
+অবৈধ নাম, যেনে- বহà§à¦¸à¦‚খà§à¦¯à¦•',
+ 'cite_error_ref_no_input' => 'অবৈধ <code>&lt;ref&gt;</code> টেগ;
+নামবিহীন refসমূহৰ অৱশà§à¦¯à§‡à¦‡ সমল থাকিব লাগিব।',
+ 'cite_error_references_invalid_parameters' => 'অবৈধ <code>&lt;references&gt;</code> টেগ;
+কোনো পেৰামিটাৰ অনà§à¦®à§‹à¦¦à¦¨ কৰা হোৱা নাই।
+<code>&lt;references /&gt;</code> বà§à¦¯à§±à¦¹à¦¾à§° কৰক।',
+ 'cite_error_references_invalid_parameters_group' => 'অবৈধ <code>&lt;references&gt;</code> টেগ;
+কেৱল পেৰামিটাৰ "গোট"ক অনà§à¦®à¦¤à¦¿ দিয়া হৈছে।
+<code>&lt;references /&gt;</code>, বা <code>&lt;references group="..." /&gt;</code> বà§à¦¯à§±à¦¹à¦¾à§° কৰক',
+ 'cite_error_references_no_backlink_label' => 'কাষà§à¦Ÿà¦® বেকলিংক লেবেল শেষ হৈছে।
+<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> বাৰà§à¦¤à¦¾à¦¤ আৰৠসংজà§à¦žà¦¾ দিয়ক।',
+ 'cite_error_no_link_label_group' => '"$1" গোটৰ বাবে কাষà§à¦Ÿà¦® লিংক লেবেল উকলিছে।
+<nowiki>[[MediaWiki:$2]]</nowiki> বাৰà§à¦¤à¦¾à¦¤ আৰৠসংজà§à¦žà¦¾ দিয়ক।',
+ 'cite_error_references_no_text' => 'অবৈধ <code>&lt;ref&gt;</code> টেগ;
+<code>$1</code> নামৰ refৰ বাবে কোনো পাঠà§à¦¯ পà§à§°à¦¦à¦¾à¦¨ কৰা হোৱা নাই',
+ 'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> বনà§à¦§ কৰা হৈছে; <code>&lt;ref&gt;</code> টেগৰ বাবে পোৱা নাই',
+ 'cite_error_refs_without_references' => "<code>&lt;ref&gt;</code> টেগà§â€Œà¦¸à¦®à§‚হ আছে, কিনà§à¦¤à§ কোনো <code>&lt;references/&gt;</code> বা <code>&#123;&#123;Reflist&#125;&#125;</code> টেগà§â€Œ পোৱা নগ'ল। অনà§à¦—à§à§°à¦¹ কৰি পà§à§°à¦¬à¦¨à§à¦§à§° শেষ অংশত ওপৰোকà§à¦¤ টেগà§â€Œ যোগ দিয়ক।",
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> টেগà§â€Œà¦¸à¦®à§‚হ "$1" নামৰ à¦à¦Ÿà¦¾ গোটৰ বাবে আছে, কিনà§à¦¤à§ তাৰ <code>&lt;references group="$1"/&gt;</code> টেগà§â€Œ পোৱা নগ\'ল',
+ 'cite_error_references_group_mismatch' => '"$1" গোটৰ কà§à¦·à§‡à¦¤à§à§°à¦¤ <code>&lt;references&gt;</code>ৰ <code>&lt;ref&gt;</code> টেগà§â€Œ বà§à¦¯à§±à¦¹à¦¾à§°à¦¤ সমসà§à¦¯à¦¾ হৈছে।',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>ত দিয়া <code>&lt;ref&gt;</code> টেগৰ "$1" গোট à¦à¦Ÿà§à¦Ÿà§à§°à¦¿à¦¬à¦¿à¦‰à¦Ÿ আছে, যিটো পূৰà§à¦¬à§° পাঠà§à¦¯à¦¤ ওলোৱা নাই।',
+ 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>ত দিয়া "$1" নামৰ <code>&lt;ref&gt;</code> টেগà§â€Œà¦Ÿà§‹ পূৰà§à¦¬à§° পাঠà§à¦¯à¦¤ বà§à¦¯à§±à¦¹à¦¾à§° কৰা নাই।',
+ 'cite_error_references_no_key' => '<code>&lt;references&gt;</code>ত দিয়া <code>&lt;ref&gt;</code> টেগৰ কোনো নাম আবণà§à¦Ÿà¦¨ নাই।',
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code>ত দিয়া "$1" নামৰ <code>&lt;ref&gt;</code> টেগৰ কোনো সমল নাই।',
+);
+
+/** Asturian (asturianu)
+ * @author Esbardu
+ * @author Xuacu
+ */
+$messages['ast'] = array(
+ 'cite-desc' => 'Añade les etiquetes <nowiki><ref[ name=id]></nowiki> y <nowiki><references/></nowiki> pa les cites',
+ 'cite_croak' => 'Cita corrompida; $1: $2',
+ 'cite_error_key_str_invalid' => 'Error internu;
+$str y/o $key inválidos.
+Esto nun tendría d\'asoceder nunca.',
+ 'cite_error_stack_invalid_input' => "Error internu;
+clave de pila inválida.
+Esto nun tendría d'asoceder nunca.",
+ 'cite_error' => 'Error de cita: $1',
+ 'cite_error_ref_numeric_key' => 'Etiqueta <code>&lt;ref&gt;</code> non válida; el nome nun pue ser un enteru simple, usa un títulu descriptivu',
+ 'cite_error_ref_no_key' => 'Etiqueta <code>&lt;ref&gt;</code> non válida; les referencies ensin conteníu han tener un nome',
+ 'cite_error_ref_too_many_keys' => 'Etiqueta <code>&lt;ref&gt;</code> non válida; nomes non válidos (p.ex. demasiaos)',
+ 'cite_error_ref_no_input' => 'Etiqueta <code>&lt;ref&gt;</code> non válida; les referencies ensin nome han tener conteníu',
+ 'cite_error_references_invalid_parameters' => 'Etiqueta <code>&lt;references&gt;</code> non válida; nun se permiten parámetros, usa <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Etiqueta <code>&lt;references&gt;</code> non válida;
+namái se permite\'l parámetru "group".
+Usa <code>&lt;references /&gt;</code>, o bien <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Etiquetes personalizaes agotaes.
+Defini más nel mensaxe <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Nun queden más etiquetes d\'enllaz personalizáu pal grupu "$1".
+Define más nel mensaxe <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Etiqueta <code>&lt;ref&gt;</code> non válida; nun se conseñó testu pa les referencies nomaes <code>$1</code>',
+ 'cite_error_included_ref' => 'Falta <code>&lt;/ref&gt;</code> pa la etiqueta <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => "Les etiquetes <code>&lt;ref&gt;</code> esisten, pero nun s'alcontró denguna etiqueta <code>&lt;references/&gt;</code>",
+ 'cite_error_group_refs_without_references' => 'Les etiquetes <code>&lt;ref&gt;</code> esisten pa un grupu llamáu "$1", pero nun s\'alcontró la etiqueta <code>&lt;references group="$1"/&gt;</code> correspondiente',
+ 'cite_error_references_group_mismatch' => 'La etiqueta <code>&lt;ref&gt;</code> en <code>&lt;references&gt;</code> tien un conflictu col atributu de grupu "$1".',
+ 'cite_error_references_missing_group' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> tien l\'atributu de grupu "$1" que nun apaez nel testu anterior.',
+ 'cite_error_references_missing_key' => 'La etiqueta <code>&lt;ref&gt;</code> col nome "$1" definida en <code>&lt;references&gt;</code> nun s\'utiliza nel testu anterior.',
+ 'cite_error_references_no_key' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> nun tien dengún atributu de nome.',
+ 'cite_error_empty_references_define' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> col nome "$1" nun tien conteníu.',
+);
+
+/** Azerbaijani (azərbaycanca)
+ * @author Vago
+ */
+$messages['az'] = array(
+ 'cite_reference_link_key_with_num' => '$1_$2',
+ 'cite_reference_link_prefix' => 'sitat_istinad-',
+ 'cite_references_link_prefix' => 'sitat_qeyd-',
+ 'cite_reference_link' => '<sup id="$1" class="reference">[[#$2|<nowiki>[</nowiki>$3<nowiki>]</nowiki>]]</sup>',
+ 'cite_references_link_many_format' => '<sup>[[#$1|$2]]</sup>',
+ 'cite_references_link_many_sep' => '&#32;',
+ 'cite_references_link_many_and' => '&#32;',
+);
+
+/** South Azerbaijani (تورکجه)
+ * @author Amir a57
+ */
+$messages['azb'] = array(
+ 'cite-desc' => 'گؤتورمه‌لر اوچون، <nowiki><ref[ name=id]></nowiki> ve <nowiki><references/></nowiki> ائلئمئنت‌لری‌نین علاوه‌لر',
+ 'cite_croak' => 'سیتات کایبئدیلدی؛ $1: $2',
+ 'cite_error_key_str_invalid' => 'داخی‌لی ختا؛
+اعتبارسیز $ کوچ و / یا دا $ کئی.
+بو اصلا اولماما‌لی.',
+ 'cite_error_stack_invalid_input' => 'داخی‌لی ختا؛
+اعتبارسیز ایستاجک آچاری.
+بو اصلا اولماما‌لی.',
+ 'cite_error' => 'قایناق خطاسی $1',
+);
+
+/** Bashkir (башҡортÑа)
+ * @author Assele
+ */
+$messages['ba'] = array(
+ 'cite-desc' => 'Төшөрмәләр Ó©Ñөн <nowiki><ref[ name=id]></nowiki> һәм <nowiki><references/></nowiki> билдәләрен өҫтәй',
+ 'cite_croak' => 'Өҙөмтә юғалған; $1: $2',
+ 'cite_error_key_str_invalid' => 'ЭÑке хата;
+$str һәм/йәки $key дөрөҫ түгел.
+Был бер ҡаÑан да булырға тейеш түгел.',
+ 'cite_error_stack_invalid_input' => 'ЭÑке хата;
+Стек аÑÒ¡Ñ‹ÑÑ‹ дөрөҫ түгел.
+Был бер ҡаÑан да булырға тейеш түгел.',
+ 'cite_error' => 'Өҙөмтә хатаһы: $1',
+ 'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> билдәһе дөрөҫ түгел;
+иÑем бөтөн һан була алмай. ТаÑуирларлыҡ иÑем ҡулланығыҙ.',
+ 'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> билдәһе дөрөҫ түгел;
+ÑÑтәлекһеҙ төшөрмәнең иÑеме булырға тейеш.',
+ 'cite_error_ref_too_many_keys' => '<code>&lt;ref&gt;</code> билдәһе дөрөҫ түгел;
+иÑемдәр дөрөҫ түгел, бәлки, бигерәк күп',
+ 'cite_error_ref_no_input' => '<code>&lt;ref&gt;</code> билдәһе дөрөҫ түгел;
+иÑемһеҙ төшөрмәнең ÑÑтәлеге булырға тейеш.',
+ 'cite_error_references_invalid_parameters' => '<code>&lt;references&gt;</code> билдәһе дөрөҫ түгел;
+параметрҙар Ñ€Ó©Ñ…Ñәт ителмәй.
+<code>&lt;references /&gt;</code> ҡулланығыҙ.',
+ 'cite_error_references_invalid_parameters_group' => '<code>&lt;references&gt;</code> билдәһе дөрөҫ түгел;
+"group" параметры ғына Ñ€Ó©Ñ…Ñәт ителә.
+<code>&lt;references /&gt;</code> йәки <code>&lt;references group="..." /&gt;</code> ҡулланығыҙ.',
+ 'cite_error_references_no_backlink_label' => 'Кире ҡайтарыу һылтанмалары Ó©Ñөн хәрефтәр етмәй.
+<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> ÑиÑтема хәбәрен киңәйтергә кәрәк.',
+ 'cite_error_no_link_label_group' => '"$1" төркөмө Ó©Ñөн ҡулланыуÑÑ‹ һылтанмалары етмәй.
+[[MediaWiki:$2]] ÑиÑтема хәбәрендә күберәк билдәләгеҙ.',
+ 'cite_error_references_no_text' => '<code>&lt;ref&gt;</code> билдәһе дөрөҫ түгел;
+<code>$1</code> төшөрмәләре Ó©Ñөн текÑÑ‚ ÑŽÒ¡',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> билдәһе Ó©Ñөн <code>&lt;/ref&gt;</code> Ñбыу билдәһе ÑŽÒ¡',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> билдәһе бар, әммә <code>&lt;references/&gt;</code> билдәһе юҡ',
+ 'cite_error_group_refs_without_references' => '"$1" төркөмө Ó©Ñөн <code>&lt;ref&gt;</code> билдәһе бар, әммә <code>&lt;references group="$1"/&gt;</code> билдәһе ÑŽÒ¡',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> билдәһенең <code>&lt;ref&gt;</code> билдәһендә "$1" төркөмө атрибуты ҡаршылыҡтар тыуҙыра.',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> билдәһенең <code>&lt;ref&gt;</code> билдәһендә "$1" төркөмө атрибуты үрҙәге текÑта оÑрамай.',
+ 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> билдәһенең "$1" иÑемле <code>&lt;ref&gt;</code> билдәһе үрҙәге текÑта ҡулланылмай.',
+ 'cite_error_references_no_key' => '<code>&lt;references&gt;</code> билдәһенең <code>&lt;ref&gt;</code> билдәһендә иÑем атрибуты ÑŽÒ¡.',
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code> билдәһенең "$1" иÑемле <code>&lt;ref&gt;</code> билдәһенең ÑÑтәлеге ÑŽÒ¡.',
+);
+
+/** Southern Balochi (بلوچی مکرانی)
+ * @author Mostafadaneshvar
+ */
+$messages['bcc'] = array(
+ 'cite-desc' => 'اضÙاÙÙ‡ کنت<nowiki><ref[ name=id]></nowiki> Ùˆ <nowiki><references/></nowiki> تگ, په ارجاع دهگ',
+ 'cite_croak' => 'ذکر منبع چه بن رپت; $1: $2',
+ 'cite_error_key_str_invalid' => 'حطا درونی ;
+نامعتبرین $str و/یا $key.
+شی نباید هچ وهد پیش کیت',
+ 'cite_error_stack_invalid_input' => 'درونی حطا;
+نامعتربین دسته کلیت.
+شی نبایدن هچ وهد پیش کیت.',
+ 'cite_error' => 'حطا ارجاع: $1',
+ 'cite_error_ref_numeric_key' => 'نامعتبر <code>&lt;ref&gt;</code>تگ;
+نام یک سادگین هوری نه نه بیت. یک توضیحی عنوانی استÙاده کنیت',
+ 'cite_error_ref_no_key' => 'نامعتبر<code>&lt;ref&gt;</code>تگ;
+مراجع بی محتوا بایدن نامی داشته بنت',
+ 'cite_error_ref_too_many_keys' => 'نامعتبر<code>&lt;ref&gt;</code>تگ;
+نامعتبر نامان, په داب بازین',
+ 'cite_error_ref_no_input' => 'نامعتبر <code>&lt;ref&gt;</code> تگ;
+مراجع بی نام بایدن محتوا داشته بنت',
+ 'cite_error_references_invalid_parameters' => 'نامعتبر <code>&lt;references&gt;</code>تگ;
+هچ پارامتری مجاز نهنت.
+استÙاده Ú©Ù† Ú†Ù‡ <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'نامعتبر <code>&lt;references&gt;</code>تگ;
+پارامتر "گروه" Ùقط مجازنت.
+استÙاده Ú©Ù† Ú†Ù‡ <code>&lt;references /&gt;</code>, یا <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'هلگ برجسپان لینک عقب رسمی.
+گیشتر تعری٠کن ته <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> کوله',
+ 'cite_error_references_no_text' => 'نامعتبر<code>&lt;ref&gt;</code>تگ;
+په نام ارجاع هچ متنی دهگ نه بیته <code>$1</code>',
+ 'cite_reference_link_prefix' => 'هل_مرج-',
+ 'cite_references_link_prefix' => 'ذکرـیادداشت-',
+ 'cite_references_link_many_format_backlink_labels' => 'ا ب پ ت ج چ خ د ر ز س ش غ ٠ک ل م ن و ه ی', # Fuzzy
+ 'cite_references_link_many_sep' => 'س',
+ 'cite_references_link_many_and' => 'Ùˆ',
+);
+
+/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
+ * @author EugeneZelenko
+ * @author Jim-by
+ * @author Red Winged Duck
+ */
+$messages['be-tarask'] = array(
+ 'cite-desc' => 'Дадае Ñ‚Ñгі <nowiki><ref[ name=id]></nowiki> Ñ– <nowiki><references/></nowiki> Ð´Ð»Ñ Ð·Ð½Ð¾Ñак',
+ 'cite_croak' => 'ÐÑўдалае цытаваньне; $1: $2',
+ 'cite_error_key_str_invalid' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°;
+нÑÑлушны $str Ñ–/ці $key.
+ГÑтага ніколі не павінна быць.',
+ 'cite_error_stack_invalid_input' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°;
+нÑÑлушны ключ ÑÑ‚Ñку.
+ГÑтага ніколі не павінна быць.',
+ 'cite_error' => 'Памылка цытаваньнÑ: $1',
+ 'cite_error_ref_numeric_key' => 'ÐÑÑлушны Ñ‚Ñг <code>&lt;ref&gt;</code>;
+назва Ð½Ñ Ð¼Ð¾Ð¶Ð° быць проÑта лікам, ужывайце апіÑальную назву',
+ 'cite_error_ref_no_key' => 'ÐÑÑлушны Ñ‚Ñг <code>&lt;ref&gt;</code>;
+пуÑÑ‚Ñ‹Ñ Ñ‚Ñгі <code>ref</code> муÑÑць мець назву',
+ 'cite_error_ref_too_many_keys' => 'ÐÑÑлушны Ñ‚Ñг <code>&lt;ref&gt;</code>;
+нÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ð½Ð°Ð·Ð²Ñ‹, ці Ñ–Ñ… было зашмат',
+ 'cite_error_ref_no_input' => 'ÐÑÑлушны Ñ‚Ñг <code>&lt;ref&gt;</code>;
+крыніцы бÑз назваў муÑÑць мець зьмеÑÑ‚',
+ 'cite_error_references_invalid_parameters' => 'ÐÑÑлушны Ñ‚Ñг <code>&lt;references&gt;</code>;
+Ð½ÐµÐ´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ð¼Ñтры.
+КарыÑтайцеÑÑ <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'ÐÑÑлушны Ñ‚Ñг <code>&lt;references&gt;</code>;
+дазволена карыÑтацца толькі парамÑтрам «group».
+КарыÑтайцеÑÑ <code>&lt;references /&gt;</code>, ці <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Ðе хапае ÑымбалÑÑž Ð´Ð»Ñ Ð°Ð´Ð²Ð°Ñ€Ð¾Ñ‚Ð½Ñ‹Ñ… ÑпаÑылак.
+Ðеабходна пашырыць ÑÑ‹ÑÑ‚Ñмнае паведамленьне <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'СкончыліÑÑ Ð½ÐµÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ñ‹Ñ Ð¼ÐµÑ‚ÐºÑ– ÑпаÑылак Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ñ‹ «$1».
+Вызначыце болей у паведамленьні <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'ÐÑÑлушны Ñ‚Ñг <code>&lt;ref&gt;</code>;
+нÑма Ñ‚ÑкÑту Ñž назьве зноÑак <code>$1</code>',
+ 'cite_error_included_ref' => 'ÐÑма закрываючага Ñ‚Ñга <code>&lt;/ref&gt;</code> паÑÑŒÐ»Ñ Ð°Ð´ÐºÑ€Ñ‹Ñ‚Ð°Ð³Ð° Ñ‚Ñга <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'ТÑг <code>&lt;ref&gt;</code> Ñ–Ñнуе, але Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð° Ñ‚Ñга <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'ТÑг <code>&lt;ref&gt;</code> Ñ–Ñнуе Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ñ‹ «$1», але адпаведнага Ñ‚Ñга <code>&lt;references group="$1"/&gt;</code> Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð°',
+ 'cite_error_references_group_mismatch' => 'ТÑг <code>&lt;ref&gt;</code> у <code>&lt;references&gt;</code> утрымлівае канфліктуючы атрыбут групы «$1».',
+ 'cite_error_references_missing_group' => 'ТÑг <code>&lt;ref&gt;</code> вызначаны Ñž <code>&lt;references&gt;</code> утрымлівае атрыбут групы «$1», Ñкі раней не выкарыÑтоўваўÑÑ Ñž Ñ‚ÑкÑьце.',
+ 'cite_error_references_missing_key' => 'ТÑг <code>&lt;ref&gt;</code> з назвай «$1» вызначаны Ñž <code>&lt;references&gt;</code> не выкарыÑтоўваўÑÑ Ñž папÑÑ€Ñднім Ñ‚ÑкÑьце.',
+ 'cite_error_references_no_key' => 'ТÑг <code>&lt;ref&gt;</code> вызначаны Ñž <code>&lt;references&gt;</code> Ð½Ñ Ð¼Ð°Ðµ атрыбуту назвы.',
+ 'cite_error_empty_references_define' => 'ТÑг <code>&lt;ref&gt;</code> вызначаны Ñž <code>&lt;references&gt;</code> з назвай «$1» Ð½Ñ Ð¼Ð°Ðµ зьмеÑту.',
+);
+
+/** Bulgarian (българÑки)
+ * @author Borislav
+ * @author DCLXVI
+ * @author Spiritia
+ */
+$messages['bg'] = array(
+ 'cite-desc' => 'Ð”Ð¾Ð±Ð°Ð²Ñ ÐµÑ‚Ð¸ÐºÐµÑ‚Ð¸Ñ‚Ðµ <nowiki><ref[ name=id]></nowiki> и <nowiki><references/></nowiki>, подходÑщи за цитиране',
+ 'cite_croak' => 'Цитиращата ÑиÑтема Ñе Ñрути; $1: $2',
+ 'cite_error_key_str_invalid' => 'Вътрешна грешка: невалиден параметър $str и/или $key. Това не би Ñ‚Ñ€Ñбвало да Ñе Ñлучва никога.',
+ 'cite_error_stack_invalid_input' => "'''Вътрешна грешка:''' невалиден ключ на Ñтека. Това не би Ñ‚Ñ€Ñбвало да Ñе Ñлучва никога.",
+ 'cite_error' => 'Грешка при цитиране: $1',
+ 'cite_error_ref_numeric_key' => "'''Грешка в етикет <code>&lt;ref&gt;</code>:''' името не може да бъде чиÑло, използва Ñе опиÑателно име",
+ 'cite_error_ref_no_key' => "'''Грешка в етикет <code>&lt;ref&gt;</code>:''' етикетите без Ñъдържание Ñ‚Ñ€Ñбва да имат име",
+ 'cite_error_ref_too_many_keys' => "'''Грешка в етикет <code>&lt;ref&gt;</code>:''' грешка в името, например повече от едно име на етикета",
+ 'cite_error_ref_no_input' => "'''Грешка в етикет <code>&lt;ref&gt;</code>:''' етикетите без име Ñ‚Ñ€Ñбва да имат Ñъдържание",
+ 'cite_error_references_invalid_parameters' => "'''Грешка в етикет <code>&lt;references&gt;</code>:''' използва Ñе без параметри, така: <code>&lt;references /&gt;</code>",
+ 'cite_error_references_invalid_parameters_group' => 'Ðевалиден етикет <code>&lt;references&gt;</code>;
+позволен е Ñамо параметър "group".
+Използвайте <code>&lt;references /&gt;</code> или <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Изчерпани Ñа Ñпециалните етикети за обратна референциÑ.
+Още етикети могат да Ñе дефинират в ÑиÑтемното Ñъобщение <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
+ 'cite_error_references_no_text' => "'''Грешка в етикет <code>&lt;ref&gt;</code>:''' не е подаден текÑÑ‚ за бележките на име <code>$1</code>",
+ 'cite_error_included_ref' => 'ЛипÑва затварÑщ етикет <code>&lt;/ref&gt;</code> Ñлед отварÑÑ‰Ð¸Ñ ÐµÑ‚Ð¸ÐºÐµÑ‚ <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'ПриÑÑŠÑтват етикети <code>&lt;ref&gt;</code>; липÑва етикет <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'ПриÑÑŠÑтват етикети <code>&lt;ref&gt;</code> за групата "$1"; но липÑва ÑъответниÑÑ‚ етикет <code>&lt;references group="$1"/&gt;</code>',
+);
+
+/** Bengali (বাংলা)
+ * @author Bellayet
+ * @author Nasir8891
+ * @author Zaheen
+ */
+$messages['bn'] = array(
+ 'cite-desc' => 'উদà§à¦§à§ƒà¦¤à¦¿à¦° জনà§à¦¯ <nowiki><ref[ name=id]></nowiki> à¦à¦¬à¦‚ <nowiki><references/></nowiki> টà§à¦¯à¦¾à¦—সমূহ যোগ করà§à¦¨',
+ 'cite_croak' => 'উদà§à¦§à§ƒà¦¤à¦¿ কà§à¦°à§‹à¦• করা হয়েছে; $1: $2',
+ 'cite_error_key_str_invalid' => 'আভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦¨ তà§à¦°à§à¦Ÿà¦¿; অবৈধ $str à¦à¦¬à¦‚/অথবা $key। à¦à¦Ÿà¦¾ কখনই ঘটা উচিত নয়।',
+ 'cite_error_stack_invalid_input' => 'আভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦¨ তà§à¦°à§à¦Ÿà¦¿; অবৈধ সà§à¦Ÿà§à¦¯à¦¾à¦• কি। à¦à¦Ÿà¦¾ কখনই ঘটা উচিত নয়।',
+ 'cite_error' => 'উদà§à¦§à§ƒà¦¤à¦¿ তà§à¦°à§à¦Ÿà¦¿: $1',
+ 'cite_error_ref_numeric_key' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; নাম কোন সরল পূরà§à¦£à¦¸à¦‚খà§à¦¯à¦¾ হতে পারবেনা, à¦à¦•à¦Ÿà¦¿ বিবরণমূলক শিরোনাম বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨',
+ 'cite_error_ref_no_key' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; বিষয়বসà§à¦¤à§à¦¹à§€à¦¨ refসমূহের অবশà§à¦¯à¦‡ নাম থাকতে হবে',
+ 'cite_error_ref_too_many_keys' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; অবৈধ নাম (যেমন- সংখà§à¦¯à¦¾à¦¤à¦¿à¦°à¦¿à¦•à§à¦¤)',
+ 'cite_error_ref_no_input' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; নামবিহীন refসমূহের অবশà§à¦¯à¦‡ বিষয়বসà§à¦¤à§ থাকতে হবে',
+ 'cite_error_references_invalid_parameters' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; কোন পà§à¦¯à¦¾à¦°à¦¾à¦®à¦¿à¦Ÿà¦¾à¦° অনà§à¦®à§‹à¦¦à¦¿à¦¤ নয়, <code>&lt;references /&gt;</code> বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨',
+ 'cite_error_references_invalid_parameters_group' => 'তà§à¦°à§à¦Ÿà¦¿à¦ªà§‚রà§à¦£ <code>&lt;references&gt;</code> টà§à¦¯à¦¾à¦—;
+কেবলমাতà§à¦° "group" পà§à¦¯à¦¾à¦°à¦¾à¦®à¦¿à¦Ÿà¦¾à¦° বà§à¦¯à¦¬à¦¹à¦¾à¦° কর যাবে।
+<code>&lt;references /&gt;</code>, অথবা <code>&lt;references group="..." /&gt;</code> বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨',
+ 'cite_error_references_no_backlink_label' => 'পছনà§à¦¦à¦®à¦¾à¦«à¦¿à¦• বà§à¦¯à¦¾à¦•à¦²à¦¿à¦‚ক লেবেলের সংখà§à¦¯à¦¾ ফà§à¦°à¦¿à¦¯à¦¼à§‡ গেছে।
+<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> বারà§à¦¤à¦¾à¦¯à¦¼ আরও সংজà§à¦žà¦¾à¦¯à¦¼à¦¿à¦¤ করà§à¦¨',
+ 'cite_error_no_link_label_group' => 'গà§à¦°à§à¦ª "$1" à¦à¦° জনà§à¦¯ কাসà§à¦Ÿà¦® লিংক বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° সীমানা পেরিয়েছে।
+<nowiki>[[MediaWiki:$2]]</nowiki> বারà§à¦¤à¦¾à¦¯à¦¼ আরও সজà§à¦žà¦¾à¦¯à¦¼à¦¿à¦¤ করà§à¦¨à¥¤',
+ 'cite_error_references_no_text' => 'অবৈধ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—; <code>$1</code> নামের refগà§à¦²à¦¿à¦° জনà§à¦¯ কোন টেকà§à¦¸à¦Ÿ পà§à¦°à¦¦à¦¾à¦¨ করা হয়নি',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦—ের কà§à¦·à§‡à¦¤à§à¦°à§‡ <code>&lt;/ref&gt;</code> টà§à¦¯à¦¾à¦— যোগ করা হয়নি',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦— রয়েছে, কিনà§à¦¤à§ কোনো <code>&lt;references/&gt;</code> টà§à¦¯à¦¾à¦— নেই',
+ 'cite_error_group_refs_without_references' => '"$1" নামের গà§à¦°à§à¦ªà§‡à¦° <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦— রয়েছে, কিনà§à¦¤à§ à¦à¦° জনà§à¦¯ <code>&lt;references group="$1"/&gt;</code> টà§à¦¯à¦¾à¦— দেয়া হয়নি',
+ 'cite_error_references_group_mismatch' => '"$1" গà§à¦°à§à¦ªà§‡à¦° কà§à¦·à§‡à¦¤à§à¦°à§‡ <code>&lt;ref&gt;</code> টà§à¦¯à¦¾à¦— <code>&lt;references&gt;</code> টà§à¦¯à¦¾à¦—ের অংশে বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡ সমসà§à¦¯à¦¾ সৃষà§à¦Ÿà¦¿ হয়েছে।',
+);
+
+/** Breton (brezhoneg)
+ * @author Fulup
+ */
+$messages['br'] = array(
+ 'cite-desc' => 'Ouzhpennañ a ra ar balizennoù <nowiki><ref[ name=id]></nowiki> ha <nowiki><references/></nowiki>, evit an arroudoù.',
+ 'cite_croak' => 'Arroud breinet ; $1 : $2',
+ 'cite_error_key_str_invalid' => 'Fazi diabarzh ;
+$str ha/pe key$ direizh.
+Ne zlefe ket c\'hoarvezout gwezh ebet.',
+ 'cite_error_stack_invalid_input' => "Fazi diabarzh ;
+alc'hwez pil direizh.
+Ne zlefe ket c'hoarvezout gwezh ebet.",
+ 'cite_error' => 'Fazi arroud : $1',
+ 'cite_error_ref_numeric_key' => "Fazi implijout ar valizenn <code>&lt;ref&gt;</code> ;
+n'hall ket an anv bezañ un niver anterin. Grit gant un titl deskrivus",
+ 'cite_error_ref_no_key' => "Fazi implijout ar valizenn <code>&lt;ref&gt;</code> ;
+ret eo d'an daveennoù goullo kaout un anv",
+ 'cite_error_ref_too_many_keys' => 'Fazi implijout ar valizenn <code>&lt;ref&gt;</code> ;
+anv direizh, niver re uhel da skouer',
+ 'cite_error_ref_no_input' => "Fazi implijout ar valizenn <code>&lt;ref&gt;</code> ;
+ret eo d'an daveennoù hep anv bezañ danvez enno",
+ 'cite_error_references_invalid_parameters' => "Fazi implijout ar valizenn <code>&lt;ref&gt;</code> ;
+n'eo aotreet arventenn ebet.
+Grit gant ar valizenn <code>&lt;references /&gt;</code>",
+ 'cite_error_references_invalid_parameters_group' => 'Fazi implijout ar valizenn <code>&lt;ref&gt;</code> ;
+n\'eus nemet an arventenn "strollad" zo aotreet.
+Grit gant ar valizenn <code>&lt;references /&gt;</code>, pe <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => "N'eus ket a dikedennoù personelaet mui.
+Spisait un niver brasoc'h anezho er gemennadenn <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>",
+ 'cite_error_no_link_label_group' => 'Tikedenn liamm bersonelaet ebet ken evit ar strollad "$1".
+Termenit re all e kemennadenn <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Balizenn <code>&lt;ref&gt;</code> direizh ;
+ne oa bet lakaet tamm testenn ebet evit ar valizenn <code>$1</code>',
+ 'cite_error_included_ref' => 'Kod digeriñ <code>&lt;/ref&gt;</code> hep kod serriñ <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => "<code>&lt;ref&gt;</code> balizennoù zo, met n'eus bet kavet balizenn <code>&lt;references/&gt;</code> ebet",
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> balizennoù zo evit ur strollad anvet "$1", met n\'eus bet kavet balizenn <code>&lt;references group="$1"/&gt;</code> ebet o klotañ',
+ 'cite_error_references_group_mismatch' => 'Gant ar valizenn <code>&lt;ref&gt;</code> e <code>&lt;references&gt;</code> emañ an dezverk strollad trubuilhus "$1".',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> ar valizenn termenet e <code>&lt;references&gt;</code> eo dezhi un dezverk strollad "$1" na gaver ket en destenn a-raok.',
+ 'cite_error_references_missing_key' => 'N\'eo ket bet implijet en destenn gent ar <code>&lt;ref&gt;</code> valizenn hec\'h anv "$1" termenet e <code>&lt;references&gt;</code>.',
+ 'cite_error_references_no_key' => "<code>&lt;ref&gt;</code> ar valizenn termenet e <code>&lt;references&gt;</code> n'he deus dezverk anv ebet.",
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> ar valiezenn termenet e <code>&lt;references&gt;</code> dezhi an anv a "$1" zo goullo.',
+);
+
+/** Bosnian (bosanski)
+ * @author CERminator
+ * @author Reedy
+ */
+$messages['bs'] = array(
+ 'cite-desc' => 'Dodaje oznake <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki> za citiranje',
+ 'cite_croak' => 'Citiranje neuspješno; $1: $2',
+ 'cite_error_key_str_invalid' => 'Unutrašnja greška;
+nevaljan $str i/ili $key.
+Ovo se ne bi trebalo dešavati.',
+ 'cite_error_stack_invalid_input' => 'Unutrašnja greška;
+nepoznat "stack" kljuÄ.
+Ovo se ne bi smjelo događati.',
+ 'cite_error' => 'Greška kod citiranja: $1',
+ 'cite_error_ref_numeric_key' => 'Nevaljana oznaka <code>&lt;ref&gt;</code>;
+naslov ne može biti jednostavni cijeli broj. Koristite opisni naslov',
+ 'cite_error_ref_no_key' => 'Nevaljana oznaka <code>&lt;ref&gt;</code>;
+reference bez sadržaja moraju imati naziv',
+ 'cite_error_ref_too_many_keys' => 'Nevaljana oznaka <code>&lt;ref&gt;</code>;
+nevaljani nazivi, npr. možda ih je previše',
+ 'cite_error_ref_no_input' => 'Nevaljana oznaka <code>&lt;ref&gt;</code>;
+reference bez naziva moraju imati sadržaj',
+ 'cite_error_references_invalid_parameters' => 'Nevaljana oznaka <code>&lt;references&gt;</code>;
+nisu dozvoljeni parametri.
+Koristite <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Nevaljana oznaka <code>&lt;references&gt;</code>
+dozvoljen je samo parametar "group".
+Koristite <code>&lt;references /&gt;</code> ili <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Ponestalo je prilagođenih naslova backlinkova.
+Definirajte ih još u <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> poruci',
+ 'cite_error_no_link_label_group' => 'Nedovoljan broj proizvoljnih naslova linkova za grupu "$1".
+Definišite više putem poruke <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Nevaljana oznaka <code>&lt;ref&gt;</code>;
+nije naveden tekst za reference sa imenom <code>$1</code>',
+ 'cite_error_included_ref' => 'Nedostaje oznaka za zatvaranje <code>&lt;/ref&gt;</code> nakon <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> oznake postoje, ali oznaka <code>&lt;references/&gt;</code> nije pronađena',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> oznake postoje za grupu pod imenom "$1", ali nije pronađena pripadajuća oznaka <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> oznaka u <code>&lt;references&gt;</code> ima atribut grupe konflikta "$1".',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> oznaka definisana u <code>&lt;references&gt;</code> ima atribut grupe "$1" koji se ne pojavljuje u ranijem tekstu.',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> oznaka sa imenom "$1" definisana u <code>&lt;references&gt;</code> nije korištena u ranijem tekstu.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> oznaka definisana u <code>&lt;references&gt;</code> nema imenski atribut.',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> oznaka definisana u <code>&lt;references&gt;</code> sa imenom "$1" nema nikakvog sadržaja.',
+);
+
+/** Catalan (català)
+ * @author Davidpar
+ * @author Jordi Roqué
+ * @author SMP
+ * @author Vriullop
+ */
+$messages['ca'] = array(
+ 'cite-desc' => 'Afegeix les etiquetes <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki>, per a cites',
+ 'cite_croak' => 'Cita corrompuda; $1: $2',
+ 'cite_error_key_str_invalid' => 'Error intern;
+els valors $str i/o $key no valen.
+Aquesta situació no s\'hauria de donar mai.',
+ 'cite_error_stack_invalid_input' => "Error intern;
+el valor d'emmagatzematge no és vàlid.
+Aquesta situació no s'hauria de donar mai.",
+ 'cite_error' => 'Error de citació: $1',
+ 'cite_error_ref_numeric_key' => 'Etiqueta <code>&lt;ref&gt;</code> no vàlida;
+el nom no pot ser un nombre. Empreu una paraula o un títol descriptiu',
+ 'cite_error_ref_no_key' => 'Etiqueta <code>&lt;ref&gt;</code> no vàlida;
+les refs sense contingut han de tenir nom',
+ 'cite_error_ref_too_many_keys' => 'Etiqueta <code>&lt;ref&gt;</code> no vàlida;
+empreu l\'estructura <code>&lt;ref name="Nom"&gt;</code>',
+ 'cite_error_ref_no_input' => 'Etiqueta <code>&lt;ref&gt;</code> no vàlida;
+les referències sense nom han de tenir contingut',
+ 'cite_error_references_invalid_parameters' => 'Etiqueta <code>&lt;references&gt;</code> no vàlida;
+no es permeten paràmetres.
+Useu <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Etiqueta <code>&lt;references&gt;</code> no vàlida;
+únicament es permet el paràmetre "group".
+Useu <code>&lt;references /&gt;</code>, o <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => "Hi ha massa etiquetes personalitzades.
+Se'n poden definir més a <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>",
+ 'cite_error_no_link_label_group' => 'No hi ha etiquetes vincle personalitzat per al grup "$1".
+Defineix més al missatge <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => "Etiqueta <code>&lt;ref&gt;</code> no vàlida;
+no s'ha proporcionat text per les refs amb l'etiqueta <code>$1</code>",
+ 'cite_error_included_ref' => 'Es tanca el <code>&lt;/ref&gt;</code> que manca per una etiqueta <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Hi ha etiquetes <code>&lt;ref&gt;</code> però no cap etiqueta <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Existeixen etiquetes <code>&lt;ref&gt;</code> pel grup «$1» però no l\'etiqueta <code>&lt;references group="$1"/&gt;</code> corresponent',
+ 'cite_error_references_group_mismatch' => 'L\'etiqueta <code>&lt;ref&gt;</code> a <code>&lt;references&gt;</code> té un conflicte amb l\'atribut de grup "$1".',
+ 'cite_error_references_missing_group' => 'L\'etiqueta <code>&lt;ref&gt;</code> definida a <code>&lt;references&gt;</code> té l\'atribut de grup "$1" que no apareix en el text anterior.',
+ 'cite_error_references_missing_key' => 'L\'etiqueta <code>&lt;ref&gt;</code> amb el nom "$1" definida a <code>&lt;references&gt;</code> no s\'utilitza en el text anterior.',
+ 'cite_error_references_no_key' => "L'etiqueta <code>&lt;ref&gt;</code> definida a <code>&lt;references&gt;</code> no té cap atribut de nom.",
+ 'cite_error_empty_references_define' => 'L\'etiqueta <code>&lt;ref&gt;</code> definida a <code>&lt;references&gt;</code> amb el nom "$1" no té contingut.',
+);
+
+/** Czech (Äesky)
+ * @author Danny B.
+ * @author Li-sung
+ * @author Matěj Grabovský
+ * @author Mormegil
+ * @author Sp5uhe
+ */
+$messages['cs'] = array(
+ 'cite-desc' => 'PÅ™idává znaÄky <nowiki><ref[ name="id"]></nowiki> a&nbsp;<nowiki><references /></nowiki> na oznaÄení citací',
+ 'cite_croak' => 'NefunkÄní citace; $1: $2',
+ 'cite_error_key_str_invalid' => 'Vnitřní chyba; neplatný $str nebo $key. Toto by nikdy nemělo nastat.',
+ 'cite_error_stack_invalid_input' => 'VnitÅ™ní chyba; neplatný klÃ­Ä zásobníku',
+ 'cite_error' => 'Chybná citace $1',
+ 'cite_error_ref_numeric_key' => 'Chyba v tagu <code>&lt;ref&gt;</code>; názvem nesmí být prosté Äíslo, použijte popisné oznaÄení',
+ 'cite_error_ref_no_key' => 'Chyba v tagu <code>&lt;ref&gt;</code>; prázdné citace musí obsahovat název',
+ 'cite_error_ref_too_many_keys' => 'Chyba v tagu <code>&lt;ref&gt;</code>; chybné názvy, např. je jich příliš mnoho',
+ 'cite_error_ref_no_input' => 'Chyba v tagu <code>&lt;ref&gt;</code>; citace bez názvu musí mít vlastní obsah',
+ 'cite_error_references_invalid_parameters' => 'Chyba v tagu <code>&lt;references&gt;</code>; zde není dovolen parametr, použijte <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Neplatná znaÄka <tt>&lt;references&gt;</tt>;
+je povolen pouze parametr „group“.
+Použijte <tt>&lt;references /&gt;</tt> nebo <tt>&lt;references group="..." /&gt;</tt>.',
+ 'cite_error_references_no_backlink_label' => 'DoÅ¡la oznaÄení zpÄ›tných odkazů, pÅ™idejte jich nÄ›kolik do zprávy <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'DoÅ¡ly definované znaÄky pro skupinu „$1“.
+ZvyÅ¡te jejich poÄet ve zprávÄ› <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Chyba v tagu <code>&lt;ref&gt;</code>; citaci oznaÄené <code>$1</code> není urÄen žádný text',
+ 'cite_error_included_ref' => 'Chybí ukonÄovací <code>&lt;/ref&gt;</code> k&nbsp;tagu <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Nalezena znaÄka <code>&lt;ref&gt;</code> bez přísluÅ¡né znaÄky <code>&lt;references/&gt;</code>.',
+ 'cite_error_group_refs_without_references' => 'Nalezena znaÄka <code>&lt;ref&gt;</code> pro skupinu „$1“ bez přísluÅ¡né znaÄky <code>&lt;references group="$1"/&gt;</code>.',
+ 'cite_error_references_group_mismatch' => 'ZnaÄka <code>&lt;ref&gt;</code> uvnitÅ™ <code>&lt;references&gt;</code> má definovánu jinou skupinu „$1“.',
+ 'cite_error_references_missing_group' => 'ZnaÄka <code>&lt;ref&gt;</code> uvnitÅ™ <code>&lt;references&gt;</code> používá skupinu „$1“, která se v pÅ™edchozím textu neobjevuje.',
+ 'cite_error_references_missing_key' => 'Na <code>&lt;ref&gt;</code> se jménem „$1“ definovaný uvnitř <code>&lt;references&gt;</code> nejsou v předchozím textu žádné odkazy.',
+ 'cite_error_references_no_key' => 'U znaÄky <code>&lt;ref&gt;</code> definované uvnitÅ™ <code>&lt;references&gt;</code> chybí atribut <code>name</code>.',
+ 'cite_error_empty_references_define' => 'U znaÄky <code>&lt;ref&gt;</code> s názvem „$1“ definované uvnitÅ™ <code>&lt;references&gt;</code> chybí obsah.',
+);
+
+/** Church Slavic (ÑловѣÌньÑкъ / ⰔⰎⰑⰂⰡâ°â° â°”â°â°Ÿ)
+ * @author ОйЛ
+ */
+$messages['cu'] = array(
+ 'cite_references_link_many_format_backlink_labels' => 'а б в г д Ñ” ж ꙃ ê™ Ð¸ Ñ– к л м н о п Ñ€ Ñ Ñ‚ Ñ„ Ñ… Ñ¡ ц ч ш щ ÑŠ ꙑ ÑŒ Ñ£ ÑŽ ê™— Ñ¥ ѧ Ñ« Ñ© Ñ­ ѯ ѱ ѳ ѵ Ñ· аа аб ав аг ад ає аж Ð°ê™ Ð°ê™ƒ аи аі ак ал ам ан ао ап ар Ð°Ñ Ð°Ñ‚ аф ах аѡ ац ач аш ащ аъ аꙑ аь аѣ аю аꙗ аѥ аѧ аѫ аѩ аѭ аѯ аѱ аѳ аѵ аѷ',
+);
+
+/** Welsh (Cymraeg)
+ * @author Lloffiwr
+ * @author Xxglennxx
+ */
+$messages['cy'] = array(
+ 'cite-desc' => 'Yn ychwanegu tagiau <nowiki><ref[ name=id]></nowiki> a <nowiki><references/></nowiki>, ar gyfer cyfeiriadau',
+ 'cite_croak' => 'Cyfeirio at farwolaeth; $1: $2',
+ 'cite_error_key_str_invalid' => 'Gwall mewnol;
+$str a/neu $key annilys.
+Ni ddylai hyn fyth ddigwydd.',
+ 'cite_error_stack_invalid_input' => 'Gwall mewnol;
+Allwedd pentwr annilys.
+Ni ddylai hyn fyth ddigwydd.',
+ 'cite_error' => 'Gwall cyfeirio: $1',
+ 'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> annilys;
+ni all enw fod yn rif yn unig. Defnyddiwch deitl disgrifiadol.',
+ 'cite_error_ref_no_key' => 'Tag <code>&lt;ref&gt;</code> annilys;
+rhaid i dagiau ref sydd heb gynnwys iddynt gael enw',
+ 'cite_error_ref_too_many_keys' => 'Tag <code>&lt;ref&gt;</code> annilys;
+enwau annilys; e.e. gormod ohonynt',
+ 'cite_error_ref_no_input' => 'Tag <code>&lt;ref&gt;</code> annilys;
+rhaid i dagiau ref heb enw iddynt gynnwys rhywbeth',
+ 'cite_error_references_invalid_parameters' => 'Tag <code>&lt;references&gt;</code> annilys;
+ni chaniateir paramedrau.
+Defnyddiwch <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Tag <code>&lt;references&gt;</code> annilys;
+dim ond y paramedr "group" a ganiateir.
+Defnyddiwch <code>&lt;references /&gt;</code>, neu <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Dim rhagor o labeli ôl-gyswllt ar gael.
+Diffiniwch ragor ohonynt yn y neges <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Wedi rhedeg allan o labeli dolenni unigryw ar gyfer y grŵp "$1".
+Gallwch ddiffinio rhagor ohonynt yn y neges <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => "Tag <code>&lt;ref&gt;</code> annilys;
+ni osodwyd unrhyw destun ar gyfer y 'ref' <code>$1</code>",
+ 'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> clo yn eisiau ar gyfer y tag <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Mae tagiau <code>&lt;ref&gt;</code> yn bresennol, ond dim tag <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Mae tagiau <code>&lt;ref&gt;</code> yn bresennol ar gyfer y grwp "$1", ond ni chafwyd tag <code>&lt;references/&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'Mae gan y tag <code>&lt;ref&gt;</code> oddi mewn i <code>&lt;references&gt;</code> briodoledd grŵp anghyson "$1".',
+ 'cite_error_references_missing_group' => 'Mae gan y tag <code>&lt;ref&gt;</code> a ddiffinir yn <code>&lt;references&gt;</code> briodoledd grŵp "$1" nag ydyw\'n cael ei ddefnyddio yn y testun cynt.',
+ 'cite_error_references_missing_key' => 'Ni ddefnyddir y tag <code>&lt;ref&gt;</code> o\'r enw "$1", a ddiffinir yn <code>&lt;references&gt;</code>, yn y testun blaenorol.',
+ 'cite_error_references_no_key' => 'Nid oes dim priodoledd o enw gan y tag <code>&lt;ref&gt;</code> a ddiffinir yn <code>&lt;references&gt;</code>',
+ 'cite_error_empty_references_define' => 'Does dim byd yn y tag <code>&lt;ref&gt;</code> a\'r enw "$1" arno, sydd wedi ei ddiffinio oddi mewn i dagiau <code>&lt;references&gt;</code>.',
+);
+
+/** Danish (dansk)
+ * @author Byrial
+ * @author Emilkris33
+ * @author Morten LJ
+ * @author Peter Alberti
+ */
+$messages['da'] = array(
+ 'cite-desc' => 'Tilføjer <nowiki><ref[ name=id]></nowiki> og <nowiki><references/></nowiki>-elementer til referencer.',
+ 'cite_croak' => 'Fejl i fodnotesystemet; $1: $2',
+ 'cite_error_key_str_invalid' => 'Intern fejl: Ugyldig $str og/eller $key. Dette burde aldrig forekomme.',
+ 'cite_error_stack_invalid_input' => 'Intern fejl: Ugyldig staknøgle. Dette burde aldrig forekomme.',
+ 'cite_error' => 'Fodnotefejl: $1',
+ 'cite_error_ref_numeric_key' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag; "name" kan ikke være et simpelt heltal, brug en beskrivende titel',
+ 'cite_error_ref_no_key' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Et <code>&lt;ref&gt;</code>-tag uden indhold skal have et navn',
+ 'cite_error_ref_too_many_keys' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Ugyldige navne, fx for mange',
+ 'cite_error_ref_no_input' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Et <code>&lt;ref&gt;</code>-tag uden navn skal have indhold',
+ 'cite_error_references_invalid_parameters' => 'Ugyldigt <code>&lt;references&gt;</code>-tag: Parametre er ikke tilladt, brug i stedet <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Ugyldigt <code>&lt;references&gt;</code>-tag; den eneste tilladte parameter er "group".
+Brug <code>&lt;references /&gt;</code> eller <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Løb tør for backlink-etiketter.
+Definer flere i beskeden <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
+ 'cite_error_no_link_label_group' => 'Løb tør for tilpassede linketiketter til gruppen "$1".
+Definer flere i beskeden <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Der er ikke specificeret nogen fodnotetekst til navnet <code>$1</code>',
+ 'cite_error_included_ref' => 'Afsluttende <code>&lt;/ref&gt;</code> mangler for <code>&lt;ref&gt;</code>-tag',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-tags findes, men ingen <code>&lt;references/&gt;</code>-tag blev fundet',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-tags eksisterer for en gruppe betegnet "$1", men der blev ikke fundet et tilsvarende <code>&lt;references group="$1"/&gt;</code>-tag',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code>-tag inden i <code>&lt;references&gt;</code> har modstridende gruppe-attribut "$1".',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code>-tag defineret inden i <code>&lt;references&gt;</code> har gruppe-attributten "$1", som ikke anvendes i den ovenstående tekst.',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code>-tag med navn "$1" defineret inden i <code>&lt;references&gt;</code> anvendes ikke i den ovenstående tekst.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code>-tag defineret inden i <code>&lt;references&gt;</code> har ikke en navne-attribut.',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code>-tag defineret inden i <code>&lt;references&gt;</code> med navnet "$1" har ikke noget indhold.',
+);
+
+/** German (Deutsch)
+ * @author Kghbln
+ * @author Metalhead64
+ * @author Raimond Spekking
+ * @author The Evil IP address
+ * @author Umherirrender
+ */
+$messages['de'] = array(
+ 'cite-desc' => 'Ergänzt die Tags <code><nowiki><ref[&nbsp;name=id]></nowiki></code> und <code><nowiki><references&nbsp;/></nowiki></code> für die Referenzierung von Wikiseiten',
+ 'cite_croak' => 'Fehler im Referenzsystem. $1: $2',
+ 'cite_error_key_str_invalid' => 'Interner Fehler: ungültiger $str und/oder $key. Dies sollte nicht passieren.',
+ 'cite_error_stack_invalid_input' => 'Interner Fehler: ungültiger Schlüssel für den Stack. Dies sollte nicht passieren.',
+ 'cite_error' => 'Referenzfehler: $1',
+ 'cite_error_ref_numeric_key' => 'Ungültige Verwendung von <code>&lt;ref&gt;</code>: Der Parameter „name“ darf kein reiner Zahlenwert sein. Benutze einen beschreibenden Namen.',
+ 'cite_error_ref_no_key' => 'Ungültige Verwendung von <code>&lt;ref&gt;</code>: Der Parameter „ref“ ohne Inhalt muss einen Namen haben.',
+ 'cite_error_ref_too_many_keys' => 'Ungültige Verwendung von <code>&lt;ref&gt;</code>: Der Parameter „name“ ist ungültig oder zu lang.',
+ 'cite_error_ref_no_input' => 'Ungültige Verwendung von <code>&lt;ref&gt;</code>: Der Parameter „ref“ ohne Namen muss einen Inhalt haben.',
+ 'cite_error_references_invalid_parameters' => 'Ungültige Verwendung von <code>&lt;references&gt;</code>: Es sind keine Parameter möglich. Verwende ausschließlich <code><nowiki><references /></nowiki></code>.',
+ 'cite_error_references_invalid_parameters_group' => 'Ungültige Verwendung von <code>&lt;references&gt;</code>: Nur der Parameter „group“ ist möglich. Verwende entweder <code>&lt;references /&gt;</code> oder <code>&lt;references group="…" /&gt;</code>.',
+ 'cite_error_references_no_backlink_label' => 'Eine Referenz der Form <code>&lt;ref name="…" /&gt;</code> wird öfter benutzt als Buchstaben vorhanden sind. Ein Administrator muss die Systemnachricht <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> um weitere Buchstaben/Zeichen ergänzen.',
+ 'cite_error_no_link_label_group' => 'Für die Gruppe „$1“ sind keine benutzerdefinierten Linkbezeichnungen mehr verfügbar.
+Ein Administrator muss weitere mit der Systemnachricht <nowiki>[[MediaWiki:$2]]</nowiki> festlegen.',
+ 'cite_error_references_no_text' => 'Es ist ein ungültiger <code>&lt;ref&gt;</code>-Tag vorhanden: Für die Referenz namens <code>$1</code> wurde kein Text angegeben.',
+ 'cite_error_included_ref' => 'Für ein <code>&lt;ref&gt;</code>-Tag fehlt ein schließendes <code>&lt;/ref&gt;</code>-Tag.',
+ 'cite_error_refs_without_references' => 'Es sind <code>&lt;ref&gt;</code>-Tags vorhanden, jedoch wurde kein <code>&lt;references /&gt;</code>-Tag gefunden.',
+ 'cite_error_group_refs_without_references' => 'Es sind <code>&lt;ref&gt;</code>-Tags für die Gruppe „$1“ vorhanden, jedoch wurde kein dazugehöriges <code>&lt;references group="$1" /&gt;</code>-Tag gefunden.',
+ 'cite_error_references_group_mismatch' => 'Das <code>&lt;ref&gt;</code>-Tag in <code>&lt;references&gt;</code> enthält das kollidierende Attribut „$1“.',
+ 'cite_error_references_missing_group' => 'Das in <code>&lt;references&gt;</code> definierte <code>&lt;ref&gt;</code>-Tag hat das Gruppenattribut „$1“, das nicht im vorausgehenden Text verwendet wird.',
+ 'cite_error_references_missing_key' => 'Das in <code>&lt;references&gt;</code> definierte <code>&lt;ref&gt;</code>-Tag mit dem Namen „$1“ wird im vorausgehenden Text nicht verwendet.',
+ 'cite_error_references_no_key' => 'Das in <code>&lt;references&gt;</code> definierte <code>&lt;ref&gt;</code>-Tag hat kein Namensattribut.',
+ 'cite_error_empty_references_define' => 'Das in <code>&lt;references&gt;</code> definierte <code>&lt;ref&gt;</code>-Tag mit dem Namen „$1“ weist keinen Inhalt auf.',
+);
+
+/** Swiss High German (Schweizer Hochdeutsch)
+ * @author Geitost
+ */
+$messages['de-ch'] = array(
+ 'cite_error_references_invalid_parameters' => 'Ungültige <tt>&lt;references&gt;</tt>-Verwendung: Es sind keine zusätzlichen Parameter erlaubt, verwende ausschliesslich <tt><nowiki><references /></nowiki></tt>.',
+ 'cite_error_included_ref' => 'Es fehlt ein schliessendes <code>&lt;/ref&gt;</code>',
+);
+
+/** German (formal address) (Deutsch (Sie-Form)‎)
+ * @author Imre
+ * @author Kghbln
+ * @author Raimond Spekking
+ */
+$messages['de-formal'] = array(
+ 'cite_error_ref_numeric_key' => 'Ungültige Verwendung von <code>&lt;ref&gt;</code>: Der Parameter „name“ darf kein reiner Zahlenwert sein. Benutzen Sie einen beschreibenden Namen.',
+ 'cite_error_references_invalid_parameters' => 'Ungültige Verwendung von <code>&lt;references&gt;</code>: Es sind keine Parameter möglich. Verwenden Sie ausschließlich <code><nowiki><references /></nowiki></code>.',
+ 'cite_error_references_invalid_parameters_group' => 'Ungültige Verwendung von <code>&lt;references&gt;</code>: Nur der Parameter „group“ ist möglich. Verwenden Sie entweder <code>&lt;references /&gt;</code> oder <code>&lt;references group="…" /&gt;</code>.',
+);
+
+/** Zazaki (Zazaki)
+ * @author Aspar
+ * @author Erdemaslancan
+ * @author Xoser
+ */
+$messages['diq'] = array(
+ 'cite-desc' => 'Qe çime mucnayîşî, etiketanê <nowiki><ref[ name=id]></nowiki> u <nowiki><references/></nowiki> de keno',
+ 'cite_croak' => 'Çime nihebitiyeno; $1: $2',
+ 'cite_error_key_str_invalid' => 'Ğeletê dehilî
+$str raÅŸt niyo u/ya zi $key.
+Ena gani nibi.',
+ 'cite_error_stack_invalid_input' => 'Ğeletê dehilî
+Stack key raÅŸt niyo.
+Ena gani nibi.',
+ 'cite_error' => 'Ğeletê çime mucnayîşî: $1',
+ 'cite_error_ref_numeric_key' => 'Etiket <code>&lt;ref&gt;</code> ke raÅŸt niyo;
+Name nieşkeno biyo yew rekam. Çekuyan binuse',
+ 'cite_error_ref_no_key' => 'Etiket <code>&lt;ref&gt;</code> ke raÅŸt niyo;
+Eka kontent çini yo, gani yew name biyo',
+ 'cite_error_ref_too_many_keys' => 'Etiket <code>&lt;ref&gt;</code> ke raÅŸt niyo;
+name raÅŸt niyo, e.g. zaf esto',
+ 'cite_error_ref_no_input' => 'Etiket <code>&lt;ref&gt;</code> ke raÅŸt niyo;
+Eka name çini yo, gani kontent biyo',
+ 'cite_error_references_invalid_parameters' => 'Etiket <code>&lt;ref&gt;</code> ke raÅŸt niyo;
+parametrayan ra destur çini yo.
+<code>&lt;references /&gt;</code> sero kar bike',
+ 'cite_error_references_invalid_parameters_group' => 'Etiket <code>&lt;ref&gt;</code> ke raÅŸt niyo;
+parametrayan ra destur çini yo.
+<code>&lt;references /&gt;</code> sero kar bike, ya zi <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Linkanê Custom backlinkî hin çini yo.
+Zerreyê mesajê <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>î de hewna tasvir bike',
+ 'cite_error_no_link_label_group' => 'Eka etiketinê linkê şexsi ser ena grubi "$1" ciniyo.
+Zerre mesajê <nowiki>[[MediaWiki:$2]]</nowiki> de zafyer qise bike.',
+ 'cite_error_references_no_text' => 'Etiket <code>&lt;ref&gt;</code> ke raÅŸt niyo;
+qe refs yew nuÅŸte nidayiyo <code>$1</code>',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code>Qandê etiketi <code>&lt;/ref&gt;</code> racnayış kemiyo',
+ 'cite_error_refs_without_references' => 'etiketê <code>&lt;ref&gt;</code>î niesto, feqat etiketê <code>&lt;references/&gt;</code>î nidiyo',
+ 'cite_error_group_refs_without_references' => 'etiketê <code>&lt;ref&gt;</code>î niesto ser grupê $1î, feqat etiketê <code>&lt;references/&gt;</code>î nidiyo',
+ 'cite_error_references_group_mismatch' => 'etiketê <code>&lt;ref&gt;</code>î, zerre <code>&lt;references/&gt;</code> de ser grupê "$1"î konflikt keno.',
+ 'cite_error_references_missing_group' => 'etiketê <code>&lt;ref&gt;</code>î, zerre <code>&lt;references/&gt;</code> de tevsir biyo ke ser grupê "$1"î ke verni de nieseno.',
+ 'cite_error_references_missing_key' => 'etiketê <code>&lt;ref&gt;</code>î, zerre <code>&lt;references/&gt;</code> de tevisr biyo ser name "$1"î verni de niesto.',
+ 'cite_error_references_no_key' => 'etiketê <code>&lt;ref&gt;</code>î, zerre <code>&lt;references/&gt;</code> de tevsir biyo name xo çini yo.',
+ 'cite_error_empty_references_define' => 'etiketê <code>&lt;ref&gt;</code>î, zerre <code>&lt;references/&gt;</code> de tevsir biyo "$1" kontent xo çini yo.',
+ 'cite_reference_link_key_with_num' => '$1_$2',
+ 'cite_reference_link_prefix' => 'sita_ref-',
+ 'cite_references_link_prefix' => 'sita_not-',
+ 'cite_reference_link' => '<sup id="$1" class="reference">[[#$2|<nowiki>[</nowiki>$3<nowiki>]</nowiki>]]</sup>',
+ 'cite_references_link_one' => '<li id="$1"><span class="mw-cite-backlink">[[#$2|↑]]</span> $3</li>',
+ 'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink">↑ $2</span> $3</li>',
+ 'cite_references_link_many_format' => '<sup>[[#$1|$2]]</sup>',
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+ 'cite_references_link_many_sep' => '&#32;',
+ 'cite_references_link_many_and' => '&#32;',
+);
+
+/** Lower Sorbian (dolnoserbski)
+ * @author Michawiki
+ */
+$messages['dsb'] = array(
+ 'cite-desc' => 'Pśidawa toflicce <nowiki><ref[ name=id]></nowiki> a <nowiki><references/></nowiki> za pódaśa zrědłow',
+ 'cite_croak' => 'Zmólka w referencnem systemje. $1: $2',
+ 'cite_error_key_str_invalid' => 'Interna zmólka: njpłaśiwy $str a/abo $key. To njaměło se staś.',
+ 'cite_error_stack_invalid_input' => 'Interna zmólka: njepłaśiwy stackowy kluc. To njaměło se staś.',
+ 'cite_error' => 'Referencna zmólka: $1',
+ 'cite_error_ref_numeric_key' => 'Njepłaśiwa toflicka <code>&lt;ref&gt;</code>;
+mě njamóžo jadnora licba byś. Wužyj wugroniwy titel',
+ 'cite_error_ref_no_key' => 'Njepłaśiwa toflicka <code>&lt;ref&gt;</code>;
+"ref" bźez wopśimjeśa musy mě měś',
+ 'cite_error_ref_too_many_keys' => 'Njepłaśiwa toflicka <code>&lt;ref&gt;</code>;
+njepłaśiwe mjenja, na pś. pśewjele',
+ 'cite_error_ref_no_input' => 'Njepłaśiwa toflicka <code>&lt;ref&gt;</code>;
+"ref" bźez mjenja musy wopśimjeśe měś',
+ 'cite_error_references_invalid_parameters' => 'Njepłaśiwa toflicka <code>&lt;references&gt;</code>;
+žedne parametry dowólone.
+Wužyj <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Njepłaśiwa toflicka <code>&lt;references&gt;</code>;
+jano parameter "group" jo dowólony,
+Wužyj <code>&lt;references /&gt;</code> abo <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Swójske etikety slědkwótkazow wupócerane.
+Definěruj dalšne w powěsći <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Žedne swójske wótkazowe etikety za "$1" wěcej k dispoziciji.
+Definěruj dalšne w powěsći <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Njepłaśiwa toflicka <code>&lt;ref&gt;</code>;
+za ref z mjenim <code>$1</code> njejo se tekst pódał',
+ 'cite_error_included_ref' => 'Kóńceca toflicka <code>&lt;/ref&gt;</code> felujo za toflicku <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Toflicki <code>&lt;ref&gt;</code> eksistěruju, ale toflicka <code>&lt;references/&gt;</code> njejo se namakała',
+ 'cite_error_group_refs_without_references' => 'Toflicki <code>&lt;ref&gt;</code> eksistěruju za kupku z mjenim "$1", ale wótpowědujuca toflicka <code>&lt;references group="$1"/&gt;</code> njejo se namakała',
+ 'cite_error_references_group_mismatch' => 'Toflicka <code>&lt;ref&gt;</code> w <code>&lt;references&gt;</code> jo ze kupkowym atributom "$1" w konflikśe.',
+ 'cite_error_references_missing_group' => 'Toflicka <code>&lt;ref&gt;</code>, kótaraž jo w <code>&lt;references&gt;</code> definěrowana, ma kupkowy atribut "$1", kótaryž njepokazujo se w pjerwjejšnem teksće.',
+ 'cite_error_references_missing_key' => 'Toflicka <code>&lt;ref&gt;</code> z mjenim "$1", kótaraž jo w <code>&lt;references&gt;</code> definěrowana, njewužywa se w pjerwjejšnem teksće.',
+ 'cite_error_references_no_key' => 'Toflicka <code>&lt;ref&gt;</code>, kótaraž jo w <code>&lt;references&gt;</code> definěrowana, njama mjenjowy atribut.',
+ 'cite_error_empty_references_define' => 'Toflicka <code>&lt;ref&gt;</code>, kótaraž jo w <code>&lt;references&gt;</code> z mjenim "$1" definěrowana, njama wopśimjeśe.',
+);
+
+/** Greek (Ελληνικά)
+ * @author Consta
+ * @author Omnipaedista
+ * @author ZaDiak
+ * @author ΑπεÏγός
+ */
+$messages['el'] = array(
+ 'cite-desc' => 'ΠÏοσθέτει τα <ref[ name="id"]> και <references/> για τις παÏαπομπές.',
+ 'cite_croak' => 'Η παÏαπομπή οδηγεί σε αδιέξοδο; $1: $2',
+ 'cite_error_key_str_invalid' => 'ΕσωτεÏικό σφάλμα·
+μη έγκυÏο $str και/ή $key.
+Αυτό δεν θα έπÏεπε να συμβαίνει.',
+ 'cite_error_stack_invalid_input' => 'ΕσωτεÏικό σφάλμα·
+μη έγκυÏο κλειδί στοίβας.
+Αυτό δεν θα έπÏεπε να συμβαίνει.',
+ 'cite_error' => 'Σφάλμα αναφοÏάς: $1',
+ 'cite_error_ref_numeric_key' => 'Μη έγκυÏη <code>&lt;ref&gt;</code> ετικέτα·
+το όνομα δεν μποÏεί να είναι ένας απλός ακέÏαιος. ΧÏησιμοποιήστε έναν πεÏιγÏαφικό τίτλο',
+ 'cite_error_ref_no_key' => 'ΆκυÏη <code>&lt;ref&gt;</code> ετικέτα·
+παÏαπομπές χωÏίς πεÏιεχομένο Ï€Ïέπει να έχουν ένα όνομα',
+ 'cite_error_ref_too_many_keys' => 'Μη έγκυÏη <code>&lt;ref&gt;</code> ετικέτα;
+μη έγκυÏα ονόματα, Ï€.χ. πάÏα πολλά',
+ 'cite_error_ref_no_input' => 'Μη έγκυÏη <code>&lt;ref&gt;</code> ετικέτα;
+οι παÏαπομπές χωÏίς όνομα Ï€Ïέπει να έχουν πεÏιεχόμενο',
+ 'cite_error_references_invalid_parameters' => 'Μη έγκυÏη <code>&lt;references&gt;</code> ετικέτα;
+δεν επιτÏέπονται παÏάμετÏοι.
+ΧÏησιμοποιήστε το <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Μη έγκυÏη <code>&lt;references&gt;</code> ετικέτα;
+μόνο η παÏάμετÏος "group" επιτÏέπεται.
+ΧÏησιμοποιείστε το <code>&lt;references /&gt;</code>, ή το <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Εξαντλήθηκαν οι ειδικές ετικέτες συνδέσμων Ï€Ïος το κείμενο.
+ΚαθοÏισμός πεÏισσότεÏων στο μήνυμα <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Εξαντλήθηκαν οι ειδικές ετικέτες συνδέσμων για την ομάδα «$1».
+ΚαθοÏισμός πεÏισσότεÏων στο μήνυμα <nowiki>[[MediaWiki:$2]]</nowiki>',
+ 'cite_error_references_no_text' => 'ΆκυÏο <code>&lt;ref&gt;</code> tag.
+Δεν δίνεται κείμενο για αναφοÏές με το όνομα <code>$1</code>',
+ 'cite_error_included_ref' => 'Υπολείπεται η κατάληξη <code>&lt;/ref&gt;</code> για την ετικέτα <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'ΥπάÏχουν ετικέτες <code>&lt;ref&gt;</code>, αλλά καμία ετικέτα <code>&lt;references/&gt;</code> δεν βÏέθηκε.',
+ 'cite_error_group_refs_without_references' => 'ΥπάÏχουν ετικέτες <code>&lt;ref&gt;</code> για μία ομάδα με το όνομα «$1», αλλά καμία αντίστοιχη ετικέτα <code>&lt;references group="$1"/&gt;</code> δεν βÏέθηκε.',
+ 'cite_error_references_group_mismatch' => 'Η ετικέτα <code>&lt;ref&gt;</code> στο <code>&lt;references&gt;</code> έÏχεται σε σÏγκÏουση με το κατηγοÏοÏμενο "$1".',
+ 'cite_error_references_missing_group' => 'Η <code>&lt;ref&gt;</code> ετικέτα που οÏίζεται στο <code>&lt;references&gt;</code> έχει κατηγοÏοÏμενο ομάδας "$1" που δεν εμφανίζεται σε Ï€ÏοηγοÏμενο κείμενο.',
+ 'cite_error_references_missing_key' => 'Η <code>&lt;ref&gt;</code> ετικέτα με το όνομα "$1" που οÏίζεται στο <code>&lt;references&gt;</code> δεν χÏησιμοποιείται στο Ï€ÏοηγοÏμενο κείμενο.',
+ 'cite_error_references_no_key' => 'Η <code>&lt;ref&gt;</code> ετικέτα που οÏίζεται στο <code>&lt;references&gt;</code> δεν έχει κατηγοÏοÏμενο ονόματος.',
+ 'cite_error_empty_references_define' => 'Η <code>&lt;ref&gt;</code> ετικέτα που οÏίζεται στο <code>&lt;references&gt;</code> με το όνομα "$1" δεν έχει καθόλου πεÏιεχόμενο.',
+);
+
+/** Esperanto (Esperanto)
+ * @author AVRS
+ * @author Malafaya
+ * @author Yekrats
+ */
+$messages['eo'] = array(
+ 'cite-desc' => 'Aldonas etikedojn <nowiki><ref[ name=id]></nowiki> kaj <nowiki><references/></nowiki> por citaĵoj',
+ 'cite_croak' => 'Cito mortis; $1: $2',
+ 'cite_error_key_str_invalid' => 'Interna eraro;
+malvalida $str kaj/aÅ­ $key.
+Ĉi tio neniam okazos.',
+ 'cite_error_stack_invalid_input' => 'Interna eraro;
+malvalida staka Ålosilo.
+Ĉi tio verÅajne neniam okazus.',
+ 'cite_error' => 'Citaĵa eraro: $1',
+ 'cite_error_ref_numeric_key' => 'Malvalida etikedo <code>&lt;ref&gt;</code>;
+nomo ne povas esti simpla entjero. Uzu priskriban titolon.',
+ 'cite_error_ref_no_key' => "Malvalida etikedo <code>&lt;ref&gt;</code>;
+''ref'' kun nenia enhava nomo devas havi nomon",
+ 'cite_error_ref_too_many_keys' => 'Malvalida etikedo <code>&lt;ref&gt;</code>;
+malvalidaj nomoj (ekz-e: tro multaj)',
+ 'cite_error_ref_no_input' => 'Malvalida etikedo <code>&lt;ref&gt;</code>;
+ref-etikedoj sen nomo devas havi enhavojn.',
+ 'cite_error_references_invalid_parameters' => 'Nevalida etikedo <code>&lt;references&gt;</code>; neniuj parametroj estas permesitaj, uzu <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Malvalida etikedon <code>&lt;references&gt;</code>;
+parametro "group" nur estas permesita.
+Uzu etikedon <code>&lt;references /&gt;</code>, aÅ­ <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Neniom plu memfaritaj retroligaj etikedoj.
+Difinu pliajn en la mesaÄo <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
+ 'cite_error_no_link_label_group' => 'Mankas proprajn ligilajn etikedojn por grupo "$1".
+Difinu pliajn en la <nowiki>[[MediaWiki:$2]]</nowiki> mesaÄo.',
+ 'cite_error_references_no_text' => 'Nevalida <code>&lt;ref&gt;</code> etikedo;
+neniu teksto estis donita por ref-oj nomataj <code>$1</code>',
+ 'cite_error_included_ref' => 'Ferma <code>&lt;/ref&gt;</code> mankas por <code>&lt;ref&gt;</code>-etikedo',
+ 'cite_error_refs_without_references' => 'Etikedoj <code>&lt;ref&gt;</code> ekzistas, sed neniu etikedo <code>&lt;references/&gt;</code> estis trovita',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> etikedoj ekzistas por grupo nomita "$1", sed ne koresponda <code>&lt;references group="$1"/&gt;</code> etikedo estis trovita',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> etikedo en <code>&lt;references&gt;</code> havas konflikan grupatributon "$1".',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> etikedo difinita en <code>&lt;references&gt;</code> havas grupatributon "$1" kiu ne aperas en antaÅ­a teksto.',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> etikedo kun la nomo "$1" difinita en <code>&lt;references&gt;</code> ne estas uzata en antaÅ­a teksto.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> etikedo difinita en <code>&lt;references&gt;</code> ne havas noman atributon.',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> etikedo difinita en <code>&lt;references&gt;</code> kun nomo "$1" ne havas enhavon.',
+);
+
+/** Spanish (español)
+ * @author Antur
+ * @author Baiji
+ * @author Crazymadlover
+ * @author Drini
+ * @author Erdemaslancan
+ * @author Gustronico
+ * @author Locos epraix
+ * @author Manuelt15
+ * @author McDutchie
+ * @author Muro de Aguas
+ * @author Remember the dot
+ * @author Sanbec
+ * @author Translationista
+ */
+$messages['es'] = array(
+ 'cite-desc' => 'Añade las etiquietas <nowiki><ref[ name=id]> y <references /></nowiki> para utilizar notas al pie.',
+ 'cite_croak' => "La extensión ''Cite'' se murió; $1: $2",
+ 'cite_error_key_str_invalid' => 'Error interno;
+$str o $key no válidos.
+Esto no debería ocurrir.',
+ 'cite_error_stack_invalid_input' => 'Error interno;
+la clave de la pila no es válida.
+Esto nunca debe ocurrir.',
+ 'cite_error' => 'Error en la cita: $1',
+ 'cite_error_ref_numeric_key' => 'Etiqueta <code>&lt;ref&gt;</code> no válida;
+el nombre no puede ser un número entero. Use un título descriptivo',
+ 'cite_error_ref_no_key' => 'Etiqueta <code>&lt;ref&gt;</code> no válida;
+las referencias sin contenido deben tener un nombre',
+ 'cite_error_ref_too_many_keys' => 'Etiqueta <code>&lt;ref&gt;</code> inválida;
+contiene parámetros no reconocidos',
+ 'cite_error_ref_no_input' => 'Etiqueta <code>&lt;ref&gt;</code> no válida;
+las referencias sin nombre deben tener contenido',
+ 'cite_error_references_invalid_parameters' => 'Etiqueta <code>&lt;references&gt;</code> no válida;
+no se admiten parámetros.
+Use <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Etiqueta <code>&lt;references&gt;</code> no válida;
+sólo se permite el parámetro «group».
+Use <code>&lt;references /&gt;</code>, o <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Se han acabado las etiquetas personalizadas de vínculos de retroceso.
+Define más en <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
+ 'cite_error_no_link_label_group' => 'Se han acabado las etiquetas personalizadas para vínculos del grupo "$1".
+Define más en el mensaje <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Etiqueta <code>&lt;ref&gt;</code> inválida;
+no se ha definido el contenido de las referencias llamadas <code>$1</code>',
+ 'cite_error_included_ref' => 'Etiqueta de apertura <code>&lt;ref&gt;</code> sin su correspondiente cierre <code>&lt;/ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code>, pero no se encontró una etiqueta <code>&lt;references /&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code> para un grupo llamado "$1", pero no se encontró una etiqueta <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'La etiqueta <code>&lt;ref&gt;</code> en <code>&lt;references&gt;</code> presenta el atributo de grupo "$1" en conflicto.',
+ 'cite_error_references_missing_group' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> pertenece al grupo "$1" no declarado en el texto precedente.',
+ 'cite_error_references_missing_key' => 'La etiqueta <code>&lt;ref&gt;</code> con nombre "$1" definida en <code>&lt;references&gt;</code> no se utiliza en el texto precedente.',
+ 'cite_error_references_no_key' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> no tiene atributo de nombre.',
+ 'cite_error_empty_references_define' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> con nombre "$1" no tiene contenido.',
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+);
+
+/** Estonian (eesti)
+ * @author Pikne
+ */
+$messages['et'] = array(
+ 'cite-desc' => 'Lisab viitamiseks sildid <nowiki><ref[ name=id]></nowiki> ja <nowiki><references/></nowiki>.',
+ 'cite_croak' => 'Viide ütles üles; $1: $2',
+ 'cite_error_key_str_invalid' => 'Sisetõrge;
+vigane $str ja/või $key.
+Seda ei tohiks esineda.',
+ 'cite_error_stack_invalid_input' => 'Sisetõrge;
+vigane pinuvõti.
+Seda ei tohiks esineda.',
+ 'cite_error' => 'Viitamistõrge: $1',
+ 'cite_error_ref_numeric_key' => 'Vigane <code>&lt;ref&gt;</code>-silt.
+Nimi ei või olla numbriline. Kasuta kirjeldavat nime.',
+ 'cite_error_ref_no_key' => 'Vigane <code>&lt;ref&gt;</code>-silt.
+Sisuta viitamissiltidel peab olema nimi.',
+ 'cite_error_ref_too_many_keys' => 'Vigane <code>&lt;ref&gt;</code>-silt;
+"name" on vigane või liiga pikk.',
+ 'cite_error_ref_no_input' => 'Vigane <code>&lt;ref&gt;</code>-silt.
+Nimeta viitamissiltidel peab olema sisu.',
+ 'cite_error_references_invalid_parameters' => 'Vigane <code>&lt;references&gt;</code>-silt.
+Parameetrid pole lubatud.
+Kasuta silti <code>&lt;references /&gt;</code>.',
+ 'cite_error_references_invalid_parameters_group' => 'Vigane <code>&lt;references&gt;</code>-silt.
+Lubatud on ainult parameeter "group".
+Kasuta silti <code>&lt;references /&gt;</code> või <code>&lt;references group="..." /&gt;</code>.',
+ 'cite_error_references_no_backlink_label' => 'Kohandatud tagasilinkide sildid said otsa.
+Lisa neid sõnumisse <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
+ 'cite_error_no_link_label_group' => 'Rühma "$1" kohandatud linkide sildid said otsa.
+Lisa neid sõnumisse <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Vigane <code>&lt;ref&gt;</code>-silt.
+Viite nimega <code>$1</code> tekst puudub.',
+ 'cite_error_included_ref' => 'Sulgemissilt <code>&lt;/ref&gt;</code> puudub.',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-sildid on olemas, aga <code>&lt;references/&gt;</code>-silt puudub.',
+ 'cite_error_group_refs_without_references' => 'Olemas on <code>&lt;ref&gt;</code>-silt rühma "$1" jaoks, aga vastav <code>&lt;references group="$1"/&gt;</code>-silt puudub.',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>-siltide vahel oleval <code>&lt;ref&gt;</code>-sildil on vastukäiv parameetri "group" väärtus "$1".',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>-sildis kirjeldatud <code>&lt;ref&gt;</code>-sildil on rühmatunnus "$1", mis puudub eelnevas tekstis.',
+ 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>-siltide vahel olevat <code>&lt;ref&gt;</code>-silti nimega "$1" ei kasutata eelnevas tekstis.',
+ 'cite_error_references_no_key' => "<code>&lt;references&gt;</code>-siltide vahel määratletud <code>&lt;ref&gt;</code>-sildil puudub ''name''-atribuut.",
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code>-siltide vahel oleval <code>&lt;ref&gt;</code>-sildil nimega "$1" puudub sisu.',
+);
+
+/** Basque (euskara)
+ * @author An13sa
+ */
+$messages['eu'] = array(
+ 'cite-desc' => '<nowiki><ref[ name=id]></nowiki> eta <nowiki><references/></nowiki> etiketak gehitzen ditu, aipuentzako',
+ 'cite_croak' => 'Hildako aipua; $1: $2',
+ 'cite_error' => 'Aipamen errorea: $1',
+);
+
+/** Persian (Ùارسی)
+ * @author Ebraminio
+ * @author Huji
+ * @author Wayiran
+ * @author ZxxZxxZ
+ */
+$messages['fa'] = array(
+ 'cite-desc' => 'برچسب‌های <nowiki><ref[ name=id]></nowiki> Ùˆ <nowiki><references/></nowiki> را برای یادکرد اضاÙÙ‡ می‌کند',
+ 'cite_croak' => 'یادکرد خراب شد؛ $1: $2',
+ 'cite_error_key_str_invalid' => 'خطای داخلی؛ $str و/یا $key غیر مجاز. این خطا نباید هرگز رخ دهد.',
+ 'cite_error_stack_invalid_input' => 'خطای داخلی؛ کلید پشته غیرمجاز. این خطا نباید هرگز رخ دهد.',
+ 'cite_error' => 'خطای یادکرد: $1',
+ 'cite_error_ref_numeric_key' => 'برچسب <code><ref></code> غیرمجاز؛ نام نمی‌تواند یک عدد باشد. عنوان واضح‌تری را برگزینید',
+ 'cite_error_ref_no_key' => 'برچسب <code><ref></code> غیرمجاز؛ یادکردهای بدون محتوا باید نام داشته باشند',
+ 'cite_error_ref_too_many_keys' => 'برچسب <code><ref></code> غیرمجاز؛ نام‌های غیرمجاز یا بیش از اندازه',
+ 'cite_error_ref_no_input' => 'برچسب <code><ref></code> غیرمجاز؛ یادکردهای بدون نام باید محتوا داشته باشند',
+ 'cite_error_references_invalid_parameters' => 'برچسب <code><references></code> غیرمجاز؛ استÙاده از پارامتر مجاز است. از <code><references /></code> استÙاده کنید',
+ 'cite_error_references_invalid_parameters_group' => 'برچسب <code>&lt;references&gt;</code> غیر مجاز؛ تنها پارامتر «group» قابل استÙاده است.
+از <code>&lt;references /&gt;</code> یا <code>&lt;references group="..." /&gt;</code> استÙاده کنید',
+ 'cite_error_references_no_backlink_label' => 'برچسب‌های پیوند به انتها رسید.
+موارد جدیدی را در پیغام <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> تعری٠کنید',
+ 'cite_error_no_link_label_group' => 'از برچسب‌های پیوند سÙارشی برای گروه «$1» خارج شد.
+در پیغام <nowiki>[[MediaWiki:$2]]</nowiki> بیشتر تعری٠کنید.',
+ 'cite_error_references_no_text' => 'برچسب <code><ref></code> غیرمجاز؛ متنی برای یادکردهای با نام <code>$1</code> وارد نشده‌است',
+ 'cite_error_included_ref' => 'برچسب تمام کنندهٔ <code>&lt;/ref&gt;</code> بدون برچسب <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'برچسب <code>&lt;ref&gt;</code> وجود دارد اما برچسب <code>&lt;references/&gt;</code> پیدا نشد',
+ 'cite_error_group_refs_without_references' => 'برچسب <code>&lt;ref&gt;</code> برای گروهی به نام «$1» وجود دارد، اما برچسب <code>&lt;references group="$1"/&gt;</code> متناظر پیدا نشد',
+ 'cite_error_references_group_mismatch' => 'برچسپ <code>&lt;ref&gt;</code> درون <code>&lt;references&gt;</code> در تضاد با ویژگی‌های گروه «$1» است.',
+ 'cite_error_references_missing_group' => 'برچسپ <code>&lt;ref&gt;</code> در <code>&lt;references&gt;</code> تعری٠شده، ویژگی‌های گروهی «$1» را دارد که درون متن قبل از آن ظاهر نمی‌شود.',
+ 'cite_error_references_missing_key' => 'پرچسپ <code>&lt;ref&gt;</code> Ú©Ù‡ با نام «$1» درون <code>&lt;references&gt;</code> تعری٠شده، در متن قبل از آن استÙاده نشده‌است.',
+ 'cite_error_references_no_key' => 'برچسپ <code>&lt;ref&gt;</code> درون <code>&lt;references&gt;</code> صÙت نام را ندارد.',
+ 'cite_error_empty_references_define' => 'برچسپ <code>&lt;ref&gt;</code> تعری٠شده درون <code>&lt;references&gt;</code> با نام «$1» محتوایی ندارد.',
+ 'cite_reference_link_key_with_num' => '$1_$2',
+ 'cite_reference_link_prefix' => 'cite_ref-',
+);
+
+/** Finnish (suomi)
+ * @author Agony
+ * @author Crt
+ * @author Nike
+ * @author Olli
+ * @author Silvonen
+ * @author Str4nd
+ * @author Tarmo
+ */
+$messages['fi'] = array(
+ 'cite-desc' => 'Tarjoaa <nowiki><ref[ name=id]></nowiki>- ja <nowiki><references/></nowiki>-elementit viittauksien tekemiseen.',
+ 'cite_croak' => 'Virhe viittausjärjestelmässä: $1: $2',
+ 'cite_error_key_str_invalid' => 'Sisäinen virhe: kelpaamaton $str ja/tai $key.',
+ 'cite_error_stack_invalid_input' => 'Sisäinen virhe: kelpaamaton pinoavain.',
+ 'cite_error' => 'Viittausvirhe: $1',
+ 'cite_error_ref_numeric_key' => 'Kelpaamaton <code>&lt;ref&gt;</code>-elementti: nimi ei voi olla numero – käytä kuvaavampaa nimeä.',
+ 'cite_error_ref_no_key' => 'Kelpaamaton <code>&lt;ref&gt;</code>-elementti: sisällöttömille refeille pitää määrittää nimi.',
+ 'cite_error_ref_too_many_keys' => 'Kelpaamaton <code>&lt;ref&gt;</code>-elementti: virheelliset nimet, esim. liian monta',
+ 'cite_error_ref_no_input' => 'Kelpaamaton <code>&lt;ref&gt;</code>-elementti: viitteillä ilman nimiä täytyy olla sisältöä',
+ 'cite_error_references_invalid_parameters' => 'Kelpaamaton <code>&lt;references&gt;</code>-elementti: parametrit eivät ole sallittuja. Käytä muotoa <code>&lt;references /&gt;</code>.',
+ 'cite_error_references_invalid_parameters_group' => 'Kelpaamaton <code>&lt;references&gt;</code>-elementti: vain parametri â€group†on sallittu. Käytä muotoa <code>&lt;references /&gt;</code> tai <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Määritetyt takaisinviittausnimikkeet loppuivat kesken.
+Niitä voi määritellä lisää sivulla <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
+ 'cite_error_no_link_label_group' => 'Mukautettujen linkkikirjainten määrä ryhmälle â€$1†loppui.
+Määritä niitä lisää viestissä <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Virheellinen <code>&lt;ref&gt;</code>-elementti;
+viitettä <code>$1</code> ei löytynyt',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code>-elementin sulkeva <code>&lt;/ref&gt;</code>-elementti puuttuu',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-elementti löytyy, mutta <code>&lt;references/&gt;</code>-elementtiä ei löydy',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-elementit löytyivät ryhmälle nimeltä â€$1â€, mutta vastaavaa <code>&lt;references group="$1"/&gt;</code>-elementtiä ei löytynyt',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code>-elementti <code>&lt;references&gt;</code>-elementin sisällä sisältää ristiriitaisen ryhmämääritteen â€$1â€.',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>-elementissä määritetty <code>&lt;ref&gt;</code>-elementti sisältää ryhmämääritteen â€$1â€, jota ei mainita aiemmassa tekstissä.',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code>-elementin nimeä â€$1â€, johon viitataan elementissä <code>&lt;references&gt;</code> ei käytetä edeltävässä tekstissä.',
+ 'cite_error_references_no_key' => '<code>&lt;references&gt;</code>-elementissä määritetyllä <code>&lt;ref&gt;</code>-elementillä ei ole nimimääritettä.',
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code>-elementissä määritetyllä <code>&lt;ref&gt;</code>-elementillä nimellä â€$1†ei ole sisältöä.',
+);
+
+/** Faroese (føroyskt)
+ * @author EileenSanda
+ */
+$messages['fo'] = array(
+ 'cite-desc' => 'Leggur afturat <nowiki><ref[ name=id]></nowiki> og <nowiki><references/></nowiki> lyklaorð, fyri ávísingar',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> lyklaorð eru til, men onki <code>&lt;references/&gt;</code> lyklaorð (tag) varð funnið',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> lyklaorð (tags) eru til fyri ein bólk sum eitur "$1", men onki tilsvarandi <code>&lt;references group="$1"/&gt;</code> lyklaorð varð funnið',
+);
+
+/** French (français)
+ * @author Cedric31
+ * @author Crochet.david
+ * @author Grondin
+ * @author IAlex
+ * @author Kropotkine 113
+ * @author McDutchie
+ * @author Sherbrooke
+ * @author The Evil IP address
+ * @author Trizek
+ * @author Verdy p
+ */
+$messages['fr'] = array(
+ 'cite-desc' => 'Ajoute les balises <nowiki><ref[ name="id"]></nowiki> et <nowiki><references/></nowiki> pour les références et notes de bas de page.',
+ 'cite_croak' => 'Référence en impasse ; $1 : $2',
+ 'cite_error_key_str_invalid' => 'Erreur interne ;
+$str ou $key invalides.
+Ceci ne devrait jamais se produire.',
+ 'cite_error_stack_invalid_input' => 'Erreur interne ;
+clé de pile invalide.
+Ceci ne devrait jamais se produire.',
+ 'cite_error' => 'Erreur de référence : $1',
+ 'cite_error_ref_numeric_key' => 'Balise <code>&lt;ref&gt;</code> incorrecte ;
+le nom ne peut être un entier simple. Utilisez un titre descriptif.',
+ 'cite_error_ref_no_key' => 'Balise <code>&lt;ref&gt;</code> incorrecte ;
+les références sans contenu doivent avoir un nom.',
+ 'cite_error_ref_too_many_keys' => 'Balise <code>&lt;ref&gt;</code> incorrecte ;
+noms incorrects, par exemple trop nombreux.',
+ 'cite_error_ref_no_input' => 'Balise <code>&lt;ref&gt;</code> incorrecte ;
+les références sans nom doivent avoir un contenu.',
+ 'cite_error_references_invalid_parameters' => 'Balise <code>&lt;references&gt;</code> incorrecte ;
+aucun paramètre n’est permis.
+Utilisez simplement <code>&lt;references /&gt;</code>.',
+ 'cite_error_references_invalid_parameters_group' => 'Balise <code>&lt;references&gt;</code> incorrecte ;
+seul l’attribut « group » est autorisé.
+Utilisez <code>&lt;references /&gt;</code>, ou bien <code>&lt;references group="..." /&gt;</code>.',
+ 'cite_error_references_no_backlink_label' => 'Épuisement des étiquettes de liens personnalisées.
+Définissez-en un plus grand nombre dans le message <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
+ 'cite_error_no_link_label_group' => 'Plus d’étiquettes de liens personnalisées pour le groupe « $1 ».
+Définissez-en plus dans le message <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Balise <code>&lt;ref&gt;</code> incorrecte ;
+aucun texte n’a été fourni pour les références nommées <code>$1</code>.',
+ 'cite_error_included_ref' => 'Clôture <code>&lt;/ref&gt;</code> manquante pour la balise <code>&lt;ref&gt;</code>.',
+ 'cite_error_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> existent, mais aucune balise <code>&lt;references/&gt;</code> n’a été trouvée.',
+ 'cite_error_group_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> existent pour un groupe nommé « $1 », mais aucune balise <code>&lt;references group="$1"/&gt;</code> correspondante n’a été trouvée.',
+ 'cite_error_references_group_mismatch' => 'La balise <code>&lt;ref&gt;</code> dans <code>&lt;references&gt;</code> a l’attribut de groupe « $1 » qui entre en conflit avec celui de <code>&lt;references&gt;</code>.',
+ 'cite_error_references_missing_group' => 'La balise <code>&lt;ref&gt;</code> définie dans <code>&lt;references&gt;</code> a un groupe attribué « $1 » qui ne figure pas dans le texte précédent.',
+ 'cite_error_references_missing_key' => 'La balise <code>&lt;ref&gt;</code> avec le nom « $1 » définie dans <code>&lt;references&gt;</code> n’est pas utilisé dans le texte précédent.',
+ 'cite_error_references_no_key' => "La balise <code>&lt;ref&gt;</code> définie dans <code>&lt;references&gt;</code> n’a pas d'attribut de nom.",
+ 'cite_error_empty_references_define' => 'La balise <code>&lt;ref&gt;</code> défini dans <code>&lt;references&gt;</code> avec le nom « $1 » n’a pas de contenu.',
+ 'cite_references_link_many_sep' => ',&#32;',
+ 'cite_references_link_many_and' => '&#32;et&#32;',
+);
+
+/** Franco-Provençal (arpetan)
+ * @author ChrisPtDe
+ */
+$messages['frp'] = array(
+ 'cite-desc' => 'Apond les balises <nowiki><ref[ name=id]></nowiki> et <nowiki><references/></nowiki>, por les citacions.',
+ 'cite_croak' => 'Citacion corrompua ; $1 : $2',
+ 'cite_error_key_str_invalid' => 'Èrror de dedens ; $str atendua.',
+ 'cite_error_stack_invalid_input' => 'Èrror de dedens ; cllâf de pila envalida.',
+ 'cite_error' => 'Èrror de citacion $1',
+ 'cite_error_ref_numeric_key' => 'Apèl envalido ; cllâf pas entègrâla atendua.',
+ 'cite_error_ref_no_key' => 'Balisa <code>&lt;ref&gt;</code> fôssa ;
+les refèrences sen contegnu dêvont avêr un nom.',
+ 'cite_error_ref_too_many_keys' => 'Apèl envalido ; cllâfs envalides, per ègzemplo, trop de cllâfs spècefiâs ou ben cllâf fôssa.',
+ 'cite_error_ref_no_input' => 'Balisa <code>&lt;ref&gt;</code> fôssa ;
+les refèrences sen nom dêvont avêr un contegnu.',
+ 'cite_error_references_invalid_parameters' => 'Arguments envalidos ; argument atendu.',
+ 'cite_error_references_invalid_parameters_group' => 'Balisa <code>&lt;references&gt;</code> fôssa ;
+solament lo paramètre « tropa » est ôtorisâ.
+Utilisâd <code>&lt;references /&gt;</code>, ou ben <code>&lt;references group="..." /&gt;</code>.',
+ 'cite_error_references_no_backlink_label' => 'Èpouesement de les ètiquètes de lims pèrsonalisâs.
+Dèfenésséd-nen un ples grant nombro dens lo mèssâjo <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
+ 'cite_error_no_link_label_group' => 'Més d’ètiquètes de lims pèrsonalisâs por la tropa « $1 ».
+Dèfenésséd-nen més dens lo mèssâjo <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Balisa <code>&lt;ref&gt;</code> fôssa ;
+nion tèxto at étâ balyê por les refèrences apelâs <code>$1</code>.',
+ 'cite_error_included_ref' => 'Cllotura <code>&lt;/ref&gt;</code> manquenta por la balisa <code>&lt;ref&gt;</code>.',
+ 'cite_error_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> ègzistont, mas niona balisa <code>&lt;references/&gt;</code> at étâ trovâ.',
+ 'cite_error_group_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> ègzistont por una tropa apelâ « $1 », mas niona balisa <code>&lt;references group="$1"/&gt;</code> que corrèspond at étâ trovâ.',
+ 'cite_error_references_group_mismatch' => 'La balisa <code>&lt;ref&gt;</code> dens <code>&lt;references&gt;</code> at l’atribut de tropa « $1 » qu’entre en conflit avouéc celi de <code>&lt;references&gt;</code>.',
+ 'cite_error_references_missing_group' => 'La balisa <code>&lt;ref&gt;</code> dèfenia dens <code>&lt;references&gt;</code> at l’atribut de tropa « $1 » que figure pas dens cél tèxto.',
+ 'cite_error_references_missing_key' => 'La balisa <code>&lt;ref&gt;</code> avouéc lo nom « $1 » dèfenia dens <code>&lt;references&gt;</code> est pas utilisâ dens cél tèxto.',
+ 'cite_error_references_no_key' => 'La balisa <code>&lt;ref&gt;</code> dèfenia dens <code>&lt;references&gt;</code> at gins d’atribut de nom.',
+ 'cite_error_empty_references_define' => 'La balisa <code>&lt;ref&gt;</code> dèfenia dens <code>&lt;references&gt;</code> avouéc lo nom « $1 » at gins de contegnu.',
+ 'cite_references_link_many_sep' => ',&#32;',
+ 'cite_references_link_many_and' => '&#32;et&#32;',
+);
+
+/** Friulian (furlan)
+ * @author Klenje
+ */
+$messages['fur'] = array(
+ 'cite_error' => 'Erôr te funzion Cite: $1',
+);
+
+/** Gagauz (Gagauz)
+ * @author Erdemaslancan
+ */
+$messages['gag'] = array(
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+);
+
+/** Galician (galego)
+ * @author Alma
+ * @author Toliño
+ * @author Xosé
+ */
+$messages['gl'] = array(
+ 'cite-desc' => 'Engade as etiquetas <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> para as citas',
+ 'cite_croak' => 'Cita morta; $1: $2',
+ 'cite_error_key_str_invalid' => 'Erro interno; $str e/ou $key inválidos. Isto non debera ocorrer.',
+ 'cite_error_stack_invalid_input' => 'Erro interno; stack key inválido. Isto non debera ocorrer.',
+ 'cite_error' => 'Erro no código da cita: $1',
+ 'cite_error_ref_numeric_key' => 'Etiqueta <code>&lt;ref&gt;</code> non válida;
+o nome non pode ser un simple número enteiro. Use un título descritivo',
+ 'cite_error_ref_no_key' => 'Etiqueta <code>&lt;ref&gt;</code> non válida;
+as referencias que non teñan contido deben ter un nome',
+ 'cite_error_ref_too_many_keys' => 'Etiqueta <code>&lt;ref&gt;</code> non válida;
+nomes non válidos, por exemplo, demasiados',
+ 'cite_error_ref_no_input' => 'Etiqueta <code>&lt;ref&gt;</code> non válida;
+as referencias que non teñan nome, deben ter contido',
+ 'cite_error_references_invalid_parameters' => 'Etiqueta <code>&lt;references&gt;</code> non válida;
+non están permitidos eses parámetros.
+Use <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Etiqueta <code>&lt;references&gt;</code> non válida;
+só está permitido o parámetro "group" ("grupo").
+Use <code>&lt;references /&gt;</code> ou <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'As etiquetas personalizadas esgotáronse.
+Defina máis na mensaxe <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'As etiquetas personalizadas esgotáronse para o grupo "$1".
+Defina máis na mensaxe <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Etiqueta <code>&lt;ref&gt;</code> non válida;
+non se forneceu texto para as referencias de nome <code>$1</code>',
+ 'cite_error_included_ref' => 'Peche a etiqueta <code>&lt;/ref&gt;</code> que lle falta á outra etiqueta <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'As etiquetas <code>&lt;ref&gt;</code> existen, pero non se atopou ningunha etiqueta <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'As etiquetas <code>&lt;ref&gt;</code> existen para un grupo chamado "$1", pero non se atopou a etiqueta <code>&lt;references group="$1"/&gt;</code> correspondente',
+ 'cite_error_references_group_mismatch' => 'A etiqueta <code>&lt;ref&gt;</code> en <code>&lt;references&gt;</code> ten un atributo de grupo conflitivo "$1".',
+ 'cite_error_references_missing_group' => 'A etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> ten un atributo de grupo "$1" que non aparece no texto anterior.',
+ 'cite_error_references_missing_key' => 'A etiqueta <code>&lt;ref&gt;</code> co nome "$1" definida en <code>&lt;references&gt;</code> non se utiliza no texto anterior.',
+ 'cite_error_references_no_key' => 'A etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> non ten nome de atributo.',
+ 'cite_error_empty_references_define' => 'A etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> co nome "$1" non ten contido.',
+);
+
+/** Ancient Greek (ἈÏχαία ἑλληνικὴ)
+ * @author Omnipaedista
+ */
+$messages['grc'] = array(
+ 'cite_error' => 'Σφάλμα μνείας: $1',
+);
+
+/** Swiss German (Alemannisch)
+ * @author Als-Holder
+ * @author The Evil IP address
+ */
+$messages['gsw'] = array(
+ 'cite-desc' => 'Ergänzt d <nowiki><ref[ name=id]></nowiki> un d <nowiki><references /></nowiki>-Tag fir Quällenochwyys',
+ 'cite_croak' => 'Fähler im Referenz-Syschtem. $1: $2',
+ 'cite_error_key_str_invalid' => 'Intärne Fähler: uugiltige $str un/oder $key. Des sott eigetli gar nit chenne gschäh.',
+ 'cite_error_stack_invalid_input' => 'Intärne Fähler: uugiltige „name“-stack. Des sott eigetli gar nit chenne gschäh.',
+ 'cite_error' => 'Referänz-Fähler: $1',
+ 'cite_error_ref_numeric_key' => 'Uugiltigi <tt>&lt;ref&gt;</tt>-Verwändig: „name“ derf kei reine Zahlewärt syy, verwänd e Name wu bschrybt.',
+ 'cite_error_ref_no_key' => 'Uugiltigi <tt>&lt;ref&gt;</tt>-Verwändig: „ref“ ohni Inhalt muess e Name haa.',
+ 'cite_error_ref_too_many_keys' => 'Uugiltigi <tt>&lt;ref&gt;</tt>-Verwändig: „name“ isch uugiltig oder z lang.',
+ 'cite_error_ref_no_input' => 'Uugiltigi <tt>&lt;ref&gt;</tt>-Verwändig: „ref“ ohni Name muess e Inhalt haa.',
+ 'cite_error_references_invalid_parameters' => 'Uugiltigi <tt>&lt;references&gt;</tt>-Verwändig: S sin kei zuesätzligi Parameter erlaubt, verwänd usschließli <tt><nowiki><references /></nowiki></tt>.',
+ 'cite_error_references_invalid_parameters_group' => 'Uugiltigi <tt>&lt;references&gt;</tt>-Verwändig: Nume dr Parameter „group“ isch erlaubt, verwänd <tt>&lt;references /&gt;</tt> oder <tt>&lt;references group="..." /&gt;</tt>',
+ 'cite_error_references_no_backlink_label' => 'E Referenz mit dr Form <tt>&lt;ref name="..."/&gt;</tt> wird meh brucht as es Buechstabe git. E Ammann muess <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> go wyteri Buechstabe/Zeiche ergänze.',
+ 'cite_error_no_link_label_group' => 'Fir d Gruppe „$1“ sin kei benutzerdefinierti Linkbezeichnige me verfiegbar.
+Definier meh unter Systemnochricht <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Uugiltige <tt>&lt;ref&gt;</tt>-Tag; s isch kei Täxt fir s Ref mit em Name <tt>$1</tt> aagee wore.',
+ 'cite_error_included_ref' => 'S fählt s schließend <code>&lt;/ref&gt;</code>',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-Tag git s, aber s isch kei <code>&lt;references/&gt;</code>-Tag gfunde wore.',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tag git s fir d Grupp „$1“, aber s isch kei dezue gherig <code>&lt;references group=„$1“/&gt;</code>-Tag gfunde wore',
+ 'cite_error_references_group_mismatch' => 'Im <code>&lt;ref&gt;</code>-Tag in <code>&lt;references&gt;</code> het s e problematischi Gruppe-Eigeschaft „$1“.',
+ 'cite_error_references_missing_group' => 'Im <code>&lt;ref&gt;</code>-Tag, wu definiert isch in <code>&lt;references&gt;</code>, het s e Gruppe-Eigeschaft „$1“, wu im obere Text nit vorchunnt.',
+ 'cite_error_references_missing_key' => 'S <code>&lt;ref&gt;</code>-Tag mit em Name „$1“, wu definiert isch in <code>&lt;references&gt;</code> wird nit verwändet im obere Text.',
+ 'cite_error_references_no_key' => 'S <code>&lt;ref&gt;</code>-Tag, wu definiert isch in <code>&lt;references&gt;</code>, het kei Name-Eigeschaft.',
+ 'cite_error_empty_references_define' => 'Im <code>&lt;ref&gt;</code>-Tag, wu definiert isch in <code>&lt;references&gt;</code>, mit em Name „$1“ het s kei Inhalt.',
+);
+
+/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @author Ashok modhvadia
+ * @author Dsvyas
+ * @author KartikMistry
+ * @author Sushant savla
+ */
+$messages['gu'] = array(
+ 'cite-desc' => 'અવતરણો માટે <nowiki><ref[ name=id]></nowiki> અને <nowiki><references/></nowiki> ટેગ ઉમેરે છે',
+ 'cite_croak' => 'અવતરણ ભાંગી ગયà«àª‚; $1: $2',
+ 'cite_error_key_str_invalid' => 'આંતરિક કà«àª·àª¤àª¿;
+અયોગà«àª¯ $str અને/અથવા $key.
+આ કà«àª¯àª¾àª°à«‡àª¯ થવà«àª‚ ન જોઈàª.',
+ 'cite_error_stack_invalid_input' => 'આંતરિક કà«àª·àª¤àª¿;
+અયોગà«àª¯ સà«àªŸà«‡àª• કળ.
+આ કà«àª¯àª¾àª°à«‡àª¯ થવà«àª‚ ન જોઈàª.',
+ 'cite_error' => 'સંદરà«àª­ તà«àª°à«àªŸàª¿: $1',
+ 'cite_error_ref_numeric_key' => 'અમાનà«àª¯ <code>&lt;ref&gt;</code> ટેગ;
+નામ માતà«àª° સરળ રાશિ ન હોઈ શકે, વિસà«àª¤à«ƒàª¤ શીરà«àª·àª• આપો',
+ 'cite_error_ref_no_key' => 'અમાનà«àª¯ <code>&lt;ref&gt;</code> ટેગ;
+નામ વગરના refs ને કાંઈક નામ તો હોવà«àª‚ જ જોઈàª',
+ 'cite_error_ref_too_many_keys' => 'અમાનà«àª¯ <code>&lt;ref&gt;</code> ચકતી;
+અમાનà«àª¯ નામો , દા.ત. ઘણાં બધાં',
+ 'cite_error_ref_no_input' => 'અમાનà«àª¯ <code>&lt;ref&gt;</code> ટેગ;
+નામ વગરના refs માં કાંઈક સામગà«àª°à«€ હોવી જોઈàª',
+ 'cite_error_references_invalid_parameters' => 'અમાનà«àª¯ <code>&lt;references&gt;</code> ટેગ;
+કોઈ પણ પરિમાણની પરવાનગી નથી.
+<code>&lt;references /&gt;</code> વાપરો',
+ 'cite_error_references_invalid_parameters_group' => 'અમાનà«àª¯ <code>&lt;references&gt;</code> ટેગ;
+માતà«àª° "group" પરિમાણની પરવાનગી છે.
+<code>&lt;references /&gt;</code> કે <code>&lt;references group="..." /&gt;</code> વાપરો',
+ 'cite_error_references_no_backlink_label' => 'કસà«àªŸàª® બેકલિંક લેબલ ખલાસ થઈ ગયાં.
+<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> સંદેશામાં વહારે લેબલ બનાવો..',
+ 'cite_error_no_link_label_group' => '"$1" સમૂહ માટે કસà«àªŸàª® બેકલિંક લેબલ ખલાસ થઈ ગયાં.
+<nowiki>[[MediaWiki:$2]]</nowiki> સંદેશામાં વહારે લેબલ બનાવો..',
+ 'cite_error_references_no_text' => 'અમાનà«àª¯ <code>&lt;ref&gt;</code> ટેગ;
+<code>$1</code>નામના સંદરà«àª­ માટે કોઈ પણ લેખન અપાયà«àª‚ નથી',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ટેગને બંધ કરતà«àª‚ <code>&lt;/ref&gt;</code> ખૂટે છે',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ટેગ અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ છે, પણ <code>&lt;references/&gt;</code> àªàªµà«‹ કોઈ ટેગ ન મળà«àª¯à«‹.',
+ 'cite_error_group_refs_without_references' => ' "$1" નામના સમૂહમાં <code>&lt;ref&gt;</code> ટેગ વિહરમાન છે, પણ તેને અનà«àª°à«‚પ <code>&lt;references group="$1"/&gt;</code> ટેગ ન મળà«àª¯à«‹.',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> ટેગને <code>&lt;references&gt;</code> માં આ વિરોધાભાસી લકà«àª·àª£ છે : "$1".',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>માં વà«àª¯àª¾àª–à«àª¯àª¾àª¯à«€àª¤ <code>&lt;ref&gt;</code> ટેગનો સમૂહ ગà«àª£ "$1" છે જે પહેલાંની પહેલાંના લેખનમાં નથી.',
+ 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> માં વà«àª¯àª¾àª–à«àª¯àª¾àª¯àª¿àª¤ $1" નામ સાથેનà«àª‚ <code>&lt;ref&gt;</code> ટેગ આગળના લેખનમાં વપરાયો નથી.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> ટેગની વà«àª¯àª¾àª–à«àª¯àª¾ <code>&lt;references&gt;</code> ને કોઈ નામકરણ નથી.',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> ટેગની વà«àª¯àª¾àª–à«àª¯àª¾ <code>&lt;references&gt;</code> માં "$1" નામે છે તેને કોઈ content નથી.',
+ 'cite_references_link_many_format_backlink_labels' => '',
+);
+
+/** Hebrew (עברית)
+ * @author Amire80
+ * @author Rotem Liss
+ * @author Rotemliss
+ * @author YaronSh
+ */
+$messages['he'] = array(
+ 'cite-desc' => 'הוספת תגי <span dir="ltr"><nowiki><ref[ name=id]></nowiki></span> ו־<span dir="ltr"><nowiki><references/></nowiki></span> עבור הערות שוליי×',
+ 'cite_croak' => 'ההרחבה Cite קרסה; $1: $2',
+ 'cite_error_key_str_invalid' => 'שגי××” פנימית;
+ערך ×œ× ×ª×§×™×Ÿ של <span dir="ltr">$str</span> ו/×ו <span dir="ltr">$key</span>.
+×–×” ×œ× ×מור לקרות לעול×.',
+ 'cite_error_stack_invalid_input' => 'שגי××” פנימית;
+מפתח מחסנית ×œ× ×ª×§×™×Ÿ.
+×–×” ×œ× ×מור לקרות לעול×.',
+ 'cite_error' => 'שגי×ת ציטוט: $1',
+ 'cite_error_ref_numeric_key' => 'תג <code>&lt;ref&gt;</code> ×œ× ×ª×§×™×Ÿ;
+×©× (name) ×œ× ×™×›×•×œ להיות מספר ×©×œ× ×¤×©×•×˜. יש להשתמש בכותרת תי×ורית',
+ 'cite_error_ref_no_key' => 'תג <code>&lt;ref&gt;</code> ×œ× ×ª×§×™×Ÿ;
+להערות ×©×•×œ×™×™× ×œ×œ× ×ª×•×›×Ÿ חייב להיות ×©× (name)',
+ 'cite_error_ref_too_many_keys' => 'תג <code>&lt;ref&gt;</code> ×œ× ×ª×§×™×Ÿ;
+שמות שגויי×, למשל, ×¨×‘×™× ×ž×“×™',
+ 'cite_error_ref_no_input' => 'תג <code>&lt;ref&gt;</code> ×œ× ×ª×§×™×Ÿ;
+להערות ×©×•×œ×™×™× ×œ×œ× ×©× ×—×™×™×‘ להיות תוכן',
+ 'cite_error_references_invalid_parameters' => 'תג <code>&lt;references&gt;</code> ×œ× ×ª×§×™×Ÿ;
+×œ× × ×™×ª×Ÿ להשתמש בפרמטרי×.
+יש להשתמש בקוד <code dir="ltr">&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'תג <code>&lt;references&gt;</code> ×œ× ×ª×§×™×Ÿ;
+רק הפרמטר "group" מותר לשימוש.
+×× × ×”×©×ª×ž×©×• בקוד <code dir="ltr">&lt;references /&gt;</code>, ×ו בקוד <code dir="ltr">&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => '×זלו תוויות ×”×§×™×©×•×¨×™× ×”×ž×•×ª×מות ×ישית.
+×× × ×”×’×“×™×¨×• עוד תוויות בהודעת המערכת <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
+ 'cite_error_no_link_label_group' => '×זלו תוויות ×§×™×©×•×¨×™× ×ž×•×ª×מות ×ישית לקבוצה "$1".
+הגדירו עוד תוויות בהודעת המערכת <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'תג <code>&lt;ref&gt;</code> ×œ× ×ª×§×™×Ÿ;
+×œ× × ×›×ª×‘ טקסט עבור הערות ×”×©×•×œ×™×™× ×‘×©× <code>$1</code>',
+ 'cite_error_included_ref' => 'חסר תג <code>&lt;/ref&gt;</code> סוגר שמת××™× ×œ×ª×’ <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => '×§×™×™×ž×™× ×ª×’×™ <code>&lt;ref&gt;</code>, ×ך ×œ× × ×ž×¦× ×ª×’ <code dir="ltr">&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => '×§×™×™×ž×™× ×ª×’×™ <code>&lt;ref&gt;</code> עבור קבוצה ×‘×©× "$1", ×ך ×œ× × ×ž×¦× ×ª×’ <code dir="ltr">&lt;references group="$1"/&gt;</code> מת××™×',
+ 'cite_error_references_group_mismatch' => 'לתג <code>&lt;ref&gt;</code> המוגדר בתוך <code>&lt;references&gt;</code> יש מ×פיין קבוצה (group) סותר, "$1".',
+ 'cite_error_references_missing_group' => 'לתג <code>&lt;ref&gt;</code> המוגדר בתוך <code>&lt;references&gt;</code> יש מ×פיין קבוצה (group) בעל הערך "$1", ש×ינו מופיע בטקסט שלפניו.',
+ 'cite_error_references_missing_key' => 'התג <code>&lt;ref&gt;</code> ×‘×©× "$1" המוגדר בתוך <code>&lt;references&gt;</code> ×ינו × ×ž×¦× ×‘×©×™×ž×•×© בטקסט שלפניו.',
+ 'cite_error_references_no_key' => 'לתג <code>&lt;ref&gt;</code> המוגדר בתוך <code>&lt;references&gt;</code> ×ין מ×פיין ×©× (name).',
+ 'cite_error_empty_references_define' => 'התג <code>&lt;ref&gt;</code> בעל ×”×©× "$1" המוגדר בתוך <code>&lt;references&gt;</code> ×ינו מכיל תוכן.',
+);
+
+/** Hindi (हिनà¥à¤¦à¥€)
+ * @author Ansumang
+ * @author Kaustubh
+ * @author Siddhartha Ghai
+ */
+$messages['hi'] = array(
+ 'cite-desc' => '<nowiki><ref[ name=id]></nowiki> और <nowiki><references/></nowiki> टैग जोड़ता है, उदà¥à¤§à¤°à¤£à¥‹à¤‚ के लिये।',
+ 'cite_croak' => 'संदरà¥à¤­ दे नहीं पाये; $1: $2',
+ 'cite_error_key_str_invalid' => 'आंतरà¥à¤—त गलती;
+गलत $str या/और $key।
+à¤à¤¸à¤¾ होना नहीं चाहियें।',
+ 'cite_error_stack_invalid_input' => 'आंतरà¥à¤—त गलती; गलत सà¥à¤Ÿà¥…क की। à¤à¤¸à¤¾ होना नहीं चाहियें।',
+ 'cite_error' => 'गलती उदà¥à¤˜à¥ƒà¤¤ करें: $1',
+ 'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> गलत कोड; नाम यह पूरà¥à¤£à¤¾à¤‚की संखà¥à¤¯à¤¾ नहीं हो सकता, कृपया माहितीपूरà¥à¤£ शीरà¥à¤·à¤• दें',
+ 'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> गलत कोड; खाली संदरà¥à¤­à¥‹à¤‚को नाम होना आवशà¥à¤¯à¤• हैं',
+ 'cite_error_ref_too_many_keys' => '<code>&lt;ref&gt;</code> गलत कोड; गलत नाम, उदा. ढेर सारी',
+ 'cite_error_ref_no_input' => 'अमानà¥à¤¯ <code>&lt;ref&gt;</code> टैग;
+नाम रहित संदरà¥à¤­à¥‹à¤‚ में जानकारी देना आवशà¥à¤¯à¤• है',
+ 'cite_error_references_invalid_parameters' => '<code>&lt;references&gt;</code> चà¥à¤•à¥€à¤šà¤¾ कोड; पॅरॅमीटरà¥à¤¸ नहीं दे सकते, <code>&lt;references /&gt;</code> का इसà¥à¤¤à¥‡à¤®à¤¾à¤² करें',
+ 'cite_error_references_invalid_parameters_group' => '<code>&lt;references&gt;</code> गलत कोड; सिरà¥à¤« पॅरॅमीटर का "गà¥à¤°à¥à¤ª" इसà¥à¤¤à¥‡à¤®à¤¾à¤² में लाया जा सकता हैं, <code>&lt;references /&gt;</code> या फिर <code>&lt;references group="..." /&gt;</code> का इसà¥à¤¤à¥‡à¤®à¤¾à¤² करें',
+ 'cite_error_references_no_backlink_label' => 'तैयार किये हà¥à¤ पीछे की कड़ियां देनेवाले नाम खतम हà¥à¤ हैं, अधिक नाम <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> इस संदेश में बढायें',
+ 'cite_error_no_link_label_group' => '"$1" संदरà¥à¤­ समूह के लिये विशिषà¥à¤Ÿ लिंक लेबल कम पड़ गà¤à¥¤
+<nowiki>[[MediaWiki:$2]]</nowiki> सनà¥à¤¦à¥‡à¤¶ में और लेबल परिभाषित करें।',
+ 'cite_error_references_no_text' => 'अमानà¥à¤¯ <code>&lt;ref&gt;</code> टैग;
+<code>$1</code> नामक संदरà¥à¤­ की जानकारी नहीं है',
+ 'cite_error_included_ref' => 'समापà¥à¤¤à¥€ <code>&lt;/ref&gt;</code> <code>&lt;ref&gt;</code> टैग लापता',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>टैग मौजूद हैं, किनà¥à¤¤à¥ कोई <code>&lt;references/&gt;</code>टैग नहीं मिला',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> टैग मौजूद है à¤à¤• दल के लिठइस नाम "$1" से, कीनतॠकोई अनà¥à¤°à¥‚प <code>&lt;references group="$1"/&gt;</code> टैग नहीं मिला',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> टैग इन <code>&lt;references&gt;</code> दल की विशेषता में संघरà¥à¤· "$1"।',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> टैग परिभाषित <code>&lt;references&gt;</code> में दलकी विशेषता है "$1" जो पूरà¥à¤µ लेख में दिखाई नहीं दिया ।',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> टैग इस नाम "$1" सहित परिभाषित <code>&lt;references&gt;</code> पूरà¥à¤µ लेख में उपयोग नहीं हà¥à¤ˆ ।',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> टैग में परिभाषित <code>&lt;references&gt;</code> कोई नाम विशेषता नहीं ।',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> टैग में परिभाषित <code>&lt;references&gt;</code> नाम सहित "$1" कोई सामगà¥à¤°à¥€ नहीं ।',
+);
+
+/** Croatian (hrvatski)
+ * @author Dalibor Bosits
+ * @author Dnik
+ * @author Roberta F.
+ * @author SpeedyGonsales
+ */
+$messages['hr'] = array(
+ 'cite-desc' => 'Dodaje <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki> oznake, za citiranje',
+ 'cite_croak' => 'Nevaljan citat; $1: $2',
+ 'cite_error_key_str_invalid' => 'Unutarnja pogrješka: loš $str i/ili $key. Ovo se nikada ne bi smjelo dogoditi.',
+ 'cite_error_stack_invalid_input' => 'Unutarnja pogrjeÅ¡ka; loÅ¡ kljuÄ stacka. Ovo se nikada ne bi smjelo dogoditi.',
+ 'cite_error' => 'Pogrješka u citiranju: $1',
+ 'cite_error_ref_numeric_key' => 'Loša <code>&lt;ref&gt;</code> oznaka; naziv ne smije biti jednostavni broj, koristite opisni naziv',
+ 'cite_error_ref_no_key' => 'Loša <code>&lt;ref&gt;</code> oznaka; ref-ovi bez sadržaja moraju imati naziv',
+ 'cite_error_ref_too_many_keys' => 'Loša <code>&lt;ref&gt;</code> oznaka; loš naziv, npr. previše naziva',
+ 'cite_error_ref_no_input' => 'Loša <code>&lt;ref&gt;</code> oznaka; ref-ovi bez imena moraju imati sadržaj',
+ 'cite_error_references_invalid_parameters' => 'Loša <code>&lt;references&gt;</code> oznaka; parametri nisu dozvoljeni, koristite <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Neispravna <code>&lt;references&gt;</code> oznaka;
+Dopuštena je samo opcija "group".
+Koristite <code>&lt;references /&gt;</code>, ili <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Potrošene sve posebne oznake za poveznice unatrag, definirajte više u poruci <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Nedovoljan broj proizvoljnih naslova poveznica za grupu "$1".
+Definirajte više putem poruke <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Nije zadan tekst za izvor <code>$1</code>',
+ 'cite_error_included_ref' => 'Nedostaje zatvarajući <code>&lt;/ref&gt;</code> za <code>&lt;ref&gt;</code> oznaku',
+ 'cite_error_refs_without_references' => 'oznake <code>&lt;ref&gt;</code> postoje, ali oznaka <code>&lt;references/&gt;</code> nije pronađena',
+ 'cite_error_group_refs_without_references' => 'oznake <code>&lt;ref&gt;</code> postoje za skupinu imenovanom "$1", ali nema pripadajuće oznake <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> oznaka u <code>&lt;references&gt;</code> ima konfliktni grupni atribut "$1".',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> oznaka definirana u <code>&lt;references&gt;</code> ima grupni atribut "$1" koji se ne pojavljuje u ranijem tekstu.',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> oznaka s imenom "$1" definirana u <code>&lt;references&gt;</code> nije prethodno rabljena u tekstu.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> oznaka definirana u <code>&lt;references&gt;</code> nema parametar "name" (ime).',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> oznaka definirana u <code>&lt;references&gt;</code> s imenom "$1" nema sadržaja.',
+);
+
+/** Upper Sorbian (hornjoserbsce)
+ * @author Michawiki
+ */
+$messages['hsb'] = array(
+ 'cite-desc' => 'PÅ™idawa tafliÄki <nowiki><ref[ name=id]></nowiki> a <nowiki><references /></nowiki> za žórÅ‚owe podaća',
+ 'cite_croak' => 'Zmylk w referencnym systemje; $1: $2',
+ 'cite_error_key_str_invalid' => 'Interny zmylk: njepłaćiwy $str a/abo $key. To njeměło ženje wustupić.',
+ 'cite_error_stack_invalid_input' => 'Interny zmylk; njepÅ‚aćiwy kluÄ staploweho skÅ‚ada. To njeměło ženje wustupić.',
+ 'cite_error' => 'Referencny zmylk: $1',
+ 'cite_error_ref_numeric_key' => 'NjepÅ‚aćiwe wužiwanje tafliÄki <code>&lt;ref&gt;</code>; "name" njesmÄ› jednora hódnota integer być, wužij wopisowace mjeno.',
+ 'cite_error_ref_no_key' => 'NjepÅ‚aćiwe wužiwanje tafliÄki <code>&lt;ref&gt;</code>; "ref" bjez wobsaha dyrbi mjeno měć.',
+ 'cite_error_ref_too_many_keys' => 'NjepÅ‚aćiwe wužiwanje tafliÄki <code>&lt;ref&gt;</code>; njepÅ‚aćiwe mjena, na pÅ™. pÅ™edoÅ‚ho',
+ 'cite_error_ref_no_input' => 'NjepÅ‚aćiwe wužiwanje tafliÄki <code>&lt;ref&gt;</code>; "ref" bjez mjena dyrbi wobsah měć',
+ 'cite_error_references_invalid_parameters' => 'NjepÅ‚aćiwe wužiwanje tafliÄki <code>&lt;references&gt;</code>; žane parametry dowolene, wužij jenož <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'NjepÅ‚aćiwa tafliÄka <code>&lt;references&gt;</code>;
+jenož parameter "group" je dowoleny.
+Wužij <code>&lt;references /&gt;</code> abo <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'ZwuÄene etikety wróćowotkazow wućerpjene.
+Definuj wjace w powěsći <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Swójske wotkazowe etikety za skupinu "$1" hižo njejsu.
+Definuj dalše w zdźělence <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Njepłaćiwa referenca formy <code>&lt;ref&gt;</code>; žadyn tekst za referency z mjenom <code>$1</code> podaty.',
+ 'cite_error_included_ref' => 'KónÄny <code>&lt;/ref&gt;</code> za tafliÄku <code>&lt;ref&gt;</code> faluje',
+ 'cite_error_refs_without_references' => 'TafliÄki <code>&lt;ref&gt;</code> ekistuja, ale žana tafliÄka code>&lt;references/&gt;</code> je so namakaÅ‚a',
+ 'cite_error_group_refs_without_references' => 'TafliÄki <code>&lt;ref&gt;</code> eksistuja za skupinu z mjenom "$1", ale njeje so wotpowÄ›dowaca tafliÄka <code>&lt;references group="$1"/&gt;</code> namakaÅ‚a',
+ 'cite_error_references_group_mismatch' => 'TafliÄka <code>&lt;ref&gt;</code> w <code>&lt;references&gt;</code> je ze skupinskim atributom "$1" w konflikće.',
+ 'cite_error_references_missing_group' => 'TafliÄka <code>&lt;ref&gt;</code>, kotraž je w <code>&lt;references&gt;</code> definowana, ma skupinski atribut "$1", kotryž so w prjedawÅ¡im teksće njejewi.',
+ 'cite_error_references_missing_key' => 'TafliÄka <code>&lt;ref&gt;</code> z mjenom "$1", kotraž je w <code>&lt;references&gt;</code> definowana, so w prjedawÅ¡im teksće njewužiwa.',
+ 'cite_error_references_no_key' => 'TafliÄka <code>&lt;ref&gt;</code>, kotraž je w <code>&lt;references&gt;</code> definowana, mjenowy atribut nima.',
+ 'cite_error_empty_references_define' => 'TafliÄka <code>&lt;ref&gt;</code>, kotraž je w <code>&lt;references&gt;</code> z mjenom "$1" definowana, wobsah nima.',
+);
+
+/** Haitian (Kreyòl ayisyen)
+ * @author Boukman
+ * @author Masterches
+ */
+$messages['ht'] = array(
+ 'cite-desc' => 'Ajoute baliz sa yo <nowiki><ref[ name=id]></nowiki> epi <nowiki><referans/></nowiki>, pou sitasyon yo.',
+ 'cite_croak' => 'Sitasyon sa pa bon ; $1 : $2',
+ 'cite_error_key_str_invalid' => 'Erè nan sistèm an;
+$str epi/oubyen $key pa valab.
+Erè sa pa ta janm dwe rive.',
+ 'cite_error_stack_invalid_input' => 'Erè nan sistèm an ;
+kle pil an pa valab.
+Sa pa ta janm dwe rive.',
+ 'cite_error' => 'Erè nan sitasyon : $1',
+ 'cite_error_ref_numeric_key' => 'Etikèt <code>&lt;ref&gt;</code> pa valab;
+non pa kapab yon nimewo. Itilize yon tit ki dekri bagay la.',
+ 'cite_error_ref_no_key' => 'Etikèt <code>&lt;ref&gt;</code> pa valab;
+referans ki pa genyen anyen ladan l dwe gen yon non',
+ 'cite_error_ref_too_many_keys' => 'Etikèt <code>&lt;ref&gt;</code> pa valab;
+non yo pa bon (pa ekzanp, genyen trop)',
+ 'cite_error_ref_no_input' => 'Etikèt <code>&lt;ref&gt;</code> pa valab;
+referans ki pa gen non dwe gen kontni nan yo',
+ 'cite_error_references_invalid_parameters' => 'Etikèt <code>&lt;references&gt;</code> pa valab;
+pa gendwa mete paramèt.
+Itilize <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Etikèt <code>&lt;referans&gt;</code> pa valab;
+se paramèt "group" sèlman ki otorize.
+Itilize <code>&lt;references /&gt;</code>, oubyen <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Pa genyen etikèt pèsonalize ankò.
+Presize yon kantite ki pi gwo nan mesaj <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_references_no_text' => 'Etikèt <code>&lt;ref&gt;</code> pa valab;
+Nou pa bay pyès tèks pou referans ki rele <code>$1</code>',
+);
+
+/** Hungarian (magyar)
+ * @author Dani
+ * @author Glanthor Reviol
+ * @author KossuthRad
+ */
+$messages['hu'] = array(
+ 'cite-desc' => 'Lehetővé teszi idézések létrehozását <nowiki><ref[ name=id]></nowiki> és <nowiki><references/></nowiki> tagek segítségével',
+ 'cite_croak' => 'Sikertelen forráshivatkozás; $1: $2',
+ 'cite_error_key_str_invalid' => 'Belső hiba; érvénytelen $str és/vagy $key. Ennek soha nem kellene előfordulnia.',
+ 'cite_error_stack_invalid_input' => 'Belső hiba; érvénytelen kulcs. Ennek soha nem kellene előfordulnia.',
+ 'cite_error' => 'Forráshivatkozás-hiba: $1',
+ 'cite_error_ref_numeric_key' => 'Érvénytelen <code>&lt;ref&gt;</code> tag; a name értéke nem lehet csupán egy szám, használj leíró címeket',
+ 'cite_error_ref_no_key' => 'Érvénytelen <code>&lt;ref&gt;</code> tag; a tartalom nélküli ref-eknek kötelező nevet (name) adni',
+ 'cite_error_ref_too_many_keys' => 'Érvénytelen <code>&lt;ref&gt;</code> tag; hibás nevek, pl. túl sok',
+ 'cite_error_ref_no_input' => 'Érvénytelen <code>&lt;ref&gt;</code> tag; a név (name) nélküli ref-eknek adni kell valamilyen tartalmat',
+ 'cite_error_references_invalid_parameters' => 'Érvénytelen <code>&lt;references&gt;</code> tag; nincsenek paraméterei, használd a <code>&lt;references /&gt;</code> formát',
+ 'cite_error_references_invalid_parameters_group' => 'Érvénytelen <code>&lt;references&gt;</code> tag; csak a „group†attribútum használható. Használd a <code>&lt;references /&gt;</code>, vagy a <code>&lt;references group="..." /&gt;</code> formát.',
+ 'cite_error_references_no_backlink_label' => 'Elfogytak a visszahivatkozásra használt címkék, adj meg többet a <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> üzenetben',
+ 'cite_error_no_link_label_group' => 'Nincs több egyedi címke a következÅ‘ csoport számára: „$1â€.
+Adj meg többet a <nowiki>[[MediaWiki:$2]]</nowiki> lapon.',
+ 'cite_error_references_no_text' => 'Érvénytelen <code>&lt;ref&gt;</code> tag; nincs megadva szöveg a(z) <code>$1</code> nevű ref-eknek',
+ 'cite_error_included_ref' => 'Egy <code>&lt;ref&gt;</code> tag lezáró <code>&lt;/ref&gt;</code> része hiányzik',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-ek vannak a lapon, de nincsen <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-ek léteznek a(z) „$1†csoporthoz, de nincs hozzá <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'A <code>&lt;references&gt;</code> és a benne található <code>&lt;ref&gt;</code> tag csoport-attribútuma („$1â€) nem egyezik meg.',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> tag lett lett definiálva egy olyan <code>&lt;references&gt;</code> tagben, amely csoport-attribútuma („$1â€) nem szerepel a szöveg korábbi részében.',
+ 'cite_error_references_missing_key' => 'a <code>&lt;references&gt;</code> tagben definiált „$1†nevű <code>&lt;ref&gt;</code> tag nem szerepel a szöveg korábbi részében.',
+ 'cite_error_references_no_key' => 'a <code>&lt;references&gt;</code> tagben definiált <code>&lt;ref&gt;</code> tagnek nincs név attribútuma.',
+ 'cite_error_empty_references_define' => 'a <code>&lt;references&gt;</code> szakaszban definiált „$1†<code>&lt;ref&gt;</code> tagnek nincs tartalma.',
+ 'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink">^ $2</span> $3</li>',
+);
+
+/** Interlingua (interlingua)
+ * @author McDutchie
+ */
+$messages['ia'] = array(
+ 'cite-desc' => 'Adde etiquettas <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki>, pro citationes',
+ 'cite_croak' => 'Citation corrumpite; $1: $2',
+ 'cite_error_key_str_invalid' => 'Error interne;
+clave $str e/o $key invalide.
+Isto non deberea jammais occurrer.',
+ 'cite_error_stack_invalid_input' => 'Error interne;
+clave de pila invalide.
+Isto non deberea jammais occurrer.',
+ 'cite_error' => 'Error de citation: $1',
+ 'cite_error_ref_numeric_key' => 'Etiquetta <code>&lt;ref&gt;</code> invalide;
+le nomine non pote esser un numero integre. Usa un titulo descriptive',
+ 'cite_error_ref_no_key' => 'Etiquetta <code>&lt;ref&gt;</code> invalide;
+le refs sin contento debe haber un nomine',
+ 'cite_error_ref_too_many_keys' => 'Etiquetta <code>&lt;ref&gt;</code> invalide;
+nomines invalide, p.ex. troppo de nomines',
+ 'cite_error_ref_no_input' => 'Etiquetta <code>&lt;ref&gt;</code> invalide;
+le refs sin nomine debe haber contento',
+ 'cite_error_references_invalid_parameters' => 'Etiquetta <code>&lt;references&gt;</code> invalide;
+nulle parametros es permittite.
+Usa <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Etiquetta <code>&lt;references&gt;</code> invalide;
+solmente le parametro "group" es permittite.
+Usa <code>&lt;references /&gt;</code>, o <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Le etiquettas de retroligamine personalisate es exhaurite.
+Defini plus in le message <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Exhauriva le etiquettas de ligamine personalisabile pro le gruppo "$1".
+Defini plus de istes in le message <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Etiquetta <code>&lt;ref&gt;</code> invalide;
+nulle texto esseva fornite pro le refs nominate <code>$1</code>',
+ 'cite_error_included_ref' => 'Le clausura <code>&lt;/ref&gt;</code> manca pro le etiquetta <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Il existe etiquettas <code>&lt;ref&gt;</code>, ma nulle etiquetta <code>&lt;references/&gt;</code> ha essite trovate',
+ 'cite_error_group_refs_without_references' => 'Il existe etiquettas <code>&lt;ref&gt;</code> pro un gruppo nominate "$1", ma nulle etiquetta <code>&lt;references group="$1"/&gt;</code> correspondente ha essite trovate',
+ 'cite_error_references_group_mismatch' => 'Le etiquetta <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> ha un attributo de gruppo "$1" confligente.',
+ 'cite_error_references_missing_group' => 'Le etiquetta <code>&lt;ref&gt;</code> definite in <code>&lt;references&gt;</code> ha un attributo de gruppo "$1" que non appare in le texto precedente.',
+ 'cite_error_references_missing_key' => 'Le etiquetta <code>&lt;ref&gt;</code> con nomine "$1" definite in <code>&lt;references&gt;</code> non es usate in le texto precedente.',
+ 'cite_error_references_no_key' => 'Le etiquetta <code>&lt;ref&gt;</code> definite in <code>&lt;references&gt;</code> non ha un attributo de nomine.',
+ 'cite_error_empty_references_define' => 'Le etiquetta <code>&lt;ref&gt;</code> definite in <code>&lt;references&gt;</code> con nomine "$1" ha nulle contento.',
+);
+
+/** Indonesian (Bahasa Indonesia)
+ * @author Bennylin
+ * @author Irwangatot
+ * @author IvanLanin
+ * @author Iwan Novirion
+ * @author Rex
+ */
+$messages['id'] = array(
+ 'cite-desc' => 'Menambahkan tag <nowiki><ref[ name=id]></nowiki> dan <nowiki><references/></nowiki> untuk kutipan',
+ 'cite_croak' => 'Kegagalan pengutipan; $1: $2',
+ 'cite_error_key_str_invalid' => 'Kesalahan internal;
+$str dan/atau $key tidak sah.
+Kesalahan ini seharusnya tidak terjadi.',
+ 'cite_error_stack_invalid_input' => "Kesalahan internal;
+kunci ''stack'' tak sah.
+Kesalahan ini seharusnya tidak terjadi.",
+ 'cite_error' => 'Kesalahan pengutipan: $1',
+ 'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> tidak sah;
+nama tidak boleh intejer sederhana.
+Gunakan nama deskriptif',
+ 'cite_error_ref_no_key' => 'Tag <code>&lt;ref&gt;</code> tidak sah;
+referensi tanpa isi harus memiliki nama',
+ 'cite_error_ref_too_many_keys' => 'Tag <code>&lt;ref&gt;</code> tidak sah;
+nama tidak sah; misalnya, terlalu banyak',
+ 'cite_error_ref_no_input' => 'Tag <code>&lt;ref&gt;</code> tidak sah;
+referensi tanpa nama harus memiliki isi',
+ 'cite_error_references_invalid_parameters' => 'Tag <code>&lt;references&gt;</code> tidak sah;
+parameter tidak diperbolehkan.
+Gunakan <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Tag <code>&lt;references&gt;</code> tidak sah;
+hanya parameter "group" yang diizinkan.
+Gunakan <code>&lt;references /&gt;</code>, atau <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Kehabisan label pralana balik tersuai.
+Tambahkan lagi di pesan sistem <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Pranala kustom label untuk kelompok "$1" habis.
+Tambahkan ketentuan dalam pesan <nowiki> [[MediaWiki:$2]] </nowiki> .',
+ 'cite_error_references_no_text' => 'Tag <code>&lt;ref&gt;</code> tidak sah;
+tidak ditemukan teks untuk ref bernama <code>$1</code>',
+ 'cite_error_included_ref' => 'Tag <code>&lt;ref&gt;</code> harus ditutup oleh <code>&lt;/ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ditemukan, tapi tag <code>&lt;references/&gt;</code> tidak ditemukan',
+ 'cite_error_group_refs_without_references' => 'Ditemukan tag <code>&lt;ref&gt;</code> untuk kelompok bernama "$1", tapi tidak ditemukan tag <code>&lt;references group="$1"/&gt;</code> yang berkaitan',
+ 'cite_error_references_group_mismatch' => 'Tag <code>&lt;ref&gt;</code> di <code>&lt;references&gt;</code> ada atribut kelompok "$1" yang konflik.',
+ 'cite_error_references_missing_group' => 'Tag <code>&lt;ref&gt;</code> yang didefinisikan di <code>&lt;references&gt;</code> memiliki atribut kelompok "$1" yang tidak ditampilkan di teks sebelumnya.',
+ 'cite_error_references_missing_key' => 'Tag <code>&lt;ref&gt;</code> dengan nama "$1" yang didefinisikan di <code>&lt;references&gt;</code> tidak digunakan pada teks sebelumnya.',
+ 'cite_error_references_no_key' => 'Tag <code>&lt;ref&gt;</code> yang didefinisikan di di <code>&lt;references&gt;</code> tidak memiliki nama atribut.',
+ 'cite_error_empty_references_define' => 'Tag <code>&lt;ref&gt;</code> yang didefinisikan di di <code>&lt;references&gt;</code> dengan nama "$1" tidak memiliki isi.',
+ 'cite_references_link_many_format' => '<sup>[[#$1|$2]]</sup>',
+);
+
+/** Igbo (Igbo)
+ * @author Ukabia
+ */
+$messages['ig'] = array(
+ 'cite-desc' => 'Tikwá <nowiki><ref[ áhà=id]></nowiki> and <nowiki><references/></nowiki> ndö, maka ntabi okwu',
+ 'cite_croak' => 'Nchápụ nwụrụ; $1: $2',
+);
+
+/** Iloko (Ilokano)
+ * @author Lam-ang
+ */
+$messages['ilo'] = array(
+ 'cite-desc' => 'Agnayon ti <nowiki><ref[ name=id]></nowiki> ken <nowiki><references/></nowiki> nga etiketa, para kadagiti pagdakamat',
+ 'cite_croak' => 'Natay ti dakamat; $1: $2',
+ 'cite_error_key_str_invalid' => 'Akin-uneg a biddut;
+imbalido $str ken/ wenno $tulbek.
+Daytoy ket saan kuman a napasamak.',
+ 'cite_error_stack_invalid_input' => 'Akin-uneg a biddut;
+imbalido a tuon a tulbek.
+Daytoy ket saan kuman a napasamak.',
+ 'cite_error' => 'Biddut ti dakamat: $1',
+ 'cite_error_ref_numeric_key' => 'Imbalido a <code>&lt;ref&gt;</code> nga etiketa;
+ti nagan ket saan a mabalin a nalaka a sibubukel. Agusar ti agipalpalawag a titulo',
+ 'cite_error_ref_no_key' => 'Imbalido a <code>&lt;ref&gt;</code> nga etiketa;
+dagita ref nga awan nagyan na ket masapul a managanan',
+ 'cite_error_ref_too_many_keys' => 'Imbalido a <code>&lt;ref&gt;</code> nga etiketa;
+imbalido a nag-nagan, a kas adu unay',
+ 'cite_error_ref_no_input' => 'Imbalido a <code>&lt;ref&gt;</code> nga etiketa;
+dagiti ref nga awan ti nagan na ket masapul nga addaan ti nagyan',
+ 'cite_error_references_invalid_parameters' => 'Imbalido a <code>&lt;references&gt;</code> nga etiketa
+awan dagiti parametro a maipalubos.
+Usaren ti <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Imbalido a <code>&lt;references&gt;</code> nga etiketa;
+parametro a "bunggoy" ket ti maipalubos laeng.
+Usaren ti <code>&lt;references /&gt;</code> , wenno<code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Naibusan kadagiti nagrunaan a likud ti panilpo nga etiketa.
+Ipalawag pay ti adu idiay <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> a mensahe',
+ 'cite_error_no_link_label_group' => 'Naibusan ti nangruna a panilpo nga etiketa para iti bunggoy ti "$1".
+Ipalawag pay ti adu idiay <nowiki>[[MediaWiki:$2]]</nowiki> a mensahe.',
+ 'cite_error_references_no_text' => 'Imbalido a <code>&lt;ref&gt;</code> nga etiketa;
+awan ti testo a naited para dagiti ref a nanaganan <code>$1</code>',
+ 'cite_error_included_ref' => 'Irikrikep ti <code>&lt;/ref&gt;</code> napukaw para iti <code>&lt;ref&gt;</code> nga etiketa',
+ 'cite_error_refs_without_references' => 'Ti <code>&lt;ref&gt;</code> nga etiketa ket addaan, ngem awan ti <code>&lt;references/&gt;</code> nga etiketa a nabirukan',
+ 'cite_error_group_refs_without_references' => 'Ti <code>&lt;ref&gt;</code> nga etiketa para iti bunggoy a nainaganan "$1", ngem awan ti kapadpada a <code>&lt;references group="$1"/&gt;</code> nga etiketa a nabirukan',
+ 'cite_error_references_group_mismatch' => 'Ti <code>&lt;ref&gt;</code> nga etiketa iday <code>&lt;references&gt;</code> ket addan ti nagsungat a gupit ti bunggoy "$1".',
+ 'cite_error_references_missing_group' => 'Ti <code>&lt;ref&gt;</code> nga etiketa a naipalawag idiay <code>&lt;references&gt;</code> ket addaan ti gupit ti bunggoy "$1" a saan nga agparang iti napalabas a testo.',
+ 'cite_error_references_missing_key' => 'Ti <code>&lt;ref&gt;</code> nga etiketa nga addaan ti nagan "$1" a naipalawag idiay <code>&lt;references&gt;</code> ket saan a nausar iti napalabas a testo.',
+ 'cite_error_references_no_key' => 'Ti <code>&lt;ref&gt;</code> nga etiketa a naipalawag idiay <code>&lt;references&gt;</code> ket awan ti nainagan a gupit.',
+ 'cite_error_empty_references_define' => 'Ti <code>&lt;ref&gt;</code> nga etiketa a naipalawag idiay <code>&lt;references&gt;</code> nga addaan ti nagan a "$1" ket awan ti nagyan na.',
+);
+
+/** Ido (Ido)
+ * @author Malafaya
+ */
+$messages['io'] = array(
+ 'cite_croak' => 'Cite mortis; $1: $2',
+ 'cite_error' => 'Citala eroro: $1',
+);
+
+/** Icelandic (íslenska)
+ * @author Snævar
+ */
+$messages['is'] = array(
+ 'cite_error_key_str_invalid' => 'Innri villa;
+ógild $str og/eða $key.
+Þetta ætti aldrei að gerast.',
+ 'cite_error_stack_invalid_input' => 'Innri villa;
+ógildur stafla lykill.
+Þetta ætti aldrei að gerast.',
+ 'cite_error' => 'Tilvísunar villa: $1',
+ 'cite_error_ref_numeric_key' => 'Villa í <code>&lt;ref&gt;</code> tag;
+nafn tilvísunar má ekki vera heil tala. Notaðu lýsandi titil',
+ 'cite_error_ref_no_key' => 'Villa í <code>&lt;ref&gt;</code> tag;
+tilvísunin verður annaðhvort að hafa nafn eða innihald.',
+ 'cite_error_ref_too_many_keys' => 'Villa í <code>&lt;ref&gt;</code> tag;
+ógilt nafn, t.d. of mörg',
+ 'cite_error_ref_no_input' => 'Villa í <code>&lt;ref&gt;</code> tag;
+tilvísunin verður annaðhvort að hafa nafn eða innihald.',
+ 'cite_error_references_invalid_parameters' => 'Villa í <code>&lt;ref&gt;</code> tag;
+engir stikar eru leyfðir
+Notaðu <code>&lt;references /&gt;</code> í staðinn',
+ 'cite_error_references_invalid_parameters_group' => 'Villa í <code>&lt;ref&gt;</code> tag;
+aðeins einn stiki er leyfður, "group"
+Notaðu <code>&lt;references /&gt;</code> eða <code>&lt;references group="..." /&gt;</code> í staðinn.',
+ 'cite_error_references_no_text' => 'Villa í <code>&lt;ref&gt;</code> tag;
+tilgreindu texta fyrir tilvísun með nafnið <code>$1</code>',
+ 'cite_error_included_ref' => 'Loka þarf tilvísunni með <code>&lt;/ref&gt;</code> tagi',
+ 'cite_error_refs_without_references' => 'Bæta þarf <code>&lt;references/&gt;</code> við',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> tag er til fyrir hóp tilvísana undir nafninu "$1", en ekkert sambærilegt <code>&lt;references group="$1"/&gt;</code> tag fannst',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> tag í <code>&lt;references&gt;</code> stangast á við hópa eigindið "$1".',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> tag skilgreint í <code>&lt;references&gt;</code> hefur hópa eigindið "$1" sem birtist ekki í textanum á undan.',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> tag með nafnið "$1" og er skilgreint í <code>&lt;references&gt;</code> er ekki notað í textanum á undan.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> tag skilgreint í <code>&lt;references&gt;</code> hefur engin nafna eigindi.',
+ 'cite_error_empty_references_define' => 'Bæta þarf innihaldi við tilvísun með nafnið "$1".',
+);
+
+/** Italian (italiano)
+ * @author Beta16
+ * @author BrokenArrow
+ * @author Darth Kule
+ * @author Erdemaslancan
+ * @author Pietrodn
+ */
+$messages['it'] = array(
+ 'cite-desc' => 'Aggiunge i tag <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> per gestire le citazioni',
+ 'cite_croak' => 'Errore nella citazione: $1: $2',
+ 'cite_error_key_str_invalid' => 'Errore interno;
+$str e/o $key errati.
+Non dovrebbe mai verificarsi.',
+ 'cite_error_stack_invalid_input' => 'Errore interno:
+chiave di stack errata.
+Non dovrebbe mai verificarsi.',
+ 'cite_error' => 'Errore nella funzione Cite: $1',
+ 'cite_error_ref_numeric_key' => "Errore nell'uso del marcatore <code>&lt;ref&gt;</code>: il nome non può essere un numero intero. Usare un titolo esteso",
+ 'cite_error_ref_no_key' => "Errore nell'uso del marcatore <code>&lt;ref&gt;</code>: i ref vuoti non possono essere privi di nome",
+ 'cite_error_ref_too_many_keys' => "Errore nell'uso del marcatore <code>&lt;ref&gt;</code>: nomi non validi (ad es. numero troppo elevato)",
+ 'cite_error_ref_no_input' => "Errore nell'uso del marcatore <code>&lt;ref&gt;</code>: i ref privi di nome non possono essere vuoti",
+ 'cite_error_references_invalid_parameters' => "Errore nell'uso del marcatore <code>&lt;references&gt;</code>: parametri non ammessi, usare il marcatore <code>&lt;references /&gt;</code>",
+ 'cite_error_references_invalid_parameters_group' => 'Errore nell\'uso del marcatore <code>&lt;references&gt;</code>;
+solo il parametro "group" è permesso.
+Usare <code>&lt;references /&gt;</code> oppure <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Etichette di rimando personalizzate esaurite, aumentarne il numero nel messaggio <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Etichette esaurite per collegamenti personalizzati del gruppo "$1", aumentarne il numero nel messaggio <nowiki>[[MediaWiki:$2]]</nowiki>',
+ 'cite_error_references_no_text' => 'Marcatore <code>&lt;ref&gt;</code> non valido; non è stato indicato alcun testo per il marcatore <code>$1</code>',
+ 'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> di chiusura mancante per il marcatore <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Sono presenti dei marcatori <code>&lt;ref&gt;</code> ma non è stato trovato alcun marcatore <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Sono presenti dei marcatori <code>&lt;ref&gt;</code> per un gruppo chiamato "$1" ma non è stato trovato alcun marcatore <code>&lt;references group="$1"/&gt;</code> corrispondente',
+ 'cite_error_references_group_mismatch' => 'Il tag <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> ha attributo gruppo "$1" in conflitto.',
+ 'cite_error_references_missing_group' => 'Il tag <code>&lt;ref&gt;</code> definito in <code>&lt;references&gt;</code> ha un attributo gruppo "$1" che non compare nel testo precedente.',
+ 'cite_error_references_missing_key' => 'Il tag <code>&lt;ref&gt;</code> con nome "$1" definito in <code>&lt;references&gt;</code> non è usato nel testo precedente.',
+ 'cite_error_references_no_key' => 'Il tag <code>&lt;ref&gt;</code> definito in <code>&lt;references&gt;</code> non ha un attributo nome.',
+ 'cite_error_empty_references_define' => 'Il tag <code>&lt;ref&gt;</code> definito in <code>&lt;references&gt;</code> con nome "$1" non ha alcun contenuto.',
+);
+
+/** Japanese (日本語)
+ * @author Aotake
+ * @author Ficell
+ * @author Fryed-peach
+ * @author JtFuruhata
+ * @author Shirayuki
+ */
+$messages['ja'] = array(
+ 'cite-desc' => '引用ã®ãŸã‚ã®ã‚¿ã‚° <nowiki><ref[ name=id]></nowiki> ãŠã‚ˆã³ <nowiki><references/></nowiki> を追加ã™ã‚‹',
+ 'cite_croak' => '引用機能ã®ã‚¨ãƒ©ãƒ¼ã€‚$1: $2',
+ 'cite_error_key_str_invalid' => '内部エラーã§ã™ã€‚
+$str 㨠$key ã®ä¸¡æ–¹ã¾ãŸã¯ä¸€æ–¹ãŒç„¡åŠ¹ã§ã™ã€‚
+ã“ã‚Œã¯ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒã‚°ã§ã™ã€‚',
+ 'cite_error_stack_invalid_input' => '内部エラーã§ã™ã€‚
+スタック キーãŒç„¡åŠ¹ã§ã™ã€‚
+ã“ã‚Œã¯ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒã‚°ã§ã™ã€‚',
+ 'cite_error' => '引用エラー: $1',
+ 'cite_error_ref_numeric_key' => '無効㪠<code>&lt;ref&gt;</code> ã‚¿ã‚°ã§ã™ã€‚
+åå‰ (name 属性) ã«å˜ãªã‚‹æ•´æ•°ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。説明的ãªã‚‚ã®ã«ã—ã¦ãã ã•ã„',
+ 'cite_error_ref_no_key' => '無効㪠<code>&lt;ref&gt;</code> ã‚¿ã‚°ã§ã™ã€‚
+引用å¥ã®å†…容ãŒãªã„å ´åˆã¯åå‰ (name 属性) ãŒå¿…è¦ã§ã™',
+ 'cite_error_ref_too_many_keys' => '無効㪠<code>&lt;ref&gt;</code> ã‚¿ã‚°ã§ã™ã€‚
+åå‰ (name 属性) ãŒç„¡åŠ¹ã§ã™ (æ•°ãŒå¤šã™ãŽã‚‹ã€ãªã©)',
+ 'cite_error_ref_no_input' => '無効㪠<code>&lt;ref&gt;</code> ã‚¿ã‚°ã§ã™ã€‚
+åå‰ (name 属性) ãŒãªã„å ´åˆã¯å¼•ç”¨å¥ã®å†…容ãŒå¿…è¦ã§ã™',
+ 'cite_error_references_invalid_parameters' => '無効㪠<code>&lt;references&gt;</code> ã‚¿ã‚°ã§ã™ã€‚
+引数ã¯æŒ‡å®šã§ãã¾ã›ã‚“。
+<code>&lt;references /&gt;</code> を使用ã—ã¦ãã ã•ã„',
+ 'cite_error_references_invalid_parameters_group' => '無効㪠<code>&lt;references&gt;</code> ã‚¿ã‚°ã§ã™ã€‚
+使用ã§ãる引数ã¯ã€Œgroupã€ã®ã¿ã§ã™ã€‚
+<code>&lt;references /&gt;</code> ã¾ãŸã¯ <code>&lt;references group="..." /&gt;</code> を使用ã—ã¦ãã ã•ã„',
+ 'cite_error_references_no_backlink_label' => 'カスタム ãƒãƒƒã‚¯ãƒªãƒ³ã‚¯ ラベルを使ã„æžœãŸã—ã¾ã—ãŸã€‚
+<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> メッセージã§ã®å®šç¾©ã‚’増やã—ã¦ãã ã•ã„。',
+ 'cite_error_no_link_label_group' => 'グループ「$1ã€ç”¨ã®ã‚«ã‚¹ã‚¿ãƒ  リンク ラベルを使ã„æžœãŸã—ã¾ã—ãŸã€‚
+<nowiki>[[MediaWiki:$2]]</nowiki> メッセージを編集ã—ã¦ãƒ©ãƒ™ãƒ«ã®å®šç¾©ã‚’増やã—ã¦ãã ã•ã„。',
+ 'cite_error_references_no_text' => '無効㪠<code>&lt;ref&gt;</code> ã‚¿ã‚°ã§ã™ã€‚
+「<code>$1</code>ã€ã¨ã„ã†åå‰ã®å¼•ç”¨å¥ã«å¯¾ã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ã‚¿ã‚°ã«å¯¾å¿œã™ã‚‹ <code>&lt;/ref&gt;</code> ã‚¿ã‚°ãŒä¸è¶³ã—ã¦ã„ã¾ã™',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ã‚¿ã‚°ãŒã‚ã‚Šã¾ã™ãŒã€<code>&lt;references/&gt;</code> ã‚¿ã‚°ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“',
+ 'cite_error_group_refs_without_references' => '「$1ã€ã¨ã„ã†åå‰ã®ã‚°ãƒ«ãƒ¼ãƒ—ã® <code>&lt;ref&gt;</code> ã‚¿ã‚°ãŒã‚ã‚Šã¾ã™ãŒã€å¯¾å¿œã™ã‚‹ <code>&lt;references group="$1"/&gt;</code> ã‚¿ã‚°ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> ã® <code>&lt;ref&gt;</code> ã‚¿ã‚°ã§ã€group 属性「$1ã€ãŒé‡è¤‡ã—ã¦ã„ã¾ã™ã€‚',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> ã§å®šç¾©ã•ã‚Œã¦ã„ã‚‹ <code>&lt;ref&gt;</code> ã‚¿ã‚°ã«ã€å…ˆè¡Œã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆå†…ã§ä½¿ç”¨ã•ã‚Œã¦ã„ãªã„ group 属性「$1ã€ãŒã‚ã‚Šã¾ã™ã€‚',
+ 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> ã§å®šç¾©ã•ã‚Œã¦ã„ã‚‹ <code>&lt;ref&gt;</code> ã‚¿ã‚° (name="$1") ã¯ã€å…ˆè¡Œã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆå†…ã§ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
+ 'cite_error_references_no_key' => '<code>&lt;references&gt;</code> ã§å®šç¾©ã•ã‚Œã¦ã„ã‚‹ <code>&lt;ref&gt;</code> ã‚¿ã‚°ã« name 属性ãŒã‚ã‚Šã¾ã›ã‚“。',
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code> ã§å®šç¾©ã•ã‚Œã¦ã„ã‚‹ <code>&lt;ref&gt;</code> ã‚¿ã‚° (name="$1") ã«å†…容ãŒã‚ã‚Šã¾ã›ã‚“。',
+);
+
+/** Jutish (jysk)
+ * @author Huslåke
+ */
+$messages['jut'] = array(
+ 'cite_croak' => 'Æ fodnåt døde; $1: $2',
+ 'cite_error_key_str_invalid' => 'Intern fejl: Ugyldeg $str og/æller $key. Dette burde aldreg førekåm.',
+ 'cite_error_stack_invalid_input' => 'Intern fejl: Ugyldeg staknøgle. Dette burde aldreg førekåm.',
+ 'cite_error' => 'Fodnåtfejl: $1',
+ 'cite_error_ref_numeric_key' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag; "name" kan ikke være et simpelt heltal, brug en beskrivende titel',
+ 'cite_error_ref_no_key' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Et <code>&lt;ref&gt;</code>-tag uden indhold skal have et navn',
+ 'cite_error_ref_too_many_keys' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Ugyldege navne, fx før mange',
+ 'cite_error_ref_no_input' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Et <code>&lt;ref&gt;</code>-tag uden navn skal have indhold',
+ 'cite_error_references_invalid_parameters' => 'Ugyldig <code>&lt;references&gt;</code>-tag: Parametre er ikke tilladt, brug i stedet <code>&lt;references /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'For mange <code>&lt;ref&gt;</code>-tags har det samme "name", tillad flere i beskeden <nowiki>[[MediaWiki:Cite_references_link_many_format_backlink_labels]]</nowiki>', # Fuzzy
+ 'cite_error_references_no_text' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Der er ikke specificeret nogen fodnotetekst til navnet <code>$1</code>',
+);
+
+/** Javanese (Basa Jawa)
+ * @author Iwan Novirion
+ * @author Meursault2004
+ * @author NoiX180
+ * @author Pras
+ */
+$messages['jv'] = array(
+ 'cite-desc' => 'Nambahaké tag <nowiki><ref[ name=id]></nowiki> lan <nowiki><references/></nowiki> kanggo kutipan (sitat)',
+ 'cite_croak' => 'Sitaté (pangutipané) gagal; $1: $2',
+ 'cite_error_key_str_invalid' => 'Kaluputan jero;
+$str lan/utawa $key ora absah.
+Iki sajatiné ora tau olèh kadadéyan.',
+ 'cite_error_stack_invalid_input' => 'Kaluputan internal;
+stack key ora absah.
+Iki samesthine ora kadadéan.',
+ 'cite_error' => 'Kaluputan sitat (pangutipan) $1',
+ 'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> ora absah;
+jenengé ora bisa namung angka integer waé. Gunakna irah-irahan (judhul) dèskriptif',
+ 'cite_error_ref_no_key' => 'Tag <code>&lt;ref&gt;</code> ora absah;
+refs tanpa isi kudu duwé jeneng',
+ 'cite_error_ref_too_many_keys' => 'Tag <code>&lt;ref&gt;</code> ora absah;
+jeneng-jenengé ora absah, contoné kakèhan',
+ 'cite_error_ref_no_input' => 'Tag <code>&lt;ref&gt;</code> ora absah;
+refs tanpa jeneng kudu ana isiné',
+ 'cite_error_references_invalid_parameters' => 'Tag <code>&lt;references&gt;</code> ora absah;
+ora ana paramèter sing diidinaké.
+Gunakna <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Tag <code>&lt;references&gt;</code> ora absah;
+namung paramèter "group" sing diolèhaké.
+Gunakna <code>&lt;references /&gt;</code>, utawa <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Kentèkan label pranala balik.
+Tambahna ing pesenan sistém <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Labèl pranala umum kanggo klompok "$1" entèk.
+Tambahaké katemton nèng layang <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Tag <code>&lt;ref&gt;</code> ora absah;
+ora ditemokaké tèks kanggo ref mawa jeneng <code>$1</code>',
+ 'cite_error_included_ref' => 'Panutupan <code>&lt;/ref&gt;</code> kélangan tag <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ditemokaké, nanging tag <code>&lt;references/&gt;</code> ora ditemokaké',
+ 'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ditemokaké kanggo paguyuban ajeneng "$1", nanging tag <code>&lt;references group="$1"/&gt;</code> sing ana kaitané ora ditemokaké',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> tandha <code>&lt;references&gt;</code> nduwèni atribut klompok sing marai konflik "$1".',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> tag sing didhèfinisikaké <code>&lt;references&gt;</code> nduwèni atribut klompok "$1" sing ora njedhul sing tèks sakdurungé.',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> tag sing didhefinisikaké mawa jeneng "$1" <code>&lt;references&gt;</code> ora dianggo nèng tèks sakdurungé.',
+ 'cite_reference_link_key_with_num' => '$1_$2',
+ 'cite_reference_link_prefix' => 'cite_ref-',
+ 'cite_references_link_prefix' => 'cite_note-',
+ 'cite_reference_link' => '<sup id="$1" class="reference">[[#$2|<nowiki>[</nowiki>$3<nowiki>]</nowiki>]]</sup>',
+ 'cite_references_link_one' => '<li id="$1">\'\'\'<span class="mw-cite-backlink">[[#$2|^]]</span>\'\'\' $3</li>',
+ 'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink">\'\'\'^\'\'\' $2</span> $3</li>',
+ 'cite_references_link_many_format' => "<sup>[[#$1|'''''$2''''']]</sup>",
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+ 'cite_references_link_many_sep' => '&#32;',
+ 'cite_references_link_many_and' => '&#32;',
+);
+
+/** Georgian (ქáƒáƒ áƒ—ული)
+ * @author David1010
+ * @author Dawid Deutschland
+ * @author გიáƒáƒ áƒ’იმელáƒ
+ */
+$messages['ka'] = array(
+ 'cite-desc' => 'áƒáƒ›áƒáƒ¢áƒ”ბს <nowiki><ref[ name=id]></nowiki> დრ<nowiki><references/></nowiki> ტეგებს სქáƒáƒšáƒ˜áƒáƒ¡áƒ—ვის',
+ 'cite_croak' => 'ციტáƒáƒ¢áƒ მáƒáƒ™áƒ•áƒáƒ“áƒ; $1: $2',
+ 'cite_error_key_str_invalid' => 'შიდრშეცდáƒáƒ›áƒ
+áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ $str დáƒ/áƒáƒœ $key
+áƒáƒ¡áƒ”თი áƒáƒ áƒáƒ¡áƒ“რáƒáƒ¡ áƒáƒ  უნდრგáƒáƒœáƒ›áƒ”áƒáƒ áƒ“ეს',
+ 'cite_error_stack_invalid_input' => 'შიდრშეცდáƒáƒ›áƒ.
+სტეკის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ¡áƒáƒ¦áƒ”ბი.
+ეს áƒáƒ  უნდრგáƒáƒœáƒ›áƒ”áƒáƒ áƒ“ეს.',
+ 'cite_error' => 'ციტირების შეცდáƒáƒ›áƒ $1',
+ 'cite_error_ref_numeric_key' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტეგი <code>&lt;ref&gt;</code> tag;
+სáƒáƒ®áƒ”ლმიáƒáƒ  უნდრშეიცáƒáƒ•áƒ“ეს ციფრებს.',
+ 'cite_error_ref_no_key' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტეგი <code>&lt;ref&gt;</code>;
+ელემენტი უნდრშეიცáƒáƒ•áƒ“ეს სáƒáƒ®áƒ”ლს.',
+ 'cite_error_ref_too_many_keys' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტეგი <code>&lt;ref&gt;</code>;
+áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლები, ძáƒáƒšáƒ˜áƒáƒœ ბევრი.',
+ 'cite_error_ref_no_input' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტეგი <ref>; ელემენტი უნდრშეიცáƒáƒ•áƒ“ეს შინáƒáƒáƒ áƒ¡.',
+ 'cite_error_references_invalid_parameters' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტეგი <code>&lt;references&gt;</code>;
+პáƒáƒ áƒáƒ›áƒ”ტრები áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ¨áƒ•áƒ”ბული.
+გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜<code>&lt;references&gt;</code> გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:
+დáƒáƒ¨áƒ•áƒ”ბულირმხáƒáƒšáƒ პáƒáƒ áƒáƒ›áƒ”ტრი „group“-ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ.
+გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნე <tt>&lt;references /&gt;</tt> áƒáƒœ <tt>&lt;references group="…" /&gt;</tt>',
+ 'cite_error_references_no_backlink_label' => 'áƒáƒ  áƒáƒ áƒ˜áƒ¡ სáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ სიმბáƒáƒšáƒ მზáƒáƒ áƒ“ი ჰიპერბმულებისáƒáƒ—ვის.
+სáƒáƒ­áƒ˜áƒ áƒáƒ გáƒáƒáƒ¤áƒáƒ áƒ—áƒáƒ•áƒáƒ— სისტემური შეტყáƒáƒ‘ინებრ<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრბმულების მáƒáƒœáƒ˜áƒ¨áƒ•áƒœáƒ”ბი ჯგუფისáƒáƒ—ვის „$1“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ.
+გáƒáƒœáƒ¡áƒáƒ–ღვრეთ დáƒáƒ›áƒáƒ¢áƒ”ბითები შეტყáƒáƒ‘ინებáƒáƒ¨áƒ˜ <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტეგი <code>&lt;ref&gt;</code>;
+სქáƒáƒšáƒ˜áƒáƒ¡áƒáƒ—ვის <code>$1</code> áƒáƒ  áƒáƒ áƒ˜áƒ¡ მითითებული ტექსტი',
+ 'cite_error_included_ref' => 'დáƒáƒ›áƒ®áƒ£áƒ áƒáƒ•áƒ˜ ტეგი <code>&lt;/ref&gt;</code> დáƒáƒ™áƒáƒ áƒ’ულიáƒ',
+ 'cite_error_refs_without_references' => 'áƒáƒ áƒ¡áƒ”ბული ტეგისáƒáƒ—ვის <code>&lt;ref&gt;</code> ვერ მáƒáƒ˜áƒ«áƒ”ბნრშესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ტეგი <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'ჯგუფი „$1“ áƒáƒ áƒ¡áƒ”ბული ტეგებისáƒáƒ—ვის <code>&lt;ref&gt;</code> ვერ მáƒáƒ˜áƒ«áƒ”ბნრშესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ტეგი <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'ტეგს <code>&lt;ref&gt;</code> <code>&lt;references&gt;</code>-ში გáƒáƒáƒ©áƒœáƒ˜áƒ áƒáƒ¢áƒ áƒ˜áƒ‘უტთრკáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ£áƒ áƒ˜ ჯგუფები „$1“.',
+ 'cite_error_references_missing_group' => 'ტეგს <code>&lt;ref&gt;</code>, გáƒáƒœáƒ›áƒáƒ áƒ¢áƒ”ბულს <code>&lt;references&gt;</code>-ში, გáƒáƒáƒ©áƒœáƒ˜áƒ ჯგუფის áƒáƒ¢áƒ áƒ˜áƒ‘უტი „$1“, რáƒáƒ›áƒ”ლიც áƒáƒ“რეულ ტექსტში áƒáƒ  მáƒáƒ˜áƒ®áƒ¡áƒ”ნიებáƒ.',
+ 'cite_error_references_missing_key' => 'ტეგი <code>&lt;ref&gt;</code> სáƒáƒ®áƒ”ლáƒáƒ“ „$1“, გáƒáƒ áƒ™áƒ•áƒ”ული <code>&lt;references&gt;</code>-ში, áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრწინრტექსტში.',
+ 'cite_error_references_no_key' => 'ტეგს <code>&lt;ref&gt;</code>, გáƒáƒ áƒ™áƒ•áƒ”ულს <code>&lt;references&gt;</code>-ში, სáƒáƒ®áƒ”ლის áƒáƒ¢áƒ áƒ˜áƒ‘უტი áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ.',
+ 'cite_error_empty_references_define' => 'ტეგს <code>&lt;ref&gt;</code>, გáƒáƒ áƒ™áƒ•áƒ”ულს <code>&lt;references&gt;</code>-ში, სáƒáƒ®áƒ”ლით „$1“ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ შინáƒáƒáƒ áƒ¡áƒ˜.',
+ 'cite_reference_link_key_with_num' => '$1_$2',
+ 'cite_reference_link' => '<sup id="$1" class="reference">[[#$2|<nowiki>[</nowiki>$3<nowiki>]</nowiki>]]</sup>',
+ 'cite_references_link_one' => '<li id="$1"><span class="mw-cite-backlink">[[#$2|↑]]</span> $3</li>',
+ 'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink">↑ $2</span> $3</li>',
+ 'cite_references_link_many_format' => '<sup>[[#$1|$2]]</sup>',
+ 'cite_references_link_many_sep' => '&#32;',
+ 'cite_references_link_many_and' => '&#32;',
+);
+
+/** Kazakh (Arabic script) (قازاقشا (تٴوتە)â€)
+ */
+$messages['kk-arab'] = array(
+ 'cite_croak' => 'دٵيەكسٶز الۋ سٵتسٸز بٸتتٸ; $1: $2',
+ 'cite_error_key_str_invalid' => 'ٸشكٸ قاتە; جارامسىز $str', # Fuzzy
+ 'cite_error_stack_invalid_input' => 'ٸشكٸ قاتە; جارامسىز ستەك كٸلتٸ',
+ 'cite_error' => 'دٵيەكسٶز الۋ $1 قاتەسٸ',
+ 'cite_error_ref_numeric_key' => 'جارامسىز <code>&lt;ref&gt;</code> بەلگٸشەسٸ; اتاۋ كٵدٸمگٸ بٷتٸن سان بولۋى مٷمكٸن ەمەس, سيپپاتاۋىش اتاۋ قولدانىڭىز',
+ 'cite_error_ref_no_key' => 'جارامسىز <code>&lt;ref&gt;</code> بەلگٸشەسٸ; ماعلۇماتسىز تٷسٸنٸكتەمەلەردە اتاۋ بولۋى قاجەت',
+ 'cite_error_ref_too_many_keys' => 'جارامسىز <code>&lt;ref&gt;</code> بەلگٸشە; جارامسىز اتاۋلار, مىسالى, تىم كٶپ',
+ 'cite_error_ref_no_input' => 'جارامسىز <code>&lt;ref&gt;</code> بەلگٸشە; اتاۋسىز تٷسٸنٸكتەمەلەردە ماعلۇماتى بولۋى قاجەت',
+ 'cite_error_references_invalid_parameters' => 'جارامسىز <code>&lt;references&gt;</code> بەلگٸشە; ەش باپتار رۇقسات ەتٸلمەيدٸ, بىلاي <code>&lt;references /&gt;</code> قولدانىڭىز',
+ 'cite_error_references_no_backlink_label' => 'قوسىمشا بەلگٸلەردٸڭ سانى بٸتتٸ, ودان ٵرٸ كٶبٸرەك <nowiki>[[MediaWiki:Cite_references_link_many_format_backlink_labels]]</nowiki> جٷيە حابارىندا بەلگٸلەڭٸز', # Fuzzy
+);
+
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Kaztrans
+ */
+$messages['kk-cyrl'] = array(
+ 'cite_croak' => 'ДәйекÑөз алу ÑәтÑіз бітті; $1: $2',
+ 'cite_error_key_str_invalid' => 'Ішкі қате; жарамÑыз $str', # Fuzzy
+ 'cite_error_stack_invalid_input' => 'Ішкі қате; жарамÑыз Ñтек кілті',
+ 'cite_error' => 'ДәйекÑөз алу $1 қатеÑÑ–',
+ 'cite_error_ref_numeric_key' => 'ЖарамÑыз <code>&lt;ref&gt;</code> белгішеÑÑ–; атау кәдімгі бүтін Ñан болуы мүмкін емеÑ, Ñиппатауыш атау қолданыңыз',
+ 'cite_error_ref_no_key' => 'ЖарамÑыз <code>&lt;ref&gt;</code> белгішеÑÑ–; мағлұматÑыз Ñ‚Ò¯Ñініктемелерде атау болуы қажет',
+ 'cite_error_ref_too_many_keys' => 'ЖарамÑыз <code>&lt;ref&gt;</code> белгіше; жарамÑыз атаулар, мыÑалы, тым көп',
+ 'cite_error_ref_no_input' => 'ЖарамÑыз <code>&lt;ref&gt;</code> белгіше; атауÑыз Ñ‚Ò¯Ñініктемелерде мағлұматы болуы қажет',
+ 'cite_error_references_invalid_parameters' => 'ЖарамÑыз <code>&lt;references&gt;</code> белгіше; еш баптар Ñ€Ò±Ò›Ñат етілмейді, былай <code>&lt;references /&gt;</code> қолданыңыз',
+ 'cite_error_references_no_backlink_label' => 'ҚоÑымша белгілердің Ñаны бітті, одан әрі көбірек <nowiki>[[MediaWiki:Cite_references_link_many_format_backlink_labels]]</nowiki> жүйе хабарында белгілеңіз', # Fuzzy
+ 'cite_references_link_one' => '<li id="$1"><span class="mw-cite-backlink">[[#$2|↑]]</span> $3</li>',
+ 'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink">↑ $2</span> $3</li>',
+);
+
+/** Kazakh (Latin script) (qazaqşa (latın)‎)
+ */
+$messages['kk-latn'] = array(
+ 'cite_croak' => 'Däýeksöz alw sätsiz bitti; $1: $2',
+ 'cite_error_key_str_invalid' => 'İşki qate; jaramsız $str', # Fuzzy
+ 'cite_error_stack_invalid_input' => 'İşki qate; jaramsız stek kilti',
+ 'cite_error' => 'Däýeksöz alw $1 qatesi',
+ 'cite_error_ref_numeric_key' => 'Jaramsız <code>&lt;ref&gt;</code> belgişesi; ataw kädimgi bütin san bolwı mümkin emes, sïppatawış ataw qoldanıñız',
+ 'cite_error_ref_no_key' => 'Jaramsız <code>&lt;ref&gt;</code> belgişesi; mağlumatsız tüsiniktemelerde ataw bolwı qajet',
+ 'cite_error_ref_too_many_keys' => 'Jaramsız <code>&lt;ref&gt;</code> belgişe; jaramsız atawlar, mısalı, tım köp',
+ 'cite_error_ref_no_input' => 'Jaramsız <code>&lt;ref&gt;</code> belgişe; atawsız tüsiniktemelerde mağlumatı bolwı qajet',
+ 'cite_error_references_invalid_parameters' => 'Jaramsız <code>&lt;references&gt;</code> belgişe; eş baptar ruqsat etilmeýdi, bılaý <code>&lt;references /&gt;</code> qoldanıñız',
+ 'cite_error_references_no_backlink_label' => 'Qosımşa belgilerdiñ sanı bitti, odan äri köbirek <nowiki>[[MediaWiki:Cite_references_link_many_format_backlink_labels]]</nowiki> jüýe xabarında belgileñiz', # Fuzzy
+);
+
+/** Khmer (ភាសាážáŸ’មែរ)
+ * @author គីមស៊្រុន
+ * @author ážœáŸážŽážáž¶ážšáž·áž‘្ធ
+ */
+$messages['km'] = array(
+ 'cite-desc' => 'បន្ážáŸ‚មស្លាក <nowiki><ref[ name=id]></nowiki> áž“áž·áž„ <nowiki><references/></nowiki>​ សម្រាប់ការយោង​ឯកសារ​',
+);
+
+/** Korean (한국어)
+ * @author Ficell
+ * @author Ilovesabbath
+ * @author Kwj2772
+ * @author ToePeu
+ */
+$messages['ko'] = array(
+ 'cite-desc' => 'ì¸ìš©ì— ì“°ì´ëŠ” <nowiki><ref[ name=id]></nowiki>와 <nowiki><references/></nowiki>태그를 ë”합니다.',
+ 'cite_croak' => 'ì¸ìš© 오류; $1: $2',
+ 'cite_error_key_str_invalid' => '내부 오류;
+$str í˜¹ì€ $keyê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.
+ì´ ì˜¤ë¥˜ëŠ” ë°œìƒí•˜ì§€ 않아야 합니다.',
+ 'cite_error_stack_invalid_input' => '내부 오류; ìŠ¤íƒ í‚¤ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.
+ì´ ì˜¤ë¥˜ëŠ” ë°œìƒí•˜ì§€ ë§ì•„야 합니다.',
+ 'cite_error' => 'ì¸ìš© 오류: $1',
+ 'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤;
+ì´ë¦„ì€ ìˆ«ìžê°€ ë  ìˆ˜ 없습니다. 설명ì ì¸ ì´ë¦„ì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤.',
+ 'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤;
+ë‚´ìš©ì´ ì—†ëŠ” 주ì„ì€ ì´ë¦„ì´ ìžˆì–´ì•¼ 합니다.',
+ 'cite_error_ref_too_many_keys' => 'ìž˜ëª»ëœ <code>&lt;ref&gt;</code> 태그 사용;
+예컨대 ìž˜ëª»ëœ ì£¼ì„ ì´ë¦„ì´ ë„ˆë¬´ 많습니다.',
+ 'cite_error_ref_no_input' => '<code>&lt;ref&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤;
+ì´ë¦„ì´ ì—†ëŠ” ref 태그는 반드시 ë‚´ìš©ì´ ìžˆì–´ì•¼ 합니다.',
+ 'cite_error_references_invalid_parameters' => '<code>&lt;references&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤;
+변수를 넣어서는 안 ë©ë‹ˆë‹¤.
+<code>&lt;references /&gt;</code>를 ì´ìš©í•˜ì‹­ì‹œì˜¤.',
+ 'cite_error_references_invalid_parameters_group' => '<code>&lt;references&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤;
+"group" 변수만 사용할 수 있습니다.
+<code>&lt;references /&gt;</code>나 <code>&lt;references group="..." /&gt;</code>만 ì´ìš©í•˜ì‹­ì‹œì˜¤.',
+ 'cite_error_references_no_backlink_label' => 'ì—­ë§í¬ ë¼ë²¨ì´ 부족합니다.
+<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>ì— ë” ë§Žì€ ë¼ë²¨ì„ 추가하십시오.',
+ 'cite_error_no_link_label_group' => '그룹 "$1"ì— ëŒ€í•´ ë§í¬ ë ˆì´ë¸”ì´ ëª¨ë‘ ë–¨ì–´ì¡ŒìŠµë‹ˆë‹¤.
+<nowiki>[[MediaWiki:$2]]</nowiki> ë©”ì‹œì§€ì— ë” ë§Žì€ ë ˆì´ë¸”ì„ ì •ì˜í•´ì£¼ì‹­ì‹œì˜¤.',
+ 'cite_error_references_no_text' => '<code>&lt;ref&gt;</code> 태그가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.
+<code>$1</code>ë¼ëŠ” ì´ë¦„ì„ ê°€ì§„ 주ì„ì— ëŒ€í•œ ë‚´ìš©ì´ ì—†ìŠµë‹ˆë‹¤.',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> 태그를 닫는 <code>&lt;/ref&gt;</code> 태그가 없습니다.',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> 태그가 존재하지만, <code>&lt;references/&gt;</code> 태그가 없습니다.',
+ 'cite_error_group_refs_without_references' => '"$1"ì´ë¼ëŠ” ì´ë¦„ì„ ê°€ì§„ ê·¸ë£¹ì— ëŒ€í•œ <code>&lt;ref&gt;</code> 태그가 존재하지만, ì´ì— 대ì‘하는 <code>&lt;references group="$1" /&gt;</code> 태그가 없습니다.',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> ì•ˆì— ìžˆëŠ” <code>&lt;ref&gt;</code> íƒœê·¸ì˜ ê·¸ë£¹ ì†ì„± "$1"ì´ ì¶©ëŒë©ë‹ˆë‹¤.',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> ì•ˆì˜ <code>&lt;ref&gt;</code> 태그가 ì´ì „ì— ì¡´ìž¬í•˜ì§€ 않는 그룹 ì†ì„± "$1"ì„ ê°–ê³  있습니다.',
+ 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> ì•ˆì— ì •ì˜ëœ "$1"ì´ë¼ëŠ” ì´ë¦„ì„ ê°€ì§„ <code>&lt;ref&gt;</code> 태그가 위ì—ì„œ 사용ë˜ê³  있지 않습니다.',
+ 'cite_error_references_no_key' => '<code>&lt;references&gt;</code> ì•ˆì˜ <code>&lt;ref&gt;</code> íƒœê·¸ì— ì´ë¦„ì´ ì—†ìŠµë‹ˆë‹¤.',
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code> 태그 ì•ˆì— ì •ì˜ëœ "$1"ì´ë¼ëŠ” ì´ë¦„ì„ ê°€ì§„ <code>&lt;ref&gt;</code> íƒœê·¸ì— ë‚´ìš©ì´ ì—†ìŠµë‹ˆë‹¤.',
+ 'cite_references_link_many_format_backlink_labels' => 'ê°€ 나 다 ë¼ ë§ˆ ë°” 사 ì•„ ìž ì°¨ ì¹´ 타 파 하 ê±° 너 ë” ëŸ¬ 머 버 ì„œ ì–´ ì € 처 커 í„° í¼ í—ˆ ê³  ë…¸ ë„ ë¡œ 모 ë³´ 소 오 ì¡° ì´ˆ ì½” 토 í¬ í˜¸ 구 누 ë‘ ë£¨ 무 부 수 ìš° 주 추 ì¿  투 푸 후 ê·¸ ëŠ ë“œ 르 므 브 스 으 즈 츠 í¬ íŠ¸ 프 í 기 니 ë”” 리 미 비 ì‹œ ì´ ì§€ 치 키 í‹° 피 히',
+);
+
+/** Colognian (Ripoarisch)
+ * @author Purodha
+ * @author The Evil IP address
+ */
+$messages['ksh'] = array(
+ 'cite-desc' => 'Erlaub Quelle un Referenze met <nowiki><ref[ name="id"]></nowiki> un <nowiki><references /></nowiki> aanzejevve.',
+ 'cite_croak' => 'Fääler met Refenenze. $1: $2',
+ 'cite_error_key_str_invalid' => 'Interne Fähler in <i lang="en">cite</i>:
+<code>$str</code> udder <code>$key</code> stemme nit.
+Dat sull nie optredde.',
+ 'cite_error_stack_invalid_input' => 'Interne Fähler in <i lang="en">cite</i>:
+Der <i lang="en">stack</i>-Schlößel stemmp nit.
+Dat sull nie optredde.',
+ 'cite_error' => 'Fähler in <i lang="en">cite</i> met Referenze: $1',
+ 'cite_error_ref_numeric_key' => 'Fähler en <i lang="en">cite</i>:
+Ene <code>&lt;ref&gt;</code>-Name kann kei Zahl sin.
+Nemm enne Tittel, dä jät säht.',
+ 'cite_error_ref_no_key' => 'Fähler en <i lang="en">cite</i>:
+E <code>&lt;ref&gt;</code> oohne Enhalt moß ene Name han.
+Nemm enne Tittel, dä jät säht.',
+ 'cite_error_ref_too_many_keys' => 'Fähler en <i lang="en">cite</i>:
+Zo fill <code>&lt;ref&gt;</code>-Name,
+udder kapodde ene Name.',
+ 'cite_error_ref_no_input' => 'Fähler en <i lang="en">cite</i>:
+E <code>&lt;ref&gt;</code> oohne Name moß ene Enhallt han.',
+ 'cite_error_references_invalid_parameters' => 'Fähler en <i lang="en">cite</i>:
+E <code>&lt;references&gt;</code> moß oohne Parrametere sin.
+Nemm eifach <code>&lt;references /&gt;</code> un söns nix.',
+ 'cite_error_references_invalid_parameters_group' => 'Fähler en <i lang="en">cite</i>:
+E <code>&lt;references&gt;</code> darf nur dä Parrameeter „<code>group</code>“ han.
+Nemm eifach <code>&lt;references /&gt;</code> udder <code>&lt;references group="..." /&gt;</code> un söns nix.',
+ 'cite_error_references_no_backlink_label' => 'Fähler en <i lang="en">cite</i>:
+Nit jenoch Name för retuur-Lengks.
+Donn mieh en dä Sigg <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> enndrare.',
+ 'cite_error_no_link_label_group' => 'För de Jruppe „$1“ senn er kein Bezeichnunge för Links mieh doh.
+Donn op <nowiki>[[MediaWiki:$2]]</nowiki> noch e paa dobei.',
+ 'cite_error_references_no_text' => 'Fähler en <i lang="en">cite</i>:
+Et wohr keine Tex aanjejovve för de
+<code>&lt;ref&gt;</code>s met dämm Name „<code>$1</code>“.',
+ 'cite_error_included_ref' => 'Hee för dat <code>&lt;ref&gt;</code> ham_mer kei zopaß <code>&lt;/ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Et sinn_er <code>&lt;ref&gt;</code>-Befähle en dä Sigg, ävver mer han keine <code>&lt;references/&gt;</code>-Befähl jefunge.',
+ 'cite_error_group_refs_without_references' => 'Et sinn_er <code>&lt;ref&gt;</code>-Befähle för de jrop „$1“ en hee dä Sigg, ävver mer han keine <code>&lt;references group="$1"/&gt;</code>-Befähl jefunge.',
+ 'cite_error_references_group_mismatch' => 'Dä <code>&lt;ref&gt;</code> Befähl en <code>&lt;references&gt;</code> hät en widerschpröschlesche Jroppe-Eijeschaff „$1“.',
+ 'cite_error_references_missing_group' => 'Dä <code>&lt;ref&gt;</code> Befähl, aanjejoove em Befähl <code>&lt;references&gt;</code>, hät en Jroppe-Eijeschaff „$1“, di ävver em Täx doför nit vörjekumme es.',
+ 'cite_error_references_missing_key' => 'Dä <code>&lt;ref&gt;</code> Befähl mem Naame „$1“, aanjejoove em Befähl <code>&lt;references&gt;</code>, es em Täx doför nit vörjekumme.',
+ 'cite_error_references_no_key' => 'Dä <code>&lt;ref&gt;</code> Befähl, aanjejoove em Befähl <code>&lt;references&gt;</code>, hät kei Eijeschaff <code>name=</code> aanjejovve.',
+ 'cite_error_empty_references_define' => 'Dä <code>&lt;ref&gt;</code> Befähl mem Naame „$1“, aanjejoove em Befähl <code>&lt;references&gt;</code> mem Name „$1“, hät keine Enhallt.',
+ 'cite_reference_link_key_with_num' => '$1_$2',
+ 'cite_reference_link_prefix' => 'fohss_noht_betreck_',
+ 'cite_references_link_prefix' => 'fohss_noht_nommer_',
+ 'cite_references_link_many_and' => '&#32;',
+);
+
+/** Cornish (kernowek)
+ * @author Kernoweger
+ */
+$messages['kw'] = array(
+ 'cite_error' => 'Gwall devynna: $1',
+ 'cite_error_refs_without_references' => 'Yma tagys <code>&lt;ref&gt;</code>, mes ny veu kevys tag <code>&lt;references/&gt;</code>',
+);
+
+/** Luxembourgish (Lëtzebuergesch)
+ * @author Les Meloures
+ * @author Robby
+ */
+$messages['lb'] = array(
+ 'cite-desc' => 'Setzt <nowiki><ref[ name=id]></nowiki> an <nowiki><references/></nowiki> Taggen derbäi, fir Zitatiounen.',
+ 'cite_croak' => 'Feeler am Referenz-System. $1 : $2',
+ 'cite_error_key_str_invalid' => 'Interne Feeler;
+net valabele $str an/oder $key.
+Dëst sollt eigentlech ni geschéien.',
+ 'cite_error_stack_invalid_input' => "Interne Feeler;
+ongëltege ''stack''-Schlëssel.
+Dës sollt eigentlech guer net geschéien.",
+ 'cite_error' => 'Zitéierfeeler: $1',
+ 'cite_error_ref_numeric_key' => 'Ongëltegen <code>&lt;ref&gt;</code> Tag;
+Den Numm ka keng einfach ganz Zuel sinn. Benotzt w.e.g. een Titel den eng Beschreiwung gëtt',
+ 'cite_error_ref_no_key' => 'Ongëltegen <code>&lt;ref&gt;</code> Tag;
+Referenzen ouni Inhalt mussen een Numm hunn',
+ 'cite_error_ref_too_many_keys' => 'Ongëltege <code>&lt;ref&gt;</code> Tag;
+ongëlteg Nimm, z. Bsp. zevill',
+ 'cite_error_ref_no_input' => "Ongëltege <code>&lt;ref&gt;</code> Tag;
+''refs'' ouni Numm muss een Inhalt hun",
+ 'cite_error_references_invalid_parameters' => 'Ongëltegen <code>&lt;references&gt;</code> Tag;
+et si keng Parameter erlaabt.
+Benotzt <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Ongëltege <code>&lt;references&gt;</code> Tag;
+nëmmen de Parameter "group" ass erlaabt.
+Benotzt <code>&lt;references /&gt;</code>, oder <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_text' => "Ongëlteg <code>&lt;ref&gt;</code> Markéierung;
+et gouf keen Text ugi fir d'Referenze mam Numm <code>$1</code>",
+ 'cite_error_included_ref' => 'Den Tag <code>&lt;/ref&gt;</code> feelt fir den Tag <code>&lt;ref&gt;</code> zouzemaachen',
+ 'cite_error_refs_without_references' => "D'Markéierung <code>&lt;ref&gt;</code> gëtt et, awer d'Markéierung <code>&lt;references/&gt;</code> gouf net fonnt",
+ 'cite_error_group_refs_without_references' => 'D\'Markéierung <code>&lt;ref&gt;</code> gëtt et fir d\'Grupp "$1", awer d\'entspriechend Markéierung <code>&lt;references group="$1"/&gt;</code> gouf net fonnt',
+ 'cite_error_references_group_mismatch' => 'Den <code>&lt;ref&gt;</code>-Tag an <code>&lt;references&gt;</code> huet den Attribut "$1" deen am Konflikt mat deem am <code>&lt;references&gt;</code> steet.',
+ 'cite_error_references_missing_group' => 'Deen am <code>&lt;references&gt;</code> definéierten <code>&lt;ref&gt;</code>-Tag huet en Attribut "$1" deen am Text virdrun net dran ass.',
+ 'cite_error_references_missing_key' => 'Deen am <code>&lt;references&gt;</code> definéierten <code>&lt;ref&gt;</code>-Tag mam Numm "$1" gëtt am Text virdrun net benotzt.',
+ 'cite_error_references_no_key' => "D'Markéierung <code>&lt;ref&gt;</code> déi an <code>&lt;references&gt;</code> definéiert ass huet keng Nummeegeschaft.",
+ 'cite_error_empty_references_define' => "D'Markéierung <code>&lt;ref&gt;</code> déi am <code>&lt;references&gt;</code> mat dem Numm « $1 » definéiert ass, ass eidel.",
+);
+
+/** Limburgish (Limburgs)
+ * @author Ooswesthoesbes
+ * @author Pahles
+ */
+$messages['li'] = array(
+ 'cite-desc' => 'Voeg <nowiki><ref[ name=id]></nowiki> en <nowiki><references/></nowiki> tags toe veur citate',
+ 'cite_croak' => 'Perbleem mit Citere; $1: $2',
+ 'cite_error_key_str_invalid' => 'Interne fout; ónzjuuste $str en/of $key. Dit zów noeaits mótte veurkómme.',
+ 'cite_error_stack_invalid_input' => 'Interne fout; ónzjuuste stacksleutel. Dit zów noeaits mótte veurkómme.',
+ 'cite_error' => 'Citeerfout: $1',
+ 'cite_error_ref_numeric_key' => "Ónzjuuste tag <code>&lt;ref&gt;</code>; de naam kin gein simpele integer zeen, gebroek 'ne besjrievendje titel",
+ 'cite_error_ref_no_key' => "Ónzjuuste tag <code>&lt;ref&gt;</code>; refs zónger inhoud mótte 'ne naam höbbe",
+ 'cite_error_ref_too_many_keys' => 'Ónzjuuste tag <code>&lt;ref&gt;</code>; ónzjuuste name, beveurbeildj te väöl',
+ 'cite_error_ref_no_input' => 'Ónzjuuste tag <code>&lt;ref&gt;</code>; refs zónger naam mótte inhoud höbbe',
+ 'cite_error_references_invalid_parameters' => 'Ónzjuuste tag <code>&lt;references&gt;</code>; paramaeters zeen neet toegestaon, gebroek <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Onjuuste tag <code>&lt;references&gt;</code>;
+allein de paramaeter "group" is toegestaon.
+Gebruik <code>&lt;references /&gt;</code>, of <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => "'t Aantal besjikbare backlinklabels is opgebroek. Gaef meer labels op in 't berich <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>",
+ 'cite_error_no_link_label_group' => '\'t Aantal aangepasde verwiezingslabels veure groep "$1" is oetgepöt.
+Doe kans d\'r mier insjtelle in \'t sysyeemberich <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => "Ónzjuuste tag <code>&lt;ref&gt;</code>; d'r is gein teks opgegaeve veur refs mit de naam <code>$1</code>",
+ 'cite_error_included_ref' => 'Gein sjloetteike <code>&lt;/ref&gt;</code> veur de tag <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'De tag <code>&lt;ref&gt;</code> besteit al, meh de tag <code>&lt;references/&gt;</code> is neet aangetróffe',
+ 'cite_error_group_refs_without_references' => 'd\'r Besteit \'ne tag <code>&lt;ref&gt;</code> veure groep "$1", meh d\'r is geine bebehuuerendje tag <code>&lt;references group="$1"/&gt;</code> gevónje',
+ 'cite_error_references_group_mismatch' => 'De tag <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> conflicteert mit groepseigesjap "$1".',
+ 'cite_error_references_missing_group' => 'De tag <code>&lt;ref&gt;</code> dae is gedefinieerd in <code>&lt;references&gt;</code> haet de groepseigesjap "$1" neet ierder in de tekst veurkump.',
+ 'cite_error_references_missing_key' => 'De tag <code>&lt;ref&gt;</code> mit de naam "$1" gedefiniteerd in <code>&lt;references&gt;</code> weurt neet ierder in de teks gebroek.',
+ 'cite_error_references_no_key' => 'De tag <code>&lt;ref&gt;</code> dae is gedefinieerd in <code>&lt;references&gt;</code> haet geine eigesjapsnaam.',
+ 'cite_error_empty_references_define' => 'De tag <code>&lt;ref&gt;</code> dae is gedefinieerd in <code>&lt;references&gt;</code> mit de naam "$1" haet geinen inhawd.',
+);
+
+/** Lithuanian (lietuvių)
+ * @author Garas
+ * @author Homo
+ * @author Matasg
+ */
+$messages['lt'] = array(
+ 'cite-desc' => 'Prideda <nowiki><ref[ name=id]></nowiki> ir <nowiki><references/></nowiki> žymes citavimui',
+ 'cite_croak' => 'Cituoti nepavyko; $1: $2',
+ 'cite_error_key_str_invalid' => 'VidinÄ— klaida; neleistinas $str',
+ 'cite_error_stack_invalid_input' => 'VidinÄ— klaida; neleistinas steko raktas',
+ 'cite_error' => 'Citavimo klaida $1',
+ 'cite_error_ref_numeric_key' => 'Neleistina <code>&lt;ref&gt;</code> gairÄ—; vardas negali bÅ«ti tiesiog skaiÄius, naudokite tekstinį pavadinimÄ…',
+ 'cite_error_ref_no_key' => 'Neleistina <code>&lt;ref&gt;</code> gairÄ—; nuorodos be turinio turi turÄ—ti vardÄ…',
+ 'cite_error_ref_too_many_keys' => 'Neleistina <code>&lt;ref&gt;</code> gairÄ—; neleistini vardai, pvz., per daug',
+ 'cite_error_ref_no_input' => 'Neleistina <code>&lt;ref&gt;</code> gairė; nuorodos be vardo turi turėti turinį',
+ 'cite_error_references_invalid_parameters' => 'Neleistina <code>&lt;references&gt;</code> gairė; neleidžiami jokie parametrai, naudokite <code>&lt;references /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Baigėsi antraštės.
+Nurodykite daugiau <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> sisteminiame tekste',
+ 'cite_error_included_ref' => 'Trūksta uždaromojo <code>&lt;/ref&gt;</code> žymei <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'puslapyje egzistuoja žyma <code>&lt;ref&gt;</code>, taÄiau žymos <code>&lt;references/&gt;</code> nÄ—ra rasta',
+);
+
+/** Latvian (latviešu)
+ * @author GreenZeb
+ * @author Marozols
+ * @author Xil
+ */
+$messages['lv'] = array(
+ 'cite-desc' => 'Pievieno <nowiki><ref[ name=id]></nowiki> un <nowiki><references/></nowiki> tagus, atsaucēm',
+ 'cite_error' => 'Kļūda atsaucē: $1',
+ 'cite_error_refs_without_references' => 'atrasta <code>&lt;ref&gt;</code> iezīme, bet nav nevienas <code>&lt;references/&gt;</code> iezīmes',
+);
+
+/** Malagasy (Malagasy)
+ * @author Jagwar
+ */
+$messages['mg'] = array(
+ 'cite-desc' => 'Mamnpy ny balizy <tt><nowiki><ref[ name="id"]></nowiki></tt> et <tt><nowiki><references/></nowiki></tt> ho an\'ny tsiahy.',
+ 'cite_croak' => 'Tsiahy tsy miafana ; $1 : $2',
+ 'cite_error_key_str_invalid' => 'Tsy fetezana ety anaty;
+Tsy mety $str na $key.
+Tokony tsy hitranga mihintsy ity tsy fetezana ity.',
+ 'cite_error_stack_invalid_input' => 'Tsy fetezana ety anaty ;
+tsy mety ny stack key.
+Tokony tsy hitranga mihitsy ity tsy fetezana ity.',
+);
+
+/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ */
+$messages['min'] = array(
+ 'cite-desc' => 'Manambahkan tag <nowiki><ref[ name=id]></nowiki> jo <nowiki><references/></nowiki> untuak kutipan',
+ 'cite_croak' => 'Pautan mati; $1: $2',
+ 'cite_error_key_str_invalid' => 'Kasalahan internal;
+$str jo/atau $key indak sah.
+Kasalahan ko sabananyo indak buliah tajadi.',
+ 'cite_error_stack_invalid_input' => 'Kasalahan internal;
+kunci "stack" indak sah.
+Kasalahan ko sabananyo indak buliah tajadi.',
+ 'cite_error' => 'Kutipan rusak: $1',
+ 'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> indak sah;
+parameter indak buliah angko atau/hurup sadarano.
+Gunoan namo nan deskriptif',
+ 'cite_error_ref_no_key' => 'Tag <code>&lt;ref&gt;</code> indak sah;
+rujuakan kosong harus ado namo',
+ 'cite_error_ref_too_many_keys' => 'Tag <code>&lt;ref&gt;</code> indak sah;
+parameter indak sah; mis. talampau panjang',
+ 'cite_error_ref_no_input' => 'Tag <code>&lt;ref&gt;</code> indak sah;
+rujuakan indak banamo harus ado isi',
+ 'cite_error_references_invalid_parameters' => 'Tag <code>&lt;references&gt;</code> indak sah;
+indak buliah ado parameter.
+Gunoan <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Tag <code>&lt;references&gt;</code> indak sah;
+parameter "group" sajo nan buliah.
+Gunoan <code>&lt;references /&gt;</code>, atau <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Label pautan baliak habih.
+Cubo tambahkan di <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Label pautan untuak grup "$1" habih.
+Tantukan labiah lanjuik dalam <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Tag <code>&lt;ref&gt;</code> indak sah;
+indak ado teks untuak ref banamo <code>$1</code>',
+ 'cite_error_included_ref' => 'Tag <code>&lt;ref&gt;</code> harus ditutuik jo <code>&lt;/ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ado, tapi <code>&lt;references/&gt;</code> indak ado',
+ 'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ado untuak grup banamo "$1", tapi indak ado <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'Tag <code>&lt;ref&gt;</code> pado <code>&lt;references&gt;</code> ado namo grup "$1" nan konflik.',
+ 'cite_error_references_missing_group' => 'Tag <code>&lt;ref&gt;</code> pado <code>&lt;references&gt;</code> indak ado namo grup "$1".',
+ 'cite_error_references_missing_key' => 'Tag <code>&lt;ref&gt;</code> jo namo "$1" pado <code>&lt;references&gt;</code> indak ado.',
+ 'cite_error_references_no_key' => 'Tag <code>&lt;ref&gt;</code> pado <code>&lt;references&gt;</code> indak ado aprameter namo.',
+ 'cite_error_empty_references_define' => 'Tag <code>&lt;ref&gt;</code> pado <code>&lt;references&gt;</code> nan banamo "$1" indak ado isi.',
+ 'cite_reference_link_key_with_num' => '$1_$2',
+ 'cite_reference_link_prefix' => 'cite_ref-',
+ 'cite_references_link_prefix' => 'cite_note-',
+ 'cite_reference_link' => '<sup id="$1" class="reference">[[#$2|<nowiki>[</nowiki>$3<nowiki>]</nowiki>]]</sup>',
+ 'cite_references_link_one' => '<li id="$1">\'\'\'<span class="mw-cite-backlink">[[#$2|^]]</span>\'\'\' $3</li>',
+ 'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink">\'\'\'^\'\'\' $2</span> $3</li>',
+ 'cite_references_link_many_format' => "<sup>[[#$1|'''''$2''''']]</sup>",
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+ 'cite_references_link_many_sep' => '&#32;',
+ 'cite_references_link_many_and' => '&#32;',
+);
+
+/** Macedonian (македонÑки)
+ * @author Bjankuloski06
+ * @author Brest
+ */
+$messages['mk'] = array(
+ 'cite-desc' => 'Додава ознаки <nowiki><ref[ name=id]></nowiki> и <nowiki><references/></nowiki>, за цитирања',
+ 'cite_croak' => 'Ðаводот Ñе урна; $1: $2',
+ 'cite_error_key_str_invalid' => 'Внатрешна грешка;
+погрешна вредноÑÑ‚ на $str и/или $key.
+Ова никогаш не треба да Ñе Ñлучува.',
+ 'cite_error_stack_invalid_input' => 'Внатрешна грешка;
+погрешен клуч за купот.
+Ова никогаш не треба да Ñе Ñлучува.',
+ 'cite_error' => 'Грешка во наводот: $1.',
+ 'cite_error_ref_numeric_key' => 'Погрешна ознака <code>&lt;ref&gt;</code>;
+името не може да биде број. Употребете опиÑен наÑлов',
+ 'cite_error_ref_no_key' => 'Погрешна ознака <code>&lt;ref&gt;</code>;
+наводите без Ñодржина мора да имаат име',
+ 'cite_error_ref_too_many_keys' => 'Погрешна ознака<code>&lt;ref&gt;</code>;
+погрешни имиња, т.е. ги има премногу',
+ 'cite_error_ref_no_input' => 'Погрешна ознака <code>&lt;ref&gt;</code>;
+наводите без име мораат да имаат Ñодржина',
+ 'cite_error_references_invalid_parameters' => 'Погрешна ознака<code>&lt;references&gt;</code>;
+употребата на параметри не е дозволена.
+Употребете <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Погрешна ознака <code>&lt;references&gt;</code>;
+допуштен Ñамо параметарот „group“.
+Употребете <code>&lt;references /&gt;</code> или <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Ðема доволно натпиÑи за повратни врÑки.
+Определете уште натпиÑи во <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Се потрошија натпиÑите на прилагодените врÑки за групата „$1“.
+Определете уште во пораката <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Погрешна ознака <code>&lt;ref&gt;</code>;
+нема зададено текÑÑ‚ за наводите по име <code>$1</code>',
+ 'cite_error_included_ref' => 'Ðа ознаката <code>&lt;ref&gt;</code> Ñ Ð½ÐµÐ´Ð¾ÑтаÑува ознака за затворање &lt;/ref&gt',
+ 'cite_error_refs_without_references' => 'Статијата има ознаки <code>&lt;ref&gt;</code>, но не ја најдов потребната ознака <code>&#123;&#123;наводи&#125;&#125;</code> (или <code>&lt;references/&gt;</code>)',
+ 'cite_error_group_refs_without_references' => 'Има ознаки <code>&lt;ref&gt;</code> за група именувана како „$1“, но нема Ñоодветна ознака <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'Ознаката <code>&lt;ref&gt;</code> во <code>&lt;references&gt;</code> има ÑпротиÑтавен групен атрибут „$1“.',
+ 'cite_error_references_missing_group' => 'Ознаката <code>&lt;ref&gt;</code> определена во <code>&lt;references&gt;</code> има групен атрибут „$1“ кој не Ñе јавува во претходен текÑÑ‚.',
+ 'cite_error_references_missing_key' => 'Ознаката <code>&lt;ref&gt;</code> Ñо име „$1“ определена во <code>&lt;references&gt;</code> не Ñе кориÑти во претходен текÑÑ‚.',
+ 'cite_error_references_no_key' => 'Ознаката <code>&lt;ref&gt;</code> определена во <code>&lt;referencesgt;</code> нема именÑки атрибут.',
+ 'cite_error_empty_references_define' => 'Ознаката <code>&lt;ref&gt;</code> определена во <code>&lt;references&gt;</code> Ñо име „$1“ нема Ñодржина.',
+);
+
+/** Malayalam (മലയാളം)
+ * @author Praveenp
+ * @author Shijualex
+ */
+$messages['ml'] = array(
+ 'cite-desc' => 'അവലംബം ചേർകàµà´•àµà´µà´¾àµ» ഉപയോഗികàµà´•à´¾à´¨àµà´³àµà´³ <nowiki><ref[ name=id]></nowiki>, <nowiki><references/></nowiki> à´Žà´¨àµà´¨àµ€ ടാഗàµà´•àµ¾ ചേർകàµà´•àµà´¨àµà´¨àµ',
+ 'cite_croak' => 'സൈറàµà´±àµ ലഭàµà´¯à´®à´²àµà´²; $1: $2',
+ 'cite_error_key_str_invalid' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ;
+അസാധàµà´µà´¾à´¯ $str à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ $key.
+ഇതൠഒരികàµà´•à´²àµà´‚ സംഭവികàµà´•à´¾àµ» പാടിലàµà´²à´¾à´¯à´¿à´°àµà´¨àµà´¨àµ.',
+ 'cite_error_stack_invalid_input' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ; അസാധàµà´µà´¾à´¯ à´¸àµà´±àµà´±à´¾à´•àµ കീ. ഇതൠഒരികàµà´•à´²àµà´‚ സംഭവികàµà´•à´¾àµ» പാടിലàµà´²à´¾à´¯à´¿à´°àµà´¨àµà´¨àµ.',
+ 'cite_error' => 'ഉദàµà´§à´°à´¿à´šàµà´šà´¤à´¿àµ½ പിഴവàµ: $1',
+ 'cite_error_ref_numeric_key' => 'അസാധàµà´µà´¾à´¯ <code>&lt;ref&gt;</code> ടാഗàµ;
+നാമതàµà´¤à´¿àµ½ സംഖàµà´¯ മാതàµà´°à´®à´¾à´¯à´¿ à´…à´¨àµà´µà´¦à´¨àµ€à´¯à´®à´²àµà´². à´Žà´¨àµà´¤àµ†à´™àµà´•à´¿à´²àµà´‚ ലഘàµà´µà´¿à´µà´°à´£à´‚ ഉപയോഗികàµà´•àµà´•.',
+ 'cite_error_ref_no_key' => 'അസാധàµà´µà´¾à´¯ <code>&lt;ref&gt;</code> ടാഗàµ;
+ഉളàµà´³à´Ÿà´•àµà´•à´®àµŠà´¨àµà´¨àµà´®à´¿à´²àµà´²à´¾à´¤àµà´¤ അവലംബതàµà´¤à´¿à´¨àµà´‚ ഒരൠപേരൠവേണം.',
+ 'cite_error_ref_too_many_keys' => 'അസാധàµà´µà´¾à´¯ <code>&lt;ref&gt;</code> ടാഗàµ;
+അസാധàµà´µà´¾à´¯ പേരàµà´•àµ¾, ഉദാ: too many',
+ 'cite_error_ref_no_input' => 'അസാധàµà´µà´¾à´¯ <code>&lt;ref&gt;</code> ടാഗàµ;
+പേരിലàµà´²à´¾à´¤àµà´¤ അവലംബതàµà´¤à´¿à´¨àµ ഉളàµà´³à´Ÿà´•àµà´•à´®àµà´£àµà´Ÿà´¾à´¯à´¿à´°à´¿à´•àµà´•à´£à´‚.',
+ 'cite_error_references_invalid_parameters' => 'അസാധàµà´µà´¾à´¯ <code>&lt;references&gt;</code> ടാഗàµ;
+റെഫറൻസൠടാഗിനകതàµà´¤àµ à´šà´°à´™àµà´™àµ¾ à´…à´¨àµà´µà´¦à´¨àµ€à´¯à´®à´²àµà´². പകരം ഇങàµà´™à´¨àµ† <code>&lt;references /&gt;</code> ചെയàµà´¯à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
+ 'cite_error_references_invalid_parameters_group' => 'അസാധàµà´µà´¾à´¯ <code>&lt;references&gt;</code> ടാഗàµ;
+റെഫറൻസൠടാഗിനകതàµà´¤àµ "group" à´šà´°à´‚ മാതàµà´°à´®àµ‡ à´…à´¨àµà´µà´¦à´¨àµ€à´¯à´®à´¾à´¯àµà´³àµà´³àµ‚. പകരം <code>&lt;references /&gt;</code> à´Žà´¨àµà´¨àµ, à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ <code>&lt;references group="..." /&gt;</code> à´Žà´¨àµà´¨àµ ചെയàµà´¯à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
+ 'cite_error_references_no_backlink_label' => 'പിൻകണàµà´£à´¿à´•àµ¾à´•àµà´•à´¾à´¯à´¿ നൽകàµà´¨àµà´¨ ഇചàµà´›à´¾à´¨àµà´¸à´°à´£ à´•àµà´±à´¿à´•àµ¾ തീർനàµà´¨àµà´ªàµ‹à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
+കൂടàµà´¤àµ½ [[MediaWiki:Cite references link many format backlink labels]] സനàµà´¦àµ‡à´¶à´¤àµà´¤à´¿àµ½ നിർവചികàµà´•àµà´•.',
+ 'cite_error_no_link_label_group' => '"$1" സംഘതàµà´¤à´¿à´²àµ† à´•à´£àµà´£à´¿à´•àµ¾à´•àµà´•à´¾à´¯à´¿ നൽകàµà´¨àµà´¨ ഇചàµà´›à´¾à´¨àµà´¸à´°à´£ à´•àµà´±à´¿à´•àµ¾ തീർനàµà´¨àµà´ªàµ‹à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
+കൂടàµà´¤àµ½ <nowiki>[[MediaWiki:$2]]</nowiki> സനàµà´¦àµ‡à´¶à´¤àµà´¤à´¿àµ½ നിർവചികàµà´•àµà´•.',
+ 'cite_error_references_no_text' => 'അസാധàµà´µà´¾à´¯ <code>&lt;ref&gt;</code> ടാഗàµ;
+<code>$1</code> à´Žà´¨àµà´¨ അവലംബങàµà´™àµ¾à´•àµà´•àµ ടെകàµà´¸àµà´±àµà´±àµ à´’à´¨àµà´¨àµà´‚ കൊടàµà´¤àµà´¤à´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—ിനൠ<code>&lt;/ref&gt;</code> à´Žà´¨àµà´¨ à´…à´¨àµà´¤àµà´¯à´±àµà´±à´¾à´—ൠനൽകിയിടàµà´Ÿà´¿à´²àµà´²',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—àµà´•àµ¾ നൽകിയിടàµà´Ÿàµà´£àµà´Ÿàµ, പകàµà´·àµ‡ <code>&lt;references/&gt;</code> à´±àµà´±à´¾à´—ൠകണàµà´Ÿàµ†à´¤àµà´¤à´¾à´¨à´¾à´¯à´¿à´²àµà´².',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—àµà´•àµ¾ "$1" സംഘതàµà´¤à´¿àµ½ ഉണàµà´Ÿàµ, പകàµà´·àµ‡ ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿ <code>&lt;references group="$1"/&gt;</code> à´±àµà´±à´¾à´—ൠകണàµà´Ÿàµ†à´¤àµà´¤à´¾à´¨à´¾à´¯à´¿à´²àµà´²',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—ിലേയàµà´‚ <code>&lt;references&gt;</code> à´Žà´¨àµà´¨à´¤à´¿à´²àµ‡à´¯àµà´‚ സംഘ ഘടകമായ "$1" à´’à´¤àµà´¤àµà´ªàµ‹à´•àµà´¨àµà´¨à´¿à´²àµà´².',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—ൠനിർവചിചàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´™àµà´•à´¿à´²àµà´‚ <code>&lt;references&gt;</code> à´Žà´¨àµà´¨à´¤à´¿à´²àµà´³àµà´³ സംഘ ഘടകം "$1" ആദàµà´¯ à´Žà´´àµà´¤àµà´¤à´¿àµ½ കാണàµà´¨àµà´¨à´¿à´²àµà´².',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—ൠ"$1" à´Žà´¨àµà´¨ പേരോടെ <code>&lt;references&gt;</code> à´Žà´¨àµà´¨à´¤à´¿àµ½ നിർവചിചàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´™àµà´•à´¿à´²àµà´‚ ആദàµà´¯ à´Žà´´àµà´¤àµà´¤à´¿àµ½ ഉപയോഗികàµà´•àµà´¨àµà´¨à´¿à´²àµà´².',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—ൠ<code>&lt;references&gt;</code> à´Žà´¨àµà´¨à´¤à´¿àµ½ നിർവചിചàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´™àµà´•à´¿à´²àµà´‚ നാമ ഘടകം നൽകിയിടàµà´Ÿà´¿à´²àµà´².',
+ 'cite_error_empty_references_define' => ' <code>&lt;references&gt;</code> ആവശàµà´¯à´¤àµà´¤à´¿à´¨à´¾à´¯à´¿ "$1" à´Žà´¨àµà´¨ പേരിൽ നിർ‌വചികàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ <code>&lt;ref&gt;</code> à´±àµà´±à´¾à´—ിനൠഉളàµà´³à´Ÿà´•àµà´•à´®àµŠà´¨àµà´¨àµà´®à´¿à´²àµà´².',
+ 'cite_reference_link_prefix' => 'ഉദàµà´§à´°à´¿à´£à´¿_അവലംബം-',
+ 'cite_references_link_prefix' => 'ഉദàµà´§à´°à´¿à´£à´¿_à´•àµà´±à´¿à´ªàµà´ªàµ-',
+);
+
+/** Mongolian (монгол)
+ * @author Chinneeb
+ */
+$messages['mn'] = array(
+ 'cite_error' => 'Иш татахад гарÑан алдаа: $1',
+);
+
+/** Marathi (मराठी)
+ * @author Kaajawa
+ * @author Kaustubh
+ * @author Mahitgar
+ * @author Rahuldeshmukh101
+ */
+$messages['mr'] = array(
+ 'cite-desc' => '<nowiki><ref[ name=id]></nowiki> व <nowiki><references/></nowiki> हे दोन संदरà¥à¤­ देणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ वापरणà¥à¤¯à¤¾à¤¤ येणारे शबà¥à¤¦ वाढविले जातील.',
+ 'cite_croak' => 'संदरà¥à¤­ देता आला नाही; $1: $2',
+ 'cite_error_key_str_invalid' => 'अंतरà¥à¤—त तà¥à¤°à¥à¤Ÿà¥€; चà¥à¤•à¥€à¤šà¥‡ $str आणि/किंवा $key. असे कधीही घडायला नको.',
+ 'cite_error_stack_invalid_input' => 'अंतरà¥à¤—त तà¥à¤°à¥à¤Ÿà¥€; चà¥à¤•à¥€à¤šà¥€ सà¥à¤Ÿà¥…क चावी. असे कधीही घडले नाही पाहिजे.',
+ 'cite_error' => 'तà¥à¤°à¥‚टी उधृत करा: $1',
+ 'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> चà¥à¤•à¥€à¤šà¤¾ कोड; नाव हे पूरà¥à¤£à¤¾à¤‚की संखà¥à¤¯à¤¾ असू शकत नाही, कृपया माहितीपूरà¥à¤£ शीरà¥à¤·à¤• दà¥à¤¯à¤¾',
+ 'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> चà¥à¤•à¥€à¤šà¤¾ कोड; रिकामà¥à¤¯à¤¾ संदरà¥à¤­à¤¾à¤‚ना नाव असणे गरजेचे आहे',
+ 'cite_error_ref_too_many_keys' => '<code>&lt;ref&gt;</code> चà¥à¤•à¥€à¤šà¤¾ कोड; चà¥à¤•à¥€à¤šà¥€ नावे, उदा. खूप सारी',
+ 'cite_error_ref_no_input' => '<code>&lt;ref&gt;</code> चà¥à¤•à¥€à¤šà¤¾ कोड; निनावी संदरà¥à¤­à¤¾à¤‚मधà¥à¤¯à¥‡ माहिती असणे गरजेचे आहे',
+ 'cite_error_references_invalid_parameters' => '<code>&lt;references&gt;</code> हा चà¥à¤•à¥€à¤šà¤¾ वापर आहे; यामधे पॅरामीटरà¥à¤¸ देणे निषिदà¥à¤§ आहे.,
+<code>&lt;references /&gt;</code> असा कोड वापरा',
+ 'cite_error_references_invalid_parameters_group' => 'चà¥à¤•à¥€à¤šà¥€ <code>&lt;references&gt;</code> खूण; फकà¥à¤¤ पॅरॅमीटर चा गट वापरता येईल, <code>&lt;references /&gt;</code> किंवा <code>&lt;references group="..." /&gt;</code> चा वापर करा',
+ 'cite_error_references_no_backlink_label' => 'तयार केलेली मागीलदà¥à¤µà¥‡ देणारी नावे संपलेली आहेत, अधिक नावे <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> या पà¥à¤°à¤£à¤¾à¤²à¥€ संदेशात लिहा',
+ 'cite_error_no_link_label_group' => '"$1" करिता नमूदकेलेलà¥à¤¯à¤¾ कसà¥à¤Ÿà¤® लिंक खूणा संपलà¥à¤¯à¤¾ .
+<nowiki>[[MediaWiki:$2]]</nowiki> संदेशात अधिक खूणा नमूद करा',
+ 'cite_error_references_no_text' => '<code>&lt;ref&gt;</code> चà¥à¤•à¥€à¤šà¤¾ कोड; <code>$1</code> नावाने दिलेलà¥à¤¯à¤¾ संदरà¥à¤­à¤¾à¤‚मधà¥à¤¯à¥‡ काहीही माहिती नाही',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ला बंद करणारी <code>&lt;/ref&gt;</code> ही खूण गायब आहे.',
+ 'cite_error_refs_without_references' => 'पानामधे <code>&lt;ref&gt;</code> (संदरà¥à¤­) आहे, परंतॠ<code>&lt;references/&gt;</code> (<nowiki>{{संदरà¥à¤­à¤¯à¤¾à¤¦à¥€}}<nowiki />) सापडले नाही. <nowiki>{{संदरà¥à¤­à¤¯à¤¾à¤¦à¥€}}<nowiki /> असलà¥à¤¯à¤¾à¤¶à¤¿à¤µà¤¾à¤¯ पानाचà¥à¤¯à¤¾ तळाशी संदरà¥à¤­à¤¾à¤‚चे तपशील दिसणार नाहीत.',
+ 'cite_error_group_refs_without_references' => '"$1" नावाचà¥à¤¯à¤¾ गटाकरिता <code>&lt;ref&gt;</code> चिनà¥à¤¹à¥‡ उपलबà¥à¤§ आहेत, पण संबंधीत <code>&lt;references group="$1"/&gt;</code> खूण मिळाली नाही.',
+ 'cite_error_references_group_mismatch' => 'tag in <code>&lt;references&gt;</code>मधील <code>&lt;ref&gt;</code> खूणांना खटका उडणारे group attribute "$1" आहे.',
+ 'cite_error_references_missing_group' => 'गट "$1" मधील <code>&lt;ref&gt;</code> टà¥à¤¯à¤¾à¤— <code>&lt;references&gt;</code> हà¥à¤¯à¤¾ पूरà¥à¤µà¥€ वापलà¥à¤¯à¤¾ गेलेले नाही',
+ 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> हà¥à¤¯à¤¾ मधà¥à¤¯à¥‡ सांगितलेला <code>&lt;ref&gt;</code> "$1" हà¥à¤¯à¤¾ नावाचा टà¥à¤¯à¤¾à¤— हà¥à¤¯à¤¾ पूरà¥à¤µà¥€ वापरणà¥à¤¯à¤¾à¤¤ आलेला नाही.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> टà¥à¤¯à¤¾à¤— मधà¥à¤¯à¥‡ विशारद गोषà¥à¤Ÿà¥€à¤‚ना <code>&lt;references&gt;</code> ला नाम गà¥à¤£à¤§à¤°à¥à¤® नाहीत',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> टà¥à¤¯à¤¾à¤— मधà¥à¤¯à¥‡ विशारद गोषà¥à¤Ÿà¥€à¤‚ <code>&lt;references&gt;</code> जà¥à¤¯à¤¾ "$1" हà¥à¤¯à¤¾ नावाने संबोधलà¥à¤¯à¤¾ आहेत तà¥à¤¯à¤¾à¤¤ माहिती नाही',
+);
+
+/** Malay (Bahasa Melayu)
+ * @author Anakmalaysia
+ * @author Aviator
+ * @author Izzudin
+ */
+$messages['ms'] = array(
+ 'cite-desc' => 'Menambah tag <nowiki><ref[ name=id]></nowiki> dan <nowiki><references/></nowiki> untuk pemetikan',
+ 'cite_croak' => 'Ralat maut petik; $1: $2',
+ 'cite_error_key_str_invalid' => 'Ralat dalaman; str dan/atau $key tidak sah.',
+ 'cite_error_stack_invalid_input' => 'Ralat dalaman; kunci tindanan tidak sah.',
+ 'cite_error' => 'Ralat petik: $1',
+ 'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> tidak sah; nombor ringkas tidak dibenarkan, sila masukkan tajuk yang lebih terperinci',
+ 'cite_error_ref_no_key' => 'Tag <code>&lt;ref&gt;</code> tidak sah; rujukan tanpa kandungan mestilah mempunyai nama',
+ 'cite_error_ref_too_many_keys' => 'Tag <code>&lt;ref&gt;</code> tidak sah; nama-nama tidak sah, misalnya terlalu banyak',
+ 'cite_error_ref_no_input' => "'Tag <code>&lt;ref&gt;</code> tidak sah; rujukan tanpa nama mestilah mempunyai kandungan",
+ 'cite_error_references_invalid_parameters' => 'Tag <code>&lt;references&gt;</code> tidak sah; parameter tidak dibenarkan, gunakan <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Tag <code>&lt;references&gt;</code> tidak sah; hanya parameter "group" dibenarkan.
+Gunakan <code>&lt;references /&gt;</code> atau <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Kehabisan label pautan balik tempahan. Sila tambah label dalam pesanan <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Kehabisan label pautan tempahan untuk kumpulan "$1".
+Tentukan lagi dalam mesej <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Tag <code>&lt;ref&gt;</code> tidak sah; teks bagi rujukan <code>$1</code> tidak disediakan',
+ 'cite_error_included_ref' => 'Tag <code>&lt;ref&gt;</code> tidak ditutup dengan <code>&lt;/ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ada tetapi tag <code>&lt;references/&gt;</code> tidak disertakan',
+ 'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> untuk kumpulan "$1" ada tetapi tag <code>&lt;references group="$1"/&gt;</code> yang sepadan tidak disertakan',
+ 'cite_error_references_group_mismatch' => 'Tag <code>&lt;ref&gt;</code> dalam <code>&lt;references&gt;</code> mempunyai atribut kumpulan yang bercanggah, "$1".',
+ 'cite_error_references_missing_group' => 'Tag <code>&lt;ref&gt;</code> yang ditentukan dalam <code>&lt;references&gt;</code> mempunyai atribut kumpulan "$1" yang tiada dalam teks sebelumnya.',
+ 'cite_error_references_missing_key' => 'Tag <code>&lt;ref&gt;</code> dengan nama "$1" yang ditentukan dalam <code>&lt;references&gt;</code> tidak digunakan dalam teks sebelumnya.',
+ 'cite_error_references_no_key' => 'Tag <code>&lt;ref&gt;</code> yang ditentukan dalam <code>&lt;references&gt;</code> tiada atribut nama.',
+ 'cite_error_empty_references_define' => 'Tag <code>&lt;ref&gt;</code> yang ditentukan dalam <code>&lt;references&gt;</code> dengan nama "$1" tiada kandungan.',
+);
+
+/** Maltese (Malti)
+ * @author Chrisportelli
+ */
+$messages['mt'] = array(
+ 'cite-desc' => 'Iżżid it-tikketti <nowiki><ref[ name=id]></nowiki> u <nowiki><references/></nowiki> għaċ-ċitazzjonijiet',
+ 'cite_croak' => 'Żball fiċ-ċitazzjoni; $1: $2',
+ 'cite_error_key_str_invalid' => 'Żball intern;
+$str u/jew $key invalidi.
+Dan qatt m\'għandu jseħħ.',
+ 'cite_error_stack_invalid_input' => "Żball intern;
+''stack key'' invalida.
+Dan qatt m'għandu jseħħ.",
+ 'cite_error' => 'Żball fiċ-ċitazzjoni: $1',
+ 'cite_error_ref_numeric_key' => 'Tikketta <code>&lt;ref&gt;</code> invalida;
+l-isem ma jistax ikun numru sħiħ sempliċi. Uża titlu deskrittiv',
+ 'cite_error_ref_no_key' => 'Tikketta <code>&lt;ref&gt;</code> invalida;
+refs mingħajr kontenut għandhom ikollhom isem',
+ 'cite_error_ref_too_many_keys' => 'Tikketta <code>&lt;ref&gt;</code> invalida;
+ismijiet invalidi, e.ż. numru wisq kbir',
+ 'cite_error_ref_no_input' => 'Żball fl-użu tat-tikketta <code>&lt;ref&gt;</code>; refs mingħajr isem ma jistgħux ikunu vojta',
+ 'cite_error_references_invalid_parameters' => 'Żball fl-użu tat-tikketta <code>&lt;references&gt;</code>; il-parametri mhumiex permessi. Uża <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Tikketta <code>&lt;references&gt;</code> invalida;
+il-paramettru "group" biss huwa permess.
+Uża <code>&lt;references /&gt;</code> jew <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_text' => 'Tikketta <code>&lt;ref&gt;</code> invalida;
+l-ebda test ma ngħata għar-refs bl-isem <code>$1</code>',
+ 'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> tal-għeluq hija nieqsa għat-tikketta <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'It-tikketti <code>&lt;ref&gt;</code> jeżistu, imma l-ebda tikketta <code>&lt;references/&gt;</code> ma nstabet',
+ 'cite_error_group_refs_without_references' => 'It-tikketti <code>&lt;ref&gt;</code> jeżistu għal grupp bl-isem "$1" imma l-ebda tikketta <code>&lt;references group="$1"/&gt;</code> rispettiva ma nstabet',
+ 'cite_error_references_group_mismatch' => 'It-tikketta <code>&lt;ref&gt;</code> f\'<code>&lt;references&gt;</code> għandha l-attribut tal-grupp "$1" f\'kunflitt.',
+ 'cite_error_references_missing_group' => 'It-tikketta <code>&lt;ref&gt;</code> definita f\'<code>&lt;references&gt;</code> għandha l-attribut tal-grupp "$1" li ma jidhirx fit-test preċedenti.',
+ 'cite_error_references_missing_key' => 'It-tikketta <code>&lt;ref&gt;</code> bl-isem "$1" definita f\'<code>&lt;references&gt;</code> mhix użata fit-test preċedenti.',
+ 'cite_error_references_no_key' => "It-tikketta <code>&lt;ref&gt;</code> definita f'<code>&lt;references&gt;</code> m'għandiex l-attribut tal-isem.",
+ 'cite_error_empty_references_define' => 'It-tikketta <code>&lt;ref&gt;</code> definita f\'<code>&lt;references&gt;</code> bl-isem "$1" m\'għandha l-ebda kontenut.',
+);
+
+/** Norwegian Bokmål (norsk (bokmål)‎)
+ * @author Audun
+ * @author Laaknor
+ */
+$messages['nb'] = array(
+ 'cite-desc' => 'Legger til <nowiki><ref[ name=id]></nowiki> og <nowiki><references/></nowiki>-tagger for referanser',
+ 'cite_croak' => 'Sitering døde; $1: $2',
+ 'cite_error_key_str_invalid' => 'Intern feil: Ugyldig $str og/eller $key. Dette burde aldri forekomme.',
+ 'cite_error_stack_invalid_input' => 'Intern feil; ugyldig stakknøkkel. Dette burde aldri forekomme.',
+ 'cite_error' => 'Siteringsfeil: $1',
+ 'cite_error_ref_numeric_key' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; navnet kan ikke være et enkelt heltall, bruk en beskrivende tittel',
+ 'cite_error_ref_no_key' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; referanser uten innhold må inneholde navn',
+ 'cite_error_ref_too_many_keys' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; ugyldige navn, f.eks. for mange',
+ 'cite_error_ref_no_input' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; referanser uten navn må ha innhold',
+ 'cite_error_references_invalid_parameters' => 'Ugyldig <code>&lt;references&gt;</code>-kode; ingen parametere tillates, bruk <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Ugyldig <code>&lt;references&gt;</code>-tagg; kun parameteret «group» tillates. Bruk <code>&lt;references /&gt;</code> eller <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Gikk tom for egendefinerte tilbakelenketekster.
+Definer flere i beskjeden <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
+ 'cite_error_no_link_label_group' => 'Gikk tom for egendefinerte lenkemerker for gruppen «$1».
+Definér fler i <nowiki>[[MediaWiki:$2]]</nowiki>-beskjeden.',
+ 'cite_error_references_no_text' => 'Ugyldig <code>&lt;ref&gt;</code>-tagg; ingen tekst ble oppgitt for referansen ved navn <code>$1</code>',
+ 'cite_error_included_ref' => 'Avsluttende <code>&lt;/ref&gt;</code>-tagg mangler for <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-merker finnes, men ingen <code>&lt;references/&gt;</code>-merke funnet',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-merke finnes for gruppenavnet «$1», men ingen <code>&lt;references group="$1"/&gt;</code>-merking ble funnet',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code>-tagg i <code>&lt;references&gt;</code> har motstridig attributt «$1».',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code>-tagg definert i <code>&lt;references&gt;</code> har gruppeattributtet «$1» som ikke forekommer i teksten.',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code>-taggen med navnet «$1» definert i <code>&lt;references&gt;</code> brukes ikke i teksten.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code>-tagg definert i <code>&lt;references&gt;</code> har ikke noe navneattributt.',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code>-taggen i <code>&lt;references&gt;</code> med navnet «$1» har ikke noe innhold.',
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z æ ø å aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az aæ aø aå ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz bæ bø bå ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz cæ cø cå da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz dæ dø då ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez eæ eø eå fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz fæ fø få ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz gæ gø gå ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz hæ hø hå ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz iæ iø iå ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz jæ jø jå ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz kæ kø kå la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz læ lø lå ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz mæ mø må na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz næ nø nå oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz oæ oø oå pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz pæ pø på qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz qæ qø qå ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz ræ rø rå sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz sæ sø så ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz tæ tø tå ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz uæ uø uå va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz væ vø vå wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz wæ wø wå xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz xæ xø xå ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz yæ yø yå za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz zæ zø zå æa æb æc æd æe æf æg æh æi æj æk æl æm æn æo æp æq ær æs æt æu æv æw æx æy æz ææ æø æå øa øb øc ød øe øf øg øh øi øj øk øl øm øn øo øp øq ør øs øt øu øv øw øx øy øz øæ øø øå åa åb åc åd åe åf åg åh åi åj åk ål åm ån åo åp åq år ås åt åu åv åw åx åy åz åæ åø åå',
+);
+
+/** Low German (Plattdüütsch)
+ * @author Slomox
+ */
+$messages['nds'] = array(
+ 'cite-desc' => 'Föögt <nowiki><ref[ name=id]></nowiki> un <nowiki><references/></nowiki> Tags för Zitaten to',
+ 'cite_croak' => 'Fehler bi de Referenzen. $1: $2',
+ 'cite_error_key_str_invalid' => 'Internen Fehler: ungülligen $str un/oder $key. Dat schull egentlich nie vörkamen.',
+ 'cite_error_stack_invalid_input' => 'Internen Fehler: ungülligen Stack-Slötel. Dat schull egentlich nie vörkamen.',
+ 'cite_error' => 'Zitat-Fehler: $1',
+ 'cite_error_ref_numeric_key' => 'Ungülligen Tag <tt>&lt;ref&gt;</tt>: de Naam dröff keen reine Tall wesen, bruuk en Naam, de de Saak beschrifft.',
+ 'cite_error_ref_no_key' => 'Ungülligen Tag <tt>&lt;ref&gt;</tt>: „ref“ ahn Inholt mutt en Naam hebben.',
+ 'cite_error_ref_too_many_keys' => 'Ungülligen Tag <tt>&lt;ref&gt;</tt>: ungüllige Naams, to’n Bispeel to veel.',
+ 'cite_error_ref_no_input' => 'Ungülligen Tag <tt>&lt;ref&gt;</tt>: „ref“ ahn Naam mutt en Inholt hebben.',
+ 'cite_error_references_invalid_parameters' => 'Ungülligen Tag <code>&lt;references&gt;</code>: Parameters sünd nich verlöövt, bruuk <tt>&lt;references /&gt;</tt>',
+ 'cite_error_references_invalid_parameters_group' => 'Ungülligen Tag <code>&lt;references&gt;</code>: Blot de Parameter „group“ is verlöövt, bruuk <tt>&lt;references /&gt;</tt> oder <tt>&lt;references group="..." /&gt;</tt>',
+ 'cite_error_references_no_backlink_label' => 'De verföögboren Tekens för de Lenken op Referenzen sünd all. Dat lett sik repareren, wenn in de Systemnaricht <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> mehr Tekens angeven warrt.',
+ 'cite_error_references_no_text' => 'Ungülligen Tag <tt>&lt;ref&gt;</tt>; is keen Text för Refs mit den Naam <tt>$1</tt> angeven.',
+ 'cite_error_included_ref' => 'Dor fehlt en tosluten <code>&lt;/ref&gt;</code>',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags gifft dat, is aver keen <code>&lt;references/&gt;</code>-Tag funnen worrn.',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags för de Grupp „$1“ gifft dat, is aver keen <code>&lt;references group=„$1“/&gt;</code>-Tag funnen worrn',
+);
+
+/** Nedersaksies (Nedersaksies)
+ * @author Servien
+ */
+$messages['nds-nl'] = array(
+ 'cite_croak' => 'Fout in t referentiesysteem; $1: $2',
+ 'cite_error' => 'Siteerfout: $1',
+);
+
+/** Dutch (Nederlands)
+ * @author Niels
+ * @author Romaine
+ * @author Siebrand
+ */
+$messages['nl'] = array(
+ 'cite-desc' => 'Voegt <nowiki><ref[ name=id]></nowiki> en <nowiki><references/></nowiki> tags toe voor citaten',
+ 'cite_croak' => 'Probleem met Cite; $1: $2',
+ 'cite_error_key_str_invalid' => 'Interne fout;
+onjuiste $str and/of $key.
+Dit zou niet voor moeten komen.',
+ 'cite_error_stack_invalid_input' => 'Interne fout;
+onjuiste stacksleutel.
+Dit zou niet voor moeten komen.',
+ 'cite_error' => 'Citefout: $1',
+ 'cite_error_ref_numeric_key' => 'Onjuiste tag <code>&lt;ref&gt;</code>;
+de naam kan geen eenvoudige integer zijn.
+Gebruik een beschrijvende titel',
+ 'cite_error_ref_no_key' => 'Onjuiste tag <code>&lt;ref&gt;</code>;
+refs zonder inhoud moeten een naam hebben',
+ 'cite_error_ref_too_many_keys' => 'Onjuiste tag <code>&lt;ref&gt;</code>;
+onjuiste namen, bijvoorbeeld te veel',
+ 'cite_error_ref_no_input' => 'Onjuiste tag <code>&lt;ref&gt;</code>;
+refs zonder naam moeten inhoud hebben',
+ 'cite_error_references_invalid_parameters' => 'Onjuiste tag <code>&lt;references&gt;</code>;
+parameters zijn niet toegestaan.
+Gebruik <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Ongeldige tag <code>&lt;references&gt;</code>;
+alleen de parameter "group" is toegestaan.
+Gebruik <code>&lt;references /&gt;</code>, of <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Het aantal beschikbare backlinklabels is opgebruikt.
+Geef meer labels op in het bericht <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Het aantal aangepaste koppelinglabels voor de group "$1" is uitgeput.
+U kunt er meer instellen in het systeembericht <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Onjuiste tag <code>&lt;ref&gt;</code>;
+er is geen tekst opgegeven voor refs met de naam <code>$1</code>',
+ 'cite_error_included_ref' => 'Na het label <code>&lt;ref&gt;</code> ontbreekt het afsluitende label <code>&lt;/ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'De tag <code>&lt;ref&gt;</code> bestaat, maar de tag <code>&lt;references/&gt;</code> is niet aangetroffen',
+ 'cite_error_group_refs_without_references' => 'Er bestaat een tag <code>&lt;ref&gt;</code> voor de groep "$1", maar er is geen bijbehorende tag <code>&lt;references group="$1"/&gt;</code> aangetroffen',
+ 'cite_error_references_group_mismatch' => 'De tag <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> conflicteert met groepseigenschap "$1".',
+ 'cite_error_references_missing_group' => 'De tag <code>&lt;ref&gt;</code> die is gedefinieerd in <code>&lt;references&gt;</code> heeft de groepseigenschap "$1" niet niet eerder in te tekst voorkomt.',
+ 'cite_error_references_missing_key' => 'De tag <code>&lt;ref&gt;</code> met de naam "$1" gedefinieerd in <code>&lt;references&gt;</code> wordt niet eerder in de tekst gebruikt.',
+ 'cite_error_references_no_key' => 'De tag <code>&lt;ref&gt;</code> die is gedefinieerd in <code>&lt;references&gt;</code> heeft geen eigenschapsnaam.',
+ 'cite_error_empty_references_define' => 'De tag <code>&lt;ref&gt;</code> die is gedefinieerd in <code>&lt;references&gt;</code> met de naam "$1" heeft geen inhoud.',
+);
+
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
+ * @author Frokor
+ * @author Harald Khan
+ * @author Njardarlogar
+ */
+$messages['nn'] = array(
+ 'cite-desc' => 'Legg til <nowiki><ref[ name=id]></nowiki> og <nowiki><references/></nowiki>-merke for referansar',
+ 'cite_croak' => 'Feil i fotnotesystemet; $1: $2',
+ 'cite_error_key_str_invalid' => 'Intern feil: Ugyldig $str og/eller $key. Dette burde aldri skjedd.',
+ 'cite_error_stack_invalid_input' => 'Intern feil; ugyldig stakknøkkel. Dette burde aldri skjedd.',
+ 'cite_error' => 'Referansefeil: $1',
+ 'cite_error_ref_numeric_key' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; namnet kan ikkje vere eit enkelt heiltal, bruk ein skildrande tittel',
+ 'cite_error_ref_no_key' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; referansar utan innhald må innehalde namn',
+ 'cite_error_ref_too_many_keys' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; ugyldige namn, t.d. for mange',
+ 'cite_error_ref_no_input' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; referansar uten namn må ha innhald',
+ 'cite_error_references_invalid_parameters' => 'Ugyldig <code>&lt;references&gt;</code>-kode; ingen parametrar er tillat, bruk <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Ugyldig <code>&lt;references&gt;</code>-tagg; berre parameteren «group» er tillatt. Bruk <code>&lt;references /&gt;</code> eller <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Gjekk tom for eigendefinerte tilbakelenketekstar.
+Definer fleire i meldinga <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_references_no_text' => 'Ugyldig <code>&lt;ref&gt;</code>-merke; ingen tekst vart gjeven for referansen med namnet <code>$1</code>',
+ 'cite_error_included_ref' => 'Avsluttande <code>&lt;/ref&gt;</code>-tagg manglar for <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-merke finst, men eit <code>&lt;references/&gt;</code>-merke finst ikkje',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-merke finst for gruppenamnet «$1», men inkje samsvarande <code>&lt;references group="$1"/&gt;</code>-merke vart funne',
+);
+
+/** Occitan (occitan)
+ * @author Cedric31
+ */
+$messages['oc'] = array(
+ 'cite-desc' => 'Apond las balisas <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki>, per las citacions.',
+ 'cite_croak' => 'Citacion corrompuda ; $1 : $2',
+ 'cite_error_key_str_invalid' => 'Error intèrna ;
+$str o $key incorrèctes.
+Aquò se deuriá pas jamai produsir.',
+ 'cite_error_stack_invalid_input' => 'Error intèrna ; clau de pila invalida',
+ 'cite_error' => 'Error de citacion : $1',
+ 'cite_error_ref_numeric_key' => 'Ampèl invalid ; clau non-integrala esperada',
+ 'cite_error_ref_no_key' => 'Ampèl invalid ; cap de clau pas especificada',
+ 'cite_error_ref_too_many_keys' => 'Ampèl invalid ; claus invalidas, per exemple, tròp de claus especificadas o clau erronèa',
+ 'cite_error_ref_no_input' => 'Ampèl invalid ; cap de dintrada pas especificada',
+ 'cite_error_references_invalid_parameters' => 'Arguments invalids ; argument esperat',
+ 'cite_error_references_invalid_parameters_group' => 'Balisa <code>&lt;references&gt;</code> incorrècta ;
+
+sol lo paramètre « group » es autorizat.
+
+Utilizatz <code>&lt;references /&gt;</code>, o alara <code>&lt;references group="..." /&gt;</code>.',
+ 'cite_error_references_no_backlink_label' => 'Execucion en defòra de las etiquetas personalizadas, definissetz mai dins lo messatge <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_references_no_text' => 'Balisa <code>&lt;ref&gt;</code> incorrècta ;
+
+pas de tèxte per las referéncias nomenadas <code>$1</code>.',
+ 'cite_error_included_ref' => 'Clausura <code>&lt;/ref&gt;</code> omesa per la balisa <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'La balisa <code>&lt;ref&gt;</code> existís, mas cap de balisa <code>&lt;references/&gt;</code> pas trobada.',
+ 'cite_error_group_refs_without_references' => 'La balisa <code>&lt;ref&gt;</code> existís per un grop nomenat « $1 », mas cap de balisa <code>&lt;references group="$1"/&gt;</code> correspondenta pas trobada',
+ 'cite_error_references_group_mismatch' => "La balisa <code>&lt;ref&gt;</code> dins <code>&lt;references&gt;</code> a l'atribut de grop « $1 » que dintra en conflicte amb lo de <code>&lt;references&gt;</code>.",
+ 'cite_error_references_missing_group' => 'La balisa <code>&lt;ref&gt;</code> definida dins <code>&lt;references&gt;</code> a un gropat atribuit « $1 » que figura pas dins lo tèxte precedent.',
+ 'cite_error_references_missing_key' => 'La balisa <code>&lt;ref&gt;</code> amb lo nom « $1 » definida dins <code>&lt;references&gt;</code> es pas utilizada dins lo tèxte precedent.',
+ 'cite_error_references_no_key' => 'La balisa <code>&lt;ref&gt;</code> definida dins <code>&lt;references&gt;</code> a pas de nom d’atribut.',
+ 'cite_error_empty_references_define' => 'La balisa <code>&lt;ref&gt;</code> definida dins <code>&lt;references&gt;</code> amb lo nom « $1 » a pas de contengut.',
+);
+
+/** Oriya (ଓଡ଼ିଆ)
+ * @author Psubhashish
+ */
+$messages['or'] = array(
+ 'cite-desc' => '<nowiki><ref[ name=id]></nowiki> ଓ <nowiki><references/></nowiki> ଟାଗସବୠଆଧାର ନିମନà­à¬¤à­‡ à¬à¬ à¬¾à¬°à­‡ ଯୋଡ଼ିଥାଠ।',
+ 'cite_croak' => 'ଆଧାରଟି à¬à¬¬à­‡ ଅଚଳ; $1: $2',
+ 'cite_error_key_str_invalid' => 'ଭିତରର ଅସà­à¬¬à¬¿à¬§à¬¾;
+ଅବୈଧ $str ତଥା/କିମà­à¬¬à¬¾ $key ।
+à¬à¬¹à¬¾ ଆଉ କେବେ ଘଟିବ ଅନà­à¬šà¬¿à¬¤ ।',
+ 'cite_error_stack_invalid_input' => 'ଭିତରର ଅସà­à¬¬à¬¿à¬§à¬¾;
+ଅବୈଧ କି (key) ଗଦା ।
+à¬à¬¹à¬¾ ଆଉ କେବେ ଘଟିବ ଅନà­à¬šà¬¿à¬¤ ।',
+ 'cite_error' => 'ଆଧାର ଭà­à¬²: $1',
+ 'cite_error_ref_numeric_key' => 'ଅବୈଧ <code>&lt;ref&gt;</code> tag;
+ନାମାଟି କେବେ ହେଲେଠà¬à¬• ସଂଖà­à­Ÿà¬¾ ହୋଇପାରିବ ନାହିଠ। à¬à¬• ବରà­à¬£à­à¬£à¬¨à¬¾à¬®à­‚ଳକ ନାମ ଦିଅନà­à¬¤à­ ।',
+ 'cite_error_ref_no_key' => 'ଅବୈଧ <code>&lt;ref&gt;</code> ଚିହà­à¬¨;
+କୌଣସି ବି ବିଷୟବସà­à¬¤à­ ନଥିବା ଆଧାରର à¬à¬• ନାମ ଥିବା ଲୋଡ଼ା',
+ 'cite_error_ref_too_many_keys' => 'ଅବୈଧ <code>&lt;ref&gt;</code> ଚିହà­à¬¨;
+ଭà­à¬² ନାମ, ଯଥା: ଖà­à¬¬ ଅଧିକ',
+ 'cite_error_ref_no_input' => 'ଅବୈଧ <code>&lt;ref&gt;</code> ଚିହà­à¬¨;
+କୌଣସି ବି ନାମ ନଥିବା ଆଧାରର କିଛି ବିଷୟବସà­à¬¤à­ ଥିବା ଲୋଡ଼ା',
+ 'cite_error_references_invalid_parameters' => 'ଅଚଳ <code>&lt;references&gt;</code> ଚିହà­à¬¨;
+କୌଣସିଟି ପାରାମିଟର ଅନà­à¬®à­‹à¬¦à¬¿à¬¤ ନà­à¬¹à­‡à¬ ।
+<code>&lt;references /&gt;</code> ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରନà­à¬¤à­ ।',
+ 'cite_error_references_invalid_parameters_group' => 'ଅଚଳ <code>&lt;references&gt;</code> ଚିହà­à¬¨;
+"group" ପାରାମିଟରଟି କେବଳ ଅନà­à¬®à­‹à¬¦à¬¿à¬¤ ।
+<code>&lt;references /&gt;</code>, କିମà­à¬¬à¬¾ <code>&lt;references group="..." /&gt;</code> ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରନà­à¬¤à­',
+ 'cite_error_references_no_backlink_label' => 'ନିଜ ପସନà­à¬¦à¬° ବà­à­Ÿà¬¾à¬•à¬²à¬¿à¬™à­à¬• ଚିହà­à¬¨ ସବୠସରିଗଲା ।
+<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>ସୂଚନାରେ ଅଧିକ ଦେଖନà­à¬¤à­ ।',
+ 'cite_error_no_link_label_group' => '"$1" ଗୋଠ ଲାଗି ନିଜ ପସନà­à¬¦à¬° ବà­à­Ÿà¬¾à¬•à¬²à¬¿à¬™à­à¬• ଚିହà­à¬¨ ସବୠସରିଗଲା ।
+<nowiki>[[MediaWiki:$2]]</nowiki>ସୂଚନାରେ ଅଧିକ ଚିହà­à¬¨à¬¿à¬¤ କରନà­à¬¤à­ ।',
+ 'cite_error_references_no_text' => 'ଅଚଳ <code>&lt;ref&gt;</code> ଚିହà­à¬¨;
+<code>$1</code> ନାମରେ ଥିବା ଆଧାର ଭିତରେ କିଛି ଲେଖା ନାହିଠ।',
+ 'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> କୠବନà­à¬¦ କରà­à¬…ଛà­; <code>&lt;ref&gt;</code> ନାହିà¬; ଚିହà­à¬¨',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ଚିହà­à¬¨ ରହିଅଛି, କିନà­à¬¤à­ <code>&lt;references/&gt;</code> ଚିହà­à¬¨à¬Ÿà¬¿ ମିଳିଲା ନାହିà¬',
+ 'cite_error_group_refs_without_references' => '"$1" ଗୋଠ ପାଇଠ<code>&lt;ref&gt;</code> ଚିହà­à¬¨ ସବୠରହିଅଛି, କିନà­à¬¤à­ କୌଣସି ବି <code>&lt;references group="$1"/&gt;</code> ଚିହà­à¬¨ ମିଳିଲା ନାହିà¬',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt ରେ <code>&lt;ref&gt;</code> ଚିହà­à¬¨;</code> ର ଅସà­à¬¬à¬¿à¬§à¬¾à¬œà¬¨à¬• ଗୋଠ ବିଶେଷତା "$1" ।',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>ରେ ଦିଆଯାଇଥିବା <code>&lt;ref&gt;</code> ଚିହà­à¬¨à¬°à­‡ "$1" ଗୋଠ ପାଇଠଚିହà­à¬¨ ଅଛି ଯାହାକି ଦରକାରୀ ଲେଖାରେ ଆସà­à¬¨à¬¾à¬¹à¬¿à¬ ।',
+ 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>ରେ ଦିଆଯାଇଥିବା "$1" ନାମ ସହ ଥିବା <code>&lt;ref&gt;</code> ଚିହà­à¬¨ ଦରକାରୀ ଲେଖାରେ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° ହୋଇନାହିଠ।',
+ 'cite_error_references_no_key' => '<code>&lt;references&gt;</code>ରେ ଦିଆଯାଇଥିବା <code>&lt;ref&gt;</code> ଚିହà­à¬¨à¬°à­‡ କିଛି ଆଟà­à¬°à¬¿à¬¬à­à¬Ÿ ନାହିଠ।',
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code>ରେ ଦିଆଯାଇଥିବା "$1" ନାମ ସହ ଥିବା <code>&lt;ref&gt;</code> ଚିହà­à¬¨à¬°à­‡ କିଛି ଲେଖା ନାହିଠ।',
+);
+
+/** Pangasinan (Pangasinan)
+ */
+$messages['pag'] = array(
+ 'cite_error' => 'Bitlaen so error $1; $2', # Fuzzy
+);
+
+/** Polish (polski)
+ * @author Derbeth
+ * @author Holek
+ * @author Leinad
+ * @author Sp5uhe
+ */
+$messages['pl'] = array(
+ 'cite-desc' => 'Dodaje znaczniki <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki> ułatwiające podawanie źródeł cytatów',
+ 'cite_croak' => 'Cytowanie nieudane; $1: $2',
+ 'cite_error_key_str_invalid' => 'Błąd wewnętrzny;
+nieprawidłowy $str i/lub $key.
+To nigdy nie powinno się zdarzyć.',
+ 'cite_error_stack_invalid_input' => 'Błąd wewnętrzny – nieprawidłowy klucz sterty. To nigdy nie powinno się zdarzyć.',
+ 'cite_error' => "BÅ‚Ä…d rozszerzenia ''cite'': $1",
+ 'cite_error_ref_numeric_key' => 'Nieprawidłowy znacznik <code>&lt;ref&gt;</code>. Nazwa nie może być liczbą, użyj nazwy opisowej.',
+ 'cite_error_ref_no_key' => 'Nieprawidłowy znacznik <code>&lt;ref&gt;</code>. Odnośnik ref z zawartością musi mieć nazwę.',
+ 'cite_error_ref_too_many_keys' => 'Nieprawidłowe nazwy parametrów elementu <code>&lt;ref&gt;</code>.',
+ 'cite_error_ref_no_input' => 'Błąd w składni elementu <code>&lt;ref&gt;</code>. Przypisy bez podanej nazwy muszą posiadać treść',
+ 'cite_error_references_invalid_parameters' => 'Błąd w składni elementu <code>&lt;references&gt;</code>. Nie można wprowadzać parametrów do tego elementu, użyj <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Nieprawidłowy znacznik <code>&lt;references&gt;</code>;
+dostÄ™pny jest wyÅ‚Ä…cznie parametr „groupâ€.
+Użyj znacznika <code>&lt;references /&gt;</code>, lub <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Zabrakło etykiet do przypisów.
+Zadeklaruj więcej w komunikacie <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Zabrakło niestandardowych etykiet linków dla grupy „$1“.
+Zdefiniuj ich większą liczbę w komunikacie <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Błąd w składni elementu <code>&lt;ref&gt;</code>. Brak tekstu w przypisie o nazwie <code>$1</code>',
+ 'cite_error_included_ref' => 'Brak znacznika zamykajÄ…cego <code>&lt;/ref&gt;</code> po otwartym znaczniku <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Istnieje znacznik <code>&lt;ref&gt;</code>, ale nie odnaleziono znacznika <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Istnieje znacznik <code>&lt;ref&gt;</code> dla grupy o nazwie „$1â€, ale nie odnaleziono odpowiedniego znacznika <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'Znacznik <code>&lt;ref&gt;</code> w <code>&lt;references&gt;</code> nie może mieć atrybutu grupy „$1â€.',
+ 'cite_error_references_missing_group' => 'Znacznik <code>&lt;ref&gt;</code> zdefiniowany w <code>&lt;references&gt;</code> ma atrybut grupowania „$1â€, który nie wystÄ™puje wczeÅ›niej w treÅ›ci.',
+ 'cite_error_references_missing_key' => 'Znacznik <code>&lt;ref&gt;</code> o nazwie „$1â€, zdefiniowany w <code>&lt;references&gt;</code>, nie byÅ‚ użyty wczeÅ›niej w treÅ›ci.',
+ 'cite_error_references_no_key' => 'Znacznik <code>&lt;ref&gt;</code> zdefiniowany w <code>&lt;references&gt;</code> nie ma atrybutu <code>name</code>.',
+ 'cite_error_empty_references_define' => 'Znacznik <code>&lt;ref&gt;</code> zdefiniowany w <code>&lt;references&gt;</code> o nazwie „$1†nie ma treści.',
+);
+
+/** Piedmontese (Piemontèis)
+ * @author Borichèt
+ * @author Dragonòt
+ */
+$messages['pms'] = array(
+ 'cite-desc' => 'A gionta le tichëtte <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki>, për sitassion',
+ 'cite_croak' => 'Sitassion mòrta; $1: $2',
+ 'cite_error_key_str_invalid' => 'Eror antern;
+$str e/o $key sbalià.
+Sòn a dovrìa mai capité.',
+ 'cite_error_stack_invalid_input' => "Eror antern;
+ciav d'ambaronament pa bon-a.
+Sòn a dovrìa mai capité.",
+ 'cite_error' => 'Eror ëd sitassion: $1',
+ 'cite_error_ref_numeric_key' => "Tichëtta <code>&lt;ref&gt;</code> pa bon-a;
+ël nòm a peul pa esse n'antregh sempi. Deuvra un tìtol descritiv.",
+ 'cite_error_ref_no_key' => "Tichëtta <code>&lt;ref&gt;</code> pa bon-a;
+j'arferiment sensa contnù a devo avèj un nòm",
+ 'cite_error_ref_too_many_keys' => 'Tichëtta <code>&lt;ref&gt;</code> pa bon-a;
+nòm pa bon, për esempi tròpi',
+ 'cite_error_ref_no_input' => "Tichëtta <code>&lt;ref&gt;</code> pa bon-a;
+j'arferiment sensa nòm a devo avèj un contnù",
+ 'cite_error_references_invalid_parameters' => "Tichëtta <code>&lt;references&gt;</code> pa bon-a;
+pa gnun paràmetr përmëttù.
+Ch'a deuvra <code>&lt;references /&gt;</code>",
+ 'cite_error_references_invalid_parameters_group' => 'Tichëtta <code>&lt;references&gt;</code> pa bon-a;
+as peul mach dovresse ël paràmetr "group".
+Ch\'a deuvra <code>&lt;references /&gt;</code>, o <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Etichëtte ëd backlink përsonalisà esaurìe.
+Definiss-ne ëd pì ant ël messagi <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Surtì fòra dle tichëtte dij colegament utent për la partìa "$1".
+Definissne ëd pi ant ël mëssagi <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => "Tichëtta <code>&lt;ref&gt;</code> pa bon-a;
+pa gnun test a l'é stàit dàit për l'arferiment ciamà <code>$1</code>",
+ 'cite_error_included_ref' => 'Saradura <code>&lt;/ref&gt;</code> mancanta për la tichëtta <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => "la tichëtta <code>&lt;ref&gt;</code> a esist, ma gnun-a tichëtta <code>&lt;references/&gt;</code> a l'é stàita trovà",
+ 'cite_error_group_refs_without_references' => 'Dle tichëtte <code>&lt;ref&gt;</code> a esisto për na partìa ciamà "$1", ma gnun-a tichëtta corëspondenta <code>&lt;references group="$1"/&gt;</code> a l\'é stàita trovà',
+ 'cite_error_references_group_mismatch' => 'La tichëtta <code>&lt;ref&gt;</code> an <code>&lt;references&gt;</code> a l\'ha n\'atribut ëd partìa "$1" an conflit.',
+ 'cite_error_references_missing_group' => 'La tichëtta <code>&lt;ref&gt;</code> definìa an <code>&lt;references&gt;</code> a l\'ha n\'atribut ëd partìa "$1" che a l\'era pa ant ël test prima.',
+ 'cite_error_references_missing_key' => 'La tichëtta <code>&lt;ref&gt;</code> con nòm "$1" definìa an <code>&lt;references&gt;</code> a l\'é pa dovrà ant ël test prima.',
+ 'cite_error_references_no_key' => "La tichëtta <code>&lt;ref&gt;</code> definìa an <code>&lt;references&gt;</code> a l'ha pa gnun atribut ëd nòm.",
+ 'cite_error_empty_references_define' => 'La tichëtta <code>&lt;ref&gt;</code> definìa an <code>&lt;references&gt;</code> con nòm "$1" a l\'ha pa gnun contnù.',
+);
+
+/** Western Punjabi (پنجابی)
+ * @author Khalid Mahmood
+ */
+$messages['pnb'] = array(
+ 'cite-desc' => 'جوڑو <nowiki><ref[ name=id]></nowiki> تے <nowiki><references/></nowiki> ٹیگ اتے پتے لئی۔',
+ 'cite_croak' => 'سائیٹ ڈائیڈ؛ $1: $2',
+ 'cite_error_key_str_invalid' => 'اندرونی غلطی:
+ناں منی جان والی $وٹد تے/یا $چابی۔
+اے کدے نئیں Ûونا چآغیدا۔',
+ 'cite_error_stack_invalid_input' => 'اندرلی غلطی؛
+ناں منی جان والی سٹیک چابی۔
+اے کدے نئیں Ûونا چائیدا',
+ 'cite_error' => 'سائیٹ غلطی:$1',
+ 'cite_error_ref_numeric_key' => 'ناں منیا جان والا <code>&lt;ref&gt;</code> ٹیگ؛
+ناں اک Ø³Ø§Ø¯Û Ø§Ù†Ù¹ÛŒØ¬Ø± نئیں Ûوسکدا۔ کوئی Ûور دسن والا سرناواں دسو۔',
+ 'cite_error_ref_no_key' => 'ناں منیا جان والا <code>&lt;ref&gt;</code> ٹیگ؛
+اتے پتے جیدے Ú† کوئی Ø´Û’ ناں Ûووے لازمی ناں Ûووے۔',
+ 'cite_error_ref_too_many_keys' => 'ناں منیا جان والا <code>&lt;ref&gt;</code> ٹیگ؛
+ناں منے جان والے ناں',
+ 'cite_error_ref_no_input' => 'ناں منیا جان والا <code>&lt;ref&gt;</code> ٹیگ؛
+اتے پتے جیدے Ú† کوئی Ø´Û’ ناں Ûووے لازمی ناں Ûووے۔',
+ 'cite_error_references_invalid_parameters' => 'ناں منیا جان والا <code>&lt;references&gt;</code> ٹیگ؛
+کسے پیرامیٹر دی اجازت نئیں۔
+<code>&lt;references /&gt;</code> ورتو',
+ 'cite_error_references_invalid_parameters_group' => 'ناں منیا جان والا <code>&lt;references&gt;</code> ٹیگ؛
+پیرامیٹر گروپ دی اجازت صرÙÛ”
+ورتو <code>&lt;references /&gt;</code>، یا <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'کسٹم پچھلے جزڑ نئیں رۓ۔
+Ûور دسو <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> سنیعے Ú†Û”',
+ 'cite_error_no_link_label_group' => '"$1" ٹولی لئی کسٹم لیبل جوڑ مک گۓ۔
+Ûور دسو <nowiki>[[MediaWiki:$2]]</nowiki> سنیعے Ú†Û”',
+ 'cite_error_references_no_text' => 'ناں منیا جان والا <code>&lt;ref&gt;</code> ٹیگ
+کوئی لکھت نئیں دتی گئی اتے پتے <code>$1</code> لئی۔',
+ 'cite_error_included_ref' => 'بند کردا &lt;/ref&gt ؛ &lt;ref&gt دا کعاٹا ٹیک', # Fuzzy
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ٹیگ Ûیگے نیں، پر کوئی <code>&lt;references/&gt;</code> ٹیگ ناں لبیا۔',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> ٹیگ اک ٹولی جیدا ناں "$1" اے Ûیگے نیں، پر کوئی <code>&lt;references group="$1"/&gt;</code> ٹیگ ناں لبیا۔',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> ٹیگ ان <code>&lt;references&gt;</code> دے رپھڑی اٹریبیوٹ "$1"۔',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> ٹیگ دسیا گیا <code>&lt;references&gt;</code> دے ٹولی اٹریبیوٹ "$1" جیÛÚ‘Û’ Ù¾ÛÙ„ÛŒ لکھت Ú† ناں دسے۔',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> ٹیگ ناں نال "$1" <code>&lt;references&gt;</code> Ú† دسیا گیا Ù¾ÛÙ„ÛŒ کسے لکھت Ú† نئیں ورتیا گیا۔',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> ٹیگ دسیا گیا <code>&lt;references&gt;</code> چ دا کوئی ناں اٹریبیوٹ نئیں۔',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> ٹیگ دسیا گیا <code>&lt;references&gt;</code> چ "$1" ناں نال، ایدے چ کج نئیں۔',
+);
+
+/** Pashto (پښتو)
+ * @author Ahmed-Najib-Biabani-Ibrahimkhel
+ */
+$messages['ps'] = array(
+ 'cite_error' => 'د درک ستونزه: $1',
+);
+
+/** Portuguese (português)
+ * @author Crazymadlover
+ * @author Giro720
+ * @author Hamilton Abreu
+ * @author Malafaya
+ * @author Opraco
+ * @author Waldir
+ * @author 555
+ */
+$messages['pt'] = array(
+ 'cite-desc' => 'Adiciona elementos <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> para uso em citações',
+ 'cite_croak' => 'Citação com problemas; $1: $2',
+ 'cite_error_key_str_invalid' => 'Erro interno;
+$str e/ou $key inválido.
+Isto nunca deveria acontecer.',
+ 'cite_error_stack_invalid_input' => 'Erro interno; chave fixa inválida',
+ 'cite_error' => 'Erro de citação: $1',
+ 'cite_error_ref_numeric_key' => 'Código <code>&lt;ref&gt;</code> inválido; o nome não pode ser um número. Utilize um nome descritivo',
+ 'cite_error_ref_no_key' => 'Código <code>&lt;ref&gt;</code> inválido; refs sem conteúdo devem ter um parâmetro de nome',
+ 'cite_error_ref_too_many_keys' => 'Código <code>&lt;ref&gt;</code> inválido; nomes inválidos (por exemplo, nome muito extenso)',
+ 'cite_error_ref_no_input' => 'Código <code>&lt;ref&gt;</code> inválido; refs sem parâmetro de nome devem possuir conteúdo a elas associado',
+ 'cite_error_references_invalid_parameters' => 'Código <code>&lt;references&gt;</code> inválido; não são permitidos parâmetros. Utilize como <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'O elemento <code>&lt;references&gt;</code> é inválido;
+só é permitido o parâmetro "group".
+Use <code>&lt;references /&gt;</code>, ou <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Esgotamento das legendas personalizadas para backlinks.
+Defina mais na mensagem <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Esgotamento das legendas personalizadas para links, no grupo "$1".
+Defina mais na mensagem <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Tag <code>&lt;ref&gt;</code> inválida; não foi fornecido texto para as refs chamadas <code>$1</code>',
+ 'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> de fecho em falta, para o elemento <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'existem tags <code>&lt;ref&gt;</code>, mas nenhuma tag <code>&lt;references/&gt;</code> foi encontrada',
+ 'cite_error_group_refs_without_references' => 'existem tags <code>&lt;ref&gt;</code> para um grupo chamado "$1", mas nenhuma tag <code>&lt;references group="$1"/&gt;</code> correspondente foi encontrada',
+ 'cite_error_references_group_mismatch' => 'O elemento <code>&lt;ref&gt;</code> em <code>&lt;references&gt;</code> tem o atributo de grupo "$1", que está em conflito com o de <code>&lt;references&gt;</code>.',
+ 'cite_error_references_missing_group' => 'O elemento <code>&lt;ref&gt;</code> definido em <code>&lt;references&gt;</code> tem o atributo de grupo "$1", que não aparece no texto anterior.',
+ 'cite_error_references_missing_key' => 'A etiqueta <code>&lt;ref&gt;</code> com nome "$1" definida em <code>&lt;references&gt;</code> não é utilizada no texto acima.',
+ 'cite_error_references_no_key' => 'O elemento <code>&lt;ref&gt;</code> definido em <code>&lt;references&gt;</code> não tem um atributo de nome.',
+ 'cite_error_empty_references_define' => 'O elemento <code>&lt;ref&gt;</code> definido em <code>&lt;references&gt;</code> com o nome "$1" não tem conteúdo.',
+);
+
+/** Brazilian Portuguese (português do Brasil)
+ * @author Eduardo.mps
+ * @author Giro720
+ * @author 555
+ */
+$messages['pt-br'] = array(
+ 'cite-desc' => 'Adiciona marcas <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> para citações',
+ 'cite_croak' => 'Citação com problemas; $1: $2',
+ 'cite_error_key_str_invalid' => 'Erro interno;
+$str e/ou $key inválido.
+Isto nunca deveria acontecer.',
+ 'cite_error_stack_invalid_input' => 'Erro interno;
+chave fixa inválida.
+Isto nunca deveria ocorrer.',
+ 'cite_error' => 'Erro de citação: $1',
+ 'cite_error_ref_numeric_key' => 'Marca <code>&lt;ref&gt;</code> inválida;
+o nome não pode ser um número. Utilize um título descritivo',
+ 'cite_error_ref_no_key' => 'Marca <code>&lt;ref&gt;</code> inválida;
+refs sem conteúdo devem ter um nome',
+ 'cite_error_ref_too_many_keys' => 'Marca <code>&lt;ref&gt;</code> inválida;
+nomes inválidos (por exemplo, muito extenso)',
+ 'cite_error_ref_no_input' => 'Marca <code>&lt;ref&gt;</code> inválida;
+refs sem nome devem possuir conteúdo',
+ 'cite_error_references_invalid_parameters' => 'Marca <code>&lt;references&gt;</code> inválida;
+não são permitidos parâmetros.
+Utilize <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Marca <code>&lt;references&gt;</code> inválida;
+só o parâmetro "group" é permitido.
+Utilize <code>&lt;references /&gt;</code>, ou <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Etiquetas de backlink esgotadas.
+Defina mais na mensagem <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Esgotamento das legendas personalizadas para links, no grupo "$1".
+Defina mais na mensagem <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Marca <code>&lt;ref&gt;</code> inválida;
+não foi fornecido texto para as refs chamadas <code>$1</code>',
+ 'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> de fechamento ausente para para a marca <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'existem marcas <code>&lt;ref&gt;</code>, mas nenhuma marca <code>&lt;references/&gt;</code> foi encontrada',
+ 'cite_error_group_refs_without_references' => 'existem marcas <code>&lt;ref&gt;</code> para um grupo chamado "$1", mas nenhuma marca <code>&lt;references group="$1"/&gt;</code> correspondente foi encontrada',
+ 'cite_error_references_group_mismatch' => 'marca <code>&lt;ref&gt;</code> em <code>&lt;references&gt;</code> tem o atributo grupo "$1" conflitante.',
+ 'cite_error_references_missing_group' => 'marca <code>&lt;ref&gt;</code> definida em <code>&lt;references&gt;</code> tem atributo grupo "$1" que não aparece no texto anterior.',
+ 'cite_error_references_missing_key' => 'marca <code>&lt;ref&gt;</code> com nome "$1" definida em <code>&lt;references&gt;</code> não foi utilizada no texto anterior.',
+ 'cite_error_references_no_key' => 'marca <code>&lt;ref&gt;</code> definida em <code>&lt;references&gt;</code> não tem atributo nome.',
+ 'cite_error_empty_references_define' => 'marca <code>&lt;ref&gt;</code> definida em <code>&lt;references&gt;</code> com nome "$1" não tem nenhum conteúdo.',
+);
+
+/** Quechua (Runa Simi)
+ * @author AlimanRuna
+ */
+$messages['qu'] = array(
+ 'cite-desc' => 'Pukyumanta willanapaq <nowiki><ref[ name=id]></nowiki> , <nowiki><references/></nowiki> unanchachakunatam yapan',
+ 'cite_croak' => "''Cite'' nisqa mast'arinaqa manañam kanchu; $1: $2",
+ 'cite_error_key_str_invalid' => 'Ukhu pantasqa;
+mana allin $str wan/icha $key.
+Kayqa ama hayk\'appas tukukunchu.',
+ 'cite_error_stack_invalid_input' => "Ukhu pantasqa;
+tawqa llawiqa manam allinchu.
+Kayqa ama hayk'appas tukukunchu.",
+ 'cite_error' => 'Pukyumanta willaypi pantasqa: $1',
+ 'cite_error_ref_numeric_key' => "<code>&lt;ref&gt;</code> unanchachaqa manam allinchu;
+sutinqa ama yupaylla kachunchu. Ch'uyanchaq sutinta llamk'achiy",
+ 'cite_error_ref_no_key' => "<code>&lt;ref&gt;</code> unanchachaqa manam allinchu;
+ch'usaq pukyu willana unanchachaqa sutiyuqmi kachun",
+ 'cite_error_ref_too_many_keys' => '<code>&lt;ref&gt;</code> unanchachaqa manam allinchu;
+sutinkunaqa manam allinchu, nisyu sutinchá',
+ 'cite_error_ref_no_input' => "<code>&lt;ref&gt;</code> unanchachaqa manam allinchu;
+sutinnaq pukyu willana unanchachaqa ama ch'usaqchu kachun",
+ 'cite_error_references_invalid_parameters' => "<code>&lt;ref&gt;</code> unanchachaqa manam allinchu;
+ama kuskanachina tupuchu kachun. <code>&lt;references /&gt;</code> unanchachata llamk'achiy",
+ 'cite_error_references_invalid_parameters_group' => '<code>&lt;ref&gt;</code> unanchachaqa manam allinchu;
+"group" nisqa kuskanachina tupulla kachun. <code>&lt;references /&gt;</code> icha <code>&lt;references group="..." /&gt;</code> unanchachata llamk\'achiy',
+ 'cite_error_references_no_backlink_label' => "Manañam kanchu allichana kutimuy t'inki unanchakuna.
+Astawan sut'ichay <nowiki>[[MediaWiki:Cite references link many format backlink labels|Pukyumanta willaykuna achka allichana kutimuy t'inki unanchakunata t'inkin]]</nowiki> nisqa willaypi",
+ 'cite_error_references_no_text' => '<code>&lt;ref&gt;</code> unanchachaqa manam allinchu;
+<code>$1</code> nisqapaq pukyu qillqa manam kanchu',
+ 'cite_error_included_ref' => "Kichaq <code>&lt;ref&gt;</code> unanchachapaq wichq'aq <code>&lt;/ref&gt;</code> unanchachaqa manam kanchu",
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> unanchacham kachkan, ichataq manam <code>&lt;references/&gt;</code> unanchachachu',
+ 'cite_error_group_refs_without_references' => '"$1" sutiyuq huñupaq <code>&lt;ref&gt;</code> unanchacham kachkan, ichataq manam chay huñupaq qillqasqa <code>&lt;references/&gt;</code> unanchachachu',
+);
+
+/** Romanian (română)
+ * @author Firilacroco
+ * @author KlaudiuMihaila
+ * @author Mihai
+ * @author Minisarm
+ */
+$messages['ro'] = array(
+ 'cite-desc' => 'Adaugă etichete <nowiki><ref[ name=id]></nowiki> și <nowiki><references/></nowiki>, pentru citări',
+ 'cite_croak' => 'Citare coruptă; $1 : $2',
+ 'cite_error_key_str_invalid' => 'Eroare internă;
+$str invalid sau/și $key.
+Acestea nu ar trebui să se întâmple.',
+ 'cite_error_stack_invalid_input' => 'Eroare internă;
+stivă cheie invalidă.
+Acestea nu ar trebui să se întâmple.',
+ 'cite_error' => 'Eroare la citare: $1',
+ 'cite_error_ref_numeric_key' => 'Etichetă <code>&lt;ref&gt;</code> invalidă;
+numele nu poate fi un număr. Folosește un titlu descriptiv',
+ 'cite_error_ref_no_key' => 'Etichetă <code>&lt;ref&gt;</code> invalidă;
+ref-urile fără conținut trebuie să aibă un nume',
+ 'cite_error_ref_too_many_keys' => 'Etichetă <code>&lt;ref&gt;</code> invalidă;
+nume invalid, ex. prea multe nume',
+ 'cite_error_ref_no_input' => 'Etichetă <code>&lt;ref&gt;</code> invalidă;
+ref-urile fără nume trebuie să aibă conținut',
+ 'cite_error_references_invalid_parameters' => 'Etichetă <code>&lt;references&gt;</code> invalidă;
+parametrii nu sunt permiși.
+Folosește eticheta <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Etichetă <code>&lt;references&gt;</code> invalidă;
+doar parametrul „grup†este permis.
+Folosește eticheta <code>&lt;references /&gt;</code>, sau <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_text' => 'Etichetă <code>&lt;ref&gt;</code> invalidă;
+niciun text nu a fost furnizat pentru ref-urile numite <code>$1</code>',
+ 'cite_error_included_ref' => 'Eticheta de închidere <code>&lt;/ref&gt;</code> lipsește pentru eticheta <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Etichete <code>&lt;ref&gt;</code> există, dar nu s-a găsit nicio etichetă <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Etichete <code>&lt;ref&gt;</code> există pentru un grup numit „$1â€, dar nu È™i o etichetă <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'Eticheta <code>&lt;ref&gt;</code> din <code>&lt;references&gt;</code> are atributul de grup „$1†care a intrat în conflict.',
+ 'cite_error_references_missing_group' => 'Eticheta <code>&lt;ref&gt;</code> definită în <code>&lt;references&gt;</code> are atributul de grup „$1†care nu apare în textul anterior.',
+ 'cite_error_references_missing_key' => 'Eticheta <code>&lt;ref&gt;</code> cu numele „$1†definită în <code>&lt;references&gt;</code> nu este utilizată în textul anterior.',
+ 'cite_error_references_no_key' => 'Eticheta <code>&lt;ref&gt;</code> definită în <code>&lt;references&gt;</code> nu are atributul nume.',
+ 'cite_error_empty_references_define' => 'Eticheta <code>&lt;ref&gt;</code> definită în <code>&lt;references&gt;</code> cu numele „$1†nu are conținut.',
+);
+
+/** tarandíne (tarandíne)
+ * @author Joetaras
+ */
+$messages['roa-tara'] = array(
+ 'cite-desc' => 'Aggiunge le tag <nowiki><ref[ name=id]></nowiki> and <nowiki><references/></nowiki> pe le citaziune',
+ 'cite_croak' => 'Cite muerte; $1: $2',
+ 'cite_error_key_str_invalid' => 'Errore inderne;
+invalide $str e/o $key.
+Quiste non g\'avessa succedere.',
+ 'cite_error_stack_invalid_input' => "Errore inderne;
+stack key invalide.
+Quiste non g'avessa succedere.",
+ 'cite_error' => 'Cite errore: $1',
+ 'cite_error_ref_numeric_key' => "Tag <code>&lt;ref&gt;</code> invalide;
+'u nome non ge pò essere sole 'n'indere. Ause 'nu titele descrittive",
+ 'cite_error_ref_no_key' => "Tag <code>&lt;ref&gt;</code> invalide;
+le referimende senza condenute onne tenè 'nu nome",
+ 'cite_error_ref_too_many_keys' => 'Tag <code>&lt;ref&gt;</code> invalide;
+nome invalide, pe esembie troppe luènghe',
+ 'cite_error_ref_no_input' => "Tag <code>&lt;ref&gt;</code> invalide;
+referimende senza nome onne tenè 'nu condenute",
+ 'cite_error_references_invalid_parameters' => 'Tag <code>&lt;references&gt;</code> invalide;
+non ge se pò mettere nisciune parametre.
+Ause <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Tag <code>&lt;references&gt;</code> invalide;
+sulamende \'u parametre "group" pò essere ausate.
+Ause <code>&lt;references /&gt;</code> o <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => "Le etichette personalizzate pe le collegaminde de rrete onne spicciate.
+Definiscene otre jndr'à 'u messàgge <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.",
+ 'cite_error_no_link_label_group' => 'Le etichette personalizzate de le collegaminde pu gruppe "$1" onne spicciate.
+Definiscene otre jndr\'à \'u messàgge <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Tag <code>&lt;ref&gt;</code> invalide;
+nisciune teste ere previste pe le referimende nnomenate <code>$1</code>',
+ 'cite_error_included_ref' => "Stè 'u tag <code>&lt;/ref&gt;</code> ma manghe <code>&lt;ref&gt;</code>",
+ 'cite_error_refs_without_references' => "'u tag <code>&lt;ref&gt;</code> esiste, ma non g'esiste 'u tag <code>&lt;references/&gt;</code>",
+ 'cite_error_group_refs_without_references' => '\'U tag <code>&lt;ref&gt;</code> esiste pu gruppe nomenate "$1", ma non ge corresponne a \'u tag acchiate <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => "'U tag <code>&lt;ref&gt;</code> tag jndr'à <code>&lt;references&gt;</code> tène conflitte cu l'attribbute d'u gruppe \"\$1\".",
+ 'cite_error_references_missing_group' => "'U tag <code>&lt;ref&gt;</code> definite jndr'à <code>&lt;references&gt;</code> ave attribbute de gruppe \"\$1\" 'u quale non ge jesse jndr'à 'u teste prengepàle.",
+ 'cite_error_references_missing_key' => "'U tag <code>&lt;ref&gt;</code> cu 'u nome \"\$1\" definite jndr'à <code>&lt;references&gt;</code> non g'avene ausate jndr'à 'u teste prengepàle.",
+ 'cite_error_references_no_key' => "'U tag <code>&lt;ref&gt;</code> definite jndr'à <code>&lt;references&gt;</code> non ge tène 'nu nome d'attrebbute.",
+ 'cite_error_empty_references_define' => '\'U tag <code>&lt;ref&gt;</code> definite jndr\'à <code>&lt;references&gt;</code> cu \'u nome "$1" non ge tène condenute.',
+);
+
+/** Russian (руÑÑкий)
+ * @author Ahonc
+ * @author Dim Grits
+ * @author Ferrer
+ * @author KPu3uC B Poccuu
+ * @author Kaganer
+ * @author Kalan
+ * @author ÐлекÑандр Сигачёв
+ */
+$messages['ru'] = array(
+ 'cite-desc' => 'ДобавлÑет теги <nowiki><ref[ name=id]></nowiki> и <nowiki><references/></nowiki> Ð´Ð»Ñ ÑноÑок',
+ 'cite_croak' => 'Цитата умерла; $1: $2',
+ 'cite_error_key_str_invalid' => "ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°;
+ошибочное значение '''\$str''' или '''\$key'''.
+Подобное не должно проиÑходить.",
+ 'cite_error_stack_invalid_input' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°.
+Ðеверный ключ Ñтека.
+Подобное не должно проиÑходить.',
+ 'cite_error' => 'Ошибка Ñ†Ð¸Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ $1',
+ 'cite_error_ref_numeric_key' => 'Ðеправильный тег <code>&lt;ref&gt;</code>;
+Ð¸Ð¼Ñ Ð½Ðµ может быть целым чиÑлом. ИÑпользуйте опиÑательное название',
+ 'cite_error_ref_no_key' => 'Ðеправильный тег <code>&lt;ref&gt;</code>;
+Ñлемент без ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ иметь имÑ.',
+ 'cite_error_ref_too_many_keys' => 'Ðеправильный тег <code>&lt;ref&gt;</code>;
+ошибочные имена, возможно, Ñлишком много',
+ 'cite_error_ref_no_input' => 'Ðеправильный тег <code>&lt;ref&gt;</code>;
+Ñлемент без имени должен иметь Ñодержание',
+ 'cite_error_references_invalid_parameters' => 'Ðеправильный тег <code>&lt;references&gt;</code>;
+параметры не разрешены.
+ИÑпользуйте <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => "Ошибочный тег <code>&lt;references&gt;</code>;
+можно иÑпользовать только параметр <code>'''group'''</code>.
+ИÑпользуйте <code>&lt;references /&gt;</code> или <code>&lt;references group=\"…\" /&gt;</code>",
+ 'cite_error_references_no_backlink_label' => 'Ðе хватает Ñимволов Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð½Ñ‹Ñ… гиперÑÑылок.
+Следует раÑширить ÑиÑтемное Ñообщение <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'ЗакончилиÑÑŒ отметки пользовательÑких ÑÑылок Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ «$1».
+Определите дополнительные в Ñообщении <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Ðеверный тег <code>&lt;ref&gt;</code>; Ð´Ð»Ñ ÑноÑок <code>$1</code> не указан текÑÑ‚',
+ 'cite_error_included_ref' => 'ОтÑутÑтвует закрывающий тег <code>&lt;/ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Ð”Ð»Ñ ÑущеÑтвующего тега <code>&lt;ref&gt;</code> не найдено ÑоответÑтвующего тега <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Ð”Ð»Ñ ÑущеÑтвующих тегов <code>&lt;ref&gt;</code> группы «$1» не найдено ÑоответÑтвующего тега <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'Тег <code>&lt;ref&gt;</code> в <code>&lt;references&gt;</code> имеет конфликтующие группы атрибутов «$1».',
+ 'cite_error_references_missing_group' => 'Тег <code>&lt;ref&gt;</code>, определённый в <code>&lt;references&gt;</code>, имеет атрибут группы «$1», который не упоминаетÑÑ Ð² текÑте ранее.',
+ 'cite_error_references_missing_key' => 'Тег <code>&lt;ref&gt;</code> Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «$1», определённый в <code>&lt;references&gt;</code>, не иÑпользуетÑÑ Ð² предшеÑтвующем текÑте.',
+ 'cite_error_references_no_key' => 'Тег <code>&lt;ref&gt;</code>, определённый в <code>&lt;references&gt;</code>, не имеет атрибута имени.',
+ 'cite_error_empty_references_define' => 'Тег <code>&lt;ref&gt;</code>, определённый в <code>&lt;references&gt;</code>, Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «$1» не имеет ÑодержаниÑ.',
+ 'cite_reference_link_key_with_num' => '$1_$2',
+ 'cite_reference_link_prefix' => 'cite_ref-',
+ 'cite_references_link_prefix' => 'cite_note-',
+ 'cite_reference_link' => '<sup id="$1" class="reference">[[#$2|<nowiki>[</nowiki>$3<nowiki>]</nowiki>]]</sup>',
+ 'cite_references_link_many_format' => '<sup>[[#$1|$2]]</sup>',
+ 'cite_references_link_many_format_backlink_labels' => 'а б в г д е Ñ‘ ж з и й к л м н о п Ñ€ Ñ Ñ‚ у Ñ„ Ñ… ц ч ш щ ÑŠ Ñ‹ ÑŒ Ñ ÑŽ Ñ Ð°Ð° аб ав аг ад ае Ñ‘ аж аз аи ай ак ал ам ан ао ап ар Ð°Ñ Ð°Ñ‚ ау аф ах ац ач аш ащ аъ аы аь Ð°Ñ Ð°ÑŽ Ð°Ñ Ð±Ð° бб бв бг бд бе бж бз би бй бк бл бм бн бо бп бр Ð±Ñ Ð±Ñ‚ бу бф бх бц бч бш бщ бъ бы бь Ð±Ñ Ð±ÑŽ Ð±Ñ Ð²Ð° вб вв вг вд ве вж вз ви вй вк вл вм вн во вп вр Ð²Ñ Ð²Ñ‚ ву вф вх вц вч вш вщ въ вы вь Ð²Ñ Ð²ÑŽ Ð²Ñ Ð³Ð° гб гв гг гд ге гж гз ги гй гк гл гм гн го гп гр Ð³Ñ Ð³Ñ‚ гу гф гх гц гч гш гщ гъ гы гь Ð³Ñ Ð³ÑŽ Ð³Ñ Ð´Ð° дб дв дг дд де дж дз ди дй дк дл дм дн до дп др Ð´Ñ Ð´Ñ‚ ду дф дх дц дч дш дщ дъ ды дь Ð´Ñ Ð´ÑŽ Ð´Ñ ÐµÐ° еб ев ег ед ее еж ез еи ей ек ел ем ен ео еп ер ÐµÑ ÐµÑ‚ еу еф ех ец еч еш ещ еъ еы еь ÐµÑ ÐµÑŽ ÐµÑ Ð¶Ð° жб жв жг жд же жж жз жи жй жк жл жм жн жо жп жр Ð¶Ñ Ð¶Ñ‚ жу жф жх жц жч жш жщ жъ жы жь Ð¶Ñ Ð¶ÑŽ Ð¶Ñ Ð·Ð° зб зв зг зд зе зж зз зи зй зк зл зм зн зо зп зр Ð·Ñ Ð·Ñ‚ зу зф зх зц зч зш зщ зъ зы зь Ð·Ñ Ð·ÑŽ Ð·Ñ Ð¸Ð° иб ив иг ид ие иж из ии ий ик ил им ин ио ип ир Ð¸Ñ Ð¸Ñ‚ иу иф их иц ич иш ищ иъ иы иь Ð¸Ñ Ð¸ÑŽ Ð¸Ñ Ð¹Ð° йб йв йг йд йе йж йз йи йй йк йл йм йн йо йп йр Ð¹Ñ Ð¹Ñ‚ йу йф йх йц йч йш йщ йъ йы йь Ð¹Ñ Ð¹ÑŽ Ð¹Ñ ÐºÐ° кб кв кг кд ке кж кз ки кй кк кл км кн ко кп кр ÐºÑ ÐºÑ‚ ку кф кх кц кч кш кщ къ кы кь ÐºÑ ÐºÑŽ ÐºÑ Ð»Ð° лб лв лг лд ле лж лз ли лй лк лл лм лн ло лп лр Ð»Ñ Ð»Ñ‚ лу лф лх лц лч лш лщ лъ лы ль Ð»Ñ Ð»ÑŽ Ð»Ñ Ð¼Ð° мб мв мг мд ме мж мз ми мй мк мл мм мн мо мп мр Ð¼Ñ Ð¼Ñ‚ му мф мх мц мч мш мщ мъ мы мь Ð¼Ñ Ð¼ÑŽ Ð¼Ñ Ð½Ð° нб нв нг нд не нж нз ни нй нк нл нм нн но нп нр Ð½Ñ Ð½Ñ‚ ну нф нх нц нч нш нщ нъ ны нь Ð½Ñ Ð½ÑŽ Ð½Ñ Ð¾Ð° об ов ог од ое ож оз ои ой ок ол ом он оо оп ор Ð¾Ñ Ð¾Ñ‚ оу оф ох оц оч ош ощ оъ оы оь Ð¾Ñ Ð¾ÑŽ Ð¾Ñ Ð¿Ð° пб пв пг пд пе пж пз пи пй пк пл пм пн по пп пр Ð¿Ñ Ð¿Ñ‚ пу пф пх пц пч пш пщ пъ пы пь Ð¿Ñ Ð¿ÑŽ Ð¿Ñ Ñ€Ð° рб рв рг рд ре рж рз ри рй рк рл рм рн ро рп рр Ñ€Ñ Ñ€Ñ‚ ру рф рх рц рч рш рщ ръ ры рь Ñ€Ñ Ñ€ÑŽ Ñ€Ñ Ñа Ñб Ñв Ñг Ñд Ñе Ñж Ñз Ñи Ñй Ñк Ñл Ñм Ñн Ñо Ñп ÑÑ€ ÑÑ ÑÑ‚ Ñу ÑÑ„ ÑÑ… Ñц Ñч Ñш Ñщ ÑÑŠ ÑÑ‹ ÑÑŒ ÑÑ ÑÑŽ ÑÑ Ñ‚Ð° тб тв тг тд те тж тз ти тй тк тл тм тн то тп Ñ‚Ñ€ Ñ‚Ñ Ñ‚Ñ‚ ту Ñ‚Ñ„ Ñ‚Ñ… тц тч тш тщ Ñ‚ÑŠ Ñ‚Ñ‹ Ñ‚ÑŒ Ñ‚Ñ Ñ‚ÑŽ Ñ‚Ñ ÑƒÐ° уб ув уг уд уе уж уз уи уй ук ул ум ун уо уп ур ÑƒÑ ÑƒÑ‚ уу уф ух уц уч уш ущ уъ уы уь ÑƒÑ ÑƒÑŽ ÑƒÑ Ñ„Ð° фб фв фг фд фе фж фз фи фй фк фл фм фн фо фп Ñ„Ñ€ Ñ„Ñ Ñ„Ñ‚ фу Ñ„Ñ„ Ñ„Ñ… фц фч фш фщ Ñ„ÑŠ Ñ„Ñ‹ Ñ„ÑŒ Ñ„Ñ Ñ„ÑŽ Ñ„Ñ Ñ…Ð° хб хв хг хд хе хж хз хи хй хк хл хм хн хо хп Ñ…Ñ€ Ñ…Ñ Ñ…Ñ‚ ху Ñ…Ñ„ Ñ…Ñ… хц хч хш хщ Ñ…ÑŠ Ñ…Ñ‹ Ñ…ÑŒ Ñ…Ñ Ñ…ÑŽ Ñ…Ñ Ñ†Ð° цб цв цг цд це цж цз ци цй цк цл цм цн цо цп цр Ñ†Ñ Ñ†Ñ‚ цу цф цх цц цч цш цщ цъ цы ць Ñ†Ñ Ñ†ÑŽ Ñ†Ñ Ñ‡Ð° чб чв чг чд че чж чз чи чй чк чл чм чн чо чп чр Ñ‡Ñ Ñ‡Ñ‚ чу чф чх чц чч чш чщ чъ чы чь Ñ‡Ñ Ñ‡ÑŽ Ñ‡Ñ ÑˆÐ° шб шв шг шд ше шж шз ши шй шк шл шм шн шо шп шр ÑˆÑ ÑˆÑ‚ шу шф шх шц шч шш шщ шъ шы шь ÑˆÑ ÑˆÑŽ ÑˆÑ Ñ‰Ð° щб щв щг щд ще щж щз щи щй щк щл щм щн що щп щр Ñ‰Ñ Ñ‰Ñ‚ щу щф щх щц щч щш щщ щъ щы щь Ñ‰Ñ Ñ‰ÑŽ Ñ‰Ñ ÑŠÐ° ъб ъв ъг ъд ъе ъж ъз ъи ъй ък ъл ъм ън ъо ъп ÑŠÑ€ ÑŠÑ ÑŠÑ‚ ъу ÑŠÑ„ ÑŠÑ… ъц ъч ъш ъщ ÑŠÑŠ ÑŠÑ‹ ÑŠÑŒ ÑŠÑ ÑŠÑŽ ÑŠÑ Ñ‹Ð° ыб ыв ыг ыд ые ыж ыз ыи ый ык ыл ым ын ыо ып Ñ‹Ñ€ Ñ‹Ñ Ñ‹Ñ‚ ыу Ñ‹Ñ„ Ñ‹Ñ… ыц ыч ыш ыщ Ñ‹ÑŠ Ñ‹Ñ‹ Ñ‹ÑŒ Ñ‹Ñ Ñ‹ÑŽ Ñ‹Ñ ÑŒÐ° ьб ьв ьг ьд ье ьж ьз ьи ьй ьк ьл ьм ьн ьо ьп ьр ÑŒÑ ÑŒÑ‚ ьу ьф ьх ьц ьч ьш ьщ ьъ ьы ьь ÑŒÑ ÑŒÑŽ ÑŒÑ Ñа Ñб Ñв Ñг Ñд Ñе Ñж Ñз Ñи Ñй Ñк Ñл Ñм Ñн Ñо Ñп ÑÑ€ ÑÑ ÑÑ‚ Ñу ÑÑ„ ÑÑ… Ñц Ñч Ñш Ñщ ÑÑŠ ÑÑ‹ ÑÑŒ ÑÑ ÑÑŽ ÑÑ ÑŽÐ° юб юв юг юд юе юж юз юи юй юк юл юм юн юо юп ÑŽÑ€ ÑŽÑ ÑŽÑ‚ юу ÑŽÑ„ ÑŽÑ… юц юч юш ющ ÑŽÑŠ ÑŽÑ‹ ÑŽÑŒ ÑŽÑ ÑŽÑŽ ÑŽÑ Ñа Ñб Ñв Ñг Ñд Ñе Ñж Ñз Ñи Ñй Ñк Ñл Ñм Ñн Ñо Ñп ÑÑ€ ÑÑ ÑÑ‚ Ñу ÑÑ„ ÑÑ… Ñц Ñч Ñш Ñщ ÑÑŠ ÑÑ‹ ÑÑŒ ÑÑ ÑÑŽ ÑÑ',
+ 'cite_references_link_many_sep' => '&#32;',
+ 'cite_references_link_many_and' => '&#32;',
+);
+
+/** Rusyn (руÑиньÑкый)
+ * @author Gazeb
+ */
+$messages['rue'] = array(
+ 'cite-desc' => 'ПридаÑÑ‚ÑŒ таґы <nowiki><ref[ name="id"]></nowiki> Ñ–&nbsp;<nowiki><references /></nowiki> на Ð¾Ð·Ð½Ð°Ñ‡Ñ–Ð½Ñ Ñ†Ñ–Ñ‚Ð°Ñ†Ñ–Ð¹',
+ 'cite_croak' => 'Ðефункчна цітаціÑ; $1: $2',
+ 'cite_error_key_str_invalid' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°;
+неплатный $str або $key.
+Тото бы не мало ниґда наÑтати.',
+ 'cite_error_stack_invalid_input' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ—ÑˆÐ½Ñ Ñ…Ñ‹Ð±Ð°;
+неплатный ключ Ñтека.
+Тото бы не мало ниґда наÑтати.',
+ 'cite_error' => 'Хыбна цітаціÑ: $1',
+ 'cite_error_ref_numeric_key' => 'Хыба в таґу <code>&lt;ref&gt;</code>; назвов не Ñміє быти проÑте чіÑло, хоÑнуйте попиÑове означінÑ',
+ 'cite_error_ref_no_key' => 'Хыба в таґу <code>&lt;ref&gt;</code>; порожнї едітації муÑÑÑ‚ÑŒ обÑÑговати назву',
+ 'cite_error_ref_too_many_keys' => 'Хыба в таґу <code>&lt;ref&gt;</code>; хыбны назвы, напр. є їх дуже много',
+ 'cite_error_ref_no_input' => 'Хыба в таґу <code>&lt;ref&gt;</code>; цітації без назвы муÑÑÑ‚ÑŒ мати влаÑтный обÑÑг',
+ 'cite_error_references_invalid_parameters' => 'Хыба в таґу <code>&lt;references&gt;</code>; ту не Ñ” доволеный параметер, хоÑнуйте <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Ðе платный таґ <tt>&lt;references&gt;</tt>;
+є поволеный лем параметер „group“.
+ХоÑнуйте <tt>&lt;references /&gt;</tt> або <tt>&lt;references group="..." /&gt;</tt>.',
+ 'cite_error_references_no_backlink_label' => 'Дішли Ð¾Ð·Ð½Ð°Ñ‡Ñ–Ð½Ñ Ð·Ð²Ð¾Ñ€Ð¾Ñ‚Ð½Ñ‹Ñ… одказів, придайте Ñ—Ñ… пару до Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Дішли дефінованы значкы про ґрупу „$1“.
+Звыште Ñ—Ñ… чіÑло у повідомлїню <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Хыба в таґу <code>&lt;ref&gt;</code>; цітації означеной <code>$1</code> не Ñ” доданый жаден текÑÑ‚',
+ 'cite_error_included_ref' => 'Хыбить Ð·Ð°ÐºÑ–Ð½Ñ‡Ñ–Ð½Ñ <code>&lt;/ref&gt;</code> k&nbsp;таґу <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Ðайджена значка <code>&lt;ref&gt;</code> без одповідной значкы <code>&lt;references/&gt;</code>.',
+ 'cite_error_group_refs_without_references' => 'Ðайджена значка <code>&lt;ref&gt;</code> про ґрупу „$1“ без одповідной значкы <code>&lt;references group="$1"/&gt;</code>.',
+ 'cite_error_references_group_mismatch' => 'Значка <code>&lt;ref&gt;</code> внутрї <code>&lt;references&gt;</code> має дефіновану іншу ґрупу „$1“.',
+ 'cite_error_references_missing_group' => 'Значка <code>&lt;ref&gt;</code> внутрї <code>&lt;references&gt;</code> хоÑнує ґрупу „$1“, котра ÑÑ Ð² попереднїм текÑÑ‚Ñ— не обÑвує.',
+ 'cite_error_references_missing_key' => 'Ðа <code>&lt;ref&gt;</code> з іменом „$1“ дефінованый внутрї <code>&lt;references&gt;</code> не Ñуть в попереднїм текÑÑ‚Ñ— жадны одказы.',
+ 'cite_error_references_no_key' => 'У значкы <code>&lt;ref&gt;</code> дефінованой внутрї <code>&lt;references&gt;</code> хыбить атрібут <code>name</code>.',
+ 'cite_error_empty_references_define' => 'У значкы <code>&lt;ref&gt;</code> з назвов „$1“ дефінованой внутрї <code>&lt;references&gt;</code> хыбить обÑÑг.',
+);
+
+/** Sanskrit (संसà¥à¤•à¥ƒà¤¤à¤®à¥)
+ * @author Shubha
+ */
+$messages['sa'] = array(
+ 'cite-desc' => '
+Adds<nowiki><ref[ name=id]></nowiki> तथा<nowiki><references/></nowiki> उदà¥à¤§à¤°à¤£à¤¾à¤¨à¤¾à¤‚ कृते समà¥à¤ªà¤°à¥à¤•à¤¤à¤¨à¥à¤¤à¤µà¤ƒ',
+ 'cite_croak' => 'उदà¥à¤§à¤°à¤£à¤‚ निरसà¥à¤¤à¤®à¥; $1: $2',
+ 'cite_error_key_str_invalid' => 'आनà¥à¤¤à¤°à¤¿à¤•à¤¦à¥‹à¤·à¤ƒ;
+अमानà¥à¤¯à¤®à¥ $str तथा/अथवा $key।
+à¤à¤µà¤‚ कदापि न भवेतॠ।',
+ 'cite_error_stack_invalid_input' => 'आनà¥à¤¤à¤°à¤¿à¤•à¤¦à¥‹à¤·à¤ƒ ;
+अमानà¥à¤¯à¤¾ राशिकà¥à¤žà¥à¤šà¤¿à¤•à¤¾ ।
+à¤à¤µà¤‚ कदापि न भवेतॠ।',
+ 'cite_error' => 'उदà¥à¤§à¤°à¤£à¥‡ दोषः : $1',
+ 'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> अमानà¥à¤¯à¤¶à¥ƒà¤™à¥à¤–ला;
+नाम पूरà¥à¤£à¤¾à¤™à¥à¤•à¤¸à¤™à¥à¤–à¥à¤¯à¤¾ भवितà¥à¤‚ नारà¥à¤¹à¤¤à¤¿ । विविरणयà¥à¤•à¥à¤¤à¤‚ शिरोनाम उपयà¥à¤œà¥à¤¯à¤¤à¤¾à¤®à¥ ।',
+ 'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> दोषपूरà¥à¤£à¤¾ शृङà¥à¤–ला;
+रिकà¥à¤¤à¤¾à¤§à¤¾à¤°à¤¾à¤ƒ अपि सनामकः भवेतॠ।',
+ 'cite_error_ref_too_many_keys' => '<code>&lt;ref&gt;</code> दोषपूरà¥à¤£à¤¾ शृङà¥à¤–ला;
+अमानà¥à¤¯à¤‚ नाम, उदा. अतà¥à¤¯à¤§à¤¿à¤•à¤®à¥',
+ 'cite_error_ref_no_input' => '<code>&lt;ref&gt;</code> दोषपूरà¥à¤£à¤¾ शृङà¥à¤–ला;
+रिकà¥à¤¤à¤¾à¤§à¤¾à¤°à¤¾à¤ƒ अपि सनामकः भवेयà¥à¤ƒ ।',
+ 'cite_error_references_invalid_parameters' => '<code>&lt;references&gt;</code> असिदà¥à¤§à¤¾à¤™à¥à¤•à¤¨à¤®à¥; परिमितिः निरà¥à¤¦à¥‡à¤·à¥à¤Ÿà¥à¤®à¥ अशकà¥à¤¯à¤¾, <code>&lt;references /&gt;</code> उपयà¥à¤œà¥à¤¯à¤¤à¤¾à¤®à¥',
+ 'cite_error_references_invalid_parameters_group' => "<code>&lt;references&gt;</code> अयà¥à¤•à¥à¤¤à¤•à¥‚टपà¥à¤°à¤£à¤¾à¤²à¥€;
+परिमिति''गणः'' à¤à¤µ अनà¥à¤®à¤¤à¤ƒ ।
+<code>&lt;references /&gt;</code> अथवा <code>&lt;references group=\"...\" /&gt;</code> उपयà¥à¤œà¥à¤¯à¤¤à¤¾à¤®à¥ ।",
+ 'cite_error_references_no_backlink_label' => 'सिदà¥à¤§à¤¾à¤¨à¤¿ पूरà¥à¤µà¤¤à¤¨à¤¸à¤®à¥à¤ªà¤°à¥à¤•à¤¶à¥€à¤°à¥à¤·à¤•à¤¾à¤£à¤¿ नषà¥à¤Ÿà¤¾à¤¨à¤¿ ।
+<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> इतà¥à¤¯à¤¸à¥à¤®à¤¿à¤¨à¥ सनà¥à¤¦à¥‡à¤¶à¥‡ अधिकविवरणं योजà¥à¤¯à¤¤à¤¾à¤®à¥ ।',
+ 'cite_error_no_link_label_group' => '"$1" आधारसमूहसà¥à¤¯ कसà¥à¤Ÿà¤‚-समà¥à¤ªà¤°à¥à¤•-लेबेलॠनà¥à¤¯à¥‚नानि जातानि ।
+<nowiki>[[MediaWiki:$2]]</nowiki> सनà¥à¤¦à¥‡à¤¶à¥‡ अधिकं निरà¥à¤µà¤šà¤¨à¤‚ दीयतामॠ।',
+ 'cite_error_references_no_text' => 'अमानà¥à¤¯à¤¾ <code>&lt;ref&gt;</code> शृङà¥à¤–ला;
+<code>$1</code> इतà¥à¤¯à¤¸à¥à¤¯ आधारः अजà¥à¤žà¤¾à¤¤à¤ƒ',
+ 'cite_error_included_ref' => 'समापà¥à¤¤à¤¿à¤ƒ <code>&lt;/ref&gt;</code> <code>&lt;ref&gt;</code> शृङà¥à¤–ला लà¥à¤ªà¥à¤¤à¤¾',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>शृङà¥à¤–ला विदà¥à¤¯à¤¤à¥‡, किनà¥à¤¤à¥ <code>&lt;references/&gt;</code> शृङà¥à¤–ला न पà¥à¤°à¤¾à¤ªà¥à¤¤à¤¾',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> "$1" नामकसà¥à¤¯ गणसà¥à¤¯ अङà¥à¤•à¤¨à¤‚ विदà¥à¤¯à¤¤à¥‡, कीनà¥à¤¤à¥ किमपि अनà¥à¤°à¥‚पं <code>&lt;references group="$1"/&gt;</code> अङà¥à¤•à¤¨à¤‚ न पà¥à¤°à¤¾à¤ªà¥à¤¤à¤®à¥',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> टैग इन <code>&lt;references&gt;</code>सङà¥à¤˜à¤°à¥à¤·à¤—णलकà¥à¤·à¤£à¤‚ "$1" विदà¥à¤¯à¤¤à¥‡ ।',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> अङà¥à¤•à¤¨à¤ªà¤°à¤¿à¤­à¤¾à¤·à¤¿à¤¤à¥‡ <code>&lt;references&gt;</code> à¤à¤¤à¤¸à¥à¤®à¤¿à¤¨à¥ गणसà¥à¤¯ विशेषः "$1" यशà¥à¤š पूरà¥à¤µà¤²à¥‡à¤–े न दृषà¥à¤Ÿà¤®à¥ ।',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> अङà¥à¤•à¤¨à¤‚ "$1" नामà¥à¤¨à¤¾ सह परिभाषितमॠ<code>&lt;references&gt;</code> पूरà¥à¤µà¤²à¥‡à¤–े उपयोगाय न जातमॠ।',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code>अङà¥à¤•à¤¨à¥‡ परिभाषितं <code>&lt;references&gt;</code> किमपि नामलकà¥à¤·à¤£à¤‚ न विदà¥à¤¯à¤¤à¥‡ ।',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> अङà¥à¤•à¤¨à¥‡ परिभाषितं <code>&lt;references&gt;</code> "$1" नामिका कापि सामगà¥à¤°à¥€ न विदà¥à¤¯à¤¤à¥‡ ।',
+);
+
+/** Sakha (Ñаха тыла)
+ * @author HalanTul
+ */
+$messages['sah'] = array(
+ 'cite-desc' => 'Ð¥Ð¾Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹ <nowiki><ref[ name=id]></nowiki> уонна <nowiki><references/></nowiki> тиÑктÑрин ÑбÑÑ€',
+ 'cite_croak' => 'Быһа тардыы Ñуох буолбут (Цитата Ñдохла); $1: $2',
+ 'cite_error_key_str_invalid' => 'ИһинÑÑҕи Ñыыһа: $str уонна/ÑбÑÑ‚ÑÑ€ $key Ñыыһалар.',
+ 'cite_error_stack_invalid_input' => 'ИһинÑÑҕи Ñыыһа: stack key Ñыыһалаах',
+ 'cite_error' => 'Цитата Ñыыһата: $1',
+ 'cite_error_ref_numeric_key' => 'Ðеправильный вызов: ожидалÑÑ Ð½ÐµÑ‡Ð¸Ñловой ключ',
+ 'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> тиÑк алҕаһа (Ðеправильный вызов): аата (күлүүһÑ) ыйыллыбатах',
+ 'cite_error_ref_too_many_keys' => '<code>&lt;ref&gt;</code> тиÑк алҕаһа (Ðеправильный вызов): аата Ñыыһа ыйыллыбыт, ÑбÑÑ‚ÑÑ€ наһаа ÑлбÑÑ… аат Ñуруллубут',
+ 'cite_error_ref_no_input' => '<code>&lt;ref&gt;</code> тиÑк алҕаÑтаах (Ðеверный вызов): иһинÑÑÒ•Ð¸Ñ‚Ñ Ñыыһа',
+ 'cite_error_references_invalid_parameters' => 'Сыыһа параметрдар бÑриллибиттÑÑ€; <code>&lt;references /&gt;</code> тиÑÐºÐºÑ Ð¾Ñ‚Ð¾Ð¹ Ñуох буолуохтаахтар',
+ 'cite_error_references_invalid_parameters_group' => 'Сыыһалаах <code>&lt;references&gt;</code> тиÑк;
+"group" ÑÑ€Ñ Ð¿Ð°Ñ€Ð°Ð°Ð¼Ð°Ñ‚Ñ‹Ñ€Ñ‹ туһаныахха Ñөп.
+Маны <code>&lt;references /&gt;</code>, ÑбÑÑ‚ÑÑ€ <code>&lt;references group="..." /&gt;</code> туһан.',
+ 'cite_error_references_no_backlink_label' => 'Төннөрөр ÑигÑлÑÑ€Ð³Ñ Ð±ÑлиÑлÑÑ€Ñ Ñ‚Ð¸Ð¸Ð¹Ð±ÑÑ‚Ñ‚ÑÑ€.
+<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> диÑн ÑиÑтиÑÐ¼Ñ Ñтиитин кÑÒ¥ÑÑ‚Ñн биÑÑ€ÑÑ…Ñ…Ñ Ð½Ð°Ð°Ð´Ð°',
+ 'cite_error_no_link_label_group' => '«$1» бөлөх кыттааччыларын ÑигÑлÑрин бÑлиÑлÑÑ€Ñ Ð±Ò¯Ð¿Ð¿Ò¯Ñ‚Ñ‚ÑÑ€.
+Эбии манна <nowiki>[[MediaWiki:$2]]</nowiki> оҥор.',
+ 'cite_error_references_no_text' => 'Сыыһа <code>&lt;ref&gt;</code> тиÑк (тег);
+<code>$1</code> диÑн Ñ…Ð¾Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹Ð»Ð°Ñ€Ð³Ð° аналлаах тиÑÐºÐ¸Ñ Ñуох',
+ 'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> диÑн Ñабар тиÑк Ñуох Ñбит',
+ 'cite_error_refs_without_references' => 'Баар <code>&lt;ref&gt;</code> тиÑÐºÐºÑ Ñөп түбÑÒ»ÑÑ€ <code>&lt;references/&gt;</code> тиÑк көÑтүбÑÑ‚Ñ',
+ 'cite_error_group_refs_without_references' => '"$1" бөлөх <code>&lt;ref&gt;</code> тиÑгигÑÑ€ Ñөп түбÑÒ»ÑÑ€ <code>&lt;references group="$1"/&gt;</code> тиÑк көÑтүбÑÑ‚Ñ',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> туттуллар <code>&lt;ref&gt;</code> тиÑк бÑÐ¹Ñ Ð±ÑйÑлÑрин кытта ÑөпÑÓ©Ñпөт "$1" атрибуттаах бөлөхтөрдөөх',
+ 'cite_error_references_missing_group' => 'Бу <code>&lt;references&gt;</code> туттар маннык <code>&lt;ref&gt;</code> тиÑÐ³Ñ Ð±Ó©Ð»Ó©Ñ… тиÑкиһигÑÑ€ урут көрÑүллүбÑÑ‚ÑÑ… "$1" атрибуттаах.',
+ 'cite_error_references_missing_key' => 'Бу <code>&lt;references&gt;</code> туттар маннык <code>&lt;ref&gt;</code> "$1" диÑн тиÑÐ³Ñ Ð±Ñƒ иннинÑÑҕи тиÑкиÑÐºÑ Ñ‚ÑƒÑ‚Ñ‚ÑƒÐ»Ð»ÑƒÐ±Ð°Ñ‚ Ñбит.',
+ 'cite_error_references_no_key' => 'Бу <code>&lt;references&gt;</code> туттар <code>&lt;ref&gt;</code> тиÑÐ³Ñ Ð°Ð°Ñ‚Ñ‹Ð½ атрибута Ñуох Ñбит.',
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code> туттар <code>&lt;ref&gt;</code> "$1" диÑн ааттаах тиÑÐ³Ñ Ð¸Ò»Ð¸Ð½ÑÑÒ•Ð¸Ñ‚Ñ Ñуох Ñбит.',
+);
+
+/** Sicilian (sicilianu)
+ * @author Melos
+ * @author Santu
+ */
+$messages['scn'] = array(
+ 'cite-desc' => 'Junci li tag <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> pi gistiri li citazzioni',
+ 'cite_croak' => 'Sbàgghiu nnâ citazzioni: $1: $2',
+ 'cite_error_key_str_invalid' => 'Sbàgghiu nternu: $str sbagghiatu',
+ 'cite_error_stack_invalid_input' => 'Sbàgghiu nternu: chiavi di stack sbagghiata',
+ 'cite_error' => 'Sbàgghiu nnâ funzioni Cite $1',
+ 'cite_error_ref_numeric_key' => "Sbàgghiu ni l'usu dû marcaturi <code>&lt;ref&gt;</code>: lu nomu pò èssiri nu nùmmiru sanu. Usari nu tìtulu discrittivu",
+ 'cite_error_ref_no_key' => "Sbàgghiu ni l'usu dû marcaturi <code>&lt;ref&gt;</code>: li ref vacanti non ponnu èssiri senza nomu.",
+ 'cite_error_ref_too_many_keys' => "Sbàgghiu ni l'usu dû marcaturi <code>&lt;ref&gt;</code>: nomi non vàlidi (pi es. nùmmiru troppu àutu)",
+ 'cite_error_ref_no_input' => "Sbàgghiu ni l'usu dû marcaturi <code>&lt;ref&gt;</code>: li ref senza nomu non ponnu èssiri vacanti",
+ 'cite_error_references_invalid_parameters' => "Sbàgghiu ni l'usu dû marcaturi <code>&lt;references&gt;</code>: paràmitri non ammittuti, usari li marcaturi <code>&lt;references /&gt;</code>",
+ 'cite_error_references_invalid_parameters_group' => 'Sbàgghiu ni l\'usu dû marcaturi <code>&lt;references&gt;</code>;
+sulu lu paràmitru "group" è pirmittutu.
+Usari <code>&lt;references /&gt;</code> oppuru <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Etichetti di rimannata pirsunalizzati finuti, aumintari lu nùmmiru ntô missàggiu <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_references_no_text' => 'Marcaturi <code>&lt;ref&gt;</code> non vàlidu; non vinni nnicatu nuddu testu pô marcaturi <code>$1</code>',
+ 'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> di chiusura mancanti pô marcaturi <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Sù prisenti dê marcatura <code>&lt;ref&gt;</code> ma nun fu attruvatu nissunu marcaturi <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Sù prisenti dê marcatura <code>&lt;ref&gt;</code> pi nu gruppu chiamatu "$1" ma nun fu truvatu nissunu marcaturi <code>&lt;references group="$1"/&gt;</code> currispunnenti',
+ 'cite_error_references_group_mismatch' => 'Lu tag <code>&lt;ref&gt;</code> n <code>&lt;references&gt;</code> havi attribuiutu lu gruppu "$1" n conflittu.',
+ 'cite_error_references_missing_group' => 'Lu tag <code>&lt;ref&gt;</code> difinutu n <code>&lt;references&gt;</code> havi n\'attributu gruppu "$1" ca nun cumpari ni lu testu pricidenti.',
+ 'cite_error_references_missing_key' => 'Lu tag <code>&lt;ref&gt;</code> cu nomu "$1" difinutu n <code>&lt;references&gt;</code> nun è usatu nô testu pricidenti.',
+ 'cite_error_references_no_key' => "Lu tag <code>&lt;ref&gt;</code> difinutu n <code>&lt;references&gt;</code> nun havi n'attributu nomu.",
+ 'cite_error_empty_references_define' => 'Lu tag <code>&lt;ref&gt;</code> difinutu n <code>&lt;references&gt;</code> cu lu nomu "$1" nun havi alcun cuntinutu.',
+ 'cite_reference_link_prefix' => 'muntuari ref',
+ 'cite_references_link_prefix' => 'muntuari annutazzioni',
+);
+
+/** Sinhala (සිංහල)
+ * @author Budhajeewa
+ * @author Thameera123
+ * @author නන්දිමිතුරු
+ */
+$messages['si'] = array(
+ 'cite-desc' => 'උපහරණයන් සඳහà·, <nowiki><ref[ name=id]></nowiki> සහ <nowiki><references/></nowiki> ටà·à¶œà¶ºà¶±à·Š, එකතු කරයි',
+ 'cite_croak' => 'උපන්â€à¶ºà·à·ƒà¶º නිරුද්ධවිය; $1: $2',
+ 'cite_error_key_str_invalid' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය;
+අනීතික $str සහ/හ෠$key.
+මෙය කිසිදින සිදුනොවිය යුතුය.',
+ 'cite_error_stack_invalid_input' => 'අභ්â€à¶ºà¶±à·Šà¶­à¶» දà·à·‚ය;
+අනීතික ඇසිරුම් යතුර.
+මෙය කිසිදින සිදුනොවිය යුතුය.',
+ 'cite_error' => 'උපන්â€à¶ºà·à·ƒ දà·à·‚ය: $1',
+ 'cite_error_ref_numeric_key' => 'අනීතික <code>&lt;ref&gt;</code> ටà·à¶œà¶º;
+නම සරල පූර්ණà·à¶‚කයක් විය නොහà·à¶š. විස්තරà·à·“ලි à·à·’ර්ෂයක් භà·à·€à·’ත෠කරන්න',
+ 'cite_error_ref_no_key' => 'අනීතික <code>&lt;ref&gt;</code> ටà·à¶œà¶º;
+පෙළ විරහිත ආà·à·Šâ€à¶»à·šà¶º සඳහ෠නමක් තිබිය යුතුය',
+ 'cite_error_ref_too_many_keys' => 'අනීතික <code>&lt;ref&gt;</code> ටà·à¶œà¶º;
+අනීතික නà·à¶¸à¶ºà¶±à·Š, නිද. පමණට à·€à·à¶©à·’',
+ 'cite_error_ref_no_input' => 'අනීතික <code>&lt;ref&gt;</code> ටà·à¶œà¶º;
+නà·à¶¸à¶ºà¶šà·Š නොමà·à¶­à·’ ආà·à·Šâ€à¶»à·šà¶º සඳහ෠පෙළක් තිබිය යුතුය',
+ 'cite_error_references_invalid_parameters' => 'අනීතික <code>&lt;references&gt;</code> ටà·à¶œà¶º;
+කිසිම පරà·à¶¸à·’තිකයකට ඉඩ නොදෙයි.
+<code>&lt;references /&gt;</code> භà·à·€à·’ත කරන්න',
+ 'cite_error_references_invalid_parameters_group' => 'අනීතික <code>&lt;references&gt;</code> ටà·à¶œà¶º;
+"කà·à¶«à·Šà¶©à¶º" පරà·à¶¸à·’තියට පමණක් ඉඩ දෙයි.
+<code>&lt;references /&gt;</code>, à·„à· <code>&lt;references group="..." /&gt;</code> භà·à·€à·’ත කරන්න',
+ 'cite_error_references_no_backlink_label' => 'උපයà·à¶œà·Šâ€à¶º පසුසබà·à¶³à·”ම් ලේබල අවසà·à¶± විය.
+<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> පණිවුඩයෙහි තවත් ඒව෠අර්ථදක්වන්න',
+ 'cite_error_no_link_label_group' => '"$1" කණ්ඩà·à¶ºà¶¸ සඳහ෠අභිමත සබà·à¶³à·’ ලේබල අවසන් විය.
+<nowiki>[[MediaWiki:$2]]</nowiki> පණිවුඩයේ තවත් à·€à·à¶©à·’පුර සඳහන් කරන්න.',
+ 'cite_error_references_no_text' => 'අනීතික <code>&lt;ref&gt;</code> ටà·à¶œà¶º;
+<code>$1</code> නමà·à¶­à·’ ආà·à·Šâ€à¶»à·šà¶ºà¶±à·Š සඳහ෠කිසිදු පෙළක් සපය෠නොතිබුණි',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ටà·à¶œà¶º සොයà·à¶œà¶­ නොහà·à¶šà·’ බà·à·€à·’න් <code>&lt;/ref&gt;</code> වස෠දමමින්',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ටà·à¶œ පà·à·€à¶­à·”ණත්, <code>&lt;references/&gt;</code> ටà·à¶œ සොයà·à¶œà¶­ නොහà·à¶šà·’ විය.',
+ 'cite_error_group_refs_without_references' => '"$1" නම් කණ්ඩà·à¶ºà¶¸ සඳහ෠<code>&lt;ref&gt;</code> ටà·à¶œ පà·à·€à¶­à·”ණත්, ඊට අදà·à·… <code>&lt;references group="$1"/&gt;</code> ටà·à¶œ සොයà·à¶œà¶­ නොහà·à¶šà·’ විය.',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> à·„à·’ <code>&lt;ref&gt;</code> නම් ටà·à¶œà¶º "$1" යන පරස්පර සමූහ ගුණà·à¶‚ග දරයි.',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> à·„à·’ <code>&lt;ref&gt;</code> ටà·à¶œà¶º පෙර පෙළෙහි නොතිබූ "$1" නම් සමූහ ගුණà·à¶‚ගයක් දරයි.',
+ 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> à·„à·’ "$1" නමà·à¶­à·’ <code>&lt;ref&gt;</code> ටà·à¶œà¶º පෙර පෙළෙහි භà·à·€à·’ත෠වූයේ නà·à¶­.',
+ 'cite_error_references_no_key' => '<code>&lt;references&gt;</code> à·„à·’ <code>&lt;ref&gt;</code> ටà·à¶œà¶ºà¶§ නමක් ආදේà·à¶šà·œà¶§ නà·à¶­.',
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code> à·„à·’ "$1" නමà·à¶­à·’ <code>&lt;ref&gt;</code> ටà·à¶œà¶ºà¶§ අන්තර්ගතයක් නà·à¶­.',
+ 'cite_reference_link_prefix' => 'උපන්â€à¶ºà·à·ƒ_යොමුව-',
+ 'cite_references_link_prefix' => 'උපන්â€à¶ºà·à·ƒ_සටහන-',
+);
+
+/** Slovak (slovenÄina)
+ * @author Helix84
+ */
+$messages['sk'] = array(
+ 'cite-desc' => 'Pridáva znaÄky <nowiki><ref[ name=id]></nowiki> a <nowiki><references/></nowiki> pre citácie',
+ 'cite_croak' => 'Citát je už neaktuálny; $1: $2',
+ 'cite_error_key_str_invalid' => 'Vnútorná chyba;
+neplatný $str a/alebo $key.
+Toto by sa nemalo nikdy stať.',
+ 'cite_error_stack_invalid_input' => 'Vnútorná chyba; neplatný kÄ¾ÃºÄ zásobníka',
+ 'cite_error' => 'Chyba citácie $1',
+ 'cite_error_ref_numeric_key' => 'Neplatné volanie; oÄakáva sa neceloÄíselný typ kľúÄa',
+ 'cite_error_ref_no_key' => 'Neplatné volanie; nebol Å¡pecifikovaný kľúÄ',
+ 'cite_error_ref_too_many_keys' => 'Neplatné volanie; neplatné kľúÄe, napr. príliÅ¡ veľa alebo nesprávne Å¡pecifikovaný kľúÄ',
+ 'cite_error_ref_no_input' => 'Neplatné volanie; nebol špecifikovaný vstup',
+ 'cite_error_references_invalid_parameters' => 'Neplatné parametre; neoÄakávli sa žiadne',
+ 'cite_error_references_invalid_parameters_group' => 'Neplatná znaÄka <code>&lt;references&gt;</code>;
+je povolený iba parameter „group“.
+Použite <code>&lt;references /&gt;</code> alebo <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Minuli sa generované návestia spätných odkazov, definujte viac v správe <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'VyÄerpané prispôsobené oznaÄenia odkazov pre skupinu „$1“.
+Definujte ÄalÅ¡ie v správe <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Neplatná znaÄka <code>&lt;ref&gt;</code>; nebol zadaný text pre referencie s názvom <code>$1</code>',
+ 'cite_error_included_ref' => 'Chýba zakonÄenie znaÄky <code>&lt;ref&gt;</code> (<code>&lt;/ref&gt;</code>)',
+ 'cite_error_refs_without_references' => 'ZnaÄky <code>&lt;ref&gt;</code> sú prítomné, ale nebola nájdená žiadna znaÄka <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'ZnaÄky <code>&lt;ref&gt;</code> pre skupinu „$1“ sú prítomné, ale nebola nájdená zodpovedajúca znaÄka <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'ZnaÄka <code>&lt;ref&gt;</code> v <code>&lt;references&gt;</code> má konfliktný atribút skupiny „$1“.',
+ 'cite_error_references_missing_group' => 'ZnaÄka <code>&lt;ref&gt;</code> v <code>&lt;references&gt;</code> má atribút skupiny „$1“, ktorý sa v predoÅ¡lom texte nevyskytuje.',
+ 'cite_error_references_missing_key' => 'ZnaÄka <code>&lt;ref&gt;</code> s názvom „$1“ definovaná v <code>&lt;references&gt;</code> sa v predoÅ¡lom texte nevyskytuje.',
+ 'cite_error_references_no_key' => 'ZnaÄka <code>&lt;ref&gt;</code> s definovaná v <code>&lt;references&gt;</code> nemá žiaden atribút názov.',
+ 'cite_error_empty_references_define' => 'ZnaÄka <code>&lt;ref&gt;</code> s definovaná v <code>&lt;references&gt;</code> s názvom „$1“ nemá žiaden obsah.',
+);
+
+/** Slovenian (slovenÅ¡Äina)
+ * @author Dbc334
+ */
+$messages['sl'] = array(
+ 'cite-desc' => 'Doda etiketi <nowiki><ref[ name=id]></nowiki> in <nowiki><references/></nowiki> za navajanje',
+ 'cite_croak' => 'HreÅ¡ÄeÄa navedba; $1: $2',
+ 'cite_error_key_str_invalid' => 'Notranja napaka;
+neveljaven $str in/ali $key.
+To se ne bi nikoli smelo zgoditi.',
+ 'cite_error_stack_invalid_input' => 'Notranja napaka;
+neveljavni skladovni kljuÄ.
+To se ne bi nikoli smelo zgoditi.',
+ 'cite_error' => 'Napaka pri navajanju: $1',
+ 'cite_error_ref_numeric_key' => 'Neveljavna oznaka <code>&lt;ref&gt;</code>;
+ime ne more biti samo Å¡tevilo. Uporabite opisni naslov',
+ 'cite_error_ref_no_key' => 'Neveljavna oznaka <code>&lt;ref&gt;</code>;
+sklici brez vsebine morajo imeti ime',
+ 'cite_error_ref_too_many_keys' => 'Neveljavna etiketa <code>&lt;ref&gt;</code>;
+neveljavna imena, npr. preveÄ',
+ 'cite_error_ref_no_input' => 'Neveljavna oznaka <code>&lt;ref&gt;</code>;
+sklici brez imena morajo imeti vsebino',
+ 'cite_error_references_invalid_parameters' => 'Neveljavna etiketa <code>&lt;references&gt;</code>;
+parametri niso dovoljeni.
+Uporabite <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Neveljavna etiketa <code>&lt;references&gt;</code>;
+dovoljen je samo parameter »group«.
+Uporabite <code>&lt;references /&gt;</code> ali <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Zmanjkalo je oznak za povratne povezave.
+DoloÄite jih veÄ v sporoÄilu <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
+ 'cite_error_no_link_label_group' => 'Zmanjkalo je oznak povezav po meri za skupino »$1«.
+DoloÄite jih veÄ v sporoÄilu <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Neveljavna oznaka <code>&lt;ref&gt;</code>;
+sklici imenovani <code>$1</code> nimajo doloÄenega besedila',
+ 'cite_error_included_ref' => 'ZakljuÄek <code>&lt;/ref&gt;</code> manjka za etiketo <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Obstajajo etikete <code>&lt;ref&gt;</code>, vendar etikete <code>&lt;references/&gt;</code> ni bilo mogoÄe najti',
+ 'cite_error_group_refs_without_references' => 'Obstajajo etikete <code>&lt;ref&gt;</code> za skupino, imenovano »$1«, vendar ustrezne etikete <code>&lt;references group="$1"/&gt;</code> ni bilo mogoÄe najti',
+ 'cite_error_references_group_mismatch' => 'Oznaka <code>&lt;ref&gt;</code> v <code>&lt;references&gt;</code> ima atribut nasprotujoÄe si skupine »$1«.',
+ 'cite_error_references_missing_group' => 'Oznaka <code>&lt;ref&gt;</code>, opredeljena v <code>&lt;references&gt;</code>, ima atribut skupine »$1«, ki se ne pojavi v predhodnem besedilu.',
+ 'cite_error_references_missing_key' => 'Oznaka <code>&lt;ref&gt;</code> z imenom »$1«, opredeljena v <code>&lt;references&gt;</code>, ni uporabljena v predhodnem besedilu.',
+ 'cite_error_references_no_key' => 'Etiketa <code>&lt;ref&gt;</code>, doloÄena v <code>&lt;references&gt;</code>, nima lastnosti »name«.',
+ 'cite_error_empty_references_define' => 'Etiketa <code>&lt;ref&gt;</code>, doloÄena v <code>&lt;references&gt;</code> z imenom »$1«, nima vsebine.',
+ 'cite_references_link_one' => '<li id="$1"><span class="mw-cite-backlink">\'\'\'[[#$2|^]]\'\'\'</span> $3</li>',
+ 'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink">^ $2</span> $3</li>',
+ 'cite_references_link_many_format_backlink_labels' => 'a b c Ä d e f g h i j k l m n o p r s Å¡ t u v z ž a aa ab ac aÄ ad ae af ag ah ai aj ak al am an ao ap ar as aÅ¡ at au av az až b ba bb bc bÄ bd be bf bg bh bi bj bk bl bm bn bo bp br bs bÅ¡ bt bu bv bz bž c ca cb cc cÄ cd ce cf cg ch ci cj ck cl cm cn co cp cr cs cÅ¡ ct cu cv cz cž Ä Äa Äb Äc ÄÄ Äd Äe Äf Äg Äh Äi Äj Äk Äl Äm Än Äo Äp Är Äs ÄÅ¡ Ät Äu Äv Äz Äž d da db dc dÄ dd de df dg dh di dj dk dl dm dn do dp dr ds dÅ¡ dt du dv dz dž e ea eb ec eÄ ed ee ef eg eh ei ej ek el em en eo ep er es eÅ¡ et eu ev ez ež f fa fb fc fÄ fd fe ff fg fh fi fj fk fl fm fn fo fp fr fs fÅ¡ ft fu fv fz fž g ga gb gc gÄ gd ge gf gg gh gi gj gk gl gm gn go gp gr gs gÅ¡ gt gu gv gz gž h ha hb hc hÄ hd he hf hg hh hi hj hk hl hm hn ho hp hr hs hÅ¡ ht hu hv hz hž i ia ib ic iÄ id ie if ig ih ii ij ik il im in io ip ir is iÅ¡ it iu iv iz iž j ja jb jc jÄ jd je jf jg jh ji jj jk jl jm jn jo jp jr js jÅ¡ jt ju jv jz jž k ka kb kc kÄ kd ke kf kg kh ki kj kk kl km kn ko kp kr ks kÅ¡ kt ku kv kz kž l la lb lc lÄ ld le lf lg lh li lj lk ll lm ln lo lp lr ls lÅ¡ lt lu lv lz lž m ma mb mc mÄ md me mf mg mh mi mj mk ml mm mn mo mp mr ms mÅ¡ mt mu mv mz mž n na nb nc nÄ nd ne nf ng nh ni nj nk nl nm nn no np nr ns nÅ¡ nt nu nv nz nž o oa ob oc oÄ od oe of og oh oi oj ok ol om on oo op or os oÅ¡ ot ou ov oz ož p pa pb pc pÄ pd pe pf pg ph pi pj pk pl pm pn po pp pr ps pÅ¡ pt pu pv pz pž r ra rb rc rÄ rd re rf rg rh ri rj rk rl rm rn ro rp rr rs rÅ¡ rt ru rv rz rž s sa sb sc sÄ sd se sf sg sh si sj sk sl sm sn so sp sr ss sÅ¡ st su sv sz sž Å¡ Å¡a Å¡b Å¡c Å¡Ä Å¡d Å¡e Å¡f Å¡g Å¡h Å¡i Å¡j Å¡k Å¡l Å¡m Å¡n Å¡o Å¡p Å¡r Å¡s Å¡Å¡ Å¡t Å¡u Å¡v Å¡z šž t ta tb tc tÄ td te tf tg th ti tj tk tl tm tn to tp tr ts tÅ¡ tt tu tv tz tž u ua ub uc uÄ ud ue uf ug uh ui uj uk ul um un uo up ur us uÅ¡ ut uu uv uz už v va vb vc vÄ vd ve vf vg vh vi vj vk vl vm vn vo vp vr vs vÅ¡ vt vu vv vz vž z za zb zc zÄ zd ze zf zg zh zi zj zk zl zm zn zo zp zr zs zÅ¡ zt zu zv zz zž ž ža žb žc Å¾Ä Å¾d že žf žg žh ži žj žk žl žm žn žo žp žr žs žš žt žu žv žz žž',
+);
+
+/** Albanian (shqip)
+ * @author Mikullovci11
+ * @author Olsi
+ */
+$messages['sq'] = array(
+ 'cite-desc' => 'Shton etiketa <nowiki><ref[ name=id]></nowiki> dhe <nowiki><references/></nowiki> për citime',
+ 'cite_croak' => 'Gabim në sistem; $1: $2',
+ 'cite_error_key_str_invalid' => 'Gabim i brendshëm;
+$str dhe/ose $key i pavlefshëm
+Kjo nuk duhet të ndodhë kurrë.',
+ 'cite_error_stack_invalid_input' => 'Gabim i brendshëm;
+stack key i pavlefshëm
+Kjo nuk duhet të ndodhë kurrë.',
+ 'cite_error' => 'Gabim referencash: $1',
+ 'cite_error_ref_numeric_key' => 'Etiketë <code>&lt;ref&gt;</code> e pavlefshme;
+emri nuk mund të jetë një numër i plotë i thjeshtë. Përdorni një titull përshkrues',
+ 'cite_error_ref_no_key' => 'Etiketë <code>&lt;ref&gt;</code> e pavlefshme;
+refs pa përmbajtje duhet të kenë një emër',
+ 'cite_error_ref_too_many_keys' => 'Etiketë <code>&lt;ref&gt;</code> e pavlefshme;
+emra të pavlefshëm, p.sh. shumë',
+ 'cite_error_ref_no_input' => 'Etiketë <code>&lt;ref&gt;</code> e pavlefshme;
+refs pa emër duhet të kenë përmbajtje',
+ 'cite_error_references_invalid_parameters' => 'Etiketë <code>&lt;references&gt;</code> e pavlefshme;
+asnjë parametër nuk lejohet.
+Përdorni <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Etiketë <code>&lt;references&gt;</code> e pavlefshme;
+vetëm parametri "group" lejohet.
+Përdorni <code>&lt;references /&gt;</code>, ose <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Nga ran të etiketave backlink me porosi.
+Percaktoni më shumë në <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> mesazh.',
+ 'cite_error_no_link_label_group' => 'Nga ran e etiketave lidhje me porosi për grupin "$1".
+Percaktoni më shumë në <nowiki> [[MediaWiki:$2]] </nowiki> mesazh.',
+ 'cite_error_references_no_text' => 'Etiketë <code>&lt;ref&gt;</code> e pavlefshme;
+asnjë tekst nuk u dha për refs e quajtura <code>$1</code>',
+ 'cite_error_included_ref' => 'Duke mbyllur <code>&lt;/ref&gt;</code> mungon për etiketën <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Etiketat <code>&lt;ref&gt;</code> ekzistojnë, por nuk u gjet etiketa <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Etiketat <code>&lt;ref&gt;</code> ekzistojnë për një grup të quajtur "$1", por nuk u gjet etiketa korresponduese <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> tag in <code>&lt;references&gt;</code> has conflicting group attribute "$1".',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> etiketa e përcaktuar në <code>&lt;referenca&gt;</code> ka atribut grup "$1" që nuk duket në tekstin paraprak.',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> etiketa me emrin "$1" e percaktuar ne <code>&lt;referenca&gt;</code> nuk është përdorur në tekst paraprak.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> etiketa e përcaktuar në <code>&lt;referenca&gt;</code> nuk ka ndonjë atribut emër.',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> etiketa e përcaktuar në <code>&lt;referenca&gt;</code> me emrin "$1" nuk ka përmbajtje.',
+);
+
+/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Millosh
+ * @author Rancher
+ * @author Михајло Ðнђелковић
+ */
+$messages['sr-ec'] = array(
+ 'cite-desc' => 'Додаје <nowiki><ref[ name=id]></nowiki> и <nowiki><references/></nowiki> ознаке за цитирање.',
+ 'cite_croak' => 'Додатак за цитирање је неиÑправан; $1: $2.',
+ 'cite_error_key_str_invalid' => 'Унутрашња грешка; лош $str и/или $key. Ово не би требало никад да Ñе деÑи.',
+ 'cite_error_stack_invalid_input' => 'Унутрашња грешка; лош кључ Ñтека. Ово не би требало никад да Ñе деÑи.',
+ 'cite_error' => 'Грешка цитата: $1',
+ 'cite_error_ref_numeric_key' => 'Лоша ознака <code>&lt;ref&gt;</code>; име не може бити једноÑтавни интеџер. КориÑти опиÑни наÑлов.',
+ 'cite_error_ref_no_key' => 'Лоша ознака <code>&lt;ref&gt;</code>; ref-ови без Ñадржаја морају имати име.',
+ 'cite_error_ref_too_many_keys' => 'Лоша ознака <code>&lt;ref&gt;</code>; лоша имена, одноÑно много њих.',
+ 'cite_error_ref_no_input' => 'Лоша ознака <code>&lt;ref&gt;</code>; ref-ови без имена морају имати Ñадржај.',
+ 'cite_error_references_invalid_parameters' => 'Лоша ознака <code>&lt;references&gt;</code>; параметри ниÑу дозвољени. КориÑти <code>&lt;references /&gt;</code>.',
+ 'cite_error_references_invalid_parameters_group' => 'Лоша ознака <code>&lt;references&gt;</code>; Ñамо је парамтера "group" дозвољен. КориÑти <code>&lt;references /&gt;</code> или <code>&lt;references group="..."&gt;</code>.',
+ 'cite_error_references_no_backlink_label' => 'ÐеÑтале Ñу поÑебне ознаке за задње везе. Одреди их више у поруци <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Лоша ознака <code>&lt;ref&gt;</code>; нема текÑта за ref-ове под именом <code>$1</code>.',
+ 'cite_error_included_ref' => 'Затвара <code>&lt;/ref&gt;</code> који недоÑтаје <code>&lt;ref&gt;</code> тагу',
+ 'cite_error_refs_without_references' => 'Чланак има ознаке <code>&lt;ref&gt;</code>, али није пронађена потребна ознака <code>&#123;&#123;наводи&#125;&#125;</code> (или <code>&lt;references/&gt;</code>)',
+ 'cite_error_group_refs_without_references' => 'ПоÑтоје ознаке <code>&lt;ref&gt;</code> за групу Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð¼ „$1“, али нема одговарајуће ознаке <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_reference_link_key_with_num' => '$1_$2',
+ 'cite_reference_link_prefix' => 'cite_ref-',
+ 'cite_references_link_prefix' => 'cite_note-',
+ 'cite_reference_link' => '<sup id="$1" class="reference">[[#$2|<nowiki>[</nowiki>$3<nowiki>]</nowiki>]]</sup>',
+ 'cite_references_link_one' => '<li id="$1"><span class="mw-cite-backlink">[[#$2|↑]]</span> $3</li>',
+ 'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink">↑ $2</span> $3</li>',
+ 'cite_references_link_many_format' => '<sup>[[#$1|$2]]</sup>',
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+ 'cite_references_link_many_sep' => '&#32;',
+ 'cite_references_link_many_and' => '&#32;',
+);
+
+/** Serbian (Latin script) (srpski (latinica)‎)
+ * @author Michaello
+ */
+$messages['sr-el'] = array(
+ 'cite-desc' => 'Dodaje <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki> oznake za citiranje.',
+ 'cite_croak' => 'Dodatak za citiranje je umro; $1: $2.',
+ 'cite_error_key_str_invalid' => 'Unutrašnja greška; loš $str i/ili $key. Ovo ne bi trebalo nikad da se desi.',
+ 'cite_error_stack_invalid_input' => 'UnutraÅ¡nja greÅ¡ka; loÅ¡ kljuÄ steka. Ovo ne bi trebalo nikad da se desi.',
+ 'cite_error' => 'Greška citata: $1',
+ 'cite_error_ref_numeric_key' => 'Loša oznaka <code>&amp;lt;ref&amp;gt;</code>; ime ne može biti jednostavni intedžer. Koristi opisni naslov.',
+ 'cite_error_ref_no_key' => 'Loša oznaka <code>&amp;lt;ref&amp;gt;</code>; ref-ovi bez sadržaja moraju imati ime.',
+ 'cite_error_ref_too_many_keys' => 'Loša oznaka <code>&amp;lt;ref&amp;gt;</code>; loša imena, odnosno mnogo njih.',
+ 'cite_error_ref_no_input' => 'Loša oznaka <code>&amp;lt;ref&amp;gt;</code>; ref-ovi bez imena moraju imati sadržaj.',
+ 'cite_error_references_invalid_parameters' => 'Loša oznaka <code>&amp;lt;references&amp;gt;</code>; parametri nisu dozvoljeni. Koristi <code>&amp;lt;references /&amp;gt;</code>.',
+ 'cite_error_references_invalid_parameters_group' => 'Loša oznaka <code>&amp;lt;references&amp;gt;</code>; samo je paramtera &quot;group&quot; dozvoljen. Koristi <code>&amp;lt;references /&amp;gt;</code> ili <code>&amp;lt;references group=&quot;...&quot;&amp;gt;</code>.',
+ 'cite_error_references_no_backlink_label' => 'Nestale su posebne oznake za zadnje veze. Odredi ih više u poruci <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Loša oznaka <code>&amp;lt;ref&amp;gt;</code>; nema teksta za ref-ove pod imenom <code>$1</code>.',
+ 'cite_error_included_ref' => 'Zatvara <code>&lt;/ref&gt;</code> koji nedostaje <code>&lt;ref&gt;</code> tagu',
+ 'cite_error_refs_without_references' => '<code>&amp;lt;ref&amp;gt;</code> tag postoji, ali odgovarajući <code>&amp;lt;references/&amp;gt;</code> tag nije nađen',
+ 'cite_error_group_refs_without_references' => '<code><ref></code> tagovi postoje za grupu pod imenom "$1", ali nije nađen odgovarajući <code><references group="$1"/></code> tag',
+ 'cite_reference_link_key_with_num' => '$1_$2',
+ 'cite_reference_link_prefix' => 'cite_ref-',
+ 'cite_references_link_prefix' => 'cite_note-',
+ 'cite_reference_link' => '<sup id="$1" class="reference">[[#$2|<nowiki>[</nowiki>$3<nowiki>]</nowiki>]]</sup>',
+ 'cite_references_link_one' => '<li id="$1"><span class="mw-cite-backlink">[[#$2|↑]]</span> $3</li>',
+ 'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink">↑ $2</span> $3</li>',
+ 'cite_references_link_many_format' => '<sup>[[#$1|$2]]</sup>',
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+ 'cite_references_link_many_sep' => '&#32;',
+ 'cite_references_link_many_and' => '&#32;',
+);
+
+/** Seeltersk (Seeltersk)
+ * @author Pyt
+ */
+$messages['stq'] = array(
+ 'cite-desc' => 'Föiget foar Wällenätterwiese do <nowiki><ref[ name=id]></nowiki> un <nowiki><references/></nowiki> Tags tou',
+ 'cite_croak' => 'Failer in dät Referenz-System. $1: $2',
+ 'cite_error_key_str_invalid' => 'Internen Failer: uungultigen $str un/of $key. Dit skuul eegentelk goar nit passierje konne.',
+ 'cite_error_stack_invalid_input' => 'Internen Failer: uungultigen „name“-stack. Dit skuul eegentelk goarnit passierje konne.',
+ 'cite_error' => 'Referenz-Failer $1',
+ 'cite_error_ref_numeric_key' => 'Uungultige <code><nowiki><ref></nowiki></code>-Ferweendenge: „name“ duur naan skeenen Taalenwäid weese, benutsje n beskrieuwenden Noome.',
+ 'cite_error_ref_no_key' => 'Uungultige <code><nowiki><ref></nowiki></code>-Ferweendenge: „ref“ sunner Inhoold mout n Noome hääbe.',
+ 'cite_error_ref_too_many_keys' => 'Uungultige <code><nowiki><ref></nowiki></code>-Ferweendenge: „name“ is uungultich of tou loang.',
+ 'cite_error_ref_no_input' => 'Uungultige <code><nowiki><ref></nowiki></code>-Ferweendenge: „ref“ sunner Noome mout n Inhoold hääbe.',
+ 'cite_error_references_invalid_parameters' => 'Uungultige <code><nowiki><reference></nowiki></code>-Ferweendenge: Der sunt neen bietoukuumende Parametere ferlööwed, ferweend bloot <code><nowiki><reference /></nowiki></code>.',
+ 'cite_error_references_invalid_parameters_group' => 'Ungultige <code>&lt;references&gt;</code>-Ferweendenge: Bloot die Parameter „group“ is ferlööwed, ferweend <tt>&lt;references /&gt;</tt> of <tt>&lt;references group="..." /&gt;</tt>',
+ 'cite_error_references_no_backlink_label' => 'Ne Referenz fon ju Foarm <code><nowiki><ref name="..."/></nowiki></code> wäd oafter benutsed as Bouksteeuwen deer sunt. N Administrator mout <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> uum wiedere Bouksteeuwen/Teekene ferfulständigje.',
+ 'cite_error_references_no_text' => 'Uungultigen <code>&lt;ref&gt;</code>-Tag; der wuude naan Text foar dät Ref mäd dän Noome <code>$1</code> anroat.',
+ 'cite_error_included_ref' => 'Der failt n sluutend <code>&lt;/ref&gt;</code>',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags existierje, daach neen <code>&lt;references/&gt;</code>-Tag wuud fuunen.',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags existierje foar ju Gruppe „$1“, man neen deertou heerend <code>&lt;references group=„$1“/&gt;</code>-Tag wuud fuunen',
+ 'cite_error_references_group_mismatch' => 'Dät <code>&lt;ref&gt;</code>-Tag in <code>&lt;references&gt;</code> häd dät Konfliktgruppenattribut „$1“.',
+ 'cite_error_references_missing_group' => 'Dät <code>&lt;ref&gt;</code> Tag, as definierd in <code>&lt;references&gt;</code> häd dät Gruppenattribut "$1", dät nit in dän foaruutgungende Text foarkumt.',
+ 'cite_error_references_missing_key' => 'Dät in <code>&lt;references&gt;</code> definierde <code>&lt;ref&gt;</code>-Tag mäd dän Noome „$1“ wäd in dän foaruutgungende Text nit ferwoand.',
+ 'cite_error_references_no_key' => 'Dät in <code>&lt;references&gt;</code> definierde <code>&lt;ref&gt;</code>-Tag häd neen Noomensattribut.',
+ 'cite_error_empty_references_define' => 'Dät in <code>&lt;references&gt;</code> definierde <code>&lt;ref&gt;</code>-Tag mäd dän Noome „$1“ wiest naan Inhoold ap.',
+);
+
+/** Sundanese (Basa Sunda)
+ * @author Kandar
+ */
+$messages['su'] = array(
+ 'cite-desc' => 'Nambahkeun tag <nowiki><ref[ name=id]></nowiki> jeung <nowiki><references/></nowiki>, pikeun cutatan',
+ 'cite_error_key_str_invalid' => 'Kasalahan internal; salah $str jeung/atawa $key. Kuduna mah teu kieu.',
+);
+
+/** Swedish (svenska)
+ * @author Boivie
+ * @author Fluff
+ * @author Lejonel
+ * @author M.M.S.
+ * @author Najami
+ */
+$messages['sv'] = array(
+ 'cite-desc' => 'Lägger till taggarna <nowiki><ref[ name=id]></nowiki> och <nowiki><references/></nowiki> för referenser till källor',
+ 'cite_croak' => 'Fel i fotnotssystemet; $1: $2',
+ 'cite_error_key_str_invalid' => 'Internt fel; $str eller $key är ogiltiga. Det här borde aldrig hända.',
+ 'cite_error_stack_invalid_input' => 'Internt fel; ogiltig nyckel i stacken. Det här borde aldrig hända.',
+ 'cite_error' => 'Referensfel: $1',
+ 'cite_error_ref_numeric_key' => "Ogiltig <code>&lt;ref&gt;</code>-tag; parametern 'name' kan inte vara ett tal, använd ett beskrivande namn",
+ 'cite_error_ref_no_key' => 'Ogiltig <code>&lt;ref&gt;</code>-tag; referenser utan innehåll måste ha ett namn',
+ 'cite_error_ref_too_many_keys' => 'Ogiltig <code>&lt;ref&gt;</code>-tagg;
+ogiltiga namn, t.ex. för många',
+ 'cite_error_ref_no_input' => 'Ogiltig <code>&lt;ref&gt;</code>-tag; referenser utan namn måste ha innehåll',
+ 'cite_error_references_invalid_parameters' => 'Ogiltig <code>&lt;references&gt;</code>-tag; inga parametrar tillåts, använd <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Ogiltig <code>&lt;references&gt;</code>-tagg;
+"group"-parametern är endast tillåten.
+Använd <code>&lt;references /&gt;</code>, eller <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'De definierade etiketterna för tillbaka-länkar har tagit slut, definiera fler etiketter i systemmedelandet <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Anpassade länketiketter för gruppen "$1" tog slut.
+Definera fler i <nowiki>[[MediaWiki:$2]]</nowiki>-meddelandet.',
+ 'cite_error_references_no_text' => 'Ogiltig <code>&lt;ref&gt;</code>-tag; ingen text har angivits för referensen med namnet <code>$1</code>',
+ 'cite_error_included_ref' => 'Avslutande <code>&lt;/ref&gt;</code> saknas för <code>&lt;ref&gt;</code>-tagg',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-taggar finns, men ingen <code>&lt;references/&gt;</code>-tagg hittades',
+ 'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-taggar finns för gruppnamnet "$1", men ingen motsvarande <code>&lt;references group="$1"/&gt;</code>-tagg hittades',
+ 'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code>-tagg i <code>&lt;references&gt;</code> har ett motstridigt group-attribut "$1".',
+ 'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code>-tagg definierad i <code>&lt;references&gt;</code> har ett group-attribut "$1" som inte används innan i texten.',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code>-tagg med namnet "$1", definierad i <code>&lt;references&gt;</code> används inte innan i texten.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code>-tagg definierad i <code>&lt;references&gt;</code> saknar name-attribut.',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code>-tagg definierad i <code>&lt;ref&gt;</code> med namnet "$1" har inget innehåll.',
+);
+
+/** Tamil (தமிழà¯)
+ * @author Shanmugamp7
+ * @author செலà¯à®µà®¾
+ */
+$messages['ta'] = array(
+ 'cite-desc' => 'சேரà¯à®•à¯à®•à®¿à®±à®¤à¯ <nowiki><ref[ name=id]></nowiki>மறà¯à®±à¯à®®à¯ <nowiki><references/></nowiki> கà¯à®±à®¿à®šà¯à®šà¯Šà®±à¯à®•à®³à¯, மேறà¯à®•à¯‹à®³à¯à®•à®³à¯à®•à¯à®•à®¾à®•',
+ 'cite_error_key_str_invalid' => 'உள௠பிழை;
+ செலà¯à®²à®¾à®¤ $ எழà¯à®¤à¯à®¤à¯à®šà¯à®šà®°à®®à¯ மறà¯à®±à¯à®®à¯/அலà¯à®²à®¤à¯ $ விசை.
+இத௠ஒரà¯à®ªà¯‹à®¤à¯à®®à¯ à®à®±à¯à®ªà®Ÿ கூடாதà¯..',
+ 'cite_error_stack_invalid_input' => 'உள௠பிழை;
+செலà¯à®²à®¾à®¤ அடà¯à®•à¯à®•à¯ விசை.
+இத௠ஒரà¯à®ªà¯‹à®¤à¯à®®à¯ à®à®±à¯à®ªà®Ÿ கூடாதà¯..',
+ 'cite_error' => 'பிழை காடà¯à®Ÿà¯: $1',
+);
+
+/** Telugu (తెలà±à°—à±)
+ * @author Chaduvari
+ * @author Veeven
+ */
+$messages['te'] = array(
+ 'cite-desc' => 'ఉదహరింపà±à°²à°•à± <nowiki><ref[ name=id]></nowiki> మరియౠ<nowiki><references/></nowiki> టాగà±à°²à°¨à± చేరà±à°šà±à°¤à±à°‚ది',
+ 'cite_croak' => 'ఉదహరింపౠచచà±à°šà°¿à°‚ది; $1: $2',
+ 'cite_error_key_str_invalid' => 'అంతరà±à°—à°¤ పొరపాటà±: తపà±à°ªà±à°¡à± $str మరియà±/లేదా $key. ఇది à°Žà°ªà±à°ªà±à°¡à±‚ జరగకూడదà±.',
+ 'cite_error_stack_invalid_input' => 'అంతరà±à°—à°¤ పొరపాటà±: తపà±à°ªà±à°¡à± à°¸à±à°Ÿà°¾à°•à± à°•à±€. ఇది à°Žà°ªà±à°ªà±à°¡à±‚ జరగకూడదà±.',
+ 'cite_error' => 'ఉదహరింపౠపొరపాటà±: $1',
+ 'cite_error_ref_numeric_key' => 'తపà±à°ªà±à°¡à± <code>&lt;ref&gt;</code> టాగà±; పేరౠసరళ సంఖà±à°¯ అయివà±à°‚డకూడదà±, వివరమైన శీరà±à°·à°¿à°• వాడండి',
+ 'cite_error_ref_no_key' => 'సరైన <code>&lt;ref&gt;</code> à°Ÿà±à°¯à°¾à°—ౠకాదà±; విషయం లేని ref లకౠతపà±à°ªà°¨à°¿à°¸à°°à°¿à°—à°¾ పేరొకటà±à°‚డాలి',
+ 'cite_error_ref_too_many_keys' => 'సరైన <code>&lt;ref&gt;</code> à°Ÿà±à°¯à°¾à°—ౠకాదà±; తపà±à°ªà± పేరà±à°²à±, ఉదాహరణకౠమరీ à°Žà°•à±à°•à±à°µ',
+ 'cite_error_ref_no_input' => 'సరైన <code>&lt;ref&gt;</code> à°Ÿà±à°¯à°¾à°—ౠకాదà±; పేరౠలేని ref లలో తపà±à°ªà°¨à°¿à°¸à°°à°¿à°—à°¾ విషయం ఉండాలి',
+ 'cite_error_references_invalid_parameters' => 'సరైన <code>&lt;references&gt;</code> à°Ÿà±à°¯à°¾à°—ౠకాదà±; పారామీటరà±à°²à°•à± à°•à± à°…à°¨à±à°®à°¤à°¿ లేదà±, à°ˆ లోపానà±à°¨à°¿ à°•à°²à±à°—జేసే à°’à°• ఉదాహరణ: <references someparameter="value" />',
+ 'cite_error_references_no_backlink_label' => 'మీ à°¸à±à°µà°‚à°¤ à°¬à±à°¯à°¾à°•à±â€Œà°²à°¿à°‚కౠలేబà±à°³à±à°³à± అయిపోయాయి. <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> సందేశంలో మరినà±à°¨à°¿ లేబà±à°³à±à°³à°¨à± నిరà±à°µà°šà°¿à°‚à°šà±à°•à±‹à°‚à°¡à°¿.',
+ 'cite_error_references_no_text' => 'సరైన <code>&lt;ref&gt;</code> కాదà±; <code>$1</code> అనే పేరà±à°—à°² ref లకౠపాఠà±à°¯à°®à±‡à°®à±€ ఇవà±à°µà°²à±‡à°¦à±',
+);
+
+/** Tajik (Cyrillic script) (тоҷикӣ)
+ * @author Ibrahim
+ */
+$messages['tg-cyrl'] = array(
+ 'cite-desc' => 'БарчаÑбҳои <nowiki><ref[ name=id]></nowiki> ва <nowiki><references/></nowiki> барои ёд кардан, изофа мекунад',
+ 'cite_croak' => 'Ðд кардан хароб шуд; $1: $2',
+ 'cite_error_key_str_invalid' => 'Хатои дохилӣ; $str ва/Ñ‘ $key ғайримиҷоз. Ин хато набоÑд ҳаргиз рух диҳад.',
+ 'cite_error_stack_invalid_input' => 'Хатои дохилӣ; клиди пушта ғайримиҷоз. Ин хато набоÑд ҳаргиз рух диҳад.',
+ 'cite_error' => 'Хатои ёдкард: $1',
+ 'cite_error_ref_numeric_key' => 'БарчаÑби <code>&lt;ref&gt;</code> ғайримиҷоз; ном наметавонад Ñк адад бошад, унвони возеҳтареро иÑтифода кунед',
+ 'cite_error_ref_no_key' => 'БарчаÑби <code>&lt;ref&gt;</code> ғайримиҷоз; ёдкардҳо бидуни мӯҳтаво боÑд ном дошта бошанд',
+ 'cite_error_ref_too_many_keys' => 'БарчаÑби <code>&lt;ref&gt;</code> ғайримиҷоз; номҳои ғайримиҷоз Ñ‘ беш аз андоза',
+ 'cite_error_ref_no_input' => 'БарчаÑби <code>&lt;ref&gt;</code> ғайримиҷоз; ёдкардҳои бидуни ном боÑд мӯҳтаво дошта бошанд',
+ 'cite_error_references_invalid_parameters' => 'БарчаÑби <code>&lt;references&gt;</code> ғайримиҷоз; иÑтифода аз параметр миҷоз аÑÑ‚, аз <code>&lt;references /&gt;</code> иÑтифода кунед',
+ 'cite_error_references_invalid_parameters_group' => 'БарчаÑби <code>&lt;references&gt;</code> номӯътабар;
+параметри "гурӯҳ" танҳо иҷозашуда аÑÑ‚.
+БарчаÑби <code>&lt;references /&gt;</code> Ñ‘ <code>&lt;references group="..." /&gt;</code> -ро иÑтифода баред',
+ 'cite_error_references_no_backlink_label' => 'БарчаÑбҳои пайванд ба интиҳо раÑид, мавориди ҷадидро дар пайём <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> иÑтифода кунед',
+ 'cite_error_references_no_text' => 'БарчаÑби <code>&lt;ref&gt;</code> ғайримиҷоз; матне барои ёдкардҳо бо номи <code>$1</code> ворид нашудааÑÑ‚',
+);
+
+/** Tajik (Latin script) (tojikī)
+ * @author Liangent
+ */
+$messages['tg-latn'] = array(
+ 'cite-desc' => 'Barcasbhoi <nowiki><ref[ name=id]></nowiki> va <nowiki><references/></nowiki> baroi jod kardan, izofa mekunad',
+ 'cite_croak' => 'Jod kardan xarob ÅŸud; $1: $2',
+ 'cite_error_key_str_invalid' => 'Xatoi doxilī; $str va/jo $key ƣajrimiçoz. In xato nabojad hargiz rux dihad.',
+ 'cite_error_stack_invalid_input' => 'Xatoi doxilī; klidi puşta ƣajrimiçoz. In xato nabojad hargiz rux dihad.',
+ 'cite_error' => 'Xatoi jodkard: $1',
+ 'cite_error_ref_numeric_key' => 'Barcasbi <code>&lt;ref&gt;</code> ƣajrimiçoz; nom nametavonad jak adad boşad, unvoni vozehtarero istifoda kuned',
+ 'cite_error_ref_no_key' => 'Barcasbi <code>&lt;ref&gt;</code> ƣajrimiçoz; jodkardho biduni mūhtavo bojad nom doşta boşand',
+ 'cite_error_ref_too_many_keys' => 'Barcasbi <code>&lt;ref&gt;</code> ƣajrimiçoz; nomhoi ƣajrimiçoz jo beş az andoza',
+ 'cite_error_ref_no_input' => 'Barcasbi <code>&lt;ref&gt;</code> ƣajrimiçoz; jodkardhoi biduni nom bojad mūhtavo doşta boşand',
+ 'cite_error_references_invalid_parameters' => 'Barcasbi <code>&lt;references&gt;</code> ƣajrimiçoz; istifoda az parametr miçoz ast, az <code>&lt;references /&gt;</code> istifoda kuned',
+ 'cite_error_references_invalid_parameters_group' => 'Barcasbi <code>&lt;references&gt;</code> nomū\'tabar;
+parametri "gurūh" tanho içozaşuda ast.
+Barcasbi <code>&lt;references /&gt;</code> jo <code>&lt;references group="..." /&gt;</code> -ro istifoda bared',
+ 'cite_error_references_no_backlink_label' => 'Barcasbhoi pajvand ba intiho rasid, mavoridi çadidro dar pajjom <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> istifoda kuned',
+ 'cite_error_references_no_text' => 'Barcasbi <code>&lt;ref&gt;</code> ƣajrimiçoz; matne baroi jodkardho bo nomi <code>$1</code> vorid naşudaast',
+);
+
+/** Thai (ไทย)
+ * @author Horus
+ * @author Passawuth
+ */
+$messages['th'] = array(
+ 'cite-desc' => 'ใส่ <nowiki><ref[ name=id]></nowiki> à¹à¸¥à¸° <nowiki><references /></nowiki> สำหรับà¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡',
+ 'cite_croak' => 'à¹à¸«à¸¥à¹ˆà¸‡à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡à¹€à¸ªà¸µà¸¢; $1: $2',
+ 'cite_error_key_str_invalid' => 'ข้อผิดพลาดภายใน
+$str à¹à¸¥à¸°/หรือ $key ไม่ถูà¸à¸•à¹‰à¸­à¸‡
+ซึ่งไม่ควรเà¸à¸´à¸”ขึ้น',
+ 'cite_error_stack_invalid_input' => 'ข้อผิดพลาดภายใน
+à¸à¸¸à¸à¹à¸ˆà¸à¸­à¸‡à¸‹à¹‰à¸­à¸™à¹„ม่ถูà¸à¸•à¹‰à¸­à¸‡
+ซึ่งไม่ควรเà¸à¸´à¸”ขึ้น',
+ 'cite_error' => 'อ้างอิงผิดพลาด: $1',
+ 'cite_error_ref_numeric_key' => 'ป้ายระบุ <code>&lt;ref&gt;</code> ไม่ถูà¸à¸•à¹‰à¸­à¸‡
+ชื่อไม่สามารถเป็นจำนวนเต็มอย่างง่าย ใช้ชื่อเรื่องที่พรรณนา',
+ 'cite_error_ref_no_key' => 'ป้ายระบุ <code>&lt;ref&gt;</code> ไม่ถูà¸à¸•à¹‰à¸­à¸‡
+อ้างอิงที่ไม่มีเนื้อหาต้องมีชื่อ',
+ 'cite_error_ref_too_many_keys' => 'ป้ายระบุ <code>&lt;ref&gt;</code> ไม่ถูà¸à¸•à¹‰à¸­à¸‡
+ชื่อไม่ถูà¸à¸•à¹‰à¸­à¸‡ เช่น มาà¸à¹€à¸à¸´à¸™à¹„ป',
+ 'cite_error_ref_no_input' => 'ป้ายระบุ <code>&lt;ref&gt;</code> ไม่ถูà¸à¸•à¹‰à¸­à¸‡
+อ้างอิงที่ไม่มีชื่อต้องมีเนื้อหา',
+ 'cite_error_references_invalid_parameters' => 'ป้ายระบุ <code>&lt;references&gt;</code> ไม่ถูà¸à¸•à¹‰à¸­à¸‡
+ไม่อนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¸¡à¸µà¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸­à¸£à¹Œ
+ให้ใช้ <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'ป้ายระบุ <code>&lt;references&gt;</code> ไม่ถูà¸à¸•à¹‰à¸­à¸‡
+อนุà¸à¸²à¸•à¹€à¸‰à¸žà¸²à¸°à¸žà¸²à¸£à¸²à¸¡à¸´à¹€à¸•à¸­à¸£à¹Œ "group"
+ให้ใช้ <code>&lt;references /&gt;</code> หรือ <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_text' => 'ป้ายระบุ <code>&lt;ref&gt;</code> ไม่ถูà¸à¸•à¹‰à¸­à¸‡
+ไม่มีข้อความใดให้ไว้สำหรับอ้างอิงชื่อ <code>$1</code>',
+ 'cite_error_included_ref' => 'ไม่มีà¸à¸²à¸£à¸›à¸´à¸” <code>&lt;/ref&gt;</code> สำหรับ <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'มีป้ายระบุ <code>&lt;ref&gt;</code> อยู่ à¹à¸•à¹ˆà¹„ม่พบป้ายระบุ <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'มีป้ายระบุ <code>&lt;ref&gt;</code> สำหรับà¸à¸¥à¸¸à¹ˆà¸¡à¸Šà¸·à¹ˆà¸­ "$1" à¹à¸•à¹ˆà¹„ม่พบป้ายระบุ <code>&lt;references group="$1"/&gt;</code> ที่สอดคล้องà¸à¸±à¸™',
+ 'cite_error_references_missing_key' => 'ป้ายระบุ <code>&lt;ref&gt;</code> ชื่อ "$1" มีนิยามใน <code>&lt;references&gt;</code> à¹à¸•à¹ˆà¹„ม่ถูà¸à¹ƒà¸Šà¹‰à¹ƒà¸™à¸‚้อความà¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰',
+ 'cite_error_empty_references_define' => 'ป้ายระบุ <code>&lt;ref&gt;</code> ที่นิยามใน <code>&lt;references&gt;</code> ด้วยชื่อ "$1" ไม่มีเนื้อหา',
+);
+
+/** Turkmen (Türkmençe)
+ * @author Hanberke
+ */
+$messages['tk'] = array(
+ 'cite_croak' => 'Sita ýitirildi; $1: $2',
+ 'cite_error_key_str_invalid' => 'Içerki säwlik;
+nädogry $str we/ýa-da $key.
+Bu asla bolmaly däl.',
+ 'cite_error_stack_invalid_input' => 'Içerki säwlik;
+nädogry stek açary.
+Bu asla bolmaly däl.',
+ 'cite_error' => 'Sitirleme säwligi: $1',
+ 'cite_error_ref_numeric_key' => 'Nädogry <code>&lt;ref&gt;</code> tegi;
+at ýönekeý bir bitin san bolup bilmeýär. Düşündirişli at ulanyň',
+ 'cite_error_ref_no_key' => 'Nädogry <code>&lt;ref&gt;</code> tegi;
+mazmunsyz refleriň ady bolmaly',
+ 'cite_error_ref_too_many_keys' => 'Nädogry <code>&lt;ref&gt;</code> tegi;
+nädogry atlar, mes. aşa köp',
+ 'cite_error_ref_no_input' => 'Nädogry <code>&lt;ref&gt;</code> tegi;
+atsyz refleriň mazmuny bolmalydyr',
+ 'cite_error_references_invalid_parameters' => 'Nädogry <code>&lt;ref&gt;</code> tegi;
+hiç hili parametre rugsat berilmeýär.
+<code>&lt;references /&gt;</code> ulanyň',
+ 'cite_error_references_no_text' => 'Nädogry <code>&lt;ref&gt;</code> tegi;
+<code>$1</code> atly refler üçin tekst görkezilmändir',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> tegi üçin <code>&lt;/ref&gt;</code> ýapylyşy kem',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> tegleri bar, emma <code>&lt;references/&gt;</code> tegi tapylmady',
+ 'cite_error_group_refs_without_references' => '"$1" atly topar üçin <code>&lt;ref&gt;</code> tegleri bar, emma degişli code>&lt;references group="$1"/&gt;</code> tegi tapylmady',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>-daky <code>&lt;ref&gt;</code> teginiň çaknyşýan "$1" topar aýratynlygy bar.',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>-da kesgitlenen <code>&lt;ref&gt;</code> teginiň öňki tekstde ýok "$1" topar aýratynlygy bar.',
+ 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>-da kesgitlenen "$1" atly <code>&lt;ref&gt;</code> tegi öňki tekstde ulanylmaýar.',
+ 'cite_error_references_no_key' => '<code>&lt;references&gt;</code>-da kesgitlenen <code>&lt;ref&gt;</code> teginiň hiç hili at aýratynlygy ýok.',
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code>-da kesgitlenen "$1" atly <code>&lt;ref&gt;</code> tegiň mazmuny ýok.',
+);
+
+/** Tagalog (Tagalog)
+ * @author AnakngAraw
+ */
+$messages['tl'] = array(
+ 'cite-desc' => 'Nagdaragdag ng mga tatak na <nowiki><ref[ name=id]></nowiki> at <nowiki><references/></nowiki>, para sa mga pagtukoy',
+ 'cite_croak' => 'Nawalan ng buhay ang pagtukoy; $1: $2',
+ 'cite_error_key_str_invalid' => 'Panloob na kamalian;
+hindi tanggap na $str at/o $key.
+Hindi ito dapat mangyari.',
+ 'cite_error_stack_invalid_input' => 'Panloob na kamalian;
+hindi tanggap na susi ng salansan.
+Hindi ito dapat mangyari.',
+ 'cite_error' => 'Kamalian sa pagtukoy: $1',
+ 'cite_error_ref_numeric_key' => "Hindi tanggap ang tatak na <code>&lt;ref&gt;</code>;
+hindi maaaring isang payak na buumbilang (''integer'') ang pangalan. Gumamit ng isang mapaglarawang pamagat",
+ 'cite_error_ref_no_key' => "Hindi tanggap ang tatak na <code>&lt;ref&gt;</code>;
+kinakailangan may isang pangalan ang mga sangguniang (''ref'') walang nilalaman",
+ 'cite_error_ref_too_many_keys' => 'Hindi tanggap ang tatak na <code>&lt;ref&gt;</code>;
+hindi tanggap na mga pangalan, ang ibig sabihin ay napakarami',
+ 'cite_error_ref_no_input' => "Hindi tanggap ang tatak na <code>&lt;ref&gt;</code>;
+kinakailangang may nilalaman ang mga sangguniang (''ref'') walang pangalan",
+ 'cite_error_references_invalid_parameters' => 'Hindi tanggap na <code>&lt;references&gt;</code>;
+walang pinapahintulutang mga parametro.
+Gamitin ang <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Hindi tanggap ang tatak na <code>&lt;references&gt;</code>;
+Pinapahintulutan lamang ang parametrong "pangkat" (\'\'group\'\').
+Gamitin ang <code>&lt;references /&gt;</code>, o <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Naubusan ng pasadyang mga tatak na pantukoy ng panlikod na kawing.
+Dagdagan pa ng pakahulugan sa loob ng mensaheng <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Naubusan ng mga tatak ng pasadyang kawing para sa pangkat na "$1".
+Magbigay ng marami pang kahulugan sa loob ng mensaheng <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => "Hindi tanggap ang tatak na <code>&lt;ref&gt;</code>;
+walang tekstong ibinigay para sa mga sangguniang (''ref'') pinangalanang <code>$1</code>",
+ 'cite_error_included_ref' => 'Naawawala ang pansarang <code>&lt;/ref&gt;</code> na para sa tatak na <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Umiiral na ang mga tatak na <code>&lt;ref&gt;</code>, subalit walang natagpuang tatak na <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Umiiral na ang tatak na <code>&lt;ref&gt;</code> para sa pangkat na pinangalanang "$1", subalit walang natagpuang katumbas na tatak na <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'May hindi nagbabanggaang katangiang pampangkat na "$1" ang <code>&lt;ref&gt;</code> tatak na nasa <code>&lt;references&gt;</code>.',
+ 'cite_error_references_missing_group' => 'Ang tatak na <code>&lt;ref&gt;</code> na binigyang kahulugan sa <code>&lt;references&gt;</code> ay may katangiang pampangkat na "$1" na hindi lumilitawa sa naunang teksto.',
+ 'cite_error_references_missing_key' => 'Ang tatak na <code>&lt;ref&gt;</code> na may pangalang "$1" na binigyang kahulugan sa <code>&lt;references&gt;</code> ay hindi ginamit sa naunang teksto.',
+ 'cite_error_references_no_key' => 'Ang tatak na <code>&lt;ref&gt;</code> na binigyang kahulugan sa <code>&lt;references&gt;</code> ay walang katangiang pampangalan.',
+ 'cite_error_empty_references_define' => 'Ang tatak na <code>&lt;ref&gt;</code> na binigyang kahulugan sa <code>&lt;references&gt;</code> na may pangalang "$1" ay walang nilalaman.',
+ 'cite_reference_link_key_with_num' => '$1_$2',
+ 'cite_reference_link_prefix' => 'cite_ref-',
+ 'cite_reference_link_suffix' => '',
+ 'cite_references_link_prefix' => 'cite_note-',
+ 'cite_references_link_suffix' => '',
+ 'cite_reference_link' => '<sup id="$1" class="reference">[[#$2|<nowiki>[</nowiki>$3<nowiki>]</nowiki>]]</sup>',
+ 'cite_references_link_one' => '<li id="$1"><span class="mw-cite-backlink">[[#$2|↑]]</span> $3</li>',
+ 'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink">↑ $2</span> $3</li>',
+ 'cite_references_link_many_format' => '<sup>[[#$1|$2]]</sup>',
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+ 'cite_references_link_many_sep' => '&#32;',
+ 'cite_references_link_many_and' => '&#32;',
+);
+
+/** толышә зывон (толышә зывон)
+ * @author Erdemaslancan
+ */
+$messages['tly'] = array(
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+);
+
+/** Turkish (Türkçe)
+ * @author Erdemaslancan
+ * @author Joseph
+ * @author Runningfridgesrule
+ */
+$messages['tr'] = array(
+ 'cite-desc' => 'Alıntılar için, <nowiki><ref[ name=id]></nowiki> ve <nowiki><references/></nowiki> etiketlerini ekler',
+ 'cite_croak' => 'Alıntı kaybedildi; $1: $2',
+ 'cite_error_key_str_invalid' => 'Dahili hata;
+geçersiz $str ve/ya da $key.
+Bu asla olmamalı.',
+ 'cite_error_stack_invalid_input' => 'Dahili hata;
+geçersiz stack anahtarı.
+Bu asla olmamalı.',
+ 'cite_error' => 'Kaynak hatası $1',
+ 'cite_error_ref_numeric_key' => 'Geçersiz <code>&lt;ref&gt;</code> etiketi;
+isim basit bir tamsayı olamaz. Tanımlayıcı bir başlık kullanın',
+ 'cite_error_ref_no_key' => 'Geçersiz <code>&lt;ref&gt;</code> etiketi;
+içeriksiz reflerin bir ismi olmalı',
+ 'cite_error_ref_too_many_keys' => 'Geçersiz <code>&lt;ref&gt;</code> etiketi;
+geçersiz isimler, ör. çok fazla',
+ 'cite_error_ref_no_input' => 'Geçersiz <code>&lt;ref&gt;</code> etiketi;
+isimsiz reflerin içeriği olmalı',
+ 'cite_error_references_invalid_parameters' => 'Geçersiz <code>&lt;references&gt;</code> etiketi;
+parametrelere izin verilmiyor.
+<code>&lt;references /&gt;</code> kullanın',
+ 'cite_error_references_invalid_parameters_group' => 'Geçersiz <code>&lt;references&gt;</code> etiketi;
+sadece "group" parametresine izin verilir.
+<code>&lt;references /&gt;</code>, ya da <code>&lt;references group="..." /&gt;</code> kullanın',
+ 'cite_error_references_no_backlink_label' => 'Özel geribağlantı etiketleri kalmadı.
+<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> mesajında daha fazla tanımlayın',
+ 'cite_error_no_link_label_group' => '"$1" grubu için özel bağlantı etiketleri bitti.
+<nowiki>[[MediaWiki:$2]]</nowiki> mesajında daha fazla tanımlayın.',
+ 'cite_error_references_no_text' => 'Geçersiz <code>&lt;ref&gt;</code> etiketi;
+<code>$1</code> isimli refler için metin temin edilmemiş',
+ 'cite_error_included_ref' => '<code>&lt;ref&gt;</code> etiketi için <code>&lt;/ref&gt;</code> kapanışı eksik',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> etiketleri var, ama <code>&lt;references/&gt;</code> etiketi bulunamadı',
+ 'cite_error_group_refs_without_references' => '"$1" isimli grup için <code>&lt;ref&gt;</code> etiketleri mevcut, ancak karşılık gelen <code>&lt;references group="$1"/&gt;</code> etiketi bulunamadı',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>\'daki <code>&lt;ref&gt;</code> etiketinin çelişen "$1" grup özniteliği var.',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>\'da tanımlanan <code>&lt;ref&gt;</code> etiketinin önceki metinde olmayan "$1" grup özniteliği var.',
+ 'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>\'da tanımlanan "$1" adındaki <code>&lt;ref&gt;</code> etiketi önceki metinde kullanılmıyor.',
+ 'cite_error_references_no_key' => "<code>&lt;references&gt;</code>'da tanımlanan <code>&lt;ref&gt;</code> etiketinin hiçbir ad özniteliği yok.",
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code>\'da tanımlanan "$1" adlı <code>&lt;ref&gt;</code> etiketinin içeriği yok.',
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+);
+
+/** Tatar (Cyrillic script) (татарча)
+ * @author Timming
+ */
+$messages['tt-cyrl'] = array(
+ 'cite_error' => 'Өземтә китерү хатаÑÑ‹: $1',
+);
+
+/** Tati (Tati)
+ * @author Erdemaslancan
+ */
+$messages['ttt'] = array(
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+);
+
+/** Central Atlas Tamazight (ⵜⴰⵎⴰⵣⵉⵖⵜ)
+ * @author Tifinaghes
+ */
+$messages['tzm'] = array(
+ 'cite_reference_link_prefix' => 'cite_ref-',
+ 'cite_references_link_many_sep' => '&#32;',
+ 'cite_references_link_many_and' => '&#32;',
+);
+
+/** Uyghur (Arabic script) (ئۇيغۇرچە)
+ * @author Sahran
+ */
+$messages['ug-arab'] = array(
+ 'cite_reference_link_key_with_num' => '$1_$2',
+);
+
+/** Ukrainian (українÑька)
+ * @author AS
+ * @author Ahonc
+ * @author Dim Grits
+ * @author DixonD
+ * @author NickK
+ * @author Prima klasy4na
+ * @author Ytsukeng Fyvaprol
+ */
+$messages['uk'] = array(
+ 'cite-desc' => 'Додає теги <nowiki><ref[ name=id]></nowiki> Ñ– <nowiki><references/></nowiki> Ð´Ð»Ñ Ð²Ð¸Ð½Ð¾Ñок',
+ 'cite_croak' => 'Цитата померла; $1: $2',
+ 'cite_error_key_str_invalid' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°:
+неправильний $str і/або $key.',
+ 'cite_error_stack_invalid_input' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: неправильний ключ Ñтека.',
+ 'cite_error' => 'Помилка цитуваннÑ: $1',
+ 'cite_error_ref_numeric_key' => 'Ðеправильний виклик <code>&lt;ref&gt;</code>:
+назва не може міÑтити тільки цифри.',
+ 'cite_error_ref_no_key' => 'Ðеправильний виклик <code>&lt;ref&gt;</code>:
+порожній тег <code>ref</code> повинен мати параметр name.',
+ 'cite_error_ref_too_many_keys' => 'Ðеправильний виклик <code>&lt;ref&gt;</code>:
+вказані неправильні Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <code>name</code> або вказано забагато параметрів',
+ 'cite_error_ref_no_input' => 'Ðеправильний виклик <code>&lt;ref&gt;</code>:
+тег <code>ref</code> без назви повинен мати вхідні дані',
+ 'cite_error_references_invalid_parameters' => 'Ðеправильний тег <code>&lt;references&gt;</code>:
+параметри не передбачені. ВикориÑтовуйте <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Помилковий тег <code>&lt;references&gt;</code>;
+можна викориÑтовувати тільки параметр «group».
+ВикориÑтовуйте <code>&lt;references /&gt;</code> або <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'ÐедоÑтатньо Ñимволів Ð´Ð»Ñ Ð·Ð²Ð¾Ñ€Ð¾Ñ‚Ð½Ð¸Ñ… гіперпоÑилань.
+Потрібно розширити ÑиÑтемну змінну <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'ЗакінчилиÑÑ Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐºÐ¸ кориÑтувальницьких поÑилань Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¸ "$1".
+Визначте додаткові в повідомленні <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Ðеправильний виклик <code>&lt;ref&gt;</code>:
+Ð´Ð»Ñ Ð²Ð¸Ð½Ð¾Ñок <code>$1</code> не вказаний текÑÑ‚',
+ 'cite_error_included_ref' => 'ВідÑутній тег <code>&lt;/ref&gt;</code> за наÑвноÑÑ‚Ñ– тега <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => "<span style='color: red'>Ð”Ð»Ñ Ð½Ð°Ñвного тегу <code>&lt;ref&gt;</code> не знайдено відповідного тегу <code>&lt;references/&gt;</code></span>",
+ 'cite_error_group_refs_without_references' => 'Ð”Ð»Ñ Ñ–Ñнуючих тегів <code>&lt;ref&gt;</code> групи під назвою "$1" не знайдено відповідного тегу <code>&lt;references group="$1"/&gt;</code>',
+ 'cite_error_references_group_mismatch' => 'Тег <code>&lt;ref&gt;</code> в <code>&lt;references&gt;</code> має конфліктуючий атрибут групи "$1".',
+ 'cite_error_references_missing_group' => 'Тег <code>&lt;ref&gt;</code>, заданий в <code>&lt;references&gt;</code>, має атрибут групи "$1", Ñкий не фігурує в попередньому текÑÑ‚Ñ–.',
+ 'cite_error_references_missing_key' => 'Тег <code>&lt;ref&gt;</code> з назвою "$1", визначений у <code>&lt;references&gt;</code>, не викориÑтовуєтьÑÑ Ð² попередньому текÑÑ‚Ñ–.',
+ 'cite_error_references_no_key' => 'Тег <code>&lt;ref&gt;</code>, визначений у <code>&lt;references&gt;</code>, не має атрибута назви.',
+ 'cite_error_empty_references_define' => 'Тег <code>&lt;ref&gt;</code>, визначений у <code>&lt;references&gt;</code>, з назвою "$1" не має зміÑту.',
+ 'cite_reference_link_key_with_num' => '$1_$2',
+ 'cite_reference_link_prefix' => 'cite_ref-',
+ 'cite_references_link_prefix' => 'cite_note-',
+ 'cite_reference_link' => '<sup id="$1" class="reference">[[#$2|<nowiki>[</nowiki>$3<nowiki>]</nowiki>]]</sup>',
+ 'cite_references_link_one' => '<li id="$1"><span class="mw-cite-backlink">[[#$2|↑]]</span> $3</li>',
+ 'cite_references_link_many_format' => '<sup>[[#$1|$2]]</sup>',
+ 'cite_references_link_many_format_backlink_labels' => 'а б в г д е ж и к л м н п Ñ€ Ñ Ñ‚ у Ñ„ Ñ… ц ш щ ÑŽ Ñ Ð°Ð° аб ав аг ад ае аж аи ак ал ам ан ап ар Ð°Ñ Ð°Ñ‚ ау аф ах ац аш ащ аю Ð°Ñ Ð±Ð° бб бв бг бд бе бж би бк бл бм бн бп бр Ð±Ñ Ð±Ñ‚ бу бф бх бц бш бщ бю Ð±Ñ Ð²Ð° вб вв вг вд ве вж ви вк вл вм вн вп вр Ð²Ñ Ð²Ñ‚ ву вф вх вц вш вщ вю Ð²Ñ Ð³Ð° гб гв гг гд ге гж ги гк гл гм гн гп гр Ð³Ñ Ð³Ñ‚ гу гф гх гц гш гщ гю Ð³Ñ Ð´Ð° дб дв дг дд де дж ди дк дл дм дн дп др Ð´Ñ Ð´Ñ‚ ду дф дх дц дш дщ дю Ð´Ñ ÐµÐ° еб ев ег ед ее еж еи ек ел ем ен еп ер ÐµÑ ÐµÑ‚ еу еф ех ец еш ещ ею ÐµÑ Ð¶Ð° жб жв жг жд же жж жи жк жл жм жн жп жр Ð¶Ñ Ð¶Ñ‚ жу жф жх жц жш жщ жю Ð¶Ñ Ð¸Ð° иб ив иг ид ие иж ии ик ил им ин ип ир Ð¸Ñ Ð¸Ñ‚ иу иф их иц иш ищ ию Ð¸Ñ ÐºÐ° кб кв кг кд ке кж ки кк кл км кн кп кр ÐºÑ ÐºÑ‚ ку кф кх кц кш кщ кю ÐºÑ Ð»Ð° лб лв лг лд ле лж ли лк лл лм лн лп лр Ð»Ñ Ð»Ñ‚ лу лф лх лц лш лщ лю Ð»Ñ Ð¼Ð° мб мв мг мд ме мж ми мк мл мм мн мп мр Ð¼Ñ Ð¼Ñ‚ му мф мх мц мш мщ мю Ð¼Ñ Ð½Ð° нб нв нг нд не нж ни нк нл нм нн нп нр Ð½Ñ Ð½Ñ‚ ну нф нх нц нш нщ ню Ð½Ñ Ð¿Ð° пб пв пг пд пе пж пи пк пл пм пн пп пр Ð¿Ñ Ð¿Ñ‚ пу пф пх пц пш пщ пю Ð¿Ñ Ñ€Ð° рб рв рг рд ре рж ри рк рл рм рн рп рр Ñ€Ñ Ñ€Ñ‚ ру рф рх рц рш рщ рю Ñ€Ñ Ñа Ñб Ñв Ñг Ñд Ñе Ñж Ñи Ñк Ñл Ñм Ñн Ñп ÑÑ€ ÑÑ ÑÑ‚ Ñу ÑÑ„ ÑÑ… Ñц Ñш Ñщ ÑÑŽ ÑÑ Ñ‚Ð° тб тв тг тд те тж ти тк тл тм тн тп Ñ‚Ñ€ Ñ‚Ñ Ñ‚Ñ‚ ту Ñ‚Ñ„ Ñ‚Ñ… тц тш тщ Ñ‚ÑŽ Ñ‚Ñ ÑƒÐ° уб ув уг уд уе уж уи ук ул ум ун уп ур ÑƒÑ ÑƒÑ‚ уу уф ух уц уш ущ ую ÑƒÑ Ñ„Ð° фб фв фг фд фе фж фи фк фл фм фн фп Ñ„Ñ€ Ñ„Ñ Ñ„Ñ‚ фу Ñ„Ñ„ Ñ„Ñ… фц фш фщ Ñ„ÑŽ Ñ„Ñ Ñ…Ð° хб хв хг хд хе хж хи хк хл хм хн хп Ñ…Ñ€ Ñ…Ñ Ñ…Ñ‚ ху Ñ…Ñ„ Ñ…Ñ… хц хш хщ Ñ…ÑŽ Ñ…Ñ Ñ†Ð° цб цв цг цд це цж ци цк цл цм цн цп цр Ñ†Ñ Ñ†Ñ‚ цу цф цх цц цш цщ цю Ñ†Ñ ÑˆÐ° шб шв шг шд ше шж ши шк шл шм шн шп шр ÑˆÑ ÑˆÑ‚ шу шф шх шц шш шщ шю ÑˆÑ Ñ‰Ð° щб щв щг щд ще щж щи щк щл щм щн щп щр Ñ‰Ñ Ñ‰Ñ‚ щу щф щх щц щш щщ щю Ñ‰Ñ ÑŽÐ° юб юв юг юд юе юж юи юк юл юм юн юп ÑŽÑ€ ÑŽÑ ÑŽÑ‚ юу ÑŽÑ„ ÑŽÑ… юц юш ющ ÑŽÑŽ ÑŽÑ Ñа Ñб Ñв Ñг Ñд Ñе Ñж Ñи Ñк Ñл Ñм Ñн Ñп ÑÑ€ ÑÑ ÑÑ‚ Ñу ÑÑ„ ÑÑ… Ñц Ñш Ñщ ÑÑŽ ÑÑ',
+ 'cite_references_link_many_sep' => '&#32;',
+ 'cite_references_link_many_and' => '&#32;',
+);
+
+/** vèneto (vèneto)
+ * @author Candalua
+ */
+$messages['vec'] = array(
+ 'cite-desc' => 'Zonta i tag <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> par gestir le citazion',
+ 'cite_croak' => 'Eror ne la citazion: $1: $2',
+ 'cite_error_key_str_invalid' => 'Eror interno: $str e/o $key sbaglià. Sta roba qua no la dovarìa mai capitar.',
+ 'cite_error_stack_invalid_input' => 'Eror interno;
+ciave de stack sbaglià.
+Sta roba no la dovarìa mai capitar.',
+ 'cite_error' => 'Eror ne la funsion Cite $1',
+ 'cite_error_ref_numeric_key' => "Eror ne l'uso del marcator <code>&lt;ref&gt;</code>: el nome no'l pode mìa èssar un nùmaro intiero. Dòpara un titolo esteso",
+ 'cite_error_ref_no_key' => "Eror ne l'uso del marcator <code>&lt;ref&gt;</code>: i ref vodi no i pol no verghe un nome",
+ 'cite_error_ref_too_many_keys' => "Eror ne l'uso del marcator <code>&lt;ref&gt;</code>: nomi mìa validi (ad es. nùmaro massa elevà)",
+ 'cite_error_ref_no_input' => "Eror ne l'uso del marcator <code>&lt;ref&gt;</code>: i ref che no gà un nome no i pol mìa èssar vodi",
+ 'cite_error_references_invalid_parameters' => "Eror ne l'uso del marcator <code>&lt;references&gt;</code>: parametri mìa consentìi, dòpara el marcator <code>&lt;references /&gt;</code>",
+ 'cite_error_references_invalid_parameters_group' => 'Tag <code>&lt;references&gt;</code> mìa valido;
+solo el parametro "group" el xe permesso.
+Dòpara <code>&lt;references /&gt;</code>, o <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Etichete de rimando personalizàe esaurìe, auménteghen el nùmaro nel messagio <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Etichete esaurìe par colegamenti personalizà del grupo "$1", aumentarne el numaro nel messajo <nowiki>[[MediaWiki:$2]]</nowiki>',
+ 'cite_error_references_no_text' => 'Marcator <code>&lt;ref&gt;</code> mìa valido; no xe stà indicà nissun testo par el marcator <code>$1</code>',
+ 'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> de chiusura mancante par el marcador <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Ghe xe un tag <code>&lt;ref&gt;</code>, ma no xe stà catà nissun tag <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Ghe xe un tag <code>&lt;ref&gt;</code> par un grupo che se ciama "$1", ma no xe stà catà nissun tag <code>&lt;references group="$1"/&gt;</code> che corisponda.',
+ 'cite_error_references_group_mismatch' => 'El tag <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> el gà l\'atributo de grupo "$1" in conflito.',
+ 'cite_error_references_missing_group' => 'El tag <code>&lt;ref&gt;</code> definìo in <code>&lt;references&gt;</code> el gà un atributo de grupo "$1" che no conpare mia nel testo precedente.',
+ 'cite_error_references_missing_key' => 'El tag <code>&lt;ref&gt;</code> con nome "$1" definìo in <code>&lt;references&gt;</code> no\'l xe doparà nel testo precedente.',
+ 'cite_error_references_no_key' => "El tag <code>&lt;ref&gt;</code> definìo in <code>&lt;references&gt;</code> no'l gà un atributo nome.",
+ 'cite_error_empty_references_define' => 'El tag <code>&lt;ref&gt;</code> definìo in <code>&lt;references&gt;</code> con nome "$1" no\'l gà nissun contenuto.',
+);
+
+/** Veps (vepsän kel’)
+ * @author Игорь БродÑкий
+ */
+$messages['vep'] = array(
+ 'cite_error' => 'Citiruindan petuz: $1',
+);
+
+/** Vietnamese (Tiếng Việt)
+ * @author Minh Nguyen
+ * @author Vinhtantran
+ */
+$messages['vi'] = array(
+ 'cite-desc' => 'Thêm các thẻ <nowiki><ref[ name=id]></nowiki> và <nowiki><references/></nowiki> để ghi chú thích hoặc nguồn tham khảo',
+ 'cite_croak' => 'Chú thích bị há»ng; $1: $2',
+ 'cite_error_key_str_invalid' => 'Lá»—i ná»™i bá»™; $str và/hoặc $key không hợp lệ. Äiá»u này không bao giá» nên xảy ra.',
+ 'cite_error_stack_invalid_input' => 'Lá»—i ná»™i bá»™; khóa xác định chồng bị sai. Äáng ra không bao giá» xảy ra Ä‘iá»u này.',
+ 'cite_error' => 'Lỗi chú thích: $1',
+ 'cite_error_ref_numeric_key' => 'Thẻ <code>&lt;ref&gt;</code> sai; tên không thể chỉ là số nguyên, hãy dùng tựa đỠcó tính miêu tả',
+ 'cite_error_ref_no_key' => 'Thẻ <code>&lt;ref&gt;</code> sai; thẻ ref không có nội dung thì phải có tên',
+ 'cite_error_ref_too_many_keys' => 'Thẻ <code>&lt;ref&gt;</code> sai; thông số tên sai, nhÆ°, nhiá»u thông số tên quá',
+ 'cite_error_ref_no_input' => 'Mã <code>&lt;ref&gt;</code> sai; thẻ ref không có tên thì phải có nội dung',
+ 'cite_error_references_invalid_parameters' => 'Thẻ <code>&lt;references&gt;</code> sai; không được có thông số, hãy dùng <code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => 'Thẻ <code>&lt;references&gt;</code> không hợp lệ;
+chỉ cho phép tham số “groupâ€.
+Hãy dùng <code>&lt;references /&gt;</code>, hoặc <code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => 'Äã dùng hết nhãn tham khảo chung.
+Hãy định nghĩa thêm ở thông điệp <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+ 'cite_error_no_link_label_group' => 'Thiếu nhãn liên kết tùy biến cho nhóm “$1â€. Hãy định rõ thêm nhãn trong thông Ä‘iệp <nowiki>[[MediaWiki:$2]]</nowiki>.',
+ 'cite_error_references_no_text' => 'Thẻ <code>&lt;ref&gt;</code> sai; không có nội dung trong thẻ ref có tên <code>$1</code>',
+ 'cite_error_included_ref' => 'Không có <code>&lt;/ref&gt;</code> để đóng thẻ <code>&lt;ref&gt;</code>',
+ 'cite_error_refs_without_references' => 'Tồn tại thẻ <code>&lt;ref&gt;</code>, nhưng không tìm thấy thẻ <code>&lt;references/&gt;</code>',
+ 'cite_error_group_refs_without_references' => 'Tồn tại thẻ <code>&lt;ref&gt;</code> vá»›i tên nhóm “$1â€, nhÆ°ng không tìm thấy thẻ <code>&lt;references group="$1"/&gt;</code> tÆ°Æ¡ng ứng',
+ 'cite_error_references_group_mismatch' => 'Thẻ <code>&lt;ref&gt;</code> trong <code>&lt;references&gt;</code> có thuá»™c tính nhóm mâu thuẫn “$1â€.',
+ 'cite_error_references_missing_group' => 'Thẻ <code>&lt;ref&gt;</code> được định nghĩa trong <code>&lt;references&gt;</code> có thuộc tính nhóm “$1†không thấy xuất hiện trong văn bản phía trên.',
+ 'cite_error_references_missing_key' => 'Thẻ <code>&lt;ref&gt;</code> có tên “$1†được định nghĩa trong <code>&lt;references&gt;</code> không được đoạn văn bản trên sử dụng.',
+ 'cite_error_references_no_key' => ' Thẻ <code>&lt;ref&gt;</code> được định nghĩa trong <code>&lt;references&gt;</code> không có thuộc tính name.',
+ 'cite_error_empty_references_define' => 'Thẻ <code>&lt;ref&gt;</code> được định nghĩa trong <code>&lt;references&gt;</code> có tên “$1†không có nội dung.',
+ 'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+);
+
+/** Volapük (Volapük)
+ * @author Smeira
+ */
+$messages['vo'] = array(
+ 'cite_croak' => 'Saitot dädik; $1: $2',
+ 'cite_error_key_str_invalid' => 'Pöl ninik: $str e/u $key no lonöföl(s). Atos no sötonöv jenön.',
+ 'cite_error_stack_invalid_input' => 'Pöl ninik; kumakik no lonöföl. Atos neai sötonöv jenön.',
+ 'cite_error' => 'Saitamapöl: $1',
+ 'cite_error_ref_numeric_key' => 'Nem ela <code>&lt;ref&gt;</code> no lonöföl. Nem no kanon binädön te me numats; gebolös bepenami.',
+ 'cite_error_ref_no_key' => 'Geb no lonöföl ela <code>&lt;ref&gt;</code>: els ref nen ninäd mutons labön nemi',
+ 'cite_error_ref_too_many_keys' => 'El <code>&lt;ref&gt;</code> no lonöfon: labon nemis no lonöfikis, a. s. tumödikis',
+ 'cite_error_ref_no_input' => 'El <code>&lt;ref&gt;</code> no lonöfon: els ref nen nem mutons labön ninädi',
+ 'cite_error_references_invalid_parameters' => 'El <code>&lt;references&gt;</code> no lonöfon: paramets no padälons. Gebolös eli <code>&lt;references /&gt;</code>',
+ 'cite_error_references_no_text' => 'El <code>&lt;ref&gt;</code> no lonöfon: vödem nonik pegivon eles refs labü nem: <code>$1</code>',
+);
+
+/** Yiddish (ייִדיש)
+ * @author פוילישער
+ */
+$messages['yi'] = array(
+ 'cite-desc' => 'לייגט צו <nowiki><ref[ name=id]></nowiki> ×ון <nowiki><references/></nowiki> ט×ַגן, פֿ×ר ציטירונגען (×ין הערות)',
+ 'cite_croak' => 'טעות ×ין ציטירונג; $1: $2',
+ 'cite_error_key_str_invalid' => '×ינערלעכער גרייז;
+×ומגילטיקער $str ×ון/×דער $key.
+ד×ס ×–×ל נישט פ×סירן.',
+ 'cite_error_stack_invalid_input' => '×ינערלעכער גרייז;
+×ומגילטיקער סט×ַק.
+ד×ס ד×רף קיינמ×ל נישט פ×סירן.',
+ 'cite_error' => 'ציטירן גרײַז: $1',
+ 'cite_error_ref_numeric_key' => 'גרײַזיגער <code>&lt;ref&gt;</code> ט×Ö·×’;
+× ×מען ט×ר נישט זײַן קיין פשוטער נומער. ניצט × ×‘×שרײַבדיק קעפל',
+ 'cite_error_ref_no_key' => '×ומגילטיגער <code>&lt;ref&gt;</code> ט×Ö·×’;
+× ×¨×¢×¤Ö¿×¢×¨×¢× ×¥ ×ָן תוכן מוז ×”×בן × × ×מען',
+ 'cite_error_ref_too_many_keys' => '×ומגילטיגער <code>&lt;ref&gt;</code> ט×Ö·×’;
+×ומגילטיגע נעמען, צ.ב. צו פֿיל',
+ 'cite_error_ref_no_input' => '×ומגילטיגער <code>&lt;ref&gt;</code> ט×Ö·×’;
+× ×¨×¢×¤Ö¿×¢×¨×¢× ×¥ ×ָן × × ×מען ד×רף ×”×בן תוכן',
+ 'cite_error_references_invalid_parameters' => '×ומגילטיגער <code>&lt;references&gt;</code> ט×Ö·×’;
+קיין פ×ר×מעטערס נישט ערלויבט. ניצט <code>&lt;references /&gt;</code>',
+ 'cite_error_references_no_text' => '×ומגילטיגער <code>&lt;ref&gt;</code> ט×Ö·×’;
+קיין טעקסט נישט געשריבן פֿ×ַר רעפֿערענצן מיטן × ×ָמען <code>$1</code>',
+ 'cite_error_included_ref' => 'פֿעלט × ×©×œ×™×¡× ×“×™×’×¢×¨ <code>&lt;/ref&gt;</code> פֿ×ַר <code>&lt;ref&gt;</code> ט×Ö·×’',
+ 'cite_error_refs_without_references' => "ס'זענען ×“× <code>&lt;ref&gt;</code> ט×ַגן, ×בער מ'×”×ט נישט געטר×פֿן קיין <code>&lt;references/&gt;</code> ט×Ö·×’.",
+ 'cite_error_group_refs_without_references' => 'ס\'זענען ×“× <code>&lt;ref&gt;</code> ט×ַגן פֿ×ַר × ×’×¨×•×¤×¢ וו×ס הייסט "$1", ×בער מ\'×”×ט נישט געטר×פֿן קיין ×Ö·× ×˜×§×¢×’×¢× ×¢× <code>&lt;references group="$1"/&gt;</code> ט×Ö·×’.',
+ 'cite_error_references_group_mismatch' => 'דער <code>&lt;ref&gt;</code> ט××’ ×ין <code>&lt;references&gt;</code> ×”×ט × ×’×¨×•×¤×¢ ×ייגנקייט וו×ס ××™×– סותר "$1".',
+ 'cite_error_references_missing_group' => 'דער <code>&lt;ref&gt;</code> ט××’ דעפינעירט ×ין <code>&lt;references&gt;</code> ×”×ט גרופע ×ייגנקייט "$1" וו×ס ב×ווייזט זיך נישט ×ין פריערדיקן טעקסט.',
+ 'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> ט×Ö·×’ מיטן × ×ָמען "$1" דעפֿינירט ×ין<code>&lt;references&gt;</code> נישט געניצט ×ין פֿריערדיקן טעקסט.',
+ 'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> ט×Ö·×’ דעפֿינירט ×ין <code>&lt;references&gt;</code> ×”×ט נישט קיין name ×ַטריבוט.',
+ 'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> ט×Ö·×’ דעפֿינירט ×ין <code>&lt;references&gt;</code> מיט × ×ָמען "$1" ×”×ט נישט קיין ××™× ×”×ַלט.',
+);
+
+/** Cantonese (粵語)
+ */
+$messages['yue'] = array(
+ 'cite-desc' => '加 <nowiki><ref[ name=id]></nowiki> åŒ <nowiki><references/></nowiki> 標籤用響引用度',
+ 'cite_croak' => '引用阻塞咗; $1: $2',
+ 'cite_error_key_str_invalid' => '內部錯誤; 無效嘅 $str', # Fuzzy
+ 'cite_error_stack_invalid_input' => '內部錯誤; 無效嘅堆疊匙',
+ 'cite_error' => '引用錯誤 $1',
+ 'cite_error_ref_numeric_key' => '無效嘅呼å«; 需è¦ä¸€å€‹éžæ•´æ•¸å˜…匙',
+ 'cite_error_ref_no_key' => '無效嘅呼å«; 未指定匙',
+ 'cite_error_ref_too_many_keys' => '無效嘅呼å«; 無效嘅匙, 例如: 太多或者指定咗一個錯咗嘅匙',
+ 'cite_error_ref_no_input' => '無效嘅呼å«; 未指定輸入',
+ 'cite_error_references_invalid_parameters' => '無效嘅åƒæ•¸; 唔需è¦æœ‰å˜¢',
+ 'cite_error_references_invalid_parameters_group' => '無效嘅<code>&lt;references&gt;</code>標籤;
+åªå®¹è¨± "group" åƒæ•¸ã€‚
+用<code>&lt;references /&gt;</code>,或<code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => '用晒啲自定返回標籤, 響 <nowiki>[[MediaWiki:Cite_references_link_many_format_backlink_labels]]</nowiki> ä¿¡æ¯å†æ•´å¤šå•²', # Fuzzy
+ 'cite_error_references_no_text' => '無效嘅<code>&lt;ref&gt;</code>標籤;
+無文字æ供於å為<code>$1</code>嘅åƒç…§',
+);
+
+/** Simplified Chinese (中文(简体)‎)
+ * @author Gaoxuewei
+ * @author Liangent
+ * @author PhiLiP
+ * @author Philip
+ * @author 乌拉跨氪
+ */
+$messages['zh-hans'] = array(
+ 'cite-desc' => '增加用于引用的<nowiki><ref[ name=id]></nowiki>和<nowiki><references/></nowiki>标签',
+ 'cite_croak' => '引用失效;$1:$2',
+ 'cite_error_key_str_invalid' => '内部错误;ä¸åº”出现的éžæ³•$strå’Œï¼æˆ–$key。',
+ 'cite_error_stack_invalid_input' => '内部错误;ä¸åº”出现的éžæ³•å †æ ˆé”®å€¼ã€‚',
+ 'cite_error' => '引用错误:$1',
+ 'cite_error_ref_numeric_key' => '无效<code>&lt;ref&gt;</code>标签;name属性ä¸èƒ½æ˜¯å•ä¸€çš„数字,请使用å¯è¾¨è¯†çš„标题',
+ 'cite_error_ref_no_key' => '无效<code>&lt;ref&gt;</code>标签;未填内容的引用必须填写name属性',
+ 'cite_error_ref_too_many_keys' => '无效<code>&lt;ref&gt;</code>标签;name属性éžæ³•ï¼Œå¯èƒ½æ˜¯å†…容过长',
+ 'cite_error_ref_no_input' => '无效<code>&lt;ref&gt;</code>标签;未填name属性的引用必须填写内容',
+ 'cite_error_references_invalid_parameters' => '无效<code>&lt;references&gt;</code>标签;ä¸å…许填写å‚数,请使用<code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => '无效<code>&lt;references&gt;</code>标签;åªå…许填写“groupâ€å‚数,请使用<code>&lt;references /&gt;</code>或<code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => '自定义回链标签耗尽,请在<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>中定义更多的标签。',
+ 'cite_error_no_link_label_group' => '组“$1â€çš„自定义链接标签耗尽,请在<nowiki>[[MediaWiki:$2]]</nowiki>中定义更多的标签。',
+ 'cite_error_references_no_text' => '无效<code>&lt;ref&gt;</code>标签;未给name属性为<code>$1</code>的引用æ供文字',
+ 'cite_error_included_ref' => '没有找到与<code>&lt;/ref&gt;</code>对应的<code>&lt;ref&gt;</code>标签',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>标签存在,但没有找到<code>&lt;references/&gt;</code>标签',
+ 'cite_error_group_refs_without_references' => '组å为“$1â€çš„<code>&lt;ref&gt;</code>标签存在,但没有找到相应的<code>&lt;references group="$1"/&gt;</code>标签',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>çš„<code>&lt;ref&gt;</code>标记带有冲çªçš„组(group)属性“$1â€ã€‚',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>中定义的<code>&lt;ref&gt;</code>标记带有未在å‰æ–‡ä¸­å‡ºçŽ°çš„组(group)属性“$1â€ã€‚',
+ 'cite_error_references_missing_key' => '在<code>&lt;references&gt;</code>中以“$1â€å字定义的<code>&lt;ref&gt;</code>标签没有在先å‰çš„文字中使用。',
+ 'cite_error_references_no_key' => '<code>&lt;references&gt;</code>中定义的<code>&lt;ref&gt;</code>没有给出å称(name)属性。',
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code>中定义的<code>&lt;ref&gt;</code>çš„å称(name)“$1â€ä¸ºç©ºã€‚',
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Liangent
+ * @author Mark85296341
+ * @author Philip
+ * @author 乌拉跨氪
+ */
+$messages['zh-hant'] = array(
+ 'cite-desc' => '增加用於引用的<nowiki><ref[ name=id]></nowiki>和<nowiki><references/></nowiki>標籤',
+ 'cite_croak' => '引用失效;$1:$2',
+ 'cite_error_key_str_invalid' => '內部錯誤;ä¸æ‡‰å‡ºç¾çš„éžæ³•$strå’Œï¼æˆ–$key。',
+ 'cite_error_stack_invalid_input' => '內部錯誤;ä¸æ‡‰å‡ºç¾çš„éžæ³•å †ç–Šéµå€¼ã€‚',
+ 'cite_error' => '引用錯誤:$1',
+ 'cite_error_ref_numeric_key' => '無效<code>&lt;ref&gt;</code>標籤;name屬性ä¸èƒ½æ˜¯å–®ä¸€çš„數字,請使用å¯è¾¨è­˜çš„標題',
+ 'cite_error_ref_no_key' => '無效<code>&lt;ref&gt;</code>標籤;未填內容的引用必須填寫name屬性',
+ 'cite_error_ref_too_many_keys' => '無效<code>&lt;ref&gt;</code>標籤;name屬性éžæ³•ï¼Œå¯èƒ½æ˜¯å…§å®¹éŽé•·',
+ 'cite_error_ref_no_input' => '無效<code>&lt;ref&gt;</code>標籤;未填name屬性的引用必須填寫內容',
+ 'cite_error_references_invalid_parameters' => '無效<code>&lt;references&gt;</code>標籤;ä¸å…許填寫åƒæ•¸ï¼Œè«‹ä½¿ç”¨<code>&lt;references /&gt;</code>',
+ 'cite_error_references_invalid_parameters_group' => '無效<code>&lt;references&gt;</code>標籤;åªå…許填寫「groupã€åƒæ•¸ï¼Œè«‹ä½¿ç”¨<code>&lt;references /&gt;</code>或<code>&lt;references group="..." /&gt;</code>',
+ 'cite_error_references_no_backlink_label' => '自訂回連標籤耗盡。請在<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>中定義更多的標籤',
+ 'cite_error_no_link_label_group' => '群組「$1ã€çš„自訂標籤標籤耗盡,請在<nowiki>[[MediaWiki:$2]]</nowiki>中定義更多的標籤。',
+ 'cite_error_references_no_text' => '無效<code>&lt;ref&gt;</code>標籤;未給name屬性為<code>$1</code>的引用æ供文字',
+ 'cite_error_included_ref' => '沒有找到與<code>&lt;/ref&gt;</code>å°æ‡‰çš„<code>&lt;ref&gt;</code>標籤',
+ 'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>標籤存在,但沒有找到<code>&lt;references/&gt;</code>標籤',
+ 'cite_error_group_refs_without_references' => '組å為「$1ã€çš„<code>&lt;ref&gt;</code>標籤存在,但沒有找到相應的<code>&lt;references group="$1"/&gt;</code>標籤',
+ 'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>çš„<code>&lt;ref&gt;</code>標記帶有è¡çªçš„群組(group)屬性「$1ã€ã€‚',
+ 'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>中定義的<code>&lt;ref&gt;</code>標記帶有未在å‰æ–‡ä¸­å‡ºç¾çš„群組(group)屬性「$1ã€ã€‚',
+ 'cite_error_references_missing_key' => '在<code>&lt;references&gt;</code>中以“$1â€å字定義的<code>&lt;ref&gt;</code>標籤沒有在先å‰çš„文字中使用。',
+ 'cite_error_references_no_key' => '<code>&lt;references&gt;</code>中定義的<code>&lt;ref&gt;</code>沒有給出å稱(name)屬性。',
+ 'cite_error_empty_references_define' => '<code>&lt;references&gt;</code>中定義的<code>&lt;ref&gt;</code>çš„å稱(name)「$1ã€ç‚ºç©ºã€‚',
+);
diff --git a/extensions/Cite/Cite.php b/extensions/Cite/Cite.php
new file mode 100644
index 00000000..0f957659
--- /dev/null
+++ b/extensions/Cite/Cite.php
@@ -0,0 +1,111 @@
+<?php
+if ( ! defined( 'MEDIAWIKI' ) )
+ die();
+/**#@+
+ * A parser extension that adds two tags, <ref> and <references> for adding
+ * citations to pages
+ *
+ * @file
+ * @ingroup Extensions
+ *
+ * @link http://www.mediawiki.org/wiki/Extension:Cite/Cite.php Documentation
+ *
+ * @bug 4579
+ *
+ * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+ * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+
+$wgHooks['ParserFirstCallInit'][] = 'wfCite';
+$wgHooks['BeforePageDisplay'][] = 'wfCiteBeforePageDisplay';
+
+
+$wgExtensionCredits['parserhook'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'Cite',
+ 'author' => 'Ævar Arnfjörð Bjarmason',
+ 'descriptionmsg' => 'cite-desc',
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:Cite/Cite.php'
+);
+$wgParserTestFiles[] = dirname( __FILE__ ) . "/citeParserTests.txt";
+$wgParserTestFiles[] = dirname( __FILE__ ) . "/citeCatTreeParserTests.txt";
+$wgExtensionMessagesFiles['Cite'] = dirname( __FILE__ ) . "/Cite.i18n.php";
+$wgAutoloadClasses['Cite'] = dirname( __FILE__ ) . "/Cite_body.php";
+$wgSpecialPageGroups['Cite'] = 'pagetools';
+
+define( 'CITE_DEFAULT_GROUP', '' );
+/**
+ * The emergency shut-off switch. Override in local settings to disable
+ * groups; or remove all references from this file to enable unconditionally
+ */
+$wgAllowCiteGroups = true;
+
+/**
+ * An emergency optimisation measure for caching cite <references /> output.
+ */
+$wgCiteCacheReferences = false;
+
+/**
+ * Enables experimental popups
+ */
+$wgCiteEnablePopups = false;
+
+/**
+ * Performs the hook registration.
+ * Note that several extensions (and even core!) try to detect if Cite is
+ * installed by looking for wfCite().
+ *
+ * @param $parser Parser
+ *
+ * @return bool
+ */
+function wfCite( $parser ) {
+ return Cite::setHooks( $parser );
+}
+
+// Resources
+$citeResourceTemplate = array(
+ 'localBasePath' => dirname(__FILE__) . '/modules',
+ 'remoteExtPath' => 'Cite/modules'
+);
+
+$wgResourceModules['ext.cite'] = $citeResourceTemplate + array(
+ 'styles' => array(),
+ 'scripts' => 'ext.cite/ext.cite.js',
+ 'position' => 'bottom',
+ 'dependencies' => array(
+ 'jquery.tooltip',
+ ),
+);
+
+$wgResourceModules['jquery.tooltip'] = $citeResourceTemplate + array(
+ 'styles' => 'jquery.tooltip/jquery.tooltip.css',
+ 'scripts' => 'jquery.tooltip/jquery.tooltip.js',
+ 'position' => 'bottom',
+);
+
+/* Add RTL fix for the cite <sup> elements */
+$wgResourceModules['ext.rtlcite'] = $citeResourceTemplate + array(
+ 'styles' => 'ext.rtlcite/ext.rtlcite.css',
+ 'position' => 'top',
+);
+
+/**
+ * @param $out OutputPage
+ * @param $sk Skin
+ * @return bool
+ */
+function wfCiteBeforePageDisplay( $out, &$sk ) {
+ global $wgCiteEnablePopups;
+
+ if ( $wgCiteEnablePopups ) {
+ $out->addModules( 'ext.cite' );
+ }
+
+ /* RTL support quick-fix module */
+ $out->addModuleStyles( 'ext.rtlcite' );
+ return true;
+}
+
+/**#@-*/
diff --git a/extensions/Cite/Cite_body.php b/extensions/Cite/Cite_body.php
new file mode 100644
index 00000000..488bacbb
--- /dev/null
+++ b/extensions/Cite/Cite_body.php
@@ -0,0 +1,1197 @@
+<?php
+
+/**#@+
+ * A parser extension that adds two tags, <ref> and <references> for adding
+ * citations to pages
+ *
+ * @ingroup Extensions
+ *
+ * @link http://www.mediawiki.org/wiki/Extension:Cite/Cite.php Documentation
+ * @link http://www.w3.org/TR/html4/struct/text.html#edef-CITE <cite> definition in HTML
+ * @link http://www.w3.org/TR/2005/WD-xhtml2-20050527/mod-text.html#edef_text_cite <cite> definition in XHTML 2.0
+ *
+ * @bug 4579
+ *
+ * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+ * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+
+class Cite {
+ /**#@+
+ * @access private
+ */
+
+ /**
+ * Datastructure representing <ref> input, in the format of:
+ * <code>
+ * array(
+ * 'user supplied' => array(
+ * 'text' => 'user supplied reference & key',
+ * 'count' => 1, // occurs twice
+ * 'number' => 1, // The first reference, we want
+ * // all occourances of it to
+ * // use the same number
+ * ),
+ * 0 => 'Anonymous reference',
+ * 1 => 'Another anonymous reference',
+ * 'some key' => array(
+ * 'text' => 'this one occurs once'
+ * 'count' => 0,
+ * 'number' => 4
+ * ),
+ * 3 => 'more stuff'
+ * );
+ * </code>
+ *
+ * This works because:
+ * * PHP's datastructures are guaranteed to be returned in the
+ * order that things are inserted into them (unless you mess
+ * with that)
+ * * User supplied keys can't be integers, therefore avoiding
+ * conflict with anonymous keys
+ *
+ * @var array
+ **/
+ var $mRefs = array();
+
+ /**
+ * Count for user displayed output (ref[1], ref[2], ...)
+ *
+ * @var int
+ */
+ var $mOutCnt = 0;
+ var $mGroupCnt = array();
+
+ /**
+ * Counter to track the total number of (useful) calls to either the
+ * ref or references tag hook
+ */
+ var $mCallCnt = 0;
+
+ /**
+ * The backlinks, in order, to pass as $3 to
+ * 'cite_references_link_many_format', defined in
+ * 'cite_references_link_many_format_backlink_labels
+ *
+ * @var array
+ */
+ var $mBacklinkLabels;
+
+ /**
+ * The links to use per group, in order.
+ *
+ * @var array
+ */
+ var $mLinkLabels = array();
+
+ /**
+ * @var Parser
+ */
+ var $mParser;
+
+ /**
+ * True when the ParserAfterParse hook has been called.
+ * Used to avoid doing anything in ParserBeforeTidy.
+ *
+ * @var boolean
+ */
+ var $mHaveAfterParse = false;
+
+ /**
+ * True when a <ref> tag is being processed.
+ * Used to avoid infinite recursion
+ *
+ * @var boolean
+ */
+ var $mInCite = false;
+
+ /**
+ * True when a <references> tag is being processed.
+ * Used to detect the use of <references> to define refs
+ *
+ * @var boolean
+ */
+ var $mInReferences = false;
+
+ /**
+ * Error stack used when defining refs in <references>
+ *
+ * @var array
+ */
+ var $mReferencesErrors = array();
+
+ /**
+ * Group used when in <references> block
+ *
+ * @var string
+ */
+ var $mReferencesGroup = '';
+
+ /**
+ * <ref> call stack
+ * Used to cleanup out of sequence ref calls created by #tag
+ * See description of function rollbackRef.
+ *
+ * @var array
+ */
+ var $mRefCallStack = array();
+
+ /**
+ * Did we install us into $wgHooks yet?
+ * @var Boolean
+ */
+ static protected $hooksInstalled = false;
+
+ /**#@+ @access private */
+
+ /**
+ * Callback function for <ref>
+ *
+ * @param $str string Input
+ * @param $argv array Arguments
+ * @param $parser Parser
+ *
+ * @return string
+ */
+ function ref( $str, $argv, $parser ) {
+ if ( $this->mInCite ) {
+ return htmlspecialchars( "<ref>$str</ref>" );
+ } else {
+ $this->mCallCnt++;
+ $this->mInCite = true;
+ $ret = $this->guardedRef( $str, $argv, $parser );
+ $this->mInCite = false;
+ return $ret;
+ }
+ }
+
+ /**
+ * @param $str string Input
+ * @param $argv array Arguments
+ * @param $parser Parser
+ * @param $default_group string
+ * @return string
+ */
+ function guardedRef( $str, $argv, $parser, $default_group = CITE_DEFAULT_GROUP ) {
+ $this->mParser = $parser;
+
+ # The key here is the "name" attribute.
+ list( $key, $group, $follow ) = $this->refArg( $argv );
+
+ # Split these into groups.
+ if ( $group === null ) {
+ if ( $this->mInReferences ) {
+ $group = $this->mReferencesGroup;
+ } else {
+ $group = $default_group;
+ }
+ }
+
+ # This section deals with constructions of the form
+ #
+ # <references>
+ # <ref name="foo"> BAR </ref>
+ # </references>
+ #
+ if ( $this->mInReferences ) {
+ if ( $group != $this->mReferencesGroup ) {
+ # <ref> and <references> have conflicting group attributes.
+ $this->mReferencesErrors[] =
+ $this->error( 'cite_error_references_group_mismatch', htmlspecialchars( $group ) );
+ } elseif ( $str !== '' ) {
+ if ( !isset( $this->mRefs[$group] ) ) {
+ # Called with group attribute not defined in text.
+ $this->mReferencesErrors[] =
+ $this->error( 'cite_error_references_missing_group', htmlspecialchars( $group ) );
+ } elseif ( $key === null || $key === '' ) {
+ # <ref> calls inside <references> must be named
+ $this->mReferencesErrors[] =
+ $this->error( 'cite_error_references_no_key' );
+ } elseif ( !isset( $this->mRefs[$group][$key] ) ) {
+ # Called with name attribute not defined in text.
+ $this->mReferencesErrors[] =
+ $this->error( 'cite_error_references_missing_key', $key );
+ } else {
+ # Assign the text to corresponding ref
+ $this->mRefs[$group][$key]['text'] = $str;
+ }
+ } else {
+ # <ref> called in <references> has no content.
+ $this->mReferencesErrors[] =
+ $this->error( 'cite_error_empty_references_define', $key );
+ }
+ return '';
+ }
+
+ if ( $str === '' ) {
+ # <ref ...></ref>. This construct is invalid if
+ # it's a contentful ref, but OK if it's a named duplicate and should
+ # be equivalent <ref ... />, for compatability with #tag.
+ if ( $key == false ) {
+ $this->mRefCallStack[] = false;
+ return $this->error( 'cite_error_ref_no_input' );
+ } else {
+ $str = null;
+ }
+ }
+
+ if ( $key === false ) {
+ # TODO: Comment this case; what does this condition mean?
+ $this->mRefCallStack[] = false;
+ return $this->error( 'cite_error_ref_too_many_keys' );
+ }
+
+ if ( $str === null && $key === null ) {
+ # Something like <ref />; this makes no sense.
+ $this->mRefCallStack[] = false;
+ return $this->error( 'cite_error_ref_no_key' );
+ }
+
+ if ( preg_match( '/^[0-9]+$/', $key ) || preg_match( '/^[0-9]+$/', $follow ) ) {
+ # Numeric names mess up the resulting id's, potentially produ-
+ # cing duplicate id's in the XHTML. The Right Thing To Do
+ # would be to mangle them, but it's not really high-priority
+ # (and would produce weird id's anyway).
+
+ $this->mRefCallStack[] = false;
+ return $this->error( 'cite_error_ref_numeric_key' );
+ }
+
+ if ( preg_match(
+ '/<ref\b[^<]*?>/',
+ preg_replace( '#<([^ ]+?).*?>.*?</\\1 *>|<!--.*?-->#', '', $str )
+ ) ) {
+ # (bug 6199) This most likely implies that someone left off the
+ # closing </ref> tag, which will cause the entire article to be
+ # eaten up until the next <ref>. So we bail out early instead.
+ # The fancy regex above first tries chopping out anything that
+ # looks like a comment or SGML tag, which is a crude way to avoid
+ # false alarms for <nowiki>, <pre>, etc.
+ #
+ # Possible improvement: print the warning, followed by the contents
+ # of the <ref> tag. This way no part of the article will be eaten
+ # even temporarily.
+
+ $this->mRefCallStack[] = false;
+ return $this->error( 'cite_error_included_ref' );
+ }
+
+ if ( is_string( $key ) || is_string( $str ) ) {
+ # We don't care about the content: if the key exists, the ref
+ # is presumptively valid. Either it stores a new ref, or re-
+ # fers to an existing one. If it refers to a nonexistent ref,
+ # we'll figure that out later. Likewise it's definitely valid
+ # if there's any content, regardless of key.
+
+ return $this->stack( $str, $key, $group, $follow, $argv );
+ }
+
+ # Not clear how we could get here, but something is probably
+ # wrong with the types. Let's fail fast.
+ $this->croak( 'cite_error_key_str_invalid', serialize( "$str; $key" ) );
+ }
+
+ /**
+ * Parse the arguments to the <ref> tag
+ *
+ * "name" : Key of the reference.
+ * "group" : Group to which it belongs. Needs to be passed to <references /> too.
+ * "follow" : If the current reference is the continuation of another, key of that reference.
+ *
+ *
+ * @param $argv array The argument vector
+ * @return mixed false on invalid input, a string on valid
+ * input and null on no input
+ */
+ function refArg( $argv ) {
+ global $wgAllowCiteGroups;
+ $cnt = count( $argv );
+ $group = null;
+ $key = null;
+ $follow = null;
+
+ if ( $cnt > 2 ) {
+ // There should only be one key or follow parameter, and one group parameter
+ // FIXME : this looks inconsistent, it should probably return a tuple
+ return false;
+ } elseif ( $cnt >= 1 ) {
+ if ( isset( $argv['name'] ) && isset( $argv['follow'] ) ) {
+ return array( false, false, false );
+ }
+ if ( isset( $argv['name'] ) ) {
+ // Key given.
+ $key = Sanitizer::escapeId( $argv['name'], 'noninitial' );
+ unset( $argv['name'] );
+ --$cnt;
+ }
+ if ( isset( $argv['follow'] ) ) {
+ // Follow given.
+ $follow = Sanitizer::escapeId( $argv['follow'], 'noninitial' );
+ unset( $argv['follow'] );
+ --$cnt;
+ }
+ if ( isset( $argv['group'] ) ) {
+ if ( !$wgAllowCiteGroups ) {
+ // remove when groups are fully tested.
+ return array( false );
+ }
+ // Group given.
+ $group = $argv['group'];
+ unset( $argv['group'] );
+ --$cnt;
+ }
+
+ if ( $cnt == 0 ) {
+ return array ( $key, $group, $follow );
+ } else {
+ // Invalid key
+ return array( false, false, false );
+ }
+ } else {
+ // No key
+ return array( null, $group, false );
+ }
+ }
+
+ /**
+ * Populate $this->mRefs based on input and arguments to <ref>
+ *
+ * @param $str string Input from the <ref> tag
+ * @param $key mixed Argument to the <ref> tag as returned by $this->refArg()
+ * @param $group
+ * @param $follow
+ * @param $call
+ *
+ * @return string
+ */
+ function stack( $str, $key = null, $group, $follow, $call ) {
+ if ( !isset( $this->mRefs[$group] ) ) {
+ $this->mRefs[$group] = array();
+ }
+ if ( !isset( $this->mGroupCnt[$group] ) ) {
+ $this->mGroupCnt[$group] = 0;
+ }
+
+ if ( $follow != null ) {
+ if ( isset( $this->mRefs[$group][$follow] ) && is_array( $this->mRefs[$group][$follow] ) ) {
+ // add text to the note that is being followed
+ $this->mRefs[$group][$follow]['text'] = $this->mRefs[$group][$follow]['text'] . ' ' . $str;
+ } else {
+ // insert part of note at the beginning of the group
+ for ( $k = 0 ; $k < count( $this->mRefs[$group] ) ; $k++ ) {
+ if ( $this->mRefs[$group][$k]['follow'] == null ) {
+ break;
+ }
+ }
+ array_splice( $this->mRefs[$group], $k, 0,
+ array( array( 'count' => - 1,
+ 'text' => $str,
+ 'key' => ++$this->mOutCnt ,
+ 'follow' => $follow ) ) );
+ array_splice( $this->mRefCallStack, $k, 0,
+ array( array( 'new', $call, $str, $key, $group, $this->mOutCnt ) ) );
+ }
+ // return an empty string : this is not a reference
+ return '';
+ }
+ if ( $key === null ) {
+ // No key
+ // $this->mRefs[$group][] = $str;
+ $this->mRefs[$group][] = array( 'count' => - 1, 'text' => $str, 'key' => ++$this->mOutCnt );
+ $this->mRefCallStack[] = array( 'new', $call, $str, $key, $group, $this->mOutCnt );
+
+ return $this->linkRef( $group, $this->mOutCnt );
+ } elseif ( is_string( $key ) ) {
+ // Valid key
+ if ( !isset( $this->mRefs[$group][$key] ) || !is_array( $this->mRefs[$group][$key] ) ) {
+ // First occurrence
+ $this->mRefs[$group][$key] = array(
+ 'text' => $str,
+ 'count' => 0,
+ 'key' => ++$this->mOutCnt,
+ 'number' => ++$this->mGroupCnt[$group]
+ );
+ $this->mRefCallStack[] = array( 'new', $call, $str, $key, $group, $this->mOutCnt );
+
+ return
+ $this->linkRef(
+ $group,
+ $key,
+ $this->mRefs[$group][$key]['key'] . "-" . $this->mRefs[$group][$key]['count'],
+ $this->mRefs[$group][$key]['number'],
+ "-" . $this->mRefs[$group][$key]['key']
+ );
+ } else {
+ // We've been here before
+ if ( $this->mRefs[$group][$key]['text'] === null && $str !== '' ) {
+ // If no text found before, use this text
+ $this->mRefs[$group][$key]['text'] = $str;
+ $this->mRefCallStack[] = array( 'assign', $call, $str, $key, $group,
+ $this->mRefs[$group][$key]['key'] );
+ } else {
+ $this->mRefCallStack[] = array( 'increment', $call, $str, $key, $group,
+ $this->mRefs[$group][$key]['key'] );
+ }
+ return
+ $this->linkRef(
+ $group,
+ $key,
+ $this->mRefs[$group][$key]['key'] . "-" . ++$this->mRefs[$group][$key]['count'],
+ $this->mRefs[$group][$key]['number'],
+ "-" . $this->mRefs[$group][$key]['key']
+ );
+ }
+ } else {
+ $this->croak( 'cite_error_stack_invalid_input', serialize( array( $key, $str ) ) );
+ }
+ }
+
+ /**
+ * Partially undoes the effect of calls to stack()
+ *
+ * Called by guardedReferences()
+ *
+ * The option to define <ref> within <references> makes the
+ * behavior of <ref> context dependent. This is normally fine
+ * but certain operations (especially #tag) lead to out-of-order
+ * parser evaluation with the <ref> tags being processed before
+ * their containing <reference> element is read. This leads to
+ * stack corruption that this function works to fix.
+ *
+ * This function is not a total rollback since some internal
+ * counters remain incremented. Doing so prevents accidentally
+ * corrupting certain links.
+ *
+ * @param $type
+ * @param $key
+ * @param $group
+ * @param $index
+ */
+ function rollbackRef( $type, $key, $group, $index ) {
+ if ( !isset( $this->mRefs[$group] ) ) {
+ return;
+ }
+
+ if ( $key === null ) {
+ foreach ( $this->mRefs[$group] as $k => $v ) {
+ if ( $this->mRefs[$group][$k]['key'] === $index ) {
+ $key = $k;
+ break;
+ }
+ }
+ }
+
+ # Sanity checks that specified element exists.
+ if ( $key === null ) {
+ return;
+ }
+ if ( !isset( $this->mRefs[$group][$key] ) ) {
+ return;
+ }
+ if ( $this->mRefs[$group][$key]['key'] != $index ) {
+ return;
+ }
+
+ switch ( $type ) {
+ case 'new':
+ # Rollback the addition of new elements to the stack.
+ unset( $this->mRefs[$group][$key] );
+ if ( count( $this->mRefs[$group] ) == 0 ) {
+ unset( $this->mRefs[$group] );
+ unset( $this->mGroupCnt[$group] );
+ }
+ break;
+ case 'assign':
+ # Rollback assignment of text to pre-existing elements.
+ $this->mRefs[$group][$key]['text'] = null;
+ # continue without break
+ case 'increment':
+ # Rollback increase in named ref occurrences.
+ $this->mRefs[$group][$key]['count']--;
+ break;
+ }
+ }
+
+ /**
+ * Callback function for <references>
+ *
+ * @param $str string Input
+ * @param $argv array Arguments
+ * @param $parser Parser
+ *
+ * @return string
+ */
+ function references( $str, $argv, $parser ) {
+ if ( $this->mInCite || $this->mInReferences ) {
+ if ( is_null( $str ) ) {
+ return htmlspecialchars( "<references/>" );
+ } else {
+ return htmlspecialchars( "<references>$str</references>" );
+ }
+ } else {
+ $this->mCallCnt++;
+ $this->mInReferences = true;
+ $ret = $this->guardedReferences( $str, $argv, $parser );
+ $this->mInReferences = false;
+ return $ret;
+ }
+ }
+
+ /**
+ * @param $str string
+ * @param $argv array
+ * @param $parser Parser
+ * @param $group string
+ * @return string
+ */
+ function guardedReferences( $str, $argv, $parser, $group = CITE_DEFAULT_GROUP ) {
+ global $wgAllowCiteGroups;
+
+ $this->mParser = $parser;
+
+ if ( isset( $argv['group'] ) && $wgAllowCiteGroups ) {
+ $group = $argv['group'];
+ unset ( $argv['group'] );
+ }
+
+ if ( strval( $str ) !== '' ) {
+ $this->mReferencesGroup = $group;
+
+ # Detect whether we were sent already rendered <ref>s
+ # Mostly a side effect of using #tag to call references
+ $count = substr_count( $str, $parser->uniqPrefix() . "-ref-" );
+ for ( $i = 1; $i <= $count; $i++ ) {
+ if ( count( $this->mRefCallStack ) < 1 ) {
+ break;
+ }
+
+ # The following assumes that the parsed <ref>s sent within
+ # the <references> block were the most recent calls to
+ # <ref>. This assumption is true for all known use cases,
+ # but not strictly enforced by the parser. It is possible
+ # that some unusual combination of #tag, <references> and
+ # conditional parser functions could be created that would
+ # lead to malformed references here.
+ $call = array_pop( $this->mRefCallStack );
+ if ( $call !== false ) {
+ list( $type, $ref_argv, $ref_str,
+ $ref_key, $ref_group, $ref_index ) = $call;
+
+ # Undo effects of calling <ref> while unaware of containing <references>
+ $this->rollbackRef( $type, $ref_key, $ref_group, $ref_index );
+
+ # Rerun <ref> call now that mInReferences is set.
+ $this->guardedRef( $ref_str, $ref_argv, $parser );
+ }
+ }
+
+ # Parse $str to process any unparsed <ref> tags.
+ $parser->recursiveTagParse( $str );
+
+ # Reset call stack
+ $this->mRefCallStack = array();
+ }
+
+ if ( count( $argv ) && $wgAllowCiteGroups ) {
+ return $this->error( 'cite_error_references_invalid_parameters_group' );
+ } elseif ( count( $argv ) ) {
+ return $this->error( 'cite_error_references_invalid_parameters' );
+ } else {
+ $s = $this->referencesFormat( $group );
+ if ( $parser->getOptions()->getIsSectionPreview() ) {
+ return $s;
+ }
+
+ # Append errors generated while processing <references>
+ if ( count( $this->mReferencesErrors ) > 0 ) {
+ $s .= "\n" . implode( "<br />\n", $this->mReferencesErrors );
+ $this->mReferencesErrors = array();
+ }
+ return $s;
+ }
+ }
+
+ /**
+ * Make output to be returned from the references() function
+ *
+ * @param $group
+ *
+ * @return string XHTML ready for output
+ */
+ function referencesFormat( $group ) {
+ if ( ( count( $this->mRefs ) == 0 ) || ( empty( $this->mRefs[$group] ) ) ) {
+ return '';
+ }
+
+ wfProfileIn( __METHOD__ );
+ wfProfileIn( __METHOD__ . '-entries' );
+ $ent = array();
+ foreach ( $this->mRefs[$group] as $k => $v ) {
+ $ent[] = $this->referencesFormatEntry( $k, $v );
+ }
+
+ $prefix = wfMessage( 'cite_references_prefix' )->inContentLanguage()->plain();
+ $suffix = wfMessage( 'cite_references_suffix' )->inContentLanguage()->plain();
+ $content = implode( "\n", $ent );
+
+ // Prepare the parser input. We add new lines between the pieces to avoid a confused tidy (bug 13073)
+ $parserInput = $prefix . "\n" . $content . "\n" . $suffix;
+
+ // Let's try to cache it.
+ global $wgMemc;
+ $cacheKey = wfMemcKey( 'citeref', md5( $parserInput ), $this->mParser->Title()->getArticleID() );
+
+ wfProfileOut( __METHOD__ . '-entries' );
+
+ global $wgCiteCacheReferences;
+ $data = false;
+ if ( $wgCiteCacheReferences ) {
+ wfProfileIn( __METHOD__ . '-cache-get' );
+ $data = $wgMemc->get( $cacheKey );
+ wfProfileOut( __METHOD__ . '-cache-get' );
+ }
+
+ if ( !$data || !$this->mParser->isValidHalfParsedText( $data ) ) {
+ wfProfileIn( __METHOD__ . '-parse' );
+
+ // Live hack: parse() adds two newlines on WM, can't reproduce it locally -ævar
+ $ret = rtrim( $this->parse( $parserInput ), "\n" );
+
+ if ( $wgCiteCacheReferences ) {
+ $serData = $this->mParser->serializeHalfParsedText( $ret );
+ $wgMemc->set( $cacheKey, $serData, 86400 );
+ }
+
+ wfProfileOut( __METHOD__ . '-parse' );
+ } else {
+ $ret = $this->mParser->unserializeHalfParsedText( $data );
+ }
+
+ wfProfileOut( __METHOD__ );
+
+ // done, clean up so we can reuse the group
+ unset( $this->mRefs[$group] );
+ unset( $this->mGroupCnt[$group] );
+
+ return $ret;
+ }
+
+ /**
+ * Format a single entry for the referencesFormat() function
+ *
+ * @param string $key The key of the reference
+ * @param mixed $val The value of the reference, string for anonymous
+ * references, array for user-suppplied
+ * @return string Wikitext
+ */
+ function referencesFormatEntry( $key, $val ) {
+ // Anonymous reference
+ if ( !is_array( $val ) ) {
+ return wfMessage(
+ 'cite_references_link_one',
+ $this->referencesKey( $key ),
+ $this->refKey( $key ),
+ $this->referenceText( $key, $val )
+ )->inContentLanguage()->plain();
+ }
+ $text = $this->referenceText( $key, $val['text'] );
+ if ( isset( $val['follow'] ) ) {
+ return wfMessage(
+ 'cite_references_no_link',
+ $this->referencesKey( $val['follow'] ),
+ $text
+ )->inContentLanguage()->plain();
+ } elseif ( $val['text'] == '' ) {
+ return wfMessage(
+ 'cite_references_link_one',
+ $this->referencesKey( $key ),
+ $this->refKey( $key, $val['count'] ),
+ $text
+ )->inContentLanguage()->plain();
+ }
+
+ if ( $val['count'] < 0 ) {
+ return wfMessage(
+ 'cite_references_link_one',
+ $this->referencesKey( $val['key'] ),
+ # $this->refKey( $val['key'], $val['count'] ),
+ $this->refKey( $val['key'] ),
+ $text
+ )->inContentLanguage()->plain();
+ // Standalone named reference, I want to format this like an
+ // anonymous reference because displaying "1. 1.1 Ref text" is
+ // overkill and users frequently use named references when they
+ // don't need them for convenience
+ } elseif ( $val['count'] === 0 ) {
+ return wfMessage(
+ 'cite_references_link_one',
+ $this->referencesKey( $key . "-" . $val['key'] ),
+ # $this->refKey( $key, $val['count'] ),
+ $this->refKey( $key, $val['key'] . "-" . $val['count'] ),
+ $text
+ )->inContentLanguage()->plain();
+ // Named references with >1 occurrences
+ } else {
+ $links = array();
+ // for group handling, we have an extra key here.
+ for ( $i = 0; $i <= $val['count']; ++$i ) {
+ $links[] = wfMessage(
+ 'cite_references_link_many_format',
+ $this->refKey( $key, $val['key'] . "-$i" ),
+ $this->referencesFormatEntryNumericBacklinkLabel( $val['number'], $i, $val['count'] ),
+ $this->referencesFormatEntryAlternateBacklinkLabel( $i )
+ )->inContentLanguage()->plain();
+ }
+
+ $list = $this->listToText( $links );
+
+ return wfMessage( 'cite_references_link_many',
+ $this->referencesKey( $key . "-" . $val['key'] ),
+ $list,
+ $text
+ )->inContentLanguage()->plain();
+ }
+ }
+
+ /**
+ * Returns formatted reference text
+ * @param String $key
+ * @param String $text
+ * @return String
+ */
+ function referenceText( $key, $text ) {
+ if ( $text == '' ) {
+ return $this->error( 'cite_error_references_no_text', $key, 'noparse' );
+ }
+ return '<span class="reference-text">' . rtrim( $text, "\n" ) . "</span>\n";
+ }
+
+ /**
+ * Generate a numeric backlink given a base number and an
+ * offset, e.g. $base = 1, $offset = 2; = 1.2
+ * Since bug #5525, it correctly does 1.9 -> 1.10 as well as 1.099 -> 1.100
+ *
+ * @static
+ *
+ * @param int $base The base
+ * @param int $offset The offset
+ * @param int $max Maximum value expected.
+ * @return string
+ */
+ function referencesFormatEntryNumericBacklinkLabel( $base, $offset, $max ) {
+ global $wgContLang;
+ $scope = strlen( $max );
+ $ret = $wgContLang->formatNum(
+ sprintf( "%s.%0{$scope}s", $base, $offset )
+ );
+ return $ret;
+ }
+
+ /**
+ * Generate a custom format backlink given an offset, e.g.
+ * $offset = 2; = c if $this->mBacklinkLabels = array( 'a',
+ * 'b', 'c', ...). Return an error if the offset > the # of
+ * array items
+ *
+ * @param int $offset The offset
+ *
+ * @return string
+ */
+ function referencesFormatEntryAlternateBacklinkLabel( $offset ) {
+ if ( !isset( $this->mBacklinkLabels ) ) {
+ $this->genBacklinkLabels();
+ }
+ if ( isset( $this->mBacklinkLabels[$offset] ) ) {
+ return $this->mBacklinkLabels[$offset];
+ } else {
+ // Feed me!
+ return $this->error( 'cite_error_references_no_backlink_label', null, 'noparse' );
+ }
+ }
+
+ /**
+ * Generate a custom format link for a group given an offset, e.g.
+ * the second <ref group="foo"> is b if $this->mLinkLabels["foo"] =
+ * array( 'a', 'b', 'c', ...).
+ * Return an error if the offset > the # of array items
+ *
+ * @param int $offset The offset
+ * @param string $group The group name
+ * @param string $label The text to use if there's no message for them.
+ *
+ * @return string
+ */
+ function getLinkLabel( $offset, $group, $label ) {
+ $message = "cite_link_label_group-$group";
+ if ( !isset( $this->mLinkLabels[$group] ) ) {
+ $this->genLinkLabels( $group, $message );
+ }
+ if ( $this->mLinkLabels[$group] === false ) {
+ // Use normal representation, ie. "$group 1", "$group 2"...
+ return $label;
+ }
+
+ if ( isset( $this->mLinkLabels[$group][$offset - 1] ) ) {
+ return $this->mLinkLabels[$group][$offset - 1];
+ } else {
+ // Feed me!
+ return $this->error( 'cite_error_no_link_label_group', array( $group, $message ), 'noparse' );
+ }
+ }
+
+ /**
+ * Return an id for use in wikitext output based on a key and
+ * optionally the number of it, used in <references>, not <ref>
+ * (since otherwise it would link to itself)
+ *
+ * @static
+ *
+ * @param string $key The key
+ * @param int $num The number of the key
+ * @return string A key for use in wikitext
+ */
+ function refKey( $key, $num = null ) {
+ $prefix = wfMessage( 'cite_reference_link_prefix' )->inContentLanguage()->text();
+ $suffix = wfMessage( 'cite_reference_link_suffix' )->inContentLanguage()->text();
+ if ( isset( $num ) ) {
+ $key = wfMessage( 'cite_reference_link_key_with_num', $key, $num )
+ ->inContentLanguage()->plain();
+ }
+
+ return "$prefix$key$suffix";
+ }
+
+ /**
+ * Return an id for use in wikitext output based on a key and
+ * optionally the number of it, used in <ref>, not <references>
+ * (since otherwise it would link to itself)
+ *
+ * @static
+ *
+ * @param string $key The key
+ * @param int $num The number of the key
+ * @return string A key for use in wikitext
+ */
+ function referencesKey( $key, $num = null ) {
+ $prefix = wfMessage( 'cite_references_link_prefix' )->inContentLanguage()->text();
+ $suffix = wfMessage( 'cite_references_link_suffix' )->inContentLanguage()->text();
+ if ( isset( $num ) ) {
+ $key = wfMessage( 'cite_reference_link_key_with_num', $key, $num )
+ ->inContentLanguage()->plain();
+ }
+
+ return "$prefix$key$suffix";
+ }
+
+ /**
+ * Generate a link (<sup ...) for the <ref> element from a key
+ * and return XHTML ready for output
+ *
+ * @param $group
+ * @param $key string The key for the link
+ * @param $count int The index of the key, used for distinguishing
+ * multiple occurrences of the same key
+ * @param $label int The label to use for the link, I want to
+ * use the same label for all occourances of
+ * the same named reference.
+ * @param $subkey string
+ *
+ * @return string
+ */
+ function linkRef( $group, $key, $count = null, $label = null, $subkey = '' ) {
+ global $wgContLang;
+ $label = is_null( $label ) ? ++$this->mGroupCnt[$group] : $label;
+
+ return
+ $this->parse(
+ wfMessage(
+ 'cite_reference_link',
+ $this->refKey( $key, $count ),
+ $this->referencesKey( $key . $subkey ),
+ $this->getLinkLabel( $label, $group,
+ ( ( $group == CITE_DEFAULT_GROUP ) ? '' : "$group " ) . $wgContLang->formatNum( $label ) )
+ )->inContentLanguage()->plain()
+ );
+ }
+
+ /**
+ * This does approximately the same thing as
+ * Language::listToText() but due to this being used for a
+ * slightly different purpose (people might not want , as the
+ * first separator and not 'and' as the second, and this has to
+ * use messages from the content language) I'm rolling my own.
+ *
+ * @static
+ *
+ * @param array $arr The array to format
+ * @return string
+ */
+ function listToText( $arr ) {
+ $cnt = count( $arr );
+
+ $sep = wfMessage( 'cite_references_link_many_sep' )->inContentLanguage()->plain();
+ $and = wfMessage( 'cite_references_link_many_and' )->inContentLanguage()->plain();
+
+ if ( $cnt == 1 ) {
+ // Enforce always returning a string
+ return (string)$arr[0];
+ } else {
+ $t = array_slice( $arr, 0, $cnt - 1 );
+ return implode( $sep, $t ) . $and . $arr[$cnt - 1];
+ }
+ }
+
+ /**
+ * Parse a given fragment and fix up Tidy's trail of blood on
+ * it...
+ *
+ * @param string $in The text to parse
+ * @return string The parsed text
+ */
+ function parse( $in ) {
+ if ( method_exists( $this->mParser, 'recursiveTagParse' ) ) {
+ // New fast method
+ return $this->mParser->recursiveTagParse( $in );
+ } else {
+ // Old method
+ $ret = $this->mParser->parse(
+ $in,
+ $this->mParser->mTitle,
+ $this->mParser->mOptions,
+ // Avoid whitespace buildup
+ false,
+ // Important, otherwise $this->clearState()
+ // would get run every time <ref> or
+ // <references> is called, fucking the whole
+ // thing up.
+ false
+ );
+ $text = $ret->getText();
+
+ return $this->fixTidy( $text );
+ }
+ }
+
+ /**
+ * Tidy treats all input as a block, it will e.g. wrap most
+ * input in <p> if it isn't already, fix that and return the fixed text
+ *
+ * @static
+ *
+ * @param string $text The text to fix
+ * @return string The fixed text
+ */
+ function fixTidy( $text ) {
+ global $wgUseTidy;
+
+ if ( !$wgUseTidy ) {
+ return $text;
+ } else {
+ $text = preg_replace( '~^<p>\s*~', '', $text );
+ $text = preg_replace( '~\s*</p>\s*~', '', $text );
+ $text = preg_replace( '~\n$~', '', $text );
+
+ return $text;
+ }
+ }
+
+ /**
+ * Generate the labels to pass to the
+ * 'cite_references_link_many_format' message, the format is an
+ * arbitrary number of tokens separated by [\t\n ]
+ */
+ function genBacklinkLabels() {
+ wfProfileIn( __METHOD__ );
+ $text = wfMessage( 'cite_references_link_many_format_backlink_labels' )
+ ->inContentLanguage()->plain();
+ $this->mBacklinkLabels = preg_split( '#[\n\t ]#', $text );
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Generate the labels to pass to the
+ * 'cite_reference_link' message instead of numbers, the format is an
+ * arbitrary number of tokens separated by [\t\n ]
+ *
+ * @param $group
+ * @param $message
+ */
+ function genLinkLabels( $group, $message ) {
+ wfProfileIn( __METHOD__ );
+ $text = false;
+ $msg = wfMessage( $message )->inContentLanguage();
+ if ( $msg->exists() ) {
+ $text = $msg->plain();
+ }
+ $this->mLinkLabels[$group] = ( $text == '' ) ? false : preg_split( '#[\n\t ]#', $text );
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Gets run when Parser::clearState() gets run, since we don't
+ * want the counts to transcend pages and other instances
+ *
+ * @param $parser Parser
+ *
+ * @return bool
+ */
+ function clearState( &$parser ) {
+ if ( $parser->extCite !== $this ) {
+ return $parser->extCite->clearState( $parser );
+ }
+
+ # Don't clear state when we're in the middle of parsing
+ # a <ref> tag
+ if ( $this->mInCite || $this->mInReferences ) {
+ return true;
+ }
+
+ $this->mGroupCnt = array();
+ $this->mOutCnt = 0;
+ $this->mCallCnt = 0;
+ $this->mRefs = array();
+ $this->mReferencesErrors = array();
+ $this->mRefCallStack = array();
+
+ return true;
+ }
+
+ /**
+ * Gets run when the parser is cloned.
+ *
+ * @param $parser Parser
+ *
+ * @return bool
+ */
+ function cloneState( $parser ) {
+ if ( $parser->extCite !== $this ) {
+ return $parser->extCite->cloneState( $parser );
+ }
+
+ $parser->extCite = clone $this;
+ $parser->setHook( 'ref' , array( $parser->extCite, 'ref' ) );
+ $parser->setHook( 'references' , array( $parser->extCite, 'references' ) );
+
+ // Clear the state, making sure it will actually work.
+ $parser->extCite->mInCite = false;
+ $parser->extCite->mInReferences = false;
+ $parser->extCite->clearState( $parser );
+
+ return true;
+ }
+
+ /**
+ * Called at the end of page processing to append an error if refs were
+ * used without a references tag.
+ *
+ * @param $afterParse bool true if called from the ParserAfterParse hook
+ * @param $parser Parser
+ * @param $text string
+ *
+ * @return bool
+ */
+ function checkRefsNoReferences( $afterParse, &$parser, &$text ) {
+ if ( $parser->extCite !== $this ) {
+ return $parser->extCite->checkRefsNoReferences( $afterParse, $parser, $text );
+ }
+
+ if ( $afterParse ) {
+ $this->mHaveAfterParse = true;
+ } elseif ( $this->mHaveAfterParse ) {
+ return true;
+ }
+
+ if ( $parser->getOptions()->getIsSectionPreview() ) {
+ return true;
+ }
+
+ foreach ( $this->mRefs as $group => $refs ) {
+ if ( count( $refs ) == 0 ) {
+ continue;
+ }
+ $text .= "\n<br />";
+ if ( $group == CITE_DEFAULT_GROUP ) {
+ $text .= $this->error( 'cite_error_refs_without_references' );
+ } else {
+ $text .= $this->error( 'cite_error_group_refs_without_references', htmlspecialchars( $group ) );
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Hook for the InlineEditor extension. If any ref or reference reference tag is in the text, the entire
+ * page should be reparsed, so we return false in that case.
+ *
+ * @param $output
+ *
+ * @return bool
+ */
+ function checkAnyCalls( &$output ) {
+ global $wgParser;
+ /* InlineEditor always uses $wgParser */
+ return ( $wgParser->extCite->mCallCnt <= 0 );
+ }
+
+ /**
+ * Initialize the parser hooks
+ *
+ * @param $parser Parser
+ *
+ * @return bool
+ */
+ static function setHooks( $parser ) {
+ global $wgHooks;
+
+ $parser->extCite = new self();
+
+ if ( !Cite::$hooksInstalled ) {
+ $wgHooks['ParserClearState'][] = array( $parser->extCite, 'clearState' );
+ $wgHooks['ParserCloned'][] = array( $parser->extCite, 'cloneState' );
+ $wgHooks['ParserAfterParse'][] = array( $parser->extCite, 'checkRefsNoReferences', true );
+ $wgHooks['ParserBeforeTidy'][] = array( $parser->extCite, 'checkRefsNoReferences', false );
+ $wgHooks['InlineEditorPartialAfterParse'][] = array( $parser->extCite, 'checkAnyCalls' );
+ Cite::$hooksInstalled = true;
+ }
+ $parser->setHook( 'ref' , array( $parser->extCite, 'ref' ) );
+ $parser->setHook( 'references' , array( $parser->extCite, 'references' ) );
+
+ return true;
+ }
+
+ /**
+ * Return an error message based on an error ID
+ *
+ * @param string $key Message name for the error
+ * @param string $param Parameter to pass to the message
+ * @param string $parse Whether to parse the message ('parse') or not ('noparse')
+ * @return string XHTML or wikitext ready for output
+ */
+ function error( $key, $param = null, $parse = 'parse' ) {
+ # We rely on the fact that PHP is okay with passing unused argu-
+ # ments to functions. If $1 is not used in the message, wfMessage will
+ # just ignore the extra parameter.
+ $ret = '<strong class="error">' .
+ wfMessage( 'cite_error', wfMessage( $key, $param )->plain() )->plain() .
+ '</strong>';
+ if ( $parse == 'parse' ) {
+ $ret = $this->parse( $ret );
+ }
+ return $ret;
+ }
+
+ /**
+ * Die with a backtrace if something happens in the code which
+ * shouldn't have
+ *
+ * @param int $error ID for the error
+ * @param string $data Serialized error data
+ */
+ function croak( $error, $data ) {
+ wfDebugDieBacktrace( wfMessage( 'cite_croak', $this->error( $error ), $data )
+ ->inContentLanguage()->text() );
+ }
+
+ /**#@-*/
+}
diff --git a/extensions/Cite/SpecialCite.alias.php b/extensions/Cite/SpecialCite.alias.php
new file mode 100644
index 00000000..6b64b1d0
--- /dev/null
+++ b/extensions/Cite/SpecialCite.alias.php
@@ -0,0 +1,409 @@
+<?php
+/**
+ * Aliases for Special:Cite
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$specialPageAliases = array();
+
+/** English (English) */
+$specialPageAliases['en'] = array(
+ 'Cite' => array( 'Cite' ),
+);
+
+/** Arabic (العربية) */
+$specialPageAliases['ar'] = array(
+ 'Cite' => array( 'استشهاد' ),
+);
+
+/** Egyptian Spoken Arabic (مصرى) */
+$specialPageAliases['arz'] = array(
+ 'Cite' => array( 'استشهاد' ),
+);
+
+/** Assamese (অসমীয়া) */
+$specialPageAliases['as'] = array(
+ 'Cite' => array( 'উদà§à¦§à§ƒà¦¤à¦¿' ),
+);
+
+/** Bikol Central (Bikol Central) */
+$specialPageAliases['bcl'] = array(
+ 'Cite' => array( 'Sambitón' ),
+);
+
+/** Bulgarian (българÑки) */
+$specialPageAliases['bg'] = array(
+ 'Cite' => array( 'Цитиране' ),
+);
+
+/** Banjar (Bahasa Banjar) */
+$specialPageAliases['bjn'] = array(
+ 'Cite' => array( 'Juhut' ),
+);
+
+/** Breton (brezhoneg) */
+$specialPageAliases['br'] = array(
+ 'Cite' => array( 'Menegiñ' ),
+);
+
+/** Bosnian (bosanski) */
+$specialPageAliases['bs'] = array(
+ 'Cite' => array( 'Citiraj' ),
+);
+
+/** бурÑад (бурÑад) */
+$specialPageAliases['bxr'] = array(
+ 'Cite' => array( 'Сайт' ),
+);
+
+/** Catalan (català) */
+$specialPageAliases['ca'] = array(
+ 'Cite' => array( 'Citau', 'Citeu' ),
+);
+
+/** Czech (Äesky) */
+$specialPageAliases['cs'] = array(
+ 'Cite' => array( 'Citovat' ),
+);
+
+/** Danish (dansk) */
+$specialPageAliases['da'] = array(
+ 'Cite' => array( 'Citer' ),
+);
+
+/** German (Deutsch) */
+$specialPageAliases['de'] = array(
+ 'Cite' => array( 'Zitierhilfe', 'Zitieren' ),
+);
+
+/** Zazaki (Zazaki) */
+$specialPageAliases['diq'] = array(
+ 'Cite' => array( 'Sita' ),
+);
+
+/** Lower Sorbian (dolnoserbski) */
+$specialPageAliases['dsb'] = array(
+ 'Cite' => array( 'Citěrowańska_pomoc' ),
+);
+
+/** Greek (Ελληνικά) */
+$specialPageAliases['el'] = array(
+ 'Cite' => array( 'ΠαÏαπομπή' ),
+);
+
+/** Esperanto (Esperanto) */
+$specialPageAliases['eo'] = array(
+ 'Cite' => array( 'Citi' ),
+);
+
+/** Spanish (español) */
+$specialPageAliases['es'] = array(
+ 'Cite' => array( 'Citar' ),
+);
+
+/** Estonian (eesti) */
+$specialPageAliases['et'] = array(
+ 'Cite' => array( 'Tsiteerimine' ),
+);
+
+/** Persian (Ùارسی) */
+$specialPageAliases['fa'] = array(
+ 'Cite' => array( 'یادکرد' ),
+);
+
+/** Finnish (suomi) */
+$specialPageAliases['fi'] = array(
+ 'Cite' => array( 'Viittaus' ),
+);
+
+/** French (français) */
+$specialPageAliases['fr'] = array(
+ 'Cite' => array( 'Citer' ),
+);
+
+/** Franco-Provençal (arpetan) */
+$specialPageAliases['frp'] = array(
+ 'Cite' => array( 'Citar' ),
+);
+
+/** Galician (galego) */
+$specialPageAliases['gl'] = array(
+ 'Cite' => array( 'Cita', 'Citar' ),
+);
+
+/** Swiss German (Alemannisch) */
+$specialPageAliases['gsw'] = array(
+ 'Cite' => array( 'Zitierhilf' ),
+);
+
+/** Hebrew (עברית) */
+$specialPageAliases['he'] = array(
+ 'Cite' => array( 'ציטוט' ),
+);
+
+/** Croatian (hrvatski) */
+$specialPageAliases['hr'] = array(
+ 'Cite' => array( 'Citiraj' ),
+);
+
+/** Upper Sorbian (hornjoserbsce) */
+$specialPageAliases['hsb'] = array(
+ 'Cite' => array( 'Citowanska_pomoc' ),
+);
+
+/** 湘语 (湘语) */
+$specialPageAliases['hsn'] = array(
+ 'Cite' => array( '建脚注' ),
+);
+
+/** Haitian (Kreyòl ayisyen) */
+$specialPageAliases['ht'] = array(
+ 'Cite' => array( 'Site' ),
+);
+
+/** Hungarian (magyar) */
+$specialPageAliases['hu'] = array(
+ 'Cite' => array( 'Hivatkozás', 'Irodalomjegyzék' ),
+);
+
+/** Interlingua (interlingua) */
+$specialPageAliases['ia'] = array(
+ 'Cite' => array( 'Citation' ),
+);
+
+/** Indonesian (Bahasa Indonesia) */
+$specialPageAliases['id'] = array(
+ 'Cite' => array( 'Kutip' ),
+);
+
+/** Igbo (Igbo) */
+$specialPageAliases['ig'] = array(
+ 'Cite' => array( 'Dépùtà' ),
+);
+
+/** Ido (Ido) */
+$specialPageAliases['io'] = array(
+ 'Cite' => array( 'Citar' ),
+);
+
+/** Italian (italiano) */
+$specialPageAliases['it'] = array(
+ 'Cite' => array( 'Cita' ),
+);
+
+/** Japanese (日本語) */
+$specialPageAliases['ja'] = array(
+ 'Cite' => array( '引用' ),
+);
+
+/** Korean (한국어) */
+$specialPageAliases['ko'] = array(
+ 'Cite' => array( 'ì¸ìš©' ),
+);
+
+/** Colognian (Ripoarisch) */
+$specialPageAliases['ksh'] = array(
+ 'Cite' => array( 'Zitteere' ),
+);
+
+/** Cornish (kernowek) */
+$specialPageAliases['kw'] = array(
+ 'Cite' => array( 'Devynna' ),
+);
+
+/** Ladino (Ladino) */
+$specialPageAliases['lad'] = array(
+ 'Cite' => array( 'MostrarManaderos' ),
+);
+
+/** Luxembourgish (Lëtzebuergesch) */
+$specialPageAliases['lb'] = array(
+ 'Cite' => array( 'Zitéierhellëf' ),
+);
+
+/** Literary Chinese (文言) */
+$specialPageAliases['lzh'] = array(
+ 'Cite' => array( '引文' ),
+);
+
+/** Macedonian (македонÑки) */
+$specialPageAliases['mk'] = array(
+ 'Cite' => array( 'Ðавод' ),
+);
+
+/** Malayalam (മലയാളം) */
+$specialPageAliases['ml'] = array(
+ 'Cite' => array( 'അവലംബം' ),
+);
+
+/** Marathi (मराठी) */
+$specialPageAliases['mr'] = array(
+ 'Cite' => array( 'संदरà¥à¤­à¤¦à¥à¤¯à¤¾' ),
+);
+
+/** Malay (Bahasa Melayu) */
+$specialPageAliases['ms'] = array(
+ 'Cite' => array( 'Petik' ),
+);
+
+/** Maltese (Malti) */
+$specialPageAliases['mt'] = array(
+ 'Cite' => array( 'IÄ‹Ä‹ita' ),
+);
+
+/** Nahuatl (NÄhuatl) */
+$specialPageAliases['nah'] = array(
+ 'Cite' => array( 'Tlahtoa', 'Citar' ),
+);
+
+/** Norwegian Bokmål (norsk bokmål) */
+$specialPageAliases['nb'] = array(
+ 'Cite' => array( 'Siteringshjelp' ),
+);
+
+/** Low German (Plattdüütsch) */
+$specialPageAliases['nds'] = array(
+ 'Cite' => array( 'Ziteerhelp' ),
+);
+
+/** Low Saxon (Netherlands) (Nedersaksies) */
+$specialPageAliases['nds-nl'] = array(
+ 'Cite' => array( 'Siteerhulpe' ),
+);
+
+/** Dutch (Nederlands) */
+$specialPageAliases['nl'] = array(
+ 'Cite' => array( 'Citeren' ),
+);
+
+/** Norwegian Nynorsk (norsk nynorsk) */
+$specialPageAliases['nn'] = array(
+ 'Cite' => array( 'Siter' ),
+);
+
+/** Occitan (occitan) */
+$specialPageAliases['oc'] = array(
+ 'Cite' => array( 'Citar' ),
+);
+
+/** Polish (polski) */
+$specialPageAliases['pl'] = array(
+ 'Cite' => array( 'Cytuj' ),
+);
+
+/** Pashto (پښتو) */
+$specialPageAliases['ps'] = array(
+ 'Cite' => array( 'درک' ),
+);
+
+/** Portuguese (português) */
+$specialPageAliases['pt'] = array(
+ 'Cite' => array( 'Citar' ),
+);
+
+/** Brazilian Portuguese (português do Brasil) */
+$specialPageAliases['pt-br'] = array(
+ 'Cite' => array( 'Citar' ),
+);
+
+/** Romanian (română) */
+$specialPageAliases['ro'] = array(
+ 'Cite' => array( 'Citează' ),
+);
+
+/** Russian (руÑÑкий) */
+$specialPageAliases['ru'] = array(
+ 'Cite' => array( 'Цитата' ),
+);
+
+/** Sanskrit (संसà¥à¤•à¥ƒà¤¤à¤®à¥) */
+$specialPageAliases['sa'] = array(
+ 'Cite' => array( 'उदà¥à¤§à¥ƒà¤¤' ),
+);
+
+/** Sicilian (sicilianu) */
+$specialPageAliases['scn'] = array(
+ 'Cite' => array( 'Cita' ),
+);
+
+/** Slovak (slovenÄina) */
+$specialPageAliases['sk'] = array(
+ 'Cite' => array( 'Citovať' ),
+);
+
+/** Slovenian (slovenÅ¡Äina) */
+$specialPageAliases['sl'] = array(
+ 'Cite' => array( 'Navedi' ),
+);
+
+/** Albanian (shqip) */
+$specialPageAliases['sq'] = array(
+ 'Cite' => array( 'Citim' ),
+);
+
+/** Swedish (svenska) */
+$specialPageAliases['sv'] = array(
+ 'Cite' => array( 'Citera' ),
+);
+
+/** Swahili (Kiswahili) */
+$specialPageAliases['sw'] = array(
+ 'Cite' => array( 'Taja', 'Hakikisha' ),
+);
+
+/** Tetum (tetun) */
+$specialPageAliases['tet'] = array(
+ 'Cite' => array( 'Sita' ),
+);
+
+/** Thai (ไทย) */
+$specialPageAliases['th'] = array(
+ 'Cite' => array( 'อ้างอิง' ),
+);
+
+/** Tagalog (Tagalog) */
+$specialPageAliases['tl'] = array(
+ 'Cite' => array( 'Sipiin' ),
+);
+
+/** Turkish (Türkçe) */
+$specialPageAliases['tr'] = array(
+ 'Cite' => array( 'KaynakGöster' ),
+);
+
+/** Urdu (اردو) */
+$specialPageAliases['ur'] = array(
+ 'Cite' => array( 'حوالÛ' ),
+);
+
+/** vèneto (vèneto) */
+$specialPageAliases['vec'] = array(
+ 'Cite' => array( 'Cita' ),
+);
+
+/** Vietnamese (Tiếng Việt) */
+$specialPageAliases['vi'] = array(
+ 'Cite' => array( 'Ghi_chú' ),
+);
+
+/** Yiddish (ייִדיש) */
+$specialPageAliases['yi'] = array(
+ 'Cite' => array( 'ציטירן' ),
+);
+
+/** Cantonese (粵語) */
+$specialPageAliases['yue'] = array(
+ 'Cite' => array( '引用' ),
+);
+
+/** Simplified Chinese (中文(简体)‎) */
+$specialPageAliases['zh-hans'] = array(
+ 'Cite' => array( '引用' ),
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎) */
+$specialPageAliases['zh-hant'] = array(
+ 'Cite' => array( '引用' ),
+); \ No newline at end of file
diff --git a/extensions/Cite/SpecialCite.i18n.php b/extensions/Cite/SpecialCite.i18n.php
new file mode 100644
index 00000000..7f847613
--- /dev/null
+++ b/extensions/Cite/SpecialCite.i18n.php
@@ -0,0 +1,6135 @@
+<?php
+/**
+ * Internationalisation file for Cite special page extension.
+ *
+ * @file
+ * @ingroup Extensions
+*/
+
+$messages = array();
+
+$messages['en'] = array(
+ 'cite_article_desc' => 'Adds a [[Special:Cite|citation]] special page and toolbox link',
+ 'cite_article_link' => 'Cite this page',
+ 'tooltip-cite-article' => 'Information on how to cite this page',
+ 'accesskey-cite-article' => '', # Do not translate this
+ 'cite' => 'Cite',
+ 'cite-summary' => '', # Do not translate this
+ 'cite_page' => 'Page:',
+ 'cite_submit' => 'Cite',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliographic details for {{FULLPAGENAME}} ==
+
+* Page name: {{FULLPAGENAME}}
+* Author: {{SITENAME}} contributors
+* Publisher: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Date of last revision: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Date retrieved: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Permanent URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Page Version ID: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Citation styles for {{FULLPAGENAME}} ==
+
+=== [[APA style]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|MLA style]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA style]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicago style]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE style]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook style]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] entry ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+When using the [[LaTeX]] package url (<code>\usepackage{url}</code> somewhere in the preamble) which tends to give much more nicely formatted web addresses, the following may be preferred:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Message documentation (Message documentation)
+ * @author Jon Harald Søby
+ * @author Lloffiwr
+ * @author Shirayuki
+ * @author Siebrand
+ * @author Tgr
+ * @author Umherirrender
+ */
+$messages['qqq'] = array(
+ 'cite_article_desc' => '{{desc|name=Special Cite|url=http://www.mediawiki.org/wiki/Extension:Cite/Special:Cite.php}}',
+ 'cite_article_link' => 'Text of link in toolbox
+
+See also:
+* {{msg-mw|Cite article link}}
+* {{msg-mw|Accesskey-cite-article}}
+* {{msg-mw|Tooltip-cite-article}}',
+ 'tooltip-cite-article' => 'Used as tooltip for the link {{msg-mw|Cite article link}}.
+
+See also:
+* {{msg-mw|Cite article link}}
+* {{msg-mw|Accesskey-cite-article}}
+* {{msg-mw|Tooltip-cite-article}}',
+ 'accesskey-cite-article' => '{{doc-accesskey}}
+See also:
+* {{msg-mw|Cite article link}}
+* {{msg-mw|Accesskey-cite-article}}
+* {{msg-mw|Tooltip-cite-article}}',
+ 'cite' => '{{doc-special|Cite|unlisted=1}}
+{{Identical|Cite}}',
+ 'cite-summary' => '{{notranslate}}',
+ 'cite_page' => '{{Identical|Page}}',
+ 'cite_submit' => '{{Identical|Cite}}',
+);
+
+/** Achinese (Acèh)
+ * @author Si Gam Acèh
+ */
+$messages['ace'] = array(
+ 'cite_article_link' => 'Cok ôn nyoë',
+);
+
+/** Afrikaans (Afrikaans)
+ * @author Naudefj
+ * @author SPQRobin
+ */
+$messages['af'] = array(
+ 'cite_article_desc' => "Maak 'n [[Special:Cite|spesiale bladsy vir sitasie]], en 'n skakel daarna in hulpmiddels beskikbaar",
+ 'cite_article_link' => 'Haal dié blad aan',
+ 'tooltip-cite-article' => 'Inligting oor hoe u hierdie bladsy kan citeer',
+ 'cite' => 'Aanhaling',
+ 'cite_page' => 'Bladsy:',
+ 'cite_submit' => 'Aanhaling',
+);
+
+/** Amharic (አማርኛ)
+ * @author Codex Sinaiticus
+ * @author Teferra
+ */
+$messages['am'] = array(
+ 'cite_article_link' => 'ይህንን ገጽ አጣቅስ',
+ 'cite' => 'መጥቀሻ',
+ 'cite_page' => 'አርዕስትá¦',
+ 'cite_submit' => 'á‹áˆ­á‹áˆ®á‰½ ይታዩ',
+);
+
+/** Aragonese (aragonés)
+ * @author Juanpabl
+ */
+$messages['an'] = array(
+ 'cite_article_desc' => 'Adibe un vinclo y una pachina especial de [[Special:Cite|cita]]',
+ 'cite_article_link' => 'Citar ista pachina',
+ 'tooltip-cite-article' => 'Información de como citar ista pachina',
+ 'cite' => 'Citar',
+ 'cite_page' => 'Pachina:',
+ 'cite_submit' => 'Citar',
+);
+
+/** Arabic (العربية)
+ * @author Meno25
+ * @author OsamaK
+ */
+$messages['ar'] = array(
+ 'cite_article_desc' => 'يضي٠صÙحة [[Special:Cite|استشهاد]] خاصة ووصلة صندوق أدوات',
+ 'cite_article_link' => 'استشهد بهذه الصÙحة',
+ 'tooltip-cite-article' => 'معلومات عن كيÙية الاستشهاد بالصÙحة',
+ 'cite' => 'استشهاد',
+ 'cite_page' => 'الصÙحة:',
+ 'cite_submit' => 'استشهاد',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== تÙاصيل التألي٠ل{{FULLPAGENAME}} ==
+
+* اسم الصÙحة: {{FULLPAGENAME}}
+* المؤلÙ: مساهمو {{SITENAME}}
+* الناشر: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* تاريخ آخر مراجعة: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* تاريخ الاسترجاع: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* وصلة دائمة: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* رقم نسخة الصÙحة: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== أنماط الاستشهاد ل{{FULLPAGENAME}} ==
+
+=== [[APA style|نمط APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|نمط MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|نمط MHRA]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|نمط شيكاغو]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|نمط CBE/CSE]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|نمط Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== مدخلة [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+عند استخدام وصلة مجموعة [[LaTeX]] (<code>\\usepackage{url}</code> ÙÙŠ مكان ما) مما يؤدي إى إعطاء عناوين ويب مهيأة بشكل Ø£Ùضل، التالي ربما يكون Ù…Ùضلا:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Aramaic (ÜܪܡÜÜ)
+ * @author Basharh
+ */
+$messages['arc'] = array(
+ 'cite_article_link' => 'ܡܣܗܕ ܥܠ Ü—Ü•Ü Ü¦ÜܬÜ',
+ 'tooltip-cite-article' => 'ÜÜ•ÌˆÜ¥Ü¬Ü Ü¥Ü  ÜÜÜŸÜ¢Ü Ü•Ü¡Ü£Ü—Ü• ܥܠ ܦÜܬÜ',
+ 'cite' => 'ܡܣܗܕ',
+ 'cite_page' => 'ܦÜܬÜ:',
+ 'cite_submit' => 'ܡܣܗܕ',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Üܪ̈ÜÜŸÜ¬Ü Ü•Ü¦Ü˜Ü“ÜªÜ¦Ü Ü• {{FULLPAGENAME}} ==
+
+* Ü«Ü¡Ü Ü•Ü¦ÜܬÜ: {{FULLPAGENAME}}
+* Ü£ÜܘܡÜ: Ü«Ü˜Ü¬Ü¦Ü¢ÌˆÜ Ü• {{SITENAME}}
+* ܡܦܪܣÜ: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Ü£ÜÜ©Ü˜Ü¡Ü Ü•Ü¬Ü¢ÜÜ¬Ü ÜܚܪÜܬÜ: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Ü£ÜÜ©Ü˜Ü¡Ü Ü•Ü¡Ü¬Ü¦Ü¢ÜܢܘܬÜ: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* ÜÜ£Ü˜ÜªÜ Ü¦ÜܘܫÜ: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Ü—ÜÜÜ˜Ü¬Ü Ü•Ü¨ÜšÜšÜ Ü•Ü¦ÜܬÜ: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== ܙܢÜÌˆÜ Ü•Ü¡Ü£Ü—Ü•Ü¬Ü Ü• {{FULLPAGENAME}} ==
+
+=== [[Ü™Ü¢Ü Ü• APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Ü™Ü¢Ü Ü• MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Ü™Ü¢Ü Ü• MHRA]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style| Ü™Ü¢Ü Ü• Chicago]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Ü™Ü¢Ü Ü• CBE/CSE]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Ü™Ü¢Ü Ü• Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Ü¡Ü¥Ü Ü¬Ü Ü• [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+When using the [[LaTeX]] package url (<code>\\usepackage{url}</code> somewhere in the preamble) which tends to give much more nicely formatted web addresses, the following may be preferred:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Mapuche (mapudungun)
+ * @author Kaniw
+ * @author Remember the dot
+ */
+$messages['arn'] = array(
+ 'cite_article_desc' => 'Yomvmi kiñe wicu aztapvl ñi [[Special:Cite|konvmpan]] mew ka jasun kvzawpeyvm mew',
+ 'cite_article_link' => 'Konvmpape faci xoy',
+ 'tooltip-cite-article' => 'Cumley konvmpageay faci xoy',
+ 'cite' => 'Konvmpan',
+ 'cite_page' => 'Aztapvl:',
+ 'cite_submit' => 'Konvmpan',
+);
+
+/** Egyptian Spoken Arabic (مصرى)
+ * @author Ghaly
+ * @author Ramsis II
+ */
+$messages['arz'] = array(
+ 'cite_article_desc' => 'بيضي٠[[Special:Cite|مرجع]] صÙحة مخصوصة ولينك لصندوء أدوات',
+ 'cite_article_link' => 'استشهد بالصÙحة دى',
+ 'cite' => 'مرجع',
+ 'cite_page' => 'الصÙحه:',
+ 'cite_submit' => 'مرجع',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== تÙاصيل التألي٠ل{{FULLPAGENAME}} ==
+
+* اسم الصÙحة: {{FULLPAGENAME}}
+* المؤلÙ: مساهمو {{SITENAME}}
+* الناشر: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* تاريخ آخر مراجعة: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* تاريخ الاسترجاع: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* وصلة دائمة: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* رقم نسخة الصÙحة: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+
+== أنماط الاستشهاد ل{{FULLPAGENAME}} ==
+
+=== [[APA style|نمط APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|نمط MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|نمط MHRA]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|نمط شيكاغو]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|نمط CBE/CSE]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|نمط Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== مدخلة [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+عند استخدام وصلة مجموعة [[LaTeX]] (<code>\\usepackage{url}</code> ÙÙŠ مكان ما) مما يؤدى إلى إعطاء عناوين ويب مهيأة بشكل Ø£Ùضل، التالى ربما يكون Ù…Ùضلا:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->", # Fuzzy
+);
+
+/** Assamese (অসমীয়া)
+ * @author Bishnu Saikia
+ * @author Gitartha.bordoloi
+ */
+$messages['as'] = array(
+ 'cite_article_desc' => 'à¦à¦–ন [[Special:Cite|উদà§à¦§à§ƒà¦¤à¦¿]] পৃষà§à¦ à¦¾ আৰৠà¦à¦Ÿà¦¾ টà§à¦²à¦¬à¦•à§à¦¸ লিংক যোগ কৰে',
+ 'cite_article_link' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° উদà§à¦§à§ƒà¦¤à¦¿ দিয়ক',
+ 'tooltip-cite-article' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–নৰ উদà§à¦§à§ƒà¦¤à¦¿ দিয়াৰ বিষয়ে তথà§à¦¯',
+ 'cite' => '↓উদà§à¦§à§ƒà¦¤',
+ 'cite_page' => 'পৃষà§à¦ à¦¾:',
+ 'cite_submit' => '↓উদà§à¦§à§ƒà¦¤',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== {{FULLPAGENAME}} জীৱনীমূলক তথà§à¦¯ ==
+
+* পৃষà§à¦ à¦¾à§° নাম: {{FULLPAGENAME}}
+* লিখক: {{SITENAME}} contributors
+* পà§à§°à¦•à¦¾à¦¶à¦•: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* অনà§à¦¤à¦¿à¦® সংসà§à¦•à§°à¦£à§° তাৰিখ: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} ইউ.টি.ছি.
+* আহৰণৰ তাৰিখ: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* সà§à¦¥à¦¾à¦¯à¦¼à§€ ইউ.আৰ.à¦à¦².: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* পৃষà§à¦ à¦¾à§° সংসà§à¦•à§°à¦£à§° আই.ডি.: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== {{FULLPAGENAME}}ৰ বাবে উদà§à¦§à§ƒà¦¤à¦¿ সজà§à¦œà¦¾ ==
+
+=== [[APA style|APA সজà§à¦œà¦¾]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. আহৰণ <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> পৰা {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|MLA সজà§à¦œà¦¾]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA সজà§à¦œà¦¾]] ===
+{{SITENAME}} বৰঙনিদাতাসকল, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|চিকাগো সজà§à¦œà¦¾]] ===
+{{SITENAME}} বৰঙনিদাতাসকল, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (আহৰণ <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE সজà§à¦œà¦¾]] ===
+{{SITENAME}} বৰঙনিদাতাসকল. {{FULLPAGENAME}} [ইণà§à¦Ÿà¦¾à§°à¦¨à§‡à¦Ÿ]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [উদà§à¦§à§ƒà¦¤ <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. উপলদà§à¦§ :
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook সজà§à¦œà¦¾]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (অনà§à¦¤à¦¿à¦® পৰিদৰà§à¦¶à¦¨ <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] entry ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[অনলাইন; আহৰিত <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+When using the [[LaTeX]] package url (<code>\\usepackage{url}</code> somewhere in the preamble) which tends to give much more nicely formatted web addresses, the following may be preferred:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[অনলাইন; আহৰিত <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Asturian (asturianu)
+ * @author Esbardu
+ * @author Xuacu
+ */
+$messages['ast'] = array(
+ 'cite_article_desc' => 'Añade una páxina especial de [[Special:Cite|cites]] y un enllaz a la caxa de ferramientes',
+ 'cite_article_link' => 'Citar esta páxina',
+ 'tooltip-cite-article' => 'Información tocante a cómo citar esta páxina',
+ 'cite' => 'Citar',
+ 'cite_page' => 'Páxina:',
+ 'cite_submit' => 'Citar',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Datos bibliográficos pa {{FULLPAGENAME}} ==
+
+* Nome de la páxina: {{FULLPAGENAME}}
+* Autor: collaboradores de {{SITENAME}}
+* Editor: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Data de la última revisión: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Data na que s'algamó: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Dirección URL permanente: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID de versión de la páxina: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Estilu de cites pa {{FULLPAGENAME}} ==
+
+=== [[APA style|Estilu APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Consultáu el <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> en {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Estilu MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Estilu MHRA]] ===
+Collaboradores de {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [consultáu el <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Estilu Chicago]] ===
+Collaboradores de {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (consultáu el <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Estilu CBE/CSE]] ===
+Collaboradores de {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [citáu el <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponible en:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Estilu Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (última visita: <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Entrada [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ autor = \"{{SITENAME}}\",
+ títulu = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ añu = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ nota = \"[En llinia; consultáu el <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Cuando s'utiliza la dirección URL del paquete [[LaTeX]] (<code>\\usepackage{url}</code> n'algún llugar del preámbulu) que tiende a dar direiciones web con meyor formatu, pue ser preferible lo siguiente:
+
+ @misc{ wiki:xxx,
+ autor = \"{{SITENAME}}\",
+ títulu = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ añu = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ nota = \"[En llinia; consultáu el <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--zarrando'l div de \"plainlinks\"-->",
+);
+
+/** Avaric (авар)
+ * @author Amikeco
+ */
+$messages['av'] = array(
+ 'cite_article_link' => 'Гьумер рехÑезе',
+);
+
+/** Azerbaijani (azərbaycanca)
+ * @author Cekli829
+ */
+$messages['az'] = array(
+ 'cite' => 'Sayt',
+ 'cite_page' => 'Səhifə:',
+ 'cite_submit' => 'Sayt',
+);
+
+/** South Azerbaijani (تورکجه)
+ * @author Amir a57
+ * @author Mousa
+ */
+$messages['azb'] = array(
+ 'cite_article_desc' => 'بیر اؤزل [[Special:Cite|آلینتی]] صحیÙه‌سی Ùˆ آراج-قوتوسو باغلانتی‌سی آرتیرار',
+ 'cite_article_link' => 'بو صحیÙه‌دن آلینتی گؤتور',
+ 'tooltip-cite-article' => 'بو صحیÙه‌دن نئجه آلینتی گؤتورمک اوچون بیلگیلر',
+ 'cite' => 'سایت',
+ 'cite_page' => 'صحیÙÙ‡:',
+ 'cite_submit' => 'سایت',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== {{FULLPAGENAME}} اوچون قایناق‌جالیق بیلگیلری ==
+
+* صحیÙÙ‡ آدی: {{FULLPAGENAME}}
+* یارادیجی: {{SITENAME}} ایستیÙاده‌چیلری
+* نشر ائدن: ''{{SITENAME}}، {{int:sitesubtitle}}''.
+* سون نوسخه‌نین تاریخی: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* گؤتورن تاریخ: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* قالیجی آدرس: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* صحیÙÙ‡ نوسخه بلیردنی: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== {{FULLPAGENAME}} اوچون آلینتی بیچیملری ==
+
+=== [[APA بیچیمی]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[MLA بیچیم بیلگیلری|MLA بیچیمی]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA بیچیم رهبرلیگی|MHRA بیچیمی]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[شیکاگو بیچیم بیلگیلری|شیکاگو بیچیمی]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[بیلگی شوراسی یازارلاری|CBE/CSE بیچیمی]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook بیچیمی]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] بیچیمی ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+[[لتک]] یوآر‌اÙÙ„ بسته‌سینی ایشلدن‌ده (<code>\\usepackage{url}</code> باشلیق ایچینده) Ú©ÛŒ داها گؤزل بیچیملنمیش اینترنت آدرسلری وئرر، بو آشاغیداکی ترجیح وئریلیر:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Bashkir (башҡортÑа)
+ * @author Assele
+ * @author Haqmar
+ */
+$messages['ba'] = array(
+ 'cite_article_desc' => '[[Special:Cite|Өҙөмтә Ñһау]] махÑÑƒÑ Ð±Ð¸Ñ‚ÐµÐ½ һәм ҡоралдарҙа һылтанма өҫтәй',
+ 'cite_article_link' => 'Биттән өҙөмтә Ñһарға',
+ 'tooltip-cite-article' => 'Был битте ниÑек өҙөмтәләргә кәрәклеге тураһында мәғлүмәт',
+ 'cite' => 'Өҙөмтәләү',
+ 'cite_page' => 'Бит:',
+ 'cite_submit' => 'Өҙөмтәләргә',
+);
+
+/** Bavarian (Boarisch)
+ * @author Man77
+ * @author Mucalexx
+ */
+$messages['bar'] = array(
+ 'cite_article_desc' => "Ergänzd d' [[Special:Cite|Zitirhüf]]-Speziaalseiten und an Link im Werkzeigkosten",
+ 'cite_article_link' => "d' Seiten zitirn",
+ 'tooltip-cite-article' => 'Hihweis, wia dé Seiten zitird wern kå',
+ 'cite' => 'Zitirhüf',
+ 'cite_page' => 'Seiten:',
+ 'cite_submit' => 'Ã¥zoang',
+);
+
+/** Southern Balochi (بلوچی مکرانی)
+ * @author Mostafadaneshvar
+ */
+$messages['bcc'] = array(
+ 'cite_article_desc' => 'اضاÙÙ‡ Ú©Ù† یک [[Special:Cite|citation]] صÙحه حاص Ùˆ لینک جعبه ابزار',
+ 'cite_article_link' => 'ای صÙحه ÛŒ مرجع بل',
+ 'cite' => 'مرجع',
+ 'cite_page' => 'صÙحه:',
+ 'cite_submit' => 'مرجع',
+);
+
+/** Bikol Central (Bikol Central)
+ * @author Filipinayzd
+ */
+$messages['bcl'] = array(
+ 'cite_article_link' => 'Sambiton an artikulong ini', # Fuzzy
+ 'cite' => 'Sambiton',
+ 'cite_page' => 'Pahina:',
+ 'cite_submit' => 'Sambiton',
+);
+
+/** Belarusian (беларуÑкаÑ)
+ * @author Хомелка
+ */
+$messages['be'] = array(
+ 'cite_article_desc' => 'Дадае [[Special:Cite|цытату]] адмыÑловых Ñтаронак Ñ– ÑпаÑылку панÑлі інÑтрументаў',
+ 'cite_article_link' => 'Цытаваць гÑту Ñтаронку',
+ 'tooltip-cite-article' => 'Ð†Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð¿Ñ€Ð° тое, Ñк цытаваць гÑтую Ñтаронку',
+ 'cite' => 'СпаÑлацца',
+ 'cite_page' => 'Старонка:',
+ 'cite_submit' => 'СпаÑлацца',
+);
+
+/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
+ * @author EugeneZelenko
+ * @author Wizardist
+ */
+$messages['be-tarask'] = array(
+ 'cite_article_desc' => 'Дадае ÑпÑцыÑльную Ñтаронку [[Special:Cite|цытаваньнÑ]] Ñ– ÑпаÑылку Ñž інÑтрумÑнтах',
+ 'cite_article_link' => 'Цытаваць Ñтаронку',
+ 'tooltip-cite-article' => 'Ð†Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð¿Ñ€Ð° тое, Ñк цытатаваць гÑтую Ñтаронку',
+ 'cite' => 'Цытаваньне',
+ 'cite_page' => 'Старонка:',
+ 'cite_submit' => 'Цытаваць',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== БібліÑÐ³Ñ€Ð°Ñ„Ñ–Ñ‡Ð½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі артыкула «{{FULLPAGENAME}}» ==
+
+* Ðазва артыкула: {{FULLPAGENAME}}
+* Ðўтар: РÑдактары {{GRAMMAR:родны|{{SITENAME}}}}
+* Выдавец: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Дата апошнÑй Ñ€Ñвізіі: {{CURRENTDAY}} {{CURRENTMONTHNAMEGEN}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Дата атрыманьнÑ: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAMEGEN}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Сталы URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ІдÑнтыфікатар вÑÑ€ÑÑ–Ñ– артыкула: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Цытаваньне артыкула «{{FULLPAGENAME}}» рознымі Ñтандартамі ==
+
+=== [[Стыль ÐПÐ]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[MLA style manual|Стыль MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Стыль MHRA]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Стыль Чыкага]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Стыль CBE/CSE]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Стыль Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Пры выкарыÑтаньні пакета url Ð´Ð»Ñ [[LaTeX]] (<code>\\usepackage{url}</code> у пачатку) можна дабіцца лепшага выÑÑžÐ»ÐµÐ½ÑŒÐ½Ñ Ð²Ñб-адраÑоў. Ðеабходна аформіць наÑтупным чынам:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Bulgarian (българÑки)
+ * @author DCLXVI
+ * @author Turin
+ */
+$messages['bg'] = array(
+ 'cite_article_desc' => 'Ð”Ð¾Ð±Ð°Ð²Ñ Ñпециална Ñтраница и препратка за [[Special:Cite|цитиране]]',
+ 'cite_article_link' => 'Цитиране на Ñтраницата',
+ 'tooltip-cite-article' => 'Данни за начин на цитиране на тази Ñтраница',
+ 'cite' => 'Цитиране',
+ 'cite_page' => 'Страница:',
+ 'cite_submit' => 'Цитиране',
+);
+
+/** Bengali (বাংলা)
+ * @author Bellayet
+ * @author Zaheen
+ */
+$messages['bn'] = array(
+ 'cite_article_desc' => 'à¦à¦•à¦Ÿà¦¿ বিশেষ [[Special:Cite|উদà§à¦§à§ƒà¦¤à¦¿]] পাতা ও টà§à¦²à¦¬à¦•à§à¦¸ সংযোগ যোগ করে',
+ 'cite_article_link' => 'ঠপাতাটি উদà§à¦§à§ƒà¦¤ করো',
+ 'cite' => 'উদà§à¦§à§ƒà¦¤',
+ 'cite_page' => 'পাতা:',
+ 'cite_submit' => 'উদà§à¦§à§ƒà¦¤ করো',
+);
+
+/** Tibetan (བོད་ཡིག)
+ * @author Freeyak
+ */
+$messages['bo'] = array(
+ 'cite' => '',
+ 'cite_page' => 'ཤོག་ངོསà¼',
+);
+
+/** Bishnupria Manipuri (বিষà§à¦£à§à¦ªà§à¦°à¦¿à¦¯à¦¼à¦¾ মণিপà§à¦°à§€)
+ */
+$messages['bpy'] = array(
+ 'cite_article_link' => 'নিবনà§à¦§ à¦à¦¹à¦¾à¦¨à¦°à§‡ উদà§à¦§à§ƒà¦¤ করেদে',
+ 'cite' => 'উদà§à¦§à§ƒà¦¤ করেদে',
+);
+
+/** Breton (brezhoneg)
+ * @author Fulup
+ */
+$messages['br'] = array(
+ 'cite_article_desc' => 'Ouzhpennañ a ra ur bajenn dibar [[Special:Cite|arroud]] hag ul liamm er voest ostilhoù',
+ 'cite_article_link' => 'Menegiñ ar pennad-mañ',
+ 'tooltip-cite-article' => 'Titouroù war an doare da venegiñ ar bajenn-mañ',
+ 'cite' => 'Menegiñ',
+ 'cite_page' => 'Pajenn :',
+ 'cite_submit' => 'Menegiñ',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Titouroù levrlennadurel evit {{FULLPAGENAME}} ==
+
+* Anv ar bajenn : {{FULLPAGENAME}}
+* Aozer : kenlabourerien {{SITENAME}}
+* Embanner : ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Kemm diwezhañ : {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Deiziad adtapout : <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* URL pad : {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Identeler ar stumm-mañ : {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Stiloù arroudoù evit {{FULLPAGENAME}} ==
+
+=== [[Stil APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Adtapet d'an <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> e {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Stil MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[Stil MHRA]] ===
+Perzhidi {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [sellet d'an <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[Stil Chicago]] ===
+Perzhidi {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (sellet d'an <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Stil CBE/CSE]] ===
+Perzhidi {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [meneget d'an <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Hegerz war :
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Stil Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (sellet d'an <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Enmont [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Enlinenn ; sellet d'an <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Ma rit gant ar pakadur URL e [[LaTeX]] (<code>\\usepackage{url}</code> en ul lec'h bennak er raklavar), a bourchas chomlec'hioù Web furmadet gwelloc'h, grit gant ar furmad-mañ :
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Enlinenn ; sellet d'an <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Bosnian (bosanski)
+ * @author CERminator
+ */
+$messages['bs'] = array(
+ 'cite_article_desc' => 'Dodaje posebnu stranicu za [[Special:Cite|citiranje]] i link u alatnoj kutiji',
+ 'cite_article_link' => 'Citiraj ovu stranicu',
+ 'tooltip-cite-article' => 'Informacije kako citirati ovu stranicu',
+ 'cite' => 'Citiranje',
+ 'cite_page' => 'Stranica:',
+ 'cite_submit' => 'Citiraj',
+);
+
+/** Catalan (català)
+ * @author Davidpar
+ * @author SMP
+ * @author Toniher
+ * @author Vriullop
+ */
+$messages['ca'] = array(
+ 'cite_article_desc' => 'Afegeix un enllaç i una pàgina especial de [[Special:Cite|citació]]',
+ 'cite_article_link' => 'Cita aquesta pàgina',
+ 'tooltip-cite-article' => 'Informació sobre com citar aquesta pàgina.',
+ 'cite' => 'Citeu',
+ 'cite_page' => 'Pàgina:',
+ 'cite_submit' => 'Cita',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Informació bibliogràfica de {{FULLPAGENAME}} ==
+
+* Pàgina: {{FULLPAGENAME}}
+* Autor: col·laboradors del projecte {{SITENAME}}
+* Editor: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Darrera versió: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Consulta: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* URL permanent: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Identificador de la versió: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Estils de citacions per {{FULLPAGENAME}} ==
+
+=== [[Llibre d'estil APA|Estil APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Recuperat <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> a {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Llibre d'estil MLA|Estil MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[Llibre d'estil MHRA|Estil MHRA]] ===
+Col·laboradors de {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [consulta <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[Llibre d'estil Chicago|Estil Chicago]] ===
+Col·laboradors de {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (consulta <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Estil CBE/CSE]] ===
+Col·laboradors de {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [citat <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponible a:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Estil Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (darrera consulta <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Entrada [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[En línia; consulta <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Si empreu el paquet url per a [[LaTeX]] (<code>\\usepackage{url}</code> en algun lloc del preàmbul) que facilita el format d'adreces web, pot ser millor el codi següent:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[En línia; consulta <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄)
+ */
+$messages['cdo'] = array(
+ 'cite_article_link' => 'Īng-ê̤ṳng cÄ« piÄ•ng ùng-ciÅng',
+ 'cite' => 'Īng-ê̤ṳng',
+ 'cite_page' => 'Hiĕk-miêng:',
+ 'cite_submit' => 'Īng-ê̤ṳng',
+);
+
+/** Chechen (нохчийн)
+ * @author Sasan700
+ * @author Умар
+ */
+$messages['ce'] = array(
+ 'cite_article_link' => 'ÐгӀонах лаьцна дешнаш дало',
+ 'cite' => 'Далийнадош',
+);
+
+/** Cebuano (Cebuano)
+ * @author Abastillas
+ */
+$messages['ceb'] = array(
+ 'cite' => 'Kutloa',
+);
+
+/** Sorani Kurdish (کوردی)
+ * @author Asoxor
+ * @author Calak
+ */
+$messages['ckb'] = array(
+ 'cite_article_link' => 'ئەم پەڕەیە بکە بە ژێدەر',
+ 'tooltip-cite-article' => 'زانیاری سەبارەت بە چۆنیەتیی بە ژێدەر کردنی ئەم پەڕە',
+ 'cite' => 'بیکە بە ژێدەر',
+ 'cite_page' => 'Ù¾Û•Ú•Û•:',
+ 'cite_submit' => 'بیکە بە ژێدەر',
+);
+
+/** Corsican (corsu)
+ */
+$messages['co'] = array(
+ 'cite_article_link' => 'Cità issu articulu', # Fuzzy
+ 'cite' => 'Cità',
+ 'cite_page' => 'Pagina:',
+);
+
+/** Czech (Äesky)
+ * @author Beren
+ * @author Li-sung
+ * @author Martin Kozák
+ * @author Mormegil
+ */
+$messages['cs'] = array(
+ 'cite_article_desc' => 'Přidává speciální stránku [[Special:Cite|Citace]] a odkaz v nabídce nástrojů',
+ 'cite_article_link' => 'Citovat stránku',
+ 'tooltip-cite-article' => 'Informace o tom, jak citovat tuto stránku',
+ 'cite' => 'Citace',
+ 'cite_page' => 'Článek:',
+ 'cite_submit' => 'Citovat',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliografické detaily ke stránce {{FULLPAGENAME}} ==
+
+* Jméno stránky: {{FULLPAGENAME}}
+* Autor: Přispěvatelé {{grammar:2sg|{{SITENAME}}}}
+* Vydavatel: ''{{MediaWiki:Sitesubtitle}}''.
+* Datum poslední úpravy: {{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}} UTC
+* Datum převzetí: <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}} UTC</citation>
+* Trvalý odkaz: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Identifikace verze stránky: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Způsoby citace stránky {{FULLPAGENAME}} ==
+
+=== ISO 690-2 (1)===
+Přispěvatelé {{grammar:2sg|{{SITENAME}}}},'' {{FULLPAGENAME}}'' [online], {{int:sitesubtitle}}, c{{CURRENTYEAR}},
+Datum poslední revize {{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}} UTC,
+[citováno <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>]
+&lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;
+
+=== ISO 690-2 (2)===
+''{{int:sitesubtitle}}: {{FULLPAGENAME}}'' [online]. c{{CURRENTYEAR}} [citováno <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>]. Dostupný z WWW: &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;
+
+=== APA ===
+{{FULLPAGENAME}}. ({{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}). ''{{int:sitesubtitle}}''. Získáno <citation>{{CURRENTTIME}}, {{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation> z {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== MLA ===
+„{{FULLPAGENAME}}.“ ''{{int:sitesubtitle}}''. {{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== MHRA ===
+Přispěvatelé {{grammar:2sg|{{SITENAME}}}}, '{{FULLPAGENAME}}', ''{{int:sitesubtitle}},'' {{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [získáno <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>]
+
+=== Chicago ===
+Přispěvatelé {{grammar:2sg|{{SITENAME}}}}, „{{FULLPAGENAME}},“ ''{{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (získáno <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>).
+
+=== CBE/CSE ===
+Přispěvatelé {{grammar:2sg|{{SITENAME}}}}. {{FULLPAGENAME}} [Internet]. {{int:sitesubtitle}}; {{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>]. Dostupné na:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== Bluebook ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (naposledy navštíveno <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; navštíveno <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>]\"
+ }
+
+PÅ™i použití [[LaTeX]]ového balíÄku url (nÄ›kde na zaÄátku dokumentu je uvedeno <code>\\usepackage{url}</code>), který o nÄ›co lépe formátuje webové adresy, můžete upÅ™ednostnit následující verzi:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; navštíveno <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>]\"
+ }
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Church Slavic (ÑловѣÌньÑкъ / ⰔⰎⰑⰂⰡâ°â° â°”â°â°Ÿ)
+ * @author ОйЛ
+ */
+$messages['cu'] = array(
+ 'cite_article_link' => 'привєдєниѥ члѣна ÑловєÑÑŠ',
+ 'cite_page' => 'Ñтраница :',
+);
+
+/** Welsh (Cymraeg)
+ * @author Lloffiwr
+ */
+$messages['cy'] = array(
+ 'cite_article_desc' => 'Yn ychwanegu tudalen arbennig ar gyfer [[Special:Cite|cyfeirio at erthygl]] a chyswllt bocs offer',
+ 'cite_article_link' => 'Cyfeiriwch at yr erthygl hon',
+ 'tooltip-cite-article' => 'Gwybodaeth ar sut i gyfeirio at y dudalen hon',
+ 'cite' => 'Cyfeirio at erthygl',
+ 'cite_page' => 'Tudalen:',
+ 'cite_submit' => 'Cyfeirio',
+);
+
+/** Danish (dansk)
+ * @author Byrial
+ * @author Christian List
+ * @author Morten LJ
+ * @author Peter Alberti
+ */
+$messages['da'] = array(
+ 'cite_article_desc' => 'Tilføjer en [[Special:Cite|specialside til citering]] og en henvisning i værktøjsmenuen',
+ 'cite_article_link' => 'Citér denne artikel',
+ 'tooltip-cite-article' => 'Information om, hvordan man kan citere denne side',
+ 'cite' => 'Citér',
+ 'cite_page' => 'Side:',
+ 'cite_submit' => 'Citér',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+ == Bibliografiske oplysninger for {{FULLPAGENAME}} ==
+
+ * Sidenavn: {{FULLPAGENAME}}
+ * Forfatter: {{SITENAME}} bidragydere
+ * Udgiver: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+ * Dato for seneste revision: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+ * Datoen hentet: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+ * Permanent URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+ * Side versions-ID: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+ == Typografier til citat af {{FULLPAGENAME}} ==
+
+ === [[APA typografi]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Hentet <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> fra {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+ === [[The MLA stil manual|MLA typografi]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt; {{canonicalurl: {{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+ === [[MHRA stil Guide|MHRA typografi]] ===
+{{SITENAME}} bidragydere, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt; {{canonicalurl: {{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [hentet <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+ === [[Chicago manualen om Style|Chicago typografi]] ===
+{{SITENAME}} bidragydere, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (hentet <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+ === [[Rådet for videnskabsredaktører|CBE/CSE typografi]] ===
+{{SITENAME}} bidragydere. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [citeret <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Tilgængelig fra:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+ === [[Bluebook|Bluebook typografi]] ===
+{{FULLPAGENAME}}, {{canonicalurl: {{FULLPAGENAME}}|oldid={{REVISIONID}}}} (senest besøgt <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+ === [[BibTeX]] indlæg ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; hentet <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Når du bruger [[LaTeX]] pakkens URL-adressen (<code>\\usepackage{url}</code> et sted i præamblen) som har tendens til at give meget mere pænt formaterede webadresser, kan følgende være at foretrække:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; hentet <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** German (Deutsch)
+ * @author Kghbln
+ */
+$messages['de'] = array(
+ 'cite_article_desc' => 'Ergänzt eine [[Special:Cite|Spezialseite]] als Zitierhilfe sowie einen zugehörigen Link im Bereich Werkzeuge',
+ 'cite_article_link' => 'Seite zitieren',
+ 'tooltip-cite-article' => 'Hinweis, wie diese Seite zitiert werden kann',
+ 'cite' => 'Zitierhilfe',
+ 'cite_page' => 'Seite:',
+ 'cite_submit' => 'zitieren',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliografische Angaben für {{FULLPAGENAME}} ==
+
+* Seitentitel: {{FULLPAGENAME}}
+* Autor(en): {{SITENAME}}-Bearbeiter
+* Herausgeber: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Zeitpunkt der letzten Bearbeitung: {{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC
+* Datum des Abrufs: <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC</citation>
+* Permanente URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Versionskennung: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Zitatstile für {{FULLPAGENAME}} ==
+
+=== [[APA-Stil]] ===
+{{FULLPAGENAME}}. ({{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Abgerufen am <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> von {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[MLA-Stil]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA-Stil]] ===
+{{SITENAME}}-Bearbeiter, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [abgerufen am <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[Chicago-Stil]] ===
+{{SITENAME}}-Bearbeiter, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (abgerufen am <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>).
+
+=== [[CBE/CSE-Stil]] ===
+{{SITENAME}}-Bearbeiter. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC [zitiert am <citation>{{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}</citation>]. Verfügbar unter:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook-Stil]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (abgerufen am <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]]-Eintrag ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; abgerufen am <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]\"
+ }
+
+Bei Benutzung der [[LaTeX]]-Moduls „url“ (<code>\\usepackage{url}</code> im Bereich der Einleitung), welches eine schöner formatierte Internetadresse ausgibt, kann die folgende Ausgabe genommen werden:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; abgerufen am <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Zazaki (Zazaki)
+ * @author Erdemaslancan
+ * @author Mirzali
+ * @author Xoser
+ */
+$messages['diq'] = array(
+ 'cite_article_desc' => 'Pela xısusiye u gıreyê qutiya hacetan [[Special:Cite|citation]] ilawe keno.',
+ 'cite_article_link' => 'Na pele bia xo viri',
+ 'tooltip-cite-article' => 'Melumato ke ena pele çıtewri iqtıbas keno',
+ 'cite' => 'Bia xo viri',
+ 'cite_page' => 'Pele:',
+ 'cite_submit' => 'Bia xo viri',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliyografiya teferruatanê {{FULLPAGENAME}} ==
+
+* Nameyê pele: {{FULLPAGENAME}}
+* Nuskar: İştıraqkerê {{SITENAME}}
+* Vılaker: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Revizyonê demi: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Serkerdışê demi: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Ancıyayışê URLê cı: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Verziyonê kamiya pela: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Terzê istasyonê {{FULLPAGENAME}} ==
+
+=== [[APA style]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. ancıyayo <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Terzê MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Terzê MHRA]] ===
+iştırazkarê {{SITENAME}} , '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [zerre <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Terzê Şikagoy]] ===
+iştırazkarê {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Terzê CBE/CSE]] ===
+{{SITENAME}} İştıraxkari. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [sitedo <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Ancıyayışê cı:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Terzê Bluebooki]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (tewr peyên<citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Cı kewê [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ Nuskar = \"{{SITENAME}}\",
+ Sername = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ Serre = \"{{CURRENTYEAR}}\",
+ Url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ Not = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+ @misc{ wiki:xxx,
+ Nuskar = \"{{SITENAME}}\",
+ Sername = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ Serre = \"{{CURRENTYEAR}}\",
+ Url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ Not = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Lower Sorbian (dolnoserbski)
+ * @author Michawiki
+ */
+$messages['dsb'] = array(
+ 'cite_article_desc' => 'Pśidawa specialny bok [[Special:Cite|Citěrowańska pomoc]] a link w kašćiku źěłowe rědy',
+ 'cite_article_link' => 'Toś ten bok citěrowaś',
+ 'tooltip-cite-article' => 'Informacije wó tom, kak toś ten bok dajo se citěrowaś',
+ 'cite' => 'Citěrowańska pomoc',
+ 'cite_page' => 'Bok:',
+ 'cite_submit' => 'pokazaÅ›',
+);
+
+/** Ewe (eʋegbe)
+ */
+$messages['ee'] = array(
+ 'cite_page' => 'Nuŋɔŋlɔ:',
+);
+
+/** Greek (Ελληνικά)
+ * @author Consta
+ * @author Glavkos
+ * @author Omnipaedista
+ */
+$messages['el'] = array(
+ 'cite_article_desc' => 'ΠÏοσθέτει μία ειδική σελίδα [[Special:Cite|παÏαθέσεων]] καί έναν σÏνδεσμο Ï€Ïος την εÏγαλειοθήκη',
+ 'cite_article_link' => 'ΠαÏαθέστε αυτή τη σελίδα',
+ 'tooltip-cite-article' => 'ΠληÏοφοÏίες για το πως να παÏαπέμψετε σε αυτήν την σελίδα',
+ 'cite' => 'ΑναφοÏά',
+ 'cite_page' => 'Σελίδα:',
+ 'cite_submit' => 'ΠÏοσθήκη παÏαθέσεων',
+);
+
+/** Esperanto (Esperanto)
+ * @author Michawiki
+ * @author Tlustulimu
+ * @author Yekrats
+ */
+$messages['eo'] = array(
+ 'cite_article_desc' => 'Aldonas specialan paÄon por [[Special:Cite|citado]] kaj ligilo al ilaro',
+ 'cite_article_link' => 'Citi ĉi tiun paÄon',
+ 'tooltip-cite-article' => 'Informoj pri tio, kiel oni citu ĉi tiun paÄon',
+ 'cite' => 'Citado',
+ 'cite_page' => 'PaÄo:',
+ 'cite_submit' => 'Citi',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliografiaj detaloj por {{FULLPAGENAME}} ==
+
+* Nomo de paÄo: {{FULLPAGENAME}}
+* AÅ­toro: {{SITENAME}} contributors
+* Eldonejo: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Dato de lasta revizio: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Dato ricevita: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* DaÅ­ra URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Versio-identigo de paÄo: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Citaj stiloj por {{FULLPAGENAME}} ==
+
+=== [[APA-stilo]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[MLA-stilo]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA-stilo]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[Ĉikago-stilo]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[CBE/CSE-stilo]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Blulibro-stilo]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] datumaro ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Kiam uzante [[LaTeX]]-on, url (<code>\\usepackage{url}</code> ie en la kapteksto) kiu emas formati pli belaj retadresoj, la jeno eble estos preferata:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Spanish (español)
+ * @author Armando-Martin
+ * @author Crazymadlover
+ * @author Icvav
+ * @author Jatrobat
+ * @author Muro de Aguas
+ * @author Sanbec
+ */
+$messages['es'] = array(
+ 'cite_article_desc' => 'Añade una página especial para [[Special:Cite|citar la página]] y un enlace en la caja de herramientas.',
+ 'cite_article_link' => 'Citar este artículo',
+ 'tooltip-cite-article' => 'Información de como citar esta página',
+ 'cite' => 'Citar',
+ 'cite_page' => 'Página:',
+ 'cite_submit' => 'Citar',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Datos bibliográficos sobre {{FULLPAGENAME}} ==
+
+* Nombre de la página: {{FULLPAGENAME}}
+* Autor: {{SITENAME}} contributors
+* Editor: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Fecha de la última revisión: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Fecha obtenida: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Dirección URL permanente: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Identificador de versión de la página: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Estilo de citas para {{FULLPAGENAME}} ==
+
+=== [[APA style|Estilo APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Consultado el <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> en {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Estilo MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Estilo MHRA]] ===
+Colaboradores de {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [consultado el <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Estilo Chicago]] ===
+Colaboradores de {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (consultado el <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Estilo CBE/CSE]] ===
+Colaboradores de {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [citado el <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponible en:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Estilo Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (última visita: <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Entrada [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ autor = \"{{SITENAME}}\",
+ título = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ año = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ nota = \"[En línea; consultado el <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Cuando se utiliza la dirección URL de empaquetamiento [[LaTeX]] (<code>\\usepackage{url}</code> en algún lugar del preámbulo) que tiende a dar direcciones web con un formato más agradable, se prefiere lo siguiente:
+
+ @misc{ wiki:xxx,
+ autor = \"{{SITENAME}}\",
+ título = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ año = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ nota = \"[En línea; consultado el <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--cerrando div para \"plainlinks\"-->",
+);
+
+/** Estonian (eesti)
+ * @author Pikne
+ * @author WikedKentaur
+ */
+$messages['et'] = array(
+ 'cite_article_desc' => 'Lisab [[Special:Cite|tsiteerimise]] erilehekülje ja lingi külgmenüü tööriistakasti.',
+ 'cite_article_link' => 'Tsiteeri seda artiklit',
+ 'tooltip-cite-article' => 'Teave tsiteerimisviiside kohta',
+ 'cite' => 'Tsiteerimine',
+ 'cite_page' => 'Leht:',
+ 'cite_submit' => 'Tsiteeri',
+ 'cite_text' => '__NOTOC__
+<div class="mw-specialcite-bibliographic">
+
+== Lehekülje "{{FULLPAGENAME}}" bibliograafilised andmed ==
+
+* Lehekülje pealkiri: {{FULLPAGENAME}}
+* Autor: {{GRAMMAR:genitive|{{SITENAME}}}} kaastöölised
+* Väljaandja: \'\'{{SITENAME}}, {{int:sitesubtitle}}\'\'.
+* Viimane redaktsioon: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Vaadatud: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Püsilink: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Lehekülje versiooninumber: {{REVISIONID}}
+
+</div>
+<div class="plainlinks mw-specialcite-styles">
+
+== Viitamisstiilid lehekülje "{{FULLPAGENAME}}" jaoks ==
+
+=== APA stiil ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). \'\'{{SITENAME}}, {{int:sitesubtitle}}\'\'. Vaadatud: <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>, aadressil {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== MLA stiil ===
+"{{FULLPAGENAME}}." \'\'{{SITENAME}}, {{int:sitesubtitle}}\'\'. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== MHRA stiil ===
+{{GRAMMAR:genitive|{{SITENAME}}}} kaastöölised, \'{{FULLPAGENAME}}\', \'\'{{SITENAME}}, {{int:sitesubtitle}},\'\' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [vaadatud: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== Chicago stiil ===
+{{GRAMMAR:genitive|{{SITENAME}}}} kaastöölised, "{{FULLPAGENAME}}," \'\'{{SITENAME}}, {{int:sitesubtitle}},\'\' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (vaadatud: <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== CBE/CSE stiil ===
+{{GRAMMAR:genitive|{{SITENAME}}}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [vaadatud: <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Kättesaadav aadressil:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== Bluebooki stiil ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (viimati vaadatud: <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== BibTeX-i sissekanne ===
+
+ @misc{ wiki:xxx,
+ author = "{{SITENAME}}",
+ title = "{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}",
+ year = "{{CURRENTYEAR}}",
+ url = "{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}",
+ note = "[Võrgus; vaadatud: <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]"
+ }
+
+Kui kasutada LaTeX-i url-i (<code>\\usepackage{url}</code> kuskil lehekülje alguses), mis vormindab sageli võrguaadressi ilusamini, võib eelistatavamaks osutuda järgmine kood:
+
+ @misc{ wiki:xxx,
+ author = "{{SITENAME}}",
+ title = "{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}",
+ year = "{{CURRENTYEAR}}",
+ url = "\'\'\'\\url{\'\'\'{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\'\'\'}\'\'\'",
+ note = "[Võrgus; vaadatud: <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]"
+ }
+
+
+</div> <!--closing div for "plainlinks"-->',
+);
+
+/** Basque (euskara)
+ * @author An13sa
+ * @author Theklan
+ * @author Xabier Armendaritz
+ */
+$messages['eu'] = array(
+ 'cite_article_desc' => '[[Special:Cite|Aipatu]] orrialde berezia gehitzen du tresna-kutxaren loturetan',
+ 'cite_article_link' => 'Aipatu orri hau',
+ 'tooltip-cite-article' => 'Orri honen aipua egiteko moduari buruzko informazioa',
+ 'cite' => 'Aipamenak',
+ 'cite_page' => 'Orrialdea:',
+ 'cite_submit' => 'Aipatu',
+);
+
+/** Extremaduran (estremeñu)
+ * @author Better
+ */
+$messages['ext'] = array(
+ 'cite_article_link' => 'Almiental esti artículu', # Fuzzy
+ 'cite' => 'Almiental',
+ 'cite_page' => 'Páhina:',
+ 'cite_submit' => 'Almiental',
+);
+
+/** Persian (Ùارسی)
+ * @author Huji
+ * @author Reza1615
+ * @author Wayiran
+ * @author ZxxZxxZ
+ */
+$messages['fa'] = array(
+ 'cite_article_desc' => 'صÙحهٔ ویژه‌ای برای [[Special:Cite|یادکرد]] اضاÙÙ‡ می‌کند Ùˆ پیوندی به جعبه ابزار می‌اÙزاید',
+ 'cite_article_link' => 'یادکرد پیوند این مقاله',
+ 'tooltip-cite-article' => 'اطلاعات در خصوص چگونگی یادکرد این صÙحه',
+ 'cite' => 'یادکرد این مقاله',
+ 'cite_page' => 'صÙحه:',
+ 'cite_submit' => 'یادکرد',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== اطلاعات کتاب‌شناسی برای {{FULLPAGENAME}} ==
+
+* نام صÙحه: {{FULLPAGENAME}}
+* نویسنده: مشارکت‌کنندگان {{SITENAME}}
+* ناشر: ''{{SITENAME}}، {{int:sitesubtitle}}''.
+* تاریخ آخرین نسخه: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* تاریخ بازبینی: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* نشانی پایدار: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* شناسهٔ نسخهٔ صÙحه: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== شیوه‌های یادکرد برای {{FULLPAGENAME}} ==
+
+=== [[شیوه APA|شیوهٔ APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}، {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}، {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}، {{CURRENTMONTHNAME}} {{CURRENTDAY}}، {{CURRENTYEAR}}</citation> از {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[شیوه ام‌ال‌آ|شیوهٔ MLA]] ===
+«{{FULLPAGENAME}}». ''{{SITENAME}}، {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}، {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}، {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt؛.
+
+=== [[شیوه MHRA|شیوهٔ MHRA]] ===
+مشارکت‌کنندگان {{SITENAME}}، «{{FULLPAGENAME}}»، ''{{SITENAME}}، {{int:sitesubtitle}}،'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}، {{CURRENTTIME}} UTC، &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[شیوه‌نامه شیکاگو|شیوهٔ شیکاگو]] ===
+مشارکت‌کنندگان {{SITENAME}}، «{{FULLPAGENAME}}»، ''{{SITENAME}}، {{int:sitesubtitle}}،'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (بازیابی‌شده در <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|شیوهٔ CBE/CSE]] ===
+مشارکت‌کنندگان {{SITENAME}}. {{FULLPAGENAME}} [اینترنت]. {{SITENAME}}، {{int:sitesubtitle}}؛ {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}، {{CURRENTTIME}} UTC [یادکردشده در <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. قابل دسترسی از:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[w:en:Bluebook|شیوهٔ Bluebook]] ===
+{{FULLPAGENAME}}، {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (آخرین بازدید در <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[برخط؛ بازبینی‌شده در <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+در زمان استÙاده از بستهٔ [[LaTeX]] نشانی (<code>\\usepackage{url}</code> جایی در پیوند پایدار) Ú©Ù‡ برای ارائه Ùرمت‌های وبی طراحی شده‌است، شاید به صورت زیر مطلوب باشد:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[برخط؛ بازبینی‌شده در <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Finnish (suomi)
+ * @author Linnea
+ * @author Nike
+ * @author ZeiP
+ */
+$messages['fi'] = array(
+ 'cite_article_desc' => 'Lisää työkaluihin toimintosivun, joka neuvoo [[Special:Cite|viittaamaan]] oikeaoppisesti.',
+ 'cite_article_link' => 'Viitetiedot',
+ 'tooltip-cite-article' => 'Tietoa tämän sivun lainaamisesta',
+ 'cite' => 'Viitetiedot',
+ 'cite_page' => 'Sivu:',
+ 'cite_submit' => 'Viittaa',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliografiset tiedot artikkelille {{FULLPAGENAME}} ==
+
+* Sivun nimi: {{FULLPAGENAME}}
+* Tekijä: {{SITENAME}}-projektin osanottajat
+* Julkaisija: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Viimeisimmän version päivämäärä: {{CURRENTDAY}}. {{CURRENTMONTHNAME}}ta {{CURRENTYEAR}}, kello {{CURRENTTIME}} (UTC)
+* Sivu haettu: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}}ta {{CURRENTYEAR}}, kello {{CURRENTTIME}} (UTC)</citation>
+* Pysyvä osoite: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Sivun version tunniste: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Viittaustyylit artikkelille {{FULLPAGENAME}} ==
+
+=== APA-tyyli ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}}n {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Haettu <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}}n {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> osoitteesta {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== MLA-tyyli ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== MHRA-tyyli ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}}ta {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [haettu <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}}ta {{CURRENTYEAR}}</citation>]
+
+=== Chicago-tyyli ===
+{{SITENAME}}-projektin osanottajat, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (haettu <citation>{{CURRENTMONTHNAME}}n {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== CBE/CSE-tyyli ===
+{{SITENAME}}-projektin osanottajat. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Saatavilla osoitteesta: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== Bluebook-tyyli ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (vierailtu viimeksi <citation>{{CURRENTMONTHNAME}}n {{CURRENTDAY}}., {{CURRENTYEAR}}</citation>).
+
+=== BibTeX-muoto ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; haettu <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Käytettäessä [[LaTeX]]-pakettia url, (<code>\\usepackage{url}</code> jossain alussa) joka tapaa antaa paremmin muotoiltuja osoitteita, seuraavaa muotoa voidaan käyttää:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; haettu <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Fijian (Na Vosa Vakaviti)
+ */
+$messages['fj'] = array(
+ 'cite_article_link' => 'Vola dau vaqarai', # Fuzzy
+);
+
+/** Faroese (føroyskt)
+ * @author Diupwijk
+ * @author Spacebirdy
+ */
+$messages['fo'] = array(
+ 'cite_article_link' => 'Sitera hesa síðuna',
+ 'cite' => 'Sitera',
+ 'cite_page' => 'Síða:',
+ 'cite_submit' => 'Sitera',
+);
+
+/** French (français)
+ * @author DavidL
+ * @author Grondin
+ * @author Hégésippe Cormier
+ * @author PieRRoMaN
+ * @author Urhixidur
+ */
+$messages['fr'] = array(
+ 'cite_article_desc' => 'Ajoute une page spéciale [[Special:Cite|citation]] et un lien dans la boîte à outils',
+ 'cite_article_link' => 'Citer cette page',
+ 'tooltip-cite-article' => 'Informations sur comment citer cette page',
+ 'cite' => 'Citation',
+ 'cite_page' => 'Page :',
+ 'cite_submit' => 'Citer',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Détails bibliographiques pour {{FULLPAGENAME}} ==
+
+* Nom de la page : {{FULLPAGENAME}}
+* Auteur : contributeurs de {{SITENAME}}
+* Éditeur : ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Dernière modification : {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Récupéré : <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* URL permanente : {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Identifiant de cette version : {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Styles de citations pour {{FULLPAGENAME}} ==
+
+=== [[Style APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> depuis {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Style MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[Style MHRA]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accédé le <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[Style Chicago]] ===
+Contributeurs de {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Style CBE/CSE]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cité le <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponible sur :
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Style Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (visité le <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Entrée [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[En ligne ; accédé le <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Si vous utilisez le package URL dans [[LaTeX]] (<code>\\usepackage{url}</code> quelque part dans le préambule), qui donne des adresses web mieux formatées, utilisez le format suivant :
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[En ligne ; accédé le <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Franco-Provençal (arpetan)
+ * @author ChrisPtDe
+ */
+$messages['frp'] = array(
+ 'cite_article_desc' => 'Apond una pâge spèciâla [[Special:Cite|citacion]] et un lim dens la bouèta d’outils.',
+ 'cite_article_link' => 'Citar ceta pâge',
+ 'tooltip-cite-article' => 'Enformacions sur coment citar ceta pâge',
+ 'cite' => 'Citacion',
+ 'cite_page' => 'Pâge :',
+ 'cite_submit' => 'Citar',
+);
+
+/** Friulian (furlan)
+ * @author Klenje
+ * @author MF-Warburg
+ */
+$messages['fur'] = array(
+ 'cite_article_link' => 'Cite cheste vôs',
+ 'cite' => 'Citazion',
+ 'cite_page' => 'Pagjine:',
+ 'cite_submit' => 'Cree la citazion',
+);
+
+/** Western Frisian (Frysk)
+ * @author SK-luuut
+ * @author Snakesteuben
+ */
+$messages['fy'] = array(
+ 'cite_article_desc' => 'Foeget in [[Special:Cite|spesjale side]] om te sitearjen, lykas in ferwizing nei de helpmiddels, ta.',
+ 'cite_article_link' => 'Sitearje dizze side',
+ 'cite' => 'Sitearje',
+ 'cite_page' => 'Side:',
+ 'cite_submit' => 'Sitearje',
+);
+
+/** Irish (Gaeilge)
+ * @author Alison
+ */
+$messages['ga'] = array(
+ 'cite_article_desc' => 'Cuir [[Special:Cite|deismireacht]] leathanach speisíalta agus nasc bosca uirlisí',
+ 'cite_article_link' => 'Luaigh an lch seo',
+ 'cite' => 'Luaigh',
+ 'cite_page' => 'Leathanach:',
+ 'cite_submit' => 'Luaigh',
+);
+
+/** Galician (galego)
+ * @author Toliño
+ * @author Xosé
+ */
+$messages['gl'] = array(
+ 'cite_article_desc' => 'Engade unha páxina especial de [[Special:Cite|citas]] e unha ligazón na caixa de ferramentas',
+ 'cite_article_link' => 'Citar esta páxina',
+ 'tooltip-cite-article' => 'Información sobre como citar esta páxina',
+ 'cite' => 'Citar',
+ 'cite_page' => 'Páxina:',
+ 'cite_submit' => 'Citar',
+ 'cite_text' => '__NOTOC__
+<div class="mw-specialcite-bibliographic">
+
+== Detalles bibliográficos de "{{FULLPAGENAME}}" ==
+
+* Nome da páxina: {{FULLPAGENAME}}
+* Autor: Colaboradores de {{SITENAME}}
+* Editor: \'\'{{SITENAME}}, {{int:sitesubtitle}}\'\'.
+* Data da última revisión: {{CURRENTDAY}} de {{CURRENTMONTHNAME}} de {{CURRENTYEAR}} ás {{CURRENTTIME}} UTC
+* Data da consulta: <citation>{{CURRENTDAY}} de {{CURRENTMONTHNAME}} de {{CURRENTYEAR}} ás {{CURRENTTIME}} UTC</citation>
+* Enderezo URL permanente: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID da versión da páxina: {{REVISIONID}}
+
+</div>
+<div class="plainlinks mw-specialcite-styles">
+
+== Modelos de referencia bibliográfica de "{{FULLPAGENAME}}" ==
+
+=== [[APA style|Estilo APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTDAY}} de {{CURRENTMONTHNAME}} de {{CURRENTYEAR}}). \'\'{{SITENAME}}, {{int:sitesubtitle}}\'\'. Consultado o <citation>{{CURRENTDAY}} de {{CURRENTMONTHNAME}} de {{CURRENTYEAR}} ás {{CURRENTTIME}}</citation> en {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Estilo MLA]] ===
+"{{FULLPAGENAME}}." \'\'{{SITENAME}}, {{int:sitesubtitle}}\'\'. {{CURRENTDAY}} de {{CURRENTMONTHABBREV}} de {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} de {{CURRENTMONTHABBREV}} de {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Estilo MHRA]] ===
+Colaboradores de {{SITENAME}}, \'{{FULLPAGENAME}}\', \'\'{{SITENAME}}, {{int:sitesubtitle}},\'\' {{CURRENTDAY}} de {{CURRENTMONTHNAME}} de {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [consultado o <citation>{{CURRENTDAY}} de {{CURRENTMONTHNAME}} de {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Estilo Chicago]] ===
+Colaboradores de {{SITENAME}}, "{{FULLPAGENAME}}," \'\'{{SITENAME}}, {{int:sitesubtitle}},\'\' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (consultado o <citation>{{CURRENTDAY}} de {{CURRENTMONTHNAME}} de {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Estilo CBE/CSE]] ===
+Colaboradores de {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTDAY}} de {{CURRENTMONTHABBREV}} de {{CURRENTYEAR}}, {{CURRENTTIME}} UTC [citado o <citation>{{CURRENTDAY}} de {{CURRENTMONTHABBREV}} de {{CURRENTYEAR}}</citation>]. Dispoñible en:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Estilo Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (última visita o <citation>{{CURRENTDAY}} de {{CURRENTMONTHNAME}} de {{CURRENTYEAR}}</citation>).
+
+=== Entrada [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = "{{SITENAME}}",
+ title = "{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}",
+ year = "{{CURRENTYEAR}}",
+ url = "{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}",
+ note = "[En liña; consultado o <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]"
+ }
+
+Ao empregar o paquete "url" do [[LaTeX]] (<code>\\usepackage{url}</code> nalgunha parte do preámbulo), que tende a mostrar os enderezos web nun formato moito máis agradable, poida que prefira o seguinte:
+
+ @misc{ wiki:xxx,
+ author = "{{SITENAME}}",
+ title = "{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}",
+ year = "{{CURRENTYEAR}}",
+ url = "\'\'\'\\url{\'\'\'{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\'\'\'}\'\'\'",
+ note = "[En liña; consultado o <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]"
+ }
+
+
+</div> <!--etiqueta "div" de peche para os "plainlinks" abertos-->',
+);
+
+/** Ancient Greek (ἈÏχαία ἑλληνικὴ)
+ * @author AndreasJS
+ * @author LeighvsOptimvsMaximvs
+ * @author Omnipaedista
+ */
+$messages['grc'] = array(
+ 'cite_article_desc' => 'ΠÏοσθέτει εἰδικὴν δá¼Î»Ï„ον [[Special:Cite|ἀναφοÏῶν]] τινὰ καὶ σÏνδεσμον τινὰ á¼Î½ Ï„á¿· á¼Ïγαλειοκάδῳ',
+ 'cite_article_link' => 'ΆναφέÏειν τήνδε τὴν δέλτον',
+ 'cite' => 'ΜνημονεÏειν',
+ 'cite_page' => 'Δέλτος:',
+ 'cite_submit' => 'ΜνημονεÏειν',
+);
+
+/** Swiss German (Alemannisch)
+ * @author Als-Chlämens
+ * @author Als-Holder
+ * @author Strommops
+ */
+$messages['gsw'] = array(
+ 'cite_article_desc' => 'Ergänzt d [[Special:Cite|Zitierhilf]]-Spezialsyte un e Link im Chaschte Wärchzyyg',
+ 'cite_article_link' => 'Die Site zitiere',
+ 'tooltip-cite-article' => 'Informatione driber, wie mer die Syte cha zitiere',
+ 'cite' => 'Zitierhilf',
+ 'cite_page' => 'Syte:',
+ 'cite_submit' => 'aazeige',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliografischi Aagabe für {{FULLPAGENAME}} ==
+
+* Sytetitel: {{FULLPAGENAME}}
+* Autor(e): {{SITENAME}}-Bearbeiter
+* Herussgeber: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Zitpunkt vo de letschte Bearbeitig: {{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC
+* Abruefdatum: <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC</citation>
+* Permanenti URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Versionsschlüssel: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Zitatstil für {{FULLPAGENAME}} ==
+
+=== [[APA-Stil]] ===
+{{FULLPAGENAME}}. ({{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Abgruefe am <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> vo {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[MLA-Stil]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA-Stil]] ===
+{{SITENAME}}-Bearbeiter, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [abgruefe am <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[Chicago-Stil]] ===
+{{SITENAME}}-Bearbeiter, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (abgruefe am <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>).
+
+=== [[CBE/CSE-Stil]] ===
+{{SITENAME}}-Bearbeiter. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC [zitiert am <citation>{{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}</citation>]. Verfiegbar unter:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook-Stil]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (abgruefe am <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]]-Yytrag ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; abgruefe am <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]\"
+ }
+
+Wänn de s [[LaTeX]]-Modul „url“ (<code>\\usepackage{url}</code> im Bereich vo de Yyleitig) bruuchsch, wo e schöner formatierti Internetadress ussegit, cha die Ussgab, wo folgt, gno werde:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; abgruefe am <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @author Dsvyas
+ * @author KartikMistry
+ * @author Sushant savla
+ */
+$messages['gu'] = array(
+ 'cite_article_desc' => '[[Special:Cite|સંદરà«àª­]] ખાસ પાનà«àª‚ અને સાધન પેટીની કડી ઉમેરે છે',
+ 'cite_article_link' => 'આ પાનà«àª‚ ટાંકો',
+ 'tooltip-cite-article' => 'આ પાનાંને સમરà«àª¥àª¨ કઈ રીતે આપવà«àª‚ તેની માહિતી',
+ 'cite' => 'ટાંકો',
+ 'cite_page' => 'પાનà«àª‚:',
+ 'cite_submit' => 'ટાંકો',
+);
+
+/** Manx (Gaelg)
+ * @author MacTire02
+ */
+$messages['gv'] = array(
+ 'cite_article_desc' => 'Cur duillag [[Special:Cite|symney]] er lheh as kiangley kishtey greie',
+ 'cite_article_link' => 'Symney yn duillag shoh',
+ 'cite' => 'Symney',
+ 'cite_page' => 'Duillag:',
+ 'cite_submit' => 'Symney',
+);
+
+/** Hausa (Hausa)
+ */
+$messages['ha'] = array(
+ 'cite_page' => 'Shafi:',
+);
+
+/** Hawaiian (Hawai`i)
+ * @author Singularity
+ */
+$messages['haw'] = array(
+ 'cite_article_link' => "E ho'Åia i kÄ“ia mea", # Fuzzy
+ 'cite_page' => '‘Ao‘ao:',
+);
+
+/** Hebrew (עברית)
+ * @author Amire80
+ * @author Rotem Liss
+ */
+$messages['he'] = array(
+ 'cite_article_desc' => 'הוספת דף מיוחד וקישור בתיבת ×”×›×œ×™× ×œ[[Special:Cite|ציטוט]]',
+ 'cite_article_link' => 'ציטוט דף זה',
+ 'tooltip-cite-article' => 'מידע כיצד לצטט דף זה',
+ 'cite' => 'ציטוט',
+ 'cite_page' => 'דף:',
+ 'cite_submit' => 'ציטוט',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== מידע ביבליוגרפי על {{FULLPAGENAME}} ==
+
+* ×©× ×”×“×£: {{FULLPAGENAME}}
+* מחבר: תורמי {{SITENAME}}
+* ×ž×•×¦×™× ×œ×ור: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* ת×ריך השינוי ×”×חרון: {{CURRENTDAY}} {{CURRENTMONTHNAMEGEN}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* ת×ריך ×”×חזור: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAMEGEN}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* קישור קבוע: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* קוד זיהוי גרסה: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== סגנונות ציטוט עבור {{FULLPAGENAME}} ==
+
+=== [[APA style]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. ×וחזר <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> מתוך {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|MLA style]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA style]] ===
+תורמי {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAMEGEN}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [×וחזר <citation>{{CURRENTDAY}} {{CURRENTMONTHNAMEGEN}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicago style]] ===
+תורמי {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (×וחזר <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE style]] ===
+תורמי {{SITENAME}}. {{FULLPAGENAME}} [×ינטרנט]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [צוטט <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. זמין בכתובת:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook style]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (ביקור ×חרון <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== ערך [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[מקוון; ×וחזר <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+×›×שר ×ž×©×ª×ž×©×™× ×‘Ö¾URL מחבילת [[LaTeX]] (ב×מצעות כתיבת \\usepackage{url} ×‘×ž×§×•× ×›×œ×©×”×• במבו×), המניבה כתובות ×ינטרנט המעוצבות טוב יותר, יש להעדיף ×ת דרך הכתיבה הב××”:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[מקוון; ×וחזר <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Hindi (हिनà¥à¤¦à¥€)
+ * @author Ansumang
+ * @author Kaustubh
+ */
+$messages['hi'] = array(
+ 'cite_article_desc' => 'à¤à¤• विशेष [[Special:Cite|बाहà¥à¤¯à¤•à¤¡à¤¼à¤¿à¤¯à¤¾à¤‚]] देनेवाला पनà¥à¤¨à¤¾ और टूलबॉकà¥à¤¸à¤•à¤¾ लिंक बनाईयें',
+ 'cite_article_link' => 'इस पनà¥à¤¨à¥‡ को उदà¥à¤˜à¥ƒà¤¤ करें',
+ 'tooltip-cite-article' => 'तथà¥à¤¯ कैसे इस पृषà¥à¤  में संदरà¥à¤­ जोड़ें',
+ 'cite' => 'उदà¥à¤˜à¥„त करें',
+ 'cite_page' => 'पनà¥à¤¨à¤¾:',
+ 'cite_submit' => 'उदà¥à¤˜à¥ƒà¤¤ करें',
+);
+
+/** Fiji Hindi (Latin script) (Fiji Hindi)
+ * @author Karthi.dr
+ */
+$messages['hif-latn'] = array(
+ 'cite_page' => 'Panna:',
+);
+
+/** Hiligaynon (Ilonggo)
+ * @author Jose77
+ */
+$messages['hil'] = array(
+ 'cite_article_link' => 'Tumuron ining artikulo',
+);
+
+/** Croatian (hrvatski)
+ * @author Dalibor Bosits
+ * @author Excaliboor
+ * @author SpeedyGonsales
+ */
+$messages['hr'] = array(
+ 'cite_article_desc' => 'Dodaje posebnu stranicu za [[Special:Cite|citiranje]] i link u okvir za alate',
+ 'cite_article_link' => 'Citiraj ovaj Älanak',
+ 'tooltip-cite-article' => 'Informacije o tome kako citirati ovu stranicu',
+ 'cite' => 'Citiranje',
+ 'cite_page' => 'Stranica:',
+ 'cite_submit' => 'Citiraj',
+);
+
+/** Upper Sorbian (hornjoserbsce)
+ * @author Michawiki
+ */
+$messages['hsb'] = array(
+ 'cite_article_desc' => 'Přidawa specialnu stronu [[Special:Cite|Citowanska pomoc]] a wotkaz w gratowym kašćiku',
+ 'cite_article_link' => 'Nastawk citować',
+ 'tooltip-cite-article' => 'Informacije wo tym, kak tuta strona hodźi so citować',
+ 'cite' => 'Citowanska pomoc',
+ 'cite_page' => 'Strona:',
+ 'cite_submit' => 'pokazać',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliografiske podrobnosće za {{FULLPAGENAME}} ==
+
+* Mjeno strony: {{FULLPAGENAME}}
+* Awtor: sobuskutkowarjo projekta {{SITENAME}}
+* Wudawaćel: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Datum poslednjeje wersije: {{CURRENTDAY}}. {{CURRENTMONTHNAMEGEN}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC
+* Datum wotwołanja: <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAMEGEN}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC</citation>
+* Trajny URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID wersije strony: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Citowanske stile za {{FULLPAGENAME}} ==
+
+=== [[APA stil]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Wotwołany dnja <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> z {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|MLA-stil]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA-stil]] ===
+Sobuskutkowarjo projekta {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [wotwołany dnja <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicago-stil]] ===
+Sobuskutkowarjo projekta {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (wotwołany dnja <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE-stil]] ===
+Sobuskutkowarjo projekta {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [citowany dnja <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. K dispoziciji wot:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook-stil]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (posledni raz wopytany <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]]-zapisk ===
+
+ @misc{ wiki:xxx,
+ awtor = \"{{SITENAME}}\",
+ titul = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ lěto = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; wotwołany dnja <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Hdyž so paket [[LaTeX]] url (<code>\\usepackage{url}</code> něhdźe w preambli) wužiwa, kotryž zwjetša rjeńšo formatowane webadresy zmóžnja, móhli so slědowaće podaća wužiwać:
+
+ @misc{ wiki:xxx,
+ awtor = \"{{SITENAME}}\",
+ titul = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ lěto = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; wotwołany dnja <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAMEGEN}} {{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Haitian (Kreyòl ayisyen)
+ * @author Masterches
+ */
+$messages['ht'] = array(
+ 'cite_article_desc' => 'Ajoute yon paj espesyal [[Special:Cite|sitasyon]] epitou yon lyen nan bwat zouti yo',
+ 'cite_article_link' => 'Site paj sa',
+ 'cite' => 'Sitasyon',
+ 'cite_page' => 'Paj:',
+ 'cite_submit' => 'Site',
+);
+
+/** Hungarian (magyar)
+ * @author Dani
+ * @author Glanthor Reviol
+ * @author Tgr
+ */
+$messages['hu'] = array(
+ 'cite_article_desc' => '[[Special:Cite|Hivatkozás-készítő]] speciális lap és link az eszközdobozba',
+ 'cite_article_link' => 'Hogyan hivatkozz erre a lapra',
+ 'tooltip-cite-article' => 'Információk a lap idézésével kapcsolatban',
+ 'cite' => 'Hivatkozás',
+ 'cite_page' => 'Lap neve:',
+ 'cite_submit' => 'Mehet',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+'''FONTOS MEGJEGYZÉS:''' A legtöbb tanár és szakember nem tartja helyesnek a [[harmadlagos forrás]]ok – mint a lexikonok – kizárólagos forrásként való felhasználását. A Wiki cikkeket háttérinformációnak, vagy a további kutatómunka kiindulásaként érdemes használni.
+
+Mint minden [[{{ns:project}}:Ki írja a Wikipédiát|közösség által készített]] hivatkozásnál, a wiki tartalmában is lehetségesek hibák vagy pontatlanságok: kérjük, több független forrásból ellenőrizd a tényeket és ismerd meg a [[{{ns:project}}:Jogi nyilatkozat|jogi nyilatkozatunkat]], mielőtt a wiki adatait felhasználod.
+
+<div style=\"border: 1px solid grey; background: #E6E8FA; width: 90%; padding: 15px 30px 15px 30px; margin: 10px auto;\">
+
+== {{FULLPAGENAME}} lap adatai ==
+
+* Lap neve: {{FULLPAGENAME}}
+* Szerző: Wiki szerkesztők
+* Kiadó: ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}}''.
+* A legutóbbi változat dátuma: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Letöltés dátuma: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Ãllandó hivatkozás: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Lapváltozat-azonosító: {{REVISIONID}}
+
+Légy szíves, ellenőrizd, hogy ezek az adatok megfelelnek-e a kívánalmaidnak. További információhoz lásd az '''[[{{ns:project}}:Idézés a Wikipédiából|Idézés a Wikipédiából]]''' lapot.
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Idézési stílusok a(z) {{FULLPAGENAME}} laphoz ==
+
+=== APA stílus ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}. {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}}''. Retrieved <citation>{{CURRENTYEAR}}. {{CURRENTMONTHNAME}} {{CURRENTDAY}}. {{CURRENTTIME}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== MLA stílus ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}}''. {{CURRENTYEAR}}. {{CURRENTMONTHABBREV}}. {{CURRENTDAY}}. {{CURRENTTIME}} UTC. <citation>{{CURRENTYEAR}}. {{CURRENTMONTHABBREV}}. {{CURRENTDAY}}. {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== MHRA stílus ===
+Wiki szerkesztők, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}},'' {{CURRENTYEAR}}. {{CURRENTMONTHNAME}} {{CURRENTDAY}}. {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTYEAR}}. {{CURRENTMONTHNAME}} {{CURRENTDAY}}.</citation>]
+
+=== Chicago stílus ===
+Wiki szerkesztők, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTYEAR}}. {{CURRENTMONTHNAME}} {{CURRENTDAY}}.</citation>).
+
+=== CBE/CSE stílus ===
+wiki szerkesztők. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{MediaWiki:Sitesubtitle}}; {{CURRENTYEAR}}. {{CURRENTMONTHABBREV}}. {{CURRENTDAY}}. {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}}. {{CURRENTMONTHABBREV}}. {{CURRENTDAY}}.</citation>]. Elérhető:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== Bluebook stílus ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTYEAR}}. {{CURRENTMONTHNAME}} {{CURRENTDAY}}.</citation>).
+
+=== [[BibTeX]] bejegyzés ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{MediaWiki:Sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Az <code>url</code> nevű [[LaTeX]] csomag használata esetén (<code>\\usepackage{url}</code> a preambulumban), amely a webes hivatkozások formázásában nyújt segítséget, a következő forma ajánlott:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{MediaWiki:Sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+</div> <!--closing \"Citation styles\" div-->", # Fuzzy
+);
+
+/** Armenian (Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶)
+ * @author Teak
+ */
+$messages['hy'] = array(
+ 'cite_article_link' => 'Õ”Õ¡Õ²Õ¾Õ¡Õ®Õ¥Õ¬ Õ°Õ¸Õ¤Õ¾Õ¡Õ®Õ¨', # Fuzzy
+ 'cite' => 'Õ”Õ¡Õ²Õ¾Õ¡Õ®Õ¸Ö‚Õ´',
+ 'cite_page' => 'Ô·Õ».',
+ 'cite_submit' => 'Õ”Õ¡Õ²Õ¾Õ¡Õ®Õ¥Õ¬',
+);
+
+/** Interlingua (interlingua)
+ * @author Malafaya
+ * @author McDutchie
+ */
+$messages['ia'] = array(
+ 'cite_article_desc' => 'Adde un pagina special de [[Special:Cite|citation]] e un ligamine verso le instrumentario',
+ 'cite_article_link' => 'Citar iste pagina',
+ 'tooltip-cite-article' => 'Informationes super como citar iste pagina',
+ 'cite' => 'Citation',
+ 'cite_page' => 'Pagina:',
+ 'cite_submit' => 'Citar',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Detalios bibliographic sur {{FULLPAGENAME}} ==
+
+* Nomine del pagina: {{FULLPAGENAME}}
+* Autor: {{SITENAME}} contributors
+* Editor: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Data del ultime version: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Data de recuperation: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Adresse URL permanente: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID del version del pagina: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Stilos de citation pro {{FULLPAGENAME}} ==
+
+=== [[:en:APA style|Stilo APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Recuperate le <citation>{{CURRENTDAY}} de {{CURRENTMONTHNAME}} {{CURRENTYEAR}} a {{CURRENTTIME}}</citation> ab {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[:en:The MLA style manual|Stilo MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[:en:MHRA Style Guide|Stilo MHRA]] ===
+Contributores a {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' le {{CURRENTDAY}} de {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [consultate le <citation>{{CURRENTDAY}} de {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[:en:The Chicago Manual of Style|Stilo Chicago]] ===
+Contributores a {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (consultate le <citation>{{CURRENTMONTHNAME}} de {{CURRENTDAY}} {{CURRENTYEAR}}</citation>).
+
+=== [[:en:Council of Science Editors|Stilo CBE/CSE]] ===
+Contributores a {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [citate <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponibile a:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[:en:Bluebook|Stilo Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (visitate ultimemente le <citation>le {{CURRENTDAY}} de {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>).
+
+=== Entrata [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[In linea; consultate le <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Quando usar le URL de pacchetto [[LaTeX]] (<code>\\usepackage{url}</code> in qualque parte del preambulo) que tende a resultar in adresses web con formato multo plus agradabile, le sequente pote esser preferite:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[In linea; consultate le <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Indonesian (Bahasa Indonesia)
+ * @author Bennylin
+ * @author Farras
+ * @author IvanLanin
+ */
+$messages['id'] = array(
+ 'cite_article_desc' => 'Menambahkan halaman istimewa [[Special:Cite|kutipan]] dan pranala pada kotak peralatan',
+ 'cite_article_link' => 'Kutip halaman ini',
+ 'tooltip-cite-article' => 'Informasi tentang bagaimana mengutip halaman ini',
+ 'cite' => 'Kutip',
+ 'cite_page' => 'Halaman:',
+ 'cite_submit' => 'Kutip',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Rincian bibliografis untuk {{FULLPAGENAME}} ==
+
+* Nama halaman: {{FULLPAGENAME}}
+* Pengarang: Para kontributor {{SITENAME}}
+* Penerbit: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Tanggal revisi terakhir: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Tanggal akses: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Pranala permanen: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID versi halaman: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks\" style=\"border: 1px solid grey; width: 90%; padding: 15px 30px 15px 30px; margin: 10px auto;\">
+
+== Format pengutipan untuk {{FULLPAGENAME}} ==
+
+=== [[Gaya APA|Format APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Diakses pada <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> dari {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Manual gaya MLA|Format MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Format MHRA]] ===
+Para kontributor {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [diakses pada <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Format Chicago]] ===
+Para kontributor {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (diakses pada <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Format CBE/CSE]] ===
+Para kontributor {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [dikutip pada <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Tersedia dari:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Format Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (terakhir dikunjungi pada <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Entri [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Saat menggunakan url paket [[LaTeX]] (<code>\\usepackage{url}</code> di manapun di bagian pembuka) yang biasanya menghasilkan alamat-alamat web yang diformat dengan lebih baik, cara berikut ini lebih disarankan:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Interlingue (Interlingue)
+ * @author Malafaya
+ */
+$messages['ie'] = array(
+ 'cite_page' => 'Págine:',
+);
+
+/** Igbo (Igbo)
+ * @author Ukabia
+ */
+$messages['ig'] = array(
+ 'cite_article_desc' => 'Nè tí [[Special:Cite|ndéputà]] ihü kárírí na jikodo ngwa á»ru',
+ 'cite_article_link' => 'Députà ihüa',
+ 'tooltip-cite-article' => 'Ùmà màkà otụ ha shi députà ihe na ihüa',
+ 'cite' => 'Ndéputà',
+ 'cite_page' => 'Ihü:',
+ 'cite_submit' => 'Ndéputà',
+);
+
+/** Iloko (Ilokano)
+ * @author Lam-ang
+ */
+$messages['ilo'] = array(
+ 'cite_article_desc' => 'Agnayon ti [[Special:Cite|dakamat]] ti naipangpangruna a panid ken panilpo ti ramramit',
+ 'cite_article_link' => 'Dakamaten daytoy a panid',
+ 'tooltip-cite-article' => 'Pakaammo no kasanu ti panagdakamat daytoy a panid',
+ 'cite' => 'Dakamaten',
+ 'cite_page' => 'Panid:',
+ 'cite_submit' => 'Dakamaten',
+);
+
+/** Ido (Ido)
+ * @author Malafaya
+ */
+$messages['io'] = array(
+ 'cite_article_desc' => 'Ico adjuntas specala pagino e ligilo por [[Special:Cite|citaji]] en utensilo-buxo',
+ 'cite_article_link' => 'Citar ca pagino',
+ 'cite' => 'Citar',
+ 'cite_page' => 'Pagino:',
+ 'cite_submit' => 'Citar',
+);
+
+/** Icelandic (íslenska)
+ * @author S.Örvarr.S
+ * @author לערי ריינה×רט
+ */
+$messages['is'] = array(
+ 'cite_article_link' => 'Vitna í þessa síðu',
+ 'cite' => 'Vitna í síðu',
+ 'cite_page' => 'Síða:',
+ 'cite_submit' => 'Vitna í',
+ 'cite_text' => '*** [[ignored messages]]', # Fuzzy
+);
+
+/** Italian (italiano)
+ * @author Beta16
+ * @author BrokenArrow
+ * @author Ximo17
+ */
+$messages['it'] = array(
+ 'cite_article_desc' => 'Aggiunge una pagina speciale per le [[Special:Cite|citazioni]] e un collegamento negli strumenti',
+ 'cite_article_link' => 'Cita questa pagina',
+ 'tooltip-cite-article' => 'Informazioni su come citare questa pagina',
+ 'cite' => 'Citazione',
+ 'cite_page' => 'Pagina da citare:',
+ 'cite_submit' => 'Crea la citazione',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Dettagli bibliografici per {{FULLPAGENAME}} ==
+
+* Titolo pagina: {{FULLPAGENAME}}
+* Autore: contributori {{SITENAME}}
+* Editore: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Data dell'ultima modifica: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Data estrazione: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* URL permanente: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID versione pagina: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Stili citazioni per {{FULLPAGENAME}} ==
+
+=== [[APA style|Stile APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Estratto il <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> da {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Stile MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Stile MHRA]] ===
+Contributori {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accesso il <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Stile Chicago]] ===
+Contributori {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accesso il <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Stile CBE/CSE]] ===
+Contributori {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [citato il <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponibile su:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Stile Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (ultima visita il <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] entry ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accesso il <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Quando si usa il pacchetto [[LaTeX]] per url (<code>\\usepackage{url}</code> da qualche parte nel preambolo) che in genere dà indirizzi web formattati in modo migliore, è preferibile usare il seguente codice:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accesso il <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Japanese (日本語)
+ * @author Aotake
+ * @author Fryed-peach
+ * @author JtFuruhata
+ * @author Shirayuki
+ * @author Suisui
+ * @author Whym
+ */
+$messages['ja'] = array(
+ 'cite_article_desc' => '[[Special:Cite|引用情報]]ã®ç‰¹åˆ¥ãƒšãƒ¼ã‚¸ã¨ãƒ„ールボックスã®ãƒªãƒ³ã‚¯ã‚’追加ã™ã‚‹',
+ 'cite_article_link' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’引用',
+ 'tooltip-cite-article' => 'ã“ã®ãƒšãƒ¼ã‚¸ã®å¼•ç”¨æ–¹æ³•',
+ 'cite' => '引用',
+ 'cite_page' => 'ページ:',
+ 'cite_submit' => '引用',
+ 'cite_text' => '__NOTOC__
+<div class="mw-specialcite-bibliographic">
+
+== 「{{FULLPAGENAME}}ã€ã®æ›¸èªŒæƒ…å ± ==
+
+* ページå: {{FULLPAGENAME}}
+* 著者: {{SITENAME}}ã¸ã®å¯„稿者ら
+* 発行者: {{int:sitesubtitle}}『{{SITENAME}}ã€
+* 更新日時: {{CURRENTYEAR}}年{{CURRENTMONTHNAME}}{{CURRENTDAY}}日 {{CURRENTTIME}} (UTC)
+* å–得日時: <citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTHNAME}}{{CURRENTDAY}}æ—¥ {{CURRENTTIME}} (UTC)</citation>
+* æ’ä¹…çš„ãªURI: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ページã®ç‰ˆç•ªå·: {{REVISIONID}}
+
+</div>
+<div class="plainlinks mw-specialcite-styles">
+
+== å„種方å¼ã«ã‚ˆã‚‹ã€Œ{{FULLPAGENAME}}ã€ã®æ›¸èªŒè¡¨ç¤º ==
+
+=== [[APAæ–¹å¼]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}å¹´{{CURRENTMONTHNAME}}{{CURRENTDAY}}æ—¥{{CURRENTTIME}}). \'\'{{SITENAME}}, {{int:sitesubtitle}}\'\'. <citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTHNAME}}{{CURRENTDAY}}æ—¥{{CURRENTTIME}}</citation> {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} ã«ã¦é–²è¦§.
+
+=== [[The MLA style manual|MLAæ–¹å¼]] ===
+"{{FULLPAGENAME}}." \'\'{{SITENAME}}, {{int:sitesubtitle}}\'\'. {{CURRENTYEAR}}å¹´{{CURRENTMONTHABBREV}}{{CURRENTDAY}}æ—¥{{CURRENTTIME}} (UTC). <citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTHABBREV}}{{CURRENTDAY}}æ—¥{{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRAæ–¹å¼]] ===
+{{SITENAME}}ã¸ã®å¯„稿者ら, \'{{FULLPAGENAME}}\', \'\'{{SITENAME}}, {{int:sitesubtitle}},\'\'{{CURRENTYEAR}}å¹´{{CURRENTMONTHABBREV}}{{CURRENTDAY}}æ—¥ (UTC), &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTHABBREV}}{{CURRENTDAY}}æ—¥</citation>閲覧]
+
+=== [[The Chicago Manual of Style|Chicagoæ–¹å¼]] ===
+{{SITENAME}}ã¸ã®å¯„稿者ら, "{{FULLPAGENAME}}," \'\'{{SITENAME}}, {{int:sitesubtitle}},\'\' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTHABBREV}}{{CURRENTDAY}}æ—¥</citation>閲覧).
+
+=== [[Council of Science Editors|CBE/CSEæ–¹å¼]] ===
+{{SITENAME}}ã¸ã®å¯„稿者ら. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}}å¹´{{CURRENTMONTHABBREV}}{{CURRENTDAY}}æ—¥{{CURRENTTIME}} (UTC) [<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTHABBREV}}{{CURRENTDAY}}æ—¥</citation>ç¾åœ¨ã§å¼•ç”¨]. 入手元:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebookæ–¹å¼]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTHNAME}}{{CURRENTDAY}}æ—¥</citation>最終訪å•).
+
+=== [[BibTeX]]エントリ ===
+
+ @misc{ wiki:xxx,
+ author = "{{SITENAME}}",
+ title = "{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}",
+ year = "{{CURRENTYEAR}}",
+ url = "{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}",
+ note = "[オンライン; 閲覧日時 <citation>{{CURRENTYEAR}}-{{CURRENTDAY}}-{{CURRENTMONTH}}</citation>]"
+ }
+
+URIã®ä½“è£ã‚’æ•´ãˆã‚‹ãŸã‚ã«[[LaTeX]]ã® url パッケージを用ã„ã‚‹ (プリアンブルã®ã©ã“ã‹ã« <code>\\usepackage{url}</code> ã¨æ›¸ã) å ´åˆã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ãŸæ–¹ãŒã„ã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+
+ @misc{ wiki:xxx,
+ author = "{{SITENAME}}",
+ title = "{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}",
+ year = "{{CURRENTYEAR}}",
+ url = "\'\'\'\\url{\'\'\'{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\'\'\'}\'\'\'",
+ note = "[オンライン; 閲覧日時 <citation>{{CURRENTYEAR}}-{{CURRENTDAY}}-{{CURRENTMONTH}}</citation>]"
+ }
+
+
+</div> <!--closing div for "plainlinks"-->',
+);
+
+/** Jutish (jysk)
+ * @author Huslåke
+ */
+$messages['jut'] = array(
+ 'cite_article_link' => 'Fodnåter denne ertikel',
+ 'cite' => 'Fodnåt',
+ 'cite_page' => 'Side:',
+ 'cite_submit' => 'Fodnåt',
+);
+
+/** Javanese (Basa Jawa)
+ * @author Meursault2004
+ * @author NoiX180
+ */
+$messages['jv'] = array(
+ 'cite_article_desc' => 'Nambahaké kaca astaméwa [[Special:Cite|sitat (kutipan)]] lan pranala ing kothak piranti',
+ 'cite_article_link' => 'Kutip (sitir) kaca iki',
+ 'tooltip-cite-article' => 'Informasi ngenani carané ngutip kaca iki',
+ 'cite' => 'Kutip (sitir)',
+ 'cite_page' => 'Kaca:',
+ 'cite_submit' => 'Kutip (sitir)',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Rincian bibliograpi kanggo {{FULLPAGENAME}} ==
+
+* Jeneng kaca: {{FULLPAGENAME}}
+* Panganggit: {{SITENAME}} kontributor
+* Panyithak: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Tanggal rèvisi pungkasan: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Tanggal njupuk: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* URL permanèn: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID Vèrsi Kaca: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Gagrag kutipan kanggo {{FULLPAGENAME}} ==
+
+=== [[APA style|Gagrag APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Dijupuk <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> saka {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Gagrag MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Gagrag MHRA]] ===
+{{SITENAME}} kontributor, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [diaksès <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Gagrag Chicago]] ===
+{{SITENAME}} kontributor, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (diaksès <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Gagrag CBE/CSE]] ===
+{{SITENAME}} kontributor. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [dikutip <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Sumadhiya saka:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Gagrag Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (ditekani pungkasan <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>).
+
+=== Isi [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; diaksès <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Yèn nganggo url pakèt [[LaTeX]] (<code>\\usepackage{url}</code> ngendi waé nèng pambuka) sing bakal ndadèkaké alamat wèb sing dipormat dadi luwih èndah, sing ngisor iki disaranaké:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; diaksès <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Georgian (ქáƒáƒ áƒ—ული)
+ * @author BRUTE
+ * @author David1010
+ * @author Malafaya
+ * @author გიáƒáƒ áƒ’იმელáƒ
+ */
+$messages['ka'] = array(
+ 'cite_article_desc' => 'áƒáƒ›áƒáƒ¢áƒ”ბს [[Special:Cite|ციტირების]] სპეციáƒáƒšáƒ£áƒ  გვერდს ხელსáƒáƒ¬áƒ§áƒáƒ”ბში',
+ 'cite_article_link' => 'áƒáƒ› გვერდის ციტირებáƒ',
+ 'tooltip-cite-article' => 'ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ áƒáƒ› გვერდის ციტირების შესáƒáƒ®áƒ”ბ',
+ 'cite' => 'ციტირებáƒ',
+ 'cite_page' => 'გვერდი:',
+ 'cite_submit' => 'ციტირებáƒ',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== ბიბლიáƒáƒ’რáƒáƒ¤áƒ˜áƒ£áƒšáƒ˜ დეტáƒáƒšáƒ”ბი სტáƒáƒ¢áƒ˜áƒ˜áƒ¡áƒáƒ—ვის {{FULLPAGENAME}} ==
+
+* გვერდის სáƒáƒ®áƒ”ლი: {{FULLPAGENAME}}
+* áƒáƒ•áƒ¢áƒáƒ áƒ˜: {{SITENAME}} contributors
+* გáƒáƒ›áƒáƒ›áƒ¥áƒ•áƒ”ყნებელი: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* ბáƒáƒšáƒ ცვლილების თáƒáƒ áƒ˜áƒ¦áƒ˜: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის თáƒáƒ áƒ˜áƒ¦áƒ˜: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* მუდმივი URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* გვერდის ვერსიის ID: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== სტილის ციტირებრსტáƒáƒ¢áƒ˜áƒ˜áƒ¡áƒáƒ—ვის {{FULLPAGENAME}} ==
+
+=== [[APA სტილი]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[MLA სტილი]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA სტილი]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[ჩიკáƒáƒ’áƒáƒ¡ სტილი]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[CBE/CSE სტილი]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook სტილი]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]]-ის ჩáƒáƒœáƒáƒ¬áƒ”რი ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+[[LaTeX]]-ის პáƒáƒ™áƒ”ტის url-ს გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ ვებ-გვერდების უფრრთვáƒáƒšáƒ¡áƒáƒ©áƒ˜áƒœáƒ წáƒáƒ áƒ›áƒáƒ“გენისáƒáƒ—ვის (<code>\\usepackage{url}</code> პრეáƒáƒ›áƒ‘ულáƒáƒ¨áƒ˜), სáƒáƒ•áƒáƒ áƒáƒ£áƒ“áƒáƒ“ უკეთესი იქნებრმიუთითáƒáƒ—:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Kazakh (Arabic script) (قازاقشا (تٴوتە)â€)
+ */
+$messages['kk-arab'] = array(
+ 'cite_article_link' => 'بەتتەن دايەكسوز الۋ',
+ 'cite' => 'دايەكسوز الۋ',
+ 'cite_page' => 'بەت اتاۋى:',
+ 'cite_submit' => 'دايەكسوز ال!',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== «{{FULLPAGENAME}}» اتاۋىلى بەتىنىڭ كىتاپنامالىق ەگجەي-تەگجەيلەرى ==
+
+* بەتتىڭ اتاۋى: {{FULLPAGENAME}}
+* اۋتورى: {{SITENAME}} ۇلەسكەرلەرى
+* باسپاگەرى: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* سوڭعى نۇسقاسىنىڭ كەزى: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* الىنعان كەزى: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* تۇراقتى سىلتەمەسى: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* بەت نۇسقاسىنىڭ تەڭدەستىرۋ ٴنومىرى: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== «{{FULLPAGENAME}}» بەتىنىڭ دايەكسوز مانەرلەرى ==
+
+=== [[گوست مانەرى]] ===
+<!-- ([[گوست 7.1|گوست 7.1—2003]] جانە [[گوست 7.82|گوست 7.82—2001]]) -->
+{{SITENAME}}, {{int:sitesubtitle}} [ەلەكتروندى قاينار] : {{FULLPAGENAME}}, نۇسقاسىنىڭ ٴنومىرى {{REVISIONID}}, سوڭعى تۇزەتۋى {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC / ۋىيكىيپەدىييا اۋتورلارى. — ەلەكتروندى دەرەك. — Ùلورىيدا شتاتى. : ۋىيكىيمەدىييا قورى, {{CURRENTYEAR}}. — قاتىناۋ رەتى: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+
+=== [[APA مانەرى]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}'' ماعلۇماتى. {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} بەتىنەن <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> كەزىندە الىنعان.
+
+=== [[MLA مانەرى]] ===
+«{{FULLPAGENAME}}». ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> <{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}>.
+
+=== [[MHRA مانەرى]] ===
+{{SITENAME}} ۇلەسكەرلەرى, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, <{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}> [<citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation> كەزىندە قاتىنالدى]
+
+=== [[شىيكاگو مانەرى]] ===
+{{SITENAME}} ۇلەسكەرى, «{{FULLPAGENAME}}», ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (<citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> كەزىندە قاتىنالدى).
+
+=== [[CBE/CSE مانەرى]] ===
+{{SITENAME}} ۇلەسكەرلەرى. {{FULLPAGENAME}} [ىينتەرنەت]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [<citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation> كەزىندە دايەكسوز الىندى]. قاتىناۋى:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[كوك كىتاپ|كوك كىتاپ مانەرى]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (سوڭعى قارالعانى <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> كەزىندە).
+
+=== [[BibTeX]] جازباسى ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[جەلىدەن; <citation>{{CURRENTDAY}}-{CURRENTMONTHNAME}}-{CURRENTYEAR}}</citation> كەزىندە قاتىنالدى]\"
+ }
+
+[[LaTeX]] بۋماسىنىڭ URL جايىن (<code>\\usepackage{url}</code> كىرىسپەنىڭ قايبىر ورنىندا) قولدانعاندا (ۆەب جايلارىن ونەرلەۋ پىشىمدەۋىن كەلتىرەدى) كەلەسىسىن قالاۋعا بولادى:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[جەلىدەن; <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation> كەزىندە قاتىنالدى]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->", # Fuzzy
+);
+
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Kaztrans
+ */
+$messages['kk-cyrl'] = array(
+ 'cite_article_desc' => '[[Special:Cite|ДәйекÑөз]] арнайы бетін және құрал ÑілтемеÑін қоÑады',
+ 'cite_article_link' => 'Беттен дәйекÑөз алу',
+ 'cite' => 'ДәйекÑөз алу',
+ 'cite_page' => 'Бет атауы:',
+ 'cite_submit' => 'ДәйекÑөз ал!',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== «{{FULLPAGENAME}}» атауылы бетінің кітапнамалық егжей-тегжейлері ==
+
+* Беттің атауы: {{FULLPAGENAME}}
+* Ðуторы: {{SITENAME}} үлеÑкерлері
+* БаÑпагері: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Соңғы нұÑқаÑының кезі: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Ðлынған кезі: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Тұрақты ÑілтемеÑÑ–: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Бет нұÑқаÑының теңдеÑтіру номірі: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== «{{FULLPAGENAME}}» бетінің дәйекÑөз мәнерлері ==
+
+=== [[ГОСТ мәнері]] ===
+<!-- ([[ГОСТ 7.1|ГОСТ 7.1—2003]] және [[ГОСТ 7.82|ГОСТ 7.82—2001]]) -->
+{{SITENAME}}, {{int:sitesubtitle}} [Электронды қайнар] : {{FULLPAGENAME}}, нұÑқаÑының нөмірі {{REVISIONID}}, Ñоңғы түзетуі {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC / Ð£Ð¸ÐºÐ¸Ð¿ÐµÐ´Ð¸Ñ Ð°ÑƒÑ‚Ð¾Ñ€Ð»Ð°Ñ€Ñ‹. — Электронды дерек. — Флорида штаты. : Ð£Ð¸ÐºÐ¸Ð¼ÐµÐ´Ð¸Ñ ÒšÐ¾Ñ€Ñ‹, {{CURRENTYEAR}}. — Қатынау реті: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+
+=== [[APA мәнері]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}'' мағлұматы. {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} бетінен <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> кезінде алынған.
+
+=== [[MLA мәнері]] ===
+«{{FULLPAGENAME}}». ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA мәнері]] ===
+{{SITENAME}} үлеÑкерлері, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [<citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation> кезінде қатыналды]
+
+=== [[Шикаго мәнері]] ===
+{{SITENAME}} үлеÑкері, «{{FULLPAGENAME}}», ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (<citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> кезінде қатыналды).
+
+=== [[CBE/CSE мәнері]] ===
+{{SITENAME}} үлеÑкерлері. {{FULLPAGENAME}} [Интернет]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [<citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation> кезінде дәйекÑөз алынды]. Қатынауы:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Көк кітап|Көк кітап мәнері]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (Ñоңғы қаралғаны <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> кезінде).
+
+=== [[BibTeX]] жазбаÑÑ‹ ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Желіден; <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation> кезінде қатыналды]\"
+ }
+
+[[LaTeX]] бумаÑының URL жайын (<code>\\usepackage{url}</code> кіріÑпенің қайбір орнында) қолданғанда (веб жайларын өнерлеу пішімдеуін келтіреді) келеÑÑ–Ñін қалауға болады:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Желіден; <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation> кезінде қатыналды]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->", # Fuzzy
+);
+
+/** Kazakh (Latin script) (qazaqşa (latın)‎)
+ */
+$messages['kk-latn'] = array(
+ 'cite_article_link' => 'Betten däýeksoz alw',
+ 'cite' => 'Däýeksöz alw',
+ 'cite_page' => 'Bet atawı:',
+ 'cite_submit' => 'Däýeksöz al!',
+ 'cite_text' => "__NOTOC__
+<div style=\"border: 1px solid grey; background: #E6E8FA; width: 90%; padding: 15px 30px 15px 30px; margin: 10px auto;\">
+
+== «{{FULLPAGENAME}}» atawılı betiniñ kitapnamalıq egjeý-tegjeýleri ==
+
+* Bettiñ atawı: {{FULLPAGENAME}}
+* Awtorı: {{SITENAME}} üleskerleri
+* Baspageri: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Soñğı nusqasınıñ kezi: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Alınğan kezi: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Turaqtı siltemesi: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Bet nusqasınıñ teñdestirw nomiri: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks\" style=\"border: 1px solid grey; width: 90%; padding: 15px 30px 15px 30px; margin: 10px auto;\">
+
+== «{{FULLPAGENAME}}» betiniñ däýeksöz mänerleri ==
+
+=== [[GOST mäneri]] ===
+<!-- ([[GOST 7.1|GOST 7.1—2003]] jäne [[GOST 7.82|GOST 7.82—2001]]) -->
+{{SITENAME}}, {{int:sitesubtitle}} [Élektrondı qaýnar] : {{FULLPAGENAME}}, nusqasınıñ nömiri {{REVISIONID}}, soñğı tüzetwi {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC / Wïkïpedïya awtorları. — Élektrondı derek. — Florïda ştatı. : Wïkïmedïya Qorı, {{CURRENTYEAR}}. — Qatınaw reti: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+
+=== [[APA mäneri]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}'' mağlumatı. {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} betinen <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> kezinde alınğan.
+
+=== [[MLA mäneri]] ===
+«{{FULLPAGENAME}}». ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA mäneri]] ===
+{{SITENAME}} üleskerleri, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [<citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation> kezinde qatınaldı]
+
+=== [[Şïkago mäneri]] ===
+{{SITENAME}} üleskeri, «{{FULLPAGENAME}}», ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (<citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> kezinde qatınaldı).
+
+=== [[CBE/CSE mäneri]] ===
+{{SITENAME}} üleskerleri. {{FULLPAGENAME}} [Ãnternet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [<citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation> kezinde däýeksöz alındı]. Qatınawı:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Kök kitap|Kök kitap mäneri]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (soñğı qaralğanı <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> kezinde).
+
+=== [[BibTeX]] jazbası ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Jeliden; <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation> kezinde qatınaldı]\"
+ }
+
+[[LaTeX]] bwmasınıñ URL jaýın (<code>\\usepackage{url}</code> kirispeniñ qaýbir ornında) qoldanğanda (veb jaýların önerlew pişimdewin keltiredi) kelesisin qalawğa boladı:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Jeliden; <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation> kezinde qatınaldı]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->", # Fuzzy
+);
+
+/** Kalaallisut (kalaallisut)
+ * @author Qaqqalik
+ */
+$messages['kl'] = array(
+ 'cite_article_link' => 'Una qupperneq issuaruk',
+);
+
+/** Khmer (ភាសាážáŸ’មែរ)
+ * @author Chhorran
+ * @author Lovekhmer
+ * @author គីមស៊្រុន
+ */
+$messages['km'] = array(
+ 'cite_article_link' => 'ប្រភពនៃទំពáŸážšáž“áŸáŸ‡',
+ 'tooltip-cite-article' => 'áž–áŸážáŸŒáž˜áž¶áž“អំពីការយោងមកអážáŸ’ážáž”áž‘áž“áŸáŸ‡',
+ 'cite' => 'ការយោង',
+ 'cite_page' => 'ទំពáŸážš ៖',
+ 'cite_submit' => 'ដាក់ការយោង',
+);
+
+/** Kannada (ಕನà³à²¨à²¡)
+ * @author Nayvik
+ * @author Shushruth
+ */
+$messages['kn'] = array(
+ 'cite_article_link' => 'ಈ ಪà³à²Ÿà²µà²¨à³à²¨à³ ಉಲà³à²²à³‡à²–ಿಸಿ',
+ 'cite' => 'ಉಲà³à²²à³‡à²–ಿಸಿ',
+ 'cite_page' => 'ಪà³à²Ÿ:',
+);
+
+/** Korean (한국어)
+ * @author Kwj2772
+ * @author ToePeu
+ * @author ê´€ì¸ìƒëžµ
+ * @author ì•„ë¼
+ */
+$messages['ko'] = array(
+ 'cite_article_desc' => '[[Special:Cite|ì¸ìš©]] 특수 문서와 ë„êµ¬ëª¨ìŒ ë§í¬ë¥¼ 추가함',
+ 'cite_article_link' => 'ì´ ë¬¸ì„œ ì¸ìš©í•˜ê¸°',
+ 'tooltip-cite-article' => 'ì´ ë¬¸ì„œë¥¼ ì¸ìš©í•˜ëŠ” ë°©ë²•ì— ëŒ€í•œ ì •ë³´',
+ 'cite' => 'ì¸ìš©',
+ 'cite_page' => '문서:',
+ 'cite_submit' => 'ì¸ìš©',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== {{FULLPAGENAME}}ì˜ ì¶œì²˜ ì •ë³´ ==
+
+* 문서 제목: {{FULLPAGENAME}}
+* ì €ìž: {{SITENAME}} contributors
+* 출íŒì‚¬: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* 최신 ë²„ì „ì˜ ë‚ ì§œ: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* 확ì¸í•œ 날짜: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* 페ì´ì§€ 버전 ID: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== {{FULLPAGENAME}}ì˜ ì¸ìš© ìŠ¤íƒ€ì¼ ==
+
+=== [[APA 스타ì¼]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[MLA 스타ì¼]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA 스타ì¼]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[시카고 스타ì¼|시카고 스타ì¼]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE 스타ì¼]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[블루ë¶|ë¸”ë£¨ë¶ ìŠ¤íƒ€ì¼]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] ì–‘ì‹ ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+[[LaTeX]] 패키지 URL (<code>\\usepackage{url}</code> somewhere in the preamble)ì„ ì‚¬ìš©í•˜ë©´ ë” ì •ëˆëœ 형ì‹ì˜ 웹 주소를 ì–»ì„ ìˆ˜ 있습니다. 다ìŒê³¼ ê°™ì€ ë°©ë²•ì„ ì„ í˜¸í•©ë‹ˆë‹¤:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Karachay-Balkar (къарачай-малкъар)
+ * @author Iltever
+ */
+$messages['krc'] = array(
+ 'cite_article_link' => 'Бетни цитата ÑÑ‚',
+ 'cite' => 'Цитата Ñтиу',
+);
+
+/** Kinaray-a (Kinaray-a)
+ * @author Jose77
+ */
+$messages['krj'] = array(
+ 'cite_page' => 'Pahina:',
+);
+
+/** Colognian (Ripoarisch)
+ * @author Purodha
+ */
+$messages['ksh'] = array(
+ 'cite_article_desc' => 'Brenk de Sondersigg „[[Special:Cite|Ziteere]]“ un ene Link onger „{{int:toolbox}}“.',
+ 'cite_article_link' => 'Di Sigk Zitteere',
+ 'tooltip-cite-article' => 'Enfommazjuhne doh drövver, wi mer heh di Sigg zitteere sullt.',
+ 'cite' => 'Zittiere',
+ 'cite_page' => 'Sigk:',
+ 'cite_submit' => 'ZittÄ—ere',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== De biblejojraafesche Aanjabe för di Sigg „{{FULLPAGENAME}}“ ==
+
+* Siggetittel: {{FULLPAGENAME}}
+* Schriever: Beärbeider {{GRAMMAR:Genitive|{{SITENAME}}}}
+* Rußjävver: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Et läz jändert aam: {{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}} öm {{CURRENTTIME}} Uhr (UTC)
+* Affjeroofe aam: <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}} öm {{CURRENTTIME}} Uhr (UTC)</citation>
+* URL met Beschtand: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Version: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== De Zitatstile för di Sigg „{{FULLPAGENAME}}“ ==
+
+=== Noh dä [[APA iehre Schtil|APA iehren Schtil]] ===
+{{FULLPAGENAME}}. ({{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Affjeroofe aam <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> vun {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== Noh de [[MLA style manual|MLA iehrem Schtil-Handbooch]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== Nohm [[MHRA Style Guide|MHRA Schtil-Föhrer]] ===
+Beärbeider {{GRAMMAR:Genitive|{{SITENAME}}}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [affjeroofe aam <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== Nohm [[Chicago Manual of Style|Chicago-Schtil-Handbooch]] ===
+Beärbeider {{GRAMMAR:Genitive|{{SITENAME}}}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (affjeroofe aam <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>).
+
+=== Nohm Schtil vum [[Council of Science Editors|Rood vun de wesseschafflije Schriever (CBE/CSE)]] ===
+Beärbeider {{GRAMMAR:Genitive|{{SITENAME}}}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC [zitteerd aam <citation>{{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}</citation>]. Affroofbaa onger:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== Nohm Schtil vum [[Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (affjeroofe aam <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>).
+
+=== Als ene [[BibTeX]]-Endraach ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; affjeroofe aam <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]\"
+ }
+
+Dat [[LaTeX]]-Modul „url“ määd_en schönere Internet-Addräß.
+Wam_mer <code>\\usepackage{url}</code> em Einleidongsberett hät, kam_mer dat heh nämme:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; affjeroofe aam <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]\"
+ }
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Kurdish (Latin script) (Kurdî (latînî)‎)
+ * @author George Animal
+ * @author Ghybu
+ */
+$messages['ku-latn'] = array(
+ 'cite_article_link' => 'Qalkirina rûpelê bibîne',
+ 'tooltip-cite-article' => 'Agahdariya li ser qalkirina rûpelê',
+ 'cite_page' => 'Rûpel:',
+);
+
+/** Cornish (kernowek)
+ * @author Kernoweger
+ * @author Kw-Moon
+ */
+$messages['kw'] = array(
+ 'cite_article_link' => 'Devynna an erthygel-ma',
+ 'tooltip-cite-article' => 'Kedhlow war fatel devynna an folen-ma',
+ 'cite' => 'Devynna',
+ 'cite_page' => 'Folen:',
+ 'cite_submit' => 'Devynna',
+);
+
+/** Latin (Latina)
+ * @author MissPetticoats
+ * @author SPQRobin
+ * @author UV
+ */
+$messages['la'] = array(
+ 'cite_article_desc' => ' Addet [[Special:Cite|citation]] specialem paginam et arcam instrumenti', # Fuzzy
+ 'cite_article_link' => 'Hanc paginam citare',
+ 'cite' => 'Paginam citare',
+ 'cite_page' => 'Pagina:',
+ 'cite_submit' => 'Citare',
+);
+
+/** Luxembourgish (Lëtzebuergesch)
+ * @author Kaffi
+ * @author Robby
+ */
+$messages['lb'] = array(
+ 'cite_article_desc' => "Setzt eng [[Special:Cite|Zitatioun op dëser Spezialsäit]] bäi an e Link an d'Geschiirkëscht",
+ 'cite_article_link' => 'Dës Säit zitéieren',
+ 'tooltip-cite-article' => 'Informatioune wéi een dës Säit zitéiere kann',
+ 'cite' => 'Zitéierhëllef',
+ 'cite_page' => 'Säit:',
+ 'cite_submit' => 'weisen',
+);
+
+/** Lezghian (лезги)
+ * @author Migraghvi
+ */
+$messages['lez'] = array(
+ 'cite' => 'Цитата гъин',
+ 'cite_page' => 'Ччин:',
+ 'cite_submit' => 'Цитата гъин',
+);
+
+/** Lingua Franca Nova (Lingua Franca Nova)
+ * @author Malafaya
+ */
+$messages['lfn'] = array(
+ 'cite_page' => 'Paje:',
+);
+
+/** Ganda (Luganda)
+ * @author Kizito
+ */
+$messages['lg'] = array(
+ 'cite_article_link' => 'Juliza olupapula luno',
+ 'tooltip-cite-article' => "Amagezi agakwata ku ngeri ey'okujuliz'olupapula luno",
+ 'cite' => 'Juliza',
+ 'cite_page' => 'Lupapula:',
+ 'cite_submit' => 'Kakasa okujuliza',
+);
+
+/** Limburgish (Limburgs)
+ * @author Ooswesthoesbes
+ * @author Pahles
+ */
+$messages['li'] = array(
+ 'cite_article_desc' => "Voog 'n [[Special:Cite|speciaal pagina óm te citere]] toe en 'ne link derhaer in de gereidsjapskis",
+ 'cite_article_link' => 'Citeer dees pagina',
+ 'tooltip-cite-article' => 'Informatie euver wie se dees pazjena kins citere',
+ 'cite' => 'Citere',
+ 'cite_page' => 'Pagina:',
+ 'cite_submit' => 'Citere',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliografische gegaeves veur {{FULLPAGENAME}} ==
+
+* Paginanaam: {{FULLPAGENAME}}
+* Sjriever: {{SITENAME}}-biedragers
+* Oetgaever: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Tiedstip lèste versie: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Tiedstip geraodplieëgd: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Permanente URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Paginaversienómmer: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Citaatstiel veur {{FULLPAGENAME}} ==
+
+=== [[APA style|APA-stiel]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Geraodplieëg op <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> van {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|MLA-stiel]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA-stiel]] ===
+{{SITENAME}}-biedragers, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [geraodplieëg <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicagostiel]] ===
+{{SITENAME}}-biedragers, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (geraodplieëg <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE-stiel]] ===
+{{SITENAME}}-biedragers. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cetaot van <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Besjikbaar op:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebookstiel]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (geraodplieëg op <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]]-gegaeves ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; geraadpleegd <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+'t Volgendje kan de veurkäör höbben es de [[LaTeX]]-moduul \"url\" wuuertj gebroek (<code>\\usepackage{url}</code> örges in de inleiding), die webadresse sjónder opgemaak:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; geraadpleegd <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** lumbaart (lumbaart)
+ * @author Dakrismeno
+ */
+$messages['lmo'] = array(
+ 'cite_article_link' => 'Cita quela vus chì',
+ 'cite' => 'Cita una vus',
+);
+
+/** Lao (ລາວ)
+ */
+$messages['lo'] = array(
+ 'cite_article_link' => 'ອ້າງອີງບົດຄວາມນີ້',
+ 'cite' => 'ອ້າງອີງ',
+ 'cite_page' => 'ໜ້າ:',
+);
+
+/** Lithuanian (lietuvių)
+ * @author Garas
+ */
+$messages['lt'] = array(
+ 'cite_article_desc' => 'Prideda [[Special:Cite|citavimo]] specialųjį puslapį ir įrankių juostos nuorodą',
+ 'cite_article_link' => 'Cituoti šį puslapį',
+ 'tooltip-cite-article' => 'Informacija kaip cituoti šį puslapį',
+ 'cite' => 'Cituoti',
+ 'cite_page' => 'Puslapis:',
+ 'cite_submit' => 'Cituoti',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== BibliografinÄ—s \"{{FULLPAGENAME}}\" detalÄ—s==
+
+* Puslapio pavadinimas: {{FULLPAGENAME}}
+* Autorius: Projekto \"{{SITENAME}}\" naudotojai
+* LeidÄ—jas: ''{{SITENAME}}''.
+* PaskutinÄ—s versijos data: {{CURRENTYEAR}} {{CURRENTMONTHNAME}} {{CURRENTDAY}} {{CURRENTTIME}} UTC
+* Puslapis gautas: <citation>{{CURRENTYEAR}} {{CURRENTMONTHNAME}} {{CURRENTDAY}} {{CURRENTTIME}} UTC</citation>
+* NuolatinÄ— nuoroda: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Puslapio versijos Nr.: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Citatų stiliai puslapiui \"{{FULLPAGENAME}}\" ==
+
+=== APA stilius ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}} {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}''. Gautas <citation>{{CURRENTYEAR}} {{CURRENTMONTHNAME}} {{CURRENTDAY}} {{CURRENTTIME}}</citation> iš {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== MLA stilius ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}''. {{CURRENTYEAR}} {{CURRENTMONTHNAME}} {{CURRENTDAY}} {{CURRENTTIME}} UTC. <citation>{{CURRENTYEAR}} {{CURRENTMONTHNAME}} {{CURRENTDAY}} {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== MHRA stilius ===
+{{SITENAME}} naudotojai, '{{FULLPAGENAME}}', ''{{SITENAME}},'' {{CURRENTYEAR}} {{CURRENTMONTHNAME}} {{CURRENTDAY}} {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [žiūrėta <citation>{{CURRENTYEAR}} {{CURRENTMONTHNAME}} {{CURRENTDAY}}</citation>]
+
+=== ÄŒikagos stilius ===
+{{SITENAME}} naudotojai, \"{{FULLPAGENAME}}\", ''{{SITENAME}}'', {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (žiūrėta <citation>{{CURRENTYEAR}} {{CURRENTMONTHNAME}} {{CURRENTDAY}}</citation>).
+
+=== CBE/CSE stilius ===
+{{SITENAME}} naudotojai. {{FULLPAGENAME}} [internete]. {{SITENAME}}, {{CURRENTYEAR}} {{CURRENTMONTHNAME}} {{CURRENTDAY}} {{CURRENTTIME}} UTC [cituota <citation>{{CURRENTYEAR}}-{{CURRENTMONTH}}-{{CURRENTDAY2}}</citation>]. Galima rasti:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== Bluebook stilius ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (paskutinį kartą žiūrėta <citation>{{CURRENTYEAR}} {{CURRENTMONTHNAME}} {{CURRENTDAY}}</citation>).
+
+=== BibTeX įrašas ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Žiniatinklyje; žiūrėta <citation>{{CURRENTYEAR}} {{CURRENTMONTHNAME}} {{CURRENTDAY}}</citation>]\"
+ }
+
+Kai naudojate LaTeX paketą ''url'' (<code>\\usepackage{url}</code> kur nors pradžioje), kuris skirtas duoti daug gražiau suformuotus žiniatinklio adresus, patartina naudoti šitaip:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Žiniatinklyje; žiūrėta <citation>{{CURRENTYEAR}} {{CURRENTMONTHNAME}} {{CURRENTDAY}}</citation>]\"
+ }
+
+
+</div>", # Fuzzy
+);
+
+/** Mizo (Mizo ţawng)
+ * @author RMizo
+ */
+$messages['lus'] = array(
+ 'cite_article_desc' => '[[Special:Cite|Ràwnna]] phêk vohbîk leh hmanrawbawm zawmna belhna',
+ 'cite_article_link' => 'Ràwnna',
+ 'tooltip-cite-article' => 'Hë phêk ràwnna chungchanga kaihhruaina',
+ 'cite' => 'Ràwnna',
+ 'cite_page' => 'Phêk:',
+ 'cite_submit' => 'Ràwnna:',
+);
+
+/** Latvian (latviešu)
+ * @author Xil
+ */
+$messages['lv'] = array(
+ 'cite_article_link' => 'Atsauce uz Å¡o lapu',
+ 'cite' => 'Citēšana',
+ 'cite_page' => 'Raksts:',
+ 'cite_submit' => 'ParÄdÄ«t atsauci',
+);
+
+/** Literary Chinese (文言)
+ */
+$messages['lzh'] = array(
+ 'cite_article_link' => '引文',
+ 'cite' => '引文',
+);
+
+/** Eastern Mari (олык марий)
+ * @author Сай
+ */
+$messages['mhr'] = array(
+ 'cite_page' => 'Лаштык:',
+);
+
+/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ */
+$messages['min'] = array(
+ 'cite_article_desc' => 'Manambahan laman istimewa [[Special:Cite|kutipan]] jo pautan pado kotak pakakeh',
+ 'cite_article_link' => 'Kutip laman ko',
+ 'tooltip-cite-article' => 'Informasi caro mangutip laman ko',
+ 'cite' => 'Kutip',
+ 'cite_page' => 'Laman:',
+ 'cite_submit' => 'Kutip',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Rincian bibliografi untuak {{FULLPAGENAME}} ==
+
+* Namo laman: {{FULLPAGENAME}}
+* Pangarang: Para kontributor {{SITENAME}}
+* Panerbit: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Tanggal revisi tarakhia: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC
+* Tanggal akses: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC
+* Pautan parmanen: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Kontributor utamo: [http://vs.aka-online.de/cgi-bin/wppagehiststat.pl?lang=min.wikipedia&page={{urlencode:{{FULLPAGENAME}}}} Sajarah revisi]
+* ID versi laman: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks\" style=\"border: 1px solid grey; width: 90%; padding: 15px 30px 15px 30px; margin: 10px auto;\">
+
+== Format kutipan untuak {{FULLPAGENAME}} ==
+
+=== [[:en:APA style|Format APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}). Pado ''{{SITENAME}}, {{int:sitesubtitle}}''. Diakses pukua {{#time:H:i, j F Y}}, dari {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[:en:The MLA Style Manual|Format MLA]] ===
+Kontributor {{SITENAME}}. \"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. Situs, {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[:en:MHRA Style Guide|Format MHRA]] ===
+Kontributor {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [diakses {{#time:j F Y}}]
+
+=== [[:en:The Chicago Manual of Style|Format Chicago]] ===
+Kontributor {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (diakses {{#time:j F Y}}).
+
+=== [[:en:Council of Science Editors|Format CBE/CSE]] ===
+Kontributor {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{MediaWiki:Sitesubtitle}}; {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC [dikutip pado {{#time:j M Y}}]. Tasadio dari:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[:en:Bluebook|Format Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (tarakhia dikunjuangi pado {{#time:j M Y}}).
+
+=== [[:en:Bluebook#Citation_to_Wikipedia|Bluebook: Harvard JOLT style]] ===
+{{SITENAME}}, ''{{FULLPAGENAME}}'', {{canonicalurl:{{FULLPAGENAME}}}} (opsi deskripsi disiko) (pado {{#time:j M Y, H:i}} GMT).
+
+=== [[:en:American Medical Association|AMA]] style ===
+Kontributor {{SITENAME}}. {{FULLPAGENAME}}. {{SITENAME}}, {{MediaWiki:Sitesubtitle}}. {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. Tasadio pado: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}. Diakses {{#time:j F Y}}.
+
+=== Entri [[:en:BibTeX|BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{MediaWiki:Sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Daring; diakses {{#time:j-F-Y}}]\"
+ }
+
+Bilo manggunoan paket url [[:en:LaTeX|LaTeX]] (<code>\\usepackage{url}</code> di manopun di bagian pambukak) nan biasonyo manghasilkan alamaik-alamaik web nan diformat labiah rancak, caro ko labiah disarankan:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{MediaWiki:Sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Daring; diakses {{#time:j-F-Y}}]\"
+ }
+
+=== Laman rundiang Wikipedia ===
+;Markah: <nowiki>[[</nowiki>{{FULLPAGENAME}}<nowiki>]]</nowiki> (<nowiki>[</nowiki>{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} versi ko<nowiki>]</nowiki>)
+
+;Hasil: [{{canonicalurl:{{FULLPAGENAME}}}} {{FULLPAGENAME}}] ([{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} versi ko])
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Macedonian (македонÑки)
+ * @author Bjankuloski06
+ * @author Brest
+ * @author Misos
+ */
+$messages['mk'] = array(
+ 'cite_article_desc' => 'Додава Ñпецијална Ñтраница за [[Special:Cite|наведување]] и врÑка кон алатникот',
+ 'cite_article_link' => 'Ðаведи ја Ñтраницава',
+ 'tooltip-cite-article' => 'Информации како да ја цитирате оваа Ñтраница',
+ 'cite' => 'Цитат',
+ 'cite_page' => 'Страница:',
+ 'cite_submit' => 'Ðаведи',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== БиблиографÑки податоци за {{FULLPAGENAME}} ==
+
+* Ðазив на Ñтраницата: {{FULLPAGENAME}}
+* Ðвтор: УчеÑници на {{SITENAME}}
+* Извадач: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* ПоÑледна измена: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* ПриÑтапено на: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Трајна URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Ðазнака на верзијата: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Стилови на наведување за {{FULLPAGENAME}} ==
+
+=== [[APA style|Стил APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Стил MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Стил MHRA]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Чикашки Ñтил]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Стил CBE/CSE]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Стил „Сина книга“]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]]-Ð·Ð°Ð¿Ð¸Ñ ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[на интернет; приÑтапено на <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+Кога кориÑтите [[LaTeX]], Ñпакувајте ја URL-адреÑата (<code>\\usepackage{url}</code> некаде во преамбулата), при што Ñе добиваат многу поубаво горматирани адреÑи. Се претпочитаат Ñледниве:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Malayalam (മലയാളം)
+ * @author Praveenp
+ * @author Shijualex
+ */
+$messages['ml'] = array(
+ 'cite_article_desc' => '[[Special:Cite|സൈറàµà´±àµ‡à´·àµ»]] à´Žà´¨àµà´¨ à´ªàµà´°à´¤àµà´¯àµ‡à´• താളàµà´‚, പണി സഞàµà´šà´¿ à´•à´£àµà´£à´¿à´¯àµà´‚ ചേർകàµà´•àµà´¨àµà´¨àµ',
+ 'cite_article_link' => 'à´ˆ താൾ ഉദàµà´§à´°à´¿à´•àµà´•àµà´•',
+ 'tooltip-cite-article' => 'à´ˆ താളിനെ à´Žà´™àµà´™à´¨àµ† അവലംബിതമാകàµà´•à´¾à´‚ à´Žà´¨àµà´¨ വിവരങàµà´™àµ¾',
+ 'cite' => 'ഉദàµà´§à´°à´¿à´•àµà´•àµà´•',
+ 'cite_page' => 'താൾ:',
+ 'cite_submit' => 'ഉദàµà´§à´°à´¿à´•àµà´•àµà´•',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== {{FULLPAGENAME}} താളിനàµà´±àµ† à´—àµà´°à´¨àµà´¥à´¸àµ‚à´šà´¿ വിവരണം ==
+
+* താളിനàµà´±àµ† തലകàµà´•àµ†à´Ÿàµà´Ÿàµ: {{FULLPAGENAME}}
+* à´Žà´´àµà´¤à´¿à´¯à´¤àµ: {{SITENAME}} ലേഖകർ
+* à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´šàµà´šà´¤àµ: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* അവസാനതàµà´¤àµ† നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨àµà´±àµ† തീയതി: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* ശേഖരിചàµà´šàµ തീയതി: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* à´¸àµà´¥à´¿à´°à´‚ à´¯àµ.ആർ.എൽ.: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* താളിനàµà´±àµ† പതിപàµà´ªà´¿à´¨àµà´±àµ† à´.à´¡à´¿.: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== {{FULLPAGENAME}} താളിനàµà´³àµà´³ അവലംബ ശൈലികൾ ==
+=== [[:w:en:APA style|എ.പി.എ. ശൈലി]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} താളിൽ നിനàµà´¨àµà´‚, <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> -നൠശേഖരിചàµà´šà´¤àµ.
+
+=== [[:w:en:The MLA style manual|എം.എൽ.എ. ശൈലി]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} à´¯àµ.à´±àµà´±à´¿.സി.. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[:w:en:MHRA Style Guide|à´Žà´‚.à´Žà´šàµà´šàµ.ആർ.à´Ž. ശൈലി]] ===
+{{SITENAME}} ലേഖകർ, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} യൂ.à´±àµà´±à´¿.സി., &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [à´Žà´Ÿàµà´¤àµà´¤ തീയതി: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[:w:en:The Chicago Manual of Style|à´·à´¿à´•àµà´•à´¾à´—ോ ശൈലി]] ===
+{{SITENAME}} ലേഖകർ, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (à´Žà´Ÿàµà´¤àµà´¤ തീയതി: <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[:w:en:Council of Science Editors|സി.ബി.à´‡./സി.à´Žà´¸àµ.à´‡. ശൈലി]] ===
+{{SITENAME}} ലേഖകർ. {{FULLPAGENAME}} [ഇനàµà´±àµ¼à´¨àµ†à´±àµà´±àµ]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} à´¯àµ.à´±àµà´±à´¿.സി. [അവലംബിചàµà´š തീയതി: <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. ലഭിചàµà´šà´¤àµ:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[:w:en:Bluebook|à´¬àµà´²àµ‚à´¬àµà´•àµà´•àµ ശൈലി]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (അവസാനം പരിശോധിചàµà´šà´¤àµ <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[:w:en:BibTeX|ബിബàµà´Ÿàµ†à´•àµà´¸àµ]] രീതി ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+[[:w:en:LaTeX|ലാറàµà´±à´•àµà´¸àµ]] പാകàµà´•àµ‡à´œàµ യൂ.ആർ.എൽ. ഉപയോഗികàµà´•àµà´•à´¯à´¾à´£àµ†à´™àµà´•à´¿àµ½ (പീഠികയിൽ <code>\\usepackage{url}</code> à´Žà´¨àµà´¨àµ നൽകി), കൂടàµà´¤àµ½ മനോഹരമായി വെബൠവിലാസം നൽകാറàµà´£àµà´Ÿàµ, താഴെകàµà´•àµŠà´Ÿàµà´•àµà´•àµà´¨àµà´¨ രീതി ഉപയോഗികàµà´•à´¾àµ» താതàµà´ªà´°àµà´¯à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨àµ:
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Mongolian (монгол)
+ * @author Chinneeb
+ */
+$messages['mn'] = array(
+ 'cite_article_link' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°ÑÐ½Ð°Ð°Ñ Ð¸Ñˆ татах',
+ 'cite' => 'Иш татах',
+ 'cite_page' => 'ХуудаÑ:',
+ 'cite_submit' => 'Иш татах',
+);
+
+/** Marathi (मराठी)
+ * @author Kaustubh
+ * @author Mahitgar
+ * @author V.narsikar
+ */
+$messages['mr'] = array(
+ 'cite_article_desc' => 'à¤à¤• विशेष [[Special:Cite|बाहà¥à¤¯à¤¦à¥à¤µà¥‡]] देणारे पान व टूलबॉकà¥à¤¸à¤šà¥€ लिंक तयार करा',
+ 'cite_article_link' => 'हे पान उधृत करा',
+ 'tooltip-cite-article' => 'हे पृषà¥à¤  बघणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€à¤šà¥€ माहिती',
+ 'cite' => 'उधृत करा',
+ 'cite_page' => 'पान',
+ 'cite_submit' => 'उधृत करा',
+);
+
+/** Hill Mari (кырык мары)
+ * @author Amdf
+ */
+$messages['mrj'] = array(
+ 'cite_article_link' => 'Ӹлӹшташӹм цитируÑш',
+);
+
+/** Malay (Bahasa Melayu)
+ * @author Anakmalaysia
+ * @author Aurora
+ * @author Aviator
+ */
+$messages['ms'] = array(
+ 'cite_article_desc' => 'Menambah laman khas dan pautan kotak alatan untuk [[Special:Cite|pemetikan]]',
+ 'cite_article_link' => 'Petik laman ini',
+ 'tooltip-cite-article' => 'Maklumat tentang cara memetik laman ini',
+ 'cite' => 'Petik',
+ 'cite_page' => 'Laman:',
+ 'cite_submit' => 'Petik',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Butiran bibliografi {{FULLPAGENAME}} ==
+
+* Nama laman: {{FULLPAGENAME}}
+* Pengarang: Para penyumbang {{SITENAME}}
+* Penerbit: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Tarikh semakan terkini: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Tarikh diambil: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* URL kekal: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID versi laman: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Gaya petikan {{FULLPAGENAME}} ==
+
+=== [[Gaya APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Manual gaya MLA|Gaya MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[Panduan gaya MHRA|Gaya MHRA]] ===
+Para penyumbang {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [dicapai pada <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Gaya Chicago]] ===
+Para penyumbang {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (dicapai pada <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Gaya CBE/CSE]] ===
+Para penyumbang {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [dipetik pada <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Didapati dari:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Gaya Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (kali terakhir dilawati pada <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Lema [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; dicapai pada <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Apabila menggunakan URL pakej [[LaTeX]] (<code>\\usepackage{url}</code> di suatu tempat dalam mukadimah) yang sering memberikan alamat web yang lebih kemas formatnya, ada baiknya menggunakan yang berikut:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; dicapai pada <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Maltese (Malti)
+ * @author Chrisportelli
+ * @author Giangian15
+ */
+$messages['mt'] = array(
+ 'cite_article_desc' => 'Iżżid paġna speċjali għaċ-[[Special:Cite|ċitazzjonijiet]] u ħolqa mal-istrumenti',
+ 'cite_article_link' => 'Iċċita din il-paġna',
+ 'tooltip-cite-article' => 'Informazzjoni fuq kif tiċċita din il-paġna',
+ 'cite' => 'ÄŠitazzjoni',
+ 'cite_page' => 'Paġna:',
+ 'cite_submit' => 'Oħloq ċitazzjoni',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Dettalji biblijografiċi għal {{FULLPAGENAME}} ==
+
+* Titlu tal-paġna: {{FULLPAGENAME}}
+* Awtur: kontributuri ta' {{SITENAME}}
+* Editur: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Data tal-aħħar modifika: {{CURRENTDAY}} ta' {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Data tal-konsultazzjoni tal-paġna: <citation>{{CURRENTDAY}} ta' {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* URL permanenti: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID tal-verżjoni tal-paġna: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Stili ta' ċitazzjoni għal {{FULLPAGENAME}} ==
+
+=== [[APA style|Stil APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. AÄ‹Ä‹essat fil-<citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> minn {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Stil MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} ta' {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Stil MHRA]] ===
+Kontributuri ta' {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} ta' {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [aċċessat fil-<citation>{{CURRENTDAY}} ta' {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Stil Chicago]] ===
+Kontributuri ta' {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (aċċessat f'<citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Stil CBE/CSE]] ===
+Kontributuri ta' {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [iċċitat fl-<citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponibbli fuq:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Stil Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (l-aħħar viżta f'<citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Daħla [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; aċċessat fil-<citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Meta tuża l-pakkett [[LaTeX]] għall-url (<code>\\usepackage{url}</code> f'kwalunkwe parti fil-preambolu) li ġeneralment tagħti indirizzi elettroniċi ifformattjati aħjar, huwa ppreferut li jintuża l-kodiċi segwenti:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; aċċessat fil<citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Mirandese (Mirandés)
+ * @author Malafaya
+ */
+$messages['mwl'] = array(
+ 'cite_page' => 'Páigina:',
+);
+
+/** Erzya (ÑрзÑнь)
+ * @author Amdf
+ * @author Botuzhaleny-sodamo
+ */
+$messages['myv'] = array(
+ 'cite_page' => 'ЛопаÑÑŒ:',
+);
+
+/** Nahuatl (NÄhuatl)
+ * @author Fluence
+ * @author Ricardo gs
+ */
+$messages['nah'] = array(
+ 'cite_article_link' => 'Tlahtoa inÄ«n tlahcuilÅltechcopa',
+ 'cite' => 'TitÄ“nÅtzaz',
+ 'cite_page' => 'ZÄzanilli:',
+ 'cite_submit' => 'TitÄ“nÅtzaz',
+);
+
+/** Min Nan Chinese (Bân-lâm-gú)
+ */
+$messages['nan'] = array(
+ 'cite_article_link' => 'Ãn-iÅng chit phiâ¿ bûn-chiuâ¿',
+ 'cite' => 'Ãn-iÅng',
+ 'cite_page' => 'IaÌh:',
+ 'cite_submit' => 'Ãn-iÅng',
+);
+
+/** Norwegian Bokmål (norsk (bokmål)‎)
+ * @author Nghtwlkr
+ */
+$messages['nb'] = array(
+ 'cite_article_desc' => 'Legger til en [[Special:Cite|siteringsside]] og lenke i verktøy-menyen',
+ 'cite_article_link' => 'Siter denne siden',
+ 'tooltip-cite-article' => 'Informasjon om hvordan denne siden kan siteres',
+ 'cite' => 'Siter',
+ 'cite_page' => 'Side:',
+ 'cite_submit' => 'Siter',
+ 'cite_text' => "__NOTOC__
+<div style=\"width: 90%; text-align: center; font-size: 85%; margin: 10px auto;\">Innhold: [[#APA-stil|APA]] | [[#MLA-stil|MLA]] | [[#MHRA-stil|MHRA]] | [[#Chicago-stil|Chicago]] | [[#CBE/CSE-stil|CSE]] | [[#Bluebook-stil|Bluebook]] | [[#BibTeX|BibTeX]]</div>
+<div style=\"border: 1px solid grey; background: #E6E8FA; width: 90%; padding: 15px 30px 15px 30px; margin: 10px auto;\">
+
+==Bibliografiske detaljer for «[[{{PAGENAME}}|{{FULLPAGENAME}}]]»==
+
+* Sidenavn: [[{{PAGENAME}}|{{FULLPAGENAME}}]]
+* Forfatter: Wikipedia-brukere
+* Utgiver: ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}}''.
+* Dato for forrige revisjon: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Dato sitert: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Permanent lenke: {{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Revisjons-ID: {{REVISIONID}}
+
+<!--Please remember to check for the exact syntax to suit your needs. For more detailed advice, see '''[[Wikipedia:Citing Wikipedia|Citing Wikipedia]]'''.-->
+
+</div>
+<div class=\"plainlinks\" style=\"border: 1px solid grey; width: 90%; padding: 15px 30px 15px 30px; margin: 10px auto;\">
+
+== Siteringsstiler for «[[{{PAGENAME}}|{{FULLPAGENAME}}]]»==
+
+=== [[:en:APA style|APA-stil]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}}''. Hentet <citation>{{CURRENTTIME}}, {{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTDAY}} {{CURRENTYEAR}}</citation> fra {{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+
+
+=== [[:en:The MLA style manual|MLA-stil]] ===
+«{{FULLPAGENAME}}». ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}}''. {{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}}. {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+
+
+=== [[:en:MHRA Style Guide|MHRA-stil]] ===
+Wikipedia-brukere, «{{FULLPAGENAME}}», ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}},'' {{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [besøkt <citation>{{CURRENTDAY}}. {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+
+
+=== [[:en:The Chicago Manual of Style|Chicago-stil]] ===
+Wikipedia-brukere, «{{FULLPAGENAME}}», ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}},'' {{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (besøkt <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+
+
+=== [[:en:Council of Science Editors|CBE/CSE-stil]] ===
+Wikipedia-brukere. {{FULLPAGENAME}} [internett]. {{SITENAME}}, {{MediaWiki:Sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [sitert <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Tilgjengelig fra:
+{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+
+
+=== [[:en:Bluebook|Bluebook-stil]] ===
+{{FULLPAGENAME}}, {{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (sist besøkt <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+
+
+=== [[:en:BibTeX|BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{MediaWiki:Sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[På internett; besøkt <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Om man bruker [[:en:LaTeX|LaTeX]]' pakke-URL (<code>\\usepackage{url}</code> et sted i begynnelsen) som pleier å gi mye finere formaterte internettadresser, kan følgende være foretrukket:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{MediaWiki:Sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[På internett; besøkt <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing \"Citation styles\" div-->", # Fuzzy
+);
+
+/** Low German (Plattdüütsch)
+ * @author Slomox
+ */
+$messages['nds'] = array(
+ 'cite_article_desc' => 'Föögt en [[Special:Cite|Spezialsied för Zitaten]] un en Lenk dorop in’n Kasten Warktüüch to',
+ 'cite_article_link' => 'Disse Siet ziteren',
+ 'cite' => 'Ziteerhelp',
+ 'cite_page' => 'Siet:',
+ 'cite_submit' => 'Ziteren',
+);
+
+/** Nedersaksies (Nedersaksies)
+ * @author Servien
+ */
+$messages['nds-nl'] = array(
+ 'cite_article_desc' => 'Zet n [[Special:Cite|spesiale zied]] derbie um te siteren, en n verwiezing dernaor in de hulpmiddels',
+ 'cite_article_link' => 'Disse zied siteren',
+ 'tooltip-cite-article' => "Informasie over hoe of da'j disse zied siteren kunnen",
+ 'cite' => 'Siteerhulpe',
+ 'cite_page' => 'Zied:',
+ 'cite_submit' => 'Siteren',
+);
+
+/** Nepali (नेपाली)
+ */
+$messages['ne'] = array(
+ 'cite_article_link' => 'लेख उदà¥à¤¦à¤°à¤£ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+ 'cite' => 'उदà¥à¤¦à¤°à¤£ गरà¥à¤¨à¥',
+ 'cite_page' => 'पृषà¥à¤ :',
+);
+
+/** Niuean (ko e vagahau Niuē)
+ * @author Jose77
+ */
+$messages['niu'] = array(
+ 'cite_article_link' => 'Fakakite e tala nei',
+);
+
+/** Dutch (Nederlands)
+ * @author Effeietsanders
+ * @author SPQRobin
+ * @author Siebrand
+ */
+$messages['nl'] = array(
+ 'cite_article_desc' => 'Voegt een [[Special:Cite|speciale pagina]] toe om te citeren, en een koppeling ernaar in de hulpmiddelen',
+ 'cite_article_link' => 'Deze pagina citeren',
+ 'tooltip-cite-article' => 'Informatie over hoe u deze pagina kunt citeren',
+ 'cite' => 'Citeren',
+ 'cite_page' => 'Pagina:',
+ 'cite_submit' => 'Citeren',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliografische gegevens voor {{FULLPAGENAME}} ==
+
+* Paginanaam: {{FULLPAGENAME}}
+* Auteur: {{SITENAME}}-bijdragers
+* Uitgever: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Tijdstip laatste versie: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Tijdstip geraadpleegd: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Permanente URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Paginaversienummer: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Citaatstijlen voor {{FULLPAGENAME}} ==
+
+=== [[APA-stijl]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Geraadpleegd op <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> van {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|MLA-stijl]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA-stijl]] ===
+{{SITENAME}}-bijdragers, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [geraadpleegd <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicago-stijl]] ===
+{{SITENAME}}-bijdragers, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (geraadpleegd <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE-stijl]] ===
+{{SITENAME}}-bijdragers. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [citaat van <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Beschikbaar op:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook-stijl]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (geraadpleegd op <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]]-gegevens ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; geraadpleegd <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Het volgende kan de voorkeur hebben als de [[LaTeX]]-module \"url\" wordt gebruikt (<code>\\usepackage{url}</code> ergens in de inleiding), die webadressen mooier opgemaakt:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; geraadpleegd <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
+ * @author Gunnernett
+ * @author Harald Khan
+ * @author Jon Harald Søby
+ * @author Njardarlogar
+ */
+$messages['nn'] = array(
+ 'cite_article_desc' => 'Legg til ei [[Special:Cite|siteringsside]] og ei lenkje i verktøy-menyen',
+ 'cite_article_link' => 'Siter denne sida',
+ 'tooltip-cite-article' => 'Informasjon om korleis ein siterer denne sida',
+ 'cite' => 'Siter',
+ 'cite_page' => 'Side:',
+ 'cite_submit' => 'Siter',
+);
+
+/** Novial (Novial)
+ * @author MF-Warburg
+ */
+$messages['nov'] = array(
+ 'cite_article_link' => 'Sita disi artikle',
+ 'cite' => 'Sita',
+);
+
+/** Northern Sotho (Sesotho sa Leboa)
+ * @author Mohau
+ */
+$messages['nso'] = array(
+ 'cite_page' => 'Letlakala:',
+);
+
+/** Occitan (occitan)
+ * @author Cedric31
+ */
+$messages['oc'] = array(
+ 'cite_article_desc' => "Apond una pagina especiala [[Special:Cite|citacion]] e un ligam dins la bóstia d'espleches",
+ 'cite_article_link' => 'Citar aqueste article',
+ 'tooltip-cite-article' => 'Informacions sus cossí citar aquesta pagina',
+ 'cite' => 'Citacion',
+ 'cite_page' => 'Pagina :',
+ 'cite_submit' => 'Citar',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Informacions bibliograficas sus {{FULLPAGENAME}} ==
+* Nom de la pagina : {{FULLPAGENAME}}
+* Autors : {{canonicalurl:{{FULLPAGENAME}}|action=history}}
+* Editor : {{SITENAME}}, {{int:sitesubtitle}}''.
+* Darrièra revision : {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Recuperat : <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* URL permanenta : {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Identificant d'aquesta version : {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Estils de citacions per {{FULLPAGENAME}} ==
+
+=== [[Estil APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> dempuèi {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Estil MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[Estil MHRA]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accedit lo <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[Estil Chicago]] ===
+Contributeurs de {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accedit lo <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Estil CBE/CSE]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [citat lo <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponible sus :
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Estil Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (visitat lo <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Entrada [[BibTeX]] ===
+
+@misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[En linha ; accedit lo <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Se utilizatz lo package URL dins [[LaTeX]] (<code>\\usepackage{url}</code> endacòm dins lo preambul), que balha d'adreças web melhor formatadas, utilizatz lo format seguent :
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[En linha ; accedit lo <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Oriya (ଓଡ଼ିଆ)
+ * @author Jnanaranjan Sahu
+ * @author Psubhashish
+ */
+$messages['or'] = array(
+ 'cite_article_desc' => 'à¬à¬• [[Special:Cite|ଆଧାର]] ବିଶେଷ ପୃଷà­à¬ à¬¾ ଓ ଉପକରଣ ପେଡ଼ିର ଲିଙà­à¬• ଯୋଡ଼ିଥାà¬',
+ 'cite_article_link' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬°à­‡ ପà­à¬°à¬®à¬¾à¬£ ଯୋଡ଼ିବେ',
+ 'tooltip-cite-article' => 'à¬à¬• ଆଧାର ଦେବା ଉପରେ ଅଧିକ ବିବରଣୀ',
+ 'cite' => 'ଆଧାର ଦେବେ',
+ 'cite_page' => 'ପୃଷà­à¬ à¬¾:',
+ 'cite_submit' => 'ଆଧାର ଦେବେ',
+ 'cite_text' => '__NOTOC__
+<div class="mw-specialcite-bibliographic">
+
+== {{FULLPAGENAME}}ର ଅଧାରଗତ ବିବରଣୀ ==
+
+
+*ପୃଷà­à¬ à¬¾à¬¨à¬¾à¬®:
+*ଲେଖକ:
+*ପà­à¬°à¬•à¬¾à¬¶à¬•:
+*ଶେଷଥର ପà­à¬¨à¬°à¬¾à¬¬à­ƒà¬¤à¬¿à¬° ତାରିଖ:
+*ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରାଯାଇଥିବା ତାରିଖ:
+*ସà­à¬¥à¬¾à­Ÿà­€ URL:
+*ପୃଷà­à¬ à¬¾ ସଂସà­à¬•à¬°à¬£ ID:
+
+</div>
+<div class="plainlinks mw-specialcite-styles">
+
+== {{FULLPAGENAME}}ର ସଜାଣି ପଦà­à¬§à¬¤à¬¿ ==
+
+=== [[APA style]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). \'\'{{SITENAME}}, {{int:sitesubtitle}}\'\'. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+
+=== [[The MLA style manual|MLA ଶୈଳୀ]] ===
+"{{FULLPAGENAME}}." \'\'{{SITENAME}}, {{int:sitesubtitle}}\'\'. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA ଶୈଳୀ]] ===
+
+{{SITENAME}} contributors, \'{{FULLPAGENAME}}\', \'\'{{SITENAME}}, {{int:sitesubtitle}},\'\' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+=== [[The Chicago Manual of Style|ଚିକାଗୋ ଶୈଳୀ]] ===
+{{SITENAME}} contributors, "{{FULLPAGENAME}}," \'\'{{SITENAME}}, {{int:sitesubtitle}},\'\' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE ଶୈଳୀ]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook ଶୈଳୀ]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] ଦାଖଲ ===
+
+ @misc{ wiki:xxx,
+ author = "{{SITENAME}}",
+ title = "{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}",
+ year = "{{CURRENTYEAR}}",
+ url = "{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}",
+ note = "[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]"
+ }
+
+[[LaTeX]] ପà­à­Ÿà¬¾à¬•à­‡à¬œ url (<code>\\usepackage{url}</code> somewhere in the preamble) ଯାହାକି ଆହà­à¬°à¬¿ ଅଧିକ ସà­à¬¨à­à¬¦à¬°à¬­à¬¾à¬¬à­‡ ସଜାଯାଇଥିବା ୱେବଠିକଣାକୠଯୋଡିଥାଠତାକୠବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରିବାବେଳେ, ନିମà­à¬¨à¬²à¬¿à¬–ିତକୠନଜରକୠଅଣାଯାଇପାରେ:
+@misc{ wiki:xxx,
+ author = "{{SITENAME}}",
+ title = "{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}",
+ year = "{{CURRENTYEAR}}",
+ url = "\'\'\'\\url{\'\'\'{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\'\'\'}\'\'\'",
+ note = "[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]"
+ }
+
+
+</div> <!--closing div for "plainlinks"-->',
+);
+
+/** Ossetic (Ирон)
+ * @author Amikeco
+ */
+$messages['os'] = array(
+ 'cite_page' => 'ФарÑ:',
+);
+
+/** Pangasinan (Pangasinan)
+ */
+$messages['pag'] = array(
+ 'cite_article_link' => 'Bitlaen yan article',
+ 'cite' => 'Bitlaen',
+ 'cite_page' => 'Bolong:',
+ 'cite_submit' => 'Bitlaen',
+);
+
+/** Pampanga (Kapampangan)
+ */
+$messages['pam'] = array(
+ 'cite_article_link' => 'Banggitan ya ing articulung ini',
+ 'cite' => 'Banggitan ya',
+ 'cite_page' => 'Bulung:',
+ 'cite_submit' => 'Banggitan me',
+);
+
+/** Picard (Picard)
+ * @author Geoleplubo
+ */
+$messages['pcd'] = array(
+ 'cite_article_link' => 'Citer chol pache',
+);
+
+/** Deitsch (Deitsch)
+ * @author Xqt
+ */
+$messages['pdc'] = array(
+ 'cite_page' => 'Blatt:',
+);
+
+/** Pälzisch (Pälzisch)
+ * @author Manuae
+ * @author SPS
+ */
+$messages['pfl'] = array(
+ 'cite_article_link' => 'Die Said zidiere',
+ 'cite' => 'Hilf zum Zidiere',
+ 'cite_submit' => 'Schbaischere',
+);
+
+/** Polish (polski)
+ * @author Sp5uhe
+ */
+$messages['pl'] = array(
+ 'cite_article_desc' => 'Dodaje stronę specjalną i guzik w toolbarze edycyjnym do obsługi [[Special:Cite|cytowania]]',
+ 'cite_article_link' => 'Cytowanie tego artykułu',
+ 'tooltip-cite-article' => 'Informacja o tym jak należy cytować tę stronę',
+ 'cite' => 'Bibliografia',
+ 'cite_page' => 'Strona:',
+ 'cite_submit' => 'stwórz wpis bibliograficzny',
+);
+
+/** Piedmontese (Piemontèis)
+ * @author Borichèt
+ * @author Bèrto 'd Sèra
+ * @author Dragonòt
+ */
+$messages['pms'] = array(
+ 'cite_article_desc' => "A gionta na pàgina special [[Special:Cite|citassion]] e n'anliura dj'utiss",
+ 'cite_article_link' => 'Sita sta pàgina-sì',
+ 'tooltip-cite-article' => 'Anformassion ëd com sité sta pàgina-sì.',
+ 'cite' => 'Citassion',
+ 'cite_page' => 'Pàgina da cité:',
+ 'cite_submit' => 'Pronta la citassion',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Detaj bibliogràfich për {{FULLPAGENAME}} ==
+
+* Nòm ëd la pàgina: {{FULLPAGENAME}}
+* Autor: contributor ëd {{SITENAME}}
+* Editor: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Data ëd l'ùltima revision: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Date ëd sitassion: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Adrëssa an sl'aragnà përmanenta: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Identificativ dla version ëd la pàgina: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Stil ëd sitassion për {{FULLPAGENAME}} ==
+
+=== [[stil APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Sità <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> da {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|stil MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|stil MHRA]] ===
+{{SITENAME}} contributor, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|stil Chicago]] ===
+{{SITENAME}} contributor, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (sità <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|stil CBE/CSE]] ===
+{{SITENAME}} contributor. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponìbil da:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|stil Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (ùltima vìsita <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Vos [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[An linia; trovà <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Quand as deuvra la liura al compless [[LaTeX]] (<code>\\usepackage{url}</code> da chèiche part ant l'achit) che a dovrìa dé dj'adrësse dla Ragnà formatà motobin mej, la manera sì-sota a peul esse preferìa:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[An linia; trovà <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Western Punjabi (پنجابی)
+ * @author Khalid Mahmood
+ */
+$messages['pnb'] = array(
+ 'cite_article_desc' => 'جوڑدا اے اک [[Special:Cite|Ø§ØªÛ Ù¾ØªÛ]] خاص صÙÛ ØªÛ’ اوزار ÚˆØ¨Û Ø¬ÙˆÚ‘Û”',
+ 'cite_article_link' => 'ایس صÙÛ’ دا Ø§ØªÛ Ù¾ØªÛ Ø¯ÛŒÙˆ',
+ 'tooltip-cite-article' => 'ایس صÙÛ’ دا کنج Ø§ØªÛ Ù¾ØªÛ Ø¯ÛŒÙˆÙˆ دی دس۔',
+ 'cite' => 'Ø§ØªÛ Ù¾ØªÛ',
+ 'cite_page' => 'صÙÛ:',
+ 'cite_submit' => 'Ø§ØªÛ Ù¾ØªÛ',
+);
+
+/** Pontic (Ποντιακά)
+ * @author Sinopeus
+ */
+$messages['pnt'] = array(
+ 'cite_page' => 'Σελίδα:',
+);
+
+/** Pashto (پښتو)
+ * @author Ahmed-Najib-Biabani-Ibrahimkhel
+ */
+$messages['ps'] = array(
+ 'cite_article_link' => 'د Ø¯Û Ù…Ø® درک',
+ 'tooltip-cite-article' => 'د Ø¯Û Ù…Ø® د درک لګولو مالومات',
+ 'cite' => 'درک',
+ 'cite_page' => 'مخ:',
+ 'cite_submit' => 'درک لګول',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliographic details for {{FULLPAGENAME}} ==
+
+* مخ نوم: {{FULLPAGENAME}}
+* ليکوال: {{SITENAME}} ونډه وال
+* خپرندوی: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* د ÙˆØ±ÙˆØ³ØªÛ Ù…Ø®Ú©ØªÙ†Û Ù†Ûټه: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Date retrieved: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* ØªÙ„Ù¾Ø§ØªÛ ØªÚ“Ù†Ù‡ URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* د مخ Ø¨Ú¼Û Ù¾Ûژند: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Citation styles for {{FULLPAGENAME}} ==
+
+=== [[APA style]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|MLA style]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA style]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicago style]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE style]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook style]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] entry ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+When using the [[LaTeX]] package url (<code>\\usepackage{url}</code> somewhere in the preamble) which tends to give much more nicely formatted web addresses, the following may be preferred:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Portuguese (português)
+ * @author Hamilton Abreu
+ * @author Lijealso
+ * @author Malafaya
+ * @author 555
+ */
+$messages['pt'] = array(
+ 'cite_article_desc' => '[[Special:Cite|Página especial]] que produz uma citação de qualquer outra página na wiki (em vários formatos) e adiciona um link na barra de ferramentas',
+ 'cite_article_link' => 'Citar esta página',
+ 'tooltip-cite-article' => 'Informação sobre como citar esta página',
+ 'cite' => 'Citar',
+ 'cite_page' => 'Página:',
+ 'cite_submit' => 'Citar',
+);
+
+/** Brazilian Portuguese (português do Brasil)
+ * @author Carla404
+ * @author Giro720
+ */
+$messages['pt-br'] = array(
+ 'cite_article_desc' => 'Adiciona uma página especial de [[Special:Cite|citação]] e link para a caixa de ferramentas',
+ 'cite_article_link' => 'Citar esta página',
+ 'tooltip-cite-article' => 'Informação sobre como citar esta página',
+ 'cite' => 'Citar',
+ 'cite_page' => 'Página:',
+ 'cite_submit' => 'Citar',
+);
+
+/** Quechua (Runa Simi)
+ * @author AlimanRuna
+ */
+$messages['qu'] = array(
+ 'cite_article_desc' => "[[Special:Cite|Pukyumanta willanapaq]] sapaq p'anqatam llamk'ana t'asrapi t'inkitapas yapan",
+ 'cite_article_link' => 'Kay qillqamanta willay',
+ 'tooltip-cite-article' => "Ima hinam kay p'anqamanta willay",
+ 'cite' => 'Qillqamanta willay',
+ 'cite_page' => "P'anqa:",
+ 'cite_submit' => 'Qillqamanta willay',
+);
+
+/** Romansh (rumantsch)
+ * @author Kazu89
+ */
+$messages['rm'] = array(
+ 'cite_article_link' => 'Citar questa pagina',
+ 'cite_page' => 'Pagina:',
+);
+
+/** Romani (Romani)
+ * @author Desiphral
+ */
+$messages['rmy'] = array(
+ 'cite_article_link' => 'Prinjardo phandipen ko lekh', # Fuzzy
+ 'cite' => 'Kana trebul phandipen',
+ 'cite_submit' => 'Ja',
+);
+
+/** Romanian (română)
+ * @author Danutz
+ * @author Emily
+ * @author Firilacroco
+ * @author KlaudiuMihaila
+ * @author Mihai
+ * @author Minisarm
+ * @author Stelistcristi
+ */
+$messages['ro'] = array(
+ 'cite_article_desc' => 'Adaugă o pagină specială de [[Special:Cite|citare]] și o legătură în trusa de unelte',
+ 'cite_article_link' => 'Citează acest articol',
+ 'tooltip-cite-article' => 'Informații cu privire la modul de citare a acestei pagini',
+ 'cite' => 'Citare',
+ 'cite_page' => 'Pagină:',
+ 'cite_submit' => 'Deschide informații',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+== Detalii bibliografice pentru {{FULLPAGENAME}} ==
+* Numele paginii: {{FULLPAGENAME}}
+* Autorul: contribuitorii {{SITENAME}}
+* Editor: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Data ultimei revizuiri: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Data preluării: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Legătură permanentă: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID-ul versiunii paginii: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+== Stiluri de citare pentru {{FULLPAGENAME}} ==
+
+=== Stilul APA ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Preluat la <citation>{{CURRENTTIME}} EET, {{CURRENTMONTHNAME}} {{CURRENTDAY}} {{CURRENTYEAR}}</citation> de la {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== Stilul MLA ===
+„{{FULLPAGENAME}}.†''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== Stilul MHRA ===
+Contribuitorii {{SITENAME}}, „{{FULLPAGENAME}}â€, ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accesat la <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== Stilul Chicago ===
+Contribuitorii {{SITENAME}} , „{{FULLPAGENAME}},†''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accesat la <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Stilul CBE/CSE ===
+Contribuitorii {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [citat în <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponibil la: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== Stilul Bluebook ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (ultima vizită la <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Intrare [[BibTeX]] ===
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accesat la <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Când se folosește în pachetul [[LaTeX]] expresia url (<code>\\usepackage{url}</code> undeva în preambul) care trebuie să afișeze adrese mai frumos aranjate, următoarea variantă poate fi preferată:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accesat la <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing \"Citation styles\" div-->",
+);
+
+/** tarandíne (tarandíne)
+ * @author Joetaras
+ */
+$messages['roa-tara'] = array(
+ 'cite_article_desc' => "Aggiunge 'na pàgena speciele de [[Special:Cite|citaziune]] e collegamende a scatele de le struminde",
+ 'cite_article_link' => 'Cite sta pàgene',
+ 'tooltip-cite-article' => "'Mbormaziune sus a cumme se cite sta pàgene",
+ 'cite' => 'Cite',
+ 'cite_page' => 'Pàgene:',
+ 'cite_submit' => 'Cite',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Dettglie bibbliografece pe {{FULLPAGENAME}} ==
+
+* Nome d'a pàgene: {{FULLPAGENAME}}
+* Autore: {{SITENAME}} condrebbutore
+* Pubblecatore: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Sciurne de l'urtema revisione: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Date recuperate: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* URL Permanende: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID d'a versione d'a pàgene: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Stile de citaziune pe {{FULLPAGENAME}} ==
+
+=== [[APA style]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Pigghiate <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> da {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Stile MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Stile MHRA]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Stile Chicago]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Stile CBE/CSE]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Stile Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Endrate [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Quanne ause 'a URL d'u pacchette [[LaTeX]] (<code>\\usepackage{url}</code> da quaccehparte jndr'à 'u preambole) 'u quale serve pe dà 'nu formate megghie a le indirizze web, le seguende sonde le preferite:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Russian (руÑÑкий)
+ * @author Huuchin
+ * @author Kaganer
+ * @author ÐлекÑандр Сигачёв
+ * @author Ильнар
+ */
+$messages['ru'] = array(
+ 'cite_article_desc' => 'ДобавлÑет Ñлужебную Ñтраницу [[Special:Cite|цитированиÑ]] и ÑÑылку в инÑтрументах',
+ 'cite_article_link' => 'Цитировать Ñтраницу',
+ 'tooltip-cite-article' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ том, как цитировать Ñту Ñтраницу',
+ 'cite' => 'Цитирование',
+ 'cite_page' => 'Страница:',
+ 'cite_submit' => 'Процитировать',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== БиблиографичеÑкие данные Ñтатьи {{FULLPAGENAME}} ==
+
+* СтатьÑ: {{FULLPAGENAME}}
+* Ðвтор: {{SITENAME}} авторы
+* Опубликовано: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Дата поÑледнего изменениÑ: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Дата загрузки: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* ПоÑтоÑÐ½Ð½Ð°Ñ ÑÑылка: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Идентификатор верÑии Ñтраницы: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Варианты Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ ÑÑылок на Ñтатью «{{FULLPAGENAME}}» ==
+
+=== Стиль по [http://protect.gost.ru/document.aspx?control=7&id=173511 ГОСТ 7.0.5—2008] (библиографичеÑÐºÐ°Ñ ÑÑылка) ===
+{{FULLPAGENAME}} // {{SITENAME}}. [{{REVISIONYEAR}}—{{REVISIONYEAR}}]. Дата обновлениÑ: {{#time:d.m.Y|{{REVISIONTIMESTAMP}}}}. URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (дата обращениÑ: {{#time:d.m.Y|{{LOCALTIMESTAMP}}}}).
+<div style=\"font-size:smaller; padding-left:2.5em\">
+''Примечание:''
+* Первое из двух обозначений в квадратных Ñкобках — Ñто год ''ÑозданиÑ'' Ñтраницы, второе — год ''поÑледнего изменениÑ'' Ñтраницы. К Ñожалению, движок [[MediaWiki]] в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ позволÑет автоматичеÑки вÑтавить год ''ÑозданиÑ'' в ÑÑылку (ÑÐµÐ¹Ñ‡Ð°Ñ Ñ‚Ð°Ð¼ вмеÑто него также Ñтоит год поÑледнего редактированиÑ). ПоÑмотрите год ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñтраницы в [{{canonicalurl:{{FULLPAGENAME}}|action=history}} иÑтории правок] и замените Ñту цифру.
+* ''Дата обращениÑ'' в формате ДД.ММ.ГГГГ должна быть ÑегоднÑшней. К Ñожалению, движок MediaWiki из-за кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ñ‡Ð½Ð¾ показывает не текущую дату, а дату поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñтраницы.
+</div>
+
+</div>
+
+=== Стиль по [[ГОСТ 7.1|ГОСТ 7.1—2003]] и [[ГОСТ 7.82|ГОСТ 7.82—2001]] (ÑÐ¾ÐºÑ€Ð°Ñ‰Ñ‘Ð½Ð½Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ‡ÐµÑÐºÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ) ===
+{{FULLPAGENAME}} [Электронный реÑурÑ] : {{int:Tagline}} : ВерÑÐ¸Ñ {{REVISIONID}}, ÑÐ¾Ñ…Ñ€Ð°Ð½Ñ‘Ð½Ð½Ð°Ñ Ð² {{CURRENTTIME}} UTC {{CURRENTDAY}} {{CURRENTMONTHNAMEGEN}} {{CURRENTYEAR}} / Ðвторы Википедии // {{SITENAME}}, {{int:sitesubtitle}}. — Электрон. дан. — Сан-ФранциÑко: Фонд Викимедиа, {{CURRENTYEAR}}. — Режим доÑтупа: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+
+=== [[APA style|Стиль APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Стиль MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Стиль MHRA]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|ЧикагÑкий Ñтиль]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Стиль CBE/CSE]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook style]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== ЗапиÑÑŒ в [[BibTeX]] ===
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+При иÑпользовании [[LaTeX]]-пакета url Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ наглÑдного предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÐµÐ±-адреÑов (<code>\\usepackage{url}</code> в преамбуле), вероÑтно, лучше будет указать:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Rusyn (руÑиньÑкый)
+ * @author Gazeb
+ */
+$messages['rue'] = array(
+ 'cite_article_desc' => 'ПридаÑÑ‚ÑŒ шпеціалну Ñторінку [[Special:Cite|Цітації]] Ñ– одказ в понуцї інштрументів',
+ 'cite_article_link' => 'Цітовати Ñторінку',
+ 'tooltip-cite-article' => 'Інформації о тім, Ñк цітовати тоту Ñторінку',
+ 'cite' => 'ЦітованÑ',
+ 'cite_page' => 'Сторінка:',
+ 'cite_submit' => 'Цітовати',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Бібліоґрафічны детайлы к Ñторінцї {{FULLPAGENAME}} ==
+
+* Ðазва Ñторінкы: {{FULLPAGENAME}}
+* Ðвтор: ПриÑпівателї {{grammar:2sg|{{SITENAME}}}}
+* Выдаватель: ''{{MediaWiki:Sitesubtitle}}''.
+* Датум оÑтатнёй управы: {{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}} UTC
+* Датум перевзÑÑ‚Ñ: <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}} UTC</citation>
+* Тырвалый одказ: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Ð†Ð´ÐµÐ½Ñ‚Ñ–Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ€ÐµÐ²Ñ–Ð·Ñ–Ñ— Ñторінкы: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== СпоÑобы Ñ†Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñторінкы {{FULLPAGENAME}} ==
+
+=== ISO 690-2 (1)===
+ПриÑпівателї {{grammar:2sg|{{SITENAME}}}},'' {{FULLPAGENAME}}'' [online], {{int:sitesubtitle}}, c{{CURRENTYEAR}},
+Датум оÑтатнёй ревізії {{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}} UTC,
+[цітоване <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>]
+&lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;
+
+=== ISO 690-2 (2)===
+''{{int:sitesubtitle}}: {{FULLPAGENAME}}'' [online]. c{{CURRENTYEAR}} [цітоване <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>]. ДоÑтупный з WWW: &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;
+
+=== APA ===
+{{FULLPAGENAME}}. ({{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}). ''{{int:sitesubtitle}}''. Здобыто <citation>{{CURRENTTIME}}, {{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation> з {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== MLA ===
+„{{FULLPAGENAME}}.“ ''{{int:sitesubtitle}}''. {{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== MHRA ===
+ПриÑпівателї {{grammar:2sg|{{SITENAME}}}}, '{{FULLPAGENAME}}', ''{{int:sitesubtitle}},'' {{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [здобыто <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>]
+
+=== Chicago ===
+ПриÑпівателї {{grammar:2sg|{{SITENAME}}}}, „{{FULLPAGENAME}},“ ''{{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (здобыто <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>).
+
+=== CBE/CSE ===
+ПриÑпівателї {{grammar:2sg|{{SITENAME}}}}. {{FULLPAGENAME}} [Internet]. {{int:sitesubtitle}}; {{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>]. ДоÑтупне на:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== Bluebook ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (оÑтатнїм разом навщівлено <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; навщівлено <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>]\"
+ }
+
+Під Ñ‡Ð°Ñ Ñ…Ð¾ÑÐ½Ð¾Ð²Ð°Ð½Ñ [[LaTeX]]-ового пакунка url (даґде на початку документа Ñ” напиÑано <code>\\usepackage{url}</code>), котрый Ð´Ð°ÐºÑƒÑ Ð»Ñ—Ð¿ÑˆÐµ форматує вебовы адреÑÑ‹, можете преферовати наÑтупну верзію:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; навщівлено <citation>{{CURRENTDAY}}.&nbsp;{{CURRENTMONTH}}.&nbsp;{{CURRENTYEAR}}</citation>]\"
+ }
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Aromanian (Armãneashce)
+ */
+$messages['rup'] = array(
+ 'cite_article_link' => 'Bagã articlu aistu ca tsitat', # Fuzzy
+);
+
+/** Sanskrit (संसà¥à¤•à¥ƒà¤¤à¤®à¥)
+ * @author Ansumang
+ * @author Shubha
+ */
+$messages['sa'] = array(
+ 'cite_article_desc' => '[[Special:Cite|बाहà¥à¤¯à¤¾à¤§à¤¾à¤°à¥ˆà¤ƒ]] यà¥à¤•à¥à¤¤à¤‚ किञà¥à¤šà¤¨ विशेषपृषà¥à¤ à¤®à¥ उपकरणपेटिकानà¥à¤¬à¤¨à¥à¤§à¤‚ च योजयति',
+ 'cite_article_link' => 'असà¥à¤¯ पृषà¥à¤ à¤¸à¥à¤¯ उलà¥à¤²à¥‡à¤–ः कà¥à¤°à¤¿à¤¯à¤¤à¤¾à¤®à¥',
+ 'tooltip-cite-article' => 'असà¥à¤¯ पृषà¥à¤ à¤¸à¥à¤¯ उलà¥à¤²à¥‡à¤–ः कथमिति विवरणमà¥',
+ 'cite' => 'उदाहरति',
+ 'cite_page' => 'पृषà¥à¤ :',
+ 'cite_submit' => 'उदाहरति',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== {{FULLPAGENAME}} इतà¥à¤¯à¤¸à¥à¤¯ आधारगà¥à¤¨à¤¨à¥à¤¥à¤µà¤¿à¤µà¤°à¤£à¤®à¥ ==
+
+* पृषà¥à¤ à¤¨à¤¾à¤® : {{FULLPAGENAME}}
+* लेखकः: {{SITENAME}} योगदातारः
+* पà¥à¤°à¤•à¤¾à¤¶à¤•à¤ƒ: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* अनà¥à¤¤à¤¿à¤®à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¥‡à¤ƒ दिनाङà¥à¤•à¤ƒ: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* पà¥à¤¨à¤ƒ पà¥à¤°à¤¾à¤ªà¥à¤¤à¤¸à¥à¤¯ दिनाङà¥à¤•à¤ƒ: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* शाशà¥à¤µà¤¤à¤‚ URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* पृषà¥à¤ à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¥‡à¤ƒ ID: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== {{FULLPAGENAME}}इतà¥à¤¯à¤¸à¥à¤¯ आधारविनà¥à¤¯à¤¾à¤¸à¤¾à¤ƒ ==
+
+=== [[APA style]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|MLA style]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA style]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicago style]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE style]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook style]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] पà¥à¤°à¤µà¥‡à¤¶à¤ƒ ===
+
+ @misc{ wiki:xxx,
+ गà¥à¤°à¤¨à¥à¤¥à¤•à¤°à¥à¤¤à¤¾ = \"{{SITENAME}}\",
+ शीरà¥à¤·à¤•à¤®à¥ = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ वरà¥à¤·à¤®à¥ = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ टिपà¥à¤ªà¤£à¥€ = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+[[LaTeX]] असà¥à¤¯ उपयोगावसरे package url (<code>\\usepackage{url}</code> somewhere in the preamble) यचà¥à¤š समीचीनतया पà¥à¤°à¤¾à¤°à¥‚पितानॠजालसङà¥à¤•à¥‡à¤¤à¤¾à¤¨à¥ यचà¥à¤›à¤¤à¤¿, अधोनिरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¤®à¥ à¤à¤·à¥à¤Ÿà¥à¤‚ शकà¥à¤¯à¤®à¥:
+
+ @misc{ wiki:xxx,
+ गà¥à¤°à¤¨à¥à¤¥à¤•à¤°à¥à¤¤à¤¾ = \"{{SITENAME}}\",
+ शीरà¥à¤·à¤•à¤®à¥ = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ वरà¥à¤·à¤®à¥ = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ टिपà¥à¤ªà¤£à¥€ = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Sakha (Ñаха тыла)
+ * @author HalanTul
+ */
+$messages['sah'] = array(
+ 'cite_article_desc' => 'Ðналлаах [[Special:Cite|быһа тардыы]] ÑирÑйин уонна үнүÑтүрүмүөннÑÑ€Ð³Ñ Ñ‹Ð¹Ñ‹Ð½Ð½ÑŒÑ‹Ðº ÑбÑн биÑÑ€ÑÑ€',
+ 'cite_article_link' => 'СирÑйи цитируйдааһын',
+ 'tooltip-cite-article' => 'Бу ÑирÑйи хайдах цитируйдуур туһунан',
+ 'cite' => 'Цитата',
+ 'cite_page' => 'СирÑй:',
+ 'cite_submit' => 'Цитаата',
+);
+
+/** Sicilian (sicilianu)
+ * @author Santu
+ */
+$messages['scn'] = array(
+ 'cite_article_desc' => 'Junci na pàggina spiciali pi li [[Special:Cite|cosi di muntuari]] e nu lijami ntê strumenti',
+ 'cite_article_link' => 'Muntùa sta pàggina',
+ 'cite' => 'Muntuazzioni',
+ 'cite_page' => 'Pàggina di muntari',
+ 'cite_submit' => 'Cria la cosa di muntuari',
+);
+
+/** Sindhi (سنڌي)
+ */
+$messages['sd'] = array(
+ 'cite' => 'حواليو',
+);
+
+/** Samogitian (žemaitėška)
+ * @author Hugo.arg
+ */
+$messages['sgs'] = array(
+ 'cite' => 'CitoutÄ—',
+ 'cite_page' => 'Poslapis:',
+);
+
+/** Sinhala (සිංහල)
+ * @author Budhajeewa
+ * @author නන්දිමිතුරු
+ */
+$messages['si'] = array(
+ 'cite_article_desc' => '[[Special:Cite|උපහරණ]] විà·à·šà·‚ පිටුවක් හ෠මෙවලම්ගොන්න සබà·à¶³à·’යක් එක්කරයි',
+ 'cite_article_link' => 'මෙම පිටුව උපන්â€à¶ºà·à·ƒ කරන්න',
+ 'tooltip-cite-article' => 'මෙම පිටුව උපුට෠දක්වන්නේ කෙසේද යන්න පිළිබඳ තොරතුරු.',
+ 'cite' => 'උපන්â€à¶ºà·à·ƒà¶º',
+ 'cite_page' => 'පිටුව:',
+ 'cite_submit' => 'උපන්â€à¶ºà·à·ƒà¶º',
+);
+
+/** Slovak (slovenÄina)
+ * @author Helix84
+ * @author Martin Kozák
+ */
+$messages['sk'] = array(
+ 'cite_article_desc' => 'Pridáva špeciálnu stránku [[Special:Cite|Citovať]] a odkaz v nástrojoch',
+ 'cite_article_link' => 'Citovať túto stránku',
+ 'tooltip-cite-article' => 'Ako citovať túto stránku',
+ 'cite' => 'Citovať',
+ 'cite_page' => 'Stránka:',
+ 'cite_submit' => 'Citovať',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliografické podrobnosti pre Älánok {{FULLPAGENAME}} ==
+* Názov stránky: {{FULLPAGENAME}}
+* Autor: prispievatelia {{SITENAME}}
+* Vydavateľ: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Dátum poslednej revízie: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Dátum získania: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Permanentný odkaz: {{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID verzie stránky: {{REVISIONID}}
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Å týly citácie pre Älánok {{FULLPAGENAME}} ==
+=== [[:en:APA style|štýl APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Získané <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> z {{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[:en:The MLA style manual|štýl MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA style]] ===
+prispievatelia {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[:en:The Chicago Manual of Style|štýl Chicago]] ===
+prispievatelia {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (prístup <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[:en:Council of Science Editors|štýl CBE/CSE]] ===
+prispievatelia {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Dostupné na: {{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[:en:Bluebook|štýl Bluebook]] ===
+{{FULLPAGENAME}}, {{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (posledná návšteva <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== záznam [[:en:BibTeX|BibTeX]] ===
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ rok = \"{{CURRENTYEAR}}\", url = \"{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ poznámka = \"[Online; prístup <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Pri použití balíka url v [[LaTeX]]e (<code>\\usepackage{url}</code> niekde v úvode), Äo dá oveľa krajÅ¡ie formátované webové adresy, preferuje sa nasledovné:
+ @misc{ wiki:xxx,
+ autor = \"{{SITENAME}}\",
+ názov = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ rok = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ poznámka = \"[Online; prístup <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Slovenian (slovenÅ¡Äina)
+ * @author Dbc334
+ * @author Smihael
+ */
+$messages['sl'] = array(
+ 'cite_article_desc' => 'Doda [[Special:Cite|posebno stran za navedbo vira]] in povezavo v orodno vrstico',
+ 'cite_article_link' => 'Navedba strani',
+ 'tooltip-cite-article' => 'Informacije o tem, kako navajati to stran',
+ 'cite' => 'Navedi',
+ 'cite_page' => 'Stran:',
+ 'cite_submit' => 'Navedi',
+);
+
+/** Southern Sami (Ã…arjelsaemien)
+ * @author M.M.S.
+ */
+$messages['sma'] = array(
+ 'cite_page' => 'Bielie:', # Fuzzy
+);
+
+/** Shona (chiShona)
+ */
+$messages['sn'] = array(
+ 'cite_article_link' => 'Ita cite nyaya iyi', # Fuzzy
+);
+
+/** Albanian (shqip)
+ * @author Olsi
+ */
+$messages['sq'] = array(
+ 'cite_article_desc' => 'Shton një faqe speciale [[Special:Cite|citimi]] dhe një lidhje veglash.',
+ 'cite_article_link' => 'Cito artikullin',
+ 'tooltip-cite-article' => 'Informacion mbi mënyrën e citimit të kësaj faqeje',
+ 'cite' => 'Citate',
+ 'cite_page' => 'Faqja:',
+ 'cite_submit' => 'Citoje',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Të dhënat bibliografike për «{{FULLPAGENAME}}» ==
+* Emri i faqes: {{FULLPAGENAME}}
+* Autori: Redaktorët e {{SITENAME}}-s
+* Publikuesi: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Data e versionit të fundit: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* E marrë më: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Lidhja e përhershme: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Nr i versionit të faqes: {{REVISIONID}}
+</div>
+
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Stile të ndryshme citimi për «{{FULLPAGENAME}}» ==
+
+=== [[Stili citimit APA|APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Stili citimit MLA|MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[Stili citimit MHRA|MHRA]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[Stili i citimit Chicago|Chicago]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Stili i citimit CBE/CSE|CBE/CSE]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Stili i citimit Bluebook|Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Stili i citimit BibTeX|BibTeX]] ===
+@misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+}
+
+When using the [[LaTeX]] package url (<code>\\usepackage{url}</code> somewhere in the preamble) which tends to give much more nicely formatted web addresses, the following may preferred:
+
+@misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+}
+</div><!--closing div for \"plainlinks\"-->", # Fuzzy
+);
+
+/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Millosh
+ * @author Rancher
+ * @author Sasa Stefanovic
+ * @author Жељко Тодоровић
+ * @author Михајло Ðнђелковић
+ */
+$messages['sr-ec'] = array(
+ 'cite_article_desc' => 'Додаје поÑебну Ñтраницу за [[Special:Cite|цитирање]] и везу Ñ Ð°Ð»Ð°Ñ‚ÐºÐ°Ð¼Ð°',
+ 'cite_article_link' => 'БиблиографÑки подаци',
+ 'tooltip-cite-article' => 'Информације о томе како цитирати ову Ñтрану',
+ 'cite' => 'цитат',
+ 'cite_page' => 'Страница:',
+ 'cite_submit' => 'цитат',
+);
+
+/** Serbian (Latin script) (srpski (latinica)‎)
+ * @author Liangent
+ * @author Michaello
+ * @author Жељко Тодоровић
+ */
+$messages['sr-el'] = array(
+ 'cite_article_desc' => 'Dodaje specijalnu stranu za [[Special:Cite|citiranje]] i vezu ka oruđima.',
+ 'cite_article_link' => 'citiranje ove strane',
+ 'tooltip-cite-article' => 'Informacije o tome kako citirati ovu stranu',
+ 'cite' => 'citat',
+ 'cite_page' => 'Stranica:',
+ 'cite_submit' => 'citat',
+);
+
+/** Seeltersk (Seeltersk)
+ * @author Pyt
+ */
+$messages['stq'] = array(
+ 'cite_article_desc' => 'Föiget ju [[Special:Cite|Zitierhilfe]]-Spezioalsiede un n Link in dän Kasten Reewen bietou',
+ 'cite_article_link' => 'Disse Siede zitierje',
+ 'cite' => 'Zitierhälpe',
+ 'cite_page' => 'Siede:',
+ 'cite_submit' => 'anwiese',
+);
+
+/** Sundanese (Basa Sunda)
+ * @author Kandar
+ */
+$messages['su'] = array(
+ 'cite_article_desc' => 'Nambahkeun kaca husus [[Special:Cite|cutatan]] & tumbu toolbox',
+ 'cite_article_link' => 'Cutat kaca ieu',
+ 'tooltip-cite-article' => 'Émbaran ngeunaan cara ngarujuk ieu kaca',
+ 'cite' => 'Cutat',
+ 'cite_page' => 'Kaca:',
+ 'cite_submit' => 'Cutat',
+);
+
+/** Swedish (svenska)
+ * @author Lejonel
+ * @author Per
+ * @author Sannab
+ * @author WikiPhoenix
+ */
+$messages['sv'] = array(
+ 'cite_article_desc' => 'Lägger till en specialsida för [[Special:Cite|källhänvisning]] och en länk i verktygslådan',
+ 'cite_article_link' => 'Citera denna artikel',
+ 'tooltip-cite-article' => 'Information om hur denna sida kan citeras',
+ 'cite' => 'Citera',
+ 'cite_page' => 'Sida:',
+ 'cite_submit' => 'Citera',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliografiska detaljer för {{FULLPAGENAME}} ==
+
+* Sidans namn: {{FULLPAGENAME}}
+* Författare: {{SITENAME}} contributors
+* Utgivare: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Datum för senaste version: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Datum mottaget: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Permanent adress: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Sidans version-ID: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Referensstilar för {{FULLPAGENAME}} ==
+
+=== [[APA style|APA-stil]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Hämtat <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> från {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|MLA-stil]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA-stil]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicago-stil]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE-stil]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook-stil]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]]-uppslag ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; hämtades <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+När man ska använda [[LaTeX]]-paketadressen (<code>\\usepackage{url}</code> någonstans i ingressen) som brukar ge mycket finare formaterade webbadresser, föredras följande:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; hämtades <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--avslutande div för \"plainlinks\"-->",
+);
+
+/** Swahili (Kiswahili)
+ * @author Lloffiwr
+ * @author Stephenwanjau
+ */
+$messages['sw'] = array(
+ 'cite_article_link' => 'Taja ukurasa huu',
+ 'tooltip-cite-article' => 'Taarifa juu ya njia ya kutaja ukurasa huu',
+ 'cite' => 'Taja',
+ 'cite_page' => 'Ukurasa:',
+ 'cite_submit' => 'Taja',
+);
+
+/** Säggssch (Säggssch)
+ * @author Thogo
+ */
+$messages['sxu'] = array(
+ 'cite_article_link' => 'Zidier dän ardiggl hier', # Fuzzy
+ 'cite' => 'Zidierhilfe',
+ 'cite_submit' => 'Zidierhilfe',
+);
+
+/** Silesian (ślůnski)
+ * @author Herr Kriss
+ * @author Timpul
+ */
+$messages['szl'] = array(
+ 'cite_article_link' => 'Cytuj ta zajta',
+ 'cite_page' => 'Zajta:',
+);
+
+/** Tamil (தமிழà¯)
+ * @author Shanmugamp7
+ * @author TRYPPN
+ * @author Trengarasu
+ */
+$messages['ta'] = array(
+ 'cite_article_desc' => 'கரà¯à®µà®¿à®ªà¯ பெடà¯à®Ÿà®¿à®¯à®¿à®²à¯ [[Special:Cite|மேறà¯à®•à¯‹à®³à¯]] காடà¯à®µà®¤à®±à¯à®•à®¾à®© இணைபà¯à®ªà¯ˆ à®à®±à¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®•à®¿à®±à®¤à¯',
+ 'cite_article_link' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ மேறà¯à®•à¯‹à®³à¯ காடà¯à®Ÿà¯',
+ 'tooltip-cite-article' => 'இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ எபà¯à®ªà®Ÿà®¿ மேறà¯à®•à¯‹à®³à®¾à®•à®•à¯ காடà¯à®Ÿà¯à®µà®¤à¯ எனà¯à®ªà®¤à¯ பறà¯à®±à®¿à®¯ விவரமà¯',
+ 'cite' => 'மேறà¯à®•à¯‹à®³à¯ காடà¯à®Ÿà¯',
+ 'cite_page' => 'பகà¯à®•à®®à¯:',
+ 'cite_submit' => 'மேறà¯à®•à¯‹à®³à¯ காடà¯à®Ÿà¯',
+);
+
+/** Telugu (తెలà±à°—à±)
+ * @author Mpradeep
+ * @author Veeven
+ */
+$messages['te'] = array(
+ 'cite_article_desc' => '[[Special:Cite|ఉదహరింపà±]] అనే à°ªà±à°°à°¤à±à°¯à±‡à°• పేజీని & పరికర పెటà±à°Ÿà±† లింకà±à°¨à±€ చేరà±à°¸à±à°¤à±à°‚ది',
+ 'cite_article_link' => 'à°ˆ à°µà±à°¯à°¾à°¸à°¾à°¨à±à°¨à°¿ ఉదహరించండి',
+ 'tooltip-cite-article' => 'à°ˆ పేజీని ఎలా ఉదహరించాలి à°…à°¨à±à°¨à°¦à°¾à°¨à°¿à°ªà±ˆ సమాచారం',
+ 'cite' => 'ఉదహరించà±',
+ 'cite_page' => 'పేజీ:',
+ 'cite_submit' => 'ఉదహరించà±',
+);
+
+/** Tetum (tetun)
+ * @author MF-Warburg
+ */
+$messages['tet'] = array(
+ 'cite_article_desc' => 'Kria pájina espesíal ba [[Special:Cite|sitasaun]] ho ligasaun iha kaixa besi nian',
+ 'cite_article_link' => "Sita pájina ne'e",
+ 'tooltip-cite-article' => "Informasaun kona-ba sita pájina ne'e",
+ 'cite' => 'Sita',
+ 'cite_page' => 'Pájina:',
+ 'cite_submit' => 'Sita',
+);
+
+/** Tajik (Cyrillic script) (тоҷикӣ)
+ * @author Ibrahim
+ */
+$messages['tg-cyrl'] = array(
+ 'cite_article_desc' => 'Саҳифаи вижае барои [[Special:Cite|ёдкард]] изофа мекунад ва пайванде ба ҷаъбаи абзор меафзоÑд',
+ 'cite_article_link' => 'Ðд кардани пайванди ин мақола',
+ 'cite' => 'Ðд кардани ин мақола',
+ 'cite_page' => 'Саҳифа:',
+ 'cite_submit' => 'Ðд кардан',
+);
+
+/** Tajik (Latin script) (tojikī)
+ * @author Liangent
+ */
+$messages['tg-latn'] = array(
+ 'cite_article_desc' => "Sahifai viƶae baroi [[Special:Cite|jodkard]] izofa mekunad va pajvande ba ça'bai abzor meafzojad",
+ 'cite_article_link' => 'Jod kardani pajvandi in maqola',
+ 'cite' => 'Jod kardani in maqola',
+ 'cite_page' => 'Sahifa:',
+ 'cite_submit' => 'Jod kardan',
+);
+
+/** Thai (ไทย)
+ * @author Octahedron80
+ * @author Passawuth
+ */
+$messages['th'] = array(
+ 'cite_article_desc' => 'เพิ่มหน้า[[Special:Cite|อ้างอิง]]พิเศษà¹à¸¥à¸°à¸¥à¸´à¸‡à¸à¹Œà¸šà¸™à¸à¸¥à¹ˆà¸­à¸‡à¹€à¸„รื่องมือ',
+ 'cite_article_link' => 'อ้างอิงหน้านี้',
+ 'tooltip-cite-article' => 'ข้อมูลเà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸§à¸´à¸˜à¸µà¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰',
+ 'cite' => 'อ้างอิง',
+ 'cite_page' => 'หน้า:',
+ 'cite_submit' => 'อ้างอิง',
+);
+
+/** Turkmen (Türkmençe)
+ * @author Hanberke
+ */
+$messages['tk'] = array(
+ 'cite_article_desc' => '[[Special:Cite|Sitirle]] ýörite sahypasyny we gural sandygy çykgydyny goşýar',
+ 'cite_article_link' => 'Sahypany sitirle',
+ 'tooltip-cite-article' => 'Bu sahypany nähili sitirlemelidigi hakda maglumat',
+ 'cite' => 'Sitirle',
+ 'cite_page' => 'Sahypa:',
+ 'cite_submit' => 'Sitirle',
+);
+
+/** Tagalog (Tagalog)
+ * @author AnakngAraw
+ */
+$messages['tl'] = array(
+ 'cite_article_desc' => 'Nagdaragdag ng isang natatanging pahinang [[Special:Cite|pampagtutukoy]] at kawing sa kahon (lalagyan) ng kagamitan',
+ 'cite_article_link' => 'Tukuyin ang pahinang ito',
+ 'tooltip-cite-article' => 'Kabatiran kung paano tutukuyin ang pahinang ito',
+ 'cite' => 'Tukuyin',
+ 'cite_page' => 'Pahina:',
+ 'cite_submit' => 'Tukuyin',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Mga detalyeng pangtalaaklatan para sa {{FULLPAGENAME}} ==
+
+* Pangalan ng pahina: {{FULLPAGENAME}}
+* May-akda: {{SITENAME}} contributors
+* Tagapaglathala: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Petsa ng huling pagbabago: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Petsa ng pagbawi: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Pamalagiang URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID ng Bersiyon ng Pahina: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Mga estilo ng pagbanggit para sa {{FULLPAGENAME}} ==
+
+=== [[Estilo ng APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Nabawi noong <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Estilo ng MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Estilo ng MHRA]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [napuntahan noong <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Estilo ng Chicago]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (napuntahan noong <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Estilo ng CBE/CSE]] ===
+Mga tagapag-ambag sa {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [pagbanggit <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Makukuha mula sa: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Estilo ng Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (huling dinalaw noong <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Lahok sa [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ may-akda = \"{{SITENAME}}\",
+ pamagat = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ taon = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ tala = \"[Nasa linya; napuntahan noong <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Kapag ginagamit ang pakete ng url ng [[LaTeX]] (<code>\\usepackage{url}</code> saan man sa loob ng punong-sabi) na may gawi na makapagbigay ng lalo pang may mahusay na kaanyuan na mga tirahang pangsangkalambatan, ang mga sumusunod ay maaaring mas nanaisin:
+
+ @misc{ wiki:xxx,
+ may-akda = \"{{SITENAME}}\",
+ pamagat = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ taon = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ tala = \"[Nasa linya; napuntahan noong <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** толышә зывон (толышә зывон)
+ * @author ГуÑейн
+ */
+$messages['tly'] = array(
+ 'cite_page' => 'Сәһифә:',
+);
+
+/** Tswana (Setswana)
+ */
+$messages['tn'] = array(
+ 'cite_article_link' => 'Nopola mokwalo o', # Fuzzy
+);
+
+/** Tongan (lea faka-Tonga)
+ */
+$messages['to'] = array(
+ 'cite_article_link' => 'Lau ki he kupú ni', # Fuzzy
+ 'cite' => 'Lau ki he',
+);
+
+/** Turkish (Türkçe)
+ * @author Erkan Yilmaz
+ * @author Joseph
+ * @author Srhat
+ * @author UÄŸur BaÅŸak
+ */
+$messages['tr'] = array(
+ 'cite_article_desc' => '[[Special:Cite|Alıntı]] özel sayfa ve araç kutusu linkini ekler',
+ 'cite_article_link' => 'Sayfayı kaynak göster',
+ 'tooltip-cite-article' => 'Bu sayfanın nasıl alıntı yapılacağı hakkında bilgi',
+ 'cite' => 'Kaynak göster',
+ 'cite_page' => 'Sayfa:',
+ 'cite_submit' => 'Belirt',
+ 'cite_text' => "__NOTOC__
+<div style=\"width: 90%; text-align: center; font-size: 85%; margin: 10px auto;\">İçindekiler: [[#APA stil|APA]] | [[#MLA stil|MLA]] | [[#MHRA stil|MHRA]] | [[#Chicago stil|Chicago]] | [[#CBE/CSE stil|CSE]] | [[#Bluebook stil|Bluebook]] | [[#BibTeX stil|BibTeX]]</div>
+
+'''NOTE:''' Most teachers and professionals do not consider encyclopedias citable reference material for most purposes. Wikipedia articles should be used for background information, and as a starting point for further research, but not as a final source for important facts.
+
+As with any [[Vikipedi:Vikipedi kim yazar|community-built]] reference, there is a possibility for error in Wikipedia's content — please check your facts against multiple sources and read our [[Vikipedi:Genel_Bilgi_Paktı|disclaimers]] for more information.
+
+<div style=\"border: 1px solid grey; background: #E6E8FA; width: 90%; padding: 15px 30px 15px 30px; margin: 10px auto;\">
+
+== \"{{FULLPAGENAME}}\" sayfasının [[bibliyografya|bibliyografik]] detayları ==
+
+* Sayfanın adı: {{FULLPAGENAME}}
+* Yazar(lar): Vikipedi'de katkıda bulunanlar, bak [{{fullurl:{{FULLPAGENAME}}|action=history}} sayfanın geçmişi]
+* Editör: ''{{SITENAME}}, {{MedyaViki:Sitesubtitle}}''.
+* Son düzenleme tarih: {{CURRENTDAY}}. {{CURRENTMONTHNAME}}
+* Son isteme tarih: {{CURRENTYEAR}}, {{CURRENTTIME}} ([[UTC]])
+* Geçerli URL: {{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Sayfanın versiyon no.: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks\" style=\"border: 1px solid grey; width: 90%; padding: 15px 30px 15px 30px; margin: 10px auto;\">
+
+== \"{{FULLPAGENAME}}\" sayfanın kaynak olarak gösterim imkanları ==
+
+=== [[APA]] stil ===
+Wikipedia contributors ({{CURRENTYEAR}}). {{FULLPAGENAME}}. ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[MLA]] stil ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA]] stil ===
+Wikipedia contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[Chicago]] stil ===
+Wikipedia contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{MediaWiki:Sitesubtitle}},'' {{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[CBE/CSE]] stil ===
+Wikipedia contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{MediaWiki:Sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook]] stil ===
+{{FULLPAGENAME}}, {{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] stil ===
+
+ @misc{ wiki:xxx,
+ yazar(lar) = \"{{SITENAME}}\",
+ başlık = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{MediaWiki:Sitesubtitle}}\",
+ yıl = \"{{CURRENTYEAR}}\",
+ url = \"{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ not = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+When using the [[LaTeX]] package url (<code>\\usepackage{url}</code> somewhere in the preamble) which tends to give much more nicely formatted web addresses, the following may preferred:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{MediaWiki:Sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{fullurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing \"Citation styles\" div-->
+
+<noinclude>
+[[de:MediaWiki:Cite_text]]
+[[en:MediaWiki:Cite text]]
+</noinclude>", # Fuzzy
+);
+
+/** Turoyo (Ṫuroyo)
+ * @author Ariyo
+ */
+$messages['tru'] = array(
+ 'cite_page' => 'Faá¹­o:',
+);
+
+/** Tsonga (Xitsonga)
+ * @author Thuvack
+ */
+$messages['ts'] = array(
+ 'cite_page' => 'Tluka:',
+);
+
+/** Tatar (Cyrillic script) (татарча)
+ * @author Ильнар
+ */
+$messages['tt-cyrl'] = array(
+ 'cite_article_desc' => 'МахÑÑƒÑ [[Special:Cite|күчермәләү]] битен һәм җиһазларга Ñылтамалар Ó©Ñти',
+ 'cite_article_link' => 'Бу битне күчермәләү',
+ 'tooltip-cite-article' => 'Бу битне ничек күчермәләү турындагы мәгълүмат',
+ 'cite' => 'Күчермәләү',
+ 'cite_page' => 'Бит:',
+ 'cite_submit' => 'Күчермәләү',
+);
+
+/** Central Atlas Tamazight (ⵜⴰⵎⴰⵣⵉⵖⵜ)
+ * @author Tifinaghes
+ */
+$messages['tzm'] = array(
+ 'cite_page' => 'ⵜⴰⵙâµâ´°:',
+);
+
+/** Udmurt (удмурт)
+ * @author ОйЛ
+ */
+$messages['udm'] = array(
+ 'cite_article_link' => 'Кызьы Ñо ÑтатьÑез цитировать кароно',
+);
+
+/** Uyghur (Arabic script) (ئۇيغۇرچە)
+ * @author Sahran
+ */
+$messages['ug-arab'] = array(
+ 'cite_page' => 'بەت:',
+);
+
+/** Uyghur (Latin script) (Uyghurche)
+ * @author Jose77
+ */
+$messages['ug-latn'] = array(
+ 'cite_article_link' => 'Bu maqalini ishliting',
+ 'cite_page' => 'Bet:',
+);
+
+/** Ukrainian (українÑька)
+ * @author Ahonc
+ * @author Prima klasy4na
+ * @author Ðта
+ */
+$messages['uk'] = array(
+ 'cite_article_desc' => 'Додає Ñпеціальну Ñторінку [[Special:Cite|цитуваннÑ]] Ñ– поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² інÑтрументах',
+ 'cite_article_link' => 'Цитувати Ñторінку',
+ 'tooltip-cite-article' => 'Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ те, Ñк цитувати цю Ñторінку',
+ 'cite' => 'ЦитуваннÑ',
+ 'cite_page' => 'Сторінка:',
+ 'cite_submit' => 'Процитувати',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Бібліографічні дані Ñтатті {{FULLPAGENAME}} ==
+
+* Ðазва: {{FULLPAGENAME}}
+* Ðвтор: {{SITENAME}} contributors
+* Опубліковано: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Дата оÑтанньої зміни: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Дата цитуваннÑ: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* ПоÑтійне поÑиланнÑ: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID верÑÑ–Ñ— Ñторінки: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Варіанти Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ñилань на {{FULLPAGENAME}} ==
+
+=== [[Стиль APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Цитовано <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> з {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Стиль MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Стиль MHRA]] ===
+ДопиÑувачі {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [цитовано <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Стиль Chicago]] ===
+ДопиÑувачі {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (цитовано <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Стиль CBE/CSE]] ===
+ДопиÑувачі {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. ДоÑтупно з:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Стиль Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (оÑтанній переглÑд <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Ð—Ð°Ð¿Ð¸Ñ [[BibTeX]] ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Онлайн; цитовано <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+При викориÑтанні [[LaTeX]]-пакета url (<code>\\usepackage{url}</code> у преамбулі), Ñкий Ñ‚Ñжіє до кращого Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÐµÐ±-адреÑ, мабуть, краще буде вказати таке:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Онлайн; цитовано <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Urdu (اردو)
+ */
+$messages['ur'] = array(
+ 'cite_article_link' => 'مضمون کا Ø­ÙˆØ§Ù„Û Ø¯ÛŒÚº',
+ 'cite' => 'حوالÛ',
+ 'cite_page' => 'صÙØ­Û:',
+);
+
+/** Uzbek (oʻzbekcha)
+ * @author CoderSI
+ */
+$messages['uz'] = array(
+ 'cite_article_link' => 'Sahifadan matn parchasi ajratish',
+);
+
+/** vèneto (vèneto)
+ * @author Candalua
+ * @author GatoSelvadego
+ */
+$messages['vec'] = array(
+ 'cite_article_desc' => 'Zonta na pagina speciale par le [[Special:Cite|citazion]] e un colegamento nei strumenti',
+ 'cite_article_link' => 'Cita sta pagina',
+ 'tooltip-cite-article' => 'Informassion su come citar sta pagina',
+ 'cite' => 'Citazion',
+ 'cite_page' => 'Pagina da citar:',
+ 'cite_submit' => 'Crea la citazion',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Detaji bibliografisi par {{FULLPAGENAME}} ==
+
+* Titoło pàjina: {{FULLPAGENAME}}
+* Autor: contributori {{SITENAME}}
+* Editor: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Data de l'ultema modifega: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Data estrasion: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* URL permanente: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID version pàjina: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Stiłi citasion par {{FULLPAGENAME}} ==
+
+=== [[APA style|Stiłe APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Estratto il <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> da {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Stiłe MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Stiłe MHRA]] ===
+Contributori {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accesso il <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Stiłe Chicago]] ===
+Contributori {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accesso il <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Stiłe CBE/CSE]] ===
+Contributori {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [citato il <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponibile su:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Stiłe Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (ultima visita il <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] entry ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Online; accesso il <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Cuando che se dopara el pacheto [[LaTeX]] par url (<code>\\usepackage{url}</code> da calche parte inte'l preanboło) che in xenere el da indirisi web formatai in modo mejor, xe preferibiłe doparar el seguente còdexe:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Online; accesso il <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Veps (vepsän kel’)
+ * @author Triple-ADHD-AS
+ * @author Игорь БродÑкий
+ */
+$messages['vep'] = array(
+ 'cite_article_desc' => 'Ližadab [[Special:Cite|citiruindan]] specialižen lehtpolen da kosketusen azegištos',
+ 'cite_article_link' => "Citiruida nece lehtpol'",
+ 'tooltip-cite-article' => "Informacii siš, kut pidab citiruida nece lehtpol'.",
+ 'cite' => 'Citiruind',
+ 'cite_page' => 'Lehtpol’:',
+ 'cite_submit' => 'Citiruida',
+);
+
+/** Vietnamese (Tiếng Việt)
+ * @author Minh Nguyen
+ * @author Vinhtantran
+ */
+$messages['vi'] = array(
+ 'cite_article_desc' => 'Thêm trang đặc biệt để [[Special:Cite|trích dẫn bài viết]] và đặt liên kết trong thanh công cụ',
+ 'cite_article_link' => 'Trích dẫn trang này',
+ 'tooltip-cite-article' => 'Hướng dẫn cách trích dẫn trang này',
+ 'cite' => 'Trích dẫn',
+ 'cite_page' => 'Trang:',
+ 'cite_submit' => 'Trích dẫn',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Chi tiết ghi chú của {{FULLPAGENAME}} ==
+
+* Tên trang: {{FULLPAGENAME}}
+* Tác giả: {{SITENAME}} contributors
+* Nhà xuất bản: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Ngày sửa cuối: {{CURRENTDAY}} {{CURRENTMONTHNAME}} năm {{CURRENTYEAR}} lúc {{CURRENTTIME}} UTC
+* Ngày truy cập: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} năm {{CURRENTYEAR}} lúc {{CURRENTTIME}} UTC</citation>
+* URL thÆ°á»ng trá»±c: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Mã số phiên bản trang: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Các văn phong ghi chú phổ biến cho {{FULLPAGENAME}} ==
+
+=== [[Văn phong APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTDAY}} {{CURRENTMONTHNAME}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Lấy vào <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> từ {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Cẩm nang Văn phong MLA|Văn phong MLA]] ===
+“{{FULLPAGENAME}}.†''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[Hướng dẫn Văn phong MHRA|Văn phong MHRA]] ===
+Những ngÆ°á»i đóng góp vào {{SITENAME}}, ‘{{FULLPAGENAME}}’, ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [truy cập ngày <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[Cẩm nang Văn phong Chicago|Văn phong Chicago]] ===
+Những ngÆ°á»i đóng góp vào {{SITENAME}}, “{{FULLPAGENAME}},†''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (truy cập ngày <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Há»™i đồng Chủ bút Khoa há»c|Văn phong CBE/CSE]] ===
+Những ngÆ°á»i đóng góp vào {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [ghi chú ngày <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Có sẵn tại:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Văn phong Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (ghé thăm lần cuối ngày <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] entry ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[Trực tuyến; truy cập ngày <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+Khi sử dụng gói <code>url</code> của [[LaTeX]] (có <code>\\usepackage{url}</code> ở đâu đó phía đầu văn bản), gói này hay trang trí các địa chỉ Web một cách đẹp đẽ hơn, bạn có thể muốn sử dụng đoạn mã sau:
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[Trực tuyến; truy cập ngày <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+ }
+
+
+</div> <!-- div kết thúc “plainlinks†-->",
+);
+
+/** Volapük (Volapük)
+ * @author Malafaya
+ * @author Smeira
+ */
+$messages['vo'] = array(
+ 'cite_article_desc' => 'Läükon padi patik [[Special:Cite|saitama]] sa yüm ad stumem',
+ 'cite_article_link' => 'Saitön padi at',
+ 'cite' => 'Saitön',
+ 'cite_page' => 'Pad:',
+ 'cite_submit' => 'Saitön',
+);
+
+/** Walloon (walon)
+ * @author Srtxg
+ */
+$messages['wa'] = array(
+ 'cite_page' => 'PÃ¥dje:',
+);
+
+/** Wu (å´è¯­)
+ */
+$messages['wuu'] = array(
+ 'cite_article_link' => '引用该篇文章',
+ 'cite' => '引用',
+ 'cite_page' => '页é¢:',
+ 'cite_submit' => '引用',
+);
+
+/** Kalmyk (хальмг)
+ * @author Huuchin
+ */
+$messages['xal'] = array(
+ 'cite_article_link' => 'Тер халхиг Ñшллх',
+);
+
+/** Yiddish (ייִדיש)
+ * @author פוילישער
+ */
+$messages['yi'] = array(
+ 'cite_article_desc' => 'לייגט צו × [[Special:Cite|ציטיר]] ב×ַזונדערן בל×ַט ×ון געצייגק×ַסן לינק',
+ 'cite_article_link' => 'ציטירן ×“×¢× ×“×זיגן בל×ט',
+ 'tooltip-cite-article' => '×ינפֿ×ָרמ×ַציע ווי ×ַזוי צו ציטירן ×“×¢× ×‘×œ×ַט',
+ 'cite' => 'ציטירן',
+ 'cite_page' => 'בל×ט:',
+ 'cite_submit' => 'ציטירן',
+);
+
+/** Yoruba (Yorùbá)
+ * @author Demmy
+ */
+$messages['yo'] = array(
+ 'cite_page' => 'Ojúewé:',
+);
+
+/** Cantonese (粵語)
+ */
+$messages['yue'] = array(
+ 'cite_article_desc' => '加一個[[Special:Cite|引用]]特別é åŒåŸ‹ä¸€å€‹å·¥å…·ç®±é€£çµ',
+ 'cite_article_link' => '引用呢篇文',
+ 'cite' => '引用文章',
+ 'cite_page' => '版:',
+ 'cite_submit' => '引用',
+);
+
+/** Simplified Chinese (中文(简体)‎)
+ * @author Hzy980512
+ * @author Xiaomingyan
+ */
+$messages['zh-hans'] = array(
+ 'cite_article_desc' => '增加[[Special:Cite|引用]]特殊页é¢ä»¥åŠå·¥å…·ç®±é“¾æŽ¥',
+ 'cite_article_link' => '引用本页',
+ 'tooltip-cite-article' => '关于如何引用本页的信æ¯',
+ 'cite' => '引用页é¢',
+ 'cite_page' => '页é¢ï¼š',
+ 'cite_submit' => '引用',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== {{FULLPAGENAME}}çš„æ–‡çŒ®è¯¦ç»†ä¿¡æ¯ ==
+
+* 页é¢å称:{{FULLPAGENAME}}
+* 作者:{{SITENAME}}编者
+* 出版者:{{SITENAME}},{{int:sitesubtitle}}.
+* 最新版本日期:{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥{{CURRENTTIME}}(å调世界时)
+* 查阅日期:<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥{{CURRENTTIME}}(å调世界时)</citation>
+* 永久链接:{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* 页é¢ç‰ˆæœ¬å·ï¼š{{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== {{FULLPAGENAME}}çš„å‚è€ƒæ–‡çŒ®æ ¼å¼ ==
+
+=== GB7714æ ¼å¼ ===
+{{SITENAME}}编者.{{FULLPAGENAME}}[G/OL].{{SITENAME}},{{int:sitesubtitle}},{{CURRENTYEAR}}年{{CURRENTMONTH}}月{{CURRENTDAY}}日{{CURRENTTIME}}[<citation>{{CURRENTYEAR}}年{{CURRENTMONTH}}月{{CURRENTDAY}}日{{CURRENTTIME}}</citation>].{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== APAæ ¼å¼ ===
+{{FULLPAGENAME}}.({{CURRENTYEAR}}年{{CURRENTMONTH}}月{{CURRENTDAY}}日).''{{SITENAME}},{{int:sitesubtitle}}''.于<citation>{{CURRENTYEAR}}年{{CURRENTMONTH}}月{{CURRENTDAY}}日{{CURRENTTIME}}</citation>查阅自{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== MLAæ ¼å¼ ===
+“{{FULLPAGENAME}}.â€''{{SITENAME}},{{int:sitesubtitle}}''.{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥{{CURRENTTIME}}(å调世界时).<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥{{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== MHRAæ ¼å¼ ===
+{{SITENAME}}编者,‘{{FULLPAGENAME}}’,''{{SITENAME}},{{int:sitesubtitle}}'',{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥{{CURRENTTIME}}(å调世界时),&lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;[于<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥</citation>查阅]
+
+=== èŠåŠ å“¥æ ¼å¼ ===
+{{SITENAME}}编者,“{{FULLPAGENAME}},â€''{{SITENAME}},{{int:sitesubtitle}}'',{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}(于<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥</citation>查阅).
+
+=== CBE/CSEæ ¼å¼ ===
+{{SITENAME}}编者.{{FULLPAGENAME}}[互è”网].{{SITENAME}},{{int:sitesubtitle}}ï¼›{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥{{CURRENTTIME}}(å调世界时)[引用于<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥</citation>].å¯è®¿é—®è‡ªï¼š
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== Bluebookæ ¼å¼ ===
+{{FULLPAGENAME}},{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}(最新访问于<citation>{{CURRENTYEAR}}年{{CURRENTMONTH}}月{{CURRENTDAY}}日</citation>).
+
+=== BibTeX记录 ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[在线资æºï¼›è®¿é—®äºŽ<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥</citation>]\"
+ }
+
+使用LaTeX包装的链接(开头æŸå¤„çš„<code>\\usepackage{url}</code>)将æ供更好的网å€æ ¼å¼ï¼ŒæŽ¨è选用下列格å¼ï¼š
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[在线资æºï¼›è®¿é—®äºŽ<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Frankou
+ * @author Waihorace
+ */
+$messages['zh-hant'] = array(
+ 'cite_article_desc' => '增加[[Special:Cite|引用]]特殊é é¢ä»¥åŠå·¥å…·ç®±é€£çµ',
+ 'cite_article_link' => '引用此文',
+ 'tooltip-cite-article' => '關於如何引用此é çš„資訊',
+ 'cite' => '引用文章',
+ 'cite_page' => 'é é¢ï¼š',
+ 'cite_submit' => '引用',
+ 'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== {{FULLPAGENAME}}çš„æ–‡ç»è©³ç´°è³‡è¨Š ==
+
+* é é¢å稱:{{FULLPAGENAME}}
+* 作者:{{SITENAME}}編者
+* 出版者:{{SITENAME}},{{int:sitesubtitle}}.
+* 最新版本日期:{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥{{CURRENTTIME}}(å”調世界時)
+* 查閲日期:<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥{{CURRENTTIME}}(å”調世界時)</citation>
+* 永久連çµï¼š{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* é é¢ç‰ˆæœ¬è™Ÿï¼š{{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== {{FULLPAGENAME}}çš„åƒè€ƒæ–‡ç»æ ¼å¼ ==
+
+=== APAæ ¼å¼ ===
+{{FULLPAGENAME}}.({{CURRENTYEAR}}年{{CURRENTMONTH}}月{{CURRENTDAY}}日).''{{SITENAME}},{{int:sitesubtitle}}''.於<citation>{{CURRENTYEAR}}年{{CURRENTMONTH}}月{{CURRENTDAY}}日{{CURRENTTIME}}</citation>查閲自{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== MLAæ ¼å¼ ===
+「{{FULLPAGENAME}}ã€ï¼Ž''{{SITENAME}},{{int:sitesubtitle}}''.{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥{{CURRENTTIME}}(å”調世界時).<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥{{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== MHRAæ ¼å¼ ===
+{{SITENAME}}編者,『{{FULLPAGENAME}}ã€ï¼Œ''{{SITENAME}},{{int:sitesubtitle}}'',{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥{{CURRENTTIME}}(å”調世界時),&lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;[於<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥</citation>查閲]
+
+=== èŠåŠ å“¥æ ¼å¼ ===
+{{SITENAME}}編者,「{{FULLPAGENAME}}ã€ï¼Œ''{{SITENAME}},{{int:sitesubtitle}}'',{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}(於<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥</citation>查閲).
+
+=== CBE/CSEæ ¼å¼ ===
+{{SITENAME}}編者.{{FULLPAGENAME}}[網際網絡].{{SITENAME}},{{int:sitesubtitle}}ï¼›{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥{{CURRENTTIME}}(å”調世界時)[引用於<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥</citation>].å¯è¨ªå•è‡ªï¼š
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== Bluebookæ ¼å¼ ===
+{{FULLPAGENAME}},{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}(最新訪å•æ–¼<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥</citation>).
+
+=== BibTeX記錄 ===
+
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+ note = \"[線上資æºï¼›è¨ªå•æ–¼<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥</citation>]\"
+ }
+
+使用LaTeX包è£çš„連çµï¼ˆé–‹é ­æŸè™•çš„<code>\\usepackage{url}</code>)將æ供更好的網å€æ ¼å¼ï¼ŒæŽ¨è–¦é¸ç”¨ä¸‹åˆ—æ ¼å¼ï¼š
+ @misc{ wiki:xxx,
+ author = \"{{SITENAME}}\",
+ title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+ year = \"{{CURRENTYEAR}}\",
+ url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+ note = \"[線上資æºï¼›è¨ªå•æ–¼<citation>{{CURRENTYEAR}}å¹´{{CURRENTMONTH}}月{{CURRENTDAY}}æ—¥</citation>]\"
+ }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
diff --git a/extensions/Cite/SpecialCite.php b/extensions/Cite/SpecialCite.php
new file mode 100644
index 00000000..6d9b8138
--- /dev/null
+++ b/extensions/Cite/SpecialCite.php
@@ -0,0 +1,90 @@
+<?php
+if ( !defined( 'MEDIAWIKI' ) ) die();
+/**
+ * A special page extension that adds a special page that generates citations
+ * for pages.
+ *
+ * @file
+ * @ingroup Extensions
+ *
+ * @link http://www.mediawiki.org/wiki/Extension:Cite/Special:Cite.php Documentation
+ *
+ * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+ * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+
+$wgExtensionCredits['specialpage'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'Cite',
+ 'author' => 'Ævar Arnfjörð Bjarmason',
+ 'descriptionmsg' => 'cite_article_desc',
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:Cite/Special:Cite.php'
+);
+
+$dir = dirname( __FILE__ ) . '/';
+# Internationalisation file
+$wgExtensionMessagesFiles['SpecialCite'] = $dir . 'SpecialCite.i18n.php';
+$wgExtensionMessagesFiles['SpecialCiteAliases'] = $dir . 'SpecialCite.alias.php';
+
+$wgHooks['SkinTemplateBuildNavUrlsNav_urlsAfterPermalink'][] = 'wfSpecialCiteNav';
+$wgHooks['SkinTemplateToolboxEnd'][] = 'wfSpecialCiteToolbox';
+
+$wgSpecialPages['Cite'] = 'SpecialCite';
+$wgAutoloadClasses['SpecialCite'] = $dir . 'SpecialCite_body.php';
+
+// Resources
+$citeResourceTemplate = array(
+ 'localBasePath' => dirname(__FILE__) . '/modules',
+ 'remoteExtPath' => 'Cite/modules'
+);
+
+$wgResourceModules['ext.specialcite'] = $citeResourceTemplate + array(
+ 'styles' => 'ext.specialcite/ext.specialcite.css',
+ 'scripts' => array(),
+ 'position' => 'bottom',
+);
+
+/**
+ * @param $skintemplate SkinTemplate
+ * @param $nav_urls
+ * @param $oldid
+ * @param $revid
+ * @return bool
+ */
+function wfSpecialCiteNav( &$skintemplate, &$nav_urls, &$oldid, &$revid ) {
+ // check whether we’re in the right namespace, the $revid has the correct type and is not empty
+ // (what would mean that the current page doesn’t exist)
+ $title = $skintemplate->getTitle();
+ if ( $title->isContentPage() && $revid !== 0 && !empty( $revid ) )
+ $nav_urls['cite'] = array(
+ 'args' => array( 'page' => $title->getPrefixedDBkey(), 'id' => $revid )
+ );
+
+ return true;
+}
+
+/**
+ * add the cite link to the toolbar
+ *
+ * @param $skin Skin
+ *
+ * @return bool
+ */
+function wfSpecialCiteToolbox( &$skin ) {
+ if ( isset( $skin->data['nav_urls']['cite'] ) ) {
+ echo Html::rawElement(
+ 'li',
+ array( 'id' => 't-cite' ),
+ Linker::link(
+ SpecialPage::getTitleFor( 'Cite' ),
+ wfMessage( 'cite_article_link' )->text(), // @todo Should be escaped()?
+ # Used message keys: 'tooltip-cite-article', 'accesskey-cite-article'
+ Linker::tooltipAndAccessKeyAttribs( 'cite-article' ),
+ $skin->data['nav_urls']['cite']['args']
+ )
+ );
+ }
+
+ return true;
+}
diff --git a/extensions/Cite/SpecialCite_body.php b/extensions/Cite/SpecialCite_body.php
new file mode 100644
index 00000000..0425c850
--- /dev/null
+++ b/extensions/Cite/SpecialCite_body.php
@@ -0,0 +1,180 @@
+<?php
+
+class SpecialCite extends SpecialPage {
+ function __construct() {
+ parent::__construct( 'Cite' );
+ }
+
+ function execute( $par ) {
+ global $wgUseTidy;
+
+ // Having tidy on causes whitespace and <pre> tags to
+ // be generated around the output of the CiteOutput
+ // class TODO FIXME.
+ $wgUseTidy = false;
+
+ $this->setHeaders();
+ $this->outputHeader();
+
+ $page = $par !== null ? $par : $this->getRequest()->getText( 'page' );
+ $title = Title::newFromText( $page );
+
+ $cform = new CiteForm( $title );
+ $cform->execute();
+
+ if ( $title && $title->exists() ) {
+ $id = $this->getRequest()->getInt( 'id' );
+ $cout = new CiteOutput( $title, $id );
+ $cout->execute();
+ }
+ }
+}
+
+class CiteForm {
+ /**
+ * @var Title
+ */
+ var $mTitle;
+
+ function __construct( &$title ) {
+ $this->mTitle =& $title;
+ }
+
+ function execute() {
+ global $wgOut, $wgScript;
+
+ $wgOut->addHTML(
+ Xml::openElement( 'form',
+ array(
+ 'id' => 'specialcite',
+ 'method' => 'get',
+ 'action' => $wgScript
+ ) ) .
+ Html::hidden( 'title', SpecialPage::getTitleFor( 'Cite' )->getPrefixedDBkey() ) .
+ Xml::openElement( 'label' ) .
+ wfMessage( 'cite_page' )->escaped() . ' ' .
+ Xml::element( 'input',
+ array(
+ 'type' => 'text',
+ 'size' => 30,
+ 'name' => 'page',
+ 'value' => is_object( $this->mTitle ) ? $this->mTitle->getPrefixedText() : ''
+ ),
+ ''
+ ) .
+ ' ' .
+ Xml::element( 'input',
+ array(
+ 'type' => 'submit',
+ 'value' => wfMessage( 'cite_submit' )->escaped()
+ ),
+ ''
+ ) .
+ Xml::closeElement( 'label' ) .
+ Xml::closeElement( 'form' )
+ );
+ }
+}
+
+class CiteOutput {
+ /**
+ * @var Title
+ */
+ var $mTitle;
+
+ /**
+ * @var Article
+ */
+ var $mArticle;
+
+ var $mId;
+
+ /**
+ * @var Parser
+ */
+ var $mParser;
+
+ /**
+ * @var ParserOptions
+ */
+ var $mParserOptions;
+
+ var $mSpTitle;
+
+ function __construct( $title, $id ) {
+ global $wgHooks, $wgParser;
+
+ $this->mTitle = $title;
+ $this->mArticle = new Article( $title );
+ $this->mId = $id;
+
+ $wgHooks['ParserGetVariableValueVarCache'][] = array( $this, 'varCache' );
+
+ $this->genParserOptions();
+ $this->genParser();
+
+ $wgParser->setHook( 'citation', array( $this, 'CiteParse' ) );
+ }
+
+ function execute() {
+ global $wgOut, $wgParser, $wgHooks;
+
+ $wgHooks['ParserGetVariableValueTs'][] = array( $this, 'timestamp' );
+
+ $msg = wfMessage( 'cite_text' )->inContentLanguage()->plain();
+ if ( $msg == '' ) {
+ # With MediaWiki 1.20 the plain text files were deleted and the text moved into SpecialCite.i18n.php
+ # This code is kept for b/c in case an installation has its own file "cite_text-xx"
+ # for a previously not supported language.
+ global $wgContLang, $wgContLanguageCode;
+ $dir = dirname( __FILE__ ) . DIRECTORY_SEPARATOR;
+ $code = $wgContLang->lc( $wgContLanguageCode );
+ if ( file_exists( "${dir}cite_text-$code" ) ) {
+ $msg = file_get_contents( "${dir}cite_text-$code" );
+ } elseif( file_exists( "${dir}cite_text" ) ){
+ $msg = file_get_contents( "${dir}cite_text" );
+ }
+ }
+ $ret = $wgParser->parse( $msg, $this->mTitle, $this->mParserOptions, false, true, $this->getRevId() );
+ $wgOut->addModules( 'ext.specialcite' );
+ $wgOut->addHTML( $ret->getText() );
+ }
+
+ function genParserOptions() {
+ global $wgUser;
+ $this->mParserOptions = ParserOptions::newFromUser( $wgUser );
+ $this->mParserOptions->setDateFormat( MW_DATE_DEFAULT );
+ $this->mParserOptions->setEditSection( false );
+ }
+
+ function genParser() {
+ $this->mParser = new Parser;
+ $this->mSpTitle = SpecialPage::getTitleFor( 'Cite' );
+ }
+
+ function CiteParse( $in, $argv ) {
+ $ret = $this->mParser->parse( $in, $this->mSpTitle, $this->mParserOptions, false );
+
+ return $ret->getText();
+ }
+
+ function varCache() {
+ return false;
+ }
+
+ function timestamp( &$parser, &$ts ) {
+ if ( isset( $parser->mTagHooks['citation'] ) ) {
+ $ts = wfTimestamp( TS_UNIX, $this->mArticle->getTimestamp() );
+ }
+
+ return true;
+ }
+
+ function getRevId() {
+ if ( $this->mId ) {
+ return $this->mId;
+ } else {
+ return $this->mTitle->getLatestRevID();
+ }
+ }
+}
diff --git a/extensions/Cite/citeCatTreeParserTests.txt b/extensions/Cite/citeCatTreeParserTests.txt
new file mode 100644
index 00000000..41362e62
--- /dev/null
+++ b/extensions/Cite/citeCatTreeParserTests.txt
@@ -0,0 +1,27 @@
+# Force the test runner to ensure the extension is loaded
+!! hooks
+ref
+references
+categorytree
+!! endhooks
+
+!! test
+Bug 20748 - <references /> doesn't work after category tree in some cases
+!! input
+<ref>ref</ref>
+
+<categorytree showcount=on>Articles tagged for deletion and rescue</categorytree>
+<references />
+!! result
+<p><sup id="cite_ref-0" class="reference"><a href="#cite_note-0">[1]</a></sup>
+</p>
+<div class="CategoryTreeTag" data-ct-mode="0" data-ct-options="{&quot;mode&quot;:0,&quot;hideprefix&quot;:20,&quot;showcount&quot;:true,&quot;namespaces&quot;:false}"><div class="CategoryTreeSection"><div class="CategoryTreeItem"><span class="CategoryTreeEmptyBullet">[<b>×</b>] </span> <a class="CategoryTreeLabel CategoryTreeLabelNs14 new CategoryTreeLabelCategory" href="/index.php?title=Category:Articles_tagged_for_deletion_and_rescue&amp;action=edit&amp;redlink=1">Articles tagged for deletion and rescue</a>‎ <span title="Contains 0 subcategories, 0 pages, and 0 files" dir="ltr">(empty)</span></div>
+ <div class="CategoryTreeChildren" style="display:block"><i class="CategoryTreeNotice">no subcategories</i></div></div>
+ </div>
+<ol class="references">
+<li id="cite_note-0"><span class="mw-cite-backlink"><a href="#cite_ref-0">↑</a></span> <span class="reference-text">ref</span>
+</li>
+</ol>
+
+!! end
+
diff --git a/extensions/Cite/citeParserTests.txt b/extensions/Cite/citeParserTests.txt
new file mode 100644
index 00000000..ded8cc19
--- /dev/null
+++ b/extensions/Cite/citeParserTests.txt
@@ -0,0 +1,449 @@
+# Force the test runner to ensure the extension is loaded
+!! hooks
+ref
+references
+!! endhooks
+
+!! test
+Simple <ref>, no <references/>
+!! input
+Wikipedia rocks!<ref>Proceeds of Rockology, vol. XXI</ref>
+!! result
+<p>Wikipedia rocks!<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
+<br /><strong class="error">Cite error: <code>&lt;ref&gt;</code> tags exist, but no <code>&lt;references/&gt;</code> tag was found</strong>
+</p>
+!! end
+
+!! test
+Simple <ref>, with <references/>
+!! input
+Wikipedia rocks!<ref>Proceeds of Rockology, vol. XXI</ref>
+
+<references/>
+!! result
+<p>Wikipedia rocks!<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">Proceeds of Rockology, vol. XXI</span>
+</li>
+</ol>
+
+!! end
+
+
+!! article
+Template:Simple template
+!! text
+A ''simple'' template.
+!! endarticle
+
+
+!! test
+<ref> with a simple template
+!! input
+Templating<ref>{{simple template}}</ref>
+
+<references/>
+!! result
+<p>Templating<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">A <i>simple</i> template.</span>
+</li>
+</ol>
+
+!! end
+
+!! test
+<ref> with a <nowiki>
+!! input
+Templating<ref><nowiki>{{simple template}}</nowiki></ref>
+
+<references/>
+!! result
+<p>Templating<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">{{simple template}}</span>
+</li>
+</ol>
+
+!! end
+
+
+!! test
+<ref> in a <nowiki>
+!! input
+Templating<nowiki><ref>{{simple template}}</ref></nowiki>
+
+<references/>
+!! result
+<p>Templating&lt;ref&gt;{{simple template}}&lt;/ref&gt;
+</p><p><br />
+</p>
+!! end
+
+!! test
+<ref> in a <!--comment-->
+!! input
+Templating<!--<ref>{{simple template}}</ref>-->
+
+<references/>
+!! result
+<p>Templating
+</p><p><br />
+</p>
+!! end
+
+!! test
+<!--comment--> in a <ref> (bug 5384)
+!! input
+Templating<ref>Text<!--comment--></ref>
+
+<references/>
+!! result
+<p>Templating<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">Text</span>
+</li>
+</ol>
+
+!! end
+
+!! test
+<references> after <gallery> (bug 6164)
+!! input
+<ref>one</ref>
+
+<gallery>Image:Foobar.jpg</gallery>
+
+<references/>
+!! result
+<p><sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
+</p>
+<ul class="gallery">
+ <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+ <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
+ <div class="gallerytext">
+ </div>
+ </div></li>
+</ul>
+<ol class="references">
+<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">one</span>
+</li>
+</ol>
+
+!! end
+
+!! test
+{{REVISIONID}} on page with <ref> (bug 6299)
+!! input
+{{REVISIONID}}<ref>elite</ref>
+!! result
+<p>1337<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
+<br /><strong class="error">Cite error: <code>&lt;ref&gt;</code> tags exist, but no <code>&lt;references/&gt;</code> tag was found</strong>
+</p>
+!! end
+
+!! test
+{{REVISIONID}} on page without <ref> (bug 6299 sanity check)
+!! input
+{{REVISIONID}}
+!! result
+<p>1337
+</p>
+!! end
+
+!! test
+Blank ref followed by ref with content
+!! input
+<ref name="blank"/>
+
+<ref name="blank">content</ref>
+
+<references/>
+!! result
+<p><sup id="cite_ref-blank_1-0" class="reference"><a href="#cite_note-blank-1">[1]</a></sup>
+</p><p><sup id="cite_ref-blank_1-1" class="reference"><a href="#cite_note-blank-1">[1]</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-blank-1"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-blank_1-0">1.0</a></sup> <sup><a href="#cite_ref-blank_1-1">1.1</a></sup></span> <span class="reference-text">content</span>
+</li>
+</ol>
+
+!! end
+
+!! test
+Regression: non-blank ref "0" followed by ref with content
+!! input
+<ref name="blank">0</ref>
+
+<ref name="blank">content</ref>
+
+<references/>
+!! result
+<p><sup id="cite_ref-blank_1-0" class="reference"><a href="#cite_note-blank-1">[1]</a></sup>
+</p><p><sup id="cite_ref-blank_1-1" class="reference"><a href="#cite_note-blank-1">[1]</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-blank-1"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-blank_1-0">1.0</a></sup> <sup><a href="#cite_ref-blank_1-1">1.1</a></sup></span> <span class="reference-text">0</span>
+</li>
+</ol>
+
+!! end
+
+!! test
+Regression sanity check: non-blank ref "1" followed by ref with content
+!! input
+<ref name="blank">1</ref>
+
+<ref name="blank">content</ref>
+
+<references/>
+!! result
+<p><sup id="cite_ref-blank_1-0" class="reference"><a href="#cite_note-blank-1">[1]</a></sup>
+</p><p><sup id="cite_ref-blank_1-1" class="reference"><a href="#cite_note-blank-1">[1]</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-blank-1"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-blank_1-0">1.0</a></sup> <sup><a href="#cite_ref-blank_1-1">1.1</a></sup></span> <span class="reference-text">1</span>
+</li>
+</ol>
+
+!! end
+
+!! test
+Ref names containing a number
+!! input
+<ref name="test123test">One</ref>
+<ref name="123test">Two</ref>
+<ref name="test123">Three</ref>
+
+<references />
+!! result
+<p><sup id="cite_ref-test123test_1-0" class="reference"><a href="#cite_note-test123test-1">[1]</a></sup>
+<sup id="cite_ref-123test_2-0" class="reference"><a href="#cite_note-123test-2">[2]</a></sup>
+<sup id="cite_ref-test123_3-0" class="reference"><a href="#cite_note-test123-3">[3]</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-test123test-1"><span class="mw-cite-backlink"><a href="#cite_ref-test123test_1-0">↑</a></span> <span class="reference-text">One</span>
+</li>
+<li id="cite_note-123test-2"><span class="mw-cite-backlink"><a href="#cite_ref-123test_2-0">↑</a></span> <span class="reference-text">Two</span>
+</li>
+<li id="cite_note-test123-3"><span class="mw-cite-backlink"><a href="#cite_ref-test123_3-0">↑</a></span> <span class="reference-text">Three</span>
+</li>
+</ol>
+
+!! end
+
+!! test
+Erroneous refs
+!! input
+<ref name="0">Zero</ref>
+
+<ref>Also zero, but differently! (Normal ref)</ref>
+
+<ref />
+
+<ref name="foo" name="bar" />
+
+<ref name="blankwithnoreference" />
+
+<references name="quasit" />
+
+<references />
+!! result
+<p><strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+name cannot be a simple integer. Use a descriptive title</strong>
+</p><p><sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
+</p><p><strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+refs with no content must have a name</strong>
+</p><p><sup id="cite_ref-bar_2-0" class="reference"><a href="#cite_note-bar-2">[2]</a></sup>
+</p><p><sup id="cite_ref-blankwithnoreference_3-0" class="reference"><a href="#cite_note-blankwithnoreference-3">[3]</a></sup>
+</p><p><strong class="error">Cite error: Invalid <code>&lt;references&gt;</code> tag;
+parameter "group" is allowed only.
+Use <code>&lt;references /&gt;</code>, or <code>&lt;references group="..." /&gt;</code></strong>
+</p>
+<ol class="references">
+<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">Also zero, but differently! (Normal ref)</span>
+</li>
+<li id="cite_note-bar"><span class="mw-cite-backlink"><a href="#cite_ref-bar_0">↑</a></span> <strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+no text was provided for refs named <code>bar</code></strong></li>
+<li id="cite_note-blankwithnoreference"><span class="mw-cite-backlink"><a href="#cite_ref-blankwithnoreference_0">↑</a></span> <strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+no text was provided for refs named <code>blankwithnoreference</code></strong></li>
+</ol>
+
+!! end
+
+
+!! test
+Simple <ref>, with <references/> in group
+!! input
+Wikipedia rocks!<ref>Proceeds of Rockology, vol. XXI</ref>
+Wikipedia rocks!<ref group=note>Proceeds of Rockology, vol. XXI</ref>
+
+<references/>
+<references group=note/>
+!! result
+<p>Wikipedia rocks!<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
+Wikipedia rocks!<sup id="cite_ref-2" class="reference"><a href="#cite_note-2">[note 1]</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">Proceeds of Rockology, vol. XXI</span>
+</li>
+</ol>
+<ol class="references">
+<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text">Proceeds of Rockology, vol. XXI</span>
+</li>
+</ol>
+
+!! end
+
+!! test
+Simple <ref>, with <references/> in group, with groupname in chinese
+!! input
+AAA<ref group="å‚">ref a</ref>BBB<ref group="注">note b</ref>CCC<ref group="å‚">ref c</ref>
+
+;refs
+<references group="å‚" />
+;notes
+<references group="注" />
+!! result
+<p>AAA<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[å‚ 1]</a></sup>BBB<sup id="cite_ref-2" class="reference"><a href="#cite_note-2">[注 1]</a></sup>CCC<sup id="cite_ref-3" class="reference"><a href="#cite_note-3">[å‚ 2]</a></sup>
+</p>
+<dl><dt>refs
+</dt></dl>
+<ol class="references">
+<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">ref a</span>
+</li>
+<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text">ref c</span>
+</li>
+</ol>
+<dl><dt>notes
+</dt></dl>
+<ol class="references">
+<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text">note b</span>
+</li>
+</ol>
+
+!! end
+
+!! test
+<ref> defined in <references>
+!! input
+<ref name="foo"/>
+
+<references>
+<ref name="foo">BAR</ref>
+</references>
+!! result
+<p><sup id="cite_ref-foo_1-0" class="reference"><a href="#cite_note-foo-1">[1]</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-foo-1"><span class="mw-cite-backlink"><a href="#cite_ref-foo_1-0">↑</a></span> <span class="reference-text">BAR</span>
+</li>
+</ol>
+
+!! end
+
+!! test
+<ref> defined in <references> called with #tag
+!! input
+<ref name="foo"/>
+
+{{#tag:references|
+<ref name="foo">BAR</ref>
+}}
+!! result
+<p><sup id="cite_ref-foo_1-0" class="reference"><a href="#cite_note-foo-1">[1]</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-foo-1"><span class="mw-cite-backlink"><a href="#cite_ref-foo_1-0">↑</a></span> <span class="reference-text">BAR</span>
+</li>
+</ol>
+
+!! end
+
+!! test
+<ref> defined in <references> error conditions
+!! input
+<ref name="foo" group="2"/>
+
+<references group="2">
+<ref name="foo"/>
+<ref name="unused">BAR</ref>
+<ref name="foo" group="1">bad group</ref>
+<ref>BAR BAR</ref>
+</references>
+!! result
+<p><sup id="cite_ref-foo_1-0" class="reference"><a href="#cite_note-foo-1">[2 1]</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-foo"><span class="mw-cite-backlink"><a href="#cite_ref-foo_0">↑</a></span> <strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+no text was provided for refs named <code>foo</code></strong></li>
+</ol>
+<p><strong class="error">Cite error: <code>&lt;ref&gt;</code> tag with name "unused" defined in <code>&lt;references&gt;</code> is not used in prior text.</strong><br />
+<strong class="error">Cite error: <code>&lt;ref&gt;</code> tag in <code>&lt;references&gt;</code> has conflicting group attribute "1".</strong><br />
+<strong class="error">Cite error: <code>&lt;ref&gt;</code> tag defined in <code>&lt;references&gt;</code> has no name attribute.</strong>
+</p>
+!! end
+
+!! article
+MediaWiki:cite_link_label_group-klingon
+!! text
+wa' cha' wej loS vagh jav Soch chorgh Hut wa'maH
+!! endarticle
+
+!! test
+<ref> with custom group link
+!! input
+Wikipedia rocks!<ref group="klingon">Proceeds of Rockology, vol. XXI</ref>
+
+<references group="klingon"/>
+!! result
+<p>Wikipedia rocks!<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[wa']</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">Proceeds of Rockology, vol. XXI</span>
+</li>
+</ol>
+
+!! end
+
+!! test
+Bug 31374 regression check: nested strip items
+!! input
+{{#tag:ref|note<ref>reference</ref>|group=Note}}
+<references group=Note />
+<references />
+!! result
+<p><sup id="cite_ref-2" class="reference"><a href="#cite_note-2">[Note 1]</a></sup>
+</p>
+<ol class="references">
+<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text">note<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup></span>
+</li>
+</ol>
+<ol class="references">
+<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">reference</span>
+</li>
+</ol>
+
+!! end
+
+!! test
+Bug 13073 regression check: wrapped <references>
+!! input
+<ref>
+foo
+</ref>
+<div><references /></div>
+!! result
+<p><sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
+</p>
+<div><ol class="references">
+<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">
+foo</span>
+</li>
+</ol></div>
+
+!! end
diff --git a/extensions/Cite/modules/ext.cite/ext.cite.js b/extensions/Cite/modules/ext.cite/ext.cite.js
new file mode 100644
index 00000000..dc7328b4
--- /dev/null
+++ b/extensions/Cite/modules/ext.cite/ext.cite.js
@@ -0,0 +1,12 @@
+( function($) {
+ $( function() {
+ $('.biblio-cite-link,sup.reference a').tooltip({
+ bodyHandler: function() {
+ return $( '#' + this.hash.substr(1) + ' > .reference-text' )
+ .html();
+ },
+ showURL : false
+ } );
+ } );
+
+} )( jQuery );
diff --git a/extensions/Cite/modules/ext.rtlcite/ext.rtlcite.css b/extensions/Cite/modules/ext.rtlcite/ext.rtlcite.css
new file mode 100644
index 00000000..9b88d531
--- /dev/null
+++ b/extensions/Cite/modules/ext.rtlcite/ext.rtlcite.css
@@ -0,0 +1,6 @@
+/* Isolation to fix references in case of RTL words at the end of a reference */
+sup.reference {
+ unicode-bidi: -moz-isolate;
+ unicode-bidi: -webkit-isolate;
+ unicode-bidi: isolate;
+}
diff --git a/extensions/Cite/modules/ext.specialcite/ext.specialcite.css b/extensions/Cite/modules/ext.specialcite/ext.specialcite.css
new file mode 100644
index 00000000..65a4e40e
--- /dev/null
+++ b/extensions/Cite/modules/ext.specialcite/ext.specialcite.css
@@ -0,0 +1,14 @@
+.mw-specialcite-bibliographic {
+ border: 1px solid grey;
+ background: #E6E8FA;
+ width: 90%;
+ padding: 15px 30px 15px 30px;
+ margin: 10px auto;
+}
+.mw-specialcite-styles {
+ border: 1px solid grey;
+ width: 90%;
+ padding: 15px 30px 15px 30px;
+ margin: 10px auto;
+}
+
diff --git a/extensions/Cite/modules/jquery.tooltip/jquery.tooltip.css b/extensions/Cite/modules/jquery.tooltip/jquery.tooltip.css
new file mode 100644
index 00000000..2e06cfe3
--- /dev/null
+++ b/extensions/Cite/modules/jquery.tooltip/jquery.tooltip.css
@@ -0,0 +1,9 @@
+#tooltip {
+ position: absolute;
+ z-index: 3000;
+ border: 1px solid #111;
+ background-color: #eee;
+ padding: 5px;
+ opacity: 0.85;
+}
+#tooltip h3, #tooltip div { margin: 0; }
diff --git a/extensions/Cite/modules/jquery.tooltip/jquery.tooltip.js b/extensions/Cite/modules/jquery.tooltip/jquery.tooltip.js
new file mode 100644
index 00000000..63b715f1
--- /dev/null
+++ b/extensions/Cite/modules/jquery.tooltip/jquery.tooltip.js
@@ -0,0 +1,294 @@
+/*
+ * jQuery Tooltip plugin 1.3
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/
+ * http://docs.jquery.com/Plugins/Tooltip
+ *
+ * Copyright (c) 2006 - 2008 Jörn Zaefferer
+ *
+ * $Id: jquery.tooltip.js 5741 2008-06-21 15:22:16Z joern.zaefferer $
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ */
+
+;(function($) {
+
+ // the tooltip element
+ var helper = {},
+ // the current tooltipped element
+ current,
+ // the title of the current element, used for restoring
+ title,
+ // timeout id for delayed tooltips
+ tID,
+ // IE 5.5 or 6
+ IE = $.browser.msie && /MSIE\s(5\.5|6\.)/.test(navigator.userAgent),
+ // flag for mouse tracking
+ track = false;
+
+ $.tooltip = {
+ blocked: false,
+ defaults: {
+ delay: 200,
+ fade: false,
+ showURL: true,
+ extraClass: "",
+ top: 15,
+ left: 15,
+ id: "tooltip"
+ },
+ block: function() {
+ $.tooltip.blocked = !$.tooltip.blocked;
+ }
+ };
+
+ $.fn.extend({
+ tooltip: function(settings) {
+ settings = $.extend({}, $.tooltip.defaults, settings);
+ createHelper(settings);
+ return this.each(function() {
+ $.data(this, "tooltip", settings);
+ this.tOpacity = helper.parent.css("opacity");
+ // copy tooltip into its own expando and remove the title
+ this.tooltipText = this.title;
+ $(this).removeAttr("title");
+ // also remove alt attribute to prevent default tooltip in IE
+ this.alt = "";
+ })
+ .mouseover(save)
+ .mouseout(hide)
+ .click(hide);
+ },
+ fixPNG: IE ? function() {
+ return this.each(function () {
+ var image = $(this).css('backgroundImage');
+ if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) {
+ image = RegExp.$1;
+ $(this).css({
+ 'backgroundImage': 'none',
+ 'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
+ }).each(function () {
+ var position = $(this).css('position');
+ if (position != 'absolute' && position != 'relative')
+ $(this).css('position', 'relative');
+ });
+ }
+ });
+ } : function() { return this; },
+ unfixPNG: IE ? function() {
+ return this.each(function () {
+ $(this).css({'filter': '', backgroundImage: ''});
+ });
+ } : function() { return this; },
+ hideWhenEmpty: function() {
+ return this.each(function() {
+ $(this)[ $(this).html() ? "show" : "hide" ]();
+ });
+ },
+ url: function() {
+ return this.attr('href') || this.attr('src');
+ }
+ });
+
+ function createHelper(settings) {
+ // there can be only one tooltip helper
+ if( helper.parent )
+ return;
+ // create the helper, h3 for title, div for url
+ helper.parent = $('<div id="' + settings.id + '"><h3></h3><div class="body"></div><div class="url"></div></div>')
+ // add to document
+ .appendTo(document.body)
+ // hide it at first
+ .hide();
+
+ // apply bgiframe if available
+ if ( $.fn.bgiframe )
+ helper.parent.bgiframe();
+
+ // save references to title and url elements
+ helper.title = $('h3', helper.parent);
+ helper.body = $('div.body', helper.parent);
+ helper.url = $('div.url', helper.parent);
+ }
+
+ function settings(element) {
+ return $.data(element, "tooltip");
+ }
+
+ // main event handler to start showing tooltips
+ function handle(event) {
+ // show helper, either with timeout or on instant
+ if( settings(this).delay )
+ tID = setTimeout(show, settings(this).delay);
+ else
+ show();
+
+ // if selected, update the helper position when the mouse moves
+ track = !!settings(this).track;
+ $(document.body).bind('mousemove', update);
+
+ // update at least once
+ update(event);
+ }
+
+ // save elements title before the tooltip is displayed
+ function save() {
+ // if this is the current source, or it has no title (occurs with click event), stop
+ if ( $.tooltip.blocked || this == current || (!this.tooltipText && !settings(this).bodyHandler) )
+ return;
+
+ // save current
+ current = this;
+ title = this.tooltipText;
+
+ if ( settings(this).bodyHandler ) {
+ helper.title.hide();
+ var bodyContent = settings(this).bodyHandler.call(this);
+ if (bodyContent.nodeType || bodyContent.jquery) {
+ helper.body.empty().append(bodyContent)
+ } else {
+ helper.body.html( bodyContent );
+ }
+ helper.body.show();
+ } else if ( settings(this).showBody ) {
+ var parts = title.split(settings(this).showBody);
+ helper.title.html(parts.shift()).show();
+ helper.body.empty();
+ for(var i = 0, part; (part = parts[i]); i++) {
+ if(i > 0)
+ helper.body.append("<br/>");
+ helper.body.append(part);
+ }
+ helper.body.hideWhenEmpty();
+ } else {
+ helper.title.html(title).show();
+ helper.body.hide();
+ }
+
+ // if element has href or src, add and show it, otherwise hide it
+ if( settings(this).showURL && $(this).url() )
+ helper.url.html( $(this).url().replace('http://', '') ).show();
+ else
+ helper.url.hide();
+
+ // add an optional class for this tip
+ helper.parent.addClass(settings(this).extraClass);
+
+ // fix PNG background for IE
+ if (settings(this).fixPNG )
+ helper.parent.fixPNG();
+
+ handle.apply(this, arguments);
+ }
+
+ // delete timeout and show helper
+ function show() {
+ tID = null;
+ if ((!IE || !$.fn.bgiframe) && settings(current).fade) {
+ if (helper.parent.is(":animated"))
+ helper.parent.stop().show().fadeTo(settings(current).fade, current.tOpacity);
+ else
+ helper.parent.is(':visible') ? helper.parent.fadeTo(settings(current).fade, current.tOpacity) : helper.parent.fadeIn(settings(current).fade);
+ } else {
+ helper.parent.show();
+ }
+ update();
+ }
+
+ /**
+ * callback for mousemove
+ * updates the helper position
+ * removes itself when no current element
+ */
+ function update(event) {
+ if($.tooltip.blocked)
+ return;
+
+ if (event && event.target.tagName == "OPTION") {
+ return;
+ }
+
+ // stop updating when tracking is disabled and the tooltip is visible
+ if ( !track && helper.parent.is(":visible")) {
+ $(document.body).unbind('mousemove', update)
+ }
+
+ // if no current element is available, remove this listener
+ if( current == null ) {
+ $(document.body).unbind('mousemove', update);
+ return;
+ }
+
+ // remove position helper classes
+ helper.parent.removeClass("viewport-right").removeClass("viewport-bottom");
+
+ var left = helper.parent[0].offsetLeft;
+ var top = helper.parent[0].offsetTop;
+ if (event) {
+ // position the helper 15 pixel to bottom right, starting from mouse position
+ left = event.pageX + settings(current).left;
+ top = event.pageY + settings(current).top;
+ var right='auto';
+ if (settings(current).positionLeft) {
+ right = $(window).width() - left;
+ left = 'auto';
+ }
+ helper.parent.css({
+ left: left,
+ right: right,
+ top: top
+ });
+ }
+
+ var v = viewport(),
+ h = helper.parent[0];
+ // check horizontal position
+ if (v.x + v.cx < h.offsetLeft + h.offsetWidth) {
+ left -= h.offsetWidth + 20 + settings(current).left;
+ helper.parent.css({left: left + 'px'}).addClass("viewport-right");
+ }
+ // check vertical position
+ if (v.y + v.cy < h.offsetTop + h.offsetHeight) {
+ top -= h.offsetHeight + 20 + settings(current).top;
+ helper.parent.css({top: top + 'px'}).addClass("viewport-bottom");
+ }
+ }
+
+ function viewport() {
+ return {
+ x: $(window).scrollLeft(),
+ y: $(window).scrollTop(),
+ cx: $(window).width(),
+ cy: $(window).height()
+ };
+ }
+
+ // hide helper and restore added classes and the title
+ function hide(event) {
+ if($.tooltip.blocked)
+ return;
+ // clear timeout if possible
+ if(tID)
+ clearTimeout(tID);
+ // no more current element
+ current = null;
+
+ var tsettings = settings(this);
+ function complete() {
+ helper.parent.removeClass( tsettings.extraClass ).hide().css("opacity", "");
+ }
+ if ((!IE || !$.fn.bgiframe) && tsettings.fade) {
+ if (helper.parent.is(':animated'))
+ helper.parent.stop().fadeTo(tsettings.fade, 0, complete);
+ else
+ helper.parent.stop().fadeOut(tsettings.fade, complete);
+ } else
+ complete();
+
+ if( settings(this).fixPNG )
+ helper.parent.unfixPNG();
+ }
+
+})(jQuery);
diff --git a/extensions/ConfirmEdit/.gitreview b/extensions/ConfirmEdit/.gitreview
deleted file mode 100644
index 780d35df..00000000
--- a/extensions/ConfirmEdit/.gitreview
+++ /dev/null
@@ -1,5 +0,0 @@
-[gerrit]
-host=gerrit.wikimedia.org
-port=29418
-project=mediawiki/extensions/ConfirmEdit.git
-defaultbranch=master
diff --git a/extensions/ConfirmEdit/ApiFancyCaptchaReload.php b/extensions/ConfirmEdit/ApiFancyCaptchaReload.php
new file mode 100644
index 00000000..1de1947d
--- /dev/null
+++ b/extensions/ConfirmEdit/ApiFancyCaptchaReload.php
@@ -0,0 +1,34 @@
+<?
+/**
+ * Api module to reload FancyCaptcha
+ *
+ * @ingroup API
+ * @ingroup Extensions
+ */
+class ApiFancyCaptchaReload extends ApiBase {
+ public function execute() {
+ # Get a new FancyCaptcha form data
+ $captcha = new FancyCaptcha();
+ $captchaIndex = $captcha->getCaptchaIndex();
+
+ $result = $this->getResult();
+ $result->addValue( null, $this->getModuleName(), array ( 'index' => $captchaIndex ) );
+ return true;
+ }
+
+ public function getDescription() {
+ return 'Get a new FancyCaptcha.';
+ }
+
+ public function getAllowedParams() {
+ return array();
+ }
+
+ public function getParamDescription() {
+ return array();
+ }
+
+ public function getExamples() {
+ return array( 'api.php?action=fancycaptchareload&format=xml' );
+ }
+}
diff --git a/extensions/ConfirmEdit/Asirra.class.php b/extensions/ConfirmEdit/Asirra.class.php
index cbe51e26..bd58eb3a 100644
--- a/extensions/ConfirmEdit/Asirra.class.php
+++ b/extensions/ConfirmEdit/Asirra.class.php
@@ -17,7 +17,7 @@ class Asirra extends SimpleCaptcha {
function getForm() {
global $wgOut;
- $wgOut->addModules( 'ext.confirmedit.asirra' );
+ $wgOut->addModules( 'ext.confirmEdit.asirra' );
$js = Html::linkedScript( $this->asirra_clientscript );
$message = Xml::encodeJsVar( wfMessage( 'asirra-createaccount-fail' )->plain() );
diff --git a/extensions/ConfirmEdit/Asirra.i18n.php b/extensions/ConfirmEdit/Asirra.i18n.php
index ac744712..75f33a76 100644
--- a/extensions/ConfirmEdit/Asirra.i18n.php
+++ b/extensions/ConfirmEdit/Asirra.i18n.php
@@ -24,29 +24,34 @@ $messages['en'] = array(
/** Message documentation (Message documentation)
* @author 2nd-player
* @author Beta16
+ * @author Shirayuki
*/
$messages['qqq'] = array(
- 'asirra-desc' => '{{desc}}',
- 'asirra-edit' => 'See also
-*{{msg-mw|Captcha-edit}}
-*{{msg-mw|Questycaptcha-edit}}
-*{{msg-mw|Fancycaptcha-edit}}
-*{{msg-mw|Recaptcha-edit}}',
- 'asirra-addurl' => 'See also
-*{{msg-mw|Captcha-addurl}}
-*{{msg-mw|Questycaptcha-addurl}}
-*{{msg-mw|Fancycaptcha-addurl}}
-*{{msg-mw|Recaptcha-addurl}}',
- 'asirra-badpass' => 'See also
-*{{msg-mw|Captcha-badlogin}}
-*{{msg-mw|Questycaptcha-badlogin}}
-*{{msg-mw|Fancycaptcha-badlogin}}
-*{{msg-mw|Recaptcha-badpass}}',
- 'asirra-createaccount' => 'See also
-*{{msg-mw|Captcha-createaccount}}
-*{{msg-mw|Questycaptcha-createaccount}}
-*{{msg-mw|Fancycaptcha-createaccount}}
-*{{msg-mw|Recaptcha-createaccount}}',
+ 'asirra-desc' => '{{desc|name=Asirra|url=http://www.mediawiki.org/wiki/Extension:Asirra}}',
+ 'asirra-edit' => '{{Related|ConfirmEdit-edit}}',
+ 'asirra-addurl' => '{{Related|ConfirmEdit-addurl}}',
+ 'asirra-badpass' => '{{Related|ConfirmEdit-badlogin}}',
+ 'asirra-createaccount' => '{{Related|ConfirmEdit-createaccount}}',
+ 'asirra-createaccount-fail' => 'Used as failure message in JavaScript code.
+{{Related|ConfirmEdit-createaccount-fail}}',
+ 'asirra-create' => '{{Related|ConfirmEdit-create}}',
+ 'asirra-nojs' => 'Used in HTML <code><nowiki><noscript></nowiki></code> tag.',
+ 'asirra-failed' => 'Used as alert message in JavaScript code.',
+);
+
+/** Asturian (asturianu)
+ * @author Xuacu
+ */
+$messages['ast'] = array(
+ 'asirra-desc' => 'Módulu Asirra pa ConfirmEdit',
+ 'asirra-edit' => "P'ayudanos a protexenos escontra el spam d'edición automática, esbille namái les fotos de gatos nel cuadru d'abaxo:",
+ 'asirra-addurl' => "La so edición incluye enllaces esternos nuevos. P'ayudar a protexenos escontra'l spam automáticu, esbille namái les fotos de gatos nel cuadru d'abaxo:",
+ 'asirra-badpass' => "P'ayudar a protexenos escontra'l frayamientu de claves automáticu, esbille namái les fotos de gatos nel cuadru d'abaxo:",
+ 'asirra-createaccount' => "P'ayudar a protexenos escontra la creación de cuentes automática, esbille namái les fotos de gatos nel cuadru d'abaxo:",
+ 'asirra-createaccount-fail' => 'Identifique correutamente los gatos.',
+ 'asirra-create' => "P'ayudar a protexenos escontra la creación de páxines automática, esbille namái les fotos de gatos nel cuadru d'abaxo:",
+ 'asirra-nojs' => "'''Por favor active JavaScript y vuelva a unviar la páxina.'''",
+ 'asirra-failed' => 'Identifique toles imaxes de gatos',
);
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
@@ -66,6 +71,13 @@ $messages['be-tarask'] = array(
'asirra-failed' => 'Калі лаÑка, вызначце ÑžÑе выÑвы з катамі',
);
+/** Czech (Äesky)
+ * @author Vks
+ */
+$messages['cs'] = array(
+ 'asirra-createaccount-fail' => 'Prosíme, správnÄ› identifikujte koÄky.',
+);
+
/** German (Deutsch)
* @author Kghbln
*/
@@ -115,16 +127,32 @@ $messages['es'] = array(
'asirra-failed' => 'Identifique todas las imágenes de gatos',
);
+/** Finnish (suomi)
+ * @author VezonThunder
+ */
+$messages['fi'] = array(
+ 'asirra-desc' => 'Asirra-moduuli muokkauksen varmennukseen',
+ 'asirra-edit' => 'Suojana automaattisia roskamuokkauksia vastaan sinun on valittava kissan kuvat laatikosta alla:',
+ 'asirra-addurl' => 'Muokkauksesi sisältää uusia ulkoisia linkkejä. Suojana automaattista roskapostia vastaan sinun on valittava kissan kuvat laatikosta alla:',
+ 'asirra-badpass' => 'Suojana automaattisia salasanamurtoja vastaan sinun on valittava kissan kuvat laatikosta alla:',
+ 'asirra-createaccount' => 'Suojana automaattista tunnusten luontia vastaan sinun on valittava kissan kuvat laatikosta alla:',
+ 'asirra-createaccount-fail' => 'Tunnista kissat.',
+ 'asirra-create' => 'Suojana automaattista sivujen luontia vastaan sinun on valittava kissan kuvat laatikosta alla:',
+ 'asirra-nojs' => "'''Salli JavaScript ja lähetä uudelleen.'''",
+ 'asirra-failed' => 'Tunnista kaikki kissan kuvat',
+);
+
/** French (français)
* @author Gomoko
+ * @author Nicolas NALLET
* @author Seb35
*/
$messages['fr'] = array(
'asirra-desc' => 'Module Asirra pour ConfirmEdit',
- 'asirra-edit' => 'Pour aider à nous protéger contre le spam d’édition automatique, veuillez sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
+ 'asirra-edit' => "Pour aider à nous protéger contre le spam d’édition automatique, veuillez sélectionner '''uniquement les photos de chats''' dans la boîte ci-dessous :",
'asirra-addurl' => 'Votre édition contient des liens externes. Pour nous aider à nous protéger contre le spam automatique, veuillez sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
'asirra-badpass' => 'Pour nous aider à nous protéger des essais automatiques de cassage de mot de passe, veuillez sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
- 'asirra-createaccount' => 'Pour nous aider à nous protéger contre la création automatique de comptes, veuillez sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
+ 'asirra-createaccount' => "Pour nous aider à nous protéger contre la création automatique de comptes, veuillez sélectionner '''uniquement les photos de chats''' dans la boîte ci-dessous :",
'asirra-createaccount-fail' => 'Veuillez identifier correctement les chats.',
'asirra-create' => 'Pour nous aider à nous protéger contre la création automatique de pages, veuillez sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
'asirra-nojs' => "'''Veuillez activer le JavaScript et re-soumettre la page.'''",
@@ -207,6 +235,21 @@ $messages['ja'] = array(
'asirra-failed' => '猫ãŒå†™ã£ã¦ã„ã‚‹ç”»åƒã‚’ã™ã¹ã¦é¸æŠžã—ã¦ãã ã•ã„',
);
+/** Korean (한국어)
+ * @author ì•„ë¼
+ */
+$messages['ko'] = array(
+ 'asirra-desc' => 'ConfirmEditì— ëŒ€í•œ Asirra 모듈',
+ 'asirra-edit' => 'ìžë™í™”ëœ íŽ¸ì§‘ 스팸으로부터 보호하기 위해, 아래 ìƒìžì— 있는 ê³ ì–‘ì´ ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”:',
+ 'asirra-addurl' => 'íŽ¸ì§‘ì— ìƒˆë¡œìš´ 바깥 ë§í¬ê°€ í¬í•¨ë˜ì–´ 있습니다. ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해, 아래 ìƒìžì— 있는 ê³ ì–‘ì´ ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”:',
+ 'asirra-badpass' => '비밀번호 깨기로부터 보호하기 위해, 아래 ìƒìžì— 있는 ê³ ì–‘ì´ ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”:',
+ 'asirra-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기로부터 보호하기 위해, 아래 ìƒìžì— 있는 ê³ ì–‘ì´ ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”:',
+ 'asirra-createaccount-fail' => 'ê³ ì–‘ì´ë¥¼ 올바르게 ì„ íƒí•˜ì„¸ìš”.',
+ 'asirra-create' => 'ìžë™í™”ëœ ë¬¸ì„œ 만들기로부터 보호하기 위해, 아래 ìƒìžì— 있는 ê³ ì–‘ì´ ì‚¬ì§„ì„ ì„ íƒí•˜ì„¸ìš”:',
+ 'asirra-nojs' => "'''ìžë°”스í¬ë¦½íŠ¸ë¥¼ 활성화하고 문서를 다시 제출하세요.'''",
+ 'asirra-failed' => 'ê³ ì–‘ì´ ê·¸ë¦¼ì„ ëª¨ë‘ ì„ íƒí•˜ì„¸ìš”',
+);
+
/** Colognian (Ripoarisch)
* @author Purodha
*/
@@ -248,6 +291,21 @@ $messages['mk'] = array(
'asirra-failed' => 'Изберете ги Ñликите што имаат мачка',
);
+/** Malay (Bahasa Melayu)
+ * @author Anakmalaysia
+ */
+$messages['ms'] = array(
+ 'asirra-desc' => 'Modul Asirra untuk ConfirmEdit',
+ 'asirra-edit' => 'Untuk mencegah suntingan spam automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
+ 'asirra-addurl' => 'Suntingan anda mengandungi pautan luar yang baru. Untuk mencegah spam janaan automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
+ 'asirra-badpass' => 'Untuk mencegah pemecahan kata laluan automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
+ 'asirra-createaccount' => 'Untuk mencegah pembukaan akaun automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
+ 'asirra-createaccount-fail' => 'Sila kenal pasti kucing-kucing dengan betul.',
+ 'asirra-create' => 'Untuk mencegah pembukaan halaman automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
+ 'asirra-nojs' => "'''Sila hidupkan JavaScript dan hantar semula halaman ini.'''",
+ 'asirra-failed' => 'Sila kenal pasti semua gambar kucing',
+);
+
/** Maltese (Malti)
* @author Chrisportelli
*/
@@ -275,6 +333,7 @@ $messages['nb'] = array(
'asirra-createaccount-fail' => 'Vennligst angi hva som er katter.',
'asirra-create' => 'Som beskyttelse mot automatisk opprettelse av sider, vennligst velg kun kattebildene i boksen under:',
'asirra-nojs' => "'''Vennligst åpne for JavaScript og lagre siden en gang til.'''",
+ 'asirra-failed' => 'Vennligst merk alle kattebilder',
);
/** Dutch (Nederlands)
@@ -284,7 +343,7 @@ $messages['nb'] = array(
$messages['nl'] = array(
'asirra-desc' => 'Asirra-module voor ConfirmEdit',
'asirra-edit' => 'Kies ter bescherming tegen geautomatiseerde spam de afbeeldingen met een poes in het onderstaande venster:',
- 'asirra-addurl' => "Uw bewerking bevat nieuwe externe verwijzingen. Om te helpen beschermen tegen geautomatiseerde spam, selecteer de foto's van katten in het vak hieronder:",
+ 'asirra-addurl' => "Uw bewerking bevat nieuwe externe koppelingen. Selecteer de foto's van katten in het vak hieronder om te helpen beschermen tegen geautomatiseerde spam:",
'asirra-badpass' => 'Kies ter bescherming tegen het automatisch kraken van wachtwoorden de afbeeldingen met een poes in het onderstaande venster:',
'asirra-createaccount' => 'Kies om het automatisch aanmaken van gebruikers tegen te gaan de afbeeldingen met een poes in het onderstaande venster:',
'asirra-createaccount-fail' => 'Identificeer de katten juist.',
@@ -293,6 +352,13 @@ $messages['nl'] = array(
'asirra-failed' => 'Identificeer alle afbeeldingen van katten.',
);
+/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
+ * @author Siebrand
+ */
+$messages['nl-informal'] = array(
+ 'asirra-addurl' => "Je bewerking bevat nieuwe externe koppelingen. Selecteer de foto's van katten in het vak hieronder om te helpen beschermen tegen geautomatiseerde spam:",
+);
+
/** Polish (polski)
* @author BeginaFelicysym
*/
@@ -338,6 +404,15 @@ $messages['pt'] = array(
'asirra-nojs' => "'''Possibilite o uso de JavaScript e reenvie a página, por favor.'''",
);
+/** tarandíne (tarandíne)
+ * @author Joetaras
+ */
+$messages['roa-tara'] = array(
+ 'asirra-desc' => 'Module Asirra pe confermà le cangiaminde',
+ 'asirra-createaccount-fail' => 'Pe piacere idendifiche correttamende le categorije.',
+ 'asirra-failed' => 'Pe piacere idendifiche tutte le categorije de le immaggine',
+);
+
/** Russian (руÑÑкий)
* @author DCamer
*/
@@ -353,6 +428,21 @@ $messages['ru'] = array(
'asirra-failed' => 'ПожалуйÑта, идентифицируйте вÑе фотографии кота',
);
+/** Sinhala (සිංහල)
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['si'] = array(
+ 'asirra-desc' => 'ConfirmEdit සඳහ෠Asirra මොඩියුලය',
+ 'asirra-failed' => 'කරුණà·à¶šà¶» සියලුම cat පින්තූරයන් හඳුනà·à¶œà¶±à·Šà¶±',
+);
+
+/** Swedish (svenska)
+ * @author WikiPhoenix
+ */
+$messages['sv'] = array(
+ 'asirra-failed' => 'Var god identifiera alla kattbilder',
+);
+
/** Tagalog (Tagalog)
* @author AnakngAraw
*/
@@ -368,6 +458,21 @@ $messages['tl'] = array(
'asirra-failed' => 'Paki kilalanin ang lahat ng mga imahe ng pusa',
);
+/** Ukrainian (українÑька)
+ * @author Base
+ */
+$messages['uk'] = array(
+ 'asirra-desc' => 'Модуль Asirra Ð´Ð»Ñ ConfirmEdit',
+ 'asirra-edit' => 'З метою захиÑту проти автоматичного Ñпаму у ÑтаттÑÑ…, будь лаÑка оберіть фотографії кота, у блоці нижче:',
+ 'asirra-addurl' => 'Ваше Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ” нові зовнішні поÑиланнÑ. З метою захиÑту проти автоматичного Ñпаму у ÑтаттÑÑ…, будь лаÑка оберіть фотографії кота, у блоці нижче:',
+ 'asirra-badpass' => 'З метою захиÑту проти автоматичного підбору паролю, будь лаÑка оберіть фотографії кота, у блоці нижче:',
+ 'asirra-createaccount' => 'З метою захиÑту проти автоматичного ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ñ… запиÑів, будь лаÑка оберіть фотографії кота, у блоці нижче:',
+ 'asirra-createaccount-fail' => 'Будь лаÑка, правильно ідентифікуйте котів.',
+ 'asirra-create' => 'З метою захиÑту проти автоматичного ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñтатей, будь лаÑка оберіть фотографії кота, у блоці нижче:',
+ 'asirra-nojs' => "'''Будь лаÑка увімкніть JavaScript Ñ– оновіть Ñторінку.'''",
+ 'asirra-failed' => 'Будь лаÑка, ідентифікуйте уÑÑ– фотографії кота',
+);
+
/** Walloon (walon)
* @author Srtxg
*/
diff --git a/extensions/ConfirmEdit/Asirra.php b/extensions/ConfirmEdit/Asirra.php
index ff4cee9a..923b0b9e 100644
--- a/extensions/ConfirmEdit/Asirra.php
+++ b/extensions/ConfirmEdit/Asirra.php
@@ -24,17 +24,17 @@ if ( !defined( 'MEDIAWIKI' ) ) {
exit;
}
-$dir = __DIR__ . '/';
-require_once( "$dir/ConfirmEdit.php" );
+$dir = __DIR__;
+require_once( $dir . '/ConfirmEdit.php' );
$wgCaptchaClass = 'Asirra';
-$wgExtensionMessagesFiles['Asirra'] = "$dir/Asirra.i18n.php";
-$wgAutoloadClasses['Asirra'] = "$dir/Asirra.class.php";
+$wgExtensionMessagesFiles['Asirra'] = $dir . '/Asirra.i18n.php';
+$wgAutoloadClasses['Asirra'] = $dir . '/Asirra.class.php';
-$wgResourceModules['ext.confirmedit.asirra'] = array(
- 'localBasePath' => $dir,
- 'remoteExtPath' => 'ConfirmEdit',
- 'scripts' => 'ext.confirmedit.asirra.js',
+$wgResourceModules['ext.confirmEdit.asirra'] = array(
+ 'localBasePath' => $dir . '/resources',
+ 'remoteExtPath' => 'ConfirmEdit/resources',
+ 'scripts' => 'ext.confirmEdit.asirra.js',
'messages' => array(
'asirra-failed',
),
diff --git a/extensions/ConfirmEdit/Captcha.php b/extensions/ConfirmEdit/Captcha.php
index 0f78d36f..9967dd47 100644
--- a/extensions/ConfirmEdit/Captcha.php
+++ b/extensions/ConfirmEdit/Captcha.php
@@ -42,6 +42,7 @@ class SimpleCaptcha {
Xml::element( 'input', array(
'name' => 'wpCaptchaWord',
'id' => 'wpCaptchaWord',
+ 'autocomplete' => 'off',
'tabindex' => 1 ) ) . // tab in before the edit textarea
"</p>\n" .
Xml::element( 'input', array(
@@ -577,15 +578,23 @@ class SimpleCaptcha {
/**
* @param $module ApiBase
+ * @return bool
+ */
+ protected function isAPICaptchaModule( $module ) {
+ return $module instanceof ApiEditPage;
+ }
+
+ /**
+ * @param $module ApiBase
* @param $params array
+ * @param $flags int
* @return bool
*/
- public function APIGetAllowedParams( &$module, &$params ) {
- if ( !$module instanceof ApiEditPage ) {
- return true;
+ public function APIGetAllowedParams( &$module, &$params, $flags ) {
+ if ( $flags && $this->isAPICaptchaModule( $module ) ) {
+ $params['captchaword'] = null;
+ $params['captchaid'] = null;
}
- $params['captchaword'] = null;
- $params['captchaid'] = null;
return true;
}
@@ -596,11 +605,10 @@ class SimpleCaptcha {
* @return bool
*/
public function APIGetParamDescription( &$module, &$desc ) {
- if ( !$module instanceof ApiEditPage ) {
- return true;
+ if ( $this->isAPICaptchaModule( $module ) ) {
+ $desc['captchaid'] = 'CAPTCHA ID from previous request';
+ $desc['captchaword'] = 'Answer to the CAPTCHA';
}
- $desc['captchaid'] = 'CAPTCHA ID from previous request';
- $desc['captchaword'] = 'Answer to the CAPTCHA';
return true;
}
diff --git a/extensions/ConfirmEdit/ConfirmEdit.alias.php b/extensions/ConfirmEdit/ConfirmEdit.alias.php
index 7823cf69..763d75c6 100644
--- a/extensions/ConfirmEdit/ConfirmEdit.alias.php
+++ b/extensions/ConfirmEdit/ConfirmEdit.alias.php
@@ -23,6 +23,11 @@ $specialPageAliases['arz'] = array(
'Captcha' => array( 'كابتشا' ),
);
+/** Zazaki (Zazaki) */
+$specialPageAliases['diq'] = array(
+ 'Captcha' => array( 'QodaÄ°timadi' ),
+);
+
/** Esperanto (Esperanto) */
$specialPageAliases['eo'] = array(
'Captcha' => array( 'KontraÅ­spamilo' ),
diff --git a/extensions/ConfirmEdit/ConfirmEdit.i18n.php b/extensions/ConfirmEdit/ConfirmEdit.i18n.php
index 54111b53..1c6421f0 100644
--- a/extensions/ConfirmEdit/ConfirmEdit.i18n.php
+++ b/extensions/ConfirmEdit/ConfirmEdit.i18n.php
@@ -33,7 +33,7 @@ Unfortunately this may inconvenience users with limited vision or using text-bas
At the moment we do not have an audio alternative available.
Please contact the [[{{MediaWiki:Grouppage-sysop}}|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate actions.
-Hit the 'back' button in your browser to return to the page editor.",
+Hit the \"back\" button in your browser to return to the page editor.",
'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
# Syntax is as follows:
# * Everything from a "#" character to the end of the line is a comment
@@ -50,6 +50,7 @@ Hit the 'back' button in your browser to return to the page editor.",
* @author Meithal
* @author Meno25
* @author Purodha
+ * @author Shirayuki
* @author Siebrand
* @author The Evil IP address
* @author Toliño
@@ -57,28 +58,31 @@ Hit the 'back' button in your browser to return to the page editor.",
*/
$messages['qqq'] = array(
'captcha-edit' => 'This message will be shown when editing if the wiki requires solving a captcha for editing.
-See also
-*{{msg-mw|Questycaptcha-edit}}
-*{{msg-mw|Fancycaptcha-edit}}',
- 'captcha-desc' => '{{desc}}',
+{{Related|ConfirmEdit-edit}}',
+ 'captcha-desc' => '{{desc|name=Confirm Edit|url=http://www.mediawiki.org/wiki/Extension:ConfirmEdit}}',
'captcha-label' => 'Label field for input field shown in forms',
'captcha-addurl' => 'The explanation of CAPTCHA shown to users trying to add new external links.
-See also
-*{{msg-mw|Questycaptcha-addurl}}
-*{{msg-mw|Fancycaptcha-addurl}}',
+{{Related|ConfirmEdit-addurl}}',
'captcha-badlogin' => 'The explanation of CAPTCHA shown to users failed three times to type in correct password.
-See also
-*{{msg-mw|Questycaptcha-badlogin}}
-*{{msg-mw|Fancycaptcha-badlogin}}',
+{{Related|ConfirmEdit-badlogin}}',
'captcha-createaccount' => 'The explanation of CAPTCHA shown to users trying to create a new account.
-See also
-*{{msg-mw|Questycaptcha-createaccount}}
-*{{msg-mw|Fancycaptcha-createaccount}}',
+{{Related|ConfirmEdit-createaccount}}',
+ 'captcha-createaccount-fail' => 'Used as failure message.
+{{Related|ConfirmEdit-createaccount-fail}}',
'captcha-create' => 'This message will be shown when creating a page if the wiki requires solving a captcha for that.
-See also
-*{{msg-mw|Questycaptcha-create}}
-*{{msg-mw|Fancycaptcha-create}}',
+{{Related|ConfirmEdit-create}}',
+ 'captcha-sendemail' => 'Used as footer text.
+{{Related|ConfirmEdit-sendemail}}',
+ 'captcha-sendemail-fail' => 'Used as failure message.
+
+See also:
+* {{msg-mw|Captcha-createaccount-fail}}',
+ 'captcha-disabledinapi' => 'Used as error message when in the API mode.',
'captchahelp-title' => 'The page title of [[Special:Captcha/help]]',
+ 'captchahelp-cookies-needed' => 'The page title for this message is {{msg-mw|Captchahelp-title}}.
+
+This message follows the following help message:
+* {{msg-mw|Captchahelp-text}}.',
'captchahelp-text' => 'This is the help text shown on [[Special:Captcha/help]].',
'captcha-addurl-whitelist' => "See also: [[MediaWiki:Spam-blacklist]] and [[MediaWiki:Spam-whitelist]]. Leave all the wiki markup, including the spaces, as is. You can translate the text, including 'Leave this line exactly as it is'. The first line of this messages has one (1) leading space.",
'right-skipcaptcha' => '{{doc-right|skipcaptcha}}',
@@ -193,19 +197,20 @@ Punche o botón 'enta zaga' d'o suyo navegador ta tornar ta l'editor de pachinas
* @author Mido
* @author OsamaK
* @author Samer
+ * @author Zanatos
*/
$messages['ar'] = array(
'captcha-edit' => 'لتعديل هذه الصÙحة، من Ùضلك قم بحل المسألة الرياضية البسيطة بالأسÙÙ„ وأدخل الإجابة ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):',
'captcha-desc' => 'يوÙر تقنيات كابتشا للحماية ضد السبام وتخمين كلمات السر',
'captcha-label' => 'كابتشا',
'captcha-addurl' => 'تعديلك يحتوي على وصلات خارجية جديدة.
-للمساعدة ÙÙŠ الحماية من السبام الأوتوماتيكي، من Ùضلك حل عملية الجمع بالأسÙÙ„ وأدخل الإجابة ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
- 'captcha-badlogin' => 'للمساعدة ÙÙŠ الحماية ضد سرقة كلمات السر، من Ùضلك حل عملية الجمع البسيطة بالأسÙÙ„ وأدخل الحل ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
- 'captcha-createaccount' => 'كحماية ضد إنشاء الحسابات الأوتوماتيكي، من Ùضلك حل العملية الحسابية بالأسÙÙ„ وأدخل الإجابة ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
+للمساعدة ÙÙŠ الحماية من السبام الأوتوماتيكي، من Ùضلك حل عملية الجمع بالأسÙÙ„ وأدخل الإجابة ÙÙŠ الصندوق لكي يتم Ø­Ùظ تعديلك ([[Special:Captcha/help|مزيد من المعلومات]]):',
+ 'captcha-badlogin' => 'للمساعدة ÙÙŠ الحماية ضد سرقة كلمات السر، من Ùضلك حل عملية الجمع البسيطة بالأسÙÙ„ وأدخل الحل ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):',
+ 'captcha-createaccount' => 'كحماية ضد إنشاء الحسابات الأوتوماتيكي، من Ùضلك حل عملية الجمع البسيطة بالأسÙÙ„ وأدخل الإجابة ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):',
'captcha-createaccount-fail' => 'كود تأكيد غير صحيح أو Ù…Ùقود.',
'captcha-create' => 'لإنشاء هذه الصÙحة، من Ùضلك حل المسألة الرياضية التالية وأدخل
الإجابة ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):',
- 'captcha-sendemail' => 'للمساعدة ÙÙŠ الحماية ضد السخام الأتوماتيكي، رجاءً Ø­ÙÙ„ مسألة الجمع البسيطة أدناه وأدخل الإجابة ÙÙŠ المربع ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
+ 'captcha-sendemail' => 'للمساعدة ÙÙŠ الحماية ضد السخام الأتوماتيكي، من Ùضلك حل عملية الجمع البسيطة بالأسÙÙ„ وأدخل الإجابة ÙÙŠ الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):',
'captcha-sendemail-fail' => 'كود تأكيد غير صحيح أو Ù…Ùقود',
'captcha-disabledinapi' => 'هذا الإجراء يتطلب تحقيق , لذلك لايمكن أعتمادها من API.',
'captchahelp-title' => 'مساعدة الكابتشا',
@@ -276,15 +281,15 @@ $messages['as'] = array(
'captcha-desc' => 'সà§à¦ªà¦¾à¦® আৰৠগà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ অনà§à¦®à¦¾à¦¨à§° পৰা ৰকà§à¦·à¦¾ কৰিবলৈ CAPTCHA কৌশলৰ বà§à¦¯à§±à¦¹à¦¾à§°',
'captcha-label' => 'কেপছা',
'captcha-addurl' => 'আপোনাৰ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¤ বাহিৰলৈ সংযোগ আছে।
-সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à§€à¦¯à¦¼ সà§à¦ªà¦¾à¦®à§° পৰা বাচিবলৈ, তলৰ সহজ অংকটো কৰি উতà§à¦¤à§°à¦¤à§‹ বাকছৰ ভিতৰত লিখক ([[Special:Captcha/help|অধিক তথà§à¦¯]]):', # Fuzzy
- 'captcha-badlogin' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ভঙাৰ পৰা বাচিবলৈ, তলৰ সহজ অংকটো কৰি উতà§à¦¤à§°à¦Ÿà§‹ বাকছৰ ভিতৰত লিখক
-([[Special:Captcha/help|অধিক তথà§à¦¯]]):', # Fuzzy
- 'captcha-createaccount' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à§€à¦¯à¦¼ হোৱা ভাবে সদসà§à¦¯à¦­à§à¦•à§à¦¤à¦¿ ৰোধ কৰিবলৈ, তলৰ সহজ অংকটো কৰি উতà§à¦¤à§°à¦¤à§‹ বাকছৰ ভিতৰত লিখক
-([[Special:Captcha/help|অধিক তথà§à¦¯]]):', # Fuzzy
+ৱিকিখন সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à§€à¦¯à¦¼ সà§à¦ªà¦¾à¦®à§° পৰা বাচিবলৈ, তলৰ সহজ অংকটো কৰি উতà§à¦¤à§°à¦¤à§‹ বাকছৰ ভিতৰত লিখক ([[Special:Captcha/help|অধিক তথà§à¦¯]]):',
+ 'captcha-badlogin' => 'ৱিকিত সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ভঙাৰ পৰা বাচিবলৈ, তলৰ সহজ অংকটো কৰি উতà§à¦¤à§°à¦Ÿà§‹ বাকছৰ ভিতৰত লিখক
+([[Special:Captcha/help|অধিক তথà§à¦¯]]):',
+ 'captcha-createaccount' => 'ৱিকিত সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼à¦­à¦¾à§±à§‡ হোৱা সদসà§à¦¯à¦­à§à¦•à§à¦¤à¦¿ ৰোধ কৰিবলৈ অনà§à¦—à§à§°à¦¹ কৰি তলৰ সহজ অংকটো কৰক আৰৠউতà§à¦¤à§°à¦¤à§‹ বাকছৰ ভিতৰত লিখক
+([[Special:Captcha/help|অধিক তথà§à¦¯]]):',
'captcha-createaccount-fail' => 'ভà§à¦² বা খালী নিশà§à¦¬à¦¿à¦¤à¦•à§°à¦£ শবà§à¦¦',
'captcha-create' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹ তৈয়াৰ কৰিবলৈ, তলৰ সহজ অংকটো কৰি উতà§à¦¤à§°à¦¤à§‹ বাকছৰ ভিতৰত লিখক
([[Special:Captcha/help|অধিক তথà§à¦¯]]):',
- 'captcha-sendemail' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼ সà§à¦ªà§‡à¦®à¦¿à¦™à§° পৰা বাচিবলৈ অনà§à¦—à§à§°à¦¹ কৰি তলৰ সৰল অংকটো কৰক আৰৠবাকছটোত উতà§à¦¤à§° লিখক ([[Special:Captcha/help|অধিক তথà§à¦¯]]):', # Fuzzy
+ 'captcha-sendemail' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼ সà§à¦ªà¦¾à¦®à¦¿à¦™à§° পৰা ৱিকিখন বচাবৰ বাবে অনà§à¦—à§à§°à¦¹ কৰি তলৰ সৰল অংকটো কৰক আৰৠবাকছটোত উতà§à¦¤à§° লিখক ([[Special:Captcha/help|অধিক তথà§à¦¯]]):',
'captcha-sendemail-fail' => 'ভà§à¦² বা খালী নিশà§à¦šà¦¿à¦¤à¦•à§°à¦£ সংকেত',
'captcha-disabledinapi' => 'à¦à¦‡ কামটোৰ বাবে captchaৰ পà§à§°à¦¯à¦¼à§‹à¦œà¦¨, গতিকে ইয়াক APIৰ মাধà§à¦¯à¦®à§‡à§°à§‡ কৰিব পৰা নাযাব।',
'captchahelp-title' => 'কà§à¦¯à¦¾à¦ªà¦šà¦¾ সাহাযà§à¦¯',
@@ -350,6 +355,13 @@ $messages['az'] = array(
'captchahelp-title' => 'CAPTCHA kömək',
);
+/** South Azerbaijani (تورکجه)
+ * @author Amir a57
+ */
+$messages['azb'] = array(
+ 'captchahelp-title' => 'Captcha کؤمک',
+);
+
/** Bashkir (башҡортÑа)
* @author Assele
* @author ҒатаУлла
@@ -514,6 +526,7 @@ $messages['bg'] = array(
/** Bengali (বাংলা)
* @author Bellayet
+ * @author Leemon2010
* @author Nasir8891
* @author Prometheus.pyrphoros
* @author Usarker
@@ -523,7 +536,8 @@ $messages['bn'] = array(
'captcha-edit' => 'à¦à¦‡ নিবনà§à¦§à¦Ÿà¦¿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করতে দয়া করে নিচের সহজ যোগটি সমাধান করà§à¦¨ à¦à¦¬à¦‚ ফলাফলটি বাকà§à¦¸à¦Ÿà¦¿à¦¤à§‡ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):',
'captcha-desc' => 'সà§à¦ªà§à¦¯à¦¾à¦® à¦à¦¬à¦‚ পাসওয়ারà§à¦¡ অনà§à¦®à¦¾à¦¨ পà§à¦°à¦¤à¦¿à¦°à§‹à¦§à§‡ কà§à¦¯à¦¾à¦ªà¦šà¦¾ পà§à¦°à¦¯à§à¦•à§à¦¤à¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦°',
'captcha-label' => 'কà§à¦¯à¦¾à¦ªà¦šà¦¾',
- 'captcha-addurl' => 'আপনার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¯à¦¼ নতà§à¦¨ বহিঃসংযোগ বিদà§à¦¯à¦®à¦¾à¦¨à¥¤ সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ সà§à¦ªà§à¦¯à¦¾à¦®à§‡à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° খাতিরে অনà§à¦—à§à¦°à¦¹ নিচের যোগটি সমাহদান করà§à¦¨ à¦à¦¬à¦‚ উতà§à¦¤à¦°à¦Ÿà¦¿ বাকà§à¦¸à§‡ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):', # Fuzzy
+ 'captcha-addurl' => 'আপনার সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¯à¦¼ নতà§à¦¨ বহিঃসংযোগ বিদà§à¦¯à¦®à¦¾à¦¨à¥¤
+সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ সà§à¦ªà§à¦¯à¦¾à¦®à§‡à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° খাতিরে অনà§à¦—à§à¦°à¦¹ নিচের যোগটি সমাহদান করà§à¦¨ à¦à¦¬à¦‚ উতà§à¦¤à¦°à¦Ÿà¦¿ বাকà§à¦¸à§‡ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):',
'captcha-badlogin' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ শবà§à¦¦à¦šà¦¾à¦¬à¦¿ কà§à¦°â€Œà§à¦¯à¦¾à¦•à¦¿à¦‚-à¦à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° খাতিরে অনà§à¦—à§à¦°à¦¹ করে নিচের যোগটি সমাধান করà§à¦¨ à¦à¦¬à¦‚ উতà§à¦¤à¦°à¦Ÿà¦¿ বাকà§à¦¸à§‡ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):', # Fuzzy
'captcha-createaccount' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ সৃষà§à¦Ÿà¦¿ রোধ করার খাতিরে অনà§à¦—à§à¦°à¦¹ করে নিচের যোগটি সমাধান করà§à¦¨ à¦à¦¬à¦‚ উতà§à¦¤à¦°à¦Ÿà¦¿ বাকà§à¦¸à§‡ পà§à¦°à¦¬à§‡à¦¶ করান ([[Special:Captcha/help|আরও তথà§à¦¯]]):', # Fuzzy
'captcha-createaccount-fail' => 'ভà§à¦² অথবা হারিয়ে যাওয়া নিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ সংকেত',
@@ -723,12 +737,13 @@ $messages['cy'] = array(
'captcha-edit' => "Er mwyn gallu golygu'r dudalen, gwnewch y swm isod a gosodwch y canlyniad yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
'captcha-desc' => 'Yn gweithredu technegau CAPTCHA i arbed rhag sbam a dyfalu cyfrineiriau',
'captcha-label' => 'CAPTCHA',
- 'captcha-addurl' => 'Mae eich golygiad yn cynnwys cysylltiadau URL newydd. Er mwyn profi nad ydych yn beiriant sbam, byddwch gystal â theipio cyfanswm y swm canlynol yn y blwch isod ([[Special:Captcha/help|mwy o wybodaeth]]):', # Fuzzy
- 'captcha-badlogin' => 'Er mwyn ceisio rhwystro peiriannau datrys cyfrineiriau, byddwch gystal â gwneud y swm isod a gosod yr ateb yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):', # Fuzzy
- 'captcha-createaccount' => "Teipiwch cyfanswm y swm canlynol yn y blwch isod, os gwelwch yn dda. Mae'r nodwedd hon yn rhwystro rhaglenni sbam rhag creu cyfrifon i'w hunain ([[Special:Captcha/help|Mwy o wybodaeth]]):", # Fuzzy
+ 'captcha-addurl' => 'Mae eich golygiad yn cynnwys cysylltiadau allanol newydd.
+Er mwyn gwarchod y wici rhag peiriant sbam, byddwch gystal â theipio cyfanswm y swm canlynol yn y blwch isod i roi eich golygiad ar gadw ([[Special:Captcha/help|mwy o wybodaeth]]):',
+ 'captcha-badlogin' => 'Er mwyn arbed y wici rhag peiriannau datrys cyfrineiriau, byddwch gystal â gwneud y swm syml isod a gosod yr ateb yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+ 'captcha-createaccount' => 'Er mwyn arbed y wici rhag peiriannau dechrau cyfrifon, byddwch gystal â gwneud y swm syml isod a gosod yr ateb yn y blwch ([[Special:Captcha/help|mwy o wybodaeth]]):',
'captcha-createaccount-fail' => "Côd cadarnhau ar goll neu'n anghywir.",
'captcha-create' => "Er mwyn gallu creu'r dudalen, gwnewch y swm isod a gosodwch y canlyniad yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
- 'captcha-sendemail' => 'Er mwyn cyfrannu at ddiogelu rhag sbamio awtomatig, byddwch gystal â gwneud y swm syml isod ac ysgrifennwch yr ateb yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):', # Fuzzy
+ 'captcha-sendemail' => "Er mwyn arbed y wici rhag sbamio awtomatig, byddwch gystal â gwneud y swm syml isod ac ysgrifennu'r ateb yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
'captcha-sendemail-fail' => 'Y cod cadarnhau yn anghywir neu yn eisiau.',
'captcha-disabledinapi' => 'Mae angen "captcha" i gyflawni\'r weithred hon, felly nid oes modd ei gyflawni trwy\'r API.',
'captchahelp-title' => 'Cymorth "captcha"',
@@ -866,7 +881,7 @@ Der „Zurück“-Knopf des Browsers führt zurück zum Bearbeitungsfenster.',
$messages['diq'] = array(
'captcha-edit' => 'Qe ena pel vurnayîşî, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
'captcha-desc' => 'Rehat CAPTCHA teknoloci u dezgina parola-ezayan',
- 'captcha-label' => 'CAPTCHA',
+ 'captcha-label' => "'''Kodê itimadi'''",
'captcha-addurl' => 'Vurnayışa şıma gray teberiya newi muhtewa kena.
Otomatik spamî ra pawitîş, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse ([[Special:Captcha/help|malumato detayın]]):',
'captcha-badlogin' => 'Otomatik spam ra pawıtışi, ma rica keno cewabê problemî qutiyê ke cor de zerre ey ra binuse
@@ -952,38 +967,37 @@ $messages['ee'] = array(
* @author Glavkos
* @author Kiriakos
* @author Omnipaedista
+ * @author Protnet
* @author ZaDiak
* @author ΠεÏίεÏγος
*/
$messages['el'] = array(
- 'captcha-edit' => 'Για να επεξεÏγαστείτε αυτή την σελίδα, παÏακαλοÏμε λÏστε την παÏακάτω Ï€Ïόσθεση και απαντήστε στο πλαίσιο ([[Special:Captcha/help|πληÏοφοÏίες]]):',
- 'captcha-desc' => 'ΠαÏέχει τεχνικές CAPTCHA για την Ï€Ïοστασία από spam και Ï€Ïοσπάθειες σπασίματος κωδικών Ï€Ïόσβασης',
+ 'captcha-edit' => 'Για να επεξεÏγαστείτε αυτή τη σελίδα, παÏακαλοÏμε υπολογίστε το παÏακάτω απλό άθÏοισμα και γÏάψτε την απάντηση στο πλαίσιο ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'captcha-desc' => 'ΠαÏέχει τεχνικές CAPTCHA για την Ï€Ïοστασία από spam και Ï€Ïοσπάθειες σπασίματος κωδικών Ï€Ïόσβασης',
'captcha-label' => 'CAPTCHA',
- 'captcha-addurl' => 'Η επεξεÏγασία σας πεÏιλαμβάνει νέους εξωτεÏικοÏÏ‚ συνδέσμους. Για λόγους Ï€Ïοστασίας κατά αυτοματοποιημένου spam, παÏακαλοÏμε λÏστε την παÏακάτω Ï€Ïόσθεση και απαντήστε στο πλαίσιο ([[Special:Captcha/help|πληÏοφοÏίες]]):', # Fuzzy
- 'captcha-badlogin' => 'Για να βοηθήσετε στην Ï€Ïοστασία ενάντια στον "σπασμένο" κωδικό Ï€Ïόσβασης, παÏακαλώ λÏστε αυτή την απλή Ï€Ïάξη και εισάγετε το αποτέλεσμα της στο παÏακάτω κενό ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):', # Fuzzy
- 'captcha-createaccount' => 'Για να βοηθήσετε στην Ï€Ïοστασία ενάντια στην αυτοματοποιημένη δημιουÏγία λογαÏιασμοÏ, παÏακαλώ λÏστε την απλή Ï€Ïάξη
-και εισάγετε την λÏση της στο παÏακάτω κενό
-([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):', # Fuzzy
- 'captcha-createaccount-fail' => 'Λάθος ή αγνοοÏμενος κωδικός ολοκλήÏωσης.',
- 'captcha-create' => 'Για να δημιουÏγήσετε την σελίδα, παÏακαλοÏμε λÏστε την παÏακάτω Ï€Ïόσθεση και απαντήστε στο πλαίσιο ([[Special:Captcha/help|πληÏοφοÏίες]]):',
- 'captcha-sendemail' => 'Για να βοηθήσετε στην αποφυγή αυτοματοποιημένων spam, παÏακαλοÏμε να λÏσετε την παÏακάτω απλή Ï€Ïάξη και να εισάγετε την απάντηση στο πεδίο ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):', # Fuzzy
- 'captcha-sendemail-fail' => 'Ελλιπής ή λανθασμένος κωδικός επιβεβαίωσης.',
+ 'captcha-addurl' => 'Η επεξεÏγασία σας πεÏιλαμβάνει νέους εξωτεÏικοÏÏ‚ συνδέσμους. Για λόγους Ï€Ïοστασίας κατά αυτοματοποιημένων ανεπιθÏμητων δημοσιεÏσεων, παÏακαλοÏμε υπολογίστε το παÏακάτω άθÏοισμα και γÏάψτε την απάντηση στο κουτάκι ώστε να αποθηκευτεί η επεξεÏγασία σας ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'captcha-badlogin' => 'Για την Ï€Ïοστασία του wiki απέναντι σε σπάσιμο κωδικών Ï€Ïόσβασης, παÏακαλοÏμε υπολογίστε το παÏακάτω απλό άθÏοισμα και γÏάψτε την απάντηση στο πλαίσιο ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'captcha-createaccount' => 'Για την Ï€Ïοστασία του wiki απέναντι σε αυτοματοποιημένη δημιουÏγία λογαÏιασμών, παÏακαλοÏμε υπολογίστε το παÏακάτω απλό άθÏοισμα και γÏάψτε την απάντηση στο πλαίσιο ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'captcha-createaccount-fail' => 'Λανθασμένος ή μη πληκτÏολογημένος κωδικός επιβεβαίωσης.',
+ 'captcha-create' => 'Για να δημιουÏγήσετε τη σελίδα, παÏακαλοÏμε υπολογίστε το παÏακάτω απλό άθÏοισμα και γÏάψτε την απάντηση στο πλαίσιο ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'captcha-sendemail' => 'Για την Ï€Ïοστασία του βίκι απέναντι σε αυτοματοποιημένες ανεπιθÏμητες δημοσιεÏσεις, παÏακαλοÏμε υπολογίστε το παÏακάτω απλό άθÏοισμα και γÏάψτε την απάντηση στο πλαίσιο ([[Special:Captcha/help|πεÏισσότεÏες πληÏοφοÏίες]]):',
+ 'captcha-sendemail-fail' => 'Λανθασμένος ή μη πληκτÏολογημένος κωδικός επιβεβαίωσης.',
'captcha-disabledinapi' => 'Η ενέÏγεια αυτή απαιτεί επαλήθευση Î»ÎµÎºÏ„Î¹ÎºÎ¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï… και για αυτό δεν μποÏεί να γίνει μέσω του API.',
- 'captchahelp-title' => 'Βοήθεια για το Captcha',
- 'captchahelp-cookies-needed' => 'Θα Ï€Ïέπει να έχετε τα cookies ενεÏγοποιημένα στον φυλλομετÏητή σας για να εκτελεστεί η λειτουÏγία.',
- 'captchahelp-text' => "Οι ιστοσελίδες που δέχονται τις επεξεÏγασίες από το κοινό, όπως αυτό το wiki, δεν χÏησιμοποιοÏνται συχνά σωστά από τους spammers που χÏησιμοποιοÏν τα αυτοματοποιημένα εÏγαλεία για να αποστείλουν τις συνδέσεις τους με πολλές σελίδες. Αυτές οι spam συνδέσεις μποÏοÏν να αφαιÏεθοÏν, επειδή είναι σημαντικά ενοχλητικές.
+ 'captchahelp-title' => 'Βοήθεια για CAPTCHA',
+ 'captchahelp-cookies-needed' => 'Θα Ï€Ïέπει να έχετε τα cookies ενεÏγοποιημένα στον πεÏιηγητή σας για να εκτελεστεί η λειτουÏγία.',
+ 'captchahelp-text' => 'Οι ιστότοποι που επιτÏέπουν δημόσια επεξεÏγασία, όπως αυτό το wiki, παÏαβιάζονται συχνά από spammers που χÏησιμοποιοÏν αυτοματοποιημένα εÏγαλεία για να δημοσιεÏουν μαζικά υπεÏσυνδέσμους σε πλήθος ιστοτόπων. Αν και αυτοί σÏνδεσμοι spam μποÏοÏν να αφαιÏεθοÏν, είναι μεγάλος μπελάς.
-ΜεÏικές φοÏές, ειδικά κατά την Ï€Ïοσθήκη νέων συνδέσμων σε μια σελίδα, το wiki μποÏεί να σας παÏουσιάσει μια εικόνα με ένα χÏωματισμένο ή διαστÏεβλωμένο κείμενο και να σας ζητήσει να πληκτÏολογήσετε τις λέξεις που παÏουσιάζονται. Δεδομένου ότι αυτό είναι ένας στόχος που είναι δÏσκολο να αυτοματοποιηθεί, θα επιτÏέψει στους πεÏισσότεÏους χÏήστες να κάνουν τις επεξεÏγασίες τους, σταματώντας τους spammers και άλλους Ïομποτικά επιτιθέμενους.
+ΜεÏικές φοÏές, ειδικά κατά την Ï€Ïοσθήκη νέων συνδέσμων σε μια σελίδα, το wiki μποÏεί να σας παÏουσιάσει μια εικόνα με χÏωματισμένο ή διαστÏεβλωμένο κείμενο και να σας ζητήσει να πληκτÏολογήσετε τις λέξεις που διακÏίνετε. Δεδομένου ότι αυτή η εÏγασία είναι δÏσκολο να αυτοματοποιηθεί, θα επιτÏέψει στους πεÏισσότεÏους Ï€ÏαγματικοÏÏ‚ ανθÏώπους να κάνουν τις δημοσιεÏσεις τους, σταματώντας όμως spammers και άλλους Ïομποτικά επιτιθέμενους.
-Δυστυχώς αυτό μποÏεί να ενοχλήσει τους χÏήστες πεÏιοÏίζοντας το ÏŒÏαμα τους ή αυτοÏÏ‚ που βασίζονται στο κείμενο ή στην ομιλία που βασίζεται στις μηχανές αναζήτησης. ΠÏος το παÏόν δεν έχουμε μια διαθέσιμη εναλλακτική λÏση. ΠαÏακαλώ ελάτε σε επαφή με τους [[{{MediaWiki:Grouppage-sysop}}|διαχειÏιστές]] των σελίδων για βοήθεια, εάν αυτό σας αποτÏέπει απÏοσδόκητα από την παÏαγωγή των νόμιμων επεξεÏγασιών.
+Δυστυχώς αυτό μποÏεί να Ï€Ïοκαλέσει δυσχέÏεια σε χÏήστες με Ï€Ïοβλήματα ÏŒÏασης τους ή όσους χÏησιμοποιοÏν πεÏιηγητές αποκλειστικά κειμένου ή πεÏιηγητές με ομιλία. ΠÏος το παÏόν δεν έχουμε κάποια ηχητική εναλλακτική λÏση διαθέσιμη. ΠαÏακαλώ επικοινωνήστε με τους [[{{MediaWiki:Grouppage-sysop}}|διαχειÏιστές]] του ιστότοπου για βοήθεια, εάν αυτό για κάποιο λόγο σας αποτÏέπει να εκτελέσετε θεμιτές ενέÏγειες.
-Πατήστε το κουμπί 'πίσω' στη μηχανή αναζήτησης σας για να επιστÏέψετε στο συντάκτη σελίδων.",
+Πατήστε το κουμπί «πίσω» στον πεÏιηγητή σας για να επιστÏέψετε στον επεξεÏγαστή σελίδων.',
'captcha-addurl-whitelist' => ' #<!-- αφήστε αυτή την γÏαμμή ακÏιβώς όπως είναι --> <pre>
-# Η σÏνταξη είναι όπως παÏακάτω:
-# * Οτιδήποτε από ένα χαÏακτήÏα "#" ως το τέλος της γÏαμμής είναι ένα σχόλιο
-# * Κάθε μη κενή γÏαμμή είναι μια έκφÏαση regex που θα ταιÏιάζει μόνο hosts μέσα σε URL
+# Η σÏνταξη είναι ως ακολοÏθως:
+# * Οποιαδήποτε γÏαμμή ξεκινάει με χαÏακτήÏα "#" είναι σχόλιο
+# * Κάθε μη κενή γÏαμμή αποτελεί μέÏος κανονικής έκφÏασης η οποία αντιστοιχεί σε διευθÏνσεις URL
#</pre> <!-- αφήστε αυτή την γÏαμμή ακÏιβώς όπως είναι -->',
- 'right-skipcaptcha' => 'ΠÏαγματοποίηση ενεÏγειών που ενεÏγοποιοÏν captcha χωÏίς να χÏειάζεται πέÏασμα από το captcha',
+ 'right-skipcaptcha' => 'ΠÏαγματοποίηση ενεÏγειών που ενεÏγοποιοÏν CAPTCHA χωÏίς να χÏειάζεται πέÏασμα από το CAPTCHA',
);
/** Canadian English (Canadian English)
@@ -1030,7 +1044,7 @@ $messages['eo'] = array(
'captcha-desc' => 'Disponigas ilojn de Captcha por kontraŭigi spamaĵojn kaj pasvorto-divenadon',
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => 'Via redakto entenas novajn eksterajn ligilojn.
-Por malhelpi aÅ­tomatan spamadon, bonvolu solvi la simplan problemon sube kaj entajpu la respondon en la kesto ([[Special:Captcha/help|pli da informo]]):', # Fuzzy
+Por protekti la vikion kontraux aÅ­tomata spamado, bonvolu solvi la simplan problemon sube kaj entajpu la respondon en la kesto por konservi vian redakton ([[Special:Captcha/help|pli da informo]]):',
'captcha-badlogin' => 'Helpi protekti kontraÅ­ aÅ­tomata divenado de pasvortoj, bonvolu solvi la simplan sumon kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):', # Fuzzy
'captcha-createaccount' => 'Helpi protekti kontraÅ­ aÅ­tomata konto-kreado, bonvolu solvi la simplan sumon suben
kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):', # Fuzzy
@@ -1112,6 +1126,7 @@ Presione el botón 'atrás' en su navegador para retornar al editor de página."
$messages['et'] = array(
'captcha-edit' => 'Selle lehekülje muutmiseks lahenda palun lihtne tehe ja sisesta vastus kasti ([[Special:Captcha/help|lisateave]]).',
'captcha-desc' => 'Pakub robotilõksu abil kaitset rämpspostituste ja paroolide äraarvamise vastu.',
+ 'captcha-label' => 'Robotilõks',
'captcha-addurl' => 'Sinu muudatus sisaldab uusi välislinke.
Palun lahenda allpool lihtne tehe ja sisesta vastus kasti, et saaksid muudatuse salvestada. Abinõu on viki kaitseks automaadistatud rämpsmuudatuste eest ([[Special:Captcha/help|lisateave]]):',
'captcha-badlogin' => 'Palun lahenda allpool lihtne tehe ja sisesta vastus kasti. Abinõu on viki kaitseks automaatsete parooliäraarvajate eest ([[Special:Captcha/help|lisateave]]):',
@@ -1175,7 +1190,7 @@ Zure nabigatzaileko 'atzera' lotura erabili aldaketen orrialdera itzultzeko.",
$messages['fa'] = array(
'captcha-edit' => 'برای ویرایش این مقاله، لطÙاً حاصل جمع زیر را حساب کنید Ùˆ نتیجه را در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
'captcha-desc' => 'روش‌های مبتنی بر CAPTCHA برای مقابله با هرزنگاری Ùˆ کش٠گذرواژه Ùراهم می‌کند',
- 'captcha-label' => 'حر٠بزرگ',
+ 'captcha-label' => 'کپچا',
'captcha-addurl' => 'ویرایش شما شامل پیوندهای تازه‌ای به بیرون است.
برای Ú©Ù…Ú© به جلوگیری از ارسال خودکار هرزنامه‌ها، لطÙاً حاصل جمع زیر را حساب کنید Ùˆ نتیجه را در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
'captcha-badlogin' => 'برای Ú©Ù…Ú© به جلوگیری از سرقت خودکار کلمه عبور، لطÙاً حاصل جمع زیر را حساب کنید Ùˆ نتیجه را در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
@@ -1210,6 +1225,7 @@ $messages['fa'] = array(
* @author Centerlink
* @author Crt
* @author Linnea
+ * @author Nedergard
* @author Nike
* @author Varusmies
*/
@@ -1217,9 +1233,10 @@ $messages['fi'] = array(
'captcha-edit' => 'Ratkaise alla oleva summa jatkaaksesi ([[Special:Captcha/help|lisätietoja]]):',
'captcha-desc' => 'Tarjoaa CAPTCHA-tekniikoita suojaamaan mainoslinkkejä ja salasana-arvailua vastaan.',
'captcha-label' => 'CAPTCHA',
- 'captcha-addurl' => 'Muokkauksesi sisältää uusia linkkejä muille sivuille. Ratkaise alla oleva summa jatkaaksesi ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
- 'captcha-badlogin' => 'Salasananmurtajasovellusten takia, ratkaise alla oleva summa jatkaaksesi ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
- 'captcha-createaccount' => 'Ratkaise alla oleva summa jatkaaksesi ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
+ 'captcha-addurl' => 'Muokkauksesi sisältää uusia linkkejä muille sivuille.
+Automatisoitujen roskamuokkausten välttämiseksi ratkaise alla oleva summa ja kirjoita vastauksesi kenttään, jotta voisit tallentaa muokkauksesi ([[Special:Captcha/help|lisätietoja]]):',
+ 'captcha-badlogin' => 'Automatisoidun salasanan murtamisen estämiseksi ratkaise alla oleva summa ja kirjoita vastaus kenttään ([[Special:Captcha/help|lisätietoja]]):',
+ 'captcha-createaccount' => 'Automaattisen käyttäjätunnusten luonnin estämiseksi ratkaise alla oleva summa ja kirjoita se kenttään ([[Special:Captcha/help|lisätietoja]]):',
'captcha-createaccount-fail' => 'Väärä tai puuttuva varmistuskoodi.',
'captcha-create' => 'Ratkaise alla oleva summa jatkaaksesi ([[Special:Captcha/help|lisätietoja]]):',
'captcha-sendemail' => 'Jotta auttaisit suojautumaan automaattiselta roskapostitukselta, ratkaise alla oleva yksinkertainen yhteenlasku ja kirjoita vastaus laatikkoon ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
@@ -1267,6 +1284,7 @@ $messages['fo'] = array(
* @author Grondin
* @author IAlex
* @author Meithal
+ * @author Nicolas NALLET
* @author PieRRoMaN
* @author Seb35
* @author Sherbrooke
@@ -1277,7 +1295,7 @@ $messages['fo'] = array(
* @author Zetud
*/
$messages['fr'] = array(
- 'captcha-edit' => 'Pour modifier cette page, veuillez calculer l’opération simple ci-dessous et en inscrire le résultat dans le champ ([[Special:Captcha/help|plus d’informations]]) :',
+ 'captcha-edit' => 'Pour modifier cette page, veuillez calculer l’opération simple ci-dessous, inscrire le résultat dans le champ ([[Special:Captcha/help|plus d’informations]]), puis cliquer sur le bouton "Publier" en bas de page" :',
'captcha-desc' => 'Offre des techniques CAPTCHA pour protéger contre le pollupostage et la découverte des mots de passe par essais multiples',
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => 'Votre modification inclut de nouveaux liens externes.
@@ -1406,7 +1424,7 @@ Para contribuír na protección contra as ferramentas de publicación automátic
'captcha-sendemail' => 'Para contribuír na protección contra as ferramentas de publicación automática de ligazóns publicitarias, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
'captcha-sendemail-fail' => 'Falta o código de confirmación ou é incorrecto.',
'captcha-disabledinapi' => 'Esta acción necesita o captcha, polo que non se pode realizar a través da API.',
- 'captchahelp-title' => 'Axuda acerca do captcha',
+ 'captchahelp-title' => 'Axuda acerca do CAPTCHA',
'captchahelp-cookies-needed' => 'Necesita ter as cookies habilitadas no seu navegador para que funcione.',
'captchahelp-text' => 'Os sitios web que aceptan publicar as contribucións dos usuarios, coma este wiki, sofren, con frecuencia, o abuso por parte de spammers que usan ferramentas que automatizan a inclusión de lixo en forma de ligazóns publicitarias, nunha chea de páxinas, en pouco tempo.
Mentres as devanditas ligazóns non son eliminadas supoñen unha molestia e unha perda de tempo.
@@ -1424,7 +1442,7 @@ Prema no botón "Atrás" do seu navegador para volver á páxina de edición.',
# * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
# * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos URL
#</pre> <!-- Deixe esta liña tal e como está -->',
- 'right-skipcaptcha' => 'Levar a cabo as accións que requiren captcha sen ter que introducilo',
+ 'right-skipcaptcha' => 'Levar a cabo as accións que requiren CAPTCHA sen ter que introducilo',
);
/** Ancient Greek (ἈÏχαία ἑλληνικὴ)
@@ -1481,13 +1499,12 @@ $messages['gu'] = array(
'captcha-edit' => 'આ લેખમાં ફેરફાર કરવા માટે નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|more info]]):',
'captcha-desc' => '',
'captcha-label' => 'CAPTCHA',
- 'captcha-addurl' => 'તમે કરેલા ફેરફારોમાં નવી બાહà«àª¯ કડીઓ સામેલ છે. સà«àªµàªšàª¾àª²àª¿àª¤ સà«àªªà«‡àª®/સà«àªªàª¾àª®(spam) થી બચવા માટે નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો
-([[Special:Captcha/help|more info]]):', # Fuzzy
- 'captcha-badlogin' => 'આપોઆપ થતી ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾àª¨à«€ ચોરી (password cracking)થી બચાવવા માટે નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|more info]]):', # Fuzzy
- 'captcha-createaccount' => 'આપોઆપ નવા ખાતા ખà«àª²àª¤àª¾ રોકવા માટે નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો', # Fuzzy
+ 'captcha-addurl' => 'તમે કરેલા ફેરફારોમાં નવી બાહà«àª¯ કડીઓ સામેલ છે. સà«àªµàªšàª¾àª²àª¿àª¤ સà«àªªà«‡àª®/સà«àªªàª¾àª®(spam) થી વિકિના બચાવ માટે, કૃપયા નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો અને આપનà«àª‚ સંપાદન સાચવો ([[Special:Captcha/help|more info]]):',
+ 'captcha-badlogin' => 'આપોઆપ થતી ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾àª¨à«€ ચોરી (password cracking)થી વિકિના બચાવ માટે, કૃપયા નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|more info]]):',
+ 'captcha-createaccount' => 'આપોઆપ નવા ખાતા ખà«àª²àªµàª¾àª¥à«€ વિકિના બચાવ માટે નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|વધૠવિગત]]):',
'captcha-createaccount-fail' => 'ખોટી અથવા ખૂટતી ખાતરી સંજà«àªžàª¾.',
'captcha-create' => 'નવà«àª‚ પાનà«àª‚ બનાવવા માટે નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|more info]]):',
- 'captcha-sendemail' => 'આપોઆપ થતી સà«àªªà«‡àª®àª¿àª‚ગથી બચાવવા માટે નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|more info]]):', # Fuzzy
+ 'captcha-sendemail' => 'આપોઆપ થતી સà«àªªà«‡àª®àª¿àª‚ગથી વિકિના બચાવ માટે, કૃપયા નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજà«àª¨àª¾ ખાનામાં લખો ([[Special:Captcha/help|વધૠવિગત]]):',
'captcha-sendemail-fail' => 'ખોટી અથવા ખૂટતી ખાતરી સંજà«àªžàª¾.',
'captcha-disabledinapi' => 'આ કà«àª°àª¿àª¯àª¾ માટે કેપà«àªšàª¾àª¨à«€ જરૂર છે, માટે તે API દà«àªµàª¾àª°àª¾ પાર પાડી શકાય તેમ નથી.',
'captchahelp-title' => 'કેપà«àªŸà«àªšàª¾/કેપà«àªšàª¾ (Captcha) મદદ',
@@ -1684,12 +1701,12 @@ $messages['hu'] = array(
'captcha-edit' => 'A lap szerkesztéséhez meg kell, hogy kérjünk, írd be a lenti dobozba az alábbi egyszerű összeadás eredményét ([[Special:Captcha/help|segítség]]):',
'captcha-desc' => 'CAPTCHA-technológiák a spamek és a jelszókitalálási technikák ellen',
'captcha-label' => 'CAPTCHA',
- 'captcha-addurl' => 'Szerkesztésed új külső linket tartalmaz. A reklámokat elhelyező robotok kiszűrése érdekében meg kell, hogy kérjünk, írd be a lenti dobozba az alábbi matematikai művelet eredményét. ([[Special:Captcha/help|segítség]])', # Fuzzy
- 'captcha-badlogin' => 'Az automatikus jelszófeltörés kiszűrése érdekében meg kell, hogy kérjünk, írd be a lenti dobozba az alábbi egyszerű számtani művelet eredményét ([[Special:Captcha/help|segítség]]):', # Fuzzy
- 'captcha-createaccount' => 'A felhasználói fiókok automatizált létrehozásának kiszűrése érdekében meg kell, hogy kérjünk, írd be a lenti dobozba az alábbi egyszerű számtani művelet eredményét. ([[Special:Captcha/help|segítség]])', # Fuzzy
+ 'captcha-addurl' => 'Szerkesztésed új külső linket tartalmaz. A reklámokat elhelyező robotok kiszűrése érdekében tisztelettel megkérünk, hogy írd be a lenti dobozba az alábbi egyszerű összeadás eredményét. ([[Special:Captcha/help|segítség]])',
+ 'captcha-badlogin' => 'Az automatikus jelszófeltörés kiszűrése érdekében tisztelettel megkérünk, írd be a lenti dobozba az alábbi egyszerű összeadás eredményét ([[Special:Captcha/help|segítség]]):',
+ 'captcha-createaccount' => 'A felhasználói fiókok automatizált létrehozásának kiszűrése érdekében meg kell, hogy kérjünk, írd be a lenti dobozba az alábbi egyszerű összeadás eredményét ([[Special:Captcha/help|segítség]]):',
'captcha-createaccount-fail' => 'Hibás vagy hiányzó ellenőrző kód.',
'captcha-create' => 'Az oldal elkészítéséhez meg kell, hogy kérjünk, írd be a lenti dobozba az alábbi egyszerű számtani művelet eredményét. ([[Special:Captcha/help|segítség]])',
- 'captcha-sendemail' => 'Hogy segíts az automatizált spammelés elleni védekezésben, kérünk oldd meg az alábbi egyszerű számítást, és írd be az eredményt a szövegdobozba ([[Special:Captcha/help|segítség]]):', # Fuzzy
+ 'captcha-sendemail' => 'Hogy védjük a wikit az automatizált spammelés ellen, kérünk oldd meg az alábbi egyszerű összeadást, és írd be az eredményt a szövegdobozba ([[Special:Captcha/help|segítség]]):',
'captcha-sendemail-fail' => 'Hibás vagy hiányzó ellenőrző kód.',
'captcha-disabledinapi' => 'Ez a művelet captcha megoldásához kötött, így nem lehet végrehajtani az API-n keresztül.',
'captchahelp-title' => 'Captcha segítség',
@@ -1709,6 +1726,14 @@ Ha a captcha megoldása helyett inkább visszatérnél a szöveg szerkesztéséh
'right-skipcaptcha' => 'captcha átugrása',
);
+/** Armenian (Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶)
+ * @author Vadgt
+ */
+$messages['hy'] = array(
+ 'captcha-label' => 'Ô±Õ¶Õ¾Õ¿Õ¡Õ¶Õ£Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¯Õ¸Õ¤',
+ 'captchahelp-title' => 'Ô±Õ¶Õ¾Õ¿Õ¡Õ¶Õ£Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¯Õ¸Õ¤Õ« Ö…Õ£Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶',
+);
+
/** Interlingua (interlingua)
* @author McDutchie
*/
@@ -1858,6 +1883,7 @@ Notaðu „til-baka“-hnapp vafrans til að breyta síðunni.',
* @author Beta16
* @author BrokenArrow
* @author Darth Kule
+ * @author Nemo bis
*/
$messages['it'] = array(
'captcha-edit' => 'Per modificare la pagina è necessario risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella
@@ -1875,13 +1901,13 @@ $messages['it'] = array(
'captcha-disabledinapi' => 'Questa azione richiede un captcha, quindi non può essere eseguita tramite API.',
'captchahelp-title' => "Cos'è il captcha?",
'captchahelp-cookies-needed' => 'È necessario abilitare i cookie sul proprio browser per proseguire',
- 'captchahelp-text' => "Capita spesso che i siti Web che accettano messaggi pubblici, come questo wiki, siano presi di mira da spammer che usano strumenti automatici per inserire collegamenti pubblicitari verso un gran numero di siti. Per quanto i collegamenti indesiderati si possano rimuovere, si tratta comunque di una seccatura non indifferente.
+ 'captchahelp-text' => "Capita spesso che i siti web che accettano contributi pubblici, come questo wiki, siano presi di mira da persone che usano strumenti automatici per inserire collegamenti pubblicitari verso un gran numero di siti (spam). Per quanto i collegamenti indesiderati si possano rimuovere, si tratta comunque di una seccatura non indifferente.
-In alcuni casi, ad esempio quando si tenta di aggiungere nuovi collegamenti Web in una pagina, il software wiki può mostrare una immagine con un breve testo colorato e/o distorto chiedendo di riscriverlo in un'apposita finestrella. Poiché si tratta di un'azione difficile da replicare da parte di un computer, questo meccanismo consente a (quasi tutti) gli utenti reali di completare l'inserimento desiderato, impedendo l'accesso alla maggior parte degli spammer e degli altri attacchi automatizzati.
+In alcuni casi, ad esempio quando si tenta di aggiungere nuovi collegamenti web in una pagina, il software wiki può mostrare una immagine con un breve testo colorato e/o distorto chiedendo di riscriverlo in un'apposita finestrella. Poiché si tratta di un'azione difficile da replicare da parte di un computer, questo meccanismo consente a (quasi tutti) gli utenti reali di completare l'inserimento desiderato, impedendo l'accesso alla maggior parte degli spammer e degli altri attacchi automatizzati.
Sfortunatamente, queste misure di sicurezza possono mettere in difficoltà gli utenti con problemi visivi o coloro che utilizzano browser testuali o basati sulla sintesi vocale. Purtroppo al momento non è disponibile un meccanismo alternativo basato su messaggi audio; se queste procedure impediscono l'inserimento informazioni che si ritengono legittime, si prega di contattare gli [[{{MediaWiki:Grouppage-sysop}}|amministratori del sito]] e chiedere loro assistenza.
-Fare clic sul pulsante 'back' del browser per tornare alla pagina di modifica.",
+Fare clic sul pulsante \"indietro\" del browser per tornare alla pagina di modifica.",
'captcha-addurl-whitelist' => ' #<!-- non modificare in alcun modo questa riga --> <pre>
# La sintassi è la seguente:
# * Tutto ciò che segue un carattere "#" è un commento, fino al termine della riga
@@ -1899,7 +1925,7 @@ Fare clic sul pulsante 'back' del browser per tornare alla pagina di modifica.",
* @author Whym
*/
$messages['ja'] = array(
- 'captcha-edit' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã«ã¯ã€ä¸‹è¨˜ã®ç°¡å˜ãªæ•°å¼ã‚’計算ã—ã¦ãã®ç­”ãˆã‚’欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„([[Special:Captcha/help|ヘルプ]]):',
+ 'captcha-edit' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã«ã¯ã€ä¸‹è¨˜ã®ç°¡å˜ãªæ•°å¼ã‚’計算ã—ã¦ãã®ç­”ãˆã‚’欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|ヘルプ]]):',
'captcha-desc' => 'スパム攻撃やパスワード推定攻撃を防ããŸã‚ã® CAPTCHA 技術をæä¾›ã™ã‚‹',
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => 'ã‚ãªãŸã¯æ–°ã—ã„外部リンクを追加ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
@@ -1926,7 +1952,7 @@ $messages['ja'] = array(
ページã®ç·¨é›†ã«æˆ»ã‚‹ã«ã¯ã€ãƒ–ラウザーã®ã€Œæˆ»ã‚‹ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ãã ã•ã„。',
'captcha-addurl-whitelist' => ' #<!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ --> <pre>
# 構文ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:
-# * "#"文字ã‹ã‚‰è¡Œæœ«ã¾ã§ã¯ã‚³ãƒ¡ãƒ³ãƒˆã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™
+# * 「#ã€æ–‡å­—ã‹ã‚‰è¡Œæœ«ã¾ã§ã¯ã‚³ãƒ¡ãƒ³ãƒˆã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™
# * 空白をå«ã¾ãªã„è¡Œã¯ã€URLã«å«ã¾ã‚Œã‚‹ãƒ›ã‚¹ãƒˆåã¨ã®ä¸€è‡´ã‚’検出ã™ã‚‹æ­£è¦è¡¨ç¾ã§ã™
#</pre> <!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ -->',
'right-skipcaptcha' => 'CAPTCHAãŒå¿…è¦ãªå ´é¢ã§CAPTCHAをスキップã—ã¦æ“作を実行',
@@ -2003,12 +2029,12 @@ $messages['ka'] = array(
'captcha-desc' => 'უზრუნველყáƒáƒ¤áƒ¡ CAPTCHA-ს მეთáƒáƒ“ების გáƒáƒ›áƒáƒ§áƒ”ნებáƒáƒ¡ სპáƒáƒ›áƒ˜áƒ¡áƒ დრპáƒáƒ áƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒªáƒœáƒáƒ‘ისáƒáƒ’áƒáƒœ დáƒáƒ¡áƒáƒªáƒáƒ•áƒáƒ“',
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => 'თქვენი ცვლილებრშეიცáƒáƒ•áƒ¡ áƒáƒ®áƒáƒš გáƒáƒ áƒ” ბმულებს.
-áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ სპáƒáƒ›áƒ˜áƒœáƒ’ისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):', # Fuzzy
- 'captcha-badlogin' => 'პáƒáƒ áƒáƒšáƒ”ბის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ გáƒáƒ¢áƒ”ხვისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):', # Fuzzy
- 'captcha-createaccount' => 'áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ შექმნისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):', # Fuzzy
+ვიკის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ სპáƒáƒ›áƒ˜áƒœáƒ’ისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, ჩვენ გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— გრáƒáƒ¤áƒáƒ¨áƒ˜, რáƒáƒ—რთქვენი რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრშეინáƒáƒ®áƒáƒ¡ ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
+ 'captcha-badlogin' => 'ვიკის პáƒáƒ áƒáƒšáƒ”ბის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ გáƒáƒ¢áƒ”ხვისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, ჩვენ გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— გრáƒáƒ¤áƒáƒ¨áƒ˜ ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
+ 'captcha-createaccount' => 'ვიკის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ შექმნისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, ჩვენ გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— გრáƒáƒ¤áƒáƒ¨áƒ˜ ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
'captcha-createaccount-fail' => 'დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის კáƒáƒ“ი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ დáƒáƒ™áƒáƒ áƒ’ულიáƒ.',
'captcha-create' => 'გვერდის შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“, გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
- 'captcha-sendemail' => 'áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ სპáƒáƒ›áƒ˜áƒœáƒ’ისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— ყუთში ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):', # Fuzzy
+ 'captcha-sendemail' => 'ვიკის áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ სპáƒáƒ›áƒ˜áƒœáƒ’ისგáƒáƒœ თáƒáƒ•áƒ“áƒáƒªáƒ•áƒ˜áƒ¡ მიზნით, ჩვენ გთხáƒáƒ•áƒ—, áƒáƒ›áƒáƒ®áƒ¡áƒœáƒáƒ— ქვემáƒáƒ— მáƒáƒªáƒ”მული მáƒáƒ áƒ¢áƒ˜áƒ•áƒ˜ მáƒáƒ’áƒáƒšáƒ˜áƒ—ი დრპáƒáƒ¡áƒ£áƒ®áƒ˜ შეიყვáƒáƒœáƒáƒ— გრáƒáƒ¤áƒáƒ¨áƒ˜ ([[Special:Captcha/help|მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ]]):',
'captcha-sendemail-fail' => 'დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბის კáƒáƒ“ი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ დáƒáƒ™áƒáƒ áƒ’ულიáƒ.',
'captcha-disabledinapi' => 'ეს მáƒáƒ¥áƒ›áƒ”დებრმáƒáƒ˜áƒ—ხáƒáƒ•áƒ¡ CAPTCHA-ს შემáƒáƒ¬áƒ›áƒ”ბáƒáƒ¡ დრáƒáƒ›áƒ˜áƒ¢áƒáƒ› შეუძლებელირმისი შესრულებრAPI-ით.',
'captchahelp-title' => 'CAPTCHA-ს დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ',
@@ -2144,21 +2170,21 @@ $messages['km'] = array(
* @author ì•„ë¼
*/
$messages['ko'] = array(
- 'captcha-edit' => 'ê¸€ì„ íŽ¸ì§‘í•˜ê¸° 위해서는, ì•„ëž˜ì˜ ê°„ë‹¨í•œ ë§ì…ˆ ê°’ì„ ìž…ë ¥ìƒìžì— ì ì–´ 주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'captcha-desc' => '스팸과 비밀번호 탈취를 방지하기 위한 CAPTCHA(캡차) ê¸°ëŠ¥ì„ ì œê³µ',
+ 'captcha-edit' => 'ê¸€ì„ íŽ¸ì§‘í•˜ë ¤ë©´ ì•„ëž˜ì˜ ê°„ë‹¨í•œ ë§ì…ˆ ê°’ì„ ìž…ë ¥ ìƒìžì— ì ì–´ 주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'captcha-desc' => '스팸과 비밀번호 탈취를 방지하기 위한 CAPTCHA(캡차) ê¸°ìˆ ì„ ì œê³µí•©ë‹ˆë‹¤',
'captcha-label' => 'CAPTCHA(캡차)',
'captcha-addurl' => 'íŽ¸ì§‘ì— ìƒˆë¡œìš´ 바깥 ë§í¬ê°€ í¬í•¨ë˜ì–´ 있습니다.
-ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 위키를 보호하기 위해, íŽ¸ì§‘ì„ ì €ìž¥í•˜ë ¤ë©´ ì•„ëž˜ì˜ ê°„ë‹¨í•œ 계산 ê°’ì„ ìž…ë ¥ìƒìžì— ì ì–´ 주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'captcha-badlogin' => 'ìžë™í™”ëœ ê³„ì • 비밀번호 해킹으로부터 위키를 보호하기 위해, ì•„ëž˜ì˜ ê°„ë‹¨í•œ 계산 ê°’ì„ ìž…ë ¥ ìƒìžì— 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'captcha-createaccount' => 'ìžë™í™”ëœ ê³„ì • 가입으로부터 위키를 보호하기 위해, ì•„ëž˜ì˜ ê°„ë‹¨í•œ 계산 ê°’ì„ ìž…ë ¥ìƒìžì— ì ì–´ 주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 위키를 보호하기 위해, íŽ¸ì§‘ì„ ì €ìž¥í•˜ë ¤ë©´ ì•„ëž˜ì˜ ê°„ë‹¨í•œ 계산 ê°’ì„ ìž…ë ¥ ìƒìžì— ì ì–´ 주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'captcha-badlogin' => 'ìžë™í™”ëœ ë¹„ë°€ë²ˆí˜¸ 깨기로부터 위키를 보호하기 위해, ì•„ëž˜ì˜ ê°„ë‹¨í•œ 계산 ê°’ì„ ìž…ë ¥ ìƒìžì— 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'captcha-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기로부터 위키를 보호하기 위해, ì•„ëž˜ì˜ ê°„ë‹¨í•œ 계산 ê°’ì„ ìž…ë ¥ ìƒìžì— ì ì–´ 주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
'captcha-createaccount-fail' => 'ìž…ë ¥ê°’ì´ ìž˜ëª»ë˜ì—ˆê±°ë‚˜ 없습니다.',
- 'captcha-create' => '문서를 만들기 위해서는, ì•„ëž˜ì˜ ê°„ë‹¨í•œ 계산 ê°’ì„ ìž…ë ¥ìƒìžì— ì ì–´ 주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'captcha-sendemail' => 'ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 위키를 보호하기 위해, ì•„ëž˜ì˜ ê°„ë‹¨í•œ 계산 ê°’ì„ ìž…ë ¥ìƒìžì— ì ì–´ 주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'captcha-create' => '문서를 만드려면 ì•„ëž˜ì˜ ê°„ë‹¨í•œ 계산 ê°’ì„ ìž…ë ¥ ìƒìžì— ì ì–´ 주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'captcha-sendemail' => 'ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 위키를 보호하기 위해, ì•„ëž˜ì˜ ê°„ë‹¨í•œ 계산 ê°’ì„ ìž…ë ¥ ìƒìžì— ì ì–´ 주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
'captcha-sendemail-fail' => 'ìž…ë ¥ê°’ì´ ìž˜ëª»ë˜ì—ˆê±°ë‚˜ 없습니다.',
'captcha-disabledinapi' => 'ì´ ë™ìž‘ì€ ìº¡ì°¨ë¥¼ ê±°ì³ì•¼ 하기 ë•Œë¬¸ì— APIë¡œ ì´ ìž‘ì—…ì„ ìˆ˜í–‰í•  수 없습니다.',
'captchahelp-title' => 'CAPTCHA(캡차) ë„움ë§',
'captchahelp-cookies-needed' => 'ì •ìƒì ìœ¼ë¡œ ìž‘ë™í•˜ë ¤ë©´ 웹 브ë¼ìš°ì €ì˜ 쿠키 ì‚¬ìš©ì´ í™œì„±í™”ë˜ì–´ 있어야 합니다.',
- 'captchahelp-text' => "ì´ ìœ„í‚¤ì™€ ê°™ì´ ì‚¬ëžŒì˜ ê³µê°œì ì¸ 참여가 가능한 웹 사ì´íŠ¸ì—서는 ìžë™ í”„ë¡œê·¸ëž¨ì´ ìŠ¤íŒ¸ì„ ë¿Œë¦¬ëŠ” 경우가 있습니다.
+ 'captchahelp-text' => 'ì´ ìœ„í‚¤ì™€ ê°™ì´ ì‚¬ëžŒì˜ ê³µê°œì ì¸ 참여가 가능한 웹 사ì´íŠ¸ì—서는 ìžë™ í”„ë¡œê·¸ëž¨ì´ ìŠ¤íŒ¸ì„ ë¿Œë¦¬ëŠ” 경우가 있습니다.
물론 ì´ëŸ¬í•œ ìŠ¤íŒ¸ì€ ì œê±°í•  수는 있지만 번거로운 ìž‘ì—…ì´ ëŠ˜ì–´ë‚©ë‹ˆë‹¤.
ì´ëŸ¬í•œ ìŠ¤íŒ¸ì„ ë°©ì§€í•˜ê¸° 위해서, ì´ ìœ„í‚¤ì˜ ë¬¸ì„œì— ì›¹ 사ì´íŠ¸ 주소를 추가하는 ë“±ì˜ í–‰ë™ì„ í•  경우ì—는 비틀린 글ìžê°€ 들어있는 ê·¸ë¦¼ì„ ë³´ì—¬ì£¼ê³  ê·¸ ê·¸ë¦¼ì˜ ê¸€ìžë¥¼ 입력해 달ë¼ê³  하는 경우가 있습니다.
@@ -2166,9 +2192,9 @@ $messages['ko'] = array(
웹 브ë¼ìš°ì €ì—ì„œ ê·¸ë¦¼ì„ ì™„ë²½í•˜ê²Œ 표시할 수 없거나, ê·¸ë¦¼ì´ ë‚˜ì˜¤ì§€ 않는 í…스트 ë°©ì‹ì´ë‚˜ ìŒì„± 합성 ë°©ì‹ ì›¹ 브ë¼ìš°ì €ë¥¼ 사용하는 경우ì—는 ì´ëŸ¬í•œ ìž…ë ¥ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤.
ì•„ì§ê¹Œì§€ëŠ” ì´ëŸ° ê²½ìš°ì— ëŒ€í•œ ëŒ€ì•ˆì´ ì—†ìŠµë‹ˆë‹¤.
-ì´ ê²½ìš° [[{{MediaWiki:Grouppage-sysop}}|사ì´íŠ¸ 관리ìž]]ì—게 ë„ì›€ì„ ìš”ì²­í•´ 주세요.
+예기치않게 정당한 í–‰ë™ì„ 하지 못하ë„ë¡ ë§‰ëŠ”ë‹¤ë©´ [[{{MediaWiki:Grouppage-sysop}}|사ì´íŠ¸ 관리ìž]]ì—게 ë„ì›€ì„ ìš”ì²­í•´ 주세요.
-ì´ì „ 화면으로 ëŒì•„가려면 웹 브ë¼ìš°ì €ì˜ '뒤로' ë²„íŠ¼ì„ ëˆŒëŸ¬ 주세요.",
+ì´ì „ 화면으로 ëŒì•„가려면 웹 브ë¼ìš°ì €ì˜ "뒤로" ë²„íŠ¼ì„ ëˆ„ë¥´ì„¸ìš”.',
'captcha-addurl-whitelist' => ' #<!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> <pre>
# ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다:
# * "#"ë¡œ 시작하는 ì¤„ì€ ì£¼ì„입니다.
@@ -2223,11 +2249,19 @@ Jetz kanns De met Dingem Brauser singem „Zeröck“-Knopp wigger maache, wo De
'captcha-addurl-whitelist' => ' #<!-- Lohß di Reih he jenou esu wi se es --> <pre>
# Dä Opbou es:
# * Alles fun enem #-Zeiche bes an et Engk fun ene Reih es ene Kommentaa för de Minsche
-# * Jede Reih met jet dren es en Stöck regular Expression, wat Domains en URL treffe kann
+# * Jede Reih met jet dren es en Stöck rejolähre Ußdrok, wat Domains en URL treffe kann
#</pre> <!-- Lohß di Reih he jenou esu wi se es -->',
'right-skipcaptcha' => 'De Opforderung fum Kaptscha överjonn',
);
+/** Cornish (kernowek)
+ * @author Kernoweger
+ */
+$messages['kw'] = array(
+ 'captcha-createaccount-fail' => 'Coden afydhya camm po gwag.',
+ 'captcha-sendemail-fail' => 'Coden afydhya camm po gwag.',
+);
+
/** Kirghiz (Кыргызча)
* @author Chorobek
*/
@@ -2297,7 +2331,7 @@ $messages['li'] = array(
'captcha-badlogin' => 'Los alstublieft de onderstaande eenvoudige som op en voer het antwoord in het invoervenster in ter bescherming tegen het automatisch kraken van wachtwoorden ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
'captcha-createaccount' => 'Voer ter bescherming tegen geautomatiseerde spam het antwoord op de onderstaande eenvoudige som in het invoervenster in ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
'captcha-createaccount-fail' => 'De bevestigingscode ontbreekt of is onjuist.',
- 'captcha-create' => 'U wilt een nieuwe pagina aanmaken. Voer alstublieft het antwoord op de onderstaande eenvoudige som in het invoervenster in ([[Special:Captcha/help|meer informatie]]):',
+ 'captcha-create' => 'U wilt een nieuwe pagina aanmaken. Voer het antwoord op de onderstaande eenvoudige som in het invoervenster in ([[Special:Captcha/help|meer informatie]]):',
'captcha-sendemail' => "Veur ter besjerming taege geautomatiseerde spam 't antjwaord op de ongerstaonde einvawdige som in 't inveurvinster in ([[Special:Captcha/help|mier informatie]]):", # Fuzzy
'captcha-sendemail-fail' => 'De bevestigingscode ontbrèk of is ónjuus.',
'captcha-disabledinapi' => "Veur dees actie is 'n captcha neudig die neet aafgehanjeldj kin waere via de API.",
@@ -2305,9 +2339,9 @@ $messages['li'] = array(
'captchahelp-cookies-needed' => 'Ge dient in uw browser cookies ingeschakeld te hebbe om dit te laote werke.',
'captchahelp-text' => "Websites die vrie te bewèrke zeen, wie deze wiki, waere döks misbroek door spammers die d'r met hun programma's automatisch links op zetten naar vele websites. Hoewel deze externe links weer verwijderd kunnen worden, leveren ze wel veel hinder en administratief werk op.
-Soms, en in het bijzonder bij het toevoegen van externe links op pagina's, toont de wiki u een afbeelding met gekleurde of vervormde tekst en wordt u gevraagd de getoonde tekst in te voeren. Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat dit proces succesvol te doorlopen en worden hiermee spammers en andere geautomatiseerde aanvallen geweerd.
+Soms, en in het bijzonder bij het toevoegen van externe links op pagina's, krijgt u een afbeelding te zien met gekleurde of vervormde tekst en wordt u gevraagd de weergegeven tekst in te voeren. Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat dit proces succesvol te doorlopen en worden hiermee spammers en andere geautomatiseerde aanvallen geweerd.
-Helaas levert deze bevestiging voor gebruikers met een visuele handicap of een tekst- of spraakgebaseerde browser problemen op. Op het moment is er geen alternatief met geluid beschikbaar. Vraag alstublieft assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
+Helaas levert deze bevestiging voor gebruikers met een visuele handicap of een tekst- of spraakgebaseerde browser problemen op. Op het moment is er geen alternatief met geluid beschikbaar. Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
Klik óppe 'trök'-knoep in uw browser om terug te gaan naar het tekstbewerkingsscherm.",
'captcha-addurl-whitelist' => ' #<!-- laot deze regel --> <pre>
@@ -2372,6 +2406,24 @@ $messages['mg'] = array(
'right-skipcaptcha' => 'Manao tao mampisy ny captcha fa tsy mila mameno azy',
);
+/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ */
+$messages['min'] = array(
+ 'captchahelp-text' => 'Laman-laman web nan manarimo tulisan dari urang banyak (publik), samacam wiki ko, acok kali disalahgunoan dek pangguno-pangguno nan indak batangguang-jawek untuak mangiriman spam manggunoan program-program otomatis.
+Walaupun pautan-pautan spam tasabuik dapek sajo dihapuih, tapi tatap sajo manimbulan gangguan.
+
+Kadang-kadang, sangkek tangah manambahan pautan web baru ka suatu laman, wiki ko akan manampilan sabantuak gambar dari tulisan nan bawarna ataupun tadistorsi. Dan sudah tu, Sanak dimintak untuak mangetikkan tulisan nan nampak tu.
+Dek iko marupoan suatu karajo nan sulik untuak dibuek sacaro otomatis, pakaro ko akan mudah dilalui dek urang (manusia), sakaliguih dapek manghantian hampiang kasado sarangan spam dan robot otomatis lainnyo.
+
+Sayangnyo, hal iko mambuek sarik bagi pangguno nan tabateh panglihatannyo atau dek pangguno nan manggunoan paramban web babasis-teks ataupun babasis-suaro.
+Kini ko, kami alun dapek alternatip lain untuak manggunoan suaro buek pakaro ko.
+Silakan hubuangi [[{{MediaWiki:Grouppage-sysop}}|panguruih]] untuak mintak bantuan koq pakaro ko manghambaik Sanak untuak mambuek suntiangan nan layak.
+
+Takan tombol "back" di paramban web Sanak untuak baliak ka laman panyuntiangan.',
+ 'right-skipcaptcha' => 'Mamicu CAPTCHA tanpa malaluinyo',
+);
+
/** Macedonian (македонÑки)
* @author Bjankuloski06
* @author Brest
@@ -2659,7 +2711,7 @@ Mit den „Trüch“-Knopp vun dien Browser kummst du trüch na dat Ännerfinste
'right-skipcaptcha' => 'Överspringen vun Captchas',
);
-/** Nedersaksisch (Nedersaksisch)
+/** Nedersaksies (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
@@ -2701,7 +2753,7 @@ $messages['nl'] = array(
Voer het antwoord op de onderstaande eenvoudige som in het invoervenster in ([[Special:Captcha/help|meer informatie]]):',
'captcha-desc' => 'Biedt CAPTCHA-technieken om bescherming te bieden tegen spam en het raden van wachtwoorden',
'captcha-label' => 'CAPTCHA',
- 'captcha-addurl' => "Uw bewerking bevat nieuwe externe verwijzingen (URL's).
+ 'captcha-addurl' => "Uw bewerking bevat nieuwe externe koppelingen (URL's).
Voer ter bescherming tegen geautomatiseerde spam het antwoord op de onderstaande eenvoudige som in in het invoerveld om uw bewerking op te slaan ([[Special:Captcha/help|meer informatie]]):",
'captcha-badlogin' => 'Los de onderstaande eenvoudige som op en voer het antwoord in het invoervenster in ter bescherming tegen het automatisch kraken van wachtwoorden ([[Special:Captcha/help|meer informatie]]):',
'captcha-createaccount' => 'Voer ter bescherming tegen het geautomatiseerd gebruikers aanmaken, het antwoord op de onderstaande eenvoudige som in in het invoervenster ([[Special:Captcha/help|meer informatie]]):',
@@ -2714,9 +2766,9 @@ Voer het antwoord op de onderstaande eenvoudige som in het invoervenster in ([[S
'captchahelp-title' => 'Captcha-hulppagina',
'captchahelp-cookies-needed' => 'U dient in uw browser cookies ingeschakeld te hebben om dit te laten werken.',
'captchahelp-text' => "Websites die vrij te bewerken zijn, zoals deze wiki, worden vaak misbruikt door spammers die er met hun programma's automatisch verwijzigen op zetten naar vele websites.
-Hoewel deze externe verwijzingen weer verwijderd kunnen worden, leveren ze wel veel hinder en administratief werk op.
+Hoewel deze externe koppelingen weer verwijderd kunnen worden, leveren ze wel veel hinder en administratief werk op.
-Soms, en in het bijzonder bij het toevoegen van externe verwijzingen op pagina's, ziet u een afbeelding met gekleurde of vervormde tekst en wordt u gevraagd de weergegeven tekst in te voeren.
+Soms, en in het bijzonder bij het toevoegen van externe koppelingen op pagina's, ziet u een afbeelding met gekleurde of vervormde tekst en wordt u gevraagd de weergegeven tekst in te voeren.
Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat dit proces succesvol te doorlopen en worden hiermee spammers en andere geautomatiseerde aanvallen geweerd.
Helaas levert deze bevestiging voor gebruikers met een visuele handicap of een tekst- of spraakgebaseerde browser problemen op.
@@ -2736,13 +2788,13 @@ Klik op de knop 'terug' in uw browser om terug te gaan naar het tekstbewerkingss
* @author Siebrand
*/
$messages['nl-informal'] = array(
- 'captcha-addurl' => "Je bewerking bevat nieuwe externe verwijzingen (URL's).
-Voer ter bescherming tegen geautomatiseerde spam het antwoord op de onderstaande eenvoudige som in in het invoerveld ([[Special:Captcha/help|meer informatie]]):", # Fuzzy
+ 'captcha-addurl' => "Je bewerking bevat nieuwe externe koppelingen (URL's).
+Voer ter bescherming tegen geautomatiseerde spam het antwoord op de onderstaande eenvoudige som in in het invoerveld om je bewerking op te slaan ([[Special:Captcha/help|meer informatie]]):",
'captchahelp-cookies-needed' => 'Je moet in je browser cookies ingeschakeld te hebben om dit te laten werken.',
'captchahelp-text' => "Websites die vrij te bewerken zijn, zoals deze wiki, worden vaak misbruikt door spammers die er met hun programma's automatisch verwijzigen op zetten naar vele websites.
-Hoewel deze externe verwijzingen weer verwijderd kunnen worden, leveren ze wel veel hinder en administratief werk op.
+Hoewel deze externe koppelingen weer verwijderd kunnen worden, leveren ze wel veel hinder en administratief werk op.
-Soms, en in het bijzonder bij het toevoegen van externe verwijzingen op pagina's, zie je een afbeelding met gekleurde of vervormde tekst en wordt je gevraagd de weergegeven tekst in te voeren.
+Soms, en in het bijzonder bij het toevoegen van externe koppelingen op pagina's, zie je een afbeelding met gekleurde of vervormde tekst en wordt je gevraagd de weergegeven tekst in te voeren.
Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat dit proces succesvol te doorlopen en worden hiermee spammers en andere geautomatiseerde aanvallen geweerd.
Helaas levert deze bevestiging voor gebruikers met een visuele handicap of een tekst- of spraakgebaseerde browser problemen op.
@@ -2762,11 +2814,14 @@ Klik op de knop 'terug' in je browser om terug te gaan naar het tekstbewerkingss
$messages['nn'] = array(
'captcha-edit' => 'For å endre denne sida, ver venleg og løys det enkle reknestykket nedanfor og skriv svaret i ruta ([[Special:Captcha/help|meir informasjon]]):',
'captcha-desc' => 'Enkel implementering av captcha-system.', # Fuzzy
+ 'captcha-label' => 'CAPTCHA',
'captcha-addurl' => 'Endringa di inkluderer nye lenkjer; som eit vern mot automatisert reklame (spam) er du nøydd til skrive inn orda i dette bildet: <br />([[Special:Captcha/help|Kva er dette?]])', # Fuzzy
'captcha-badlogin' => 'For å sikra oss mot automatisk passordtjuveri, ver venleg og skriv inn svaret på det enkle reknestykket i boksen nedanfor ([[Special:Captcha/help|meir informasjon]]):', # Fuzzy
- 'captcha-createaccount' => 'For å verne Wikipedia mot reklame (spam) må du skrive inn orda i biletet for å registrere ein konto. <br />([[Special:Captcha/help|Kva er dette?]])', # Fuzzy
+ 'captcha-createaccount' => 'For å verna wikien mot automatisk kontooppretting, bed me deg om at du løyser det enkle reknestykket under og skriv inn svaret i boksen ([[Special:Captcha/help|meir info]]):',
'captcha-createaccount-fail' => 'Feil eller manglande godkjenningskode.',
'captcha-create' => 'For å opprette denne sida, ver venleg og løys det enkle reknestykket nedanfor og skriv svaret i ruta ([[Special:Captcha/help|Kva er dette?]]):',
+ 'captcha-sendemail-fail' => 'Rang eller manglande stadfestingskode.',
+ 'captcha-disabledinapi' => 'Handlinga krev ein captcha og kan difor ikkje utførast gjennom API-en.',
'captchahelp-title' => 'Captcha-hjelp',
'captchahelp-cookies-needed' => 'Du må ha informasjonskapslar aktivert i nettlesaren din for at dette skal verke.',
'captchahelp-text' => 'Internettsider som kan verte endra av alle, som denne wikien, vert ofte misbrukte av reklameinnleggjarar (spammarar) som nyttar bottar til å poste mange lenkjer om gongen.
@@ -2792,6 +2847,7 @@ Trykk på «attende»-knappen for å kome tilbake til endringssida.',
$messages['oc'] = array(
'captcha-edit' => "Per modificar aquesta pagina, vos cal efectuar lo calcul çaijós e n'inscriure lo resultat dins lo camp ([[Special:Captcha/help|Mai d’entresenhas]]) :",
'captcha-desc' => 'Implementacion captcha simpla', # Fuzzy
+ 'captcha-label' => 'CAPTCHA',
'captcha-addurl' => "Vòstra modificacion inclutz de ligams URL novèla ; per empachar las connexions automatizadas, vos cal picar los mots que s’afichan dins l’imatge que seguís : <br />([[Special:Captcha/help|Qu'es aquò?]])", # Fuzzy
'captcha-badlogin' => "Per ensajar de contornar las temptativas de cracatge de senhals automatizadas per de robòts, recopiatz lo tèxte çaijós dins la bóstia de tèxte plaçada al dejós d'aqueste. ([[Special:Captcha/help|Mai d’entresenhas]])", # Fuzzy
'captcha-createaccount' => 'Coma proteccion contra las creacions de compte abusivas, entratz lo resultat de l’addicion dins la bóstia çaijós:<br />
@@ -2816,6 +2872,7 @@ Clicatz sul boton « Precedent » de vòstre navigador per tornar a la pagina de
);
/** Oriya (ଓଡ଼ିଆ)
+ * @author Jnanaranjan Sahu
* @author Psubhashish
* @author Shisir 1945
*/
@@ -2824,12 +2881,12 @@ $messages['or'] = array(
'captcha-desc' => 'CAPTCHA କାରିଗରି ଉପାୟରେ ସà­à¬ªà¬¾à¬® ଓ ପାସବାରà­à¬¡à¬¼ ରକà­à¬·à¬¾ କରିଥାଠ।',
'captcha-label' => 'କାପà­â€Œà¬šà¬¾',
'captcha-addurl' => 'ଆପଣଙà­à¬• ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾à¬°à­‡ ନୂଆ ବାହାର ଲିଙà­à¬• ରହିଛି ।
-ଆପେଆପେ ହେଉଥିବା ସà­à¬ªà¬¾à¬®à¬° ପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରିବା ନିମନà­à¬¤à­‡ ତଳେ ଥିବା ଗଣିତର ସମାଧାନ କରନà­à¬¤à­ ଓ ତଳେ ଥିବା ଘରେ ଉତà­à¬¤à¬° ଦିଅନà­à¬¤à­ ([[Special:Captcha/help|ଅଧିକ ବିବରଣୀ]]):', # Fuzzy
- 'captcha-badlogin' => 'ଆପେଆପେ ହେଉଥିବା ପାସବାରà­à¬¡à¬¼ ଚୋରାଇବାକୠପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରିବା ନିମନà­à¬¤à­‡ ତଳେ ଥିବା ସରଳ ଗଣିତର ସମାଧାନ କରନà­à¬¤à­ ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):', # Fuzzy
- 'captcha-createaccount' => 'ଆପେଆପେ ହେଉଥିବା ଖାତା ଖୋଲିବାକୠପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରିବା ନିମନà­à¬¤à­‡ ତଳେ ଥିବା ସରଳ ଗଣିତର ସମାଧାନ କରି ଉତà­à¬¤à¬° ଘରେ ଦିଅନà­à¬¤à­ ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):', # Fuzzy
+à¬à¬¹à¬¿ ଉଇକିରେ ଆପେଆପେ ହେଉଥିବା ସà­à¬ªà¬¾à¬®à¬° ପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରିବା ନିମନà­à¬¤à­‡ ଆମେ ଆପଣଙà­à¬•à­ ଅନà­à¬°à­‹à¬§ କରà­à¬›à­ ଯେ ବଦଳକୠସାଇତିବା ପାଇଠତଳେ ଥିବା ଗଣିତର ସମାଧାନ କରନà­à¬¤à­ ଓ ତଳେ ଥିବା ଘରେ ଉତà­à¬¤à¬° ଦିଅନà­à¬¤à­ ([[Special:Captcha/help|ଅଧିକ ବିବରଣୀ]]):',
+ 'captcha-badlogin' => 'à¬à¬¹à¬¿ ଉଇକିରେ ଆପେଆପେ ହେଉଥିବା ପାସବାରà­à¬¡à¬¼ ପରଖକୠପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରିବାରେ ସାହାଯà­à­Ÿ କରିବା ନିମନà­à¬¤à­‡ ଆମେ ଆପଣଙà­à¬•à­ ଅନà­à¬°à­‹à¬§ କରà­à¬›à­ ଯେ ତଳେ ଥିବା ସରଳ ଗଣିତର ସମାଧାନ କରନà­à¬¤à­ à¬à¬¬à¬‚ ଉତà­à¬¤à¬°à¬•à­ ବାକà­à¬¸à¬°à­‡ ଲେଖନà­à¬¤à­ ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):',
+ 'captcha-createaccount' => 'à¬à¬¹à¬¿ ଉଇକିରେ ଆପେଆପେ ଖାତାଗà­à¬¡à¬¿à¬•à¬° ତିଆରିକୠପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରିବାରେ ସାହାଯà­à­Ÿ କରିବା ନିମନà­à¬¤à­‡ ଆମେ ଆପଣଙà­à¬•à­ ଅନà­à¬°à­‹à¬§ କରà­à¬›à­ ଯେ ତଳେ ଥିବା ସରଳ ଗଣିତର ସମାଧାନ କରନà­à¬¤à­ à¬à¬¬à¬‚ ଉତà­à¬¤à¬°à¬•à­ ବାକà­à¬¸à¬°à­‡ ଲେଖନà­à¬¤à­ ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):',
'captcha-createaccount-fail' => 'ନିଶà­à¬šà¬¿à¬¤ କରିବା କୋଡ଼ଟି ଭà­à¬² ଅଛି ବା ମୂଳରୠନାହିଠ।',
'captcha-create' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ତିଆରିବା ନିମନà­à¬¤à­‡, ତଳେ ଥିବା ସହଜ ଅଙà­à¬•à¬Ÿà¬¿à¬° ସମାଧାନ କରନà­à¬¤à­ ଓ ଘରଟିରେ ଫଳାଫଳ ଦିଅନà­à¬¤à­ ([[Special:Captcha/help|ଅଧିକ ଜାଣନà­à¬¤à­]]):',
- 'captcha-sendemail' => 'ଆପେଆପେ ହେଉଥିବା ସà­à¬ªà¬¾à¬®à¬•à­ ପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରିବା ନିମନà­à¬¤à­‡ ତଳେ ଥିବା ସରଳ ଗଣିତର ସମାଧାନ କରି ତଳେ ଥିବା ଉତà­à¬¤à¬° ବାକà­à¬¸à¬°à­‡ ଉତà­à¬¤à¬° ଦିଅନà­à¬¤à­ ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):', # Fuzzy
+ 'captcha-sendemail' => 'à¬à¬¹à¬¿ ଉଇକିରେ ଆପେଆପେ ହେଉଥିବା ସà­à¬ªà¬¾à¬®à¬•à­ ପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରିବାରେ ସାହାଯà­à­Ÿ କରିବା ନିମନà­à¬¤à­‡ ଆମେ ଆପଣଙà­à¬•à­ ଅନà­à¬°à­‹à¬§ କରà­à¬›à­ ଯେ ତଳେ ଥିବା ସରଳ ଗଣିତର ସମାଧାନ କରନà­à¬¤à­ à¬à¬¬à¬‚ ଉତà­à¬¤à¬°à¬•à­ ବାକà­à¬¸à¬°à­‡ ଲେଖନà­à¬¤à­ ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):',
'captcha-sendemail-fail' => 'ନିଶà­à¬šà¬¿à¬¤ କରିବା କୋଡ଼ଟି ଭà­à¬² ଅଛି ବା ମୂଳରୠନାହିଠ।',
'captcha-disabledinapi' => 'à¬à¬¹à¬¿ କାମଟି ପାଇଠà¬à¬• କà­à­Ÿà¬¾à¬ªà¬šà¬¾ ଦରକାର, à¬à¬¹à¬¾ API ଦେଇ କେଭେହେଠହୋଇପାରିବ ନାହିଠ।',
'captchahelp-title' => 'CAPTCHA ସହଯୋଗ',
@@ -2880,13 +2937,15 @@ $messages['pdc'] = array(
* @author BeginaFelicysym
* @author Derbeth
* @author Leinad
+ * @author Matma Rex
* @author Sp5uhe
*/
$messages['pl'] = array(
'captcha-edit' => 'Możesz edytować tę stronę, jednak najpierw musisz rozwiązać poniższe proste działanie matematyczne i wpisać wynik do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
'captcha-desc' => 'Dodaje CAPTCHA – zabezpieczenie przed spamującymi automatami oraz odgadywaniem haseł',
'captcha-label' => 'CAPTCHA',
- 'captcha-addurl' => 'Dodałeś nowe linki zewnętrzne. Ze względu na ochronę przed zautomatyzowanym spamem musisz wykonać proste działanie matematyczne i wpisać wynik w pole obok ([[Special:Captcha/help|więcej informacji]]):', # Fuzzy
+ 'captcha-addurl' => 'Twoje zmiany zawierają nowe linki zewnętrzne.
+Ze względu na ochronę przed zautomatyzowanym spamem prosimy o wykonanie prostego działania matematycznego i wpisanie wyniku w pole obok, zanim twoja edycja zostanie zapisana ([[Special:Captcha/help|więcej informacji]]):',
'captcha-badlogin' => 'Zabezpieczenie przed automatycznym łamaniem hasełm, wpisz w pole poniżej wynik prostego działania matematycznego ([[Special:Captcha/help|pomoc]]):',
'captcha-createaccount' => 'Zabezpieczenie przed automatycznym tworzeniem konta - wpisz w pole poniżej wynik prostego działania matematycznego ([[Special:Captcha/help|pomoc]]):',
'captcha-createaccount-fail' => 'Nieprawidłowy kod lub brak kodu potwierdzającego.',
@@ -2925,14 +2984,14 @@ $messages['pms'] = array(
e ch'a buta l'arzulta ant ël quadrèt ([[Special:Captcha/help|për savejne dë pì]]):",
'captcha-desc' => "A dà dle técniche CAPTCHA për protege contra la rumenta e ij tentativ d'andviné la ciav",
'captcha-label' => 'CAPTCHA',
- 'captcha-addurl' => "Soa modìfica a la gionta dj'anliure esterne. Për giutene a vardesse da la reclam aotomatisà, për piasì ch'a fasa ël total ambelessì sota e ch'a buta l'arzultà ant ël quadrèt ([[Special:Captcha/help|për savejne dë pì]]):", # Fuzzy
- 'captcha-badlogin' => "Për giutene a vardesse da 'nt ij programa ch'a fan ciav fàosse n'aotomàtich, për piasì ch'a fasa ël total ambelessì sota e ch'a buta l'arzultà ant ël quadrèt ([[Special:Captcha/help|për savejne dë pì]]):", # Fuzzy
- 'captcha-createaccount' => "Për giutene a vardesse da ij programa ch'a deurbo dij cont n'aotomàtich, për piasì ch'a fasa ël total ambelessì sota
-e ch'a buta l'arzultà ant ël quadrèt ([[Special:Captcha/help|për savejne dë pì]]):", # Fuzzy
+ 'captcha-addurl' => "Soa modìfica a la gionta dj'anliure esterne. Për goerné la wiki da j'areclam aotomatisà, i-j ciamoma për piasì ch'a fasa ël total ambelessì-sota e ch'a buta l'arzultà ant ël quadrèt për salvé soa modìfica ([[Special:Captcha/help|për savejne dë pì]]):",
+ 'captcha-badlogin' => "Për goerné la wiki da ij programa ch'a fan ciav fàusse n'automàtich, i-j ciamoma për piasì ch'a fasa ël total ambelessì-sota e ch'a buta l'arzultà ant ël quadrèt ([[Special:Captcha/help|për savejne dë pì]]):",
+ 'captcha-createaccount' => "Për goerné la wiki da ij programa ch'a deurbo dij cont n'automàtich, i-j ciamoma për piasì ch'a fasa ël total ambelessì-sota
+e ch'a buta l'arzultà ant ël quadrèt ([[Special:Captcha/help|për savejne dë pì]]):",
'captcha-createaccount-fail' => "Ël còdes ëd verìfica ò ch'a manca d'autut ò ch'a l'é pa bon.",
'captcha-create' => "Për creé d'amblé sta pàgina-sì, për piasì ch'a fasa ël total ambelessì sota e ch'a buta l'arzultà<br />
ant ël quadrèt ([[Special:Captcha/help|për savejne dë pì]]):",
- 'captcha-sendemail' => "Për giuté a protegi contra la rumenta automàtica, për piasì ch'a fasa l'adission sempia sì-sota e ch'a buta l'arspòsta ant la casela ([[Special:Captcha/help|për savèjne ëd pi]]):", # Fuzzy
+ 'captcha-sendemail' => "Për protegi la wiki contra la rumenta automàtica, i-j ciamoma për piasì ch'a fasa l'adission sempia sì-sota e ch'a buta l'arspòsta ant la casela ([[Special:Captcha/help|për savèjne ëd pi]]):",
'captcha-sendemail-fail' => "Ël còdes ëd verìfica ò ch'a manca d'autut ò ch'a l'é pa bon.",
'captcha-disabledinapi' => "St'assion-sì a ciama na captcha, parèj a peul pa esse fàita con na API.",
'captchahelp-title' => 'Còs é-lo mai ës captcha?',
@@ -3052,17 +3111,19 @@ Clique o botão 'voltar' do seu browser para voltar à página de edição.",
* @author Giro720
* @author Helder.wiki
* @author Jesielt
+ * @author 555
*/
$messages['pt-br'] = array(
'captcha-edit' => 'Para editar esta página será necessário que você resolva a simples soma abaixo e entre com a resposta no respectivo campo ([[Special:Captcha/help|o que é isto?]])',
'captcha-desc' => 'Fornece técnicas captcha para proteção contra spam e tentativas de obtenção de senhas',
- 'captcha-addurl' => 'Sua edição inclui novas ligações externas.
-Para prevenção contra sistemas automatizados que inserem spam, será necessário que você resolva a simples soma abaixo e entre com a resposta no respectivo campo ([[Special:Captcha/help|o que é isto?]])', # Fuzzy
- 'captcha-badlogin' => 'Como prevenção contra sistemas automatizados de pesquisa e descoberta de senhas, será necessário que você resolva a simples soma abaixo e entre com a resposta no respectivo campo ([[Special:Captcha/help|o que é isto?]])', # Fuzzy
+ 'captcha-label' => 'CAPTCHA',
+ 'captcha-addurl' => 'Sua edição inclui novos links externos.
+Como prevenção contra sistemas automatizados que inserem spam, será necessário resolver a simples soma abaixo e inserir sua resposta no respectivo campo ([[Special:Captcha/help|detalhes]])',
+ 'captcha-badlogin' => 'Como prevenção contra sistemas automatizados de pesquisa e descoberta de senhas, será necessário resolver a simples soma abaixo e inserir sua resposta no respectivo campo ([[Special:Captcha/help|detalhes]])',
'captcha-createaccount' => 'Para proteger a wiki contra sistemas automatizados de criação de contas, solicitamos que resolva a soma simples apresentada abaixo e introduza a resposta no respectivo campo ([[Special:Captcha/help|mais informações]]):',
'captcha-createaccount-fail' => 'Código de confirmação incorreto ou não preenchido.',
'captcha-create' => 'Para criar a página, por favor resolva a simples soma abaixo e entre com a resposta no respectivo campo ([[Special:Captcha/help|o que é isto?]])',
- 'captcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, resolva a soma simples apresentada abaixo e introduza a resposta na caixa ([[Special:Captcha/help|mais informações]]):", # Fuzzy
+ 'captcha-sendemail' => 'Como proteção ao wiki contra spam automatizado, será necessário resolver a simples soma abaixo e inserir sua resposta no respectivo campo ([[Special:Captcha/help|detalhes]]):',
'captcha-sendemail-fail' => 'Código de confirmação incorreto ou não preenchido.',
'captcha-disabledinapi' => 'Esta operação necessita de captcha, por isso não pode ser realizada através da API.',
'captchahelp-title' => 'Ajuda com o Captcha',
@@ -3139,22 +3200,35 @@ Apăsați butonul „Înapoi†al navigatorului pentru a vă reîntoarce la pag
*/
$messages['roa-tara'] = array(
'captcha-edit' => "Pe cangià sta pàgene, pe piacere fa sta somma facile facile aqquà sotte e mitte 'a resposte jndr'à sckatele ([[Special:Captcha/help|maggiore 'mbormaziune]]):",
+ 'captcha-desc' => "Dèje le tecniche d'u CAPTCHA pe proteggere condre a 'u spam e 'u futtimende d'a passuord",
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => "'U cangiamende tune 'nglude de le collegaminde de fore.
Pe aiutà a proteggere condre a 'u spam automateche, pe piacere respunne a 'a domande ca combare sotte jndr'à sckatole ([[Special:Captcha/help|cchiù 'mbormaziune]]):",
- 'captcha-badlogin' => "Pe aiutà a proteggere da le futteminde de passuord automateche, pe piacere fa sta somma facile facile aqquà sotte e mitte 'a resposte jndr'à sckatele ([[Special:Captcha/help|maggiore 'mbormaziune]]):", # Fuzzy
+ 'captcha-badlogin' => "Pe proteggere sta uicchi da le futteminde de passuord automateche, nuje te cercame gendilmende de fa sta somma facile facile aqquà sotte e mitte 'a resposte jndr'à sckatele ([[Special:Captcha/help|maggiore 'mbormaziune]]):",
+ 'captcha-createaccount' => "Pe proteggere sta uicchi da 'a ccrejazione automateche de le cunde, nuje te cercame gendilmende de fa sta somma facile facile aqquà sotte e mitte 'a resposte jndr'à sckatele ([[Special:Captcha/help|maggiore 'mbormaziune]]):",
'captcha-createaccount-fail' => 'Codece de conferme non corrette o mangande.',
'captcha-create' => "Pe ccrejà sta pàgene, pe piacere fa sta somma facile facile aqquà sotte e mitte 'a resposte jndr'à sckatele ([[Special:Captcha/help|maggiore 'mbormaziune]]):",
- 'captcha-sendemail' => "Pe aiutà a proteggere da 'a munnezze automateche, pe piacere fa sta somma facile facile aqquà sotte e mitte 'a resposte jndr'à sckatele ([[Special:Captcha/help|maggiore 'mbormaziune]]):", # Fuzzy
+ 'captcha-sendemail' => "Pe proteggere sta uicchi da 'a munnezze automateche, nuje te cercame gendilmende de fa sta somma facile facile aqquà sotte e mitte 'a resposte jndr'à sckatele ([[Special:Captcha/help|maggiore 'mbormaziune]]):",
'captcha-sendemail-fail' => 'Codece de conferme non corrette o mangande.',
'captcha-disabledinapi' => "St'azione ave abbesogne de 'nu captcha, accussì non g'è possibbele eseguirle cu le API.",
'captchahelp-title' => 'Aijute pu captcha',
'captchahelp-cookies-needed' => "Tu è abbesogne de avè le cookie abbilitate jndr'à 'u browser tune pe sta fatìe.",
+ 'captchahelp-text' => "Le site web ca accettane messàgge da 'u pubbleche, le piace sta uicchi, assaije vote purcé abbusane de spam a ce ause struminde automatece pe mannà le lore collegaminde a 'nu sacche de site.
+Mendre ca ste collegaminde de spam se ponne luà, lore comungue sò 'nu sckassamende de palle.
+
+Certe vote, specialmende quanne aggiunge collegaminde nuève sus a a'na pàgene, 'a uicchi te pò fà vedè 'n'immaggine de teste colorate o sciummate e te cerche de scrivere le parole ca vedite.
+Quiste jè 'nu combite difficile da automatizzà, ce sò le umane a scettà merde invece de le attacche robbot riuscime a bloccà cchiù facilmende.
+
+Sfortunatamende stu fatte pò da inconveniende a le utinde cu visiune limitate o ca ausane le browser de sole teste o ca parlane. Jndr'à stu mumende non ge tenime 'n'alternative audie.
+Pe piacere condatte le [[{{MediaWiki:Grouppage-sysop}}|amministrature d'u site]] pe assistenze ce quiste jè condre a le leggittime aziune tune.
+
+Cazze 'u buttonne \"rrete\" (back) sus a 'u browser tune pe turnà a 'u cangiamende d'a pàgene.",
'captcha-addurl-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
# 'A sindasse jè a cumme segue:
# * Ogneccose da 'nu carattere \"#\" 'mbonde a fine d'a linèe jè 'nu commende
# * Ogne linèe chiene jè 'nu frammende de regex 'u quale addà sulamende combrondarse cu le host jndr'à l'URL
#</pre> <!-- leave this line exactly as it is -->",
+ 'right-skipcaptcha' => "Comblete le aziune CAPTCHA senze ca a scè ausanne 'u CAPTCHA",
);
/** Russian (руÑÑкий)
@@ -3163,6 +3237,7 @@ Pe aiutà a proteggere condre a 'u spam automateche, pe piacere respunne a 'a do
* @author Amire80
* @author Ignatus
* @author Kalan
+ * @author Ole Yves
* @author ÐлекÑандр Сигачёв
*/
$messages['ru'] = array(
@@ -3171,7 +3246,7 @@ $messages['ru'] = array(
'captcha-label' => 'CAPTCHA',
'captcha-addurl' => 'Ð’Ñ‹ добавлÑете новые ÑÑылки на внешние Ñайты.
Ð’ целÑÑ… защиты от автоматичеÑкого Ñпама необходимо произвеÑти Ñледующее проÑтое вычиÑление и запиÑать ответ в поле Ñ€Ñдом, чтобы правка была Ñохранена ([[Special:Captcha/help|подробнее]]):',
- 'captcha-badlogin' => 'Ð’ целÑÑ… защиты от автоматичеÑкого взлома паролÑ, пожалуйÑта, выполните Ñледующее проÑтое арифметичеÑкое дейÑтвие и введите ответ в текÑтовое поле ниже ([[Special:Captcha/help|подробнее]]):', # Fuzzy
+ 'captcha-badlogin' => 'Ð’ целÑÑ… защиты вики-проекта от автоматичеÑкого взлома паролÑ, пожалуйÑта, решите проÑтой пример и введите ответ в текÑтовое поле ниже ([[Special:Captcha/help|подробнее]]):',
'captcha-createaccount' => 'Ð”Ð»Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ от автоматичеÑкой Ñпам-региÑтрации необходимо выполнить Ñледующее проÑтое вычиÑление и запиÑать ответ в поле Ñ€Ñдом ([[Special:Captcha/help|подробнее]]):',
'captcha-createaccount-fail' => 'ÐšÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð° или не введена.',
'captcha-create' => 'Чтобы Ñоздать Ñтраницу, решите проÑтой пример и введите ответ в текÑтовое поле ([[Special:Captcha/help|что Ñто?]]):',
@@ -3874,19 +3949,20 @@ $messages['tru'] = array(
* @author NickK
* @author Olvin
* @author Riwnodennyk
+ * @author Ðта
* @author ТеÑÑ‚
*/
$messages['uk'] = array(
'captcha-edit' => 'Щоб відредагувати цю Ñторінку, будь лаÑка, виконайте проÑту арифметичну дію Ñ– введіть відповідь у текÑтове поле ([[Special:Captcha/help|докладніше]]):',
'captcha-desc' => 'Забезпечує методи CAPTCHA Ð´Ð»Ñ Ð·Ð°Ñ…Ð¸Ñту від Ñпаму Ñ– підбору паролÑ',
'captcha-label' => 'CAPTCHA',
- 'captcha-addurl' => 'Ви додали поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° зовнішній Ñайт.
-Із метою захиÑту від автоматичного Ñпаму, будь лаÑка, виконайте проÑту арифметичну дію Ñ– введіть відповідь у текÑтове поле ([[Special:Captcha/help|докладніше]]):', # Fuzzy
- 'captcha-badlogin' => 'Із метою захиÑту від автоматичного злому паролÑ, будь лаÑка, виконайте проÑту арифметичну дію Ñ– введіть відповідь у текÑтове поле ([[Special:Captcha/help|докладніше]]):', # Fuzzy
- 'captcha-createaccount' => 'Із метою захиÑту від автоматичного ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу, будь лаÑка, виконайте проÑту арифметичну дію Ñ– введіть відповідь у текÑтове поле ([[Special:Captcha/help|докладніше]]):', # Fuzzy
+ 'captcha-addurl' => 'Ви додали нові поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° зовнішні Ñайти.
+Із метою захиÑту від автоматичного Ñпаму, будь лаÑка, виконайте проÑту арифметичну дію Ñ– введіть відповідь у текÑтове поле, щоб Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ збережене ([[Special:Captcha/help|докладніше]]):',
+ 'captcha-badlogin' => 'Із метою захиÑту від автоматичного злому паролÑ, будь лаÑка, виконайте проÑту арифметичну дію Ñ– введіть відповідь у текÑтове поле ([[Special:Captcha/help|докладніше]]):',
+ 'captcha-createaccount' => 'Із метою захиÑту від автоматичного ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу проÑимо виконати проÑту арифметичну дію Ñ– ввеÑти відповідь у текÑтове поле ([[Special:Captcha/help|докладніше]]):',
'captcha-createaccount-fail' => 'Ðеправильний або відÑутній код підтвердженнÑ.',
'captcha-create' => 'Щоб Ñтворити Ñторінку, будь лаÑка, виконайте проÑту арифметичну дію Ñ– введіть відповідь у текÑтове поле ([[Special:Captcha/help|докладніше]]):',
- 'captcha-sendemail' => 'З метою захиÑту від автоматичного Ñпаму, дайте відповідь на проÑтий математичний приклад Ñ– введіть відповідь ([[Special:Captcha/help|деталі]]):', # Fuzzy
+ 'captcha-sendemail' => "Із метою захиÑту вікі від автоматичного Ñпаму проÑимо розв'Ñзати проÑтий математичний приклад Ñ– ввеÑти відповідь ([[Special:Captcha/help|деталі]]):",
'captcha-sendemail-fail' => 'Ðеправильний або відÑутній код підтвердженнÑ.',
'captcha-disabledinapi' => 'Ð¦Ñ Ð´Ñ–Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” перевірки CAPTCHA, тому не може бути здійÑнена за допомогою API.',
'captchahelp-title' => 'Довідка про CAPTCHA',
@@ -3910,17 +3986,19 @@ $messages['uk'] = array(
/** vèneto (vèneto)
* @author Candalua
+ * @author GatoSelvadego
*/
$messages['vec'] = array(
'captcha-edit' => 'Par modificar la pagina te ghè da risòlvar sto senplice calcolo presentà de seguito e inserir el risultato ne la casela
([[Special:Captcha/help|magiori informazion]]):',
- 'captcha-desc' => 'Senplice inplementazion de un Captcha', # Fuzzy
- 'captcha-addurl' => "La modifica richiesta la zonta dei colegamenti foresti novi a la pagina; come misura precauzional contro l'inserimento automatico de spam, te ghè da risòlvar sto senplice calcolo presentà de seguito e inserir el risultato ne la casela ([[Special:Captcha/help|magiori informazion]]):", # Fuzzy
- 'captcha-badlogin' => 'Come misura precauzional contro i tentativi de forzatura automatica de la password, te ghè da risòlvar sto senplice calcolo presentà de seguito e inserir el risultato ne la casela ([[Special:Captcha/help|magiori informazion]]):', # Fuzzy
- 'captcha-createaccount' => 'Come misura precauzional contro i tentativi de creazion automatica dei account, par registrarse te ghè da risòlvar sto senplice calcolo presentà de seguito e inserir el risultato ne la casela ([[Special:Captcha/help|magiori informazion]]):', # Fuzzy
+ 'captcha-desc' => "Fornise teniche CAPTCHA pa' Å‚a protesion contro el spam e l'individuasion de Å‚e password",
+ 'captcha-label' => 'CAPTCHA',
+ 'captcha-addurl' => "Åa modifega dimandà xonta de i novi ligamenti foresti a Å‚a pàjina; come mixura precausionaÅ‚e contro 'l inserimento automatego de spam, se prega de risolvare el senplise calcoÅ‚o prexentà de seguito e inserir el rexultà inte Å‚a caxeÅ‚a ([[Special:Captcha/help|come funsiona?]]):",
+ 'captcha-badlogin' => 'Come misura precausionałe contro i tentativi de forzadura automatega de ła password, se prega de risolvare el senplise calcoło prexentà de seguito e inserir el rexultà inte ła caxeła ([[Special:Captcha/help|come funsiona?]]):',
+ 'captcha-createaccount' => 'Come mixura precausionałe contro i tentativi de creasion automatega de i account, se prega de risolvare el senplise calcoło prexentà de seguito e inserir el rexultà inte ła caxeła ([[Special:Captcha/help|come funsiona?]]):',
'captcha-createaccount-fail' => 'Codice de verifica sbaglià o mancante.',
'captcha-create' => 'Per crear la pagina te ghè da risòlvar sto senplice calcolo presentà de seguito e inserir el risultato ne la casela ([[Special:Captcha/help|magiori informazion]]):',
- 'captcha-sendemail' => 'Come misura precauzional contro i tentativi de forzatura automatica de la password, te ghè da risòlvar sto senplice calcolo e inserir el risultato ne la casela ([[Special:Captcha/help|magiori informazion]]):', # Fuzzy
+ 'captcha-sendemail' => 'Come mixura precausionałe contro i mesaji de spam automatesi, se prega de risolvare el senplise calcoło prexentà de seguito e inserir el rexultà inte ła caxeła ([[Special:Captcha/help|come funsiona?]]):',
'captcha-sendemail-fail' => 'Codice de verifica sbaglià o mancante.',
'captcha-disabledinapi' => 'Sta azion la richiede un captcha, quindi no se pole farla tramite API.',
'captchahelp-title' => "Coss'èlo sto captcha?",
@@ -4093,11 +4171,11 @@ $messages['zh-hans'] = array(
'captcha-desc' => '通过验è¯ç æŠ€æœ¯æ¥é˜»æ­¢åžƒåœ¾é‚®ä»¶å’Œå¯†ç çŒœè§£',
'captcha-label' => '验è¯ç ',
'captcha-addurl' => '您编辑的内容中å«æœ‰ä¸€ä¸ªæ–°çš„外部链接;为了å…å—自动垃圾程åºçš„侵扰,请答出一个简å•çš„加法,并在下é¢çš„框内输入答案æ‰èƒ½ä¿å­˜æ‚¨çš„编辑([[Special:Captcha/help|更多信æ¯]]):',
- 'captcha-badlogin' => '为了防止程å¼è‡ªåŠ¨ç ´è§£å¯†ç ï¼Œè¯·ç­”出一个简å•çš„加法,然後在框内输入 ([[Special:Captcha/help|更多资料]]):', # Fuzzy
- 'captcha-createaccount' => '为了防止程å¼è‡ªåŠ¨æ³¨å†Œï¼Œè¯·ç­”出一个简å•çš„加法,然後在框内输入 ([[Special:Captcha/help|更多资料]]):', # Fuzzy
+ 'captcha-badlogin' => '为了防止自动程åºç ´è§£å¯†ç ï¼Œæˆ‘们æ³è¯·æ‚¨ç­”出一个简å•çš„加法,然åŽåœ¨æ¡†å†…输入([[Special:Captcha/help|详细信æ¯]]):',
+ 'captcha-createaccount' => '为了防止自动程åºæ³¨å†Œè´¦å·ï¼Œæˆ‘们æ³è¯·æ‚¨ç­”出一个简å•çš„加法,然åŽåœ¨æ¡†å†…输入([[Special:Captcha/help|详细信æ¯]]):',
'captcha-createaccount-fail' => '验è¯ç é”™è¯¯æˆ–丢失。',
'captcha-create' => 'è¦åˆ›å»ºé¡µé¢ï¼Œè¯·ç­”出一个简å•çš„加法,然後在框内输入 ([[Special:Captcha/help|更多资料]]):',
- 'captcha-sendemail' => '为了防止程å¼è¿›è¡Œç ´å,请答出一个简å•çš„计算,然åŽåœ¨æ¡†å†…输入 ([[Special:Captcha/help|更多资料]]):', # Fuzzy
+ 'captcha-sendemail' => '为了防止自动垃圾程åºè¿›è¡Œç ´å,我们æ³è¯·æ‚¨ç­”出一个简å•çš„计算,然åŽåœ¨æ¡†å†…输入([[Special:Captcha/help|详细信æ¯]]):',
'captcha-sendemail-fail' => '验è¯ç é”™è¯¯æˆ–丢失。',
'captcha-disabledinapi' => '这个è¦æ±‚需è¦ç»è¿‡éªŒè¯ç éªŒè¯ï¼Œæ•…无法é€è¿‡API使用。',
'captchahelp-title' => '验è¯ç è¯´æ˜Ž',
@@ -4122,18 +4200,19 @@ $messages['zh-hans'] = array(
* @author Hydra
* @author Liangent
* @author Mark85296341
+ * @author Simon Shek
* @author Waihorace
*/
$messages['zh-hant'] = array(
'captcha-edit' => 'è¦ç·¨è¼¯é€™ç¯‡æ–‡ç« ï¼Œè«‹ç­”出一個簡單的加法,然後在框內輸入 ([[Special:Captcha/help|更多資料]]):',
'captcha-desc' => '通éŽé©—證碼技術來阻止垃圾郵件和密碼猜解',
'captcha-label' => '驗證碼',
- 'captcha-addurl' => '你編輯的內容中å«æœ‰ä¸€å€‹æ–°çš„URL連çµï¼›ç‚ºäº†å…å—自動垃圾程å¼çš„侵擾,請答出一個簡單的加法,然後在框內輸入 ([[Special:Captcha/help|更多資料]]):', # Fuzzy
- 'captcha-badlogin' => '為了防止程å¼è‡ªå‹•ç ´è§£å¯†ç¢¼ï¼Œè«‹ç­”出一個簡單的加法,然後在框內輸入 ([[Special:Captcha/help|更多資料]]):', # Fuzzy
- 'captcha-createaccount' => '為了防止程å¼è‡ªå‹•è¨»å†Šï¼Œè«‹ç­”出一個簡單的加法,然後在框內輸入 ([[Special:Captcha/help|更多資料]]):', # Fuzzy
+ 'captcha-addurl' => '你編輯的內容中å«æœ‰ä¸€å€‹æ–°çš„外部連çµï¼›ç‚ºäº†å…å—自動垃圾程å¼çš„侵擾,請答出一個簡單的加法,然後在框內輸入 ([[Special:Captcha/help|更多資料]]):',
+ 'captcha-badlogin' => '為防止程å¼è‡ªå‹•ç ´è§£å¯†ç¢¼ï¼Œè«‹ç­”出一æ¢ç°¡å–®çš„加法,然後在框內輸入 ([[Special:Captcha/help|更多資料]]):',
+ 'captcha-createaccount' => '為防止程å¼è‡ªå‹•è¨»å†Šï¼Œè«‹ç­”出一æ¢ç°¡å–®çš„加法,然後在框內輸入 ([[Special:Captcha/help|更多資料]]):',
'captcha-createaccount-fail' => '驗證碼錯誤或éºå¤±ã€‚',
'captcha-create' => 'è¦å»ºç«‹é é¢ï¼Œè«‹ç­”出一個簡單的加法,然後在框內輸入 ([[Special:Captcha/help|更多資料]]):',
- 'captcha-sendemail' => '為了防止程å¼é€²è¡Œç ´å£žï¼Œè«‹ç­”出一個簡單的計算,然後在框內輸入 ([[Special:Captcha/help|更多資料]]):', # Fuzzy
+ 'captcha-sendemail' => '為防止程å¼é€²è¡Œç ´å£žï¼Œè«‹ç­”出一æ¢ç°¡å–®çš„加法,然後在框內輸入 ([[Special:Captcha/help|更多資料]]):',
'captcha-sendemail-fail' => '驗證碼錯誤或éºå¤±ã€‚',
'captcha-disabledinapi' => '這個è¦æ±‚需è¦ç¶“éŽCaptcha驗證,故無法é€éŽAPI使用。',
'captchahelp-title' => 'Captcha 說明',
diff --git a/extensions/ConfirmEdit/ConfirmEdit.php b/extensions/ConfirmEdit/ConfirmEdit.php
index 87a48e0a..d861a04a 100644
--- a/extensions/ConfirmEdit/ConfirmEdit.php
+++ b/extensions/ConfirmEdit/ConfirmEdit.php
@@ -40,7 +40,7 @@ $wgExtensionCredits['antispam'][] = array(
'name' => 'ConfirmEdit',
'author' => array( 'Brion Vibber', '...' ),
'url' => 'https://www.mediawiki.org/wiki/Extension:ConfirmEdit',
- 'version' => '1.1',
+ 'version' => '1.2',
'descriptionmsg' => 'captcha-desc',
);
@@ -140,7 +140,7 @@ $wgCaptchaSessionExpiration = 30 * 60;
$wgCaptchaBadLoginExpiration = 5 * 60;
/**
- * Allow users who have confirmed their e-mail addresses to post
+ * Allow users who have confirmed their email addresses to post
* URL links without being harassed by the captcha.
*/
$ceAllowConfirmedEmail = false;
diff --git a/extensions/ConfirmEdit/ConfirmEditHooks.php b/extensions/ConfirmEdit/ConfirmEditHooks.php
index 66e51991..bc85138d 100644
--- a/extensions/ConfirmEdit/ConfirmEditHooks.php
+++ b/extensions/ConfirmEdit/ConfirmEditHooks.php
@@ -55,8 +55,9 @@ class ConfirmEditHooks {
return self::getInstance()->confirmEmailUser( $from, $to, $subject, $text, $error );
}
- public static function APIGetAllowedParams( &$module, &$params ) {
- return self::getInstance()->APIGetAllowedParams( $module, $params );
+ // Default $flags to 1 for backwards-compatible behavior
+ public static function APIGetAllowedParams( &$module, &$params, $flags = 1 ) {
+ return self::getInstance()->APIGetAllowedParams( $module, $params, $flags );
}
public static function APIGetParamDescription( &$module, &$desc ) {
diff --git a/extensions/ConfirmEdit/FancyCaptcha.class.php b/extensions/ConfirmEdit/FancyCaptcha.class.php
index f559f0f3..d1c6a41f 100644
--- a/extensions/ConfirmEdit/FancyCaptcha.class.php
+++ b/extensions/ConfirmEdit/FancyCaptcha.class.php
@@ -89,6 +89,72 @@ class FancyCaptcha extends SimpleCaptcha {
* Insert the captcha prompt into the edit form.
*/
function getForm() {
+ global $wgOut, $wgExtensionAssetsPath, $wgEnableAPI;
+
+ // Uses addModuleStyles so it is loaded when JS is disabled.
+ $wgOut->addModuleStyles( 'ext.confirmEdit.fancyCaptcha.styles' );
+
+ $title = SpecialPage::getTitleFor( 'Captcha', 'image' );
+ $index = $this->getCaptchaIndex();
+
+ if ( $wgEnableAPI ) {
+ // Loaded only if JS is enabled
+ $wgOut->addModules( 'ext.confirmEdit.fancyCaptcha' );
+
+ $captchaReload = Html::element(
+ 'small',
+ array(
+ 'class' => 'confirmedit-captcha-reload fancycaptcha-reload'
+ ),
+ wfMessage( 'fancycaptcha-reload-text' )->text()
+ );
+ } else {
+ $captchaReload = '';
+ }
+
+ return "<div class='fancycaptcha-wrapper'><div class='fancycaptcha-image-container'>" .
+ Html::element( 'img', array(
+ 'class' => 'fancycaptcha-image',
+ 'src' => $title->getLocalUrl( 'wpCaptchaId=' . urlencode( $index ) ),
+ 'alt' => ''
+ )
+ ) .
+ $captchaReload .
+ "</div>\n" .
+ '<p>' .
+ Html::element( 'label', array(
+ 'for' => 'wpCaptchaWord',
+ ),
+ parent::getMessage( 'label' ) . wfMessage( 'colon-separator' )->text()
+ ) .
+ Html::element( 'input', array(
+ 'name' => 'wpCaptchaWord',
+ 'id' => 'wpCaptchaWord',
+ 'type' => 'text',
+ 'size' => '12', // max_length in captcha.py plus fudge factor
+ 'autocomplete' => 'off',
+ 'autocorrect' => 'off',
+ 'autocapitalize' => 'off',
+ 'required' => 'required',
+ 'tabindex' => 1
+ )
+ ) . // tab in before the edit textarea
+ Html::element( 'input', array(
+ 'type' => 'hidden',
+ 'name' => 'wpCaptchaId',
+ 'id' => 'wpCaptchaId',
+ 'value' => $index
+ )
+ ) .
+ "</p>\n" .
+ "</div>\n";;
+ }
+
+ /**
+ * Get captcha index key
+ * @return string captcha ID key
+ */
+ function getCaptchaIndex() {
$info = $this->pickImage();
if ( !$info ) {
throw new MWException( "Ran out of captcha images" );
@@ -99,35 +165,7 @@ class FancyCaptcha extends SimpleCaptcha {
// go through without extra pain.
$index = $this->storeCaptcha( $info );
- wfDebug( "Captcha id $index using hash ${info['hash']}, salt ${info['salt']}.\n" );
-
- $title = SpecialPage::getTitleFor( 'Captcha', 'image' );
-
- return "<p>" .
- Html::element( 'img', array(
- 'src' => $title->getLocalUrl( 'wpCaptchaId=' . urlencode( $index ) ),
- 'width' => $info['width'],
- 'height' => $info['height'],
- 'alt' => '' ) ) .
- "</p>\n" .
- Html::element( 'input', array(
- 'type' => 'hidden',
- 'name' => 'wpCaptchaId',
- 'id' => 'wpCaptchaId',
- 'value' => $index ) ) .
- '<p>' .
- Html::element( 'label', array(
- 'for' => 'wpCaptchaWord',
- ), parent::getMessage( 'label' ) . wfMessage( 'colon-separator' )->text() ) .
- Html::element( 'input', array(
- 'name' => 'wpCaptchaWord',
- 'id' => 'wpCaptchaWord',
- 'type' => 'text',
- 'autocorrect' => 'off',
- 'autocapitalize' => 'off',
- 'required' => 'required',
- 'tabindex' => 1 ) ) . // tab in before the edit textarea
- "</p>\n";
+ return $index;
}
/**
@@ -159,7 +197,7 @@ class FancyCaptcha extends SimpleCaptcha {
$key = "fancycaptcha:dirlist:{$backend->getWikiId()}:" . sha1( $directory );
$dirs = $wgMemc->get( $key ); // check cache
- if ( !is_array( $dirs ) ) { // cache miss
+ if ( !is_array( $dirs ) || !count( $dirs ) ) { // cache miss
$dirs = array(); // subdirs actually present...
foreach ( $backend->getTopDirectoryList( array( 'dir' => $directory ) ) as $entry ) {
if ( ctype_xdigit( $entry ) && strlen( $entry ) == 1 ) {
@@ -167,7 +205,9 @@ class FancyCaptcha extends SimpleCaptcha {
}
}
wfDebug( "Cache miss for $directory subdirectory listing.\n" );
- $wgMemc->set( $key, $dirs, 86400 );
+ if ( count( $dirs ) ) {
+ $wgMemc->set( $key, $dirs, 86400 );
+ }
}
if ( !count( $dirs ) ) {
@@ -204,7 +244,7 @@ class FancyCaptcha extends SimpleCaptcha {
$key = "fancycaptcha:filelist:{$backend->getWikiId()}:" . sha1( $directory );
$files = $wgMemc->get( $key ); // check cache
- if ( !is_array( $files ) ) { // cache miss
+ if ( !is_array( $files ) || !count( $files ) ) { // cache miss
$files = array(); // captcha files
foreach ( $backend->getTopFileList( array( 'dir' => $directory ) ) as $entry ) {
$files[] = $entry;
@@ -213,7 +253,9 @@ class FancyCaptcha extends SimpleCaptcha {
break;
}
}
- $wgMemc->set( $key, $files, 86400 );
+ if ( count( $files ) ) {
+ $wgMemc->set( $key, $files, 86400 );
+ }
wfDebug( "Cache miss for $directory captcha listing.\n" );
}
@@ -258,19 +300,15 @@ class FancyCaptcha extends SimpleCaptcha {
continue; // could not acquire (skip it to avoid race conditions)
}
}
- $fsFile = $backend->getLocalReference( array( 'src' => "$directory/$entry" ) );
- if ( !$fsFile || !$fsFile->exists() ) {
+ if ( !$backend->fileExists( array( 'src' => "$directory/$entry" ) ) ) {
if ( ++$misses >= 5 ) { // too many files in the listing don't exist
break; // listing cache too stale? break out so it will be cleared
}
continue; // try next file
}
- $size = getimagesize( $fsFile->getPath() );
return array(
'salt' => $matches[1],
'hash' => $matches[2],
- 'width' => $size[0],
- 'height' => $size[1],
'viewed' => false,
);
}
diff --git a/extensions/ConfirmEdit/FancyCaptcha.i18n.php b/extensions/ConfirmEdit/FancyCaptcha.i18n.php
index 140cee1c..f251377d 100644
--- a/extensions/ConfirmEdit/FancyCaptcha.i18n.php
+++ b/extensions/ConfirmEdit/FancyCaptcha.i18n.php
@@ -19,30 +19,25 @@ To help protect against automated spam, please enter the words that appear below
'fancycaptcha-create' => 'To create the page, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
'fancycaptcha-edit' => 'To edit this page, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
'fancycaptcha-sendemail' => 'To help protect against automated spamming, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
+ 'fancycaptcha-reload-text' => 'Refresh',
);
/** Message documentation (Message documentation)
* @author Fryed-peach
* @author Hamilton Abreu
* @author Purodha
+ * @author Shirayuki
*/
$messages['qqq'] = array(
- 'fancycaptcha-desc' => '{{desc}}',
- 'fancycaptcha-addurl' => 'See also
-*{{msg-mw|captcha-addurl}}
-*{{msg-mw|Questycaptcha-addurl}}',
- 'fancycaptcha-badlogin' => 'See also
-*{{msg-mw|captcha-badlogin}}
-*{{msg-mw|Questycaptcha-badlogin}}',
- 'fancycaptcha-createaccount' => 'See also
-*{{msg-mw|captcha-createaccount}}
-*{{msg-mw|Questycaptcha-createaccount}}',
- 'fancycaptcha-create' => 'See also
-*{{msg-mw|Captcha-create}}
-*{{msg-mw|Questycaptcha-create}}',
- 'fancycaptcha-edit' => 'See also
-*{{msg-mw|Captcha-edit}}
-*{{msg-mw|Questycaptcha-edit}}',
+ 'fancycaptcha-desc' => '{{Optional}}
+{{desc}}',
+ 'fancycaptcha-addurl' => '{{Related|ConfirmEdit-addurl}}',
+ 'fancycaptcha-badlogin' => '{{Related|ConfirmEdit-badlogin}}',
+ 'fancycaptcha-createaccount' => '{{Related|ConfirmEdit-createaccount}}',
+ 'fancycaptcha-create' => '{{Related|ConfirmEdit-create}}',
+ 'fancycaptcha-edit' => '{{Related|ConfirmEdit-edit}}',
+ 'fancycaptcha-sendemail' => '{{Related|ConfirmEdit-sendemail}}',
+ 'fancycaptcha-reload-text' => 'Prompts a click to get a new FancyCaptcha image.',
);
/** Gheg Albanian (Gegë)
@@ -132,11 +127,12 @@ $messages['as'] = array(
*/
$messages['ast'] = array(
'fancycaptcha-addurl' => "La to edición inclúi nuevos enllaces esternos. P'aidar a protexer escontra'l spam automatizáu, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
- 'fancycaptcha-badlogin' => "P'aidar a protexer escontra'l descifráu automáticu de claves, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
- 'fancycaptcha-createaccount' => "P'aidar a protexer escontra la creación automática de cuentes, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
+ 'fancycaptcha-badlogin' => "P'ayudar a protexer escontra'l descifráu automáticu de claves, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
+ 'fancycaptcha-createaccount' => "P'ayudar a protexer escontra la creación automática de cuentes, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
'fancycaptcha-create' => "Pa crear la páxina, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
'fancycaptcha-edit' => "Pa editar la páxina, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
- 'fancycaptcha-sendemail' => "P'aidar a protexer escontra'l corréu puxarra automáticu, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
+ 'fancycaptcha-sendemail' => "P'ayudar a protexer escontra'l corréu puxarra automáticu, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
+ 'fancycaptcha-reload-text' => 'Refrescar',
);
/** Bashkir (башҡортÑа)
@@ -167,6 +163,7 @@ $messages['bcc'] = array(
* @author EugeneZelenko
* @author Jim-by
* @author Red Winged Duck
+ * @author Wizardist
*/
$messages['be-tarask'] = array(
'fancycaptcha-addurl' => 'Вашае Ñ€Ñдагаваньне ўтрымлівае Ð½Ð¾Ð²Ñ‹Ñ Ð²Ð¾Ð½ÐºÐ°Ð²Ñ‹Ñ ÑпаÑылкі.
@@ -176,6 +173,7 @@ $messages['be-tarask'] = array(
'fancycaptcha-create' => 'Ð”Ð»Ñ ÑтварÑÐ½ÑŒÐ½Ñ Ñтаронкі, калі лаÑка, увÑдзіце Ñловы, ÑÐºÑ–Ñ Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ñž выÑве ([[Special:Captcha/help|болей інфармацыі]]):',
'fancycaptcha-edit' => 'Ð”Ð»Ñ Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð³Ñтай Ñтаронкі, калі лаÑка, увÑдзіце Ñловы, ÑÐºÑ–Ñ Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ñž выÑве ([[Special:Captcha/help|болей інфармацыі]]):',
'fancycaptcha-sendemail' => 'У мÑтах абароны Ñупраць аўтаматычнага Ñпаму, калі лаÑка, увÑдзіце Ñловы Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ‹Ñ Ð½Ñ–Ð¶Ñй у полі ([[Special:Captcha/help|Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ñ Ñ–Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ]]):',
+ 'fancycaptcha-reload-text' => 'Ðбнавіць',
);
/** Bulgarian (българÑки)
@@ -269,6 +267,7 @@ $messages['cs'] = array(
'fancycaptcha-create' => 'Abyste mohli založit stránku, musíte opsat text z následujícího obrázku: ([[Special:Captcha/help|Co tohle znamená?]])',
'fancycaptcha-edit' => 'Abyste mohli editovat tuto stránku, musíte opsat text z následujícího obrázku: ([[Special:Captcha/help|Co tohle znamená?]])',
'fancycaptcha-sendemail' => 'V rámci ochrany proti automatickému spamování musíte opsat níže zobrazená slova ([[Special:Captcha/help|více informací]]):',
+ 'fancycaptcha-reload-text' => 'Vygenerovat nový kód',
);
/** Church Slavic (ÑловѣÌньÑкъ / ⰔⰎⰑⰂⰡâ°â° â°”â°â°Ÿ)
@@ -283,16 +282,18 @@ $messages['cu'] = array(
*/
$messages['cy'] = array(
'fancycaptcha-addurl' => "Mae eich golygiad yn cynnwys cyswllt allanol newydd.
-Er mwyn ceisio rhwystro peiriannau spam, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
+Er mwyn ceisio rhwystro peiriannau sbam, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
'fancycaptcha-badlogin' => "Er mwyn ceisio rhwystro peiriannau datrys cyfrineiriau, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
'fancycaptcha-createaccount' => "Er mwyn ceisio rhwystro peiriannau creu cyfrifon, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
'fancycaptcha-create' => "Er mwyn creu'r dudalen, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
'fancycaptcha-edit' => "Er mwyn gallu golygu'r dudalen hon, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
'fancycaptcha-sendemail' => "Er mwyn cyfrannu at ddiogelu rhag sbamio awtomatig, byddwch gystal â gwneud y swm isod ac ysgrifennu'r ateb yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
+ 'fancycaptcha-reload-text' => 'Adnewyddu',
);
/** Danish (dansk)
* @author Christian List
+ * @author HenrikKbh
* @author Kaare
* @author Peter Alberti
*/
@@ -303,6 +304,7 @@ $messages['da'] = array(
'fancycaptcha-create' => 'For at oprette en ny side, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
'fancycaptcha-edit' => 'For at redigere denne side, indtast da venligst ordene, der står i feltet nedenfor ([[Special:Captcha/help|mere information]]):',
'fancycaptcha-sendemail' => 'For at beskytte mod automatisk spam, bedes du skrive ordene der ses herunder i boksen ([[Special:Captcha/help|mere information]]):',
+ 'fancycaptcha-reload-text' => 'Opdater',
);
/** German (Deutsch)
@@ -319,6 +321,7 @@ Zum Schutz vor automatisiertem Spamming gib das folgende Wort in das Feld unten
'fancycaptcha-create' => 'Zur Erstellung der Seite gib das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
'fancycaptcha-edit' => 'Zur Bearbeitung der Seite gib das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
'fancycaptcha-sendemail' => 'Um gegen automatischen Spam vorzugehen, gib bitte die Wörter unten in das Feld ein ([[Special:Captcha/help|mehr Informationen]]):',
+ 'fancycaptcha-reload-text' => 'Aktualisieren',
);
/** German (formal address) (Deutsch (Sie-Form)‎)
@@ -337,6 +340,7 @@ Zum Schutz vor automatisiertem Spamming geben Sie das folgende Wort in das Feld
);
/** Zazaki (Zazaki)
+ * @author Gorizon
* @author Xoser
*/
$messages['diq'] = array(
@@ -348,6 +352,7 @@ Qe otomatik spamî ra pawitîş, ma rica keno çekuyanê ke qutiya cor de înan
'fancycaptcha-edit' => 'Qe pel vurnayîşî, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
'fancycaptcha-sendemail' => 'Qe spamê otomayoni ra pawitîşi, ma rica keno çekuyanê ke qutiya cor de înan binuse
([[Special:Captcha/help|enformasyonê bînî]]):',
+ 'fancycaptcha-reload-text' => 'Newe ke',
);
/** Lower Sorbian (dolnoserbski)
@@ -396,6 +401,7 @@ Por preventi aÅ­tomatan spamon, bonvolu enigi la jenajn vortojn en la skatolo ([
);
/** Spanish (español)
+ * @author Fitoschido
* @author Icvav
* @author Pertile
* @author Sanbec
@@ -407,6 +413,7 @@ $messages['es'] = array(
'fancycaptcha-create' => 'Para crear la página, por favor introduce en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):',
'fancycaptcha-edit' => 'Para editar esta página, por favor introduce en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):',
'fancycaptcha-sendemail' => 'Para protegernos contra el spam automatizado por favor ingrese las palabras que aparecen en el siguiente cuadro ([[Special:Captcha/help|más información]]):',
+ 'fancycaptcha-reload-text' => 'Actualizar',
);
/** Estonian (eesti)
@@ -421,6 +428,7 @@ Palun sisesta allpool olevas kastis kuvatud sõnad. Abinõu on kaitseks automaad
'fancycaptcha-create' => 'Lehekülje loomiseks sisesta palun allpool olevas kastis kuvatud sõnad ([[Special:Captcha/help|lisateave]]):',
'fancycaptcha-edit' => 'Selle lehekülje muutmiseks sisesta palun allpool olevas kastis kuvatud sõnad ([[Special:Captcha/help|lisateave]]):',
'fancycaptcha-sendemail' => 'Palun sisesta allpool olevas kastis kuvatud sõnad. Abinõu on kaitseks automaadistatud rämpsmuudatuste vastu ([[Special:Captcha/help|lisateave]]):',
+ 'fancycaptcha-reload-text' => 'Vaheta',
);
/** Basque (euskara)
@@ -475,7 +483,9 @@ $messages['fo'] = array(
/** French (français)
* @author Crochet.david
+ * @author Gomoko
* @author IAlex
+ * @author Metroitendo
* @author Sherbrooke
* @author Urhixidur
* @author Verdy p
@@ -487,8 +497,9 @@ Pour vérifier qu’il ne s’agit pas de pourriels automatisés, veuillez entre
'fancycaptcha-badlogin' => 'Afin de nous aider à prévenir le cassage des mots de passe par des automates, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
'fancycaptcha-createaccount' => 'Afin de nous aider à lutter contre les créations automatiques de comptes, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
'fancycaptcha-create' => 'Pour créer la page, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha|plus d’informations]]) :',
- 'fancycaptcha-edit' => 'Pour modifier cette page, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha|plus d’informations]]) :',
+ 'fancycaptcha-edit' => 'Pour modifier cette page, veuillez saisir les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’information]]) :',
'fancycaptcha-sendemail' => 'Afin de nous aider à prévenir le pollupostage automatisé, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+ 'fancycaptcha-reload-text' => 'Actualiser',
);
/** Franco-Provençal (arpetan)
@@ -531,6 +542,7 @@ Para contribuír na protección contra o spam automatizado, introduza as palabra
'fancycaptcha-create' => 'Para crear a páxina, introduza as palabras que aparecen na caixa de embaixo ([[Special:Captcha/help|máis información]]):',
'fancycaptcha-edit' => 'Para editar esta páxina, introduza as palabras que aparecen na caixa de embaixo ([[Special:Captcha/help|máis información]]):',
'fancycaptcha-sendemail' => 'Para contribuír na protección contra o spam automatizado, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
+ 'fancycaptcha-reload-text' => 'Refrescar',
);
/** Swiss German (Alemannisch)
@@ -568,6 +580,7 @@ $messages['gu'] = array(
* @author Rotem Liss
*/
$messages['he'] = array(
+ 'fancycaptcha-desc' => 'מחולל תמונות CAPTCHA מגניבות בשביל ההרבחבה Confirm Edit',
'fancycaptcha-addurl' => '×¢×¨×™×›×ª×›× ×›×•×œ×œ×ª ×§×™×©×•×¨×™× ×—×™×¦×•× ×™×™× ×—×“×©×™×.
×›×”×’× ×” מפני ספ×× ×וטומטי, ×× × ×”×§×œ×™×“×• ×ת ×”×ž×™×œ×™× ×”×ž×•×¤×™×¢×•×ª להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
'fancycaptcha-badlogin' => '×›×”×’× ×” מפני פריצת סיסמ×ות ×וטומטית, ×× × ×”×§×œ×™×“×• ×ת ×”×ž×™×œ×™× ×”×ž×•×¤×™×¢×•×ª להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
@@ -575,6 +588,7 @@ $messages['he'] = array(
'fancycaptcha-create' => 'כדי ליצור ×ת הדף, ×× × ×”×§×œ×™×“×• ×ת ×”×ž×™×œ×™× ×”×ž×•×¤×™×¢×•×ª להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
'fancycaptcha-edit' => 'כדי לערוך ×ת הדף, ×× × ×”×§×œ×™×“×• ×ת ×”×ž×™×œ×™× ×”×ž×•×¤×™×¢×•×ª להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
'fancycaptcha-sendemail' => 'כדי לעזור להתגונן מפני שליחת זבל ×וטומטית, ×× × ×”×›× ×™×¡×• ×ת ×”×ž×™×œ×™× ×©×ž×•×¤×™×¢×•×ª בתיבה למטה ([[Special:Captcha/help|מידע נוסף]]):',
+ 'fancycaptcha-reload-text' => 'רענון',
);
/** Hindi (हिनà¥à¤¦à¥€)
@@ -683,6 +697,7 @@ Til þess að hjálpa okkur verjast sjálfvirku auglýsingarusli, vinsamlegast s
'fancycaptcha-create' => 'Til þess að búa til þessa síðu, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
'fancycaptcha-edit' => 'Til þess að breyta þessari síðu, vinsamlegast sláðu inn orðin að neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
'fancycaptcha-sendemail' => 'Til þess að hjálpa okkur að verjast sjálfvirkum auglýsingapósti, vinsamlegast sláðu inn orðin hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsinngar]]):',
+ 'fancycaptcha-reload-text' => 'Endurhlaða',
);
/** Italian (italiano)
@@ -697,6 +712,7 @@ $messages['it'] = array(
'fancycaptcha-create' => 'Per creare la pagina si prega di inserire nella casella sottostante le parole che compaiono nella casella di seguito ([[Special:Captcha/help|come funziona?]]):',
'fancycaptcha-edit' => 'Per modificare questa pagina si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
'fancycaptcha-sendemail' => 'Come misura precauzionale nei confronti dei messaggi di spam automatici, si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
+ 'fancycaptcha-reload-text' => 'Aggiorna',
);
/** Japanese (日本語)
@@ -714,6 +730,7 @@ $messages['ja'] = array(
'fancycaptcha-create' => 'ページを新è¦ä½œæˆã™ã‚‹ã«ã¯ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®æ–‡å­—列を欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
'fancycaptcha-edit' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã«ã¯ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®æ–‡å­—列を欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
'fancycaptcha-sendemail' => '自動ã§ã®ã‚¹ãƒ‘ム攻撃を防ããŸã‚ã€ä¸‹è¨˜ã®ç¢ºèªç”¨ã®æ–‡å­—列を欄ã«å…¥åŠ›ã—ã¦ãã ã•ã„ ([[Special:Captcha/help|詳細]]):',
+ 'fancycaptcha-reload-text' => 'æ›´æ–°',
);
/** Jutish (jysk)
@@ -828,12 +845,13 @@ $messages['km'] = array(
$messages['ko'] = array(
'fancycaptcha-desc' => '편집 확ì¸ì— 대한 ê³µìƒ CAPTCHA(캡차) ìƒì„±ê¸°',
'fancycaptcha-addurl' => 'íŽ¸ì§‘ì— ìƒˆë¡œìš´ 바깥 ë§í¬ê°€ í¬í•¨ë˜ì–´ 있습니다.
-ìžë™í™”ëœ ìŠ¤íŒ¸ì„ ë§‰ê¸° 위해 아래 ìƒìžì˜ 단어를 ì ì–´ì£¼ì„¸ìš” ([[Special:Captcha/help|ë” ë§Žì€ ì •ë³´]]):',
- 'fancycaptcha-badlogin' => 'ìžë™í™”ëœ ë¹„ë°€ë²ˆí˜¸ 깨기를 막기 위해서, ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'fancycaptcha-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기를 막기 위해서, ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'fancycaptcha-create' => 'ì´ ë¬¸ì„œë¥¼ 만드려면, ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'fancycaptcha-edit' => 'ì´ ë¬¸ì„œë¥¼ 편집하려면, ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
- 'fancycaptcha-sendemail' => 'ìžë™í™”ëœ ìŠ¤íŒ¸ì„ ë°©ì§€í•˜ê¸° 위해, ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해 아래 ìƒìžì˜ 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'fancycaptcha-badlogin' => 'ìžë™í™”ëœ ë¹„ë°€ë²ˆí˜¸ 깨기로부터 보호하기 위해 ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'fancycaptcha-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기로부터 보호하기 위해 ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'fancycaptcha-create' => '문서를 만드려면 ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'fancycaptcha-edit' => 'ì´ ë¬¸ì„œë¥¼ 편집하려면 ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'fancycaptcha-sendemail' => 'ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해 ì•„ëž˜ì˜ ìƒìž ì•ˆì— ìžˆëŠ” 낱ë§ì„ 입력해주세요 ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'fancycaptcha-reload-text' => '새로 고침',
);
/** Karachay-Balkar (къарачай-малкъар)
@@ -862,6 +880,14 @@ don di Wööt onge en dat Käßje endraare. (Verklierung)',
'fancycaptcha-sendemail' => 'Öm et Wiki jääje automattesch enjedraare SPAM ze schötze,
bes esu joot, donn di Wööter enjävve, di en däm Käßje heh dronger shtonn.
([[Special:Captcha/help|Mieh Enfommazjuhne]])',
+ 'fancycaptcha-reload-text' => 'Nöü Aanzeije!',
+);
+
+/** Cornish (kernowek)
+ * @author Kernoweger
+ */
+$messages['kw'] = array(
+ 'fancycaptcha-createaccount' => "Rag gwitha rag formya acontow awtomategys, gwrewgh entra an geryow usy ow tisqwedhes a-woles y'n gist ([[Special:Captcha/help|moy kedhlow]]):",
);
/** Kirghiz (Кыргызча)
@@ -895,6 +921,7 @@ Fir ze hellëfen, géint automatiséierte Spam virzegoen, gitt w.e.g. déi Wierd
'fancycaptcha-create' => 'Fir dës Säit unzeleeën, gitt w.e.g. déi Wierder an, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):',
'fancycaptcha-edit' => "Fir dës Säit z'änneren, gitt w.e.g. déi Wierder an, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):",
'fancycaptcha-sendemail' => 'Fir eis géint automatescht Spammen ze schützen, gitt w.e.g. déi Wierder déi an der Këscht ënnedrënner stinn an ([[Special:Captcha/help|méi Informatiounen]]):',
+ 'fancycaptcha-reload-text' => 'Aktualiséieren',
);
/** Limburgish (Limburgs)
@@ -902,14 +929,14 @@ Fir ze hellëfen, géint automatiséierte Spam virzegoen, gitt w.e.g. déi Wierd
* @author Ooswesthoesbes
*/
$messages['li'] = array(
- 'fancycaptcha-addurl' => 'Uw bewerking bevat nieuwe externe links. Voer alstublieft de woorden die
+ 'fancycaptcha-addurl' => 'Uw bewerking bevat nieuwe externe links. Voer de woorden die
hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
- 'fancycaptcha-badlogin' => 'Voer alstublieft de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen het automatisch kraken van wachtwoorden ([[Special:Captcha/help|meer informatie]]):',
- 'fancycaptcha-createaccount' => 'Voer alstublieft de woorden die hieronder verschijnen in het invoerveld in
+ 'fancycaptcha-badlogin' => 'Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen het automatisch kraken van wachtwoorden ([[Special:Captcha/help|meer informatie]]):',
+ 'fancycaptcha-createaccount' => 'Voer de woorden die hieronder verschijnen in het invoerveld in
ter bescherming tegen het automatisch aanmaken van gebruikers ([[Special:Captcha/help|meer informatie]]):',
- 'fancycaptcha-create' => 'Uw bewerking bevat nieuwe externe links. Voer alstublieft de woorden die
+ 'fancycaptcha-create' => 'Uw bewerking bevat nieuwe externe links. Voer de woorden die
hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
- 'fancycaptcha-edit' => 'Uw bewerking bevat nieuwe externe links. Voer alstublieft de woorden die
+ 'fancycaptcha-edit' => 'Uw bewerking bevat nieuwe externe links. Voer de woorden die
hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|mie informatie]]):',
'fancycaptcha-sendemail' => "Veur de weurd die hie onger versjienen in 't inveurvèldj in es besjerming taege geautometiseerde spam ([[Special:Captcha/help|mier info]]):",
);
@@ -924,6 +951,13 @@ $messages['lo'] = array(
'fancycaptcha-edit' => 'àºàº°àº¥àº¸àº™àº² ພິມຄຳສັບຂ້າງລຸ່ມນີ້ ໃສ່ໃນàºàº±àºš ເພື່ອ ດັດà»àºà»‰à»œà»‰àº²àº™àºµà»‰ ([[Special:Captcha/help|ຂà»à»‰àº¡àº¹àº™à»€àºžàºµà»ˆàº¡àº•àº·à»ˆàº¡]]):',
);
+/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ */
+$messages['min'] = array(
+ 'fancycaptcha-createaccount' => 'Untuak palinduangan tahadok pambuek akun otomatis, tolong masuakan kato di bawah ko ka kotak nan tasadio ([[Special:Captcha/help|info labiah lanjuik]]):',
+);
+
/** Macedonian (македонÑки)
* @author Bjankuloski06
*/
@@ -936,6 +970,7 @@ $messages['mk'] = array(
'fancycaptcha-create' => 'За да Ñоздадете Ñтраница, внеÑете ги зборовите на Ñликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
'fancycaptcha-edit' => 'За да ја уредите Ñтраницава, внеÑете ги зборовите на Ñликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
'fancycaptcha-sendemail' => 'За да Ñе заштитиме од автоматизирано Ñпамирање, препишете ги зборовите од Ñликичката во полето подолу ([[Special:Captcha/help|повеќе информации]]):',
+ 'fancycaptcha-reload-text' => 'Превчитај',
);
/** Malayalam (മലയാളം)
@@ -977,6 +1012,7 @@ $messages['ms'] = array(
'fancycaptcha-create' => 'Untuk mencipta laman ini, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
'fancycaptcha-edit' => 'Untuk menyunting laman ini, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
'fancycaptcha-sendemail' => 'Untuk membanteras kegiatan spam secara automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
+ 'fancycaptcha-reload-text' => 'Muat semula',
);
/** Maltese (Malti)
@@ -1019,7 +1055,7 @@ As Schutz gegen automaatsch Spam, geev disse Bookstavenreeg in dat Feld ünnen i
'fancycaptcha-edit' => 'Disse Sied to ännern, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).',
);
-/** Nedersaksisch (Nedersaksisch)
+/** Nedersaksies (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
@@ -1038,24 +1074,25 @@ Um dit projekt te bescharmen tegen ongewunst reklame, mö'j t woord dat hieronde
*/
$messages['nl'] = array(
'fancycaptcha-desc' => "Generator voor opgedirkte captcha's voor ConfirmEdit",
- 'fancycaptcha-addurl' => 'Uw bewerking bevat nieuwe externe verwijzingen.
+ 'fancycaptcha-addurl' => 'Uw bewerking bevat nieuwe externe koppelingen.
Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
'fancycaptcha-badlogin' => 'Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen geautomatiseerde wachtwoordaanvallen ([[Special:Captcha/help|meer informatie]]):',
'fancycaptcha-createaccount' => 'Voer de woorden die hieronder verschijnen in het invoerveld in ter bescherming tegen het geautomatiseerd aanmaken van gebruikers ([[Special:Captcha/help|meer informatie]]):',
'fancycaptcha-create' => 'Voer de woorden die hieronder verschijnen in het invoerveld in om de pagina aan te maken ([[Special:Captcha/help|meer informatie]]):',
'fancycaptcha-edit' => 'Voer de woorden die hieronder verschijnen in het invoerveld in om deze pagina te bewerken ([[Special:Captcha/help|meer informatie]]):',
'fancycaptcha-sendemail' => 'Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen geautomatiseerde spam ([[Special:Captcha/help|meer informatie]]):',
+ 'fancycaptcha-reload-text' => 'Verversen',
);
/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
* @author Siebrand
*/
$messages['nl-informal'] = array(
- 'fancycaptcha-addurl' => 'Je bewerking bevat nieuwe externe verwijzingen.
+ 'fancycaptcha-addurl' => 'Je bewerking bevat nieuwe externe koppelingen.
Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Harald Khan
* @author Njardarlogar
*/
@@ -1066,6 +1103,8 @@ For å hjelpa oss med å unngå automatisert spam, ver venleg og skriv inn orda
'fancycaptcha-createaccount' => 'Skriv inn orda som kjem til syne i boksen nedanfor for å hjelpa oss med å unngå automatisk kontooppretting ([[Special:Captcha/help|meir informasjon]]):',
'fancycaptcha-create' => 'Skriv inn orda som kjem til syne i boksen nedanfor for å oppretta sida ([[Special:Captcha/help|meir informasjon]]):',
'fancycaptcha-edit' => 'For å endra denne sida, ver venleg og skriv inn orda som kjem til syne i boksen nedanfor ([[Special:Captcha/help|meir informasjon]]):',
+ 'fancycaptcha-sendemail' => 'For å hjelpa til mot sjølvgåande spamming, skriv inn orda som kjem til syne i boksen under ([[Special:Captcha/help|meir informasjon]]):',
+ 'fancycaptcha-reload-text' => 'Oppdater',
);
/** Occitan (occitan)
@@ -1095,6 +1134,7 @@ $messages['or'] = array(
);
/** Polish (polski)
+ * @author Chrumps
* @author Sp5uhe
*/
$messages['pl'] = array(
@@ -1105,6 +1145,7 @@ $messages['pl'] = array(
'fancycaptcha-create' => 'Aby utworzyć tę stronę, wpisz słowa, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
'fancycaptcha-edit' => 'Aby edytować tę stronę, wpisz słowa, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
'fancycaptcha-sendemail' => 'Zabezpieczenie przed automatycznie dodawanym spamem. Wprowadzić słowa widoczne w poniższym prostokącie ([[Special:Captcha/help|więcej informacji]]).',
+ 'fancycaptcha-reload-text' => 'Odśwież',
);
/** Piedmontese (Piemontèis)
@@ -1203,6 +1244,7 @@ Pe aiutà a proteggere condre a 'u spam automateche, pe piacere mitte le parole
'fancycaptcha-create' => 'Pe ccrejà sta pàgene, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|more info]]):',
'fancycaptcha-edit' => 'Pe cangià sta pàgene, pe piacere mitte le parole combare aqquà sotte ([[Special:Captcha/help|more info]]):',
'fancycaptcha-sendemail' => "Pe aiutà a proteggere condre a spam automatece, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):",
+ 'fancycaptcha-reload-text' => 'Aggiorne',
);
/** Russian (руÑÑкий)
@@ -1301,6 +1343,13 @@ Zaradi zaÅ¡Äite pred samodejnim smetjem prosimo, da vnesete spodnje besede v po
'fancycaptcha-sendemail' => 'Zaradi zaÅ¡Äite pred samodejnim smetenjem prosimo, da vnesete spodnje besede v polje ([[Special:Captcha/help|veÄ informacij]]):',
);
+/** Somali (Soomaaliga)
+ * @author Abshirdheere
+ */
+$messages['so'] = array(
+ 'fancycaptcha-createaccount' => 'Si aad u caawiso dhowritaanka in la iska samaysto Akoon,Fadlan meelaha banaan buux buuxi ee hoostaan ah ([[Special:Captcha/help|Macluumaad dheeraad ah]]):',
+);
+
/** Albanian (shqip)
* @author Dori
* @author Olsi
@@ -1485,6 +1534,7 @@ Otomatik spamdan korunmak için, lütfen aşağıdaki sözcükleri kutunun için
/** Ukrainian (українÑька)
* @author Ahonc
+ * @author Base
* @author Dim Grits
* @author Ytsukeng Fyvaprol
*/
@@ -1497,6 +1547,7 @@ $messages['uk'] = array(
'fancycaptcha-create' => 'Щоб Ñтворити Ñторінку, будь лаÑка, введіть у текÑтове поле Ñлова, зображені на картинці: ([[Special:Captcha/help|докладніше]]):',
'fancycaptcha-edit' => 'Щоб редагувати цю Ñторінку, будь лаÑка, введіть у текÑтове поле Ñлова, зображені на картинці: ([[Special:Captcha/help|докладніше]]):',
'fancycaptcha-sendemail' => 'Ð”Ð»Ñ Ð·Ð°Ñ…Ð¸Ñту від автоматичного Ñпаму, будь лаÑка, введіть Ñлова, Ñкі показані нижче в полі ([[Special:Captcha/help|more info]]):',
+ 'fancycaptcha-reload-text' => 'Оновити',
);
/** vèneto (vèneto)
@@ -1510,9 +1561,11 @@ Par jutarne a conbàtar el spam, par piaser inserissi ne la casela le parole che
'fancycaptcha-create' => 'Par crear la pagina, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
'fancycaptcha-edit' => 'Par modificar la pagina, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
'fancycaptcha-sendemail' => 'Par precauzion contro i tentativi de forzatura automatica de le password, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
+ 'fancycaptcha-reload-text' => 'Ajorna',
);
/** Vietnamese (Tiếng Việt)
+ * @author Cheers!
* @author Minh Nguyen
* @author Vinhtantran
*/
@@ -1524,6 +1577,7 @@ $messages['vi'] = array(
'fancycaptcha-create' => 'Äể tạo trang, xin hãy nhập những chữ xuất hiện ở dÆ°á»›i vào ô ([[Special:Captcha/help|thông tin thêm]]):',
'fancycaptcha-edit' => 'Äể sá»­a trang này, xin hãy nhập những từ xuất hiện ở dÆ°á»›i vào ô ([[Special:Captcha/help|thông tin thêm]]):',
'fancycaptcha-sendemail' => 'Äể giúp chúng tôi chống lại spam tá»± Ä‘á»™ng, xin hãy nhập những từ xuất hiện ở dÆ°á»›i vào ô ([[Special:Captcha/help|thông tin thêm]]):',
+ 'fancycaptcha-reload-text' => 'Làm tươi',
);
/** Volapük (Volapük)
@@ -1586,6 +1640,7 @@ $messages['yue'] = array(
/** Simplified Chinese (中文(简体)‎)
* @author Bencmq
+ * @author Cwek
*/
$messages['zh-hans'] = array(
'fancycaptcha-addurl' => '你的编辑内容中å«æœ‰æœ¬ç½‘站以外的链接。为防止ä¸å½“程å¼å¤§é‡ç ´å,请输入以下的文字([[Special:Captcha/help|相关信æ¯]]):',
@@ -1594,6 +1649,7 @@ $messages['zh-hans'] = array(
'fancycaptcha-create' => '为防止ä¸å½“程å¼å¤§é‡å»ºç«‹é¡µé¢ï¼Œè¯·è¾“入以下的文字([[Special:Captcha/help|相关信æ¯]]):',
'fancycaptcha-edit' => '如你想è¦ç¼–辑這个页é¢ï¼Œè¯·è¾“入以下的文字([[Special:Captcha/help|相关信æ¯]]):',
'fancycaptcha-sendemail' => '为防止ä¸å½“程å¼è¿›è¡Œç ´å,请输入以下的文字([[Special:Captcha/help|相关资讯]]):',
+ 'fancycaptcha-reload-text' => '刷新',
);
/** Traditional Chinese (中文(ç¹é«”)‎)
diff --git a/extensions/ConfirmEdit/FancyCaptcha.php b/extensions/ConfirmEdit/FancyCaptcha.php
index 69e3be01..46002e22 100644
--- a/extensions/ConfirmEdit/FancyCaptcha.php
+++ b/extensions/ConfirmEdit/FancyCaptcha.php
@@ -58,3 +58,19 @@ $wgCaptchaDeleteOnSolve = false;
$wgExtensionMessagesFiles['FancyCaptcha'] = $dir . '/FancyCaptcha.i18n.php';
$wgAutoloadClasses['FancyCaptcha'] = $dir . '/FancyCaptcha.class.php';
+
+$wgResourceModules['ext.confirmEdit.fancyCaptcha.styles'] = array(
+ 'localBasePath' => $dir . '/resources',
+ 'remoteExtPath' => 'ConfirmEdit/resources',
+ 'styles' => 'ext.confirmEdit.fancyCaptcha.css',
+);
+
+$wgResourceModules['ext.confirmEdit.fancyCaptcha'] = array(
+ 'localBasePath' => $dir . '/resources',
+ 'remoteExtPath' => 'ConfirmEdit/resources',
+ 'scripts' => 'ext.confirmEdit.fancyCaptcha.js',
+ 'dependencies' => 'mediawiki.api',
+);
+
+$wgAutoloadClasses['ApiFancyCaptchaReload'] = $dir . '/ApiFancyCaptchaReload.php';
+$wgAPIModules['fancycaptchareload'] = 'ApiFancyCaptchaReload';
diff --git a/extensions/ConfirmEdit/MathCaptcha.class.php b/extensions/ConfirmEdit/MathCaptcha.class.php
index 7874991f..fdb6d1ff 100644
--- a/extensions/ConfirmEdit/MathCaptcha.class.php
+++ b/extensions/ConfirmEdit/MathCaptcha.class.php
@@ -22,7 +22,7 @@ class MathCaptcha extends SimpleCaptcha {
$index = $this->storeCaptcha( array( 'answer' => $answer ) );
$form = '<table><tr><td>' . $this->fetchMath( $sum ) . '</td>';
- $form .= '<td>' . Html::input( 'wpCaptchaWord', false, false, array( 'tabindex' => '1', 'required' ) ) . '</td></tr></table>';
+ $form .= '<td>' . Html::input( 'wpCaptchaWord', false, false, array( 'tabindex' => '1', 'autocomplete' => 'off', 'required' ) ) . '</td></tr></table>';
$form .= Html::hidden( 'wpCaptchaId', $index );
return $form;
}
@@ -40,11 +40,10 @@ class MathCaptcha extends SimpleCaptcha {
/** Fetch the math */
function fetchMath( $sum ) {
if ( MWInit::classExists( 'MathRenderer' ) ) {
- $math = new MathRenderer( $sum );
+ $math = MathRenderer::getRenderer( $sum, array(), MW_MATH_PNG );
} else {
throw new MWException( 'MathCaptcha requires the Math extension for MediaWiki versions 1.18 and above.' );
}
- $math->setOutputMode( MW_MATH_PNG );
$html = $math->render();
return preg_replace( '/alt=".*?"/', '', $html );
}
diff --git a/extensions/ConfirmEdit/QuestyCaptcha.class.php b/extensions/ConfirmEdit/QuestyCaptcha.class.php
index 93954f1e..3acfa46e 100644
--- a/extensions/ConfirmEdit/QuestyCaptcha.class.php
+++ b/extensions/ConfirmEdit/QuestyCaptcha.class.php
@@ -44,6 +44,7 @@ class QuestyCaptcha extends SimpleCaptcha {
'name' => 'wpCaptchaWord',
'id' => 'wpCaptchaWord',
'required',
+ 'autocomplete' => 'off',
'tabindex' => 1 ) ) . // tab in before the edit textarea
"</p>\n" .
Xml::element( 'input', array(
diff --git a/extensions/ConfirmEdit/QuestyCaptcha.i18n.php b/extensions/ConfirmEdit/QuestyCaptcha.i18n.php
index 8d30b0a6..c83ed9af 100644
--- a/extensions/ConfirmEdit/QuestyCaptcha.i18n.php
+++ b/extensions/ConfirmEdit/QuestyCaptcha.i18n.php
@@ -19,7 +19,7 @@ To help protect against automated spam, please answer the question that appears
'questycaptcha-create' => 'To create the page, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
'questycaptcha-edit' => 'To edit this page, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
'questycaptcha-sendemail' => 'To help protect against automated spamming, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
- 'questycaptchahelp-text' => "Web sites that accept contributions from the public, like this wiki, are often abused by spammers who use automated tools to add their links to many sites.
+ 'questycaptchahelp-text' => 'Web sites that accept contributions from the public, like this wiki, are often abused by spammers who use automated tools to add their links to many sites.
While these spam links can be removed, they are a significant nuisance.
Sometimes, especially when adding new web links to a page, the wiki may ask you to answer a question.
@@ -27,30 +27,23 @@ Since this is a task that is hard to automate, it will allow most real humans to
Please contact the [[{{MediaWiki:Grouppage-sysop}}|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate contributions.
-Click the 'back' button in your browser to return to the page editor.",
+Click the "back" button in your browser to return to the page editor.',
);
/** Message documentation (Message documentation)
* @author Fryed-peach
* @author Hamilton Abreu
+ * @author Shirayuki
*/
$messages['qqq'] = array(
- 'questycaptcha-desc' => '{{desc}}',
- 'questycaptcha-addurl' => 'See also
-*{{msg-mw|captcha-addurl}}
-*{{msg-mw|Fancycaptcha-addurl}}',
- 'questycaptcha-badlogin' => 'See also
-*{{msg-mw|captcha-badlogin}}
-*{{msg-mw|Fancycaptcha-badlogin}}',
- 'questycaptcha-createaccount' => 'See also
-*{{msg-mw|captcha-createaccount}}
-*{{msg-mw|Fancycaptcha-createaccount}}',
- 'questycaptcha-create' => 'See also
-*{{msg-mw|Captcha-create}}
-*{{msg-mw|Fancycaptcha-create}}',
- 'questycaptcha-edit' => 'See also
-*{{msg-mw|Captcha-edit}}
-*{{msg-mw|Fancycaptcha-edit}}',
+ 'questycaptcha-desc' => '{{Optional}}
+{{desc}}',
+ 'questycaptcha-addurl' => '{{Related|ConfirmEdit-addurl}}',
+ 'questycaptcha-badlogin' => '{{Related|ConfirmEdit-badlogin}}',
+ 'questycaptcha-createaccount' => '{{Related|ConfirmEdit-createaccount}}',
+ 'questycaptcha-create' => '{{Related|ConfirmEdit-create}}',
+ 'questycaptcha-edit' => '{{Related|ConfirmEdit-edit}}',
+ 'questycaptcha-sendemail' => '{{Related|ConfirmEdit-sendemail}}',
'questycaptchahelp-text' => 'See also {{msg-mw|Captchahelp-text}}.',
);
@@ -94,6 +87,27 @@ $messages['ar'] = array(
إذا كنت تحرر صÙحة معينة: اضغط زر 'العودة' ÙÙŠ متصÙحك للعودة إلى التحرير.",
);
+/** Asturian (asturianu)
+ * @author Xuacu
+ */
+$messages['ast'] = array(
+ 'questycaptcha-addurl' => "La to edición inclúi nuevos enllaces esternos. P'aidar a protexer escontra'l spam automatizáu, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+ 'questycaptcha-badlogin' => "P'ayudar a protexer escontra'l descifráu automáticu de claves, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+ 'questycaptcha-createaccount' => "P'ayudar a protexer escontra la creación automática de cuentes, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+ 'questycaptcha-create' => "Pa crear la páxina, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+ 'questycaptcha-edit' => "Pa editar la páxina, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+ 'questycaptcha-sendemail' => "P'ayudar a protexer escontra'l corréu puxarra automáticu, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+ 'questycaptchahelp-text' => "Los sitios web qu'aceuten collaboración del públicu, como esta wiki, sufren de vezu l'abusu de «spammers» qu'usen ferramientes automátiques p'amestar los sos enllaces en munchos sitios.
+Mentanto qu'esos enllaces puen desaniciase, suponen una bultable molestia.
+
+Dacuando, especialmente al amestar enllaces nuevos a una páxina, la wiki pue pidi-y que conteste una entruga.
+Como esta ye una xera difícil d'automatizar, permitirá que la mayor parte de persones faiga collaboraciones mentanto torga a la mayor parte de «spammers» y otros atacantes robotizaos .
+
+Por favor, pongase'n contautu colos [[{{MediaWiki:Grouppage-sysop}}|alministradores del sitiu]] pa pidir ayuda si esto ta torgando-y de mou inesperáu facer collaboraciones llexítimes.
+
+Calque nel botón «atrás» del navegador pa volver al editor de páxines.",
+);
+
/** Bashkir (башҡортÑа)
* @author Assele
*/
@@ -213,7 +227,21 @@ Pokud vám to brání v užiteÄných příspÄ›vcích a potÅ™ebujete pomoc, kont
Pro návrat na pÅ™edchozí stránku stisknÄ›te ve svém prohlížeÄi tlaÄítko „zpÄ›t“.',
);
+/** Welsh (Cymraeg)
+ * @author Lloffiwr
+ */
+$messages['cy'] = array(
+ 'questycaptcha-addurl' => 'Mae eich golygiad yn cynnwys o leiaf un cyswllt allanol newydd.
+Er mwyn ceisio rhwystro peiriannau sbam, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+ 'questycaptcha-badlogin' => 'Er mwyn ceisio rhwystro peiriannau datrys cyfrineiriau, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+ 'questycaptcha-createaccount' => 'Er mwyn ceisio rhwystro peiriannau creu cyfrifon, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+ 'questycaptcha-create' => "Er mwyn dechrau'r dudalen, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):",
+ 'questycaptcha-edit' => "Er mwyn golygu'r dudalen, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):",
+ 'questycaptcha-sendemail' => 'Er mwyn cyfrannu at ddiogelu rhag sbamio awtomatig, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+);
+
/** German (Deutsch)
+ * @author Geitost
* @author Kghbln
* @author Pill
* @author Umherirrender
@@ -226,7 +254,7 @@ Zum Schutz vor automatisiertem Spam, beantworte bitte die untenstehende Frage, u
'questycaptcha-createaccount' => 'Zum Schutz vor einer automatisierten Anlage von Benutzerkonten ist es erforderlich, die folgende Frage zu beantworten ([[Special:Captcha/help|weitere Informationen]]):',
'questycaptcha-create' => 'Bitte beantworte die folgende Frage, um diese Seite erstellen zu können ([[Special:Captcha/help|weitere Informationen]]):',
'questycaptcha-edit' => 'Bitte beantworte die folgende Frage, um diese Seite speichern zu können ([[Special:Captcha/help|weitere Informationen]]):',
- 'questycaptcha-sendemail' => 'Zum Schutz vor automatisiertem Spam, beantworte bitte die untenstehende Frage, um die E-Mail-Nachricht senden zu können ([[Special:Captcha/help|weitere Informationen]]):',
+ 'questycaptcha-sendemail' => 'Zum Schutz vor automatisiertem Spam bitte die untenstehende Frage beantworten ([[Special:Captcha/help|weitere Informationen]]):',
'questycaptchahelp-text' => 'Internetangebote, die — wie dieses Wiki — für Beiträge von praktisch jedem offen sind, werden häufig von Spammern missbraucht, welche versuchen, mithilfe entsprechender Werkzeuge ihre Links automatisch auf vielen Webseiten zu platzieren.
Zwar können derartige Spam-Links wieder entfernt werden, doch stellen sie trotzdem ein erhebliches Ärgernis dar.
@@ -384,6 +412,7 @@ Napsauta selaimesi \'takaisin\'-painiketta palataksesi sivumuokkaimeen.',
/** French (français)
* @author IAlex
+ * @author Nicolas NALLET
* @author Verdy p
*/
$messages['fr'] = array(
@@ -393,7 +422,7 @@ Pour nous aider dans la protection contre le pourriel automatisé, veuillez rép
'questycaptcha-badlogin' => 'Afin de nous aider à prévenir le cassage des mots de passe par des automates, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
'questycaptcha-createaccount' => 'Afin de nous aider à lutter contre les créations automatiques de comptes, veuillez répondre à la question qui apparaît ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
'questycaptcha-create' => 'Pour créer la page, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
- 'questycaptcha-edit' => 'Pour modifier cette page, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+ 'questycaptcha-edit' => 'Pour créer, modifier ou publier cette page, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
'questycaptcha-sendemail' => 'Afin de nous aider à prévenir le spam automatique, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
'questycaptchahelp-text' => 'Les sites web qui acceptent des contributions du public, tels que ce wiki, sont souvent victimes de polluposteurs qui utilisent des outils automatisés pour placer de nombreux liens vers leurs sites.
Même si cette pollution peut être effacée, elle n’en reste pas moins irritante.
@@ -418,15 +447,15 @@ Para axudar na protección contra o spam automatizado, conteste a pregunta que a
'questycaptcha-create' => 'Para crear a páxina, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
'questycaptcha-edit' => 'Para editar esta páxina, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
'questycaptcha-sendemail' => 'Para contribuír na protección contra o spam automatizado, responda a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
- 'questycaptchahelp-text' => "Os sitios web que aceptan publicar as contribucións dos usuarios, coma este wiki, sofren, con frecuencia, o abuso por parte de ''spammers'' que usan ferramentas que automatizan a inclusión de lixo en forma de ligazóns publicitarias, nunha chea de páxinas, en pouco tempo.
+ 'questycaptchahelp-text' => 'Os sitios web que aceptan publicar as contribucións dos usuarios, coma este wiki, sofren, con frecuencia, o abuso por parte de spammers que usan ferramentas que automatizan a inclusión de lixo en forma de ligazóns publicitarias, nunha chea de páxinas, en pouco tempo.
Mentres as devanditas ligazóns non son eliminadas supoñen unha molestia e unha perda de tempo.
En ocasións, en particular cando engada algunha nova ligazón externa, o wiki pode pedirlle que conteste unha pregunta.
-Como esta tarefa é difícil de automatizar, permite distinguir entre persoas e robots e dificulta os ataques automatizados dos ''spammers''.
+Como esta tarefa é difícil de automatizar, permite distinguir entre persoas e robots e dificulta os ataques automatizados dos spammers.
-Por favor, contacte cun [[{{MediaWiki:Grouppage-sysop}}|administrador do sitio]] para solicitar axuda se o sistema lle impide rexistrarse para facer contribucións lexítimas.
+Por favor, póñase en contacto cun [[{{MediaWiki:Grouppage-sysop}}|administrador do sitio]] para solicitar axuda se o sistema lle impide rexistrarse para facer contribucións lexítimas.
-Prema no botón \"atrás\" do seu navegador para volver á páxina de edición.",
+Prema no botón "Atrás" do seu navegador para volver á páxina de edición.',
);
/** Swiss German (Alemannisch)
@@ -594,6 +623,7 @@ Peslen ti 'agsubli' a buton dita pagbasabasam (browser) ti agsubli idiay panid t
/** Italian (italiano)
* @author Beta16
* @author Darth Kule
+ * @author Nemo bis
*/
$messages['it'] = array(
'questycaptcha-addurl' => "La modifica richiesta aggiunge dei collegamenti esterni alla pagina; come misura precauzionale contro l'inserimento automatico di spam, si prega di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):",
@@ -602,13 +632,13 @@ $messages['it'] = array(
'questycaptcha-create' => 'Per creare la pagina si prega di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
'questycaptcha-edit' => 'Per modificare questa pagina si prega di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
'questycaptcha-sendemail' => 'Come misura precauzionale nei confronti dei messaggi di spam automatici, si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
- 'questycaptchahelp-text' => "Capita spesso che i siti Web che accettano messaggi pubblici, come questo wiki, siano presi di mira da spammer che usano strumenti automatici per inserire collegamenti pubblicitari verso un gran numero di siti. Per quanto i collegamenti indesiderati si possano rimuovere, si tratta comunque di una seccatura non indifferente.
+ 'questycaptchahelp-text' => 'Capita spesso che i siti web che accettano contributi pubblici, come questo wiki, siano presi di mira da persone che usano strumenti automatici per inserire collegamenti pubblicitari verso un gran numero di siti (spam). Per quanto i collegamenti indesiderati si possano rimuovere, si tratta comunque di una seccatura non indifferente.
-In alcuni casi, ad esempio quando si tenta di aggiungere nuovi collegamenti Web in una pagina, il software wiki può richiedere di rispondere a una domanda. Poiché si tratta di un'azione difficile da replicare da parte di un computer, questo meccanismo consente a (quasi tutti) gli utenti reali di effettuare i proprio contributi, impedendo l'accesso alla maggior parte degli spammer e degli altri attacchi automatizzati.
+In alcuni casi, ad esempio quando si tenta di aggiungere nuovi collegamenti web in una pagina, il software wiki può richiedere di rispondere a una domanda. Poiché si tratta di un\'azione difficile da replicare da parte di un computer, questo meccanismo consente a (quasi tutti) gli utenti reali di effettuare i proprio contributi, impedendo l\'accesso alla maggior parte degli spammer e degli altri attacchi automatizzati.
Se queste procedure impediscono contributi che si ritengono legittimi, si prega di contattare gli [[{{MediaWiki:Grouppage-sysop}}|amministratori del sito]] e chiedere loro assistenza.
-Fare clic sul pulsante 'indietro' del browser per tornare alla pagina di modifica.",
+Fare clic sul pulsante "indietro" del browser per tornare alla pagina di modifica.',
);
/** Japanese (日本語)
@@ -641,8 +671,21 @@ $messages['ja'] = array(
$messages['ko'] = array(
'questycaptcha-desc' => '편집 확ì¸ì— 대한 íƒêµ¬ì ì¸ CAPCHA(캡차) ìƒì„±ê¸°',
'questycaptcha-addurl' => 'íŽ¸ì§‘ì— ìƒˆë¡œìš´ 바깥 ë§í¬ê°€ í¬í•¨ë˜ì–´ 있습니다.
-ìžë™í™”ëœ ìŠ¤íŒ¸ì„ ë§‰ê¸° 위해 아래 ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ë” ë§Žì€ ì •ë³´]]):',
- 'questycaptcha-badlogin' => 'ìžë™í™”ëœ ë¹„ë°€ë²ˆí˜¸ 깨기를 방지하기 위해, 아래애 ë³´ì´ëŠ” ì§ˆë¬¸ì— ëŒ€ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해, ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'questycaptcha-badlogin' => 'ìžë™í™”ëœ ë¹„ë°€ë²ˆí˜¸ 깨기로부터 보호하기 위해, ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'questycaptcha-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기로부터 보호하기 위해, ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'questycaptcha-create' => '문서를 만드려면 ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'questycaptcha-edit' => 'ì´ ë¬¸ì„œë¥¼ 편집하려면 ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'questycaptcha-sendemail' => 'ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해, ì•„ëž˜ì— ë³´ì´ëŠ” ì§ˆë¬¸ì— ë‹µí•´ì£¼ì„¸ìš” ([[Special:Captcha/help|ìžì„¸í•œ ì •ë³´]]):',
+ 'questycaptchahelp-text' => 'ì´ ìœ„í‚¤ì™€ ê°™ì´ ì‚¬ëžŒì˜ ê³µê°œì ì¸ 참여가 가능한 웹 사ì´íŠ¸ì—서는 ìžë™ í”„ë¡œê·¸ëž¨ì´ ìŠ¤íŒ¸ì„ ë¿Œë¦¬ëŠ” 경우가 있습니다.
+물론 ì´ëŸ¬í•œ ìŠ¤íŒ¸ì€ ì œê±°í•  수는 있지만 번거로운 ìž‘ì—…ì´ ëŠ˜ì–´ë‚©ë‹ˆë‹¤.
+
+ì´ëŸ¬í•œ ìŠ¤íŒ¸ì„ ë°©ì§€í•˜ê¸° 위해서, ì´ ìœ„í‚¤ì˜ ë¬¸ì„œì— ì›¹ 사ì´íŠ¸ 주소를 추가하는 ë“±ì˜ í–‰ë™ì„ í•  경우ì—는 ì§ˆë¬¸ì— ë‹µí•´ë‹¬ë¼ê³  하는 경우가 있습니다.
+ì´ ê¸€ìž ìž…ë ¥ ìž‘ì—…ì€ ìžë™ í”„ë¡œê·¸ëž¨ì„ ë§Œë“¤ê¸°ê°€ 힘들기 ë•Œë¬¸ì— ìŠ¤íŒ¸ì„ íš¨ê³¼ì ìœ¼ë¡œ 막으면서 ì¼ë°˜ 사용ìžë¥¼ 막지 ì•Šì„ ìˆ˜ 있습니다.
+
+예기치않게 정당한 í–‰ë™ì„ 하지 못하ë„ë¡ ë§‰ëŠ”ë‹¤ë©´ [[{{MediaWiki:Grouppage-sysop}}|사ì´íŠ¸ 관리ìž]]ì—게 ë„ì›€ì„ ìš”ì²­í•´ 주세요.
+
+ì´ì „ 화면으로 ëŒì•„가려면 웹 브ë¼ìš°ì €ì˜ "뒤로" ë²„íŠ¼ì„ í´ë¦­í•˜ì„¸ìš”.',
);
/** Colognian (Ripoarisch)
@@ -710,6 +753,20 @@ Kontaktéiert w.e.g. d'[[{{MediaWiki:Grouppage-sysop}}|Administrateure vun dëse
Dréckt op den 'Zréck' Knäppche vun ärem Browser fir an d'Beaarbechtungsfënster zréckzekommen.",
);
+/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ */
+$messages['min'] = array(
+ 'questycaptchahelp-text' => 'Laman-laman web nan manarimo tulisan dari urang banyak (publik), samacam wiki ko, acok kali disalahgunoan dek pangguno-pangguno nan indak batangguang-jawek untuak mangiriman spam manggunoan program-program otomatis. Walaupun pautan-pautan spam tasabuik dapek sajo dihapuih, tapi tatap sajo manimbulan gangguan.
+
+Kadang-kadang, sangkek tangah manambahan pautan web baru ka suatu laman, wiki ko akan mangagiah sabuah patanyaan untuak Sanak jawek.
+Dek iko marupoan suatu karajo nan sulik untuak dibuek sacaro otomatis, pakaro ko akan mudah dilalui dek urang (manusia), sakaliguih dapek manghantian hampiang kasado sarangan spam dan robot otomatis lainnyo.
+
+Silakan hubuangi panguruih untuak mintak bantuan koq pakaro ko manghambaik Sanak untuak mambuek suntiangan nan layak.
+
+Takan tombol "back" di paramban web Sanak untuak baliak ka laman panyuntiangan.', # Fuzzy
+);
+
/** Macedonian (македонÑки)
* @author Bjankuloski06
*/
@@ -786,14 +843,15 @@ Iklikkja fuq il-buttuna 'lura' tal-browżer tiegħek sabiex tirritorna għall-ed
);
/** Norwegian Bokmål (norsk (bokmål)‎)
+ * @author Helland
* @author Nghtwlkr
* @author Simny
*/
$messages['nb'] = array(
'questycaptcha-addurl' => 'Din endring inneholder nye eksterne lenker.
-For å beskytte mot autmatisert spam, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
+For å beskytte mot automatisert spam, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
'questycaptcha-badlogin' => 'For å hindre passordtyveri, vær vennlig og svar på spørsmålet under ([[Special:Captcha/help|mer informasjon]]):',
- 'questycaptcha-createaccount' => 'For å beskytte mot autmatisert spam, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
+ 'questycaptcha-createaccount' => 'For å beskytte mot automatisert spam, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
'questycaptcha-create' => 'For å opprette siden, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
'questycaptcha-edit' => 'For å endre denne siden, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
'questycaptcha-sendemail' => 'For å beskytte mot automatisert søppelpost, svar på spørsmålet som vises nedenfor ([[Special:Captcha/help|mer info]]):',
@@ -812,22 +870,39 @@ Klikk på 'tilbake'-knappen i nettleseren din for å gå tilbake til sideeditore
* @author Siebrand
*/
$messages['nl'] = array(
- 'questycaptcha-addurl' => 'Uw bewerking bevat nieuwe externe verwijzingen.
+ 'questycaptcha-addurl' => 'Uw bewerking bevat nieuwe externe koppelingen.
Beantwoord de onderstaande vraag als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
'questycaptcha-badlogin' => 'Beantwoord de onderstaande vraag als bescherming tegen geautomatiseerde wachtwoordaanvallen ([[Special:Captcha/help|meer informatie]]):',
'questycaptcha-createaccount' => 'Beantwoord de onderstaande vraag als bescherming tegen het geautomatiseerd aanmaken van gebruikers ([[Special:Captcha/help|meer informatie]]):',
'questycaptcha-create' => 'Beantwoord de onderstaande vraag om de pagina aan te maken ([[Special:Captcha/help|meer informatie]]):',
'questycaptcha-edit' => 'Beantwoord de onderstaande vraag om deze pagina te bewerken ([[Special:Captcha/help|meer informatie]]):',
'questycaptcha-sendemail' => 'Beantwoord de onderstaande vraag als bescherming tegen geautomatiseerde spam ([[Special:Captcha/help|meer informatie]]):',
- 'questycaptchahelp-text' => "Websites die vrij te bewerken zijn, zoals deze wiki, worden vaak misbruikt door spammers die er met hun programma's automatisch verwijzigen op zetten naar vele websites.
-Hoewel deze externe verwijzingen weer verwijderd kunnen worden, leveren ze wel veel hinder en administratief werk op.
+ 'questycaptchahelp-text' => 'Websites die vrij te bewerken zijn, zoals deze wiki, worden vaak misbruikt door spammers die er met hun programma\'s automatisch koppelingen op zetten naar vele websites.
+Hoewel deze externe koppelingen weer verwijderd kunnen worden, leveren ze wel veel hinder en administratief werk op.
-Soms, en in het bijzonder bij het toevoegen van externe verwijzingen op pagina's, vraag de wiki u een vraag te beantwoorden.
+Soms, en in het bijzonder bij het toevoegen van externe koppelingen op pagina\'s, vraag de wiki u een vraag te beantwoorden.
Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat dit proces succesvol te doorlopen en worden hiermee spammers en andere geautomatiseerde aanvallen geweerd.
Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
-Klik op de knop 'terug' in uw browser om terug te gaan naar het tekstbewerkingsscherm.",
+Klik op de knop "terug" in uw browser om terug te gaan naar het tekstbewerkingsscherm.',
+);
+
+/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
+ * @author Siebrand
+ */
+$messages['nl-informal'] = array(
+ 'questycaptcha-addurl' => 'Je bewerking bevat nieuwe externe koppelingen.
+Beantwoord de onderstaande vraag als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
+ 'questycaptchahelp-text' => 'Websites die vrij te bewerken zijn, zoals deze wiki, worden vaak misbruikt door spammers die er met hun programma\'s automatisch koppelingen op zetten naar vele websites.
+Hoewel deze externe koppelingen weer verwijderd kunnen worden, leveren ze wel veel hinder en administratief werk op.
+
+Soms, en in het bijzonder bij het toevoegen van externe koppelingen op pagina\'s, vraag de wiki je een vraag te beantwoorden.
+Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat dit proces succesvol te doorlopen en worden hiermee spammers en andere geautomatiseerde aanvallen geweerd.
+
+Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces je verhindert een nuttige bijdrage te leveren.
+
+Klik op de knop "terug" in je browser om terug te gaan naar het tekstbewerkingsscherm.',
);
/** Norwegian Nynorsk (norsk (nynorsk)‎)
@@ -1069,6 +1144,13 @@ Ker je to opravilo težko avtomatizirati, bo s tem veÄini ljudi prispevanje dov
Za vrnitev v urejevalnik izberite gumb »nazaj« v vašem brskalniku.',
);
+/** Somali (Soomaaliga)
+ * @author Abshirdheere
+ */
+$messages['so'] = array(
+ 'questycaptcha-createaccount' => "Si aad u caawiso dhowritaanka in la iska samaysto Akoon,Fadlan ka jawaan su'aalahaan hoos ku qoran ([[Special:Captcha/help|Macluumaad dheeraad ah]]):",
+);
+
/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
* @author Rancher
*/
@@ -1223,6 +1305,7 @@ $messages['yi'] = array(
);
/** Simplified Chinese (中文(简体)‎)
+ * @author Cwek
*/
$messages['zh-hans'] = array(
'questycaptcha-addurl' => '您的编辑内容中å«æœ‰æœ¬ç½‘站以外的连结。为防止ä¸å½“程å¼å¤§é‡ç ´å,请回答以下的问题([[Special:Captcha/help|相关资讯]]):',
@@ -1231,6 +1314,13 @@ $messages['zh-hans'] = array(
'questycaptcha-create' => '为防止ä¸å½“程å¼å¤§é‡å»ºç«‹é¡µé¢ï¼Œè¯·å›žç­”以下问题([[Special:Captcha/help|相关资讯]]):',
'questycaptcha-edit' => '为防破å,如您想è¦ç¼–辑此页é¢ï¼Œè¯·å›žç­”以下的问题([[Special:Captcha/help|相关资讯]]):',
'questycaptcha-sendemail' => '为防止ä¸å½“程å¼ç ´è§£å¯†ç ï¼Œè¯·å›žç­”下列问题([[Special:Captcha/help|相关资讯]]):',
+ 'questycaptchahelp-text' => 'åƒæœ¬ç«™ä¸€æ ·ï¼Œå¯¹å…¬ä¼—开放编辑的网站ç»å¸¸è¢«åžƒåœ¾è¿žç»“骚扰。那些人使用自动化垃圾程åºå°†ä»–们的连结张贴到很多网站。虽然这些连结å¯ä»¥è¢«æ¸…除,但是这些东西确实令人å分讨厌。
+
+有时,特别是当给一个页é¢æ·»åŠ æ–°çš„网页链接时,本站会让你看一幅有颜色的或者有å˜å½¢æ–‡å­—的图åƒï¼Œå¹¶ä¸”è¦ä½ è¾“入所显示的文字。因为这是难以自动完æˆçš„一项任务,它将å…许人ä¿å­˜ä»–们的编辑,åŒæ—¶é˜»æ­¢å¤§å¤šæ•°å‘é€åžƒåœ¾é‚®ä»¶è€…和其他机器人的攻击。
+
+令人é—憾是,这会使得视力ä¸å¥½çš„人,或者使用基於文本或者基於声音的æµè§ˆå™¨çš„用户感到ä¸ä¾¿ã€‚而目å‰æˆ‘们还没有æ供的音频的选择。如果这正好阻止你进行正常的编辑,请和[[{{MediaWiki:Grouppage-sysop}}|站点管ç†å‘˜]]è”系获得帮助。
+
+点击æµè§ˆå™¨ä¸­çš„“åŽé€€â€æŒ‰é’®è¿”回你所编辑的页é¢ã€‚',
);
/** Traditional Chinese (中文(ç¹é«”)‎)
diff --git a/extensions/ConfirmEdit/README b/extensions/ConfirmEdit/README
index 70e2c22c..acfe481a 100644
--- a/extensions/ConfirmEdit/README
+++ b/extensions/ConfirmEdit/README
@@ -40,3 +40,9 @@ The reCAPTCHA module was written by Mike Crawford and Ben Maurer.
The Asirra module was written by Bachsau.
Additional maintenance work was done by Yaron Koren.
+
+== Changelog ==
+
+= Version 1.2
+Fixes bug 46132 - ConfirmEdit fatal error when using MathCaptcha and current Math extension.
+See <https://bugzilla.wikimedia.org/show_bug.cgi?id=46132>.
diff --git a/extensions/ConfirmEdit/ReCaptcha.class.php b/extensions/ConfirmEdit/ReCaptcha.class.php
index 59b31f47..cd274a97 100644
--- a/extensions/ConfirmEdit/ReCaptcha.class.php
+++ b/extensions/ConfirmEdit/ReCaptcha.class.php
@@ -81,11 +81,21 @@ class ReCaptcha extends SimpleCaptcha {
return wfMessage( $name, $text )->isDisabled() ? wfMessage( 'recaptcha-edit' )->text() : $text;
}
- public function APIGetAllowedParams( &$module, &$params ) {
+ public function APIGetAllowedParams( &$module, &$params, $flags ) {
+ if ( $flags && $this->isAPICaptchaModule( $module ) ) {
+ $params['recaptcha_challenge_field'] = null;
+ $params['recaptcha_response_field'] = null;
+ }
+
return true;
}
public function APIGetParamDescription( &$module, &$desc ) {
+ if ( $this->isAPICaptchaModule( $module ) ) {
+ $desc['recaptcha_challenge_field'] = 'Field from the ReCaptcha widget';
+ $desc['recaptcha_response_field'] = 'Field from the ReCaptcha widget';
+ }
+
return true;
}
}
diff --git a/extensions/ConfirmEdit/ReCaptcha.i18n.php b/extensions/ConfirmEdit/ReCaptcha.i18n.php
index 70f3ffc4..a7fffb59 100644
--- a/extensions/ConfirmEdit/ReCaptcha.i18n.php
+++ b/extensions/ConfirmEdit/ReCaptcha.i18n.php
@@ -19,10 +19,18 @@ $messages['en'] = array(
);
/** Message documentation (Message documentation)
+ * @author Shirayuki
* @author Umherirrender
*/
$messages['qqq'] = array(
- 'recaptcha-desc' => '{{desc}}',
+ 'recaptcha-desc' => '{{Optional}}
+{{desc}}',
+ 'recaptcha-edit' => '{{Related|ConfirmEdit-edit}}',
+ 'recaptcha-addurl' => '{{Related|ConfirmEdit-addurl}}',
+ 'recaptcha-badpass' => '{{Related|ConfirmEdit-badlogin}}',
+ 'recaptcha-createaccount' => '{{Related|ConfirmEdit-createaccount}}',
+ 'recaptcha-createaccount-fail' => '{{Related|ConfirmEdit-createaccount-fail}}',
+ 'recaptcha-create' => '{{Related|ConfirmEdit-create}}',
);
/** Arabic (العربية)
@@ -155,6 +163,19 @@ $messages['es'] = array(
'recaptcha-create' => 'Para protegernos de la creación automática de páginas, escribe las dos palabras que ves en el cuadro de abajo:',
);
+/** Finnish (suomi)
+ * @author Nedergard
+ * @author VezonThunder
+ */
+$messages['fi'] = array(
+ 'recaptcha-edit' => 'Suojana automaattisia roskamuokkauksia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
+ 'recaptcha-addurl' => 'Muokkauksesi sisältää uusia ulkoisia linkkejä. Suojana automaattista roskapostia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
+ 'recaptcha-badpass' => 'Suojana automaattisia salasanamurtoja vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
+ 'recaptcha-createaccount' => 'Suojana automaattista tunnusten luontia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
+ 'recaptcha-createaccount-fail' => 'Väärä tai puuttuva reCAPTCHA-vastaus.',
+ 'recaptcha-create' => 'Suojana automaattista sivujen luontia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
+);
+
/** French (français)
* @author Urhixidur
*/
@@ -269,6 +290,12 @@ $messages['ja'] = array(
*/
$messages['ko'] = array(
'recaptcha-desc' => '편집 확ì¸ì— 대한 reCAPCHA 모듈',
+ 'recaptcha-edit' => 'ìžë™í™”ëœ íŽ¸ì§‘ 스팸으로부터 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:',
+ 'recaptcha-addurl' => 'íŽ¸ì§‘ì— ìƒˆë¡œìš´ 바깥 ë§í¬ê°€ í¬í•¨ë˜ì–´ 있습니다. ìžë™í™”ëœ ìŠ¤íŒ¸ìœ¼ë¡œë¶€í„° 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:',
+ 'recaptcha-badpass' => 'ìžë™í™”ëœ ë¹„ë°€ë²ˆí˜¸ 깨기로부터 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:',
+ 'recaptcha-createaccount' => 'ìžë™í™”ëœ ê³„ì • 만들기로부터 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:',
+ 'recaptcha-createaccount-fail' => 'reCAPTCHA ë‹µì´ ì˜¬ë°”ë¥´ì§€ 않거나 없습니다.',
+ 'recaptcha-create' => 'ìžë™í™”ëœ ë¬¸ì„œ 만들기로부터 보호하기 위해, 아래 ìƒìžì— ë³´ì´ëŠ” ë‘ ë‚±ë§ì„ 입력하세요:',
);
/** Colognian (Ripoarisch)
@@ -354,20 +381,32 @@ $messages['nb'] = array(
*/
$messages['nl'] = array(
'recaptcha-edit' => 'Voer ter bescherming tegen geautomatiseerde spam de twee woorden die u ziet in het invoervenster in:',
- 'recaptcha-addurl' => 'Uw bewerking bevat nieuwe externe verwijzingen. Voer ter bescherming tegen geautomatiseerde spam de twee woorden die u ziet in het invoervenster in:',
+ 'recaptcha-addurl' => 'Uw bewerking bevat nieuwe externe koppelingen. Voer ter bescherming tegen geautomatiseerde spam de twee woorden die u ziet in het invoervenster in:',
'recaptcha-badpass' => 'Voer ter bescherming tegen het automatisch kraken van wachtwoorden de twee woorden die u ziet in het invoervenster in:',
'recaptcha-createaccount' => 'Om het automatisch aanmaken van gebruikers tegen te gaan moet u de twee woorden die u ziet invoeren:',
'recaptcha-createaccount-fail' => 'Het reCAPTCHA-antwoord is onjuist of niet ingevoerd.',
'recaptcha-create' => "Om het automatisch aanmaken van pagina's tegen te gaan moet u de twee woorden die u ziet invoeren:",
);
+/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
+ * @author Siebrand
+ */
+$messages['nl-informal'] = array(
+ 'recaptcha-edit' => 'Voer ter bescherming tegen geautomatiseerde spam de twee woorden die je ziet in het invoervenster in:',
+ 'recaptcha-addurl' => 'Je bewerking bevat nieuwe externe koppelingen. Voer ter bescherming tegen geautomatiseerde spam de twee woorden die je ziet in het invoervenster in:',
+ 'recaptcha-badpass' => 'Voer ter bescherming tegen het automatisch kraken van wachtwoorden de twee woorden die je ziet in het invoervenster in:',
+ 'recaptcha-createaccount' => 'Om het automatisch aanmaken van gebruikers tegen te gaan moet je de twee woorden die je ziet invoeren:',
+ 'recaptcha-create' => "Om het automatisch aanmaken van pagina's tegen te gaan moet je de twee woorden die je ziet invoeren:",
+);
+
/** Polish (polski)
+ * @author WTM
*/
$messages['pl'] = array(
'recaptcha-edit' => 'Aby uchronić nas przed robotami, proszę wpisać dwa widoczne słowa w poniższym polu:',
'recaptcha-addurl' => 'Twoja edycja zawiera linki zewnętrzne. Aby uchronić nas przed robotami, proszę wpisać dwa widoczne słowa w poniższym polu:',
'recaptcha-badpass' => 'Aby uchronić nas przed złamaniem automatycznym haseł, proszę wpisać dwa widoczne słowa w poniższym polu:',
- 'recaptcha-createaccount' => 'Aby uchronić nas przed automatycznym stworzeniem użytkowników, proszę wpisać dwa widoczne słowa w poniższym polu:',
+ 'recaptcha-createaccount' => 'Aby uchronić nas przed automatycznym tworzeniem użytkowników, proszę wpisać dwa widoczne słowa w poniższym polu:',
'recaptcha-createaccount-fail' => 'Odpowiedź na reCAPTCHA jest fałszywa lub brakująca.',
'recaptcha-create' => 'Aby uchronić nas przed tworzeniem stron przez robotów, proszę wpisać dwa widoczne słowa w poniższym polu:',
);
@@ -408,6 +447,18 @@ $messages['pt-br'] = array(
'recaptcha-create' => 'Para ajudar a prevenir contra criação automatizada de páginas, por favor digite as duas palavras que você vê na caixa abaixo:',
);
+/** tarandíne (tarandíne)
+ * @author Joetaras
+ */
+$messages['roa-tara'] = array(
+ 'recaptcha-edit' => "Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
+ 'recaptcha-addurl' => "Le cangiaminde tune 'ngludone collegaminde de fore nuève. Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
+ 'recaptcha-badpass' => "Pe darne 'na màne a proteggere condre le futteminde automatece de le passuord, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
+ 'recaptcha-createaccount' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le cunde, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
+ 'recaptcha-createaccount-fail' => 'Resposte reCAPTCHA ingorrette o mangande.',
+ 'recaptcha-create' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le pàggene, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
+);
+
/** Russian (руÑÑкий)
* @author ÐлекÑандр Сигачёв
*/
@@ -420,6 +471,13 @@ $messages['ru'] = array(
'recaptcha-create' => 'Ð’ целÑÑ… защиты от автоматичеÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñтраниц, пожалуйÑта, введите два Ñлова, которые вы видите ниже:',
);
+/** Sinhala (සිංහල)
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['si'] = array(
+ 'recaptcha-createaccount-fail' => 'à·€à·à¶»à¶¯à·’ හ෠දක්නට නොමà·à¶­à·’ reCAPTCHA පිළිතුර.',
+);
+
/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
* @author Rancher
*/
@@ -470,10 +528,16 @@ $messages['tl'] = array(
);
/** Ukrainian (українÑька)
+ * @author Base
* @author ТеÑÑ‚
*/
$messages['uk'] = array(
+ 'recaptcha-edit' => 'Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ Ñпаму у редагуваннÑÑ…, будь лаÑка, введіть два Ñлова, Ñкі Ви бачите у блоці нижче:',
+ 'recaptcha-addurl' => 'Ваше Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ñтить зовнішні поÑиланнÑ. Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ Ñпаму у редагуваннÑÑ…, будь лаÑка, введіть два Ñлова, Ñкі Ви бачите у блоці нижче:',
+ 'recaptcha-badpass' => 'Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ підбору паролю, будь лаÑка, введіть два Ñлова, Ñкі Ви бачите у блоці нижче:',
+ 'recaptcha-createaccount' => 'Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ Ñтворенню облікових запиÑів, будь лаÑка, введіть два Ñлова, Ñкі Ви бачите у блоці нижче:',
'recaptcha-createaccount-fail' => 'Відповідь reCAPTCHA неправильна або відÑутнÑ.',
+ 'recaptcha-create' => 'Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð¼Ñƒ Ñтворенню Ñторінок, будь лаÑка, введіть два Ñлова, Ñкі Ви бачите у блоці нижче:',
);
/** Vietnamese (Tiếng Việt)
diff --git a/extensions/ConfirmEdit/captcha.py b/extensions/ConfirmEdit/captcha.py
index b30aebe1..3d13c054 100644
--- a/extensions/ConfirmEdit/captcha.py
+++ b/extensions/ConfirmEdit/captcha.py
@@ -170,7 +170,10 @@ def pick_word(words, blacklist, verbose, nwords, min_length, max_length):
sys.exit("Unable to find valid word combinations")
def read_wordlist(filename):
- return [x.strip().lower() for x in open(wordlist).readlines()]
+ f = open(filename)
+ words = [x.strip().lower() for x in f.readlines()]
+ f.close()
+ return words
if __name__ == '__main__':
"""This grabs random words from the dictionary 'words' (one
diff --git a/extensions/ConfirmEdit/maintenance/GenerateFancyCaptchas.php b/extensions/ConfirmEdit/maintenance/GenerateFancyCaptchas.php
index e5620753..4d253bf0 100644
--- a/extensions/ConfirmEdit/maintenance/GenerateFancyCaptchas.php
+++ b/extensions/ConfirmEdit/maintenance/GenerateFancyCaptchas.php
@@ -87,7 +87,7 @@ class GenerateFancyCaptchas extends Maintenance {
$this->output( "Generating $countGen new captchas...\n" );
$retVal = 1;
- wfShellExec( $cmd, $retVal );
+ wfShellExec( $cmd, $retVal, array(), array( 'time' => 0 ) );
if ( $retVal != 0 ) {
wfRecursiveRemoveDir( $tmpDir );
$this->error( "Could not run generation script.\n", 1 );
@@ -105,9 +105,11 @@ class GenerateFancyCaptchas extends Maintenance {
continue;
}
list( $salt, $hash ) = $instance->hashFromImageName( $fileInfo->getBasename() );
+ $dest = $instance->imagePath( $salt, $hash );
+ $backend->prepare( array( 'dir' => dirname( $dest ) ) );
$status = $backend->quickStore( array(
'src' => $fileInfo->getPathname(),
- 'dst' => $instance->imagePath( $salt, $hash )
+ 'dst' => $dest
) );
if ( !$status->isOK() ) {
$this->error( "Could not save file '{$fileInfo->getPathname()}'.\n" );
diff --git a/extensions/ConfirmEdit/ext.confirmedit.asirra.js b/extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js
index 52dc532c..52dc532c 100644
--- a/extensions/ConfirmEdit/ext.confirmedit.asirra.js
+++ b/extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js
diff --git a/extensions/ConfirmEdit/resources/ext.confirmEdit.fancyCaptcha.css b/extensions/ConfirmEdit/resources/ext.confirmEdit.fancyCaptcha.css
new file mode 100644
index 00000000..96e4dd6a
--- /dev/null
+++ b/extensions/ConfirmEdit/resources/ext.confirmEdit.fancyCaptcha.css
@@ -0,0 +1,41 @@
+.fancycaptcha-wrapper {
+ display: table;
+ background-color: #FFF;
+}
+
+/* Prevents the size of the container from changing, affecting page
+layout, for normal CAPTCHA sizes. */
+.fancycaptcha-image-container {
+ min-height: 95px;
+ position: relative; /* to position Reload link within this */
+ display: inline-block;
+}
+
+.client-nojs .fancycaptcha-reload {
+ display: none;
+}
+
+.fancycaptcha-reload {
+ /* @embed */
+ background: url(images/fancycaptcha-reload-icon.png) no-repeat scroll left center transparent;
+
+ margin: 0 0 0 3px;
+ padding: 1px 2px 1px 12px;
+ color: #0645AD;
+ cursor: pointer;
+ cursor: hand;
+}
+
+.fancycaptcha-reload:hover {
+ text-decoration: underline;
+}
+.fancycaptcha-reload-loading {
+ /* @embed */
+ background: url(images/ajax-loader-10x10.gif) no-repeat scroll left center transparent;
+}
+
+.fancycaptcha-image-container .fancycaptcha-reload {
+ position: absolute;
+ bottom: 0;
+ right: 4px;
+}
diff --git a/extensions/ConfirmEdit/resources/ext.confirmEdit.fancyCaptcha.js b/extensions/ConfirmEdit/resources/ext.confirmEdit.fancyCaptcha.js
new file mode 100644
index 00000000..a8db7218
--- /dev/null
+++ b/extensions/ConfirmEdit/resources/ext.confirmEdit.fancyCaptcha.js
@@ -0,0 +1,37 @@
+( function ( $, mw ) {
+ var api = new mw.Api();
+ $( document ).on( 'click', '.fancycaptcha-reload', function () {
+ var $this = $( this ), $captchaImage;
+
+ $this.addClass( 'fancycaptcha-reload-loading' );
+
+ $captchaImage = $( '.fancycaptcha-image' );
+
+ // AJAX request to get captcha index key
+ api.post( {
+ action: 'fancycaptchareload',
+ format: 'xml'
+ }, {
+ dataType: 'xml'
+ } )
+ .done( function ( xmldata ) {
+ var imgSrc, captchaIndex;
+ captchaIndex = $( xmldata ).find( 'fancycaptchareload' ).attr( 'index' );
+ if ( typeof captchaIndex === 'string' ) {
+ // replace index key with a new one for captcha image
+ imgSrc = $captchaImage.attr( 'src' )
+ .replace( /(wpCaptchaId=)\w+/, '$1' + captchaIndex );
+ $captchaImage.attr( 'src', imgSrc );
+
+ // replace index key with a new one for hidden tag
+ $( '#wpCaptchaId' ).val( captchaIndex );
+ $( '#wpCaptchaWord' ).val( '' ).focus();
+ }
+ } )
+ .always( function () {
+ $this.removeClass( 'fancycaptcha-reload-loading' );
+ } );
+
+ return false;
+ } );
+} )( jQuery, mediaWiki );
diff --git a/extensions/ConfirmEdit/resources/images/ajax-loader-10x10.gif b/extensions/ConfirmEdit/resources/images/ajax-loader-10x10.gif
new file mode 100644
index 00000000..772e9a55
--- /dev/null
+++ b/extensions/ConfirmEdit/resources/images/ajax-loader-10x10.gif
Binary files differ
diff --git a/extensions/ConfirmEdit/resources/images/fancycaptcha-reload-icon.png b/extensions/ConfirmEdit/resources/images/fancycaptcha-reload-icon.png
new file mode 100644
index 00000000..6cbde303
--- /dev/null
+++ b/extensions/ConfirmEdit/resources/images/fancycaptcha-reload-icon.png
Binary files differ
diff --git a/extensions/Gadgets/.gitreview b/extensions/Gadgets/.gitreview
deleted file mode 100644
index a1a8ead4..00000000
--- a/extensions/Gadgets/.gitreview
+++ /dev/null
@@ -1,5 +0,0 @@
-[gerrit]
-host=gerrit.wikimedia.org
-port=29418
-project=mediawiki/extensions/Gadgets.git
-defaultbranch=master
diff --git a/extensions/Gadgets/Gadgets.alias.php b/extensions/Gadgets/Gadgets.alias.php
index 4f30aa1d..1371558d 100644
--- a/extensions/Gadgets/Gadgets.alias.php
+++ b/extensions/Gadgets/Gadgets.alias.php
@@ -28,7 +28,7 @@ $specialPageAliases['arz'] = array(
'Gadgets' => array( 'ادوات' ),
);
-/** Assamese (অসমীয়া) */
+/** Assamese (অসমীয়া) */
$specialPageAliases['as'] = array(
'Gadgets' => array( 'গেজেটসমূহ' ),
);
@@ -85,7 +85,7 @@ $specialPageAliases['eo'] = array(
/** Spanish (español) */
$specialPageAliases['es'] = array(
- 'Gadgets' => array( 'Artilugios', 'Accesorios' ),
+ 'Gadgets' => array( 'Accesorios', 'Artilugios' ),
);
/** Estonian (eesti) */
@@ -180,7 +180,7 @@ $specialPageAliases['ja'] = array(
/** Korean (한국어) */
$specialPageAliases['ko'] = array(
- 'Gadgets' => array( '소ë„구' ),
+ 'Gadgets' => array( '소ë„구', '가젯' ),
);
/** Ladino (Ladino) */
@@ -218,12 +218,12 @@ $specialPageAliases['mt'] = array(
'Gadgets' => array( 'Aġġeġġi', 'Aċċessorji' ),
);
-/** Norwegian Bokmål (norsk (bokmål)‎) */
+/** Norwegian Bokmål (norsk bokmål) */
$specialPageAliases['nb'] = array(
'Gadgets' => array( 'Tilleggsfunksjoner' ),
);
-/** Nedersaksisch (Nedersaksisch) */
+/** Low Saxon (Netherlands) (Nedersaksies) */
$specialPageAliases['nds-nl'] = array(
'Gadgets' => array( 'Technies_spul' ),
);
@@ -233,7 +233,7 @@ $specialPageAliases['nl'] = array(
'Gadgets' => array( 'Extensies' ),
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎) */
+/** Norwegian Nynorsk (norsk nynorsk) */
$specialPageAliases['nn'] = array(
'Gadgets' => array( 'Tilleggsfunksjonar' ),
);
@@ -243,6 +243,11 @@ $specialPageAliases['oc'] = array(
'Gadgets' => array( 'Gadgèts' ),
);
+/** Punjabi (ਪੰਜਾਬੀ) */
+$specialPageAliases['pa'] = array(
+ 'Gadgets' => array( 'ਛੋਟੇ_ਸੰਦ' ),
+);
+
/** Polish (polski) */
$specialPageAliases['pl'] = array(
'Gadgets' => array( 'Gadżety' ),
@@ -263,6 +268,11 @@ $specialPageAliases['sa'] = array(
'Gadgets' => array( 'सà¥à¤µà¤¿à¤§à¤¾_(गॅजेट)' ),
);
+/** Sicilian (sicilianu) */
+$specialPageAliases['scn'] = array(
+ 'Gadgets' => array( 'Accessori' ),
+);
+
/** Sinhala (සිංහල) */
$specialPageAliases['si'] = array(
'Gadgets' => array( 'විජෙට්ටු' ),
diff --git a/extensions/Gadgets/Gadgets.i18n.php b/extensions/Gadgets/Gadgets.i18n.php
index 3c3c24b6..f0dae2e9 100644
--- a/extensions/Gadgets/Gadgets.i18n.php
+++ b/extensions/Gadgets/Gadgets.i18n.php
@@ -63,31 +63,57 @@ You must have appropriate permissions on destination wiki (including the right t
* @author Umherirrender
*/
$messages['qqq'] = array(
- 'gadgets-desc' => '{{desc}}',
+ 'gadgets-desc' => '{{desc|name=Gadgets|url=http://www.mediawiki.org/wiki/Extension:Gadgets}}',
'prefs-gadgets' => 'In Gadgets extension. The name of a tab in [[Special:Preferences#mw-prefsection-gadgets|Special:Preferences]] where user set their preferences for the extension.
{{Identical|Gadgets}}',
'gadgets-prefstext' => 'In Gadgets extension. This is the explanation text displayed under the Gadgets tab in [[Special:Preferences#mw-prefsection-gadgets|Special:Preferences]].',
- 'gadgets' => '{{Identical|Gadgets}}',
+ 'gadgets' => '{{doc-special|Gadgets}}
+{{Identical|Gadgets}}',
'gadgets-definition' => '{{notranslate}}',
'gadgets-title' => '{{Identical|Gadgets}}',
+ 'gadgets-pagetext' => 'Used as intro text in [[Special:Gadgets]].',
'gadgets-uses' => "This is used as a verb in third-person singular. It appears in front of a script name. Example: \"''Uses: Gadget-UTCLiveClock.js''\"
-See [http://meta.wikimedia.org/wiki/Special:Gadgets Gadgets page in meta.wikimedia.org]",
+See [[meta:Special:Gadgets|Gadgets page in meta.wikimedia.org]]",
'gadgets-required-rights' => 'Parameters:
* $1 - a list in wikitext.
* $2 - the number of items in list $1 for PLURAL use.',
'gadgets-required-skins' => 'Parameters:
* $1 - a comma separated list.
* $2 - the number of items in list $1 for PLURAL use.',
+ 'gadgets-default' => "Used in [[Special:Gadgets]], if the extension is enabled for everyone by the Wiki's default settings.",
'gadgets-export' => 'Used on [[Special:Gadgets]]. This is a verb, not noun.
{{Identical|Export}}',
'gadgets-export-title' => 'Used as page title. Example: [[Special:Gadgets/export/editbuttons]]',
+ 'gadgets-not-found' => 'Used as error message. Parameters:
+* $1 - gadget name',
'gadgets-export-text' => 'Used as page description. See example: [[Special:Gadgets/export/editbuttons]]',
'gadgets-export-download' => 'Use the verb for this message. Submit button.
{{Identical|Download}}',
);
+/** Achinese (Acèh)
+ * @author Si Gam Acèh
+ */
+$messages['ace'] = array(
+ 'gadgets-desc' => 'Peujeuet ureueng nguy geupileh [[Special:Gadgets|peukakaih CSS ngon JavaScript]] rot [[Special:Preferences#mw-prefsection-gadgets|neuato]]geuh',
+ 'prefs-gadgets' => 'Alat',
+ 'gadgets-prefstext' => 'Di yup nyoe nakeuh dapeuta alat kusuih nyang jeuet neupeuudep keu akun droeneuh. Ban dum alat nyan ladom jinguy meubasis JavaScript nyankeuh jeuet Droeneuh suwah neupeuudep JavaScript bak alat buka web droeneuh mangat jeuet neupeujak. Neupeurati meunyo ban dum alat nyan hana peungaroh bak on neuato nyoe.
+
+Neupeyrati cit meunyo alat kusuih nyoe bukonkeuh beunagi nibak alat leumiek MediaWiki ngon kayem geupeukeumang ngon geupeulahra le ureueng nguy bak wiki droeneuh mantong. Ureueng uroh sinan jeuet geuandam alat nyang na rot [[MediaWiki:Gadgets-definition]] ngon [[Special:Gadgets]].',
+ 'gadgets' => 'Alat',
+ 'gadgets-title' => 'Alat',
+ 'gadgets-uses' => 'Neunguy',
+ 'gadgets-required-rights' => 'Peureulee {{PLURAL:$2|hak|hak-hak}} nyoe:
+$1',
+ 'gadgets-default' => 'Peujeuet keu ban dum ureueng meunurot neume',
+ 'gadgets-export' => 'Ekspor',
+ 'gadgets-export-title' => 'Ekspor alat',
+ 'gadgets-not-found' => 'Alat "$1" hana geuteumeung.',
+ 'gadgets-export-download' => 'Pasoe',
+);
+
/** Afrikaans (Afrikaans)
* @author Anrie
* @author Naudefj
@@ -312,6 +338,28 @@ $messages['az'] = array(
'gadgets-export-download' => 'Yüklə',
);
+/** South Azerbaijani (تورکجه)
+ * @author Amir a57
+ * @author Ebrahimi-amir
+ * @author Mousa
+ */
+$messages['azb'] = array(
+ 'prefs-gadgets' => 'آلت‌لر',
+ 'gadgets-prefstext' => 'آشاغیدا ایستیÙاده‌چی حسابینیز اوچون Ùعال ائده بیله‌جه‌گینیز اوزل آراجلاری گورورسونوز.
+بو آراجلار عوموما جاوااسکریب اساسیندادیرلار، بونا اساسن بروزئرینیزینده جاوااسکریبی Ùعال ائتمه‌لیسینیز.
+دیقتلی اولون بو آراجلار ترجیحلر صحیÙه‌سین دَییشدیره بیلمز.
+
+دیقتلی اولون بو آراجلار مئدیاویکی یازیلیملاریندان دئییللر Ùˆ عوموما هر ویکی‌نین ایستیÙاده‌چی‌لری طرÙیندن یارانیب Ùˆ ساخلانیرلار.
+هر ویکی‌نین ایداره‌چیلری [[MediaWiki:Gadgets-definition|تعریÙ‌لر]] Ùˆ [[Special:Gadgets|ایضاحات]] دا بو آراجلاری دَییشدیره بیلرلر.',
+ 'gadgets' => 'آلت لر',
+ 'gadgets-title' => 'آلت‌لر',
+ 'gadgets-uses' => 'برنامه',
+ 'gadgets-export' => 'ائشیگه آپارماق',
+ 'gadgets-export-title' => 'آبزارلاری ائشیکه آپارما',
+ 'gadgets-not-found' => 'آلت "$1" تاپیلمادی.',
+ 'gadgets-export-download' => 'اندیر',
+);
+
/** Bashkir (башҡортÑа)
* @author РуÑтам Ðурыев
* @author ҒатаУлла
@@ -561,11 +609,32 @@ $messages['ce'] = array(
/** Sorani Kurdish (کوردی)
* @author Asoxor
+ * @author Calak
*/
$messages['ckb'] = array(
'prefs-gadgets' => 'ئامرازەکان',
+ 'gadgets-prefstext' => 'ژێرەوە پێرستێک لەم ئامرازە تایبەتانەیە کە دەتوانی بۆ ھەژماکەت چالاکی بکەی.
+ئەم ئامرازانە لەسەر بنەمای جاڤاسکریپتن، کە وا بوو بۆ کەڵک لێ‌وەرگرتنیان دەبێ جاڤاسکریپتی وێبگەڕەکەت چالاک بکەی.
+ئەمە بزانە ئەم ئامرازانە ھیچ کاریگەرییەکیان لەسەر پەڕەی ھەڵبژاردەکەتدا نییە.
+
+ھەروەھا ئەمەش بزانە ئەم ئامرازە تایبەتانە بەشێک لە نەرمامێری میدیاویکی نین و زیاتر لە لایەن بەکارھێنەرانی ویکیی خۆماڵیی خۆت پەرەی پێ‌دەدرێت و دەپارێزرێت.
+بەڕێوەبەرانی خۆماڵی دەتوانن [[MediaWiki:Gadgets-definition|پێناسەکان]] و [[Special:Gadgets|تێبینییەکانی]] ئامرازەکان دەستکاری بکەن.',
'gadgets' => 'ئامرازەکان',
'gadgets-title' => 'ئامرازەکان',
+ 'gadgets-pagetext' => 'ژێرەوە پێرستێک لەم ئامرازە تایبەتانەیە کە بەکارھینەران دەتوانن لە ڕێگەی [[Special:Preferences#mw-prefsection-gadgets|پەڕەی ھەڵبژاردەکەیان]]ەوە چالاکی بکەن کە لە [[MediaWiki:Gadgets-definition|پێناسەکان]]دا دەناسێنرێن.
+ئەم کورتەیە دەست پێ‌ڕاگەییشتن بە پەڕکانی پەیامی سیستەم کە تێبینی و کۆدی ئامرازەکانی تێدا ھاتووە ئاسان دەکاتەوە.',
+ 'gadgets-uses' => 'بەکارگیراو',
+ 'gadgets-required-rights' => 'پێویستی بەم {{PLURAL:$2|ماÙÛ•ÛŒ|ماÙانەی}} ژێرەوە ھەیە:
+
+$1',
+ 'gadgets-default' => 'بە شێوەی بەرگریمانە بۆ ھەموو کەس چالاکە.',
+ 'gadgets-export' => 'هەناردن',
+ 'gadgets-export-title' => 'ھەناردنی ئامراز',
+ 'gadgets-export-text' => 'بۆ ھەناردنی ئامرازی $1، لەسەر دوگمەی «{{int:gadgets-export-download}}» کرتە بکە، پەڕگە داگرتووەکە پاشەکەوت بکە،
+بچۆ بۆ Special:Import لە ویکیی مەبەستدا و باری بکە. پاشان ئەمەی ژێرەوە بە پەڕەی MediaWiki:Gadgets-definition زیاد بکە:
+<pre>$2</pre>
+پێویستە Ù„Û• ویکیی مەبەستدا ماÙÛŒ گونجاوت ھەبێ (ÙˆÛ•Ú© ماÙÛŒ دەستکاریی پەیامەکانی سیستەم) Ùˆ ھاوردنی Ù¾Û•Ú•Ú¯Û• بارکراوەکان دەبێ چالاک کرابێ.',
+ 'gadgets-export-download' => 'دایبگرە',
);
/** Czech (Äesky)
@@ -673,6 +742,7 @@ Du skal have de nødvendige rettigheder på destinationswikien (herunder rettigh
/** German (Deutsch)
* @author Daniel Kinzler, brightbyte.de
+ * @author Geitost
* @author Kghbln
* @author Metalhead64
* @author Raimond Spekking
@@ -702,9 +772,9 @@ $1',
'gadgets-export' => 'Export',
'gadgets-export-title' => 'Export der Helferlein',
'gadgets-not-found' => 'Helferlein „$1“ wurde nicht gefunden.',
- 'gadgets-export-text' => 'Um das Helferlein $1 zu exportieren, klicke auf die Schaltfläche „{{int:gadgets-export-download}}“ und speichere die heruntergeladene Datei. Gehe sodann zur Spezialseite Spezial:Import auf dem für den Import vorgesehenen Wiki und lade die Datei hoch. Danach füge den folgenden Text der Seite MediaWiki:Gadgets-definition hinzu:
+ 'gadgets-export-text' => 'Um das Helferlein $1 zu exportieren, klicke auf die Schaltfläche „{{int:gadgets-export-download}}“ und speichere die heruntergeladene Datei. Gehe sodann zur Spezialseite Spezial:Import auf dem für den Import vorgesehenen Wiki und lade die Datei hoch. Füge danach den folgenden Text zur Seite MediaWiki:Gadgets-definition hinzu:
<pre>$2</pre>
-Du musst über die notwendigen Berechtigungen auf dem für den Import vorgesehenen Wiki verfügen (einschließlich der Berechtigung MediaWiki-Systemnachrichten zu bearbeiten). Zudem muss der Import von Datei-Uploads aktiviert sein.',
+Du musst über die notwendigen Berechtigungen auf dem für den Import vorgesehenen Wiki verfügen (einschließlich der Berechtigung, MediaWiki-Systemnachrichten zu bearbeiten). Zudem muss der Import von Datei-Uploads aktiviert sein.',
'gadgets-export-download' => 'Herunterladen',
);
@@ -719,18 +789,19 @@ Sie funktionieren allerdings nicht auf dieser Spezialseite mit den persönlichen
Ausserdem ist zu beachten, dass diese Helferlein im Allgemeinen nicht Teil von MediaWiki sind, sondern meist von Benutzern lokaler Wikis entwickelt und gewartet werden.
Lokale Administratoren können die verfügbaren Helferlein bearbeiten. Dafür stehen die [[MediaWiki:Gadgets-definition|Definitionen]] und [[Special:Gadgets|Beschreibungen]] zur Verfügung.',
'gadgets-default' => 'Für alle standardmässig aktiviert.',
- 'gadgets-export-text' => 'Um das Helferlein $1 zu exportieren, klicke auf die Schaltfläche „{{int:gadgets-export-download}}“ und speichere die heruntergeladene Datei. Gehe sodann zur Spezialseite Spezial:Import auf dem für den Import vorgesehenen Wiki und lade die Datei hoch. Danach füge den folgenden Text der Seite MediaWiki:Gadgets-definition hinzu:
+ 'gadgets-export-text' => 'Um das Helferlein $1 zu exportieren, klicke auf die Schaltfläche «{{int:gadgets-export-download}}» und speichere die heruntergeladene Datei. Gehe sodann zur Spezialseite Spezial:Import auf dem für den Import vorgesehenen Wiki und lade die Datei hoch. Füge danach den folgenden Text zur Seite MediaWiki:Gadgets-definition hinzu:
<pre>$2</pre>
-Du musst über die notwendigen Berechtigungen auf dem für den Import vorgesehenen Wiki verfügen (einschliesslich der Berechtigung MediaWiki-Systemnachrichten zu bearbeiten). Zudem muss der Import von Datei-Uploads aktiviert sein.',
+Du musst über die notwendigen Berechtigungen auf dem für den Import vorgesehenen Wiki verfügen (einschliesslich der Berechtigung, MediaWiki-Systemnachrichten zu bearbeiten). Zudem muss der Import von Datei-Uploads aktiviert sein.',
);
/** German (formal address) (Deutsch (Sie-Form)‎)
+ * @author Geitost
* @author Kghbln
*/
$messages['de-formal'] = array(
- 'gadgets-export-text' => 'Um das Helferlein $1 zu exportieren, klicken Sie auf die Schaltfläche „{{int:gadgets-export-download}}“ und speichern Sie die heruntergeladene Datei. Gehen Sie sodann zur Spezialseite Spezial:Import auf dem für den Import vorgesehenen Wiki und laden Sie die Datei hoch. Danach fügen Sie den folgenden Text der Seite MediaWiki:Gadgets-definition hinzu:
+ 'gadgets-export-text' => 'Um das Helferlein $1 zu exportieren, klicken Sie auf die Schaltfläche „{{int:gadgets-export-download}}“ und speichern Sie die heruntergeladene Datei. Gehen Sie sodann zur Spezialseite Spezial:Import auf dem für den Import vorgesehenen Wiki und laden die Datei hoch. Fügen Sie danach den folgenden Text zur Seite MediaWiki:Gadgets-definition hinzu:
<pre>$2</pre>
-Sie müssen über die notwendigen Berechtigungen auf dem für den Import vorgesehenen Wiki verfügen (einschließlich der Berechtigung MediaWiki-Systemnachrichten zu bearbeiten). Zudem muss der Import von Datei-Uploads aktiviert sein.',
+Sie müssen über die notwendigen Berechtigungen auf dem für den Import vorgesehenen Wiki verfügen (einschließlich der Berechtigung, MediaWiki-Systemnachrichten zu bearbeiten). Zudem muss der Import von Datei-Uploads aktiviert sein.',
);
/** Zazaki (Zazaki)
@@ -937,6 +1008,7 @@ Sul peavad olema sihtvikis vajalikud õigused (kaasa arvatud õigus redigeerida
/** Basque (euskara)
* @author An13sa
* @author Inorbez
+ * @author Joxemai
* @author Unai Fdz. de Betoño
* @author පසිඳු කà·à·€à·’න්ද
*/
@@ -955,6 +1027,7 @@ Administratzaileek [[MediaWiki:Gadgets-definition|definizioak]] eta [[Special:Ga
Ikuspegi orokor honek gadget bakoitza definitzen duen deskribapen eta kode orrietarako lotura errazak eskaintzen ditu.',
'gadgets-uses' => 'Erabilerak',
'gadgets-export' => 'Esportatu',
+ 'gadgets-export-title' => 'Gadgeten esportazioa',
'gadgets-export-download' => 'Jaitsi',
);
@@ -1073,12 +1146,12 @@ Cette vue d’ensemble donne un accès rapide aux pages de messages système qui
'gadgets-required-rights' => 'Requiert {{PLURAL:$2|le droit suivant|les droits suivants}} :
$1.',
- 'gadgets-required-skins' => 'Disponible sur le {{PLURAL:$2| $1 skin|following skins: $1 }}.',
+ 'gadgets-required-skins' => 'Disponible sur {{PLURAL:$2|l’habillage suivant|les habillages suivants}} : $1.',
'gadgets-default' => 'Activé pour tout le monde par défaut.',
'gadgets-export' => 'Exporter',
'gadgets-export-title' => 'Export de gadget',
'gadgets-not-found' => 'Gadget « $1 » non trouvé.',
- 'gadgets-export-text' => 'Pour exporter le gadget $1, cliquer sur le bouton « {{int:gadgets-export-download}} », enregistrer le fichier téléchargé puis aller sur la page Special:Import du wiki de destination et l’importer. Ajouter ensuite le texte suivant dans la page MediaWiki:Gadgets-definition:
+ 'gadgets-export-text' => 'Pour exporter le gadget $1, cliquez sur le bouton « {{int:gadgets-export-download}} », enregistrez le fichier téléchargé puis allez sur la page Special:Import du wiki de destination et importez-la. Ajoutez ensuite le texte suivant dans la page MediaWiki:Gadgets-definition :
<pre>$2</pre>
Il est nécessaire de disposer des droits correspondants sur le wiki de destination (y compris celui de modifier les messages système) et l’import depuis des fichiers doit être activé.',
'gadgets-export-download' => 'Télécharger',
@@ -1134,7 +1207,7 @@ $messages['gl'] = array(
A maioría destes trebellos baséanse no JavaScript, así que ten que ter o JavaScript activado no seu navegador para que funcionen.
Teña en conta que estes trebellos non funcionarán nesta páxina de preferencias.
-Teña tamén en conta que estes trebellos especiais non son parte do software de MediaWiki e que os crean e manteñen os usuarios no seu wiki local. Os administradores locais poden editar os trebellos dispoñíbeis mediante [[MediaWiki:Gadgets-definition|definicións]] e [[Special:Gadgets|descricións]].',
+Teña tamén en conta que estes trebellos especiais non son parte do software de MediaWiki e que os crean e manteñen os usuarios no seu wiki local. Os administradores locais poden editar as [[MediaWiki:Gadgets-definition|definicións]] e [[Special:Gadgets|descricións]] dos trebellos dispoñibles.',
'gadgets' => 'Trebellos',
'gadgets-title' => 'Trebellos',
'gadgets-pagetext' => 'Embaixo hai unha lista dos trebellos especiais que os usuarios poden habilitar na súa páxina de preferencias, tal e como se describe nas [[MediaWiki:Gadgets-definition|definicións]].
@@ -1361,9 +1434,11 @@ Dyrbiš trěbne prawa na cilowym wikiju měć (inkluziwnje prawo systemowe powě
);
/** Hungarian (magyar)
+ * @author Bináris
* @author BáthoryPéter
* @author Dani
* @author Tgr
+ * @author Vogone
*/
$messages['hu'] = array(
'gadgets-desc' => 'A felhasználók saját [[Special:Gadgets|CSS és JavaScript eszközöket]] választhatnak ki a [[Special:Preferences#mw-prefsection-gadgets|beállításaiknál]]',
@@ -1372,12 +1447,12 @@ $messages['hu'] = array(
Legtöbbjük JavaScriptet használ, így ezt engedélyezned kell a böngésződben, hogy működjenek.
A segédeszközök nem működnek ezen a beállításoldalon, így probléma esetén ki tudod őket kapcsolni.
-Ezek az eszközök nem részei a [[MediaWiki]] szoftvernek, általában a wiki felhasználói tartják karban őket.
+Ezek az eszközök nem részei a MediaWiki szoftvernek, általában a wiki felhasználói tartják karban őket.
Az adminisztrátorok a [[MediaWiki:Gadgets-definition|definíciókat]] és a [[Special:Gadgets|leírásokat]] tartalmazó lapok segítségével tudják módosítani az elérhető eszközök listáját.',
'gadgets' => 'Segédeszközök',
'gadgets-title' => 'Segédeszközök',
- 'gadgets-pagetext' => 'Itt látható azon segédeszközök listája, amiket a felhasználók bekapcsolhatnak a beállításaiknál. A lista a [[MediaWiki:Gadgets-definition|definíciókat]] tartalmazó lapon módosítható.
-Ez az áttekintő lap egyszerű hozzáférést nyúlt az eszközök kódját, illetve leírását tartalmazó rendszerüzenet-lapokhoz.',
+ 'gadgets-pagetext' => 'Itt látható azon segédeszközök listája, amiket a felhasználók bekapcsolhatnak a [[Special:Preferences#mw-prefsection-gadgets|beállításaiknál]]. A lista a [[MediaWiki:Gadgets-definition|definíciókat]] tartalmazó lapon módosítható.
+Ez az áttekintő lap egyszerű hozzáférést nyújt az eszközök kódját, illetve leírását tartalmazó rendszerüzenet-lapokhoz.',
'gadgets-uses' => 'Kód',
'gadgets-required-rights' => 'A következő {{PLURAL:$2|jogosultságra|jogosultságokra}} van szükség:
@@ -1393,6 +1468,32 @@ A célwikiben rendelkezned kell a megfelelő jogokkal (beleértve a rendszerüze
'gadgets-export-download' => 'Letöltés',
);
+/** Armenian (Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶)
+ * @author Xelgen
+ */
+$messages['hy'] = array(
+ 'gadgets-desc' => 'Ô¹Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¶Õ¥Ö€Õ«Õ¶ Õ¨Õ¶Õ¿Ö€Õ¥Õ¬ Õ°Õ¡Õ¿Õ¸Ö‚Õ¯ [[Special:Gadgets|ÕÕ«Ô·Õ½Ô·Õ½ Ö‡ Õ‹Õ¡Õ¾Õ¡ÕÕ¯Õ«Ö€ÕºÕ¿ (CSS and JavaScript) Õ£Õ¡Õ¤Õ»Õ¥Õ©Õ¶Õ¥Ö€]] Õ«Ö€Õ¡Õ¶Ö [[Special:Preferences#mw-prefsection-gadgets|Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ«]] Õ§Õ»Õ¸Ö‚Õ´Ö‰',
+ 'prefs-gadgets' => 'Ô³Õ¡Õ¤Õ»Õ¥Õ©Õ¶Õ¥Ö€',
+ 'gadgets-prefstext' => 'Ô±ÕµÕ½Õ¿Õ¥Õ² Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ¥Õ¶ Õ°Õ¡Õ¿Õ¸Ö‚Õ¯ Õ°Õ¡Õ¾Õ¥Õ¬Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ Õ£Õ¡Õ»Õ¥Õ©Õ¶Õ¥Ö€, Õ¸Ö€Õ¸Õ¶Ö„ Õ¤Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¨Õ½Õ¿ Õ±Õ¥Ö€ ÖÕ¡Õ¶Õ¯Õ¸Ö‚Õ©ÕµÕ¡Õ¶Ö‰
+Õ€Õ¡Õ¾Õ¥Õ¬Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ°Õ«Õ´Õ¶Õ¾Õ¡Õ® Õ¥Õ¶ Õ‹Õ¡Õ¾Õ¡ÕÕ¯Ö€Õ«ÕºÕ¿Õ« Õ¾Ö€Õ¡, Õ¸Ö‚Õ½Õ¿Õ« Õ°Õ¡Õ¾Õ¥Õ¬Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ§, Õ¸Ö€ Õ±Õ¥Ö€ Õ¤Õ«Õ¿Õ¡Ö€Õ¯Õ¹Õ¸Ö‚Õ´ Õ‹Õ¡Õ¾Õ¡ÕÕ¯Ö€Õ«ÕºÕ¿Õ¨ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ¬Õ«Õ¶Õ«Ö‰
+Õ€Õ¡Õ·Õ¾Õ« Õ¡Õ¼Õ¥Ö„, Õ¸Ö€ Õ£Õ¡Õ¤Õ»Õ¥Õ©Õ¶Õ¥Ö€Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´ Õ¹Õ« Õ¶Õ¯Õ¡Õ¿Õ¾Õ«Ö‰
+
+Õ†Õ¯Õ¡Õ¿Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¥Ö„, Õ¸Ö€ Õ½Õ¿Õ¸Ö€Ö‡ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ°Õ¡Õ¾Õ¥Õ¬Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ„Õ¥Õ¤Õ«Õ¡ÕŽÕ«Ö„Õ« Õ®Ö€Õ¡Õ£Ö€Õ« Õ´Õ¡Õ½ Õ¹Õ¥Õ¶ Õ°Õ¡Õ¶Õ¤Õ«Õ½Õ¡Õ¶Õ¸Ö‚Õ´, Ö‡ Õ¸Ö€ÕºÕ¥Õ½ Õ¯Õ¡Õ¶Õ¸Õ¶ Õ«Ö€Õ¡Õ¶Ö„ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¸Ö‚Õ´ Ö‡ Õ½ÕºÕ¡Õ½Õ¡Ö€Õ¯Õ¾Õ¸Ö‚Õ´ Õ¥Õ¶ Õ±Õ¥Ö€ Õ¾Õ«Ö„Õ«Õ« Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«ÖÖ‰
+ÕŽÕ«Ö„Õ«Õ« Õ¡Õ¤Õ´Õ«Õ¶Õ«Õ½Õ¿Ö€Õ¡Õ¿Õ¸Ö€Õ¶Õ¥Ö€Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ£Õ¡Õ¤Õ»Õ¥Õ©Õ¶Õ¥Ö€Õ« [[MediaWiki:Gadgets-definition|ÖÕ¡Õ¶Õ¯Õ¨]] Ö‡ [[Special:Gadgets|Õ¶Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨]]Ö‰',
+ 'gadgets' => 'Ô³Õ¡Õ¤Õ»Õ¥Õ©Õ¶Õ¥Ö€',
+ 'gadgets-title' => 'Ô³Õ¡Õ¤Õ»Õ¥Õ©Õ¶Õ¥Ö€',
+ 'gadgets-uses' => 'Õ•Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´ Õ§',
+ 'gadgets-required-rights' => 'Ô±Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ¥Õ¶ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ {{PLURAL:$2|Õ«Ö€Õ¡Õ¾Õ¸Ö‚Õ¶Ö„Õ¨|Õ«Ö€Õ¡Õ¾Õ¸Ö‚Õ¶Ö„Õ¶Õ¥Ö€Õ¨}}:
+
+$1',
+ 'gadgets-required-skins' => 'Õ€Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§ {{PLURAL:$2|$1 Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ¿Õ¥Õ½Ö„Õ¸Õ¾|$1 Õ¡Ö€Õ¿Õ¡Ö„Õ«Õ¶ Õ¿Õ¥Õ½Ö„Õ¥Ö€Õ¸Õ¾}}Ö‰',
+ 'gadgets-default' => 'Ô» Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§ Õ¢Õ¸Õ¬Õ¸Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€Ö‰',
+ 'gadgets-export' => 'Ô±Ö€Õ¿Õ¡Õ°Õ¡Õ¶Õ¥Õ¬',
+ 'gadgets-export-title' => 'Ô³Õ¡Õ¤Õ»Õ¥Õ©Õ« Õ¡Ö€Õ¿Õ¡Õ°Õ¡Õ¶Õ¸Ö‚Õ´',
+ 'gadgets-not-found' => '$1 Õ£Õ¡Õ¤Õ»Õ¥Õ©Õ¨ Õ¹Õ« Õ£Õ¿Õ¶Õ¾Õ¥Õ¬',
+ 'gadgets-export-download' => 'Ô²Õ¥Õ¼Õ¶Õ¥Õ¬',
+);
+
/** Interlingua (interlingua)
* @author McDutchie
*/
@@ -1738,6 +1839,7 @@ $messages['km'] = array(
'gadgets' => 'គ្រឿងបន្ទាប់បន្សំ',
'gadgets-title' => 'គ្រឿងបន្ទាប់បន្សំ',
'gadgets-uses' => 'ប្រើ',
+ 'gadgets-export' => 'នាំចáŸáž‰â€‹',
'gadgets-export-download' => 'ទាញយក',
);
@@ -1810,7 +1912,7 @@ enreschte un ändere.',
'gadgets-pagetext' => 'He kütt en Liss met spezielle <i lang="en">Gadgets</i>,
di jede Metmaacher övver sing
[[Special:Preferences#mw-prefsection-gadgets|päsönlije Enstellunge]] enschallte kann.
-Se wääde üvver [[MediaWiki:Gadgets-definition]] enjerecht.
+Se wääde övver [[MediaWiki:Gadgets-definition]] enjerecht.
Die Övverseech hee jit enne direkte Zohjang op di Texte em Wiki,
wo de Projramme, un de Erklierunge för de <i lang="en">Gadgets</i> dren enthallde
sin.',
@@ -1836,6 +1938,15 @@ $messages['ku-latn'] = array(
'gadgets-not-found' => ' Gadget "$1" nehate dîtin.',
);
+/** Kirghiz (Кыргызча)
+ * @author Growingup
+ */
+$messages['ky'] = array(
+ 'gadgets-export' => 'ЭкÑпорттоо',
+ 'gadgets-not-found' => '«$1» гаджети табылган жок.',
+ 'gadgets-export-download' => 'Жүктөп алуу',
+);
+
/** Luxembourgish (Lëtzebuergesch)
* @author Les Meloures
* @author Robby
@@ -1866,10 +1977,12 @@ Dir musst déi erfuerdert Rechter(inklusiv d\'Recht fir System-Messagen z\'änne
);
/** Lezghian (лезги)
+ * @author Namik
* @author Soul Train
*/
$messages['lez'] = array(
'gadgets' => 'Гаджетар',
+ 'gadgets-title' => 'Гажетар',
);
/** Limburgish (Limburgs)
@@ -1979,6 +2092,34 @@ $messages['mg'] = array(
'gadgets-export-download' => 'Hampidina',
);
+/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ */
+$messages['min'] = array(
+ 'gadgets-desc' => 'Mamungkinkan pangguno mamiliah [[Special:Gadgets|pakakeh CSS jo JavaScript]] malalui [[Special:Preferences#mw-prefsection-gadgets|pangaturan]]-nyo',
+ 'prefs-gadgets' => 'Pakakeh',
+ 'gadgets-prefstext' => 'Di bawah ko daftar pakakeh istimewa nan dapek Sanak aktipan untuak akun Sanak. Kasado pakakeh ko sabagian babasis JavaScript dek itu Sanak musti mangaktipan JavaScript pado paramban Sanak untuak dapek manjalankannyo. Paratikan kalau babagai pakakek ko indak ado pangaruahnyo pado laman pangaturan ko.
+
+Salain tu paratikan juo kalau pakakeh ko bukanlah bagian dari parangkaik lunak MediaWiki dan biasonyo dikambangkan dan dijago dek pangguno di Wikipedia. Panguruih lokal dapek manyuntiang pakakeh nan ado malalui [[MediaWiki:Gadgets-definition|laman definisinyo]] ataupun pado [[Special:Gadgets|laman katarangannyo]].',
+ 'gadgets' => 'Pakakeh',
+ 'gadgets-title' => 'Pakakeh',
+ 'gadgets-pagetext' => 'Di bawah ko daftar pakakeh istimewa nan dapek diaktipan pangguno malalui [[Special:Preferences#mw-prefsection-gadgets|laman pangaturan]] saroman nan didefinisikan dek [[MediaWiki:Gadgets-definition|laman definisinyo]]. Tinjauan nan ko mangagiah akses ka laman pasan sistem nan mandefinisikan deskripsi jo kode masiang-masiang pakakeh.',
+ 'gadgets-uses' => 'Panggunoan',
+ 'gadgets-required-rights' => 'Mambutuahkan {{PLURAL:$2|hak-hak}} barikuik:
+
+$1',
+ 'gadgets-required-skins' => 'Tasadio pado {{PLURAL:$2|kulik barikuik: $1}}.',
+ 'gadgets-default' => 'Diaktifkan untuak kasado urang sacaro bawaan.',
+ 'gadgets-export' => 'Ekspor',
+ 'gadgets-export-title' => 'Ekspor pakakeh',
+ 'gadgets-not-found' => 'Pakakeh "$1" indak basobok.',
+ 'gadgets-export-text' => 'Untuak mangekspor pakakeh $1, klik tombol "{{int:gadgets-export-download}}", simpan berkas nan didownload tu,
+pai ka Special:Import pado wiki nan di tuju dan muek berkas tu. Sudah tu tambahkan berkas tasabuik ka laman MediaWiki:Gadgets-definition:
+<pre>$2</pre>
+Sanak musti punyo izin pado wiki nan di tuju (tamasuak hak manyuntiang pasan sistem) dan impor berkas haruslah aktif.',
+ 'gadgets-export-download' => 'Unduah',
+);
+
/** Macedonian (македонÑки)
* @author Bjankuloski06
* @author Brest
@@ -1991,7 +2132,7 @@ $messages['mk'] = array(
Имајте предвид дека алатките нема да имаат никаков ефект врз оваа Ñтраница за нагодување.
ИÑто така имајте на ум дека овие Ñпецијални алатки не Ñе дел од програмÑката опрема на МедијаВики и иÑтите Ñе Ñоздаваат и одржуваат од кориÑници на вашето локално вики.
-Локалните админиÑтратори можат да ги уредуваат и прилагодуваат алатките кориÑтејќи Ñе Ñо [[MediaWiki:Gadgets-definition|определувања]] и [[Special:Gadgets|опиÑи]].',
+Локалните админиÑтратори можат да ги уредуваат и прилагодуваат алатките кориÑтејќи Ñе Ñо [[MediaWiki:Gadgets-definition|определби]] и [[Special:Gadgets|опиÑи]].',
'gadgets' => 'Ðлатки',
'gadgets-title' => 'Ðлатки',
'gadgets-pagetext' => 'Ова е ÑпиÑок на Ñпецијални алатки кои кориÑниците можат да ги активираат на нивната [[Special:Preferences#mw-prefsection-gadgets|Ñтраница за нагодување]], наведени во [[MediaWiki:Gadgets-definition|определувањата]].
@@ -2196,7 +2337,7 @@ Disse Översicht gifft direkten Togang to de Systemnarichten, in de de Text to d
'gadgets-uses' => 'Bruukt',
);
-/** Nedersaksisch (Nedersaksisch)
+/** Nedersaksies (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
@@ -2256,7 +2397,7 @@ De uitbreidingen zijn voornamelijk gebaseerd op JavaScript, dus JavaScript moet
De uitbreidingen hebben geen invloed op deze pagina met voorkeuren.
Deze speciale uitbreidingen zijn geen onderdeel van de MediaWiki-software en worden meestal ontwikkeld en onderhouden door gebruikers van uw wiki.
-Beheerders kunnen de beschikbare uitbreidingen aangeven in [[MediaWiki:Gadgets-definition|definities]] en [[Special:Gadgets|beschrijvingen]].',
+Beheerders kunnen de beschikbare uitbreidingen opgeven in [[MediaWiki:Gadgets-definition|definities]] en [[Special:Gadgets|beschrijvingen]].',
'gadgets' => 'Uitbreidingen',
'gadgets-title' => 'Uitbreidingen',
'gadgets-pagetext' => 'Hieronder staan de speciale uitbreidingen die gebruikers kunnen inschakelen via hun [[Special:Preferences#mw-prefsection-gadgets|voorkeuren]], zoals ingesteld in de [[MediaWiki:Gadgets-definition|definities]].
@@ -2288,7 +2429,7 @@ De uitbreidingen zijn voornamelijk gebaseerd op JavaScript, dus JavaScript moet
De uitbreidingen hebben geen invloed op deze pagina met voorkeuren.
Deze speciale uitbreidingen zijn geen onderdeel van de MediaWiki-software en worden meestal ontwikkeld en onderhouden door gebruikers van jouw wiki.
-Beheerders kunnen de beschikbare uitbreidingen aangeven in [[MediaWiki:Gadgets-definition|definities]] en [[Special:Gadgets|beschrijvingen]].',
+Beheerders kunnen de beschikbare uitbreidingen opgeven in [[MediaWiki:Gadgets-definition|definities]] en [[Special:Gadgets|beschrijvingen]].',
'gadgets-export-text' => 'Klik op de knop "{{int:gadgets-export-download}}" om de uitbreiding "$1" te exporteren.
Sla daarna het gedownloade bestand op.
Ga naar "Special:Import" in de doelwiki en upload het geëxporteerde bestand.
@@ -2404,6 +2545,8 @@ $messages['pdc'] = array(
/** Polish (polski)
* @author Derbeth
* @author Marcin Åukasz Kiejzik
+ * @author Matma Rex
+ * @author Sovq
* @author Sp5uhe
*/
$messages['pl'] = array(
@@ -2412,13 +2555,13 @@ $messages['pl'] = array(
'gadgets-prefstext' => 'Poniżej znajduje się lista specjalnych gadżetów, które możesz włączyć dla swojego konta użytkownika.
Gadżety najczęściej wykorzystują JavaScript, więc by działały musisz mieć w swojej przeglądarce włączoną obsługę JavaScriptu. Gadżety nie mają wpływu na tę stronę preferencji.
-Gadżety nie są częścią oprogramowania MediaWiki i najprawdopodobniej zostały stworzone przez użytkowników tego wiki.
+Gadżety nie są częścią oprogramowania MediaWiki i najprawdopodobniej zostały stworzone przez użytkowników tej wiki.
Lokalni administratorzy mogą edytować dostępne gadżety używając stron [[MediaWiki:Gadgets-definition|Definicje gadżetów]] oraz [[Special:Gadgets|Gadżety]].',
'gadgets' => 'Gadżety',
'gadgets-title' => 'Gadżety',
'gadgets-pagetext' => 'Poniżej znajduje się lista specjalnych gadżetów, które użytkownicy mogą włączyć na swojej [[Special:Preferences#mw-prefsection-gadgets|stronie preferencji]]. Lista ta jest zdefiniowana na stronie [[MediaWiki:Gadgets-definition|definicji]].
Poniższy przegląd ułatwia dostęp do komunikatów systemu, które definiują opis i kod każdego z gadżetów.',
- 'gadgets-uses' => 'Użycie',
+ 'gadgets-uses' => 'Używa',
'gadgets-required-rights' => 'Wymaga {{PLURAL:$2|uprawnienia|następujących uprawnień:}}
$1',
@@ -3228,12 +3371,22 @@ $messages['tt-cyrl'] = array(
'gadgets-title' => 'Гаджетлар',
);
+/** Uyghur (Arabic script) (ئۇيغۇرچە)
+ * @author Sahran
+ */
+$messages['ug-arab'] = array(
+ 'gadgets-uses' => 'ئىشلىتىش',
+ 'gadgets-export' => 'چىقار',
+ 'gadgets-export-download' => 'چۈشۈر',
+);
+
/** Ukrainian (українÑька)
* @author AS
* @author Ahonc
* @author Dim Grits
* @author Olvin
* @author Prima klasy4na
+ * @author RLuts
* @author Riwnodennyk
* @author Sodmy
* @author ТеÑÑ‚
@@ -3260,7 +3413,7 @@ $1',
'gadgets-export' => 'ЕкÑпортувати',
'gadgets-export-title' => 'ЕкÑпорт додатка',
'gadgets-not-found' => 'Додаток "$1" не знайдено.',
- 'gadgets-export-text' => 'Ðби екÑпортувати додаток $1, натиÑніть на ґудзик "{{int:gadgets-export-download}}", збережіть завантажений файл,
+ 'gadgets-export-text' => 'Ðби екÑпортувати додаток $1, натиÑніть «{{int:gadgets-export-download}}», збережіть завантажений файл,
перейдіть до Special:Import на потібній віці Ñ– відвантажте його там. Тоді додайте наÑтупний текÑÑ‚ на Ñторінку MediaWiki:Gadgets-definition:
<pre>$2</pre>
Ви повинні мати відповідні права на цільовій віці (зокрема на Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÑиÑтемних повідомлень), окрім того має бути ввімкнена можливіÑÑ‚ÑŒ імпорту з файлу.',
@@ -3291,6 +3444,7 @@ $messages['uz'] = array(
/** vèneto (vèneto)
* @author Candalua
+ * @author GatoSelvadego
*/
$messages['vec'] = array(
'gadgets-desc' => 'Consente ai utenti de selezionar [[Special:Gadgets|acessori CSS e JavaScript]] ne le proprie [[Special:Preferences#mw-prefsection-gadgets|preferense]]',
@@ -3304,6 +3458,11 @@ Nota anca che sti acessori speciali no i fa parte del software MediaWiki e i vie
'gadgets-pagetext' => "De seguito vien presentà n'elenco de acessori (''gadget'') che i utenti i pol abilitar su la so [[Special:Preferences#mw-prefsection-gadgets|pagina de le preferenze]], seguendo le definizion riportà in [[MediaWiki:Gadgets-definition]].
Sta panoramica la fornisse un comodo mecanismo par accédar ai messagi de sistema nei quali xe definìo la descrizion e el codice de ciascun acessorio.",
'gadgets-uses' => 'Dopara',
+ 'gadgets-required-rights' => 'Dimanda {{PLURAL:$2|el seguente dirito|i seguenti diriti}}:
+
+$1',
+ 'gadgets-required-skins' => "Disponibiłe {{PLURAL:$2|pa' ła skin $1|pa' łe seguenti skin: $1}}.",
+ 'gadgets-default' => 'Ativà par tuti, par inpostasion predefinia.',
'gadgets-export' => 'Esporta',
'gadgets-export-title' => 'Esporta acessorio',
'gadgets-not-found' => 'Acessorio "$1" mia catà.',
@@ -3340,7 +3499,7 @@ Chú ý rằng những công cụ đa năng này sẽ không có tác dụng tro
CÅ©ng chú ý rằng những công cụ đặc biệt này không phải là má»™t phần của phần má»m MediaWiki, mà thÆ°á»ng được phát triển và bảo trì bởi những thành viên ở wiki của há». Những quản lý ở từng ngôn ngữ có thể sá»­a đổi các công cụ Ä‘a năng có sẵn từ các danh sách [[MediaWiki:Gadgets-definition|định nghÄ©a]] và [[Special:Gadgets|miêu tả]].',
'gadgets' => 'Công cụ đa năng',
'gadgets-title' => 'Công cụ đa năng',
- 'gadgets-pagetext' => 'DÆ°á»›i đây là danh sách các công cụ Ä‘a năng đặc biệt mà thành viên có thể dùng tại [[Special:Preferences#mw-prefsection-gadgets|trang tùy chá»n cá nhân]] của há», theo [[MediaWiki:Gadgets-definition|định nghÄ©a]]. Trang tổng quan này cung cấp cách tiếp cận dá»… dàng đến trang các thông báo hệ thống để định nghÄ©a miêu tả và mã của từng công cụ.',
+ 'gadgets-pagetext' => 'DÆ°á»›i đây là danh sách các công cụ Ä‘a năng đặc biệt mà thành viên có thể dùng tại [[Special:Preferences#mw-prefsection-gadgets|trang tùy chá»n cá nhân]] của há», theo [[MediaWiki:Gadgets-definition|định nghÄ©a]]. Trang tổng quan này cung cấp cách tiếp cận dá»… dàng đến trang các thông Ä‘iệp hệ thống để định nghÄ©a miêu tả và mã của từng công cụ.',
'gadgets-uses' => 'Sử dụng',
'gadgets-required-rights' => 'Cần {{PLURAL:$2|quyá»n|các quyá»n}} sau:
@@ -3424,16 +3583,18 @@ $messages['yue'] = array(
* @author Liangent
* @author Shinjiman
* @author Xiaomingyan
+ * @author Yfdyh000
* @author 阿pp
*/
$messages['zh-hans'] = array(
'gadgets-desc' => 'å…许用户在其[[Special:Preferences#mw-prefsection-gadgets|系统设置]]中选择自定义[[Special:Gadgets|CSSå’ŒJavaScript工具]]',
'prefs-gadgets' => 'å°å·¥å…·',
- 'gadgets-prefstext' => '以下是一个特殊å°å·¥å…·ï¼Œæ‚¨å¯ä»¥åœ¨æ‚¨çš„账户中激活。
-这些å°å·¥å…·å¤šæ•°éƒ½æ˜¯åŸºäºŽJavaScript建造,如果è¦æ¿€æ´»å®ƒä»¬ï¼Œé‚£ä¹ˆæµè§ˆå™¨çš„JavaScript就需è¦æ¿€æ´»åŽæ–¹å¯ä½¿ç”¨ã€‚
-è¦ç•™æ„的是这些å°å·¥å…·åœ¨è¿™ä¸ªå‚数设置页é¢ä¸­æ˜¯æ²¡æœ‰æ•ˆæžœçš„。
+ 'gadgets-prefstext' => '以下是您å¯ä»¥ä¸ºæ‚¨çš„å¸æˆ·å¯ç”¨çš„特别å°å·¥å…·çš„åå•ã€‚
+这些å°å·¥å…·å¤§å¤šéƒ½æ˜¯åŸºäºŽJavaScript技术制作,所以您的æµè§ˆå™¨çš„JavaScript功能必须å¯ç”¨æ‰å¯ä½¿ç”¨å®ƒä»¬ã€‚
+è¦ç¨ä½œç•™æ„的是,这些å°å·¥å…·åœ¨è¿™ä¸ªå‚数设置页é¢ä¸­ä¸ä¼šæœ‰ä»»ä½•æ•ˆæžœã€‚
-亦都åŒæ—¶ç•™æ„这些å°å·¥å…·çš„特殊页é¢ä¸æ˜¯MediaWiki软件的一部份,通常都是由您本地的wiki中开å‘以åŠç»´æŠ¤ã€‚本地管ç†å‘˜å¯ä»¥ç¼–辑å¯ä¾›ä½¿ç”¨çš„å°å·¥å…·çš„[[MediaWiki:Gadgets-definition|定义]]以åŠ[[Special:Gadgets|æè¿°]]。',
+亦请您了解这些特别的å°å·¥å…·ä¸æ˜¯MediaWiki软件的一部份,大多是由您本地wiki中的用户开å‘和维护。
+本地的管ç†å‘˜å¯ä»¥ç¼–辑å¯ç”¨å°å·¥å…·çš„[[MediaWiki:Gadgets-definition|定义]]åŠ[[Special:Gadgets|æè¿°]]。',
'gadgets' => 'å°å·¥å…·',
'gadgets-title' => 'å°å·¥å…·',
'gadgets-pagetext' => '以下是一个按照[[MediaWiki:Gadgets-definition]]定义的特殊å°å·¥å…·åˆ—表,用户å¯ä»¥åœ¨ä»–们的[[Special:Preferences#mw-prefsection-gadgets|å‚数设置页é¢]]中激活它们。
@@ -3455,6 +3616,8 @@ $1',
/** Traditional Chinese (中文(ç¹é«”)‎)
* @author Anakmalaysia
+ * @author Danny0838
+ * @author Gakmo
* @author Horacewai2
* @author Liangent
* @author Mark85296341
@@ -3464,11 +3627,9 @@ $1',
$messages['zh-hant'] = array(
'gadgets-desc' => '讓使用者å¯ä»¥åœ¨[[Special:Preferences#mw-prefsection-gadgets|å好設定]]中自訂 [[Special:Gadgets|CSS與JavaScript工具]]',
'prefs-gadgets' => 'å°å·¥å…·',
- 'gadgets-prefstext' => '以下是一個特殊å°å·¥å…·ï¼Œæ‚¨å¯ä»¥åœ¨æ‚¨çš„帳戶中啟用。
-這些å°å·¥å…·å¤šæ•¸éƒ½æ˜¯åŸºæ–¼JavaScript建造,如果è¦å•Ÿç”¨å®ƒå€‘,那麼ç€è¦½å™¨çš„JavaScript就需è¦å•Ÿç”¨å¾Œæ–¹å¯ä½¿ç”¨ã€‚
-è¦ç•™æ„的是這些å°å·¥å…·åœ¨é€™å€‹å好設定é é¢ä¸­æ˜¯æ²’有效果的。
+ 'gadgets-prefstext' => '以下列出å„種特殊å°å·¥å…·ï¼Œå¯åœ¨æ‚¨çš„帳戶中啟用之。å°å·¥å…·å¤šä½¿ç”¨äº†JavaScript,ç€è¦½å™¨å¿…須啟用JavaScriptæ‰èƒ½æ­£å¸¸é‹ä½œã€‚請注æ„å°å·¥å…·çš„效果ä¸æœƒä½œç”¨åœ¨é€™å€‹å好設定é ã€‚
-亦都åŒæ™‚ç•™æ„這些å°å·¥å…·çš„特殊é é¢ä¸æ˜¯MediaWiki軟體的一部份,通常都是由您本地的wiki中開發以åŠç¶­è­·ã€‚本地管ç†å“¡å¯ä»¥ç·¨è¼¯å¯ä¾›ä½¿ç”¨çš„å°å·¥å…·çš„[[MediaWiki:Gadgets-definition|定義]]以åŠ[[Special:Gadgets|æè¿°]]。',
+åŒæ™‚也請注æ„,這些特殊å°å·¥å…·ä¸¦éžMediaWiki軟體的一部份,通常是由本地wiki的使用者開發與維護。本地管ç†å“¡å¯ä»¥ç·¨è¼¯å°å·¥å…·çš„[[MediaWiki:Gadgets-definition|定義]]與[[Special:Gadgets|æè¿°]]。',
'gadgets' => 'å°å·¥å…·',
'gadgets-title' => 'å°å·¥å…·',
'gadgets-pagetext' => '以下是一個按照 [[MediaWiki:Gadgets-definition]] 的定義特殊å°å·¥å…·æ¸…單,用戶å¯ä»¥åœ¨å®ƒå€‘çš„[[Special:Preferences#mw-prefsection-gadgets|å好設定é é¢]]中啟用它們。
diff --git a/extensions/Gadgets/Gadgets.php b/extensions/Gadgets/Gadgets.php
index 25c22afd..59b0af69 100644
--- a/extensions/Gadgets/Gadgets.php
+++ b/extensions/Gadgets/Gadgets.php
@@ -33,7 +33,7 @@ $wgHooks['BeforePageDisplay'][] = 'GadgetHooks::beforePageDisplay';
$wgHooks['UserGetDefaultOptions'][] = 'GadgetHooks::userGetDefaultOptions';
$wgHooks['GetPreferences'][] = 'GadgetHooks::getPreferences';
$wgHooks['ResourceLoaderRegisterModules'][] = 'GadgetHooks::registerModules';
-$wgHooks['UnitTestsList'][] = 'GadgetHooks::unitTestsList';
+$wgHooks['UnitTestsList'][] = 'GadgetHooks::onUnitTestsList';
$dir = dirname( __FILE__ ) . '/';
$wgExtensionMessagesFiles['Gadgets'] = $dir . 'Gadgets.i18n.php';
diff --git a/extensions/Gadgets/Gadgets_body.php b/extensions/Gadgets/Gadgets_body.php
index 330a1541..e787062a 100644
--- a/extensions/Gadgets/Gadgets_body.php
+++ b/extensions/Gadgets/Gadgets_body.php
@@ -182,17 +182,21 @@ class GadgetHooks {
}
}
- $lb->execute( __METHOD__ );
- $done = array();
+ // Allow other extensions, e.g. MobileFrontend, to disallow legacy gadgets
+ if ( wfRunHooks( 'Gadgets::allowLegacy', array( $out->getContext() ) ) ) {
+ $lb->execute( __METHOD__ );
- foreach ( $pages as $page ) {
- if ( isset( $done[$page] ) ) {
- continue;
- }
+ $done = array();
+
+ foreach ( $pages as $page ) {
+ if ( isset( $done[$page] ) ) {
+ continue;
+ }
- $done[$page] = true;
- self::applyScript( $page, $out );
+ $done[$page] = true;
+ self::applyScript( $page, $out );
+ }
}
wfProfileOut( __METHOD__ );
@@ -202,8 +206,8 @@ class GadgetHooks {
/**
* Adds one legacy script to output.
*
- * @param $page String: Unprefixed page title
- * @param $out OutputPage
+ * @param string $page Unprefixed page title
+ * @param OutputPage $out
*/
private static function applyScript( $page, $out ) {
global $wgJsMimeType;
@@ -227,12 +231,12 @@ class GadgetHooks {
/**
* UnitTestsList hook handler
- * @param $files Array: List of extension test files
+ * @param array $files
* @return bool
*/
- public static function unitTestsList( $files ) {
- $files[] = dirname( __FILE__ ) . '/Gadgets_tests.php';
-
+ public static function onUnitTestsList( array &$files ) {
+ $testDir = __DIR__ . '/tests/';
+ $files = array_merge( $files, glob( "$testDir/*Test.php" ) );
return true;
}
}
@@ -255,6 +259,7 @@ class Gadget {
$resourceLoaded = false,
$requiredRights = array(),
$requiredSkins = array(),
+ $targets = array( 'desktop' ),
$onByDefault = false,
$category;
@@ -302,6 +307,9 @@ class Gadget {
case 'default':
$gadget->onByDefault = true;
break;
+ case 'targets':
+ $gadget->targets = $params;
+ break;
}
}
@@ -455,7 +463,7 @@ class Gadget {
return null;
}
- return new GadgetResourceLoaderModule( $pages, $this->dependencies );
+ return new GadgetResourceLoaderModule( $pages, $this->dependencies, $this->targets );
}
/**
@@ -553,7 +561,7 @@ class Gadget {
* Loads list of gadgets and returns it as associative array of sections with gadgets
* e.g. array( 'sectionnname1' => array( $gadget1, $gadget2),
* 'sectionnname2' => array( $gadget3 ) );
- * @param $forceNewText String: New text of MediaWiki:gadgets-sdefinition. If specified, will
+ * @param $forceNewText String: New text of MediaWiki:gadgets-definition. If specified, will
* force a purge of cache and recreation of the gadget list.
* @return Mixed: Array or false
*/
@@ -587,7 +595,7 @@ class Gadget {
$g = $forceNewText;
}
- $g = preg_replace( '/<!--.*-->/s', '', $g );
+ $g = preg_replace( '/<!--.*?-->/s', '', $g );
$g = preg_split( '/(\r\n|\r|\n)+/', $g );
$gadgets = array();
@@ -624,17 +632,20 @@ class GadgetResourceLoaderModule extends ResourceLoaderWikiModule {
/**
* Creates an instance of this class
+ *
* @param $pages Array: Associative array of pages in ResourceLoaderWikiModule-compatible
* format, for example:
* array(
- * 'MediaWiki:Gadget-foo.js' => array( 'type' => 'script' ),
- * 'MediaWiki:Gadget-foo.css' => array( 'type' => 'style' ),
+ * 'MediaWiki:Gadget-foo.js' => array( 'type' => 'script' ),
+ * 'MediaWiki:Gadget-foo.css' => array( 'type' => 'style' ),
* )
* @param $dependencies Array: Names of resources this module depends on
+ * @param $targets Array: List of targets this module support
*/
- public function __construct( $pages, $dependencies ) {
+ public function __construct( $pages, $dependencies, $targets ) {
$this->pages = $pages;
$this->dependencies = $dependencies;
+ $this->targets = $targets;
}
/**
diff --git a/extensions/Gadgets/Gadgets_tests.php b/extensions/Gadgets/Gadgets_tests.php
deleted file mode 100644
index 2b1e6a70..00000000
--- a/extensions/Gadgets/Gadgets_tests.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-/**
- * @group Gadgets
- */
-
-class GadgetsTest extends PHPUnit_Framework_TestCase {
- private function create( $line ) {
- $g = Gadget::newFromDefinition( $line );
- // assertInstanceOf() is available since PHPUnit 3.5
- $this->assertEquals( 'Gadget', get_class( $g ) );
-
- return $g;
- }
-
- function testInvalidLines() {
- $this->assertFalse( Gadget::newFromDefinition( '' ) );
- $this->assertFalse( Gadget::newFromDefinition( '<foo|bar>' ) );
- }
-
- function testSimpleCases() {
- $g = $this->create( '* foo bar| foo.css|foo.js|foo.bar' );
- $this->assertEquals( 'foo_bar', $g->getName() );
- $this->assertEquals( 'ext.gadget.foo_bar', $g->getModuleName() );
- $this->assertEquals( array( 'Gadget-foo.js' ), $g->getScripts() );
- $this->assertEquals( array( 'Gadget-foo.css' ), $g->getStyles() );
- $this->assertEquals( array( 'Gadget-foo.js', 'Gadget-foo.css' ),
- $g->getScriptsAndStyles() );
- $this->assertEquals( array( 'Gadget-foo.js' ), $g->getLegacyScripts() );
- $this->assertFalse( $g->supportsResourceLoader() );
- $this->assertTrue( $g->hasModule() );
- }
-
- function testRLtag() {
- $g = $this->create( '*foo [ResourceLoader]|foo.js|foo.css' );
- $this->assertEquals( 'foo', $g->getName() );
- $this->assertTrue( $g->supportsResourceLoader() );
- $this->assertEquals( 0, count( $g->getLegacyScripts() ) );
- }
-
- function testDependencies() {
- $g = $this->create( '* foo[ResourceLoader|dependencies=jquery.ui]|bar.js' );
- $this->assertEquals( array( 'Gadget-bar.js' ), $g->getScripts() );
- $this->assertTrue( $g->supportsResourceLoader() );
- $this->assertEquals( array( 'jquery.ui' ), $g->getDependencies() );
- }
-
- function testPreferences() {
- global $wgUser, $wgOut, $wgTitle;
-
- // This test makes call to the parser which requires valids Outputpage
- // and Title objects. Set them up there, they will be released at the
- // end of the test.
- $old_wgOut = $wgOut;
- $old_wgTitle = $wgTitle;
- $wgTitle = Title::newFromText( 'Parser test for Gadgets extension' );
-
- // Proceed with test setup:
- $prefs = array();
- $context = new RequestContext();
- $wgOut = $context->getOutput();
- $wgOut->setTitle( Title::newFromText( 'test' ) );
-
- Gadget::loadStructuredList( '* foo | foo.js
-==keep-section1==
-* bar| bar.js
-==remove-section==
-* baz [rights=embezzle] |baz.js
-==keep-section2==
-* quux [rights=read] | quux.js' );
- $this->assertTrue( GadgetHooks::getPreferences( $wgUser, $prefs ), 'GetPrefences hook should return true' );
-
- $options = $prefs['gadgets']['options'];
- $this->assertFalse( isset( $options['&lt;gadget-section-remove-section&gt;'] ), 'Must not show empty sections' );
- $this->assertTrue( isset( $options['&lt;gadget-section-keep-section1&gt;'] ) );
- $this->assertTrue( isset( $options['&lt;gadget-section-keep-section2&gt;'] ) );
-
- // Restore globals
- $wgOut = $old_wgOut;
- $wgTitle = $old_wgTitle;
- }
-}
diff --git a/extensions/ImageMap/ImageMap.i18n.php b/extensions/ImageMap/ImageMap.i18n.php
new file mode 100644
index 00000000..f3a46a76
--- /dev/null
+++ b/extensions/ImageMap/ImageMap.i18n.php
@@ -0,0 +1,2122 @@
+<?php
+/**
+ * Internationalisation file for extension FindSpam.
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$messages = array();
+
+/** English
+ * @author Tim Starling
+ */
+$messages['en'] = array(
+ 'imagemap_desc' => 'Allows client-side clickable image maps using <code>&lt;imagemap&gt;</code> tag',
+ 'imagemap_no_image' => 'Error: Must specify an image in the first line.',
+ 'imagemap_invalid_image' => 'Error: Image is invalid or non-existent.',
+ 'imagemap_bad_image' => 'Error: Image is blacklisted on this page.',
+ 'imagemap_no_link' => 'Error: No valid link was found at the end of line $1.',
+ 'imagemap_invalid_title' => 'Error: Invalid title in link at line $1.',
+ 'imagemap_missing_coord' => 'Error: Not enough coordinates for shape at line $1.',
+ 'imagemap_unrecognised_shape' => 'Error: Unrecognized shape at line $1, each line must start with one of: <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>.',
+ 'imagemap_invalid_coord' => 'Error: Invalid coordinate at line $1, must be a number.',
+ 'imagemap_invalid_desc' => 'Error: Invalid desc specification, must be one of: <code>$1</code>.',
+ 'imagemap_description' => 'About this image',
+ # Note to translators: keep the same order
+ 'imagemap_desc_types' => 'top-right, bottom-right, bottom-left, top-left, none',
+ 'imagemap_poly_odd' => 'Error: Found poly with odd number of coordinates on line $1',
+);
+
+/** Message documentation (Message documentation)
+ * @author Kghbln
+ * @author Purodha
+ * @author Shirayuki
+ * @author The Evil IP address
+ * @author Umherirrender
+ */
+$messages['qqq'] = array(
+ 'imagemap_desc' => '{{desc|name=Image Map|url=http://www.mediawiki.org/wiki/Extension:ImageMap}}',
+ 'imagemap_no_image' => 'Used as error message.
+
+This message indicates that an image must be specified in the first line.',
+ 'imagemap_invalid_image' => 'Used as error message.',
+ 'imagemap_bad_image' => 'Used as error message.',
+ 'imagemap_no_link' => 'Used as error message. Parameters:
+* $1 - line number',
+ 'imagemap_invalid_title' => 'Used as error message. Parameters:
+* $1 - line number',
+ 'imagemap_missing_coord' => 'Used as error message. Parameters:
+* $1 - line number',
+ 'imagemap_unrecognised_shape' => '{{doc-important|Do not translate the parameters <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>.}}',
+ 'imagemap_invalid_coord' => 'Used as error message. Parameters:
+* $1 - line number',
+ 'imagemap_invalid_desc' => 'Used as error message. Parameters:
+* $1 - list of desc types',
+ 'imagemap_description' => 'Used as HTML <code>title=</code> attribute of <code><nowiki><a></nowiki></code> tag and as HTML <code>alt=</code> attribute of <code><nowiki><img></nowiki></code> tag.',
+ 'imagemap_desc_types' => '{{optional}}{{doc-important|Keep the same order.}}',
+ 'imagemap_poly_odd' => 'Used as error message. Parameters:
+* $1 - line number',
+);
+
+/** Afrikaans (Afrikaans)
+ * @author Naudefj
+ * @author SPQRobin
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['af'] = array(
+ 'imagemap_no_image' => "Fout: moet 'n beeld op die eerste lyn spesifiseer",
+ 'imagemap_invalid_image' => 'Fout: beeld is ongeldig of bestaan nie',
+ 'imagemap_bad_image' => 'Fout: beeld is op die swartlys vir hierdie bladsy',
+ 'imagemap_no_link' => 'Fout: geen geldige skakel was aan die einde van lyn $1 gevind nie',
+ 'imagemap_invalid_title' => 'Fout: ongeldige titel in skakel op lyn $1',
+ 'imagemap_missing_coord' => 'Fout: nie genoeg koördinate vir vorm op lyn $1',
+ 'imagemap_description' => 'Beeldinligting',
+);
+
+/** Aragonese (aragonés)
+ * @author Juanpabl
+ */
+$messages['an'] = array(
+ 'imagemap_desc' => "Premite mapas d'imachens punchables en o client fendo servir a etiqueta <code>&lt;imagemap&gt;</code>",
+ 'imagemap_no_image' => "Error: ha d'endicar una imachen a primer ringlera",
+ 'imagemap_invalid_image' => 'Error: a imachen no ye conforme u no existe',
+ 'imagemap_bad_image' => 'Error: a imachen ye en a lista negra ta ista pachina',
+ 'imagemap_no_link' => "Error: no s'ha trobato garra vinclo conforme a la fin d'a ringlera $1",
+ 'imagemap_invalid_title' => "Error: títol no conforme en o vinclo d'a ringlera $1",
+ 'imagemap_missing_coord' => "Error: No bi'n ha prous de coordinadas ta definir a forma en a ringlera $1",
+ 'imagemap_unrecognised_shape' => "Error: no s'ha reconoixito a forma en a ringlera $1, cada linia ha de prencipiar con una d'as siguients espresions: <code>default</code>, <code>rect</code>, <code>circle</code> u <code>poly</code>",
+ 'imagemap_invalid_coord' => "Error: coordinada no conforme en a ringlera $1, ha d'estar un numero",
+ 'imagemap_invalid_desc' => "Error: A descripción (desc) especificata no ye conforme, ha d'estar una de: <code>$1</code>",
+ 'imagemap_description' => 'Información sobre ista imachen',
+ 'imagemap_poly_odd' => "Error: s'ha trobato un polinomio con un numero impar de coordinadas en a linia $1",
+);
+
+/** Arabic (العربية)
+ * @author Meno25
+ * @author OsamaK
+ */
+$messages['ar'] = array(
+ 'imagemap_desc' => 'يسمح بخرائط صور قابلة للضغط عليها من طر٠العميل باستخدام وسم <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'خطأ: يجب تحديد صورة ÙÙŠ السطر الأول',
+ 'imagemap_invalid_image' => 'خطأ: الصورة غير صحيحة أو غير موجودة',
+ 'imagemap_bad_image' => 'خطأ: الصورة ÙÙŠ القائمة السوداء على هذه الصÙحة',
+ 'imagemap_no_link' => 'خطأ: لم يتم العثور على وصلة صحيحة ÙÙŠ نهاية السطر $1',
+ 'imagemap_invalid_title' => 'خطأ: عنوان غير صحيح ÙÙŠ الوصلة عند السطر $1',
+ 'imagemap_missing_coord' => 'خطأ: إحداثيات غير كاÙية للشكل عند السطر $1',
+ 'imagemap_unrecognised_shape' => 'خطأ: شكل غير معرو٠عند السطر $1، كل سطر يجب أن يبدأ بواحد من: <code>default</code>، <code>rect</code>، <code>circle</code> أو <code>poly</code>',
+ 'imagemap_invalid_coord' => 'خطأ: إحداثي غير صحيح عند السطر $1، يجب أن يكون رقما',
+ 'imagemap_invalid_desc' => 'خطأ: محدد وص٠غير صحيح، يجب أن يكون واحدا من: <code>$1</code>',
+ 'imagemap_description' => 'عن هذه الصورة',
+ 'imagemap_desc_types' => 'أعلى اليمين, أسÙÙ„ اليمين, أسÙÙ„ اليسار, أعلى اليسار, لا شيء',
+ 'imagemap_poly_odd' => 'خطأ: تم العثور على مضلع بعدد Ùردي من الأضلاع ÙÙŠ السطر $1',
+);
+
+/** Egyptian Spoken Arabic (مصرى)
+ * @author Meno25
+ * @author Ramsis II
+ */
+$messages['arz'] = array(
+ 'imagemap_desc' => 'بيسمح بخرايط صور قابلة للضغط عليها من طر٠العميل باستخدام تاج <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'غلط: لازم تحدد صورة ÙÙ‰ السطر الاولانى.',
+ 'imagemap_invalid_image' => 'غلط:الصورة مش صحيحة او مش موجودة',
+ 'imagemap_bad_image' => 'غلط: الصورة ÙÙ‰ البلاك ليست بتاعة الصÙحة دى',
+ 'imagemap_no_link' => '$1 غلط:Ù…Ùيش لينك شغالة ÙÙ‰ اخر السطر',
+ 'imagemap_invalid_title' => 'غلط:عنوان مش صحيح ÙÙ‰ اللينك عند السطر$1',
+ 'imagemap_missing_coord' => 'غلط: إحداثيات مش كاÙية للشكل عند السطر $1',
+ 'imagemap_unrecognised_shape' => 'غلط:شكل مش معرو٠عند السطر$1، كل سطر لازم يبتدى بواحد من دول: <code>default</code>, <code>rect</code>, <code>circle</code> او <code>poly</code>',
+ 'imagemap_invalid_coord' => 'غلط:احداثى مش صحيح عند السطر $1, لازم يكون رقم',
+ 'imagemap_invalid_desc' => 'غلط: محدد وص٠مش صحيح, لازم يكون واحد من دول: <code>$1</code>',
+ 'imagemap_description' => 'عن الصورة دي',
+ 'imagemap_desc_types' => 'اليمين من Ùوق،اليمين من تحت،الشمال من تحت،الشمال من Ùوق، ولا حاجة',
+ 'imagemap_poly_odd' => 'خطأ: تم العثور على مضلع بعدد Ùردى من الأضلاع ÙÙ‰ السطر $1',
+);
+
+/** Assamese (অসমীয়া)
+ * @author Bishnu Saikia
+ * @author Gitartha.bordoloi
+ */
+$messages['as'] = array(
+ 'imagemap_desc' => '<code>&lt;imagemap&gt;</code> টেগà§â€Œ বà§à¦¯à§±à¦¹à¦¾à§° কৰি কà§à¦²à¦¾à¦¯à¦¼à§‡à¦£à§à¦Ÿ-চাইড কà§à¦²à¦¿à¦•à§‡à¦¬à¦²à§â€Œ ইমেজà§â€Œ মেপৰ অনà§à¦®à¦¤à¦¿ দিয়ে',
+ 'imagemap_no_image' => 'তà§à§°à§à¦Ÿà§€: পà§à§°à¦¥à¦® শাৰীত à¦à¦–ন ছবি নিৰà§à¦¦à¦¿à¦·à§à¦Ÿ কৰিবই লাগিব',
+ 'imagemap_invalid_image' => 'তà§à§°à§à¦Ÿà§€: ছবিখন অবৈধ বা ছবিখন নাই',
+ 'imagemap_bad_image' => 'তà§à§°à§à¦Ÿà§€: à¦à¦‡ পৃষà§à¦ à¦¾à¦¤ ছবিখন বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿà§‡à¦¡ কৰা হৈছে',
+ 'imagemap_no_link' => "তà§à§°à§à¦Ÿà§€: $1 শাৰীৰ শেষত কোনো বৈধ লিংক পোৱা নগ'ল",
+ 'imagemap_invalid_title' => 'তà§à§°à§à¦Ÿà§€: $1 শাৰীত থকা লিংকৰ শিৰোনাম অবৈধ',
+ 'imagemap_missing_coord' => 'তà§à§°à§à¦Ÿà§€: $1 শাৰীত আকৃতিৰ বাবে যথেষà§à¦Ÿ সà§à¦¥à¦¾à¦¨à¦¾à¦‚ক নাই',
+ 'imagemap_unrecognised_shape' => "তà§à§°à§à¦Ÿà§€: $1 শাৰীত অজà§à¦žà¦¾à¦¤ আকৃতি আছে, পà§à§°à¦¤à¦¿à¦Ÿà§‹ শাৰী à¦à¦‡à¦•à§‡à¦‡à¦Ÿà¦¾à§° à¦à¦Ÿà¦¾à§°à§‡ আৰমà§à¦­ হ'ব লাগিব: <code>default</code>, <code>rect</code>, <code>circle</code> বা <code>poly</code>",
+ 'imagemap_invalid_coord' => "তà§à§°à§à¦Ÿà§€: $1 শাৰীত থকা সà§à¦¥à¦¾à¦¨à¦¾à¦‚ক অবৈধ, ই à¦à¦Ÿà¦¾ সংখà§à¦¯à¦¾ হ'বই লাগিব",
+ 'imagemap_invalid_desc' => "তà§à§°à§à¦Ÿà§€: অবৈধ desc বিৱৰণ, ই ইয়াৰে à¦à¦Ÿà¦¾ হ'ব লাগিব: <code>$1</code>",
+ 'imagemap_description' => 'à¦à¦‡ ছবিখনৰ বিষয়ে',
+ 'imagemap_poly_odd' => 'তà§à§°à§à¦Ÿà§€: $1 শাৰীত অযৌগ সà§à¦¥à¦¾à¦¨à¦¾à¦‚ক সংখà§à¦¯à¦¾à§°à§‡ poly পোৱা গৈছে',
+);
+
+/** Asturian (asturianu)
+ * @author Esbardu
+ * @author Xuacu
+ */
+$messages['ast'] = array(
+ 'imagemap_desc' => "Permite nel llau del cliente los mapes d'imaxe que se puen calcar usando la etiqueta <code>&lt;imagemap&gt;</code>",
+ 'imagemap_no_image' => 'Error: ha especificase una imaxe na primer llinia',
+ 'imagemap_invalid_image' => 'Error: la imaxe nun ye válida o nun esiste',
+ 'imagemap_bad_image' => "Error: La imaxe ta na llista prieta d'esta páxina",
+ 'imagemap_no_link' => 'Error: atopóse un enllaz non válidu a lo cabero la llinia $1',
+ 'imagemap_invalid_title' => 'Error: títulu non válidu nel enllaz de la llinia $1',
+ 'imagemap_missing_coord' => 'Error: nun hai abondes coordenaes pa formar la figura de la llinia $1',
+ 'imagemap_unrecognised_shape' => "Error: figura non reconocida na llinia $1, cada llinia ha empecipiar con dalguna d'estes: <code>default</code>, <code>rect</code>, <code>circle</code> o <code>poly</code>.",
+ 'imagemap_invalid_coord' => 'Error: coordenada non válida en llinia $1, ha ser un númberu',
+ 'imagemap_invalid_desc' => "Error: parámetru 'desc' non válidu, ha ser ún d'estos: <code>$1</code>",
+ 'imagemap_description' => 'Tocante a esta imaxe',
+ 'imagemap_poly_odd' => 'Error: atopóse un polígonu con un númberu impar de coordenaes na llinia $1',
+);
+
+/** Azerbaijani (azərbaycanca)
+ * @author Vago
+ */
+$messages['az'] = array(
+ 'imagemap_desc_types' => 'yuxarı-sağ, aşağı-sağ, aşağı-sol, yuxarı-sol, heç nə',
+);
+
+/** South Azerbaijani (تورکجه)
+ * @author Amir a57
+ */
+$messages['azb'] = array(
+ 'imagemap_description' => 'شکیله گوره',
+);
+
+/** Bashkir (башҡортÑа)
+ * @author Assele
+ */
+$messages['ba'] = array(
+ 'imagemap_desc' => '<code>&lt;imagemap&gt;</code> билдәһе Ñрҙамында килент Ñғында баҫмалы Ñ€Ó™Ñемдәр картаһын күрһатеү мөмкинлеген бирә',
+ 'imagemap_no_image' => 'Хата: беренÑе юлда Ñ€Ó™Ñем билдәләнгән булырға тейеш',
+ 'imagemap_invalid_image' => 'Хата: Ñ€Ó™Ñем дөрөҫ түгел йәки ÑŽÒ¡',
+ 'imagemap_bad_image' => 'Хата: Ñ€Ó™Ñем был биттә ҡара иÑемлеккә керә',
+ 'imagemap_no_link' => 'Хата: $1 юлының аҙағында һылтанма дөрөҫ түгел',
+ 'imagemap_invalid_title' => 'Хата: $1 юлында һылтанманың иÑеме дөрөҫ түгел',
+ 'imagemap_missing_coord' => 'Хата: $1 юлында фигура Ó©Ñөн координаталар етмәй',
+ 'imagemap_unrecognised_shape' => 'Хата: $1 юлында танылмаған фигура, һәр юл <code>default</code>, <code>rect</code>, <code>circle</code> йәки <code>poly</code> аÑÒ¡Ñ‹Ñ Ò»Ò¯Ò™Ò™Ó™Ñ€ÐµÐ½ÐµÒ£ береһе менән башланырға тейеш',
+ 'imagemap_invalid_coord' => 'Хата: $1 юлында координата дөрөҫ түгел, һан булырға тейеш',
+ 'imagemap_invalid_desc' => 'Хата: desc дөрөҫ күрһәтелмәгән, түбәндәгеләрҙең береһе булырға тейеш: <code>$1</code>',
+ 'imagemap_description' => 'РәÑем тураһында',
+ 'imagemap_poly_odd' => 'Хата: $1 юлындағы күпмөйөштөң координаталар һаны — таҡ һан',
+);
+
+/** Southern Balochi (بلوچی مکرانی)
+ * @author Mostafadaneshvar
+ */
+$messages['bcc'] = array(
+ 'imagemap_desc' => 'اجازت دن استÙاده Ú†Ù‡ برچسپ<code>&lt;imagemap&gt;</code>نقشه یان تصاویر کلیکی کاربر-جهت',
+ 'imagemap_no_image' => '&lt;imagemap&gt;: بایدن یک تصویری ته خط اول مشخص کنیت', # Fuzzy
+ 'imagemap_invalid_image' => '&lt;imagemap&gt;: عکس نامعتبر یا موجود نهنت', # Fuzzy
+ 'imagemap_no_link' => '&lt;imagemap&gt;: هچ معتبرین لینکی ته آهر خط$1پیداگ نه بوت', # Fuzzy
+ 'imagemap_invalid_title' => '&lt;imagemap&gt;: نامعتبراین عنوان ته لینک ته خط $1', # Fuzzy
+ 'imagemap_missing_coord' => '&lt;imagemap&gt;: کاÙÛŒ ان هماهنگی په Ø´Ú©Ù„ نیست ته خط $1', # Fuzzy
+ 'imagemap_unrecognised_shape' => '&lt;imagemap&gt;: ناشناسین Ø´Ú©Ù„ ته خط $1ØŒ هر خط بایدن گون یکی Ú†Ù‡ شان شروه بیت:پیشÙرض،مربع, گردیم یا باز', # Fuzzy
+ 'imagemap_invalid_coord' => '&lt;imagemap&gt;: نامعتبراین هماهنگی ته خطا $1, بایدن یک شماره بیت', # Fuzzy
+ 'imagemap_invalid_desc' => '&lt;imagemap&gt;: نامعتبراین مشخصه ای توضیح، بایدن یکی چه شان بیت: <code>$1</code>', # Fuzzy
+ 'imagemap_description' => 'ای عکسء باره',
+);
+
+/** Bikol Central (Bikol Central)
+ * @author Filipinayzd
+ */
+$messages['bcl'] = array(
+ 'imagemap_description' => 'Manónongod sa retratong ini',
+);
+
+/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
+ * @author EugeneZelenko
+ * @author Jim-by
+ * @author Red Winged Duck
+ */
+$messages['be-tarask'] = array(
+ 'imagemap_desc' => 'ДазвалÑе ÑтварÑньне на Ñтаронцы кліента мапаў выÑвы з выкарыÑтаньнем Ñ‚Ñгу <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Памылка: у першым радку муÑіць быць Ð¿Ð°Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ Ð²Ñ‹Ñва',
+ 'imagemap_invalid_image' => 'Памылка: нÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð²Ñ‹Ñва альбо Ñна не Ñ–Ñнуе',
+ 'imagemap_bad_image' => 'Памылка: выÑва на гÑтай Ñтаронцы ўваходзіць у чорны ÑьпіÑ',
+ 'imagemap_no_link' => 'Памылка: Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð°Ñ ÑÐ»ÑƒÑˆÐ½Ð°Ñ ÑпаÑылка Ñž канцы радку $1',
+ 'imagemap_invalid_title' => 'Памылка: нÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð° Ñž ÑпаÑылцы Ñž радку $1',
+ 'imagemap_missing_coord' => 'Памылка: недаÑтаткова каардынатаў Ð´Ð»Ñ Ñ„Ñ–Ð³ÑƒÑ€Ñ‹ Ñž радку $1',
+ 'imagemap_unrecognised_shape' => 'Памылка: нераÑÐ¿Ð°Ð·Ð½Ð°Ð½Ð°Ñ Ñ„Ñ–Ð³ÑƒÑ€Ð° Ñž радку $1, кожны радок павінен пачынацца з: <code>default</code>, <code>rect</code>, <code>circle</code> ці <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Памылка: нÑÐ¿Ñ€Ð°Ð²Ñ–Ð»ÑŒÐ½Ð°Ñ ÐºÐ°Ð°Ñ€Ð´Ñ‹Ð½Ð°Ñ‚Ð° Ñž радку $1, павінна быць лічба',
+ 'imagemap_invalid_desc' => 'Памылка: нÑÑлушнае значÑньне desc, павінна быць адно з: <code>$1</code>',
+ 'imagemap_description' => 'ÐпіÑаньне выÑвы',
+ 'imagemap_poly_odd' => 'Памылка: у радку $1 знойдзены шматкутнік зь нÑцотнай колькаÑьцю каардынатаў',
+);
+
+/** Bulgarian (българÑки)
+ * @author Spiritia
+ */
+$messages['bg'] = array(
+ 'imagemap_no_image' => 'Error: Ñ‚Ñ€Ñбва да Ñе укаже изображение на Ð¿ÑŠÑ€Ð²Ð¸Ñ Ñ€ÐµÐ´',
+ 'imagemap_invalid_image' => 'Error: невалидно или липÑващо изображение',
+ 'imagemap_bad_image' => 'Грешка: има забрана за включване на изображението в тази Ñтраница',
+ 'imagemap_no_link' => 'Error: липÑва валидна препратка в ÐºÑ€Ð°Ñ Ð½Ð° ред $1',
+ 'imagemap_invalid_title' => 'Error: невалидно заглавие в препратка на ред $1',
+ 'imagemap_missing_coord' => 'Error: недоÑтатъчно координати за фигура на ред $1',
+ 'imagemap_unrecognised_shape' => 'Error: неразпозната фигура на ред $1; вÑеки ред Ñ‚Ñ€Ñбва да Ñа започва Ñ Ð½Ñкое от Ñледните: <code>default</code> (по подразбиране), <code>rect</code> (правоъгълник), <code>circle</code> (кръг) или <code>poly</code> (многоъгълник)',
+ 'imagemap_invalid_coord' => 'Error: невалидна координата на ред $1, Ñ‚Ñ€Ñбва да бъде чиÑло',
+ 'imagemap_invalid_desc' => 'Грешка: невалидна ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð° опиÑанието (desc), което Ñ‚Ñ€Ñбва да бъде нÑкое от Ñледните: <code>$1</code>',
+ 'imagemap_description' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° изображението',
+ 'imagemap_poly_odd' => 'Грешка: открит е многоъгълник (poly) Ñ Ð½ÐµÑ‡ÐµÑ‚ÐµÐ½ брой координати на ред $1',
+);
+
+/** Banjar (Bahasa Banjar)
+ * @author Alamnirvana
+ */
+$messages['bjn'] = array(
+ 'imagemap_invalid_coord' => 'Nyunyuk: koordinat kada sah pada baris ka $1, musti barupa angka',
+);
+
+/** Bengali (বাংলা)
+ * @author Bellayet
+ */
+$messages['bn'] = array(
+ 'imagemap_no_image' => 'তà§à¦°à§à¦Ÿà¦¿:পà§à¦°à¦¥à¦® লাইনে অবশà§à¦¯à¦‡ à¦à¦•à¦Ÿà¦¿ চিতà§à¦° নিরà§à¦¦à¦¿à¦·à§à¦Ÿ করতে হবে',
+ 'imagemap_invalid_image' => 'তà§à¦°à§à¦Ÿà¦¿:চিতà§à¦°à¦Ÿà¦¿ সঠিক নয় অথবা চিতà§à¦°à¦Ÿà¦¿ নাই',
+ 'imagemap_bad_image' => 'তà§à¦°à§à¦Ÿà¦¿:à¦à¦‡ পাতায় ছবি কালতালিকাভà§à¦•à§à¦¤ করা হয়েছে',
+ 'imagemap_no_link' => 'তà§à¦°à§à¦Ÿà¦¿:লাইন নমà§à¦¬à¦° $1 ঠশেষ কোন সঠিক লিঙà§à¦• পাওয়া যায় নি',
+ 'imagemap_invalid_title' => 'তà§à¦°à§à¦Ÿà¦¿:লাইন নমà§à¦¬à¦° $1 ঠলিঙà§à¦•à§‡ সঠিক শিরোনাম নাই',
+ 'imagemap_missing_coord' => 'তà§à¦°à§à¦Ÿà¦¿:লাইন নমà§à¦¬à¦° $1 ঠআকারের জনà§à¦¯ যথেষà§à¦Ÿ সà§à¦¥à¦¾à¦¨à¦¾à¦‚ক নাই',
+ 'imagemap_invalid_coord' => 'তà§à¦°à§à¦Ÿà¦¿:লাইন নমà§à¦¬à¦° $1 ঠসà§à¦¥à¦¾à¦¨à¦¾à¦‚ক সঠিক নয়, তা অবশà§à¦¯à¦‡ সংখà§à¦¯à¦¾ হবে',
+ 'imagemap_description' => 'à¦à¦‡ চিতà§à¦° সমà§à¦ªà¦°à§à¦•à§‡',
+);
+
+/** Tibetan (བོད་ཡིག)
+ * @author Freeyak
+ */
+$messages['bo'] = array(
+ 'imagemap_description' => 'བརྙན་རིས་འདིའི་སà¾à½¼à½¢à¼',
+);
+
+/** Breton (brezhoneg)
+ * @author Fulup
+ */
+$messages['br'] = array(
+ 'imagemap_desc' => "Aotren a ra ar c'hartennoù skeudennoù arval klikadus, a-drugarez d'ar valizenn <code>&lt;imagemap&gt;</code>",
+ 'imagemap_no_image' => 'Error: rankout a rit spisaat ur skeudenn el linenn gentañ',
+ 'imagemap_invalid_image' => "Error : direizh eo ar skeudenn pe n'eus ket anezhi",
+ 'imagemap_bad_image' => 'Fazi : emañ ar skeudenn war al listenn zu evit ar bajenn-mañ',
+ 'imagemap_no_link' => "Error: n'eus bet kavet liamm reizh ebet e dibenn al linenn $1",
+ 'imagemap_invalid_title' => 'Error: titl direizh el liamm el linenn $1',
+ 'imagemap_missing_coord' => 'Error: diouer a zaveennoù zo evit stumm al linenn $1',
+ 'imagemap_unrecognised_shape' => 'Fazi : Furm dianav el linenn $1, rankout a ra pep linenn kregiñ gant unan eus ar gerioù-mañ : <code>default</code>, <code>rect</code>, <code>circle</code> pe <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Fazi : daveenn fall el linenn $1, ret eo e vije un niver',
+ 'imagemap_invalid_desc' => 'Fazi : arventenn desc direizh; setu an arventennoù aotreet : <code>$1</code>',
+ 'imagemap_description' => 'Diwar-benn ar skeudenn-mañ',
+ 'imagemap_poly_odd' => 'Fazi : kavet ez eus ul lieskorn dezhañ un niver daveennoù ampar el linenn $1',
+);
+
+/** Bosnian (bosanski)
+ * @author CERminator
+ */
+$messages['bs'] = array(
+ 'imagemap_desc' => 'Omogućuje mape slika na klijentskom raÄunaru koje se mogu kliknuti koristeći oznaku <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Greška: morate odrediti sliku u prvom redu',
+ 'imagemap_invalid_image' => 'Greška: slika je nevaljana ili ne postoji',
+ 'imagemap_bad_image' => 'Greška: slika je nepoželjna na ovoj stranici',
+ 'imagemap_no_link' => 'Greška: nije pronađen valjan link na kraju reda $1',
+ 'imagemap_invalid_title' => 'Greška: nevaljan naslov u linku u redu $1',
+ 'imagemap_missing_coord' => 'Greška: nema dovoljno koordinata za iscrtavanje u redu $1',
+ 'imagemap_unrecognised_shape' => 'GreÅ¡ka: neprepoznat oblik u redu $1, svaki red mora poÄinjati sa jednim od: <code>default</code>, <code>rect</code>, <code>circle</code> ili <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Greška: nevaljane koordinate u redu $1, treba biti broj',
+ 'imagemap_invalid_desc' => 'Greška: nevaljana specifikacija opisa, mora biti jedan od: <code>$1</code>',
+ 'imagemap_description' => 'O ovoj slici',
+ 'imagemap_desc_types' => 'gore-desno, dolje-desno, dolje-lijevo, gore-lijevo, nema',
+ 'imagemap_poly_odd' => 'Greška: pronađen poly sa neparnim brojem koordinata u redu $1',
+);
+
+/** Catalan (català)
+ * @author SMP
+ * @author Toniher
+ */
+$messages['ca'] = array(
+ 'imagemap_desc' => "Permet mapes d'imatges clicables des del costat del client fent servir l'etiqueta <code>&lt;imagemap&gt;</code>",
+ 'imagemap_no_image' => 'Error: cal especificar una imatge en la primera línia',
+ 'imagemap_invalid_image' => 'Error: la imatge no es vàlida o no existeix',
+ 'imagemap_bad_image' => 'Error: la imatge està en la llista negra',
+ 'imagemap_no_link' => "Error: no s'ha trobat cap enllaç vàlid al final de la línia $1",
+ 'imagemap_invalid_title' => "Error: el títol no és vàlid a l'enllaç de la línia $1",
+ 'imagemap_missing_coord' => 'Error: no hi ha coordenades suficients per a la forma de la línia $1',
+ 'imagemap_unrecognised_shape' => 'Error: la forma de la línia $1 no és reconeixible, cada línia ha de començar amb una de les opcions següents: <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Error: la coordenada a la línia $1 no és vàlida, ha de ser un nombre',
+ 'imagemap_invalid_desc' => "Error: l'especificació de descripció no és vàlida, ha de ser una de: <code>$1</code>",
+ 'imagemap_description' => 'Quant a la imatge',
+ 'imagemap_poly_odd' => 'Error: poly amb un nombre senar de coordenades a la línia $1',
+);
+
+/** Chechen (нохчийн)
+ * @author Sasan700
+ */
+$messages['ce'] = array(
+ 'imagemap_invalid_image' => 'Гlалат: нийÑа дац йа ишта Ñурт дац кху чохь',
+);
+
+/** Corsican (corsu)
+ */
+$messages['co'] = array(
+ 'imagemap_description' => "À prupositu d'issa imagine",
+);
+
+/** Czech (Äesky)
+ * @author Li-sung
+ * @author Mormegil
+ */
+$messages['cs'] = array(
+ 'imagemap_desc' => 'Umožňuje vytvoÅ™ení klikací mapy obrázku na stranÄ› klienta pomocí znaÄky <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Error: na první řádce musí být urÄen obrázek',
+ 'imagemap_invalid_image' => 'Error: soubor není platný nebo neexistuje',
+ 'imagemap_bad_image' => 'Chyba: obrázek se nachází na Äerné listinÄ›',
+ 'imagemap_no_link' => 'Error: nebyl nalezen žádný platný odkaz na konci řádku $1',
+ 'imagemap_invalid_title' => 'Error: neplatný název v odkazu na řádku $1',
+ 'imagemap_missing_coord' => 'Error: chybějící souřadnice tvaru na řádku $1',
+ 'imagemap_unrecognised_shape' => 'Error: nerozpoznaný tvar na řádku $1, každá řádka musí zaÄínat definicí tvaru: <code>default</code>, <code>rect</code>, <code>circle</code> nebo <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Error: neplatné souÅ™adnice na řádku $1, je oÄekáváno Äíslo',
+ 'imagemap_invalid_desc' => 'Error: neplatné urÄení oblasti desc, je oÄekávána jedna z možností: <code>$1</code>',
+ 'imagemap_description' => 'O tomto obrázku',
+ 'imagemap_poly_odd' => 'Chyba: na řádku $1 nalezen mnohoúhelník s lichým poÄtem souÅ™adnic',
+);
+
+/** Welsh (Cymraeg)
+ * @author Lloffiwr
+ */
+$messages['cy'] = array(
+ 'imagemap_description' => "Ynglŷn â'r ddelwedd hon",
+);
+
+/** Danish (dansk)
+ * @author Byrial
+ * @author Peter Alberti
+ * @author Tjernobyl
+ */
+$messages['da'] = array(
+ 'imagemap_desc' => 'Muliggør klikbare billeder med brug af <code>&lt;imagemap&gt;</code>-tagget.',
+ 'imagemap_no_image' => 'Fejl: Der skal angives et billede i første linje',
+ 'imagemap_invalid_image' => 'Fejl: Billedet er ugyldigt eller findes ikke',
+ 'imagemap_bad_image' => 'Fejl: billedet er sortlistet på denne side',
+ 'imagemap_no_link' => 'Fejl: Fandt ikke en brugbar henvisning i slutningen af linje $1',
+ 'imagemap_invalid_title' => 'Fejl: Ugyldig titel i henvisning på linje $1',
+ 'imagemap_missing_coord' => 'Fejl: Ikke nok koordinater til omridset på linje $1',
+ 'imagemap_unrecognised_shape' => 'Fejl: Ukendt omridstype på linje $1. Alle linjer skal starte med enten <code>default</code>, <code>rect</code>, <code>circle</code> eller <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Fejl: Ugyldigt koordinat på linje $1, koordinater skal være tal',
+ 'imagemap_invalid_desc' => 'Fejl: Ugyldig specifikation af desc, skal være en af: <code>$1</code>',
+ 'imagemap_description' => 'Om dette billede',
+ 'imagemap_desc_types' => 'top-højre, bund-højre, bund-venstre, top-venstre, ingen',
+ 'imagemap_poly_odd' => 'Fejl: fandt polygon med et ulige antal koordinater på linje $1',
+);
+
+/** German (Deutsch)
+ * @author Kghbln
+ * @author LWChris
+ * @author Raimond Spekking
+ * @author Umherirrender
+ */
+$messages['de'] = array(
+ 'imagemap_desc' => 'Ergänzt das Tag <code>&lt;imagemap&gt;</code> zum Erstellen verweissensitiver Grafiken',
+ 'imagemap_no_image' => '&lt;imagemap&gt;-Fehler: In der ersten Zeile muss ein Bild angegeben werden',
+ 'imagemap_invalid_image' => '&lt;imagemap&gt;-Fehler: Bild ist ungültig oder nicht vorhanden',
+ 'imagemap_bad_image' => 'Fehler: Das Bild steht auf der Liste unerwünschter Bilder',
+ 'imagemap_no_link' => '&lt;imagemap&gt;-Fehler: Am Ende von Zeile $1 wurde kein gültiger Link gefunden',
+ 'imagemap_invalid_title' => '&lt;imagemap&gt;-Fehler: ungültiger Titel im Link in Zeile $1',
+ 'imagemap_missing_coord' => '&lt;imagemap&gt;-Fehler: Zu wenige Koordinaten in Zeile $1 für den Umriss',
+ 'imagemap_unrecognised_shape' => 'Fehler: Es befindet sich eine unbekannte Umrissform in Zeile $1. Jede Zeile muss mit einem der folgenden Parameter anfangen: <code>default</code>, <code>rect</code>, <code>circle</code> oder <code>poly</code>',
+ 'imagemap_invalid_coord' => '&lt;imagemap&gt;-Fehler: Ungültige Koordinate in Zeile $1: es sind nur Zahlen erlaubt',
+ 'imagemap_invalid_desc' => '&lt;imagemap&gt;-Fehler: Ungültiger „desc“-Parameter, möglich sind: <code>$1</code>',
+ 'imagemap_description' => 'Ãœber dieses Bild',
+ 'imagemap_desc_types' => 'oben rechts, unten rechts, unten links, oben links, keine',
+ 'imagemap_poly_odd' => 'Fehler: Polygon mit ungerader Anzahl an Koordinaten in Zeile $1',
+);
+
+/** Zazaki (Zazaki)
+ * @author Aspar
+ * @author Mirzali
+ */
+$messages['diq'] = array(
+ 'imagemap_desc' => 'pê şuxulnayişê etiketê <code>&lt;imagemap&gt;</code>i destur dano gırewtox xeritayê resmi bıtıkın',
+ 'imagemap_no_image' => 'xeta: şıma gani satıro ewwil de yew resm nişan bıkeri',
+ 'imagemap_invalid_image' => 'xeta: resım ya çino ya zi meqbul niyo',
+ 'imagemap_bad_image' => 'xeta: no pel de resım biyo qereliste',
+ 'imagemap_no_link' => 'xeta: peyniyê satıro $1. de yew gıreyo meqbul çino.',
+ 'imagemap_invalid_title' => 'xeta:satıro $1. de gıre de sernameyo nemeqbul esto.',
+ 'imagemap_missing_coord' => 'xeta:satıro $1. de qey şekli koordinat tayê',
+ 'imagemap_unrecognised_shape' => 'Xeta: Rêza $1 de şeklo nênaskerde esto, her rêza gani be ninan ra yewe ra dest pêkero: <code>default</code>, <code>rect</code>, <code>circle</code> ya zi <code>poly</code>',
+ 'imagemap_invalid_coord' => 'xeta: satıro $1. de koordinato nemeqbul, gani yew amar bıbo',
+ 'imagemap_invalid_desc' => 'xeta: diyarikerdışê desci yo nemeqbul, gani ninan ra yew bıbo: <code>$1</code>',
+ 'imagemap_description' => 'Derheqê resmi de',
+ 'imagemap_poly_odd' => 'xeta: satıro $1. de poliyo ke wayirê yew koordinat diya',
+);
+
+/** Lower Sorbian (dolnoserbski)
+ * @author Michawiki
+ */
+$messages['dsb'] = array(
+ 'imagemap_desc' => 'Zmóžnja klikajobne wobraze wót boka klienta z pomocu toflicki <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Zmólka: musyš wobraz w prědnej zmužce pódaś',
+ 'imagemap_invalid_image' => 'Zmólka: wobraz jo njepłaśiwy abo njeeksistěrujo',
+ 'imagemap_bad_image' => 'Zmólka: wobraz stoj na cornej lisćinje',
+ 'imagemap_no_link' => 'Zmólka: žeden płaśiwy wótkaz na kóńcu smužki $1 namakany',
+ 'imagemap_invalid_title' => 'Zmólka: njepłaśiwy titel we wótkazu w smužce $1',
+ 'imagemap_missing_coord' => 'Zmólka: nic dosć koordinatow za formu w smužce $1',
+ 'imagemap_unrecognised_shape' => 'Zmólka: njespóznata forma w smužce $1, kužda smužka musy se z jadnym z toś tych parametrow zachopiś: <code>default</code>, <code>rect</code>, <code>circle</code> abo <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Zmólka: njepłaśiwa koordinata w smužce $1, musy to licba byś',
+ 'imagemap_invalid_desc' => 'Zmólka: njepłaśiwy parameter "desc", móžno su: <code>$1</code>',
+ 'imagemap_description' => 'Wó toś tom wobrazu',
+ 'imagemap_poly_odd' => 'Zmólka: polygon z njerowneju licbu koordinatow w smužce $1',
+);
+
+/** Greek (Ελληνικά)
+ * @author Consta
+ * @author Dead3y3
+ */
+$messages['el'] = array(
+ 'imagemap_desc' => 'ΕπιτÏέπει από την πλευÏά-του-πελάτη επιλέξιμους εικονοχάÏτες χÏησιμοποιώντας την ετικέτα <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Σφάλμα: Ï€Ïέπει να οÏίσετε μια εικόνα στην Ï€Ïώτη γÏαμμή',
+ 'imagemap_invalid_image' => 'Σφάλμα: η εικόνα είναι άκυÏη ή ανÏπαÏκτη',
+ 'imagemap_bad_image' => 'Σφάλμα: η εικόνα βÏίσκεται στη μαÏÏη λίστα σε αυτή τη σελίδα',
+ 'imagemap_no_link' => 'Σφάλμα: δεν βÏέθηκε κανένας έγκυÏος σÏνδεσμος στο τέλος της γÏαμμής $1',
+ 'imagemap_invalid_title' => 'Σφάλμα: άκυÏος τίτλος σε σÏνδεσμο στη γÏαμμή $1',
+ 'imagemap_missing_coord' => 'Σφάλμα: όχι αÏκετές συντεταγμένες για σχήμα στη γÏαμμή $1',
+ 'imagemap_unrecognised_shape' => 'Σφάλμα: μη αναγνωÏίσιμο σχήμα στη γÏαμμή $1, κάθε γÏαμμή Ï€Ïέπει να αÏχίζει με μία από τις λέξεις: <code>default</code>, <code>rect</code>, <code>circle</code> ή <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Σφάλμα: άκυÏη συντεταγμένη στη γÏαμμή $1, Ï€Ïέπει να είναι αÏιθμός',
+ 'imagemap_invalid_desc' => 'Σφάλμα: άκυÏος οÏισμός desc, Ï€Ïέπει να είναι ένας από τους: <code>$1</code>',
+ 'imagemap_description' => 'Σχετικά με αυτήν την εικόνα',
+ 'imagemap_poly_odd' => 'Σφάλμα: βÏέθηκε πολÏγωνο με πεÏιττό αÏιθμό συντεταγμένων στη γÏαμμή $1',
+);
+
+/** British English (British English)
+ * @author Shirayuki
+ */
+$messages['en-gb'] = array(
+ 'imagemap_unrecognised_shape' => 'Error: Unrecognised shape at line $1, each line must start with one of: <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>.',
+);
+
+/** Esperanto (Esperanto)
+ * @author Michawiki
+ * @author Yekrats
+ */
+$messages['eo'] = array(
+ 'imagemap_desc' => 'Permesas klientflankajn klakeblajn bildmapojn uzante etikedon <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Eraro: devas specifi bildon en la unua linio',
+ 'imagemap_invalid_image' => 'Eraro: bildo estas aÅ­ malvalida aÅ­ neekzista',
+ 'imagemap_bad_image' => 'Eraro: bildo estas nigralistigita en ĉi tiu paÄo',
+ 'imagemap_no_link' => 'Eraro: neniu valida ligilo estis trovita ĉe fino de linio $1',
+ 'imagemap_invalid_title' => 'Eraro: malvalida titolo en ligilo ĉe linio $1',
+ 'imagemap_missing_coord' => 'Eraro: mankas sufiĉaj koordinatoj por formo ĉe linio $1',
+ 'imagemap_unrecognised_shape' => 'Eraro: nekonata formo ĉe linio $1; ĉiu linio devas komenci kun unu el: <code>default</code>, <code>rect</code>, <code>circle</code> aŭ <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Eraro: Malvalida koordinato ĉe linio $1; Äi nepre estu nombro',
+ 'imagemap_invalid_desc' => 'Eraro: malvalida deklarado de desc, devas esti unu el: <code>$1</code>',
+ 'imagemap_description' => 'Pri ĉi tiu bildo',
+ 'imagemap_poly_odd' => 'Eraro: troviÄis poligono kun malpara nombro de koordinatoj en linio $1',
+);
+
+/** Spanish (español)
+ * @author Crazymadlover
+ * @author Drini
+ * @author Remember the dot
+ * @author Sanbec
+ */
+$messages['es'] = array(
+ 'imagemap_desc' => "Permite ''image-maps'' dinámicos usando la etiqueta <code>&lt;imagemap&gt;</code>",
+ 'imagemap_no_image' => 'Error: hay que especificar un imagen en la línea primera',
+ 'imagemap_invalid_image' => 'Error: la imagen no es válida o no existe',
+ 'imagemap_bad_image' => 'Error: la imagen esta en la lista negra en esta página',
+ 'imagemap_no_link' => 'Error: no se encontró ningún enlace válido al final de la línea $1',
+ 'imagemap_invalid_title' => 'Error: título no válido en un enlace de la linea $1',
+ 'imagemap_missing_coord' => 'Error: no hay bastante coordinates para la figura a la linea $1',
+ 'imagemap_unrecognised_shape' => 'Error: figura no reconocida a la linea $1, cada linea debe comenzar con uno de <code>default</code>, <code>rect</code>, <code>circle</code> o <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Error: hay una coordenada no válida en la línea $1, debe ser un número',
+ 'imagemap_invalid_desc' => 'Error: especificación de desc no válido, debe ser uno de: <code>$1</code>',
+ 'imagemap_description' => 'Acerca de esta imagen',
+ 'imagemap_poly_odd' => 'Error: se encontró un polígono con un número de coordinates impar en la linea $1',
+);
+
+/** Estonian (eesti)
+ * @author Avjoska
+ * @author Pikne
+ * @author Silvar
+ */
+$messages['et'] = array(
+ 'imagemap_desc' => 'Lubab kliendipoolse klõpsatava pildi ala, mis kasutab <code>&lt;imagemap&gt;</code>-silti.',
+ 'imagemap_no_image' => 'Tõrge: Esimesel real peab määrama pildi.',
+ 'imagemap_invalid_image' => 'Tõrge: Pilt on vigane või teda pole olemas.',
+ 'imagemap_bad_image' => 'Tõrge: Pilt on siin lehel mustas nimekirjas.',
+ 'imagemap_no_link' => 'Tõrge: Rea $1 lõpust ei leitud sobivat linki',
+ 'imagemap_invalid_title' => 'Tõrge: Real $1 lingis vigane pealkiri',
+ 'imagemap_missing_coord' => 'Tõrge: Real $1 pole kujundi jaoks piisavalt koordinaate',
+ 'imagemap_unrecognised_shape' => 'Tõrge: Real $1 on tundmatu kujund; rida peab algama ühega neist: <tt><code>default</code></tt>, <tt><code>rect</code></tt>, <tt><code>circle</code></tt> või <tt><code>poly</code></tt>.',
+ 'imagemap_invalid_coord' => 'Tõrge: Real $1 on vigane koordinaat; see peab olema number',
+ 'imagemap_invalid_desc' => 'Tõrge: Vigane "desc"-parameeter; peab olema üks järgmistest: <code>$1</code>',
+ 'imagemap_description' => 'Info pildi kohta',
+ 'imagemap_poly_odd' => 'Tõrge: Real $1 on polügoon paaritu arvu koordinaatidega.',
+);
+
+/** Basque (euskara)
+ * @author An13sa
+ * @author Kobazulo
+ */
+$messages['eu'] = array(
+ 'imagemap_no_image' => 'Errorea: lehen lerroan irudia zehaztu behar da',
+ 'imagemap_invalid_image' => 'Errorea: irudia baliogabea da edo ez da existitzen',
+ 'imagemap_invalid_coord' => 'Errorea: baliogabeko koordenatua $1. lerroan, zenbaki bat izan behar du',
+ 'imagemap_description' => 'Irudi honen inguruan',
+);
+
+/** Extremaduran (estremeñu)
+ * @author Better
+ */
+$messages['ext'] = array(
+ 'imagemap_description' => 'Al tentu esta imahin',
+);
+
+/** Persian (Ùارسی)
+ * @author Huji
+ * @author ZxxZxxZ
+ */
+$messages['fa'] = array(
+ 'imagemap_desc' => 'امکان ایجاد نقشه‌های تصویری قابل کلیک کردن در سمت کاربر را با استÙاده از برچسب <code>&lt;imagemap&gt;</code> Ùراهم می‌آورد',
+ 'imagemap_no_image' => '<imagemap>: باید در اولین سطر یک تصویر را مشخص کنید',
+ 'imagemap_invalid_image' => '<imagemap>: تصویر غیرمجاز است یا وجود ندارد',
+ 'imagemap_bad_image' => 'خطا: تصویر در این صÙحه در Ùهرست سیاه قرار دارد',
+ 'imagemap_no_link' => 'خطا: هیچ پیوند مجازی در انتهای خط $1 یاÙت نشد',
+ 'imagemap_invalid_title' => '<imagemap>: عنوان غیرمجاز در پیوند سطر $1',
+ 'imagemap_missing_coord' => '<imagemap>: تعداد مختصات در سطر $1 برای Ø´Ú©Ù„ کاÙÛŒ نیست',
+ 'imagemap_unrecognised_shape' => '<imagemap>: شکل ناشناخته در سطر $1، هر سطر باید با یکی از این دستورات آغاز شود: <code>default</code>، <code>rect</code>، <code>circle</code> یا <code>poly</code>',
+ 'imagemap_invalid_coord' => '<imagemap>: مختصات غیرمجاز در سطر $1، مختصات باید عدد باشد',
+ 'imagemap_invalid_desc' => '<imagemap>: توضیحات غیرمجاز، باید یکی از این موارد باشد: <code>$1</code>',
+ 'imagemap_description' => 'دربارهٔ این تصویر',
+ 'imagemap_poly_odd' => 'خطا: چند ضلعی با تعداد Ùرعی از مختصات در سطر $1 پیدا شد',
+);
+
+/** Finnish (suomi)
+ * @author Agony
+ * @author Nike
+ * @author Str4nd
+ * @author Tarmo
+ */
+$messages['fi'] = array(
+ 'imagemap_desc' => 'Mahdollistaa napsautettavien kuvakarttojen tekemisen <code>&lt;imagemap&gt;</code>-elementillä.',
+ 'imagemap_no_image' => 'Error: kuva pitää määritellä ensimmäisellä rivillä.',
+ 'imagemap_invalid_image' => 'Error: kuva ei kelpaa tai sitä ei ole olemassa',
+ 'imagemap_bad_image' => 'Virhe: Kuva kuuluu sivuston estolistalle',
+ 'imagemap_no_link' => 'Virhe: rivin $1 lopusta ei löytynyt kelvollista linkkiä',
+ 'imagemap_invalid_title' => 'Virhe: kelvoton otsikko linkissä rivillä $1',
+ 'imagemap_missing_coord' => 'Virhe: rivin $1 muodolle ei ole määritelty riittävästi koordinaatteja',
+ 'imagemap_unrecognised_shape' => 'Virhe: rivin $1 muotoa ei tunnistettu. Jokaisen rivin tulee alkaa jollakin seuraavista: <code>default</code>, <code>rect</code>, <code>circle</code> tai <code>poly</code>.',
+ 'imagemap_invalid_coord' => 'Error: kelpaamaton koordinaatti rivillä $1. Koordinaatin täytyy olla numero.',
+ 'imagemap_invalid_desc' => 'Virhe: virheellinen kohdemäärittely, kohdemäärittelyn tulee olla yksi seuraavista: <code>$1</code>',
+ 'imagemap_description' => 'Kuvan tiedot',
+ 'imagemap_poly_odd' => 'Virhe: löytyi polygoni, jossa pariton määrä koordinaatteja rivillä $1',
+);
+
+/** Faroese (føroyskt)
+ * @author EileenSanda
+ */
+$messages['fo'] = array(
+ 'imagemap_no_image' => 'Feilur: tú mást skriva eitt myndanavn á fyrstu linju',
+ 'imagemap_invalid_image' => 'Feilur: Myndin er ógyldug ella er ikki til',
+ 'imagemap_bad_image' => 'Feilur: Myndin er á svartalista á hesi síðu',
+ 'imagemap_no_link' => 'Feilur: ongin galdandi slóð var funnin fyri endan á linju $1',
+ 'imagemap_invalid_title' => 'Feilur: skeivt heiti á leinkjuni á linju $1',
+ 'imagemap_description' => 'Um hesa myndina',
+);
+
+/** French (français)
+ * @author Grondin
+ * @author Urhixidur
+ * @author Verdy p
+ */
+$messages['fr'] = array(
+ 'imagemap_desc' => 'Permet les cartes images clientes cliquables, grâce à la balise <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => '&lt;imagemap&gt; : vous devez spécifier une image dans la première ligne',
+ 'imagemap_invalid_image' => '&lt;imagemap&gt; : l’image est invalide ou n’existe pas',
+ 'imagemap_bad_image' => '&lt;imagemap&gt; : l’image est en liste noire sur cette page',
+ 'imagemap_no_link' => '&lt;imagemap&gt; : aucun lien valide n’a été trouvé à la fin de la ligne $1',
+ 'imagemap_invalid_title' => '&lt;imagemap&gt; : titre invalide dans le lien à la ligne $1',
+ 'imagemap_missing_coord' => '&lt;imagemap&gt; : pas assez de coordonnées pour la forme à la ligne $1',
+ 'imagemap_unrecognised_shape' => '&lt;imagemap&gt; : forme non reconnue à la ligne $1, chaque ligne doit débuter par un des mots suivants : <code>default</code>, <code>rect</code>, <code>circle</code> ou <code>poly</code>',
+ 'imagemap_invalid_coord' => '&lt;imagemap&gt; : coordonnée invalide à la ligne $1, doit être un nombre',
+ 'imagemap_invalid_desc' => '&lt;imagemap&gt; : paramètre « desc » invalide, les paramètres possibles sont : $1',
+ 'imagemap_description' => 'À propos de cette image',
+ 'imagemap_poly_odd' => 'Erreur : trouvé un polygone avec un nombre impair de coordonnées à la ligne $1',
+);
+
+/** Franco-Provençal (arpetan)
+ * @author ChrisPtDe
+ */
+$messages['frp'] = array(
+ 'imagemap_desc' => 'Pèrmèt les mapes émâges cliantes clicâbles, grâce a la balisa <code>&lt;imagemap&gt;</code>.',
+ 'imagemap_no_image' => 'Èrror : vos dête spècefiar una émâge dens la premiére legne',
+ 'imagemap_invalid_image' => 'Èrror : l’émâge est envalida ou ben ègziste pas',
+ 'imagemap_bad_image' => 'Èrror : l’émâge est en lista nêre sur ceta pâge',
+ 'imagemap_no_link' => 'Èrror : nion lim valido at étâ trovâ a la fin de la legne $1',
+ 'imagemap_invalid_title' => 'Èrror : titro envalido dens lo lim a la legne $1',
+ 'imagemap_missing_coord' => 'Èrror : pas prod de coordonâs por la fôrma a la legne $1',
+ 'imagemap_unrecognised_shape' => 'Èrror : fôrma pas recognua a la legne $1, châque legne dêt comenciér per yon de cetos mots : <code>default</code>, <code>rect</code>, <code>circle</code> ou ben <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Èrror : coordonâ envalida a la legne $1, dêt étre un nombro',
+ 'imagemap_invalid_desc' => 'Èrror : paramètre « dèsc » envalido, los paramètres possiblos sont : <code>$1</code>',
+ 'imagemap_description' => 'Sur ceta émâge',
+ 'imagemap_desc_types' => 'd’amont a drêta, d’avâl a drêta, d’avâl a gôche, d’amont a gôche, nion',
+ 'imagemap_poly_odd' => 'Èrror : trovâ un poligono avouéc un nombro mâl-par de coordonâs a la legne $1',
+);
+
+/** Galician (galego)
+ * @author Alma
+ * @author Toliño
+ * @author Xosé
+ */
+$messages['gl'] = array(
+ 'imagemap_desc' => 'Permite mapas de imaxe nos que se pode facer clic usando a etiqueta <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Erro: Cómpre especificar unha imaxe na primeira liña.',
+ 'imagemap_invalid_image' => 'Erro: A imaxe non é válida ou non existe.',
+ 'imagemap_bad_image' => 'Erro: A imaxe atópase na lista negra desta páxina.',
+ 'imagemap_no_link' => 'Erro: Non se atopou ningunha ligazón válida ao final da liña $1.',
+ 'imagemap_invalid_title' => 'Erro: Título incorrecto na ligazón da liña $1.',
+ 'imagemap_missing_coord' => 'Erro: Non abondan as coordenadas para a forma na liña $1.',
+ 'imagemap_unrecognised_shape' => 'Erro: Forma descoñecida na liña $1. Cada liña debe comezar con algunha das seguintes secuencias: <code>default</code>, <code>rect</code>, <code>circle</code> ou <code>poly</code>.',
+ 'imagemap_invalid_coord' => 'Erro: Coordenada non válida na liña $1; debe ser un número.',
+ 'imagemap_invalid_desc' => 'Erro: Especificación da descrición non válida. Os valores posibles son: <code>$1</code>.',
+ 'imagemap_description' => 'Acerca desta imaxe',
+ 'imagemap_desc_types' => 'arriba-dereita, abaixo-dereita, abaixo-esquerda, arriba-esquerda, ningunha',
+ 'imagemap_poly_odd' => 'Erro: Atopouse un polígono cun número impar de coordenadas na liña $1',
+);
+
+/** Ancient Greek (ἈÏχαία ἑλληνικὴ)
+ * @author Omnipaedista
+ */
+$messages['grc'] = array(
+ 'imagemap_description' => 'ΠεÏὶ τῆσδε τῆς εἰκόνος',
+);
+
+/** Swiss German (Alemannisch)
+ * @author Als-Chlämens
+ * @author Als-Holder
+ */
+$messages['gsw'] = array(
+ 'imagemap_desc' => "Macht s Aalege vu verwyys-sensitive Grafike ''(image maps)'' megli mit dr Hilf vu dr <code>&lt;imagemap&gt;</code>-Syntax",
+ 'imagemap_no_image' => 'Fähler: in dr erschte Zyylete muess e Bild aagee wäre',
+ 'imagemap_invalid_image' => 'Fähler: Bild ist nit giltig oder s git s nit',
+ 'imagemap_bad_image' => 'Fähler: S Bild stoht uf dr Lischt vu nit gwinschte Bilder',
+ 'imagemap_no_link' => 'Fähler: Am Änd vu Zyyle $1 isch kei giltige Link gfunde wore',
+ 'imagemap_invalid_title' => 'Fähler: uugiltiger Titel im Link in dr Zyyle $1',
+ 'imagemap_missing_coord' => 'Fähler: Z wenig Koordinate in dr Zyyle $1 fir dr Umriss',
+ 'imagemap_unrecognised_shape' => 'Fähler: Nit bekannti Umrissform in dr Zyyle $1. Jedi Zyyle muess mit eim vu däne Parameter aafange: <tt><code>default</code>, <code>rect</code>, <code>circle</code></tt> oder <tt><code>poly</code></tt>',
+ 'imagemap_invalid_coord' => 'Fähler: Uugiltigi Koordinate in dr Zyyle $1: s sin nume Zahle erlaubt',
+ 'imagemap_invalid_desc' => 'Fähler: Uugiltige „desc“-Parameter, megli sin: <code>$1</code>',
+ 'imagemap_description' => 'Iber des Bild',
+ 'imagemap_poly_odd' => 'Fähler: Polygon mit ere uugrade Anzahl vu Koordinate in dr Zyyle $1',
+);
+
+/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @author Dsvyas
+ * @author KartikMistry
+ * @author Sushant savla
+ */
+$messages['gu'] = array(
+ 'imagemap_desc' => 'વપરાશ કરà«àª¤àª¾ (કà«àª²àª¾àª¯àª‚ટ સાઈડ) પર <code>&lt;imagemap&gt;</code> ટેગ વાપરી કà«àª²à«€àª• કરી શકાય તેવા ચિતà«àª° નકà«àª¶àª¾àª¨à«€ પરવાનગી આપે છે.',
+ 'imagemap_no_image' => 'તà«àª°à«àªŸàª¿: પહેલી લીટીમાં ચિતà«àª°àª¨à«€ સà«àªªàª·à«àªŸàª¾àª¤àª¾ કરેલી હોવી જ જોઈàª',
+ 'imagemap_invalid_image' => 'તà«àª°à«àªŸà«€: ચિતà«àª° યાતો અવૈધ છે અથવાતો અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ નથી',
+ 'imagemap_bad_image' => 'તà«àª°à«àªŸà«€: આ પાના પર ચિતà«àª° પર પà«àª°àª¤àª¿àª¬àª‚ધ મà«àª•à«‡àª²à«‹ છે',
+ 'imagemap_no_link' => 'તà«àª°à«àªŸà«€ : $1મી હરોળ ના અંતે કોઈ પણ વૈધ કડી ન મળી',
+ 'imagemap_invalid_title' => 'તà«àª°à«àªŸà«€: $1 મી લાઈનમાં અયોગà«àª¯ શીરà«àª·àª•',
+ 'imagemap_missing_coord' => 'તà«àª°à«àªŸà«€: $1મી હરોળમાં પૂરતાં આકાર માટે અકà«àª·àª¾àª‚સ રેખાંશ ન મળà«àª¯àª¾àª‚',
+ 'imagemap_unrecognised_shape' => 'તà«àª°à«àªŸà«€: $1મી હરોળમાં અયોગà«àª¯ અકà«àª·àª°, દરેક હરોળ : <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code> થી શરૂ થવી જોઈàª.',
+ 'imagemap_invalid_coord' => 'કà«àª·àª¤àª¿: લીટી $1 પર અયોગà«àª¯ કો-ઓરà«àª¡àª¿àª¨à«‡àªŸ, સંખà«àª¯àª¾ જ હોવી જોઈàª.',
+ 'imagemap_invalid_desc' => 'Error: અયોગà«àª¯ વરà«àª£àª¨ વિગત, આમાંનà«àª‚ àªàª• હોવૠજોઈàª: <code>$1</code>',
+ 'imagemap_description' => 'આ ચિતà«àª° વિષે',
+ 'imagemap_poly_odd' => 'તà«àª°à«àªŸà«€: $1 મી હરોળમાં વિસંગત કà«àª°àª®àª¾àª‚કના નિરà«àª¦à«‡àª¶àª•à«‹ મળી આવà«àª¯àª¾àª‚',
+);
+
+/** Hebrew (עברית)
+ * @author Amire80
+ * @author Rotem Liss
+ */
+$messages['he'] = array(
+ 'imagemap_desc' => '×פשרות למפות תמונה ×¢× ×§×™×©×•×¨×™× ×‘×¦×“ הלקוח ב×מצעות התגית <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'שגי××”: יש לציין תמונה בשורה הר×שונה',
+ 'imagemap_invalid_image' => 'שגי××”: התמונה שגויה ×ו ש××™× ×” קיימת',
+ 'imagemap_bad_image' => 'שגי××”: התמונה ×סורה לשימוש בדף ×–×”',
+ 'imagemap_no_link' => 'שגי××”: ×œ× × ×ž×¦× ×§×™×©×•×¨ תקף בסוף שורה $1',
+ 'imagemap_invalid_title' => 'שגי××”: כותרת שגויה בקישור בשורה $1',
+ 'imagemap_missing_coord' => 'שגי××”: ×œ× ×ž×¡×¤×™×§ קו×רדינ×טות לצורה בשורה $1',
+ 'imagemap_unrecognised_shape' => 'שגי××”: צורה בלתי מזוהה בשורה $1, כל שורה חייבת להתחיל ×¢× ×חת ×”×פשרויות הב×ות: <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>',
+ 'imagemap_invalid_coord' => 'שגי××”;: קו×רדינ×טה שגויה בשורה $1, ×”×™× ×—×™×™×‘×ª להיות מספר',
+ 'imagemap_invalid_desc' => 'שגי××”: הגדרת פרמטר desc שגויה, צריך להיות ×חד מהב××™×: $1',
+ 'imagemap_description' => '×ודות התמונה',
+ 'imagemap_poly_odd' => 'שגי××”: ×יזור poly ×¢× ×ž×¡×¤×¨ ×י־זוגי של קו×ורדינטות בשורה $1',
+);
+
+/** Hindi (हिनà¥à¤¦à¥€)
+ * @author Ansumang
+ * @author Kaustubh
+ * @author Siddhartha Ghai
+ */
+$messages['hi'] = array(
+ 'imagemap_desc' => 'कà¥à¤²à¤¾à¤¯à¤‚टके चितà¥à¤°à¤¨à¤•à¥à¤¶à¥‡ <code>&lt;imagemap&gt;</code> टॅग देकर इसà¥à¤¤à¥‡à¤®à¤¾à¤² किये जा सकतें हैं',
+ 'imagemap_no_image' => 'Error: पहली कतारमें चितà¥à¤° देना जरूरी हैं',
+ 'imagemap_invalid_image' => 'Error: गलत या असà¥à¤¤à¤¿à¤¤à¥à¤µà¤®à¥‡à¤‚ ना होने वाला चितà¥à¤°',
+ 'imagemap_bad_image' => 'तà¥à¤°à¥à¤Ÿà¤¿: छबि को इस पृषà¥à¤  पे बà¥à¤²à¤¾à¤•à¤²à¤¿à¤¸à¥à¤Ÿ किया गया है',
+ 'imagemap_no_link' => 'Error: $1 कतार के आखिर में वैध कड़ी मिली नहीं',
+ 'imagemap_invalid_title' => 'Error: $1 कतारमें दिये कड़ीका अवैध शीरà¥à¤·à¤•',
+ 'imagemap_missing_coord' => 'Error: $1 कतारपर आकार के लिये जरूरी कोऑरà¥à¤¡à¤¿à¤¨à¥‡à¤Ÿà¥à¤¸ नहीं हैं',
+ 'imagemap_unrecognised_shape' => 'Error: $1 कतारमें गलत आकार, हर कतार: <code>default</code>, <code>rect</code>, <code>circle</code> अथवा <code>poly</code> से शà¥à¤°à¥‚ होनी चाहियें',
+ 'imagemap_invalid_coord' => 'Error: $1 कतार में गलत कोऑरà¥à¤¡à¤¿à¤¨à¥‡à¤Ÿà¥à¤¸, संखà¥à¤¯à¤¾ चाहिये',
+ 'imagemap_invalid_desc' => 'तà¥à¤°à¥à¤Ÿà¤¿: गलत जानकारी, इसमें से à¤à¤• होनी चाहिये: <code>$1</code>',
+ 'imagemap_description' => 'इस चितà¥à¤° के बारे में',
+);
+
+/** Croatian (hrvatski)
+ * @author Dalibor Bosits
+ * @author Roberta F.
+ * @author SpeedyGonsales
+ */
+$messages['hr'] = array(
+ 'imagemap_desc' => 'Omogućava strani klijenta klikabilne slike karata korištenjem <code>&lt;imagemap&gt;</code> oznake',
+ 'imagemap_no_image' => 'Error: morate navesti ime slike koju rabite u prvom retku',
+ 'imagemap_invalid_image' => 'Error: slika ne postoji ili je krivog tipa',
+ 'imagemap_bad_image' => 'Pogrješka: slika je na crnom popisu na ovoj stranici',
+ 'imagemap_no_link' => 'Error: nema (ispravne) poveznice na kraju retka $1',
+ 'imagemap_invalid_title' => 'Error: loš naziv u poveznici u retku $1',
+ 'imagemap_missing_coord' => 'Error: nedovoljan broj koordinata za oblik u retku $1',
+ 'imagemap_unrecognised_shape' => 'Error: oblik u retku $1 nije prepoznat, svaki redak mora poÄeti s jednim od oblika: <code>default</code>, <code>rect</code>, <code>circle</code> ili <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Error: nevaljane koordinate u retku $1, mora biti broj',
+ 'imagemap_invalid_desc' => 'Error: nevaljan opis, mora biti jedan od: <code>$1</code>',
+ 'imagemap_description' => "Ovo je slika/karta s poveznicama (''imagemap'')",
+ 'imagemap_poly_odd' => 'PogrjeÅ¡ka: pronaÄ‘en poly s neobiÄnim brojem koordinata u redu $1',
+);
+
+/** Upper Sorbian (hornjoserbsce)
+ * @author Michawiki
+ */
+$messages['hsb'] = array(
+ 'imagemap_desc' => 'Zmóžnja klikajomne wobrazowe mapy na klientowej stronje z pomocu tafliÄki <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => '&lt;imagemap&gt; zmylk: Dyrbiš w prěnjej lince wobraz podać',
+ 'imagemap_invalid_image' => '&lt;imagemap&gt; zmylk: Wobraz je njepłaćiwy abo njeeksistuje',
+ 'imagemap_bad_image' => 'Zmylk: wobraz na tutej stronje je na Äornej lisćinje',
+ 'imagemap_no_link' => '&lt;imagemap&gt; zmylk: Na kóncu linki $1 njebu płaćiwy wotkaz namakany',
+ 'imagemap_invalid_title' => '&lt;imagemap&gt; zmylk: njepłaćiwy titul we wotkazu w lince $1',
+ 'imagemap_missing_coord' => '&lt;imagemap&gt; zmylk: Přemało koordinatow w lince $1 za podobu',
+ 'imagemap_unrecognised_shape' => '&lt;imagemap&gt; zmylk: Njeznata podoba w lince $1, kóžda linka dyrbi so z jednym z tutych parametrow zapoÄeć: <tt><code>default</code>, <code>rect</code>, <code>circle</code></tt> abo <tt><code>poly</code></tt>',
+ 'imagemap_invalid_coord' => '&lt;imagemap&gt; zmylk: njepÅ‚aćiwa koordinata w lince $1: su jenož liÄby dowolene',
+ 'imagemap_invalid_desc' => '&lt;imagemap&gt; zmylk: Njepłaćiwy parameter "desc", móžne su: <code>$1</code>',
+ 'imagemap_description' => 'Wo tutym wobrazu',
+ 'imagemap_poly_odd' => 'Zmylk: polygon z njerunej liÄbu koordinatow na lince $1',
+);
+
+/** Hungarian (magyar)
+ * @author Dani
+ * @author KossuthRad
+ * @author Tgr
+ */
+$messages['hu'] = array(
+ 'imagemap_desc' => 'Lehetővé teszi kliensoldali imagemap-ek létrehozását a <code>&lt;imagemap&gt;</code> tag segítségével',
+ 'imagemap_no_image' => 'Error: kell egy előírt kép az első sorban',
+ 'imagemap_invalid_image' => 'Error: érvénytelen vagy nem létező kép',
+ 'imagemap_bad_image' => 'Hiba: a kép feketelistán van ezen az oldalon',
+ 'imagemap_no_link' => 'Error: nincs érvényes link a(z) $1. sor végén',
+ 'imagemap_invalid_title' => 'Hiba: érvénytelen cím a linkben, a(z) $1. sorban',
+ 'imagemap_missing_coord' => 'Error: nincs elég koordináta az alakításhoz a $1 sorban',
+ 'imagemap_unrecognised_shape' => 'Error: ismeretlen alakzat a(z) $1. sorban, mindegyiknek ezek valamelyikével kell kezdődnie: <code>default</code>, <code>rect</code>, <code>circle</code> vagy <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Hiba: érvénytelen koordináta a(z) $1. sorban, számnak kell lennie',
+ 'imagemap_invalid_desc' => 'Error: hibás desc leírás, ezek egyike kell: <code>$1</code>',
+ 'imagemap_description' => 'Kép leírása',
+ 'imagemap_poly_odd' => 'Hiba: az $1. sorban páratlan számú koordináta található',
+);
+
+/** Interlingua (interlingua)
+ * @author McDutchie
+ */
+$messages['ia'] = array(
+ 'imagemap_desc' => 'Permitte le mappas de imagines cliccabile al latere del cliente, usante le etiquetta <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Error: debe specificar un imagine in le prime linea',
+ 'imagemap_invalid_image' => 'Error: imagine es invalide o non existe',
+ 'imagemap_bad_image' => 'Error: le imagine es in le lista nigre de iste pagina',
+ 'imagemap_no_link' => 'Error: necun ligamine valide esseva trovate al fin del linea $1',
+ 'imagemap_invalid_title' => 'Error: titulo invalide in ligamine al linea $1',
+ 'imagemap_missing_coord' => 'Error: non bastante coordinatas pro le forma al linea $1',
+ 'imagemap_unrecognised_shape' => 'Error: forma non recognoscite al linea $1; cata linea debe comenciar con un del sequentes: <code>default</code>, <code>rect</code>, <code>circle</code>, <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Error: coordinata invalide al linea $1, debe esser un numero',
+ 'imagemap_invalid_desc' => 'Error: specification "desc" invalide, debe esser un del sequentes: <code>$1</code>',
+ 'imagemap_description' => 'A proposito de iste imagine',
+ 'imagemap_poly_odd' => 'Error: se trova un polygono con un numero impar de coordinatas in linea $1',
+);
+
+/** Indonesian (Bahasa Indonesia)
+ * @author IvanLanin
+ * @author Rex
+ */
+$messages['id'] = array(
+ 'imagemap_desc' => 'Menyediakan peta gambar yang dapat diklik dari klien dengan menggunakan tag <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => '&lt;imagemap&gt;: harus memberikan suatu gambar di baris pertama', # Fuzzy
+ 'imagemap_invalid_image' => '&lt;imagemap&gt;: gambar tidak sah atau tidak ditemukan', # Fuzzy
+ 'imagemap_bad_image' => 'Kesalahan: berkas tidak diperbolehkan pada halaman ini',
+ 'imagemap_no_link' => '&lt;imagemap&gt;: tidak ditemukan pranala yang sah di akhir baris ke $1', # Fuzzy
+ 'imagemap_invalid_title' => '&lt;imagemap&gt;: judul tidak sah pada pranala di baris ke $1', # Fuzzy
+ 'imagemap_missing_coord' => '&lt;imagemap&gt;: tidak cukup koordinat untuk bentuk pada baris ke $1', # Fuzzy
+ 'imagemap_unrecognised_shape' => '&lt;imagemap&gt;: bentuk tak dikenali pada baris ke $1, tiap baris harus dimulai dengan salah satu dari: <code>default</code>, <code>rect</code>, <code>circle</code> atau <code>poly</code>', # Fuzzy
+ 'imagemap_invalid_coord' => '&lt;imagemap&gt;: koordinat tidak sah pada baris ke $1, haruslah berupa angka', # Fuzzy
+ 'imagemap_invalid_desc' => '&lt;imagemap&gt;: spesifikasi desc tidak sah, harus salah satu dari: $1', # Fuzzy
+ 'imagemap_description' => 'Tentang gambar ini',
+ 'imagemap_poly_odd' => 'Kesalahan: terdapat poligon dengan nomor koordinat salah pada baris $1',
+);
+
+/** Iloko (Ilokano)
+ * @author Lam-ang
+ */
+$messages['ilo'] = array(
+ 'imagemap_desc' => 'Palubusan ti kliente-a bangir nga agpabalin ti agtakla kadagiti imahen ti mapa nga agusar ti <code>&lt;imagemap&gt;</code> nga etiketa',
+ 'imagemap_no_image' => 'Biddut: masapul nga inaganan ti imahen iti umuna a linia',
+ 'imagemap_invalid_image' => 'Biddut: ti imahen ket imbalido wenn awan',
+ 'imagemap_bad_image' => 'Biddut: ti imahen ket naiparit iti daytoy a panid',
+ 'imagemap_no_link' => 'Biddut: awan ti nabirukan nga umisu a panilpo idiay lippasan ti linia $1',
+ 'imagemap_invalid_title' => 'Biddut: imbalido a titulo iti panilpo idiay linia $1',
+ 'imagemap_missing_coord' => 'Biddut: awan ti umanay a nagsasabtan para iti tabas idiay linia $1',
+ 'imagemap_unrecognised_shape' => 'Biddut: saan a malasing a tabas idiay linia $1, tunggal maysa a linia ket masapul a mangrugi iti maysa nga: kinasigud, rektanggilo, nagtimbukel wenno <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Biddut: imbalido a nagsasabtan idiay linia $1, masapul a numero',
+ 'imagemap_invalid_desc' => 'Biddut: imbalido a nainaganan a panagipalpalawag, masapul a maysa iti: <code>$1</code>',
+ 'imagemap_description' => 'Maipanggep daytoy nga imahen',
+ 'imagemap_poly_odd' => 'Biddut: nabirukan ti poly nga addaan ti pangis a numero iti nagsasabtan idiay linia $1',
+);
+
+/** Ido (Ido)
+ * @author Malafaya
+ */
+$messages['io'] = array(
+ 'imagemap_description' => 'Pri ca imajo',
+);
+
+/** Icelandic (íslenska)
+ * @author Snævar
+ */
+$messages['is'] = array(
+ 'imagemap_no_image' => 'Villa: mynd verður að vera tilgreind í fyrstu línu',
+ 'imagemap_invalid_image' => 'Villa: mynd er ógild eða ekki til',
+ 'imagemap_bad_image' => 'Villa: myndin er bannlistuð á þessari síðu',
+ 'imagemap_no_link' => 'Villa: engin gildur tengill fannst við enda línu $1',
+ 'imagemap_invalid_title' => 'Villa: Ógildur titill í tengli í línu $1',
+ 'imagemap_missing_coord' => 'Villa: Ekki nógu mörg hnit fyrir þetta form í línu $1',
+ 'imagemap_unrecognised_shape' => 'Villa: Óþekkt form í línu $1, hver lína verður að byrja á <code>default</code>, <code>rect</code>, <code>circle</code> eða <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Villa: Ógilt hnit í línu $1, verður að vera tala',
+ 'imagemap_description' => 'Um þessa mynd',
+);
+
+/** Italian (italiano)
+ * @author Anyfile
+ * @author Beta16
+ * @author BrokenArrow
+ * @author Darth Kule
+ */
+$messages['it'] = array(
+ 'imagemap_desc' => "Consente di realizzare ''image map'' cliccabili lato client con il tag <code>&lt;imagemap&gt;</code>",
+ 'imagemap_no_image' => "Errore: si deve specificare un'immagine nella prima riga",
+ 'imagemap_invalid_image' => "Errore: l'immagine non è valida o non esiste",
+ 'imagemap_bad_image' => "Errore: l'immagine si trova nella blacklist per questa pagina",
+ 'imagemap_no_link' => 'Errore: non è stato trovato alcun collegamento valido alla fine della riga $1',
+ 'imagemap_invalid_title' => 'Errore: titolo del collegamento non valido alla riga $1',
+ 'imagemap_missing_coord' => 'Errore: non ci sono abbastanza coordinate per la forma specificata alla riga $1',
+ 'imagemap_unrecognised_shape' => 'Errore: forma specificata non riconosciuta alla riga $1, ogni riga deve iniziare con uno dei seguenti valori: <code>default</code>, <code>rect</code>, <code>circle</code> o <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Errore: coordinata non valida alla riga $1, deve essere un numero',
+ 'imagemap_invalid_desc' => 'Errore: valore non valido per il parametro desc, deve essere uno dei seguenti: $1',
+ 'imagemap_description' => "Informazioni sull'immagine",
+ 'imagemap_poly_odd' => 'Errore: trovato poligono con un numero dispari di coordinate nella riga $1',
+);
+
+/** Japanese (日本語)
+ * @author Aotake
+ * @author Fryed-peach
+ * @author JtFuruhata
+ * @author Kahusi
+ * @author Mizusumashi
+ * @author Shirayuki
+ */
+$messages['ja'] = array(
+ 'imagemap_desc' => '<code>&lt;imagemap&gt;</code>ã‚¿ã‚°ã«ã‚ˆã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚µã‚¤ãƒ‰ã®ã‚¯ãƒªãƒƒã‚«ãƒ–ルマップ機能を有効ã«ã™ã‚‹',
+ 'imagemap_no_image' => 'エラー: 最åˆã®è¡Œã§ç”»åƒã‚’指定ã—ã¦ãã ã•ã„。',
+ 'imagemap_invalid_image' => 'エラー: ç”»åƒãŒç„¡åŠ¹ã€ã¾ãŸã¯å­˜åœ¨ã—ã¾ã›ã‚“。',
+ 'imagemap_bad_image' => 'エラー: ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ç”»åƒãŒæŽ’除ã•ã‚Œã¦ã„ã¾ã™ã€‚',
+ 'imagemap_no_link' => 'エラー: $1 行目ã®æœ«å°¾ã«æœ‰åŠ¹ãªãƒªãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。',
+ 'imagemap_invalid_title' => 'エラー: $1 行目ã®ãƒªãƒ³ã‚¯ã®ã‚¿ã‚¤ãƒˆãƒ«ãŒç„¡åŠ¹ã§ã™ã€‚',
+ 'imagemap_missing_coord' => 'エラー: $1 行目ã®å›³å½¢ã®åº§æ¨™æŒ‡å®šãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚',
+ 'imagemap_unrecognised_shape' => 'エラー: $1 行目ã®å›³å½¢ã‚’èªè­˜ã§ãã¾ã›ã‚“。å„è¡Œã®å…ˆé ­ã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã«ã—ã¦ãã ã•ã„: <code>default</code>, <code>rect</code>, <code>circle</code>, <code>poly</code>',
+ 'imagemap_invalid_coord' => 'エラー: $1 行目ã®åº§æ¨™ãŒç„¡åŠ¹ã§ã™ã€‚数字を指定ã—ã¦ãã ã•ã„。',
+ 'imagemap_invalid_desc' => 'エラー: desc ã®æŒ‡å®šãŒç„¡åŠ¹ã§ã™ã€‚以下ã®ã„ãšã‚Œã‹ã‚’指定ã—ã¦ãã ã•ã„: <code>$1</code>',
+ 'imagemap_description' => 'ç”»åƒã®è©³ç´°',
+ 'imagemap_poly_odd' => 'エラー: $1 行目ã«ã€åº§æ¨™å€¤ãŒå¥‡æ•°å€‹ã® poly ãŒã‚ã‚Šã¾ã™ã€‚',
+);
+
+/** Javanese (Basa Jawa)
+ * @author Meursault2004
+ * @author Pras
+ */
+$messages['jv'] = array(
+ 'imagemap_desc' => 'Nyedyakaké péta gambar sing bisa diklik saka klièn mawa nganggo tag <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Error: kudu mènèhi sawijining gambar ing baris kapisan',
+ 'imagemap_invalid_image' => 'Error: gambar ora absah utawa ora ditemokaké',
+ 'imagemap_bad_image' => 'Kasalahan: berkas ora diidinaké ing kaca iki',
+ 'imagemap_no_link' => 'Kasalahan: ora ditemokaké pranala sing absah ing pungkasan baris kaping $1',
+ 'imagemap_invalid_title' => 'Error: irah-irahan ora absah ing pranala ing baris kaping $1',
+ 'imagemap_missing_coord' => 'Error: ora cukup koordinat kanggo wujud ing baris kaping $1',
+ 'imagemap_unrecognised_shape' => 'Error: wujud ora ditepungi ing baris kaping $1, saben baris kudu diwiwiti mawa salah siji saka: <code>default</code>, <code>rect</code>, <code>circle</code> utawa <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Error: koordinat ora absah ing baris kaping $1, kudu awujud angka',
+ 'imagemap_invalid_desc' => 'Error: spésifikasi desc ora absah, kudu salah siji saka: $1',
+ 'imagemap_description' => 'Prekara gambar iki',
+ 'imagemap_poly_odd' => 'Kasalahan: ana poligon kanthi nomer koordinat kliru ing larikan $1',
+);
+
+/** Georgian (ქáƒáƒ áƒ—ული)
+ * @author BRUTE
+ * @author David1010
+ * @author ITshnik
+ * @author Malafaya
+ * @author გიáƒáƒ áƒ’იმელáƒ
+ */
+$messages['ka'] = array(
+ 'imagemap_desc' => 'უფლებáƒáƒ¡ áƒáƒ«áƒšáƒ”ვს კლიენტის ინტერáƒáƒ¥áƒ¢áƒ˜áƒ£áƒš სურáƒáƒ—ის რუკებს გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡ <code>&lt;imagemap&gt;</code> ტეგები',
+ 'imagemap_no_image' => 'შეცდáƒáƒ›áƒ: პირველ ხáƒáƒ–ზე უნდრმიუთითáƒáƒ— სურáƒáƒ—ი',
+ 'imagemap_invalid_image' => 'შეცდáƒáƒ›áƒ: სურáƒáƒ—ი მცდáƒáƒ áƒ˜áƒ áƒáƒœ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს',
+ 'imagemap_bad_image' => 'შეცდáƒáƒ›áƒ: სურáƒáƒ—ი შáƒáƒ• სიáƒáƒ¨áƒ˜áƒ áƒáƒ› გვერდზე',
+ 'imagemap_no_link' => 'შეცდáƒáƒ›áƒ: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბმული $1 ხáƒáƒ–ის ბáƒáƒšáƒáƒ¡',
+ 'imagemap_invalid_title' => 'შეცდáƒáƒ›áƒ: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ—áƒáƒ£áƒ áƒ˜ ბმულში ხáƒáƒ–ზე $1',
+ 'imagemap_missing_coord' => 'შეცდáƒáƒ›áƒ: ხáƒáƒ– $1 áƒáƒ  áƒáƒ áƒ˜áƒ¡ სáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘ის კáƒáƒáƒ áƒ“ინáƒáƒ¢áƒ”ბი',
+ 'imagemap_unrecognised_shape' => 'შეცდáƒáƒ›áƒ: გáƒáƒ£áƒ áƒ™áƒ•áƒ”ველი ფიგურრხáƒáƒ– $1-ში, ყველრáƒáƒ®áƒáƒšáƒ˜ ხáƒáƒ–ი უნდრიწყებáƒáƒ“ეს ერთ-ერთი ძირითáƒáƒ“ი სიტყვით: <code>default</code>, <code>rect</code>, <code>circle</code> áƒáƒœ <code>poly</code>',
+ 'imagemap_invalid_coord' => 'შეცდáƒáƒ›áƒ:áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒáƒ áƒ“ინáƒáƒ¢áƒ˜ ხáƒáƒ– $1-ში, მáƒáƒšáƒáƒ“ინშირციფრი',
+ 'imagemap_invalid_desc' => 'შეცდáƒáƒ›áƒ: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რdesc, მáƒáƒšáƒáƒ“ინშირერთ-ერთი მნიშვნელáƒáƒ‘რ<code>$1</code>.',
+ 'imagemap_description' => 'áƒáƒ› სურáƒáƒ—ის შესáƒáƒ®áƒ”ბ',
+ 'imagemap_poly_odd' => 'შეცდáƒáƒ›áƒ: $1 ხáƒáƒ–ში áƒáƒ áƒ˜áƒ¡ შეცდáƒáƒ›áƒ˜áƒ— áƒáƒ¦áƒ¬áƒ”რილი მრáƒáƒ•áƒáƒšáƒ™áƒ£áƒ—ხედით ზედმეტი კáƒáƒ áƒ“ინáƒáƒ¢áƒ”ბით.',
+);
+
+/** Kazakh (Arabic script) (قازاقشا (تٴوتە)â€)
+ * @author AlefZet
+ */
+$messages['kk-arab'] = array(
+ 'imagemap_no_image' => '&lt;imagemap&gt;: بٸرٸنشٸ جولدا سۋرەتتٸ كٶرسەتۋ قاجەت', # Fuzzy
+ 'imagemap_invalid_image' => '&lt;imagemap&gt;: سۋرەت جارامسىز نەمەسە جوق', # Fuzzy
+ 'imagemap_no_link' => '&lt;imagemap&gt;: $1 جول اياعىندا جارامدى سٸلتەمە تابىلمادى', # Fuzzy
+ 'imagemap_invalid_title' => '&lt;imagemap&gt;: $1 جول اياعىنداعى سٸلتەمەدە جارامسىز اتاۋ', # Fuzzy
+ 'imagemap_missing_coord' => '&lt;imagemap&gt;: $1 جولداعى كەسكٸن ٷشٸن كوورديناتتار جەتٸكسٸز', # Fuzzy
+ 'imagemap_unrecognised_shape' => '&lt;imagemap&gt;: $1 جولداعى كەسكٸن جارامسىز, ٵربٸر جول مىنانىڭ بٸرەۋٸنەن باستالۋ قاجەت:', # Fuzzy
+ 'imagemap_invalid_coord' => '&lt;imagemap&gt;: $1 جولىندا جارامسىز كوورديناتا, سان بولۋى قاجەت', # Fuzzy
+ 'imagemap_invalid_desc' => '&lt;imagemap&gt;: جارامسىز سيپاتتاما ماماندانىمى, مىنانىڭ بٸرەۋٸ بولۋى قاجەت: $1', # Fuzzy
+ 'imagemap_description' => 'بۇل سۋرەت تۋرالى',
+);
+
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author AlefZet
+ */
+$messages['kk-cyrl'] = array(
+ 'imagemap_no_image' => '&lt;imagemap&gt;: бірінші жолда Ñуретті көрÑету қажет', # Fuzzy
+ 'imagemap_invalid_image' => '&lt;imagemap&gt;: Ñурет жарамÑыз немеÑе жоқ', # Fuzzy
+ 'imagemap_no_link' => '&lt;imagemap&gt;: $1 жол аÑғында жарамды Ñілтеме табылмады', # Fuzzy
+ 'imagemap_invalid_title' => '&lt;imagemap&gt;: $1 жол аÑғындағы Ñілтемеде жарамÑыз атау', # Fuzzy
+ 'imagemap_missing_coord' => '&lt;imagemap&gt;: $1 жолдағы кеÑкін үшін координаттар жетікÑіз', # Fuzzy
+ 'imagemap_unrecognised_shape' => '&lt;imagemap&gt;: $1 жолдағы кеÑкін жарамÑыз, әрбір жол мынаның біреуінен баÑталу қажет:', # Fuzzy
+ 'imagemap_invalid_coord' => '&lt;imagemap&gt;: $1 жолында жарамÑыз координата, Ñан болуы қажет', # Fuzzy
+ 'imagemap_invalid_desc' => '&lt;imagemap&gt;: жарамÑыз Ñипаттама маманданымы, мынаның біреуі болуы қажет: $1', # Fuzzy
+ 'imagemap_description' => 'Бұл Ñурет туралы',
+);
+
+/** Kazakh (Latin script) (qazaqşa (latın)‎)
+ * @author AlefZet
+ */
+$messages['kk-latn'] = array(
+ 'imagemap_no_image' => '&lt;imagemap&gt;: birinşi jolda swretti körsetw qajet', # Fuzzy
+ 'imagemap_invalid_image' => '&lt;imagemap&gt;: swret jaramsız nemese joq', # Fuzzy
+ 'imagemap_no_link' => '&lt;imagemap&gt;: $1 jol ayağında jaramdı silteme tabılmadı', # Fuzzy
+ 'imagemap_invalid_title' => '&lt;imagemap&gt;: $1 jol ayağındağı siltemede jaramsız ataw', # Fuzzy
+ 'imagemap_missing_coord' => '&lt;imagemap&gt;: $1 joldağı keskin üşin koordïnattar jetiksiz', # Fuzzy
+ 'imagemap_unrecognised_shape' => '&lt;imagemap&gt;: $1 joldağı keskin jaramsız, ärbir jol mınanıñ birewinen bastalw qajet:', # Fuzzy
+ 'imagemap_invalid_coord' => '&lt;imagemap&gt;: $1 jolında jaramsız koordïnata, san bolwı qajet', # Fuzzy
+ 'imagemap_invalid_desc' => '&lt;imagemap&gt;: jaramsız sïpattama mamandanımı, mınanıñ birewi bolwı qajet: $1', # Fuzzy
+ 'imagemap_description' => 'Bul swret twralı',
+);
+
+/** Khmer (ភាសាážáŸ’មែរ)
+ * @author Chhorran
+ * @author Lovekhmer
+ * @author Thearith
+ * @author ážœáŸážŽážáž¶ážšáž·áž‘្ធ
+ */
+$messages['km'] = array(
+ 'imagemap_no_image' => 'កំហុស៖ ážáŸ’រូវបញ្ជាក់​រូបភាពមួយនៅក្នុង​បន្ទាážáŸ‹áž‘ីមួយ​',
+ 'imagemap_invalid_image' => 'កំហុស៖ រូបភាព​មិនážáŸ’រឹមážáŸ’រូវ ឬមិនមាន​',
+ 'imagemap_bad_image' => 'កំហុស៖ រូបភាពážáŸ’រូវបានហាមឃាážáŸ‹áž€áŸ’នុងបញ្ជី​ážáŸ’មៅ​ លើ​ទំពáŸážšáž“áŸáŸ‡â€‹',
+ 'imagemap_invalid_title' => 'កំហុស:ចំណងជើងមិនážáŸ’រឹមážáŸ’រូវក្នុងážáŸ†ážŽáž—្ជាប់នៅបន្ទាážáŸ‹áž‘ី$1',
+ 'imagemap_description' => 'អំពីរូបភាពនáŸáŸ‡',
+);
+
+/** Korean (한국어)
+ * @author Klutzy
+ * @author Kwj2772
+ * @author Yknok29
+ */
+$messages['ko'] = array(
+ 'imagemap_desc' => '사용ìžê°€ ì´ë¯¸ì§€ë§µì„ 사용할 수 있ë„ë¡ <code>&lt;imagemap&gt;</code> 태그를 추가',
+ 'imagemap_no_image' => '오류: 첫 ì¤„ì— ê·¸ë¦¼ì´ ì œì‹œë˜ì–´ì•¼ 합니다.',
+ 'imagemap_invalid_image' => '오류: ê·¸ë¦¼ì´ ìž˜ëª»ë˜ì—ˆê±°ë‚˜ 존재하지 않습니다.',
+ 'imagemap_bad_image' => '오류: ì´ ê·¸ë¦¼ì€ ì´ ë¬¸ì„œì—ì„œ ì‚¬ìš©ì´ ê¸ˆì§€ë˜ì–´ 있습니다.',
+ 'imagemap_no_link' => '오류: $1번째 줄ì—ì„œ 유효한 ë§í¬ë¥¼ ì°¾ì„ ìˆ˜ 없습니다',
+ 'imagemap_invalid_title' => '오류: $1번째 ì¤„ì˜ ë§í¬ ì œëª©ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤',
+ 'imagemap_missing_coord' => '오류: $1ì¤„ì— ì •ì˜ëœ ë„í˜•ì˜ ì¢Œí‘œ ê°’ì´ ì¶©ë¶„í•˜ì§€ 않습니다.',
+ 'imagemap_unrecognised_shape' => '오류: $1줄ì—ì„œ ë„í˜•ì„ ì¸ì‹í•  수 ì—†ìŒ, ê° ì¤„ì€ ë‹¤ìŒìœ¼ë¡œ 시작해야 합니다: <code>default</code>, <code>rect</code>, <code>circle</code>, <code>poly</code>',
+ 'imagemap_invalid_coord' => '오류: $1번째 줄ì—ì„œ 좌표가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤. 좌표는 반드시 숫ìžì—¬ì•¼ 합니다.',
+ 'imagemap_invalid_desc' => '오류: ì§ˆëª»ëœ desc 설정. ë‹¤ìŒ ì¤‘ 하나가 ë˜ì–´ì•¼ 함: <code>$1</code>',
+ 'imagemap_description' => 'ì´ ê·¸ë¦¼ì— ëŒ€í•œ ì •ë³´',
+ 'imagemap_poly_odd' => '오류: $1번째 ì¤„ì— ì •ì˜ëœ 좌표 ê°’ì˜ ìˆ˜ê°€ 홀수 개입니다.',
+);
+
+/** Colognian (Ripoarisch)
+ * @author Purodha
+ */
+$messages['ksh'] = array(
+ 'imagemap_desc' => 'Brengk dä Befäähl <code>&lt;imagemap&gt;</code> en et Wiki, un med em Belldsche, wo mer op Anndeile fun klecke kann, wo dann Lengks henger lijje.',
+ 'imagemap_no_image' => 'Do es ene Fääler met <code>&lt;imagemap&gt;</code> opjefalle: En de eetzte Reih mööt e Beld shtonn.',
+ 'imagemap_invalid_image' => 'Do es ene Fääler met <code>&lt;imagemap&gt;</code> opjefalle: dat Beld jidd_et nit, odder dä Name es verkeeht',
+ 'imagemap_bad_image' => 'Do es ene Fääler met <code>&lt;imagemap&gt;</code> opjefalle: Dat Beld es op dä Sigg nit äloup.',
+ 'imagemap_no_link' => 'Do es ene Fääler met <code>&lt;imagemap&gt;</code> opjefalle: En de {{PLURAL:$1|eetzte|$1-te|nullte}} Reih eß am Engk keine Lengk jefonge woode.',
+ 'imagemap_invalid_title' => 'Do es ene Fääler met <code>&lt;imagemap&gt;</code> opjefalle: Dä Tittel em Lengk en de {{PLURAL:$1|eetzte|$1-te|nullte}} Reih eß verkeeht.',
+ 'imagemap_missing_coord' => "Do es ene Fääler met <code>&lt;imagemap&gt;</code> opjefalle: En dä {{PLURAL:$1|eetzte|$1-te|nullte}} Reih sin nit jenooch Ko'oddinate förr_ene komplätte Ömreß.",
+ 'imagemap_unrecognised_shape' => 'Do es ene Fääler met <code>&lt;imagemap&gt;</code> opjefalle: Dä Name förr_enne Ömreß en de {{PLURAL:$1|eetzte|$1-te|nullte}} Reih eß verkeeht. Et mööt „<tt><code>rect</code></tt>“, „<tt><code>circle</code></tt>“, „<tt><code>poly</code></tt>“, udder „<tt><code>default</code></tt>“ do shtonn.',
+ 'imagemap_invalid_coord' => "Do es ene Fääler met <code>&lt;imagemap&gt;</code> opjefalle: En de {{PLURAL:$1|eetzte|$1-te|nullte}} Reih eß jet verkeeht met de Ko'oddinate. Do mööte luuter Zahle shtonn, es äver nit esu.",
+ 'imagemap_invalid_desc' => 'Do es ene Fääler met <code>&lt;imagemap&gt;</code> opjefalle: Dä Parammeeter „<tt><nowiki>desc</nowiki></tt>“ eß verkeeht aanjejovve. Bruche kanns De nor ein fun dänne hee: <code>$1</code>',
+ 'imagemap_description' => 'Övver dat Beld heh',
+ 'imagemap_desc_types' => 'bovve räähß, unge räähß, unge lengkß, bovve lengkß, nix',
+ 'imagemap_poly_odd' => 'Do es ene Fääler met <imagemap> opjefalle: De Parammeeter för „poly“ möße Zahle-Päärche sin, ävver hee es ei Zahl zovill udder zowinnisch
+en dä Reih: $1.',
+);
+
+/** Kurdish (Latin script) (Kurdî (latînî)‎)
+ * @author George Animal
+ * @author Gomada
+ */
+$messages['ku-latn'] = array(
+ 'imagemap_description' => 'Derbarê vî wêneyî de',
+);
+
+/** Latin (Latina)
+ * @author SPQRobin
+ */
+$messages['la'] = array(
+ 'imagemap_description' => 'De hac imagine',
+);
+
+/** Luxembourgish (Lëtzebuergesch)
+ * @author Robby
+ */
+$messages['lb'] = array(
+ 'imagemap_desc' => 'Erlaabt et Biller ze benotzen déi een uklicke ka mat Hëllef vum Tag <code>&lt;imagemap&gt;</code>.',
+ 'imagemap_no_image' => 'Feeler: Dir musst an der éischter Linn e Bild uginn',
+ 'imagemap_invalid_image' => "Feeler: d'Bild ass ongëltig oder net do",
+ 'imagemap_bad_image' => "Feeler: D'Bild steet op der Lëscht vun den onerwënschte Biller",
+ 'imagemap_no_link' => 'Feeler: Um Enn vun der Zeil $1 gouf kee gëltege Link fonnt',
+ 'imagemap_invalid_title' => 'Feeler: ongëltigen Titel am Link an der Zeil $1',
+ 'imagemap_missing_coord' => 'Feeler: Ze wéineg Koordinaten an der Zeil $1 fir den Ëmress',
+ 'imagemap_unrecognised_shape' => 'Feeler: Onbekannte Form an der Zeil $1. All Zeile muss matt engem vun dëse Parameter ufänken: <tt><code>default</code>, <code>rect</code>, <code>circle</code></tt> oder <tt><code>poly</code></tt>',
+ 'imagemap_invalid_coord' => 'Feeler: Ongëlteg Koordinaten an der Zeil $1: et sinn nëmmen Zuelen erlaabt',
+ 'imagemap_invalid_desc' => 'Feeler: Ongëltegen „desc“-Parameter, méiglech sinn: <code>$1</code>',
+ 'imagemap_description' => 'Iwwert dëst Bild',
+ 'imagemap_desc_types' => 'uewe-riets, ënne-riets, ënne-lénks, uewe-lénks, keen',
+ 'imagemap_poly_odd' => 'Feeler: e Polygon mat enger ongerueder Zuel vu Koordinate gouf an der Linn $1 fonnt',
+);
+
+/** Limburgish (Limburgs)
+ * @author Aelske
+ * @author Matthias
+ * @author Ooswesthoesbes
+ */
+$messages['li'] = array(
+ 'imagemap_desc' => 'Maakt aanklikbare imagemaps meugelijk met de tag <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => "Error: geef 'n afbeelding op in de eerste regel",
+ 'imagemap_invalid_image' => 'Error: de afbeelding is corrupt of bestaat neet',
+ 'imagemap_bad_image' => 'Fout: de afbeelding steit op de zwarte lies voor deze pagina',
+ 'imagemap_no_link' => 'Error: er is geen geldige link aangetroffen aan het einde van regel $1',
+ 'imagemap_invalid_title' => 'Error: er staat een ongeldige titel in de verwijzing op regel $1',
+ 'imagemap_missing_coord' => 'Error: neet genoeg coördinaten veur vorm in regel $1',
+ 'imagemap_unrecognised_shape' => "Error: neet herkende vorm in regel $1, iedere regel mot beginne met éin van de commando's: <code>default</code>, <code>rect</code>, <code>circle</code> of <code>poly</code>",
+ 'imagemap_invalid_coord' => 'Error: ongeldige coördinaten in regel $1, moet een getal zien',
+ 'imagemap_invalid_desc' => 'Error: ongeldige beschrijvingsspecificatie, dit moet er één zijn uit de volgende lijst: $1',
+ 'imagemap_description' => 'Euver deze aafbeelding',
+ 'imagemap_poly_odd' => 'Fout: polygoon gevonje met een oneven aantal coördinate op regel $1',
+);
+
+/** Lithuanian (lietuvių)
+ * @author Garas
+ * @author Matasg
+ */
+$messages['lt'] = array(
+ 'imagemap_no_image' => 'Error: privalote nurodyti paveikslėlį pirmoje linijoje',
+ 'imagemap_invalid_image' => 'Error: blogas arba neegzistuojantis paveikslÄ—lis',
+ 'imagemap_no_link' => 'Error: nerasta tinkama nuoroda eilutÄ—s $1 pabaigoje',
+ 'imagemap_invalid_title' => 'Error: blogas pavadinimas nuorodoje $1 eilutÄ—je',
+ 'imagemap_missing_coord' => 'Error: nÄ—ra pakankamai koordinaÄių figÅ«rai $1 eilutÄ—je',
+ 'imagemap_unrecognised_shape' => 'Error: neatpažįstama figūra $1 eilutėje, kiekviena eilutė privalo prasidėti su vienu iš šių žodžių: <code>default</code>, <code>rect</code>, <code>circle</code> arba <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Error: netinkama koordinatÄ— $1 eilutÄ—je, privalo bÅ«ti skaiÄius',
+ 'imagemap_invalid_desc' => 'Error: bloga aprašymo specifikacija, privalo būti viena iš: <code>$1</code>',
+ 'imagemap_description' => 'Apie šį paveikslėlį',
+);
+
+/** Latvian (latviešu)
+ * @author Xil
+ */
+$messages['lv'] = array(
+ 'imagemap_no_image' => 'Kļūda: pirmajÄ rindiÅ†Ä jÄnorÄda attÄ“ls',
+ 'imagemap_invalid_image' => 'Kļūda: attÄ“ls nav derÄ«gs vai nepastÄv',
+ 'imagemap_no_link' => 'Kļūda: rindiņas $1 beigÄs netika atrasta derÄ«ga saite',
+ 'imagemap_description' => 'Par šo attēlu',
+);
+
+/** Macedonian (македонÑки)
+ * @author Bjankuloski06
+ */
+$messages['mk'] = array(
+ 'imagemap_desc' => 'Дава картографÑки Ñлики кои можат да Ñе кликаат од клиентот кориÑтејќи ја ознаката <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Грешка: мора да Ñе назначи Ñлика во првиот ред',
+ 'imagemap_invalid_image' => 'Грешка: Ñликата е неважечка или не поÑтои',
+ 'imagemap_bad_image' => 'Грешка: Ñликата е на црн ÑпиÑок за оваа Ñтраница',
+ 'imagemap_no_link' => 'Грешка: не беше пронајдена важечка врÑка на крајот на редот $1',
+ 'imagemap_invalid_title' => 'Грешка: погрешен наÑлов во врÑката на ред $1',
+ 'imagemap_missing_coord' => 'Грешка: нема доволно координати за обликот на ред $1',
+ 'imagemap_unrecognised_shape' => 'Грешка: непризнат ред $1, Ñекој ред мора да почне Ñо едно од: <code>default</code>, <code>rect</code>, <code>circle</code> или <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Грешка: погрешни координати на ред $1, мора да биде Ñо бројки',
+ 'imagemap_invalid_desc' => 'Грешка: неважечко напатÑтвие за опиÑ, мора да биде едно од: <code>$1</code>',
+ 'imagemap_description' => 'За Ñликава',
+ 'imagemap_desc_types' => 'најгоре-деÑно, најдолу-деÑно, најдолу-лево, најгоре-лево, нема',
+ 'imagemap_poly_odd' => 'Грешка: пронајден е многуаголник (poly) Ñо непарен број на координати во ред $1',
+);
+
+/** Malayalam (മലയാളം)
+ * @author Praveenp
+ * @author Shijualex
+ */
+$messages['ml'] = array(
+ 'imagemap_desc' => 'à´¸àµà´µàµ€à´•àµ¼à´¤àµà´¤à´¾à´µà´¿à´¨àµ à´šà´¿à´¤àµà´°à´¤àµà´¤à´¿à´²àµ† അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²àµà´•à´³à´¿àµ½ ഞെകàµà´•à´¿ ഗമികàµà´•à´¾à´µàµà´¨àµà´¨ സൗകരàµà´¯à´‚ <code>&lt;imagemap&gt;</code> à´±àµà´±à´¾à´—ൠഉപയോഗിചàµà´šàµ സാദàµà´§àµà´¯à´®à´¾à´•àµà´•àµà´¨àµà´¨àµ',
+ 'imagemap_no_image' => 'പിഴവàµ: à´’à´¨àµà´¨à´¾à´®à´¤àµà´¤àµ† വരിയിൽ ഒരൠചിതàµà´°à´¤àµà´¤à´¿à´¨àµà´±àµ† പേരൠവേണം',
+ 'imagemap_invalid_image' => 'പിഴവàµ: à´šà´¿à´¤àµà´°à´‚ അസാധàµà´µà´¾à´£àµâ€Œ à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ നിലവിലിലàµà´²',
+ 'imagemap_bad_image' => 'പിഴവàµ: à´ˆ താളിൽ à´šà´¿à´¤àµà´°à´‚ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿à´²à´¾à´£àµ',
+ 'imagemap_no_link' => 'പിഴവàµ: വരി $1-à´¨àµà´±àµ† അവസാനം സാധàµà´µà´¾à´¯ à´•à´£àµà´£à´¿ കാണàµà´¨àµà´¨à´¿à´²àµà´²',
+ 'imagemap_invalid_title' => 'പിഴവàµ: വരി $1-ൽ അസാധàµà´µà´¾à´¯ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ',
+ 'imagemap_missing_coord' => 'പിഴവàµ: വരി $1-ൽ രൂപതàµà´¤à´¿à´¨àµ ആവശàµà´¯à´®àµà´³àµà´³à´¤àµà´° നിർദàµà´¦àµ‡à´¶à´¾à´™àµà´•à´™àµà´™àµ¾ നിർവചിചàµà´šà´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
+ 'imagemap_unrecognised_shape' => 'പിഴവàµ: വരി $1-ൽ മനസàµà´¸à´¿à´²à´¾à´•àµà´•à´¾àµ» പറàµà´±à´¾à´¤àµà´¤ രൂപം. ഓരോ വരിയàµà´‚ ഇനി പറയàµà´¨àµà´¨ à´’à´¨àµà´¨àµ കൊണàµà´Ÿàµ വേണം à´¤àµà´Ÿà´™àµà´™à´¾àµ»: <code>default</code>, <code>rect</code>, <code>circle</code> അഥവാ <code>poly</code>',
+ 'imagemap_invalid_coord' => 'പിഴവàµ: വരി $1-ൽ അസാധàµà´µà´¾à´¯ നിർദàµà´¦àµ‡à´¶à´¾à´™àµà´•à´‚. നിർബനàµà´§à´®à´¾à´¯àµà´‚ അതൠഒരൠസംഖàµà´¯à´¯à´¾à´¯à´¿à´°à´¿à´•àµà´•à´£à´‚.',
+ 'imagemap_invalid_desc' => 'പിഴവàµ: അസാധàµà´µà´¾à´¯ വിവരണ നിർദàµà´¦àµ‡à´¶à´‚. ഇനി പറയàµà´¨àµà´¨ ഇനങàµà´™à´³à´¿àµ½ à´’à´¨àµà´¨à´¾à´¯à´¿à´°à´¿à´•àµà´•à´£à´‚: <code>$1</code>',
+ 'imagemap_description' => 'à´ˆ à´šà´¿à´¤àµà´°à´¤àµà´¤àµ† à´•àµà´±à´¿à´šàµà´šàµ',
+ 'imagemap_poly_odd' => 'പിഴവàµ: വിവിധ à´’à´±àµà´±à´¯à´¾à´¯àµà´³àµà´³ സംഖàµà´¯à´•àµ¾ ഉപയോഗിചàµà´šàµà´³àµà´³ നിർദàµà´¦àµ‡à´¶à´¾à´™àµà´•à´™àµà´™àµ¾ വരി $1-ൽ à´•à´£àµà´Ÿàµ†à´¤àµà´¤à´¿',
+);
+
+/** Marathi (मराठी)
+ * @author Kaajawa
+ * @author Kaustubh
+ * @author Rahuldeshmukh101
+ */
+$messages['mr'] = array(
+ 'imagemap_desc' => 'कà¥à¤²à¤¾à¤¯à¤‚टकडील चितà¥à¤°à¤¨à¤•à¤¾à¤¶à¥‡ <code>&lt;imagemap&gt;</code> टॅग देऊन वापरता येऊ शकतात.',
+ 'imagemap_no_image' => 'Error: पहिलà¥à¤¯à¤¾ ओळीत चितà¥à¤° देणे गरजेचे आहे',
+ 'imagemap_invalid_image' => 'Error: चà¥à¤•à¥€à¤šà¥‡ अथवा असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नसलेले चितà¥à¤°',
+ 'imagemap_bad_image' => 'तà¥à¤°à¥‚टी: हà¥à¤¯à¤¾ पानावरील चितà¥à¤° काळà¥à¤¯à¤¾ यादीत टाकले आहे',
+ 'imagemap_no_link' => 'Error: $1 ओळीचà¥à¤¯à¤¾ शेवटी योगà¥à¤¯ दà¥à¤µà¤¾ सापडलेला नाही',
+ 'imagemap_invalid_title' => 'Error: $1 ओळीतील दà¥à¤µà¥à¤¯à¤¾à¤šà¥‡ चà¥à¤•à¥€à¤šà¥‡ शीरà¥à¤·à¤•',
+ 'imagemap_missing_coord' => 'Error: $1 ओळीवरील आकारासाठी पà¥à¤°à¥‡à¤¸à¥‡ कोऑरà¥à¤¡à¤¿à¤¨à¥‡à¤Ÿà¥à¤¸ नाहीत',
+ 'imagemap_unrecognised_shape' => 'Error: $1 ओळीमधà¥à¤¯à¥‡ चà¥à¤•à¥€à¤šà¤¾ आकार, पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• ओळ ही: <code>default</code>, <code>rect</code>, <code>circle</code> अथवा <code>poly</code> पासून सà¥à¤°à¥ वà¥à¤¹à¤¾à¤¯à¤²à¤¾ पाहिजे.',
+ 'imagemap_invalid_coord' => 'Error: $1 ओळीवर चà¥à¤•à¥€à¤šà¥‡ कोऑरà¥à¤¡à¤¿à¤¨à¥‡à¤Ÿà¥à¤¸, संखà¥à¤¯à¤¾ हवी',
+ 'imagemap_invalid_desc' => 'Error: चà¥à¤•à¥€à¤šà¥€ माहिती, यापैकी à¤à¤• असायला हवी: <code>$1</code>',
+ 'imagemap_description' => 'या चितà¥à¤°à¤¾à¤¬à¤¦à¥à¤¦à¤² माहिती',
+ 'imagemap_poly_odd' => 'तà¥à¤°à¥à¤Ÿà¥€: रेष कà¥à¤°. $1 मधे विषम संखà¥à¤¯à¥‡à¤šà¥‡ गà¥à¤£à¤• असलेला बहà¥à¤­à¥à¤œà¤• आकार सापडला',
+);
+
+/** Malay (Bahasa Melayu)
+ * @author Anakmalaysia
+ * @author Aviator
+ * @author Kurniasan
+ */
+$messages['ms'] = array(
+ 'imagemap_desc' => 'Membenarkan peta imej boleh klik menggunakan tag <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Ralat: sila nyatakan imej dalam baris pertama',
+ 'imagemap_invalid_image' => 'Imej: imej tidak sah atau tidak wujud',
+ 'imagemap_bad_image' => 'Ralat: imej disenaraihitamkan di laman ini',
+ 'imagemap_no_link' => 'Ralat: tiada pautan sah dijumpai pada akhir baris $1',
+ 'imagemap_invalid_title' => 'Ralat: tajuk tidak sah dalam pautan pada baris $1',
+ 'imagemap_missing_coord' => 'Ralat: koordinat bagi bentuk tidak cukup pada baris $1',
+ 'imagemap_unrecognised_shape' => 'Ralat: bentuk tidak dikenali pada baris $1, setiap baris hendaklah dimulakan dengan salah satu daripada: <code>default</code>, <code>rect</code>, <code>circle</code> atau <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Ralat: koordinat tidak sah pada baris $1, hanya nombor dibenarkan',
+ 'imagemap_invalid_desc' => 'Ralat: spesifikasi keterangan tidak sah, hendaklah salah satu daripada: <code>$1</code>',
+ 'imagemap_description' => 'Perihal imej ini',
+ 'imagemap_desc_types' => 'atas-kanan, bawah-kanan, bawah-kiri, atas-kiri, tiada',
+ 'imagemap_poly_odd' => 'Ralat: terdapat poligon dengan bilangan koordinat yang ganjil dalam baris $1',
+);
+
+/** Maltese (Malti)
+ * @author Chrisportelli
+ */
+$messages['mt'] = array(
+ 'imagemap_no_image' => 'Żball: trid tispeċifika stampa fl-ewwel linja',
+ 'imagemap_invalid_image' => 'Żball: l-istampa hija invalida jew ħażina',
+ 'imagemap_bad_image' => "Żball: l-istampa tinsab fil-''blacklist'' fuq din il-paġna",
+ 'imagemap_no_link' => 'Żball: l-ebda ħolqa valida ma nstabet fi tmiem il-linja $1',
+ 'imagemap_invalid_title' => "Żball: titlu invalidu għall-ħolqa f'linja $1",
+ 'imagemap_missing_coord' => 'Żball: mhux biżżejjed koordinati għall-forma speċifikata fil-linja $1',
+ 'imagemap_unrecognised_shape' => "Żball: il-forma speċifikata fil-linja $1 mhix magħrufa, kull linja trid tibda b'waħda minn dawn: <code>default</code>, <code>rect</code>, <code>circle</code> jew <code>poly</code>",
+ 'imagemap_invalid_coord' => 'Żball: koordinata invalida fil-linja $1, trid tkun numru',
+ 'imagemap_invalid_desc' => 'Żball: valur ħażin għall-parametru desc, irid ikun wieħed minn: <code>$1</code>',
+ 'imagemap_description' => 'Dwar din l-istampa',
+ 'imagemap_poly_odd' => "Żball: instab poliganu b'numru fard ta' koordinati fil-linja $1",
+);
+
+/** Erzya (ÑрзÑнь)
+ * @author Botuzhaleny-sodamo
+ */
+$messages['myv'] = array(
+ 'imagemap_description' => 'Те артовкÑтонть',
+);
+
+/** Norwegian Bokmål (norsk (bokmål)‎)
+ */
+$messages['nb'] = array(
+ 'imagemap_desc' => 'Gjør at man kan bruke klikkbare bilder ved hjelp av <code>&lt;imagemap&gt;</code>.',
+ 'imagemap_no_image' => 'Error: må angi et bilde i første linje',
+ 'imagemap_invalid_image' => 'Error: bilde er ugyldig eller ikke-eksisterende',
+ 'imagemap_bad_image' => 'Feil: bildet er svartelistet på denne siden',
+ 'imagemap_no_link' => 'Error: ingen gyldig lenke ble funnet i slutten av linje $1',
+ 'imagemap_invalid_title' => 'Error: ugyldig tittel i lenke på linje $1',
+ 'imagemap_missing_coord' => 'Error: ikke nok koordinater for form på linje $1',
+ 'imagemap_unrecognised_shape' => 'Error: ugjenkjennelig form på linje $1; hver linje må starte med enten: <code>default</code>, <code>rect</code>, <code>circle</code> eller <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Error: ugyldig koordinat i slutten av linje $1, må være et tall',
+ 'imagemap_invalid_desc' => 'Error: ugyldig desc-spesifisering, må være enten: <code>$1</code>',
+ 'imagemap_description' => 'Om dette bildet',
+ 'imagemap_poly_odd' => 'Feil: fant poly med et oddetall koordinater på rad $1',
+);
+
+/** Low German (Plattdüütsch)
+ * @author Slomox
+ */
+$messages['nds'] = array(
+ 'imagemap_desc' => 'Verlöövt dat Instellen vun Lenken op Biller över den Tag <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Error: in de eerste Reeg mutt en Bild angeven wesen',
+ 'imagemap_invalid_image' => 'Error: Bild geiht nich oder dat gifft dat gornich',
+ 'imagemap_bad_image' => 'Fehler: Dat Bild steiht op de swarte List för disse Sied',
+ 'imagemap_no_link' => 'Error: an dat Enn vun Reeg $1 weer keen Lenk',
+ 'imagemap_invalid_title' => 'Error: in Reeg $1 is de Titel in’n Lenk nich bi de Reeg',
+ 'imagemap_missing_coord' => 'Error: Form in Reeg $1 hett nich noog Koordinaten',
+ 'imagemap_unrecognised_shape' => "Error: Form in Reeg $1 nich kennt, jede Reeg mutt mit ''<code>default</code>'', ''<code>rect</code>'', ''<code>circle</code>'' oder ''<code>poly</code>'' anfangen",
+ 'imagemap_invalid_coord' => 'Error: Koordinaat in Reeg $1 nich bi de Reeg, mutt en Tall wesen',
+ 'imagemap_invalid_desc' => 'Error: Beschrieven nich bi de Reeg, mutt een vun disse wesen: <code>$1</code>',
+ 'imagemap_description' => 'Över dit Bild',
+ 'imagemap_poly_odd' => 'Fehler: Polygon mit unevene Tall Koordinaten in Reeg $1',
+);
+
+/** Nedersaksies (Nedersaksies)
+ * @author Servien
+ */
+$messages['nds-nl'] = array(
+ 'imagemap_no_image' => 'Fout: geef n aofbeelding op in de eerste regel',
+ 'imagemap_invalid_image' => 'Fout: aofbeelding is ongeldig of besteet niet',
+ 'imagemap_no_link' => 'Fout: der is gien geldige verwiezing evunnen an t einde van regel $1',
+ 'imagemap_invalid_title' => 'Fout: ongeldige titel in de verwiezing op regel $1',
+ 'imagemap_missing_coord' => 'Fout: niet genog koördinaoten veur vorm op regel $1',
+ 'imagemap_unrecognised_shape' => 'Fout: onherkenbaore vorm op regel $1, elke regel mut beginnen mit één van de volgende vormen: standard, dreehoek, sirkel of n veulhoek',
+ 'imagemap_invalid_coord' => 'Fout: ongeldige koördinaot in regel $1, mut n getal ween',
+ 'imagemap_invalid_desc' => 'Fout: ongeldige beschrievingsspesifikasie, mut n van: <code>$1</code> ween',
+ 'imagemap_description' => 'Over disse aofbeelding',
+);
+
+/** Nepali (नेपाली)
+ */
+$messages['ne'] = array(
+ 'imagemap_description' => 'यो चितà¥à¤°à¤•à¥‹ बारेमा',
+);
+
+/** Dutch (Nederlands)
+ * @author SPQRobin
+ * @author Siebrand
+ */
+$messages['nl'] = array(
+ 'imagemap_desc' => 'Maakt aanklikbare imagemaps mogelijk met de tag <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Fout: geef een afbeelding op in de eerste regel',
+ 'imagemap_invalid_image' => 'Fout: de afbeelding is corrupt of bestaat niet',
+ 'imagemap_bad_image' => 'Fout: de afbeelding staat op de zwarte lijst voor deze pagina',
+ 'imagemap_no_link' => 'Fout: er is geen geldige koppeling aangetroffen aan het einde van regel $1',
+ 'imagemap_invalid_title' => 'Fout: er staat een ongeldige titel in de koppeling op regel $1',
+ 'imagemap_missing_coord' => 'Fout: niet genoeg coördinaten voor vorm in regel $1',
+ 'imagemap_unrecognised_shape' => "Fout: niet herkende vorm in regel $1. Iedere regel moet beginnen met één van de commando's: <code>default</code>, <code>rect</code>, <code>circle</code> of <code>poly</code>.",
+ 'imagemap_invalid_coord' => 'Fout: ongeldige coördinaten in regel $1, moet een getal zijn',
+ 'imagemap_invalid_desc' => 'Fout: ongeldige beschrijvingsspecificatie, dit moet er één zijn uit de volgende lijst: $1',
+ 'imagemap_description' => 'Over deze afbeelding',
+ 'imagemap_poly_odd' => 'Fout: polygoon gevonden met een oneven aantal coördinaten op regel $1',
+);
+
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
+ * @author Frokor
+ */
+$messages['nn'] = array(
+ 'imagemap_desc' => 'Gjer at ein kan nytte klikkbare bilete ved hjelp av <code>&lt;imagemap&gt;</code>.',
+ 'imagemap_no_image' => 'Feil: må gje eit bilete i første linja',
+ 'imagemap_invalid_image' => 'Fil: biletet er ugyldig eller eksisterer ikkje',
+ 'imagemap_bad_image' => 'Feil: biletet er svartelista på denne sida',
+ 'imagemap_no_link' => 'Feil: fann ingen gyldig lenke i slutten av linje $1',
+ 'imagemap_invalid_title' => 'Feil: ugyldig tittel i lenke på linje $1',
+ 'imagemap_missing_coord' => 'Feil: ikkje nok koordinatar for form på linje $1',
+ 'imagemap_unrecognised_shape' => 'Feil: ukjend form på linje $1; kvar linje må starte med anten: <code>default</code>, <code>rect</code>, <code>circle</code> eller <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Feil: ugyldig koordinat i slutten av linje $1, må vere eit tal',
+ 'imagemap_invalid_desc' => 'Feil: ugyldig desc-spesifisering, må vere ein av: <code>$1</code>',
+ 'imagemap_description' => 'Om dette bilete',
+ 'imagemap_poly_odd' => 'Feil: fann poly med eit oddetal koordinatar på rad $1',
+);
+
+/** Occitan (occitan)
+ * @author Cedric31
+ */
+$messages['oc'] = array(
+ 'imagemap_desc' => "Permet qu'una mapa imatge clienta siá clicabla en utilizant la balisa <code>&lt;imagemap&gt;</code>",
+ 'imagemap_no_image' => 'Error : vos cal especificar un imatge dins la primièra linha',
+ 'imagemap_invalid_image' => 'Error : l’imatge es invalid o existís pas',
+ 'imagemap_bad_image' => 'Error : l’imatge es sus la tièra negra sus aquesta pagina',
+ 'imagemap_no_link' => 'Error : cap de ligam valid es pas estat trobat a la fin de la linha $1',
+ 'imagemap_invalid_title' => 'Error : títol invalid dins lo ligam a la linha $1',
+ 'imagemap_missing_coord' => 'Error : pas pro de coordenadas per la forma a la linha $1',
+ 'imagemap_unrecognised_shape' => 'Error : forma pas reconeguda a la linha $1, cada linha deu començar amb un dels mots seguents : <code>default</code>, <code>rect</code>, <code>circle</code> o <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Error : coordenada invalida a la linha $1, deu èsser un nombre',
+ 'imagemap_invalid_desc' => 'Error : paramètre « desc » invalid, los paramètres possibles son : $1',
+ 'imagemap_description' => "A prepaus d'aqueste imatge",
+ 'imagemap_poly_odd' => 'Error : trobat un poligòn amb un nombre impar de coordenadas a la linha $1',
+);
+
+/** Oriya (ଓଡ଼ିଆ)
+ * @author Psubhashish
+ */
+$messages['or'] = array(
+ 'imagemap_desc' => '<code>&lt;imagemap&gt;</code> ଚିହà­à¬¨ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି କà­à¬²à¬¾à¬à¬£à­à¬Ÿ ଭାଗର କà­à¬²à¬¿à¬• କଲାଭଳି ଛବିର ମାନଚିତà­à¬° ତିଆରି କରିଥାଠ।',
+ 'imagemap_no_image' => 'ଭà­à¬²: ପà­à¬°à¬¥à¬® ଧାଡ଼ିରେ à¬à¬• ଛବି ଉଲà­à¬²à­‡à¬– କରିବା ଜରà­à¬°à­€',
+ 'imagemap_invalid_image' => 'ଭà­à¬²: ଛବିଟି ଅବୈଧ ବା ନାହିà¬',
+ 'imagemap_bad_image' => 'ଭà­à¬²: à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬°à­‡ ଛବିଟି ବାସନà­à¬¦ କରାଯାଇଅଛି',
+ 'imagemap_no_link' => 'ଭà­à¬²:$1 ଧାଡ଼ିର ଶେଷରେ କୌଣସିଟି ବୈଧ ଲିଙà­à¬• ଦିଆଯାଇନାହିà¬',
+ 'imagemap_invalid_title' => 'ଭà­à¬²:$1ତମ ଧାଡ଼ିରେ ଭà­à¬² ନାମଟିଠଦିଆଯାଇଅଛି',
+ 'imagemap_missing_coord' => 'ଭà­à¬²: ଆକୃତି ପାଇଠ$1 ଧାଡ଼ିରେ ସେତେ ଅଧିକ ଦିଗବରେଣି ନାହିà¬',
+ 'imagemap_unrecognised_shape' => 'ଭà­à¬²: $1ମ ଧାଡ଼ିରେ ଅଚିହà­à¬¨à¬¾ ଆକୃତି, ସବà­à¬¯à¬¾à¬• ଧାଡ଼ି à¬à¬¹à¬¿ ସବୠନାମରୠଆରମà­à¬­ ହେବ ଉଚିତ: ଆପେଆପେ, ଆୟତକà­à¬·à­‡à¬¤à­à¬°, ବୃତà­à¬¤ ବ ବହà­à¬­à­‚ଜ',
+ 'imagemap_invalid_coord' => 'ଭà­à¬²: $1 ଧାଡ଼ିରେ ଥିବା ଅବୈଧ ଦିଗବାରେଣି, ସଂଖà­à­Ÿà¬¾à¬Ÿà¬¿à¬ ନିହାତି ହୋଇପାରେ',
+ 'imagemap_invalid_desc' => 'ଭà­à¬²: ଅବୈଧ ବଖାଣ ନିରà­à¬¦à¬¿à¬·à­à¬Ÿà¬¤à¬¾, à¬à¬¹à¬¿ ସବୠଭିତରୠଗୋଟିଠହୋଇପାରେ: <code>$1</code>',
+ 'imagemap_description' => 'à¬à¬¹à¬¿ ଛବି ବାବଦରେ',
+ 'imagemap_poly_odd' => 'ଭà­à¬²: $1 ତମ ଧାଡ଼ିରେ à¬à¬• ବିସମ କୋଣଥିବା ବହà­à¬­à­‚ଜ ପାଇଲà­à¬',
+);
+
+/** Ossetic (Ирон)
+ * @author Amikeco
+ */
+$messages['os'] = array(
+ 'imagemap_description' => 'Ðцы нывы тыххæй',
+);
+
+/** Deitsch (Deitsch)
+ * @author Xqt
+ */
+$messages['pdc'] = array(
+ 'imagemap_description' => 'Iwwer sell Pikder',
+);
+
+/** Pälzisch (Pälzisch)
+ * @author Manuae
+ */
+$messages['pfl'] = array(
+ 'imagemap_description' => 'Iwas Bild',
+);
+
+/** Polish (polski)
+ * @author Derbeth
+ * @author Leinad
+ * @author Sp5uhe
+ */
+$messages['pl'] = array(
+ 'imagemap_desc' => 'Umożliwia utworzenie obrazka zawierającego klikalną mapę, z użyciem znacznika <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Błąd – należy wpisać grafikę w pierwszej linii',
+ 'imagemap_invalid_image' => 'Błąd – grafika jest niepoprawna lub nie istnieje',
+ 'imagemap_bad_image' => 'Błąd – ta grafika jest zakazana w tym serwisie',
+ 'imagemap_no_link' => 'Błąd – nie znaleziono poprawnego linku na końcu linii $1',
+ 'imagemap_invalid_title' => 'Błąd – niepoprawny tytuł linku w linii $1',
+ 'imagemap_missing_coord' => 'Błąd – niewystarczająca liczba współrzędnych dla kształtu zdefiniowanego w linii $1',
+ 'imagemap_unrecognised_shape' => 'Błąd – nierozpoznany kształt w linii $1; każda linia musi zawierać tekst: <code>default</code>, <code>rect</code>, <code>circle</code> lub <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Błąd – nieprawidłowa współrzędna w linii $1; należy podać liczbę',
+ 'imagemap_invalid_desc' => 'Błąd – nieprawidłowa specyfikacja opisu; należy wpisać jeden z wariantów: <code>$1</code>',
+ 'imagemap_description' => 'Informacje o tej grafice',
+ 'imagemap_poly_odd' => 'Błąd – w linii $1 znaleziono wielokąt z nieparzystą liczbą współrzędnych',
+);
+
+/** Piedmontese (Piemontèis)
+ * @author Bèrto 'd Sèra
+ * @author Dragonòt
+ */
+$messages['pms'] = array(
+ 'imagemap_desc' => 'A përmëtt "image map" client-side clicàbij an dovrand ël tag <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => "Error: ant la prima riga a venta ch'a-i sia la specìfica ëd na figura",
+ 'imagemap_invalid_image' => "Error: la figura ò ch'a l'ha chèich-còs ch'a va nen, ò ch'a-i é nen d'autut",
+ 'imagemap_bad_image' => "Eror: la figura a l'é ant la blacklist ëd costa pàgina",
+ 'imagemap_no_link' => 'Error: pa gnun-a anliura bon-a a la fin dla riga $1',
+ 'imagemap_invalid_title' => "Error: tìtol nen bon ant l'anliura dla riga $1",
+ 'imagemap_missing_coord' => 'Error: pa basta ëd coordinà për fé na forma a la riga $1',
+ 'imagemap_unrecognised_shape' => 'Error: forma nen arconossùa a la riga $1, minca riga a la dev anandiesse con un ëd: <code>default</code>, <code>rect</code>, <code>circle</code> ò <code>poly</code>',
+ 'imagemap_invalid_coord' => "Error: coordinà nen bon-a a la riga $1, a l'ha da esse un nùmer",
+ 'imagemap_invalid_desc' => "Error: specìfica dla descrission nen bon-a, a l'ha da esse un-a ëd coste-sì: <code>$1</code>",
+ 'imagemap_description' => 'Rësgoard a sta figura-sì',
+ 'imagemap_poly_odd' => 'Eror: trovà un polìgon con un nùmer dìspar ëd coordinà an sla linia $1',
+);
+
+/** Western Punjabi (پنجابی)
+ * @author Khalid Mahmood
+ */
+$messages['pnb'] = array(
+ 'imagemap_desc' => 'اجازت دیندا اے کلائینٹ سائیڈ کلکایبل امیج نقشے <code>&lt;imagemap&gt;</code> ٹیگ ورتدیاں Ûویاں۔',
+ 'imagemap_no_image' => 'غلطی: Ù¾ÛÙ„ÛŒ لائن Ú† مورت بارے دسو',
+ 'imagemap_invalid_image' => 'مسئلÛ: اے Ùوٹو غلط اے یا نئیں Ûیگی',
+ 'imagemap_bad_image' => 'مسئلÛ: Ùوٹو اس صÙÛ’ واسطے بلیک لسٹ اے',
+ 'imagemap_no_link' => 'مسئلÛ: $1 دی لائن دے انت تے کوئی ٹردا جوڑ نئیں',
+ 'imagemap_invalid_title' => 'مسئلÛ: $1 لائن دے جوڑ تے غلط ناں اے',
+ 'imagemap_missing_coord' => 'غلطی: کاÙÛŒ کووارڈینیٹ لکیر $1 تے مورت لئی نئیں دتے Ú¯Û“Û”',
+ 'imagemap_unrecognised_shape' => 'غلطی:لکیر $1 تے مورت نئیں پچھانی جاندی، Ûر لکیر ایناں Ú†ÙˆÚº کسے نال شروع Ûووے: ÚˆÛŒÙالٹ، ریکٹ، چکر، یا پولی',
+ 'imagemap_invalid_coord' => 'غلطی: ناں منے جان والے کووارڈینیٹ لکیر $1ØŒ لازمی اک نمبر Ûووے۔',
+ 'imagemap_invalid_desc' => 'غلطی: ناں منی جان والی ڈیسک سپیسیÙیکیشن، لازمی ایناں Ú†ÙˆÚº Ûووے: <code>$1</code>',
+ 'imagemap_description' => 'ایس مورت بارے',
+ 'imagemap_poly_odd' => 'غلطی: لکیر $1 تے پولی لبی وکھے نمبراں دے کوورڈینیٹ نال',
+);
+
+/** Pashto (پښتو)
+ * @author Ahmed-Najib-Biabani-Ibrahimkhel
+ */
+$messages['ps'] = array(
+ 'imagemap_description' => 'Ø¯Ø¯Û Ø§Ù†Úور په اړه',
+);
+
+/** Portuguese (português)
+ * @author Hamilton Abreu
+ * @author Malafaya
+ */
+$messages['pt'] = array(
+ 'imagemap_desc' => 'Permite mapas de imagem clicáveis no lado do cliente usando a "tag" <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Erro: é necessário especificar uma imagem na primeira linha',
+ 'imagemap_invalid_image' => 'Erro: imagem inválida ou inexistente',
+ 'imagemap_bad_image' => 'Erro: a imagem está na lista negra para esta página',
+ 'imagemap_no_link' => 'Erro: não foi encontrada nenhum link válido, ao final da linha $1',
+ 'imagemap_invalid_title' => 'Erro: título inválido num link, na linha $1',
+ 'imagemap_missing_coord' => 'Erro: coordenadas insuficientes para formar uma figura, na linha $1',
+ 'imagemap_unrecognised_shape' => 'Erro: figura não reconhecida, na linha $1 - cada linha tem de começar por: <code>default</code>, <code>rect</code>, <code>circle</code> ou <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Erro: coordenada inválida, na linha $1 - tem de ser um número',
+ 'imagemap_invalid_desc' => 'Erro: especificação desc inválida - tem de ser uma destas: <code>$1</code>',
+ 'imagemap_description' => 'Sobre esta imagem',
+ 'imagemap_poly_odd' => 'Erro: encontrado polígono com número ímpar de coordenadas na linha $1',
+);
+
+/** Brazilian Portuguese (português do Brasil)
+ * @author Carla404
+ * @author Eduardo.mps
+ */
+$messages['pt-br'] = array(
+ 'imagemap_desc' => 'Permite mapas de imagem clicáveis no lado do cliente usando a marca <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Erro: deve ser especificada uma imagem na primeira linha',
+ 'imagemap_invalid_image' => 'Erro: imagem inválida ou inexistente',
+ 'imagemap_bad_image' => 'Erro: a imagem está na lista negra para esta página',
+ 'imagemap_no_link' => 'Erro: não foi encontrada uma ligação válida ao final da linha $1',
+ 'imagemap_invalid_title' => 'Erro: título inválido na ligação da linha $1',
+ 'imagemap_missing_coord' => 'Erro: coordenadas insuficientes para formar uma figura na linha $1',
+ 'imagemap_unrecognised_shape' => 'Erro: figura não reconhecida na linha $1. Cada linha precisa iniciar com: <code>default</code>, <code>rect</code>, <code>circle</code> ou <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Erro: coordenada inválida na linha $1, é necessário que seja um número',
+ 'imagemap_invalid_desc' => 'Erro: especificação desc inválida, é necessário que seja uma dentre: <code>$1</code>',
+ 'imagemap_description' => 'Sobre esta imagem',
+ 'imagemap_desc_types' => 'superior-direito, inferior-direito, inferior-esquerdo, superior-esquerdo, nenhum',
+ 'imagemap_poly_odd' => 'Erro: encontrado polígono com número ímpar de coordenadas na linha $1',
+);
+
+/** Quechua (Runa Simi)
+ * @author AlimanRuna
+ */
+$messages['qu'] = array(
+ 'imagemap_description' => 'Kay rikchamanta',
+);
+
+/** Romanian (română)
+ * @author Cin
+ * @author KlaudiuMihaila
+ * @author Mihai
+ * @author Minisarm
+ */
+$messages['ro'] = array(
+ 'imagemap_desc' => 'Permite realizarea unei imagini hartă, cu ajutorul etichetei <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Eroare: trebuie specificată o imagine pe prima linie',
+ 'imagemap_invalid_image' => 'Eroare: imaginea este incorectă sau nu există',
+ 'imagemap_bad_image' => 'Eroare: imaginea este pe o listă neagră pentru această pagină',
+ 'imagemap_no_link' => 'Eroare: nu a fost găsită nici o legătură validă la sfârșitul liniei $1',
+ 'imagemap_invalid_title' => 'Eroare: titlu invalid în legătură în linia $1',
+ 'imagemap_missing_coord' => 'Eroare: coordonate insuficiente pentru forma de la linia $1',
+ 'imagemap_unrecognised_shape' => 'Eroare: formă nerecunoscută în linia $1, fiecare linie trebuie să înceapă cu unul din parametrii: <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Eroare: coordonată incorectă la linia $1, trebuie să fie număr',
+ 'imagemap_invalid_desc' => 'Eroare: parametru "desc" invalid, trebuie să fie unul din următorii: <code>$1</code>',
+ 'imagemap_description' => 'Despre această imagine',
+ 'imagemap_poly_odd' => 'Eroare: a fost găsit un poligon cu un număr impar de coordonate în linia $1',
+);
+
+/** tarandíne (tarandíne)
+ * @author Joetaras
+ */
+$messages['roa-tara'] = array(
+ 'imagemap_desc' => "Permette le mappe de immaggine cazzabbele late cliende ausanne 'u tag <code>&lt;imagemap&gt;</code>",
+ 'imagemap_no_image' => "Errore: a specifià 'n'immaggine jndr'à prima righe",
+ 'imagemap_invalid_image' => "Errore: l'immaggine jè invalide o non g'esiste",
+ 'imagemap_bad_image' => "Errore: l'immaggine sus a sta pàgene jè jndr'à lista gnore",
+ 'imagemap_no_link' => "Errore: nisciune collegamende valide ha state acchiate a fine d'a linèe $1",
+ 'imagemap_invalid_title' => "Errore: titele invalide jndr'à 'u collegamende a 'a linèe $1",
+ 'imagemap_missing_coord' => "Errore: non ge stonne abbastanze coordinate pa figure a 'a linèe $1",
+ 'imagemap_unrecognised_shape' => "Errore: figure none recanusciute a 'a linèe $1, ogne linèe adda accumenzà cu une de quiste: <code>default</code>, <code>rect</code>, <code>circle</code> o <code>poly</code>",
+ 'imagemap_invalid_coord' => "Errore: coordinate invalide a 'a linèe $1, adda essere 'nu numere",
+ 'imagemap_invalid_desc' => "Errore: specificazione d'a descrizione (desc) invalide, adda essere une de <code>$1</code>",
+ 'imagemap_description' => "Sus a st'immaggine",
+ 'imagemap_poly_odd' => "Errore: acchiate 'nu poligone cu numere dispare de coordinate sus a linèe $1",
+);
+
+/** Russian (руÑÑкий)
+ * @author Dim Grits
+ * @author Kaganer
+ * @author ÐлекÑандр Сигачёв
+ */
+$messages['ru'] = array(
+ 'imagemap_desc' => 'ПозволÑет указывать Ñрабатывающие на нажатие карты изображений на Ñтороне клиента Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ тега <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Ошибка: в первой Ñтроке должно быть задано изображение',
+ 'imagemap_invalid_image' => 'Ошибка: неверное или отÑутÑтвующее изображение',
+ 'imagemap_bad_image' => 'Ошибка. Изображение входит в чёрный ÑпиÑок на Ñтой Ñтранице.',
+ 'imagemap_no_link' => 'Ошибка: Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÑылка в конце Ñтроки $1',
+ 'imagemap_invalid_title' => 'Ошибка: неверный заголовок ÑÑылки в Ñтроке $1',
+ 'imagemap_missing_coord' => 'Ошибка: недоÑтаточно координат Ð´Ð»Ñ Ñ„Ð¸Ð³ÑƒÑ€Ñ‹ в Ñтроке $1',
+ 'imagemap_unrecognised_shape' => 'Ошибка: Ð½ÐµÐ¾Ð¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð° в Ñтроке $1, ÐºÐ°Ð¶Ð´Ð°Ñ Ñтрока должна начинатьÑÑ Ð¾Ð´Ð½Ð¸Ð¼ из ключевых Ñлов: <code>default</code>, <code>rect</code>, <code>circle</code> или <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Ошибка: Ð¾ÑˆÐ¸Ð±Ð¾Ñ‡Ð½Ð°Ñ ÐºÐ¾Ð¾Ñ€Ð´Ð¸Ð½Ð°Ñ‚Ð° в Ñтроке $1, ожидаетÑÑ Ñ‡Ð¸Ñло',
+ 'imagemap_invalid_desc' => 'Ошибка: некорректное значение desc, ожидаетÑÑ Ð¾Ð´Ð½Ð¾ из Ñледующих значений: <code>$1</code>',
+ 'imagemap_description' => 'ОпиÑание изображениÑ',
+ 'imagemap_desc_types' => 'верхний правый, нижний правый, нижний левый, верхний левый, ни один',
+ 'imagemap_poly_odd' => 'Ошибка: в Ñтроке $1 обнаружено опиÑание многоугольника Ñ Ð»Ð¸ÑˆÐ½Ð¸Ð¼Ð¸ координатами',
+);
+
+/** Rusyn (руÑиньÑкый)
+ * @author Gazeb
+ */
+$messages['rue'] = array(
+ 'imagemap_desc' => 'Доволює Ñтворёвати кликачу мапу образку на боцї кліента за помочі значкы <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Хыба: на першім Ñ€Ñдку муÑить быти заданый образок',
+ 'imagemap_invalid_image' => 'Хыба: файл не Ñ” платный або не Ñ”Ñтвує',
+ 'imagemap_bad_image' => 'Хыба: образок ÑÑ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑŒ на чорнім ÑпиÑку',
+ 'imagemap_no_link' => 'Хыба: не нашов ÑÑ Ð¶Ð°Ð´ÐµÐ½ платный одказ на кінцї Ñ€Ñдку $1',
+ 'imagemap_invalid_title' => 'Хыба: неправилна назва в одказї на Ñ€Ñдку $1',
+ 'imagemap_missing_coord' => 'Хыба: хыблÑчі коордінаты про твар на Ñ€Ñдку $1',
+ 'imagemap_unrecognised_shape' => 'Хыба: нероÑпознаный твар на Ñ€Ñдку $1, каждый Ñ€Ñдок муÑить зачінати дефініціов твару: <code>default</code>, <code>rect</code>, <code>circle</code> або <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Хыба: неправилны коордінаты на Ñ€Ñдку $1, має быти чіÑло',
+ 'imagemap_invalid_desc' => 'Хыба: неправилне Ð·Ð°Ð´Ð°Ð½Ñ Ð¾Ð±Ð»Ð°Ñти desc, має быти єдна з такых можноÑтей: <code>$1</code>',
+ 'imagemap_description' => 'О образку',
+ 'imagemap_poly_odd' => 'Хыба: на Ñ€Ñдку $1 найденый многокутник з непарным чіÑлом коордінат',
+);
+
+/** Sanskrit (संसà¥à¤•à¥ƒà¤¤à¤®à¥)
+ * @author Shubha
+ */
+$messages['sa'] = array(
+ 'imagemap_desc' => ' <code>&lt;imagemap&gt;</code> इदमॠउपयà¥à¤œà¥à¤¯ कà¥à¤²à¥ˆà¤£à¥à¤Ÿà¥-सैडà¥-नोदनयोगà¥à¤¯à¤šà¤¿à¤¤à¥à¤°à¤ªà¤Ÿà¤‚ करà¥à¤¤à¥à¤‚ शकà¥à¤¯à¤¤à¥‡ ।',
+ 'imagemap_no_image' => 'दॊषः: पà¥à¤°à¤¥à¤®à¤ªà¤™à¥à¤•à¥à¤¤à¥Œ चितà¥à¤°à¤‚ निरà¥à¤¦à¥‡à¤·à¥à¤Ÿà¤µà¥à¤¯à¤®à¥',
+ 'imagemap_invalid_image' => 'दॊषः: इदं चितà¥à¤°à¤®à¥ अमानà¥à¤¯à¤®à¥ अथवा अविदà¥à¤¯à¤®à¤¾à¤¨à¤®à¥',
+ 'imagemap_bad_image' => 'दोषः: चितà¥à¤°à¤®à¥ असà¥à¤®à¤¿à¤¨à¥ पृषà¥à¤ à¥‡ अमानितमसà¥à¤¤à¤¿',
+ 'imagemap_no_link' => 'दोषः: $1 पङà¥à¤•à¥à¤¤à¥‡à¤ƒ अनà¥à¤¤à¥‡ मानà¥à¤¯à¤ƒ अनà¥à¤¬à¤¨à¥à¤§à¤ƒ कोपि न दृषà¥à¤Ÿà¤ƒ ।',
+ 'imagemap_invalid_title' => 'दोषः: $1 पङà¥à¤•à¥à¤¤à¥Œ अनà¥à¤¬à¤¨à¥à¤§à¤¸à¥à¤¯ अमानà¥à¤¯à¤‚ शिरोनाम विदà¥à¤¯à¤¤à¥‡',
+ 'imagemap_missing_coord' => 'दोषः : $1 पङà¥à¤•à¥à¤¤à¥Œ आकाराय आवशà¥à¤¯à¤•à¤¾à¤ƒ बिनà¥à¤¦à¤µà¤ƒ न विदà¥à¤¯à¤¨à¥à¤¤à¥‡',
+ 'imagemap_unrecognised_shape' => 'Error: $1 पङà¥à¤•à¥à¤¤à¥à¤¯à¤¾à¤ƒ आकारे कशà¥à¤šà¤¨ दोषः जातः, पà¥à¤°à¤¤à¤¿à¤ªà¤™à¥à¤•à¥à¤¤à¤¿à¤ƒ: <code>default</code>, <code>rect</code>, <code>circle</code> अथवा <code>poly</code> इतà¥à¤¯à¥‡à¤¤à¥‡à¤¨ आरबà¥à¤§à¤¾ सà¥à¤¯à¤¾à¤¤à¥',
+ 'imagemap_invalid_coord' => 'Error: $1 पङà¥à¤•à¥à¤¤à¥Œ अङà¥à¤•à¤¨à¤‚ दोषपूरà¥à¤£à¤®à¥, संखà¥à¤¯à¤¾ अपेकà¥à¤·à¤¿à¤¤à¤¾',
+ 'imagemap_invalid_desc' => 'दोषः: सदोषविवरणमà¥, अनयोः अनà¥à¤¯à¤¤à¤°à¤ƒ सà¥à¤¯à¤¾à¤¤à¥ <code>$1</code>',
+ 'imagemap_description' => 'असà¥à¤¯ चितà¥à¤°à¤¸à¥à¤¯ विषये',
+ 'imagemap_poly_odd' => 'दोषः: $1 पङà¥à¤•à¥à¤¤à¥Œ विषमसंखà¥à¤¯à¤¾à¤¯à¥à¤•à¥à¤¤à¥ˆà¤ƒ अङà¥à¤•à¤¨à¥ˆà¤ƒ दोषः दृषà¥à¤Ÿà¤ƒ',
+);
+
+/** Sakha (Ñаха тыла)
+ * @author HalanTul
+ */
+$messages['sah'] = array(
+ 'imagemap_desc' => 'Бу <code>&lt;imagemap&gt;</code> тиÑги туһанан клиент өттүгÑÑ€ каартаны баттааһын үлÑлиирин көҥүллүүр',
+ 'imagemap_no_image' => 'Error: баÑтакы Ñтрокатыгар ойуу баар буолуохтаах',
+ 'imagemap_invalid_image' => 'Error: ойуу Ñыыһа бÑриллибит, ÑбÑÑ‚ÑÑ€ отой Ñуох',
+ 'imagemap_bad_image' => 'ÐлҕаÑ: ойуу бу ÑирÑй хара иÑпииһÑгÑÑ€ киирÑÑ€',
+ 'imagemap_no_link' => 'Error: $1 Ñтрока бүтÑһигÑÑ€ Ñыыһа ыйынньык турбут',
+ 'imagemap_invalid_title' => 'Error: $1 Ñтрокаҕа ыйынньык баһа Ñыыһа Ñуруллубут',
+ 'imagemap_missing_coord' => 'Error: недоÑтаточно координат Ð´Ð»Ñ Ñ„Ð¸Ð³ÑƒÑ€Ñ‹ в Ñтроке $1',
+ 'imagemap_unrecognised_shape' => 'Error: Ð½ÐµÐ¾Ð¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð° в Ñтроке $1, ÐºÐ°Ð¶Ð´Ð°Ñ Ñтрока должна начинатьÑÑ Ð¾Ð´Ð½Ð¸Ð¼ из ключевых Ñлов: <code>default</code>, <code>rect</code>, <code>circle</code> или <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Error: $1 Ñтрокаҕа Ñыыһа координата Ñуруллубут, чыыһыла буолуохтаах',
+ 'imagemap_invalid_desc' => 'Error: desc Ñуолтата Ñыыһа турбут, мантан талыахха наада: <code>$1</code>',
+ 'imagemap_description' => 'Ойуу туһунан',
+ 'imagemap_poly_odd' => 'ÐлҕаÑ: $1 Ñтрокааҕа наһаа ÑлбÑÑ… координааталаах многоугольник туһунан булулунна',
+);
+
+/** Sicilian (sicilianu)
+ * @author Santu
+ */
+$messages['scn'] = array(
+ 'imagemap_desc' => "Pirmetti di rializzari ''image map'' cliccàbbili latu client cô tag <code>&lt;imagemap&gt;</code>",
+ 'imagemap_no_image' => "Sbàgghiu: s'hà spicificari na mmàggini ntâ prima riga",
+ 'imagemap_invalid_image' => "Sbàgghiu: la mmàggini nun è vàlida o non c'è",
+ 'imagemap_bad_image' => "Sbàgghiu: la mmàggini s'attrova ntâ blacklist pi sta pàggina",
+ 'imagemap_no_link' => '
+Sbàgghiu: non vinni attruvatu nuddu lijami vàlidu a la fini dâ riga $1',
+ 'imagemap_invalid_title' => 'Sbàgghiu: tìtulu dû lijami non vàlidu ntâ riga $1',
+ 'imagemap_missing_coord' => 'Sbàgghiu: non ci sunnu abbastanza cuurdinati pi la furma spicificata nti la tiga $1',
+ 'imagemap_unrecognised_shape' => 'Sbàgghiu: Furma (shape) non canusciuta nti la riga $1, ogniduna di li righi hà accuminciari cu unu di li furmi ccà di sècutu: <code>default</code>, <code>rect</code>, <code>circle</code> o <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Sbàgghiu: cuurdinata non vàlida ntâ riga $1, idda hà èssiri nu nùmmiru',
+ 'imagemap_invalid_desc' => 'Sbàgghiu: valuri non vàlidu pô paràmitru desc, hà èssiri unu di chisti: <code>$1</code>',
+ 'imagemap_description' => "Nfumazzioni supr'a â mmàggini",
+ 'imagemap_desc_types' => 'top-right (susu-a manu dritta), bottom-right (jusu-a manu dritta) , bottom-left (jusu-a manu manca), top-left (susu-a manu manca), none (nenti)',
+ 'imagemap_poly_odd' => "Sbàgghiu: attruvatu pulìgunu c'un nùmmiru sparu di cuurdinati nti la riga $1",
+);
+
+/** Sinhala (සිංහල)
+ * @author නන්දිමිතුරු
+ */
+$messages['si'] = array(
+ 'imagemap_desc' => '<code>&lt;imagemap&gt;</code> ටà·à¶œà¶º භà·à·€à·’තයෙන් සේවà·à¶½à·à¶·à·’-අන්තයෙහි ක්ලික්කලහà·à¶šà·’ රූප සිතියම් වලට ඉඩ සලසයි',
+ 'imagemap_no_image' => 'දà·à·‚ය: ඔබ විසින්, පළමු පේලියෙහි රූපයක් හුවà·à¶¯à·à¶šà·Šà·€à·’යයුතුය',
+ 'imagemap_invalid_image' => 'දà·à·‚ය: රූපය අනීතිකයි නà·à¶­à·’නම් නොපවතියි',
+ 'imagemap_bad_image' => 'දà·à·‚ය: රූපය මෙම පටුවෙහි අපලේඛණය කොට ඇත',
+ 'imagemap_no_link' => 'දà·à·‚ය: $1 පේළිය කෙළවර කිසිදු නීතික සබà·à¶³à·’යක් හමුනොවිණි',
+ 'imagemap_invalid_title' => 'දà·à·‚ය: $1 පේළියෙහි සබà·à¶³à·’යෙහි à·à·“ර්ෂය අනීතිකයි',
+ 'imagemap_missing_coord' => 'දà·à·‚ය: $1 පේළියෙහි à·„à·à¶©à¶º සඳහ෠අවà·à·Šâ€à¶º තරමට ඛණ්ඩà·à¶‚ක සපය෠නොමà·à¶­',
+ 'imagemap_unrecognised_shape' => 'දà·à·‚ය: $1 පේළියෙහි à·„à·à¶©à¶º හඳුනà·à¶œà¶­à¶±à·œà·„à·à¶šà·’ විය, සෑම පේළියක්ම මෙයින් එකකික් ඇරඹිය යුතුය: <code>default</code>, <code>rect</code>, <code>circle</code> à·„à· <code>poly</code>',
+ 'imagemap_invalid_coord' => 'දà·à·‚ය: $1 පේළියෙහි අනීතික ඛණ්ඩà·à¶‚කයකි, එය සංඛ්â€à¶ºà·à·€à¶šà·Š විය යුතුය',
+ 'imagemap_invalid_desc' => 'දà·à·‚ය: desc පිරිවිතරය අනීතිකයි, මෙයින් එකක් විය යුතුය: <code>$1</code>',
+ 'imagemap_description' => 'මෙම රූපය පිළිබඳ',
+ 'imagemap_desc_types' => 'ඉහළ-දකුණ, පහළ-දකුණ, පහළ-වම, ඉහළ-වම, කිසිවක් නà·à¶­',
+ 'imagemap_poly_odd' => 'දà·à·‚ය: $1 පේළියෙහි ඛණ්ඩà·à¶‚ක ඔත්තේ ගණනක් සමග poly හමුවිය',
+);
+
+/** Slovak (slovenÄina)
+ * @author Helix84
+ */
+$messages['sk'] = array(
+ 'imagemap_desc' => 'Poskytuje klikateľné obrázkové mapy spracúvané na strane klienta pomocou znaÄky <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Chyba: musí mať na prvom riadku uvedený obrázok',
+ 'imagemap_invalid_image' => 'Chyba: obrázok je neplatný alebo neexistuje',
+ 'imagemap_bad_image' => 'Chyba: obrázok na tejto stránke sa nachádza na Äiernej listine',
+ 'imagemap_no_link' => 'Chyba: na konci riadka $1 nebol nájdený platný odkaz',
+ 'imagemap_invalid_title' => 'Chyba: neplatný nadpis v odkaze na riadku $1',
+ 'imagemap_missing_coord' => 'Chyba: nedostatok súradníc na vytvorenie tvaru na riadku $1',
+ 'imagemap_unrecognised_shape' => 'Chyba: nerozpoznaný tvar na riadku $1, každý riadok musí zaÄínaÅ¥ jedným z: <code>default</code>, <code>rect</code>, <code>circle</code> alebo <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Chyba: neplatná súradnica na riadku $1, musí to byÅ¥ Äíslo',
+ 'imagemap_invalid_desc' => 'Chyba: neplatný popis, musí byť jedno z nasledovných: <code>$1</code>',
+ 'imagemap_description' => 'O tomto obrázku',
+ 'imagemap_poly_odd' => 'Chyba: nájdený mnohouholník s nepárnym poÄtom súradníc na riadku $1',
+);
+
+/** Slovenian (slovenÅ¡Äina)
+ * @author Dbc334
+ */
+$messages['sl'] = array(
+ 'imagemap_desc' => 'OmogoÄa klikljive zemljevide slik na odjemalski strani z uporabo oznake <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Napaka: v prvi vrstici morate navesti sliko',
+ 'imagemap_invalid_image' => 'Napaka: slika je neveljavna ali ne obstaja',
+ 'imagemap_bad_image' => 'Napaka: slika je na tej strani na Ärnem seznamu',
+ 'imagemap_no_link' => 'Napaka: na koncu vrstice $1 ni bila najdena veljavna povezava',
+ 'imagemap_invalid_title' => 'Napaka: neveljaven naslov v povezavi v vrstici $1',
+ 'imagemap_missing_coord' => 'Napaka: ni dovolj koordinat za obliko v vrstici $1',
+ 'imagemap_unrecognised_shape' => 'Napaka: nerazpoznavna oblika v vrsici $1; vsaka vrstica se mora zaÄeti z enim od: <code>default</code>, <code>rect</code>, <code>circle</code> ali <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Napaka: neveljavna koordinata v vrstici $1, mora biti Å¡tevilo',
+ 'imagemap_invalid_desc' => 'Napaka: neveljavno doloÄilo desc, mora biti eno izmed: <code>$1</code>',
+ 'imagemap_description' => 'O tej sliki',
+ 'imagemap_poly_odd' => 'Napaka: najden veÄkotnik z lihim Å¡tevilom koordinat v vrstici $1',
+);
+
+/** Albanian (shqip)
+ * @author Olsi
+ */
+$messages['sq'] = array(
+ 'imagemap_desc' => 'Lejon klientin-side klikueshme harta figure duke përdorur etiketën <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Gabim: duhet të specifikohet një figurë në rreshtin e parë',
+ 'imagemap_invalid_image' => 'Gabim: figura është e pavlefshme ose joekzistente',
+ 'imagemap_bad_image' => 'Gabim: figura është në listën e zezë në këtë faqe',
+ 'imagemap_no_link' => 'Gabim: nuk u gjet asnjë lidhje në fund të rreshtit $1',
+ 'imagemap_invalid_title' => 'Gabim: titull i pavlefshëm në lidhjen tek rreshti $1',
+ 'imagemap_missing_coord' => 'Gabim: nuk ka mjaftueshëm koordinata për formën tek rreshti $1',
+ 'imagemap_unrecognised_shape' => 'Gabim: formë e papranuar tek rreshti $1, çdo rresht duhet të fillojë me një: <code>default</code>, <code>rect</code>, cicrcle ose <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Gabim: koordinatë e pavlefshme tek rreshti $1, duhet të jetë një numër',
+ 'imagemap_invalid_desc' => 'Gabim: desc specifikim i pavlefshëm, duhet të jetë një nga: <code>$1</code>',
+ 'imagemap_description' => 'Rreth kësaj figure',
+ 'imagemap_poly_odd' => 'Gabim: u gjet poli me numër tek i koordinatave në rreshtin $1',
+);
+
+/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Millosh
+ * @author Rancher
+ * @author Sasa Stefanovic
+ * @author Михајло Ðнђелковић
+ */
+$messages['sr-ec'] = array(
+ 'imagemap_desc' => 'Омогућава клијентÑкој Ñтрани кликабилну мапу коришћњењм ознаке <code>&lt;imagemap&gt;</code>.',
+ 'imagemap_no_image' => 'Грешка: Ðеопходно је одредити Ñлику у првој линији.',
+ 'imagemap_invalid_image' => 'Грешка: Слика је лоша или непоÑтојећа.',
+ 'imagemap_bad_image' => 'Грешка: Ñлика Ñе налази на црном ÑпиÑку за ову Ñтрану',
+ 'imagemap_no_link' => 'Грешка: Ðије пронађена ниједна ваљана веза на крају линије $1.',
+ 'imagemap_invalid_title' => 'Грешка: Лош наÑлов у вези у линији $1.',
+ 'imagemap_missing_coord' => 'Грешка: Ðема довољно координата за криву у линији $1.',
+ 'imagemap_unrecognised_shape' => 'Грешка: Ðепрепозната крива у линији $1, Ñвака линија мора почети једном од: <code>default</code>, <code>rect</code>, <code>circle</code> или <code>poly</code>.',
+ 'imagemap_invalid_coord' => 'Грешка: Лоше координате у линији $1; морају бити број.',
+ 'imagemap_invalid_desc' => 'Грешка: Лоше desc одређење, мора бити једно од: <code>$1</code>.',
+ 'imagemap_description' => 'О Ñлици',
+ 'imagemap_desc_types' => 'горе-деÑно, доле-деÑно, доле-лево, горе-лево, нема',
+ 'imagemap_poly_odd' => 'Грешка: нађен је полигон Ñа непарним бројем координата у линији $1',
+);
+
+/** Serbian (Latin script) (srpski (latinica)‎)
+ * @author Michaello
+ */
+$messages['sr-el'] = array(
+ 'imagemap_desc' => 'Omogućava klijentskoj strani klikabilnu mapu korišćnjenjm oznake <code>&lt;imagemap&gt;</code>.',
+ 'imagemap_no_image' => 'Greška: Neophodno je odrediti sliku u prvoj liniji.',
+ 'imagemap_invalid_image' => 'Greška: Slika je loša ili nepostojeća.',
+ 'imagemap_bad_image' => 'Greška: slika se nalazi na crnom spisku za ovu stranu',
+ 'imagemap_no_link' => 'Greška: Nije pronađena nijedna valjana veza na kraju linije $1.',
+ 'imagemap_invalid_title' => 'Greška: Loš naslov u vezi u liniji $1.',
+ 'imagemap_missing_coord' => 'Greška: Nema dovoljno koordinata za krivu u liniji $1.',
+ 'imagemap_unrecognised_shape' => 'GreÅ¡ka: Neprepoznata kriva u liniji $1, svaka linija mora poÄeti jednom od: <code>default</code>, <code>rect</code>, <code>circle</code> ili <code>poly</code>.',
+ 'imagemap_invalid_coord' => 'Greška: Loše koordinate u liniji $1; moraju biti broj.',
+ 'imagemap_invalid_desc' => 'Greška: Loše desc određenje, mora biti jedno od: <code>$1</code>.',
+ 'imagemap_description' => 'O ovoj slici',
+ 'imagemap_desc_types' => 'gore-desno, dole-desno, dole-levo, gore-levo, nema',
+ 'imagemap_poly_odd' => 'Greška: nađen je poligon sa neparnim brojem koordinata u liniji $1',
+);
+
+/** Seeltersk (Seeltersk)
+ * @author Pyt
+ */
+$messages['stq'] = array(
+ 'imagemap_desc' => "Moaket dät muugelk ferwies-sensitive Grafike ''(image maps)'' tou moakjen mäd Hälpe fon ju <code>&lt;imagemap&gt;</code>-Syntax",
+ 'imagemap_no_image' => 'Failer: In ju eerste Riege mout ne Bielde ounroat wäide',
+ 'imagemap_invalid_image' => 'Failer: Bielde is uungultich of is nit deer',
+ 'imagemap_bad_image' => 'Failer: Ju Bielde stoant ap ju Lieste fon nit wonskede Bielden',
+ 'imagemap_no_link' => 'Failer: Ap Eende fon Riege $1 wuude neen gultige Link fuunen',
+ 'imagemap_invalid_title' => 'Failer: uungultigen Tittel in dän Link in Riege $1',
+ 'imagemap_missing_coord' => 'Failer: Tou min Koordinate in Riege $1 foar dän Uumriet',
+ 'imagemap_unrecognised_shape' => 'Failer: Uunbekoande Uumrietfoarm in Riege $1. Älke Riege mout mäd aan fon disse Parametere ounfange: <tt><code>default</code>, <code>rect</code>, <code>circle</code></tt> of <tt><code>poly</code></tt>',
+ 'imagemap_invalid_coord' => 'Failer: Uungultige Koordinate in Riege $1: der sunt bloot Taale toulät',
+ 'imagemap_invalid_desc' => 'Failer: Uungultigen „desc“-Parameter, muugelk sunt: <code>$1</code>',
+ 'imagemap_description' => 'Uur disse Bielde',
+ 'imagemap_poly_odd' => 'Failer: Polygon mäd uunpooren Antaal an Koordinoaten in Riege $1',
+);
+
+/** Sundanese (Basa Sunda)
+ * @author Kandar
+ */
+$messages['su'] = array(
+ 'imagemap_description' => 'Ngeunaan ieu gambar',
+);
+
+/** Swedish (svenska)
+ * @author Boivie
+ * @author Lejonel
+ * @author M.M.S.
+ * @author WikiPhoenix
+ */
+$messages['sv'] = array(
+ 'imagemap_desc' => 'Lägger till taggen <code>&lt;imagemap&gt;</code> för klickbara bilder',
+ 'imagemap_no_image' => 'Fel: en bild måste anges på första raden',
+ 'imagemap_invalid_image' => 'Fel: bilden är ogiltig eller existerar inte',
+ 'imagemap_bad_image' => 'Fel: bilden är svartlistad på den här sidan',
+ 'imagemap_no_link' => 'Fel: ingen giltig länk fanns i slutet av rad $1',
+ 'imagemap_invalid_title' => 'Fel: felaktig titel i länken på rad $1',
+ 'imagemap_missing_coord' => 'Fel: koordinater saknas för området på rad $1',
+ 'imagemap_unrecognised_shape' => 'Fel: okänd områdesform på rad $1, varje rad måste börja med något av följande: <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Fel: ogiltig koordinat på rad $1, måste vara ett tal',
+ 'imagemap_invalid_desc' => 'Fel: ogiltig specifikation av desc, den måste var en av följande: <code>$1</code>',
+ 'imagemap_description' => 'Bildinformation',
+ 'imagemap_poly_odd' => 'Fel: hittade poly med udda antal koordinater på rad $1',
+);
+
+/** Swahili (Kiswahili)
+ * @author Kwisha
+ */
+$messages['sw'] = array(
+ 'imagemap_description' => 'Kuhusu picha hii',
+);
+
+/** Tamil (தமிழà¯)
+ * @author Karthi.dr
+ * @author Shanmugamp7
+ * @author மதனாஹரனà¯
+ */
+$messages['ta'] = array(
+ 'imagemap_no_image' => 'பிழை:ஒர௠படதà¯à®¤à¯ˆ à®®à¯à®¤à®²à¯ வரியில௠கணà¯à®Ÿà®¿à®ªà¯à®ªà®¾à®• கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®µà¯‡à®£à¯à®Ÿà¯à®®à¯.',
+ 'imagemap_invalid_image' => 'பிழை:படம௠செலà¯à®²à®¤à¯à®¤à®•à¯à®•à®¤à®²à¯à®² அலà¯à®²à®¤à¯ இலà¯à®²à®¾à®¤ ஒனà¯à®±à¯',
+ 'imagemap_bad_image' => 'பிழை:படம௠இநà¯à®¤ பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ à®à®±à¯à®•à®¤à¯à®¤à®•à®¾à®¤à®¤à¯ என படà¯à®Ÿà®¿à®¯à®²à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
+ 'imagemap_no_link' => 'தவறà¯: $1 வரியின௠மà¯à®Ÿà®¿à®µà®¿à®²à¯ செலà¯à®²à¯à®ªà®Ÿà®¿à®¯à®¾à®•à¯à®®à¯ தொடà¯à®ªà¯à®ªà¯ எதà¯à®µà¯à®®à¯ காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ',
+ 'imagemap_invalid_title' => 'பிழை:செலà¯à®²à®¤à¯à®¤à®•à®¾à®¤ தலைபà¯à®ªà¯ இணைபà¯à®ªà®¿à®©à¯ வரி $1லà¯',
+ 'imagemap_missing_coord' => 'தவறà¯: $1 வரியில௠வடிவதà¯à®¤à¯à®•à¯à®•à¯à®ªà¯ போதà¯à®®à®¾à®© ஆளà¯à®•à¯‚à®±à¯à®•à®³à¯ இலà¯à®²à¯ˆ',
+ 'imagemap_description' => 'இப௠படதà¯à®¤à¯ˆà®ªà¯ பறà¯à®±à®¿',
+);
+
+/** Telugu (తెలà±à°—à±)
+ * @author Chaduvari
+ * @author Veeven
+ */
+$messages['te'] = array(
+ 'imagemap_desc' => '<code>&lt;imagemap&gt;</code> à°Ÿà±à°¯à°¾à°—à±à°¨à± వాడటం à°¦à±à°µà°¾à°°à°¾ à°•à±à°²à°¿à°•à±à°•à°¦à°—à±à°— à°•à±à°²à°¯à°‚à°Ÿà±-వైపౠఇమేజి à°®à±à°¯à°¾à°ªà±à°²à°¨à± à°…à°¨à±à°®à°¤à°¿à°¸à±à°¤à±à°‚ది',
+ 'imagemap_no_image' => 'Error: తపà±à°ªà°¨à°¿à°¸à°°à°¿à°—à°¾ మొదటి లైనà±à°²à±‹ à°“ బొమà±à°®à°¨à°¿ ఇవà±à°µà°¾à°²à°¿',
+ 'imagemap_invalid_image' => 'Error: తపà±à°ªà±à°¡à± లేదా ఉనికిలో లేని బొమà±à°®',
+ 'imagemap_no_link' => 'Error: $1à°µ లైనౠచివర సరియైన లింకౠకనబడలేదà±',
+ 'imagemap_invalid_title' => 'Error: $1à°µ లైనà±à°²à±‹ ఉనà±à°¨ లింకà±à°²à±‹ తపà±à°ªà±à°¡à± శీరà±à°·à°¿à°•',
+ 'imagemap_missing_coord' => 'Error: ఆకృతికి తగిననà±à°¨à°¿ నిరూపకాలౠ$1à°µ లైనà±à°²à±‹ లేవà±',
+ 'imagemap_invalid_coord' => 'Error: $1à°µ లైనà±à°²à±‹ తపà±à°ªà±à°¡à± నిరూపకం, అది à°–à°šà±à°šà°¿à°¤à°‚à°—à°¾ సంఖà±à°¯ అయివà±à°‚డాలి.',
+ 'imagemap_invalid_desc' => 'Error: descని తపà±à°ªà±à°—à°¾ ఇచà±à°šà°¾à°°à±, అది వీటిలà±à°²à±‹ à°à°¦à±‹ à°’à°•à°Ÿà°¿ అయివà±à°‚డాలి: <code>$1</code>',
+ 'imagemap_description' => 'à°ˆ బొమà±à°® à°—à±à°°à°¿à°‚à°šà°¿',
+);
+
+/** Tetum (tetun)
+ * @author MF-Warburg
+ */
+$messages['tet'] = array(
+ 'imagemap_description' => "Kona-ba imajen ne'e",
+);
+
+/** Tajik (Cyrillic script) (тоҷикӣ)
+ * @author Ibrahim
+ */
+$messages['tg-cyrl'] = array(
+ 'imagemap_desc' => 'Имкони Ñҷоди нақшаҳои таÑвирӣ қобили клик кардан дар Ñамти корбарро бо иÑтифода аз барчаÑби <code>&lt;imagemap&gt;</code> фароҳам меоварад',
+ 'imagemap_no_image' => 'Error: боÑд дар Ñатри аввал Ñк акÑро Ð¼ÑƒÑˆÐ°Ñ…Ñ…Ð°Ñ ÐºÑƒÐ½ÐµÐ´',
+ 'imagemap_invalid_image' => 'Error: Ð°ÐºÑ Ò“Ð°Ð¹Ñ€Ð¸Ð¼Ð¸Ò·Ð¾Ð· аÑÑ‚ Ñ‘ вуҷуд надорад',
+ 'imagemap_no_link' => 'Error: ҳеҷ пайванди миҷозе то интиҳои Ñатри $1 пайдо нашуд',
+ 'imagemap_invalid_title' => 'Error: унвони ғайримиҷоз дар пайванди Ñатри $1',
+ 'imagemap_missing_coord' => 'Error: теъдоди ҳамоҳангӣ дар Ñатри $1 барои шакл кофӣ неÑÑ‚',
+ 'imagemap_unrecognised_shape' => 'Error: шакли ношинохта дар Ñатри $1, ҳар Ñатр боÑд бо Ñке аз ин даÑтурот оғоз шавад: <code>default</code>, <code>rect</code>, <code>circle</code> Ñ‘ <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Error: баробарии ғайримиҷоз дар Ñатри $1, боÑд адад бошад',
+ 'imagemap_invalid_desc' => 'Error: тавзеҳоти ғайримиҷоз, боÑд Ñке аз ин маворид бошад: <code>$1</code>',
+ 'imagemap_description' => 'Дар бораи ин акÑ',
+);
+
+/** Tajik (Latin script) (tojikī)
+ * @author Liangent
+ */
+$messages['tg-latn'] = array(
+ 'imagemap_desc' => 'Imkoni eçodi naqşahoi tasvirī qobili klik kardan dar samti korbarro bo istifoda az barcasbi <code>&lt;imagemap&gt;</code> faroham meovarad',
+ 'imagemap_no_image' => 'Error: bojad dar satri avval jak aksro muÅŸaxxas kuned',
+ 'imagemap_invalid_image' => 'Error: aks ƣajrimiçoz ast jo vuçud nadorad',
+ 'imagemap_no_link' => 'Error: heç pajvandi miçoze to intihoi satri $1 pajdo naşud',
+ 'imagemap_invalid_title' => 'Error: unvoni ƣajrimiçoz dar pajvandi satri $1',
+ 'imagemap_missing_coord' => "Error: te'dodi hamohangī dar satri $1 baroi şakl kofī nest",
+ 'imagemap_unrecognised_shape' => 'Error: şakli noşinoxta dar satri $1, har satr bojad bo jake az in dasturot oƣoz şavad: <code>default</code>, <code>rect</code>, <code>circle</code> jo <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Error: barobariji ƣajrimiçoz dar satri $1, bojad adad boşad',
+ 'imagemap_invalid_desc' => 'Error: tavzehoti ƣajrimiçoz, bojad jake az in mavorid boşad: <code>$1</code>',
+ 'imagemap_description' => 'Dar borai in aks',
+);
+
+/** Turkmen (Türkmençe)
+ * @author Hanberke
+ */
+$messages['tk'] = array(
+ 'imagemap_desc' => '<code>&lt;imagemap&gt;</code> tegini ulanyp, müşderi tarapyndan tyklanyp boljak surat kartalaryna rugsat berýär',
+ 'imagemap_no_image' => 'Säwlik: birinji setirde bir surat görkezmeli',
+ 'imagemap_invalid_image' => 'Säwlik: surat nädogry ýa-da ýok',
+ 'imagemap_bad_image' => 'Säwlik: surat bu sahypada gara sanawda',
+ 'imagemap_no_link' => 'Säwlik: $1 setiriň ahyrynda dogry çykgyt tapylmady',
+ 'imagemap_invalid_title' => 'Säwlik: $1 setirdäki çykgytda nädogry at',
+ 'imagemap_missing_coord' => 'Säwlik: $1 setirde surat üçin ýeterlik koordinata ýok',
+ 'imagemap_unrecognised_shape' => 'Säwlik: $1 setirde ykrar edilmedik şekil, her setir şulardan biri bilen başlamaly: <code>default</code>, <code>rect</code>, cirle ýa-da <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Säwlik: $1 setirde nädogry koordinata, san bolmaly',
+ 'imagemap_invalid_desc' => 'Säwlik: nädogry desc bahasy, şulardan biri bolmaly: <code>$1</code>',
+ 'imagemap_description' => 'Bu surat hakda',
+ 'imagemap_poly_odd' => 'Säwlik: $1 setirde täk sanly koordinata eýe poly tapyldy',
+);
+
+/** Tagalog (Tagalog)
+ * @author AnakngAraw
+ */
+$messages['tl'] = array(
+ 'imagemap_desc' => 'Nagpapahintulot ng napipindot na mga larawang mapa sa panig ng mga kliyente na ginagamitan ng tatak na <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Kamalian: dapat tumukoy ng isang larawan sa unang guhit/hanay',
+ 'imagemap_invalid_image' => 'Kamalian: hindi tanggap o hindi umiiral ang isang larawan',
+ 'imagemap_bad_image' => 'Kamalian: ipinagbabawal (nasa "itim na talaan") sa pahinang ito ang larawan',
+ 'imagemap_no_link' => 'Kamalian: walang natagpuang tanggap na kawing sa hulihan ng guhit/hanay na $1',
+ 'imagemap_invalid_title' => 'Kamalian: may hindi tanggap na pamagat sa kawing sa guhit/hanay na $1',
+ 'imagemap_missing_coord' => 'Kamalian: walang sapat na tugmaang pampook para sa hugis sa guhit/hanay na $1',
+ 'imagemap_unrecognised_shape' => 'Kamalian: hindi nakikilalang hugis sa guhit/hanay na $1, bawat guhit ay dapat na nagsisimula sa kahit na isang: <code>default</code>, <code>rect</code>, <code>circle</code> o <code>poly</code>.',
+ 'imagemap_invalid_coord' => 'Kamalian: hindi tanggap na tugmaang pampook sa guhit/hanay na $1, dapat na isang bilang',
+ 'imagemap_invalid_desc' => 'Kamalian: hindi tanggap na pagtukoy sa paglalarawan, dapat na isa sa: <code>$1</code>',
+ 'imagemap_description' => 'Tungkol sa larawang ito',
+ 'imagemap_desc_types' => 'pang-itaas na kanan, pang-ibabang kanan, pang-ibabang kaliwa, pang-itaas na kaliwa, wala',
+ 'imagemap_poly_odd' => "Kamalian: nakatagpo ng isang \"poli\" (''poly'') na mayroong bilang na may butal na pang-pagtutugmang pampook na nasa guhit/hanay na \$1",
+);
+
+/** Turkish (Türkçe)
+ * @author Joseph
+ * @author Karduelis
+ */
+$messages['tr'] = array(
+ 'imagemap_desc' => '<code>&lt;imagemap&gt;</code> etiketini kullanarak, alıcı-tarafında tıklanabilir resim haritalarına izin verir',
+ 'imagemap_no_image' => 'Hata: ilk satırda bir resim belirtmelisiniz',
+ 'imagemap_invalid_image' => 'Hata: resim geçersiz ya da mevcut değil',
+ 'imagemap_bad_image' => 'Hata: resim bu sayfada karalistelenmiÅŸ',
+ 'imagemap_no_link' => 'Hata: $1. satırın sonunda geçerli bir bağlantı bulunamadı',
+ 'imagemap_invalid_title' => 'Hata: $1. satırdaki bağlantıda geçersiz başlık',
+ 'imagemap_missing_coord' => 'Hata: $1. satırda şekil için yeterli koordinat yok',
+ 'imagemap_unrecognised_shape' => 'Hata: $1. satırda tanımlanmamış şekil, her satır şunlardan biriyle başlamalı: <code>default</code>, <code>rect</code>, cirle ya da <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Hata: $1. satırda geçersiz koordinat, bir sayı olmalı',
+ 'imagemap_invalid_desc' => 'Hata: geçersiz desc belirlemesi, şunlardan biri olmalı: <code>$1</code>',
+ 'imagemap_description' => 'Resim hakkında',
+ 'imagemap_poly_odd' => 'Hata: $1. satırda tek sayıda koordinata sahip poly bulundu',
+);
+
+/** Ukrainian (українÑька)
+ * @author AS
+ * @author Ahonc
+ * @author Alex Khimich
+ * @author Dim Grits
+ */
+$messages['uk'] = array(
+ 'imagemap_desc' => 'ДозволÑÑ” Ñтворювати на боці клієнта карти зображень, Ñкі Ñпрацьовують при натиÑканні, за допомогою тегу <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Помилка: у першому Ñ€Ñдку має бути задане зображеннÑ',
+ 'imagemap_invalid_image' => 'Помилка: неправильне або відÑутнє зображеннÑ',
+ 'imagemap_bad_image' => 'Помилка: Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° цій Ñторінці приÑутнє у чорному ÑпиÑку',
+ 'imagemap_no_link' => 'Помилка: неправильне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² кінці Ñ€Ñдка $1',
+ 'imagemap_invalid_title' => 'Помилка: неправильний заголовок в поÑиланні в Ñ€Ñдку $1',
+ 'imagemap_missing_coord' => 'Помилка: недоÑтатньо координат Ð´Ð»Ñ Ñ„Ñ–Ð³ÑƒÑ€Ð¸ в Ñ€Ñдку $1',
+ 'imagemap_unrecognised_shape' => 'Помилка: нерозпізнана фігура в Ñ€Ñдку $1, кожен Ñ€Ñдок повинен починатиÑÑ Ð· одного з ключових Ñлів: <code>default</code>, <code>rect</code>, <code>circle</code> або <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Помилка: помилкова координата в Ñ€Ñдку $1, має бути чиÑло',
+ 'imagemap_invalid_desc' => 'Помилка: помилкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ desc, має бути одне з таких значень: <code>$1</code>',
+ 'imagemap_description' => 'ÐžÐ¿Ð¸Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ',
+ 'imagemap_desc_types' => 'угорі праворуч, унизу праворуч, унизу ліворуч, угорі ліворуч, ніде',
+ 'imagemap_poly_odd' => 'Помилка: в Ñ€Ñдку $1 знайдений многокутник із непарною кількіÑÑ‚ÑŽ координат',
+);
+
+/** vèneto (vèneto)
+ * @author Candalua
+ */
+$messages['vec'] = array(
+ 'imagemap_desc' => "Parméte de realizar ''image map'' clicàbili lato client col tag <code>&lt;imagemap&gt;</code>",
+ 'imagemap_no_image' => 'Error: se gà da specificar na imagine ne la prima riga',
+ 'imagemap_invalid_image' => "Error: l'imagine no la xe valida o no la esiste",
+ 'imagemap_bad_image' => "Eror: l'imagine la se cata su la lista nera de sta pagina",
+ 'imagemap_no_link' => 'Error: no xe stà catà nissun colegamento valido a la fine de la riga $1',
+ 'imagemap_invalid_title' => 'Error: titolo del colegamento mìa valido ne la riga $1',
+ 'imagemap_missing_coord' => 'Error: no ghe xe coordinate in bisogno par la forma speçificada ne la riga $1',
+ 'imagemap_unrecognised_shape' => 'Error: Forma (shape) mìa riconossiùa ne la riga $1, ogni riga la ga da scuminsiar con uno dei seguenti: <code>default</code>, <code>rect</code>, <code>circle</code> o <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Error: coordinata mìa valida ne la riga $1, la gà da èssar un nùmaro',
+ 'imagemap_invalid_desc' => 'Error: Valor mìa valido par el parametro desc, el gà da èssar uno dei seguenti: $1',
+ 'imagemap_description' => 'Informazion su sta imagine',
+ 'imagemap_poly_odd' => "Erór: gò catà un polìgono co' un nùmaro dispari de coordinate in te la riga $1",
+);
+
+/** Veps (vepsän kel’)
+ * @author Игорь БродÑкий
+ */
+$messages['vep'] = array(
+ 'imagemap_description' => 'Necen kuvan polhe',
+);
+
+/** Vietnamese (Tiếng Việt)
+ * @author Minh Nguyen
+ * @author Vinhtantran
+ */
+$messages['vi'] = array(
+ 'imagemap_desc' => 'Thêm những bản đồ hình có liên kết dùng thẻ <code>&lt;imagemap&gt;</code>',
+ 'imagemap_no_image' => 'Lỗi: phải đưa tên hình vào dòng đầu tiên',
+ 'imagemap_invalid_image' => 'Lỗi: hình không hợp lệ hay không tồn tại',
+ 'imagemap_bad_image' => 'Lỗi: cấm nhúng hình đó vào trang này',
+ 'imagemap_no_link' => 'Lỗi: không có liên kết hợp lệ ở cuối dòng $1',
+ 'imagemap_invalid_title' => 'Lỗi: văn bản liên kết không hợp lệ ở dòng $1',
+ 'imagemap_missing_coord' => 'Lá»—i: không có đủ tá»a Ä‘á»™ cho vùng ở dòng $1',
+ 'imagemap_unrecognised_shape' => 'Lỗi: không hiểu hình dạng ở dòng $1, mỗi dòng phải bắt đầu với một trong: <code>default</code>, <code>rect</code>, <code>circle</code>, hay <code>poly</code>',
+ 'imagemap_invalid_coord' => 'Lá»—i: tá»a Ä‘á»™ không hợp lệ ở dòng $1, phải là số',
+ 'imagemap_invalid_desc' => 'Lá»—i: chá»n desc không hợp lệ, phải là má»™t trong: $1',
+ 'imagemap_description' => 'Thông tin vỠhình này',
+ 'imagemap_desc_types' => 'trên-phải, dưới-phải, dưới-trái, trên-trái, không',
+ 'imagemap_poly_odd' => 'Lá»—i: Ä‘a giác có tá»a Ä‘á»™ không đầy đủ ở dòng $1',
+);
+
+/** Volapük (Volapük)
+ * @author Malafaya
+ * @author Smeira
+ */
+$messages['vo'] = array(
+ 'imagemap_no_image' => 'Error: lien balid muton keninükön magodanemi',
+ 'imagemap_invalid_image' => 'Error: magod no lonöfon u no dabinon',
+ 'imagemap_bad_image' => 'Pöl: magod binon in blägalised',
+ 'imagemap_no_link' => 'Error: yüm lonöföl no petuvon finü lien: $1',
+ 'imagemap_invalid_title' => 'Error: tiäd no lonöföl pö yüm su lien: $1',
+ 'imagemap_invalid_coord' => 'Error: koordinats no lonöföls su lien $1: mutons binön num',
+ 'imagemap_description' => 'Tefü magod at',
+);
+
+/** Yiddish (ייִדיש)
+ * @author פוילישער
+ */
+$messages['yi'] = array(
+ 'imagemap_desc' => 'דערמעגלעכט קליענט־זײַט בילד מ×פעס מיטן <code>&lt;imagemap&gt;</code> ט×Ö·×’',
+ 'imagemap_no_image' => 'טעות: מען מוז ספעציפיצירן × ×‘×™×œ×“ ×ין דער ערשטער שורה',
+ 'imagemap_invalid_image' => 'טעות: בילד ××™×– ×ומגילטיק ×ָדער נישט פֿ×ַרה×ַנען',
+ 'imagemap_bad_image' => 'טעות: מען ט×ר נישט שטעלן ד×ס בילד ×ויף ×“×¢× ×‘×œ×ט',
+ 'imagemap_no_link' => 'טעות: נישט געטר×פן קיין גילטיקן לינק ×‘×™×™× ×¡×•×£ פון שורה $1',
+ 'imagemap_invalid_title' => 'טעות: ×ומגילטיקער טיטל ×ין פֿ×ַרבינדונג ×ין שורה $1',
+ 'imagemap_missing_coord' => 'טעות: נישט גענוג ק××רדינ×טן פ×ר פ××¨×¢× ×ין שורה $1',
+ 'imagemap_unrecognised_shape' => 'טעות: ×ומב×ק×נטע פ××¨×¢× ×ין שורה $1, יעדע שורה מוז ×נהייבן מיט ××™×™× ×¢× ×¤×•×Ÿ: <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>',
+ 'imagemap_invalid_coord' => 'טעות: ×ומגילטיקער ק××רדינ×ט ×ין שורה $1, מוז זיין × × ×•×ž×¢×¨',
+ 'imagemap_invalid_desc' => 'טעות: ×ומגילטיקע desc פ×ר×מעטער, מוז זיין ×יינער פון: <code>$1</code>',
+ 'imagemap_description' => 'וועגן ×“×¢× ×‘×™×œ×“',
+ 'imagemap_poly_odd' => 'טעות: געטר×פן poly מיט נומיקער צ×ל ק××רדינ×טן ×ין שורה $1',
+);
+
+/** Yoruba (Yorùbá)
+ * @author Demmy
+ */
+$messages['yo'] = array(
+ 'imagemap_no_image' => 'Àsìṣe: àwòrán gbá»Ìdá»Ì€ jáº¹Ì títá»Ìkasí ní inú ìlà àká»Ìká»Ì',
+ 'imagemap_missing_coord' => 'Àsìṣe: àwá»n ajá»fá»Ì€nàkò kò tó fún síṣerí ní ìlà $1',
+ 'imagemap_description' => 'Nípa àwòrán yìí',
+);
+
+/** Cantonese (粵語)
+ * @author Shinjiman
+ */
+$messages['yue'] = array(
+ 'imagemap_desc' => '容許客戶端å¯ä»¥ç”¨<code>&lt;imagemap&gt;</code>標籤整å¯æ’³åœ–åƒåœ°åœ–',
+ 'imagemap_no_image' => '錯誤: 一定è¦éŸ¿ç¬¬ä¸€è¡ŒæŒ‡å®šä¸€å¹…圖åƒ',
+ 'imagemap_invalid_image' => '錯誤: 圖åƒå””正確或者唔存在',
+ 'imagemap_bad_image' => '錯誤: 圖åƒéŸ¿å‘¢ä¸€ç‰ˆå·²ç¶“列入咗黑å單度',
+ 'imagemap_no_link' => '錯誤: 響第$1è¡Œçµå°¾åº¦æµå””到一個正å¼å˜…連çµ',
+ 'imagemap_invalid_title' => '錯誤: 響第$1行度嘅標題連çµå””正確',
+ 'imagemap_missing_coord' => '錯誤: 響第$1行度未有足夠嘅座標組æˆä¸€å€‹å½¢ç‹€',
+ 'imagemap_unrecognised_shape' => '錯誤: 響第$1行度有未能èªå‡ºå˜…形狀,æ¯ä¸€è¡Œä¸€å®šè¦ç”¨ä»¥ä¸‹å…¶ä¸­ä¸€æ¨£é–‹å§‹: <code>default</code>, <code>rect</code>, <code>circle</code> 或者係 <code>poly</code>',
+ 'imagemap_invalid_coord' => '錯誤: 響第$1行度有唔正確嘅座標,佢一定係一個數字',
+ 'imagemap_invalid_desc' => '錯誤: 唔正確嘅 desc åƒæ•¸ï¼Œä¸€å®šä¿‚è¦ä»¥ä¸‹å˜…其中之一: $1',
+ 'imagemap_description' => '關於呢幅圖åƒ',
+ 'imagemap_desc_types' => 'å³ä¸Š, å³ä¸‹, 左下, 左上, ç„¡',
+ 'imagemap_poly_odd' => '錯誤: 響第$1è¡Œæµåˆ°å–®æ•¸å˜…多邊å標',
+);
+
+/** Simplified Chinese (中文(简体)‎)
+ * @author Shinjiman
+ */
+$messages['zh-hans'] = array(
+ 'imagemap_desc' => '容许客户端å¯ä»¥ä½¿ç”¨<code>&lt;imagemap&gt;</code>标签整å¯ç‚¹å‡»å›¾åƒåœ°å›¾',
+ 'imagemap_no_image' => '错误: å¿…é¡»è¦åœ¨ç¬¬ä¸€è¡ŒæŒ‡å®šä¸€å¹…图åƒ',
+ 'imagemap_invalid_image' => '错误: 图åƒä¸æ­£ç¡®æˆ–者ä¸å­˜åœ¨',
+ 'imagemap_bad_image' => '错误: 图åƒå·²è¢«æœ¬é¡µåˆ—入黑åå•å†…',
+ 'imagemap_no_link' => '错误: 在第$1行结尾中找ä¸åˆ°ä¸€ä¸ªæ­£å¼çš„链接',
+ 'imagemap_invalid_title' => '错误: 在第$1行中的标题链接ä¸æ­£ç¡®',
+ 'imagemap_missing_coord' => '错误: 在第$1行中未有足够的座标组æˆä¸€ä¸ªå½¢çŠ¶',
+ 'imagemap_unrecognised_shape' => '错误: 在第$1行中有未能认出的形状,æ¯ä¸€è¡Œå¿…须使用以下其中一组字开始: <code>default</code>, <code>rect</code>, <code>circle</code> 或者是 <code>poly</code>',
+ 'imagemap_invalid_coord' => '错误: 在第$1行中有ä¸æ­£ç¡®çš„座标,它必须是一个数字',
+ 'imagemap_invalid_desc' => '错误: ä¸æ­£ç¡®çš„ desc å‚数,必须是以下的其中之一: $1',
+ 'imagemap_description' => '关于这幅图åƒ',
+ 'imagemap_desc_types' => 'å³ä¸Š, å³ä¸‹, 左下, 左上, æ— ',
+ 'imagemap_poly_odd' => '错误: 在第$1行找到å•æ•°çš„多边åæ ‡',
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Mark85296341
+ * @author Shinjiman
+ * @author Tomchiukc
+ */
+$messages['zh-hant'] = array(
+ 'imagemap_desc' => '容許客戶端å¯ä»¥ä½¿ç”¨<code>&lt;imagemap&gt;</code>標籤整å¯é»žæ“Šåœ–片地圖',
+ 'imagemap_no_image' => '錯誤:必須è¦åœ¨ç¬¬ä¸€è¡ŒæŒ‡å®šä¸€å¹…圖片',
+ 'imagemap_invalid_image' => '錯誤:圖片ä¸æ­£ç¢ºæˆ–者ä¸å­˜åœ¨',
+ 'imagemap_bad_image' => '錯誤:圖片已被本é åˆ—入黑å單內',
+ 'imagemap_no_link' => '錯誤:在第 $1 è¡Œçµå°¾ä¸­æ‰¾ä¸åˆ°ä¸€å€‹æ­£å¼çš„連çµ',
+ 'imagemap_invalid_title' => '錯誤:在第 $1 行中的標題連çµä¸æ­£ç¢º',
+ 'imagemap_missing_coord' => '錯誤:在第 $1 行中未有足夠的座標組æˆä¸€å€‹å½¢ç‹€',
+ 'imagemap_unrecognised_shape' => '錯誤:在第 $1 行中有未能èªå‡ºçš„形狀,æ¯ä¸€è¡Œå¿…須使用以下其中一組字開始:<code>default</code>, <code>rect</code>, <code>circle</code> 或者是 <code>poly</code>',
+ 'imagemap_invalid_coord' => '錯誤:在第 $1 行中有ä¸æ­£ç¢ºçš„座標,它必須是一個數字',
+ 'imagemap_invalid_desc' => '錯誤:ä¸æ­£ç¢ºçš„ desc åƒæ•¸ï¼Œå¿…須是以下的其中之一:$1',
+ 'imagemap_description' => '關於這幅圖片',
+ 'imagemap_desc_types' => 'å³ä¸Š, å³ä¸‹, 左下, 左上, ç„¡',
+ 'imagemap_poly_odd' => '錯誤:在第 $1 行找到單數的多邊å標',
+);
diff --git a/extensions/ImageMap/ImageMap.php b/extensions/ImageMap/ImageMap.php
new file mode 100644
index 00000000..aa4cfa0d
--- /dev/null
+++ b/extensions/ImageMap/ImageMap.php
@@ -0,0 +1,23 @@
+<?php
+
+$dir = __DIR__ . '/';
+$wgExtensionMessagesFiles['ImageMap'] = $dir . 'ImageMap.i18n.php';
+$wgAutoloadClasses['ImageMap'] = $dir . 'ImageMap_body.php';
+$wgHooks['ParserFirstCallInit'][] = 'wfSetupImageMap';
+
+$wgExtensionCredits['parserhook']['ImageMap'] = array(
+ 'path' => __FILE__,
+ 'name' => 'ImageMap',
+ 'author' => 'Tim Starling',
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:ImageMap',
+ 'descriptionmsg' => 'imagemap_desc',
+);
+
+/**
+ * @param $parser Parser
+ * @return bool
+ */
+function wfSetupImageMap( &$parser ) {
+ $parser->setHook( 'imagemap', array( 'ImageMap', 'render' ) );
+ return true;
+}
diff --git a/extensions/ImageMap/ImageMap_body.php b/extensions/ImageMap/ImageMap_body.php
new file mode 100644
index 00000000..e67b4426
--- /dev/null
+++ b/extensions/ImageMap/ImageMap_body.php
@@ -0,0 +1,391 @@
+<?php
+
+/**
+ * Image map extension.
+ *
+ * Syntax:
+ * <imagemap>
+ * Image:Foo.jpg | 100px | picture of a foo
+ *
+ * rect 0 0 50 50 [[Foo type A]]
+ * circle 50 50 20 [[Foo type B]]
+ *
+ * desc bottom-left
+ * </imagemap>
+ *
+ * Coordinates are relative to the source image, not the thumbnail
+ *
+ */
+
+class ImageMap {
+ static public $id = 0;
+
+ const TOP_RIGHT = 0;
+ const BOTTOM_RIGHT = 1;
+ const BOTTOM_LEFT = 2;
+ const TOP_LEFT = 3;
+ const NONE = 4;
+
+ /**
+ * @param $input
+ * @param $params
+ * @param $parser Parser
+ * @return array|mixed|string
+ */
+ public static function render( $input, $params, $parser ) {
+ global $wgExtensionAssetsPath, $wgUrlProtocols, $wgNoFollowLinks;
+
+ $lines = explode( "\n", $input );
+
+ $first = true;
+ $lineNum = 0;
+ $mapHTML = '';
+ $links = array();
+
+ # Define canonical desc types to allow i18n of 'imagemap_desc_types'
+ $descTypesCanonical = 'top-right, bottom-right, bottom-left, top-left, none';
+ $descType = self::BOTTOM_RIGHT;
+ $defaultLinkAttribs = false;
+ $realmap = true;
+ $extLinks = array();
+ foreach ( $lines as $line ) {
+ ++$lineNum;
+ $externLink = false;
+
+ $line = trim( $line );
+ if ( $line == '' || $line[0] == '#' ) {
+ continue;
+ }
+
+ if ( $first ) {
+ $first = false;
+
+ # The first line should have an image specification on it
+ # Extract it and render the HTML
+ $bits = explode( '|', $line, 2 );
+ if ( count( $bits ) == 1 ) {
+ $image = $bits[0];
+ $options = '';
+ } else {
+ list( $image, $options ) = $bits;
+ }
+ $imageTitle = Title::newFromText( $image );
+ if ( !$imageTitle || $imageTitle->getNamespace() != NS_IMAGE ) {
+ return self::error( 'imagemap_no_image' );
+ }
+ if ( wfIsBadImage( $imageTitle->getDBkey(), $parser->mTitle ) ) {
+ return self::error( 'imagemap_bad_image' );
+ }
+ // Parse the options so we can use links and the like in the caption
+ $parsedOptions = $parser->recursiveTagParse( $options );
+ $imageHTML = $parser->makeImage( $imageTitle, $parsedOptions );
+ $parser->replaceLinkHolders( $imageHTML );
+ $imageHTML = $parser->mStripState->unstripBoth( $imageHTML );
+ $imageHTML = Sanitizer::normalizeCharReferences( $imageHTML );
+
+ $domDoc = new DOMDocument();
+ wfSuppressWarnings();
+ $ok = $domDoc->loadXML( $imageHTML );
+ wfRestoreWarnings();
+ if ( !$ok ) {
+ return self::error( 'imagemap_invalid_image' );
+ }
+ $xpath = new DOMXPath( $domDoc );
+ $imgs = $xpath->query( '//img' );
+ if ( !$imgs->length ) {
+ return self::error( 'imagemap_invalid_image' );
+ }
+ $imageNode = $imgs->item( 0 );
+ $thumbWidth = $imageNode->getAttribute( 'width' );
+ $thumbHeight = $imageNode->getAttribute( 'height' );
+
+ $imageObj = wfFindFile( $imageTitle );
+ if ( !$imageObj || !$imageObj->exists() ) {
+ return self::error( 'imagemap_invalid_image' );
+ }
+ # Add the linear dimensions to avoid inaccuracy in the scale
+ # factor when one is much larger than the other
+ # (sx+sy)/(x+y) = s
+ $denominator = $imageObj->getWidth() + $imageObj->getHeight();
+ $numerator = $thumbWidth + $thumbHeight;
+ if ( $denominator <= 0 || $numerator <= 0 ) {
+ return self::error( 'imagemap_invalid_image' );
+ }
+ $scale = $numerator / $denominator;
+ continue;
+ }
+
+ # Handle desc spec
+ $cmd = strtok( $line, " \t" );
+ if ( $cmd == 'desc' ) {
+ $typesText = wfMessage( 'imagemap_desc_types' )->inContentLanguage()->text();
+ if ( $descTypesCanonical != $typesText ) {
+ // i18n desc types exists
+ $typesText = $descTypesCanonical . ', ' . $typesText;
+ }
+ $types = array_map( 'trim', explode( ',', $typesText ) );
+ $type = trim( strtok( '' ) );
+ $descType = array_search( $type, $types );
+ if ( $descType > 4 ) {
+ // A localized descType is used. Subtract 5 to reach the canonical desc type.
+ $descType = $descType - 5;
+ }
+ if ( $descType === false || $descType < 0 ) { // <0? In theory never, but paranoia...
+ return self::error( 'imagemap_invalid_desc', $typesText );
+ }
+ continue;
+ }
+
+ # Find the link
+ $link = trim( strstr( $line, '[' ) );
+ $m = array();
+ if ( preg_match( '/^ \[\[ ([^|]*+) \| ([^\]]*+) \]\] \w* $ /x', $link, $m ) ) {
+ $title = Title::newFromText( $m[1] );
+ $alt = trim( $m[2] );
+ } elseif ( preg_match( '/^ \[\[ ([^\]]*+) \]\] \w* $ /x', $link, $m ) ) {
+ $title = Title::newFromText( $m[1] );
+ if ( is_null( $title ) ) {
+ return self::error( 'imagemap_invalid_title', $lineNum );
+ }
+ $alt = $title->getFullText();
+ } elseif ( in_array( substr( $link, 1, strpos( $link, '//' ) + 1 ), $wgUrlProtocols ) || in_array( substr( $link, 1, strpos( $link, ':' ) ), $wgUrlProtocols ) ) {
+ if ( preg_match( '/^ \[ ([^\s]*+) \s ([^\]]*+) \] \w* $ /x', $link, $m ) ) {
+ $title = $m[1];
+ $alt = trim( $m[2] );
+ $externLink = true;
+ } elseif ( preg_match( '/^ \[ ([^\]]*+) \] \w* $ /x', $link, $m ) ) {
+ $title = $alt = trim( $m[1] );
+ $externLink = true;
+ }
+ } else {
+ return self::error( 'imagemap_no_link', $lineNum );
+ }
+ if ( !$title ) {
+ return self::error( 'imagemap_invalid_title', $lineNum );
+ }
+
+ $shapeSpec = substr( $line, 0, -strlen( $link ) );
+
+ # Tokenize shape spec
+ $shape = strtok( $shapeSpec, " \t" );
+ switch ( $shape ) {
+ case 'default':
+ $coords = array();
+ break;
+ case 'rect':
+ $coords = self::tokenizeCoords( 4, $lineNum );
+ if ( !is_array( $coords ) ) {
+ return $coords;
+ }
+ break;
+ case 'circle':
+ $coords = self::tokenizeCoords( 3, $lineNum );
+ if ( !is_array( $coords ) ) {
+ return $coords;
+ }
+ break;
+ case 'poly':
+ $coords = array();
+ $coord = strtok( " \t" );
+ while ( $coord !== false ) {
+ $coords[] = $coord;
+ $coord = strtok( " \t" );
+ }
+ if ( !count( $coords ) ) {
+ return self::error( 'imagemap_missing_coord', $lineNum );
+ }
+ if ( count( $coords ) % 2 !== 0 ) {
+ return self::error( 'imagemap_poly_odd', $lineNum );
+ }
+ break;
+ default:
+ return self::error( 'imagemap_unrecognised_shape', $lineNum );
+ }
+
+ # Scale the coords using the size of the source image
+ foreach ( $coords as $i => $c ) {
+ $coords[$i] = intval( round( $c * $scale ) );
+ }
+
+ # Construct the area tag
+ $attribs = array();
+ if ( $externLink ) {
+ $attribs['href'] = $title;
+ $attribs['class'] = 'plainlinks';
+ if ( $wgNoFollowLinks ) {
+ $attribs['rel'] = 'nofollow';
+ }
+ } elseif ( $title->getFragment() != '' && $title->getPrefixedDBkey() == '' ) {
+ # XXX: kluge to handle [[#Fragment]] links, should really fix getLocalURL()
+ # in Title.php to return an empty string in this case
+ $attribs['href'] = $title->getFragmentForURL();
+ } else {
+ $attribs['href'] = $title->getLocalURL() . $title->getFragmentForURL();
+ }
+ if ( $shape != 'default' ) {
+ $attribs['shape'] = $shape;
+ }
+ if ( $coords ) {
+ $attribs['coords'] = implode( ',', $coords );
+ }
+ if ( $alt != '' ) {
+ if ( $shape != 'default' ) {
+ $attribs['alt'] = $alt;
+ }
+ $attribs['title'] = $alt;
+ }
+ if ( $shape == 'default' ) {
+ $defaultLinkAttribs = $attribs;
+ } else {
+ $mapHTML .= Xml::element( 'area', $attribs ) . "\n";
+ }
+ if ( $externLink ) {
+ $extLinks[] = $title;
+ } else {
+ $links[] = $title;
+ }
+ }
+
+ if ( $first ) {
+ return self::error( 'imagemap_no_image' );
+ }
+
+ if ( $mapHTML == '' ) {
+ // no areas defined, default only. It's not a real imagemap, so we do not need some tags
+ $realmap = false;
+ }
+
+ if ( $realmap ) {
+ # Construct the map
+ # Add random number to avoid breaking cached HTML fragments that are
+ # later joined together on the one page (bug 16471)
+ $mapName = "ImageMap_" . ++self::$id . '_' . mt_rand( 0, 0x7fffffff );
+ $mapHTML = "<map name=\"$mapName\">\n$mapHTML</map>\n";
+
+ # Alter the image tag
+ $imageNode->setAttribute( 'usemap', "#$mapName" );
+ }
+
+ # Add a surrounding div, remove the default link to the description page
+ $anchor = $imageNode->parentNode;
+ $parent = $anchor->parentNode;
+ $div = $parent->insertBefore( new DOMElement( 'div' ), $anchor );
+ $div->setAttribute( 'class', 'noresize' );
+ if ( $defaultLinkAttribs ) {
+ $defaultAnchor = $div->appendChild( new DOMElement( 'a' ) );
+ foreach ( $defaultLinkAttribs as $name => $value ) {
+ $defaultAnchor->setAttribute( $name, $value );
+ }
+ $imageParent = $defaultAnchor;
+ } else {
+ $imageParent = $div;
+ }
+
+ # Add the map HTML to the div
+ # We used to add it before the div, but that made tidy unhappy
+ if ( $mapHTML != '' ) {
+ $mapDoc = new DOMDocument();
+ $mapDoc->loadXML( $mapHTML );
+ $mapNode = $domDoc->importNode( $mapDoc->documentElement, true );
+ $div->appendChild( $mapNode );
+ }
+
+ $imageParent->appendChild( $imageNode->cloneNode( true ) );
+ $parent->removeChild( $anchor );
+
+ # Determine whether a "magnify" link is present
+ $xpath = new DOMXPath( $domDoc );
+ $magnify = $xpath->query( '//div[@class="magnify"]' );
+ if ( !$magnify->length && $descType != self::NONE ) {
+ # Add image description link
+ if ( $descType == self::TOP_LEFT || $descType == self::BOTTOM_LEFT ) {
+ $marginLeft = 0;
+ } else {
+ $marginLeft = $thumbWidth - 20;
+ }
+ if ( $descType == self::TOP_LEFT || $descType == self::TOP_RIGHT ) {
+ $marginTop = -$thumbHeight;
+ // 1px hack for IE, to stop it poking out the top
+ $marginTop += 1;
+ } else {
+ $marginTop = -20;
+ }
+ $div->setAttribute( 'style', "height: {$thumbHeight}px; width: {$thumbWidth}px; " );
+ $descWrapper = $div->appendChild( new DOMElement( 'div' ) );
+ $descWrapper->setAttribute( 'style',
+ "margin-left: {$marginLeft}px; " .
+ "margin-top: {$marginTop}px; " .
+ "text-align: left;"
+ );
+
+ $descAnchor = $descWrapper->appendChild( new DOMElement( 'a' ) );
+ $descAnchor->setAttribute( 'href', $imageTitle->getLocalURL() );
+ $descAnchor->setAttribute(
+ 'title',
+ wfMessage( 'imagemap_description' )->inContentLanguage()->text()
+ );
+ $descImg = $descAnchor->appendChild( new DOMElement( 'img' ) );
+ $descImg->setAttribute(
+ 'alt',
+ wfMessage( 'imagemap_description' )->inContentLanguage()->text()
+ );
+ $descImg->setAttribute( 'src', "$wgExtensionAssetsPath/ImageMap/desc-20.png" );
+ $descImg->setAttribute( 'style', 'border: none;' );
+ }
+
+ # Output the result
+ # We use saveXML() not saveHTML() because then we get XHTML-compliant output.
+ # The disadvantage is that we have to strip out the DTD
+ $output = preg_replace( '/<\?xml[^?]*\?>/', '', $domDoc->saveXML() );
+
+ # Register links
+ foreach ( $links as $title ) {
+ if ( $title->isExternal() || $title->getNamespace() == NS_SPECIAL ) {
+ // Don't register special or interwiki links...
+ } elseif ( $title->getNamespace() == NS_MEDIA ) {
+ // Regular Media: links are recorded as image usages
+ $parser->mOutput->addImage( $title->getDBkey() );
+ } else {
+ // Plain ol' link
+ $parser->mOutput->addLink( $title );
+ }
+ }
+ if ( isset( $extLinks ) ) {
+ foreach ( $extLinks as $title ) {
+ $parser->mOutput->addExternalLink( $title );
+ }
+ }
+ # Armour output against broken parser
+ $output = str_replace( "\n", '', $output );
+ return $output;
+ }
+
+ /**
+ * @param $count int
+ * @param $lineNum int|string
+ * @return array|string
+ */
+ static function tokenizeCoords( $count, $lineNum ) {
+ $coords = array();
+ for ( $i = 0; $i < $count; $i++ ) {
+ $coord = strtok( " \t" );
+ if ( $coord === false ) {
+ return self::error( 'imagemap_missing_coord', $lineNum );
+ }
+ if ( !is_numeric( $coord ) || $coord > 1e9 || $coord < 0 ) {
+ return self::error( 'imagemap_invalid_coord', $lineNum );
+ }
+ $coords[$i] = $coord;
+ }
+ return $coords;
+ }
+
+ /**
+ * @param $name string
+ * @param $line string|int|bool
+ * @return string
+ */
+ static function error( $name, $line = false ) {
+ return '<p class="error">' . wfMessage( $name, $line )->text() . '</p>';
+ }
+}
diff --git a/extensions/ImageMap/desc-20.png b/extensions/ImageMap/desc-20.png
new file mode 100644
index 00000000..2f7d940b
--- /dev/null
+++ b/extensions/ImageMap/desc-20.png
Binary files differ
diff --git a/extensions/ImageMap/desc.svg b/extensions/ImageMap/desc.svg
new file mode 100644
index 00000000..f86ea359
--- /dev/null
+++ b/extensions/ImageMap/desc.svg
@@ -0,0 +1,299 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="desc.svg"
+ version="1.1"
+ inkscape:export-filename="/Users/tparscal/Desktop/imageMap.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient3615">
+ <stop
+ style="stop-color:#50a3ff;stop-opacity:1;"
+ offset="0"
+ id="stop3617" />
+ <stop
+ style="stop-color:#0051ab;stop-opacity:1;"
+ offset="1"
+ id="stop3619" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5219">
+ <stop
+ style="stop-color:#8b8b8b;stop-opacity:1;"
+ offset="0"
+ id="stop5221" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1;"
+ offset="1"
+ id="stop5223" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5183">
+ <stop
+ style="stop-color:#1282ff;stop-opacity:1;"
+ offset="0"
+ id="stop5185" />
+ <stop
+ style="stop-color:#0a7eff;stop-opacity:0.184;"
+ offset="1"
+ id="stop5187" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5140">
+ <stop
+ style="stop-color:#008bff;stop-opacity:1;"
+ offset="0"
+ id="stop5142" />
+ <stop
+ style="stop-color:#003452;stop-opacity:0;"
+ offset="1"
+ id="stop5144" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2904">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2906" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop2908" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective13" />
+ <inkscape:perspective
+ id="perspective2832"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective2857"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective2882"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective2882-0"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5183"
+ id="radialGradient5191"
+ cx="421.42856"
+ cy="694.62939"
+ fx="421.42856"
+ fy="694.62939"
+ r="311.18631"
+ gradientTransform="matrix(2.2098429,-3.3268405e-8,2.0370692e-8,1.31418,-509.86238,-221.41781)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2904"
+ id="linearGradient5203"
+ x1="421.42856"
+ y1="770.5788"
+ x2="421.42856"
+ y2="157.00269"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2904"
+ id="linearGradient5207"
+ gradientUnits="userSpaceOnUse"
+ x1="421.42856"
+ y1="770.5788"
+ x2="421.42856"
+ y2="157.00269" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2904"
+ id="linearGradient5210"
+ gradientUnits="userSpaceOnUse"
+ x1="421.42856"
+ y1="770.5788"
+ x2="421.42856"
+ y2="157.00269" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2904"
+ id="linearGradient5212"
+ gradientUnits="userSpaceOnUse"
+ x1="421.42856"
+ y1="770.5788"
+ x2="421.42856"
+ y2="157.00269"
+ gradientTransform="matrix(1.014493,0,0,1.029412,-127.53624,-175.0696)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2904"
+ id="linearGradient5217"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.014493,0,0,1.029412,-107.53624,-157.92674)"
+ x1="421.42856"
+ y1="770.5788"
+ x2="421.42856"
+ y2="157.00269" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5219"
+ id="linearGradient5225"
+ x1="421.42856"
+ y1="768.92761"
+ x2="421.42856"
+ y2="158.65387"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3615"
+ id="radialGradient3621"
+ cx="421.42856"
+ cy="463.79074"
+ fx="421.42856"
+ fy="463.79074"
+ r="303.84723"
+ gradientTransform="matrix(1,0,0,1.0042444,0,-1.968506)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ inkscape:collect="always"
+ id="filter3631"
+ x="-0.1165843"
+ width="1.2331686"
+ y="-0.065459239"
+ height="1.1309185">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="10.301636"
+ id="feGaussianBlur3633" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.35"
+ inkscape:cx="108.91681"
+ inkscape:cy="358.30213"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer3"
+ inkscape:window-width="1920"
+ inkscape:window-height="1075"
+ inkscape:window-x="1440"
+ inkscape:window-y="0"
+ showgrid="false"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Base"
+ inkscape:groupmode="layer"
+ id="layer1"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient3621);fill-opacity:1;stroke:url(#linearGradient5225);stroke-width:27.61747932;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path1872"
+ sodipodi:cx="421.42856"
+ sodipodi:cy="463.79074"
+ sodipodi:rx="295.71429"
+ sodipodi:ry="291.42856"
+ d="m 717.14285,463.79074 a 295.71429,291.42856 0 1 1 -591.42859,0 295.71429,291.42856 0 1 1 591.42859,0 z"
+ transform="matrix(1.014493,0,0,1.029412,-107.53624,-157.92674)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Refraction"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ transform="matrix(1.014493,0,0,1.029412,-107.53624,-157.92674)"
+ d="m 717.14285,463.79074 a 295.71429,291.42856 0 1 1 -591.42859,0 295.71429,291.42856 0 1 1 591.42859,0 z"
+ sodipodi:ry="291.42856"
+ sodipodi:rx="295.71429"
+ sodipodi:cy="463.79074"
+ sodipodi:cx="421.42856"
+ id="path5180"
+ style="opacity:0.79111113;fill:url(#radialGradient5191);fill-opacity:1;stroke:none;display:inline"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Reflection"
+ style="display:inline"
+ sodipodi:insensitive="true">
+ <path
+ style="opacity:0.3288889;fill:url(#linearGradient5217);fill-opacity:1;stroke:none;display:inline"
+ d="m 320,19.517857 c -165.68547,0 -300,134.314543 -300,300.000003 0,21.41886 2.264366,42.28957 6.53125,62.4375 C 106.0102,338.98527 208.33367,313.11161 320,313.11161 c 111.66633,0 213.9898,25.87366 293.46875,68.84375 C 617.73563,361.80743 620,340.93672 620,319.51786 620,153.8324 485.68547,19.517857 320,19.517857 z"
+ id="path5193" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="Italic &quot;i&quot;"
+ style="display:inline">
+ <path
+ id="path2820"
+ style="font-size:144px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:0.17777782;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter3631);font-family:Times New Roman"
+ d="m 370.95661,140.65523 c 15.48657,3.7e-4 28.47549,3.8263 38.96675,11.4778 10.7406,7.65219 16.111,16.9056 16.11127,27.76025 -2.7e-4,10.85529 -5.37067,20.10867 -16.11127,27.76025 -10.74102,7.65215 -23.72994,11.47807 -38.96675,11.47777 -14.98738,3e-4 -27.85138,-3.82562 -38.59209,-11.47777 -10.74096,-7.65158 -16.11137,-16.90496 -16.11127,-27.76025 -10e-5,-10.85465 5.24545,-20.10806 15.73661,-27.76025 10.7407,-7.6515 23.72961,-11.47743 38.96675,-11.4778 m 23.23015,122.78572 -76.80945,189.78403 c -4.24645,10.85499 -6.36966,17.973 -6.36955,21.35404 -1.1e-4,1.95747 1.12395,3.82596 3.37211,5.60542 2.248,1.60157 4.62096,2.40236 7.11894,2.40232 4.24624,4e-5 8.49265,-1.33457 12.7391,-4.00388 11.24028,-6.58411 24.72877,-18.50676 40.46547,-35.76801 l 12.73917,5.33852 c -37.71796,46.80095 -77.80871,70.20137 -120.27237,70.20141 -16.23624,-4e-5 -29.2251,-3.20315 -38.96676,-9.60932 -9.49195,-6.58418 -14.23788,-14.85885 -14.23788,-24.8241 0,-6.5841 2.12321,-14.94779 6.36955,-25.09098 l 52.08058,-127.59039 c 4.99569,-12.27837 7.49356,-21.53179 7.49361,-27.76026 -5e-5,-3.91468 -2.37302,-7.3847 -7.11894,-10.41007 -4.74598,-3.02494 -11.24044,-4.53753 -19.48338,-4.53775 -3.74682,2.2e-4 -8.24299,0.0892 -13.48849,0.26688 l 4.87088,-10.67703 127.01659,-14.68091 22.48082,0"
+ transform="matrix(1.0936445,0,0,1.0936445,-29.966243,-30.856327)" />
+ <path
+ d="m 369.16654,116.40862 c 16.9368,4.1e-4 31.14206,4.18461 42.61577,12.55264 11.7464,8.36877 17.61971,18.48871 17.62,30.35984 -2.9e-4,11.87183 -5.8736,21.99174 -17.62,30.35984 -11.74686,8.36874 -25.95212,12.55293 -42.61577,12.5526 -16.39086,3.3e-4 -30.45951,-4.18386 -42.20603,-12.5526 -11.74679,-8.3681 -17.62011,-18.48801 -17.62,-30.35984 -1.1e-4,-11.87113 5.73666,-21.99107 17.21026,-30.35984 11.74651,-8.36803 25.95176,-12.55223 42.61577,-12.55264 m 25.40553,134.28393 -84.00224,207.55626 c -4.6441,11.8715 -6.96614,19.65607 -6.96602,23.35372 -1.2e-4,2.14078 1.2292,4.18424 3.68789,6.13034 2.45851,1.75155 5.05369,2.62733 7.78559,2.62728 4.64388,5e-5 9.28794,-1.45954 13.93205,-4.37882 12.29287,-7.20067 27.04448,-20.23981 44.25483,-39.11748 l 13.93213,5.83844 c -41.25004,51.1836 -85.09507,76.77534 -131.53522,76.77538 -17.75667,-4e-5 -31.96187,-3.5031 -42.61578,-10.50918 -10.38082,-7.20075 -15.57118,-16.2503 -15.57118,-27.14874 0,-7.20066 2.32204,-16.34756 6.96603,-27.44061 l 56.95764,-139.53852 c 5.4635,-13.42818 8.19529,-23.54813 8.19534,-30.35986 -5e-5,-4.28127 -2.59524,-8.07624 -7.78559,-11.38492 -5.19041,-3.3082 -12.29304,-4.96244 -21.30789,-4.96268 -4.09769,2.4e-4 -9.0149,0.0976 -14.75161,0.29187 l 5.32701,-11.67687 138.91099,-16.0557 24.58603,0"
+ style="font-size:144px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Times New Roman"
+ id="path5215" />
+ </g>
+</svg>
diff --git a/extensions/InputBox/InputBox.classes.php b/extensions/InputBox/InputBox.classes.php
new file mode 100644
index 00000000..380015cc
--- /dev/null
+++ b/extensions/InputBox/InputBox.classes.php
@@ -0,0 +1,593 @@
+<?php
+/**
+ * Classes for InputBox extension
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+// InputBox class
+class InputBox {
+
+ /* Fields */
+
+ private $mParser;
+ private $mType = '';
+ private $mWidth = 50;
+ private $mPreload = '';
+ private $mEditIntro = '';
+ private $mSummary = '';
+ private $mNosummary = '';
+ private $mMinor = '';
+ private $mPage = '';
+ private $mBR = 'yes';
+ private $mDefaultText = '';
+ private $mPlaceholderText = '';
+ private $mBGColor = 'transparent';
+ private $mButtonLabel = '';
+ private $mSearchButtonLabel = '';
+ private $mFullTextButton = '';
+ private $mLabelText = '';
+ private $mHidden = '';
+ private $mNamespaces = '';
+ private $mID = '';
+ private $mInline = false;
+ private $mPrefix = '';
+ private $mDir = '';
+
+ /* Functions */
+
+ public function __construct( $parser ) {
+ $this->mParser = $parser;
+ // Default value for dir taken from the page language (bug 37018)
+ $this->mDir = $this->mParser->getTargetLanguage()->getDir();
+ // Split caches by language, to make sure visitors do not see a cached
+ // version in a random language (since labels are in the user language)
+ $this->mParser->getOptions()->getUserLangObj();
+ }
+
+ public function render() {
+ // Handle various types
+ switch( $this->mType ) {
+ case 'create':
+ case 'comment':
+ return $this->getCreateForm();
+ case 'commenttitle':
+ return $this->getCommentForm();
+ case 'search':
+ return $this->getSearchForm('search');
+ case 'fulltext':
+ return $this->getSearchForm('fulltext');
+ case 'search2':
+ return $this->getSearchForm2();
+ default:
+ return Xml::tags( 'div', null,
+ Xml::element( 'strong',
+ array(
+ 'class' => 'error'
+ ),
+ strlen( $this->mType ) > 0
+ ? wfMessage( 'inputbox-error-bad-type', $this->mType )->text()
+ : wfMessage( 'inputbox-error-no-type' )->text()
+ )
+ );
+ }
+ }
+
+ /**
+ * Generate search form
+ * @param $type
+ * @return string HTML
+ */
+ public function getSearchForm( $type ) {
+ global $wgContLang, $wgNamespaceAliases;
+
+ // Use button label fallbacks
+ if ( !$this->mButtonLabel ) {
+ $this->mButtonLabel = wfMessage( 'tryexact' )->escaped();
+ }
+ if ( !$this->mSearchButtonLabel ) {
+ $this->mSearchButtonLabel = wfMessage( 'searchfulltext' )->escaped();
+ }
+
+ // Build HTML
+ $htmlOut = Xml::openElement( 'div',
+ array(
+ 'style' => 'margin-left: auto; margin-right: auto; text-align: center; background-color:' . $this->mBGColor
+ )
+ );
+ $htmlOut .= Xml::openElement( 'form',
+ array(
+ 'name' => 'searchbox',
+ 'id' => 'searchbox',
+ 'class' => 'searchbox',
+ 'action' => SpecialPage::getTitleFor( 'Search' )->escapeLocalUrl(),
+ )
+ );
+ $htmlOut .= Xml::element( 'input',
+ array(
+ 'class' => 'searchboxInput',
+ 'name' => 'search',
+ 'type' => $this->mHidden ? 'hidden' : 'text',
+ 'value' => $this->mDefaultText,
+ 'placeholder' => $this->mPlaceholderText,
+ 'size' => $this->mWidth,
+ 'dir' => $this->mDir,
+ )
+ );
+
+ if( $this->mPrefix != '' ){
+ $htmlOut .= Xml::element( 'input',
+ array(
+ 'name' => 'prefix',
+ 'type' => 'hidden',
+ 'value' => $this->mPrefix,
+ )
+ );
+ }
+
+ $htmlOut .= $this->mBR;
+
+ // Determine namespace checkboxes
+ $namespacesArray = explode( ',', $this->mNamespaces );
+ if ( $this->mNamespaces ) {
+ $namespaces = $wgContLang->getNamespaces();
+ $nsAliases = array_merge( $wgContLang->getNamespaceAliases(), $wgNamespaceAliases );
+ $showNamespaces = array();
+ $checkedNS = array();
+ # Check for valid namespaces
+ foreach ( $namespacesArray as $userNS ) {
+ $userNS = trim( $userNS ); # no whitespace
+
+ # Namespace needs to be checked if flagged with "**"
+ if ( strpos( $userNS, '**' ) ) {
+ $userNS = str_replace( '**', '', $userNS );
+ $checkedNS[$userNS] = true;
+ }
+
+ $mainMsg = wfMessage( 'inputbox-ns-main' )->inContentLanguage()->text();
+ if( $userNS == 'Main' || $userNS == $mainMsg ) {
+ $i = 0;
+ } elseif( array_search( $userNS, $namespaces ) ) {
+ $i = array_search( $userNS, $namespaces );
+ } elseif ( isset( $nsAliases[$userNS] ) ) {
+ $i = $nsAliases[$userNS];
+ } else {
+ continue; # Namespace not recognized, skip
+ }
+ $showNamespaces[$i] = $userNS;
+ if( isset( $checkedNS[$userNS] ) && $checkedNS[$userNS] ) {
+ $checkedNS[$i] = true;
+ }
+ }
+
+ # Show valid namespaces
+ foreach( $showNamespaces as $i => $name ) {
+ $checked = array();
+ // Namespace flagged with "**" or if it's the only one
+ if ( ( isset( $checkedNS[$i] ) && $checkedNS[$i] ) || count( $showNamespaces ) == 1 ) {
+ $checked = array( 'checked' => 'checked' );
+ }
+
+ if ( count( $showNamespaces ) == 1 ) {
+ // Checkbox
+ $htmlOut .= Xml::element( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'ns' . $i,
+ 'value' => 1,
+ 'id' => 'mw-inputbox-ns' . $i
+ ) + $checked
+ );
+ } else {
+ // Checkbox
+ $htmlOut .= ' <div class="inputbox-element" style="display: inline; white-space: nowrap;">';
+ $htmlOut .= Xml::element( 'input',
+ array(
+ 'type' => 'checkbox',
+ 'name' => 'ns' . $i,
+ 'value' => 1,
+ 'id' => 'mw-inputbox-ns' . $i
+ ) + $checked
+ );
+ // Label
+ $htmlOut .= '&#160;' . Xml::label( $name, 'mw-inputbox-ns' . $i );
+ $htmlOut .= '</div> ';
+ }
+ }
+
+ // Line break
+ $htmlOut .= $this->mBR;
+ } elseif( $type == 'search' ) {
+ // Go button
+ $htmlOut .= Xml::element( 'input',
+ array(
+ 'type' => 'submit',
+ 'name' => 'go',
+ 'class' => 'searchboxGoButton',
+ 'value' => $this->mButtonLabel
+ )
+ );
+ $htmlOut .= '&#160;';
+ }
+
+ // Search button
+ $htmlOut .= Xml::element( 'input',
+ array(
+ 'type' => 'submit',
+ 'name' => 'fulltext',
+ 'class' => 'searchboxSearchButton',
+ 'value' => $this->mSearchButtonLabel
+ )
+ );
+
+ // Hidden fulltext param for IE (bug 17161)
+ if( $type == 'fulltext' ) {
+ $htmlOut .= Html::hidden( 'fulltext', 'Search' );
+ }
+
+ $htmlOut .= Xml::closeElement( 'form' );
+ $htmlOut .= Xml::closeElement( 'div' );
+
+ // Return HTML
+ return $htmlOut;
+ }
+
+ /**
+ * Generate search form version 2
+ */
+ public function getSearchForm2() {
+ // Use button label fallbacks
+ if ( !$this->mButtonLabel ) {
+ $this->mButtonLabel = wfMessage( 'tryexact' )->escaped();
+ }
+
+ $id = Sanitizer::escapeId( $this->mID, 'noninitial' );
+ $htmlLabel = '';
+ if ( isset( $this->mLabelText ) && strlen( trim( $this->mLabelText ) ) ) {
+ $this->mLabelText = $this->mParser->recursiveTagParse( $this->mLabelText );
+ $htmlLabel = Xml::openElement( 'label', array( 'for' => 'bodySearchInput' . $id ) );
+ $htmlLabel .= $this->mLabelText;
+ $htmlLabel .= Xml::closeElement( 'label' );
+ }
+ $htmlOut = Xml::openElement( 'form',
+ array(
+ 'name' => 'bodySearch' . $id,
+ 'id' => 'bodySearch' . $id,
+ 'class' => 'bodySearch',
+ 'action' => SpecialPage::getTitleFor( 'Search' )->escapeLocalUrl(),
+ 'style' => $this->mInline ? 'display: inline;' : ''
+ )
+ );
+ $htmlOut .= Xml::openElement( 'div',
+ array(
+ 'class' => 'bodySearchWrap',
+ 'style' => 'background-color:' . $this->mBGColor . ';' .
+ $this->mInline ? 'display: inline;' : ''
+ )
+ );
+ $htmlOut .= $htmlLabel;
+ $htmlOut .= Xml::element( 'input',
+ array(
+ 'type' => $this->mHidden ? 'hidden' : 'text',
+ 'name' => 'search',
+ 'size' => $this->mWidth,
+ 'id' => 'bodySearchInput' . $id,
+ 'dir' => $this->mDir,
+ )
+ );
+ $htmlOut .= Xml::element( 'input',
+ array(
+ 'type' => 'submit',
+ 'name' => 'go',
+ 'value' => $this->mButtonLabel,
+ 'class' => 'bodySearchBtnGo' . $id
+ )
+ );
+
+ // Better testing needed here!
+ if ( !empty( $this->mFullTextButton ) ) {
+ $htmlOut .= Xml::element( 'input',
+ array(
+ 'type' => 'submit',
+ 'name' => 'fulltext',
+ 'class' => 'bodySearchBtnSearch',
+ 'value' => $this->mSearchButtonLabel
+ )
+ );
+ }
+
+ $htmlOut .= Xml::closeElement( 'div' );
+ $htmlOut .= Xml::closeElement( 'form' );
+
+ // Return HTML
+ return $htmlOut;
+ }
+
+ /**
+ * Generate create page form
+ */
+ public function getCreateForm() {
+ global $wgScript;
+
+ if ( $this->mType == "comment" ) {
+ if ( !$this->mButtonLabel ) {
+ $this->mButtonLabel = wfMessage( "postcomment" )->escaped();
+ }
+ } else {
+ if ( !$this->mButtonLabel ) {
+ $this->mButtonLabel = wfMessage( 'createarticle' )->escaped();
+ }
+ }
+
+ $htmlOut = Xml::openElement( 'div',
+ array(
+ 'style' => 'margin-left: auto; margin-right: auto; text-align: center; background-color:' . $this->mBGColor
+ )
+ );
+ $createBoxParams = array(
+ 'name' => 'createbox',
+ 'class' => 'createbox',
+ 'action' => $wgScript,
+ 'method' => 'get'
+ );
+ if( isset( $this->mId ) ) {
+ $createBoxParams['id'] = Sanitizer::escapeId( $this->mId );
+ }
+ $htmlOut .= Xml::openElement( 'form', $createBoxParams );
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'action',
+ 'value' => 'edit',
+ )
+ );
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'preload',
+ 'value' => $this->mPreload,
+ )
+ );
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'editintro',
+ 'value' => $this->mEditIntro,
+ )
+ );
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'summary',
+ 'value' => $this->mSummary,
+ )
+ );
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'nosummary',
+ 'value' => $this->mNosummary,
+ )
+ );
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'prefix',
+ 'value' => $this->mPrefix,
+ )
+ );
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'minor',
+ 'value' => $this->mMinor,
+ )
+ );
+ if ( $this->mType == 'comment' ) {
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'section',
+ 'value' => 'new',
+ )
+ );
+ }
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => $this->mHidden ? 'hidden' : 'text',
+ 'name' => 'title',
+ 'class' => 'createboxInput',
+ 'value' => $this->mDefaultText,
+ 'placeholder' => $this->mPlaceholderText,
+ 'size' => $this->mWidth,
+ 'dir' => $this->mDir,
+ )
+ );
+ $htmlOut .= $this->mBR;
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'submit',
+ 'name' => 'create',
+ 'class' => 'createboxButton',
+ 'value' => $this->mButtonLabel
+ )
+ );
+ $htmlOut .= Xml::closeElement( 'form' );
+ $htmlOut .= Xml::closeElement( 'div' );
+
+ // Return HTML
+ return $htmlOut;
+ }
+
+ /**
+ * Generate new section form
+ */
+ public function getCommentForm() {
+ global $wgScript;
+
+ if ( !$this->mButtonLabel ) {
+ $this->mButtonLabel = wfMessage( "postcomment" )->escaped();
+ }
+
+ $htmlOut = Xml::openElement( 'div',
+ array(
+ 'style' => 'margin-left: auto; margin-right: auto; text-align: center; background-color:' . $this->mBGColor
+ )
+ );
+ $commentFormParams = array(
+ 'name' => 'commentbox',
+ 'class' => 'commentbox',
+ 'action' => $wgScript,
+ 'method' => 'get'
+ );
+ if( isset( $this->mId ) ) {
+ $commentFormParams['id'] = Sanitizer::escapeId( $this->mId );
+ }
+ $htmlOut .= Xml::openElement( 'form', $commentFormParams );
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'action',
+ 'value' => 'edit',
+ )
+ );
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'preload',
+ 'value' => $this->mPreload,
+ )
+ );
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'editintro',
+ 'value' => $this->mEditIntro,
+ )
+ );
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => $this->mHidden ? 'hidden' : 'text',
+ 'name' => 'preloadtitle',
+ 'class' => 'commentboxInput',
+ 'value' => $this->mDefaultText,
+ 'placeholder' => $this->mPlaceholderText,
+ 'size' => $this->mWidth,
+ 'dir' => $this->mDir,
+ )
+ );
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'section',
+ 'value' => 'new',
+ )
+ );
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'hidden',
+ 'name' => 'title',
+ 'value' => $this->mPage
+ )
+ );
+ $htmlOut .= $this->mBR;
+ $htmlOut .= Xml::openElement( 'input',
+ array(
+ 'type' => 'submit',
+ 'name' => 'create',
+ 'class' => 'commentboxButton',
+ 'value' => $this->mButtonLabel
+ )
+ );
+ $htmlOut .= Xml::closeElement( 'form' );
+ $htmlOut .= Xml::closeElement( 'div' );
+
+ // Return HTML
+ return $htmlOut;
+ }
+
+ /**
+ * Extract options from a blob of text
+ *
+ * @param string $text Tag contents
+ */
+ public function extractOptions( $text ) {
+ wfProfileIn( __METHOD__ );
+
+ // Parse all possible options
+ $values = array();
+ foreach ( explode( "\n", $text ) as $line ) {
+ if ( strpos( $line, '=' ) === false )
+ continue;
+ list( $name, $value ) = explode( '=', $line, 2 );
+ $values[ strtolower( trim( $name ) ) ] = Sanitizer::decodeCharReferences( trim( $value ) );
+ }
+
+ // Validate the dir value.
+ if ( isset( $values['dir'] ) && !in_array( $values['dir'], array( 'ltr', 'rtl' ) ) ) {
+ unset( $values['dir'] );
+ }
+
+ // Build list of options, with local member names
+ $options = array(
+ 'type' => 'mType',
+ 'width' => 'mWidth',
+ 'preload' => 'mPreload',
+ 'page' => 'mPage',
+ 'editintro' => 'mEditIntro',
+ 'summary' => 'mSummary',
+ 'nosummary' => 'mNosummary',
+ 'minor' => 'mMinor',
+ 'break' => 'mBR',
+ 'default' => 'mDefaultText',
+ 'placeholder' => 'mPlaceholderText',
+ 'bgcolor' => 'mBGColor',
+ 'buttonlabel' => 'mButtonLabel',
+ 'searchbuttonlabel' => 'mSearchButtonLabel',
+ 'fulltextbutton' => 'mFullTextButton',
+ 'namespaces' => 'mNamespaces',
+ 'labeltext' => 'mLabelText',
+ 'hidden' => 'mHidden',
+ 'id' => 'mID',
+ 'inline' => 'mInline',
+ 'prefix' => 'mPrefix',
+ 'dir' => 'mDir',
+ );
+ foreach ( $options as $name => $var ) {
+ if ( isset( $values[$name] ) ) {
+ $this->$var = $values[$name];
+ }
+ }
+
+ // Insert a line break if configured to do so
+ $this->mBR = ( strtolower( $this->mBR ) == "no" ) ? ' ' : '<br />';
+
+ // Validate the width; make sure it's a valid, positive integer
+ $this->mWidth = intval( $this->mWidth <= 0 ? 50 : $this->mWidth );
+
+ // Validate background color
+ if ( !$this->isValidColor( $this->mBGColor ) ) {
+ $this->mBGColor = 'transparent';
+ }
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Do a security check on the bgcolor parameter
+ */
+ public function isValidColor( $color ) {
+ $regex = <<<REGEX
+ /^ (
+ [a-zA-Z]* | # color names
+ \# [0-9a-f]{3} | # short hexadecimal
+ \# [0-9a-f]{6} | # long hexadecimal
+ rgb \s* \( \s* (
+ \d+ \s* , \s* \d+ \s* , \s* \d+ | # rgb integer
+ [0-9.]+% \s* , \s* [0-9.]+% \s* , \s* [0-9.]+% # rgb percent
+ ) \s* \)
+ ) $ /xi
+REGEX;
+ return (bool) preg_match( $regex, $color );
+ }
+}
diff --git a/extensions/InputBox/InputBox.hooks.php b/extensions/InputBox/InputBox.hooks.php
new file mode 100644
index 00000000..7cc60549
--- /dev/null
+++ b/extensions/InputBox/InputBox.hooks.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Hooks for InputBox extension
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+// InputBox hooks
+class InputBoxHooks {
+ // Initialization
+ public static function register( Parser &$parser ) {
+ // Register the hook with the parser
+ $parser->setHook( 'inputbox', array( 'InputBoxHooks', 'render' ) );
+
+ // Continue
+ return true;
+ }
+
+ // Render the input box
+ public static function render( $input, $args, Parser $parser ) {
+ // Create InputBox
+ $inputBox = new InputBox( $parser );
+
+ // Configure InputBox
+ $inputBox->extractOptions( $parser->replaceVariables( $input ) );
+
+ // Return output
+ return $inputBox->render();
+ }
+
+ /**
+ * <inputbox type=create...> sends requests with action=edit, and
+ * possibly a &prefix=Foo. So we pick that up here, munge prefix
+ * and title together, and redirect back out to the real page
+ * @param $output OutputPage
+ * @param $article Article
+ * @param $title Title
+ * @param $user User
+ * @param $request WebRequest
+ * @param $wiki MediaWiki
+ * @return bool
+ */
+ public static function onMediaWikiPerformAction(
+ $output,
+ $article,
+ $title,
+ $user,
+ $request,
+ $wiki )
+ {
+ if( $wiki->getAction( $request ) !== 'edit' ){
+ # not our problem
+ return true;
+ }
+ if( $request->getText( 'prefix', '' ) === '' ){
+ # Fine
+ return true;
+ }
+
+ $params = $request->getValues();
+ $title = $params['prefix'];
+ if ( isset( $params['title'] ) ){
+ $title .= $params['title'];
+ }
+ unset( $params['prefix'] );
+ $params['title'] = $title;
+
+ global $wgScript;
+ $output->redirect( wfAppendQuery( $wgScript, $params ), '301' );
+ return false;
+ }
+}
diff --git a/extensions/InputBox/InputBox.i18n.php b/extensions/InputBox/InputBox.i18n.php
new file mode 100644
index 00000000..c4a27d40
--- /dev/null
+++ b/extensions/InputBox/InputBox.i18n.php
@@ -0,0 +1,2292 @@
+<?php
+
+/**
+ * Messages file for the InputBox extension
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+/**
+ * Get all extension messages
+ *
+ * @return array
+ */
+$messages = array();
+
+$messages['en'] = array(
+ 'inputbox-desc' => 'Allow inclusion of predefined HTML forms',
+ 'inputbox-error-no-type' => 'You have not specified the type of input box to create.',
+ 'inputbox-error-bad-type' => 'Input box type "$1" not recognized.
+Please specify "create", "comment", "search", "search2" or "fulltext".',
+ 'tryexact' => 'Try exact match',
+ 'searchfulltext' => 'Search full text',
+ 'createarticle' => 'Create page',
+ 'inputbox-ns-main' => 'Main',
+);
+
+/** Message documentation (Message documentation)
+ * @author Lloffiwr
+ * @author Meno25
+ * @author SPQRobin
+ * @author Shirayuki
+ * @author Siebrand
+ * @author The Evil IP address
+ */
+$messages['qqq'] = array(
+ 'inputbox-desc' => '{{desc|name=Input Box|url=http://www.mediawiki.org/wiki/Extension:InputBox}}',
+ 'inputbox-error-no-type' => 'Used as error message.
+
+See also:
+* {{msg-mw|Inputbox-error-bad-type}}',
+ 'inputbox-error-bad-type' => '{{doc-important|"create", "comment", "search", "search2" and "fulltext" should not be translated.}}
+Used as error message.
+
+See also:
+* {{msg-mw|Inputbox-error-no-type}}',
+ 'tryexact' => 'Part of the "Inputbox" extension. This message is the text of the button to search the page you typed in the inputbox. If the page with the exact name exists, you will go directly to that page.',
+ 'searchfulltext' => 'Part of the "Inputbox" extension. This message is the text of the button to search the page you typed in the inputbox. This button always goes to the search page, even if the page with the exact name exists.
+
+See also:
+* {{msg-mw|Search}}
+* {{msg-mw|Accesskey-search-fulltext}}
+* {{msg-mw|Tooltip-search-fulltext}}',
+ 'createarticle' => 'Part of the "Inputbox" extension. This message is the text of the button to create the page you typed in the inputbox.',
+ 'inputbox-ns-main' => 'Probably refers to the main namespace.',
+);
+
+/** Afrikaans (Afrikaans)
+ * @author Naudefj
+ */
+$messages['af'] = array(
+ 'inputbox-desc' => 'Laat die insluiting van vooraf gedefinieerde HTML-vorms moontlik',
+ 'inputbox-error-no-type' => 'U het nie die tipe invoerveld gespesifiseer nie.',
+ 'inputbox-error-bad-type' => 'Tipe invoerveld is "$1" nie herken nie.
+Gebruik "create", "comment", "search", "search2" of "fulltext".',
+ 'tryexact' => 'Soek presiese ooreenkoms',
+ 'searchfulltext' => 'Deursoek volledige teks',
+ 'createarticle' => 'Skep bladsy',
+ 'inputbox-ns-main' => 'Hoofnaamruimte',
+);
+
+/** Amharic (አማርኛ)
+ * @author Codex Sinaiticus
+ */
+$messages['am'] = array(
+ 'createarticle' => 'አዲስ አርዕስት ለመáጠር',
+);
+
+/** Aragonese (aragonés)
+ * @author Juanpabl
+ */
+$messages['an'] = array(
+ 'inputbox-desc' => 'Premite a enclusión de formularios HTML predefinitos',
+ 'inputbox-error-no-type' => 'No ha endicato o tipo de caixa de dentrada que cal creyar.',
+ 'inputbox-error-bad-type' => 'No se reconoixe o tipo de caixa de dentrada "$1".
+Por favor, especifique "create", "comment", "search" u "fulltext".',
+ 'tryexact' => 'Mirar títol esauto',
+ 'searchfulltext' => 'Mirar por testo completo',
+ 'createarticle' => 'Creyar pachina',
+ 'inputbox-ns-main' => 'Prencipal',
+);
+
+/** Arabic (العربية)
+ * @author Meno25
+ * @author زكريا
+ */
+$messages['ar'] = array(
+ 'inputbox-desc' => 'يسمح بتضمين أشكال HTML معرÙØ© مسبقا.',
+ 'inputbox-error-no-type' => 'لم تقم بتحديد نوع صندوق الإدخال للإنشاء.',
+ 'inputbox-error-bad-type' => 'نوع صندوق الإدخال "$1" لم يتم التعر٠عليه.
+من Ùضلك حدد "create"ØŒ "comment"ØŒ "search"ØŒ "search2" أو "fulltext".',
+ 'tryexact' => 'ابحث عن عنوان مطابق',
+ 'searchfulltext' => 'ابحث ÙÙŠ النص الكامل',
+ 'createarticle' => 'إنشاء صÙحة',
+ 'inputbox-ns-main' => 'رئيسي',
+);
+
+/** Aramaic (ÜܪܡÜÜ)
+ * @author Basharh
+ * @author Man2fly2002
+ */
+$messages['arc'] = array(
+ 'createarticle' => 'Ü’ÜªÜ Ü¦ÜܬÜ',
+);
+
+/** Egyptian Spoken Arabic (مصرى)
+ * @author Ghaly
+ * @author Ramsis II
+ */
+$messages['arz'] = array(
+ 'inputbox-desc' => 'يسمح بتضمين أشكال اتش تى ام ال معرÙÙ‡ من الاول',
+ 'inputbox-error-no-type' => 'إنت ما حددتش نوع صندوق الإدخال للإنشاء',
+ 'inputbox-error-bad-type' => 'ما اتعرÙناش على نوع صندوق الإدخال "$1" .
+لو سمحت تحدد "create"، "comment"، "search" أو "search2".',
+ 'tryexact' => 'دور على عنوان مطابق',
+ 'searchfulltext' => 'دور ÙÙ‰ النص كله',
+ 'createarticle' => 'إنشاء صÙحة',
+);
+
+/** Assamese (অসমীয়া)
+ * @author Bishnu Saikia
+ * @author Chaipau
+ * @author Gitartha.bordoloi
+ * @author Rajuonline
+ */
+$messages['as'] = array(
+ 'inputbox-desc' => 'পূৰà§à¦¬à¦¸à¦‚জà§à¦žà¦¾à¦¯à¦¼à¦¿à¦¤ HTML ফৰà§à¦®à§° অনà§à¦¤à§°à§à¦­à§à¦•à§à¦¤à¦¿ অনà§à¦®à§‹à¦¦à¦¨ কৰক',
+ 'inputbox-error-no-type' => 'আপà§à¦¨à¦¿ সৃষà§à¦Ÿà¦¿ কৰিবলগীয়া ইনà§â€Œà¦ªà§à¦Ÿ বকà§à¦¸à§° পà§à§°à¦•à¦¾à§° নিৰà§à¦§à¦¾à§°à¦£ কৰা নাই।',
+ 'inputbox-error-bad-type' => 'ইনà§â€Œà¦ªà§à¦Ÿ বকà§à¦¸ পà§à§°à¦•à¦¾à§° "$1" চিনাকà§à¦¤ কৰিব পৰা নগ\'ল।
+অনà§à¦—à§à§°à¦¹ কৰি "create", "comment", "search", "search2" বা "fulltext" নিৰà§à¦§à¦¾à§°à¦£ কৰক',
+ 'tryexact' => 'কেবল দিয়া শবà§à¦¦à¦¹à§‡ বিচাৰিব',
+ 'searchfulltext' => 'সমà§à¦ªà§‚ৰà§à¦£ পাঠà§à¦¯ বিচাৰিব',
+ 'createarticle' => 'পৃষà§à¦ à¦¾ বনাওক',
+ 'inputbox-ns-main' => 'মূখà§à¦¯',
+);
+
+/** Asturian (asturianu)
+ * @author Esbardu
+ * @author Xuacu
+ */
+$messages['ast'] = array(
+ 'inputbox-desc' => 'Permite la inclusión de formularios HTML predefiníos',
+ 'inputbox-error-no-type' => "Nun especificasti la triba de caxellu d'entrada pa crear.",
+ 'inputbox-error-bad-type' => "Triba de caxa d'entrada \$1 non reconocida.
+Por favor conseña la opción ''create'', ''comment'', ''search'', ''search2'' o \"fulltext\".",
+ 'tryexact' => 'Intentar concueyar exautamente',
+ 'searchfulltext' => 'Buscar testu completu',
+ 'createarticle' => 'Crear páxina',
+ 'inputbox-ns-main' => 'Principal',
+);
+
+/** Azerbaijani (azərbaycanca)
+ * @author Cekli829
+ * @author Vugar 1981
+ */
+$messages['az'] = array(
+ 'searchfulltext' => 'Yaxşı mətni axtar',
+ 'createarticle' => 'Məqalə yarat',
+ 'inputbox-ns-main' => 'Æsas',
+);
+
+/** South Azerbaijani (تورکجه)
+ * @author Amir a57
+ */
+$messages['azb'] = array(
+ 'searchfulltext' => 'یاخشی متنی آختار',
+ 'createarticle' => 'صحیÙÙ‡ یارات',
+ 'inputbox-ns-main' => 'آنا',
+);
+
+/** Bashkir (башҡортÑа)
+ * @author Assele
+ * @author Haqmar
+ */
+$messages['ba'] = array(
+ 'inputbox-desc' => 'Ðлдан билдәләнгән HTML формаларҙы индереү мөмкинлеген бирә',
+ 'inputbox-error-no-type' => 'Һеҙ булдырыла торған юлдың төрөн күрһәтмәгеҙ.',
+ 'inputbox-error-bad-type' => '"$1" юл төрө танылмаған.
+Зинһар, "create", "comment", "search", "search2" йәки "fulltext" төрөнөң береһен күрһәтегеҙ.',
+ 'tryexact' => 'Теүәл тура килеү буйынÑа Ñҙләү',
+ 'searchfulltext' => 'Тулы текÑÑ‚ буйынÑа Ñҙләү',
+ 'createarticle' => 'Яңы бит Ñһарға',
+ 'inputbox-ns-main' => 'Төп',
+);
+
+/** Southern Balochi (بلوچی مکرانی)
+ * @author Mostafadaneshvar
+ */
+$messages['bcc'] = array(
+ 'inputbox-desc' => 'اجازه داتن په هور بیگ Ùرم های HTML Ú†Ù‡ پیش تعری٠بوتگین',
+ 'inputbox-error-no-type' => 'شما نوع جعبه ورودی په شرکتن مشخص نه کتت',
+ 'inputbox-error-bad-type' => 'نوع جعبه ورودی "$1" جاه آرگ نه بیت.
+لطÙا مشخص کنیت "شرکتن", "نظر", "گردگ" یا "گردگ2".', # Fuzzy
+ 'tryexact' => 'تطبیق کامل آزمایش کن',
+ 'searchfulltext' => 'متن کامل گرد',
+ 'createarticle' => 'شرکتن صÙحه',
+);
+
+/** Belarusian (беларуÑкаÑ)
+ */
+$messages['be'] = array(
+ 'createarticle' => 'Пачаць артыкул',
+);
+
+/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
+ * @author EugeneZelenko
+ * @author Jim-by
+ * @author Red Winged Duck
+ * @author Wizardist
+ */
+$messages['be-tarask'] = array(
+ 'inputbox-desc' => 'ДазвалÑе дадаваць у Ñ‚ÑкÑÑ‚ Ð¿ÐµÑ€Ð°Ð´Ð²Ñ‹Ð·Ð½Ð°Ñ‡Ð°Ð½Ñ‹Ñ HTML-формы',
+ 'inputbox-error-no-type' => 'Ð’Ñ‹ не пазначылі тып Ñтвараемага Ð¿Ð¾Ð»Ñ ÑžÐ²Ð¾Ð´Ñƒ.',
+ 'inputbox-error-bad-type' => 'ÐевÑдомы тып Ð¿Ð¾Ð»Ñ ÑžÐ²Ð¾Ð´Ñƒ «$1».
+Калі лаÑка, выбірайце толькі з дазволеных тыпаў: «create», «comment», «search», «search2» ці «fulltext».',
+ 'tryexact' => 'ПаÑпрабаваць дакладны пошук',
+ 'searchfulltext' => 'Шукаць увеÑÑŒ Ñ‚ÑкÑÑ‚',
+ 'createarticle' => 'Стварыць Ñтаронку',
+ 'inputbox-ns-main' => 'ÐÑноўнаÑ',
+);
+
+/** Bulgarian (българÑки)
+ * @author DCLXVI
+ * @author Spiritia
+ */
+$messages['bg'] = array(
+ 'inputbox-desc' => 'ПозволÑва вмъкването на HTML формулÑри.',
+ 'inputbox-error-no-type' => 'Ðе Ñе поÑочили типа на кутиÑта за вход, коÑто да бъде Ñъздадена.',
+ 'inputbox-error-bad-type' => 'Ðеразпознат тип „$1“ на кутиÑта за вход.
+Ðеобходимо е да Ñе поÑочи „create“, „comment“, „search“, „search2“ или „fulltext“.',
+ 'tryexact' => 'Пълно и точно Ñъвпадение',
+ 'searchfulltext' => 'ПретърÑване на Ñ†ÐµÐ»Ð¸Ñ Ñ‚ÐµÐºÑÑ‚',
+ 'createarticle' => 'Създаване',
+);
+
+/** Bislama (Bislama)
+ * @author Ushanka
+ */
+$messages['bi'] = array(
+ 'createarticle' => 'Mekem atikel', # Fuzzy
+);
+
+/** Bengali (বাংলা)
+ * @author Bellayet
+ * @author Zaheen
+ */
+$messages['bn'] = array(
+ 'inputbox-desc' => 'পূরà§à¦¬à¦¸à¦‚জà§à¦žà¦¾à¦¯à¦¼à¦¿à¦¤ à¦à¦‡à¦šà¦Ÿà¦¿à¦à¦®à¦à¦² ফরà§à¦®à§‡à¦° অনà§à¦¤à¦°à§à¦­à§à¦•à§à¦¤à¦¿ অনà§à¦®à§‹à¦¦à¦¨ করà§à¦¨',
+ 'inputbox-error-no-type' => 'আপনি ইনপà§à¦Ÿ বকà§à¦¸ তৈরির জনà§à¦¯ ইনপà§à¦Ÿ বকà§à¦¸à§‡à¦° ধরণ নিরà§à¦§à¦¾à¦°à¦£ করেননি।',
+ 'inputbox-error-bad-type' => '"$1" ধরনেরর ইনপà§à¦Ÿ বাকà§à¦¸ সনাকà§à¦¤ করা যায় নাই।
+অনà§à¦—à§à¦°à¦¹ করে "create", "comment", "search" অথবা "search2" নিরà§à¦§à¦¾à¦°à¦£ করà§à¦¨à¥¤',
+ 'tryexact' => 'ঠিক à¦à¦‡ নামের নিবনà§à¦§à§‡ যান',
+ 'searchfulltext' => 'সব বিষয়বসà§à¦¤à§à¦¤à§‡ খà§à¦à¦œà§à¦¨',
+ 'createarticle' => 'নিবনà§à¦§ শà§à¦°à§ করো',
+ 'inputbox-ns-main' => 'পà§à¦°à¦§à¦¾à¦¨',
+);
+
+/** Bakhtiari (بختياري)
+ * @author Behdarvandyani
+ */
+$messages['bqi'] = array(
+ 'inputbox-desc' => 'اجازه استÙاده زه Ùرم‌های HTML قبلا تعری٠وابیده را اده',
+ 'inputbox-error-no-type' => 'نوع جعبه ورودی درست شونده را معلوم نکردین.',
+ 'inputbox-error-bad-type' => 'نوع "$1" سی جعبه ورودی شناخته نه. لطÙاً یکی زه موارد
+"create", "comment", "search" or "search2" را مشخص کنین.', # Fuzzy
+ 'tryexact' => 'تطبیق مورد به مورد را آزمایش کن',
+ 'searchfulltext' => 'جستجوی همه متن',
+ 'createarticle' => 'درست کردن صÙحه',
+);
+
+/** Breton (brezhoneg)
+ * @author Fulup
+ */
+$messages['br'] = array(
+ 'inputbox-desc' => 'Aotren a ra degas furmskridoù HTML raktermenet.',
+ 'inputbox-error-no-type' => "N'eo ket bet spisaet ganeoc'h ar seurt boest enmont da vezañ krouet",
+ 'inputbox-error-bad-type' => 'N\'eo ket anavaezet ar seurt boest enmont "$1".
+Spisait "create", "comment", "search" pe "search2" pe "fulltext".',
+ 'tryexact' => 'Klask ma klotfe rik',
+ 'searchfulltext' => 'Klask en destenn a-bezh',
+ 'createarticle' => 'Krouiñ ar pennad',
+ 'inputbox-ns-main' => 'Pennañ',
+);
+
+/** Bosnian (bosanski)
+ * @author CERminator
+ * @author DzWiki
+ */
+$messages['bs'] = array(
+ 'inputbox-desc' => 'Omogućuje ukljuÄivanje prethodno napravljenih HTML obrazaca',
+ 'inputbox-error-no-type' => 'Niste odredili tip kutije za unos koju pravite.',
+ 'inputbox-error-bad-type' => 'Tip kutije unosa "$1" nije prepoznat.
+Molimo odredite "create", "comment", "search", "search2" ili "fulltext".',
+ 'tryexact' => 'Isprobaj naći taÄan upit',
+ 'searchfulltext' => 'Pretraži cijeli tekst',
+ 'createarticle' => 'Napravi stranicu',
+ 'inputbox-ns-main' => 'Glavno',
+);
+
+/** Catalan (català)
+ * @author Aleator
+ * @author Gemmaa
+ * @author Paucabot
+ * @author SMP
+ * @author Toniher
+ */
+$messages['ca'] = array(
+ 'inputbox-desc' => 'Permet la inclusió de formularis HTML predefinits',
+ 'inputbox-error-no-type' => "No heu especificat el tipus de quadre d'entrada per crear.",
+ 'inputbox-error-bad-type' => "El tipus de quadre d'entrada «$1» no està reconegut.
+
+Especifiqueu-hi «create», «comment», «search», «search2» o «fulltext».",
+ 'tryexact' => 'Prova una coincidència exacta',
+ 'searchfulltext' => 'Cerca un text sencer',
+ 'createarticle' => 'Crea una pàgina',
+ 'inputbox-ns-main' => 'Principal',
+);
+
+/** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄)
+ */
+$messages['cdo'] = array(
+ 'createarticle' => 'Kŭi hiĕk',
+);
+
+/** Chechen (нохчийн)
+ * @author Sasan700
+ */
+$messages['ce'] = array(
+ 'tryexact' => 'Леррина лахар',
+);
+
+/** Sorani Kurdish (کوردی)
+ * @author Calak
+ */
+$messages['ckb'] = array(
+ 'inputbox-ns-main' => 'سەرەکی',
+);
+
+/** Corsican (corsu)
+ */
+$messages['co'] = array(
+ 'searchfulltext' => 'Ricerca testu cumplettu',
+ 'createarticle' => "Creà l'articulu", # Fuzzy
+);
+
+/** Crimean Turkish (Cyrillic script) (къырымтатарджа (Кирилл)‎)
+ * @author Don Alessandro
+ */
+$messages['crh-cyrl'] = array(
+ 'createarticle' => 'Саифени Ñрат',
+);
+
+/** Crimean Turkish (Latin script) (qırımtatarca (Latin)‎)
+ * @author Don Alessandro
+ */
+$messages['crh-latn'] = array(
+ 'createarticle' => 'Saifeni yarat',
+);
+
+/** Czech (Äesky)
+ * @author Danny B.
+ * @author Li-sung
+ * @author Mormegil
+ */
+$messages['cs'] = array(
+ 'inputbox-desc' => 'Umožňuje vkládat urÄité HTML formuláře.',
+ 'inputbox-error-no-type' => 'Není urÄen typ formulářového pole k vytvoÅ™ení.',
+ 'inputbox-error-bad-type' => 'Nerozpoznaný typ pole „$1“.
+UveÄte jednu z možností: „create“, „comment“, „search“, „search2“ nebo „fulltext“.',
+ 'tryexact' => 'Vyzkoušet přesné hledání',
+ 'searchfulltext' => 'Plnotextové hledání',
+ 'createarticle' => 'VytvoÅ™it Älánek',
+ 'inputbox-ns-main' => 'Hlavní',
+);
+
+/** Church Slavic (ÑловѣÌньÑкъ / ⰔⰎⰑⰂⰡâ°â° â°”â°â°Ÿ)
+ * @author ОйЛ
+ */
+$messages['cu'] = array(
+ 'createarticle' => 'cÑŠê™Ð¸Ð¶Ð´Ð¸ члѣнъ',
+);
+
+/** Chuvash (Чӑвашла)
+ */
+$messages['cv'] = array(
+ 'createarticle' => 'Çĕнĕ ÑÑ‚Ð°Ñ‚ÑŒÑ Ã§Ñ‹Ñ€',
+);
+
+/** Welsh (Cymraeg)
+ * @author Lloffiwr
+ */
+$messages['cy'] = array(
+ 'inputbox-desc' => "Yn caniatau creu blychau mewnbynnu sy'n cynnwys ffurflenni HTML wedi eu gosod yn barod i'w defnyddio",
+ 'inputbox-error-no-type' => "Nid ydych wedi pennu'r math o flwch mewnbynnu yr ydych am ei greu.",
+ 'inputbox-error-bad-type' => 'Nid yw\'r gair "$1" ar y math o flwch mewnbynnu yn ddealladwy gan y meddalwedd.
+Dewiswch rhwng "create", "comment", "search" a "search2" neu "fulltext".',
+ 'tryexact' => 'Chwilio am yr union gymal',
+ 'searchfulltext' => "Chwilio'r testun cyfan",
+ 'createarticle' => "Creu'r dudalen",
+ 'inputbox-ns-main' => 'Prif',
+);
+
+/** Danish (dansk)
+ * @author Byrial
+ * @author Peter Alberti
+ */
+$messages['da'] = array(
+ 'inputbox-desc' => 'Muliggør inkludering af forhåndsdefinerede HTML-formularer',
+ 'inputbox-error-no-type' => 'Du har ikke angivet type i inputboksen som skal laves.',
+ 'inputbox-error-bad-type' => 'Inputboks-type "$1" kendes ikke.
+Vælg venligst "create", "comment", "search", "search2" eller "fulltext".',
+ 'tryexact' => 'GÃ¥ til siden',
+ 'searchfulltext' => 'Søg efter teksten',
+ 'createarticle' => 'Opret side',
+ 'inputbox-ns-main' => 'Hoved',
+);
+
+/** German (Deutsch)
+ * @author Kghbln
+ * @author LWChris
+ * @author Metalhead64
+ * @author Raimond Spekking
+ * @author Umherirrender
+ */
+$messages['de'] = array(
+ 'inputbox-desc' => 'Ergänzt das Tag <code>&lt;inputbox&gt;</code> zum Einbinden vordefinierter HTML-Eingabefelder',
+ 'inputbox-error-no-type' => 'Es wurde kein Eingabefeldtyp angegeben.',
+ 'inputbox-error-bad-type' => 'Der Eingabefeldtyp „$1“ ist unbekannt.
+Bitte „create“, „comment“, „search“, „search2“ oder „fulltext“ angeben.',
+ 'tryexact' => 'Exakte Suche durchführen',
+ 'searchfulltext' => 'Volltextsuche',
+ 'createarticle' => 'Seite erstellen',
+ 'inputbox-ns-main' => 'Seiten',
+);
+
+/** Zazaki (Zazaki)
+ * @author Aspar
+ * @author Erdemaslancan
+ * @author Xoser
+ */
+$messages['diq'] = array(
+ 'inputbox-desc' => 'desturê daxilbiyayişê formê HTMLyi dano, no HTML gani ver ra şınasi bıbo.',
+ 'inputbox-error-no-type' => 'Qutiya daxilbiyayişi ya ke vıraziyena gani tipê aye diyari bıbo',
+ 'inputbox-error-bad-type' => 'Qutiyê tîp ê "$1"î kebul nikerd.
+Ma şima rê "create", "comment", "search", "search2" or "fulltext" spesife bike.',
+ 'tryexact' => 'tam hemcıt biyayiş tesel bıker/bıcereb',
+ 'searchfulltext' => 'pêroyê metni bıgêr',
+ 'createarticle' => 'Pela vırazê',
+ 'inputbox-ns-main' => 'Ser',
+);
+
+/** Lower Sorbian (dolnoserbski)
+ * @author Michawiki
+ * @author Pe7er
+ */
+$messages['dsb'] = array(
+ 'inputbox-desc' => 'Zapśěgnjenje pśeddefiněrowanych HTML-formularow dowóliś',
+ 'inputbox-error-no-type' => 'Njejsy pódał typ zapódawańskego póla za napóranje.',
+ 'inputbox-error-bad-type' => 'Zapódawańske pólo typa "$1" njespóznane.
+Pšosym pódaj "create", "comment", "search", "search2" abo "fulltext".',
+ 'tryexact' => 'Eksaktne pytanje',
+ 'searchfulltext' => 'Ceły tekst pytaś',
+ 'createarticle' => 'Bok załožyś',
+ 'inputbox-ns-main' => 'Boki',
+);
+
+/** Divehi (Þ‹Þ¨ÞˆÞ¬Þ€Þ¨Þ„Þ¦ÞÞ°)
+ * @author Spacebirdy
+ */
+$messages['dv'] = array(
+ 'createarticle' => 'Þ‰Þ¦Þ’ÞªÞ‰Þ«Þ‚Þ¬Þ‡Þ° ÞŠÞ¦Þ‡Þ°Þ“Þ¦ÞˆÞ§',
+);
+
+/** Ewe (eʋegbe)
+ * @author Natsubee
+ */
+$messages['ee'] = array(
+ 'searchfulltext' => 'Di nuŋɔŋlɔ bliboa me',
+ 'createarticle' => 'Dze nuŋɔŋlɔ yeye gɔme',
+);
+
+/** Greek (Ελληνικά)
+ * @author Dead3y3
+ * @author ZaDiak
+ */
+$messages['el'] = array(
+ 'inputbox-desc' => 'ΕπιτÏέπει την πεÏίληψη Ï€ÏοκαθοÏισμένων φοÏμών HTML',
+ 'inputbox-error-no-type' => 'Δεν έχετε καθοÏίσει τον Ï„Ïπο του ÎºÎ¿Ï…Ï„Î¹Î¿Ï ÎµÎ¹ÏƒÏŒÎ´Î¿Ï… Ï€Ïος δημιουÏγία.',
+ 'inputbox-error-bad-type' => 'ΤÏπος ÎºÎ¿Ï…Ï„Î¹Î¿Ï ÎµÎ¹ÏƒÏŒÎ´Î¿Ï… "$1" δεν αναγνωÏίστηκε.<br />
+ΠαÏακαλώ οÏίστε "create", "comment", "search", "search2" ή "fulltext".',
+ 'tryexact' => 'Δοκιμάστε την επακÏιβή αντιστοιχία.',
+ 'searchfulltext' => 'Αναζήτηση με το πλήÏες κείμενο',
+ 'createarticle' => 'ΔημιουÏγία σελίδας',
+ 'inputbox-ns-main' => 'ΚÏÏιος',
+);
+
+/** British English (British English)
+ * @author Shirayuki
+ */
+$messages['en-gb'] = array(
+ 'inputbox-error-bad-type' => 'Input box type "$1" not recognised.
+Please specify "create", "comment", "search", "search2" or "fulltext".',
+);
+
+/** Esperanto (Esperanto)
+ * @author Michawiki
+ * @author Yekrats
+ */
+$messages['eo'] = array(
+ 'inputbox-desc' => 'Permesi enhavon de antaÅ­difinitaj HTML-kamparoj',
+ 'inputbox-error-no-type' => 'Vi ne enigis la specon de enigo-kesto por krei.',
+ 'inputbox-error-bad-type' => 'Enigo-kesto "$1" ne estas konata.
+Bonvolu specifi keston "create", "comment", "seatch", "search2", aÅ­ "fulltext".',
+ 'tryexact' => 'Provu ekzaktan trafon',
+ 'searchfulltext' => 'Serĉi plentekste',
+ 'createarticle' => 'Krei artikolon',
+ 'inputbox-ns-main' => 'Ĉefa',
+);
+
+/** Spanish (español)
+ * @author Crazymadlover
+ * @author Icvav
+ * @author MetalBrasil
+ * @author Muro de Aguas
+ * @author Sanbec
+ */
+$messages['es'] = array(
+ 'inputbox-desc' => 'Permite la inclusión de formularios en HTML predefinidos.',
+ 'inputbox-error-no-type' => 'No has especificado el tipo de formulario que vas a crear.',
+ 'inputbox-error-bad-type' => 'No se reconoce el tipo de caja de entrada «$1».
+Por favor, especifica «create», «comment», «search» «search2» o "fulltext".',
+ 'tryexact' => 'Buscar título exacto',
+ 'searchfulltext' => 'Buscar por texto completo',
+ 'createarticle' => 'Crear artículo',
+ 'inputbox-ns-main' => 'Principal',
+);
+
+/** Estonian (eesti)
+ * @author Avjoska
+ * @author Jaan513
+ * @author Pikne
+ */
+$messages['et'] = array(
+ 'inputbox-desc' => 'Lubab kaasata eelmääratletud HTML-vormid.',
+ 'inputbox-error-no-type' => 'Sisendkasti tüüp on määramata.',
+ 'inputbox-error-bad-type' => 'Tundmatu sisendkasti tüüp "$1".
+Palun vali tüübiks "create", "comment", "search", "search2" või "fulltext".',
+ 'tryexact' => 'Proovi täpset vastet',
+ 'searchfulltext' => 'Otsi täisteksti',
+ 'createarticle' => 'Alusta lehekülge',
+ 'inputbox-ns-main' => 'Põhinimeruum',
+);
+
+/** Basque (euskara)
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['eu'] = array(
+ 'tryexact' => 'Izenburu zehatza bilatu',
+ 'searchfulltext' => 'Testu osoa bilatu',
+ 'createarticle' => 'Artikulua sortu',
+ 'inputbox-ns-main' => 'Nagusia',
+);
+
+/** Extremaduran (estremeñu)
+ */
+$messages['ext'] = array(
+ 'createarticle' => 'Crial página',
+);
+
+/** Persian (Ùارسی)
+ * @author Ebraminio
+ * @author Huji
+ * @author Mjbmr
+ */
+$messages['fa'] = array(
+ 'inputbox-desc' => 'اجازهٔ استÙاده از Ùرم‌های HTML از پیش تعری٠شده را می‌دهد',
+ 'inputbox-error-no-type' => 'نوع جعبهٔ ورودی ایجادشونده را مشخص نکرده‌اید.',
+ 'inputbox-error-bad-type' => 'نوع «$1» برای جعبهٔ ورودی شناخته شده نیست.
+لطÙاً یکی از موارد «create»، «comment»، «search»، «search2» یا «fulltext» را مشخص کنید.',
+ 'tryexact' => 'مطابقت نظیر به نظیر را بیازما',
+ 'searchfulltext' => 'جستجوی کل متن',
+ 'createarticle' => 'ایجاد صÙحه',
+ 'inputbox-ns-main' => 'اصلی',
+);
+
+/** Finnish (suomi)
+ * @author Crt
+ * @author Nike
+ * @author Olli
+ */
+$messages['fi'] = array(
+ 'inputbox-desc' => 'Mahdollistaa ennalta määriteltyjen lomakkeiden sisällyttämisen sivuille.',
+ 'inputbox-error-no-type' => 'Et määritellyt syötekentän tyyppiä.',
+ 'inputbox-error-bad-type' => 'Syötekentän tyyppi â€$1†ei kelpaa.
+Sallittuja arvoja ovat create, comment, search, search2 ja fulltext.',
+ 'tryexact' => 'Yritä tarkkaa osumaa',
+ 'searchfulltext' => 'Etsi koko tekstiä',
+ 'createarticle' => 'Luo sivu',
+ 'inputbox-ns-main' => '(sivut)',
+);
+
+/** Faroese (føroyskt)
+ * @author EileenSanda
+ */
+$messages['fo'] = array(
+ 'tryexact' => 'Far til síðu',
+ 'searchfulltext' => 'Leita eftir hesum teksti',
+ 'createarticle' => 'Upprætta síðu',
+ 'inputbox-ns-main' => 'Høvuðs',
+);
+
+/** French (français)
+ * @author Crochet.david
+ * @author IAlex
+ * @author Kghbln
+ * @author Sherbrooke
+ * @author Wyz
+ */
+$messages['fr'] = array(
+ 'inputbox-desc' => 'Permet l’inclusion de formulaires HTML prédéfinis.',
+ 'inputbox-error-no-type' => 'Vous n’avez pas précisé le type de la boîte d’entrée à créer.',
+ 'inputbox-error-bad-type' => 'Type de boîte entrée « $1 » non reconnue.
+Indiquez une option parmis « create », « comment », « search », « searche2 » ou « fulltext ».',
+ 'tryexact' => 'Essayez la correspondance exacte',
+ 'searchfulltext' => 'Recherche en texte intégral',
+ 'createarticle' => 'Créer une page',
+ 'inputbox-ns-main' => 'Principal',
+);
+
+/** Franco-Provençal (arpetan)
+ * @author ChrisPtDe
+ */
+$messages['frp'] = array(
+ 'inputbox-desc' => 'Pèrmèt l’encllusion de formulèros HTML prèdèfenis.',
+ 'inputbox-error-no-type' => 'Vos éd pas spècefiâ lo tipo de la bouèta d’entrâ a fâre.',
+ 'inputbox-error-bad-type' => 'Tipo de bouèta d’entrâ « $1 » pas recognu.
+Volyéd spècefiar un chouèx permié « create », « comment », « search », « searche2 » ou ben « fulltext ».',
+ 'tryexact' => 'Èprovâd la corrèspondance justa.',
+ 'searchfulltext' => 'Rechèrche en tèxto complèt',
+ 'createarticle' => 'Fâre la pâge',
+ 'inputbox-ns-main' => 'Principâl',
+);
+
+/** Northern Frisian (Nordfriisk)
+ * @author Murma174
+ */
+$messages['frr'] = array(
+ 'inputbox-desc' => 'Föörformatiaret HTML-fialen tuläät',
+ 'inputbox-error-no-type' => 'Dü heest ei uunden, hün slach faan fial iinracht wurd skal.',
+ 'inputbox-error-bad-type' => 'Di slach „$1“ as ei tuläät. Wees so gud an nem „create“, „comment“, „search“, „search2“ of „fulltext“.',
+ 'tryexact' => 'Sjük genau',
+ 'searchfulltext' => 'Sjük uun di hialer tekst',
+ 'createarticle' => 'Maage en nei sidj',
+ 'inputbox-ns-main' => 'Sidjen',
+);
+
+/** Friulian (furlan)
+ * @author Klenje
+ */
+$messages['fur'] = array(
+ 'tryexact' => 'Cîr une corispondence esate',
+ 'searchfulltext' => 'Cîr in dut il test',
+ 'createarticle' => 'Cree vôs',
+);
+
+/** Western Frisian (Frysk)
+ * @author Snakesteuben
+ */
+$messages['fy'] = array(
+ 'createarticle' => 'Side oanmeitsje',
+);
+
+/** Irish (Gaeilge)
+ * @author Evertype
+ */
+$messages['ga'] = array(
+ 'inputbox-desc' => 'Ceadaigh glactha foirmeacha HTML réamhshainithe',
+ 'inputbox-error-no-type' => 'Níor shocraigh tú an cineál bosca ionchur a bheadh le cruthú.',
+ 'inputbox-error-bad-type' => 'Bosca iochur den chineál "$1" gan aithint.
+Sonraigh "create", "comment", "search", "search2" nó "fulltext".',
+ 'tryexact' => 'Déan iarracht ar meaitseáil cruinn',
+ 'searchfulltext' => 'Cuardaigh sa téacs iomlán',
+ 'createarticle' => 'Cruthaigh alt',
+);
+
+/** Galician (galego)
+ * @author Alma
+ * @author Toliño
+ */
+$messages['gl'] = array(
+ 'inputbox-desc' => 'Permitir a inclusión de formularios predefinidos de HTML',
+ 'inputbox-error-no-type' => 'Non especificou o tipo de caixa de entrada que quere crear.',
+ 'inputbox-error-bad-type' => 'O tipo de caixa de entrada "$1" non foi recoñecido.
+Por favor, especifique "create", "comment", "search", "search2" ou "fulltext".',
+ 'tryexact' => 'Buscar coincidencias exactas',
+ 'searchfulltext' => 'Buscar o texto completo',
+ 'createarticle' => 'Crear a páxina',
+ 'inputbox-ns-main' => 'Principal',
+);
+
+/** Ancient Greek (ἈÏχαία ἑλληνικὴ)
+ * @author Omnipaedista
+ */
+$messages['grc'] = array(
+ 'inputbox-desc' => 'ἘπιτÏέπειν τὴν εἰσαγωγὴν Ï€ÏοκαθωÏισμένων μοÏφῶν HTML',
+ 'inputbox-error-no-type' => 'Οá½Ï‡ á½¥Ïισας τὸν Ï„Ïπον τοῦ ποιηθέντος κυτίου εἰσηγμένων δεδομένων.',
+ 'inputbox-error-bad-type' => 'Ὁ Ï„Ïπος τοῦ ποιηθέντος κυτίου εἰσηγμένων δεδομένων "$1" ἀνεγνωÏισμένος οá½Îº ἔστιν.
+ΚαθόÏισον "create", "comment", "search", "search2" á¼¢ "fulltext".',
+ 'tryexact' => 'ΠείÏασον τὴν ἀκÏιβῆ ἀντιστοιχίαν',
+ 'searchfulltext' => 'Ζητεῖν á¼Î½ Ï„á¿· πλήÏει κειμένῳ',
+ 'createarticle' => 'Δέλτον δημιουÏγήσειν',
+);
+
+/** Swiss German (Alemannisch)
+ * @author Als-Chlämens
+ * @author Als-Holder
+ */
+$messages['gsw'] = array(
+ 'inputbox-desc' => 'Erlaubt d Yybindig vu vordefinierte HTML-Formular',
+ 'inputbox-error-no-type' => 'Du hesch kei Yygabfäld-Typ aagee.',
+ 'inputbox-error-bad-type' => 'Yygabfäld-Typ „$1“ nit bekannt.
+Bitte „create“, „comment“, „search“, „search2“ oder „fulltext“ aagee.',
+ 'tryexact' => 'Versuech es mitenere exakte Suech',
+ 'searchfulltext' => 'De gsamti Teggscht durchsueche',
+ 'createarticle' => 'Syte aalaie',
+ 'inputbox-ns-main' => 'Hauptsyte',
+);
+
+/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @author Dsvyas
+ * @author KartikMistry
+ * @author Sushant savla
+ */
+$messages['gu'] = array(
+ 'inputbox-desc' => 'પૂરà«àªµàªµà«àª¯àª¾àª–à«àª¯àª¾àª¯àª¿àª¤ HTML પતà«àª°àª•à«‹àª¨à«‹ સમાવેશ માનà«àª¯',
+ 'inputbox-error-no-type' => 'તમે બનાવવા માટેના ઈનપà«àªŸ બોકà«àª¸àª¨à«‹ પà«àª°àª•àª¾àª° સà«àªªàª·à«àªŸ કરà«àª¯à«‹ નથી.',
+ 'inputbox-error-bad-type' => 'ઈનપà«àªŸ ખાનાનો પà«àª°àª•àª° "$1" ન ઓળખી શકાયો.
+આમાંથી કોઈ àªàª• હણાવો "create", "comment", "search", "search2" or "fulltext".',
+ 'tryexact' => 'આબેહૂબ સરખામણી ધારી પà«àª°àª¯àª¤à«àª¨ કરો',
+ 'searchfulltext' => 'સંપૂરà«àª£ લખાણ શોધો',
+ 'createarticle' => 'નવો લેખ શરૂ કરો',
+ 'inputbox-ns-main' => 'મà«àª–à«àª¯',
+);
+
+/** Manx (Gaelg)
+ * @author MacTire02
+ */
+$messages['gv'] = array(
+ 'createarticle' => 'Croo duillag',
+);
+
+/** Hakka (Hak-kâ-fa)
+ * @author Hakka
+ */
+$messages['hak'] = array(
+ 'tryexact' => 'Sòng-chhṳ chîn-khok phit-phi',
+ 'searchfulltext' => 'Chhiòn vùn-kiám chhìm-cháu',
+ 'createarticle' => 'Kien-liÌp vùn-chông', # Fuzzy
+);
+
+/** Hebrew (עברית)
+ * @author Amire80
+ * @author Rotem Liss
+ */
+$messages['he'] = array(
+ 'inputbox-desc' => '×פשרות להכללת טופסי HTML שהוגדרו מר×ש',
+ 'inputbox-error-no-type' => '×œ× ×¦×™×™× ×ª× ×ת סוג תיבת הקלט ליצירה.',
+ 'inputbox-error-bad-type' => 'סוג תיבת הקלט "$1" ×ינו ידוע.
+×× × ×¦×™×™× ×• "create", "comment", "search", "search2" ×ו "fulltext".',
+ 'tryexact' => 'לדף ×‘×©× ×–×”',
+ 'searchfulltext' => 'חיפוש בתוכן הדפי×',
+ 'createarticle' => 'יצירת הדף',
+ 'inputbox-ns-main' => 'ר×שי',
+);
+
+/** Hindi (हिनà¥à¤¦à¥€)
+ * @author Ansumang
+ * @author Kaustubh
+ */
+$messages['hi'] = array(
+ 'inputbox-desc' => 'पहलेसे लिखे गये HTML फारà¥à¤® इसà¥à¤¤à¥‡à¤®à¤¾à¤² करने की अनà¥à¤®à¤¤à¤¿ दें',
+ 'inputbox-error-no-type' => 'इनपà¥à¤Ÿ बकà¥à¤¸à¤¾ बनाने के लिये आपने इसका पà¥à¤°à¤•à¤¾à¤° बताया नहीं हैं।',
+ 'inputbox-error-bad-type' => 'इनपà¥à¤Ÿ बकà¥à¤¸à¥‡ का "$1" यह पà¥à¤°à¤•à¤¾à¤° उचित नहीं हैं।
+कृपया "create", "comment", "search" या फिर "search2" में से à¤à¤• चà¥à¤¨à¥‡à¤‚।', # Fuzzy
+ 'tryexact' => 'दिये हà¥à¤ शबà¥à¤¦à¤¹à¥€ खोजें',
+ 'searchfulltext' => 'पूरा पाठ खोजें',
+ 'createarticle' => 'लेख बनाईयें',
+ 'inputbox-ns-main' => 'मà¥à¤–à¥à¤¯',
+);
+
+/** Fiji Hindi (Latin script) (Fiji Hindi)
+ * @author Thakurji
+ */
+$messages['hif-latn'] = array(
+ 'inputbox-desc' => 'Predefined HTML forms ke allow karo',
+ 'inputbox-error-no-type' => 'Aap ii nai bataya hai ki kon rakam ke input box ke banae ke chaahi',
+ 'inputbox-error-bad-type' => 'Input box type "$1" ke pehchana nai gais hai.
+Meharbani kar kr ii batao ki "create", "comment", "search", "search2" nai to "fulltext" hai.',
+ 'tryexact' => 'Exact match ke try karo',
+ 'searchfulltext' => 'Puura text me khojo',
+ 'createarticle' => 'Panna banao',
+);
+
+/** Hiligaynon (Ilonggo)
+ * @author Jose77
+ */
+$messages['hil'] = array(
+ 'createarticle' => 'Maghimo artikulo',
+);
+
+/** Croatian (hrvatski)
+ * @author Brest
+ * @author Dnik
+ * @author SpeedyGonsales
+ */
+$messages['hr'] = array(
+ 'inputbox-desc' => 'Dozvoli ukljuÄivanje predefiniranih obrazaca u HTML-u',
+ 'inputbox-error-no-type' => 'Niste naveli tip ulaznog polja koje želite stvoriti.',
+ 'inputbox-error-bad-type' => 'Tip ulaznog polja "$1" nije prepoznat.
+Molimo navedite "create", "comment", "search", "search2" ili "fulltext".',
+ 'tryexact' => 'PokuÅ¡aj naći toÄan pogodak',
+ 'searchfulltext' => 'Traži po cjelokupnom tekstu',
+ 'createarticle' => 'Stvori Älanak',
+);
+
+/** Upper Sorbian (hornjoserbsce)
+ * @author Dundak
+ * @author Michawiki
+ */
+$messages['hsb'] = array(
+ 'inputbox-desc' => 'Zapřijeće předdefinowanych HTML-formularow dowolić.',
+ 'inputbox-error-no-type' => 'Njesy typ zapodatneho kašćika podał.',
+ 'inputbox-error-bad-type' => 'Typ zapodatneho kašćika "$1" je njeznaty. Prošu podaj płaćiwy typ: "create", "comment", "search", "search2" abo "fulltext".',
+ 'tryexact' => 'Dokładne pytanje spytać',
+ 'searchfulltext' => 'Dospołny tekst pytać',
+ 'createarticle' => 'Nastawk wutworić',
+ 'inputbox-ns-main' => 'Strony',
+);
+
+/** Haitian (Kreyòl ayisyen)
+ * @author Boukman
+ * @author Masterches
+ */
+$messages['ht'] = array(
+ 'inputbox-desc' => 'Pèmèt ou mete fòmilè HTML yo ki deja defini.',
+ 'inputbox-error-no-type' => 'Atansyon, ou pa bay detay sou tip, kalite bwat antre pou ou kreye',
+ 'inputbox-error-bad-type' => 'Kalite bwat $1 ou antre pa bon, sistèm nan pa konnen l.
+Tanpri mete youn nan opsyon sa yo: "create", "comment", "search", "search2" oubyen "fulltext".',
+ 'tryexact' => 'Eseye paj ki koresponn toutbon.',
+ 'searchfulltext' => 'Fouye nan tout teks nèt',
+ 'createarticle' => 'Kreye atik sa',
+);
+
+/** Hungarian (magyar)
+ * @author Dani
+ * @author Dj
+ * @author Glanthor Reviol
+ * @author KossuthRad
+ * @author Tgr
+ */
+$messages['hu'] = array(
+ 'inputbox-desc' => 'Lehetővé teszi előre megadott HTML-űrlapok beillesztését',
+ 'inputbox-error-no-type' => 'Nem adtad meg, hogy milyen típusú beviteli mezőt akarsz készíteni.',
+ 'inputbox-error-bad-type' => '„$1†típusú beviteli mező nem ismert.
+A „createâ€, „commentâ€, „searchâ€, „search2†vagy „fulltext†egyikét add meg.',
+ 'tryexact' => 'Ugrás a szócikkre',
+ 'searchfulltext' => 'Keresés a teljes szövegben',
+ 'createarticle' => 'Szócikk létrehozása',
+ 'inputbox-ns-main' => 'FÅ‘',
+);
+
+/** Armenian (Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶)
+ * @author Xelgen
+ */
+$messages['hy'] = array(
+ 'createarticle' => 'ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ§Õ»',
+);
+
+/** Interlingua (interlingua)
+ * @author McDutchie
+ */
+$messages['ia'] = array(
+ 'inputbox-desc' => 'Permitter le inclusion de formularios HTML predefinite',
+ 'inputbox-error-no-type' => 'Tu non ha specificate le typo de quadro de entrata a crear.',
+ 'inputbox-error-bad-type' => 'Le typo de quadro de entrata "$1" non es recognoscite.
+Per favor specifica "create", "comment", "search", "search2" o "fulltext".',
+ 'tryexact' => 'Provar correspondentia exacte',
+ 'searchfulltext' => 'Cercar in texto integre',
+ 'createarticle' => 'Crear pagina',
+ 'inputbox-ns-main' => 'Principal',
+);
+
+/** Indonesian (Bahasa Indonesia)
+ * @author -iNu-
+ * @author Aldnonymous
+ * @author IvanLanin
+ * @author Rex
+ */
+$messages['id'] = array(
+ 'inputbox-desc' => 'Memungkinkan penggunaan form HTML yang telah ditentukan',
+ 'inputbox-error-no-type' => 'Anda harus menentukan tipe kotak input yang ingin dibuat.',
+ 'inputbox-error-bad-type' => 'Tipe kotak input "$1" tak dikenal.
+Harap gunakan "create", "comment", "search", "search2", atau "fulltext".',
+ 'tryexact' => 'Coba pencocokan eksak',
+ 'searchfulltext' => 'Cari di teks lengkap',
+ 'createarticle' => 'Buat halaman',
+ 'inputbox-ns-main' => 'Utama',
+);
+
+/** Igbo (Igbo)
+ * @author Ukabia
+ */
+$messages['ig'] = array(
+ 'createarticle' => 'Ké ihü',
+);
+
+/** Iloko (Ilokano)
+ * @author Lam-ang
+ */
+$messages['ilo'] = array(
+ 'inputbox-desc' => 'Pakabaelan na nga agikabil kadagiti napalasin a kinabuklan ti HTML',
+ 'inputbox-error-no-type' => 'Saan mo pay nga imbaga no ania a kita ti pagikabilan a kahon ti aramiden.',
+ 'inputbox-error-bad-type' => 'Ti kita ti pigikabilan a kahon "$1" ket saan a ma-ammoan.
+Pangaasi ta ibagam nga "agaramid", "komentario", "biruken", "biruken2", "wenno sibubukel a testo".',
+ 'tryexact' => 'Padasem to pudno a kapada',
+ 'searchfulltext' => 'Agbiruk ti sibubukel a testo',
+ 'createarticle' => 'Agaramid ti panid',
+ 'inputbox-ns-main' => 'Dati',
+);
+
+/** Ido (Ido)
+ * @author Malafaya
+ */
+$messages['io'] = array(
+ 'searchfulltext' => 'Serchar tota texto',
+ 'createarticle' => 'Krear pagino',
+);
+
+/** Icelandic (íslenska)
+ * @author S.Örvarr.S
+ * @author Snævar
+ */
+$messages['is'] = array(
+ 'inputbox-error-no-type' => 'Þú hefur ekki tilgreint hverskonar kassa þú villt búa til.',
+ 'inputbox-error-bad-type' => '"$1" gerð innsetningarkassa þekkist ekki.
+Vinsamlegast tilgreindu "create", "comment", "search", "search2" eða "fulltext".',
+ 'createarticle' => 'Búa til síðu',
+ 'inputbox-ns-main' => 'Aðalsíða',
+);
+
+/** Italian (italiano)
+ * @author BrokenArrow
+ * @author Darth Kule
+ * @author Karika
+ */
+$messages['it'] = array(
+ 'inputbox-desc' => "Consente l'inserimento di moduli HTML predefiniti",
+ 'inputbox-error-no-type' => 'Non è stato specificato il tipo di inputbox da creare.',
+ 'inputbox-error-bad-type' => '"$1" non è un tipo di inputbox riconosciuto. Scegliere il tipo tra "create", "comment", "search", "search2" e "fulltext".',
+ 'tryexact' => 'Cerca corrispondenza esatta',
+ 'searchfulltext' => 'Ricerca nel testo',
+ 'createarticle' => 'Crea pagina',
+ 'inputbox-ns-main' => 'Principale',
+);
+
+/** Japanese (日本語)
+ * @author Fryed-peach
+ * @author JtFuruhata
+ * @author Schu
+ * @author Shirayuki
+ */
+$messages['ja'] = array(
+ 'inputbox-desc' => 'ã‚らã‹ã˜ã‚定義ã•ã‚ŒãŸHTMLフォーム埋ã‚è¾¼ã¿æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹',
+ 'inputbox-error-no-type' => '作æˆã™ã‚‹å…¥åŠ›ãƒœãƒƒã‚¯ã‚¹ã®ç¨®é¡žã‚’指定ã—ã¦ã„ã¾ã›ã‚“。',
+ 'inputbox-error-bad-type' => '「$1ã€ã¨ã„ã†ç¨®é¡žã®å…¥åŠ›ãƒœãƒƒã‚¯ã‚¹ã¯å®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“。
+"create"ã€"comment"ã€"search"ã€"search2"ã€"fulltext"ã®ã„ãšã‚Œã‹ã‚’指定ã—ã¦ãã ã•ã„。',
+ 'tryexact' => '一致ã™ã‚‹é …目を検索',
+ 'searchfulltext' => '全文検索',
+ 'createarticle' => '項目を作æˆ',
+ 'inputbox-ns-main' => '(標準)',
+);
+
+/** Jutish (jysk)
+ * @author Huslåke
+ */
+$messages['jut'] = array(
+ 'inputbox-desc' => 'Tilstån der inklusje der prædæfiiniærn HTML fårmer',
+ 'inputbox-error-no-type' => 'Du harst ekke spæsifiærn æ type der input boks til skep.',
+ 'inputbox-error-bad-type' => 'Input boks type "$1" ekke herkonnen. Spæsifiær "skep", "bimærkenge", "søÄ" æller "søÄ2".', # Fuzzy
+ 'tryexact' => 'FørsÃ¸Ä eksakt søÄnenge:',
+ 'searchfulltext' => "GennemsøÄe'n hæle tekster",
+ 'createarticle' => 'Ã…prette side',
+);
+
+/** Javanese (Basa Jawa)
+ * @author Meursault2004
+ * @author NoiX180
+ * @author Pras
+ */
+$messages['jv'] = array(
+ 'inputbox-desc' => 'Ngidinaké nganggo formulir HTML sing wis ditemtokaké',
+ 'inputbox-error-no-type' => 'Panjenengan durung nemtokaké tipe kothak input sing arep digawé.',
+ 'inputbox-error-bad-type' => 'Tipe kothak input "$1" ora dikenal.
+Supaya migunakaké "create", "comment", "search", "search2", utawa "fulltext".',
+ 'tryexact' => 'Cobanen pancocogan èksak',
+ 'searchfulltext' => 'Golèk ing tèks jangkep',
+ 'createarticle' => 'Damel artikel',
+ 'inputbox-ns-main' => 'Utama',
+);
+
+/** Georgian (ქáƒáƒ áƒ—ული)
+ * @author Alsandro
+ * @author David1010
+ * @author ITshnik
+ */
+$messages['ka'] = array(
+ 'inputbox-desc' => 'სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ იძლევრჩáƒáƒ áƒ—áƒáƒ¡ წინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒœáƒ¡áƒáƒ–ღვრული HTML ფáƒáƒ áƒ›áƒ”ბი',
+ 'inputbox-error-no-type' => 'თქვენ áƒáƒ  მიგითითებიáƒáƒ— áƒáƒ™áƒ áƒ”ფვის შესáƒáƒ¥áƒ›áƒœáƒ”ლი ველის ტიპი.',
+ 'inputbox-error-bad-type' => 'ველის შეყვáƒáƒœáƒ˜áƒ¡ უცნáƒáƒ‘ი ტიპი „$1“.
+გთხáƒáƒ•áƒ—, მიუთითეთ ერთ-ერთი დáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბი ტიპი: „create“, „comment“, „search“, „search2“ áƒáƒœ „fulltext“.',
+ 'tryexact' => 'სცáƒáƒ“ე ზუსტი დáƒáƒ›áƒ—ხვევáƒ',
+ 'searchfulltext' => 'სრული ტექსტის ძიებáƒ',
+ 'createarticle' => 'სტáƒáƒ¢áƒ˜áƒ˜áƒ¡ შექმნáƒ',
+ 'inputbox-ns-main' => 'მთáƒáƒ•áƒáƒ áƒ˜',
+);
+
+/** Kara-Kalpak (Qaraqalpaqsha)
+ */
+$messages['kaa'] = array(
+ 'createarticle' => 'Bet jaratıw', # Fuzzy
+);
+
+/** Kabyle (Taqbaylit)
+ * @author Agurzil
+ */
+$messages['kab'] = array(
+ 'tryexact' => 'Nadi ɣef uzwel kif-kif',
+ 'searchfulltext' => 'Nadi aá¸ris ettmam',
+ 'createarticle' => 'Xleq amagrad', # Fuzzy
+);
+
+/** Kazakh (Arabic script) (قازاقشا (تٴوتە)â€)
+ */
+$messages['kk-arab'] = array(
+ 'inputbox-error-no-type' => 'جاسالاتىن ەنگٸزۋ جولاعىنىڭ تٷرٸن كەلتٸرمەپسٸز.',
+ 'inputbox-error-bad-type' => 'ەنگٸزۋ جولاقتىڭ «$1» تٷرٸ تانىلمادى. تەك «create», «comment», «search» نە «search2» دەگەن تٷرلەردٸ كەلتٸرٸڭٸز.', # Fuzzy
+ 'tryexact' => 'دٵل سٵيكەسٸن سىناپ كٶرٸڭٸز',
+ 'searchfulltext' => 'تولىق مٵتٸنٸمەن ٸزدەۋ',
+ 'createarticle' => 'بەتتٸ باستاۋ',
+);
+
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ */
+$messages['kk-cyrl'] = array(
+ 'inputbox-error-no-type' => 'ЖаÑалатын енгізу жолағының түрін келтірмепÑіз.',
+ 'inputbox-error-bad-type' => 'Енгізу жолақтың «$1» түрі танылмады. Тек «create», «comment», «search» не «search2» деген түрлерді келтіріңіз.', # Fuzzy
+ 'tryexact' => 'Дәл ÑәйкеÑін Ñынап көріңіз',
+ 'searchfulltext' => 'Толық мәтінімен іздеу',
+ 'createarticle' => 'Бетті баÑтау',
+);
+
+/** Kazakh (Latin script) (qazaqşa (latın)‎)
+ */
+$messages['kk-latn'] = array(
+ 'inputbox-error-no-type' => 'Jasalatın engizw jolağınıñ türin keltirmepsiz.',
+ 'inputbox-error-bad-type' => 'Engizw jolaqtıñ «$1» türi tanılmadı. Tek «create», «comment», «search» ne «search2» degen türlerdi keltiriñiz.', # Fuzzy
+ 'tryexact' => 'Däl säýkesin sınap köriñiz',
+ 'searchfulltext' => 'Tolıq mätinimen izdew',
+ 'createarticle' => 'Betti bastaw',
+);
+
+/** Khmer (ភាសាážáŸ’មែរ)
+ * @author Chhorran
+ * @author Lovekhmer
+ * @author T-Rithy
+ */
+$messages['km'] = array(
+ 'inputbox-error-no-type' => 'អ្នកមិនទាន់បញ្ជាក់ប្រភáŸáž‘ប្រអប់បញ្ចូលដើម្បីបង្កើážáŸ”',
+ 'searchfulltext' => 'ស្វែងរកពាក្យពáŸáž‰',
+ 'createarticle' => 'បង្កើážáž‘ំពáŸážš',
+);
+
+/** Korean (한국어)
+ * @author Albamhandae
+ * @author Klutzy
+ * @author Kwj2772
+ * @author ToePeu
+ */
+$messages['ko'] = array(
+ 'inputbox-desc' => '사전 ì •ì˜ëœ HTML í¼ì„ í¬í•¨í•  수 있게 í•´ 줌',
+ 'inputbox-error-no-type' => 'type ì†ì„±ì„ 정하지 않았습니다.',
+ 'inputbox-error-bad-type' => '"$1"ì€(는) 사용할 수 없는 type ì†ì„±ìž…니다.
+"create", "comment", "search", "search2", "fulltext" 중 하나를 사용하세요.',
+ 'tryexact' => '정확한 ì´ë¦„으로 찾기',
+ 'searchfulltext' => '전체 글 검색',
+ 'createarticle' => '문서 만들기',
+ 'inputbox-ns-main' => '문서',
+);
+
+/** Komi-Permyak (Перем Коми)
+ * @author Enye Lav
+ */
+$messages['koi'] = array(
+ 'tryexact' => 'Кошшыны утлÑнно Ñiйö',
+ 'searchfulltext' => 'Кошшыны Ñ‚Ñ‹Ñ€ текÑÑ‚',
+ 'createarticle' => 'ЛöÑьöтны лиÑтбок',
+);
+
+/** Colognian (Ripoarisch)
+ * @author Purodha
+ */
+$messages['ksh'] = array(
+ 'inputbox-desc' => 'Bestemmpte HTML-Formulare könne hee met enjebonge wääde.',
+ 'inputbox-error-no-type' => 'Wat för en Zoot Kaste wells De dann han?',
+ 'inputbox-error-bad-type' => 'De Zoot „$1“ för et Feld för jet enzejevve kenne mer nit, De moss schunn „create“, „comment“, „search“, „search2“, udder „fulltext“ doför aanjevve.',
+ 'tryexact' => 'Versök en akkurate Üvvereinstimmung:',
+ 'searchfulltext' => 'Sök durch dä janze Tex',
+ 'createarticle' => 'Sigg aanlääje',
+ 'inputbox-ns-main' => '{{int:blanknamespace}}',
+);
+
+/** Kurdish (Latin script) (Kurdî (latînî)‎)
+ */
+$messages['ku-latn'] = array(
+ 'createarticle' => 'Gotarê biafirîne',
+);
+
+/** Latin (Latina)
+ */
+$messages['la'] = array(
+ 'createarticle' => 'Paginam creare',
+);
+
+/** Luxembourgish (Lëtzebuergesch)
+ * @author Robby
+ */
+$messages['lb'] = array(
+ 'inputbox-desc' => "Erlaabt d'Afüge vu viirdefinéierten HTML-Formulairen",
+ 'inputbox-error-no-type' => 'Dir hutt den Typ vu Këscht fir eppes anzeginn net uginn.',
+ 'inputbox-error-bad-type' => 'Këscht fir anzeginn vum Typ "$1" net erkannt.
+Gitt w.e.g. "create", "comment", "search", "search2" oder "fulltext" un.',
+ 'tryexact' => 'Versicht et matt der preziser Sich:',
+ 'searchfulltext' => 'Am ganzen Text sichen',
+ 'createarticle' => 'Säit uleeën',
+ 'inputbox-ns-main' => 'Haapt',
+);
+
+/** Lezghian (лезги)
+ * @author Migraghvi
+ */
+$messages['lez'] = array(
+ 'createarticle' => 'Макъала туькIуьрун',
+ 'inputbox-ns-main' => 'КЬилдин',
+);
+
+/** Lingua Franca Nova (Lingua Franca Nova)
+ * @author Malafaya
+ */
+$messages['lfn'] = array(
+ 'createarticle' => 'Crea paje',
+);
+
+/** Ganda (Luganda)
+ */
+$messages['lg'] = array(
+ 'createarticle' => 'Wandika omuko',
+);
+
+/** Limburgish (Limburgs)
+ * @author Aelske
+ * @author Matthias
+ * @author Ooswesthoesbes
+ */
+$messages['li'] = array(
+ 'inputbox-desc' => "Maakt 't toevoege van veurgedefinieerde HTML-formuliere meugelijk",
+ 'inputbox-error-no-type' => "U heeft 't type inputbox neet aangegeve. Zie [http://www.mediawiki.org/wiki/Extension:Inputbox MediaWiki.org] veur meer informatie.",
+ 'inputbox-error-bad-type' => 'Inputbox-type "$1" neet herkend.
+Gebroek "create", "comment", "search", "search2" óf "fulltext".',
+ 'tryexact' => 'Perbeer exacte euvereinkoms',
+ 'searchfulltext' => 'Zeuk de volledige teks',
+ 'createarticle' => "Maak 'n pagina aan",
+ 'inputbox-ns-main' => 'Houfnaamruumdje',
+);
+
+/** Lingala (lingála)
+ * @author Moyogo
+ */
+$messages['ln'] = array(
+ 'createarticle' => 'Kokela ekakoli',
+);
+
+/** Lao (ລາວ)
+ * @author Tuinui
+ */
+$messages['lo'] = array(
+ 'tryexact' => 'ໄປ',
+ 'searchfulltext' => 'ຊອàºàº«àº²',
+ 'createarticle' => 'ສ້າງບົດຄວາມ',
+);
+
+/** Lithuanian (lietuvių)
+ * @author Vogone
+ */
+$messages['lt'] = array(
+ 'tryexact' => 'Mėginti tikslų atitikimą',
+ 'searchfulltext' => 'Ieškoti pilno teksto',
+ 'createarticle' => 'Kurti straipsnį',
+ 'inputbox-ns-main' => 'Pagrindinis',
+);
+
+/** Latgalian (latgaļu)
+ * @author Dark Eagle
+ */
+$messages['ltg'] = array(
+ 'createarticle' => 'Sataiseit rakstīņu',
+);
+
+/** Mizo (Mizo ţawng)
+ * @author RMizo
+ */
+$messages['lus'] = array(
+ 'createarticle' => 'Hemi phêk hi siam rawh le',
+ 'inputbox-ns-main' => 'Phekpui',
+);
+
+/** Latvian (latviešu)
+ * @author Dark Eagle
+ * @author Xil
+ * @author Yyy
+ */
+$messages['lv'] = array(
+ 'inputbox-desc' => 'Atļaut iekļaut iepriekÅ¡ noteiktÄs HTML formas',
+ 'inputbox-error-no-type' => 'Tu neesi norÄdÄ«jis ievades lauka tipu',
+ 'inputbox-error-bad-type' => 'Ievades lauka tips "$1" nav atpazīts.
+LÅ«dzu norÄdi "create", "comment", "search", "search2" vai "fulltext".',
+ 'tryexact' => 'Meklēt precīzi',
+ 'searchfulltext' => 'Meklēt visu tekstu',
+ 'createarticle' => 'Izveidot lapu',
+);
+
+/** Literary Chinese (文言)
+ */
+$messages['lzh'] = array(
+ 'inputbox-error-no-type' => 'æ±æœªå®šè¼¸å…¥ç›’之類也。',
+ 'inputbox-error-bad-type' => '輸入盒之類"$1"ç„¡èªè€³ã€‚指"create"ã€"comment"ã€"search"或"search2"之。', # Fuzzy
+ 'tryexact' => '查全åˆ',
+ 'searchfulltext' => '尋全文',
+ 'createarticle' => 'æ’°æ–‡',
+);
+
+/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ */
+$messages['min'] = array(
+ 'inputbox-desc' => 'Mamungkinan panggunoan form HTML nan alah ditantuan',
+ 'inputbox-error-no-type' => 'Sanak musti manantuan jinih kotak input nan ka dibuek.',
+ 'inputbox-error-bad-type' => 'Jinih kotak input "$1" indak dikenal.
+Gunoan "create", "comment", "search", "search2", atau "fulltext".',
+ 'tryexact' => 'Cubo pancocokan eksak',
+ 'searchfulltext' => 'Cari teks langkok',
+ 'createarticle' => 'Buek laman',
+ 'inputbox-ns-main' => 'Utamo',
+);
+
+/** Macedonian (македонÑки)
+ * @author Bjankuloski06
+ * @author Brest
+ * @author Misos
+ */
+$messages['mk'] = array(
+ 'inputbox-desc' => 'Овозможува вклучување на предодредени HTML-облици',
+ 'inputbox-error-no-type' => 'Ðемате наведено тип на поле за Ð²Ð½Ð¾Ñ ÐºÐ¾Ðµ Ñакате да го Ñоздадете.',
+ 'inputbox-error-bad-type' => 'Типот на полето за Ð²Ð½Ð¾Ñ â€ž$1“ не е познат.
+Укажете еден од допуштените: „create“, „comment“, „search“, „search2“ или „fulltext“.',
+ 'tryexact' => 'Строго ова',
+ 'searchfulltext' => 'По цел текÑÑ‚',
+ 'createarticle' => 'Создај Ñтраница',
+ 'inputbox-ns-main' => 'Главна',
+);
+
+/** Malayalam (മലയാളം)
+ * @author Praveenp
+ * @author Shijualex
+ */
+$messages['ml'] = array(
+ 'inputbox-desc' => 'നിർവàµà´µà´šà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿàµ വെചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ HTML ഫോമàµà´•àµ¾ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¾àµ» à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´•',
+ 'inputbox-error-no-type' => 'സൃഷàµà´Ÿà´¿à´•àµà´•àµ‡à´£àµà´Ÿ ഇൻപàµà´Ÿàµà´Ÿàµ ബോകàµà´¸à´¿à´¨àµà´±àµ† തരം നിഷàµà´•àµ¼à´·à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿà´¿à´²àµà´²',
+ 'inputbox-error-bad-type' => 'ഇൻപàµà´Ÿàµà´Ÿàµ ബോകàµà´¸àµ "$1" à´à´¤àµ തരം à´Žà´¨àµà´¨àµ തിരിചàµà´šà´±à´¿à´¯à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´².
+ദയവൠചെയàµà´¤àµ "create", "comment", "search", "search2" ഇവയിലൊനàµà´¨àµ നിഷàµà´•àµ¼à´·à´¿à´•àµà´•àµà´•',
+ 'tryexact' => 'കൃതàµà´¯à´®à´¾à´¯à´¿ യോജികàµà´•àµà´¨àµà´¨ ഫലങàµà´™àµ¾ ഉണàµà´Ÿàµ‹à´¯àµ†à´¨àµà´¨àµ പരിശോധികàµà´•àµà´•',
+ 'searchfulltext' => 'à´Žà´´àµà´¤àµà´¤àµ മൊതàµà´¤à´®à´¾à´¯à´¿ തിരയàµà´•',
+ 'createarticle' => 'താൾ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´•',
+ 'inputbox-ns-main' => 'à´®àµà´–àµà´¯à´‚',
+);
+
+/** Mongolian (монгол)
+ * @author Chinneeb
+ */
+$messages['mn'] = array(
+ 'createarticle' => 'Ð¥ÑƒÑƒÐ´Ð°Ñ Ò¯Ò¯ÑгÑÑ…',
+);
+
+/** Marathi (मराठी)
+ * @author Kaustubh
+ * @author Mahitgar
+ * @author Rahuldeshmukh101
+ * @author V.narsikar
+ */
+$messages['mr'] = array(
+ 'inputbox-desc' => 'पूरà¥à¤µà¥€ लिहिलेले HTML अरà¥à¤œ वापरणà¥à¤¯à¤¾à¤šà¥€ परवानगी दà¥à¤¯à¤¾',
+ 'inputbox-error-no-type' => 'तà¥à¤®à¥à¤¹à¥€ कà¥à¤ à¤²à¥à¤¯à¤¾ पà¥à¤°à¤•à¤¾à¤°à¤šà¥€ पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€ तयार करायची ते सà¥à¤ªà¤·à¥à¤Ÿ केलेले नाही.',
+ 'inputbox-error-bad-type' => 'तà¥à¤®à¥à¤¹à¥€ दिलेला पृषà¥à¤ à¤ªà¥‡à¤Ÿà¥€à¤šà¤¾ "$1" हा पà¥à¤°à¤•à¤¾à¤° ओळखीचा नाही.
+कृपया "create", "comment", "search" किंवा "search2" किंवा "fulltext".यातील à¤à¤• निवडा.',
+ 'tryexact' => 'दिलेलेच शबà¥à¤¦ शोधा',
+ 'searchfulltext' => 'पूरà¥à¤£ मजकूर शोधा',
+ 'createarticle' => 'लेख बनवा',
+ 'inputbox-ns-main' => 'मà¥à¤–à¥à¤¯',
+);
+
+/** Malay (Bahasa Melayu)
+ * @author Anakmalaysia
+ * @author Aviator
+ */
+$messages['ms'] = array(
+ 'inputbox-desc' => 'Membenarkan penyertaan borang HTML yang sudah ditetapkan.',
+ 'inputbox-error-no-type' => 'Anda tidak menyatakan jenis kotak input untuk diciptakan.',
+ 'inputbox-error-bad-type' => 'Jenis kotak input "$1" tidak dikenali. Sila nyatakan "create", "comment", "search", "search2" atau "fulltext".',
+ 'tryexact' => 'Cuba padanan tepat',
+ 'searchfulltext' => 'Cari dalam teks penuh',
+ 'createarticle' => 'Cipta laman',
+ 'inputbox-ns-main' => 'Utama',
+);
+
+/** Maltese (Malti)
+ * @author Chrisportelli
+ * @author Giangian15
+ */
+$messages['mt'] = array(
+ 'inputbox-desc' => "Tħalli formuli ta' HTML predefiniti",
+ 'inputbox-error-no-type' => "Inti ma speċifikajtx it-tip ta' ''input box'' li trid toħloq.",
+ 'inputbox-error-bad-type' => '"$1" mhuwiex tip magħruf ta\' \'\'inputbox\'\'.
+Jekk jogħġbok speċifika fost "create", "comment", "search", "search2" jew "fulltext".',
+ 'tryexact' => 'Fittex korrispondenza eżatta',
+ 'searchfulltext' => 'Fittex fit-test',
+ 'createarticle' => 'Oħloq paġna',
+ 'inputbox-ns-main' => 'Prinċipali',
+);
+
+/** Erzya (ÑрзÑнь)
+ * @author Botuzhaleny-sodamo
+ */
+$messages['myv'] = array(
+ 'createarticle' => 'Ð¨ÐºÐ°Ð¼Ñ Ð»Ð¾Ð¿Ð°',
+);
+
+/** Mazanderani (مازÙرونی)
+ * @author Mehdi
+ * @author Spacebirdy
+ * @author محک
+ */
+$messages['mzn'] = array(
+ 'createarticle' => 'صÙحه بساتن',
+);
+
+/** Nahuatl (NÄhuatl)
+ * @author Fluence
+ */
+$messages['nah'] = array(
+ 'createarticle' => 'TicchÄ«huÄz zÄzanilli',
+);
+
+/** Min Nan Chinese (Bân-lâm-gú)
+ */
+$messages['nan'] = array(
+ 'searchfulltext' => 'Chhiau choan-bûn',
+);
+
+/** Neapolitan (Nnapulitano)
+ * @author Chelin
+ * @author SabineCretella
+ */
+$messages['nap'] = array(
+ 'searchfulltext' => "Ascià dint''o testo",
+ 'createarticle' => 'Cria paggena',
+);
+
+/** Norwegian Bokmål (norsk (bokmål)‎)
+ * @author EivindJ
+ */
+$messages['nb'] = array(
+ 'inputbox-desc' => 'Tillater inkludering av forhåndsdefinerte HTML-skjemaer',
+ 'inputbox-error-no-type' => 'Du har ikke angitt hva slags inputboks du vil lage.',
+ 'inputbox-error-bad-type' => 'Inputboks av typen «$1» gjenkjennes ikke.
+Vennligst velg «create», «comment», «search», «search2» eller «fulltext».',
+ 'tryexact' => 'Prøv nøyaktig treff',
+ 'searchfulltext' => 'Søk full tekst',
+ 'createarticle' => 'Opprett side',
+ 'inputbox-ns-main' => 'Hoved',
+);
+
+/** Low German (Plattdüütsch)
+ * @author Slomox
+ */
+$messages['nds'] = array(
+ 'inputbox-desc' => 'Verlöövt dat Inbinnen vun vördefineerte HTML-Formularen',
+ 'inputbox-error-no-type' => 'Du hest keen Typ för dat Ingaav-Feld angeven.',
+ 'inputbox-error-bad-type' => 'De Typ „$1“ för dat Ingaav-Feld is nich bekannt.
+Geev een vun disse Typen an: „create“, „comment“, „search“, „search2“ oder „fulltext“.',
+ 'tryexact' => 'exakte Söök versöken',
+ 'searchfulltext' => 'in’n Vulltext söken',
+ 'createarticle' => 'Siet anleggen',
+);
+
+/** Nedersaksies (Nedersaksies)
+ * @author Servien
+ */
+$messages['nds-nl'] = array(
+ 'tryexact' => 'Naor sekuur zeuken',
+ 'searchfulltext' => 'De hele tekste deurzeuken',
+ 'createarticle' => 'Nieje zied anmaken',
+);
+
+/** Nepali (नेपाली)
+ */
+$messages['ne'] = array(
+ 'createarticle' => 'लेख थालà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
+);
+
+/** Niuean (ko e vagahau Niuē)
+ * @author Jose77
+ */
+$messages['niu'] = array(
+ 'createarticle' => 'Talaga tohi tala',
+);
+
+/** Dutch (Nederlands)
+ * @author SPQRobin
+ * @author Siebrand
+ */
+$messages['nl'] = array(
+ 'inputbox-desc' => 'Maakt het toevoegen van voorgedefinieerde HTML-formulieren mogelijk',
+ 'inputbox-error-no-type' => 'U hebt het type invoerveld niet opgegeven.',
+ 'inputbox-error-bad-type' => 'Type invoerveld "$1" niet herkend.
+Gebruik "create", "comment", "search", "search2" of "fulltext".',
+ 'tryexact' => 'Zoeken op exacte overeenkomst',
+ 'searchfulltext' => 'Volledige tekst doorzoeken',
+ 'createarticle' => 'Pagina aanmaken',
+ 'inputbox-ns-main' => 'Hoofdnaamruimte',
+);
+
+/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
+ * @author Siebrand
+ */
+$messages['nl-informal'] = array(
+ 'inputbox-error-no-type' => 'Je hebt het type invoerveld niet opgegeven.',
+);
+
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
+ * @author Frokor
+ * @author Harald Khan
+ * @author Njardarlogar
+ */
+$messages['nn'] = array(
+ 'inputbox-desc' => 'Tillet inkludering av førehandsdefinerte HTML-skjema',
+ 'inputbox-error-no-type' => 'Du har ikkje gjeve kva slags inputboks du vil lage.',
+ 'inputbox-error-bad-type' => 'Inntekstboks av typen «$1» vart ikkje gjenkjent.
+Ver venleg og velg «create», «comment», «search», «search2», eller «fulltext».',
+ 'tryexact' => 'Prøv nøyaktig treff',
+ 'searchfulltext' => 'Søk i all tekst',
+ 'createarticle' => 'Lag side',
+);
+
+/** Novial (Novial)
+ * @author Malafaya
+ */
+$messages['nov'] = array(
+ 'searchfulltext' => 'Sercha kompleti texte',
+);
+
+/** Northern Sotho (Sesotho sa Leboa)
+ * @author Mohau
+ */
+$messages['nso'] = array(
+ 'createarticle' => 'Tlhoma letlakala',
+);
+
+/** Occitan (occitan)
+ * @author Cedric31
+ */
+$messages['oc'] = array(
+ 'inputbox-desc' => 'Permet l’inclusion de formularis HTML predefinits',
+ 'inputbox-error-no-type' => "Avètz pas precisat lo tipe de la bóstia d'entrada de crear.",
+ 'inputbox-error-bad-type' => "Tipe de bóstia d'entrada « $1 » pas reconeguda.
+Indicatz una opcion demest ''create'', ''comment'', ''search'' o ''searche2'' o « fulltext ».",
+ 'tryexact' => 'Ensajatz la correspondéncia exacta',
+ 'searchfulltext' => 'Recèrca en tèxte integral',
+ 'createarticle' => 'Crear l’article',
+ 'inputbox-ns-main' => 'Principal',
+);
+
+/** Oriya (ଓଡ଼ିଆ)
+ * @author Odisha1
+ * @author Psubhashish
+ */
+$messages['or'] = array(
+ 'inputbox-desc' => 'ଆଗରୠତିଆରି HTML ରୂପରେ ଆହରଣକୠଅନà­à¬®à­‹à¬¦à¬¨ ଦେବା',
+ 'inputbox-error-no-type' => 'ଆପଣ ନିବେଶ ଘରେ ଦେବାକୠଥିବା ଲେଖାର ପà­à¬°à¬•à¬¾à¬° à¬à¬¯à¬¾à¬à¬ ଦେଇନାହାନà­à¬¤à¬¿ ।',
+ 'inputbox-error-bad-type' => 'ନିବେଶ ଘର ପà­à¬°à¬•à¬¾à¬° "$1" ବାରିପାରିଲୠନାହିଠ।
+ଦୟାକରି "create", "comment", "search", "search2" ଅବା "fulltext" ସà­à¬¥à¬¿à¬° କରନà­à¬¤à­ ।',
+ 'tryexact' => 'ପà­à¬°à¬¾à¬ªà­à¬°à¬¿ ମେଳ କରିବାକୠଚେଷà­à¬Ÿà¬¾ କରିବେ',
+ 'searchfulltext' => 'ପà­à¬°à¬¾ ଲେଖା ଖୋଜିବେ',
+ 'createarticle' => 'ନୂଆ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬ ତିଆରିବେ',
+ 'inputbox-ns-main' => 'ମà­à¬–à­à­Ÿ',
+);
+
+/** Pangasinan (Pangasinan)
+ */
+$messages['pag'] = array(
+ 'createarticle' => 'Mangawa na artikulo',
+);
+
+/** Pampanga (Kapampangan)
+ */
+$messages['pam'] = array(
+ 'createarticle' => 'Gawang artikulu',
+);
+
+/** Deitsch (Deitsch)
+ * @author Xqt
+ */
+$messages['pdc'] = array(
+ 'inputbox-ns-main' => 'Bledder',
+);
+
+/** Polish (polski)
+ * @author Derbeth
+ * @author Sp5uhe
+ */
+$messages['pl'] = array(
+ 'inputbox-desc' => 'Umożliwia włączenie w treść strony wcześniej zdefiniowanych formularzy HTML',
+ 'inputbox-error-no-type' => 'Typ pola wejściowego nie został określony',
+ 'inputbox-error-bad-type' => 'Typ „$1†pola wejściowego nie został rozpoznany.
+Należy wybrać „createâ€, „commentâ€, „searchâ€, „search2†or „fulltextâ€.',
+ 'tryexact' => 'Użyj dokładnego wyrażenia',
+ 'searchfulltext' => 'Szukaj w całych tekstach',
+ 'createarticle' => 'Utwórz artykuł',
+ 'inputbox-ns-main' => 'Główna',
+);
+
+/** Piedmontese (Piemontèis)
+ * @author Borichèt
+ * @author Bèrto 'd Sèra
+ * @author Dragonòt
+ */
+$messages['pms'] = array(
+ 'inputbox-desc' => "A përmëtt l'anseriment ëd forme HTML predefinìe",
+ 'inputbox-error-no-type' => "A l'ha nen dit che sòrt ëd quàder ëd caria dat ch'a debia fesse.",
+ 'inputbox-error-bad-type' => 'La sòrt ëd quàder "$1" a l\'é nen conossùa.
+Për piasì, ch\'a sërna antra "create", "comment", "search", "search2" o "fulltext".',
+ 'tryexact' => 'Sërca che a sia pròpe parej',
+ 'searchfulltext' => 'Sërca an tut ël test',
+ 'createarticle' => 'Creé na pàgina',
+ 'inputbox-ns-main' => 'Prinsipal',
+);
+
+/** Western Punjabi (پنجابی)
+ * @author Khalid Mahmood
+ */
+$messages['pnb'] = array(
+ 'inputbox-desc' => 'ایچ Ù¹ÛŒ ایم ایل پریڈیÙائینڈ Ùورمز نوں رلان دی اجازت دیو۔',
+ 'inputbox-error-no-type' => 'تساں انپٹ ڈبے بنان دی ٹائپ نئیں دسی۔',
+ 'inputbox-error-bad-type' => 'انپٹ ÚˆØ¨Û Ù¹Ø§Ø¦Ù¾ "$1" نئیں پچھانیا گیا۔
+Ù…Ûربانی کرکے "create", "comment", "search", "search2" "fulltext" بارے دسو۔',
+ 'tryexact' => 'ٹھیک جوڑ رلاؤ',
+ 'searchfulltext' => 'پوری لکھت لبو',
+ 'createarticle' => 'صÙÛ Ø¨Ù†Ø§Ø¤',
+ 'inputbox-ns-main' => 'مین',
+);
+
+/** Pontic (Ποντιακά)
+ * @author Sinopeus
+ */
+$messages['pnt'] = array(
+ 'createarticle' => 'Ποίσον σελίδαν',
+);
+
+/** Pashto (پښتو)
+ * @author Ahmed-Najib-Biabani-Ibrahimkhel
+ */
+$messages['ps'] = array(
+ 'inputbox-desc' => 'د پخوا نه د HTML څرګند شويو Ùورمو کارولو اجازه ورکوي',
+ 'tryexact' => 'Ú©Ù¼ مټ انډول ÙŠÛ ÙˆØ¢Ø²Ù…ÙˆÙŠÙ‡',
+ 'searchfulltext' => 'بشپړ متن پلټل',
+ 'createarticle' => 'Ù†ÙˆÛ Ù„ÙŠÚ©Ù†Ù‡ پيلول',
+ 'inputbox-ns-main' => 'آرنی',
+);
+
+/** Portuguese (português)
+ * @author Hamilton Abreu
+ * @author Malafaya
+ */
+$messages['pt'] = array(
+ 'inputbox-desc' => 'Permite a inclusão de formulários HTML pré-definidos.',
+ 'inputbox-error-no-type' => 'Não especificou o tipo de caixa de edição a ser criado.',
+ 'inputbox-error-bad-type' => 'O tipo de caixa de introdução de dados "$1" não foi reconhecido.
+Por favor, especifique "create", "comment", "search", "search2" ou "fulltext".',
+ 'tryexact' => 'Tentar a exata expressão',
+ 'searchfulltext' => 'Pesquisar no texto completo',
+ 'createarticle' => 'Criar página',
+ 'inputbox-ns-main' => 'Principal',
+);
+
+/** Brazilian Portuguese (português do Brasil)
+ * @author Brunoy Anastasiya Seryozhenko
+ * @author Eduardo.mps
+ * @author MetalBrasil
+ */
+$messages['pt-br'] = array(
+ 'inputbox-desc' => 'Permite a inclusão de formulários definidos de HTML',
+ 'inputbox-error-no-type' => 'Você não especificou o tipo de inputbox a ser criada.',
+ 'inputbox-error-bad-type' => 'O tipo de caixa de introdução de dados "$1" não foi reconhecido.
+Por favor, especifique "create", "comment", "search", "search2" ou "fulltext".',
+ 'tryexact' => 'Tentar a expressão exata',
+ 'searchfulltext' => 'Pesquisar em todo o texto.',
+ 'createarticle' => 'Criar página.',
+ 'inputbox-ns-main' => 'Principal',
+);
+
+/** Quechua (Runa Simi)
+ * @author AlimanRuna
+ */
+$messages['qu'] = array(
+ 'tryexact' => 'Hinalla taripanayaspa maskay',
+ 'searchfulltext' => "Hunt'a qillqata maskay",
+ 'createarticle' => 'Qillqata kamariy',
+);
+
+/** Romanian (română)
+ * @author AdiJapan
+ * @author Emily
+ * @author Firilacroco
+ * @author KlaudiuMihaila
+ * @author Mihai
+ * @author Minisarm
+ */
+$messages['ro'] = array(
+ 'inputbox-desc' => 'Permite includerea formelor HTML predefinite',
+ 'inputbox-error-no-type' => 'Nu ați specificat ce tip de cutie intrare să fie creată.',
+ 'inputbox-error-bad-type' => 'Tipul de cutie intrare „$1†nu este recunoscut.
+Vă rugăm să specificaÈ›i parametrii „createâ€, „commentâ€, „searchâ€, „search2†sau „fulltextâ€.',
+ 'tryexact' => 'Încearcă varianta exactă',
+ 'searchfulltext' => 'Caută textul întreg',
+ 'createarticle' => 'Creează pagină',
+ 'inputbox-ns-main' => 'Principal',
+);
+
+/** tarandíne (tarandíne)
+ * @author Joetaras
+ */
+$messages['roa-tara'] = array(
+ 'inputbox-desc' => "Permette l'inglusione de module predefinite de HTML",
+ 'inputbox-error-no-type' => "Tu non g'è specificate 'u tipe de scatele de input da ccrejà.",
+ 'inputbox-error-bad-type' => '\'U tipe d\'a scatele de input "$1" non g\'è corrette.
+Pe piacere mitte "create", "comment", "search", "search2" o "fulltext".',
+ 'tryexact' => "Pruève cu 'u combronde satte-satte",
+ 'searchfulltext' => "Cirche jndr'à tutte 'u teste",
+ 'createarticle' => "Ccreje 'a vôsce",
+ 'inputbox-ns-main' => 'Prengepàle',
+);
+
+/** Russian (руÑÑкий)
+ * @author ÐлекÑандр Сигачёв
+ */
+$messages['ru'] = array(
+ 'inputbox-desc' => 'ПозволÑет включать заранее определённые HTML-формы',
+ 'inputbox-error-no-type' => 'Ð’Ñ‹ не указали тип Ñоздаваемого Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°.',
+ 'inputbox-error-bad-type' => 'ÐеизвеÑтный тип Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð° «$1».
+ПожалуйÑта, укажите один из допуÑтимых типов: «create», «comment», «search», «search2» или «fulltext».',
+ 'tryexact' => 'Строгий поиÑк',
+ 'searchfulltext' => 'ПолнотекÑтовый поиÑк',
+ 'createarticle' => 'Создать Ñтатью',
+ 'inputbox-ns-main' => 'ГлавнаÑ',
+);
+
+/** Rusyn (руÑиньÑкый)
+ * @author Gazeb
+ */
+$messages['rue'] = array(
+ 'inputbox-desc' => 'Доволює вкладати вызначены HTML формуларї.',
+ 'inputbox-error-no-type' => 'Ðе задали Ñьте тіп формуларёвого Ð¿Ð¾Ð»Ñ Ð¿Ñ€Ð¾ ÑтворїнÑ.',
+ 'inputbox-error-bad-type' => 'Ðерозпознаный тіп Ð¿Ð¾Ð»Ñ â€ž$1“.
+Зазначте єдну з можноÑтей: „create“, „comment“, „search“, „search2“ або „fulltext“.',
+ 'tryexact' => 'Спробуйте точне глÑданÑ',
+ 'searchfulltext' => 'ПовнотекÑтове глÑданÑ',
+ 'createarticle' => 'Створити Ñтатю',
+ 'inputbox-ns-main' => 'Головна',
+);
+
+/** Aromanian (Armãneashce)
+ */
+$messages['rup'] = array(
+ 'createarticle' => 'Adrats articlu', # Fuzzy
+);
+
+/** Sanskrit (संसà¥à¤•à¥ƒà¤¤à¤®à¥)
+ * @author Ansumang
+ * @author Shubha
+ */
+$messages['sa'] = array(
+ 'inputbox-desc' => 'पूरà¥à¤µà¤¨à¤¿à¤°à¥‚पितसà¥à¤¯ HTML पà¥à¤°à¤ªà¤¤à¥à¤°à¤¯à¥‹à¤œà¤¨à¤®à¥ अनà¥à¤®à¤¨à¥à¤¯à¤¤à¤¾à¤®à¥',
+ 'inputbox-error-no-type' => 'कीदृशी पूरणपेटिका निरà¥à¤®à¤¾à¤¤à¤µà¥à¤¯à¤¾ इति भवता न निरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¤®à¥ ।',
+ 'inputbox-error-bad-type' => 'पूरणपेटिकापà¥à¤°à¤•à¤¾à¤°à¤ƒ "$1" न अभिजà¥à¤žà¤¾à¤¤à¤ƒ ।
+"निरà¥à¤®à¤¿à¤¤à¤¿à¤ƒ", "विमरà¥à¤¶à¤ƒ", "अनà¥à¤µà¥‡à¤·à¤£à¤®à¥", "अनà¥à¤µà¥‡à¤·à¤£à¤®à¥ २" अथवा "पूरà¥à¤£à¤ªà¤¾à¤ à¥à¤¯à¤¾à¤‚शः" इति निरà¥à¤¦à¤¿à¤¶à¥à¤¯à¤¤à¤¾à¤®à¥ ।',
+ 'tryexact' => 'दतà¥à¤¤à¤ƒ शबà¥à¤¦à¤ƒ à¤à¤µ लिखà¥à¤¯à¤¤à¤¾à¤®à¥',
+ 'searchfulltext' => 'समà¥à¤ªà¥‚रà¥à¤£à¤ƒ पाठà¥à¤¯à¤¾à¤‚शः अनà¥à¤µà¤¿à¤·à¥à¤¯à¤¤à¤¾à¤®à¥',
+ 'createarticle' => 'पृषà¥à¤ à¤‚ सृजà¥à¤¯à¤¤à¤¾à¤®à¥',
+ 'inputbox-ns-main' => 'मà¥à¤–à¥à¤¯',
+);
+
+/** Sakha (Ñаха тыла)
+ * @author HalanTul
+ */
+$messages['sah'] = array(
+ 'inputbox-desc' => 'ЭрдÑÑ‚Ñ‚Ñн талыллыбыт HTML-формалары холбуур',
+ 'inputbox-error-no-type' => 'Ð’Ñ‹ не указали тип Ñоздаваемого Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð°.',
+ 'inputbox-error-bad-type' => '«$1» ÐºÓ©Ñ€Ò¯Ò¥Ñ ÐºÑ‹Ð°Ð¹Ð°Ð½ өйдөммөтө. Бука диÑн көҥүллÑнÑри тал: «create», «comment», «search», «search2» ÑбÑÑ‚ÑÑ€ «fulltext».',
+ 'tryexact' => 'Чопчу булуу',
+ 'searchfulltext' => 'ТиÑкиһин барытын көрдөөһүн',
+ 'createarticle' => 'ЫÑтатыйаны айарга',
+ 'inputbox-ns-main' => 'Сүрүн',
+);
+
+/** Sardinian (sardu)
+ * @author Marzedu
+ */
+$messages['sc'] = array(
+ 'createarticle' => 'Crea artìculu',
+);
+
+/** Sicilian (sicilianu)
+ * @author Aushulz
+ * @author Santu
+ */
+$messages['scn'] = array(
+ 'inputbox-desc' => 'Pirmetti nzirimenti di mòduli HTML predifiniti',
+ 'inputbox-error-no-type' => 'Non vinni spicificatu lu tipu di inputbox di criari.',
+ 'inputbox-error-bad-type' => '"$1" nun è nu tipu di inputbox canusciutu. S\'hà scègghiri lu tipu ntra "create", "comment", "search" e "search2".',
+ 'tryexact' => 'Cerca currispunnenza giusta',
+ 'searchfulltext' => 'Circata ntô testu',
+ 'createarticle' => 'Cria vuci',
+ 'inputbox-ns-main' => 'Principali',
+);
+
+/** Sindhi (سنڌي)
+ */
+$messages['sd'] = array(
+ 'createarticle' => 'نئون مضمون لکو', # Fuzzy
+);
+
+/** Sango (Sängö)
+ */
+$messages['sg'] = array(
+ 'createarticle' => 'Sü soura',
+);
+
+/** Samogitian (žemaitėška)
+ * @author Hugo.arg
+ */
+$messages['sgs'] = array(
+ 'searchfulltext' => 'Ėiškuotė pėlna teksta',
+);
+
+/** Sinhala (සිංහල)
+ * @author Asiri wiki
+ * @author Budhajeewa
+ * @author නන්දිමිතුරු
+ * @author බිඟුවà·
+ */
+$messages['si'] = array(
+ 'inputbox-desc' => 'පූර්වà·à¶»à·Šà¶®à¶¯à·à¶šà·Šà·€à·–ණු HTML ආකà·à¶»à¶ºà¶±à·Š අඩංගුකිරීමට ඉඩදෙන්න',
+ 'inputbox-error-no-type' => 'තà·à¶±à·’ය යුතු ප්â€à¶»à¶¯à·à¶± කොටුවේ මà·à¶¯à·’ලිය ඔබ විසින් නිර්දේ෠කොට දක්ව෠නොමà·à¶­.',
+ 'inputbox-error-bad-type' => '"$1" ඇතුලත් කෙරුම් කොටු වර්ගය හඳුනà·à¶œà¶­ නොහà·à¶š.
+"create", "comment", "search", "search2" හ෠"fulltext" බව සඳහන් කරන්න.',
+ 'tryexact' => 'තථ්â€à¶º ගà·à¶½à¶´à·“ම වෑයම් කරන්න',
+ 'searchfulltext' => 'සම්පූර්ණ පෙළ ගවේෂණය කරන්න',
+ 'createarticle' => 'පිටුවක් à·ƒà·à¶¯à¶±à·Šà¶±',
+ 'inputbox-ns-main' => 'ප්â€à¶»à¶°à·à¶±',
+);
+
+/** Slovak (slovenÄina)
+ * @author Helix84
+ * @author Teslaton
+ */
+$messages['sk'] = array(
+ 'inputbox-desc' => 'Umožňuje vloženie preddefinovaných HTML formulárov',
+ 'inputbox-error-no-type' => 'Neuviedli ste typ vstupného poľa, ktoré sa má vytvoriť.',
+ 'inputbox-error-bad-type' => 'Vstupné pole typu „$1“ nie je podporované.
+Prosím, použite „create“, „comment“, „search“ alebo „search2“.',
+ 'tryexact' => 'Skúste presné vyhľadávanie',
+ 'searchfulltext' => 'Fulltextové vyhľadávanie',
+ 'createarticle' => 'Vytvoriť stránku',
+ 'inputbox-ns-main' => 'Hlavný',
+);
+
+/** Slovenian (slovenÅ¡Äina)
+ * @author Dbc334
+ * @author Eleassar
+ * @author Irena Plahuta
+ */
+$messages['sl'] = array(
+ 'inputbox-desc' => 'OmogoÄa vkljuÄitev vnaprej doloÄenih obrazcev HTML',
+ 'inputbox-error-no-type' => 'Niste doloÄili vrste vnosnega polja za ustvarjanje.',
+ 'inputbox-error-bad-type' => 'Vrsta vnosnega polja »$1« ni prepoznana.
+Prosimo, doloÄite »create«, »comment«, »search«, »search2« ali »fulltext«.',
+ 'tryexact' => 'Poskusite z natanÄnim ujemanjem',
+ 'searchfulltext' => 'PreiÅ¡Äi vse besedilo',
+ 'createarticle' => 'Ustvari stran',
+ 'inputbox-ns-main' => 'Osnovno',
+);
+
+/** Albanian (shqip)
+ * @author Dori
+ * @author Olsi
+ */
+$messages['sq'] = array(
+ 'inputbox-desc' => 'Lejoni futjen e formave të paracaktuara HTML',
+ 'inputbox-error-no-type' => 'Ju nuk keni specifikuar llojin e kutisë për ta krijuar.',
+ 'inputbox-error-bad-type' => 'Lloji i kutisë "$1" nuk njihet.
+Ju lutemi specifikoni "create", "comment", "search", "search2" ose "fulltext".',
+ 'tryexact' => 'Kërko përputhje të plotë',
+ 'searchfulltext' => 'Kërko tekstin e plotë',
+ 'createarticle' => 'Krijo artikull',
+ 'inputbox-ns-main' => 'Kryesor',
+);
+
+/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Millosh
+ * @author Rancher
+ * @author Михајло Ðнђелковић
+ */
+$messages['sr-ec'] = array(
+ 'inputbox-desc' => 'Омогући укључивање претходно дефиниÑаних HTML форми.',
+ 'inputbox-error-no-type' => 'ÐиÑи одредио тип уноÑне кутије да би је направио.',
+ 'inputbox-error-bad-type' => 'Тип "$1" кутијице за ÑƒÐ½Ð¾Ñ Ð¿Ð¾Ð´Ð°Ñ‚Ð°ÐºÐ° је непознат.
+Молимо Ð²Ð°Ñ Ð´Ð° га промените на "create", "comment", "search", "search2" или "fulltext".',
+ 'tryexact' => 'Покушај тачно',
+ 'searchfulltext' => 'Претражи цео текÑÑ‚',
+ 'createarticle' => 'Ðаправи чланак',
+ 'inputbox-ns-main' => 'Главни',
+);
+
+/** Serbian (Latin script) (srpski (latinica)‎)
+ * @author Michaello
+ */
+$messages['sr-el'] = array(
+ 'inputbox-desc' => 'Omogući ukljuÄivanje prethodno definisanih HTML formi.',
+ 'inputbox-error-no-type' => 'Nisi odredio tip unosne kutije da bi je napravio.',
+ 'inputbox-error-bad-type' => 'Tip "$1" kutijice za unos podataka je nepoznat.
+Molimo vas da ga promenite na "create", "comment", "search", "search2" ili "fulltext".',
+ 'tryexact' => 'PokuÅ¡aj taÄno',
+ 'searchfulltext' => 'Pretraži ceo tekst',
+ 'createarticle' => 'Napravi Älanak',
+ 'inputbox-ns-main' => 'Glavni',
+);
+
+/** Swati (SiSwati)
+ * @author Jatrobat
+ */
+$messages['ss'] = array(
+ 'createarticle' => 'Kúdála intfo',
+);
+
+/** Seeltersk (Seeltersk)
+ * @author Maartenvdbent
+ * @author Pyt
+ */
+$messages['stq'] = array(
+ 'inputbox-desc' => 'Ferlööwet dät Apniemen fon foardefinierde HTML-Formulare',
+ 'inputbox-error-no-type' => 'Du hääst naan Inputbox-Typ ounroat.',
+ 'inputbox-error-bad-type' => 'Iengoawefäild-Typ "$1" uunbekoand.
+Reek n gultigen Typ an: „create“, „comment“, „search“, „search2“ of "fulltext".',
+ 'tryexact' => 'Fersäik exakte Säike:',
+ 'searchfulltext' => 'Dän ganse Text truchsäike',
+ 'createarticle' => 'Siede anlääse',
+);
+
+/** Sundanese (Basa Sunda)
+ * @author Irwangatot
+ */
+$messages['su'] = array(
+ 'tryexact' => 'Coba jeung anu cocog',
+ 'searchfulltext' => 'Sungsi dina téks lengkap',
+ 'createarticle' => 'Jieun artikel',
+);
+
+/** Swedish (svenska)
+ * @author Boivie
+ * @author Lejonel
+ * @author Najami
+ */
+$messages['sv'] = array(
+ 'inputbox-desc' => 'Ger möjlighet att använda fördefinerade HTML-formulär.',
+ 'inputbox-error-no-type' => 'Du har inte angivit vilken typ av inputbox som ska skapas..',
+ 'inputbox-error-bad-type' => '"$1" är inte en känd typ av inputbox.
+Var god specifiera "create", "comment", "search", "search2" eller "fulltext".',
+ 'tryexact' => 'Försök hitta exakt matchning',
+ 'searchfulltext' => 'Fulltextsökning',
+ 'createarticle' => 'Skapa sida',
+ 'inputbox-ns-main' => 'Huvud',
+);
+
+/** Swahili (Kiswahili)
+ * @author Lloffiwr
+ */
+$messages['sw'] = array(
+ 'createarticle' => 'Anzisha ukurasa',
+ 'inputbox-ns-main' => 'Kuu',
+);
+
+/** Silesian (ślůnski)
+ * @author Ozi64
+ * @author Przemub
+ */
+$messages['szl'] = array(
+ 'createarticle' => 'Naszkryflej artikel',
+);
+
+/** Tamil (தமிழà¯)
+ * @author Kanags
+ * @author Karthi.dr
+ * @author Shanmugamp7
+ * @author TRYPPN
+ */
+$messages['ta'] = array(
+ 'inputbox-error-no-type' => 'எவà¯à®µà®•à¯ˆà®¯à®¾à®© உளà¯à®³à¯€à®Ÿà¯à®Ÿà¯à®ªà¯ பெடà¯à®Ÿà®¿à®¯à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯à®µà®¤à¯ எனà¯à®ªà®¤à¯ˆ நீஙà¯à®•à®³à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
+ 'tryexact' => 'சரியான பொரà¯à®¤à¯à®¤à®¤à¯à®¤à¯ˆ à®®à¯à®¯à®±à¯à®šà®¿ செயà¯',
+ 'searchfulltext' => ' à®®à¯à®´à¯ உரையையà¯à®®à¯ தேடà¯',
+ 'createarticle' => 'பகà¯à®•à®¤à¯à®¤à¯ˆ உரà¯à®µà®¾à®•à¯à®•à®µà¯à®®à¯',
+ 'inputbox-ns-main' => 'à®®à¯à®¤à®©à¯à®®à¯ˆ',
+);
+
+/** Telugu (తెలà±à°—à±)
+ * @author Chaduvari
+ * @author Kiranmayee
+ * @author Veeven
+ */
+$messages['te'] = array(
+ 'inputbox-desc' => 'à°®à±à°‚దే నిరà±à°µà°šà°¿à°‚చబడిన HTML ఫారమà±à°²à°¨à± చేరà±à°šà°¨à°¿à°µà±à°µà±',
+ 'inputbox-error-no-type' => 'ఠరకమైన ఇనà±&zwnj;à°ªà±à°Ÿà± పెటà±à°Ÿà±†à°¨à°¿ తయారà±à°šà±‡à°¯à°¾à°²à±‹ మీరౠచెపà±à°ªà°²à±‡à°¦à±.',
+ 'inputbox-error-bad-type' => 'à°ªà±à°°à°µà±‡à°¶à°¿à°•à°®à± పెటà±à°Ÿà±† యొకà±à°• బాపతౠ"$1"నౠగà±à°°à±à°¤à°¿à°‚చలేదౠ.
+దయచేసి "create", "comment", "search", "search2" లేదా "fulltext" లనౠపేరà±à°•à±Šà°¨à°‚à°¡à°¿.',
+ 'tryexact' => 'à°–à°šà±à°šà°¿à°¤à°®à±ˆà°¨ పోలిక కొరకౠపà±à°°à°¯à°¤à±à°¨à°¿à°‚à°šà±',
+ 'searchfulltext' => 'పూరà±à°¤à°¿ పాఠà±à°¯à°‚లో వెతà±à°•à±',
+ 'createarticle' => 'à°µà±à°¯à°¾à°¸à°¾à°¨à±à°¨à°¿ సృషà±à°Ÿà°¿à°‚à°šà±',
+ 'inputbox-ns-main' => 'à°ªà±à°°à°§à°¾à°¨',
+);
+
+/** Tajik (Cyrillic script) (тоҷикӣ)
+ * @author Ibrahim
+ */
+$messages['tg-cyrl'] = array(
+ 'inputbox-desc' => 'Иҷозаи иÑтифода аз формҳои HTML аз пеш таърифшударо медиҳад',
+ 'inputbox-error-no-type' => 'Ðавъи ҷаъбаи вурудии Ñҷодшавандаро Ð¼ÑƒÑˆÐ°Ñ…Ñ…Ð°Ñ Ð½Ð°ÐºÐ°Ñ€Ð´Ð°ÐµÐ´.',
+ 'inputbox-error-bad-type' => 'Ðавъи ҷаъбаи вурудии "$1" ношинохта аÑÑ‚. Лутфан Ñк аз маворидро аз инҳо "create", "comment", "search" Ñ‘ "search2" Ð¼ÑƒÑˆÐ°Ñ…Ñ…Ð°Ñ ÐºÑƒÐ½ÐµÐ´.', # Fuzzy
+ 'tryexact' => 'Мутобиқати аниқро биÑанҷед',
+ 'searchfulltext' => 'ҶуÑтуҷӯи матни пурра',
+ 'createarticle' => 'Эҷоди мақола',
+);
+
+/** Tajik (Latin script) (tojikī)
+ * @author Liangent
+ */
+$messages['tg-latn'] = array(
+ 'inputbox-desc' => "Içozai istifoda az formhoi HTML az peş ta'rifşudaro medihad",
+ 'inputbox-error-no-type' => "Nav'i ça'bai vurudiji eçodşavandaro muşaxxas nakardaed.",
+ 'tryexact' => 'Mutobiqati aniqro bisançed',
+ 'searchfulltext' => 'Çustuçūi matni purra',
+ 'createarticle' => 'Eçodi maqola',
+);
+
+/** Thai (ไทย)
+ */
+$messages['th'] = array(
+ 'tryexact' => 'ค้นหาตรงทุà¸à¸•à¸±à¸§à¸­à¸±à¸à¸©à¸£',
+ 'searchfulltext' => 'ค้นหาข้อมูล',
+ 'createarticle' => 'สร้างเนื้อหา',
+);
+
+/** Turkmen (Türkmençe)
+ * @author Hanberke
+ */
+$messages['tk'] = array(
+ 'inputbox-desc' => 'Deslapky kesgitlenen HTML formlarynyň goşulmagyna rugsat berýär',
+ 'inputbox-error-no-type' => 'Dörediljek giriş gutusynyň tipini görkezmediňiz.',
+ 'inputbox-error-bad-type' => 'Giriş gutusynyň tipi "$1" ykrar edilmedi.
+"create", "comment", "search", "search2" ýa-da "fulltext" diýip görkeziň.',
+ 'tryexact' => 'Takyk gabat gelýänini syna',
+ 'searchfulltext' => 'Tutuş teksti gözle',
+ 'createarticle' => 'Sahypa döret',
+);
+
+/** Tagalog (Tagalog)
+ * @author AnakngAraw
+ */
+$messages['tl'] = array(
+ 'inputbox-desc' => 'Pahintulutan ang pagsasama ng mga pormularyong HTML na may paunang kahulugan',
+ 'inputbox-error-no-type' => 'Hindi mo tinukoy ang uri ng pasukang kahong lilikhain.',
+ 'inputbox-error-bad-type' => 'Hindi nakikilala ang uri ng pasukang kahong "$1".
+Pakitukoy ang "create", "comment", "search", "search2" o "fulltext".',
+ 'tryexact' => 'Subukin ang hustung-hustong katugmaan',
+ 'searchfulltext' => 'Maghanap sa buong teksto',
+ 'createarticle' => 'Likhain ang pahina',
+ 'inputbox-ns-main' => 'Pangunahin',
+);
+
+/** Tswana (Setswana)
+ */
+$messages['tn'] = array(
+ 'createarticle' => 'Kwala mokwalo', # Fuzzy
+);
+
+/** Tongan (lea faka-Tonga)
+ */
+$messages['to'] = array(
+ 'createarticle' => 'Fakatupu ʻa e kupu', # Fuzzy
+);
+
+/** Turkish (Türkçe)
+ * @author Emperyan
+ * @author Erkan Yilmaz
+ * @author Joseph
+ * @author Srhat
+ */
+$messages['tr'] = array(
+ 'inputbox-desc' => 'Öntanımlı HTML formlarının dahil edilmesine olanak verir',
+ 'inputbox-error-no-type' => 'OluÅŸturulacak girdi kutusunun tipini belirtmediniz.',
+ 'inputbox-error-bad-type' => 'Girdi kutusu tipi "$1" tanınmadı.
+Lütfen "create", "comment", "search", "search2" ya da "fulltext" olarak belirtin.',
+ 'tryexact' => 'Tam eÅŸleÅŸme dene',
+ 'searchfulltext' => 'Tüm metni ara',
+ 'createarticle' => 'Sayfayı oluştur',
+ 'inputbox-ns-main' => 'Ana',
+);
+
+/** Tsonga (Xitsonga)
+ * @author Thuvack
+ */
+$messages['ts'] = array(
+ 'createarticle' => 'Tumbuluxa tluka',
+);
+
+/** Tuvinian (тыва дыл)
+ * @author Sborsody
+ */
+$messages['tyv'] = array(
+ 'createarticle' => 'Ðрынны чаÑары',
+ 'inputbox-ns-main' => 'Кол',
+);
+
+/** Central Atlas Tamazight (ⵜⴰⵎⴰⵣⵉⵖⵜ)
+ * @author Tifinaghes
+ */
+$messages['tzm'] = array(
+ 'createarticle' => 'ⴰⵔⴰ ⵜⴰⵙâµâ´°',
+);
+
+/** Uyghur (Arabic script) (ئۇيغۇرچە)
+ * @author Sahran
+ */
+$messages['ug-arab'] = array(
+ 'createarticle' => 'بەت قۇر',
+ 'inputbox-ns-main' => 'ئاساسىي تىزىملىك',
+);
+
+/** Ukrainian (українÑька)
+ * @author AS
+ * @author Ahonc
+ * @author Dim Grits
+ */
+$messages['uk'] = array(
+ 'inputbox-desc' => 'ДозволÑÑ” включати заздалегідь визначені HTML-форми',
+ 'inputbox-error-no-type' => 'Ви не зазначили тип Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ñƒ, Ñке ÑтворюєтьÑÑ.',
+ 'inputbox-error-bad-type' => 'Ðевідомий тип Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ñƒ «$1».
+Будь лаÑка, зазначте один з допуÑтимих типів: «create», «comment», «search», «search2» або «fulltext».',
+ 'tryexact' => 'Строгий пошук',
+ 'searchfulltext' => 'ПовнотекÑтовий пошук',
+ 'createarticle' => 'Створити Ñтаттю',
+ 'inputbox-ns-main' => 'Головна',
+);
+
+/** Urdu (اردو)
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['ur'] = array(
+ 'searchfulltext' => 'تلاش ÙÚ©Ù„ متن',
+ 'createarticle' => 'نیا مضمون',
+ 'inputbox-ns-main' => 'مین',
+);
+
+/** Uzbek (oʻzbekcha)
+ */
+$messages['uz'] = array(
+ 'createarticle' => 'Maqola kiritish',
+);
+
+/** vèneto (vèneto)
+ * @author Candalua
+ * @author GatoSelvadego
+ */
+$messages['vec'] = array(
+ 'inputbox-desc' => "Consente l'inserimento de moduli HTML predefinìi",
+ 'inputbox-error-no-type' => 'No te ghè specificà el tipo de inputbox da crear.',
+ 'inputbox-error-bad-type' => '"$1" no\'l xe mìa un tipo de inputbox riconossiùo.
+Siegli el tipo tra "create", "comment", "search", "search2" o "fulltext".',
+ 'tryexact' => 'Çerca corispondenza precisa',
+ 'searchfulltext' => 'Çerca nel testo',
+ 'createarticle' => 'Crea pagina',
+ 'inputbox-ns-main' => 'Prinsipałe',
+);
+
+/** Veps (vepsän kel’)
+ * @author Игорь БродÑкий
+ */
+$messages['vep'] = array(
+ 'tryexact' => "Lat'kat tehta tarkoiged ecind",
+ 'searchfulltext' => 'Ectä täudes tekstas',
+ 'createarticle' => "Säta lehtpol'",
+ 'inputbox-ns-main' => 'Pänimiavaruz',
+);
+
+/** Vietnamese (Tiếng Việt)
+ * @author Minh Nguyen
+ */
+$messages['vi'] = array(
+ 'inputbox-desc' => 'Thêm những biểu mẫu HTML đơn giản',
+ 'inputbox-error-no-type' => 'Bạn chưa định rõ loại biểu mẫu để tạo ra.',
+ 'inputbox-error-bad-type' => 'Loại biểu mẫu “$1†không hợp lệ. Xin hãy chá»n “createâ€, “commentâ€, “searchâ€, “search2â€, hay “fulltextâ€.',
+ 'tryexact' => 'Thử tìm đoạn văn khớp chính xác với từ khóa',
+ 'searchfulltext' => 'Tìm toàn văn',
+ 'createarticle' => 'Tạo trang',
+ 'inputbox-ns-main' => 'Chính',
+);
+
+/** Volapük (Volapük)
+ * @author Malafaya
+ * @author Smeira
+ */
+$messages['vo'] = array(
+ 'inputbox-desc' => 'Dälön keninükami fomas-HTLM büo pemiedetölas',
+ 'searchfulltext' => 'Sukön zi da vödem lölik',
+ 'createarticle' => 'Jafön padi',
+);
+
+/** Võro (Võro)
+ * @author Võrok
+ */
+$messages['vro'] = array(
+ 'inputbox-desc' => 'Lupa pruukiq ette ärqmäärätüid HTML-vormõ.',
+ 'inputbox-error-no-type' => 'Sa olõ-õi määränüq sisseandmisvälä tüüpi.',
+ 'inputbox-error-bad-type' => 'Sisseandmisvälä tüüp â€$1†ei kõlbaq.
+Tüüp piät olõma create, comment, search, search2 vai fulltext.',
+ 'tryexact' => 'Täpsä otsminõ',
+ 'searchfulltext' => 'Otsiq terveq tekst',
+ 'createarticle' => 'Luuq leht',
+);
+
+/** Walloon (walon)
+ */
+$messages['wa'] = array(
+ 'createarticle' => 'Ahiver årtike',
+);
+
+/** Wolof (Wolof)
+ * @author Ibou
+ */
+$messages['wo'] = array(
+ 'inputbox-error-no-type' => 'Leeraloo ban xeetu boyotu duggit nga bëgga sos.',
+ 'inputbox-error-bad-type' => '↓"$1" du xeetu boyotu duggiit bees xam. Tànnal benn ci yii "create", "comment", "seach" walla "search2"',
+ 'tryexact' => 'Seet wi mu yamal',
+ 'searchfulltext' => 'Ceet ci mbind mi',
+ 'createarticle' => 'Sos jukki bi',
+);
+
+/** Wu (å´è¯­)
+ */
+$messages['wuu'] = array(
+ 'searchfulltext' => '全文æœå¯»',
+ 'createarticle' => '建立新文章',
+);
+
+/** Kalmyk (хальмг)
+ * @author Huuchin
+ */
+$messages['xal'] = array(
+ 'inputbox-error-no-type' => 'Та бүтәлдг оруллһна теегин Ñнз заав уга.',
+ 'inputbox-error-bad-type' => '«$1» буру оруллһна теегин Ñнз болҗана.
+Буйн болтха, нег йоÑта Ñнз автн: «create», «comment», «search», «search2» аль «fulltext».',
+ 'tryexact' => 'Дарата хәәлһн',
+ 'searchfulltext' => 'Күцц бичг хәәлһн',
+ 'createarticle' => 'Халхиг бүтәх',
+);
+
+/** Xhosa (isiXhosa)
+ */
+$messages['xh'] = array(
+ 'createarticle' => 'Bhala Ibali',
+);
+
+/** Yiddish (ייִדיש)
+ * @author Yidel
+ * @author פוילישער
+ */
+$messages['yi'] = array(
+ 'searchfulltext' => 'זוך ×ין ×לע בלעטער',
+ 'createarticle' => 'ב×ש×פט ×רטיקל',
+ 'inputbox-ns-main' => 'הויפט',
+);
+
+/** Yoruba (Yorùbá)
+ * @author Demmy
+ */
+$messages['yo'] = array(
+ 'createarticle' => 'Dá ojúewé',
+);
+
+/** Cantonese (粵語)
+ */
+$messages['yue'] = array(
+ 'inputbox-desc' => '容許包å«é å…ˆè¨­å®šå˜…HTML表格',
+ 'inputbox-error-no-type' => 'ä½ é‡æœªæŒ‡å®šé–‹è¼¸å…¥ç›’嘅指定類型。',
+ 'inputbox-error-bad-type' => '輸入盒類型"$1"èªå””到。請指定"create"ã€"comment"ã€"search"或"search2"。', # Fuzzy
+ 'tryexact' => '試å“精確嘅比較',
+ 'searchfulltext' => 'æµå…¨æ–‡',
+ 'createarticle' => '建立文章',
+);
+
+/** Simplified Chinese (中文(简体)‎)
+ * @author Liangent
+ * @author PhiLiP
+ * @author Wmr89502270
+ * @author Xiaomingyan
+ */
+$messages['zh-hans'] = array(
+ 'inputbox-desc' => 'å…许包å«é¢„先设置的HTML表格',
+ 'inputbox-error-no-type' => '您没有指定所创建输入框的类型。',
+ 'inputbox-error-bad-type' => '输入框类型“$1â€æ— æ³•è¯†åˆ«ã€‚
+请指定“createâ€ã€â€œcommentâ€ã€â€œsearchâ€ã€â€œsearch2â€æˆ–“fulltextâ€ã€‚',
+ 'tryexact' => 'å°è¯•ç²¾ç¡®åŒ¹é…',
+ 'searchfulltext' => 'æœç´¢å…¨æ–‡',
+ 'createarticle' => '创建页é¢',
+ 'inputbox-ns-main' => '主',
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Anakmalaysia
+ * @author Gaoxuewei
+ * @author Liangent
+ * @author Mark85296341
+ */
+$messages['zh-hant'] = array(
+ 'inputbox-desc' => '容許包å«é å…ˆè¨­å®šçš„ HTML 表格',
+ 'inputbox-error-no-type' => '您尚未指定建立輸入框的指定類型。',
+ 'inputbox-error-bad-type' => '輸入框類型「$1ã€ç„¡æ³•è­˜åˆ¥ã€‚
+請指定「createã€ã€ã€Œcommentã€ã€ã€Œsearchã€ã€ã€Œsearch2ã€æˆ–「fulltextã€ã€‚',
+ 'tryexact' => '嘗試精確匹é…',
+ 'searchfulltext' => '全文檢索',
+ 'createarticle' => '建立文章',
+ 'inputbox-ns-main' => '主',
+);
+
+/** Chinese (Taiwan) (‪中文(å°ç£)‬)
+ * @author Ffaarr
+ */
+$messages['zh-tw'] = array(
+ 'createarticle' => '創建é é¢',
+);
+
+/** Zulu (isiZulu)
+ */
+$messages['zu'] = array(
+ 'searchfulltext' => 'Sesha ukubhala konke',
+);
diff --git a/extensions/InputBox/InputBox.php b/extensions/InputBox/InputBox.php
new file mode 100644
index 00000000..b54baa36
--- /dev/null
+++ b/extensions/InputBox/InputBox.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * InputBox extension
+ *
+ * @file
+ * @ingroup Extensions
+ *
+ * This file contains the main include file for the Inputbox extension of
+ * MediaWiki.
+ *
+ * Usage: Add the following line in LocalSettings.php:
+ * require_once( "$IP/extensions/InputBox/InputBox.php" );
+ *
+ * @author Erik Moeller <moeller@scireview.de>
+ * namespaces search improvements partially by
+ * Leonardo Pimenta <leo.lns@gmail.com>
+ * Cleaned up by Trevor Parscal <tparscal@wikimedia.org>
+ * @copyright Public domain
+ * @license Public domain
+ * @version 0.1.4
+ */
+
+// Check environment
+if ( !defined( 'MEDIAWIKI' ) ) {
+ echo( "This is an extension to the MediaWiki package and cannot be run standalone.\n" );
+ die( -1 );
+}
+
+/* Configuration */
+
+// Credits
+$wgExtensionCredits['parserhook'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'InputBox',
+ 'author' => array( 'Erik Moeller', 'Leonardo Pimenta', 'Rob Church', 'Trevor Parscal', 'DaSch' ),
+ 'version' => '0.1.4',
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:InputBox',
+ 'description' => 'Allow inclusion of predefined HTML forms.',
+ 'descriptionmsg' => 'inputbox-desc',
+);
+
+// Shortcut to this extension directory
+$dir = dirname( __FILE__ ) . '/';
+
+// Internationalization
+$wgExtensionMessagesFiles['InputBox'] = $dir . 'InputBox.i18n.php';
+
+// Register auto load for the special page class
+$wgAutoloadClasses['InputBoxHooks'] = $dir . 'InputBox.hooks.php';
+$wgAutoloadClasses['InputBox'] = $dir . 'InputBox.classes.php';
+
+// Register parser hook
+$wgHooks['ParserFirstCallInit'][] = 'InputBoxHooks::register';
+$wgHooks['MediaWikiPerformAction'][] = 'InputBoxHooks::onMediaWikiPerformAction';
diff --git a/extensions/Interwiki/Interwiki.alias.php b/extensions/Interwiki/Interwiki.alias.php
new file mode 100644
index 00000000..44e5b225
--- /dev/null
+++ b/extensions/Interwiki/Interwiki.alias.php
@@ -0,0 +1,244 @@
+<?php
+/**
+ * Aliases for Special:Interwiki
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$specialPageAliases = array();
+
+/** English (English) */
+$specialPageAliases['en'] = array(
+ 'Interwiki' => array( 'Interwiki' ),
+);
+
+/** Arabic (العربية) */
+$specialPageAliases['ar'] = array(
+ 'Interwiki' => array( 'إنترويكي' ),
+);
+
+/** Egyptian Spoken Arabic (مصرى) */
+$specialPageAliases['arz'] = array(
+ 'Interwiki' => array( 'إنترويكى' ),
+);
+
+/** Assamese (অসমীয়া) */
+$specialPageAliases['as'] = array(
+ 'Interwiki' => array( 'আনà§à¦¤à¦ƒà§±à¦¿à¦•à¦¿' ),
+);
+
+/** Bulgarian (българÑки) */
+$specialPageAliases['bg'] = array(
+ 'Interwiki' => array( 'Междууикита' ),
+);
+
+/** Breton (brezhoneg) */
+$specialPageAliases['br'] = array(
+ 'Interwiki' => array( 'Etrewiki' ),
+);
+
+/** Bosnian (bosanski) */
+$specialPageAliases['bs'] = array(
+ 'Interwiki' => array( 'Medjuwiki' ),
+);
+
+/** German (Deutsch) */
+$specialPageAliases['de'] = array(
+ 'Interwiki' => array( 'Interwikitabelle', 'Interwiki-Tabelle' ),
+);
+
+/** Zazaki (Zazaki) */
+$specialPageAliases['diq'] = array(
+ 'Interwiki' => array( 'Ä°nterwiki' ),
+);
+
+/** Esperanto (Esperanto) */
+$specialPageAliases['eo'] = array(
+ 'Interwiki' => array( 'Intervikia_ligilo' ),
+);
+
+/** Spanish (español) */
+$specialPageAliases['es'] = array(
+ 'Interwiki' => array( 'Enlaces_interligüísticos' ),
+);
+
+/** Estonian (eesti) */
+$specialPageAliases['et'] = array(
+ 'Interwiki' => array( 'Interviki' ),
+);
+
+/** Persian (Ùارسی) */
+$specialPageAliases['fa'] = array(
+ 'Interwiki' => array( 'میان‌ویکی' ),
+);
+
+/** Franco-Provençal (arpetan) */
+$specialPageAliases['frp'] = array(
+ 'Interwiki' => array( 'Entèrvouiqui' ),
+);
+
+/** Gagauz (Gagauz) */
+$specialPageAliases['gag'] = array(
+ 'Interwiki' => array( 'Ä°nterviki' ),
+);
+
+/** Galician (galego) */
+$specialPageAliases['gl'] = array(
+ 'Interwiki' => array( 'Interwikis' ),
+);
+
+/** Hebrew (עברית) */
+$specialPageAliases['he'] = array(
+ 'Interwiki' => array( 'בינוויקי' ),
+);
+
+/** Haitian (Kreyòl ayisyen) */
+$specialPageAliases['ht'] = array(
+ 'Interwiki' => array( 'Entèwiki' ),
+);
+
+/** Hungarian (magyar) */
+$specialPageAliases['hu'] = array(
+ 'Interwiki' => array( 'Wikiközi_hivatkozások' ),
+);
+
+/** Indonesian (Bahasa Indonesia) */
+$specialPageAliases['id'] = array(
+ 'Interwiki' => array( 'Interwiki' ),
+);
+
+/** Japanese (日本語) */
+$specialPageAliases['ja'] = array(
+ 'Interwiki' => array( 'インターウィキ' ),
+);
+
+/** Georgian (ქáƒáƒ áƒ—ული) */
+$specialPageAliases['ka'] = array(
+ 'Interwiki' => array( 'ინტერვიკი' ),
+);
+
+/** Khmer (ភាសាážáŸ’មែរ) */
+$specialPageAliases['km'] = array(
+ 'Interwiki' => array( 'អន្ážážšážœáž·áž‚ី' ),
+);
+
+/** Korean (한국어) */
+$specialPageAliases['ko'] = array(
+ 'Interwiki' => array( 'ì¸í„°ìœ„키' ),
+);
+
+/** Colognian (Ripoarisch) */
+$specialPageAliases['ksh'] = array(
+ 'Interwiki' => array( 'EngerWiki', 'Engerwiki' ),
+);
+
+/** Cornish (kernowek) */
+$specialPageAliases['kw'] = array(
+ 'Interwiki' => array( 'Yntrawiki' ),
+);
+
+/** Latin (Latina) */
+$specialPageAliases['la'] = array(
+ 'Interwiki' => array( 'Intervici' ),
+);
+
+/** Ladino (Ladino) */
+$specialPageAliases['lad'] = array(
+ 'Interwiki' => array( 'Interviki' ),
+);
+
+/** Macedonian (македонÑки) */
+$specialPageAliases['mk'] = array(
+ 'Interwiki' => array( 'Меѓувики' ),
+);
+
+/** Malayalam (മലയാളം) */
+$specialPageAliases['ml'] = array(
+ 'Interwiki' => array( 'à´…à´¨àµà´¤àµ¼â€Œà´µà´¿à´•àµà´•à´¿' ),
+);
+
+/** Marathi (मराठी) */
+$specialPageAliases['mr'] = array(
+ 'Interwiki' => array( 'आंतरविकि' ),
+);
+
+/** Punjabi (ਪੰਜਾਬੀ) */
+$specialPageAliases['pa'] = array(
+ 'Interwiki' => array( 'ਇੰਟਰਵਿਕੀ' ),
+);
+
+/** Portuguese (português) */
+$specialPageAliases['pt'] = array(
+ 'Interwiki' => array( 'Interwikis' ),
+);
+
+/** Russian (руÑÑкий) */
+$specialPageAliases['ru'] = array(
+ 'Interwiki' => array( 'Интервики' ),
+);
+
+/** Sanskrit (संसà¥à¤•à¥ƒà¤¤à¤®à¥) */
+$specialPageAliases['sa'] = array(
+ 'Interwiki' => array( 'आंनà¥à¤¤à¤°à¤µà¤¿à¤•à¤¿' ),
+);
+
+/** Swahili (Kiswahili) */
+$specialPageAliases['sw'] = array(
+ 'Interwiki' => array( 'Viungovyawiki' ),
+);
+
+/** Telugu (తెలà±à°—à±) */
+$specialPageAliases['te'] = array(
+ 'Interwiki' => array( 'అంతరà±à°µà°¿à°•à±€' ),
+);
+
+/** Tagalog (Tagalog) */
+$specialPageAliases['tl'] = array(
+ 'Interwiki' => array( 'Kawing-wiki' ),
+);
+
+/** Turkish (Türkçe) */
+$specialPageAliases['tr'] = array(
+ 'Interwiki' => array( 'Ä°nterviki' ),
+);
+
+/** Tatar (Cyrillic script) (татарча) */
+$specialPageAliases['tt-cyrl'] = array(
+ 'Interwiki' => array( 'Интервики' ),
+);
+
+/** Ukrainian (українÑька) */
+$specialPageAliases['uk'] = array(
+ 'Interwiki' => array( 'Інтервікі' ),
+);
+
+/** Urdu (اردو) */
+$specialPageAliases['ur'] = array(
+ 'Interwiki' => array( 'بین_الویکی' ),
+);
+
+/** Vietnamese (Tiếng Việt) */
+$specialPageAliases['vi'] = array(
+ 'Interwiki' => array( 'Liên_wiki' ),
+);
+
+/** Yiddish (ייִדיש) */
+$specialPageAliases['yi'] = array(
+ 'Interwiki' => array( '×ינטערוויקי' ),
+);
+
+/** Cantonese (粵語) */
+$specialPageAliases['yue'] = array(
+ 'Interwiki' => array( '其他維基連接' ),
+);
+
+/** Simplified Chinese (中文(简体)‎) */
+$specialPageAliases['zh-hans'] = array(
+ 'Interwiki' => array( '跨wiki', '跨维基' ),
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎) */
+$specialPageAliases['zh-hant'] = array(
+ 'Interwiki' => array( '跨維基連çµ' ),
+); \ No newline at end of file
diff --git a/extensions/Interwiki/Interwiki.css b/extensions/Interwiki/Interwiki.css
new file mode 100644
index 00000000..428b1cc7
--- /dev/null
+++ b/extensions/Interwiki/Interwiki.css
@@ -0,0 +1,45 @@
+/**
+ * CSS for Special:Interwiki
+ */
+table.mw-interwikitable {
+ width: 100%;
+}
+
+table.mw-interwikitable.intro th {
+ padding-right: 1.4ex;
+ vertical-align: top;
+}
+
+table.mw-interwikitable.intro th.mw-align-start {
+ text-align: left;
+}
+
+table.mw-interwikitable.intro th.mw-align-end {
+ text-align: right;
+}
+
+table.mw-interwikitable.body td.mw-interwikitable-local,
+table.mw-interwikitable.body td.mw-interwikitable-trans,
+table.mw-interwikitable.body td.mw-interwikitable-modify {
+ text-align: center;
+}
+
+/* It's safe enough to assume that URLs are usually LTR. */
+/* @noflip */
+.mw-interwikitable-url,
+input#mw-interwiki-url {
+ text-align: left;
+ direction: ltr;
+}
+
+.mw-interwikitable-modify {
+ white-space: nowrap;
+}
+
+.mw-special-Interwiki .mw-collapsible-toggle {
+ float: left;
+}
+
+.mw-collapsible-content {
+ clear: both;
+}
diff --git a/extensions/Interwiki/Interwiki.i18n.php b/extensions/Interwiki/Interwiki.i18n.php
new file mode 100644
index 00000000..efd2b11d
--- /dev/null
+++ b/extensions/Interwiki/Interwiki.i18n.php
@@ -0,0 +1,5157 @@
+<?php
+/**
+ * Internationalisation file for Interwiki extension.
+ *
+ * @file
+ * @ingroup Extensions
+ *
+ * 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.
+ *
+ * @author Stephanie Amanda Stevens <phroziac@gmail.com>
+ * @author SPQRobin <robin_1273@hotmail.com>
+ * @copyright Copyright (C) 2005-2007 Stephanie Amanda Stevens
+ * @copyright Copyright (C) 2007 SPQRobin
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+
+$messages = array();
+
+/** English (English)
+ * @author Stephanie Amanda Stevens
+ * @author SPQRobin
+ * @author Purodha
+ */
+$messages['en'] = array(
+ # general messages
+ 'interwiki' => 'View and edit interwiki data',
+ 'interwiki-title-norights' => 'View interwiki data',
+ 'interwiki-desc' => 'Adds a [[Special:Interwiki|special page]] to view and edit the interwiki table',
+ 'interwiki_intro' => 'This is an overview of the interwiki table.',
+ 'interwiki-legend-show' => 'Show legend',
+ 'interwiki-legend-hide' => 'Hide legend',
+ 'interwiki_prefix' => 'Prefix',
+ 'interwiki-prefix-label' => 'Prefix:',
+ 'interwiki_prefix_intro' => 'Interwiki prefix to be used in <code>[<nowiki />[prefix:<em>pagename</em>]]</code> wikitext syntax.',
+ 'interwiki_url' => 'URL', # only translate this message if you have to change it
+ 'interwiki-url-label' => 'URL:',
+ 'interwiki_url_intro' => 'Template for URLs. The placeholder $1 will be replaced by the <em>pagename</em> of the wikitext, when the abovementioned wikitext syntax is used.',
+ 'interwiki_local' => 'Forward',
+ 'interwiki-local-label' => 'Forward:',
+ 'interwiki_local_intro' => 'An HTTP request to the local wiki with this interwiki prefix in the URL is:',
+ 'interwiki_local_0_intro' => 'not honored, usually blocked by "page not found".',
+ 'interwiki_local_1_intro' => 'redirected to the target URL given in the interwiki link definitions (i.e. treated like references in local pages).',
+ 'interwiki_trans' => 'Transclude',
+ 'interwiki-trans-label' => 'Transclude:',
+ 'interwiki_trans_intro' => 'If wikitext syntax <code>{<nowiki />{prefix:<em>pagename</em>}}</code> is used, then:',
+ 'interwiki_trans_1_intro' => 'allow transclusion from the foreign wiki, if interwiki transclusions are generally permitted in this wiki.',
+ 'interwiki_trans_0_intro' => 'do not allow it, rather look for a page in the template namespace.',
+ 'interwiki_intro_footer' => 'See [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] for more information about the interwiki table.
+There is a [[Special:Log/interwiki|log of changes]] to the interwiki table.',
+ 'interwiki_1' => 'yes',
+ 'interwiki_0' => 'no',
+ 'interwiki_error' => 'Error: The interwiki table is empty, or something else went wrong.',
+ 'interwiki-cached' => 'The interwiki data is cached. Modifying the cache is not possible.',
+
+ # modifying permitted
+ 'interwiki_edit' => 'Edit',
+ 'interwiki_reasonfield' => 'Reason:',
+
+ # deleting a prefix
+ 'interwiki_delquestion' => 'Deleting "$1"',
+ 'interwiki_deleting' => 'You are deleting prefix "$1".',
+ 'interwiki_deleted' => 'Prefix "$1" was successfully removed from the interwiki table.',
+ 'interwiki_delfailed' => 'Prefix "$1" could not be removed from the interwiki table.',
+
+ # adding a prefix
+ 'interwiki_addtext' => 'Add an interwiki prefix',
+ 'interwiki_addintro' => 'You are adding a new interwiki prefix.
+Remember that it cannot contain spaces ( ), colons (:), ampersands (&), or equal signs (=).',
+ 'interwiki_addbutton' => 'Add',
+ 'interwiki_added' => 'Prefix "$1" was successfully added to the interwiki table.',
+ 'interwiki_addfailed' => 'Prefix "$1" could not be added to the interwiki table.
+Possibly it already exists in the interwiki table.',
+ 'interwiki-defaulturl' => 'http://www.example.com/$1', # do not translate or duplicate this message to other languages
+
+ # editing a prefix
+ 'interwiki_edittext' => 'Editing an interwiki prefix',
+ 'interwiki_editintro' => 'You are editing an interwiki prefix.
+Remember that this can break existing links.',
+ 'interwiki_edited' => 'Prefix "$1" was successfully modified in the interwiki table.',
+ 'interwiki_editerror' => 'Prefix "$1" could not be modified in the interwiki table.
+Possibly it does not exist.',
+ 'interwiki-badprefix' => 'Specified interwiki prefix "$1" contains invalid characters',
+ 'interwiki-submit-empty' => 'The prefix and URL cannot be empty.',
+ 'interwiki-submit-invalidurl' => 'The protocol of the URL is invalid.',
+
+ # interwiki log
+ 'log-name-interwiki' => 'Interwiki table log',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|added}} prefix "$4" ($5) (trans: $6; local: $7) to the interwiki table',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|modified}} prefix "$4" ($5) (trans: $6; local: $7) in the interwiki table',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|removed}} prefix "$4" from the interwiki table',
+ 'log-description-interwiki' => 'This is a log of changes to the [[Special:Interwiki|interwiki table]].',
+ 'logentry-interwiki-interwiki' => '', # do not translate this message
+
+ # rights
+ 'right-interwiki' => 'Edit interwiki data',
+ 'action-interwiki' => 'change this interwiki entry',
+);
+
+/** Message documentation (Message documentation)
+ * @author Amire80
+ * @author Fryed-peach
+ * @author Jon Harald Søby
+ * @author Meno25
+ * @author Mormegil
+ * @author Nemo bis
+ * @author Purodha
+ * @author Raymond
+ * @author SPQRobin
+ * @author Shirayuki
+ * @author Siebrand
+ * @author Umherirrender
+ */
+$messages['qqq'] = array(
+ 'interwiki' => '{{doc-special|Interwiki}}',
+ 'interwiki-title-norights' => '{{doc-special|Interwiki}}
+Used when the user has no right to edit the interwiki data and can only view them.',
+ 'interwiki-desc' => '{{desc|name=Interwiki|url=http://www.mediawiki.org/wiki/Extension:Interwiki}}',
+ 'interwiki_intro' => 'Part of the interwiki extension. Shown as introductory text on [[Special:Interwiki]].',
+ 'interwiki-legend-show' => 'Link text for toggle to display the legend on [[Special:Interwiki]].',
+ 'interwiki-legend-hide' => 'Link text for toggle to hide the legend on [[Special:Interwiki]].',
+ 'interwiki_prefix' => 'Used on [[Special:Interwiki]] as a column header of the table.',
+ 'interwiki-prefix-label' => 'Used on [[Special:Interwiki]] as a field label in a form.',
+ 'interwiki_prefix_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|interwiki_prefix}} column of the table.
+Do translate both words inside the square brackets as placeholders, where "prefix" should be identical to, or clearly linked to, the column header.',
+ 'interwiki_url' => '{{optional}}
+Used on [[Special:Interwiki]] as a column header of the table.
+
+See also: {{msg-mw|Interwiki-url-label}}',
+ 'interwiki-url-label' => '{{optional}}
+Used on [[Special:Interwiki]] as a field label in a form.
+
+See also: {{msg-mw|interwiki url}}',
+ 'interwiki_url_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|interwiki_url}} column of the table.
+
+$1 is being rendered verbatim. It refers to the syntax of the values listed in the "prefix" column, and does not mark a substitutable variable of this message.',
+ 'interwiki_local' => 'Used on [[Special:Interwiki]] as a column header.
+
+{{Identical|Forward}}',
+ 'interwiki-local-label' => 'Field label for the interwiki property "local", to set if an HTTP request to the local wiki with this interwiki prefix in the URL is redirected to the target URL given in the interwiki link definitions.',
+ 'interwiki_local_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|interwiki_local}} column of the table.',
+ 'interwiki_local_0_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 0 in the {{msg-mw|interwiki_local}} column of the table.',
+ 'interwiki_local_1_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 1 in the {{msg-mw|interwiki_local}} column of the table.',
+ 'interwiki_trans' => 'Used on [[Special:Interwiki]] as table column header.',
+ 'interwiki-trans-label' => 'Used on [[Special:Interwiki]] as a field label in a form.',
+ 'interwiki_trans_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|interwiki_trans}} column of the table.',
+ 'interwiki_trans_1_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 1 in the {{msg-mw|interwiki_trans}} column of the table.',
+ 'interwiki_trans_0_intro' => 'Used on [[Special:Interwiki]] so as to describe the meaning of the value 0 in the {{msg-mw|interwiki_trans}} column of the table.',
+ 'interwiki_intro_footer' => 'Part of the interwiki extension.
+Shown as last pice of the introductory text on [[Special:Interwiki]].
+Parameter $1 contains the following (a link): [[mw:Manual:Interwiki_table|MediaWiki.org]]',
+ 'interwiki_1' => "'''Yes'''-value to be inserted into the columns headed by {{msg-mw|interwiki_local}} and {{msg-mw|interwiki_trans}}.
+
+{{Identical|Yes}}",
+ 'interwiki_0' => "'''No'''-value to be inserted into the columns headed by {{msg-mw|interwiki_local}} and {{msg-mw|interwiki_trans}}.
+
+{{Identical|No}}",
+ 'interwiki_error' => 'This error message is shown when the [[Special:Interwiki]] page is empty.',
+ 'interwiki-cached' => 'Informational message on why interwiki data cannot be manipulated.',
+ 'interwiki_edit' => 'For users allowed to edit the interwiki table via [[Special:Interwiki]], this text is shown as the column header above the edit buttons.
+
+{{Identical|Edit}}',
+ 'interwiki_reasonfield' => '{{Identical|Reason}}',
+ 'interwiki_delquestion' => 'Parameter $1 is the interwiki prefix you are deleting.',
+ 'interwiki_deleting' => '-',
+ 'interwiki_deleted' => '',
+ 'interwiki_delfailed' => 'Error message when removing an interwiki table entry fails. Parameters:
+* $1 is an interwiki prefix.',
+ 'interwiki_addtext' => 'Link description to open form to add an interwiki prefix.',
+ 'interwiki_addintro' => 'Form information when adding an interwiki prefix.',
+ 'interwiki_addbutton' => 'This message is the text of the button to submit the interwiki prefix you are adding.
+
+{{Identical|Add}}',
+ 'interwiki_added' => 'Success message after adding an interwiki prefix. Parameters:
+* $1 is the added interwiki prefix.',
+ 'interwiki_addfailed' => 'Error message displayed when adding an interwiki prefix fails. Parameters:
+* $1 is the interwiki prefix that could not be added.',
+ 'interwiki-defaulturl' => '{{notranslate}}',
+ 'interwiki_edittext' => 'Fieldset legend for interwiki prefix edit form.',
+ 'interwiki_editintro' => 'Form information when editing an interwiki prefix.',
+ 'interwiki_edited' => 'Success message after editing an interwiki prefix. Parameters:
+* $1 is the added interwiki prefix.',
+ 'interwiki_editerror' => 'Error message when modifying a prefix has failed.',
+ 'interwiki-badprefix' => 'Error message displayed when trying to save an interwiki prefix that contains invalid characters. Parameters:
+* $1 is the interwiki prefix containing invalid characters.',
+ 'interwiki-submit-empty' => 'Error message displayed when trying to save an interwiki prefix with an empty prefix or an empty URL.',
+ 'interwiki-submit-invalidurl' => 'Error message displayed when trying to save an interwiki prefix with an invalid URL.',
+ 'log-name-interwiki' => '{{doc-logpage}}
+
+Part of the interwiki extension. This message is shown as page title on [[Special:Log/interwiki]].',
+ 'logentry-interwiki-iw_add' => '{{Logentry|[[Special:Log/interwiki]]}}
+Shows up in "[[Special:Log/interwiki]]" when someone has added a prefix. Leave parameters and text between brackets exactly as it is.
+* $1 - the username of the user who added it
+* $2 - the username usable for GENDER
+* $4 - the prefix
+* $5 - the URL
+* $6 and $7 is 0 or 1
+See also the legend on [[Special:Interwiki]].',
+ 'logentry-interwiki-iw_edit' => '{{Logentry|[[Special:Log/interwiki]]}}
+Shows up in "[[Special:Log/interwiki]]" when someone has modified a prefix. Leave parameters and text between brackets exactly as it is.
+* $1 - the username of the user who added it
+* $2 - the username usable for GENDER
+* $4 - the prefix
+* $5 - the URL
+* $6 and $7 is 0 or 1',
+ 'logentry-interwiki-iw_delete' => '{{Logentry|[[Special:Log/interwiki]]}}
+Shows up in "[[Special:Log/interwiki]]" when someone removed a prefix.
+* $1 - the username of the user who deleted it.
+* $2 - the username usable for GENDER
+* $4 - the prefix',
+ 'log-description-interwiki' => 'Part of the interwiki extension. Summary shown on [[Special:Log/interwiki]].',
+ 'logentry-interwiki-interwiki' => '{{notranslate}}',
+ 'right-interwiki' => '{{doc-right|interwiki}}',
+ 'action-interwiki' => '{{doc-action|interwiki}}',
+);
+
+/** Afrikaans (Afrikaans)
+ * @author Arnobarnard
+ * @author Naudefj
+ */
+$messages['af'] = array(
+ 'interwiki' => 'Wys en wysig interwikidata',
+ 'interwiki-title-norights' => 'Wys interwikidata',
+ 'interwiki-desc' => "Voeg 'n [[Special:Interwiki|spesiale bladsy]] by om die interwiki tabel te bekyk en wysig",
+ 'interwiki_intro' => "Hier volg 'n oorsig van die interwikitabel.",
+ 'interwiki-legend-show' => 'Wys sleutel',
+ 'interwiki-legend-hide' => 'Versteek sleutel',
+ 'interwiki_prefix' => 'Voorvoegsel',
+ 'interwiki-prefix-label' => 'Voorvoegsel:',
+ 'interwiki_prefix_intro' => 'Interwiki-voorvoegsel wat gebruik moet word in die wikiteks-sintaks <code>[<nowiki />[voorvoegsel:<em>bladsynaam</em>]]</code>.',
+ 'interwiki_url_intro' => "'n Sjabloon vir URL's. Die plekhouer $1 word met die <em>bladsynaam</em> van die wikiteks vervang as die bovermelde wikiteks-sintaks gebruik word.",
+ 'interwiki_local' => 'Aanstuur',
+ 'interwiki-local-label' => 'Aanstuur:',
+ 'interwiki_local_intro' => "'n HTTP-aanvraag na die lokale wiki met hierdie interwiki-voorvoegsel in die URL is:",
+ 'interwiki_local_0_intro' => 'word nie verwerk nie. Meestal geblokkeer deur \'n "bladsy nie gevind"-fout.',
+ 'interwiki_local_1_intro' => 'aanstuur na die doel-URL verskaf in die definisies van die interwiki-skakels (hierdie word hanteer as verwysings in lokale bladsye)',
+ 'interwiki_trans' => 'Transkludeer',
+ 'interwiki-trans-label' => 'Transkludeer:',
+ 'interwiki_trans_intro' => 'Indien die wikiteks-sintaks <code>{<nowiki />{voorvoegsel:<em>bladsynaam</em>}}</code> gebruik word, dan:',
+ 'interwiki_trans_1_intro' => "laat transklusie van ander wiki's toe as interwiki-transklusies wel in hierdie wiki toegelaat word.",
+ 'interwiki_trans_0_intro' => "nie toegelaat nie, soek eerder na 'n bladsy in die sjabloonnaamruimte.",
+ 'interwiki_intro_footer' => "Sien [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] vir meer inligting oor die interwikitabel.
+Daar is 'n [[Special:Log/interwiki|veranderingslogboek]] vir die interwikitabel.",
+ 'interwiki_1' => 'ja',
+ 'interwiki_0' => 'nee',
+ 'interwiki_error' => 'Fout: Die interwikitabel is leeg, of iets anders is verkeerd.',
+ 'interwiki-cached' => 'Die interwikidata is gekas. Dit is nie moontlik om data in die kas te wysig nie.',
+ 'interwiki_edit' => 'Wysig',
+ 'interwiki_reasonfield' => 'Rede:',
+ 'interwiki_delquestion' => 'Besig om "$1" te verwyder',
+ 'interwiki_deleting' => 'U is besig om voorvoegsel "$1" te verwyder.',
+ 'interwiki_deleted' => 'Voorvoegsel "$1" is suksesvol uit die interwikitabel verwyder.',
+ 'interwiki_delfailed' => 'Voorvoegsel "$1" kon nie van die interwikitabel verwyder word nie.',
+ 'interwiki_addtext' => "Voeg 'n interwiki-voorvoegsel by",
+ 'interwiki_addintro' => "U is besig om 'n nuwe interwiki-voorvoegsel by te voeg. Let op dat dit geen spasies ( ), dubbelpunte (:), ampersands (&), of gelykheidstekens (=) mag bevat nie.",
+ 'interwiki_addbutton' => 'Voeg by',
+ 'interwiki_added' => 'Voorvoegsel "$1" is suksesvol by die interwikitabel bygevoeg.',
+ 'interwiki_addfailed' => 'Voorvoegsel "$1" kon nie by die interwikitabel gevoeg word nie. Miskien bestaan dit al reeds in die interwikitabel.',
+ 'interwiki_edittext' => "Wysig 'n interwiki-voorvoegsel",
+ 'interwiki_editintro' => "U is besig om 'n interwiki-voorvoegsel te wysig.
+Let op dat dit moontlik bestaande skakels kan breek.",
+ 'interwiki_edited' => 'Voorvoegsel "$1" is suksesvol in die interwikitabel gewysig.',
+ 'interwiki_editerror' => 'Voorvoegsel "$1" kon nie in die interwikitabel opgedateer word nie.
+Moontlik bestaan dit nie.',
+ 'interwiki-badprefix' => 'Die interwiki-voorvoegsel "$1" bevat ongeldige karakters',
+ 'interwiki-submit-empty' => 'Die voorvoegsel en die URL mag nie leeg wees nie.',
+ 'interwiki-submit-invalidurl' => 'Die protokol van die URL is ongeldig.',
+ 'log-name-interwiki' => 'Interwiki tabel staaf',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|het}} die voorvoegsel "$4" ($5) by die interwikitabel gevoeg (trans: $6; local: $7)',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|het}} die voorvoegsel "$4" ($5) in die interwikitabel gewysig (trans: $6; local: $7)',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|het}} die voorvoegsel "$4" uit die interwikitabel verwyder',
+ 'log-description-interwiki' => "Die is 'n logboek van veranderinge aan die [[Special:Interwiki|interwikitabel]].",
+ 'right-interwiki' => 'Wysig interwikidata',
+ 'action-interwiki' => 'verander hierdie interwiki-item',
+);
+
+/** Amharic (አማርኛ)
+ * @author Codex Sinaiticus
+ */
+$messages['am'] = array(
+ 'interwiki_reasonfield' => 'áˆáŠ­áŠ•á‹«á‰µ:',
+);
+
+/** Aragonese (aragonés)
+ * @author Juanpabl
+ */
+$messages['an'] = array(
+ 'interwiki_1' => 'Sí',
+ 'interwiki_reasonfield' => 'Razón:',
+);
+
+/** Arabic (العربية)
+ * @author Meno25
+ * @author OsamaK
+ */
+$messages['ar'] = array(
+ 'interwiki' => 'عرض وتعديل بيانات الإنترويكي',
+ 'interwiki-title-norights' => 'عرض بيانات الإنترويكي',
+ 'interwiki-desc' => 'يضي٠[[Special:Interwiki|صÙحة خاصة]] لرؤية وتعديل جدول الإنترويكي',
+ 'interwiki_intro' => 'هذا عرض عام لجدول الإنترويكي. معاني البيانات ÙÙŠ العواميد:', # Fuzzy
+ 'interwiki_prefix' => 'بادئة',
+ 'interwiki-prefix-label' => 'البادئة:',
+ 'interwiki_prefix_intro' => 'بادئة الإنترويكي ليتم استخدامها ÙÙŠ صياغة نص الويكي <code>[<nowiki />[prefix:<em>pagename</em>]]</code>.',
+ 'interwiki_url' => 'مسار',
+ 'interwiki-url-label' => 'مسار:',
+ 'interwiki_url_intro' => 'قالب للمسارات. حامل المكان $1 سيتم استبداله بواسطة <em>pagename</em> لنص الويكي، عندما يتم استخدام صياغة نص الويكي المذكورة بالأعلى.',
+ 'interwiki_local' => 'إرسال',
+ 'interwiki-local-label' => 'إرسال:',
+ 'interwiki_local_intro' => 'طلب http للويكي المحلي ببادئة الإنترويكي هذه ÙÙŠ URl هو:',
+ 'interwiki_local_0_intro' => 'لا يتم أخذها ÙÙŠ الاعتبار، عادة يتم المنع بواسطة "page not found"ØŒ',
+ 'interwiki_local_1_intro' => 'يتم التحويل للمسار الهد٠المعطى ÙÙŠ تعريÙات وصلة الإنترويكي (أي تتم معاملتها مثل المراجع ÙÙŠ الصÙحات المحلية)',
+ 'interwiki_trans' => 'تضمين',
+ 'interwiki-trans-label' => 'تضمين:',
+ 'interwiki_trans_intro' => 'لو أن صياغة نص الويكي <code>{<nowiki />{prefix:<em>pagename</em>}}</code> تم استخدامها، إذا:',
+ 'interwiki_trans_1_intro' => 'يسمح بالتضمين من الويكي الأجنبي، لو أن تضمينات الإنترويكي مسموح بها عموما ÙÙŠ هذا الويكي،',
+ 'interwiki_trans_0_intro' => 'لا تسمح به، ولكن ابحث عن صÙحة ÙÙŠ نطاق القوالب.',
+ 'interwiki_intro_footer' => 'انظر [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] للمزيد من المعلومات حول جدول الإنترويكي.
+هناك [[Special:Log/interwiki|سجل بالتغييرات]] لجدول الإنترويكي.',
+ 'interwiki_1' => 'نعم',
+ 'interwiki_0' => 'لا',
+ 'interwiki_error' => 'خطأ: جدول الإنترويكي Ùارغ، أو حدث خطأ آخر.',
+ 'interwiki_edit' => 'تعديل',
+ 'interwiki_reasonfield' => 'السبب:',
+ 'interwiki_delquestion' => 'حذ٠"$1"',
+ 'interwiki_deleting' => 'أنت تحذ٠البادئة "$1".',
+ 'interwiki_deleted' => 'البادئة "$1" تمت إزالتها بنجاح من جدول الإنترويكي.',
+ 'interwiki_delfailed' => 'البادئة "$1" لم يمكن إزالتها من جدول الإنترويكي.',
+ 'interwiki_addtext' => 'أض٠بادئة إنترويكي',
+ 'interwiki_addintro' => 'أنت تضي٠بادئة إنترويكي جديدة.
+تذكر أنها لا يمكن أن تحتوي على مساÙات ( )ØŒ نقطتين Ùوق بعض (:)ØŒ علامة Ùˆ (&)ØŒ أو علامة يساوي (=).',
+ 'interwiki_addbutton' => 'أضÙ',
+ 'interwiki_added' => 'البادئة "$1" تمت إضاÙتها بنجاح إلى جدول الإنترويكي.',
+ 'interwiki_addfailed' => 'البادئة "$1" لم يمكن إضاÙتها إلى جدول الإنترويكي.
+على الأرجح هي موجودة بالÙعل ÙÙŠ جدول الإنترويكي.',
+ 'interwiki_edittext' => 'تعديل بادئة إنترويكي',
+ 'interwiki_editintro' => 'أنت تعدل بادئة إنترويكي موجودة.
+تذكر أن هذا يمكن أن يكسر الوصلات الحالية.',
+ 'interwiki_edited' => 'البادئة "$1" تم تعديلها بنجاح ÙÙŠ جدول الإنترويكي..',
+ 'interwiki_editerror' => 'البادئة "$1" لم يمكن تعديلها ÙÙŠ جدول الإنترويكي.
+من المحتمل أنها غير موجودة.',
+ 'interwiki-badprefix' => 'بادئة إنترويكي محددة "$1" تحتوي أحرÙا غير صحيحة',
+ 'log-name-interwiki' => 'سجل جدول الإنترويكي',
+ 'log-description-interwiki' => 'هذا سجل بالتغييرات ÙÙŠ [[Special:Interwiki|جدول الإنترويكي]].',
+ 'right-interwiki' => 'تعديل بيانات الإنترويكي',
+ 'action-interwiki' => 'تغيير مدخلة الإنترويكي هذه',
+);
+
+/** Aramaic (ÜܪܡÜÜ)
+ * @author Basharh
+ */
+$messages['arc'] = array(
+ 'interwiki' => 'ÜšÜ˜Ü Ü˜Ü«ÜšÜ Ü¦ ÜÜ•ÌˆÜ¥Ü¬Ü Ü•ÜܢܛܪܘÜÜ©Ü',
+ 'interwiki-title-norights' => 'ÜšÜ˜Ü ÜÜ•ÌˆÜ¥Ü¬Ü Ü•ÜܢܛܪܘÜÜ©Ü',
+ 'interwiki_prefix' => 'ܫܪܘÜÜ',
+ 'interwiki-prefix-label' => 'ܫܪܘÜÜ:',
+ 'interwiki_1' => 'ÜÜÜ¢',
+ 'interwiki_0' => 'Ü Ü',
+ 'interwiki_edit' => 'ܫܚܠܦ',
+ 'interwiki_reasonfield' => 'ܥܠܬÜ:',
+ 'interwiki_addbutton' => 'Üܘܣܦ',
+);
+
+/** Egyptian Spoken Arabic (مصرى)
+ * @author Ghaly
+ * @author Meno25
+ */
+$messages['arz'] = array(
+ 'interwiki' => 'عرض وتعديل بيانات الإنترويكي',
+ 'interwiki-title-norights' => 'عرض بيانات الإنترويكي',
+ 'interwiki-desc' => 'يضي٠[[Special:Interwiki|صÙحة خاصة]] لرؤية وتعديل جدول الإنترويكي',
+ 'interwiki_intro' => 'هذا عرض عام لجدول الإنترويكى. معانى البيانات ÙÙ‰ العواميد:', # Fuzzy
+ 'interwiki_prefix' => 'بادئة',
+ 'interwiki-prefix-label' => 'بادئة:',
+ 'interwiki_prefix_intro' => 'بادئة الإنترويكى ليتم استخدامها ÙÙ‰ صياغة نص الويكى <code>[<nowiki />[prefix:<em>pagename</em>]]</code>.',
+ 'interwiki_url_intro' => 'قالب للمسارات. حامل المكان $1 سيتم استبداله بواسطة <em>pagename</em> لنص الويكى، عندما يتم استخدام صياغة نص الويكى المذكورة بالأعلى.',
+ 'interwiki_local' => 'إرسال',
+ 'interwiki-local-label' => 'إرسال:',
+ 'interwiki_local_intro' => 'طلب http للويكى المحلى ببادئة الإنترويكى هذه ÙÙ‰ URl هو:',
+ 'interwiki_local_0_intro' => 'لا يتم أخذها ÙÙ‰ الاعتبار، عادة يتم المنع بواسطة "page not found"ØŒ',
+ 'interwiki_local_1_intro' => 'يتم التحويل للمسار الهد٠المعطى ÙÙ‰ تعريÙات وصلة الإنترويكى (أى تتم معاملتها مثل المراجع ÙÙ‰ الصÙحات المحلية)',
+ 'interwiki_trans' => 'تضمين',
+ 'interwiki-trans-label' => 'تضمين:',
+ 'interwiki_trans_intro' => 'لو أن صياغة نص الويكى <code>{<nowiki />{prefix:<em>pagename</em>}}</code> تم استخدامها، إذا:',
+ 'interwiki_trans_1_intro' => 'يسمح بالتضمين من الويكى الأجنبى، لو أن تضمينات الإنترويكى مسموح بها عموما ÙÙ‰ هذا الويكى،',
+ 'interwiki_trans_0_intro' => 'لا تسمح به، ولكن ابحث عن صÙحة ÙÙ‰ نطاق القوالب.',
+ 'interwiki_intro_footer' => 'انظر [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] للمزيد من المعلومات حول جدول الإنترويكى.
+هناك [[Special:Log/interwiki|سجل بالتغييرات]] لجدول الإنترويكى.',
+ 'interwiki_1' => 'نعم',
+ 'interwiki_0' => 'لا',
+ 'interwiki_error' => 'خطأ: جدول الإنترويكى Ùارغ، أو حدث خطأ آخر.',
+ 'interwiki_edit' => 'عدل',
+ 'interwiki_reasonfield' => 'سبب:',
+ 'interwiki_delquestion' => 'حذ٠"$1"',
+ 'interwiki_deleting' => 'أنت تحذ٠البادئة "$1".',
+ 'interwiki_deleted' => 'البادئة "$1" تمت إزالتها بنجاح من جدول الإنترويكى.',
+ 'interwiki_delfailed' => 'البادئة "$1" لم يمكن إزالتها من جدول الإنترويكى.',
+ 'interwiki_addtext' => 'أض٠بادئة إنترويكي',
+ 'interwiki_addintro' => 'أنت تضي٠بادئة إنترويكى جديدة.
+تذكر أنها لا يمكن أن تحتوى على مساÙات ( )ØŒ نقطتين Ùوق بعض (:)ØŒ علامة Ùˆ (&)ØŒ أو علامة يساوى (=).',
+ 'interwiki_addbutton' => 'إضاÙØ©',
+ 'interwiki_added' => 'البادئة "$1" تمت إضاÙتها بنجاح إلى جدول الإنترويكى.',
+ 'interwiki_addfailed' => 'البادئة "$1" لم يمكن إضاÙتها إلى جدول الإنترويكى.
+على الأرجح هى موجودة بالÙعل ÙÙ‰ جدول الإنترويكى.',
+ 'interwiki_edittext' => 'تعديل بادئة إنترويكي',
+ 'interwiki_editintro' => 'أنت تعدل بادئة إنترويكى موجودة.
+تذكر أن هذا يمكن أن يكسر الوصلات الحالية.',
+ 'interwiki_edited' => 'البادئة "$1" تم تعديلها بنجاح ÙÙ‰ جدول الإنترويكى..',
+ 'interwiki_editerror' => 'البادئة "$1" لم يمكن تعديلها ÙÙ‰ جدول الإنترويكى.
+من المحتمل أنها غير موجودة.',
+ 'interwiki-badprefix' => 'بادئة إنترويكى محددة "$1" Ùيها حرو٠مش صحيحة',
+ 'log-name-interwiki' => 'سجل جدول الإنترويكي',
+ 'log-description-interwiki' => 'هذا سجل بالتغييرات ÙÙ‰ [[Special:Interwiki|جدول الإنترويكي]].',
+ 'right-interwiki' => 'تعديل بيانات الإنترويكي',
+ 'action-interwiki' => 'تغيير مدخلة الإنترويكى هذه',
+);
+
+/** Assamese (অসমীয়া)
+ * @author Bishnu Saikia
+ */
+$messages['as'] = array(
+ 'interwiki_1' => 'হয়',
+ 'interwiki_0' => 'নহয়',
+ 'interwiki_edit' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰক',
+ 'interwiki_reasonfield' => 'কাৰণ:',
+ 'interwiki_addbutton' => 'যোগ',
+);
+
+/** Asturian (asturianu)
+ * @author Xuacu
+ */
+$messages['ast'] = array(
+ 'interwiki' => "Ver y editar los datos d'interwiki",
+ 'interwiki-title-norights' => "Ver los datos d'interwiki",
+ 'interwiki-desc' => "Amiesta una [[Special:Interwiki|páxina especial]] pa ver y editar la tabla d'interwiki",
+ 'interwiki_intro' => "Esta ye una vista xeneral de la tabla d'interwikis.",
+ 'interwiki-legend-show' => 'Amosar lleenda',
+ 'interwiki-legend-hide' => 'Anubrir lleenda',
+ 'interwiki_prefix' => 'Prefixu',
+ 'interwiki-prefix-label' => 'Prefixu:',
+ 'interwiki_prefix_intro' => "Prefixu d'interwiki a usar cola sintaxis de testu wiki <code>[<nowiki />[prefixu:<em>nome de la páxina</em>]]</code>.",
+ 'interwiki_url_intro' => "Plantía pa URLs. El marcador $1 se sustituirá pol <em>nome de la páxina</em> del testu wiki, cuando s'use la sintaxis de testu wiki anterior.",
+ 'interwiki_local' => 'Siguiente',
+ 'interwiki-local-label' => 'Siguiente:',
+ 'interwiki_local_intro' => 'Una solicitú HTTP a la wiki llocal con esti prefixu interwiki na URL:',
+ 'interwiki_local_0_intro' => 'nun se respeta, bloquiada de vezu con "páxina nun alcontrada",',
+ 'interwiki_local_1_intro' => 'se redirixe a la URL de destín indicada nes definiciones del enllaz interwiki (esto ye, se trata como les referencies nes páxines llocales)',
+ 'interwiki_trans' => 'Trescluír',
+ 'interwiki-trans-label' => 'Trescluír:',
+ 'interwiki_trans_intro' => "Si s'usa la sintaxis de testu wiki <code>{<nowiki />{prefixu:<em>nome de la páxina</em>}}</code>, entós:",
+ 'interwiki_trans_1_intro' => 'permite la tresclusión de la wiki esterna, si les tresclusiones interwiki se permiten en xeneral nesta wiki,',
+ 'interwiki_trans_0_intro' => 'nun la permite, sinón que gueta una páxina nel espaciu de nomes de la plantía.',
+ 'interwiki_intro_footer' => "Pa más información consulta [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] tocante a la tabla d'interwiki.
+Hai un [[Special:Log/interwiki|rexistru de cambios]] a la tabla d'interwiki.",
+ 'interwiki_1' => 'sí',
+ 'interwiki_0' => 'non',
+ 'interwiki_error' => "Error: La tabla d'interwiki ta balera, o salió mal otra cosa.",
+ 'interwiki-cached' => "Los datos d'interwiki tan guardaos na caché. Nun ye posible camudar la caché.",
+ 'interwiki_edit' => 'Editar',
+ 'interwiki_reasonfield' => 'Motivu:',
+ 'interwiki_delquestion' => 'Desaniciando «$1»',
+ 'interwiki_deleting' => "Tas desaniciando'l prefixu «$1».",
+ 'interwiki_deleted' => "El prefixu «$1» se desanició correutamente de la tabla d'interwiki.",
+ 'interwiki_delfailed' => "El prefixu «$1» nun se pudo desaniciar de la tabla d'interwiki.",
+ 'interwiki_addtext' => "Amestar un prefixu d'interwiki",
+ 'interwiki_addintro' => 'Tas amestando un nuevu prefixu interwiki.
+Recuerda que nun pue contener espacios ( ), dos puntos (:), nin los signos (&) nin (=).',
+ 'interwiki_addbutton' => 'Amestar',
+ 'interwiki_added' => "El prefixu «$1» s'amestó correutamente a la tabla d'interwiki.",
+ 'interwiki_addfailed' => "El prefixu «$1» nun se pudo amestar a la tabla d'interwiki.
+Seique yá esiste na tabla d'interwiki.",
+ 'interwiki_edittext' => "Editar un prefixu d'interwiki",
+ 'interwiki_editintro' => "Tas editando un prefixu d'interwiki.
+Recuerda qu'esto pue francer enllaces esistentes.",
+ 'interwiki_edited' => "El prefixu «$1» se camudó correutamente na tabla d'interwiki.",
+ 'interwiki_editerror' => "El prefixu «$1» nun se pudo camudar na tabla d'interwiki.
+Seique nun esista.",
+ 'interwiki-badprefix' => "El prefixu d'interwiki conseñáu «$1» contién caráuteres non válidos",
+ 'interwiki-submit-empty' => 'El prefixu y la URL nun puen tar baleros.',
+ 'interwiki-submit-invalidurl' => 'El protocolu de la URL nun ye válidu.',
+ 'log-name-interwiki' => "Rexistru de la tabla d'interwiki",
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|amestó}}\'l prefixu "$4" ($5) (trans: $6; local: $7) a la tabla d\'interwiki',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|camudó}}\'l prefixu "$4" ($5) (trans: $6; local: $7) na tabla d\'interwiki',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|desanició}}\'l prefixu "$4" de la tabla d\'interwiki',
+ 'log-description-interwiki' => "Esti ye un rexistru de los cambios fechos na [[Special:Interwiki|tabla d'interwiki]].",
+ 'right-interwiki' => "Editar los datos d'interwiki",
+ 'action-interwiki' => "camudar esta entrada d'interwiki",
+);
+
+/** Kotava (Kotava)
+ * @author Wikimistusik
+ */
+$messages['avk'] = array(
+ 'interwiki' => "Wira va 'interwiki' orig isu betara",
+ 'interwiki-title-norights' => "Wira va 'interwiki' orig",
+ 'interwiki-desc' => "Batcoba, ta wira va 'interwiki' origak isu betara, va [[Special:Interwiki|aptafu bu]] loplekur",
+ 'interwiki_intro' => "Ta lo giva icde 'interwiki' origak va [http://www.mediawiki.org/wiki/Interwiki_table MediaWiki.org] wil !", # Fuzzy
+ 'interwiki_prefix' => 'Abdueosta',
+ 'interwiki-prefix-label' => 'Abdueosta:', # Fuzzy
+ 'interwiki_error' => "ROKLA : 'Interwiki' origak tir vlardaf oke rotaca al sokir.",
+ 'interwiki_reasonfield' => 'Lazava :',
+ 'interwiki_delquestion' => 'Sulara va "$1"',
+ 'interwiki_deleting' => 'Rin va "$1" abdueosta dun sulal.',
+ 'interwiki_deleted' => '"$1" abdueosta div \'interwiki\' origak al zo tioltenher.',
+ 'interwiki_delfailed' => '"$1" abdueosta div \'interwiki\' origak me zo rotiolter.',
+ 'interwiki_addtext' => "Loplekura va 'interwiki' abdueosta",
+ 'interwiki_addintro' => "Rin va warzafa 'interwiki' abdueosta dun loplekul.
+Me vulkul da bata va darka ( ) ik briva (:) ik 'ampersand' (&) ik miltastaa (=) me roruldar.",
+ 'interwiki_addbutton' => 'Loplekura',
+ 'interwiki_added' => '"$1" abdueosta ko \'interwiki\' origak al zo loplekunhur.',
+ 'interwiki_addfailed' => '"$1" abdueosta ko \'interwiki\' origak me zo roloplekur.
+Rotir koeon ixam tir.',
+ 'interwiki_edittext' => "Betara va 'interwiki' abdueosta",
+ 'interwiki_editintro' => "Rin va 'interwiki' abdueosta dun betal.
+Me vulkul da batcoba va kruldesi gluyasiki rotempar !",
+ 'interwiki_edited' => '"$1" abdueosta koe \'interwiki\' origak al zo betanhar.',
+ 'interwiki_editerror' => '"$1" abdueosta koe \'interwiki\' origak me zo robetar.
+Rotir koeon me krulder.',
+ 'log-name-interwiki' => "'Interwiki' origak 'log'",
+ 'log-description-interwiki' => "Batcoba tir 'log' dem betaks va [[Special:Interwiki|'interwiki' origak]].",
+);
+
+/** Azerbaijani (azərbaycanca)
+ * @author Wertuose
+ */
+$messages['az'] = array(
+ 'interwiki' => 'İnterviki məlumatlarına bax və redaktə et',
+ 'interwiki-title-norights' => 'İnterviki məlumatlarına bax',
+ 'interwiki-desc' => 'İnterviki cədvəlinə baxmaq və redaktə etmək üçün [[Special:Interwiki|xüsusi səhifə]] əlavə edir',
+ 'interwiki_prefix' => 'Prefiks',
+ 'interwiki-prefix-label' => 'Prefiks:',
+ 'interwiki_local' => 'Yönləndir',
+ 'interwiki-local-label' => 'Yönləndir:',
+ 'interwiki_trans' => 'Göstər',
+ 'interwiki-trans-label' => 'Göstər:',
+ 'interwiki_1' => 'bəli',
+ 'interwiki_0' => 'xeyr',
+ 'interwiki_edit' => 'RedaktÉ™ et',
+ 'interwiki_reasonfield' => 'Səbəb:',
+ 'interwiki_delquestion' => '"$1" silinir',
+ 'interwiki_addbutton' => 'ÆlavÉ™ et',
+ 'right-interwiki' => 'İntervikilərin redaktə edilməsi',
+);
+
+/** Bashkir (башҡортÑа)
+ * @author Assele
+ */
+$messages['ba'] = array(
+ 'interwiki' => 'Интервики буйынÑа мәғлүмәтте ҡарау һәм үҙгәртеү',
+ 'interwiki-title-norights' => 'Интервики буйынÑа мәғлүмәтте ҡарау',
+ 'interwiki-desc' => 'Интервики таблицаһын ҡарау һәм үҙгәртеү Ó©Ñөн [[Special:Interwiki|махÑÑƒÑ Ð±Ð¸Ñ‚]] өҫтәй.',
+ 'interwiki_intro' => 'Был — интервики таблицаһы.',
+ 'interwiki-legend-show' => 'Легенданы күрһәтергә',
+ 'interwiki-legend-hide' => 'Легенданы йәшерергә',
+ 'interwiki_prefix' => 'Ҡушылма',
+ 'interwiki-prefix-label' => 'Ҡушылма:',
+ 'interwiki_prefix_intro' => '<code>[<nowiki />[Ҡушылма:<em>биттең иÑеме</em>]]</code> вики-текÑÑ‚ ÑинтакÑиÑында ҡулланыу Ó©Ñөн интервики ҡушылмаһы.',
+ 'interwiki_url_intro' => 'URL Ó©Ñөн ҡалып. $1 урынына юғарыла күрһәтелгән вики-текÑÑ‚ ÑинтакÑиÑында ҡулланылған <em>биттең иÑеме</em> ҡуйылаÑаҡ.',
+ 'interwiki_local' => 'Йүнәлтеү',
+ 'interwiki-local-label' => 'Йүнәлтеү:',
+ 'interwiki_local_intro' => 'Урындағы викиға URL-да интервики ҡушылма менән HTTP-һорау:',
+ 'interwiki_local_0_intro' => 'Ñ€Ó©Ñ…Ñәт ителмәй, ғәҙәттә урынына «бит табылманы» Ñҙыуы Ñыға.',
+ 'interwiki_local_1_intro' => 'интервики-һылтанмала билдәләнгән кәрәкле URL Ð°Ð´Ñ€ÐµÑ Ð±ÑƒÐ¹Ñ‹Ð½Ñа йүнәлтелә (йәғни урындағы биттәрҙең йүнәлтеүҙәре һымаҡ Ñшкәртелә)',
+ 'interwiki_trans' => 'Ҡулланыу',
+ 'interwiki-trans-label' => 'Ҡулланыу:',
+ 'interwiki_trans_intro' => 'Әгәр <code>{<nowiki />{ҡушымта:<em>биттең иÑеме</em>}}</code> вики-текÑÑ‚ ÑинтакÑиÑÑ‹ ҡулланылһа:',
+ 'interwiki_trans_1_intro' => 'әгәр был вики-проектта интервики ҡушыуҙар Ñ€Ó©Ñ…Ñәт ителһә, башҡа вики-проекттарҙан ҡушыу Ñ€Ó©Ñ…Ñәт ителә.',
+ 'interwiki_trans_0_intro' => 'Ñ€Ó©Ñ…Ñәт ителмәй, ҡалып иÑемдәре арауығынан биттәр Ñҙләнә,',
+ 'interwiki_intro_footer' => 'Интервики таблицаһы тураһында тулыраҡ мәғлүмәт алыр Ó©Ñөн [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] битенә керегеҙ.
+Интервики таблицаһында [[Special:Log/interwiki|үҙгәртеү Ñҙмалары]] бар.',
+ 'interwiki_1' => 'Ñйе',
+ 'interwiki_0' => 'ÑŽÒ¡',
+ 'interwiki_error' => 'Хата: Интервики таблицаһы буш, йә ниҙер хаталы Ñшләй.',
+ 'interwiki-cached' => 'Интервики буйынÑа мәғлүмәт кÑшланған. КÑшты үҙгәртеү мөмкин түгел.',
+ 'interwiki_edit' => 'Үҙгәртергә',
+ 'interwiki_reasonfield' => 'Сәбәп:',
+ 'interwiki_delquestion' => '$1 — юйыу',
+ 'interwiki_deleting' => 'Һеҙ «$1» ҡушылмаһын ÑŽÑһығыҙ.',
+ 'interwiki_deleted' => '«$1» ҡушылмаһы интервики таблицаһынан уңышлы юйылды.',
+ 'interwiki_delfailed' => '«$1» ҡушылмаһы интервики таблицаһынан юйыла алмай.',
+ 'interwiki_addtext' => 'Яңы интервики-ҡушылма өҫтәргә',
+ 'interwiki_addintro' => 'Һеҙ Ñңы интервики-ҡушылма өҫтәйһегеҙ.
+Унда буш аралар ( ), ике нөктәләр (:), амперÑандтар (&), йәки тигеҙлек билдәләре (=) була алмауын иҫегеҙҙә тотоғоҙ.',
+ 'interwiki_addbutton' => 'Өҫтәргә',
+ 'interwiki_added' => '«$1» ҡушылмаһы интервики таблицаһына уңышлы өҫтәлде.',
+ 'interwiki_addfailed' => '«$1» ҡушылмаһы интервики таблицаһына өҫтәлә алмай. Уның интервики таблицаһында булыуы ихтимал.',
+ 'interwiki_edittext' => 'Интервики-ҡушылманы үҙгәртеү',
+ 'interwiki_editintro' => 'Һеҙ интервики-ҡушылманы үҙгәртәһегеҙ. Был булған һылтанмаларҙы боҙоуы ихтималлығын иҫегеҙҙә тотоғоҙ.',
+ 'interwiki_edited' => '«$1» ҡушылмаһы интервики таблицаһында уңышлы үҙгәртелде.',
+ 'interwiki_editerror' => '«$1» ҡушылмаһы интервики таблицаһында үҙгәртелә алмай. Уның интервики таблицаһында булмауы ихтимал.',
+ 'interwiki-badprefix' => '«$1» интервики-ҡушымтаһында Ñ€Ó©Ñ…Ñәт ителмәгән хәрефтәр бар',
+ 'interwiki-submit-empty' => 'Ҡушылма һәм URL буш була алмай.',
+ 'interwiki-submit-invalidurl' => 'URL адреÑының протоколы дөрөҫ түгел.',
+ 'log-name-interwiki' => 'Интервики таблицаһын үҙгәртеүҙәр Ñҙмалары журналы',
+ 'logentry-interwiki-iw_add' => '$1 интервики таблицаһына «$4» ҡушылмаһын ($5) (ҡулланыу: $6; йүнәлтеү: $7) {{GENDER:$2|өҫтәне}}',
+ 'logentry-interwiki-iw_edit' => '$1 интервики таблицаһында «$4» ҡушылмаһын ($5) (ҡулланыу: $6; йүнәлтеү: $7) {{GENDER:$2|үҙгәртте}}',
+ 'logentry-interwiki-iw_delete' => '$1 интервики таблицаһынан «$4» ҡушылмаһын {{GENDER:$2|юйҙы}}',
+ 'log-description-interwiki' => 'Был — [[Special:Interwiki|интервики таблицаһын]] үҙгәртеүҙәр Ñҙмалары журналы',
+ 'right-interwiki' => 'Интервики таблицаһын мөхәррирләү',
+ 'action-interwiki' => 'интервики Ñҙмаһын үҙгәртеү',
+);
+
+/** Belarusian (беларуÑкаÑ)
+ * @author ТеÑÑ‚
+ * @author Чаховіч УладзіÑлаў
+ */
+$messages['be'] = array(
+ 'interwiki-legend-show' => 'Паказаць легенду',
+ 'interwiki_reasonfield' => 'Прычына:',
+ 'interwiki_addbutton' => 'Дадаць',
+);
+
+/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
+ * @author EugeneZelenko
+ * @author Jim-by
+ * @author Red Winged Duck
+ * @author Wizardist
+ */
+$messages['be-tarask'] = array(
+ 'interwiki' => 'ПраглÑд Ñ– Ñ€Ñдагаваньне зьвеÑтак пра інтÑрвікі',
+ 'interwiki-title-norights' => 'ПраглÑд зьвеÑтак пра інтÑрвікі',
+ 'interwiki-desc' => 'Дадае [[Special:Interwiki|Ñлужбовую Ñтаронку]] Ð´Ð»Ñ Ð¿Ñ€Ð°Ð³Ð»Ñду Ñ– Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ñ‚Ð°Ð±Ð»Ñ–Ñ†Ñ‹ інтÑрвікі.',
+ 'interwiki_intro' => 'ГÑта апіÑаньне табліцы інтÑрвікі.',
+ 'interwiki-legend-show' => 'Паказаць легенду',
+ 'interwiki-legend-hide' => 'Схаваць легенду',
+ 'interwiki_prefix' => 'ПрÑфікÑ',
+ 'interwiki-prefix-label' => 'ПрÑфікÑ:',
+ 'interwiki_prefix_intro' => 'ПрÑÑ„Ñ–ÐºÑ Ñ–Ð½Ñ‚Ñрвікі, Ñкі будзе выкарыÑтоўвацца Ñž ÑынтакÑÑ–Ñе <code>[<nowiki />[prefix:<em>назва Ñтаронкі</em>]]</code>.',
+ 'interwiki_url_intro' => 'Шаблён Ð´Ð»Ñ URL-адраÑоў. Сымбаль $1 будзе заменены <em>назвай Ñтаронкі</em> вікі-Ñ‚ÑкÑту, калі будзе ўжывацца вышÑйпазначаны ÑынтакÑÑ–Ñ Ð²Ñ–ÐºÑ–-Ñ‚ÑкÑту.',
+ 'interwiki_local' => 'Так/Ðе',
+ 'interwiki-local-label' => 'ПераÑылка:',
+ 'interwiki_local_intro' => 'HTTP-запыт да лÑкальнай вікі з гÑтым прÑфікÑам інтÑрвікі Ñž URL-адраÑе:',
+ 'interwiki_local_0_intro' => 'ігнаруюцца, звычайна блÑкуюцца з дапамогай «Ñтаронка Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð°Â»,',
+ 'interwiki_local_1_intro' => 'перанакіраваньне на мÑтавую URL-ÑпаÑылку пададзенае Ñž вызначÑньнÑÑ… інтÑрвікі-ÑпаÑылак (разглÑдаецца Ñк ÑпаÑылкі Ñž лÑкальных Ñтаронках)',
+ 'interwiki_trans' => 'ТранÑклюзіÑ',
+ 'interwiki-trans-label' => 'ТранÑклюзіÑ:',
+ 'interwiki_trans_intro' => 'Калі выкарыÑтоўваецца ÑынтакÑÑ–Ñ Ð²Ñ–ÐºÑ–-Ñ‚ÑкÑту <code>{<nowiki />{prefix:<em>назва Ñтаронкі</em>}}</code>, тады:',
+ 'interwiki_trans_1_intro' => 'дазвалÑе транÑклюзію зь іншай вікі, калі транÑÐºÐ»ÑŽÐ·Ñ–Ñ Ñ–Ð½Ñ‚Ñрвікі дазволена Ñž гÑтай вікі,',
+ 'interwiki_trans_0_intro' => 'не дазвалÑе гÑта, замеÑÑ‚ шукаць Ñтаронку Ñž праÑторы назваў шаблёнаў.',
+ 'interwiki_intro_footer' => 'Ð”Ð»Ñ Ð´Ð°Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð°Ð¹ інфармацыі пра табліцу інтÑрвікі глÑдзіце [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org].
+Тут знаходзіцца [[Special:Log/interwiki|журнал зьменаў]] табліцы інтÑрвікі.',
+ 'interwiki_1' => 'так',
+ 'interwiki_0' => 'не',
+ 'interwiki_error' => 'Памылка: табліца інтÑрвікі пуÑÑ‚Ð°Ñ Ð°Ð»ÑŒÐ±Ð¾ ўзьніклі Ñ–Ð½ÑˆÑ‹Ñ Ð¿Ñ€Ð°Ð±Ð»ÐµÐ¼Ñ‹.',
+ 'interwiki-cached' => 'ЗьвеÑткі пра інтÑрвікі знаходзÑцца Ñž кÑшы. ЗьмÑніць кÑш немагчыма.',
+ 'interwiki_edit' => 'РÑдагаваць',
+ 'interwiki_reasonfield' => 'Прычына:',
+ 'interwiki_delquestion' => 'Выдаленьне «$1»',
+ 'interwiki_deleting' => 'Ð’Ñ‹ выдалÑеце прÑÑ„Ñ–ÐºÑ Â«$1».',
+ 'interwiki_deleted' => 'ПрÑÑ„Ñ–ÐºÑ Â«$1» быў паÑьпÑхова выдалены з табліцы інтÑрвікі.',
+ 'interwiki_delfailed' => 'ПрÑÑ„Ñ–ÐºÑ Â«$1» Ð½Ñ Ð¼Ð¾Ð¶Ð° быць выдалены з табліцы інтÑрвікі.',
+ 'interwiki_addtext' => 'Дадаць прÑÑ„Ñ–ÐºÑ Ñ–Ð½Ñ‚Ñрвікі',
+ 'interwiki_addintro' => "Ð’Ñ‹ дадаеце новы прÑÑ„Ñ–ÐºÑ Ñ–Ð½Ñ‚Ñрвікі.
+ПамÑтайце, што ён Ð½Ñ Ð¼Ð¾Ð¶Ð° ўтрымліваць прабелы ( ), двукроп'Ñ– (:), ампÑÑ€Ñанды (&), ці знакі роўнаÑьці (=).",
+ 'interwiki_addbutton' => 'Дадаць',
+ 'interwiki_added' => 'ПрÑÑ„Ñ–ÐºÑ Â«$1» быў паÑьпÑхова дададзены да табліцы інтÑрвікі.',
+ 'interwiki_addfailed' => 'ПрÑÑ„Ñ–ÐºÑ Â«$1» Ð½Ñ Ð¼Ð¾Ð¶Ð° быць дададзены да табліцы інтÑрвікі.
+Верагодна ён ужо Ñ‘Ñьць у табліцы інтÑрвікі.',
+ 'interwiki_edittext' => 'РÑдагаваньне прÑфікÑа інтÑрвікі',
+ 'interwiki_editintro' => 'Ð’Ñ‹ Ñ€Ñдагуеце прÑÑ„Ñ–ÐºÑ Ñ–Ð½Ñ‚Ñрвікі.
+ПамÑтайце, гÑта можа ÑапÑаваць Ñ–ÑÐ½ÑƒÑŽÑ‡Ñ‹Ñ ÑпаÑылкі.',
+ 'interwiki_edited' => 'ПрÑÑ„Ñ–ÐºÑ Â«$1» быў паÑьпÑхова зьменены Ñž табліцы інтÑрвікі.',
+ 'interwiki_editerror' => 'ПрÑÑ„Ñ–ÐºÑ Â«$1» Ð½Ñ Ð¼Ð¾Ð¶Ð° быць зьменены Ñž табліцы інтÑрвікі.
+Верагодна ён не Ñ–Ñнуе.',
+ 'interwiki-badprefix' => 'Пазначаны прÑÑ„Ñ–ÐºÑ Ñ–Ð½Ñ‚Ñрвікі «$1» утрымлівае нÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ñымбалі',
+ 'interwiki-submit-empty' => 'ПрÑÑ„Ñ–ÐºÑ Ñ– URL-Ð°Ð´Ñ€Ð°Ñ Ð½Ñ Ð¼Ð¾Ð³ÑƒÑ†ÑŒ быць пуÑтымі.',
+ 'interwiki-submit-invalidurl' => 'ÐÑÑлушны пратакол URL.',
+ 'log-name-interwiki' => 'Журнал зьменаў табліцы інтÑрвікі',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|дадаў|дадала}} прÑÑ„Ñ–ÐºÑ Â«$4» ($5) (trans: $6; local: $7) у інтÑрвікі-табліцу',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|зьмÑніў|зьмÑніла}} прÑÑ„Ñ–ÐºÑ Â«$4» ($5) (trans: $6; local: $7) у інтÑрвікі-табліцы',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|выдаліў|выдаліла}} прÑÑ„Ñ–ÐºÑ Â«$4» з інтÑрвікі-табліцы',
+ 'log-description-interwiki' => 'ГÑта журнал зьменаў [[Special:Interwiki|табліцы інтÑрвікі]].',
+ 'right-interwiki' => 'РÑдагаваньне зьвеÑтак інтÑрвікі',
+ 'action-interwiki' => 'зьмÑніць гÑÑ‚Ñ‹ ÑлемÑнт інтÑрвікі',
+);
+
+/** Bulgarian (българÑки)
+ * @author DCLXVI
+ */
+$messages['bg'] = array(
+ 'interwiki' => 'Преглед и управление на междууикитата',
+ 'interwiki-title-norights' => 'Преглед на данните за междууикита',
+ 'interwiki-desc' => 'Ð”Ð¾Ð±Ð°Ð²Ñ [[Special:Interwiki|Ñпециална Ñтраница]] за преглед и управление на таблицата Ñ Ð¼ÐµÐ¶Ð´ÑƒÑƒÐ¸ÐºÐ¸Ñ‚Ð°',
+ 'interwiki_intro' => 'Това е общ преглед на таблицата Ñ Ð¼ÐµÐ¶Ð´ÑƒÑƒÐ¸ÐºÐ¸Ñ‚Ð°.',
+ 'interwiki_prefix' => 'ПредÑтавка:',
+ 'interwiki-prefix-label' => 'ПредÑтавка:',
+ 'interwiki_local' => 'Локално', # Fuzzy
+ 'interwiki-local-label' => 'Локално:', # Fuzzy
+ 'interwiki_intro_footer' => 'Вижте [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] за повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно таблицата Ñ Ð¼ÐµÐ¶Ð´ÑƒÑƒÐ¸ÐºÐ¸Ñ‚Ð°.
+СъщеÑтвува и [[Special:Log/interwiki|дневник на промените]] в таблицата Ñ Ð¼ÐµÐ¶Ð´ÑƒÑƒÐ¸ÐºÐ¸Ñ‚Ð°.',
+ 'interwiki_1' => 'да',
+ 'interwiki_0' => 'не',
+ 'interwiki_error' => 'ГРЕШКÐ: Таблицата Ñ Ð¼ÐµÐ¶Ð´ÑƒÑƒÐ¸ÐºÐ¸Ñ‚Ð° е празна или е възникнала друга грешка.',
+ 'interwiki_edit' => 'Редактиране',
+ 'interwiki_reasonfield' => 'Причина:',
+ 'interwiki_delquestion' => 'Изтриване на "$1"',
+ 'interwiki_deleting' => 'Изтриване на предÑтавката „$1“.',
+ 'interwiki_deleted' => '„$1“ беше уÑпешно премахнато от таблицата Ñ Ð¼ÐµÐ¶Ð´ÑƒÑƒÐ¸ÐºÐ¸Ñ‚Ð°.',
+ 'interwiki_delfailed' => '„$1“ не може да бъде премахнато от таблицата Ñ Ð¼ÐµÐ¶Ð´ÑƒÑƒÐ¸ÐºÐ¸Ñ‚Ð°.',
+ 'interwiki_addtext' => 'ДобавÑне на ново междууики',
+ 'interwiki_addintro' => "''Забележка:'' Междууикитата не могат да Ñъдържат интервали ( ), Ð´Ð²ÑƒÐµÑ‚Ð¾Ñ‡Ð¸Ñ (:), амперÑанд (&) или знак за равенÑтво (=).",
+ 'interwiki_addbutton' => 'ДобавÑне',
+ 'interwiki_added' => '„$1“ беше уÑпешно добавено в таблицата Ñ Ð¼ÐµÐ¶Ð´ÑƒÑƒÐ¸ÐºÐ¸Ñ‚Ð°.',
+ 'interwiki_addfailed' => '„$1“ не може да бъде добавено в таблицата Ñ Ð¼ÐµÐ¶Ð´ÑƒÑƒÐ¸ÐºÐ¸Ñ‚Ð°. Възможно е вече да е било добавено там.',
+ 'interwiki_edittext' => 'Редактиране на междууики предÑтавка',
+ 'interwiki_edited' => 'ПредÑтавката „$1“ беше уÑпешно променена в таблицата Ñ Ð¼ÐµÐ¶Ð´ÑƒÑƒÐ¸ÐºÐ¸Ñ‚Ð°.',
+ 'log-name-interwiki' => 'Дневник на междууикитата',
+ 'log-description-interwiki' => 'Тази Ñтраница Ñъдържа дневник на промените в [[Special:Interwiki|таблицата Ñ Ð¼ÐµÐ¶Ð´ÑƒÑƒÐ¸ÐºÐ¸Ñ‚Ð°]].',
+ 'right-interwiki' => 'Редактиране на междууикитата',
+);
+
+/** Bengali (বাংলা)
+ * @author Wikitanvir
+ */
+$messages['bn'] = array(
+ 'interwiki_prefix' => 'উপসরà§à¦—',
+ 'interwiki-prefix-label' => 'উপসরà§à¦—:',
+ 'interwiki_1' => 'হà§à¦¯à¦¾à¦',
+ 'interwiki_0' => 'না',
+ 'interwiki_edit' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
+ 'interwiki_reasonfield' => 'কারণ:',
+ 'interwiki_delquestion' => '"$1" অপসারণ',
+ 'interwiki_deleting' => 'আপনি উপসরà§à¦— "$1" অপসারণ করছেন।',
+ 'interwiki_addtext' => 'à¦à¦•à¦Ÿà¦¿ আনà§à¦¤à¦ƒà¦‰à¦‡à¦•à¦¿ উপসরà§à¦— যোগ',
+ 'interwiki_addbutton' => 'যোগ',
+);
+
+/** Breton (brezhoneg)
+ * @author Fohanno
+ * @author Fulup
+ * @author Y-M D
+ */
+$messages['br'] = array(
+ 'interwiki' => 'Gwelet hag aozañ ar roadennoù etrewiki',
+ 'interwiki-title-norights' => 'Gwelet ar roadennoù etrewiki',
+ 'interwiki-desc' => 'Ouzhpennañ a ra ur [[Special:Interwiki|bajenn dibar]] evit gwelet ha kemmañ taolenn an etrewiki',
+ 'interwiki_intro' => 'Hemañ zo un alberz eus taolenn an etrewiki.',
+ 'interwiki-legend-show' => "Diskouez an alc'hwez",
+ 'interwiki-legend-hide' => "Kuzhat an alc'hwez",
+ 'interwiki_prefix' => 'Rakger',
+ 'interwiki-prefix-label' => 'Rakger :',
+ 'interwiki_prefix_intro' => 'Rakger etrewiki da vezañ implijet en <code>[<nowiki />[prefix:<em>anv ar bajenn</em>]]</code> en ereadur wikitestenn.',
+ 'interwiki_url_intro' => "Patrom evit an URLoù. Erlec'hiet e vo $1 gant <em>anv ar bajenn</em> ar wikitestenn, pa vez graet gant an ereadur wikitestenn a-us.",
+ 'interwiki_local' => 'Treuzkas',
+ 'interwiki-local-label' => 'Treuzkas :',
+ 'interwiki_local_intro' => 'Ur reked HTTP war ar wiki-mañ gant ar rakger etrewiki-mañ en URL a vo :',
+ 'interwiki_local_0_intro' => 'nac\'het, stanket alies gant "pajenn nann-kavet",',
+ 'interwiki_local_1_intro' => "Adkaset war-du an URL tal roet e termenadurioù al liammoù etrewiki (da lavaret eo e vez gwelet evel daveennoù er pajennoù lec'hel)",
+ 'interwiki_trans' => 'Ebarzhiñ',
+ 'interwiki-trans-label' => 'Treuzkludañ :',
+ 'interwiki_trans_intro' => 'Ma vez implijet an ereadur wikitestenn <code>{<nowiki />{prefix:<em>anv ar bajenn</em>}}</code>, neuze :',
+ 'interwiki_trans_1_intro' => 'Aotren an treuzkludañ adalek ar wiki estren, ma vez aotreet treuzkludañ er wiki-mañ dre-vras,',
+ 'interwiki_trans_0_intro' => "na aotren an treuzkludañ, kentoc'h klask ur bajenn en esaouenn anv ar patrom.",
+ 'interwiki_intro_footer' => "Gwelet [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] evit gouzout hiroc'h diwar-benn taolenn an etrewiki.
+Ur [[Special:Log/interwiki|marilh ar c'hemmoù]] zo e taolenn an etrewiki.",
+ 'interwiki_1' => 'ya',
+ 'interwiki_0' => 'ket',
+ 'interwiki_error' => 'Fazi : goullo eo taolenn an etrewiki, pe un dra bennak all zo aet a-dreuz.',
+ 'interwiki-cached' => "Krubuilhet eo an etrewiki-mañ. N'haller ket kemmañ ar grubuilh.",
+ 'interwiki_edit' => 'Aozañ',
+ 'interwiki_reasonfield' => 'Abeg :',
+ 'interwiki_delquestion' => 'O tilemel « $1 »',
+ 'interwiki_deleting' => "Emaoc'h o tilemel ar rakger « $1 ».",
+ 'interwiki_deleted' => 'Lamet eo bet ervat ar rakger "$1" eus an daolenn etrewiki.',
+ 'interwiki_delfailed' => 'N\'eus ket bet tu dilemel "$1" eus an daolenn etrewiki.',
+ 'interwiki_addtext' => 'Ouzhpennañ ur rakger etrewiki',
+ 'interwiki_addintro' => "Oc'h ouzhpennañ ur rakger etrewiki nevez emaoc'h.
+Dalc'hit soñj n'hall bezañ ennañ nag esaouennoù ( ), na daoubikoù (:), nag unan eus an arouezennoù (&) pe \"kevatal\" (=)",
+ 'interwiki_addbutton' => 'Ouzhpennañ',
+ 'interwiki_added' => 'Ouzhpennet eo bet ervat ar rakger "$1" e taolenn an etrewiki.',
+ 'interwiki_addfailed' => 'N\'eus ket bet gallet ouzhpennañ are rakger "$1" e taolenn an etrewiki.
+Ken buan all emañ en daolenn dija.',
+ 'interwiki_edittext' => 'O kemmañ ur rakger etrewiki',
+ 'interwiki_editintro' => "Emaoc'h o kemmañ ur rakger etrewiki.
+Ho pezet soñj e c'hall an dra-se terriñ liammoù zo anezho dija.",
+ 'interwiki_edited' => 'Kemmet eo bet ervat ar rakger "$1" e taolenn an etrewiki.',
+ 'interwiki_editerror' => 'N\'hall ket ar rakger "$1" bezañ kemmet e taolenn an etrewiki.
+Marteze n\'eus ket anezhañ.',
+ 'interwiki-badprefix' => 'Arouezennoù direizh zo er rakger etrewiki spisaet "$1',
+ 'interwiki-submit-empty' => "N'hall ket ar rakger hag an URL bezañ goullo.",
+ 'log-name-interwiki' => 'Deizlevr taolenn an etrewiki',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|en deus|he deus}} ouzhpennet ar rakger "$4" ($5) (treuz: $6; lec\'hel: $7) d\'an daolenn etrewiki',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|en deus|he deus}} kemmet ar rakger "$4" ($5) (treuz: $6; lec\'hel: $7) en daolenn etrewiki',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|en deus|he deus}} tennet ar rakger "$4" diwar an daolenn etrewiki',
+ 'log-description-interwiki' => "Ur marilh eus ar c'hemmoù e [[Special:Interwiki|taolenn an etrewiki]] eo.",
+ 'right-interwiki' => 'Kemmañ ar roadennoù etrewiki',
+ 'action-interwiki' => 'kemmañ ar moned etrewiki-mañ',
+);
+
+/** Bosnian (bosanski)
+ * @author CERminator
+ * @author Kal-El
+ */
+$messages['bs'] = array(
+ 'interwiki' => 'Vidi i uredi međuwiki podatke',
+ 'interwiki-title-norights' => 'Pregled interwiki podataka',
+ 'interwiki-desc' => 'Dodaje [[Special:Interwiki|posebnu stranicu]] za pregled i uređivanje interwiki tabele',
+ 'interwiki_intro' => 'Ovo je pregled interwiki tabele.',
+ 'interwiki_prefix' => 'Prefiks',
+ 'interwiki-prefix-label' => 'Prefiks:',
+ 'interwiki_prefix_intro' => 'Međuwiki prefiks koji se koristi u <code>[<nowiki />[prefix:<em>pagename</em>]]</code> wikitekst sintaksi.',
+ 'interwiki_url' => 'URL',
+ 'interwiki-url-label' => 'URL:',
+ 'interwiki_url_intro' => 'Šablon za URLove. Šablon $1 će biti zamijenjen sa <em>pagename</em> wikiteksta, ako je gore spomenuta sintaksa wikiteksta korištena.',
+ 'interwiki_local' => 'naprijed',
+ 'interwiki-local-label' => 'Naprijed:',
+ 'interwiki_local_intro' => 'Http zahtjev na lokalnu wiki sa ovim interwiki prefiksom u URl je:',
+ 'interwiki_local_0_intro' => 'nije privilegovano, obiÄno blokirano putem "stranica nije naÄ‘ena",',
+ 'interwiki_local_1_intro' => 'preusmjeravanje na ciljnu URL koja je navedena putem interwiki definicije (tj. tretira se poput referenci na lokalnim stranicama)',
+ 'interwiki_trans' => 'UkljuÄenja',
+ 'interwiki-trans-label' => 'UkljuÄenja:',
+ 'interwiki_trans_intro' => 'Ako se koristi wikitekst sintaksa <code>{<nowiki />{prefix:<em>pagename</em>}}</code>, onda:',
+ 'interwiki_trans_1_intro' => 'dopuÅ¡tena ukljuÄenja iz inostrane wiki, ako su meÄ‘uwiki ukljuÄenja općenito dopuÅ¡tena u ovoj wiki,',
+ 'interwiki_trans_0_intro' => 'nisu dopuštena, radije treba tražiti stranice u imenskom prostoru šablona.',
+ 'interwiki_intro_footer' => 'Pogledaje [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] za više informacija o interwiki tabeli.
+Postoji [[Special:Log/interwiki|zapisnik izmjena]] na interwiki tabeli.',
+ 'interwiki_1' => 'da',
+ 'interwiki_0' => 'ne',
+ 'interwiki_error' => 'Greška: interwiki tabela je prazna ili je nešto drugo pogrešno.',
+ 'interwiki_edit' => 'Uredi',
+ 'interwiki_reasonfield' => 'Razlog:',
+ 'interwiki_delquestion' => 'Briše se "$1"',
+ 'interwiki_deleting' => 'Brišete prefiks "$1".',
+ 'interwiki_deleted' => 'Prefiks "$1" je uspješno uklonjen iz interwiki tabele.',
+ 'interwiki_delfailed' => 'Prefiks "$1" nije bilo moguće ukloniti iz interwiki tabele.',
+ 'interwiki_addtext' => 'Dodaj interwiki prefiks',
+ 'interwiki_addintro' => 'Dodajete novi interwiki prefiks.
+Zapamtite da ne može sadržavati razmake ( ), dvotaÄke (:), znak and (&), ili znakove jednakosti (=).',
+ 'interwiki_addbutton' => 'Dodaj',
+ 'interwiki_added' => 'Prefiks "$1" je uspješno dodat u interwiki tabelu.',
+ 'interwiki_addfailed' => 'Prefiks "$1" nije bilo moguće dodati u interwiki tabelu.
+Moguće je da već postoji u interwiki tabeli.',
+ 'interwiki_edittext' => 'Uređivanje interwiki prefiksa',
+ 'interwiki_editintro' => 'Uređujete interwiki prefiks.
+Zapamtite da ovo može poremetiti postojeće linkove.',
+ 'interwiki_edited' => 'Prefiks "$1" je uspješno izmijenjen u interwiki tabeli.',
+ 'interwiki_editerror' => 'Prefiks "$1" ne može biti izmijenjen u interwiki tabeli.
+Moguće je da uopće ne postoji.',
+ 'interwiki-badprefix' => 'Navedeni interwiki prefiks "$1" sadrži nevaljane znakove',
+ 'interwiki-submit-empty' => 'Prefiks i URL ne mogu biti prazni.',
+ 'log-name-interwiki' => 'Zapisnik tabele interwikija',
+ 'log-description-interwiki' => 'Ovo je zapisnik izmjena na [[Special:Interwiki|interwiki tabeli]].',
+ 'right-interwiki' => 'Uređivanje interwiki podataka',
+ 'action-interwiki' => 'mijenjate ovu stavku interwikija',
+);
+
+/** Catalan (català)
+ * @author BroOk
+ * @author Paucabot
+ * @author SMP
+ * @author Solde
+ * @author Ssola
+ * @author Vriullop
+ */
+$messages['ca'] = array(
+ 'interwiki' => 'Veure i editar dades interwiki',
+ 'interwiki-title-norights' => 'Mapa de les dades interwiki',
+ 'interwiki-desc' => 'Afegeix una [[Special:Interwiki|pàgina especial]] per veure i editar la taula interwiki',
+ 'interwiki_intro' => "Aquesta és una visió general de la taula d'interwikis.",
+ 'interwiki-legend-show' => 'Mostra la llegenda',
+ 'interwiki-legend-hide' => 'Amaga la llegenda',
+ 'interwiki_prefix' => 'Prefix',
+ 'interwiki-prefix-label' => 'Prefix:',
+ 'interwiki_prefix_intro' => 'Prefix de interwiki és utilitzat en <code>[<nowiki />[prefix:<em>pagename</em>]]</code> sintaxi wikitext.',
+ 'interwiki_url_intro' => "Plantilla per a URLs. El marcador $1 serà substituït per <em>pagename</em> del wikitext, quan s'utilitza la sintaxi de wikitext esmentats.",
+ 'interwiki_local' => 'Hi encamina',
+ 'interwiki-local-label' => 'Endavant:',
+ 'interwiki_local_intro' => "Una petició HTTP al wiki local amb aquest prefix interwiki en l'URL és:",
+ 'interwiki_local_0_intro' => 'no honrat, generalment bloquejat per "pàgina no trobada",',
+ 'interwiki_local_1_intro' => "s'ha redirigit a l'URL de destinació donada a les definicions d'enllaç d'interwiki (és a dir, tractats com a referències a pàgines locals)",
+ 'interwiki_trans' => 'Transclusió',
+ 'interwiki-trans-label' => 'Transclude:',
+ 'interwiki_trans_intro' => "Si la sintaxi wikitext <code>{<nowiki />{prefix:<em>pagename</em>}}</code> s'utilitza, llavors:",
+ 'interwiki_trans_1_intro' => 'permetre transclusion des del wiki estranger, si aquest wiki, generalment admet interwiki transclusions',
+ 'interwiki_trans_0_intro' => "no es permet, busca una pàgina en l'espai de nom de la plantilla.",
+ 'interwiki_intro_footer' => 'Veure [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] per obtenir més informació sobre la taula de interwiki.
+Hi ha un [[Special:Log/interwiki|registre de canvis]] a la taula de interwiki.',
+ 'interwiki_1' => 'sí',
+ 'interwiki_0' => 'no',
+ 'interwiki_error' => 'Error: La taula interwiki és buida, o alguna cosa ha sortit malament.',
+ 'interwiki_edit' => 'Modifica',
+ 'interwiki_reasonfield' => 'Raó:',
+ 'interwiki_delquestion' => "S'està eliminant «$1»",
+ 'interwiki_deleting' => 'Estàs eliminant el prefix "$1".',
+ 'interwiki_deleted' => 'Prefix "$1" s\'ha suprimit amb èxit de la taula de interwiki.',
+ 'interwiki_delfailed' => 'Prefix " $1 "no pot ser eliminat de la taula interwiki.',
+ 'interwiki_addtext' => 'Afegir un prefix interwiki',
+ 'interwiki_addintro' => "Estàs afegint un prefix nou interwiki.
+Recorda que no pot contenir espais ( ), dos punts (:), ampersands (&) o signes d'igual (=)",
+ 'interwiki_addbutton' => 'Afegeix',
+ 'interwiki_added' => 'Prefix " $1 "s\'ha afegit correctament a la taula interwiki.',
+ 'interwiki_addfailed' => 'Prefix "$1" no es pot afegir a la taula de interwiki.
+Possiblement ja existeix a la taula de interwiki.',
+ 'interwiki_edittext' => 'Edita un prefix de interwiki',
+ 'interwiki_editintro' => 'Estàs editant un prefix interwiki.
+Recorda que això pot trencar vincles existents.',
+ 'interwiki_edited' => 'Prefix "$1" s\'ha modificat amb èxit en la taula de interwiki.',
+ 'interwiki_editerror' => 'Prefix "$1" no pot ser modificat en la taula de interwiki.
+Possiblement no existeix.',
+ 'interwiki-badprefix' => 'El prefix interwiki especificat "$1" conté caràcters no vàlids',
+ 'interwiki-submit-empty' => "El prefix i l'URL no pot estar buit.",
+ 'log-name-interwiki' => 'Registre de taula interwiki',
+ 'log-description-interwiki' => 'Això és un registre de canvis a la[[Special:Interwiki|interwiki taula]].',
+ 'right-interwiki' => 'Editar les dades interwiki',
+ 'action-interwiki' => "canviar aquesta entrada d'interwiki",
+);
+
+/** Chechen (нохчийн)
+ * @author Sasan700
+ * @author Умар
+ */
+$messages['ce'] = array(
+ 'interwiki_edit' => 'ÐиÑйé',
+ 'interwiki_reasonfield' => 'Бахьан:',
+ 'interwiki_addbutton' => 'Тlетоха',
+);
+
+/** Sorani Kurdish (کوردی)
+ * @author Asoxor
+ */
+$messages['ckb'] = array(
+ 'interwiki_reasonfield' => 'هۆکار:',
+ 'interwiki_deleted' => 'پێشگری «$1» سەرکەوتووانە لە خشتەی نێوانویکی لابرا.',
+);
+
+/** Corsican (corsu)
+ */
+$messages['co'] = array(
+ 'interwiki_reasonfield' => 'Mutivu:',
+);
+
+/** Czech (Äesky)
+ * @author Danny B.
+ * @author Mormegil
+ */
+$messages['cs'] = array(
+ 'interwiki' => 'Zobrazit a upravovat interwiki',
+ 'interwiki-title-norights' => 'Zobrazit interwiki',
+ 'interwiki-desc' => 'Přidává [[Special:Interwiki|speciální stránku]], na které lze prohlížet a editovat tabulku interwiki',
+ 'interwiki_intro' => 'Toto je přehled tabulky interwiki odkazů.',
+ 'interwiki-legend-show' => 'Zobrazit legendu',
+ 'interwiki-legend-hide' => 'Skrýt legendu',
+ 'interwiki_prefix' => 'Prefix',
+ 'interwiki-prefix-label' => 'Prefix:',
+ 'interwiki_prefix_intro' => 'Interwiki prefix používaný v syntaxi wikitextu <code>[<nowiki />[prefix:<em>stránka</em>]]</code>.',
+ 'interwiki_url_intro' => 'Vzor pro URL. Místo $1 se vloží <em>stránka</em> z wikitextu uvedeného v příkladu výše.',
+ 'interwiki_local' => 'Přesměrovat',
+ 'interwiki-local-label' => 'Přesměrovat:',
+ 'interwiki_local_intro' => 'HTTP požadavek na tuto wiki s tímto interwiki prefixem v URL je:',
+ 'interwiki_local_0_intro' => 'odmítnut, zpravidla s výsledkem „stránka nenalezena“,',
+ 'interwiki_local_1_intro' => 'přesměrován na cílové URL podle definice v tabulce interwiki odkazů (tj. chová se jako odkazy v lokálních stránkách).',
+ 'interwiki_trans' => 'Transkluze',
+ 'interwiki-trans-label' => 'Transkluze:',
+ 'interwiki_trans_intro' => 'Při použití syntaxe wikitextu <code>{<nowiki />{prefix:<em>stránka</em>}}</code>:',
+ 'interwiki_trans_1_intro' => 'umožnit vložení z druhé wiki, pokud je interwiki transkluze na této wiki obecně povolena.',
+ 'interwiki_trans_0_intro' => 'to nedovolit, místo toho použít stránku ve jmenném prostoru šablon,',
+ 'interwiki_intro_footer' => 'Více informací o tabulce interwiki najdete na [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org].
+Existuje také [[Special:Log/interwiki|protokol změn]] tabulky interwiki.',
+ 'interwiki_1' => 'ano',
+ 'interwiki_0' => 'ne',
+ 'interwiki_error' => 'CHYBA: Interwiki tabulka je prázdná anebo se pokazilo něco jiného.',
+ 'interwiki-cached' => 'Data interwiki pocházejí z cache. Změna cache není možná.',
+ 'interwiki_edit' => 'Editovat',
+ 'interwiki_reasonfield' => 'Důvod:',
+ 'interwiki_delquestion' => 'Mazání „$1“',
+ 'interwiki_deleting' => 'Mažete prefix „$1“.',
+ 'interwiki_deleted' => 'Prefix „$1“ byl úspěšně odstraněn z tabulky interwiki.',
+ 'interwiki_delfailed' => 'Prefix „$1“ nebylo možné odstranit z tabulky interwiki.',
+ 'interwiki_addtext' => 'Přidat interwiki prefix',
+ 'interwiki_addintro' => 'Přidáváte nový interwiki prefix.
+MÄ›jte na vÄ›domí, že nemůže obsahovat mezery ( ), dvojteÄky (:), ampersandy (&), ani rovnítka (=).',
+ 'interwiki_addbutton' => 'Přidat',
+ 'interwiki_added' => 'Prefix „$1“ byl úspěšně přidán do tabulky interwiki.',
+ 'interwiki_addfailed' => 'Prefix „$1“ nemohl být přidán do tabulky interwiki.
+Pravděpodobně tam již existuje.',
+ 'interwiki_edittext' => 'Editace interwiki prefixu',
+ 'interwiki_editintro' => 'Editujete interwiki prefix.
+MÄ›jte na vÄ›domí, že to může znefunkÄnit existující odkazy.',
+ 'interwiki_edited' => 'Prefix „$1“ v tabulce interwiki byl úspěšně modifikován.',
+ 'interwiki_editerror' => 'Prefix „$1“ v tabulce interwiki nemohl být modifikován.
+Pravděpodobně neexistuje.',
+ 'interwiki-badprefix' => 'Uvedený interwiki prefix „$1“ obsahuje nepovolený znak',
+ 'interwiki-submit-empty' => 'Prefix a URL nemohou být prázdné.',
+ 'interwiki-submit-invalidurl' => 'Protokol v URL je neplatný.',
+ 'log-name-interwiki' => 'Kniha změn tabulky interwiki',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|přidal|přidala}} prefix „$4“ ($5) (trans: $6; místní: $7) do tabulky interwiki',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|změnil|změnila}} prefix „$4“ ($5) (trans: $6; místní: $7) v tabulce interwiki',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|odebral|odebrala}} prefix „$4“ z tabulky interwiki',
+ 'log-description-interwiki' => 'Toto je seznam změn [[Special:Interwiki|tabulky interwiki]].',
+ 'right-interwiki' => 'Editování interwiki záznamů',
+ 'action-interwiki' => 'změnit tento záznam interwiki',
+);
+
+/** Church Slavic (ÑловѣÌньÑкъ / ⰔⰎⰑⰂⰡâ°â° â°”â°â°Ÿ)
+ * @author ОйЛ
+ */
+$messages['cu'] = array(
+ 'interwiki_0' => 'нѣÌÑ‚ÑŠ',
+);
+
+/** Welsh (Cymraeg)
+ * @author Lloffiwr
+ */
+$messages['cy'] = array(
+ 'interwiki' => 'Gweld a golygu data rhyngwici',
+ 'interwiki-title-norights' => 'Gweld y data rhyngwici',
+ 'interwiki_prefix' => 'Rhagddodiad',
+ 'interwiki-prefix-label' => 'Rhagddodiad:',
+ 'interwiki_local' => 'Anfon ymlaen',
+ 'interwiki-local-label' => 'Anfon ymlaen:',
+ 'interwiki_trans' => 'Trawsgynnwys',
+ 'interwiki-trans-label' => 'Trawsgynnwys:',
+ 'interwiki_intro_footer' => "Cewch ragor o wybodaeth am y tabl rhyngwici ar [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org].
+Cofnodir newidiadau i'r tabl rhyngwici ar y [[Special:Log/interwiki|lòg newidiadau]].",
+ 'interwiki_1' => 'gellir',
+ 'interwiki_0' => 'ni ellir',
+ 'interwiki_edit' => 'Golygu',
+ 'interwiki_reasonfield' => 'Rheswm:',
+ 'interwiki_addtext' => 'Ychwanegu rhagddodiad rhyngwici',
+ 'interwiki_addintro' => 'Rydych yn ychwanegu rhagddodiad rhyngwici newydd.
+Cofiwch na all gynnwys bwlch ( ), gorwahannod (:), ampersand (&), na hafalnod (=).',
+ 'interwiki_addbutton' => 'Ychwaneger',
+ 'interwiki_added' => 'Llwyddwyd i ychwanegu\'r rhagddodiad "$1" at y tabl rhyngwici.',
+ 'interwiki_addfailed' => 'Methwyd ychwanegu\'r rhagddodiad "$1" at y tabl rhyngwici.
+Efallai ei fod eisoes yn y tabl rhyngwici.',
+ 'log-name-interwiki' => 'Lòg y tabl rhyngwici',
+ 'log-description-interwiki' => "Dyma lòg y newidiadau i'r [[Special:Interwiki|tabl rhyngwici]].",
+ 'right-interwiki' => 'Golygu data rhyngwici',
+ 'action-interwiki' => 'newid yr eitem rhyngwici hwn',
+);
+
+/** Danish (dansk)
+ * @author Byrial
+ * @author Christian List
+ * @author Jon Harald Søby
+ * @author Peter Alberti
+ * @author Purodha
+ */
+$messages['da'] = array(
+ 'interwiki' => 'Vis og rediger interwikidata',
+ 'interwiki-title-norights' => 'Vis interwikidata',
+ 'interwiki-desc' => 'Tilføjer en [[Special:Interwiki|specialside]] til at få vist og redigere interwikitabellen',
+ 'interwiki_intro' => 'Dette er en oversigt over interwikitabellen.',
+ 'interwiki-legend-show' => 'Vis forklaring',
+ 'interwiki-legend-hide' => 'Skjul forklaring',
+ 'interwiki_prefix' => 'Præfiks',
+ 'interwiki-prefix-label' => 'Præfiks:',
+ 'interwiki_prefix_intro' => 'Interwiki præfiks som skal anvendes i <code>[<nowiki />[præfiks:<em>sidenavn</em>]]</code> wikitext syntaks.',
+ 'interwiki_url_intro' => 'Skabelon til URL-adresser. Pladsholderen $1 vil blive erstattet af <em>sidenavn</em> af wikitext, når den ovennævnte wikitext syntaks bruges.',
+ 'interwiki_local' => 'Videresend',
+ 'interwiki-local-label' => 'Videresend:',
+ 'interwiki_local_intro' => 'En HTTP-forespørgsel til den lokale wiki med denne interwiki præfiks i URL-adressen er:',
+ 'interwiki_local_0_intro' => 'ikke accepteret, normalt blokeret af "siden blev ikke fundet".',
+ 'interwiki_local_1_intro' => 'Omdirigeret til target URL i interwiki link definitioner (dvs. behandles som referencer i lokale sider).',
+ 'interwiki_trans' => 'Transkluder',
+ 'interwiki-trans-label' => 'Transkluder:',
+ 'interwiki_trans_intro' => 'Hvis wikitext syntaksen <code>[<nowiki />[præfiks:<em>sidenavn</em>]]</code> bruges, så:',
+ 'interwiki_1' => 'ja',
+ 'interwiki_0' => 'nej',
+ 'interwiki_error' => 'Fejl: Interwikitabellen er tom eller noget andet gik galt.',
+ 'interwiki-cached' => 'Interwiki-data er lagret i cachen. Det er ikke muligt at ændre cachen.',
+ 'interwiki_edit' => 'Redigér',
+ 'interwiki_reasonfield' => 'Begrundelse:',
+ 'interwiki_delquestion' => 'Sletter "$1"',
+ 'interwiki_deleting' => 'Du er ved at slette præfikset "$1".',
+ 'interwiki_deleted' => 'Præfikset "$1" blev fjernet fra interwikitabellen.',
+ 'interwiki_delfailed' => 'Præfikset "$1" kunne ikke fjernes fra interwikitabellen.',
+ 'interwiki_addtext' => 'Tilføj et interwikipræfiks',
+ 'interwiki_addintro' => 'Du er ved at tilføje et nyt interwikipræfiks.
+Husk at det ikke kan indeholde mellemrum ( ), kolon (:), &-tegn eller lighedstegn (=).',
+ 'interwiki_addbutton' => 'Tilføj',
+ 'interwiki_added' => 'Præfikset "$1" blev føjet til interwikitabellen.',
+ 'interwiki_addfailed' => 'Præfikset "$1" kunne ikke føjes til interwikitabellen.
+MÃ¥ske findes det allerede i interwikitabellen.',
+ 'interwiki_edittext' => 'Redigere et interwikipræfiks',
+ 'interwiki_editintro' => 'Du redigerer et interwikipræfiks.
+Husk, at dette kan bryde eksisterende hyperlinks.',
+ 'interwiki_edited' => 'Præfikset "$1" blev ændret i interwikitabellen.',
+ 'interwiki_editerror' => 'Præfikset "$1" kunne ikke ændres i interwikitabellen.
+Det findes muligvis ikke.',
+ 'interwiki-badprefix' => 'Det angivne interwikipræfiks "$1" indeholder ugyldige tegn.',
+ 'right-interwiki' => 'Redigere interwikidata',
+ 'action-interwiki' => 'ændre dette interwiki-element',
+);
+
+/** German (Deutsch)
+ * @author Als-Holder
+ * @author Church of emacs
+ * @author Kghbln
+ * @author MF-Warburg
+ * @author Metalhead64
+ * @author Purodha
+ * @author Raimond Spekking
+ * @author Umherirrender
+ */
+$messages['de'] = array(
+ 'interwiki' => 'Interwikidaten ansehen und bearbeiten',
+ 'interwiki-title-norights' => 'Interwikidaten ansehen',
+ 'interwiki-desc' => 'Ergänzt eine [[Special:Interwiki|Spezialseite]] zur Pflege der Interwikitabelle',
+ 'interwiki_intro' => 'Diese Seite bietet einen Ãœberblick des Inhalts der Interwikitabelle dieses Wikis.',
+ 'interwiki-legend-show' => 'Legende anzeigen',
+ 'interwiki-legend-hide' => 'Legende verbergen',
+ 'interwiki_prefix' => 'Präfix',
+ 'interwiki-prefix-label' => 'Präfix:',
+ 'interwiki_prefix_intro' => 'Das Interwikipräfix zur Verwendung im Wikitext in der Form <code>[<nowiki />[präfix:<em>Seitenname</em>]]</code>',
+ 'interwiki_url_intro' => 'Das Muster für die URLs. Der Platzhalter $1 wird bei dessen Verwendung im Wikitext durch <em>Seitenname</em> aus der oben genannten Syntax ersetzt',
+ 'interwiki_local' => 'Als lokales Wiki definiert',
+ 'interwiki-local-label' => 'Als lokales Wiki definiert:',
+ 'interwiki_local_intro' => 'Eine HTTP-Anfrage an das lokale Wiki mit diesem Interwikipräfix in der URL wird:',
+ 'interwiki_local_0_intro' => 'nicht erfüllt, sondern normalerweise mit „Seite nicht gefunden“ blockiert',
+ 'interwiki_local_1_intro' => 'automatisch auf die Ziel-URL der in den Definitionen angegebenen Interwikilinks weitergeleitet, d. h. sie werden wie ein Wikilink innerhalb lokaler Wikiseiten behandelt',
+ 'interwiki_trans' => 'Einbinden zulässig',
+ 'interwiki-trans-label' => 'Einbinden zulassen:',
+ 'interwiki_trans_intro' => 'Wenn die Vorlagensyntax <code>{<nowiki />{präfix:<em>Seitenname</em>}}</code> verwendet wird, dann:',
+ 'interwiki_trans_1_intro' => 'erlaube die Einbindung aus dem fremden Wiki, sofern Einbindungen in diesem Wiki allgemein zulässig sind',
+ 'interwiki_trans_0_intro' => 'erlaube die Einbindung nicht, und nimm eine Seite aus dem Vorlagennamensraum des lokalen Wikis',
+ 'interwiki_intro_footer' => 'Siehe auch die [//www.mediawiki.org/wiki/Manual:Interwiki_table Dokumentationsseite auf MediaWiki.org] für weitere Informationen zur Interwikitabelle. Das [[Special:Log/interwiki|Logbuch]] protokolliert alle Änderungen an der Interwikitabelle dieses Wikis.',
+ 'interwiki_1' => 'ja',
+ 'interwiki_0' => 'nein',
+ 'interwiki_error' => 'Fehler: Die Interwikitabelle ist leer oder etwas anderes ist schiefgelaufen.',
+ 'interwiki-cached' => 'Die Interwikidaten wurden gecached. Die Daten im Cache zu ändern ist nicht möglich.',
+ 'interwiki_edit' => 'Bearbeiten',
+ 'interwiki_reasonfield' => 'Grund:',
+ 'interwiki_delquestion' => 'Löschung des Präfix „$1“',
+ 'interwiki_deleting' => 'Du bist gerade dabei das Präfix „$1“ zu löschen.',
+ 'interwiki_deleted' => 'Das „$1“ wurde erfolgreich aus der Interwikitabelle entfernt.',
+ 'interwiki_delfailed' => 'Das „$1“ konnte nicht aus der Interwikitabelle gelöscht werden.',
+ 'interwiki_addtext' => 'Interwikipräfix hinzufügen',
+ 'interwiki_addintro' => 'Du fügst ein neues Interwikipräfix hinzu. Beachte, dass es kein Leerzeichen ( ), Kaufmännisches Und (&), Gleichheitszeichen (=) und keinen Doppelpunkt (:) enthalten darf.',
+ 'interwiki_addbutton' => 'Hinzufügen',
+ 'interwiki_added' => 'Das Präfix „$1“ wurde erfolgreich der Interwikitabelle hinzugefügt.',
+ 'interwiki_addfailed' => 'Das Präfix „$1“ konnte nicht der Interwikitabelle hinzugefügt werden.
+Möglicherweise befindet es sich bereits in der Interwikitabelle.',
+ 'interwiki_edittext' => 'Interwikipräfix bearbeiten',
+ 'interwiki_editintro' => 'Du bist gerade dabei ein Präfix zu ändern.
+Beachte bitte, dass dies bereits vorhandene Links ungültig machen kann.',
+ 'interwiki_edited' => 'Das Präfix „$1“ wurde erfolgreich in der Interwikitabelle geändert.',
+ 'interwiki_editerror' => 'Das Präfix „$1“ konnte nicht in der Interwikitabelle geändert werden.
+Möglicherweise ist es nicht vorhanden.',
+ 'interwiki-badprefix' => 'Das festgelegte Interwikipräfix „$1“ beinhaltet ungültige Zeichen.',
+ 'interwiki-submit-empty' => 'Die Felder zum Präfix und der URL dürfen nicht leer sein.',
+ 'interwiki-submit-invalidurl' => 'Das Protokoll der URL ist ungültig.',
+ 'log-name-interwiki' => 'Interwikitabelle-Logbuch',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|fügte}} das Präfix „$4“ ($5) (trans: $6; local: $7) der Interwikitabelle hinzu',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|änderte}} das Präfix „$4“ ($5) (trans: $6; local: $7) in der Interwikitabelle',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|entfernte}} das Präfix „$4“ aus der Interwikitabelle',
+ 'log-description-interwiki' => 'In diesem Logbuch werden Änderungen an der [[Special:Interwiki|Interwikitabelle]] protokolliert.',
+ 'right-interwiki' => 'Interwikitabelle bearbeiten',
+ 'action-interwiki' => 'Diesen Interwikieintrag ändern',
+);
+
+/** German (formal address) (Deutsch (Sie-Form)‎)
+ * @author Kghbln
+ * @author MichaelFrey
+ */
+$messages['de-formal'] = array(
+ 'interwiki_deleting' => 'Sie sind gerade dabei das Präfix „$1“ zu löschen.',
+ 'interwiki_addintro' => 'Sie fügen ein neues Interwikipräfix hinzu. Beachten Sie, dass es kein Leerzeichen ( ), Kaufmännisches Und (&), Gleichheitszeichen (=) und keinen Doppelpunkt (:) enthalten darf.',
+ 'interwiki_editintro' => 'Sie sind gerade dabei ein Präfix zu ändern.
+Beachten Sie bitte, dass dies bereits vorhandene Links ungültig machen kann.',
+);
+
+/** Zazaki (Zazaki)
+ * @author Erdemaslancan
+ * @author Mirzali
+ */
+$messages['diq'] = array(
+ 'interwiki-title-norights' => 'Melumatê interwikiya bıvin',
+ 'interwiki-legend-show' => 'Lecanti bıvin',
+ 'interwiki_prefix' => 'Verole',
+ 'interwiki-prefix-label' => 'Verole:',
+ 'interwiki_local' => 'Aser ke',
+ 'interwiki_trans' => 'Temase fi',
+ 'interwiki-trans-label' => 'Temase fi',
+ 'interwiki_1' => 'eya',
+ 'interwiki_0' => 'nê',
+ 'interwiki_edit' => 'Bıvurne',
+ 'interwiki_reasonfield' => 'Sebeb:',
+ 'interwiki_delquestion' => '"$1" besterneyêna',
+ 'interwiki_addbutton' => 'Deke',
+);
+
+/** Lower Sorbian (dolnoserbski)
+ * @author Michawiki
+ */
+$messages['dsb'] = array(
+ 'interwiki' => 'Daty interwiki se wobglědaś a wobźěłaś',
+ 'interwiki-title-norights' => 'Daty interwiki se wobglědaś',
+ 'interwiki-desc' => 'Pśidawa [[Special:Interwiki|specialny bok]] za woglědowanje a wobźěłowanje tabele interwiki',
+ 'interwiki_intro' => 'Toś to jo pśeglěd tabele interwiki.',
+ 'interwiki-legend-show' => 'Legendu pokazaÅ›',
+ 'interwiki-legend-hide' => 'Legendu schowaÅ›',
+ 'interwiki_prefix' => 'Prefiks',
+ 'interwiki-prefix-label' => 'Prefiks:',
+ 'interwiki_prefix_intro' => 'Prefiks interwiki, kótaryž ma se we wikitekstowej syntaksy <code>[<nowiki />[prefix:<em>pagename</em>]]</code> wužywaś.',
+ 'interwiki-url-label' => 'URL:',
+ 'interwiki_url_intro' => 'Pśedłoga za URL. Zastupne znamješko $1 wuměnijo se pśez <em>mě boka</em> wikijowego teksta, gaž se wušej naspomnjona wikitekstowa syntaksa wužywa.',
+ 'interwiki_local' => 'Doprědka',
+ 'interwiki-local-label' => 'Doprědka:',
+ 'interwiki_local_intro' => 'Napšašowanje http do lokalnego wikija z toś tym prefiksom interwiki w URL jo:',
+ 'interwiki_local_0_intro' => 'njepśipóznaty, zwětšego wót "bok njenamakany" blokěrowany,',
+ 'interwiki_local_1_intro' => 'k celowemu URL w definicijach wótkaza interwiki dalej pósrědnjony (t.j. wobchada se z tym, ako z referencami w lokalnych bokach)',
+ 'interwiki_trans' => 'Transkluděrowaś',
+ 'interwiki-trans-label' => 'Transkluděrowaś:',
+ 'interwiki_trans_intro' => 'Jolic se wikitekstowa syntaksa <code>{<nowiki />{prefix:<em>pagename</em>}}</code> wužywa, ga:',
+ 'interwiki_trans_1_intro' => 'zapśěgnjenje z cuzego wikija dowóliś, jolic zapśěgnjenja interwiki su powšyknje w toś tom wikiju dopušćone,',
+ 'interwiki_trans_0_intro' => 'jo njedowóliś, lubjej wuwoglěduj se za bokom w mjenjowem rumje Pśedłoga',
+ 'interwiki_intro_footer' => 'Glědaj [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] za dalšne informacije wó tabeli interwikijow.
+Jo [[Special:Log/interwiki|protokol změnow]] tabele interwikijow.',
+ 'interwiki_1' => 'jo',
+ 'interwiki_0' => 'nÄ›',
+ 'interwiki_error' => 'Zmólka: Tabela interwiki jo prozna abo něco druge jo wopak.',
+ 'interwiki-cached' => 'Interwikijowe daty su pufrowane. Njejo móžno pufrowak změniś.',
+ 'interwiki_edit' => 'Wobźěłaś',
+ 'interwiki_reasonfield' => 'Pśicyna:',
+ 'interwiki_delquestion' => '"$1" se lašujo',
+ 'interwiki_deleting' => 'Lašujoš prefiks "$1".',
+ 'interwiki_deleted' => 'Prefiks "$1" jo se wuspěšnje z tabele interwiki wupórał.',
+ 'interwiki_delfailed' => 'Prefiks "$1" njejo se dał z tabele interwiki wupóraś.',
+ 'interwiki_addtext' => 'Prefiks interwiki pśidaś',
+ 'interwiki_addintro' => 'Pśidawaš nowy prefiks interwiki.
+Źiwaj na to, až njesmějo wopśimjeś prozne znamjenja ( ), dwójodypki (:), pśekupny A (&) abo znamuška rownosći (=).',
+ 'interwiki_addbutton' => 'Pśidaś',
+ 'interwiki_added' => 'Prefiks "$1" jo se wuspěšnje tabeli interwiki pśidał.',
+ 'interwiki_addfailed' => 'Prefiks "$1" njejo se dał tabeli interwiki pśidaś.
+Snaź eksistěrujo južo w tabeli interwiki.',
+ 'interwiki_edittext' => 'Prefiks interwiki wobźěłaś',
+ 'interwiki_editintro' => 'Wobźěłujoš prefiks interwiki.
+Źiwaj na to, až to móžo eksistěrujuce wótkaze skóńcowaś',
+ 'interwiki_edited' => 'Prefiks "$1" jo se wuspěšnje w tabeli interwiki změnił.',
+ 'interwiki_editerror' => 'Prefiks "$1" njedajo se w tabeli interwiki změniś.
+Snaź njeeksistěrujo.',
+ 'interwiki-badprefix' => 'Podaty prefiks interwiki "$1" wopśimujo njepłaśiwe znamuška',
+ 'interwiki-submit-empty' => 'Prefiks a URL njesmějotej proznej byś.',
+ 'interwiki-submit-invalidurl' => 'URL-protokol jo njepłaśiwy.',
+ 'log-name-interwiki' => 'Protokol tabele interwiki',
+ 'logentry-interwiki-iw_add' => '$1 jo prefiks "$4" ($5) (trans: $6; local: $7) interwikijowej tabeli {{GENDER:$2|pśidał|pśidała}}',
+ 'logentry-interwiki-iw_edit' => '$1 jo prefiks "$4" ($5) (trans: $6; local: $7) w interwikijowej tabeli {{GENDER:$2|změnił|změniła}}',
+ 'logentry-interwiki-iw_delete' => '$1 jo prefiks "$4" z interwikijoweje tabele {{GENDER:$2|wótpórał|wótpórała}}',
+ 'log-description-interwiki' => 'To jo protokol změnow k [[Special:Interwiki|tabeli interwiki]].',
+ 'right-interwiki' => 'Daty interwiki wobźěłaś',
+ 'action-interwiki' => 'toś ten zapisk interwiki změniś',
+);
+
+/** Ewe (eʋegbe)
+ */
+$messages['ee'] = array(
+ 'interwiki_edit' => 'Trɔ asi le eŋu',
+);
+
+/** Greek (Ελληνικά)
+ * @author Consta
+ * @author Crazymadlover
+ * @author Dead3y3
+ * @author Evropi
+ * @author Omnipaedista
+ * @author Protnet
+ * @author ZaDiak
+ */
+$messages['el'] = array(
+ 'interwiki' => 'Εμφάνιση και επεξεÏγασία δεδομένων interwiki',
+ 'interwiki-title-norights' => 'Εμφάνιση δεδομένων interwiki',
+ 'interwiki-desc' => 'ΠÏοσθέτει μια [[Special:Interwiki|ειδική σελίδα]] για την Ï€Ïοβολή και επεξεÏγασία του πίνακα interwiki',
+ 'interwiki_intro' => 'Αυτή είναι μια επισκόπηση του πίνακα interwiki.',
+ 'interwiki-legend-show' => 'Εμφάνιση υπομνήματος',
+ 'interwiki-legend-hide' => 'ΑπόκÏυψη υπομνήματος',
+ 'interwiki_prefix' => 'ΠÏόθεμα',
+ 'interwiki-prefix-label' => 'ΠÏόθεμα:',
+ 'interwiki_prefix_intro' => 'ΠÏόθεμα interwiki για χÏήση στη σÏνταξη του κώδικα wiki <code>[<nowiki />[prefix:<em>pagename</em>]]</code>.',
+ 'interwiki_url_intro' => 'ΠÏότυπο για διευθÏνσεις URL. Το σÏμβολο κÏάτησης θέσης $1 θα αντικατασταθεί από το <em>pagename</em> του βικικώδικα, όταν χÏησιμοποιείται η ανωτέÏω σÏνταξη βικικώδικα.',
+ 'interwiki_local' => 'ΠÏοώθηση',
+ 'interwiki-local-label' => 'ΠÏοώθηση:',
+ 'interwiki_local_intro' => 'Ένα αίτημα HTTP στο τοπικό wiki με αυτό το Ï€Ïόθεμα interwiki στη διεÏθυνση URL είναι:',
+ 'interwiki_local_0_intro' => 'δεν ολοκληÏώνεται, συνήθως μπλοκάÏεται από σφάλμα Ï„Ïπου "η σελίδα δεν βÏέθηκε".',
+ 'interwiki_local_1_intro' => 'ανακατευθÏνεται στη διεÏθυνση URL Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï€Î¿Ï… δίνεται στους οÏισμοÏÏ‚ συνδέσμου intewiki (δηλαδή αντιμετωπίζεται σαν αναφοÏά σε τοπικές σελίδες).',
+ 'interwiki_trans' => 'Ενσωμάτωση',
+ 'interwiki-trans-label' => 'Ενσωμάτωση:',
+ 'interwiki_trans_intro' => 'Εάν χÏησιμοποιείται η σÏνταξη κώδικα wiki <code>{<nowiki />{prefix:<em>pagename</em>}}</code>, τότε:',
+ 'interwiki_trans_1_intro' => 'να επιτÏαπεί η ενσωμάτωση από το ξένο wiki, αν επιτÏέπονται γενικά σε αυτό το wiki οι ενσωματώσεις intewiki.',
+ 'interwiki_trans_0_intro' => 'να μην επιτÏαπεί, αλλά να αναζητηθεί μια σελίδα στο χώÏο ονομάτων των Ï€ÏοτÏπων.',
+ 'interwiki_intro_footer' => 'ΑνατÏέξτε στο [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] για πεÏισσότεÏες πληÏοφοÏίες σχετικά με τον πίνακα interwiki.
+ΥπάÏχει μια [[Special:Log/interwiki|καταγÏαφή των αλλαγών]] στον πίνακα interwiki.',
+ 'interwiki_1' => 'ναι',
+ 'interwiki_0' => 'όχι',
+ 'interwiki_error' => 'Σφάλμα: Ο πίνακας interwiki είναι κενός, ή κάτι άλλο έχει πάει στÏαβά.',
+ 'interwiki-cached' => 'Τα δεδομένα interwiki έχουν αποθηκευτεί στην Ï€ÏοσωÏινή μνήμη. Δεν είναι δυνατή η Ï„Ïοποποίησή της.',
+ 'interwiki_edit' => 'ΕπεξεÏγασία',
+ 'interwiki_reasonfield' => 'Αιτία:',
+ 'interwiki_delquestion' => 'ΔιαγÏαφή του «$1»',
+ 'interwiki_deleting' => 'ΔιαγÏάφετε το Ï€Ïόθεμα «$1».',
+ 'interwiki_deleted' => 'Το Ï€Ïόθεμα «$1» αφαιÏέθηκε με επιτυχία από τον πίνακα interwiki.',
+ 'interwiki_delfailed' => 'Το Ï€Ïόθεμα «$1» δεν μποÏεί να καταÏγηθεί από τον πίνακα interwiki.',
+ 'interwiki_addtext' => 'ΠÏοσθήκη ενός Ï€Ïοθέματος interwiki',
+ 'interwiki_addintro' => 'Πάτε να Ï€Ïοσθέσετε ένα νέο Ï€Ïόθεμα interwiki.
+Îα θυμάστε ότι δεν μποÏεί να πεÏιέχει κενό διάστημα ( ), άνω και κάτω τελεία (:), σÏμβολο «και» (&) ή «ίσον» (=).',
+ 'interwiki_addbutton' => 'ΠÏοσθήκη',
+ 'interwiki_added' => 'Το Ï€Ïόθεμα «$1» Ï€Ïοστέθηκε με επιτυχία στον πίνακα interwiki.',
+ 'interwiki_addfailed' => 'Το Ï€Ïόθεμα «$1» δεν ήταν δυνατόν να Ï€Ïοστεθεί στον πίνακα interwiki.
+Πιθανώς υπάÏχει ήδη στον πίνακα interwiki.',
+ 'interwiki_edittext' => 'ΕπεξεÏγασία Ï€Ïοθέματος interwiki',
+ 'interwiki_editintro' => 'Πάτε να επεξεÏγαστείτε ένα Ï€Ïόθεμα interwiki.
+Îα θυμάστε ότι αυτό μποÏεί να καταστÏέψει τους υπάÏχοντες συνδέσμους.',
+ 'interwiki_edited' => 'Το Ï€Ïόθεμα «$1» Ï„Ïοποποιήθηκε με επιτυχία στον πίνακα interwiki.',
+ 'interwiki_editerror' => 'Το Ï€Ïόθεμα «$1» δεν μποÏεί να Ï„Ïοποποιηθεί στον πίνακα interwiki.
+Πιθανώς να μην υπάÏχει.',
+ 'interwiki-badprefix' => 'Το καθοÏισμένο Ï€Ïόθεμα interwiki «$1» πεÏιέχει μη έγκυÏους χαÏακτήÏες',
+ 'interwiki-submit-empty' => 'Το Ï€Ïόθεμα και η διεÏθυνση URL δεν μποÏεί να είναι κενά.',
+ 'interwiki-submit-invalidurl' => 'Το Ï€Ïωτόκολλο της διεÏθυνσης URL δεν είναι έγκυÏο.',
+ 'log-name-interwiki' => 'ΑÏχείο καταγÏαφής του πίνακα interwiki',
+ 'logentry-interwiki-iw_add' => '{{GENDER:$2|Ο|Η}} $1 Ï€Ïοσέθεσε το Ï€Ïόθεμα «$4» ($5) (ενσωμάτωση: $6 , τοπικό: $7) στον πίνακα interwiki',
+ 'logentry-interwiki-iw_edit' => '{{GENDER:$2|Ο|Η}} $1 Ï„Ïοποποίησε το Ï€Ïόθεμα «$4» ($5) (ενσωμάτωση: $6 , τοπικό: $7) στον πίνακα interwiki',
+ 'logentry-interwiki-iw_delete' => '{{GENDER:$2|Ο|Η}} $1 Ï€Ïοσέθεσε το Ï€Ïόθεμα «$4» από τον πίνακα interwiki',
+ 'log-description-interwiki' => 'Αυτή είναι μια καταγÏαφή αλλαγών στον [[Special:Interwiki|πίνακα interwiki]].',
+ 'right-interwiki' => 'ΕπεξεÏγασία δεδομένων interwiki',
+ 'action-interwiki' => 'αλλαγή αυτής της καταχώÏισης interwiki',
+);
+
+/** Esperanto (Esperanto)
+ * @author Michawiki
+ * @author Yekrats
+ */
+$messages['eo'] = array(
+ 'interwiki' => 'Rigardi kaj redakti intervikiajn datenojn',
+ 'interwiki-title-norights' => 'Rigardi intervikiajn datenojn',
+ 'interwiki-desc' => 'Aldonas [[Special:Interwiki|specialan paÄon]] por rigardi kaj redakti la intervikian tabelon',
+ 'interwiki_intro' => 'Tio estas superrigardo de la intervikia tabelo.',
+ 'interwiki_prefix' => 'Prefikso',
+ 'interwiki-prefix-label' => 'Prefikso:',
+ 'interwiki_local' => 'Plu',
+ 'interwiki-local-label' => 'Plu:',
+ 'interwiki_trans' => 'Transinkluzivi',
+ 'interwiki-trans-label' => 'Transinkluzivi:',
+ 'interwiki_1' => 'jes',
+ 'interwiki_0' => 'ne',
+ 'interwiki_error' => 'ERARO: La intervikia tabelo estas malplena, aÅ­ iel misfunkciis.',
+ 'interwiki_edit' => 'Redakti',
+ 'interwiki_reasonfield' => 'Kialo:',
+ 'interwiki_delquestion' => 'Forigante "$1"',
+ 'interwiki_deleting' => 'Vi forigas prefikson "$1".',
+ 'interwiki_deleted' => 'Prefikso "$1" estis sukcese forigita de la intervikia tabelo.',
+ 'interwiki_delfailed' => 'Prefikso "$1" ne eblis esti forigita el la intervikia tabelo.',
+ 'interwiki_addtext' => 'Aldonu intervikian prefikson',
+ 'interwiki_addintro' => 'Vi aldonas novan intervikian prefikson.
+Memoru ke Äi ne povas enhavi spacetojn ( ), kolojn (:), kajsignojn (&), aÅ­ egalsignojn (=).',
+ 'interwiki_addbutton' => 'Aldoni',
+ 'interwiki_added' => 'Prefikso "$1" estis sukcese aldonita al la intervikia tabelo.',
+ 'interwiki_addfailed' => 'Prefikso "$1" ne eblis esti aldonita al la intervikia tabelo.
+Eble Äi jam ekzistas en la intervikia tabelo.',
+ 'interwiki_edittext' => 'Redaktante intervikian prefikson',
+ 'interwiki_editintro' => 'Vi redaktas intervikian prefikson.
+Notu ke ĉi tiu ago povas rompi ekzistantajn ligilojn.',
+ 'interwiki_edited' => 'Prefikso "$1" estis sukcese modifita en la intervikian tabelon.',
+ 'interwiki_editerror' => 'Prefikso "$1" ne eblis esti modifita en la intervikia tabelo.
+VerÅajne Äi ne ekzistas.',
+ 'interwiki-badprefix' => 'Specifita intervika prefikso "$1" enhavas nevalidajn signojn',
+ 'log-name-interwiki' => 'Loglibro pri la intervikia tabelo',
+ 'log-description-interwiki' => 'Jen loglibro de ÅanÄoj al la [[Special:Interwiki|intervikia tabelo]].',
+ 'right-interwiki' => 'Redakti intervikiajn datenojn',
+);
+
+/** Spanish (español)
+ * @author Armando-Martin
+ * @author Crazymadlover
+ * @author Imre
+ * @author Invadinado
+ * @author Locos epraix
+ * @author Pertile
+ * @author Piolinfax
+ * @author Sanbec
+ * @author Translationista
+ * @author Vivaelcelta
+ */
+$messages['es'] = array(
+ 'interwiki' => 'Ver y editar la tabla de interwikis',
+ 'interwiki-title-norights' => 'Ver datos de interwikis',
+ 'interwiki-desc' => 'Añade una [[Special:Interwiki|página especial]] para ver y editar la tabla de interwikis',
+ 'interwiki_intro' => 'Esta es una visión general de la tabla intewiki.',
+ 'interwiki-legend-show' => 'Mostrar la leyenda',
+ 'interwiki-legend-hide' => 'Ocultar la leyenda',
+ 'interwiki_prefix' => 'Prefijo',
+ 'interwiki-prefix-label' => 'Prefijo:',
+ 'interwiki_prefix_intro' => 'Prefijo interwiki que se utilizará en sintaxis wikitexto <code>[<nowiki />[prefix:<em>pagename</em>]]</code> wikitext syntax.',
+ 'interwiki_url_intro' => 'Plantilla para URLs. El marcador $1 será reemplazado por el <em>nombre de página</em> del wikitexto cuando se use la sintaxis de wikitexto arriba mostrada.',
+ 'interwiki_local' => 'Adelante',
+ 'interwiki-local-label' => 'Adelante:',
+ 'interwiki_local_intro' => 'Una solicitud HTTP a la wiki local con este prefijo interwiki en la URL es:',
+ 'interwiki_local_0_intro' => 'no se satisfizo, normalmente bloqueado por "página no encontrada",',
+ 'interwiki_local_1_intro' => 'redirigido a la URL objetivo en las definiciones de enlaces interwiki (es decir, se la trata como a las referencias en páginas locales)',
+ 'interwiki_trans' => 'transcluir',
+ 'interwiki-trans-label' => 'Transcluir:',
+ 'interwiki_trans_intro' => 'Si se utiliza la sintaxis de wikitexto <code>{<nowiki />{prefix:<em>pagename</em>}}</code>, entonces:',
+ 'interwiki_trans_1_intro' => 'permitir la transclusión desde la wiki foránea, si las transclusiones de interwiki son por lo general permitidas en esta wiki,',
+ 'interwiki_trans_0_intro' => 'no permitirlo. En su lugar, buscar una página en el espacio de nombre de la plantilla.',
+ 'interwiki_intro_footer' => 'Para más información consulte [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] acerca de la tabla de interwiki.
+Hay un [[Special:Log/interwiki|registro de cambios]] a esta tabla de interwiki.',
+ 'interwiki_1' => 'sí',
+ 'interwiki_0' => 'no',
+ 'interwiki_error' => 'Error: La tabla de interwikis está vacía, u otra cosa salió mal.',
+ 'interwiki-cached' => 'Los datos de los interwikis se almacenan en la memoria caché. No es posible modificar la caché.',
+ 'interwiki_edit' => 'Editar',
+ 'interwiki_reasonfield' => 'Motivo:',
+ 'interwiki_delquestion' => 'Borrando «$1»',
+ 'interwiki_deleting' => 'Estás borrando el prefijo «$1».',
+ 'interwiki_deleted' => 'El prefijo «$1» ha sido borrado correctamente de la tabla de interwikis.',
+ 'interwiki_delfailed' => 'El prefijo «$1» no puede ser borrado de la tabla de interwikis.',
+ 'interwiki_addtext' => 'Añadir un prefijo interwiki',
+ 'interwiki_addintro' => "Estás añadiendo un nuevo prefijo interwiki.
+Recuerda que no puede contener espacios ( ), dos puntos (:), ni los signos ''et'' (&), o ''igual'' (=).",
+ 'interwiki_addbutton' => 'Agregar',
+ 'interwiki_added' => 'El prefijo «$1» ha sido añadido correctamente a la tabla de interwikis.',
+ 'interwiki_addfailed' => 'El prefijo «$1» no se puede añadir a la tabla de interwikis.
+Posiblemente ya exista.',
+ 'interwiki_edittext' => 'Editando un prefijo interwiki',
+ 'interwiki_editintro' => 'Estás editando un prefijo interwiki.
+Recuerda que esto puede romper enlaces existentes.',
+ 'interwiki_edited' => 'El prefijo «$1» ha sido modificado correctamente en la tabla de interwikis.',
+ 'interwiki_editerror' => 'El prefijo «$1» no puede ser modificado en la tabla de interwikis.
+Posiblemente no exista.',
+ 'interwiki-badprefix' => 'El prefijo interwiki especificado «$1» contiene caracteres no válidos',
+ 'interwiki-submit-empty' => 'El prefijo y la dirección URL no pueden estar vacías.',
+ 'interwiki-submit-invalidurl' => 'El protocolo de la dirección URL no es válido.',
+ 'log-name-interwiki' => 'Tabla de registro de interwiki',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|añadió}} el prefijo "$4" ($5) (trans: $6; local: $7) a la tabla interwiki',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|modificó}} el prefijo " $4 " ( $5 ) (trans: $6 ; local: $7 ) en la tabla interwiki',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|eliminó}} el prefijo "$4" de la tabla interwiki',
+ 'log-description-interwiki' => 'Este es un registro de los cambios hechos a la [[Special:Interwiki|tabla interwiki]].',
+ 'right-interwiki' => 'Editar datos de interwiki',
+ 'action-interwiki' => 'cambiar esta entrada interwiki',
+);
+
+/** Estonian (eesti)
+ * @author Avjoska
+ * @author Pikne
+ */
+$messages['et'] = array(
+ 'interwiki' => 'Intervikiandmete vaatamine ja muutmine',
+ 'interwiki-title-norights' => 'Intervikiandmete vaatamine',
+ 'interwiki-desc' => 'Lisab [[Special:Interwiki|erilehekülje]] intervikitabeli vaatamiseks ja muutmiseks.',
+ 'interwiki_intro' => 'See on intervikitabeli ülevaade.',
+ 'interwiki-legend-show' => 'Näita legendi',
+ 'interwiki-legend-hide' => 'Peida legend',
+ 'interwiki_prefix' => 'Eesliide',
+ 'interwiki-prefix-label' => 'Eesliide:',
+ 'interwiki_prefix_intro' => 'Eesliide, mida kasutatakse intervikilingi süntaksis <code>[<nowiki />[eesliide:<em>lehenimi</em>]]</code>.',
+ 'interwiki_url_intro' => 'Internetiaadressi mall. Kui kasutatakse ülaltoodud süntaksit, asendab kohatäidet $1 <em>lehenimi</em>.',
+ 'interwiki_local' => 'Suunatud',
+ 'interwiki-local-label' => 'Suunatud:',
+ 'interwiki_local_intro' => 'URL-veerus toodud HTTP-nõue selle interviki eesliitega kohalikku vikisse:',
+ 'interwiki_local_0_intro' => 'pole jõus, harilikult päädib teatega "lehekülge ei leitud".',
+ 'interwiki_local_1_intro' => 'on suunatud interviki määratlustes toodud sihtaadressile (st töötab nagu lingid kohalikel lehekülgedel).',
+ 'interwiki_trans' => 'Kasutamine mallina',
+ 'interwiki-trans-label' => 'Kasutamine mallina:',
+ 'interwiki_trans_intro' => 'Kui kasutatakse vikiteksti süntaksit <code>{<nowiki />{eesliide:<em>lehenimi</em>}}</code>, siis:',
+ 'interwiki_trans_1_intro' => 'võimaldatakse välisviki lehekülje kasutamist mallina, kui nii toimimine on selles vikis üldiselt lubatud.',
+ 'interwiki_trans_0_intro' => 'seda ei lubata, vaid pöördutakse malli nimeruumis asuva lehekülje poole.',
+ 'interwiki_intro_footer' => 'Lisateavet intervikitabeli kohta leiad aadressilt [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org].
+Intervikitabelis tehtud muudatused on [[Special:Log/interwiki|logis]].',
+ 'interwiki_1' => 'jah',
+ 'interwiki_0' => 'ei',
+ 'interwiki_error' => 'Tõrge: Intervikitabel on tühi või läks midagi muud viltu.',
+ 'interwiki-cached' => 'Intervikiandmed on puhvris. Puhvris olevate andmete muutmine pole võimalik.',
+ 'interwiki_edit' => 'Muutmine',
+ 'interwiki_reasonfield' => 'Põhjus:',
+ 'interwiki_delquestion' => 'Eesliite "$1" kustutamine',
+ 'interwiki_deleting' => 'Kustutad eesliidet "$1".',
+ 'interwiki_deleted' => 'Eesliide "$1" eemaldati edukalt intervikitabelist.',
+ 'interwiki_delfailed' => 'Eesliidet "$1" ei saa intervikitabelist eemaldada.',
+ 'interwiki_addtext' => 'Lisa interviki eesliide',
+ 'interwiki_addintro' => 'Lisad uut interviki eesliidet.
+Pea meeles, et see ei saa sisaldada tühikuid ( ), kooloneid (:), ja-märke (&) ega võrdusmärke (=).',
+ 'interwiki_addbutton' => 'Lisa',
+ 'interwiki_added' => 'Eesliide "$1" lisati edukalt intervikitabelisse.',
+ 'interwiki_addfailed' => 'Eesliidet "$1" ei saa intervikitabelisse lisada.
+Võimalik, et see on seal juba olemas.',
+ 'interwiki_edittext' => 'Interviki eesliite muutmine',
+ 'interwiki_editintro' => 'Muudad interviki eesliidet.
+Pea meeles, et olemasolevad lingid võivad seejuures töötamast lakata.',
+ 'interwiki_edited' => 'Eesliide "$1" muudeti edukalt intervikitabelis.',
+ 'interwiki_editerror' => 'Eesliidet "$1" ei saa intervikitabelis muuta.
+Võimalik, et seda pole olemas.',
+ 'interwiki-badprefix' => 'Määratud eesliide "$1" sisaldab sobimatuid märke.',
+ 'interwiki-submit-empty' => 'Eesliite ja URLi väljad ei saa olla tühjad.',
+ 'interwiki-submit-invalidurl' => 'Internetiaadressi protokoll on vigane.',
+ 'log-name-interwiki' => 'Intervikitabeli logi',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|lisas}} eesliite "$4" ($5) (trans: $6; local: $7) intervikitabelisse',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|muutis}} intervikitabelis eesliidet "$4" ($5) (trans: $6; local: $7)',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|eemaldas}} intervikitabelist eesliite "$4"',
+ 'log-description-interwiki' => 'See on [[Special:Interwiki|intervikitabelis]] tehtud muudatuste logi.',
+ 'right-interwiki' => 'Muuta intervikiandmeid',
+ 'action-interwiki' => 'muuta seda intervikitabeli sissekannet',
+);
+
+/** Basque (euskara)
+ * @author An13sa
+ * @author Kobazulo
+ */
+$messages['eu'] = array(
+ 'interwiki_prefix' => 'Aurrizkia',
+ 'interwiki-prefix-label' => 'Aurrizkia:',
+ 'interwiki_1' => 'bai',
+ 'interwiki_0' => 'ez',
+ 'interwiki_edit' => 'Aldatu',
+ 'interwiki_reasonfield' => 'Arrazoia:',
+ 'interwiki_delquestion' => '"$1" ezabatzen',
+ 'interwiki_deleting' => '"$1" aurrizkia ezabatzen ari zara.',
+ 'interwiki_addbutton' => 'Gehitu',
+ 'interwiki_edittext' => 'Interwiki aurrizkia editatzen',
+);
+
+/** Persian (Ùارسی)
+ * @author Ebraminio
+ * @author Hamid rostami
+ * @author Huji
+ * @author Mjbmr
+ */
+$messages['fa'] = array(
+ 'interwiki' => 'نمایش و ویرایش اطلاعات میان‌ویکی',
+ 'interwiki-title-norights' => 'مشاهدهٔ اطلاعات میان‌ویکی',
+ 'interwiki-desc' => 'یک [[Special:Interwiki|صÙحهٔ ویژه]] برای مشاهده Ùˆ ویرایش جدول میان‌ویکی می‌اÙزاید.',
+ 'interwiki_intro' => 'قمستی از اÙزونهٔ میان‌ویکی. به صورت یک مرور Ú©Ù„ÛŒ در Special:Interwiki نمایش داده شده.', # Fuzzy
+ 'interwiki_prefix' => 'پیشوند',
+ 'interwiki-prefix-label' => 'پیشوند:',
+ 'interwiki_local' => 'مشخص کردن به عنوان یک ویکی محلی', # Fuzzy
+ 'interwiki-local-label' => 'مشخص کردن به عنوان یک ویکی محلی:', # Fuzzy
+ 'interwiki_trans' => 'اجازهٔ گنجاندن میان‌ویکی را بده', # Fuzzy
+ 'interwiki-trans-label' => 'اجازهٔ گنجاندن میان‌ویکی را بده:', # Fuzzy
+ 'interwiki_intro_footer' => 'برای اطلاعات بیشتر در مورد Interwiki به [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] مراحعه نمائید.
+همچنین می‌توانید [[Special:Log/interwiki|تاریخچهٔ تغییرات]] چدول Interwiki را مشاهده کنید.',
+ 'interwiki_1' => 'بله',
+ 'interwiki_0' => 'خیر',
+ 'interwiki_error' => 'خطا: جدول میان‌ویکی خالی است، یا چیز دیگری مشکل دارد.',
+ 'interwiki_edit' => 'ویرایش',
+ 'interwiki_reasonfield' => 'دلیل:',
+ 'interwiki_delquestion' => 'حذ٠«$1»',
+ 'interwiki_deleting' => 'شما در حال حذ٠کردن پیشوند «$1» هستید.',
+ 'interwiki_deleted' => 'پیشوند «$1» با موÙقیت از جدول میان‌ویکی حذ٠شد.',
+ 'interwiki_delfailed' => 'پیشوند «$1» را نمی‌توان از جدول میان‌ویکی حذ٠کرد.',
+ 'interwiki_addtext' => 'اÙزودن یک پیشوند میان‌ویکی',
+ 'interwiki_addintro' => 'شما در حال ویرایش یک پیشوند میان‌ویکی هستید.
+توجه داشته باشید Ú©Ù‡ این پیشوند نمی‌تواند شامل Ùاصله ( )ØŒ دو نقطه (:)ØŒ علامت آمپرساند (&) یا علامت مساوی (=) باشد.',
+ 'interwiki_addbutton' => 'اÙزودن',
+ 'interwiki_added' => 'پیشوند «$1» با موÙقیت به جدول میان‌ویکی اÙزوده شد.',
+ 'interwiki_addfailed' => 'پیشوند «$1» را نمی‌توان به جدول میان‌ویکی اÙزود.
+احتمالاً این پیشوند از قبل در جدول میان‌ویکی وجود دارد.',
+ 'interwiki_edittext' => 'ویرایش یک پیشوند میان‌ویکی',
+ 'interwiki_editintro' => 'شما در حال ویرایش یک پیشوند میان‌ویکی هستید.
+توجه داشته باشید که این کار می‌تواند پیوندهای موجود را خراب کند.',
+ 'interwiki_edited' => 'پیشوند «$1» با موÙقیت در جدول میان‌ویکی تغییر داده شد.',
+ 'interwiki_editerror' => 'پیشوند «$1» را نمی‌توان در جدول میان‌ویکی تغییر داد.
+احتمالاً این پیشوند وجود ندارد.',
+ 'interwiki-badprefix' => 'پیشوند میان‌ویکی «$1» حاوی نویسه‌های غیر مجاز است',
+ 'interwiki-submit-empty' => 'پیشوند و آدرس URL نمی‌توانند خالی باشند.',
+ 'log-name-interwiki' => 'سیاههٔ جدول میان‌ویکی',
+ 'log-description-interwiki' => 'این یک تاریخچه از تغییرات [[Special:Interwiki|interwiki table]] است.',
+ 'right-interwiki' => 'ویرایش اطلاعات میان‌ویکی',
+ 'action-interwiki' => 'تغییر این مدخل میان‌ویکی',
+);
+
+/** Finnish (suomi)
+ * @author Beluga
+ * @author Crt
+ * @author Jack Phoenix
+ * @author Mobe
+ * @author Nike
+ * @author VezonThunder
+ */
+$messages['fi'] = array(
+ 'interwiki' => 'Wikienväliset linkit',
+ 'interwiki-title-norights' => 'Selaa interwiki-tietueita',
+ 'interwiki-desc' => 'Lisää [[Special:Interwiki|toimintosivun]], jonka avulla voi katsoa ja muokata interwiki-taulua.',
+ 'interwiki_intro' => 'Tämä on yleiskatsaus interwiki-taulusta.',
+ 'interwiki-legend-show' => 'Näytä selitykset',
+ 'interwiki-legend-hide' => 'Piilota selitykset',
+ 'interwiki_prefix' => 'Etuliite',
+ 'interwiki-prefix-label' => 'Etuliite:',
+ 'interwiki_local' => 'Välitä',
+ 'interwiki-local-label' => 'Välitä:',
+ 'interwiki_trans' => 'Sisällytä',
+ 'interwiki-trans-label' => 'Sisällytä:', # Fuzzy
+ 'interwiki_1' => 'kyllä',
+ 'interwiki_0' => 'ei',
+ 'interwiki_error' => 'Virhe: Interwiki-taulu on tyhjä tai jokin muu meni pieleen.',
+ 'interwiki-cached' => 'Wikienvälinen data on välimuistissa. Välimuistin muuttaminen ei ole mahdollista.',
+ 'interwiki_edit' => 'Muokkaa',
+ 'interwiki_reasonfield' => 'Syy',
+ 'interwiki_delquestion' => 'Poistetaan â€$1â€',
+ 'interwiki_deleting' => 'Olet poistamassa etuliitettä â€$1â€.',
+ 'interwiki_deleted' => 'Etuliite â€$1†poistettiin onnistuneesti interwiki-taulusta.',
+ 'interwiki_delfailed' => 'Etuliitteen â€$1†poistaminen interwiki-taulusta epäonnistui.',
+ 'interwiki_addtext' => 'Lisää wikienvälinen etuliite',
+ 'interwiki_addintro' => 'Olet lisäämässä uutta wikienvälistä etuliitettä. Se ei voi sisältää välilyöntejä ( ), kaksoispisteitä (:), et-merkkejä (&), tai yhtäsuuruusmerkkejä (=).',
+ 'interwiki_addbutton' => 'Lisää',
+ 'interwiki_added' => 'Etuliite â€$1†lisättiin onnistuneesti interwiki-tauluun.',
+ 'interwiki_addfailed' => 'Etuliitteen â€$1†lisääminen interwiki-tauluun epäonnistui. Kyseinen etuliite saattaa jo olla interwiki-taulussa.',
+ 'interwiki_edittext' => 'Muokataan interwiki-etuliitettä',
+ 'interwiki_editintro' => 'Muokkaat interwiki-etuliitettä. Muista, että tämä voi rikkoa olemassa olevia linkkejä.',
+ 'interwiki_edited' => 'Etuliitettä â€$1†muokattiin onnistuneesti interwiki-taulukossa.',
+ 'interwiki_editerror' => 'Etuliitettä â€$1†ei voi muokata interwiki-taulukossa. Sitä ei mahdollisesti ole olemassa.',
+ 'interwiki-badprefix' => 'Annettu interwiki-etuliite <code>$1</code> sisältää virheellisiä merkkejä',
+ 'interwiki-submit-empty' => 'Etuliite ja verkko-osoite eivät voi olla tyhjiä.',
+ 'log-name-interwiki' => 'Interwikitaululoki',
+ 'log-description-interwiki' => 'Tämä on loki muutoksista [[Special:Interwiki|interwiki-tauluun]].',
+ 'right-interwiki' => 'Muokata interwiki-dataa',
+ 'action-interwiki' => 'muokata tätä interwiki-merkintää',
+);
+
+/** French (français)
+ * @author Crochet.david
+ * @author DavidL
+ * @author Gomoko
+ * @author Grondin
+ * @author IAlex
+ * @author Jean-Frédéric
+ * @author Louperivois
+ * @author Purodha
+ * @author Sherbrooke
+ * @author Tititou36
+ * @author Urhixidur
+ * @author Verdy p
+ */
+$messages['fr'] = array(
+ 'interwiki' => 'Voir et manipuler les données interwiki',
+ 'interwiki-title-norights' => 'Voir les données interwiki',
+ 'interwiki-desc' => 'Ajoute une [[Special:Interwiki|page spéciale]] pour voir et modifier la table interwiki',
+ 'interwiki_intro' => 'Ceci est un aperçu de la table interwiki.',
+ 'interwiki-legend-show' => 'Afficher la légende',
+ 'interwiki-legend-hide' => 'Masquer la légende',
+ 'interwiki_prefix' => 'Préfixe',
+ 'interwiki-prefix-label' => 'Préfixe :',
+ 'interwiki_prefix_intro' => 'Préfixe interwiki à utiliser dans <code>[<nowiki />[préfixe:<em>nom de la page</em>]]</code> de la syntaxe wiki.',
+ 'interwiki-url-label' => 'URL :',
+ 'interwiki_url_intro' => 'Modèle pour les URLs. $1 sera remplacé par le <em>nom de la page</em> du wikitexte, quand la syntaxe ci-dessus est utilisée.',
+ 'interwiki_local' => 'Faire suivre',
+ 'interwiki-local-label' => 'Faire suivre :',
+ 'interwiki_local_intro' => "Une requête HTTP sur ce wiki avec ce préfixe interwiki dans l'URL sera :",
+ 'interwiki_local_0_intro' => 'rejeté, bloqué généralement par « Mauvais titre »,',
+ 'interwiki_local_1_intro' => "redirigé vers l'URL cible en fonction de la définition du préfixe interwiki (c'est-à-dire traité comme un lien dans une page du wiki)",
+ 'interwiki_trans' => 'Inclure',
+ 'interwiki-trans-label' => 'Inclure :',
+ 'interwiki_trans_intro' => 'Si la syntaxe <code>{<nowiki />{préfixe:<em>nom de la page</em>}}</code> est utilisée, alors :',
+ 'interwiki_trans_1_intro' => "l'inclusion à partir du wiki sera autorisée, si les inclusion interwiki sont autorisées dans ce wiki,",
+ 'interwiki_trans_0_intro' => "l'inclusion sera rejetée, et la page correspondante sera recherchée dans l'espace de noms « Modèle ».",
+ 'interwiki_intro_footer' => "Voyez [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] pour obtenir plus d'informations en ce qui concerne la table interwiki.
+Il existe un [[Special:Log/interwiki|journal des modifications]] de la table interwiki.",
+ 'interwiki_1' => 'oui',
+ 'interwiki_0' => 'non',
+ 'interwiki_error' => "Erreur : la table des interwikis est vide ou un processus s'est mal déroulé.",
+ 'interwiki-cached' => 'Les données interwiki sont mises en cache. Il n’est pas possible de modifier le cache.',
+ 'interwiki_edit' => 'Modifier',
+ 'interwiki_reasonfield' => 'Motif :',
+ 'interwiki_delquestion' => 'Suppression de « $1 »',
+ 'interwiki_deleting' => 'Vous effacez présentement le préfixe « $1 ».',
+ 'interwiki_deleted' => '« $1 » a été enlevé avec succès de la table interwiki.',
+ 'interwiki_delfailed' => "« $1 » n'a pas pu être enlevé de la table interwiki.",
+ 'interwiki_addtext' => 'Ajouter un préfixe interwiki',
+ 'interwiki_addintro' => "Vous êtes en train d'ajouter un préfixe interwiki. Rappelez-vous qu'il ne peut pas contenir d'espaces ( ), de deux-points (:), d'esperluettes (&) ou de signes égal (=).",
+ 'interwiki_addbutton' => 'Ajouter',
+ 'interwiki_added' => '« $1 » a été ajouté avec succès dans la table interwiki.',
+ 'interwiki_addfailed' => "« $1 » n'a pas pu être ajouté à la table interwiki.",
+ 'interwiki_edittext' => 'Modifier un préfixe interwiki',
+ 'interwiki_editintro' => 'Vous modifiez un préfixe interwiki. Rappelez-vous que cela peut casser des liens existants.',
+ 'interwiki_edited' => 'Le préfixe « $1 » a été modifié avec succès dans la table interwiki.',
+ 'interwiki_editerror' => "Le préfixe « $1 » ne peut pas être modifié. Il se peut qu'il n'existe pas.",
+ 'interwiki-badprefix' => 'Le préfixe interwiki spécifié « $1 » contient des caractères invalides',
+ 'interwiki-submit-empty' => "Le préfixe et l'URL ne peuvent être vides.",
+ 'interwiki-submit-invalidurl' => "Le protocole de l'URL n'est pas valide.",
+ 'log-name-interwiki' => 'Journal de la table interwiki',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|a ajouté}} le préfixe "$4" ($5) (trans: $6; local: $7) à la table interwiki',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|a modifié}} le préfixe "$4" ($5) (trans: $6; local: $7) dans la table interwiki',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|a supprimé}} le préfixe "$4" de la table interwiki',
+ 'log-description-interwiki' => 'Ceci est le journal des changements dans la [[Special:Interwiki|table interwiki]].',
+ 'right-interwiki' => 'Modifier les données interwiki',
+ 'action-interwiki' => 'modifier cette entrée interwiki',
+);
+
+/** Franco-Provençal (arpetan)
+ * @author Cedric31
+ * @author ChrisPtDe
+ */
+$messages['frp'] = array(
+ 'interwiki' => 'Vêre et changiér les balyês entèrvouiqui',
+ 'interwiki-title-norights' => 'Vêre les balyês entèrvouiqui',
+ 'interwiki-legend-show' => 'Fâre vêre la lègenda',
+ 'interwiki-legend-hide' => 'Cachiér la lègenda',
+ 'interwiki_prefix' => 'Prèfixo',
+ 'interwiki-prefix-label' => 'Prèfixo :',
+ 'interwiki_local' => 'Fâre siuvre',
+ 'interwiki-local-label' => 'Fâre siuvre :',
+ 'interwiki_trans' => 'Encllure',
+ 'interwiki-trans-label' => 'Encllure :',
+ 'interwiki_1' => 'ouè',
+ 'interwiki_0' => 'nan',
+ 'interwiki_edit' => 'Changiér',
+ 'interwiki_reasonfield' => 'Rêson :',
+ 'interwiki_delquestion' => 'Suprèssion de « $1 »',
+ 'interwiki_deleting' => 'Vos éte aprés suprimar lo prèfixo « $1 ».',
+ 'interwiki_addtext' => 'Apondre un prèfixo entèrvouiqui',
+ 'interwiki_addbutton' => 'Apondre',
+ 'interwiki_edittext' => 'Changiér un prèfixo entèrvouiqui',
+ 'log-name-interwiki' => 'Jornal de la trâbla entèrvouiqui',
+ 'right-interwiki' => 'Changiér les balyês entèrvouiqui',
+ 'action-interwiki' => 'changiér ceta entrâ entèrvouiqui',
+);
+
+/** Friulian (furlan)
+ * @author Klenje
+ */
+$messages['fur'] = array(
+ 'interwiki_1' => 'sì',
+ 'interwiki_0' => 'no',
+ 'interwiki_addbutton' => 'Zonte',
+);
+
+/** Western Frisian (Frysk)
+ * @author Snakesteuben
+ */
+$messages['fy'] = array(
+ 'interwiki_addbutton' => 'Tafoegje',
+);
+
+/** Irish (Gaeilge)
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['ga'] = array(
+ 'interwiki_edit' => 'Cuir in eagar',
+ 'interwiki_reasonfield' => 'Fáth:',
+);
+
+/** Galician (galego)
+ * @author Alma
+ * @author Toliño
+ * @author Xosé
+ */
+$messages['gl'] = array(
+ 'interwiki' => 'Ver e manipular datos interwiki',
+ 'interwiki-title-norights' => 'Ver os datos do interwiki',
+ 'interwiki-desc' => 'Engade unha [[Special:Interwiki|páxina especial]] para ver e editar a táboa de interwikis',
+ 'interwiki_intro' => 'Esta é unha vista xeral da táboa de interwikis.',
+ 'interwiki-legend-show' => 'Mostrar a lenda',
+ 'interwiki-legend-hide' => 'Agochar a lenda',
+ 'interwiki_prefix' => 'Prefixo',
+ 'interwiki-prefix-label' => 'Prefixo:',
+ 'interwiki_prefix_intro' => 'Prefixo interwiki a utilizar coa sintaxe de texto wiki <code>[<nowiki />[prefixo:<em>nome da páxina</em>]]</code>.',
+ 'interwiki_url' => 'URL',
+ 'interwiki-url-label' => 'URL:',
+ 'interwiki_url_intro' => 'Modelo para os enderezos URL. O marcador $1 será substituído polo <em>nome da páxina</em> do texto wiki ao usar a sintaxe do devantito texto wiki.',
+ 'interwiki_local' => 'Avanzar',
+ 'interwiki-local-label' => 'Avanzar:',
+ 'interwiki_local_intro' => 'Unha solicitude HTTP ao wiki local con este prefixo interwiki no URL é:',
+ 'interwiki_local_0_intro' => 'ignorado, normalmente bloqueado, dando unha mensaxe do tipo "A páxina non foi atopada".',
+ 'interwiki_local_1_intro' => 'redirixido cara ao enderezo URL de destino indicado na ligazón interwiki das definicións (ou sexa, serán tratadas como referencias nas páxinas locais).',
+ 'interwiki_trans' => 'Transcluír',
+ 'interwiki-trans-label' => 'Transcluír:',
+ 'interwiki_trans_intro' => 'Se se utiliza a sintaxe de texto wiki <code>{<nowiki />{prefixo:<em>nome da páxina</em>}}</code>, entón:',
+ 'interwiki_trans_1_intro' => 'permitir as transclusións a partir do wiki estranxeiro, se estas transclusións interwiki están xeralmente permitidas neste wiki.',
+ 'interwiki_trans_0_intro' => 'non permitir, e procurar a páxina no espazo de nomes "Modelo".',
+ 'interwiki_intro_footer' => 'Consulte [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] para obter máis información acerca da táboa de interwikis.
+Ademais, existe un [[Special:Log/interwiki|rexistro dos cambios]] realizados á táboa de interwikis.',
+ 'interwiki_1' => 'si',
+ 'interwiki_0' => 'non',
+ 'interwiki_error' => 'Erro: A táboa de interwikis está baleira, ou algo máis saíu mal.',
+ 'interwiki-cached' => 'Os datos sobre os interwikis almacénanse na caché. Non é posible modificar a caché.',
+ 'interwiki_edit' => 'Editar',
+ 'interwiki_reasonfield' => 'Motivo:',
+ 'interwiki_delquestion' => 'Eliminando "$1"',
+ 'interwiki_deleting' => 'Vai eliminar o prefixo "$1".',
+ 'interwiki_deleted' => 'Eliminouse sen problemas o prefixo "$1" da táboa de interwikis.',
+ 'interwiki_delfailed' => 'Non se puido eliminar o prefixo "$1" da táboa de interwikis.',
+ 'interwiki_addtext' => 'Engadir un prefixo interwiki',
+ 'interwiki_addintro' => 'Está engadindo un novo prefixo interwiki. Recorde que non pode conter espazos ( ), dous puntos (:), símbolos de unión (&) ou signos de igual (=).',
+ 'interwiki_addbutton' => 'Engadir',
+ 'interwiki_added' => 'Engadiuse sen problemas o prefixo "$1" á táboa de interwikis.',
+ 'interwiki_addfailed' => 'Non se puido engadir o prefixo "$1" á táboa de interwikis.
+Posiblemente xa existe na táboa de interwikis.',
+ 'interwiki_edittext' => 'Editando un prefixo interwiki',
+ 'interwiki_editintro' => 'Está editando un prefixo interwiki. Lembre que isto pode quebrar ligazóns existentes.',
+ 'interwiki_edited' => 'O prefixo "$1" foi modificado con éxito na táboa de interwikis.',
+ 'interwiki_editerror' => 'O prefixo "$1" non se puido modificar na táboa de interwikis. Posiblemente non existe.',
+ 'interwiki-badprefix' => 'O prefixo interwiki especificado "$1" contén caracteres inválidos',
+ 'interwiki-submit-empty' => 'O prefixo e o enderezo URL non poden quedar baleiros.',
+ 'interwiki-submit-invalidurl' => 'O protocolo do enderezo URL non é válido.',
+ 'log-name-interwiki' => 'Rexistro da táboa de interwikis',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|engadiu}} o prefixo "$4" ($5) (trans: $6; local: $7) á táboa de interwikis',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|modificou}} o prefixo "$4" ($5) (trans: $6; local: $7) na táboa de interwikis',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|eliminou}} o prefixo "$4" da táboa de interwikis',
+ 'log-description-interwiki' => 'Este é un rexistro dos cambios feitos na [[Special:Interwiki|táboa de interwikis]].',
+ 'right-interwiki' => 'Editar os datos do interwiki',
+ 'action-interwiki' => 'cambiar esta entrada de interwiki',
+);
+
+/** Gothic (Gothic)
+ * @author Jocke Pirat
+ * @author Omnipaedista
+ */
+$messages['got'] = array(
+ 'interwiki_reasonfield' => 'ð†ðŒ°ðŒ¹ð‚ðŒ¹ðŒ½ðŒ°:',
+);
+
+/** Ancient Greek (ἈÏχαία ἑλληνικὴ)
+ * @author Crazymadlover
+ * @author Omnipaedista
+ */
+$messages['grc'] = array(
+ 'interwiki' => 'ὉÏᾶν καὶ μεταγÏάφειν διαβικι-δεδομένα',
+ 'interwiki-title-norights' => 'ὉÏᾶν διαβικι-δεδομένα',
+ 'interwiki_prefix' => 'ΠÏόθεμα',
+ 'interwiki-prefix-label' => 'ΠÏόθεμα:',
+ 'interwiki_local' => 'ἈκολοÏθησις',
+ 'interwiki-local-label' => 'ἈκολοÏθησις:',
+ 'interwiki_trans' => 'ὙπεÏδιαποκλῄειν',
+ 'interwiki-trans-label' => 'ὙπεÏδιαποκλῄειν:',
+ 'interwiki_1' => 'ναί',
+ 'interwiki_0' => 'οá½',
+ 'interwiki_error' => 'Σφάλμα: Ὁ διαβικι-πίναξ κενός á¼ÏƒÏ„ίν, á¼¢ ἑτέÏα á¼ÏƒÏ†Î±Î»Î¼Î­Î½Î· á¼Î½Î­Ïγειά τι συνέβη.',
+ 'interwiki_edit' => 'ΜεταγÏάφειν',
+ 'interwiki_reasonfield' => 'Αἰτία:',
+ 'interwiki_delquestion' => 'ΔιαγÏάφειν τὴν "$1"',
+ 'interwiki_deleting' => 'ΔιαγÏάφεις τὸ Ï€Ïόθεμα "$1".',
+ 'interwiki_deleted' => 'Τὸ Ï€Ïόθεμα "$1" ἀφῃÏημένον á¼Ï€Î¹Ï„υχῶς á¼ÏƒÏ„ὶ á¼Îº τοῦ διαβικι-πίνακος.',
+ 'interwiki_delfailed' => 'Τὸ Ï€Ïόθεμα "$1" μὴ ἀφαιÏέσιμον á¼Îº τοῦ διαβικι-πίνακος ἦν.',
+ 'interwiki_addtext' => 'ΠÏοστιθέναι διαβικι-Ï€Ïόθεμά τι',
+ 'interwiki_addintro' => 'ΠÏοσθέτεις νέον διαβικι-Ï€Ïόθεμά τι.
+Οá½Îº ἔξεστί σοι χÏῆσαι κενά ( ), κόλα (:), σÏμβολα τοῦ σÏν (&), á¼¢ σÏμβολα τοῦ ἴσον (=).',
+ 'interwiki_addbutton' => 'ΠÏοστιθέναι',
+ 'interwiki_added' => 'Τὸ Ï€Ïόθεμα "$1" á¼Ï€Î¹Ï„υχῶς Ï€Ïοσετέθη Ï„á¿· διαβικι-πίνακι.',
+ 'interwiki_addfailed' => 'Τὸ Ï€Ïόθεμα "$1" οὠπÏοσετέθη Ï„á¿· διαβικι-πίνακι.
+Πιθανῶς ἤδη ὑπάÏχει á¼Î½ Ï„á¿· διαβικι-πίνακι.',
+ 'interwiki_edittext' => 'ΜεταγÏάφειν διαβικι-Ï€Ïόθεμά τι',
+ 'interwiki_editintro' => 'ΜεταγÏάφεις διαβικι-Ï€Ïόθεμά τι.
+Μέμνησο τὴν πιθανότητα καταστÏοφῆς τῶν ὑπαÏχόντων συνδέσμων.',
+ 'interwiki_edited' => 'Τὸ Ï€Ïόθεμα "$1" á¼Ï€Î¹Ï„υχῶς á¼Ï„Ïάπη á¼Î½ Ï„á¿· διαβικι-πίνακι.',
+ 'interwiki_editerror' => 'Τὸ Ï€Ïόθεμα "$1" μὴ μετατÏέψιμον á¼ÏƒÏ„ὶ á¼Î½ Ï„á¿· διαβικι-πίνακι.
+Πιθανῶς οá½Îº ἔστι.',
+ 'interwiki-badprefix' => 'Τὸ καθωÏισμένον διαβικι-Ï€Ïόθεμά "$1" πεÏιέχει ἀκÏÏους χαÏακτῆÏας',
+ 'right-interwiki' => 'ΜεταγÏάφειν διαβίκι-δεδομένα',
+);
+
+/** Swiss German (Alemannisch)
+ * @author Als-Chlämens
+ * @author Als-Holder
+ */
+$messages['gsw'] = array(
+ 'interwiki' => 'Interwiki-Date aaluege un bearbeite',
+ 'interwiki-title-norights' => 'Interwiki-Date aaluege',
+ 'interwiki-desc' => '[[Special:Interwiki|Spezialsyte]] zum Interwiki-Tabälle pfläge',
+ 'interwiki_intro' => 'Des isch e Iberblick iber d Interwiki-Tabälle.',
+ 'interwiki-legend-show' => 'Legende aazeige',
+ 'interwiki-legend-hide' => 'Legende ussblände',
+ 'interwiki_prefix' => 'Präfix',
+ 'interwiki-prefix-label' => 'Präfix:',
+ 'interwiki_prefix_intro' => 'Interwiki-Präfix, wu in dr Form <code>[<nowiki />[präfix:<em>Sytename</em>]]</code> im Wikitext cha bruucht wäre.',
+ 'interwiki_url_intro' => 'Muschter für URL. Dr Platzhalter $1 wird dur <em>Sytename</em> us dr Syntax im Wikitäxt ersetzt, wu oben gnännt wird.',
+ 'interwiki_local' => 'Wyter',
+ 'interwiki-local-label' => 'Wyter:',
+ 'interwiki_local_intro' => 'E HTTP-Aafrog an s lokal Wiki mit däm Interwiki-Präfix in dr URL wird:',
+ 'interwiki_local_0_intro' => 'nit gmacht, sundere normalerwyys mit „Syte nit gfunde“ blockiert',
+ 'interwiki_local_1_intro' => 'automatisch uf d Ziil-URL in dr Interwikigleich-Definitione wytergleitet (d. h. behandlet wie Wikigleicher uf lokali Syte)',
+ 'interwiki_trans' => 'Quer vernetze',
+ 'interwiki-trans-label' => 'Quer vernetze:',
+ 'interwiki_trans_intro' => 'Wänn Vorlagesyntax <code>{<nowiki />{präfix:<em>Sytename</em>}}</code> bruucht wird, derno:',
+ 'interwiki_trans_1_intro' => 'erlaub Yybindige vu andere Wiki, wänn Interwiki-Yybindigen in däm Wiki allgmein zuelässig sin,',
+ 'interwiki_trans_0_intro' => 'erlaub s nit, un nimm e Syte us em Vorlagenamensruum.',
+ 'interwiki_intro_footer' => 'Lueg [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] fir meh Informationen iber d Interwiki-Tabälle. S [[Special:Log/interwiki|Logbuech]] zeigt e Protokoll vu allene Änderigen an dr Interwiki-Tabälle.',
+ 'interwiki_1' => 'jo',
+ 'interwiki_0' => 'nei',
+ 'interwiki_error' => 'Fähler: D Interwiki-Tabälle isch läär.',
+ 'interwiki-cached' => 'D Interwikidatenwurden im Cache uffgno worde. D Date im Cache z ändre isch nit mögli.',
+ 'interwiki_edit' => 'Bearbeite',
+ 'interwiki_reasonfield' => 'Grund:',
+ 'interwiki_delquestion' => 'Lescht „$1“',
+ 'interwiki_deleting' => 'Du bisch am Lesche vum Präfix „$1“.',
+ 'interwiki_deleted' => '„$1“ isch mit Erfolg us dr Interwiki-Tabälle usegnuh wore.',
+ 'interwiki_delfailed' => '„$1“ het nit chenne us dr Interwiki-Tabälle glescht wäre.',
+ 'interwiki_addtext' => 'E Interwiki-Präfix zuefiege',
+ 'interwiki_addintro' => 'Du fiegsch e nej Interwiki-Präfix zue. Gib Acht, ass es kei Läärzeiche ( ), Chaufmännisch Un (&), Glyychzeiche (=) un kei Doppelpunkt (:) derf enthalte.',
+ 'interwiki_addbutton' => 'Zuefiege',
+ 'interwiki_added' => '„$1“ isch mit Erfolg dr Interwiki-Tabälle zuegfiegt wore.',
+ 'interwiki_addfailed' => '„$1“ het nit chenne dr Interwiki-Tabälle zuegfiegt wäre.',
+ 'interwiki_edittext' => 'Interwiki-Präfix bearbeite',
+ 'interwiki_editintro' => 'Du bisch am Ändere vun eme Präfix.
+Gib Acht, ass des Links cha uugiltig mache, wu s scho git.',
+ 'interwiki_edited' => 'S Präfix „$1“ isch mit Erfolg in dr Interwiki-Tabälle gänderet wore.',
+ 'interwiki_editerror' => 'S Präfix „$1“ cha in dr Interwiki-Tabälle nit gänderet wäre.
+Villicht git s es nit.',
+ 'interwiki-badprefix' => 'Im feschtgleite Interwikipräfix „$1“ het s nit giltigi Zeiche din',
+ 'interwiki-submit-empty' => 'S Präfix un d URL dürfe nit läär sy.',
+ 'log-name-interwiki' => 'Interwikitabälle-Logbuech',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|het}} s Präfix „$4“ ($5) (trans: $6; local: $7) uff de Interwikitabelle dezuegfiegt',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|het}} s Präfix „$4“ ($5) (trans: $6; local: $7) uff de Interwikitabelle gänderet',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|het}} s Präfix „$4“ uss dr Interwikitabelle ussegno',
+ 'log-description-interwiki' => 'In däm Logbuech wäre Änderige an dr [[Special:Interwiki|Interwiki-Tabälle]] protokolliert.',
+ 'right-interwiki' => 'Interwiki-Tabälle bearbeite',
+ 'action-interwiki' => 'Där Interwiki-Yytrag ändere',
+);
+
+/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @author Dineshjk
+ */
+$messages['gu'] = array(
+ 'interwiki_reasonfield' => 'કારણ:',
+);
+
+/** Manx (Gaelg)
+ * @author MacTire02
+ */
+$messages['gv'] = array(
+ 'interwiki_reasonfield' => 'Fa:',
+);
+
+/** Hausa (Hausa)
+ */
+$messages['ha'] = array(
+ 'interwiki_reasonfield' => 'Dalili:',
+);
+
+/** Hawaiian (Hawai`i)
+ * @author Kalani
+ * @author Singularity
+ */
+$messages['haw'] = array(
+ 'interwiki_edit' => 'E hoʻololi',
+ 'interwiki_reasonfield' => 'Kumu:',
+ 'interwiki_addbutton' => 'Ho‘ohui',
+);
+
+/** Hebrew (עברית)
+ * @author Agbad
+ * @author Amire80
+ * @author Rotemliss
+ * @author YaronSh
+ * @author דני×ל ב.
+ */
+$messages['he'] = array(
+ 'interwiki' => 'הצגה ועריכה של מידע על קידומות בינוויקי',
+ 'interwiki-title-norights' => 'הצגת מידע על קידומות בינוויקי',
+ 'interwiki-desc' => 'הוספת [[Special:Interwiki|דף מיוחד]] להצגה ולעריכה של מידע על קידומות בינוויקי',
+ 'interwiki_intro' => 'זוהי סקירה של טבלת קידומות בינוויקי.',
+ 'interwiki-legend-show' => 'הצגת מקר×',
+ 'interwiki-legend-hide' => 'הסתרת מקר×',
+ 'interwiki_prefix' => 'קידומת',
+ 'interwiki-prefix-label' => 'קידומת:',
+ 'interwiki_prefix_intro' => 'קידומת הבינוויקי שתשמש בתחביר <code>[<nowiki />[prefix:<em>pagename</em>]]</code>',
+ 'interwiki_url_intro' => 'תבנית עבור כתובות. ×ž×ž×œ× ×”×ž×§×•× $1 יוחלף ב־<em>pagename</em> (×©× ×”×“×£) של קוד הוויקי, ×›×שר נעשה שימוש בתחביר שהוזכר לעיל.',
+ 'interwiki_local' => 'העברה',
+ 'interwiki-local-label' => 'העברה:',
+ 'interwiki_local_intro' => 'בקשת HTTP ל×תר הוויקי המקומי ×¢× ×§×™×“×•×ž×ª בינוויקי זו בכתובת:',
+ 'interwiki_local_0_intro' => '×œ× ×ž×›×•×‘×“×ª, לרוב נחסמת ×¢× ×”×•×“×¢×ª "הדף ×œ× × ×ž×¦×",',
+ 'interwiki_local_1_intro' => 'מופנית ×ל כתובת היעד שניתנה בהגדרות קישור הבינוויקי (כלומר מטופלת כמו הפניה ×‘×“×¤×™× ×ž×§×•×ž×™×™×)',
+ 'interwiki_trans' => 'הכללה',
+ 'interwiki-trans-label' => 'הכללה:',
+ 'interwiki_trans_intro' => '×× × ×¢×©×” שימוש בתחביר <code>{<nowiki />{prefix:<em>pagename</em>}}</code>, ××–:',
+ 'interwiki_trans_1_intro' => 'תינתן ×”×פשרות להכללת ×ž×§×˜×¢×™× ×—×™×¦×•× ×™×™× ×ž×תר ויקי חיצוני, ×× ×”×›×œ×œ×•×ª מקטעי ויקי ×—×™×¦×•× ×™×™× ×ž×•×¨×©×™× ×‘×ופן כללי ב×תר ויקי ×–×”,',
+ 'interwiki_trans_0_intro' => '×ין ל×פשר ×–×ת, ×‘×ž×§×•× ×–×ת יש לחפש דף במרחב ×”×©× ×ª×‘× ×™×ª.',
+ 'interwiki_intro_footer' => 'עיינו ב־[//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] למידע נוסף על טבלת הבינוויקי.
+ישנו [[Special:Log/interwiki|יומן שינויי×]] לטבלת הבינוויקי.',
+ 'interwiki_1' => 'כן',
+ 'interwiki_0' => 'ל×',
+ 'interwiki_error' => 'שגי××”: טבלת הבינוויקי ריקה, ×ו שיש שגי××” ×חרת.',
+ 'interwiki-cached' => 'מידע בינוויקי מוטמן. שינוי המטמון ×ינו ×פשרי.',
+ 'interwiki_edit' => 'עריכה',
+ 'interwiki_reasonfield' => 'סיבה:',
+ 'interwiki_delquestion' => 'מחיקת "$1"',
+ 'interwiki_deleting' => '×”× ×›× ×ž×•×—×§×™× ×ת הקידומת "$1".',
+ 'interwiki_deleted' => 'הקידומת "$1" הוסרה בהצלחה מטבלת הבינוויקי.',
+ 'interwiki_delfailed' => '×œ× × ×™×ª×Ÿ להסיר ×ת הקידומת "$1" מטבלת הבינוויקי.',
+ 'interwiki_addtext' => 'הוספת קידומת בינוויקי',
+ 'interwiki_addintro' => '×”× ×›× ×ž×•×¡×™×¤×™× ×§×™×“×•×ž×ª בינוויקי חדשה.
+זכרו ×©×œ× × ×™×ª×Ÿ לכלול ×¨×•×•×—×™× ( ), × ×§×•×“×•×ª×™×™× (:), ×מפרסנד (&) ×ו הסימן שווה (=).',
+ 'interwiki_addbutton' => 'הוספה',
+ 'interwiki_added' => 'הקידומת "$1" נוספה בהצלחה לטבלת הבינוויקי.',
+ 'interwiki_addfailed' => '×œ× × ×™×ª×Ÿ להוסיף ×ת הקידומת "$1" לטבלת הבינוויקי.
+ייתכן ×©×”×™× ×›×‘×¨ קיימת בטבלה.',
+ 'interwiki_edittext' => 'עריכת קידומת בינוויקי',
+ 'interwiki_editintro' => '×”× ×›× ×¢×•×¨×›×™× ×§×™×“×•×ž×ª בינוויקי.
+זכרו שפעולה זו עלולה לשבור ×§×™×©×•×¨×™× ×§×™×™×ž×™×.',
+ 'interwiki_edited' => 'הקידומת "$1" שונתה בהצלחה בטבלת הבינוויקי.',
+ 'interwiki_editerror' => '×œ× × ×™×ª×Ÿ לשנות ×ת הקידומת "$1" בטבלת הבינוויקי.
+ייתכן ×©×”×™× ××™× ×” קיימת.',
+ 'interwiki-badprefix' => 'קידומת הבינוויקי שצוינה, "$1", מכילה ×ª×•×•×™× ×‘×œ×ª×™ תקיני×',
+ 'interwiki-submit-empty' => 'הקידומת והכתובת ×ינן יכולות להיות ריקות.',
+ 'interwiki-submit-invalidurl' => 'הפרוטוקול של הכתובת ×”×–×ת ×ינו תקין.',
+ 'log-name-interwiki' => 'יומן טבלת הבינוויקי',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|הוסיף|הוסיפה}} ×ת הקידומת "$4" (כתובת: $5) (הכללה: $6; מקומי: $7) לטבלת interwiki',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|שינה|שינתה}} ×ת הקידומת "$4" (כתובת: $5) (הכללה: $6; מקומי: $7) לטבלת interwiki',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|הסיר|הסירה}} ×ת הקידומת "$4" מטבלת interwiki',
+ 'log-description-interwiki' => 'זהו יומן ×”×©×™× ×•×™×™× ×©× ×¢×¨×›×• ב[[Special:Interwiki|טבלת הבינוויקי]].',
+ 'right-interwiki' => 'עריכת נתוני הבינוויקי',
+ 'action-interwiki' => 'לשנות ×ת רשומת הבינוויקי הזו',
+);
+
+/** Hindi (हिनà¥à¤¦à¥€)
+ * @author Karthi.dr
+ * @author Kaustubh
+ */
+$messages['hi'] = array(
+ 'interwiki' => 'आंतरविकि डाटा देखें à¤à¤µà¤‚ बदलें',
+ 'interwiki-title-norights' => 'आंतरविकि डाटा देखें',
+ 'interwiki-desc' => 'आंतरविकि तालिका देखनेके लिये और बदलने के लिये à¤à¤• [[Special:Interwiki|विशेष पॄषà¥à¤ ]]',
+ 'interwiki_intro' => 'आंतरविकि तालिका के बारें में अधिक ज़ानकारी के लिये [http://www.mediawiki.org/wiki/Interwiki_table MediaWiki.org] देखें। यहां आंतरविकि तालिका में हà¥à¤ [[Special:Log/interwiki|बदलावों की सूची]] हैं।', # Fuzzy
+ 'interwiki_prefix' => 'उपपद',
+ 'interwiki-prefix-label' => 'उपपद:', # Fuzzy
+ 'interwiki_1' => 'हाà¤',
+ 'interwiki_0' => 'नहीं',
+ 'interwiki_error' => 'गलती: आंतरविकि तालिका खाली हैं, या और कà¥à¤› गलत हैं।',
+ 'interwiki_edit' => 'समà¥à¤ªà¤¾à¤¦à¤¨',
+ 'interwiki_reasonfield' => 'कारण:',
+ 'interwiki_delquestion' => '$1 को हटा रहें हैं',
+ 'interwiki_deleting' => 'आप "$1" उपपद हटा रहें हैं।',
+ 'interwiki_deleted' => '"$1" उपपद आंतरविकि तालिकासे हटा दिया गया हैं।',
+ 'interwiki_delfailed' => '"$1" उपपद आंतरविकि तालिकासे हटा नहीं पा रहें हैं।',
+ 'interwiki_addtext' => 'à¤à¤• आंतरविकि उपपद दें',
+ 'interwiki_addintro' => 'आप à¤à¤• नया आंतरविकि उपपद बढा रहें हैं। कृपया धà¥à¤¯à¤¾à¤¨ रहें की इसमें सà¥à¤ªà¥‡à¤¸ ( ), विसरà¥à¤— (:), और (&), या बराबर का चिनà¥à¤¹ (=) नहीम दे सकतें हैं।',
+ 'interwiki_addbutton' => 'बढायें',
+ 'interwiki_added' => '$1" उपपद आंतरविकि तालिका में बढाया गया हैं।',
+ 'interwiki_addfailed' => '"$1" उपपद आंतरविकि तालिका में बढा नहीं पायें।
+शायद वह पहले से असà¥à¤¤à¤¿à¤¤à¥à¤µà¤®à¥‡à¤‚ हैं।',
+ 'interwiki_edittext' => 'à¤à¤• आंतरविकि उपपद बदल रहें हैं',
+ 'interwiki_editintro' => 'आप à¤à¤• आंतरविकि उपपद बदल रहें हैं। धà¥à¤¯à¤¾à¤¨ रखें ये पहले दी हà¥à¤ˆ कड़ीयों को तोड सकता हैं।',
+ 'interwiki_edited' => '"$1" उपपद आंतरविकि तालिका में बदला गया।',
+ 'interwiki_editerror' => '"$1" उपपद आंतरविकि तालिका में बदल नहीं पायें। शायद वह असà¥à¤¤à¤¿à¤¤à¥à¤µà¤®à¥‡à¤‚ नहीं हैं।',
+ 'log-name-interwiki' => 'आंतरविकि तालिका सूची',
+ 'log-description-interwiki' => '[[Special:Interwiki|आंतरविकि तालिकामें]] हà¥à¤ बदलावोंकी यह सूची है।',
+);
+
+/** Hiligaynon (Ilonggo)
+ * @author Jose77
+ */
+$messages['hil'] = array(
+ 'interwiki_reasonfield' => 'Rason:',
+);
+
+/** Croatian (hrvatski)
+ * @author Dalibor Bosits
+ * @author Ex13
+ * @author Roberta F.
+ * @author SpeedyGonsales
+ */
+$messages['hr'] = array(
+ 'interwiki' => 'Vidi i uredi međuwiki podatke',
+ 'interwiki-title-norights' => 'Gledanje interwiki tablice',
+ 'interwiki-desc' => 'Dodaje [[Special:Interwiki|posebnu stranicu]] za gledanje i uređivanje interwiki tablice',
+ 'interwiki_intro' => 'Ovo je pregled međuwiki tablice.',
+ 'interwiki_prefix' => 'Prefiks',
+ 'interwiki-prefix-label' => 'Prefiks:',
+ 'interwiki_prefix_intro' => 'Međuwiki prefiks koji će se rabiti u <code>[<nowiki />[prefix:<em>pagename</em>]]</code> wikitekst sintaksi.',
+ 'interwiki_url_intro' => 'Predložak za URL-ove. Varijabla $1 biti će zamijenjena s <em>pagename</em> u wikitekst, kad će navedena wikitekst sintaksa biti rabljena.',
+ 'interwiki_local' => 'Proslijedi',
+ 'interwiki-local-label' => 'Proslijedi:',
+ 'interwiki_trans' => 'Transkludiraj',
+ 'interwiki-trans-label' => 'UkljuÄi:',
+ 'interwiki_1' => 'da',
+ 'interwiki_0' => 'ne',
+ 'interwiki_error' => 'POGRJEŠKA: Interwiki tablica je prazna, ili je nešto drugo neispravno.',
+ 'interwiki_edit' => 'Uredi',
+ 'interwiki_reasonfield' => 'Razlog:',
+ 'interwiki_delquestion' => 'Brišem "$1"',
+ 'interwiki_deleting' => 'Brišete prefiks "$1".',
+ 'interwiki_deleted' => 'Prefiks "$1" je uspješno uklonjen iz interwiki tablice.',
+ 'interwiki_delfailed' => 'Prefiks "$1" nije mogao biti uklonjen iz interwiki tablice.',
+ 'interwiki_addtext' => 'Dodaj međuwiki prefiks',
+ 'interwiki_addintro' => 'UreÄ‘ujete novi interwiki prefiks. Upamtite, prefiks ne može sadržavati prazno mjesto ( ), dvotoÄku (:), znak za i (&), ili znakove jednakosti (=).',
+ 'interwiki_addbutton' => 'Dodaj',
+ 'interwiki_added' => 'Prefiks "$1" je uspješno dodan u interwiki tablicu.',
+ 'interwiki_addfailed' => 'Prefiks "$1" nije mogao biti dodan u interwiki tablicu. Vjerojatno već postoji u interwiki tablici.',
+ 'interwiki_edittext' => 'Uređivanje interwiki prefiksa',
+ 'interwiki_editintro' => 'Uređujete interwiki prefiks. Ovo može oštetiti postojeće poveznice.',
+ 'interwiki_edited' => 'Prefiks "$1" je uspješno promijenjen u interwiki tablici.',
+ 'interwiki_editerror' => 'Prefiks "$1" ne može biti promijenjen u interwiki tablici. Vjerojatno ne postoji.',
+ 'interwiki-badprefix' => 'Određeni međuwiki prefiks "$1" sadrži nedozvoljene znakove',
+ 'log-name-interwiki' => 'Evidencije interwiki tablice',
+ 'log-description-interwiki' => 'Ovo su evidencije promjena na [[Special:Interwiki|interwiki tablici]].',
+ 'right-interwiki' => 'Uređivanje interwiki podataka',
+ 'action-interwiki' => 'uredi ovaj međuwiki zapis',
+);
+
+/** Upper Sorbian (hornjoserbsce)
+ * @author Michawiki
+ */
+$messages['hsb'] = array(
+ 'interwiki' => 'Interwiki-daty wobhladać a změnić',
+ 'interwiki-title-norights' => 'Daty interwiki wobhladać',
+ 'interwiki-desc' => 'Přidawa [[Special:Interwiki|specialnu stronu]] za wobhladowanje a wobdźěłowanje interwiki-tabele',
+ 'interwiki_intro' => 'Tutón je přehlad tabele interwiki.',
+ 'interwiki-legend-show' => 'Legendu pokazać',
+ 'interwiki-legend-hide' => 'Legendu schować',
+ 'interwiki_prefix' => 'Prefiks',
+ 'interwiki-prefix-label' => 'Prefiks:',
+ 'interwiki_prefix_intro' => 'Prefiks interwiki, kotryž ma so we wikitekstowej syntaksy <code>[<nowiki />[prefix:<em>pagename</em>]]</code> wužiwać.',
+ 'interwiki-url-label' => 'URL:',
+ 'interwiki_url_intro' => 'Předłoha za URL. Zastupne znamjěsko $1 naruna so přez <em>mjeno strony</em> wikijoweho teksta, hdyž so horjeka naspomnjena wikitekstowa syntaksa wužiwa.',
+ 'interwiki_local' => 'Doprědka',
+ 'interwiki-local-label' => 'Doprědka:',
+ 'interwiki_local_intro' => 'Naprašowanje http do lokalneho wiki z tutym prefiksom interwiki w URL je:',
+ 'interwiki_local_0_intro' => 'njepřipóznaty, zwjetša přez "strona njenamakana" zablokowany',
+ 'interwiki_local_1_intro' => 'K cilowemu URL w definicijach wotkaza interwiki dale sposrědkowany (t. j. wobchadźa so z tym kaž z referencami w lokalnych stronach)',
+ 'interwiki_trans' => 'Transkludować',
+ 'interwiki-trans-label' => 'Transkludować:',
+ 'interwiki_trans_intro' => 'Jeli je so wikijowa syntaksa <code>{<nowiki />{prefix:<em>pagename</em>}}</code> wužiwa, to:',
+ 'interwiki_trans_1_intro' => 'Zapřijeće z cuzeho wikija dowolić, jeli zapřijeća interwiki so powšitkownje w tutym wikiju dopušćeja,',
+ 'interwiki_trans_0_intro' => 'je njedowolić, pohladaj skerje za stronu w mjenowym rumje Předłoha',
+ 'interwiki_intro_footer' => 'Hlej [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] za dalše informacije wo tabeli interwikijow.
+Je [[Special:Log/interwiki|protokol změnow]] tabele interwikijow.',
+ 'interwiki_1' => 'haj',
+ 'interwiki_0' => 'nÄ›',
+ 'interwiki_error' => 'ZMYLK: Interwiki-tabela je prózdna abo něšto je wopak.',
+ 'interwiki-cached' => 'Interwikijowe daty su pufrowane. Njeje móžno pufrowak změnić.',
+ 'interwiki_edit' => 'Wobdźěłać',
+ 'interwiki_reasonfield' => 'PÅ™iÄina:',
+ 'interwiki_delquestion' => 'Wušmórnja so "$1"',
+ 'interwiki_deleting' => 'Wušmórnješ prefiks "$1".',
+ 'interwiki_deleted' => 'Prefiks "$1" je so wuspěšnje z interwiki-tabele wotstronił.',
+ 'interwiki_delfailed' => 'Prefiks "$1" njeda so z interwiki-tabele wotstronić.',
+ 'interwiki_addtext' => 'Interwiki-prefiks přidać',
+ 'interwiki_addintro' => 'Přidawaš nowy prefiks interwiki. Wobkedźbuj, zo njesmě mjezery ( ), dwudypki (.), et-znamješka (&) abo znaki runosće (=) wobsahować.',
+ 'interwiki_addbutton' => 'Přidać',
+ 'interwiki_added' => 'Prefiks "$1" je so wuspěšnje interwiki-tabeli přidał.',
+ 'interwiki_addfailed' => 'Prefiks "$1" njeda so interwiki-tabeli přidać. Snano eksistuje hižo w interwiki-tabeli.',
+ 'interwiki_edittext' => 'Prefiks interwiki wobdźěłać',
+ 'interwiki_editintro' => 'Wobdźěłuješ prefiks interwiki.
+Wobkedźbuj, zo to móže eksistowace wotkazy skóncować.',
+ 'interwiki_edited' => 'Prefiks "$1" je so wuspěšnje w tabeli interwiki změnil.',
+ 'interwiki_editerror' => 'Prefiks "$1" njeda so w tabeli interwiki změnić.
+Snano njeeksistuje.',
+ 'interwiki-badprefix' => 'Podaty prefiks interwiki "$1" wobsahuje njepłaćiwe znamješka',
+ 'interwiki-submit-empty' => 'Prefiks a URL njesmětej pródznej być.',
+ 'interwiki-submit-invalidurl' => 'URL-protokol je njepłaćiwy.',
+ 'log-name-interwiki' => 'Protokol interwiki-tabele',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|přida}} prefiks "$4" ($5) (trans: $6; local: $7) interwikijowej tabeli',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|změni}} prefiks "$4" ($5) (trans: $6; local: $7) w interwikijowej tabeli',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|wotstroni}} prefiks "$4" z interwikijoweje tabele',
+ 'log-description-interwiki' => 'To je protokol změnow na [[Special:Interwiki|interwiki-tabeli]].',
+ 'right-interwiki' => 'Daty interwiki wobdźěłać',
+ 'action-interwiki' => 'tutón zapisk interwiki změnić',
+);
+
+/** Haitian (Kreyòl ayisyen)
+ * @author Boukman
+ * @author Jvm
+ * @author Masterches
+ */
+$messages['ht'] = array(
+ 'interwiki' => 'Wè epi modifye enfòmasyon entèwiki yo',
+ 'interwiki-title-norights' => 'Wè enfòmasyon entèwiki',
+ 'interwiki-desc' => 'Ajoute yon [[Special:Interwiki|paj espesyal]] pou wè ak modifye tablo entèwiki a',
+ 'interwiki_intro' => 'Sa se yon kout je sou tablo entèwiki a.',
+ 'interwiki_prefix' => 'Prefiks',
+ 'interwiki-prefix-label' => 'Prefiks:',
+ 'interwiki_error' => 'ERÈ: Tablo entèwiki a vid, oubyen yon lòt bagay pa t mache.',
+ 'interwiki_reasonfield' => 'Rezon:',
+ 'interwiki_delquestion' => 'Efase "$1"',
+ 'interwiki_deleting' => 'W ap efase prefiks "$1".',
+ 'interwiki_deleted' => 'Prefiks "$1" te reyisi retire nan tablo entèwiki a.',
+ 'interwiki_delfailed' => 'Prefiks "$1" pa t kapab retire nan tablo entèwiki a.',
+ 'interwiki_addtext' => 'Ajoute yon prefiks entèwiki',
+ 'interwiki_addintro' => 'W ap ajoute yon nouvo prefiks entèwiki.
+Sonje ke li pa ka genyen ladan li espace ( ), de pwen (:), anmpèsand (&), ou sign egalite (=).',
+ 'interwiki_addbutton' => 'Ajoute',
+ 'interwiki_added' => 'Prefiks "$1" te reyisi ajoute nan tablo entèwiki a.',
+ 'interwiki_addfailed' => 'Prefiks "$1" pa t kapab ajoute nan tablo entèwiki a.
+Gendwa se paske li deja ekziste nan tablo entèwiki a.',
+ 'interwiki_edittext' => 'Modifye yon prefiks entèwiki',
+ 'interwiki_editintro' => 'W ap modifye yon prefiks entèwiki.
+Sonje ke sa gendwa kraze lyen ki deja ekziste yo.',
+ 'interwiki_edited' => 'Prefiks "$1" te reyisi modifye nan tablo entèwiki a.',
+ 'interwiki_editerror' => 'Prefiks "$1" pa ka modifye nan tablo entèwiki a.
+Petèt li pa ekziste.',
+ 'log-name-interwiki' => 'Jounal tablo entèwiki a',
+ 'log-description-interwiki' => 'Sa se yon jounal pou chanjman yo nan [[Special:Interwiki|tablo entèwiki a]].',
+);
+
+/** Hungarian (magyar)
+ * @author BáthoryPéter
+ * @author Dani
+ * @author Dj
+ * @author Glanthor Reviol
+ * @author Gondnok
+ */
+$messages['hu'] = array(
+ 'interwiki' => 'Wikiközi hivatkozások adatainak megtekintése és szerkesztése',
+ 'interwiki-title-norights' => 'Wikiközi hivatkozások adatainak megtekintése',
+ 'interwiki-desc' => '[[Special:Interwiki|Speciális lap]], ahol megtekinthető és szerkeszthető a wikiközi hivatkozások táblája',
+ 'interwiki_intro' => 'Ez egy áttekintés a wikiközi hivatkozások táblájáról.',
+ 'interwiki-legend-show' => 'Jelmagyarázat',
+ 'interwiki-legend-hide' => 'Jelmagyarázat elrejtése',
+ 'interwiki_prefix' => 'Előtag',
+ 'interwiki-prefix-label' => 'Előtag:',
+ 'interwiki_prefix_intro' => 'Wikiközi előtag az <code>[<nowiki />[előtag:<em>lapnév</em>]]</code> wikiszöveg szintaxisban való használatra.',
+ 'interwiki_url_intro' => 'Sablon az URL-eknek. A(z) $1 helyfoglalót le fogja cserélni a wikiszöveg <em>lapneve</em>, a fent említett wikiszöveg használata esetén.',
+ 'interwiki_local' => 'Továbbítás',
+ 'interwiki-local-label' => 'Továbbítás:',
+ 'interwiki_local_intro' => 'Egy HTTP kérés a helyi wikihez ezzel a wikiközi előtaggal az URL-ben:',
+ 'interwiki_local_0_intro' => 'nem teljesül, általában blokkolja a „lap nem találhatóâ€,',
+ 'interwiki_local_1_intro' => 'átirányítva a wikiközi hivatkozások definícióiban megadott cél URL-re (azaz olyan, mint a hivatkozások a helyi lapokon)',
+ 'interwiki_trans' => 'Wikiközi beillesztés',
+ 'interwiki-trans-label' => 'Wikiközi beillesztés:',
+ 'interwiki_trans_intro' => 'Ha az <code>{<nowiki />{előtag:<em>lapnév</em>}}</code> wikiszöveg szintaxist használjuk, akkor:',
+ 'interwiki_trans_1_intro' => 'engedd a beillesztést az idegen wikiről, ha a wikiközi beillesztések általában megengedettek ezen a wikin,',
+ 'interwiki_trans_0_intro' => 'ne engedd, inkább keress egy lapot a sablon névtérben.',
+ 'interwiki_intro_footer' => 'Az interwiki-táblázattal kapcsolatban további információkat a [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org]-on olvashatsz. Az interwiki-táblázat módosításai [[Special:Log/interwiki|naplózva]] vannak.',
+ 'interwiki_1' => 'igen',
+ 'interwiki_0' => 'nem',
+ 'interwiki_error' => 'Hiba: A wikiközi hivatkozások táblája üres, vagy valami más romlott el.',
+ 'interwiki-cached' => 'Az interwiki adatok gyorsítótárazva vannak. A gyorsítótár módosítása nem lehetséges.',
+ 'interwiki_edit' => 'Szerkesztés',
+ 'interwiki_reasonfield' => 'Indoklás:',
+ 'interwiki_delquestion' => '„$1†törlése',
+ 'interwiki_deleting' => 'A(z) „$1†előtag törlésére készülsz.',
+ 'interwiki_deleted' => 'A(z) „$1†előtagot sikeresen eltávolítottam a wikiközi hivatkozások táblájából.',
+ 'interwiki_delfailed' => 'A(z) „$1†előtagot nem sikerült eltávolítanom a wikiközi hivatkozások táblájából.',
+ 'interwiki_addtext' => 'Wikiközi hivatkozás előtag hozzáadása',
+ 'interwiki_addintro' => 'Új wikiközi hivatkozás előtag hozzáadására készülsz. Ügyelj arra, hogy ne tartalmazzon szóközt ( ), kettőspontot (:), és- (&), vagy egyenlő (=) jeleket.',
+ 'interwiki_addbutton' => 'Hozzáadás',
+ 'interwiki_added' => 'A(z) „$1†előtagot sikeresen hozzáadtam az wikiközi hivatkozások táblájához.',
+ 'interwiki_addfailed' => 'A(z) „$1†előtagot nem tudtam hozzáadni a wikiközi hivatkozások táblájához. Valószínűleg már létezik.',
+ 'interwiki_edittext' => 'Wikiközi hivatkozás előtagjának módosítása',
+ 'interwiki_editintro' => 'Egy wikiközi hivatkozás előtagját akarod módosítani.
+Ne feledd, hogy ez működésképtelenné teheti a már létező hivatkozásokat!',
+ 'interwiki_edited' => 'A „$1†előtagot sikeresen módosítottad a wikiközi hivatkozások táblájában.',
+ 'interwiki_editerror' => 'A(z) „$1†előtagot nem lehet módosítani a wikiközi hivatkozások táblájában.
+Valószínűleg nem létezik ilyen előtag.',
+ 'interwiki-badprefix' => 'A wikiközi hivatkozásnak megadott „$1†előtag érvénytelen karaktereket tartalmaz',
+ 'interwiki-submit-empty' => 'Az előtag és az URL nem lehet üres.',
+ 'interwiki-submit-invalidurl' => 'Az URL protokoll része érvénytelen.',
+ 'log-name-interwiki' => 'Interwiki tábla-napló',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|hozzáadta}} a(z) "$4" előtagot ($5) (trans: $6; helyi: $7) az interwiki táblához',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|módosította}} a(z) "$4" előtagot ($5) (trans: $6; helyi: $7) az interwiki táblában',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|törölte}} a(z) "$4" előtagot az interwiki táblából',
+ 'log-description-interwiki' => 'Ez az [[Special:Interwiki|interwiki táblában]] történt változások naplója.',
+ 'right-interwiki' => 'wikiközi hivatkozások módosítása',
+ 'action-interwiki' => 'eme wikiközi bejegyzés megváltoztatása',
+);
+
+/** Armenian (Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶)
+ * @author Vadgt
+ */
+$messages['hy'] = array(
+ 'interwiki' => 'Ô´Õ«Õ¿Õ¥Õ¬ Ö‡ ÖƒÕ¸Õ­Õ¥Õ¬ Õ«Õ¶Õ©Õ¥Ö€Õ¾Õ«Ö„Õ«ÕµÕ« Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨',
+);
+
+/** Interlingua (interlingua)
+ * @author McDutchie
+ */
+$messages['ia'] = array(
+ 'interwiki' => 'Vider e modificar datos interwiki',
+ 'interwiki-title-norights' => 'Vider datos interwiki',
+ 'interwiki-desc' => 'Adde un [[Special:Interwiki|pagina special]] pro vider e modificar le tabella interwiki',
+ 'interwiki_intro' => 'Isto es un summario del tabella interwiki.',
+ 'interwiki-legend-show' => 'Monstrar legenda',
+ 'interwiki-legend-hide' => 'Celar legenda',
+ 'interwiki_prefix' => 'Prefixo',
+ 'interwiki-prefix-label' => 'Prefixo:',
+ 'interwiki_prefix_intro' => 'Prefixo interwiki pro usar in le syntaxe de wikitexto <code>[<nowiki />[prefixo:<em>nomine de pagina</em>]]</code>.',
+ 'interwiki-url-label' => 'URL:',
+ 'interwiki_url_intro' => 'Patrono pro adresses URL. Le marcator $1 essera reimplaciate per le <em>nomine de pagina</em> del wikitexto, quando le syntaxe de wikitexto supra mentionate es usate.',
+ 'interwiki_local' => 'Facer sequer',
+ 'interwiki-local-label' => 'Facer sequer:',
+ 'interwiki_local_intro' => 'Un requesta HTTP al wiki local con iste prefixo interwiki in le adresse URL es:',
+ 'interwiki_local_0_intro' => 'refusate, normalmente blocate con "pagina non trovate",',
+ 'interwiki_local_1_intro' => 'redirigite verso le adresse URL de destination specificate in le definitiones de ligamines interwiki (i.e. tractate como referentias in paginas local)',
+ 'interwiki_trans' => 'Transcluder',
+ 'interwiki-trans-label' => 'Transcluder:',
+ 'interwiki_trans_intro' => 'Si le syntaxe de wikitexto <code>{<nowiki />{prefixo:<em>nomine de pagina</em>}}</code> es usate, alora:',
+ 'interwiki_trans_1_intro' => 'permitte le transclusion ab le wiki externe, si le transclusiones interwiki es generalmente permittite in iste wiki,',
+ 'interwiki_trans_0_intro' => 'non permitte lo, ma cerca un pagina in le spatio de nomines "Patrono".',
+ 'interwiki_intro_footer' => 'Vide [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] pro plus informationes super le tabella interwiki.
+Existe un [[Special:Log/interwiki|registro de modificationes]] al tabella interwiki.',
+ 'interwiki_1' => 'si',
+ 'interwiki_0' => 'no',
+ 'interwiki_error' => 'Error: Le tabella interwiki es vacue, o un altere cosa faceva falta.',
+ 'interwiki-cached' => 'Le datos interwiki es in cache. Non es possibile modificar le cache.',
+ 'interwiki_edit' => 'Modificar',
+ 'interwiki_reasonfield' => 'Motivo:',
+ 'interwiki_delquestion' => 'Deletion de "$1"',
+ 'interwiki_deleting' => 'Tu sta super le puncto de deler le prefixo "$1".',
+ 'interwiki_deleted' => 'Le prefixo "$1" ha essite removite del tabella interwiki con successo.',
+ 'interwiki_delfailed' => 'Le prefixo "$1" non poteva esser removite del tabella interwiki.',
+ 'interwiki_addtext' => 'Adder un prefixo interwiki',
+ 'interwiki_addintro' => 'Tu sta super le puncto de adder un nove prefixo interwiki.
+Memora que illo non pote continer spatios (&nbsp;), duo punctos (:), signos et (&), o signos equal (=).',
+ 'interwiki_addbutton' => 'Adder',
+ 'interwiki_added' => 'Le prefixo "$1" ha essite addite al tabella interwiki con successo.',
+ 'interwiki_addfailed' => 'Le prefixo "$1" non poteva esser addite al tabella interwiki.
+Es possibile que illo ja existe in le tabella interwiki.',
+ 'interwiki_edittext' => 'Modificar un prefixo interwiki',
+ 'interwiki_editintro' => 'Tu modifica un prefixo interwiki.
+Memora que isto pote rumper ligamines existente.',
+ 'interwiki_edited' => 'Le prefixo "$1" ha essite modificate in le tabella interwiki con successo.',
+ 'interwiki_editerror' => 'Le prefixo "$1" non pote esser modificate in le tabella interwiki.
+Es possibile que illo non existe.',
+ 'interwiki-badprefix' => 'Le prefixo interwiki specificate "$1" contine characteres invalide',
+ 'interwiki-submit-empty' => 'Le prefixo e le URL non pote esser vacue.',
+ 'log-name-interwiki' => 'Registro del tabella interwiki',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|addeva}} le prefixo "$4" ($5) (trans: $6; local: $7) al tabella interwiki',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|modificava}} le prefixo "$4" ($5) (trans: $6; local: $7) in le tabella interwiki',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|removeva}} le prefixo "$4" del tabella interwiki',
+ 'log-description-interwiki' => 'Isto es un registro de modificationes in le [[Special:Interwiki|tabella interwiki]].',
+ 'right-interwiki' => 'Modificar datos interwiki',
+ 'action-interwiki' => 'alterar iste entrata interwiki',
+);
+
+/** Indonesian (Bahasa Indonesia)
+ * @author Bennylin
+ * @author Farras
+ * @author Irwangatot
+ * @author IvanLanin
+ * @author Kenrick95
+ * @author Rex
+ */
+$messages['id'] = array(
+ 'interwiki' => 'Lihat dan sunting data interwiki',
+ 'interwiki-title-norights' => 'Lihat data interwiki',
+ 'interwiki-desc' => 'Menambahkan sebuah [[Special:Interwiki|halaman istimewa]] untuk menampilkan dan menyunting tabel interwiki',
+ 'interwiki_intro' => 'Ini adalah sebuah laporan mengenai tabel interwiki.',
+ 'interwiki-legend-show' => 'Tampilkan legenda',
+ 'interwiki-legend-hide' => 'Sembunyikan legenda',
+ 'interwiki_prefix' => 'Prefiks',
+ 'interwiki-prefix-label' => 'Prefiks:',
+ 'interwiki_prefix_intro' => 'Interwiki prefix akan digunakan dalam <code>[<nowiki />[prefix:<em>pagename</em>]]</code> sintak teksWiki',
+ 'interwiki_url_intro' => 'Template untuk URL. Tempat $1 akan digantikan oleh <em>judul</em> dari teksWiki, ketika sintaks teksWiki tersebut di atas digunakan.',
+ 'interwiki_local' => 'Meneruskan',
+ 'interwiki-local-label' => 'Meneruskan:',
+ 'interwiki_local_intro' => 'Diperlukan HTTP untuk wiki lokal dengan prefix interwiki ini dalam URL:',
+ 'interwiki_local_0_intro' => 'tidak dihormati, biasanya diblokir oleh "halaman tidak ditemukan",',
+ 'interwiki_local_1_intro' => 'pengalihan ke URL target akan meberikan definis pranala interwiki (contoh. seperti referensi di halaman lokal)',
+ 'interwiki_trans' => 'Transklusi',
+ 'interwiki-trans-label' => 'Mentransklusikan:',
+ 'interwiki_trans_intro' => 'Jika sintak tekswiki <code>{<nowiki />{prefix:<em>pagename</em>}}</code> digunakan, maka:',
+ 'interwiki_trans_1_intro' => 'memperbolehkan transklusi dari wiki lain, jika transklusi interwiki diizinkan di wiki ini,',
+ 'interwiki_trans_0_intro' => 'tidak mengizinkan hal itu, lebih baik mencari halaman pada ruang nama templat.',
+ 'interwiki_intro_footer' => 'Lihat [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] untuk informasi lebih lanjut tentang tabel interwiki.
+Ada [[Special:Log/interwiki|log perubahan]] ke tabel interwiki.',
+ 'interwiki_1' => 'ya',
+ 'interwiki_0' => 'tidak',
+ 'interwiki_error' => 'KESALAHAN: Tabel interwiki kosong, atau terjadi kesalahan lain.',
+ 'interwiki-cached' => 'Data interwiki ditembolokkan. Tidak mungkin memodifikasi tembolok.',
+ 'interwiki_edit' => 'Sunting',
+ 'interwiki_reasonfield' => 'Alasan:',
+ 'interwiki_delquestion' => 'Menghapus "$1"',
+ 'interwiki_deleting' => 'Anda menghapus prefiks "$1".',
+ 'interwiki_deleted' => 'Prefiks "$1" berhasil dihapus dari tabel interwiki.',
+ 'interwiki_delfailed' => 'Prefiks "$1" tidak dapat dihapuskan dari tabel interwiki.',
+ 'interwiki_addtext' => 'Menambahkan sebuah prefiks interwiki',
+ 'interwiki_addintro' => 'Anda akan menambahkan sebuah prefiks interwiki.
+Ingat bahwa prefiks tidak boleh mengandung tanda spasi ( ), titik dua (:), lambang dan (&), atau tanda sama dengan (=).',
+ 'interwiki_addbutton' => 'Tambahkan',
+ 'interwiki_added' => 'Prefiks "$1" berhasil ditambahkan ke tabel interwiki.',
+ 'interwiki_addfailed' => 'Prefiks "$1" tidak dapat ditambahkan ke tabel interwiki. Kemungkinan dikarenakan prefiks ini telah ada di tabel interwiki.',
+ 'interwiki_edittext' => 'Menyunting sebuah prefiks interwiki',
+ 'interwiki_editintro' => 'Anda sedang menyunting sebuah prefiks interwiki.
+Ingat bahwa tindakan ini dapat mempengaruhi pranala yang telah eksis.',
+ 'interwiki_edited' => 'Prefiks "$1" berhasil diubah di tabel interwiki.',
+ 'interwiki_editerror' => 'Prefiks "$1" tidak dapat diubah di tabel interwiki.
+Kemungkinan karena prefiks ini tidak ada.',
+ 'interwiki-badprefix' => 'Ditentukan interwiki awalan "$1" mengandung karakter yang tidak sah',
+ 'interwiki-submit-empty' => 'Prefiks dan URL tidak boleh kosong.',
+ 'interwiki-submit-invalidurl' => 'Protokol URL tidak sah.',
+ 'log-name-interwiki' => 'Log tabel interwiki',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|menambahkan}} prefiks "$4" ($5) (trans: $6; lokal: $7) ke tabel interwiki',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|memodifikasi}} prefiks "$4" ($5) (trans: $6; lokal: $7) ke tabel interwiki',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|menghapus}} prefiks "$4" ke tabel interwiki',
+ 'log-description-interwiki' => 'Ini adalah log perubahan [[Special:Interwiki|tabel interwiki]].',
+ 'right-interwiki' => 'Menyunting data interwiki',
+ 'action-interwiki' => 'Ubah masukan untuk interwiki ini',
+);
+
+/** Igbo (Igbo)
+ * @author Ukabia
+ */
+$messages['ig'] = array(
+ 'interwiki_edit' => 'Mèzi',
+ 'interwiki_reasonfield' => 'Mgbághapụtà:',
+);
+
+/** Eastern Canadian (Latin script) (inuktitut)
+ */
+$messages['ike-latn'] = array(
+ 'interwiki_edit' => 'Suqusiqpaa',
+);
+
+/** Ido (Ido)
+ * @author Malafaya
+ */
+$messages['io'] = array(
+ 'interwiki_1' => 'yes',
+);
+
+/** Icelandic (íslenska)
+ * @author S.Örvarr.S
+ */
+$messages['is'] = array(
+ 'interwiki_1' => 'já',
+ 'interwiki_0' => 'nei',
+ 'interwiki_edit' => 'Breyta',
+ 'interwiki_reasonfield' => 'Ãstæða:',
+ 'interwiki_addbutton' => 'Bæta við',
+);
+
+/** Italian (italiano)
+ * @author Beta16
+ * @author BrokenArrow
+ * @author Cruccone
+ * @author Darth Kule
+ * @author OrbiliusMagister
+ * @author Pietrodn
+ * @author VittGam
+ */
+$messages['it'] = array(
+ 'interwiki' => 'Visualizza e modifica i dati interwiki',
+ 'interwiki-title-norights' => 'Visualizza i dati interwiki',
+ 'interwiki-desc' => 'Aggiunge una [[Special:Interwiki|pagina speciale]] per visualizzare e modificare la tabella degli interwiki',
+ 'interwiki_intro' => 'Questa è una panoramica della tabella degli interwiki.',
+ 'interwiki-legend-show' => 'Mostra legenda',
+ 'interwiki-legend-hide' => 'Nascondi legenda',
+ 'interwiki_prefix' => 'Prefisso',
+ 'interwiki-prefix-label' => 'Prefisso:',
+ 'interwiki_prefix_intro' => 'Prefisso interwiki da utilizzare nella sintassi <code>[<nowiki />[prefisso:<em>nomepagina</em>]]</code>.',
+ 'interwiki_url_intro' => 'Modello per gli URL. $1 sarà sostituito dal <em>nomepagina</em> del testo, quando la suddetta sintassi viene utilizzata.',
+ 'interwiki_local' => 'Reindirizza',
+ 'interwiki-local-label' => 'Reindirizza:',
+ 'interwiki_local_intro' => "Una richiesta HTTP al sito locale con questo prefisso interwiki nell'URL è:",
+ 'interwiki_local_0_intro' => 'non eseguita, di solito bloccata da "pagina non trovata",',
+ 'interwiki_local_1_intro' => "reindirizzata all'URL di destinazione indicato nella definizione del link interwiki (cioè trattati come riferimenti nelle pagine locali)",
+ 'interwiki_trans' => 'Inclusione',
+ 'interwiki-trans-label' => 'Inclusione:',
+ 'interwiki_trans_intro' => 'Se la sintassi <code>{<nowiki />{prefisso:<em>nomepagina</em>}}</code> è usata, allora:',
+ 'interwiki_trans_1_intro' => "permette l'inclusione da siti esterni, se le inclusioni interwiki sono generalmente permesse in questo sito,",
+ 'interwiki_trans_0_intro' => 'non la permette, invece cerca una pagina nel namespace template.',
+ 'interwiki_intro_footer' => 'Consultare [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] per maggiori informazioni sulle tabelle degli interwiki. Esiste un [[Special:Log/interwiki|registro delle modifiche]] alla tabella degli interwiki.',
+ 'interwiki_1' => 'sì',
+ 'interwiki_0' => 'no',
+ 'interwiki_error' => "ERRORE: La tabella degli interwiki è vuota, o c'è qualche altro errore.",
+ 'interwiki-cached' => 'I dati degli interwiki sono memorizzati nella cache. Non è possibile modificare la cache.',
+ 'interwiki_edit' => 'Modifica',
+ 'interwiki_reasonfield' => 'Motivo:',
+ 'interwiki_delquestion' => 'Cancello "$1"',
+ 'interwiki_deleting' => 'Stai cancellando il prefisso "$1"',
+ 'interwiki_deleted' => 'Il prefisso "$1" è stato cancellato con successo dalla tabella degli interwiki.',
+ 'interwiki_delfailed' => 'Rimozione del prefisso "$1" dalla tabella degli interwiki fallita.',
+ 'interwiki_addtext' => 'Aggiungi un prefisso interwiki',
+ 'interwiki_addintro' => 'Sta per essere aggiunto un nuovo prefisso interwiki.
+Non sono ammessi i caratteri: spazio ( ), due punti (:), e commerciale (&), simbolo di uguale (=).',
+ 'interwiki_addbutton' => 'Aggiungi',
+ 'interwiki_added' => 'Il prefisso "$1" è stato aggiunto alla tabella degli interwiki.',
+ 'interwiki_addfailed' => 'Impossibile aggiungere il prefisso "$1" alla tabella degli interwiki.
+Il prefisso potrebbe essere già presente in tabella.',
+ 'interwiki_edittext' => 'Modifica di un prefisso interwiki',
+ 'interwiki_editintro' => 'Si sta modificando un prefisso interwiki.
+Ciò può rendere non funzionanti dei collegamenti esistenti.',
+ 'interwiki_edited' => 'Il prefisso "$1" è stato modificato nella tabella degli interwiki.',
+ 'interwiki_editerror' => 'Impossibile modificare il prefisso "$1" nella tabella degli interwiki.
+Il prefisso potrebbe essere inesistente.',
+ 'interwiki-badprefix' => 'Il prefisso interwiki "$1" specificato contiene caratteri non validi',
+ 'interwiki-submit-empty' => "Il prefisso e l'URL non possono essere vuoti.",
+ 'interwiki-submit-invalidurl' => "Il protocollo dell'URL non è valido.",
+ 'log-name-interwiki' => 'Registro tabella interwiki',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|ha aggiunto}} il prefisso "$4" ($5) (incl: $6; locale: $7) alla tabella degli interwiki',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|ha modificato}} il prefisso "$4" ($5) (incl: $6; locale: $7) nella tabella degli interwiki',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|ha rimosso}} il prefisso "$4" dalla tabella degli interwiki',
+ 'log-description-interwiki' => 'Registro dei cambiamenti apportati alla [[Special:Interwiki|tabella degli interwiki]].',
+ 'right-interwiki' => 'Modifica i dati interwiki',
+ 'action-interwiki' => 'modificare questo interwiki',
+);
+
+/** Japanese (日本語)
+ * @author Aotake
+ * @author Fievarsty
+ * @author Fryed-peach
+ * @author Mzm5zbC3
+ * @author Schu
+ * @author Shirayuki
+ * @author é’å­å®ˆæ­Œ
+ */
+$messages['ja'] = array(
+ 'interwiki' => 'インターウィキデータã®é–²è¦§ã¨ç·¨é›†',
+ 'interwiki-title-norights' => 'インターウィキデータã®é–²è¦§',
+ 'interwiki-desc' => 'インターウィキテーブルã®è¡¨ç¤ºã¨ç·¨é›†ã‚’è¡Œã†[[Special:Interwiki|特別ページ]]を追加ã™ã‚‹',
+ 'interwiki_intro' => '以下ã¯ã‚¤ãƒ³ã‚¿ãƒ¼ã‚¦ã‚£ã‚­ã®ä¸€è¦§è¡¨ã§ã™ã€‚',
+ 'interwiki-legend-show' => '凡例を表示',
+ 'interwiki-legend-hide' => '凡例を隠ã™',
+ 'interwiki_prefix' => '接頭辞',
+ 'interwiki-prefix-label' => '接頭辞:',
+ 'interwiki_prefix_intro' => '<code>[<nowiki />[接頭辞:<em>ページå</em>]]</code> ã¨ã„ã†ã‚¦ã‚£ã‚­ãƒ†ã‚­ã‚¹ãƒˆã®æ§‹æ–‡ã§ä½¿ç”¨ã•ã‚Œã‚‹ã€ã‚¤ãƒ³ã‚¿ãƒ¼ã‚¦ã‚£ã‚­æŽ¥é ­è¾žã§ã™ã€‚',
+ 'interwiki_url_intro' => 'URLã®é››åž‹ã§ã™ã€‚$1 ã¨ã„ã†ãƒ—レースホルダーã¯ã€ä¸Šã§è¿°ã¹ãŸæ§‹æ–‡ã«ãŠã‘る「<em>ページå</em>ã€ã«ç½®æ›ã•ã‚Œã¾ã™ã€‚',
+ 'interwiki_local' => '転é€',
+ 'interwiki-local-label' => '転é€:',
+ 'interwiki_local_intro' => 'URLã«ã“ã®æŽ¥é ­è¾žãŒä»˜ã„ãŸã€ãƒ­ãƒ¼ã‚«ãƒ«ã‚¦ã‚£ã‚­ã¸ã®HTTPè¦æ±‚ã¯ã€',
+ 'interwiki_local_0_intro' => '無効ã§ã™ã€‚「ページã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ãªã©ã¨è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚',
+ 'interwiki_local_1_intro' => 'インターウィキウィキリンクã®å®šç¾©ã§æŒ‡å®šã•ã‚ŒãŸå¯¾è±¡URLã«è»¢é€ã•ã‚Œã¾ã™ã€‚言ã„æ›ãˆã‚‹ã¨ã€åŒä¸€ã‚¦ã‚£ã‚­å†…ã®ãƒšãƒ¼ã‚¸ã¸ã®ãƒªãƒ³ã‚¯ã®ã‚ˆã†ã«æ‰±ã„ã¾ã™ã€‚',
+ 'interwiki_trans' => 'トランスクルージョン',
+ 'interwiki-trans-label' => 'トランスクルージョン:',
+ 'interwiki_trans_intro' => '<code>{<nowiki />{接頭辞:<em>ページå</em>}}</code> ã¨ã„ã†ã‚¦ã‚£ã‚­ãƒ†ã‚­ã‚¹ãƒˆã®æ§‹æ–‡ãŒä½¿ç”¨ã•ã‚ŒãŸå ´åˆ:',
+ 'interwiki_trans_1_intro' => 'ウィキ間トランスクルージョンãŒã“ã®ã‚¦ã‚£ã‚­ã§ (一般的ã«) 許å¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€ã“ã®å¤–部ウィキã‹ã‚‰ã®ãƒˆãƒ©ãƒ³ã‚¹ã‚¯ãƒ«ãƒ¼ã‚¸ãƒ§ãƒ³ã‚’許å¯ã—ã¾ã™ã€‚',
+ 'interwiki_trans_0_intro' => '許å¯ã›ãšã€ãƒ†ãƒ³ãƒ—レートåå‰ç©ºé–“ã§ãƒšãƒ¼ã‚¸ã‚’探ã—ã¾ã™ã€‚',
+ 'interwiki_intro_footer' => 'インターウィキテーブルã«ã¤ã„ã¦ã€ã‚ˆã‚Šè©³ã—ã㯠[//www.mediawiki.org/wiki/Manual:Interwiki_table/ja MediaWiki.org] ã‚’å‚ç…§ã—ã¦ãã ã•ã„。ã¾ãŸã€ã‚¤ãƒ³ã‚¿ãƒ¼ã‚¦ã‚£ã‚­ãƒ†ãƒ¼ãƒ–ルã®[[Special:Log/interwiki|変更記録]]ãŒã‚ã‚Šã¾ã™ã€‚',
+ 'interwiki_1' => 'ã¯ã„',
+ 'interwiki_0' => 'ã„ã„ãˆ',
+ 'interwiki_error' => 'エラー: インターウィキテーブルãŒç©ºã‹ã€ä»–ã®ç†ç”±ã§ã†ã¾ãã„ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+ 'interwiki-cached' => 'インターウィキデータã¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚Œã¦ã„ã¾ã™ã€‚キャッシュを変更ã™ã‚‹ã“ã¨ã¯ä¸å¯èƒ½ã§ã™ã€‚',
+ 'interwiki_edit' => '編集',
+ 'interwiki_reasonfield' => 'ç†ç”±:',
+ 'interwiki_delquestion' => '「$1ã€ã‚’削除中',
+ 'interwiki_deleting' => '接頭辞「$1ã€ã‚’削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚',
+ 'interwiki_deleted' => 'インターウィキテーブルã‹ã‚‰æŽ¥é ­è¾žã€Œ$1ã€ã‚’除去ã—ã¾ã—ãŸã€‚',
+ 'interwiki_delfailed' => 'インターウィキテーブルã‹ã‚‰æŽ¥é ­è¾žã€Œ$1ã€ã‚’除去ã—ã¾ã—ãŸã€‚',
+ 'interwiki_addtext' => 'インターウィキ接頭辞を追加',
+ 'interwiki_addintro' => 'インターウィキã®æ–°ã—ã„接頭辞を追加ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+空白( )ã€ã‚³ãƒ­ãƒ³(:)ã€ã‚¢ãƒ³ãƒ‘ーサンド(&)ã€ç­‰å·(=)ã‚’å«ã‚ã¦ã¯ã„ã‘ãªã„ã“ã¨ã«ã”注æ„ãã ã•ã„。',
+ 'interwiki_addbutton' => '追加',
+ 'interwiki_added' => 'インターウィキテーブルã«æŽ¥é ­è¾žã€Œ$1ã€ã‚’追加ã—ã¾ã—ãŸã€‚',
+ 'interwiki_addfailed' => 'インターウィキテーブルã«æŽ¥é ­è¾žã€Œ$1ã€ã‚’追加ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+インターウィキテーブル内ã«æ—¢ã«å­˜åœ¨ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚',
+ 'interwiki_edittext' => 'インターウィキ接頭辞を編集',
+ 'interwiki_editintro' => 'ã‚ãªãŸã¯ã‚¤ãƒ³ã‚¿ãƒ¼ã‚¦ã‚£ã‚­æŽ¥é ­è¾žã‚’編集ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ã“ã®ä½œæ¥­ã«ã‚ˆã‚Šæ—¢å­˜ã®ãƒªãƒ³ã‚¯ã‚’破壊ã™ã‚‹ãŠãã‚ŒãŒã‚ã‚Šã¾ã™ã€‚',
+ 'interwiki_edited' => 'インターウィキテーブル内ã§æŽ¥é ­è¾žã€Œ$1ã€ã‚’変更ã—ã¾ã—ãŸã€‚',
+ 'interwiki_editerror' => 'インターウィキテーブル内ã§æŽ¥é ­è¾žã€Œ$1ã€ã‚’変更ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+存在ã—ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚',
+ 'interwiki-badprefix' => '指定ã•ã‚ŒãŸã‚¤ãƒ³ã‚¿ãƒ¼ã‚¦ã‚£ã‚­æŽ¥é ­è¾žã€Œ$1ã€ã¯ç„¡åŠ¹ãªæ–‡å­—ã‚’å«ã‚“ã§ã„ã¾ã™',
+ 'interwiki-submit-empty' => '接頭辞や URL を空ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。',
+ 'interwiki-submit-invalidurl' => 'URL ã®ãƒ—ロトコルãŒç„¡åŠ¹ã§ã™ã€‚',
+ 'log-name-interwiki' => 'インターウィキ編集記録',
+ 'logentry-interwiki-iw_add' => '$1 ãŒã‚¤ãƒ³ã‚¿ãƒ¼ã‚¦ã‚£ã‚­ãƒ†ãƒ¼ãƒ–ルã«æŽ¥é ­è¾žã€Œ$4ã€($5) (トランスクルージョン: $6ã€ãƒ­ãƒ¼ã‚«ãƒ«: $7) ã‚’{{GENDER:$2|追加ã—ã¾ã—ãŸ}}',
+ 'logentry-interwiki-iw_edit' => '$1 ãŒã‚¤ãƒ³ã‚¿ãƒ¼ã‚¦ã‚£ã‚­ãƒ†ãƒ¼ãƒ–ル内ã®æŽ¥é ­è¾žã€Œ$4ã€($5) (トランスクルージョン: $6ã€ãƒ­ãƒ¼ã‚«ãƒ«: $7) ã‚’{{GENDER:$2|変更ã—ã¾ã—ãŸ}}',
+ 'logentry-interwiki-iw_delete' => '$1 ãŒã‚¤ãƒ³ã‚¿ãƒ¼ã‚¦ã‚£ã‚­ãƒ†ãƒ¼ãƒ–ルã‹ã‚‰æŽ¥é ­è¾žã€Œ$4ã€ã‚’{{GENDER:$2|除去ã—ã¾ã—ãŸ}}',
+ 'log-description-interwiki' => 'ã“ã‚Œã¯[[Special:Interwiki|インターウィキテーブル]]ã®å¤‰æ›´è¨˜éŒ²ã§ã™ã€‚',
+ 'right-interwiki' => 'インターウィキデータã®ç·¨é›†',
+ 'action-interwiki' => 'ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ã‚¦ã‚£ã‚­é …ç›®ã®å¤‰æ›´',
+);
+
+/** Javanese (Basa Jawa)
+ * @author Meursault2004
+ * @author Pras
+ */
+$messages['jv'] = array(
+ 'interwiki' => 'Ndeleng lan nyunting data interwiki',
+ 'interwiki-title-norights' => 'Ndeleng data interwiki',
+ 'interwiki-desc' => 'Nambahaké sawijining [[Special:Interwiki|kaca astaméwa]] kanggo ndeleng lan nyunting tabèl interwiki',
+ 'interwiki_intro' => 'Iki sawijining gambaran saka tabel interwiki.',
+ 'interwiki_prefix' => 'Préfiks (sisipan awal)',
+ 'interwiki-prefix-label' => 'Préfiks (sisipan awal):', # Fuzzy
+ 'interwiki_error' => 'KALUPUTAN: Tabèl interwikiné kosong, utawa ana masalah liya.',
+ 'interwiki_reasonfield' => 'Alesan:',
+ 'interwiki_delquestion' => 'Mbusak "$1"',
+ 'interwiki_deleting' => 'Panjenengan mbusak préfiks utawa sisipan awal "$1".',
+ 'interwiki_deleted' => 'Préfisk "$1" bisa kasil dibusak saka tabèl interwiki.',
+ 'interwiki_delfailed' => 'Préfiks "$1" ora bisa diilangi saka tabèl interwiki.',
+ 'interwiki_addtext' => 'Nambah préfiks interwiki',
+ 'interwiki_addintro' => 'Panjenengan nambah préfiks utawa sisipan awal interwiki anyar.
+Élinga yèn iku ora bisa ngandhut spasi ( ), pada pangkat (:), ampersands (&), utawa tandha padha (=).',
+ 'interwiki_addbutton' => 'Nambah',
+ 'interwiki_added' => 'Préfiks utawa sisipan awal "$1" bisa kasil ditambahaké ing tabèl interwiki.',
+ 'interwiki_addfailed' => 'Préfiks "$1" ora bisa ditambahaké ing tabèl interwiki.
+Mbok-menawa iki pancèn wis ana ing tabèl interwiki.',
+ 'interwiki_edittext' => 'Nyunting sawijining préfiks interwiki',
+ 'interwiki_editintro' => 'Panjenengan nyunting préfiks interwiki.
+Élinga yèn iki ora bisa nugel pranala-pranala sing wis ana.',
+ 'interwiki_edited' => 'Préfiks "$1" bisa suksès dimodifikasi ing tabèl interwiki.',
+ 'interwiki_editerror' => 'Préfiks utawa sisipan awal "$1" ora bisa dimodifikasi ing tabèl interwiki.
+Mbok-menawa iki ora ana.',
+ 'log-name-interwiki' => 'Log tabèl interwiki',
+ 'log-description-interwiki' => 'Kaca iki log owah-owahan kanggo [[Special:Interwiki|tabèl interwiki]].',
+);
+
+/** Georgian (ქáƒáƒ áƒ—ული)
+ * @author David1010
+ * @author Malafaya
+ */
+$messages['ka'] = array(
+ 'interwiki' => 'ინტერვიკის მáƒáƒœáƒáƒªáƒ”მების ხილვრდრრედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
+ 'interwiki-title-norights' => 'ინტერვიკის მáƒáƒœáƒáƒªáƒ”მების ხილვáƒ',
+ 'interwiki-legend-show' => 'ლეგენდის ჩვენებáƒ',
+ 'interwiki-legend-hide' => 'ლეგენდის დáƒáƒ›áƒáƒšáƒ•áƒ',
+ 'interwiki_prefix' => 'წინსáƒáƒ áƒ—ი',
+ 'interwiki-prefix-label' => 'წინსáƒáƒ áƒ—ი:',
+ 'interwiki_url' => 'URL',
+ 'interwiki-url-label' => 'URL:',
+ 'interwiki_local' => 'გáƒáƒ“áƒáƒ’ზáƒáƒ•áƒœáƒ',
+ 'interwiki-local-label' => 'გáƒáƒ“áƒáƒ’ზáƒáƒ•áƒœáƒ:',
+ 'interwiki_trans' => 'ჩáƒáƒ áƒ—ვáƒ',
+ 'interwiki-trans-label' => 'ჩáƒáƒ áƒ—ვáƒ:',
+ 'interwiki_trans_intro' => 'თუკი გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრვიკი-ტექსტის სინტáƒáƒ¥áƒ¡áƒ˜ შემდეგი სáƒáƒ®áƒ˜áƒ— <code>{<nowiki />{prefix:<em>გვერდის სáƒáƒ®áƒ”ლი</em>}}</code>:',
+ 'interwiki_1' => 'დიáƒáƒ®',
+ 'interwiki_0' => 'áƒáƒ áƒ',
+ 'interwiki_edit' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
+ 'interwiki_reasonfield' => 'მიზეზი:',
+ 'interwiki_delquestion' => 'იშლებრ„$1“',
+ 'interwiki_deleting' => 'თქვენ შლით სინტáƒáƒ¥áƒ¡áƒ¡ „$1“.',
+ 'interwiki_deleted' => 'პრეფიქსი „$1“ წáƒáƒ áƒ›áƒáƒ¢áƒ”ბით წáƒáƒ˜áƒ¨áƒáƒšáƒ ინტერვიკების ცხრილიდáƒáƒœ.',
+ 'interwiki_delfailed' => 'პრეფიქსის „$1“ წáƒáƒ¨áƒšáƒ ინტერვიკების ცხრილიდáƒáƒœ შეუძლებელიáƒ.',
+ 'interwiki_addtext' => 'ინტერვიკის პრეფიქსის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ',
+ 'interwiki_addbutton' => 'დáƒáƒ›áƒáƒ¢áƒ”ბáƒ',
+ 'interwiki_edittext' => 'ინტერვიკის პრეფიქსის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
+ 'interwiki-submit-empty' => 'პრეფიქსი დრURL áƒáƒ  შეიძლებრცáƒáƒ áƒ˜áƒ”ლი იყáƒáƒ¡.',
+ 'log-name-interwiki' => 'ინტერვიკის ცხრილის ჟურნáƒáƒšáƒ˜',
+ 'log-description-interwiki' => 'ეს áƒáƒ áƒ˜áƒ¡ [[Special:Interwiki|ინტერვიკის ცხრილის]] ცვლილებების ჟურნáƒáƒšáƒ˜.',
+ 'right-interwiki' => 'ინტერვიკის მáƒáƒœáƒáƒªáƒ”მების რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
+ 'action-interwiki' => 'ინტერვიკის ჩáƒáƒœáƒáƒ¬áƒ”რების შეცვლáƒ',
+);
+
+/** Khmer (ភាសាážáŸ’មែរ)
+ * @author Chhorran
+ * @author Lovekhmer
+ * @author Thearith
+ * @author គីមស៊្រុន
+ * @author ážœáŸážŽážáž¶ážšáž·áž‘្ធ
+ */
+$messages['km'] = array(
+ 'interwiki' => 'មើលនិងកែប្រែទិន្ននáŸáž™áž¢áž“្ážážšážœáž·áž‚ី',
+ 'interwiki-title-norights' => 'មើលទិន្ននáŸáž™áž¢áž“្ážážšážœáž·áž‚ី',
+ 'interwiki-desc' => 'បន្ážáŸ‚ម[[Special:Interwiki|ទំពáŸážšáž–ិសáŸážŸ]]ដើម្បីមើលនិងកែប្រែážáž¶ážšáž¶áž„អន្ážážšážœáž·áž‚ី',
+ 'interwiki_intro' => 'áž“áŸáŸ‡â€‹áž‚ឺជា​ទិដ្ឋភាពទូទៅ​នៃ​ážáž¶ážšáž¶áž„​អន្ážážšážœáž·áž‚ី​។',
+ 'interwiki-legend-show' => 'បង្ហាញកំណážáŸ‹ážŸáŸ†áž‚ាល់',
+ 'interwiki-legend-hide' => 'លាក់កំណážáŸ‹ážŸáŸ†áž‚ាល់',
+ 'interwiki_prefix' => 'បុព្វបទ',
+ 'interwiki-prefix-label' => 'បុព្វបទ៖',
+ 'interwiki_1' => 'បាទ/ចាស៎',
+ 'interwiki_0' => 'áž‘áŸ',
+ 'interwiki_error' => 'កំហុស:ážáž¶ážšáž¶áž„អន្ážážšážœáž·áž‚ីគឺទទ០ឬកáŸáž˜áž¶áž“អ្វីផ្សáŸáž„ទៀážáž˜áž¶áž“បញ្ហា។',
+ 'interwiki_edit' => 'កែប្រែ​',
+ 'interwiki_reasonfield' => 'មូលហáŸážáž»áŸ–',
+ 'interwiki_delquestion' => 'ការលុបចáŸáž‰ "$1"',
+ 'interwiki_deleting' => 'លោកអ្នកកំពុងលុបបុព្វបទ "$1"។',
+ 'interwiki_deleted' => 'បុព្វបទ"$1"បានដកចáŸáž‰áž–ីážáž¶ážšáž¶áž„អន្ážážšážœáž·áž‚ីដោយជោគជáŸáž™áž áž¾áž™áŸ”',
+ 'interwiki_delfailed' => 'បុព្វបទ"$1"មិនអាចដកចáŸáž‰áž–ីážáž¶ážšáž¶áž„អន្ážážšážœáž·áž‚ីបានទáŸáŸ”',
+ 'interwiki_addtext' => 'បន្ážáŸ‚មបុព្វបទអន្ážážšážœáž·áž‚ី',
+ 'interwiki_addintro' => 'អ្នកកំពុងបន្ážáŸ‚មបុព្វបទអន្ážážšážœáž·áž‚ីážáŸ’មីមួយ។
+
+សូមចងចាំážáž¶ážœáž¶áž˜áž·áž“អាចមាន ដកឃ្លា( ) ចុច២(:) សញ្ញានិង(&) ឬសញ្ញាស្មើ(=)បានទáŸáŸ”',
+ 'interwiki_addbutton' => 'បន្ážáŸ‚ម',
+ 'interwiki_added' => 'បុព្វបទ "$1" ážáŸ’រូវបានបន្ážáŸ‚មទៅក្នុងážáž¶ážšáž¶áž„អន្ážážšážœáž·áž‚ីដោយជោគជáŸáž™áŸ”',
+ 'interwiki_addfailed' => 'បុព្វបទ "$1" មិនអាចបន្ážáŸ‚មទៅក្នុងážáž¶ážšáž¶áž„អន្ážážšážœáž·áž‚ីបានទáŸáŸ”
+
+ប្រហែលជាវាមានរួចហើយនៅក្នុងážáž¶ážšáž¶áž„អន្ážážšážœáž·áž‚ី។',
+ 'interwiki_edittext' => 'ការកែប្រែបុព្វបទអន្ážážšážœáž·áž‚ី',
+ 'interwiki_editintro' => 'អ្នកកំពុងកែប្រែបុព្វបទអន្ážážšážœáž·áž‚ី។
+
+ចូរចងចាំážáž¶ážœáž¶áž¢áž¶áž…នាំឱ្យážáž¼áž…ážáŸ†ážŽáž—្ជាប់ដែលមានស្រáŸáž…។',
+ 'interwiki_edited' => 'បុព្វបទ"$1"ážáŸ’រូវបានកែសម្រួលក្នុងážáž¶ážšáž¶áž„អន្ážážšážœáž·áž‚ីដោយជោគជáŸáž™áž áž¾áž™áŸ”',
+ 'interwiki_editerror' => 'បុព្វបទ "$1" មិនអាចកែសម្រួលនៅក្នុងážáž¶ážšáž¶áž„អន្ážážšážœáž·áž‚ីបានទáŸáŸ”
+
+ប្រហែលជាវាមិនមានអážáŸ’ážáž·áž—ាពទáŸáŸ”',
+ 'log-name-interwiki' => 'កំណážáŸ‹áž áŸážáž»ážáž¶ážšáž¶áž„អន្ážážšážœáž·áž‚ី',
+ 'log-description-interwiki' => 'áž“áŸáŸ‡áž‡áž¶áž€áŸ†ážŽážáŸ‹áž áŸážáž»áž“ៃបំលាស់ប្ážáž¼ážšáž€áŸ’នុង[[Special:Interwiki|ážáž¶ážšáž¶áž„អន្ážážšážœáž·áž‚ី]]។',
+ 'right-interwiki' => 'កែប្រែទិន្ននáŸáž™áž¢áž“្ážážšážœáž·áž‚ី',
+);
+
+/** Kannada (ಕನà³à²¨à²¡)
+ * @author Nayvik
+ */
+$messages['kn'] = array(
+ 'interwiki_1' => 'ಹೌದà³',
+ 'interwiki_0' => 'ಇಲà³à²²',
+ 'interwiki_edit' => 'ಸಂಪಾದಿಸಿ',
+ 'interwiki_reasonfield' => 'ಕಾರಣ:',
+ 'interwiki_addbutton' => 'ಸೇರಿಸà³',
+);
+
+/** Korean (한국어)
+ * @author Devunt
+ * @author Kwj2772
+ * @author Mintz0223
+ * @author ToePeu
+ * @author ì•„ë¼
+ */
+$messages['ko'] = array(
+ 'interwiki' => 'ì¸í„°ìœ„키 ëª©ë¡ ë³´ê¸° ë° ê³ ì¹˜ê¸°',
+ 'interwiki-title-norights' => 'ì¸í„°ìœ„키 ëª©ë¡ ë³´ê¸°',
+ 'interwiki-desc' => 'ì¸í„°ìœ„키 í…Œì´ë¸”ì„ ë³´ê±°ë‚˜ ê³ ì¹  수 있는 [[Special:Interwiki|특수 문서]]를 추가합니다',
+ 'interwiki_intro' => 'ì´ ë¬¸ì„œëŠ” ì¸í„°ìœ„키 í…Œì´ë¸”ì— ëŒ€í•œ 둘러보기입니다.',
+ 'interwiki-legend-show' => '범례 보기',
+ 'interwiki-legend-hide' => '범례 숨기기',
+ 'interwiki_prefix' => 'ì ‘ë‘ì–´',
+ 'interwiki-prefix-label' => 'ì ‘ë‘ì–´:',
+ 'interwiki_prefix_intro' => '<code>[<nowiki />[ì ‘ë‘ì–´:문서 ì´ë¦„]]</code> 위키 ë§í¬ì— ì“°ì¼ ì¸í„°ìœ„키 ì ‘ë‘ì–´',
+ 'interwiki_url_intro' => 'URL ì„œì‹. $1 ìžë¦¬ì—는 ìœ„ì— ìœ„í‚¤ë¬¸ë²•ì´ ì“°ì¸ ê²ƒì—ì„œì˜ <em>문서 ì´ë¦„</em>으로 바뀔 것입니다.',
+ 'interwiki_local' => '전달',
+ 'interwiki-local-label' => '전달:',
+ 'interwiki_local_intro' => 'URLì— ì¸í„°ìœ„키 ì ‘ë‘ì–´ê°€ í¬í•¨ë˜ì–´ ìžˆì„ ë•Œ 로컬 ìœ„í‚¤ë¡œì˜ HTTP 요청:',
+ 'interwiki_local_0_intro' => '무시함, 보통 "ìž˜ëª»ëœ ì œëª©"ì„ ì¶œë ¥í•©ë‹ˆë‹¤.',
+ 'interwiki_local_1_intro' => 'ì¸í„°ìœ„키 ë§í¬ ì •ì˜ì— ìž…ë ¥ëœ URLë¡œ ì´ë™í•©ë‹ˆë‹¤. (즉, 로컬 ë¬¸ì„œì˜ ì°¸ê³  ìžë£Œë¡œ 취급ë©ë‹ˆë‹¤)',
+ 'interwiki_trans' => 'ì¸í„°ìœ„키 í¬í•¨',
+ 'interwiki-trans-label' => 'ì¸í„°ìœ„키 í¬í•¨:',
+ 'interwiki_trans_intro' => '<code>{<nowiki />{ì ‘ë‘ì–´:<em>pagename</em>}}</code>ì´ ì“°ì¼ ê²½ìš°:',
+ 'interwiki_trans_1_intro' => 'ì´ ìœ„í‚¤ì—ì„œ ì¼ë°˜ì ìœ¼ë¡œ ì¸í„°ìœ„키 í‹€ í¬í•¨ì´ 허용ëœë‹¤ë©´, 타 위키ì—ì„œì˜ í‹€ í¬í•¨ì„ 허용합니다,',
+ 'interwiki_trans_0_intro' => '허용하지 ì•Šê³  í‹€ ì´ë¦„ê³µê°„ì˜ ë¬¸ì„œë¥¼ 찾아봅니다.',
+ 'interwiki_intro_footer' => 'ì¸í„°ìœ„키 í…Œì´ë¸”ì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì„ [//www.mediawiki.org/wiki/Manual:Interwiki_table/ko MediaWiki.org]ì—ì„œ 보세요.
+ì¸í„°ìœ„키 í…Œì´ë¸”ì˜ [[Special:Log/interwiki|바뀜 기ë¡]]ì´ ì¡´ìž¬í•©ë‹ˆë‹¤.',
+ 'interwiki_1' => '예',
+ 'interwiki_0' => '아니오',
+ 'interwiki_error' => '오류: ì¸í„°ìœ„키 í…Œì´ë¸”ì´ ë¹„ì–´ 있거나 다른 무엇ì¸ê°€ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.',
+ 'interwiki-cached' => 'ì¸í„°ìœ„키 ë°ì´í„°ëŠ” ìºì‹œë©ë‹ˆë‹¤. ìºì‹œë¥¼ 수정하는 ê±´ 불가능합니다.',
+ 'interwiki_edit' => '편집',
+ 'interwiki_reasonfield' => 'ì´ìœ :',
+ 'interwiki_delquestion' => '"$1" 지우기',
+ 'interwiki_deleting' => '"$1" ì ‘ë‘어를 지ì›ë‹ˆë‹¤.',
+ 'interwiki_deleted' => '"$1" ì ‘ë‘어를 ì¸í„°ìœ„키 í…Œì´ë¸”ì—ì„œ 지웠습니다.',
+ 'interwiki_delfailed' => '"$1" ì ‘ë‘어를 ì¸í„°ìœ„키 í…Œì´ë¸”ì—ì„œ 지울 수 없습니다.',
+ 'interwiki_addtext' => 'ì¸í„°ìœ„키 ì ‘ë‘ì–´ 추가',
+ 'interwiki_addintro' => '새 ì¸í„°ìœ„키 ì ‘ë‘어를 만듭니다. 공백( ), ìŒì (:), &기호(&), 등호(=)는 í¬í•¨í•  수 없습니다.',
+ 'interwiki_addbutton' => '추가',
+ 'interwiki_added' => '"$1" ì ‘ë‘어를 ì¸í„°ìœ„키 í…Œì´ë¸”ì— ì¶”ê°€í–ˆìŠµë‹ˆë‹¤.',
+ 'interwiki_addfailed' => '"$1" ì ‘ë‘어를 ì¸í„°ìœ„키 í…Œì´ë¸”ì— ì¶”ê°€í•  수 없습니다.
+ì´ë¯¸ í‘œì— ìžˆì„ ìˆ˜ 있습니다.',
+ 'interwiki_edittext' => 'ì¸í„°ìœ„키 ì ‘ë‘ì–´ 고치기',
+ 'interwiki_editintro' => 'ì¸í„°ìœ„키 ì ‘ë‘어를 고칩니다.
+ì´ë¯¸ 만들어진 ì¸í„°ìœ„키를 ë§ê°€ëœ¨ë¦´ 수 있으니 주ì˜í•´ 주세요.',
+ 'interwiki_edited' => '"$1" ì ‘ë‘어를 고쳤습니다.',
+ 'interwiki_editerror' => '"$1" ì ‘ë‘어를 ì¸í„°ìœ„키 í…Œì´ë¸”ì— ê³ ì¹  수 없습니다.
+목ë¡ì— 없는 ì ‘ë‘ì–´ì¼ ìˆ˜ 있습니다.',
+ 'interwiki-badprefix' => '지정한 ì¸í„°ìœ„키 "$1" ì ‘ë‘어는 ìž˜ëª»ëœ ë¬¸ìžë¥¼ í¬í•¨í•˜ê³  있습니다.',
+ 'interwiki-submit-empty' => 'ì ‘ë‘어와 URL ì¹¸ì€ ë¹„ì›Œë‘˜ 수 없습니다.',
+ 'interwiki-submit-invalidurl' => 'URLì˜ í”„ë¡œí† ì½œì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤.',
+ 'log-name-interwiki' => 'ì¸í„°ìœ„키 수정 기ë¡',
+ 'logentry-interwiki-iw_add' => '$1 사용ìžê°€ "$4" ($5) (í‹€ í¬í•¨: $6, 로컬: $7) ì ‘ë‘어를 ì¸í„°ìœ„키 í…Œì´ë¸”ì— {{GENDER:$2|추가}}했습니다.',
+ 'logentry-interwiki-iw_edit' => '$1 사용ìžê°€ ì¸í„°ìœ„키 í…Œì´ë¸”ì˜ "$4" ($5) (í‹€ í¬í•¨: $6, 로컬: $7) ì ‘ë‘어를 {{GENDER:$2|수정}}했습니다.',
+ 'logentry-interwiki-iw_delete' => '$1 사용ìžê°€ ì¸í„°ìœ„키 í…Œì´ë¸”ì˜ "$4" ì ‘ë‘어를 {{GENDER:$2|ì‚­ì œ}}했습니다.',
+ 'log-description-interwiki' => '[[Special:Interwiki|ì¸í„°ìœ„키]] 목ë¡ì˜ ë°”ë€ ë‚´ì—­ìž…ë‹ˆë‹¤.',
+ 'right-interwiki' => 'ì¸í„°ìœ„키 ëª©ë¡ ê³ ì¹˜ê¸°',
+ 'action-interwiki' => 'ì´ ì¸í„°ìœ„키 ì ‘ë‘ì–´ 바꾸기',
+);
+
+/** Colognian (Ripoarisch)
+ * @author Purodha
+ */
+$messages['ksh'] = array(
+ 'interwiki' => 'Engerwiki Date beloere un änndere',
+ 'interwiki-title-norights' => 'Engerwiki Date beloore',
+ 'interwiki-desc' => 'Brengk de Sondersigg [[Special:Interwiki]], öm Engerwiki Date ze beloore un ze ändere.',
+ 'interwiki_intro' => 'Heh is ene Övverbleck övver de Engerwiki-Tabäll.',
+ 'interwiki-legend-show' => 'Lejänd aanzeije',
+ 'interwiki-legend-hide' => 'Lejänd verschteeische',
+ 'interwiki_prefix' => 'Försaz',
+ 'interwiki-prefix-label' => 'Försaz:',
+ 'interwiki_prefix_intro' => 'Dä Fösatz för Engewiki Lengks wie hä em Wikitex en Sigge jebruch weed, wam_mer <code>[<nowiki />[<em>{{lc:{{int:Interwiki_prefix}}}}</em>:<em>Siggename</em>]]</code> schrieve deijt.',
+ 'interwiki_url' => '<i lang="en">URL</i>',
+ 'interwiki-url-label' => '<i lang="en">URL</i>',
+ 'interwiki_url_intro' => 'E Muster för en URL. Dä Plazhallder „$1“ do dren weet ußjetuusch, wann dat Denge jebruch weet — wann di Syntax vun bovve em Wikitext op en Sigg aanjezeish weed, dann kütt dä <code><i">Siggenam</em></code> aan dä Plaz vun däm $1.',
+ 'interwiki_local' => 'Wiggerjevve?',
+ 'interwiki-local-label' => 'Wiggerjevve?:',
+ 'interwiki_local_intro' => 'Wann övver et Internet ene Sigge-Oproof aan dat Wiki hee jescheck weed, un dä Försatz es em Sigge-Tittel dren, dann:',
+ 'interwiki_local_0_intro' => 'donn dä nit als ene Vöratz behandelle, un sök noh su en Sigg hee em Wiki — dat jeiht fö jewööhnlesch uß met: „esu en Sigg hann mir nit“,',
+ 'interwiki_local_1_intro' => 'dä Oproof weed wiggerjejovve aan dä Wiki, esu wi et hee unger URL enjedraaren es, well heiße, dä weed jenou esu behandelt, wi ene Oproof ennerhallf vun en Sigg hee em Wiki.',
+ 'interwiki_trans' => 'Ennfööje?',
+ 'interwiki-trans-label' => 'Ennfööje?:',
+ 'interwiki_trans_intro' => 'Wann em Wikitex en ener Sigg de Syntax <code>{<nowiki />{<em>{{lc:{{int:Interwiki_prefix}}}}</em>:<em>Siggename</em>}}</code> jebruch weed, dann:',
+ 'interwiki_trans_1_intro' => 'lohß et zoh — wann dat en hee dämm Wiki övverhoup zohjelohße es — dat en Sigg uß däm andere Wiki hee enjeföösh weed,',
+ 'interwiki_trans_0_intro' => 'dunn dat nit, un sök hee em Wiki noh ene {{ns:template}} met dämm komplätte Name.',
+ 'interwiki_intro_footer' => 'Op dä Sigg [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] fingk mer mieh do dröver, wat et met dä Tabäll met de Engerwiki Date op sich hät.
+Et [[Special:Log/interwiki|{{int:interwiki_logpagename}}]] zeichnet all de Änderunge aan de Engerwiki Date op.',
+ 'interwiki_1' => 'Jo',
+ 'interwiki_0' => 'Nä',
+ 'interwiki_error' => "'''Fähler:''' de Tabäll met de Engerwiki Date is leddisch.",
+ 'interwiki-cached' => 'Heh di Daate kumme us enem Zweschespeischer. Dodren jät ze ändere es nit müjjelesch.',
+ 'interwiki_edit' => 'Beärbeide',
+ 'interwiki_reasonfield' => 'Aanlaß:',
+ 'interwiki_delquestion' => '„$1“ weed fottjeschmeße',
+ 'interwiki_deleting' => 'Do wells dä Engerwiki Försaz „$1“ fott schmiiße.',
+ 'interwiki_deleted' => 'Dä Försaz „$1“ es jäz uß dä Engerwiki Date erusjeschmesse.',
+ 'interwiki_delfailed' => 'Dä Försaz „$1“ konnt nit uß dä Engerwiki Date jenomme wääde.',
+ 'interwiki_addtext' => 'Ene Engerwiki Försaz dobei donn',
+ 'interwiki_addintro' => 'Do bes ennem Engerwiki Försaz dobei aam donn.
+Denk draan, et dörfe kei Zweschräum ( ), Koufmanns-Un (&amp;), Jlisch-Zeiche (=), un kein Dubbelpünkscher (:) do dren sin.',
+ 'interwiki_addbutton' => 'Dobei donn',
+ 'interwiki_added' => 'Dä Försaz „$1“ es jäz bei de Engerwiki Date dobei jekomme.',
+ 'interwiki_addfailed' => 'Dä Försaz „$1“ konnt nit bei de Engerwiki Date dobeijedonn wäde.
+Maach sin, dat dä en de Engerwiki Tabäll ald dren wor un es.',
+ 'interwiki_edittext' => 'Enne Engerwiki Fürsaz Ändere',
+ 'interwiki_editintro' => 'Do bes an ennem Engerwiki Fösaz am ändere.
+Denk draan, domet könnts De Links em Wiki kapott maache, die velleich do drop opboue.',
+ 'interwiki_edited' => 'Föz dä Försaz „$1“ sen de Engerwiki Date jäz jetuusch.',
+ 'interwiki_editerror' => 'Dä Försaz „$1“ konnt en de Engerwiki Date nit beärrbeidt wäde.
+Maach sin, dat et inn nit jitt.',
+ 'interwiki-badprefix' => 'Dä aanjejovve Engerwiki-Försatz „$1“ änthäld onjöltijje Zeiche',
+ 'interwiki-submit-empty' => 'Der Engerwiki-Försatz un der URL künne nit läddesch jelohße wääde.',
+ 'interwiki-submit-invalidurl' => 'Dä Protokoll-Vörsaz för dä <i lang="en">URL</i> es nit jöltesch.',
+ 'log-name-interwiki' => 'Logboch fun de Engerwiki Tabäll',
+ 'logentry-interwiki-iw_add' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dä Vörsaz „$4“ met däm {{int:interwiki-url-label}} „$5“ un {{int:interwiki-local-label}}$6 un {{int:interwiki-trans-label}}$7 bei de Engerwiki-Date dobei jedonn.',
+ 'logentry-interwiki-iw_edit' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dä Vörsaz „$4“ met däm {{int:interwiki-url-label}} „$5“ un {{int:interwiki-local-label}}$6 un {{int:interwiki-trans-label}}$7 vun de Engerwiki-Date verändert.',
+ 'logentry-interwiki-iw_delete' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät dä Vörsaz „$4“ uß dä Engerwiki-Date fott jenumme.',
+ 'log-description-interwiki' => 'Hee is dat Logboch met de Änderonge aan de [[Special:Interwiki|Engerwiki Date]].',
+ 'right-interwiki' => 'Engerwiki Date ändere',
+ 'action-interwiki' => 'Donn hee dä Engerwiki Enndraach ändere',
+);
+
+/** Kurdish (Latin script) (Kurdî (latînî)‎)
+ * @author George Animal
+ */
+$messages['ku-latn'] = array(
+ 'interwiki_1' => 'erê',
+ 'interwiki_edit' => 'Biguherîne',
+ 'interwiki_reasonfield' => 'Sedem:',
+);
+
+/** Latin (Latina)
+ * @author Omnipaedista
+ * @author SPQRobin
+ * @author UV
+ */
+$messages['la'] = array(
+ 'interwiki' => 'Videre et recensere data intervica',
+ 'interwiki-title-norights' => 'Videre data intervica',
+ 'interwiki_intro' => 'De tabula intervicia.',
+ 'interwiki_prefix' => 'Praefixum',
+ 'interwiki-prefix-label' => 'Praefixum:',
+ 'interwiki_error' => 'ERROR: Tabula intervica est vacua, aut aerumna alia occurrit.',
+ 'interwiki_reasonfield' => 'Causa:',
+ 'interwiki_delquestion' => 'Removens "$1"',
+ 'interwiki_deleting' => 'Delens praefixum "$1".',
+ 'interwiki_deleted' => 'Praefixum "$1" prospere remotum est ex tabula intervica.',
+ 'interwiki_delfailed' => 'Praefixum "$1" ex tabula intervica removeri non potuit.',
+ 'interwiki_addtext' => 'Addere praefixum intervicum',
+ 'interwiki_addbutton' => 'Addere',
+ 'interwiki_added' => 'Praefixum "$1" prospere in tabulam intervicam additum est.',
+ 'interwiki_addfailed' => 'Praefixum "$1" in tabulam intervicam addi non potuit. Fortasse iam est in tabula intervica.',
+ 'interwiki_edittext' => 'Recensere praefixum intervicum',
+ 'interwiki_editintro' => 'Recenses praefixum intervicum.
+Memento hoc nexus frangere posse.',
+ 'interwiki_edited' => 'Praefixum "$1" prospere modificata est in tabula intervica.',
+ 'interwiki_editerror' => 'Praefixum "$1" in tabula intervica modificari non potuit.
+Fortasse nondum est in tabula intervica.',
+ 'log-name-interwiki' => 'Index tabulae intervicae',
+ 'log-description-interwiki' => 'Hic est index mutationum [[Special:Interwiki|tabulae intervicae]].',
+ 'right-interwiki' => 'Data intervica recensere',
+ 'action-interwiki' => 'data intervica recensere',
+);
+
+/** Luxembourgish (Lëtzebuergesch)
+ * @author Les Meloures
+ * @author Purodha
+ * @author Robby
+ */
+$messages['lb'] = array(
+ 'interwiki' => 'Interwiki-Date kucken a veränneren',
+ 'interwiki-title-norights' => 'Interwiki-Date kucken',
+ 'interwiki-desc' => "Setzt eng [[Special:Interwiki|Spezialsäit]] derbäi fir d'Interwiki-Tabell ze gesinn an z'änneren",
+ 'interwiki_intro' => "Dëst ass en Iwwerbléck iwwert d'Interwiki-Tabell.",
+ 'interwiki-legend-show' => 'Legend weisen',
+ 'interwiki-legend-hide' => 'Legend verstoppen',
+ 'interwiki_prefix' => 'Prefix',
+ 'interwiki-prefix-label' => 'Prefix:',
+ 'interwiki_prefix_intro' => 'Interwiki-Prefix fir an der Form <code>[<nowiki />[prefix:<em>Säitennumm</em>]]</code> am Wikitext gebraucht ze ginn.',
+ 'interwiki-url-label' => 'URL:',
+ 'interwiki_url_intro' => 'Schabloun fir URLen. $1 gëtt duerch <em>Säitennumm</em> aus der uewe genannter Syntax am Wikitext ersat.',
+ 'interwiki_local' => 'Viruleeden',
+ 'interwiki-local-label' => 'Viruleeden:',
+ 'interwiki_local_intro' => 'Eng HTTP-Ufro un déi lokal Wiki mat dësem Interwiki-Prefix an der URL gëtt:',
+ 'interwiki_local_0_intro' => 'net erfëllt, gëtt normalerweis mat „Säit net fonnt“ blockéiert',
+ 'interwiki_local_1_intro' => "automatesch op d'Zil-URL virugeleed déi an den Interwikilink-Definitiounen uginn ass (d. h. gëtt wéi en Interwikilink op enger lokaler Säit behandelt)",
+ 'interwiki_trans' => 'Interwiki-Abannungen',
+ 'interwiki-trans-label' => 'Abannen:',
+ 'interwiki_trans_intro' => "Wann d'Wiki-Syntax <code>{<nowiki />{prefix:<em>Numm vun der Säit</em>}}</code> benotzt gëtt, dann:",
+ 'interwiki_trans_1_intro' => "erlaabt Abannunge vun anere Wikien, wann d'Interwiki-Abannungen an dëser Wiki allgemeng zoulässeg sinn,",
+ 'interwiki_trans_0_intro' => 'erlaabt et net, an huelt éischter eng Säit aus dem Nummraum:Schabloun.',
+ 'interwiki_intro_footer' => "Kuckt [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org], fir weider Informatiounen iwwer d'Interwiki-Tabell ze kréien. D'[[Special:Log/interwiki|Logbuch]] weist e Protokoll vun allen Ännerungen an der Interwiki-Tabell.",
+ 'interwiki_1' => 'jo',
+ 'interwiki_0' => 'neen',
+ 'interwiki_error' => "Feeler: D'Interwiki-Tabell ass eidel.",
+ 'interwiki-cached' => "D'Interwiki-Informatioune kommen aus dem Tëschespäicher. Et ass net méiglech den Tëschespäicher z'änneren.",
+ 'interwiki_edit' => 'Änneren',
+ 'interwiki_reasonfield' => 'Grond:',
+ 'interwiki_delquestion' => 'Läscht "$1"',
+ 'interwiki_deleting' => 'Dir läscht de Prefix "$1".',
+ 'interwiki_deleted' => 'De Prefix "$1" gouf aus der Interwiki-Tabell erausgeholl.',
+ 'interwiki_delfailed' => 'Prefix "$1" konnt net aus der Interwiki-Tabell erausgeholl ginn.',
+ 'interwiki_addtext' => 'En Interwiki-prefix derbäisetzen',
+ 'interwiki_addintro' => 'Dir setzt en neien Interwiki-Prefix derbäi.
+Denkt drunn datt keng Espacen ( ), Et-commerciale (&), Gläichzeechen (=) a keng Doppelpunkten (:) däerfen dra sinn.',
+ 'interwiki_addbutton' => 'Derbäisetzen',
+ 'interwiki_added' => 'De Prefix "$1" gou an d\'Interwiki-Tabell derbäigesat.',
+ 'interwiki_addfailed' => 'De Prefix "$1" konnt net an d\'Interwiki-Tabell derbäigesat ginn.
+Méiglecherweis gëtt et e schn an der Interwiki-Tabell.',
+ 'interwiki_edittext' => 'En interwiki Prefix änneren',
+ 'interwiki_editintro' => 'Dir ännert en Interwiki Prefix.
+Denkt drun, datt dat kann dozou féieren datt Linken déi et scho gëtt net méi fonctionnéieren.',
+ 'interwiki_edited' => 'De Prefix "$1" gouf an der Interwiki-Tabell geännert.',
+ 'interwiki_editerror' => 'De Prefix "$1" kann an der Interwiki-Tabell net geännert ginn.
+Méiglecherweis gëtt et en net.',
+ 'interwiki-badprefix' => 'Den Interwiki-Prefix "$1" huet net valabel Buchstawen',
+ 'interwiki-submit-empty' => "De Prefix an d'URL kënnen net eidel sinn.",
+ 'interwiki-submit-invalidurl' => 'De Protokoll vun der URL ass valabel.',
+ 'log-name-interwiki' => 'Lëscht mat der Interwikitabell',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|huet}} de Prefix "$4" ($5) (trans: $6; local: $7) an d\'Interwikitabell derbäigesat',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|huet}} de Prefix „$4“ ($5) (trans: $6; local: $7) an der Interwikitabell geännert',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|huet}} de Präfix "$4" aus der Interwikitabell erausgeholl',
+ 'log-description-interwiki' => 'Dëst ass eng Lëscht mat den Ännerunge vun der [[Special:Interwiki|Interwikitabell]].',
+ 'right-interwiki' => 'Interwiki-Daten änneren',
+ 'action-interwiki' => "dës Interwiki-Informatioun z'änneren",
+);
+
+/** Ganda (Luganda)
+ * @author Kizito
+ */
+$messages['lg'] = array(
+ 'interwiki_edit' => 'Kyusa',
+);
+
+/** Lithuanian (lietuvių)
+ * @author Eitvys200
+ * @author Homo
+ */
+$messages['lt'] = array(
+ 'interwiki' => 'Žiūrėti ir redaguoti interwiki duomenis',
+ 'interwiki-title-norights' => 'Žiūrėti interwiki duomenis',
+ 'interwiki-desc' => 'Prideda [[Special:Interwiki|specialųjį puslapį]] interwiki lentelei peržiūrėti ir redaguoti',
+ 'interwiki-legend-show' => 'Rodyti legendÄ…',
+ 'interwiki-legend-hide' => 'SlÄ—pti legendÄ…',
+ 'interwiki_local' => 'Persiųsti',
+ 'interwiki-local-label' => 'Persiųsti:', # Fuzzy
+ 'interwiki_1' => 'taip',
+ 'interwiki_0' => 'ne',
+ 'interwiki_edit' => 'Redaguoti',
+ 'interwiki_reasonfield' => 'Priežastis:',
+ 'interwiki_delquestion' => 'Trinama "$1"',
+ 'interwiki_addbutton' => 'PridÄ—ti',
+ 'log-description-interwiki' => 'Tai pakeitimų [[Special:Interwiki|interwiki lentelėje]] sąrašas',
+ 'right-interwiki' => 'Redaguoti interwiki duomenis',
+);
+
+/** Literary Chinese (文言)
+ * @author Dimension
+ */
+$messages['lzh'] = array(
+ 'interwiki' => '察與修跨維表',
+ 'interwiki-title-norights' => '察跨維',
+ 'interwiki_intro' => '閱[http://www.mediawiki.org/wiki/Interwiki_table MediaWiki.org]之。', # Fuzzy
+ 'interwiki_prefix' => 'å‰',
+ 'interwiki-prefix-label' => 'å‰:', # Fuzzy
+ 'interwiki_local' => '定為本維', # Fuzzy
+ 'interwiki-local-label' => '定為本維:', # Fuzzy
+ 'interwiki_trans' => '許跨維之å«', # Fuzzy
+ 'interwiki-trans-label' => '許跨維之å«:', # Fuzzy
+ 'interwiki_1' => '是',
+ 'interwiki_0' => 'å¦',
+ 'interwiki_error' => '錯:跨維為空,或它錯發生。',
+ 'interwiki_reasonfield' => '因:',
+ 'interwiki_delquestion' => 'ç¾åˆªã€Œ$1ã€',
+ 'interwiki_deleting' => '爾正刪「$1ã€ã€‚',
+ 'interwiki_deleted' => '已刪「$1ã€ã€‚',
+ 'interwiki_delfailed' => '無刪「$1ã€ã€‚',
+ 'interwiki_addtext' => '加跨維',
+ 'interwiki_addintro' => '爾正加新之跨。
+記無å«ç©ºï¼ˆ )ã€å†’(:)ã€é€£ï¼ˆ&),或等(=)。',
+ 'interwiki_addbutton' => '加',
+ 'interwiki_added' => '「$1ã€åŠ è‡³è·¨ç¶­ä¹Ÿã€‚',
+ 'interwiki_addfailed' => '「$1ã€ç„¡åŠ è·¨ç¶­ä¹Ÿã€‚
+或已存在之。',
+ 'interwiki_edittext' => '改跨維',
+ 'interwiki_editintro' => '爾正改跨維。
+記此能斷ç¾é€£ã€‚',
+ 'interwiki_edited' => '「$1ã€å·²æ”¹ä¹‹ã€‚',
+ 'interwiki_editerror' => '「$1ã€ç„¡æ”¹ä¹‹ã€‚
+無存。',
+ 'interwiki-badprefix' => '定之跨維å‰ã€Œ$1ã€å«æœ‰ç„¡æ•ˆä¹‹å­—也',
+ 'right-interwiki' => '改跨維',
+);
+
+/** Malagasy (Malagasy)
+ * @author Jagwar
+ */
+$messages['mg'] = array(
+ 'interwiki' => 'Hijery sy hikasika ny data interwiki',
+ 'interwiki-title-norights' => 'Hijery ny data interwiki',
+ 'interwiki-desc' => "Manampy [[Special:Interwiki|pejy manokana iray]] ho an'ny fijerena sy ho an'ny fanovana ny tabilao interwiki",
+ 'interwiki_intro' => "Ity dia topi-mason'ny tabilao interwiki.",
+ 'interwiki-legend-show' => 'Haneho ny maribolana',
+ 'interwiki-legend-hide' => 'Hanitrika ny maribolana',
+ 'interwiki_prefix' => 'Tovona',
+ 'interwiki-prefix-label' => 'Tovona',
+ 'interwiki_prefix_intro' => "Tovona ampiasaina anatin'i <code>[<nowiki />[tovona:<em>anaram-pejy</em>]]</code> ny rariteny wiki.",
+ 'interwiki_url' => 'URL',
+ 'interwiki-url-label' => 'URL:',
+ 'interwiki_url_intro' => "Endrika ho an'ny URL. Hovàna amin'ny <em>anaram-pejy</em> ny wikilahatsoratra i $1, rehefa ampiasaaina ny rariteny aseho eo ambony.",
+ 'interwiki_local' => 'Hanohy',
+ 'interwiki-local-label' => 'Hanohy',
+ 'interwiki_1' => 'eny',
+ 'interwiki_0' => 'tsia',
+ 'right-interwiki' => 'Manova ny data interwiki',
+);
+
+/** Eastern Mari (олык марий)
+ * @author Сай
+ */
+$messages['mhr'] = array(
+ 'interwiki_reasonfield' => 'Ðмал:',
+);
+
+/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ */
+$messages['min'] = array(
+ 'interwiki' => 'Caliak dan suntiang data interwiki',
+ 'interwiki-title-norights' => 'Caliak data interwiki',
+ 'interwiki-desc' => 'Menambahan [[Special:Interwiki|laman istimewa]] untuak manampilan jo manyuntiang tabel interwiki',
+ 'interwiki_intro' => 'Iko gambaran tabel interwiki.',
+ 'interwiki-legend-show' => 'Tunjuakan legenda',
+ 'interwiki-legend-hide' => 'Suruakan legenda',
+ 'interwiki_prefix' => 'Kode',
+ 'interwiki-prefix-label' => 'Kode:',
+ 'interwiki_prefix_intro' => 'Kode interwiki akan digunoan dalam <code>[<nowiki />[kode:<em>namo laman</em>]]</code> sintak teks wiki.',
+ 'interwiki_local' => 'Manaruihkan',
+ 'interwiki-local-label' => 'Manaruihkan:',
+ 'interwiki_trans' => 'Transklusi',
+ 'interwiki-trans-label' => 'Transklusi:',
+ 'interwiki_1' => 'yo',
+ 'interwiki_0' => 'indak',
+ 'interwiki_edit' => 'Suntiang',
+ 'interwiki_reasonfield' => 'Alasan:',
+ 'interwiki_delquestion' => 'Hapuih "$1"',
+ 'interwiki_addbutton' => 'Tambahkan',
+ 'right-interwiki' => 'Suntiang data interwiki',
+ 'action-interwiki' => 'ubah masuakan interwiki ko',
+);
+
+/** Macedonian (македонÑки)
+ * @author Bjankuloski06
+ */
+$messages['mk'] = array(
+ 'interwiki' => 'Преглед и уредување на меѓувики-податоци',
+ 'interwiki-title-norights' => 'Податоци за меѓувики',
+ 'interwiki-desc' => 'Додава [[Special:Interwiki|Ñпецијална Ñтраница]] за преглед и уредување на табелата Ñо меѓувики-врÑки',
+ 'interwiki_intro' => 'Ова е преглед на табелата Ñо меѓувики.',
+ 'interwiki-legend-show' => 'Прикажи легенда',
+ 'interwiki-legend-hide' => 'Скриј легенда',
+ 'interwiki_prefix' => 'ПрефикÑ',
+ 'interwiki-prefix-label' => 'ПрефикÑ:',
+ 'interwiki_prefix_intro' => 'Меѓувики-Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð·Ð° кориÑтење во ÑинтакÑата на викитекÑтот <code>[<nowiki />[префикÑ:<em>име на Ñтраница</em>]]</code>.',
+ 'interwiki_url' => 'URL',
+ 'interwiki-url-label' => 'URL:',
+ 'interwiki_url_intro' => 'Шаблон за URL-адреÑи. ÐамеÑто $1 ќе биде поÑтавено <em>име на Ñтраницата</em> на викитекÑтот, кога Ñе кориÑти гореÑпоменатата виктекÑÑ‚-ÑинтакÑа.',
+ 'interwiki_local' => 'Препратка',
+ 'interwiki-local-label' => 'Препратка:',
+ 'interwiki_local_intro' => 'HTTP-барање до локалното вики Ñо овој меѓувики-Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð²Ð¾ URL-адреÑата:',
+ 'interwiki_local_0_intro' => 'не Ñе почитува, туку обично Ñе блокира Ñо пораката „Ñтраницата не е пронајдена“,',
+ 'interwiki_local_1_intro' => 'Ñе пренаÑочува кон целната URL-адреÑа поÑочена во дефинициите на меѓувики-врÑките (Ñ‚.е. Ñе третираат како наводите на локалните Ñтраници)',
+ 'interwiki_trans' => 'Превметнување',
+ 'interwiki-trans-label' => 'Превметнување:',
+ 'interwiki_trans_intro' => 'Ðко Ñе кориÑти викитекÑÑ‚-ÑинтакÑата <code>{<nowiki />{префикÑ:<em>име на Ñтраница</em>}}</code>, тогаш:',
+ 'interwiki_trans_1_intro' => 'дозволи превметнување од други викија, ако тоа е начелно дозволено на ова вики,',
+ 'interwiki_trans_0_intro' => 'не дозволувај, туку барај Ñтраница во шаблонÑкиот именÑки проÑтор.',
+ 'interwiki_intro_footer' => 'Погледајте ја Ñтраницата [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] за повеќе информации за меѓувики-табелата.
+ПоÑтои [[Special:Log/interwiki|дневник на промени]] во меѓувики-табелата.',
+ 'interwiki_1' => 'да',
+ 'interwiki_0' => 'не',
+ 'interwiki_error' => 'Грешка: Mеѓувики-табелата е празна, или нешто друго не е во ред.',
+ 'interwiki-cached' => 'Податоците за меѓувики Ñе кеширани. Кешот не може да Ñе измени.',
+ 'interwiki_edit' => 'Уреди',
+ 'interwiki_reasonfield' => 'Причина:',
+ 'interwiki_delquestion' => 'Бришење на „$1“',
+ 'interwiki_deleting' => 'Ја бришете претÑтавката „$1“.',
+ 'interwiki_deleted' => 'ПретÑтавката „$1“ е уÑпешно отÑтранета од табелата Ñо меѓувики.',
+ 'interwiki_delfailed' => 'ПретÑтавката „$1“ не можеше да Ñе отÑтрани од табелата Ñо меѓувики.',
+ 'interwiki_addtext' => 'Додај меѓувики-префикÑ',
+ 'interwiki_addintro' => 'Запомнете дека не Ñмее да Ñодржи празни проÑтори ( ), две точки (:), амперÑанди (&) и знаци на равенÑтво (=).',
+ 'interwiki_addbutton' => 'Додај',
+ 'interwiki_added' => 'ПретÑтавката „$1“ е уÑпешно додадена кон табелата Ñо меѓувики',
+ 'interwiki_addfailed' => 'ПретÑтавката „$1“ не можеше да Ñе додаде во табелата Ñо меѓувики.
+Веројатно таму веќе поÑтои.',
+ 'interwiki_edittext' => 'Уредување на меѓувики-префикÑ',
+ 'interwiki_editintro' => 'Уредувате меѓувики-префикÑ.
+Запомнете дека ова може да ги раÑкине поÑтоечките врÑки.',
+ 'interwiki_edited' => 'ПретÑтавката „$1“ е уÑпешно изменет во табелата Ñо меѓувики.',
+ 'interwiki_editerror' => 'ПретÑтавката „$1“ не може да Ñе менува во табелата Ñо меѓувики.
+Можеби не поÑтои.',
+ 'interwiki-badprefix' => 'Ðазначениот меѓувики-Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ â€ž$1“ Ñодржи неважечки знаци',
+ 'interwiki-submit-empty' => 'ПретÑтавката и URL-адреÑата не можат да бидат празни.',
+ 'interwiki-submit-invalidurl' => 'Протоколот на URL-адреÑата е неважечки.',
+ 'log-name-interwiki' => 'Дневник на измени во табелата Ñо меѓувики',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|ја додаде}} претÑтавката „$4“ ($5) (trans: $6; local: $7) во табелата Ñо меѓувики',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|ја измени}} претÑтавката „$4“ ($5) (trans: $6; local: $7) во табелата Ñо меѓувики',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|ја отÑтрани}} претÑтавката „$4“ од табелата Ñо меѓувики',
+ 'log-description-interwiki' => 'Ова е дневник на промени во [[Special:Interwiki|табелата Ñо меѓувики]].',
+ 'right-interwiki' => 'Уреди меѓувики',
+ 'action-interwiki' => 'менување на овој меѓувики-запиÑ',
+);
+
+/** Malayalam (മലയാളം)
+ * @author Praveenp
+ * @author Shijualex
+ */
+$messages['ml'] = array(
+ 'interwiki' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ വിവരങàµà´™àµ¾ കാണàµà´•à´¯àµà´‚ തിരàµà´¤àµà´¤àµà´•à´¯àµà´‚ ചെയàµà´¯àµà´•',
+ 'interwiki-title-norights' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ വിവരങàµà´™àµ¾ കാണàµà´•',
+ 'interwiki-desc' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´• കാണാനàµà´‚ തിരàµà´¤àµà´¤à´¾à´¨àµà´®àµà´³àµà´³ [[Special:Interwiki|à´ªàµà´°à´¤àµà´¯àµ‡à´• താൾ]] കൂടàµà´Ÿà´¿à´šàµà´šàµ‡àµ¼à´•àµà´•àµà´¨àµà´¨àµ',
+ 'interwiki_intro' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯àµà´Ÿàµ† അവലോകനം ഇവിടെ കാണാം.',
+ 'interwiki-legend-show' => 'സൂചനകൾ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•àµà´•',
+ 'interwiki-legend-hide' => 'സൂചനകൾ മറയàµà´•àµà´•àµà´•',
+ 'interwiki_prefix' => 'പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾',
+ 'interwiki-prefix-label' => 'പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾:',
+ 'interwiki_prefix_intro' => 'വികàµà´•à´¿à´Žà´´àµà´¤àµà´¤àµ രീതിയിൽ ഉപയോഗികàµà´•àµà´¨àµà´¨ <code>[<nowiki />[പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾:<em>താളിനàµà´±àµ†_പേരàµ</em>]]</code> à´Žà´¨àµà´¨à´¤à´¿à´²àµ† à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾.',
+ 'interwiki_url_intro' => 'യൂ.ആർ.à´Žà´²àµà´•àµ¾à´•àµà´•àµà´³àµà´³ ഫലകം. à´®àµà´•à´³à´¿àµ½ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ പോലàµà´³àµà´³ വികàµà´•à´¿ à´Žà´´àµà´¤àµà´¤àµ രീതി ഉപയോഗികàµà´•àµà´®àµà´ªàµ‹àµ¾, $1 à´Žà´¨àµà´¨ à´šà´°à´‚ വികàµà´•à´¿ à´Žà´´àµà´¤àµà´¤à´¿à´²àµ† <em>താളിനàµà´±àµ†_പേരàµ</em> ഉപയോഗിചàµà´šàµ മാറàµà´±à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨à´¤à´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´‚.',
+ 'interwiki_local' => 'ഗമനം',
+ 'interwiki-local-label' => 'ഗമനം:',
+ 'interwiki_local_intro' => 'ഉപയോഗിചàµà´šàµà´•àµŠà´£àµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ വികàµà´•à´¿à´¯à´¿àµ½ à´ˆ à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ ഉപയോഗിചàµà´šà´¾àµ½ ലഭികàµà´•àµ‡à´£àµà´Ÿ യൂ.ആർ.എൽ. ഉപയോഗിചàµà´šàµ ഒരൠഎചàµà´šàµ.à´±àµà´±à´¿.à´±àµà´±à´¿.പി. à´…à´­àµà´¯àµ¼à´¤àµà´¥à´¨:',
+ 'interwiki_local_0_intro' => 'നടതàµà´¤à´¿à´²àµà´², "താൾ à´•à´£àµà´Ÿàµ†à´¤àµà´¤à´¾à´¨à´¾à´¯à´¿à´²àµà´²" à´Žà´¨àµà´¨ സനàµà´¦àµ‡à´¶à´‚ ഉപയോഗിചàµà´šàµ തടയപàµà´ªàµ†à´Ÿàµà´‚.',
+ 'interwiki_local_1_intro' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ à´•à´£àµà´£à´¿ നിർവàµà´µà´šà´¨à´™àµà´™àµ¾à´•àµà´•à´¨àµà´¸à´°à´¿à´šàµà´šàµ ലകàµà´·àµà´¯ യൂ.ആർ.എലിലേയàµà´•àµà´•àµ തിരിചàµà´šàµà´µà´¿à´Ÿàµà´‚ (അതായതൠവികàµà´•à´¿à´¯à´¿à´²àµ† താളàµà´•à´³à´¿à´²àµ† അവലംബങàµà´™àµ¾ കൈകാരàµà´¯à´‚ ചെയàµà´¯àµà´¨àµà´¨à´¤àµ പോലെ).',
+ 'interwiki_trans' => 'ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½',
+ 'interwiki-trans-label' => 'ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:',
+ 'interwiki_trans_intro' => 'വികàµà´•à´¿ à´Žà´´àµà´¤àµà´¤àµ രീതി <code>{<nowiki />{പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾:<em>താളിനàµà´±àµ†_പേരàµ</em>}}</code> ഉപയോഗിചàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½:',
+ 'interwiki_trans_1_intro' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²àµà´•àµ¾ à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ പൊതàµà´µàµ‡ à´…à´¨àµà´µà´¦à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ†à´™àµà´•à´¿àµ½, ബാഹàµà´¯ വികàµà´•à´¿à´¯à´¿àµ½ നിനàµà´¨àµà´³àµà´³ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´•.',
+ 'interwiki_trans_0_intro' => 'à´…à´¨àµà´µà´¦à´¿à´•àµà´•à´°àµà´¤àµ, പകരം ഫലകം നാമമേഖലയിൽ താളിനായി നോകàµà´•àµà´•.',
+ 'interwiki_intro_footer' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯àµ†à´•àµà´•àµà´±à´¿à´šàµà´šàµà´³àµà´³ കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾à´•àµà´•àµ [//www.mediawiki.org/wiki/Manual:Interwiki_table മീഡിയവികàµà´•à´¿.ഓർഗàµ] കാണàµà´•. à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯àµà´Ÿàµ† [[Special:Log/interwiki|മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† രേഖയàµà´‚]] കാണàµà´•.',
+ 'interwiki_1' => 'ഉണàµà´Ÿàµ',
+ 'interwiki_0' => 'ഇലàµà´²',
+ 'interwiki_error' => 'പിഴവàµ: à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ à´•à´£àµà´£à´¿ ശൂനàµà´¯à´®à´¾à´£àµ, à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ മറàµà´±àµ†à´¨àµà´¤àµ‹ à´ªàµà´°à´¶àµà´¨à´®àµà´£àµà´Ÿàµ.',
+ 'interwiki-cached' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ വിവരങàµà´™àµ¾ കാഷൠചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´•à´¯à´¾à´£àµ. കാഷൠപàµà´¤àµà´•àµà´•àµ½ സാദàµà´§àµà´¯à´®à´²àµà´².',
+ 'interwiki_edit' => 'തിരàµà´¤àµà´¤àµà´•',
+ 'interwiki_reasonfield' => 'കാരണം:',
+ 'interwiki_delquestion' => '"$1" മായàµà´•àµà´•àµà´¨àµà´¨àµ',
+ 'interwiki_deleting' => 'താങàµà´•àµ¾ "$1" à´Žà´¨àµà´¨ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ നീകàµà´•à´‚ ചെയàµà´¯àµà´•à´¯à´¾à´£àµ.',
+ 'interwiki_deleted' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ നിനàµà´¨àµ "$1" à´Žà´¨àµà´¨ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ വിജയകരമായി നീകàµà´•à´‚ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+ 'interwiki_delfailed' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ നിനàµà´¨àµ "$1" à´Žà´¨àµà´¨ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ നീകàµà´•à´‚ ചെയàµà´¯à´¾àµ» കഴിയിലàµà´².',
+ 'interwiki_addtext' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പൂർവàµà´µà´¾à´•àµà´·à´°à´‚ ചേർകàµà´•àµà´•',
+ 'interwiki_addintro' => 'താങàµà´•àµ¾ à´ªàµà´¤à´¿à´¯ à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പൂർവàµà´µà´¾à´•àµà´·à´°à´‚ ചേർകàµà´•àµà´•à´¯à´¾à´£àµ.
+അതിൽ ഇട ( ), അപൂർണàµà´£à´µà´¿à´°à´¾à´®à´‚ (:), ആമàµà´ªàµ¼à´¸à´¾àµ»à´¡àµà´¸àµ (&), à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ സമചിഹàµà´¨à´‚ (=) à´Žà´¨àµà´¨à´¿à´µ പാടിലàµà´²àµ†à´¨àµà´¨àµ ഓർമàµà´®à´¿à´•àµà´•àµà´•.',
+ 'interwiki_addbutton' => 'ചേർകàµà´•àµà´•',
+ 'interwiki_added' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ "$1" à´Žà´¨àµà´¨ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ വിജയകരമായി ചേർതàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+ 'interwiki_addfailed' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ "$1" à´Žà´¨àµà´¨ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ ചേർകàµà´•à´¾à´¨à´¾à´¯à´¿à´²àµà´².
+മികàµà´•à´µà´¾à´±àµà´‚ അതൠഅനàµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ à´®àµà´®àµà´ªàµ‡ നിലവിലàµà´£àµà´Ÿà´¾à´•àµà´‚.',
+ 'interwiki_edittext' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ തിരàµà´¤àµà´¤àµà´¨àµà´¨àµ',
+ 'interwiki_editintro' => 'താങàµà´•àµ¾ à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ തിരàµà´¤àµà´¤àµà´•à´¯à´¾à´£àµ.
+ഇതൠനിലവിലàµà´³àµà´³ à´•à´£àµà´£à´¿à´•à´³àµ† ബാധിചàµà´šàµ‡à´•àµà´•à´¾à´‚ à´Žà´¨àµà´¨àµ‹àµ¼à´®àµà´®à´¿à´•àµà´•àµà´•.',
+ 'interwiki_edited' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ "$1" à´Žà´¨àµà´¨ പൂർവàµà´µà´•àµà´·à´°à´™àµà´™àµ¾ വിജയകരമായി à´ªàµà´¤àµà´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+ 'interwiki_editerror' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ "$1" à´Žà´¨àµà´¨ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ തിരàµà´¤àµà´¤à´¾à´¨à´¾à´¯à´¿à´²àµà´².
+മികàµà´•à´µà´¾à´±àµà´‚ അതൠനിലവിലàµà´£àµà´Ÿà´¾à´•à´¿à´²àµà´².',
+ 'interwiki-badprefix' => 'നൽകിയ à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ "$1" അസാധàµà´µà´¾à´¯ à´…à´•àµà´·à´°à´™àµà´™àµ¾ ഉൾകàµà´•àµŠà´³àµà´³àµà´¨àµà´¨àµ',
+ 'interwiki-submit-empty' => 'പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™à´³àµà´‚ യൂ.ആർ.à´Žà´²àµà´‚. ശൂനàµà´¯à´®à´¾à´¯à´¿à´°à´¿à´•àµà´•à´¾àµ» പാടിലàµà´².',
+ 'log-name-interwiki' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯àµà´Ÿàµ† രേഖ',
+ 'logentry-interwiki-iw_add' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ നിനàµà´¨àµà´‚ "$4" ($5) (ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½: $6; à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´‚: $7) à´Žà´¨àµà´¨ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ $1 {{GENDER:$2|കൂടàµà´Ÿà´¿à´šàµà´šàµ‡àµ¼à´¤àµà´¤àµ}}',
+ 'logentry-interwiki-iw_edit' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ നിനàµà´¨àµà´‚ "$4" ($5) (ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½: $6; à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´‚: $7) à´Žà´¨àµà´¨ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ $1 {{GENDER:$2|à´ªàµà´¤àµà´•àµà´•à´¿}}',
+ 'logentry-interwiki-iw_delete' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ നിനàµà´¨àµà´‚ "$4" à´Žà´¨àµà´¨ പൂർവàµà´µà´¾à´•àµà´·à´°à´™àµà´™àµ¾ $1 {{GENDER:$2|നീകàµà´•à´‚ ചെയàµà´¤àµ}}',
+ 'log-description-interwiki' => 'ഇതൠ[[Special:Interwiki|à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿à´²àµ†]] മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† രേഖയാണàµ.',
+ 'right-interwiki' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ വിവരങàµà´™àµ¾ തിരàµà´¤àµà´¤àµà´•',
+ 'action-interwiki' => 'à´ˆ à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²à´¿àµ½ മാറàµà´±à´‚ വരàµà´¤àµà´¤àµà´•',
+);
+
+/** Mongolian (монгол)
+ * @author Chinneeb
+ */
+$messages['mn'] = array(
+ 'interwiki_1' => 'тийм',
+ 'interwiki_0' => 'үгүй',
+ 'interwiki_reasonfield' => 'Шалтгаан:',
+ 'interwiki_addbutton' => 'ÐÑмÑÑ…',
+);
+
+/** Marathi (मराठी)
+ * @author Kaustubh
+ */
+$messages['mr'] = array(
+ 'interwiki' => 'आंतरविकि डाटा पहा व संपादा',
+ 'interwiki-title-norights' => 'अंतरविकि डाटा पहा',
+ 'interwiki-desc' => 'आंतरविकि सारणी पाहणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ व संपादनà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ à¤à¤• [[Special:Interwiki|विशेष पान]] वाढविते',
+ 'interwiki_intro' => 'आंतरविकि सारणी बदà¥à¤¦à¤² अधिक माहीतीसाठी [http://www.mediawiki.org/wiki/Interwiki_table MediaWiki.org] पहा.', # Fuzzy
+ 'interwiki_prefix' => 'उपपद (पूरà¥à¤µà¤ªà¥à¤°à¤¤à¥à¤¯à¤¯)',
+ 'interwiki-prefix-label' => 'उपपद (पूरà¥à¤µà¤ªà¥à¤°à¤¤à¥à¤¯à¤¯):', # Fuzzy
+ 'interwiki_error' => 'तà¥à¤°à¥à¤Ÿà¥€: आंतरविकि सारणी रिकामी आहे, किंवा इतर काहीतरी चà¥à¤•à¤²à¥‡à¤²à¥‡ आहे.',
+ 'interwiki_reasonfield' => 'कारण:',
+ 'interwiki_delquestion' => '"$1" वगळत आहे',
+ 'interwiki_deleting' => 'तà¥à¤®à¥à¤¹à¥€ "$1" उपपद वगळत आहात.',
+ 'interwiki_deleted' => '"$1" उपपद आंतरविकि सारणीमधून वगळणà¥à¤¯à¤¾à¤¤ आलेले आहे.',
+ 'interwiki_delfailed' => '"$1" उपपद आंतरविकि सारणीतून वगळता आलेले नाही.',
+ 'interwiki_addtext' => 'à¤à¤• आंतरविकि उपपद वाढवा',
+ 'interwiki_addintro' => 'तà¥à¤®à¥à¤¹à¥€ à¤à¤• नवीन आंतरविकि उपपद वाढवित आहात. कृपया लकà¥à¤·à¤¾à¤¤ घà¥à¤¯à¤¾ की तà¥à¤¯à¤¾à¤®à¤§à¥à¤¯à¥‡ सà¥à¤ªà¥‡à¤¸ ( ), विसरà¥à¤— (:), आणिचिनà¥à¤¹ (&), किंवा बरोबरची खूण (=) असू शकत नाही.',
+ 'interwiki_addbutton' => 'वाढवा',
+ 'interwiki_added' => '"$1" उपपद आंतरविकि सारणी मधà¥à¤¯à¥‡ वाढविणà¥à¤¯à¤¾à¤¤ आलेले आहे.',
+ 'interwiki_addfailed' => '"$1" उपपद आंतरविकि सारणी मधà¥à¤¯à¥‡ वाढवू शकलेलो नाही. कदाचित ते अगोदरच असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ असणà¥à¤¯à¤¾à¤šà¥€ शकà¥à¤¯à¤¤à¤¾ आहे.',
+ 'interwiki_edittext' => 'à¤à¤• अंतरविकि उपपद संपादित आहे',
+ 'interwiki_editintro' => 'तà¥à¤®à¥à¤¹à¥€ à¤à¤• अंतरविकि उपपद संपादित आहात.
+लकà¥à¤·à¤¾à¤¤ ठेवा की यामà¥à¤³à¥‡ अगोदर दिलेले दà¥à¤µà¥‡ तà¥à¤Ÿà¥‚ शकतात.',
+ 'interwiki_edited' => 'अंतरविकि सारणीमधà¥à¤¯à¥‡ "$1" उपपद यशसà¥à¤µà¥€à¤°à¤¿à¤¤à¥à¤¯à¤¾ बदलणà¥à¤¯à¤¾à¤¤ आलेले आहे.',
+ 'interwiki_editerror' => 'अंतरविकि सारणीमधà¥à¤¯à¥‡ "$1" उपपद बदलू शकत नाही.
+कदाचित ते असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नसेल.',
+ 'log-name-interwiki' => 'आंतरविकि सारणी नोंद',
+ 'log-description-interwiki' => '[[Special:Interwiki|आंतरविकि सारणीत]] à¤à¤¾à¤²à¥‡à¤²à¥à¤¯à¤¾ बदलांची ही सूची आहे.',
+ 'right-interwiki' => 'आंतरविकि डाटा बदला',
+);
+
+/** Malay (Bahasa Melayu)
+ * @author Anakmalaysia
+ * @author Aurora
+ * @author Aviator
+ * @author Diagramma Della Verita
+ */
+$messages['ms'] = array(
+ 'interwiki' => 'Lihat dan ubah data interwiki',
+ 'interwiki-title-norights' => 'Lihat data interwiki',
+ 'interwiki-desc' => 'Menambahkan [[Special:Interwiki|laman khas]] untuk melihat dan menyunting jadual interwiki',
+ 'interwiki_intro' => 'Ini merupakan gambaran keseluruhan jadual interwiki.',
+ 'interwiki-legend-show' => 'Tunjukkan petunjuk',
+ 'interwiki-legend-hide' => 'Sorokkan petunjuk',
+ 'interwiki_prefix' => 'Awalan',
+ 'interwiki-prefix-label' => 'Awalan:',
+ 'interwiki_prefix_intro' => 'Awalan interwiki yang hendak digunakan dalam sintaks teks wiki <code>[<nowiki />[awalan:<em>nama laman</em>]]</code>.',
+ 'interwiki_url_intro' => 'Templat untuk URL. Pemegang tempat $1 akan diganti dengan <em>nama laman</em> wikiteks, apabila sintaks teks wiki yang dinyatakan di atas digunakan.',
+ 'interwiki_local' => 'Kirim semula',
+ 'interwiki-local-label' => 'Kirim semula:',
+ 'interwiki_local_intro' => 'Permohonan HTTP kepada wiki tempatan dengan awalan interwiki ini dalam URL ialah:',
+ 'interwiki_local_0_intro' => 'tidak dilunaskan, biasanya disekat oleh "laman tidak dijumpai",',
+ 'interwiki_local_1_intro' => 'dilencongkan ke URL sasaran yang diberikan dalam takrifan pautan interwiki (iaitu dilayan seperti rujukan dalam laman tempatan)',
+ 'interwiki_trans' => 'Transklusi',
+ 'interwiki-trans-label' => 'Transklusi:',
+ 'interwiki_trans_intro' => 'Jika sintaks teks wiki <code>{<nowiki />{awalan:<em>nama laman</em>}}</code> digunakan, maka:',
+ 'interwiki_trans_1_intro' => 'benarkan transklusi dari wiki luar, jika transklusi interwiki pada umumnya dibenarkan dalam wiki ini,',
+ 'interwiki_trans_0_intro' => 'jangan benarkan, sebaliknya cari suatu laman dalam ruang nama templat.',
+ 'interwiki_intro_footer' => 'Lihat [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] untuk maklumat lanjut mengenai jadual interwiki.
+Terdapat [[Special:Log/interwiki|log perubahan]] pada jadual interwiki.',
+ 'interwiki_1' => 'ya',
+ 'interwiki_0' => 'tidak',
+ 'interwiki_error' => 'Ralat: Jadual interwiki kosong atau sesuatu yang tidak kena berlaku.',
+ 'interwiki-cached' => 'Data interwiki sudah dicachekan. Cache tidak boleh diubah suai.',
+ 'interwiki_edit' => 'Sunting',
+ 'interwiki_reasonfield' => 'Sebab:',
+ 'interwiki_delquestion' => 'Menghapuskan "$1"',
+ 'interwiki_deleting' => 'Anda sedang menghapuskan awalan "$1".',
+ 'interwiki_deleted' => 'Awalan "$1" telah dibuang daripada jadual interwiki.',
+ 'interwiki_delfailed' => 'Awalan "$1" tidak dapat dibuang daripada jadual interwiki.',
+ 'interwiki_addtext' => 'Tambah awalan interwiki',
+ 'interwiki_addintro' => 'Anda sedang menambah awalan interwiki baru. Sila ingat bahawa awalan interwiki tidak boleh mangandungi jarak ( ), noktah bertindih (:), ampersan (&), atau tanda sama (=).',
+ 'interwiki_addbutton' => 'Tambahkan',
+ 'interwiki_added' => 'Awalan "$1" telah ditambah ke dalam jadual interwiki.',
+ 'interwiki_addfailed' => 'Awalan "$1" tidak dapat ditambah ke dalam jadual interwiki. Barangkali awalan ini telah pun wujud dalam jadual interwiki.',
+ 'interwiki_edittext' => 'Mengubah awalan interwiki',
+ 'interwiki_editintro' => 'Anda sedang mengubah suatu awalan interwiki. Sila ingat bahawa perbuatan ini boleh merosakkan pautan-pautan yang sudah ada.',
+ 'interwiki_edited' => 'Awalan "$1" telah diubah dalam jadual interwiki.',
+ 'interwiki_editerror' => 'Awalan "$1" tidak boleh diubah dalam jadual interwiki. Barangkali awalan ini tidak wujud.',
+ 'interwiki-badprefix' => 'Awalan interwiki yang dinyatakan, "$1" mengandungi aksara yang tidak sah',
+ 'interwiki-submit-empty' => 'Awalan dan URL tidak boleh dibiarkan kosong.',
+ 'interwiki-submit-invalidurl' => 'Protokol URL itu tidak sah.',
+ 'log-name-interwiki' => 'Log maklumat Interwiki',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|membubuh}} awalan "$4" ($5) (trans: $6; setempat: $7) pada jadual interwiki',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|mengubah suai}} awalan "$4" ($5) (trans: $6; setempat: $7) pada jadual interwiki',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|membuang}} awalan "$4" daripada jadual interwiki',
+ 'log-description-interwiki' => 'Ini ialah log perubahan kepada [[Special:Interwiki|jadual interwiki]].',
+ 'right-interwiki' => 'Menyunting data interwiki',
+ 'action-interwiki' => 'tukar data interwiki berikut',
+);
+
+/** Maltese (Malti)
+ * @author Chrisportelli
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['mt'] = array(
+ 'interwiki-legend-show' => 'Uri l-leġġenda',
+ 'interwiki-legend-hide' => 'Aħbi l-leġġenda',
+ 'interwiki_prefix' => 'Prefiss',
+ 'interwiki-prefix-label' => 'Prefiss:',
+ 'interwiki_1' => 'iva',
+ 'interwiki_0' => 'le',
+ 'interwiki_edit' => 'Editja',
+ 'interwiki_reasonfield' => 'Raġuni:',
+ 'interwiki_addbutton' => 'Żid',
+ 'interwiki_added' => 'Il-prefiss "$1" ġie miżjud b\'suċċess fit-tabella tal-interwiki.',
+ 'interwiki_addfailed' => 'Il-prefiss "$1" ma setax jiġi miżjud mat-tabella tal-interwiki.
+Probabbilment dan diġà jeżisti fit-tabella.',
+);
+
+/** Erzya (ÑрзÑнь)
+ * @author Botuzhaleny-sodamo
+ */
+$messages['myv'] = array(
+ 'interwiki_prefix' => 'Ð˜ÐºÐµÐ»ÑŒÐºÑ Ð¿ÐµÐ½Ðµ',
+ 'interwiki-prefix-label' => 'Ð˜ÐºÐµÐ»ÑŒÐºÑ Ð¿ÐµÐ½ÐµÐ·Ñ:',
+ 'interwiki_local' => 'ПачтÑÐ¼Ñ Ñеде тов',
+ 'interwiki-local-label' => 'ПачтÑÐ¼Ñ Ñеде тов:',
+ 'interwiki_edit' => 'Витнеме-петнеме',
+ 'interwiki_reasonfield' => 'ТувталоÑÑŒ:',
+ 'interwiki_addbutton' => 'ПоладомÑ',
+);
+
+/** Mazanderani (مازÙرونی)
+ * @author محک
+ */
+$messages['mzn'] = array(
+ 'interwiki_edit' => 'دچی‌ین',
+);
+
+/** Nahuatl (NÄhuatl)
+ * @author Fluence
+ */
+$messages['nah'] = array(
+ 'interwiki_reasonfield' => 'Īxtlamatiliztli:',
+ 'interwiki_delquestion' => 'Mopolocah "$1"',
+ 'interwiki_addbutton' => 'Ticcētilīz',
+);
+
+/** Norwegian Bokmål (norsk (bokmål)‎)
+ * @author Event
+ * @author Nghtwlkr
+ * @author Purodha
+ */
+$messages['nb'] = array(
+ 'interwiki' => 'Vis og manipuler interwikidata',
+ 'interwiki-title-norights' => 'Vis interwikidata',
+ 'interwiki-desc' => 'Legger til en [[Special:Interwiki|spesialside]] som gjør at man kan se og redigere interwiki-tabellen.',
+ 'interwiki_intro' => 'Dette er en oversikt over interwikitabellen.',
+ 'interwiki-legend-show' => 'Vis betydninger',
+ 'interwiki-legend-hide' => 'Skjul betydninger',
+ 'interwiki_prefix' => 'Prefiks',
+ 'interwiki-prefix-label' => 'Prefiks:',
+ 'interwiki_prefix_intro' => 'Interwikiprefiks som skal brukes i <code>[<nowiki />[prefiks:<em>sidenavn</em>]]</code>-wikisyntaks.',
+ 'interwiki_url_intro' => 'Mal for internettadresser. Variabelen $1 vil bli erstattet av <em>sidenavnet</em> i wikiteksten når wikisyntaksen ovenfor blir brukt.',
+ 'interwiki_local' => 'Videresend',
+ 'interwiki-local-label' => 'Videresend:',
+ 'interwiki_local_intro' => 'En HTTP-forespørsel til den lokale wikien med dette interwikiprefikset i internettadressen er:',
+ 'interwiki_local_0_intro' => 'ikke fulgt, vanligvis blokkert av «siden ble ikke funnet»,',
+ 'interwiki_local_1_intro' => 'omdirigert til målnettadressen gitt i interwikilenkedefinisjonene (med andre ord behandlet som referanser på lokale sider)',
+ 'interwiki_trans' => 'Transkluder',
+ 'interwiki-trans-label' => 'Transkluder:',
+ 'interwiki_trans_intro' => 'Dersom wikisyntaksen <code>{<nowiki />{prefiks:<em>sidenavn</em>}}</code> blir brukt, så:',
+ 'interwiki_trans_1_intro' => 'tillat transklusjon fra en fremmed wiki, om interwikitranskluderinger generellt er tillatt på denne wikien,',
+ 'interwiki_trans_0_intro' => 'ikke tillat det, se heller etter en side i malnavnerommet.',
+ 'interwiki_intro_footer' => 'Se [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] for mer informasjon om interwikitabellen.
+Det finnes en [[Special:Log/interwiki|endringslogg]] for interwikitabellen.',
+ 'interwiki_1' => 'ja',
+ 'interwiki_0' => 'nei',
+ 'interwiki_error' => 'FEIL: Interwikitabellen er tom, eller noe gikk gærent.',
+ 'interwiki-cached' => 'Interwiki-datene er cachet. Ã… endre cachen er ikke mulig.',
+ 'interwiki_edit' => 'Rediger',
+ 'interwiki_reasonfield' => 'Ã…rsak:',
+ 'interwiki_delquestion' => 'Sletter «$1»',
+ 'interwiki_deleting' => 'Du sletter prefikset «$1».',
+ 'interwiki_deleted' => 'Prefikset «$1» ble fjernet fra interwikitabellen.',
+ 'interwiki_delfailed' => 'Prefikset «$1» kunne ikke fjernes fra interwikitabellen.',
+ 'interwiki_addtext' => 'Legg til et interwikiprefiks.',
+ 'interwiki_addintro' => 'Du legger til et nytt interwikiprefiks. Husk at det ikke kan inneholde mellomrom ( ), kolon (:), &-tegn eller likhetstegn (=).',
+ 'interwiki_addbutton' => 'Legg til',
+ 'interwiki_added' => 'Prefikset «$1» ble lagt til i interwikitabellen.',
+ 'interwiki_addfailed' => 'Prefikset «$1» kunne ikke legges til i interwikitabellen. Det er kanskje brukt der fra før.',
+ 'interwiki_edittext' => 'Redigerer et interwikiprefiks',
+ 'interwiki_editintro' => 'Du redigerer et interwikiprefiks. Merk at dette kan ødelegge eksisterende lenker.',
+ 'interwiki_edited' => 'Prefikset «$1» ble endret i interwikitabellen.',
+ 'interwiki_editerror' => 'Prefikset «$1» kan ikke endres i interwikitabellen. Det finnes muligens ikke.',
+ 'interwiki-badprefix' => 'Det oppgitte interwikiprefikset «$1» innholder ugyldige tegn',
+ 'interwiki-submit-empty' => 'Prefiksen og URL kan ikke være tomme.',
+ 'interwiki-submit-invalidurl' => 'URL-protokollen er ugyldig.',
+ 'log-name-interwiki' => 'Interwikitabellogg',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|la inn}} prefiks "$4" ($5) (oversatt: $6; lokal: $7) til interwiki-tabellen',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|endret}} prefiks "$4" ($5) (oversatt: $6; lokal: $7) i interwiki-tabellen',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|fjernet}} prefiks "$4" fra interwiki-tabellen',
+ 'log-description-interwiki' => 'Dette er en logg over endringer i [[Special:Interwiki|interwikitabellen]].',
+ 'right-interwiki' => 'Redigere interwikidata',
+ 'action-interwiki' => 'endre dette interwikielementet',
+);
+
+/** Low German (Plattdüütsch)
+ * @author Purodha
+ * @author Slomox
+ */
+$messages['nds'] = array(
+ 'interwiki_intro' => 'Disse Sied gifft en Överblick över de Interwiki-Tabell.',
+ 'interwiki_prefix' => 'Präfix',
+ 'interwiki-prefix-label' => 'Präfix:', # Fuzzy
+ 'interwiki_local' => 'Wiederleiden to en anner Wiki',
+ 'interwiki-local-label' => 'Wiederleiden to en anner Wiki:', # Fuzzy
+ 'interwiki_trans' => 'Inbinnen över Interwiki verlöven',
+ 'interwiki-trans-label' => 'Inbinnen över Interwiki verlöven:', # Fuzzy
+ 'interwiki_1' => 'jo',
+ 'interwiki_0' => 'nee',
+ 'interwiki_error' => 'De Interwiki-Tabell is leddig, oder wat anners is verkehrt lopen.',
+ 'interwiki_edit' => 'Ännern',
+ 'interwiki_reasonfield' => 'Grund:',
+ 'interwiki_delquestion' => '„$1“ warrt rutsmeten',
+ 'interwiki_addtext' => 'Interwiki-Präfix tofögen',
+ 'interwiki_addbutton' => 'Tofögen',
+ 'right-interwiki' => 'Interwiki-Tabell ännern',
+ 'action-interwiki' => 'dissen Indrag in de Interwiki-Tabell ännern',
+);
+
+/** Nedersaksies (Nedersaksies)
+ * @author Servien
+ */
+$messages['nds-nl'] = array(
+ 'interwiki_addbutton' => 'Derbie doon',
+);
+
+/** Niuean (ko e vagahau Niuē)
+ * @author Jose77
+ */
+$messages['niu'] = array(
+ 'interwiki_reasonfield' => 'Kakano:',
+);
+
+/** Dutch (Nederlands)
+ * @author SPQRobin
+ * @author Siebrand
+ * @author Tvdm
+ */
+$messages['nl'] = array(
+ 'interwiki' => 'Interwikigegevens bekijken en wijzigen',
+ 'interwiki-title-norights' => 'Interwikigegevens bekijken',
+ 'interwiki-desc' => 'Voegt een [[Special:Interwiki|speciale pagina]] toe om de interwikitabel te bekijken en bewerken',
+ 'interwiki_intro' => 'Dit is een overzicht van de interwikitabel.',
+ 'interwiki-legend-show' => 'Legenda weergeven',
+ 'interwiki-legend-hide' => 'Legenda verbergen',
+ 'interwiki_prefix' => 'Voorvoegsel',
+ 'interwiki-prefix-label' => 'Voorvoegsel:',
+ 'interwiki_prefix_intro' => 'Interwikivoorvoegsel dat gebruikt moet worden in de wikitekstsyntaxis <code>[<nowiki />[voorvoegsel:<em>paginanaam</em>]]</code>.',
+ 'interwiki_url_intro' => "Een sjabloon voor URL's. De plaatshouder $1 wordt vervangen door de <em>paginanaam</em> van de wikitekst als de bovenvermelde wikitekstsyntaxis gebruikt wordt.",
+ 'interwiki_local' => 'Doorverwijzen',
+ 'interwiki-local-label' => 'Doorverwijzen:',
+ 'interwiki_local_intro' => 'Een HTTP-aanvraag naar de lokale wiki met dit interwikivoorvoegsel in de URL is:',
+ 'interwiki_local_0_intro' => 'wordt niet verwerkt. Meestal geblokkeerd door een "pagina niet gevonden"-foutmelding.',
+ 'interwiki_local_1_intro' => "doorverwezen naar de doel-URL die opgegeven is in de definities van de interwikikoppelingen (deze worden behandeld als bronnen in lokale pagina's)",
+ 'interwiki_trans' => 'Transcluderen',
+ 'interwiki-trans-label' => 'Transcluderen:',
+ 'interwiki_trans_intro' => 'Indien de wikitextsyntaxis <code>{<nowiki />{voorvoegsel:<em>paginanaam</em>}}</code> gebruikt wordt, dan:',
+ 'interwiki_trans_1_intro' => 'transclusie toestaan van de andere wiki indien interwikitransclusies toegestaan zijn in deze wiki.',
+ 'interwiki_trans_0_intro' => 'niet toestaan, zoeken naar een pagina in de sjabloonnaamruimte.',
+ 'interwiki_intro_footer' => 'Zie [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] voor meer informatie over de interwikitabel.
+Er is een [[Special:Log/interwiki|veranderingslogboek]] voor de interwikitabel.',
+ 'interwiki_1' => 'ja',
+ 'interwiki_0' => 'nee',
+ 'interwiki_error' => 'Fout: De interwikitabel is leeg, of iets anders ging verkeerd.',
+ 'interwiki-cached' => 'De interwikigegevens staan in de cache. De cache wijzigen is niet mogelijk.',
+ 'interwiki_edit' => 'Bewerken',
+ 'interwiki_reasonfield' => 'Reden:',
+ 'interwiki_delquestion' => '"$1" aan het verwijderen',
+ 'interwiki_deleting' => 'U bent voorvoegsel "$1" aan het verwijderen.',
+ 'interwiki_deleted' => 'Voorvoegsel "$1" is verwijderd uit de interwikitabel.',
+ 'interwiki_delfailed' => 'Voorvoegsel "$1" kon niet worden verwijderd uit de interwikitabel.',
+ 'interwiki_addtext' => 'Interwikivoorvoegsel toevoegen',
+ 'interwiki_addintro' => 'U bent een nieuw interwikivoorvoegsel aan het toevoegen.
+Let op dat dit geen spaties ( ), dubbele punt (:), ampersands (&), of gelijktekens (=) mag bevatten.',
+ 'interwiki_addbutton' => 'Toevoegen',
+ 'interwiki_added' => 'Voorvoegsel "$1" is toegevoegd aan de interwikitabel.',
+ 'interwiki_addfailed' => 'Voorvoegsel "$1" kon niet worden toegevoegd aan de interwikitabel. Mogelijk bestaat het al in de interwikitabel.',
+ 'interwiki_edittext' => 'Een interwikivoorvoegsel bewerken',
+ 'interwiki_editintro' => 'U bent een interwikivoorvoegsel aan het bewerken.
+Let op dat dit bestaande koppelingen kan breken.',
+ 'interwiki_edited' => 'Voorvoegsel "$1" is gewijzigd in de interwikitabel.',
+ 'interwiki_editerror' => 'Voorvoegsel "$1" kan niet worden gewijzigd in de interwikitabel. Mogelijk bestaat het niet.',
+ 'interwiki-badprefix' => 'Het interwikivoorvoegsel "$1" bevat ongeldige karakters',
+ 'interwiki-submit-empty' => 'Het voorvoegsel en de URL mogen niet leeg zijn.',
+ 'interwiki-submit-invalidurl' => 'Het protocol van de URL is ongeldig.',
+ 'log-name-interwiki' => 'Logboek interwikitabel',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|heeft}} het voorvoegsel "$4" toegevoegd ($5) aan de interwikitabel (trans: $6; local: $7)',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|heeft}} het voorvoegsel "$4" ($5) gewijzigd in de interwikitabel (trans: $6; local: $7)',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|heeft}} het voorvoegsel "$4" verwijderd uit de interwikitabel',
+ 'log-description-interwiki' => 'Dit is een logboek van wijzigingen aan de [[Special:Interwiki|interwikitabel]].',
+ 'right-interwiki' => 'Interwikigegevens bewerken',
+ 'action-interwiki' => 'deze interwikikoppeling te wijzigen',
+);
+
+/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
+ * @author Siebrand
+ */
+$messages['nl-informal'] = array(
+ 'interwiki_deleting' => 'Je bent voorvoegsel "$1" aan het verwijderen.',
+ 'interwiki_addintro' => 'Je bent een nieuw interwikivoorvoegsel aan het toevoegen.
+Let op dat dit geen spaties ( ), dubbele punt (:), ampersands (&), of gelijktekens (=) mag bevatten.',
+ 'interwiki_editintro' => 'Je bent een interwikivoorvoegsel aan het bewerken. Let op dat dit bestaande koppelingen kan breken.',
+);
+
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
+ * @author Eirik
+ * @author Gunnernett
+ * @author Harald Khan
+ * @author Jon Harald Søby
+ * @author Njardarlogar
+ */
+$messages['nn'] = array(
+ 'interwiki' => 'Vis og endre interwikidata',
+ 'interwiki-title-norights' => 'Vis interwikidata',
+ 'interwiki-desc' => 'Legg til ei [[Special:Interwiki|spesialside]] som gjer at ein kan sjå og endra interwikitabellen.',
+ 'interwiki_intro' => 'Dette er eit oversyn over interwikitabellen.',
+ 'interwiki-legend-show' => 'Vis ordtydingar',
+ 'interwiki-legend-hide' => 'Gøym ordtydingar',
+ 'interwiki_prefix' => 'Førefeste',
+ 'interwiki-prefix-label' => 'Førefeste:',
+ 'interwiki_prefix_intro' => 'Interwikiførefeste som skal verta nytta i <code>[<nowiki />[førefeste:<em>sidenamn</em>]]</code>-wikisyntaks.',
+ 'interwiki_url_intro' => 'Mal for adresser. Variabelen $1 vil verta bytt ut med <em>sidenamn</em> i wikiteksten når wikisyntakset ovanfor vert nytta.',
+ 'interwiki_local' => 'Send vidare',
+ 'interwiki-local-label' => 'Send vidare:',
+ 'interwiki_local_intro' => 'Ein http-førespurnad til den lokale wikien med dette interwikiførefestet i adressa, er:',
+ 'interwiki_local_0_intro' => 'ikkje æra, vanlegvis blokkert med «finn ikkje websida»,',
+ 'interwiki_local_1_intro' => 'omdirigert til måladressa oppgjeven i interwikilenkjedefinisjonane (med andre ord handsama som refereransar på lokale sider)',
+ 'interwiki_trans' => 'Inkluder',
+ 'interwiki-trans-label' => 'Inkluder:',
+ 'interwiki_trans_intro' => 'Om wikitekstsyntakset <code>{<nowiki />{prefix:<em>pagename</em>}}</code> er nytta, so:',
+ 'interwiki_trans_1_intro' => 'tillat inkludering frå ein framand wiki, om interwikiinkluderingar generelt sett er tillatne på denne wikien,',
+ 'interwiki_trans_0_intro' => 'ikkje tillat det, sjå heller etter ei sida i malnamnerommet.',
+ 'interwiki_intro_footer' => 'Sjå [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] for meir informasjon om interwikitabellen.
+Det finst ein [[Special:Log/interwiki|logg over endringar]] i interwikitabellen.',
+ 'interwiki_1' => 'ja',
+ 'interwiki_0' => 'nei',
+ 'interwiki_error' => 'Feil: Interwikitabellen er tom, eller noko anna gjekk gale.',
+ 'interwiki-cached' => 'Interwikidataa er mellomlagra. Det er ikkje mogeleg å endra mellomlageret.',
+ 'interwiki_edit' => 'Endra',
+ 'interwiki_reasonfield' => 'Ã…rsak:',
+ 'interwiki_delquestion' => 'Slettar «$1»',
+ 'interwiki_deleting' => 'Du slettar prefikset «$1».',
+ 'interwiki_deleted' => 'Prefikset «$1» blei fjerna frå interwikitabellen.',
+ 'interwiki_delfailed' => 'Prefikset «$1» kunne ikkje bli fjerna frå interwikitabellen.',
+ 'interwiki_addtext' => 'Legg til eit interwikiprefiks',
+ 'interwiki_addintro' => 'Du legg til eit nytt interwikiprefiks.
+Hugs at det ikkje kan innehalda mellomrom ( ), kolon (:), et (&) eller likskapsteikn (=).',
+ 'interwiki_addbutton' => 'Legg til',
+ 'interwiki_added' => 'Prefikset «$1» blei lagt til i interwikitabellen.',
+ 'interwiki_addfailed' => 'Prefikset «$1» kunne ikkje bli lagt til i interwikitabellen.
+Kanskje er det i bruk frå før.',
+ 'interwiki_edittext' => 'Endrar eit interwikiprefiks',
+ 'interwiki_editintro' => 'Du endrar eit interwikiprefiks.
+Hugs at dette kan øydeleggja lenkjer som finst frå før.',
+ 'interwiki_edited' => 'Prefikset «$1» blei endra i interwikitabellen.',
+ 'interwiki_editerror' => 'Prefikset «$1» kan ikkje bli endra i interwikitabellen.
+Kanskje finst det ikkje.',
+ 'interwiki-badprefix' => 'Det oppgjevne interwikiprefikset «$1» inneheld ugyldige teikn.',
+ 'interwiki-submit-empty' => 'Førefestet og URL-en kan ikkje vera tomme.',
+ 'interwiki-submit-invalidurl' => 'Protokollen til URL-en er ugild.',
+ 'log-name-interwiki' => 'Logg for interwikitabell',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|la til}} førefestet «$4» ($5) (omsett: $6; lokalt: $7) til interwikitabellen',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|endra}} førefestet «$4» ($5) (omsett: $6; lokalt: $7) i interwikitabellen',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|fjerna}} førefestet «$4» frå interwikitabellen',
+ 'log-description-interwiki' => 'Dette er ein logg over endringar i [[Special:Interwiki|interwikitabellen]].',
+ 'right-interwiki' => 'Endra interwikidata',
+ 'action-interwiki' => 'endra dette interwikielementet',
+);
+
+/** Novial (Novial)
+ * @author Malafaya
+ */
+$messages['nov'] = array(
+ 'interwiki_reasonfield' => 'Resone:',
+);
+
+/** Northern Sotho (Sesotho sa Leboa)
+ * @author Mohau
+ */
+$messages['nso'] = array(
+ 'interwiki_reasonfield' => 'Lebaka:',
+ 'interwiki_delquestion' => 'Phumula "$1"',
+ 'interwiki_addbutton' => 'Lokela',
+);
+
+/** Occitan (occitan)
+ * @author Cedric31
+ */
+$messages['oc'] = array(
+ 'interwiki' => 'Veire e editar las donadas interwiki',
+ 'interwiki-title-norights' => 'Veire las donadas interwiki',
+ 'interwiki-desc' => 'Apond una [[Special:Interwiki|pagina especiala]] per veire e editar la taula interwiki',
+ 'interwiki_intro' => 'Aquò es un apercebut de la taula interwiki.',
+ 'interwiki_prefix' => 'Prefix',
+ 'interwiki-prefix-label' => 'Prefix :',
+ 'interwiki_prefix_intro' => "Prefix interwiki d'utilizar dins <code>[<nowiki />[prefix :<em>nom de la pagina</em>]]</code> de la sintaxi wiki.",
+ 'interwiki_url_intro' => 'Modèl per las URLs. $1 serà remplaçat pel <em>nom de la pagina</em> del wikitèxt, quora la sintaxi çaisús es utilizada.',
+ 'interwiki_local' => 'Far seguir',
+ 'interwiki-local-label' => 'Far seguir :',
+ 'interwiki_local_intro' => "Una requèsta HTTP sus aqueste wiki amb aqueste prefix interwiki dins l'URL serà :",
+ 'interwiki_local_0_intro' => 'regetat, blocat generalament per « Marrit títol »,',
+ 'interwiki_local_1_intro' => "redirigit cap a l'URL cibla en foncion de la definicion del prefix interwiki (es a dire tractat coma un ligam dins una pagina del wiki)",
+ 'interwiki_trans' => 'Enclure',
+ 'interwiki-trans-label' => 'Enclure :',
+ 'interwiki_trans_intro' => 'Se la sintaxi <code>{<nowiki />{prefix :<em>nom de la pagina</em>}}</code> es utilizada, alara :',
+ 'interwiki_trans_1_intro' => "l'inclusion a partir del wiki serà autorizada, se las inclusions interwiki son autorizadas dins aqueste wiki,",
+ 'interwiki_trans_0_intro' => "l'inclusion serà regetada, e la pagina correspondenta serà recercada dins l'espaci de noms « Modèl ».",
+ 'interwiki_intro_footer' => "Vejatz [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] per obténer mai d'entresenhas a prepaus de la taula interwiki.
+Existís un [[Special:Log/interwiki|jornal de las modificacions]] de la taula interwiki.",
+ 'interwiki_1' => 'òc',
+ 'interwiki_0' => 'non',
+ 'interwiki_error' => "Error : la taula dels interwikis es voida o un processús s'es mal desenrotlat.",
+ 'interwiki_edit' => 'Modificar',
+ 'interwiki_reasonfield' => 'Motiu :',
+ 'interwiki_delquestion' => 'Supression "$1"',
+ 'interwiki_deleting' => 'Escafatz presentament lo prefix « $1 ».',
+ 'interwiki_deleted' => '$1 es estada levada amb succès de la taula interwiki.',
+ 'interwiki_delfailed' => '$1 a pas pogut èsser levat de la taula interwiki.',
+ 'interwiki_addtext' => 'Apond un prefix interwiki',
+ 'interwiki_addintro' => "Sètz a apondre un prefix interwiki. Rapelatz-vos que pòt pas conténer d'espacis ( ), de punts dobles (:), d'eperluetas (&) o de signes egal (=)",
+ 'interwiki_addbutton' => 'Apondre',
+ 'interwiki_added' => '$1 es estat apondut amb succès dins la taula interwiki.',
+ 'interwiki_addfailed' => '$1 a pas pogut èsser apondut a la taula interwiki.
+Benlèu i existís ja.',
+ 'interwiki_edittext' => 'Modificar un prefix interwiki',
+ 'interwiki_editintro' => "Modificatz un prefix interwiki. Rapelatz-vos qu'aquò pòt rompre de ligams existents.",
+ 'interwiki_edited' => 'Lo prefix « $1 » es estat modificat amb succès dins la taula interwiki.',
+ 'interwiki_editerror' => "Lo prefix « $1 » pòt pas èsser modificat. Es possible qu'exista pas.",
+ 'interwiki-badprefix' => 'Lo prefix interwiki especificat « $1 » conten de caractèrs invalids',
+ 'log-name-interwiki' => 'Jornal de la taula interwiki',
+ 'log-description-interwiki' => 'Aquò es lo jornal dels cambiaments dins la [[Special:Interwiki|taula interwiki]].',
+ 'right-interwiki' => 'Modificar las donadas interwiki',
+ 'action-interwiki' => 'modificar aquesta entrada interwiki',
+);
+
+/** Oriya (ଓଡ଼ିଆ)
+ * @author Ansumang
+ * @author Jnanaranjan Sahu
+ * @author Psubhashish
+ */
+$messages['or'] = array(
+ 'interwiki_1' => 'ହà¬',
+ 'interwiki_0' => 'ନା',
+ 'interwiki_edit' => 'ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾',
+ 'interwiki_reasonfield' => 'କାରଣ:',
+ 'interwiki_delquestion' => '"$1"କୠଲିଭାଉଛି',
+ 'interwiki_deleting' => 'ଆପଣ "$1"ର ପୂରà­à¬¬à¬•à­ ବଦଳାଉଛନà­à¬¤à¬¿',
+);
+
+/** Ossetic (Ирон)
+ * @author Amikeco
+ */
+$messages['os'] = array(
+ 'interwiki_reasonfield' => 'ÐххоÑ:',
+);
+
+/** Deitsch (Deitsch)
+ * @author Purodha
+ * @author Xqt
+ */
+$messages['pdc'] = array(
+ 'interwiki_1' => 'ya',
+ 'interwiki_0' => 'nee',
+ 'interwiki_edit' => 'Ennere',
+ 'interwiki_reasonfield' => 'Grund:',
+ 'interwiki_addbutton' => 'Dezu duh',
+);
+
+/** Pälzisch (Pälzisch)
+ * @author Manuae
+ * @author Xqt
+ */
+$messages['pfl'] = array(
+ 'interwiki' => 'Innawikidaade ogugge un ännare.',
+ 'interwiki-title-norights' => 'Innawikidaade ogugge.',
+ 'interwiki_intro' => 'Des ischn Iwabligg vunde Innawikitabell.',
+ 'interwiki_prefix' => 'Präfix',
+ 'interwiki-prefix-label' => 'Präfix:',
+ 'interwiki_trans' => 'Oibinde',
+ 'interwiki-trans-label' => 'Oibinde:',
+ 'interwiki_1' => 'ja',
+ 'interwiki_0' => 'nä',
+ 'interwiki-cached' => "Die Innawikidaade sin abgleschd worre un kennen jedz nemme g'ännad were.",
+ 'interwiki_edit' => "B'awaide",
+ 'interwiki_reasonfield' => 'Grund:',
+ 'interwiki_delquestion' => 'Leschd "$1"',
+ 'interwiki_deleting' => "Du duschd grad s'Präfix „$1“ lesche.",
+ 'interwiki_deleted' => "S'Präfix „$1“ isch ausde Innawikitabell gleschd worre.",
+ 'interwiki_delfailed' => "S'Präfix $1 hod ned ausde Innawikitabell gleschd were kenne.",
+ 'interwiki_addtext' => 'Ä Innawikipräfix oifiesche.',
+ 'interwiki_addintro' => "Du fiegschd ä naies Innawikipräfix oi.
+Deng'g dro, s'derf kä Leazaische ( ), kä Und (&), kä Glaischhaidszaische (=) un kän Dobblpungd (:) hawe.",
+ 'interwiki_addbutton' => 'Dzufiesche',
+ 'interwiki_added' => "S'Präfix „$1“ isch in die Innawikitabell oigfieschd worre.",
+ 'interwiki_edittext' => 'Innawikipräfix ännare.',
+ 'interwiki_editintro' => "Du änaschd grad ä Präfix.
+Deng'g dro, des konn Lings zaschdere, wus gibd.",
+ 'interwiki_edited' => "S'Präfix „$1“ isch inde Innawikitabell gännad worre.",
+ 'interwiki_editerror' => "S'Präfix „$1“ hod ma ned inde Interwikitabell ännare kenne.
+Vielaischd hods des a ned.",
+ 'interwiki-submit-empty' => "S'Präfix un's URL derfen ned lea soi.",
+ 'right-interwiki' => 'Innawikidaade ännare.',
+ 'action-interwiki' => 'Den Innawikioidraach ännare.',
+);
+
+/** Polish (polski)
+ * @author BeginaFelicysym
+ * @author Leinad
+ * @author Matma Rex
+ * @author McMonster
+ * @author Sp5uhe
+ * @author Yarl
+ */
+$messages['pl'] = array(
+ 'interwiki' => 'PodglÄ…d i edycja danych interwiki',
+ 'interwiki-title-norights' => 'Zobacz dane interwiki',
+ 'interwiki-desc' => 'Dodaje [[Special:Interwiki|stronę specjalną]] służącą do przeglądania i redakcji tablicy interwiki.',
+ 'interwiki_intro' => 'PrzeglÄ…d tabeli interwiki.',
+ 'interwiki-legend-show' => 'Pokaż legendę',
+ 'interwiki-legend-hide' => 'Ukryj legendÄ™',
+ 'interwiki_prefix' => 'Przedrostek',
+ 'interwiki-prefix-label' => 'Przedrostek:',
+ 'interwiki_prefix_intro' => 'Przedrostek interwiki do użycia zgodnie ze składnią wiki <code>[<nowiki />[prefiks:<em>nazwa strony</em>]]</code>.',
+ 'interwiki_url_intro' => 'Szablon dla adresów URL. Symbol $1 zostanie zastąpiony przez <em>nazwę strony</em> wiki, gdzie wyżej wspomniana składnia wiki jest użyta.',
+ 'interwiki_local' => 'Link działa',
+ 'interwiki-local-label' => 'PrzenieÅ› do',
+ 'interwiki_local_intro' => 'Zapytanie HTTP do lokalnej wiki z tym przedrostkiem interwiki w adresie URL to:',
+ 'interwiki_local_0_intro' => 'nie respektowane, zazwyczaj blokowane przez „nie znaleziono stronyâ€,',
+ 'interwiki_local_1_intro' => 'przekierowane na adres docelowy podany w definicji linku interwiki (np. traktowane jako odniesienie do lokalnej strony)',
+ 'interwiki_trans' => 'Transkluzja',
+ 'interwiki-trans-label' => 'Transkluzja:',
+ 'interwiki_trans_intro' => 'Jeśli składnia wiki <code>{<nowiki />{przedrostek:<em>nazwastrony</em>}}</code> została użyta, to:',
+ 'interwiki_trans_1_intro' => 'pozwala na transkluzję z innych wiki, jeśli transkluzja interwiki jest w ogóle dozwolona na tej wiki,',
+ 'interwiki_trans_0_intro' => 'nie pozwalaj na nią, raczej szukaj strony w przestrzeni szablonów.',
+ 'interwiki_intro_footer' => 'Na [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] odnajdziesz więcej informacji na temat tabeli interwiki.
+Tutaj znajduje siÄ™ [[Special:Log/interwiki|rejestr zmian]] tabeli interwiki.',
+ 'interwiki_1' => 'tak',
+ 'interwiki_0' => 'nie',
+ 'interwiki_error' => 'BÅÄ„D: Tabela interwiki jest pusta lub wystÄ…piÅ‚ jakiÅ› inny problem.',
+ 'interwiki-cached' => 'Dane interwiki są buforowane. Zmiany zawartości pamięci podręcznej nie są możliwe.',
+ 'interwiki_edit' => 'Edytuj',
+ 'interwiki_reasonfield' => 'Powód',
+ 'interwiki_delquestion' => 'Czy usunąć „$1â€',
+ 'interwiki_deleting' => 'Usuwasz prefiks „$1â€.',
+ 'interwiki_deleted' => 'Prefiks „$1†został z powodzeniem usunięty z tabeli interwiki.',
+ 'interwiki_delfailed' => 'Prefiks „$1†nie może zostać usunięty z tabeli interwiki.',
+ 'interwiki_addtext' => 'Dodaj przedrostek interwiki',
+ 'interwiki_addintro' => 'Edytujesz przedrostek interwiki.
+Pamiętaj, że nie może on zawierać znaku odstępu ( ), dwukropka (:), ampersandu (&) oraz znaku równości (=).',
+ 'interwiki_addbutton' => 'Dodaj',
+ 'interwiki_added' => 'Prefiks „$1†został z powodzeniem dodany do tabeli interwiki.',
+ 'interwiki_addfailed' => 'Prefiks „$1†nie może zostać dodany do tabeli interwiki.
+Prawdopodobnie ten prefiks już jest w tableli.',
+ 'interwiki_edittext' => 'Edycja przedrostka interwiki',
+ 'interwiki_editintro' => 'Edytujesz przedrostek interwiki. Pamiętaj, że może to zerwać istniejące powiązania między projektami językowymi.',
+ 'interwiki_edited' => 'Prefiks „$1†został z powodzeniem poprawiony w tableli interwiki.',
+ 'interwiki_editerror' => 'Prefiks „$1†nie może zostać poprawiony w tabeli interwiki. Prawdopodobnie nie ma go w tabeli.',
+ 'interwiki-badprefix' => 'Podany przedrostek interwiki „$1†zawiera nieprawidłowe znaki',
+ 'interwiki-submit-empty' => 'Przedrostek i adres URL nie mogą być puste.',
+ 'interwiki-submit-invalidurl' => 'Nieprawidłowy protokół adresu URL.',
+ 'log-name-interwiki' => 'Rejestr tablicy interwiki',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|dodał|dodała}} przedrostek "$4" ($5) (trans: $6; local: $7) do tabeli interwiki',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|zmienił|zmieniła}} przedrostek "$4" ($5) (trans: $6; local: $7) w tabeli interwiki',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|usunął|usunęła}} przedrostek "$4" z tabeli interwiki',
+ 'log-description-interwiki' => 'Poniżej znajduje się rejestr zmian wykonanych w [[Special:Interwiki|tablicy interwiki]].',
+ 'right-interwiki' => 'Edycja danych interwiki',
+ 'action-interwiki' => 'zmień ten wpis interwiki',
+);
+
+/** Piedmontese (Piemontèis)
+ * @author Borichèt
+ * @author Dragonòt
+ */
+$messages['pms'] = array(
+ 'interwiki' => 'Varda e modìfica dat antërwiki',
+ 'interwiki-title-norights' => 'Varda dat antërwiki',
+ 'interwiki-desc' => 'A gionta na [[Special:Interwiki|pàgina special]] për vëdde e modifiché la tàula antërwiki',
+ 'interwiki_intro' => "Costa-sì a l'é na previsualisassion dla tàula antërwiki.",
+ 'interwiki-legend-show' => 'Mostré la legenda',
+ 'interwiki-legend-hide' => 'Stërmé la legenda',
+ 'interwiki_prefix' => 'Prefiss',
+ 'interwiki-prefix-label' => 'Prefiss:',
+ 'interwiki_prefix_intro' => 'Prefiss antërwiki da dovré ant la sintassi dël test wiki <code>[<nowiki />[prefix:<em>nòm pàgina</em>]]</code>',
+ 'interwiki_url_intro' => "Stamp për anliure. Ël marca-pòst $1 a sarà rimpiassà dal <em>nòm pàgina</em> dël test wiki, quand la sintassi dël test wiki dzor-dit a l'é dovrà.",
+ 'interwiki_local' => 'Anans',
+ 'interwiki-local-label' => 'Anans:',
+ 'interwiki_local_intro' => "N'arcesta HTTP a la wiki local con sto prefiss antërwiki-sì ant l'anliura a l'é:",
+ 'interwiki_local_0_intro' => 'pa fàit, normalment blocà da "pàgina pa trovà"',
+ 'interwiki_local_1_intro' => "ridiressionà a l'anliura ëd destinassion dàita ant la definission dël colegament antërwiki (visadì tratà com arferiment ant le pàgine locaj)",
+ 'interwiki_trans' => 'Anseriment',
+ 'interwiki-trans-label' => 'Anseriment:',
+ 'interwiki_trans_intro' => "Se la sintassi wikitest <code>{<nowiki />{prefix:<em>nòmpàgina</em>}}</code> a l'é dovrà, antlora:",
+ 'interwiki_trans_1_intro' => "a përmet anseriment da la wiki strangera, se j'anseriment antërwiki a son generalment përmëttù an sta wiki-sì,",
+ 'interwiki_trans_0_intro' => 'a përmet pa lòn, nopà a sërca na pàgina ant lë spassi nominal dlë stamp.',
+ 'interwiki_intro_footer' => 'Varda [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] për savèjne ëd pi an sla tàula antërwiki.
+A-i é un [[Special:Log/interwiki|registr dij cambi]] për la tàula antërwiki.',
+ 'interwiki_1' => 'é!',
+ 'interwiki_0' => 'nò',
+ 'interwiki_error' => "Eror: La tàula antërwiki a l'é veuida, o cheicòs d'àutr a l'é andàit mal.",
+ 'interwiki-cached' => "Ij dat interwiki a son memorisà an local. A l'é nen possìbil modifiché la memòria local.",
+ 'interwiki_edit' => 'Modìfica',
+ 'interwiki_reasonfield' => 'Rason:',
+ 'interwiki_delquestion' => 'Scancelassion ëd "$1"',
+ 'interwiki_deleting' => 'It ses an camin a scancelé ël prefiss "$1".',
+ 'interwiki_deleted' => 'Ël prefiss "$1" a l\'é stàit gavà da bin da la tàula antërwiki.',
+ 'interwiki_delfailed' => 'Ël prefiss "$1" a peul pa esse gavà da la tàula antërwiki.',
+ 'interwiki_addtext' => 'Gionta un prefiss antërwiki',
+ 'interwiki_addintro' => "A l'é an camin ch'a gionta un neuv prefiss antërwiki.
+Ch'as visa che a peul pa conten-e spassi ( ), doi pont (:), e comersial (&), o l'ugual (=).",
+ 'interwiki_addbutton' => 'Gionta',
+ 'interwiki_added' => 'Ël prefiss "$1" a l\'é stàit giontà da bin a la tàula antërwiki.',
+ 'interwiki_addfailed' => 'Ël prefiss "$1" a peul pa esse giontà a la tàula antërwiki.
+A peul esse ch\'a esista già ant la tàula antërwiki.',
+ 'interwiki_edittext' => 'Modifiché un prefiss antërwiki',
+ 'interwiki_editintro' => "A l'é an camin ch'a modìfica un prefiss antërwiki.
+Ch'as visa che sòn a peul rompe un colegament esistent.",
+ 'interwiki_edited' => 'Ël prefiss "$1" a l\'é stàit modificà da bin ant la tàula antërwiki.',
+ 'interwiki_editerror' => 'Ël prefiss "$1" a peul pa esse modificà ant la tàula antërwiki.
+A peul esse che a esista pa.',
+ 'interwiki-badprefix' => 'Ël prefiss antërwiki specificà "$1" a conten caràter pa bon.',
+ 'interwiki-submit-empty' => "Ël prefiss e l'anliura a peulo pa esse veuid.",
+ 'interwiki-submit-invalidurl' => "Ël protocòl ëd l'anliura a l'é pa bon.",
+ 'log-name-interwiki' => 'Registr ëd la tàula antërwiki',
+ 'logentry-interwiki-iw_add' => "$1 {{GENDER:$2|a l'ha giontà}} ël prefiss «$4» ($5) (trans: $6; local: $7) a la tàula antërwiki",
+ 'logentry-interwiki-iw_edit' => "$1 {{GENDER:$2|a l'ha modificà}} ël prefiss «$4» ($5) (trans: $6; local: $7) ant la tàula antërwiki",
+ 'logentry-interwiki-iw_delete' => "$1 {{GENDER:$2|a l'ha gavà}} ël prefiss «$4» da la tàula antërwiki",
+ 'log-description-interwiki' => "Cost-sì a l'é un registr dij cambi a la [[Special:Interwiki|tàula antërwiki]].",
+ 'right-interwiki' => 'Modìfica dat antërwiki',
+ 'action-interwiki' => 'cambia sto dat antërwiki-sì',
+);
+
+/** Pontic (Ποντιακά)
+ * @author Crazymadlover
+ * @author Omnipaedista
+ */
+$messages['pnt'] = array(
+ 'interwiki_prefix' => 'ΠÏόθεμαν',
+ 'interwiki-prefix-label' => 'ΠÏόθεμαν:', # Fuzzy
+ 'interwiki_trans' => 'ΥπεÏκλεισμοί',
+ 'interwiki-trans-label' => 'ΥπεÏκλεισμοί:', # Fuzzy
+ 'interwiki_1' => 'ναι',
+ 'interwiki_0' => 'όχι',
+ 'interwiki_edit' => 'Ἀλλαγμαν',
+ 'interwiki_delquestion' => 'ΔιαγÏαφήν του "$1"',
+ 'right-interwiki' => 'Άλλαξον τα δογμενία ιντεÏβίκι',
+);
+
+/** Pashto (پښتو)
+ * @author Ahmed-Najib-Biabani-Ibrahimkhel
+ */
+$messages['ps'] = array(
+ 'interwiki_prefix' => 'مختاړی',
+ 'interwiki-prefix-label' => 'مختاړی:',
+ 'interwiki_1' => 'هو',
+ 'interwiki_0' => 'نه',
+ 'interwiki_edit' => 'سمول',
+ 'interwiki_reasonfield' => 'سبب:',
+ 'interwiki_delquestion' => '"$1" د ړنګولو په حال Ú©Û Ø¯ÛŒ...',
+ 'interwiki_deleting' => 'ØªØ§Ø³Û Ø¯ "$1" مختاړی Ú“Ù†Ú«ÙˆÛŒ.',
+ 'interwiki_addbutton' => 'ورګډول',
+);
+
+/** Portuguese (português)
+ * @author Alchimista
+ * @author Hamilton Abreu
+ * @author Malafaya
+ * @author Waldir
+ * @author 555
+ */
+$messages['pt'] = array(
+ 'interwiki' => 'Ver e manipular dados de interwikis',
+ 'interwiki-title-norights' => 'Dados de interwikis',
+ 'interwiki-desc' => '[[Special:Interwiki|Página especial]] para ver e editar a tabela de interwikis',
+ 'interwiki_intro' => 'Isto é um resumo da tabela de interwikis.',
+ 'interwiki-legend-show' => 'Mostrar legenda',
+ 'interwiki-legend-hide' => 'Ocultar legenda',
+ 'interwiki_prefix' => 'Prefixo',
+ 'interwiki-prefix-label' => 'Prefixo:',
+ 'interwiki_prefix_intro' => 'Sintaxe dos prefixos dos links interwikis, na notação wiki <code>[<nowiki />[prefixo:<em>nome da página</em>]]</code>.',
+ 'interwiki_url_intro' => 'Modelo para URLs. O espaço reservado por $1 será substituído pelo <em>nome da página</em> da notação wiki, quando for usada a sintaxe mencionada acima.',
+ 'interwiki_local' => 'Encaminhar',
+ 'interwiki-local-label' => 'Encaminhar:',
+ 'interwiki_local_intro' => 'Um pedido http para a wiki local, com este prefixo de interwikis na URL, é:',
+ 'interwiki_local_0_intro' => 'ignorado, geralmente bloqueado por "página não encontrada",',
+ 'interwiki_local_1_intro' => 'redireccionado para a URL de destino especificada nas definições dos links interwikis (isto é, tratado como referências em páginas locais)',
+ 'interwiki_trans' => 'Transcluir',
+ 'interwiki-trans-label' => 'Transcluir:',
+ 'interwiki_trans_intro' => 'Se for usada a sintaxe de texto wiki <code>{<nowiki />{prefix:<em>nome_página</em>}}</code>, então:',
+ 'interwiki_trans_1_intro' => 'permite transclusão da wiki externa, se transclusões interwikis forem permitidas de forma geral nesta wiki,',
+ 'interwiki_trans_0_intro' => 'não o permite; ao invés, procura uma página no espaço nominal de predefinições.',
+ 'interwiki_intro_footer' => 'Veja [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] para mais informações sobre a tabela de interwikis.
+Existe um [[Special:Log/interwiki|registo de modificações]] à tabela de interwikis.',
+ 'interwiki_1' => 'sim',
+ 'interwiki_0' => 'não',
+ 'interwiki_error' => 'ERRO: A tabela de interwikis está vazia, ou alguma outra coisa não correu bem.',
+ 'interwiki-cached' => 'Os dados de interwikis são armazenados na cache. Não é possível modificar a cache.',
+ 'interwiki_edit' => 'Editar',
+ 'interwiki_reasonfield' => 'Motivo:',
+ 'interwiki_delquestion' => 'A apagar "$1"',
+ 'interwiki_deleting' => 'Está a apagar o prefixo "$1".',
+ 'interwiki_deleted' => 'O prefixo "$1" foi removido da tabela de interwikis com sucesso.',
+ 'interwiki_delfailed' => 'Não foi possível remover o prefixo "$1" da tabela de interwikis.',
+ 'interwiki_addtext' => 'Adicionar um prefixo de interwikis',
+ 'interwiki_addintro' => 'Está prestes a adicionar um novo prefixo de interwikis.
+Lembre-se que este não pode conter espaços ( ), dois-pontos (:), conjunções (&) ou sinais de igualdade (=).',
+ 'interwiki_addbutton' => 'Adicionar',
+ 'interwiki_added' => 'O prefixo "$1" foi adicionado à tabela de interwikis com sucesso.',
+ 'interwiki_addfailed' => 'Não foi possível adicionar o prefixo "$1" à tabela de interwikis. Possivelmente já existe nessa tabela.',
+ 'interwiki_edittext' => 'A editar um prefixo de interwikis',
+ 'interwiki_editintro' => 'Está a editar um prefixo de interwikis. Lembre-se de que isto pode quebrar links existentes.',
+ 'interwiki_edited' => 'O prefixo "$1" foi modificado com sucesso na tabela de interwikis.',
+ 'interwiki_editerror' => 'Não foi possível modificar o prefixo "$1" na tabela de interwikis. Possivelmente, não existe.',
+ 'interwiki-badprefix' => 'O prefixo de interwikis "$1" contém caracteres inválidos',
+ 'interwiki-submit-empty' => 'O prefixo e a URL não podem estar vazios.',
+ 'interwiki-submit-invalidurl' => 'O protocolo da URL é inválido.',
+ 'log-name-interwiki' => 'Registo da tabela de interwikis',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|prefixo adicionado}} " $4 " ( $5 ) (trans: $6 ; local: $7 ) para a tabela de InterWikis',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|prefixo modificado}} " $4 " ( $5 ) (trans: $6 ; local: $7 ) na tabela de InterWikis',
+ 'log-description-interwiki' => 'Este é um registo das alterações à [[Special:Interwiki|tabela de interwikis]].',
+ 'right-interwiki' => 'Editar dados de interwikis',
+ 'action-interwiki' => 'alterar esta entrada interwikis',
+);
+
+/** Brazilian Portuguese (português do Brasil)
+ * @author Eduardo.mps
+ * @author Giro720
+ * @author Luckas Blade
+ * @author 555
+ */
+$messages['pt-br'] = array(
+ 'interwiki' => 'Ver e editar dados de interwikis',
+ 'interwiki-title-norights' => 'Ver dados interwiki',
+ 'interwiki-desc' => 'Adiciona uma [[Special:Interwiki|página especial]] para visualizar e editar a tabela de interwikis',
+ 'interwiki_intro' => 'Esta é uma visão geral da tabela de interwikis.',
+ 'interwiki_prefix' => 'Prefixo',
+ 'interwiki-prefix-label' => 'Prefixo:',
+ 'interwiki_prefix_intro' => 'Prefixo de interwiki a ser usado na sintaxe de wikitexto <code>[<nowiki />[prefix:<em>nome_página</em>]]</code>.',
+ 'interwiki_url_intro' => 'Modelo para URL. O marcador $1 será substituído pelo <em>nome_página</em> do wikitexto, quando a sintaxe de wikitexto acima mencionada for usada.',
+ 'interwiki_local' => 'Encaminhar',
+ 'interwiki-local-label' => 'Encaminhar:',
+ 'interwiki_local_intro' => 'Um pedido http para o wiki local com este prefixo de interwiki na URL é:',
+ 'interwiki_local_0_intro' => 'ignorado, geralmente bloqueado por "página não encontrada",',
+ 'interwiki_local_1_intro' => 'redirecionado para a URL alvo dada nas definições de ligação interwiki (p. ex. tratado como referências em páginas locais)',
+ 'interwiki_trans' => 'Transcluir',
+ 'interwiki-trans-label' => 'Transcluir:',
+ 'interwiki_trans_intro' => 'Se a sintaxe de wikitexto <code>{<nowiki />{prefix:<em>nome_página</em>}}</code> for usada, então:',
+ 'interwiki_trans_1_intro' => 'permite transclusão do wiki externo, se transclusões interwiki forem permitidas de forma geral neste wiki,',
+ 'interwiki_trans_0_intro' => 'não o permite; ao invés, procura uma página no espaço nominal de predefinições.',
+ 'interwiki_intro_footer' => 'Veja [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] para mais informações sobre a tabela de interwikis.
+Existe um [[Special:Log/interwiki|registro de modificações]] à tabela de interwikis.',
+ 'interwiki_1' => 'sim',
+ 'interwiki_0' => 'não',
+ 'interwiki_error' => 'ERRO: A tabela de interwikis está vazia, ou alguma outra coisa não correu bem.',
+ 'interwiki_edit' => 'Editar',
+ 'interwiki_reasonfield' => 'Motivo:',
+ 'interwiki_delquestion' => 'Apagando "$1"',
+ 'interwiki_deleting' => 'Você está apagando o prefixo "$1".',
+ 'interwiki_deleted' => 'O prefixo "$1" foi removido da tabelas de interwikis com sucesso.',
+ 'interwiki_delfailed' => 'O prefixo "$1" não pôde ser removido da tabela de interwikis.',
+ 'interwiki_addtext' => 'Adicionar um prefixo de interwikis',
+ 'interwiki_addintro' => 'Você se encontra prestes a adicionar um novo prefixo de interwiki. Lembre-se de que ele não pode conter espaços ( ), dois-pontos (:), conjunções (&) ou sinais de igualdade (=).',
+ 'interwiki_addbutton' => 'Adicionar',
+ 'interwiki_added' => 'O prefixo "$1" foi adicionado à tabela de interwikis com sucesso.',
+ 'interwiki_addfailed' => 'O prefixo "$1" não pôde ser adicionado à tabela de interwikis. Possivelmente já existe nessa tabela.',
+ 'interwiki_edittext' => 'Editando um prefixo interwiki',
+ 'interwiki_editintro' => 'Você está editando um prefixo interwiki. Lembre-se de que isto pode quebrar ligações existentes.',
+ 'interwiki_edited' => 'O prefixo "$1" foi modificado na tabela de interwikis com sucesso.',
+ 'interwiki_editerror' => 'O prefixo "$1" não pode ser modificado na tabela de interwikis. Possivelmente, não existe.',
+ 'interwiki-badprefix' => 'O prefixo interwiki "$1" contém caracteres inválidos',
+ 'log-name-interwiki' => 'Registro da tabela de interwikis',
+ 'log-description-interwiki' => 'Este é um registro das alterações à [[Special:Interwiki|tabela de interwikis]].',
+ 'right-interwiki' => 'Editar dados de interwiki',
+ 'action-interwiki' => 'alterar esta entrada interwiki',
+);
+
+/** Romanian (română)
+ * @author Firilacroco
+ * @author KlaudiuMihaila
+ * @author Minisarm
+ * @author Stelistcristi
+ */
+$messages['ro'] = array(
+ 'interwiki' => 'Vizualizare și editare date interwiki',
+ 'interwiki-title-norights' => 'Vizualizare date interwiki',
+ 'interwiki-desc' => 'Adaugă o [[Special:Interwiki|pagină specială]] pentru vizualizarea și modificarea tabelului interwiki',
+ 'interwiki_intro' => 'Aceasta este o imagine de ansamblu a tabelului interwiki.',
+ 'interwiki-legend-show' => 'Arată legenda',
+ 'interwiki-legend-hide' => 'Ascunde legenda',
+ 'interwiki_prefix' => 'Prefix',
+ 'interwiki-prefix-label' => 'Prefix:',
+ 'interwiki_local' => 'ÃŽnainte',
+ 'interwiki-local-label' => 'ÃŽnainte:',
+ 'interwiki_trans' => 'Transcludere',
+ 'interwiki-trans-label' => 'Transcludere:',
+ 'interwiki_1' => 'da',
+ 'interwiki_0' => 'nu',
+ 'interwiki_edit' => 'Modificare',
+ 'interwiki_reasonfield' => 'Motiv:',
+ 'interwiki_delquestion' => 'Ștergere „$1â€',
+ 'interwiki_deleting' => 'ÃŽn prezent, È™tergeÈ›i prefixul „$1â€.',
+ 'interwiki_addtext' => 'Adaugă un prefix interwiki',
+ 'interwiki_addbutton' => 'Adaugă',
+ 'interwiki_edittext' => 'Modificarea prefixului unui interwiki',
+ 'log-name-interwiki' => 'Jurnal tabel interwiki',
+ 'right-interwiki' => 'Modifică date interwiki',
+ 'action-interwiki' => 'modificați această legătură interwiki',
+);
+
+/** tarandíne (tarandíne)
+ * @author Joetaras
+ */
+$messages['roa-tara'] = array(
+ 'interwiki-legend-show' => "Fà vedè 'a leggende",
+ 'interwiki-legend-hide' => "Scunne 'a leggende",
+ 'interwiki_prefix' => 'Prefisse',
+ 'interwiki-prefix-label' => 'Prefisse:',
+ 'interwiki_prefix_intro' => "'U prefisse inderuicchi avène ausate jndr'à <code>[<nowiki />[prefix:<em>pagename</em>]]</code> sindasse uicchiteste.",
+ 'interwiki_local' => 'Inoltre',
+ 'interwiki-local-label' => 'Inoltre:',
+ 'interwiki_1' => 'sine',
+ 'interwiki_0' => 'none',
+ 'interwiki_edit' => 'Cange',
+ 'interwiki_reasonfield' => 'Mutive:',
+ 'interwiki_delquestion' => 'Scangellamende de "$1"',
+ 'interwiki_deleting' => 'Tu ste scangille \'u prefisse "$1".',
+ 'interwiki_addtext' => "Aggiunge 'nu prefisse inderuicchi",
+ 'interwiki_addbutton' => 'Aggiunge',
+);
+
+/** Russian (руÑÑкий)
+ * @author Ferrer
+ * @author Grigol
+ * @author Illusion
+ * @author Innv
+ * @author KPu3uC B Poccuu
+ * @author Kaganer
+ * @author Lockal
+ * @author ÐлекÑандр Сигачёв
+ */
+$messages['ru'] = array(
+ 'interwiki' => 'ПроÑмотр и изменение наÑтроек интервики',
+ 'interwiki-title-norights' => 'ПроÑмотреть данные об интервики',
+ 'interwiki-desc' => 'ДобавлÑет [[Special:Interwiki|Ñлужебную Ñтраницу]] Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра и Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ приÑтавок интервики.',
+ 'interwiki_intro' => 'Это обзор таблицы интервики.',
+ 'interwiki-legend-show' => 'Показать легенду',
+ 'interwiki-legend-hide' => 'Скрыть легенду',
+ 'interwiki_prefix' => 'ПриÑтавка',
+ 'interwiki-prefix-label' => 'ПрефикÑ:',
+ 'interwiki_prefix_intro' => 'ПриÑтавка интервики Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² ÑинтакÑиÑе вики-текÑта: <code>[<nowiki />[приÑтавка:<em>название Ñтраницы</em>]]</code>.',
+ 'interwiki_url_intro' => 'Шаблон Ð´Ð»Ñ URL. ВмеÑто $1 будет подÑтавлено <em>название Ñтраницы</em>, указанное при иÑпользовании указанного выше ÑинтакÑиÑа.',
+ 'interwiki_local' => 'ПереÑылка',
+ 'interwiki-local-label' => 'ПереÑылка:',
+ 'interwiki_local_intro' => 'HTTP-Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð² меÑтную вики Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð¸ÐºÐ¸-приÑтавкой в URL:',
+ 'interwiki_local_0_intro' => 'не допуÑкаетÑÑ, обычно блокируетÑÑ Ñообщением «Ñтраница не найдена»,',
+ 'interwiki_local_1_intro' => 'перенаправлÑет на целевой URL, указанный в определении интервики-ÑÑылки (Ñ‚. е. обрабатываетÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ ÑÑылке Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð¹ Ñтраницы)',
+ 'interwiki_trans' => 'Включение',
+ 'interwiki-trans-label' => 'Включение:',
+ 'interwiki_trans_intro' => 'ЕÑли иÑпользуетÑÑ ÑинтакÑÐ¸Ñ Ð²Ð¸ÐºÐ¸-текÑта вида <code>{<nowiki />{приÑтавка:<em>название Ñтраницы</em>}}</code>:',
+ 'interwiki_trans_1_intro' => 'позволÑет Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð· других вики, еÑли интервики-Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ñ‹ в Ñтой вики,',
+ 'interwiki_trans_0_intro' => 'Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ðµ разрешены, ищетÑÑ Ñтраница в проÑтранÑтве имён шаблонов.',
+ 'interwiki_intro_footer' => 'Более подробную информацию о таблице интервики можно найти на [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org].
+СущеÑтвует [[Special:Log/interwiki|журнал изменений]] таблицы интервики.',
+ 'interwiki_1' => 'да',
+ 'interwiki_0' => 'нет',
+ 'interwiki_error' => 'ОШИБКÐ: таблица интервики пуÑта или что-то другое работает ошибочно.',
+ 'interwiki-cached' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± интервики взÑÑ‚Ñ‹ из кÑша. Измененить кÑш не предÑтавлÑетÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹Ð¼.',
+ 'interwiki_edit' => 'Править',
+ 'interwiki_reasonfield' => 'Причина:',
+ 'interwiki_delquestion' => 'Удаление «$1»',
+ 'interwiki_deleting' => 'Ð’Ñ‹ удалÑете приÑтавку «$1».',
+ 'interwiki_deleted' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Â«$1» уÑпешно удалён из таблицы интервики.',
+ 'interwiki_delfailed' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Â«$1» не может быть удалён из таблицы интервики.',
+ 'interwiki_addtext' => 'Добавить новую интервики-приÑтавку',
+ 'interwiki_addintro' => 'Ð’Ñ‹ ÑобираетеÑÑŒ добавить новую интервики-приÑтавку. Помните, что она не может Ñодержать пробелы ( ), Ð´Ð²Ð¾ÐµÑ‚Ð¾Ñ‡Ð¸Ñ (:), амперÑанды (&) и знаки равенÑтва (=).',
+ 'interwiki_addbutton' => 'Добавить',
+ 'interwiki_added' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Â«$1» уÑпешно добавлен в таблицу интервики.',
+ 'interwiki_addfailed' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Â«$1» не может быть добавлен в таблицу интервики. Возможно, он уже в ней приÑутÑтвует.',
+ 'interwiki_edittext' => 'Редактирование интервики-приÑтавок',
+ 'interwiki_editintro' => 'Ð’Ñ‹ редактируете интервики-приÑтавку. Помните, что Ñто может Ñломать ÑущеÑтвующие ÑÑылки.',
+ 'interwiki_edited' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Â«$1» уÑпешно изменён в таблице интервики.',
+ 'interwiki_editerror' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Â«$1» не может быть изменён в таблице интервики. Возможно, его там не ÑущеÑтвует.',
+ 'interwiki-badprefix' => 'Указанный Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð¸ÐºÐ¸ «$1» Ñодержит недопуÑтимые Ñимволы',
+ 'interwiki-submit-empty' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð¸ URL не могут быть пуÑтыми.',
+ 'log-name-interwiki' => 'Журнал изменений таблицы интервики',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|добавил|добавила}} Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Â«$4» ($5) (trans: $6; local: $7) в интервики-таблицу',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|изменил|изменила}} Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Â«$4» ($5) (trans: $6; local: $7) в интервики-таблице',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|удалил|удалила}} Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Â«$4» из интервики-таблицы',
+ 'log-description-interwiki' => 'Это журнал изменений [[Special:Interwiki|таблицы интервики]].',
+ 'right-interwiki' => 'правка таблицы интервики',
+ 'action-interwiki' => 'изменение запиÑи интервики',
+);
+
+/** Rusyn (руÑиньÑкый)
+ * @author Gazeb
+ */
+$messages['rue'] = array(
+ 'interwiki_1' => 'гей',
+ 'interwiki_0' => 'нїт',
+ 'interwiki_edit' => 'Едітовати',
+ 'interwiki_reasonfield' => 'Причіна:',
+ 'interwiki_addbutton' => 'Придати',
+);
+
+/** Sakha (Ñаха тыла)
+ * @author HalanTul
+ */
+$messages['sah'] = array(
+ 'interwiki' => 'Интервики туруорууларын көрүү уонна уларытыы',
+ 'interwiki-title-norights' => 'Интервики туһунан',
+ 'interwiki_intro' => 'Бу интервики табылыыÑÑата. Колонкаларга:', # Fuzzy
+ 'interwiki_prefix' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ (ÑбииÑкÑ)',
+ 'interwiki-prefix-label' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ (ÑбииÑкÑ):', # Fuzzy
+ 'interwiki_error' => 'ÐлҕаÑ: Интервики табылыыÑÑата кураанах ÑбÑÑ‚ÑÑ€ туга ÑÑ€Ñ Ñатамматах.',
+ 'interwiki_reasonfield' => 'ТөрүөтÑ:',
+ 'interwiki_delquestion' => '"$1" Ñотуу',
+ 'interwiki_deleting' => '"$1" префикÑÑ‹ Ñотон ÑÑ€Ñҕин.',
+ 'interwiki_deleted' => '"$1" Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð¸ÐºÐ¸ табылыыÑÑатыттан Ñотулунна.',
+ 'interwiki_delfailed' => '"$1" Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð¸ÐºÐ¸ табылыыÑÑатыттан Ñотуллар кыаҕа Ñуох.',
+ 'interwiki_addtext' => 'Саҥа интервики префикÑÑ‹ Ñбии',
+ 'interwiki_addintro' => 'Эн Ñаҥа интервики префикÑын ÑбÑÑри гынныҥ. Онтуҥ пробела ( ), икки туочуката (:), амперÑанда (&) уонна Ñ‚ÑҥнÑһии бÑлиÑÑ‚Ñ (=) Ñуох буолуохтаах.',
+ 'interwiki_addbutton' => 'ЭбÑргÑ',
+ 'interwiki_added' => '"$1" Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð¸ÐºÐ¸ табылыыÑÑатыгар ÑбилиннÑ.',
+ 'interwiki_addfailed' => '"$1" Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð¸ÐºÐ¸ табылыыÑатыгар кыайан ÑбиллибÑÑ‚Ñ.
+Баҕар номнуо онно баара буолуо.',
+ 'interwiki_edittext' => 'Интервики префикÑтары уларытыы',
+ 'interwiki_editintro' => 'Интервики префикÑÑ‹ уларытан ÑÑ€Ñҕин.
+Баар ÑигÑлÑри алдьатыан Ñөбүн өйдөө.',
+ 'interwiki_edited' => '"$1" Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð¸ÐºÐ¸ табылыыÑÑатыгар Ñөпкө уларытылынна.',
+ 'interwiki_editerror' => '"$1" Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ ÑƒÐ»Ð°Ñ€Ñ‹Ð¹Ð°Ñ€ кыаҕа Ñуох.
+Баҕар отой да Ñуох буолуон Ñөп.',
+ 'interwiki-badprefix' => 'Интервики префикÑа "$1" туттуллуо Ñуохтаах бÑлиÑлÑрдÑÑÑ…',
+ 'right-interwiki' => 'Интервикины уларытыы',
+);
+
+/** Sicilian (sicilianu)
+ * @author Santu
+ */
+$messages['scn'] = array(
+ 'interwiki' => 'Talìa e mudìfica li dati interwiki',
+ 'interwiki-title-norights' => 'Talìa li dati interwiki',
+ 'interwiki-desc' => 'Junci na [[Special:Interwiki|pàggina spiciali]] pi taliari e mudificari la tabedda di li interwiki',
+ 'interwiki_intro' => "Talìa [http://www.mediawiki.org/wiki/Interwiki_table MediaWiki.org] pi chiossai nfurmazzioni supr'a tabedda di li interwiki.", # Fuzzy
+ 'interwiki_prefix' => 'Prifissu',
+ 'interwiki-prefix-label' => 'Prifissu:', # Fuzzy
+ 'interwiki_url' => 'URL',
+ 'interwiki-url-label' => 'URL:', # Fuzzy
+ 'interwiki_local' => 'Qualificari chistu comu a nu wiki lucali', # Fuzzy
+ 'interwiki-local-label' => 'Qualificari chistu comu a nu wiki lucali:', # Fuzzy
+ 'interwiki_trans' => 'Cunzenti interwiki transclusions', # Fuzzy
+ 'interwiki-trans-label' => 'Cunzenti interwiki transclusions:', # Fuzzy
+ 'interwiki_error' => "SBÀGGHIU: La tabedda di li interwiki è vacanti, o c'è qualchi àutru sbàgghiu.",
+ 'interwiki_reasonfield' => 'Mutivu:',
+ 'interwiki_delquestion' => 'Scancellu "$1"',
+ 'interwiki_deleting' => 'Stai pi scancillari lu prufissu "$1"',
+ 'interwiki_deleted' => 'Lu prifissu "$1" vinni scancillatu cu successu dâ tabedda di li interwiki.',
+ 'interwiki_delfailed' => 'Rimuzzioni dû prifissi "$1" dâ tabedda di li interwiki non arinisciuta.',
+ 'interwiki_addtext' => 'Jùncicci nu prifissu interwiki',
+ 'interwiki_addintro' => 'Ora veni iunciutu nu novu prifissu interwiki.
+Non sunnu ammittuti li caràttiri: spàzziu ( ), dui punti (:), e cummirciali (&), sìmmulu di uguali (=).',
+ 'interwiki_addbutton' => 'Iunci',
+ 'interwiki_added' => 'Lu prifissi "$1" vinni iunciutu a la tabedda di li interwiki.',
+ 'interwiki_addfailed' => 'Mpussìbbili iunciri lu prufissu "$1" a la tabedda di li interwiki.
+Lu prifissi putissi èssiri già prisenti ntâ tabedda.',
+ 'interwiki_edittext' => 'Mudìfica di nu prifissu interwiki',
+ 'interwiki_editintro' => 'Si sta pi mudificari nu prifissu interwiki.
+Chistu pò non fari funziunari arcuni lijami ca ci sù.',
+ 'interwiki_edited' => 'Lu prifissi "$1" vinni canciatu nnâ tabedda di li interwiki.',
+ 'interwiki_editerror' => 'Mpussìbbili mudificari lu prifissi "$1" nnâ tabedda di li interwiki.
+Lu prifissu putissi èssiri ca non c\'è.',
+ 'interwiki-badprefix' => 'Lu prifissu interwiki "$1" cunteni caràttiri non vàlidi',
+ 'right-interwiki' => 'Mudìfica li dati interwiki',
+);
+
+/** Sassaresu (Sassaresu)
+ * @author Felis
+ */
+$messages['sdc'] = array(
+ 'interwiki' => 'Vidè e mudìfiggà li dati interwiki',
+ 'interwiki_prefix' => 'Prefissu',
+ 'interwiki-prefix-label' => 'Prefissu:', # Fuzzy
+ 'interwiki_reasonfield' => 'Rasgioni', # Fuzzy
+ 'interwiki_delquestion' => 'Canzillendi "$1"',
+ 'interwiki_deleting' => 'Sei canzillendi lu prefissu "$1".',
+ 'interwiki_addtext' => 'Aggiungi un prefissu interwiki',
+ 'interwiki_addbutton' => 'Aggiungi',
+ 'log-name-interwiki' => 'Rigisthru di la table interwiki',
+);
+
+/** Sinhala (සිංහල)
+ * @author තඹරු විජේසේකර
+ * @author පසිඳු කà·à·€à·’න්ද
+ * @author බිඟුවà·
+ */
+$messages['si'] = array(
+ 'interwiki' => 'අන්තර්විකි දත්ත නà·à¶»à¶¹à·“ම සහ සංස්කරණය',
+ 'interwiki-title-norights' => 'අන්තර්විකි දත්ත නරඹන්න',
+ 'interwiki-legend-show' => 'ප්â€à¶»à¶¶à¶±à·Šà¶°à¶º පෙන්වන්න',
+ 'interwiki-legend-hide' => 'ප්â€à¶»à¶¶à¶±à·Šà¶°à¶º සඟවන්න',
+ 'interwiki_prefix' => 'උපසර්ගය',
+ 'interwiki-prefix-label' => 'උපසර්ගය:',
+ 'interwiki_local' => 'ඉදිරියට',
+ 'interwiki-local-label' => 'ඉදිරියට:',
+ 'interwiki_trans' => 'අතිරà·à·„ණය',
+ 'interwiki-trans-label' => 'අතිරà·à·„ණය:',
+ 'interwiki_1' => 'ඔව්',
+ 'interwiki_0' => 'නà·à¶­',
+ 'interwiki_edit' => 'සංස්කරණය',
+ 'interwiki_reasonfield' => 'හේතුව:',
+ 'interwiki_delquestion' => '"$1" මකමින්',
+ 'interwiki_deleting' => 'ඔබ විසින් "$1" උපසර්ගය මක෠දමමින්.',
+ 'interwiki_addtext' => 'අන්තර්විකි උපසර්ගයක් එක් කරන්න',
+ 'interwiki_addbutton' => 'එක් කරන්න',
+ 'interwiki_edittext' => 'අන්තර්විකි උපසර්ගය සංස්කරණය කරමින්',
+ 'interwiki-badprefix' => 'විà·à·šà·‚ිත අන්තර්විකි උපසර්ගය "$1" සතුව වලංගු නොවන අක්ෂර අඩංගු වේ',
+ 'interwiki-submit-empty' => 'උපසර්ගය සහ URL හිස් විය නොහà·à¶š.',
+ 'interwiki-submit-invalidurl' => 'URL à·„à·“ ප්â€à¶»à·œà¶§à·à¶šà·à¶½à¶º වලංගු නොවේ.',
+ 'log-name-interwiki' => 'අන්තර්විකි වගු ලොගය',
+ 'right-interwiki' => 'අන්තර්-විකි දත්ත සංස්කරණය',
+ 'action-interwiki' => 'මෙම අන්තර්විකි ඇතුලත් කෙරුම වෙනස් කරන්න',
+);
+
+/** Slovak (slovenÄina)
+ * @author Helix84
+ */
+$messages['sk'] = array(
+ 'interwiki' => 'Zobraziť a upravovať údaje interwiki',
+ 'interwiki-title-norights' => 'Zobraziť údaje interwiki',
+ 'interwiki-desc' => 'Pridáva [[Special:Interwiki|špeciálnu stránku]] na zobrazovanie a upravovanie tabuľky interwiki',
+ 'interwiki_intro' => 'Toto je prehľad tabuľky interwiki.',
+ 'interwiki_prefix' => 'Predpona',
+ 'interwiki-prefix-label' => 'Predpona:',
+ 'interwiki_prefix_intro' => 'Predpona interwiki, ktorá sa má použiť v syntaxi wikitextu <code>[<nowiki />[predpona:<em>názov_stránky</em>]]</code>.',
+ 'interwiki_url_intro' => 'Šablóna URL. Vyhradené miesto $1 sa nahradí <em>názvom_stránky</em> wikitextu pri použití vyššie uvedenej syntaxi wikitextu.',
+ 'interwiki_local' => 'Presmerovať',
+ 'interwiki-local-label' => 'Presmerovať:',
+ 'interwiki_local_intro' => 'HTTP požiadavka na lokálnu wiki s touto predponou interwiki v URL je:',
+ 'interwiki_local_0_intro' => 'nezohľadňuje sa, zvyÄajne sa blokuje ako „stránka nenájdená“,',
+ 'interwiki_local_1_intro' => 'presmerovaná na cieľové URL zadané v definícii interwiki odkazu (t.j. berie sa ako odkazy v rámci lokálnej stránky)',
+ 'interwiki_trans' => 'Transklúzia',
+ 'interwiki-trans-label' => 'Transklúzia:',
+ 'interwiki_trans_intro' => 'Ak je použitá syntax wikitextu <code>{<nowiki />{predpona:<em>názov_stránky</em>}}</code>,',
+ 'interwiki_trans_1_intro' => 'povoliť transklúzie z cudzej wiki ak sú na tejto wiki všeobecne povolené transklúzie interwiki,',
+ 'interwiki_trans_0_intro' => 'nepovoliť ju, namiesto toho hľadať stránku v mennom priestore šablón.',
+ 'interwiki_intro_footer' => 'Ďalšie informácie o tabuľke interwiki nájdete na [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org].
+Obsahuje [[Special:Log/interwiki|záznam zmien]] tabuľky interwiki.',
+ 'interwiki_1' => 'áno',
+ 'interwiki_0' => 'nie',
+ 'interwiki_error' => 'CHYBA: Tabuľka interwiki je prázdna alebo sa pokazilo nieÄo iné.',
+ 'interwiki_edit' => 'Upraviť',
+ 'interwiki_reasonfield' => 'Dôvod:',
+ 'interwiki_delquestion' => 'Maže sa „$1“',
+ 'interwiki_deleting' => 'Mažete predponu „$1“.',
+ 'interwiki_deleted' => 'Predpona „$1“ bola úspešne odstránená z tabuľky interwiki.',
+ 'interwiki_delfailed' => 'Predponu „$1“ nebola možné odstrániť z tabuľky interwiki.',
+ 'interwiki_addtext' => 'Pridať predponu interwiki',
+ 'interwiki_addintro' => 'Pridávate novú predponu interwiki. Pamätajte, že nemôže obsahovať medzery „ “, dvojbodky „:“, ampersand „&“ ani znak rovnosti „=“.',
+ 'interwiki_addbutton' => 'Pridať',
+ 'interwiki_added' => 'Predpona „$1“ bola úspešne pridaná do tabuľky interwiki.',
+ 'interwiki_addfailed' => 'Predponu „$1“ nebola možné pridať do tabuľky interwiki. Je možné, že už v tabuľke interwiki existuje.',
+ 'interwiki_edittext' => 'Upravuje sa predpona interwiki',
+ 'interwiki_editintro' => 'Upravujete predponu interwiki. Pamätajte na to, že týmto môžete pokaziť existujúce odkazy.',
+ 'interwiki_edited' => 'Predpona „$1“ bola úspešne zmenená v tabuľke interwiki.',
+ 'interwiki_editerror' => 'Predponu „$1“ nebolo možné zmeniť v tabuľke interwiki. Je možné, že neexistuje.',
+ 'interwiki-badprefix' => 'Uvedená predpona interwiki „$1“ obsahuje neplatné znaky',
+ 'log-name-interwiki' => 'Záznam zmien tabuľky interwiki',
+ 'log-description-interwiki' => 'Toto je záznam zmien [[Special:Interwiki|tabuľky interwiki]].',
+ 'right-interwiki' => 'Upraviť interwiki údaje',
+ 'action-interwiki' => 'zmeniť tento záznam interwiki',
+);
+
+/** Slovenian (slovenÅ¡Äina)
+ * @author Dbc334
+ */
+$messages['sl'] = array(
+ 'interwiki' => 'Ogled in urejanje podatkov interwiki',
+ 'interwiki-title-norights' => 'Ogled podatkov interwiki',
+ 'interwiki-desc' => 'Doda [[Special:Interwiki|posebno stran]] za ogled in urejanje tabele interwiki',
+ 'interwiki_intro' => 'To je pregled tabele interwiki.',
+ 'interwiki_prefix' => 'Predpona',
+ 'interwiki-prefix-label' => 'Predpona:',
+ 'interwiki_prefix_intro' => 'Predpona interwiki, uporabljena v skladnji wikibesedila <code>[<nowiki />[predpona:<em>imestrani</em>]]</code>.',
+ 'interwiki_local' => 'Posredovano',
+ 'interwiki-local-label' => 'Posredovano:',
+ 'interwiki_trans' => 'VkljuÄeno',
+ 'interwiki-trans-label' => 'VkljuÄeno:',
+ 'interwiki_trans_intro' => 'ÄŒe je uporabljena skladnja wikibesedila <code>{<nowiki />{predpona:<em>imestrani</em>}}</code>, potem:',
+ 'interwiki_1' => 'da',
+ 'interwiki_0' => 'ne',
+ 'interwiki_error' => 'Napaka: Tabela interwiki je prazna ali pa je kaj drugega Å¡lo narobe.',
+ 'interwiki-cached' => 'Podatki interwiki so predpomnjeni. Spreminjanje predpomnilnika ni mogoÄe.',
+ 'interwiki_edit' => 'Uredi',
+ 'interwiki_reasonfield' => 'Razlog:',
+ 'interwiki_delquestion' => 'Brisanje »$1«',
+ 'interwiki_deleting' => 'Brišete predpono »$1«.',
+ 'interwiki_deleted' => 'Predpona »$1« je bila uspešno odstranjena iz tabele interwiki.',
+ 'interwiki_delfailed' => 'Predpone »$1« ni bilo mogoÄe odstraniti iz tabele interwiki.',
+ 'interwiki_addtext' => 'Dodaj predpono interwiki',
+ 'interwiki_addintro' => "Dodajate novo predpono interwiki.
+Pomnite, da ne sme vsebovati presledkov ( ), dvopiÄij (:), znakov ''in'' (&) ali enaÄajev (=).",
+ 'interwiki_addbutton' => 'Dodaj',
+ 'interwiki_added' => 'Predpona »$1« je bila uspešno dodana v tabelo interwiki.',
+ 'interwiki_addfailed' => 'Predpone »$1« ni mogoÄe dodati tabeli interwiki.
+Morda že obstaja v tabeli interwiki.',
+ 'interwiki_edittext' => 'Urejanje predpone interwiki',
+ 'interwiki_editintro' => 'Urejate predpono interwiki.
+Ne pozabite, da lahko to prekine obstojeÄe povezave.',
+ 'interwiki_edited' => 'Predpona »$1« je bila uspešno spremenjena v tabeli interwiki.',
+ 'interwiki_editerror' => 'Predpone »$1« ni mogoÄe spremeniti v tabeli interwiki.
+Morda ne obstaja.',
+ 'interwiki-badprefix' => 'Navedena predpona interwiki »$1« vsebuje neveljavne znake.',
+ 'interwiki-submit-empty' => 'Predpona in URL ne smeta biti prazna.',
+ 'log-name-interwiki' => 'Dnevnik tabele interwiki',
+ 'log-description-interwiki' => 'To je dnevnik sprememb [[Special:Interwiki|tabele interwiki]].',
+ 'right-interwiki' => 'Urejanje podatkov interwiki',
+ 'action-interwiki' => 'spreminjanje tega vnosa interwikija',
+);
+
+/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Rancher
+ * @author Sasa Stefanovic
+ * @author Жељко Тодоровић
+ * @author Михајло Ðнђелковић
+ */
+$messages['sr-ec'] = array(
+ 'interwiki' => 'Прегледај и измени податке о међувикију',
+ 'interwiki-title-norights' => 'Међувики',
+ 'interwiki-desc' => 'Додаје поÑебну Ñтраницу за преглед и измену [[Special:Interwiki|табеле међувикија]]',
+ 'interwiki_intro' => 'Ово је преглед табеле међувикија.',
+ 'interwiki_prefix' => 'ПрефикÑ',
+ 'interwiki-prefix-label' => 'ПрефикÑ:',
+ 'interwiki_prefix_intro' => 'Међувики Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ ÐºÐ¾Ñ˜Ð¸ ће бити коришћен у <code>[<nowiki />[prefix:<em>pagename</em>]]</code> викитекÑÑ‚ ÑинтакÑи.',
+ 'interwiki_url' => 'ÐдреÑа',
+ 'interwiki-url-label' => 'ÐдреÑа:',
+ 'interwiki_local' => 'Ðапред',
+ 'interwiki-local-label' => 'Ðапред:',
+ 'interwiki_trans_intro' => 'Ðко је коришћена викитекÑÑ‚ ÑинтакÑа <code>{<nowiki />{prefix:<em>pagename</em>}}</code>, онда:',
+ 'interwiki_1' => 'да',
+ 'interwiki_0' => 'не',
+ 'interwiki_error' => 'Грешка: табела међувикија је празна, или нешто друго није у реду.',
+ 'interwiki_edit' => 'Уреди',
+ 'interwiki_reasonfield' => 'Разлог:',
+ 'interwiki_delquestion' => 'Бришем „$1â€',
+ 'interwiki_deleting' => 'Ви бришете Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ "$1".',
+ 'interwiki_deleted' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ "$1" је уÑпешно обриÑан из табеле међувикија.',
+ 'interwiki_delfailed' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ "$1" није могао бити обриÑан из табеле међувикија.',
+ 'interwiki_addtext' => 'Додај интервики префикÑ',
+ 'interwiki_addintro' => 'Ви додајете један интервики префикÑ.
+Имајте на уму да он не може да Ñадржи размаке ( ), двотачку (:), амерÑанд (&), или знак једнакоÑти (=).',
+ 'interwiki_addbutton' => 'Додај',
+ 'interwiki_added' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ "$1" је уÑпешно додат у табелу међувикија.',
+ 'interwiki_addfailed' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ "$1" није могао бити додат у табелу међувикија.
+Вероватно већ поÑтоји у њој.',
+ 'interwiki_edittext' => 'Мењање међувики префикÑа',
+ 'interwiki_editintro' => 'Ви мењате један међувики префикÑ.
+Имајте на уму да може да оштети поÑтојеће међувики везе.',
+ 'interwiki_edited' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ "$1" је уÑпешно измењен у табели међувикија.',
+ 'interwiki_editerror' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ "$1" не може бити измењен у табели међувикија.
+Вероватно затшо што не поÑтоји.',
+ 'interwiki-badprefix' => 'Задати међувики Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ "$1" Ñадржи недозвољене знакове',
+ 'log-name-interwiki' => 'ИÑторија табеле међувикија',
+ 'log-description-interwiki' => 'Ово је иÑторија измена [[Special:Interwiki|табеле међувикија]].',
+ 'right-interwiki' => 'уређивање међувикија',
+);
+
+/** Serbian (Latin script) (srpski (latinica)‎)
+ * @author Michaello
+ * @author Жељко Тодоровић
+ */
+$messages['sr-el'] = array(
+ 'interwiki' => 'Pregledaj i izmeni podatke o međuvikiju',
+ 'interwiki-title-norights' => 'Pregledaj podatke o međuvikiju',
+ 'interwiki-desc' => 'Dodaje [[Special:Interwiki|specijalnu stranu]] za pregled i izmenu tabele međuvikija',
+ 'interwiki_intro' => 'Ovo je pregled tabele međuvikija.',
+ 'interwiki_prefix' => 'Prefiks',
+ 'interwiki-prefix-label' => 'Prefiks:',
+ 'interwiki_prefix_intro' => 'Međuviki prefiks koji će biti korišćen u <code>[<nowiki />[prefix:<em>pagename</em>]]</code> vikitekst sintaksi.',
+ 'interwiki_url' => 'Adresa',
+ 'interwiki-url-label' => 'Adresa:',
+ 'interwiki_local' => 'Napred',
+ 'interwiki-local-label' => 'Napred:',
+ 'interwiki_trans_intro' => 'Ako je korišćena vikitekst sintaksa <code>{<nowiki />{prefix:<em>pagename</em>}}</code>, onda:',
+ 'interwiki_1' => 'da',
+ 'interwiki_0' => 'ne',
+ 'interwiki_error' => 'Greška: tabela međuvikija je prazna, ili nešto drugo nije u redu.',
+ 'interwiki_edit' => 'Izmeni',
+ 'interwiki_reasonfield' => 'Razlog:',
+ 'interwiki_delquestion' => 'BriÅ¡em „$1â€',
+ 'interwiki_deleting' => 'Vi brišete prefiks "$1".',
+ 'interwiki_deleted' => 'Prefiks "$1" je uspešno obrisan iz tabele međuvikija.',
+ 'interwiki_delfailed' => 'Prefiks "$1" nije mogao biti obrisan iz tabele međuvikija.',
+ 'interwiki_addtext' => 'Dodaj interviki prefiks',
+ 'interwiki_addintro' => 'Vi dodajete jedan interviki prefiks.
+Imajte na umu da on ne može da sadrži razmake ( ), dvotaÄku (:), amersand (&), ili znak jednakosti (=).',
+ 'interwiki_addbutton' => 'Dodaj',
+ 'interwiki_added' => 'Prefiks "$1" je uspešno dodat u tabelu međuvikija.',
+ 'interwiki_addfailed' => 'Prefiks "$1" nije mogao biti dodat u tabelu međuvikija.
+Verovatno već postoji u njoj.',
+ 'interwiki_edittext' => 'Menjanje međuviki prefiksa',
+ 'interwiki_editintro' => 'Vi menjate jedan međuviki prefiks.
+Imajte na umu da može da ošteti postojeće međuviki veze.',
+ 'interwiki_edited' => 'Prefiks "$1" je uspešno izmenjen u tabeli međuvikija.',
+ 'interwiki_editerror' => 'Prefiks "$1" ne može biti izmenjen u tabeli međuvikija.
+Verovatno zatšo što ne postoji.',
+ 'interwiki-badprefix' => 'Zadati međuviki prefiks "$1" sadrži nedozvoljene znakove',
+ 'log-name-interwiki' => 'Istorija tabele međuvikija',
+ 'log-description-interwiki' => 'Ovo je istorija izmena [[Special:Interwiki|tabele međuvikija]].',
+ 'right-interwiki' => 'Izmeni međuviki',
+);
+
+/** Seeltersk (Seeltersk)
+ * @author Purodha
+ * @author Pyt
+ */
+$messages['stq'] = array(
+ 'interwiki' => 'Interwiki-Doaten bekiekje un beoarbaidje',
+ 'interwiki_intro' => 'Dit is n Uursicht fon dän Inhoold fon ju Interwiki-Tabelle.',
+ 'interwiki_prefix' => 'Präfix',
+ 'interwiki-prefix-label' => 'Präfix:', # Fuzzy
+ 'interwiki_error' => 'Failer: Ju Interwiki-Tabelle is loos.',
+ 'interwiki_reasonfield' => 'Gruund:',
+ 'interwiki_delquestion' => 'Läsket „$1“',
+ 'interwiki_deleting' => 'Du hoalst Prefix "$1" wäch.',
+ 'interwiki_deleted' => '„$1“ wuude mäd Ärfoulch uut ju Interwiki-Tabelle wächhoald.',
+ 'interwiki_delfailed' => '„$1“ kuude nit uut ju Interwiki-Tabelle läsked wäide.',
+ 'interwiki_addtext' => 'N Interwiki-Präfix bietouföigje',
+ 'interwiki_addintro' => 'Du föigest n näi Interwiki-Präfix bietou. Beoachte, dät et neen Loosteeken ( ), Koopmons-Un (&), Gliekhaidsteeken (=) un naan Dubbelpunkt (:) änthoolde duur.',
+ 'interwiki_addbutton' => 'Bietouföigje',
+ 'interwiki_added' => '„$1“ wuude mäd Ärfoulch ju Interwiki-Tabelle bietouföiged.',
+ 'interwiki_addfailed' => '„$1“ kuude nit ju Interwiki-Tabelle bietouföiged wäide.',
+ 'log-name-interwiki' => 'Interwiki-Tabellenlogbouk',
+ 'log-description-interwiki' => 'In dit Logbouk wäide Annerengen an ju [[Special:Interwiki|Interwiki-Tabelle]] protokollierd.',
+);
+
+/** Sundanese (Basa Sunda)
+ * @author Irwangatot
+ */
+$messages['su'] = array(
+ 'interwiki_reasonfield' => 'Alesan:',
+ 'interwiki_delquestion' => 'Ngahapus "$1"',
+);
+
+/** Swedish (svenska)
+ * @author Boivie
+ * @author Fluff
+ * @author Lejonel
+ * @author M.M.S.
+ * @author Najami
+ * @author Per
+ * @author Purodha
+ * @author Sertion
+ * @author WikiPhoenix
+ */
+$messages['sv'] = array(
+ 'interwiki' => 'Visa och redigera interwiki-data',
+ 'interwiki-title-norights' => 'Visa interwiki-data',
+ 'interwiki-desc' => 'Lägger till en [[Special:Interwiki|specialsida]] för att visa och ändra interwikitabellen',
+ 'interwiki_intro' => 'Det här är en överblick över interwiki-tabellen.',
+ 'interwiki_prefix' => 'Prefix',
+ 'interwiki-prefix-label' => 'Prefix:',
+ 'interwiki_prefix_intro' => 'Interwiki-prefix avsedda att användas i <code>[<nowiki />[prefix:<em>pagename</em>]]</code>-wikisyntax.',
+ 'interwiki_local' => 'Vidarebefordra',
+ 'interwiki-local-label' => 'Vidarebefordra:',
+ 'interwiki_local_intro' => 'En HTTP-förfrågan till den lokala wikin med denna interwiki-prefix i webbadressen är:',
+ 'interwiki_trans' => 'Transkludera',
+ 'interwiki-trans-label' => 'Transkludera:',
+ 'interwiki_intro_footer' => 'Se [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] för mer information om interwikitabellen.
+Det finns en [[Special:Log/interwiki|logg över ändringar]] i interwikitabellen.',
+ 'interwiki_1' => 'ja',
+ 'interwiki_0' => 'nej',
+ 'interwiki_error' => 'FEL: Interwikitabellen är tom, eller så gick något fel.',
+ 'interwiki_edit' => 'Redigera',
+ 'interwiki_reasonfield' => 'Anledning:',
+ 'interwiki_delquestion' => 'Ta bort "$1"',
+ 'interwiki_deleting' => 'Du håller på att ta bort prefixet "$1".',
+ 'interwiki_deleted' => 'Prefixet "$1 har raderats från interwikitabellen.',
+ 'interwiki_delfailed' => 'Prefixet "$1" kunde inte raderas från interwikitabellen.',
+ 'interwiki_addtext' => 'Lägg till ett interwikiprefix',
+ 'interwiki_addintro' => 'Du håller på att lägga till ett nytt interwikiprefix.
+Kom ihåg att det inte kan innehålla mellanslag ( ), kolon (:), &-tecken eller likhetstecken (=).',
+ 'interwiki_addbutton' => 'Lägg till',
+ 'interwiki_added' => 'Prefixet "$1" har lagts till i interwikitabellen.',
+ 'interwiki_addfailed' => 'Prefixet "$1" kunde inte läggas till i interwikitabellen.
+Det är möjligt att prefixet redan finns i tabellen.',
+ 'interwiki_edittext' => 'Redigera ett interwikiprefix',
+ 'interwiki_editintro' => 'Du redigerar ett interwikiprefix. Notera att detta kan förstöra existerande länkar.',
+ 'interwiki_edited' => 'Prefixet "$1" har ändrats i interwikitabellen.',
+ 'interwiki_editerror' => 'Prefixet "$1" kan inte ändras i interwikitabellen. Det är möjligt att det inte finns.',
+ 'interwiki-badprefix' => 'Specificerat interwikiprefix "$1" innehåller ogiltiga tecken',
+ 'interwiki-submit-empty' => 'Prefix och URL-adressen kan inte vara tomma.',
+ 'log-name-interwiki' => 'Interwikitabellogg',
+ 'log-description-interwiki' => 'Detta är en logg över ändringar i [[Special:Interwiki|interwikitabellen]].',
+ 'right-interwiki' => 'Redigera interwikidata',
+ 'action-interwiki' => 'ändra det här interwikielementet',
+);
+
+/** Swahili (Kiswahili)
+ * @author Ikiwaner
+ */
+$messages['sw'] = array(
+ 'interwiki_1' => 'ndiyo',
+);
+
+/** Silesian (ślůnski)
+ * @author Herr Kriss
+ */
+$messages['szl'] = array(
+ 'interwiki_reasonfield' => 'ÄŒymu:',
+ 'interwiki_addbutton' => 'Dodej',
+);
+
+/** Tamil (தமிழà¯)
+ * @author Karthi.dr
+ * @author செலà¯à®µà®¾
+ */
+$messages['ta'] = array(
+ 'interwiki' => ' interwiki தரவைப௠பாரà¯à®¤à¯à®¤à¯à®¤à¯ திரà¯à®¤à¯à®¤à¯à®•',
+ 'interwiki-title-norights' => 'Interwiki தரவைப௠பாரà¯à®•à¯à®•',
+ 'interwiki_prefix' => 'à®®à¯à®©à¯à®©à¯Šà®Ÿà¯à®Ÿà¯',
+ 'interwiki-prefix-label' => 'à®®à¯à®©à¯à®©à¯Šà®Ÿà¯à®Ÿà¯',
+ 'interwiki_local' => 'à®®à¯à®©à¯ செலà¯',
+ 'interwiki-local-label' => 'à®®à¯à®©à¯ செலà¯',
+ 'interwiki_1' => 'ஆமà¯',
+ 'interwiki_0' => 'இலà¯à®²à¯ˆ',
+ 'interwiki_edit' => 'தொகà¯',
+ 'interwiki_reasonfield' => 'காரணமà¯:',
+ 'interwiki_delquestion' => '" $1 " நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯',
+ 'interwiki_addtext' => 'Interwiki à®®à¯à®©à¯à®©à¯Šà®Ÿà¯à®Ÿà¯ˆà®šà¯ சேரà¯',
+ 'interwiki_addintro' => 'நீஙà¯à®•à®³à¯ பà¯à®¤à®¿à®¯ interwiki à®®à¯à®©à¯à®©à¯Šà®Ÿà¯à®Ÿà¯ˆà®šà¯ சேரà¯à®•à¯à®•à®¿à®±à¯€à®°à¯à®•à®³à¯.
+நினைவிற௠கொளà¯à®•: இதில௠இடைவெளி ( ), அரைபà¯à®ªà¯à®³à¯à®³à®¿ (:), மறà¯à®±à¯à®®à¯ கà¯à®±à®¿ (&), அலà¯à®²à®¤à¯ சமகà¯à®•à¯à®±à®¿ (=) இரà¯à®•à¯à®•à®•à¯ கூடாதà¯',
+ 'interwiki_addbutton' => 'சேரà¯',
+ 'right-interwiki' => 'விகà¯à®•à®¿à®¯à®¿à®Ÿà¯ˆà®ªà¯ பரிமாறà¯à®±à®¤à¯ தரவà¯à®•à®³à¯ˆà®¤à¯ தொகà¯',
+ 'action-interwiki' => 'இநà¯à®¤ interwiki உளà¯à®³à¯€à®Ÿà®¿à®©à¯ˆ மாறà¯à®±à¯',
+);
+
+/** Tulu (ತà³à²³à³)
+ * @author VASANTH S.N.
+ */
+$messages['tcy'] = array(
+ 'interwiki_edit' => 'ತಿದà³à²¦à³â€˜à²²à³†',
+ 'interwiki_reasonfield' => 'ಕಾರಣ',
+ 'interwiki_addbutton' => 'ಸೇರಾಲೆ',
+);
+
+/** Telugu (తెలà±à°—à±)
+ * @author Kiranmayee
+ * @author Veeven
+ */
+$messages['te'] = array(
+ 'interwiki' => 'అంతరà±à°µà°¿à°•à±€ భోగటà±à°Ÿà°¾à°¨à°¿ చూడండి మరియౠమారà±à°šà°‚à°¡à°¿',
+ 'interwiki-title-norights' => 'అంతరà±à°µà°¿à°•à±€ భోగటà±à°Ÿà°¾ చూడండి',
+ 'interwiki_intro' => 'ఇది అంతరà±à°µà°¿à°•à±€ పటà±à°Ÿà°¿à°• యొకà±à°• సంగà±à°°à°¹à°‚.',
+ 'interwiki_prefix' => 'ఉపసరà±à°—',
+ 'interwiki-prefix-label' => 'ఉపసరà±à°—:',
+ 'interwiki_local' => 'à°®à±à°‚à°¦à±à°•à±',
+ 'interwiki-local-label' => 'à°®à±à°‚à°¦à±à°•à±:',
+ 'interwiki_intro_footer' => 'అంతరà±à°µà°¿à°•à±€ పటà±à°Ÿà°¿à°• à°—à±à°°à°¿à°‚à°šà°¿à°¨ మరింత సమాచారానà±à°¨à°¿ [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org]లో చూడండి.
+అంతరà±à°µà°¿à°•à±€ పటà±à°Ÿà°¿à°•à°•à°¿ జరిగిన [[Special:Log/interwiki|మారà±à°ªà±à°² యొకà±à°• à°šà°¿à°Ÿà±à°Ÿà°¾]] కూడా ఉంది.',
+ 'interwiki_1' => 'à°…à°µà±à°¨à±',
+ 'interwiki_0' => 'కాదà±',
+ 'interwiki_error' => 'పొరపాటà±: అంతరà±à°µà°¿à°•à±€ పటà±à°Ÿà°¿à°• ఖాళీగా ఉంది, లేదా à°à°¦à±‹ తపà±à°ªà± జరిగింది.',
+ 'interwiki_edit' => 'మారà±à°šà±',
+ 'interwiki_reasonfield' => 'కారణం:',
+ 'interwiki_delquestion' => '"$1"ని తొలగిసà±à°¤à±à°¨à±à°¨à°¾à°°à±',
+ 'interwiki_deleting' => 'మీరౠ"$1" అనే ఉపసరà±à°—ని తొలగించబోతà±à°¨à±à°¨à°¾à°°à±.',
+ 'interwiki_deleted' => 'అంతరà±à°µà°¿à°•à±€ పటà±à°Ÿà°¿à°• à°¨à±à°‚à°¡à°¿ "$1" అనే ఉపసరà±à°—ని విజయవంతంగా తొలగించాం.',
+ 'interwiki_delfailed' => 'అంతరà±à°µà°¿à°•à±€ పటà±à°Ÿà°¿à°• à°¨à±à°‚à°¡à°¿ "$1" అనే ఉపసరà±à°—ని తొలగించలేకపోయాం.',
+ 'interwiki_addtext' => 'à°“ అంతరà±à°µà°¿à°•à±€ ఉపసరà±à°—ని చేరà±à°šà°‚à°¡à°¿',
+ 'interwiki_addbutton' => 'చేరà±à°šà±',
+ 'log-name-interwiki' => 'అంతరà±à°µà°¿à°•à±€ పటà±à°Ÿà°¿à°• à°šà°¿à°Ÿà±à°Ÿà°¾',
+ 'log-description-interwiki' => 'ఇది [[Special:Interwiki|అంతరà±à°µà°¿à°•à±€ పటà±à°Ÿà°¿à°•]]à°•à°¿ జరిగిన మారà±à°ªà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾.',
+ 'right-interwiki' => 'అంతరà±à°µà°¿à°•à±€ సమాచారమౠమారà±à°šà±',
+);
+
+/** Tetum (tetun)
+ * @author MF-Warburg
+ */
+$messages['tet'] = array(
+ 'interwiki_1' => 'sin',
+ 'interwiki_0' => 'lae',
+ 'interwiki_edit' => 'Edita',
+ 'interwiki_reasonfield' => 'Motivu:',
+ 'interwiki_delquestion' => 'Halakon $1',
+ 'interwiki_addbutton' => 'Tau tan',
+);
+
+/** Tajik (Cyrillic script) (тоҷикӣ)
+ * @author Ibrahim
+ */
+$messages['tg-cyrl'] = array(
+ 'interwiki_reasonfield' => 'Сабаб:',
+ 'interwiki_delquestion' => 'Дар ҳоли ҳазфи "$1"',
+ 'interwiki_addbutton' => 'Илова',
+);
+
+/** Tajik (Latin script) (tojikī)
+ * @author Liangent
+ */
+$messages['tg-latn'] = array(
+ 'interwiki_reasonfield' => 'Sabab:',
+ 'interwiki_delquestion' => 'Dar holi hazfi "$1"',
+ 'interwiki_addbutton' => 'Ilova',
+);
+
+/** Thai (ไทย)
+ * @author Manop
+ * @author Passawuth
+ */
+$messages['th'] = array(
+ 'interwiki' => 'ดูà¹à¸¥à¸°à¹à¸à¹‰à¹„ขข้อมูลอินเตอร์วิà¸à¸´',
+ 'interwiki-title-norights' => 'ดูข้อมูลอินเตอร์วิà¸à¸´',
+ 'interwiki_prefix' => 'คำนำหน้า',
+ 'interwiki-prefix-label' => 'คำนำหน้า:', # Fuzzy
+ 'interwiki_reasonfield' => 'เหตุผล:',
+ 'interwiki_delquestion' => 'ลบ "$1"',
+ 'interwiki_addbutton' => 'เพิ่ม',
+ 'interwiki_edittext' => 'à¹à¸à¹‰à¹„ขคำนำหน้าอินเตอร์วิà¸à¸´',
+ 'right-interwiki' => 'à¹à¸à¹‰à¹„ขข้อมูลอินเตอร์วิà¸à¸´',
+);
+
+/** Turkmen (Türkmençe)
+ * @author Hanberke
+ */
+$messages['tk'] = array(
+ 'interwiki_edit' => 'Redaktirle',
+);
+
+/** Tagalog (Tagalog)
+ * @author AnakngAraw
+ */
+$messages['tl'] = array(
+ 'interwiki' => "Tingnan at baguhin ang datong pangugnayang-wiki (''interwiki'')",
+ 'interwiki-title-norights' => "Tingnan ang datong pangugnayang-wiki (''interwiki'')",
+ 'interwiki-desc' => 'Nagdaragdag ng isang [[Special:Interwiki|natatanging pahina]] upang matingnan at mabago ang tablang pang-ugnayang wiki',
+ 'interwiki_intro' => "Isa itong paglalarawan ng tabla ng ugnayang-wiki (''interwiki'').",
+ 'interwiki-legend-show' => 'Ipakita ang alamat',
+ 'interwiki-legend-hide' => 'Ikubli ang alamat',
+ 'interwiki_prefix' => 'Unlapi',
+ 'interwiki-prefix-label' => 'Unlapi:',
+ 'interwiki_prefix_intro' => 'Unlapi ng ugnayang-wiki na gagamitin sa loob ng palaugnayang <code>[<nowiki />[prefix:<em>pagename</em>]]</code> ng teksto ng wiki.',
+ 'interwiki_url' => 'URL',
+ 'interwiki-url-label' => 'URL:',
+ 'interwiki_url_intro' => 'Suleras para sa mga URL. Ang tagpaghawak ng pook na $1 ay mapapalitan ng <em>pagename</em> ng teksto ng wiki, kapag ginamit ang nabanggit sa itaas na palaugnayang teksto ng wiki.',
+ 'interwiki_local' => 'Isulong',
+ 'interwiki-local-label' => 'Pasulong:',
+ 'interwiki_local_intro' => 'Ang isang kahilingang http sa pampook na wiki na may ganitong unlapi ng ugnayang-wiki na nasa loob ng URL ay:',
+ 'interwiki_local_0_intro' => 'huwag tanggapin, karaniwang hinahadlangan ng "hindi natagpuan ang pahina",',
+ 'interwiki_local_1_intro' => 'itinuro papunta sa pinupukol na ibinigay na URL sa loob ng mga kahulugan ng kawing ng ugnayang-wiki (iyong mga itinuturing na katulad ng mga sanggunian sa pampook na mga pahina)',
+ 'interwiki_trans' => 'Paglilipat-sama (transklusyon)',
+ 'interwiki-trans-label' => 'Ilipat-sama:',
+ 'interwiki_trans_intro' => 'Kapag ginamit ang palaugnayang <code>{<nowiki />{prefix:<em>pagename</em>}}</code> ng teksto ng wiki, kung gayon:',
+ 'interwiki_trans_1_intro' => 'pahintulutan ang paglilipat-sama mula sa dayuhang wiki, kung pangkalahatang pinapayagan sa wiking ito ang paglilipat-sama',
+ 'interwiki_trans_0_intro' => 'huwag itong pahintulutan, sa halip maghanap ng isang pahinang nasa loob ng espasyo ng pangalan ng suleras.',
+ 'interwiki_intro_footer' => 'Tingnan ang [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] para sa mas marami pang mga kabatiran hinggil sa tabla ng ugnayang-wiki.
+Mayroong isang [[Special:Log/interwiki|talaan ng mga pagbabago]] sa tabla ng ugnayang-wiki.',
+ 'interwiki_1' => 'oo',
+ 'interwiki_0' => 'hindi',
+ 'interwiki_error' => "Kamalian: Walang laman ang tablang pangugnayang-wiki (''interwiki''), o may iba pang bagay na nagkaroon ng kamalian/suliranin.",
+ 'interwiki-cached' => 'Nakatago ang dato ng interwiki. Hindi maaari ang pagbago sa taguan.',
+ 'interwiki_edit' => 'Baguhin',
+ 'interwiki_reasonfield' => 'Dahilan:',
+ 'interwiki_delquestion' => 'Binubura ang "$1"',
+ 'interwiki_deleting' => 'Binubura mo ang unlaping "$1".',
+ 'interwiki_deleted' => "Matagumpay na natanggal ang unlaping \"\$1\" mula sa tablang pangugnayang-wiki (''interwiki'').",
+ 'interwiki_delfailed' => "Hindi matanggal ang unlaping \"\$1\" mula sa tablang pangugnayang-wiki (''interwiki'').",
+ 'interwiki_addtext' => "Magdagdag ng isang unlaping pangugnayang-wiki (''interwiki'')",
+ 'interwiki_addintro' => "Nagdaragdag ng isang bagong unlaping pangugnayang-wiki (''interwiki'').
+Tandaan lamang na hindi ito maaaring maglaman ng mga puwang ( ), mga tutuldok (:), bantas para sa \"at\" (&), o mga bantas na pangkatumbas (=).",
+ 'interwiki_addbutton' => 'Idagdag',
+ 'interwiki_added' => "Matagumpay na naidagdag ang unlaping \"\$1\" sa tablang pangugnayang-wiki (''interwiki'').",
+ 'interwiki_addfailed' => "Hindi maidagdag ang unlaping \"\$1\" sa tablang pangugnayang-wiki (''interwiki'').
+Maaaring umiiral na ito sa loob ng tablang pangugnayang-wiki.",
+ 'interwiki_edittext' => "Binabago ang isang unlaping pangugnayang-wiki (''interwiki'')",
+ 'interwiki_editintro' => "Binabago mo ang unlaping pangugnayang-wiki (''interwiki'').
+Tandaan na maaaring maputol nito ang umiiral na mga kawing.",
+ 'interwiki_edited' => "Matagumpay na nabago ang unlaping \"\$1\" sa loob ng tablang pangugnayang-wiki (''interwiki'').",
+ 'interwiki_editerror' => "Hindi mabago ang unlaping \"\$1\" sa loob ng tablang pangugnayang-wiki (''interwiki'').
+Maaaring hindi pa ito umiiral.",
+ 'interwiki-badprefix' => "Naglalaman ang tinukoy na pangpaguugnayan ng wiking (''interwiki'') unlaping \"\$1\" ng hindi tanggap na mga panitik",
+ 'interwiki-submit-empty' => 'Ang unlapi at ang URL ay hindi maaaring walang laman.',
+ 'interwiki-submit-invalidurl' => 'Hindi katanggap-tanggap ang URL ng protokol.',
+ 'log-name-interwiki' => 'Talaan ng tablang pang-ugnayang wiki',
+ 'logentry-interwiki-iw_add' => 'Si $1 ay {{GENDER:$2|nagdagdag}} ng unlaping "$4" ($5) (transklusyon: $6; lokal: $7) sa talangguhit ng ugnayang wiki',
+ 'logentry-interwiki-iw_edit' => 'Si $1 ay {{GENDER:$2|nagbago}} ng unlaping "$4" ($5) (trans: $6; lokal: $7) sa loob ng talangguhit ng ugnayang wiki',
+ 'logentry-interwiki-iw_delete' => 'Si $1 ay {{GENDER:$2|nagtanggal}} ng unlaping "$4" mula sa talangguhit ng ugnayang wiki',
+ 'log-description-interwiki' => 'Isa itong talaan ng mga pagbabago sa [[Special:Interwiki|tablang pang-ugnayang wiki]].',
+ 'right-interwiki' => "Baguhin ang datong pangugnayang-wiki (''interwiki'')",
+ 'action-interwiki' => "baguhin ang ipinasok/entradang ito na pang-ugnayang wiki (''interwiki'')",
+);
+
+/** Tok Pisin (Tok Pisin)
+ * @author Iketsi
+ */
+$messages['tpi'] = array(
+ 'interwiki_edit' => 'Senisim',
+);
+
+/** Turkish (Türkçe)
+ * @author Homonihilis
+ * @author Joseph
+ * @author Karduelis
+ * @author Suelnur
+ * @author Vito Genovese
+ */
+$messages['tr'] = array(
+ 'interwiki' => 'Vikilerarası veriyi gör ve değiştir',
+ 'interwiki-title-norights' => 'Vikilerarası veriyi gör',
+ 'interwiki-desc' => 'Vikilerarası tabloyu görmek ve değiştirmek için [[Special:Interwiki|özel bir sayfa]] ekler',
+ 'interwiki_intro' => 'Bu vikilerarası tabloya genel bir bakıştır.',
+ 'interwiki_prefix' => 'Önek',
+ 'interwiki-prefix-label' => 'Önek:',
+ 'interwiki_local' => 'Yönlendir',
+ 'interwiki-local-label' => 'Yönlendir:',
+ 'interwiki_trans' => 'Görüntüle',
+ 'interwiki-trans-label' => 'Görüntüle:',
+ 'interwiki_1' => 'evet',
+ 'interwiki_0' => 'hayır',
+ 'interwiki_error' => 'Hata: İnterviki tablosu boş ya da başka bir şeyde sorun çıktı.',
+ 'interwiki_edit' => 'DeÄŸiÅŸtir',
+ 'interwiki_reasonfield' => 'Neden:',
+ 'interwiki_delquestion' => '\'\'$1" siliniyor',
+ 'interwiki_addtext' => 'Bir interviki öneki ekler',
+ 'interwiki_addbutton' => 'Ekle',
+ 'right-interwiki' => 'İnterviki verilerini düzenler',
+ 'action-interwiki' => 'bu interviki girdisini deÄŸiÅŸtir',
+);
+
+/** Tatar (Cyrillic script) (татарча)
+ * @author Ajdar
+ * @author Ильнар
+ */
+$messages['tt-cyrl'] = array(
+ 'interwiki' => 'Интервики көйләнмәләрен карау һәм үзгәртү',
+ 'interwiki-title-norights' => 'Интервики турында мәгълүматларны үзгәртү',
+ 'interwiki-desc' => 'Интервики Ñылтамаларны карау һәм үзгәртү өчен [[Special:Interwiki|махÑуÑ]] бит Ó©Ñти',
+ 'interwiki_intro' => 'Бу интервики җәдвәленә манзара.',
+ 'interwiki_prefix' => 'Ó¨Ñтәлмә',
+ 'interwiki-prefix-label' => 'Ó¨Ñтәлмә',
+ 'interwiki_1' => 'әйе',
+ 'interwiki_0' => 'юк',
+ 'interwiki_reasonfield' => 'Сәбәп:',
+ 'interwiki_addbutton' => 'Ó¨Ñтәргә',
+);
+
+/** Central Atlas Tamazight (ⵜⴰⵎⴰⵣⵉⵖⵜ)
+ * @author Tifinaghes
+ */
+$messages['tzm'] = array(
+ 'interwiki_1' => 'ⵢⴰⵀ',
+ 'interwiki_0' => 'ⵓⵀ ⵓ',
+ 'interwiki_edit' => 'ⴱⴷⴷⴻâµ',
+ 'interwiki_reasonfield' => 'ⴰⵙⵔⴰⴳ:',
+ 'interwiki_addbutton' => 'âµ”âµâµ“',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|added}} prefix "$4" ($5) (trans: $6; local: $7) to the interwiki table',
+);
+
+/** Uyghur (Arabic script) (ئۇيغۇرچە)
+ * @author Sahran
+ */
+$messages['ug-arab'] = array(
+ 'interwiki_1' => 'ھەئە',
+ 'interwiki_0' => 'ياق',
+ 'interwiki_edit' => 'تەھرىر',
+ 'interwiki_reasonfield' => 'سەۋەب:',
+ 'interwiki_addbutton' => 'قوش',
+);
+
+/** Ukrainian (українÑька)
+ * @author AS
+ * @author Ahonc
+ * @author Base
+ * @author Hypers
+ * @author Microcell
+ * @author Prima klasy4na
+ * @author VolodymyrF
+ * @author Vox
+ */
+$messages['uk'] = array(
+ 'interwiki' => 'ПереглÑд Ñ– Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… інтервікі',
+ 'interwiki-title-norights' => 'ПереглÑнути дані інтервікі',
+ 'interwiki-desc' => 'Додає [[Special:Interwiki|Ñпеціальну Ñторінку]] Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду Ñ– Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– інтервікі',
+ 'interwiki_intro' => 'Це оглÑд таблиці інтервікі.',
+ 'interwiki-legend-show' => 'Показати легенду',
+ 'interwiki-legend-hide' => 'Приховати легенду',
+ 'interwiki_prefix' => 'ПрефікÑ',
+ 'interwiki-prefix-label' => 'ПрефікÑ:',
+ 'interwiki_prefix_intro' => 'ÐŸÑ€ÐµÑ„Ñ–ÐºÑ Ñ–Ð½Ñ‚ÐµÑ€Ð²Ñ–ÐºÑ– Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñƒ ÑинтакÑиÑÑ– вікі-текÑту: <code>[<nowiki />[префікÑ:<em>назва Ñторінки</em>]]</code>.',
+ 'interwiki_url_intro' => 'Шаблон Ð´Ð»Ñ URL-адреÑ. ЗаміÑÑ‚ÑŒ $1 буде підÑтавлено <em>назву Ñторінки</em> вікітекÑту, Ñкщо викориÑтовуєтьÑÑ Ð²Ð¸Ñ‰ÐµÐ·Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ ÑинтакÑÐ¸Ñ Ð²Ñ–ÐºÑ–Ñ‚ÐµÐºÑту.',
+ 'interwiki_local' => 'ВідÑиланнÑ',
+ 'interwiki-local-label' => 'ВідÑиланнÑ:',
+ 'interwiki_local_intro' => 'HTTP-запит у міÑцеву вікі з інтервікі-префікÑом в URL:',
+ 'interwiki_local_0_intro' => 'не допуÑкаєтьÑÑ, Ñк правило, блокуєтьÑÑ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñм "Ñторінка не знайдена",',
+ 'interwiki_local_1_intro' => 'перенаправлÑÑ” на цільовий URL, вказаний у визначенні інтервікі-поÑÐ¸Ð»Ð°Ð½Ð½Ñ (тобто, розглÑдаєтьÑÑ Ñк поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° міÑцевих Ñторінках)',
+ 'interwiki_trans' => 'ВключеннÑ',
+ 'interwiki-trans-label' => 'ВключеннÑ:',
+ 'interwiki_trans_intro' => 'Якщо викориÑтовуєтьÑÑ ÑинтакÑÐ¸Ñ Ð²Ñ–ÐºÑ–Ñ‚ÐµÐºÑту <code>{<nowiki />{префікÑ:<em>назва Ñторінки</em>}}</code>, то:',
+ 'interwiki_trans_1_intro' => 'дозволÑÑ” Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð· інших вікі, Ñкщо інтервікі-Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ñ– в цій вікі,',
+ 'interwiki_trans_0_intro' => 'не дозволÑÑ” включеннÑ, натоміÑÑ‚ÑŒ шукаєтьÑÑ Ñторінка у проÑторі імен шаблонів.',
+ 'interwiki_intro_footer' => 'Докладніше про таблицю інтервікі можна подивитиÑÑŒ на [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org].
+ІÑнує також [[Special:Log/interwiki|журнал змін]] таблиці інтервікі.',
+ 'interwiki_1' => 'так',
+ 'interwiki_0' => 'ні',
+ 'interwiki_error' => 'Помилка: Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ñ–Ð½Ñ‚ÐµÑ€Ð²Ñ–ÐºÑ– Ð¿Ð¾Ñ€Ð¾Ð¶Ð½Ñ Ð°Ð±Ð¾ щоÑÑŒ іще пішло не так.',
+ 'interwiki-cached' => 'Дані інтервікі взÑто з кешу. Зміни кешу неможливі.',
+ 'interwiki_edit' => 'Редагувати',
+ 'interwiki_reasonfield' => 'Причина:',
+ 'interwiki_delquestion' => 'Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ "$1"',
+ 'interwiki_deleting' => 'Ви видалÑєте Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ "$1".',
+ 'interwiki_deleted' => 'ÐŸÑ€ÐµÑ„Ñ–ÐºÑ "$1" було уÑпішно видалено з таблиці інтервікі.',
+ 'interwiki_delfailed' => 'ÐŸÑ€ÐµÑ„Ñ–ÐºÑ "$1" не може бути видалений з таблиці інтервікі.',
+ 'interwiki_addtext' => 'Додати Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ñ–Ð½Ñ‚ÐµÑ€Ð²Ñ–ÐºÑ–',
+ 'interwiki_addintro' => "Ви додаєте новий Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ñ–Ð½Ñ‚ÐµÑ€Ð²Ñ–ÐºÑ–.
+Пам'Ñтайте, що він не може міÑтити пробіли ( ), двокрапки (:), амперÑанди (&) або знаки рівноÑÑ‚Ñ– (=).",
+ 'interwiki_addbutton' => 'Додати',
+ 'interwiki_added' => 'ÐŸÑ€ÐµÑ„Ñ–ÐºÑ "$1" було уÑпішно додано до таблиці інтервікі.',
+ 'interwiki_addfailed' => 'ÐŸÑ€ÐµÑ„Ñ–ÐºÑ "$1" не може бути доданий до таблиці інтервікі.
+Можливо, він вже Ñ–Ñнує в таблиці інтервікі.',
+ 'interwiki_edittext' => 'Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€ÐµÑ„Ñ–ÐºÑу інтервікі',
+ 'interwiki_editintro' => "Ви редагуєте Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ñ–Ð½Ñ‚ÐµÑ€Ð²Ñ–ÐºÑ–.
+Пам'Ñтайте, що це може пошкодити Ñ–Ñнуючі поÑиланнÑ.",
+ 'interwiki_edited' => 'ÐŸÑ€ÐµÑ„Ñ–ÐºÑ "$1" був уÑпішно змінений в таблиці інтервікі.',
+ 'interwiki_editerror' => 'ÐŸÑ€ÐµÑ„Ñ–ÐºÑ "$1" не може бути змінений в таблиці інтервікі.
+Можливо, його не Ñ–Ñнує.',
+ 'interwiki-badprefix' => 'Зазначений інтервікі-Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ "$1" міÑтить неприпуÑтимі Ñимволи',
+ 'interwiki-submit-empty' => 'ÐŸÑ€ÐµÑ„Ñ–ÐºÑ Ñ– URL-адреÑа не можуть бути порожніми.',
+ 'interwiki-submit-invalidurl' => 'ÐеприпуÑтимий протокол в URL.',
+ 'log-name-interwiki' => 'Журнал таблиці інтервікі',
+ 'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|змінив|змінила}} Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Â«$4» ($5) (trans: $6; local: $7) в таблиці інтервікі',
+ 'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|змінив|змінила}} Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Â«$4» ($5) (trans: $6; local: $7) в таблиці інтервікі',
+ 'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|вилучив|вилучила}} Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Â«$4» з таблиці інтервікі',
+ 'log-description-interwiki' => 'Це журнал змін [[Special:Interwiki|таблиці інтервікі]].',
+ 'right-interwiki' => 'Редагувати дані інтервікі',
+ 'action-interwiki' => 'зміну цього запиÑу інтервікі',
+);
+
+/** Urdu (اردو)
+ * @author Tahir mq
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['ur'] = array(
+ 'interwiki-legend-show' => 'لیجنڈ دکھائیں',
+ 'interwiki-legend-hide' => 'لیجنڈ چھپائیں',
+ 'interwiki_prefix' => 'سابقے',
+ 'interwiki-prefix-label' => 'سابقے',
+ 'interwiki_1' => 'جی Ûاں',
+ 'interwiki_0' => 'Ù†Ûیں',
+ 'interwiki_edit' => 'ترمیم کریں',
+ 'interwiki_reasonfield' => 'وجÛ:',
+ 'interwiki_addbutton' => 'شامل کریں',
+ 'right-interwiki' => 'بین الویکی معطیات (ڈیٹا) میں ترمیم کریں',
+ 'action-interwiki' => 'ÛŒÛ Ø¨ÛŒÙ† الویکی اندراج تبدیل کریں',
+);
+
+/** Uzbek (oʻzbekcha)
+ * @author CoderSI
+ */
+$messages['uz'] = array(
+ 'log-name-interwiki' => "Interviki jadvalidagi o'zgarishlar qaydlari",
+);
+
+/** vèneto (vèneto)
+ * @author Candalua
+ */
+$messages['vec'] = array(
+ 'interwiki' => 'Varda e modìfega i dati interwiki',
+ 'interwiki-title-norights' => 'Varda i dati interwiki',
+ 'interwiki_intro' => 'Sta qua la xe na panoramica de la tabèla dei interwiki.',
+ 'interwiki_prefix' => 'Prefisso',
+ 'interwiki-prefix-label' => 'Prefisso:',
+ 'interwiki_local' => 'Avanti',
+ 'interwiki-local-label' => 'Avanti:',
+ 'interwiki_trans' => 'Transcludi',
+ 'interwiki-trans-label' => 'Transcludi:',
+ 'interwiki_1' => 'sì',
+ 'interwiki_0' => 'no',
+ 'interwiki_error' => 'ERÓR: La tabèla dei interwiki la xe voda, o ghe xe qualche altro erór.',
+ 'interwiki_edit' => 'Modìfega',
+ 'interwiki_reasonfield' => 'Motivassion:',
+ 'interwiki_delquestion' => 'Scancelassion de "$1"',
+ 'interwiki_deleting' => 'Te sì drio scancelar el prefisso "$1"',
+ 'interwiki_deleted' => 'El prefisso "$1" el xe stà scancelà da la tabèla dei interwiki.',
+ 'interwiki_delfailed' => 'No s\'à podesto cavar el prefisso "$1" da la tabèla dei interwiki.',
+ 'interwiki_addtext' => 'Zonta un prefisso interwiki',
+ 'interwiki_addintro' => 'Te sì drio zontar un prefisso interwiki novo.
+No xe mia parmessi i caràteri: spassio ( ), do ponti (:), e comerçial (&), sìnbolo de uguale (=).',
+ 'interwiki_addbutton' => 'Zonta',
+ 'interwiki_added' => 'El prefisso "$1" el xe stà zontà a la tabèla dei interwiki.',
+ 'interwiki_addfailed' => 'No se riesse a zontar el prefisso "$1" a la tabèla dei interwiki.
+El prefisso el podarìa èssar xà presente in tabèla.',
+ 'interwiki_edittext' => 'Modìfega de un prefisso interwiki',
+ 'interwiki_editintro' => 'Te sì drio modificar un prefisso interwiki.
+Ocio a no desfar i colegamenti esistenti.',
+ 'interwiki_edited' => 'El prefisso "$1" el xe stà canbià in te la tabèla dei interwiki.',
+ 'interwiki_editerror' => 'No se riesse a canbiar el prefisso "$1" in te la tabèla dei interwiki.
+Sto prefisso el podarìa èssar inesistente.',
+ 'interwiki-badprefix' => 'El prefisso interwiki speçificà ("$1") el contien caràteri mia validi',
+ 'log-name-interwiki' => 'Registro de la tabèla interwiki',
+ 'log-description-interwiki' => 'Registro dei canbiamenti fati a la [[Special:Interwiki|tabèla dei interwiki]].',
+ 'right-interwiki' => 'Cànbia i dati interwiki',
+);
+
+/** Veps (vepsän kel’)
+ * @author Игорь БродÑкий
+ */
+$messages['vep'] = array(
+ 'interwiki_prefix' => 'Prefiks',
+ 'interwiki-prefix-label' => 'Prefiks:', # Fuzzy
+ 'interwiki_1' => 'ka',
+ 'interwiki_0' => 'ei',
+ 'interwiki_edit' => 'Redaktiruida',
+ 'interwiki_reasonfield' => 'Sü:',
+ 'interwiki_addbutton' => 'Ližata',
+ 'interwiki_edittext' => 'Interwiki-prefiksoiden redaktiruind',
+);
+
+/** Vietnamese (Tiếng Việt)
+ * @author Minh Nguyen
+ * @author Vinhtantran
+ */
+$messages['vi'] = array(
+ 'interwiki' => 'Xem và sửa đổi dữ liệu vỠliên kết liên wiki',
+ 'interwiki-title-norights' => 'Xem dữ liệu liên wiki',
+ 'interwiki-desc' => 'Thêm một [[Special:Interwiki|trang đặc biệt]] để xem sửa đổi bảng liên wiki',
+ 'interwiki_intro' => 'Äây là ná»™i dung của bảng liên wiki.',
+ 'interwiki-legend-show' => 'Xem chú giải',
+ 'interwiki-legend-hide' => 'Ẩn chú giải',
+ 'interwiki_prefix' => 'Tiá»n tố',
+ 'interwiki-prefix-label' => 'Tiá»n tố:',
+ 'interwiki_prefix_intro' => 'Tiá»n tố liên wiki dùng trong cú pháp wiki <code>[<nowiki />[tiá»n tố:<em>tên trang</em>]]</code>.',
+ 'interwiki_url_intro' => 'Mẫu địa chỉ URL. Dấu hiệu $1 được thay bằng <em>tiá»n tố</em> khi nào sá»­ dụng cú pháp ở trên.',
+ 'interwiki_local' => 'Chuyển tiếp',
+ 'interwiki-local-label' => 'Chuyển tiếp:',
+ 'interwiki_local_intro' => 'Khi nào truy cập wiki bá»™ phận dùng tiá»n tố liên wiki trong URL, yêu cầu HTTP được:',
+ 'interwiki_local_0_intro' => 'bác bá», thÆ°á»ng bị chặn vá»›i kết quả “không tìm thấy trangâ€,',
+ 'interwiki_local_1_intro' => 'đổi hướng tới URL đích trong định nghĩa liên kết liên wiki, nó coi như là URL dẫn đến trang địa phương',
+ 'interwiki_trans' => 'Nhúng bản mẫu',
+ 'interwiki-trans-label' => 'Nhúng bản mẫu:',
+ 'interwiki_trans_intro' => 'Khi nào sá»­ dụng cú pháp wiki <code>{<nowiki />{tiá»n tố:<em>tên trang</em>}}</code>:',
+ 'interwiki_trans_1_intro' => 'cho phép nhúng trang từ wiki bên ngoài, nếu wiki này cho phép nhúng trang liên wiki nói chung',
+ 'interwiki_trans_0_intro' => 'thay vì cho phép nhúng liên wiki, tìm kiếm trang trong không gian tên bản mẫu địa phương.',
+ 'interwiki_intro_footer' => 'Xem [//www.mediawiki.org/wiki/Manual:Interwiki_table?uselang=vi MediaWiki.org] để biết thêm thông tin vỠbảng liên wiki.
+Có [[Special:Log/interwiki|nhật trình các thay đổi]] tại bảng liên wiki.',
+ 'interwiki_1' => 'có',
+ 'interwiki_0' => 'không',
+ 'interwiki_error' => 'LỖi: Bảng liên wiki hiện đang trống, hoặc có vấn đỠgì đó đã xảy ra.',
+ 'interwiki-cached' => 'Dữ liệu liên wiki được lưu vào vùng nhớ đệm. Không thể sửa đổi vùng nhớ đệm.',
+ 'interwiki_edit' => 'Sửa đổi',
+ 'interwiki_reasonfield' => 'Lý do:',
+ 'interwiki_delquestion' => 'Xóa “$1â€',
+ 'interwiki_deleting' => 'Bạn Ä‘ang xóa tiá»n tố “$1â€.',
+ 'interwiki_deleted' => 'Tiá»n tố “$1†đã được xóa khá»i bảng liên wiki.',
+ 'interwiki_delfailed' => 'Tiá»n tố “$1†không thể xóa khá»i bảng liên wiki.',
+ 'interwiki_addtext' => 'Thêm tiá»n tố liên kết liên wiki',
+ 'interwiki_addintro' => 'Bạn Ä‘ang thêm má»™t tiá»n tố liên wiki má»›i.
+Hãy nhớ rằng nó không chứa được khoảng trắng ( ), dấu hai chấm (:), dấu và (&), hay dấu bằng (=).',
+ 'interwiki_addbutton' => 'Thêm',
+ 'interwiki_added' => 'Tiá»n tố “$1†đã được thêm vào bảng liên wiki.',
+ 'interwiki_addfailed' => 'Tiá»n tố “$1†không thể thêm vào bảng liên wiki.
+Có thể nó đã tồn tại trong bảng liên wiki rồi.',
+ 'interwiki_edittext' => 'Sá»­a đổi tiá»n tố liên wiki',
+ 'interwiki_editintro' => 'Bạn Ä‘ang sá»­a đổi má»™t tiá»n tố liên wiki. Hãy nhá»› rằng việc làm này có thể phá há»ng các liên hết đã có.',
+ 'interwiki_edited' => 'Tiá»n tố “$1†đã thay đổi xong trong bảng liên wiki.',
+ 'interwiki_editerror' => 'Tiá»n tố “$1†không thể thay đổi trong bảng liên wiki. Có thể nó không tồn tại.',
+ 'interwiki-badprefix' => 'Tiá»n tố liên wiki “$1†có chứa ký tá»± không hợp lệ',
+ 'interwiki-submit-empty' => 'Không thể để trống tiá»n tố hoặc URL.',
+ 'interwiki-submit-invalidurl' => 'URL có giao thức không hợp lệ.',
+ 'log-name-interwiki' => 'Nhật trình bảng liên wiki',
+ 'logentry-interwiki-iw_add' => '{{GENDER:$2}}$1 đã thêm tiá»n tố “$4†($5) (trans: $6; local: $7) vào bảng liên wiki',
+ 'logentry-interwiki-iw_edit' => '{{GENDER:$2}}$1 đã sá»­a đổi tiá»n tố “$4†($5) (trans: $6; local: $7) trong bảng liên wiki',
+ 'logentry-interwiki-iw_delete' => '{{GENDER:$2|}}$1 đã xóa tiá»n tố “$4†khá»i bảng liên wiki',
+ 'log-description-interwiki' => 'Äây là nhật trình các thay đổi trong [[Special:Interwiki|bảng liên wiki]].',
+ 'right-interwiki' => 'Sửa dữ liệu liên wiki',
+ 'action-interwiki' => 'thay đổi khoản mục liên wiki này',
+);
+
+/** Volapük (Volapük)
+ * @author Malafaya
+ * @author Smeira
+ */
+$messages['vo'] = array(
+ 'interwiki' => 'Logön e bevobön nünodis vüvükik',
+ 'interwiki-title-norights' => 'Logön nünodis vüvükik',
+ 'interwiki-desc' => 'Läükön [[Special:Interwiki|padi patik]] ad logön e bevobön taibi vüvükik',
+ 'interwiki_intro' => 'Logön eli [http://www.mediawiki.org/wiki/Interwiki_table MediaWiki.org] ad tuvön nünis pluik tefü taib vüvükik.', # Fuzzy
+ 'interwiki_prefix' => 'Foyümot',
+ 'interwiki-prefix-label' => 'Foyümot:', # Fuzzy
+ 'interwiki_0' => 'nö',
+ 'interwiki_error' => 'Pöl: Taib vüvükik vagon, u ba pöl votik ejenon.',
+ 'interwiki_reasonfield' => 'Kod:',
+ 'interwiki_delquestion' => 'El „$1“ pamoükon',
+ 'interwiki_deleting' => 'Moükol foyümoti: „$1“.',
+ 'interwiki_deleted' => 'Foyümot: „$1“ pemoükon benosekiko se taib vüvükik.',
+ 'interwiki_delfailed' => 'No eplöpos ad moükön foyümot: „$1“ se taib vüvükik.',
+ 'interwiki_addtext' => 'Läükön foyümoti vüvükik',
+ 'interwiki_addintro' => 'Läükol foyümoti vüvükik nulik.
+Demolös, das foyümot no dalon ninädon spadis ( ), telpünis (:), (&), u (=).',
+ 'interwiki_addbutton' => 'Läükön',
+ 'interwiki_added' => 'Foyümot: „$1“ peläükon benosekiko taibe vüvükik.',
+ 'interwiki_addfailed' => 'No eplöpos ad läükön foyümoti: „$1“ taibe vüvükik.
+Ba ya dabinon in taib vüvükik.',
+ 'interwiki_edittext' => 'Votükam foyümota vüvükik',
+ 'interwiki_editintro' => 'Bevobol foyümoti vüvükik.
+Demolös, das atos kanon breikön yümis dabinöl.',
+ 'interwiki_edited' => 'Foyümot: „$1“ pevotükon benosekiko in taib vüvükik.',
+ 'interwiki_editerror' => 'No eplöpos ad votükön foyümoti: „$1“ in taib vüvükik.
+Ba no dabinon.',
+ 'interwiki-badprefix' => 'Foyümot vüvükik pavilöl: „$1“ ninädon malatis no lonöfölis',
+ 'log-name-interwiki' => 'Jenotalised taiba vüvükik',
+ 'log-description-interwiki' => 'Is palisedons votükams [[Special:Interwiki|taiba vüvükik]].',
+ 'right-interwiki' => 'Bevobön nünis vüvükik',
+ 'action-interwiki' => 'votükön pati vüvükik at',
+);
+
+/** Walloon (walon)
+ */
+$messages['wa'] = array(
+ 'interwiki_reasonfield' => 'RÃ¥jhon:',
+);
+
+/** Wu (å´è¯­)
+ */
+$messages['wuu'] = array(
+ 'interwiki_reasonfield' => 'ç†ç”±ï¼š',
+);
+
+/** Yiddish (ייִדיש)
+ * @author פוילישער
+ */
+$messages['yi'] = array(
+ 'interwiki_prefix' => 'פרעפֿיקס',
+ 'interwiki-prefix-label' => 'פרעפֿיקס:',
+ 'interwiki_local' => '×יבערפֿירן',
+ 'interwiki_1' => '×™×',
+ 'interwiki_0' => 'ניין',
+ 'interwiki_edit' => 'רעד×ַקטירן',
+ 'interwiki_addbutton' => 'צולייגן',
+);
+
+/** Cantonese (粵語)
+ */
+$messages['yue'] = array(
+ 'interwiki' => '去ç‡åŒç·¨è¼¯è·¨ç¶­åŸºè³‡æ–™',
+ 'interwiki-title-norights' => '去ç‡è·¨ç¶­åŸºè³‡æ–™',
+ 'interwiki_intro' => 'ç‡å“[http://www.mediawiki.org/wiki/Interwiki_table MediaWiki.org]有關跨維基表嘅更多資料。', # Fuzzy
+ 'interwiki_prefix' => 'å‰ç¶´',
+ 'interwiki-prefix-label' => 'å‰ç¶´:', # Fuzzy
+ 'interwiki_local' => '定義呢個åšä¸€å€‹æœ¬åœ°wiki', # Fuzzy
+ 'interwiki-local-label' => '定義呢個åšä¸€å€‹æœ¬åœ°wiki:', # Fuzzy
+ 'interwiki_trans' => '容許跨維基包å«', # Fuzzy
+ 'interwiki-trans-label' => '容許跨維基包å«:', # Fuzzy
+ 'interwiki_error' => '錯誤: 跨維基表係空ã€åˆæˆ–者有其它嘢出錯。',
+ 'interwiki_reasonfield' => '原因', # Fuzzy
+ 'interwiki_delquestion' => '刪緊 "$1"',
+ 'interwiki_deleting' => '你而家拎走緊å‰ç¶´ "$1"。',
+ 'interwiki_deleted' => 'å‰ç¶´ "$1" 已經æˆåŠŸå™‰éŸ¿å€‹è·¨ç¶­åŸºè¡¨åº¦æ‹Žèµ°å’—。',
+ 'interwiki_delfailed' => 'å‰ç¶´ "$1" 唔能夠響個跨維基表度拎走。',
+ 'interwiki_addtext' => '加入一個跨維基å‰ç¶´',
+ 'interwiki_addintro' => '你而家加緊一個新嘅跨維基å‰ç¶´ã€‚
+è¦è¨˜ä½ä½¢ä¿‚å””å¯ä»¥åŒ…å«ä½ç©ºæ ¼ ( )ã€å†’號 (:)ã€é€£å­—號 (&),或者係等號 (=)。',
+ 'interwiki_addbutton' => '加',
+ 'interwiki_added' => 'å‰ç¶´ "$1" 已經æˆåŠŸå™‰åŠ å…¥åˆ°è·¨ç¶­åŸºè¡¨ã€‚',
+ 'interwiki_addfailed' => 'å‰ç¶´ "$1" 唔能夠加入到跨維基表。
+å¯èƒ½å·²ç¶“響個跨維基表度存在。',
+ 'interwiki_edittext' => '改緊一個跨維基å‰ç¶´',
+ 'interwiki_editintro' => '你而家改緊跨維基å‰ç¶´ã€‚
+記ä½å‘¢å€‹å¯ä»¥æ•´æ–·ç¾æœ‰å˜…連çµã€‚',
+ 'interwiki_edited' => 'å‰ç¶´ "$1" 已經響個跨維基表度改咗。',
+ 'interwiki_editerror' => 'å‰ç¶´ "$1" 唔能夠響個跨維基表度改。
+å¯èƒ½ä½¢ä¸¦å””存在。',
+ 'interwiki-badprefix' => '所指定嘅跨維基å‰ç¶´ "$1" å«æœ‰ç„¡æ•ˆå˜…å­—æ¯',
+ 'right-interwiki' => '編輯跨維基資料',
+);
+
+/** Simplified Chinese (中文(简体)‎)
+ * @author Gaoxuewei
+ * @author Hzy980512
+ * @author Liangent
+ * @author Mark85296341
+ * @author PhiLiP
+ * @author Shizhao
+ * @author Vina
+ * @author Wmr89502270
+ * @author Xiaomingyan
+ * @author Yfdyh000
+ */
+$messages['zh-hans'] = array(
+ 'interwiki' => '查看和编辑跨wikiæ•°æ®',
+ 'interwiki-title-norights' => '查看跨维基数æ®',
+ 'interwiki-desc' => '新增[[Special:Interwiki|特殊页é¢]]以查看和编辑跨wiki表',
+ 'interwiki_intro' => '这是跨wiki表的概览。',
+ 'interwiki-legend-show' => '显示说明',
+ 'interwiki-legend-hide' => 'éšè—说明',
+ 'interwiki_prefix' => 'å‰ç¼€',
+ 'interwiki-prefix-label' => 'å‰ç¼€:',
+ 'interwiki_prefix_intro' => 'è·¨wikiå‰ç¼€ï¼Œç”¨äºŽ<code>[<nowiki />[prefix:<em>pagename</em>]]</code>wiki语法。',
+ 'interwiki_url_intro' => 'URL模æ¿ã€‚当使用上述wiki语法时,å ä½ç¬¦$1将被<em>pagename</em>替æ¢ã€‚',
+ 'interwiki_local' => '转å‘',
+ 'interwiki-local-label' => '转å‘:',
+ 'interwiki_local_intro' => '该跨wikiå‰ç¼€åˆ°æœ¬åœ°wikiçš„HTTP请求:',
+ 'interwiki_local_0_intro' => '无法实现,通常是é‡åˆ°â€œé¡µé¢æœªæ‰¾åˆ°â€ã€‚',
+ 'interwiki_local_1_intro' => 'é‡å®šå‘到跨wiki链接定义的目标URL(å³è§†ä¸ºæœ¬åœ°é¡µé¢ä¸­çš„引用)。',
+ 'interwiki_trans' => '包å«',
+ 'interwiki-trans-label' => '包å«ï¼š',
+ 'interwiki_trans_intro' => '如果使用wiki语法<code>{<nowiki />{prefix:<em>pagename</em>}}</code>,那么:',
+ 'interwiki_trans_1_intro' => '如果跨wiki包å«åœ¨è¯¥wiki得到授æƒï¼Œåˆ™å…许从外部wiki包å«ã€‚',
+ 'interwiki_trans_0_intro' => 'ä¸å…许,看作是寻找模æ¿å‘½å空间中的一个页é¢ã€‚',
+ 'interwiki_intro_footer' => '关于跨wiki表的详细信æ¯ï¼Œè¯·å‚阅[//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org]。这里有一个跨wiki表的[[Special:Log/interwiki|更改日志]]。',
+ 'interwiki_1' => '是',
+ 'interwiki_0' => 'å¦',
+ 'interwiki_error' => '错误: è·¨wiki表为空,或是å‘生其它错误。',
+ 'interwiki-cached' => 'è·¨wikiæ•°æ®å·²ç¼“存。缓存ä¸èƒ½ç¼–辑。',
+ 'interwiki_edit' => '编辑',
+ 'interwiki_reasonfield' => 'ç†ç”±ï¼š',
+ 'interwiki_delquestion' => '正在删除“$1â€',
+ 'interwiki_deleting' => '您正在删除å‰ç¼€â€œ$1â€ã€‚',
+ 'interwiki_deleted' => 'å·²æˆåŠŸåœ°ä»Žè·¨wiki表中删除å‰ç¼€â€œ$1â€ã€‚',
+ 'interwiki_delfailed' => '无法从跨wiki表删除å‰ç¼€â€œ$1â€ã€‚',
+ 'interwiki_addtext' => '新增一个跨wikiå‰ç¼€',
+ 'interwiki_addintro' => '您现在加入一个新的跨wikiå‰ç¼€ã€‚
+è¦è®°ä½å®ƒä¸å¯ä»¥åŒ…å«ç©ºæ ¼ ( )ã€å†’å· ï¼ˆ:)ã€è¿žå­—å· ï¼ˆ&ï¼‰ï¼Œæˆ–ç­‰å· ï¼ˆ=)。',
+ 'interwiki_addbutton' => '增加',
+ 'interwiki_added' => 'å‰ç¼€ "$1" å·²ç»æˆåŠŸåœ°åŠ å…¥åˆ°è·¨wiki表。',
+ 'interwiki_addfailed' => 'å‰ç¼€ "$1" ä¸èƒ½åŠ å…¥åˆ°è·¨wiki表。
+å¯èƒ½å·²ç»åœ¨è·¨wiki表中存在。',
+ 'interwiki_edittext' => '修改一个跨wikiå‰ç¼€',
+ 'interwiki_editintro' => '您正在修改跨wikiå‰ç¼€ã€‚
+请记ä½è¿™å¯èƒ½ä¼šä½¿çŽ°æœ‰çš„链接中断。',
+ 'interwiki_edited' => 'å‰ç¼€ "$1" å·²ç»åœ¨è·¨wiki表中修改。',
+ 'interwiki_editerror' => 'å‰ç¼€ "$1" ä¸èƒ½åœ¨è·¨wiki表中修改。
+å¯èƒ½å®ƒå¹¶ä¸å­˜åœ¨ã€‚',
+ 'interwiki-badprefix' => '所指定的跨wikiå‰ç¼€ "$1" å«æœ‰æ— æ•ˆçš„å­—æ¯',
+ 'interwiki-submit-empty' => 'å‰ç¼€å’ŒURLä¸èƒ½ä¸ºç©ºã€‚',
+ 'interwiki-submit-invalidurl' => '该URLçš„å议是无效的。',
+ 'log-name-interwiki' => '跨wiki表日志',
+ 'logentry-interwiki-iw_add' => '$1{{GENDER:$2|增加了}}å‰ç¼€â€œ$4â€($5) (包å«:$6;本地:$7)到跨wiki表',
+ 'logentry-interwiki-iw_edit' => '$1{{GENDER:$2|已修改}}è·¨wiki表中的å‰ç¼€â€œ$4â€($5) (包å«ï¼š$6;本地:$7)',
+ 'logentry-interwiki-iw_delete' => '$1已从跨wiki表中{{GENDER:$2|删除}}å‰ç¼€â€œ$4â€',
+ 'log-description-interwiki' => '这是一个[[Special:Interwiki|跨wiki表]]的更改日志。',
+ 'right-interwiki' => '编辑跨维基数æ®',
+ 'action-interwiki' => '更改该跨维基æ¡ç›®',
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Alexsh
+ * @author Horacewai2
+ * @author Justincheng12345
+ * @author Liangent
+ * @author Mark85296341
+ * @author Oapbtommy
+ * @author Waihorace
+ * @author Wrightbus
+ */
+$messages['zh-hant'] = array(
+ 'interwiki' => '檢視並編輯跨維基連çµè¡¨',
+ 'interwiki-title-norights' => '檢視跨維基資料',
+ 'interwiki-desc' => '新增[[Special:Interwiki|特殊é é¢]]以檢視或編輯跨語言連çµè¡¨',
+ 'interwiki_intro' => '這是跨維基連çµè¡¨çš„概覽。',
+ 'interwiki-legend-show' => '顯示',
+ 'interwiki-legend-hide' => 'éš±è—說明',
+ 'interwiki_prefix' => 'å‰ç¶´',
+ 'interwiki-prefix-label' => 'å‰ç¶´:',
+ 'interwiki_prefix_intro' => '跨網站的å‰ç¶´ï¼Œç”¨æ–¼<code>[[prefix:<em>pagename</em>]]</code><nowiki/><code>[[prefix:<em>pagename</em>]]</code>。',
+ 'interwiki_url_intro' => 'URL的模æ¿ï¼Œç•¶ä½¿ç”¨ä¸Šè¿°èªžæ³•æ™‚,佔ä½ç¬¦$1將會替æ›æˆ<em>pagename</em>。',
+ 'interwiki_local' => '轉發',
+ 'interwiki-local-label' => '定義這個為一個本地 wiki:',
+ 'interwiki_local_intro' => '該跨wikiå‰ç¶´åˆ°æœ¬åœ°wikiçš„HTTP請求:',
+ 'interwiki_local_0_intro' => '無法實ç¾ï¼Œé€šå¸¸æ˜¯é‡åˆ°â€œé é¢æœªæ‰¾åˆ°â€ã€‚',
+ 'interwiki_local_1_intro' => 'é‡å®šå‘到跨wikiéˆæŽ¥å®šç¾©çš„目標URL(å³è¦–為本地é é¢ä¸­çš„引用)。',
+ 'interwiki_trans' => '包å«',
+ 'interwiki-trans-label' => '容許跨維基包å«ï¼š',
+ 'interwiki_trans_intro' => '如果使用wiki語法<code>{<nowiki />{prefix:<em>pagename</em>}}</code>,那麼:',
+ 'interwiki_trans_1_intro' => '如果跨wiki包å«åœ¨è©²wiki得到授權,則å…許從外部wiki包å«ã€‚',
+ 'interwiki_trans_0_intro' => 'ä¸å…許,看作是尋找模æ¿å‘½å空間中的一個é é¢ã€‚',
+ 'interwiki_intro_footer' => '關於跨wiki表的詳細信æ¯ï¼Œè«‹åƒé–±[//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org]。這裡有一個跨wiki表的[[Special:Log/interwiki|更改日誌]]。',
+ 'interwiki_1' => '是',
+ 'interwiki_0' => 'å¦',
+ 'interwiki_error' => '錯誤:跨維基連çµè¡¨ç‚ºç©ºï¼Œæˆ–是發生其它錯誤。',
+ 'interwiki-cached' => '跨維基數據已緩存,緩存ä¸èƒ½ç·¨è¼¯ã€‚',
+ 'interwiki_edit' => '編輯',
+ 'interwiki_reasonfield' => '原因:',
+ 'interwiki_delquestion' => '正在刪除「$1ã€',
+ 'interwiki_deleting' => '您正在刪除å‰ç¶´ã€Œ$1ã€ã€‚',
+ 'interwiki_deleted' => 'å·²æˆåŠŸåœ°å¾žé€£çµè¡¨ä¸­åˆªé™¤å‰ç¶´ã€Œ$1ã€ã€‚',
+ 'interwiki_delfailed' => '無法從連çµè¡¨åˆªé™¤å‰ç¶´ã€Œ$1ã€ã€‚',
+ 'interwiki_addtext' => '新增一個跨維基å‰ç¶´',
+ 'interwiki_addintro' => '您ç¾åœ¨åŠ å…¥ä¸€å€‹æ–°çš„跨維基連çµå‰ç¶´ã€‚
+è¦è¨˜ä½å®ƒä¸å¯ä»¥åŒ…å«ç©ºæ ¼ ( )ã€å†’號 (:)ã€é€£å­—號 (&),或者是等號 (=)。',
+ 'interwiki_addbutton' => '新增',
+ 'interwiki_added' => 'å‰ç¶´ã€Œ$1ã€å·²ç¶“æˆåŠŸåœ°åŠ å…¥åˆ°è·¨ç¶­åŸºé€£çµè¡¨ã€‚',
+ 'interwiki_addfailed' => 'å‰ç¶´ã€Œ$1ã€ä¸èƒ½åŠ å…¥åˆ°è·¨ç¶­åŸºé€£çµè¡¨ã€‚
+å¯èƒ½å·²ç¶“在跨維基連çµè¡¨ä¸­å­˜åœ¨ã€‚',
+ 'interwiki_edittext' => '修改一個跨維基連çµå‰ç¶´',
+ 'interwiki_editintro' => '您ç¾æ­£ä¿®æ”¹è·¨ç¶­åŸºé€£çµå‰ç¶´ã€‚
+記ä½é€™å‹•ä½œå¯ä»¥ä¸­æ–·ç¾æœ‰çš„連çµã€‚',
+ 'interwiki_edited' => 'å‰ç¶´ã€Œ$1ã€å·²ç¶“在跨維基連çµè¡¨ä¸­ä¿®æ”¹ã€‚',
+ 'interwiki_editerror' => 'å‰ç¶´ã€Œ$1ã€ä¸èƒ½åœ¨è·¨ç¶­åŸºé€£çµè¡¨ä¸­ä¿®æ”¹ã€‚
+å¯èƒ½å®ƒä¸¦ä¸å­˜åœ¨ã€‚',
+ 'interwiki-badprefix' => '所指定的跨維基å‰ç¶´ã€Œ$1ã€å«æœ‰ç„¡æ•ˆçš„å­—æ¯',
+ 'interwiki-submit-empty' => 'å‰ç¶´åŠURLä¸èƒ½ç‚ºç©ºã€‚',
+ 'interwiki-submit-invalidurl' => '此網é ä½å€çš„å”議無效。',
+ 'log-name-interwiki' => '跨維基連çµä¿®æ”¹æ—¥èªŒ',
+ 'logentry-interwiki-iw_add' => '$1{{GENDER:$2|增加了}}å‰ç¶´â€œ$4â€($5) (包å«:$6;本地:$7)到跨wiki表',
+ 'logentry-interwiki-iw_edit' => '$1{{GENDER:$2|已修改}}è·¨wiki表中的å‰ç¶´â€œ$4â€($5) (包å«ï¼š$6;本地:$7)',
+ 'logentry-interwiki-iw_delete' => '$1已從跨wiki表中{{GENDER:$2|刪除}}å‰ç¶´â€œ$4â€',
+ 'log-description-interwiki' => '這是一個[[Special:Interwiki|跨維基連çµ]]修改的日誌。',
+ 'right-interwiki' => '修改跨維基資料',
+ 'action-interwiki' => '修正這個跨語言連çµ',
+);
diff --git a/extensions/Interwiki/Interwiki.php b/extensions/Interwiki/Interwiki.php
new file mode 100644
index 00000000..6b99f999
--- /dev/null
+++ b/extensions/Interwiki/Interwiki.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * @file
+ * @ingroup Extensions
+ * @version 3.0
+ * @author Stephanie Amanda Stevens <phroziac@gmail.com>
+ * @author Robin Pepermans (SPQRobin) <robinp.1273@gmail.com>
+ * @copyright Copyright © 2005-2007 Stephanie Amanda Stevens
+ * @copyright Copyright © 2007-2011 Robin Pepermans (SPQRobin)
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @link http://www.mediawiki.org/wiki/Extension:SpecialInterwiki Documentation
+ * Formatting improvements Stephen Kennedy, 2006.
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ die( "This is not a valid entry point.\n" );
+}
+
+// Set this value to true in LocalSettings.php if you will not use this
+// extension to actually change any interwiki table entries. It will suppress
+// the addition of a log for interwiki link changes.
+$wgInterwikiViewOnly = false;
+
+// Extension credits for Special:Version
+$wgExtensionCredits['specialpage'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'Interwiki',
+ 'author' => array( 'Stephanie Amanda Stevens', 'Alexandre Emsenhuber', 'Robin Pepermans', 'Siebrand Mazeland', 'Platonides', 'Raimond Spekking', 'Sam Reed', '...' ),
+ 'version' => '2.2 20120425',
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:Interwiki',
+ 'descriptionmsg' => 'interwiki-desc',
+);
+
+$wgExtensionFunctions[] = 'setupInterwikiExtension';
+
+$wgResourceModules['ext.interwiki.specialpage'] = array(
+ 'styles' => 'Interwiki.css',
+ 'localBasePath' => dirname( __FILE__ ),
+ 'remoteExtPath' => 'Interwiki',
+ 'dependencies' => array(
+ 'jquery.makeCollapsible',
+ ),
+);
+
+// Set up the new special page
+$dir = dirname( __FILE__ ) . '/';
+$wgExtensionMessagesFiles['Interwiki'] = $dir . 'Interwiki.i18n.php';
+$wgExtensionMessagesFiles['InterwikiAlias'] = $dir . 'Interwiki.alias.php';
+$wgAutoloadClasses['SpecialInterwiki'] = $dir . 'Interwiki_body.php';
+$wgAutoloadClasses['InterwikiLogFormatter'] = $dir . 'Interwiki_body.php';
+$wgSpecialPages['Interwiki'] = 'SpecialInterwiki';
+$wgSpecialPageGroups['Interwiki'] = 'wiki';
+
+function setupInterwikiExtension() {
+ global $wgInterwikiViewOnly;
+
+ if ( $wgInterwikiViewOnly === false ) {
+ global $wgAvailableRights, $wgLogTypes, $wgLogActionsHandlers;
+
+ // New user right, required to modify the interwiki table through Special:Interwiki
+ $wgAvailableRights[] = 'interwiki';
+
+ // Set up the new log type - interwiki actions are logged to this new log
+ $wgLogTypes[] = 'interwiki';
+ # interwiki, iw_add, iw_delete, iw_edit
+ $wgLogActionsHandlers['interwiki/*'] = 'InterwikiLogFormatter';
+ }
+
+ return true;
+}
diff --git a/extensions/Interwiki/Interwiki_body.php b/extensions/Interwiki/Interwiki_body.php
new file mode 100644
index 00000000..3325771f
--- /dev/null
+++ b/extensions/Interwiki/Interwiki_body.php
@@ -0,0 +1,406 @@
+<?php
+/**
+ * Implements Special:Interwiki
+ * @ingroup SpecialPage
+ */
+class SpecialInterwiki extends SpecialPage {
+ /**
+ * Constructor - sets up the new special page
+ */
+ public function __construct() {
+ parent::__construct( 'Interwiki' );
+ }
+
+ /**
+ * Different description will be shown on Special:SpecialPage depending on
+ * whether the user can modify the data.
+ * @return String
+ */
+ function getDescription() {
+ return $this->msg( $this->canModify() ?
+ 'interwiki' : 'interwiki-title-norights' )->plain();
+ }
+
+ /**
+ * Show the special page
+ *
+ * @param $par Mixed: parameter passed to the page or null
+ */
+ public function execute( $par ) {
+ $this->setHeaders();
+ $this->outputHeader();
+
+ $out = $this->getOutput();
+ $request = $this->getRequest();
+
+ $out->addModules( 'ext.interwiki.specialpage' );
+
+ $action = $par ? $par : $request->getVal( 'action', $par );
+ $return = $this->getTitle();
+
+ switch( $action ) {
+ case 'delete':
+ case 'edit':
+ case 'add':
+ if ( $this->canModify( $out ) ) {
+ $this->showForm( $action );
+ }
+ $out->returnToMain( false, $return );
+ break;
+ case 'submit':
+ if ( !$this->canModify( $out ) ) {
+ # Error msg added by canModify()
+ } elseif ( !$request->wasPosted() || !$this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) ) ) {
+ // Prevent cross-site request forgeries
+ $out->addWikiMsg( 'sessionfailure' );
+ } else {
+ $this->doSubmit();
+ }
+ $out->returnToMain( false, $return );
+ break;
+ default:
+ $this->showList();
+ break;
+ }
+ }
+
+ /**
+ * Returns boolean whether the user can modify the data.
+ * @param $out OutputPage|bool If $wgOut object given, it adds the respective error message.
+ * @throws PermissionsError
+ * @return bool
+ */
+ public function canModify( $out = false ) {
+ global $wgInterwikiCache;
+ if ( !$this->getUser()->isAllowed( 'interwiki' ) ) {
+ # Check permissions
+ if ( $out ) {
+ throw new PermissionsError( 'interwiki' );
+ }
+
+ return false;
+ } elseif ( $wgInterwikiCache ) {
+ # Editing the interwiki cache is not supported
+ if ( $out ) {
+ $out->addWikiMsg( 'interwiki-cached' );
+ }
+
+ return false;
+ } elseif ( wfReadOnly() ) {
+ # Is the database in read-only mode?
+ if ( $out ) {
+ $out->readOnlyPage();
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @param $action string
+ */
+ function showForm( $action ) {
+ $request = $this->getRequest();
+
+ $prefix = $request->getVal( 'prefix' );
+ $wpPrefix = '';
+ $label = array( 'class' => 'mw-label' );
+ $input = array( 'class' => 'mw-input' );
+
+ if ( $action === 'delete' ) {
+ $topmessage = $this->msg( 'interwiki_delquestion', $prefix )->text();
+ $intromessage = $this->msg( 'interwiki_deleting', $prefix )->escaped();
+ $wpPrefix = Html::hidden( 'wpInterwikiPrefix', $prefix );
+ $button = 'delete';
+ $formContent = '';
+ } elseif ( $action === 'edit' ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ $row = $dbr->selectRow( 'interwiki', '*', array( 'iw_prefix' => $prefix ), __METHOD__ );
+
+ if ( !$row ) {
+ $this->error( 'interwiki_editerror', $prefix );
+ return;
+ }
+
+ $prefix = $prefixElement = $row->iw_prefix;
+ $defaulturl = $row->iw_url;
+ $trans = $row->iw_trans;
+ $local = $row->iw_local;
+ $wpPrefix = Html::hidden( 'wpInterwikiPrefix', $row->iw_prefix );
+ $topmessage = $this->msg( 'interwiki_edittext' )->text();
+ $intromessage = $this->msg( 'interwiki_editintro' )->escaped();
+ $button = 'edit';
+ } elseif ( $action === 'add' ) {
+ $prefix = $request->getVal( 'wpInterwikiPrefix', $request->getVal( 'prefix' ) );
+ $prefixElement = Xml::input( 'wpInterwikiPrefix', 20, $prefix,
+ array( 'tabindex' => 1, 'id' => 'mw-interwiki-prefix', 'maxlength' => 20 ) );
+ $local = $request->getCheck( 'wpInterwikiLocal' );
+ $trans = $request->getCheck( 'wpInterwikiTrans' );
+ $defaulturl = $request->getVal( 'wpInterwikiURL', $this->msg( 'interwiki-defaulturl' )->text() );
+ $topmessage = $this->msg( 'interwiki_addtext' )->text();
+ $intromessage = $this->msg( 'interwiki_addintro' )->escaped();
+ $button = 'interwiki_addbutton';
+ }
+
+ if ( $action === 'add' || $action === 'edit' ) {
+ $formContent = Html::rawElement( 'tr', null,
+ Html::element( 'td', $label, $this->msg( 'interwiki-prefix-label' )->text() ) .
+ Html::rawElement( 'td', null, '<tt>' . $prefixElement . '</tt>' )
+ ) . Html::rawElement( 'tr', null,
+ Html::rawElement( 'td', $label, Xml::label( $this->msg( 'interwiki-local-label' )->text(), 'mw-interwiki-local' ) ) .
+ Html::rawElement( 'td', $input, Xml::check( 'wpInterwikiLocal', $local, array( 'id' => 'mw-interwiki-local' ) ) )
+ ) . Html::rawElement( 'tr', null,
+ Html::rawElement( 'td', $label, Xml::label( $this->msg( 'interwiki-trans-label' )->text(), 'mw-interwiki-trans' ) ) .
+ Html::rawElement( 'td', $input, Xml::check( 'wpInterwikiTrans', $trans, array( 'id' => 'mw-interwiki-trans' ) ) )
+ ) . Html::rawElement( 'tr', null,
+ Html::rawElement( 'td', $label, Xml::label( $this->msg( 'interwiki-url-label' )->text(), 'mw-interwiki-url' ) ) .
+ Html::rawElement( 'td', $input, Xml::input( 'wpInterwikiURL', 60, $defaulturl,
+ array( 'tabindex' => 1, 'maxlength' => 200, 'id' => 'mw-interwiki-url' ) ) )
+ );
+ }
+
+ $form = Xml::fieldset( $topmessage, Html::rawElement( 'form',
+ array( 'id' => "mw-interwiki-{$action}form", 'method' => 'post',
+ 'action' => $this->getTitle()->getLocalUrl( array( 'action' => 'submit', 'prefix' => $prefix ) ) ),
+ Html::rawElement( 'p', null, $intromessage ) .
+ Html::rawElement( 'table', array( 'id' => "mw-interwiki-{$action}" ),
+ $formContent . Html::rawElement( 'tr', null,
+ Html::rawElement( 'td', $label, Xml::label( $this->msg( 'interwiki_reasonfield' )->text(),
+ "mw-interwiki-{$action}reason" ) ) .
+ Html::rawElement( 'td', $input, Xml::input( 'wpInterwikiReason', 60, '',
+ array( 'tabindex' => 1, 'id' => "mw-interwiki-{$action}reason", 'maxlength' => 200 ) ) )
+ ) . Html::rawElement( 'tr', null,
+ Html::rawElement( 'td', null, '' ) .
+ Html::rawElement( 'td', array( 'class' => 'mw-submit' ),
+ Xml::submitButton( $this->msg( $button )->text(), array( 'id' => 'mw-interwiki-submit' ) ) )
+ ) . $wpPrefix .
+ Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() ) .
+ Html::hidden( 'wpInterwikiAction', $action )
+ )
+ ) );
+ $this->getOutput()->addHTML( $form );
+ return;
+ }
+
+ function doSubmit() {
+ global $wgContLang, $wgMemc;
+
+ $request = $this->getRequest();
+ $prefix = $request->getVal( 'wpInterwikiPrefix' );
+ $do = $request->getVal( 'wpInterwikiAction' );
+ // Show an error if the prefix is invalid (only when adding one).
+ // Invalid characters for a title should also be invalid for a prefix.
+ // Whitespace, ':', '&' and '=' are invalid, too.
+ // (Bug 30599).
+ global $wgLegalTitleChars;
+ $validPrefixChars = preg_replace( '/[ :&=]/', '', $wgLegalTitleChars );
+ if ( preg_match( "/\s|[^$validPrefixChars]/", $prefix ) && $do === 'add' ) {
+ $this->error( 'interwiki-badprefix', htmlspecialchars( $prefix ) );
+ $this->showForm( $do );
+ return;
+ }
+ $reason = $request->getText( 'wpInterwikiReason' );
+ $selfTitle = $this->getTitle();
+ $dbw = wfGetDB( DB_MASTER );
+ switch( $do ) {
+ case 'delete':
+ $dbw->delete( 'interwiki', array( 'iw_prefix' => $prefix ), __METHOD__ );
+
+ if ( $dbw->affectedRows() === 0 ) {
+ $this->error( 'interwiki_delfailed', $prefix );
+ $this->showForm( $do );
+ } else {
+ $this->getOutput()->addWikiMsg( 'interwiki_deleted', $prefix );
+ $log = new LogPage( 'interwiki' );
+ $log->addEntry( 'iw_delete', $selfTitle, $reason, array( $prefix ) );
+ $wgMemc->delete( wfMemcKey( 'interwiki', $prefix ) );
+ }
+ break;
+ case 'add':
+ $prefix = $wgContLang->lc( $prefix );
+ // N.B.: no break!
+ case 'edit':
+ $theurl = $request->getVal( 'wpInterwikiURL' );
+ $local = $request->getCheck( 'wpInterwikiLocal' ) ? 1 : 0;
+ $trans = $request->getCheck( 'wpInterwikiTrans' ) ? 1 : 0;
+ $data = array(
+ 'iw_prefix' => $prefix,
+ 'iw_url' => $theurl,
+ 'iw_local' => $local,
+ 'iw_trans' => $trans
+ );
+
+ if ( $prefix === '' || $theurl === '' ) {
+ $this->error( 'interwiki-submit-empty' );
+ $this->showForm( $do );
+ return;
+ }
+
+ // Simple URL validation: check that the protocol is one of
+ // the supported protocols for this wiki.
+ // (bug 30600)
+ if ( !wfParseUrl( $theurl ) ) {
+ $this->error( 'interwiki-submit-invalidurl' );
+ $this->showForm( $do );
+ return;
+ }
+
+ if ( $do === 'add' ) {
+ $dbw->insert( 'interwiki', $data, __METHOD__, 'IGNORE' );
+ } else { // $do === 'edit'
+ $dbw->update( 'interwiki', $data, array( 'iw_prefix' => $prefix ), __METHOD__, 'IGNORE' );
+ }
+
+ // used here: interwiki_addfailed, interwiki_added, interwiki_edited
+ if ( $dbw->affectedRows() === 0 ) {
+ $this->error( "interwiki_{$do}failed", $prefix );
+ $this->showForm( $do );
+ } else {
+ $this->getOutput()->addWikiMsg( "interwiki_{$do}ed", $prefix );
+ $log = new LogPage( 'interwiki' );
+ $log->addEntry( 'iw_' . $do, $selfTitle, $reason, array( $prefix, $theurl, $trans, $local ) );
+ $wgMemc->delete( wfMemcKey( 'interwiki', $prefix ) );
+ }
+ break;
+ }
+ }
+
+ function showList() {
+ $canModify = $this->canModify();
+
+ $this->getOutput()->addWikiMsg( 'interwiki_intro' );
+ // Make collapsible.
+ $this->getOutput()->addHTML(
+ Html::openElement(
+ 'div', array(
+ 'class' => 'mw-collapsible mw-collapsed',
+ 'data-collapsetext' => $this->msg( 'interwiki-legend-hide' )->escaped(),
+ 'data-expandtext' => $this->msg('interwiki-legend-show' )->escaped()
+ ) ) );
+ $this->getOutput()->addHTML(
+ Html::rawElement(
+ 'table', array( 'class' => 'mw-interwikitable wikitable intro' ),
+ $this->addInfoRow( 'start', 'interwiki_prefix', 'interwiki_prefix_intro' ) . "\n" .
+ $this->addInfoRow( 'start', 'interwiki_url', 'interwiki_url_intro' ) . "\n" .
+ $this->addInfoRow( 'start', 'interwiki_local', 'interwiki_local_intro' ) . "\n" .
+ $this->addInfoRow( 'end', 'interwiki_0', 'interwiki_local_0_intro' ) . "\n" .
+ $this->addInfoRow( 'end', 'interwiki_1', 'interwiki_local_1_intro' ) . "\n" .
+ $this->addInfoRow( 'start', 'interwiki_trans', 'interwiki_trans_intro' ) . "\n" .
+ $this->addInfoRow( 'end', 'interwiki_0', 'interwiki_trans_0_intro' ) . "\n" .
+ $this->addInfoRow( 'end', 'interwiki_1', 'interwiki_trans_1_intro' ) . "\n"
+ )
+ );
+
+ $this->getOutput()->addHTML( Html::closeElement( 'div' ) ); // end collapsible.
+
+ if ( $canModify ) {
+ $this->getOutput()->addHTML( "<br />" . $this->msg( 'interwiki_intro_footer' )->parse() );
+ $addtext = $this->msg( 'interwiki_addtext' )->escaped();
+ $addlink = Linker::linkKnown( $this->getTitle( 'add' ), $addtext );
+ $this->getOutput()->addHTML( '<p class="mw-interwiki-addlink">' . $addlink . '</p>' );
+ }
+
+ if ( !method_exists( 'Interwiki', 'getAllPrefixes' ) ) {
+ # version 2.0 is not backwards compatible (but still display nice error)
+ $this->error( 'interwiki_error' );
+ return;
+ }
+ $iwPrefixes = Interwiki::getAllPrefixes( null );
+
+ if ( !is_array( $iwPrefixes ) || count( $iwPrefixes ) === 0 ) {
+ # If the interwiki table is empty, display an error message
+ $this->error( 'interwiki_error' );
+ return;
+ }
+
+ $out = '';
+
+ # Output the existing Interwiki prefixes table header
+ $out .= Html::openElement( 'table', array( 'class' => 'mw-interwikitable wikitable sortable body' ) ) . "\n";
+ $out .= Html::openElement( 'tr', array( 'id' => 'interwikitable-header' ) ) .
+ Html::element( 'th', null, $this->msg( 'interwiki_prefix' )->text() ) .
+ Html::element( 'th', null, $this->msg( 'interwiki_url' )->text() ) .
+ Html::element( 'th', null, $this->msg( 'interwiki_local' )->text() ) .
+ Html::element( 'th', null, $this->msg( 'interwiki_trans' )->text() ) .
+ ( $canModify ? Html::element( 'th', array( 'class' => 'unsortable' ), $this->msg( 'interwiki_edit' )->text() ) : '' );
+ $out .= Html::closeElement( 'tr' ) . "\n";
+
+ $selfTitle = $this->getTitle();
+
+ # Output the existing Interwiki prefixes table rows
+ foreach ( $iwPrefixes as $iwPrefix ) {
+ $out .= Html::openElement( 'tr', array( 'class' => 'mw-interwikitable-row' ) );
+ $out .= Html::element( 'td', array( 'class' => 'mw-interwikitable-prefix' ),
+ $iwPrefix['iw_prefix'] );
+ $out .= Html::element( 'td', array( 'class' => 'mw-interwikitable-url' ), $iwPrefix['iw_url'] );
+ $attribs = array( 'class' => 'mw-interwikitable-local' );
+ // Green background for cells with "yes".
+ if( $iwPrefix['iw_local'] ) {
+ $attribs['style'] = 'background: lime;';
+ }
+ // The messages interwiki_0 and interwiki_1 are used here.
+ $out .= Html::element( 'td', $attribs,
+ ( isset( $iwPrefix['iw_local'] ) ? $this->msg( 'interwiki_' . $iwPrefix['iw_local'] )->text() : '-' ) );
+ $attribs = array( 'class' => 'mw-interwikitable-trans' );
+ // Green background for cells with "yes".
+ if( $iwPrefix['iw_trans'] ) {
+ $attribs['style'] = 'background: lime;';
+ }
+ // The messages interwiki_0 and interwiki_1 are used here.
+ $out .= Html::element( 'td', $attribs,
+ ( isset( $iwPrefix['iw_trans'] ) ? $this->msg( 'interwiki_' . $iwPrefix['iw_trans'] )->text() : '-' ) );
+
+ // Additional column when the interwiki table can be modified.
+ if ( $canModify ) {
+ $out .= Html::rawElement( 'td', array( 'class' => 'mw-interwikitable-modify' ),
+ Linker::linkKnown( $selfTitle, $this->msg( 'edit' )->escaped(), array(),
+ array( 'action' => 'edit', 'prefix' => $iwPrefix['iw_prefix'] ) ) .
+ $this->msg( 'comma-separator' ) .
+ Linker::linkKnown( $selfTitle, $this->msg( 'delete' )->escaped(), array(),
+ array( 'action' => 'delete', 'prefix' => $iwPrefix['iw_prefix'] ) )
+ );
+ }
+ $out .= Html::closeElement( 'tr' ) . "\n";
+ }
+ $out .= Html::closeElement( 'table' );
+
+ $this->getOutput()->addHTML( $out );
+ }
+
+ /**
+ * Adds a row to the documentation table on the top of Special:Interwiki.
+ * @param $align string
+ * @param $title string
+ * @param $text string
+ * @return string
+ */
+ private function addInfoRow( $align = 'start', $title, $text ) {
+ return Html::rawElement( 'tr', null,
+ // The classes mw-align-start and mw-align-end are used here.
+ Html::rawElement( 'th', array( 'class' => 'mw-align-' . $align ), $this->msg( $title )->escaped() ) .
+ // This message is expected to have wiki syntax
+ Html::rawElement( 'td', null, $this->msg( $text )->parse() )
+ );
+ }
+
+ function error() {
+ $args = func_get_args();
+ $this->getOutput()->wrapWikiMsg( "<p class='error'>$1</p>", $args );
+ }
+}
+
+/**
+ * Needed to pass the URL as a raw parameter, because it contains $1
+ */
+class InterwikiLogFormatter extends LogFormatter {
+ /**
+ * @return array
+ */
+ protected function getMessageParameters() {
+ $params = parent::getMessageParameters();
+ if ( isset( $params[4] ) ) {
+ $params[4] = Message::rawParam( htmlspecialchars( $params[4] ) );
+ }
+ return $params;
+ }
+}
diff --git a/extensions/LocalisationUpdate/KNOWN_ISSUES.txt b/extensions/LocalisationUpdate/KNOWN_ISSUES.txt
new file mode 100644
index 00000000..7ce14cd0
--- /dev/null
+++ b/extensions/LocalisationUpdate/KNOWN_ISSUES.txt
@@ -0,0 +1,11 @@
+- Only works with SVN revision 50605 or later of the
+ MediaWiki core
+
+
+
+Key issues at the moment:
+* Seems to want to store a copy of the localization updates in each local database.
+We've got hundreds of wikis run from the same installation set; we don't want to multiply our effort by 1000.
+
+* It doesn't seem to be using available memcached stuff; unsure yet whether this is taken care of
+by the general message caching or if we're going to end up making extra hits we don't need.
diff --git a/extensions/LocalisationUpdate/LocalisationUpdate.class.php b/extensions/LocalisationUpdate/LocalisationUpdate.class.php
new file mode 100644
index 00000000..39368b7c
--- /dev/null
+++ b/extensions/LocalisationUpdate/LocalisationUpdate.class.php
@@ -0,0 +1,588 @@
+<?php
+
+/**
+ * Class for localization updates.
+ *
+ * TODO: refactor code to remove duplication
+ */
+class LocalisationUpdate {
+
+ private static $newHashes = null;
+ private static $filecache = array();
+
+ /**
+ * LocalisationCacheRecache hook handler.
+ *
+ * @param $lc LocalisationCache
+ * @param $langcode String
+ * @param $cache Array
+ *
+ * @return true
+ */
+ public static function onRecache( LocalisationCache $lc, $langcode, array &$cache ) {
+ // Handle fallback sequence and load all fallback messages from the cache
+ $codeSequence = array_merge( array( $langcode ), $cache['fallbackSequence'] );
+ // Iterate over the fallback sequence in reverse, otherwise the fallback
+ // language will override the requested language
+ foreach ( array_reverse( $codeSequence ) as $code ) {
+ if ( $code == 'en' ) {
+ // Skip English, otherwise we end up trying to read
+ // the nonexistent cache file for en a couple hundred times
+ continue;
+ }
+
+ $cache['messages'] = array_merge(
+ $cache['messages'],
+ self::readFile( $code )
+ );
+
+ $cache['deps'][] = new FileDependency(
+ self::filename( $code )
+ );
+ }
+
+ return true;
+ }
+
+ /**
+ * Called from the cronjob to fetch new messages from SVN.
+ *
+ * @param $options Array
+ *
+ * @return true
+ */
+ public static function updateMessages( array $options ) {
+ global $wgLocalisationUpdateDirectory, $wgLocalisationUpdateCoreURL,
+ $wgLocalisationUpdateExtensionURL, $wgLocalisationUpdateSVNURL;
+
+ $verbose = !isset( $options['quiet'] );
+ $all = isset( $options['all'] );
+ $skipCore = isset( $options['skip-core'] );
+ $skipExtensions = isset( $options['skip-extensions'] );
+
+ if( isset( $options['outdir'] ) ) {
+ $wgLocalisationUpdateDirectory = $options['outdir'];
+ }
+
+ $coreUrl = $wgLocalisationUpdateCoreURL;
+ $extUrl = $wgLocalisationUpdateExtensionURL;
+
+ // Some ugly BC
+ if ( $wgLocalisationUpdateSVNURL ) {
+ $coreUrl = $wgLocalisationUpdateSVNURL . '/phase3/$2';
+ $extUrl = $wgLocalisationUpdateSVNURL . '/extensions/$1/$2';
+ }
+
+ // Some more ugly BC
+ if ( isset( $options['svnurl'] ) ) {
+ $coreUrl = $options['svnurl'] . '/phase3/$2';
+ $extUrl = $options['svnurl'] . '/extensions/$1/$2';
+ }
+
+ $result = 0;
+
+ // Update all MW core messages.
+ if( !$skipCore ) {
+ $result = self::updateMediawikiMessages( $verbose, $coreUrl );
+ }
+
+ // Update all Extension messages.
+ if( !$skipExtensions ) {
+ if( $all ) {
+ global $IP;
+ $extFiles = array();
+
+ // Look in extensions/ for all available items...
+ // TODO: add support for $wgExtensionAssetsPath
+ $dirs = new RecursiveDirectoryIterator( "$IP/extensions/" );
+
+ // I ain't kidding... RecursiveIteratorIterator.
+ foreach( new RecursiveIteratorIterator( $dirs ) as $pathname => $item ) {
+ $filename = basename( $pathname );
+ $matches = array();
+ if( preg_match( '/^(.*)\.i18n\.php$/', $filename, $matches ) ) {
+ $group = $matches[1];
+ $extFiles[$group] = $pathname;
+ }
+ }
+ } else {
+ global $wgExtensionMessagesFiles;
+ $extFiles = $wgExtensionMessagesFiles;
+ }
+ foreach ( $extFiles as $extension => $locFile ) {
+ $result += self::updateExtensionMessages( $locFile, $extension, $verbose, $extUrl );
+ }
+ }
+
+ self::writeHashes();
+
+ // And output the result!
+ self::myLog( "Updated {$result} messages in total" );
+ self::myLog( "Done" );
+
+ return true;
+ }
+
+ /**
+ * Update Extension Messages.
+ *
+ * @param $file String
+ * @param $extension String
+ * @param $verbose Boolean
+ *
+ * @return Integer: the amount of updated messages
+ */
+ public static function updateExtensionMessages( $file, $extension, $verbose, $extUrl ) {
+ $match = array();
+ $ok = preg_match( '~^.*/extensions/([^/]+)/(.*)$~U', $file, $match );
+ if ( !$ok ) {
+ return null;
+ }
+
+ $ext = $match[1];
+ $extFile = $match[2];
+
+ // Create a full path.
+ $svnfile = str_replace(
+ array( '$1', '$2' ),
+ array( $ext, $extFile ),
+ $extUrl
+ );
+
+ // Compare the 2 files.
+ $result = self::compareExtensionFiles( $extension, $svnfile, $file, $verbose );
+
+ return $result;
+ }
+
+ /**
+ * Update the MediaWiki Core Messages.
+ *
+ * @param $verbose Boolean
+ *
+ * @return Integer: the amount of updated messages
+ */
+ public static function updateMediawikiMessages( $verbose, $coreUrl ) {
+ // Find the changed English strings (as these messages won't be updated in ANY language).
+ $localUrl = Language::getMessagesFileName( 'en' );
+ $repoUrl = str_replace( '$2', 'languages/messages/MessagesEn.php', $coreUrl );
+ $changedEnglishStrings = self::compareFiles( $repoUrl, $localUrl, $verbose );
+
+ // Count the changes.
+ $changedCount = 0;
+
+ $languages = Language::fetchLanguageNames( null, 'mwfile' );
+ foreach ( array_keys( $languages ) as $code ) {
+ $localUrl = Language::getMessagesFileName( $code );
+ // Not prefixed with $IP
+ $filename = Language::getFilename( 'languages/messages/Messages', $code );
+ $repoUrl = str_replace( '$2', $filename, $coreUrl );
+
+ // Compare the files.
+ $changedCount += self::compareFiles( $repoUrl, $localUrl, $verbose, $changedEnglishStrings, false, true );
+ }
+
+ // Log some nice info.
+ self::myLog( "{$changedCount} MediaWiki messages are updated" );
+
+ return $changedCount;
+ }
+
+ /**
+ * Removes all unneeded content from a file and returns it.
+ *
+ * @param $contents String
+ *
+ * @return String
+ */
+ public static function cleanupFile( $contents ) {
+ // We don't need any PHP tags.
+ $contents = strtr( $contents,
+ array(
+ '<?php' => '',
+ '?' . '>' => ''
+ )
+ );
+
+ $results = array();
+
+ // And we only want message arrays.
+ preg_match_all( '/\$messages(.*\s)*?\);/', $contents, $results );
+
+ // But we want them all in one string.
+ if( !empty( $results[0] ) && is_array( $results[0] ) ) {
+ $contents = implode( "\n\n", $results[0] );
+ } else {
+ $contents = '';
+ }
+
+ // And we hate the windows vs linux linebreaks.
+ $contents = preg_replace( '/\r\n?/', "\n", $contents );
+
+ return $contents;
+ }
+
+ /**
+ * Returns the contents of a file or false on failiure.
+ *
+ * @param $file String
+ *
+ * @return string or false
+ */
+ public static function getFileContents( $file ) {
+ global $wgLocalisationUpdateRetryAttempts;
+
+ $attempts = 0;
+ $filecontents = '';
+
+ // Use cURL to get the SVN contents.
+ if ( preg_match( "/^http/", $file ) ) {
+ while( !$filecontents && $attempts <= $wgLocalisationUpdateRetryAttempts ) {
+ if( $attempts > 0 ) {
+ $delay = 1;
+ self::myLog( 'Failed to download ' . $file . "; retrying in ${delay}s..." );
+ sleep( $delay );
+ }
+
+ $filecontents = Http::get( $file );
+ $attempts++;
+ }
+ if ( !$filecontents ) {
+ self::myLog( 'Cannot get the contents of ' . $file . ' (curl)' );
+ return false;
+ }
+ } else {// otherwise try file_get_contents
+ if ( !( $filecontents = file_get_contents( $file ) ) ) {
+ self::myLog( 'Cannot get the contents of ' . $file );
+ return false;
+ }
+ }
+
+ return $filecontents;
+ }
+
+ /**
+ * Returns a pair of arrays containing the messages from two files, or
+ * a pair of nulls if the files don't need to be checked.
+ *
+ * @param $tag String
+ * @param $file1 String
+ * @param $file2 String
+ * @param $verbose Boolean
+ * @param $alwaysGetResult Boolean
+ *
+ * @return array
+ */
+ public static function loadFilesToCompare( $tag, $file1, $file2, $verbose, $alwaysGetResult = true ) {
+ $file1contents = self::getFileContents( $file1 );
+ if ( $file1contents === false || $file1contents === '' ) {
+ self::myLog( "Failed to read $file1" );
+ return array( null, null );
+ }
+
+ $file2contents = self::getFileContents( $file2 );
+ if ( $file2contents === false || $file2contents === '' ) {
+ self::myLog( "Failed to read $file2" );
+ return array( null, null );
+ }
+
+ // Only get the part we need.
+ $file1contents = self::cleanupFile( $file1contents );
+ $file1hash = md5( $file1contents );
+
+ $file2contents = self::cleanupFile( $file2contents );
+ $file2hash = md5( $file2contents );
+
+ // Check if the file has changed since our last update.
+ if ( !$alwaysGetResult ) {
+ if ( !self::checkHash( $file1, $file1hash ) && !self::checkHash( $file2, $file2hash ) ) {
+ self::myLog( "Skipping {$tag} since the files haven't changed since our last update", $verbose );
+ return array( null, null );
+ }
+ }
+
+ // Get the array with messages.
+ $messages1 = self::parsePHP( $file1contents, 'messages' );
+ if ( !is_array( $messages1 ) ) {
+ if ( strpos( $file1contents, '$messages' ) === false ) {
+ // No $messages array. This happens for some languages that only have a fallback
+ $messages1 = array();
+ } else {
+ // Broken file? Report and bail
+ self::myLog( "Failed to parse $file1" );
+ return array( null, null );
+ }
+ }
+
+ $messages2 = self::parsePHP( $file2contents, 'messages' );
+ if ( !is_array( $messages2 ) ) {
+ // Broken file? Report and bail
+ if ( strpos( $file2contents, '$messages' ) === false ) {
+ // No $messages array. This happens for some languages that only have a fallback
+ $messages2 = array();
+ } else {
+ self::myLog( "Failed to parse $file2" );
+ return array( null, null );
+ }
+ }
+
+ self::saveHash( $file1, $file1hash );
+ self::saveHash( $file2, $file2hash );
+
+ return array( $messages1, $messages2 );
+ }
+
+ /**
+ * Compare new and old messages lists, and optionally save the new
+ * messages if they've changed.
+ *
+ * @param $langcode String
+ * @param $old_messages Array
+ * @param $new_messages Array
+ * @param $verbose Boolean
+ * @param $forbiddenKeys Array
+ * @param $saveResults Boolean
+ *
+ * @return array|int
+ */
+ private static function compareLanguageArrays( $langcode, $old_messages, $new_messages, $verbose, $forbiddenKeys, $saveResults ) {
+ // Get the currently-cached messages, if any
+ $cur_messages = self::readFile( $langcode );
+
+ // Update the messages lists with the cached messages
+ $old_messages = array_merge( $old_messages, $cur_messages );
+ $new_messages = array_merge( $cur_messages, $new_messages );
+
+ // Use the old/cached version for any forbidden keys
+ if ( count( $forbiddenKeys ) ) {
+ $new_messages = array_merge(
+ array_diff_key( $new_messages, $forbiddenKeys ),
+ array_intersect_key( $old_messages, $forbiddenKeys )
+ );
+ }
+
+
+ if ( $saveResults ) {
+ // If anything has changed from the saved version, save the new version
+ if ( $new_messages != $cur_messages ) {
+ // Count added, updated, and deleted messages:
+ // diff( new, cur ) gives added + updated, and diff( cur, new )
+ // gives deleted + updated.
+ $changed = array_diff_assoc( $new_messages, $cur_messages ) +
+ array_diff_assoc( $cur_messages, $new_messages );
+ $updates = count( $changed );
+ self::myLog( "{$updates} messages updated for {$langcode}.", $verbose );
+ self::writeFile( $langcode, $new_messages );
+ } else {
+ $updates = 0;
+ }
+ return $updates;
+ } else {
+ // Find all deleted or changed messages
+ $changedStrings = array_diff_assoc( $old_messages, $new_messages );
+ return $changedStrings;
+ }
+ }
+
+ /**
+ * Returns an array containing the differences between the files.
+ *
+ * @param $newfile String
+ * @param $oldfile String
+ * @param $verbose Boolean
+ * @param $forbiddenKeys Array
+ * @param $alwaysGetResult Boolean
+ * @param $saveResults Boolean
+ *
+ * @return array|int
+ */
+ public static function compareFiles( $newfile, $oldfile, $verbose, array $forbiddenKeys = array(), $alwaysGetResult = true, $saveResults = false ) {
+ // Get the languagecode.
+ $langcode = Language::getCodeFromFileName( $newfile, 'Messages' );
+
+ list( $new_messages, $old_messages ) = self::loadFilesToCompare(
+ $langcode, $newfile, $oldfile, $verbose, $alwaysGetResult
+ );
+ if ( $new_messages === null || $old_messages === null ) {
+ return $saveResults ? 0 : array();
+ }
+
+ return self::compareLanguageArrays( $langcode, $old_messages, $new_messages, $verbose, $forbiddenKeys, $saveResults );
+ }
+
+ /**
+ *
+ * @param $extension String
+ * @param $newfile String
+ * @param $oldfile String
+ * @param $verbose Boolean
+ * @param $alwaysGetResult Boolean
+ * @param $saveResults Boolean
+ *
+ * @return Integer: the amount of updated messages
+ */
+ public static function compareExtensionFiles( $extension, $newfile, $oldfile, $verbose ) {
+ list( $new_messages, $old_messages ) = self::loadFilesToCompare(
+ $extension, $newfile, $oldfile, $verbose, false
+ );
+ if ( $new_messages === null || $old_messages === null ) {
+ return 0;
+ }
+
+ // Update counter.
+ $updates = 0;
+
+ if ( empty( $new_messages['en'] ) ) {
+ $new_messages['en'] = array();
+ }
+
+ if ( empty( $old_messages['en'] ) ) {
+ $old_messages['en'] = array();
+ }
+
+ // Find the changed english strings.
+ $forbiddenKeys = self::compareLanguageArrays( 'en', $old_messages['en'], $new_messages['en'], $verbose, array(), false );
+
+ // Do an update for each language.
+ foreach ( $new_messages as $language => $messages ) {
+ if ( $language == 'en' ) { // Skip english.
+ continue;
+ }
+
+ if ( !isset( $old_messages[$language] ) ) {
+ $old_messages[$language] = array();
+ }
+
+ $updates += self::compareLanguageArrays( $language, $old_messages[$language], $messages, $verbose, $forbiddenKeys, true );
+ }
+
+ // And log some stuff.
+ self::myLog( "Updated " . $updates . " messages for the '{$extension}' extension", $verbose );
+
+ return $updates;
+ }
+
+ /**
+ * Checks whether a messages file has a certain hash.
+ *
+ * TODO: Swap return values, this is insane
+ *
+ * @param $file string Filename
+ * @param $hash string Hash
+ *
+ * @return bool True if $file does NOT have hash $hash, false if it does
+ */
+ public static function checkHash( $file, $hash ) {
+ $hashes = self::readFile( 'hashes' );
+ return @$hashes[$file] !== $hash;
+ }
+
+ /**
+ * @param $file
+ * @param $hash
+ */
+ public static function saveHash( $file, $hash ) {
+ if ( is_null( self::$newHashes ) ) {
+ self::$newHashes = self::readFile( 'hashes' );
+ }
+
+ self::$newHashes[$file] = $hash;
+ }
+
+ public static function writeHashes() {
+ self::writeFile( 'hashes', self::$newHashes );
+ }
+
+ /**
+ * Logs a message.
+ *
+ * @param $log String
+ * @param bool $verbose
+ */
+ public static function myLog( $log, $verbose = true ) {
+ if ( !$verbose ) {
+ return;
+ }
+ if ( isset( $_SERVER ) && array_key_exists( 'REQUEST_METHOD', $_SERVER ) ) {
+ wfDebug( $log . "\n" );
+ } else {
+ print( $log . "\n" );
+ }
+ }
+
+ /**
+ * @param $php
+ * @param $varname
+ * @return bool|array
+ */
+ public static function parsePHP( $php, $varname ) {
+ try {
+ $reader = new QuickArrayReader("<?php $php");
+ return $reader->getVar( $varname );
+ } catch( Exception $e ) {
+ self::myLog( "Failed to read file: " . $e );
+ return false;
+ }
+ }
+
+ /**
+ * @param $lang
+ * @return string
+ * @throws MWException
+ */
+ public static function filename( $lang ) {
+ global $wgLocalisationUpdateDirectory, $wgCacheDirectory;
+
+ $dir = $wgLocalisationUpdateDirectory ?
+ $wgLocalisationUpdateDirectory :
+ $wgCacheDirectory;
+
+ if ( !$dir ) {
+ throw new MWException( 'No cache directory configured' );
+ }
+
+ return "$dir/l10nupdate-$lang.cache";
+ }
+
+ /**
+ * @param $lang
+ * @return mixed
+ */
+ public static function readFile( $lang ) {
+ if ( !isset( self::$filecache[$lang] ) ) {
+ $file = self::filename( $lang );
+ $contents = @file_get_contents( $file );
+
+ if ( $contents === false ) {
+ wfDebug( "Failed to read file '$file'\n" );
+ $retval = array();
+ } else {
+ $retval = unserialize( $contents );
+
+ if ( $retval === false ) {
+ wfDebug( "Corrupted data in file '$file'\n" );
+ $retval = array();
+ }
+ }
+ self::$filecache[$lang] = $retval;
+ }
+
+ return self::$filecache[$lang];
+ }
+
+ /**
+ * @param $lang
+ * @param $var
+ * @throws MWException
+ */
+ public static function writeFile( $lang, $var ) {
+ $file = self::filename( $lang );
+
+ if ( !@file_put_contents( $file, serialize( $var ) ) ) {
+ throw new MWException( "Failed to write to file '$file'" );
+ }
+
+ self::$filecache[$lang] = $var;
+ }
+
+}
diff --git a/extensions/LocalisationUpdate/LocalisationUpdate.i18n.php b/extensions/LocalisationUpdate/LocalisationUpdate.i18n.php
new file mode 100644
index 00000000..5d52609f
--- /dev/null
+++ b/extensions/LocalisationUpdate/LocalisationUpdate.i18n.php
@@ -0,0 +1,528 @@
+<?php
+/**
+ * Internationalisation file for LocalisationUpdate extension.
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$messages = array();
+
+/** English
+ * @author Tom Maaswinkel
+ */
+$messages['en'] = array(
+ 'localisationupdate-desc' => 'Keeps the localised messages as up to date as possible',
+);
+
+/** Message documentation (Message documentation)
+ * @author Fryed-peach
+ * @author Purodha
+ * @author Shirayuki
+ */
+$messages['qqq'] = array(
+ 'localisationupdate-desc' => '{{desc|name=Localisation Update|url=http://www.mediawiki.org/wiki/Extension:LocalisationUpdate}}',
+);
+
+/** Afrikaans (Afrikaans)
+ * @author Naudefj
+ */
+$messages['af'] = array(
+ 'localisationupdate-desc' => 'Hou die gelokaliseerde boodskappe so op datum as moontlik',
+);
+
+/** Arabic (العربية)
+ * @author Meno25
+ */
+$messages['ar'] = array(
+ 'localisationupdate-desc' => 'يبقي الرسائل المترجمة محدثة كأÙضل ما يكون',
+);
+
+/** Asturian (asturianu)
+ * @author Xuacu
+ */
+$messages['ast'] = array(
+ 'localisationupdate-desc' => 'Caltién los mensaxes llocalizaos tan anovaos como se pueda',
+);
+
+/** Bashkir (башҡортÑа)
+ * @author Assele
+ */
+$messages['ba'] = array(
+ 'localisationupdate-desc' => 'Локалләштерелгән хәбәрҙәрҙең мөмкин тиклем Ñңы булыуын тәьмин итә',
+);
+
+/** Bavarian (Boarisch)
+ * @author Man77
+ */
+$messages['bar'] = array(
+ 'localisationupdate-desc' => "Lokalisiade Texte und Nåchrichtn so aktuell håidn wia's gråd gehd",
+);
+
+/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
+ * @author EugeneZelenko
+ * @author Wizardist
+ */
+$messages['be-tarask'] = array(
+ 'localisationupdate-desc' => 'Сочыць за актуальнаÑьцю лÑкалізаваных паведамленьнÑÑž, наколькі гÑта магчыма',
+);
+
+/** Bulgarian (българÑки)
+ * @author DCLXVI
+ */
+$messages['bg'] = array(
+ 'localisationupdate-desc' => 'Поддържа локализираните ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð²ÑŠÐ·Ð¼Ð¾Ð¶Ð½Ð¾ най-актуални',
+);
+
+/** Bengali (বাংলা)
+ * @author Bellayet
+ */
+$messages['bn'] = array(
+ 'localisationupdate-desc' => 'সà§à¦¥à¦¾à¦¨à§€à¦¯à¦¼à¦•à¦°à¦£à¦•à§ƒà¦¤ বারà§à¦¤à¦¾à¦¸à¦®à§‚হ যথাসমà§à¦­à¦¬ হালনাগাদ রাখে',
+);
+
+/** Breton (brezhoneg)
+ * @author Fulup
+ */
+$messages['br'] = array(
+ 'localisationupdate-desc' => "Derc'hel da hizivaat ar c'hemennoù troet ken fonnus ha ma'z eus tu",
+);
+
+/** Bosnian (bosanski)
+ * @author CERminator
+ */
+$messages['bs'] = array(
+ 'localisationupdate-desc' => 'Zadržavanje lokaliziranih poruka ažurnim koliko je god moguće',
+);
+
+/** Catalan (català)
+ * @author Paucabot
+ */
+$messages['ca'] = array(
+ 'localisationupdate-desc' => 'Manté els missatges localitzats tan actualitzats com sigui possible',
+);
+
+/** Czech (Äesky)
+ * @author Mormegil
+ */
+$messages['cs'] = array(
+ 'localisationupdate-desc' => 'Udržuje lokalizovaná hlášení co možná nejaktuálnější',
+);
+
+/** Welsh (Cymraeg)
+ * @author Lloffiwr
+ */
+$messages['cy'] = array(
+ 'localisationupdate-desc' => "Yn diweddaru'r cyfieithiadau o negeseuon mor aml â phosib",
+);
+
+/** Danish (dansk)
+ * @author Peter Alberti
+ */
+$messages['da'] = array(
+ 'localisationupdate-desc' => 'Holder de lokaliserede meddelelser så opdaterede som muligt',
+);
+
+/** German (Deutsch)
+ * @author Kghbln
+ * @author Purodha
+ */
+$messages['de'] = array(
+ 'localisationupdate-desc' => 'Ermöglicht es lokalisierte Texte und Nachrichten so aktuell wie möglich zu halten',
+);
+
+/** Lower Sorbian (dolnoserbski)
+ * @author Michawiki
+ */
+$messages['dsb'] = array(
+ 'localisationupdate-desc' => 'Źaržy lokalizěrowane powěźeńki tak aktualne ako móžno',
+);
+
+/** Greek (Ελληνικά)
+ * @author Omnipaedista
+ */
+$messages['el'] = array(
+ 'localisationupdate-desc' => 'ΔιατηÏεί τις μεταφÏάσεις μηνυμάτων όσο πιο ενημεÏωμένες γίνεται',
+);
+
+/** Esperanto (Esperanto)
+ * @author Yekrats
+ */
+$messages['eo'] = array(
+ 'localisationupdate-desc' => 'Äœisdatigas la asimilitajn mesaÄojn tiom eble',
+);
+
+/** Spanish (español)
+ * @author Crazymadlover
+ */
+$messages['es'] = array(
+ 'localisationupdate-desc' => 'Mantiene los mensajes localizados tan actualizados como sea posible',
+);
+
+/** Estonian (eesti)
+ * @author Pikne
+ */
+$messages['et'] = array(
+ 'localisationupdate-desc' => 'Hoiab lokaliseeritud sõnumid nii ajakohased kui võimalik.',
+);
+
+/** Basque (euskara)
+ * @author Kobazulo
+ */
+$messages['eu'] = array(
+ 'localisationupdate-desc' => 'Itzulitako mezuak ahalik eta eguneratuen mantentzen ditu',
+);
+
+/** Persian (Ùارسی)
+ * @author ZxxZxxZ
+ */
+$messages['fa'] = array(
+ 'localisationupdate-desc' => 'پیغام‌های محلی‌سازی‌شده را تا جای ممکن به‌روز نگه می‌دارد',
+);
+
+/** Finnish (suomi)
+ * @author Crt
+ * @author Nike
+ */
+$messages['fi'] = array(
+ 'localisationupdate-desc' => 'Pitää ohjelmiston käännöksen ajantasaisena.',
+);
+
+/** French (français)
+ * @author Crochet.david
+ */
+$messages['fr'] = array(
+ 'localisationupdate-desc' => 'Maintenir la traduction des messages à jour autant que possible',
+);
+
+/** Galician (galego)
+ * @author Toliño
+ */
+$messages['gl'] = array(
+ 'localisationupdate-desc' => 'Mantén as mensaxes localizadas tan actualizadas como é posible',
+);
+
+/** Swiss German (Alemannisch)
+ * @author Als-Holder
+ */
+$messages['gsw'] = array(
+ 'localisationupdate-desc' => 'Halt d Syschtemnochrichte so aktuälle wie megli',
+);
+
+/** Hebrew (עברית)
+ * @author YaronSh
+ */
+$messages['he'] = array(
+ 'localisationupdate-desc' => 'שמירת ההודעות המתורגמות מעודכנות ככל הניתן',
+);
+
+/** Hiligaynon (Ilonggo)
+ * @author Tagimata
+ */
+$messages['hil'] = array(
+ 'localisationupdate-desc' => 'Gatugo sang mga mensahe nga lokal para mapahibalo sang madali',
+);
+
+/** Croatian (hrvatski)
+ * @author SpeedyGonsales
+ */
+$messages['hr'] = array(
+ 'localisationupdate-desc' => 'Dogradnja za osvježavanje lokalizacije poruka MediaWikija',
+);
+
+/** Upper Sorbian (hornjoserbsce)
+ * @author Michawiki
+ */
+$messages['hsb'] = array(
+ 'localisationupdate-desc' => 'Dźerži lokalizowane zdźělenki tak aktualne kaž móžno',
+);
+
+/** Hungarian (magyar)
+ * @author Glanthor Reviol
+ */
+$messages['hu'] = array(
+ 'localisationupdate-desc' => 'Frissíti a lefordított üzeneteket',
+);
+
+/** Interlingua (interlingua)
+ * @author McDutchie
+ */
+$messages['ia'] = array(
+ 'localisationupdate-desc' => 'Mantene le messages localisate tanto actual como possibile',
+);
+
+/** Indonesian (Bahasa Indonesia)
+ * @author Bennylin
+ */
+$messages['id'] = array(
+ 'localisationupdate-desc' => 'Mengusahakan agar pesan-pesan yang telah diterjemahkan tetap semutakhir mungkin',
+);
+
+/** Iloko (Ilokano)
+ * @author Lam-ang
+ */
+$messages['ilo'] = array(
+ 'localisationupdate-desc' => 'Taginayonenna a mapabaro dagiti naipatarus a mensahe',
+);
+
+/** Italian (italiano)
+ * @author Darth Kule
+ */
+$messages['it'] = array(
+ 'localisationupdate-desc' => 'Mantiene i messaggi localizzati quanto più aggiornati è possibile',
+);
+
+/** Japanese (日本語)
+ * @author Fryed-peach
+ * @author Shirayuki
+ */
+$messages['ja'] = array(
+ 'localisationupdate-desc' => 'メッセージã®ç¿»è¨³ã‚’ã§ãã‚‹ã ã‘最新ã«ä¿ã¤',
+);
+
+/** Khmer (ភាសាážáŸ’មែរ)
+ * @author ážœáŸážŽážáž¶ážšáž·áž‘្ធ
+ */
+$messages['km'] = array(
+ 'localisationupdate-desc' => 'រក្សា​សារ​ដែលបាន​ប្រែសម្រួល​ទាំងឡាយ អោយនៅ​ទាន់សមáŸáž™â€‹ážáž¶áž˜ážŠáŸ‚លអាចធ្វើទៅបាន​',
+);
+
+/** Korean (한국어)
+ * @author Kwj2772
+ */
+$messages['ko'] = array(
+ 'localisationupdate-desc' => 'ë²ˆì—­ëœ ì‹œìŠ¤í…œ 메시지를 가능한 í•œ 최신으로 유지',
+);
+
+/** Colognian (Ripoarisch)
+ * @author Purodha
+ */
+$messages['ksh'] = array(
+ 'localisationupdate-desc' => 'Texte un Nohreeschte vum Wiki esu joot wi müjjelich om neueste Shtand halde',
+);
+
+/** Luxembourgish (Lëtzebuergesch)
+ * @author Robby
+ */
+$messages['lb'] = array(
+ 'localisationupdate-desc' => 'hält déi lokaliséiert Messagen esou aktuell wéi méiglech.',
+);
+
+/** Macedonian (македонÑки)
+ * @author Bjankuloski06
+ */
+$messages['mk'] = array(
+ 'localisationupdate-desc' => 'Ги одржува локализираните пораки колку што е можно пообновени и повеќе во тек Ñо наÑтаните',
+);
+
+/** Malayalam (മലയാളം)
+ * @author Praveenp
+ */
+$messages['ml'] = array(
+ 'localisationupdate-desc' => 'à´ªàµà´°à´¾à´¦àµ‡à´¶à´¿à´•à´­à´¾à´·à´¯à´¿à´²à´¾à´•àµà´•à´¿à´¯ സനàµà´¦àµ‡à´¶à´™àµà´™àµ¾ à´•à´´à´¿à´¯àµà´¨àµà´¨à´¤àµà´° വേഗം ചേർകàµà´•à´¾àµ» ഉപയോഗികàµà´•àµà´¨àµà´¨àµ',
+);
+
+/** Malay (Bahasa Melayu)
+ * @author Anakmalaysia
+ */
+$messages['ms'] = array(
+ 'localisationupdate-desc' => 'Memastikan kekemaskinian mesej-mesej yang disetempatkan',
+);
+
+/** Norwegian Bokmål (norsk (bokmål)‎)
+ * @author Nghtwlkr
+ */
+$messages['nb'] = array(
+ 'localisationupdate-desc' => 'Holder de lokaliserte meldingene så oppdaterte som mulig',
+);
+
+/** Dutch (Nederlands)
+ * @author Siebrand
+ */
+$messages['nl'] = array(
+ 'localisationupdate-desc' => 'Houdt de gelokaliseerde berichten zo actueel mogelijk',
+);
+
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
+ * @author Gunnernett
+ */
+$messages['nn'] = array(
+ 'localisationupdate-desc' => 'Held dei lokaliserte meldingane så oppdaterte som mogleg',
+);
+
+/** Occitan (occitan)
+ * @author Cedric31
+ */
+$messages['oc'] = array(
+ 'localisationupdate-desc' => 'Manténer la traduccion dels messatges a jorn autant que possible',
+);
+
+/** Polish (polski)
+ * @author Sp5uhe
+ */
+$messages['pl'] = array(
+ 'localisationupdate-desc' => 'Uaktualnia lokalne komunikaty w miarę możliwości na bieżąco',
+);
+
+/** Piedmontese (Piemontèis)
+ * @author Dragonòt
+ */
+$messages['pms'] = array(
+ 'localisationupdate-desc' => 'A manten i messagi localisà ël pì agiornà possìbil',
+);
+
+/** Portuguese (português)
+ * @author Hamilton Abreu
+ * @author Malafaya
+ */
+$messages['pt'] = array(
+ 'localisationupdate-desc' => 'Mantém as mensagens localizadas tão actualizadas quanto possível',
+);
+
+/** Brazilian Portuguese (português do Brasil)
+ * @author Eduardo.mps
+ */
+$messages['pt-br'] = array(
+ 'localisationupdate-desc' => 'Mantém as mensagens localizadas tão atualizadas quanto possível',
+);
+
+/** Romanian (română)
+ * @author KlaudiuMihaila
+ */
+$messages['ro'] = array(
+ 'localisationupdate-desc' => 'Menține mesajele localizate cât mai actualizate',
+);
+
+/** tarandíne (tarandíne)
+ * @author Joetaras
+ */
+$messages['roa-tara'] = array(
+ 'localisationupdate-desc' => "Mandine le messagge localizzate 'u cchiù aggiornate possibbile",
+);
+
+/** Russian (руÑÑкий)
+ * @author ÐлекÑандр Сигачёв
+ */
+$messages['ru'] = array(
+ 'localisationupdate-desc' => 'Поддерживает актуальноÑÑ‚ÑŒ локализованных Ñообщений, наÑколько Ñто возможно',
+);
+
+/** Slovak (slovenÄina)
+ * @author Helix84
+ */
+$messages['sk'] = array(
+ 'localisationupdate-desc' => 'Udržiava lokalizované správy Äo najaktuálnejÅ¡ie',
+);
+
+/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Михајло Ðнђелковић
+ */
+$messages['sr-ec'] = array(
+ 'localisationupdate-desc' => 'Ðжурира локализоване поруке колико је то могуће',
+);
+
+/** Serbian (Latin script) (srpski (latinica)‎)
+ * @author Liangent
+ */
+$messages['sr-el'] = array(
+ 'localisationupdate-desc' => 'Ažurira lokalizovane poruke koliko je to moguće',
+);
+
+/** Sundanese (Basa Sunda)
+ * @author Kandar
+ */
+$messages['su'] = array(
+ 'localisationupdate-desc' => 'Ngajaga sangkan talatah-talatah nu geus dialihbasakeun salawasnya mutahir',
+);
+
+/** Swedish (svenska)
+ * @author Boivie
+ */
+$messages['sv'] = array(
+ 'localisationupdate-desc' => 'Håller de lokaliserade meddelandena så uppdaterade som möjligt',
+);
+
+/** Tamil (தமிழà¯)
+ * @author செலà¯à®µà®¾
+ */
+$messages['ta'] = array(
+ 'localisationupdate-desc' => 'உடà¯à®šà¯‚ழலà¯à®•à¯à®•à®¾à®© செயà¯à®¤à®¿à®•à®³à¯ˆ கூடியமடà¯à®Ÿà®¿à®²à¯à®®à¯ இனà¯à®±à¯ˆà®¯à®¨à®¿à®²à¯ˆà®¯à®¿à®²à¯ வைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©',
+);
+
+/** Telugu (తెలà±à°—à±)
+ * @author Veeven
+ */
+$messages['te'] = array(
+ 'localisationupdate-desc' => 'à°¸à±à°§à°¾à°¨à°¿à°•à±€à°•à°°à°¿à°‚à°šà°¿à°¨ సందేశాలనౠసాధà±à°¯à°®à±ˆà°¨à°‚à°¤ తాజాగా ఉంచà±à°¤à±à°‚ది',
+);
+
+/** Tagalog (Tagalog)
+ * @author AnakngAraw
+ */
+$messages['tl'] = array(
+ 'localisationupdate-desc' => 'Pinananatili ang mga mensaheng lokalisado bilang pinaka nasasapanahon',
+);
+
+/** Turkish (Türkçe)
+ * @author Joseph
+ */
+$messages['tr'] = array(
+ 'localisationupdate-desc' => 'Yerelleştirilen mesajları mümkün olabildiğince güncel tutar',
+);
+
+/** Ukrainian (українÑька)
+ * @author Prima klasy4na
+ */
+$messages['uk'] = array(
+ 'localisationupdate-desc' => 'Забезпечує Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ… повідомлень у міру можливоÑÑ‚Ñ–',
+);
+
+/** Veps (vepsän kel’)
+ * @author Игорь БродÑкий
+ */
+$messages['vep'] = array(
+ 'localisationupdate-desc' => 'Pidab lokaliziruidud tedotused veresin, ku voib',
+);
+
+/** Vietnamese (Tiếng Việt)
+ * @author Vinhtantran
+ */
+$messages['vi'] = array(
+ 'localisationupdate-desc' => 'Giữ các thông điệp bản địa hóa được cập nhật nhất có thể',
+);
+
+/** Walloon (walon)
+ * @author Srtxg
+ */
+$messages['wa'] = array(
+ 'localisationupdate-desc' => "Po wårder les ratournaedjes di l' eterface li pus a djoû possibe",
+);
+
+/** Yiddish (ייִדיש)
+ * @author פוילישער
+ */
+$messages['yi'] = array(
+ 'localisationupdate-desc' => '×”×לטן די ל×ק×ליזירטע מעלדונגען ×קטועל ווי × ×ר מעגלעך',
+);
+
+/** Cantonese (粵語)
+ * @author Tom Maaswinkel
+ */
+$messages['yue'] = array(
+ 'localisationupdate-desc' => '將本地化嘅信æ¯ä¿æŒæœ€æ–°',
+);
+
+/** Simplified Chinese (中文(简体)‎)
+ * @author Tom Maaswinkel
+ */
+$messages['zh-hans'] = array(
+ 'localisationupdate-desc' => '将本地化的信æ¯ä¿æŒæœ€æ–°',
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Mark85296341
+ * @author Tom Maaswinkel
+ */
+$messages['zh-hant'] = array(
+ 'localisationupdate-desc' => '將本地化的資訊盡å¯èƒ½ä¿æŒæœ€æ–°',
+);
diff --git a/extensions/LocalisationUpdate/LocalisationUpdate.php b/extensions/LocalisationUpdate/LocalisationUpdate.php
new file mode 100644
index 00000000..89f0659d
--- /dev/null
+++ b/extensions/LocalisationUpdate/LocalisationUpdate.php
@@ -0,0 +1,42 @@
+<?php
+
+
+/**
+ * Directory to store serialized cache files in. Defaults to $wgCacheDirectory.
+ * It's OK to share this directory among wikis as long as the wiki you run
+ * update.php on has all extensions the other wikis using the same directory
+ * have.
+ * NOTE: If this variable and $wgCacheDirectory are both false, this extension
+ * WILL NOT WORK.
+ */
+$wgLocalisationUpdateDirectory = false;
+
+
+/**
+ * These should point to either an HTTP-accessible file or local file system.
+ * $1 is the name of the repo (for extensions) and $2 is the name of file in the repo.
+ */
+$wgLocalisationUpdateCoreURL = "https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/core.git;a=blob_plain;f=$2;hb=HEAD";
+$wgLocalisationUpdateExtensionURL = "https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/$1.git;a=blob_plain;f=$2;hb=HEAD";
+
+/// Deprecated
+$wgLocalisationUpdateSVNURL = false;
+
+$wgLocalisationUpdateRetryAttempts = 5;
+
+// Info about me!
+$wgExtensionCredits['other'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'LocalisationUpdate',
+ 'author' => array( 'Tom Maaswinkel', 'Niklas Laxström', 'Roan Kattouw' ),
+ 'version' => '1.0',
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:LocalisationUpdate',
+ 'descriptionmsg' => 'localisationupdate-desc',
+);
+
+$wgHooks['LocalisationCacheRecache'][] = 'LocalisationUpdate::onRecache';
+
+$dir = __DIR__ . '/';
+$wgExtensionMessagesFiles['LocalisationUpdate'] = $dir . 'LocalisationUpdate.i18n.php';
+$wgAutoloadClasses['LocalisationUpdate'] = $dir . 'LocalisationUpdate.class.php';
+$wgAutoloadClasses['QuickArrayReader'] = $dir . 'QuickArrayReader.php';
diff --git a/extensions/LocalisationUpdate/QuickArrayReader.php b/extensions/LocalisationUpdate/QuickArrayReader.php
new file mode 100644
index 00000000..214d5a61
--- /dev/null
+++ b/extensions/LocalisationUpdate/QuickArrayReader.php
@@ -0,0 +1,187 @@
+<?php
+
+/**
+ * Quickie parser class that can happily read the subset of PHP we need
+ * for our localization arrays safely.
+ *
+ * About an order of magnitude faster than ConfEditor(), but still an
+ * order of magnitude slower than eval().
+ */
+class QuickArrayReader {
+ var $vars = array();
+
+ /**
+ * @param $string string
+ */
+ function __construct( $string ) {
+ $scalarTypes = array(
+ T_LNUMBER => true,
+ T_DNUMBER => true,
+ T_STRING => true,
+ T_CONSTANT_ENCAPSED_STRING => true,
+ );
+ $skipTypes = array(
+ T_WHITESPACE => true,
+ T_COMMENT => true,
+ T_DOC_COMMENT => true,
+ );
+ $tokens = token_get_all( $string );
+ $count = count( $tokens );
+ for( $i = 0; $i < $count; ) {
+ while( isset($skipTypes[$tokens[$i][0]] ) ) {
+ $i++;
+ }
+ switch( $tokens[$i][0] ) {
+ case T_OPEN_TAG:
+ $i++;
+ continue;
+ case T_VARIABLE:
+ // '$messages' -> 'messages'
+ $varname = trim( substr( $tokens[$i][1], 1 ) );
+ $varindex = null;
+
+ while( isset($skipTypes[$tokens[++$i][0]] ) );
+
+ if( $tokens[$i] === '[' ) {
+ while( isset($skipTypes[$tokens[++$i][0]] ) );
+
+ if( isset($scalarTypes[$tokens[$i][0]] ) ) {
+ $varindex = $this->parseScalar( $tokens[$i] );
+ } else {
+ throw $this->except( $tokens[$i], 'scalar index' );
+ }
+ while( isset($skipTypes[$tokens[++$i][0]] ) );
+
+ if( $tokens[$i] !== ']' ) {
+ throw $this->except( $tokens[$i], ']' );
+ }
+ while( isset($skipTypes[$tokens[++$i][0]] ) );
+ }
+
+ if( $tokens[$i] !== '=' ) {
+ throw $this->except( $tokens[$i], '=' );
+ }
+ while( isset($skipTypes[$tokens[++$i][0]] ) );
+
+ if( isset($scalarTypes[$tokens[$i][0]] ) ) {
+ $buildval = $this->parseScalar( $tokens[$i] );
+ } elseif( $tokens[$i][0] === T_ARRAY ) {
+ while( isset($skipTypes[$tokens[++$i][0]] ) );
+ if( $tokens[$i] !== '(' ) {
+ throw $this->except( $tokens[$i], '(' );
+ }
+ $buildval = array();
+ do {
+ while( isset($skipTypes[$tokens[++$i][0]] ) );
+
+ if( $tokens[$i] === ')' ) {
+ break;
+ }
+ if( isset($scalarTypes[$tokens[$i][0]] ) ) {
+ $key = $this->parseScalar( $tokens[$i] );
+ }
+ while( isset($skipTypes[$tokens[++$i][0]] ) );
+
+ if( $tokens[$i][0] !== T_DOUBLE_ARROW ) {
+ throw $this->except( $tokens[$i], '=>' );
+ }
+ while( isset($skipTypes[$tokens[++$i][0]] ) );
+
+ if( isset($scalarTypes[$tokens[$i][0]] ) ) {
+ $val = $this->parseScalar( $tokens[$i] );
+ }
+ @$buildval[$key] = $val;
+ while( isset($skipTypes[$tokens[++$i][0]] ) );
+
+ if( $tokens[$i] === ',' ) {
+ continue;
+ } elseif( $tokens[$i] === ')' ) {
+ break;
+ } else {
+ throw $this->except( $tokens[$i], ', or )' );
+ }
+ } while(true);
+ } else {
+ throw $this->except( $tokens[$i], 'scalar or array' );
+ }
+ if( is_null( $varindex ) ) {
+ $this->vars[$varname] = $buildval;
+ } else {
+ @$this->vars[$varname][$varindex] = $buildval;
+ }
+ while( isset($skipTypes[$tokens[++$i][0]] ) );
+ if( $tokens[$i] !== ';' ) {
+ throw $this->except($tokens[$i], ';');
+ }
+ $i++;
+ break;
+ default:
+ throw $this->except($tokens[$i], 'open tag, whitespace, or variable.');
+ }
+ }
+ }
+
+ /**
+ * @param $got string
+ * @param $expected string
+ * @return Exception
+ */
+ private function except( $got, $expected ) {
+ if( is_array( $got ) ) {
+ $got = token_name( $got[0] ) . " ('" . $got[1] . "')";
+ } else {
+ $got = "'" . $got . "'";
+ }
+ return new Exception( "Expected $expected, got $got" );
+ }
+
+ /**
+ * Parse a scalar value in PHP
+ *
+ * @param $token string
+ *
+ * @return mixed Parsed value
+ */
+ function parseScalar( $token ) {
+ if( is_array( $token ) ) {
+ $str = $token[1];
+ } else {
+ $str = $token;
+ }
+ if ( $str !== '' && $str[0] == '\'' )
+ // Single-quoted string
+ // @fixme trim() call is due to mystery bug where whitespace gets
+ // appended to the token; without it we ended up reading in the
+ // extra quote on the end!
+ return strtr( substr( trim( $str ), 1, -1 ),
+ array( '\\\'' => '\'', '\\\\' => '\\' ) );
+ if ( $str !== '' && @$str[0] == '"' )
+ // Double-quoted string
+ // @fixme trim() call is due to mystery bug where whitespace gets
+ // appended to the token; without it we ended up reading in the
+ // extra quote on the end!
+ return stripcslashes( substr( trim( $str ), 1, -1 ) );
+ if ( substr( $str, 0, 4 ) === 'true' )
+ return true;
+ if ( substr( $str, 0, 5 ) === 'false' )
+ return false;
+ if ( substr( $str, 0, 4 ) === 'null' )
+ return null;
+ // Must be some kind of numeric value, so let PHP's weak typing
+ // be useful for a change
+ return $str;
+ }
+
+ /**
+ * @param $varname string
+ * @return null|string
+ */
+ function getVar( $varname ) {
+ if( isset( $this->vars[$varname] ) ) {
+ return $this->vars[$varname];
+ } else {
+ return null;
+ }
+ }
+}
+
diff --git a/extensions/LocalisationUpdate/README_FIRST.txt b/extensions/LocalisationUpdate/README_FIRST.txt
new file mode 100644
index 00000000..3973c435
--- /dev/null
+++ b/extensions/LocalisationUpdate/README_FIRST.txt
@@ -0,0 +1,8 @@
+To install this extension first include
+LocalisationUpdate/LocalisationUpdate.php in your LocalSettings.php
+
+Then add the required new tables to your database by running
+php maintenance/update.php on the command line.
+
+Whenever you want to run an update, run
+php extensions/LocalisationUpdate/update.php on the command line.
diff --git a/extensions/LocalisationUpdate/update.php b/extensions/LocalisationUpdate/update.php
new file mode 100644
index 00000000..750fc4f2
--- /dev/null
+++ b/extensions/LocalisationUpdate/update.php
@@ -0,0 +1,38 @@
+<?php
+
+$IP = strval( getenv( 'MW_INSTALL_PATH' ) ) !== ''
+ ? getenv( 'MW_INSTALL_PATH' )
+ : realpath( dirname( __FILE__ ) . "/../../" );
+
+// TODO: migrate to maintenance class
+require_once( "$IP/maintenance/commandLine.inc" );
+
+if( isset( $options['help'] ) ) {
+ print "Fetches updated localisation files from MediaWiki development SVN\n";
+ print "and saves into local database to merge with release defaults.\n";
+ print "\n";
+ print "Usage: php extensions/LocalisationUpdate/update.php\n";
+ print "Options:\n";
+ print " --quiet Suppress progress output\n";
+ print " --skip-core Don't fetch MediaWiki core files\n";
+ print " --skip-extensions Don't fetch any extension files\n";
+ print " --all Fetch all present extensions, not just those enabled\n";
+ print " --outdir=<dir> Override output directory for serialized update files\n";
+ print " --svnurl=<url> URL to SVN repository, or path to local SVN checkout. Deprecated.\n";
+ print "\n";
+ exit( 0 );
+}
+
+
+$starttime = microtime( true );
+
+// Prevent the script from timing out
+set_time_limit( 0 );
+ini_set( "max_execution_time", 0 );
+ini_set( 'memory_limit', -1 );
+
+LocalisationUpdate::updateMessages( $options );
+
+$endtime = microtime( true );
+$totaltime = ( $endtime - $starttime );
+print "All done in " . $totaltime . " seconds\n";
diff --git a/extensions/Nuke/.gitreview b/extensions/Nuke/.gitreview
deleted file mode 100644
index c623aede..00000000
--- a/extensions/Nuke/.gitreview
+++ /dev/null
@@ -1,5 +0,0 @@
-[gerrit]
-host=gerrit.wikimedia.org
-port=29418
-project=mediawiki/extensions/Nuke.git
-defaultbranch=master
diff --git a/extensions/Nuke/Nuke.alias.php b/extensions/Nuke/Nuke.alias.php
index 2ac719d4..7ca75426 100644
--- a/extensions/Nuke/Nuke.alias.php
+++ b/extensions/Nuke/Nuke.alias.php
@@ -73,6 +73,11 @@ $specialPageAliases['fi'] = array(
'Nuke' => array( 'Massapoisto' ),
);
+/** Galician (galego) */
+$specialPageAliases['gl'] = array(
+ 'Nuke' => array( 'Eliminar_en_masa' ),
+);
+
/** Swiss German (Alemannisch) */
$specialPageAliases['gsw'] = array(
'Nuke' => array( 'Masseleschig' ),
@@ -173,12 +178,12 @@ $specialPageAliases['ms'] = array(
'Nuke' => array( 'Hapus_pukal' ),
);
-/** Norwegian Bokmål (norsk (bokmål)‎) */
+/** Norwegian Bokmål (norsk bokmål) */
$specialPageAliases['nb'] = array(
'Nuke' => array( 'Massesletting' ),
);
-/** Nedersaksisch (Nedersaksisch) */
+/** Low Saxon (Netherlands) (Nedersaksies) */
$specialPageAliases['nds-nl'] = array(
'Nuke' => array( 'Massaal_vortdoon' ),
);
@@ -188,7 +193,7 @@ $specialPageAliases['nl'] = array(
'Nuke' => array( 'MassaalVerwijderen' ),
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎) */
+/** Norwegian Nynorsk (norsk nynorsk) */
$specialPageAliases['nn'] = array(
'Nuke' => array( 'Massesletting' ),
);
@@ -218,6 +223,11 @@ $specialPageAliases['sa'] = array(
'Nuke' => array( 'नà¥à¤¯à¥‚क' ),
);
+/** Sicilian (sicilianu) */
+$specialPageAliases['scn'] = array(
+ 'Nuke' => array( 'CancellazioneMassiva' ),
+);
+
/** Slovak (slovenÄina) */
$specialPageAliases['sk'] = array(
'Nuke' => array( 'ZniÄenie' ),
diff --git a/extensions/Nuke/Nuke.i18n.php b/extensions/Nuke/Nuke.i18n.php
index 451f0459..a7b6f045 100644
--- a/extensions/Nuke/Nuke.i18n.php
+++ b/extensions/Nuke/Nuke.i18n.php
@@ -55,32 +55,67 @@ Input the username or IP address to get a list of pages to delete, or leave blan
* @author Yekrats
*/
$messages['qqq'] = array(
- 'nuke' => 'The Nuke extension allows for sysops to delete a large number of pages ("Mass delete").
+ 'nuke' => '{{doc-special|Nuke}}
+The Nuke extension allows for sysops to delete a large number of pages ("Mass delete").
For more information, see http://www.mediawiki.org/wiki/Extension:Nuke',
'action-nuke' => '{{doc-action|nuke}}',
- 'nuke-desc' => 'The Nuke extension allows for sysops to delete a large number of pages ("Mass delete").
-For more information, see http://www.mediawiki.org/wiki/Extension:Nuke
-{{desc}}',
- 'nuke-nopages' => 'Parameters:
-* $1 is a username',
- 'nuke-list' => 'Parameters:
-* $1 is a username.',
- 'nuke-defaultreason' => 'Reason for deletion in logs. {{msg-mw|nuke-multiplepeople}} is used when pages created by multiple people are deleted. Parameters:
-* $1 is a username or IP address, with a link to their contributions.',
+ 'nuke-desc' => '{{desc|name=Nuke|url=http://www.mediawiki.org/wiki/Extension:Nuke}}
+The Nuke extension allows for sysops to delete a large number of pages ("Mass delete").',
+ 'nuke-nopages' => 'Used if there are no pages to delete and the username is not empty.
+
+Parameters:
+* $1 - a username
+
+See also:
+* {{msg-mw|Nuke-nopages-global}}',
+ 'nuke-list' => 'This message refers to:
+* the comment (reason) field which has the label {{msg-mw|deletecomment}}
+* the button labeled {{msg-mw|nuke-submit-delete}}.
+Parameters:
+* $1 - username
+See also:
+* {{msg-mw|Nuke-list-multiple}}',
+ 'nuke-list-multiple' => 'This message refers to:
+* the comment (reason) field which has the label {{msg-mw|deletecomment}}
+* the button labeled {{msg-mw|nuke-submit-delete}}.
+See also:
+* {{msg-mw|Nuke-list}}',
+ 'nuke-defaultreason' => 'Reason for deletion in logs. {{msg-mw|nuke-multiplepeople}} is used when pages created by multiple people are deleted.
+
+Parameters:
+* $1 - a username or IP address, with a link to their contributions',
'nuke-multiplepeople' => 'Reason for deletion in logs, when pages created by multiple users were deleted.
{{msg-mw|nuke-defaultreason}} is used when pages created by only 1 user are deleted.',
+ 'nuke-tools' => 'Used as intro text for the Nuke (mass deletion) form.',
'nuke-submit-user' => '{{Identical|Go}}',
'nuke-submit-delete' => 'Submit button to delete the selected pages.',
'right-nuke' => '{{doc-right|nuke}}',
'nuke-select' => 'Parameter $1 are two links: {{msg-mw|powersearch-toggleall}} and {{msg-mw|powersearch-togglenone}} which respectively selects all pages and de-selects all pages.
{{Identical|Select}}',
- 'nuke-editby' => 'Parameters:
-* $1 is a username.',
+ 'nuke-userorip' => 'Used as label for "target" input box.',
+ 'nuke-maxpages' => 'Used as label for "nuke limit" input box.',
+ 'nuke-editby' => 'This message is followed by {{msg-mw|Comma-separator}} and {{msg-mw|Nuke-viewchanges}}.
+
+Parameters:
+* $1 - a username',
'nuke-deleted' => '*$1 - page title',
'nuke-not-deleted' => '*$1 - page title',
- 'nuke-namespace' => 'Label shown on Special:Nuke in front of the namespace input that allows choosing a namespace to filter the search by',
+ 'nuke-delete-more' => 'Used at the bottom of the Nuke (mass deletion) result page.',
+ 'nuke-pattern' => 'Used as label for "nuke pattern" input box.',
+ 'nuke-nopages-global' => 'Used if there are no pages to delete and the username is empty.
+
+See also:
+* {{msg-mw|Nuke-nopages}}',
+ 'nuke-viewchanges' => 'Used as link text.
+
+The link points to History page of the page.
+
+This message follows:
+* {{msg-mw|nuke-editby}} and {{msg-mw|comma-separator}}
+* or empty string (if username is empty).',
+ 'nuke-namespace' => 'Label shown on [[Special:Nuke]] in front of the namespace input that allows choosing a namespace to filter the search by',
);
/** Afrikaans (Afrikaans)
@@ -89,6 +124,7 @@ For more information, see http://www.mediawiki.org/wiki/Extension:Nuke
*/
$messages['af'] = array(
'nuke' => 'Massa verwyder',
+ 'action-nuke' => 'massa verwydering van bladsye',
'nuke-nopages' => 'Geen nuwe bladsye [[Special:Contributions/$1|$1]] in onlangse wysigings.', # Fuzzy
'nuke-list-multiple' => "Die volgende bladsye is onlangs geskep word;
sit dit in 'n kommentaar en druk die knoppie om dit te skrap.",
@@ -103,7 +139,11 @@ sit dit in 'n kommentaar en druk die knoppie om dit te skrap.",
'nuke-editby' => 'Geskep deur [[Special:Contributions/$1|$1]]', # Fuzzy
'nuke-deleted' => "Bladsy '''$1''' is verwyder.",
'nuke-not-deleted' => "Bladsy [[:$1]] '''kon nie''' verwyder word nie.",
+ 'nuke-delete-more' => '[[Special:Nuke|Skrap meer bladsy]]',
'nuke-pattern' => 'Patroon vir die naam:',
+ 'nuke-nopages-global' => 'Daar is nie nuwe bladsye in [[Special:RecentChanges|onlangse wysigings]] nie.',
+ 'nuke-viewchanges' => 'wys veranderings',
+ 'nuke-namespace' => 'Beperk tot naamruimte:',
);
/** Aragonese (aragonés)
@@ -452,11 +492,12 @@ $messages['cs'] = array(
'nuke' => 'Hromadné mazání',
'action-nuke' => 'hromadně mazat stránky',
'nuke-desc' => 'Dává správcům možnost [[Special:Nuke|hromadného mazání]] stránek',
- 'nuke-nopages' => 'V posledních změnách nejsou žádné nové stránky od uživatele [[Special:Contributions/$1|$1]].', # Fuzzy
- 'nuke-list' => 'Následující stránky nedávno vytvoÅ™il uživatel [[Special:Contributions/$1|$1]]; vyplňte komentář a vÅ¡echny smažte kliknutím na tlaÄítko.', # Fuzzy
+ 'nuke-nopages' => 'V posledních změnách nejsou žádné nové stránky od {{GENDER:$1|uživatele|uživatelky}} [[Special:Contributions/$1|$1]].',
+ 'nuke-list' => 'Následující stránky nedávno {{GENDER:$1|vytvořil|vytvořila}} [[Special:Contributions/$1|$1]];
+vyplňte komentář a vÅ¡echny smažte kliknutím na tlaÄítko.',
'nuke-list-multiple' => 'Nedávno byly vytvořeny následující stránky;
zadáním komentáře a stisknutím tlaÄítka je smažete.',
- 'nuke-defaultreason' => 'Hromadné odstranění stránek, které vytvořil $1', # Fuzzy
+ 'nuke-defaultreason' => 'Hromadné odstranění stránek, které {{GENDER:$1|vytvořil|vytvořila}} [[Special:Contributions/$1|$1]]',
'nuke-multiplepeople' => 'Hromadné odstranění nedávno založených stránek',
'nuke-tools' => 'Tento nástroj umožňuje hromadné smazání stránek nedávno vytvořených zadaným uživatelem nebo IP adresou.
Zadejte uživatelské jméno nebo IP adresu, zobrazí se seznam stránek ke smazání; případně ponechte prázdné pro všechny uživatele.',
@@ -466,17 +507,19 @@ Zadejte uživatelské jméno nebo IP adresu, zobrazí se seznam stránek ke smaz
'nuke-select' => 'Vybrat: $1',
'nuke-userorip' => 'Uživatelské jméno, IP adresa nebo ponechte prázdné:',
'nuke-maxpages' => 'Maximální poÄet stran:',
- 'nuke-editby' => '{{gender:$1|Vytvořil|Vytvořila|Vytvořil}} [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => '{{GENDER:$1|Vytvořil|Vytvořila}} [[Special:Contributions/$1|$1]]',
'nuke-deleted' => "Stránka '''$1''' byla smazána.",
'nuke-not-deleted' => "Stránka [[:$1]] '''nemohla být''' smazána.",
'nuke-delete-more' => '[[Special:Nuke|Odstranit další stránky]]',
'nuke-pattern' => 'Vzor pro název stránky:',
'nuke-nopages-global' => 'V [[Special:RecentChanges|posledních změnách]] nejsou žádné nové stránky.',
'nuke-viewchanges' => 'ukázat změny',
+ 'nuke-namespace' => 'Omezit na jmenný prostor:',
);
/** Danish (dansk)
* @author Byrial
+ * @author Christian List
* @author Kaare
* @author Peter Alberti
*/
@@ -484,11 +527,11 @@ $messages['da'] = array(
'nuke' => 'Massesletning',
'action-nuke' => 'masseslette sider',
'nuke-desc' => 'Giver administratorer mulighed for at [[Special:Nuke|masseslette]] sider',
- 'nuke-nopages' => 'Der er ingen nye sider af [[Special:Contributions/$1|$1]] i seneste ændringer.', # Fuzzy
- 'nuke-list' => 'Følgende sider er oprettet for nylig af [[Special:Contributions/$1|$1]]; skriv en kommentar og tryk på knappen for at slette dem.', # Fuzzy
+ 'nuke-nopages' => 'Der er ingen nye sider af [[Special:Contributions/$1|{{GENDER:$1|$1}}]] i seneste ændringer.',
+ 'nuke-list' => 'Følgende sider er oprettet for nylig af [[Special:Contributions/$1|{{GENDER:$1|$1}}]]; skriv en kommentar og tryk på knappen for at slette dem.',
'nuke-list-multiple' => 'De følgende sider blev oprettet fornylig;
skriv en kommentar ind og tryk på knappen for at slette dem.',
- 'nuke-defaultreason' => 'Massesletning af sider, som er oprettet af $1', # Fuzzy
+ 'nuke-defaultreason' => 'Massesletning af sider, som er oprettet af [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-multiplepeople' => 'Massesletning af nyligt oprettede sider',
'nuke-tools' => 'Dette værktøj muliggør massesletning af sider, som for nylig er oprettet af en bestemt bruger eller IP-adresse.
Skriv et brugernavn eller en IP-adresse for at få en liste over sider at slette eller lad stå tom for alle brugere.',
@@ -498,7 +541,7 @@ Skriv et brugernavn eller en IP-adresse for at få en liste over sider at slette
'nuke-select' => 'Vælg: $1',
'nuke-userorip' => 'Brugernavn, IP-adresse eller tom:',
'nuke-maxpages' => 'Maksimalt antal sider:',
- 'nuke-editby' => 'Oprettet af [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Oprettet af [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-deleted' => "Siden '''$1''' er blevet slettet.",
'nuke-not-deleted' => "Siden [[:$1]] '''kunne ikke''' slettes.",
'nuke-delete-more' => '[[Special:Nuke|Slet flere sider]]',
@@ -529,7 +572,7 @@ Gib einen Kommentar bezüglich der Löschung an und klicke auf die Schaltfläche
Gib die IP-Adresse oder den Benutzernamen ein, um eine Liste der zu löschenden Seiten zu erhalten. Sofern Du keine Angabe machst, werden alle Benutzer ausgewählt.',
'nuke-submit-user' => 'Abrufen',
'nuke-submit-delete' => 'Ausgewählte Seiten löschen',
- 'right-nuke' => 'Massenlöschung von Seiten',
+ 'right-nuke' => 'Massenlöschungen von Seiten',
'nuke-select' => 'Auswählen: $1',
'nuke-userorip' => 'Benutzername, IP-Adresse oder keine Angabe:',
'nuke-maxpages' => 'Maximale Anzahl der Seiten:',
@@ -564,15 +607,19 @@ Geben Sie die IP-Adresse oder den Benutzernamen ein, um eine Liste der zu lösch
*/
$messages['diq'] = array(
'nuke' => 'pêropiya hewnakeno..',
+ 'action-nuke' => 'perê nuke',
'nuke-desc' => 'Hizmetlilere, sayfaları [[Special:Nuke|kitlesel silme]] yeteneği verir',
- 'nuke-nopages' => 'vuriyayişê ke hetê ıney ra [[Special:Contributions/$1|$1]] biye tede çı pelê neweyi çini .', # Fuzzy
- 'nuke-list' => 'pelê ke cêr de yê hetê ıney ra [[Special:Contributions/$1|$1]] yew tarixo nızdi de vıraziyayi; mışore bıkerê u qey hewnakerdışi yew tuş bıtıknê.', # Fuzzy
- 'nuke-defaultreason' => 'Peleyê ke $1 dekerdê de ena pêron hewadayış', # Fuzzy
+ 'nuke-nopages' => 'Vuriyayişê ke hetê ıney ra [[Special:Contributions/$1|{{GENDER:$1|$1}}]] biye tede çı pelê neweyi çini .',
+ 'nuke-list' => 'Pelê ke cêr de yê hetê ıney ra [[Special:Contributions/$1|{{GENDER:$1|$1}}]] yew tarixo nızdi de vıraziyayi; mışore bıkerê u qey hewnakerdışi yew tuş bıtıknê.',
+ 'nuke-defaultreason' => 'Peleyê ke [[Special:Contributions/$1|{{GENDER:$1|$1}}]] dekerdê de ena pêron hewadayış',
'nuke-tools' => 'Na hacet, peleyê ke nezdı ra yew karber yana ip ra akerdê êna pêrun rê esternayış de cı rê mısade dano.
Listanê peleyê ke besternaya vinayışi rê namey karberi yana ip adresi dekere de.',
'nuke-submit-user' => 'Åžo',
'nuke-submit-delete' => 'Weçinayi esterne',
'right-nuke' => 'pelan yew hew de hewnaker',
+ 'nuke-select' => 'Weçinaye: $1',
+ 'nuke-delete-more' => '[[Special:Nuke|Zewbi pera besterne]]',
+ 'nuke-viewchanges' => 'Vurnayışa bıvin',
);
/** Lower Sorbian (dolnoserbski)
@@ -582,12 +629,12 @@ $messages['dsb'] = array(
'nuke' => 'Masowe lašowanje',
'action-nuke' => 'Boki z masami lašowaś',
'nuke-desc' => 'Zmóžnja admininistratoram boki [[Special:Nuke|z masami lašowaś]]',
- 'nuke-nopages' => 'Žedne nowe boki wót [[Special:Contributions/$1|$1]] w aktualnych změnach', # Fuzzy
- 'nuke-list' => 'Slědujuce boki su se nowo napórali wót [[Special:Contributions/$1|$1]];
-zapódaj komentar a klikni na tłocašk, aby je lašował.', # Fuzzy
+ 'nuke-nopages' => 'Žedne nowe boki wót [[Special:Contributions/$1|{{GENDER:$1|$1}}]] w aktualnych změnach.',
+ 'nuke-list' => 'Slědujuce boki su se nowo napórali wót [[Special:Contributions/$1|{{GENDER:$1$1}}]];
+zapódaj komentar a klikni na tłocašk, aby je lašował.',
'nuke-list-multiple' => 'Slědujuce boki su se rowno napórali;
zapódaj komentar a klikni na tłocašk, aby je wulašował.',
- 'nuke-defaultreason' => 'Masowe lašowanje bokow, kótarež $1 jo pśidał.', # Fuzzy
+ 'nuke-defaultreason' => 'Masowe lašowanje bokow, kótarež [[Special:Contributions/$1|{{GENDER:$1|$1}}]] jo pśidał.',
'nuke-multiplepeople' => 'Masowe wulašowanje njedawno pśidanych bokow',
'nuke-tools' => 'Toś ten rěd zmóžnja masowe lašowanja bokow, kótarež wěsty wužywaŕ abo IP jo rowno pśidał. Zapódaj wužywarske mě abo IP-adresu, aby dostał lisćinu bokow, kótarež maju se lašowaś abo wóstaj pólo prozne, aby wubrał wšych wužywarjow.',
'nuke-submit-user' => 'W pórěźe',
@@ -596,13 +643,14 @@ zapódaj komentar a klikni na tłocašk, aby je wulašował.',
'nuke-select' => 'WubraÅ›: $1',
'nuke-userorip' => 'Wužywarske mě, IP-adresa abo žedno pódaśe:',
'nuke-maxpages' => 'Maksimalna licba bokow:',
- 'nuke-editby' => 'Napórany wót [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Napórany wót [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-deleted' => "Bok '''$1''' jo se wulašował.",
'nuke-not-deleted' => "Bok [[:$1]] '''njejo dał''' se wulašowaś.",
'nuke-delete-more' => '[[Special:Nuke|Dalšne boki lašowaś]]',
'nuke-pattern' => 'Pśikład za bokowe mě:',
'nuke-nopages-global' => 'Njejsu žedne nowe boki w [[Special:RecentChanges|aktualnych změnach]].',
'nuke-viewchanges' => 'změny pokazaś',
+ 'nuke-namespace' => 'Na slědujucy mjenjowy rum wobgranicowaś:',
);
/** Ewe (eʋegbe)
@@ -636,6 +684,7 @@ $messages['el'] = array(
'nuke-editby' => 'ΔημιουÏγήθηκε από [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-deleted' => "Η σελίδα '''$1''' έχει διαγÏαφεί.",
'nuke-not-deleted' => "Η σελίδα [[:$1]] '''δεν μποÏοÏσε''' να διαγÏαφεί.",
+ 'nuke-viewchanges' => 'Ï€Ïοβολή αλλαγών',
);
/** Esperanto (Esperanto)
@@ -674,6 +723,7 @@ Enigu la salutnomon aÅ­ IP-adreson por akiri liston de paÄoj forigi, aÅ­ lasu Ä
* @author Crazymadlover
* @author DJ Nietzsche
* @author Dferg
+ * @author Fitoschido
* @author Imre
* @author Jatrobat
* @author Platonides
@@ -685,11 +735,11 @@ $messages['es'] = array(
'nuke' => 'Borrado en masa',
'action-nuke' => 'Destruir páginas',
'nuke-desc' => 'Da a los administradores la posibilidad de [[Special:Nuke|borrar páginas de forma masiva]]',
- 'nuke-nopages' => 'No hay páginas nuevas hechas por [[Special:Contributions/$1|$1]] en cambios recientes.',
+ 'nuke-nopages' => 'No hay páginas nuevas creadas por [[Special:Contributions/$1|$1]] en cambios recientes.',
'nuke-list' => 'Las siguientes páginas han sido creadas recientemente por [[Special:Contributions/$1|$1]];
añade un comentario y haz clic sobre el botón para vaciarlas.',
'nuke-list-multiple' => 'Las siguientes páginas han sido creadas recientemente; introduce un comentario y pulsa el botón para eliminarlas.',
- 'nuke-defaultreason' => 'Elimininación en masa de páginas agregadas por [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+ 'nuke-defaultreason' => 'Eliminación en masa de páginas añadidas por [[Special:Contributions/$1|$1]]',
'nuke-multiplepeople' => 'Eliminación masiva de páginas nuevas de múltiples usuarios',
'nuke-tools' => 'Esta herramienta permite borrados masivos de páginas creadas recientemente por un usuario o una dirección IP.
Introduzca el nombre de usuario o la dirección IP para obtener la lista de páginas a borrar, o déjelo en blanco para todos los usuarios.',
@@ -716,11 +766,11 @@ $messages['et'] = array(
'nuke' => 'Lauskustutamine',
'action-nuke' => 'lehekülgi lauskustutada',
'nuke-desc' => 'Võimaldab administraatoritel lehekülgede [[Special:Nuke|lauskustutamist]].',
- 'nuke-nopages' => 'Viimaste muudatuste all pole uusi kasutaja [[Special:Contributions/$1|$1]] loodud lehekülgi.', # Fuzzy
- 'nuke-list' => 'Kasutaja [[Special:Contributions/$1|$1]] on hiljuti loonud järgnevad leheküljed. Enne kustutamist sisesta kommentaar.', # Fuzzy
+ 'nuke-nopages' => 'Viimaste muudatuste all pole uusi kasutaja [[Special:Contributions/$1|$1]] loodud lehekülgi.',
+ 'nuke-list' => 'Kasutaja [[Special:Contributions/$1|$1]] on hiljuti loonud järgmised leheküljed. Enne kustutamist sisesta kommentaar.',
'nuke-list-multiple' => 'Järgmised leheküljed on hiljuti loodud.
Sisesta kommentaar ja klõpsa kustutamisnuppu.',
- 'nuke-defaultreason' => 'Kasutaja $1 lisatud lehekülgede lauseemaldamine', # Fuzzy
+ 'nuke-defaultreason' => 'Kasutaja [[Special:Contributions/$1|$1]] lisatud lehekülgede lauseemaldamine',
'nuke-multiplepeople' => 'Hiljuti lisatud lehekülgede lauskustutamine',
'nuke-tools' => 'See tööriist võimaldab kasutaja või IP-aadressi hiljuti lisatud leheküljed lauskustutada.
Kustutatavate lehekülgede nimekirja näitamiseks sisesta kasutajanimi või IP-aadress. Kõigi kasutajate lisatud lehekülgede jaoks jäta väli tühjaks.',
@@ -730,22 +780,26 @@ Kustutatavate lehekülgede nimekirja näitamiseks sisesta kasutajanimi või IP-a
'nuke-select' => 'Valik: $1',
'nuke-userorip' => 'Kasutajanimi, IP-aadress või tühemik:',
'nuke-maxpages' => 'Lehekülgede ülemmäär:',
- 'nuke-editby' => 'Alustanud [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Alustanud [[Special:Contributions/$1|$1]]',
'nuke-deleted' => "Lehekülg '''$1''' on kustutatud.",
'nuke-not-deleted' => "Lehekülge [[:$1]] '''ei saa''' kustutada.",
'nuke-delete-more' => '[[Special:Nuke|Kustuta veel lehekülgi]]',
'nuke-pattern' => 'Lehekülje pealkirja kuju:',
'nuke-nopages-global' => '[[Special:RecentChanges|Viimaste muudatuste]] all pole uusi lehekülgi.',
'nuke-viewchanges' => 'vaata muudatusi',
+ 'nuke-namespace' => 'Nimeruumipiirang:',
);
/** Basque (euskara)
* @author Theklan
* @author Unai Fdz. de Betoño
+ * @author Xabier Armendaritz
*/
$messages['eu'] = array(
'nuke' => 'Ezabaketa masiboa',
'nuke-nopages' => 'Aldaketa berrietan ez dago [[Special:Contributions/$1|$1]](r)en orri berririk.', # Fuzzy
+ 'nuke-list' => 'Ondorengo orri hauek sortu berri ditu [[Special:Contributions/$1|{{GENDER:$1|$1}}]] wikilariak;
+idatz ezazu ohar bat, eta sakatu botoia orri horiek ezabatzeko.',
'nuke-defaultreason' => '$1(e)k sortutako orrien ezabaketa masiboa', # Fuzzy
'nuke-submit-user' => 'Joan',
'nuke-submit-delete' => 'Aukeratutakoa ezabatu',
@@ -791,6 +845,7 @@ $messages['fa'] = array(
* @author Jaakonam
* @author Nike
* @author Olli
+ * @author Stryn
*/
$messages['fi'] = array(
'nuke' => 'Massapoisto',
@@ -811,13 +866,14 @@ Kirjoita käyttäjänimi tai IP-osoite, niin saat listan poistettavista sivuista
'nuke-select' => 'Valinta: $1',
'nuke-userorip' => 'Käyttäjänimi tai IP-osoite (voi jättää myös tyhjäksi):',
'nuke-maxpages' => 'Sivujen enimmäismäärä:',
- 'nuke-editby' => 'Tehnyt [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Luonut [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-deleted' => "Sivu '''$1''' on poistettu.",
'nuke-not-deleted' => "Sivua [[:$1]] '''ei voitu''' poistaa.",
'nuke-delete-more' => '[[Special:Nuke|Poista lisää sivuja]]',
'nuke-pattern' => 'Sivun nimien etuliite',
'nuke-nopages-global' => '[[Special:RecentChanges|Tuoreissa muutoksissa]] ei ole uusia sivuja.',
'nuke-viewchanges' => 'näytä muutokset',
+ 'nuke-namespace' => 'Rajoita nimiavaruuteen:',
);
/** French (français)
@@ -867,12 +923,12 @@ $messages['frp'] = array(
'nuke' => 'Suprèssion en massa',
'action-nuke' => 'suprimar des pâges en massa',
'nuke-desc' => 'Balye la possibilitât ux administrators de [[Special:Nuke|suprimar en massa]] des pâges.',
- 'nuke-nopages' => 'Gins de pâge novèla fêta per [[Special:Contributions/$1|$1]] dens la lista des dèrriérs changements.', # Fuzzy
- 'nuke-list' => 'Cetes pâges ont étâ fêtes dèrriérement per [[Special:Contributions/$1|$1]] ;
-buchiéd un comentèro et pués clicâd sur lo boton por les suprimar.', # Fuzzy
+ 'nuke-nopages' => 'Niona pâge novèla per [[Special:Contributions/$1|{{GENDER:$1|$1}}]] dedens los dèrriérs changements.',
+ 'nuke-list' => 'Dês pou cetes pâges sont étâyes fêtes per [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ;
+buchiéd un comentèro et pués clicâd sur lo boton por les suprimar.',
'nuke-list-multiple' => 'Cetes pâges ont étâ fêtes dèrriérement ;
buchiéd un comentèro et pués clicâd sur lo boton por les suprimar.',
- 'nuke-defaultreason' => 'Suprèssion en massa de les pâges apondues per $1', # Fuzzy
+ 'nuke-defaultreason' => 'Suprèssion en massa de les pâges apondues per [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-multiplepeople' => 'Suprèssions en massa de les pâges apondues dèrriérement',
'nuke-tools' => 'Ceti outil pèrmèt les suprèssions en massa de les pâges apondues dèrriérement per un usanciér encartâ ou ben per una adrèce IP.
Buchiér lo nom d’usanciér ou ben l’adrèce IP por avêr la lista de les pâges a suprimar, ou ben lèssiér blanc por tôs los usanciérs.',
@@ -882,13 +938,14 @@ Buchiér lo nom d’usanciér ou ben l’adrèce IP por avêr la lista de les pÃ
'nuke-select' => 'Chouèsésséd : $1',
'nuke-userorip' => 'Nom d’usanciér, adrèce IP ou ben vouedo :',
'nuke-maxpages' => 'Nombro lo ples grant de pâges :',
- 'nuke-editby' => 'Fêt per [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Fêt per [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-deleted' => "La pâge '''$1''' at étâ suprimâ.",
'nuke-not-deleted' => "La pâge [[:$1]] '''pôt pas''' étre suprimâ.",
'nuke-delete-more' => '[[Special:Nuke|Suprimar més de pâges]]',
'nuke-pattern' => 'Modèlo por lo nom de pâge :',
'nuke-nopages-global' => 'Y at gins de pâge novèla dedens los [[Special:RecentChanges|dèrriérs changements]].',
'nuke-viewchanges' => 'vêre los changements',
+ 'nuke-namespace' => 'Sè limitar a cet’èspâço de noms :',
);
/** Friulian (furlan)
@@ -1111,7 +1168,10 @@ $messages['hu'] = array(
'nuke-desc' => 'Lehetővé teszi az adminisztrátorok számára a lapok [[Special:Nuke|tömeges törlését]].',
'nuke-nopages' => 'Nincsenek új oldalak [[Special:Contributions/$1|$1]] az aktuális események között.', # Fuzzy
'nuke-list' => 'Az alábbi lapokat nem rég készítette [[Special:Contributions/$1|$1]]; adj meg egy indoklást, és kattints a gombra a törlésükhöz.', # Fuzzy
- 'nuke-defaultreason' => '$1 által készített lapok tömeges eltávolítása', # Fuzzy
+ 'nuke-list-multiple' => 'Az alábbi lapok találhatók a friss változtatásokban;
+adjál hozzá megjegyzést, és a törléshez nyomd meg a gombot.',
+ 'nuke-defaultreason' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] által készített lapok tömeges eltávolítása',
+ 'nuke-multiplepeople' => 'Frissen hozzáadott oldalak tömeges törlése',
'nuke-tools' => 'Ez az eszköz lehetővé teszi egy adott felhasználó vagy IP által nemrég készített lapok tömeges törlését. Add meg a felhasználónevet vagy az IP-címet, ezzel megkapod a törölhető lapok listáját. Ha nem adsz meg nevet, az összes felhasználót listázza.',
'nuke-submit-user' => 'Menj',
'nuke-submit-delete' => 'Kijelöltek törlése',
@@ -1119,9 +1179,14 @@ $messages['hu'] = array(
'nuke-select' => 'Kiválasztás: $1',
'nuke-userorip' => 'Felhasználónév, IP-cím vagy üres:',
'nuke-maxpages' => 'Lapok maximális száma:',
+ 'nuke-editby' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] által létrehozott',
'nuke-deleted' => "'''$1''' oldal törölve lett.",
'nuke-not-deleted' => "[[:$1]] oldalt ''nem sikerült''' törölni.",
'nuke-delete-more' => '[[Special:Nuke|További oldalak törlése]]',
+ 'nuke-pattern' => 'Lapnév minta:',
+ 'nuke-nopages-global' => 'Nincsenek új lapok a [[Special:RecentChanges|friss változtatásokban]].',
+ 'nuke-viewchanges' => 'változtatások megtekintése',
+ 'nuke-namespace' => 'Csak az alábbi névtérben:',
);
/** Interlingua (interlingua)
@@ -1158,26 +1223,34 @@ Entra le nomine de usator o adresse IP pro obtener un lista de paginas a deler,
/** Indonesian (Bahasa Indonesia)
* @author Bennylin
* @author IvanLanin
+ * @author Iwan Novirion
* @author Rex
*/
$messages['id'] = array(
- 'nuke' => 'Penghapusan massal',
+ 'nuke' => 'Penghapusan masal',
'nuke-desc' => 'Memberikan kemampuan bagi pengurus untuk [[Special:Nuke|menghapus halaman secara massal]]',
- 'nuke-nopages' => 'Tak ditemukan halaman baru dari [[Special:Contributions/$1|$1]] di perubahan terbaru.', # Fuzzy
- 'nuke-list' => 'Halaman berikut baru saja dibuat oleh [[Special:Contributions/$1|$1]]; masukkan suatu komentar dan tekan tombol untuk menghapus halaman-halaman tersebut.', # Fuzzy
+ 'nuke-nopages' => 'Tak ditemukan halaman baru dari [[Special:Contributions/$1|{{GENDER:$1|$1}}]] di perubahan terbaru.',
+ 'nuke-list' => 'Halaman berikut baru saja dibuat oleh [[Special:Contributions/$1|{{GENDER:$1|$1}}]]; berikan komentar dan tekan tombol untuk menghapus halaman-halaman tersebut.',
'nuke-list-multiple' => 'Halaman berikut baru dibuat;
-masukkan suatu komentar dan tekan tombol untuk menghapus.',
- 'nuke-defaultreason' => 'Penghapusan massal halaman-halaman yang dibuat oleh $1', # Fuzzy
- 'nuke-multiplepeople' => 'beberapa pengguna', # Fuzzy
- 'nuke-tools' => 'Alat ini memungkinkan penghapusan massal halaman-halaman yang baru saja dibuat oleh seorang pengguna atau IP.
-Masukkan nama pengguna atau IP untuk mendapat daftar halaman yang dapat dihapus atau kosongkan untuk daftar halaman dari semua pengguna.',
- 'nuke-submit-user' => 'Tuju ke',
+berikan komentar dan tekan tombol untuk menghapus.',
+ 'nuke-defaultreason' => 'Penghapusan masal halaman-halaman yang dibuat oleh [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+ 'nuke-multiplepeople' => 'Penghapusan masal halaman yang baru saja ditambahkan',
+ 'nuke-tools' => 'Perkakas ini memungkinkan penghapusan masal halaman-halaman yang baru saja dibuat oleh seorang pengguna ataupun alamat IP.
+Masukkan nama pengguna atau alamat IP untuk mendapat daftar halaman yang dapat dihapus atau kosongkan untuk semua pengguna.',
+ 'nuke-submit-user' => 'Jalankan',
'nuke-submit-delete' => 'Hapus yang terpilih',
'right-nuke' => 'Melakukan penghapusan masal halaman',
'nuke-select' => 'Pilih: $1',
'nuke-userorip' => 'Nama pengguna, alamat IP, atau kosong:',
'nuke-maxpages' => 'Jumlah maksimum halaman:',
- 'nuke-editby' => 'Dibuat oleh [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Dibuat oleh [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+ 'nuke-deleted' => "Halaman '''$1''' sudah dihapus.",
+ 'nuke-not-deleted' => "Halaman [[:$1]] '''tidak bisa''' dihapus.",
+ 'nuke-delete-more' => '[[Special:Nuke|Hapus lagi]]',
+ 'nuke-pattern' => 'Pola untuk nama halaman:',
+ 'nuke-nopages-global' => 'Tidak ditemukan halaman baru dalam [[Special:RecentChanges|perubahan terbaru]].',
+ 'nuke-viewchanges' => 'lihat perubahan',
+ 'nuke-namespace' => 'Batasan dari ruang nama:',
);
/** Igbo (Igbo)
@@ -1194,12 +1267,12 @@ $messages['ilo'] = array(
'nuke' => 'Paga-adduan nga pinag-ikkat',
'action-nuke' => 'ikkaten dagiti panid',
'nuke-desc' => 'Ikkan na ti administrador ti abilidad nga [[Special:Nuke| paga-adduan nga pang-ikkat]] kadagit panid',
- 'nuke-nopages' => 'Awan dagiti baro nga panid [[Special:Contributions/$1|$1]] idiay kaudian nga balbaliw.', # Fuzzy
- 'nuke-list' => 'Dagita sumaganad nga panid ket kaararamid ni [[Special:Contributions/$1|$1]];
-ikkam ti komento ken ikklik ti buton tapno maikkat dan.', # Fuzzy
+ 'nuke-nopages' => 'Awan dagiti baro a panid babaen ni [[Special:Contributions/$1|{{GENDER:$1|$1}}]] idiay kaudian abalbaliw.',
+ 'nuke-list' => 'Dagiti sumaganad a panid ket kadamdamaan a pinartuat babaen ni [[Special:Contributions/$1|{{GENDER:$1|$1}}]];
+ikkam ti komentario ken pindutem ti buton tapno maikkatda.',
'nuke-list-multiple' => 'Dagiti sumaganad nga panid kaararamid;
ikkam ti komento ken ikklik ti buton tapno maikkat dan.',
- 'nuke-defaultreason' => 'Dagiti paga-adduan nga pinag-ikkat ti panid ket inikkan ni $1', # Fuzzy
+ 'nuke-defaultreason' => 'Adu a panagikkat kadagiti panid nga innayon babaen ni [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-multiplepeople' => 'Pagaaduan a panagikkat kadagiti kinaudi a nainayon a pampanid',
'nuke-tools' => 'Daytoy nga ramit ket mangpabalin ti paga-adduan ti pinag-ikkat ti panid nga kinaikkan ti maysa nga agaramat wenno maysa nga IP address.
Ikabil ti nagan ti agar-aramat wenno IP address tapno maalam dagiti listaan dagiti naikkat nga panid, wenno ibatim nga blanko kadagit amin nga agar-aramat.',
@@ -1209,7 +1282,7 @@ Ikabil ti nagan ti agar-aramat wenno IP address tapno maalam dagiti listaan dagi
'nuke-select' => 'Agpili: $1',
'nuke-userorip' => 'Nagan ti agar-aramat, IP address wenno blanko:',
'nuke-maxpages' => 'Ti manu nga bilang dagiti panid:',
- 'nuke-editby' => 'Inaramid ni [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Pinartuat babaen ni [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-deleted' => "Ti panid '''$1''' ket naikkaten.",
'nuke-not-deleted' => "Ti panid [[:$1]] '''saan nga''' maikkat.",
'nuke-delete-more' => '[[Special:Nuke|Agikkat ka pay kadagita nga panid]]',
@@ -1301,6 +1374,7 @@ Inserisci il nome utente o l'indirizzo IP per la lista delle pagine da cancellar
* @author Marine-Blue
* @author Muttley
* @author Ohgi
+ * @author Penn Station
* @author Schu
* @author Shirayuki
* @author é’å­å®ˆæ­Œ
@@ -1310,10 +1384,10 @@ $messages['ja'] = array(
'action-nuke' => 'ページã®ä¸€æ‹¬å‰Šé™¤',
'nuke-desc' => '{{int:group-sysop}}ãŒãƒšãƒ¼ã‚¸ã‚’[[Special:Nuke|一括削除]]ã§ãるよã†ã«ã™ã‚‹',
'nuke-nopages' => '最近ã®æ›´æ–°ã« [[Special:Contributions/$1|$1]] ãŒæ–°è¦ä½œæˆã—ãŸãƒšãƒ¼ã‚¸ã¯ã‚ã‚Šã¾ã›ã‚“。',
- 'nuke-list' => '[[Special:Contributions/$1|$1]] ã¯æœ€è¿‘ã€ä»¥ä¸‹ã®ãƒšãƒ¼ã‚¸ã‚’作æˆã—ã¾ã—ãŸã€‚
+ 'nuke-list' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] ã¯æœ€è¿‘ã€ä»¥ä¸‹ã®ãƒšãƒ¼ã‚¸ã‚’作æˆã—ã¾ã—ãŸã€‚
+ã“れらを削除ã™ã‚‹ã«ã¯ã€ç†ç”±ã‚’記入ã—ã¦ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ãã ã•ã„。',
+ 'nuke-list-multiple' => '以下ã®ãƒšãƒ¼ã‚¸ãŒæœ€è¿‘作æˆã•ã‚Œã¾ã—ãŸã€‚
ã“れらを削除ã™ã‚‹ã«ã¯ã€ç†ç”±ã‚’記入ã—ã¦ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ãã ã•ã„。',
- 'nuke-list-multiple' => '最近作æˆã•ã‚ŒãŸãƒšãƒ¼ã‚¸ãŒè¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚
-コメントを入力ã—ã€ãƒœã‚¿ãƒ³ã‚’押ã™ã¨ã€å‰Šé™¤ã•ã‚Œã¾ã™ã€‚',
'nuke-defaultreason' => '[[Special:Contributions/$1|$1]] ãŒè¿½åŠ ã—ãŸãƒšãƒ¼ã‚¸ã®ä¸€æ‹¬å‰Šé™¤',
'nuke-multiplepeople' => '最近追加ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã®ä¸€æ‹¬å‰Šé™¤',
'nuke-tools' => '指定ã—ãŸåˆ©ç”¨è€…ã¾ãŸã¯IPアドレスãŒæœ€è¿‘作æˆã—ãŸãƒšãƒ¼ã‚¸ã‚’ã€ã“ã®ãƒ„ールã§ä¸€æ‹¬å‰Šé™¤ã§ãã¾ã™ã€‚
@@ -1330,7 +1404,8 @@ $messages['ja'] = array(
'nuke-delete-more' => '[[Special:Nuke|ä»–ã®ãƒšãƒ¼ã‚¸ã‚‚削除]]',
'nuke-pattern' => 'ページåã®ãƒ‘ターン:',
'nuke-nopages-global' => '[[Special:RecentChanges|最近ã®æ›´æ–°]]ã«ã¯æ–°ã—ã„ページã¯ã‚ã‚Šã¾ã›ã‚“。',
- 'nuke-viewchanges' => '差分を表示',
+ 'nuke-viewchanges' => '履歴を表示',
+ 'nuke-namespace' => 'åå‰ç©ºé–“:',
);
/** Jutish (jysk)
@@ -1386,10 +1461,10 @@ $messages['ka'] = array(
'nuke' => 'მáƒáƒ¡áƒáƒ‘რივი წáƒáƒ¨áƒšáƒ',
'action-nuke' => 'გვერდების მáƒáƒ¡áƒ˜áƒ£áƒ áƒ˜ წáƒáƒ¨áƒšáƒ',
'nuke-desc' => 'áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ”ბს áƒáƒ«áƒšáƒ”ვს გვერდების [[Special:Nuke|მáƒáƒ¡áƒáƒ‘რივáƒáƒ“ წáƒáƒ¨áƒšáƒ˜áƒ¡]] სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡',
- 'nuke-nopages' => 'ბáƒáƒšáƒ ცვლილებებში áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒ®áƒáƒšáƒ˜ გვერდები [[Special:Contributions/$1|$1]]-ის მიერ.', # Fuzzy
- 'nuke-list' => 'ეს გვერდები შეიქმნრ[[Special:Contributions/$1|$1]]-ის მიერ;
-შეიყვáƒáƒœáƒ”თ კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜ დრდáƒáƒáƒ­áƒ˜áƒ áƒ”თ ღილáƒáƒ™áƒ¡ მáƒáƒ— წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“.', # Fuzzy
- 'nuke-defaultreason' => '$1-ის მიერ დáƒáƒ›áƒáƒ¢áƒ”ბული გვერდების მáƒáƒ¡áƒáƒ‘რივი წáƒáƒ¨áƒšáƒ', # Fuzzy
+ 'nuke-nopages' => 'ბáƒáƒšáƒ ცვლილებებში áƒáƒ  áƒáƒ áƒ˜áƒ¡ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელ [[Special:Contributions/$1|{{GENDER:$1|$1}}]]-ის მიერ შექმნილი áƒáƒ®áƒáƒšáƒ˜ გვერდები.',
+ 'nuke-list' => 'ეს გვერდები შეიქმნრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელ [[Special:Contributions/$1|{{GENDER:$1|$1}}]]-ის მიერ;
+შეიყვáƒáƒœáƒ”თ კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜ დრდáƒáƒáƒ­áƒ˜áƒ áƒ”თ ღილáƒáƒ™áƒ¡ მáƒáƒ— წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“.',
+ 'nuke-defaultreason' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელ [[Special:Contributions/$1|{{GENDER:$1|$1}}]]-ის მიერ დáƒáƒ›áƒáƒ¢áƒ”ბული გვერდების მáƒáƒ¡áƒáƒ‘რივი წáƒáƒ¨áƒšáƒ',
'nuke-tools' => 'ეს გვერდი გáƒáƒ«áƒšáƒ”ვთ ნებისმიერი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœ IP მისáƒáƒ›áƒáƒ áƒ—ის მიერ დáƒáƒ›áƒáƒ¢áƒ”ბული გვერდების ერთბáƒáƒ¨áƒáƒ“ წáƒáƒ¨áƒšáƒ˜áƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡.
შეიყვáƒáƒœáƒ”თ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი áƒáƒœ IP მისáƒáƒ›áƒáƒ áƒ—ი მის მიერ დáƒáƒ›áƒáƒ¢áƒ”ბული გვერდების სიის მისáƒáƒ¦áƒ”ბáƒáƒ“.',
'nuke-submit-user' => 'გáƒáƒ“áƒáƒ¡áƒ•áƒšáƒ',
@@ -1398,7 +1473,7 @@ $messages['ka'] = array(
'nuke-select' => 'áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ: $1',
'nuke-userorip' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი, IP-მისáƒáƒ›áƒáƒ áƒ—ი (შესáƒáƒ«áƒšáƒ”ბელირცáƒáƒ áƒ˜áƒ”ლის დáƒáƒ¢áƒáƒ•áƒ”ბáƒ):',
'nuke-maxpages' => 'გვერდების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ:',
- 'nuke-editby' => 'შექმნილირ[[Special:Contributions/$1|$1]]-ის მიერ', # Fuzzy
+ 'nuke-editby' => 'შექმნილირმáƒáƒ®áƒ›áƒáƒ áƒ”ბელ [[Special:Contributions/$1|{{GENDER:$1|$1}}]]-ის მიერ',
'nuke-deleted' => "გვერდი '''$1''' წáƒáƒ˜áƒ¨áƒáƒšáƒ.",
'nuke-not-deleted' => "გვერდი [[:$1]] წáƒáƒ¨áƒšáƒ '''შეუძლებელიáƒ'''.",
'nuke-delete-more' => '[[Special:Nuke|მრáƒáƒ•áƒáƒšáƒ áƒ˜áƒªáƒ®áƒáƒ•áƒáƒœáƒ˜ გვერდების წáƒáƒ¨áƒšáƒ]]',
@@ -1413,8 +1488,8 @@ $messages['ka'] = array(
$messages['km'] = array(
'nuke' => 'លុបចáŸáž‰â€‹áž‡áž¶ážáŸ’សែ',
'nuke-desc' => 'ផ្ážáž›áŸ‹áž›áž‘្ធភាព​ឱ្យ​អ្នកážáŸ‚ទាំប្រពáŸáž“្ធ [[Special:Nuke|លុបចáŸáž‰â€‹áž‡áž¶ážáŸ’សែ]] ទំពáŸážšáž“ានា',
- 'nuke-nopages' => 'គ្មាន​ទំពáŸážšâ€‹ážáŸ’មី [[Special:Contributions/$1|$1]] ក្នុង​បំលាស់ប្ážáž¼ážšâ€‹ážáŸ’មីៗ​។', # Fuzzy
- 'nuke-list' => 'ទំពáŸážšáž‘ាំងនáŸáŸ‡ ទើបážáŸ‚​ážáŸ’រូវ​បាន​បង្កើហដោយ [[Special:Contributions/$1|$1]]; សូម​ដាក់​ហáŸážáž»áž•áž› និង​ចុច​ប្រអប់​ដើម្បី​លុបចáŸáž‰â€‹áž–ួកវា​។', # Fuzzy
+ 'nuke-nopages' => 'គ្មាន​ទំពáŸážšâ€‹ážáŸ’មី [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ក្នុង​បំលាស់ប្ážáž¼ážšâ€‹ážáŸ’មីៗ​។',
+ 'nuke-list' => 'ទំពáŸážšáž‘ាំងនáŸáŸ‡ ទើបážáŸ‚​ážáŸ’រូវ​បាន​បង្កើážážŠáŸ„áž™ [[Special:Contributions/$1|{{GENDER:$1|$1}}]]; សូម​ដាក់​ហáŸážáž»áž•áž› និង​ចុច​ប្រអប់​ដើម្បី​លុបចáŸáž‰â€‹áž–ួកវា​។',
'nuke-defaultreason' => 'ការដកចáŸáž‰â€‹áž‡áž¶ážáŸ’សែ នៃ​ទំពáŸážšâ€‹áž”ានបន្ážáŸ‚ម​ដោយ $1', # Fuzzy
'nuke-tools' => 'ឧបករណáŸâ€‹áž“áŸáŸ‡ អនុញ្ញាážâ€‹áž›áž»áž”áž…áŸáž‰â€‹áž‡áž¶ážáŸ’សែ​នូវ​ទំពáŸážšâ€‹áž‘ើប​បាន​បន្ážáŸ‚ម​ážáŸ’មីៗ ដោយ​អ្នកប្រើប្រាស់​បាន​ចុះ​ឈ្មោះ ឬ ដោយ​អាសយដ្ឋាន IP ។ សូម​បញ្ចូល​អážáŸ’ážáž“ាមអ្នកប្រើប្រាស់ ឬ អាសយដ្ឋាន IP ដើម្បី​មាន​បញ្ជីទំពáŸážšâ€‹ážŸáž˜áŸ’រាប់​លុប​៖', # Fuzzy
'nuke-submit-user' => 'ទៅ',
@@ -1484,7 +1559,7 @@ $messages['krj'] = array(
$messages['ksh'] = array(
'nuke' => 'Sigge fottschmieße ang Mass',
'action-nuke' => 'pöngelswies Sigge fottschmiiße.',
- 'nuke-desc' => 'Määd_et müjjelesch för de Wiki-Köbesse, [[Special:Nuke|angmass Sigge fottzeschmieße]].',
+ 'nuke-desc' => 'Määd_et möjjelesch för de Wiki-Köbesse, [[Special:Nuke|angmass Sigge fottzeschmieße]].',
'nuke-nopages' => 'Mer han kein neu Sigge {{GENDER:$1|vum|vum|vum Metmaacher|vun dä|vum}} [[Special:Contributions/$1|$1]] en de {{lcfirst:{{int:Recentchanges}}}}.', # Fuzzy
'nuke-list' => 'Hee di Sigge sen fum „[[Special:Contributions/$1|$1]]“ neu
aanjelaat woode. Jiff enne Jrond för et Fottschmieße aan,
@@ -1531,21 +1606,21 @@ $messages['lb'] = array(
'nuke' => 'Masse-Läschung',
'action-nuke' => "Säiten 'en masse' ze läschen",
'nuke-desc' => "Gëtt Administrateuren d'Méiglechkeet fir [[Special:Nuke|vill Säite mateneen ze läschen]]",
- 'nuke-nopages' => 'Et gëtt bei de läschten Ännerunge keng nei Säite vum [[Special:Contributions/$1|$1]].', # Fuzzy
- 'nuke-list' => 'Dës Säite goufe viru kuerzem vum [[Special:Contributions/$1|$1]] nei ugeluecht; gitt w.e.g. eng Bemierkung an, an dréckt op de Knäppche Läschen.', # Fuzzy
+ 'nuke-nopages' => 'Et gëtt bei de rezenten Ännerunge keng nei Säite vum [[Special:Contributions/$1|{{GENDER:$1|$1}}]].',
+ 'nuke-list' => 'Dës Säite goufe viru kuerzem vum [[Special:Contributions/$1|{{GENDER:$1|$1}}]] nei ugeluecht; gitt w.e.g. eng Bemierkung an, an dréckt op de Knäppche Läschen.',
'nuke-list-multiple' => 'Dës Säite goufe rezent gemaach;
setzt eng Bemierkung derbäi a klickt op de Knäppche fir se ze läschen.',
- 'nuke-defaultreason' => 'Masse-Läschung vu Säiten, déi vum $1 ugefaang goufen', # Fuzzy
+ 'nuke-defaultreason' => 'Masse-Läschung vu Säiten, déi vum [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ugefaang goufen',
'nuke-multiplepeople' => 'Masse-Läschung vu Säiten déi rezent derbäi gesat goufen',
- 'nuke-tools' => "Dësen Tool erlaabt vill Säite mateneen ze läschen, déi vun engem Benotzer oder vun enger IP-Adresse ugeluecht goufen.
-Gitt w.e.g. d'IP-Adress respektiv de Benotzer n fir eng Lescht vun de Säiten ze kréien déi geläscht solle ginn, oder loosst et eidel fir all Benotzer.",
+ 'nuke-tools' => "Dësen Tool erlaabt vill Säite mateneen ze läschen, déi vun engem Benotzer oder vun enger IP-Adress ugeluecht goufen.
+Gitt w.e.g. d'IP-Adress respektiv de Benotzer u fir eng Lëscht vun de Säiten ze kréien déi geläscht solle ginn, oder loosst et eidel fir all Benotzer.",
'nuke-submit-user' => 'Lass',
'nuke-submit-delete' => 'Ugewielt läschen',
'right-nuke' => 'Vill Säite matenee läschen',
'nuke-select' => 'Eraussichen:$1',
'nuke-userorip' => 'Benotzernumm, IP-Adress oder eidel:',
'nuke-maxpages' => 'Maximal Zuel vu Säiten:',
- 'nuke-editby' => 'Gemaach vum [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Gemaach vum [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-deleted' => "D'Säit '''$1''' gouf geläscht.",
'nuke-not-deleted' => "D'Säit [[:$1]] '''konnt net''' geläscht ginn.",
'nuke-delete-more' => '[[Special:Nuke|Méi Säite läschen]]',
@@ -1597,6 +1672,13 @@ $messages['lt'] = array(
'nuke-not-deleted' => "Puslapis [[:$1]] '''negalimas''' ištrinti.",
);
+/** Latvian (latviešu)
+ * @author Papuass
+ */
+$messages['lv'] = array(
+ 'nuke-viewchanges' => 'skatīt izmaiņas',
+);
+
/** Literary Chinese (文言)
*/
$messages['lzh'] = array(
@@ -1617,6 +1699,28 @@ $messages['mg'] = array(
'right-nuke' => 'Mamafa pejy maro',
);
+/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ */
+$messages['min'] = array(
+ 'nuke' => 'Pangapuihan masal',
+ 'nuke-list-multiple' => 'Laman ko baru sajo dibuek;
+agiah komentar dan takan tombol untuak mangapuih.',
+ 'nuke-defaultreason' => 'Pangapuihan masal laman-laman nan dibuek dek [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+ 'nuke-tools' => 'Pakakeh ko mamungkinkan pangapuihan masal laman-laman nan baru sajo dibuek jo sorang pangguno atau alamaik IP.
+Masuakan namo pangguno atau alamaik IP untuak mandapek daftar laman nan dapek dihapuih atau kosongkan untuak kasado pangguno.',
+ 'nuke-submit-user' => 'Jalankan',
+ 'right-nuke' => 'Mangapuih laman sacaro masal',
+ 'nuke-userorip' => 'Namo pangguno, alamaik IP, atau kosong:',
+ 'nuke-maxpages' => 'Jumlah maksimum laman:',
+ 'nuke-editby' => 'Dibuek dek [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+ 'nuke-deleted' => "Laman '''$1''' alah dihapuih.",
+ 'nuke-not-deleted' => "Laman [[:$1]] '''indak dapek''' dihapuih.",
+ 'nuke-pattern' => 'Pola untuak namo laman:',
+ 'nuke-viewchanges' => 'caliak parubahan',
+ 'nuke-namespace' => 'Bateh dari ruangnamo:',
+);
+
/** Macedonian (македонÑки)
* @author Bjankuloski06
*/
@@ -1657,12 +1761,12 @@ $messages['ml'] = array(
'nuke' => 'കൂടàµà´Ÿ മായàµà´•àµà´•àµ½',
'action-nuke' => 'താളàµà´•àµ¾ കൂടàµà´Ÿà´®à´¾à´¯à´¿ മായàµà´•àµà´•àµà´•',
'nuke-desc' => 'സിസോപàµà´ªàµà´•àµ¾à´•àµà´•àµ താളàµà´•àµ¾ [[Special:Nuke|കൂടàµà´Ÿà´®à´¾à´¯à´¿ മായàµà´•àµà´•à´¾à´¨àµà´³àµà´³]] അവകാശം നൽകàµà´•',
- 'nuke-nopages' => '[[Special:Contributions/$1|$1]] ഉണàµà´Ÿà´¾à´•àµà´•à´¿à´¯ à´ªàµà´¤à´¿à´¯ താളàµà´•à´³àµŠà´¨àµà´¨àµà´‚ à´ªàµà´¤à´¿à´¯ മാറàµà´±à´™àµà´™à´³à´¿à´²à´¿à´²àµà´².', # Fuzzy
- 'nuke-list' => 'താഴെ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•àµ¾ [[Special:Contributions/$1|$1]] സമീപ കാലതàµà´¤àµ സൃഷàµà´Ÿà´¿à´šàµà´šà´µ ആണàµâ€Œ;
-ഇവ മായàµà´•àµà´•àµà´µà´¾àµ» à´…à´­à´¿à´ªàµà´°à´¾à´¯à´‚ രേഖപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¤à´¿à´¨àµ ശേഷം ബടàµà´Ÿàµº അമർതàµà´¤àµà´•.', # Fuzzy
+ 'nuke-nopages' => 'സമീപകാലമാറàµà´±à´™àµà´™à´³à´¿àµ½ [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ഉണàµà´Ÿà´¾à´•àµà´•à´¿à´¯ à´ªàµà´¤à´¿à´¯ താളàµà´•à´³àµŠà´¨àµà´¨àµà´‚ ഇലàµà´².',
+ 'nuke-list' => 'താഴെ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•àµ¾ [[Special:Contributions/$1|{{GENDER:$1|$1}}]] സമീപകാലതàµà´¤àµ സൃഷàµà´Ÿà´¿à´šàµà´šà´µ ആണàµâ€Œ;
+ഇവ മായàµà´•àµà´•àµà´µà´¾àµ» à´…à´­à´¿à´ªàµà´°à´¾à´¯à´‚ രേഖപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¤à´¿à´¨àµ ശേഷം ബടàµà´Ÿàµº അമർതàµà´¤àµà´•.',
'nuke-list-multiple' => 'താഴെകàµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•àµ¾ à´…à´Ÿàµà´¤àµà´¤à´¿à´Ÿàµ† സൃഷàµà´Ÿà´¿à´šàµà´šà´¤à´¾à´£àµ;
à´…à´­à´¿à´ªàµà´°à´¾à´¯à´®à´¾à´•àµà´•à´¿à´¯à´¿à´Ÿàµà´Ÿàµ à´…à´µ മായàµà´•àµà´•à´¾à´¨à´¾à´¯à´¿ ബടàµà´Ÿàµº ഞെകàµà´•àµà´•.',
- 'nuke-defaultreason' => '$1 ചേർതàµà´¤ താളàµà´•àµ¾ മൊതàµà´¤à´®à´¾à´¯à´¿ മായàµà´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµà´³àµà´³ സം‌വിധാനം', # Fuzzy
+ 'nuke-defaultreason' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] ചേർതàµà´¤ താളàµà´•àµ¾ മൊതàµà´¤à´®à´¾à´¯à´¿ മായàµà´•àµà´•àµà´¨àµà´¨à´¤à´¿à´¨àµà´³àµà´³ സം‌വിധാനം',
'nuke-multiplepeople' => 'സമീപകാലതàµà´¤àµ ചേർതàµà´¤ താളàµà´•à´³àµà´Ÿàµ† കൂടàµà´Ÿ മായàµà´•àµà´•àµ½',
'nuke-tools' => 'à´à´¤àµ†à´™àµà´•à´¿à´²àµà´‚ ഒരൠഉപയോകàµà´¤à´¾à´µàµ à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ à´.പി. സമീപകാലതàµà´¤àµ സൃഷàµà´Ÿà´¿à´šàµà´š താളàµà´•àµ¾ കൂടàµà´Ÿà´®à´¾à´¯à´¿ മായàµà´•àµà´•à´¾à´¨àµà´³àµà´³ സൗകരàµà´¯à´‚ à´ˆ സം‌വിധാനം നൽകàµà´¨àµà´¨àµ. ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ à´.പി. ഇവിടെ നൽകിയാൽ മായàµà´•àµà´•àµ‡à´£àµà´Ÿ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• ലഭàµà´¯à´®à´¾à´•àµà´¨àµà´¨à´¤à´¾à´£àµ, à´Žà´²àµà´²à´¾ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´‚ സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³ താൾ മായàµà´•àµà´•à´¾àµ» ശൂനàµà´¯à´®à´¾à´¯à´¿à´Ÿàµà´•.',
'nuke-submit-user' => 'പോകൂ',
@@ -1671,7 +1775,7 @@ $messages['ml'] = array(
'nuke-select' => 'തിരഞàµà´žàµ†à´Ÿàµà´•àµà´•àµà´•: $1',
'nuke-userorip' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚, à´.പി. വിലാസം à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ ശൂനàµà´¯à´®à´¾à´¯à´¿à´Ÿàµà´•:',
'nuke-maxpages' => 'പരമാവധി à´Žà´¤àµà´° താളàµà´•àµ¾:',
- 'nuke-editby' => 'നിർമàµà´®à´¿à´šàµà´šà´¤àµ [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] സൃഷàµà´Ÿà´¿à´šàµà´šà´µ',
'nuke-deleted' => "'''$1''' à´Žà´¨àµà´¨ താൾ മായàµà´šàµà´šàµ à´•à´´à´¿à´žàµà´žàµ.",
'nuke-not-deleted' => "[[:$1]] à´Žà´¨àµà´¨ താൾ മായàµà´•àµà´•à´¾àµ» '''കഴിയിലàµà´²'''.",
'nuke-delete-more' => '[[Special:Nuke|കൂടàµà´¤àµ½ താളàµà´•àµ¾ മായàµà´•àµà´•àµà´•]]',
@@ -1732,11 +1836,14 @@ Isikan nama pengguna atau alamat IP untuk mendapat senarai laman yang hendak dik
*/
$messages['mt'] = array(
'nuke' => 'Tħassir tal-massa',
+ 'action-nuke' => 'tħassar paġni bil-massa',
'nuke-desc' => "Jagħti lill-amministraturi l-għodda li [[Special:Nuke|jħassru bil-massa]] numru ta' paġni.",
- 'nuke-nopages' => 'Ma nstabu l-ebda paġni ġodda maħluqa minn [[Special:Contributions/$1|$1]] fost it-tibdil riċenti.', # Fuzzy
- 'nuke-list' => 'Il-paġni segwenti ġew riċentament maħluqa minn [[Special:Contributions/$1|$1]];
-daħħal kumment u agħfas il-buttuna sabiex tħassarhom.', # Fuzzy
- 'nuke-defaultreason' => "Tħassir ta' massa ta' paġni miżjuda minn $1", # Fuzzy
+ 'nuke-nopages' => 'Ma nstabu l-ebda paġni ġodda maħluqa minn [[Special:Contributions/$1|{{GENDER:$1|$1}}]] fost it-tibdil riċenti.',
+ 'nuke-list' => 'Il-paġni segwenti ġew riċentament maħluqa minn [[Special:Contributions/$1|{{GENDER:$1|$1}}]];
+daħħal kumment u agħfas il-buttuna sabiex tħassarhom.',
+ 'nuke-list-multiple' => 'Il-paġni segwenti ġew maħluqa riċentament;
+daħħal kumment u agħfas il-buttuna sabiex tħassarhom.',
+ 'nuke-defaultreason' => "Tħassir tal-massa ta' paġni miżjuda minn [[Special:Contributions/$1|{{GENDER:$1|$1}}]]",
'nuke-multiplepeople' => "Tħassir tal-massa ta' paġni miżjuda riċenta",
'nuke-tools' => "Din l-għodda tippermetti t-tħassir ta' massa ta' paġni li ġew miżjuda riċentament minn utent partikulari jew IP.
Daħħal l-isem tal-utent jew l-indirizz IP biex tikseb lista ta' paġni li jridu jitħassru, jew ħalliha votja sabiex issejjaħ l-utenti kollha.",
@@ -1746,6 +1853,14 @@ Daħħal l-isem tal-utent jew l-indirizz IP biex tikseb lista ta' paġni li jrid
'nuke-select' => 'Agħżel: $1',
'nuke-userorip' => 'Isem tal-utent, indirizz IP jew vojt:',
'nuke-maxpages' => "Numru massimu ta' paġni:",
+ 'nuke-editby' => 'Maħluqa minn [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+ 'nuke-deleted' => "Il-paġna '''$1''' ġiet imħassra.",
+ 'nuke-not-deleted' => "Il-paġna [[:$1]] '''ma setgħetx''' tiġi mħassra.",
+ 'nuke-delete-more' => '[[Special:Nuke|Ħassar aktar paġni]]',
+ 'nuke-pattern' => 'Mudell għat-titlu tal-paġna:',
+ 'nuke-nopages-global' => "M'hemm l-ebda paġna ġdida fit-[[Special:RecentChanges|tibdil riċenti]].",
+ 'nuke-viewchanges' => 'uri t-tibdiliet',
+ 'nuke-namespace' => 'Illimita skont l-ispazju tal-isem:',
);
/** Erzya (ÑрзÑнь)
@@ -1808,7 +1923,7 @@ $messages['nds'] = array(
'right-nuke' => 'Groten Hümpel Sieden wegsmieten',
);
-/** Nedersaksisch (Nedersaksisch)
+/** Nedersaksies (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
@@ -1877,20 +1992,20 @@ Voer de gebruikersnaam of het IP-adres in voor een lijst van te verwijderen pagi
'nuke-namespace' => 'Beperk tot naamruimte:',
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
* @author Harald Khan
* @author Njardarlogar
*/
$messages['nn'] = array(
'nuke' => 'Massesletting',
'action-nuke' => 'massesletta sider',
- 'nuke-desc' => 'Gjev administratorane moglegheita til å [[Special:Nuke|massesletta]] sider',
- 'nuke-nopages' => 'Ingen nye sider av [[Special:Contributions/$1|$1]] i siste endringane.', # Fuzzy
- 'nuke-list' => 'Dei fylgjande sidene vart nyleg oppretta av [[Special:Contributions/$1|$1]];
-skriv inn ei sletteårsak og trykk på knappen for å sletta dei.', # Fuzzy
- 'nuke-list-multiple' => 'Dei fylgjande sidene vart nyleg oppretta;
-skriv ein kommentar og trykk på knappen for å sletta dei.',
- 'nuke-defaultreason' => 'Massesletting av sider lagde inn av $1', # Fuzzy
+ 'nuke-desc' => 'Gjev administratorane evna til å [[Special:Nuke|massesletta]] sider',
+ 'nuke-nopages' => 'Ingen nye sider av [[Special:Contributions/$1|{{GENDER:$1|$1}}]] i siste endringane.',
+ 'nuke-list' => 'Desse sidene vart nyleg oppretta av [[Special:Contributions/$1|{{GENDER:$1|$1}}]];
+skriv inn ei sletteårsak og trykk på knappen for å sletta dei.',
+ 'nuke-list-multiple' => 'Desse sidene vart nyleg oppretta;
+skriv inn ein kommentar og trykk på knappen for å sletta dei.',
+ 'nuke-defaultreason' => 'Massesletting av sider lagde inn av [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-multiplepeople' => 'Massesletting av nyleg oppretta sider',
'nuke-tools' => 'Dette verktøyet mogeleggjer massesletting av sider som nyleg er lagde inn av ein viss brukar eller ei viss IP-adresse.
Skriv inn eit brukarnamn eller ei IP-adresse for å få ei liste over sider som kan verta sletta, eller lat feltet stå tomt for alle brukarar.',
@@ -1900,13 +2015,14 @@ Skriv inn eit brukarnamn eller ei IP-adresse for å få ei liste over sider som
'nuke-select' => 'Vel: $1',
'nuke-userorip' => 'Brukarnamn, IP-adresse eller tomt:',
'nuke-maxpages' => 'Høgste talet på sider:',
- 'nuke-editby' => 'Oppretta av [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Oppretta av [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-deleted' => "Sida '''$1''' vart sletta.",
'nuke-not-deleted' => "Sida [[:$1]] ''kunne ikkje''' verta sletta.",
'nuke-delete-more' => '[[Special:Nuke|Slett fleire sider]]',
'nuke-pattern' => 'Mønster for sidenamnet:',
'nuke-nopages-global' => 'Det er ingen nye sider i [[Special:RecentChanges|siste endringane]].',
'nuke-viewchanges' => 'vis endringar',
+ 'nuke-namespace' => 'Avgrens til namnerom:',
);
/** Northern Sotho (Sesotho sa Leboa)
@@ -1970,19 +2086,22 @@ $messages['pdc'] = array(
* @author BeginaFelicysym
* @author Derbeth
* @author Leinad
+ * @author Matma Rex
* @author Nux
* @author Olgak85
+ * @author Rezonansowy
* @author Sp5uhe
+ * @author Woytecr
*/
$messages['pl'] = array(
'nuke' => 'Masowe usuwanie',
'action-nuke' => 'masowego usuwania stron',
'nuke-desc' => 'Dodaje administratorom funkcję równoczesnego [[Special:Nuke|usuwania dużej liczby stron]]',
- 'nuke-nopages' => 'Brak nowych stron autorstwa [[Special:Contributions/$1|$1]] w ostatnich zmianach.', # Fuzzy
- 'nuke-list' => 'Następujące strony zostały ostatnio utworzone przez [[Special:Contributions/$1|$1]]; wpisz komentarz i wciśnij przycisk by usunąć je.', # Fuzzy
+ 'nuke-nopages' => 'Brak nowych stron autorstwa [[Special:Contributions/$1|$1]] w ostatnich zmianach.',
+ 'nuke-list' => 'Następujące strony zostały ostatnio utworzone przez {{GENDER:$1|użytkownika|użytkowniczkę}} [[Special:Contributions/$1|$1]]; wpisz komentarz i wciśnij przycisk, by je usunąć.',
'nuke-list-multiple' => 'Poniższa lista przedstawia ostatnio dodane strony.
Wpisz powód, a następnie zatwierdź usunięcie stron.',
- 'nuke-defaultreason' => 'Masowe usunięcie stron dodanych przez $1', # Fuzzy
+ 'nuke-defaultreason' => 'Masowe usunięcie stron stworzonych przez [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-multiplepeople' => 'Masowe usuwanie ostatnio utworzonych stron',
'nuke-tools' => 'Narzędzie pozwala na masowe usuwanie stron ostatnio dodanych przez zarejestrowanego lub anonimowego użytkownika.
Wpisz nazwę użytkownika lub adres IP by otrzymać listę stron do usunięcia. Możesz także nic nie wpisywać, wtedy będzie można masowo usunąć wkład wszystkich użytkowników.',
@@ -1992,13 +2111,14 @@ Wpisz nazwę użytkownika lub adres IP by otrzymać listę stron do usunięcia.
'nuke-select' => 'Wybierz: $1',
'nuke-userorip' => 'Podaj nazwę użytkownika, adres IP lub pozostaw puste pole',
'nuke-maxpages' => 'Maksymalna liczba stron',
- 'nuke-editby' => 'Utworzona przez [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Utworzona przez {{GENDER:$1|użytkownika|użytkowniczkę}} [[Special:Contributions/$1|$1]]',
'nuke-deleted' => "Strona '''$1''' została usunięta.",
'nuke-not-deleted' => "Strony [[:$1]] '''nie można''' usunąć.",
'nuke-delete-more' => '[[Special:Nuke|Usuń więcej stron]]',
'nuke-pattern' => 'Wzór nazwy strony:',
'nuke-nopages-global' => 'Brak nowych stron w [[Special:RecentChanges|ostatnich zmianach]].',
'nuke-viewchanges' => 'widok zmian',
+ 'nuke-namespace' => 'Tylko w przestrzeni nazw:',
);
/** Piedmontese (Piemontèis)
@@ -2010,11 +2130,11 @@ $messages['pms'] = array(
'nuke' => "Scancelament d'amblé",
'action-nuke' => 'scancelé dle pàgine a baron',
'nuke-desc' => "A dà a j'aministrador l'abilitassion a [[Special:Nuke|scanselé a baron]] le pàgine",
- 'nuke-nopages' => "Gnun-a pàgine faite da [[Special:Contributions/$1|$1]] ant j'ùltim cambiament.", # Fuzzy
- 'nuke-list' => "Ste pàgine-sì a son staite faite ant j'ùltim temp da [[Special:Contributions/$1|$1]]; ch'a lassa un coment e ch'a-i daga 'n colp ansima al boton për gaveje via tute d'amblé.", # Fuzzy
+ 'nuke-nopages' => "Gnun-e pàgine neuve da [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ant j'ùltime modìfiche.",
+ 'nuke-list' => "Coste pàgine-sì a son ëstàite faite ant j'ùltim temp da [[Special:Contributions/$1|{{GENDER:$1|$1}}]]; ch'a lassa un coment e ch'a-j daga 'n colp ansima al boton për gaveje via tute d'amblé.",
'nuke-list-multiple' => "Le pàgine sì-dapress a son stàite creà da pòch;
ch'a buta un coment e ch'a sgnaca ël boton për scanceleje.",
- 'nuke-defaultreason' => "Scancelament d'amblé dle pàgine faite da $1", # Fuzzy
+ 'nuke-defaultreason' => "Scancelament d'amblé dle pàgine giontà da [[Special:Contributions/$1|{{GENDER:$1|$1}}]]",
'nuke-multiplepeople' => 'Scancelassion a baron ëd pàgine giontà da pòch',
'nuke-tools' => "St'utiss-sì a lassa scancelé d'amblé le pàgine giontà ant j'ùltim temp da un chèich utent ò da 'nt na chèicha adrëssa IP. Ch'a buta lë stranòm ò l'adrëssa IP për tiré giù na lista dle pàgine da scancelé, o ch'a lassa an bianch për tùit j'utent.",
'nuke-submit-user' => 'Va',
@@ -2023,13 +2143,14 @@ ch'a buta un coment e ch'a sgnaca ël boton për scanceleje.",
'nuke-select' => 'Selessioné: $1',
'nuke-userorip' => 'Nòm utent, adrëssa IP o gnente:',
'nuke-maxpages' => 'Màssim nùmer ëd pàgine:',
- 'nuke-editby' => 'Creà da [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Creà da [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-deleted' => "La pàgina '''$1''' a l'é stàita scancelà.",
'nuke-not-deleted' => "La pàgina [[:$1]] '''a peul pa''' esse scancelà.",
'nuke-delete-more' => "[[Special:Nuke|Scancelé pì 'd pàgine]]",
'nuke-pattern' => 'Model për ël nòm ëd pàgina:',
'nuke-nopages-global' => "A-i é pa 'd pàgine neuve an [[Special:RecentChanges|ùltime modìfiche]].",
'nuke-viewchanges' => 'vëdde le modìfiche',
+ 'nuke-namespace' => 'Lìmita a lë spassi nominal:',
);
/** Pashto (پښتو)
@@ -2053,6 +2174,7 @@ $messages['ps'] = array(
/** Portuguese (português)
* @author Hamilton Abreu
+ * @author Luckas
* @author Malafaya
* @author 555
*/
@@ -2069,7 +2191,7 @@ introduza um comentário e clique o botão para eliminá-las.',
'nuke-submit-user' => 'Ir',
'nuke-submit-delete' => 'Eliminar as seleccionadas',
'right-nuke' => 'Eliminar páginas em massa',
- 'nuke-select' => 'Seleccionar: $1',
+ 'nuke-select' => 'Selecionar: $1',
'nuke-userorip' => 'Utilizador, endereço IP, ou vazio:',
'nuke-maxpages' => 'Nº máximo de páginas:',
'nuke-editby' => 'Criada por [[Special:Contributions/$1|$1]]', # Fuzzy
@@ -2112,12 +2234,13 @@ Insira um nome de usuário ou IP para listar páginas a eliminar; deixe em branc
*/
$messages['qu'] = array(
'nuke' => 'Tawqa qulluy',
+ 'action-nuke' => "p'anqakunata k'asuyachiy",
'nuke-desc' => "Kamachiqkunata [[Special:Nuke|p'anqa tawqa qulluywan]] atichin",
- 'nuke-nopages' => "Manam kanchu [[Special:Contributions/$1|$1]]-pa musuqta kamarisqan p'anqakuna ñaqha hukchasqakunapi.", # Fuzzy
- 'nuke-list' => "Kay qatiq p'anqakunataqa [[Special:Contributions/$1|$1]] ruraqmi kamarirqun; imarayku nispa butunta ñit'iy tawqalla qullunapaq.", # Fuzzy
+ 'nuke-nopages' => "Manam kanchu [[Special:Contributions/$1|$1]]-pa musuqta kamarisqan p'anqakuna ñaqha hukchasqakunapi.",
+ 'nuke-list' => "Kay qatiq p'anqakunataqa [[Special:Contributions/$1|{{GENDER:$1|$1}}]] sutiyuq ruraqmi ñaqha kamarirqan; imarayku nispa butunta ñit'iy tawqalla qullunapaq.",
'nuke-list-multiple' => "Kay qatiq p'anqakunaqa ñaqha kamarisqam;
imatapas willapuspa butunta ñit'ipay qullunapaq.",
- 'nuke-defaultreason' => "$1-pa rurasqan p'anqakunata tawqalla qulluy", # Fuzzy
+ 'nuke-defaultreason' => "[[Special:Contributions/$1|{{GENDER:$1|$1}}]] sutiyuqpa yapasqan p'anqakunata tawqalla qulluy",
'nuke-multiplepeople' => "Ñaqha yapasqa p'anqakunata tawqa qulluy",
'nuke-tools' => "Kay llamk'anawanqa huk ruraqpa icha huk IP huchhap ñaqha kamarisqan p'anqakunata tawqalla qulluytam atinki.
Ruraqpa sutinta icha IP huchhanta yaykuchiy qulluna p'anqakunata rikunaykipaq.",
@@ -2127,7 +2250,14 @@ Ruraqpa sutinta icha IP huchhanta yaykuchiy qulluna p'anqakunata rikunaykipaq.",
'nuke-select' => 'Akllay: $1',
'nuke-userorip' => "Ruraqpa sutin, IP huchha icha ch'usaq:",
'nuke-maxpages' => "Kay chhika p'anqakunamanta ama aswan kachunchu:",
- 'nuke-editby' => '[[Special:Contributions/$1|$1]] sutiyuqpa kamarisqan', # Fuzzy
+ 'nuke-editby' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] sutiyuqpa kamarisqan',
+ 'nuke-deleted' => "'''$1''' sutiyuq p'anqaqa qullusqañam.",
+ 'nuke-not-deleted' => "[[:$1]] sutiyuq p'anqataqa qulluyta '''manam atinichu'''.",
+ 'nuke-delete-more' => "[[Special:Nuke|Aswan p'anqakunata qulluy]]",
+ 'nuke-pattern' => "P'anqa sutip qatinallan",
+ 'nuke-nopages-global' => "[[Special:RecentChanges|Ñaqha hukchasqakunapiqa]] manam musuq p'anqakuna kanchu.",
+ 'nuke-viewchanges' => 'hukchasqakunata qhaway',
+ 'nuke-namespace' => 'Kay sutisuyullapi:',
);
/** Tarifit (Tarifit)
@@ -2168,6 +2298,7 @@ Introduceți numele utilizatorului sau adresa IP pentru a obține o listă a pag
'nuke-deleted' => "Pagina '''$1''' a fost ștearsă.",
'nuke-not-deleted' => "Pagina [[:$1]] '''nu a putut''' fi ștearsă.",
'nuke-pattern' => 'Model pentru numele paginii:',
+ 'nuke-viewchanges' => 'vizualizează modificările',
);
/** tarandíne (tarandíne)
@@ -2175,13 +2306,14 @@ Introduceți numele utilizatorului sau adresa IP pentru a obține o listă a pag
*/
$messages['roa-tara'] = array(
'nuke' => 'Scangellazione de masse',
+ 'action-nuke' => 'pàggene da accidere',
'nuke-desc' => "Dà a l'amministrature l'abbilità de [[Special:Nuke|scangellà massivamende]] le pàggene",
- 'nuke-nopages' => "Nisciuna pàgena nove da [[Special:Contributions/$1|$1]] jndr'à l'urteme cangiaminde.", # Fuzzy
- 'nuke-list' => "Le pàggene seguende onne state ccrejate recendemende da [[Special:Contributions/$1|$1]];
-mitte 'nu commende e cazze sus a 'u buttone pe scangellarle.", # Fuzzy
+ 'nuke-nopages' => "Nisciuna pàgena nove da [[Special:Contributions/$1|{{GENDER:$1|$1}}]] jndr'à l'urteme cangiaminde.",
+ 'nuke-list' => "Le pàggene seguende onne state ccrejate recendemende da [[Special:Contributions/$1|{{GENDER:$1|$1}}]];
+mitte 'nu commende e cazze sus a 'u buttone pe scangellarle.",
'nuke-list-multiple' => "Le pàggene seguende onne state ccrejate recendemende;
mitte 'nu commende e cazze 'u buttone pe scangellarle.",
- 'nuke-defaultreason' => 'Scangellazzione de masse de le pàggene aggiunde da $1', # Fuzzy
+ 'nuke-defaultreason' => 'Scangellazzione de masse de le pàggene aggiunde da [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-multiplepeople' => 'Scangellazione massive de le pàggene aggiunde de recende',
'nuke-tools' => "Stu strumende permette le scangellazziune de masse de le pàggene aggiunde de recende da 'nu certe utende o IP.<br />
Mitte 'u nome de l'utende o l'indirizze IP pe avè 'n'elenghe de le pàggene de scangellà, o lasse vianghe pe tutte l'utinde.",
@@ -2191,11 +2323,14 @@ Mitte 'u nome de l'utende o l'indirizze IP pe avè 'n'elenghe de le pàggene de
'nuke-select' => 'Scacchie: $1',
'nuke-userorip' => "Nome de l'utende, indirizze IP o vianghe:",
'nuke-maxpages' => 'Numere massime de pàggene:',
- 'nuke-editby' => 'Ccrejate da [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Ccrejate da [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
'nuke-deleted' => "Pàgene '''$1''' ha state scangellate.",
'nuke-not-deleted' => "Pàgene [[:$1]] '''non ge pò''' essere scangellate.",
+ 'nuke-delete-more' => '[[Special:Nuke|Scangille cchiù pàggene]]',
'nuke-pattern' => "Segnaposte pu nomed'a pàgene:",
+ 'nuke-nopages-global' => "Non ge stonne pàggene nove jndr'à le [[Special:RecentChanges|cangiaminde recende]].",
'nuke-viewchanges' => 'vide le cangiaminde',
+ 'nuke-namespace' => 'Limite a namespace:',
);
/** Russian (руÑÑкий)
@@ -2203,6 +2338,7 @@ Mitte 'u nome de l'utende o l'indirizze IP pe avè 'n'elenghe de le pàggene de
* @author Eugrus
* @author HalanTul
* @author KPu3uC B Poccuu
+ * @author Kaganer
* @author VasilievVV
* @author ÐлекÑандр Сигачёв
*/
@@ -2210,11 +2346,11 @@ $messages['ru'] = array(
'nuke' => 'МножеÑтвенное удаление',
'action-nuke' => 'маÑÑовое удаление Ñтраниц',
'nuke-desc' => 'Даёт админиÑтраторам возможноÑÑ‚ÑŒ [[Special:Nuke|множеÑтвенного удалениÑ]] Ñтраниц',
- 'nuke-nopages' => 'Созданий Ñтраниц учаÑтником [[Special:Contributions/$1|$1]] не найдено в Ñвежих правках.', # Fuzzy
- 'nuke-list' => 'Следующие Ñтраницы были недавно Ñозданы учаÑтником [[Special:Contributions/$1|$1]]. Введите комментарий и нажмите на кнопку Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы удалить их.', # Fuzzy
+ 'nuke-nopages' => 'Ð’ Ñвежих правках не найдено вновь Ñозданных {{GENDER:$1|учаÑтником|учаÑтницей}} [[Special:Contributions/$1|$1]] Ñтраниц.',
+ 'nuke-list' => '{{GENDER:$1|УчаÑтником|УчаÑтницей}} [[Special:Contributions/$1|$1]] недавно были Ñозданы Ñледующие Ñтраницы. Чтобы удалить их, введите комментарий и нажмите на кнопку.',
'nuke-list-multiple' => 'Следующие Ñтраницы были недавно Ñозданы.
ОÑтавьте примечание и нажмите кнопку, чтобы удалить их.',
- 'nuke-defaultreason' => 'МножеÑтвенное удаление Ñтраниц, Ñозданных учаÑтником $1', # Fuzzy
+ 'nuke-defaultreason' => 'МножеÑтвенное удаление Ñозданных {{GENDER:$1|учаÑтником|учаÑтницей}} [[Special:Contributions/$1|$1]] Ñтраниц.',
'nuke-multiplepeople' => 'МаÑÑовое удаление недавно добавленных Ñтраниц',
'nuke-tools' => 'Эта Ñтраница позволÑет множеÑтвенно удалÑÑ‚ÑŒ Ñтраницы, недавно Ñозданные определённым учаÑтником или Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ IP-адреÑа.
Введите Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника или IP-адреÑ, чтобы получить ÑпиÑок Ñтраниц Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ, или оÑтавьте поле пуÑтым, еÑли хотите выбрать вÑех учаÑтников.',
@@ -2224,13 +2360,14 @@ $messages['ru'] = array(
'nuke-select' => 'Выбор: $1',
'nuke-userorip' => 'Ð˜Ð¼Ñ ÑƒÑ‡Ð°Ñтника, IP-Ð°Ð´Ñ€ÐµÑ (можно оÑтавить пуÑтым):',
'nuke-maxpages' => 'МакÑимальное количеÑтво Ñтраниц:',
- 'nuke-editby' => 'Созданные [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Созданы {{GENDER:$1|учаÑтником|учаÑтницей}} [[Special:Contributions/$1|$1]]',
'nuke-deleted' => "Страница '''$1''' была удалена.",
'nuke-not-deleted' => "Страницы [[:$1]] '''не может''' быть удалена.",
'nuke-delete-more' => '[[Special:Nuke|МножеÑтвенное удаление Ñтраниц]]',
'nuke-pattern' => 'Шаблон Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ Ñтраницы:',
'nuke-nopages-global' => 'Ð’ [[Special:RecentChanges|недавних изменениÑÑ…]] нет новых Ñтраниц.',
'nuke-viewchanges' => 'ВнеÑённые изменениÑ',
+ 'nuke-namespace' => 'Ограничить проÑтранÑтвом имён:',
);
/** Rusyn (руÑиньÑкый)
@@ -2319,6 +2456,7 @@ $messages['si'] = array(
'nuke-pattern' => 'පිටුවේ නම සඳහ෠රටà·à·€:',
'nuke-nopages-global' => '[[Special:RecentChanges|මෑත වෙනස්වීම්වල]] නව පිටු නොමà·à¶­.',
'nuke-viewchanges' => 'වෙනස්කිරීම් පෙන්වන්න',
+ 'nuke-namespace' => 'නà·à¶¸à¶…වකà·à·à¶ºà¶§ සීම෠කරන්න:',
);
/** Slovak (slovenÄina)
@@ -2506,13 +2644,18 @@ $messages['sw'] = array(
/** Tamil (தமிழà¯)
* @author Karthi.dr
+ * @author Shanmugamp7
* @author TRYPPN
* @author மதனாஹரனà¯
*/
$messages['ta'] = array(
+ 'nuke' => 'ஒடà¯à®Ÿà¯ மொதà¯à®¤ நீகà¯à®•à®²à¯',
+ 'action-nuke' => 'பகà¯à®•à®™à¯à®•à®³à¯ˆ மொதà¯à®¤à®®à®¾à®• நீகà¯à®•à¯',
'nuke-submit-user' => 'செலà¯',
'nuke-submit-delete' => 'தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®¤à¯à®¤à®¤à¯ˆ நீகà¯à®•à¯',
+ 'right-nuke' => 'பகà¯à®•à®™à¯à®•à®³à¯ˆ ஒடà¯à®Ÿà¯ மொதà¯à®¤à®®à®¾à®• நீகà¯à®•à¯à®¤à®²à¯',
'nuke-select' => 'தேரà¯à®¨à¯à®¤à¯†à®Ÿà¯à®•à¯à®•à®µà¯à®®à¯:$1',
+ 'nuke-userorip' => 'பயனர௠பெயரà¯, à®à®ªà®¿ à®®à¯à®•à®µà®°à®¿ அலà¯à®²à®¤à¯ வெறà¯à®±à¯ :',
'nuke-maxpages' => 'அதிகபடà¯à®š பகà¯à®•à®™à¯à®•à®³à®¿à®©à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆ:',
'nuke-deleted' => "பகà¯à®•à®®à¯ '''$1''' அழிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.",
'nuke-delete-more' => '[[Special:Nuke|இனà¯à®©à¯à®®à¯ பகà¯à®•à®™à¯à®•à®³à¯ˆ அழிகà¯à®•à®µà¯à®®à¯]]',
@@ -2659,9 +2802,11 @@ $messages['tt-cyrl'] = array(
/** Uyghur (Arabic script) (ئۇيغۇرچە)
* @author Alfredie
+ * @author Sahran
*/
$messages['ug-arab'] = array(
- 'nuke-submit-user' => 'كۆچۈش',
+ 'nuke-submit-user' => 'يۆتكەل',
+ 'nuke-select' => 'تاللاڭ: $1',
);
/** Uyghur (Latin script) (Uyghurche)
@@ -2683,12 +2828,12 @@ $messages['uk'] = array(
'nuke' => 'МаÑове вилученнÑ',
'action-nuke' => 'маÑове Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñторінок',
'nuke-desc' => 'Дає адмініÑтраторам можливіÑÑ‚ÑŒ [[Special:Nuke|маÑового вилученнÑ]] Ñторінок',
- 'nuke-nopages' => 'У нових редагуваннÑÑ… не знайдено Ñторінок, Ñтворених кориÑтувачем [[Special:Contributions/$1|$1]].', # Fuzzy
- 'nuke-list' => 'Такі Ñторінки були нещодавно Ñтворені кориÑтувачем [[Special:Contributions/$1|$1]];
-уведіть коментар Ñ– натиÑніть на кнопку Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб вилучити Ñ—Ñ….', # Fuzzy
+ 'nuke-nopages' => 'У нових редагуваннÑÑ… немає Ñторінок, Ñтворених {{GENDER:$1|кориÑтувачем|кориÑтувачкою}} [[Special:Contributions/$1|$1]].',
+ 'nuke-list' => 'Такі Ñторінки були нещодавно Ñтворені {{GENDER:$1|кориÑтувачем|кориÑтувачкою}} [[Special:Contributions/$1|$1]];
+уведіть коментар Ñ– натиÑніть на кнопку Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб вилучити Ñ—Ñ….',
'nuke-list-multiple' => 'Ці Ñторінки були нещодавно Ñтворені.
Залиште примітку й натиÑніть кнопку, щоб вилучити.',
- 'nuke-defaultreason' => 'МаÑове Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñторінок, Ñтворених кориÑтувачем $1', # Fuzzy
+ 'nuke-defaultreason' => 'МаÑове Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñторінок, Ñтворених {{GENDER:$1|кориÑтувачем|кориÑтувачкою}} [[Special:Contributions/$1|$1]]',
'nuke-multiplepeople' => 'МаÑове Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð½ÐµÐ´Ð°Ð²Ð½Ð¾ доданих Ñторінок',
'nuke-tools' => "Цей інÑтрумент дозволÑÑ” маÑово вилучати Ñторінки, Ñтворені певним кориÑтувачем або з певної IP-адреÑи.
Уведіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача або IP-адреÑу Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб отримати ÑпиÑок Ñторінок Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ, або залиште поле порожнім Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ уÑÑ–Ñ… кориÑтувачів.",
@@ -2698,11 +2843,14 @@ $messages['uk'] = array(
'nuke-select' => 'Вибір: $1',
'nuke-userorip' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача, IP-адреÑа (за бажаннÑм):",
'nuke-maxpages' => 'МакÑимальна кількіÑÑ‚ÑŒ Ñторінок:',
- 'nuke-editby' => 'Створені [[Special:Contributions/$1|$1]]', # Fuzzy
+ 'nuke-editby' => 'Створено {{GENDER:$1|кориÑтувачем|кориÑтувачкою}} [[Special:Contributions/$1|$1]]',
'nuke-deleted' => "Сторінка '''$1''' була вилучена.",
'nuke-not-deleted' => "Сторінка [[:$1]] '''не може''' бути вилучена.",
'nuke-delete-more' => '[[Special:Nuke|МаÑове Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñторінок]]',
'nuke-pattern' => 'Шаблон назви Ñторінки:',
+ 'nuke-nopages-global' => 'У [[Special:RecentChanges|нових редагуваннÑÑ…]] немає нових Ñторінок.',
+ 'nuke-viewchanges' => 'переглÑнути зміни',
+ 'nuke-namespace' => 'Обмежити за проÑтором назв:',
);
/** Urdu (اردو)
@@ -2827,10 +2975,10 @@ $messages['zh-hans'] = array(
'nuke' => '大é‡åˆ é™¤',
'action-nuke' => '删除大é‡é¡µé¢',
'nuke-desc' => '让管ç†å‘˜å¯ä»¥[[Special:Nuke|批é‡åˆ é™¤]]页é¢',
- 'nuke-nopages' => '在最近更改中没有[[Special:Contributions/$1|$1]]创建的新页é¢ã€‚', # Fuzzy
- 'nuke-list' => '以下为[[Special:Contributions/$1|$1]]最近创建的页é¢ï¼Œè¯·å¡«å†™æ³¨é‡Šå¹¶ç‚¹å‡»æŒ‰é’®åˆ é™¤å®ƒä»¬ã€‚', # Fuzzy
+ 'nuke-nopages' => '在最近更改中没有[[Special:Contributions/$1|{{GENDER:$1|$1}}]]创建的新页é¢ã€‚',
+ 'nuke-list' => '以下为[[Special:Contributions/$1|{{GENDER:$1|$1}}]]最近创建的页é¢ï¼Œè¯·å¡«å†™æ³¨é‡Šå¹¶ç‚¹å‡»æŒ‰é’®åˆ é™¤å®ƒä»¬ã€‚',
'nuke-list-multiple' => '以下为最近创建的页é¢ï¼Œè¯·å¡«å†™æ³¨é‡Šå¹¶ç‚¹å‡»æŒ‰é’®åˆ é™¤å®ƒä»¬ã€‚',
- 'nuke-defaultreason' => '大é‡åˆ é™¤$1创建的页é¢', # Fuzzy
+ 'nuke-defaultreason' => '大é‡åˆ é™¤[[Special:Contributions/$1|{{GENDER:$1|$1}}]]创建的页é¢',
'nuke-multiplepeople' => '大é‡åˆ é™¤æœ€è¿‘添加的页é¢',
'nuke-tools' => '此工具å…许大é‡åˆ é™¤æŒ‡å®šç”¨æˆ·æˆ–IP地å€åœ¨æœ€è¿‘创建的页é¢ã€‚输入用户å或IP地å€å¯èŽ·å–å¯åˆ é™¤é¡µé¢åˆ—表,留白则检索所有用户。',
'nuke-submit-user' => '执行',
@@ -2839,7 +2987,7 @@ $messages['zh-hans'] = array(
'nuke-select' => '选择:$1',
'nuke-userorip' => '用户åã€IP地å€æˆ–空白:',
'nuke-maxpages' => '最多页é¢æ•°ï¼š',
- 'nuke-editby' => '由[[Special:Contributions/$1|$1]]创建', # Fuzzy
+ 'nuke-editby' => '由[[Special:Contributions/$1|{{GENDER:$1|$1}}]]创建',
'nuke-deleted' => "已删除页é¢'''$1'''。",
'nuke-not-deleted' => "'''无法'''删除[[:$1]]页é¢ã€‚",
'nuke-delete-more' => '[[Special:Nuke|删除更多页é¢]]',
@@ -2851,6 +2999,7 @@ $messages['zh-hans'] = array(
/** Traditional Chinese (中文(ç¹é«”)‎)
* @author Anakmalaysia
+ * @author Justincheng12345
* @author Liangent
* @author Mark85296341
* @author Shinjiman
@@ -2859,10 +3008,10 @@ $messages['zh-hant'] = array(
'nuke' => '大é‡åˆªé™¤',
'action-nuke' => '大é‡åˆªé™¤é é¢',
'nuke-desc' => '給æ“作員作出[[Special:Nuke|大é‡åˆªé™¤]]的能力',
- 'nuke-nopages' => '在最近更改中沒有 [[Special:Contributions/$1|$1]] 所作的新é é¢ã€‚', # Fuzzy
- 'nuke-list' => '以下的é é¢æ˜¯ç”±[[Special:Contributions/$1|$1]]在以å‰æ‰€å¯«çš„;記下一個註解å†é»žæ“ŠæŒ‰éˆ•åŽ»åˆªé™¤å®ƒå€‘。', # Fuzzy
+ 'nuke-nopages' => '在最近更改中沒有 [[Special:Contributions/$1|$1]] 所作的新é é¢ã€‚',
+ 'nuke-list' => '以下的é é¢æ˜¯ç”±[[Special:Contributions/$1|$1]]在以å‰æ‰€å¯«çš„;記下一個註解å†é»žæ“ŠæŒ‰éˆ•åŽ»åˆªé™¤å®ƒå€‘。',
'nuke-list-multiple' => '以下為最近創建的é é¢ï¼Œè«‹å¡«å¯«è¨»é‡‹ä¸¦é»žæ“ŠæŒ‰éˆ•åˆªé™¤å®ƒå€‘。',
- 'nuke-defaultreason' => '大é‡åˆªé™¤ç”± $1 所建立的é é¢', # Fuzzy
+ 'nuke-defaultreason' => '大é‡åˆªé™¤ç”±[[Special:Contributions/$1|$1]]所建立的é é¢',
'nuke-multiplepeople' => '大é‡åˆªé™¤æœ€è¿‘添加的é é¢',
'nuke-tools' => '此工具å…許大é‡åˆªé™¤æŒ‡å®šç”¨æˆ¶æˆ–IP地å€åœ¨æœ€è¿‘創建的é é¢ã€‚輸入用戶å或IP地å€å¯ç²å–å¯åˆªé™¤é é¢åˆ—表,留白則檢索所有用戶。',
'nuke-submit-user' => '執行',
@@ -2871,7 +3020,7 @@ $messages['zh-hant'] = array(
'nuke-select' => 'é¸æ“‡ï¼š$1',
'nuke-userorip' => '用戶åã€IP地å€æˆ–空白:',
'nuke-maxpages' => '最多é é¢æ•¸ï¼š',
- 'nuke-editby' => '由[[Special:Contributions/$1|$1]]創建', # Fuzzy
+ 'nuke-editby' => '由[[Special:Contributions/$1|$1]]創建',
'nuke-deleted' => "'''$1'''é é¢å·²åˆªé™¤ã€‚",
'nuke-not-deleted' => "'''無法'''刪除[[:$1]]é é¢ã€‚",
'nuke-delete-more' => '[[Special:Nuke|刪除更多é é¢]]',
diff --git a/extensions/Nuke/Nuke_body.php b/extensions/Nuke/Nuke_body.php
index 0ad5f48f..6a6cfec8 100644
--- a/extensions/Nuke/Nuke_body.php
+++ b/extensions/Nuke/Nuke_body.php
@@ -87,7 +87,7 @@ class SpecialNuke extends SpecialPage {
)
. '<table><tr>'
. '<td>' . Xml::label( $this->msg( 'nuke-userorip' )->text(), 'nuke-target' ) . '</td>'
- . '<td>' . Xml::input( 'target', 40, $userName, array( 'id' => 'nuke-target' ) ) . '</td>'
+ . '<td>' . Xml::input( 'target', 40, $userName, array( 'id' => 'nuke-target', 'autofocus' => true ) ) . '</td>'
. '</tr><tr>'
. '<td>' . Xml::label( $this->msg( 'nuke-pattern' )->text(), 'nuke-pattern' ) . '</td>'
. '<td>' . Xml::input( 'pattern', 40, '', array( 'id' => 'nuke-pattern' ) ) . '</td>'
diff --git a/extensions/Nuke/RELEASE-NOTES b/extensions/Nuke/RELEASE-NOTES
index 3d4f40a6..71f6e9c8 100644
--- a/extensions/Nuke/RELEASE-NOTES
+++ b/extensions/Nuke/RELEASE-NOTES
@@ -46,7 +46,7 @@ Latest version of the release notes: https://gerrit.wikimedia.org/r/gitweb?p=med
* Do not show author names when filtering on a single author.
* Added "delete more pages" link.
-* Fixed Special:Nuke/authorname behaviour.
+* Fixed Special:Nuke/authorname behavior.
=== Version 1.1 ===
(2011-2-14)
diff --git a/extensions/ParserFunctions/.gitreview b/extensions/ParserFunctions/.gitreview
deleted file mode 100644
index decb9867..00000000
--- a/extensions/ParserFunctions/.gitreview
+++ /dev/null
@@ -1,5 +0,0 @@
-[gerrit]
-host=gerrit.wikimedia.org
-port=29418
-project=mediawiki/extensions/ParserFunctions.git
-defaultbranch=master
diff --git a/extensions/ParserFunctions/Expr.php b/extensions/ParserFunctions/Expr.php
index 8597f1f7..f40158e8 100644
--- a/extensions/ParserFunctions/Expr.php
+++ b/extensions/ParserFunctions/Expr.php
@@ -45,6 +45,8 @@ define( 'EXPR_TRUNC', 33 );
define( 'EXPR_CEIL', 34 );
define( 'EXPR_POW', 35 );
define( 'EXPR_PI', 36 );
+define( 'EXPR_FMOD', 37 );
+define( 'EXPR_SQRT' , 38 );
class ExprError extends MWException {
/**
@@ -52,6 +54,12 @@ class ExprError extends MWException {
* @param $parameter string
*/
public function __construct( $msg, $parameter = '' ) {
+ // Give grep a chance to find the usages:
+ // pfunc_expr_stack_exhausted, pfunc_expr_unexpected_number, pfunc_expr_preg_match_failure,
+ // pfunc_expr_unrecognised_word, pfunc_expr_unexpected_operator, pfunc_expr_missing_operand,
+ // pfunc_expr_unexpected_closing_bracket, pfunc_expr_unrecognised_punctuation,
+ // pfunc_expr_unclosed_bracket, pfunc_expr_division_by_zero, pfunc_expr_invalid_argument,
+ // pfunc_expr_invalid_argument_ln, pfunc_expr_unknown_error, pfunc_expr_not_a_number
$msg = wfMessage( "pfunc_expr_$msg", $parameter )->inContentLanguage()->escaped();
$this->message = '<strong class="error">' . $msg . '</strong>';
}
@@ -77,10 +85,12 @@ class ExprParser {
EXPR_TRUNC => 9,
EXPR_CEIL => 9,
EXPR_NOT => 9,
+ EXPR_SQRT => 9,
EXPR_POW => 8,
EXPR_TIMES => 7,
EXPR_DIVIDE => 7,
EXPR_MOD => 7,
+ EXPR_FMOD => 7,
EXPR_PLUS => 6,
EXPR_MINUS => 6,
EXPR_ROUND => 5,
@@ -104,6 +114,7 @@ class ExprParser {
EXPR_TIMES => '*',
EXPR_DIVIDE => '/',
EXPR_MOD => 'mod',
+ EXPR_FMOD => 'fmod',
EXPR_PLUS => '+',
EXPR_MINUS => '-',
EXPR_ROUND => 'round',
@@ -130,11 +141,12 @@ class ExprParser {
EXPR_CEIL => 'ceil',
EXPR_POW => '^',
EXPR_PI => 'pi',
+ EXPR_SQRT => 'sqrt',
);
-
var $words = array(
'mod' => EXPR_MOD,
+ 'fmod' => EXPR_FMOD,
'and' => EXPR_AND,
'or' => EXPR_OR,
'not' => EXPR_NOT,
@@ -154,6 +166,7 @@ class ExprParser {
'floor' => EXPR_FLOOR,
'ceil' => EXPR_CEIL,
'pi' => EXPR_PI,
+ 'sqrt' => EXPR_SQRT,
);
/**
@@ -177,6 +190,7 @@ class ExprParser {
$p = 0;
$end = strlen( $expr );
$expecting = 'expression';
+ $name = '';
while ( $p < $end ) {
if ( count( $operands ) > $this->maxStackSize || count( $operators ) > $this->maxStackSize ) {
@@ -254,6 +268,7 @@ class ExprParser {
case EXPR_FLOOR:
case EXPR_TRUNC:
case EXPR_CEIL:
+ case EXPR_SQRT:
if ( $expecting != 'expression' ) {
throw new ExprError( 'unexpected_operator', $word );
}
@@ -412,7 +427,7 @@ class ExprParser {
}
$right = array_pop( $stack );
$left = array_pop( $stack );
- if ( $right == 0 ) {
+ if ( !$right ) {
throw new ExprError( 'division_by_zero', $this->names[$op] );
}
$stack[] = $left / $right;
@@ -421,13 +436,24 @@ class ExprParser {
if ( count( $stack ) < 2 ) {
throw new ExprError( 'missing_operand', $this->names[$op] );
}
- $right = array_pop( $stack );
- $left = array_pop( $stack );
- if ( $right == 0 ) {
+ $right = (int)array_pop( $stack );
+ $left = (int)array_pop( $stack );
+ if ( !$right ) {
throw new ExprError( 'division_by_zero', $this->names[$op] );
}
$stack[] = $left % $right;
break;
+ case EXPR_FMOD:
+ if ( count( $stack ) < 2 ) {
+ throw new ExprError( 'missing_operand', $this->names[$op] );
+ }
+ $right = (double)array_pop( $stack );
+ $left = (double)array_pop( $stack );
+ if ( !$right ) {
+ throw new ExprError( 'division_by_zero', $this->names[$op] );
+ }
+ $stack[] = fmod( $left, $right );
+ break;
case EXPR_PLUS:
if ( count( $stack ) < 2 ) {
throw new ExprError( 'missing_operand', $this->names[$op] );
@@ -634,6 +660,17 @@ class ExprParser {
throw new ExprError( 'division_by_zero', $this->names[$op] );
}
break;
+ case EXPR_SQRT:
+ if ( count( $stack ) < 1 ) {
+ throw new ExprError( 'missing_operand', $this->names[$op] );
+ }
+ $arg = array_pop( $stack );
+ $result = sqrt( $arg );
+ if ( is_nan( $result ) ) {
+ throw new ExprError( 'not_a_number', $this->names[$op] );
+ }
+ $stack[] = $result;
+ break;
default:
// Should be impossible to reach here.
throw new ExprError( 'unknown_error' );
diff --git a/extensions/ParserFunctions/ParserFunctions.i18n.magic.php b/extensions/ParserFunctions/ParserFunctions.i18n.magic.php
index 640dd7aa..1a37cf9e 100644
--- a/extensions/ParserFunctions/ParserFunctions.i18n.magic.php
+++ b/extensions/ParserFunctions/ParserFunctions.i18n.magic.php
@@ -1,9 +1,9 @@
<?php
-
-$magicWords = array();
-
/**
- * English
+ * Internationalisation file for extension ParserFunctions.
+ *
+ * @file
+ * @ingroup Extensions
*/
$magicWords = array();
@@ -79,6 +79,14 @@ $magicWords['arz'] = array(
'explode' => array( 0, 'انÙجار', 'explode' ),
);
+/** South Azerbaijani (تورکجه) */
+$magicWords['azb'] = array(
+ 'ifeq' => array( 0, 'ایربیر' ),
+ 'ifexpr' => array( 0, 'ایرحساب' ),
+ 'iferror' => array( 0, 'ایریالنیش' ),
+ 'ifexist' => array( 0, 'ایراولسا' ),
+);
+
/** Breton (brezhoneg) */
$magicWords['br'] = array(
'time' => array( 0, 'amzer' ),
@@ -88,8 +96,8 @@ $magicWords['br'] = array(
/** Chechen (нохчийн) */
$magicWords['ce'] = array(
- 'time' => array( 0, 'хан', 'time' ),
- 'replace' => array( 0, 'хийцарна', 'замена', 'replace' ),
+ 'time' => array( 0, 'хан' ),
+ 'replace' => array( 0, 'хийцарна', 'замена' ),
);
/** Czech (Äesky) */
@@ -109,7 +117,7 @@ $magicWords['de'] = array(
'default' => array( 0, '#standard' ),
'count' => array( 0, 'zähle' ),
'replace' => array( 0, 'ersetze' ),
- 'urldecode' => array( 0, 'dekodiereurl', 'dekodiere_url' ),
+ 'urldecode' => array( 0, 'URLDEKODIERT:' ),
);
/** Esperanto (Esperanto) */
@@ -120,10 +128,12 @@ $magicWords['eo'] = array(
'ifexpr' => array( 0, 'seespr', 'seeksprimo' ),
'iferror' => array( 0, 'seeraras' ),
'switch' => array( 0, 'Åaltu', 'Åalti', 'sxaltu', 'sxalti' ),
- 'default' => array( 0, '#defaÅ­lte', '#defauxlte' ),
+ 'default' => array( 0, '#apriore', '#defaÅ­lte', '#defauxlte' ),
'ifexist' => array( 0, 'seekzistas' ),
'time' => array( 0, 'tempo' ),
'timel' => array( 0, 'tempoo' ),
+ 'len' => array( 0, 'lungo' ),
+ 'replace' => array( 0, 'anstataÅ­igi' ),
);
/** Spanish (español) */
@@ -132,6 +142,7 @@ $magicWords['es'] = array(
'ifexpr' => array( 0, 'siexpr' ),
'iferror' => array( 0, 'sierror' ),
'switch' => array( 0, 'según' ),
+ 'default' => array( 0, '#predeterminado' ),
'ifexist' => array( 0, 'siexiste' ),
'time' => array( 0, 'tiempo' ),
'len' => array( 0, 'long', 'longitud' ),
@@ -165,18 +176,19 @@ $magicWords['fa'] = array(
/** Hebrew (עברית) */
$magicWords['he'] = array(
- 'expr' => array( 0, 'חשב', 'expr' ),
- 'if' => array( 0, 'תנ××™', 'if' ),
- 'ifeq' => array( 0, 'שווה', 'ifeq' ),
- 'ifexpr' => array( 0, 'חשב תנ××™', 'ifexpr' ),
- 'iferror' => array( 0, 'תנ××™ שגי××”', 'iferror' ),
- 'switch' => array( 0, 'בחר', 'switch' ),
- 'default' => array( 0, '#ברירת מחדל', '#default' ),
- 'ifexist' => array( 0, 'קיי×', 'ifexist' ),
- 'time' => array( 0, 'זמן', 'time' ),
- 'timel' => array( 0, 'זמןמ', 'timel' ),
- 'rel2abs' => array( 0, 'יחסי למוחלט', 'rel2abs' ),
- 'titleparts' => array( 0, 'חלק בכותרת', 'titleparts' ),
+ 'expr' => array( 0, 'חשב' ),
+ 'if' => array( 0, 'תנ××™' ),
+ 'ifeq' => array( 0, 'שווה' ),
+ 'ifexpr' => array( 0, 'חשב תנ××™' ),
+ 'iferror' => array( 0, 'תנ××™ שגי××”' ),
+ 'switch' => array( 0, 'בחר' ),
+ 'default' => array( 0, '#ברירת מחדל' ),
+ 'ifexist' => array( 0, 'קיי×' ),
+ 'time' => array( 0, 'זמן' ),
+ 'timel' => array( 0, 'זמןמ' ),
+ 'rel2abs' => array( 0, 'יחסי למוחלט' ),
+ 'titleparts' => array( 0, 'חלק בכותרת' ),
+ 'count' => array( 0, 'מספר' ),
);
/** Hungarian (magyar) */
@@ -218,7 +230,16 @@ $magicWords['ig'] = array(
/** Italian (italiano) */
$magicWords['it'] = array(
- 'ifexist' => array( 0, 'ifexist' ),
+ 'expr' => array( 0, 'espr' ),
+ 'if' => array( 0, 'se' ),
+ 'ifeq' => array( 0, 'seeq' ),
+ 'ifexpr' => array( 0, 'seespr' ),
+ 'iferror' => array( 0, 'seerrore' ),
+ 'ifexist' => array( 0, 'seesiste' ),
+ 'time' => array( 0, 'tempo' ),
+ 'titleparts' => array( 0, 'patititolo' ),
+ 'count' => array( 0, 'conto' ),
+ 'replace' => array( 0, 'sostituisci' ),
);
/** Japanese (日本語) */
@@ -256,12 +277,15 @@ $magicWords['ko'] = array(
'default' => array( 0, '#기본값' ),
'ifexist' => array( 0, '만약존재' ),
'time' => array( 0, '시간' ),
- 'timel' => array( 0, '지역시간' ),
+ 'timel' => array( 0, '현지시간' ),
+ 'rel2abs' => array( 0, 'ìƒëŒ€ë¥¼ì ˆëŒ€ë¡œ' ),
+ 'titleparts' => array( 0, '제목부분' ),
'len' => array( 0, '길ì´' ),
'pos' => array( 0, '위치' ),
'rpos' => array( 0, '오른위치' ),
+ 'sub' => array( 0, 'ìžë¥´ê¸°' ),
'count' => array( 0, '개수' ),
- 'replace' => array( 0, 'êµì²´' ),
+ 'replace' => array( 0, '바꾸기', 'êµì²´' ),
'explode' => array( 0, '분리' ),
'urldecode' => array( 0, '주소디코딩:' ),
);
@@ -271,6 +295,12 @@ $magicWords['ku-latn'] = array(
'len' => array( 0, '#ziman' ),
);
+/** Cornish (kernowek) */
+$magicWords['kw'] = array(
+ 'if' => array( 0, 'mar' ),
+ 'time' => array( 0, 'termyn' ),
+);
+
/** Ladino (Ladino) */
$magicWords['lad'] = array(
'switch' => array( 0, 'asegún', 'según', 'switch' ),
@@ -318,7 +348,7 @@ $magicWords['ml'] = array(
'ifexpr' => array( 0, 'à´Žà´•àµà´¸àµà´ªàµà´°àµ†à´·à´¨àµ†à´™àµà´•à´¿àµ½' ),
'iferror' => array( 0, 'പിഴവെങàµà´•à´¿àµ½' ),
'switch' => array( 0, 'മാറàµà´±àµà´•' ),
- 'default' => array( 0, '#à´¸àµà´µà´¤à´µàµ‡' ),
+ 'default' => array( 0, '#à´¸àµà´µà´¤àµ‡' ),
'ifexist' => array( 0, 'ഉണàµà´Ÿàµ†à´™àµà´•à´¿àµ½' ),
'time' => array( 0, 'സമയം' ),
'timel' => array( 0, 'സമയം|' ),
@@ -330,37 +360,37 @@ $magicWords['ml'] = array(
/** Marathi (मराठी) */
$magicWords['mr'] = array(
- 'expr' => array( 0, 'करण', 'expr' ),
- 'if' => array( 0, 'जर', 'इफ', 'if' ),
- 'ifeq' => array( 0, 'जरसम', 'ifeq' ),
- 'ifexpr' => array( 0, 'जरकरण', 'ifexpr' ),
- 'iferror' => array( 0, 'जरतà¥à¤°à¥à¤Ÿà¥€', 'iferror' ),
- 'switch' => array( 0, 'कळ', 'सांगकळ', 'असेलतरसांग', 'असलेतरसांग', 'सà¥à¤µà¥€à¤š', 'switch' ),
- 'default' => array( 0, '#अविचल', '#default' ),
- 'ifexist' => array( 0, 'जरअसेल', 'जरआहे', 'ifexist' ),
- 'time' => array( 0, 'वेळ', 'time' ),
- 'timel' => array( 0, 'वेळसà¥à¤¥à¤¾', 'timel' ),
- 'titleparts' => array( 0, 'शीरà¥à¤·à¤•à¤–ंड', 'टाइटलपारà¥à¤Ÿà¥à¤¸', 'titleparts' ),
- 'len' => array( 0, 'लांबी', 'len' ),
- 'pos' => array( 0, 'सà¥à¤¥à¤¶à¥‹à¤§', 'pos' ),
- 'rpos' => array( 0, 'मागà¥à¤šà¤¾à¤¸à¥à¤¥à¤¶à¥‹à¤§', 'rpos' ),
- 'sub' => array( 0, 'उप', 'sub' ),
- 'count' => array( 0, 'मोज', 'मोजा', 'count' ),
- 'replace' => array( 0, 'नेबदल', 'रिपà¥à¤²à¥‡à¤¸', 'replace' ),
- 'explode' => array( 0, 'à¤à¤•à¤«à¥‹à¤¡', 'explode' ),
-);
-
-/** Nedersaksisch (Nedersaksisch) */
+ 'expr' => array( 0, 'करण' ),
+ 'if' => array( 0, 'जर', 'इफ' ),
+ 'ifeq' => array( 0, 'जरसम' ),
+ 'ifexpr' => array( 0, 'जरकरण' ),
+ 'iferror' => array( 0, 'जरतà¥à¤°à¥à¤Ÿà¥€' ),
+ 'switch' => array( 0, 'कळ', 'सांगकळ', 'असेलतरसांग', 'असलेतरसांग', 'सà¥à¤µà¥€à¤š' ),
+ 'default' => array( 0, '#अविचल' ),
+ 'ifexist' => array( 0, 'जरअसेल', 'जरआहे' ),
+ 'time' => array( 0, 'वेळ' ),
+ 'timel' => array( 0, 'वेळसà¥à¤¥à¤¾' ),
+ 'titleparts' => array( 0, 'शीरà¥à¤·à¤•à¤–ंड', 'टाइटलपारà¥à¤Ÿà¥à¤¸' ),
+ 'len' => array( 0, 'लांबी' ),
+ 'pos' => array( 0, 'सà¥à¤¥à¤¶à¥‹à¤§' ),
+ 'rpos' => array( 0, 'मागà¥à¤šà¤¾à¤¸à¥à¤¥à¤¶à¥‹à¤§' ),
+ 'sub' => array( 0, 'उप' ),
+ 'count' => array( 0, 'मोज', 'मोजा' ),
+ 'replace' => array( 0, 'नेबदल', 'रिपà¥à¤²à¥‡à¤¸' ),
+ 'explode' => array( 0, 'à¤à¤•à¤«à¥‹à¤¡' ),
+);
+
+/** Low Saxon (Netherlands) (Nedersaksies) */
$magicWords['nds-nl'] = array(
- 'if' => array( 0, 'as', 'als', 'if' ),
- 'ifeq' => array( 0, 'asgelieke', 'alsgelijk', 'ifeq' ),
- 'ifexpr' => array( 0, 'asexpressie', 'alsexpressie', 'ifexpr' ),
- 'iferror' => array( 0, 'asfout', 'alsfout', 'iferror' ),
- 'default' => array( 0, '#standard', '#standaard', '#default' ),
- 'ifexist' => array( 0, 'asbesteet', 'alsbestaat', 'ifexist' ),
- 'time' => array( 0, 'tied', 'tijd', 'time' ),
- 'timel' => array( 0, 'tiedl', 'tijdl', 'timel' ),
- 'rel2abs' => array( 0, 'relatiefnaorabseluut', 'relatiefnaarabsoluut', 'rel2abs' ),
+ 'if' => array( 0, 'as', 'als' ),
+ 'ifeq' => array( 0, 'asgelieke', 'alsgelijk' ),
+ 'ifexpr' => array( 0, 'asexpressie', 'alsexpressie' ),
+ 'iferror' => array( 0, 'asfout', 'alsfout' ),
+ 'default' => array( 0, '#standard', '#standaard' ),
+ 'ifexist' => array( 0, 'asbesteet', 'alsbestaat' ),
+ 'time' => array( 0, 'tied', 'tijd' ),
+ 'timel' => array( 0, 'tiedl', 'tijdl' ),
+ 'rel2abs' => array( 0, 'relatiefnaorabseluut', 'relatiefnaarabsoluut' ),
);
/** Dutch (Nederlands) */
@@ -383,28 +413,33 @@ $magicWords['nl'] = array(
'urldecode' => array( 0, 'urldecoderen' ),
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎) */
+/** Norwegian Nynorsk (norsk nynorsk) */
$magicWords['nn'] = array(
- 'expr' => array( 0, 'uttrykk', 'expr' ),
- 'if' => array( 0, 'om', 'if' ),
- 'ifeq' => array( 0, 'omlik', 'ifeq' ),
- 'ifexpr' => array( 0, 'omuttrykk', 'ifexpr' ),
- 'iferror' => array( 0, 'omfeil', 'iferror' ),
- 'switch' => array( 0, 'byt', 'switch' ),
- 'ifexist' => array( 0, 'omfinst', 'ifexist' ),
- 'time' => array( 0, 'tid', 'time' ),
- 'timel' => array( 0, 'tidl', 'timel' ),
- 'rel2abs' => array( 0, 'reltilabs', 'rel2abs' ),
- 'titleparts' => array( 0, 'titteldelar', 'titleparts' ),
- 'len' => array( 0, 'lengd', 'len' ),
- 'replace' => array( 0, 'erstatt', 'replace' ),
-);
-
-/** Oriya (ଓଡ଼ିଆ) */
+ 'expr' => array( 0, 'uttrykk' ),
+ 'if' => array( 0, 'om' ),
+ 'ifeq' => array( 0, 'omlik' ),
+ 'ifexpr' => array( 0, 'omuttrykk' ),
+ 'iferror' => array( 0, 'omfeil' ),
+ 'switch' => array( 0, 'byt' ),
+ 'ifexist' => array( 0, 'omfinst' ),
+ 'time' => array( 0, 'tid' ),
+ 'timel' => array( 0, 'tidl' ),
+ 'rel2abs' => array( 0, 'reltilabs' ),
+ 'titleparts' => array( 0, 'titteldelar' ),
+ 'len' => array( 0, 'lengd' ),
+ 'replace' => array( 0, 'erstatt' ),
+);
+
+/** Oriya (ଓଡ଼ିଆ) */
$magicWords['or'] = array(
'time' => array( 0, 'ସମୟ' ),
);
+/** Punjabi (ਪੰਜਾਬੀ) */
+$magicWords['pa'] = array(
+ 'time' => array( 0, 'ਸਮੇ' ),
+);
+
/** Pashto (پښتو) */
$magicWords['ps'] = array(
'if' => array( 0, 'Ú©Ù‡', 'if' ),
@@ -426,6 +461,12 @@ $magicWords['pt'] = array(
/** Russian (руÑÑкий) */
$magicWords['ru'] = array(
+ 'if' => array( 0, 'еÑли' ),
+ 'iferror' => array( 0, 'еÑлиошибка' ),
+ 'switch' => array( 0, 'переключатель' ),
+ 'default' => array( 0, '#умолчание' ),
+ 'time' => array( 0, 'времÑ' ),
+ 'timel' => array( 0, 'мвремÑ' ),
'replace' => array( 0, 'замена' ),
);
@@ -469,19 +510,57 @@ $magicWords['tr'] = array(
/** Ukrainian (українÑька) */
$magicWords['uk'] = array(
- 'expr' => array( 0, 'вираз', 'expr' ),
- 'if' => array( 0, 'Ñкщо', 'if' ),
- 'ifeq' => array( 0, 'Ñкщорівні', 'рівні', 'ifeq' ),
- 'ifexpr' => array( 0, 'Ñкщовираз', 'ifexpr' ),
- 'iferror' => array( 0, 'Ñкщопомилка', 'iferror' ),
- 'switch' => array( 0, 'вибірка', 'switch' ),
- 'default' => array( 0, '#інакше', '#default' ),
- 'ifexist' => array( 0, 'ÑкщоіÑнує', 'ifexist' ),
+ 'expr' => array( 0, 'вираз' ),
+ 'if' => array( 0, 'Ñкщо' ),
+ 'ifeq' => array( 0, 'Ñкщорівні', 'рівні' ),
+ 'ifexpr' => array( 0, 'Ñкщовираз' ),
+ 'iferror' => array( 0, 'Ñкщопомилка' ),
+ 'switch' => array( 0, 'вибірка' ),
+ 'default' => array( 0, '#інакше' ),
+ 'ifexist' => array( 0, 'ÑкщоіÑнує' ),
+ 'replace' => array( 0, 'заміна' ),
+);
+
+/** Urdu (اردو) */
+$magicWords['ur'] = array(
+ 'if' => array( 0, 'اگر' ),
+);
+
+/** Uzbek (oʻzbekcha) */
+$magicWords['uz'] = array(
+ 'expr' => array( 0, 'ifoda' ),
+ 'if' => array( 0, 'agar' ),
+ 'ifeq' => array( 0, 'agarteng' ),
+ 'ifexpr' => array( 0, 'agarifoda' ),
+ 'iferror' => array( 0, 'agarxato' ),
+ 'switch' => array( 0, 'tanlov' ),
+ 'default' => array( 0, '#boshlangʻich' ),
+ 'ifexist' => array( 0, 'agarbor' ),
+ 'time' => array( 0, 'vaqt' ),
+ 'len' => array( 0, 'uzunlik' ),
+ 'pos' => array( 0, 'oʻrin' ),
+ 'count' => array( 0, 'miqdor' ),
+ 'replace' => array( 0, 'almashtirish' ),
);
/** Vietnamese (Tiếng Việt) */
$magicWords['vi'] = array(
'expr' => array( 0, 'côngthức' ),
+ 'if' => array( 0, 'nếu' ),
+ 'ifeq' => array( 0, 'nếubằng' ),
+ 'ifexpr' => array( 0, 'nếucôngthức' ),
+ 'iferror' => array( 0, 'nếulỗi' ),
+ 'default' => array( 0, '#mặcđịnh' ),
+ 'ifexist' => array( 0, 'nếutồntại' ),
+ 'time' => array( 0, 'giá»' ),
+ 'timel' => array( 0, 'giá»Ä‘ịaphÆ°Æ¡ng' ),
+ 'len' => array( 0, 'sốchữ', 'sốkýtự', 'sốkítự' ),
+ 'pos' => array( 0, 'vịtrí' ),
+ 'rpos' => array( 0, 'vịtríphải' ),
+ 'sub' => array( 0, 'chuá»—icon' ),
+ 'count' => array( 0, 'số' ),
+ 'replace' => array( 0, 'thaythế' ),
+ 'urldecode' => array( 0, 'giảimãurl' ),
);
/** Yiddish (ייִדיש) */
@@ -495,4 +574,23 @@ $magicWords['yi'] = array(
'ifexist' => array( 0, 'עקזיסט' ),
'time' => array( 0, 'צייט' ),
'timel' => array( 0, 'צייטל' ),
+ 'count' => array( 0, 'צ×ל' ),
+);
+
+/** Chinese (中文) */
+$magicWords['zh'] = array(
+ 'expr' => array( 0, '计算å¼' ),
+ 'if' => array( 0, 'éžç©ºå¼' ),
+ 'ifeq' => array( 0, '相åŒå¼', '匹é…å¼' ),
+ 'iferror' => array( 0, '错误å¼' ),
+ 'switch' => array( 0, '多选å¼', '多æ¡ä»¶å¼', 'åŒå°„å¼' ),
+ 'default' => array( 0, '#默认' ),
+ 'ifexist' => array( 0, '存在å¼' ),
+ 'len' => array( 0, '长度' ),
+ 'pos' => array( 0, 'ä½ç½®' ),
+ 'rpos' => array( 0, '最近ä½ç½®' ),
+ 'sub' => array( 0, '截å–' ),
+ 'count' => array( 0, '计数' ),
+ 'replace' => array( 0, '替æ¢' ),
+ 'explode' => array( 0, '爆炸', '炸开' ),
); \ No newline at end of file
diff --git a/extensions/ParserFunctions/ParserFunctions.i18n.php b/extensions/ParserFunctions/ParserFunctions.i18n.php
index ed37a0d7..3bac1a8d 100644
--- a/extensions/ParserFunctions/ParserFunctions.i18n.php
+++ b/extensions/ParserFunctions/ParserFunctions.i18n.php
@@ -13,15 +13,16 @@ $messages['en'] = array(
'pfunc_time_error' => 'Error: Invalid time.',
'pfunc_time_too_long' => 'Error: Too many #time calls.',
'pfunc_time_too_big' => 'Error: #time only supports years up to 9999.',
+ 'pfunc_time_too_small' => 'Error: #time only supports years from 0.',
'pfunc_rel2abs_invalid_depth' => 'Error: Invalid depth in path: "$1" (tried to access a node above the root node).',
'pfunc_expr_stack_exhausted' => 'Expression error: Stack exhausted.',
'pfunc_expr_unexpected_number' => 'Expression error: Unexpected number.',
'pfunc_expr_preg_match_failure' => 'Expression error: Unexpected preg_match failure.',
- 'pfunc_expr_unrecognised_word' => 'Expression error: Unrecognised word "$1".',
+ 'pfunc_expr_unrecognised_word' => 'Expression error: Unrecognized word "$1".',
'pfunc_expr_unexpected_operator' => 'Expression error: Unexpected $1 operator.',
'pfunc_expr_missing_operand' => 'Expression error: Missing operand for $1.',
'pfunc_expr_unexpected_closing_bracket' => 'Expression error: Unexpected closing bracket.',
- 'pfunc_expr_unrecognised_punctuation' => 'Expression error: Unrecognised punctuation character "$1".',
+ 'pfunc_expr_unrecognised_punctuation' => 'Expression error: Unrecognized punctuation character "$1".',
'pfunc_expr_unclosed_bracket' => 'Expression error: Unclosed bracket.',
'pfunc_expr_division_by_zero' => 'Division by zero.',
'pfunc_expr_invalid_argument' => 'Invalid argument for $1: < -1 or > 1.',
@@ -35,12 +36,81 @@ $messages['en'] = array(
* @author Jon Harald Søby
* @author Kghbln
* @author Meno25
+ * @author Shirayuki
* @author Siebrand
* @author The Evil IP address
*/
$messages['qqq'] = array(
- 'pfunc_desc' => '{{desc}}',
- 'pfunc_expr_division_by_zero' => '{{Identical|Divizion by zero}}',
+ 'pfunc_desc' => '{{desc|name=Parser Functions|url=http://www.mediawiki.org/wiki/Extension:ParserFunctions}}',
+ 'pfunc_time_error' => 'Used as error message about DateTime object, so this "time" means "date and time".
+
+See also:
+* {{msg-mw|Pfunc time too long}}
+* {{msg-mw|Pfunc time too big}}
+* {{msg-mw|Pfunc time too small}}',
+ 'pfunc_time_too_long' => 'Used as error message.
+
+See also:
+* {{msg-mw|Pfunc time error}}
+* {{msg-mw|Pfunc time too big}}
+* {{msg-mw|Pfunc time too small}}',
+ 'pfunc_time_too_big' => 'Used as error message.
+
+See also:
+* {{msg-mw|Pfunc time error}}
+* {{msg-mw|Pfunc time too long}}
+* {{msg-mw|Pfunc time too small}}',
+ 'pfunc_time_too_small' => 'Used as error message.
+
+See also:
+* {{msg-mw|Pfunc time error}}
+* {{msg-mw|Pfunc time too long}}
+* {{msg-mw|Pfunc time too big}}',
+ 'pfunc_rel2abs_invalid_depth' => 'Used as error message. Parameters:
+* $1 - full path',
+ 'pfunc_expr_stack_exhausted' => 'Used as error message.
+{{Related|Pfunc expr}}',
+ 'pfunc_expr_unexpected_number' => 'Used as error message.
+{{Related|Pfunc expr}}',
+ 'pfunc_expr_preg_match_failure' => '{{doc-important|Do not translate <code>preg_match</code>. It is a PHP function name.}}
+Used as error message.
+{{Related|Pfunc expr}}',
+ 'pfunc_expr_unrecognised_word' => 'Used as error message. Parameters:
+* $1 - word
+{{Related|Pfunc expr}}',
+ 'pfunc_expr_unexpected_operator' => 'Used as error message. Parameters:
+* $1 - operator
+{{Related|Pfunc expr}}',
+ 'pfunc_expr_missing_operand' => 'Used as error message. Parameters:
+* $1 - operator name. e.g. +, -, not, mod, sin, cos, sqrt
+{{Related|Pfunc expr}}',
+ 'pfunc_expr_unexpected_closing_bracket' => 'Used as error message.
+{{Related|Pfunc expr}}',
+ 'pfunc_expr_unrecognised_punctuation' => 'Used as error message. Parameters:
+* $1 - invalid character
+{{Related|Pfunc expr}}',
+ 'pfunc_expr_unclosed_bracket' => 'Used as error message.
+{{Related|Pfunc expr}}',
+ 'pfunc_expr_division_by_zero' => 'Used as error message.
+{{Related|Pfunc expr}}',
+ 'pfunc_expr_invalid_argument' => 'Used as error message when the operand is invalid. Parameters:
+* $1 - operator name. Any one of the following: asin, acos
+{{Related|Pfunc expr}}',
+ 'pfunc_expr_invalid_argument_ln' => '{{doc-important|Do not translate <code>ln</code>. It is an operator.}}
+Used as error message when the operand for the operator "ln" is invalid.
+{{Related|Pfunc expr}}',
+ 'pfunc_expr_unknown_error' => 'Used as error message.
+
+In the source code, there is a comment "// Should be impossible to reach here.".
+
+Parameters:
+* $1 - (Undefined in the source code)
+{{Related|Pfunc expr}}',
+ 'pfunc_expr_not_a_number' => 'Used as error message when the result of "sqrt" (square root) is not a number.
+
+Parameters:
+* $1 - operator name: sqrt
+{{Related|Pfunc expr}}',
'pfunc_string_too_long' => 'PLURAL is supported for $1.',
);
@@ -166,10 +236,29 @@ $messages['arz'] = array(
);
/** Assamese (অসমীয়া)
+ * @author Bishnu Saikia
* @author Rajuonline
*/
$messages['as'] = array(
+ 'pfunc_desc' => 'লজিকেল ফাংছন বà§à¦¯à§±à¦¹à¦¾à§° কৰি পাৰà§à¦›à¦¾à§°à¦• উনà§à¦¨à¦¤ কৰক',
'pfunc_time_error' => 'ভà§à¦²: অযোগà§à¦¯ সময়',
+ 'pfunc_time_too_long' => 'তà§à¦°à§à¦Ÿà§€: অতà§à¦¯à¦§à¦¿à¦• #time কল আছে',
+ 'pfunc_time_too_big' => 'তà§à§°à§à¦Ÿà§€: #time -ঠকেৱল ৯৯৯৯ চনলৈকে লৈকেহে সমৰà§à¦¥à¦¨ কৰে',
+ 'pfunc_rel2abs_invalid_depth' => 'তà§à§°à§à¦Ÿà§€: পাথত অবৈধ গভীৰতা: "$1" (মূল নোডৰ ওপৰৰ à¦à¦Ÿà¦¾ নোড আহৰণ কৰাৰ চেষà§à¦Ÿà¦¾ কৰিছিল)',
+ 'pfunc_expr_stack_exhausted' => 'à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨ তà§à§°à§à¦Ÿà§€: ষà§à¦Ÿà¦• শেষ হৈছে',
+ 'pfunc_expr_unexpected_number' => 'à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨ তà§à§°à§à¦Ÿà§€: অবাঞà§à¦šà¦¿à¦¤ সংখà§à¦¯à¦¾',
+ 'pfunc_expr_preg_match_failure' => 'à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨ তà§à§°à§à¦Ÿà§€: অবাঞà§à¦šà¦¿à¦¤ preg_match বà§à¦¯à§°à§à¦¥à¦¤à¦¾',
+ 'pfunc_expr_unrecognised_word' => 'à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨ তà§à§°à§à¦Ÿà§€: অপৰিচিত শবà§à¦¦ "$1"',
+ 'pfunc_expr_unexpected_operator' => 'à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨ তà§à§°à§à¦Ÿà§€: অবাঞà§à¦šà¦¿à¦¤ $1 অপাৰেটৰ',
+ 'pfunc_expr_missing_operand' => 'à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨ তà§à§°à§à¦Ÿà§€: $1’ৰ বাবে অপাৰেণà§à¦¡ নাই।',
+ 'pfunc_expr_unexpected_closing_bracket' => 'à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨ তà§à§°à§à¦Ÿà§€: অবাঞà§à¦šà¦¿à¦¤ সমাপà§à¦¤à¦•à¦¾à§°à§€ বনà§à¦§à¦¨à§€',
+ 'pfunc_expr_unrecognised_punctuation' => 'à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨ তà§à§°à§à¦Ÿà§€: অপৰিচিত বিৰামচিহà§à¦¨ কেৰেকà§à¦Ÿà¦¾à§° "$1"',
+ 'pfunc_expr_unclosed_bracket' => 'à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨ তà§à§°à§à¦Ÿà§€: উনà§à¦®à§à¦•à§à¦¤ বনà§à¦§à¦¨à§€',
+ 'pfunc_expr_division_by_zero' => 'শূনà§à¦¯à§° দà§à¦¬à¦¾à§°à¦¾ হৰণ কৰা হৈছে',
+ 'pfunc_expr_invalid_argument' => '$1 ৰ বাবে ভà§à¦² চৰà§à¦¤: < -1 অথবা > 1',
+ 'pfunc_expr_invalid_argument_ln' => 'ln ৰ বাবে অমানà§à¦¯ চৰà§à¦¤: <= 0',
+ 'pfunc_expr_unknown_error' => 'à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨ তà§à§°à§à¦Ÿà§€: : অজà§à¦žà¦¾à¦¤ তà§à§°à§à¦Ÿà§€ ($1)',
+ 'pfunc_expr_not_a_number' => '$1: ৰ ফলাফল à¦à¦•à§‹ সংখà§à¦¯à¦¾ নহয়',
);
/** Asturian (asturianu)
@@ -181,15 +270,16 @@ $messages['ast'] = array(
'pfunc_time_error' => 'Error: tiempu non válidu',
'pfunc_time_too_long' => 'Error: demasiaes llamaes #time',
'pfunc_time_too_big' => 'Error: #time sólo almite años fasta 9999.',
+ 'pfunc_time_too_small' => 'Error: #time sólo almite años dende 0.',
'pfunc_rel2abs_invalid_depth' => 'Error: Nivel de subdireutoriu non válidu: "$1" (intentu d\'accesu penriba del direutoriu raíz)',
'pfunc_expr_stack_exhausted' => "Error d'espresión: Pila escosada",
'pfunc_expr_unexpected_number' => "Error d'espresión: Númberu inesperáu",
'pfunc_expr_preg_match_failure' => "Error d'espresión: Fallu inesperáu de preg_match",
- 'pfunc_expr_unrecognised_word' => 'Error d\'espresión: Pallabra "$1" non reconocida',
+ 'pfunc_expr_unrecognised_word' => 'Error d\'espresión: Pallabra "$1" non reconocida.',
'pfunc_expr_unexpected_operator' => "Error d'espresión: Operador $1 inesperáu",
'pfunc_expr_missing_operand' => "Error d'espresión: Falta operador en $1",
'pfunc_expr_unexpected_closing_bracket' => "Error d'espresión: Paréntesis final inesperáu",
- 'pfunc_expr_unrecognised_punctuation' => 'Error d\'espresión: Caráuter de puntuación "$1" non reconocíu',
+ 'pfunc_expr_unrecognised_punctuation' => 'Error d\'espresión: Caráuter de puntuación "$1" non reconocíu.',
'pfunc_expr_unclosed_bracket' => "Error d'espresión: Paréntesis non zarráu",
'pfunc_expr_division_by_zero' => 'División por cero',
'pfunc_expr_invalid_argument' => 'Argumentu non válidu pa $1: < -1 o > 1',
@@ -206,6 +296,13 @@ $messages['az'] = array(
'pfunc_time_error' => 'Xəta: yanlış zaman',
);
+/** South Azerbaijani (تورکجه)
+ * @author Amir a57
+ */
+$messages['azb'] = array(
+ 'pfunc_time_error' => 'ختا: یانلیش زامان',
+);
+
/** Bashkir (башҡортÑа)
* @author Assele
*/
@@ -345,7 +442,7 @@ $messages['br'] = array(
'pfunc_rel2abs_invalid_depth' => "Fazi : Donder direizh evit an hent : \"\$1\" (klasket ez eus bet mont d'ul live a-us d'ar c'havlec'h-mamm)",
'pfunc_expr_stack_exhausted' => 'Kemennad faziek : pil riñset',
'pfunc_expr_unexpected_number' => "Kemennad faziek : niver dic'hortoz",
- 'pfunc_expr_preg_match_failure' => "Kemennad faziek : c'hwitadenn dic'hortoz evit <code>preg_match</code>",
+ 'pfunc_expr_preg_match_failure' => "Kemennad faziek : c'hwitadenn dic'hortoz evit preg_match",
'pfunc_expr_unrecognised_word' => 'Kemennad faziek : Ger dianav "$1"',
'pfunc_expr_unexpected_operator' => 'Kemennad faziek : Oberier $1 dianav',
'pfunc_expr_missing_operand' => 'Kemennad faziek : Dianav eo operand $1',
@@ -455,6 +552,7 @@ $messages['cs'] = array(
/** Danish (dansk)
* @author Byrial
+ * @author HenrikKbh
* @author Morten LJ
* @author Peter Alberti
*/
@@ -463,6 +561,7 @@ $messages['da'] = array(
'pfunc_time_error' => 'Fejl: Ugyldig tid',
'pfunc_time_too_long' => 'Fejl: for mange kald af #time',
'pfunc_time_too_big' => 'Fejl: #time understøtter kun årstal frem til 9999',
+ 'pfunc_time_too_small' => 'Fejl: #tid understøtter kun år fra 0.',
'pfunc_rel2abs_invalid_depth' => 'Fejl: Ugyldig dybde i sti: "$1" (prøvede at tilgå en knude over rodknuden)',
'pfunc_expr_stack_exhausted' => 'Udtryksfejl: Stak tømt',
'pfunc_expr_unexpected_number' => 'Fejl: Uventet tal',
@@ -490,17 +589,18 @@ $messages['da'] = array(
* @author Rillke
*/
$messages['de'] = array(
- 'pfunc_desc' => 'Ergänzt Parserfunktionen, die logische Funktionen auf Wikiseiten ermöglichen',
+ 'pfunc_desc' => 'Ergänzt den Parser um logische Funktionen',
'pfunc_time_error' => 'Fehler: Ungültige Zeitangabe',
'pfunc_time_too_long' => 'Fehler: Zu viele #time-Aufrufe',
'pfunc_time_too_big' => 'Fehler: #time unterstützt nur Jahre bis 9999',
+ 'pfunc_time_too_small' => 'Fehler: #time unterstützt nur Jahre ab 0.',
'pfunc_rel2abs_invalid_depth' => 'Fehler: Ungültige Pfadtiefe: „$1“ (Zugriff auf einen Knotenpunkt oberhalb des Hauptknotenpunktes ist empfohlen)',
'pfunc_expr_stack_exhausted' => 'Expression-Fehler: Stacküberlauf',
'pfunc_expr_unexpected_number' => 'Expression-Fehler: Unerwartete Zahl',
'pfunc_expr_preg_match_failure' => 'Expression-Fehler: Unerwartete „preg_match“-Fehlfunktion',
'pfunc_expr_unrecognised_word' => 'Expression-Fehler: Unerkanntes Wort „$1“',
- 'pfunc_expr_unexpected_operator' => 'Expression-Fehler: Unerwarteter Operator <tt>$1</tt>',
- 'pfunc_expr_missing_operand' => 'Expression-Fehler: Fehlender Operand für <tt>$1</tt>',
+ 'pfunc_expr_unexpected_operator' => 'Expression-Fehler: Unerwarteter Operator $1',
+ 'pfunc_expr_missing_operand' => 'Expression-Fehler: Fehlender Operand für $1',
'pfunc_expr_unexpected_closing_bracket' => 'Expression-Fehler: Unerwartete schließende eckige Klammer',
'pfunc_expr_unrecognised_punctuation' => 'Expression-Fehler: Unerkanntes Satzzeichen „$1“',
'pfunc_expr_unclosed_bracket' => 'Expression-Fehler: Nicht geschlossene eckige Klammer',
@@ -576,12 +676,14 @@ $messages['dsb'] = array(
* @author Dead3y3
* @author Lou
* @author Omnipaedista
+ * @author Protnet
* @author ΑπεÏγός
*/
$messages['el'] = array(
'pfunc_desc' => 'Βελτιώνει το συντακτικό αναλυτή με λογικές συναÏτήσεις',
'pfunc_time_error' => 'Σφάλμα: άκυÏος χÏόνος',
'pfunc_time_too_long' => 'Σφάλμα: πάÏα πολλές κλήσεις της #time',
+ 'pfunc_time_too_big' => 'Σφάλμα: το #time υποστηÏίζει έτη μέχÏι το 9999.',
'pfunc_rel2abs_invalid_depth' => 'Σφάλμα: ΆκυÏο βάθος στη διαδÏομή: «$1» (έγινε Ï€Ïοσπάθεια για Ï€Ïόσβαση σε έναν κόμβο πάνω από τον Ïιζικό κόμβο)',
'pfunc_expr_stack_exhausted' => 'Σφάλμα έκφÏασης: Η στοίβα εξαντλήθηκε',
'pfunc_expr_unexpected_number' => 'Σφάλμα έκφÏασης: Μη αναμενόμενος αÏιθμός',
@@ -600,6 +702,14 @@ $messages['el'] = array(
'pfunc_string_too_long' => 'Σφάλμα: ο οÏμαθός υπεÏβαίνει $1 το ÏŒÏιο χαÏακτήÏων',
);
+/** British English (British English)
+ * @author Shirayuki
+ */
+$messages['en-gb'] = array(
+ 'pfunc_expr_unrecognised_word' => 'Expression error: Unrecognised word "$1".',
+ 'pfunc_expr_unrecognised_punctuation' => 'Expression error: Unrecognised punctuation character "$1".',
+);
+
/** Esperanto (Esperanto)
* @author Yekrats
*/
@@ -607,6 +717,7 @@ $messages['eo'] = array(
'pfunc_desc' => 'Etendi sintaksan analizilon kun logikaj funkcioj',
'pfunc_time_error' => 'Eraro: malvalida tempo',
'pfunc_time_too_long' => "Eraro: tro da vokoj ''#time''",
+ 'pfunc_time_too_big' => 'Eraro: #time nur subtenas jaroj Äis 9999.',
'pfunc_rel2abs_invalid_depth' => 'Eraro: Malvalida profundo en vojo: "$1" (provis atingi nodon super la radika nodo)',
'pfunc_expr_stack_exhausted' => 'Esprima eraro: Stako estis malplenigita',
'pfunc_expr_unexpected_number' => 'Esprima eraro: Neatendita numeralo',
@@ -661,7 +772,21 @@ $messages['es'] = array(
$messages['et'] = array(
'pfunc_desc' => 'Laiendab parserit loogiliste funktsioonidega.',
'pfunc_time_error' => 'Tõrge: Vigane aeg',
+ 'pfunc_time_too_long' => 'Tõrge: Liiga palju #time-kutseid.',
+ 'pfunc_time_too_big' => 'Tõrge: #time toetab vaid aastaid kuni väärtuseni 9999.',
+ 'pfunc_expr_unexpected_number' => 'Avaldistõrge: Ootamatu number',
+ 'pfunc_expr_unrecognised_word' => 'Avaldistõrge: Tundmatu sõna "$1"',
+ 'pfunc_expr_unexpected_operator' => 'Avaldistõrge: Ootamatu $1-tehtemärk',
+ 'pfunc_expr_missing_operand' => 'Avaldistõrge: Puudub $1-tehte operand',
+ 'pfunc_expr_unexpected_closing_bracket' => 'Avaldistõrge: Ootamatu lõpusulg',
+ 'pfunc_expr_unrecognised_punctuation' => 'Avaldistõrge: Tundmatu kirjavahemärk "$1"',
+ 'pfunc_expr_unclosed_bracket' => 'Avaldistõrge: sulgemata sulg',
'pfunc_expr_division_by_zero' => 'Nulliga jagamine',
+ 'pfunc_expr_invalid_argument' => 'Vigane $1-tehte argument: < -1 või > 1',
+ 'pfunc_expr_invalid_argument_ln' => 'Vigane ln-tehte argument: <= 0',
+ 'pfunc_expr_unknown_error' => 'Avaldistõrge: Tundmatu tõrge ($1).',
+ 'pfunc_expr_not_a_number' => '$1-tehtes: Vastus pole number',
+ 'pfunc_string_too_long' => 'Tõrge: Sõne ületab $1 märgi piirangu.',
);
/** Basque (euskara)
@@ -688,6 +813,7 @@ $messages['eu'] = array(
);
/** Persian (Ùارسی)
+ * @author Amire80
* @author Ebraminio
* @author Huji
* @author Wayiran
@@ -696,7 +822,7 @@ $messages['fa'] = array(
'pfunc_desc' => 'به تجزیه‌گر، دستورهای منطقی می‌اÙزاید',
'pfunc_time_error' => 'خطا: زمان غیرمجاز',
'pfunc_time_too_long' => 'خطا: Ùراخوانی بیش از حد #time',
- 'pfunc_time_too_big' => 'خطا: <span style="direction: ltr; unicode-bidi: bidi-override;">#time</span> تا سال Û¹Û¹Û¹Û¹ را Ùقط حمایت می‌کند.',
+ 'pfunc_time_too_big' => 'خطا: #زمان تا سال Û¹Û¹Û¹Û¹ را Ùقط حمایت می‌کند.',
'pfunc_rel2abs_invalid_depth' => 'خطا: عمق غیر مجاز در نشانی «$1» (تلاش برای دسترسی به یک نشانی Ùراتر از نشانی ریشه)',
'pfunc_expr_stack_exhausted' => 'خطای عبارت: پشته از دست رÙته',
'pfunc_expr_unexpected_number' => 'خطای عبارت: عدد دور از انتظار',
@@ -719,15 +845,17 @@ $messages['fa'] = array(
* @author Agony
* @author Cimon Avaro
* @author Nike
+ * @author VezonThunder
*/
$messages['fi'] = array(
'pfunc_desc' => 'Laajentaa jäsennintä loogisilla funktiolla.',
'pfunc_time_error' => 'Virhe: kelvoton aika',
'pfunc_time_too_long' => 'Virhe: liian monta #time-kutsua',
+ 'pfunc_time_too_big' => 'Virhe: #time tukee vuosilukuja vain vuoteen 9999 asti.',
'pfunc_rel2abs_invalid_depth' => 'Virhe: Virheellinen syvyys polussa: $1 (ei juurisolmun sisällä)',
'pfunc_expr_stack_exhausted' => 'Virhe lausekkeessa: pino loppui',
'pfunc_expr_unexpected_number' => 'Virhe lausekkeessa: odottamaton numero',
- 'pfunc_expr_preg_match_failure' => 'Virhe lausekkeessa: <tt>preg_match</tt> palautti virheen',
+ 'pfunc_expr_preg_match_failure' => 'Virhe lausekkeessa: preg_match palautti virheen',
'pfunc_expr_unrecognised_word' => 'Virhe lausekkeessa: tunnistamaton sana â€$1â€',
'pfunc_expr_unexpected_operator' => 'Virhe lausekkeessa: odottamaton $1-operaattori',
'pfunc_expr_missing_operand' => 'Virhe lausekkeessa: operaattorin $1 edellyttämä operandi puuttuu',
@@ -756,12 +884,13 @@ $messages['fi'] = array(
$messages['fr'] = array(
'pfunc_desc' => 'Améliore l’analyseur syntaxique avec des fonctions logiques',
'pfunc_time_error' => 'Erreur : durée invalide.',
- 'pfunc_time_too_long' => 'Erreur : appels trop nombreux à <code>#time</code>.',
+ 'pfunc_time_too_long' => 'Erreur : appels trop nombreux à #time.',
'pfunc_time_too_big' => 'Erreur : #time prend uniquement en charge des années jusqu’à 9999.',
+ 'pfunc_time_too_small' => 'Erreur : #time prend uniquement en charge les années à partir de 0.',
'pfunc_rel2abs_invalid_depth' => 'Erreur : profondeur invalide dans le chemin « $1 » (a essayé d’accéder à un niveau au-dessus du nœud racine).',
'pfunc_expr_stack_exhausted' => 'Erreur d’expression : pile épuisée.',
'pfunc_expr_unexpected_number' => 'Erreur d’expression : nombre inattendu.',
- 'pfunc_expr_preg_match_failure' => 'Erreur d’expression : échec inattendu de <code>preg_match</code>.',
+ 'pfunc_expr_preg_match_failure' => 'Erreur d’expression : échec inattendu de preg_match.',
'pfunc_expr_unrecognised_word' => 'Erreur d’expression : mot « $1 » non reconnu.',
'pfunc_expr_unexpected_operator' => "Erreur d’expression : opérateur '''$1''' inattendu.",
'pfunc_expr_missing_operand' => "Erreur d’expression : opérande manquant pour '''$1'''.",
@@ -782,14 +911,14 @@ $messages['fr'] = array(
$messages['frp'] = array(
'pfunc_desc' => 'Mèlyore lo parsor avouéc des fonccions logiques.',
'pfunc_time_error' => 'Èrror : temps envalido',
- 'pfunc_time_too_long' => 'Èrror : trop grant nombro d’apèls a <code>#time</code>',
+ 'pfunc_time_too_long' => 'Èrror : trop grant nombro d’apèls a #time',
'pfunc_rel2abs_invalid_depth' => 'Èrror : provondior envalida dens lo chemin « $1 » (at tâchiê d’arrevar a un nivél en-dessus du nuod racena)',
'pfunc_expr_stack_exhausted' => 'Èrror d’èxprèssion : pila èpouesiê',
'pfunc_expr_unexpected_number' => 'Èrror d’èxprèssion : nombro emprèvu',
- 'pfunc_expr_preg_match_failure' => 'Èrror d’èxprèssion : falyita emprèvua de <code>preg_match</code>',
+ 'pfunc_expr_preg_match_failure' => 'Èrror d’èxprèssion : falyita emprèvua de preg_match',
'pfunc_expr_unrecognised_word' => 'Èrror d’èxprèssion : mot « $1 » pas recognu',
'pfunc_expr_unexpected_operator' => 'Èrror d’èxprèssion : opèrator « $1 » emprèvu',
- 'pfunc_expr_missing_operand' => 'Èrror d’èxprèssion : opèrando manquent por « $1 »',
+ 'pfunc_expr_missing_operand' => 'Fôta d’èxprèssion : opèrando manquent por « $1 ».',
'pfunc_expr_unexpected_closing_bracket' => 'Èrror d’èxprèssion : parentèsa cllosenta emprèvua',
'pfunc_expr_unrecognised_punctuation' => 'Èrror d’èxprèssion : caractèro de ponctuacion « $1 » pas recognu',
'pfunc_expr_unclosed_bracket' => 'Èrror d’èxprèssion : parentèsa pas cllôsa',
@@ -812,6 +941,7 @@ $messages['gl'] = array(
'pfunc_time_error' => 'Erro: Hora non válida.',
'pfunc_time_too_long' => 'Erro: Demasiadas chamadas #time.',
'pfunc_time_too_big' => 'Erro: #time só permite anos ata o 9999.',
+ 'pfunc_time_too_small' => 'Erro: #time só permite anos desde o 0.',
'pfunc_rel2abs_invalid_depth' => 'Erro: Profundidade da ruta non válida: "$1" (intentouse acceder a un nodo por riba do nodo raíz).',
'pfunc_expr_stack_exhausted' => 'Erro de expresión: Pila esgotada.',
'pfunc_expr_unexpected_number' => 'Erro de expresión: Número inesperado.',
@@ -850,8 +980,8 @@ $messages['gsw'] = array(
'pfunc_expr_unexpected_number' => 'Expression-Fähler: Nit erwarteti Zahl',
'pfunc_expr_preg_match_failure' => 'Expression-Fähler: Nit erwarteti „preg_match“-Fählfunktion',
'pfunc_expr_unrecognised_word' => 'Expression-Fähler: Nit erkannt Wort „$1“',
- 'pfunc_expr_unexpected_operator' => 'Expression-Fähler: Nit erwartete Operator: <tt>$1</tt>',
- 'pfunc_expr_missing_operand' => 'Expression-Fähler: Operand fir <tt>$1</tt> fählt',
+ 'pfunc_expr_unexpected_operator' => 'Expression-Fähler: Nit erwartete Operator: $1',
+ 'pfunc_expr_missing_operand' => 'Expression-Fähler: Operand fir $1 fählt',
'pfunc_expr_unexpected_closing_bracket' => 'Expression-Fähler: Nit erwarteti schließendi eckigi Chlammere',
'pfunc_expr_unrecognised_punctuation' => 'Expression-Fähler: Nit erkannt Satzzeiche „$1“',
'pfunc_expr_unclosed_bracket' => 'Expression-Fähler: Nit gschlosseni eckige Chlammere',
@@ -871,6 +1001,7 @@ $messages['he'] = array(
'pfunc_time_error' => 'שגי××”: זמן שגוי',
'pfunc_time_too_long' => 'שגי××”: שימוש ב"#זמן" ×¤×¢×ž×™× ×¨×‘×•×ª מדי',
'pfunc_time_too_big' => 'שגי××”: #זמן תומכת רק ×‘×©× ×™× ×¢×“ 9999',
+ 'pfunc_time_too_small' => 'שגי××”: הפונקציה #time תומכת ר ×‘×©× ×™× ×žÖ¾0',
'pfunc_rel2abs_invalid_depth' => 'שגי××”: עומק שגוי בנתיב: "$1" (ניסיון כניסה לצומת מעל צומת השורש)',
'pfunc_expr_stack_exhausted' => 'שגי××” בביטוי: המחסנית מל××”',
'pfunc_expr_unexpected_number' => 'שגי××” בביטוי: מספר בלתי צפוי',
@@ -1067,7 +1198,8 @@ $messages['it'] = array(
'pfunc_desc' => 'Aggiunge al parser una serie di funzioni logiche',
'pfunc_time_error' => 'Errore: orario non valido',
'pfunc_time_too_long' => 'Errore: troppe chiamate a #time',
- 'pfunc_time_too_big' => "Errore: #time supporta solo fino all'anno 9999",
+ 'pfunc_time_too_big' => "Errore: #time supporta solo fino all'anno 9999.",
+ 'pfunc_time_too_small' => "Errore: #time supporta solo dall'anno 0.",
'pfunc_rel2abs_invalid_depth' => 'Errore: profondità non valida nel percorso "$1" (si è tentato di accedere a un nodo superiore alla radice)',
'pfunc_expr_stack_exhausted' => "Errore nell'espressione: stack esaurito",
'pfunc_expr_unexpected_number' => "Errore nell'espressione: numero inatteso",
@@ -1096,14 +1228,15 @@ $messages['it'] = array(
*/
$messages['ja'] = array(
'pfunc_desc' => 'パーサーã«è«–ç†é–¢æ•°ã‚’追加ã—ã¦æ‹¡å¼µã™ã‚‹',
- 'pfunc_time_error' => 'エラー: 時刻ãŒç„¡åŠ¹ã§ã™ã€‚',
+ 'pfunc_time_error' => 'エラー: 日時ãŒç„¡åŠ¹ã§ã™ã€‚',
'pfunc_time_too_long' => 'エラー: #time ã®å‘¼ã³å‡ºã—ãŒå¤šã™ãŽã¾ã™ã€‚',
'pfunc_time_too_big' => 'エラー: #time ãŒå¯¾å¿œã—ã¦ã„ã‚‹ã®ã¯ 9999 å¹´ã¾ã§ã§ã™ã€‚',
+ 'pfunc_time_too_small' => 'エラー: #time ãŒå¯¾å¿œã—ã¦ã„ã‚‹ã®ã¯ 0 年以é™ã§ã™ã€‚',
'pfunc_rel2abs_invalid_depth' => 'エラー: パス「$1ã€ã®éšŽå±¤ãŒç„¡åŠ¹ã§ã™ (ルート階層ã‹ã‚‰ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ãŠè©¦ã—ãã ã•ã„)。',
'pfunc_expr_stack_exhausted' => '構文エラー: スタックを使ã„æžœãŸã—ã¾ã—ãŸã€‚',
'pfunc_expr_unexpected_number' => '構文エラー: 予期ã—ãªã„æ•°å­—ã§ã™ã€‚',
'pfunc_expr_preg_match_failure' => '構文エラー: preg_match ã§äºˆæœŸã—ãªã„失敗をã—ã¾ã—ãŸã€‚',
- 'pfunc_expr_unrecognised_word' => '構文エラー: 「$1ã€ã‚’èªè­˜ã§ãã¾ã›ã‚“。',
+ 'pfunc_expr_unrecognised_word' => '構文エラー:「$1ã€ã‚’èªè­˜ã§ãã¾ã›ã‚“。',
'pfunc_expr_unexpected_operator' => '構文エラー: 予期ã—ãªã„æ¼”ç®—å­ $1 ã§ã™ã€‚',
'pfunc_expr_missing_operand' => '構文エラー: $1 ã®æ¼”算対象ãŒã‚ã‚Šã¾ã›ã‚“。',
'pfunc_expr_unexpected_closing_bracket' => '構文エラー: 予期ã—ãªã„é–‰ã˜æ‹¬å¼§ã§ã™ã€‚',
@@ -1143,13 +1276,28 @@ $messages['jv'] = array(
/** Georgian (ქáƒáƒ áƒ—ული)
* @author BRUTE
+ * @author David1010
* @author Dawid Deutschland
*/
$messages['ka'] = array(
+ 'pfunc_desc' => 'გáƒáƒ£áƒ›áƒ¯áƒ”ბესებული სინტáƒáƒ¥áƒ¡áƒ£áƒ áƒ˜ áƒáƒœáƒáƒšáƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜ ლáƒáƒ’იკური ფუნქციებით',
'pfunc_time_error' => 'შეცდáƒáƒ›áƒ: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ დრáƒ',
+ 'pfunc_time_too_long' => 'შეცდáƒáƒ›áƒ: #time ფუნქციის ძáƒáƒšáƒ˜áƒáƒœ ბევრი გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბáƒ.',
+ 'pfunc_time_too_big' => 'შეცდáƒáƒ›áƒ: პáƒáƒ áƒáƒ›áƒ”ტრი #time áƒáƒ  უნდრáƒáƒ­áƒáƒ áƒ‘ებდეს 9999.',
+ 'pfunc_rel2abs_invalid_depth' => 'შეცდáƒáƒ›áƒ: გზის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიღრმე: „$1“ (კვáƒáƒœáƒ«áƒ—áƒáƒœ წვდáƒáƒ›áƒ˜áƒ¡ ცდáƒ, რáƒáƒ›áƒ”ლიც მდებáƒáƒ áƒ”áƒáƒ‘ს უფრრმáƒáƒ¦áƒšáƒ, ვიდრე ძირეული)',
+ 'pfunc_expr_stack_exhausted' => 'ექსპრესიის შეცდáƒáƒ›áƒ: დáƒáƒ¡áƒ¢áƒ გáƒáƒ“áƒáƒ•áƒ¡áƒ”ბულიáƒ.',
+ 'pfunc_expr_unexpected_number' => 'ექსპრესიის შეცდáƒáƒ›áƒ: მáƒáƒ£áƒšáƒáƒ“ნელი რიცხვი.',
+ 'pfunc_expr_preg_match_failure' => 'ექსპრესიის შეცდáƒáƒ›áƒ: მáƒáƒ£áƒšáƒáƒ“ნელი preg_match წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბლáƒáƒ‘áƒ.',
+ 'pfunc_expr_unrecognised_word' => 'ექსპესიის შეცდáƒáƒ›áƒ: áƒáƒ›áƒáƒ£áƒªáƒœáƒáƒ‘ი სიტყვრ„$1“.',
+ 'pfunc_expr_unexpected_operator' => 'ექსპრესიის შეცდáƒáƒ›áƒ: მáƒáƒ£áƒšáƒáƒ“ნელი $1 áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜.',
+ 'pfunc_expr_missing_operand' => 'ექსპრესიის შეცდáƒáƒ›áƒ: დáƒáƒ˜áƒ™áƒáƒ áƒ’რáƒáƒžáƒ”რáƒáƒœáƒ“ი $1-თვის.',
+ 'pfunc_expr_unexpected_closing_bracket' => 'ექსპრესიის შეცდáƒáƒ›áƒ: მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ ფრჩხილი.',
+ 'pfunc_expr_unrecognised_punctuation' => 'ექსპრესიის შეცდáƒáƒ›áƒ: áƒáƒ›áƒáƒ£áƒªáƒœáƒáƒ‘ი პუნქტუáƒáƒªáƒ˜áƒ˜áƒ¡ ნიშáƒáƒœáƒ˜ „$1“.',
+ 'pfunc_expr_unclosed_bracket' => 'ექსპესიის შეცდáƒáƒ›áƒ: დáƒáƒ£áƒ®áƒ£áƒ áƒáƒ•áƒ˜ ფრჩხილი.',
'pfunc_expr_division_by_zero' => 'გáƒáƒ§áƒáƒ¤áƒ ნულით',
'pfunc_expr_invalid_argument' => 'მცდáƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი $1: < -1 áƒáƒœ > 1',
'pfunc_expr_invalid_argument_ln' => 'მცდáƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი ln: <= 0',
+ 'pfunc_expr_unknown_error' => 'ექსპრესიის შეცდáƒáƒ›áƒ: უცნáƒáƒ‘ი შეცდáƒáƒ›áƒ ($1).',
'pfunc_expr_not_a_number' => '$1: შედექში ციფრი áƒáƒ áƒáƒ',
'pfunc_string_too_long' => 'შეცდáƒáƒ›áƒ: სტრიქáƒáƒœáƒ˜áƒ¡ ზáƒáƒ›áƒ áƒáƒ¦áƒ”მáƒáƒ¢áƒ”ბრ$1 სიმბáƒáƒšáƒáƒ¡ ლიმიტს',
);
@@ -1230,43 +1378,46 @@ $messages['km'] = array(
* @author Kwj2772
* @author ToePeu
* @author Yknok29
+ * @author ì•„ë¼
*/
$messages['ko'] = array(
- 'pfunc_desc' => 'íŒŒì„œì— ë…¼ë¦¬ 함수를 추가',
+ 'pfunc_desc' => 'íŒŒì„œì— ë…¼ë¦¬ 함수를 추가합니다',
'pfunc_time_error' => '오류: ì‹œê°„ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤.',
'pfunc_time_too_long' => '오류: #timeì„ ë„ˆë¬´ ë§Žì´ ì¼ìŠµë‹ˆë‹¤.',
'pfunc_time_too_big' => '오류: #time 함수는 9999ë…„ê¹Œì§€ë§Œì„ ì§€ì›í•©ë‹ˆë‹¤.',
+ 'pfunc_time_too_small' => '오류: #timeì€ 0년부터만 지ì›í•©ë‹ˆë‹¤.',
'pfunc_rel2abs_invalid_depth' => '오류: 경로 구조가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤: "$1" (루트 노드 ìœ„ì˜ ë…¸ë“œì— ì ‘ì†ì„ ì‹œë„했습니다)',
'pfunc_expr_stack_exhausted' => '표현 오류: 스íƒì´ 비어 있습니다.',
- 'pfunc_expr_unexpected_number' => 'í‘œí˜„ì‹ ì˜¤ë¥˜: 예ìƒì¹˜ 못한 ê°’',
- 'pfunc_expr_preg_match_failure' => 'í‘œí˜„ì‹ ì˜¤ë¥˜: 예ìƒì¹˜ 못한 preg_match 오류',
- 'pfunc_expr_unrecognised_word' => 'í‘œí˜„ì‹ ì˜¤ë¥˜: ì•Œ 수 없는 단어 ‘$1’',
- 'pfunc_expr_unexpected_operator' => '표현 오류: ìž˜ëª»ëœ $1 ì—°ì‚°ìž',
+ 'pfunc_expr_unexpected_number' => 'í‘œí˜„ì‹ ì˜¤ë¥˜: 예ìƒì¹˜ 못한 숫ìžìž…니다.',
+ 'pfunc_expr_preg_match_failure' => 'í‘œí˜„ì‹ ì˜¤ë¥˜: 예ìƒì¹˜ 못한 preg_match 실패입니다.',
+ 'pfunc_expr_unrecognised_word' => 'í‘œí˜„ì‹ ì˜¤ë¥˜: "$1" 낱ë§ì„ ì•Œ 수 없습니다.',
+ 'pfunc_expr_unexpected_operator' => '표현 오류: 예ìƒì¹˜ 못한 $1 ì—°ì‚°ìžìž…니다.',
'pfunc_expr_missing_operand' => '표현 오류: $1ì˜ í”¼ì—°ì‚°ìžê°€ 없습니다.',
- 'pfunc_expr_unexpected_closing_bracket' => '표현 오류: 예ìƒì¹˜ 못한 괄호 닫기',
- 'pfunc_expr_unrecognised_punctuation' => '표현 오류: ì•Œ 수 없는 ë¬¸ìž "$1"',
+ 'pfunc_expr_unexpected_closing_bracket' => '표현 오류: 예ìƒì¹˜ 못한 괄호 닫기입니다.',
+ 'pfunc_expr_unrecognised_punctuation' => '표현 오류: ì•Œ 수 없는 "$1" 구ë‘ì  ë¬¸ìžìž…니다.',
'pfunc_expr_unclosed_bracket' => '표현 오류: 괄호를 닫지 않았습니다.',
- 'pfunc_expr_division_by_zero' => '0으로 나눔',
+ 'pfunc_expr_division_by_zero' => '0으로 나눴습니다.',
'pfunc_expr_invalid_argument' => '$1 í•¨ìˆ˜ì˜ ë³€ìˆ˜ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤: < -1 ë˜ëŠ” > 1',
'pfunc_expr_invalid_argument_ln' => 'ìžì—°ë¡œê·¸ì˜ 진수가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤: <= 0',
- 'pfunc_expr_unknown_error' => '표현 오류: 알려지지 ì•Šì€ ì˜¤ë¥˜ ($1)',
+ 'pfunc_expr_unknown_error' => '표현 오류: 알 수 없는 오류($1)입니다.',
'pfunc_expr_not_a_number' => '$1: 결과가 숫ìžê°€ 아닙니다.',
'pfunc_string_too_long' => '오류: $1ìž ì œí•œì„ ì´ˆê³¼í•˜ì˜€ìŠµë‹ˆë‹¤.',
);
/** Colognian (Ripoarisch)
+ * @author Amire80
* @author Purodha
* @author Rentenirer
*/
$messages['ksh'] = array(
'pfunc_desc' => 'Deit em Wiki Funxione för Entscheidunge un esu jät dobei.',
'pfunc_time_error' => 'Fähler: Onjöltijje Zick.',
- 'pfunc_time_too_long' => 'Fähler: <code>#time</code> weed zo öff jebruch.',
- 'pfunc_time_too_big' => 'Ene Fähleres opjefalle: <code lang="en">#time</code> kann bloß bes nohm Johr 9999 jonn.',
+ 'pfunc_time_too_long' => 'Fähler: #time weed zo öff jebruch.',
+ 'pfunc_time_too_big' => 'Ene Fähleres opjefalle: #time kann bloß bes nohm Johr 9999 jonn.',
'pfunc_rel2abs_invalid_depth' => 'Fähler: Zo fill „retuur“ em Pahdt „$1“ — mer wöre wigger wi för der Aanfang zeröck jejange.',
- 'pfunc_expr_stack_exhausted' => 'Fähler en enem Ußdrock: Dä löht der <i lang="en">stack</i> övverloufe.',
+ 'pfunc_expr_stack_exhausted' => 'Fähler en enem Ußdrock: Dä löht der stack övverloufe.',
'pfunc_expr_unexpected_number' => 'Fähler en enem Ußdrock: En Zahl dom_mer nit äwaade.',
- 'pfunc_expr_preg_match_failure' => 'Fähler en enem Ußdrock: Esu ene Fähler en „<i lang="en">preg_match</i>“ dum_mer nit äwade.',
+ 'pfunc_expr_preg_match_failure' => 'Fähler en enem Ußdrock: Esu ene Fähler en „preg_match“ dum_mer nit äwade.',
'pfunc_expr_unrecognised_word' => 'Fähler en enem Ußdrock: Dat Woot „$1“ es unbikannt.',
'pfunc_expr_unexpected_operator' => 'Fähler en enem Ußdrock: Dat Räschezeiche „$1“ dom_mer hee nit äwaade.',
'pfunc_expr_missing_operand' => 'Fähler en enem Ußdrock: För dat Räschezeiche „$1“ dom_mer ävver ene Operand äwaade.',
@@ -1274,10 +1425,10 @@ $messages['ksh'] = array(
'pfunc_expr_unrecognised_punctuation' => 'Fähler en enem Ußdrock: Dat Satzzeiche „$1“ dom_mer esu nit äwaade.',
'pfunc_expr_unclosed_bracket' => 'Fähler en enem Ußdrock: Do fählt en eckijje Klammer-Zoh.',
'pfunc_expr_division_by_zero' => 'Fähler en enem Ußdrock: Dorsch Noll jedeilt.',
- 'pfunc_expr_invalid_argument' => 'Fähler: Dä Parrameeter för <code>$1</code> moß -1 udder 1 sin, udder dozwesche lijje.',
- 'pfunc_expr_invalid_argument_ln' => 'Fähler: Dä Parrameeter för <code>ln</code> moß 0 udder kleiner wi 0 sin.',
+ 'pfunc_expr_invalid_argument' => 'Fähler: Dä Parrameeter för $1 moß -1 udder 1 sin, udder dozwesche lijje.',
+ 'pfunc_expr_invalid_argument_ln' => 'Fähler: Dä Parrameeter för ln moß 0 udder kleiner wi 0 sin.',
'pfunc_expr_unknown_error' => 'Fähler en enem Ußdrock: Unbikannt ($1)',
- 'pfunc_expr_not_a_number' => 'Fähler en enem Ußdrock: En <code>$1</code> es dat wat erus kütt kein Zahl.',
+ 'pfunc_expr_not_a_number' => 'Fähler en enem Ußdrock: En $1 es dat wat erus kütt kein Zahl.',
'pfunc_string_too_long' => 'Fähler en enem Ußdrock: En Zeijshereih es länger wi $1 Zeijshe.',
);
@@ -1292,8 +1443,8 @@ $messages['lb'] = array(
'pfunc_expr_stack_exhausted' => 'Expressiouns-Feeler: Stack iwwergelaf',
'pfunc_expr_unexpected_number' => 'Expressiouns-Feeler: Onerwarten Zuel',
'pfunc_expr_unrecognised_word' => 'Expressiouns-Feeler: Onerkantent Wuert "$1"',
- 'pfunc_expr_unexpected_operator' => 'Expression-Feeler: Onerwarten Operateur: <tt>$1</tt>',
- 'pfunc_expr_missing_operand' => 'Expression-Feeler: Et feelt en Operand fir <tt>$1</tt>',
+ 'pfunc_expr_unexpected_operator' => 'Expression-Feeler: Onerwarten Operateur: $1',
+ 'pfunc_expr_missing_operand' => 'Expression-Feeler: Et feelt en Operand fir $1',
'pfunc_expr_unexpected_closing_bracket' => 'Expressiouns-Feeler: Onerwarte Klammer déi zougemaach gëtt',
'pfunc_expr_unrecognised_punctuation' => 'Expressiouns-Feeler: D\'Sazzeechen "$1" gouf net erkannt',
'pfunc_expr_unclosed_bracket' => 'Expressiouns-Feeler: Eckeg Klammer net zougemaach',
@@ -1356,6 +1507,7 @@ $messages['mk'] = array(
'pfunc_time_error' => 'Грешка: погрешен формат за време',
'pfunc_time_too_long' => 'Грешка: премногу повикувања на функцијата #time',
'pfunc_time_too_big' => 'Грешка: #time поддржува Ñамо години до 9999',
+ 'pfunc_time_too_small' => 'Грешка: #time поддржува Ñамо години од 0 натаму.',
'pfunc_rel2abs_invalid_depth' => 'Грешка: Ðеважечка длабочина во патеката: „$1“ (обид за приÑтап до јазол кој Ñе наоѓа повиÑоко од коренитиот)',
'pfunc_expr_stack_exhausted' => 'Грешка во изразот: Складот е преполн',
'pfunc_expr_unexpected_number' => 'Грешка во изразот: Ðеочекуван број',
@@ -1438,6 +1590,7 @@ $messages['ms'] = array(
'pfunc_time_error' => 'Ralat: waktu tidak sah',
'pfunc_time_too_long' => 'Ralat: terlalu banyak panggilan #time',
'pfunc_time_too_big' => 'Ralat: #time hanya menyokong tahun sehingga 9999',
+ 'pfunc_time_too_small' => 'Ralat: #time hanya menyokong tahun-tahun mulai 0.',
'pfunc_rel2abs_invalid_depth' => 'Ralat: Kedalaman tidak sah dalam laluan: "$1" (cubaan mencapai nod di atas nod induk)',
'pfunc_expr_stack_exhausted' => 'Ralat ungkapan: Tindanan tuntas',
'pfunc_expr_unexpected_number' => 'Ralat ungkapan: Nombor tidak dijangka',
@@ -1541,6 +1694,7 @@ $messages['nl'] = array(
'pfunc_time_error' => 'Fout: ongeldige tijd.',
'pfunc_time_too_long' => 'Fout: #time te vaak aangeroepen.',
'pfunc_time_too_big' => 'Fout: #time ondersteunt jaren tot maximaal 9999',
+ 'pfunc_time_too_small' => 'Fout: #time ondersteunt alleen jaren vanaf 0.',
'pfunc_rel2abs_invalid_depth' => 'Fout: ongeldige diepte in pad: "$1" (probeerde een node boven de stamnode aan te roepen).',
'pfunc_expr_stack_exhausted' => 'Fout in uitdrukking: stack uitgeput.',
'pfunc_expr_unexpected_number' => 'Fout in uitdrukking: onverwacht getal.',
@@ -1593,7 +1747,7 @@ $messages['nn'] = array(
* @author Jfblanc
*/
$messages['oc'] = array(
- 'pfunc_desc' => 'Augmenta lo parser amb de foncions logicas',
+ 'pfunc_desc' => 'Aumenta lo parser amb de foncions logicas',
'pfunc_time_error' => 'Error: durada invalida',
'pfunc_time_too_long' => 'Error: parser #time apelat tròp de còps',
'pfunc_rel2abs_invalid_depth' => 'Error: nivèl de repertòri invalid dins lo camin : "$1" (a ensajat d’accedir a un nivèl al-dessús del repertòri raiç)',
@@ -1614,10 +1768,38 @@ $messages['oc'] = array(
'pfunc_string_too_long' => 'Error : La cadena depassa lo limit maximal de $1 caractèr{{PLURAL:$1||s}}',
);
+/** Oriya (ଓଡ଼ିଆ)
+ * @author Jnanaranjan Sahu
+ */
+$messages['or'] = array(
+ 'pfunc_desc' => 'ପାରà­à¬¸à¬°à¬•à­ ଯà­à¬•à­à¬¤à¬¿à¬®à­‚ଳକ ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬¿à¬¤à¬¾ ଦେଇ ଉନà­à¬¨à¬¤ କରନà­à¬¤à­',
+ 'pfunc_time_error' => 'ଅସà­à¬¬à¬¿à¬§à¬¾: ଅବୈଧ ସମୟ ।',
+ 'pfunc_time_too_long' => 'ଅସà­à¬¬à¬¿à¬§à¬¾: ଅତà­à­Ÿà¬§à¬¿à¬• #time ଡକରା ।',
+ 'pfunc_time_too_big' => 'ଅସà­à¬¬à¬¿à¬§à¬¾: #time କେବଳ 9999ବରà­à¬· ପରà­à¬¯à­à­Ÿà¬¨à­à¬¤ ଭିତରେ ରହିପାରିବ ।',
+ 'pfunc_rel2abs_invalid_depth' => 'ଅସà­à¬¬à¬¿à¬§à¬¾: "$1" ପଥରେ ଅଜଣା ଦୂରତା (ମୂଳ ନୋଡ ଠାରୠଆହà­à¬°à¬¿ ଭିତରକୠଯିବାକୠଚେଷà­à¬Ÿà¬¾ କରà­à¬›à¬¿) ।',
+ 'pfunc_expr_stack_exhausted' => 'ପà­à¬°à¬•à¬¾à¬¶à¬¨à¬°à­‡ ଅସà­à¬¬à¬¿à¬§à¬¾: ଷà­à¬Ÿà¬¾à¬• ପୂରà­à¬£ ହୋଇଗଲା ।',
+ 'pfunc_expr_unexpected_number' => 'ପà­à¬°à¬•à¬¾à¬¶à¬¨à¬°à­‡ ଅସà­à¬¬à¬¿à¬§à¬¾: ଅଜଣା ସଂଖà­à­Ÿà¬¾ ।',
+ 'pfunc_expr_preg_match_failure' => 'ପà­à¬°à¬•à¬¾à¬¶à¬¨à¬°à­‡ ଅସà­à¬¬à¬¿à¬§à¬¾: ଅଜଣା ପà­à¬°à­‡à¬—_ମିଳନରେ ଅସà­à¬¬à¬¿à¬§à¬¾ ।',
+ 'pfunc_expr_unrecognised_word' => 'ପà­à¬°à¬•à¬¾à¬¶à¬¨à¬°à­‡ ଅସà­à¬¬à¬¿à¬§à¬¾: ଅଜଣା ଶବà­à¬¦ "$1"',
+ 'pfunc_expr_unexpected_operator' => 'ପà­à¬°à¬•à¬¾à¬¶à¬¨à¬°à­‡ ଅସà­à¬¬à¬¿à¬§à¬¾: ଅଜଣା $1 ଯà­à¬•à­à¬¤à¬¾à¬•à­à¬·à¬° ।',
+ 'pfunc_expr_missing_operand' => 'ପà­à¬°à¬•à¬¾à¬¶à¬¨à¬°à­‡ ଅସà­à¬¬à¬¿à¬§à¬¾: $1 ପାଇଠଅକà­à¬·à¬° ନାହିଠ।',
+ 'pfunc_expr_unexpected_closing_bracket' => 'ପà­à¬°à¬•à¬¾à¬¶à¬¨à¬°à­‡ ଅସà­à¬¬à¬¿à¬§à¬¾: ଅଜଣା ବନà­à¬§à¬¨à­€ ।',
+ 'pfunc_expr_unrecognised_punctuation' => 'ପà­à¬°à¬•à¬¾à¬¶à¬¨à¬°à­‡ ଅସà­à¬¬à¬¿à¬§à¬¾: ଅଜଣା ଚିହà­à¬¨ "$1" ।',
+ 'pfunc_expr_unclosed_bracket' => 'ପà­à¬°à¬•à¬¾à¬¶à¬¨à¬°à­‡ ଅସà­à¬¬à¬¿à¬§à¬¾: ବନà­à¬§à¬¨à­€ ଶେଷ ହୋଇନାହିଠ।',
+ 'pfunc_expr_division_by_zero' => 'ଶà­à¬¨ ଦà­à¬µà¬¾à¬°à¬¾ ଭାଗ ।',
+ 'pfunc_expr_invalid_argument' => '$1 ପାଇଠଅବୈଧ ଯà­à¬•à­à¬¤à¬¿:< -à­§ କିମà­à¬¬à¬¾ > à­§ ।',
+ 'pfunc_expr_invalid_argument_ln' => 'ln ପାଇଠଅବୈଧ ଲେଖା: <= 0 ।',
+ 'pfunc_expr_unknown_error' => 'ପà­à¬°à¬•à¬¾à¬¶à¬¨à¬°à­‡ ଅସà­à¬¬à¬¿à¬§à¬¾: ଅଜଣା ଅସà­à¬¬à¬¿à¬§à¬¾ ($1) ।',
+ 'pfunc_expr_not_a_number' => '$1ରେ: ଫଳାଫଳଟି ସଂଖà­à­Ÿà¬¾ ନà­à¬¹à­‡à¬ ।',
+ 'pfunc_string_too_long' => 'ଅସà­à¬¬à¬¿à¬§à¬¾: ଧାଡିଟି $1 ଅକà­à¬·à¬° ସୀମାଠୠଅଧିକ ହେଲାଣି ।',
+);
+
/** Polish (polski)
+ * @author Chrumps
* @author Derbeth
* @author Grzechooo
* @author Sp5uhe
+ * @author WTM
* @author Woytecr
*/
$messages['pl'] = array(
@@ -1625,6 +1807,7 @@ $messages['pl'] = array(
'pfunc_time_error' => 'Błąd – niepoprawny czas',
'pfunc_time_too_long' => 'Błąd – zbyt wiele wywołań funkcji #time',
'pfunc_time_too_big' => 'Błąd – rok w #time nie może być większy niż 9999',
+ 'pfunc_time_too_small' => 'Błąd: #time obsługuje tylko lata od 0.',
'pfunc_rel2abs_invalid_depth' => 'Błąd – nieprawidłowa głębokość w ścieżce „$1†(próba dostępu do węzła powyżej korzenia)',
'pfunc_expr_stack_exhausted' => 'Błąd w wyrażeniu – stos wyczerpany',
'pfunc_expr_unexpected_number' => 'Błąd w wyrażeniu – nieoczekiwana liczba',
@@ -1803,6 +1986,7 @@ $messages['roa-tara'] = array(
'pfunc_time_error' => 'Errore: Orarie invalide',
'pfunc_time_too_long' => 'Errore: stonne troppe #time chiamate',
'pfunc_time_too_big' => "Errore: #time vole sulamende valore de anne 'mbonde a 9999",
+ 'pfunc_time_too_small' => "Errore: #time pigghie anne sulamende da 'u 0.",
'pfunc_rel2abs_invalid_depth' => "Errore: Profondità invalide jndr'à 'u percorse: \"\$1\" (s'à pruvate a pigghià 'nu node sus a 'u node radice)",
'pfunc_expr_stack_exhausted' => 'Espressione in errore: Stack anghiute',
'pfunc_expr_unexpected_number' => 'Espressione in errore: Numere inaspettate',
@@ -2091,8 +2275,8 @@ $messages['stq'] = array(
'pfunc_expr_unexpected_number' => 'Expression-Failer: Nit ferwachtede Taal',
'pfunc_expr_preg_match_failure' => 'Expression-Failer: Uunferwachtede „preg_match“-Failfunktion',
'pfunc_expr_unrecognised_word' => 'Expression-Failer: Nit wierkoand Woud „$1“',
- 'pfunc_expr_unexpected_operator' => 'Expression-Failer: Uunferwachteden Operator: <strong><tt>$1</tt></strong>',
- 'pfunc_expr_missing_operand' => 'Expression-Failer: Failenden Operand foar <strong><tt>$1</tt></strong>',
+ 'pfunc_expr_unexpected_operator' => 'Expression-Failer: Uunferwachteden Operator: $1',
+ 'pfunc_expr_missing_operand' => 'Expression-Failer: Failenden Operand foar $1',
'pfunc_expr_unexpected_closing_bracket' => 'Expression-Failer: Uunferwachte sluutende kaantige Klammere',
'pfunc_expr_unrecognised_punctuation' => 'Expression-Failer: Nit wierkoand Satsteeken „$1“',
'pfunc_expr_unclosed_bracket' => 'Expression-Failer: Nit sleetene kaantige Klammer',
@@ -2145,6 +2329,13 @@ $messages['sv'] = array(
'pfunc_string_too_long' => 'Fel: Strängen överskrider gränsen på $1 tecken',
);
+/** Tamil (தமிழà¯)
+ * @author Shanmugamp7
+ */
+$messages['ta'] = array(
+ 'pfunc_time_error' => 'பிழை: செலà¯à®²à®¾à®¤ நேரமà¯',
+);
+
/** Telugu (తెలà±à°—à±)
* @author Mpradeep
* @author Veeven
@@ -2309,14 +2500,23 @@ $messages['tr'] = array(
'pfunc_string_too_long' => 'Hata: Dize $1 karakter sınırını geçiyor',
);
+/** Uyghur (Arabic script) (ئۇيغۇرچە)
+ * @author Sahran
+ */
+$messages['ug-arab'] = array(
+ 'pfunc_expr_division_by_zero' => 'نۆلگە بۆلۈنگەن.',
+);
+
/** Ukrainian (українÑька)
* @author AS
* @author Ahonc
+ * @author Base
*/
$messages['uk'] = array(
'pfunc_desc' => 'Покращений ÑинтакÑичний аналізатор з логічними функціÑми',
'pfunc_time_error' => 'Помилка: неправильний чаÑ',
'pfunc_time_too_long' => 'Помилка: забагато викликів функції #time',
+ 'pfunc_time_too_big' => 'Помилка: Параметр #time підтримує роки лише до 9999.',
'pfunc_rel2abs_invalid_depth' => 'Помилка: неправильна глибина шлÑху: «$1» (Ñпроба доÑтупу до вузла, що знаходитьÑÑ Ð²Ð¸Ñ‰Ðµ, ніж кореневий)',
'pfunc_expr_stack_exhausted' => 'Помилка виразу: Ñтек переповнений',
'pfunc_expr_unexpected_number' => 'Помилка виразу: неочікуване чиÑло',
@@ -2337,11 +2537,14 @@ $messages['uk'] = array(
/** vèneto (vèneto)
* @author Candalua
+ * @author GatoSelvadego
*/
$messages['vec'] = array(
'pfunc_desc' => 'Zonta al parser na serie de funsion logiche',
'pfunc_time_error' => 'Eror: orario mìa valido',
'pfunc_time_too_long' => 'Eror: massa chiamate a #time',
+ 'pfunc_time_too_big' => 'Eror: #time suporta soło che fin al ano 9999',
+ 'pfunc_time_too_small' => "Eror: #time suporta soło che da l'ano 0.",
'pfunc_rel2abs_invalid_depth' => 'Eror: profondità mìa valida nel percorso "$1" (se gà proà a accédar a un nodo piassè sora de la raìsa)',
'pfunc_expr_stack_exhausted' => "Eror ne l'espression: stack esaurìo",
'pfunc_expr_unexpected_number' => "Eror ne l'espression: xe vegnù fora un nùmaro che no se se spetava",
@@ -2375,7 +2578,8 @@ $messages['vi'] = array(
'pfunc_desc' => 'Nâng cao bộ xử lý với những hàm cú pháp lôgic',
'pfunc_time_error' => 'Lá»—i: thá»i gian không hợp lệ',
'pfunc_time_too_long' => 'Lá»—i: quá nhiá»u lần gá»i #time',
- 'pfunc_time_too_big' => 'Lỗi: #time chỉ hỗ trợ các năm cho tới 9999',
+ 'pfunc_time_too_big' => 'Lỗi: #time chỉ hỗ trợ các năm cho tới 9999.',
+ 'pfunc_time_too_small' => 'Lỗi: #time chỉ hỗ trợ cho các năm 0 trở lên.',
'pfunc_rel2abs_invalid_depth' => 'Lá»—i: Ä‘á»™ sâu không hợp lệ trong Ä‘Æ°á»ng dẫn “$1†(do cố gắng truy cập nút phía trên nút gốc)',
'pfunc_expr_stack_exhausted' => 'Lá»—i biểu thức: Äã cạn stack',
'pfunc_expr_unexpected_number' => 'Lỗi biểu thức: Dư số',
@@ -2481,16 +2685,17 @@ $messages['zh-hans'] = array(
/** Traditional Chinese (中文(ç¹é«”)‎)
* @author Gaoxuewei
+ * @author Justincheng12345
* @author Liangent
* @author Mark85296341
* @author Shinjiman
* @author Waihorace
*/
$messages['zh-hant'] = array(
- 'pfunc_desc' => '用é‚輯函數加強解æžå™¨',
- 'pfunc_time_error' => '錯誤:無效時間',
- 'pfunc_time_too_long' => '錯誤:éŽå¤šçš„ #time 呼å«',
- 'pfunc_time_too_big' => '錯誤:#時間åªæ”¯æ´è‡³9999å¹´',
+ 'pfunc_desc' => '使用é‚輯函數加強解æžå™¨',
+ 'pfunc_time_error' => '錯誤:無效時間。',
+ 'pfunc_time_too_long' => '錯誤:éŽå¤š#time呼å«ã€‚',
+ 'pfunc_time_too_big' => '錯誤:#timeåªæ”¯æ´è‡³9999年。',
'pfunc_rel2abs_invalid_depth' => '錯誤:無效路徑深度:「$1ã€ï¼ˆå˜—試訪å•é ‚點以上節點)',
'pfunc_expr_stack_exhausted' => '表é”å¼éŒ¯èª¤ï¼šå †ç–Šè€—盡',
'pfunc_expr_unexpected_number' => '表é”å¼éŒ¯èª¤ï¼šæœªé æ–™çš„數字',
diff --git a/extensions/ParserFunctions/ParserFunctions.php b/extensions/ParserFunctions/ParserFunctions.php
index ef2ad8d3..4ef62047 100644
--- a/extensions/ParserFunctions/ParserFunctions.php
+++ b/extensions/ParserFunctions/ParserFunctions.php
@@ -33,7 +33,7 @@ $wgPFEnableStringFunctions = false;
$wgExtensionCredits['parserhook'][] = array(
'path' => __FILE__,
'name' => 'ParserFunctions',
- 'version' => '1.4.1',
+ 'version' => '1.5.1',
'url' => 'https://www.mediawiki.org/wiki/Extension:ParserFunctions',
'author' => array( 'Tim Starling', 'Robert Rohde', 'Ross McClure', 'Juraj Simlovic' ),
'descriptionmsg' => 'pfunc_desc',
@@ -41,6 +41,7 @@ $wgExtensionCredits['parserhook'][] = array(
$wgAutoloadClasses['ExtParserFunctions'] = dirname( __FILE__ ) . '/ParserFunctions_body.php';
$wgAutoloadClasses['ExprParser'] = dirname( __FILE__ ) . '/Expr.php';
+$wgAutoloadClasses['ExprError'] = dirname( __FILE__ ) . '/Expr.php';
$wgExtensionMessagesFiles['ParserFunctions'] = dirname( __FILE__ ) . '/ParserFunctions.i18n.php';
$wgExtensionMessagesFiles['ParserFunctionsMagic'] = dirname( __FILE__ ) . '/ParserFunctions.i18n.magic.php';
@@ -85,3 +86,14 @@ function wfRegisterParserFunctions( $parser ) {
return true;
}
+
+$wgHooks['UnitTestsList'][] = 'wfParserFunctionsTests';
+
+/**
+ * @param $files array
+ * @return bool
+ */
+function wfParserFunctionsTests( &$files ) {
+ $files[] = dirname( __FILE__ ) . '/tests/ExpressionTest.php';
+ return true;
+}
diff --git a/extensions/ParserFunctions/ParserFunctions_body.php b/extensions/ParserFunctions/ParserFunctions_body.php
index 879b7a15..967e8339 100644
--- a/extensions/ParserFunctions/ParserFunctions_body.php
+++ b/extensions/ParserFunctions/ParserFunctions_body.php
@@ -452,10 +452,10 @@ class ExtParserFunctions {
} else {
$tz = new DateTimeZone( date_default_timezone_get() );
}
- $dateObject->setTimezone( $tz );
} else {
- $dateObject->setTimezone( $utc );
+ $tz = $utc;
}
+ $dateObject->setTimezone( $tz );
# Generate timestamp
$ts = $dateObject->format( 'YmdHis' );
@@ -471,14 +471,16 @@ class ExtParserFunctions {
if ( self::$mTimeChars > self::$mMaxTimeChars ) {
return '<strong class="error">' . wfMessage( 'pfunc_time_too_long' )->inContentLanguage()->escaped() . '</strong>';
} else {
- if ( $ts < 100000000000000 ) { // Language can't deal with years after 9999
+ if ( $ts < 0 ) { // Language can't deal with BC years
+ return '<strong class="error">' . wfMessage( 'pfunc_time_too_small' )->inContentLanguage()->escaped() . '</strong>';
+ } elseif ( $ts < 100000000000000 ) { // Language can't deal with years after 9999
if ( $language !== '' && Language::isValidBuiltInCode( $language ) ) {
// use whatever language is passed as a parameter
$langObject = Language::factory( $language );
- $result = $langObject->sprintfDate( $format, $ts );
+ $result = $langObject->sprintfDate( $format, $ts, $tz );
} else {
// use wiki's content language
- $result = $parser->getFunctionLang()->sprintfDate( $format, $ts );
+ $result = $parser->getFunctionLang()->sprintfDate( $format, $ts, $tz );
}
} else {
return '<strong class="error">' . wfMessage( 'pfunc_time_too_big' )->inContentLanguage()->escaped() . '</strong>';
diff --git a/extensions/ParserFunctions/exprTests.txt b/extensions/ParserFunctions/exprTests.txt
deleted file mode 100644
index d842d462..00000000
--- a/extensions/ParserFunctions/exprTests.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-1 + 1 = 2
--1 + 1 = 0
-+1 + 1 = 2
-4 * 4 = 16
--4 * -4 = 4 * 4
-(1/3) * 3 = 1
-3 / 1.5 = 2
-3 mod 2 = 1
-1 or 0
-not (1 and 0)
-not 0
-4.0 round 0; 4
-ceil 4; 4
-floor 4; 4
-4.5 round 0; 5
-4.2 round 0; 4
--4.2 round 0; -4
--4.5 round 0; -5
--2.0 round 0; -2
-ceil -3; -3
-floor -6.0; -6
-ceil 4.2; 5
-ceil -4.5; -4
-floor -4.5; -5
-4 < 5
--5 < 2
--2 <= -2
-abs(-2); 2
-4 > 3
-4 > -3
-5 >= 2
-2 >= 2
-1 != 2
-not (1 != 1)
-1e4 = 10000
-1e-2 = 0.01
-ln(exp(1));1
-trunc(4.5);4
-trunc(-4.5);-4
diff --git a/extensions/ParserFunctions/funcsParserTests.txt b/extensions/ParserFunctions/funcsParserTests.txt
index a741836a..2ff7ba3d 100644
--- a/extensions/ParserFunctions/funcsParserTests.txt
+++ b/extensions/ParserFunctions/funcsParserTests.txt
@@ -94,6 +94,15 @@ Explicitely specified output language (Dutch)
!! end
!! test
+Preserve tags in #switch default value
+!! input
+{{#switch:a|b|<div>c</div>}}
+!! result
+<div>c</div>
+
+!! end
+
+!! test
Bug 19093: Default values don't fall through in switch
!! input
<{{#switch: foo | bar | #default = DEF }}>
@@ -211,3 +220,15 @@ Bug 22866: #ifexpr should evaluate "-0" as false
<p>false
</p>
!! end
+
+!! test
+Templates: Parser functions don't strip whitespace from positional parameters
+!! input
+{{#if: {{foo}}
+| no-pre-then
+| no-pre-else
+}}
+!! result
+<p>no-pre-then
+</p>
+!! end
diff --git a/extensions/ParserFunctions/testExpr.php b/extensions/ParserFunctions/testExpr.php
deleted file mode 100644
index b3336c53..00000000
--- a/extensions/ParserFunctions/testExpr.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-require_once ( getenv( 'MW_INSTALL_PATH' ) !== false
- ? getenv( 'MW_INSTALL_PATH' ) . "/maintenance/commandLine.inc"
- : dirname( __FILE__ ) . '/../../maintenance/commandLine.inc' );
-require( 'Expr.php' );
-
-$tests = file( 'exprTests.txt' );
-
-$pass = $fail = 0;
-
-// Each test is on one line. The test must always evaluate to '1'.
-$parser = new ExprParser;
-foreach ( $tests as $test ) {
- $test = trim( $test );
- if ( strpos( $test, ';' ) !== false )
- list( $input, $expected ) = explode( ';', $test );
- else {
- $input = $test;
- $expected = 1;
- }
-
- $expected = trim( $expected );
- $input = trim( $input );
-
- $result = $parser->doExpression( $input );
- if ( $result != $expected ) {
- print
- "FAILING test -- $input
- gave a final result of $result, instead of $expected.\n";
- $fail++;
- } else {
- print "PASSED test $test\n";
- $pass++;
- }
-}
-
-print "Passed $pass tests, failed $fail tests, out of a total of " . ( $pass + $fail ) . "\n"; \ No newline at end of file
diff --git a/extensions/PdfHandler/CreatePdfThumbnailsJob.class.php b/extensions/PdfHandler/CreatePdfThumbnailsJob.class.php
new file mode 100644
index 00000000..aba204f2
--- /dev/null
+++ b/extensions/PdfHandler/CreatePdfThumbnailsJob.class.php
@@ -0,0 +1,126 @@
+<?php
+
+class CreatePdfThumbnailsJob extends Job {
+ /**
+ * Flags for thumbnail jobs
+ */
+ const BIG_THUMB = 1;
+ const SMALL_THUMB = 2;
+
+ /**
+ * Construct a thumbnail job
+ *
+ * @param $title Title Title object
+ * @param $params array Associative array of options:
+ * page: page number for which the thumbnail will be created
+ * jobtype: CreatePDFThumbnailsJob::BIG_THUMB or CreatePDFThumbnailsJob::SMALL_THUMB
+ * BIG_THUMB will create a thumbnail visible for full thumbnail view,
+ * SMALL_THUMB will create a thumbnail shown in "previous page"/"next page" boxes
+ *
+ */
+ public function __construct( $title, $params ) {
+ parent::__construct( 'createPdfThumbnailsJob', $title, $params );
+ }
+
+ /**
+ * Run a thumbnail job on a given PDF file.
+ * @return bool true
+ */
+ public function run() {
+ if ( !isset( $this->params['page'] ) ) {
+ wfDebugLog('thumbnails', 'A page for thumbnails job of ' . $this->title->getText() . ' was not specified! That should never happen!');
+ return true; // no page set? that should never happen
+ }
+
+ $file = wfLocalFile( $this->title ); // we just want a local file
+ if ( !$file ) {
+ return true; // Just silently fail, perhaps the file was already deleted, don't bother
+ }
+
+ switch ($this->params['jobtype']) {
+ case self::BIG_THUMB:
+ global $wgImageLimits;
+ // Ignore user preferences, do default thumbnails
+ // everything here shamelessy copied and reused from includes/ImagePage.php
+ $sizeSel = User::getDefaultOption( 'imagesize' );
+
+ // The user offset might still be incorrect, specially if
+ // $wgImageLimits got changed (see bug #8858).
+ if ( !isset( $wgImageLimits[$sizeSel] ) ) {
+ // Default to the first offset in $wgImageLimits
+ $sizeSel = 0;
+ }
+ $max = $wgImageLimits[$sizeSel];
+ $maxWidth = $max[0];
+ $maxHeight = $max[1];
+
+ $width_orig = $file->getWidth( $this->params['page'] );
+ $width = $width_orig;
+ $height_orig = $file->getHeight( $this->params['page'] );
+ $height = $height_orig;
+ if ( $width > $maxWidth || $height > $maxHeight ) {
+ # Calculate the thumbnail size.
+ # First case, the limiting factor is the width, not the height.
+ if ( $width / $height >= $maxWidth / $maxHeight ) {
+ //$height = round( $height * $maxWidth / $width );
+ $width = $maxWidth;
+ # Note that $height <= $maxHeight now.
+ } else {
+ $newwidth = floor( $width * $maxHeight / $height );
+ //$height = round( $height * $newwidth / $width );
+ $width = $newwidth;
+ # Note that $height <= $maxHeight now, but might not be identical
+ # because of rounding.
+ }
+ $transformParams = array( 'page' => $this->params['page'], 'width' => $width );
+ $file->transform( $transformParams );
+ }
+ break;
+
+ case self::SMALL_THUMB:
+ Linker::makeThumbLinkObj( $this->title, $file, '', '', 'none', array( 'page' => $this->params['page'] ) );
+ break;
+ }
+
+ return true;
+ }
+
+ /**
+ * @param $upload UploadBase
+ * @param $mime
+ * @param $error
+ * @return bool
+ */
+ public static function insertJobs( $upload, $mime, &$error ) {
+ global $wgPdfCreateThumbnailsInJobQueue;
+ if ( !$wgPdfCreateThumbnailsInJobQueue ) {
+ return true;
+ }
+ if (!MimeMagic::singleton()->isMatchingExtension('pdf', $mime)) {
+ return true; // not a PDF, abort
+ }
+
+ $title = $upload->getTitle();
+ $uploadFile = $upload->getLocalFile();
+ if ( is_null( $uploadFile ) ) {
+ wfDebugLog('thumbnails', '$uploadFile seems to be null, should never happen...');
+ return true; // should never happen, but it's better to be secure
+ }
+
+ $metadata = $uploadFile->getMetadata();
+ $unserialized = unserialize( $metadata );
+ $pages = intval( $unserialized['Pages'] );
+
+ $jobs = array();
+ for ( $i = 1; $i <= $pages; $i++ ) {
+ $jobs[] = new CreatePdfThumbnailsJob( $title,
+ array( 'page' => $i, 'jobtype' => self::BIG_THUMB )
+ );
+ $jobs[] = new CreatePdfThumbnailsJob( $title,
+ array( 'page' => $i, 'jobtype' => self::SMALL_THUMB )
+ );
+ }
+ Job::batchInsert( $jobs );
+ return true;
+ }
+}
diff --git a/extensions/PdfHandler/PdfHandler.i18n.php b/extensions/PdfHandler/PdfHandler.i18n.php
new file mode 100644
index 00000000..391dfb91
--- /dev/null
+++ b/extensions/PdfHandler/PdfHandler.i18n.php
@@ -0,0 +1,1164 @@
+<?php
+/**
+ * Internationalisation file for extension PdfHandler.
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$messages = array();
+
+$messages['en'] = array(
+ 'pdf-desc' => 'Handler for viewing PDF files in image mode.',
+ 'pdf_no_metadata' => 'Cannot get metadata from PDF.',
+ 'pdf_page_error' => 'Page number not in range.',
+ 'exif-pdf-producer' => 'Conversion program',
+ 'exif-pdf-version' => 'Version of PDF format',
+ 'exif-pdf-encrypted' => 'Encrypted',
+ 'exif-pdf-pagesize' => 'Page size',
+);
+
+/** Message documentation (Message documentation)
+ * @author Purodha
+ * @author Shirayuki
+ * @author The Evil IP address
+ */
+$messages['qqq'] = array(
+ 'pdf-desc' => '{{desc|name=Pdf Handler|url=http://www.mediawiki.org/wiki/Extension:PdfHandler}}',
+ 'pdf_no_metadata' => 'Error message given when metadata cannot be retrieved from a PDF file',
+ 'pdf_page_error' => 'Error message given when a PDF does not have the requested page number',
+ 'exif-pdf-producer' => 'The label used in the metadata table at the bottom of the file description page for the program used to convert this PDF file into a PDF.
+
+This is separate from the program used to create the original file (Which is labeled by {{msg-mw|Exif-software}}).',
+ 'exif-pdf-version' => 'Label for the version of the pdf file format in the metadata table at the bottom of an image description page. Usually a number between 1.2 and 1.6',
+ 'exif-pdf-encrypted' => 'Label for field in metadata table at bottom of an image description page to denote if the PDF file is encrypted. The value of the field this references is either "no" (most common) or something like "yes (print:yes copy:no change:no addNotes:no)"',
+ 'exif-pdf-pagesize' => 'Label for the field in the metadata table at the bottom of an image description page to denote the size of the pages in the pdf. If there is more than one size of page used in this document, each size is listed once.',
+);
+
+/** Afrikaans (Afrikaans)
+ * @author Naudefj
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['af'] = array(
+ 'pdf-desc' => 'Handler vir die lees van PDF-lêers in beeld af',
+ 'pdf_no_metadata' => 'Kan nie metadata uit PDF kry nie',
+ 'pdf_page_error' => 'Bladsynommer kom nie in dokument voor nie',
+);
+
+/** Gheg Albanian (Gegë)
+ * @author Mdupont
+ */
+$messages['aln'] = array(
+ 'pdf-desc' => 'Mbajtës për shikimin PDF files në imazh mode',
+ 'pdf_no_metadata' => 'Nuk mund të merrni nga metadata PDF',
+ 'pdf_page_error' => 'numrin e faqes nuk është në varg',
+);
+
+/** Aragonese (aragonés)
+ * @author Juanpabl
+ */
+$messages['an'] = array(
+ 'pdf-desc' => 'Maneyador ta veyer fichers PDF en modo imachen',
+ 'pdf_no_metadata' => "No s'obtenioron metadatos d'o PDF",
+ 'pdf_page_error' => 'Numero de pachina difuera de rango',
+);
+
+/** Arabic (العربية)
+ * @author Meno25
+ * @author Mido
+ * @author أحمد
+ */
+$messages['ar'] = array(
+ 'pdf-desc' => 'معالج عرض ملÙات PDF ÙÙŠ طور الصور',
+ 'pdf_no_metadata' => 'تعذّر استخراج البيانات الÙوقية من مل٠PDF',
+ 'pdf_page_error' => 'رقم الصÙحة خارج عن النطاق',
+ 'exif-pdf-producer' => 'برمجية التحويل',
+ 'exif-pdf-version' => 'إصدارة صيغة PDF',
+ 'exif-pdf-encrypted' => 'Ù…Ùعمّى',
+ 'exif-pdf-pagesize' => 'حجم الصÙحة',
+);
+
+/** Egyptian Spoken Arabic (مصرى)
+ * @author Meno25
+ */
+$messages['arz'] = array(
+ 'pdf-desc' => 'متحكم لرؤية ملÙات PDF ÙÙ‰ نمط صورة',
+ 'pdf_no_metadata' => 'لم يمكن أخذ معلومات ميتا من PDF',
+ 'pdf_page_error' => 'رقم الصÙحة ليس ÙÙ‰ النطاق',
+);
+
+/** Assamese (অসমীয়া)
+ * @author Bishnu Saikia
+ */
+$messages['as'] = array(
+ 'pdf-desc' => 'পিডিà¦à¦« ফাইল ছবি হিচাপে বà§à¦¯à§±à¦¹à¦¾à§°à§° পদà§à¦§à¦¤à¦¿',
+ 'pdf_no_metadata' => 'পি.ডি.à¦à¦«.ৰ পৰা মেটাডাটা উপলদà§à¦§ নহয়',
+ 'pdf_page_error' => 'পৃষà§à¦ à¦¾à§° নমà§à¦¬à§° সীমাৰ ভিতৰত নাই',
+ 'exif-pdf-producer' => 'ৰূপানà§à¦¤à§°à¦• পà§à§°à¦—à§à§°à¦¾à¦®',
+ 'exif-pdf-version' => 'পি.ডি.à¦à¦«. ৰূপত সংসà§à¦•à§°à¦£',
+ 'exif-pdf-pagesize' => 'পৃষà§à¦ à¦¾à§° আকাৰ',
+);
+
+/** Asturian (asturianu)
+ * @author Xuacu
+ */
+$messages['ast'] = array(
+ 'pdf-desc' => "Xestor pa ver los ficheros PDF en mou d'imaxe",
+ 'pdf_no_metadata' => 'Nun se pudieron sacar los metadatos del PDF',
+ 'pdf_page_error' => 'El númberu de la páxina nun ta nel rangu',
+ 'exif-pdf-producer' => 'Programa de conversión',
+ 'exif-pdf-version' => 'Versión del formatu PDF',
+ 'exif-pdf-encrypted' => 'Cifráu',
+ 'exif-pdf-pagesize' => 'Tamañu de la páxina',
+);
+
+/** South Azerbaijani (تورکجه)
+ * @author Amir a57
+ */
+$messages['azb'] = array(
+ 'exif-pdf-pagesize' => 'صحیÙÙ‡ اولچوسو',
+);
+
+/** Bashkir (башҡортÑа)
+ * @author Assele
+ */
+$messages['ba'] = array(
+ 'pdf-desc' => 'PDF файлдарҙы Ñ€Ó™Ñемдәр рәүешендә ҡарау Ó©Ñөн ÑшкәртеүÑе ҡорал',
+ 'pdf_no_metadata' => 'PDF-тан мета-мәғлүмәтте алыу мөмкин түгел',
+ 'pdf_page_error' => 'Бит һаны биттәр һанынан ашҡан',
+);
+
+/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
+ * @author EugeneZelenko
+ * @author Jim-by
+ * @author Wizardist
+ */
+$messages['be-tarask'] = array(
+ 'pdf-desc' => 'Ðпрацоўшчык Ð´Ð»Ñ Ð¿Ñ€Ð°Ð³Ð»Ñду PDF-файлаў у выглÑдзе выÑваў',
+ 'pdf_no_metadata' => 'Ðемагчыма атрымаць мÑта-зьвеÑткі з PDF-файла',
+ 'pdf_page_error' => 'Ðумар Ñтаронкі паза дыÑпазонам',
+ 'exif-pdf-producer' => 'Праграма канвÑртацыі',
+ 'exif-pdf-version' => 'Ð’ÑÑ€ÑÑ–Ñ Ñ„Ð°Ñ€Ð¼Ð°Ñ‚Ñƒ PDF',
+ 'exif-pdf-encrypted' => 'Зашыфравана',
+ 'exif-pdf-pagesize' => 'Памер Ñтаронкі',
+);
+
+/** Bulgarian (българÑки)
+ * @author DCLXVI
+ * @author Stanqo
+ * @author Turin
+ */
+$messages['bg'] = array(
+ 'pdf_no_metadata' => 'невъзможно е да бъдат извлечени метаданни от PDF',
+ 'pdf_page_error' => 'Ðомерът на Ñтраница е извън обхвата',
+ 'exif-pdf-encrypted' => 'Криптиране',
+ 'exif-pdf-pagesize' => 'Размер на Ñтраницата',
+);
+
+/** Bengali (বাংলা)
+ * @author Nasir8891
+ * @author Wikitanvir
+ */
+$messages['bn'] = array(
+ 'pdf-desc' => 'পিডিà¦à¦« ফাইল ছবি হিসাবে বà§à¦¯à¦¬à¦¹à¦¾à¦°à§‡à¦° পদà§à¦§à¦¤à¦¿',
+ 'pdf_no_metadata' => 'পিডিà¦à¦« থেকে মেটাডেটা পাওয়া যায়নি',
+ 'pdf_page_error' => 'পাতার নমà§à¦¬à¦° সীমার মধà§à¦¯à§‡ নেই',
+);
+
+/** Breton (brezhoneg)
+ * @author Fohanno
+ * @author Fulup
+ */
+$messages['br'] = array(
+ 'pdf-desc' => 'Maveg evit gwelet ar restroù PDF e mod skeudenn',
+ 'pdf_no_metadata' => 'Dibosupl tapout meta-roadennoù digant ar restr PDF',
+ 'pdf_page_error' => "N'emañ ket niverenn ar bajenn er skeuliad",
+ 'exif-pdf-producer' => 'Program amdreiñ',
+ 'exif-pdf-pagesize' => 'Ment ar bajenn',
+);
+
+/** Bosnian (bosanski)
+ * @author CERminator
+ */
+$messages['bs'] = array(
+ 'pdf-desc' => 'UreÄ‘ivaÄ za pregled PDF datoteka u modu za slike',
+ 'pdf_no_metadata' => 'Ne mogu se naći metapodaci u PDFu',
+ 'pdf_page_error' => 'Broj stranice nije u rasponu',
+);
+
+/** Catalan (català)
+ * @author Aleator
+ */
+$messages['ca'] = array(
+ 'pdf-desc' => 'Gestor per a visualitzar arxius PDF en mode imatge',
+ 'pdf_no_metadata' => "No s'han pogut obtenir metadades del PDF",
+ 'pdf_page_error' => "Número de pàgina fora d'abast",
+);
+
+/** Chechen (нохчийн)
+ * @author Sasan700
+ * @author Умар
+ */
+$messages['ce'] = array(
+ 'pdf-desc' => 'Хьажа аттон кечйо PDF-файлаш Ñуьрта куьцехь',
+ 'pdf_no_metadata' => 'ÑхьацаÑцало чура бух оцу PDF',
+ 'pdf_page_error' => 'Ðгlон терахь дозан чулацамца дац',
+);
+
+/** Sorani Kurdish (کوردی)
+ * @author Calak
+ */
+$messages['ckb'] = array(
+ 'exif-pdf-pagesize' => 'قەبارەی پەڕە',
+);
+
+/** Czech (Äesky)
+ * @author Matěj Grabovský
+ * @author Mormegil
+ */
+$messages['cs'] = array(
+ 'pdf-desc' => 'OvladaÄ pro prohlížení PDF souborů jako obrázků',
+ 'pdf_no_metadata' => 'Z PDF se nepodařilo získat metadata',
+ 'pdf_page_error' => 'Číslo stránky mimo rozsah',
+ 'exif-pdf-producer' => 'Konverzní program',
+ 'exif-pdf-version' => 'Verze formátu PDF',
+ 'exif-pdf-encrypted' => 'Šifrovaný',
+ 'exif-pdf-pagesize' => 'Velikost stránky',
+);
+
+/** Welsh (Cymraeg)
+ * @author Lloffiwr
+ */
+$messages['cy'] = array(
+ 'pdf-desc' => 'Teclyn i weld ffeiliau PDF ar lun delwedd',
+ 'pdf_no_metadata' => "Yn methu cael y metadata o'r PDF",
+ 'pdf_page_error' => "Nid yw'r rhif hwn oddi mewn i ystod rhifau'r tudalennau",
+ 'exif-pdf-producer' => 'Rhaglen trosi',
+ 'exif-pdf-version' => 'Fersiwn y fformat PDF',
+ 'exif-pdf-encrypted' => 'Amgriptiwyd',
+ 'exif-pdf-pagesize' => 'Maint y dudalen',
+);
+
+/** Danish (dansk)
+ * @author Peter Alberti
+ */
+$messages['da'] = array(
+ 'pdf-desc' => 'HÃ¥ndtering af PDF-visning i billedtilstand',
+ 'pdf_no_metadata' => 'Kan ikke hente metadata fra PDF',
+ 'pdf_page_error' => 'Sidetallet er større end antallet af sider i dokumentet',
+ 'exif-pdf-producer' => 'Konverteringsprogram',
+ 'exif-pdf-version' => 'Version af PDF-format',
+ 'exif-pdf-encrypted' => 'Krypteret',
+ 'exif-pdf-pagesize' => 'Sidestørrelse',
+);
+
+/** German (Deutsch)
+ * @author Kghbln
+ * @author Metalhead64
+ * @author Raimond Spekking
+ */
+$messages['de'] = array(
+ 'pdf-desc' => 'Stellt eine Schnittstelle zur Ansicht von PDF-Dateien im Bildermodus bereit',
+ 'pdf_no_metadata' => 'Keine Metadaten im PDF vorhanden.',
+ 'pdf_page_error' => 'Seitenzahl außerhalb des Dokumentes.',
+ 'exif-pdf-producer' => 'Umwandlungsprogramm',
+ 'exif-pdf-version' => 'Version des PDF-Formats',
+ 'exif-pdf-encrypted' => 'Verschlüsselt',
+ 'exif-pdf-pagesize' => 'Seitengröße',
+);
+
+/** Swiss High German (Schweizer Hochdeutsch)
+ * @author Geitost
+ */
+$messages['de-ch'] = array(
+ 'pdf_page_error' => 'Seitenzahl ausserhalb des Dokumentes.',
+);
+
+/** Zazaki (Zazaki)
+ * @author Aspar
+ * @author Erdemaslancan
+ */
+$messages['diq'] = array(
+ 'pdf-desc' => 'şuxulnayoxo ke dosyayê PDFyan modê mocnayiş de mocneno',
+ 'pdf_no_metadata' => 'PDF ra metadata nêgeriyeno',
+ 'pdf_page_error' => 'numreyê peli benate de niyo',
+ 'exif-pdf-producer' => 'Programa çerxiney',
+ 'exif-pdf-version' => 'Versiyona babet da PDF',
+ 'exif-pdf-encrypted' => 'Kodıno',
+ 'exif-pdf-pagesize' => 'Ebata perer',
+);
+
+/** Lower Sorbian (dolnoserbski)
+ * @author Michawiki
+ */
+$messages['dsb'] = array(
+ 'pdf-desc' => 'Źěłowy rěd za woglědowanje PDF-datajow we wobrazowem modusu',
+ 'pdf_no_metadata' => 'Metadaty njedaju se z PDF dobyÅ›',
+ 'pdf_page_error' => 'Bokowe cysło zwenka wobcerka',
+ 'exif-pdf-producer' => 'Konwertěrowański program',
+ 'exif-pdf-version' => 'Wersija PDF-formata',
+ 'exif-pdf-encrypted' => 'Skoděrowany',
+ 'exif-pdf-pagesize' => 'Wjelikosć boka',
+);
+
+/** Greek (Ελληνικά)
+ * @author Omnipaedista
+ */
+$messages['el'] = array(
+ 'pdf-desc' => 'ΔιαχειÏιστής για την εμφάνιση αÏχείων PDF σε μοÏφή εικόνας',
+ 'pdf_no_metadata' => 'ΑδÏνατη η απόκτηση μεταδεδομένων από PDF',
+ 'pdf_page_error' => 'ΑÏιθμός σελίδας εκτός οÏίου',
+);
+
+/** Esperanto (Esperanto)
+ * @author Yekrats
+ */
+$messages['eo'] = array(
+ 'pdf-desc' => 'Ilo por vidi PDF-dosierojn en bilda reÄimo',
+ 'pdf_no_metadata' => 'Ne povas preni metadatenon el PDF',
+ 'pdf_page_error' => 'PaÄnombro ekster valida intervalo',
+ 'exif-pdf-version' => 'Versio de PDF-formato',
+ 'exif-pdf-encrypted' => 'Ĉifrita',
+ 'exif-pdf-pagesize' => 'Grandeco de paÄo',
+);
+
+/** Spanish (español)
+ * @author Armando-Martin
+ * @author Sanbec
+ */
+$messages['es'] = array(
+ 'pdf-desc' => 'Manejador para ver archivos PDF en modo imagen',
+ 'pdf_no_metadata' => 'No se obtuvieron metadatos del PDF',
+ 'pdf_page_error' => 'Número de página fuera de rango',
+ 'exif-pdf-producer' => 'Programa de conversión',
+ 'exif-pdf-version' => 'Versión del formato PDF',
+ 'exif-pdf-encrypted' => 'Cifrado',
+ 'exif-pdf-pagesize' => 'Tamaño de página',
+);
+
+/** Estonian (eesti)
+ * @author Avjoska
+ * @author Pikne
+ */
+$messages['et'] = array(
+ 'pdf-desc' => 'Töötleja PDF-failide piltidena kuvamiseks',
+ 'pdf_no_metadata' => 'Ei õnnestu PDF-faili meta-andmeid saada',
+ 'pdf_page_error' => 'Leheküljenumber pole vahemikus.',
+ 'exif-pdf-producer' => 'Teisendusprogramm',
+ 'exif-pdf-version' => 'PDF-vormingu versioon',
+ 'exif-pdf-encrypted' => 'Krüptitud',
+ 'exif-pdf-pagesize' => 'Lehe suurus',
+);
+
+/** Persian (Ùارسی)
+ * @author Ebraminio
+ * @author Huji
+ * @author Reza1615
+ * @author Sahim
+ * @author Wayiran
+ */
+$messages['fa'] = array(
+ 'pdf-desc' => 'گرداننده‌ای برای مشاهده Ùایل های پی‌دی‌ا٠در حالت تصویر',
+ 'pdf_no_metadata' => 'نمی‌توان Ùراداده‌ها را از پی‌دی‌ا٠گرÙت',
+ 'pdf_page_error' => 'شماره صÙحه در محدوده نیست',
+ 'exif-pdf-producer' => 'برنامهٔ مبدل',
+ 'exif-pdf-version' => 'نسخهٔ قالب پی‌دی‌اÙ',
+ 'exif-pdf-encrypted' => 'رمز شده',
+ 'exif-pdf-pagesize' => 'حجم صÙحه',
+);
+
+/** Finnish (suomi)
+ * @author Crt
+ * @author Kulmalukko
+ * @author Nike
+ * @author VezonThunder
+ * @author Vililikku
+ */
+$messages['fi'] = array(
+ 'pdf-desc' => 'Käsittelijä PDF-tiedostojen katsomiseen kuvatilassa.',
+ 'pdf_no_metadata' => 'Metatietojen hakeminen PDF-tiedostosta epäonnistui',
+ 'pdf_page_error' => 'Sivunumero ei ole alueella.',
+ 'exif-pdf-producer' => 'Muunto-ohjelma',
+ 'exif-pdf-version' => 'PDF-muodon versio',
+ 'exif-pdf-encrypted' => 'Salattu',
+ 'exif-pdf-pagesize' => 'Sivun koko',
+);
+
+/** French (français)
+ * @author Crochet.david
+ * @author Gomoko
+ * @author Grondin
+ * @author Verdy p
+ */
+$messages['fr'] = array(
+ 'pdf-desc' => 'Gestionnaire permettant de visualiser les fichiers PDF en mode image',
+ 'pdf_no_metadata' => 'Impossible d’obtenir les métadonnées du fichier PDF',
+ 'pdf_page_error' => 'Le numéro de page est hors de l’étendue.',
+ 'exif-pdf-producer' => 'Programme de conversion',
+ 'exif-pdf-version' => 'Version du format PDF',
+ 'exif-pdf-encrypted' => 'Crypté',
+ 'exif-pdf-pagesize' => 'Taille de la page',
+);
+
+/** Franco-Provençal (arpetan)
+ * @author ChrisPtDe
+ */
+$messages['frp'] = array(
+ 'pdf-desc' => 'Utilitèro por vêre los fichiérs PDF en fôrma émâge.',
+ 'pdf_no_metadata' => 'Pôt pas avêr les mètabalyês du fichiér PDF.',
+ 'pdf_page_error' => 'Lo numerô de pâge est en defôr de la portâ.',
+);
+
+/** Galician (galego)
+ * @author Alma
+ * @author Toliño
+ */
+$messages['gl'] = array(
+ 'pdf-desc' => 'Manipulador para ver ficheiros PDF no modo de imaxe',
+ 'pdf_no_metadata' => 'Non se puideron obter os metadatos do PDF.',
+ 'pdf_page_error' => 'O número da páxina non está no rango.',
+ 'exif-pdf-producer' => 'Programa de conversión',
+ 'exif-pdf-version' => 'Versión en formato PDF',
+ 'exif-pdf-encrypted' => 'Cifrado',
+ 'exif-pdf-pagesize' => 'Tamaño da páxina',
+);
+
+/** Ancient Greek (ἈÏχαία ἑλληνικὴ)
+ * @author Omnipaedista
+ */
+$messages['grc'] = array(
+ 'pdf_no_metadata' => 'ἈδÏνατον τὸ ἀποκομίζειν μεταδεδομένα á¼Îº PDF',
+ 'pdf_page_error' => 'ἈÏιθμὸς δέλτου á¼ÎºÏ„ὸς á¼Î¼Î²ÎµÎ»ÎµÎ¯Î±Ï‚',
+);
+
+/** Swiss German (Alemannisch)
+ * @author Als-Holder
+ */
+$messages['gsw'] = array(
+ 'pdf-desc' => 'Schnittstell fir d Aasicht vu PDF-Dateien im Bilder-Modus',
+ 'pdf_no_metadata' => 'Kei Metadate im PDF vorhande.',
+ 'pdf_page_error' => 'Sytezahl usserhalb vum Dokumänt.',
+ 'exif-pdf-producer' => 'Umwandligsprogramm',
+ 'exif-pdf-version' => 'Version vum PDF-Format',
+ 'exif-pdf-encrypted' => 'Verschlisslet',
+ 'exif-pdf-pagesize' => 'Sytegreßi',
+);
+
+/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @author KartikMistry
+ * @author Sushant savla
+ */
+$messages['gu'] = array(
+ 'pdf-desc' => 'PDF ફાઈલોને ચિતà«àª° સà«àªµàª°à«‚પે જોવાનà«àª‚ સાધન',
+ 'pdf_no_metadata' => 'PDFમાંથી મેટા ડાટા ન મેળવી શકાયો',
+ 'pdf_page_error' => 'પાનાં કà«àª°àª®àª¾àª‚ક અવધિમાં નથી',
+);
+
+/** Hebrew (עברית)
+ * @author Amire80
+ * @author Rotemliss
+ * @author YaronSh
+ */
+$messages['he'] = array(
+ 'pdf-desc' => 'טיפול בצפייה בקובצי PDF במצב תמונה',
+ 'pdf_no_metadata' => '×œ× × ×™×ª×Ÿ ל×חזר ×ת נתוני המסמך מה־PDF',
+ 'pdf_page_error' => 'מספר הדף ×ינו בטווח',
+ 'exif-pdf-producer' => 'תוכנת המרה',
+ 'exif-pdf-version' => 'הגרסה של תסדיר PDF',
+ 'exif-pdf-encrypted' => 'מוצפן',
+ 'exif-pdf-pagesize' => 'גודל דף',
+);
+
+/** Hindi (हिनà¥à¤¦à¥€)
+ * @author Kaustubh
+ */
+$messages['hi'] = array(
+ 'pdf-desc' => 'चितà¥à¤° मोड में पीडीà¤à¤« फ़ाईल देखनेके लिये आवशà¥à¤¯à¤• पà¥à¤°à¤£à¤¾à¤²à¥€',
+ 'pdf_no_metadata' => 'पीडीà¤à¤« से मेटाडाटा ले नहीं पायें',
+ 'pdf_page_error' => 'पनà¥à¤¨à¥‡ का कà¥à¤°à¤®à¤¾à¤‚क सीमामें नहीं हैं',
+);
+
+/** Croatian (hrvatski)
+ * @author Ex13
+ */
+$messages['hr'] = array(
+ 'pdf-desc' => 'Program za gledanje PDF datoteka u slikovnom modu',
+ 'pdf_no_metadata' => 'Nije moguće dobiti metapodatke iz PDF',
+ 'pdf_page_error' => 'Broj stranice nije u opsegu',
+);
+
+/** Upper Sorbian (hornjoserbsce)
+ * @author Michawiki
+ */
+$messages['hsb'] = array(
+ 'pdf-desc' => 'Program za wobhladowanje datajow PDF we wobrazowym modusu',
+ 'pdf_no_metadata' => 'W PDF žane metadaty njejsu.',
+ 'pdf_page_error' => 'LiÄba strony zwonka dokumenta.',
+ 'exif-pdf-producer' => 'Konwertowanski program',
+ 'exif-pdf-version' => 'Wersija PDF-formata',
+ 'exif-pdf-encrypted' => 'ZakluÄowany',
+ 'exif-pdf-pagesize' => 'Wulkosć strony',
+);
+
+/** Hungarian (magyar)
+ * @author Dani
+ * @author Dj
+ */
+$messages['hu'] = array(
+ 'pdf-desc' => 'PDF fájlok megjelenítse képként',
+ 'pdf_no_metadata' => 'nem sikerült lekérni a PDF metaadatait',
+ 'pdf_page_error' => 'Az oldalszám a tartományon kívül esik',
+ 'exif-pdf-producer' => 'Konvertáló program',
+ 'exif-pdf-version' => 'PDF formátum verziója',
+ 'exif-pdf-encrypted' => 'Titkosított',
+ 'exif-pdf-pagesize' => 'Lapméret',
+);
+
+/** Interlingua (interlingua)
+ * @author McDutchie
+ */
+$messages['ia'] = array(
+ 'pdf-desc' => 'Gestor pro visualisar files PDF in modo de imagine',
+ 'pdf_no_metadata' => 'Non pote obtener metadatos ab PDF',
+ 'pdf_page_error' => 'Numero de pagina foras del intervallo',
+);
+
+/** Indonesian (Bahasa Indonesia)
+ * @author Bennylin
+ */
+$messages['id'] = array(
+ 'pdf-desc' => 'Yang menangani tampilan berkas PDF dalam mode gambar',
+ 'pdf_no_metadata' => 'Tidak dapat membaca metadata dari PDF',
+ 'pdf_page_error' => 'Nomor halaman di luar batas',
+);
+
+/** Iloko (Ilokano)
+ * @author Lam-ang
+ */
+$messages['ilo'] = array(
+ 'pdf-desc' => 'Panagtengngel para iti panagkita kadagiti PDF a papeles iti moda a ladawan',
+ 'pdf_no_metadata' => 'Saan a makaala ti metadata manipud idiay PDF.',
+ 'pdf_page_error' => 'Saan a masakupan ti numero ti panid.',
+ 'exif-pdf-producer' => 'Konbersion a programa',
+ 'exif-pdf-version' => 'Bersion iti PDF a pormat',
+ 'exif-pdf-encrypted' => 'Naenkripto',
+ 'exif-pdf-pagesize' => 'Kadakkel ti panid',
+);
+
+/** Italian (italiano)
+ * @author Beta16
+ * @author Darth Kule
+ */
+$messages['it'] = array(
+ 'pdf-desc' => 'Gestore per la visualizzazione di file PDF in modalità immagine',
+ 'pdf_no_metadata' => 'Impossibile ottenere i metadati da PDF',
+ 'pdf_page_error' => "Numero di pagina non compreso nell'intervallo",
+ 'exif-pdf-producer' => 'Programma di conversione',
+ 'exif-pdf-version' => 'Versione del formato PDF',
+ 'exif-pdf-encrypted' => 'Crittografato',
+ 'exif-pdf-pagesize' => 'Dimensioni pagina',
+);
+
+/** Japanese (日本語)
+ * @author Fryed-peach
+ * @author Shirayuki
+ */
+$messages['ja'] = array(
+ 'pdf-desc' => 'ç”»åƒãƒ¢ãƒ¼ãƒ‰ã§ PDF ファイルを表示ã™ã‚‹ãŸã‚ã®ãƒãƒ³ãƒ‰ãƒ©ãƒ¼',
+ 'pdf_no_metadata' => 'PDF ファイルã‹ã‚‰ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã§ãã¾ã›ã‚“',
+ 'pdf_page_error' => 'ページ番å·ãŒæ­£ã—ã„範囲内ã«ã‚ã‚Šã¾ã›ã‚“。',
+ 'exif-pdf-producer' => '変æ›ãƒ—ログラム',
+ 'exif-pdf-version' => 'PDF å½¢å¼ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³',
+ 'exif-pdf-encrypted' => 'æš—å·åŒ–済ã¿',
+ 'exif-pdf-pagesize' => 'ページã®ã‚µã‚¤ã‚º',
+);
+
+/** Javanese (Basa Jawa)
+ * @author Meursault2004
+ * @author NoiX180
+ */
+$messages['jv'] = array(
+ 'pdf-desc' => 'Sing nadhangi kanggo ndelok berkas PDF mawa modé gambar',
+ 'pdf_no_metadata' => 'Ora bisa olèh metadata saka PDF',
+ 'pdf_page_error' => 'Nomèr kaca nèng njaba wates',
+);
+
+/** Georgian (ქáƒáƒ áƒ—ული)
+ * @author BRUTE
+ * @author David1010
+ */
+$messages['ka'] = array(
+ 'pdf-desc' => 'დáƒáƒ›áƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი PDF-ფáƒáƒ˜áƒšáƒ”ბის სურáƒáƒ—ების სáƒáƒ®áƒ˜áƒ— დáƒáƒ¡áƒáƒ—ვáƒáƒšáƒ˜áƒ”რებლáƒáƒ“',
+ 'pdf_no_metadata' => 'შეუძლებელირPDF-დáƒáƒœ მეტáƒáƒ›áƒáƒœáƒáƒªáƒ”მების მიღებáƒ',
+ 'pdf_page_error' => 'გვერდის ნáƒáƒ›áƒ”რი áƒáƒ  áƒáƒ áƒ˜áƒ¡ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¨áƒ˜',
+ 'exif-pdf-producer' => 'პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ',
+ 'exif-pdf-version' => 'ვერსირPDF ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜',
+ 'exif-pdf-encrypted' => 'დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ£áƒšáƒ˜',
+ 'exif-pdf-pagesize' => 'გვერდის ზáƒáƒ›áƒ',
+);
+
+/** Khmer (ភាសាážáŸ’មែរ)
+ * @author Chhorran
+ * @author Lovekhmer
+ * @author Thearith
+ * @author គីមស៊្រុន
+ */
+$messages['km'] = array(
+ 'pdf-desc' => 'កម្មវិធីសំរាប់បើកមើលឯកសារ PDF ជាទំរង់រូបភាព',
+ 'pdf_no_metadata' => 'មិនអាចទទួលយកទិន្ននáŸáž™áž˜áŸážáž¶áž–ី PDF បានទáŸ',
+ 'pdf_page_error' => 'គ្មានលáŸážáž‘ំពáŸážš ក្នុងដែនកំណážáŸ‹',
+);
+
+/** Korean (한국어)
+ * @author Kwj2772
+ * @author ì•„ë¼
+ */
+$messages['ko'] = array(
+ 'pdf-desc' => 'PDF 파ì¼ì„ ì´ë¯¸ì§€ ë°©ì‹ìœ¼ë¡œ ë³¼ 수 있게 하는 핸들러',
+ 'pdf_no_metadata' => 'PDF 파ì¼ì—ì„œ 메타ë°ì´í„°ë¥¼ 추출할 수 없습니다.',
+ 'pdf_page_error' => '쪽수가 범위 ì•ˆì— ìžˆì§€ 않습니다.',
+ 'exif-pdf-producer' => '변환 프로그램',
+ 'exif-pdf-version' => 'PDF í˜•ì‹ ë²„ì „',
+ 'exif-pdf-encrypted' => '암호화함',
+ 'exif-pdf-pagesize' => '문서 í¬ê¸°',
+);
+
+/** Colognian (Ripoarisch)
+ * @author Purodha
+ */
+$messages['ksh'] = array(
+ 'pdf-desc' => 'Määd et möjjelesch, PDF-Dateie wie Bellder ze beloore.',
+ 'pdf_no_metadata' => 'Kann de Metta-Date nit fun dä PDF-Datei holle.',
+ 'pdf_page_error' => 'En Sigge-Nommer es ußerhallef',
+ 'exif-pdf-producer' => 'Ömwandelongsprojramm',
+ 'exif-pdf-version' => 'PDF-Fommaat-Version',
+ 'exif-pdf-encrypted' => 'Verschlößelt',
+ 'exif-pdf-pagesize' => 'Dä Sigg(e) ier Jrüüße', # Fuzzy
+);
+
+/** Kirghiz (Кыргызча)
+ * @author Chorobek
+ */
+$messages['ky'] = array(
+ 'pdf-desc' => 'PDF файлдарды Ñүрөт түрүндө көрÑөткүч',
+ 'pdf_no_metadata' => 'PDF-тин метамаалыматтарын алуу мүмкүн ÑмеÑ',
+);
+
+/** Luxembourgish (Lëtzebuergesch)
+ * @author Robby
+ */
+$messages['lb'] = array(
+ 'pdf-desc' => '"Programm" den et erméiglecht PDF-Fichieren als Bild ze kucken',
+ 'pdf_no_metadata' => 'Meta-Informatiounen aus dem PDF Dokument kënnen net gelies ginn',
+ 'pdf_page_error' => "D'Säitenzuel ass net an dem Beräich.",
+ 'exif-pdf-version' => 'Versioun vum PDF-Format',
+ 'exif-pdf-encrypted' => 'Verschlësselt',
+ 'exif-pdf-pagesize' => 'Gréisst vun der Säit',
+);
+
+/** Limburgish (Limburgs)
+ * @author Ooswesthoesbes
+ */
+$messages['li'] = array(
+ 'pdf-desc' => "Hanjeltj PDF-bestenj aaf en maak 't meugelik die es aafbeildjing te zeen",
+ 'pdf_no_metadata' => 'Kèn gein metadata vanne PDF kriege',
+ 'pdf_page_error' => 'paginanómmer besteit neet',
+);
+
+/** Lithuanian (lietuvių)
+ * @author Matasg
+ */
+$messages['lt'] = array(
+ 'pdf-desc' => 'Įrankis PDF failų peržiūrai vaizdo režime',
+ 'pdf_no_metadata' => 'Nepavyko gauti metaduomenų iš PDF',
+ 'pdf_page_error' => 'Puslapis numeris nÄ—ra diapazone',
+);
+
+/** Macedonian (македонÑки)
+ * @author Bjankuloski06
+ * @author Brest
+ */
+$messages['mk'] = array(
+ 'pdf-desc' => 'Ракувач за прегледување PDF податотеки во Ñликовен режим',
+ 'pdf_no_metadata' => 'Ðе може да Ñе земат метаподатоци од PDF',
+ 'pdf_page_error' => 'Бројот на Ñтраница е надвор од опÑег',
+ 'exif-pdf-producer' => 'Програм за претворање',
+ 'exif-pdf-version' => 'Верзија на PDF-форматот',
+ 'exif-pdf-encrypted' => 'Шифрирано',
+ 'exif-pdf-pagesize' => 'Големина на Ñтраницата',
+);
+
+/** Malayalam (മലയാളം)
+ * @author Praveenp
+ * @author Shijualex
+ */
+$messages['ml'] = array(
+ 'pdf-desc' => 'പി.à´¡à´¿.à´Žà´«àµ. à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾ à´šà´¿à´¤àµà´°à´°àµ‚പതàµà´¤à´¿àµ½ കാണàµà´¨àµà´¨à´¤à´¿à´¨àµà´³àµà´³ കൈകാരàµà´¯àµ‹à´ªà´•à´°à´£à´‚',
+ 'pdf_no_metadata' => 'PDF-ൽ നിനàµà´¨àµ മെറàµà´±à´¾à´¡à´¾à´±àµà´± ലഭിചàµà´šà´¿à´²àµà´²',
+ 'pdf_page_error' => 'താളിനàµà´±àµ† à´•àµà´°à´®à´¸à´‚à´–àµà´¯ പരിധിയിലധികമാണàµ',
+ 'exif-pdf-producer' => 'പരിവർതàµà´¤à´¨ à´ªàµà´°àµ‹à´—àµà´°à´¾à´‚',
+ 'exif-pdf-version' => 'പി.à´¡à´¿.à´Žà´«àµ. തരതàµà´¤à´¿à´¨àµà´±àµ† പതിപàµà´ªàµ',
+ 'exif-pdf-encrypted' => 'നിഗൂഢീകരികàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤àµ',
+ 'exif-pdf-pagesize' => 'താളിനàµà´±àµ† വലിപàµà´ªà´‚',
+);
+
+/** Marathi (मराठी)
+ * @author Kaustubh
+ * @author Sankalpdravid
+ */
+$messages['mr'] = array(
+ 'pdf-desc' => 'चितà¥à¤° मोडमधà¥à¤¯à¥‡ पीडीà¤à¤« संचिका पाहणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ आवशà¥à¤¯à¤• पà¥à¤°à¤£à¤¾à¤²à¥€',
+ 'pdf_no_metadata' => 'पीडीà¤à¤«à¤®à¤§à¥‚न मेटाडाटा घेऊ शकत नाही',
+ 'pdf_page_error' => 'पान कà¥à¤°à¤®à¤¾à¤‚क सीमेमधà¥à¤¯à¥‡ नाही',
+);
+
+/** Malay (Bahasa Melayu)
+ * @author Anakmalaysia
+ */
+$messages['ms'] = array(
+ 'pdf-desc' => 'Pengendali untuk melihat fail PDF dalam mod imej',
+ 'pdf_no_metadata' => 'Metadata tidak boleh diperoleh dari PDF',
+ 'pdf_page_error' => 'Nombor halaman tiada dalam julat',
+ 'exif-pdf-producer' => 'Program penukaran',
+ 'exif-pdf-version' => 'Versi format PDF',
+ 'exif-pdf-encrypted' => 'Disulitkan',
+ 'exif-pdf-pagesize' => 'Saiz halaman',
+);
+
+/** Maltese (Malti)
+ * @author Chrisportelli
+ */
+$messages['mt'] = array(
+ 'pdf_page_error' => 'In-numru tal-paġna ma jinsabx fl-intervall',
+);
+
+/** Norwegian Bokmål (norsk (bokmål)‎)
+ * @author Jsoby
+ */
+$messages['nb'] = array(
+ 'pdf-desc' => 'HÃ¥ndtering av PDF-visning i bildemodus',
+ 'pdf_no_metadata' => 'kan ikke hente metadata fra PDF',
+ 'pdf_page_error' => 'Sidenummer overstiger antall sider i dokumentet',
+ 'exif-pdf-producer' => 'Koverteringsprogram',
+ 'exif-pdf-version' => 'Versjon av PDF-format',
+ 'exif-pdf-encrypted' => 'Kryptert',
+ 'exif-pdf-pagesize' => 'Sidestørrelse',
+);
+
+/** Dutch (Nederlands)
+ * @author Siebrand
+ * @author Wiki13
+ */
+$messages['nl'] = array(
+ 'pdf-desc' => 'Handelt PDF-bestanden af en maakt het mogelijk ze als afbeeldingen te bekijken',
+ 'pdf_no_metadata' => 'De metadata van het PDF-bestand kan niet uitgelezen worden',
+ 'pdf_page_error' => 'Het paginanummer ligt niet binnen het bereik',
+ 'exif-pdf-producer' => 'Conversieprogramma',
+ 'exif-pdf-version' => 'Versie van PDF-opmaak',
+ 'exif-pdf-encrypted' => 'Versleuteld',
+ 'exif-pdf-pagesize' => 'Papierformaat',
+);
+
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
+ * @author Harald Khan
+ * @author Njardarlogar
+ */
+$messages['nn'] = array(
+ 'pdf-desc' => 'Handering av PDF-vising i biletmodus',
+ 'pdf_no_metadata' => 'Kan ikkje henta metadata frå PDF',
+ 'pdf_page_error' => 'Sidenummer overstig talet på sider i dokumentet',
+);
+
+/** Occitan (occitan)
+ * @author Cedric31
+ */
+$messages['oc'] = array(
+ 'pdf-desc' => 'Utilitari per visualizar los fichièrs PDF en mòde imatge',
+ 'pdf_no_metadata' => 'Pòt pas obténer las metadonadas del fichièr PDF',
+ 'pdf_page_error' => 'Lo numèro de pagina es pas dins la gama.',
+ 'exif-pdf-producer' => 'Programa de conversion',
+ 'exif-pdf-version' => 'Version del format PDF',
+ 'exif-pdf-encrypted' => 'Chifrat',
+ 'exif-pdf-pagesize' => 'Talha de la pagina',
+);
+
+/** Oriya (ଓଡ଼ିଆ)
+ * @author Jnanaranjan Sahu
+ * @author Psubhashish
+ */
+$messages['or'] = array(
+ 'pdf-desc' => 'PDF ଫାଇଲକୠଛବି ମୋଡ଼ରେ ଦେଖିବାର ପରିଚାଳକ',
+ 'pdf_no_metadata' => 'ପି.ଡ଼ି.à¬à¬«.ରୠମେଟାଡାଟା ବାହାର କରିପାରିଲà­à¬ ନାହିà¬',
+ 'pdf_page_error' => 'ପୃଷà­à¬ à¬¾ ସଂଖà­à­Ÿà¬¾ ସୀମା ଭିତରେ ନାହିà¬',
+ 'exif-pdf-producer' => 'ବଦଳ କାରà­à¬¯à­à­Ÿ',
+ 'exif-pdf-version' => 'PDF ପà­à¬°à¬•à¬¾à¬°à¬° ସଂସà­à¬•à¬°à¬£',
+ 'exif-pdf-encrypted' => 'à¬à¬¨à¬•à­à¬°à¬¿à¬ªà­à¬Ÿ ହୋଇଥିବା',
+ 'exif-pdf-pagesize' => 'ପୃଷà­à¬ à¬¾ ଆକାର',
+);
+
+/** Deitsch (Deitsch)
+ * @author Xqt
+ */
+$messages['pdc'] = array(
+ 'pdf_no_metadata' => 'Keene Meta-Daade im PDF',
+);
+
+/** Polish (polski)
+ * @author Holek
+ * @author Matma Rex
+ * @author Sp5uhe
+ */
+$messages['pl'] = array(
+ 'pdf-desc' => 'Konwerter graficznego podglądu plików PDF',
+ 'pdf_no_metadata' => 'nie można pobrać metadanych z pliku PDF',
+ 'pdf_page_error' => 'Numer strony poza zakresem',
+ 'exif-pdf-producer' => 'Program użyty do konwersji',
+ 'exif-pdf-version' => 'Wersja formatu PDF',
+ 'exif-pdf-encrypted' => 'Zaszyfrowany',
+ 'exif-pdf-pagesize' => 'Wymiary strony',
+);
+
+/** Piedmontese (Piemontèis)
+ * @author Borichèt
+ * @author Dragonòt
+ */
+$messages['pms'] = array(
+ 'pdf-desc' => 'Ël gestor për vëdde ij file PDF an manera image',
+ 'pdf_no_metadata' => 'as peulo nen pijesse ij metadat dal PDF',
+ 'pdf_page_error' => "Ël nùmer ëd pàgina a l'é pa ant ël range",
+ 'exif-pdf-producer' => 'Programa ëd conversion',
+ 'exif-pdf-version' => 'Version dël formà PDF',
+ 'exif-pdf-encrypted' => 'Criptà',
+ 'exif-pdf-pagesize' => 'Dimension dla pàgina',
+);
+
+/** Western Punjabi (پنجابی)
+ * @author Khalid Mahmood
+ */
+$messages['pnb'] = array(
+ 'pdf-desc' => 'Ù¾ÛŒ ÚˆÛŒ ای٠Ùائلاں امیج موڈ Ú† ویکھن لئی Ûینڈلر',
+ 'pdf_no_metadata' => 'پی ڈی ای٠توں میٹاڈیٹا نئیں مل سکیا۔',
+ 'pdf_page_error' => 'صÙÛ Ù†Ù…Ø¨Ø± ولگن Ú† نئیں۔',
+);
+
+/** Portuguese (português)
+ * @author Hamilton Abreu
+ * @author Malafaya
+ */
+$messages['pt'] = array(
+ 'pdf-desc' => 'Manuseador de visionamento de ficheiros PDF em modo de imagem',
+ 'pdf_no_metadata' => 'não foi possível obter os metadados do PDF',
+ 'pdf_page_error' => 'Número de página fora do intervalo',
+);
+
+/** Brazilian Portuguese (português do Brasil)
+ * @author Eduardo.mps
+ * @author 555
+ */
+$messages['pt-br'] = array(
+ 'pdf-desc' => 'Ferramenta de visualização de arquivos PDF em modo de imagem',
+ 'pdf_no_metadata' => 'Não foi possível obter os metadados do PDF',
+ 'pdf_page_error' => 'Número de página fora do intervalo',
+ 'exif-pdf-producer' => 'Programa de conversão',
+ 'exif-pdf-version' => 'Versão do formato PDF',
+ 'exif-pdf-encrypted' => 'Criptografado',
+ 'exif-pdf-pagesize' => 'Tamanho da página',
+);
+
+/** Romanian (română)
+ * @author Stelistcristi
+ */
+$messages['ro'] = array(
+ 'pdf-desc' => 'Operator pentru vizualizarea fișierelor PDF în modul de imagine',
+ 'pdf_no_metadata' => 'Nu se poate obține metadate din PDF',
+ 'pdf_page_error' => 'Numărul paginii nu e în șir',
+ 'exif-pdf-pagesize' => 'Dimensiunea paginii',
+);
+
+/** tarandíne (tarandíne)
+ * @author Joetaras
+ */
+$messages['roa-tara'] = array(
+ 'pdf-desc' => 'Gestore pe vedè le file PDF in mode immaggine',
+ 'pdf_no_metadata' => "Non ge pozze pigghià le metadata da 'u PDF",
+ 'pdf_page_error' => "Numere de pàgene fore da l'indervalle",
+ 'exif-pdf-producer' => 'Programme de conversione',
+ 'exif-pdf-version' => "Versione d'u formate PDF",
+ 'exif-pdf-encrypted' => 'Criptate',
+ 'exif-pdf-pagesize' => "Dimenzione d'a pàgene",
+);
+
+/** Russian (руÑÑкий)
+ * @author DCamer
+ * @author ÐлекÑандр Сигачёв
+ */
+$messages['ru'] = array(
+ 'pdf-desc' => 'Обработчик Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра PDF-файлов в виде изображений',
+ 'pdf_no_metadata' => 'невозможно получить метаданные из PDF',
+ 'pdf_page_error' => 'Ðомер Ñтраницы вне диапазона',
+ 'exif-pdf-producer' => 'Программа преобразованиÑ',
+ 'exif-pdf-version' => 'ВерÑÐ¸Ñ Ð² формате PDF',
+ 'exif-pdf-encrypted' => 'Шифрование',
+ 'exif-pdf-pagesize' => 'Размер Ñтраницы',
+);
+
+/** Rusyn (руÑиньÑкый)
+ * @author Gazeb
+ */
+$messages['rue'] = array(
+ 'pdf-desc' => 'Овладач про переглÑд PDF файлів Ñк образків',
+ 'pdf_no_metadata' => 'Ðе годен обтримати метадата з PDF',
+ 'pdf_page_error' => 'ЧіÑло Ñторінкы не Ñ” в роÑÑÑгу',
+);
+
+/** Sanskrit (संसà¥à¤•à¥ƒà¤¤à¤®à¥)
+ * @author Shubha
+ */
+$messages['sa'] = array(
+ 'pdf-desc' => 'सà¥à¤²à¥‡à¤–(PDF)सञà¥à¤šà¤¿à¤•à¤¾à¤ƒ चितà¥à¤°à¤¦à¤¶à¤¾à¤¯à¤¾à¤‚ दरà¥à¤¶à¤¨à¤¾à¤¯ अपेकà¥à¤·à¤¿à¤¤à¤¾ पà¥à¤°à¤£à¤¾à¤²à¥€',
+ 'pdf_no_metadata' => 'सà¥à¤²à¥‡à¤–ातॠमेटादतà¥à¤¤à¤¾à¤‚शः पà¥à¤°à¤¾à¤ªà¥à¤¤à¥à¤®à¥ अशकà¥à¤¯à¤ƒ',
+ 'pdf_page_error' => 'पृषà¥à¤ à¤•à¥à¤°à¤®à¤¾à¤™à¥à¤•à¤ƒ सीमायां न विदà¥à¤¯à¤¤à¥‡',
+);
+
+/** Sakha (Ñаха тыла)
+ * @author HalanTul
+ */
+$messages['sah'] = array(
+ 'pdf-desc' => 'PDF билÑлÑри ойуу курдук көрдөрөөччү',
+ 'pdf_no_metadata' => 'PDF-тан мета дааннайдарын ылар кыах Ñуох',
+ 'pdf_page_error' => 'СирÑй нүөмÑÑ€Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ò¥Ò¥Ð° киирбÑÑ‚',
+);
+
+/** Sinhala (සිංහල)
+ * @author Budhajeewa
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['si'] = array(
+ 'pdf-desc' => 'PDF ගොනු රූප මà·à¶¯à·’ලියෙන් හසුරුවනය',
+ 'pdf_no_metadata' => 'PDF ගොනුවෙන් මෙටà·à¶¯à¶­à·Šà¶­ ගත නොහà·à¶š',
+ 'pdf_page_error' => 'පිටු අංකය නිවà·à¶»à¶¯à·’ පරà·à·ƒà¶ºà·š නොමà·à¶­',
+ 'exif-pdf-producer' => 'à·„à·à¶»à·€à·”ම් à·€à·à¶©à·ƒà¶§à·„න',
+ 'exif-pdf-version' => 'PDF ආකෘතියේ අනුවà·à¶¯à¶º',
+ 'exif-pdf-encrypted' => 'ගුප්තකේතීකරණය වූ',
+ 'exif-pdf-pagesize' => 'පිටු ප්â€à¶»à¶¸à·à¶«à¶º',
+);
+
+/** Slovak (slovenÄina)
+ * @author Helix84
+ */
+$messages['sk'] = array(
+ 'pdf-desc' => 'Obsluha zobrazovania PDF súborov v režime obrázkov',
+ 'pdf_no_metadata' => 'nie je možné získať metadáta z PDF',
+ 'pdf_page_error' => 'Číslo stránky nie je v intervale',
+);
+
+/** Slovenian (slovenÅ¡Äina)
+ * @author Dbc334
+ */
+$messages['sl'] = array(
+ 'pdf-desc' => 'Upravljavec ogledovanja datotek PDF v slikovnem naÄinu',
+ 'pdf_no_metadata' => 'Ne morem pridobiti metapodatkov iz PDF',
+ 'pdf_page_error' => 'Å tevilka strani ni v dosegu',
+ 'exif-pdf-producer' => 'Pretvorbeni program',
+ 'exif-pdf-version' => 'RazliÄica oblike PDF',
+ 'exif-pdf-encrypted' => 'Å ifrirano',
+ 'exif-pdf-pagesize' => 'Velikost strani',
+);
+
+/** Albanian (shqip)
+ * @author Olsi
+ */
+$messages['sq'] = array(
+ 'pdf-desc' => 'Mbajtës për pamjen e skedave PDF në mënyrën e figurave',
+ 'pdf_no_metadata' => 'Nuk mund të merren metadata nga PDF',
+ 'pdf_page_error' => 'Numri i faqes nuk është në varg',
+);
+
+/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Rancher
+ * @author Михајло Ðнђелковић
+ */
+$messages['sr-ec'] = array(
+ 'pdf-desc' => 'Програм за прегледање PDF докумената у Ñликовном режиму',
+ 'pdf_no_metadata' => 'Ðе могу да преузмем метаподатке из PDF-а',
+ 'pdf_page_error' => 'Број Ñтраница ван опÑега',
+);
+
+/** Serbian (Latin script) (srpski (latinica)‎)
+ * @author Michaello
+ */
+$messages['sr-el'] = array(
+ 'pdf-desc' => 'Handler za pregled PDF fajlova kao slika',
+ 'pdf_no_metadata' => 'Ne mogu se dobiti meta-podaci iz PDF-a',
+ 'pdf_page_error' => 'Broj strane izlazi van opsega',
+);
+
+/** Seeltersk (Seeltersk)
+ * @author Pyt
+ */
+$messages['stq'] = array(
+ 'pdf-desc' => 'Snitsteede foar dät Bekiekjen fon PDF-Doatäie in dän Bielde-Modus',
+ 'pdf_no_metadata' => 'Neen Metadoaten in dät PDF deer.',
+ 'pdf_page_error' => 'Siedentaal buute Riege.',
+);
+
+/** Swedish (svenska)
+ * @author Ainali
+ * @author M.M.S.
+ */
+$messages['sv'] = array(
+ 'pdf-desc' => 'Hantering av PDF-visning i bildläge',
+ 'pdf_no_metadata' => 'Kan inte hämta metadata från PDF',
+ 'pdf_page_error' => 'Sidnummer överstiger antal sidor i dokumentet',
+ 'exif-pdf-producer' => 'Konverteringsprogram',
+ 'exif-pdf-version' => 'Version av PDF-format',
+ 'exif-pdf-encrypted' => 'Krypterad',
+ 'exif-pdf-pagesize' => 'Sidstorlek',
+);
+
+/** Tamil (தமிழà¯)
+ * @author Shanmugamp7
+ * @author TRYPPN
+ * @author மதனாஹரனà¯
+ */
+$messages['ta'] = array(
+ 'pdf-desc' => 'PDF கோபà¯à®ªà¯à®•à®³à¯ˆ உரà¯à®µ à®®à¯à®±à¯ˆà®¯à®¿à®²à¯ பாரà¯à®•à¯à®• கையாளà¯à®©à®°à¯',
+ 'pdf_no_metadata' => 'PDF இரà¯à®¨à¯à®¤à¯ மேலà¯à®¤à®°à®µà¯ˆ பெற இயலவிலà¯à®²à¯ˆ',
+ 'pdf_page_error' => 'பகà¯à®•à®¤à¯à®¤à®¿à®©à¯ எண௠கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà¯à®Ÿ வரையறையில௠இலà¯à®²à¯ˆ',
+ 'exif-pdf-producer' => 'மாறà¯à®±à®©à®¿à®°à®²à¯',
+ 'exif-pdf-pagesize' => 'பகà¯à®• அளவà¯',
+);
+
+/** Telugu (తెలà±à°—à±)
+ * @author Veeven
+ */
+$messages['te'] = array(
+ 'pdf_page_error' => 'à°ªà±à°Ÿ సంఖà±à°¯ అవధిలో లేదà±',
+);
+
+/** Turkmen (Türkmençe)
+ * @author Hanberke
+ */
+$messages['tk'] = array(
+ 'pdf-desc' => 'PDF faýllaryny görkeziş režiminde görkezmek üçin işleýji',
+ 'pdf_no_metadata' => 'PDF-den meta-maglumat alyp bolanok',
+ 'pdf_page_error' => 'Sahypa belgisi diapazonda däl',
+);
+
+/** Tagalog (Tagalog)
+ * @author AnakngAraw
+ */
+$messages['tl'] = array(
+ 'pdf-desc' => 'Tagapaghawak para sa pagtanaw ng mga talaksang PDF na nasa modalidad na panglarawan',
+ 'pdf_no_metadata' => 'Hindi makuha ang dato ng meta mula sa PDF',
+ 'pdf_page_error' => 'Wala sa sakop ang bilang ng pahina',
+);
+
+/** Turkish (Türkçe)
+ * @author Joseph
+ */
+$messages['tr'] = array(
+ 'pdf-desc' => 'PDF dosyalarını görüntü modunda görüntülemek için işleyici',
+ 'pdf_no_metadata' => "PDF'den metadata alınamıyor",
+ 'pdf_page_error' => 'Sayfa numarası aralıkta değil',
+);
+
+/** Uyghur (Arabic script) (ئۇيغۇرچە)
+ * @author Sahran
+ */
+$messages['ug-arab'] = array(
+ 'exif-pdf-encrypted' => 'شىÙىرلانغان',
+ 'exif-pdf-pagesize' => 'بەت چوڭلۇقى',
+);
+
+/** Ukrainian (українÑька)
+ * @author Base
+ * @author Prima klasy4na
+ */
+$messages['uk'] = array(
+ 'pdf-desc' => 'Оброблювач Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду PDF-файлів в режимі зображень',
+ 'pdf_no_metadata' => 'Ðе виходить отримати метадані з PDF',
+ 'pdf_page_error' => 'Ðомер Ñторінки не в діапазоні',
+ 'exif-pdf-producer' => 'програма конвертації',
+ 'exif-pdf-version' => 'ВерÑÑ–Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñƒ PDF',
+ 'exif-pdf-encrypted' => 'Зашифровано',
+ 'exif-pdf-pagesize' => 'Розмір Ñторінки',
+);
+
+/** Urdu (اردو)
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['ur'] = array(
+ 'pdf_page_error' => 'صÙØ­Û Ù†Ù…Ø¨Ø± رینج میں Ù†Ûیں',
+);
+
+/** vèneto (vèneto)
+ * @author Candalua
+ * @author GatoSelvadego
+ */
+$messages['vec'] = array(
+ 'pdf-desc' => 'Handler par vardar i file PDF in modalità imagine',
+ 'pdf_no_metadata' => 'No se riesse a recuperar i metadati dal PDF',
+ 'pdf_page_error' => "Nùmaro de pagina mia conpreso in te l'intervalo",
+ 'exif-pdf-producer' => 'Programa de conversion',
+ 'exif-pdf-version' => 'Version del formato PDF',
+ 'exif-pdf-encrypted' => 'Critigrafà',
+ 'exif-pdf-pagesize' => 'Dimension pàjina',
+);
+
+/** Vietnamese (Tiếng Việt)
+ * @author Minh Nguyen
+ * @author Vinhtantran
+ */
+$messages['vi'] = array(
+ 'pdf-desc' => 'Bộ xử lý để xem tập tin PDF ở dạng hình ảnh',
+ 'pdf_no_metadata' => 'Không thấy truy xuất siêu dữ liệu từ PDF',
+ 'pdf_page_error' => 'Số trang không nằm trong giới hạn',
+ 'exif-pdf-producer' => 'Chương trình chuyển đổi',
+ 'exif-pdf-version' => 'Phiên bản định dạng PDF',
+ 'exif-pdf-encrypted' => 'Mã hóa',
+ 'exif-pdf-pagesize' => 'Kích thước trang',
+);
+
+/** Yoruba (Yorùbá)
+ * @author Demmy
+ */
+$messages['yo'] = array(
+ 'pdf_no_metadata' => 'Dátà-àtẹ̀yìnwá kó ṣe é mú láti inú PDF',
+);
+
+/** Cantonese (粵語)
+ */
+$messages['yue'] = array(
+ 'pdf-desc' => '響圖åƒæ¨¡å¼ç‡PDF檔嘅處ç†å™¨',
+ 'pdf_no_metadata' => '唔能夠響PDF度拎metadata',
+ 'pdf_page_error' => 'é æ•¸å””響範åœåº¦',
+);
+
+/** Simplified Chinese (中文(简体)‎)
+ * @author Shirayuki
+ * @author Yfdyh000
+ */
+$messages['zh-hans'] = array(
+ 'pdf-desc' => '在图åƒæ¨¡å¼ä¸­æŸ¥çœ‹PDF文件的处ç†å™¨ã€‚',
+ 'pdf_no_metadata' => '无法在PDF中获å–元数æ®ã€‚',
+ 'pdf_page_error' => '页数ä¸åœ¨èŒƒå›´å†…。',
+ 'exif-pdf-producer' => '转æ¢ç¨‹åº',
+ 'exif-pdf-version' => 'PDFæ ¼å¼çš„版本',
+ 'exif-pdf-encrypted' => '加密',
+ 'exif-pdf-pagesize' => '页é¢å¤§å°',
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Mark85296341
+ * @author Simon Shek
+ */
+$messages['zh-hant'] = array(
+ 'pdf-desc' => '在圖片模å¼ä¸­ PDF 檔的處ç†å™¨',
+ 'pdf_no_metadata' => '無法在 PDF 中擷å–元數據',
+ 'pdf_page_error' => 'é æ•¸ä¸åœ¨ç¯„åœä¸­',
+ 'exif-pdf-producer' => '轉æ›ç¨‹å¼',
+ 'exif-pdf-version' => 'PDFæ ¼å¼çš„版本',
+ 'exif-pdf-encrypted' => '加密',
+ 'exif-pdf-pagesize' => 'é é¢å¤§å°',
+);
diff --git a/extensions/PdfHandler/PdfHandler.image.php b/extensions/PdfHandler/PdfHandler.image.php
new file mode 100644
index 00000000..49da7f4e
--- /dev/null
+++ b/extensions/PdfHandler/PdfHandler.image.php
@@ -0,0 +1,309 @@
+<?php
+/**
+ *
+ * Copyright © 2007 Xarax <jodeldi@gmx.de>
+ *
+ * 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
+ */
+
+/**
+ * inspired by djvuimage from Brion Vibber
+ * modified and written by xarax
+ */
+
+class PdfImage {
+
+ /**
+ * @param $filename
+ */
+ function __construct( $filename ) {
+ $this->mFilename = $filename;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isValid() {
+ return true;
+ }
+
+ /**
+ * @return array|bool
+ */
+ public function getImageSize() {
+ $data = $this->retrieveMetadata();
+ $size = self::getPageSize( $data, 1 );
+
+ if( $size ) {
+ $width = $size['width'];
+ $height = $size['height'];
+ return array( $width, $height, 'Pdf',
+ "width=\"$width\" height=\"$height\"" );
+ }
+ return false;
+ }
+
+ /**
+ * @param $data array
+ * @param $page
+ * @return array|bool
+ */
+ public static function getPageSize( $data, $page ) {
+ global $wgPdfHandlerDpi;
+
+ if( isset( $data['pages'][$page]['Page size'] ) ) {
+ $o = $data['pages'][$page]['Page size'];
+ } elseif( isset( $data['Page size'] ) ) {
+ $o = $data['Page size'];
+ } else {
+ $o = false;
+ }
+
+ if ( $o ) {
+ if( isset( $data['pages'][$page]['Page rot'] ) ) {
+ $r = $data['pages'][$page]['Page rot'];
+ } elseif( isset( $data['Page rot'] ) ) {
+ $r = $data['Page rot'];
+ } else {
+ $r = 0;
+ }
+ $size = explode( 'x', $o, 2 );
+
+ if ( $size ) {
+ $width = intval( trim( $size[0] ) / 72 * $wgPdfHandlerDpi );
+ $height = explode( ' ', trim( $size[1] ), 2 );
+ $height = intval( trim( $height[0] ) / 72 * $wgPdfHandlerDpi );
+ if ( ( $r/90 ) & 1 ) {
+ // Swap width and height for landscape pages
+ $t = $width;
+ $width = $height;
+ $height = $t;
+ }
+
+ return array(
+ 'width' => $width,
+ 'height' => $height
+ );
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @return array|bool|null
+ */
+ public function retrieveMetaData() {
+ global $wgPdfInfo, $wgPdftoText;
+
+ if ( $wgPdfInfo ) {
+ wfProfileIn( 'pdfinfo' );
+ $cmd = wfEscapeShellArg( $wgPdfInfo ) .
+ " -enc UTF-8 " . # Report metadata as UTF-8 text...
+ " -l 9999999 " . # Report page sizes for all pages
+ " -meta " . # Report XMP metadata
+ wfEscapeShellArg( $this->mFilename );
+ $retval = '';
+ $dump = wfShellExec( $cmd, $retval );
+ $data = $this->convertDumpToArray( $dump );
+ wfProfileOut( 'pdfinfo' );
+ } else {
+ $data = null;
+ }
+
+ # Read text layer
+ if ( isset( $wgPdftoText ) ) {
+ wfProfileIn( 'pdftotext' );
+ $cmd = wfEscapeShellArg( $wgPdftoText ) . ' '. wfEscapeShellArg( $this->mFilename ) . ' - ';
+ wfDebug( __METHOD__.": $cmd\n" );
+ $retval = '';
+ $txt = wfShellExec( $cmd, $retval );
+ wfProfileOut( 'pdftotext' );
+ if( $retval == 0 ) {
+ $txt = str_replace( "\r\n", "\n", $txt );
+ $pages = explode( "\f", $txt );
+ foreach( $pages as $page => $pageText ) {
+ # Get rid of invalid UTF-8, strip control characters
+ # Note we need to do this per page, as \f page feed would be stripped.
+ $pages[$page] = UtfNormal::cleanUp( $pageText );
+ }
+ $data['text'] = $pages;
+ }
+ }
+ return $data;
+ }
+
+ /**
+ * @param $dump string
+ * @return array|bool
+ */
+ protected function convertDumpToArray( $dump ) {
+ if ( strval( $dump ) == '' ) {
+ return false;
+ }
+
+ $lines = explode( "\n", $dump );
+ $data = array();
+
+ // Metadata is always the last item, and spans multiple lines.
+ $inMetadata = false;
+
+ // Basically this loop will go through each line, splitting key value
+ // pairs on the colon, until it gets to a "Metadata:\n" at which point
+ // it will gather all remaining lines into the xmp key.
+ foreach( $lines as $line ) {
+ if ( $inMetadata ) {
+ # Handle XMP differently due to diffence in line break
+ $data['xmp'] .= "\n$line";
+ continue;
+ }
+ $bits = explode( ':', $line, 2 );
+ if( count( $bits ) > 1 ) {
+ $key = trim( $bits[0] );
+ if ( $key === 'Metadata' ) {
+ $inMetadata = true;
+ $data['xmp'] = '';
+ continue;
+ }
+ $value = trim( $bits[1] );
+ $matches = array();
+ // "Page xx rot" will be in poppler 0.20's pdfinfo output
+ // See https://bugs.freedesktop.org/show_bug.cgi?id=41867
+ if( preg_match( '/^Page +(\d+) (size|rot)$/', $key, $matches ) ) {
+ $data['pages'][$matches[1]][$matches[2] == 'size' ? 'Page size' : 'Page rot'] = $value;
+ } else {
+ $data[$key] = $value;
+ }
+ }
+ }
+ $data = $this->postProcessDump( $data );
+ return $data;
+ }
+
+ /**
+ * Postprocess the metadata (convert xmp into useful form, etc)
+ *
+ * This is used to generate the metadata table at the bottom
+ * of the image description page.
+ *
+ * @param $data Array metadata
+ * @return Array post-processed metadata
+ */
+ protected function postProcessDump( array $data ) {
+
+ $meta = new BitmapMetadataHandler();
+ $items = array();
+ foreach( $data as $key => $val ) {
+ switch ( $key ) {
+ case 'Title':
+ $items['ObjectName'] = $val;
+ break;
+ case 'Subject':
+ $items['ImageDescription'] = $val;
+ break;
+ case 'Keywords':
+ // Sometimes we have empty keywords. This seems
+ // to be a product of how pdfinfo deals with keywords
+ // with spaces in them. Filter such empty keywords
+ $keyList = array_filter( explode( ' ', $val ) );
+ if ( count( $keyList ) > 0 ) {
+ $items['Keywords'] = $keyList;
+ }
+ break;
+ case 'Author':
+ $items['Artist'] = $val;
+ break;
+ case 'Creator':
+ // Program used to create file.
+ // Different from program used to convert to pdf.
+ $items['Software'] = $val;
+ break;
+ case 'Producer':
+ // Conversion program
+ $items['pdf-Producer'] = $val;
+ break;
+ case 'ModTime':
+ $timestamp = wfTimestamp( TS_EXIF, $val );
+ if ( $timestamp ) {
+ // 'if' is just paranoia
+ $items['DateTime'] = $timestamp;
+ }
+ break;
+ case 'CreationTime':
+ $timestamp = wfTimestamp( TS_EXIF, $val );
+ if ( $timestamp ) {
+ $items['DateTimeDigitized'] = $timestamp;
+ }
+ break;
+ // These last two (version and encryption) I was unsure
+ // if we should include in the table, since they aren't
+ // all that useful to editors. I leaned on the side
+ // of including. However not including if file
+ // is optimized/linearized since that is really useless
+ // to an editor.
+ case 'PDF version':
+ $items['pdf-Version'] = $val;
+ break;
+ case 'Encrypted':
+ // @todo: The value isn't i18n-ised. The appropriate
+ // place to do that is in FormatMetadata.php
+ // should add a hook a there.
+ // For reference, if encrypted this fields value looks like:
+ // "yes (print:yes copy:no change:no addNotes:no)"
+ $items['pdf-Encrypted'] = $val;
+ break;
+ // Note 'pages' and 'Pages' are different keys (!)
+ case 'pages':
+ // A pdf document can have multiple sized pages in it.
+ // (However 95% of the time, all pages are the same size)
+ // get a list of all the unique page sizes in document.
+ // This doesn't do anything with rotation as of yet,
+ // mostly because I am unsure of what a good way to
+ // present that information to the user would be.
+ $pageSizes = array();
+ foreach( $val as $page ) {
+ if( isset( $page['Page size'] ) ) {
+ $pageSizes[ $page['Page size'] ] = true;
+ }
+ }
+
+ $pageSizeArray = array_keys( $pageSizes );
+ if ( count( $pageSizeArray ) > 0 ) {
+ $items['pdf-PageSize'] = $pageSizeArray;
+ }
+ break;
+ }
+
+ }
+ $meta->addMetadata( $items, 'native' );
+
+ if ( isset( $data['xmp'] ) && function_exists( 'xml_parser_create_ns' ) ) {
+ // func exists verifies that the xml extension required for XMPReader
+ // is present (Almost always is present)
+ // @todo: This only handles generic xmp properties. Would be improved
+ // by handling pdf xmp properties (pdf and pdfx) via XMPInfo hook.
+ $xmp = new XMPReader();
+ $xmp->parse( $data['xmp'] );
+ $xmpRes = $xmp->getResults();
+ foreach ( $xmpRes as $type => $xmpSection ) {
+ $meta->addMetadata( $xmpSection, $type );
+ }
+ }
+ unset( $data['xmp'] );
+ $data['mergedMetadata'] = $meta->getMetadataArray();
+ return $data;
+ }
+}
diff --git a/extensions/PdfHandler/PdfHandler.php b/extensions/PdfHandler/PdfHandler.php
new file mode 100644
index 00000000..dbae091f
--- /dev/null
+++ b/extensions/PdfHandler/PdfHandler.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * PDF Handler extension -- handler for viewing PDF files in image mode.
+ *
+ * @file
+ * @ingroup Extensions
+ * @author Martin Seidel (Xarax) <jodeldi@gmx.de>
+ * @copyright Copyright © 2007 Martin Seidel (Xarax) <jodeldi@gmx.de>
+ *
+ * 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
+ */
+
+# Not a valid entry point, skip unless MEDIAWIKI is defined
+if ( !defined( 'MEDIAWIKI' ) ) {
+ echo 'PdfHandler extension';
+ exit( 1 );
+}
+
+$wgExtensionCredits['media'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'PDF Handler',
+ 'author' => array( 'Martin Seidel', 'Mike Połtyn' ),
+ 'descriptionmsg' => 'pdf-desc',
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:PdfHandler',
+);
+
+// External program requirements...
+$wgPdfProcessor = 'gs';
+$wgPdfPostProcessor = 'convert';
+$wgPdfInfo = 'pdfinfo';
+$wgPdftoText = 'pdftotext';
+
+$wgPdfOutputExtension = 'jpg';
+$wgPdfHandlerDpi = 150;
+
+// This setting, if enabled, will put creating thumbnails into a job queue,
+// so they do not have to be created on-the-fly,
+// but rather inconspicuously during normal wiki browsing
+$wgPdfCreateThumbnailsInJobQueue = false;
+
+// To upload new PDF files you'll need to do this too:
+// $wgFileExtensions[] = 'pdf';
+
+$dir = dirname( __FILE__ ) . '/';
+$wgExtensionMessagesFiles['PdfHandler'] = $dir . 'PdfHandler.i18n.php';
+$wgAutoloadClasses['PdfImage'] = $dir . 'PdfHandler.image.php';
+$wgAutoloadClasses['PdfHandler'] = $dir . 'PdfHandler_body.php';
+$wgAutoloadClasses['CreatePdfThumbnailsJob'] = $dir . 'CreatePdfThumbnailsJob.class.php';
+$wgMediaHandlers['application/pdf'] = 'PdfHandler';
+$wgJobClasses['createPdfThumbnailsJob'] = 'CreatePdfThumbnailsJob';
+$wgHooks['UploadVerifyFile'][] = 'CreatePdfThumbnailsJob::insertJobs';
diff --git a/extensions/PdfHandler/PdfHandler_body.php b/extensions/PdfHandler/PdfHandler_body.php
new file mode 100644
index 00000000..8fa6719b
--- /dev/null
+++ b/extensions/PdfHandler/PdfHandler_body.php
@@ -0,0 +1,347 @@
+<?php
+/**
+ * Copyright © 2007 Martin Seidel (Xarax) <jodeldi@gmx.de>
+ *
+ * Inspired by djvuhandler from Tim Starling
+ * Modified and written by Xarax
+ *
+ * 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
+ */
+
+class PdfHandler extends ImageHandler {
+
+ /**
+ * @return bool
+ */
+ function isEnabled() {
+ global $wgPdfProcessor, $wgPdfPostProcessor, $wgPdfInfo;
+
+ if ( !isset( $wgPdfProcessor ) || !isset( $wgPdfPostProcessor ) || !isset( $wgPdfInfo ) ) {
+ wfDebug( "PdfHandler is disabled, please set the following\n" );
+ wfDebug( "variables in LocalSettings.php:\n" );
+ wfDebug( "\$wgPdfProcessor, \$wgPdfPostProcessor, \$wgPdfInfo\n" );
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @param $file
+ * @return bool
+ */
+ function mustRender( $file ) {
+ return true;
+ }
+
+ /**
+ * @param $file
+ * @return bool
+ */
+ function isMultiPage( $file ) {
+ return true;
+ }
+
+ /**
+ * @param $name
+ * @param $value
+ * @return bool
+ */
+ function validateParam( $name, $value ) {
+ if ( in_array( $name, array( 'width', 'height', 'page' ) ) ) {
+ return ( $value > 0 );
+ }
+ return false;
+ }
+
+ /**
+ * @param $params array
+ * @return bool|string
+ */
+ function makeParamString( $params ) {
+ $page = isset( $params['page'] ) ? $params['page'] : 1;
+ if ( !isset( $params['width'] ) ) {
+ return false;
+ }
+ return "page{$page}-{$params['width']}px";
+ }
+
+ /**
+ * @param $str string
+ * @return array|bool
+ */
+ function parseParamString( $str ) {
+ $m = false;
+
+ if ( preg_match( '/^page(\d+)-(\d+)px$/', $str, $m ) ) {
+ return array( 'width' => $m[2], 'page' => $m[1] );
+ }
+
+ return false;
+ }
+
+ /**
+ * @param $params array
+ * @return array
+ */
+ function getScriptParams( $params ) {
+ return array(
+ 'width' => $params['width'],
+ 'page' => $params['page'],
+ );
+ }
+
+ /**
+ * @return array
+ */
+ function getParamMap() {
+ return array(
+ 'img_width' => 'width',
+ 'img_page' => 'page',
+ );
+ }
+
+ /**
+ * @param $width
+ * @param $height
+ * @param $msg
+ * @return MediaTransformError
+ */
+ protected function doThumbError( $width, $height, $msg ) {
+ return new MediaTransformError( 'thumbnail_error',
+ $width, $height, wfMessage( $msg )->inContentLanguage()->text() );
+ }
+
+ /**
+ * @param $image File
+ * @param $dstPath string
+ * @param $dstUrl string
+ * @param $params array
+ * @param $flags int
+ * @return MediaTransformError|MediaTransformOutput|ThumbnailImage|TransformParameterError
+ */
+ function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+ global $wgPdfProcessor, $wgPdfPostProcessor, $wgPdfHandlerDpi;
+
+ $metadata = $image->getMetadata();
+
+ if ( !$metadata ) {
+ return $this->doThumbError(
+ isset( $params['width'] ) ? $params['width'] : null,
+ isset( $params['height'] ) ? $params['height'] : null,
+ 'pdf_no_metadata'
+ );
+ }
+
+ if ( !$this->normaliseParams( $image, $params ) ) {
+ return new TransformParameterError( $params );
+ }
+
+ $width = $params['width'];
+ $height = $params['height'];
+ $page = $params['page'];
+
+ if ( $page > $this->pageCount( $image ) ) {
+ return $this->doThumbError( $width, $height, 'pdf_page_error' );
+ }
+
+ if ( $flags & self::TRANSFORM_LATER ) {
+ return new ThumbnailImage( $image, $dstUrl, $width, $height, false, $page );
+ }
+
+ if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
+ return $this->doThumbError( $width, $height, 'thumbnail_dest_directory' );
+ }
+
+ $srcPath = $image->getLocalRefPath();
+
+ $cmd = '(' . wfEscapeShellArg( $wgPdfProcessor );
+ $cmd .= " -sDEVICE=jpeg -sOutputFile=- -dFirstPage={$page} -dLastPage={$page}";
+ $cmd .= " -r{$wgPdfHandlerDpi} -dBATCH -dNOPAUSE -q ". wfEscapeShellArg( $srcPath );
+ $cmd .= " | " . wfEscapeShellArg( $wgPdfPostProcessor );
+ $cmd .= " -depth 8 -resize {$width} - ";
+ $cmd .= wfEscapeShellArg( $dstPath ) . ")";
+ $cmd .= " 2>&1";
+
+ wfProfileIn( 'PdfHandler' );
+ wfDebug( __METHOD__ . ": $cmd\n" );
+ $retval = '';
+ $err = wfShellExec( $cmd, $retval );
+ wfProfileOut( 'PdfHandler' );
+
+ $removed = $this->removeBadFile( $dstPath, $retval );
+
+ if ( $retval != 0 || $removed ) {
+ wfDebugLog( 'thumbnail',
+ sprintf( 'thumbnail failed on %s: error %d "%s" from "%s"',
+ wfHostname(), $retval, trim( $err ), $cmd ) );
+ return new MediaTransformError( 'thumbnail_error', $width, $height, $err );
+ } else {
+ return new ThumbnailImage( $image, $dstUrl, $width, $height, $dstPath, $page );
+ }
+ }
+
+ /**
+ * @param $image File
+ * @param $path string
+ * @return PdfImage
+ */
+ function getPdfImage( $image, $path ) {
+ if ( !$image ) {
+ $pdfimg = new PdfImage( $path );
+ } elseif ( !isset( $image->pdfImage ) ) {
+ $pdfimg = $image->pdfImage = new PdfImage( $path );
+ } else {
+ $pdfimg = $image->pdfImage;
+ }
+
+ return $pdfimg;
+ }
+
+ /**
+ * @param $image File
+ * @return bool
+ */
+ function getMetaArray( $image ) {
+ if ( isset( $image->pdfMetaArray ) ) {
+ return $image->pdfMetaArray;
+ }
+
+ $metadata = $image->getMetadata();
+
+ if ( !$this->isMetadataValid( $image, $metadata ) ) {
+ wfDebug( "Pdf metadata is invalid or missing, should have been fixed in upgradeRow\n" );
+ return false;
+ }
+
+ wfProfileIn( __METHOD__ );
+ wfSuppressWarnings();
+ $image->pdfMetaArray = unserialize( $metadata );
+ wfRestoreWarnings();
+ wfProfileOut( __METHOD__ );
+
+ return $image->pdfMetaArray;
+ }
+
+ /**
+ * @param $image File
+ * @param $path string
+ * @return array|bool
+ */
+ function getImageSize( $image, $path ) {
+ return $this->getPdfImage( $image, $path )->getImageSize();
+ }
+
+ /**
+ * @param $ext
+ * @param $mime string
+ * @param $params null
+ * @return array
+ */
+ function getThumbType( $ext, $mime, $params = null ) {
+ global $wgPdfOutputExtension;
+ static $mime;
+
+ if ( !isset( $mime ) ) {
+ $magic = MimeMagic::singleton();
+ $mime = $magic->guessTypesForExtension( $wgPdfOutputExtension );
+ }
+ return array( $wgPdfOutputExtension, $mime );
+ }
+
+ /**
+ * @param $image File
+ * @param $path string
+ * @return string
+ */
+ function getMetadata( $image, $path ) {
+ return serialize( $this->getPdfImage( $image, $path )->retrieveMetaData() );
+ }
+
+ /**
+ * @param $image File
+ * @param $metadata string
+ * @return bool
+ */
+ function isMetadataValid( $image, $metadata ) {
+ if ( !$metadata || $metadata === serialize(array()) ) {
+ return self::METADATA_BAD;
+ } elseif ( strpos( $metadata, 'mergedMetadata' ) === false ) {
+ return self::METADATA_COMPATIBLE;
+ }
+ return self::METADATA_GOOD;
+ }
+
+ /**
+ * @param $image File
+ * @return bool|int
+ */
+ function formatMetadata( $image ) {
+ $meta = $image->getMetadata();
+
+ if ( !$meta ) {
+ return false;
+ }
+ wfSuppressWarnings();
+ $meta = unserialize( $meta );
+ wfRestoreWarnings();
+
+ if ( !isset( $meta['mergedMetadata'] )
+ || !is_array( $meta['mergedMetadata'] )
+ || count( $meta['mergedMetadata'] ) < 1
+ ) {
+ return false;
+ }
+
+ // Inherited from MediaHandler.
+ return $this->formatMetadataHelper( $meta['mergedMetadata'] );
+ }
+
+ /**
+ * @param $image
+ * @return bool|int
+ */
+ function pageCount( $image ) {
+ $data = $this->getMetaArray( $image );
+ if ( !$data || !isset( $data['Pages'] ) ) {
+ return false;
+ }
+ return intval( $data['Pages'] );
+ }
+
+ /**
+ * @param $image File
+ * @param $page int
+ * @return array|bool
+ */
+ function getPageDimensions( $image, $page ) {
+ $data = $this->getMetaArray( $image );
+ return PdfImage::getPageSize( $data, $page );
+ }
+
+ /**
+ * @param $image File
+ * @param $page int
+ * @return bool
+ */
+ function getPageText( $image, $page ) {
+ $data = $this->getMetaArray( $image, true );
+ if ( !$data || !isset( $data['text'] ) || !isset( $data['text'][$page - 1] ) ) {
+ return false;
+ }
+ return $data['text'][$page - 1];
+ }
+
+}
diff --git a/extensions/Poem/Poem.class.php b/extensions/Poem/Poem.class.php
new file mode 100644
index 00000000..586750c0
--- /dev/null
+++ b/extensions/Poem/Poem.class.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * This class handles formatting poems in WikiText, specifically anything within
+ * <poem></poem> tags.
+ */
+class Poem {
+ /**
+ * Bind the renderPoem function to the <poem> tag
+ * @param Parser $parser
+ * @return bool true
+ */
+ public static function init( &$parser ) {
+ $parser->setHook( 'poem', array( 'Poem', 'renderPoem' ) );
+ return true;
+ }
+
+ /**
+ * Parse the text into proper poem format
+ * @param string $in The text inside the poem tag
+ * @param array $param
+ * @param Parser $parser
+ * @param boolean $frame
+ * @return string
+ */
+ public static function renderPoem( $in, $param = array(), $parser = null, $frame = false ) {
+ // using newlines in the text will cause the parser to add <p> tags,
+ // which may not be desired in some cases
+ $newline = isset( $param['compact'] ) ? '' : "\n";
+
+ $tag = $parser->insertStripItem( "<br />", $parser->mStripState );
+
+ // replace colons with indented spans
+ $text = preg_replace_callback( '/^(:+)(.+)$/m', array( 'Poem', 'indentVerse' ), $in );
+
+ // replace newlines with <br /> tags unless they are at the beginning or end
+ // of the poem
+ $text = preg_replace(
+ array( "/^\n/", "/\n$/D", "/\n/" ),
+ array( "", "", "$tag\n" ),
+ $text );
+
+ // replace spaces at the beginning of a line with non-breaking spaces
+ $text = preg_replace_callback( '/^( +)/m', array( 'Poem', 'replaceSpaces' ), $text );
+
+ $text = $parser->recursiveTagParse( $text, $frame );
+
+ $attribs = Sanitizer::validateTagAttributes( $param, 'div' );
+
+ // Wrap output in a <div> with "poem" class.
+ if ( isset( $attribs['class'] ) ) {
+ $attribs['class'] = 'poem ' . $attribs['class'];
+ } else {
+ $attribs['class'] = 'poem';
+ }
+
+ return Html::rawElement( 'div', $attribs, $newline . trim( $text ) . $newline );
+ }
+
+ /**
+ * Callback for preg_replace_callback() that replaces spaces with non-breaking spaces
+ * @param array $m Matches from the regular expression
+ * - $m[1] consists of 1 or more spaces
+ * @return mixed
+ */
+ protected static function replaceSpaces( $m ) {
+ return str_replace( ' ', '&#160;', $m[1] );
+ }
+
+ /**
+ * Callback for preg_replace_callback() that wraps content in an indented span
+ * @param array $m Matches from the regular expression
+ * - $m[1] consists of 1 or more colons
+ * - $m[2] consists of the text after the colons
+ * @return string
+ */
+ protected static function indentVerse( $m ) {
+ $attribs = array(
+ 'class' => 'mw-poem-indented',
+ 'style' => 'display: inline-block; margin-left: ' . strlen( $m[1] ) . 'em;'
+ );
+ // @todo Should this really be raw?
+ return Html::rawElement( 'span', $attribs, $m[2] );
+ }
+}
diff --git a/extensions/Poem/Poem.i18n.php b/extensions/Poem/Poem.i18n.php
new file mode 100644
index 00000000..26fecca6
--- /dev/null
+++ b/extensions/Poem/Poem.i18n.php
@@ -0,0 +1,721 @@
+<?php
+/**
+ * Internationalisation file for Poem extension.
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$messages = array();
+
+$messages['en'] = array(
+ 'poem-desc' => 'Adds <code>&lt;poem&gt;</code> tag for poem formatting',
+);
+
+/** Message documentation (Message documentation)
+ * @author Raymond
+ */
+$messages['qqq'] = array(
+ 'poem-desc' => 'Extension description displayed on [[Special:Version]]',
+);
+
+/** Afrikaans (Afrikaans)
+ * @author Naudefj
+ */
+$messages['af'] = array(
+ 'poem-desc' => "Maak 'n <code>&lt;poem&gt;</code> etiket beskikbaar vir die formatering van poësie",
+);
+
+/** Aragonese (aragonés)
+ * @author Juanpabl
+ */
+$messages['an'] = array(
+ 'poem-desc' => 'Adibe a etiqueta <code>&lt;poem&gt;</code> ta formateyar poesía',
+);
+
+/** Arabic (العربية)
+ * @author Meno25
+ */
+$messages['ar'] = array(
+ 'poem-desc' => 'يضي٠الوسم <code>&lt;poem&gt;</code> لصياغة القصيدة',
+);
+
+/** Egyptian Spoken Arabic (مصرى)
+ * @author Ramsis II
+ */
+$messages['arz'] = array(
+ 'poem-desc' => 'بيضي٠تاج ال <code>&lt;poem&gt;</code> لصياغة القصيدة',
+);
+
+/** Asturian (asturianu)
+ * @author Esbardu
+ */
+$messages['ast'] = array(
+ 'poem-desc' => 'Añade la etiqueta <code>&lt;poem&gt;</code> pal formatu de poemes',
+);
+
+/** Azerbaijani (azərbaycanca)
+ * @author Sortilegus
+ */
+$messages['az'] = array(
+ 'poem-desc' => 'Şeirlərin formatlaşdırılması üçün <code>&lt;poem&gt;</code> teqini əlavə edir',
+);
+
+/** Bashkir (башҡортÑа)
+ * @author Assele
+ */
+$messages['ba'] = array(
+ 'poem-desc' => 'Шиғырҙарҙы форматлау Ó©Ñөн <code>&lt;poem&gt;</code> билдәһен өҫтәй',
+);
+
+/** Bavarian (Boarisch)
+ * @author Man77
+ */
+$messages['bar'] = array(
+ 'poem-desc' => "Fügt s'<code>&lt;poem&gt;</code>-Tag zum Formatian vu Gedichtln dazua",
+);
+
+/** Southern Balochi (بلوچی مکرانی)
+ * @author Mostafadaneshvar
+ */
+$messages['bcc'] = array(
+ 'poem-desc' => 'هورکنت <code>&lt;poem&gt;</code> برچسپء په Ùرمت شئر',
+);
+
+/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
+ * @author Jim-by
+ */
+$messages['be-tarask'] = array(
+ 'poem-desc' => 'Дадае Ñ‚Ñг <code>&lt;poem&gt;</code> Ð´Ð»Ñ Ñ„Ð°Ñ€Ð¼Ð°Ñ‚Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð²ÐµÑ€ÑˆÐ°Ñž',
+);
+
+/** Bulgarian (българÑки)
+ * @author DCLXVI
+ */
+$messages['bg'] = array(
+ 'poem-desc' => 'Ð”Ð¾Ð±Ð°Ð²Ñ ÐµÑ‚Ð¸ÐºÐµÑ‚ <code>&lt;poem&gt;</code> за форматиране на Ñтихове',
+);
+
+/** Bengali (বাংলা)
+ * @author Bellayet
+ */
+$messages['bn'] = array(
+ 'poem-desc' => 'কবিতার ফরমেটিং à¦à¦° জনà§à¦¯ <code>&lt;poem&gt;</code> টà§à¦¯à¦¾à¦— যোগ করà§à¦¨',
+);
+
+/** Breton (brezhoneg)
+ * @author Fulup
+ */
+$messages['br'] = array(
+ 'poem-desc' => 'Ouzhpennañ a ra ar valizenn <code>&lt;poem&gt;</code> da furmadiñ testennoù barzhonegoù.',
+);
+
+/** Bosnian (bosanski)
+ * @author CERminator
+ */
+$messages['bs'] = array(
+ 'poem-desc' => 'Dodaje oznaku <code>&lt;poem&gt;</code> za formatiranje stihova',
+);
+
+/** Catalan (català)
+ * @author Paucabot
+ */
+$messages['ca'] = array(
+ 'poem-desc' => "Afegeix l'etiqueta <code>&lt;poem&gt;</code> per al formatatge de poemes",
+);
+
+/** Sorani Kurdish (کوردی)
+ * @author Asoxor
+ */
+$messages['ckb'] = array(
+ 'poem-desc' => 'تاگی <code>&lt;poem&gt;</code> زێدەدەکات بۆ ڕێکخستنی ھۆنراوەکان',
+);
+
+/** Czech (Äesky)
+ * @author Matěj Grabovský
+ */
+$messages['cs'] = array(
+ 'poem-desc' => 'PÅ™idává znaÄku <code>&lt;poem&gt;</code> pro formátování básní',
+);
+
+/** Danish (dansk)
+ * @author Peter Alberti
+ */
+$messages['da'] = array(
+ 'poem-desc' => 'Tilføjer tagget <code>&lt;poem&gt;</code> til formatering af digte',
+);
+
+/** German (Deutsch)
+ * @author Kghbln
+ * @author Raimond Spekking
+ */
+$messages['de'] = array(
+ 'poem-desc' => 'Ergänzt das Tag <code>&lt;poem&gt;</code> zur Formatierung von Gedichten',
+);
+
+/** Zazaki (Zazaki)
+ * @author Aspar
+ */
+$messages['diq'] = array(
+ 'poem-desc' => 'qey fesaldayişê şiiri etiketê <code>&lt;poem&gt;</code>i têarê keno',
+);
+
+/** Lower Sorbian (dolnoserbski)
+ * @author Michawiki
+ */
+$messages['dsb'] = array(
+ 'poem-desc' => 'Pśidawa toflicku <code>&lt;poem&gt;</code> za formatěrowanje basnjow',
+);
+
+/** Greek (Ελληνικά)
+ * @author Dead3y3
+ */
+$messages['el'] = array(
+ 'poem-desc' => 'ΠÏοσθέτει την ετικέτα <code>&lt;poem&gt;</code> για την μοÏφοποίηση ποιημάτων',
+);
+
+/** Esperanto (Esperanto)
+ * @author Yekrats
+ */
+$messages['eo'] = array(
+ 'poem-desc' => 'Aldonas <code>&lt;poem&gt;</code> etikedon por formatado de poezio.',
+);
+
+/** Spanish (español)
+ * @author Muro de Aguas
+ */
+$messages['es'] = array(
+ 'poem-desc' => 'Añade la etiqueta <code>&lt;poem&gt;</code> para dar el formato propio de un poema.',
+);
+
+/** Estonian (eesti)
+ * @author Pikne
+ */
+$messages['et'] = array(
+ 'poem-desc' => 'Lisab <code>&lt;poem&gt;</code>-sildi luuletuse vormindamiseks.',
+);
+
+/** Basque (euskara)
+ * @author Theklan
+ */
+$messages['eu'] = array(
+ 'poem-desc' => '<code>&lt;poem&gt;</code> etiketa gehitzen du olerkien formaturako',
+);
+
+/** Persian (Ùارسی)
+ * @author Huji
+ */
+$messages['fa'] = array(
+ 'poem-desc' => 'برچسب <code>&lt;poem&gt;</code> را برای قالب‌بندی شعرها می‌اÙزاید',
+);
+
+/** Finnish (suomi)
+ * @author Nike
+ */
+$messages['fi'] = array(
+ 'poem-desc' => 'Mahdollistaa runojen muotoilun <code>&lt;poem&gt;</code>-elementillä.',
+);
+
+/** French (français)
+ * @author Grondin
+ */
+$messages['fr'] = array(
+ 'poem-desc' => 'Ajoute la balise <code>&lt;poem&gt;</code> pour le formatage des poèmes',
+);
+
+/** Franco-Provençal (arpetan)
+ * @author ChrisPtDe
+ */
+$messages['frp'] = array(
+ 'poem-desc' => 'Apond la balisa <code>&lt;poem&gt;</code> por lo formatâjo des poèmos.',
+);
+
+/** Northern Frisian (Nordfriisk)
+ * @author Murma174
+ */
+$messages['frr'] = array(
+ 'poem-desc' => 'Saat <code>&lt;poem&gt;</code> diartu, am dachtangen tu formatiarin',
+);
+
+/** Galician (galego)
+ * @author Alma
+ */
+$messages['gl'] = array(
+ 'poem-desc' => 'Engada a etiqueta <code>&lt;poem&gt;</code> para o formato poema',
+);
+
+/** Swiss German (Alemannisch)
+ * @author Als-Holder
+ */
+$messages['gsw'] = array(
+ 'poem-desc' => 'Fiegt s <code>&lt;poem&gt;</code>-Tag zue zum Formatiere vu Gedicht',
+);
+
+/** Hebrew (עברית)
+ */
+$messages['he'] = array(
+ 'poem-desc' => 'הוספת התגית <code>&lt;poem&gt;</code> לעיצוב שירה',
+);
+
+/** Hindi (हिनà¥à¤¦à¥€)
+ * @author Kaustubh
+ */
+$messages['hi'] = array(
+ 'poem-desc' => 'कविता लिखने के लिये आवशà¥à¤¯à¤• <code>&lt;poem&gt;</code> टॅग देता हैं',
+);
+
+/** Hiligaynon (Ilonggo)
+ * @author Tagimata
+ */
+$messages['hil'] = array(
+ 'poem-desc' => 'Gadugang <code>&lt;poem&gt;</code> tag para sa pagformat sang tula',
+);
+
+/** Croatian (hrvatski)
+ * @author Dalibor Bosits
+ */
+$messages['hr'] = array(
+ 'poem-desc' => 'Dodaje <code>&lt;poem&gt;</code> oznaku za formatiranje pjesama',
+);
+
+/** Upper Sorbian (hornjoserbsce)
+ * @author Michawiki
+ */
+$messages['hsb'] = array(
+ 'poem-desc' => 'PÅ™idawa tafliÄku <code>&lt;poem&gt;</code> za formatowanje basnjow',
+);
+
+/** Hungarian (magyar)
+ * @author Dani
+ */
+$messages['hu'] = array(
+ 'poem-desc' => '<code>&lt;poem&gt;</code> tag a versek formázásához',
+);
+
+/** Interlingua (interlingua)
+ * @author McDutchie
+ */
+$messages['ia'] = array(
+ 'poem-desc' => 'Adde le etiquetta <code>&lt;poem&gt;</code> pro formatar poemas',
+);
+
+/** Indonesian (Bahasa Indonesia)
+ * @author IvanLanin
+ */
+$messages['id'] = array(
+ 'poem-desc' => 'Menambahkan tag <code>&lt;poem&gt;</code> tag untuk pemformatan puisi',
+);
+
+/** Iloko (Ilokano)
+ * @author Lam-ang
+ */
+$messages['ilo'] = array(
+ 'poem-desc' => 'Ikkan na iti<code>&lt;poem&gt;</code> nga tag para ti pagporma ti daniw',
+);
+
+/** Italian (italiano)
+ * @author BrokenArrow
+ */
+$messages['it'] = array(
+ 'poem-desc' => 'Aggiunge il tag <code>&lt;poem&gt;</code> per la formattazione dei testi poetici',
+);
+
+/** Japanese (日本語)
+ * @author Aotake
+ * @author JtFuruhata
+ * @author Shirayuki
+ */
+$messages['ja'] = array(
+ 'poem-desc' => 'è©©ã‚’æ•´å½¢ã™ã‚‹ <code>&lt;poem&gt;</code> タグを追加ã™ã‚‹',
+);
+
+/** Jutish (jysk)
+ * @author Huslåke
+ */
+$messages['jut'] = array(
+ 'poem-desc' => 'Tilføje <code>&lt;poem&gt;</code> tag før digt formåter',
+);
+
+/** Javanese (Basa Jawa)
+ * @author Meursault2004
+ */
+$messages['jv'] = array(
+ 'poem-desc' => 'Nambahaké tag <code>&lt;poem&gt;</code> tag kanggo formatting tembang utawa puisi',
+);
+
+/** Georgian (ქáƒáƒ áƒ—ული)
+ * @author David1010
+ */
+$messages['ka'] = array(
+ 'poem-desc' => 'áƒáƒ›áƒáƒ¢áƒ”ბს ტეგს <code>&lt;პáƒáƒ”მáƒ&gt;</code> ლექსების ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბისáƒáƒ—ვის',
+);
+
+/** Khmer (ភាសាážáŸ’មែរ)
+ * @author Lovekhmer
+ * @author Thearith
+ */
+$messages['km'] = array(
+ 'poem-desc' => 'ដាក់ប្លាក <code>&lt;poem&gt;</code> សម្រាប់ទ្រង់ទ្រាយកំណាព្យ',
+);
+
+/** Korean (한국어)
+ * @author ToePeu
+ */
+$messages['ko'] = array(
+ 'poem-desc' => 'ì‹œ 형ì‹ì„ 위해 <code>&lt;poem&gt;</code> 태그를 추가',
+);
+
+/** Colognian (Ripoarisch)
+ * @author Purodha
+ */
+$messages['ksh'] = array(
+ 'poem-desc' => 'Brengk et <code>&lt;poem&gt;</code>-Kommando met, för Jedeeshte ze jeshtallde.',
+);
+
+/** Luxembourgish (Lëtzebuergesch)
+ * @author Robby
+ */
+$messages['lb'] = array(
+ 'poem-desc' => "Setzt de <code>&lt;poem&gt;</code>-Tag fir d'Formatéierung vu Gedichter derbäi",
+);
+
+/** Limburgish (Limburgs)
+ * @author Matthias
+ */
+$messages['li'] = array(
+ 'poem-desc' => 'Voegt de tag <code>&lt;poem&gt;</code> toe veur de opmaak van poëzie',
+);
+
+/** Lithuanian (lietuvių)
+ * @author Garas
+ * @author Hugo.arg
+ */
+$messages['lt'] = array(
+ 'poem-desc' => 'Prideda <code>&lt;poem&gt;</code> gaires poemų formatavimui',
+);
+
+/** Mizo (Mizo ţawng)
+ * @author RMizo
+ */
+$messages['lus'] = array(
+ 'poem-desc' => 'Hlahril tàrphung siamrem nan tàrreuh <code>&lt;poem&gt;</code> hi a belh.',
+);
+
+/** Latvian (latviešu)
+ * @author Xil
+ */
+$messages['lv'] = array(
+ 'poem-desc' => 'Pievieno <code>&lt;poem&gt;</code> tagu dzejas formatēšanai',
+);
+
+/** Macedonian (македонÑки)
+ * @author Bjankuloski06
+ * @author Brest
+ */
+$messages['mk'] = array(
+ 'poem-desc' => 'Додава <code>&lt;poem&gt;</code> ознака за форматирање на Ñтихови',
+);
+
+/** Malayalam (മലയാളം)
+ * @author Shijualex
+ */
+$messages['ml'] = array(
+ 'poem-desc' => 'പദàµà´¯à´¤àµà´¤à´¿à´¨àµà´±àµ† ഫോർമാറàµà´±à´¿à´™àµà´™à´¿à´¨àµ <code>&lt;poem&gt;</code> à´Žà´¨àµà´¨ ടാഗൠചേർകàµà´•àµà´¨àµà´¨àµ',
+);
+
+/** Marathi (मराठी)
+ * @author Kaustubh
+ */
+$messages['mr'] = array(
+ 'poem-desc' => 'कवितेचà¥à¤¯à¤¾ सादरीकरणासाठी आवशà¥à¤¯à¤• असणारा <code>&lt;poem&gt;</code> टॅग देतो.',
+);
+
+/** Malay (Bahasa Melayu)
+ * @author Aviator
+ */
+$messages['ms'] = array(
+ 'poem-desc' => 'Menambah tag <code>&lt;poem&gt;</code> untuk pemformatan puisi',
+);
+
+/** Norwegian Bokmål (norsk (bokmål)‎)
+ */
+$messages['nb'] = array(
+ 'poem-desc' => 'Legger til taggen <code>&lt;poem&gt;</code> for å kunne formatere dikt',
+);
+
+/** Low German (Plattdüütsch)
+ * @author Slomox
+ */
+$messages['nds'] = array(
+ 'poem-desc' => 'Föögt dat <code>&lt;poem&gt;</code>-Tag för dat Formateren vun Gedichten to',
+);
+
+/** Dutch (Nederlands)
+ * @author Siebrand
+ */
+$messages['nl'] = array(
+ 'poem-desc' => 'Voegt de tag <code>&lt;poem&gt;</code> toe voor de opmaak van poëzie',
+);
+
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
+ * @author Harald Khan
+ */
+$messages['nn'] = array(
+ 'poem-desc' => 'Legg til merket <code>&lt;poem&gt;</code> for å kunna formatera dikt',
+);
+
+/** Occitan (occitan)
+ * @author Cedric31
+ */
+$messages['oc'] = array(
+ 'poem-desc' => 'Apond la balisa <code>&lt;poem&gt;</code> pel formatatge dels poèmas',
+);
+
+/** Polish (polski)
+ * @author Sp5uhe
+ */
+$messages['pl'] = array(
+ 'poem-desc' => 'Dodaje znacznik <code>&lt;poem&gt;</code> służący do formatowania wierszy',
+);
+
+/** Piedmontese (Piemontèis)
+ * @author Dragonòt
+ */
+$messages['pms'] = array(
+ 'poem-desc' => 'A gionta ël tag <code>&lt;poem&gt;</code> për formatassion ëd poema',
+);
+
+/** Pashto (پښتو)
+ * @author Ahmed-Najib-Biabani-Ibrahimkhel
+ */
+$messages['ps'] = array(
+ 'poem-desc' => 'د شعر بڼه ورکولو Ú©Ú“Ù†Û Ù„Ù¾Ø§Ø±Ù‡ د <tt>&lt;شعر&gt;</tt> وييکه ورګډوي',
+);
+
+/** Portuguese (português)
+ * @author Hamilton Abreu
+ * @author Malafaya
+ */
+$messages['pt'] = array(
+ 'poem-desc' => 'Adiciona o elemento <code>&lt;poem&gt;</code> para formatação de poemas',
+);
+
+/** Brazilian Portuguese (português do Brasil)
+ * @author Eduardo.mps
+ */
+$messages['pt-br'] = array(
+ 'poem-desc' => 'Adiciona a marca <code>&lt;poem&gt;</code> para formatação de poemas',
+);
+
+/** Tarifit (Tarifit)
+ * @author Aryaz
+ */
+$messages['rif'] = array(
+ 'poem-desc' => 'Issadaf <code>&lt;poem&gt;</code> i usmal d tira n tmdyazt',
+);
+
+/** Romanian (română)
+ * @author Mihai
+ */
+$messages['ro'] = array(
+ 'poem-desc' => 'Adaugă eticheta <code>&lt;poem&gt;</code> pentru formatarea poem',
+);
+
+/** tarandíne (tarandíne)
+ * @author Joetaras
+ */
+$messages['roa-tara'] = array(
+ 'poem-desc' => "Aggiunge 'u tag <code>&lt;poem&gt;</code> p'a formattazione de le poesie",
+);
+
+/** Russian (руÑÑкий)
+ * @author ÐлекÑандр Сигачёв
+ */
+$messages['ru'] = array(
+ 'poem-desc' => 'ДобавлÑет тег <code>&lt;poem&gt;</code> Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтихов',
+);
+
+/** Rusyn (руÑиньÑкый)
+ * @author Gazeb
+ */
+$messages['rue'] = array(
+ 'poem-desc' => 'ДодаÑÑ‚ÑŒ значку <code>&lt;poem&gt;</code> про Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¾Ð²Ð°Ð½Ñ Ð²Ñ–Ñ€ÑˆÑ–Ð²',
+);
+
+/** Sakha (Ñаха тыла)
+ * @author HalanTul
+ */
+$messages['sah'] = array(
+ 'poem-desc' => 'Хоһооннору Ñуруйарга <code>&lt;poem&gt;</code> тиÑги ÑбÑÑ€',
+);
+
+/** Sicilian (sicilianu)
+ * @author Melos
+ */
+$messages['scn'] = array(
+ 'poem-desc' => 'Iunci lu tag <code>&lt;poem&gt;</code> pi la furmattazioni di li testa puetici',
+);
+
+/** Slovak (slovenÄina)
+ * @author Helix84
+ */
+$messages['sk'] = array(
+ 'poem-desc' => 'Pridáva znaÄku <code>&lt;poem&gt;</code> pre formátovanie básní',
+);
+
+/** Slovenian (slovenÅ¡Äina)
+ * @author Dbc334
+ */
+$messages['sl'] = array(
+ 'poem-desc' => 'Doda etiketo <code>&lt;poem&gt;</code> za oblikovanje pesmi',
+);
+
+/** Lower Silesian (Schläsch)
+ * @author Piotron
+ */
+$messages['sli'] = array(
+ 'poem-desc' => 'Fiegt is <code>&lt;poem&gt;</code>-Tag zur Furmatierung voo Gedichta hinzu',
+);
+
+/** Albanian (shqip)
+ * @author Puntori
+ */
+$messages['sq'] = array(
+ 'poem-desc' => 'Vendosë kodin <code>&lt;poem&gt;</code> për formatim të poezive',
+);
+
+/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Millosh
+ * @author Nikola Smolenski
+ */
+$messages['sr-ec'] = array(
+ 'poem-desc' => 'Додаје <code>&lt;poem&gt;</code> ознаку за форматирање пеÑама.',
+);
+
+/** Serbian (Latin script) (srpski (latinica)‎)
+ * @author Michaello
+ */
+$messages['sr-el'] = array(
+ 'poem-desc' => 'Dodaje <code>&lt;poem&gt;</code> oznaku za formatiranje pesama.',
+);
+
+/** Seeltersk (Seeltersk)
+ * @author Pyt
+ */
+$messages['stq'] = array(
+ 'poem-desc' => 'Föiget dät <code>&lt;poem&gt;</code>-Tag tou ju Formatierenge fon Gedichte bietou',
+);
+
+/** Swedish (svenska)
+ * @author Lejonel
+ */
+$messages['sv'] = array(
+ 'poem-desc' => 'Lägger till taggen <code>&lt;poem&gt;</code> för att formatera dikter',
+);
+
+/** Telugu (తెలà±à°—à±)
+ * @author Veeven
+ */
+$messages['te'] = array(
+ 'poem-desc' => 'పదà±à°¯à°¾à°² ఫారà±à°®à°¾à°Ÿà°¿à°‚à°—à±à°•à±ˆ <code>&lt;poem&gt;</code> అనే టాగà±à°¨à°¿ చేరà±à°¸à±à°¤à±à°‚ది',
+);
+
+/** Tajik (Cyrillic script) (тоҷикӣ)
+ * @author Ibrahim
+ */
+$messages['tg-cyrl'] = array(
+ 'poem-desc' => 'БарчаÑби <code>&lt;poem&gt;</code>-ро барои қолаббандиҳои шеърҳо илова мекунад',
+);
+
+/** Tajik (Latin script) (tojikī)
+ * @author Liangent
+ */
+$messages['tg-latn'] = array(
+ 'poem-desc' => "Barcasbi <code>&lt;poem&gt;</code>-ro baroi qolabbandihoi ÅŸe'rho ilova mekunad",
+);
+
+/** Thai (ไทย)
+ * @author Octahedron80
+ */
+$messages['th'] = array(
+ 'poem-desc' => 'เพิ่มà¹à¸—็ภ<code>&lt;poem&gt;</code> สำหรับà¸à¸²à¸£à¸ˆà¸±à¸”รูปà¹à¸šà¸šà¸šà¸—à¸à¸§à¸µ',
+);
+
+/** Turkmen (Türkmençe)
+ * @author Hanberke
+ */
+$messages['tk'] = array(
+ 'poem-desc' => 'Goşgy formatirlemesi üçin <code>&lt;poem&gt;</code> tegini goşýar',
+);
+
+/** Tagalog (Tagalog)
+ * @author AnakngAraw
+ */
+$messages['tl'] = array(
+ 'poem-desc' => 'Nagdaragdag ng tatak na <code>&lt;poem&gt;</code> para sa pagpopormat ng tula',
+);
+
+/** Turkish (Türkçe)
+ * @author Joseph
+ */
+$messages['tr'] = array(
+ 'poem-desc' => 'Şiir biçimlendirmesi için <code>&lt;poem&gt;</code> etiketini ekler',
+);
+
+/** Ukrainian (українÑька)
+ * @author Ahonc
+ */
+$messages['uk'] = array(
+ 'poem-desc' => 'Додає тег <code>&lt;poem&gt;</code> Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ñ€ÑˆÑ–Ð²',
+);
+
+/** vèneto (vèneto)
+ * @author Candalua
+ */
+$messages['vec'] = array(
+ 'poem-desc' => 'Zonta el tag <code>&lt;poem&gt;</code> par la formatazion dei testi poetici',
+);
+
+/** Veps (vepsän kel’)
+ * @author Игорь БродÑкий
+ */
+$messages['vep'] = array(
+ 'poem-desc' => 'Ližadab <code>&lt;poem&gt;</code>-virg runod formatiruides',
+);
+
+/** Vietnamese (Tiếng Việt)
+ * @author Minh Nguyen
+ */
+$messages['vi'] = array(
+ 'poem-desc' => 'Thêm thẻ <code>&lt;poem&gt;</code> để định dạng các bài thơ',
+);
+
+/** Volapük (Volapük)
+ * @author Smeira
+ */
+$messages['vo'] = array(
+ 'poem-desc' => 'Läükon mali: <code>&lt;poem&gt;</code> pro fomät: poedot',
+);
+
+/** Cantonese (粵語)
+ * @author Shinjiman
+ */
+$messages['yue'] = array(
+ 'poem-desc' => '加 <code>&lt;poem&gt;</code> 標籤畀詩格å¼ç”¨',
+);
+
+/** Simplified Chinese (中文(简体)‎)
+ * @author Shinjiman
+ * @author Wmr89502270
+ * @author Xiaomingyan
+ */
+$messages['zh-hans'] = array(
+ 'poem-desc' => '添加“<code>&lt;poem&gt;</code>â€æ ‡ç­¾ç”¨äºŽè¯—歌格å¼',
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Shinjiman
+ */
+$messages['zh-hant'] = array(
+ 'poem-desc' => '加入 <code>&lt;poem&gt;</code> 標籤給予詩歌格å¼ä½¿ç”¨',
+);
diff --git a/extensions/Poem/Poem.php b/extensions/Poem/Poem.php
new file mode 100644
index 00000000..ee5f7083
--- /dev/null
+++ b/extensions/Poem/Poem.php
@@ -0,0 +1,33 @@
+<?php
+# MediaWiki Poem extension v1.1
+#
+# Based on example code from
+# http://www.mediawiki.org/wiki/Manual:Extending_wiki_markup
+#
+# Other code is © 2005 Nikola Smolenski <smolensk@eunet.yu>
+# and © 2011 Zaran <zaran.krleza@gmail.com>
+#
+# Anyone is allowed to use this code for any purpose.
+#
+# To install, copy the extension to your extensions directory and add line
+# require_once( "$IP/extensions/Poem/Poem.php" );
+# to the bottom of your LocalSettings.php
+#
+# To use, put some text between <poem></poem> tags
+#
+# For more information see its page at
+# http://www.mediawiki.org/wiki/Extension:Poem
+
+$wgExtensionCredits['parserhook'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'Poem',
+ 'author' => array( 'Nikola Smolenski', 'Brion Vibber', 'Steve Sanbeg' ),
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:Poem',
+ 'descriptionmsg' => 'poem-desc',
+);
+
+$dir = __DIR__ . '/';
+$wgParserTestFiles[] = $dir . 'poemParserTests.txt';
+$wgAutoloadClasses['Poem'] = $dir . 'Poem.class.php';
+$wgExtensionMessagesFiles['Poem'] = $dir . 'Poem.i18n.php';
+$wgHooks['ParserFirstCallInit'][] = 'Poem::init';
diff --git a/extensions/Poem/install.settings b/extensions/Poem/install.settings
new file mode 100644
index 00000000..973dbc72
--- /dev/null
+++ b/extensions/Poem/install.settings
@@ -0,0 +1,2 @@
+require_once( "{{path}}/Poem.php" );
+
diff --git a/extensions/Poem/poemParserTests.txt b/extensions/Poem/poemParserTests.txt
new file mode 100644
index 00000000..266dd614
--- /dev/null
+++ b/extensions/Poem/poemParserTests.txt
@@ -0,0 +1,142 @@
+# Force the test runner to ensure the extension is loaded
+!! hooks
+poem
+!! endhooks
+
+#Regression tests for existing functionality, to ensure nothing was broken.
+!! test
+<poem>
+!! input
+<poem>
+this
+is
+a
+test
+</poem>
+!! result
+<div class="poem">
+<p>this<br />
+is<br />
+a<br />
+test
+</p>
+</div>
+
+!! end
+
+!!test
+ <poem> with recursive parsing
+!!input
+<poem>
+this ''is'' a '''test'''
+</poem>
+!! result
+<div class="poem">
+<p>this <i>is</i> a <b>test</b>
+</p>
+</div>
+
+!!end
+
+
+!!test
+ <poem> with leading whitespace
+!!input
+<poem>
+
+ test
+
+</poem>
+!! result
+<div class="poem">
+<p><br />
+&#160;&#160;&#160;test<br />
+</p>
+</div>
+
+!!end
+
+!!test
+Horizontal rule
+!!input
+<poem>
+some
+-----
+text
+</poem>
+!!result
+<div class="poem">
+<p>some<br />
+</p>
+<hr /><br />
+<p>text
+</p>
+</div>
+
+!!end
+
+#test for new poem/nowiki feature; should fail without new enhancement.
+!! test 2
+example of <nowiki> without <poem>
+!!options
+disabled
+!! input
+<nowiki>
+this
+is
+a
+test
+</nowiki>
+!! result
+<p>
+this
+is
+a
+test
+
+</p>
+!! end
+
+!! test
+ nested <poem><nowiki>
+!! input
+<poem><nowiki>
+this
+is
+a
+test
+</nowiki></poem>
+!! result
+<div class="poem">
+<p><br />
+this<br />
+is<br />
+a<br />
+test<br />
+
+</p>
+</div>
+
+!!end
+
+!! test 5
+ nested <poem><nowiki> with formatting
+!! input
+<poem><nowiki>
+this
+'''is'''
+a
+test
+</nowiki></poem>
+!! result
+<div class="poem">
+<p><br />
+this<br />
+'''is'''<br />
+a<br />
+test<br />
+
+</p>
+</div>
+
+!! end
diff --git a/extensions/Renameuser/.gitreview b/extensions/Renameuser/.gitreview
deleted file mode 100644
index 0d757141..00000000
--- a/extensions/Renameuser/.gitreview
+++ /dev/null
@@ -1,5 +0,0 @@
-[gerrit]
-host=gerrit.wikimedia.org
-port=29418
-project=mediawiki/extensions/Renameuser.git
-defaultbranch=master
diff --git a/extensions/Renameuser/README b/extensions/Renameuser/README
new file mode 100644
index 00000000..e44aaafe
--- /dev/null
+++ b/extensions/Renameuser/README
@@ -0,0 +1,13 @@
+These is the readme file for the MediaWiki Renameuser extension.
+
+Extension page on mediawiki.org: https://www.mediawiki.org/wiki/Extension:Renameuser
+Latest version of the readme file: https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/Renameuser.git;a=blob;f=README
+
+== About ==
+
+Renameuser provides a special page which allows authorized users to rename user accounts.
+This will cause page histories, etc. to be updated.
+
+== Hooks ==
+
+For details on available hooks see hooks.txt
diff --git a/extensions/Renameuser/RenameUserJob.php b/extensions/Renameuser/RenameUserJob.php
index 6da2c7e6..d2dc14c4 100644
--- a/extensions/Renameuser/RenameUserJob.php
+++ b/extensions/Renameuser/RenameUserJob.php
@@ -3,15 +3,15 @@
* Custom job to perform updates on tables in busier environments
*/
class RenameUserJob extends Job {
-
/**
* Constructor
*
* @param Title $title Associated title
* @param array $params Job parameters
+ * @param int $id
*/
- public function __construct( $title, $params ) {
- parent::__construct( 'renameUser', $title, $params );
+ public function __construct( $title, $params = array(), $id = 0 ) {
+ parent::__construct( 'renameUser', $title, $params, $id );
}
/**
diff --git a/extensions/Renameuser/Renameuser.alias.php b/extensions/Renameuser/Renameuser.alias.php
index b424235f..2331b4c5 100644
--- a/extensions/Renameuser/Renameuser.alias.php
+++ b/extensions/Renameuser/Renameuser.alias.php
@@ -23,7 +23,7 @@ $specialPageAliases['arz'] = array(
'Renameuser' => array( 'سمّى_تانى_يوزر' ),
);
-/** Assamese (অসমীয়া) */
+/** Assamese (অসমীয়া) */
$specialPageAliases['as'] = array(
'Renameuser' => array( 'সদসà§à¦¯_পà§à¦¨à§°à§à¦¨à¦¾à¦®à¦•à§°à¦£' ),
);
@@ -80,7 +80,7 @@ $specialPageAliases['dsb'] = array(
/** Divehi (Þ‹Þ¨ÞˆÞ¬Þ€Þ¨Þ„Þ¦ÞÞ°) */
$specialPageAliases['dv'] = array(
- 'Renameuser' => array( 'Þ‰Þ¬Þ‰Þ°Þ„Þ¦ÞƒÞªÞŽÞ¬ Þ‚Þ¦Þ‚Þ° Þ„Þ¦Þ‹Þ¦ÞÞª Þ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ§' ),
+ 'Renameuser' => array( 'Þ‰Þ¬Þ‰Þ°Þ„Þ¦ÞƒÞªÞŽÞ¬_Þ‚Þ¦Þ‚Þ°_Þ„Þ¦Þ‹Þ¦ÞÞª_Þ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ§' ),
);
/** Greek (Ελληνικά) */
@@ -198,9 +198,14 @@ $specialPageAliases['ksh'] = array(
'Renameuser' => array( 'Metmaacher ömnänne', 'Medmaacher ömnänne', 'Metmaacher ömnenne', 'Medmaacher ömnenne', 'Metmaacher ömdäufe', 'Medmaacher ömdäufe' ),
);
+/** Cornish (kernowek) */
+$specialPageAliases['kw'] = array(
+ 'Renameuser' => array( 'DashenwelDevnydhyer' ),
+);
+
/** Latin (Latina) */
$specialPageAliases['la'] = array(
- 'Renameuser' => array( 'Usorem renominare' ),
+ 'Renameuser' => array( 'Usorem_renominare' ),
);
/** Luxembourgish (Lëtzebuergesch) */
@@ -233,12 +238,12 @@ $specialPageAliases['mt'] = array(
'Renameuser' => array( 'BiddelIsemUtent' ),
);
-/** Norwegian Bokmål (norsk (bokmål)‎) */
+/** Norwegian Bokmål (norsk bokmål) */
$specialPageAliases['nb'] = array(
'Renameuser' => array( 'Gi_en_bruker_nytt_navn' ),
);
-/** Nedersaksisch (Nedersaksisch) */
+/** Low Saxon (Netherlands) (Nedersaksies) */
$specialPageAliases['nds-nl'] = array(
'Renameuser' => array( 'Gebruker_herneumen' ),
);
@@ -248,7 +253,7 @@ $specialPageAliases['nl'] = array(
'Renameuser' => array( 'GebruikerHernoemen' ),
);
-/** Norwegian Nynorsk (norsk (nynorsk)‎) */
+/** Norwegian Nynorsk (norsk nynorsk) */
$specialPageAliases['nn'] = array(
'Renameuser' => array( 'Døyp_om_brukar' ),
);
@@ -288,6 +293,11 @@ $specialPageAliases['ru'] = array(
'Renameuser' => array( 'Переименовать_учаÑтника' ),
);
+/** Sicilian (sicilianu) */
+$specialPageAliases['scn'] = array(
+ 'Renameuser' => array( 'RinominaUtente' ),
+);
+
/** Slovak (slovenÄina) */
$specialPageAliases['sk'] = array(
'Renameuser' => array( 'PremenovaťPoužívateľa' ),
@@ -336,4 +346,9 @@ $specialPageAliases['vi'] = array(
/** Simplified Chinese (中文(简体)‎) */
$specialPageAliases['zh-hans'] = array(
'Renameuser' => array( 'é‡å‘½å用户' ),
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎) */
+$specialPageAliases['zh-hant'] = array(
+ 'Renameuser' => array( 'é‡å‘½å用戶' ),
); \ No newline at end of file
diff --git a/extensions/Renameuser/Renameuser.hooks.php b/extensions/Renameuser/Renameuser.hooks.php
new file mode 100644
index 00000000..41dcc43e
--- /dev/null
+++ b/extensions/Renameuser/Renameuser.hooks.php
@@ -0,0 +1,56 @@
+<?php
+
+class RenameuserHooks {
+ /**
+ * Show a log if the user has been renamed and point to the new username.
+ * Don't show the log if the $oldUserName exists as a user.
+ *
+ * @param $article Article
+ * @return bool
+ */
+ public static function onShowMissingArticle( $article ) {
+ global $wgOut;
+ $title = $article->getTitle();
+ $oldUser = User::newFromName( $title->getBaseText() );
+ if ( ($title->getNamespace() == NS_USER || $title->getNamespace() == NS_USER_TALK ) && ($oldUser && $oldUser->isAnon() )) {
+ // Get the title for the base userpage
+ $page = Title::makeTitle( NS_USER, str_replace( ' ', '_', $title->getBaseText() ) )->getPrefixedDBkey();
+ LogEventsList::showLogExtract(
+ $wgOut,
+ 'renameuser',
+ $page,
+ '',
+ array(
+ 'lim' => 10,
+ 'showIfEmpty' => false,
+ 'msgKey' => array( 'renameuser-renamed-notice', $title->getBaseText() )
+ )
+ );
+ }
+
+ return true;
+ }
+
+ /**
+ * Shows link to Special:Renameuser on Special:Contributions/foo
+ *
+ * @param $id
+ * @param $nt Title
+ * @param $tools
+ *
+ * @return bool
+ */
+ public static function onContributionsToolLinks( $id, $nt, &$tools ) {
+ global $wgUser;
+
+ if ( $wgUser->isAllowed( 'renameuser' ) && $id ) {
+ $tools[] = Linker::link(
+ SpecialPage::getTitleFor( 'Renameuser' ),
+ wfMessage( 'renameuser-linkoncontribs' )->text(),
+ array( 'title' => wfMessage( 'renameuser-linkoncontribs-text' )->parse() ),
+ array( 'oldusername' => $nt->getText() )
+ );
+ }
+ return true;
+ }
+}
diff --git a/extensions/Renameuser/Renameuser.i18n.php b/extensions/Renameuser/Renameuser.i18n.php
index d66c2c84..25d90ebe 100644
--- a/extensions/Renameuser/Renameuser.i18n.php
+++ b/extensions/Renameuser/Renameuser.i18n.php
@@ -37,11 +37,13 @@ Please go back and try again.',
'renameuser-page-moved' => 'The page $1 has been moved to $2.',
'renameuser-page-unmoved' => 'The page $1 could not be moved to $2.',
- 'renameuserlogpage' => 'User rename log',
- 'renameuserlogpagetext' => 'This is a log of changes to user names.',
- 'renameuserlogentry' => 'renamed $1 to "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 edit|$1 edits}}. Reason: $2',
- 'renameuser-move-log' => 'Automatically moved page while renaming the user "[[User:$1|$1]]" to "[[User:$2|$2]]"',
+ 'log-name-renameuser' => 'User rename log',
+ 'log-description-renameuser' => 'This is a log of changes to user names.',
+
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|renamed}} user $4 ({{PLURAL:$6|$6 edit|$6 edits}}) to $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 renamed user $4 to $5',
+ 'logentry-renameuser-renameuser-legaciest' => '$1',
+ 'renameuser-move-log' => 'Automatically moved page while renaming the user "[[User:$1|$1]]" to "[[User:$2|$2]]"',
'action-renameuser' => 'rename users',
'right-renameuser' => 'Rename users',
@@ -57,23 +59,83 @@ The rename log is provided below for reference.', # Supports GENDER
* @author Nemo bis
* @author Nike
* @author SPQRobin
+ * @author Shirayuki
* @author Siebrand
* @author The Evil IP address
* @author Umherirrender
*/
$messages['qqq'] = array(
- 'renameuser-linkoncontribs' => 'Link description used on Special:Contributions and Special:DeletedContributions. Only added if a user has rights to rename users.',
+ 'renameuser' => '{{doc-special|RenameUser}}',
+ 'renameuser-linkoncontribs' => 'Link description used on [[Special:Contributions]] and [[Special:DeletedContributions]]. Only added if a user has rights to rename users.',
'renameuser-linkoncontribs-text' => 'Tooltip for {{msg-mw|renameuser-linkoncontribs}}.',
- 'renameuser-desc' => '{{desc}}',
+ 'renameuser-desc' => '{{desc|name=Rename user|url=http://www.mediawiki.org/wiki/Extension:Renameuser}}',
'renameuser-summary' => '{{notranslate}}',
+ 'renameuserold' => 'Used as label for the "Old username" input box in [[Special:RenameUser]].
+
+See also:
+* {{msg-mw|Renameusernew}}',
+ 'renameusernew' => 'Used as label for the "New username" input box in [[Special:RenameUser]].
+
+See also:
+* {{msg-mw|Renameuserold}}',
+ 'renameuserreason' => 'Used as label for the "Reason to rename user" input box in [[Special:RenameUser]].
+{{Identical|Reason}}',
+ 'renameusermove' => 'Used as label for the "Move pages" checkbox in the "Rename user" form in [[Special:RenameUser]].',
+ 'renameusersuppress' => 'Used as label for the "Suppress redirect" checkbox in the "Rename user" form in [[Special:RenameUser]].',
'renameuserreserve' => 'Option to block the old username (after it has been renamed) from being used again.',
- 'renameuserwarnings' => '{{Identical|Warning}}',
- 'renameusersubmit' => '{{Identical|Submit}}',
+ 'renameuserwarnings' => 'Used as label in [[Special:RenameUser]].
+
+Followed by a list of the warnings.
+{{Identical|Warning}}',
+ 'renameuserconfirm' => 'Used as label for the "Confirm action" checkbox in the "Rename user" form in [[Special:RenameUser]].',
+ 'renameusersubmit' => 'Used as label for the Submit button in the "Rename user" form in [[Special:RenameUser]].
+{{Identical|Submit}}',
'renameuser-submit-blocklog' => 'Button text. When clicked, the block log entries for a given user will be displayed.',
- 'renameuserlogpage' => '{{doc-logpage}}',
- 'renameuserlogentry' => 'Used in [[Special:Log/renameuser]].
-* Parameter $1 is the original username
-* Parameter $2 is the new username',
+ 'renameusererrordoesnotexist' => 'Used as error message. Parameters:
+* $1 - username
+See also:
+* {{msg-mw|Renameusererrorexists}}',
+ 'renameusererrorexists' => 'Used as error message. Parameters:
+* $1 - username
+See also:
+* {{msg-mw|Renameusererrordoesnotexist}}',
+ 'renameusererrorinvalid' => 'Used as error message when renaming user in [[Special:Renameuser]]. Parameters:
+* $1 - old username, or new username',
+ 'renameuser-error-request' => 'Used as error message when renaming user in [[Special:Renameuser]].',
+ 'renameuser-error-same-user' => 'Used as error message when renaming user in [[Special:Renameuser]].',
+ 'renameusersuccess' => 'Used as success message when renaming user in [[Special:Renameuser]]. Parameters:
+* $1 - old username
+* $2 - new username',
+ 'renameuser-page-exists' => 'Used when renaming user in [[Special:Renameuser]]. Parameters:
+* $1 - new page title (with link)',
+ 'renameuser-page-moved' => 'Used as success message when renaming user in [[Special:Renameuser]]. Parameters:
+* $1 - old page title (with link)
+* $2 - new page title (with link)
+See also:
+* {{msg-mw|Renameuser-page-unmoved}}',
+ 'renameuser-page-unmoved' => 'Used as failure message when renaming user in [[Special:Renameuser]]. Parameters:
+* $1 - old page title (with link)
+* $2 - new page title (with link)
+See also:
+* {{msg-mw|Renameuser-page-moved}}',
+ 'log-name-renameuser' => '{{doc-logpage}}
+
+As well as log page title and page header for [[Special:Log/renameuser]].',
+ 'log-description-renameuser' => 'Log description on [[Special:Log/renameuser]].',
+ 'logentry-renameuser-renameuser' => '{{logentry|[[Special:Log/renameuser]]}}
+Parameters:
+* $4 - the old name of the renamed user
+* $5 - the new name of the renamed user
+* $6 - number of edits made by the user',
+ 'logentry-renameuser-renameuser-legacier' => '{{logentry|[[Special:Log/renameuser]]}}
+Parameters:
+* $4 - the old name of the renamed user
+* $5 - the new name of the renamed user',
+ 'logentry-renameuser-renameuser-legaciest' => 'Used in [[Special:Log/renameuser]]. {{logentry}}
+Note that only user name is included in this legacy log entry, everything else is hardcoded into log comment.',
+ 'renameuser-move-log' => 'Reason for a page move when a page is moved because of a user rename. Parameters:
+* $1 is the old username;
+* $2 is the new username.',
'action-renameuser' => '{{Doc-action|renameuser}}',
'right-renameuser' => '{{doc-right|renameuser}}',
'renameuser-renamed-notice' => 'This message supports the use of GENDER with parameter $1.',
@@ -107,10 +169,8 @@ $messages['af'] = array(
'renameuser-page-exists' => 'Die bladsy $1 bestaan reeds en kan nie outomaties oorskryf word nie.',
'renameuser-page-moved' => 'Die bladsy $1 is na $2 geskuif.',
'renameuser-page-unmoved' => 'Die bladsy $1 kon nie na $2 geskuif word nie.',
- 'renameuserlogpage' => 'Logboek van gebruikershernoemings',
- 'renameuserlogpagetext' => 'Hieronder is gebruikersname wat gewysig is.',
- 'renameuserlogentry' => 'het $1 na "$2" hernoem',
- 'renameuser-log' => '{{PLURAL:$1|1 wysiging|$1 wysigings}}. Rede: $2',
+ 'log-name-renameuser' => 'Logboek van gebruikershernoemings',
+ 'log-description-renameuser' => 'Hieronder is gebruikersname wat gewysig is.',
'renameuser-move-log' => 'Bladsy is outomaties geskuif met die wysiging van die gebruiker "[[User:$1|$1]]" na "[[User:$2|$2]]"',
'right-renameuser' => 'Hernoem gebruikers',
'renameuser-renamed-notice' => 'Hierdie gebruiker is hernoem.
@@ -144,10 +204,7 @@ $messages['an'] = array(
'renameuser-page-exists' => 'A pachina $1 ya existe y no puede estar sustituyita automaticament.',
'renameuser-page-moved' => "S'ha tresladato a pachina $1 ta $2.",
'renameuser-page-unmoved' => "A pachina $1 no s'ha puesto tresladar ta $2.",
- 'renameuserlogpage' => "Rechistro de cambios de nombre d'usuarios",
- 'renameuserlogpagetext' => "Isto ye un rechistro de cambios de nombres d'usuarios",
- 'renameuserlogentry' => 'Renombrato $1 como "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 edición|$1 edicions}}. Razón: $2',
+ 'log-name-renameuser' => "Rechistro de cambios de nombre d'usuarios",
'renameuser-move-log' => 'Pachina tresladata automaticament en renombrar o usuario "[[User:$1|$1]]" como "[[User:$2|$2]]"',
'right-renameuser' => 'Renombrar usuarios',
'renameuser-renamed-notice' => "O nombre d'iste usuario s'ha modificau.
@@ -177,7 +234,7 @@ $messages['ar'] = array(
'renameuser-desc' => "يضي٠[[Special:Renameuser|صÙحة خاصة]] لإعادة تسمية مستخدم (يحتاج إلى صلاحية ''renameuser'')",
'renameuserold' => 'اسم المستخدم الحالي:',
'renameusernew' => 'الاسم الجديد:',
- 'renameuserreason' => 'السبب لإعادة التسمية:', # Fuzzy
+ 'renameuserreason' => 'السبب:',
'renameusermove' => 'انقل صÙحات المستخدم ونقاشه (بالصÙحات الÙرعية) إلى الاسم الجديد',
'renameusersuppress' => 'لا تقم بإنشاء تحويلات إلى الاسم الجديد',
'renameuserreserve' => 'احÙظ اسم المستخدم القديم ضد الاستخدام',
@@ -195,10 +252,9 @@ $messages['ar'] = array(
'renameuser-page-exists' => 'الصÙحة $1 موجودة بالÙعل ولا يمكن إنشاء أخرى مكانها أوتوماتيكيا.',
'renameuser-page-moved' => 'تم نقل الصÙحة $1 إلى $2.',
'renameuser-page-unmoved' => 'لم يتمكن من نقل الصÙحة $1 إلى $2.',
- 'renameuserlogpage' => 'سجل إعادة تسمية المستخدمين',
- 'renameuserlogpagetext' => 'هذا سجل بالتغييرات ÙÙŠ أسماء المستخدمين',
- 'renameuserlogentry' => 'أعاد تسمية $1 باسم "$2"',
- 'renameuser-log' => '{{PLURAL:$1||تعديل واحد|تعديلان|$1 تعديلات|$1 تعديلًا|$1 تعديل}}. السبب: $2',
+ 'log-name-renameuser' => 'سجل إعادة تسمية المستخدمين',
+ 'log-description-renameuser' => 'هذا سجل بالتغييرات ÙÙŠ أسماء المستخدمين.',
+ 'logentry-renameuser-renameuser-legacier' => '$1 أعاد تسمية $4 إلى $5',
'renameuser-move-log' => 'نقل الصÙحة تلقائيا خلال إعادة تسمية المستخدم من "[[User:$1|$1]]" إلى "[[User:$2|$2]]"',
'action-renameuser' => 'إعادة تسمية المستخدمين',
'right-renameuser' => 'إعادة تسمية المستخدمين',
@@ -211,16 +267,21 @@ $messages['ar'] = array(
* @author Michaelovic
*/
$messages['arc'] = array(
- 'renameuser' => 'ܫܚܠܦ Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
- 'renameuser-linkoncontribs' => 'ܫܚܠܦ Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
- 'renameuser-linkoncontribs-text' => 'ܫܚܠܦ Ü«Ü¡Ü Ü•Ü—Ü¢Ü Ü¡Ü¦Ü ÜšÜ¢Ü',
+ 'renameuser' => 'Ü¬Ü¢Ü Ü«Ü˜Ü¡Ü—Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
+ 'renameuser-linkoncontribs' => 'Ü¬Ü¢Ü Ü«Ü˜Ü¡Ü—Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
+ 'renameuser-linkoncontribs-text' => 'Ü¬Ü¢Ü Ü«Ü˜Ü¡Ü—Ü Ü•Ü—Ü¢Ü Ü¡Ü¦Ü ÜšÜ¢Ü',
'renameuserold' => 'Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü Ü¥Ü¬ÜÜ©Ü:',
'renameusernew' => 'Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü ÜšÜ•Ü¬Ü:',
+ 'renameuserreason' => 'ܥܠܬÜ:',
'renameuserwarnings' => 'ܙܘܗܪ̈Ü:',
- 'renameuserconfirm' => 'ÜÜÜ¢, ܫܚܠܦ Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
- 'renameusersubmit' => 'ܡܨÜܘܬÜ',
- 'renameuserlogentry' => 'Ü¬Ü¢Ü Ü Ü«Ü˜Ü¡Ü—Ü $1 Ü’Ü«Ü¡ "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 ܫܘܚܠܦÜ|$1 ܫܘܚܠܦ̈Ü}}. ܥܠܬÜ: $2',
+ 'renameuserconfirm' => 'ÜÜܢ، ܫܚܠܦ Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
+ 'renameusersubmit' => 'ܫܕܪ',
+ 'log-name-renameuser' => 'Ü£Ü“Ü Ü Ü•Ü¬Ü˜Ü¢Ü Ü«Ü˜Ü¡Ü—Ü Ü•Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ',
+ 'logentry-renameuser-renameuser' => '$1 Ü¬Ü¢Ü Ü«Ü˜Ü¡Ü—Ü Ü•{{GENDER:$2|ܡܦܠܚܢÜ|ܡܦܠܚܢܬÜ}} $4 ({{PLURAL:$6|$6 ܫܘܚܠܦÜ|$6 ܫܘܚܠܦ̈Ü}}) Ü  $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 Ü¬Ü¢Ü Ü«Ü˜Ü¡Ü—Ü Ü• $4 Ü  $5',
+ 'renameuser-move-log' => 'ÜܬÜÜܬ Ü«Ü¢Ü Ü¦ÜÜ¬Ü ÜŸÜ• Ü¬Ü¢Ü Ü«Ü˜Ü¡Ü—Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü "[[User:$1|$1]]" Ü  "[[User:$2|$2]]"',
+ 'action-renameuser' => 'Ü¬Ü¢Ü Ü«Ü˜Ü¡Ü—Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
+ 'right-renameuser' => 'Ü¬Ü¢Ü Ü«Ü˜Ü¡Ü—Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
);
/** Egyptian Spoken Arabic (مصرى)
@@ -249,10 +310,7 @@ $messages['arz'] = array(
'renameuser-page-exists' => 'الصÙحة $1 موجودة من قبل كدا Ùˆ ماينÙعش يتكتب عليها اوتوماتيكى.',
'renameuser-page-moved' => 'تم نقل الصÙحه $1 Ù„ $2.',
'renameuser-page-unmoved' => 'الصÙحة $1 مانÙعش تتنقل لـ$2.',
- 'renameuserlogpage' => 'سجل تغيير تسمية اليوزرز',
- 'renameuserlogpagetext' => 'دا سجل بالتغييرات ÙÙ‰ أسامى اليوزرز',
- 'renameuserlogentry' => 'اتغيرت تسمية$1 لـ "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 تعديل|$1 تعديل}}. علشان: $2',
+ 'log-name-renameuser' => 'سجل تغيير تسمية اليوزرز',
'renameuser-move-log' => 'الصÙحة اتنقلت اوتوماتيكى لما اليوزر "[[User:$1|$1]]" اتغير اسمه لـ "[[User:$2|$2]]"',
'right-renameuser' => 'غير اسم اليوزرز',
);
@@ -268,7 +326,7 @@ $messages['as'] = array(
'renameuser-desc' => "à¦à¦œà¦¨ বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€à§° পà§à¦¨à§°à§à¦¨à¦¾à¦®à¦¾à¦•à§°à¦£ কৰিবলৈ à¦à¦–ন [[Special:Renameuser|বিশেষ পৃষà§à¦ à¦¾]] যোগ দিয়ে (''renameuser'' অধিকাৰৰ পà§à§°à¦¯à¦¼à§‹à¦œà¦¨)",
'renameuserold' => 'বৰà§à¦¤à¦®à¦¾à¦¨à§° সদসà§à¦¯à¦¨à¦¾à¦®:',
'renameusernew' => 'নতà§à¦¨ সদসà§à¦¯à¦¨à¦¾à¦®:',
- 'renameuserreason' => 'পà§à¦¨à§°à§à¦¨à¦¾à¦®à¦¾à¦•à§°à¦£à§° কাৰণ:', # Fuzzy
+ 'renameuserreason' => 'কাৰণ:',
'renameusermove' => 'সদসà§à¦¯à¦ªà§ƒà¦·à§à¦ à¦¾ আৰৠআলোচনা পৃষà§à¦ à¦¾ (আৰৠসেইবোৰৰ উপপৃষà§à¦ à¦¾) নতà§à¦¨ নামলৈ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰক',
'renameusersuppress' => 'নতà§à¦¨ নামলৈ পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶ সৃষà§à¦Ÿà¦¿ কৰিব নালাগে',
'renameuserreserve' => 'ভৱিষà§à¦¯à¦¤ বà§à¦¯à§±à¦¹à¦¾à§°à§° বাবে পà§à§°à¦£à¦¾ সদসà§à¦¯à¦¨à¦¾à¦®à¦Ÿà§‹ বাৰণ কৰক',
@@ -286,10 +344,9 @@ $messages['as'] = array(
'renameuser-page-exists' => '$1 পৃষà§à¦ à¦¾à¦–ন ইতিমধà§à¦¯à§‡à¦‡ আছে আৰৠতাৰ ওপৰত সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼à¦­à¦¾à§±à§‡ লিখিব নোৱাৰি।',
'renameuser-page-moved' => "$1 পৃষà§à¦ à¦¾à¦–ন $2-লৈ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰা হ'ল।",
'renameuser-page-unmoved' => '$1 পৃষà§à¦ à¦¾à¦–ন $2-লৈ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰা সমà§à¦­à§± নহয়।',
- 'renameuserlogpage' => "সদসà§à¦¯à§° পà§à¦¨à§°à§à¦¨à¦¾à¦®à¦¾à¦•à§°à¦£ ল'গ",
- 'renameuserlogpagetext' => 'সদসà§à¦¯à¦¨à¦¾à¦®à§° পৰিৱৰà§à¦¤à¦¨à¦¸à¦®à§‚হৰ ল’গ',
- 'renameuserlogentry' => '$1ক "$2"লৈ পà§à¦¨à§°à§à¦¨à¦¾à¦®à¦¾à¦•à§°à¦£ কৰা হ\'ল',
- 'renameuser-log' => '{{PLURAL:$1|1 সমà§à¦ªà¦¾à¦¦à¦¨à¦¾|$1 সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¸à¦®à§‚হ}}। কাৰণ: $2',
+ 'log-name-renameuser' => 'সদসà§à¦¯à§° পà§à¦¨à§°à§à¦¨à¦¾à¦®à¦¾à¦•à§°à¦£ অভিলেখ',
+ 'log-description-renameuser' => 'সদসà§à¦¯à¦¨à¦¾à¦® পৰিৱৰà§à¦¤à¦¨à§° অভিলেখ',
+ 'logentry-renameuser-renameuser-legacier' => 'সদসà§à¦¯ $4ৰ পৰা $5লৈ, $1’য়ে পà§à¦¨à§° নামাকৰণ কৰিলে',
'renameuser-move-log' => 'সদসà§à¦¯ "[[User:$1|$1]]"ক "[[User:$2|$2]]"লৈ পà§à¦¨à§°à§à¦¨à¦¾à¦®à¦¾à¦•à§°à¦£ কৰোà¦à¦¤à§‡ সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼à¦­à¦¾à§±à§‡ পৃষà§à¦ à¦¾ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° হ\'ল।',
'action-renameuser' => 'সদসà§à¦¯à§° পà§à¦¨à§°à§à¦¨à¦¾à¦®à¦¾à¦•à§°à¦£ কৰক',
'right-renameuser' => 'সদসà§à¦¯à§° পà§à¦¨à§°à§à¦¨à¦¾à¦®à¦¾à¦•à§°à¦£ কৰক',
@@ -325,10 +382,10 @@ $messages['ast'] = array(
'renameuser-page-exists' => 'La páxina $1 yá esiste y nun pue ser sobreescrita automáticamente.',
'renameuser-page-moved' => 'La páxina $1 treslladóse a $2.',
'renameuser-page-unmoved' => 'La páxina $1 nun pudo treslladase a $2.',
- 'renameuserlogpage' => "Rexistru de cambios de nome d'usuariu",
- 'renameuserlogpagetext' => "Esti ye un rexistru de los cambios de nomes d'usuariu",
- 'renameuserlogentry' => 'renomó a $1 como "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 edición|$1 ediciones}}. Motivu: $2',
+ 'log-name-renameuser' => "Rexistru de cambios de nome d'usuariu",
+ 'log-description-renameuser' => "Esti ye un rexistru de los cambios de nomes d'usuariu.",
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|camudó de nome}} {{GENDER:$4|al usuariu|a la usuaria}} $4 ({{PLURAL:$6|$6 edición|$6 ediciones}}) a $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 camudó el nome {{GENDER:$4|del usuariu|de la usuaria}} $4 a $5',
'renameuser-move-log' => 'Treslladóse la páxina automáticamente al renomar al usuariu "[[User:$1|$1]]" como "[[User:$2|$2]]"',
'action-renameuser' => 'renomar usuarios',
'right-renameuser' => 'Renomar usuarios',
@@ -355,10 +412,33 @@ $messages['az'] = array(
'renameusererrorinvalid' => '"<nowiki>$1</nowiki>" istifadəçi adı yolverilməzdir.',
'renameuser-page-moved' => '$1 $2 səhifəsinə köçürülüb.',
'renameuser-page-unmoved' => '$1 $2 səhifəsinə köçürülə bilinmir.',
- 'renameuserlogpage' => 'İstifadəçi adı dəyişmə gündəliyi',
+ 'log-name-renameuser' => 'İstifadəçi adı dəyişmə gündəliyi',
'right-renameuser' => 'istifadəçilərin adını dəyiş',
);
+/** South Azerbaijani (تورکجه)
+ * @author Amir a57
+ */
+$messages['azb'] = array(
+ 'renameuser' => 'ایستیÙاده‌چی آدینی دییش',
+ 'renameuser-linkoncontribs' => 'ایستیÙاده‌چی آدینی دییش',
+ 'renameuser-linkoncontribs-text' => 'بو ایستیÙاده‌چی‌نین آدینی دییش',
+ 'renameusernew' => 'یئنی ایستیÙاده‌چی آدی:',
+ 'renameuserreason' => 'ندن:',
+ 'renameuserwarnings' => 'خبردارلیق‌لار:',
+ 'renameuserconfirm' => 'بلی، ایستیÙاده‌چی‌نین آدینی دییش',
+ 'renameusersubmit' => 'گؤندر',
+ 'renameusererrordoesnotexist' => '"<nowiki>$1</nowiki>" ایستیÙاده‌چی آدی مؤوجود دئییل.',
+ 'renameusererrorexists' => '"<nowiki>$1</nowiki>" ایستیÙاده‌چی آدی آرتیق مؤوجوددور.',
+ 'renameusererrorinvalid' => '"<nowiki>$1</nowiki>" ایستیÙاده‌چی آدی یولوئریلمزدیر.',
+ 'renameuser-page-exists' => '$1 مادده‌سی اونسوز دا وار اولماقدا‌دیر، و آوتوماتیک اولا‌راق یئنی‌دن یازیلا بیلمز.',
+ 'renameuser-page-moved' => '$1 صحیÙه‌سی $2 صحیÙه‌سینه کؤچورولوب.',
+ 'renameuser-page-unmoved' => '$1 صحیÙه‌سی $2 صحیÙه‌سینه کؤچوروله بیلینمیر.',
+ 'log-name-renameuser' => 'ایستیÙاده‌چی آدی دییشمه گونده‌لیگی',
+ 'action-renameuser' => 'ایستیÙاده‌چی‌لرین آدینی دییش',
+ 'right-renameuser' => 'ایستیÙاده‌چی‌لرین آدینی دییش',
+);
+
/** Bashkir (башҡортÑа)
* @author Assele
* @author ҒатаУлла
@@ -387,10 +467,8 @@ $messages['ba'] = array(
'renameuser-page-exists' => '$1 бите бар инде һәм уның өҫтөнә автоматик рәүештә Ñҙҙырыу мөмкин түгел.',
'renameuser-page-moved' => '$1 битенең иÑеме $2 тип үҙгәртелде.',
'renameuser-page-unmoved' => '$1 битенең иÑеме $2 тип үҙгәртелә алмай.',
- 'renameuserlogpage' => 'ҠатнашыуÑÑ‹ иÑемдәрен үҙгәртеү Ñҙмалары журналы',
- 'renameuserlogpagetext' => 'Был — ҡатнашыуÑÑ‹ иÑемдәрен үҙгәртеү Ñҙмалары журналы.',
- 'renameuserlogentry' => '$1 ҡатнашыуÑыһын "$2" тип үҙгәрткән',
- 'renameuser-log' => '$1 {{PLURAL:$1|үҙгәртеү}}. Сәбәбе: $2',
+ 'log-name-renameuser' => 'ҠатнашыуÑÑ‹ иÑемдәрен үҙгәртеү Ñҙмалары журналы',
+ 'log-description-renameuser' => 'Был — ҡатнашыуÑÑ‹ иÑемдәрен үҙгәртеү Ñҙмалары журналы.',
'renameuser-move-log' => 'Биттең иÑеме "[[User:$1|$1]]" ҡатнашыуÑыһының иÑемен "[[User:$2|$2]]" тип үҙгәртеү Ñәбәпле үҙенән-үҙе үҙгәргән',
'action-renameuser' => 'ҠатнашыуÑыларҙың иÑемен үҙгәртеү',
'right-renameuser' => 'ҠатнашыуÑыларҙың иÑемен үҙгәртеү',
@@ -421,10 +499,7 @@ $messages['bcc'] = array(
'renameuser-page-exists' => 'صÙحه $1 الان هست Ùˆ اتوماتیکی اور Ø¢ÛŒ نوسیگ نه بیت.',
'renameuser-page-moved' => 'صÙحه $1 جاه په جاه بیت په $2.',
'renameuser-page-unmoved' => 'صÙحه $1 نه تونیت په $2 جاه په جاه بیت.',
- 'renameuserlogpage' => 'آمار نام بدل کتن کاربر',
- 'renameuserlogpagetext' => 'شی آماری چه تغییرات نامان کاربران انت',
- 'renameuserlogentry' => 'نام بدل بوت $1 په "$2"', # Fuzzy
- 'renameuser-log' => '{{PLURAL:$1|1 اصلاح|$1 اصلاحلات}}. دلیل: $2',
+ 'log-name-renameuser' => 'آمار نام بدل کتن کاربر',
'renameuser-move-log' => 'اتوماتیکی صÙحه جاه په جاه بیت وهدی Ú©Ù‡ کاربر نام بدل بی "[[User:$1|$1]]" به "[[User:$2|$2]]"',
'right-renameuser' => 'عوض کتن نام کابران',
);
@@ -438,7 +513,6 @@ $messages['bcl'] = array(
'renameusererrorexists' => 'An parágamit "<nowiki>$1</nowiki>" yaon na',
'renameuser-page-moved' => 'An páhinang $1 piglipat sa $2.',
'renameuser-page-unmoved' => 'An páhinang $1 dai mailipat sa $2.',
- 'renameuser-log' => '$1 mga hirá. Rasón: $2', # Fuzzy
);
/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
@@ -472,10 +546,10 @@ $messages['be-tarask'] = array(
'renameuser-page-exists' => 'Старонка $1 ужо Ñ–Ñнуе Ñ– Ð½Ñ Ð¼Ð¾Ð¶Ð° быць аўтаматычна перазапіÑанаÑ.',
'renameuser-page-moved' => 'Старонка $1 была Ð¿ÐµÑ€Ð°Ð¹Ð¼ÐµÐ½Ð°Ð²Ð°Ð½Ð°Ñ Ñž $2.',
'renameuser-page-unmoved' => 'Старонка $1 Ð½Ñ Ð¼Ð¾Ð¶Ð° быць Ð¿ÐµÑ€Ð°Ð¹Ð¼ÐµÐ½Ð°Ð²Ð°Ð½Ð°Ñ Ñž $2.',
- 'renameuserlogpage' => 'Журнал перайменаваньнÑÑž удзельнікаў',
- 'renameuserlogpagetext' => 'ГÑта журнал перайменаваньнÑÑž рахункаў удзельнікаў.',
- 'renameuserlogentry' => 'перайменаваў $1 у «$2»',
- 'renameuser-log' => '$1 {{PLURAL:$1|Ñ€Ñдагаваньне|Ñ€Ñдагаваньні|Ñ€ÑдагаваньнÑÑž}}. Прычына: $2',
+ 'log-name-renameuser' => 'Журнал перайменаваньнÑÑž удзельнікаў',
+ 'log-description-renameuser' => 'ГÑта журнал перайменаваньнÑÑž рахункаў удзельнікаў.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|перайменаваў|перайменавала}} $4 ($6 {{PLURAL:$6|праўка|праўкі|правак}}) у $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 перайменаваў удзельніка $4 у $5',
'renameuser-move-log' => 'Ðўтаматычнае перайменаваньне Ñтаронкі Ñž ÑувÑзі зь перайменаваньнем рахунку ўдзельніка з «[[User:$1|$1]]» у «[[User:$2|$2]]»',
'action-renameuser' => 'пераймÑноўваць удзельнікаў',
'right-renameuser' => 'перайменаваньне ўдзельнікаў',
@@ -487,6 +561,7 @@ $messages['be-tarask'] = array(
* @author Borislav
* @author DCLXVI
* @author Spiritia
+ * @author Stanqo
* @author Turin
*/
$messages['bg'] = array(
@@ -503,6 +578,7 @@ $messages['bg'] = array(
'renameuserwarnings' => 'ПредупреждениÑ:',
'renameuserconfirm' => 'Да, преименуване на потребителÑ',
'renameusersubmit' => 'Изпълнение',
+ 'renameuser-submit-blocklog' => 'Показване дневника на блокираниÑта за потребителÑ',
'renameusererrordoesnotexist' => 'ПотребителÑÑ‚ „<nowiki>$1</nowiki>“ не ÑъщеÑтвува.',
'renameusererrorexists' => 'ПотребителÑÑ‚ „<nowiki>$1</nowiki>“ вече ÑъщеÑтвува.',
'renameusererrorinvalid' => 'ПотребителÑкото име „<nowiki>$1</nowiki>“ е невалидно.',
@@ -512,10 +588,7 @@ $messages['bg'] = array(
'renameuser-page-exists' => 'Страницата $1 вече ÑъщеÑтвува и не може да бъде автоматично замеÑтена.',
'renameuser-page-moved' => 'Страницата $1 беше премеÑтена като $2.',
'renameuser-page-unmoved' => 'Страницата $1 не можа да бъде премеÑтена като $2.',
- 'renameuserlogpage' => 'Дневник на преименуваниÑта',
- 'renameuserlogpagetext' => 'Ð’ този дневник Ñе запиÑват преименуваниÑта на потребители.',
- 'renameuserlogentry' => 'преименува $1 на „$2“',
- 'renameuser-log' => '{{PLURAL:$1|една редакциÑ|$1 редакции}}. Причина: $2',
+ 'log-name-renameuser' => 'Дневник на преименуваниÑта',
'renameuser-move-log' => 'Ðвтоматично премеÑтена Ñтраница при преименуването на потребител "[[User:$1|$1]]" като "[[User:$2|$2]]"',
'right-renameuser' => 'преименуване на потребители',
'renameuser-renamed-notice' => 'ПотребителÑÑ‚ беше преименуван.
@@ -533,7 +606,7 @@ $messages['bn'] = array(
'renameuser-desc' => "à¦à¦•à¦œà¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦•à§‡ নামানà§à¦¤à¦° করà§à¦¨ (''বà§à¦¯à¦¬à¦¹à¦¾à¦•à¦¾à¦°à§€ নামানà§à¦¤à¦°'' অধিকার পà§à¦°à¦¯à¦¼à§‹à¦œà¦¨)",
'renameuserold' => 'বরà§à¦¤à¦®à¦¾à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম:',
'renameusernew' => 'নতà§à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম:',
- 'renameuserreason' => 'নামানà§à¦¤à¦°à§‡à¦° কারণ:', # Fuzzy
+ 'renameuserreason' => 'কারণ:',
'renameusermove' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ à¦à¦¬à¦‚ আলাপের পাতা (à¦à¦¬à¦‚ তার উপপাতাসমূহ) নতà§à¦¨ নামে সরিয়ে নাও',
'renameusersuppress' => 'নতà§à¦¨ নামে রিডাইরেকà§à¦Ÿ করবেন না',
'renameuserreserve' => 'ভবিষà§à¦¯à¦¤à§‡ উদà§à¦¦à§‡à¦¶à§à¦¯à§‡ পà§à¦°à¦¾à¦¤à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম বà§à¦²à¦• করা হল',
@@ -550,10 +623,8 @@ $messages['bn'] = array(
'renameuser-page-exists' => 'পাতা $1 বিদà§à¦¯à¦®à¦¾à¦¨ à¦à¦¬à¦‚ সয়ঙà§à¦•à§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ à¦à¦Ÿà¦¿à¦° উপর লেখা যাবে না',
'renameuser-page-moved' => 'পাতাটি $1 থেকে $2 তে সরিয়ে নেওয়া হয়েছে।',
'renameuser-page-unmoved' => 'পাতাটি $1 থেকে $2 তে সরিয়ে নেওয়া যাবে না।',
- 'renameuserlogpage' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নামানà§à¦¤à¦°à§‡à¦° লগ',
- 'renameuserlogpagetext' => 'à¦à¦Ÿà¦¿ বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নামের পরিবরà§à¦¤à¦¨à§‡à¦° লগ',
- 'renameuserlogentry' => '$1 থেকে "$2" তে নামানà§à¦¤à¦° করা হয়েছে',
- 'renameuser-log' => '{{PLURAL:$1|1 সমà§à¦ªà¦¾à¦¦à¦¨à¦¾|$1 সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¸à¦®à§‚হ}}। কারণ: $2',
+ 'log-name-renameuser' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নামানà§à¦¤à¦°à§‡à¦° লগ',
+ 'log-description-renameuser' => 'à¦à¦Ÿà¦¿ বà§à¦¯à¦¾à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নামের পরিবরà§à¦¤à¦¨à§‡à¦° লগ',
'renameuser-move-log' => 'যখন বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ "[[User:$1|$1]]" থেকে "[[User:$2|$2]]" তে নামানà§à¦¤à¦°à¦¿à¦¤ হবে তখন সয়ঙà§à¦•à§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ পাতা সরিয়ে নেওয়া হয়েছে',
'action-renameuser' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম পরিবরà§à¦¤à¦¨',
'right-renameuser' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° পà§à¦¨à¦°à¦¾à¦¯à¦¼ নাম দাও',
@@ -562,6 +633,7 @@ $messages['bn'] = array(
);
/** Breton (brezhoneg)
+ * @author Fohanno
* @author Fulup
* @author Gwendal
* @author Y-M D
@@ -573,7 +645,7 @@ $messages['br'] = array(
'renameuser-desc' => "Adenvel un implijer (ret eo kaout ''gwirioù adenvel'')",
'renameuserold' => 'Anv a-vremañ an implijer :',
'renameusernew' => 'Anv implijer nevez :',
- 'renameuserreason' => 'Abeg evit adenvel :', # Fuzzy
+ 'renameuserreason' => 'Abeg :',
'renameusermove' => 'Kas ar pajennoù implijer ha kaozeal (hag o ispajennoù) betek o anv nevez',
'renameusersuppress' => 'Arabat krouiñ adkasoù war-du an anv nevez',
'renameuserreserve' => "Mirout na vo implijet an anv kozh pelloc'h en dazont",
@@ -590,10 +662,7 @@ $messages['br'] = array(
'renameuser-page-exists' => "Bez' ez eus eus ar bajenn $1 dija, n'haller ket hec'h erlec'hiañ ent emgefreek.",
'renameuser-page-moved' => 'Adkaset eo bet ar bajenn $1 da $2.',
'renameuser-page-unmoved' => "N'eus ket bet gallet adkas ar bajenn $1 da $2.",
- 'renameuserlogpage' => 'Roll an implijerien bet adanvet',
- 'renameuserlogpagetext' => 'Setu istor an implijerien bet cheñchet o anv ganto',
- 'renameuserlogentry' => 'en deus adanvet $1 e "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 degasadenn|$1 degasadenn}}. Abeg : $2',
+ 'log-name-renameuser' => 'Roll an implijerien bet adanvet',
'renameuser-move-log' => 'Pajenn dilec\'hiet ent emgefreek e-ser adenvel an implijer "[[User:$1|$1]]" e "[[User:$2|$2]]"',
'action-renameuser' => 'Adenvel implijerien',
'right-renameuser' => 'Adenvel implijerien',
@@ -628,10 +697,7 @@ Molimo Vas da se vratite nazad i pokušate ponovo.',
'renameuser-page-exists' => 'Stranica $1 već postoji i ne može biti automatski prepisana.',
'renameuser-page-moved' => 'Stranica $1 je premještena na $2.',
'renameuser-page-unmoved' => 'Stranica $1 nije mogla biti premještena na $2.',
- 'renameuserlogpage' => 'Zapisnik preimenovanja korisnika',
- 'renameuserlogpagetext' => 'Ovo je zapisnik promjena korisniÄkih imena.',
- 'renameuserlogentry' => '$1 preimenovan u "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 izmjena|$1 izmjene|$1 izmjena}}. Razlog: $2',
+ 'log-name-renameuser' => 'Zapisnik preimenovanja korisnika',
'renameuser-move-log' => 'Automatski premjeÅ¡tena stranica pri promjeni korisniÄkog imena "[[User:$1|$1]]" u "[[User:$2|$2]]"',
'right-renameuser' => 'Preimenovanje korisnika',
'renameuser-renamed-notice' => 'Ovaj korisnik je promijenio ime.
@@ -639,6 +705,7 @@ Zapisnik preimenovanje je prikazan ispod kao referenca.',
);
/** Catalan (català)
+ * @author Aleator
* @author Arnaugir
* @author El libre
* @author Juanpabl
@@ -655,7 +722,7 @@ $messages['ca'] = array(
'renameuser-desc' => "Reanomena un usuari (necessita drets de ''renameuser'')",
'renameuserold' => "Nom d'usuari actual:",
'renameusernew' => "Nou nom d'usuari:",
- 'renameuserreason' => 'Motiu pel canvi:', # Fuzzy
+ 'renameuserreason' => 'Motiu:',
'renameusermove' => "Reanomena la pàgina d'usuari, la de discussió i les subpàgines que tingui al nou nom",
'renameusersuppress' => 'No creis redireccions cap al nou nom',
'renameuserreserve' => "Bloca el nom d'usuari antic d'usos futurs",
@@ -673,10 +740,8 @@ Torneu enrere i torneu-ho a intentar.",
'renameuser-page-exists' => 'La pàgina «$1» ja existeix i no pot ser sobreescrita automàticament',
'renameuser-page-moved' => "La pàgina «$1» s'ha reanomenat com a «$2».",
'renameuser-page-unmoved' => "La pàgina $1 no s'ha pogut reanomenar com a «$2».",
- 'renameuserlogpage' => "Registre del canvi de nom d'usuari",
- 'renameuserlogpagetext' => "Aquest és un registre dels canvis als noms d'usuari",
- 'renameuserlogentry' => 'ha reanomenat $1 a "$2"',
- 'renameuser-log' => '{{PLURAL:$1|Una contribució|$1 contribucions}}. Motiu: $2',
+ 'log-name-renameuser' => "Registre de canvis de nom d'usuari",
+ 'logentry-renameuser-renameuser' => "$1 {{GENDER:$2|ha reanomenat}} l'usuari $4 ({{PLURAL:$6|$6 edició|$6 edicions}}) a $5",
'renameuser-move-log' => "S'ha reanomenat automàticament la pàgina mentre es reanomenava l'usuari «[[User:$1|$1]]» com «[[User:$2|$2]]»",
'action-renameuser' => 'reanomena usuaris',
'right-renameuser' => 'Reanomenar usuaris',
@@ -686,36 +751,35 @@ A continuació es proporciona el registre de reanomenaments per a més informaci
/** Chechen (нохчийн)
* @author Sasan700
+ * @author Умар
*/
$messages['ce'] = array(
'renameuser' => 'Декъашхон цlе хийца',
'renameuser-linkoncontribs' => 'декъашхон цlе хийца',
+ 'renameuserreason' => 'Бахьан:',
+ 'renameuser-page-moved' => 'ÐгӀона $1 цӀе хийцина оцу $2.',
);
/** Sorani Kurdish (کوردی)
+ * @author Calak
*/
$messages['ckb'] = array(
'renameusersubmit' => 'ناردن',
+ 'log-name-renameuser' => 'لۆگی گۆڕینی ناوی بەکارھێنەر',
);
/** Crimean Turkish (Cyrillic script) (къырымтатарджа (Кирилл)‎)
* @author Don Alessandro
*/
$messages['crh-cyrl'] = array(
- 'renameuserlogpage' => 'Къулланыджы ады денъишиклиги журналы',
- 'renameuserlogpagetext' => 'Ðшагъыда булунгъан джедвель ады денъиштирильген къулланыджыларны коÑьтере',
- 'renameuserlogentry' => '$1 къулланыджыÑынынъ адыны "$2" оларакъ денъиштирди',
- 'renameuser-log' => '{{PLURAL:$1|1 денъишиклик|$1 денъишиклик}} Ñпкъан. Себеп: $2',
+ 'log-name-renameuser' => 'Къулланыджы ады денъишиклиги журналы',
);
/** Crimean Turkish (Latin script) (qırımtatarca (Latin)‎)
* @author Don Alessandro
*/
$messages['crh-latn'] = array(
- 'renameuserlogpage' => 'Qullanıcı adı deñişikligi jurnalı',
- 'renameuserlogpagetext' => 'Aşağıda bulunğan cedvel adı deñiştirilgen qullanıcılarnı köstere',
- 'renameuserlogentry' => '$1 qullanıcısınıñ adını "$2" оlaraq deñiştirdi',
- 'renameuser-log' => '{{PLURAL:$1|1 deñişiklik|$1 deñişiklik}} yapqan. Sebep: $2',
+ 'log-name-renameuser' => 'Qullanıcı adı deñişikligi jurnalı',
);
/** Czech (Äesky)
@@ -732,7 +796,7 @@ $messages['cs'] = array(
'renameuser-desc' => "Přejmenování uživatele (vyžadováno oprávnění ''renameuser'')",
'renameuserold' => 'Stávající uživatelské jméno:',
'renameusernew' => 'Nové uživatelské jméno:',
- 'renameuserreason' => 'Důvod přejmenování:', # Fuzzy
+ 'renameuserreason' => 'Důvod:',
'renameusermove' => 'Přesunout uživatelské a diskusní stránky (a jejich podstránky) na nové jméno',
'renameusersuppress' => 'Nevytvářet přesměrování na nové jméno',
'renameuserreserve' => 'Zabránit nové registraci původního uživatelského jména',
@@ -749,10 +813,10 @@ $messages['cs'] = array(
'renameuser-page-exists' => 'Stránka $1 již existuje a nelze ji automaticky přepsat.',
'renameuser-page-moved' => 'Stránka $1 byla přesunuta na $2.',
'renameuser-page-unmoved' => 'Stránku $1 se nepodařilo přesunout na $2.',
- 'renameuserlogpage' => 'Kniha přejmenování uživatelů',
- 'renameuserlogpagetext' => 'Toto je záznam přejmenování uživatelů (změn uživatelského jména).',
- 'renameuserlogentry' => 'přejmenovává $1 na „$2“',
- 'renameuser-log' => '{{PLURAL:$1|1 editace|$1 editace|$1 editací}}. Zdůvodnění: $2',
+ 'log-name-renameuser' => 'Kniha přejmenování uživatelů',
+ 'log-description-renameuser' => 'Toto je záznam přejmenování uživatelů (změn uživatelského jména).',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|přejmenoval|přejmenovala}} uživatele $4 ({{PLURAL:$6|$6 editace|$6 editace|$6 editací}}) na $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 přejmenoval uživatele $4 na $5',
'renameuser-move-log' => 'Automatický přesun při přejmenování uživatele „[[User:$1|$1]]“ na „[[User:$2|$2]]“',
'action-renameuser' => 'přejmenovávat uživatele',
'right-renameuser' => 'Přejmenovávání uživatelů',
@@ -774,9 +838,8 @@ $messages['cu'] = array(
'renameusererrordoesnotexist' => 'польꙃєватєлꙗ â– <nowiki>$1</nowiki> ■нѣÑÑ‚ÑŠ',
'renameusererrorexists' => 'польꙃєватєл҄ь â– <nowiki>$1</nowiki> ■ѥÑÑ‚ÑŠ ÑŽ',
'renameusererrorinvalid' => 'имѧ â– <nowiki>$1</nowiki> ■нѣÑÑ‚ÑŠ годѣ',
- 'renameuserlogpage' => 'польꙃєватєлъ прѣимєнованиꙗ Ñ—Ñторїꙗ',
- 'renameuserlogpagetext' => 'ÑÑ¥ Ñ¥ÑÑ‚ÑŠ Ñ—Ñторїꙗ польꙃєватєльÑкъ имєнъ иê™Ð¼Ñ£Ð½Ñ¥Ð½Ð¸ê™—',
- 'renameuserlogentry' => 'нарєчє $1 имєньмь â– $2 â–',
+ 'log-name-renameuser' => 'польꙃєватєлъ прѣимєнованиꙗ Ñ—Ñторїꙗ',
+ 'log-description-renameuser' => 'ÑÑ¥ Ñ¥ÑÑ‚ÑŠ Ñ—Ñторїꙗ польꙃєватєльÑкъ имєнъ иê™Ð¼Ñ£Ð½Ñ¥Ð½Ð¸ê™—',
);
/** Chuvash (Чӑвашла)
@@ -797,7 +860,7 @@ $messages['cy'] = array(
'renameuser-desc' => "Yn ychwanegu [[Special:Renameuser|tudalen arbennig]] er mwyn gallu ail-enwi cyfrif defnyddiwr (sydd angen y gallu ''renameuser'')",
'renameuserold' => 'Enw presennol y defnyddiwr:',
'renameusernew' => "Enw newydd i'r defnyddiwr:",
- 'renameuserreason' => 'Y rheswm dros ail-enwi:', # Fuzzy
+ 'renameuserreason' => 'Rheswm:',
'renameusermove' => "Symud y tudalennau defnyddiwr a sgwrs (ac unrhyw is-dudalennau) i'r enw newydd",
'renameusersuppress' => "Peidiwch â gosod ailgyfeiriadau i'r enw newydd",
'renameuserreserve' => 'Atal yr hen enw defnyddiwr rhag cael ei ddefnyddio rhagor',
@@ -815,10 +878,10 @@ Ewch yn ôl a cheisio eto, os gwelwch yn dda.',
'renameuser-page-exists' => "Mae'r dudalen $1 ar gael yn barod ac ni ellir ei throsysgrifo.",
'renameuser-page-moved' => 'Symudwyd $1 i $2.',
'renameuser-page-unmoved' => 'Ni lwyddwyd i symud y dudalen $1 i $2.',
- 'renameuserlogpage' => 'Lòg ail-enwi defnyddwyr',
- 'renameuserlogpagetext' => "Dyma lòg o'r holl newidiadau i enwau defnyddwyr.",
- 'renameuserlogentry' => 'wedi ail-enwi $1 yn "$2"',
- 'renameuser-log' => '$1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad|golygiad|o olygiadau}}. Rheswm: $2',
+ 'log-name-renameuser' => 'Lòg ail-enwi defnyddwyr',
+ 'log-description-renameuser' => "Dyma lòg o'r holl newidiadau i enwau defnyddwyr.",
+ 'logentry-renameuser-renameuser' => '{{GENDER:$2|Ailenwodd}} $1 y defnyddiwr $4 ($6 {{PLURAL:$6|golygiad|golygiad|olygiad|golygiad}}) yn $5',
+ 'logentry-renameuser-renameuser-legacier' => 'Ailenwodd $1 y defnyddiwr $4 yn $5',
'renameuser-move-log' => 'Wedi symud y dudalen yn awtomatig wrth ail-enwi\'r defnyddiwr "[[User:$1|$1]]" i "[[User:$2|$2]]"',
'action-renameuser' => 'ail-enwi defnyddwyr',
'right-renameuser' => 'Ail-enwi defnyddwyr',
@@ -847,6 +910,7 @@ $messages['da'] = array(
'renameuserwarnings' => 'Advarsler:',
'renameuserconfirm' => 'Ja, omdøb brugeren',
'renameusersubmit' => 'Omdøb',
+ 'renameuser-submit-blocklog' => 'Vis blokeringslog for bruger',
'renameusererrordoesnotexist' => 'Brugeren "<nowiki>$1</nowiki>" findes ikke.',
'renameusererrorexists' => 'Brugeren "<nowiki>$1</nowiki>" findes allerede.',
'renameusererrorinvalid' => 'Brugernavnet "<nowiki>$1</nowiki>" er ugyldigt.',
@@ -857,10 +921,10 @@ Gå venligst tilbage og prøv igen.',
'renameuser-page-exists' => 'Siden $1 eksisterer allerede og kan ikke automatisk overskrives.',
'renameuser-page-moved' => 'Siden $1 er flyttet til $2.',
'renameuser-page-unmoved' => 'Siden $1 kunne ikke flyttes til $2.',
- 'renameuserlogpage' => 'Brugeromdøbningslog',
- 'renameuserlogpagetext' => 'Dette er en log over omdøbninger af brugernavne.',
- 'renameuserlogentry' => 'har omdøbt $1 til "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 redigering|$1 redigeringer}}. Ã…rsag: $2',
+ 'log-name-renameuser' => 'Brugeromdøbningslog',
+ 'log-description-renameuser' => 'Dette er en log over omdøbninger af brugernavne.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|omdøbte}} bruger $4 ({{PLURAL:$6|$6 redigering|$6 redigeringer}}) til $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 omdøbte bruger $4 til $5',
'renameuser-move-log' => 'Side automatisk flyttet ved omdøbning af bruger "[[User:$1|$1]]" til "[[User:$2|$2]]"',
'action-renameuser' => 'omdøb brugere',
'right-renameuser' => 'Omdøbe brugere',
@@ -880,7 +944,7 @@ $messages['de'] = array(
'renameuser' => 'Benutzer umbenennen',
'renameuser-linkoncontribs' => 'Benutzer umbenennen',
'renameuser-linkoncontribs-text' => 'Diesen Benutzer umbenennen',
- 'renameuser-desc' => 'Ergänzt eine [[Special:Renameuser|Spezialseite]] zum Umbenennen eines Benutzers',
+ 'renameuser-desc' => 'Ergänzt eine [[Special:Renameuser|Spezialseite]] zum Ändern eines Benutzernamens',
'renameuserold' => 'Bisheriger Benutzername:',
'renameusernew' => 'Neuer Benutzername:',
'renameuserreason' => 'Grund:',
@@ -901,10 +965,10 @@ Bitte nochmal versuchen.',
'renameuser-page-exists' => 'Die Seite „$1“ ist bereits vorhanden und kann nicht automatisch überschrieben werden.',
'renameuser-page-moved' => 'Die Seite „$1“ wurde nach „$2“ verschoben.',
'renameuser-page-unmoved' => 'Die Seite „$1“ konnte nicht nach „$2“ verschoben werden.',
- 'renameuserlogpage' => 'Benutzernamenänderungs-Logbuch',
- 'renameuserlogpagetext' => 'In diesem Logbuch werden die Änderungen von Benutzernamen protokolliert.',
- 'renameuserlogentry' => 'hat „$1“ in „$2“ umbenannt',
- 'renameuser-log' => '{{PLURAL:$1|Eine Bearbeitung|$1 Bearbeitungen}}. Grund: $2',
+ 'log-name-renameuser' => 'Benutzernamenänderungs-Logbuch',
+ 'log-description-renameuser' => 'In diesem Logbuch werden die Änderungen von Benutzernamen protokolliert.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|hat}} Benutzer „$4“ (mit {{PLURAL:$6|einer Bearbeitung|$6 Bearbeitungen}}) in „$5“ umbenannt',
+ 'logentry-renameuser-renameuser-legacier' => '$1 hat Benutzer „$4“ in „$5“ umbenannt',
'renameuser-move-log' => 'Seite während der Benutzerkontoumbenennung von „[[User:$1|$1]]“ in „[[User:$2|$2]]“ automatisch verschoben',
'action-renameuser' => 'Benutzer umzubenennen',
'right-renameuser' => 'Benutzer umbenennen',
@@ -915,15 +979,16 @@ Zur Information folgt das Benutzernamenänderungs-Logbuch.',
/** Zazaki (Zazaki)
* @author Aspar
* @author Erdemaslancan
+ * @author Mirzali
* @author Xoser
*/
$messages['diq'] = array(
- 'renameuser' => 'nameyê karberi bıvurn',
- 'renameuser-linkoncontribs' => 'name bivurne',
- 'renameuser-linkoncontribs-text' => 'Nameyê ena karber bivurne',
+ 'renameuser' => 'Karberi newe ra name ke',
+ 'renameuser-linkoncontribs' => 'karberi newe ra name ke',
+ 'renameuser-linkoncontribs-text' => 'Nê karberi newe ra name ke',
'renameuser-desc' => "qey newe ra namedayişê karberi re yew [[Special:Renameuser|pelo xas]] têare keno (gani heqqê ''karberi re newe ra name bıde'' bıbo )",
- 'renameuserold' => 'nameyê karberi yo nıkayi',
- 'renameusernew' => 'nameyê karberi yo newe',
+ 'renameuserold' => 'nameyê karberio nıkayên:',
+ 'renameusernew' => 'Nameyê karberio newe:',
'renameuserreason' => 'Sebeb:',
'renameusermove' => 'nameyê karberan u pelê werêaameyişan bıkırışi nameyo newe',
'renameusersuppress' => 'Name de newi re hetenayışo newe vıraştış',
@@ -942,13 +1007,13 @@ kerem kerê agêrê newe ra tesel bıkerê, bıcerbnê',
'renameuser-page-exists' => '$1 pel ca ra esto newe ra ser nênusiyeno.',
'renameuser-page-moved' => '$1 pel kırışiya no $2 pel',
'renameuser-page-unmoved' => '$1 pel nêkırışiya no $2 pel.',
- 'renameuserlogpage' => 'qeydê vuriyayişê nameyê karberi',
- 'renameuserlogpagetext' => 'listeya cêrıni nameyê karberê ke vuriyayo mocneno',
- 'renameuserlogentry' => '$1newe ra neme bı: "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 edit|$1 edit}}. çıra: $2',
+ 'log-name-renameuser' => 'qeydê vuriyayişê nameyê karberi',
+ 'log-description-renameuser' => 'Eno yew qeydê vurnayışê nameyanê karberio.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|Nameyê}} karberê $4 $5 ra ({{PLURAL:$6|$6 vurnayış|$6 vurnayışi}})',
+ 'logentry-renameuser-renameuser-legacier' => '$1i $4 ra nameyê cı berd $5',
'renameuser-move-log' => 'wexta ke karber "[[User:$1|$1]]" no name ra kırışiya "[[User:$2|$2]]" no name re ya newe ra name diyêne pel zi otomotikmen kırişiya',
- 'action-renameuser' => 'nameyê karberi bıvurne',
- 'right-renameuser' => 'nameyê karberan bıvurn',
+ 'action-renameuser' => 'karberan newe ra name ke',
+ 'right-renameuser' => 'Karberan newe ra name ke',
'renameuser-renamed-notice' => 'nameyê na/no karberi/e vuriya.
qey referansi rocaneyê vuriyayişê nameyi cêr de yo.',
);
@@ -963,7 +1028,7 @@ $messages['dsb'] = array(
'renameuser-desc' => "Wužywarja pśemjeniś (pomina se pšawo ''renameuser'')",
'renameuserold' => 'Aktualne wužywarske mě:',
'renameusernew' => 'Nowe wužywarske mě:',
- 'renameuserreason' => 'Pśicyna za pśemjenjenje', # Fuzzy
+ 'renameuserreason' => 'Pśicyna:',
'renameusermove' => 'Wužywarski a diskusijny bok (a jich pódboki) do nowego mjenja pśesunuś',
'renameusersuppress' => 'Dalejpósrědnjenja k nowemu mjenjoju njenapóraś',
'renameuserreserve' => 'Stare wužywarske mě pśeśiwo pśichodnemu wužywanjeju blokěrowaś',
@@ -981,10 +1046,10 @@ $messages['dsb'] = array(
'renameuser-page-exists' => 'Bok $1 južo eksistěrujo a njedajo se awtomatiski pśepisaś.',
'renameuser-page-moved' => 'Bok $1 jo se do $2 pśesunuł.',
'renameuser-page-unmoved' => 'Bok $1 njejo se do $2 pśesunuś dał.',
- 'renameuserlogpage' => 'Protokol wužywarskich pśemjenjenjow',
- 'renameuserlogpagetext' => 'Toś to jo protokol změnow na wužywarskich mjenjach.',
- 'renameuserlogentry' => 'jo $1 do "$2" pśemjenił',
- 'renameuser-log' => '{{PLURAL:&1|1 změna|$1 změnje|$1 změny|$1 změnow}}. Pśicyna: $2',
+ 'log-name-renameuser' => 'Protokol wužywarskich pśemjenjenjow',
+ 'log-description-renameuser' => 'Toś to jo protokol změnow na wužywarskich mjenjach.',
+ 'logentry-renameuser-renameuser' => '$1 jo wužywarja $4 ({{PLURAL:$6|$6 změna|$6 změnje|$6 změny|$6 změnow}}) do $5 {{GENDER:$2|pśemjenił|pśemjenił}}',
+ 'logentry-renameuser-renameuser-legacier' => '$1 jo wužywarja $4 do $5 pśemjenił',
'renameuser-move-log' => 'Pśi pśemjenjowanju wužywarja "[[User:$1|$1]]" do "[[User:$2|$2]]" awtomatiski pśesunjony bok',
'action-renameuser' => 'wužywarjow pśemjeniś',
'right-renameuser' => 'Wužywarjow pśemjeniś',
@@ -1026,10 +1091,7 @@ $messages['el'] = array(
'renameuser-page-exists' => 'Η σελίδα $1 υπάÏχει ήδη και δεν μποÏεί να αντικατασταθεί αυτόματα.',
'renameuser-page-moved' => 'Η σελίδα $1 μετακινήθηκε στο $2.',
'renameuser-page-unmoved' => 'Η σελίδα $1 δεν μπόÏεσε να μετακινηθεί στο $2.',
- 'renameuserlogpage' => 'ΑÏχείο μετονομασίας χÏηστών',
- 'renameuserlogpagetext' => 'Αυτό είναι ένα αÏχείο καταγÏαφών αλλαγών σε ονόματα χÏηστών',
- 'renameuserlogentry' => 'Ο/Η $1 μετονομάστηκε σε «$2»',
- 'renameuser-log' => '{{PLURAL:$1|1 επεξεÏγασία|$1 επεξεÏγασίες}}. Λόγος: $2',
+ 'log-name-renameuser' => 'ΑÏχείο μετονομασίας χÏηστών',
'renameuser-move-log' => 'Η σελίδα μετακινήθηκε αυτόματα κατά τη μετονομασία του χÏήστη "[[User:$1|$1]]" σε "[[User:$2|$2]]"',
'action-renameuser' => 'μετονομασία χÏηστών',
'right-renameuser' => 'Μετονομασία χÏηστών',
@@ -1049,7 +1111,7 @@ $messages['eo'] = array(
'renameuser-desc' => "Aldonas [[Special:Renameuser|specialan paÄon]] por alinomigi uzanton (bezonas rajton ''renameuser'')",
'renameuserold' => 'Aktuala salutnomo:',
'renameusernew' => 'Nova salutnomo:',
- 'renameuserreason' => 'Kialo por alinomigo:', # Fuzzy
+ 'renameuserreason' => 'Kialo:',
'renameusermove' => 'Movu uzantan kaj diskutan paÄojn (kaj ties subpaÄojn) al la nova nomo',
'renameusersuppress' => 'Ne krei alidirektilojn al la nova nomo',
'renameuserreserve' => 'Teni la malnovan salutnomon de plua uzo',
@@ -1067,10 +1129,10 @@ Bonvolu retroigi kaj reprovi.',
'renameuser-page-exists' => 'La paÄo $1 jam ekzistas kaj ne povas esti aÅ­tomate anstataÅ­ata.',
'renameuser-page-moved' => 'La paÄo $1 estis movita al $2.',
'renameuser-page-unmoved' => 'La paÄo $1 ne povis esti movita al $2.',
- 'renameuserlogpage' => 'Protokolo pri alinomigoj de uzantoj',
- 'renameuserlogpagetext' => 'Jen protokolo pri ÅanÄoj de salutnomoj.',
- 'renameuserlogentry' => 'renomigis $1 al "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 redakto|$1 redaktoj}}. Kialo: $2',
+ 'log-name-renameuser' => 'Protokolo pri alinomigoj de uzantoj',
+ 'log-description-renameuser' => 'Jen protokolo pri ÅanÄoj de salutnomoj.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|alinomiÄis}} uzanton $4 ({{PLURAL:$6|$6 redakto|$6 redaktoj}}) al $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 alinomigis uzanton $4 al $5',
'renameuser-move-log' => 'AÅ­tomate movis paÄon dum alinomigo de la uzanto "[[User:$1|$1]]" al "[[User:$2|$2]]"',
'action-renameuser' => 'Alinomigi uzantojn',
'right-renameuser' => 'Alinomigi uzantojn',
@@ -1119,10 +1181,10 @@ Por favor, vuelve atrás e inténtalo de nuevo.',
'renameuser-page-exists' => 'La página $1 ya existe y no puede ser reemplazada automáticamente.',
'renameuser-page-moved' => 'La página $1 ha sido trasladada a $2.',
'renameuser-page-unmoved' => 'La página $1 no pudo ser trasladada a $2.',
- 'renameuserlogpage' => 'Registro de cambios de nombre de usuario',
- 'renameuserlogpagetext' => 'Este es un registro de cambios de nombres de usuario.',
- 'renameuserlogentry' => 'cambió el nombre de usuario de $1 a «$2»',
- 'renameuser-log' => '{{PLURAL:$1|1 edición|$1 ediciones}}. Motivo: $2',
+ 'log-name-renameuser' => 'Registro de cambios de nombre de usuario',
+ 'log-description-renameuser' => 'Este es un registro de cambios en los nombres de usuario.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|modificó el nombre}} del usuario $4 ({{PLURAL:$6|$6 edición|$6 ediciones}}) a $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 ha cambiado el nombre del usuario $4 a $5',
'renameuser-move-log' => 'Página trasladada automáticamente al cambiar el nombre de usuario de «[[User:$1|$1]]» a «[[User:$2|$2]]»',
'action-renameuser' => 'Cambiar el nombre de los usuarios',
'right-renameuser' => 'Cambiar el nombre de los usuarios',
@@ -1144,7 +1206,7 @@ $messages['et'] = array(
'renameuser-desc' => "Lisab kasutajanime muutmise [[Special:Renameuser|erilehekülje]] (vajab ''renameuser''-õigust).",
'renameuserold' => 'Praegune kasutajanimi:',
'renameusernew' => 'Uus kasutajanimi:',
- 'renameuserreason' => 'Muutmise põhjus:', # Fuzzy
+ 'renameuserreason' => 'Põhjus:',
'renameusermove' => 'Nimeta ümber kasutajaleht, aruteluleht ja nende alamlehed.',
'renameusersuppress' => 'Ära loo ümbersuunamisi uuele nimele',
'renameuserreserve' => 'Ära luba vana kasutajanime edaspidi kasutada',
@@ -1162,10 +1224,10 @@ Palun ürita uuesti.',
'renameuser-page-exists' => 'Lehekülg $1 on juba olemas ja seda ei saa automaatselt üle kirjutada.',
'renameuser-page-moved' => 'Lehekülg $1 on teisaldatud pealkirja $2 alla.',
'renameuser-page-unmoved' => 'Lehekülje $1 teisaldamine nime $2 alla ei õnnestunud.',
- 'renameuserlogpage' => 'Kasutajanime muutmise logi',
- 'renameuserlogpagetext' => 'See on kasutajanimede muutmise logi.',
- 'renameuserlogentry' => 'nimetas kasutaja $1 ümber kasutajaks "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 redigeerimine|$1 redigeerimist}}. Põhjus: $2',
+ 'log-name-renameuser' => 'Kasutajanime muutmise logi',
+ 'log-description-renameuser' => 'See on kasutajanimede muutmise logi.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|nimetas}} kasutaja ({{PLURAL:$6|üks redigeerimine|$6 redigeerimist}}) $4 ümber kasutajaks $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 nimetas kasutaja $4 ümber kasutajaks $5',
'renameuser-move-log' => 'Teisaldatud automaatselt, kui kasutaja "[[User:$1|$1]]" nimetati ümber kasutajaks "[[User:$2|$2]]"',
'action-renameuser' => 'kasutajaid ümber nimetadata',
'right-renameuser' => 'Muuta kasutajanimesid',
@@ -1192,9 +1254,7 @@ $messages['eu'] = array(
'renameuser-page-exists' => 'Badago $1 orrialdea, eta ezin da automatikoki gainidatzi.',
'renameuser-page-moved' => '$1 orria $2 izenera aldatu da.',
'renameuser-page-unmoved' => 'Ezin izan da $1 orrialdea $2(e)ra mugitu.',
- 'renameuserlogpage' => 'Erabiltzaileen izen aldaketa erregistroa',
- 'renameuserlogpagetext' => 'Erabiltzaileen izen aldaketen erregistroa da hau',
- 'renameuser-log' => '{{PLURAL:$1|aldaketa 1|$1 aldaketa}}. Arrazoia: $2',
+ 'log-name-renameuser' => 'Erabiltzaileen izen aldaketa erregistroa',
'right-renameuser' => 'Lankideak berrizendatu',
);
@@ -1235,10 +1295,10 @@ $messages['fa'] = array(
'renameuser-page-exists' => 'صÙحهٔ $1 از قبل وجود داشته Ùˆ به طور خودکار قابل بازنویسی نیست.',
'renameuser-page-moved' => 'صÙحهٔ $1 به $2 انتقال داده شد.',
'renameuser-page-unmoved' => 'امکان انتقال صÙحهٔ $1 به $2 وجود ندارد.',
- 'renameuserlogpage' => 'سیاهه تغییر نام کاربر',
- 'renameuserlogpagetext' => 'این سیاههٔ تغییر نام کاربران است',
- 'renameuserlogentry' => 'نام $1 را به $2 تغییر داد',
- 'renameuser-log' => '$1 ویرایش. دلیل: $2',
+ 'log-name-renameuser' => 'سیاهه تغییر نام کاربر',
+ 'log-description-renameuser' => 'این سیاههٔ تغییر نام کاربران است.',
+ 'logentry-renameuser-renameuser' => '$1 نام $4 ({{PLURAL:$6|$6 ویرایش|}}) را به $5 {{GENDER:$2|تغییر داد}}',
+ 'logentry-renameuser-renameuser-legacier' => '$1 نام کاربری $4 را به $5 تغییر داد',
'renameuser-move-log' => 'صÙحه در ضمن تغییر نام «[[User:$1|$1]]» به «[[User:$2|$2]]» به طور خودکار انتقال داده شد.',
'action-renameuser' => 'تغییر نام کاربران',
'right-renameuser' => 'تغییر نام کاربران',
@@ -1279,10 +1339,10 @@ $messages['fi'] = array(
'renameuser-page-exists' => 'Sivu $1 on jo olemassa eikä sitä korvattu.',
'renameuser-page-moved' => 'Sivu $1 siirrettiin nimelle $2.',
'renameuser-page-unmoved' => 'Sivun $1 siirtäminen nimelle $2 ei onnistunut.',
- 'renameuserlogpage' => 'Tunnusten vaihdot',
- 'renameuserlogpagetext' => 'Tämä on loki käyttäjätunnuksien vaihdoista.',
- 'renameuserlogentry' => 'on nimennyt käyttäjän $1 käyttäjäksi â€$2â€',
- 'renameuser-log' => 'Tehnyt {{PLURAL:$1|yhden muokkauksen|$1 muokkausta}}. $2',
+ 'log-name-renameuser' => 'Tunnusten vaihdot',
+ 'log-description-renameuser' => 'Tämä on loki käyttäjätunnuksien vaihdoista.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|nimesi}} käyttäjän $4 ({{PLURAL:$6|$6 muokkaus|$6 muokkausta}}) uudelle nimelle $5', # Fuzzy
+ 'logentry-renameuser-renameuser-legacier' => '$1 nimesi käyttäjän $4 uudelle nimelle $5',
'renameuser-move-log' => 'Siirretty automaattisesti tunnukselta â€[[User:$1|$1]]†tunnukselle â€[[User:$2|$2]]â€',
'action-renameuser' => 'nimetä käyttäjätunnuksia uudelleen',
'right-renameuser' => 'Nimetä käyttäjätunnuksia uudelleen',
@@ -1311,8 +1371,6 @@ $messages['fo'] = array(
Vinarliga far aftur og royn enn einaferð.',
'renameuser-page-moved' => 'Síðan $1 er blivin flutt til $2.',
'renameuser-page-unmoved' => 'Síðan $1 kundi ikki verða flutt til $2.',
- 'renameuserlogentry' => 'umdoypti $1 til "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 rætting|$1 rættingar}}. Orsøk: $2',
'right-renameuser' => 'Umdoyp brúkarar',
'renameuser-renamed-notice' => 'Hesin brúkari hevur fingið nýtt navn.
Loggurin fyri navnabroytingina er givin niðanfyri fyri keldu ávísing.',
@@ -1356,10 +1414,10 @@ $messages['fr'] = array(
'renameuser-page-exists' => 'La page $1 existe déjà et ne peut pas être automatiquement remplacée.',
'renameuser-page-moved' => 'La page $1 a été déplacée vers $2.',
'renameuser-page-unmoved' => 'La page $1 ne peut pas être renommée en $2.',
- 'renameuserlogpage' => 'Journal des changements de noms d’utilisateurs',
- 'renameuserlogpagetext' => 'Ceci est l’historique des changements de noms d’utilisateur',
- 'renameuserlogentry' => 'a renommé « $1 » en « $2 »',
- 'renameuser-log' => '$1 modification{{PLURAL:$1||s}}. Motif : $2',
+ 'log-name-renameuser' => 'Journal des changements de noms d’utilisateurs',
+ 'log-description-renameuser' => "Ceci est l'historique des modifications des noms d'utilisateur.",
+ 'logentry-renameuser-renameuser' => "$1 {{GENDER:$2|a renommé}} l'utilisateur $4 ({{PLURAL:$6|$6 modification|$6 modifications}}) en $5",
+ 'logentry-renameuser-renameuser-legacier' => "$1 a renommé l'utilisateur $4 en $5",
'renameuser-move-log' => 'Page déplacée automatiquement lorsque l’utilisateur « [[User:$1|$1]] » est devenu « [[User:$2|$2]] »',
'action-renameuser' => 'renommer les utilisateurs',
'right-renameuser' => 'Renommer les utilisateurs',
@@ -1394,10 +1452,7 @@ Volyéd tornar arriér et pués tornar èprovar.',
'renameuser-page-exists' => 'La pâge $1 ègziste ja et pôt pas étre remplaciê ôtomaticament.',
'renameuser-page-moved' => 'La pâge $1 at étâ dèplaciê vers $2.',
'renameuser-page-unmoved' => 'La pâge $1 pôt pas étre renomâ en $2.',
- 'renameuserlogpage' => 'Jornal des changements de nom d’usanciér',
- 'renameuserlogpagetext' => 'O est lo jornal des changements de nom d’usanciér.',
- 'renameuserlogentry' => 'at renomâ « $1 » en « $2 »',
- 'renameuser-log' => '$1 changement{{PLURAL:$1||s}}. Rêson : $2',
+ 'log-name-renameuser' => 'Jornal des changements de nom d’usanciér',
'renameuser-move-log' => 'Pâge dèplaciê ôtomaticament quand l’usanciér « [[User:$1|$1]] » est vegnu « [[User:$2|$2]] »',
'action-renameuser' => 'renomar los utilisators',
'right-renameuser' => 'Renomar des usanciérs',
@@ -1440,10 +1495,7 @@ Gean tebek en probearje it asjebleaft op 'e nij.",
'renameuser-page-exists' => 'De side $1 bestiet al en kin net automatysk oerskreaun wurde.',
'renameuser-page-moved' => 'Sidenamme $1 is feroare yn $2.',
'renameuser-page-unmoved' => 'Sidenamme $1 koe net feroare wurde yn $2.',
- 'renameuserlogpage' => 'Nammeferoar-loch',
- 'renameuserlogpagetext' => 'Dit is in loch fan feroarings fan meidochnammen.',
- 'renameuserlogentry' => 'hat de namme fan $1 feroare yn "$2"',
- 'renameuser-log' => '{{PLURAL:$1|ien feroaring|$1 feroarings}}. Reden: $2',
+ 'log-name-renameuser' => 'Nammeferoar-loch',
'renameuser-move-log' => 'Sidenamme automatysk feroare by it feroarjen fan de meidoggersnamme fan "[[User:$1|$1]]" yn "[[User:$2|$2]]"',
'right-renameuser' => 'Feroarje meidoggersnammen',
);
@@ -1457,8 +1509,6 @@ $messages['ga'] = array(
'renameusernew' => 'Ainm nua úsáideora:',
'renameusersuccess' => 'Athainmníodh úsáideoir "<nowiki>$1</nowiki>" mar "<nowiki>$2</nowiki>"',
'renameuser-page-exists' => 'Tá leathanach "$1" ann chean féin; ní féidir ábhar a scríobh thairis go huathoibríoch.',
- 'renameuserlogentry' => 'athainmníodh úsáideoir $1 mar "$2"',
- 'renameuser-log' => '{{PLURAL:$1|Athrú amháin|$1 athruithe}}. Fáth: $2',
);
/** Galician (galego)
@@ -1491,10 +1541,10 @@ Volva atrás e inténteo de novo.',
'renameuser-page-exists' => 'A páxina "$1" xa existe e non pode ser sobrescrita automaticamente.',
'renameuser-page-moved' => 'A páxina "$1" foi movida a "$2".',
'renameuser-page-unmoved' => 'A páxina "$1" non pode ser movida a "$2".',
- 'renameuserlogpage' => 'Rexistro de cambios de nome de usuario',
- 'renameuserlogpagetext' => 'Este é un rexistro dos cambios nos nomes de usuario.',
- 'renameuserlogentry' => 'mudou o nome de "$1" a "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 edición|$1 edicións}}. Razón: $2',
+ 'log-name-renameuser' => 'Rexistro de cambios de nome de usuario',
+ 'log-description-renameuser' => 'Este é un rexistro dos cambios nos nomes de usuario.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|mudou o nome}} do usuario $4 ({{PLURAL:$6|$6 edición|$6 edicións}}) a $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 mudou o nome do usuario $4 a $5',
'renameuser-move-log' => 'A páxina moveuse automaticamente cando se mudou o nome do usuario "[[User:$1|$1]]" a "[[User:$2|$2]]"',
'action-renameuser' => 'renomear usuarios',
'right-renameuser' => 'Renomear usuarios',
@@ -1507,7 +1557,6 @@ Velaquí está o rexistro de cambios de nome de usuario por se quere consultalo.
*/
$messages['grc'] = array(
'renameusersubmit' => 'Ὑποβάλλειν',
- 'renameuser-log' => '{{PLURAL:$1|1 μεταγÏαφή|$1 μεταγÏαφαί}}. Αίτία: $2',
);
/** Swiss German (Alemannisch)
@@ -1538,10 +1587,8 @@ $messages['gsw'] = array(
'renameuser-page-exists' => 'D Syte $1 git s scho un cha nit automatisch iberschribe wäre.',
'renameuser-page-moved' => 'D Syte $1 isch noch $2 verschobe wore.',
'renameuser-page-unmoved' => 'D Syte $1 het nit chenne noch $2 verschobe wäre.',
- 'renameuserlogpage' => 'Benutzernamenänderigs-Logbuech',
- 'renameuserlogpagetext' => 'In däm Logbuech wäre d Änderige vu Benutzernäme protokolliert.',
- 'renameuserlogentry' => 'het „$1“ in „$2“ umgnännt',
- 'renameuser-log' => '{{PLURAL:$1|1 Bearbeitig|$1 Bearbeitige}}. Grund: $2',
+ 'log-name-renameuser' => 'Benutzernamenänderigs-Logbuech',
+ 'log-description-renameuser' => 'In däm Logbuech wäre d Änderige vu Benutzernäme protokolliert.',
'renameuser-move-log' => 'dur d Umnännig vu „[[User:$1|$1]]“ noch „[[User:$2|$2]]“ automatisch verschobeni Syte',
'action-renameuser' => 'Benutzer umznänne',
'right-renameuser' => 'Benutzer umnänne',
@@ -1550,6 +1597,7 @@ S Umnännigs-Logbuech wird do unte ufgfiert as Quälle.',
);
/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @author Ashok modhvadia
* @author KartikMistry
* @author Sushant savla
*/
@@ -1560,7 +1608,7 @@ $messages['gu'] = array(
'renameuser-desc' => "સભà«àª¯àª¨à«àª‚ નામાંતરણ કરવા માટે [[Special:Renameuser|special page]] ઉમેરે છે (''renameuser'' હકà«àª• જરૂરી)",
'renameuserold' => 'હાલનà«àª‚ સભà«àª¯àª¨àª¾àª®:',
'renameusernew' => 'નવà«àª‚ સભà«àª¯àª¨àª¾àª®:',
- 'renameuserreason' => 'નામ બદલવાનà«àª‚ કારણ:', # Fuzzy
+ 'renameuserreason' => 'કારણ:',
'renameusermove' => 'સભà«àª¯ અને ગપà«àªªàª¾àª‚ પાનાંઓ (અને તેમનાં ઉપપાનાંઓ) નવાં નામ પર ખસેડો',
'renameusersuppress' => 'નવા નામ પર દિશા નિરà«àª¦à«‡àª¶àª¨à«‹ ન રચશો',
'renameuserreserve' => 'જૂના સભà«àª¯àª¨àª¾àª®àª¨à«‡ ભવિષà«àª¯àª¨à«‹ વપરાશ પà«àª°àª¤àª¿àª¬àª‚ધીત કરો',
@@ -1578,10 +1626,7 @@ $messages['gu'] = array(
'renameuser-page-exists' => 'પાનà«àª‚ $1 પહેલેથી અસà«àª¤àª¿àª¤à«àªµàª®àª¾àª‚ છે તેના પર સà«àªµàª¯àª‚ચલિત નવà«àª‚ લેખન ન થાય.',
'renameuser-page-moved' => 'પાના $1 ને $2 પર ખસેડાયà«àª‚',
'renameuser-page-unmoved' => 'પાના $1ને $2 પર ન લઈ જઈ શકાયà«àª‚',
- 'renameuserlogpage' => 'સભà«àª¯ નામફેરનો લોગ',
- 'renameuserlogpagetext' => 'સભà«àª¯àª¨àª¾ દà«àªµàª¾àª°àª¾ થયેલા ફેરફરની આ સંપાદન યાદિ છે .',
- 'renameuserlogentry' => '$1 નà«àª‚ નામ "$2" કરà«àª¯à«àª‚',
- 'renameuser-log' => '{{PLURAL:$1|૧ ફેરફાર|$1 ફેરફારો}}. કારણ: $2',
+ 'log-name-renameuser' => 'સભà«àª¯ નામફેરનો લોગ',
'renameuser-move-log' => 'સભà«àª¯ "[[User:$1|$1]]" થી "[[User:$2|$2]]" નામ બદલતી વખતે આપમેળે પાનà«àª‚ ખસેડà«àª¯à«àª‚',
'action-renameuser' => 'સભà«àª¯à«‹àª¨àª¾àª‚ નામ બદલો',
'right-renameuser' => 'સભà«àª¯à«‹àª¨àª¾ નામ બદલો',
@@ -1603,7 +1648,7 @@ $messages['he'] = array(
'renameuser-desc' => "הוספת [[Special:Renameuser|דף מיוחד]] לשינוי ×©× ×ž×©×ª×ž×© (דרושה הרש×ת ''renameuser'')",
'renameuserold' => '×©× ×ž×©×ª×ž×© נוכחי:',
'renameusernew' => '×©× ×ž×©×ª×ž×© חדש:',
- 'renameuserreason' => 'סיבה לשינוי הש×:', # Fuzzy
+ 'renameuserreason' => 'סיבה:',
'renameusermove' => 'העברת דפי המשתמש והשיחה (כולל דפי המשנה שלה×) ×œ×©× ×”×—×“×©',
'renameusersuppress' => '×œ× ×œ×™×¦×•×¨ הפניות ×œ×©× ×”×—×“×©',
'renameuserreserve' => 'חסימת ×©× ×”×ž×©×ª×ž×© הישן לשימוש נוסף',
@@ -1620,10 +1665,10 @@ $messages['he'] = array(
'renameuser-page-exists' => 'הדף $1 כבר ×§×™×™× ×•×œ× × ×™×ª×Ÿ לדרוס ×ותו ×וטומטית.',
'renameuser-page-moved' => 'הדף $1 הועבר ×œ×©× $2.',
'renameuser-page-unmoved' => '×œ× × ×™×ª×Ÿ ×”×™×” להעביר ×ת הדף $1 ל$2.',
- 'renameuserlogpage' => 'יומן שינויי שמות משתמש',
- 'renameuserlogpagetext' => 'זהו יומן ×”×©×™× ×•×™×™× ×‘×©×ž×•×ª המשתמשי×.',
- 'renameuserlogentry' => 'שינה ×ת ×©× ×”×ž×©×ª×ž×© "$1" ל־"$2"',
- 'renameuser-log' => '{{PLURAL:$1|עריכה ×חת|$1 עריכות}}. סיבה: $2',
+ 'log-name-renameuser' => 'יומן שינויי שמות משתמש',
+ 'log-description-renameuser' => 'זהו יומן ×”×©×™× ×•×™×™× ×‘×©×ž×•×ª המשתמשי×.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|שינה|שינתה}} ×ת ×©× ×”×ž×©×ª×ž×© $4 ({{PLURAL:$6|עריכה ×חת|$6 עריכות}}) ×ל $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 שינה ×ת ×©× × ×ž×©×ª×ž×© $4 ×ל $5',
'renameuser-move-log' => 'העברה ×וטומטית בעקבות שינוי ×©× ×”×ž×©×ª×ž×© "[[User:$1|$1]]" ל־"[[User:$2|$2]]"',
'action-renameuser' => 'לשנות שמות משתמש',
'right-renameuser' => 'שינוי שמות משתמש',
@@ -1659,10 +1704,7 @@ $messages['hi'] = array(
'renameuser-page-exists' => '$1 यह पनà¥à¤¨à¤¾ पहले से असà¥à¤¤à¤¿à¤¤à¥à¤µà¤®à¥‡à¤‚ हैं और इसपर अपने आप पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न नहीं कर सकतें।',
'renameuser-page-moved' => '$1 का नाम बदलकर $2 कर दिया गया हैं।',
'renameuser-page-unmoved' => '$1 का नाम बदलकर $2 नहीं कर सकें हैं।',
- 'renameuserlogpage' => 'सदसà¥à¤¯à¤¨à¤¾à¤® बदलाव सूची',
- 'renameuserlogpagetext' => 'यह सदसà¥à¤¯à¤¨à¤¾à¤®à¥‹à¤‚में हà¥à¤ बदलावोंकी सूची हैं',
- 'renameuserlogentry' => 'ने $1 को "$2" में बदल दिया हैं', # Fuzzy
- 'renameuser-log' => '{{PLURAL:$1|1 बदलाव|$1 बदलाव}}. कारण: $2',
+ 'log-name-renameuser' => 'सदसà¥à¤¯à¤¨à¤¾à¤® बदलाव सूची',
'renameuser-move-log' => '"[[User:$1|$1]]" को "[[User:$2|$2]]" करते वकà¥à¤¤ अपने आप सदसà¥à¤¯à¤ªà¥ƒà¤·à¥à¤  बदल दिया हैं',
'right-renameuser' => 'सदसà¥à¤¯à¥‹à¤‚के नाम बदलें',
'renameuser-renamed-notice' => 'इस सदसà¥à¤¯ का नाम बदल दिया गया है।
@@ -1693,10 +1735,7 @@ Meharbani kar ke laut ke fir kosis karo.',
'renameuser-page-exists' => 'Panna $1 abhi hai aur iske apne se overwrite nai karaa jaae sake hai.',
'renameuser-page-moved' => 'Panna $1 ke naam badal ke $2 kar dewa gais hai.',
'renameuser-page-unmoved' => 'Panna $1 ke naam badal ke $2 nai kare sakaa hai.',
- 'renameuserlogpage' => 'Sadasya ke naam badle ke log',
- 'renameuserlogpagetext' => 'Ii ek sadasya ke naam badle ke log hai.',
- 'renameuserlogentry' => '$1 ke naam badal ke "$2" kar dewa gais hai',
- 'renameuser-log' => '{{PLURAL:$1|1 badlao|$1 badlao}}. Kaaran: $2',
+ 'log-name-renameuser' => 'Sadasya ke naam badle ke log',
'renameuser-move-log' => 'Automatically panna ke move kar diya hai jab ki sadasya ke naam "[[User:$1|$1]]" se badal ke "[[User:$2|$2]]" kar dewa gais hai',
'right-renameuser' => 'Sadasya log ke naam badlo',
);
@@ -1705,6 +1744,7 @@ Meharbani kar ke laut ke fir kosis karo.',
* @author Dalibor Bosits
* @author Dnik
* @author Ex13
+ * @author Roberta F.
* @author SpeedyGonsales
* @author Tivek
*/
@@ -1722,6 +1762,7 @@ $messages['hr'] = array(
'renameuserwarnings' => 'Upozorenja:',
'renameuserconfirm' => 'Da, preimenuj suradnika',
'renameusersubmit' => 'Potvrdi',
+ 'renameuser-submit-blocklog' => 'Prikaži suradnikovu ili suradniÄinu evidenciju blokiranja',
'renameusererrordoesnotexist' => 'Suradnik "<nowiki>$1</nowiki>" ne postoji (suradniÄko ime nije zauzeto).',
'renameusererrorexists' => 'SuradniÄko ime "<nowiki>$1</nowiki>" već postoji',
'renameusererrorinvalid' => 'SuradniÄko ime "<nowiki>$1</nowiki>" nije valjano',
@@ -1731,10 +1772,8 @@ $messages['hr'] = array(
'renameuser-page-exists' => 'Stranica $1 već postoji i ne može biti prepisana.',
'renameuser-page-moved' => 'Suradnikova stranica $1 je premještena, sad se zove: $2.',
'renameuser-page-unmoved' => 'Stranica $1 ne može biti preimenovana u $2.',
- 'renameuserlogpage' => 'Evidencija preimenovanja suradnika',
- 'renameuserlogpagetext' => 'Ovo je evidencija preimenovanja suradniÄkih imena',
- 'renameuserlogentry' => 'promijenjeno suradniÄko ime $1 u "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 uređivanje|$1 uređivanja}}. Razlog: $2',
+ 'log-name-renameuser' => 'Evidencija preimenovanja suradnika',
+ 'log-description-renameuser' => 'Ovo je evidencija preimenovanja suradniÄkih imena',
'renameuser-move-log' => 'Stranica suradnika je premještena prilikom preimenovanja iz "[[User:$1|$1]]" u "[[User:$2|$2]]"',
'right-renameuser' => 'Preimenovati suradnike',
'renameuser-renamed-notice' => 'Ovaj suradnik je preimenovan.
@@ -1769,10 +1808,10 @@ $messages['hsb'] = array(
'renameuser-page-exists' => 'Strona $1 hižo eksistuje a njemóže so awtomatisce přepisować.',
'renameuser-page-moved' => 'Strona $1 bu pod nowy titul $2 přesunjena.',
'renameuser-page-unmoved' => 'Njemóžno stronu $1 pod titul $2 přesunyć.',
- 'renameuserlogpage' => 'Protokol přemjenowanja wužiwarjow',
- 'renameuserlogpagetext' => 'Tu protokoluja so wšě přemjenowanja wužiwarjow.',
- 'renameuserlogentry' => 'je $1 do "$2" přemjenował',
- 'renameuser-log' => '{{PLURAL:$1|1 zmÄ›na|$1 zmÄ›nje|$1 zmÄ›ny|$1 zmÄ›now}}. PÅ™iÄina: $2',
+ 'log-name-renameuser' => 'Protokol přemjenowanja wužiwarjow',
+ 'log-description-renameuser' => 'To je protokol změnow wužiwarskich mjenow.',
+ 'logentry-renameuser-renameuser' => '$1 je wužiwarja $4 ({{PLURAL:$6|$6 změna|$6 změnje|$6 změny|$6 změnow}}) do $5 {{GENDER:$2|přemjenował|přemjenował}}',
+ 'logentry-renameuser-renameuser-legacier' => '$1 je wužiwarja $4 do $5 přemjenował',
'renameuser-move-log' => 'Přez přemjenowanje wužiwarja „[[User:$1|$1]]“ na „[[User:$2|$2]]“ awtomatisce přesunjena strona.',
'action-renameuser' => 'wužiwarjow přemjenować',
'right-renameuser' => 'Wužiwarjow přemjenować',
@@ -1793,7 +1832,7 @@ $messages['hu'] = array(
'renameuser-desc' => "Lehetővé teszi egy felhasználó átnevezését (''renameuser'' jog szükséges)",
'renameuserold' => 'Jelenlegi felhasználónév:',
'renameusernew' => 'Új felhasználónév:',
- 'renameuserreason' => 'Ãtnevezés oka:', # Fuzzy
+ 'renameuserreason' => 'Ok:',
'renameusermove' => 'Felhasználói- és vitalapok (és azok allapjainak) áthelyezése az új név alá',
'renameusersuppress' => 'Ne készüljön átirányítás az új névre',
'renameuserreserve' => 'Régi név blokkolása a jövőbeli használat megakadályozására',
@@ -1809,10 +1848,9 @@ $messages['hu'] = array(
'renameuser-page-exists' => '$1 már létezik, és nem lehet automatikusan felülírni.',
'renameuser-page-moved' => '$1 át lett nevezve $2 névre',
'renameuser-page-unmoved' => '$1-t nem sikerült $2 névre nevezi',
- 'renameuserlogpage' => 'Felhasználóátnevezési napló',
- 'renameuserlogpagetext' => 'Ez a felhasználói nevek változtatásának naplója.',
- 'renameuserlogentry' => 'átnevezte $1 azonosítóját (az új név: „$2â€)',
- 'renameuser-log' => '$1 szerkesztése van. Indoklás: $2',
+ 'log-name-renameuser' => 'Felhasználóátnevezési napló',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|átnevezte}} $4 szerkesztőt ({{PLURAL:$6|egy|$6}} szerkesztés) erre: $4', # Fuzzy
+ 'logentry-renameuser-renameuser-legacier' => '$1 átnevezte $4 szerkesztőt erre: $5',
'renameuser-move-log' => '„[[User:$1|$1]]†„[[User:$2|$2]]†névre való átnevezése közben automatikusan átnevezett oldal',
'action-renameuser' => 'felhasználó átnevezése',
'right-renameuser' => 'felhasználók átnevezése',
@@ -1848,10 +1886,7 @@ Per favor retorna e reproba.',
'renameuser-page-exists' => 'Le pagina $1 existe ja e non pote esser automaticamente superscribite.',
'renameuser-page-moved' => 'Le pagina $1 ha essite renominate a $2.',
'renameuser-page-unmoved' => 'Le pagina $1 non poteva esser renominate a $2.',
- 'renameuserlogpage' => 'Registro de renominationes de usatores',
- 'renameuserlogpagetext' => 'Isto es un registro de cambiamentos de nomines de usator.',
- 'renameuserlogentry' => 'renominava $1 verso "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 modification|$1 modificationes}}. Motivo: $2',
+ 'log-name-renameuser' => 'Registro de renominationes de usatores',
'renameuser-move-log' => 'Le pagina ha essite automaticamente renominate con le renomination del usator "[[User:$1|$1]]" a "[[User:$2|$2]]"',
'action-renameuser' => 'renominar usatores',
'right-renameuser' => 'Renominar usatores',
@@ -1890,10 +1925,8 @@ $messages['id'] = array(
'renameuser-page-exists' => 'Halaman $1 telah ada dan tidak dapat ditimpa secara otomatis.',
'renameuser-page-moved' => 'Halaman $1 telah dipindah ke $2.',
'renameuser-page-unmoved' => 'Halaman $1 tidak dapat dipindah ke $2.',
- 'renameuserlogpage' => 'Log penggantian nama pengguna',
- 'renameuserlogpagetext' => 'Di bawah ini adalah log penggantian nama pengguna',
- 'renameuserlogentry' => 'telah mengganti nama $1 menjadi "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 suntingan|$1 suntingan}}. Alasan: $2',
+ 'log-name-renameuser' => 'Log penggantian nama pengguna',
+ 'log-description-renameuser' => 'Di bawah ini adalah log penggantian nama pengguna',
'renameuser-move-log' => 'Secara otomatis memindahkan halaman sewaktu mengganti nama pengguna "[[User:$1|$1]]" menjadi "[[User:$2|$2]]"',
'action-renameuser' => 'ganti nama pengguna',
'right-renameuser' => 'Mengganti nama pengguna',
@@ -1921,7 +1954,7 @@ $messages['ilo'] = array(
'renameuser-desc' => "Agnayon ti [[Special:Renameuser|espesial a panid]] tapno inaganan manen ti agar-aramat (masapul ti ''inaganan manen ti agar-aramat'' a karbengan)",
'renameuserold' => 'Agdama a nagan ti agar-aramat:',
'renameusernew' => 'Baro a nagan ti agar-aramat:',
- 'renameuserreason' => 'Rason ti panaginagan manen:', # Fuzzy
+ 'renameuserreason' => 'Rason:',
'renameusermove' => 'Iyalis ti agar-aramat ket tungtungan a pampanid (ken dagiti ap-apo a panid) iti baro a nagan',
'renameusersuppress' => 'Saan nga agpartuat kadagiti baw-ing idiay baro a nagan',
'renameuserreserve' => 'Serraan ti daan a nagan ti agar-aramat manipud ti masakbayan a panag-usar.',
@@ -1939,10 +1972,7 @@ Pangngaasi nga agsubli ken padasen manen.',
'renameuser-page-exists' => 'Ti panid a $1 ket addaan ken saan a mautomatiko a suratan manen.',
'renameuser-page-moved' => 'Ti panid $1 ket naiyalisen idiay $2.',
'renameuser-page-unmoved' => 'Ti panid $1 ket saan a maiyalis idiay $2.',
- 'renameuserlogpage' => 'Listaan ti panaginaganan manen ti agar-aramat',
- 'renameuserlogpagetext' => 'Listaan daytoy kadagiti sinukatan a nag-nagan ti agararamat.',
- 'renameuserlogentry' => 'ninaganan manen ti $1 iti "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 urnos|$1 ur-urnos}}. Rason: $2',
+ 'log-name-renameuser' => 'Listaan ti panaginaganan manen ti agar-aramat',
'renameuser-move-log' => 'Automatiko nga iyalis ti panid bayat a nagnaganan manen ti agar-aramat "[[User:$1|$1]]" iti "[[User:$2|$2]]"',
'action-renameuser' => 'inaganan manen dagiti agar-aramat',
'right-renameuser' => 'Inaganan manen dagiti agar-aramat',
@@ -1967,10 +1997,7 @@ $messages['io'] = array(
'renameusersuccess' => 'La uzanto "<nowiki>$1</nowiki>" rinomesis "<nowiki>$2</nowiki>".',
'renameuser-page-moved' => 'La pagino $1 movesis a $2.',
'renameuser-page-unmoved' => 'On ne povis movar la pagino $1 a $2.',
- 'renameuserlogpage' => 'Registro di uzanto-rinomizuri',
- 'renameuserlogpagetext' => 'Ito es registro di uzantonomala chanji.',
- 'renameuserlogentry' => 'rinomis $1 por "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 redakto|$1 redakti}}. Motivo: $2',
+ 'log-name-renameuser' => 'Registro di uzanto-rinomizuri',
'right-renameuser' => 'Rinomar uzanti',
);
@@ -1989,7 +2016,7 @@ $messages['is'] = array(
'renameuser-desc' => "Bætir við [[Special:Renameuser|kerfissíðu]] til að breyta notendanafni (þarfnast ''renameuser'' réttinda)",
'renameuserold' => 'Núverandi notandanafn:',
'renameusernew' => 'Nýja notandanafnið:',
- 'renameuserreason' => 'Ãstæða:', # Fuzzy
+ 'renameuserreason' => 'Ãstæða:',
'renameusermove' => 'Færa notendasíðu og notendaspjallsíðu (og undirsíður þeirra) á nýja nafnið',
'renameusersuppress' => 'Ekki skilja eftir tilvísun',
'renameuserreserve' => 'Banna notkun á gamla notendanafninu',
@@ -2007,10 +2034,9 @@ Vinsamlegast farðu til baka og reyndu aftur.',
'renameuser-page-exists' => 'Síða sem heitir $1 er nú þegar til og það er ekki hægt að búa til nýja grein með sama heiti.',
'renameuser-page-moved' => 'Síðan $1 hefur verið færð á $2.',
'renameuser-page-unmoved' => 'Ekki var hægt að færa síðuna $1 á $2.',
- 'renameuserlogpage' => 'Skrá yfir nafnabreytingar notenda',
- 'renameuserlogpagetext' => 'Þetta er skrá yfir nýlegar breytingar á notendanöfnum.',
- 'renameuserlogentry' => 'breytti nafni $1 í "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 breyting|$1 breytingar}}. Ãstæða: $2',
+ 'log-name-renameuser' => 'Skrá yfir nafnabreytingar notenda',
+ 'log-description-renameuser' => 'Þetta er skrá yfir breytingar á notendanöfnum.',
+ 'logentry-renameuser-renameuser' => '$1 breytti {{GENDER:$2|notendanafni}} $4 ({{PLURAL:$6|$6 breyting|$6 breytingar}}) í $5',
'renameuser-move-log' => 'Færði síðuna sjálfvirkt þegar notendanafni "[[User:$1|$1]]" var breytt í "[[User:$2|$2]]"',
'action-renameuser' => 'endurnefna notendur',
'right-renameuser' => 'Breyta notandanafni notenda',
@@ -2052,10 +2078,10 @@ $messages['it'] = array(
'renameuser-page-exists' => 'La pagina $1 esiste già; impossibile sovrascriverla automaticamente.',
'renameuser-page-moved' => 'La pagina $1 è stata spostata a $2.',
'renameuser-page-unmoved' => 'La pagina $1 non può essere spostata a $2.',
- 'renameuserlogpage' => 'Utenti rinominati',
- 'renameuserlogpagetext' => 'Di seguito sono elencate le modifiche ai nomi utente.',
- 'renameuserlogentry' => 'ha rinominato $1 in "$2"',
- 'renameuser-log' => 'Che ha {{PLURAL:$1|un contributo|$1 contributi}}. Motivo: $2',
+ 'log-name-renameuser' => 'Utenti rinominati',
+ 'log-description-renameuser' => 'Di seguito sono elencate le modifiche ai nomi utente.',
+ 'logentry-renameuser-renameuser' => "$1 {{GENDER:$2|ha rinominato}} l'utente $4 (con {{PLURAL:$6|$6 contributo|$6 contributi}}) in $5",
+ 'logentry-renameuser-renameuser-legacier' => "$1 ha rinominato l'utente $4 in $5",
'renameuser-move-log' => 'Pagina spostata automaticamente durante la rinomina dell\'utente "[[User:$1|$1]]" a "[[User:$2|$2]]"',
'action-renameuser' => 'rinominare gli utenti',
'right-renameuser' => 'Rinomina gli utenti',
@@ -2079,11 +2105,11 @@ $messages['ja'] = array(
'renameuser' => '利用者åã®å¤‰æ›´',
'renameuser-linkoncontribs' => '利用者å変更',
'renameuser-linkoncontribs-text' => 'ã“ã®åˆ©ç”¨è€…ã®åå‰ã‚’変更',
- 'renameuser-desc' => '利用者å変更ã®ãŸã‚ã®[[Special:Renameuser|特別ページ]]を追加ã™ã‚‹(renameuser権é™ãŒå¿…è¦)',
+ 'renameuser-desc' => "利用者å変更ã®ãŸã‚ã®[[Special:Renameuser|特別ページ]]を追加ã™ã‚‹ (「{{int:right-renameuser}}ã€ã§ãã‚‹æ¨©é™ ''renameuser'' ãŒå¿…è¦)",
'renameuserold' => 'ç¾åœ¨ã®åˆ©ç”¨è€…å:',
'renameusernew' => 'æ–°ã—ã„利用者å:',
'renameuserreason' => 'ç†ç”±:',
- 'renameusermove' => '利用者ページã¨ä¼šè©±ãƒšãƒ¼ã‚¸ï¼ˆãŠã‚ˆã³ãれらã®ä¸‹ä½ãƒšãƒ¼ã‚¸ï¼‰ã‚’æ–°ã—ã„åå‰ã«ç§»å‹•',
+ 'renameusermove' => '利用者ページã¨ä¼šè©±ãƒšãƒ¼ã‚¸ (ãŠã‚ˆã³ãれらã®ä¸‹ä½ãƒšãƒ¼ã‚¸) ã‚’æ–°ã—ã„åå‰ã«ç§»å‹•',
'renameusersuppress' => 'æ–°ã—ã„åå‰ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’作æˆã—ãªã„',
'renameuserreserve' => '旧利用者åã®ä»Šå¾Œã®ä½¿ç”¨ã‚’ブロック',
'renameuserwarnings' => '警告:',
@@ -2094,17 +2120,17 @@ $messages['ja'] = array(
'renameusererrorexists' => '利用者「<nowiki>$1</nowiki>ã€ã¯æ—¢ã«å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚',
'renameusererrorinvalid' => '利用者å「<nowiki>$1</nowiki>ã€ã¯ç„¡åŠ¹ãªå€¤ã§ã™ã€‚',
'renameuser-error-request' => 'è¦æ±‚を正常ã«å—ã‘付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
-戻ã£ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。',
+戻ã£ã¦ã‹ã‚‰å†åº¦è©¦ã—ã¦ãã ã•ã„。',
'renameuser-error-same-user' => 'ç¾åœ¨ã¨åŒã˜åˆ©ç”¨è€…åã«ã¯å¤‰æ›´ã§ãã¾ã›ã‚“。',
'renameusersuccess' => '利用者åを「<nowiki>$1</nowiki>ã€ã‹ã‚‰ã€Œ<nowiki>$2</nowiki>ã€ã«å¤‰æ›´ã—ã¾ã—ãŸã€‚',
'renameuser-page-exists' => '$1 ãŒæ—¢ã«å­˜åœ¨ã™ã‚‹ãŸã‚ã€è‡ªå‹•ã§ã®ä¸Šæ›¸ãã¯ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
'renameuser-page-moved' => '$1 ã‚’ $2 ã«ç§»å‹•ã—ã¾ã—ãŸã€‚',
'renameuser-page-unmoved' => '$1 ã‚’ $2 ã«ç§»å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
- 'renameuserlogpage' => '利用者å変更記録',
- 'renameuserlogpagetext' => 'ã“ã‚Œã¯ã€åˆ©ç”¨è€…å変更ã®è¨˜éŒ²ã§ã™ã€‚',
- 'renameuserlogentry' => '$1 を「$2ã€ã¸åˆ©ç”¨è€…å変更ã—ã¾ã—ãŸ',
- 'renameuser-log' => '{{PLURAL:$1|$1 回ã®ç·¨é›†}}。ç†ç”±: $2',
- 'renameuser-move-log' => 'ページを自動的ã«ç§»å‹•ã—ã¾ã—ãŸï¼ˆåˆ©ç”¨è€…å変更ã®ãŸã‚:「[[User:$1|$1]]ã€ã‹ã‚‰ã€Œ[[User:$2|$2]]ã€ï¼‰',
+ 'log-name-renameuser' => '利用者å変更記録',
+ 'log-description-renameuser' => 'ã“ã‚Œã¯ã€åˆ©ç”¨è€…å変更ã®è¨˜éŒ²ã§ã™ã€‚',
+ 'logentry-renameuser-renameuser' => '$1 ㌠$4 ({{PLURAL:$6|$6 編集}}) ã®åˆ©ç”¨è€…åã‚’ $5 ã«{{GENDER:$2|変更ã—ã¾ã—ãŸ}}',
+ 'logentry-renameuser-renameuser-legacier' => '$1 ㌠$4 ã®åˆ©ç”¨è€…åã‚’ $5 ã«å¤‰æ›´ã—ã¾ã—ãŸ',
+ 'renameuser-move-log' => 'ページを自動的ã«ç§»å‹•ã—ã¾ã—㟠(利用者å変更ã®ãŸã‚:「[[User:$1|$1]]ã€ã‹ã‚‰ã€Œ[[User:$2|$2]]ã€)',
'action-renameuser' => '利用者åã®å¤‰æ›´',
'right-renameuser' => '利用者åを変更',
'renameuser-renamed-notice' => 'ã“ã®åˆ©ç”¨è€…ã¯åˆ©ç”¨è€…åを変更ã—ã¾ã—ãŸã€‚
@@ -2132,10 +2158,7 @@ $messages['jut'] = array(
'renameuser-page-exists' => 'Æ pæge $1 er ål og ken ekke åtåmatisk åverflyttet være.',
'renameuser-page-moved' => 'Æ pæge $1 er flyttet til $2.',
'renameuser-page-unmoved' => 'Æ pæge $1 kon ekke flyttet være til $2.',
- 'renameuserlogpage' => 'Bruger hernåm log',
- 'renameuserlogpagetext' => "Dett'er en log der ændrenger til brugernavner",
- 'renameuserlogentry' => 'har hernåmt $1 til "$2"', # Fuzzy
- 'renameuser-log' => '{{PLURAL:$1|en redigærenge|$1 redigærenger}}. Resån: $2',
+ 'log-name-renameuser' => 'Bruger hernåm log',
'renameuser-move-log' => 'Åtåmatisk flyttet pæge hviil hernåm der bruger "[[User:$1|$1]]" til "[[User:$2|$2]]"',
);
@@ -2169,10 +2192,8 @@ Mangga balènana lan nyoba manèh.',
'renameuser-page-exists' => 'Kaca $1 wis ana lan ora bisa ditimpa sacara otomatis.',
'renameuser-page-moved' => 'Kaca $1 wis dialihaké menyang $2.',
'renameuser-page-unmoved' => 'Kaca $1 ora bisa dialihaké menyang $2.',
- 'renameuserlogpage' => 'Log ganti jeneng panganggo',
- 'renameuserlogpagetext' => 'Iki log owah-owahan jeneng panganggo',
- 'renameuserlogentry' => 'Ganti jeneng $1 dadi "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 suntingan|$1 suntingan}}. Alesan: $2',
+ 'log-name-renameuser' => 'Log ganti jeneng panganggo',
+ 'log-description-renameuser' => 'Iki log owah-owahan jeneng panganggo',
'renameuser-move-log' => 'Sacara otomatis mindhah kaca nalika ngganti jeneng panganggo "[[User:$1|$1]]" dadi "[[User:$2|$2]]"',
'action-renameuser' => 'ganti jeneng panganggo',
'right-renameuser' => 'Ganti jeneng panganggo-panganggo',
@@ -2195,7 +2216,7 @@ $messages['ka'] = array(
'renameuser-desc' => 'áƒáƒ›áƒáƒ¢áƒ”ბს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის [[Special:Renameuser|შესáƒáƒ«áƒšáƒ”ბლáƒáƒ‘áƒáƒ¡]] (სáƒáƒ­áƒ˜áƒ áƒáƒ უფლებრ<code>renameuser</code>)',
'renameuserold' => 'áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი:',
'renameusernew' => 'áƒáƒ®áƒáƒšáƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი:',
- 'renameuserreason' => 'სáƒáƒ®áƒ”ლის შეცვლის მიზეზი:', # Fuzzy
+ 'renameuserreason' => 'მიზეზი:',
'renameusermove' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისრდრგáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ˜áƒ¡ გვერდების (დრმáƒáƒ—ი დáƒáƒ¥áƒ•áƒ”მდებáƒáƒ áƒ”ბული გვერდების) გáƒáƒ“áƒáƒ¢áƒáƒœáƒ áƒáƒ®áƒáƒš დáƒáƒ¡áƒáƒ®áƒ”ლებáƒáƒ–ე',
'renameusersuppress' => 'áƒáƒ  გáƒáƒ“áƒáƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—áƒáƒ— áƒáƒ®áƒáƒš სáƒáƒ®áƒ”ლზე',
'renameuserreserve' => 'ძველი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის სáƒáƒ›áƒáƒ›áƒáƒ•áƒšáƒ გáƒáƒ›áƒáƒ§áƒ”ნების áƒáƒ™áƒ áƒ«áƒáƒšáƒ•áƒ',
@@ -2212,10 +2233,10 @@ $messages['ka'] = array(
'renameuser-page-exists' => 'გვერდი $1 უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს დრმისი áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ შენáƒáƒªáƒ•áƒšáƒ”ბრშეუძლებელიáƒ.',
'renameuser-page-moved' => 'გვერდი $1 გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜áƒ $2-ზე.',
'renameuser-page-unmoved' => 'áƒáƒ  მáƒáƒ®áƒ”რხდრგვერდის $1 გáƒáƒ“áƒáƒ¢áƒáƒœáƒ $2-ზე.',
- 'renameuserlogpage' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ ჟურნáƒáƒšáƒ˜',
- 'renameuserlogpagetext' => 'ეს áƒáƒ áƒ˜áƒ¡ ჟურნáƒáƒšáƒ˜, სáƒáƒ“áƒáƒª áƒáƒ¦áƒ áƒ˜áƒªáƒ®áƒ£áƒšáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლთრცვლილებები',
- 'renameuserlogentry' => 'სáƒáƒ®áƒ”ლი გáƒáƒ“áƒáƒ”რქვრ$1-ს „$2-ზე“',
- 'renameuser-log' => '$1 რედáƒáƒ¥áƒªáƒ˜áƒ. მიზეზი: $2',
+ 'log-name-renameuser' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ ჟურნáƒáƒšáƒ˜',
+ 'log-description-renameuser' => 'ეს áƒáƒ áƒ˜áƒ¡ ჟურნáƒáƒšáƒ˜, სáƒáƒ“áƒáƒª áƒáƒ¦áƒ áƒ˜áƒªáƒ®áƒ£áƒšáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლთრცვლილებები.',
+ 'logentry-renameuser-renameuser' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 {{GENDER:$2|შეუცვáƒáƒšáƒ სáƒáƒ®áƒ”ლი}} მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს $4 ({{PLURAL:$6|$6 რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ|$6 რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ}}) სáƒáƒ®áƒ”ლით $5',
+ 'logentry-renameuser-renameuser-legacier' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 შეუცვáƒáƒšáƒ სáƒáƒ®áƒ”ლი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს $4 სáƒáƒ®áƒ”ლით $5',
'renameuser-move-log' => 'áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ იქნრგáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ გვერდი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის „[[User:$1|$1]]“ სáƒáƒ®áƒ”ლის შეცვლისáƒáƒ¡ „[[User:$2|$2]]-ით“',
'action-renameuser' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვáƒ',
'right-renameuser' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვáƒ',
@@ -2239,10 +2260,7 @@ $messages['kk-arab'] = array(
'renameuser-page-exists' => '$1 دەگەن بەت بار تۇگە, جانە وزدىك تۇردە ونىڭ ۇستىنە ەشتەڭە جازىلمايدى.',
'renameuser-page-moved' => '$1 دەگەن بەت $2 دەگەن بەتكە جىلجىتىلدى.',
'renameuser-page-unmoved' => '$1 دەگەن بەت $2 دەگەن بەتكە جىلجىتىلمادى.',
- 'renameuserlogpage' => 'قاتىسۋشىنى قايتا اتاۋ جۋرنالى',
- 'renameuserlogpagetext' => 'بۇل قاتىسۋشى اتىنداعى وزگەرىستەر جۋرنالى',
- 'renameuserlogentry' => '$1 اتاۋىن $2 دەگەنگە وزگەرتتى',
- 'renameuser-log' => '$1 تۇزەتۋى بار. $2',
+ 'log-name-renameuser' => 'قاتىسۋشىنى قايتا اتاۋ جۋرنالى',
'renameuser-move-log' => '«[[User:$1|$1]]» دەگەن قاتىسۋشى اتىن «[[User:$2|$2]]» دەگەنگە اۋىسقاندا بەت وزدىك تۇردە جىلجىتىلدى',
);
@@ -2262,10 +2280,7 @@ $messages['kk-cyrl'] = array(
'renameuser-page-exists' => '$1 деген бет бар түге, және өздік түрде оның Ò¯Ñтіне ештеңе жазылмайды.',
'renameuser-page-moved' => '$1 деген бет $2 деген бетке жылжытылды.',
'renameuser-page-unmoved' => '$1 деген бет $2 деген бетке жылжытылмады.',
- 'renameuserlogpage' => 'ҚатыÑушыны қайта атау журналы',
- 'renameuserlogpagetext' => 'Бұл қатыÑушы атындағы өзгеріÑтер журналы',
- 'renameuserlogentry' => '$1 атауын «$2» дегенге өзгертті',
- 'renameuser-log' => '$1 түзетуі бар. $2',
+ 'log-name-renameuser' => 'ҚатыÑушыны қайта атау журналы',
'renameuser-move-log' => '«[[User:$1|$1]]» деген қатыÑушы атын «[[User:$2|$2]]» дегенге ауыÑқанда бет өздік түрде жылжытылды',
);
@@ -2285,10 +2300,7 @@ $messages['kk-latn'] = array(
'renameuser-page-exists' => '$1 degen bet bar tüge, jäne özdik türde onıñ üstine eşteñe jazılmaýdı.',
'renameuser-page-moved' => '$1 degen bet $2 degen betke jıljıtıldı.',
'renameuser-page-unmoved' => '$1 degen bet $2 degen betke jıljıtılmadı.',
- 'renameuserlogpage' => 'Qatıswşını qaýta ataw jwrnalı',
- 'renameuserlogpagetext' => 'Bul qatıswşı atındağı özgerister jwrnalı',
- 'renameuserlogentry' => '$1 atawın «$2» degenge özgertti',
- 'renameuser-log' => '$1 tüzetwi bar. $2',
+ 'log-name-renameuser' => 'Qatıswşını qaýta ataw jwrnalı',
'renameuser-move-log' => '«[[User:$1|$1]]» degen qatıswşı atın «[[User:$2|$2]]» degenge awısqanda bet özdik türde jıljıtıldı',
);
@@ -2305,7 +2317,7 @@ $messages['km'] = array(
'renameuser-desc' => "ប្ážáž¼ážšážˆáŸ’មោះអ្នកប្រើប្រាស់(ážáŸ’រូវការសិទ្ធិ ''ប្ážáž¼ážšážˆáŸ’មោះអ្នកប្រើប្រាស់'')",
'renameuserold' => 'ឈ្មោះអ្នកប្រើប្រាស់បច្ចុប្បន្ន ៖',
'renameusernew' => 'ឈ្មោះអ្នកប្រើប្រាស់ážáŸ’មី៖',
- 'renameuserreason' => 'មូលហáŸážáž»áŸ–', # Fuzzy
+ 'renameuserreason' => 'មូលហáŸážáž»áŸ–',
'renameusermove' => 'ប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„ទំពáŸážšáž¢áŸ’នកប្រើប្រាស់និងទំពáŸážšáž–ិភាក្សា(រួមទាំងទំពáŸážšážšáž„ផងដែរ)ទៅឈ្មោះážáŸ’មី',
'renameusersuppress' => 'កុំបង្កើážáž€áž¶ážšáž”ញ្ជូនបន្ážáž‘ៅឈ្មោះážáŸ’មី',
'renameuserreserve' => 'ហាមឃាážáŸ‹áž‚ណនីចាស់ពីការប្រើប្រាស់នាពáŸáž›áž¢áž“ាគáž',
@@ -2321,10 +2333,7 @@ $messages['km'] = array(
'renameuser-page-exists' => 'ទំពáŸážš $1 មានហើយ មិនអាចសរសáŸážšáž‡áž¶áž“់ពីលើដោយស្វáŸáž™áž”្រវážáŸ’ážáž·áž‘áŸáŸ”',
'renameuser-page-moved' => 'ទំពáŸážš$1ážáŸ’រូវបានប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„ទៅ$2ហើយ។',
'renameuser-page-unmoved' => 'ទំពáŸážš$1មិនអាចប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„ទៅ$2បានទáŸáŸ”',
- 'renameuserlogpage' => 'កំនážáŸ‹áž áŸážáž»áž“ៃការប្ážáž¼ážšážˆáŸ’មោះអ្នកប្រើប្រាស់',
- 'renameuserlogpagetext' => 'áž“áŸáŸ‡áž‡áž¶áž€áŸ†ážŽážáŸ‹áž áŸážáž»áž“ៃបំលាស់ប្ážáž¼ážšáž“ៃឈ្មោះអ្នកប្រើប្រាស់',
- 'renameuserlogentry' => 'បានប្ážáž¼ážšážˆáŸ’មោះ $1 ទៅជា "$2" ហើយ',
- 'renameuser-log' => '{{PLURAL:$1|កំណែប្រែ}}។ áž áŸážáž»áž•áž›áŸ– $2',
+ 'log-name-renameuser' => 'កំនážáŸ‹áž áŸážáž»áž“ៃការប្ážáž¼ážšážˆáŸ’មោះអ្នកប្រើប្រាស់',
'renameuser-move-log' => 'បានប្ážáž¼ážšáž‘ីážáž¶áŸ†áž„ទំពáŸážšážŠáŸ„យស្វáŸáž™áž”្រវážáŸ’ážáž·áž€áŸ’នុងážážŽáŸˆáž–áŸáž›áž”្ážáž¼ážšážˆáŸ’មោះអ្នកប្រើប្រាស់ "[[User:$1|$1]]" ទៅ "[[User:$2|$2]]"',
'right-renameuser' => 'ប្ដូរឈ្មោះអ្នកប្រើប្រាស់នានា',
'renameuser-renamed-notice' => 'ឈ្មោះរបស់អ្នកប្រើប្រាស់នáŸáŸ‡ážáŸ’រូវបានប្ដូររួចហើយ។
@@ -2372,13 +2381,13 @@ $messages['ko'] = array(
'renameuser-error-same-user' => 'ì´ì „ì˜ ì´ë¦„ê³¼ ê°™ì€ ì´ë¦„으로는 바꿀 수 없습니다.',
'renameusersuccess' => '"<nowiki>$1</nowiki>" 사용ìžë¥¼ "<nowiki>$2</nowiki>" 사용ìžë¡œ ì´ë¦„ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤.',
'renameuser-page-exists' => '$1 문서가 ì´ë¯¸ 존재하여 ìžë™ìœ¼ë¡œ ì´ë™í•˜ì§€ 못했습니다.',
- 'renameuser-page-moved' => '$1 문서를 $2 문서로 ì´ë™í–ˆìŠµë‹ˆë‹¤.',
+ 'renameuser-page-moved' => '$1 문서를 $2 문서로 옮겼습니다.',
'renameuser-page-unmoved' => '$1 문서를 $2 문서로 ì´ë™í•˜ì§€ 못했습니다.',
- 'renameuserlogpage' => 'ì´ë¦„ 바꾸기 기ë¡',
- 'renameuserlogpagetext' => 'ì‚¬ìš©ìž ì´ë¦„ 바꾸기 기ë¡ìž…니다.',
- 'renameuserlogentry' => '사용ìžê°€ $1 사용ìžì—ì„œ "$2" 사용ìžë¡œ ì´ë¦„ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤.',
- 'renameuser-log' => '기여 $1회. ì´ìœ : $2',
- 'renameuser-move-log' => '"[[User:$1|$1]]" 사용ìžë¥¼ "[[User:$2|$2]]" 사용ìžë¡œ 바꾸면서 문서를 ìžë™ìœ¼ë¡œ ì´ë™í•¨',
+ 'log-name-renameuser' => 'ì´ë¦„ 바꾸기 기ë¡',
+ 'log-description-renameuser' => 'ì‚¬ìš©ìž ì´ë¦„ 바꾸기 기ë¡ìž…니다.',
+ 'logentry-renameuser-renameuser' => '$1 사용ìžê°€ $4 사용ìž({{PLURAL:$6|편집 $6회}})ì˜ ì´ë¦„ì„ $5(으)ë¡œ {{GENDER:$2|바꾸었습니다}}',
+ 'logentry-renameuser-renameuser-legacier' => '$1 사용ìžê°€ $4 사용ìžì˜ ì´ë¦„ì„ $5(으)ë¡œ 바꾸었습니다',
+ 'renameuser-move-log' => '"[[User:$1|$1]]" 사용ìžë¥¼ "[[User:$2|$2]]" 사용ìžë¡œ 바꾸면서 문서를 ìžë™ìœ¼ë¡œ 옮겼습니다',
'action-renameuser' => 'ì‚¬ìš©ìž ì´ë¦„ì„ ë°”ê¿€',
'right-renameuser' => 'ì‚¬ìš©ìž ì´ë¦„ 바꾸기',
'renameuser-renamed-notice' => 'ì´ ì‚¬ìš©ìžì˜ ì´ë¦„ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤.
@@ -2413,10 +2422,8 @@ Bes esu joot un versöök et noch ens.',
'renameuser-page-exists' => 'De Sigg $1 es ald doh, un mer könne se nit automatesch övverschrieve',
'renameuser-page-moved' => 'De Sigg wood vun „$1“ op „$2“ ömjenannt.',
'renameuser-page-unmoved' => 'Di Sigg „$1“ kunnt nit op „$2“ ömjenannt wääde.',
- 'renameuserlogpage' => 'Logboch vum Metmaacher-Ömdäufe',
- 'renameuserlogpagetext' => 'Dat es et Logboch vun de ömjedäufte Metmaachere',
- 'renameuserlogentry' => 'hät „$1“ op dä Metmaacher „$2“ ömjedäuf',
- 'renameuser-log' => '{{PLURAL:$1|ein Beärbeidung|$1 Beärbeidung|kein Beärbeidung}}. Jrund: $2',
+ 'log-name-renameuser' => 'Logboch vum Metmaacher-Ömdäufe',
+ 'log-description-renameuser' => 'Dat es et Logboch vun de ömjedäufte Metmaachere',
'renameuser-move-log' => 'Di Sigg weet automatesch ömjenannt weil mer dä Metmaacher „[[User:$1|$1]]“ op „[[User:$2|$2]]“ öm am däufe sin.',
'action-renameuser' => 'Metmaacher ömdäufe',
'right-renameuser' => 'Metmaacher ömdäufe',
@@ -2447,9 +2454,7 @@ $messages['ku-latn'] = array(
'renameuser-page-exists' => 'Rûpelê $1 berê heye û nikane otomatîk were guherandin.',
'renameuser-page-moved' => 'Rûpela $1 çû cihê $2.',
'renameuser-page-unmoved' => 'Rûpela $1 nikanî çûba ciha $2.',
- 'renameuserlogpage' => 'Guhertina navê bikarhêner',
- 'renameuserlogentry' => 'navê $1 kir "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 beşdarî|$1 beşdarî}}. Sedem: $2',
+ 'log-name-renameuser' => 'Guhertina navê bikarhêner',
'renameuser-move-log' => 'Otomatîk hate guherandin, ji ber ku "[[User:$1|$1]]" navê xwe guherand û niha bû "[[User:$2|$2]]"',
'right-renameuser' => 'Navê bikarhêneran biguherîne:',
);
@@ -2492,10 +2497,7 @@ $messages['la'] = array(
'renameuser-page-exists' => 'Pagina $1 iam existit et non potest automatice deleri.',
'renameuser-page-moved' => 'Pagina $1 mota est ad $2.',
'renameuser-page-unmoved' => 'Pagina $1 ad $2 moveri non potuit.',
- 'renameuserlogpage' => 'Index renominationum usorum',
- 'renameuserlogpagetext' => 'Hic est index renominationum usorum',
- 'renameuserlogentry' => 'renominavit $1 in "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 recensio|$1 recensiones}}. Causa: $2',
+ 'log-name-renameuser' => 'Index renominationum usorum',
'renameuser-move-log' => 'movit paginam automatice in renominando usorem "[[User:$1|$1]]" in "[[User:$2|$2]]"',
'right-renameuser' => 'Usores renominare',
'renameuser-renamed-notice' => 'Hic usor renominatus est.
@@ -2513,7 +2515,7 @@ $messages['lb'] = array(
'renameuser-desc' => "Benotzernumm änneren (Dir braucht dofir ''renameuser''-Rechter)",
'renameuserold' => 'Aktuelle Benotzernumm:',
'renameusernew' => 'Neie Benotzernumm:',
- 'renameuserreason' => "Grond fir d'Ëmbenennung:", # Fuzzy
+ 'renameuserreason' => 'Grond:',
'renameusermove' => 'Benotzer- an Diskussiounssäiten (an déi jeweileg Ënnersäiten) op den neie Benotzernumm réckelen',
'renameusersuppress' => 'Maacht keng Viruleedungen op den neien Numm',
'renameuserreserve' => 'Den ale Benotzernumm fir de weitere Gebrauch spären',
@@ -2531,10 +2533,10 @@ Gitt w.e.g. zréck a versicht et nach eng Kéier.',
'renameuser-page-exists' => "D'Säit $1 gëtt et schonns a kann net automatesch iwwerschriwwe ginn.",
'renameuser-page-moved' => "D'Säit $1 gouf op $2 geréckelt.",
'renameuser-page-unmoved' => "D'Säit $1 konnt net op $2 geréckelt ginn.",
- 'renameuserlogpage' => 'Logbuch vun den Ännerunge vum Benotzernumm',
- 'renameuserlogpagetext' => 'An dësem Logbuch ginn Ännerunge vu Benotzernimm festgehal.',
- 'renameuserlogentry' => 'huet de Benotzer $1 op "$2" ëmbenannt',
- 'renameuser-log' => '{{PLURAL:$1|1 Ännerung|$1 Ännerungen}}. Grond: $2',
+ 'log-name-renameuser' => 'Logbuch vun den Ännerunge vum Benotzernumm',
+ 'log-description-renameuser' => "Dëst ass d'Logbuch vun den Ännerunge vun de Benotzernimm.",
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|huet}} de Benotzer $4 ({{PLURAL:$6|$6 Ännerung|$6 Ännerungen}}) op $5 ëmbenannt',
+ 'logentry-renameuser-renameuser-legacier' => '£1 huet de Benotzer $4 op $5 ëmbenannt',
'renameuser-move-log' => 'Duerch d\'Réckele vum Benotzer "[[User:$1|$1]]" op "[[User:$2|$2]]" goufen déi folgend Säiten automatesch matgeréckelt:',
'action-renameuser' => 'Benotzer ëmbenennen',
'right-renameuser' => 'Benotzer ëmbenennen',
@@ -2572,10 +2574,7 @@ $messages['li'] = array(
'renameuser-page-exists' => 'De pazjena $1 besteit al en kan neet automatisch euversjreve waere,',
'renameuser-page-moved' => 'De pagina $1 is hernömp nao $2.',
'renameuser-page-unmoved' => 'De pagina $1 kon neet hernömp waere nao $2.',
- 'renameuserlogpage' => 'Logbook gebroekersnaamwieziginge',
- 'renameuserlogpagetext' => 'Hiejónger staon gebroekersname die verangerdj zeen',
- 'renameuserlogentry' => 'haet $1 hernömp nao "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 bewerking|$1 bewerkinge}}. Ree: $2',
+ 'log-name-renameuser' => 'Logbook gebroekersnaamwieziginge',
'renameuser-move-log' => 'Automatisch hernömp bie \'t wiezige van gebroeker "[[User:$1|$1]]" nao "[[User:$2|$2]]"',
'action-renameuser' => 'gebroekers van naam te verangere',
'right-renameuser' => 'Gebroekers hernaome',
@@ -2612,10 +2611,7 @@ Prašome eiti atgal ir bandyti iš naujo.',
'renameuser-page-exists' => 'Puslapis $1 jau egzistuoja ir negali būti automatiškai perrašytas.',
'renameuser-page-moved' => 'Puslapis $1 buvo perkeltas į $2.',
'renameuser-page-unmoved' => 'Puslapis $1 negali būti perkeltas į $2.',
- 'renameuserlogpage' => 'Naudotojų pervadinimo sąrašas',
- 'renameuserlogpagetext' => 'Tai yra naudotojų vardų pakeitimų sąrašas',
- 'renameuserlogentry' => 'pervadintas $1 į „$2“',
- 'renameuser-log' => '{{PLURAL:$1|1 redagavimas|$1 redagavimų(ai)}}. Priežastis: $2',
+ 'log-name-renameuser' => 'Naudotojų pervadinimo sąrašas',
'renameuser-move-log' => 'Puslapis automatiškai perkeltas, kai buvo pervadinamas naudotojas "[[User:$1|$1]]" į "[[User:$2|$2]]"',
'action-renameuser' => 'pervadinti naudotojus',
'right-renameuser' => 'Pervadinti naudotojus',
@@ -2638,9 +2634,8 @@ $messages['lv'] = array(
'renameusersubmit' => 'Iesniegt',
'renameusererrorexists' => 'LietotÄjs "<nowiki>$1</nowiki>" jau ir.',
'renameusersuccess' => 'LietotÄjs "<nowiki>$1</nowiki>" pÄrdÄ“vÄ“ts par "<nowiki>$2</nowiki>".',
- 'renameuserlogpage' => 'LietotÄju pÄrdÄ“vÄ“Å¡anas reÄ£istrs',
- 'renameuserlogpagetext' => 'LietotÄjvÄrdu maiņas reÄ£istrs',
- 'renameuserlogentry' => 'pÄrsauca $1 par "$2"',
+ 'log-name-renameuser' => 'LietotÄju pÄrdÄ“vÄ“Å¡anas reÄ£istrs',
+ 'log-description-renameuser' => 'LietotÄjvÄrdu maiņas reÄ£istrs',
'action-renameuser' => 'pÄrsaukt lietotÄjus',
'right-renameuser' => 'PÄrsaukt lietotÄjus',
);
@@ -2659,10 +2654,20 @@ $messages['mg'] = array(
'renameuserwarnings' => 'Fampitandremana :',
'renameuserconfirm' => 'Eny, soloy anarana ilay mpikambana',
'renameusersubmit' => 'Alefa',
- 'renameuserlogpage' => 'Laogim-panovana anaram-pikambana',
+ 'log-name-renameuser' => 'Laogim-panovana anaram-pikambana',
'right-renameuser' => "Manova ny anaran'ny mpikambana",
);
+/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ */
+$messages['min'] = array(
+ 'log-name-renameuser' => 'Log panggantian namo pangguno',
+ 'log-description-renameuser' => 'Di bawah ko log panggantian namo pangguno',
+ 'renameuser-move-log' => 'Sacaro otomatih mamindahan laman wakatu mangganti namo pangguno "[[User:$1|$1]]" manjadi "[[User:$2|$2]]"',
+ 'right-renameuser' => 'Mangganti namo pangguno',
+);
+
/** Macedonian (македонÑки)
* @author Bjankuloski06
* @author Brest
@@ -2693,10 +2698,10 @@ $messages['mk'] = array(
'renameuser-page-exists' => 'Страницата $1 веќе поÑтои и не може автоматÑки да Ñе замени Ñо друга Ñодржина.',
'renameuser-page-moved' => 'Страницата $1 е премеÑтена на $2.',
'renameuser-page-unmoved' => 'Страницата $1 неможеше да Ñе премеÑти на $2.',
- 'renameuserlogpage' => 'Дневник на преименувања на кориÑници',
- 'renameuserlogpagetext' => 'Ово е дневник на преименувања на кориÑници',
- 'renameuserlogentry' => 'го преименуваше $1 во „$2“',
- 'renameuser-log' => '{{PLURAL:$1|1 уредување|$1 уредувања}}. Образложение: $2',
+ 'log-name-renameuser' => 'Дневник на преименувања на кориÑници',
+ 'log-description-renameuser' => 'Ово е дневник на преименувања на кориÑници',
+ 'logentry-renameuser-renameuser' => '$1 го {{GENDER:$2|преименуваше}} кориÑникот $4 ({{PLURAL:$6|$6 уредување|$6 уредувања}}) во $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 го преименуваше кориÑникот $4 во $5',
'renameuser-move-log' => 'ÐвтоматÑки премеÑтена Ñтраница при преименување на кориÑникот „[[User:$1|$1]]“ во „[[User:$2|$2]]“',
'action-renameuser' => 'преименување на кориÑници',
'right-renameuser' => 'Преименување кориÑници',
@@ -2732,10 +2737,10 @@ $messages['ml'] = array(
'renameuser-page-exists' => '$1 à´Žà´¨àµà´¨ താൾ നിലവിലàµà´³àµà´³à´¤à´¿à´¨à´¾àµ½ അതിനെ യാനàµà´¤àµà´°à´¿à´•à´®à´¾à´¯à´¿ മാറàµà´±à´¾àµ» കഴിയിലàµà´².',
'renameuser-page-moved' => '$1 à´Žà´¨àµà´¨ താൾ $2 à´Žà´¨àµà´¨à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'renameuser-page-unmoved' => '$1 à´Žà´¨àµà´¨ താൾ $2 à´Žà´¨àµà´¨à´¾à´•àµà´•à´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´².',
- 'renameuserlogpage' => 'ഉപയോകàµà´¤àµƒ à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£ രേഖ',
- 'renameuserlogpagetext' => 'à´ˆ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°àµ‡à´– ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚ നടതàµà´¤à´¿à´¯à´¤à´¿à´¨àµà´±àµ‡à´¤à´¾à´£àµâ€Œ.',
- 'renameuserlogentry' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† "$2" à´Žà´¨àµà´¨àµ à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
- 'renameuser-log' => '{{PLURAL:$1|ഒരൠതിരàµà´¤àµà´¤àµ½|$1 തിരàµà´¤àµà´¤à´²àµà´•àµ¾}}. കാരണം: $2',
+ 'log-name-renameuser' => 'ഉപയോകàµà´¤àµƒ à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£ രേഖ',
+ 'log-description-renameuser' => 'à´ˆ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°àµ‡à´– ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚ നടതàµà´¤à´¿à´¯à´¤à´¿à´¨àµà´±àµ‡à´¤à´¾à´£àµâ€Œ.',
+ 'logentry-renameuser-renameuser' => '$4 ({{PLURAL:$6|$6 തിരàµà´¤àµà´¤àµ|$6 തിരàµà´¤àµà´¤àµà´•àµ¾}}) à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† $1, $5 à´Žà´¨àµà´¨àµ {{GENDER:$2|à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+ 'logentry-renameuser-renameuser-legacier' => '$4 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† $5 à´Žà´¨àµà´¨àµ $1 à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚ ചെയàµà´¤àµ',
'renameuser-move-log' => '"[[User:$1|$1]]" à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµ† "[[User:$2|$2]]" à´Žà´¨àµà´¨àµ à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚ ചെയàµà´¤à´ªàµà´ªàµ‹àµ¾ താൾ യാനàµà´¤àµà´°à´¿à´•à´®à´¾à´¯à´¿ മാറàµà´±à´¿.',
'action-renameuser' => 'ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚',
'right-renameuser' => 'ഉപയോകàµà´¤àµƒ à´ªàµà´¨àµ¼à´¨à´¾à´®à´•à´°à´£à´‚',
@@ -2779,10 +2784,7 @@ $messages['mr'] = array(
'renameuser-page-exists' => '$1 हे पान अगोदरच असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ आहे व आपोआप पà¥à¤¨à¤°à¥à¤²à¥‡à¤–न करता येत नाही.',
'renameuser-page-moved' => '$1 हे पान $2 मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत केले.',
'renameuser-page-unmoved' => '$1 हे पान $2 मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत करू शकत नाही.',
- 'renameuserlogpage' => 'सदसà¥à¤¯à¤¨à¤¾à¤® बदल यादी',
- 'renameuserlogpagetext' => 'ही सदसà¥à¤¯à¤¨à¤¾à¤®à¤¾à¤‚मधà¥à¤¯à¥‡ केलेलà¥à¤¯à¤¾ बदलांची यादी आहे.',
- 'renameuserlogentry' => '$1 ला "$2" केले',
- 'renameuser-log' => '{{PLURAL:$1|१ संपादन|$1 संपादने}}. कारण: $2',
+ 'log-name-renameuser' => 'सदसà¥à¤¯à¤¨à¤¾à¤® बदल यादी',
'renameuser-move-log' => '"[[User:$1|$1]]" ला "[[User:$2|$2]]" बदलताना आपोआप सदसà¥à¤¯ पान सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत केलेले आहे.',
'right-renameuser' => 'सदसà¥à¤¯à¤¾à¤‚ची नावे बदला',
'renameuser-renamed-notice' => 'या सदसà¥à¤¯à¤¾à¤¸ पà¥à¤¨à¤°à¥à¤¨à¤¾à¤®à¤¿à¤¤ करणà¥à¤¯à¤¾à¤¤ आले आहे.
@@ -2819,10 +2821,10 @@ Sila undur dan cuba lagi.',
'renameuser-page-exists' => 'Laman $1 telah pun wujud dan tidak boleh ditulis ganti secara automatik.',
'renameuser-page-moved' => 'Laman $1 telah dipindahkan ke $2.',
'renameuser-page-unmoved' => 'Laman $1 tidak dapat dipindahkan ke $2.',
- 'renameuserlogpage' => 'Log penukaran nama pengguna',
- 'renameuserlogpagetext' => 'Ini ialah log penukaran nama pengguna.',
- 'renameuserlogentry' => 'telah menukar nama $1 menjadi "$2"',
- 'renameuser-log' => '$1 suntingan. Sebab: $2',
+ 'log-name-renameuser' => 'Log penukaran nama pengguna',
+ 'log-description-renameuser' => 'Ini ialah log penukaran nama pengguna.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|menukar nama}} pengguna $4 ($6 suntingan) kepada $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 menamakan pengguna $4 kepada $5',
'renameuser-move-log' => 'Memindahkan laman secara automatik ketika menukar nama "[[User:$1|$1]]" menjadi "[[User:$2|$2]]"',
'action-renameuser' => 'menukar nama pengguna',
'right-renameuser' => 'Menukar nama pengguna',
@@ -2858,10 +2860,7 @@ $messages['mt'] = array(
'renameuser-page-exists' => 'Il-paġna $1 diġà teżisti u ma tistax tiġi miktuba fuqha awtomatikament.',
'renameuser-page-moved' => 'Il-paġna $1 tmexxiet lejn $2.',
'renameuser-page-unmoved' => 'Il-paġna $1 ma setgħetx titmexxa lejn $2.',
- 'renameuserlogpage' => 'Reġistru tal-utenti msemmijin mill-ġdid',
- 'renameuserlogpagetext' => "Dan huwa r-reġistru ta' tibdil tal-ismijiet tal-utenti.",
- 'renameuserlogentry' => 'biddel l-isem ta\' $1 għal "$2"',
- 'renameuser-log' => '{{PLURAL:$1|modifika waħda|$1 modifiki}}. Raġuni: $2',
+ 'log-name-renameuser' => 'Reġistru tal-utenti msemmijin mill-ġdid',
'renameuser-move-log' => 'Paġna mmexxiha matul il-bidla tal-utent "[[User:$1|$1]]" għal "[[User:$2|$2]]"',
'action-renameuser' => 'tbiddel l-ismijiet tal-utenti',
'right-renameuser' => 'Ibiddel l-isem tal-utenti',
@@ -2891,7 +2890,6 @@ $messages['nah'] = array(
$messages['nan'] = array(
'renameuser' => 'Kái iÅng-chiá ê miâ',
'renameuser-page-moved' => '$1 í-keng sóa khì tī $2.',
- 'renameuserlogpagetext' => 'Chit-ê log liaÌt-chhut kái-piàn iÅng-chiá miâ-jÄ« ê tÅng-chok.',
);
/** Norwegian Bokmål (norsk (bokmål)‎)
@@ -2924,10 +2922,7 @@ Gå tilbake og prøv igjen.',
'renameuser-page-exists' => 'Siden $1 finnes allerede, og kunne ikke erstattes automatisk.',
'renameuser-page-moved' => 'Siden $1 har blitt flyttet til $2.',
'renameuser-page-unmoved' => 'Siden $1 kunne ikke flyttes til $2.',
- 'renameuserlogpage' => 'Omdøpingslogg',
- 'renameuserlogpagetext' => 'Dette er en logg over endringer i brukernavn.',
- 'renameuserlogentry' => 'døpte om $1 til «$2»',
- 'renameuser-log' => '{{PLURAL:$1|1 bidrag|$1 bidrag}}. Ã…rsak: $2',
+ 'log-name-renameuser' => 'Omdøpingslogg',
'renameuser-move-log' => 'Flyttet side automatisk under omdøping av brukeren «[[User:$1|$1]]» til «[[User:$2|$2]]»',
'action-renameuser' => 'endre navn på brukere',
'right-renameuser' => 'Endre navn på brukere',
@@ -2958,15 +2953,12 @@ $messages['nds'] = array(
'renameuser-page-exists' => 'Siet $1 gifft dat al un kann nichautomaatsch överschreven warrn.',
'renameuser-page-moved' => 'Siet $1 schaven na $2.',
'renameuser-page-unmoved' => 'Siet $1 kunn nich na $2 schaven warrn.',
- 'renameuserlogpage' => 'Ännerte-Brukernaams-Logbook',
- 'renameuserlogpagetext' => 'Dit is dat Logbook för ännerte Brukernaams',
- 'renameuserlogentry' => 'hett „$1“ ne’en Naam „$2“ geven',
- 'renameuser-log' => '{{PLURAL:$1|1 Ännern|$1 Ännern}}. Grund: $2',
+ 'log-name-renameuser' => 'Ännerte-Brukernaams-Logbook',
'renameuser-move-log' => "Siet bi dat Ännern vun’n Brukernaam ''[[User:$1|$1]]'' na ''[[User:$2|$2]]'' automaatsch schaven",
'right-renameuser' => 'Brukers ne’en Naam geven',
);
-/** Nedersaksisch (Nedersaksisch)
+/** Nedersaksies (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
@@ -2988,9 +2980,8 @@ $messages['nds-nl'] = array(
'renameuser-page-exists' => 'De zied $1 besteet al en kan niet automaties overschreven wörden.',
'renameuser-page-moved' => 'De zied $1 is herneumd naor $2.',
'renameuser-page-unmoved' => 'De zied $1 kon niet herneumd wörden naor $2.',
- 'renameuserlogpage' => 'Logboek gebrukersnaamwiezigingen',
- 'renameuserlogpagetext' => 'Dit is n logboek mit wiezigingen van gebrukersnamen',
- 'renameuserlogentry' => 'hef $1 herneumd naor "$2"',
+ 'log-name-renameuser' => 'Logboek gebrukersnaamwiezigingen',
+ 'log-description-renameuser' => 'Dit is n logboek mit wiezigingen van gebrukersnamen',
'renameuser-move-log' => 'Zied is automaties verplaotst bie t herneumen van de gebruker "[[User:$1|$1]]" naor "[[User:$2|$2]]"',
'right-renameuser' => 'Gebrukers herneumen',
'renameuser-renamed-notice' => 'Disse gebrukersnaam is herneumd.
@@ -3038,10 +3029,10 @@ Ga terug en probeer het opnieuw.',
'renameuser-page-exists' => 'De pagina $1 bestaat al en kan niet automatisch overschreven worden.',
'renameuser-page-moved' => 'De pagina $1 is hernoemd naar $2.',
'renameuser-page-unmoved' => 'De pagina $1 kon niet hernoemd worden naar $2.',
- 'renameuserlogpage' => 'Logboek gebruikersnaamwijzigingen',
- 'renameuserlogpagetext' => 'Hieronder staan gebruikersnamen die gewijzigd zijn.',
- 'renameuserlogentry' => 'heeft $1 hernoemd naar "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 bewerking|$1 bewerkingen}}. Reden: $2',
+ 'log-name-renameuser' => 'Logboek gebruikersnaamwijzigingen',
+ 'log-description-renameuser' => 'Hieronder staan gebruikersnamen die gewijzigd zijn.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|heeft}} gebruiker $4 ($6 {{PLURAL:$6|bewerking|bewerkingen}}) hernoemd naar $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 heeft de gebruiker $4 hernoemd naar $5',
'renameuser-move-log' => 'Automatisch hernoemd bij het wijzigen van gebruiker "[[User:$1|$1]]" naar "[[User:$2|$2]]"',
'action-renameuser' => 'gebruikers te hernoemen',
'right-renameuser' => 'Gebruikers hernoemen',
@@ -3086,10 +3077,7 @@ Gå attende og prøv på nytt.',
'renameuser-page-exists' => 'Sida $1 finst allereie og kan ikkje automatisk verta skrive over.',
'renameuser-page-moved' => 'Sida $1 har vorte flytta til $2.',
'renameuser-page-unmoved' => 'Sida $1 kunne ikkje verta flytta til $2.',
- 'renameuserlogpage' => 'Logg over brukarnamnendringar',
- 'renameuserlogpagetext' => 'Logg over endringar av brukarnamn',
- 'renameuserlogentry' => 'endra $1 til «$2»',
- 'renameuser-log' => '{{PLURAL:$1|eitt bidrag|$1 bidrag}}. Ã…rsak: $2',
+ 'log-name-renameuser' => 'Logg over brukarnamnendringar',
'renameuser-move-log' => 'Flytta sida automatisk under omdøyping av brukaren «[[User:$1|$1]]» til «[[User:$2|$2]]»',
'right-renameuser' => 'Døypa om brukarar',
'renameuser-renamed-notice' => 'Denne brukaren har fått nytt namn.
@@ -3118,7 +3106,7 @@ $messages['oc'] = array(
'renameuser-desc' => "Torna nomenar un utilizaire (necessita los dreches de ''renameuser'')",
'renameuserold' => "Nom actual de l'utilizaire :",
'renameusernew' => "Nom novèl de l'utilizaire :",
- 'renameuserreason' => 'Motiu del cambiament de nom :', # Fuzzy
+ 'renameuserreason' => 'Rason(s) del cambiament de nom :',
'renameusermove' => 'Desplaçar totas las paginas de l’utilizaire cap al nom novèl',
'renameuserreserve' => 'Reservar lo nom ancian per un usatge futur',
'renameuserwarnings' => 'Avertiments :',
@@ -3133,10 +3121,8 @@ $messages['oc'] = array(
'renameuser-page-exists' => 'La pagina $1 existís ja e pòt pas èsser remplaçada automaticament.',
'renameuser-page-moved' => 'La pagina $1 es estada desplaçada cap a $2.',
'renameuser-page-unmoved' => 'La pagina $1 pòt pas èsser renomenada en $2.',
- 'renameuserlogpage' => "Istoric dels cambiaments de nom d'utilizaire",
- 'renameuserlogpagetext' => "Aquò es l'istoric dels cambiaments de nom dels utilizaires",
- 'renameuserlogentry' => 'a renomenat $1 en "$2"',
- 'renameuser-log' => '$1 {{PLURAL:$1|edicion|edicions}}. Motiu : $2',
+ 'log-name-renameuser' => "Istoric dels cambiaments de nom d'utilizaire",
+ 'log-description-renameuser' => "Aquò es l'istoric dels cambiaments de nom dels utilizaires",
'renameuser-move-log' => 'Pagina desplaçada automaticament al moment del cambiament de nom de l’utilizaire "[[User:$1|$1]]" en "[[User:$2|$2]]"',
'right-renameuser' => "Tornar nomenar d'utilizaires",
'renameuser-renamed-notice' => 'Aqueste utilizaire es estat renomenat.
@@ -3144,6 +3130,7 @@ Lo jornal dels cambiaments de noms es disponible çaijós per informacion.',
);
/** Oriya (ଓଡ଼ିଆ)
+ * @author Jnanaranjan Sahu
* @author Odisha1
* @author Psubhashish
*/
@@ -3154,13 +3141,14 @@ $messages['or'] = array(
'renameuser-desc' => "ଜଣେ ସଭà­à­Ÿà¬™à­à¬•à¬° ନାମ ବଦଳାଇବା ପାଇଠà¬à¬• [[Special:Renameuser|ବିଶେଷ ପୃଷà­à¬ à¬¾]] ଯୋଡ଼ିଥାଠ।(''ନୂଆ ନାମକରଣ'' ଅଧିକାର ଲୋଡ଼ା)",
'renameuserold' => 'à¬à¬¬à­‡à¬•à¬¾à¬° ଇଉଜର ନାମ:',
'renameusernew' => 'ନୂଆ ଇଉଜର ନାମ:',
- 'renameuserreason' => 'ନାମ ବଦଳାଇବାର କାରଣ:', # Fuzzy
+ 'renameuserreason' => 'କାରଣ:',
'renameusermove' => 'ସଭà­à­Ÿ, ତାହାଙà­à¬•à¬° ଆଲୋଚନା ପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨à¬™à­à¬•à­ (ତଥା ସାନପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨à¬™à­à¬•à­)ନୂଆ ନାମକୠଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à­‡',
'renameusersuppress' => 'ନୂଆ ନାମକୠପà­à¬¨à¬ªà­à¬°à­‡à¬°à¬£ କରନà­à¬¤à­ ନାହିà¬',
'renameuserreserve' => 'ଭବିଷà­à­Ÿà¬¤ ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬°à­‡ ପà­à¬°à­à¬£à¬¾ ଇଉଜର ନାମକୠଅଟକାଇ ଦିଅନà­à¬¤à­',
'renameuserwarnings' => 'ଚେତାବନୀ:',
'renameuserconfirm' => 'ହà¬, ସଭà­à­Ÿà¬™à­à¬• ନାମ ବଦଳାଇ ଦେବେ',
'renameusersubmit' => 'ଦାଖଲକରିବା',
+ 'renameuser-submit-blocklog' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ପାଇଠକିଳାଯାଇଥିବା ତାଲିକା ଦେଖିବେ',
'renameusererrordoesnotexist' => '"<nowiki>$1</nowiki>" ନାମକ ସଭà­à­Ÿà¬œà¬£à¬• à¬à¬ à¬¾à¬°à­‡ ନାହାନà­à¬¤à¬¿ ।',
'renameusererrorexists' => '"<nowiki>$1</nowiki>" ନାମକ ସଭà­à­Ÿà¬œà¬£à¬• ଆଗରୠଅଛନà­à¬¤à¬¿ ।',
'renameusererrorinvalid' => '"<nowiki>$1</nowiki>" ଇଉଜର ନାମଟି ଅଚଳ ଅଟେ ।',
@@ -3171,10 +3159,10 @@ $messages['or'] = array(
'renameuser-page-exists' => '$1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଆଗରୠଅଛି ଓ ଆଉଥରେ ଲେଖାଯାଇପାରିବ ନାହିଠ।',
'renameuser-page-moved' => '$1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ $2କୠଘà­à¬žà­à¬šà¬¾à¬‡ ଦିଆଗଲା ।',
'renameuser-page-unmoved' => '$1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ $2କୠଘà­à¬žà­à¬šà¬¾à¬¯à¬¾à¬‡ ପାରିବ ନାହିଠ।',
- 'renameuserlogpage' => 'ସଭà­à­Ÿ ନାମବଦଳ ଇତିହାସ',
- 'renameuserlogpagetext' => 'ସଭà­à­Ÿà¬™à­à¬• ନାମ ବଦଳର à¬à¬¹à¬¾ à¬à¬• ଇତିହାସ ।',
- 'renameuserlogentry' => '$1 ରୠ"$2" କୠନାମ ବଦଳାଗଲା',
- 'renameuser-log' => '{{PLURAL:$1|ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾à¬Ÿà¬¿à¬|$1 ଗୋଟି ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾}} । କାରଣ: $2',
+ 'log-name-renameuser' => 'ସଭà­à­Ÿ ନାମବଦଳ ଇତିହାସ',
+ 'log-description-renameuser' => 'ସଭà­à­Ÿà¬™à­à¬• ନାମ ବଦଳର à¬à¬¹à¬¾ à¬à¬• ଇତିହାସ ।',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|renamed}} user $4 ({{PLURAL:$6|$6 edit|$6 edits}}) to $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 $4ଙà­à¬• ନାମ $5କୠବଦଳାଇଲେ',
'renameuser-move-log' => 'ସଭà­à­Ÿ "[[User:$1|$1]]"ରୠ"[[User:$2|$2]]"କୠନାମ ବଦଳ କଲାବେଳେ ବେଳେ ଛାà¬à¬ ଛାà¬à¬ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଘà­à¬žà­à¬šà¬¾à¬‡ ଦିଆଗଲା',
'action-renameuser' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ନାମବଦଳା',
'right-renameuser' => 'ସଭà­à­Ÿà¬®à¬¾à¬¨à¬™à­à¬• ନାମଟି ବଦଳାଇବେ',
@@ -3191,7 +3179,7 @@ $messages['os'] = array(
'renameusernew' => 'Ðог ном:',
'renameuserreason' => 'Ðом ивыны аххоÑ:', # Fuzzy
'renameusersubmit' => 'Ðфтæ уæд',
- 'renameuserlogpage' => 'Ðрхайджыты нæмттæ ивыны лог',
+ 'log-name-renameuser' => 'Ðрхайджыты нæмттæ ивыны лог',
);
/** Picard (Picard)
@@ -3200,16 +3188,14 @@ $messages['os'] = array(
$messages['pcd'] = array(
'renameuser' => "Canger ch'nom d'uzeu",
'renameusernew' => 'Nouvieu nom dechl uzeu',
- 'renameuserreason' => "Motif dech canjemint d'nom", # Fuzzy
+ 'renameuserreason' => "Motif dech canjemint d'nom",
'renameuserwarnings' => 'Afute ! :',
'renameuserconfirm' => 'Oui, érlonmer echl uzeu',
'renameusererrorinvalid' => 'Ech nom "<nowiki>$1</nowiki>" est non-val.',
'renameusersuccess' => 'Echl uzeu "<nowiki>$1</nowiki>" o té érlonmé "<nowiki>$2</nowiki>".',
'renameuser-page-moved' => "L'pache $1 o té déplachée dsus $2.",
'renameuser-page-unmoved' => "L'pache $1 ale n'put poin éte déplachée su $2.",
- 'renameuserlogpage' => "Jornal d'chés canjemints éd chés noms d'uzeus",
- 'renameuserlogpagetext' => "Ch'est un jornal éd chés canjemints d'chés noms d'uzeus.",
- 'renameuserlogentry' => '$1 est érlonmé in "$2"',
+ 'log-name-renameuser' => "Jornal d'chés canjemints éd chés noms d'uzeus",
'right-renameuser' => 'Érlonmer chés uzeus',
);
@@ -3222,8 +3208,6 @@ $messages['pdc'] = array(
'renameusernew' => 'Nei Yuuser-Naame',
'renameuserreason' => 'Grund:', # Fuzzy
'renameuserwarnings' => 'Warninge:',
- 'renameuserlogentry' => 'hot „$1“ nooch „$2“ gennert',
- 'renameuser-log' => '{{PLURAL:$1|1 Ennering|$1 Enneringe}}. Grund: $2',
);
/** Pälzisch (Pälzisch)
@@ -3238,7 +3222,9 @@ $messages['pfl'] = array(
* @author Derbeth
* @author Leinad
* @author Maikking
+ * @author Matma Rex
* @author Nux
+ * @author Odie2
* @author Remedios44
* @author Sovq
* @author Sp5uhe
@@ -3252,7 +3238,7 @@ $messages['pl'] = array(
'renameuser-desc' => "Zmiana nazwy użytkownika (wymaga posiadania uprawnień ''renameuser'')",
'renameuserold' => 'Obecna nazwa użytkownika:',
'renameusernew' => 'Nowa nazwa użytkownika:',
- 'renameuserreason' => 'Przyczyna zmiany nazwy:', # Fuzzy
+ 'renameuserreason' => 'Powód:',
'renameusermove' => 'Przeniesienie strony osobistej i strony dyskusji użytkownika (oraz ich podstron) pod nową nazwę użytkownika',
'renameusersuppress' => 'Nie twórz przekierowania do nowej nazwy',
'renameuserreserve' => 'Zablokuj starą nazwę użytkownika przed możliwością użycia jej',
@@ -3270,10 +3256,10 @@ Cofnij się i spróbuj jeszcze raz.',
'renameuser-page-exists' => 'Strona „$1†już istnieje i nie może być automatycznie nadpisana.',
'renameuser-page-moved' => 'Strona „$1†zostaÅ‚a przeniesiona pod nazwÄ™ „$2â€.',
'renameuser-page-unmoved' => 'Strona „$1†nie mogÅ‚a zostać przeniesiona pod nazwÄ™ „$2â€.',
- 'renameuserlogpage' => 'Zmiany nazw użytkowników',
- 'renameuserlogpagetext' => 'To jest rejestr zmian nazw użytkowników',
- 'renameuserlogentry' => 'zmieniÅ‚ nazwÄ™ użytkownika $1 na „$2â€',
- 'renameuser-log' => '$1 {{PLURAL:$1|edycja|edycje|edycji}}. Powód: $2',
+ 'log-name-renameuser' => 'Zmiany nazw użytkowników',
+ 'log-description-renameuser' => 'To jest rejestr zmian nazw użytkowników',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|zmienił|zmieniła}} nazwę użytkownika $4 ({{PLURAL:$6|$6 edycja|$6 edycje|$6 edycji}}) na $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 zmienił(a) nazwę użytkownika $4 na $5',
'renameuser-move-log' => 'Automatyczne przeniesienie stron użytkownika po zmianie nazwy konta z „[[User:$1|$1]]†na „[[User:$2|$2]]â€',
'action-renameuser' => 'zmiana nazw użytkowników',
'right-renameuser' => 'Zmiana nazw kont użytkowników',
@@ -3293,7 +3279,7 @@ $messages['pms'] = array(
'renameuser-desc' => "A gionta na [[Special:Renameuser|pàgina special]] për arnominé n'utent (a-i é dabzògn dël drit ''renameuser'')",
'renameuserold' => 'Stranòm corent:',
'renameusernew' => 'Stranòm neuv:',
- 'renameuserreason' => "Rason ch'as cambia stranòm:", # Fuzzy
+ 'renameuserreason' => 'Rason:',
'renameusermove' => 'Tramuda ëdcò la pàgina utent e cola dle ciaciarade (con tute soe sotapàgine) a lë stranòm neuv',
'renameusersuppress' => 'Creé nen na ridiression al nòm neuv',
'renameuserreserve' => 'Blòca lë stanòm vej da future utilisassion',
@@ -3311,10 +3297,10 @@ Për piasì torna andré e preuva torna.",
'renameuser-page-exists' => "La pàgina $1 a-i é già e as peul nen passe-ie dzora n'aotomàtich.",
'renameuser-page-moved' => "La pàgina $1 a l'ha fait San Martin a $2.",
'renameuser-page-unmoved' => "La pàgina $1 a l'é pa podusse tramudé a $2.",
- 'renameuserlogpage' => "Registr dj'arbatiagi",
- 'renameuserlogpagetext' => "Sossì a l'é un registr dle modìfiche djë stranòm dj'utent",
- 'renameuserlogentry' => 'a l\'ha arbatià $1 an "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 modìfica|$1 modìfiche}}. Rason: $2',
+ 'log-name-renameuser' => "Registr dj'arbatiagi",
+ 'log-description-renameuser' => "Sossì a l'é un registr dle modìfiche djë stranòm dj'utent",
+ 'logentry-renameuser-renameuser' => "$1 {{GENDER:$2|a l'ha arbatià}} l'utent $4 ({{PLURAL:$6|$6 modìfica|$6 modìfiche}}) an $5",
+ 'logentry-renameuser-renameuser-legacier' => "$1 a l'ha arbatià l'utent $4 an $5",
'renameuser-move-log' => 'Pàgina utent tramudà n\'aotomàtich damëntrè ch\'as arbatiava "[[User:$1|$1]]" an "[[User:$2|$2]]"',
'action-renameuser' => "arbatié j'utent",
'right-renameuser' => "Arnòmina j'utent",
@@ -3348,10 +3334,7 @@ $messages['pnb'] = array(
'renameuser-page-exists' => 'صÙÛ $1 Ù¾ÛÙ„Û’ ای Ûیگا اے تے ایدے تے اپنے آپ نئیں لکھیا جاسکدا۔',
'renameuser-page-moved' => 'صÙÛ $1 نوں $2 ول لجایا گیا اے۔',
'renameuser-page-unmoved' => 'صÙÛ $1 ØŒ $2 ول نئیں لجایا جاسکدا۔',
- 'renameuserlogpage' => 'ورتن Ûور ناں لاگ',
- 'renameuserlogpagetext' => 'ورتن ناواں چ تبدیلیاں دی اے لاگ اے۔',
- 'renameuserlogentry' => '$1 بدل کے "$2" رکھیا گیا۔',
- 'renameuser-log' => '{{PLURAL:$1|1 تبدیلی|1$ تبدیلیاں}}. وجÛ: 2$', # Fuzzy
+ 'log-name-renameuser' => 'ورتن Ûور ناں لاگ',
'renameuser-move-log' => 'اپنے آپ صÙÛ’ ٹرے "[[User:$1|$1]]" دا ناں "[[User:$2|$2]]" پلٹدیاں Ûویاں',
'right-renameuser' => 'ورتن والے دا Ûور ناں',
'renameuser-renamed-notice' => 'ایس ورتن والے دا ناں بدلیا گیا اے۔
@@ -3367,7 +3350,7 @@ $messages['ps'] = array(
'renameuser-linkoncontribs-text' => 'د Ø¯Û Ú©Ø§Ø±Ù† نوم بدلول',
'renameuserold' => 'اوسنی کارن-نوم:',
'renameusernew' => 'نوی کارن-نوم:',
- 'renameuserreason' => 'د نوم د بدلون سبب:', # Fuzzy
+ 'renameuserreason' => 'سبب:',
'renameuserwarnings' => 'ګواښنÛ:',
'renameuserconfirm' => 'هو، کارن-نوم بدلوم',
'renameusersubmit' => 'سپارل',
@@ -3377,9 +3360,7 @@ $messages['ps'] = array(
'renameuser-error-request' => 'د ØºÙˆÚšØªÙ†Û Ù¾Ù‡ ترلاسه کولو Ú©Û ÙŠÙˆÙ‡ ستونزه راپÛÚšÙ‡ شوه.
مهرباني ÙˆÚ©Ú“ÛŒ بÛرته پرشا ولاړ Ø´ÛŒ او يو ÚÙ„ بيا Ù¾Ø±Û Ú©ÙˆÚšÚš ÙˆÚ©Ú“ÛŒ.',
'renameuser-page-moved' => 'د $1 مخ $2 ته ولÛږدل شو.',
- 'renameuserlogpage' => 'د کارن-نوم يادښت',
- 'renameuserlogentry' => 'د $1 نوم، "$2" ته بدل شو',
- 'renameuser-log' => '{{PLURAL:$1|1 سمون|$1 سمونونه}}. سبب: $2',
+ 'log-name-renameuser' => 'د کارن-نوم يادښت',
'action-renameuser' => 'کارن-نومونه بدلول',
'right-renameuser' => 'کارن-نومونه بدلول',
);
@@ -3387,7 +3368,9 @@ $messages['ps'] = array(
/** Portuguese (português)
* @author Giro720
* @author Hamilton Abreu
+ * @author Luckas
* @author Malafaya
+ * @author Opraco
* @author Waldir
* @author 555
*/
@@ -3396,7 +3379,7 @@ $messages['pt'] = array(
'renameuser-linkoncontribs' => 'alterar nome do utilizador',
'renameuser-linkoncontribs-text' => 'Alterar o nome deste utilizador',
'renameuser-desc' => "[[Special:Renameuser|Página especial]] para alterar o nome de um utilizador (requer o privilégio ''renameuser'')",
- 'renameuserold' => 'Nome de utilizador actual:',
+ 'renameuserold' => 'Nome de usuário atual:',
'renameusernew' => 'Novo nome de utilizador:',
'renameuserreason' => 'Motivo da alteração de nome:', # Fuzzy
'renameusermove' => 'Mover as páginas e subpáginas de utilizador e as respectivas discussões para o novo nome',
@@ -3416,10 +3399,10 @@ Volte atrás e tente de novo, por favor.',
'renameuser-page-exists' => 'Já existe a página $1. Não é possível sobrescrever automaticamente.',
'renameuser-page-moved' => 'A página $1 foi movida para $2.',
'renameuser-page-unmoved' => 'Não foi possível mover a página $1 para $2.',
- 'renameuserlogpage' => 'Registo de alteração do nome de utilizadores',
- 'renameuserlogpagetext' => 'Este é um registo de alterações efectuadas a nomes de utilizadores.',
- 'renameuserlogentry' => 'mudou nome $1 para "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 edição|$1 edições}}. Motivo: $2',
+ 'log-name-renameuser' => 'Registo de alteração do nome de utilizadores',
+ 'log-description-renameuser' => 'Este é um registo de alterações efectuadas a nomes de utilizadores.',
+ 'logentry-renameuser-renameuser' => '$1 renomeou $4 (com $6 edições) para $5', # Fuzzy
+ 'logentry-renameuser-renameuser-legacier' => '$1 renomeou $4 para $5',
'renameuser-move-log' => 'Página movida automaticamente ao alterar o nome do utilizador "[[User:$1|$1]]" para "[[User:$2|$2]]"',
'action-renameuser' => 'alterar nomes de utilizadores',
'right-renameuser' => 'Alterar nomes de utilizadores',
@@ -3429,6 +3412,7 @@ Volte atrás e tente de novo, por favor.',
/** Brazilian Portuguese (português do Brasil)
* @author Giro720
+ * @author Opraco
* @author 555
*/
$messages['pt-br'] = array(
@@ -3456,10 +3440,10 @@ Retorne e tente novamente.',
'renameuser-page-exists' => 'Já existe a página $1. Não é possível sobrescrever automaticamente.',
'renameuser-page-moved' => 'A página $1 foi movida com sucesso para $2.',
'renameuser-page-unmoved' => 'Não foi possível mover a página $1 para $2.',
- 'renameuserlogpage' => 'Registro de renomeação de usuários',
- 'renameuserlogpagetext' => 'Este é um registro de alterações efetuadas em nomes de usuários.',
- 'renameuserlogentry' => 'renomeou $1 para "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 edição|$1 edições}}. Motivo: $2',
+ 'log-name-renameuser' => 'Registro de renomeação de usuários',
+ 'log-description-renameuser' => 'Este é um registro de alterações efetuadas em nomes de usuários.',
+ 'logentry-renameuser-renameuser' => '$1 renomeou $4 (com $6 ediç{{PLURAL:$6|ão|ões}}) para $5', # Fuzzy
+ 'logentry-renameuser-renameuser-legacier' => '$1 renomeou $4 para $5',
'renameuser-move-log' => 'Páginas foram movidas automaticamente ao renomear o usuário "[[User:$1|$1]]" para "[[User:$2|$2]]"',
'action-renameuser' => 'renomear usuários',
'right-renameuser' => 'Renomear usuários',
@@ -3477,7 +3461,7 @@ $messages['qu'] = array(
'renameuser-desc' => "[[Special:Renameuser|Sapaq p'anqatam]] yapan ruraqpa sutinta hukchanapaq (''renameuser'' hayñi kana tiyan)",
'renameuserold' => 'Kunan ruraqpa sutin:',
'renameusernew' => 'Musuq ruraqpa sutin:',
- 'renameuserreason' => 'Imarayku ruraqpa sutinta hukchasqa:', # Fuzzy
+ 'renameuserreason' => 'Kayrayku:',
'renameusermove' => "Ruraqpa p'anqanta, rimachinanta (urin p'anqankunatapas) musuq sutinman astay",
'renameusersuppress' => 'Musuq sutiman ama pusapunata kamariychu',
'renameuserreserve' => "Ruraqpa mawk'a sutinta qhipaq pacha suti kanamanta hark'ay",
@@ -3493,10 +3477,7 @@ $messages['qu'] = array(
'renameuser-page-exists' => '"<nowiki>$1</nowiki>" sutiyuq p\'anqaqa kachkanñam. Manam atinallachu kikinmanta huknachay.',
'renameuser-page-moved' => '"<nowiki>$1</nowiki>" ñawpa sutiyuq ruraqpa p\'anqanqa "<nowiki>$2</nowiki>" nisqa musuq p\'anqanman astasqañam.',
'renameuser-page-unmoved' => 'Manam atinichu "<nowiki>$1</nowiki>" ñawpa sutiyuq ruraqpa p\'anqanta "<nowiki>$2</nowiki>" nisqa musuq p\'anqanman astayta.',
- 'renameuserlogpage' => "Ruraqpa sutin hukchay hallch'a",
- 'renameuserlogpagetext' => "Kayqa ruraqkunap sutinkunata hukchaymanta hallch'am",
- 'renameuserlogentry' => '$1-pa sutinta "$2" sutiman hukchasqa',
- 'renameuser-log' => "{{PLURAL:$1|1 llamk'apusqa|$1 llamk'apusqakuna}}, kayrayku: $2",
+ 'log-name-renameuser' => "Ruraqpa sutin hukchay hallch'a",
'renameuser-move-log' => '"[[User:$1|$1]]" ruraqpa sutinta "[[User:$2|$2]]" sutiman hukchaspa kikinmanta ruraqpa p\'anqatapas astan',
'right-renameuser' => 'Ruraqpa sutinkunata hukchay',
'renameuser-renamed-notice' => "Kay ruraqpa sutinqa hukchasqañam.
@@ -3544,10 +3525,8 @@ Vă rugăm să vă întoarceți și să reîncercați.',
'renameuser-page-exists' => 'Pagina $1 există deja și nu poate fi suprascrisă automat.',
'renameuser-page-moved' => 'Pagina $1 a fost redenumită în $2.',
'renameuser-page-unmoved' => 'Pagina $1 nu poate fi redenumită în $2.',
- 'renameuserlogpage' => 'Jurnal redenumiri utilizatori',
- 'renameuserlogpagetext' => 'Acesta este un jurnal al modificărilor de nume de utilizator',
- 'renameuserlogentry' => 'a redenumit $1 în „$2â€',
- 'renameuser-log' => '{{PLURAL:$1|o contribuție|$1 contribuții}}. Motiv: $2',
+ 'log-name-renameuser' => 'Jurnal redenumiri utilizatori',
+ 'log-description-renameuser' => 'Acesta este un jurnal al modificărilor de nume de utilizator',
'renameuser-move-log' => 'Pagină mutată automat la redenumirea utilizatorului de la „[[User:$1|$1]]†la „[[User:$2|$2]]â€',
'action-renameuser' => 'redenumește utilizatori',
'right-renameuser' => 'Redenumește utilizatori',
@@ -3565,13 +3544,14 @@ $messages['roa-tara'] = array(
'renameuser-desc' => "Aggiunge 'na [[Special:Renameuser|pàgena speciale]] pe renomena 'n'utende (abbesogne de le deritte ''renameuser'')",
'renameuserold' => "Nome de l'utende de mò:",
'renameusernew' => "Nome de l'utende nuève:",
- 'renameuserreason' => "Mutive d'u cangiamende:", # Fuzzy
+ 'renameuserreason' => 'Mutive:',
'renameusermove' => "Spuèste utende e pàgene de le 'ngazzaminde (e le sottopàggene) a 'u nome nuève",
'renameusersuppress' => "Nò ccrejà ridirezionaminde sus a 'u nome nuève",
'renameuserreserve' => "Blocche 'u nome utende vicchije da le ause future",
'renameuserwarnings' => 'Avvise:',
'renameuserconfirm' => "Sine, cange 'u nome a l'utende",
'renameusersubmit' => 'Conferme',
+ 'renameuser-submit-blocklog' => "Fà vedè l'archivije de le blocche pe l'utende",
'renameusererrordoesnotexist' => 'L\'utende "<nowiki>$1</nowiki>" non g\'esiste.',
'renameusererrorexists' => 'L\'utende "<nowiki>$1</nowiki>" esiste ggià.',
'renameusererrorinvalid' => '\'U nome utende "<nowiki>$1</nowiki>" non è valide.',
@@ -3582,11 +3562,12 @@ Pe piacere tuèrne rrete e pruève 'n'otra vote.",
'renameuser-page-exists' => "'A pàgene $1 già esiste e non ge se pò automaticamende sovrascrivere.",
'renameuser-page-moved' => "'A pàgene $1 ha state spustate sus a $2.",
'renameuser-page-unmoved' => "'A pàgene $1 non ge pò essere spustate sus a $2.",
- 'renameuserlogpage' => 'Archivije de le renomenaminde de le utinde',
- 'renameuserlogpagetext' => "Quiste jè l'archivije de le cangiaminde de le nome de l'utinde.",
- 'renameuserlogentry' => 'renomenate da $1 a "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 cangiamende|$1 cangiaminde}}. Mutive: $2',
+ 'log-name-renameuser' => 'Archivije de le renomenaminde de le utinde',
+ 'log-description-renameuser' => "Quiste jè l'archivije de le cangiaminde de le nome de l'utinde.",
+ 'logentry-renameuser-renameuser' => "$1 ave {{GENDER:$2|renomenate}} l'utende $4 ({{PLURAL:$6|$6 cangiamende|$6 cangiaminde}}) jndr'à $5",
+ 'logentry-renameuser-renameuser-legacier' => "$1 ave renomenate l'utende $4 jndr'à $5",
'renameuser-move-log' => 'Pàgena spustate automaticamende quanne è renomenate l\'utende "[[User:$1|$1]]" jndr\'à "[[User:$2|$2]]"',
+ 'action-renameuser' => "renomene l'utinde",
'right-renameuser' => "Rennomene l'utinde",
'renameuser-renamed-notice' => "Stu utende ha state renomenate.
L'archivije de le renomenaziune 'u iacchie aqquà sotte cumme referimende.",
@@ -3594,6 +3575,7 @@ L'archivije de le renomenaziune 'u iacchie aqquà sotte cumme referimende.",
/** Russian (руÑÑкий)
* @author Ahonc
+ * @author DCamer
* @author DR
* @author EugeneZelenko
* @author Innv
@@ -3608,7 +3590,7 @@ $messages['ru'] = array(
'renameuser-desc' => 'ДобавлÑет [[Special:Renameuser|возможноÑÑ‚ÑŒ]] Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ (требуетÑÑ Ð¿Ñ€Ð°Ð²Ð¾ <code>renameuser</code>)',
'renameuserold' => 'Ð˜Ð¼Ñ Ð² наÑтоÑщий момент:',
'renameusernew' => 'Ðовое имÑ:',
- 'renameuserreason' => 'Причина переименованиÑ:', # Fuzzy
+ 'renameuserreason' => 'Причина:',
'renameusermove' => 'Переименовать также Ñтраницу учаÑтника, личное обÑуждение и их подÑтраницы',
'renameusersuppress' => 'Ðе Ñоздавать перенаправлений на новое имÑ',
'renameuserreserve' => 'Зарезервировать Ñтарое Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² будущем',
@@ -3625,10 +3607,10 @@ $messages['ru'] = array(
'renameuser-page-exists' => 'Страница $1 уже ÑущеÑтвует и не может быть перезапиÑана автоматичеÑки.',
'renameuser-page-moved' => 'Страница $1 была переименована в $2.',
'renameuser-page-unmoved' => 'Страница $1 не может быть переименована в $2.',
- 'renameuserlogpage' => 'Журнал переименований учаÑтников',
- 'renameuserlogpagetext' => 'Это журнал произведённых переименований зарегиÑтрированных учаÑтников.',
- 'renameuserlogentry' => 'переименовал «$1» в «$2»',
- 'renameuser-log' => '$1 {{PLURAL:$1|правка|правки|правок}}. Причина: $2',
+ 'log-name-renameuser' => 'Журнал переименований учаÑтников',
+ 'log-description-renameuser' => 'Это журнал произведённых переименований зарегиÑтрированных учаÑтников.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|переименовал}} Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ $4 ({{PLURAL:$6|$6 правка|$6 правки|$6 правок}}) в $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 переименовал Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ $4 в $5',
'renameuser-move-log' => 'ÐвтоматичеÑки в ÑвÑзи Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ учётной запиÑи «[[User:$1|$1]]» в «[[User:$2|$2]]»',
'action-renameuser' => 'переименование учаÑтников',
'right-renameuser' => 'переименование учаÑтников',
@@ -3663,10 +3645,7 @@ $messages['rue'] = array(
'renameuser-page-exists' => 'Сторінка $1 уж екзіÑтує Ñ– не може быти автоматічно перепиÑана.',
'renameuser-page-moved' => 'Сторінка $1 была переменована на $2.',
'renameuser-page-unmoved' => 'Сторінка $1 не може быти переменована на $2.',
- 'renameuserlogpage' => 'Лоґ переменовань хоÑнователїв',
- 'renameuserlogpagetext' => 'Тото Ñ” протокол переменовань хоÑнователїв',
- 'renameuserlogentry' => 'переменовав $1 на „$2“',
- 'renameuser-log' => '{{PLURAL:$1|1 едітованÑ|$1 едітовань|$1 едітовань}}. Причіна: $2',
+ 'log-name-renameuser' => 'Лоґ переменовань хоÑнователїв',
'renameuser-move-log' => 'Ðвтоматічне Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð¾Ð²Ð°Ð½Ñ Ñторінкы Ð¿Ð¾Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð¾Ð²Ð°Ð½Ñ Ñ…Ð¾ÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ â€ž[[User:$1|$1]]“ на „[[User:$2|$2]]“',
'action-renameuser' => 'переменовати хоÑнователїв',
'right-renameuser' => 'ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð¾Ð²Ð°Ð½Ñ Ñ…Ð¾Ñнователїв',
@@ -3703,10 +3682,7 @@ $messages['sa'] = array(
'renameuser-page-exists' => '$1 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ पà¥à¤Ÿà¤‚ पूरà¥à¤µà¤®à¥‡à¤µ विदà¥à¤¯à¤¤à¥‡ । तदà¥à¤ªà¤°à¤¿ लेखनमॠअशकà¥à¤¯à¤®à¥ ।',
'renameuser-page-moved' => '$1 पृषà¥à¤ à¤‚ $2 पà¥à¤°à¤¤à¤¿ चालितमॠअसà¥à¤¤à¤¿ ।',
'renameuser-page-unmoved' => '$1 पृषà¥à¤ à¤‚ $2 पà¥à¤°à¤¤à¤¿ चालनमॠअशकà¥à¤¯à¤®à¥ ।',
- 'renameuserlogpage' => 'परिवरà¥à¤¤à¤¿à¤¤à¤¯à¥‹à¤œà¤•à¤¨à¤¾à¤®à¥à¤¨à¤¾à¤‚ वृतà¥à¤¤à¤®à¥',
- 'renameuserlogpagetext' => 'इदं योजकनामà¥à¤¨à¤¾à¤‚ परिवरà¥à¤¤à¤¨à¤µà¥ƒà¤¤à¥à¤¤à¤®à¥ ।',
- 'renameuserlogentry' => '$1 "$2" पà¥à¤°à¤¤à¤¿ परिवरà¥à¤¤à¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿ ।',
- 'renameuser-log' => '{{PLURAL:$1|1 परिवरà¥à¤¤à¤¨à¤®à¥|$1 परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿}}. कारणमà¥: $2',
+ 'log-name-renameuser' => 'परिवरà¥à¤¤à¤¿à¤¤à¤¯à¥‹à¤œà¤•à¤¨à¤¾à¤®à¥à¤¨à¤¾à¤‚ वृतà¥à¤¤à¤®à¥',
'renameuser-move-log' => '"[[User:$1|$1]]" तः "[[User:$2|$2]]" पà¥à¤°à¤¤à¤¿ योजकनामà¥à¤¨à¤ƒ परिवरà¥à¤¤à¤¨à¤¾à¤µà¤¸à¤°à¥‡ à¤à¤µ योजकपृषà¥à¤ à¤‚ सà¥à¤µà¤¯à¤‚ चालितमॠ।',
'action-renameuser' => 'यॊजकसà¥à¤¯ पà¥à¤¨à¤°à¥à¤¨à¤¾à¤®à¤•à¤°à¤£à¤‚ कà¥à¤°à¤¿à¤¯à¤¤à¤¾à¤®à¥',
'right-renameuser' => 'यॊजकसà¥à¤¯ पà¥à¤¨à¤°à¥à¤¨à¤¾à¤®à¤•à¤°à¤£à¤‚ कà¥à¤°à¤¿à¤¯à¤¤à¤¾à¤®à¥',
@@ -3740,10 +3716,7 @@ $messages['sah'] = array(
'renameuser-page-exists' => '$1 ÑирÑй номнуо баар онон аптамаатынан хат Ñуруллар кыаҕа Ñуох.',
'renameuser-page-moved' => '$1 ÑирÑй маннык ааттаммыт $2.',
'renameuser-page-unmoved' => '$1 ÑирÑй маннык $2 ааттанар кыаҕа Ñуох.',
- 'renameuserlogpage' => 'Кыттааччылар ааттарын уларытыыларын Ñурунаала',
- 'renameuserlogpagetext' => 'Бу бÑлиÑÑ‚Ñммит кыттааччылар ааттарын уларытыыларын Ñурунаала',
- 'renameuserlogentry' => '$1 аатын манныкка уларытта "$2"',
- 'renameuser-log' => '{{PLURAL:$1|БиирдÑ|$1 төгүл}} уларыйбыт. ТөрүөтÑ: $2',
+ 'log-name-renameuser' => 'Кыттааччылар ааттарын уларытыыларын Ñурунаала',
'renameuser-move-log' => '«[[User:$1|$1]]» аата «[[User:$2|$2]]» буолбутунан аптамаатынан',
'right-renameuser' => 'Кыттааччылар ааттарын уларытыы',
'renameuser-renamed-notice' => 'Бу кыттааччы аата уларыйбыт.
@@ -3791,10 +3764,7 @@ $messages['scn'] = array(
'renameuser-page-exists' => "La pàggina $1 c'è già; mpussìbbili suprascrivìrila autumaticamenti.",
'renameuser-page-moved' => 'La pàggina $1 vinni spustata a $2.',
'renameuser-page-unmoved' => 'Mpussìbbili mòviri la pàggina $1 a $2.',
- 'renameuserlogpage' => 'Utenti ri-numinati',
- 'renameuserlogpagetext' => "Di sècutu sunnu elencati li ri-numinazzioni di l'utenti.",
- 'renameuserlogentry' => 'hà ri-numinatu $1 \'n "$2"',
- 'renameuser-log' => 'Ca havi {{PLURAL:$1|nu cuntribbutu|$1 cuntribbuti}}. Mutivu: $2',
+ 'log-name-renameuser' => 'Utenti ri-numinati',
'renameuser-move-log' => 'Spustamentu autumàticu dâ pàggina - utenti ri-numinatu di "[[User:$1|$1]]" a "[[User:$2|$2]]"',
'right-renameuser' => "Ri-nòmina l'utenti",
);
@@ -3847,10 +3817,8 @@ $messages['si'] = array(
'renameuser-page-exists' => '$1 පිටුව දà·à¶±à¶§à¶¸à¶­à·Š පවතින අතර, එය ස්වයංක්â€à¶»à·“යව අධිලිවීමකට භà·à¶¢à¶±à¶º කල නොහà·à¶š.',
'renameuser-page-moved' => ' $1 පිටුව $2 වෙත ගෙනයන ලදි.',
'renameuser-page-unmoved' => ' $1 පිටුව $2 වෙත ගෙනය෠නොහà·à¶š.',
- 'renameuserlogpage' => 'පරිà·à·“ලක ප්â€à¶»à¶­à·’නම්කෙරුම් ලොගය',
- 'renameuserlogpagetext' => 'මෙය පරිà·à·“ලක නà·à¶¸ වෙනස්වීම් පිළිබඳ ලà¶à·”-සටහනකි.',
- 'renameuserlogentry' => '$1, "$2" ලෙස ප්â€à¶»à¶­à·’නම් කෙරිනි',
- 'renameuser-log' => '{{PLURAL:$1|එක් සංස්කරණයක්|සංස්කරණ $1 ක්}}. හේතුව: $2',
+ 'log-name-renameuser' => 'පරිà·à·“ලක ප්â€à¶»à¶­à·’නම්කෙරුම් ලොගය',
+ 'log-description-renameuser' => 'මෙය පරිà·à·“ලක නà·à¶¸ වෙනස්වීම් පිළිබඳ ලà¶à·”-සටහනකි.',
'renameuser-move-log' => 'පරිà·à·“ලක "[[User:$1|$1]]", "[[User:$2|$2]]" වෙත ප්â€à¶»à¶­à·’නම්කරන අතරතුර පිටුව ස්â€à·€à¶ºà¶‚ක්â€à¶»à·“යව ගෙනයන ලදී',
'action-renameuser' => 'පරිà·à·“ලකයන් ප්â€à¶»à¶­à·’නම් කරන්න',
'right-renameuser' => 'පරිà·à·“ලකයන් ප්â€à¶»à¶­à·’නම් කරන්න',
@@ -3861,6 +3829,7 @@ $messages['si'] = array(
/** Slovak (slovenÄina)
* @author Helix84
* @author Jkjk
+ * @author KuboF
*/
$messages['sk'] = array(
'renameuser' => 'Premenovať používateľa',
@@ -3869,7 +3838,7 @@ $messages['sk'] = array(
'renameuser-desc' => "Premenovať používateľa (vyžaduje právo ''renameuser'')",
'renameuserold' => 'SúÄasné používateľské meno:',
'renameusernew' => 'Nové používateľské meno:',
- 'renameuserreason' => 'Dôvod premenovania:', # Fuzzy
+ 'renameuserreason' => 'Dôvod:',
'renameusermove' => 'Presunúť používateľské a diskusné stránky (a ich podstránky) na nový názov',
'renameusersuppress' => 'Nevytvárať presmerovania na nový názov',
'renameuserreserve' => 'VyhradiÅ¥ staré používateľské meno (zabrániÅ¥ ÄalÅ¡iemu použitiu)',
@@ -3886,10 +3855,10 @@ $messages['sk'] = array(
'renameuser-page-exists' => 'Stránka $1 už existuje a nie je možné ju automaticky prepísať.',
'renameuser-page-moved' => 'Stránka $1 bola presunutá na $2.',
'renameuser-page-unmoved' => 'Stránku $1 nebolo možné presunúť na $2.',
- 'renameuserlogpage' => 'Záznam premenovaní používateľov',
- 'renameuserlogpagetext' => 'Toto je záznam premenovaní používateľov',
- 'renameuserlogentry' => 'premenoval používateľa $1 na „$2â€',
- 'renameuser-log' => 'mal {{PLURAL:$1|1 úpravu|$1 úpravy|$1 úprav}}. Dôvod: $2',
+ 'log-name-renameuser' => 'Záznam premenovaní používateľov',
+ 'log-description-renameuser' => 'Toto je záznam premenovaní používateľov',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|premenoval|premenovala}} používateľa $4 ({{PLURAL:$6|$6 úprava|$6 úpravy|$6 úprav}}) na $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 premenoval používateľa $4 na $5',
'renameuser-move-log' => 'Automaticky presunutá stránka poÄas premenovania používateľa „[[User:$1|$1]]“ na „[[User:$2|$2]]“',
'action-renameuser' => 'premenovať používateľov',
'right-renameuser' => 'Premenovávať používateľov',
@@ -3925,10 +3894,10 @@ Prosimo, pojdite nazaj in poskusite znova.',
'renameuser-page-exists' => 'Stran $1 že obstaja in je ni mogoÄe samodejno prepisati.',
'renameuser-page-moved' => 'Stran $1 je bila prestavljena na $2.',
'renameuser-page-unmoved' => 'Strani $1 ni mogoÄe prestaviti na $2.',
- 'renameuserlogpage' => 'Dnevnik preimenovanj uporabnikov',
- 'renameuserlogpagetext' => 'Prikazan je dnevnik sprememb uporabniških imen.',
- 'renameuserlogentry' => '- preimenovanje $1 v »$2«',
- 'renameuser-log' => '$1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}. Razlog: $2',
+ 'log-name-renameuser' => 'Dnevnik preimenovanj uporabnikov',
+ 'log-description-renameuser' => 'Prikazan je dnevnik sprememb uporabniških imen.',
+ 'logentry-renameuser-renameuser' => '$1 je {{GENDER:$2|preimenoval|preimenovala|preimenoval(-a)}} uporabnika $4 ({{PLURAL:$6|$6 urejanje|$6 urejanji|$6 urejanja|$6 urejanj}}) v $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 je preimenoval(-a) uporabnika $4 v $5',
'renameuser-move-log' => 'Samodejno prestavljanje strani pri preimenovanju uporabnika »[[User:$1|$1]]« v »[[User:$2|$2]]«',
'action-renameuser' => 'preimenovanje uporabnikov',
'right-renameuser' => 'Preimenovanje uporabnikov',
@@ -3976,10 +3945,7 @@ Ju lutemi kthehuni prapa dhe provoni përsëri.',
'renameuser-page-exists' => 'Faqja $1 ekziston dhe nuk mund të mbivendoset automatikisht.',
'renameuser-page-moved' => 'Faqja $1 është zhvendosur tek $2.',
'renameuser-page-unmoved' => "Faqja $1 s'mund të zhvendosej tek $2.",
- 'renameuserlogpage' => 'Regjistri i emër-ndryshimeve',
- 'renameuserlogpagetext' => 'Ky është një regjistër i ndryshimeve së emrave të përdoruesve',
- 'renameuserlogentry' => 'riemëruar $1 tek "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 redaktim|$1 redaktime}}. Arsyeja: $2',
+ 'log-name-renameuser' => 'Regjistri i emër-ndryshimeve',
'renameuser-move-log' => 'Lëvizi faqen automatikisht kur riemëroi përdoruesin "[[User:$1|$1]]" në "[[User:$2|$2]]"',
'action-renameuser' => 'riemëro përdoruesit',
'right-renameuser' => 'Riemëroni përdorueset',
@@ -4020,11 +3986,7 @@ $messages['sr-ec'] = array(
'renameuser-page-exists' => 'Страница $1 већ поÑтоји и не може Ñе заменити.',
'renameuser-page-moved' => 'Страница $1 је премештена у $2.',
'renameuser-page-unmoved' => 'Страница $1 не може да Ñе премеÑти на $2.',
- 'renameuserlogpage' => 'Дневник преименовања кориÑника',
- 'renameuserlogpagetext' => 'Ово је иÑторија измена кориÑничких имена.',
- 'renameuserlogentry' => '{{GENDER:|је преименовао|је преименовала|је преименовао}} $1 у „$2“',
- 'renameuser-log' => '{{PLURAL:$1|1 измена|$1 измене|$1 измена}}.
-Разлог: $2',
+ 'log-name-renameuser' => 'Дневник преименовања кориÑника',
'renameuser-move-log' => 'Премештене Ñтранице приликом преименовања кориÑника: „[[User:$1|$1]]“ у „[[User:$2|$2]]“.',
'action-renameuser' => 'преименовање кориÑника',
'right-renameuser' => 'преименовање кориÑничких имена',
@@ -4062,10 +4024,7 @@ $messages['sr-el'] = array(
'renameuser-page-exists' => 'Stranica $1 već postoji i ne može biti automatski presnimljena.',
'renameuser-page-moved' => 'Stranica $1 je premeštena na $2.',
'renameuser-page-unmoved' => 'Stranica $1 ne može biti premeštena na $2.',
- 'renameuserlogpage' => 'Dnevnik preimenovanja korisnika',
- 'renameuserlogpagetext' => 'Ovo je istorija izmena korisniÄkih imena.',
- 'renameuserlogentry' => 'je preimenovao $1 u „$2“',
- 'renameuser-log' => '{{PLURAL:$1|1 izmena|$1 izmene|$1 izmena}}. Razlog: $2',
+ 'log-name-renameuser' => 'Dnevnik preimenovanja korisnika',
'renameuser-move-log' => 'Automatski pomerene stranice prilikom preimenovanja korisniÄkog imena: „[[User:$1|$1]]“ u „[[User:$2|$2]]“.',
'action-renameuser' => 'preimenovanje korisnika',
'right-renameuser' => 'preimenovanje korisniÄkih imena',
@@ -4097,10 +4056,7 @@ $messages['stq'] = array(
'renameuser-page-exists' => 'Ju Siede $1 bestoant al un kon nit automatisk uurskrieuwen wäide.',
'renameuser-page-moved' => 'Ju Siede $1 wuude ätter $2 ferskäuwen.',
'renameuser-page-unmoved' => 'Ju Siede $1 kuude nit ätter $2 ferskäuwen wäide.',
- 'renameuserlogpage' => 'Benutsernoomenannerengs-Logbouk',
- 'renameuserlogpagetext' => 'In dit Logbouk wäide do Annerengen fon Benutsernoomen protokollierd.',
- 'renameuserlogentry' => 'häd "$1" in "$2" uumenaamd',
- 'renameuser-log' => '{{PLURAL:$1|1 Beoarbaidenge|$1 Beoarbaidengen}}. Gruund: $2',
+ 'log-name-renameuser' => 'Benutsernoomenannerengs-Logbouk',
'renameuser-move-log' => 'truch ju Uumbenaamenge fon „[[User:$1|$1]]“ ätter „[[User:$2|$2]]“ automatisk ferskäuwene Siede.',
'right-renameuser' => 'Benutser uumenaame',
);
@@ -4126,10 +4082,7 @@ $messages['su'] = array(
'renameuser-page-exists' => 'Kaca $1 geus aya sarta teu bisa ditimpah kitu baé.',
'renameuser-page-moved' => 'Kaca $1 geus dipindahkeun ka $2.',
'renameuser-page-unmoved' => 'Kaca $1 teu bisa dipindahkeun ka $2.',
- 'renameuserlogpage' => 'Log ganti ngaran',
- 'renameuserlogpagetext' => 'Ieu minangka log parobahan ngaran pamaké',
- 'renameuserlogentry' => 'geus ngaganti ngaran $1 jadi "$2"', # Fuzzy
- 'renameuser-log' => '{{PLURAL:$1|1 édit|$1 édit}}. Alesan: $2',
+ 'log-name-renameuser' => 'Log ganti ngaran',
'renameuser-move-log' => 'Otomatis mindahkeun kaca nalika ngaganti ngaran "[[User:$1|$1]]" jadi "[[User:$2|$2]]"',
);
@@ -4170,10 +4123,7 @@ $messages['sv'] = array(
'renameuser-page-exists' => 'Sidan $1 finns redan och kan inte skrivas över automatiskt.',
'renameuser-page-moved' => 'Sidan $1 har flyttats till $2.',
'renameuser-page-unmoved' => 'Sidan $1 kunde inte flyttas till $2.',
- 'renameuserlogpage' => 'Logg över användarnamnsbyten',
- 'renameuserlogpagetext' => 'Detta är en logg över byten av användarnamn',
- 'renameuserlogentry' => 'bytte namn på $1 till "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 redigering|$1 redigeringar}}. Anledning: $2',
+ 'log-name-renameuser' => 'Logg över användarnamnsbyten',
'renameuser-move-log' => 'Flyttade automatiskt sidan när namnet byttes på användaren "[[User:$1|$1]]" till "[[User:$2|$2]]"',
'action-renameuser' => 'ändra namn på användaren',
'right-renameuser' => 'Ändra användares namn',
@@ -4231,10 +4181,8 @@ $messages['ta'] = array(
'renameuser-page-exists' => 'பகà¯à®•à®®à¯ $1 à®à®±à¯à®•à®©à®µà¯‡ உளà¯à®³à®¤à¯. தானாக மேலெழà¯à®¤ இயலாதà¯.',
'renameuser-page-moved' => 'பகà¯à®•à®®à¯ $1 $2 எனà¯à®¨à¯à®¤à®²à¯ˆà®ªà¯à®ªà¯à®•à¯à®•à¯ நகரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'renameuser-page-unmoved' => 'பகà¯à®•à®®à¯ $1 எனà¯à®ªà®¤à¯ˆ $2 எனà¯à®ªà®¤à®±à¯à®•à¯ நகரà¯à®¤à¯à®¤ à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ.',
- 'renameuserlogpage' => 'பயனரை பெயரà¯à®®à®¾à®±à¯à®±à¯à®¤à®²à¯ கà¯à®±à®¿à®ªà¯à®ªà¯‡à®Ÿà¯',
- 'renameuserlogpagetext' => 'இத௠பயனர௠பெயர௠மாறà¯à®±à®¤à¯à®¤à®¿à®±à¯à®•à®¾à®© கà¯à®±à®¿à®ªà¯à®ªà¯‡à®Ÿà¯',
- 'renameuserlogentry' => 'பெயர௠மறà¯à®±à®®à¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ $1 லிரà¯à®¨à¯à®¤à¯ "$2" கà¯à®•à¯',
- 'renameuser-log' => '{{PLURAL:$1|1 திரà¯à®¤à¯à®¤à®®à¯|$1 திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯}}. காரணமà¯: $2',
+ 'log-name-renameuser' => 'பயனரை பெயரà¯à®®à®¾à®±à¯à®±à¯à®¤à®²à¯ கà¯à®±à®¿à®ªà¯à®ªà¯‡à®Ÿà¯',
+ 'log-description-renameuser' => 'இத௠பயனர௠பெயர௠மாறà¯à®±à®¤à¯à®¤à®¿à®±à¯à®•à®¾à®© கà¯à®±à®¿à®ªà¯à®ªà¯‡à®Ÿà¯',
'action-renameuser' => 'பயனரை பெயரà¯à®®à®¾à®±à¯à®±à¯',
'right-renameuser' => 'பயனரà¯à®•à®³à¯ˆ மாறà¯à®±à¯ பெயரிடà¯',
'renameuser-renamed-notice' => 'இநà¯à®¤ பயனர௠பெயர௠மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.
@@ -4269,10 +4217,7 @@ $messages['te'] = array(
'renameuser-page-exists' => '$1 పేజీ ఇపà±à°ªà°Ÿà°¿à°•à±‡ ఉంది, కాబటà±à°Ÿà°¿ ఆటోమాటిగà±à°—à°¾ దానిపై కొతà±à°¤à°ªà±‡à°œà±€à°¨à°¿ à°°à±à°¦à±à°¦à°¡à°‚ à°•à±à°¦à°°à°¦à±.',
'renameuser-page-moved' => '$1 పేజీని $2 పేజీకి తరలించాం.',
'renameuser-page-unmoved' => '$1 పేజీని $2 పేజీకి తరలించలేక పోయాం.',
- 'renameuserlogpage' => 'వాడà±à°•à°°à°¿ పేరà±à°®à°¾à°°à±à°ªà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾',
- 'renameuserlogpagetext' => 'ఇది వాడà±à°•à°°à°¿ పేరà±à°²à°•à°¿ జరిగిన మారà±à°ªà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾.',
- 'renameuserlogentry' => '$1ని "$2"à°—à°¾ పేరౠమారà±à°šà°¾à°°à±',
- 'renameuser-log' => '{{PLURAL:$1|à°’à°• దిదà±à°¦à±à°¬à°¾à°Ÿà±|$1 దిదà±à°¦à±à°¬à°¾à°Ÿà±à°²à±}}. కారణం: $2',
+ 'log-name-renameuser' => 'వాడà±à°•à°°à°¿ పేరà±à°®à°¾à°°à±à°ªà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾',
'renameuser-move-log' => '"[[User:$1|$1]]" పేరà±à°¨à± "[[User:$2|$2]]"కౠమారà±à°šà°¡à°‚తో పేజీని ఆటోమాటిగà±à°—à°¾ తరలించాం',
'right-renameuser' => 'వాడà±à°•à°°à±à°² పేరౠమారà±à°šà°¡à°‚',
'renameuser-renamed-notice' => 'à°ˆ వాడà±à°•à°°à°¿ పేరౠమారింది.
@@ -4287,7 +4232,7 @@ $messages['tet'] = array(
'renameuser-desc' => "Fó naran foun ba uza-na'in sira (presiza priviléjiu ''renameuser'')",
'renameuserold' => "Naran uza-na'in atuál:",
'renameusernew' => "Naran uza-na'in foun:",
- 'renameuserreason' => 'Motivu:', # Fuzzy
+ 'renameuserreason' => 'Motivu:',
'renameusermove' => "Book pájina uza-na'in no diskusaun (no sub-pájina) ba naran foun",
'renameuserconfirm' => 'Sin, fó naran foun',
'renameusersubmit' => 'Fó naran foun',
@@ -4305,7 +4250,7 @@ $messages['tg-cyrl'] = array(
'renameuser-desc' => "Ðоми Ñк корбарро тағйир медиҳад (ниёзманд ба ихтиёроти ''тағйирином'' аÑÑ‚)",
'renameuserold' => 'Ðоми корбари феълӣ:',
'renameusernew' => 'Ðоми корбари ҷадид:',
- 'renameuserreason' => 'Иллати тағйири номи корбарӣ:', # Fuzzy
+ 'renameuserreason' => 'Сабаб:',
'renameusermove' => 'Саҳифаи корбарӣ ва Ñаҳифаи баҳÑи корбар (ва зерÑаҳифаҳои он)ро интиқол бидеҳ',
'renameuserreserve' => 'БаÑтани номи корбарии кӯҳна аз иÑтифодаи оÑнда',
'renameuserwarnings' => 'Ҳушдорҳо:',
@@ -4320,10 +4265,7 @@ $messages['tg-cyrl'] = array(
'renameuser-page-exists' => 'Саҳифаи $1 аллакай вуҷуд дорда ва ба таври худкор қобили бознавиÑÓ£ неÑÑ‚.',
'renameuser-page-moved' => 'Саҳифаи $1 ба $2 кӯчонида шуд.',
'renameuser-page-unmoved' => 'Имкони кӯчонидани Ñаҳифаи $1 ба $2 вуҷуд надорад.',
- 'renameuserlogpage' => 'Гузориши тағйири номи корбар',
- 'renameuserlogpagetext' => 'Ин гузориши тағйири номи корбарон аÑÑ‚',
- 'renameuserlogentry' => 'номи $1ро ба "$2" тағйир дод', # Fuzzy
- 'renameuser-log' => '{{PLURAL:$1|1 вироиш|$1 вироишҳо}}. Далел: $2',
+ 'log-name-renameuser' => 'Гузориши тағйири номи корбар',
'renameuser-move-log' => 'Саҳифа дар вақти тағйири номи корбар "[[User:$1|$1]]" ба "[[User:$2|$2]]" ба таври худкор кӯчонида шуд',
'right-renameuser' => 'Тағйири номи корбарон',
);
@@ -4351,9 +4293,7 @@ $messages['tg-latn'] = array(
'renameuser-page-exists' => 'Sahifai $1 allakaj vuçud dorda va ba tavri xudkor qobili boznavisī nest.',
'renameuser-page-moved' => 'Sahifai $1 ba $2 kūconida şud.',
'renameuser-page-unmoved' => 'Imkoni kūconidani sahifai $1 ba $2 vuçud nadorad.',
- 'renameuserlogpage' => 'Guzorişi taƣjiri nomi korbar',
- 'renameuserlogpagetext' => 'In guzorişi taƣjiri nomi korbaron ast',
- 'renameuser-log' => '{{PLURAL:$1|1 viroiÅŸ|$1 viroiÅŸho}}. Dalel: $2',
+ 'log-name-renameuser' => 'Guzorişi taƣjiri nomi korbar',
'renameuser-move-log' => 'Sahifa dar vaqti taƣjiri nomi korbar "[[User:$1|$1]]" ba "[[User:$2|$2]]" ba tavri xudkor kūconida şud',
'right-renameuser' => 'Taƣjiri nomi korbaron',
);
@@ -4383,10 +4323,7 @@ $messages['th'] = array(
'renameuser-page-exists' => 'หน้า $1 มีอยู่à¹à¸¥à¹‰à¸§ à¹à¸¥à¸°à¹„ม่สามารถย้ายไปà¹à¸—นที่ได้โดยอัตโนมัติ',
'renameuser-page-moved' => 'หน้า $1 ถูà¸à¸¢à¹‰à¸²à¸¢à¹„ปยัง $2',
'renameuser-page-unmoved' => 'ไม่สามารถย้ายหน้า $1 ไปยัง $2 ได้',
- 'renameuserlogpage' => 'ปูมà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
- 'renameuserlogpagetext' => 'ข้อมูลà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
- 'renameuserlogentry' => 'ได้เปลี่ยนชื่อ $1 ไปเป็น [[ผู้ใช้:$2]]',
- 'renameuser-log' => 'à¹à¸à¹‰à¹„ขà¹à¸¥à¹‰à¸§ $1 ครั้ง เหตุผล: $2',
+ 'log-name-renameuser' => 'ปูมà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
'renameuser-move-log' => 'ย้ายโดยอัตโนมัติ ขณะเปลี่ยนชื่อผู้ใช้จาภ"[[User:$1|$1]]" เป็น "[[User:$2|$2]]"',
'right-renameuser' => 'เปลี่ยนชื่อผู้ใช้',
'renameuser-renamed-notice' => 'ผู้ใช้นี้ได้ถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­ บันทึà¸à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¹à¸ªà¸”งอยู่ด้านล่างสำหรับà¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡',
@@ -4419,10 +4356,7 @@ Yza gaýdyp gaýtadan synanyşyp görüň.',
'renameuser-page-exists' => '$1 sahypasy eýýäm bar we onuň üstüne awtomatik ýazyp bolmaýar.',
'renameuser-page-moved' => '$1 sahypasy $2 sahypasyna geçirildi.',
'renameuser-page-unmoved' => '$1 sahypasyny $2 sahypasyna geçirip bolmaýar.',
- 'renameuserlogpage' => 'Ulanyjy adyny üýtgetme gündeligi',
- 'renameuserlogpagetext' => 'Bu gündelik ulanyjy ady üýtgetmelerini görkezýär.',
- 'renameuserlogentry' => '$1 täzeden atlandyryldy: "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 özgerdiş|$1 özgerdiş}}. Sebäp: $2',
+ 'log-name-renameuser' => 'Ulanyjy adyny üýtgetme gündeligi',
'renameuser-move-log' => 'Ulanyjy "[[User:$1|$1]]" adyndan "[[User:$2|$2]]" adyna täzeden atlandyrylanda, sahypa awtomatik geçirildi',
'right-renameuser' => 'Ulanyjylaryň adyny üýtget',
'renameuser-renamed-notice' => 'Bu ulanyjynyň ady üýtgedilipdir.
@@ -4457,10 +4391,7 @@ Magbalik lamang at subukan uli.',
'renameuser-page-exists' => 'Umiiral na ang pahinang $1 at hindi maaaring kusang mapatungan.',
'renameuser-page-moved' => 'Ang pahinang $1 ay nailipat na patungo sa $2.',
'renameuser-page-unmoved' => 'Hindi mailipat ang pahinang $1 patungo sa $2.',
- 'renameuserlogpage' => 'Talaan ng muling pagpapangalan ng tagagamit',
- 'renameuserlogpagetext' => 'Isa itong pagtatala/talaan ng mga pagbabago sa mga pangalan ng tagagamit.',
- 'renameuserlogentry' => 'muling pinangalan si $1 patungo sa "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 pagbabago|$1 mga pagbabago}}. Dahilan: $2',
+ 'log-name-renameuser' => 'Talaan ng muling pagpapangalan ng tagagamit',
'renameuser-move-log' => 'Kusang inilipat ang pahina habang muling pinapangalanan ang tagagamit na si "[[User:$1|$1]]" patungo sa "[[User:$2|$2]]"',
'action-renameuser' => 'muling pangalanan ang mga tagagamit',
'right-renameuser' => 'Muling pangalanan ang mga tagagamit',
@@ -4479,8 +4410,7 @@ $messages['to'] = array(
'renameusererrorexists' => 'Ko e ʻetita "<nowiki>$1</nowiki>" ʻoku toka tuʻu ia',
'renameusererrorinvalid' => 'ʻOku taʻeʻaonga ʻa e hingoa fakaʻetita ko "<nowiki>$1</nowiki>"',
'renameusersuccess' => 'Ko e ʻetita "<nowiki>$1</nowiki>" kuo liliuhingoa ia kia "<nowiki>$2</nowiki>"',
- 'renameuserlogpage' => 'Tohinoa ʻo e liliu he hingoa ʻo e ʻetita',
- 'renameuserlogpagetext' => 'Ko e tohinoa ʻeni ʻo e ngaahi liliu ki he hingoa ʻo e kau ʻetita',
+ 'log-name-renameuser' => 'Tohinoa ʻo e liliu he hingoa ʻo e ʻetita',
);
/** Turkish (Türkçe)
@@ -4514,20 +4444,30 @@ Lütfen geri dönüp tekrar deneyin.',
'renameuser-page-exists' => '$1 sayfası zaten mevcut ve otomatik olarak üstüne yazılamaz.',
'renameuser-page-moved' => '$1 sayfası $2 sayfasına taşındı.',
'renameuser-page-unmoved' => '$1 sayfası $2 sayfasına taşınamıyor.',
- 'renameuserlogpage' => 'Kullanıcı adı değişikliği kayıtları',
- 'renameuserlogpagetext' => 'Aşağıda bulunan liste adı değiştirilmiş kullanıcıları gösterir.',
- 'renameuserlogentry' => '$1, "$2" olarak yeniden adlandırıldı',
- 'renameuser-log' => '{{PLURAL:$1|1 düzenleme|$1 düzenleme}}. Neden: $2',
+ 'log-name-renameuser' => 'Kullanıcı adı değişikliği kayıtları',
'renameuser-move-log' => 'Kullanıcıyı "[[User:$1|$1]]" isminden "[[User:$2|$2]]" ismine yeniden adlandırırken, sayfa otomatik olarak taşındı',
'right-renameuser' => 'Kullanıcıların adlarını değiştirir',
'renameuser-renamed-notice' => 'Bu kullanıcının adı değiştirildi.
Referans için ad değiştirme günlüğü aşağıda sağlanmıştır.',
);
+/** Uyghur (Arabic script) (ئۇيغۇرچە)
+ * @author Sahran
+ */
+$messages['ug-arab'] = array(
+ 'renameuserreason' => 'سەۋەب:',
+ 'renameuserwarnings' => 'ئاگاھلاندۇرۇشلار:',
+ 'renameusersubmit' => 'تاپشۇر',
+ 'renameuser-page-exists' => '$1 بەت مەۋجۇد، ئۆزلۈكىدىن قاپلىۋەتكىلى بولمايدۇ.',
+ 'renameuser-page-moved' => '$1 بەت $2 گە يۆتكەلدى.',
+ 'renameuser-page-unmoved' => '$1 بەتنى $2 گە يۆتكىيەلمىدى.',
+);
+
/** Ukrainian (українÑька)
* @author A1
* @author AS
* @author Ahonc
+ * @author Base
* @author EugeneZelenko
* @author Microcell
* @author Prima klasy4na
@@ -4540,7 +4480,7 @@ $messages['uk'] = array(
'renameuser-desc' => "ÐŸÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача (потрібні права ''renameuser'')",
'renameuserold' => "Поточне ім'Ñ:",
'renameusernew' => "Ðове ім'Ñ:",
- 'renameuserreason' => 'Причина перейменуваннÑ:', # Fuzzy
+ 'renameuserreason' => 'Причина:',
'renameusermove' => 'Перейменувати також Ñторінку кориÑтувача, Ñторінку Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð° їхні підÑторінки',
'renameusersuppress' => 'Ðе Ñтворюйте Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° нову назву',
'renameuserreserve' => "Зарезервувати Ñтаре ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð»ÑŒÑˆÐ¾Ð³Ð¾ викориÑтаннÑ",
@@ -4557,10 +4497,10 @@ $messages['uk'] = array(
'renameuser-page-exists' => 'Сторінка $1 вже Ñ–Ñнує Ñ– не може бути перезапиÑана автоматично.',
'renameuser-page-moved' => 'Сторінка $1 була перейменована на $2.',
'renameuser-page-unmoved' => 'Сторінка $1 не може бути перейменована на $2.',
- 'renameuserlogpage' => 'Журнал перейменувань кориÑтувачів',
- 'renameuserlogpagetext' => 'Це журнал здійÑнених перейменувань зареєÑтрованих кориÑтувачів.',
- 'renameuserlogentry' => 'перейменував $1 на «$2»',
- 'renameuser-log' => 'мав $1 {{PLURAL:$1|редагуваннÑ|редагуваннÑ|редагувань}}. Причина: $2',
+ 'log-name-renameuser' => 'Журнал перейменувань кориÑтувачів',
+ 'log-description-renameuser' => 'Це журнал перейменувань зареєÑтрованих кориÑтувачів.',
+ 'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|перейменував|перейменувала}} $4 ({{PLURAL:$6|$6 редагуваннÑ|$6 редагуваннÑ|$6 редагувань}}) на $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 {{GENDER:$2|перейменував|перейменувала}} $4 на $5',
'renameuser-move-log' => 'Ðвтоматичне Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñторінки при перейменуванні кориÑтувача «[[User:$1|$1]]» на «[[User:$2|$2]]»',
'action-renameuser' => 'Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів',
'right-renameuser' => 'ÐŸÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів',
@@ -4575,7 +4515,6 @@ $messages['ur'] = array(
'renameuser' => 'صار٠کا نام تبدیل کریں',
'renameuserwarnings' => 'انتباÛ:',
'renameusersubmit' => 'جمع کرائیں',
- 'renameuser-log' => 'جن کی $1 ترامیم تھیں. $2', # Fuzzy
'action-renameuser' => 'صارÙین Ú©Ùˆ نیا نام دیںکے',
'right-renameuser' => 'صارÙین Ú©Ùˆ نیا نام دیںکے',
);
@@ -4584,12 +4523,12 @@ $messages['ur'] = array(
* @author CoderSI
*/
$messages['uz'] = array(
- 'renameuserlogpage' => 'Ishtirokchilarni qayta nomlash qaydlari',
- 'renameuserlogentry' => '"$1"ni "$2"ga qayta nomladi',
+ 'log-name-renameuser' => 'Ishtirokchilarni qayta nomlash qaydlari',
);
/** vèneto (vèneto)
* @author Candalua
+ * @author GatoSelvadego
*/
$messages['vec'] = array(
'renameuser' => 'Rinomina utente',
@@ -4598,13 +4537,14 @@ $messages['vec'] = array(
'renameuser-desc' => "Funsion par rinominar un utente (ghe vole i diriti de ''renameuser'')",
'renameuserold' => 'Vecio nome utente:',
'renameusernew' => 'Novo nome utente:',
- 'renameuserreason' => 'Motivo del canbio nome', # Fuzzy
+ 'renameuserreason' => 'Motivo:',
'renameusermove' => 'Rinomina anca la pagina utente, la pagina de discussion e le relative sotopagine',
'renameusersuppress' => 'No stà crear rimandi al nome novo',
'renameuserreserve' => "Tien da conto el vecio nome utente par inpedir che'l vegna doparà in futuro",
'renameuserwarnings' => 'Avertimenti:',
'renameuserconfirm' => "Sì, rinomina l'utente",
'renameusersubmit' => 'Invia',
+ 'renameuser-submit-blocklog' => "Mostra registro de i blochi pa'l utente",
'renameusererrordoesnotexist' => 'El nome utente "<nowiki>$1</nowiki>" no l\'esiste',
'renameusererrorexists' => 'El nome utente "<nowiki>$1</nowiki>" l\'esiste de zà',
'renameusererrorinvalid' => 'El nome utente "<nowiki>$1</nowiki>" no\'l xe mìa valido.',
@@ -4614,11 +4554,12 @@ $messages['vec'] = array(
'renameuser-page-exists' => 'La pagina $1 la esiste de zà; no se pole sovrascrìvarla automaticamente.',
'renameuser-page-moved' => 'La pagina $1 la xe stà spostà a $2.',
'renameuser-page-unmoved' => 'No se pole spostar la pagina $1 a $2.',
- 'renameuserlogpage' => 'Registro dei utenti rinominà',
- 'renameuserlogpagetext' => 'De seguito vien presentà el registro de le modifiche ai nomi utente',
- 'renameuserlogentry' => 'gà rinominà $1 in "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 contributo|$1 contributi}}. Motivo: $2',
+ 'log-name-renameuser' => 'Registro dei utenti rinominà',
+ 'log-description-renameuser' => 'Sto cuà el xe el registro de łe modifeghe a i nome utente.',
+ 'logentry-renameuser-renameuser' => "$1 {{GENDER:$2|ga rinominà}} 'l utente $4 (có {{PLURAL:$6|$6 contributo|$6 contributi}}) in $5",
+ 'logentry-renameuser-renameuser-legacier' => "$1 ga rinominà 'l utente $4 in $5",
'renameuser-move-log' => 'Spostamento automatico de la pagina - utente rinominà da "[[User:$1|$1]]" a "[[User:$2|$2]]"',
+ 'action-renameuser' => 'rinominar i utenti',
'right-renameuser' => 'Rinomina utenti',
'renameuser-renamed-notice' => 'Sto utente el gà canbià nome.
Qua soto ghe xe el riferimento sul registro de rinomina.',
@@ -4664,10 +4605,10 @@ $messages['vi'] = array(
'renameuser-page-exists' => 'Trang $1 đã tồn tại và không thể bị tự động ghi đè.',
'renameuser-page-moved' => 'Trang $1 đã được di chuyển đến $2.',
'renameuser-page-unmoved' => 'Trang $1 không thể di chuyển đến $2.',
- 'renameuserlogpage' => 'Nhật trình đổi tên thành viên',
- 'renameuserlogpagetext' => 'Äây là nhật trình ghi lại các thay đổi đối vá»›i tên thành viên',
- 'renameuserlogentry' => 'đã đổi tên $1 thành “$2â€',
- 'renameuser-log' => 'Äã có {{PLURAL:$1|1 sá»­a đổi|$1 sá»­a đổi}}. Lý do: $2',
+ 'log-name-renameuser' => 'Nhật trình đổi tên thành viên',
+ 'log-description-renameuser' => 'Äây là nhật trình ghi lại các thay đổi đối vá»›i tên thành viên',
+ 'logentry-renameuser-renameuser' => '{{GENDER:$2}}$1 đã đổi tên thành viên $4 ($6 lần sửa đổi) thành $5',
+ 'logentry-renameuser-renameuser-legacier' => '$1 đã đổi tên thành viên $4 thành $5',
'renameuser-move-log' => 'Äã tá»± Ä‘á»™ng di chuyển trang khi đổi tên thành viên “[[User:$1|$1]]†thành “[[User:$2|$2]]â€',
'action-renameuser' => 'đổi tên thành viên',
'right-renameuser' => 'Äổi tên thành viên',
@@ -4701,10 +4642,7 @@ $messages['vo'] = array(
'renameuser-page-exists' => 'Pad: $1 ya dabinon e no kanon pamoükön itjäfidiko.',
'renameuser-page-moved' => 'Pad: $1 petopätükon ad pad: $2.',
'renameuser-page-unmoved' => 'No eplöpos ad topätükön padi: $1 ad pad: $2.',
- 'renameuserlogpage' => 'Jenotalised votanemamas',
- 'renameuserlogpagetext' => 'Is palisedons votükams gebananemas.',
- 'renameuserlogentry' => 'evotanemon eli $1 ad "$2"',
- 'renameuser-log' => '{{PLURAL:$1|Redakam 1|Redakams $1}}. Kod: $2',
+ 'log-name-renameuser' => 'Jenotalised votanemamas',
'renameuser-move-log' => 'Pad petopätükon itjäfidiko dü votanemama gebana: "[[User:$1|$1]]" ad "[[User:$2|$2]]"',
'right-renameuser' => 'Votanemön gebanis',
);
@@ -4727,9 +4665,7 @@ $messages['wa'] = array(
'renameuser-page-exists' => "Li pådje $1 egzistêye dedja et n' pout nén esse otomaticmint spotcheye.",
'renameuser-page-moved' => 'Li pådje $1 a stî displaeceye viè $2.',
'renameuser-page-unmoved' => 'Li pådje $1 èn pout nén esse displaeceye viè $2.',
- 'renameuserlogpage' => "Djournå des candjmints d' no d' uzeus",
- 'renameuserlogpagetext' => "Chal pa dzo c' est ene djivêye des uzeus k' ont candjî leu no d' elodjaedje.",
- 'renameuser-log' => "k' aveut ddja fwait $1 candjmints. $2", # Fuzzy
+ 'log-name-renameuser' => "Djournå des candjmints d' no d' uzeus",
'renameuser-move-log' => "Pådje displaeceye otomaticmint tot rlomant l' uzeu «[[User:$1|$1]]» viè «[[User:$2|$2]]»",
);
@@ -4761,10 +4697,7 @@ $messages['yi'] = array(
'renameuser-page-exists' => "דער בל×ַט $1 עקזיסטירט שוין ×ון מ'קען ××™× × ×™×©×˜ ×ויט×ָמ×ַטיש ×יבערשרײַבן.",
'renameuser-page-moved' => 'דער בל×ַט $1 ××™×– געוו×רן ב×ַוועגט צו $2.',
'renameuser-page-unmoved' => 'מען קען נישט ב×ַוועגן ×“×¢× ×‘×œ×ַט $1 צו $2.',
- 'renameuserlogpage' => 'ב×ַניצער × ×ָמען-טויש ל×ָג-בוך',
- 'renameuserlogpagetext' => 'ד×ָס ××™×– ×Ö· ל××’ פֿון ענדערונגען צו ב×ַניצער־נעמען.',
- 'renameuserlogentry' => 'מ\'×”×ט ×“×¢× × ×ָמען $1 געענדערט צו "$2"',
- 'renameuser-log' => '{{PLURAL:$1|1 רעד×ַקטירונג|$1 רעד×ַקטירונגען}}. גרונד: $2',
+ 'log-name-renameuser' => 'ב×ַניצער × ×ָמען-טויש ל×ָג-בוך',
'renameuser-move-log' => '×ויט×מ×ַטיש ב×ַוועגט בל×ַט דורך ענדערן ב×ַניצער־נ×ָמען פֿון "[[User:$1|$1]]" צו "[[User:$2|$2]]"',
'action-renameuser' => 'בײַטן ב×ַניצער נעמען',
'right-renameuser' => 'בײַטן ב×ַניצער נעמען',
@@ -4782,8 +4715,6 @@ $messages['yo'] = array(
'renameusersubmit' => 'Fúnsílẹ̀',
'renameusererrordoesnotexist' => 'Oníṣe "<nowiki>$1</nowiki>" kò sí.',
'renameusererrorexists' => 'Oníṣe "<nowiki>$1</nowiki>" tilẹ̀ wà tẹÌlẹ̀.',
- 'renameuserlogentry' => 'ṣàtúnsá»lórúká» $1 sí $2',
- 'renameuser-log' => '{{PLURAL:$1|Àtúná¹£e 1|Àwá»n àtúná¹£e $1}}. ÃŒdíẹ̀: $2',
);
/** Cantonese (粵語)
@@ -4808,10 +4739,7 @@ $messages['yue'] = array(
'renameuser-page-exists' => '$1呢一版已經存在,唔å¯ä»¥è‡ªå‹•é‡å¯«ã€‚',
'renameuser-page-moved' => '$1呢一版已經æ¬åˆ°åŽ»$2。',
'renameuser-page-unmoved' => '$1呢一版唔能夠æ¬åˆ°åŽ»$2。',
- 'renameuserlogpage' => '用戶改å日誌',
- 'renameuserlogpagetext' => '呢個係改用戶å嘅日誌',
- 'renameuserlogentry' => '已經幫 $1 改咗ååš "$2"',
- 'renameuser-log' => 'æ“有$1次編輯。 原因: $2',
+ 'log-name-renameuser' => '用戶改å日誌',
'renameuser-move-log' => '當由"[[User:$1|$1]]"改ååš"[[User:$2|$2]]"嗰陣已經自動æ¬å’—用戶é ',
'right-renameuser' => '改用戶å',
);
@@ -4821,8 +4749,10 @@ $messages['yue'] = array(
* @author Gaoxuewei
* @author Gzdavidwong
* @author Hydra
+ * @author Hzy980512
* @author Liangent
* @author PhiLiP
+ * @author Shizhao
* @author Xiaomingyan
* @author Yfdyh000
*/
@@ -4833,7 +4763,7 @@ $messages['zh-hans'] = array(
'renameuser-desc' => "添加更改用户åçš„[[Special:Renameuser|特殊页é¢]](需è¦''renameuser''æƒé™ï¼‰",
'renameuserold' => '当å‰ç”¨æˆ·å:',
'renameusernew' => '新用户å:',
- 'renameuserreason' => 'æ›´å原因:', # Fuzzy
+ 'renameuserreason' => '原因:',
'renameusermove' => '移动用户和讨论页é¢ï¼ˆå’Œå­é¡µé¢ï¼‰è‡³æ–°ç”¨æˆ·å',
'renameusersuppress' => 'ä¸åˆ›å»ºè‡³æ–°ç”¨æˆ·åçš„é‡å®šå‘页',
'renameuserreserve' => 'å°é”旧用户å,使其ä¸èƒ½åœ¨æœªæ¥ä½¿ç”¨',
@@ -4850,10 +4780,10 @@ $messages['zh-hans'] = array(
'renameuser-page-exists' => '页é¢$1å·±ç»å­˜åœ¨ï¼Œä¸èƒ½è¢«è‡ªåŠ¨è¦†ç›–。',
'renameuser-page-moved' => '页é¢$1已移动至$2。',
'renameuser-page-unmoved' => '页é¢$1ä¸èƒ½ç§»åŠ¨è‡³$2。',
- 'renameuserlogpage' => '用户更å日志',
- 'renameuserlogpagetext' => '这是用户å更改的日志。',
- 'renameuserlogentry' => 'æ›´å$1为“$2â€',
- 'renameuser-log' => '$1个编辑。原因:$2',
+ 'log-name-renameuser' => '用户更å日志',
+ 'log-description-renameuser' => '这是对用户å改动的日志。',
+ 'logentry-renameuser-renameuser' => '$1{{GENDER:$2|å°†}}用户$4($6次编辑)é‡å‘½åæˆ$5',
+ 'logentry-renameuser-renameuser-legacier' => '$1将用户$4é‡å‘½åæˆ$5',
'renameuser-move-log' => '当更改用户å“[[User:$1|$1]]â€ä¸ºâ€œ[[User:$2|$2]]â€æ—¶è‡ªåŠ¨ç§»åŠ¨é¡µé¢',
'action-renameuser' => 'é‡å‘½å用户',
'right-renameuser' => '更改用户å',
@@ -4876,7 +4806,7 @@ $messages['zh-hant'] = array(
'renameuser-desc' => "新增一個[[Special:Renameuser|特殊é é¢]]來é‡å‘½å用戶(需è¦''renameuser''權é™ï¼‰",
'renameuserold' => 'ç¾æ™‚用戶å:',
'renameusernew' => '新的使用者å稱:',
- 'renameuserreason' => 'é‡æ–°å‘½å的原因:', # Fuzzy
+ 'renameuserreason' => '原因:',
'renameusermove' => '移動用戶é åŠå…¶å°è©±é ï¼ˆåŒ…括å„å­é ï¼‰åˆ°æ–°çš„åå­—',
'renameusersuppress' => 'ä¸è¦å»ºç«‹é‡å®šå‘到新的å稱',
'renameuserreserve' => 'å°ç¦èˆŠä½¿ç”¨è€…å稱,使之ä¸èƒ½åœ¨æ—¥å¾Œä½¿ç”¨',
@@ -4894,10 +4824,10 @@ $messages['zh-hant'] = array(
'renameuser-page-exists' => '$1 這一é å·±ç¶“存在,ä¸èƒ½è‡ªå‹•è¦†å¯«ã€‚',
'renameuser-page-moved' => '$1 這一é å·²ç¶“移動到 $2。',
'renameuser-page-unmoved' => '$1 這一é ä¸èƒ½ç§»å‹•åˆ° $2。',
- 'renameuserlogpage' => '用戶å變更日誌',
- 'renameuserlogpagetext' => '這是用戶å更改的日誌',
- 'renameuserlogentry' => '已經把 $1 é‡æ–°å‘½å為「$2ã€',
- 'renameuser-log' => 'æ“有 $1 次編輯。 ç†ç”±ï¼š$2',
+ 'log-name-renameuser' => '用戶å變更日誌',
+ 'log-description-renameuser' => '這是用戶å更改的日誌',
+ 'logentry-renameuser-renameuser' => '$1{{GENDER:$2|é‡å‘½å}}用戶$4({{PLURAL:$6|$6次|$6次}}編輯)æˆ$5',
+ 'logentry-renameuser-renameuser-legacier' => '$1é‡å‘½å用戶$4æˆ$5',
'renameuser-move-log' => '當由「[[User:$1|$1]]ã€é‡æ–°å‘½å作「[[User:$2|$2]]ã€æ™‚已經自動移動用戶é ',
'action-renameuser' => 'é‡å‘½å用戶',
'right-renameuser' => 'é‡æ–°å‘½å用戶',
diff --git a/extensions/Renameuser/Renameuser.php b/extensions/Renameuser/Renameuser.php
index 962c0f3f..e9e83143 100644
--- a/extensions/Renameuser/Renameuser.php
+++ b/extensions/Renameuser/Renameuser.php
@@ -23,9 +23,8 @@ $wgExtensionCredits['specialpage'][] = array(
);
# Internationalisation files
-$dir = dirname( __FILE__ ) . '/';
-$wgExtensionMessagesFiles['Renameuser'] = $dir . 'Renameuser.i18n.php';
-$wgExtensionMessagesFiles['RenameuserAliases'] = $dir . 'Renameuser.alias.php';
+$wgExtensionMessagesFiles['Renameuser'] = __DIR__ . '/Renameuser.i18n.php';
+$wgExtensionMessagesFiles['RenameuserAliases'] = __DIR__ . '/Renameuser.alias.php';
/**
* Users with more than this number of edits will have their rename operation
@@ -34,79 +33,19 @@ $wgExtensionMessagesFiles['RenameuserAliases'] = $dir . 'Renameuser.alias.php';
define( 'RENAMEUSER_CONTRIBJOB', 5000 );
# Add a new log type
-global $wgLogTypes, $wgLogNames, $wgLogHeaders, $wgLogActions;
-$wgLogTypes[] = 'renameuser';
-$wgLogNames['renameuser'] = 'renameuserlogpage';
-$wgLogHeaders['renameuser'] = 'renameuserlogpagetext';
-# $wgLogActions['renameuser/renameuser'] = 'renameuserlogentry';
-$wgLogActionsHandlers['renameuser/renameuser'] = 'wfRenameUserLogActionText'; // deal with old breakage
+$wgLogTypes[] = 'renameuser';
+$wgLogActionsHandlers['renameuser/renameuser'] = 'RenameuserLogFormatter';
-/**
- * @param $type
- * @param $action
- * @param $title Title
- * @param $skin Skin
- * @param $params array
- * @param $filterWikilinks bool
- * @return String
- */
-function wfRenameUserLogActionText( $type, $action, $title = null, $skin = null, $params = array(), $filterWikilinks = false ) {
- if ( !$title || $title->getNamespace() !== NS_USER ) {
- $rv = ''; // handled in comment, the old way
- } else {
- $titleLink = $skin ?
- $skin->makeLinkObj( $title, htmlspecialchars( $title->getPrefixedText() ) ) : htmlspecialchars( $title->getText() );
- # Add title to params
- array_unshift( $params, $titleLink );
- $rv = wfMsg( 'renameuserlogentry', $params );
- }
- return $rv;
-}
+$wgAutoloadClasses['RenameuserHooks'] = __DIR__ . '/Renameuser.hooks.php';
+$wgAutoloadClasses['RenameUserJob'] = __DIR__ . '/RenameUserJob.php';
+$wgAutoloadClasses['RenameuserLogFormatter'] = __DIR__ . '/RenameuserLogFormatter.php';
+$wgAutoloadClasses['RenameuserSQL'] = __DIR__ . '/RenameuserSQL.php';
+$wgAutoloadClasses['SpecialRenameuser'] = __DIR__ . '/specials/SpecialRenameuser.php';
-$wgAutoloadClasses['SpecialRenameuser'] = dirname( __FILE__ ) . '/Renameuser_body.php';
-$wgAutoloadClasses['RenameUserJob'] = dirname( __FILE__ ) . '/RenameUserJob.php';
$wgSpecialPages['Renameuser'] = 'SpecialRenameuser';
$wgSpecialPageGroups['Renameuser'] = 'users';
$wgJobClasses['renameUser'] = 'RenameUserJob';
-$wgHooks['ShowMissingArticle'][] = 'wfRenameUserShowLog';
-$wgHooks['ContributionsToolLinks'][] = 'wfRenameuserOnContribsLink';
-
-/**
- * Show a log if the user has been renamed and point to the new username.
- * Don't show the log if the $oldUserName exists as a user.
- *
- * @param $article Article
- */
-function wfRenameUserShowLog( $article ) {
- global $wgOut;
- $title = $article->getTitle();
- $oldUser = User::newFromName( $title->getBaseText() );
- if ( ($title->getNamespace() == NS_USER || $title->getNamespace() == NS_USER_TALK ) && ($oldUser && $oldUser->isAnon() )) {
- // Get the title for the base userpage
- $page = Title::makeTitle( NS_USER, str_replace( ' ', '_', $title->getBaseText() ) )->getPrefixedDBkey();
- LogEventsList::showLogExtract( $wgOut, 'renameuser', $page, '', array( 'lim' => 10, 'showIfEmpty' => false,
- 'msgKey' => array( 'renameuser-renamed-notice', $title->getBaseText() ) ) );
- }
- return true;
-}
-
-/**
- * @param $id
- * @param $nt Title
- * @param $tools
- * @return bool
- */
-function wfRenameuserOnContribsLink( $id, $nt, &$tools ) {
- global $wgUser;
+$wgHooks['ShowMissingArticle'][] = 'RenameuserHooks::onShowMissingArticle';
+$wgHooks['ContributionsToolLinks'][] = 'RenameuserHooks::onContributionsToolLinks';
- if ( $wgUser->isAllowed( 'renameuser' ) && $id ) {
- $tools[] = Linker::link(
- SpecialPage::getTitleFor( 'Renameuser' ),
- wfMsg( 'renameuser-linkoncontribs' ),
- array( 'title' => wfMsgExt( 'renameuser-linkoncontribs-text', 'parseinline' ) ),
- array( 'oldusername' => $nt->getText() )
- );
- }
- return true;
-}
diff --git a/extensions/Renameuser/RenameuserLogFormatter.php b/extensions/Renameuser/RenameuserLogFormatter.php
new file mode 100644
index 00000000..c7c4678d
--- /dev/null
+++ b/extensions/Renameuser/RenameuserLogFormatter.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * LogFormatter for renameuser/renameuser logs
+ */
+
+class RenameuserLogFormatter extends LogFormatter {
+
+ protected function getMessageParameters() {
+ $params = parent::getMessageParameters();
+ /* Current format:
+ * 1,2,3: normal logformatter params
+ * 4: old username
+ * (legaciest doesn't have this at all, all in comment)
+ * (legacier uses this as new name and stores old name in target)
+ * 5: new username
+ * 6: number of edits the user had at the time
+ * (not available except in newest log entries)
+ * Note that the arrays are zero-indexed, while message parameters
+ * start from 1, so substract one to get array entries below.
+ */
+
+ if ( !isset( $params[3] ) ) {
+ // The oldest format
+ return $params;
+ } elseif ( !isset( $params[4] ) ) {
+ // See comments above
+ $params[4] = $params[3];
+ $params[3] = $this->entry->getTarget()->getText();
+ }
+
+ // Nice link to old user page
+ $title = Title::makeTitleSafe( NS_USER, $params[3] );
+ $link = $this->myPageLink( $title, $params[3] );
+ $params[3] = Message::rawParam( $link );
+
+ // Nice link to new user page
+ $title = Title::makeTitleSafe( NS_USER, $params[4] );
+ $link = $this->myPageLink( $title, $params[4] );
+ $params[4] = Message::rawParam( $link );
+
+ return $params;
+ }
+
+ protected function myPageLink( Title $title = null, $text ) {
+ if ( !$this->plaintext ) {
+ $text = htmlspecialchars( $text );
+ $link = Linker::link( $title, $text );
+ } else {
+ if ( !$title instanceof Title ) {
+ $link = "[[User:$text]]";
+ } else {
+ $link = '[[' . $title->getPrefixedText() . ']]';
+ }
+ }
+ return $link;
+ }
+
+ public function getMessageKey() {
+ $key = parent::getMessageKey();
+ $params = $this->extractParameters();
+
+ // Very old log format, everything in comment
+ if ( !isset( $params[3] ) ) {
+ return "$key-legaciest";
+ } elseif ( !isset( $params[5] ) ) {
+ return "$key-legacier";
+ }
+
+ return $key;
+ }
+}
diff --git a/extensions/Renameuser/RenameuserSQL.php b/extensions/Renameuser/RenameuserSQL.php
new file mode 100644
index 00000000..eeb879a0
--- /dev/null
+++ b/extensions/Renameuser/RenameuserSQL.php
@@ -0,0 +1,241 @@
+<?php
+/**
+ * Class which performs the actual renaming of users
+ */
+
+class RenameuserSQL {
+ /**
+ * The old username
+ *
+ * @var string
+ * @access private
+ */
+ var $old;
+
+ /**
+ * The new username
+ *
+ * @var string
+ * @access private
+ */
+ var $new;
+
+ /**
+ * The user ID
+ *
+ * @var integer
+ * @access private
+ */
+ var $uid;
+
+ /**
+ * The the tables => fields to be updated
+ *
+ * @var array
+ * @access private
+ */
+ var $tables;
+
+ /**
+ * Flag that can be set to false, in case another process has already started
+ * the updates and the old username may have already been renamed in the user table.
+ *
+ * @var bool
+ * @access private
+ */
+ var $checkIfUserExists;
+
+ /**
+ * Constructor
+ *
+ * @param $old string The old username
+ * @param $new string The new username
+ * @param $uid
+ * @param $options Array of options
+ * 'checkIfUserExists' - bool, whether to update the user table
+ */
+ function __construct( $old, $new, $uid, $options = array() ) {
+ $this->old = $old;
+ $this->new = $new;
+ $this->uid = $uid;
+ $this->checkIfUserExists = true;
+
+ if ( isset ( $options['checkIfUserExists'] ) ) {
+ $this->checkIfUserExists = $options['checkIfUserExists'];
+ }
+
+ $this->tables = array(); // Immediate updates
+ $this->tables['image'] = array( 'img_user_text', 'img_user' );
+ $this->tables['oldimage'] = array( 'oi_user_text', 'oi_user' );
+ $this->tables['filearchive'] = array('fa_user_text','fa_user');
+ $this->tablesJob = array(); // Slow updates
+ // If this user has a large number of edits, use the jobqueue
+ if ( User::newFromId( $uid )->getEditCount() > RENAMEUSER_CONTRIBJOB ) {
+ $this->tablesJob['revision'] = array( 'rev_user_text', 'rev_user', 'rev_timestamp' );
+ $this->tablesJob['archive'] = array( 'ar_user_text', 'ar_user', 'ar_timestamp' );
+ $this->tablesJob['logging'] = array( 'log_user_text', 'log_user', 'log_timestamp' );
+ } else {
+ $this->tables['revision'] = array( 'rev_user_text', 'rev_user' );
+ $this->tables['archive'] = array( 'ar_user_text', 'ar_user' );
+ $this->tables['logging'] = array( 'log_user_text', 'log_user' );
+ }
+ // Recent changes is pretty hot, deadlocks occur if done all at once
+ if ( wfQueriesMustScale() ) {
+ $this->tablesJob['recentchanges'] = array( 'rc_user_text', 'rc_user', 'rc_timestamp' );
+ } else {
+ $this->tables['recentchanges'] = array( 'rc_user_text', 'rc_user' );
+ }
+
+ wfRunHooks( 'RenameUserSQL', array( $this ) );
+ }
+
+ /**
+ * Do the rename operation
+ */
+ function rename() {
+ global $wgMemc, $wgAuth, $wgUpdateRowsPerJob;
+
+ wfProfileIn( __METHOD__ );
+
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->begin();
+ wfRunHooks( 'RenameUserPreRename', array( $this->uid, $this->old, $this->new ) );
+
+ // Rename and touch the user before re-attributing edits,
+ // this avoids users still being logged in and making new edits while
+ // being renamed, which leaves edits at the old name.
+ $dbw->update( 'user',
+ array( 'user_name' => $this->new, 'user_touched' => $dbw->timestamp() ),
+ array( 'user_name' => $this->old, 'user_id' => $this->uid ),
+ __METHOD__
+ );
+
+ if ( !$dbw->affectedRows() && $this->checkIfUserExists ) {
+ $dbw->rollback();
+ return false;
+ }
+
+ // Reset token to break login with central auth systems.
+ // Again, avoids user being logged in with old name.
+ $user = User::newFromId( $this->uid );
+ $authUser = $wgAuth->getUserInstance( $user );
+ $authUser->resetAuthToken();
+
+ // Delete from memcached.
+ $wgMemc->delete( wfMemcKey( 'user', 'id', $this->uid ) );
+
+ // Update ipblock list if this user has a block in there.
+ $dbw->update( 'ipblocks',
+ array( 'ipb_address' => $this->new ),
+ array( 'ipb_user' => $this->uid, 'ipb_address' => $this->old ),
+ __METHOD__ );
+ // Update this users block/rights log. Ideally, the logs would be historical,
+ // but it is really annoying when users have "clean" block logs by virtue of
+ // being renamed, which makes admin tasks more of a pain...
+ $oldTitle = Title::makeTitle( NS_USER, $this->old );
+ $newTitle = Title::makeTitle( NS_USER, $this->new );
+ $dbw->update( 'logging',
+ array( 'log_title' => $newTitle->getDBkey() ),
+ array( 'log_type' => array( 'block', 'rights' ),
+ 'log_namespace' => NS_USER,
+ 'log_title' => $oldTitle->getDBkey() ),
+ __METHOD__ );
+ // Do immediate updates!
+ foreach ( $this->tables as $table => $fieldSet ) {
+ list( $nameCol, $userCol ) = $fieldSet;
+ $dbw->update( $table,
+ array( $nameCol => $this->new ),
+ array( $nameCol => $this->old, $userCol => $this->uid ),
+ __METHOD__
+ );
+ }
+
+ // Increase time limit (like CheckUser); this can take a while...
+ if ( $this->tablesJob ) {
+ wfSuppressWarnings();
+ set_time_limit( 120 );
+ wfRestoreWarnings();
+ }
+
+ $jobs = array(); // jobs for all tables
+ // Construct jobqueue updates...
+ // FIXME: if a bureaucrat renames a user in error, he/she
+ // must be careful to wait until the rename finishes before
+ // renaming back. This is due to the fact the the job "queue"
+ // is not really FIFO, so we might end up with a bunch of edits
+ // randomly mixed between the two new names. Some sort of rename
+ // lock might be in order...
+ foreach ( $this->tablesJob as $table => $params ) {
+ $userTextC = $params[0]; // some *_user_text column
+ $userIDC = $params[1]; // some *_user column
+ $timestampC = $params[2]; // some *_timestamp column
+
+ $res = $dbw->select( $table,
+ array( $timestampC ),
+ array( $userTextC => $this->old, $userIDC => $this->uid ),
+ __METHOD__,
+ array( 'ORDER BY' => "$timestampC ASC" )
+ );
+
+ $jobParams = array();
+ $jobParams['table'] = $table;
+ $jobParams['column'] = $userTextC;
+ $jobParams['uidColumn'] = $userIDC;
+ $jobParams['timestampColumn'] = $timestampC;
+ $jobParams['oldname'] = $this->old;
+ $jobParams['newname'] = $this->new;
+ $jobParams['userID'] = $this->uid;
+ // Timestamp column data for index optimizations
+ $jobParams['minTimestamp'] = '0';
+ $jobParams['maxTimestamp'] = '0';
+ $jobParams['count'] = 0;
+
+ // Insert jobs into queue!
+ while ( true ) {
+ $row = $dbw->fetchObject( $res );
+ if ( !$row ) {
+ # If there are any job rows left, add it to the queue as one job
+ if ( $jobParams['count'] > 0 ) {
+ $jobs[] = Job::factory( 'renameUser', $oldTitle, $jobParams );
+ }
+ break;
+ }
+ # Since the ORDER BY is ASC, set the min timestamp with first row
+ if ( $jobParams['count'] == 0 ) {
+ $jobParams['minTimestamp'] = $row->$timestampC;
+ }
+ # Keep updating the last timestamp, so it should be correct
+ # when the last item is added.
+ $jobParams['maxTimestamp'] = $row->$timestampC;
+ # Update row counter
+ $jobParams['count']++;
+ # Once a job has $wgUpdateRowsPerJob rows, add it to the queue
+ if ( $jobParams['count'] >= $wgUpdateRowsPerJob ) {
+ $jobs[] = Job::factory( 'renameUser', $oldTitle, $jobParams );
+ $jobParams['minTimestamp'] = '0';
+ $jobParams['maxTimestamp'] = '0';
+ $jobParams['count'] = 0;
+ }
+ }
+ $dbw->freeResult( $res );
+ }
+
+ if ( count( $jobs ) > 0 ) {
+ Job::safeBatchInsert( $jobs ); // don't commit yet
+ }
+
+ // Commit the transaction
+ $dbw->commit();
+
+ // Delete from memcached again to make sure
+ $wgMemc->delete( wfMemcKey( 'user', 'id', $this->uid ) );
+
+ // Clear caches and inform authentication plugins
+ $user = User::newFromId( $this->uid );
+ $wgAuth->updateExternalDB( $user );
+ wfRunHooks( 'RenameUserComplete', array( $this->uid, $this->old, $this->new ) );
+
+ wfProfileOut( __METHOD__ );
+ return true;
+ }
+}
diff --git a/extensions/Renameuser/Renameuser_body.php b/extensions/Renameuser/Renameuser_body.php
deleted file mode 100644
index be55a99a..00000000
--- a/extensions/Renameuser/Renameuser_body.php
+++ /dev/null
@@ -1,577 +0,0 @@
-<?php
-if ( !defined( 'MEDIAWIKI' ) ) {
- echo "RenameUser extension\n";
- exit( 1 );
-}
-
-/**
- * Special page allows authorised users to rename
- * user accounts
- */
-class SpecialRenameuser extends SpecialPage {
- /**
- * Constructor
- */
- public function __construct() {
- parent::__construct( 'Renameuser', 'renameuser' );
- }
-
- /**
- * Show the special page
- *
- * @param mixed $par Parameter passed to the page
- */
- public function execute( $par ) {
- global $wgOut, $wgUser, $wgRequest, $wgContLang;
- global $wgCapitalLinks;
-
- $this->setHeaders();
- $wgOut->addWikiMsg( 'renameuser-summary' );
-
- if ( !$wgUser->isAllowed( 'renameuser' ) ) {
- $wgOut->permissionRequired( 'renameuser' );
- return;
- }
-
- if ( wfReadOnly() ) {
- $wgOut->readOnlyPage();
- return;
- }
-
- if( $wgUser->isBlocked() ){
- $wgOut->blockedPage();
- }
-
- $showBlockLog = $wgRequest->getBool( 'submit-showBlockLog' );
- $oldnamePar = trim( str_replace( '_', ' ', $wgRequest->getText( 'oldusername', $par ) ) );
- $oldusername = Title::makeTitle( NS_USER, $oldnamePar );
- // Force uppercase of newusername, otherwise wikis with wgCapitalLinks=false can create lc usernames
- $newusername = Title::makeTitleSafe( NS_USER, $wgContLang->ucfirst( $wgRequest->getText( 'newusername' ) ) );
- $oun = is_object( $oldusername ) ? $oldusername->getText() : '';
- $nun = is_object( $newusername ) ? $newusername->getText() : '';
- $token = $wgUser->editToken();
- $reason = $wgRequest->getText( 'reason' );
-
- $move_checked = $wgRequest->getBool( 'movepages', !$wgRequest->wasPosted());
- $suppress_checked = $wgRequest->getCheck( 'suppressredirect' );
-
- $warnings = array();
- if ( $oun && $nun && !$wgRequest->getCheck( 'confirmaction' ) ) {
- wfRunHooks( 'RenameUserWarning', array( $oun, $nun, &$warnings ) );
- }
-
- $wgOut->addHTML(
- Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl(), 'id' => 'renameuser' ) ) .
- Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', null, wfMsg( 'renameuser' ) ) .
- Xml::openElement( 'table', array( 'id' => 'mw-renameuser-table' ) ) .
- "<tr>
- <td class='mw-label'>" .
- Xml::label( wfMsg( 'renameuserold' ), 'oldusername' ) .
- "</td>
- <td class='mw-input'>" .
- Xml::input( 'oldusername', 20, $oun, array( 'type' => 'text', 'tabindex' => '1' ) ) . ' ' .
- "</td>
- </tr>
- <tr>
- <td class='mw-label'>" .
- Xml::label( wfMsg( 'renameusernew' ), 'newusername' ) .
- "</td>
- <td class='mw-input'>" .
- Xml::input( 'newusername', 20, $nun, array( 'type' => 'text', 'tabindex' => '2' ) ) .
- "</td>
- </tr>
- <tr>
- <td class='mw-label'>" .
- Xml::label( wfMsg( 'renameuserreason' ), 'reason' ) .
- "</td>
- <td class='mw-input'>" .
- Xml::input( 'reason', 40, $reason, array( 'type' => 'text', 'tabindex' => '3', 'maxlength' => 255 ) ) .
- "</td>
- </tr>"
- );
- if ( $wgUser->isAllowed( 'move' ) ) {
- $wgOut->addHTML( "
- <tr>
- <td>&#160;
- </td>
- <td class='mw-input'>" .
- Xml::checkLabel( wfMsg( 'renameusermove' ), 'movepages', 'movepages',
- $move_checked, array( 'tabindex' => '4' ) ) .
- "</td>
- </tr>"
- );
-
- if ( $wgUser->isAllowed( 'suppressredirect' ) ) {
- $wgOut->addHTML( "
- <tr>
- <td>&#160;
- </td>
- <td class='mw-input'>" .
- Xml::checkLabel( wfMsg( 'renameusersuppress' ), 'suppressredirect', 'suppressredirect',
- $suppress_checked, array( 'tabindex' => '5' ) ) .
- "</td>
- </tr>"
- );
- }
- }
- if ( $warnings ) {
- $warningsHtml = array();
- foreach ( $warnings as $warning )
- $warningsHtml[] = is_array( $warning ) ?
- call_user_func_array( 'wfMsgWikiHtml', $warning ) :
- wfMsgHtml( $warning );
- $wgOut->addHTML( "
- <tr>
- <td class='mw-label'>" . wfMsgWikiHtml( 'renameuserwarnings' ) . "
- </td>
- <td class='mw-input'>" .
- '<ul style="color: red; font-weight: bold"><li>' .
- implode( '</li><li>', $warningsHtml ) . '</li></ul>' .
- "</td>
- </tr>"
- );
- $wgOut->addHTML( "
- <tr>
- <td>&#160;
- </td>
- <td class='mw-input'>" .
- Xml::checkLabel( wfMsg( 'renameuserconfirm' ), 'confirmaction', 'confirmaction',
- false, array( 'tabindex' => '6' ) ) .
- "</td>
- </tr>"
- );
- }
- $wgOut->addHTML( "
- <tr>
- <td>&#160;
- </td>
- <td class='mw-submit'>" .
- Xml::submitButton( wfMsg( 'renameusersubmit' ), array( 'name' => 'submit',
- 'tabindex' => '7', 'id' => 'submit' ) ) .
- ' ' .
- Xml::submitButton(
- wfMsg( 'renameuser-submit-blocklog' ),
- array (
- 'name' => 'submit-showBlockLog',
- 'id' => 'submit-showBlockLog',
- 'tabindex' => '8'
- )
- ) .
- "</td>
- </tr>" .
- Xml::closeElement( 'table' ) .
- Xml::closeElement( 'fieldset' ) .
- Html::hidden( 'token', $token ) .
- Xml::closeElement( 'form' ) . "\n"
- );
-
- // Show block log if requested
- if ( $showBlockLog && is_object( $oldusername ) ) {
- $this->showLogExtract( $oldusername, 'block', $wgOut ) ;
- return;
- }
-
- if ( $wgRequest->getText( 'token' ) === '' ) {
- # They probably haven't even submitted the form, so don't go further.
- return;
- } elseif ( $warnings ) {
- # Let user read warnings
- return;
- } elseif ( !$wgRequest->wasPosted() || !$wgUser->matchEditToken( $wgRequest->getVal( 'token' ) ) ) {
- $wgOut->wrapWikiMsg( "<div class=\"errorbox\">$1</div>", 'renameuser-error-request' );
- return;
- } elseif ( !is_object( $oldusername ) ) {
- $wgOut->wrapWikiMsg( "<div class=\"errorbox\">$1</div>",
- array( 'renameusererrorinvalid', $wgRequest->getText( 'oldusername' ) ) );
- return;
- } elseif ( !is_object( $newusername ) ) {
- $wgOut->wrapWikiMsg( "<div class=\"errorbox\">$1</div>",
- array( 'renameusererrorinvalid', $wgRequest->getText( 'newusername' ) ) );
- return;
- } elseif ( $oldusername->getText() == $newusername->getText() ) {
- $wgOut->wrapWikiMsg( "<div class=\"errorbox\">$1</div>", 'renameuser-error-same-user' );
- return;
- }
-
- // Suppress username validation of old username
- $olduser = User::newFromName( $oldusername->getText(), false );
- $newuser = User::newFromName( $newusername->getText(), 'creatable' );
-
- // It won't be an object if for instance "|" is supplied as a value
- if ( !is_object( $olduser ) ) {
- $wgOut->wrapWikiMsg( "<div class=\"errorbox\">$1</div>",
- array( 'renameusererrorinvalid', $oldusername->getText() ) );
- return;
- }
- if ( !is_object( $newuser ) || !User::isCreatableName( $newuser->getName() ) ) {
- $wgOut->wrapWikiMsg( "<div class=\"errorbox\">$1</div>",
- array( 'renameusererrorinvalid', $newusername->getText() ) );
- return;
- }
-
- // Check for the existence of lowercase oldusername in database.
- // Until r19631 it was possible to rename a user to a name with first character as lowercase
- if ( $oldusername->getText() !== $wgContLang->ucfirst( $oldusername->getText() ) ) {
- // oldusername was entered as lowercase -> check for existence in table 'user'
- $dbr = wfGetDB( DB_SLAVE );
- $uid = $dbr->selectField( 'user', 'user_id',
- array( 'user_name' => $oldusername->getText() ),
- __METHOD__ );
- if ( $uid === false ) {
- if ( !$wgCapitalLinks ) {
- $uid = 0; // We are on a lowercase wiki but lowercase username does not exists
- } else {
- // We are on a standard uppercase wiki, use normal
- $uid = $olduser->idForName();
- $oldusername = Title::makeTitleSafe( NS_USER, $olduser->getName() );
- }
- }
- } else {
- // oldusername was entered as upperase -> standard procedure
- $uid = $olduser->idForName();
- }
-
- if ( $uid == 0 ) {
- $wgOut->wrapWikiMsg( "<div class=\"errorbox\">$1</div>",
- array( 'renameusererrordoesnotexist', $oldusername->getText() ) );
- return;
- }
-
- if ( $newuser->idForName() != 0 ) {
- $wgOut->wrapWikiMsg( "<div class=\"errorbox\">$1</div>",
- array( 'renameusererrorexists', $newusername->getText() ) );
- return;
- }
-
- // Always get the edits count, it will be used for the log message
- $contribs = User::edits( $uid );
-
- // Give other affected extensions a chance to validate or abort
- if ( !wfRunHooks( 'RenameUserAbort', array( $uid, $oldusername->getText(), $newusername->getText() ) ) ) {
- return;
- }
-
- // Do the heavy lifting...
- $rename = new RenameuserSQL( $oldusername->getText(), $newusername->getText(), $uid );
- if ( !$rename->rename() ) {
- return;
- }
-
- // If this user is renaming his/herself, make sure that Title::moveTo()
- // doesn't make a bunch of null move edits under the old name!
- if ( $wgUser->getId() == $uid ) {
- $wgUser->setName( $newusername->getText() );
- }
-
- // Log this rename
- $log = new LogPage( 'renameuser' );
- $log->addEntry( 'renameuser', $oldusername, wfMsgExt( 'renameuser-log', array( 'parsemag', 'content' ),
- $wgContLang->formatNum( $contribs ), $reason ), $newusername->getText() );
-
- // Move any user pages
- if ( $wgRequest->getCheck( 'movepages' ) && $wgUser->isAllowed( 'move' ) ) {
- $dbr = wfGetDB( DB_SLAVE );
-
- $pages = $dbr->select(
- 'page',
- array( 'page_namespace', 'page_title' ),
- array(
- 'page_namespace IN (' . NS_USER . ',' . NS_USER_TALK . ')',
- '(page_title ' . $dbr->buildLike( $oldusername->getDBkey() . '/', $dbr->anyString() ) .
- ' OR page_title = ' . $dbr->addQuotes( $oldusername->getDBkey() ) . ')'
- ),
- __METHOD__
- );
-
- $suppressRedirect = false;
-
- if ( $wgRequest->getCheck( 'suppressredirect' ) && $wgUser->isAllowed( 'suppressredirect' ) ) {
- $suppressRedirect = true;
- }
-
- $output = '';
- foreach ( $pages as $row ) {
- $oldPage = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
- $newPage = Title::makeTitleSafe( $row->page_namespace,
- preg_replace( '!^[^/]+!', $newusername->getDBkey(), $row->page_title ) );
- # Do not autodelete or anything, title must not exist
- if ( $newPage->exists() && !$oldPage->isValidMoveTarget( $newPage ) ) {
- $link = Linker::linkKnown( $newPage );
- $output .= Html::rawElement(
- 'li',
- array( 'class' => 'mw-renameuser-pe' ),
- wfMessage( 'renameuser-page-exists' )->rawParams( $link )->escaped()
- );
- } else {
- $success = $oldPage->moveTo(
- $newPage,
- false,
- wfMessage(
- 'renameuser-move-log',
- $oldusername->getText(),
- $newusername->getText() )->inContentLanguage()->text(),
- !$suppressRedirect
- );
- if ( $success === true ) {
- # oldPage is not known in case of redirect suppression
- $oldLink = Linker::link( $oldPage, null, array(), array( 'redirect' => 'no' ) );
-
- # newPage is always known because the move was successful
- $newLink = Linker::linkKnown( $newPage );
-
- $output .= Html::rawElement(
- 'li',
- array( 'class' => 'mw-renameuser-pm' ),
- wfMessage( 'renameuser-page-moved' )->rawParams( $oldLink, $newLink )->escaped()
- );
- } else {
- $oldLink = Linker::linkKnown( $oldPage );
- $newLink = Linker::link( $newPage );
- $output .= Html::rawElement(
- 'li', array( 'class' => 'mw-renameuser-pu' ),
- wfMessage( 'renameuser-page-unmoved' )->rawParams( $oldLink, $newLink )->escaped()
- );
- }
- }
- }
- if ( $output ) {
- $wgOut->addHTML( Html::rawElement( 'ul', array(), $output ) );
- }
- }
-
- // Output success message stuff :)
- $wgOut->wrapWikiMsg( "<div class=\"successbox\">$1</div><br style=\"clear:both\" />",
- array( 'renameusersuccess', $oldusername->getText(), $newusername->getText() ) );
- }
-
- /**
- * @param $username Title
- * @param $type
- * @param $out OutputPage
- */
- function showLogExtract( $username, $type, &$out ) {
- # Show relevant lines from the logs:
- $out->addHTML( Xml::element( 'h2', null, LogPage::logName( $type ) ) . "\n" );
- LogEventsList::showLogExtract( $out, $type, $username->getPrefixedText() );
- }
-}
-
-class RenameuserSQL {
- /**
- * The old username
- *
- * @var string
- * @access private
- */
- var $old;
-
- /**
- * The new username
- *
- * @var string
- * @access private
- */
- var $new;
-
- /**
- * The user ID
- *
- * @var integer
- * @access private
- */
- var $uid;
-
- /**
- * The the tables => fields to be updated
- *
- * @var array
- * @access private
- */
- var $tables;
-
- /**
- * Constructor
- *
- * @param $old string The old username
- * @param $new string The new username
- * @param $uid
- */
- function __construct( $old, $new, $uid ) {
- $this->old = $old;
- $this->new = $new;
- $this->uid = $uid;
-
- $this->tables = array(); // Immediate updates
- $this->tables['image'] = array( 'img_user_text', 'img_user' );
- $this->tables['oldimage'] = array( 'oi_user_text', 'oi_user' );
- $this->tables['filearchive'] = array('fa_user_text','fa_user');
- $this->tablesJob = array(); // Slow updates
- // If this user has a large number of edits, use the jobqueue
- if ( User::edits( $this->uid ) > RENAMEUSER_CONTRIBJOB ) {
- $this->tablesJob['revision'] = array( 'rev_user_text', 'rev_user', 'rev_timestamp' );
- $this->tablesJob['archive'] = array( 'ar_user_text', 'ar_user', 'ar_timestamp' );
- $this->tablesJob['logging'] = array( 'log_user_text', 'log_user', 'log_timestamp' );
- } else {
- $this->tables['revision'] = array( 'rev_user_text', 'rev_user' );
- $this->tables['archive'] = array( 'ar_user_text', 'ar_user' );
- $this->tables['logging'] = array( 'log_user_text', 'log_user' );
- }
- // Recent changes is pretty hot, deadlocks occur if done all at once
- if ( wfQueriesMustScale() ) {
- $this->tablesJob['recentchanges'] = array( 'rc_user_text', 'rc_user', 'rc_timestamp' );
- } else {
- $this->tables['recentchanges'] = array( 'rc_user_text', 'rc_user' );
- }
-
- wfRunHooks( 'RenameUserSQL', array( $this ) );
- }
-
- /**
- * Do the rename operation
- */
- function rename() {
- global $wgMemc, $wgAuth, $wgUpdateRowsPerJob;
-
- wfProfileIn( __METHOD__ );
-
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin();
- wfRunHooks( 'RenameUserPreRename', array( $this->uid, $this->old, $this->new ) );
-
- // Rename and touch the user before re-attributing edits,
- // this avoids users still being logged in and making new edits while
- // being renamed, which leaves edits at the old name.
- $dbw->update( 'user',
- array( 'user_name' => $this->new, 'user_touched' => $dbw->timestamp() ),
- array( 'user_name' => $this->old ),
- __METHOD__
- );
- if ( !$dbw->affectedRows() ) {
- $dbw->rollback();
- return false;
- }
- // Reset token to break login with central auth systems.
- // Again, avoids user being logged in with old name.
- $user = User::newFromId( $this->uid );
- $authUser = $wgAuth->getUserInstance( $user );
- $authUser->resetAuthToken();
-
- // Delete from memcached.
- $wgMemc->delete( wfMemcKey( 'user', 'id', $this->uid ) );
-
- // Update ipblock list if this user has a block in there.
- $dbw->update( 'ipblocks',
- array( 'ipb_address' => $this->new ),
- array( 'ipb_user' => $this->uid, 'ipb_address' => $this->old ),
- __METHOD__ );
- // Update this users block/rights log. Ideally, the logs would be historical,
- // but it is really annoying when users have "clean" block logs by virtue of
- // being renamed, which makes admin tasks more of a pain...
- $oldTitle = Title::makeTitle( NS_USER, $this->old );
- $newTitle = Title::makeTitle( NS_USER, $this->new );
- $dbw->update( 'logging',
- array( 'log_title' => $newTitle->getDBkey() ),
- array( 'log_type' => array( 'block', 'rights' ),
- 'log_namespace' => NS_USER,
- 'log_title' => $oldTitle->getDBkey() ),
- __METHOD__ );
- // Do immediate updates!
- foreach ( $this->tables as $table => $fieldSet ) {
- list( $nameCol, $userCol ) = $fieldSet;
- $dbw->update( $table,
- array( $nameCol => $this->new ),
- array( $nameCol => $this->old, $userCol => $this->uid ),
- __METHOD__
- );
- }
-
- // Increase time limit (like CheckUser); this can take a while...
- if ( $this->tablesJob ) {
- wfSuppressWarnings();
- set_time_limit( 120 );
- wfRestoreWarnings();
- }
-
- $jobs = array(); // jobs for all tables
- // Construct jobqueue updates...
- // FIXME: if a bureaucrat renames a user in error, he/she
- // must be careful to wait until the rename finishes before
- // renaming back. This is due to the fact the the job "queue"
- // is not really FIFO, so we might end up with a bunch of edits
- // randomly mixed between the two new names. Some sort of rename
- // lock might be in order...
- foreach ( $this->tablesJob as $table => $params ) {
- $userTextC = $params[0]; // some *_user_text column
- $userIDC = $params[1]; // some *_user column
- $timestampC = $params[2]; // some *_timestamp column
-
- $res = $dbw->select( $table,
- array( $timestampC ),
- array( $userTextC => $this->old, $userIDC => $this->uid ),
- __METHOD__,
- array( 'ORDER BY' => "$timestampC ASC" )
- );
-
- $jobParams = array();
- $jobParams['table'] = $table;
- $jobParams['column'] = $userTextC;
- $jobParams['uidColumn'] = $userIDC;
- $jobParams['timestampColumn'] = $timestampC;
- $jobParams['oldname'] = $this->old;
- $jobParams['newname'] = $this->new;
- $jobParams['userID'] = $this->uid;
- // Timestamp column data for index optimizations
- $jobParams['minTimestamp'] = '0';
- $jobParams['maxTimestamp'] = '0';
- $jobParams['count'] = 0;
-
- // Insert jobs into queue!
- while ( true ) {
- $row = $dbw->fetchObject( $res );
- if ( !$row ) {
- # If there are any job rows left, add it to the queue as one job
- if ( $jobParams['count'] > 0 ) {
- $jobs[] = Job::factory( 'renameUser', $oldTitle, $jobParams );
- }
- break;
- }
- # Since the ORDER BY is ASC, set the min timestamp with first row
- if ( $jobParams['count'] == 0 ) {
- $jobParams['minTimestamp'] = $row->$timestampC;
- }
- # Keep updating the last timestamp, so it should be correct
- # when the last item is added.
- $jobParams['maxTimestamp'] = $row->$timestampC;
- # Update row counter
- $jobParams['count']++;
- # Once a job has $wgUpdateRowsPerJob rows, add it to the queue
- if ( $jobParams['count'] >= $wgUpdateRowsPerJob ) {
- $jobs[] = Job::factory( 'renameUser', $oldTitle, $jobParams );
- $jobParams['minTimestamp'] = '0';
- $jobParams['maxTimestamp'] = '0';
- $jobParams['count'] = 0;
- }
- }
- $dbw->freeResult( $res );
- }
-
- if ( count( $jobs ) > 0 ) {
- Job::safeBatchInsert( $jobs ); // don't commit yet
- }
-
- // Commit the transaction
- $dbw->commit();
-
- // Delete from memcached again to make sure
- $wgMemc->delete( wfMemcKey( 'user', 'id', $this->uid ) );
-
- // Clear caches and inform authentication plugins
- $user = User::newFromId( $this->uid );
- $wgAuth->updateExternalDB( $user );
- wfRunHooks( 'RenameUserComplete', array( $this->uid, $this->old, $this->new ) );
-
- wfProfileOut( __METHOD__ );
- return true;
- }
-}
diff --git a/extensions/Renameuser/SpecialRenameuser.php b/extensions/Renameuser/SpecialRenameuser.php
index 60052eca..0a78eed0 100644
--- a/extensions/Renameuser/SpecialRenameuser.php
+++ b/extensions/Renameuser/SpecialRenameuser.php
@@ -1 +1,5 @@
-<?php require dirname( __FILE__ ) . '/Renameuser.php';
+<?php
+/*
+ * Renameuser file for b/c... this sucks
+ */
+require_once( __DIR__ . '/Renameuser.php' );
diff --git a/extensions/Renameuser/cleanupArchiveUserText.php b/extensions/Renameuser/cleanupArchiveUserText.php
new file mode 100644
index 00000000..8599f3c2
--- /dev/null
+++ b/extensions/Renameuser/cleanupArchiveUserText.php
@@ -0,0 +1,59 @@
+<?php
+
+$IP = getenv( 'MW_INSTALL_PATH' );
+if ( $IP === false ) {
+ $IP = __DIR__ . '/../..';
+}
+
+require_once( "$IP/maintenance/Maintenance.php" );
+
+/**
+ * @ingroup Maintenance
+ */
+class CleanupArchiveUserText extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Update the archive table where users were previously renamed, but their archive contributions were not";
+ }
+
+ public function execute() {
+ $dbw = wfGetDB( DB_MASTER );
+ do {
+ $res = $dbw->select(
+ array( 'archive', 'user' ),
+ array( 'DISTINCT ar_user_text', 'user_name', 'ar_user' ),
+ array(
+ 'ar_user_text <> user_name',
+ 'ar_user = user_id',
+ ),
+ __METHOD__,
+ array( 'LIMIT' => 50 )
+ );
+ $results = 0;
+ foreach( $res as $row ) {
+ $results++;
+ $this->output( "User:{$row->ar_user_text} => User:{$row->user_name} " );
+ $dbw->update(
+ 'archive',
+ array( 'ar_user_text' => $row->user_name ),
+ array(
+ 'ar_user_text' => $row->ar_user_text,
+ 'ar_user' => $row->ar_user,
+ ),
+ __METHOD__,
+ array( 'LIMIT' => 50 )
+ );
+ $affected = $dbw->affectedRows();
+ $this->output( "$affected rows\n" );
+ wfWaitForSlaves();
+ }
+ } while ( $results === 50 );
+ }
+
+ public function getDbType() {
+ return Maintenance::DB_ADMIN;
+ }
+}
+
+$maintClass = "CleanupArchiveUserText";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/extensions/Renameuser/hooks.txt b/extensions/Renameuser/hooks.txt
new file mode 100644
index 00000000..8889b9f8
--- /dev/null
+++ b/extensions/Renameuser/hooks.txt
@@ -0,0 +1,34 @@
+This document describes how event hooks work in the Renameuser extension.
+
+For a more comprehensive guide to hooks, navigate to your root MediaWiki
+directory and read docs/hooks.txt.
+
+== Events and parameters ==
+This is a list of known events and parameters; please add to it if you're going
+to add events to the Renameuser extension.
+
+'RenameUserAbort': Allows the renaming to be aborted
+$uid: The user ID
+$oldusername: The old username
+$newusername: The new username
+
+'RenameUserComplete': Called after a user was renamed
+$uid: The user ID
+$old: The new username
+$new: The old username
+
+'RenameUserPreRename': Called before a user is renamed
+$uid: The user ID
+$old: The new username
+$new: The old username
+
+'RenameUserSQL': Called in the constructer of RenameuserSQL (which performs
+ the actual renaming of users)
+&$this: RenameuserSQL
+
+'RenameUserWarning': Called on Special:Renameuser before a user is renamed.
+ Will show the given warnings to the user and ask for a confirmation.
+$oun: The old username
+$nun: The new username
+&$warnings: Array with message key(s) or message key(s) and parameter(s) for
+ the warnings to be shown
diff --git a/extensions/Renameuser/renameUserCleanup.php b/extensions/Renameuser/renameUserCleanup.php
index 374cb891..25c4a1fd 100644
--- a/extensions/Renameuser/renameUserCleanup.php
+++ b/extensions/Renameuser/renameUserCleanup.php
@@ -25,7 +25,7 @@
$IP = getenv( 'MW_INSTALL_PATH' );
if ( $IP === false ) {
- $IP = dirname( __FILE__ ) . '/../..';
+ $IP = __DIR__ . '/../..';
}
require_once( "$IP/maintenance/Maintenance.php" );
diff --git a/extensions/Renameuser/specials/SpecialRenameuser.php b/extensions/Renameuser/specials/SpecialRenameuser.php
new file mode 100644
index 00000000..d869e2a8
--- /dev/null
+++ b/extensions/Renameuser/specials/SpecialRenameuser.php
@@ -0,0 +1,383 @@
+<?php
+
+/**
+ * Special page that allows authorised users to rename
+ * user accounts
+ */
+class SpecialRenameuser extends SpecialPage {
+ public function __construct() {
+ parent::__construct( 'Renameuser', 'renameuser' );
+ }
+
+ /**
+ * Show the special page
+ *
+ * @param mixed $par Parameter passed to the page
+ * @throws UserBlockedError|PermissionsError
+ * @return void
+ */
+ public function execute( $par ) {
+ global $wgContLang, $wgCapitalLinks;
+
+ $this->setHeaders();
+
+ $out = $this->getOutput();
+ $out->addWikiMsg( 'renameuser-summary' );
+
+ $user = $this->getUser();
+ if ( !$user->isAllowed( 'renameuser' ) ) {
+ throw new PermissionsError( 'renameuser' );
+ }
+
+ if ( wfReadOnly() ) {
+ $out->readOnlyPage();
+ return;
+ }
+
+ if( $user->isBlocked() ){
+ throw new UserBlockedError( $this->getUser()->mBlock );
+ }
+
+ $request = $this->getRequest();
+ $showBlockLog = $request->getBool( 'submit-showBlockLog' );
+ $oldnamePar = trim( str_replace( '_', ' ', $request->getText( 'oldusername', $par ) ) );
+ $oldusername = Title::makeTitle( NS_USER, $oldnamePar );
+ // Force uppercase of newusername, otherwise wikis with wgCapitalLinks=false can create lc usernames
+ $newusername = Title::makeTitleSafe( NS_USER, $wgContLang->ucfirst( $request->getText( 'newusername' ) ) );
+ $oun = is_object( $oldusername ) ? $oldusername->getText() : '';
+ $nun = is_object( $newusername ) ? $newusername->getText() : '';
+ $token = $user->getEditToken();
+ $reason = $request->getText( 'reason' );
+
+ $move_checked = $request->getBool( 'movepages', !$request->wasPosted());
+ $suppress_checked = $request->getCheck( 'suppressredirect' );
+
+ $warnings = array();
+ if ( $oun && $nun && !$request->getCheck( 'confirmaction' ) ) {
+ wfRunHooks( 'RenameUserWarning', array( $oun, $nun, &$warnings ) );
+ }
+
+ $out->addHTML(
+ Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl(), 'id' => 'renameuser' ) ) .
+ Xml::openElement( 'fieldset' ) .
+ Xml::element( 'legend', null, $this->msg( 'renameuser' )->text() ) .
+ Xml::openElement( 'table', array( 'id' => 'mw-renameuser-table' ) ) .
+ "<tr>
+ <td class='mw-label'>" .
+ Xml::label( $this->msg( 'renameuserold' )->text(), 'oldusername' ) .
+ "</td>
+ <td class='mw-input'>" .
+ Xml::input( 'oldusername', 20, $oun, array( 'type' => 'text', 'tabindex' => '1' ) ) . ' ' .
+ "</td>
+ </tr>
+ <tr>
+ <td class='mw-label'>" .
+ Xml::label( $this->msg( 'renameusernew' )->text(), 'newusername' ) .
+ "</td>
+ <td class='mw-input'>" .
+ Xml::input( 'newusername', 20, $nun, array( 'type' => 'text', 'tabindex' => '2' ) ) .
+ "</td>
+ </tr>
+ <tr>
+ <td class='mw-label'>" .
+ Xml::label( $this->msg( 'renameuserreason' )->text(), 'reason' ) .
+ "</td>
+ <td class='mw-input'>" .
+ Xml::input( 'reason', 40, $reason, array( 'type' => 'text', 'tabindex' => '3', 'maxlength' => 255 ) ) .
+ "</td>
+ </tr>"
+ );
+ if ( $user->isAllowed( 'move' ) ) {
+ $out->addHTML( "
+ <tr>
+ <td>&#160;
+ </td>
+ <td class='mw-input'>" .
+ Xml::checkLabel( $this->msg( 'renameusermove' )->text(), 'movepages', 'movepages',
+ $move_checked, array( 'tabindex' => '4' ) ) .
+ "</td>
+ </tr>"
+ );
+
+ if ( $user->isAllowed( 'suppressredirect' ) ) {
+ $out->addHTML( "
+ <tr>
+ <td>&#160;
+ </td>
+ <td class='mw-input'>" .
+ Xml::checkLabel(
+ $this->msg( 'renameusersuppress' )->text(),
+ 'suppressredirect',
+ 'suppressredirect',
+ $suppress_checked,
+ array( 'tabindex' => '5' )
+ ) .
+ "</td>
+ </tr>"
+ );
+ }
+ }
+ if ( $warnings ) {
+ $warningsHtml = array();
+ foreach ( $warnings as $warning ) {
+ $warningsHtml[] = is_array( $warning ) ?
+ $this->msg( $warning[0] )->rawParams( array_slice( $warning, 1 ) )->escaped() :
+ $this->msg( $warning )->escaped();
+ }
+
+ $out->addHTML( "
+ <tr>
+ <td class='mw-label'>" . $this->msg( 'renameuserwarnings' )->escaped() . "
+ </td>
+ <td class='mw-input'>" .
+ '<ul style="color: red; font-weight: bold"><li>' .
+ implode( '</li><li>', $warningsHtml ) . '</li></ul>' .
+ "</td>
+ </tr>"
+ );
+ $out->addHTML( "
+ <tr>
+ <td>&#160;
+ </td>
+ <td class='mw-input'>" .
+ Xml::checkLabel(
+ $this->msg( 'renameuserconfirm' )->text(),
+ 'confirmaction',
+ 'confirmaction',
+ false,
+ array( 'tabindex' => '6' )
+ ) .
+ "</td>
+ </tr>"
+ );
+ }
+ $out->addHTML( "
+ <tr>
+ <td>&#160;
+ </td>
+ <td class='mw-submit'>" .
+ Xml::submitButton(
+ $this->msg( 'renameusersubmit' )->text(),
+ array(
+ 'name' => 'submit',
+ 'tabindex' => '7',
+ 'id' => 'submit'
+ )
+ ) .
+ ' ' .
+ Xml::submitButton(
+ $this->msg( 'renameuser-submit-blocklog' )->text(),
+ array (
+ 'name' => 'submit-showBlockLog',
+ 'id' => 'submit-showBlockLog',
+ 'tabindex' => '8'
+ )
+ ) .
+ "</td>
+ </tr>" .
+ Xml::closeElement( 'table' ) .
+ Xml::closeElement( 'fieldset' ) .
+ Html::hidden( 'token', $token ) .
+ Xml::closeElement( 'form' ) . "\n"
+ );
+
+ // Show block log if requested
+ if ( $showBlockLog && is_object( $oldusername ) ) {
+ $this->showLogExtract( $oldusername, 'block', $out ) ;
+ return;
+ }
+
+ if ( $request->getText( 'token' ) === '' ) {
+ # They probably haven't even submitted the form, so don't go further.
+ return;
+ } elseif ( $warnings ) {
+ # Let user read warnings
+ return;
+ } elseif ( !$request->wasPosted() || !$user->matchEditToken( $request->getVal( 'token' ) ) ) {
+ $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>", 'renameuser-error-request' );
+ return;
+ } elseif ( !is_object( $oldusername ) ) {
+ $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>",
+ array( 'renameusererrorinvalid', $request->getText( 'oldusername' ) ) );
+ return;
+ } elseif ( !is_object( $newusername ) ) {
+ $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>",
+ array( 'renameusererrorinvalid', $request->getText( 'newusername' ) ) );
+ return;
+ } elseif ( $oldusername->getText() == $newusername->getText() ) {
+ $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>", 'renameuser-error-same-user' );
+ return;
+ }
+
+ // Suppress username validation of old username
+ $olduser = User::newFromName( $oldusername->getText(), false );
+ $newuser = User::newFromName( $newusername->getText(), 'creatable' );
+
+ // It won't be an object if for instance "|" is supplied as a value
+ if ( !is_object( $olduser ) ) {
+ $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>",
+ array( 'renameusererrorinvalid', $oldusername->getText() ) );
+ return;
+ }
+ if ( !is_object( $newuser ) || !User::isCreatableName( $newuser->getName() ) ) {
+ $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>",
+ array( 'renameusererrorinvalid', $newusername->getText() ) );
+ return;
+ }
+
+ // Check for the existence of lowercase oldusername in database.
+ // Until r19631 it was possible to rename a user to a name with first character as lowercase
+ if ( $oldusername->getText() !== $wgContLang->ucfirst( $oldusername->getText() ) ) {
+ // oldusername was entered as lowercase -> check for existence in table 'user'
+ $dbr = wfGetDB( DB_SLAVE );
+ $uid = $dbr->selectField( 'user', 'user_id',
+ array( 'user_name' => $oldusername->getText() ),
+ __METHOD__ );
+ if ( $uid === false ) {
+ if ( !$wgCapitalLinks ) {
+ $uid = 0; // We are on a lowercase wiki but lowercase username does not exists
+ } else {
+ // We are on a standard uppercase wiki, use normal
+ $uid = $olduser->idForName();
+ $oldusername = Title::makeTitleSafe( NS_USER, $olduser->getName() );
+ }
+ }
+ } else {
+ // oldusername was entered as upperase -> standard procedure
+ $uid = $olduser->idForName();
+ }
+
+ if ( $uid == 0 ) {
+ $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>",
+ array( 'renameusererrordoesnotexist', $oldusername->getText() ) );
+ return;
+ }
+
+ if ( $newuser->idForName() != 0 ) {
+ $out->wrapWikiMsg( "<div class=\"errorbox\">$1</div>",
+ array( 'renameusererrorexists', $newusername->getText() ) );
+ return;
+ }
+
+ // Always get the edits count, it will be used for the log message
+ $contribs = $olduser->getEditCount();
+
+ // Give other affected extensions a chance to validate or abort
+ if ( !wfRunHooks( 'RenameUserAbort', array( $uid, $oldusername->getText(), $newusername->getText() ) ) ) {
+ return;
+ }
+
+ // Do the heavy lifting...
+ $rename = new RenameuserSQL( $oldusername->getText(), $newusername->getText(), $uid );
+ if ( !$rename->rename() ) {
+ return;
+ }
+
+ // If this user is renaming his/herself, make sure that Title::moveTo()
+ // doesn't make a bunch of null move edits under the old name!
+ if ( $user->getId() == $uid ) {
+ $user->setName( $newusername->getText() );
+ }
+
+ // Log this rename, updated to 1.19+ Log form.
+ // https://www.mediawiki.org/wiki/Logging_to_Special:Log
+ $logEntry = new ManualLogEntry( 'renameuser', 'renameuser' );
+ $logEntry->setPerformer( $this->getUser() );
+ $logEntry->setTarget( $oldusername );
+ $logEntry->setComment( $reason );
+ $logEntry->setParameters( array(
+ '4::olduser' => $oldusername->getText(),
+ '5::newuser' => $newusername->getText(),
+ '6::edits' => $contribs
+ ) );
+ $logid = $logEntry->insert();
+ $logEntry->publish( $logid );
+
+ // Move any user pages
+ if ( $request->getCheck( 'movepages' ) && $user->isAllowed( 'move' ) ) {
+ $dbr = wfGetDB( DB_SLAVE );
+
+ $pages = $dbr->select(
+ 'page',
+ array( 'page_namespace', 'page_title' ),
+ array(
+ 'page_namespace IN (' . NS_USER . ',' . NS_USER_TALK . ')',
+ '(page_title ' . $dbr->buildLike( $oldusername->getDBkey() . '/', $dbr->anyString() ) .
+ ' OR page_title = ' . $dbr->addQuotes( $oldusername->getDBkey() ) . ')'
+ ),
+ __METHOD__
+ );
+
+ $suppressRedirect = false;
+
+ if ( $request->getCheck( 'suppressredirect' ) && $user->isAllowed( 'suppressredirect' ) ) {
+ $suppressRedirect = true;
+ }
+
+ $output = '';
+ foreach ( $pages as $row ) {
+ $oldPage = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+ $newPage = Title::makeTitleSafe( $row->page_namespace,
+ preg_replace( '!^[^/]+!', $newusername->getDBkey(), $row->page_title ) );
+ # Do not autodelete or anything, title must not exist
+ if ( $newPage->exists() && !$oldPage->isValidMoveTarget( $newPage ) ) {
+ $link = Linker::linkKnown( $newPage );
+ $output .= Html::rawElement(
+ 'li',
+ array( 'class' => 'mw-renameuser-pe' ),
+ wfMessage( 'renameuser-page-exists' )->rawParams( $link )->escaped()
+ );
+ } else {
+ $success = $oldPage->moveTo(
+ $newPage,
+ false,
+ wfMessage(
+ 'renameuser-move-log',
+ $oldusername->getText(),
+ $newusername->getText() )->inContentLanguage()->text(),
+ !$suppressRedirect
+ );
+ if ( $success === true ) {
+ # oldPage is not known in case of redirect suppression
+ $oldLink = Linker::link( $oldPage, null, array(), array( 'redirect' => 'no' ) );
+
+ # newPage is always known because the move was successful
+ $newLink = Linker::linkKnown( $newPage );
+
+ $output .= Html::rawElement(
+ 'li',
+ array( 'class' => 'mw-renameuser-pm' ),
+ wfMessage( 'renameuser-page-moved' )->rawParams( $oldLink, $newLink )->escaped()
+ );
+ } else {
+ $oldLink = Linker::linkKnown( $oldPage );
+ $newLink = Linker::link( $newPage );
+ $output .= Html::rawElement(
+ 'li', array( 'class' => 'mw-renameuser-pu' ),
+ wfMessage( 'renameuser-page-unmoved' )->rawParams( $oldLink, $newLink )->escaped()
+ );
+ }
+ }
+ }
+ if ( $output ) {
+ $out->addHTML( Html::rawElement( 'ul', array(), $output ) );
+ }
+ }
+
+ // Output success message stuff :)
+ $out->wrapWikiMsg( "<div class=\"successbox\">$1</div><br style=\"clear:both\" />",
+ array( 'renameusersuccess', $oldusername->getText(), $newusername->getText() ) );
+ }
+
+ /**
+ * @param $username Title
+ * @param $type
+ * @param $out OutputPage
+ */
+ function showLogExtract( $username, $type, &$out ) {
+ # Show relevant lines from the logs:
+ $logPage = new LogPage( $type );
+ $out->addHTML( Xml::element( 'h2', null, $logPage->getName()->text() ) . "\n" );
+ LogEventsList::showLogExtract( $out, $type, $username->getPrefixedText() );
+ }
+}
diff --git a/extensions/SpamBlacklist/BaseBlacklist.php b/extensions/SpamBlacklist/BaseBlacklist.php
new file mode 100644
index 00000000..280a614a
--- /dev/null
+++ b/extensions/SpamBlacklist/BaseBlacklist.php
@@ -0,0 +1,371 @@
+<?php
+
+/**
+ * Base class for different kinds of blacklists
+ */
+abstract class BaseBlacklist {
+ /**
+ * Array of blacklist sources
+ *
+ * @var array
+ */
+ public $files = array();
+
+ /**
+ * Array containing regexes to test against
+ *
+ * @var bool|array
+ */
+ protected $regexes = false;
+
+ /**
+ * Chance of receiving a warning when the filter is hit
+ *
+ * @var int
+ */
+ public $warningChance = 100;
+
+ /**
+ * @var int
+ */
+ public $warningTime = 600;
+
+ /**
+ * @var int
+ */
+ public $expiryTime = 900;
+
+ /**
+ * Array containing blacklists that extend BaseBlacklist
+ *
+ * @var array
+ */
+ private static $blacklistTypes = array(
+ 'spam' => 'SpamBlacklist',
+ 'email' => 'EmailBlacklist',
+ );
+
+ /**
+ * Array of blacklist instances
+ *
+ * @var array
+ */
+ private static $instances = array();
+
+ /**
+ * Constructor
+ *
+ * @param array $settings
+ */
+ function __construct( $settings = array() ) {
+ foreach ( $settings as $name => $value ) {
+ $this->$name = $value;
+ }
+ }
+
+ /**
+ * Adds a blacklist class to the registry
+ *
+ * @param $type string
+ * @param $class string
+ */
+ public static function addBlacklistType( $type, $class ) {
+ self::$blacklistTypes[$type] = $class;
+ }
+
+ /**
+ * Return the array of blacklist types currently defined
+ *
+ * @return array
+ */
+ public static function getBlacklistTypes() {
+ return self::$blacklistTypes;
+ }
+
+ /**
+ * Returns an instance of the given blacklist
+ *
+ * @param $type string Code for the blacklist
+ * @return BaseBlacklist
+ * @throws MWException
+ */
+ public static function getInstance( $type ) {
+ if ( !isset( self::$blacklistTypes[$type] ) ) {
+ throw new MWException( "Invalid blacklist type '$type' passed to " . __METHOD__ );
+ }
+
+ if ( !isset( self::$instances[$type] ) ) {
+ global $wgBlacklistSettings;
+
+ // Prevent notices
+ if ( !isset( $wgBlacklistSettings[$type] ) ) {
+ $wgBlacklistSettings[$type] = array();
+ }
+
+ self::$instances[$type] = new self::$blacklistTypes[$type]( $wgBlacklistSettings[$type] );
+ }
+
+ return self::$instances[$type];
+ }
+
+ /**
+ * Returns the code for the blacklist implementation
+ *
+ * @return string
+ */
+ abstract protected function getBlacklistType();
+
+ /**
+ * Check if the given local page title is a spam regex source.
+ *
+ * @param Title $title
+ * @return bool
+ */
+ public static function isLocalSource( Title $title ) {
+ global $wgDBname, $wgBlacklistSettings;
+
+ if( $title->getNamespace() == NS_MEDIAWIKI ) {
+ $sources = array();
+ foreach ( self::$blacklistTypes as $type => $class ) {
+ $type = ucfirst( $type );
+ $sources += array(
+ "$type-blacklist",
+ "$type-whitelist"
+ );
+ }
+
+ if( in_array( $title->getDBkey(), $sources ) ) {
+ return true;
+ }
+ }
+
+ $thisHttp = wfExpandUrl( $title->getFullUrl( 'action=raw' ), PROTO_HTTP );
+ $thisHttpRegex = '/^' . preg_quote( $thisHttp, '/' ) . '(?:&.*)?$/';
+
+ $files = array();
+ foreach ( self::$blacklistTypes as $type => $class ) {
+ if ( isset( $wgBlacklistSettings[$type]['files'] ) ) {
+ $files += $wgBlacklistSettings[$type]['files'];
+ }
+ }
+
+ foreach( $files as $fileName ) {
+ $matches = array();
+ if ( preg_match( '/^DB: (\w*) (.*)$/', $fileName, $matches ) ) {
+ if ( $wgDBname == $matches[1] ) {
+ if( $matches[2] == $title->getPrefixedDbKey() ) {
+ // Local DB fetch of this page...
+ return true;
+ }
+ }
+ } elseif( preg_match( $thisHttpRegex, $fileName ) ) {
+ // Raw view of this page
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns the type of blacklist from the given title
+ *
+ * @param Title $title
+ * @return bool|string
+ */
+ public static function getTypeFromTitle( Title $title ) {
+ $types = array_map( 'preg_quote', array_keys( self::$blacklistTypes ), array( '/' ) );
+ $regex = '/(' . implode( '|', $types ). ')-(?:Blacklist|Whitelist)/';
+
+ if ( preg_match( $regex, $title->getDBkey(), $m ) ) {
+ return strtolower( $m[1] );
+ }
+
+ return false;
+ }
+
+ /**
+ * Fetch local and (possibly cached) remote blacklists.
+ * Will be cached locally across multiple invocations.
+ * @return array set of regular expressions, potentially empty.
+ */
+ function getBlacklists() {
+ if( $this->regexes === false ) {
+ $this->regexes = array_merge(
+ $this->getLocalBlacklists(),
+ $this->getSharedBlacklists() );
+ }
+ return $this->regexes;
+ }
+
+ /**
+ * Returns the local blacklist
+ *
+ * @return array Regular expressions
+ */
+ public function getLocalBlacklists() {
+ return SpamRegexBatch::regexesFromMessage( "{$this->getBlacklistType()}-blacklist", $this );
+ }
+
+ /**
+ * Returns the (local) whitelist
+ *
+ * @return array Regular expressions
+ */
+ public function getWhitelists() {
+ return SpamRegexBatch::regexesFromMessage( "{$this->getBlacklistType()}-whitelist", $this );
+ }
+
+ /**
+ * Fetch (possibly cached) remote blacklists.
+ * @return array
+ */
+ function getSharedBlacklists() {
+ global $wgMemc, $wgDBname;
+ $listType = $this->getBlacklistType();
+ $fname = 'SpamBlacklist::getRegex';
+ wfProfileIn( $fname );
+
+ wfDebugLog( 'SpamBlacklist', "Loading $listType regex..." );
+
+ if ( count( $this->files ) == 0 ){
+ # No lists
+ wfDebugLog( 'SpamBlacklist', "no files specified\n" );
+ wfProfileOut( $fname );
+ return array();
+ }
+
+ // This used to be cached per-site, but that could be bad on a shared
+ // server where not all wikis have the same configuration.
+ $cachedRegexes = $wgMemc->get( "$wgDBname:{$listType}_blacklist_regexes" );
+ if( is_array( $cachedRegexes ) ) {
+ wfDebugLog( 'SpamBlacklist', "Got shared spam regexes from cache\n" );
+ wfProfileOut( $fname );
+ return $cachedRegexes;
+ }
+
+ $regexes = $this->buildSharedBlacklists();
+ $wgMemc->set( "$wgDBname:{$listType}_blacklist_regexes", $regexes, $this->expiryTime );
+
+ return $regexes;
+ }
+
+ function clearCache() {
+ global $wgMemc, $wgDBname;
+ $listType = $this->getBlacklistType();
+
+ $wgMemc->delete( "$wgDBname:{$listType}_blacklist_regexes" );
+ wfDebugLog( 'SpamBlacklist', "$listType blacklist local cache cleared.\n" );
+ }
+
+ function buildSharedBlacklists() {
+ $regexes = array();
+ $listType = $this->getBlacklistType();
+ # Load lists
+ wfDebugLog( 'SpamBlacklist', "Constructing $listType blacklist\n" );
+ foreach ( $this->files as $fileName ) {
+ $matches = array();
+ if ( preg_match( '/^DB: ([\w-]*) (.*)$/', $fileName, $matches ) ) {
+ $text = $this->getArticleText( $matches[1], $matches[2] );
+ } elseif ( preg_match( '/^http:\/\//', $fileName ) ) {
+ $text = $this->getHttpText( $fileName );
+ } else {
+ $text = file_get_contents( $fileName );
+ wfDebugLog( 'SpamBlacklist', "got from file $fileName\n" );
+ }
+
+ // Build a separate batch of regexes from each source.
+ // While in theory we could squeeze a little efficiency
+ // out of combining multiple sources in one regex, if
+ // there's a bad line in one of them we'll gain more
+ // from only having to break that set into smaller pieces.
+ $regexes = array_merge( $regexes,
+ SpamRegexBatch::regexesFromText( $text, $this, $fileName ) );
+ }
+
+ return $regexes;
+ }
+
+ function getHttpText( $fileName ) {
+ global $wgDBname, $messageMemc;
+ $listType = $this->getBlacklistType();
+
+ # HTTP request
+ # To keep requests to a minimum, we save results into $messageMemc, which is
+ # similar to $wgMemc except almost certain to exist. By default, it is stored
+ # in the database
+ #
+ # There are two keys, when the warning key expires, a random thread will refresh
+ # the real key. This reduces the chance of multiple requests under high traffic
+ # conditions.
+ $key = "{$listType}_blacklist_file:$fileName";
+ $warningKey = "$wgDBname:{$listType}filewarning:$fileName";
+ $httpText = $messageMemc->get( $key );
+ $warning = $messageMemc->get( $warningKey );
+
+ if ( !is_string( $httpText ) || ( !$warning && !mt_rand( 0, $this->warningChance ) ) ) {
+ wfDebugLog( 'SpamBlacklist', "Loading $listType blacklist from $fileName\n" );
+ $httpText = Http::get( $fileName );
+ if( $httpText === false ) {
+ wfDebugLog( 'SpamBlacklist', "Error loading $listType blacklist from $fileName\n" );
+ }
+ $messageMemc->set( $warningKey, 1, $this->warningTime );
+ $messageMemc->set( $key, $httpText, $this->expiryTime );
+ } else {
+ wfDebugLog( 'SpamBlacklist', "Got $listType blacklist from HTTP cache for $fileName\n" );
+ }
+ return $httpText;
+ }
+
+ /**
+ * Fetch an article from this or another local MediaWiki database.
+ * This is probably *very* fragile, and shouldn't be used perhaps.
+ *
+ * @param string $db
+ * @param string $article
+ * @return string
+ */
+ function getArticleText( $db, $article ) {
+ wfDebugLog( 'SpamBlacklist', "Fetching {$this->getBlacklistType()} spam blacklist from '$article' on '$db'...\n" );
+ global $wgDBname;
+ $dbr = wfGetDB( DB_READ );
+ $dbr->selectDB( $db );
+ $text = false;
+ if ( $dbr->tableExists( 'page' ) ) {
+ // 1.5 schema
+ $dbw = wfGetDB( DB_READ );
+ $dbw->selectDB( $db );
+ $revision = Revision::newFromTitle( Title::newFromText( $article ) );
+ if ( $revision ) {
+ $text = $revision->getText();
+ }
+ $dbw->selectDB( $wgDBname );
+ } else {
+ // 1.4 schema
+ $title = Title::newFromText( $article );
+ $text = $dbr->selectField( 'cur', 'cur_text', array( 'cur_namespace' => $title->getNamespace(),
+ 'cur_title' => $title->getDBkey() ), __METHOD__ );
+ }
+ $dbr->selectDB( $wgDBname );
+ return strval( $text );
+ }
+
+ /**
+ * Returns the start of the regex for matches
+ *
+ * @return string
+ */
+ public function getRegexStart() {
+ return '/[a-z0-9_\-.]*';
+ }
+
+ /**
+ * Returns the end of the regex for matches
+ *
+ * @param $batchSize
+ * @return string
+ */
+ public function getRegexEnd( $batchSize ) {
+ return ($batchSize > 0 ) ? '/Sim' : '/im';
+ }
+}
diff --git a/extensions/SpamBlacklist/EmailBlacklist.php b/extensions/SpamBlacklist/EmailBlacklist.php
new file mode 100644
index 00000000..9266b2e4
--- /dev/null
+++ b/extensions/SpamBlacklist/EmailBlacklist.php
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * Email Blacklisting
+ */
+class EmailBlacklist extends BaseBlacklist {
+
+ /**
+ * Returns the code for the blacklist implementation
+ *
+ * @return string
+ */
+ protected function getBlacklistType() {
+ return 'email';
+ }
+
+ /**
+ * Checks a User object for a blacklisted email address
+ *
+ * @param User $user
+ * @return bool True on valid email
+ */
+ public function checkUser( User $user ) {
+ $blacklists = $this->getBlacklists();
+ $whitelists = $this->getWhitelists();
+
+ // The email to check
+ $email = $user->getEmail();
+
+ if ( !count( $blacklists ) ) {
+ // Nothing to check
+ return true;
+ }
+
+ // Check for whitelisted email addresses
+ if ( is_array( $whitelists ) ) {
+ wfDebugLog( 'SpamBlacklist', "Excluding whitelisted email addresses from " . count( $whitelists ) .
+ " regexes: " . implode( ', ', $whitelists ) . "\n" );
+ foreach ( $whitelists as $regex ) {
+ if ( preg_match( $regex, $email ) ) {
+ // Whitelisted email
+ return true;
+ }
+ }
+ }
+
+
+ # Do the match
+ wfDebugLog( 'SpamBlacklist', "Checking e-mail address against " . count( $blacklists ) .
+ " regexes: " . implode( ', ', $blacklists ) . "\n" );
+ foreach ( $blacklists as $regex ) {
+ if ( preg_match( $regex, $email ) ) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/extensions/SpamBlacklist/README b/extensions/SpamBlacklist/README
new file mode 100644
index 00000000..c017efb4
--- /dev/null
+++ b/extensions/SpamBlacklist/README
@@ -0,0 +1,148 @@
+MediaWiki extension: SpamBlacklist
+----------------------------------
+
+SpamBlacklist is a simple edit filter extension. When someone tries to save the
+page, it checks the text against a potentially very large list of "bad"
+hostnames. If there is a match, it displays an error message to the user and
+refuses to save the page.
+
+To enable it, first download a copy of the SpamBlacklist directory and put it
+into your extensions directory. Then put the following at the end of your
+LocalSettings.php:
+
+require_once( "$IP/extensions/SpamBlacklist/SpamBlacklist.php" );
+
+The list of bad URLs can be drawn from multiple sources. These sources are
+configured with the $wgSpamBlacklistFiles global variable. This global variable
+can be set in LocalSettings.php, AFTER including SpamBlacklist.php.
+
+$wgSpamBlacklistFiles is an array, each value containing either a URL, a filename
+or a database location. Specifying a database location allows you to draw the
+blacklist from a page on your wiki. The format of the database location
+specifier is "DB: <db name> <title>".
+
+Example:
+
+require_once( "$IP/extensions/SpamBlacklist/SpamBlacklist.php" );
+$wgSpamBlacklistFiles = array(
+ "$IP/extensions/SpamBlacklist/wikimedia_blacklist", // Wikimedia's list
+
+// database title
+ "DB: wikidb My_spam_blacklist",
+);
+
+The local pages [[MediaWiki:Spam-blacklist]] and [[MediaWiki:Spam-whitelist]]
+will always be used, whatever additional files are listed.
+
+Compatibility
+-----------
+
+This extension is primarily maintained to run on the latest release version
+of MediaWiki (1.9.x as of this writing) and development versions.
+
+The current version *may* work as far back as 1.6.x, but will *not* work
+with 1.5.x or older. You may be able to dig older versions out of the
+Subversion repository which work with those versions, but if using
+Wikimedia's blacklist file you will likely have problems with failure
+due to the large size of the blacklist not being handled by old versions
+of the code.
+
+
+File format
+-----------
+
+In simple terms:
+ * Everything from a "#" character to the end of the line is a comment
+ * Every non-blank line is a regex fragment which will only match inside URLs
+
+Internally, a regex is formed which looks like this:
+
+ !http://[a-z0-9\-.]*(line 1|line 2|line 3|....)!Si
+
+A few notes about this format. It's not necessary to add www to the start of
+hostnames, the regex is designed to match any subdomain. Don't add patterns
+to your file which may run off the end of the URL, e.g. anything containing
+".*". Unlike in some similar systems, the line-end metacharacter "$" will not
+assert the end of the hostname, it'll assert the end of the page.
+
+Performance
+-----------
+
+This extension uses a small "loader" file, to avoid loading all the code on
+every page view. This means that page view performance will not be affected
+even if you are not running a PHP bytecode cache such as Turck MMCache. Note
+that a bytecode cache is strongly recommended for any MediaWiki installation.
+
+The regex match itself generally adds an insignificant overhead to page saves,
+on the order of 100ms in our experience. However loading the spam file from disk
+or the database, and constructing the regex, may take a significant amount of
+time depending on your hardware. If you find that enabling this extension slows
+down saves excessively, try installing MemCached or another supported data
+caching solution. The SpamBlacklist extension will cache the constructed regex
+if such a system is present.
+
+Caching behavior
+----------------
+
+Blacklist files loaded from remote web sites are cached locally, in the cache
+subsystem used for MediaWiki's localization. (This usually means the objectcache
+table on a default install.)
+
+By default, the list is cached for 15 minutes (if successfully fetched) or
+10 minutes (if the network fetch failed), after which point it will be fetched
+again when next requested. This should be a decent balance between avoiding
+too-frequent fetches if your site is frequently used and staying up to date.
+
+Fully-processed blacklist data may be cached in memcached or another shared
+memory cache if it's been configured in MediaWiki.
+
+
+Stability
+---------
+
+This extension has not been widely tested outside Wikimedia. Although it has
+been in production on Wikimedia websites since December 2004, it should be
+considered experimental. Its design is simple, with little input validation, so
+unexpected behavior due to incorrect regular expression input or non-standard
+configuration is entirely possible.
+
+Obtaining or making blacklists
+------------------------------
+
+The primary source for a MediaWiki-compatible blacklist file is the Wikimedia
+spam blacklist on meta:
+
+ http://meta.wikimedia.org/wiki/Spam_blacklist
+
+In the default configuration, the extension loads this list from our site
+once every 10-15 minutes.
+
+The Wikimedia spam blacklist can only be edited by trusted administrators.
+Wikimedia hosts large, diverse wikis with many thousands of external links,
+hence the Wikimedia blacklist is comparatively conservative in the links it
+blocks. You may want to add your own keyword blocks or even ccTLD blocks.
+You may suggest modifications to the Wikimedia blacklist at:
+
+ http://meta.wikimedia.org/wiki/Talk:Spam_blacklist
+
+To make maintenance of local lists easier, you may wish to add a DB: source to
+$wgSpamBlacklistFiles and hence create a blacklist on your wiki. If you do this,
+it is strongly recommended that you protect the page from general editing.
+Besides the obvious danger that someone may add a regex that matches everything,
+please note that an attacker with the ability to input arbitrary regular
+expressions may be able to generate segfaults in the PCRE library.
+
+Whitelisting
+------------
+
+You may sometimes find that a site listed in a centrally-maintained blacklist
+contains something you nonetheless want to link to.
+
+A local whitelist can be maintained by creating a [[MediaWiki:Spam-whitelist]]
+page and listing hostnames in it, using the same format as the blacklists.
+URLs matching the whitelist will be ignored locally.
+
+Copyright
+---------
+This extension and this documentation was written by Tim Starling and is
+ambiguously licensed.
diff --git a/extensions/SpamBlacklist/SpamBlacklist.i18n.php b/extensions/SpamBlacklist/SpamBlacklist.i18n.php
new file mode 100644
index 00000000..bd4e4f87
--- /dev/null
+++ b/extensions/SpamBlacklist/SpamBlacklist.i18n.php
@@ -0,0 +1,3568 @@
+<?php
+/**
+ * Internationalisation file for extension SpamBlacklist.
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$messages = array();
+
+$messages['en'] = array(
+ 'spam-blacklist' => ' #<!-- leave this line exactly as it is --> <pre>
+# External URLs matching this list will be blocked when added to a page.
+# This list affects only this wiki; refer also to the global blacklist.
+# For documentation see https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+# Syntax is as follows:
+# * Everything from a "#" character to the end of the line is a comment
+# * Every non-blank line is a regex fragment which will only match hosts inside URLs
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# External URLs matching this list will *not* be blocked even if they would
+# have been blocked by blacklist entries.
+#
+# Syntax is as follows:
+# * Everything from a "#" character to the end of the line is a comment
+# * Every non-blank line is a regex fragment which will only match hosts inside URLs
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'email-blacklist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Email addresses matching this list will be blocked from registering or sending emails
+# This list affects only this wiki; refer also to the global blacklist.
+# For documentation see https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+# Syntax is as follows:
+# * Everything from a "#" character to the end of the line is a comment
+# * Every non-blank line is a regex fragment which will only match hosts inside email addresses
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'email-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Email addresses matching this list will *not* be blocked even if they would
+# have been blocked by blacklist entries.
+#
+# Syntax is as follows:
+# * Everything from a "#" character to the end of the line is a comment
+# * Every non-blank line is a regex fragment which will only match hosts inside email addresses
+
+ #</pre> <!-- leave this line exactly as it is -->',
+
+ 'spam-blacklisted-email' => 'Blacklisted email address',
+ 'spam-blacklisted-email-text' => 'Your email address is currently blacklisted from sending emails to other users.',
+ 'spam-blacklisted-email-signup' => 'The given email address is currently blacklisted from use.',
+
+ 'spam-invalid-lines' => "The following spam blacklist {{PLURAL:$1|line is an|lines are}} invalid regular {{PLURAL:$1|expression|expressions}} and {{PLURAL:$1|needs|need}} to be corrected before saving the page:",
+ 'spam-blacklist-desc' => 'Regex-based anti-spam tool: [[MediaWiki:Spam-blacklist]] and [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Message documentation (Message documentation)
+ * @author Purodha
+ * @author SPQRobin
+ * @author Shirayuki
+ * @author Siebrand
+ * @author The Evil IP address
+ */
+$messages['qqq'] = array(
+ 'spam-blacklist' => "See also: [[MediaWiki:spam-whitelist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
+ 'spam-whitelist' => "See also: [[MediaWiki:spam-blacklist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
+ 'email-blacklist' => "See also: [[MediaWiki:email-whitelist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
+ 'email-whitelist' => "See also: [[MediaWiki:email-blacklist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
+ 'spam-blacklisted-email' => 'Title of errorpage when trying to send an email with a blacklisted e-mail address',
+ 'spam-blacklisted-email-text' => 'Text of errorpage when trying to send an e-mail with a blacklisted e-mail address',
+ 'spam-blacklisted-email-signup' => 'Error when trying to create an account with an invalid e-mail address',
+ 'spam-invalid-lines' => 'Used as an error message.
+
+This message is followed by a list of bad lines.
+
+Parameters:
+* $1 - the number of bad lines',
+ 'spam-blacklist-desc' => '{{desc|name=Spam Blacklist|url=http://www.mediawiki.org/wiki/Extension:SpamBlacklist}}',
+);
+
+/** Aragonese (aragonés)
+ * @author Juanpabl
+ */
+$messages['an'] = array(
+ 'spam-blacklist' => " # As URLs externas que concuerden con ista lista serán bloqueyatas quan s'encluyan en una pachina.
+ # Ista lista afecta sólo ta ista wiki; mire-se tamién a lista negra global.
+ # Más decumentación en https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# A sintaxi ye asinas:
+# * Tot o que bi ha dende un carácter \"#\" dica a fin d'a linia ye un comentario
+# * As linias no buedas son fragmentos d'expresions regulars que sólo concordarán con hosts adintro d'as URLs
+
+ #</pre> <!-- leave this line exactly as it is -->",
+ 'spam-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
+# As URLs externas que concuerden con ista lista *no* serán bloqueyatas
+# mesmo si han estato bloqueyatas por dentradas d'a lista negra.
+#
+# A sintaxi ye asinas:
+# * Tot o que bi ha dende o carácter \"#\" dica a fin d'a linia ye un comentario
+# * As linias no buedas ye un fragmento d'expresión regular que sólo concordarán con hosts adintro d'as URLs
+
+ #</pre> <!-- leave this line exactly as it is -->",
+ 'email-blacklist' => '# As adrezas de correu electronico que coincidan con ista lista se bloqueyarán ta o rechistro u ninviamiento de correus!
+# Ista lista no afecta que a iste wiki; Mire-se tamién a lista negra global.
+# Ta la documentación, mire-se https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#<!-- Deixe ista linia exactament como ye --> <pre>
+#
+# A sintaxi ye a siguient:
+ # * Tot texto a la dreita d\'o caracter "#" dica la fin d\'a linia ye un comentario
+ # * Toda linia que no sía en blanco ye un fragmento de codigo que compararán os servidors con as adrezas de correu electronico
+#</pre> <!-- Deixe ista linia como ye-->',
+ 'email-whitelist' => " #<!-- Deixe ista linia como ye --> <pre>
+# As adrezas de correu electronico que amaneixen en ista lista *no* serán bloqueyadas mesmo si s'hesen habiu de bloquiar por amaneixer en a lista negra.
+#
+ #</pre> <!-- Deixe ista linia como ye-->
+# A sintaxi ye a siguient:
+# * Tot texto a la dreita d'o caracter \"#\" dica a fin d'a linia ye un comentario
+# * Toda linia que no sía en blanco ye un fragmento de codigo que os servidors compararán con as adrezas de correu electronico",
+ 'spam-blacklisted-email' => 'Adreza de correu electronico en a lista negra',
+ 'spam-blacklisted-email-text' => 'A suya adreza de correu-e ye agora en a lista negra, y no puede ninviar correu ta atros usuarios.',
+ 'spam-blacklisted-email-signup' => "L'adreza de correu-e que ha dau ye actualment en a lista negra, y no se puede fer servir.",
+ 'spam-invalid-lines' => "{{PLURAL:$1|A linia siguient ye una|As linias siguients son}} {{PLURAL:$1|expresión regular|expresions regulars}} y {{PLURAL:$1|ha|han}} d'estar correchitas antes d'alzar a pachina:",
+ 'spam-blacklist-desc' => 'Ferramienta anti-spam basata en expresions regulars (regex): [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Arabic (العربية)
+ * @author Meno25
+ * @author OsamaK
+ */
+$messages['ar'] = array(
+ 'spam-blacklist' => ' # الوصلات الخارجية التي تطابق هذه القائمة سيتم منعها عند إضاÙتها لصÙحة.
+ # هذه القائمة تؤثر Ùقط على هذه الويكي؛ ارجع أيضا للقائمة السوداء العامة.
+ # للوثائق انظر https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- اترك هذا السطر تماما كما هو --> <pre>
+#
+# الصيغة كالتالي:
+# * كل شيء من علامة "#" إلى آخر السطر هو تعليق
+# * كل سطر غير Ùارغ هو تعبير منتظم يواÙÙ‚ Ùقط المضيÙين داخل الوصلات الخارجية
+
+ #</pre> <!-- اترك هذا السطر تماما كما هو -->',
+ 'spam-whitelist' => ' #<!-- اترك هذا السطر تماما كما هو --> <pre>
+# الوصلات الخارجية التي تطابق هذه القائمة *لن* يتم منعها حتى لو
+# كانت ممنوعة بواسطة مدخلات القائمة السوداء.
+#
+# الصيغة كالتالي:
+# * كل شيء من علامة "#" إلى آخر السطر هو تعليق
+# * كل سطر غير Ùارغ هو تعبير منتظم يطابق Ùقط المضيÙين داخل الوصلات الخارجية
+
+ #</pre> <!-- اترك هذا السطر تماما كما هو -->',
+ 'spam-invalid-lines' => '{{PLURAL:$1||السطر التالي|السطران التاليان|السطور التالية}} ÙÙŠ قائمة السبام السوداء {{PLURAL:$1|ليس تعبيرًا منتظمًا صحيحًا|ليسا تعبيرين منتظمين صحيحين|ليست تعبيرات منتظمة صحيحة}} Ùˆ{{PLURAL:$1||يحتاج|يحتاجان|تحتاج}} إلى أن {{PLURAL:$1||يصحح|يصححان|تصحح}} قبل Ø­Ùظ الصÙحة:',
+ 'spam-blacklist-desc' => 'أداة ضد السبام تعتمد على التعبيرات المنتظمة: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Egyptian Spoken Arabic (مصرى)
+ * @author Meno25
+ * @author Ramsis II
+ */
+$messages['arz'] = array(
+ 'spam-blacklist' => ' # اللينكات الخارجية اللى بتطابق الليستة دى Ø­ تتمنع لما تضا٠لصÙحة.
+ # اللستة دى بتأثر بس على الويكى دى؛ ارجع كمان للبلاك ليست العامة.
+ # للوثايق شو٠https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- سيب السطر دا زى ما هو كدا بالظبط--> <pre>
+#
+# الصيغة كدا:
+# * كل حاجة من علامة "#" لحد آخر السطر هو تعليق
+# * كل سطر مش Ùاضى هو تعبير منتظم بيواÙÙ‚ بس المضيÙين جوه الوصلات الخارجية
+
+ #</pre> <!-- سيب السطر دا زى ما هو كدا بالظبط-->',
+ 'spam-whitelist' => ' #<!-- سيب السطر دا زى ما هو كدا بالظبط --> <pre>
+# اللينكات الخارجية اللى بتطابق اللستة دى *مش* ح تتمنع حتى لو
+# كانت ممنوعة بواسطة مدخلات البلاك ليست.
+#
+# الصيغة كدا:
+# * كل حاجة من علامة "#" لحد آخر السطر هو تعليق
+# * كل سطر مش Ùاضى هو تعبير منتظم بيطابق بس المضيÙين جوه الوصلات الخارجية
+
+ #</pre> <!-- سيب السطر دا زى ما هو كدا بالظبط-->',
+ 'spam-invalid-lines' => '{{PLURAL:$1|السطر دا|السطور دول}} اللى ÙÙ‰ السبام بلاك ليست {{PLURAL:$1|هو تعبير منتظم |هى تعبيرات منتظمة}} مش صح Ùˆ {{PLURAL:$1|محتاج|محتاجين}} تصليح قبل Ø­Ùظ الصÙحة:',
+ 'spam-blacklist-desc' => 'اداة انتي-سبام مبنية على اساس ريجيكس: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Assamese (অসমীয়া)
+ * @author Gitartha.bordoloi
+ */
+$messages['as'] = array(
+ 'spam-blacklist' => '# à¦à¦‡ তালিকাৰ লগত মিলা বাহিৰা URLবোৰ পৃষà§à¦ à¦¾à¦¤ যোগ কৰোà¦à¦¤à§‡ অৱৰোধ কৰা হ\'ব।
+# à¦à¦‡ তালিকাই কেৱল à¦à¦‡ ৱিকিত পà§à§°à¦­à¦¾à§± পেলায়; গোলকীয় বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿà¦–নো চাওক।
+# নথিকৰণৰ বাবে https://www.mediawiki.org/wiki/Extension:SpamBlacklist চাওক।
+# <!-- leave this line exactly as it is --> <pre>
+#
+# বিনà§à¦¯à¦¾à¦¸ তলত দিয়া ধৰণৰ:
+# * "#" চিহà§à¦¨à§° পৰা শাৰীৰ শেষলৈকে সকলোখিনিয়েই মনà§à¦¤à¦¬à§à¦¯à¥¤
+# * পà§à§°à¦¤à¦¿à¦Ÿà§‹ অশূনà§à¦¯ শাৰী à¦à¦•à§‹à¦Ÿà¦¾ ৰেজেকà§à¦¸ খণà§à¦¡à¦¾à¦‚শ যি কেৱল URLৰ ভিতৰৰ hostৰ লগত মিলিব
+
+#</pre> <!-- leave this line exactly as it is -->',
+ 'spam-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
+# à¦à¦‡ তালিকাৰ লগত মিলা বাহিৰা URLসমূহ অৱৰোধ কৰা *নহ'ব* যদিও সেইবোৰ
+# বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿ ভà§à¦•à§à¦¤à¦¿à§° দà§à¦¬à¦¾à§°à¦¾ অৱৰোধ হ'ব।
+#
+ #</pre> <!-- leave this line exactly as it is -->",
+ 'email-blacklist' => '# à¦à¦‡ তালিকাৰ লগত মিলা ই-মেইল ঠিকনাৰ পৰা পঞà§à¦œà§€à¦¯à¦¼à¦¨ বা ই-মেইল পঠিওৱা অৱৰোধ কৰা হ\'ব।
+# à¦à¦‡ তালিকাই কেৱল ঠৱিকিত পà§à§°à¦­à¦¾à§± পেলায়; গোলকীয় বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿà¦–নো চাওক।
+# নথিকৰণৰ বাবে https://www.mediawiki.org/wiki/Extension:SpamBlacklist চাওক।
+#<!-- leave this line exactly as it is --> <pre>
+#
+# বিনà§à¦¯à¦¾à¦¸ তলত দিয়া ধৰণৰ:
+# * "#" চিহà§à¦¨à§° পৰা শাৰীৰ শেষলৈকে সকলোখিনিয়েই মনà§à¦¤à¦¬à§à¦¯à¥¤
+# * পà§à§°à¦¤à¦¿à¦Ÿà§‹ অশূনà§à¦¯ শাৰী à¦à¦Ÿà¦¾ ৰেজেকà§à¦¸ খণà§à¦¡à¦¾à¦‚শ যি কেৱল ই-মেইল ঠিকনাবোৰৰ ভিতৰৰ হ\'ষà§à¦Ÿà§° লগত মিলিব।
+
+#</pre> <!-- leave this line exactly as it is -->',
+ 'email-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
+# à¦à¦‡ তালিকাৰ লগত মিলা বাহিৰা ই-মেইলসমূহ অৱৰোধ কৰা *নহ'ব* যদিও সেইবোৰ
+# বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿ ভà§à¦•à§à¦¤à¦¿à§° দà§à¦¬à¦¾à§°à¦¾ অৱৰোধ হ'ব পাৰে।
+#
+ #</pre> <!-- leave this line exactly as it is -->
+# বিনà§à¦¯à¦¾à¦¸ তলত দিয়া ধৰণৰ:
+# * \"#\" চিহà§à¦¨à§° পৰা শাৰীৰ শেষলৈকে সকলোখিনি মনà§à¦¤à¦¬à§à¦¯à¥¤
+3 * পà§à§°à¦¤à¦¿à¦Ÿà§‹ অশূনà§à¦¯ শাৰী à¦à¦Ÿà¦¾ ৰেজেকà§à¦¸ খণà§à¦¡à¦¾à¦‚শ যি কেৱল ই-মেইল ঠিকনাৰ ভিতৰৰ হ'ষà§à¦Ÿà§° লগত মিলিব।",
+ 'spam-blacklisted-email' => 'বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿà§‡à¦¡ ই-মেইল ঠিকনা',
+ 'spam-blacklisted-email-text' => 'আন সদসà§à¦¯à¦²à§ˆ ই-মেইল পঠিয়াব নোৱাৰাকৈ আপোনাৰ ই-মেইল ঠিকনা বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿà§‡à¦¡ কৰা হৈছে।',
+ 'spam-blacklisted-email-signup' => 'ই-মেইল ঠিকনাটো বà§à¦¯à§±à¦¹à¦¾à§°à§° পৰা বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿà§‡à¦¡ কৰা হৈছে।',
+ 'spam-invalid-lines' => 'তলৰ সà§à¦ªà¦¾à¦® বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿà§° {{PLURAL:$1|শাৰীটোত|শাৰীসমূহত}} অবৈধ নিয়মিত {{PLURAL:$1|à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨|à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨}} আছে আৰৠসেইবোৰ পৃষà§à¦ à¦¾ সাà¦à¦šà¦¿ থোৱাৰ আগতেই ঠিক কৰাটো {{PLURAL:$1|পà§à§°à¦¯à¦¼à§‹à¦œà¦¨|পà§à§°à¦¯à¦¼à§‹à¦œà¦¨}}:',
+ 'spam-blacklist-desc' => 'ৰেজেকà§à¦¸-ভিতà§à¦¤à¦¿à¦• সà§à¦ªà¦¾à¦®à¦¬à¦¿à§°à§‹à¦§à§€ সà¦à¦œà§à¦²à¦¿: [[MediaWiki:Spam-blacklist]] আৰৠ[[MediaWiki:Spam-whitelist]]',
+);
+
+/** Asturian (asturianu)
+ * @author Esbardu
+ * @author Xuacu
+ */
+$messages['ast'] = array(
+ 'spam-blacklist' => ' # Les URLs que casen con esta llista se bloquiarán cuando s\'añadan a una páxina.
+ # Esta llista afeuta namái a esta wiki; mira tamién la llista negra global.
+ # Pa ver la documentación visita https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- dexa esta llinia exautamente como ta --> <pre>
+#
+# La sintaxis ye ésta:
+# * Tol testu dende un caráuter "#" hasta lo cabero la llinia ye un comentariu
+# * Toa llinia non balera ye un fragmentu regex qu\'afeuta namái a los sirvidores de les URLs
+
+ #</pre> <!-- dexa esta llinia exautamente como ta -->',
+ 'spam-whitelist' => ' #<!-- dexa esta llinia exautamente como ta --> <pre>
+# Les URLs esternes d\'esta llista *nun* se bloquiarán inda si quedaríen bloquiaes
+# por una entrada na llista negra.
+#
+# La sintaxis ye esta:
+# * Tol testu dende un caráuter "#" hasta lo cabero la llinia ye un comentariu
+# * Toa llinia non balera ye un fragmentu regex qu\'afeuta namái a les URLs especificaes
+ #</pre> <!-- dexa esta llinia exautamente como ta -->',
+ 'email-blacklist' => ' # Los correos que casen con esta llista tendrán torgao rexistrase o unviar corréu.
+ # Esta llista afeuta namái a esta wiki; mira tamién la llista negra global.
+ # Pa ver la documentación visita https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- dexa esta llinia exautamente como ta --> <pre>
+#
+# La sintaxis ye esta:
+# * Tol testu dende un caráuter "#" hasta lo cabero la llinia ye un comentariu
+# * Toa llinia non balera ye un fragmentu regex qu\'afeuta namái a los sirvidores de corréu
+
+ #</pre> <!-- dexa esta llinia exautamente como ta -->',
+ 'email-whitelist' => '#<!-- Dexa esta llinia tal y como ta --> <pre>
+# Los correos que casen con esta llista *nun* se bloquiarán, incluío si
+# los hubieren bloquiao entraes de la llista negra.
+#
+ #</pre> <!-- Dexa esta llinia tal y como ta -->
+# La sintaxis ye esta:
+# * Tol testu dende un caráuter "#" hasta lo cabero la llinia ye un comentariu
+# * Toa llinia non balera ye un fragmentu regex qu\'afeuta namái a los sirvidores de corréu',
+ 'spam-blacklisted-email' => 'Corréu electrónicu de la llista negra',
+ 'spam-blacklisted-email-text' => 'El to corréu electrónicu anguaño ta na llista negra y nun pue unviar correos electrónicos a otros usuarios.',
+ 'spam-blacklisted-email-signup' => "La direición de corréu electrónicu que se dio tien torgáu l'usu por tar anguaño na llista negra.",
+ 'spam-invalid-lines' => '{{PLURAL:$1|La siguiente llinia|Les siguientes llinies}} de la llista negra de spam {{PLURAL:$1|ye una espresión regular non válida|son espresiones regulares non válides}} y {{PLURAL:$1|necesita ser correxida|necesiten ser correxíes}} enantes de guardar la páxina:',
+ 'spam-blacklist-desc' => "Ferramienta antispam basada n'espresiones regulares: [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]",
+);
+
+/** Bashkir (башҡортÑа)
+ * @author Assele
+ */
+$messages['ba'] = array(
+ 'spam-blacklist' => ' # Был иÑемлеккә тап килгән тышҡы һылтанмаларҙы биттәргә Ó©Ò«Ñ‚Ó™Ò¯ тыйылаÑаҡ.
+ # Был иÑемлек ошо вики Ó©Ñөн генә ғәмәлгә Ñйә, шулай уҡ дөйөм ҡара иÑемлек бар.
+ # Тулыраҡ мәғлүмәт Ó©Ñөн https://www.mediawiki.org/wiki/Extension:SpamBlacklist ҡарағыҙ
+ #<!-- был юлды үҙгәртмәгеҙ --><pre>
+#
+# СинтакÑиÑ:
+# * # хәрефенән башлап юл аҙағына тиклем барыһы ла иҫкәрмә тип иҫәпләнә
+# * Һәр буш булмаған юл URL ÑÑендәге төйөнгә генә ҡулланылған регулÑÑ€ аңлатманың өлөшө булып тора
+
+ #</pre><!-- был юлды үҙгәртмәгеҙ -->',
+ 'spam-whitelist' => '#<!-- был юлды ниÑек бар, шулай ҡалдырығыҙ --> <pre>
+# Был иÑемлеккә тап килгән тышҡы һылтанмаларҙы биттәргә Ó©Ò«Ñ‚Ó™Ò¯, хатта улар ҡара иÑемлектә булһалар ҙа, *тыйылмаÑÑаҡ*.
+#
+# СинтакÑиÑ:
+# * # хәрефенән башлап юл аҙағына тиклем барыһы ла иҫкәрмә тип иҫәпләнә
+# * Һәр буш булмаған юл URL ÑÑендәге төйөнгә генә ҡулланылған регулÑÑ€ аңлатманың өлөшө булып тора
+#</pre> <!-- был юлды ниÑек бар, шулай ҡалдырығыҙ -->',
+ 'spam-invalid-lines' => 'Түбәндәге ҡара иÑемлек {{PLURAL:$1|юлында|юлдарында}} хаталы регулÑÑ€ {{PLURAL:$1|аңлатма|аңлатмалар}} бар һәм {{PLURAL:$1|ул|улар}} битте һаҡлар алдынан төҙәтелергә тейеш:',
+ 'spam-blacklist-desc' => 'РегулÑÑ€ аңлатмаларға нигеҙләнгән Ñпамға ҡаршы ҡорал: [[MediaWiki:Spam-blacklist]] һәм [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Southern Balochi (بلوچی مکرانی)
+ * @author Mostafadaneshvar
+ */
+$messages['bcc'] = array(
+ 'spam-blacklist-desc' => 'وسیله په ضد اسپم په اساس عبارات منظم: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
+ * @author EugeneZelenko
+ * @author Jim-by
+ */
+$messages['be-tarask'] = array(
+ 'spam-blacklist' => ' # Ð’Ð¾Ð½ÐºÐ°Ð²Ñ‹Ñ ÑпаÑылкі, ÑÐºÑ–Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ адпавÑдаць гÑтаму ÑьпіÑу, будуць блÑкавацца пры
+ # Ñпробе Ð´Ð°Ð´Ð°Ð½ÑŒÐ½Ñ Ð½Ð° Ñтаронку.
+ # ГÑÑ‚Ñ‹ ÑÑŒÐ¿Ñ–Ñ Ð±ÑƒÐ´Ð·Ðµ дзейнічаць толькі Ñž гÑтай вікі; Ñ–Ñнуе такÑама Ñ– глÑбальны чорны ÑьпіÑ.
+ # ДакумÑнтацыю гÑтай функцыі глÑдзіце на https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- пакіньце гÑÑ‚Ñ‹ радок такім, Ñкі ён Ñ‘Ñьць --> <pre>
+#
+# СынтакÑÑ–Ñ Ð½Ð°Ñтупны:
+# * УÑÑ‘, што пачынаецца з «#» Ñ– да канца радку, зьÑўлÑецца камÑнтарам
+# * УÑе непуÑÑ‚Ñ‹Ñ Ñ€Ð°Ð´ÐºÑ– зьÑўлÑюцца чаÑткамі Ñ€ÑгулÑрнага выразу, Ñкі будзе выкарыÑтоўвацца толькі
+# Ñž дачыненьні да назваў ÑÑрвÑраў у вонкавых ÑпаÑылках
+
+ #</pre> <!-- пакіньце гÑÑ‚Ñ‹ радок такім, Ñкі ён Ñ‘Ñьць -->',
+ 'spam-whitelist' => ' #<!-- пакіньце гÑÑ‚Ñ‹ радок такім, Ñкі ён Ñ‘Ñьць --> <pre>
+# Ð’Ð¾Ð½ÐºÐ°Ð²Ñ‹Ñ ÑпаÑылкі, ÑÐºÑ–Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ адпавÑдаць гÑтаму ÑьпіÑу, *нÑ* будуць блÑкавацца, нават калі Ñны
+# будуць адпавÑдаць чорнаму ÑьпіÑу
+#
+# СынтакÑÑ–Ñ Ð½Ð°Ñтупны:
+# * УÑÑ‘, што пачынаецца з «#» Ñ– да канца радка, зьÑўлÑецца камÑнтарам
+# * УÑе непуÑÑ‚Ñ‹Ñ Ñ€Ð°Ð´ÐºÑ– зьÑўлÑюцца чаÑткамі Ñ€ÑгулÑрнага выразу, Ñкі будзе выкарыÑтоўвацца толькі
+# Ñž дачыненьні да назваў ÑÑрвÑраў у вонкавых ÑпаÑылках
+
+ #</pre> <!-- пакіньце гÑÑ‚Ñ‹ радок такім, Ñкі ён Ñ‘Ñьць -->',
+ 'email-blacklist' => ' # Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ñ‹Ñ Ð»Ñ–ÑÑ‚Ñ‹, ÑÐºÑ–Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ адпавÑдаць гÑтаму ÑьпіÑу, будуць блÑкавацца пры
+ # Ñпробе адпраўкі.
+ # ГÑÑ‚Ñ‹ ÑÑŒÐ¿Ñ–Ñ Ð±ÑƒÐ´Ð·Ðµ дзейнічаць толькі Ñž гÑтай вікі; Ñ–Ñнуе такÑама Ñ– глÑбальны чорны ÑьпіÑ.
+ # ДакумÑнтацыю гÑтай функцыі глÑдзіце на https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- пакіньце гÑÑ‚Ñ‹ радок такім, Ñкі ён Ñ‘Ñьць --> <pre>
+#
+# СынтакÑÑ–Ñ Ð½Ð°Ñтупны:
+# * УÑÑ‘, што пачынаецца з «#» Ñ– да канца радку, зьÑўлÑецца камÑнтарам
+# * УÑе непуÑÑ‚Ñ‹Ñ Ñ€Ð°Ð´ÐºÑ– зьÑўлÑюцца чаÑткамі Ñ€ÑгулÑрнага выразу, Ñкі будзе выкарыÑтоўвацца толькі
+# Ñž дачыненьні да назваў ÑÑрвÑраў у Ñлектронных ліÑтах
+
+ #</pre> <!-- пакіньце гÑÑ‚Ñ‹ радок такім, Ñкі ён Ñ‘Ñьць -->',
+ 'email-whitelist' => ' #<!-- пакіньце гÑÑ‚Ñ‹ радок такім, Ñкі ён Ñ‘Ñьць --> <pre>
+ # Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ñ‹Ñ Ð»Ñ–ÑÑ‚Ñ‹, ÑÐºÑ–Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ адпавÑдаць гÑтаму ÑьпіÑу, Ð½Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ блÑкавацца, нават
+ # калі Ñны будуць у чорным ÑьпіÑе.
+ #
+ #</pre> <!-- пакіньце гÑÑ‚Ñ‹ радок такім, Ñкі ён Ñ‘Ñьць -->
+# СынтакÑÑ–Ñ Ð½Ð°Ñтупны:
+# * УÑÑ‘, што пачынаецца з «#» Ñ– да канца радку, зьÑўлÑецца камÑнтарам
+# * УÑе непуÑÑ‚Ñ‹Ñ Ñ€Ð°Ð´ÐºÑ– зьÑўлÑюцца чаÑткамі Ñ€ÑгулÑрнага выразу, Ñкі будзе выкарыÑтоўвацца толькі
+# Ñž дачыненьні да назваў ÑÑрвÑраў у Ñлектронных ліÑтах',
+ 'spam-blacklisted-email' => 'ÐдраÑÑ‹ Ñлектроннай пошты з чорнага ÑьпіÑу',
+ 'spam-blacklisted-email-text' => 'З Вашага адраÑу Ñлектроннай пошты Ñž цÑперашні момант забаронена даÑылаць ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ñ‹Ñ Ð»Ñ–ÑÑ‚Ñ‹ іншым удзельнікам.',
+ 'spam-blacklisted-email-signup' => 'Пададзены Вамі Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты Ñž цÑперашні момант знаходзіцца Ñž чорным ÑьпіÑе.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|ÐаÑтупны радок чорнага ÑьпіÑу ўтрымлівае нÑÑлушны Ñ€ÑгулÑрны выраз|ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñ€Ð°Ð´ÐºÑ– чорнага ÑьпіÑу ўтрымліваюць нÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ñ€ÑгулÑÑ€Ð½Ñ‹Ñ Ð²Ñ‹Ñ€Ð°Ð·Ñ‹}} Ñ– {{PLURAL:$1|павінен быць|Ð¿Ð°Ð²Ñ–Ð½Ð½Ñ‹Ñ Ð±Ñ‹Ñ†ÑŒ}} выпраўлены перад захаваньнем Ñтаронкі:',
+ 'spam-blacklist-desc' => 'ÐнтыÑпамавы інÑтрумÑнт, Ñкі базуецца на Ñ€ÑгулÑрных выразах: [[MediaWiki:Spam-blacklist]] Ñ– [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Bulgarian (българÑки)
+ * @author Spiritia
+ */
+$messages['bg'] = array(
+ 'spam-invalid-lines' => '{{PLURAL:$1|СледниÑÑ‚ запиÑ|Следните запиÑи}} от Ñ‡ÐµÑ€Ð½Ð¸Ñ ÑпиÑък на Ñпама {{PLURAL:$1|е невалиден регулÑрен израз|Ñа невалидни регулÑрни изрази}} и Ñ‚Ñ€Ñбва да {{PLURAL:$1|бъде коригиран|бъдат коригирани}} преди ÑъхранÑване на Ñтраницата:',
+ 'spam-blacklist-desc' => 'ИнÑтрумент за защита от Ñпам, използващ регулÑрни изрази: [[МедиÑУики:Spam-blacklist]] и [[МедиÑУики:Spam-whitelist]]',
+);
+
+/** Banjar (Bahasa Banjar)
+ * @author Alamnirvana
+ */
+$messages['bjn'] = array(
+ 'spam-invalid-lines' => 'Baris-baris nang maumpati ini manggunaakan ungkapan nalar nang kahada sah. Silakan dibaiki daptar hirang ini sabalum manyimpannya:', # Fuzzy
+);
+
+/** Bengali (বাংলা)
+ * @author Bellayet
+ * @author Nasir8891
+ * @author Zaheen
+ */
+$messages['bn'] = array(
+ 'spam-blacklist' => '
+ # à¦à¦‡ তালিকার সাথে মিলে যায় à¦à¦®à¦¨ বহিঃসংযোগ URLগà§à¦²à¦¿ পাতায় যোগ করতে বাধা দেয়া হবে।
+ # à¦à¦‡ তালিকাটি কেবল à¦à¦‡ উইকির কà§à¦·à§‡à¦¤à§à¦°à§‡ পà§à¦°à¦¯à§‹à¦œà§à¦¯; সামগà§à¦°à¦¿à¦• কালোতালিকাও দেখতে পারেন।
+ # ডকà§à¦®à§‡à¦¨à§à¦Ÿà§‡à¦¶à¦¨à§‡à¦° জনà§à¦¯ https://www.mediawiki.org/wiki/Extension:SpamBlacklist দেখà§à¦¨
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# সিনটà§à¦¯à¦¾à¦•à§à¦¸ নিচের মত:
+# * "#" কà§à¦¯à¦¾à¦°à§‡à¦•à§à¦Ÿà¦¾à¦° থেকে শà§à¦°à§ করে লাইনের শেষ পরà§à¦¯à¦¨à§à¦¤ সবকিছৠà¦à¦•à¦Ÿà¦¿ মনà§à¦¤à¦¬à§à¦¯
+# * পà§à¦°à¦¤à¦¿à¦Ÿà¦¿ অশূনà§à¦¯ লাইন à¦à¦•à¦Ÿà¦¿ রেজেকà§à¦¸ খণà§à¦¡à¦¾à¦‚শ যেটি কেবল URLগà§à¦²à¦¿à¦° ভেতরের hostগà§à¦²à¦¿à¦° সাথে মিলে যাবে
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-whitelist' => ' #<!-- à¦à¦‡ লাইন যেমন আছে ঠিক তেমনই ছেড়ে দিন --> <pre>
+# External URLs matching this list will *not* be blocked even if they would
+# have been blocked by blacklist entries.
+#
+# Syntax is as follows:
+# * Everything from a "#" character to the end of the line is a comment
+# * Every non-blank line is a regex fragment which will only match hosts inside URLs
+
+ #</pre> <!-- à¦à¦‡ লাইন যেমন আছে ঠিক তেমনই ছেড়ে দিন -->',
+ 'spam-blacklisted-email' => 'কালোতালিকাভà§à¦•à§à¦¤ ইমেইল ঠিকানা',
+ 'spam-blacklisted-email-text' => 'অনà§à¦¯à¦¦à§‡à¦° ইমেইল পাঠানো থেকে বিরত রাখতে আপনাকে কালোতালিকাভà§à¦•à§à¦¤ করা হয়েছে।',
+ 'spam-blacklisted-email-signup' => 'আপনার লেখা ইমেইল ঠিকানাটি কালোতালিকাভà§à¦•à§à¦¤à¥¤',
+ 'spam-invalid-lines' => 'নিচের সà§à¦ªà§à¦¯à¦¾à¦® কালোতালিকার {{PLURAL:$1|লাইন|লাইনগà§à¦²à¦¿}} অবৈধ রেগà§à¦²à¦¾à¦° {{PLURAL:$1|à¦à¦•à§à¦¸à¦ªà§à¦°à§‡à¦¶à¦¨|à¦à¦•à§à¦¸à¦ªà§à¦°à§‡à¦¶à¦¨}} ধারণ করছে à¦à¦¬à¦‚ পাতাটি সংরকà§à¦·à¦£à§‡à¦° আগে à¦à¦—à§à¦²à¦¿ ঠিক করা {{PLURAL:$1|পà§à¦°à¦¯à¦¼à§‹à¦œà¦¨|পà§à¦°à¦¯à¦¼à§‹à¦œà¦¨}}:',
+ 'spam-blacklist-desc' => 'রেজেকà§à¦¸-ভিতà§à¦¤à¦¿à¦• সà§à¦ªà§à¦¯à¦¾à¦®à¦°à§‹à¦§à§€ সরঞà§à¦œà¦¾à¦®: [[MediaWiki:Spam-blacklist]] à¦à¦¬à¦‚ [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Breton (brezhoneg)
+ * @author Fulup
+ */
+$messages['br'] = array(
+ 'spam-blacklist' => ' # Stanket e vo an URLoù diavaez a glot gant ar roll-mañ ma vezont ouzhpennet en ur bajenn.
+ # Ne sell ar roll-mañ nemet ouzh ar wiki-mañ ; sellit ivez ouzh al listenn zu hollek.
+ # Aze emañ an titouroù https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# Setu doare an ereadur :
+# * Pep tra adalek un arouezenn "#" betek dibenn al linenn zo un evezhiadenn
+# * Kement linenn anc\'houllo zo un darnad lavarenn reoliek na gloto nemet gant an ostizien el liammoù gourskrid
+
+ #</pre> <!-- lezel al linenn-mañ tre evel m\'emañ -->',
+ 'spam-whitelist' => " #<!-- lezel al linenn-mañ tre evel m'emañ --> <pre>
+# *Ne vo ket* stanket al liammoù gourskrid a glot gant al listenn-mañ
+# ha pa vijent bet stanket gant monedoù ar listenn zu.
+#
+# Setu an eredur :
+# * Pep tra adalek un arouezenn \"#\" betek dibenn al linenn zo un ev evezhiadenn
+# * Kement linenn anc'houllo zo un darnad skrid poellek na zielfennno nemet an ostizien el liammoù gourskrid
+
+ #</pre> <!-- lezel al linenn-mañ tre evel m'emañ -->",
+ 'email-blacklist' => " # Miret e vo ouzh ar chomlec'hioù postel a glot gant ar roll-mañ da enrollañ pe da gas posteloù
+ # Ne sell ar roll-mañ nemet ouzh ar wiki-mañ ; sellit ivez ouzh al listenn zu hollek.
+ # Aze emañ an titouroù http://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- lezel al linenn-mañ tre evel m'emañ --> <pre>
+#
+# Setu doare an ereadur :
+# * Kement testenn zo war-lerc'h un arouezenn \"#\" betek dibenn al linenn a vez sellet outi evel un evezhiadenn
+# * Kement linenn n'eo ket goullo zo un tamm eus ul lavarenn reoliek na gloto nemet gant an ostizien el liammoù gourskrid
+
+ #</pre> <!-- lezel al linenn-mañ tre evel m'emañ -->",
+ 'email-whitelist' => " #<!-- lezel al linenn-mañ tre evel m'emañ --> <pre>
+# *Ne vo ket* stanket ar chomlec'hioù postel zo er roll-mañ ha pa oant da vezañ
+# diouzh enmontoù al listenn zu.
+#
+ #</pre> <!-- lezel al linenn-mañ tre evel m'emañ -->
+# Setu an ereadur :
+# * Kement tra zo war-lerc'h un arouezenn \"#\" betek dibenn al linenn zo un evezhiadenn
+# * Kement linenn n'eo ket goullo zo un tamm regex (lavarenn reoliek) a vo lakaet a-geñver gant al lodenn \"ostiz\" e diabarzh ar chomlec'hioù postel",
+ 'spam-blacklisted-email' => "Chomlec'hioù postel ha listenn zu",
+ 'spam-blacklisted-email-text' => "Evit ar mare emañ ho chomlec'h postel war ul listenn zu ha n'haller ket kas posteloù drezañ d'an implijerien all.",
+ 'spam-blacklisted-email-signup' => "War ul listenn zu emañ ar chomlec'h postel pourchaset. N'hall ket bezañ implijet.",
+ 'spam-invalid-lines' => '{{PLURAL:$1|Ul lavarenn|Lavarennoù}} reoliek direizh eo {{PLURAL:$1|al linenn|al linennoù}} da-heul eus roll du ar stroboù ha ret eo {{PLURAL:$1|he reizhañ|o reizhañ}} a-raok enrollañ ar bajenn :',
+ 'spam-blacklist-desc' => 'Ostilh enep-strob diazezet war lavarennoù reoliek (Regex) : [[MediaWiki:Spam-blacklist]] ha [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Bosnian (bosanski)
+ * @author CERminator
+ */
+$messages['bs'] = array(
+ 'spam-blacklist' => '# Vanjski URLovi koji odgovaraju ovom spisku će biti blokirani ako se dodaju na stranicu.
+ # Ovaj spisak će biti aktivan samo na ovoj wiki; a poziva se i na globalni zabranjeni spisak.
+ # Za objašenjenja i dokumentaciju pogledajte https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- ostavite ovaj red taÄno onako kakav je --> <pre>
+#
+# Sintaksa je slijedeća:
+# * Sve od znaka "#" do kraja reda je komentar
+# * Svi neprazni redovi su fragmenti regexa koji će odgovarati samo domaćinima unutar URLova
+
+ #</pre> <!-- ostavite ovaj red taÄno onako kakav je -->',
+ 'spam-whitelist' => '#<!-- ostavite ovaj red onakav kakav je --> <pre>
+# Vanjski URLovi koji odgovaraju nekoj od stavki na ovom spisku *neće* biti blokirani Äak iako
+# budu blokirani preko spisak nepoželjnih stavki.
+#
+# Sintaksa je slijedeća:
+# * Sve od znaka "#" do kraja reda je komentar
+# * Svaki neprazni red je fragment regexa koji će odgovarati samo domaćinima unutar URLa
+
+ #</pre> <!-- ostavite ovaj red onakav kakav je -->',
+ 'spam-invalid-lines' => 'Slijedeći {{PLURAL:$1|red|redovi}} u spisku spam nepoželjnih stavki {{PLURAL:$1|je nevalidan izraz|su nevalidni izrazi}} i {{PLURAL:$1|treba|trebaju}} se ispraviti prije spremanja stranice:',
+ 'spam-blacklist-desc' => 'Alati protiv spama zasnovani na regexu: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Catalan (català)
+ * @author Aleator
+ * @author Arnaugir
+ * @author Jordi Roqué
+ * @author SMP
+ * @author Vriullop
+ */
+$messages['ca'] = array(
+ 'spam-blacklist' => ' # Les URLs externes coincidents amb aquesta llista seran bloquejades en ser afegides a una pàgina.
+ # Aquesta llista afecta només a aquesta wiki; vegeu també la llista negra global.
+ # Per a més informació vegeu https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- deixeu aquesta línia exactament com està --> <pre>
+#
+# La sintaxi és com segueix:
+# * Tot allò des d\'un caràcter "#" fins al final de la línia és un comentari
+# * Cada línia que no estigui en blanc és un fragment regex que només coincidirà amb amfitrions dintre d\'URLs
+
+ #</pre> <!-- deixeu aquesta línia exactament com està -->',
+ 'spam-whitelist' => " #<!-- deixeu aquesta línia tal com està --> <pre>
+# Les adreces URL externes que apareguin en aquesta llista no seran blocades
+# fins i tot si haurien estat blocades per aparèixer a la llista negra.
+#
+# La sintaxi és la següent:
+# * Tot allò que hi hagi des d'un símbol '#' fins a la fi de línia és un comentari
+# * Cada línia no buida és un fragment d'expressió regular (regex) que només marcarà hosts dins les URL
+
+ #</pre> <!-- deixeu aquesta línia tal com està -->",
+ 'spam-blacklisted-email' => 'Adreces de correu electrònic a la llista negra',
+ 'spam-blacklisted-email-text' => "La vostra adreça de correu electrònic està actualment en la llista negra d'enviament de correus a altres usuaris.",
+ 'spam-blacklisted-email-signup' => "L'adreça de correu electrònic proporcionada està actualment en la llista negra d'ús.",
+ 'spam-invalid-lines' => "{{PLURAL:$1|La línia següent no es considera una expressió correcta|Les línies següents no es consideren expressions correctes}} {{PLURAL:$1|perquè recull|perquè recullen}} SPAM que està vetat. Heu d'esmenar-ho abans de salvar la pàgina:",
+ 'spam-blacklist-desc' => 'Eina anti-spam basada en regexp: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Czech (Äesky)
+ * @author Li-sung
+ * @author Matěj Grabovský
+ * @author Mormegil
+ */
+$messages['cs'] = array(
+ 'spam-blacklist' => ' # Externí URL odpovídající tomuto seznamu budou zablokovány při pokusu přidat je na stránku.
+ # Tento seznam ovlivňuje jen tuto wiki; podívejte se také na globální Äernou listinu.
+ # Dokumentaci najdete na https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Nechte tento řádek přesně tak jak je --> <pre>
+#
+# Syntaxe je následující:
+# * Všechno od znaku „#“ do konce řádku je komentář
+# * Každý neprázdný řádek je Äást regulárního výrazu, kterému budou odpovídat pouze domény z URL
+
+ #</pre> <!-- Nechte tento řádek přesně tak jak je -->',
+ 'spam-whitelist' => ' #<!-- nechejte tento řádek přesně tak jak je --> <pre>
+# Externí URL odpovídající výrazům v tomto seznamu *nebudou* zablokovány, ani kdyby
+# je zablokovaly položky z Äerné listiny.
+#
+# Syntaxe je následující:
+# * Všechno od znaku „#“ do konce řádku je komentář
+# * Každý neprázdný řádek je Äást regulárního výrazu, kterému budou odpovídat pouze domény z URL
+
+ #</pre> <!-- nechejte tento řádek přesně tak jak je -->',
+ 'email-blacklist' => ' # Z e-mailů vyhovujících tomuto seznamu nebude možno zaregistrovat úÄet ani odesílat e-mail.
+ # Tento seznam ovlivňuje jen tuto wiki; vizte také globální Äernou listinu.
+ # Dokumentaci najdete na https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- tuto řádku ponechte přesně tak, jak je --> <pre>
+#
+# Syntaxe je následující:
+# * Všechno od znaku „#“ do konce řádku je komentář
+# * Každý neprázdný řádek je Äást regulárního výrazu, kterému budou odpovídat pouze domény v e-mailových adresách
+
+ #</pre> <!-- tuto řádku ponechte přesně tak, jak je -->',
+ 'email-whitelist' => ' #<!-- tuto řádku ponechte přesně tak, jak je --> <pre>
+# E-maily vyhovující tomuto seznamu *nebudou* blokovány, i kdyby
+# odpovídaly záznamům v Äerné listinÄ›.
+#
+# Syntaxe je následující:
+# * Všechno od znaku „#“ do konce řádku je komentář
+# * Každý neprázdný řádek je Äást regulárního výrazu, kterému budou odpovídat pouze domény v e-mailových adresách
+ #</pre> <!-- tuto řádku ponechte přesně tak, jak je -->',
+ 'spam-blacklisted-email' => 'E-mail na Äerné listinÄ›',
+ 'spam-blacklisted-email-text' => 'VaÅ¡e e-mailová adresa je momentálnÄ› uvedena na Äerné listinÄ›, takže ostatním uživatelům nemůžete posílat e-maily.',
+ 'spam-blacklisted-email-signup' => 'Uvedená e-mailová adresa je v souÄasné dobÄ› na Äerné listinÄ›.',
+ 'spam-invalid-lines' => 'Na Äerné listinÄ› spamu {{PLURAL:$1|je následující řádka neplatný regulární výraz|jsou následující řádky neplatné regulární výrazy|jsou následující řádky regulární výrazy}} a je nutné {{PLURAL:$1|ji|je|je}} pÅ™ed uložením stránky opravit :',
+ 'spam-blacklist-desc' => 'Antispamový nástroj na základě regulárních výrazů: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Welsh (Cymraeg)
+ * @author Lloffiwr
+ * @author Xxglennxx
+ */
+$messages['cy'] = array(
+ 'spam-blacklist' => "# Dyma restr o gyfeiriadau URL allanol; os osodir un o'r rhain ar dudalen fe gaiff ei flocio.
+ # Ar gyfer y wici hwn yn unig mae'r rhestr hon; mae rhestr waharddedig led-led yr holl wicïau i'w gael.
+ # Gweler https://www.mediawiki.org/wiki/Extension:SpamBlacklist am ragor o wybodaeth.
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# Dyma'r gystrawen:
+# * Mae popeth o nod \"#\" hyd at ddiwedd y llinell yn sylwad
+# * Mae pob llinell nad yw'n wag yn ddarn regex sydd ddim ond yn cydweddu
+# * gwesteiwyr tu mewn i gyfeiriadau URL
+
+ #</pre> <!-- leave this line exactly as it is -->",
+ 'spam-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# *Ni fydd* cyfeiriadau URL allanol sydd ar y rhestr hon yn cael eu blocio
+# hyd yn oed pan ydynt ar restr arall o gyfeiriadau URL gwaharaddedig.
+#
+# Dyma\'r gystrawen:
+# * Mae popeth o nod "#" hyd at ddiwedd y llinell yn sylwad
+# * Mae pob llinell nad yw\'n wag yn ddarn regex sydd ddim ond yn cydweddu
+# * gwesteiwyr tu mewn i gyfeiriadau URL
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-invalid-lines' => "Mae'r {{PLURAL:$1|llinell|llinell|llinellau|llinellau|llinellau|llinellau}} canlynol ar y rhestr spam gwaharddedig yn {{PLURAL:$1|fynegiad|fynegiad|fynegiadau|fynegiadau|fynegiadau|fynegiadau}} rheolaidd annilys; rhaid {{PLURAL:ei gywiro|ei gywiro|eu cywiro|eu cywiro|eu cywiro|eu cywiro}} cyn rhoi'r dudalen ar gadw:",
+ 'spam-blacklist-desc' => 'Teclyn gwrth-spam yn seiliedig ar regex: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Danish (dansk)
+ * @author Christian List
+ * @author HenrikKbh
+ * @author Hylle
+ */
+$messages['da'] = array(
+ 'spam-blacklist' => '#<!-- lad denne linje være nøjagtig som den er --> <pre>
+ # Denne liste blokerer matchende eksterne URL\'er matching fra at blive tilføjet siden.
+ # denne liste berører kun denne wiki; henviser også til den globale sortliste.
+ # For dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+# syntaksen er som følger:
+ # * alt fra et "#" tegn til slutningen af linjen er en kommentar
+ # * hver ikke-tomme linjer anvendes som regulære udtryk for at matcha domænenavne i webadresser
+ #</pre> <!-- lad denne linje være nøjagtig som den er -->',
+ 'spam-whitelist' => '#<!-- lad denne linje være nøjagtig som den er --> <pre>
+# Eksterne URL\'er på denne liste bliver ikke blokeret, selvom de ville være blevet det gennem den globale sortliste.
+# For dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+# Syntaksen er som følger:
+# * alt fra et "#" tegn til slutningen af linjen er en kommentar
+# * hver ikke-tomme linjer anvendes som regulære udtryk for at matcha domænenavne i webadresser
+#</pre> <!-- lad denne linje være nøjagtig som den er -->',
+ 'email-blacklist' => '#<!-- lad denne linje være nøjagtig som den er --> <pre>
+# E-mail adresser der er på denne liste vil blive blokeret fra at registreres eller fra at sende e-mails
+# Denne liste vedrører kun denne wiki; se også den globale sortliste
+# For dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+# Syntaksen er som følger:
+# * alt fra et "#" tegn til slutningen af linjen er en kommentar
+# * hver ikke-tomme linjer anvendes som regulære udtryk for at matche domænenavne i webadresser
+#</pre> <!-- lad denne linje være nøjagtig som den er -->',
+ 'email-whitelist' => '#<!-- lad denne linje være nøjagtig som den er --> <pre>
+# E-mail adresser på denne liste bliver ikke blokeret, selvom de ville være blevet det gennem den globale sortliste.
+#
+# Syntaksen er som følger:
+# * alt fra et "#" tegn til slutningen af linjen er en kommentar
+# * hver ikke-tomme linjer anvendes som regulære udtryk for at matcha domænenavne i webadresser
+#</pre> <!-- lad denne linje være nøjagtig som den er -->',
+ 'spam-blacklisted-email' => 'Sortlistet e-mailadresse',
+ 'spam-blacklisted-email-text' => 'Din e-mail-adresse er i øjeblikket blokeret for at sende emails til andre brugere.',
+ 'spam-blacklisted-email-signup' => 'Den angivne e-mail-adresse er i øjeblikket blokeret for brug.',
+ 'spam-invalid-lines' => 'Følgende {{PLURAL:$1|linje|linjer}} i spamsortelisten er {{PLURAL:$1|et ugyldigt regulært udtryk|ugyldige regulære udtryk}} og må rettes før lagring af siden:',
+ 'spam-blacklist-desc' => 'Antispamværktøj baseret på regulære udtryk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+);
+
+/** German (Deutsch)
+ * @author Geitost
+ * @author Kghbln
+ * @author Raimond Spekking
+ * @author Umherirrender
+ */
+$messages['de'] = array(
+ 'spam-blacklist' => ' # Externe URLs, die in dieser Liste enthalten sind, blockieren das Speichern einer Seite.
+ # Diese Liste hat nur Auswirkungen auf dieses Wiki. Siehe ggf. auch die globale Blockierliste.
+ # Siehe auch https://www.mediawiki.org/wiki/Extension:SpamBlacklist für die Dokumentation dieser Funktion.
+ #<!-- Diese Zeile darf nicht verändert werden! --> <pre>
+#
+# Syntax:
+# * Alles ab dem „#“-Zeichen bis zum Ende der Zeile ist ein Kommentar
+# * Jede nicht-leere Zeile ist ein regulärer Ausdruck, der gegen die Host-Namen in den URLs geprüft wird.
+
+ #</pre> <!-- Diese Zeile darf nicht verändert werden! -->',
+ 'spam-whitelist' => ' #<!-- Diese Zeile darf nicht verändert werden! --> <pre>
+# Externe URLs, die in dieser Liste enthalten sind, blockieren das Speichern einer Seite nicht,
+# auch wenn sie in der lokalen oder ggf. globalen Blockierliste enthalten sind.
+#
+# Syntax:
+# * Alles ab dem „#“-Zeichen bis zum Ende der Zeile ist ein Kommentar
+# * Jede nicht-leere Zeile ist ein regulärer Ausdruck, der gegen die Host-Namen in den URLs geprüft wird.
+
+ #</pre> <!-- Diese Zeile darf nicht verändert werden! -->',
+ 'email-blacklist' => ' #<!-- Diese Zeile darf nicht verändert werden! --> <pre>
+ # E-Mail-Adressen, die in dieser Liste enthalten sind, werden bei der Registrierung sowie beim Senden von E-Mail-Nachrichten geblockt.
+ # Diese Liste hat nur Auswirkungen auf dieses Wiki. Siehe gegebenenfalls auch die globale Blockierliste.
+ # Zur Dokumentation dieser Funktion siehe auch https://www.mediawiki.org/wiki/Extension:SpamBlacklist.
+#
+# Syntax wie folgt:
+# * Alles ab dem „#“-Zeichen bis zum Ende der Zeile ist ein Kommentar.
+# * Jede nicht-leere Zeile ist ein regulärer Ausdruck, der gegen die Host-Namen in den E-Mail-Adressen abgeglichen wird.
+
+ #</pre> <!-- Diese Zeile darf nicht verändert werden! -->',
+ 'email-whitelist' => ' #<!-- Diese Zeile darf nicht verändert werden! --> <pre>
+# E-Mail-Adressen, die sich in dieser Liste befinden, blockieren die Registrierung sowie
+# das Senden von E-Mail-Nachrichten *nicht*, auch wenn sie in der
+# lokalen oder ggf. globalen Blockierliste enthalten sind.
+#
+ #</pre> <!-- Diese Zeile darf nicht verändert werden! -->',
+ 'spam-blacklisted-email' => 'Blockierte E-Mail-Adressen',
+ 'spam-blacklisted-email-text' => 'Deine E-Mail-Adresse ist derzeit für das Senden von E-Mail-Nachrichten an andere Benutzer blockiert.',
+ 'spam-blacklisted-email-signup' => 'Die angegebene E-Mail-Adresse ist derzeit für das Senden von E-Mail-Nachrichten an andere Benutzer blockiert.',
+ 'spam-invalid-lines' => 'Die {{PLURAL:$1|folgende Zeile|folgenden Zeilen}} in der Blockierliste {{PLURAL:$1|ist ein ungültiger regulärer Ausdruck|sind ungültige reguläre Ausdrücke}}. Sie {{PLURAL:$1|muss|müssen}} vor dem Speichern der Seite korrigiert werden:',
+ 'spam-blacklist-desc' => 'Ermöglicht ein, durch reguläre Ausdrücke gestütztes, Anti-Spam-Werkzeug: [[MediaWiki:Spam-blacklist]] und [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Swiss High German (Schweizer Hochdeutsch)
+ * @author Geitost
+ */
+$messages['de-ch'] = array(
+ 'email-blacklist' => ' #<!-- Diese Zeile darf nicht verändert werden! --> <pre>
+ # E-Mail-Adressen, die in dieser Liste enthalten sind, werden bei der Registrierung sowie beim Senden von E-Mail-Nachrichten geblockt.
+ # Diese Liste hat nur Auswirkungen auf dieses Wiki. Siehe gegebenenfalls auch die globale Blockierliste.
+ # Zur Dokumentation dieser Funktion siehe auch https://www.mediawiki.org/wiki/Extension:SpamBlacklist.
+#
+# Syntax wie folgt:
+# * Alles ab dem «#»-Zeichen bis zum Ende der Zeile ist ein Kommentar.
+# * Jede nicht-leere Zeile ist ein regulärer Ausdruck, der gegen die Host-Namen in den E-Mail-Adressen abgeglichen wird.
+
+ #</pre> <!-- Diese Zeile darf nicht verändert werden! -->',
+);
+
+/** German (formal address) (Deutsch (Sie-Form)‎)
+ * @author Kghbln
+ */
+$messages['de-formal'] = array(
+ 'spam-blacklisted-email-text' => 'Ihre E-Mail-Adresse ist derzeit für das Senden von E-Mail-Nachrichten an andere Benutzer blockiert.',
+);
+
+/** Zazaki (Zazaki)
+ * @author Aspar
+ * @author Erdemaslancan
+ * @author Olvörg
+ */
+$messages['diq'] = array(
+ 'spam-blacklist' => ' #gıreyê teber ê ke na liste de zêpi bi bloke beni.
+ # na liste tena no wiki re tesir beno.
+ # Dokümantasyon: https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- no satır zey xo verdê --> <pre>
+#
+# rêzvateyê ey zey cêr o.:
+# * "#" karakteri ra heta satıro peyin her çi mışoreyo
+# * Her satıro dekerde, pêşkeşwan ê ke zerreyê URLlyi de tena parçeyê regexê .
+
+ #</pre> <!-- no satır zey xo verdê -->',
+ 'spam-whitelist' => ' #<!-- no satır zey xo verdê --> <pre>
+# gıreyê teber ê ke na liste de zêpi yê *bloke nêbeni*,
+# wazeno pê listeya siya zi bloke bıbo.
+#
+# rêzvate zey cêr o:
+# * "#" karakteri raheta satıro peyin her çi mışoreyo
+# * Her satıro dekerde, pêşkeşwan ê ke zerreyê URLlyi de tena parçeyê regexê .
+
+ #</pre> <!--no satır zey xo verdê -->',
+ 'email-blacklist' => '#Adresê e-postay ke eno liste de esto qandê starkerdış ya zi rusnayış rê blokeyo.
+# eno liste tenya aidê eno wikiyo.Siyalisteyê globali rê bıwane.
+#Qandê dokumentasyon https://www.mediawiki.org/wiki/Extension:SpamBlacklist rê bıwane.
+#
+#Syntax zey cerêni;Hame yew karakterê "#" ra qediyeno u pêyê kommenti izahato.
+#Her satırê ke veng niyo yew fragmano nızamiyo u tenya qandê e-postayo.
+ #</pre> <!-- Ena satıri bınuse -->',
+ 'email-whitelist' => "#<!-- pêroyi en satır bınuse --> <pre>
+#Adresê e-postay ke eno liste de dero bloke ''nêbeno'' eke ravêr i biyê.
+# Cı kewtışi terefê siyaliste biyo bloke.
+#
+ #</pre> <!-- pêroyî in satır bınuse ,satır ino-->
+# Syntax zey ino:
+# * Hame ke be yew karakterê a \"#\" qediyeno kommentê peyêni yew izahato:
+# * Her satırê ke veng niyo yew fragmano nızamiyo u tenya qandê e-postayo.",
+ 'spam-blacklisted-email' => 'E-posta deyayo teni liste',
+ 'spam-blacklisted-email-text' => 'Nıka adresa e-postayê to qande karberê bini ra mesac riştene listeyê siya dero.',
+ 'spam-blacklisted-email-signup' => 'E-posta adresiyo ke deyayo karkerdışe cı newke groto siyaliste.',
+ 'spam-invalid-lines' => 'na qerelisteya spami {{PLURAL:$1|satır|satıran}} {{PLURAL:$1|nemeqbulo|nemeqbuli}};',
+ 'spam-blacklist-desc' => 'Regex-tabanlı anti-spam aracı: [[MediaWiki:Spam-blacklist]] ve [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Lower Sorbian (dolnoserbski)
+ * @author Michawiki
+ */
+$messages['dsb'] = array(
+ 'spam-blacklist' => ' # Eksterne URL, kótarež su w toś tej lisćinje, blokěruju se, gaž pśidawaju se bokoju.
+ # Toś ta lisćina nastupa jano toś ten wiki; glědaj teke globalnu cornu lisćinu.
+ # Za dokumentaciju glědaj https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Wóstaj toś tu smužka rowno tak ako jo --><pre>
+#
+# Syntaksa jo ako slědujo:
+# * Wšykno wót znamuška "#" až ku kóńcoju smužki jo komentar
+# Kužda smužka, kótaraž njejo prozna, jo fragment regularnego wuraza, kótaryž wótpowědujo hostam w URL
+
+ #</pre> <!-- wóstaj toś tu smužku rowno ako jo -->',
+ 'spam-whitelist' => ' #<!-- wóstaj toś tu smužka rowno tak ako jo --> <pre>
+ # Eksterne URL, kótarež sw toś tej lisćinje se *nje*blokěruju, samo jolic wone by
+ # se blokěrowali pśez zapiski corneje lisćiny.
+ #
+ # Syntaksa jo ako slědujo:
+ # * Wšykno wót znamuška "#" ku kóńcoju smužki jo komentar
+ # * Kužda smužka, kótaraž njejo prozna, jo fragment regularanego wuraza, kótaryž wótpowědujo jano hostam w URL
+
+ #</pre> <!-- wóstaj toś tu smužku rowno tak ako jo -->',
+ 'spam-blacklisted-email' => 'Blokěrowana e-mailowa adresa',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Slědujuca smužka|Slědujucej smužce|Slědujuce smužki|Slědujuce smužki}} corneje lisćiny spama {{PLURAL:$1|jo njepłaśiwy regularny wuraz|stej njepłaśiwej regularnej wuraza|su njepłaśiwe regularne wuraze|su njepłaśiwe regularne wuraze}} a {{PLURAL:$1|musy|musytej|muse|muse}} se korigěrowaś, pjerwjej až składujoš bok:',
+ 'spam-blacklist-desc' => 'Antispamowy rěd na zakłaźe regularnych wurazow: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Greek (Ελληνικά)
+ * @author Dead3y3
+ */
+$messages['el'] = array(
+ 'spam-blacklist' => ' # ΕξωτεÏικά URLs που ταιÏιάζουν σε αυτή τη λίστα θα φÏαγοÏν όταν Ï€Ïοστίθενται σε μία σελίδα.
+ # Αυτή η λίστα επηÏεάζει μόνο αυτό το wiki· αναφεÏθείτε επίσης στην καθολική μαÏÏη λίστα.
+ # Για τεκμηÏίωση δείτε τον σÏνδεσμο https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# Η σÏνταξη είναι ως ακολοÏθως:
+# * Οτιδήποτε από τον χαÏακτήÏα «#» μέχÏι το τέλος της γÏαμμής είναι ένα σχόλιο
+# * Οποιαδήποτε μη κενή γÏαμμή είναι ένα κομμάτι κανονικής έκφÏασης το οποίο θα ταιÏιάξει μόνο hosts
+# μέσα σε URLs
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# ΕξωτεÏικά URLs που ταιÏιάζουν σε αυτή τη λίστα _δεν_ θα φÏαγοÏν ακόμα και αν είχαν
+# φÏαγεί από εγγÏαφές της μαÏÏης λίστας.
+#
+# Η σÏνταξη είναι ως ακολοÏθως:
+# * Οτιδήποτε από τον χαÏακτήÏα «#» μέχÏι το τέλος της γÏαμμής είναι ένα σχόλιο
+# * Οποιαδήποτε μη κενή γÏαμμή είναι ένα κομμάτι κανονικής έκφÏασης το οποίο θα ταιÏιάξει μόνο hosts
+# μέσα σε URLs
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Η ακόλουθη γÏαμμή|Οι ακόλουθες γÏαμμές}} της μαÏÏης λίστας spam είναι {{PLURAL:$1|άκυÏη κανονική έκφÏαση|άκυÏες κανονικές εκφÏάσεις}} και {{PLURAL:$1|χÏειάζεται|χÏειάζονται}} διόÏθωση Ï€Ïιν την αποθήκευση της σελίδας:',
+ 'spam-blacklist-desc' => 'ΕÏγαλείο anti-spam βασισμένο σε κανονικές εκφÏάσεις: [[MediaWiki:Spam-blacklist]] και [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Esperanto (Esperanto)
+ * @author Yekrats
+ */
+$messages['eo'] = array(
+ 'spam-blacklist' => '
+ #<!-- ne ÅanÄu ĉi tiun linion iel ajn --> <pre>
+# Eksteraj URL-oj kongruante al ĉi tiuj listanoj estos forbarita kiam aldonita al paÄo.
+# Ĉi tiu listo nur regnas ĉi tiun vikion; ankaux aktivas la Äenerala nigralisto.
+ # Por dokumentaro, rigardu https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+# Jen la sintakso:
+# * Ĉio ekde "#" signo al la fino de linio estas komento
+# * Ĉiu ne-malplena linio estas regex kodero kiu nur kongruas retnodojn ene de URL-oj
+
+ #</pre> <!-- ne ÅanÄu ĉi tiun linion iel ajn -->',
+ 'spam-whitelist' => ' #<!-- ne ÅanÄu ĉi tiun linion iel ajn --> <pre>
+# Eksteraj URL-oj kongruante al ĉi tiuj listanoj *NE* estos forbarita eĉ se ili estus
+# forbarita de nigralisto
+#
+# Jen la sintakso:
+# * Ĉio ekde "#" signo al la fino de linio estas komento
+# * Ĉiu nemalplena linio estas regex kodero kiu nur kongruas retnodojn ene de URL-oj
+ #</pre> <!-- ne ÅanÄu ĉi tiun linion iel ajn -->',
+ 'email-blacklist' => ' # Retadresoj kongruante de ĉi tiu listo estos forbarita de reÄistrado aÅ­ sendado de retpoÅtoj
+ # Ĉi tiu listo nur funkciigas ĉi tiun vikion; ankaÅ­ rigardu la Äeneralan nigraliston.
+ # Por dokumentado, vidu https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+# Jen la sintakso:
+# * Ĉio ekde "#" signo al la fino de linio estas komento
+# * Ĉiu ne-malplena linio estas regex kodero kiu nur kongruas retnodojn ene de URL-oj
+
+ #</pre> <!-- ne ÅanÄu ĉi tiun linion iel ajn -->',
+ 'email-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Retadresoj kongruante de ĉi tiu listo *ne* estos forbarita se ili estus forbarita de nigralisto.
+#
+ #</pre> <!-- leave this line exactly as it is -->
+# Jen la sintakso:
+# * Ĉio ekde "#" signo al la fino de linio estas komento
+# * Ĉiu ne-malplena linio estas regex kodero kiu nur kongruas retnodojn ene de URL-oj',
+ 'spam-blacklisted-email' => 'RetpoÅtadreso en nigra listo',
+ 'spam-blacklisted-email-text' => 'Via retpoÅtadreso estas nune membro de nigralisto forbarita de sendante retpoÅtojn al aliaj uzantoj.',
+ 'spam-blacklisted-email-signup' => 'Tiu retpoÅtadreso estas nune forbarita de uzado.',
+ 'spam-invalid-lines' => 'La {{PLURAL:$1|jena linio|jenaj linioj}} de spama nigralisto estas {{PLURAL:$1|nevlidaj regularaj esprimoj|nevlidaj regularaj esprimoj}} kaj devas esti {{PLURAL:$1|korektigita|korektigitaj}} antaÅ­ savante la paÄon:',
+ 'spam-blacklist-desc' => 'Regex-bazita kontraÅ­spamilo: [[MediaWiki:Spam-blacklist]] kaj [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Spanish (español)
+ * @author Armando-Martin
+ * @author Dferg
+ * @author Drini
+ * @author Sanbec
+ * @author Vivaelcelta
+ */
+$messages['es'] = array(
+ 'spam-blacklist' => ' # Enlaces externos que coincidan con esta lista serán bloqueados al añadirse a una página
+ # Esta lista afecta sólo a esta wiki. Existe asímismo una lista global en Meta para todos los proyectos.
+ # Para documentación mire: https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Deje esta línea exactamente como está --> <pre>
+#
+# La sintaxis es:
+# * Todo lo que aparezca desde un caracter "#" hasta el fin de la línea es un comentario
+# * Toda línea que no esté en blanco es una expresión regular que sólo se cotejará con URLs
+
+ #</pre> <!-- Deje esta línea exactamente como está -->',
+ 'spam-whitelist' => ' #<!-- Deje esta línea exactamente como está --> <pre>
+# URLs externas que coincidan con esta lista *no* serán bloqueadas incluso si coincidiesen
+# con una entrada en la lista negra.
+#
+## La sintaxis es:
+# * Todo lo que aparezca desde un caracter "#" hasta el fin de la línea es un comentario
+# * Toda línea que no esté en blanco es una expresión regular que sólo se cotejará con URLs
+
+ #</pre> <!-- Deje esta línea exactamente como está -->',
+ 'email-blacklist' => ' # Las direcciones de correo electrónico que coincidan con las de esta lista no podrán registrar cuentas ni enviar correos electrónicos
+ # Esta lista sólo afecta a este proyecto aunque existe una lista global para todos los proyectos.
+ # Documentación: https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# Sintaxis como sigue:
+# * Todo lo que sigue a un "#" se interpreta como un comentario
+# * Toda línea no en blanco es un fragmento de expresión regular (regex) que sólo coincidirá con los "host" de la dirección de correo electrónico.
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'email-whitelist' => ' #<!-- Deje esta línea exactamente como está --> <pre>
+# Las direcciones de correo electrónico que aparecen en esta lista*no* serán bloqueadas incluso si hubieran
+# debido ser bloqueadas por aparecer en la lista negra.
+#
+ #</pre> <!-- Deje esta línea exactamente como está-->
+# La sintaxis es la siguiente:
+# * Todo texto a la derecha del carácter "#" hasta el final de la línea es un comentario
+# * Cada línea que no esté en blanco es un fragmento de código que será cotejada por los servidores (hosts) con las direcciones de correo electrónico',
+ 'spam-blacklisted-email' => 'Dirección de correo electrónico de la lista negra',
+ 'spam-blacklisted-email-text' => 'Su dirección de correo electrónico está actualmente en la lista negra y no puede enviar correos electrónicos a otros usuarios.',
+ 'spam-blacklisted-email-signup' => 'La dirección de correo electrónico dada está actualmente en la lista negra de uso.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|La siguiente línea|Las siguientes líneas}} de la lista negra de spam {{PLURAL:$1|es una expresión regular inválida|son expresiones regulares inválidas}} y es necesario {{PLURAL:$1|corregirla|corregirlas}} antes de guardar la página:',
+ 'spam-blacklist-desc' => 'Herramienta anti-spam basada en expresiones regulares [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Estonian (eesti)
+ * @author Pikne
+ */
+$messages['et'] = array(
+ 'spam-blacklist' => ' # Sellele nimekirjale vastavad internetiaadressid blokeeritakse.
+ # See nimekiri puudutab ainult seda vikit; uuri ka globaalse musta nimekirja kohta.
+ # Dokumentatsioon on asukohas https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Jäta see rida muutmata kujule. --> <pre>
+#
+# Süntaks on järgmine:
+# * Kõik alates märgist "#" kuni rea lõpuni on kommentaar
+# * Iga rida, mis ei ole tühi, on regulaaravaldise osa, milleks sobib internetiaadressi osadest ainult hostinimi
+
+ #</pre> <!-- Jäta see rida muutmata kujule. -->',
+ 'spam-whitelist' => ' #<!-- Jäta see rida muutmata kujule. --> <pre>
+# Sellele nimekirjale vastavaid internetiaadresse *ei* blokeerita isegi mitte siis
+# kui musta nimekirja sissekande järgi võiks nad olla blokeeritud.
+#
+# Süntaks on järgmine:
+# * Kõik alates märgist "#" kuni rea lõpuni on kommentaar
+# * Iga rida, mis ei ole tühi, on regulaaravaldise osa, milleks sobib internetiaadressi osadest ainult hostinimi
+
+ #</pre> <!-- Jäta see rida muutmata kujule. -->',
+ 'email-blacklist' => ' # Sellele nimekirjale vastavatel e-posti aadressidel blokeeritakse registreerumine ja e-kirjade saatmine.
+ # See nimekiri puudutab ainult seda vikit; uuri ka globaalse musta nimekirja kohta.
+ # Dokumentatsioon on asukohas https://www.mediawiki.org/wiki/Extension:SpamBlacklist.
+ #<!-- Jäta see rida muutmata kujule. --> <pre>
+#
+# Süntaks on järgmine:
+# * Kõik alates märgist "#" kuni rea lõpuni on kommentaar.
+# * Iga rida, mis ei ole tühi, on regulaaravaldise osa, mis vastab ainult e-posti aadressides sisalduvatele hostinimedele.
+
+ #</pre> <!-- Jäta see rida muutmata kujule. -->',
+ 'email-whitelist' => ' #<!-- Jäta see rida muutmata kujule. --> <pre>
+# Sellele nimekirjale vastavaid e-posti aadresse *ei* blokeerita isegi mitte siis,
+# kui musta nimekirja sissekande järgi võiks nad olla blokeeritud.
+#
+ #</pre> <!-- Jäta see rida muutmata kujule. -->
+# Süntaks on järgmine:
+# * Kõik alates märgist "#" kuni rea lõpuni on kommentaar.
+# * Iga rida, mis ei ole tühi, on regulaaravaldise osa, mis vastab ainult e-posti aadressides sisalduvatele hostinimedele.',
+ 'spam-blacklisted-email' => 'Musta nimekirja kantud e-posti aadress',
+ 'spam-blacklisted-email-text' => 'Musta nimekirja sissekande tõttu on sinu e-posti aadressilt teistele kasutajatele e-kirjade saatmine praegu keelatud.',
+ 'spam-blacklisted-email-signup' => 'Selle e-posti aadressi kasutamine praegu musta nimekirja sissekandega keelatud.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Järgmine rida|Järgmised read}} rämpspostituste mustas nimekirjas on {{PLURAL:$1|vigane regulaaravaldis|vigased regulaaravaldised}} ja {{PLURAL:$1|see|need}} tuleb enne lehekülje salvestamist parandada:',
+ 'spam-blacklist-desc' => 'Regulaaravaldisel põhinev tööriist: [[MediaWiki:Spam-blacklist]] ja [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Persian (Ùارسی)
+ * @author Ebraminio
+ * @author Huji
+ * @author Meisam
+ */
+$messages['fa'] = array(
+ 'spam-blacklist' => ' # از درج پیوندهای بیرونی Ú©Ù‡ با این Ùهرست مطابقت کنند جلوگیری می‌شود.
+ # این Ùهرست Ùقط روی همین ویکی اثر دارد؛ به Ùهرست سیاه سراسری نیز مراجعه کنید.
+ # برای مستندات به https://www.mediawiki.org/wiki/Extension:SpamBlacklist مراجعه کنید
+ #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>
+# دستورات به این شکل هستند:
+# * همه چیز از «#» تا پایان سطر به عنوان توضیح در نظر گرÙته می‌شود
+# * هر سطر از متن به عنوان یک دستور از نوع عبارت باقاعده در نظر گرÙته می‌شود Ú©Ù‡ Ùقط با نام میزبان در نشانی اینترنتی مطابقت داده می‌شود
+
+ #</pre> <!-- این سطر را همان‌گونه که هست رها کنید -->',
+ 'spam-whitelist' => ' #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>
+# از درج پیوندهای بیرونی Ú©Ù‡ با این Ùهرست مطابقت کنند جلوگیری *نمی‌شود* حتی اگر
+# در Ùهرست سیاه قرار داشته باشند.
+#
+ #</pre> <!-- این سطر را همان‌گونه که هست رها کنید -->',
+ 'email-blacklist' => ' # از ثبت نام یا ارسال نامه توسط نشانی‌های پست الکترونیکی Ú©Ù‡ با این Ùهرست مطابقت کنند جلوگیری می‌شود.
+ # این Ùهرست Ùقط روی همین ویکی اثر دارد؛ به Ùهرست سیاه سراسری نیز مراجعه کنید.
+ # برای مستندات به https://www.mediawiki.org/wiki/Extension:SpamBlacklist مراجعه کنید
+ #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>
+# دستورات به این شکل هستند:
+# * همه چیز از «#» تا پایان سطر به عنوان توضیح در نظر گرÙته می‌شود
+# * هر سطر از متن به عنوان یک دستور از نوع عبارت باقاعده در نظر گرÙته می‌شود Ú©Ù‡ Ùقط با نام میزبان در نشانی پست الکترونیکی مطابقت داده می‌شود
+
+ #</pre> <!-- این سطر را همان‌گونه که هست رها کنید -->',
+ 'email-whitelist' => ' #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>
+# نشانی‌های پست الکترونیکی Ú©Ù‡ با این Ùهرست مطابقت کنند محدود *نمی‌شوند* حتی اگر
+# با Ùهرست سیاه مطابقت داشته باشند.
+#
+ #</pre> <!-- این سطر را همان‌گونه که هست رها کنید -->
+# دستورات به این شکل هستند:
+# * همه چیز از «#» تا پایان سطر به عنوان توضیح در نظر گرÙته می‌شود
+# * هر سطر از متن به عنوان یک دستور از نوع عبارت باقاعده در نظر گرÙته می‌شود Ú©Ù‡ Ùقط با نام میزبان در نشانی پست الکترونیکی مطابقت داده می‌شود',
+ 'spam-blacklisted-email' => 'نشانی پست الکترونیکی موجود در لیست سیاه',
+ 'spam-blacklisted-email-text' => 'نشانی پست الکترونیکی شما در حال حاضر در Ùهرست سیاه قرار دارد Ùˆ نمی‌توانید به دیگر کاربران نامه بÙرستید.',
+ 'spam-blacklisted-email-signup' => 'نشانی پست الکترونیکی داده شده در حال حاضر در Ùهرست سیاه است Ùˆ قابل استÙاده نیست.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|سطر|سطرهای}} زیر در Ùهرست سیاه هرزنگاری، عبارات باقاعدهٔ غیر مجاز {{PLURAL:$1|است|هستند}} Ùˆ قبل از ذخیره کردن صÙحه باید اصلاح {{PLURAL:$1|شود|شوند}}:',
+ 'spam-blacklist-desc' => 'ابزار ضد هرزنویسی مبتنی بر regular expressions: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Finnish (suomi)
+ * @author Cimon Avaro
+ * @author Crt
+ * @author Linnea
+ * @author Nike
+ * @author Olli
+ */
+$messages['fi'] = array(
+ 'spam-blacklist' => ' # Tämän listan säännöillä voi estää ulkopuolisiin sivustoihin viittaavien osoitteiden lisäämisen.
+ # Tämä lista koskee vain tätä wikiä. Tutustu myös järjestelmänlaajuiseen mustaan listaan.
+ # Lisätietoja on osoitteessa http://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Älä koske tähän riviin lainkaan --> <pre>
+#
+# Syntaksi on seuraavankaltainen:
+# * Kaikki #-merkistä lähtien rivin loppuun asti on kommenttia
+# * Jokainen ei-tyhjä rivi on säännöllisen lausekkeen osa, joka tunnistaa vain osoitteissa olevat verkkotunnukset.
+
+ #</pre> <!-- Älä koske tähän riviin lainkaan -->',
+ 'spam-whitelist' => ' #<!-- älä koske tähän riviin --> <pre>
+# Tällä sivulla on säännöt, joihin osuvia ulkoisia osoitteita ei estetä, vaikka ne olisivat estolistalla.
+#
+# Syntaksi on seuraava:
+# * Kommentti alkaa #-merkistä ja jatkuu rivin loppuun
+# * Muut ei-tyhjät rivit tulkitaan säännöllisen lausekkeen osaksi, joka tutkii vain osoitteissa olevia verkko-osoitteita.
+
+ #</pre> <!-- älä koske tähän riviin -->',
+ 'email-blacklist' => ' # Tällä listalla olevat sähköpostit estetään rekisteröitymästä tai lähettämästä sähköpostia
+ # Tämä lista koskee vain tätä wikiä. Tutustu myös järjestelmänlaajuiseen mustaan listaan.
+ # Lisätietoja on osoitteessa https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Älä koske tähän riviin lainkaan --> <pre>
+#
+# Syntaksi on seuraavankaltainen:
+# * Kaikki #-merkistä lähtien rivin loppuun asti on kommenttia
+# * Jokainen ei-tyhjä rivi on säännöllisen lausekkeen osa, joka tunnistaa vain sähköpostiosoitteissa olevat verkkotunnukset.
+
+ #</pre> <!-- Älä koske tähän riviin lainkaan -->',
+ 'spam-blacklisted-email' => 'Mustalla listalla oleva sähköpostiosoite',
+ 'spam-blacklisted-email-text' => 'Sähköpostisi on tällä hetkellä mustalla listalla, etkä voi lähettää sähköpostia muille käyttäjille.',
+ 'spam-blacklisted-email-signup' => 'Annettu sähköpostiosoite on tällä hetkellä mustalla listalla.',
+ 'spam-invalid-lines' => 'Listalla on {{PLURAL:$1|seuraava virheellinen säännöllinen lauseke, joka|seuraavat virheelliset säännölliset lausekkeet, jotka}} on korjattava ennen tallentamista:',
+ 'spam-blacklist-desc' => 'Säännöllisiä lausekkeita tukeva mainossuodatin: [[MediaWiki:Spam-blacklist|estolista]] ja [[MediaWiki:Spam-whitelist|poikkeuslista]].',
+);
+
+/** French (français)
+ * @author Gomoko
+ * @author Sherbrooke
+ * @author Urhixidur
+ * @author Verdy p
+ */
+$messages['fr'] = array(
+ 'spam-blacklist' => ' # Les liens externes faisant partie de cette liste seront bloqués lors de leur insertion dans une page.
+ # Cette liste n’affecte que ce wiki ; référez-vous aussi à la liste noire globale.
+ # La documentation se trouve à l’adresse suivante : https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Laissez cette ligne telle quelle --><pre>
+#
+# La syntaxe est la suivante :
+# * tout texte qui suit un « # » est considéré comme un commentaire ;
+# * toute ligne non vide est un fragment d’expression rationnelle qui n’analysera que les hôtes dans les liens hypertextes.
+
+ #</pre><!-- Laissez cette ligne telle quelle -->',
+ 'spam-whitelist' => ' #<!-- Laissez cette ligne telle quelle--><pre>
+# Les liens hypertextes externes correspondant à cette liste ne seront *pas* bloqués
+# même s’ils auraient été bloqués par les entrées de la liste noire.
+#
+# La syntaxe est la suivante :
+# * tout texte qui suit un « # » est considéré comme un commentaire ;
+# * toute ligne non vide est un fragment d’expression rationnelle qui n’analysera que les hôtes dans les liens hypertextes.
+
+ #</pre> <!--Laissez cette ligne telle quelle -->',
+ 'email-blacklist' => "# Les adresses de courriel correspondant à cette liste seront bloquées lors l'enregistrement ou de l'envoi d'un courriel
+ # Cette liste n’affecte que ce wiki ; référez-vous aussi à la liste noire globale.
+ # La documentation se trouve à l’adresse suivante : https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Laissez cette ligne telle quelle --><pre>
+#
+# La syntaxe est la suivante :
+# * tout texte qui suit un \"#\" est considéré comme un commentaire
+# * toute ligne non vide est un fragment d’expression rationnelle qui n’analysera que les hôtes correspondant dans les URLs.
+
+ #</pre><!-- Laissez cette ligne telle quelle -->",
+ 'email-whitelist' => "<!-- laissez cette ligne telle quelle --> <pre>
+# Les adresses de courriels correspondant à cette liste ne seront *pas* bloqués même s'ils auraient
+# dû l'être par les entrées de la liste noire.
+#
+ #</pre> <!-- laissez cette ligne telle quelle -->
+# La syntaxe est comme suit :
+# * Tout texte à partir du caractère « # » jusqu'à la fin de la ligne est un commentaire.
+# * Chaque ligne non vide est un morceau de regex (expression rationnelle) qui sera mis en correspondance avec la partie « hosts » des adresses de courriels",
+ 'spam-blacklisted-email' => 'Adresses courriel et liste noire',
+ 'spam-blacklisted-email-text' => "Votre adresse de courriel est actuellement sur une liste noire d'envoi de courriel aux autres utilisateurs.",
+ 'spam-blacklisted-email-signup' => "L'adresse de courriel fournie est actuellement sur une liste noire d'utilisation.",
+ 'spam-invalid-lines' => '{{PLURAL:$1|La ligne suivante|Les lignes suivantes}} de la liste noire des polluriels {{PLURAL:$1|est une expression rationnelle invalide|sont des expressions rationnelles invalides}} et doi{{PLURAL:$1||ven}}t être corrigée{{PLURAL:$1||s}} avant d’enregistrer la page :',
+ 'spam-blacklist-desc' => "Outil anti-pourriel basé sur des expressions rationnelles : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''",
+);
+
+/** Franco-Provençal (arpetan)
+ * @author ChrisPtDe
+ */
+$messages['frp'] = array(
+ 'spam-blacklist' => ' # Los lims hipèrtèxtos de defôr que sont dens ceta lista seront blocâs pendent lor entrebetâ dens una pâge.
+ # Ceta lista afècte ren que ceti vouiqui ; refèrâd-vos asse-ben a la lista nêre globâla.
+ # La documentacion sè trove a ceta adrèce : https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- lèssiéd ceta legne justo d’ense --> <pre>
+#
+# La sintaxa est ceta :
+# * Tot tèxto que siut un « # » est considèrâ coment un comentèro.
+# * Tota legne pas voueda est un bocon d’èxprèssion racionèla (*RegEx*) qu’analiserat ren que los hôtos dedens los lims hipèrtèxtos.
+
+ #</pre> <!-- lèssiéd ceta legne justo d’ense -->',
+ 'spam-whitelist' => ' #<!-- lèssiéd ceta legne justo d’ense --> <pre>
+# Los lims hipèrtèxtos de defôr que sont dens ceta lista seront *pas* blocâs mémo
+# s’ils ariant étâ blocâs per les entrâs de la lista nêre.
+#
+# La sintaxa est ceta :
+# * Tot tèxto que siut un « # » est considèrâ coment un comentèro.
+# * Tota legne pas voueda est un bocon d’èxprèssion racionèla (*RegEx*) qu’analiserat ren que los hôtos dedens los lims hipèrtèxtos.
+
+ #</pre> <!-- lèssiéd ceta legne justo d’ense -->',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Ceta legne|Cetes legnes}} de la lista nêre des spames {{PLURAL:$1|est una èxprèssion racionèla envalida|sont des èxprèssions racionèles envalides}} et dê{{PLURAL:$1||von}}t étre corregiê{{PLURAL:$1||s}} devant que sôvar la pâge :',
+ 'spam-blacklist-desc' => "Outil anti-spame basâ sur des èxprèssions racionèles (''RegEx'') : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''.",
+);
+
+/** Galician (galego)
+ * @author Alma
+ * @author Toliño
+ * @author Xosé
+ */
+$messages['gl'] = array(
+ 'spam-blacklist' => ' # As ligazóns externas que coincidan na súa totalidade ou en parte con algún rexistro desta lista serán bloqueadas cando se intenten engadir a unha páxina.
+ # Esta lista afecta unicamente a este wiki; tamén existe unha lista global.
+ # Para obter máis documentación vaia a https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Deixe esta liña tal e como está --> <pre>
+#
+# A sintaxe é a seguinte:
+# * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
+# * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos URL
+
+ #</pre> <!-- Deixe esta liña tal e como está -->',
+ 'spam-whitelist' => ' #<!-- Deixe esta liña tal e como está --> <pre>
+ # As ligazóns externas que coincidan con esta lista *non* serán bloqueadas mesmo se
+ # fosen bloqueadas mediante entradas na lista negra.
+#
+# A sintaxe é a que segue:
+# * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
+# * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos URL
+
+ #</pre> <!-- Deixe esta liña tal e como está -->',
+ 'email-blacklist' => ' # Os enderezos de correo electrónico que coincidan na súa totalidade ou en parte con algún rexistro desta lista serán bloqueadas cando se intenten rexistrar ou se intente enviar un correo desde eles.
+ # Esta lista afecta unicamente a este wiki; tamén existe unha lista global.
+ # Para obter máis documentación vaia a https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Deixe esta liña tal e como está --> <pre>
+#
+# A sintaxe é a seguinte:
+# * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
+# * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos de correo electrónico
+
+ #</pre> <!-- Deixe esta liña tal e como está -->',
+ 'email-whitelist' => ' #<!-- Deixe esta liña tal e como está --> <pre>
+# Os enderezos de correo electrónico que coincidan con algún desta lista *non* serán bloqueados,
+# mesmo se foron bloqueados por entradas da lista negra.
+#
+ #</pre> <!-- Deixe esta liña tal e como está -->
+#
+# A sintaxe é a seguinte:
+# * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
+# * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos de correo electrónico',
+ 'spam-blacklisted-email' => 'Enderezo de correo electrónico presente na lista negra',
+ 'spam-blacklisted-email-text' => 'O seu enderezo de correo electrónico atópase na lista negra e non pode enviar correos electrónicos aos outros usuarios.',
+ 'spam-blacklisted-email-signup' => 'O enderezo de correo electrónico especificado está na lista negra e non se pode empregar.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|A seguinte liña|As seguintes}} da lista negra de spam {{PLURAL:$1|é unha expresión regular inválida|son expresións regulares inválidas}} e {{PLURAL:$1|haina|hainas}} que corrixir antes de gardar a páxina:',
+ 'spam-blacklist-desc' => 'Ferramenta antispam baseada en expresións regulares: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Swiss German (Alemannisch)
+ * @author Als-Holder
+ */
+$messages['gsw'] = array(
+ 'spam-blacklist' => ' # Externi URL, wu in däre Lischt sin, blockiere s Spychere vu dr Syte.
+ # Die Lischt giltet nume fir des Wiki; lueg au di wältwyt Blacklist.
+ # Fir d Dokumentation lueg https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Die Zyylete derf nit gänderet wäre! --> <pre>
+#
+# Syntax:
+# * Alles ab em "#"-Zeiche bis zum Änd vu dr Zyylete isch e Kommentar
+# * Jede Zyylete, wu nit läär isch, isch e reguläre Usdruck, wu gege d Host-Näme in dr URL prieft wird.
+
+ #</pre> <!-- Die Zyylete derf nit gänderet wäre! -->',
+ 'spam-whitelist' => ' #</pre> <!-- Die Zyylete derf nit gänderet wäre! -->
+# Externi URL, wu in däre Lischt sin, blockiere s Spychere vu dr Syte nit, au wänn si in dr wältwyte oder lokale Schwarze Lischt din sin.
+#
+# Syntax:
+# * Alles ab em "#"-Zeiche bis zum Änd vu dr Zyylete isch e Kommentar
+# * Jede Zyylete, wu nit läär isch, isch e reguläre Usdruck, wu gege d Host-Näme in dr URL prieft wird.
+
+ #</pre> <!-- Die Zyylete derf nit gänderet wäre! -->',
+ 'email-blacklist' => ' # E-Mail-Adrässe, wu s nume in däre Lischt het, blockiere d Regischtrierig un s Sände vu E-Mail-Nochrichte.
+ # Die Lischt giltet nume fir des Wiki; lueg au di wältwyt Blacklist.
+ # Fir d Dokumentation lueg https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Die Zyylete derf nit gänderet wäre! --> <pre>
+#
+# Syntax:
+# * Alles ab em "#"-Zeiche bis zum Änd vu dr Zyylete isch e Kommentar
+# * Jede Zyylete, wu nit läär isch, isch e reguläre Usdruck, wu gege d Host-Näme in dr URL prieft wird.
+
+ #</pre> <!-- Die Zyylete derf nit gänderet wäre! -->',
+ 'email-whitelist' => ' #<!-- Die Zyylete derf nit gänderet wäre! -->
+# E-Mail-Adrässe, wu s nume in däre Lischt het, blockiere d Regischtrierig un
+# s Sände vu E-Mail-Nochrichte *nit*, au wänn si in dr
+# lokale oder villicht au globale Blockierlischt din sin.
+#
+ #<!-- Die Zyylete derf nit gänderet wäre! --> <pre>
+# Syntax:
+# * Alles ab em "#"-Zeiche bis zum Änd vu dr Zyylete isch e Kommentar
+# * Jede Zyylete, wu nit läär isch, isch e reguläre Usdruck, wu gege d Host-Näme in dr URL prieft wird.',
+ 'spam-blacklisted-email' => 'Blockierti E-Mail-Adrässe',
+ 'spam-blacklisted-email-text' => 'Dyy E-Mail-Adräss isch zurzyt fir s Sände vu E-Mail-Nochrichte an anderi Benutzer blockiert.',
+ 'spam-blacklisted-email-signup' => 'Di aagee E-Mail-Adräss isch zurzyt fir s Sände vu E-Mail-Nochrichte an anderi Benutzer blockiert.',
+ 'spam-invalid-lines' => 'Die {{PLURAL:$1|Zyylete|Zyylete}} in dr Spam-Blacklist {{PLURAL:$1|isch e nit giltige reguläre Usdruck|sin nit giltigi reguläri Usdrick}}. Si {{PLURAL:$1|muess|mien}} vor em Spychere vu dr Syte korrigiert wäre:',
+ 'spam-blacklist-desc' => 'Regex-basiert Anti-Spam-Wärchzyyg: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @author KartikMistry
+ * @author Sushant savla
+ */
+$messages['gu'] = array(
+ 'spam-blacklist' => ' # જà«àª¯àª¾àª°à«‡ કોઈ પાનામાં આ યાદીને મળતા બાહà«àª¯ URLs ઉમેરાશે તà«àª¯àª¾àª°à«‡ તેમને રોકી દેવાશે.
+ # આ યાદી માતà«àª° આ વિકિ પરજ કારà«àª¯àª¾àª¨à«àªµà«€àª¤ છે.; વૈશà«àªµà«€àª• પà«àª°àª¤àª¿àª¬àª‚ધ યાદી જોવા પણ વિનંતી.
+ # દસà«àª¤àª¾àªµàªœ માટે https://www.mediawiki.org/wiki/Extension:SpamBlacklist જà«àª“.
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# સૂતà«àª° લેખન (સિનà«àªŸà«‡àª•à«àª¸) આ પà«àª°àª®àª¾àª£à«‡ છે:
+# * Everything from a "#" character to the end of the line is a comment
+# * Every non-blank line is a regex fragment which will only match hosts inside URLs
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-whitelist' => ' #<!-- આ લાઈનને àªàª®àª¨à«€ àªàª® જ રહેવા દેશો --> <pre>
+# યાદીને મળતા અવતા બાહà«àª¯ URLs નેપà«àª°àª¤àª¿àª¬àª‚ધિત *નહીં* કરાય પછી ભલે તેમના
+# પà«àª°àª¤àª¿àª¬àª‚ધીત યાદીને àªàª‚ટà«àª°à«€àª®àª¾àª‚ રોક લગાડેલી હોય.
+#
+ #</pre> <!-- આ લાઈનને àªàª®àª¨à«€ àªàª® જ રહેવા દેશો -->',
+ 'email-blacklist' => ' # આ યાદીને મળતા ઈ-મેલની નોંધણી કે તેમના દà«àªµàª¾àª°àª¾ મેલ આવાગમનને રોકી દેવાશે.
+ # આ યાદી માતà«àª° આ વિકિ પરજ કારà«àª¯àª¾àª¨à«àªµà«€àª¤ છે.; વૈશà«àªµà«€àª• પà«àª°àª¤àª¿àª¬àª‚ધ યાદી જોવા પણ વિનંતી.
+ # દસà«àª¤àª¾àªµàªœ માટે https://www.mediawiki.org/wiki/Extension:SpamBlacklist જà«àª“.
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# સૂતà«àª° લેખન (સિનà«àªŸà«‡àª•à«àª¸) આ પà«àª°àª®àª¾àª£à«‡ છે:
+# * Everything from a "#" character to the end of the line is a comment
+# * Every non-blank line is a regex fragment which will only match hosts inside URLs
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'email-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# આ યાદીને મળતાં ઈ-મેલ ને પà«àª°àª¤àª¿àª¬àª‚ધિત *નહીં* કરી શકાય પછી ભલે તેમના પર
+# પà«àª°àª¤àª¿àª¬àª‚ધીત સૂચિ દà«àªµàª¾àª°àª¾ રોક લગાવાઈ હોય.
+#
+ #</pre> <!-- leave this line exactly as it is -->
+# સૂતà«àª° રચના આમà«àªœàª¬ હશે.:
+# * Everything from a "#" character to the end of the line is a comment
+# * Every non-blank line is a regex fragment which will only match hosts inside e-mail addresses',
+ 'spam-blacklisted-email' => 'પà«àª°àª¤àª¿àª¬àª‚ધિત ઈ-મેલ સરનામà«àª‚',
+ 'spam-blacklisted-email-text' => 'તમારા ઈ-મેલ સરનામાં પર હાલમાં પà«àª°àª¤àª¿àª¬àª‚ધ લગાડેલો છે આથી તમે ઈ-મેલ મોકલી નહીં શકો.',
+ 'spam-blacklisted-email-signup' => 'આ ઈ-મેલ પર હાલમાં વપરાશ પà«àª°àª¤àª¿àª¬àª‚ધ લાગેલો છે.',
+ 'spam-invalid-lines' => 'નીચેને સà«àªªà«…મ બà«àª²à«‡àª•àª²à«€àª¸à«àªŸàª®àª¾àª‚ {{PLURAL:$1| લાઈન|લાઈનો}} અમાનà«àª¯ છે. નિયમીત {{PLURAL:$1|expression|expressions}} અને પાનà«àª®à« સાચવà«àª¯àª¾àª‚ પહેલા તેને સà«àª§àª¾àª°à«€ લેશો.',
+ 'spam-blacklist-desc' => 'Regex-આધારિત àªàª¨à«àªŸà«€ સà«àªªà«…મ સાધનl: [[MediaWiki:Spam-blacklist]] અને [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Hebrew (עברית)
+ * @author Amire80
+ * @author Ofekalef
+ * @author Rotem Liss
+ */
+$messages['he'] = array(
+ 'spam-blacklist' => ' # כתובות URL חיצוניות התו×מות לרשימה זו ייחסמו בעת הוספתן לדף.
+ # רשימה זו משפיעה על ×תר ×–×” בלבד; שימו לב ×’× ×œ×¨×©×™×ž×” הכללית.
+ # לתיעוד ר×ו https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- × × ×œ×”×©×יר שורה זו בדיוק כפי ×©×”×™× --> <pre>
+#
+# התחביר ×”×•× ×›×“×œ×§×ž×Ÿ:
+# * כל דבר מתו "#" לסוף השורה ×”×•× ×”×¢×¨×”
+# * כל שורה ×œ× ×¨×™×§×” ×”×™× ×§×˜×¢ מביטוי רגולרי שית××™× ×œ×©×ž×•×ª ×”×ž×ª×—× ×©×œ כתובות URL
+
+ #</pre> <!-- × × ×œ×”×©×יר שורה זו בדיוק כפי ×©×”×™× -->',
+ 'spam-whitelist' => ' #<!-- × × ×œ×”×©×יר שורה זו בדיוק כפי ×©×”×™× --> <pre>
+# כתובות URL חיצוניות המופיעות ברשימה זו *ל×* ייחסמו ×פילו ×× ×™×© להן ערך ברשימת הכתובות ×”×סורות.
+#
+# התחביר ×”×•× ×›×“×œ×§×ž×Ÿ:
+# * כל דבר מתו "#" לסוף השורה ×”×•× ×”×¢×¨×”
+# * כל שורה ×œ× ×¨×™×§×” ×”×™× ×§×˜×¢ מביטוי רגולרי שית××™× ×œ×©×ž×•×ª ×”×ž×ª×—× ×©×œ כתובות URL
+
+ #</pre> <!-- × × ×œ×”×©×יר שורה זו בדיוק כפי ×©×”×™× -->',
+ 'email-blacklist' => ' # עבור כתובות הדו×ר ×”×לקטרוני המת×ימות לרשימה זו ×ª×™×—×¡× ×”×פשרות ×œ×”×™×¨×©× ×•×œ×©×œ×•×— דו×ר ×לקטרוני
+ # רשימה זו משפיעה רק על ויקי ×–×”; שימו לב ×’× ×œ×¨×©×™×ž×” הגלובלית.
+ # לתיעוד ר×ו https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# התחביר ×”×•× ×›×“×œ×§×ž×Ÿ:
+# * הכול החל מהתו "#" עד סוף השורה ×”×•× ×”×¢×¨×”
+# * כל שורה ×œ× ×¨×™×§×” ×”×™× ×‘×™×˜×•×™ רגולרי חלקי שתת××™× ×¨×§ ×œ×©×¨×ª×™× ×‘×ª×•×š הדו×ר ×”×לקטרוני
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'email-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# כתובות הדו×ר ×”×לקטרוני המת×ימות לרשימה זו *ל×* תיחסמנה ××£ ×× ×”×Ÿ מת×ימות לרשימה השחורה.
+#
+ #</pre> <!-- leave this line exactly as it is -->
+# התחביר ×”×•× ×›×“×œ×§×ž×Ÿ:
+# * הכול החל מהתו "#" עד סוף השורה ×”×•× ×”×¢×¨×”
+# * כל שורה ×œ× ×¨×™×§×” ×”×™× ×‘×™×˜×•×™ רגולרי חלקי שתת××™× ×¨×§ ×œ×©×¨×ª×™× ×‘×ª×•×š הדו×ר ×”×לקטרוני',
+ 'spam-blacklisted-email' => 'כתובות דו×"ל ברשימה השחורה',
+ 'spam-blacklisted-email-text' => 'כתובת הדו×"ל שלך נמצ×ת כרגע ברשימה השחורה של כתובות ×©×œ× × ×™×ª×Ÿ לשלוח מהן הודעות ×œ×ž×©×ž×ª×ž×©×™× ×חרי×.',
+ 'spam-blacklisted-email-signup' => 'כתובת הדו×"ל ×”×–×ת נמצ×ת כרגע ברשימה השחורה של כתובות ×סורות לשימוש.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|השורה הב××”|השורות הב×ות}} ברשימת כתובות ×”Ö¾URL ×”×סורות
+ {{PLURAL:$1|×”×™× ×‘×™×˜×•×™ רגולרי בלתי תקין ויש לתקנה|הן ×‘×™×˜×•×™×™× ×¨×’×•×œ×¨×™×™× ×‘×œ×ª×™ ×ª×§×™× ×™× ×•×™×© לתקנן}} לפני שמירת הדף:',
+ 'spam-blacklist-desc' => 'כלי ×נטי־ספ×× ×ž×‘×•×¡×¡ ביטוי רגולרי: [[MediaWiki:Spam-blacklist]] ו־[[MediaWiki:Spam-whitelist]]',
+);
+
+/** Hindi (हिनà¥à¤¦à¥€)
+ * @author Kaustubh
+ * @author Shyam
+ */
+$messages['hi'] = array(
+ 'spam-blacklist' => ' #इस सूची में मौजूद कडियाठजब à¤à¤• पृषà¥à¤  में जोड़ी गई बाहरी URLs से मेल खाती है तब वह पृषà¥à¤  संपादन से बाधित हो जायेगा।
+ #यह सूची केवल इस विकी पर ही पà¥à¤°à¤­à¤¾à¤µà¥€ है, विशà¥à¤µà¤µà¥à¤¯à¤¾à¤ªà¥€ बà¥à¤²à¥ˆà¤•à¤²à¤¿à¤¸à¥à¤Ÿ को भी उदà¥à¤§à¥ƒà¤¤ करें।
+ #पà¥à¤°à¤²à¥‡à¤–न के लिठhttps://www.mediawiki.org/wiki/Extension:SpamBlacklist देखें
+ #<!-- इस पंकà¥à¤¤à¥€à¤‚ को à¤à¤¸à¥‡ के à¤à¤¸à¥‡ ही रहने दें --> <pre>
+#
+#वाकà¥à¤¯ विशà¥à¤²à¥‡à¤·à¤£ निमà¥à¤¨à¤¾à¤‚कित है:
+# * हर जगह "#" संकेत से लेकर पंकà¥à¤¤à¤¿ के अंत तक à¤à¤• ही टिपणà¥à¤£à¥€ है
+# * पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• अरिकà¥à¤¤ पंकà¥à¤¤à¤¿ à¤à¤• टà¥à¤•à¤¡à¤¾ है जो कि URLs के अंतरà¥à¤—त केवल आयोजकों से मेल खाता है
+
+ #</pre> <!-- इस पंकà¥à¤¤à¥€à¤‚ को à¤à¤¸à¥‡ के à¤à¤¸à¥‡ ही रहने दें -->',
+ 'spam-whitelist' => ' #<!-- इस पंकà¥à¤¤à¥€à¤‚ को à¤à¤¸à¥‡ के à¤à¤¸à¥‡ ही रहने दें --> <pre>
+# बाहरी कडियाठजो इस सूची से मेल खाती है, वह कभी भी बाधित *नहीं* होंगी
+# बà¥à¤²à¥ˆà¤•à¤²à¤¿à¤¸à¥à¤Ÿ पà¥à¤°à¤µà¥‡à¤¶à¤¿à¤•à¤¾ दà¥à¤µà¤¾à¤°à¤¾ बाधित कि गई हैं।
+#
+# वाकà¥à¤¯ विशà¥à¤²à¥‡à¤·à¤£ निमà¥à¤¨à¤¾à¤‚कित है:
+# * हर जगह "#" संकेत से लेकर पंकà¥à¤¤à¤¿ के अंत तक à¤à¤• ही टिपणà¥à¤£à¥€ है
+# * पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• अरिकà¥à¤¤ पंकà¥à¤¤à¤¿ à¤à¤• टà¥à¤•à¤¡à¤¾ है जो कि URLs के अंतरà¥à¤—त केवल आयोजकों से मेल खाता है
+
+ #</pre> <!-- इस पंकà¥à¤¤à¥€à¤‚ को à¤à¤¸à¥‡ के à¤à¤¸à¥‡ ही रहने दें -->',
+ 'spam-invalid-lines' => 'निमà¥à¤¨à¤¾à¤‚कित अवांछित बà¥à¤²à¥ˆà¤•à¤²à¤¿à¤¸à¥à¤Ÿ {{PLURAL:$1|पंकà¥à¤¤à¤¿|पंकà¥à¤¤à¤¿à¤¯à¤¾à¤}} अमानà¥à¤¯ नियमित {{PLURAL:$1|अभिवà¥à¤¯à¤•à¥à¤¤à¤¿ है|अभिवà¥à¤¯à¤•à¥à¤¤à¤¿à¤¯à¤¾à¤ हैं}} और पृषà¥à¤  को जमा कराने से पहले ठीक करना चाहिà¤:',
+ 'spam-blacklist-desc' => 'रेजà¤à¤•à¥à¤¸ पर आधारित सà¥à¤ªà¥…म रोकनेवाला उपकरण:[[MediaWiki:Spam-blacklist]] और [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Croatian (hrvatski)
+ * @author Dnik
+ * @author Roberta F.
+ * @author SpeedyGonsales
+ */
+$messages['hr'] = array(
+ 'spam-blacklist' => ' # Vanjske URLovi koji budu pronađeni pomoću ovog popisa nije moguće snimiti na stranicu wikija.
+ # Ovaj popis utjeÄe samo na ovaj wiki; provjerite globalnu "crnu listu".
+ # Za dokumentaciju pogledajte https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# Rabi se sljedeća sintaksa:
+# * Sve poslije "#" znaka do kraja linije je komentar
+# * svaki redak koji nije prazan dio je regularnog izraza (\'\'regex fragment\'\') koji odgovara imenu poslužitelja u URL-u
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Vanjski URLovi koji budu pronađeni pomoću ovog popisa nisu blokirani
+# Äak iako se nalaze na "crnom popisu".
+#
+# Rabi se slijedeća sintaksa:
+# * Sve poslije "#" znaka do kraja linije je komentar
+# * svaki neprazni redak je dio regularnog izraza (\'\'regex fragment\'\') koji odgovara imenu poslužitelja u URL-u
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Slijedeći redak|Slijedeći redovi|Slijedeći redovi}} "crnog popisa" spama {{PLURAL:$1|je|su}} nevaljani {{PLURAL:$1|regularan izraz|regularni izrazi|regularni izrazi}} i {{PLURAL:$1|mora|moraju|moraju}} biti ispravljeni prije snimanja ove stranice:',
+ 'spam-blacklist-desc' => 'Anti-spam alat zasnovan na reg. izrazima: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Upper Sorbian (hornjoserbsce)
+ * @author Michawiki
+ */
+$messages['hsb'] = array(
+ 'spam-blacklist' => ' # Eksterne URL, kotrež su w lisćinje wobsahowane, blokuja składowanje strony.
+ # Tuta lisćina nastupa jenož tutón Wiki; hlej tež globalnu Äornu lisćinu.
+ # Za dokumentaciju hlej https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Tuta linka njesmě so změnić! --> <pre>
+#
+# Syntaksa:
+# * WÅ¡itko wot znamjenja "#" haÄ ke kóncej linki je komentar
+# * Kóžda njeprózdna linka je regularny wuraz, kotryž so přećiwo mjenu hosta w URL pruwuje.
+
+ #</pre> <!-- Tuta linka njesmě so změnić! -->',
+ 'spam-whitelist' => ' #<!-- Tuta linka njesmě so změnić! --> <pre>
+# Eksterne URL, kotrež su w tutej lisćinje wobsahowane, njeblokuja składowanje strony, byrnjež
+# w globalnej abo lokalnej Äornej lisćinje wobsahowane byli.
+#
+# Syntaksa:
+# * WÅ¡itko wot znamjenja "#" haÄ ke kóncej linki je komentar
+# * Kóžda njeprózdna linka je regularny wuraz, kotryž so přećiwo mjenu hosta w URL pruwuje.
+
+ #</pre> <!-- Tuta linka njesmě so změnić! -->',
+ 'email-blacklist' => '# E-mejlowe adresy, kotrež su w lisćinje wobsahowane, blokuja registrowanje a słanje e-mejlkow.
+ # Tuta lisćina nastupa jenož tutón Wiki; hlej tež globalnu Äornu lisćinu.
+ # Za dokumentaciju hlej https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Tuta linka njesmě so změnić! --> <pre>
+#
+# Syntaksa:
+# * WÅ¡itko wot znamjenja "#" haÄ ke kóncej linki je komentar
+# * Kóžda njeprózdna linka je regularny wuraz, kotryž so přećiwo mjenu hosta w e-mejlach pruwuje.
+
+ #</pre> <!-- Tuta linka njesmě so změnić! -->',
+ 'email-whitelist' => '#<!-- Tuta linka njesmě so změnić! --> <pre>
+# E-mejlowe adresy, kotrež su w tutej lisćinje, *nje*blokuja so, byrnjež so
+# pÅ™ez zapiski Äornje lisćiny blokowali.
+#
+ #</pre> <!-- Tuta linka njesmě so změnić! -->
+# Syntaksa je slědowaca:
+# * Wšitko wot znamješka "#" ke kóncej linki je komentar
+# * Kóžda njeprózdna linka je regularny wuraz, kotryž jenož hostam znutřka e-mejlow wotpowěduje',
+ 'spam-blacklisted-email' => 'E-mejlowe adresy w Äornej lisćinje',
+ 'spam-blacklisted-email-text' => 'Twoja e-mejlowa adresa je tuchwilu w Äornej lisćinje a tohodla za sÅ‚anje e-mejlow do druhich wužiwarjow zablokowana.',
+ 'spam-blacklisted-email-signup' => 'Podata e-mejlowa adresa je tuchwilu přećiwo wužiwanju zablokowana.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|slÄ›dowaca linka je njepÅ‚aćiwy regularny wuraz|slÄ›dowacych linkow je regularny wuraz|slÄ›dowace linki su regularne wurazy|slÄ›dowacej lince stej regularnej wurazaj}} a {{PLURAL:$1|dyrbi|dyrbi|dyrbja|dyrbjetej}} so korigować, prjedy haÄ so strona skÅ‚aduje:',
+ 'spam-blacklist-desc' => 'Přećiwospamowy nastroj na zakładźe Regex: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Hungarian (magyar)
+ * @author Dani
+ * @author Dj
+ * @author TK-999
+ */
+$messages['hu'] = array(
+ 'spam-blacklist' => ' # A lista elemeire illeszkedő külső hivatkozások blokkolva lesznek
+ # A lista csak erre a wikire vonatkozik; a globális feketelistába is tedd bele.
+ # Dokumentációhoz lásd a https://www.mediawiki.org/wiki/Extension:SpamBlacklist oldalt (angolul)
+ #<!-- ezen a soron ne változtass --> <pre>
+#
+# A szintaktika a következő:
+# * Minden a „#†karaktertől a sor végéig megjegyzésnek számít
+# * Minden nem üres sor egy reguláris kifejezés darabja, amely csak az URL-ekben található kiszolgálókra illeszkedik',
+ 'spam-whitelist' => ' #<!-- ezen a soron ne változtass --> <pre>
+# A lista elemeire illeszkedő külső hivatkozások *nem* lesznek blokkolva, még
+# akkor sem, ha illeszkedik egy feketelistás elemre.
+#
+# A szintaktika a következő:
+# * Minden a „#†karaktertől a sor végéig megjegyzésnek számít
+# * Minden nem üres sor egy reguláris kifejezés darabja, amely csak az URL-ekben található kiszolgálókra illeszkedik
+
+ #</pre> <!-- ezen a soron ne változtass -->',
+ 'spam-blacklisted-email' => 'Feketelistás e-mail cím',
+ 'spam-blacklisted-email-signup' => 'A megadott email cím jelenleg feketelistán van, és nem lehet használni.',
+ 'spam-invalid-lines' => 'Az alábbi {{PLURAL:$1|sor hibás|sorok hibásak}} a spam elleni feketelistában; {{PLURAL:$1|javítsd|javítsd őket}} mentés előtt:',
+ 'spam-blacklist-desc' => 'Regex-alapú spamellenes eszköz: [[MediaWiki:Spam-blacklist]] és [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Interlingua (interlingua)
+ * @author McDutchie
+ */
+$messages['ia'] = array(
+ 'spam-blacklist' => ' # Le adresses URL externe correspondente a iste lista es blocate de esser addite a un pagina.
+ # Iste lista ha effecto solmente in iste wiki; refere te etiam al lista nigre global.
+ # Pro documentation vide https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- non modificar in alcun modo iste linea --> <pre>
+#
+# Le syntaxe es lo sequente:
+# * Toto a partir de un character "#" usque al fin del linea es un commento
+# * Cata linea non vacue es un fragmento de regex que se applica solmente al nomines de host intra adresses URL
+
+ #</pre> <!-- non modificar in alcun modo iste linea -->',
+ 'spam-whitelist' => ' #<!-- non modificar in alcun modo iste linea --> <pre>
+# Le adresses URL correspondente a iste lista *non* essera blocate mesmo si illos
+# haberea essite blocate per entratas in le lista nigre.
+#
+# Le syntaxe es lo sequente:
+# * Toto a partir de un character "#" usque al fin del linea es un commento
+# * Omne linea non vacue es un fragmento de regex que se applica solmente al nomines de host intra adresses URL
+
+ #</pre> <!-- non modificar in alcun modo iste linea -->',
+ 'email-blacklist' => ' # Le adresses de e-mail correspondente a iste lista es blocate de crear contos o inviar e-mail.
+ # Iste lista ha effecto solmente in iste wiki; refere te etiam al lista nigre global.
+ # Pro documentation vide https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- non modificar in alcun modo iste linea --> <pre>
+#
+# Le syntaxe es lo sequente:
+# * Toto a partir de un character "#" usque al fin del linea es un commento
+# * Cata linea non vacue es un fragmento de regex que se applica solmente al nomines de host in adresses de e-mail
+
+ #</pre> <!-- non modificar in alcun modo iste linea -->',
+ 'email-whitelist' => ' #<!-- non modificar in alcun modo iste linea --> <pre>
+# Le adresses de e-mail correspondente a iste lista *non* essera blocate
+# mesmo si illos haberea essite blocate per entratas de lista nigre.
+#
+# Le syntaxe es lo sequente:
+# * Toto a partir de un character "#" usque al fin del linea es un commento
+# * Cata linea non vacue es un fragmento de regex que se applica solmente al nomines de host in adresses de e-mail
+ #</pre> <!-- non modificar in alcun modo iste linea -->',
+ 'spam-blacklisted-email' => 'Adresse de e-mail in lista nigre',
+ 'spam-blacklisted-email-text' => 'Tu adresse de e-mail es actualmente blocate de inviar messages a altere usatores.',
+ 'spam-blacklisted-email-signup' => 'Le adresse de e-mail specificate es actualmente blocate per le lista nigre.',
+ 'spam-invalid-lines' => 'Le sequente {{PLURAL:$1|linea|lineas}} del lista nigre antispam es {{PLURAL:$1|un expression|expressiones}} regular invalide e debe esser corrigite ante que tu immagazina le pagina:',
+ 'spam-blacklist-desc' => 'Instrumento antispam a base de regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Indonesian (Bahasa Indonesia)
+ * @author Farras
+ * @author IvanLanin
+ * @author Meursault2004
+ */
+$messages['id'] = array(
+ 'spam-blacklist' => '
+ # URL eksternal yang cocok dengan daftar berikut akan diblokir jika ditambahkan pada suatu halaman.
+ # Daftar ini hanya berpengaruh pada wiki ini; rujuklah juga daftar hitam global.
+ # Untuk dokumentasi, lihat https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- biarkan baris ini seperti adanya --> <pre>
+#
+# Sintaksnya adalah sebagai berikut:
+# * Semua yang diawali dengan karakter "#" hingga akhir baris adalah komentar
+# * Semua baris yang tidak kosong adalah fragmen regex yang hanya akan dicocokkan dengan nama host di dalam URL
+
+ #</pre> <!-- biarkan baris ini seperti adanya -->',
+ 'spam-whitelist' => ' #<!-- biarkan baris ini seperti adanya --> <pre>
+ # URL eksternal yang cocok dengan daftar berikut *tidak* akan diblokir walaupun
+# pasti akan diblokir oleh entri pada daftar hitam
+#
+# Sintaksnya adalah sebagai berikut:
+# * Semua yang diawali dengan karakter "#" hingga akhir baris adalah komentar
+# * Semua baris yang tidak kosong adalah fragmen regex yang hanya akan dicocokkan dengan nama host di dalam URL
+
+ #</pre> <!-- biarkan baris ini seperti adanya -->',
+ 'spam-blacklisted-email' => 'Alamat surel yang masuk daftar hitam',
+ 'spam-blacklisted-email-signup' => 'Alamat surel yang dimasukkan saat ini sedang tidak boleh digunakan.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Baris|Baris-baris}} daftar hitam spam berikut adalah {{PLURAL:$1|ekspresi|ekspresi}} regular yang tak valid dan {{PLURAL:$1|perlu|perlu}} dikoreksi sebelum disimpan:',
+ 'spam-blacklist-desc' => 'Perkakas anti-spam berbasis regex: [[MediaWiki:Spam-blacklist]] dan [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Iloko (Ilokano)
+ * @author Lam-ang
+ */
+$messages['ilo'] = array(
+ 'spam-blacklist' => ' # Dagiti akinruar a URL a maipada iti daytoy a listaan ket maserraan to no mainayon ditoy a panid.
+ # Daytoy a listaan ket apektaranna laeng daytoy a wiki; kitaen pay ti sangalubongan a naiparit.
+ # Para iti dokumentasion kitaen ti https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- baybayan daytoy a linia --> <pre>
+#
+# Ti gramatika ket kasla dagiti sumaganad:
+# * Amin manipud iti "#" a karakter iti gibus ti linia ket komentario
+# * Amin a saan a blanko a linia ket regex a pedaso a maipada laeng ti nagsangaili ti uneg dagiti URL
+
+ #</pre> <!-- baybayan daytoy a linia -->',
+ 'spam-whitelist' => ' #<!-- baybayan daytoy a linia --> <pre>
+# Dagiti akinruar a panilpo a maipada iti daytoy a listaan ket *saan* a maserraan urayno
+# naseraanen babaen ti naikabil kadagiti panagiparitan a listaan.
+#
+ #</pre> <!-- baybayan daytoy a linia -->',
+ 'email-blacklist' => ' # Dagiti e-surat a pagtaengan a maipada iti daytoy a listaan ket maseraanto manipud ti panagrehistro wenno panagitulod kadagiti e-surat
+ # Daytoy a listaan ket apektarannna laeng daytoy a wiki; mangiturong pay ti sangalubongan a naiparit.
+ # Para iti dokumentasion kitaen ti https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- baybayan daytoy a linia --> <pre>
+#
+# Ti gramatika ket kasla dagiti sumaganad:
+# * Amin manipud iti "#" a karakter iti gibus ti linia ket komentario
+# * Amin ti saan a blanko a linia ket regex a pedaso a maipada laeng ti nagsangaili iti uneg dagiti e-surat a pagtaengan
+
+ #</pre> <!--baybayan daytoy a linia-->',
+ 'email-whitelist' => ' #<!-- baybayan daytoy a linia --> <pre>
+# Dagiti e-surat a pagtaengan a maipada iti daytoy a listaan ket *saant* a maserraan urayno
+# naserraanda babaen dagiti naikabil a naiparit.
+ #</pre> <!-- baybayan daytoy a linia -->
+# Ti gramatika ket kasla dagiti sumaganad:
+# * Amin manipud ti "#" a karakter aginggana ti gibus iti linia ket maysa a komentario
+# * Amin a saan a blanko a linia ket regex a pedaso a mangipada laeng ti nagsangaili ti uneg dagiti e-surat a pagtaengan',
+ 'spam-blacklisted-email' => 'Dagiti naiparit nga e-surat a pagtaengan',
+ 'spam-blacklisted-email-text' => 'Ti e-suratmo a pagtaengan ket agdama a naiparit manipud ti panagipatulod kadagiti e-surat kadagiti sabsabali nga agar-aramat.',
+ 'spam-blacklisted-email-signup' => 'Ti naited nga e-surat a pagatengan ket agdama a naiparit manipud ti panagusar.',
+ 'spam-invalid-lines' => 'Ti sumaganad a spam blacklist {{PLURAL:$1| a linia ket|kadagiti linia ket}} imbalido a kadawyan {{PLURAL:$1|a nangisao|kadagiti panangisao}} ken {{PLURAL:$1|masapsapol|masapol}} a mapudnuan sakbay nga idulin ti panid:',
+ 'spam-blacklist-desc' => 'Naibantay ti regex kontra-spam a ramit: [[MediaWiki:Spam-blacklist]] ken [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Icelandic (íslenska)
+ * @author Snævar
+ */
+$messages['is'] = array(
+ 'spam-blacklist' => ' # Ytri tenglar sem passa við þennan lista er ekki hægt að bæta við á síður.
+ # Þessi bannlisti hefur aðeins áhrif á þennan wiki.
+ # Einnig er til altækur bannlisti sem hefur áhrif á öll wiki verkefni Wikimedia. Hann er að finna á http://meta.wikimedia.org/wiki/Spam_blacklist
+ # Leiðbeiningar eru á https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- ekki breyta þessari línu --> <pre>
+#
+# Málskipan listans er eftirfarandi:
+# * Allar línur sem byrja á "#" eru athugasemdir
+# * Allar síður sem eru ekki tómar eru reglulegar segðir sem verða aðeins bornar saman við vefsvæði tengilsins
+
+ #</pre> <!-- ekki breyta þessari línu -->',
+ 'spam-whitelist' => ' #<!-- ekki breyta þessari línu --> <pre>
+# Ytri tenglar sem passa við þennan lista verður *hægt* að bæta við á síður, þrátt fyrir að
+# þeir séu á bannlistanum.
+#
+ #</pre> <!-- ekki breyta þessari línu -->',
+ 'email-blacklist' => ' # Netföng á þessum lista verður ekki hægt að nota til þess að skrá notenda eða senda tölvupost á notendur
+ # Þessi bannlisti hefur eingöngu áhrif á þennan wiki, en einning er til altækur bannlisti sem hefur áhrif á öll wiki verkefni Wikimedia.
+ # Leiðbeiningar eru á https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- ekki breyta þessari línu --> <pre>
+#
+# Málskipan listans er eftirfarandi:
+# * Allar línur sem byrja á "#" eru athugasemdir
+# * Allar síður sem eru ekki tómar eru reglulegar segðir sem verða aðeins bornar saman við vefsvæði netfangsins
+
+ #</pre> <!-- ekki breyta þessari línu -->',
+ 'email-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Netföng sem passa við þennan lista verður *hægt* að bæta við á síður, þrátt fyrir að
+# þau séu á bannlistanum.
+#
+ #</pre> <!-- leave this line exactly as it is -->
+# Málskipan listans er eftirfarandi:
+# * Allar línur sem byrja á "#" eru athugasemdir
+# * Allar síður sem eru ekki tómar eru reglulegar segðir sem verða aðeins bornar saman við vefsvæði netfangsins',
+ 'spam-blacklisted-email' => 'Netfangið er á bannlista',
+ 'spam-blacklisted-email-text' => 'Netfangið þitt er skráð á bannlista og ekki er hægt að senda tölfupóst frá því til annara notenda.',
+ 'spam-blacklisted-email-signup' => 'Netfangið sem þú tilgreindir er á bannlista og er ekki hægt að nota.',
+ 'spam-invalid-lines' => 'Eftirfarandi bannlista {{PLURAL:$1|færsla er ógild regluleg segð|færslur eru ógildar reglulegar segðir}} og leiðrétta þarf {{PLURAL:$1|hana|þær}} áður en síðan er vistuð:',
+ 'spam-blacklist-desc' => 'Kæfuvörn byggð á reglulegum segðum: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Italian (italiano)
+ * @author Beta16
+ * @author BrokenArrow
+ * @author Ximo17
+ */
+$messages['it'] = array(
+ 'spam-blacklist' => ' # Le URL esterne al sito che corrispondono alla lista seguente verranno bloccate.
+ # La lista è valida solo per questo sito; fare riferimento anche alla blacklist globale.
+ # Per la documentazione si veda https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- non modificare in alcun modo questa riga --> <pre>
+# La sintassi è la seguente:
+# * Tutto ciò che segue un carattere "#" è un commento, fino al termine della riga
+# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host nelle URL
+ #</pre> <!-- non modificare in alcun modo questa riga -->',
+ 'spam-whitelist' => ' #<!-- non modificare in alcun modo questa riga --> <pre>
+# Le URL esterne al sito che corrispondono alla lista seguente *non* verranno
+# bloccate, anche nel caso corrispondano a delle voci della blacklist
+#
+# La sintassi è la seguente:
+# * Tutto ciò che segue un carattere "#" è un commento, fino al termine della riga
+# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host nelle URL
+
+ #</pre> <!-- non modificare in alcun modo questa riga -->',
+ 'email-blacklist' => ' # Gli indirizzi e-mail che corrispondono alla lista seguente saranno bloccati, non sarà possibile salvare o inviare e-mail.
+ # La lista è valida solo per questo wiki; fare riferimento anche alla blacklist globale.
+ # Per la documentazione si veda https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ # <!-- non modificare questa linea --> <pre>
+# La sintassi è la seguente:
+# * Tutto ciò che è compreso tra un carattere "#" e la fine della riga è un commento
+# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host degli indirizzi e-mail
+ #</pre> <!-- non modificare questa linea -->',
+ 'email-whitelist' => ' #<!-- non modificare questa linea --> <pre>
+# Gli indirizzi e-mail compresi in questa lista *non* saranno bloccati anche se dovrebbero
+# essere stati bloccati dagli elementi presenti nella lista nera.
+#
+ #</pre> <!-- non modificare questa linea -->
+# La sintassi è la seguente:
+# * Tutto ciò che è compreso tra un carattere "#" e la fine della riga è un commento
+# * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host degli indirizzi e-mail',
+ 'spam-blacklisted-email' => 'Indirizzo di posta elettronica bloccato',
+ 'spam-blacklisted-email-text' => "Il tuo indirizzo di posta elettronica è attualmente nella lista nera per l'invio di email verso altri utenti.",
+ 'spam-blacklisted-email-signup' => "L'indirizzo di posta elettronica indicato è attualmente nella lista nera.",
+ 'spam-invalid-lines' => "{{PLURAL:$1|La seguente riga|Le seguenti righe}} della blacklist dello spam {{PLURAL:$1|non è un'espressione regolare valida|non sono espressioni regolari valide}}; si prega di correggere {{PLURAL:$1|l'errore|gli errori}} prima di salvare la pagina.",
+ 'spam-blacklist-desc' => 'Strumento antispam basato sulle espressioni regolari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Japanese (日本語)
+ * @author Aotake
+ * @author Fryed-peach
+ * @author JtFuruhata
+ * @author Marine-Blue
+ * @author Shirayuki
+ * @author Whym
+ */
+$messages['ja'] = array(
+ 'spam-blacklist' => ' #<!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ --> <pre>
+# ã“ã®ä¸€è¦§ã«æŽ²è¼‰ã•ã‚Œã¦ã„る外部URLをページã«è¿½åŠ ã™ã‚‹ã¨ç·¨é›†ã‚’ブロックã—ã¾ã™ã€‚
+# ã“ã®ä¸€è¦§ã¯ã“ã®ã‚¦ã‚£ã‚­ã§ã®ã¿æœ‰åŠ¹ã§ã™ã€‚グローãƒãƒ« ブラックリストもå‚ç…§ã—ã¦ãã ã•ã„。
+# 利用方法㯠https://www.mediawiki.org/wiki/Extension:SpamBlacklist/ja ã‚’ã”覧ãã ã•ã„。
+#
+# 構文ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:
+# * 「#ã€ä»¥é™è¡Œæœ«ã¾ã§ã¯ã‚³ãƒ¡ãƒ³ãƒˆã§ã™
+# * 空白をå«ã¾ãªã„è¡Œã¯ã€URLã«å«ã¾ã‚Œã‚‹ãƒ›ã‚¹ãƒˆåã¨ã®ä¸€è‡´ã‚’検出ã™ã‚‹æ­£è¦è¡¨ç¾ã§ã™
+
+ #</pre> <!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ -->',
+ 'spam-whitelist' => ' #<!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ --> <pre>
+# ã“ã®ä¸€è¦§ã«æŽ²è¼‰ã•ã‚Œã¦ã„る外部URLã«ä¸€è‡´ã™ã‚‹é€ä¿¡å…ƒã‹ã‚‰ã®ãƒšãƒ¼ã‚¸ç·¨é›†ã¯ã€
+# ãŸã¨ãˆãƒ–ラックリストã«æŽ²è¼‰ã•ã‚Œã¦ã„ãŸã¨ã—ã¦ã‚‚ã€ãƒ–ロック*ã•ã‚Œã¾ã›ã‚“*。
+#
+# 構文ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:
+# * 「#ã€æ–‡å­—ã‹ã‚‰è¡Œæœ«ã¾ã§ã¯ã‚³ãƒ¡ãƒ³ãƒˆã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™
+# * 空白をå«ã¾ãªã„è¡Œã¯ã€URLã«å«ã¾ã‚Œã‚‹ãƒ›ã‚¹ãƒˆåã¨ã®ä¸€è‡´ã‚’検出ã™ã‚‹æ­£è¦è¡¨ç¾ã§ã™
+
+ #</pre> <!-- ã“ã®è¡Œã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„ -->',
+ 'spam-blacklisted-email' => 'æ‹’å¦ãƒªã‚¹ãƒˆã«ã‚るメールアドレス',
+ 'spam-blacklisted-email-text' => 'メールアドレスãŒæ‹’å¦ãƒªã‚¹ãƒˆã«å…¥ã£ã¦ã„ã‚‹ãŸã‚ã€ä»–ã®åˆ©ç”¨è€…ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã§ãã¾ã›ã‚“。',
+ 'spam-blacklisted-email-signup' => '指定ã•ã‚ŒãŸãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ç¾åœ¨æ‹’å¦ãƒªã‚¹ãƒˆã«å…¥ã£ã¦ãŠã‚Šã€ä½¿ç”¨ã§ãã¾ã›ã‚“。',
+ 'spam-invalid-lines' => 'ã“ã®ã‚¹ãƒ‘ムブラックリストã«ã¯ã€ç„¡åŠ¹ãª{{PLURAL:$1|æ­£è¦è¡¨ç¾}}ã‚’å«ã‚€{{PLURAL:$1|è¡Œ}}ãŒã‚ã‚Šã¾ã™ã€‚ä¿å­˜ã™ã‚‹å‰ã«å•é¡Œéƒ¨åˆ†ã‚’修正ã—ã¦ãã ã•ã„:',
+ 'spam-blacklist-desc' => 'æ­£è¦è¡¨ç¾ã‚’用ã„ãŸã‚¹ãƒ‘ム対策ツール: [[MediaWiki:Spam-blacklist|スパムブラックリスト]]ãŠã‚ˆã³[[MediaWiki:Spam-whitelist|スパムホワイトリスト]]',
+);
+
+/** Jutish (jysk)
+ * @author Ælsån
+ */
+$messages['jut'] = array(
+ 'spam-blacklist-desc' => 'Regex-basærn anti-spem tø: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Javanese (Basa Jawa)
+ * @author Meursault2004
+ * @author NoiX180
+ */
+$messages['jv'] = array(
+ 'spam-blacklist' => ' # URL eksternal sing cocog karo daftar iki bakal diblokir yèn ditambahaké ing sawijining kaca.
+ # Daftar iki namung nduwé pangaruh ing wiki iki; ngrujuka uga daftar ireng global.
+ # Kanggo dokumentasi, delengen https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- lirwakna baris iki apa anané --> <pre>
+#
+# Sintaksisé kaya mengkéné:
+# * Kabèh sing diawali mawa karakter "#" nganti tekaning akir baris iku komentar
+# * Kabèh baris sing ora kosong iku fragmèn regex sing namung bakal dicocogaké karo jeneng host sajroning URL-URL
+
+ #</pre> <!-- lirwakna baris iki apa anané -->',
+ 'spam-whitelist' => ' #<!-- lirwakna baris iki apa anané --> <pre>
+ # URL èksternal sing cocog karo daftar iki *ora* bakal diblokir senadyan
+# bakal diblokir déning èntri ing daftar ireng
+#
+# Sintaksisé kaya mengkéné:
+# * Kabèh sing diawali mawa karakter "#" nganti tekaning akir baris iku komentar
+# * Kabèh baris sing ora kosong iku fragmèn regex sing namung bakal dicocogaké karo jeneng host sajroning URL-URL
+
+ #</pre> <!-- lirwakna baris iki apa anané -->',
+ 'spam-blacklisted-email' => 'Alamat layang èlèktronik kalebu nèng daptar ireng',
+ 'spam-blacklisted-email-text' => 'Alamat layang èlèktronik Sampéyan saiki didaptarirengaké saka ngirim layang èlèktronik nèng panganggi liya.',
+ 'spam-blacklisted-email-signup' => 'Alamat layang èlèktronik sing diawèhaké saiki ora dililakaké.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Baris|Baris-baris}} daftar ireng spam ing ngisor iki yaiku {{PLURAL:$1|èksprèsi|èksprèsi}} regulèr sing ora absah lan {{PLURAL:$1|perlu|perlu}} dikorèksi sadurungé disimpen:',
+ 'spam-blacklist-desc' => 'Piranti anti-spam adhedhasar regex: [[MediaWiki:Spam-blacklist]] lan [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Georgian (ქáƒáƒ áƒ—ული)
+ * @author David1010
+ * @author გიáƒáƒ áƒ’იმელáƒ
+ */
+$messages['ka'] = array(
+ 'spam-blacklist' => ' # áƒáƒ› სიის შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ გáƒáƒ áƒ” ბმულები áƒáƒ˜áƒ™áƒ áƒ«áƒáƒšáƒ”ბრგვერდებში შესáƒáƒ¢áƒáƒœáƒáƒ“.
+ # ეს სირმáƒáƒ¥áƒ›áƒ”დებს მáƒáƒ áƒ¢áƒ áƒáƒ› ვიკისთვის, თუმცრáƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს áƒáƒ¡áƒ”ვე სáƒáƒ”რთრშáƒáƒ•áƒ˜ სიáƒ.
+ # დáƒáƒ›áƒáƒ¢áƒ”ბით ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ გვერდზე https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- áƒáƒ  შეáƒáƒ¡áƒ¬áƒáƒ áƒáƒ— ეს ხáƒáƒ–ი --> <pre>
+#
+# სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡áƒ˜:
+# * ყველáƒáƒ¤áƒ”რი დáƒáƒ¬áƒ§áƒ”ბული სიმბáƒáƒšáƒáƒ—ი "#" ხáƒáƒ–ის ბáƒáƒšáƒáƒ›áƒ“ე კáƒáƒ›áƒ”ნტáƒáƒ áƒáƒ“ ითვლებáƒ
+# * ყველრáƒáƒ áƒáƒªáƒáƒ áƒ˜áƒ”ლი ხáƒáƒ–რáƒáƒ áƒáƒ¡ რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ—ქმის ფრáƒáƒ’მენტი, რáƒáƒ›áƒ”ლიც მხáƒáƒšáƒáƒ“ URL-თáƒáƒœ ერთáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ
+
+ #</pre> <!-- áƒáƒ  შეáƒáƒ¡áƒ¬áƒáƒ áƒáƒ— ეს ხáƒáƒ–ი -->',
+ 'spam-whitelist' => ' #<!-- áƒáƒ  შეáƒáƒ¡áƒ¬áƒáƒ áƒáƒ— ეს ხáƒáƒ–ი --> <pre>
+# ის გáƒáƒ áƒ” ბმულები, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ› სიáƒáƒ¨áƒ˜áƒ შეტáƒáƒœáƒ˜áƒšáƒ˜ *áƒáƒ  დáƒáƒ˜áƒ‘ლáƒáƒ™áƒ”ბáƒ* მáƒáƒ¨áƒ˜áƒœáƒáƒª კი, თუ შáƒáƒ• სიáƒáƒ¨áƒ˜ მáƒáƒ®áƒ•áƒ“ებáƒ
+#
+# სინტáƒáƒ¥áƒ¡áƒ˜:
+# * ყველáƒáƒ¤áƒ”რი სიმბáƒáƒš "#" иდáƒáƒ¬áƒ§áƒ”ბული ბáƒáƒšáƒáƒ›áƒ“ე კáƒáƒ›áƒ”ნტáƒáƒ áƒáƒ“ ითვლებáƒ
+# * ყველრáƒáƒ áƒáƒªáƒáƒ áƒ˜áƒ”ლი ხáƒáƒ–ი áƒáƒ áƒ˜áƒ¡ რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ—ქმის ნáƒáƒ¬áƒ˜áƒšáƒ˜, რáƒáƒ›áƒ”ლიც მხáƒáƒšáƒáƒ“ URL-თáƒáƒœ ერთáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ
+
+ #</pre> <!--áƒáƒ  შეáƒáƒ¡áƒ¬áƒáƒ áƒáƒ— ეს ხáƒáƒ–ი-->',
+ 'email-blacklist' => ' # áƒáƒ› სიის შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ები დáƒáƒ˜áƒ‘ლáƒáƒ™áƒ”ბრრეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ’áƒáƒœ, áƒáƒœ ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡áƒáƒ’áƒáƒœ
+ # ეს სირმáƒáƒ¥áƒ›áƒ”დებს მáƒáƒ áƒ¢áƒ áƒáƒ› ვიკისთვის, თუმცრáƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს áƒáƒ¡áƒ”ვე სáƒáƒ”რთრშáƒáƒ•áƒ˜ სიáƒ.
+ # დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ—ვის იხილეთ https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- áƒáƒ  შეáƒáƒ¡áƒ¬áƒáƒ áƒáƒ— ეს ხáƒáƒ–ი --> <pre>
+#
+# სინტáƒáƒ¥áƒ¡áƒ˜:
+# * ყველáƒáƒ¤áƒ”რი დáƒáƒ¬áƒ§áƒ”ბული სიმბáƒáƒšáƒáƒ—ი "#" ხáƒáƒ–ის ბáƒáƒšáƒáƒ›áƒ“ე კáƒáƒ›áƒ”ნტáƒáƒ áƒáƒ“ ითვლებáƒ
+# * ყველრáƒáƒ áƒáƒªáƒáƒ áƒ˜áƒ”ლი ხáƒáƒ–ი áƒáƒ áƒ˜áƒ¡ რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ—ქმის ფრáƒáƒ’მენტი, რáƒáƒ›áƒ”ლიც გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ, მხáƒáƒšáƒáƒ“ ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ შიდრმისáƒáƒ›áƒáƒ áƒ—ების კვáƒáƒœáƒ«áƒ”ბთáƒáƒœ
+
+ #</pre> <!-- áƒáƒ  შეáƒáƒ¡áƒ¬áƒáƒ áƒáƒ— ეს ხáƒáƒ–ი -->',
+ 'email-whitelist' => ' #<!-- ეს ხáƒáƒ–ი áƒáƒ  შეცვáƒáƒšáƒáƒ— --> <pre>
+# áƒáƒ› სიის შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ები *áƒáƒ * დáƒáƒ˜áƒ‘ლáƒáƒ™áƒ”ბáƒ
+# იმ შემთხვევáƒáƒ¨áƒ˜áƒª კი, თუ ისინი შáƒáƒ• სიáƒáƒ¨áƒ˜áƒ შეტáƒáƒœáƒ˜áƒšáƒ˜.
+#
+ #</pre> <!-- ეს ხáƒáƒ–ი áƒáƒ  შეცვáƒáƒšáƒáƒ— -->
+# სინტáƒáƒ¥áƒ¡áƒ˜:
+# * ყველáƒ, დáƒáƒ¬áƒ§áƒ”ბული სიმბლáƒáƒ—ი "#" დრხáƒáƒ–ის ბáƒáƒšáƒáƒ›áƒ“ე ითვლებრკáƒáƒ›áƒ”ნტáƒáƒ áƒáƒ“
+# * ყველრáƒáƒ áƒáƒªáƒáƒ áƒ˜áƒ”ლი ხáƒáƒ–ი წáƒáƒ áƒ›áƒáƒáƒ“გენს რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ®áƒáƒ¢áƒ•áƒ˜áƒ¡ ფრáƒáƒ’მენტს, რáƒáƒ›áƒ”ლიც გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ების შიდრკვáƒáƒœáƒ«áƒ”ბისáƒáƒ—ვის',
+ 'spam-blacklisted-email' => 'შáƒáƒ• სიáƒáƒ¨áƒ˜ შეტáƒáƒœáƒ˜áƒšáƒ˜ ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ები',
+ 'spam-blacklisted-email-text' => 'áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ თქვენი ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი შეტáƒáƒœáƒ˜áƒšáƒ˜áƒ შáƒáƒ• სიáƒáƒ¨áƒ˜, áƒáƒ›áƒ˜áƒ¢áƒáƒ› თქვენ áƒáƒ  შეგიძლიáƒáƒ— სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებისáƒáƒ—ვის შეტყáƒáƒ‘ინებების გáƒáƒ’ზáƒáƒ•áƒœáƒ.',
+ 'spam-blacklisted-email-signup' => 'მითითებული ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი შეტáƒáƒœáƒ˜áƒšáƒ˜áƒ შáƒáƒ• სიáƒáƒ¨áƒ˜ დრმისი გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|შáƒáƒ•áƒ˜ სიის შემდეგმრხáƒáƒ–მრშესáƒáƒ«áƒšáƒáƒ შეიცáƒáƒ•áƒ“ეს áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რეგულáƒáƒ áƒ£áƒ¡áƒšáƒ˜ გáƒáƒ›áƒáƒ—ქმრდრუნდრგáƒáƒ¡áƒ¬áƒáƒ áƒ“ეს|შáƒáƒ•áƒ˜ სიის შემდეგმრხáƒáƒ–ებმრშესáƒáƒ«áƒšáƒáƒ შეიცáƒáƒ•áƒ“ეს áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რეგულáƒáƒ áƒ£áƒ¡áƒšáƒ˜ გáƒáƒ›áƒáƒ—ქმები დრუნდრგáƒáƒ¡áƒ¬áƒáƒ áƒ“ეს}} შენáƒáƒ®áƒ•áƒáƒ›áƒ“ე:',
+ 'spam-blacklist-desc' => 'რეგულáƒáƒ áƒ£áƒš გáƒáƒ›áƒáƒ—ქმებზე დáƒáƒ¤áƒ£áƒ«áƒœáƒ”ბული áƒáƒœáƒ¢áƒ˜-სპáƒáƒ› ინსტრუმენტი[[MediaWiki:Spam-blacklist]] დრ[[MediaWiki:Spam-whitelist]]',
+);
+
+/** Kazakh (Arabic script) (قازاقشا (تٴوتە)â€)
+ */
+$messages['kk-arab'] = array(
+ 'spam-blacklist' => ' # وسى تىزىمگە سايكەس سىرتقى URL جايلار بەتكە ۇستەۋدەن بۇعاتتالادى.
+ # بۇل ٴتىزىم تەك مىنداعى ۋىيكىيگە اسەر ەتەدى; تاعى دا عالامدىق قارا ٴتىزىمدى قاراپ شىعىڭىز.
+ # قۇجاتتاما ٴۇشىن https://www.mediawiki.org/wiki/Extension:SpamBlacklist بەتىن قاراڭىز
+ #<!-- بۇل جولدى بولعان جاعدايىمەن قالدىرىڭىز --> <pre>
+#
+# سىينتاكسىيسى كەلەسىدەي:
+# * «#» نىشانىنان باستاپ جول اياعىنا دەيىنگىلەرىنىڭ بۇكىلى ماندەمە دەپ سانالادى
+# * بوس ەمەس ٴار جول تەك URL جايلاردىڭ ىشىندەگى حوستتارعا سايكەس جۇيەلى ايتىلىمدىڭ (regex) بولىگى دەپ سانالادى
+
+ #</pre> <!-- بۇل جولدى بولعان جاعدايىمەن قالدىرىڭىز -->',
+ 'spam-whitelist' => ' #<!-- بۇل جولدى بولعان جاعدايىمەن قالدىرىڭىز --> <pre>
+# وسى تىزىمگە سايكەس سىرتقى URL جايلار *بۇعاتتالمايدى*,
+# (قارا تىزىمدەگى جازبامەن بۇعاتتالعان بولسا دا).
+#
+# سىينتاكسىيسى كەلەسىدەي:
+# * «#» نىشانىنان باستاپ جول اياعىنا دەيىنگىلەرىنىڭ بۇكىلى ماندەمە دەپ سانالادى
+# * بوس ەمەس ٴار جول تەك URL جايلاردىڭ ىشىندەگى حوستتارعا سايكەس جۇيەلى ايتىلىمدىڭ (regex) بولىگى دەپ سانالادى
+
+ #</pre> <!-- بۇل جولدى بولعان جاعدايىمەن قالدىرىڭىز -->',
+ 'spam-invalid-lines' => 'سپام قارا تىزىمىندەگى كەلەسى {{PLURAL:$1|جولدا|جولداردا}} جارامسىز جۇيەلى {{PLURAL:$1|ايتىلىم|ايتىلىمدار}} بار, جانە بەتتى ساقتاۋدىڭ {{PLURAL:$1|بۇنى|بۇلاردى}} دۇرىستاۋ كەرەك.',
+);
+
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author AlefZet
+ */
+$messages['kk-cyrl'] = array(
+ 'spam-blacklist' => ' # ОÑÑ‹ тізімге ÑÓ™Ð¹ÐºÐµÑ Ñыртқы URL жайлар бетке Ò¯Ñтеуден бұғатталады.
+ # Бұл тізім тек мындағы уикиге Ó™Ñер етеді; тағы да ғаламдық қара тізімді қарап шығыңыз.
+ # Құжаттама үшін https://www.mediawiki.org/wiki/Extension:SpamBlacklist бетін қараңыз
+ #<!-- бұл жолды болған жағдайымен қалдырыңыз --> <pre>
+#
+# СинтакÑиÑÑ– келеÑідей:
+# * «#» нышанынан баÑтап жол аÑғына дейінгілерінің бүкілі мәндеме деп Ñаналады
+# * Ð‘Ð¾Ñ ÐµÐ¼ÐµÑ Ó™Ñ€ жол тек URL жайлардың ішіндегі хоÑттарға ÑÓ™Ð¹ÐºÐµÑ Ð¶Ò¯Ð¹ÐµÐ»Ñ– айтылымдың (regex) бөлігі деп Ñаналады
+
+ #</pre> <!-- бұл жолды болған жағдайымен қалдырыңыз -->',
+ 'spam-whitelist' => ' #<!-- бұл жолды болған жағдайымен қалдырыңыз --> <pre>
+# ОÑÑ‹ тізімге ÑÓ™Ð¹ÐºÐµÑ Ñыртқы URL жайлар *бұғатталмайды*,
+# (қара тізімдегі жазбамен бұғатталған болÑа да).
+#
+# СинтакÑиÑÑ– келеÑідей:
+# * «#» нышанынан баÑтап жол аÑғына дейінгілерінің бүкілі мәндеме деп Ñаналады
+# * Ð‘Ð¾Ñ ÐµÐ¼ÐµÑ Ó™Ñ€ жол тек URL жайлардың ішіндегі хоÑттарға ÑÓ™Ð¹ÐºÐµÑ Ð¶Ò¯Ð¹ÐµÐ»Ñ– айтылымдың (regex) бөлігі деп Ñаналады
+
+ #</pre> <!-- бұл жолды болған жағдайымен қалдырыңыз -->',
+ 'spam-invalid-lines' => 'Спам қара тізіміндегі келеÑÑ– {{PLURAL:$1|жолда|жолдарда}} жарамÑыз жүйелі {{PLURAL:$1|айтылым|айтылымдар}} бар, және бетті Ñақтаудың {{PLURAL:$1|бұны|бұларды}} дұрыÑтау керек.',
+);
+
+/** Kazakh (Latin script) (qazaqşa (latın)‎)
+ */
+$messages['kk-latn'] = array(
+ 'spam-blacklist' => ' # Osı tizimge säýkes sırtqı URL jaýlar betke üstewden buğattaladı.
+ # Bul tizim tek mındağı wïkïge äser etedi; tağı da ğalamdıq qara tizimdi qarap şığıñız.
+ # Qujattama üşin https://www.mediawiki.org/wiki/Extension:SpamBlacklist betin qarañız
+ #<!-- bul joldı bolğan jağdaýımen qaldırıñız --> <pre>
+#
+# Sïntaksïsi kelesideý:
+# * «#» nışanınan bastap jol ayağına deýingileriniñ bükili mändeme dep sanaladı
+# * Bos emes är jol tek URL jaýlardıñ işindegi xosttarğa säýkes jüýeli aýtılımdıñ (regex) böligi dep sanaladı
+
+ #</pre> <!-- bul joldı bolğan jağdaýımen qaldırıñız -->',
+ 'spam-whitelist' => ' #<!-- bul joldı bolğan jağdaýımen qaldırıñız --> <pre>
+# Osı tizimge säýkes sırtqı URL jaýlar *buğattalmaýdı*,
+# (qara tizimdegi jazbamen buÄŸattalÄŸan bolsa da).
+#
+# Sïntaksïsi kelesideý:
+# * «#» nışanınan bastap jol ayağına deýingileriniñ bükili mändeme dep sanaladı
+# * Bos emes är jol tek URL jaýlardıñ işindegi xosttarğa säýkes jüýeli aýtılımdıñ (regex) böligi dep sanaladı
+
+ #</pre> <!-- bul joldı bolğan jağdaýımen qaldırıñız -->',
+ 'spam-invalid-lines' => 'Spam qara tizimindegi kelesi {{PLURAL:$1|jolda|joldarda}} jaramsız jüýeli {{PLURAL:$1|aýtılım|aýtılımdar}} bar, jäne betti saqtawdıñ {{PLURAL:$1|bunı|bulardı}} durıstaw kerek.',
+);
+
+/** Korean (한국어)
+ * @author Albamhandae
+ * @author Klutzy
+ * @author Kwj2772
+ * @author ì•„ë¼
+ */
+$messages['ko'] = array(
+ 'spam-blacklist' => ' # ì´ í•„í„°ì— í•´ë‹¹í•˜ëŠ” URLì„ ë¬¸ì„œì— ë„£ì„ ê²½ìš° 해당 íŽ¸ì§‘ì˜ ì €ìž¥ì„ ìžë™ìœ¼ë¡œ 막습니다.
+ # ì´ í•„í„°ëŠ” 여기 위키 ë‚´ì—서만 ì ìš©ë©ë‹ˆë‹¤. ê´‘ì—­ 블랙리스트 ê¸°ëŠ¥ì´ ìžˆì„ ê²½ìš° 해당 목ë¡ë„ ìž‘ë™í•©ë‹ˆë‹¤.
+ # ìžì„¸í•œ ë‚´ìš©ì€ https://www.mediawiki.org/wiki/Extension:SpamBlacklist (ì˜ì–´) 문서를 참고해 주세요.
+ #<!-- ì´ ì¤„ì€ íŽ¸ì§‘í•˜ì§€ ë§ì•„ 주세요. 문서 ëª¨ì–‘ì„ ìœ„í•œ 줄입니다.--> <pre>
+#
+# ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다.
+# * "#"ì€ ì£¼ì„ ê¸°í˜¸ìž…ë‹ˆë‹¤. 줄ì—ì„œ #ê°€ 있는 ë¶€ë¶„ë¶€í„°ì˜ ê¸€ìžëŠ” ëª¨ë‘ ë¬´ì‹œë©ë‹ˆë‹¤.
+# * ê° ì¤„ì€ ì •ê·œ 표현ì‹ìœ¼ë¡œ, URL 문장 내부를 검사하는 ë°ì— 사용ë©ë‹ˆë‹¤.
+
+ #</pre> <!-- ì´ ì¤„ì€ íŽ¸ì§‘í•˜ì§€ ë§ì•„ 주세요. 문서 ëª¨ì–‘ì„ ìœ„í•œ 줄입니다. -->',
+ 'spam-whitelist' => ' # <!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> <pre>
+# ì´ ëª©ë¡ì— í¬í•¨ë˜ëŠ” 바깥 URLì€ ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì— ì˜í•´ 차단ë˜ì–´
+# 있ë”ë¼ë„ 문서 íŽ¸ì§‘ì´ ì œí•œë˜ì§€ 않습니다.
+#
+# ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다.
+# * "#"ì—ì„œ ê·¸ ì¤„ì˜ ë까지는 주ì„입니다.
+# * 모든 ì¤„ì€ URLì˜ í˜¸ìŠ¤íŠ¸ì™€ ì¼ì¹˜í•˜ëŠ” ì •ê·œ 표현ì‹ì˜ ì¼ë¶€ë¶„입니다.
+ #</pre> <!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 -->',
+ 'email-blacklist' => ' # ì´ ë¦¬ìŠ¤íŠ¸ì™€ ì¼ì¹˜í•˜ëŠ” ì´ë©”ì¼ ì£¼ì†ŒëŠ” 등ë¡ê³¼ ì´ë©”ì¼ ë°œì†¡ì´ ê¸ˆì§€ë©ë‹ˆë‹¤.
+ # ì´ ë¦¬ìŠ¤íŠ¸ëŠ” ì´ ìœ„í‚¤ì—만 ì ìš©ë©ë‹ˆë‹¤; 글로벌 ë¸”ëž™ë¦¬ìŠ¤íŠ¸ë„ í•¨ê»˜ 참조하십시오.
+ # 설명 문서를 보시려면 https://www.mediawiki.org/wiki/Extension:SpamBlacklist 를 방문해주세요.
+ #<!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> <pre>
+#
+# ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다:
+# * "#" 다ìŒë¶€í„° ì¤„ì˜ ë까지는 주ì„으로 취급ë©ë‹ˆë‹¤
+# * 빈 ì¤„ì´ ì•„ë‹Œ 모든 ì¤„ì€ ì´ë©”ì¼ ì£¼ì†Œì˜ í˜¸ìŠ¤íŠ¸ë§Œ 검사하는 ì •ê·œ 표현ì‹ìž…니다.
+
+ #<!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> </pre>',
+ 'email-whitelist' => ' #<!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> <pre>
+ # ì´ ë¦¬ìŠ¤íŠ¸ì™€ ì¼ì¹˜í•˜ëŠ” ì´ë©”ì¼ ì£¼ì†ŒëŠ” ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì— ì˜¬ë¼ê°€ 있ì„지ë¼ë„
+ # ì‚¬ìš©ì´ ê¸ˆì§€ë˜ì§€ 않습니다.
+ #
+ #<!-- ì´ ì¤„ì€ ê·¸ëŒ€ë¡œ ë‘십시오 --> </pre>
+#
+ # ë¬¸ë²•ì€ ë‹¤ìŒê³¼ 같습니다:
+ # * "#" 다ìŒë¶€í„° ì¤„ì˜ ë까지는 주ì„으로 취급ë©ë‹ˆë‹¤
+ # * 빈 ì¤„ì´ ì•„ë‹Œ 모든 ì¤„ì€ ì´ë©”ì¼ ì£¼ì†Œì˜ í˜¸ìŠ¤íŠ¸ë§Œ 검사하는 ì •ê·œ 표현ì‹ìž…니다.',
+ 'spam-blacklisted-email' => 'ì´ë©”ì¼ ì£¼ì†Œê°€ 블랙리스트ë¨',
+ 'spam-blacklisted-email-text' => 'ì´ë©”ì¼ ì£¼ì†ŒëŠ” 다른 사용ìžê°€ ì´ë©”ì¼ì„ 보내지 못하ë„ë¡ ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì— ì˜¬ë¼ì™€ 있습니다.',
+ 'spam-blacklisted-email-signup' => '입력한 ì´ë©”ì¼ ì£¼ì†ŒëŠ” 사용할 수 ì—†ë„ë¡ ë¸”ëž™ë¦¬ìŠ¤íŠ¸ë˜ì–´ 있습니다.',
+ 'spam-invalid-lines' => '스팸 ë¸”ëž™ë¦¬ìŠ¤íŠ¸ì˜ ë‹¤ìŒ {{PLURAL:$1|줄}}ì— ìž˜ëª»ëœ ì •ê·œ 표현ì‹ì´ 사용ë˜ì–´ 저장하기 ì „ì— ë°”ë¥´ê²Œ ê³ ì³ì ¸ì•¼ 합니다:',
+ 'spam-blacklist-desc' => 'ì •ê·œ 표현ì‹ì„ ì´ìš©í•´ ìŠ¤íŒ¸ì„ ë§‰ìŠµë‹ˆë‹¤: [[MediaWiki:Spam-blacklist]]와 [[MediaWiki:Spam-whitelist]]를 사용합니다.',
+);
+
+/** Colognian (Ripoarisch)
+ * @author Purodha
+ */
+$messages['ksh'] = array(
+ 'spam-blacklist' => ' # URLs noh ußerhallef uß dä Leß wäde nit zojelohße, wann se einer en en Sigg erin donn well.
+ # Heh di Liß eß bloß för heh dat Wiki joot. Loor Der och de jemeinsame „schwazze Leß“ aan.
+ # Dokkementeet is dat op https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Loß di Reih hee jenou esu wi se es --> <pre>
+# Dä Opbou es:
+# * Alles fun enem #-Zeiche bes an et Engk fun ene Reih es ene Kommentaa för de Minsche
+# * Jede Reih met jet dren es e Stöck rejolähre Ußdrok, wat alleins Domains en URLs treffe kann
+
+ #</pre> <!-- Lohß di Reih he jenou esu wi se es -->',
+ 'spam-whitelist' => ' #<!-- Loß di Reih hee jenou esu wi se es --> <pre>
+# URLs noh ußerhallef uß dä Leß wäde dorschjelohße,
+# sellefts wann se op en „schwazze Leß“ shtonn
+# Dä Opbou es:
+# * Alles fun enem #-Zeiche bes an et Engk fun ene Reih es ene Kommentaa för de Minsche
+# * Jede Reih met jet dren es e Stöck rejolähre Ußdrok, wat alleins Domains en URLs treffe kann
+ #</pre> <!-- Lohß di Reih he jenou esu wi se es -->',
+ 'email-blacklist' => ' # e-mail-Addräße uß dä Leß wäde nit zojelohße beim Aanmälde un beim e-mail-Verschecke.
+ # Heh di Liß eß bloß för heh dat Wiki joot. Loor Der och de jemeinsame „schwazze Leß“ aan.
+ # Dokkementeet is dat op https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Loß di Reih hee jenou esu wi se es --> <pre>
+# Dä Opbou es:
+# * Alles fun enem #-Zeiche bes an et Engk fun ene Reih es ene Kommentaa för de Minsche
+# * Jede Reih met jet dren es ene rejolähre Ußdrok, wohmet dä Name vum Rääschner en de e-mail-Addräße jeprööf wääde kann.
+
+ #</pre> <!-- Lohß di Reih he jenou esu wi se es -->',
+ 'email-whitelist' => ' #<!-- Loß di Reih hee jenou esu wi se es --> <pre>
+# e-mail-Addräße uß dä Leß wäde zojelohße beim Aanmälde un beim e-mail-Verschecke,
+# och wann se op en „schwazze Leß“ schtonn.
+#
+ #</pre> <!-- Lohß di Reih he jenou esu wi se es -->
+# Dä Opbou es:
+# * Alles fun enem #-Zeiche bes an et Engk fun ene Reih es ene Kommentaa för de Minsche
+# * Jede Reih met jet dren es ene rejolähre Ußdrok, wohmet dä Name vum Rääschner en de e-mail-Addräße jeprööf wääde kann.',
+ 'spam-blacklisted-email' => 'Di <i lang="en">e-mail</i>-Addräß es op der „schwazze Lėß“',
+ 'spam-blacklisted-email-text' => 'Ding <i lang="en">e-mail</i>-Addräß es em Momang op dä „schwazze Lėß“ un De kanns dermet kein <i lang="en">e-mail</i> aan ander Metmaacher verschecke.',
+ 'spam-blacklisted-email-signup' => 'Di aanjejovve Addräß för de <i lang="en">e-mail</i> es em Momang op dä „schwazze Lėß“ un kann nit jebruch wääde.',
+ 'spam-invalid-lines' => 'Mer han Fähler en rejolähre Ußdröck jefonge.
+{{PLURAL:$1|De Reih onge schtemmp nit un moß|Di $1 Reije onge schtemme nit un möße|Dat sull}}
+för em Afschpeischere eets en Oodenong jebraat wääde:',
+ 'spam-blacklist-desc' => 'Met rejolähre Ußdröck jääje der <i lang="en">SPAM<i> — övver en [[MediaWiki:Spam-blacklist|„schwazze Leß“]] un en [[MediaWiki:Spam-whitelist|Leß met Ußnahme dohfun]].',
+);
+
+/** Luxembourgish (Lëtzebuergesch)
+ * @author Robby
+ */
+$messages['lb'] = array(
+ 'spam-blacklisted-email' => 'Gespaart Mail-Adressen',
+ 'spam-blacklisted-email-text' => 'Är Mailadress ass elo gespaart fir anere Benotzer Mailen ze schécken.',
+ 'spam-blacklisted-email-signup' => "D'Mailadress déi Dir uginn hutt ass elo gespaart fir anere Benotzer Mailen ze schécken.",
+ 'spam-blacklist-desc' => 'Op regulären Ausdréck (Regex) opgebauten Tool: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Limburgish (Limburgs)
+ * @author Matthias
+ * @author Ooswesthoesbes
+ */
+$messages['li'] = array(
+ 'spam-blacklist' => " # Externe URL's die voldoen aan deze lijst waere geweigerd bie 't
+ # toevoege aan 'n pagina. Deze lijst haet allein invloed op deze wiki.
+ # Er bestaot ouk 'n globale zwarte lijst.
+ # Documentatie: https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- laot deze lien --> <pre>
+#
+# De syntax is as volg:
+# * Alles vanaaf 't karakter \"#\" tot 't einde van de regel is opmerking
+# * Iedere niet-lege regel is 'n fragment van 'n reguliere oetdrukking die
+# alleen van toepassing is op hosts binne URL's.
+
+ #</pre> <!-- laot deze lien -->",
+ 'spam-whitelist' => " #<!-- laot deze lien --> <pre>
+# Externe URL's die voldoen aan deze lijst, waere *nooit* geweigerd, al
+# zoude ze geblokkeerd motte waere door regels oet de zwarte lijst.
+#
+# De syntaxis is es volg:
+# * Alles vanaaf 't karakter \"#\" tot 't einde van de regel is opmerking
+# * Iddere neet-lege regel is 'n fragment van 'n reguliere oetdrukking die
+# allein van toepassing is op hosts binne URL's.
+
+ #</pre> <!-- laot deze lien -->",
+ 'email-blacklist' => " # E-mailadresse die voldoon aan dees lies waere geblokkeerd bie 't registrere of 't versjikke van e-mails.
+ # Dees lis haet allein invlood op deze wiki. d'r Besteit ouch 'n wikiwiej zwarte lies.
+ # Documentatie: https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- laot dees lien wie zie is --> <pre>
+#
+# De syntax is es volg:
+# * Alles vanaaf 't karakter \"#\" toet 't ènj vanne regel is 'n opmèrking
+# * Edere neet-laege regel is e fragment van 'n regulier oetdrökking die
+# allein van toepassing is op óngerbringers binne e-mailadresse.
+
+ #</pre> <!-- laot dees lien wie zie is -->",
+ 'email-whitelist' => " #<!-- laot dees lien wie zie is --> <pre>
+# E-mailadresse die voldoon aan dees lies, waere *noeatj* geweigerd, al
+# zówwe ze geblokkeerd mótte waere door regels oete zwarte lies.
+#
+# De syntaxis is es volg:
+# * Alles vanaaf 't karakter \"#\" toet 't ènj vanne regel is opmèrking
+# * Edere neet-laege regel is e fragment van 'n regulier oetdrökking die
+# allein van toepassing is op óngerbringers binne e-mailadresse.
+
+ #</pre> <!-- laot dees lien wie zie is -->",
+ 'spam-blacklisted-email' => 'E-mailadres oppe zwarte lies',
+ 'spam-blacklisted-email-text' => 'Dien e-mailadres steit momenteel oppe zwarte lies wodoor se gein e-mails nao anger gebroekers kins versjikke.',
+ 'spam-blacklisted-email-signup' => "'t Opgegaeve e-mailadres steit momenteel oppe zwarte lies.",
+ 'spam-invalid-lines' => "De volgende {{PLURAL:$1|regel|regel}} van de zwarte lies {{PLURAL:$1|is 'n|zeen}} onzjuuste reguliere {{PLURAL:$1|oetdrukking|oetdrukkinge}} en {{PLURAL:$1|mót|mótte}} verbaeterd waere alveures de pazjena kin waere opgeslage:",
+ 'spam-blacklist-desc' => 'Antispamfunctionaliteit via reguliere expressies: [[MediaWiki:Spam-blacklist]] en [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ */
+$messages['min'] = array(
+ 'spam-blacklist-desc' => 'Pakakeh anti-spam babasis regex: [[MediaWiki:Spam-blacklist]] jo [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Macedonian (македонÑки)
+ * @author Bjankuloski06
+ */
+$messages['mk'] = array(
+ 'spam-blacklist' => '# Ðадворешните URL адреÑи кои одговараат на наведеното на овој ÑпиÑок ќе бидат блокирани кога ќе Ñе поÑтават на Ñтраница.
+ # Овој ÑпиÑок важи Ñамо за ова вики; погледајте ја и глобалниот црн ÑпиÑок.
+ # За документација, видете https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# СинтакÑата е Ñледнава:
+# * Сè од знакот „#“ до крајот на редот е коментар
+# * Секој ред кој не е празен е фрагмент од регуларен израз кој Ñе Ñовпаѓа Ñамо Ñо домаќини во URL адреÑи
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Ðадворешните URL адреÑи одговараат на ÑпиÑокот *нема* да бидат блокирани дури и во Ñлучај да
+# Ñе блокирани од Ñтавки на црниот ÑпиÑок.
+#
+# СинтакÑата е Ñледнава:
+# * Сè од знакот „#“ до крајот на редот е коментар
+# * Секој ред кој не е празен е фрагмент од регуларен израз кој Ñе Ñовпаѓа Ñамо Ñо домаќини во URL адреÑи
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'email-blacklist' => '# Ðа е-поштенÑките адреÑи што ќе Ñе Ñовпаднат Ñо ÑпиÑоков *нема* ќе им биде забрането региÑтрирањето и иÑпраќањето на пошта
+# СпиÑоков важи Ñамо за ова вики; погледајте го и глобалниот црн ÑпиÑок.
+# Документација ќе најдете на https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#<!-- не менувајте го овој ред --> <pre>
+#
+# СинтакÑата е Ñледнава:
+# * Сето она што Ñе наоѓа по знакот „#“ (па до крајот на редот) е коментар
+# * Секој непразен ред е извадок од регуларен израз кој одговара Ñамо на домаќини во е-пошта
+
+ #</pre> <!-- не менувајте го овој ред -->',
+ 'email-whitelist' => '#<!-- не менувајте го овој ред --> <pre>
+# Е-поштенÑките адреÑи што ќе Ñе Ñовпаднат Ñо ÑпиÑоков *нема* да бидат блокирани, дури и
+# ако треба да Ñе блокираат ÑоглаÑно запиÑите во црниот ÑпиÑок.
+#
+ #</pre> <!-- не менувајте го овој ред -->
+# СинтакÑата е Ñледнава:
+# * Сето она што Ñтои по знакот „#“ (па до крајот на редот) е коментар
+# * Секој непразен ред е извадок од регуларен израз кој одговара Ñамо на домаќини во е-пошта',
+ 'spam-blacklisted-email' => 'Забранета адреÑа',
+ 'spam-blacklisted-email-text' => 'Ðа вашата адреÑа моментално не Ñ Ðµ дозволено да иÑпраќа е-пошта на други кориÑници.',
+ 'spam-blacklisted-email-signup' => 'Употребата на дадената адреÑа е моментално забранета.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Следниов ред во црниот ÑпиÑок на Ñпам е|Следниве редови во црниот ÑпиÑок на Ñпам Ñе}} {{PLURAL:$1|погрешен регуларен израз|погрешни регуларни изрази}} и {{PLURAL:$1|треба да Ñе поправи|треба да Ñе поправат}} пред да Ñе зачува Ñтраницата:',
+ 'spam-blacklist-desc' => 'ÐнтиÑпам алатка на оÑнова на регуларни изрази: [[MediaWiki:Spam-blacklist]] и [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Malayalam (മലയാളം)
+ * @author Praveenp
+ */
+$messages['ml'] = array(
+ 'spam-blacklist' => '# à´ˆ ലിസàµà´±àµà´±àµà´®à´¾à´¯à´¿ à´’à´¤àµà´¤àµà´ªàµ‹à´•àµà´¨àµà´¨ à´ªàµà´±à´¤àµà´¤àµ‡à´¯àµà´•àµà´•àµà´³àµà´³ യൂ.ആർ.à´Žà´²àµà´²àµà´•àµ¾ താളിൽ ചേർകàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¾àµ½ തടയàµà´¨àµà´¨à´¤à´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´‚.
+ # à´ˆ ലിസàµà´±àµà´±àµ à´ˆ വികàµà´•à´¿à´¯àµà´•àµà´•àµ മാതàµà´°à´‚ ബാധകമായ à´’à´¨àµà´¨à´¾à´£àµ; ആഗോള à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯àµà´‚ പരിശോധികàµà´•àµà´•.
+ # ഉപയോഗ സഹായിയàµà´•àµà´•à´¾à´¯à´¿ https://www.mediawiki.org/wiki/Extension:SpamBlacklist കാണàµà´•
+ #<!-- à´ˆ വരിയിൽ മാറàµà´±à´‚ വരàµà´¤àµà´¤à´°àµà´¤àµ --> <pre>
+#
+# à´Žà´´àµà´¤àµ‡à´£àµà´Ÿ രീതി താഴെ കൊടàµà´•àµà´•àµà´¨àµà´¨àµ:
+# * "#" ലിപിയിൽ à´¤àµà´Ÿà´™àµà´™à´¿ വരിയàµà´Ÿàµ† അവസാനം വരെയàµà´³àµà´³ à´Žà´¨àµà´¤àµà´‚ à´•àµà´±à´¿à´ªàµà´ªàµ (comment) ആയി കണകàµà´•à´¾à´•àµà´•àµà´‚
+# * Every non-blank line is a regex fragment which will only match hosts inside URLs
+
+ #</pre> <!-- à´ˆ വരിയിൽ മാറàµà´±à´‚ വരàµà´¤àµà´¤à´°àµà´¤àµ -->',
+ 'spam-whitelist' => ' #<!-- à´ˆ വരി ഇതàµà´ªàµ‹à´²àµ† തനàµà´¨àµ† സൂകàµà´·à´¿à´•àµà´•àµà´• --> <pre>
+# à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿à´²àµ† ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²àµà´•à´³àµà´®à´¾à´¯à´¿ à´’à´¤àµà´¤àµà´ªàµ‹à´¯àµ†à´™àµà´•à´¿àµ½ കൂടി,
+# à´ˆ ലിസàµà´±àµà´±àµà´®à´¾à´¯à´¿ à´’à´¤àµà´¤àµà´ªàµ‹à´•àµà´¨àµà´¨ à´ªàµà´±à´¤àµà´¤àµà´¨à´¿à´¨àµà´¨àµà´³àµà´³ യൂ.ആർ.à´Žà´²àµà´²àµà´•àµ¾ തടയപàµà´ªàµ†à´Ÿàµà´• *ഇലàµà´²*
+#
+# à´Žà´´àµà´¤àµà´¤àµà´°àµ€à´¤à´¿ താഴെ കൊടàµà´•àµà´•àµà´¨àµà´¨àµ:
+# * "#" à´…à´•àµà´·à´°à´¤àµà´¤à´¿àµ½ à´¤àµà´Ÿà´™àµà´™à´¿ വരിയàµà´Ÿàµ† അവസാനം വരെയàµà´³àµà´³à´¤àµ†à´¨àµà´¤àµà´‚ à´•àµà´±à´¿à´ªàµà´ªà´¾à´¯à´¿ കണകàµà´•à´¾à´•àµà´•àµà´‚
+# * റെജെകàµà´¸àµ ഘടകതàµà´¤à´¿à´²àµ† ശൂനàµà´¯à´®à´²àµà´²à´¾à´¤àµà´¤ വരികൾ à´Žà´²àµà´²à´¾à´‚ ആനàµà´¤à´°à´¿à´• യൂ.ആർ.à´Žà´²àµà´²àµà´®à´¾à´¯à´¿ à´’à´¤àµà´¤àµ നോകàµà´•àµà´•à´¯àµà´³àµà´³àµ
+
+ #</pre> <!-- à´ˆ വരി ഇതàµà´ªàµ‹à´²àµ† തനàµà´¨àµ† സൂകàµà´·à´¿à´•àµà´•àµà´• -->',
+ 'email-blacklist' => ' # à´ˆ പടàµà´Ÿà´¿à´•à´¯àµ‹à´Ÿàµ സദൃശമായ ഇമെയിൽ വിലാസങàµà´™àµ¾ രജിസàµà´±àµà´±àµ¼ ചെയàµà´¯àµà´¨àµà´¨à´¤àµà´‚ ഇമെയിലàµà´•àµ¾ അയയàµà´•àµà´•àµà´¨àµà´¨à´¤àµà´‚ തടയപàµà´ªàµ†à´Ÿàµà´¨àµà´¨à´¤à´¾à´£àµ
+ # à´ˆ പടàµà´Ÿà´¿à´• à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ മാതàµà´°à´®àµ‡ à´ªàµà´°à´¾à´µàµ¼à´¤àµà´¤à´¿à´•à´®à´¾à´•àµ‚; ആഗോള à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯àµà´‚ കാണàµà´•.
+ # വിവരണതàµà´¤à´¿à´¨à´¾à´¯à´¿ https://www.mediawiki.org/wiki/Extension:SpamBlacklist കാണàµà´•
+ #<!-- à´ˆ വരിയിൽ മാറàµà´±à´‚ വരàµà´¤àµà´¤à´¾àµ» പാടിലàµà´² --> <pre>
+#
+# à´Žà´´àµà´¤àµà´¤àµà´°àµ€à´¤à´¿ താഴെകàµà´•àµŠà´Ÿàµà´•àµà´•àµà´¨àµà´¨àµ:
+# * "#" à´…à´•àµà´·à´°à´¤àµà´¤à´¿àµ½ à´¤àµà´Ÿà´™àµà´™à´¿ വരിയàµà´Ÿàµ† അവസാനം വരെയàµà´³àµà´³à´µ à´•àµà´±à´¿à´ªàµà´ªà´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´‚
+# * à´Žà´²àµà´²à´¾ ശൂനàµà´¯à´®à´²àµà´²à´¾à´¤àµà´¤ വരികളàµà´‚ ഇമെയിൽ വിലാസതàµà´¤à´¿à´²àµ† ഹോസàµà´±àµà´±àµà´®à´¾à´¯à´¿ à´’à´¤àµà´¤àµà´¨àµ‹à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨ രെജെകàµà´¸àµ ഘടകമായിരികàµà´•àµà´‚
+
+ #</pre> <!-- à´ˆ വരിയിൽ മാറàµà´±à´‚ വരàµà´¤àµà´¤à´¾àµ» പാടിലàµà´² -->',
+ 'email-whitelist' => ' #<!-- à´ˆ വരിയിൽ മാറàµà´±à´‚ വരàµà´¤àµà´¤à´¾àµ» പാടിലàµà´² --> <pre>
+# à´ˆ പടàµà´Ÿà´¿à´•à´¯àµ‹à´Ÿàµ സദൃശമായ ഇമെയിൽ വിലാസങàµà´™àµ¾, à´…à´µ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿à´²àµ† ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´²àµà´•à´³àµà´®à´¾à´¯à´¿
+# സദൃശമാണെങàµà´•à´¿àµ½ പോലàµà´‚ *തടയപàµà´ªàµ†à´Ÿà´¿à´²àµà´²*.
+#
+ #</pre> <!-- à´ˆ വരിയിൽ മാറàµà´±à´‚ വരàµà´¤àµà´¤à´¾àµ» പാടിലàµà´² -->
+# à´Žà´´àµà´¤àµà´¤àµà´°àµ€à´¤à´¿ താഴെകàµà´•àµŠà´Ÿàµà´•àµà´•àµà´¨àµà´¨àµ:
+# * "#" à´…à´•àµà´·à´°à´¤àµà´¤à´¿àµ½ à´¤àµà´Ÿà´™àµà´™à´¿ വരിയàµà´Ÿàµ† അവസാനം വരെയàµà´³àµà´³à´µ à´•àµà´±à´¿à´ªàµà´ªà´¾à´¯à´¿à´°à´¿à´•àµà´•àµà´‚
+# * à´Žà´²àµà´²à´¾ ശൂനàµà´¯à´®à´²àµà´²à´¾à´¤àµà´¤ വരികളàµà´‚ ഇമെയിൽ വിലാസതàµà´¤à´¿à´²àµ† ഹോസàµà´±àµà´±àµà´®à´¾à´¯à´¿ à´’à´¤àµà´¤àµà´¨àµ‹à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´¨àµà´¨ രെജെകàµà´¸àµ ഘടകമായിരികàµà´•àµà´‚',
+ 'spam-blacklisted-email' => 'à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿àµ½ പെടàµà´Ÿ ഇമെയിൽ',
+ 'spam-blacklisted-email-text' => 'താങàµà´•à´³àµà´Ÿàµ† ഇമെയിൽ വിലാസം ഇപàµà´ªàµ‹àµ¾ മറàµà´±àµà´³àµà´³à´µàµ¼à´•àµà´•àµ à´Žà´´àµà´¤àµà´¤à´¯à´•àµà´•à´¾à´¨à´¾à´µà´¾à´¤àµà´¤ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿àµ½ ഉൾപàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+ 'spam-blacklisted-email-signup' => 'നൽകിയ ഇമെയിൽ വിലാസം ഇപàµà´ªàµ‹àµ¾ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿àµ½ പെടàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ à´’à´¨àµà´¨à´¾à´£àµ.',
+ 'spam-invalid-lines' => 'താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ പാഴെഴàµà´¤àµà´¤àµ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿à´²àµ† {{PLURAL:$1|വരി à´’à´°àµ|വരികൾ}} അസാധàµà´µà´¾à´¯ റെഗàµà´²àµ¼ {{PLURAL:$1|à´Žà´•àµà´¸àµâ€Œâ€Œà´ªàµà´°àµ†à´·àµ»|à´Žà´•àµà´¸àµâ€Œâ€Œà´ªàµà´°àµ†à´·à´¨àµà´•àµ¾}} ആണàµ, താൾ സേവൠചെയàµà´¯àµà´¨àµà´¨à´¤à´¿à´¨àµ à´®àµà´®àµà´ªàµ {{PLURAL:$1|à´…à´¤àµ|à´…à´µ}} ശരിയാകàµà´•àµ‡à´£àµà´Ÿà´¤àµà´£àµà´Ÿàµ:',
+ 'spam-blacklist-desc' => 'റെജെകàµà´¸àµ-അധിഷàµà´ à´¿à´¤ പാഴെഴàµà´¤àµà´¤àµ തടയൽ ഉപകരണം: [[MediaWiki:Spam-blacklist]] à´’à´ªàµà´ªà´‚ [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Marathi (मराठी)
+ * @author Hiteshgotarane
+ * @author Kaustubh
+ * @author Rahuldeshmukh101
+ */
+$messages['mr'] = array(
+ 'spam-blacklist' => ' # या यादीशी जà¥à¤³à¤£à¤¾à¤°à¥‡ बाहà¥à¤¯ दà¥à¤µà¥‡ à¤à¤–ादà¥à¤¯à¤¾ पानावर दिलà¥à¤¯à¤¾à¤¸ बà¥à¤²à¥‰à¤• केले जातील.
+ # ही यादी फकà¥à¤¤ या विकिसाठी आहे, सरà¥à¤µ विकिंसाठीची यादी सà¥à¤¦à¥à¤§à¤¾ तपासा.
+ # अधिक माहिती साठी पहा https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# रà¥à¤ªà¤°à¥‡à¤·à¤¾ खालीलपà¥à¤°à¤®à¤¾à¤£à¥‡:
+# * "#" ने सà¥à¤°à¥ होणारी ओळ शेरा आहे
+# * पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• रिकामी नसलेली ओळ अंतरà¥à¤—त URL जà¥à¤³à¤µà¤¿à¤£à¤¾à¤°à¥€ regex फà¥à¤°à¥…गमेंट आहे
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-whitelist' => ' # या यादीशी जà¥à¤³à¤£à¤¾à¤°à¥‡ बाहà¥à¤¯ दà¥à¤µà¥‡ à¤à¤–ादà¥à¤¯à¤¾ पानावर दिलà¥à¤¯à¤¾à¤¸ बà¥à¤²à¥‰à¤• केले *जाणार नाहीत*.
+ # ही यादी फकà¥à¤¤ या विकिसाठी आहे, सरà¥à¤µ विकिंसाठीची यादी सà¥à¤¦à¥à¤§à¤¾ तपासा.
+ # अधिक माहिती साठी पहा http://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# रà¥à¤ªà¤°à¥‡à¤·à¤¾ खालीलपà¥à¤°à¤®à¤¾à¤£à¥‡:
+# * "#" ने सà¥à¤°à¥ होणारी ओळ शेरा आहे
+# * पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• रिकामी नसलेली ओळ अंतरà¥à¤—त URL जà¥à¤³à¤µà¤¿à¤£à¤¾à¤°à¥€ regex फà¥à¤°à¥…गमेंट आहे
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-blacklisted-email' => 'पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित विपतà¥à¤° पतà¥à¤¤à¤¾',
+ 'spam-blacklisted-email-text' => 'तà¥à¤®à¤šà¤¾ ई-पतà¥à¤¤à¤¾ काळà¥à¤¯à¤¾ यादीत समाविषà¥à¤Ÿ करणà¥à¤¯à¤¾à¤¤ आला आहे. इतर सदसà¥à¤¯à¤¾à¤‚ना संपरà¥à¤• करणे शकà¥à¤¯ नाही.',
+ 'spam-blacklisted-email-signup' => 'दिलेला विपतà¥à¤° पतà¥à¤¤à¤¾ सदà¥à¤¯ वापरणà¥à¤¯à¤¾à¤¸ पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित केलेला आहे',
+ 'spam-invalid-lines' => 'हे पान जतन करणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ खालील {{PLURAL:$1|ओळ जी चà¥à¤•à¥€à¤šà¥€|ओळी जà¥à¤¯à¤¾ चà¥à¤•à¥€à¤šà¥à¤¯à¤¾}} à¤à¤•à¥à¤¸à¥à¤ªà¥à¤°à¥‡à¤¶à¤¨ {{PLURAL:$1|आहे|आहेत}}, दà¥à¤°à¥à¤¸à¥à¤¤ करणे गरजेचे आहे:',
+ 'spam-blacklist-desc' => 'रेजà¤à¤•à¥à¤¸ वर चालणारे सà¥à¤ªà¥…म थांबविणारे उपकरण: [[MediaWiki:Spam-blacklist]] व [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Malay (Bahasa Melayu)
+ * @author Anakmalaysia
+ * @author Aviator
+ */
+$messages['ms'] = array(
+ 'spam-blacklist' => '# URL luar yang sepadan dengan mana-mana entri dalam senarai ini akan disekat daripada ditambah ke dalam sesebuah laman.
+# Senarai ini melibatkan wiki ini sahaja; sila rujuk juga senarai hitam sejagat.
+# Sila baca dokumentasi di https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#<!-- jangan ubah baris ini --> <pre>
+#
+# Sintaks adalah seperti berikut:
+# * Semuanya mulai aksara "#" hingga akhir baris merupakan komen
+# * Setiap baris yang tidak kosong meruakan pecahan ungkapan nalar yang hanya akan berpadan dengan hos-hos dalam alamat e-mel
+
+ #</pre> <!-- jangan ubah baris ini -->',
+ 'spam-whitelist' => ' #<!-- jangan ubah baris ini --> <pre>
+# URL luar yang sepadan dengan mana-mana entri dalam senarai ini tidak akan
+# disekat walaupun terdapat juga dalam senarai hitam.
+#
+# Sintaks:
+# * Aksara "#" sampai akhir baris diabaikan
+# * Ungkapan nalar dibaca daripada setiap baris dan dipadankan dengan nama hos sahaja
+
+ #</pre> <!-- jangan ubah baris ini -->',
+ 'email-blacklist' => ' # Alamat-alamat e-mel yang berpadanan dengan senarai ini akan disekat daripada mendaftar atau menghantar e-mel
+ # Senarai ini melibatkan wiki ini sahaja; sila rujuk juga senarai hitam sejagat.
+ # Untuk dokumentasi, rujuk https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- jangan ubah baris ini --> <pre>
+#
+# Sintaks adalah seperti berikut:
+# * Semuanya mulai aksara "#" hingga akhir baris merupakan komen
+# * Setiap baris yang tidak kosong meruakan pecahan ungkapan nalar yang hanya akan berpadan dengan hos-hos dalam alamat e-mel
+
+ #</pre> <!-- jangan ubah baris ini -->',
+ 'email-whitelist' => ' #<!-- jangan ubah baris ini --> <pre>
+# Alamat-alamat e-mel yang berpadanan dengan senarai ini *tidak* akan disekat sungguhpun boleh
+# disekat oleh entri senarai hitam.
+#
+ #</pre> <!-- jangan ubah baris ini -->
+# Sintaks adalah seperti berikut:
+# * Segalanya mulai aksara "#" hingga akhir baris ialah komen
+# * Setiap baris yang tidak kosong meruakan pecahan ungkapan nalar yang hanya akan berpadan dengan hos-hos dalam alamat e-mel',
+ 'spam-blacklisted-email' => 'E-mel yang Disenaraihitamkan',
+ 'spam-blacklisted-email-text' => 'Alamat e-mel anda kini disenaraihitamkan daripada menghantar e-mel kepada pengguna lain.',
+ 'spam-blacklisted-email-signup' => 'Alamat e-mel yang diberikan ini kini disenaraihitamkan.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Baris|Baris-baris}} berikut menggunakan ungkapan nalar yang tidak sah. Sila baiki senarai hitam ini sebelum menyimpannya:',
+ 'spam-blacklist-desc' => 'Alat anti-spam berdasarkan ungkapan nalar: [[MediaWiki:Spam-blacklist]] dan [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Norwegian Bokmål (norsk (bokmål)‎)
+ */
+$messages['nb'] = array(
+ 'spam-blacklist' => ' # Eksterne URL-er som finnes på denne lista vil ikke kunne legges til på en side.
+ # Denne listen gjelder kun denne wikien; se også den globale svartelistinga.
+ # For dokumentasjon, se https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- La denne linja være nøyaktig som den er --> <pre>
+#
+# Syntaksen er som følgende:
+# * Alle linjer som begynner med «#» er kommentarer
+# * Alle ikke-blanke linjer er et regex-fragment som kun vil passe med domenenavn i URL-er
+
+ #</pre> <!-- la denne linja være nøyaktig som den er -->',
+ 'spam-whitelist' => ' #<!-- la denne linja være nøyaktig som den er --> <pre>
+# Eksterne URL-er på denne lista vil *ikke* blokkeres, selv om
+# de ellers ville vært blokkert av svartelista.
+#
+# Syntaksen er som følger:
+# * Alle linjer som begynner med «#» er kommentarer
+# * Alle ikke-blanke linjer er et regex-fragment som kun vil passe med domenenavn i URL-er
+
+ #</pre> <!-- la denne linja være nøyaktig som den er -->',
+ 'email-blacklist' => '# E-postadresser som matcher adresser på denne listen vil ikke kunne registrere seg eller sende e-post
+# Denne listen påvirker kun denne wikien; sjekk også den globale svartelista.
+# For dokumentasjon, se https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#<!-- la denne linja være som den er --> <pre>
+#
+# Syntaksen er som følger:
+# * Alt fra et «#»-tegn til sluttan av linje er kommentarer
+# * Hver ikke-blank linje er et regex-fragment som kun matcher domenenavn i e-postadresser
+
+#</pre> <!-- la denne linja være som den er -->',
+ 'email-whitelist' => '#<!-- la denne linja være som den er --> <pre>
+# E-postadresser som matcher denne listen vil *ikke* blokkeres selv om
+# de er blokkert av poster på svartelista.
+#
+#</pre> <!-- la denne linja være som den er -->
+# Syntaksen er som følger:
+# * Alt fra et «#»-tegn til slutten av linja er kommentarer
+# * Hver ikke-blank linje er et regex-fragment som kun matcher domener i e-postadresser',
+ 'spam-blacklisted-email' => 'Svartelistede e-postadresser',
+ 'spam-blacklisted-email-text' => 'E-postadressen din er svartelistes, så du kan ikke sende e-post til andre brukere.',
+ 'spam-blacklisted-email-signup' => 'Den angitte e-postadressen er svartelistet.',
+ 'spam-invalid-lines' => 'Følgende {{PLURAL:$1|linje|linjer}} i spamsvartelista er {{PLURAL:$1|et ugyldig regulært uttrykk|ugyldige regulære uttrykk}} og må rettes før lagring av siden:',
+ 'spam-blacklist-desc' => 'Antispamverktøy basert på regulære uttrykk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Low German (Plattdüütsch)
+ * @author Slomox
+ */
+$messages['nds'] = array(
+ 'spam-blacklist' => ' # URLs na buten de Websteed in disse List stoppt dat Spiekern vun de Sied.
+ # Disse List gellt blot för dit Wiki; kiek ok na de globale Swartlist.
+ # För mehr Infos kiek op https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Disse Reeg dröff nich ännert warrn! --> <pre>
+#
+# Syntax:
+# * Allens vun dat „#“-Teken af an bet to dat Enn vun de Reeg is en Kommentar
+# * Elkeen Reeg, de nich leddig is, is en regulären Utdruck, bi den nakeken warrt, wat he op de Host-Naams in de URLs passt
+
+ #</pre> <!-- Disse Reeg dröff nich ännert warrn! -->',
+ 'spam-whitelist' => ' #<!-- Disse Reeg dröff nich ännert warrn! --> <pre>
+# URLs na buten de Websteed in disse List stoppt dat Spiekern vun de Sied nich, ok wenn se
+# in de globale oder lokale swarte List in sünd.
+#
+# Syntax:
+# * Allens vun dat „#“-Teken af an bet to dat Enn vun de Reeg is en Kommentar
+# * Elkeen Reeg, de nich leddig is, is en regulären Utdruck, bi den nakeken warrt, wat he op de Host-Naams in de URLs passt
+
+ #</pre> <!-- Disse Reeg dröff nich ännert warrn! -->',
+ 'spam-invalid-lines' => 'Disse {{PLURAL:$1|Reeg|Regen}} in de Spam-Swartlist {{PLURAL:$1|is en ungülligen regulären Utdruck|sünd ungüllige reguläre Utdrück}}. De {{PLURAL:$1|mutt|mööt}} utbetert warrn, ehrdat de Sied spiekert warrn kann:',
+ 'spam-blacklist-desc' => 'Regex-baseert Anti-Spam-Warktüüch: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Dutch (Nederlands)
+ * @author SPQRobin
+ * @author Siebrand
+ */
+$messages['nl'] = array(
+ 'spam-blacklist' => ' # Externe URL\'s die voldoen aan deze lijst worden geweigerd bij het
+ # toevoegen aan een pagina. Deze lijst heeft alleen invloed op deze wiki.
+ # Er bestaat ook een globale zwarte lijst.
+ # Documentatie: https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- laat deze regel zoals hij is --> <pre>
+#
+# De syntaxis is als volgt:
+# * Alles vanaf het karakter "#" tot het einde van de regel is opmerking
+# * Iedere niet-lege regel is een fragment van een reguliere uitdrukking die
+# alleen van toepassing is op hosts binnen URL\'s.
+
+ #</pre> <!-- laat deze regel zoals hij is -->',
+ 'spam-whitelist' => ' #<!-- laat deze regel zoals hij is --> <pre>
+# Externe URL\'s die voldoen aan deze lijst, worden *nooit* geweigerd, al
+# zouden ze geblokkeerd moeten worden door regels uit de zwarte lijst.
+#
+# De syntaxis is als volgt:
+# * Alles vanaf het karakter "#" tot het einde van de regel is opmerking
+# * Iedere niet-lege regel is een fragment van een reguliere uitdrukking die
+# alleen van toepassing is op hosts binnen URL\'s.
+
+ #</pre> <!-- laat deze regel zoals hij is -->',
+ 'email-blacklist' => ' # E-mailadressen die voldoen aan deze lijst worden geblokkeerd bij het registreren of het verzenden van e-mails.
+ # Deze lijst heeft alleen invloed op deze wiki. Er bestaat ook een globale zwarte lijst.
+ # Documentatie: https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- laat deze regel zoals hij is --> <pre>
+#
+# De syntaxis is als volgt:
+# * Alles vanaf het karakter "#" tot het einde van de regel is een opmerking
+# * Iedere niet-lege regel is een fragment van een reguliere uitdrukking die
+# alleen van toepassing is op hosts binnen e-mailadressen.
+
+ #</pre> <!-- laat deze regel zoals hij is -->',
+ 'email-whitelist' => ' #<!-- laat deze regel zoals hij is --> <pre>
+# E-mailadressen die voldoen aan deze lijst, worden *nooit* geweigerd, al
+# zouden ze geblokkeerd moeten worden door regels uit de zwarte lijst.
+#
+# De syntaxis is als volgt:
+# * Alles vanaf het karakter "#" tot het einde van de regel is opmerking
+# * Iedere niet-lege regel is een fragment van een reguliere uitdrukking die
+# alleen van toepassing is op hosts binnen e-mailadressen.
+
+ #</pre> <!-- laat deze regel zoals hij is -->',
+ 'spam-blacklisted-email' => 'E-mailadres op de zwarte lijst',
+ 'spam-blacklisted-email-text' => 'Uw e-mailadres staat momenteel op de zwarte lijst waardoor u geen e-mails naar andere gebruikers kunt verzenden.',
+ 'spam-blacklisted-email-signup' => 'Het opgegeven e-mailadres staat momenteel op de zwarte lijst.',
+ 'spam-invalid-lines' => 'De volgende {{PLURAL:$1|regel|regels}} van de zwarte lijst {{PLURAL:$1|is een|zijn}} onjuiste reguliere {{PLURAL:$1|expressie|expressies}} en {{PLURAL:$1|moet|moeten}} verbeterd worden alvorens de pagina kan worden opgeslagen:',
+ 'spam-blacklist-desc' => 'Antispamfunctionaliteit via reguliere expressies: [[MediaWiki:Spam-blacklist]] en [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
+ * @author Siebrand
+ */
+$messages['nl-informal'] = array(
+ 'spam-blacklisted-email-text' => 'Je e-mailadres staat momenteel op de zwarte lijst waardoor je geen e-mails naar andere gebruikers kunt verzenden.',
+);
+
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
+ * @author Frokor
+ */
+$messages['nn'] = array(
+ 'spam-blacklist' => ' # Eksterne URL-ar som finnst på denne lista vil ikkje kunne leggast til på ei side.
+ # Denne lista gjeld berre denne wikien; sjå òg den globale svartelistinga.
+ # For dokumentasjon, sjå https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- La denne linja vere nøyaktig som ho er --> <pre>
+#
+# Syntaksen er som følgjer:
+# * Alle linjer som byrjar med «#» er kommentarar
+# * Alle ikkje-blanke linjer er eit regex-fragment som berre vil passe med domenenavn i URL-ar
+
+ #</pre> <!-- la denne linja vere nøyaktig som ho er -->',
+ 'spam-whitelist' => ' #<!-- la denne linja vere nøyaktig som ho er --> <pre>
+# Eksterne URL-ar på denne lista vil *ikkje* blokkerast, sjølv om
+# dei elles ville vorte blokkert av svartelista.
+#
+# Syntaksen er som følgjer:
+# * Alle linjer som byrjar med «#» er kommentarar
+# * Alle ikkje-blanke linjer er eit regex-fragment som berre vil passe med domenenamn i URL-ar
+
+ #</pre> <!-- la denne linja vere nøyaktig som ho er -->',
+ 'spam-invalid-lines' => 'Følgjande {{PLURAL:$1|linje|linjer}} i spamsvartelista er {{PLURAL:$1|eit ugyldig regulært uttrykk|ugyldige regulære uttrykk}} og må rettast før lagring av sida:',
+ 'spam-blacklist-desc' => 'Antispamverktøy basert på regulære uttrykk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Occitan (occitan)
+ * @author Cedric31
+ */
+$messages['oc'] = array(
+ 'spam-blacklist' => "# Los ligams extèrnes que fan partida d'aquesta lista seràn blocats al moment de lor insercion dins una pagina. # Aquesta lista concernís pas que Wikinews ; referissètz-vos tanben a la lista negra generala de Meta. # La documentacion se tròba a l’adreça seguenta : http://www.MediaWiki.org/wiki/Extension:SpamBlacklist # <!--Daissatz aquesta linha tala coma es --> <pre> # # La sintaxi es la seguenta # * Tot tèxte que seguís lo « # » es considerat coma un comentari. # * Tota linha pas voida es un fragment regex que concernís pas que los ligams ipertèxtes. #</pre> <!--Daissatz aquesta linha tala coma es -->",
+ 'spam-whitelist' => " #<!--Daissatz aquesta linha tala coma es --> <pre>
+# Los ligams extèrnes que fan partida d'aquesta lista seràn blocas al moment de lor insercion dins una pagina.
+# Aquesta lista concernís pas que Wikinews ; referissetz-vos tanben a la lista negra generala de Meta.
+ # La documentacion se tròba a l’adreça seguenta : http://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+# La sintaxi es la seguenta :
+# * Tot tèxte que seguís lo « # » es considerat coma un comentari.
+# * Tota linha pas voida es un fragment regex que concernís pas que los ligams ipertèxtes.
+
+ #</pre> <!--Daissatz aquesta linha tala coma es -->",
+ 'spam-invalid-lines' => "{{PLURAL:$1|La linha seguenta |Las linhas seguentas}} de la lista dels spams {{PLURAL:$1|es redigida|son redigidas}} d'un biais incorrècte e {{PLURAL:$1|necessita|necessitan}} las correccions necessàrias abans tot salvament de la pagina :",
+ 'spam-blacklist-desc' => "Aisina antispam basada sus d'expressions regularas : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''",
+);
+
+/** Oriya (ଓଡ଼ିଆ)
+ * @author Jnanaranjan Sahu
+ * @author Psubhashish
+ */
+$messages['or'] = array(
+ 'spam-blacklist' => ' # à¬à¬• ଫୃଷà­à¬ à¬¾à¬°à­‡ ଯୋଡ଼ାଯାଉଥିବା ବାହାର URL à¬à¬¹à¬¿ ତାଲିକା ସହ ମେଳ ଖାଇଲେ ତାହାକୠଅଟକାଇଦିଆଯିବ ।
+ # à¬à¬¹à¬¿ ତାଲିକା କେବଳ କେବଳ à¬à¬¹à¬¿ ଉଇକିକୠପà­à¬°à¬­à¬¾à¬¬à¬¿à¬¤ କରିଥାà¬; ଜଗତ ଅଟକତାଲିକା ମଧà­à­Ÿ ଦେଖିପାରନà­à¬¤à¬¿ ।
+ # ଦଲିଲକରଣ ନିମନà­à¬¤à­‡ ଦୟାକରି https://www.mediawiki.org/wiki/Extension:SpamBlacklist ଦେଖନà­à¬¤à­ ।
+ #<!-- à¬à¬¹à¬¿ ଧାଡ଼ିଟି ଯେଉà¬à¬ªà¬°à¬¿ ଅଛି ଅବିକଳ ସେହିପରି ଛାଡ଼ି ଦିଅନà­à¬¤à­ --> <pre>
+#
+# ସିଣà­à¬Ÿà¬¾à¬•à­à¬¸:
+# * "#" ଚିହà­à¬¨ ଠାରୠଧାଡ଼ିର ଶେଷ ଯାà¬à¬ à¬à¬• ମତ
+# * ସବୠଅଣ-ଖାଲି ଧାଡ଼ି à¬à¬• regex ଖଣà­à¬¡ ଯାହା କେବଳ URL ଭିତରେ ଥିବା ହୋଷà­à¬Ÿ ସହ ମେଳନ କରିଥାà¬
+
+ #</pre> <!-- à¬à¬¹à¬¿ ଧାଡ଼ିଟି ଯେଉà¬à¬ªà¬°à¬¿ ଅଛି ଅବିକଳ ସେହିପରି ଛାଡ଼ି ଦିଅନà­à¬¤à­ -->',
+ 'spam-whitelist' => ' #<!-- à¬à¬¹à¬¿ ଧାଡ଼ିଟି ଯେଉà¬à¬ªà¬°à¬¿ ଅଛି ଅବିକଳ ସେହିପରି ଛାଡ଼ି ଦିଅନà­à¬¤à­ --> <pre>
+# ଯଦି ସେସବୠଅଟକତାଲିକାରେ ଥାଠତେବେ ମଧà­à­Ÿ
+ # à¬à¬• ଫୃଷà­à¬ à¬¾à¬°à­‡ ଯୋଡ଼ାଯାଉଥିବା ବାହାର URL à¬à¬¹à¬¿ ତାଲିକା ସହ ମେଳ ଖାଉଥିଲେ ତାହାକୠଅଟକାଇ ଦିଆଯିବ *ନାହିà¬*
+#
+# ସିଣà­à¬Ÿà¬¾à¬•à­à¬¸:
+# * "#" ଚିହà­à¬¨ ଠାରୠଧାଡ଼ିର ଶେଷ ଯାà¬à¬ à¬à¬• ମତ
+# * ସବୠଅଣ-ଖାଲି ଧାଡ଼ି à¬à¬• regex ଖଣà­à¬¡ ଯାହା କେବଳ URL ଭିତରେ ଥିବା ହୋଷà­à¬Ÿ ସହ ମେଳନ କରିଥାà¬
+
+ #</pre> <!-- à¬à¬¹à¬¿ ଧାଡ଼ିଟି ଯେଉà¬à¬ªà¬°à¬¿ ଅଛି ଅବିକଳ ସେହିପରି ଛାଡ଼ି ଦିଅନà­à¬¤à­ -->',
+ 'email-blacklist' => ' #<!-- à¬à¬¹à¬¿ ଧାଡିଟି ଯେମିତି ଅଛି ସେମିତି ରଖନà­à¬¤à­ କିଛି ବଦଳାନà­à¬¤à­ ନାହିଠ--> <pre>
+# à¬à¬¹à¬¿ ତାଲିକାରେ ଥିବା ଇ-ମେଲ ଠିକଣାଗà­à¬¡à¬¿à¬•à­ ପଞà­à¬œà­€à¬•à¬°à¬£ କିମà­à¬¬à¬¾ ଇ-ମେଲ ପଠେଇବାରୠଅଟକ ରଖାଯିବ
+# à¬à¬¹à¬¿ ତାଲିକାଟି କେବଳ à¬à¬¹à¬¿ ଉଇକିରେ କାରà­à¬¯à­à­Ÿà¬•à¬¾à¬°à­€ ହେବ ; ଜାଗତିକ ଅଟକ ତାଲିକାକୠମଧà­à­Ÿ ଦେଖନà­à¬¤à­ ।
+# ନଥିପତà­à¬° ପାଇଠhttps://www.mediawiki.org/wiki/Extension:SpamBlacklist ଦେଖନà­à¬¤à­
+#
+# ସିନà­à¬Ÿà¬¾à¬•à­à¬¸à¬Ÿà¬¿ ହେଉଛି:
+# * "#"ଠାରୠଆରମà­à¬­ କରି ଧାଡିର ଶେଷ ପରà­à¬¯à­à­Ÿà¬¨à­à¬¤ ସମସà­à¬¤ ଲେଖାଟି ହେଉଛି ଗୋଟେ ମନà­à¬¤à¬¬à­à­Ÿ
+# * ସମସà­à¬¤ ଖାଲିନଥିବା ଧାଡି ହେଉଛି à¬à¬• ରେଜେକà­à¬¸ ଫà­à¬°à¬¾à¬—ମେଣà­à¬Ÿ ଯାହାକି ଇ-ମେଲ ଠିକଣାଗà­à¬¡à¬¿à¬• ଭିତରେ ଥିବା ହୋଷà­à¬Ÿà¬—à­à¬¡à¬¿à¬• ସହ ମିଳେଇବ ।
+
+ #</pre> <!-- à¬à¬¹à¬¿ ଧାଡିଟି ଯେମିତି ଅଛି ସେମିତି ରଖନà­à¬¤à­ କିଛି ବଦଳାନà­à¬¤à­ ନାହିଠ-->',
+ 'email-whitelist' => ' #<!-- à¬à¬¹à¬¿ ଧାଡିଟି ଯେମିତି ଅଛି ସେମିତି ରଖନà­à¬¤à­ କିଛି ବଦଳାନà­à¬¤à­ ନାହିଠ--> <pre>
+# à¬à¬¹à¬¿ ତାଲିକାରେ ଥିବା ଇ-ମେଲ ଠିକଣାଗà­à¬¡à¬¿à¬•à­ ଅଟକ ରଖାଯିବ *ନାହିà¬*
+# ଯଦିଓ ସେଗà­à¬¡à¬¿à¬• ବାସନà­à¬¦ ତାଲିକାରେ ଅଟକ ରଖାଯାଇଥିବ ।
+#
+# ସିନà­à¬Ÿà¬¾à¬•à­à¬¸à¬Ÿà¬¿ ହେଉଛି:
+# * "#"ଠାରୠଆରମà­à¬­ କରି ଧାଡିର ଶେଷ ପରà­à¬¯à­à­Ÿà¬¨à­à¬¤ ସମସà­à¬¤ ଲେଖାଟି ହେଉଛି ଗୋଟେ ମନà­à¬¤à¬¬à­à­Ÿ
+# * ସମସà­à¬¤ ଖାଲିନଥିବା ଧାଡି ହେଉଛି à¬à¬• ରେଜେକà­à¬¸ ଫà­à¬°à¬¾à¬—ମେଣà­à¬Ÿ ଯାହାକି ଇ-ମେଲ ଠିକଣାଗà­à¬¡à¬¿à¬• ଭିତରେ ଥିବା ହୋଷà­à¬Ÿà¬—à­à¬¡à¬¿à¬• ସହ ମିଳେଇବ ।
+
+ #</pre> <!-- à¬à¬¹à¬¿ ଧାଡିଟି ଯେମିତି ଅଛି ସେମିତି ରଖନà­à¬¤à­ କିଛି ବଦଳାନà­à¬¤à­ ନାହିଠ-->',
+ 'spam-blacklisted-email' => 'ବନà­à¬¦ କରାଯାଇଥିବା ଇ-ମେଲ ଠିକଣା',
+ 'spam-blacklisted-email-text' => 'ଆପଣଙà­à¬• ଇ-ମେଲ ଠିକଣାଟି ଅନà­à­Ÿà¬®à¬¾à¬¨à¬™à­à¬•à­ ଇ-ମେଲ ପଠାଇବାରୠବାସନà­à¬¦ କରାଯାଇଛି ।',
+ 'spam-blacklisted-email-signup' => 'ଦିଆଯାଇଥିବା ଇ-ମେଲ ଠିକଣାଟି ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬°à¬¿à¬¬à¬¾à¬°à­ ବାସନà­à¬¦ କରାଯାଇଛି ।',
+ 'spam-invalid-lines' => 'à¬à¬¹à¬¿ ସà­à¬ªà¬¾à¬® ଅଟକତାଲିକା {{PLURAL:$1|ଧାଡ଼ିଟି|ଧାଡ଼ିସବà­}} ଅଚଳ ସାଧାରଣ {{PLURAL:$1|ପରିପà­à¬°à¬•à¬¾à¬¶|ପରିପà­à¬°à¬•à¬¾à¬¶}} ଓ ସାଇତିବା ଆଗରୠ{{PLURAL:$1|ତାହାକୠସà­à¬§à¬¾à¬°à¬¿à¬¬à¬¾ ଲୋଡ଼ା|ସେହିସବà­à¬•à­ ସà­à¬§à¬¾à¬°à¬¿à¬¬à¬¾ ଲୋଡ଼ା}}:',
+ 'spam-blacklist-desc' => 'Regex-ଭିତà­à¬¤à¬¿à¬• ସà­à¬ªà¬¾à¬®-ବିରୋଧୀ ଉପକରଣ: [[MediaWiki:Spam-blacklist]] ଓ [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Polish (polski)
+ * @author BeginaFelicysym
+ * @author Derbeth
+ * @author Sp5uhe
+ */
+$messages['pl'] = array(
+ 'spam-blacklist' => ' # Dodawanie w treści stron linków zewnętrznych pasujących do tej listy będzie blokowane.
+ # Lista dotyczy wyłącznie tej wiki; istnieje też globalna czarna lista.
+ # Dokumentacja znajduje siÄ™ na stronie https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- zostaw tę linię dokładnie tak, jak jest --> <pre>
+#
+# Składnia jest następująca:
+# * Wszystko od znaku „#†do końca linii jest komentarzem
+# * Każda niepusta linia jest fragmentem wyrażenia regularnego, które będzie dopasowywane jedynie do hostów wewnątrz linków
+
+ #</pre> <!-- zostaw tę linię dokładnie tak, jak jest -->',
+ 'spam-whitelist' => ' #<!-- zostaw tę linię dokładnie tak, jak jest --> <pre>
+# Linki zewnętrzne pasujące do tej listy *nie będą* blokowane nawet jeśli
+# zostałyby zablokowane przez czarną listę.
+#
+# Składnia jest następująca:
+# * Wszystko od znaku „#†do końca linii jest komentarzem
+# * Każda niepusta linia jest fragmentem wyrażenia regularnego, które będzie dopasowywane jedynie do hostów wewnątrz linków
+
+ #</pre> <!-- zostaw tę linię dokładnie tak, jak jest -->',
+ 'email-blacklist' => ' # Adresy e-mail pasujące do tej listy będą blokowane przed rejestracją i wysyłaniem maili
+ # Ta lista dotyczy tylko tej wiki; przejrzyj również globalną czarną listę.
+ # Dokumentacja znajduje siÄ™ na https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# Składnia opisana jest poniżej:
+# * Wszystko znajdujące się za znakiem "#" do końca linii jest komentarzem
+# * Każda niepusta linia jest fragmentem wyrażenia regularnego, które będzie dopasowywane do hosta z adresu e-mail
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'email-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Adresy e-mail pasujące do tej listy *nie* będą blokowane, nawet jeśli zostaną
+# zablokowane przez wpisy z czarnej listy.
+#
+ #</pre> <!-- leave this line exactly as it is -->
+# Składnia jest następująca:
+# * Wszystko począwszy od znaku "#" do końca linii jest komentarzem
+# * Każda niepusta linia jest fragmentem wyrażenia regularnego dopasowywanego tylko do nazw hpstów z adresów e-mail',
+ 'spam-blacklisted-email' => 'Niedozwolone adresy e-mail',
+ 'spam-blacklisted-email-text' => 'Twój adres e-mail jest obecnie umieszczony na czarnej liście i nie można z niego wysyłać wiadomości e-mail do innych użytkowników.',
+ 'spam-blacklisted-email-signup' => 'Podany adres e-mail jest obecnie na czarnej liście blokującej przed użyciem.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Następująca linia jest niepoprawnym wyrażeniem regularnym i musi być poprawiona przed zapisaniem strony:|Następujące linie są niepoprawnymi wyrażeniami regularnymi i muszą być poprawione przed zapisaniem strony:}}',
+ 'spam-blacklist-desc' => 'Narzędzie antyspamowe oparte o wyrażenia regularne: [[MediaWiki:Spam-blacklist|spam – lista zabronionych]] oraz [[MediaWiki:Spam-whitelist|spam – lista dozwolonych]]',
+);
+
+/** Piedmontese (Piemontèis)
+ * @author Borichèt
+ * @author Bèrto 'd Sèra
+ * @author Dragonòt
+ */
+$messages['pms'] = array(
+ 'spam-blacklist' => "# J'adrësse esterne ch'as treuva ant sta lista-sì a vniran blocà se cheidun a jë gionta ansima a na pàgina. # Sta lista a l'ha valor mach an sta wiki-sì; ch'a-j fasa arferiment ëdcò a la lista nèira global. # Për dla documentassion ch'a varda http://www.MediaWiki.org/wiki/Extension:SpamBlacklist #<!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é --> <pre> # # La sintassi a l'é: # * Tut lòn ch'as anandia con na \"#\" fin a la fin dla riga as ten coma coment # * Qualsëssìa riga nen veuja a resta un tòch d'espression regolar ch'as paragon-a a ij nòm ëd servent andrinta a j'adrësse #</pre> <!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é -->",
+ 'spam-whitelist' => "#<!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é --> <pre> # J'adrësse esterne coma cole dë sta lista a vniran NEN blocà, ëdcò fin-a # s'a fusso da bloché conforma a le régole dla lista nèira. # # La sintassi a l'é: # * Tut lòn ch'as anandia con na \"#\" fin a la fin dla riga as ten coma coment # * Qualsëssìa riga nen veuja a resta un tòch d'espression regolar ch'as paragon-a a ij nòm ëd servent andrinta a j'adrësse #</pre> <!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é -->",
+ 'email-blacklist' => "# J'adrësse ëd pòsta eletrònica ch'as treuva ant sta lista-sì a vniran blocà da registresse o mandé 'd mëssagi.
+# Sta lista a l'ha valor mach an sta wiki-sì; ch'a-j fasa arferiment ëdcò a la lista nèira global.
+# Për dla documentassion ch'a varda http://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#<!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é --> <pre>
+#
+# La sintassi a l'é:
+# * Tut lòn ch'as anandia con na \"#\" fin a la fin dla riga as ten coma coment #
+* Qualsëssìa riga nen veujda a resta un tòch d'espression regolar ch'as paragon-a ai nòm dij servent andrinta a j'adrësse
+
+#</pre> <!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é -->",
+ 'email-whitelist' => "#<!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é --> <pre>
+# J'adrësse ëd pòsta eletrònica ch'as treuvo ant sta lista-sì a saran *pa* blocà bele ch'a sarìo
+# da bloché për le vos ëd la lista nèira.
+#
+#</pre> <!-- ch'a lassa sta riga-sì giusta 'me ch'a l'é -->
+# La sintassi a l'é:
+# * Tut lòn ch'as anandia con un «#» fin a la fin dla riga as ten coma coment
+# * Qualsëssìa riga nen veujda a resta un tòch d'espression regolar ch'as paragon-a ai nòm dij servent andrinta a j'adrësse",
+ 'spam-blacklisted-email' => 'Adrëssa ëd pòsta eletrònica an lista nèira',
+ 'spam-blacklisted-email-text' => "Soa adrëssa ëd pòsta eletrònica a l'é al moment an na lista nèira për mandé dij mëssagi a j'àutri utent.",
+ 'spam-blacklisted-email-signup' => "L'adrëssa ëd pòsta eletrònica dàita a l'é al moment an na lista nèira për l'utilisassion.",
+ 'spam-invalid-lines' => "{{PLURAL:$1|St'|Sti}} element dla lista nèira dla rumenta ëd reclam a {{PLURAL:$1|l'é|son}} {{PLURAL:$1|n'|dj'}}espression regolar nen {{PLURAL:$1|bon-a|bon-e}} e a l'{{PLURAL:$1|ha|han}} da manca d'esse coregiùe anans che salvé la pàgina:",
+ 'spam-blacklist-desc' => 'Strument anti-spam basà an dzora a Regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Western Punjabi (پنجابی)
+ * @author Khalid Mahmood
+ */
+$messages['pnb'] = array(
+ 'spam-blacklist' => '# بارلے یو آر ایل جیÛÚ‘Û’ ایس لسٹ نال رلدے Ûون جدوں اوناں ایس صÙÛ’ نال جوڑیا جاۓ گا تے اوناں نوں روک دتا جاؤکا۔
+# Ø§ÛŒÛ Ù„Ø³Ù¹ صر٠ایس ÙˆÚ©ÛŒ نال جڑی اے؛ جگت روکلسٹ نوں ÙˆÛŒ ویکھو۔
+# ڈوکومنٹیشن Ù„â€ÛŒ ویکھو https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+# <!-- ایس لین نوں اینج ای Ú†Ú¾ÙˆÚ‘ جنج اے ÛÛ’ --> <pre>
+#
+# سینٹیکس Ø§ÛŒÛ Ø§Û’:
+# * Ûرشے "#" توںلے Ú©Û’ لین دے انت تک اک کومنٹ اے
+# * Ûر ناں خالی لین اک ریجیکس Ùریگمنٹ اے جیÛÚ‘ÛŒ یو آر ایل دے اندر Ûوسٹو نال رلے گی۔
+
+#</pre> <!-- ایس لین نوں انج ای Ú†Ú¾ÙˆÚ‘ دیو جنج Ø§ÛŒÛ ÛÛ’ -->',
+ 'spam-whitelist' => '# <!-- ایس لین نوں اینج ای Ú†Ú¾ÙˆÚ‘ جنج اے ÛÛ’ --> <pre>
+# بارلے یو آر ایل جیÛÚ‘Û’ ایس لسٹ نال رلدے Ûون جدوں اوناں ایس صÙÛ’ نال جوڑیا جاۓ گا تے اوناں نوں نئیں روکیا جاویگا پاویں اوناں نوں بلیکلسٹ انٹریز Ú† روکیا گیا Ûووے۔
+#
+# سینٹیکس Ø§ÛŒÛ Ø§Û’:
+# * Ûرشے "#" توںلے Ú©Û’ لین دے انت تک اک کومنٹ اے
+# * Ûر ناں خالی لین اک ریجیکس Ùریگمنٹ اے جیÛÚ‘ÛŒ یو آر ایل دے اندر Ûوسٹو نال رلے گی۔
+
+#</pre> <!-- ایس لین نوں انج ای Ú†Ú¾ÙˆÚ‘ دیو جنج Ø§ÛŒÛ ÛÛ’ -->',
+ 'spam-invalid-lines' => 'تھلے دتی گئی سپام کالیلسٹ {{PLURAL:$1|lلین|لیناں}} ناں منی جان والی ریگولر {{PLURAL:$1|ایکسپریشن|ایکسپریشناں}} تے {{PLURAL:$1|لوڑاں|لوڑ}} نوں ٹھیک کرنا ضروری صÙÛ Ø¨Ú†Ø§Ù† توں Ù¾ÛÙ„Û’:',
+ 'spam-blacklist-desc' => 'ریجیکس تے بنیا سپام ویری اوزار: [[MediaWiki:Spam-blacklist]] تے [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Portuguese (português)
+ * @author Giro720
+ * @author Hamilton Abreu
+ * @author Helder.wiki
+ * @author Malafaya
+ * @author 555
+ */
+$messages['pt'] = array(
+ 'spam-blacklist' => ' # URLs externas que coincidam com esta lista serão bloqueadas quando forem
+ # adicionadas a uma página.
+ # Esta lista aplica-se apenas a esta wiki. Consulte também a lista-negra global.
+ # Veja a documentação em https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- mantenha esta linha exatamente assim --> <pre>
+#
+# A sintaxe é a seguinte:
+# * Tudo o que estiver após um "#" até o final de uma linha é um comentário
+# * Todas as linhas que não estiverem em branco são um fragmento de expressão regular
+# (regex) de busca, que só poderão coincidir com hosts na URL
+
+ #</pre> <!-- mantenha esta linha exatamente assim -->',
+ 'spam-whitelist' => ' #<!-- mantenha esta linha exatamente assim --> <pre>
+# URLs externas que coincidam com esta lista *não* serão bloqueadas mesmo se
+# teriam sido bloqueadas por entradas presentes na lista negra.
+#
+# A sintaxe é a seguinte:
+# * Tudo o que estiver após um "#" até o final de uma linha é um comentário
+# * Todas as linhas que não estiverem em branco são um fragmento de expressão regular
+# (regex) de busca, que só poderão coincidir com hosts na URL
+
+ #</pre> <!-- mantenha esta linha exatamente assim -->',
+ 'spam-blacklisted-email' => 'Endereço de correio electrónico da lista negra',
+ 'spam-invalid-lines' => "{{PLURAL:$1|A entrada|As entradas}} abaixo {{PLURAL:$1|é uma expressão regular|são expressões regulares}} ''(regex)'' {{PLURAL:$1|inválida e precisa|inválidas e precisam}} de ser {{PLURAL:$1|corrigida|corrigidas}} antes de gravar a página:",
+ 'spam-blacklist-desc' => 'Ferramenta anti-"spam" baseada em Regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Brazilian Portuguese (português do Brasil)
+ * @author Eduardo.mps
+ * @author Helder.wiki
+ * @author Tuliouel
+ * @author 555
+ */
+$messages['pt-br'] = array(
+ 'spam-blacklist' => ' #<!-- mantenha esta linha exatamente assim --> <pre>
+# URLs externas que coincidam com esta lista serão bloqueadas quando forem
+# adicionadas a uma página.
+# Esta lista refere-se apenas a este wiki. Consulte também a lista-negra global.
+# Veja a documentação em https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+# A sintaxe é a seguinte:
+# * Tudo o que estiver após um "#" até o final de uma linha será tido como um comentário
+# * Todas as linhas que não estiverem em branco são um fragmento de expressão
+# regular (regex) que abrangem apenas a URL especificada
+
+ #</pre> <!-- mantenha esta linha exatamente assim -->',
+ 'spam-whitelist' => ' #<!-- mantenha esta linha exatamente assim --> <pre>
+ # URLs externas que coincidam com esta lista *não* serão
+ # bloqueadas mesmo se tiverem sido bloqueadas por entradas
+ # presentes nas listas negras.
+ #
+ # A sintaxe é a seguinte:
+ # * Tudo o que estiver após um "#" até o final de uma linha
+ # será tido como um comentário
+ # * Todas as linhas que não estiverem em branco são um
+ # fragmento de expressão regular (regex) que abrangem apenas
+ # a URL especificada
+
+ #</pre> <!-- mantenha esta linha exatamente assim -->',
+ 'email-blacklist' => ' #<!-- mantenha esta linha exatamente assim --> <pre>
+ # Endereços de e-mail que coincidam com esta lista serão
+ # impedidos de se registrar, bem como de enviar mensagens
+ # Esta lista refere-se apenas a este wiki. Consulte também a lista negra global.
+ # Veja a documentação em https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- mantenha esta linha exatamente assim --> <pre>
+ #
+ # A sintaxe é a seguinte:
+ # * Tudo o que estiver após um "#" até o final de uma
+ # linha será tido como um comentário
+ # * Todas as linhas que não estiverem em branco são um
+ # fragmento de expressão regular (regex) que abrangem apenas
+ # o domínio do endereço de e-mail
+
+ #</pre> <!-- mantenha esta linha exatamente assim -->',
+ 'email-whitelist' => ' #<!-- mantenha esta linha exatamente assim --> <pre>
+ # Endereços de e-mail que coincidam com esta lista *não*
+ # serão bloqueados mesmo que tenham sofrido bloqueio
+ # por instruções presentes nas listas negras.
+ #
+ # A sintaxe é a seguinte:
+ # * Tudo o que estiver após um "#" até o final de uma linha
+ # será tido como um comentário
+ # * Todas as linhas que não estiverem em branco são um
+ # fragmento de expressão regular (regex) que abrangem apenas
+ # os domínios dos endereços de e-mail
+
+ #</pre> <!-- mantenha esta linha exatamente assim -->',
+ 'spam-blacklisted-email' => 'Endereço eletrônico na lista negra',
+ 'spam-blacklisted-email-text' => 'O seu endereço de correio eletrônico está proibido de enviar mensagens para outros usuários.',
+ 'spam-blacklisted-email-signup' => 'O endereço fornecido encontra-se na lista negra.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|A linha|As linhas}} a seguir {{PLURAL:$1|é uma expressão regular|são expressões regulares}} (regex) {{PLURAL:$1|inválida e precisa|inválidas e precisam}} ser {{PLURAL:$1|corrigida|corrigidas}} antes de salvar a página:',
+ 'spam-blacklist-desc' => 'Ferramenta anti-"spam" baseada em Regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Romanian (română)
+ * @author Firilacroco
+ */
+$messages['ro'] = array(
+ 'spam-blacklisted-email' => 'Adresă de e-mail în lista neagră',
+);
+
+/** tarandíne (tarandíne)
+ * @author Joetaras
+ */
+$messages['roa-tara'] = array(
+ 'spam-blacklist' => " # Le URL esterne ca se iacchiane jndr'à st'elenghe avènene bloccate quanne avènene aggiunde jndr'à 'na pàgene.
+ # St'elenghe tène effette sulamende sus a sta Uicchi; se pò refèrì pure a 'a lista gnore globale.
+ # Pe documendazione vide https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# 'A sindasse jè a cumme segue:
+# * Ognecose ca tène 'u carattere \"#\" 'mbonde a fine d'a linèe jè 'nu commende
+# * Ogne linèe ca non g'è vacande jè 'nu frammende de regex ca vè face le combronde cu le host jndr'à l'URL
+
+ #</pre> <!-- leave this line exactly as it is -->",
+ 'spam-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
+ # Le URL esterne ca se iacchiane jndr'à st'elenghe *non* g'avènene bloccate pure ca lore sonde mise
+ # jndr'à l'elenghe d'a lista gnore.
+ #
+
+#
+# 'A sindasse jè a cumme segue:
+# * Ognecose ca tène 'u carattere \"#\" 'mbonde a fine d'a linèe jè 'nu commende
+# * Ogne linèe ca non g'è vacande jè 'nu frammende de regex ca vè face le combronde cu le host jndr'à l'URL
+
+ #</pre> <!-- leave this line exactly as it is -->",
+ 'email-blacklist' => " #<!-- leave this line exactly as it is --> <pre>
+# Le indirizze email ca iessene jndr'à ste elenghe onna essere bloccate da 'a reggistrazzione e da mannà le email
+# Ste elenghe tène cunde sole de sta uicchi; referite pure a 'a lista gnore globbale.
+# Pe documendazione 'ndruche https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+# 'A sindasse jè 'a seguende:
+# * Ognecose ca tène 'u carattere \"#\" 'mbonde a fine d'a linèe jè 'nu commende
+# * Ogne linèe ca non g'è vacande jè 'nu frammende de regex ca vè face le combronde cu le host jndr'à le indirizze email
+
+ #</pre> <!-- leave this line exactly as it is -->",
+ 'email-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
+# Le indirizze email ca iessene jndr'à ste elenghe *NON* ge onna essere bloccate pure ce lore ponne sta jndr'à le vôsce d'a lista gnore
+#
+# 'A sindasse jè 'a seguende:
+# * Ognecose ca tène 'u carattere \"#\" 'mbonde a fine d'a linèe jè 'nu commende
+# * Ogne linèe ca non g'è vacande jè 'nu frammende de regex ca vè face le combronde cu le host jndr'à le indirizze email
+
+ #</pre> <!-- leave this line exactly as it is -->",
+ 'spam-blacklisted-email' => 'Indirizze email da ignorà',
+ 'spam-blacklisted-email-text' => "L'indirizze email tune jè mo jndr'à lista gnore pe mannà email a otre utinde.",
+ 'spam-blacklisted-email-signup' => "L'indirizze email ca è date pe mò ste jndr'à lista gnore.",
+ 'spam-invalid-lines' => "{{PLURAL:$1|'A seguende linèe d'a blacklist de spam jè|Le seguende linèe d'a blacklist de spam sonde}} {{PLURAL:$1|espressione|espressiune}} regolare invalide e {{PLURAL:$1|abbesogne|abbesognane}} de avenè corrette apprime de reggistrà 'a pàgene:",
+ 'spam-blacklist-desc' => "'U strumende andi-spam basate sus a le regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]",
+);
+
+/** Russian (руÑÑкий)
+ * @author Ahonc
+ * @author Express2000
+ * @author HalanTul
+ * @author Kaganer
+ * @author ÐлекÑандр Сигачёв
+ */
+$messages['ru'] = array(
+ 'spam-blacklist' => ' # Внешние ÑÑылки, ÑоответÑтвующие Ñтому ÑпиÑку, будут запрещены Ð´Ð»Ñ Ð²Ð½ÐµÑÐµÐ½Ð¸Ñ Ð½Ð° Ñтраницы.
+ # Этот ÑпиÑок дейÑтвует только Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ вики, ÑущеÑтвует также общий чёрный ÑпиÑок.
+ # Подробнее на Ñтранице https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- не изменÑйте Ñту Ñтроку --> <pre>
+#
+# СинтакÑиÑ:
+# * Ð’ÑÑ‘, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ñимвола "#" и до конца Ñтроки, ÑчитаетÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ¼
+# * ÐšÐ°Ð¶Ð´Ð°Ñ Ð½ÐµÐ¿ÑƒÑÑ‚Ð°Ñ Ñтрока ÑвлÑетÑÑ Ñ„Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚Ð¾Ð¼ регулÑрного выражениÑ, применÑемого только к узлу в URL
+
+ #</pre> <!-- не изменÑйте Ñту Ñтроку -->',
+ 'spam-whitelist' => ' #<!-- не изменÑйте Ñту Ñтроку --> <pre>
+# Внешние ÑÑылки, ÑоответÑтвующие Ñтому ÑпиÑку, *не* будут блокироватьÑÑ, даже еÑли они попали в чёрный ÑпиÑок.
+#
+# СинтакÑиÑ:
+# * Ð’ÑÑ‘, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ñимвола "#" и до конца Ñтроки, ÑчитаетÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ¼
+# * ÐšÐ°Ð¶Ð´Ð°Ñ Ð½ÐµÐ¿ÑƒÑÐºÐ°Ñ Ñтрока ÑвлÑетÑÑ Ñ„Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚Ð¾Ð¼ регулÑрного выражениÑ, применÑемого только к узлу в URL
+
+ #</pre> <!-- не изменÑйте Ñту Ñтроку -->',
+ 'email-blacklist' => ' # ÐдреÑа Ñлектронной почты, ÑоответÑтвующие Ñтому ÑпиÑку, будут заблокированы от региÑтрации или поÑылки Ñл. почты.
+ # Этот ÑпиÑок дейÑтвует только Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ вики, ÑущеÑтвует также общий чёрный ÑпиÑок.
+ # Подробнее на Ñтранице https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- не изменÑйте Ñту Ñтроку --> <pre>
+#
+# СинтакÑиÑ:
+# * Ð’ÑÑ‘, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ñимвола "#" и до конца Ñтроки, ÑчитаетÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ¼
+# * ÐšÐ°Ð¶Ð´Ð°Ñ Ð½ÐµÐ¿ÑƒÑÑ‚Ð°Ñ Ñтрока ÑвлÑетÑÑ Ñ„Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚Ð¾Ð¼ регулÑрного выражениÑ, применÑемого только к узлам внутри адреÑов Ñл. почты
+
+ #</pre> <!-- не изменÑйте Ñту Ñтроку -->',
+ 'email-whitelist' => ' #<!-- не изменÑйте Ñту Ñтроку --> <pre>
+# ÐдреÑа Ñлектронной почты, ÑоответÑтвующие Ñтому ÑпиÑку, ÐЕ БУДУТ заблокированы,
+# даже еÑли они внеÑены в черный ÑпиÑок.
+#
+ #</pre> <!-- не изменÑйте Ñту Ñтроку -->
+# СинтакÑиÑ:
+# * Ð’ÑÑ‘, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ñимвола "#" и до конца Ñтроки, ÑчитаетÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ¼
+# * ÐšÐ°Ð¶Ð´Ð°Ñ Ð½ÐµÐ¿ÑƒÑÑ‚Ð°Ñ Ñтрока ÑвлÑетÑÑ Ñ„Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚Ð¾Ð¼ регулÑрного выражениÑ, применÑемого только к узлам внутри адреÑов Ñл. почты',
+ 'spam-blacklisted-email' => 'ÐдреÑа Ñлектронной почты, занеÑённые в чёрный ÑпиÑок',
+ 'spam-blacklisted-email-text' => 'Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð² чёрном ÑпиÑке, поÑтому вы не можете отправлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ пользователÑм.',
+ 'spam-blacklisted-email-signup' => 'Указанный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð½ÐµÑён в чёрный ÑпиÑок и не может быть иÑпользован.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтрока чёрного ÑпиÑка ÑÑылок Ñодержит ошибочное регулÑрное выражение и должна быть иÑправлена|Следующие Ñтроки чёрного ÑпиÑка ÑÑылок Ñодержат ошибочные регулÑрные Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ должны быть иÑправлены}} перед Ñохранением:',
+ 'spam-blacklist-desc' => 'ОÑнованный на регулÑрных выражениÑÑ… анти-Ñпам инÑтрумент: [[MediaWiki:Spam-blacklist]] и [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Rusyn (руÑиньÑкый)
+ * @author Gazeb
+ */
+$messages['rue'] = array(
+ 'spam-blacklist' => ' # ЕкÑтерны URL одповідаючі тому ÑпиÑку будуть заблокованы при пробі придати Ñ—Ñ… на Ñторінку.
+ # Тот ÑпиÑок овпливнює лем тоту вікі; поÑмотьте ÑÑ Ñ‚Ñ‹Ð¶ на ґлоналну чорну лиÑтину.
+ # Документацію найдете на https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Охабте тот Ñ€Ñдок точно Ñк Ñ” --> <pre>
+#
+# СінтакÑÑ–Ñ Ñ” наÑтупный:
+# * Вшытко од знаку „#“ до кінце Ñ€Ñдку Ñ” коментарь
+# * Каждый непорожній Ñ€Ñдок Ñ” чаÑÑ‚ÑŒ реґуларного выразу, котрому будуть одповідати лем домены з URL
+
+ #</pre> <!-- Охабте тот Ñ€Ñдок точно Ñк Ñ” -->',
+ 'spam-whitelist' => ' #<!-- Охабте тот Ñ€Ñдок точно Ñк Ñ” --> <pre>
+# ЕкÑтерны URL одповідаючі выразам у тім ÑпиÑку *не будуть* заблокованы, ані кобы
+# Ñ—Ñ… заблоковали положкы з чорной лиÑтины.
+#
+# СінтакÑÑ–Ñ Ñ” наÑтупна:
+# * Вшытко од знаку „#“ до кінце Ñ€Ñдку Ñ” коментарь
+# * каждый непорожній Ñ€Ñдок Ñ” чаÑÑ‚ÑŒ реґуларного выразу, котрому будурь одповідати лем домены з URL
+
+ #</pre> <!-- Охабте тот Ñ€Ñдок точно Ñк Ñ” -->',
+ 'email-blacklist' => ' # З імейлів одповідных гевÑёму ÑпиÑку не буде годен зареґіÑтровати ни конто ни поÑлати імейл.
+ # ГевÑеÑÑŒ ÑпиÑок мать вплыв лем на гевÑÑŽ вікі; поÑмотьте тыж ґлобалных чорный ÑпиÑок.
+ # Документацію найдете на https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- тот Ñ€Ñдок охабте актуално так Ñк він Ñ” теперь --> <pre>
+#
+# Ð¡Ñ–Ð½Ñ‚Ð°ÐºÑ Ñ” в наÑтупных Ñ€Ñдках:
+# * Вшытко од Ñімвола „#“ до кінце Ñ€Ñдка Ñ” коментарь
+# * Каждый непорожнїй Ñ€Ñдок Ñ” чаÑÑ‚ÑŒ реґуларного выразу, котрому будуть одповідати лем домены в імейловых адреÑах
+
+ #</pre> <!-- тот Ñ€Ñдок охабте актуално так Ñк він Ñ” теперь -->',
+ 'email-whitelist' => ' #<!-- тот Ñ€Ñдок охабте актуално так Ñк він Ñ” теперь --> <pre>
+# Імейлы одповідны тому ÑпиÑку *не будуть* заблокованы, хоць бы
+# одповідали запиÑам в чорнім ÑпиÑку.
+#
+# Ð¡Ñ–Ð½Ñ‚Ð°ÐºÑ Ñ” в наÑтупныха Ñ€Ñдках:
+# * Вшытко од Ñімвола „#“ до кінце Ñ€Ñдка Ñ” коментарь
+# * Каждый непорожнїй Ñ€Ñдок Ñ” чаÑÑ‚ÑŒ реґуларного выразу, котрому будуть одповідати лем домены в імейловых адреÑах
+ #</pre> <!-- тот Ñ€Ñдок охабте актуално так Ñк він Ñ” теперь -->',
+ 'spam-blacklisted-email' => 'Імейл на чорнім ÑпиÑку',
+ 'spam-blacklisted-email-text' => 'Ваша імейлова адреÑа Ñ” моментално уведжена на чорнім ÑпиÑку, та же другым хоÑнователÑм не можете поÑлати імейл.',
+ 'spam-blacklisted-email-signup' => 'Уведжена імейлова адреÑа Ñ” моментално на чорнім ÑпиÑку.',
+ 'spam-invalid-lines' => 'Ðа чорній лиÑтинї Ñпаму {{PLURAL:$1|Ñ” наÑтупный Ñ€Ñдок неправилный реґуларный выраз|Ñуть наÑтупны Ñ€Ñдкы неправилны реґуларны выразы|Ñуть наÑтупны Ñ€Ñдкы неправилны реґуларны выразы}} Ñ– Ñ” треба {{PLURAL:$1|го|Ñ—Ñ…|Ñ—Ñ…}} перед уложінём Ñторінкы Ñправити:',
+ 'spam-blacklist-desc' => 'ÐнтіÑпамовый інштрумент на базї реґуларных выразів: [[MediaWiki:Spam-blacklist]] Ñ– [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Sanskrit (संसà¥à¤•à¥ƒà¤¤à¤®à¥)
+ * @author Shubha
+ */
+$messages['sa'] = array(
+ 'spam-blacklist' => ' #सूचà¥à¤¯à¤¾à¤‚ विदà¥à¤¯à¤®à¤¾à¤¨à¤¾à¤¨à¤¾à¤‚ सदृशानि बाहà¥à¤¯ URLs अवरà¥à¤¦à¥à¤§à¤¾à¤¨à¤¿ भवनà¥à¤¤à¤¿ यदा पृषà¥à¤ à¤‚ योजà¥à¤¯à¤¤à¥‡ ।
+ #à¤à¤·à¤¾ सूची असà¥à¤¯à¤¾à¤‚ वीकà¥à¤¯à¤¾à¤‚ पà¥à¤°à¤­à¤¾à¤µà¤•à¤¾à¤°à¤¿à¤£à¥€ असà¥à¤¤à¤¿; वैशà¥à¤µà¤¿à¤•à¤¦à¥à¤°à¥à¤ªà¤¯à¥à¤•à¥à¤¤à¤¾à¤µà¤²à¥à¤¯à¤¾à¤ƒ कृते अपि आनà¥à¤µà¤¿à¤¤à¤‚ भवति ।
+ #पà¥à¤°à¤²à¥‡à¤–नाय दृशà¥à¤¯à¤¤à¤¾à¤®à¥ https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+#विनà¥à¤¯à¤¾à¤¸à¤ƒ à¤à¤µà¤‚ विदà¥à¤¯à¤¤à¥‡ :
+# * "#" तः आरभà¥à¤¯à¤®à¤¾à¤£à¤¾à¤ƒ पङà¥à¤•à¥à¤¤à¥‡à¤ƒ अनà¥à¤¤à¥à¤¯à¤ªà¤°à¥à¤¯à¤¨à¥à¤¤à¤‚ विदà¥à¤¯à¤®à¤¾à¤¨à¤ƒ अभिपà¥à¤°à¤¾à¤¯à¤ƒ भवति ।
+# * पà¥à¤°à¤¤à¥à¤¯à¥‡à¤•à¤‚ रिकà¥à¤¤à¤°à¤¹à¤¿à¤¤à¤¾ पंकà¥à¤¤à¤¿à¤ƒ regex fragment भवति यतॠURLs अनà¥à¤¤à¤°à¥à¤—तैः आयोजकैः तà¥à¤²à¥à¤¯à¤¤à¥‡
+ #</pre> <!-- इयं पङà¥à¤•à¥à¤¤à¥€ यथावतॠतà¥à¤¯à¤œà¥à¤¯à¤¤à¤¾à¤®à¥ -->',
+ 'spam-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+#असà¥à¤¯à¤¾à¤‚ सूचà¥à¤¯à¤¾à¤‚ विदà¥à¤¯à¤®à¤¾à¤¨à¤¾à¤¨à¤¾à¤‚ सदृशानि URLs *न* अवरà¥à¤¦à¥à¤§à¥à¤¯à¤¨à¥à¤¤à¥‡ यदà¥à¤¯à¤ªà¤¿ शकà¥à¤¯à¤®à¥
+# दà¥à¤°à¥à¤ªà¤¯à¥à¤•à¥à¤¤à¤ªà¥à¤°à¤µà¥‡à¤¶à¥ˆà¤ƒ अवरà¥à¤¦à¥à¤§à¤®à¤¸à¥à¤¤à¤¿ ।
+#
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'email-blacklist' => ' #सूचà¥à¤¯à¤¾à¤‚ विदà¥à¤¯à¤®à¤¾à¤¨à¤¾à¤¨à¤¾à¤‚ सदृशाः बाहà¥à¤¯ ईपतà¥à¤°à¤¸à¤™à¥à¤•à¥‡à¤¤à¤¾à¤ƒ पञà¥à¤œà¥€à¤•à¤°à¤£à¤¾à¤¤à¥ ईपतà¥à¤°à¤ªà¥à¤°à¥‡à¤·à¤£à¤¾à¤¤à¥ च अवरà¥à¤¦à¥à¤§à¤¾à¤ƒ भवनà¥à¤¤à¤¿
+ #à¤à¤·à¤¾ सूची असà¥à¤¯à¤¾à¤‚ वीकà¥à¤¯à¤¾à¤‚ पà¥à¤°à¤­à¤¾à¤µà¤•à¤¾à¤°à¤¿à¤£à¥€ असà¥à¤¤à¤¿; वैशà¥à¤µà¤¿à¤•à¤¦à¥à¤°à¥à¤ªà¤¯à¥à¤•à¥à¤¤à¤¾à¤µà¤²à¥à¤¯à¤¾à¤ƒ कृते अपि आनà¥à¤µà¤¿à¤¤à¤‚ भवति ।
+ #पà¥à¤°à¤²à¥‡à¤–नाय दृशà¥à¤¯à¤¤à¤¾à¤®à¥ https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+#विनà¥à¤¯à¤¾à¤¸à¤ƒ à¤à¤µà¤‚ विदà¥à¤¯à¤¤à¥‡ :
+# * "#" तः आरभà¥à¤¯à¤®à¤¾à¤£à¤¾à¤ƒ पङà¥à¤•à¥à¤¤à¥‡à¤ƒ अनà¥à¤¤à¥à¤¯à¤ªà¤°à¥à¤¯à¤¨à¥à¤¤à¤‚ विदà¥à¤¯à¤®à¤¾à¤¨à¤ƒ अभिपà¥à¤°à¤¾à¤¯à¤ƒ भवति ।
+# * पà¥à¤°à¤¤à¥à¤¯à¥‡à¤•à¤‚ रिकà¥à¤¤à¤°à¤¹à¤¿à¤¤à¤¾ पंकà¥à¤¤à¤¿à¤ƒ regex fragment भवति यतॠURLs अनà¥à¤¤à¤°à¥à¤—तैः आयोजकैः तà¥à¤²à¥à¤¯à¤¤à¥‡
+ #</pre> <!-- इयं पङà¥à¤•à¥à¤¤à¥€ यथावतॠतà¥à¤¯à¤œà¥à¤¯à¤¤à¤¾à¤®à¥ -->',
+ 'email-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+#असà¥à¤¯à¤¾à¤‚ सूचà¥à¤¯à¤¾à¤‚ विदà¥à¤¯à¤®à¤¾à¤¨à¤¾à¤¨à¤¾à¤‚ सदृशाः ईपतà¥à¤°à¤¸à¤™à¥à¤•à¥‡à¤¤à¤¾à¤ƒ *न* अवरà¥à¤¦à¥à¤§à¥à¤¯à¤¨à¥à¤¤à¥‡ यदà¥à¤¯à¤ªà¤¿ शकà¥à¤¯à¤®à¥
+# दà¥à¤°à¥à¤ªà¤¯à¥à¤•à¥à¤¤à¤ªà¥à¤°à¤µà¥‡à¤¶à¥ˆà¤ƒ अवरà¥à¤¦à¥à¤§à¤®à¤¸à¥à¤¤à¤¿ ।
+#
+ #</pre> <!-- leave this line exactly as it is -->
+# विनà¥à¤¯à¤¾à¤¸à¤ƒ à¤à¤µà¤‚ भवेतà¥:
+# * "#" तः आरभà¥à¤¯à¤®à¤¾à¤£à¤‚ वाकà¥à¤¯à¤¾à¤¨à¥à¤¤à¤ªà¤°à¥à¤¯à¤¨à¥à¤¤à¤‚ विदà¥à¤¯à¤®à¤¾à¤¨à¤®à¥ अभिपà¥à¤°à¤¾à¤¯à¤ƒ मनà¥à¤¯à¤¤à¥‡
+# * सरà¥à¤µà¤¾à¤ƒ रिकà¥à¤¤à¤°à¤¹à¤¿à¤¤à¤¾à¤ƒ पङà¥à¤•à¥à¤¤à¤¯à¤ƒ regex fragment भवति ये ईपतà¥à¤°à¤¸à¤™à¥à¤•à¥‡à¤¤à¤¾à¤¨à¥à¤¤à¤°à¥à¤—तेन अंशेन तà¥à¤²à¥à¤¯à¤¨à¥à¤¤à¥‡',
+ 'spam-blacklisted-email' => 'निनà¥à¤¦à¥à¤¯à¤ƒ ईपतà¥à¤°à¤¸à¤™à¥à¤•à¥‡à¤¤à¤ƒ',
+ 'spam-blacklisted-email-text' => 'भवतः ईपतà¥à¤°à¤¸à¤™à¥à¤•à¥‡à¤¤à¤ƒ समà¥à¤ªà¥à¤°à¤¤à¤¿ निनà¥à¤¦à¥à¤¯à¤¸à¤™à¥à¤•à¥‡à¤¤à¤¾à¤¨à¤¾à¤®à¥ आवलà¥à¤¯à¤¾à¤‚ पà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤à¤ƒ । अतः अनà¥à¤¯à¥‡à¤­à¥à¤¯à¤ƒ योजकेभà¥à¤¯à¤ƒ ईपतà¥à¤°à¤ªà¥à¤°à¥‡à¤·à¤£à¤‚ नानà¥à¤®à¤¨à¥à¤¯à¤¤à¥‡ ।',
+ 'spam-blacklisted-email-signup' => 'पà¥à¤°à¤¦à¤¤à¥à¤¤à¤ƒ निनà¥à¤¦à¥à¤¯à¤ƒ ईपतà¥à¤°à¤¸à¤™à¥à¤•à¥‡à¤¤à¤ƒ समà¥à¤ªà¥à¤°à¤¤à¤¿ उपयोगे नासà¥à¤¤à¤¿ ।',
+ 'spam-invalid-lines' => 'अधोनिरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¤¾à¤ƒ अनिषà¥à¤Ÿà¤¸à¤¨à¥à¤¦à¥‡à¤¶à¤¦à¥à¤°à¥à¤µà¥ƒà¤¤à¥à¤¤à¤¯à¤ƒ {{PLURAL:$1|पंकà¥à¤¤à¤¿à¤ƒ|पंकà¥à¤¤à¤¿à¤¯à¤ƒ}} अमानà¥à¤¯à¤¾à¤ƒ नियताः {{PLURAL:$1|अभिवà¥à¤¯à¤•à¥à¤¤à¤¿à¤ƒ असà¥à¤¤à¤¿|अभिवà¥à¤¯à¤•à¥à¤¤à¤¯à¤ƒ सनà¥à¤¤à¤¿}} अतः पृषà¥à¤ à¤°à¤•à¥à¤·à¤£à¤¾à¤¤à¥ पूरà¥à¤µà¤‚ तेषां परिषà¥à¤•à¤¾à¤°à¤ƒ अवशà¥à¤¯à¤‚ करà¥à¤¤à¤µà¥à¤¯à¤¾à¤ƒ :',
+ 'spam-blacklist-desc' => 'रेजेकà¥à¤¸à¥-आधारितमॠअनिषà¥à¤Ÿà¤¸à¤¨à¥à¤¦à¥‡à¤¶à¤µà¤¿à¤°à¥‹à¤§à¤¿ उपकरणमà¥: [[MediaWiki:Spam-blacklist]] [[MediaWiki:Spam-whitelist]] च',
+);
+
+/** Sakha (Ñаха тыла)
+ * @author HalanTul
+ */
+$messages['sah'] = array(
+ 'spam-blacklist' => " # Бу иÑпииһÑÐºÐºÑ Ð±Ð°Ð°Ñ€ Ñ‚Ð°Ñ ÑигÑлÑÑ€ бобуллуохтара.
+ # Бу иÑпииһÑк бу ÑÑ€Ñ Ð±Ñ‹Ñ€Ð°Ð¹Ñ‹Ð°ÐºÐºÐ° үлÑлиир, уопÑай ''хара иÑпииһÑк'' ÑÐ¼Ð¸Ñ Ð±Ð°Ð°Ñ€Ñ‹Ð½ умнума.
+ # Сиһилии манна көр https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- бу Ñтроканы уларытыма --> <pre>
+#
+# СинтакÑиÑ:
+# * Бу \"#\" бÑлиÑÑ‚Ñ‚Ñн Ñаҕалаан Ñтрока бүтүөр дылы барыта Ñ…Ð¾Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹Ð½Ð½Ð°Ð½ ааҕыллар
+# * ÐšÐ°Ð¶Ð´Ð°Ñ Ð½ÐµÐ¿ÑƒÑÑ‚Ð°Ñ Ñтрока ÑвлÑетÑÑ Ñ„Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚Ð¾Ð¼ регулÑрного выражениÑ, применÑемого только к узлу в URL
+
+ #</pre> <!-- бу Ñтроканы уларытыма -->",
+ 'spam-whitelist' => ' #<!-- бу Ñтроканы уларытыма --> <pre>
+# Манна киирбит Ñ‚Ð°Ñ ÑигÑлÑÑ€ хара иÑпииһÑÐºÐºÑ ÐºÐ¸Ð¸Ñ€Ð±Ð¸Ñ‚ да буоллахтарына Ñин биир *бобуллуохтара Ñуоҕа*.
+#
+# СинтакÑиÑ:
+# * Бу "#" бÑлиÑÑ‚Ñ‚Ñн Ñаҕалаан Ñтрока бүтүөр дылы барыта Ñ…Ð¾Ñ Ð±Ñ‹Ò»Ð°Ð°Ñ€Ñ‹Ñ‹Ð½Ð½Ð°Ð½ ааҕыллар
+# * ÐšÐ°Ð¶Ð´Ð°Ñ Ð½ÐµÐ¿ÑƒÑÑ‚Ð°Ñ Ñтрока ÑвлÑетÑÑ Ñ„Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚Ð¾Ð¼ регулÑрного выражениÑ, применÑемого только к узлу в URL
+
+ #</pre> <!-- бу Ñтроканы уларытыма -->',
+ 'spam-invalid-lines' => 'Хара иÑпииһÑк манна көрдөрүллүбүт {{PLURAL:$1|Ñтрокаата Ñыыһалаах|Ñтрокаалара Ñыыһалаахтар}}, уларытыах Ð¸Ð½Ð½Ð¸Ð½Ñ Ð¾Ð» көннөрүллүөхтÑÑÑ…:',
+ 'spam-blacklist-desc' => 'Ðнти-Ñпам Ò¯ÑтүрүмүөнÑ: [[MediaWiki:Spam-blacklist]] уонна [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Sicilian (sicilianu)
+ * @author Santu
+ */
+$messages['scn'] = array(
+ 'spam-blacklist' => ' # Li URL fora dû sito ca currispùnnunu a la lista di sècutu vènunu bluccati.
+ # La lista vali sulu pi stu situ; fari rifirimentu macari a la blacklist glubbali.
+ # Pâ ducumentazzioni talìa https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- nun mudificari pi nenti chista riga --> <pre>
+# La sintassi è chista:
+# * Tuttu chiddu ca veni doppu nu caràttiri "#" è nu cummentu, nzinu ca finisci la riga
+# * Tutti li righi non vacanti sunnu frammenti di sprissioni riulari ca s\'àpplicanu sulu ô nomu di l\'host nti li URL
+ #</pre> <!-- non mudificari nenti di sta riga -->',
+ 'spam-whitelist' => ' #<!-- non mudificari nta nudda manera sta riga --> <pre>
+# Li URL fora ô situ ca currispùnninu a la lista ccà di sècutu *non* vèninu
+# bluccati, macari ntô casu avìssiru a currispùnniri a arcuni vuci di la blacklist
+#
+# La sintassi è chista:
+# * Tuttu chiddu ca veni doppu un caràttiri "#" è nu cummentu, nzinu a la fini dâ riga
+# * Tutti li righi non vacanti sunnu frammenti di sprissioni riulari ca s\'applìcanu sulu ô nomu di l\'host ntê URL
+
+ #</pre> <!-- non mudificari nta nudda manera sta riga -->',
+ 'spam-invalid-lines' => '{{PLURAL:$1|La riga di sècutu|Li righi di sècutu}} di la blacklist dô spam {{PLURAL:$1|nun è na sprissioni riulari boni|nun sunnu sprissioni riulari boni}}; currèggiri {{PLURAL:$1|lu sbagghiu|li sbagghi}} prima di sarvari la pàggina.',
+ 'spam-blacklist-desc' => 'Strumentu antispam basatu supra li sprissioni riulari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Sinhala (සිංහල)
+ * @author Budhajeewa
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['si'] = array(
+ 'spam-blacklist' => ' # External URLs matching this list will be blocked when added to a page.
+ # This list affects only this wiki; refer also to the global blacklist.
+ # For documentation see https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# Syntax is as follows:
+# * Everything from a "#" character to the end of the line is a comment
+# * Every non-blank line is a regex fragment which will only match hosts inside URLs
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# External URLs matching this list will *not* be blocked even if they would
+# have been blocked by blacklist entries.
+#
+# Syntax is as follows:
+# * Everything from a "#" character to the end of the line is a comment
+# * Every non-blank line is a regex fragment which will only match hosts inside URLs
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-blacklisted-email' => 'අපලේඛනගත විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපින',
+ 'spam-invalid-lines' => 'පහත දà·à¶šà·Šà·€à·™à¶± කළු ලයිස්තු {{PLURAL:$1|පේලිය|පේලි}} à·€à·à¶»à¶¯à·’ regular {{PLURAL:$1|expression|expressions}} වන අතර, පිටුව සුරà·à¶šà·“මට පෙර නිවà·à¶»à¶¯à·’ කළ යුතුය:',
+ 'spam-blacklist-desc' => 'Regex-පà·à¶¯à¶š ප්â€à¶»à¶­à·’-ස්පෑම ආවුදය: [[MediaWiki:Spam-blacklist]] සහ [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Slovak (slovenÄina)
+ * @author Helix84
+ */
+$messages['sk'] = array(
+ 'spam-blacklist' => '# Externé URLs zodpovedajúce tomuto zoznamu budú zablokované pri pokuse pridať ich na stránku.
+# Tento zoznam ovplyvňuje iba túto wiki; pozrite sa tiež na globálnu Äiernu listinu.
+ # Dokumentáciu nájdete na https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#<!-- nechajte tento riadok presne ako je --> <pre>
+#
+# Syntax je nasledovná:
+# * Všetko od znaku „#“ do konca riadka je komentár
+# * Každý neprázdny riadok je ÄasÅ¥ regulárneho výrazu, ktorému budú zodpovedaÅ¥ iba domény z URL
+
+#</pre> <!-- nechajte tento riadok presne ako je -->',
+ 'spam-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Externé URL zodpovedajúce výrazom v tomto zozname *nebudú* zablokované, ani keby
+# ich zablokovali položky z Äiernej listiny.
+#
+# Syntax je nasledovná:
+# * Všetko od znaku "#" do konca riadka je komentár
+# * Každý neprázdny riadok je regulárny výraz, podľa ktorého sa budú kontrolovať názvy domén
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Nasledovný riadok|Nasledovné riadky}} Äiernej listiny spamu {{PLURAL:$1|je neplatný regulárny výraz|sú neplatné regulárne výrazy}} a je potrebné {{PLURAL:$1|ho|ich}} opraviÅ¥ pred uložením stránky:',
+ 'spam-blacklist-desc' => 'Antispamový nástroj na základe regulárnych výrazov: [[MediaWiki:Spam-blacklist|Čierna listina]] a [[MediaWiki:Spam-whitelist|Biela listina]]',
+);
+
+/** Slovenian (slovenÅ¡Äina)
+ * @author Dbc334
+ * @author Eleassar
+ * @author Yerpo
+ */
+$messages['sl'] = array(
+ 'spam-blacklist' => ' # Zunanji URL-ji, ki se ujemajo s tem seznamom, bodo blokirani, ko bodo dodani na stran.
+ # Seznam vpliva samo na ta wiki; oglejte si tudi globalni Ärni seznam.
+ # Za dokumentacijo si oglejte https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- pustite to vrstico takšno, kot je --> <pre>
+#
+# Skladnja je sledeÄa:
+# * Vse od znaka »#« do konca vrstice je pripomba
+# * Vsaka neprazna vrstica je delec regularnega izraza, ki se bo ujemal samo z gostitelji v URL-jih
+
+ #</pre> <!-- pustite to vrstico takšno, kot je -->',
+ 'spam-whitelist' => ' #<!-- pustite to vrstico takšno, kot je --> <pre>
+# Zunanji URL-ji, ki se ujemajo s tem seznamom, *ne* bodo blokirani,
+# Äetudi bi bili blokirani z vnosi Ärnega seznama.
+#
+# Skladnja je sledeÄa:
+# * Vse od znaka »#« do konca vrstice je pripomba
+# * Vsaka neprazna vrstica je delec regularnega izraza, ki se bo ujemal samo z gostitelji v URL-jih
+
+ #</pre> <!-- pustite to vrstico takšno, kot je -->',
+ 'email-blacklist' => '# Registracija in poÅ¡iljanje z e-poÅ¡tnih naslovov, ki se ujemajo s spodnjim seznamom, bosta prepreÄena
+ # Seznam vpliva samo na ta wiki; glejte tudi globalni Ärni seznam.
+ # Za dokumentacijo glejte https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- to vrstico pustite natanÄno takÅ¡no, kakrÅ¡na je --> <pre>
+#
+# Opis skladnje:
+# * Vse od znaka "#" do konca vrstice je komentar *
+# Vsaka neprazna vrstica je regularni izraz, ki se lahko ujema le z imeni gostiteljev v e-poštnih naslovih
+
+ #</pre> <!-- to vrstico pustite natanÄno takÅ¡no, kakrÅ¡na je -->',
+ 'email-whitelist' => '#<!-- to vrstico pustite natanÄno takÅ¡no, kakrÅ¡na je --> <pre>
+# E-poÅ¡tni naslovi, ki se ujemajo s tem seznamom, *ne* bodo blokirani, tudi Äe bi
+# bili blokirani z vnosi na Ärnem seznamu.
+#
+ #</pre> <!-- to vrstico pustite natanÄno takÅ¡no, kakrÅ¡na je -->
+# Opis skladnje:
+# * Vse od znaka "#" do konca vrstice je komentar
+# * Vsaka neprazna vrstica je regularni izraz, ki se lahko ujema le z imenom gostitelja v e-poštnem naslovu',
+ 'spam-blacklisted-email' => 'E-poÅ¡tni naslov na Ärnem seznamu',
+ 'spam-blacklisted-email-text' => 'VaÅ¡ e-poÅ¡tni naslov je trenutno na Ärnem seznamu, zato ne morete poÅ¡iljati poÅ¡te drugim uporabnikom.',
+ 'spam-blacklisted-email-signup' => 'E-poÅ¡tni naslov je trenutno na Ärnem seznamu.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Naslednja vrstica|Naslednji vrstici|Naslednje vrstice}} Ärnega seznama smetja {{PLURAL:$1|je neveljavni regularni izraz in ga|sta neveljavna regularna izraza in ju|so neveljavni regularni izrazi in jih}} je pred shranjevanjem strani potrebno popraviti:',
+ 'spam-blacklist-desc' => 'Orodje proti smetju, temeljeÄe na regularnih izrazih: [[MediaWiki:Spam-blacklist]] in [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Albanian (shqip)
+ * @author FatosMorina
+ * @author Olsi
+ */
+$messages['sq'] = array(
+ 'spam-blacklist' => ' # URL-të e jashtme që përputhen me këtë listë do të bllokohen kur shtohen tek një faqe.
+ # Kjo listë ndikon vetëm në këtë wiki; referojuni gjithashtu listës së zezë globale.
+ # Për dokumentacionin shiko https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# Sintaksa është si më poshtë:
+# * Çdo gjë nga një karakter "#" në fund të rreshtit është një koment
+# * Çdo rresht jobosh është një fragment që do të përputhë vetëm hostet brenda URL-ve
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# URL-të e jashtme që përputhen më këtë listë *nuk* nuk do të bllokohen edhe nëse ato do të
+# kishin qenë të bllokuara nga shënimet e listës së zezë.
+#
+# Sintaksa është si më poshtë:
+# * Çdo gjë nga një karakter "#" në fund të rreshtit është një koment
+# * Çdo rresht jobosh është një fragment që vetëm do të përputhë hostet brenda URL-ve
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-blacklisted-email' => 'E-mail adresa e vendosur në listën e zezë',
+ 'spam-blacklisted-email-text' => 'E-mail adresa juaj është për momentin në penguar nga dërgimi i e-mailave tek përdoruesit e tjerë.',
+ 'spam-blacklisted-email-signup' => 'E-mail adresa e dhënë për momentin është ndaluuar nga përdorimi',
+ 'spam-invalid-lines' => 'Lista e zezë e mëposhtme spam {{PLURAL:$1|rreshti është një|rreshtat janë}} {{PLURAL:$1|shprehje|shprehje}} të rregullta të pavlefshme dhe {{PLURAL:$1|nevojitet|nevojitet}} të korrigjohen përpara ruajtjes së faqes:',
+ 'spam-blacklist-desc' => 'Mjeti anti-spam regex i bazuar: [[MediaWiki:Spam-blacklist]] dhe [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Millosh
+ */
+$messages['sr-ec'] = array(
+ 'spam-blacklist-desc' => 'ÐнтиÑпам оруђе заÑновано на регуларним изразима: [[MediaWiki:Spam-blacklist]] и [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Serbian (Latin script) (srpski (latinica)‎)
+ * @author Michaello
+ */
+$messages['sr-el'] = array(
+ 'spam-blacklist-desc' => 'Antispam oruđe zasnovano na regularnim izrazima: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Seeltersk (Seeltersk)
+ * @author Pyt
+ */
+$messages['stq'] = array(
+ 'spam-blacklist' => ' # Externe URLs, do der in disse Lieste äntheelden sunt, blokkierje dät Spiekerjen fon ju Siede.
+ # Disse Lieste beträft bloot dit Wiki; sjuch uk ju globoale Blacklist.
+ # Tou ju Dokumenation sjuch https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- Disse Riege duur nit ferannerd wäide! --> <pre>
+#
+# Syntax:
+# * Alles fon dät "#"-Teeken ou bit tou Eende fon ju Riege is n Kommentoar
+# * Älke nit-loose Riege is n regulären Uutdruk, ju der juun do Host-Noomen in do URLs wröiged wäd.
+
+ #</pre> <!-- Disse Riege duur nit ferannerd wäide! -->',
+ 'spam-whitelist' => ' #<!-- Disse Riege duur nit ferannerd wäide! --> <pre>
+# Externe URLs, do der in disse Lieste äntheelden sunt, blokkierje dät Spiekerjen fon ju Siede nit,
+# uk wan jo in ju globoale of lokoale swotte Lieste äntheelden sunt.
+#
+# Syntax:
+# * Alles fon dät "#"-Teeken ou bit tou Eende fon ju Riege is n Kommentoar
+# * Älke nit-loose Riege is n regulären Uutdruk, die der juun do Host-Noomen in do URLs wröided wäd.
+
+ #</pre> <!-- Disse Riege duur nit ferannerd wäide! -->',
+ 'spam-invalid-lines' => '{{PLURAL:$1
+ | Ju foulgjende Siede in ju Spam-Blacklist is n uungultigen regulären Uutdruk. Ju mout foar dät Spiekerjen fon ju Siede korrigierd wäide
+ | Do foulgjende Sieden in ju Spam-Blacklist sunt uungultige reguläre Uutdrukke. Do mouten foar dät Spiekerjen fon ju Siede korrigierd wäide}}:',
+ 'spam-blacklist-desc' => 'Regex-basierde Anti-Spam-Reewe: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Swedish (svenska)
+ * @author Lejonel
+ * @author WikiPhoenix
+ */
+$messages['sv'] = array(
+ 'spam-blacklist' => '
+ # Den här listan stoppar matchande externa URL:er från att läggas till på sidor.
+ # Listan påverkar bara den här wikin; se även den globala svarta listan för spam.
+ # För dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- ändra inte den här raden --> <pre>
+#
+# Syntaxen är följande:
+# * All text från ett #-tecken till radens slut är en kommentar
+# * Alla icke-tomma rader används som reguljära uttryck för att matcha domännamn i URL:er
+
+ #</pre> <!-- ändra inte den här raden -->',
+ 'spam-whitelist' => '
+ #<!-- ändra inte den här raden --> <pre>
+# Externa URL:er som matchar den här listan blockeras *inte*,
+# inte ens om de är blockerade genom den svarta listan för spam.
+#
+# Syntaxen är följande:
+# * All text från ett #-tecken till radens slut är en kommentar
+# * Alla icke-tomma rader används som reguljära uttryck för att matcha domännamn i URL:er
+
+ #</pre> <!-- ändra inte den här raden -->',
+ 'spam-blacklisted-email' => 'Svartlistad e-postadress',
+ 'spam-invalid-lines' => 'Följande {{PLURAL:$1|rad|rader}} i svarta listan för spam innehåller inte något giltigt reguljärt uttryck och måste rättas innan sidan sparas:',
+ 'spam-blacklist-desc' => 'Antispamverktyg baserat på reguljära uttryck: [[MediaWiki:Spam-blacklist]] och [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Tamil (தமிழà¯)
+ * @author Karthi.dr
+ * @author மதனாஹரனà¯
+ */
+$messages['ta'] = array(
+ 'spam-blacklisted-email' => 'தடை செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®•à®³à¯',
+ 'spam-blacklisted-email-text' => 'மறà¯à®± பயனரà¯à®•à®³à¯à®•à¯à®•à¯ மினà¯à®©à®žà¯à®šà®²à¯ செயà¯à®¯ இயலாதபடி உஙà¯à®•à®³à¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿ தடை செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
+ 'spam-blacklisted-email-signup' => 'வழஙà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿à®¯à®¾à®©à®¤à¯ இபà¯à®ªà¯‹à®¤à¯ பயனà¯à®ªà®¾à®Ÿà¯à®Ÿà®¿à®²à®¿à®°à¯à®¨à®¤à¯ விலகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®•à¯ கறà¯à®ªà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à®¿à®²à¯à®³à¯à®³à®¤à¯.',
+);
+
+/** Telugu (తెలà±à°—à±)
+ * @author Veeven
+ */
+$messages['te'] = array(
+ 'spam-blacklist' => '
+ # à°“ పేజీకి చేరà±à°šà°¿à°¨ బయటి లింకà±à°²à± గనక à°ˆ జాబితాతో సరిపోలితే వాటిని నిరోధిసà±à°¤à°¾à°‚.
+ # à°ˆ జాబితా à°ˆ వికీకి మాతà±à°°à°®à±‡ సంబంధించినది; మహా నిరోధపౠజాబితాని కూడా చూడండి.
+ # పతà±à°°à°¾à°µà°³à°¿ కొరకౠఇకà±à°•à°¡ చూడండి: https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# Syntax is as follows:
+# * "#" à°…à°¨à±à°¨ à°…à°•à±à°·à°°à°‚ à°¨à±à°‚à°¡à°¿ లైనౠచివరివరకూ ఉనà±à°¨à°¦à°‚తా à°µà±à°¯à°¾à°–à±à°¯
+# * ఖాళీగా లేని à°ªà±à°°à°¤à±€à°²à±ˆà°¨à±‚ URLలలోని హోసà±à°Ÿà± పేరà±à°¨à°¿ మాతà±à°°à°®à±‡ సరిపోలà±à°šà±‡ à°’à°• regex à°¤à±à°¨à°•
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-whitelist' => '
+ #<!-- leave this line exactly as it is --> <pre>
+# à°ˆ జాబితాకి సరిపోలిన బయటి లింకà±à°²à°¨à°¿ *నిరోధించమà±*,
+# అవి నిరోధపౠజాబితాలోని పదà±à°¦à±à°²à°¤à±‹ సరిపోలినా గానీ.
+#
+# ఛందసà±à°¸à± ఇదీ:
+# * "#" à°…à°•à±à°·à°°à°‚ à°¨à±à°‚à°¡à°¿ లైనౠచివరివరకూ à°ªà±à°°à°¤à±€à°¦à±€ à°“ à°µà±à°¯à°¾à°–à±à°¯à±‡
+# * ఖాళీగా లేని à°ªà±à°°à°¤à±€ లైనూ URLలలో హోసà±à°Ÿà± పేరà±à°¨à°¿ సరిపోలà±à°šà±‡ regex à°¤à±à°¨à°•
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-invalid-lines' => 'à°¸à±à°ªà°¾à°®à± నిరోధపౠజాబితాలోని à°•à±à°°à°¿à°‚à°¦ పేరà±à°•à±Šà°¨à±à°¨ {{PLURAL:$1|లైనà±|లైనà±à°²à±}} తపà±à°ªà±à°—à°¾ {{PLURAL:$1|ఉంది|ఉనà±à°¨à°¾à°¯à°¿}}, పేజీని à°­à°¦à±à°°à°ªà°°à°¿à°šà±‡à°®à±à°‚దౠ{{PLURAL:$1|దానà±à°¨à°¿|వాటిని}} సరిదిదà±à°¦à°‚à°¡à°¿:',
+ 'spam-blacklist-desc' => 'Regex-ఆధారిత à°¸à±à°ªà°¾à°®à± నిరోధక పనిమà±à°Ÿà±à°Ÿà±: [[MediaWiki:Spam-blacklist]] మరియౠ[[MediaWiki:Spam-whitelist]]',
+);
+
+/** Tajik (Cyrillic script) (тоҷикӣ)
+ * @author Ibrahim
+ */
+$messages['tg-cyrl'] = array(
+ 'spam-blacklist' => ' # Ðишониҳои URL берунаи ба ин феҳриÑÑ‚ мутобиқатшуда вақте, ки ба Ñаҳифае илова мешаванд,
+ # баÑта хоҳанд шуд.
+ # Ин феҳриÑÑ‚ фақат рӯи ҳамин вики таъÑир мекунад; ба феҳриÑти Ñиёҳи ÑароÑар низ муроҷиат кунед.
+ # Барои муÑтанадот, нигаред ба https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- ин Ñатрро ҳамонгуна, ки ҳаÑÑ‚ раҳо кунед --> <pre>
+#
+ # ДаÑтурот ба ин шакл ҳаÑтанд:
+ # * Ҳама чиз аз аломати "#" то поёни Ñатр ба унвони тавзеҳ ба назар гирифта мешавад
+ # * Ҳар Ñатр аз матн ба унвони Ñк даÑтур regex ба назар гирифта мешавад,
+ # ки фақат бо номи мизбон дар нишонии интернетии URL мутобиқат дода мешавад
+
+ #</pre> <!-- ин Ñатрро ҳамонгуна, ки ҳаÑÑ‚ раҳо кунед -->',
+ 'spam-whitelist' => ' #<!-- ин Ñатрро ҳамонгуна, ки ҳаÑÑ‚ раҳо кунед --> <pre>
+# Ðишониҳои URL берунаи ба ин феҳриÑÑ‚ мутобиқатбуда, баÑта нахоҳанд шуд,
+# ҳатто агар дар феҳриÑти Ñиёҳ қарор дошта бошад.
+#
+# ДаÑтурот ба ин шакл ҳаÑтанд:
+# * Ҳама чиз аз аломати "#" то поёни Ñатр ба унвони тавзеҳ ба назар гирифта мешавад
+# * Ҳар Ñатр аз матн ба унвони Ñк даÑтур regex ба назар гирифта мешавад, ки фақат бо номи мизбон дар
+# нишонии интернетии URL мутобиқат дода мешавад
+ #</pre> <!-- ин Ñатрро ҳамонгуна, ки ҳаÑÑ‚ раҳо кунед -->',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Сатри|Сатрҳои}} зерин дар феҳриÑти Ñиёҳи ҳарзнигорӣ даÑтуроти ғайри миҷозе regular expressions {{PLURAL:$1|аÑÑ‚|ҳаÑтанд}} ва қабл аз захира кардани Ñаҳифа ба иÑлоҳ кардан ниёз {{PLURAL:$1|дорад|доранд}}:',
+ 'spam-blacklist-desc' => 'Ðбзори зидди ҳарзнигорӣ дар аÑоÑи Regex: [[MediaWiki:Spam-blacklist]] ва [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Tajik (Latin script) (tojikī)
+ * @author Liangent
+ */
+$messages['tg-latn'] = array(
+ 'spam-blacklist' => ' # NiÅŸonihoi URL berunai ba in fehrist mutobiqatÅŸuda vaqte, ki ba sahifae ilova meÅŸavand,
+ # basta xohand ÅŸud.
+ # In fehrist faqat rūi hamin viki ta\'sir mekunad; ba fehristi sijohi sarosar niz muroçiat kuned.
+ # Baroi mustanadot, nigared ba https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- in satrro hamonguna, ki hast raho kuned --> <pre>
+#
+ # Dasturot ba in ÅŸakl hastand:
+ # * Hama ciz az alomati "#" to pojoni satr ba unvoni tavzeh ba nazar girifta meÅŸavad
+ # * Har satr az matn ba unvoni jak dastur regex ba nazar girifta meÅŸavad,
+ # ki faqat bo nomi mizbon dar niÅŸoniji internetiji URL mutobiqat doda meÅŸavad
+
+ #</pre> <!-- in satrro hamonguna, ki hast raho kuned -->',
+ 'spam-whitelist' => ' #<!-- in satrro hamonguna, ki hast raho kuned --> <pre>
+# NiÅŸonihoi URL berunai ba in fehrist mutobiqatbuda, basta naxohand ÅŸud,
+# hatto agar dar fehristi sijoh qaror doÅŸta boÅŸad.
+#
+# Dasturot ba in ÅŸakl hastand:
+# * Hama ciz az alomati "#" to pojoni satr ba unvoni tavzeh ba nazar girifta meÅŸavad
+# * Har satr az matn ba unvoni jak dastur regex ba nazar girifta meÅŸavad, ki faqat bo nomi mizbon dar
+# niÅŸoniji internetiji URL mutobiqat doda meÅŸavad
+ #</pre> <!-- in satrro hamonguna, ki hast raho kuned -->',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Satri|Satrhoi}} zerin dar fehristi sijohi harznigorī dasturoti ƣajri miçoze regular expressions {{PLURAL:$1|ast|hastand}} va qabl az zaxira kardani sahifa ba isloh kardan nijoz {{PLURAL:$1|dorad|dorand}}:',
+ 'spam-blacklist-desc' => 'Abzori ziddi harznigorī dar asosi Regex: [[MediaWiki:Spam-blacklist]] va [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Turkmen (Türkmençe)
+ * @author Hanberke
+ */
+$messages['tk'] = array(
+ 'spam-invalid-lines' => 'Aşakdaky spam gara sanawynyň {{PLURAL:$1|setiri|setiri}} nädogry regulýar {{PLURAL:$1|aňlatmadyr|aňlatmadyr}} we sahypa ýazdyrylmanka düzedilmelidir:',
+ 'spam-blacklist-desc' => 'Regulýar aňlatmalar esasynda anti-spam guraly: [[MediaWiki:Spam-blacklist]] we [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Tagalog (Tagalog)
+ * @author AnakngAraw
+ */
+$messages['tl'] = array(
+ 'spam-blacklist' => " # Ang panlabas na mga URL na tumutugma sa talaang ito ay hahadlangan/haharangin kapag idinagdag sa isang pahina.
+ # Nakakaapekto lamang ang talaang ito sa wiking ito; sumangguni rin sa pandaigdigang talaan ng pinagbabawalan.
+ # Para sa kasulatan tingnan ang https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# Ang palaugnayan ay ayon sa mga sumusunod:
+# * Lahat ng bagay mula sa isang \"#\" na panitik hanggang sa wakas ng isang guhit/hanay ay isang puna (kumento)
+# * Bawat hindi/walang patlang na guhit/hanay ay isang piraso ng karaniwang pagsasaad (''regex'') na tutugma lamang sa mga tagapagpasinaya sa loob ng mga URL
+
+ #</pre> <!-- leave this line exactly as it is -->",
+ 'spam-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
+# Ang panlabas na mga URL na tumutugma sa talaang ito ay *hindi* hahadlangan kahit na sila ay
+# hinarang ng mga ipinasok (entrada) sa talaan ng pinagbabawalan.
+#
+# Ang palaugnayan ay ayon sa mga sumusunod:
+# * Lahat ng bagay mula sa isang \"#\" na panitik hanggang sa wakas ng isang guhit/hanay ay isang puna (kumento)
+# * Bawat hindi/walang patlang na guhit/hanay ay isang piraso ng karaniwang pagsasaad (''regex'') na tutugma lamang sa mga tagapagpasinaya sa loob ng mga URL
+
+ #</pre> <!-- leave this line exactly as it is -->",
+ 'email-blacklist' => " # Ang mga tirahan ng e-liham na tumutugma sa talaang ito ay hahadlangan mula sa pagpaparehistro o pagpapadala ng mga e-liham.
+ # Nakakaapekto lamang ang talaang ito sa wiking ito; sumangguni rin sa pandaigdigang talaan ng pinagbabawalan.
+ # Para sa kasulatan tingnan ang https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# Ang palaugnayan ay ayon sa mga sumusunod:
+# * Lahat ng bagay mula sa isang panitik na \"#\" magpahanggang sa wakas ng isang guhit ay isang puna
+# * Bawat guhit na mayroong laman ay isang piraso ng karaniwang pagsasaad (''regex'') na tutugma lamang sa mga tagapagpasinaya sa loob ng mga tirahan ng e-liham
+
+ #</pre> <!-- leave this line exactly as it is -->",
+ 'email-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
+# Ang mga tirahan ng e-liham na tumutugma sa listahang ito ay *hindi* haharangin kahit na gawin nila ito
+# ay naharang ng mga lahot sa talaan ng pinagbabawalan.
+#
+ #</pre> <!-- leave this line exactly as it is -->
+# Ang palaugnayan ay ang mga sumusunod:
+# * Ang lahat ng mga bagay magmula sa isang panitik na \"#\" magpahanggang sa wakas ng guhit ay isang puna
+# * Bawat linya na mayroong laman ay isang piraso ng karaniwang pagsasaad (''regex'') na tutugma lamang sa mga tagapagpasinayang nasa loob ng mga tirahan ng e-liham",
+ 'spam-blacklisted-email' => 'Pinagbabawalang mga tirahan ng e-liham',
+ 'spam-blacklisted-email-text' => 'Kasalukuyang pinagbabawalan ang iyong tirahan ng e-liham na makapagpadala ng mga e-liham papunta sa ibang mga tagagamit.',
+ 'spam-blacklisted-email-signup' => 'Kasalukuyang ipinagbabawal ang paggamit ng ibinigay na tirahan ng e-liham.',
+ 'spam-invalid-lines' => 'Ang sumusunod na {{PLURAL:$1|isang hanay/guhit|mga hanay/guhit}} ng talaan ng pinagbabawalang "manlulusob" (\'\'spam\'\') ay hindi tanggap na karaniwang {{PLURAL:$1|pagsasaad|mga pagsasaad}} at {{PLURAL:$1|kinakailangang|kinakailangang}} maitama muna bago sagipin ang pahina:',
+ 'spam-blacklist-desc' => "Kasangkapang panlaban sa \"manlulusob\" (''spam'') na nakabatay sa karaniwang pagsasaad (''regex''): [[MediaWiki:Spam-blacklist]] at [[MediaWiki:Spam-whitelist]]",
+);
+
+/** Turkish (Türkçe)
+ * @author Joseph
+ */
+$messages['tr'] = array(
+ 'spam-blacklist' => ' # Bu listeyle eşleşen dış bağlantılar, bir sayfaya eklendiğinde engellenecektir.
+ # Bu liste sadece bu vikiyi etkiler; ayrıca küresel karalisteye de bakın.
+ # Dokümantasyon için https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- bu satırı olduğu gibi bırakın --> <pre>
+#
+# Sözdizimi aşağıdaki gibidir:
+# * "#" karakterinden satır sonuna kadar her şey bir yorumdur
+# * Her boş olmayan satır, sadece URLlerin içindeki sunucularla eşleşen regex parçasıdır
+
+ #</pre> <!-- bu satırı olduğu gibi bırakın -->',
+ 'spam-whitelist' => ' #<!-- bu satırı olduğu gibi bırakın --> <pre>
+# Bu listeyle eşlenen dış bağlantılar *engellenmeyecektir*,
+# karaliste girdileriyle engellenmiÅŸ olsalar bile.
+#
+# Sözdizimi aşağıdaki gibidir:
+# * "#" karakterinden satır sonuna kadar her şey bir yorumdur
+# * Her boş olmayan satır, sadece URLlerin içindeki sunucularla eşleşen regex parçasıdır
+
+ #</pre> <!--bu satırı olduğu gibi bırakın -->',
+ 'spam-invalid-lines' => 'Şu spam karaliste {{PLURAL:$1|satırı|satırları}} geçersiz düzenli {{PLURAL:$1|tanımdır|tanımlardır}} ve sayfayı kaydetmeden düzeltilmesi gerekmektedir:',
+ 'spam-blacklist-desc' => 'Regex-tabanlı anti-spam aracı: [[MediaWiki:Spam-blacklist]] ve [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Ukrainian (українÑька)
+ * @author AS
+ * @author Ahonc
+ * @author AtUkr
+ * @author Base
+ * @author Ðта
+ */
+$messages['uk'] = array(
+ 'spam-blacklist' => '# Зовнішні поÑиланнÑ, що відповідають цьому ÑпиÑку, будуть заборонені Ð´Ð»Ñ Ð²Ð½ÐµÑÐµÐ½Ð½Ñ Ð½Ð° Ñтоірнки.
+ # Цей ÑпиÑок діє лише Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— вікі, Ñ–Ñнує також загальний чорний ÑпиÑок.
+ # Докладніше на Ñторінці https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- не змінюйте цей Ñ€Ñдок --> <pre>
+#
+# СинтакÑиÑ:
+# * Ð’Ñе, починаючи із Ñимволу "#" Ñ– до ÐºÑ–Ð½Ñ†Ñ Ñ€Ñдка, вважаєтьÑÑ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€ÐµÐ¼
+# * Кожен непорожній Ñ€Ñдок Ñ” фрагментом регулÑрного виразу, Ñкий заÑтоÑовуєтьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ до вузла в URL
+
+ #</pre> <!-- не змінюйте цей Ñ€Ñдок -->',
+ 'spam-whitelist' => ' #<!-- не змінюйте це Ñ€Ñдок --> <pre>
+# Зовнішні поÑиланнÑ, що відповідають цьому ÑпиÑку, *не* будуть блокуватиÑÑ, навіть Ñкщо вони потрапили до чорного ÑпиÑку.
+#
+# СинтакÑиÑ:
+# * УÑе, починаючи з Ñимволу "#" Ñ– до ÐºÑ–Ð½Ñ†Ñ Ñ€Ñдка, вважаєтьÑÑ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€ÐµÐ¼
+# * Кожен непорожній Ñ€Ñдок Ñ” фрагментом регулÑрного виразу, Ñкий заÑтоÑовуєтьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ до вузла в URL
+
+ #</pre> <!-- не изменÑйте Ñту Ñтроку -->',
+ 'email-blacklist' => '#<!-- не змінюйте цей Ñ€Ñдок --> <pre>
+# ÐдреÑи електронної пошти, що відповідають цьому ÑпиÑку, будуть заблоковані від реєÑтрації або надÑÐ¸Ð»Ð°Ð½Ð½Ñ ÐµÐ». пошти.
+# Цей ÑпиÑок діє тільки Ð´Ð»Ñ Ð´Ð°Ð½Ð¾Ñ— вікі, Ñ–Ñнує також загальний чорний ÑпиÑок.
+# Докладніше на Ñторінці https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+# СинтакÑиÑ:
+# * Ð’Ñе, починаючи з Ñимволу "#" Ñ– до ÐºÑ–Ð½Ñ†Ñ Ñ€Ñдка, вважаєтьÑÑ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€ÐµÐ¼
+# * Кожен непорожній Ñ€Ñдок Ñ” фрагментом регулÑрного виразу, вживаного тільки до вузлів уÑередині адреÑи ел. пошти
+
+#</pre> <!-- не змінюйте цей Ñ€Ñдок -->',
+ 'email-whitelist' => '#<!-- не змінюйте цей Ñ€Ñдок --> <pre>
+# ÐдреÑи електронної пошти, що відповідають цьому ÑпиÑку, ÐЕ БУДУТЬ заблоковані
+# навіть Ñкщо вони занеÑені до чорного ÑпиÑку.
+#
+#</pre> <!-- не змінюйте цей Ñ€Ñдок -->
+# СинтакÑиÑ:
+# * Ð’Ñе, починаючи з Ñимволу "#" Ñ– до ÐºÑ–Ð½Ñ†Ñ Ñ€Ñдка, вважаєтьÑÑ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€ÐµÐ¼
+# * Кожен непорожній Ñ€Ñдок Ñ” фрагментом регулÑрного виразу, вживаного тільки до вузлів уÑередині адреÑи ел. пошти',
+ 'spam-blacklisted-email' => 'ÐдреÑа електронної пошти з чорного ÑпиÑку',
+ 'spam-blacklisted-email-text' => 'Ваша адреÑа електронної пошти в даний Ñ‡Ð°Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑŒÑÑ Ð² чорному ÑпиÑку, тому ви не можете надÑилати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ–Ð½ÑˆÐ¸Ð¼ кориÑтувачам.',
+ 'spam-blacklisted-email-signup' => 'Вказана Вами адреÑа електронної пошти наразі занеÑена до чорного ÑпиÑку Ñ– не може бути викориÑтаною.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|ÐаÑтупний Ñ€Ñдок із чорного ÑпиÑку поÑилань міÑтить помилковий регулÑрний вираз Ñ– його треба виправити|ÐаÑтупні Ñ€Ñдки із чорного ÑпиÑку поÑилань міÑÑ‚ÑÑ‚ÑŒ помилкові регулÑрні вирази Ñ– Ñ—Ñ… треба виправити}} перед збереженнÑм:',
+ 'spam-blacklist-desc' => 'ПротиÑпамовий заÑіб, що базуєтьÑÑ Ð½Ð° регулÑрних виразах: [[MediaWiki:Spam-blacklist]] та [[MediaWiki:Spam-whitelist]]',
+);
+
+/** vèneto (vèneto)
+ * @author Candalua
+ * @author GatoSelvadego
+ */
+$messages['vec'] = array(
+ 'spam-blacklist' => ' # Le URL esterne al sito che corisponde a la lista seguente le vegnarà blocà.
+ # La lista la xe valida solo par sto sito qua; far riferimento anca a la blacklist globale.
+ # Par la documentazion vardar https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- no sta modificar in alcun modo sta riga --> <pre>
+# La sintassi la xe la seguente:
+# * Tuto quel che segue un caràtere "#" el xe un comento, fin a la fine de la riga
+# * Tute le righe mìa vode le xe framenti de espressioni regolari che se àplica al solo nome de l\'host ne le URL
+ #</pre> <!-- no sta modificar in alcun modo sta riga -->',
+ 'spam-whitelist' => ' #<!-- no sta modificar in alcun modo sta riga --> <pre>
+# Le URL esterne al sito che corisponde a la lista seguente *no* le vegnarà
+# mìa blocà, anca nel caso che le corisponda a de le voçi de la lista nera
+#
+# La sintassi la xe la seguente:
+# * Tuto quel che segue un caràtere "#" el xe un comento, fin a la fine de la riga
+# * Tute le righe mìa vode le xe framenti de espressioni regolari che se àplica al solo nome de l\'host ne le URL
+
+ #</pre> <!-- no sta modificar in alcun modo sta riga -->',
+ 'email-blacklist' => ' # I indirisi e-mail che corisponde a ła lista seguente i sarà blocai, nó sarà posibiłe salvar o inviar e-mail.
+ # Åa lista Å‚a xe vaÅ‚ida soÅ‚o che pa\' sta wiki; far riferimento anca a Å‚a blacklist globaÅ‚e.
+ # Pa\' Å‚a documentasion se varde https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ # <!-- nó modifegar sta linea --> <pre>
+# Åa sintasi Å‚a xe Å‚a seguente:
+# * Tuto chel che xe conprexo intrà un caratere "#" e ła fine de ła riga el xe un comento
+# * Tute łe righe nó vode i xe tochi de espresion regołari che se aplica soło che al nome del host de i indirisi e-mail
+ #</pre> <!-- nó modifegar sta linea -->',
+ 'email-whitelist' => ' #<!-- nó modifegar sta linea --> <pre>
+# I indirisi e-mail conprexi in sta lista *nó* i sarà blocai anca se i dovaria
+# eser stai blocai da i elementi prexenti inte Å‚a lista nera.
+#
+ #</pre> <!-- nó modifegar sta linea -->
+# Åa sintasi Å‚a xe Å‚a seguente:
+# * Tuto chel che xe conprexo intrà un caratere "#" e ła fine de ła riga el xe un comento
+# * Tute łe righe nó vode i xe tochi de espresion regołari che se aplica soło che al nome del host de i indirisi e-mail',
+ 'spam-blacklisted-email' => 'Indiriso de posta eletronega blocà',
+ 'spam-blacklisted-email-text' => "El to indiriso de posta eletronega el xe atualmente inte Å‚a lista nera par 'l invio de e-mail verso altri utenti.",
+ 'spam-blacklisted-email-signup' => 'El indiriso de posta eletronega indicà el xe atualmente inte ła lista nera.',
+ 'spam-invalid-lines' => "{{PLURAL:$1|La seguente riga|Le seguenti righe}} de la lista nera del spam {{PLURAL:$1|no la xe na espression regolare valida|no le xe espressioni regolari valide}}; se prega de corègiar {{PLURAL:$1|l'eror|i erori}} prima de salvar la pagina.",
+ 'spam-blacklist-desc' => 'Strumento antispam basà su le espressioni regolari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Vietnamese (Tiếng Việt)
+ * @author Minh Nguyen
+ */
+$messages['vi'] = array(
+ 'spam-blacklist' => ' # Các địa chỉ URL ngoài trùng với một khoản trong danh sách này bị cấm không được thêm vào trang nào.
+ # Danh sách này chỉ có hiệu lá»±c ở wiki này; hãy xem thêm “danh sách Ä‘en toàn cầuâ€.
+ # Có tài liệu hướng dẫn tại https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# Cú pháp:
+# * Các lá»i ghi chú bắt đầu vá»›i ký tá»± “#†và tiếp tục cho đến cuối dòng.
+# * Các dòng không để trống là một mảnh biểu thức chính quy, nó chỉ trùng với tên máy chủ trong địa chỉ URL.
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'spam-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Các địa chỉ URL ngoài trùng với một khoản trong danh sách này *không* bị cấm, dù có nó trong danh sách đen.
+#
+# Cú pháp:
+# * Các lá»i ghi chú bắt đầu vá»›i ký tá»± “#†và tiếp tục cho đến cuối dòng.
+# * Các dòng không để trống là một mảnh biểu thức chính quy, nó chỉ trùng với tên máy chủ trong địa chỉ URL.
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'email-blacklist' => ' # Các địa chỉ thư điện tử trùng với danh sách này bị cấm không được đăng ký hoặc gửi thư điện tử.
+ # Danh sách này chỉ có hiệu lá»±c ở wiki này; hãy xem thêm “danh sách Ä‘en toàn cầuâ€.
+ # Có tài liệu hướng dẫn tại https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# Cú pháp:
+# * Các lá»i ghi chú bắt đầu vá»›i ký tá»± “#†và tiếp tục cho đến cuối dòng.
+# * Các dòng không để trống là một mảnh biểu thức chính quy, nó chỉ trùng với tên máy chủ trong địa chỉ thư điện tử.
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'email-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Các địa chỉ thư điện tử trùng với danh sách này *không* bị cấm, dù có nó trong danh sách đen.
+#
+ #</pre> <!-- leave this line exactly as it is -->
+# Cú pháp:
+# * Các lá»i ghi chú bắt đầu vá»›i ký tá»± “#†và tiếp tục cho đến cuối dòng.
+# * Các dòng không để trống là một mảnh biểu thức chính quy, nó chỉ trùng với tên máy chủ trong địa chỉ thư điện tử.',
+ 'spam-blacklisted-email' => 'Äịa chỉ thÆ° Ä‘iện tá»­ bị Ä‘Æ°a vào danh sách Ä‘en',
+ 'spam-blacklisted-email-text' => 'Äịa chỉ thÆ° Ä‘iện tá»­ của bạn đã được Ä‘Æ°a vào danh sách Ä‘en nên bị cấm không được gá»­i thÆ° Ä‘iện tá»­ cho ngÆ°á»i dùng khác.',
+ 'spam-blacklisted-email-signup' => 'Äịa chỉ thÆ° Ä‘iện tá»­ được cung cấp đã được Ä‘Æ°a vào danh sách Ä‘en nên bị cấm không được sá»­ dụng.',
+ 'spam-invalid-lines' => '{{PLURAL:$1|Dòng|Những dòng}} sau đây trong danh sách đen vỠspam không hợp lệ; xin hãy sửa chữa {{PLURAL:$1|nó|chúng}} để tuân theo cú pháp biểu thức chính quy trước khi lưu trang:',
+ 'spam-blacklist-desc' => 'Công cụ dùng biểu thức chính quy để chống spam: [[MediaWiki:Spam-blacklist]] và [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Cantonese (粵語)
+ */
+$messages['yue'] = array(
+ 'spam-blacklist' => ' # åŒå‘¢å€‹è¡¨åˆç¬¦å˜…外部 URL 當加入嗰陣會被å°éŽ–。
+ # 呢個表åªä¿‚會影響到呢個wiki;請åŒæ™‚åƒé–±å…¨åŸŸé»‘å單。
+ # è¦ç‡è¨»è§£è«‹ç‡ https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- 請完全噉留番呢行 --> <pre>
+#
+# 語法好似下é¢å™‰:
+# * æ¯ä¸€å€‹ç”± "#" 字元開頭嘅行,到最尾係一個註解
+# * æ¯å€‹éžç©ºç™½è¡Œä¿‚一個標準表示å¼ç¢Žç‰‡ï¼Œåªä¿‚會åŒå…¥é¢å˜…URL端核å°
+
+ #</pre> <!-- 請完全噉留番呢行 -->',
+ 'spam-whitelist' => ' #<!-- 請完全噉留番呢行 --> <pre>
+# åŒå‘¢å€‹è¡¨åˆç¬¦å˜…外部 URL ,å³ä½¿éŸ¿é»‘å單項目度å°éŽ–,
+# 都*唔會*被å°éŽ–。
+#
+# 語法好似下é¢å™‰:
+# * æ¯ä¸€å€‹ç”± "#" 字元開頭嘅行,到最尾係一個註解
+# * æ¯å€‹éžç©ºç™½è¡Œä¿‚一個標準表示å¼ç¢Žç‰‡ï¼Œåªä¿‚會åŒå…¥é¢å˜…URL端核å°
+
+ #</pre> <!-- 請完全噉留番呢行 -->',
+ 'spam-invalid-lines' => '下é¢éŸ¿çŒæ°´é»‘å單嘅{{PLURAL:$1|一行|多行}}有無效嘅表示å¼ï¼Œè«‹éŸ¿ä¿å­˜å‘¢ç‰ˆä¹‹å‰å…ˆå°‡{{PLURAL:$1|ä½¢|佢哋}}修正:',
+ 'spam-blacklist-desc' => '以正è¦è¡¨é”å¼ç‚ºæœ¬å˜…防çŒæ°´å·¥å…·: [[MediaWiki:Spam-blacklist]] åŒ [[MediaWiki:Spam-whitelist]]',
+);
+
+/** Simplified Chinese (中文(简体)‎)
+ * @author Hzy980512
+ * @author Linforest
+ * @author Mys 721tx
+ * @author PhiLiP
+ * @author Supaiku
+ */
+$messages['zh-hans'] = array(
+ 'spam-blacklist' => ' # 跟这个表åˆç¬¦çš„外部 URL 当加入时会被å°é”。
+ # 这个表åªæ˜¯ä¼šå½±å“到这个wiki;请åŒæ—¶å‚阅全域黑åå•ã€‚
+ # è¦å‚看注解请看 https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- 请完全地留下这行 --> <pre>
+#
+# 语法åƒä¸‹é¢è¿™æ ·:
+# * æ¯ä¸€ä¸ªç”± "#" 字元开头的行,到结尾是一个注解
+# * æ¯ä¸ªéžç©ºç™½è¡Œæ˜¯ä¸€ä¸ªæ ‡å‡†è¡¨ç¤ºå¼ç¢Žç‰‡ï¼Œåªæ˜¯è·Ÿé‡Œé¢çš„URL端核对
+
+ #</pre> <!-- 请完全地留下这行 -->',
+ 'spam-whitelist' => ' #<!-- 请完整地ä¿ç•™æ­¤è¡Œ --> <pre>
+# 与本列表匹é…的外部链接,å³ä½¿å·²è¢«é»‘åå•çš„规则ç¦æ­¢
+# 也*ä¸ä¼š*被å°é”。
+#
+# 语法如下:
+# * 由“#â€å­—符开头的æ¯è¡Œå‡ä¸ºæ³¨é‡Š
+# * éžç©ºç™½çš„æ¯è¡Œåˆ™æ˜¯æ­£åˆ™è¡¨è¾¾å¼ç‰‡æ®µï¼Œå°†åªä¸Žå†…å«è¯¥URL的链接相匹é…
+
+ #</pre> <!-- 请完整地ä¿ç•™æ­¤è¡Œ -->',
+ 'email-blacklist' => ' # 将会把那些与该列表相匹é…的电å­é‚®ä»¶åœ°å€ä»Žæ³¨å†Œæˆ–å‘生电å­é‚®ä»¶åœ°å€å½“中å±è”½æŽ‰ã€‚
+ # 该列表仅仅影å“本维基站点;请å¦è§å…¨å±€é»‘åå•ã€‚
+ # 有关文档请å‚è§ https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# 语法如下:
+# * 从字符"#"开始直至行尾的所有内容称为一æ¡æ³¨é‡Š
+# * æ¯ä¸ªéžç©ºç™½è¡Œéƒ½æ˜¯ä¸€ä¸ªregex片段,它将仅仅匹é…电å­é‚®ä»¶åœ°å€å½“中的主机
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'email-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# 在此页é¢ä¸­åˆ—出的电å­é‚®ä»¶åœ°å€å³ä¾¿åŒ¹é…黑åå•ä¸­æ¡ç›®ä¹Ÿä¸ä¼šè¢«å°é”。
+#
+ #</pre> <!-- leave this line exactly as it is -->
+# æ ¼å¼å¦‚下:
+# *注释以#开头并延续到一行末ä½ã€‚
+# *éžç©ºç™½è¡Œéƒ½æ˜¯ä¸€ä¸ªåŒ¹é…电å­é‚®ç®±åœ°å€ä¸­ä¸»æœºåœ°å€çš„正则表达å¼ç‰‡æ®µã€‚',
+ 'spam-blacklisted-email' => '黑åå•ä¸­çš„电邮地å€',
+ 'spam-blacklisted-email-text' => '您的电å­é‚®ä»¶åœ°å€ç›®å‰å·²è¢«åˆ—入黑åå•ä»¥é˜²æ­¢æ‚¨å‘é€é‚®ä»¶ã€‚',
+ 'spam-blacklisted-email-signup' => '所给电邮地å€å·²è¢«åˆ—入黑åå•ã€‚',
+ 'spam-invalid-lines' => '下列垃圾链接黑åå•æœ‰{{PLURAL:$1|一行|多行}}å«æœ‰æ— æ•ˆçš„正则表示å¼ï¼Œè¯·åœ¨ä¿å­˜è¯¥é¡µå‰ä¿®æ­£ä¹‹ï¼š',
+ 'spam-blacklist-desc' => '基于正则表达å¼çš„å垃圾链接工具:[[MediaWiki:Spam-blacklist]]å’Œ[[MediaWiki:Spam-whitelist]]',
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Mark85296341
+ * @author Oapbtommy
+ * @author Waihorace
+ */
+$messages['zh-hant'] = array(
+ 'spam-blacklist' => ' # 跟這個表符åˆçš„外部 URL 當加入時會被å°éŽ–。
+ # 這個表åªæ˜¯æœƒå½±éŸ¿åˆ°é€™å€‹ wiki;請åŒæ™‚åƒé–±å…¨åŸŸé»‘å單。
+ # è¦åƒçœ‹è¨»è§£è«‹çœ‹ https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- 請完全地留下這行 --> <pre>
+#
+# 語法åƒä¸‹é¢é€™æ¨£:
+# * æ¯ä¸€å€‹ç”±ã€Œ#ã€å­—元開頭的行,到çµå°¾æ˜¯ä¸€å€‹è¨»è§£
+# * æ¯å€‹éžç©ºç™½è¡Œæ˜¯ä¸€å€‹æ¨™æº–表示å¼ç¢Žç‰‡ï¼Œåªæ˜¯è·Ÿè£¡é¢çš„ URL 端核å°
+
+ #</pre> <!-- 請完全地留下這行 -->',
+ 'spam-whitelist' => ' #<!-- 請完全地留下這行 --> <pre>
+# 跟這個表符åˆçš„外部 URL ,å³ä½¿åœ¨é»‘å單項目中å°éŽ–,
+# 都*ä¸æœƒ*被å°éŽ–。
+#
+# 語法åƒä¸‹é¢é€™æ¨£:
+# * æ¯ä¸€å€‹ç”±ã€Œ#ã€å­—元開頭的行,到çµå°¾æ˜¯ä¸€å€‹è¨»è§£
+# * æ¯å€‹éžç©ºç™½è¡Œæ˜¯ä¸€å€‹æ¨™æº–表示å¼ç¢Žç‰‡ï¼Œåªæ˜¯è·Ÿè£¡é¢çš„ URL 端核å°
+
+ #</pre> <!-- 請完全地留下這行 -->',
+ 'email-blacklist' => ' # 與本列表匹é…的電郵地å€å°‡è¢«ç¦æ­¢è¨»å†Šæˆ–發é€é›»éƒµ
+ # 本列表åªå½±éŸ¿æœ¬ç«™ï¼›å¦è¦‹å…¨åŸŸé»‘å單。
+ # 說明文檔在 https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+ #<!-- leave this line exactly as it is --> <pre>
+#
+# 語法如下:
+# * 以字符"#"開始直至行尾的所有内容稱為一æ¢è¨»è…³
+# * æ¯å€‹éžç©ºç™½è¡Œéƒ½æ˜¯ä¸€å€‹regex片段,它將åªåŒ¹é…é›»å­éƒµä»¶çš„主機
+
+ #</pre> <!-- leave this line exactly as it is -->',
+ 'email-whitelist' => '#<!-- leave this line exactly as it is --> <pre>
+ # 和此列表相é…çš„Email 的地å€*ä¸æœƒ*被阻止,å³ä½¿å®ƒè¢«åˆ—入黑åå–®
+ #
+ #</pre> <!-- leave this line exactly as it is -->
+ # 代號如下所示:
+ # * 一切從"#"字符到行末尾是註解
+ # * æ¯å€‹éžç©ºç™½è¡Œæ˜¯ä¸€å€‹ regex 部份,將åªåŒ¹é…電郵地å€çš„主機部份',
+ 'spam-blacklisted-email' => '被列入黑å單的電å­éƒµä»¶åœ°å€',
+ 'spam-blacklisted-email-text' => '您的電郵地å€ç›®å‰å·²åˆ—入黑å單以防止您發é€é›»éƒµäºˆå…¶ä»–用戶。',
+ 'spam-blacklisted-email-signup' => '此電郵地å€ç›®å‰è¢«ç¦æ­¢ä½¿ç”¨ã€‚',
+ 'spam-invalid-lines' => '以下在çŒæ°´é»‘å單的{{PLURAL:$1|一行|多行}}有無效的表示å¼ï¼Œè«‹åœ¨å„²å­˜é€™é å‰å…ˆå°‡{{PLURAL:$1|它|它們}}修正:',
+ 'spam-blacklist-desc' => '以正則表é”å¼ç‚ºæœ¬çš„防çŒæ°´å·¥å…·ï¼š[[MediaWiki:Spam-blacklist]] 與 [[MediaWiki:Spam-whitelist]]',
+);
diff --git a/extensions/SpamBlacklist/SpamBlacklist.php b/extensions/SpamBlacklist/SpamBlacklist.php
new file mode 100644
index 00000000..f3e27f3c
--- /dev/null
+++ b/extensions/SpamBlacklist/SpamBlacklist.php
@@ -0,0 +1,47 @@
+<?php
+
+# Loader for spam blacklist feature
+# Include this from LocalSettings.php
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ exit;
+}
+
+$wgExtensionCredits['antispam'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'SpamBlacklist',
+ 'author' => array( 'Tim Starling', 'John Du Hart' ),
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:SpamBlacklist',
+ 'descriptionmsg' => 'spam-blacklist-desc',
+);
+
+$dir = __DIR__ . '/';
+$wgExtensionMessagesFiles['SpamBlackList'] = $dir . 'SpamBlacklist.i18n.php';
+
+/**
+ * Array of settings for blacklist classes
+ */
+$wgBlacklistSettings = array();
+
+/**
+ * @deprecated
+ */
+$wgSpamBlacklistFiles =& $wgBlacklistSettings['spam']['files'];
+
+/**
+ * @deprecated
+ */
+$wgSpamBlacklistSettings =& $wgBlacklistSettings['spam'];
+
+$wgHooks['EditFilterMerged'][] = 'SpamBlacklistHooks::filterMerged';
+$wgHooks['APIEditBeforeSave'][] = 'SpamBlacklistHooks::filterAPIEditBeforeSave';
+$wgHooks['EditFilter'][] = 'SpamBlacklistHooks::validate';
+$wgHooks['ArticleSaveComplete'][] = 'SpamBlacklistHooks::articleSave';
+$wgHooks['UserCanSendEmail'][] = 'SpamBlacklistHooks::userCanSendEmail';
+$wgHooks['AbortNewAccount'][] = 'SpamBlacklistHooks::abortNewAccount';
+
+$wgAutoloadClasses['BaseBlacklist'] = $dir . 'BaseBlacklist.php';
+$wgAutoloadClasses['EmailBlacklist'] = $dir . 'EmailBlacklist.php';
+$wgAutoloadClasses['SpamBlacklistHooks'] = $dir . 'SpamBlacklistHooks.php';
+$wgAutoloadClasses['SpamBlacklist'] = $dir . 'SpamBlacklist_body.php';
+$wgAutoloadClasses['SpamRegexBatch'] = $dir . 'SpamRegexBatch.php';
diff --git a/extensions/SpamBlacklist/SpamBlacklistHooks.php b/extensions/SpamBlacklist/SpamBlacklistHooks.php
new file mode 100644
index 00000000..530df16a
--- /dev/null
+++ b/extensions/SpamBlacklist/SpamBlacklistHooks.php
@@ -0,0 +1,163 @@
+<?php
+
+/**
+ * Hooks for the spam blacklist extension
+ */
+class SpamBlacklistHooks {
+ /**
+ * Hook function for EditFilterMerged
+ *
+ * @param $editPage EditPage
+ * @param $text string
+ * @param $hookErr string
+ * @param $editSummary string
+ * @return bool
+ */
+ static function filterMerged( $editPage, $text, &$hookErr, $editSummary ) {
+ global $wgTitle;
+ if( is_null( $wgTitle ) ) {
+ # API mode
+ # wfSpamBlacklistFilterAPIEditBeforeSave already checked the blacklist
+ return true;
+ }
+
+ $spamObj = BaseBlacklist::getInstance( 'spam' );
+ $title = $editPage->mArticle->getTitle();
+ $ret = $spamObj->filter( $title, $text, '', $editSummary, $editPage );
+ if ( $ret !== false ) {
+ $editPage->spamPageWithContent( $ret );
+ }
+ // Return convention for hooks is the inverse of $wgFilterCallback
+ return ( $ret === false );
+ }
+
+ /**
+ * Hook function for APIEditBeforeSave
+ *
+ * @param $editPage EditPage
+ * @param $text string
+ * @param $resultArr array
+ * @return bool
+ */
+ static function filterAPIEditBeforeSave( $editPage, $text, &$resultArr ) {
+ $spamObj = BaseBlacklist::getInstance( 'spam' );
+ $title = $editPage->mArticle->getTitle();
+ $ret = $spamObj->filter( $title, $text, '', '', $editPage );
+ if ( $ret!==false ) {
+ $resultArr['spamblacklist'] = implode( '|', $ret );
+ }
+ // Return convention for hooks is the inverse of $wgFilterCallback
+ return ( $ret === false );
+ }
+
+ /**
+ * Verify that the user can send emails
+ *
+ * @param $user User
+ * @param $hookErr array
+ * @return bool
+ */
+ public static function userCanSendEmail( &$user, &$hookErr ) {
+ /** @var $blacklist EmailBlacklist */
+ $blacklist = BaseBlacklist::getInstance( 'email' );
+ if ( $blacklist->checkUser( $user ) ) {
+ return true;
+ }
+
+ $hookErr = array( 'spam-blacklisted-email', 'spam-blacklisted-email-text', null );
+
+ return false;
+ }
+
+ /**
+ * Processes new accounts for valid email addresses
+ *
+ * @param $user User
+ * @param $abortError
+ * @return bool
+ */
+ public static function abortNewAccount( $user, &$abortError ) {
+ /** @var $blacklist EmailBlacklist */
+ $blacklist = BaseBlacklist::getInstance( 'email' );
+ if ( $blacklist->checkUser( $user ) ) {
+ return true;
+ }
+
+ $abortError = wfMessage( 'spam-blacklisted-email-signup' )->escaped();
+ return false;
+ }
+
+ /**
+ * Hook function for EditFilter
+ * Confirm that a local blacklist page being saved is valid,
+ * and toss back a warning to the user if it isn't.
+ *
+ * @param $editPage EditPage
+ * @param $text string
+ * @param $section string
+ * @param $hookError string
+ * @return bool
+ */
+ static function validate( $editPage, $text, $section, &$hookError ) {
+ $thisPageName = $editPage->mTitle->getPrefixedDBkey();
+
+ if( !BaseBlacklist::isLocalSource( $editPage->mTitle ) ) {
+ wfDebugLog( 'SpamBlacklist', "Spam blacklist validator: [[$thisPageName]] not a local blacklist\n" );
+ return true;
+ }
+
+ $type = BaseBlacklist::getTypeFromTitle( $editPage->mTitle );
+ if ( $type === false ) {
+ return true;
+ }
+
+ $lines = explode( "\n", $text );
+
+ $badLines = SpamRegexBatch::getBadLines( $lines, BaseBlacklist::getInstance( $type ) );
+ if( $badLines ) {
+ wfDebugLog( 'SpamBlacklist', "Spam blacklist validator: [[$thisPageName]] given invalid input lines: " .
+ implode( ', ', $badLines ) . "\n" );
+
+ $badList = "*<code>" .
+ implode( "</code>\n*<code>",
+ array_map( 'wfEscapeWikiText', $badLines ) ) .
+ "</code>\n";
+ $hookError =
+ "<div class='errorbox'>" .
+ wfMessage( 'spam-invalid-lines' )->numParams( $badLines )->text() . "<br />" .
+ $badList .
+ "</div>\n" .
+ "<br clear='all' />\n";
+ } else {
+ wfDebugLog( 'SpamBlacklist', "Spam blacklist validator: [[$thisPageName]] ok or empty blacklist\n" );
+ }
+
+ return true;
+ }
+
+ /**
+ * Hook function for ArticleSaveComplete
+ * Clear local spam blacklist caches on page save.
+ *
+ * @param $article Article
+ * @param $user User
+ * @param $text string
+ * @param $summary string
+ * @param $isminor
+ * @param $iswatch
+ * @param $section
+ * @return bool
+ */
+ static function articleSave( &$article, &$user, $text, $summary, $isminor, $iswatch, $section ) {
+ if( !BaseBlacklist::isLocalSource( $article->getTitle() ) ) {
+ return true;
+ }
+ global $wgMemc, $wgDBname;
+
+ // This sucks because every Blacklist needs to be cleared
+ foreach ( BaseBlacklist::getBlacklistTypes() as $type => $class ) {
+ $wgMemc->delete( "$wgDBname:{$type}_blacklist_regexes" );
+ }
+ return true;
+ }
+}
diff --git a/extensions/SpamBlacklist/SpamBlacklist_body.php b/extensions/SpamBlacklist/SpamBlacklist_body.php
new file mode 100644
index 00000000..7279e20b
--- /dev/null
+++ b/extensions/SpamBlacklist/SpamBlacklist_body.php
@@ -0,0 +1,153 @@
+<?php
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ exit;
+}
+
+class SpamBlacklist extends BaseBlacklist {
+ var $files = array( "http://meta.wikimedia.org/w/index.php?title=Spam_blacklist&action=raw&sb_ver=1" );
+ var $ignoreEditSummary = false;
+
+ /**
+ * Returns the code for the blacklist implementation
+ *
+ * @return string
+ */
+ protected function getBlacklistType() {
+ return 'spam';
+ }
+
+ /**
+ * @param Title $title
+ * @param string $text Text of section, or entire text if $editPage!=false
+ * @param string $section Section number or name
+ * @param string $editsummary Edit summary if one exists, some people use urls there too
+ * @param EditPage $editPage EditPage if EditFilterMerged was called, null otherwise
+ * @return Array Matched text(s) if the edit should not be allowed, false otherwise
+ */
+ function filter( &$title, $text, $section, $editsummary = '', EditPage &$editPage = null ) {
+ /**
+ * @var $wgParser Parser
+ */
+ global $wgParser, $wgUser;
+
+ $fname = 'wfSpamBlacklistFilter';
+ wfProfileIn( $fname );
+
+ # These don't do anything, commenting out...
+ #$this->title = $title;
+ #$this->text = $text;
+ #$this->section = $section;
+ $text = str_replace( '.', '.', $text ); //@bug 12896
+
+ $blacklists = $this->getBlacklists();
+ $whitelists = $this->getWhitelists();
+
+ if ( count( $blacklists ) ) {
+ # Run parser to strip SGML comments and such out of the markup
+ # This was being used to circumvent the filter (see bug 5185)
+ if ( $editPage ) {
+ $editInfo = $editPage->mArticle->prepareTextForEdit( $text );
+ $out = $editInfo->output;
+ } else {
+ $options = new ParserOptions();
+ $text = $wgParser->preSaveTransform( $text, $title, $wgUser, $options );
+ $out = $wgParser->parse( $text, $title, $options );
+ }
+ $newLinks = array_keys( $out->getExternalLinks() );
+ $oldLinks = $this->getCurrentLinks( $title );
+ $addedLinks = array_diff( $newLinks, $oldLinks );
+
+ // We add the edit summary if one exists
+ if ( !$this->ignoreEditSummary && !empty( $editsummary ) ) {
+ $addedLinks[] = $editsummary;
+ }
+
+ wfDebugLog( 'SpamBlacklist', "Old URLs: " . implode( ', ', $oldLinks ) );
+ wfDebugLog( 'SpamBlacklist', "New URLs: " . implode( ', ', $newLinks ) );
+ wfDebugLog( 'SpamBlacklist', "Added URLs: " . implode( ', ', $addedLinks ) );
+
+ $links = implode( "\n", $addedLinks );
+
+ # Strip whitelisted URLs from the match
+ if( is_array( $whitelists ) ) {
+ wfDebugLog( 'SpamBlacklist', "Excluding whitelisted URLs from " . count( $whitelists ) .
+ " regexes: " . implode( ', ', $whitelists ) . "\n" );
+ foreach( $whitelists as $regex ) {
+ wfSuppressWarnings();
+ $newLinks = preg_replace( $regex, '', $links );
+ wfRestoreWarnings();
+ if( is_string( $newLinks ) ) {
+ // If there wasn't a regex error, strip the matching URLs
+ $links = $newLinks;
+ }
+ }
+ }
+
+ # Do the match
+ wfDebugLog( 'SpamBlacklist', "Checking text against " . count( $blacklists ) .
+ " regexes: " . implode( ', ', $blacklists ) . "\n" );
+ $retVal = false;
+ foreach( $blacklists as $regex ) {
+ wfSuppressWarnings();
+ $matches = array();
+ $check = ( preg_match_all( $regex, $links, $matches ) > 0 );
+ wfRestoreWarnings();
+ if( $check ) {
+ wfDebugLog( 'SpamBlacklist', "Match!\n" );
+ global $wgRequest;
+ $ip = $wgRequest->getIP();
+ $imploded = implode( ' ', $matches[0] );
+ wfDebugLog( 'SpamBlacklistHit', "$ip caught submitting spam: $imploded\n" );
+ if( $retVal === false ){
+ $retVal = array();
+ }
+ $retVal = array_merge( $retVal, $matches[0] );
+ }
+ }
+ } else {
+ $retVal = false;
+ }
+ wfProfileOut( $fname );
+ return $retVal;
+ }
+
+ /**
+ * Look up the links currently in the article, so we can
+ * ignore them on a second run.
+ *
+ * WARNING: I can add more *of the same link* with no problem here.
+ * @param $title Title
+ * @return array
+ */
+ function getCurrentLinks( $title ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ $id = $title->getArticleID(); // should be zero queries
+ $res = $dbr->select( 'externallinks', array( 'el_to' ),
+ array( 'el_from' => $id ), __METHOD__ );
+ $links = array();
+ foreach ( $res as $row ) {
+ $links[] = $row->el_to;
+ }
+ return $links;
+ }
+
+ /**
+ * Returns the start of the regex for matches
+ *
+ * @return string
+ */
+ public function getRegexStart() {
+ return '/(?:https?:)?\/\/+[a-z0-9_\-.]*(';
+ }
+
+ /**
+ * Returns the end of the regex for matches
+ *
+ * @param $batchSize
+ * @return string
+ */
+ public function getRegexEnd( $batchSize ) {
+ return ')' . parent::getRegexEnd( $batchSize );
+ }
+}
diff --git a/extensions/SpamBlacklist/SpamRegexBatch.php b/extensions/SpamBlacklist/SpamRegexBatch.php
new file mode 100644
index 00000000..b14d671e
--- /dev/null
+++ b/extensions/SpamBlacklist/SpamRegexBatch.php
@@ -0,0 +1,175 @@
+<?php
+
+/**
+ * Utility class for working with blacklists
+ */
+class SpamRegexBatch {
+ /**
+ * Build a set of regular expressions matching URLs with the list of regex fragments.
+ * Returns an empty list if the input list is empty.
+ *
+ * @param array $lines list of fragments which will match in URLs
+ * @param BaseBlacklist $blacklist
+ * @param int $batchSize largest allowed batch regex;
+ * if 0, will produce one regex per line
+ * @return array
+ */
+ static function buildRegexes( $lines, BaseBlacklist $blacklist, $batchSize=4096 ) {
+ # Make regex
+ # It's faster using the S modifier even though it will usually only be run once
+ //$regex = 'https?://+[a-z0-9_\-.]*(' . implode( '|', $lines ) . ')';
+ //return '/' . str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $regex) ) . '/Sim';
+ $regexes = array();
+ $regexStart = $blacklist->getRegexStart();
+ $regexEnd = $blacklist->getRegexEnd( $batchSize );
+ $build = false;
+ foreach( $lines as $line ) {
+ if( substr( $line, -1, 1 ) == "\\" ) {
+ // Final \ will break silently on the batched regexes.
+ // Skip it here to avoid breaking the next line;
+ // warnings from getBadLines() will still trigger on
+ // edit to keep new ones from floating in.
+ continue;
+ }
+ // FIXME: not very robust size check, but should work. :)
+ if( $build === false ) {
+ $build = $line;
+ } elseif( strlen( $build ) + strlen( $line ) > $batchSize ) {
+ $regexes[] = $regexStart .
+ str_replace( '/', '\/', preg_replace('|\\\*/|u', '/', $build) ) .
+ $regexEnd;
+ $build = $line;
+ } else {
+ $build .= '|';
+ $build .= $line;
+ }
+ }
+ if( $build !== false ) {
+ $regexes[] = $regexStart .
+ str_replace( '/', '\/', preg_replace('|\\\*/|u', '/', $build) ) .
+ $regexEnd;
+ }
+ return $regexes;
+ }
+
+ /**
+ * Confirm that a set of regexes is either empty or valid.
+ *
+ * @param $regexes array set of regexes
+ * @return bool true if ok, false if contains invalid lines
+ */
+ static function validateRegexes( $regexes ) {
+ foreach( $regexes as $regex ) {
+ wfSuppressWarnings();
+ $ok = preg_match( $regex, '' );
+ wfRestoreWarnings();
+
+ if( $ok === false ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Strip comments and whitespace, then remove blanks
+ *
+ * @param $lines array
+ * @return array
+ */
+ static function stripLines( $lines ) {
+ return array_filter(
+ array_map( 'trim',
+ preg_replace( '/#.*$/', '',
+ $lines ) ) );
+ }
+
+ /**
+ * Do a sanity check on the batch regex.
+ *
+ * @param $lines string unsanitized input lines
+ * @param $blacklist BaseBlacklist
+ * @param $fileName bool|string optional for debug reporting
+ * @return array of regexes
+ */
+ static function buildSafeRegexes( $lines, BaseBlacklist $blacklist, $fileName=false ) {
+ $lines = SpamRegexBatch::stripLines( $lines );
+ $regexes = SpamRegexBatch::buildRegexes( $lines, $blacklist );
+ if( SpamRegexBatch::validateRegexes( $regexes ) ) {
+ return $regexes;
+ } else {
+ // _Something_ broke... rebuild line-by-line; it'll be
+ // slower if there's a lot of blacklist lines, but one
+ // broken line won't take out hundreds of its brothers.
+ if( $fileName ) {
+ wfDebugLog( 'SpamBlacklist', "Spam blacklist warning: bogus line in $fileName\n" );
+ }
+ return SpamRegexBatch::buildRegexes( $lines, $blacklist, 0 );
+ }
+ }
+
+ /**
+ * Returns an array of invalid lines
+ *
+ * @param array $lines
+ * @param $blacklist BaseBlacklist
+ * @return array of input lines which produce invalid input, or empty array if no problems
+ */
+ static function getBadLines( $lines, BaseBlacklist $blacklist ) {
+ $lines = SpamRegexBatch::stripLines( $lines );
+
+ $badLines = array();
+ foreach( $lines as $line ) {
+ if( substr( $line, -1, 1 ) == "\\" ) {
+ // Final \ will break silently on the batched regexes.
+ $badLines[] = $line;
+ }
+ }
+
+ $regexes = SpamRegexBatch::buildRegexes( $lines, $blacklist );
+ if( SpamRegexBatch::validateRegexes( $regexes ) ) {
+ // No other problems!
+ return $badLines;
+ }
+
+ // Something failed in the batch, so check them one by one.
+ foreach( $lines as $line ) {
+ $regexes = SpamRegexBatch::buildRegexes( array( $line ), $blacklist );
+ if( !SpamRegexBatch::validateRegexes( $regexes ) ) {
+ $badLines[] = $line;
+ }
+ }
+ return $badLines;
+ }
+
+ /**
+ * Build a set of regular expressions from the given multiline input text,
+ * with empty lines and comments stripped.
+ *
+ * @param $source string
+ * @param $blacklist BaseBlacklist
+ * @param $fileName bool|string optional, for reporting of bad files
+ * @return array of regular expressions, potentially empty
+ */
+ static function regexesFromText( $source, BaseBlacklist $blacklist, $fileName=false ) {
+ $lines = explode( "\n", $source );
+ return SpamRegexBatch::buildSafeRegexes( $lines, $blacklist, $fileName );
+ }
+
+ /**
+ * Build a set of regular expressions from a MediaWiki message.
+ * Will be correctly empty if the message isn't present.
+ *
+ * @param $message string
+ * @param $blacklist BaseBlacklist
+ * @return array of regular expressions, potentially empty
+ */
+ static function regexesFromMessage( $message, BaseBlacklist $blacklist ) {
+ $source = wfMessage( $message )->inContentLanguage();
+ if( !$source->isDisabled() ) {
+ return SpamRegexBatch::regexesFromText( $source->plain(), $blacklist );
+ } else {
+ return array();
+ }
+ }
+}
diff --git a/extensions/SpamBlacklist/cleanup.php b/extensions/SpamBlacklist/cleanup.php
new file mode 100644
index 00000000..5a040265
--- /dev/null
+++ b/extensions/SpamBlacklist/cleanup.php
@@ -0,0 +1,125 @@
+<?php
+
+/**
+ * An aggressive spam cleanup script.
+ * Searches the database for matching pages, and reverts them to the last non-spammed revision.
+ * If all revisions contain spam, deletes the page
+ */
+
+require_once( '../../maintenance/commandLine.inc' );
+require_once( 'SpamBlacklist_body.php' );
+
+/**
+ * Find the latest revision of the article that does not contain spam and revert to it
+ */
+function cleanupArticle( Revision $rev, $regexes, $match ) {
+ $title = $rev->getTitle();
+ $revId = $rev->getId();
+ while ( $rev ) {
+ $matches = false;
+ foreach ( $regexes as $regex ) {
+ $matches = $matches || preg_match( $regex, $rev->getText() );
+ }
+ if ( !$matches ) {
+ // Didn't find any spam
+ break;
+ }
+ # Revision::getPrevious can't be used in this way before MW 1.6 (Revision.php 1.26)
+ #$rev = $rev->getPrevious();
+ $revId = $title->getPreviousRevisionID( $revId );
+ if ( $revId ) {
+ $rev = Revision::newFromTitle( $title, $revId );
+ } else {
+ $rev = false;
+ }
+ }
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->begin();
+ if ( !$rev ) {
+ // Didn't find a non-spammy revision, delete the page
+ /*
+ print "All revisions are spam, deleting...\n";
+ $article = new Article( $title );
+ $article->doDeleteArticle( "All revisions matched the spam blacklist" );
+ */
+ // Too scary, blank instead
+ print "All revisions are spam, blanking...\n";
+ $text = '';
+ $comment = "All revisions matched the spam blacklist ($match), blanking";
+ } else {
+ // Revert to this revision
+ $text = $rev->getText();
+ $comment = "Cleaning up links to $match";
+ }
+ $wikiPage = new WikiPage( $title );
+ $wikiPage->doEdit( $text, $comment );
+ $dbw->commit();
+}
+
+//------------------------------------------------------------------------------
+
+$username = 'Spam cleanup script';
+$wgUser = User::newFromName( $username );
+if ( $wgUser->idForName() == 0 ) {
+ // Create the user
+ $status = $wgUser->addToDatabase();
+ if ( $status === null || $status->isOK() ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->update( 'user', array( 'user_password' => 'nologin' ),
+ array( 'user_name' => $username ), $username );
+ }
+}
+
+if ( isset( $options['n'] ) ) {
+ $dryRun = true;
+} else {
+ $dryRun = false;
+}
+
+$sb = new SpamBlacklist( $wgSpamBlacklistSettings );
+if ( $wgSpamBlacklistFiles ) {
+ $sb->files = $wgSpamBlacklistFiles;
+}
+$regexes = $sb->getBlacklists();
+if ( !$regexes ) {
+ print "Invalid regex, can't clean up spam\n";
+ exit( 1 );
+}
+
+$dbr = wfGetDB( DB_SLAVE );
+$maxID = $dbr->selectField( 'page', 'MAX(page_id)' );
+$reportingInterval = 100;
+
+print "Regexes are " . implode( ', ', array_map( 'count', $regexes ) ) . " bytes\n";
+print "Searching for spam in $maxID pages...\n";
+if ( $dryRun ) {
+ print "Dry run only\n";
+}
+
+for ( $id = 1; $id <= $maxID; $id++ ) {
+ if ( $id % $reportingInterval == 0 ) {
+ printf( "%-8d %-5.2f%%\r", $id, $id / $maxID * 100 );
+ }
+ $revision = Revision::loadFromPageId( $dbr, $id );
+ if ( $revision ) {
+ $text = $revision->getText();
+ if ( $text ) {
+ foreach ( $regexes as $regex ) {
+ if ( preg_match( $regex, $text, $matches ) ) {
+ $title = $revision->getTitle();
+ $titleText = $title->getPrefixedText();
+ if ( $dryRun ) {
+ print "\nFound spam in [[$titleText]]\n";
+ } else {
+ print "\nCleaning up links to {$matches[0]} in [[$titleText]]\n";
+ $match = str_replace( 'http://', '', $matches[0] );
+ cleanupArticle( $revision, $regexes, $match );
+ }
+ }
+ }
+ }
+ }
+}
+// Just for satisfaction
+printf( "%-8d %-5.2f%%\n", $id - 1, ( $id - 1 ) / $maxID * 100 );
+
diff --git a/extensions/SyntaxHighlight_GeSHi/README b/extensions/SyntaxHighlight_GeSHi/README
new file mode 100644
index 00000000..c0004318
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/README
@@ -0,0 +1,73 @@
+This extension allows source code to be syntax highlighted on the wiki pages.
+This README file might be out of date, have a look at the extension page
+for updated informations:
+
+ http://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi
+
+== Requirements ==
+
+This version of the extension has been tested with GeSHi 1.0.8.10 and MediaWiki 1.18
+as of 2011-02-19. It may or may not work with earlier versions of the aforementioned
+software. To get releases of this extension compatible with earlier versions of
+MediaWiki, visit:
+
+ http://www.mediawiki.org/wiki/Special:ExtensionDistributor/SyntaxHighlight_GeSHi
+
+
+== Installation ==
+
+If you downloaded this from MediaWiki.org, there should already be
+a 'geshi' directory in this folder. If there is, you can skip the next
+paragraph.
+
+Download the latest stable build from
+http://sourceforge.net/project/showfiles.php?group_id=114997, and unzip it into
+your extensions/SyntaxHighlight_GeSHi/ directory. (Note: the zip file creates a
+sub-directory called geshi/, and places a file geshi.php there)
+
+Add this line to your LocalSettings.php:
+
+ require_once("extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php");
+
+If your MediaWiki software is obtained via Subversion, then the latest build
+can be downloaded via the Subversion repository. First of all, is to switch
+into your extensions/SyntaxHighlight_GeSHi/ directory. Then invoke the command
+to obtain the latest build of the GeSHi code:
+
+ svn checkout https://geshi.svn.sourceforge.net/svnroot/geshi/trunk/geshi-1.0.X/src/ geshi
+
+If needed, change the following line on SyntaxHighlight_GeSHi.class.php to
+suit the path of your geshi.php file
+
+ require_once( 'geshi/geshi.php' );
+
+== Usage ==
+
+On the wiki page, you can now use "source" elements:
+
+<source lang="php">
+<?php
+ v = "string"; // sample initialization
+?>
+html text
+<?php
+ echo v; // end of php code
+?>
+</source>
+
+== Parameters ==
+
+Please see the documentation of GeSHi on http://qbnz.com/highlighter/geshi-doc.html
+for detailed information to use some of the parameters.
+
+* lang; Defines the language
+* line; Corresponds to enable_line_numbers method on GeSHi
+* start; Corresponds to start_line_numbers_at method on GeSHi
+* strict; Corresponds to enable_strict_mode method on GeSHi
+
+== Note ==
+
+GeSHi is generous about creating HTML elements: highlighting large blocks of
+code can easily generate enough of them to crash a browser. As a guard, symbol
+highlighting is turned off for code fragments larger than 100 kB. For fragments
+larger than 200 kB, string highlighting is turned off as well.
diff --git a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php
new file mode 100644
index 00000000..4538a5f1
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php
@@ -0,0 +1,519 @@
+<?php
+
+class SyntaxHighlight_GeSHi {
+ /**
+ * Has GeSHi been initialised this session?
+ */
+ private static $initialised = false;
+
+ /**
+ * List of languages available to GeSHi
+ * @var array
+ */
+ private static $languages = null;
+
+ /**
+ * Parser hook
+ *
+ * @param string $text
+ * @param array $args
+ * @param Parser $parser
+ * @return string
+ */
+ public static function parserHook( $text, $args = array(), $parser ) {
+ global $wgSyntaxHighlightDefaultLang, $wgUseSiteCss, $wgUseTidy;
+ wfProfileIn( __METHOD__ );
+ self::initialise();
+ $text = rtrim( $text );
+ // Don't trim leading spaces away, just the linefeeds
+ $text = preg_replace( '/^\n+/', '', $text );
+
+ if( $wgUseTidy ) {
+ // HTML Tidy will convert tabs to spaces incorrectly (bug 30930).
+ // Preemptively replace the spaces in a more controlled fashion.
+ $text = self::tabsToSpaces( $text );
+ }
+
+ // Validate language
+ if( isset( $args['lang'] ) && $args['lang'] ) {
+ $lang = $args['lang'];
+ } else {
+ // language is not specified. Check if default exists, if yes, use it.
+ if ( !is_null( $wgSyntaxHighlightDefaultLang ) ) {
+ $lang = $wgSyntaxHighlightDefaultLang;
+ } else {
+ $error = self::formatLanguageError( $text );
+ wfProfileOut( __METHOD__ );
+ return $error;
+ }
+ }
+ $lang = strtolower( $lang );
+ if( !preg_match( '/^[a-z_0-9-]*$/', $lang ) ) {
+ $error = self::formatLanguageError( $text );
+ wfProfileOut( __METHOD__ );
+ return $error;
+ }
+ $geshi = self::prepare( $text, $lang );
+ if( !$geshi instanceof GeSHi ) {
+ $error = self::formatLanguageError( $text );
+ wfProfileOut( __METHOD__ );
+ return $error;
+ }
+
+ $enclose = self::getEncloseType( $args );
+
+ // Line numbers
+ if( isset( $args['line'] ) ) {
+ $geshi->enable_line_numbers( GESHI_FANCY_LINE_NUMBERS );
+ }
+ // Highlighting specific lines
+ if( isset( $args['highlight'] ) ) {
+ $lines = self::parseHighlightLines( $args['highlight'] );
+ if ( count( $lines ) ) {
+ $geshi->highlight_lines_extra( $lines );
+ }
+ }
+ // Starting line number
+ if( isset( $args['start'] ) ) {
+ $geshi->start_line_numbers_at( $args['start'] );
+ }
+ $geshi->set_header_type( $enclose );
+ // Strict mode
+ if( isset( $args['strict'] ) ) {
+ $geshi->enable_strict_mode();
+ }
+ // Format
+ $out = $geshi->parse_code();
+ if ( $geshi->error == GESHI_ERROR_NO_SUCH_LANG ) {
+ // Common error :D
+ $error = self::formatLanguageError( $text );
+ wfProfileOut( __METHOD__ );
+ return $error;
+ }
+ $err = $geshi->error();
+ if( $err ) {
+ // Other unknown error!
+ $error = self::formatError( $err );
+ wfProfileOut( __METHOD__ );
+ return $error;
+ }
+ // Armour for Parser::doBlockLevels()
+ if( $enclose === GESHI_HEADER_DIV ) {
+ $out = str_replace( "\n", '', $out );
+ }
+ // Register CSS
+ $parser->getOutput()->addHeadItem( self::buildHeadItem( $geshi ), "source-{$lang}" );
+
+ if ( $wgUseSiteCss ) {
+ $parser->getOutput()->addModuleStyles( 'ext.geshi.local' );
+ }
+
+ $encloseTag = $enclose === GESHI_HEADER_NONE ? 'span' : 'div';
+ $attribs = Sanitizer::validateTagAttributes( $args, $encloseTag );
+
+ //lang is valid in HTML context, but also used on GeSHi
+ unset( $attribs['lang'] );
+
+ if ( $enclose === GESHI_HEADER_NONE ) {
+ $attribs = self::addAttribute( $attribs, 'class', 'mw-geshi ' . $lang . ' source-' . $lang );
+ } else {
+ // Default dir="ltr" (but allow dir="rtl", although unsure if needed)
+ $attribs['dir'] = isset( $attribs['dir'] ) && $attribs['dir'] === 'rtl' ? 'rtl' : 'ltr';
+ $attribs = self::addAttribute( $attribs, 'class', 'mw-geshi mw-code mw-content-' . $attribs['dir'] );
+ }
+ $out = Html::rawElement( $encloseTag, $attribs, $out );
+
+ wfProfileOut( __METHOD__ );
+ return $out;
+ }
+
+ /**
+ * @param $attribs array
+ * @param $name string
+ * @param $value string
+ * @return array
+ */
+ private static function addAttribute( $attribs, $name, $value ) {
+ if( isset( $attribs[$name] ) ) {
+ $attribs[$name] = $value . ' ' . $attribs[$name];
+ } else {
+ $attribs[$name] = $value;
+ }
+ return $attribs;
+ }
+
+ /**
+ * Take an input specifying a list of lines to highlight, returning
+ * a raw list of matching line numbers.
+ *
+ * Input is comma-separated list of lines or line ranges.
+ *
+ * @param $arg string
+ * @return array of ints
+ */
+ protected static function parseHighlightLines( $arg ) {
+ $lines = array();
+ $values = array_map( 'trim', explode( ',', $arg ) );
+ foreach ( $values as $value ) {
+ if ( ctype_digit($value) ) {
+ $lines[] = (int) $value;
+ } elseif ( strpos( $value, '-' ) !== false ) {
+ list( $start, $end ) = array_map( 'trim', explode( '-', $value ) );
+ if ( self::validHighlightRange( $start, $end ) ) {
+ for ($i = intval( $start ); $i <= $end; $i++ ) {
+ $lines[] = $i;
+ }
+ } else {
+ wfDebugLog( 'geshi', "Invalid range: $value\n" );
+ }
+ } else {
+ wfDebugLog( 'geshi', "Invalid line: $value\n" );
+ }
+ }
+ return $lines;
+ }
+
+ /**
+ * Validate a provided input range
+ * @param $start
+ * @param $end
+ * @return bool
+ */
+ protected static function validHighlightRange( $start, $end ) {
+ // Since we're taking this tiny range and producing a an
+ // array of every integer between them, it would be trivial
+ // to DoS the system by asking for a huge range.
+ // Impose an arbitrary limit on the number of lines in a
+ // given range to reduce the impact.
+ $arbitrarilyLargeConstant = 10000;
+ return
+ ctype_digit($start) &&
+ ctype_digit($end) &&
+ $start > 0 &&
+ $start < $end &&
+ $end - $start < $arbitrarilyLargeConstant;
+ }
+
+ /**
+ * @param $args array
+ * @return int
+ */
+ static function getEncloseType( $args ) {
+ // Since version 1.0.8 geshi can produce valid pre, but we need to check for it
+ if ( defined('GESHI_HEADER_PRE_VALID') ) {
+ $pre = GESHI_HEADER_PRE_VALID;
+ } else {
+ $pre = GESHI_HEADER_PRE;
+ }
+
+ // "Enclose" parameter
+ $enclose = $pre;
+ if ( isset( $args['enclose'] ) ) {
+ if ( $args['enclose'] === 'div' ) {
+ $enclose = GESHI_HEADER_DIV;
+ } elseif ( $args['enclose'] === 'none' ) {
+ $enclose = GESHI_HEADER_NONE;
+ }
+ }
+
+ if( isset( $args['line'] ) && $pre === GESHI_HEADER_PRE ) {
+ // Force <div> mode to maintain valid XHTML, see
+ // http://sourceforge.net/tracker/index.php?func=detail&aid=1201963&group_id=114997&atid=670231
+ $enclose = GESHI_HEADER_DIV;
+ }
+
+ return $enclose;
+ }
+
+ /**
+ * Hook into Article::view() to provide syntax highlighting for
+ * custom CSS and JavaScript pages.
+ *
+ * B/C for MW 1.20 and before. 1.21 and later use renderHook() instead.
+ *
+ * @param string $text
+ * @param Title $title
+ * @param OutputPage $output
+ * @return bool
+ */
+ public static function viewHook( $text, $title, $output ) {
+ global $wgUseSiteCss;
+ // Determine the language
+ $matches = array();
+ preg_match( '!\.(css|js)$!u', $title->getText(), $matches );
+ $lang = isset( $matches[1] ) && $matches[1] == 'css' ? 'css' : 'javascript';
+ // Attempt to format
+ $geshi = self::prepare( $text, $lang );
+ if( $geshi instanceof GeSHi ) {
+ $out = $geshi->parse_code();
+ if( !$geshi->error() ) {
+ // Done
+ $output->addHeadItem( "source-$lang", self::buildHeadItem( $geshi ) );
+ $output->addHTML( "<div dir=\"ltr\">{$out}</div>" );
+ if( $wgUseSiteCss ) {
+ $output->addModuleStyles( 'ext.geshi.local' );
+ }
+ return false;
+ }
+ }
+ // Bottle out
+ return true;
+ }
+
+ /**
+ * Hook into Content::getParserOutput to provide syntax highlighting for
+ * script content.
+ *
+ * @return bool
+ * @since MW 1.21
+ */
+ public static function renderHook( Content $content, Title $title,
+ ParserOptions $options, $generateHtml, ParserOutput &$output
+ ) {
+
+ global $wgSyntaxHighlightModels, $wgUseSiteCss;
+
+ // Determine the language
+ $model = $content->getModel();
+ if ( !isset( $wgSyntaxHighlightModels[$model] ) ) {
+ // We don't care about this model, carry on.
+ return true;
+ }
+
+ if ( !$generateHtml ) {
+ // Nothing to do.
+ return false;
+ }
+
+ // Hope that $wgSyntaxHighlightModels does not contain silly types.
+ $text = Contenthandler::getContentText( $content );
+
+ if ( $text === null || $text === false ) {
+ // Oops! Non-text content?
+ return false;
+ }
+
+ $lang = $wgSyntaxHighlightModels[$model];
+
+ // Attempt to format
+ $geshi = self::prepare( $text, $lang );
+ if( $geshi instanceof GeSHi ) {
+
+ $out = $geshi->parse_code();
+ if( !$geshi->error() ) {
+ // Done
+ $output->addHeadItem( self::buildHeadItem( $geshi ), "source-$lang" );
+ $output->setText( "<div dir=\"ltr\">{$out}</div>" );
+
+ if( $wgUseSiteCss ) {
+ $output->addModuleStyles( 'ext.geshi.local' );
+ }
+ return false;
+ }
+ }
+
+ // Bottle out
+ return true;
+ }
+
+ /**
+ * Initialise a GeSHi object to format some code, performing
+ * common setup for all our uses of it
+ *
+ * @note Used only until MW 1.20
+ *
+ * @param string $text
+ * @param string $lang
+ * @return GeSHi
+ */
+ public static function prepare( $text, $lang ) {
+ self::initialise();
+ $geshi = new GeSHi( $text, $lang );
+ if( $geshi->error() == GESHI_ERROR_NO_SUCH_LANG ) {
+ return null;
+ }
+ $geshi->set_encoding( 'UTF-8' );
+ $geshi->enable_classes();
+ $geshi->set_overall_class( "source-$lang" );
+ $geshi->enable_keyword_links( false );
+
+ // If the source code is over 100 kB, disable higlighting of symbols.
+ // If over 200 kB, disable highlighting of strings too.
+ $bytes = strlen( $text );
+ if ( $bytes > 102400 ) {
+ $geshi->set_symbols_highlighting( false );
+ if ( $bytes > 204800 ) {
+ $geshi->set_strings_highlighting( false );
+ }
+ }
+
+ return $geshi;
+ }
+
+ /**
+ * Prepare a CSS snippet suitable for use as a ParserOutput/OutputPage
+ * head item
+ *
+ * @param GeSHi $geshi
+ * @return string
+ */
+ public static function buildHeadItem( $geshi ) {
+ /**
+ * Geshi comes by default with a font-family set to monospace which
+ * ends ultimately ends up causing the font-size to be smaller than
+ * one would expect (causing bug 26204).
+ * We append to the default geshi style a CSS hack which is to specify
+ * monospace twice which "reset" the browser font-size specified for monospace.
+ *
+ * The hack is documented in MediaWiki core under
+ * docs/uidesign/monospace.html and in bug 33496.
+ */
+ $geshi->set_code_style( 'font-family: monospace, monospace;',
+ /** preserve defaults */ true );
+
+ $lang = $geshi->language;
+ $css = array();
+ $css[] = '<style type="text/css">/*<![CDATA[*/';
+ $css[] = ".source-$lang {line-height: normal;}";
+ $css[] = ".source-$lang li, .source-$lang pre {";
+ $css[] = "\tline-height: normal; border: 0px none white;";
+ $css[] = "}";
+ $css[] = $geshi->get_stylesheet( false );
+ $css[] = '/*]]>*/';
+ $css[] = '</style>';
+ return implode( "\n", $css );
+ }
+
+ /**
+ * Format an 'unknown language' error message and append formatted
+ * plain text to it.
+ *
+ * @param string $text
+ * @return string HTML fragment
+ */
+ private static function formatLanguageError( $text ) {
+ $msg = wfMessage( 'syntaxhighlight-err-language' )->inContentLanguage()->escaped();
+ $error = self::formatError( $msg, $text );
+ return $error . '<pre>' . htmlspecialchars( $text ) . '</pre>';
+ }
+
+ /**
+ * Format an error message
+ *
+ * @param string $error
+ * @return string
+ */
+ private static function formatError( $error = '' ) {
+ $html = '';
+ if( $error ) {
+ $html .= "<p>{$error}</p>";
+ }
+ $html .= '<p>' . wfMessage( 'syntaxhighlight-specify')->inContentLanguage()->escaped()
+ . ' <samp>&lt;source lang=&quot;html4strict&quot;&gt;...&lt;/source&gt;</samp></p>'
+ . '<p>' . wfMessage( 'syntaxhighlight-supported' )->inContentLanguage()->escaped()
+ . '</p>' . self::formatLanguages();
+ return "<div style=\"border: solid red 1px; padding: .5em;\">{$html}</div>";
+ }
+
+ /**
+ * Format the list of supported languages
+ *
+ * @return string
+ */
+ private static function formatLanguages() {
+ $langs = self::getSupportedLanguages();
+ $list = array();
+ if( count( $langs ) > 0 ) {
+ foreach( $langs as $lang ) {
+ $list[] = '<samp>' . htmlspecialchars( $lang ) . '</samp>';
+ }
+ return '<p class="mw-collapsible mw-collapsed" style="padding: 0em 1em;">' . implode( ', ', $list ) . '</p><br style="clear: all"/>';
+ } else {
+ return '<p>' . wfMessage( 'syntaxhighlight-err-loading' )->inContentLanguage()->escaped() . '</p>';
+ }
+ }
+
+ /**
+ * Get the list of supported languages
+ *
+ * @return array
+ */
+ private static function getSupportedLanguages() {
+ if( !is_array( self::$languages ) ) {
+ self::initialise();
+ self::$languages = array();
+ foreach( glob( GESHI_LANG_ROOT . "/*.php" ) as $file ) {
+ self::$languages[] = basename( $file, '.php' );
+ }
+ sort( self::$languages );
+ }
+ return self::$languages;
+ }
+
+ /**
+ * Initialise messages and ensure the GeSHi class is loaded
+ * @return bool
+ */
+ private static function initialise() {
+ if( !self::$initialised ) {
+ if( !class_exists( 'GeSHi' ) ) {
+ require( dirname( __FILE__ ) . '/geshi/geshi.php' );
+ }
+ self::$initialised = true;
+ }
+ return true;
+ }
+
+ /**
+ * Get the GeSHI's version information while Special:Version is read.
+ * @param $extensionTypes
+ * @return bool
+ */
+ public static function hSpecialVersion_GeSHi( &$extensionTypes ) {
+ global $wgExtensionCredits;
+ self::initialise();
+ $wgExtensionCredits['parserhook']['SyntaxHighlight_GeSHi']['version'] = GESHI_VERSION;
+ return true;
+ }
+
+ /**
+ * @see SyntaxHighlight_GeSHi::hSpecialVersion_GeSHi
+ * @param $sp
+ * @param $extensionTypes
+ * @return bool
+ */
+ public static function hOldSpecialVersion_GeSHi( &$sp, &$extensionTypes ) {
+ return self::hSpecialVersion_GeSHi( $extensionTypes );
+ }
+
+ /**
+ * Convert tabs to spaces
+ *
+ * @param string $text
+ * @return string
+ */
+ private static function tabsToSpaces( $text ) {
+ $lines = explode( "\n", $text );
+ $lines = array_map( array( __CLASS__, 'tabsToSpacesLine' ), $lines );
+ return implode( "\n", $lines );
+ }
+
+ /**
+ * Convert tabs to spaces for a single line
+ *
+ * @param $line
+ * @internal param string $text
+ * @return string
+ */
+ private static function tabsToSpacesLine( $line ) {
+ $parts = explode( "\t", $line );
+ $width = 8; // To match tidy's config & typical browser defaults
+ $out = $parts[0];
+ foreach( array_slice( $parts, 1 ) as $chunk ) {
+ $spaces = $width - (strlen( $out ) % $width);
+ $out .= str_repeat( ' ', $spaces );
+ $out .= $chunk;
+ }
+ return $out;
+ }
+}
diff --git a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.i18n.php b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.i18n.php
new file mode 100644
index 00000000..b9a336dd
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.i18n.php
@@ -0,0 +1,1293 @@
+<?php
+/**
+ * Internationalisation file for extension SyntaxHighlight.
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$messages = array();
+
+/** English
+ * @author Brion Vibber
+ */
+$messages['en'] = array(
+ 'syntaxhighlight-desc' => 'Provides syntax highlighting <code>&lt;syntaxhighlight&gt;</code> using [http://qbnz.com/highlighter/ GeSHi - Generic Syntax Highlighter]',
+ 'syntaxhighlight-specify' => 'You need to specify a language like this:',
+ 'syntaxhighlight-supported' => 'Supported languages for syntax highlighting:',
+ 'syntaxhighlight-err-loading' => '(error loading supported language list)',
+ 'syntaxhighlight-err-language' => 'Invalid language.',
+ 'geshi.css' => '/* CSS placed here will be applied to GeSHi syntax highlighting */',
+);
+
+/** Message documentation (Message documentation)
+ * @author Meno25
+ * @author Shirayuki
+ * @author The Evil IP address
+ */
+$messages['qqq'] = array(
+ 'syntaxhighlight-desc' => '{{desc|name=Syntax Highlight GeSHi|url=http://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi}}',
+);
+
+/** Afrikaans (Afrikaans)
+ * @author Naudefj
+ * @author SPQRobin
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['af'] = array(
+ 'syntaxhighlight-specify' => "U moet 'n taal as volg spesifiseer:",
+ 'syntaxhighlight-supported' => 'Ondersteunde tale vir accentuering:',
+ 'syntaxhighlight-err-loading' => '(fout met die laai van die lys van ondersteunde tale)',
+ 'syntaxhighlight-err-language' => 'Ongeldige taal.',
+);
+
+/** Aragonese (aragonés)
+ * @author Juanpabl
+ */
+$messages['an'] = array(
+ 'syntaxhighlight-desc' => 'Premite o resalte sintactico <code>&lt;syntaxhighlight&gt;</code> usando [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => "Ha d'endicar un lenguache asinas:",
+ 'syntaxhighlight-supported' => 'Lenguaches suportatos ta o resalte sintactico:',
+ 'syntaxhighlight-err-loading' => '(error en cargar a lista de luengaches suportatos)',
+ 'syntaxhighlight-err-language' => 'Luengache invalido.',
+ 'geshi.css' => "/* Iste codigo CSS s'aplicará ta destacar a sintaxi GeSHi*/",
+);
+
+/** Arabic (العربية)
+ * @author Meno25
+ */
+$messages['ar'] = array(
+ 'syntaxhighlight-desc' => 'يوÙر تعليم النص <code>&lt;syntaxhighlight&gt;</code> باستخدام [http://qbnz.com/highlighter/ معلم GeSHi]',
+ 'syntaxhighlight-specify' => 'يجب عليك تحديد لغة مثل هذه:',
+ 'syntaxhighlight-supported' => 'اللغات المدعومة لتظليل الصياغة:',
+ 'syntaxhighlight-err-loading' => '(خطأ ÙÙŠ تحميل قائمة اللغات المدعومة)',
+ 'syntaxhighlight-err-language' => 'لغة غير صحيحة.',
+ 'geshi.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستطبق على تظليل صياغة GeSHi */',
+);
+
+/** Egyptian Spoken Arabic (مصرى)
+ * @author Meno25
+ * @author Ramsis II
+ */
+$messages['arz'] = array(
+ 'syntaxhighlight-desc' => 'بيوÙر تظليل السينتاكس <code>&lt;syntaxhighlight&gt;</code> باستعمال [http://qbnz.com/highlighter/ GeSHi مظلل]',
+ 'syntaxhighlight-specify' => 'انت لازم تحدد لغة زى كدا:',
+ 'syntaxhighlight-supported' => 'اللغات المدعومة لتظليل السينتاكس:',
+ 'syntaxhighlight-err-loading' => '(غلط ÙÙ‰ تحميل لستة اللغات المدعومة)',
+ 'syntaxhighlight-err-language' => 'لغة مش صحيحة',
+ 'geshi.css' => '/* CSS المحطوطة هنا ح تتطبق على تظليل سينتاكس الGeSHi */',
+);
+
+/** Assamese (অসমীয়া)
+ * @author Bishnu Saikia
+ */
+$messages['as'] = array(
+ 'syntaxhighlight-err-language' => 'অবৈধ ভাষা।',
+);
+
+/** Asturian (asturianu)
+ * @author Esbardu
+ */
+$messages['ast'] = array(
+ 'syntaxhighlight-desc' => 'Proporciona resaltáu de sintaxis <code>&lt;syntaxhighlight&gt;</code> usando [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Necesites conseñar una llingua como esta:',
+ 'syntaxhighlight-supported' => 'Llingües sofitaes pa la sintaxis en colores:',
+ 'syntaxhighlight-err-loading' => '(error al cargar la llista de llingües sofitaes)',
+ 'syntaxhighlight-err-language' => 'Llingua non válida.',
+ 'geshi.css' => '/* El códigu CSS allugáu equí va ser aplicáu por GeSHi pa la sintaxis en colores */',
+);
+
+/** Bashkir (башҡортÑа)
+ * @author Assele
+ */
+$messages['ba'] = array(
+ 'syntaxhighlight-desc' => '[http://qbnz.com/highlighter/ GeSHi Highlighter] Ñрҙамында ÑинтакÑиÑÑ‚Ñ‹ айырып күрһәтеү Ó©Ñөн <code>&lt;syntaxhighlight&gt;</code> билдәһен ҡулланыу мөмкинлеген бирә',
+ 'syntaxhighlight-specify' => 'Һеҙ телде түбәндәгеÑÓ™ күрһәтергә тейешһегеҙ:',
+ 'syntaxhighlight-supported' => 'СинтакÑиÑÑ‚Ñ‹ айырып күрһәтеү мөмкин булған телдәр:',
+ 'syntaxhighlight-err-loading' => '(телдәр иÑемлеген Ñығарыу хатаһы)',
+ 'syntaxhighlight-err-language' => 'Тел дөрөҫ түгел.',
+ 'geshi.css' => '/* Бында ҡуйылған CSS-код ÑиÑтанкÑиÑÑ‚Ñ‹ GeSHi Ñрҙамында айырып күрһәтеү Ó©Ñөн ҡулланылаÑаҡ */',
+);
+
+/** Southern Balochi (بلوچی مکرانی)
+ * @author Mostafadaneshvar
+ */
+$messages['bcc'] = array(
+ 'syntaxhighlight-desc' => 'ساختار پررنگی آریت <code>&lt;syntaxhighlight&gt;</code> گون استÙاده Ú†Ù‡[http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'لازمنت شما یک زبانی په داب شی مشخض کنیت:',
+ 'syntaxhighlight-supported' => 'حمایتی زبانان په ساختار پررنگی:',
+ 'syntaxhighlight-err-loading' => '(حطا ته بار کتن لیست زبان داشتگین)',
+ 'syntaxhighlight-err-language' => 'نامعتبرین زبان',
+ 'geshi.css' => '/* CSS که ادان هستن ته ساختار جی شی پررنگ کتن کارمرز بین */',
+);
+
+/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
+ * @author EugeneZelenko
+ * @author Jim-by
+ */
+$messages['be-tarask'] = array(
+ 'syntaxhighlight-desc' => 'ДазвалÑе выкарыÑтоўваць Ñ‚Ñг <code>&lt;syntaxhighlight&gt;</code> Ð´Ð»Ñ Ð¿Ð°Ð´Ñьветкі ÑынтакÑÑ–Ñу з дапамогай [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Вам неабходна пазначыць мову наÑтупным чынам:',
+ 'syntaxhighlight-supported' => 'Мовы, ÑÐºÑ–Ñ Ð¿Ð°Ð´Ñ‚Ñ€Ñ‹Ð¼Ð»Ñ–Ð²Ð°ÑŽÑ†Ñ†Ð° Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²ÐµÑ€ÐºÑ– ÑынтакÑÑ–Ñу:',
+ 'syntaxhighlight-err-loading' => '(памылка загрузкі ÑьпіÑу моваў)',
+ 'syntaxhighlight-err-language' => 'Мова не падтрымліваецца.',
+ 'geshi.css' => '/* CSS, разьмешчаны тут, будзе выкарыÑтоўвацца Ð´Ð»Ñ Ð¿Ð°Ð´Ñьветкі ÑынтакÑÑ–Ñу GeSHi */',
+);
+
+/** Bulgarian (българÑки)
+ * @author Borislav
+ * @author DCLXVI
+ * @author Turin
+ */
+$messages['bg'] = array(
+ 'syntaxhighlight-desc' => 'ОÑигурÑва Ñинтактично оÑветÑване на <code>&lt;syntaxhighlight&gt;</code> чрез [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Ðужно е да укажете език по ÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð½Ð°Ñ‡Ð¸Ð½:',
+ 'syntaxhighlight-supported' => 'Поддържани езици за Ñинтактично откроÑване:',
+ 'syntaxhighlight-err-loading' => '(грешка при зареждането на ÑпиÑъка на поддържаните езици)',
+ 'syntaxhighlight-err-language' => 'Ðевалиден език.',
+ 'geshi.css' => '/* Евентуален код на CSS, поÑтавен тук, ще бъде използван за Ñинтактичното откроÑване чрез GeSHi */',
+);
+
+/** Bengali (বাংলা)
+ * @author Zaheen
+ */
+$messages['bn'] = array(
+ 'syntaxhighlight-desc' => '[http://qbnz.com/highlighter/ GeSHi হাইলাইটার] বà§à¦¯à¦¬à¦¹à¦¾à¦° করে <code>&lt;syntaxhighlight&gt;</code> সিনটà§à¦¯à¦¾à¦•à§à¦¸ হাইলাইটিং-à¦à¦° কà§à¦·à¦®à¦¤à¦¾ দেয়',
+ 'syntaxhighlight-specify' => 'আপনাকে à¦à¦­à¦¾à¦¬à§‡ à¦à¦•à¦Ÿà¦¿ ভাষা নিরà§à¦¦à¦¿à¦·à§à¦Ÿ করতে হবে:',
+ 'syntaxhighlight-supported' => 'যেসব ভাষার জনà§à¦¯ সিনটà§à¦¯à¦¾à¦•à§à¦¸ হাইলাইটিং সমরà§à¦¥à¦¿à¦¤:',
+ 'syntaxhighlight-err-loading' => '(সমরà§à¦¥à¦¿à¦¤ ভাষার তালিকা আনতে তà§à¦°à§à¦Ÿà¦¿)',
+ 'syntaxhighlight-err-language' => 'অবৈধ ভাষা।',
+ 'geshi.css' => '/* à¦à¦–ানে সà§à¦¥à¦¾à¦ªà¦¿à¦¤ CSS কোড GeSHi সিনটà§à¦¯à¦¾à¦•à§à¦¸ হাইলাইটিং-ঠবà§à¦¯à¦¬à¦¹à¦¾à¦° করা হবে */',
+);
+
+/** Breton (brezhoneg)
+ * @author Fulup
+ */
+$messages['br'] = array(
+ 'syntaxhighlight-desc' => 'Talvezout a ra da lakaat an ereadur war wel dre ar valizenn <code>&lt;syntaxhighlight&gt;</code> en ur ober gant [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => "Ret eo deoc'h spisaat ur yezh evel-henn :",
+ 'syntaxhighlight-supported' => 'Yezhoù skoret evit al livadur ereadurel :',
+ 'syntaxhighlight-err-loading' => '(fazi en ur gargañ roll ar yezhoù skoret)',
+ 'syntaxhighlight-err-language' => 'Yezh direizh.',
+ 'geshi.css' => "/* Talvezout a raio ar c'hod CSS lakaet amañ d'al livadur ereadurel GeSHi */",
+);
+
+/** Bosnian (bosanski)
+ * @author CERminator
+ */
+$messages['bs'] = array(
+ 'syntaxhighlight-desc' => 'Omogućava isticanje sintakse <code>&lt;syntaxhighlight&gt;</code> uz pomoć [http://qbnz.com/highlighter/ GeSHi Highlightera]',
+ 'syntaxhighlight-specify' => 'Potrebno je da specificirate jezik ovako:',
+ 'syntaxhighlight-supported' => 'Podržani jezici za isticanje sintakse:',
+ 'syntaxhighlight-err-loading' => '(greška pri korištenju spiska podržanih jezika)',
+ 'syntaxhighlight-err-language' => 'Pogrešan jezik.',
+ 'geshi.css' => '/* CSS koji se ovdje postavi će biti korišten za isticanje GeSHi sintakse */',
+);
+
+/** Catalan (català)
+ * @author SMP
+ * @author Solde
+ */
+$messages['ca'] = array(
+ 'syntaxhighlight-desc' => "Proveeix de ressaltat sintàctic amb l'etiqueta <code>&lt;syntaxhighlight&gt;</code> usant el programa [http://qbnz.com/highlighter/ GeSHi]",
+ 'syntaxhighlight-specify' => "Heu d'especificar un dels llenguatges:",
+ 'syntaxhighlight-supported' => 'Llenguatges admesos per al ressaltament sintàctic:',
+ 'syntaxhighlight-err-loading' => '(error en carregar la llista de llenguatges)',
+ 'syntaxhighlight-err-language' => 'Llenguatge invàlid.',
+ 'geshi.css' => '/* El CSS ubicat aquí serà aplicat al ressaltat de sintaxi de GeSHi */',
+);
+
+/** Chechen (нохчийн)
+ * @author Sasan700
+ */
+$messages['ce'] = array(
+ 'geshi.css' => '/* CSS-ишар, кху чу Ñ…lоттайахь, оцо болх бийра бу Ñизашдо беÑнашна Ñ…lокхуньца GeSHI */',
+);
+
+/** Czech (Äesky)
+ * @author Li-sung
+ * @author Matěj Grabovský
+ */
+$messages['cs'] = array(
+ 'syntaxhighlight-desc' => 'Poskytuje zvýrazňování syntaxe <code>&lt;syntaxhighlight&gt;</code> pomocí [http://qnbz.com/higlighter zvýrazňovaÄe GeSHi]',
+ 'syntaxhighlight-specify' => 'Musíte urÄit jazyk tímto způsobem:',
+ 'syntaxhighlight-supported' => 'Seznam jazyků, u kterých je podporováno zvýrazňování syntaxe:',
+ 'syntaxhighlight-err-loading' => '(chyba pÅ™i naÄítání seznamu podporovaných jazyků)',
+ 'syntaxhighlight-err-language' => 'Neplatný jazyk.',
+ 'geshi.css' => '/* Zde uvedené CSS bude ovlivňovat zvýrazňování syntaxe GeSHi */',
+);
+
+/** Danish (dansk)
+ * @author Sarrus
+ */
+$messages['da'] = array(
+ 'syntaxhighlight-err-language' => 'Ugyldigt sprog.',
+);
+
+/** German (Deutsch)
+ * @author Kghbln
+ * @author Raimond Spekking
+ */
+$messages['de'] = array(
+ 'syntaxhighlight-desc' => 'Ergänzt das Tag <code>&lt;syntaxhighlight&gt;</code> zur Syntaxhervorhebung mit Hilfe des [http://qbnz.com/highlighter/ Generic Syntax Highlighter (GeSHi)]',
+ 'syntaxhighlight-specify' => 'Die gewünschte Sprache muss wie folgt definiert werden:',
+ 'syntaxhighlight-supported' => 'Unterstützte Sprachen für die Syntaxhervorhebung:',
+ 'syntaxhighlight-err-loading' => '(Fehler beim Laden der Sprachenliste)',
+ 'syntaxhighlight-err-language' => 'Ungültige Sprache.',
+ 'geshi.css' => '/* CSS in dieser MediaWiki-Systemnachricht wird auf die GeSHi-Syntaxhervorhebung angewendet */',
+);
+
+/** Zazaki (Zazaki)
+ * @author Aspar
+ * @author Mirzali
+ */
+$messages['diq'] = array(
+ 'syntaxhighlight-desc' => 'pê şuxulnayişê [http://qbnz.com/highlighter/ GeSHi Highlighter] i rêza <code>&lt;syntaxhighlight&gt;</code> i işaret beno',
+ 'syntaxhighlight-specify' => 'zey ıni yew zıwan bıvıcinê:',
+ 'syntaxhighlight-supported' => 'Zıwanê ke rêzerêzê desteg benê:',
+ 'syntaxhighlight-err-loading' => '(lista zıwananê ke xetaya barkerdışi desteg gêna)',
+ 'syntaxhighlight-err-language' => 'zıwano nemeqbul',
+ 'geshi.css' => 'CSS o ke tiya /* de yo, işaretê rêzvateyê GeSHi tetbiq beno */',
+);
+
+/** Lower Sorbian (dolnoserbski)
+ * @author Michawiki
+ */
+$messages['dsb'] = array(
+ 'syntaxhighlight-desc' => 'Zmóžnja syntaksowe wuzwignjenje <code>&lt;syntaxhighlight&gt;</code> z pomocu [http://qbnz.com/highlighter/ rěda GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Musyš rěc kaž slědujo pódaś:',
+ 'syntaxhighlight-supported' => 'Pódpěrane rěcy za syntaksowe wuzwignjenje:',
+ 'syntaxhighlight-err-loading' => '(zmólka pśi zacytowanju lisćiny pódpěranych rěcow)',
+ 'syntaxhighlight-err-language' => 'Njepłaśiwa rěc.',
+ 'geshi.css' => '/* How pódaty CSS nałožujo se na syntaksowe wuzwignjenje GeSHi */',
+);
+
+/** Greek (Ελληνικά)
+ * @author Badseed
+ * @author Consta
+ * @author Dead3y3
+ * @author ZaDiak
+ */
+$messages['el'] = array(
+ 'syntaxhighlight-desc' => 'ΠαÏέχει έμφαση σÏνταξης <code>&lt;syntaxhighlight&gt;</code> χÏησιμοποιώντας το [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'ΠÏέπει να επιλέξετε μια γλώσσα σαν κι αυτήν:',
+ 'syntaxhighlight-supported' => 'ΥποστηÏιζόμενες γλώσσες για επισημάνσεις συντακτικοÏ',
+ 'syntaxhighlight-err-loading' => '(λάθος στη φόÏτωση της λίστας των υποστηÏιζόμενων γλωσσών)',
+ 'syntaxhighlight-err-language' => 'ΆκυÏη γλώσσα.',
+ 'geshi.css' => '/* Το CSS τοποθετημένο εδώ θα εφαÏμοστεί στo GeSHi syntax highlighting */',
+);
+
+/** Esperanto (Esperanto)
+ * @author Michawiki
+ * @author Yekrats
+ */
+$messages['eo'] = array(
+ 'syntaxhighlight-desc' => 'Provizas kolorigado de sintakso <code>&lt;syntaxhighlight&gt;</code> per [http://qbnz.com/highlighter/ GeSHi Kolorigilo de Sintakso]',
+ 'syntaxhighlight-specify' => 'Vi nepre specifu lingvon kiel ĉi tiu:',
+ 'syntaxhighlight-supported' => 'Subtenaj lingvoj por sintaksa emfazo',
+ 'syntaxhighlight-err-loading' => '(eraro ÅarÄante subtenitan lingvo-liston)',
+ 'syntaxhighlight-err-language' => 'Malvalida lingvo.',
+ 'geshi.css' => '/* CSS enigita ĉi tie estos sintakse emfazita de GeSHi */',
+);
+
+/** Spanish (español)
+ * @author Crazymadlover
+ * @author Muro de Aguas
+ * @author Remember the dot
+ * @author Sanbec
+ */
+$messages['es'] = array(
+ 'syntaxhighlight-desc' => 'Permite resaltar el código fuente usando la etiqueta <code>&lt;syntaxhighlight&gt;</code>. Esta extensión usa [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Necesita especificar un idioma como esto:',
+ 'syntaxhighlight-supported' => 'lenguajes soportados para sintaxis remarcada:',
+ 'syntaxhighlight-err-loading' => '(error cargando lista de lenguajes soportados)',
+ 'syntaxhighlight-err-language' => 'Idioma no válido.',
+ 'geshi.css' => '/* El código CSS situado aquí afectará al resaltado de sintaxis de GeSHi */',
+);
+
+/** Estonian (eesti)
+ * @author Pikne
+ * @author [[et:Kasutaja:M2s17]]
+ */
+$messages['et'] = array(
+ 'syntaxhighlight-desc' => 'Võimaldab [http://qbnz.com/highlighter/ GeSHi] abil <code>&lt;syntaxhighlight&gt;</code>-silti kasutades süntaksit esile tõsta.',
+ 'syntaxhighlight-specify' => 'Sa pead täpsustama keelt nõnda:',
+ 'syntaxhighlight-supported' => 'Süntaksi esiletoomise on toetatud järgnevates keeltes:',
+ 'syntaxhighlight-err-loading' => '(toetatud keelte loetelu laadimisel esines viga)',
+ 'syntaxhighlight-err-language' => 'antud keel on mittekehtiv',
+ 'geshi.css' => '/* CSS mis on asetatud siia, määrab GeSHi süntaksi esiletoomise stiili */',
+);
+
+/** Basque (euskara)
+ * @author An13sa
+ */
+$messages['eu'] = array(
+ 'syntaxhighlight-specify' => 'Hizkuntza bat zehaztu behar duzu honela:',
+ 'syntaxhighlight-err-language' => 'Baliogabeko hizkuntza.',
+);
+
+/** Persian (Ùارسی)
+ * @author Ebraminio
+ * @author Huji
+ */
+$messages['fa'] = array(
+ 'syntaxhighlight-desc' => 'امکان رنگین کردن دستورات <code>&lt;syntaxhighlight&gt;</code> با استÙاده از [http://qbnz.com/highlighter/ GeSHi Highlighter] را Ùراهم می‌آورد',
+ 'syntaxhighlight-specify' => 'شما باید به این شکل زبانی را مشخص کنید:',
+ 'syntaxhighlight-supported' => 'زبان‌های پشتیبانی‌شده برای رنگین‌کردن دستورات:',
+ 'syntaxhighlight-err-loading' => '(خطا در بارگذاری Ùهرست زبان‌های پشتیبانی‌شده)',
+ 'syntaxhighlight-err-language' => 'زبان غیرمجاز.',
+ 'geshi.css' => '/* دستورات CSS اینجا توسط سامانه رنگین‌کردن دستورات GeSHi به کار گرÙته می‌شوند */',
+);
+
+/** Finnish (suomi)
+ * @author Crt
+ * @author Nike
+ */
+$messages['fi'] = array(
+ 'syntaxhighlight-desc' => 'Mahdollistaa syntaksin korostuksen [http://qbnz.com/highlighter/ GeSHillä] <code>&lt;syntaxhighlight&gt;</code>-elementtiä käyttämällä.',
+ 'syntaxhighlight-specify' => 'Kieli pitää määritellä seuraavasti:',
+ 'syntaxhighlight-supported' => 'Syntaksinkorostus on mahdollista seuraaville kielille:',
+ 'syntaxhighlight-err-loading' => '(tuettujen kielten luettelon lataaminen epäonnistui)',
+ 'syntaxhighlight-err-language' => 'Kelpaamaton kieli.',
+ 'geshi.css' => '/* Tänne lisätty CSS vaikuttaa GeSHi-syntaksinkorostukseen */',
+);
+
+/** French (français)
+ * @author Grondin
+ * @author Sherbrooke
+ * @author Verdy p
+ */
+$messages['fr'] = array(
+ 'syntaxhighlight-desc' => 'Fournit la mise en relief de la syntaxe par la balise <code>&lt;syntaxhighlight&gt;</code> en utilisant [http://qbnz.com/highlighter/ la coloration syntaxique GeSHi]',
+ 'syntaxhighlight-specify' => 'Vous devez spécifier un langage comme ceci :',
+ 'syntaxhighlight-supported' => 'Langages supportés pour la coloration syntaxique :',
+ 'syntaxhighlight-err-loading' => '(erreur en chargeant la liste des langages supportés)',
+ 'syntaxhighlight-err-language' => 'Langage invalide',
+ 'geshi.css' => '/* Le code CSS inséré ici sera appliqué à la coloration syntaxique GeSHi. */',
+);
+
+/** Franco-Provençal (arpetan)
+ * @author ChrisPtDe
+ */
+$messages['frp'] = array(
+ 'syntaxhighlight-desc' => 'Balye la misa en èvidence de la sintaxa per la balisa <code>&lt;syntaxhighlight&gt;</code> en utilisent [http://qbnz.com/highlighter/ la coloracion sintaxica GeSHi].',
+ 'syntaxhighlight-specify' => 'Vos dête spècefiar un lengâjo d’ense :',
+ 'syntaxhighlight-supported' => 'Lengâjos recognus por la coloracion sintaxica :',
+ 'syntaxhighlight-err-loading' => '(èrror en chargient la lista des lengâjos recognus)',
+ 'syntaxhighlight-err-language' => 'Lengâjo envalido.',
+ 'geshi.css' => '/* Lo code CSS betâ ique serat aplicâ a la coloracion sintaxica GeSHi. */',
+);
+
+/** Friulian (furlan)
+ * @author Klenje
+ */
+$messages['fur'] = array(
+ 'syntaxhighlight-supported' => 'Lengaç par cui si pues colorâ la sintassi:',
+);
+
+/** Irish (Gaeilge)
+ * @author Alison
+ */
+$messages['ga'] = array(
+ 'syntaxhighlight-err-language' => 'Teanga neamhbhailí.',
+);
+
+/** Galician (galego)
+ * @author Toliño
+ * @author Xosé
+ */
+$messages['gl'] = array(
+ 'syntaxhighlight-desc' => 'Proporciona unha sintaxe resaltada <code>&lt;syntaxhighlight&gt;</code> usando [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Ten que especificar unha lingua, así:',
+ 'syntaxhighlight-supported' => 'Linguas soportadas para resaltar a sintaxe:',
+ 'syntaxhighlight-err-loading' => '(erro ao cargar a lista de linguas soportadas)',
+ 'syntaxhighlight-err-language' => 'A lingua non é válida.',
+ 'geshi.css' => '/* O CSS colocado aquí será aplicado ao resalte da sintaxe de GeSHi */',
+);
+
+/** Ancient Greek (ἈÏχαία ἑλληνικὴ)
+ * @author Omnipaedista
+ */
+$messages['grc'] = array(
+ 'syntaxhighlight-err-language' => 'ἌκυÏος γλῶττα.',
+);
+
+/** Swiss German (Alemannisch)
+ * @author Als-Holder
+ */
+$messages['gsw'] = array(
+ 'syntaxhighlight-desc' => 'Syntax firihebe <code>&lt;syntaxhighlight&gt;</code> mit Hilf vum [http://qbnz.com/highlighter/ GeSHi-Highlighter]',
+ 'syntaxhighlight-specify' => 'Di gwinscht Sproch muess eso definiert wäre:',
+ 'syntaxhighlight-supported' => 'Unterstitzti Sproche fir s Fiirihebe vu dr Syntax:',
+ 'syntaxhighlight-err-loading' => '(Fehler bim Lade vu dr Sprochelischt)',
+ 'syntaxhighlight-err-language' => 'Nit giltigi Sproch.',
+ 'geshi.css' => '/* CSS in däre MediaWiki-Syschtemnochricht wird uf s GeSHi-Syntax-Firihebe aagwändet */',
+);
+
+/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @author Ashok modhvadia
+ */
+$messages['gu'] = array(
+ 'syntaxhighlight-supported' => 'વાકà«àª¯àª°àªšàª¨àª¾ સà«àªªàª·à«àªŸà«€àª•àª°àª£ માટે સહાયક ભાષાઓ:',
+ 'syntaxhighlight-err-loading' => '(સહાયક ભાષા યાદી લાદણમાં તà«àª°à«àªŸàª¿)',
+ 'syntaxhighlight-err-language' => 'અમાનà«àª¯ ભાષા.',
+);
+
+/** Hebrew (עברית)
+ * @author Rotem Liss
+ */
+$messages['he'] = array(
+ 'syntaxhighlight-desc' => '×פשרות לסימון קוד מקור ×‘×¦×‘×¢×™× ×¢× ×”×ª×’×™×ª <code>&lt;syntaxhighlight&gt;</code> ב×מצעות [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => '×¢×œ×™×›× ×œ×¦×™×™×Ÿ שפה ב×ופן הב×:',
+ 'syntaxhighlight-supported' => 'שפות נתמכות:',
+ 'syntaxhighlight-err-loading' => '(שגי××” בטעינת הרשימה של השפות הנתמכות)',
+ 'syntaxhighlight-err-language' => 'שפה שגויה.',
+ 'geshi.css' => '/* סגנונות CSS שייכתבו ×›×ן יפעלו על התגית source */',
+);
+
+/** Hindi (हिनà¥à¤¦à¥€)
+ * @author Kaustubh
+ * @author Shyam
+ */
+$messages['hi'] = array(
+ 'syntaxhighlight-desc' => '[http://qbnz.com/highlighter/ GeSHi Highlighter] पà¥à¤°à¤¯à¥‹à¤— करके चिनà¥à¤¹à¤¾à¤‚कित <code>&lt;syntaxhighlight&gt;</code> वाकà¥à¤¯ विशà¥à¤²à¥‡à¤·à¤£ उपलबà¥à¤§ करता है',
+ 'syntaxhighlight-specify' => 'आपने इसपà¥à¤°à¤•à¤¾à¤° भाषा देना जरूरी हैं:',
+ 'syntaxhighlight-supported' => 'सिनà¥à¤Ÿà¥…कà¥à¤¸ हायलायटींग निमà¥à¤¨à¤²à¤¿à¤–ित भाषाओंके लिये उपलबà¥à¤§ हैं:',
+ 'syntaxhighlight-err-loading' => '(सपोरà¥à¤Ÿà¥‡à¤¡ भाषाओंकी सूची नहीं दरà¥à¤¶à¤¾ पा रहें हैं)',
+ 'syntaxhighlight-err-language' => 'अवैध भाषा।',
+ 'geshi.css' => '/* यहाठपर उपसà¥à¤¥à¤¿à¤¤ CSS GeSHi चिनà¥à¤¹à¤¾à¤‚कित वाकà¥à¤¯ विशà¥à¤²à¥‡à¤·à¤£ पर पà¥à¤°à¤¯à¥‹à¤— किठजायेंगे */',
+);
+
+/** Croatian (hrvatski)
+ * @author Dalibor Bosits
+ * @author Roberta F.
+ * @author SpeedyGonsales
+ */
+$messages['hr'] = array(
+ 'syntaxhighlight-desc' => 'Omogućava bojanje sintakse <code>&lt;syntaxhighlight&gt;</code> korištenjem [http://qbnz.com/highlighter/ GeSHi Highlighter-a]',
+ 'syntaxhighlight-specify' => 'Molimo navedite jezik na slijedeći naÄin:',
+ 'syntaxhighlight-supported' => 'Jezici podržani za bojanje sintakse:',
+ 'syntaxhighlight-err-loading' => '(pogrjeÅ¡ka pri uÄitavanju popisa podržanih jezika)',
+ 'syntaxhighlight-err-language' => 'Nevaljani jezik.',
+ 'geshi.css' => '/* CSS kod napisan ovdje će biti primijenjen na GeSHi bojanje sintakse */',
+);
+
+/** Upper Sorbian (hornjoserbsce)
+ * @author Michawiki
+ */
+$messages['hsb'] = array(
+ 'syntaxhighlight-desc' => 'Syntaksowe wuzběhnjenje <code>&lt;syntaxhighlight&gt;</code> z pomocu rozšěrjenja [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'DyrbiÅ¡ rÄ›Ä takle definować:',
+ 'syntaxhighlight-supported' => 'PodpÄ›rowane rÄ›Äe za syntaksowe wuzbÄ›hnjenje:',
+ 'syntaxhighlight-err-loading' => '(Zmylk pÅ™i zaÄitanju lisćiny rÄ›Äow)',
+ 'syntaxhighlight-err-language' => 'NjepÅ‚aćiwa rÄ›Ä.',
+ 'geshi.css' => '/* CSS w tutej zdźělence so na syntaksowe wuzběhnjenje GeSHi nałoži */',
+);
+
+/** Hungarian (magyar)
+ * @author Dani
+ */
+$messages['hu'] = array(
+ 'syntaxhighlight-desc' => 'Lehetőséget nyújt szintaxiskiemelésre a <code>&lt;syntaxhighlight&gt;</code> tag-gel, a [http://qbnz.com/highlighter/ GeSHi Highlighter] használatával',
+ 'syntaxhighlight-specify' => 'Meg kell adnod egy nyelvet az alábbi módon:',
+ 'syntaxhighlight-supported' => 'Támogatott programozási nyelvek:',
+ 'syntaxhighlight-err-loading' => '(hiba történt a támogatott nyelvek listájának betöltése közben)',
+ 'syntaxhighlight-err-language' => 'Érvénytelen nyelv.',
+ 'geshi.css' => '/* Az itt elhelyezett CSS-t fogja alkalmazni a GeSHi szintaxiskiemelő */',
+);
+
+/** Interlingua (interlingua)
+ * @author McDutchie
+ */
+$messages['ia'] = array(
+ 'syntaxhighlight-desc' => 'Forni le coloration syntactic in <code>&lt;syntaxhighlight&gt;</code> per medio de [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Tu debe specificar un linguage in iste modo:',
+ 'syntaxhighlight-supported' => 'Linguages supportate pro le coloration syntactic:',
+ 'syntaxhighlight-err-loading' => '(error durante le cargamento del lista de linguages supportate)',
+ 'syntaxhighlight-err-language' => 'Linguage invalide.',
+ 'geshi.css' => '/* Omne CSS inserite hic se applicara al coloration syntactic con GeSHi */',
+);
+
+/** Indonesian (Bahasa Indonesia)
+ * @author IvanLanin
+ */
+$messages['id'] = array(
+ 'syntaxhighlight-desc' => 'Memberikan penyorotan sintaks <code>&lt;syntaxhighlight&gt;</code> menggunakan [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Anda harus menentukan suatu bahasa seperti ini:',
+ 'syntaxhighlight-supported' => 'Bahasa-bahasa yang didukung oleh pewarnaan sintaks:',
+ 'syntaxhighlight-err-loading' => '(kesalahan pemuatan daftar bahasa yang didukung)',
+ 'syntaxhighlight-err-language' => 'Bahasa tak sah.',
+ 'geshi.css' => '/* CSS di sini akan diterapkan untuk penyorotan sintaks GeSHi */',
+);
+
+/** Interlingue (Interlingue)
+ * @author Renan
+ */
+$messages['ie'] = array(
+ 'syntaxhighlight-desc' => 'Provide superation de sintaxe de li code fonte, che li element <code>&lt;syntaxhighlight&gt;</code>, usant li [http://qbnz.com/highlighter/ GeSHi - Generic Syntax Highlighter]',
+ 'syntaxhighlight-specify' => 'Vu besona specificar li lingue quam ti:',
+ 'syntaxhighlight-supported' => 'Lingues suportat por superation de sintaxe:',
+ 'syntaxhighlight-err-language' => 'Lingue ínvalid.',
+);
+
+/** Igbo (Igbo)
+ * @author Ukabia
+ */
+$messages['ig'] = array(
+ 'syntaxhighlight-err-language' => 'Asụsụ ámághị.',
+);
+
+/** Ido (Ido)
+ * @author Malafaya
+ */
+$messages['io'] = array(
+ 'syntaxhighlight-err-language' => 'Ne-valida linguo.',
+);
+
+/** Italian (italiano)
+ * @author BrokenArrow
+ */
+$messages['it'] = array(
+ 'syntaxhighlight-desc' => 'Evidenzia la sintassi dei linguaggi di programmazione <code>&lt;syntaxhighlight&gt;</code> tramite [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'È necessario specificare un linguaggio in questo modo:',
+ 'syntaxhighlight-supported' => 'Linguaggi di cui è possibile evidenziare la sintassi in colore:',
+ 'syntaxhighlight-err-loading' => "(errore nel caricamento dell'elenco dei linguaggi supportati)",
+ 'syntaxhighlight-err-language' => 'Linguaggio non riconosciuto.',
+ 'geshi.css' => "/* Gli stili CSS inseriti qui si applicano all'evidenziazione di sintassi con GeSHi */",
+);
+
+/** Japanese (日本語)
+ * @author Aotake
+ * @author Fryed-peach
+ * @author JtFuruhata
+ * @author Shirayuki
+ */
+$messages['ja'] = array(
+ 'syntaxhighlight-desc' => '[http://qbnz.com/highlighter/ GeSHi 構文ãƒã‚¤ãƒ©ã‚¤ãƒˆæ©Ÿèƒ½] を利用ã—ãŸã‚¿ã‚° <code>&lt;syntaxhighlight&gt;</code> ã‚’æä¾›ã™ã‚‹',
+ 'syntaxhighlight-specify' => '以下ã®ã‚ˆã†ã«è¨€èªžã‚’指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™:',
+ 'syntaxhighlight-supported' => '構文ãƒã‚¤ãƒ©ã‚¤ãƒˆæ©Ÿèƒ½ã«å¯¾å¿œã—ã¦ã„る言語ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:',
+ 'syntaxhighlight-err-loading' => '(対応言語一覧ã®èª­ã¿è¾¼ã¿æ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ)',
+ 'syntaxhighlight-err-language' => '無効ãªè¨€èªžã§ã™ã€‚',
+ 'geshi.css' => '/* ã“ã“ã«è¨˜è¿°ã—ãŸCSSã¯GeSHi構文ãƒã‚¤ãƒ©ã‚¤ãƒˆæ©Ÿèƒ½ã«é©ç”¨ã•ã‚Œã¾ã™ */',
+);
+
+/** Jutish (jysk)
+ * @author Huslåke
+ * @author Ælsån
+ */
+$messages['jut'] = array(
+ 'syntaxhighlight-desc' => 'Gäv syntaks highlighting <code>&lt;syntaxhighlight&gt;</code> via [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Du nødst til spæsifiær en språg als dette:',
+ 'syntaxhighlight-supported' => 'Understønde språg før syntaks highlighting:',
+ 'syntaxhighlight-err-loading' => '(fejl lægende understønde språg liste)',
+ 'syntaxhighlight-err-language' => 'Fejl språg.',
+ 'geshi.css' => '/* CSS platsk her hvil være appliærn til GeSHi syntaks highlighting */',
+);
+
+/** Javanese (Basa Jawa)
+ * @author Meursault2004
+ */
+$messages['jv'] = array(
+ 'syntaxhighlight-desc' => 'Mènèhaké panyorotan sintaksis <code>&lt;syntaxhighlight&gt;</code> nganggo [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Panjenengan kudu nentokaké sawijining basa kaya iki:',
+ 'syntaxhighlight-supported' => 'Basa-basa sing disengkuyung déning panandhan werna sintaksis:',
+ 'syntaxhighlight-err-loading' => '(ana kaluputan ngunggahaké daftar basa sing disengkuyung)',
+ 'syntaxhighlight-err-language' => 'Basané ora absah.',
+ 'geshi.css' => '/* CSS ing kéné bakal ditrapaké kanggo panyorotan sintaksis GeSHi */',
+);
+
+/** Georgian (ქáƒáƒ áƒ—ული)
+ * @author გიáƒáƒ áƒ’იმელáƒ
+ */
+$messages['ka'] = array(
+ 'syntaxhighlight-desc' => 'გáƒáƒ«áƒšáƒ”ვთ ნებáƒáƒ áƒ—ვáƒáƒ¡ ფáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— თეგი <code>&lt;syntaxhighlight&gt;</code> სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ გáƒáƒ¡áƒáƒœáƒáƒ—ებლáƒáƒ“[http://qbnz.com/highlighter/ GeSHi Highlighter-ის] მეშვეáƒáƒ‘ით',
+ 'syntaxhighlight-specify' => 'თქვენ უნდრწáƒáƒ áƒáƒ“გინáƒáƒ— სáƒáƒ®áƒ”ლი შემდეგი სáƒáƒ®áƒ˜áƒ—:',
+ 'syntaxhighlight-supported' => 'მხáƒáƒ áƒ“áƒáƒ›áƒ­áƒ”რი áƒáƒ®áƒ”ლები',
+ 'syntaxhighlight-err-loading' => '(შეუძებელირმხáƒáƒ áƒ“áƒáƒ›áƒ­áƒ”რი ენების სიის áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ)',
+ 'syntaxhighlight-err-language' => 'მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რის áƒáƒ áƒ›áƒ¥áƒáƒœáƒ” ენáƒ',
+ 'geshi.css' => '/* áƒáƒ¥ წáƒáƒ áƒ›áƒáƒ“გენილი CSS-კáƒáƒ“ი, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრGeSHI სნტáƒáƒ¥áƒ¡áƒ˜áƒ¡ გáƒáƒ¡áƒáƒœáƒáƒ—ებლáƒáƒ“*/',
+);
+
+/** Kazakh (Arabic script) (قازاقشا (تٴوتە)â€)
+ * @author AlefZet
+ */
+$messages['kk-arab'] = array(
+ 'syntaxhighlight-specify' => 'ٴتىلدى بىلايشا كورسەتۋىڭىز قاجەت:',
+ 'syntaxhighlight-supported' => 'سىينتاكسىيسى كومەسكى جارىقتالاتىن سۇيەمەلدەنگەن تىلدەر:',
+ 'syntaxhighlight-err-loading' => '(سۇيەمەلدەنگەن تىلدەر ٴتىزىمىن جۇكتەۋ قاتەسى)',
+ 'syntaxhighlight-err-language' => 'جارامسىز ٴتىل.',
+ 'geshi.css' => '/* مىنداعى CSS امىرلەرى GeSHi سىينتاكسىيستى كومەسكى جارىقتاۋعا قولدانىلادى */',
+);
+
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author AlefZet
+ */
+$messages['kk-cyrl'] = array(
+ 'syntaxhighlight-specify' => 'Тілді былайша көрÑетуіңіз қажет:',
+ 'syntaxhighlight-supported' => 'СинтакÑиÑÑ– көмеÑкі жарықталатын Ñүйемелденген тілдер:',
+ 'syntaxhighlight-err-loading' => '(Ñүйемелденген тілдер тізімін жүктеу қатеÑÑ–)',
+ 'syntaxhighlight-err-language' => 'ЖарамÑыз тіл.',
+ 'geshi.css' => '/* Мындағы CSS әмірлері GeSHi ÑинтакÑиÑÑ‚Ñ– көмеÑкі жарықтауға қолданылады */',
+);
+
+/** Kazakh (Latin script) (qazaqşa (latın)‎)
+ * @author AlefZet
+ */
+$messages['kk-latn'] = array(
+ 'syntaxhighlight-specify' => 'Tildi bılaýşa körsetwiñiz qajet:',
+ 'syntaxhighlight-supported' => 'Sïntaksïsi kömeski jarıqtalatın süýemeldengen tilder:',
+ 'syntaxhighlight-err-loading' => '(süýemeldengen tilder tizimin jüktew qatesi)',
+ 'syntaxhighlight-err-language' => 'Jaramsız til.',
+ 'geshi.css' => '/* Mındağı CSS ämirleri GeSHi sïntaksïsti kömeski jarıqtawğa qoldanıladı */',
+);
+
+/** Khmer (ភាសាážáŸ’មែរ)
+ * @author Chhorran
+ * @author គីមស៊្រុន
+ */
+$messages['km'] = array(
+ 'syntaxhighlight-specify' => 'អ្នកចាំបាច់ សំដៅ មួយភាសា ដូច áž“áŸáŸ‡ ៖',
+ 'syntaxhighlight-err-loading' => '(បញ្ហាក្នុងការរៀបចំបញ្ជីភាសាដែលប្រើបាន)',
+ 'syntaxhighlight-err-language' => 'ភាសា គ្មានសុពលភាព ។',
+);
+
+/** Korean (한국어)
+ * @author Kwj2772
+ * @author ToePeu
+ * @author ì•„ë¼
+ */
+$messages['ko'] = array(
+ 'syntaxhighlight-desc' => '<code>&lt;syntaxhighlight&gt;</code> 태그로 [http://qbnz.com/highlighter/ GeSHi Highlighter]를 ì´ìš©í•´ 문법 ê°•ì¡° ê¸°ëŠ¥ì„ ì§€ì›í•©ë‹ˆë‹¤.',
+ 'syntaxhighlight-specify' => '오른쪽과 ê°™ì´ ì–¸ì–´ë¥¼ 설정해야 합니다:',
+ 'syntaxhighlight-supported' => '문법 ê°•ì¡°ê°€ 지ì›ë˜ëŠ” 언어 목ë¡',
+ 'syntaxhighlight-err-loading' => '(지ì›í•˜ëŠ” 언어 목ë¡ì„ 불러오는 중 오류 ë°œìƒ)',
+ 'syntaxhighlight-err-language' => 'ìž˜ëª»ëœ ì–¸ì–´ìž…ë‹ˆë‹¤.',
+ 'geshi.css' => '/* ì´ ë¬¸ì„œì—ì„œ 설정한 CSS는 GeSHiì— ì ìš©ë©ë‹ˆë‹¤. */',
+);
+
+/** Colognian (Ripoarisch)
+ * @author Purodha
+ */
+$messages['ksh'] = array(
+ 'syntaxhighlight-desc' => 'Deijt — en <code>&lt;syntaxhighlight&gt;</code>-Affschnedde — de Syntax fon beshtemmpte Computer-Shprooche makeere. Bruch dobei dä [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Mer moß en Shprooch aanjevve, esu en dä Aat wi hee:',
+ 'syntaxhighlight-supported' => 'Di Shprooche, dänne ier Syntax mer makeere könne, sin:',
+ 'syntaxhighlight-err-loading' => '(Enne Fääler es opjetrodde, wi mer de Leß met de Shprooch laade wollte)',
+ 'syntaxhighlight-err-language' => 'Di Schprooch kenne mer nit.',
+ 'geshi.css' => '/* Dat es dat CCS för de Afschnedde med däm GeSHi syntax highlighting */',
+);
+
+/** Luxembourgish (Lëtzebuergesch)
+ * @author Les Meloures
+ * @author Robby
+ */
+$messages['lb'] = array(
+ 'syntaxhighlight-desc' => "Syntax-Ervirhiewung <code>&lt;syntaxhighlight&gt;</code> mat Hëllef vu [http://qbnz.com/highlighter/ 'GeSHi Highlighter']",
+ 'syntaxhighlight-specify' => 'Déi gewënscht Sprooch muss esou definéiert ginn:',
+ 'syntaxhighlight-supported' => "Ënnerstëtzte Sprooche fir d'Syntax faarweg ze markéieren",
+ 'syntaxhighlight-err-loading' => '(Feeler beim Luede vun der Lëscht vun den ënnerstëtzte Sproochen)',
+ 'syntaxhighlight-err-language' => 'Net valabel Sprooch.',
+ 'geshi.css' => "/* Den CSS deen hei steet gëtt benotzt fir d'GeSHi Syntax faarweg ze markéieren. /*",
+);
+
+/** Limburgish (Limburgs)
+ * @author Ooswesthoesbes
+ */
+$messages['li'] = array(
+ 'syntaxhighlight-desc' => 'Guf syntaxismarkering <code>&lt;syntaxhighlight&gt;</code> gebroekende [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => "Gaef 'ne taal es volg op:",
+ 'syntaxhighlight-supported' => 'Óngersteunde täöl veur syntaxismarkering:',
+ 'syntaxhighlight-err-loading' => "(fout bie 't laje vanne lies mit óngersteunde täöl)",
+ 'syntaxhighlight-err-language' => 'Ónzjuuste taal.',
+ 'geshi.css' => '/* Hiej geplaatste CBBS wuuertj toegepas op GeSHo syntax markering */',
+);
+
+/** Lithuanian (lietuvių)
+ * @author Garas
+ * @author Homo
+ * @author Matasg
+ */
+$messages['lt'] = array(
+ 'syntaxhighlight-desc' => 'Teikia sintaksės paryškinimus <code>&lt;syntaxhighlight&gt;</code> naudojant [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Jums reikia nurodyti kalbÄ… kaip Äia:',
+ 'syntaxhighlight-supported' => 'Palaikomos kalbos sintaksės paryškinimui:',
+ 'syntaxhighlight-err-loading' => '(klaida įkeliant palaikomų kalbų sąrašą)',
+ 'syntaxhighlight-err-language' => 'Neleistina kalba.',
+ 'geshi.css' => '/* Čia pateiktas CSS bus taikomas GeSHi sintaksės paryškinimams */',
+);
+
+/** Latvian (latviešu)
+ * @author Papuass
+ */
+$messages['lv'] = array(
+ 'syntaxhighlight-err-language' => 'Nederīga valoda.',
+);
+
+/** Malagasy (Malagasy)
+ * @author Jagwar
+ */
+$messages['mg'] = array(
+ 'syntaxhighlight-err-loading' => "(nisy zavadiso tamin'ilay fampiasan'ny fiteny voazaha)",
+ 'syntaxhighlight-err-language' => 'Diso fiteny',
+);
+
+/** Macedonian (македонÑки)
+ * @author Bjankuloski06
+ */
+$messages['mk'] = array(
+ 'syntaxhighlight-desc' => 'Овозможува потцртување на ÑинтакÑа <code>&lt;syntaxhighlight&gt;</code> Ñо помош на [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Треба да наведете јазик на Ñледниов начин:',
+ 'syntaxhighlight-supported' => 'Поддржани јазици за ÑинтакÑно потцртување:',
+ 'syntaxhighlight-err-loading' => '(грешка при вчитувањето на ÑпиÑокот на поддржани јазици)',
+ 'syntaxhighlight-err-language' => 'Ðеважечки јазик.',
+ 'geshi.css' => '/* Тука поÑтавениот CSS-код ќе биде применет во GeSHi потцртување на ÑинтакÑата */',
+);
+
+/** Malayalam (മലയാളം)
+ * @author Praveenp
+ * @author Shijualex
+ */
+$messages['ml'] = array(
+ 'syntaxhighlight-desc' => '[http://qbnz.com/highlighter/ GeSHi à´ªàµà´°à´®àµà´–മാകàµà´•àµ½ ഉപകരണമàµà´ªà´¯àµ‹à´—à´¿à´šàµà´šàµ] <code>&lt;syntaxhighlight&gt;</code> വിനàµà´¯à´¾à´¸à´‚ à´ªàµà´°à´®àµà´–മാകàµà´•à´¿à´•àµà´•à´¾à´Ÿàµà´Ÿà´¾àµ» സഹായികàµà´•àµà´¨àµà´¨àµ',
+ 'syntaxhighlight-specify' => 'താങàµà´•àµ¾ ഇപàµà´°à´•à´¾à´°à´‚ ഒരൠഭാഷ തിരഞàµà´žàµ†à´Ÿàµà´•àµà´•à´£à´‚:',
+ 'syntaxhighlight-supported' => 'സിറàµà´±à´¾à´•àµà´¸àµ ഹൈലൈറàµà´±à´¿à´™àµà´™àµ à´…à´¨àµà´•àµ‚ലികàµà´•àµà´¨àµà´¨ ഭാഷകൾ:',
+ 'syntaxhighlight-err-loading' => '(പിനàµà´¤àµà´£à´¯àµà´³àµà´³ ഭാഷകളàµà´Ÿàµ† പടàµà´Ÿà´¿à´• ശേഖരികàµà´•àµà´¨àµà´¨à´¤à´¿àµ½ പിഴവàµ)',
+ 'syntaxhighlight-err-language' => 'അസാധàµà´µà´¾à´¯ ഭാഷ.',
+ 'geshi.css' => '/* ഇവിടെ നൽകàµà´¨àµà´¨ സി.à´Žà´¸àµ.à´Žà´¸àµ. GeSHi വിനàµà´¯à´¾à´¸à´‚ à´ªàµà´°à´®àµà´–മാകàµà´•à´¿à´•àµà´•à´¾à´Ÿàµà´Ÿà´²à´¿à´¨àµ ബാധകമായിതàµà´¤àµ€à´°àµà´‚ */',
+);
+
+/** Marathi (मराठी)
+ * @author Kaustubh
+ * @author Mahitgar
+ * @author Shantanoo
+ */
+$messages['mr'] = array(
+ 'syntaxhighlight-desc' => '[http://qbnz.com/highlighter/ GeSHi हायलायटर] वापरून सिनà¥à¤Ÿà¥…कà¥à¤¸ हायलाईट करा <code>&lt;syntaxhighlight&gt;</code>',
+ 'syntaxhighlight-specify' => 'तà¥à¤®à¥à¤¹à¥€ यापà¥à¤°à¤®à¤¾à¤£à¥‡ भाषा देणे गरजेचे आहे:',
+ 'syntaxhighlight-supported' => 'सिनà¥à¤Ÿà¥…कà¥à¤¸ हायलायटींग खालील भाषांवर वापरता येते:',
+ 'syntaxhighlight-err-loading' => '(साहायà¥à¤¯ देणाऱà¥à¤¯à¤¾ भाषांची यादी दाखविणà¥à¤¯à¤¾à¤¸ असमरà¥à¤¥)',
+ 'syntaxhighlight-err-language' => 'गैरलागू भाषा',
+ 'geshi.css' => '/* इथे लिहिलेले CSS GeSHi सिनà¥à¤Ÿà¥…कà¥à¤¸ हायलायटींग साठी वापरले जाईल */',
+);
+
+/** Malay (Bahasa Melayu)
+ * @author Aviator
+ */
+$messages['ms'] = array(
+ 'syntaxhighlight-desc' => 'Menyediakan tag <code>&lt;syntaxhighlight&gt;</code> untuk penonjolan sintaks menggunakan [http://qbnz.com/highlighter/ GeSHi]',
+ 'syntaxhighlight-specify' => 'Anda hendaklah menyatakan bahasa seperti ini:',
+ 'syntaxhighlight-supported' => 'Bahasa-bahasa yang disokong untuk penonjolan sintaks:',
+ 'syntaxhighlight-err-loading' => '(berlaku ralat ketika memuat senarai bahasa yang disokong)',
+ 'syntaxhighlight-err-language' => 'Bahasa tidak sah.',
+ 'geshi.css' => '/* CSS yang diletakkan di sini akan dikenakan kepada penonjolan sintaks GeSHi */',
+);
+
+/** Nahuatl (NÄhuatl)
+ * @author Fluence
+ * @author Teòtlalili
+ */
+$messages['nah'] = array(
+ 'syntaxhighlight-err-language' => 'Âmò kualli tlâtòlli',
+);
+
+/** Norwegian Bokmål (norsk (bokmål)‎)
+ */
+$messages['nb'] = array(
+ 'syntaxhighlight-desc' => 'Gir syntaks som framhever <code>&lt;syntaxhighlight&gt;</code> ved hjelp av [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Du må angi et språk slik:',
+ 'syntaxhighlight-supported' => 'Støttede språk for syntaksutheving:',
+ 'syntaxhighlight-err-loading' => '(feil under last av liste over støttede språk)',
+ 'syntaxhighlight-err-language' => 'Ugyldig språk.',
+ 'geshi.css' => '/* CSS plassert her gjelder GeSHi syntaksutheving */',
+);
+
+/** Low German (Plattdüütsch)
+ * @author Slomox
+ */
+$messages['nds'] = array(
+ 'syntaxhighlight-desc' => 'Syntax-Rutheven <code>&lt;syntaxhighlight&gt;</code> mit Help vun’n [http://qbnz.com/highlighter/ GeSHi-Highlighter]',
+ 'syntaxhighlight-specify' => 'Du musst op disse Wies en Spraak angeven:',
+ 'syntaxhighlight-supported' => 'Ünnerstütt Spraken för dat Syntax-Rutheven:',
+ 'syntaxhighlight-err-loading' => '(Fehler bi dat Laden vun de Sprakenlist)',
+ 'syntaxhighlight-err-language' => 'Spraak gellt nich.',
+ 'geshi.css' => '/* CSS in disse MediaWiki-Systemnaricht warrt för dat GeSHi-Syntaxrutheven bruukt */',
+);
+
+/** Nedersaksies (Nedersaksies)
+ * @author Servien
+ */
+$messages['nds-nl'] = array(
+ 'syntaxhighlight-err-language' => 'Niet de juuste taal.',
+);
+
+/** Dutch (Nederlands)
+ * @author Siebrand
+ * @author Tvdm
+ */
+$messages['nl'] = array(
+ 'syntaxhighlight-desc' => 'Voorziet in het markeren van syntaxis voor <code>&lt;syntaxhighlight&gt;</code> met [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Geef een taal als volgt op:',
+ 'syntaxhighlight-supported' => 'Ondersteunde talen voor syntaxismarkering:',
+ 'syntaxhighlight-err-loading' => '(fout tijdens het laden van de lijst met ondersteunde talen)',
+ 'syntaxhighlight-err-language' => 'Ongeldige taal.',
+ 'geshi.css' => '/* Hier geplaatste CSS wordt toegepast op GeSHi Syntax Highlighting */',
+);
+
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
+ * @author Frokor
+ */
+$messages['nn'] = array(
+ 'syntaxhighlight-desc' => 'Gjev syntaks som framhevar <code>&lt;syntaxhighlight&gt;</code> ved hjelp av [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Du må gje eit språk slik:',
+ 'syntaxhighlight-supported' => 'Støtta språk for syntaksutheving:',
+ 'syntaxhighlight-err-loading' => '(feil under lasting av liste over støtta språk)',
+ 'syntaxhighlight-err-language' => 'Ugyldig språk.',
+ 'geshi.css' => '/* CSS plassert her gjeld GeSHi syntaksutheving */',
+);
+
+/** Occitan (occitan)
+ * @author Cedric31
+ */
+$messages['oc'] = array(
+ 'syntaxhighlight-desc' => 'Provesís la mesa en relèu de la sintaxi per la balisa <code>&lt;syntaxhighlight&gt;</code> en utilizant [http://qbnz.com/highlighter/ la coloracion sintaxica GeSHi]',
+ 'syntaxhighlight-specify' => 'Vos cal especificar un lengatge coma aquò :',
+ 'syntaxhighlight-supported' => 'Lengatges suportats per la coloracion sintaxica :',
+ 'syntaxhighlight-err-loading' => '(error en cargant la lista dels lengatges suportats)',
+ 'syntaxhighlight-err-language' => 'Lengatge invalid.',
+ 'geshi.css' => '/* Lo còde CSS inserit aicí serà aplicat per GeSHi per la coloracion sintaxica. */',
+);
+
+/** Ossetic (Ирон)
+ * @author Amikeco
+ */
+$messages['os'] = array(
+ 'syntaxhighlight-err-language' => 'РаÑÑ‚ æвзаг нæу.',
+);
+
+/** Deitsch (Deitsch)
+ * @author Xqt
+ */
+$messages['pdc'] = array(
+ 'syntaxhighlight-err-language' => 'Falsch Schprooch',
+);
+
+/** Pälzisch (Pälzisch)
+ * @author Manuae
+ */
+$messages['pfl'] = array(
+ 'syntaxhighlight-specify' => 'Do mugschd ä Schbrooch feschdleesche:',
+ 'syntaxhighlight-err-language' => 'Ugildischi Schbrooch',
+);
+
+/** Polish (polski)
+ * @author Derbeth
+ * @author Sp5uhe
+ */
+$messages['pl'] = array(
+ 'syntaxhighlight-desc' => 'Zapewnia kolorowanie składni dla znacznika <code>&lt;syntaxhighlight&gt;</code> wykorzystując [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Musisz wybrać język w następujący sposób:',
+ 'syntaxhighlight-supported' => 'Języki obsługiwane w podświetlaniu składni:',
+ 'syntaxhighlight-err-loading' => '(błąd przy wczytywaniu listy obsługiwanych języków)',
+ 'syntaxhighlight-err-language' => 'Niepoprawny język.',
+ 'geshi.css' => '/* CSS umieszczony tutaj zostanie użyty do kolorowania składni GeSHi */',
+);
+
+/** Piedmontese (Piemontèis)
+ * @author Bèrto 'd Sèra
+ * @author Dragonòt
+ */
+$messages['pms'] = array(
+ 'syntaxhighlight-desc' => 'A evidensia la sintassi <code>&lt;syntaxhighlight&gt;</code>an dovrand [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'A venta specifiché na lenga coma:',
+ 'syntaxhighlight-supported' => "Lenghe dont as peul fé l'evidensiassion dla sintassi:",
+ 'syntaxhighlight-err-loading' => '(eror ën cariand la lista dle lenghe dont sintassi as peul evidensié)',
+ 'syntaxhighlight-err-language' => 'Lenga nen bon-a',
+ 'geshi.css' => "/* ël CSS piassà ambelessì a sarà aplicà a l'evidensiassion ëd sintassi GeSHi */",
+);
+
+/** Pashto (پښتو)
+ * @author Ahmed-Najib-Biabani-Ibrahimkhel
+ */
+$messages['ps'] = array(
+ 'syntaxhighlight-specify' => 'بايد ØªØ§Ø³Û ÙŠÙˆÙ‡ ژبه په Ø¯Û ØªÙˆÚ«Ù‡ ÚØ§Ù†Ú«Ú“Û Ú©Ú“ÛŒ:',
+ 'syntaxhighlight-err-language' => 'ناسمه ژبه.',
+);
+
+/** Portuguese (português)
+ * @author Hamilton Abreu
+ * @author Malafaya
+ */
+$messages['pt'] = array(
+ 'syntaxhighlight-desc' => 'Permite o realce sintáctico de código fonte, através do elemento <code>&lt;syntaxhighlight&gt;</code>, usando o [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Precisa de especificar uma linguagem assim:',
+ 'syntaxhighlight-supported' => 'Linguagens suportadas no realce de sintaxe:',
+ 'syntaxhighlight-err-loading' => '(erro ao carregar a lista de linguagens suportadas)',
+ 'syntaxhighlight-err-language' => 'Linguagem inválida.',
+ 'geshi.css' => '/* O código CSS aqui colocado será aplicado ao realce de sintaxe GeSHi */',
+);
+
+/** Brazilian Portuguese (português do Brasil)
+ * @author Helder.wiki
+ * @author Heldergeovane
+ */
+$messages['pt-br'] = array(
+ 'syntaxhighlight-desc' => 'Providencia realce de sintaxe <code>&lt;syntaxhighlight&gt;</code> através do [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Você precisa especificar uma linguagem, tal como:',
+ 'syntaxhighlight-supported' => 'Linguagens suportadas no realce de sintaxe:',
+ 'syntaxhighlight-err-loading' => '(erro ao carregar a lista de linguagens suportadas)',
+ 'syntaxhighlight-err-language' => 'Linguagem inválida.',
+ 'geshi.css' => '/* O código CSS aqui colocado será aplicado ao realce de sintaxe GeSHi */',
+);
+
+/** Quechua (Runa Simi)
+ * @author AlimanRuna
+ */
+$messages['qu'] = array(
+ 'syntaxhighlight-err-language' => 'Nisqayki rimayqa manam kanchu.',
+);
+
+/** Romanian (română)
+ * @author AdiJapan
+ * @author KlaudiuMihaila
+ * @author Stelistcristi
+ */
+$messages['ro'] = array(
+ 'syntaxhighlight-desc' => 'Produce evidențierea sintaxei prin baliza <code>&lt;syntaxhighlight&gt;</code> folosind [http://qbnz.com/highlighter/ GeSHi - Generic Syntax Highlighter]',
+ 'syntaxhighlight-specify' => 'Trebuie să specificați o limbă în acest mod:',
+ 'syntaxhighlight-supported' => 'Limbile suportate pentru evidențierea sintaxei:',
+ 'syntaxhighlight-err-loading' => '(eroare la încărcarea listei cu limbile suportate)',
+ 'syntaxhighlight-err-language' => 'Limbă incorectă.',
+ 'geshi.css' => '/* Codul CSS inserat aici se va aplica la evidențierea sintaxei prin GeSHi. */',
+);
+
+/** tarandíne (tarandíne)
+ * @author Joetaras
+ */
+$messages['roa-tara'] = array(
+ 'syntaxhighlight-desc' => "Dè 'na sindasse evidenziate <code>&lt;syntaxhighlight&gt;</code> ausanne [http://qbnz.com/highlighter/ GeSHi l'Evidenziatore]",
+ 'syntaxhighlight-specify' => "Tu, abbesogne de 'na lènga specifiche cumme a queste:",
+ 'syntaxhighlight-supported' => 'Linguagge supportate pa sindasse evidenziate:',
+ 'syntaxhighlight-err-loading' => "(errore carecanne 'a liste de linguagge supportate)",
+ 'syntaxhighlight-err-language' => 'Lénghe invalide.',
+ 'geshi.css' => "/* CSS mise aqquà avène applicate 'a sindasse GeSHi evidenziate */",
+);
+
+/** Russian (руÑÑкий)
+ * @author ÐлекÑандр Сигачёв
+ */
+$messages['ru'] = array(
+ 'syntaxhighlight-desc' => 'ПозволÑет иÑпользовать тег <code>&lt;syntaxhighlight&gt;</code> Ð´Ð»Ñ Ð¿Ð¾Ð´Ñветки ÑинтакÑиÑа Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Ð’Ñ‹ должны указать Ñзык Ñледующим образом:',
+ 'syntaxhighlight-supported' => 'Поддерживаемые Ñзыки:',
+ 'syntaxhighlight-err-loading' => '(невозможно загрузить ÑпиÑок Ñзыков)',
+ 'syntaxhighlight-err-language' => 'Указан неподдерживаемый Ñзык.',
+ 'geshi.css' => '/* CSS-код, размещённый здеÑÑŒ, будет применён Ð´Ð»Ñ Ð¿Ð¾Ð´Ñветки ÑинтакÑиÑа GeSHI */',
+);
+
+/** Rusyn (руÑиньÑкый)
+ * @author Gazeb
+ */
+$messages['rue'] = array(
+ 'syntaxhighlight-desc' => 'Додавать звыразнїна ÑінтакÑÑ–Ñ <code>&lt;syntaxhighlight&gt;</code> за помочі [http://qnbz.com/higlighter звыразнёвача GeSHi]',
+ 'syntaxhighlight-specify' => 'МуÑите Ñтановити Ñзык тым ÑпоÑобом:',
+ 'syntaxhighlight-supported' => 'СпиÑок Ñзыків, у котрый Ñ” підпороване Ð·Ð²Ñ‹Ñ€Ð°Ð·Ð½Ñ‘Ð²Ð°Ð½Ñ ÑінтакÑÑ–Ñ:',
+ 'syntaxhighlight-err-loading' => '(хыба при начітаню ÑпиÑка підпорованых Ñзыків)',
+ 'syntaxhighlight-err-language' => 'Ðеправилный Ñзык.',
+ 'geshi.css' => '/* Гев зазначене CSS буде овпливнёвати Ð·Ð²Ñ‹Ñ€Ð°Ð·Ð½Ñ‘Ð²Ð°Ð½Ñ ÑінтакÑÑ–Ñу GeSHi */',
+);
+
+/** Sakha (Ñаха тыла)
+ * @author HalanTul
+ */
+$messages['sah'] = array(
+ 'syntaxhighlight-desc' => '[http://qbnz.com/highlighter/ GeSHi Highlighter] көмөтүнÑн ÑинтакÑÐ¸Ñ Ð¿Ð¾Ð´Ñветкатын холбуурга <code>&lt;syntaxhighlight&gt;</code> тиÑги туһанар кыах биÑÑ€ÑÑ€.',
+ 'syntaxhighlight-specify' => 'Омугун тылын маннык ыйыахтааххын:',
+ 'syntaxhighlight-supported' => 'ӨйөнүллÑÑ€ тыллара:',
+ 'syntaxhighlight-err-loading' => '(тылларын иÑпииһÑÐ³Ñ ÐºÑ‹Ð°Ð¹Ð°Ð½ көрдөрүллүбÑÑ‚Ñ)',
+ 'syntaxhighlight-err-language' => 'ӨйөнүллүбÑÑ‚ тыл Ñбит.',
+ 'geshi.css' => '/* манна баар CSS-куод GeSHI ÑинтакÑииһын Ñырдатарга туттуллуо */',
+);
+
+/** Sinhala (සිංහල)
+ * @author Calcey
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['si'] = array(
+ 'syntaxhighlight-specify' => 'ඔබට මෙවà·à¶±à·’ භà·à·‚à·à·€à¶šà·Š විà·à·šà·‚ණය කල යුතු වේ:',
+ 'syntaxhighlight-supported' => 'à·€à·à¶œà·Š රීති උද්දීපනය කිරීම සඳහ෠සහà·à¶º දක්වන භà·à·‚à·:',
+ 'syntaxhighlight-err-loading' => '(සහය දක්වන භà·à·‚෠ලà·à¶ºà·’ස්තුව පූරණය වීමේ දà·à·‚ය)',
+ 'syntaxhighlight-err-language' => 'අවලංගු භà·à·‚à·à·€.',
+ 'geshi.css' => '/* මෙහි යොදන CSS GeSHi කà·à¶»à¶šà¶»à·“ති තීවâ€à·Šâ€à¶»à·à¶½à·à¶šà¶º සඳහ෠යෙදේ */',
+);
+
+/** Slovak (slovenÄina)
+ * @author Helix84
+ */
+$messages['sk'] = array(
+ 'syntaxhighlight-desc' => 'Poskytuje zvýazňovanie syntaxe <code>&lt;syntaxhighlight&gt;</code> pomocou [http://qbnz.com/highlighter/ zvýrazňovaÄa GeSHi]',
+ 'syntaxhighlight-specify' => 'Musíte uviesť jazyk takto:',
+ 'syntaxhighlight-supported' => 'Jazyky, pre ktoré je zvýrazňovanie syntaxe podporované:',
+ 'syntaxhighlight-err-loading' => '(chyba pri naÄítaní zoznamu podporovaných jazykov)',
+ 'syntaxhighlight-err-language' => 'Neplatný jazyk.',
+ 'geshi.css' => '/* Tu umiestnené CSS sa použije pre zvýrazňovanie syntaxe GeSHi */',
+);
+
+/** Slovenian (slovenÅ¡Äina)
+ * @author Dbc334
+ * @author Yerpo
+ */
+$messages['sl'] = array(
+ 'syntaxhighlight-desc' => 'Nudi oznaÄevanje skladnje <code>&lt;syntaxhighlight&gt;</code> z uporabo [http://qbnz.com/highlighter/ oznaÄevalnika GeSHi]',
+ 'syntaxhighlight-specify' => 'Morate navesti jezik tako:',
+ 'syntaxhighlight-supported' => 'Jeziki, ki jih podpira funkcija za oznaÄevanje sintakse:',
+ 'syntaxhighlight-err-loading' => '(napaka pri nalaganju podprtih jezikov)',
+ 'syntaxhighlight-err-language' => 'Neveljaven jezik.',
+ 'geshi.css' => '/* CSS placed here will be applied to GeSHi syntax highlighting */',
+);
+
+/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Millosh
+ * @author Rancher
+ * @author Sasa Stefanovic
+ */
+$messages['sr-ec'] = array(
+ 'syntaxhighlight-desc' => 'Омогућава визуелно означавање ÑинтакÑе <code>&lt;syntaxhighlight&gt;</code> коришћењем [http://qbnz.com/highlighter/ GeSHi хајлајтера].',
+ 'syntaxhighlight-specify' => 'Потребно је одредити језик као овај:',
+ 'syntaxhighlight-supported' => 'Подржани језици у визуелом означавању ÑинтакÑе:',
+ 'syntaxhighlight-err-loading' => '(грешка при учитавању подржаних језика)',
+ 'syntaxhighlight-err-language' => 'ÐеиÑправан језик.',
+ 'geshi.css' => '/* CSS поÑтављен овде биће примењен на визуелно означавање ÑинткÑе GeSHi */',
+);
+
+/** Serbian (Latin script) (srpski (latinica)‎)
+ * @author MaxSem
+ * @author Michaello
+ */
+$messages['sr-el'] = array(
+ 'syntaxhighlight-desc' => 'Omogućava vizuelno oznaÄavanje sintakse <code>&lt;syntaxhighlight&gt;</code> korišćenjem [http://qbnz.com/highlighter/ GeSHi hajlajtera].',
+ 'syntaxhighlight-specify' => 'Potrebno je odrediti jezik kao ovaj:',
+ 'syntaxhighlight-supported' => 'Podržani jezici u vizuelom oznaÄavanju sintakse:',
+ 'syntaxhighlight-err-loading' => '(greÅ¡ka pri uÄitavanju podržanih jezika)',
+ 'syntaxhighlight-err-language' => 'Nepodoban jezik',
+ 'geshi.css' => '/* CSS postavljen ovde biće primenjen na vizuelno oznaÄavanje sintkse GeSHi */',
+);
+
+/** Seeltersk (Seeltersk)
+ * @author Pyt
+ */
+$messages['stq'] = array(
+ 'syntaxhighlight-desc' => 'Syntax-Apljuchtenge <code>&lt;syntaxhighlight&gt;</code> mäd Hälpe fon dän [http://qbnz.com/highlighter/ GeSHi-Apljuchter]',
+ 'syntaxhighlight-specify' => 'Ju wonskede Sproake mout as foulget definierd wäide:',
+ 'syntaxhighlight-supported' => 'Unnerstöände Sproaken foar ju Syntax-Betoonenge:',
+ 'syntaxhighlight-err-loading' => '(Failer bie dät Leeden fon ju Sproakenlieste)',
+ 'syntaxhighlight-err-language' => 'Uungultige Sproake.',
+ 'geshi.css' => '/* CSS in disse MediaWiki-Systemättergjucht wäd ap ju GeSHi-Syntaxbetoonenge anwoand */',
+);
+
+/** Sundanese (Basa Sunda)
+ * @author Kandar
+ */
+$messages['su'] = array(
+ 'syntaxhighlight-desc' => 'Nyadiakeun sorotan rumpaka <code>&lt;syntaxhighlight&gt;</code> migunakeun [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Anjeun kudu milih basa kawas kieu:',
+ 'syntaxhighlight-supported' => 'Basa nu dirojong ku sorotan rumpaka:',
+ 'syntaxhighlight-err-loading' => '(éror ngamuat daptar basa nu dirojong)',
+ 'syntaxhighlight-err-language' => 'Basana teu sah.',
+ 'geshi.css' => '/* CSS nu diperenahkeun di dieu bakal dilarapkeun ka sorotan rumpaka GeSHi */',
+);
+
+/** Swedish (svenska)
+ * @author Lejonel
+ */
+$messages['sv'] = array(
+ 'syntaxhighlight-desc' => 'Ger syntaxmarkering med [http://qbnz.com/highlighter/ GeSHi Highlighter] inuti <code>&lt;syntaxhighlight&gt;</code>-taggar',
+ 'syntaxhighlight-specify' => 'Du måste ange vilket språk som används, så här:',
+ 'syntaxhighlight-supported' => 'Det finns stöd för följande språk:',
+ 'syntaxhighlight-err-loading' => '(fel vid laddning av listan över stödda språk)',
+ 'syntaxhighlight-err-language' => 'Ogiltigt språk.',
+ 'geshi.css' => '/* CSS som skrivs här används för syntax highlighting med GeSHI */',
+);
+
+/** Tamil (தமிழà¯)
+ * @author மதனாஹரனà¯
+ */
+$messages['ta'] = array(
+ 'syntaxhighlight-err-language' => 'செலà¯à®²à®¾à®¤ மொழி.',
+);
+
+/** Telugu (తెలà±à°—à±)
+ * @author Veeven
+ */
+$messages['te'] = array(
+ 'syntaxhighlight-specify' => 'భాషని à°ˆ విధంగా ఇవà±à°µà°¾à°²à°¿:',
+ 'syntaxhighlight-supported' => 'ఛందసà±à°¸à± ఉదà±à°¦à±€à°ªà°¨à°•à°¿ తోడà±à°ªà°¾à°Ÿà± ఉనà±à°¨ భాషలà±:',
+ 'syntaxhighlight-err-loading' => '(తోడà±à°ªà°¾à°Ÿà±à°¨à±à°¨ భాషల జాబితా లోడింగà±à°²à±‹ పొరపాటౠజరిగింది)',
+ 'syntaxhighlight-err-language' => 'చెలà±à°²à°¨à°¿ భాష.',
+);
+
+/** Tajik (Cyrillic script) (тоҷикӣ)
+ * @author Ibrahim
+ */
+$messages['tg-cyrl'] = array(
+ 'syntaxhighlight-desc' => 'Имкони даÑтуроти рангин карданро <code>&lt;syntaxhighlight&gt;</code> бо иÑтифода аз [http://qbnz.com/highlighter/ GeSHi Highlighter]-ро фароҳам меоварад',
+ 'syntaxhighlight-specify' => 'Шумо боÑд бо ин шакл забонеро Ð¼ÑƒÑˆÐ°Ñ…Ñ…Ð°Ñ ÐºÑƒÐ½ÐµÐ´:',
+ 'syntaxhighlight-supported' => 'Забонҳои пуштибонишуда барои рангин кардани даÑтуроти наҳвӣ:',
+ 'syntaxhighlight-err-loading' => '(хато дар богузории забонҳои пуштибонишуда)',
+ 'syntaxhighlight-err-language' => 'Забони ғайри миҷоз.',
+ 'geshi.css' => '/* CSS инҷо гузошташуда ба даÑтуроти рангинкунии GeSHi ба кор бурда мешавад */',
+);
+
+/** Tajik (Latin script) (tojikī)
+ * @author Liangent
+ */
+$messages['tg-latn'] = array(
+ 'syntaxhighlight-desc' => 'Imkoni dasturoti rangin kardanro <code>&lt;syntaxhighlight&gt;</code> bo istifoda az [http://qbnz.com/highlighter/ GeSHi Highlighter]-ro faroham meovarad',
+ 'syntaxhighlight-specify' => 'Åžumo bojad bo in ÅŸakl zabonero muÅŸaxxas kuned:',
+ 'syntaxhighlight-supported' => 'Zabonhoi puştibonişuda baroi rangin kardani dasturoti nahvī:',
+ 'syntaxhighlight-err-loading' => '(xato dar boguzoriji zabonhoi puÅŸtiboniÅŸuda)',
+ 'syntaxhighlight-err-language' => 'Zaboni ƣajri miçoz.',
+ 'geshi.css' => '/* CSS inço guzoştaşuda ba dasturoti ranginkuniji GeSHi ba kor burda meşavad */',
+);
+
+/** Turkmen (Türkmençe)
+ * @author Hanberke
+ */
+$messages['tk'] = array(
+ 'syntaxhighlight-desc' => '[http://qbnz.com/highlighter/ GeSHi Highlighter] ulanyp <code>&lt;syntaxhighlight&gt;</code> sintaksis nygtamasyny üpjün edýär',
+ 'syntaxhighlight-specify' => 'Şunuň ýaly bir dil görkezmeli:',
+ 'syntaxhighlight-supported' => 'Sintaksis nygtamasy üçin goldanylýan diller:',
+ 'syntaxhighlight-err-loading' => '(goldanylýan diller sanawyny ýükleme säwligi)',
+ 'syntaxhighlight-err-language' => 'Nädogry dil.',
+ 'geshi.css' => '/* Bu ýere ýerleşdirilen CSS, GeSHi sintaksis nygtamasyna berjaý ediljekdir */',
+);
+
+/** Tagalog (Tagalog)
+ * @author AnakngAraw
+ */
+$messages['tl'] = array(
+ 'syntaxhighlight-desc' => "Nagbibigay ng pagbibigay ng liwanag sa palaugnayan <code>&lt;syntaxhighlight&gt;</code> na ginagamitan ng [http://qbnz.com/highlighter/ pambigay ng liwanag (''highlighter'') ng GeSHi]",
+ 'syntaxhighlight-specify' => 'Kinakailangan mong tumukoy ng isang wikang katulad nito:',
+ 'syntaxhighlight-supported' => 'Sinusuportahang mga wika para sa pagbibigay ng liwanag/pagtatampok ng palaugnayan:',
+ 'syntaxhighlight-err-loading' => '(kamalian sa pagkarga ng sinusuportahang talaan ng wika)',
+ 'syntaxhighlight-err-language' => 'Hindi tanggap na wika.',
+ 'geshi.css' => '/* Ang inilagay na CSS dito ay gagamitin para sa pang-GeSHi na pagbibigay ng liwanag sa/pagtatampok ng palaugnayan */',
+);
+
+/** Turkish (Türkçe)
+ * @author Erkan Yilmaz
+ * @author Joseph
+ */
+$messages['tr'] = array(
+ 'syntaxhighlight-desc' => '[http://qbnz.com/highlighter/ GeSHi Highlighter] kullanarak <code>&lt;syntaxhighlight&gt;</code> sözdizimi vurgulamasını sağlar',
+ 'syntaxhighlight-specify' => 'Bu gibi bir dil belirtmelisiniz:',
+ 'syntaxhighlight-supported' => 'Sözdizimi vurgulaması için desteklenen diller:',
+ 'syntaxhighlight-err-loading' => '(desteklenen diller listesi yüklenirken hata)',
+ 'syntaxhighlight-err-language' => 'Geçersiz dil.',
+ 'geshi.css' => '/* Buraya yerleştirilen CSS, GeSHi sözdizimi vurgulamasına uygulanacaktır */',
+);
+
+/** Ukrainian (українÑька)
+ * @author Ahonc
+ */
+$messages['uk'] = array(
+ 'syntaxhighlight-desc' => 'ДозволÑÑ” викориÑтовувати тег <code>&lt;syntaxhighlight&gt;</code> Ð´Ð»Ñ Ð¿Ñ–Ð´ÑÐ²Ñ–Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ ÑинтакÑиÑу за допомогою [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Ви повинні зазначити мову наÑтупним чином:',
+ 'syntaxhighlight-supported' => 'Підтримувані мови:',
+ 'syntaxhighlight-err-loading' => '(неможливо завантажити ÑпиÑок мов)',
+ 'syntaxhighlight-err-language' => 'Зазначена непідтримувана мова.',
+ 'geshi.css' => '/* CSS-код, розміщений тут, буде заÑтоÑований Ð´Ð»Ñ Ð¿Ñ–Ð´ÑÐ²Ñ–Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ ÑинтакÑиÑу GeSHI */',
+);
+
+/** Urdu (اردو)
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['ur'] = array(
+ 'syntaxhighlight-err-language' => 'باطل زبان ÛÛ’.',
+);
+
+/** vèneto (vèneto)
+ * @author Candalua
+ */
+$messages['vec'] = array(
+ 'syntaxhighlight-desc' => 'Evidensia la sintassi dei linguagi de programazion <code>&lt;syntaxhighlight&gt;</code> tramite [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Te ghè da specificar un linguagio in sta maniera:',
+ 'syntaxhighlight-supported' => 'Linguagi de cui se pol evidensiar la sintassi coi colori:',
+ 'syntaxhighlight-err-loading' => "(eror nel caricamento de l'elenco dei linguagi suportà)",
+ 'syntaxhighlight-err-language' => 'Linguagio mìa riconossiùo.',
+ 'geshi.css' => "/* I stili CSS inserìi qua i se àplica a l'evidenziazion de sintassi con GeSHi */",
+);
+
+/** Veps (vepsän kel’)
+ * @author Игорь БродÑкий
+ */
+$messages['vep'] = array(
+ 'syntaxhighlight-err-language' => "Vär kel'",
+);
+
+/** Vietnamese (Tiếng Việt)
+ * @author Minh Nguyen
+ */
+$messages['vi'] = array(
+ 'syntaxhighlight-desc' => 'Tô màu cú pháp trong thẻ <code>&lt;syntaxhighlight&gt;</code> dùng [http://qbnz.com/highlighter/ GeSHi Highlighter]',
+ 'syntaxhighlight-specify' => 'Bạn cần phải định rõ một ngôn ngữ như vầy:',
+ 'syntaxhighlight-supported' => 'Các ngôn ngữ được tô màu cú pháp:',
+ 'syntaxhighlight-err-loading' => '(gặp lỗi khi nạp danh sách các ngôn ngữ được hỗ trợ)',
+ 'syntaxhighlight-err-language' => 'Ngôn ngữ không hợp lệ.',
+ 'geshi.css' => '/* Bộ tô màu cú pháp GeSHi sẽ áp dụng mã CSS ở đây */',
+);
+
+/** Volapük (Volapük)
+ * @author Malafaya
+ * @author Smeira
+ */
+$messages['vo'] = array(
+ 'syntaxhighlight-specify' => 'Nedol välön püki ön mod soik:',
+ 'syntaxhighlight-supported' => 'Püks lonöföl pro süntag pekölöl:',
+ 'syntaxhighlight-err-loading' => '(pöl pö lodam lised pükas lonöföl)',
+ 'syntaxhighlight-err-language' => 'Pük no dabinöl.',
+);
+
+/** Yiddish (ייִדיש)
+ * @author פוילישער
+ */
+$messages['yi'] = array(
+ 'syntaxhighlight-specify' => '×יר ד×רפֿט ספעציפֿירן × ×©×¤×¨×ַך ×זוי:',
+ 'syntaxhighlight-err-language' => '×ומגילטיקע שפר×ַך.',
+);
+
+/** Cantonese (粵語)
+ * @author Shinjiman
+ */
+$messages['yue'] = array(
+ 'syntaxhighlight-desc' => '用[http://qbnz.com/highlighter/ GeSHi Highlighter]以<code>&lt;syntaxhighlight&gt;</code>æ供醒目æ示',
+ 'syntaxhighlight-specify' => '你需è¦æŒ‡å®šä¸€ç¨®èªžè¨€ï¼Œå¥½ä¼¼å’:',
+ 'syntaxhighlight-supported' => '語法醒目標示所支æ´å˜…語言:',
+ 'syntaxhighlight-err-loading' => '(支æ´èªžè¨€æ¸…單載入錯誤)',
+ 'syntaxhighlight-err-language' => '無效嘅語言。',
+ 'geshi.css' => '/* 放響呢度嘅CSS會以GeSHi語法醒目æ示方å¼é¡¯ç¤º */',
+);
+
+/** Simplified Chinese (中文(简体)‎)
+ * @author Shinjiman
+ */
+$messages['zh-hans'] = array(
+ 'syntaxhighlight-desc' => '使用[http://qbnz.com/highlighter/ GeSHi Highlighter]以<code>&lt;syntaxhighlight&gt;</code>æ供高亮',
+ 'syntaxhighlight-specify' => '您需è¦æŒ‡å®šä¸€ç§è¯­è¨€ï¼Œåƒè¿™æ ·:',
+ 'syntaxhighlight-supported' => '语法高亮所支æŒçš„语言:',
+ 'syntaxhighlight-err-loading' => '(支æŒè¯­è¨€åˆ—表载入错误)',
+ 'syntaxhighlight-err-language' => '无效的语言。',
+ 'geshi.css' => '/* 放在这里的CSS会以GeSHi语法高亮方å¼æ˜¾ç¤º */',
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Mark85296341
+ * @author Shinjiman
+ */
+$messages['zh-hant'] = array(
+ 'syntaxhighlight-desc' => '使用 [http://qbnz.com/highlighter/ GeSHi Highlighter] 以 <code>&lt;syntaxhighlight&gt;</code> æ供醒目æ示',
+ 'syntaxhighlight-specify' => '您需è¦æŒ‡å®šä¸€ç¨®èªžè¨€ï¼Œåƒé€™æ¨£ï¼š',
+ 'syntaxhighlight-supported' => '語法醒目標示所支æ´çš„語言:',
+ 'syntaxhighlight-err-loading' => '(支æ´èªžè¨€æ¸…單載入錯誤)',
+ 'syntaxhighlight-err-language' => '無效的語言。',
+ 'geshi.css' => '/* 放在這裡的 CSS 會以 GeSHi 語法醒目æ示方å¼é¡¯ç¤º */',
+);
diff --git a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.local.php b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.local.php
new file mode 100644
index 00000000..a9458ec3
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.local.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Custom ResourceLoader module that loads a Geshi.css per-wiki.
+ */
+class HighlightGeSHilocal extends ResourceLoaderWikiModule {
+ /**
+ * @param $context ResourceLoaderContext
+ * @return array
+ */
+ protected function getPages( ResourceLoaderContext $context ) {
+ return array(
+ 'MediaWiki:Geshi.css' => array( 'type' => 'style' ),
+ );
+ }
+}
diff --git a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php
new file mode 100644
index 00000000..0b6cb0c6
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Syntax highlighting extension for MediaWiki 1.5 using GeSHi
+ * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/**
+ * @file
+ * @ingroup Extensions
+ * @author Brion Vibber
+ *
+ * This extension wraps the GeSHi highlighter: http://qbnz.com/highlighter/
+ *
+ * Unlike the older GeSHi MediaWiki extension floating around, this makes
+ * use of the new extension parameter support in MediaWiki 1.5 so it only
+ * has to register one tag, <source>.
+ *
+ * A language is specified like: <source lang="c">void main() {}</source>
+ * If you forget, or give an unsupported value, the extension spits out
+ * some help text and a list of all supported languages.
+ */
+
+if( !defined( 'MEDIAWIKI' ) ) {
+ die();
+}
+
+$wgExtensionCredits['parserhook']['SyntaxHighlight_GeSHi'] = array(
+ 'path' => __FILE__,
+ 'name' => 'SyntaxHighlight',
+ 'author' => array( 'Brion Vibber', 'Tim Starling', 'Rob Church', 'Niklas Laxström' ),
+ 'descriptionmsg' => 'syntaxhighlight-desc',
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi',
+);
+
+$wgSyntaxHighlightDefaultLang = null; //Change this in LocalSettings.php
+$dir = dirname(__FILE__) . '/';
+$wgExtensionMessagesFiles['SyntaxHighlight_GeSHi'] = $dir . 'SyntaxHighlight_GeSHi.i18n.php';
+$wgAutoloadClasses['SyntaxHighlight_GeSHi'] = $dir . 'SyntaxHighlight_GeSHi.class.php';
+$wgHooks['ParserFirstCallInit'][] = 'efSyntaxHighlight_GeSHiSetup';
+$wgHooks['ExtensionTypes'][] = 'SyntaxHighlight_GeSHi::hSpecialVersion_GeSHi';
+
+//if ( defined( 'MW_SUPPORTS_CONTENTHANDLER' ) ) {
+ // since MW 1.21
+// $wgHooks['ContentGetParserOutput'][] = 'SyntaxHighlight_GeSHi::renderHook';
+//} else {
+ // B/C until 1.20
+ $wgHooks['ShowRawCssJs'][] = 'SyntaxHighlight_GeSHi::viewHook';
+//}
+
+
+$wgAutoloadClasses['HighlightGeSHilocal'] = $dir . 'SyntaxHighlight_GeSHi.local.php';
+$wgResourceModules['ext.geshi.local'] = array( 'class' => 'HighlightGeSHilocal' );
+
+/**
+ * Map content models to the corresponding language names to be used with the highlighter.
+ * Pages with one of the given content models will automatically be highlighted.
+ */
+$wgSyntaxHighlightModels = array(
+ CONTENT_MODEL_CSS => 'css',
+ CONTENT_MODEL_JAVASCRIPT => 'javascript',
+);
+
+/**
+ * Register parser hook
+ *
+ * @param $parser Parser
+ */
+function efSyntaxHighlight_GeSHiSetup( &$parser ) {
+ $parser->setHook( 'source', array( 'SyntaxHighlight_GeSHi', 'parserHook' ) );
+ $parser->setHook( 'syntaxhighlight', array( 'SyntaxHighlight_GeSHi', 'parserHook' ) );
+ return true;
+}
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/contrib/aliased.php b/extensions/SyntaxHighlight_GeSHi/geshi/contrib/aliased.php
new file mode 100644
index 00000000..cee31289
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/contrib/aliased.php
@@ -0,0 +1,123 @@
+<?php
+
+/**
+ * Another GeSHi example script
+ *
+ * Configure your Apache server with 'AcceptPathInfo true' and something like
+ * 'Alias /viewmysource /var/www/geshi/contrib/aliased.php'. Don't forget
+ * to protect this alias as necessary.
+ *
+ * Usage - visit /viewmysource/file.name.ext to see that file with syntax
+ * highlighting, where "viewmysource" is the name of the alias you set up.
+ * You can use this without an alias too, just by visiting
+ * aliased.php/file.name.ext.
+ *
+ * @author Ross Golder <ross@golder.org>
+ * @version $Id: aliased.php 2533 2012-08-15 18:49:04Z benbe $
+ */
+
+// Your config here
+define("SOURCE_ROOT", "/var/www/your/source/root/");
+
+// Assume you've put geshi in the include_path already
+require_once("geshi.php");
+
+// Get path info
+$path = SOURCE_ROOT.$_SERVER['PATH_INFO'];
+
+// Check for dickheads trying to use '../' to get to sensitive areas
+$base_path_len = strlen(SOURCE_ROOT);
+$real_path = realpath($path);
+if(strncmp($real_path, SOURCE_ROOT, $base_path_len)) {
+ exit("Access outside acceptable path.");
+}
+
+// Check file exists
+if(!file_exists($path)) {
+ exit("File not found ($path).");
+}
+
+// Prepare GeSHi instance
+$geshi = new GeSHi();
+$geshi->set_language('text');
+$geshi->load_from_file($path);
+$geshi->set_header_type(GESHI_HEADER_PRE);
+$geshi->enable_classes();
+$geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS, 10);
+$geshi->set_overall_style('color: #000066; border: 1px solid #d0d0d0; background-color: #f0f0f0;', true);
+$geshi->set_line_style('font: normal normal 95% \'Courier New\', Courier, monospace; color: #003030;', 'font-weight: bold; color: #006060;', true);
+$geshi->set_code_style('color: #000020;', 'color: #000020;');
+$geshi->set_link_styles(GESHI_LINK, 'color: #000060;');
+$geshi->set_link_styles(GESHI_HOVER, 'background-color: #f0f000;');
+$geshi->set_header_content('Source code viewer - ' . $path . ' - ' . $geshi->get_language_name());
+$geshi->set_header_content_style('font-family: Verdana, Arial, sans-serif; color: #808080; font-size: 70%; font-weight: bold; background-color: #f0f0ff; border-bottom: 1px solid #d0d0d0; padding: 2px;');
+$geshi->set_footer_content('Parsed in <TIME> seconds, using GeSHi <VERSION>');
+$geshi->set_footer_content_style('font-family: Verdana, Arial, sans-serif; color: #808080; font-size: 70%; font-weight: bold; background-color: #f0f0ff; border-top: 1px solid #d0d0d0; padding: 2px;');
+
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Source code viewer - <?php echo $path; ?> - <?php $geshi->get_language_name(); ?></title>
+ <style type="text/css">
+ <!--
+ <?php
+ // Output the stylesheet. Note it doesn't output the <style> tag
+ echo $geshi->get_stylesheet();
+ ?>
+ html {
+ background-color: #f0f0f0;
+ }
+ body {
+ font-family: Verdana, Arial, sans-serif;
+ margin: 10px;
+ border: 2px solid #e0e0e0;
+ background-color: #fcfcfc;
+ padding: 5px;
+ }
+ h2 {
+ margin: .1em 0 .2em .5em;
+ border-bottom: 1px solid #b0b0b0;
+ color: #b0b0b0;
+ font-weight: normal;
+ font-size: 150%;
+ }
+ h3 {
+ margin: .1em 0 .2em .5em;
+ color: #b0b0b0;
+ font-weight: normal;
+ font-size: 120%;
+ }
+ #footer {
+ text-align: center;
+ font-size: 80%;
+ color: #a9a9a9;
+ }
+ #footer a {
+ color: #9999ff;
+ }
+ textarea {
+ border: 1px solid #b0b0b0;
+ font-size: 90%;
+ color: #333;
+ margin-left: 20px;
+ }
+ select, input {
+ margin-left: 20px;
+ }
+ p {
+ font-size: 90%;
+ margin-left: .5em;
+ }
+ -->
+ </style>
+</head>
+<body>
+<?php
+// The fun part :)
+echo $geshi->parse_code();
+?>
+<hr/>
+</body>
+</html>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/contrib/cssgen.php b/extensions/SyntaxHighlight_GeSHi/geshi/contrib/cssgen.php
new file mode 100644
index 00000000..cc71b58f
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/contrib/cssgen.php
@@ -0,0 +1,466 @@
+<?php
+/*************************************************************************************
+ * cssgen.php
+ * ----------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Copyright: (c) 2004 Nigel McNie
+ * Release Version: 1.0.8.6
+ * Date Started: 2004/05/20
+ *
+ * Application to generate custom CSS files for GeSHi (based on an idea by Andreas
+ * Gohr)
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+set_magic_quotes_runtime(0);
+//
+// Functions
+//
+
+function make_header ( $title )
+{
+ echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>GeSHi CSS Generator :: ' . $title . ' </title>
+ <style type="text/css" media="screen">
+ <!--
+ html {
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 80%;
+ background-color: #d0d0d0;
+ }
+ body {
+ margin: 10px;
+ padding: 5px;
+ border: 1px solid #f0f0f0;
+ background-color: #f6f6f6;
+ }
+ h1 {
+ border-bottom: 2px solid #e0e0e0;
+ font-weight: normal;
+ font-size: 150%;
+ color: #c0c0c0;
+ }
+ input, textarea {
+ border: 1px solid #d0d0d0;
+ }
+ th {
+ text-align: right;
+ font-weight: normal;
+ }
+ pre {
+ font-size: 110%;
+ color: #202020;
+ }
+ #footer {
+ color: #b0b0b0;
+ text-align: center;
+ font-size: 90%;
+ margin: 0 auto;
+ border-top: 1px solid #e0e0e0;
+ }
+ #footer a {
+ color: #c0c0c0;
+ }
+ -->
+ </style>
+ <script type="text/javascript">
+ function select (state)
+ {
+ var cboxes = document.getElementsByTagName(\'input\');
+ for (var i = 0; i < cboxes.length; i++) {
+ if (cboxes[i].type == "checkbox") {
+ if (state == "true") {
+ cboxes[i].checked = true;
+ } elseif (state == "false") {
+ cboxes[i].checked = false;
+ } elseif (state == "invert") {
+ cboxes[i].checked = !cboxes[i].checked;
+ }
+ }
+ }
+ }
+ </script>
+</head>
+<body>
+<h1>' . $title . '</h1>
+';
+}
+
+function make_footer ()
+{
+ echo '<div id="footer"><a href="http://qbnz.com/highlighter/">GeSHi</a> &copy; Nigel McNie, 2004, released under the GPL</div></body>
+</html>';
+}
+
+
+function get_var ( $var_name )
+{
+ if ( isset($_GET[$var_name]) )
+ {
+ return str_replace("\'", "'", $_GET[$var_name]);
+ }
+ elseif ( isset($_POST[$var_name]) )
+ {
+ return str_replace("\'", "'", $_POST[$var_name]);
+ }
+ return null;
+}
+
+
+
+//
+// Unset everything
+//
+foreach ( $_REQUEST as $var )
+{
+ unset($$var);
+}
+foreach ( array(
+ '_POST' => 'HTTP_POST_VARS',
+ '_GET' => 'HTTP_GET_VARS',
+ '_COOKIE' => 'HTTP_COOKIE_VARS',
+ '_SERVER' => 'HTTP_SERVER_VARS',
+ '_ENV' => 'HTTP_ENV_VARS',
+ '_FILES' => 'HTTP_POST_FILES') as $array => $other )
+{
+ if ( !isset($$array) )
+ {
+ $$array = $$other;
+ }
+ unset($$other);
+}
+
+
+// Get what step we're up to
+$step = get_var('step');
+
+if ( !$step || $step == 1 )
+{
+ $errors = 0;
+ make_header('Step 1');
+ echo "Welcome to the GeSHi CSS generator.<br /><pre>Searching for GeSHi... ";
+
+ // Find GeSHi
+ $geshi_path = get_var('geshi-path');
+ $geshi_lang_path = get_var('geshi-lang-path');
+
+ if(strstr($geshi_path, '..')) {
+ unset($geshi_path);
+ }
+ if(strstr($geshi_lang_path, '..')) {
+ unset($geshi_lang_path);
+ }
+
+ if ( !$geshi_path )
+ {
+ $geshi_path = '../geshi.php';
+ }
+ if ( !$geshi_lang_path )
+ {
+ $geshi_lang_path = '../geshi/';
+ }
+
+ if ( is_file($geshi_path) && is_readable($geshi_path) )
+ {
+ // Get file contents and see if GeSHi is in here
+ $file = @file($geshi_path);
+ $contents = '';
+ foreach ( $file as $line )
+ {
+ $contents .= $line;
+ }
+ if ( strpos($contents, '<?php
+/**
+ * GeSHi - Generic Syntax Highlighter') !== false )
+ {
+ echo '<span style="color: green;">Found at ' . realpath($geshi_path) . '</span>';
+ }
+ else
+ {
+ ++$errors;
+ $no_geshi_dot_php_error = true;
+ echo '<span style="color: red;">Not found</span>';
+ }
+ }
+ else
+ {
+ ++$errors;
+ $no_geshi_dot_php_error = true;
+ echo '<span style="color: red;">Not found</span>';
+ }
+
+ // Find language files
+ echo "\nSearching for language files... ";
+ if ( is_readable($geshi_lang_path . 'css-gen.cfg') )
+ {
+
+ echo '<span style="color: green;">Found at ' . realpath($geshi_lang_path) . '</span>';
+ }
+ else
+ {
+ ++$errors;
+ $no_lang_dir_error = true;
+ echo '<span style="color: red;">Not found</span>';
+ }
+ echo "</pre>\n";
+
+ if ( $errors > 0 )
+ {
+ // We're gonna have to ask for the paths...
+ echo 'Unfortunately CSSGen could not detect the following paths. Please input them and press &quot;submit&quot; to try again.';
+ echo "
+<form action=\"cssgen.php\" method=\"post\">";
+ if ( $no_geshi_dot_php_error )
+ {
+ echo "
+<br />geshi.php: <input type=\"text\" name=\"geshi-path\" value=\"" . realpath('../geshi.php') . "\" size=\"50\" />";
+ }
+ else
+ {
+ echo '<input type="hidden" name="geshi-path" value="' . htmlspecialchars($geshi_path) . '" />';
+ }
+ if ( $no_lang_dir_error )
+ {
+ echo "
+<br />language files directory: <input type=\"text\" name=\"geshi-lang-path\" value=\"" . realpath('../geshi/') . "/\" size=\"50\" /> (should have a trailing slash)";
+ }
+ else
+ {
+ echo '<input type="hidden" name="geshi-lang-path" value="' . $geshi_lang_path . '" />';
+ }
+
+ echo "
+<br /><input type=\"submit\" value=\"Search\" /></form>";
+ }
+ else
+ {
+ // no errors - echo continue form
+ echo 'Everything seems to be detected successfully. Use the button to continue.
+<br /><br /><form action="cssgen.php?step=2" method="post">
+<input type="hidden" name="geshi-path" value="' . realpath($geshi_path) . '" /><input type="hidden" name="geshi-lang-path" value="' . realpath($geshi_lang_path) . '" />
+<input type="submit" value="Step 2" />';
+ }
+
+ make_footer();
+}
+// Step 2
+elseif ( $step == 2 )
+{
+ make_header('Step 2');
+
+ $geshi_path = get_var('geshi-path');
+ $geshi_lang_path = get_var('geshi-lang-path');
+
+ $dh = opendir($geshi_lang_path);
+ $lang_files = array();
+ $file = readdir($dh);
+ while ( $file !== false )
+ {
+ if ( $file == '.' || $file == '..' || $file == 'CVS' || $file == 'css-gen.cfg' )
+ {
+ $file = readdir($dh);
+ continue;
+ }
+ if(!strstr(file_get_contents($dh . DIRECTORY_SEPARATOR . $file), '$language_data')) {
+ $file = readdir($dh);
+ continue;
+ }
+ $lang_files[] = $file;
+ $file = readdir($dh);
+ }
+ closedir($dh);
+ sort($lang_files);
+
+ // Now installed languages are in $lang_files
+
+ echo '<form action="cssgen.php?step=3" method="post" id="step2">
+What languages are you wanting to make this stylesheet for?<br /><br />
+Detected languages:<br />';
+
+ foreach ( $lang_files as $lang )
+ {
+ $lang = substr($lang, 0, strpos($lang, '.'));
+ if ($lang) {
+ echo "<input type=\"checkbox\" name=\"langs[$lang]\" checked=\"checked\" />&nbsp;$lang<br />\n";
+ }
+ }
+
+ echo "Select: <a href=\"javascript:select('true')\">All</a>, <a href=\"javascript:select('false')\">None</a>, <a href=\"javascript:select('invert')\">Invert</a><br />\n";
+
+ echo 'If you\'d like any other languages not detected here to be supported, please enter
+them here, one per line:<br /><textarea rows="4" cols="20" name="extra-langs"></textarea><br />
+';
+
+ echo '<br />Styles:
+<table>
+ <tr><th>Style for the overall code block:</th><td><input type="text" name="overall" value="border: 1px dotted #a0a0a0; font-family: \'Courier New\', Courier, monospace; background-color: #f0f0f0; color: #0000bb;" /></td></tr>
+ <tr><th>Default Styles</th><td><input type="text" name="default-styles" value="font-weight:normal;background:transparent;color:#000; padding-left: 5px;" /></td></tr>
+ <tr><th>Keywords I (if, do, while etc)</th><td><input type="text" name="keywords-1" value="color: #a1a100;" /></td></tr>
+ <tr><th>Keywords II (null, true, false etc)</th><td><input type="text" name="keywords-2" value="color: #000; font-weight: bold;" /></td></tr>
+ <tr><th>Inbuilt Functions (echo, print etc)</th><td><input type="text" name="keywords-3" value="color: #000066;" /></td></tr>
+ <tr><th>Data Types (int, boolean etc)</th><td><input type="text" name="keywords-4" value="color: #f63333;" /></td></tr>
+
+ <tr><th>Comments (//, <!-- --> etc)</th><td><input type="text" name="comments" value="color: #808080;" /></td></tr>
+ <tr><th>Escaped Characters (\n, \t etc)</th><td><input type="text" name="escaped-chars" value="color: #000033; font-weight: bold;" /></td></tr>
+ <tr><th>Brackets ( ([{}]) etc)</th><td><input type="text" name="brackets" value="color: #66cc66;" /></td></tr>
+ <tr><th>Strings ("foo" etc)</th><td><input type="text" name="strings" value="color: #ff0000;" /></td></tr>
+ <tr><th>Numbers (1, -54, 2.5 etc)</th><td><input type="text" name="numbers" value="color: #ff33ff;" /></td></tr>
+ <tr><th>Methods (Foo.bar() etc)</th><td><input type="text" name="methods" value="color: #006600;" /></td></tr>
+</table>';
+
+ echo '<input type="hidden" name="geshi-path" value="' . realpath($geshi_path) . '" /><input type="hidden" name="geshi-lang-path" value="' . realpath($geshi_lang_path) . '" />
+<input type="submit" value="Step 3" /></form>';
+
+ make_footer();
+}
+// Step 3
+elseif ( $step == 3 )
+{
+ make_header('Step 3');
+ echo '<p>Here is your completed stylesheet. Note that it may not be perfect - no regular expression styles are included for one thing,
+you\'ll have to add those yourself (php and xml are just two languages that use them), and line numbers are not included, however
+it includes most of the basic information.</p>';
+
+ // Make the stylesheet
+ $part_selector_1 = '';
+ $part_selector_2 = '';
+ $part_selector_3 = '';
+
+ $langs = get_var('langs');
+ $extra_langs = trim(get_var('extra-langs'));
+ if ( $extra_langs != '' )
+ {
+ $l = explode("\r\n", $extra_langs);
+ foreach ( $l as $lng )
+ {
+ $langs[$lng] = true;
+ }
+ }
+
+
+ foreach ( $langs as $lang => $dummy )
+ {
+ $part_selector_1 .= ".$lang {PART}, ";
+ $part_selector_2 .= ".$lang {PART1}, .$lang {PART2}, ";
+ $part_selector_3 .= ".$lang {PART1}, .$lang {PART2}, .$lang {PART3}, ";
+ }
+ $part_selector_1 = substr($part_selector_1, 0, -2);
+ $part_selector_2 = substr($part_selector_2, 0, -2);
+ $part_selector_3 = substr($part_selector_3, 0, -2);
+
+
+ $default_styles = get_var('default-styles');
+ $ol_selector = str_replace('{PART}', 'ol', $part_selector_1);
+ $overall_styles = get_var('overall');
+ $overall_selector = str_replace('{PART}', '', $part_selector_1);
+
+ $stylesheet = "/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */";
+
+ if ( $overall != '' )
+ {
+ $stylesheet .= "\n$overall_selector {{$overall_styles}}";
+ }
+ if ( $default_styles != '' )
+ {
+ $default_selector = str_replace(array('{PART1}', '{PART2}'), array('.de1', '.de2'), $part_selector_2);
+ $stylesheet .= "\n$default_selector {{$default_styles}}";
+ }
+
+ // Do keywords
+ $keywords_1 = get_var('keywords-1');
+ $keyword_selector_1 = str_replace('{PART}', '.kw1', $part_selector_1);
+ if ( $keywords_1 != '' )
+ {
+ $stylesheet .= "\n$keyword_selector_1 {{$keywords_1}}";
+ }
+
+ $keywords_2 = get_var('keywords-2');
+ $keyword_selector_2 = str_replace('{PART}', '.kw2', $part_selector_1);
+ if ( $keywords_2 != '' )
+ {
+ $stylesheet .= "\n$keyword_selector_2 {{$keywords_2}}";
+ }
+
+ $keywords_3 = get_var('keywords-3');
+ $keyword_selector_3 = str_replace('{PART}', '.kw3', $part_selector_1);
+ if ( $keywords_3 != '' )
+ {
+ $stylesheet .= "\n$keyword_selector_3 {{$keywords_3}}";
+ }
+
+ $keywords_4 = get_var('keywords-4');
+ $keyword_selector_4 = str_replace('{PART}', '.kw4', $part_selector_1);
+ if ( $keywords_4 != '' )
+ {
+ $stylesheet .= "\n$keyword_selector_4 {{$keywords_4}}";
+ }
+
+ // Do other lexics
+ $comments = get_var('comments');
+ $comment_selector = str_replace(array('{PART1}', '{PART2}', '{PART3}'), array('.co1', '.co2', '.coMULTI'), $part_selector_3);
+ if ( $comments != '' )
+ {
+ $stylesheet .= "\n$comment_selector {{$comments}}";
+ }
+
+ $esc = get_var('escaped-chars');
+ $esc_selector = str_replace('{PART}', '.es0', $part_selector_1);
+ if ( $esc != '' )
+ {
+ $stylesheet .= "\n$esc_selector {{$esc}}";
+ }
+
+ $brackets = get_var('brackets');
+ $brk_selector = str_replace('{PART}', '.br0', $part_selector_1);
+ if ( $brackets != '' )
+ {
+ $stylesheet .= "\n$brk_selector {{$brackets}}";
+ }
+
+ $strings = get_var('strings');
+ $string_selector = str_replace('{PART}', '.st0', $part_selector_1);
+ if ( $strings != '' )
+ {
+ $stylesheet .= "\n$string_selector {{$strings}}";
+ }
+
+ $numbers = get_var('numbers');
+ $num_selector = str_replace('{PART}', '.nu0', $part_selector_1);
+ if ( $numbers != '' )
+ {
+ $stylesheet .= "\n$num_selector {{$numbers}}";
+ }
+
+ $methods = get_var('methods');
+ $method_selector = str_replace('{PART}', '.me0', $part_selector_1);
+ if ( $methods != '' )
+ {
+ $stylesheet .= "\n$method_selector {{$methods}}";
+ }
+
+ echo "<pre>$stylesheet</pre>";
+
+ make_footer();
+}
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/contrib/cssgen2.php b/extensions/SyntaxHighlight_GeSHi/geshi/contrib/cssgen2.php
new file mode 100644
index 00000000..cc3c39cb
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/contrib/cssgen2.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * A simple script which outputs the CSS classes for all languages
+ * supported by GeSHi. You can access it directly to download
+ * the CSS file. On *NIX you can also do a simple `php cssgen.php > geshi.css`.
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package geshi
+ * @subpackage contrib
+ * @author revulo <revulon@gmail.com>
+ * @copyright 2008 revulo
+ * @license http://gnu.org/copyleft/gpl.html GNU GPL
+ *
+ */
+
+require dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'geshi.php';
+$geshi = new GeSHi;
+
+$languages = array();
+if ($handle = opendir($geshi->language_path)) {
+ while (($file = readdir($handle)) !== false) {
+ $pos = strpos($file, '.');
+ if ($pos > 0 && substr($file, $pos) == '.php') {
+ $languages[] = substr($file, 0, $pos);
+ }
+ }
+ closedir($handle);
+}
+sort($languages);
+
+header('Content-Type: application/octet-stream');
+header('Content-Disposition: attachment; filename="geshi.css"');
+
+echo "/**\n".
+ " * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann\n" .
+ " * (http://qbnz.com/highlighter/ and http://geshi.org/)\n".
+ " */\n";
+
+foreach ($languages as $language) {
+ $geshi->set_language($language);
+ // note: the false argument is required for stylesheet generators, see API documentation
+ $css = $geshi->get_stylesheet(false);
+ echo preg_replace('/^\/\*\*.*?\*\//s', '', $css);
+}
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/contrib/example.php b/extensions/SyntaxHighlight_GeSHi/geshi/contrib/example.php
new file mode 100644
index 00000000..e07399e3
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/contrib/example.php
@@ -0,0 +1,217 @@
+<?php
+/**
+ * GeSHi example script
+ *
+ * Just point your browser at this script (with geshi.php in the parent directory,
+ * and the language files in subdirectory "../geshi/")
+ *
+ * @author Nigel McNie
+ * @version $Id: example.php 2510 2012-06-27 15:57:55Z reedy_boy $
+ */
+header('Content-Type: text/html; charset=utf-8');
+
+error_reporting(E_ALL);
+
+// Rudimentary checking of where GeSHi is. In a default install it will be in ../, but
+// it could be in the current directory if the include_path is set. There's nowhere else
+// we can reasonably guess.
+if (is_readable('../geshi.php')) {
+ $path = '../';
+} elseif (is_readable('geshi.php')) {
+ $path = './';
+} else {
+ die('Could not find geshi.php - make sure it is in your include path!');
+}
+require $path . 'geshi.php';
+
+$fill_source = false;
+if (isset($_POST['submit'])) {
+ if (get_magic_quotes_gpc()) {
+ $_POST['source'] = stripslashes($_POST['source']);
+ }
+ if (!strlen(trim($_POST['source']))) {
+ $_POST['language'] = preg_replace('#[^a-zA-Z0-9\-_]#', '', $_POST['language']);
+ $_POST['source'] = implode('', @file($path . 'geshi/' . $_POST['language'] . '.php'));
+ $_POST['language'] = 'php';
+ } else {
+ $fill_source = true;
+ }
+
+ // Here's a free demo of how GeSHi works.
+
+ // First the initialisation: source code to highlight and the language to use. Make sure
+ // you sanitise correctly if you use $_POST of course - this very script has had a security
+ // advisory against it in the past because of this. Please try not to use this script on a
+ // live site.
+ $geshi = new GeSHi($_POST['source'], $_POST['language']);
+
+ // Use the PRE_VALID header. This means less output source since we don't have to output &nbsp;
+ // everywhere. Of course it also means you can't set the tab width.
+ // HEADER_PRE_VALID puts the <pre> tag inside the list items (<li>) thus producing valid HTML markup.
+ // HEADER_PRE puts the <pre> tag around the list (<ol>) which is invalid in HTML 4 and XHTML 1
+ // HEADER_DIV puts a <div> tag arount the list (valid!) but needs to replace whitespaces with &nbsp
+ // thus producing much larger overhead. You can set the tab width though.
+ $geshi->set_header_type(GESHI_HEADER_PRE_VALID);
+
+ // Enable CSS classes. You can use get_stylesheet() to output a stylesheet for your code. Using
+ // CSS classes results in much less output source.
+ $geshi->enable_classes();
+
+ // Enable line numbers. We want fancy line numbers, and we want every 5th line number to be fancy
+ $geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS, 5);
+
+ // Set the style for the PRE around the code. The line numbers are contained within this box (not
+ // XHTML compliant btw, but if you are liberally minded about these things then you'll appreciate
+ // the reduced source output).
+ $geshi->set_overall_style('font: normal normal 90% monospace; color: #000066; border: 1px solid #d0d0d0; background-color: #f0f0f0;', false);
+
+ // Set the style for line numbers. In order to get style for line numbers working, the <li> element
+ // is being styled. This means that the code on the line will also be styled, and most of the time
+ // you don't want this. So the set_code_style reverts styles for the line (by using a <div> on the line).
+ // So the source output looks like this:
+ //
+ // <pre style="[set_overall_style styles]"><ol>
+ // <li style="[set_line_style styles]"><div style="[set_code_style styles]>...</div></li>
+ // ...
+ // </ol></pre>
+ $geshi->set_line_style('color: #003030;', 'font-weight: bold; color: #006060;', true);
+ $geshi->set_code_style('color: #000020;', true);
+
+ // Styles for hyperlinks in the code. GESHI_LINK for default styles, GESHI_HOVER for hover style etc...
+ // note that classes must be enabled for this to work.
+ $geshi->set_link_styles(GESHI_LINK, 'color: #000060;');
+ $geshi->set_link_styles(GESHI_HOVER, 'background-color: #f0f000;');
+
+ // Use the header/footer functionality. This puts a div with content within the PRE element, so it is
+ // affected by the styles set by set_overall_style. So if the PRE has a border then the header/footer will
+ // appear inside it.
+ $geshi->set_header_content('<SPEED> <TIME> GeSHi &copy; 2004-2007, Nigel McNie, 2007-2008 Benny Baumann. View source of example.php for example of using GeSHi');
+ $geshi->set_header_content_style('font-family: sans-serif; color: #808080; font-size: 70%; font-weight: bold; background-color: #f0f0ff; border-bottom: 1px solid #d0d0d0; padding: 2px;');
+
+ // You can use <TIME> and <VERSION> as placeholders
+ $geshi->set_footer_content('Parsed in <TIME> seconds at <SPEED>, using GeSHi <VERSION>');
+ $geshi->set_footer_content_style('font-family: sans-serif; color: #808080; font-size: 70%; font-weight: bold; background-color: #f0f0ff; border-top: 1px solid #d0d0d0; padding: 2px;');
+} else {
+ // make sure we don't preselect any language
+ $_POST['language'] = null;
+}
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>GeSHi examples</title>
+ <style type="text/css">
+ <!--
+ <?php
+ if (isset($_POST['submit'])) {
+ // Output the stylesheet. Note it doesn't output the <style> tag
+ echo $geshi->get_stylesheet(true);
+ }
+ ?>
+ html {
+ background-color: #f0f0f0;
+ }
+ body {
+ font-family: Verdana, Arial, sans-serif;
+ margin: 10px;
+ border: 2px solid #e0e0e0;
+ background-color: #fcfcfc;
+ padding: 5px;
+ }
+ h2 {
+ margin: .1em 0 .2em .5em;
+ border-bottom: 1px solid #b0b0b0;
+ color: #b0b0b0;
+ font-weight: normal;
+ font-size: 150%;
+ }
+ h3 {
+ margin: .1em 0 .2em .5em;
+ color: #b0b0b0;
+ font-weight: normal;
+ font-size: 120%;
+ }
+ #footer {
+ text-align: center;
+ font-size: 80%;
+ color: #a9a9a9;
+ }
+ #footer a {
+ color: #9999ff;
+ }
+ textarea {
+ border: 1px solid #b0b0b0;
+ font-size: 90%;
+ color: #333;
+ margin-left: 20px;
+ }
+ select, input {
+ margin-left: 20px;
+ }
+ p {
+ font-size: 90%;
+ margin-left: .5em;
+ }
+ -->
+ </style>
+</head>
+<body>
+<h2>GeSHi Example Script</h2>
+<p>To use this script, make sure that <strong>geshi.php</strong> is in the parent directory or in your
+include_path, and that the language files are in a subdirectory of GeSHi's directory called <strong>geshi/</strong>.</p>
+<p>Enter your source and a language to highlight the source in and submit, or just choose a language to
+have that language file highlighted in PHP.</p>
+<?php
+if (isset($_POST['submit'])) {
+ // The fun part :)
+ echo $geshi->parse_code();
+ echo '<hr />';
+}
+?>
+<form action="<?php echo basename($_SERVER['PHP_SELF']); ?>" method="post">
+<h3>Source to highlight</h3>
+<p>
+<textarea rows="10" cols="60" name="source" id="source"><?php echo $fill_source ? htmlspecialchars($_POST['source']) : '' ?></textarea>
+</p>
+<h3>Choose a language</h3>
+<p>
+<select name="language" id="language">
+<?php
+if (!($dir = @opendir(dirname(__FILE__) . '/geshi'))) {
+ if (!($dir = @opendir(dirname(__FILE__) . '/../geshi'))) {
+ echo '<option>No languages available!</option>';
+ }
+}
+$languages = array();
+while ($file = readdir($dir)) {
+ if ( $file[0] == '.' || strpos($file, '.', 1) === false) {
+ continue;
+ }
+ $lang = substr($file, 0, strpos($file, '.'));
+ $languages[] = $lang;
+}
+closedir($dir);
+sort($languages);
+foreach ($languages as $lang) {
+ if (isset($_POST['language']) && $_POST['language'] == $lang) {
+ $selected = 'selected="selected"';
+ } else {
+ $selected = '';
+ }
+ echo '<option value="' . $lang . '" '. $selected .'>' . $lang . "</option>\n";
+}
+
+?>
+</select>
+</p>
+<p>
+<input type="submit" name="submit" value="Highlight Source" />
+<input type="submit" name="clear" onclick="document.getElementById('source').value='';document.getElementById('language').value='';return false" value="clear" />
+</p>
+</form>
+<div id="footer">GeSHi &copy; Nigel McNie, 2004, released under the GNU GPL<br />
+For a better demonstration, check out the <a href="http://qbnz.com/highlighter/demo.php">online demo</a>
+</div>
+</body>
+</html>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/contrib/langcheck.php b/extensions/SyntaxHighlight_GeSHi/geshi/contrib/langcheck.php
new file mode 100644
index 00000000..fa8288be
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/contrib/langcheck.php
@@ -0,0 +1,769 @@
+<?php
+/**
+ * GeSHi language file validation script
+ *
+ * Just point your browser at this script (with geshi.php in the parent directory)
+ * and the language files in subdirectory "../geshi/" are being validated
+ *
+ * CLI mode is supported
+ *
+ * @author Benny Baumann
+ * @version $Id: langcheck.php 2510 2012-06-27 15:57:55Z reedy_boy $
+ */
+header('Content-Type: text/html; charset=utf-8');
+
+set_time_limit(0);
+error_reporting(E_ALL);
+$time_start = explode(' ', microtime());
+
+function colorize($level, $string) {
+ static $colors, $end;
+ if ( !isset($colors) ) {
+ if ( PHP_SAPI != 'cli' ) {
+ $end = '</span>';
+ $colors = array(
+ TYPE_NOTICE => '<span style="color:#080;font-weight:bold;">',
+ TYPE_WARNING => '<span style="color:#CC0; font-weight: bold;">',
+ TYPE_ERROR => '<span style="color:#F00; font-weight: bold;">',
+ TYPE_OK => '<span style="color: #080; font-weight: bold;">'
+ );
+ } else {
+ $end = chr(27).'[0m';
+ $colors = array(
+ TYPE_NOTICE => chr(27).'[1m',
+ TYPE_WARNING => chr(27).'[1;33m',
+ TYPE_ERROR => chr(27).'[1;31m',
+ TYPE_OK => chr(27).'[1;32m'
+ );
+ }
+ }
+
+ if ( !isset($colors[$level]) ) {
+ trigger_error("no colors for level $level", E_USER_ERROR);
+ }
+
+ return $colors[$level].$string.$end;
+}
+
+define ('TYPE_NOTICE', 0);
+define ('TYPE_WARNING', 1);
+define ('TYPE_ERROR', 2);
+define ('TYPE_OK', 3);
+
+$error_abort = false;
+$error_cache = array();
+function output_error_cache(){
+ global $error_cache, $error_abort;
+
+ if(count($error_cache)) {
+ echo colorize(TYPE_ERROR, "Failed");
+ if ( PHP_SAPI == 'cli' ) {
+ echo "\n\n";
+ } else {
+ echo "<br /><ol>\n";
+ }
+ foreach($error_cache as $error_msg) {
+ if ( PHP_SAPI == 'cli' ) {
+ echo "\n";
+ } else {
+ echo "<li>";
+ }
+ switch($error_msg['t']) {
+ case TYPE_NOTICE:
+ $msg = 'NOTICE';
+ break;
+ case TYPE_WARNING:
+ $msg = 'WARNING';
+ break;
+ case TYPE_ERROR:
+ $msg = 'ERROR';
+ break;
+ }
+ echo colorize($error_msg['t'], $msg);
+ if ( PHP_SAPI == 'cli' ) {
+ echo "\t" . $error_msg['m'];
+ } else {
+ echo " " . $error_msg['m'] . "</li>";
+ }
+ }
+ if ( PHP_SAPI == 'cli' ) {
+ echo "\n";
+ } else {
+ echo "</ol>\n";
+ }
+ } else {
+ echo colorize(TYPE_OK, "OK");
+ if ( PHP_SAPI == 'cli' ) {
+ echo "\n";
+ } else {
+ echo "\n<br />";
+ }
+ }
+ echo "\n";
+
+ $error_cache = array();
+}
+
+function report_error($type, $message) {
+ global $error_cache, $error_abort;
+
+ $error_cache[] = array('t' => $type, 'm' => $message);
+ if(TYPE_ERROR == $type) {
+ $error_abort = true;
+ }
+}
+
+function dupfind_strtolower(&$value){
+ $value = strtolower($value);
+}
+
+if ( PHP_SAPI != 'cli' ) { ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>GeSHi Language File Validation Script</title>
+ <style type="text/css">
+ <!--
+ html {
+ background-color: #f0f0f0;
+ }
+ body {
+ font-family: Verdana, Arial, sans-serif;
+ margin: 10px;
+ border: 2px solid #e0e0e0;
+ background-color: #fcfcfc;
+ padding: 5px;
+ font-size: 10pt;
+ }
+ h2 {
+ margin: .1em 0 .2em .5em;
+ border-bottom: 1px solid #b0b0b0;
+ color: #b0b0b0;
+ font-weight: normal;
+ font-size: 150%;
+ }
+ h3 {
+ margin: .1em 0 .2em .5em;
+ color: #b0b0b0;
+ font-weight: normal;
+ font-size: 120%;
+ }
+ #footer {
+ text-align: center;
+ font-size: 80%;
+ color: #a9a9a9;
+ }
+ #footer a {
+ color: #9999ff;
+ }
+ textarea {
+ border: 1px solid #b0b0b0;
+ font-size: 90%;
+ color: #333;
+ margin-left: 20px;
+ }
+ select, input {
+ margin-left: 20px;
+ }
+ p {
+ font-size: 90%;
+ margin-left: .5em;
+ }
+ -->
+ </style>
+</head>
+<body>
+<h2>GeSHi Language File Validation Script</h2>
+<p>To use this script, make sure that <strong>geshi.php</strong> is in the
+parent directory or in your include_path, and that the language files are in a
+subdirectory of GeSHi's directory called <strong>geshi/</strong>.</p>
+<p>Everything else will be done by this script automatically. After the script
+finished you should see messages of what could cause trouble with GeSHi or where
+your language files can be improved. Please be patient, as this might take some time.</p>
+
+<ol>
+<li>Checking where to find GeSHi installation ...<?php
+} else { ?>
+<?php echo colorize(TYPE_NOTICE, "#### GeSHi Language File Validation Script ####") ?>
+
+
+To use this script, make sure that <?php echo colorize(TYPE_NOTICE, "geshi.php"); ?> is in the
+parent directory or in your include_path, and that the language files are in a
+subdirectory of GeSHi's directory called <?php echo colorize(TYPE_NOTICE, "geshi/"); ?>.
+
+Everything else will be done by this script automatically. After the script
+finished you should see messages of what could cause trouble with GeSHi or where
+your language files can be improved. Please be patient, as this might take some time.
+
+
+Checking where to find GeSHi installation ...<?php echo "\t";
+}
+
+// Rudimentary checking of where GeSHi is. In a default install it will be in ../, but
+// it could be in the current directory if the include_path is set. There's nowhere else
+// we can reasonably guess.
+if (is_readable('../geshi.php')) {
+ $path = '../';
+} elseif (is_readable('geshi.php')) {
+ $path = './';
+} else {
+ report_error(TYPE_ERROR, 'Could not find geshi.php - make sure it is in your include path!');
+}
+
+if(!$error_abort) {
+ require $path . 'geshi.php';
+
+ if(!class_exists('GeSHi')) {
+ report_error(TYPE_ERROR, 'The GeSHi class was not found, although it seemed we loaded the correct file!');
+ }
+}
+
+if(!$error_abort) {
+ if(!defined('GESHI_LANG_ROOT')) {
+ report_error(TYPE_ERROR, 'There\'s no information present on where to find the language files!');
+ } elseif(!is_dir(GESHI_LANG_ROOT)) {
+ report_error(TYPE_ERROR, 'The path "'.GESHI_LANG_ROOT.'" given, does not ressemble a directory!');
+ } elseif(!is_readable(GESHI_LANG_ROOT)) {
+ report_error(TYPE_ERROR, 'The path "'.GESHI_LANG_ROOT.'" is not readable to this script!');
+ }
+}
+
+output_error_cache();
+
+if(!$error_abort) {
+ if ( PHP_SAPI == 'cli' ) {
+ echo "Listing available language files ...\t\t";
+ } else {
+ echo "</li>\n<li>Listing available language files ... ";
+ }
+
+ if (!($dir = @opendir(GESHI_LANG_ROOT))) {
+ report_error(TYPE_ERROR, 'Error requesting listing for available language files!');
+ }
+
+ $languages = array();
+
+ if(!$error_abort) {
+ while ($file = readdir($dir)) {
+ if (!$file || $file[0] == '.' || strpos($file, '.php') === false) {
+ continue;
+ }
+ $lang = substr($file, 0, strpos($file, '.'));
+ if(4 != strlen($file) - strlen($lang)) {
+ continue;
+ }
+ $languages[] = $lang;
+ }
+ closedir($dir);
+ }
+
+ $languages = array_unique($languages);
+ sort($languages);
+
+ if(!count($languages)) {
+ report_error(TYPE_WARNING, 'Unable to locate any usable language files in "'.GESHI_LANG_ROOT.'"!');
+ }
+
+ output_error_cache();
+}
+
+if ( PHP_SAPI == 'cli' ) {
+ if (isset($_SERVER['argv'][1]) && in_array($_SERVER['argv'][1], $languages)) {
+ $languages = array($_SERVER['argv'][1]);
+ }
+} else {
+ if (isset($_REQUEST['show']) && in_array($_REQUEST['show'], $languages)) {
+ $languages = array($_REQUEST['show']);
+ }
+}
+
+if(!$error_abort) {
+ foreach ($languages as $lang) {
+
+ if ( PHP_SAPI == 'cli' ) {
+ echo "Validating language file for '$lang' ...\t\t";
+ } else {
+ echo "</li>\n<li>Validating language file for '$lang' ... ";
+ }
+
+ $langfile = GESHI_LANG_ROOT . $lang . '.php';
+
+ $language_data = array();
+
+ if(!is_file($langfile)) {
+ report_error(TYPE_ERROR, 'The path "' .$langfile. '" does not ressemble a regular file!');
+ } elseif(!is_readable($langfile)) {
+ report_error(TYPE_ERROR, 'Cannot read file "' .$langfile. '"!');
+ } else {
+ $langfile_content = file_get_contents($langfile);
+ if(preg_match("/\?>(?:\r?\n|\r(?!\n)){2,}\Z/", $langfile_content)) {
+ report_error(TYPE_ERROR, 'Language file contains trailing empty lines at EOF!');
+ }
+ if(!preg_match("/\?>(?:\r?\n|\r(?!\n))?\Z/", $langfile_content)) {
+ report_error(TYPE_ERROR, 'Language file contains no PHP end marker at EOF!');
+ }
+ if(preg_match("/\t/", $langfile_content)) {
+ report_error(TYPE_NOTICE, 'Language file contains unescaped tabulator chars (probably for indentation)!');
+ }
+ if(preg_match('/^(?: )*(?! )(?! \*) /m', $langfile_content)) {
+ report_error(TYPE_NOTICE, 'Language file contains irregular indentation (other than 4 spaces per indentation level)!');
+ }
+
+ if(!preg_match("/\/\*\*((?!\*\/).)*?Author:((?!\*\/).)*?\*\//s", $langfile_content)) {
+ report_error(TYPE_WARNING, 'Language file does not contain a specification of an author!');
+ }
+ if(!preg_match("/\/\*\*((?!\*\/).)*?Copyright:((?!\*\/).)*?\*\//s", $langfile_content)) {
+ report_error(TYPE_WARNING, 'Language file does not contain a specification of the copyright!');
+ }
+ if(!preg_match("/\/\*\*((?!\*\/).)*?Release Version:((?!\*\/).)*?\*\//s", $langfile_content)) {
+ report_error(TYPE_WARNING, 'Language file does not contain a specification of the release version!');
+ }
+ if(!preg_match("/\/\*\*((?!\*\/).)*?Date Started:((?!\*\/).)*?\*\//s", $langfile_content)) {
+ report_error(TYPE_WARNING, 'Language file does not contain a specification of the date it was started!');
+ }
+ if(!preg_match("/\/\*\*((?!\*\/).)*?This file is part of GeSHi\.((?!\*\/).)*?\*\//s", $langfile_content)) {
+ report_error(TYPE_WARNING, 'Language file does not state that it belongs to GeSHi!');
+ }
+ if(!preg_match("/\/\*\*((?!\*\/).)*?language file for GeSHi\.((?!\*\/).)*?\*\//s", $langfile_content)) {
+ report_error(TYPE_WARNING, 'Language file does not state that it is a language file for GeSHi!');
+ }
+ if(!preg_match("/\/\*\*((?!\*\/).)*?GNU General Public License((?!\*\/).)*?\*\//s", $langfile_content)) {
+ report_error(TYPE_WARNING, 'Language file does not state that it is provided under the terms of the GNU GPL!');
+ }
+
+ unset($langfile_content);
+
+ include $langfile;
+
+ if(!isset($language_data)) {
+ report_error(TYPE_ERROR, 'Language file does not contain a $language_data structure to check!');
+ } elseif (!is_array($language_data)) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data structure which is not an array!');
+ }
+ }
+
+ if(!$error_abort) {
+ if(!isset($language_data['LANG_NAME'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'LANG_NAME\'] specification!');
+ } elseif (!is_string($language_data['LANG_NAME'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'LANG_NAME\'] specification which is not a string!');
+ }
+
+ if(!isset($language_data['COMMENT_SINGLE'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'COMMENT_SIGNLE\'] structure to check!');
+ } elseif (!is_array($language_data['COMMENT_SINGLE'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'COMMENT_SINGLE\'] structure which is not an array!');
+ }
+
+ if(!isset($language_data['COMMENT_MULTI'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'COMMENT_MULTI\'] structure to check!');
+ } elseif (!is_array($language_data['COMMENT_MULTI'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'COMMENT_MULTI\'] structure which is not an array!');
+ }
+
+ if(isset($language_data['COMMENT_REGEXP'])) {
+ if (!is_array($language_data['COMMENT_REGEXP'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'COMMENT_REGEXP\'] structure which is not an array!');
+ }
+ }
+
+ if(!isset($language_data['QUOTEMARKS'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'QUOTEMARKS\'] structure to check!');
+ } elseif (!is_array($language_data['QUOTEMARKS'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'QUOTEMARKS\'] structure which is not an array!');
+ }
+
+ if(isset($language_data['HARDQUOTE'])) {
+ if (!is_array($language_data['HARDQUOTE'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'HARDQUOTE\'] structure which is not an array!');
+ }
+ }
+
+ if(!isset($language_data['ESCAPE_CHAR'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'ESCAPE_CHAR\'] specification to check!');
+ } elseif (!is_string($language_data['ESCAPE_CHAR'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'ESCAPE_CHAR\'] specification which is not a string!');
+ } elseif (1 < strlen($language_data['ESCAPE_CHAR'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'ESCAPE_CHAR\'] specification is not empty or exactly one char!');
+ }
+
+ if(!isset($language_data['CASE_KEYWORDS'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'CASE_KEYWORDS\'] specification!');
+ } elseif (!is_int($language_data['CASE_KEYWORDS'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'CASE_KEYWORDS\'] specification which is not an integer!');
+ } elseif (GESHI_CAPS_NO_CHANGE != $language_data['CASE_KEYWORDS'] &&
+ GESHI_CAPS_LOWER != $language_data['CASE_KEYWORDS'] &&
+ GESHI_CAPS_UPPER != $language_data['CASE_KEYWORDS']) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'CASE_KEYWORDS\'] specification which is neither of GESHI_CAPS_NO_CHANGE, GESHI_CAPS_LOWER nor GESHI_CAPS_UPPER!');
+ }
+
+ if(!isset($language_data['KEYWORDS'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'KEYWORDS\'] structure to check!');
+ } elseif (!is_array($language_data['KEYWORDS'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'KEYWORDS\'] structure which is not an array!');
+ } else {
+ foreach($language_data['KEYWORDS'] as $kw_key => $kw_value) {
+ if(!is_integer($kw_key)) {
+ report_error(TYPE_WARNING, "Language file contains an key '$kw_key' in \$language_data['KEYWORDS'] that is not integer!");
+ } elseif (!is_array($kw_value)) {
+ report_error(TYPE_ERROR, "Language file contains a \$language_data['KEYWORDS']['$kw_value'] structure which is not an array!");
+ }
+ }
+ }
+
+ if(!isset($language_data['SYMBOLS'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'SYMBOLS\'] structure to check!');
+ } elseif (!is_array($language_data['SYMBOLS'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'SYMBOLS\'] structure which is not an array!');
+ }
+
+ if(!isset($language_data['CASE_SENSITIVE'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'CASE_SENSITIVE\'] structure to check!');
+ } elseif (!is_array($language_data['CASE_SENSITIVE'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'CASE_SENSITIVE\'] structure which is not an array!');
+ } else {
+ foreach($language_data['CASE_SENSITIVE'] as $cs_key => $cs_value) {
+ if(!is_integer($cs_key)) {
+ report_error(TYPE_WARNING, "Language file contains an key '$cs_key' in \$language_data['CASE_SENSITIVE'] that is not integer!");
+ } elseif (!is_bool($cs_value)) {
+ report_error(TYPE_ERROR, "Language file contains a Case Sensitivity specification for \$language_data['CASE_SENSITIVE']['$cs_value'] which is not a boolean!");
+ }
+ }
+ }
+
+ if(!isset($language_data['URLS'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'URLS\'] structure to check!');
+ } elseif (!is_array($language_data['URLS'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'URLS\'] structure which is not an array!');
+ } else {
+ foreach($language_data['URLS'] as $url_key => $url_value) {
+ if(!is_integer($url_key)) {
+ report_error(TYPE_WARNING, "Language file contains an key '$url_key' in \$language_data['URLS'] that is not integer!");
+ } elseif (!is_string($url_value)) {
+ report_error(TYPE_ERROR, "Language file contains a Documentation URL specification for \$language_data['URLS']['$url_value'] which is not a string!");
+ } elseif (preg_match('#&([^;]*(=|$))#U', $url_value)) {
+ report_error(TYPE_ERROR, "Language file contains unescaped ampersands (&amp;) in \$language_data['URLS']!");
+ }
+ }
+ }
+
+ if(!isset($language_data['OOLANG'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'OOLANG\'] specification!');
+ } elseif (!is_int($language_data['OOLANG']) && !is_bool($language_data['OOLANG'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'OOLANG\'] specification which is neither boolean nor integer!');
+ } elseif (false !== $language_data['OOLANG'] &&
+ true !== $language_data['OOLANG'] &&
+ 2 !== $language_data['OOLANG']) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'OOLANG\'] specification which is neither of false, true or 2!');
+ }
+
+ if(!isset($language_data['OBJECT_SPLITTERS'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'OBJECT_SPLITTERS\'] structure to check!');
+ } elseif (!is_array($language_data['OBJECT_SPLITTERS'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'OBJECT_SPLITTERS\'] structure which is not an array!');
+ }
+
+ if(!isset($language_data['REGEXPS'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'REGEXPS\'] structure to check!');
+ } elseif (!is_array($language_data['REGEXPS'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'REGEXPS\'] structure which is not an array!');
+ }
+
+ if(!isset($language_data['STRICT_MODE_APPLIES'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'STRICT_MODE_APPLIES\'] specification!');
+ } elseif (!is_int($language_data['STRICT_MODE_APPLIES'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'STRICT_MODE_APPLIES\'] specification which is not an integer!');
+ } elseif (GESHI_MAYBE != $language_data['STRICT_MODE_APPLIES'] &&
+ GESHI_ALWAYS != $language_data['STRICT_MODE_APPLIES'] &&
+ GESHI_NEVER != $language_data['STRICT_MODE_APPLIES']) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'STRICT_MODE_APPLIES\'] specification which is neither of GESHI_MAYBE, GESHI_ALWAYS nor GESHI_NEVER!');
+ }
+
+ if(!isset($language_data['SCRIPT_DELIMITERS'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'SCRIPT_DELIMITERS\'] structure to check!');
+ } elseif (!is_array($language_data['SCRIPT_DELIMITERS'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'SCRIPT_DELIMITERS\'] structure which is not an array!');
+ }
+
+ if(!isset($language_data['HIGHLIGHT_STRICT_BLOCK'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'HIGHLIGHT_STRICT_BLOCK\'] structure to check!');
+ } elseif (!is_array($language_data['HIGHLIGHT_STRICT_BLOCK'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'HIGHLIGHT_STRICT_BLOCK\'] structure which is not an array!');
+ }
+
+ if(isset($language_data['TAB_WIDTH'])) {
+ if (!is_int($language_data['TAB_WIDTH'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'TAB_WIDTH\'] specification which is not an integer!');
+ } elseif (1 > $language_data['TAB_WIDTH']) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'TAB_WIDTH\'] specification which is less than 1!');
+ }
+ }
+
+ if(isset($language_data['PARSER_CONTROL'])) {
+ if (!is_array($language_data['PARSER_CONTROL'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'PARSER_CONTROL\'] structure which is not an array!');
+ }
+ }
+
+ if(!isset($language_data['STYLES'])) {
+ report_error(TYPE_ERROR, 'Language file contains no $language_data[\'STYLES\'] structure to check!');
+ } elseif (!is_array($language_data['STYLES'])) {
+ report_error(TYPE_ERROR, 'Language file contains a $language_data[\'STYLES\'] structure which is not an array!');
+ } else {
+ $style_arrays = array('KEYWORDS', 'COMMENTS', 'ESCAPE_CHAR',
+ 'BRACKETS', 'STRINGS', 'NUMBERS', 'METHODS', 'SYMBOLS',
+ 'REGEXPS', 'SCRIPT');
+ foreach($style_arrays as $style_kind) {
+ if(!isset($language_data['STYLES'][$style_kind])) {
+ report_error(TYPE_ERROR, "Language file contains no \$language_data['STYLES']['$style_kind'] structure to check!");
+ } elseif (!is_array($language_data['STYLES'][$style_kind])) {
+ report_error(TYPE_ERROR, "Language file contains a \$language_data['STYLES\']['$style_kind'] structure which is not an array!");
+ } else {
+ foreach($language_data['STYLES'][$style_kind] as $sk_key => $sk_value) {
+ if(!is_int($sk_key) && ('COMMENTS' != $style_kind && 'MULTI' != $sk_key)
+ && !(('STRINGS' == $style_kind || 'ESCAPE_CHAR' == $style_kind) && 'HARD' == $sk_key)) {
+ report_error(TYPE_WARNING, "Language file contains an key '$sk_key' in \$language_data['STYLES']['$style_kind'] that is not integer!");
+ } elseif (!is_string($sk_value)) {
+ report_error(TYPE_WARNING, "Language file contains a CSS specification for \$language_data['STYLES']['$style_kind'][$key] which is not a string!");
+ }
+ }
+ }
+ }
+
+ unset($style_arrays);
+ }
+ }
+
+ if(!$error_abort) {
+ //Initial sanity checks survived? --> Let's dig deeper!
+ foreach($language_data['KEYWORDS'] as $key => $keywords) {
+ if(!isset($language_data['CASE_SENSITIVE'][$key])) {
+ report_error(TYPE_ERROR, "Language file contains no \$language_data['CASE_SENSITIVE'] specification for keyword group $key!");
+ }
+ if(!isset($language_data['URLS'][$key])) {
+ report_error(TYPE_ERROR, "Language file contains no \$language_data['URLS'] specification for keyword group $key!");
+ }
+ if(empty($keywords)) {
+ report_error(TYPE_WARNING, "Language file contains an empty keyword list in \$language_data['KEYWORDS'] for group $key!");
+ }
+ foreach($keywords as $id => $kw) {
+ if(!is_string($kw)) {
+ report_error(TYPE_WARNING, "Language file contains an non-string entry at \$language_data['KEYWORDS'][$key][$id]!");
+ } elseif (!strlen($kw)) {
+ report_error(TYPE_ERROR, "Language file contains an empty string entry at \$language_data['KEYWORDS'][$key][$id]!");
+ } elseif (preg_match('/^([\(\)\{\}\[\]\^=.,:;\-+\*\/%\$\"\'\?]|&[\w#]\w*;)+$/i', $kw)) {
+ report_error(TYPE_NOTICE, "Language file contains an keyword ('$kw') at \$language_data['KEYWORDS'][$key][$id] which seems to be better suited for the symbols section!");
+ }
+ }
+ if(isset($language_data['CASE_SENSITIVE'][$key]) && !$language_data['CASE_SENSITIVE'][$key]) {
+ array_walk($keywords, 'dupfind_strtolower');
+ }
+ if(count($keywords) != count(array_unique($keywords))) {
+ $kw_diffs = array_count_values($keywords);
+ foreach($kw_diffs as $kw => $kw_count) {
+ if($kw_count > 1) {
+ report_error(TYPE_WARNING, "Language file contains per-group duplicate keyword '$kw' in \$language_data['KEYWORDS'][$key]!");
+ }
+ }
+ }
+ }
+
+ $disallowed_before = "(?<![a-zA-Z0-9\$_\|\#;>|^&";
+ $disallowed_after = "(?![a-zA-Z0-9_\|%\\-&;";
+
+ foreach($language_data['KEYWORDS'] as $key => $keywords) {
+ foreach($language_data['KEYWORDS'] as $key2 => $keywords2) {
+ if($key2 <= $key) {
+ continue;
+ }
+ $kw_diffs = array_intersect($keywords, $keywords2);
+ foreach($kw_diffs as $kw) {
+ if(isset($language_data['PARSER_CONTROL']['KEYWORDS'])) {
+ //Check the precondition\post-cindition for the involved keyword groups
+ $g1_pre = $disallowed_before;
+ $g2_pre = $disallowed_before;
+ $g1_post = $disallowed_after;
+ $g2_post = $disallowed_after;
+ if(isset($language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_BEFORE'])) {
+ $g1_pre = $language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_BEFORE'];
+ $g2_pre = $language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_BEFORE'];
+ }
+ if(isset($language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_AFTER'])) {
+ $g1_post = $language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_AFTER'];
+ $g2_post = $language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_AFTER'];
+ }
+
+ if(isset($language_data['PARSER_CONTROL']['KEYWORDS'][$key]['DISALLOWED_BEFORE'])) {
+ $g1_pre = $language_data['PARSER_CONTROL']['KEYWORDS'][$key]['DISALLOWED_BEFORE'];
+ }
+ if(isset($language_data['PARSER_CONTROL']['KEYWORDS'][$key]['DISALLOWED_AFTER'])) {
+ $g1_post = $language_data['PARSER_CONTROL']['KEYWORDS'][$key]['DISALLOWED_AFTER'];
+ }
+
+ if(isset($language_data['PARSER_CONTROL']['KEYWORDS'][$key2]['DISALLOWED_BEFORE'])) {
+ $g2_pre = $language_data['PARSER_CONTROL']['KEYWORDS'][$key2]['DISALLOWED_BEFORE'];
+ }
+ if(isset($language_data['PARSER_CONTROL']['KEYWORDS'][$key2]['DISALLOWED_AFTER'])) {
+ $g2_post = $language_data['PARSER_CONTROL']['KEYWORDS'][$key2]['DISALLOWED_AFTER'];
+ }
+
+ if($g1_pre != $g2_pre || $g1_post != $g2_post) {
+ continue;
+ }
+ }
+ report_error(TYPE_WARNING, "Language file contains cross-group duplicate keyword '$kw' in \$language_data['KEYWORDS'][$key] and \$language_data['KEYWORDS'][$key2]!");
+ }
+ }
+ }
+ foreach($language_data['CASE_SENSITIVE'] as $key => $keywords) {
+ if(!isset($language_data['KEYWORDS'][$key]) && $key != GESHI_COMMENTS) {
+ report_error(TYPE_WARNING, "Language file contains an superfluous \$language_data['CASE_SENSITIVE'] specification for non-existing keyword group $key!");
+ }
+ }
+ foreach($language_data['URLS'] as $key => $keywords) {
+ if(!isset($language_data['KEYWORDS'][$key])) {
+ report_error(TYPE_WARNING, "Language file contains an superfluous \$language_data['URLS'] specification for non-existing keyword group $key!");
+ }
+ }
+ foreach($language_data['STYLES']['KEYWORDS'] as $key => $keywords) {
+ if(!isset($language_data['KEYWORDS'][$key])) {
+ report_error(TYPE_WARNING, "Language file contains an superfluous \$language_data['STYLES']['KEYWORDS'] specification for non-existing keyword group $key!");
+ }
+ }
+
+ foreach($language_data['COMMENT_SINGLE'] as $ck => $cv) {
+ if(!is_int($ck)) {
+ report_error(TYPE_WARNING, "Language file contains an key '$ck' in \$language_data['COMMENT_SINGLE'] that is not integer!");
+ }
+ if(!is_string($cv)) {
+ report_error(TYPE_WARNING, "Language file contains an non-string entry at \$language_data['COMMENT_SINGLE'][$ck]!");
+ }
+ if(!isset($language_data['STYLES']['COMMENTS'][$ck])) {
+ report_error(TYPE_WARNING, "Language file contains no \$language_data['STYLES']['COMMENTS'] specification for comment group $ck!");
+ }
+ }
+ if(isset($language_data['COMMENT_REGEXP'])) {
+ foreach($language_data['COMMENT_REGEXP'] as $ck => $cv) {
+ if(!is_int($ck)) {
+ report_error(TYPE_WARNING, "Language file contains an key '$ck' in \$language_data['COMMENT_REGEXP'] that is not integer!");
+ }
+ if(!is_string($cv)) {
+ report_error(TYPE_WARNING, "Language file contains an non-string entry at \$language_data['COMMENT_REGEXP'][$ck]!");
+ }
+ if(!isset($language_data['STYLES']['COMMENTS'][$ck])) {
+ report_error(TYPE_WARNING, "Language file contains no \$language_data['STYLES']['COMMENTS'] specification for comment group $ck!");
+ }
+ }
+ }
+ foreach($language_data['STYLES']['COMMENTS'] as $ck => $cv) {
+ if($ck != 'MULTI' && !isset($language_data['COMMENT_SINGLE'][$ck]) &&
+ !isset($language_data['COMMENT_REGEXP'][$ck])) {
+ report_error(TYPE_NOTICE, "Language file contains an superfluous \$language_data['STYLES']['COMMENTS'] specification for Single Line or Regular-Expression Comment key $ck!");
+ }
+ }
+ if (isset($language_data['STYLES']['STRINGS']['HARD'])) {
+ if (empty($language_data['HARDQUOTE'])) {
+ report_error(TYPE_NOTICE, "Language file contains superfluous \$language_data['STYLES']['STRINGS'] specification for key 'HARD', but no 'HARDQUOTE's are defined!");
+ }
+ unset($language_data['STYLES']['STRINGS']['HARD']);
+ }
+ foreach($language_data['STYLES']['STRINGS'] as $sk => $sv) {
+ if($sk && !isset($language_data['QUOTEMARKS'][$sk])) {
+ report_error(TYPE_NOTICE, "Language file contains an superfluous \$language_data['STYLES']['STRINGS'] specification for non-existing quotemark key $sk!");
+ }
+ }
+
+ foreach($language_data['REGEXPS'] as $rk => $rv) {
+ if(!is_int($rk)) {
+ report_error(TYPE_WARNING, "Language file contains an key '$rk' in \$language_data['REGEXPS'] that is not integer!");
+ }
+ if(is_string($rv)) {
+ //Check for unmasked / in regular expressions ...
+ if(empty($rv)) {
+ report_error(TYPE_WARNING, "Language file contains an empty regular expression at \$language_data['REGEXPS'][$rk]!");
+ } else {
+ if(preg_match("/(?<!\\\\)\//s", $rv)) {
+ report_error(TYPE_WARNING, "Language file contains a regular expression with an unmasked / character at \$language_data['REGEXPS'][$rk]!");
+ } elseif (preg_match("/(?<!<)(\\\\\\\\)*\\\\\|(?!>)/s", $rv)) {
+ report_error(TYPE_WARNING, "Language file contains a regular expression with an unescaped match for a pipe character '|' which needs escaping as '&lt;PIPE&gt;' instead at \$language_data['REGEXPS'][$rk]!");
+ }
+ }
+ } elseif(is_array($rv)) {
+ if(!isset($rv[GESHI_SEARCH])) {
+ report_error(TYPE_ERROR, "Language file contains no GESHI_SEARCH entry in extended regular expression at \$language_data['REGEXPS'][$rk]!");
+ } elseif(!is_string($rv[GESHI_SEARCH])) {
+ report_error(TYPE_ERROR, "Language file contains a GESHI_SEARCH entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!");
+ } else {
+ if(preg_match("/(?<!\\\\)\//s", $rv[GESHI_SEARCH])) {
+ report_error(TYPE_WARNING, "Language file contains a regular expression with an unmasked / character at \$language_data['REGEXPS'][$rk]!");
+ } elseif (preg_match("/(?<!<)(\\\\\\\\)*\\\\\|(?!>)/s", $rv[GESHI_SEARCH])) {
+ report_error(TYPE_WARNING, "Language file contains a regular expression with an unescaped match for a pipe character '|' which needs escaping as '&lt;PIPE&gt;' instead at \$language_data['REGEXPS'][$rk]!");
+ }
+ }
+ if(!isset($rv[GESHI_REPLACE])) {
+ report_error(TYPE_WARNING, "Language file contains no GESHI_REPLACE entry in extended regular expression at \$language_data['REGEXPS'][$rk]!");
+ } elseif(!is_string($rv[GESHI_REPLACE])) {
+ report_error(TYPE_ERROR, "Language file contains a GESHI_REPLACE entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!");
+ }
+ if(!isset($rv[GESHI_MODIFIERS])) {
+ report_error(TYPE_WARNING, "Language file contains no GESHI_MODIFIERS entry in extended regular expression at \$language_data['REGEXPS'][$rk]!");
+ } elseif(!is_string($rv[GESHI_MODIFIERS])) {
+ report_error(TYPE_ERROR, "Language file contains a GESHI_MODIFIERS entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!");
+ }
+ if(!isset($rv[GESHI_BEFORE])) {
+ report_error(TYPE_WARNING, "Language file contains no GESHI_BEFORE entry in extended regular expression at \$language_data['REGEXPS'][$rk]!");
+ } elseif(!is_string($rv[GESHI_BEFORE])) {
+ report_error(TYPE_ERROR, "Language file contains a GESHI_BEFORE entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!");
+ }
+ if(!isset($rv[GESHI_AFTER])) {
+ report_error(TYPE_WARNING, "Language file contains no GESHI_AFTER entry in extended regular expression at \$language_data['REGEXPS'][$rk]!");
+ } elseif(!is_string($rv[GESHI_AFTER])) {
+ report_error(TYPE_ERROR, "Language file contains a GESHI_AFTER entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!");
+ }
+ } else {
+ report_error(TYPE_WARNING, "Language file contains an non-string and non-array entry at \$language_data['REGEXPS'][$rk]!");
+ }
+ if(!isset($language_data['STYLES']['REGEXPS'][$rk])) {
+ report_error(TYPE_WARNING, "Language file contains no \$language_data['STYLES']['REGEXPS'] specification for regexp group $rk!");
+ }
+ }
+ foreach($language_data['STYLES']['REGEXPS'] as $rk => $rv) {
+ if(!isset($language_data['REGEXPS'][$rk])) {
+ report_error(TYPE_NOTICE, "Language file contains an superfluous \$language_data['STYLES']['REGEXPS'] specification for regexp key $rk!");
+ }
+ }
+
+
+ }
+
+ output_error_cache();
+
+ flush();
+
+ if($error_abort) {
+ break;
+ }
+ }
+}
+
+$time_end = explode(' ', microtime());
+$time_diff = $time_end[0] + $time_end[1] - $time_start[0] - $time_start[1];
+
+if ( PHP_SAPI != 'cli' ) {
+?></li>
+</ol>
+
+<p>Validation process completed in <? printf("%.2f", $time_diff); ?> seconds.</p>
+
+<div id="footer">GeSHi &copy; 2004-2007 Nigel McNie, 2007-2008 Benny Baumann, released under the GNU GPL</div>
+</body>
+</html>
+
+<?php } else { ?>
+
+Validation process completed in <? printf("%.2f", $time_diff); ?> seconds.
+
+GeSHi &copy; 2004-2007 Nigel McNie, 2007-2012 Benny Baumann, released under the GNU GPL
+
+<?php } ?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/contrib/langwiz.php b/extensions/SyntaxHighlight_GeSHi/geshi/contrib/langwiz.php
new file mode 100644
index 00000000..32d025a9
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/contrib/langwiz.php
@@ -0,0 +1,1158 @@
+<?php
+/**
+ * GeSHi example script
+ *
+ * Just point your browser at this script (with geshi.php in the parent directory,
+ * and the language files in subdirectory "../geshi/")
+ *
+ *This script
+ *
+ * @author Nigel McNie, Benny Baumann (BenBE@geshi.org), Andreas 'Segaja' Schleifer (webmaster at segaja dot de)
+ * @version $Id: langwiz.php 2510 2012-06-27 15:57:55Z reedy_boy $
+ */
+header('Content-Type: text/html; charset=utf-8');
+
+set_time_limit(0);
+error_reporting(E_ALL);
+$time_start = explode(' ', microtime());
+
+//Handle crappy PHP magic:
+if (get_magic_quotes_gpc()) {
+ function stripslashes_deep($value) {
+ $value = is_array($value) ?
+ array_map('stripslashes_deep', $value) :
+ stripslashes($value);
+
+ return $value;
+ }
+
+ $_POST = array_map('stripslashes_deep', $_POST);
+ $_GET = array_map('stripslashes_deep', $_GET);
+ $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
+ $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
+}
+
+function htmlspecialchars_deep($value) {
+ return is_array($value) ? array_map('htmlspecialchars_deep', $value) : htmlspecialchars($value);
+}
+
+define ('TYPE_NOTICE', 0);
+define ('TYPE_WARNING', 1);
+define ('TYPE_ERROR', 2);
+
+$error_abort = false;
+$error_cache = array();
+function output_error_cache(){
+ global $error_cache, $error_abort;
+
+ if(count($error_cache)) {
+ echo "<span style=\"color: #F00; font-weight: bold;\">Failed</span><br />";
+ echo "<ol>\n";
+ foreach($error_cache as $error_msg) {
+ echo "<li>";
+ switch($error_msg['t']) {
+ case TYPE_NOTICE:
+ echo "<span style=\"color: #080; font-weight: bold;\">NOTICE:</span>";
+ break;
+ case TYPE_WARNING:
+ echo "<span style=\"color: #CC0; font-weight: bold;\">WARNING:</span>";
+ break;
+ case TYPE_ERROR:
+ echo "<span style=\"color: #F00; font-weight: bold;\">ERROR:</span>";
+ break;
+ }
+ echo " " . $error_msg['m'] . "</li>";
+ }
+ echo "</ol>\n";
+ } else {
+ echo "<span style=\"color: #080; font-weight: bold;\">OK</span><br />";
+ }
+ echo "\n";
+
+ $error_cache = array();
+}
+
+function report_error($type, $message) {
+ global $error_cache, $error_abort;
+
+ $error_cache[] = array('t' => $type, 'm' => $message);
+ if(TYPE_ERROR == $type) {
+ $error_abort = true;
+ }
+}
+
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>GeSHi Language File Generator Script</title>
+ <style type="text/css">
+ <!--
+ html {
+ background-color: #f0f0f0;
+ }
+ body {
+ font-family: Verdana, Arial, sans-serif;
+ margin: 10px;
+ border: 2px solid #e0e0e0;
+ background-color: #fcfcfc;
+ padding: 5px;
+ font-size: 10pt;
+ }
+ h2 {
+ margin: .1em 0 .2em .5em;
+ border-bottom: 1px solid #b0b0b0;
+ color: #b0b0b0;
+ font-weight: normal;
+ font-size: 150%;
+ }
+ h3 {
+ margin: .1em 0 .2em .5em;
+ color: #b0b0b0;
+ font-weight: normal;
+ font-size: 120%;
+ }
+ #footer {
+ text-align: center;
+ font-size: 80%;
+ color: #a9a9a9;
+ }
+ #footer a {
+ color: #9999ff;
+ }
+ textarea {
+ border: 1px solid #b0b0b0;
+ font-size: 90%;
+ color: #333;
+ margin-left: 20px;
+ }
+ select, input {
+ margin-left: 2px;
+ border: 1px solid #808080;
+ }
+ p {
+ font-size: 90%;
+ margin-left: .5em;
+ }
+ fieldset {
+ border: 1px dotted gray;
+ background-color: #f0f0f0;
+ margin-bottom: .5em;
+ }
+ legend {
+ font-weight: bold;
+ background-color: #f9f9f9;
+ border: 1px solid #a0a0a0;
+ border-width: 1px 2px 2px 1px;
+ }
+ fieldset table > tbody > tr > td {
+ width: 20%;
+ }
+ fieldset table > tbody > tr > td+td {
+ width: 80%;
+ }
+
+ fieldset table > tbody > tr > td+td > input {
+ width: 98%;
+ }
+ -->
+ </style>
+</head>
+<body>
+<h2>GeSHi Language File Generator Script</h2>
+<p>To use this script, make sure that <strong>geshi.php</strong> is in the
+parent directory or in your include_path, and that the language files are in a
+subdirectory of GeSHi's directory called <strong>geshi/</strong>.</p>
+<p>If not already done, select a language file below that will be used as
+base for the language file to generate or create a blank one. Following this
+you can do whatever you like to edit your language file. But note that not all
+features are made available through this script.</p>
+
+<p>Checking GeSHi installation ... <?php
+// Rudimentary checking of where GeSHi is. In a default install it will be in ../, but
+// it could be in the current directory if the include_path is set. There's nowhere else
+// we can reasonably guess.
+if (is_readable('../geshi.php')) {
+ $path = '../';
+} elseif (is_readable('geshi.php')) {
+ $path = './';
+} else {
+ report_error(TYPE_ERROR, 'Could not find geshi.php - make sure it is in your include path!');
+}
+
+if(!$error_abort) {
+ require $path . 'geshi.php';
+
+ if(!class_exists('GeSHi')) {
+ report_error(TYPE_ERROR, 'The GeSHi class was not found, although it seemed we loaded the correct file!');
+ }
+}
+
+if(!$error_abort) {
+ if(!defined('GESHI_LANG_ROOT')) {
+ report_error(TYPE_ERROR, 'There\'s no information present on where to find the language files!');
+ } elseif(!is_dir(GESHI_LANG_ROOT)) {
+ report_error(TYPE_ERROR, 'The path "'.GESHI_LANG_ROOT.'" given, does not ressemble a directory!');
+ } elseif(!is_readable(GESHI_LANG_ROOT)) {
+ report_error(TYPE_ERROR, 'The path "'.GESHI_LANG_ROOT.'" is not readable to this script!');
+ }
+}
+
+if(!$error_abort) {
+ if (!($dir = @opendir(GESHI_LANG_ROOT))) {
+ report_error(TYPE_ERROR, 'Error requesting listing for available language files!');
+ }
+
+ $languages = array();
+
+ if(!$error_abort) {
+ while ($file = readdir($dir)) {
+ if (!$file || $file[0] == '.' || strpos($file, '.') === false) {
+ continue;
+ }
+ $lang = substr($file, 0, strpos($file, '.'));
+ $languages[] = $lang;
+ }
+ closedir($dir);
+ }
+
+ $languages = array_unique($languages);
+ sort($languages);
+
+ if(!count($languages)) {
+ report_error(TYPE_WARNING, 'Unable to locate any usable language files in "'.GESHI_LANG_ROOT.'"!');
+ }
+}
+
+output_error_cache();
+
+// --- empty variables for values of $_POST - begin ---
+$post_var_names = array('li', 'ai', 'ld');
+
+$li = array(
+ 'file' => 'example',
+ 'name' => 'Example'
+ );
+
+$ai = array(
+ 'name' => 'Benny Baumann',
+ 'email' => 'BenBE@geshi.org',
+ 'web' => 'http://qbnz.com/highlighter/'
+ );
+
+$ld = array(
+ 'cmt' => array(
+ 'sl' => array(
+ 1 => array(
+ 'start' => '//',
+ 'style' => 'font-style: italic; color: #666666;'
+ ),
+ 2 => array(
+ 'start' => '#',
+ 'style' => 'font-style: italic; color: #666666;'
+ )
+ ),
+ 'ml' => array(
+ 1 => array(
+ 'start' => '/*',
+ 'end' => '*/',
+ 'style' => 'font-style: italic; color: #666666;'
+ ),
+ 2 => array(
+ 'start' => '/**',
+ 'end' => '*/',
+ 'style' => 'font-style: italic; color: #006600;'
+ )
+ ),
+ 'rxc' => array(
+ 1 => array(
+ 'rx' => '/Hello RegExp/',
+ 'style' => 'font-style: italic; color: #666666;'
+ )
+ )
+ ),
+ 'str' => array(
+ 'qm' => array(
+ 1 => array(
+ 'delim' => "'",
+ 'style' => 'color: #0000FF;'
+ ),
+ 2 => array(
+ 'delim' => "&quot;",
+ 'style' => 'color: #0000FF;'
+ )
+ ),
+ 'ec' => array(
+ 'char' => '\\',
+ 'style' => 'font-weight: bold; color: #000080;'
+ ),
+ 'erx' => array(
+ 1 => array(
+ 'rx' => '/\{\\\\$\w+\}/',
+ 'style' => 'font-weight: bold; color: #008080;'
+ ),
+ 2 => array(
+ 'rx'=> '/\{\\\\$\w+\}/',
+ 'style' => 'font-weight: bold; color: #008080;'
+ )
+ )
+ ),
+ 'kw_case' => 'GESHI_CAPS_NO_CHANGE',
+ 'kw' => array(
+ 1 => array(
+ 'list' => '',
+ 'case' => '0',
+ 'style' => 'color: #0000FF; font-weight: bold;',
+ 'docs' => ''
+ )
+ ),
+ 'sy' => array(
+ 0 => array(
+ 'list' => '',
+ 'style' => 'color: #0000FF; font-weight: bold;'
+ )
+ )
+ );
+
+$kw_case_sel = array(
+ 'GESHI_CAPS_NO_CHANGE' => '',
+ 'GESHI_CAPS_UPPER' => '',
+ 'GESHI_CAPS_LOWER' => ''
+ );
+
+$kw_cases_sel = array(
+ 1 => array(
+ 0 => '',
+ 1 => ''
+ )
+ );
+// --- empty variables for values of $_POST - end ---
+
+echo "<pre>";
+//var_dump($languages);
+
+foreach($post_var_names as $varName) { // export wanted variables of $_POST array...
+ if(array_key_exists($varName, $_POST)) {
+ $$varName = htmlspecialchars_deep($_POST[$varName]);
+ }
+}
+
+// determine the selected kw_case...
+$kw_case_sel[$ld['kw_case']] = ' selected="selected"';
+
+// determine the selected kw_cases...
+for($i = 1; $i <= count($kw_cases_sel); $i += 1) {
+ $kw_cases_sel[$i][(int) $ld['kw'][$i]['case']] = ' selected="selected"';
+}
+
+$lang = validate_lang();
+var_dump($lang);
+echo "</pre>";
+
+?>
+
+<form action="?action=test" method="post">
+ <fieldset>
+ <legend>Generic Information</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="li[file]">Language File ID:</label>
+ </td>
+ <td>
+ <input type="text" name="li[file]" id="li[file]" value="<?=$li['file']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="li[name]">Language Name:</label>
+ </td>
+ <td>
+ <input type="text" name="li[name]" id="li[name]" value="<?=$li['name']; ?>" />
+ </td>
+ </tr>
+
+ </table>
+ </fieldset>
+
+ <fieldset>
+ <legend>Author</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ai[name]">Full Name:</label>
+ </td>
+ <td>
+ <input type="text" name="ai[name]" id="ai[name]" value="<?=$ai['name']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ai[email]">eMail address:</label>
+ </td>
+ <td>
+ <input type="text" name="ai[email]" id="ai[email]" value="<?=$ai['email']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ai[web]">Homepage:</label>
+ </td>
+ <td>
+ <input type="text" name="ai[web]" id="ai[web]" value="<?=$ai['web']; ?>" />
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+
+ <fieldset>
+ <legend>Comments</legend>
+
+ <fieldset>
+ <legend>Single Line</legend>
+
+ <fieldset>
+ <legend>Comment Group 1</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ld[cmt][sl][1][start]">Comment Start:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[cmt][sl][1][start]" id="ld[cmt][sl][1][start]" value="<?=$ld['cmt']['sl'][1]['start']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[cmt][sl][1][style]">Comment Style:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[cmt][sl][1][style]" id="ld[cmt][sl][1][style]" value="<?=$ld['cmt']['sl'][1]['style']; ?>" />
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+
+ <fieldset>
+ <legend>Comment Group 2</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ld[cmt][sl][2][start]">Comment Start:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[cmt][sl][2][start]" id="ld[cmt][sl][2][start]" value="<?=$ld['cmt']['sl'][2]['start']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[cmt][sl][2][style]">Comment Style:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[cmt][sl][2][style]" id="ld[cmt][sl][2][style]" value="<?=$ld['cmt']['sl'][2]['style']; ?>" />
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+ </fieldset>
+
+ <fieldset>
+ <legend>Multiple Lines</legend>
+
+ <fieldset>
+ <legend>Comment Group 1</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ld[cmt][ml][1][start]">Comment Start:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[cmt][ml][1][start]" id="ld[cmt][ml][1][start]" value="<?=$ld['cmt']['ml'][1]['start']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[cmt][ml][1][end]">Comment End:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[cmt][ml][1][end]" id="ld[cmt][ml][1][end]" value="<?=$ld['cmt']['ml'][1]['end']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[cmt][ml][1][style]">Comment Style:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[cmt][ml][1][style]" id="ld[cmt][ml][1][style]" value="<?=$ld['cmt']['ml'][1]['style']; ?>" />
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+
+ <fieldset>
+ <legend>Comment Group 2</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ld[cmt][ml][2][start]">Comment Start:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[cmt][ml][2][start]" id="ld[cmt][ml][2][start]" value="<?=$ld['cmt']['ml'][2]['start']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[cmt][ml][2][end]">Comment End:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[cmt][ml][2][end]" id="ld[cmt][ml][2][end]" value="<?=$ld['cmt']['ml'][2]['end']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[cmt][ml][2][style]">Comment Style:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[cmt][ml][2][style]" id="ld[cmt][ml][2][style]" value="<?=$ld['cmt']['ml'][2]['style']; ?>" />
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+ </fieldset>
+
+ <fieldset>
+ <legend>Regular Expressions</legend>
+
+ <fieldset>
+ <legend>Comment Group 1</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ld[cmt][rxc][1][rx]">Comment RX:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[cmt][rxc][1][rx]" id="ld[cmt][rxc][1][rx]" value="<?=$ld['cmt']['rxc'][1]['rx']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[cmt][rxc][1][style]">Comment Style:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[cmt][rxc][1][style]" id="ld[cmt][rxc][1][style]" value="<?=$ld['cmt']['rxc'][1]['style']; ?>" />
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+ </fieldset>
+ </fieldset>
+
+ <fieldset>
+ <legend>Strings</legend>
+
+ <fieldset>
+ <legend>String \ Quotes (delimiters, parsed)</legend>
+
+ <fieldset>
+ <legend>Quotemark Group 1</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ld[str][qm][1][delim]">String Delimiter:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[str][qm][1][delim]" id="ld[str][qm][1][delim]" value="<?=$ld['str']['qm'][1]['delim']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[str][qm][1][style]">String Style:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[str][qm][1][style]" id="ld[str][qm][1][style]" value="<?=$ld['str']['qm'][1]['style']; ?>" />
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+ <fieldset>
+ <legend>Quotemark Group 2</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ld[str][qm][1][delim]">String Delimiter:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[str][qm][2][delim]" id="ld[str][qm][2][delim]" value="<?=$ld['str']['qm'][2]['delim']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[str][qm][1][style]">String Style:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[str][qm][2][style]" id="ld[str][qm][2][style]" value="<?=$ld['str']['qm'][2]['style']; ?>" />
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+
+
+ </fieldset>
+
+ <fieldset>
+ <legend>Escape Sequences</legend>
+
+ <fieldset>
+ <legend>Generic Escape Char</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ld[str][ec][char]">Escape Char:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[str][ec][char]" id="ld[str][ec][char]" value="<?=$ld['str']['ec']['char']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[str][ec][style]">Escape Char Style:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[str][ec][style]" id="ld[str][ec][style]" value="<?=$ld['str']['ec']['style']; ?>" />
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+
+ <fieldset>
+ <legend>Escape Regexp Group 1</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ld[str][erx][1][rx]">Escape Regexp:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[str][erx][1][rx]" id="ld[str][erx][1][rx]" value="<?=$ld['str']['erx'][1]['rx']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[str][erx][1][style]">Escape Style:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[str][erx][1][style]" id="ld[str][erx][1][style]" value="<?=$ld['str']['erx'][1]['style']; ?>" />
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+
+ <fieldset>
+ <legend>Escape Regexp Group 2</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ld[str][erx][2][rx]">Escape Regexp:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[str][erx][2][rx]" id="ld[str][erx][2][rx]" value="<?=$ld['str']['erx'][2]['rx']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[str][erx][2][style]">Escape Style:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[str][erx][2][style]" id="ld[str][erx][2][style]" value="<?=$ld['str']['erx'][2]['style']; ?>" />
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+ </fieldset>
+ </fieldset>
+
+ <fieldset>
+ <legend>Keywords</legend>
+
+ <fieldset>
+ <legend>Case of Keywords</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ld[kw_case]">Handling of keywords case:</label>
+ </td>
+ <td>
+ <select name=ld[kw_case]" id="ld[kw_case]">
+ <option value="GESHI_CAPS_NO_CHANGE"<?=$kw_case_sel['GESHI_CAPS_NO_CHANGE']; ?>>Don’t change the case of any keyword</option>
+ <option value="GESHI_CAPS_UPPER"<?=$kw_case_sel['GESHI_CAPS_UPPER']; ?>>Convert the case of all keywords to upper case</option>
+ <option value="GESHI_CAPS_LOWER"<?=$kw_case_sel['GESHI_CAPS_LOWER']; ?>>Convert the case of all keywords to lower case</option>
+ </select>
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+
+ <fieldset>
+ <legend>Keyword Group 1</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ld[kw][1][list]">Keyword List:</label>
+ </td>
+ <td>
+ <textarea name="ld[kw][1][list]" id="ld[kw][1][list]" rows="10" cols="80"><?=$ld['kw'][1]['list']; ?></textarea>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[kw][1][case]">Case Sensitive:</label>
+ </td>
+ <td>
+ <select name="ld[kw][1][case]" id="ld[kw][1][case]">
+ <option value="0"<?=$kw_cases_sel[1][0]; ?>>No</option>
+ <option value="1"<?=$kw_cases_sel[1][1]; ?>>Yes</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[kw][1][style]">Keyword Style:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[kw][1][style]" id="ld[kw][1][style]" value="<?=$ld['kw'][1]['style']; ?>" />
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[kw][1][docs]">Documentation URL:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[kw][1][docs]" id="ld[kw][1][docs]" value="<?=$ld['kw'][1]['docs']; ?>" />
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+
+ </fieldset>
+
+
+ <fieldset>
+ <legend>Symbols</legend>
+
+ <fieldset>
+ <legend>Symbols Group 1</legend>
+
+ <table width="100%">
+ <tr>
+ <td>
+ <label for="ld[sy][0][list]">Symbols List:</label>
+ </td>
+ <td>
+ <textarea name="ld[sy][0][list]" id="ld[sy][0][list]" rows="10" cols="80"><?=$ld['sy'][0]['list']; ?></textarea>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="ld[sy][0][style]">Symbols Style:</label>
+ </td>
+ <td>
+ <input type="text" name="ld[sy][0][style]" id="ld[sy][0][style]" value="<?=$ld['sy'][0]['style']; ?>" />
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+
+ </fieldset>
+
+
+ <div id="langfile">
+ <fieldset>
+ <legend>Language File Source</legend>
+<?
+$G = new GeSHi('', 'php');
+$langfile_source = gen_langfile($lang);
+$G->set_source($langfile_source);
+echo $G->parse_code();
+unset($G);
+?>
+ </fieldset>
+ </div>
+
+ <input type="submit" name="btn" value="Send!" />
+</form>
+
+<p>Operation completed in <?
+$time_end = explode(' ', microtime());
+$time_diff = $time_end[0] + $time_end[1] - $time_start[0] - $time_start[1];
+
+echo sprintf("%.2f", $time_diff);
+?> seconds.</p>
+
+<div id="footer">GeSHi &copy; 2004-2007 Nigel McNie, 2007-2009 Benny Baumann, released under the GNU GPL</div>
+</body>
+</html>
+<?
+
+function str_to_phpstring($str, $doublequote = false){
+ if($doublequote) {
+ return '"' . strtr($str,
+ array(
+ "\"" => "\\\"",
+ "\\" => "\\\\",
+ "\0" => "\\0",
+ "\n" => "\\n",
+ "\r" => "\\r",
+ "\t" => "\\t",
+ "\$" => "\\\$"
+ )
+ ) . '"';
+ } else {
+ return "'" . strtr($str,
+ array(
+ "'" => "\\'",
+ "\\" => "\\\\"
+ )
+ ) . "'";
+ }
+}
+
+function validate_lang(){
+ $ai = array(
+ 'name' => 'Benny Baumann',
+ 'email' => 'BenBE@geshi.org',
+ 'web' => 'http://qbnz.com/highlighter/'
+ );
+
+ $li = array(
+ 'file' => 'example',
+ 'desc' => 'Example'
+ );
+
+ if(isset($_POST['ld'])) {
+ $ld = $_POST['ld'];
+ } else {
+ $ld = array(
+ 'cmt' => array(
+ 'sl' => array(
+ 1 => array(
+ 'start' => '//',
+ 'style' => 'test'
+ )
+ ),
+ 'ml' => array(
+ 1 => array(
+ 'start' => '/*',
+ 'end' => '*/',
+ 'style' => 'font-style: italic; color: #666666;'
+ )
+ ),
+ 'rxc' => array(
+ 1 => array(
+ 'rx' => '/Hello/',
+ 'style' => 'color: #00000'
+ )
+ )
+ ),
+ 'str' => array(
+ 'qm' => array(),
+ 'ec' => array(
+ 'char' => ''
+ ),
+ 'erx' => array()
+ ),
+ 'kw' => array(),
+ 'kw_case' => 'GESHI_CAPS_NO_CHANGE',
+ 'sy' => array()
+ );
+ }
+
+ return array('ai' => $ai, 'li' => $li, 'ld' => $ld);
+}
+
+function gen_langfile($lang){
+ $langfile = $lang['li']['file'];
+ $langdesc = $lang['li']['desc'];
+
+ $langauthor_name = $lang['ai']['name'];
+ $langauthor_email = $lang['ai']['email'];
+ $langauthor_web = $lang['ai']['web'];
+
+ $langversion = GESHI_VERSION;
+
+ $langdate = date('Y/m/d');
+ $langyear = date('Y');
+
+ $i = ' ';
+ $i = array('', $i, $i.$i, $i.$i.$i);
+
+ $src = <<<GESHI_LANGFILE_HEAD
+<?php
+/*************************************************************************************
+ * {$langfile}.php
+ * --------
+ * Author: {$langauthor_name} ({$langauthor_email})
+ * Copyright: (c) {$langyear} {$langauthor_name} ({$langauthor_web})
+ * Release Version: {$langversion}
+ * Date Started: {$langdate}
+ *
+ * {$langdesc} language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * {$langdate} ({$langversion})
+ * - First Release
+ *
+ * TODO (updated {$langdate})
+ * -------------------------
+ * * Complete language file
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+\$language_data = array(
+
+GESHI_LANGFILE_HEAD;
+
+ //Language Name
+ $src .= $i[1] . "'LANG_NAME' => ".str_to_phpstring($langdesc).",\n";
+
+ //Comments
+ $src .= $i[1] . "'COMMENT_SINGLE' => array(\n";
+ foreach($lang['ld']['cmt']['sl'] as $idx_cmt_sl => $tmp_cmt_sl) {
+ $src .= $i[2] . ((int)$idx_cmt_sl). " => ". str_to_phpstring($tmp_cmt_sl['start']) . ",\n";
+ }
+ $src .= $i[2] . "),\n";
+ $src .= $i[1] . "'COMMENT_MULTI' => array(\n";
+ foreach($lang['ld']['cmt']['ml'] as $tmp_cmt_ml) {
+ $src .= $i[2] . str_to_phpstring($tmp_cmt_ml['start']). " => ". str_to_phpstring($tmp_cmt_ml['end']) . ",\n";
+ }
+ $src .= $i[2] . "),\n";
+ $src .= $i[1] . "'COMMENT_REGEXP' => array(\n";
+ foreach($lang['ld']['cmt']['rxc'] as $idx_cmt_rxc => $tmp_cmt_rxc) {
+ $src .= $i[2] . ((int)$idx_cmt_rxc). " => ". str_to_phpstring($tmp_cmt_rxc['rx']) . ",\n";
+ }
+ $src .= $i[2] . "),\n";
+
+ //Case Keywords
+ $src .= $i[1] . "'CASE_KEYWORDS' => " . $lang['ld']['kw_case'] . ",\n";
+
+ //Quotes \ Strings
+ $src .= $i[1] . "'QUOTEMARKS' => array(\n";
+ foreach($lang['ld']['str']['qm'] as $idx_str_qm => $tmp_str_qm) {
+ $src .= $i[2] . ((int)$idx_str_qm). " => ". str_to_phpstring($tmp_str_qm['delim']) . ",\n";
+ }
+ $src .= $i[2] . "),\n";
+ $src .= $i[1] . "'ESCAPE_CHAR' => " . str_to_phpstring($lang['ld']['str']['ec']['char']) . ",\n";
+ $src .= $i[1] . "'ESCAPE_REGEXP' => array(\n";
+ foreach($lang['ld']['str']['erx'] as $idx_str_erx => $tmp_str_erx) {
+ $src .= $i[2] . ((int)$idx_str_erx). " => ". str_to_phpstring($tmp_str_erx['rx']) . ",\n";
+ }
+ $src .= $i[2] . "),\n";
+
+ //HardQuotes
+ $src .= $i[1] . "'HARDQUOTE' => array(\n";
+ $src .= $i[2] . "),\n";
+ $src .= $i[1] . "'HARDESCAPE' => array(\n";
+ $src .= $i[2] . "),\n";
+ $src .= $i[1] . "'HARDCHAR' => '',\n";
+
+ //Numbers
+ $src .= $i[1] . "'NUMBERS' =>\n";
+ $src .= $i[2] . "GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX |\n";
+ $src .= $i[2] . "GESHI_NUMBER_FLT_SCI_ZERO,\n";
+
+ //Keywords
+ $src .= $i[1] . "'KEYWRODS' => array(\n";
+ foreach($lang['ld']['kw'] as $idx_kw => $tmp_kw) {
+ $src .= $i[2] . ((int)$idx_kw) . " => array(\n";
+ if(!is_array($tmp_kw['list'])) {
+ $tmp_kw['list'] = explode("\n", $tmp_kw['list']);
+ }
+ $tmp_kw['list'] = array_map('trim', $tmp_kw['list']);
+ sort($tmp_kw['list']);
+ $kw_esc = array_map('str_to_phpstring', $tmp_kw['list']);
+ $kw_nl = true;
+ $kw_pos = 0;
+ foreach($kw_esc as $kw_data) {
+ if((strlen($kw_data) + $kw_pos > 79) && $kw_pos > strlen($i[3])) {
+ $src .= "\n";
+ $kw_nl = true;
+ $kw_pos = 0;
+ }
+ if($kw_nl) {
+ $src .= $i[3];
+ $kw_pos += strlen($i[3]);
+ $kw_nl = false;
+ }
+ $src .= $kw_data . ', ';
+ $kw_pos += strlen($kw_data) + 2;
+ }
+ $src .= "\n";
+ $src .= $i[3] . "),\n";
+ }
+ $src .= $i[2] . "),\n";
+
+ //Case Sensitivity
+ $src .= $i[1] . "'CASE_SENSITIVE' => array(\n";
+ foreach($lang['ld']['kw'] as $idx_kw => $tmp_kw) {
+ $src .= $i[2] . ((int)$idx_kw) . " => " . ($tmp_kw['case'] ? 'true' : 'false') . ",\n";
+ }
+ $src .= $i[2] . "),\n";
+
+ //Symbols
+ $src .= $i[1] . "'SYMBOLS' => array(\n";
+ foreach($lang['ld']['sy'] as $idx_kw => $tmp_kw) {
+ $src .= $i[2] . ((int)$idx_kw) . " => array(\n";
+ $tmp_kw['list'] = (array)$tmp_kw['list'];
+ sort($tmp_kw['list']);
+ $kw_esc = array_map('str_to_phpstring', $tmp_kw['list']);
+ $kw_nl = true;
+ $kw_pos = strlen($i[3]);
+ foreach($kw_esc as $kw_data) {
+ if((strlen($kw_data) + $kw_pos > 79) && $kw_pos > strlen($i[3])) {
+ $src .= "\n";
+ $kw_nl = true;
+ $kw_pos = 0;
+ }
+ if($kw_nl) {
+ $src .= $i[3];
+ $kw_pos += strlen($i[3]);
+ $kw_nl = false;
+ }
+ $src .= $kw_data . ', ';
+ $kw_pos += strlen($kw_data) + 2;
+ }
+ $src .= "\n";
+ $src .= $i[3] . "),\n";
+ }
+ $src .= $i[2] . "),\n";
+
+ //Styles \ CSS
+ $src .= $i[1] . "'STYLES' => array(\n";
+ $src .= $i[2] . "'KEYWRODS' => array(\n";
+ foreach($lang['ld']['kw'] as $idx_kw => $tmp_kw) {
+ $src .= $i[3] . ((int)$idx_kw) . " => " . str_to_phpstring($tmp_kw['style']) . ",\n";
+ }
+ $src .= $i[3] . "),\n";
+ $src .= $i[2] . "'COMMENTS' => array(\n";
+ foreach($lang['ld']['cmt']['sl'] as $idx_cmt_sl => $tmp_cmt_sl) {
+ $src .= $i[3] . ((int)$idx_cmt_sl) . " => " . str_to_phpstring($tmp_cmt_sl['style']) . ",\n";
+ }
+ foreach($lang['ld']['cmt']['rxc'] as $idx_cmt_rxc => $tmp_cmt_rxc) {
+ $src .= $i[3] . ((int)$idx_cmt_rxc) . " => " . str_to_phpstring($tmp_cmt_rxc['style']) . ",\n";
+ }
+ $src .= $i[3] . "'MULTI' => " . str_to_phpstring($lang['ld']['cmt']['ml'][1]['style']) . "\n";
+ $src .= $i[3] . "),\n";
+ $src .= $i[2] . "'ESCAPE_CHAR' => array(\n";
+ foreach($lang['ld']['str']['erx'] as $idx_str_erx => $tmp_str_erx) {
+ $src .= $i[3] . ((int)$idx_str_erx). " => ". str_to_phpstring($tmp_str_erx['style']) . ",\n";
+ }
+ // 'HARD' => 'color: #000099; font-weight: bold;'
+ $src .= $i[3] . "),\n";
+ $src .= $i[2] . "'BRACKETS' => array(\n";
+ $src .= $i[3] . "),\n";
+ $src .= $i[2] . "'STRINGS' => array(\n";
+ foreach($lang['ld']['str']['qm'] as $idx_str_qm => $tmp_str_qm) {
+ $src .= $i[3] . ((int)$idx_str_qm). " => ". str_to_phpstring($tmp_str_qm['style']) . ",\n";
+ }
+ // 'HARD' => 'color: #0000ff;'
+ $src .= $i[3] . "),\n";
+ $src .= $i[2] . "'NUMBERS' => array(\n";
+ $src .= $i[3] . "),\n";
+ $src .= $i[2] . "'METHODS' => array(\n";
+ $src .= $i[3] . "),\n";
+ $src .= $i[2] . "'SYMBOLS' => array(\n";
+ foreach($lang['ld']['sy'] as $idx_kw => $tmp_kw) {
+ $src .= $i[3] . ((int)$idx_kw) . " => " . str_to_phpstring($tmp_kw['style']) . ",\n";
+ }
+ $src .= $i[3] . "),\n";
+ $src .= $i[2] . "'REGEXPS' => array(\n";
+ $src .= $i[3] . "),\n";
+ $src .= $i[2] . "'SCRIPT' => array(\n";
+ $src .= $i[3] . "),\n";
+ $src .= $i[2] . "),\n";
+
+ //Keyword Documentation
+ $src .= $i[1] . "'URLS' => array(\n";
+ foreach($lang['ld']['kw'] as $idx_kw => $tmp_kw) {
+ $src .= $i[2] . ((int)$idx_kw) . " => " . str_to_phpstring($tmp_kw['docs']) . ",\n";
+ }
+ $src .= $i[2] . "),\n";
+ $src .= $i[1] . "'OOLANG' => false,\n";
+ $src .= $i[1] . "'OBJECT_SPLITTERS' => array(\n";
+ $src .= $i[2] . "),\n";
+ $src .= $i[1] . "'REGEXPS' => array(\n";
+ $src .= $i[2] . "),\n";
+ $src .= $i[1] . "'STRICT_MODE_APPLIES' => GESHI_MAYBE,\n";
+ $src .= $i[1] . "'SCRIPT_DELIMITERS' => array(\n";
+ $src .= $i[2] . "),\n";
+ $src .= $i[1] . "'HIGHLIGHT_STRICT_BLOCK' => array(\n";
+ $src .= $i[2] . "),\n";
+ $src .= $i[1] . "'TAB_WIDTH' => 4,\n";
+
+ $src .= <<<GESHI_LANGFILE_FOOTER
+);
+
+?>
+GESHI_LANGFILE_FOOTER;
+
+ //Reduce source ...
+ $src = preg_replace('/array\(\s*\)/s', 'array()', $src);
+ $src = preg_replace('/\,(\s*\))/s', '\1', $src);
+ $src = preg_replace('/\s+$/m', '', $src);
+
+ return $src;
+}
+
+// vim: shiftwidth=4 softtabstop=4
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/BUGS b/extensions/SyntaxHighlight_GeSHi/geshi/docs/BUGS
new file mode 100644
index 00000000..8a5cf046
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/BUGS
@@ -0,0 +1,29 @@
+
+ BUGS - list of known bugs in GeSHi
+ Version 1.0.8
+
+- Number highlighting is quite poor [possibly better now]
+- I'm not happy with URLS - there still could be extra bugs, and it's rather unflexible
+ (see TODO for a possible fix)
+- "Important" sections for some reason seem to have their spans added after every
+ newline up until the next lexic, instead of stopping at the <END GeSHi> part. In fact,
+ context sensitiveness is quite poor...
+- Using the extra line number highlighting feature without actually using line numbers
+ will result in malformed XHTML (not sure about this one though...)
+- Slow!!! Especially for source with lots of strings in it. GeSHi will work acceptably
+ for sourcecode under 5K (for simple language files like SQL, a 100K file can be
+ highlighted in just 6 seconds), but above about 25K things get a little slow... If
+ you're using this as part of some larger software, you may want to think about
+ making some sort of "cache" effect to speed things up and reduce server load.
+- The result is built by string replacement instead of by building another string based
+ on the source, that would be much safer. The focus of releases beyond 1.0.7 will be on
+ changing this behaviour, which may well fix some of the other bugs mentioned above.
+- As of 1.0.7.1, dots (.) are allowed before keywords. This may change highlighting of some
+ things slightly, if you notice anything odd about the highlighting then please report
+ it to me.
+- Perl/Javascript /.../ regex syntax is only supported basically and there's no
+ guarantee it is working all the time.
+- The <pre> header output is not XHTML compliant. Please use the <div> header instead.
+
+Send any bug reports to BenBE@omorphia.de, or submit them via the bug tracker at
+sourceforge (http://sourceforge.net/tracker/?group_id=114997&atid=670231)
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/CHANGES b/extensions/SyntaxHighlight_GeSHi/geshi/docs/CHANGES
new file mode 100644
index 00000000..ee510fe0
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/CHANGES
@@ -0,0 +1,923 @@
+
+ CHANGES - Changelog for GeSHi (geshi.php only)
+
+Changes to the code are listed under the version they occured in, with who suggested
+it by each one (if there's nobody listed as suggesting it I dreamed it up :)). Users
+who suggested an idea often also provided the code that was used as a basis for the
+changes - thanks to all who suggested these ideas and gave me the code to show me how!
+
+Language files listed under each version were made by the author beside them, and then
+modified by me for consistency/bug fixing.
+
+Please send any bug reports to BenBE@omorphia.de, or use the bug report tracker
+at sourceforge (http://sourceforge.net/tracker/?group_id=114997&atid=670231)
+
+Version 1.0.8.11
+ - Added language files
+ * ARM (Marat Dukhan)
+ * Asymptote (Manuel Yguel)
+ * DCL (Petr Hendl)
+ * DCPU-16 (Benny Baumann)
+ * FreeSWITCH (James Rose)
+ * Haxe (Andy Li, John Liao)
+ * LDIF (Bruno Harbulot)
+ * Nagios (Albéric de Pertat)
+ * Octave (Carnë Draug, Juan Pablo Carbajal)
+ * ParaSail (sttaft)
+ * PARI/GP (Charles R Greathouse IV)
+ * Python for S60 (Sohan Basak)
+ * Rexx (Jon Wolfers)
+ * SPARK (Phil Thornley)
+ * SPARQL (Karima Rafes)
+ * StoneScript (Archimmersion)
+ * UPC (Viraj Sinha)
+ * Urbi (Alexandre Morgand)
+ * Vedit (Pauli Lindgren)
+ - Updated aliasd.php contrib script (SF#3073275, count)
+ - Fallback to "text" when extension is unknown (SF#3514714, murkymark, BenBE)
+ - detect extensions case-insensitive (SF#3514714, murkymark, BenBE)
+ - Fixed two bugs within contrib scripts included with each release (BenBE)
+ - Improvements to language files (BenBE)
+ * Symbol and char literal handling for Scala (Paul Butcher, BenBE)
+ * Multiline comments of F# weren't actually multiline (BenBE)
+ * Support for IPv6 addresses in RFC822 messages (BenBE)
+ * Properly handle retrieving names from language files (MikeSee, BenBE)
+ * Changes for improved highlighting of signle line comments and end-of-code indicators
+ * Missing keywords and improved highlighting of comments
+ * Problem with DOS/Batch highlighting breaking out at variables (BenBE)
+ * Addition of MMX/SSE/x86-64 registers and MMX/SSE instructions for
+ ASM language file(up to 4.2) (Dennis Yurichev)
+ * Further improvements to ASM language file to introduce all latest
+ already documented x86 architecture instructions (Marat Dukhan)
+ * Fixed links for R/S+ language file (Fernando H.F.P. da Rosa)
+ * Fix a problem with Delphi/Pascal regarding hex numbers/chars (BenBE)
+ * Fixed a typo and missing keywords for HTML4 and HTML5 (SF#3365452, BenBE)
+ * Fixed a typo in Modula-3 language file (SF#3358216, BenBE)
+ * Added missing keywords for MySQL (SF#3290998, ct-bob, BenBE)
+ * Added missing keywords for Pascal (SF#3176749, BenBE)
+ * Properly detect the keyword that is to be linked (BenBE)
+ * Updated VHDL language file (Kevin Thibedeau)
+ * Added missing keyword for Verilog (SF#3557903, BenBE)
+ * Fixed typo in Haskell causing a keyword to be missing (SF#3529439, BenBE)
+ * Fixed Long String handling for Lua (SF#3541510, Tim Starling)
+ * Updated JavaDoc links for Java language files (SF#3538552, jeneag, BenBE)
+ * CSS keywords incorrectly highlighted as part of identifiers (SF#3554101, BenBE)
+ * CSS3 keywords missing from highlighting (SF#3525084, vlaKoff, BenBE)
+ * Make variable handling compatible to PHP (SF#3489142, BenBE)
+ * Fixed obsolete MySQL documentation links (SF#3441642, BenBE)
+ * Add mising keywords for T-SQL (SF#3435026, BenBE)
+ * Fix discarded text when highlighting TypoScript (SF#3160238, BenBE)
+Version 1.0.8.10
+ - Added language files
+ * BASCOM AVR (Michal Goralczyk)
+ * C: Loadrunner dialect (Stuart Moncrieff)
+ * CoffeeScript (Trevor Burnham)
+ * EPC (Thorsten Muehlfelder)
+ * Euphoria (Nicholas Koceja)
+ * Falcon (billykater)
+ * HTML5 (Robert Lidberg)
+ * LLVM (Azriel Fasten)
+ * PL/I (Robert Prins)
+ * ProFTPd (Benny Baumann)
+ * PyCon (Benny Baumann)
+ * UnrealScript (pospi)
+ * YAML (Josh Ventura)
+ - Small bugfix in LangCheck when looking for language files
+ - Added '-' to list of RX chars that require explicit escaping (SF#3056454, BenBE)
+ - Minor changes to boundary checks (SF#3077256, BenBE)
+ - Improvements to language files (BenBE)
+ * Major rework of the ALGOL68 language file (Neville Dempsey)
+ * LangCheck warnings from GO language file (BenBE)
+ * Some additions to the Objeck language file (Randy Hollines)
+ * Properly highlight infinity as numbers for J (Ric Sherlock)
+ * Improved GDB Backtrace language file (Milian Wolff)
+ * Updated Liberty BASIC language file (Chris Iverson)
+ * Fixed a small issue with detection of division vs. regular expressions
+ for ActionScript 3 and JavaScript (Kevin Day)
+ * Fixed Escape handling for CSS (SF#3080513, yecril71pl, BenBE)
+ * Additional comment styles for SAS (SF#3024708, ahnolds, BenBE)
+ * Updated keyword list for TeraTerm (Boris Maisuradze)
+ * Incorrect handling of /**/ comments in Javascript (BenBE)
+ * Support for mod_upload_progress in Apache Config files (BenBE)
+ * Prefix operator handling in F# was broken (BenBE)
+ * CDATA handling for html4strict (BenBE)
+ * Common subcommands for Apache, APT, CVS, Git, SVN and YUM for Bash (BenBE)
+ * Limited support for prompt detection in single line Bash snippets (BenBE)
+ * Added functions of the C standard library (BenBE)
+ * Rework of Lua to use GeSHi's features better (BenBE)
+ * Language file improvements for Python (Zbyszek Szmek)
+ * Fixed documentation links for Groovy (SF#3152356, lifeisfoo)
+ * Fixed incorrect highlighting of certain keywords in Erlang (SF#3138853, BenBE)
+ * Escape chars in C++/C++Qt handled incorrectly (SF#3122706, C. Pötsch)
+ * Empty parameters of LaTeX commands tipped the highlighting off (SF#3098329, James Oldfield, BenBE)
+ * Additional Keywords and minor tweaks to Logtalk (Paulo Moura)
+Version 1.0.8.9
+ - Added language files
+ * Algol68 (Neville Dempsey)
+ * E (Kevin Reid)
+ * FormulaOne (Juro Bystricky)
+ * Go (Markus Jarderot)
+ * Liberty BASIC (Chris Iverson)
+ * MOS 6502/6510 Assemblers (Warren Willmey)
+ * Motorola 68k assembler (Warren Willmey)
+ * Objeck Programming Language (Randy Hollines)
+ * ZXBasic (Jose Rodriguez)
+ - Added support for $-prefixed hex numbers and @-prefixed octal numbers
+ - Added Parser Control for languages to tell when numbers are present
+ inside of non-string parts
+ - Introduced querying supported/known languages directly
+ - Introduced querying full language names without loading the language file
+ - Improvements to language files (BenBE)
+ * Added loads of keywords for generic SQL highlighting (Jürgen Thomas)
+Version 1.0.8.8
+ - Added language files
+ * ChaiScript (Jason Turner & Jonathan Turner)
+ * Genie (Nicolas Joseph)
+ * GwBasic (José Gabriel Moya Yangüela)
+ * HicEst (Georg Petrich)
+ * Icon (Matt Oates)
+ * MagikSF (Sjoerd van Leent)
+ * Modula 2 (Benjamin Kowarsch)
+ * Oz (Wolfgang Meyer)
+ * PCRE (BenBE)
+ * PostgreSQL (Christophe Chauvet)
+ * q/kdb+ (Ian Roddis)
+ * RPM Specification Files (Paul Grinberg)
+ * Unicon (Matt Oates)
+ * Vala (Nicolas Joseph)
+ * XBasic (José Gabriel Moya Yangüela)
+ - Improvements to language files (BenBE)
+ * Major reworks and improvements to OCaml language file (BenBE)
+ * Removed duplicate entries from keyword groups of VIM language file (Segaja)
+ * Properly protect Regexps against GeSHi Black Magic in Matlab (BenBE)
+ * Added support for Block Comments in PowerShell (BenBE)
+ * Added some keywords for VB; split into multiple groups (leejkennedy, BenBE)
+ * Basic Heredoc Support for Ruby (BenBE)
+Version 1.0.8.7
+ - Added language files
+ * Autoconf (Mihai Vasilian)
+ * ECMAScript (Michel Mariani)
+ * J (Ric Sherlock)
+ * OpenBSD Packet Filter (David Berard)
+ * Oxygene / Delphi Prism (Carlo Kok)
+ - Minor change in INT_BASIC number regexp to support '..' range operator
+ as to be found in most Pascal-like languages (BenBE)
+ - Fixed an issue with Hardquotes for empty strings (like '' in Delphi) (BenBE)
+ - Introduced a fix for improved performance when matching numbers (BenBE)
+ - Improvements to language files (BenBE)
+ * Fixed broken links in Prolog language file (BenBE)
+ * Fixed keywords in generics expressions in Java5 (BenBE)
+ * Added support for import static in Java5 (BenBE)
+ * Added Standard Integer Types for C and c++ (BenBE)
+ * Fixed some regexp issues in Erlang (BenBE)
+ * Added some missing keywords for Clojure (BenBE)
+ * Added some missing keywords for Lisp (BenBE)
+ * Fixed a problem with variable names in Prolog (BenBE)
+ * Some color changes for AutoIt (BenBE)
+ * Added support for basic include directive processing for AutoIt (BenBE)
+ * Added support for ::-style labels as comments (SF#2947393, BenBE)
+ * Removed backslash as Escape Char in T-SQL (SF#2939199, Bruno Braga)
+ * Added Nested Comments Support for Haskell (SF#2922317, BenBE)
+ * Fixed Comments for VIM, added some keywords, proposed porting of
+ Regular Expression markup from Perl (SF#2818047, psycojoker, BenBE)
+ * Fixed warnings for Language Check of Tcl (BenBE)
+Version 1.0.8.6
+ - Added language files
+ * Clojure (Jess Johnson)
+ * Cuesheet (Benny Baumann)
+ * F# (Julien Ortin)
+ * GAMBAS (Jesus Guardon)
+ * Logtalk (Paulo Moura)
+ * MapBasic (Tomasz Berus)
+ * NewLisp (cormullion)
+ * Perl 6 (Kodi Arfer)
+ * Pike (Rick E.)
+ * SystemVerilog (Sean O'Boyle)
+ - Reworked parts of the number support (BenBE)
+ - Improvements to language files (BenBE)
+ * Fixed broken links in R/S+ language file (BenBE)
+ * Fixed an issue with if= argument for dd command (BenBE)
+ * T-SQL should use GESHI_CAPS_NO_CHANGE for keywords (BenBE)
+ * Fixed missed shorthand arg references in Bash (BenBE)
+ * Fixed first line not getting highlighted in diff language (BenBE)
+ * Added some keywords for csharp (RC)
+Version 1.0.8.5
+ - Added language files
+ * AutoHotkey (Naveen Garg)
+ * Awk (George Pollard)
+ * GADV 4CS (Jason Curl)
+ * jQuery (Rob Loach)
+ * PowerBuilder (Doug Porter)
+ * PureBasic (Gustavo Julio Fiorenza)
+ * R / S+ (Ron Fredericks, Benilton Carvalho)
+ - Fixed legitimate numbers sometimes missing from highlighting (BenBE)
+ - Fixed a problem with URLs allowing to break highlighting (BenBE)
+ - Allowed for String and Number Styles to be set by the API (BenBE)
+ - Produce valid CSS when languages start with underscore (BenBE)
+ - Duplicate newlines with PRE_TABLE-Header but w/o linenumbers (SF#2838958, BenBE)
+ - Improvements to language files (BenBE)
+ * Fixed case-insensitively duplicate keywords (BenBE)
+ * DCS language file contained HARDQUOTE section but no hardquotes (BenBE)
+ * Some additional headers for Email\mbox highlighting (BenBE)
+ * Added some more Keywords for robots.txt highlighting (BenBE)
+ * Added Git commands for bash, ifup/ifdown (BenBE)
+ * Added support for C# and VB.net delegates (SF#2832253, BenBE)
+ * Added support for line numbers, file handles and hex\octal numbers for QBasic (BenBE)
+Version 1.0.8.4
+ - Added language files
+ * BibTeX (Quinn Taylor)
+ * CMake (Daniel Nelson)
+ * Erlang (Benny Baumann, Dan Forest-Barbier, Uwe Dauernheim)
+ * FO (abas-ERP) (Tan-Vinh Nguyen)
+ * Property Files (Edy Hinzen)
+ * Whois (RPSL format) entries (Benny Baumann)
+ - Changed INT_BASIC number format to allow numbers followed . at EOL (BenBE)
+ - Higher prority for keywords over regexps (BenBE)
+ - Added missing set_script_style API function (BenBE)
+ - Fixed missing check for comment_regexp preference in HardQuotes (BenBE)
+ - Fixed a problem with Strict Block Detection if the Strict Block Regexp
+ requires matching groups for itself (BenBE)
+ - Improvements to language files (BenBE)
+ * Added PCRE regexp support for Action script (SF#2655644, BenBE)
+ * Removed some superfluous keywords from ABAP (BenBE)
+ * Removed duplicate keywords for Progress (BenBE)
+ * Removed duplicate keywords for T-SQL (BenBE)
+ * Linking for PowerShell special variables revised (BenBE)
+ * Fixed linking in ColdFusion (BenBE)
+ * Fixed linking in LaTeX (BenBE)
+ * Fixed linking in mIRC Scripting language (BenBE)
+ * Fixed escape char regexp for C-style languages (BenBE)
+ * Fixed @""-string handling for C# (SF#2789371, BenBE)
+ * Fixed Strict Block Detection for PHP blocks (BenBE)
+ * Changed allowed chars around Powershell operators (SF#2688863, BenBE)
+ * Minor reordering inside of PHP language file (BenBE)
+ * Added missing keywords for ActionScript3 language file (SF#2795005, BenBE)
+ * Added .xrc file extension for XML highlighting (BenBE)
+Version 1.0.8.3
+ - Added language files
+ * DCS (Stelio Passaris)
+ * Locomotive Basic (Nacho Cabanes)
+ * LSL2 (Linden Scripting Language) (William Fry)
+ * Modula-3 (Martin Bishop)
+ * Oberon-2 (Mike Mol)
+ * Rebol (Lecanu Guillaume)
+ - Fixed a problem where HardEscapes weren't working when no escape char was given (BenBE)
+ - Added a PARSER_CONTROL setting to treat whitespace inside of keywords in
+ the language file as "any whitespace" in the source (i.e. "CREATE TABLE"
+ in SQL will match "CREATE\s+TABLE" instead of literally matching) (BenBE)
+ - Added a possibility to allow setting the style for escape characters (BenBE)
+ - Improvements to language files (BenBE)
+ * Added some missing Perl keywords and obscure default variables (BenBE)
+ * Allow for escaped colons to appear in CSS names (BenBE, simon)
+ * Added multiline continuation suppoert of preprocessor defines for
+ C, C for Mac, C++ and CC++ with Qt support (BenBE)
+ * keywords for C-based languages are case-sensitive (BenBE)
+ * Broken AutoIt highlighting (BenBE)
+ * Problem with escaped backslash in PHP and D (BenBE)
+ * Added some more functions for PHP (BenBE)
+ * Some changes for AppleScript (Stefan Klieme)
+ * Forbid highlighting keywords followed by / in bash (BenBE)
+ * Updated the LaTeX file to link some keywords (BenBE)
+ * Additional text rendered when matching special variables for PowerShell (BenBE)
+ * Added some more keywords for ABAP (BenBE, Sandra Rossi, Jacob Laursen)
+Version 1.0.8.2
+ - Added language files
+ * Brainfuck \ Brainfork (Benny Baumann)
+ * HQ9+ (Benny Baumann)
+ * INTERCAL (Benny Baumann)
+ * LOLcode (Benny Baumann)
+ * LScript (Beau McGuigan)
+ * Pixel Bender (Richard Olsson)
+ * ProvideX (Jeff Wilder)
+ * VIM Script (Swaroop C H)
+ * Visual Prolog (Thomas Linder Puls)
+ * Whitespace (Benny Baumann)
+ - Changed priority for COMMENT_REGEXP compared to String highlighting (BenBE)
+ - Fixed correct escaping of spaces inside of URLs (BenBE)
+ - Updated the list of common file extensions (BenBE)
+ - Updated the language file check script in contrib/ (BenBE)
+ - Fixed a problem with link targets resulting in unclickable links (SF#2379120, BenBE)
+ - Fixed an undefined variable issue in langcheck.php (BenBE)
+ - Improvements to language files (BenBE)
+ * eMail Header highlighting now uses the correct delimiters for keywords (BenBE)
+ * eMail (RFC822\mbox) highlighting now highlights IPs, MIME types and
+ subfield assignments correctly (BenBE)
+ * Minor style changes in COBOL to improve loading performance (BenBE)
+ * Added some missing keywords for D (BenBE)
+ * Removed duplicate keywords from Progres, SAS and TSQL (BenBE)
+ * Fixed Heredoc Syntax for Bash (SF#2185319, BenBE)
+ * Moved symbol-lookalike sequences from keyword groups to separate symbol group
+ for languages asp, klonec, klonecpp, php, php-brief (BenBE)
+ * Fixed a lot of duplicate keyword warnings (BenBE)
+ * Added missing keywords to the Python language file,
+ introducing support for Python 3.0. (SF#2441839, milian)
+ * Updated documentation links for TypoScript (SF#2014276, BenBE)
+ * Fixed a problem with tag and attribute names in XML highlighting (SF#2276119, BenBE)
+ * Improved MySQL language file (BenBE, JavaWoman)
+ * Some commentss accidentially mistaken for DocComments (SF#2454897, BenBE)
+ * Added improved Escape Char handling for c, c_mac, cpp and cpp_qt (SF#2458743, BenBE)
+Version 1.0.8.1
+ - Added language files
+ * AviSynth (Ryan Jones)
+ * eMail \ mbox (Benny Baumann)
+ * GNU Make (Neil Bird)
+ * Oracle 11i support (Simon Redhead)
+ * Prolog (Benny Baumann)
+ * SciLab (Christophe David)
+ * TeraTerm macro language (Boris Maisuradze)
+ - Added support for Escape Regular Expressions (BenBE)
+ * Implemented C-style Escapes in PHP (BenBE)
+ * Introduced support for \xAB and \007 style Char Escapes in PHP (BenBE)
+ * Implemented Variable Highlighting in PHP (BenBE)
+ * Implemented Variable Highlighting in Bash (milian)
+ - Fixed a problem with PCRE patterns for Keyword matching sometimes producing
+ very large strings, that could not be handled by some versions of PCRE lib,
+ causing broken highlighting an Regexp Compile errors (BenBE, milian)
+ - Fixed broken highlighting of bash commands like `dbus-send --dest=org.....`,
+ i.e. the dest was highlighted as variable declaration (milian)
+ - Fixed broken highlighting of some symbols in their escaped form (BenBE)
+ (<SEMI> and <PIPE> were accidentially filtered even though they are valid)
+ - Fixed a "memory leak" in the *_regexp_caches (milian)
+ - Fixed broken Escape chars if classes were disabled
+ - start_line_numbers_at() was ignored when GESHI_HEADER_PRE_TABLE was set (revulo)
+ - Fixed a problem allowing Remote Code Inclusion under certain circumstances (BenBE)
+ - Changes to default CSS in order to make the GESHI_HEADER_PRE_TABLE align properly,
+ even on Windows / Mac systems with strange fonts (milian, revulo, ^RT)
+ - Minor style changes to the following languages:
+ * cpp-qt (milian)
+ * MySQL (BenBE)
+ * PHP (BenBE)
+ - Improvements to language files (BenBE, milian)
+ * Added MinSpareThread\MaxSpareThreads to Apache highlighter (BenBE)
+ * Added new Keyword group for APT sources.list highlighter (BenBE)
+ * Fixed highlighting in LaTeX for \begin{} and \end{}, i.e. the stuff inside
+ the curly braces. (milian, thanks for the report go to Matthias Pospiech)
+ * Improved String support for D (BenBE)
+ * MySQL was seriously broken (BenBE)
+ * Reworked Keyword groups for MySQL to allow for more configuration (BenBE)
+ * Improved Mirc script language file (milian)
+ * Improved C++ Qt language file (milian)
+ * Minor bug with Transpose Operator in Matlab (BenBE, Daniele de Rigo)
+ * Highlighting of Batch Files for Windows (BenBE)
+ * Updated AutoIt to include latest changes for AutoIt v3.2.12.1 (BenBE, Thierry)
+ * Fixed duplicate keyword warnings for Perl, Tcl and Typoscript (BenBE)
+ * Fixed Doc-URL getting reparsed by highlighted keywords of other groups (BenBE, Jordi Boggiano)
+Version 1.0.8
+ - Added language files
+ * APT sources.list (milian)
+ * Boo (Marcus Griep)
+ * CIL (Common Intermediate Language, .NET Assembly) (Marcus Griep)
+ * COBOL (Benny Baumann)
+ * Gnuplot (milian)
+ * KLoneC (Mickael Auger)
+ * KLoneC++ (Mickael Auger)
+ * PIC16xxx assembler (Phil Mattison)
+ * POV-Ray (Carl Fürstenberg)
+ * PowerShell (Frode Aarebrot)
+ * Progress (Marco Aurelio de Pasqual)
+ * TypoScript (Jan-Philipp Halle)
+ * Xorg configuration (milian)
+ - Make GeSHi's constructor arguments optional, so something like `$foo = new GeSHi;` is possible. (milian)
+ - Added an optimizer for lists to regular expressions. Using these cached lists results in a speedup of approx. 50%.
+ The slightly increased memory consumption (~150KB for PHP language file) is more than worth it! (milian)
+ - Some more memory & speed optimizations all over GeSHi (milian)
+ * Reduced memory overhead when highlighting keywords (BenBE)
+ * Keyword Linking now uses considerably less strtolower calls (milian)
+ * Cache Symbol Search Regexp and make Symbol Highlighting faster (milian)
+ * Use more native functions like substr_replace and strcasecmp to speed things up (milian)
+ * Use considerably less strlen() calls on various points by caching the results (milian)
+ * Properly set comments to be case insensitive where appropriate to increase performance (milian)
+ * Improve the performance of the strict mode tokenizer, making highlighting of languages like
+ HTML, ColdFusion or XML faster (milian)
+ * Setup caches for parsing on demand to make stylesheet generators fast (milian)
+ - Various improvements to Strict Block Handling (BenBE, milian)
+ * Added support for RegExp-based Strict Blocks (BenBE)
+ * Fixed highlighting incorrectly stopping at ?> in PHP (SF#1330968, BenBE)
+ * Languages with STRICT_MODE_APPLIES = GESHI_MAYBE default to strict mode now. When no highlightable
+ code is found in this mode, we fallback to the same setting as if GESHI_NEVER was set. That way it
+ should not be needed to call enable_strictmode() manually. (milian)
+ - Added new GESHI_HEADER_PRE_VALID type which uses the following markup: (milian)
+ * With line numbers: <div>header<ol><li><pre>...</pre></li>...</ol></div>
+ * Without line numbers: <pre>header...CODE...</pre>
+ => valid HTML and no need for &nbsp; indentation
+ - Added new GESHI_HEADER_PRE_TABLE type which can be used to prevent linenumber-selection in Firefox
+ on copy'n'paste. (milian)
+ - set_language will not reset any language settings by default anymore.
+ * Added $force_reset param for to force full reload of a language. (milian)
+ * Make sure strict_mode is set properly when doing repeated set_language calls (milian)
+ - Fixed some problems with old PHP versions (SF#1975625, milian, BenBE)
+ - Fixed broken use with Suhosin Patch when /e modifier was disabled (SF#2021800, BenBE)
+ - Added support for external style information files to override language defaults without modifying language files (BenBE)
+ - The overall_class is now up to the user, and the language-code is _always_ added as a class (milian)
+ - Fixed Economy Mode for GeSHi::get_stylesheet() - now it just makes so much more sense! (milian)
+ - Fixed Economy Mode when COMMENT_REGEXP are used (BenBE)
+ - Changed the default encoding to use UTF-8, due to SF#2037598, BenBE)
+ - Improved overall string support:
+ * Added support for multichar string delimiters (SF#1932083, BenBE)
+ * Fixed problems of unfinished strings and comments producing invalid XHTML (SF#1996353, BenBE)
+ * Multichar Quotemarks sometimes had inconsistent behaviour (BenBE)
+ * Support for multiple styles of strings depending on the starter (BenBE)
+ * Properly handle escapes in strings, i.e. '\\' was not working properly before (milian)
+ * Fixed escape char support when an escape char is followed by multi-byte chars (SF#2037598, BenBE)
+ - Improved flexibility in language files (BenBE, milian)
+ * Added PARSER_CONTROL for OOLANG method highlighting (SF#1923060, BenBE)
+ * Added possibility to define strict blocks using an Regexp (BenBE)
+ * Removed explicit escaping of / in Regular Expressions (BenBE)
+ * Ignoring empty keyword groups when highlighting (milian)
+ * Make language_permissions configurable in language files via ['PARSER_CONTROL']['ENABLE_FLAGS']
+ this makes is_a calls unneeded and thus prevents PHP notices in PHP 5.x (milian)
+ * Extended support for number formats now covering the most common formats (SF#1923058, BenBE)
+ * Lifted a limitation that keywords had to have at least 2 subsequent letters (BenBE)
+ * Changed behaviour of PARSER_CONTROL now allowing to provide the full Lookahead and Lookbehind
+ expressions used as delimiters inside keywords instead of a simple char group (BenBE)
+ * Fixed improper handling of newlines in REGEXPS so this does not produce invalid html anylonger (milian)
+ - Some typos and mistakes in the documentation (BenBE)
+ - Added a script to contrib/ to verify language files are correct (BenBE)
+ - Fixed loads of compliancy warnings detected with that automated compliance testing script (BenBE)
+ - Many other improvements to various language files (BenBE, milian)
+ * Reduce strict errors & notices for language files (milian)
+ * Fixed symbol highlighting with C++ sometimes missing keywords after ; and comments (BenBE)
+ * Improved comment handling with TCL (Lars Hellström, BenBE)
+ * Fixed broken handling with XML comments (BenBE, SF#1849233)
+ * Fixed HTML comments spawning multiple lines producing invalid XHTML output (SF#1738173, BenBE)
+ * Added support for parameters beginning with dash in BASH language (BenBE)
+ * Support Apache's configuration sections, see http://httpd.apache.org/docs/2.2/sections.html (milian)
+ * Minor issue with PHP Heredoc and Nowdoc syntax sometimes not getting highlighted (BenBE)
+ * Updated Objective-C language file (SF#2013961, Quinn Taylor, BenBE)
+ * Added some keywords for VHDL (beshig, BenBE)
+ * Fixed severly broken ColdFusion language file (milian)
+ * Fixed some incorrectly highlighted things with the CSS language file (milian, BenBE)
+ * Improved Smarty language file (milian)
+ * Improved CSS language file (milian)
+ * Improved Pascal language file (milian)
+ * Improved LaTeX language file (Ðндрей Парамонов, BenBE)
+ * Fixed a regular expression in mIRC language file that caused a warning message to be issued (BenBE)
+ * Removed <, > and / from HTML names, now only containing the real tag names (BenBE)
+ * Use spaces instead of tabs for indendation in language files to have a consistent
+ coding standard accross geshi files (milian)
+ * Added some comment styles, keywords and added index highlighting (Chusslove Illich, ЧаÑлав Илић)
+ - Removed some private methods which were only called at exactly one place (milian)
+ * format_header_content
+ * format_footer_content
+ * get_attributes
+ - Second part of default style changes. Affected in this release:
+ * C++
+ * C++ (Qt)
+ * CSS
+ * VHDL
+Version 1.0.7.22
+ - Added language files
+ * glSlang (BenBE)
+ * KiXtart (Riley McArdle)
+ * Lotus Notes @Formulas (Richard Civil)
+ * LotusScript (Richard Civil)
+ * MXML (David Spurr)
+ * Scala (Franco Lombardo)
+ * ActionScript 3 (Jordi Boggiano)
+ * GNU Gettext .po/.pot (Milian Wolff)
+ * Verilog (Günter Dannoritzer)
+ - Fixed a problem not yet addressed in 1.0.7.21 regarding highlighting of
+ symbols that caused some extra characters to be added in the output or
+ broke highlighting and standard compliance due to missing escaping of
+ internally used characters (SF#192320 and SF#1926259, BenBE)
+ - Fixed missing style information for ocaml language file (The_PHP_Jedi)
+ - Fixed a bug causing masses of warnings in rendered output if language file
+ miss style information (The_PHP_Jedi, BenBE)
+ - Missing tab width information could lead to warnings (BenBE)
+ - Missing symbol information for ASP (SF#1952038, nfsupport, BenBE)
+ - Empty delimiter message with OOoBasic (BenBE, Ccornell)
+ - Escaping of comments in LaTeX ignored (SF#1749806, BenBE)
+ - Modified Math environment $$ in LaTeX to be non-greedy (BenBE)
+ - Added possibility to match a regexp as comment (SF#1914640, SF#1945301, SF#1934832, BenBE)
+ - Introduced C-Style multiline continuation comments (SF#1914640, SF#1945301, BenBE)
+ - Introduced Fortran Comments (SF#1914640, SF#1934832, BenBE)
+ - Implemented Heredoc and Nowdoc Syntax for PHP and Perl (SF#1914640, BenBE)
+ - Implemented Compiler Directives for Delphi (SF#1914640, BenBE)
+ - Implemented minimalistic support for JavaScript \ Perl Regular Expressions (SF#1786665, SF#1754333, SF#1956631, BenBE)
+ - Fixed Strings in Matlab to be handled as comments instead of regexps, to prevent keywords being linked (BenBE)
+ - Applied PARSER_CONTROL fix of C++ for C++-Qt-Derivative (BenBE)
+ - Fixed incorrect treatment of unequally long multiline comment separators (related to SF #1891630, BenBE)
+ - Added PARSER_CONTROL settings for keywords in ASM language file (SF#1835148, BenBE)
+ - Fixed missing CASSE_SENSITIVE entry for DOS language file (SF#1956314, BenBE)
+ - Fixed accidential highlighting of keywords in argument names (SF#1956456, Milian Wolff, BenBE)
+ - Fixed yet again some #-related bash problem (SF#1956459, Milian Wolff, BenBE)
+ - Added backticks as symbols (Milian Wolff)
+ - Example script remembers selections and source submitted (Milian Wolff)
+ - Example script allows remembered source and preselected language to be cleared (Milian Wolff)
+ - Example script now properly includes geshi and doesn't suppress error messages anylonger. (Milian Wolff)
+ - Code cleanup by using direct string indexing instead of substr with length 1 (Milian Wolff)
+ - Optimized generation of code parts in strict mode (Milian Wolff)
+ - Optimized COMMENT_REGEXP by using an incremental regexp cache (Milian Wolff, BenBE)
+ - Fixed a problem that rarely skipped highlighting of escaped chars which usually should have gotten highlighted (BenBE)
+ - Optimized generation of highlighted strings to use fast skip forward while highlighting them (Milian Wolff, BenBE)
+ - Optimization using basic rework of indent function improving tab expansion performance (BenBE)
+ - Lots of other minor optimizations based on coding style improvements (Milian Wolff)
+ - Implemented setting to force spans to be closed before newlines, see SF#1727398 (Milian Wolff)
+ - Added missing credits for D language file to THANKS file (SF#1720899, BenBE)
+ - Optimization to prevent loading the current language file twice (Milian Wolff)
+ - Optimization: Use file_get_contents() to load sourcecode from files.
+ Even if GeSHi worked with PHP 4.1 before, it doesn't now. (Milian Wolff)
+ - Added description of extra language features (SF#1970248, BenBE)
+ - Added support for highlighting the C# using and namespace directives (SF #1395677, BenBE)
+ - Added support for highlighting the Java import and package directives (SF #1395677, BenBE)
+ - Fixed minor problem in Haskell cuasing accidential start of comment (SF#1987221, BenBE)
+ - Fixed minor issue causing loads of warnings if a language files defines no symbols (BenBE)
+ - Updated some aspects of the documentation and included further hints (BenBE)
+ - First of series of color scheme changes. Affected languages (sofar):
+ * Assembler (x86)
+ * Bash
+ * C
+ * C#
+ * Delphi
+ * Fortran77
+ * glSlang
+ * Java & Java 5
+ * JavaScript
+ * OCaml
+ * OpenOffice.org Basic
+ * Pascal
+ * Perl
+ * PHP and PHP-Brief
+Version 1.0.7.21
+ - Added language files
+ * Basic4GL (Matthew Webb)
+ - Fixed problem with mIRC language highlighting spaces only (BenBE)
+ - Language files can now specify a function to be called to decide the
+ colour of a regular expression match
+ - Added single quote to Lua (Darrin Roenfanz)
+ - Compare comments case insensitively (fixes AutoIT comments somewhat)
+ (Daniel Gordon)
+ - Fixed symbols not being highlighted at all (SF #1767953, BenBE)
+ - Fixed brackets not correctly managed (SF #1767954, BenBE)
+ - Changed default languages for some extensions
+ - Included color and character information for symbol highlighting in some languages (BenBE)
+ - Fixed a problem with extension detection if default was used (BenBE)
+ - Fixed a highlighting problem with the LaTeX language (SF #1776182, BenBE)
+ - Added a new parameter for enable_highlighting to reduce source duplication (SF #1786104, BenBE)
+ - Updated doxygen documentation to include since tags and some missing parameters
+ - Disabled symbol highlighting by default (doesn't affect brackets, cf. documentation) (BenBE)
+ - Added a check for set_case_keywords for the given param to be supported (BenBE)
+ - Minor rework of the HTML documentation layout \ W3C compliance (BenBE)
+ - Fixed highlighting error in bash language avoiding keywords in comments (SF #1786314, SF #1564839, BenBE)
+ - Fixed template params for C++ and C# not being highlighted (SF #1772919, BenBE)
+ - Fixed more reported problems about mirc highlighting
+ - Added some missing keywords for VB.NET
+ - Fixed some warnings in DOS language file (Florian Angehrn)
+ - Add possibility to handle more than one extra line style (SF #1698255, German Rumm, BenBE)
+ - Fixed handling of URLs when output case differs from URL case (SF #1815504, Tom Samstag, BenBE)
+ - Fixed POD (Plain Old Documentation) format problems breaking highlighting of Perl (SF #1891630, Shannon Wynter, BenBE)
+ - Fixed a problem with mIRC when & was used for identifiers (SF #1875552, BenBE)
+Version 1.0.7.20
+ - Added language files
+ * Genero (logic) and Per (forms) (FOURJ's Genero 4GL) (Lars Gersmann)
+ * Haskell (Dagit)
+ * ABAP (Andres Picazo)
+ * Motorola 68k Assembler (for MC68HC908GP32 Microcontroller) (BenBE)
+ * Dot (Adrien Friggeri)
+ - Fixed java documentation search for keywords to actually go to the
+ documentation (spaze)
+ - Applied fix for bug 1688864 (bad regexes) (Tim Starling)
+ - Fixed comment CSS rule in visualfoxpro
+ - ThinBASIC language update (Eros Olmi)
+ - mIRC language update (BenBE)
+ - Fixed outdated documentation URL of Perl language file (RuralMoon by BenBE)
+ - Fixed tab replacement code not generating the correct number of spaces in
+ some cases (Guillermo Calvo)
+ - Fixed two typos in Z80 language file
+ - Applied fix for bug 1730168 (Daniel Naber)
+ - Applied fix for bug 1705482 (Jason Frame)
+ * Configurable line endings (Replace \n by custom string)
+ * per-language tab-widths (Adjustable for width>=1)
+ * Included defaults for ASM (x86, m68k, z80), C, C (Mac), C++, C++ (Qt), C#,
+ Delphi, CSS,, HTML, PHP, PHP (Brief), QBasic, Ruby, XML
+ - Added a possibility to force generation of a surrounding tag around
+ the highlighted source
+ - Applied fix for additional keywords for the bash language
+ (cf. http://bash.thefreebizhost.com/bash_geshi.php, BenBE / Jan G)
+ - Fix bad colour definition in GML language (Andreas Gohr)
+ - Fixed phpdoc comments not being indented one space if they should be (Andy
+ Hassall)
+Version 1.0.7.19
+ - Added language files
+ * X++ (Simon Butcher)
+ * Rails (Moises Deniz)
+ - Fixed invalid HTML being generated and doctypes not being highlighted over
+ multiple lines properly when line numbers are on (Validome)
+ - Improved the ruby syntax highlighting by basing it off the Rails file
+ - Changed some regular expressions to possibly help with badly performing
+ regex support in PHP (Tim Starling)
+ - Allow {TIME}, {LANGUAGE} and {VERSION} to be used in the header as well as
+ the normal <TIME>/<LANGUAGE>/<VERSION> (AthanD)
+ - Changed comment regex in bash to prevent malformed XHTML (rv1971)
+Version 1.0.7.18
+ - Added language files
+ * ZiLOG Z80 Assembly (BenBE)
+ - Fixed incorrect highlighting when the starter of a multiline comment is
+ longer than the ender (Robert Anthony).
+ - Fixed "</span" generated if a multiline comment is the last thing in the
+ source (related to the above).
+ - Added #cs => #ce comment markers to AutoIT (Robert Anthony)
+ - Fixed spelling mistake for keyword in Python (wd3)
+ - Added a method to enable/disable keyword linking (Ian McKellar)
+ - Improved empty line detection for HTML output (BenBE)
+ - Changed code style of geshi.php, and removed tabs
+Version 1.0.7.17
+ - Fixed up ends of files having too many newlines (binarygroop)
+ - Removed background colour on keyword group in eiffel (Julian Tschannen)
+ - Removed GESHI_DIR_SEPARATOR constant usage, it's unnecessary (Aleksey Zapparov)
+ - Added /* ... */ comments to coldfusion (Jeff Howden)
+Version 1.0.7.16
+ - Added language files
+ * ActionScript (Steffen Krause)
+ * C++/Qt (Iulian M)
+ * PL/SQL (Victor Engmark)
+ - Fixed up my e-mail address everywhere
+ - Fixed notice with "error" property (IZIU Zielona Góra)
+ - Added some entries to the get_language_name_from_extension table
+ (Stebastian Schuberth)
+Version 1.0.7.15
+ - Added language files
+ * BNF (Rowan Rodrik van der Molen)
+ * IO (me, thanks to Johnathan Wright)
+ * mIRC (Alberto de Areba Sánchez)
+ - Fixed use of colon in XML (Grigory Rubtsov)
+ - Fixed notices in text.php, reg.php and latex.php when $this is not
+ available (Clemens Weiß)
+ - Made third parameter of geshi_highlight optional (Gaetano Giunta)
+ - Fix incorrect highlighting of the $# variable in bash (Michael Knight)
+ - Fixed single line comment mistake in thinbasic.php (Eros Olmi)
+Version 1.0.7.14
+ - Added language files
+ * thinBasic (Eros Olmi)
+ * LaTeX (Matthais Pospiech)
+ - Removed extra newlines at the end of some files
+ - Fixed SF bug 1556404 - check before using $this in language files
+ (Clemens Weiß)
+Version 1.0.7.13
+ - Added language files
+ * Uno IDL (Cedric Bosdonnat)
+ - Fixed add_ids causing odd XHTML (RyanJ)
+ - Fixed extra newline being added to end of result (Andreas Gohr)
+Version 1.0.7.12
+ - Fixed lines being collapsed when they contain just a space (artlover)
+ - Allowed matching for regexes using start/end matchers at the start/end
+ of the code (Sheri)
+ - Added (dubious) fix for google "I'm feeling lucky" search for java keywords
+ (dubious in that it doesn't work for me)
+ - mysql - Made the symbols into their own keyword group as the symbol group
+ isn't used. Added a style for multiline comments.
+ - Added a couple of php5 keywords to the php language files.
+ - Allow XML tags to have dashes.
+ - Changed LANG_NAME for many languages to be more sensible/correct case
+ (Matthias Mohr)
+ - Added case-sensitivity indices to python
+Version 1.0.7.11
+ - Added language files
+ * Smalltalk (Bananeweizen)
+ - Minor style improvements to matlab
+ - Moved a couple of functions to the correct group in smarty (arwan)
+Version 1.0.7.10
+ - Added language files
+ * TCL (Reid van Melle)
+ * Winbatch (Craig Storey)
+ * Groovy (Ivan F. Villanueva B.)
+ * Text (SmokingRope)
+ * Reg (SmokingRope)
+ - Removed \ as an escape character in T-SQL (Dave Jackson)
+ - Reset extra lines to highlight if source is changed (Diogo Resende)
+ - Allow setting of lexic permissions in language files (SmokingRope)
+ - Allow regexes to set a CSS class name (SmokingRope)
+ - Added URL support to DOS language (mastrboy)
+Version 1.0.7.9
+ - Added language files
+ * Fortran (Cedric Arrabie)
+ * SAS (Galen Johnson)
+ * CFDG (John Horigan)
+ - Fixed & in URL in java5 (Clemens Weiß)
+ - Added MD5 and SHA1 to mysql keywords (polarina)
+ - Fixes for highlight_lines_extra with line numbers (ithcy)
+ - Fixed backslash characters being removed (ArTourter)
+Version 1.0.7.8
+ - Fixed blank at start of MySQL file (W. Tasin)
+ - Fixed smarty functions being broken (ultrabob)
+ - Changed keyword and regexp detection and parsing
+ slightly to allow more "meta characters" (like #) in
+ keywords
+ - Minor fixes for XML and GML
+Version 1.0.7.7
+ - Added language files
+ * T-SQL (Duncan Lock)
+ * Robots.txt (Christian Lescuyer)
+ * AutoIT (mastrboy)
+ * Java 5 (Clemens Bruckmann)
+ * ColdFusion (Diego)
+ - A few keyword changes in java, removed :: object splitter (amphi)
+ - Now using a simpler regular expression for numbers (Brice Bernard)
+ - Fixed ah, bh etc. regs being highlighted as numbers (Unknown)
+Version 1.0.7.6
+ - Fix backtick-string highlighting in ruby (Juan J. Martínez)
+ - Add =begin multiline comments in ruby (Juan J. Martínez)
+ - Added support for :keywords and ::access in lisp (Denis Mashkevich)
+ - Prevented number highlighting if they are just after underscores (Joce)
+ - Removed escape characters for strings in XML and HTML (floele)
+ - Added instanceof keyword to java (jgottschling)
+ - Fixed comments in ASP (SBD)
+ - Removed unnecessary keyword style index from ini
+ - Added support for " strings in ini
+ - Removed unnecessary regex style index from blitzbasic
+ - Keyword case of URL-ed keywords should be defined by language file (Benny Baumann)
+ - Added "Hardquote" feature, provides more accurate string highlighting (Cliff Stanford)
+ - Used hardquote support for @"..." strings in C# (Cliff Stanford)
+ - Used hardquote support for ' strings in perl (Cliff Stanford)
+ - Fixed setting of language path (Cliff Stanford)
+ - Display source correctly formatted with line numbers (if requested) if an error
+ has occured (several people)
+ - Having no source to highlight is not an error condition anymore
+ - Delphi language updated to include more keywords and types (BenBE)
+ - Updated NSIS to version 2.11 (deguix)
+Version 1.0.7.5
+ - Fix for using escape characters to escape newlines breaking XHTML compliance (Yves Goergen)
+ - Fixed method highlighting in VB (Matt Beale)
+ - Fixed multiline comment highlighting in SQL (MrBaseball34)
+ - Fixed two ">" symbols being outputted when using a footer but not CSS classes (MrBaseball34)
+ - Marked important block stuff as deprecated
+ - Some documentation tidyup
+ - Updated GML language file (Jos? Jorge Enr?quez Rodr?guez)
+ - THANKS file tidied up
+ - Fixed double </a> for elements in HTML (Yves Goergen)
+ - Added some keywords for ASM (Dreuzzo)
+Version 1.0.7.4
+ - Added language files
+ * MySQL (Carl Fürstenberg)
+ * BlitzBasic (Pàdraig O`Connel)
+ - Fixed up geshi_highlight function: it now correctly uses <code> instead of <div> (Remi Faure)
+ - When using GESHI_HEADER_NONE, remove the <ol> if line numbering is not enabled
+ - Commented example.php so people can use it as a guide better
+ - Fixed extra newline being generated if a comment is at the end
+ of the source (many people, including Yves Goergen)
+ - Fixed up some documentation issues
+ - Some minor language file fixes (C++, Lua) (Lua fixes by chromix)
+ - Fixed up no </span> in XML and other strict languages (regression from 1.0.7.3 fix: removed
+ unnecessary </span> when using strict mode) (Daniel Ecer, drskrud),
+Version 1.0.7.3
+ - Added language files
+ * Scheme (Jon Raphaelson)
+ * Ocaml and Ocaml-brief (Flaie)
+ * Ruby (Amit Gupta)
+ - Make urls generated for java highlighting XHTML compliant (Tim Van Wassenhove)
+ - Removed unnecessary </span> when using strict mode (Tim Van Wassenhove)
+ - Fixed warning in dos.php about undefined constant (Tim Van Wassenhove)
+ - Fixed security hole in contrib/example.php - able to view any file if source
+ not set and language is set to wierd value (Maksymilian Arciemowicz)
+Version 1.0.7.2
+ - Added language files
+ * Inno (Thomas Klinger)
+ * Ini (Deguix)
+ * DOS (Batchfile) (Alessandro Staltali)
+ * Applescript (Stephan Klimek)
+ * Freebasic (Roberto Rossi)
+ * SDLBasic (Roberto Rossi)
+ * ActionScript (links to French documentation) (NikO)
+ - NSIS language file updated (deguix)
+ - Lua language file updated (Roberto Rossi)
+ - Bugfix: Styles incorrectly overriding default styles instead of being merged
+ in set_*_styles methods (Stebastian Werner)
+ - Added GESHI_HEADER_NONE as valid header type. This still allows header content.
+Version 1.0.7.1
+ - Added language files:
+ * Div (Gabriel Lorenzo)
+ * GML (José Jorge Enríquez Rodríguez)
+ * Eiffel (Zoran Simic)
+ - Minor change to rules regarding when keywords can appear - now dots (.) are
+ allowed before keywords. (NikO)
+ - Bugfix: the line style for non-fancy lines when fancy highlighting is enabled
+ is now applied (Amit Gupta)
+Version 1.0.7
+ - Added language files:
+ * Diff (Conny Brunnkvist)
+ * VHDL (Alexander Krause)
+ * D (Thomas Kuehne)
+ * Matlab (Florian Knorn)
+ - Python highlighting improved (thither, Federico Quagliata)
+ - Changed file comments to use phpdoc syntax, and changed code style to be more
+ like PEAR
+ - Fixed bug in set_code_style: Second parameter is now optional
+ - The $_GESHI_ERRORS array is gone, error messages are internal to the GeSHi class
+ - Changed name of XML language to XML from HTML
+ - Removed min and max tab width checks
+ - Backported GeSHi 1.1.X's automatic language file path detection so you no longer
+ need to use the third parameter of the constructor or set_language_path except for
+ special circumstances.
+ - Source is checked to make sure it is not empty else an error occurs
+ - Removed excess characters after ?> in ada.php, apache.php and cpp.php that caused
+ http headers to be sent (psichron)
+ - Removed second "foreach" keyword for smarty language file that was causing
+ duplication (Iss)
+ - Added underscore to allowed characters in match for XML tags (anonymous)
+ - Added some missing java keywords like "abstract" and "transient"
+ - Added "list" and "continue" PHP keywords
+ - set_language resets error status and strict mode (Andrew Black)
+ - Removed margin:0 declaration from cssgen.php (Andrzej Kubaszek)
+ - Fixed multiline comment selector in cssgen.php (Andrzej Kubaszek)
+Version 1.0.6
+ - Added support for smart tabs - tabs that behave just like normal tabs when in
+ GESHI_HEADER_DIV mode.
+ - Partial patch for UTF-8 encoding applied (doesn't quite work however...)
+Version 1.0.5
+ - Added language files:
+ * MPASM (Bakalex)
+ * Oracle 8 (Guy Wicks)
+ - Fixed bug where not using an encoding type would sometime result in warnings (although
+ there still seems to be issues with encoding in general that I'm trying to gather more
+ data on) (Alexander Spennemann)
+ - Removed "margin: 0" from <ol> in an attempt to make line numbers visible in IE again
+ by default (untested, but I don't really care if it works... get firefox! ;))
+ - Added note on php5 support (Karim Scheik)
+ - Added two new methods: load_from_file and get_language_name_from_extension, that can
+ help automate file highlighting (though the extension array at this time is quite bare)
+ (David Gartner, Brian Cheesman)
+Version 1.0.4
+ - Fixed many version-reporting bugs (Jack Lloyd)
+ - Fixed bug where methods were not having the correct CSS generated for them
+ by get_stylesheet() (Jack Lloyd)
+ - Added new keywords to C and C++ files (Jack Lloyd)
+ - Added section on case sensitivity to documentation that wasn't in the other versions
+Version 1.0.3
+ - Added language files:
+ * Smarty (Alan Juden)
+ * C# (Alan Juden)
+ * VB.NET (Alan Juden)
+ * C for Macs (M. Uli Kusterer)
+ * Objective C (M. Uli Kusterer)
+ - Links can have a target attribute (Andreas Gohr)
+ - Fixed multiline string bug if not using classes
+ - Added method set_encoding that allows you to set the character
+ set used by calls to htmlentities() in GeSHi
+ - You can now specify an array of object splitters, and each
+ type of method separated by each object splitter can be highlighted
+ differently
+ - If a language uses a case sensitive keyword group and that group
+ has a URL associated with it, the keyword will not be lowercased
+ in the URL (M. Uli Kusterer)
+Version 1.0.2
+ - Added language files:
+ * Actionscript (Steffen Krause)
+ * ASP (Amit Gupta)
+ * Bash (Andreas Gohr)
+ * CADDCL (Roberto Rossi)
+ * CadLisp (Roberto Rossi)
+ * C++ (Dennis Bayer)
+ * Delphi (Járja Norbert)
+ * Javascript (Ben Keen)
+ * Lisp (Roberto Rossi)
+ * OpenOffice.org BASIC (Roberto Rossi)
+ * Perl (Andreas Gohr and Ben Keen)
+ * Python (Roberto Rossi)
+ * VisualFoxPro (Roberto Armellin)
+ * XML (Nigel McNie, from an idea/file by Christian Weiske)
+ - Added contrib/ directory with script to create one external stylesheet
+ from many languages(base script by Andreas Gohr, modified by Nigel McNie),
+ and an example script (needs lotsa work...)
+ - Code lines can have their own unique ID (for use with javascript)
+ (suggested by Andreas von Oettingen)
+ - Certain rows can be specified to be highlighted differently (suggested by
+ Andreas von Oettingen)
+ - Getter available for human-readable language name (suggested by Simon Patterson)
+ - Line numbers aren't highlighted when a user selects the code
+ - Contextual highlighting with <BEGIN GeSHi> ... <END GeSHi> in the code (which
+ can be disabled)
+ - Functions can be made into URLs to appropriate documentation (suggested
+ by cybot_tm). Also thanks to Marcin Gryszkalis for the links for C, Java
+ and Perl.
+ - Code can have a header and footer
+ - Time taken to parse the code is recorded and made available with the get_time()
+ method
+ - error() now returns a human-readable error message
+ - Function geshi_highlight added to make it even easier to highlight on the fly
+ - Advanced regular expression handling
+ - Bug fixes to lexic_permission handling
+Version 1.0.1
+ - Added methods set_symbols_style() and set_symbols_highlighting(). These should be used
+ instead of set_brackets_style and set_brackets_highlighting respectively.
+ - Added a new field - language_path - that can be set either when the constructor is
+ called, or by the new method set_language_path(), that specifies a path to the directory
+ containing the language files (bug reported by bbspliff)
+ - Added a new method set_case_keywords(), that allows the auto-casing feature to be
+ changed on the fly instead of simply being specified in the language file
+ - If there is an error the source that is outputted is now handled much better
+ - Lines are broken in the source only by \n now, not by \r\n (to save on output source)
+ - Indentation moved into its own method
+ - Method header() modified to allow the user to choose whether the code is surrounded in
+ a <div> or a <pre> (see documentation for benefits of both). Method footer() likewise
+ modified.
+ - Method get_stylesheet() modified so that a smaller comment is outputted in economy mode,
+ and bugs with when line number classes are outputted in economy mode have been fixed
+ - Bug where spans had two quotes at the end of the attributes fixed (ie. <span style=".."">)
+ - Added language files:
+ * Ada (Tux)
+ * Apache log file (Tux)
+ * ASM (Tux)
+ * NSIS (Tux)
+ * Pascal (Tux)
+Version 1.0.0
+ - Initial Release \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/COPYING b/extensions/SyntaxHighlight_GeSHi/geshi/docs/COPYING
new file mode 100644
index 00000000..5b6e7c66
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/README b/extensions/SyntaxHighlight_GeSHi/geshi/docs/README
new file mode 100644
index 00000000..34191bd5
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/README
@@ -0,0 +1,33 @@
+
+ GeSHi - GEneric Syntax HIghlighter
+ ----------------------------------
+ Version 1.0.8
+
+Author: Benny Baumann, Nigel McNie
+Email: BenBE@geshi.org, nigel@geshi.org
+GeSHi Website: http://qbnz.com/highlighter
+
+GeSHi is a generic syntax highlighter, written in PHP. You simply
+input the source code you wish to highlight with the language you
+wish to use, and the output will be a file syntax highlighted to
+XHTML standards.
+
+For more information on how to use GeSHi, please consult the
+documentation. If you got this readme from a GeSHi package, then
+the documentation is available in the docs/ directory. Documentation
+is also available at http://qbnz.com/highlighter/documentation.php
+
+If you think you've found a bug in GeSHi, contact me with a bug
+report at BenBE@omorphia.de, or submit it to the bug tracker at
+http://sourceforge.net/tracker/?group_id=114997&atid=670231. Be
+aware that minor highlighting errors may well just be incorrect
+language files, but if you do find something major please contact me.
+
+And if you're using GeSHi as a plugin/mod for some other software,
+please tell me about it! It's worth a link to you, and I can give
+you specialist help if you need it.
+
+GeSHi is free software, released under the GNU GPL. Please see the
+COPYING file for more information. If you do modify this program,
+please tell me about it! Perhaps you've made a good improvement that
+I can learn from :) \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/THANKS b/extensions/SyntaxHighlight_GeSHi/geshi/docs/THANKS
new file mode 100644
index 00000000..be3325e9
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/THANKS
@@ -0,0 +1,249 @@
+
+ THANKS - List of credits for GeSHi
+
+I owe these people/groups my thanks for help with GeSHi. Thanks, guys!
+
+- Amit Gupta - Thanks for all that constructive criticism - it's
+ a great help for making GeSHi even better. And
+ thanks for the Wordpress plugin! (Anyone who is
+ interested in the plugin can visit:
+ http://blog.igeek.info/still-fresh/category/wp-plugins/igsyntax-hiliter/)
+- Andreas Gohr - Thanks for language files and for using GeSHi for DokuWiki
+ (http://www.splitbrain.org/dokuwiki/wiki:dokuwiki). And thanks
+ for all your criticisms and for that stylesheet-maker code :).
+ Also, thanks for the UTF-8 patch.
+- Andreas von Oettingen - Thanks for those great ideas! :)
+- bbspliff - Thanks for pointing out that bug (pity I already
+ found it though ;))
+- Benny Baumann - Thanks for your innumerable suggestions for improvements, and your
+ work on Delphi support :)
+- Ben Keen - Thanks for the language files and pointing out some
+ ideas for future releases. Lookin' forward to seeing that
+ software soon! ;)
+- Brian Cheesman - Thanks for using GeSHi in phpCvsView, and for the suggestion about
+ extension => language lookup
+- Christian Weiske - Thanks for the inspiration for creating advanced regexp
+ highlighting :D
+- Cliff Stanford - Thanks for the hardquote support for C# and Perl (can be used elsewhere
+ I'm sure)
+- David Gartner - Thanks for using GeSHi in net2ftp, and for the idea about a load_from_file
+ method
+- forum.qbasicnews.com - Thanks for putting up with the crappy versions
+ that I "forced" on you guys before ;)
+- Gizmore - Providing some patch to query supported languages
+- Jack Lloyd - Thanks for pointing out the versioning and method CSS bugs, and giving
+ me the extra C/C++ keywords
+- Karim Scheik - Thanks for the php5 support report
+- Marcin Gryszkalis - Thanks for those links for C, Java, Perl
+- M. Uli Kusterer - Thanks for the idea about URL case conversion
+- Milian Wolff - Thanks for the loads of optimizations
+ - Thanks for helping with implementation of various features
+- Roberto Armellin - Thanks for pointing out some flaws in GeSHi (that will be solved
+ in 1.2 guaranteed)
+- Sterling Christensen - Thanks for those links to language specs
+- Tux - Thanks for making all those language files :D
+- zbw - Thanks for proving a phpBB port was possible
+
+PEOPE WHO MADE LANGUAGE FILES
+
+- ABAP Andres Picazo
+- Actionscript Steffen Krause (french translation by NikO)
+- ActionScript 3 Jordi Boggiano (version for ActionScript3 and MXML)
+- Ada Tux
+- Algol68 Neville Dempsey
+- Apache Tux
+- Applescript Stephan Klimek
+- Apt sources.list Milian Wolff
+- ARM Marat Dukhan
+- ASM Tux, Dennis Yurichev, Marat Dukhan
+- ASP Amit Gupta
+- Asymptote Manuel Yguel
+- Autoconf Mihai Vasilian
+- AutoHotkey Naveen Garg
+- AutoIt mastrboy
+- AviSynth Ryan Jones
+- Awk George Pollard
+- BASCOM AVR Michal Goralczyk
+- Bash Andreas Gohr
+- Basic4GL Matthew Webb
+- BibTeX Quinn Taylor
+- BlitzBasic P�draig O`Connel
+- BNF Rowan Rodrik van der Molen
+- Boo Marcus Griep
+- Brainfuck \ Brainfork Benny Baumann
+- C for Loadrunner Stuart Moncrieff
+- C for Macs M. Uli Kusterer
+- C# Alan Juden
+- C++ Dennis Bayer, M. Uli Kusterer
+- C++/Qt Iulian M
+- CADDCL Roberto Rossi
+- CadLisp Roberto Rossi
+- CDFG John Horigan
+- ChaiScript Jason Turner, Jonathan Turner
+- CIL Marcus Griep
+- Clojure Jess Johnson
+- CMake Daniel Nelson
+- COBOL Benny Baumann
+- CoffeeScript Trevor Burnham
+- ColdFusion Diego
+- Cuesheet Benny Baumann
+- D Thomas Kuehne
+- DCL Petr Hendl
+- DCPU-16 Benny Baumann
+- DCS Stelio Passaris
+- Delphi Járja Norbert, Benny Baumann
+- Div Gabriel Lorenzo
+- DOS Alessandro Staltari
+- E Kevin Reid
+- ECMAScript Michel Mariani
+- Eiffel Zoran Simic
+- eMail \ mbox Benny Baumann
+- EPC Thorsten Muehlfelder
+- Erlang Benny Baumann, Dan Forest-Barbier, Uwe Dauernheim
+- Euphoria Nicholas Koceja
+- F# Julien Ortin
+- Falcon billykater
+- FO (abas-ERP) Tan-Vinh Nguyen
+- FormulaOne Juro Bystricky
+- Fortran Cedric Arrabie
+- FreeBasic Roberto Rossi
+- FreeSWITCH James Rose
+- GADV 4CS Jason Curl
+- GAMBAS Jesus Guardon
+- Genie Nicolas Joseph
+- Gettext Milian Wolff
+- glSlang Benny Baumann
+- GML José Jorge Enríquez Rodríguez
+- GNU make Neil Bird
+- Gnuplot Milian Wolff
+- Go Markus Jarderot
+- Groovy Ivan F. Villanueva B.
+- GwBasic José Gabriel Moya Yangüela
+- Haskell Dagit
+- Haxe Andy Li, John Liao
+- HicEst Georg Petrich
+- HQ9+ Benny Baumann
+- HTML5 Robert Lidberg
+- Icon Matt Oates
+- Ini Deguix
+- Inno Thomas Klinger
+- INTERCAL Benny Baumann
+- J Ric Sherlock
+- Java 5 Clemens Bruckmann
+- Javascript Ben Keen
+- jQuery Rob Loach
+- KiXtart Riley McArdle
+- KLone C Mickael Auger
+- KLone C++ Mickael Auger
+- LaTeX Matthais Pospiech
+- LDIF Bruno Harbulot
+- Liberty BASIC Chris Iverson
+- Lisp Roberto Rossi
+- LLVM Azriel Fasten
+- Locomotive Basic Nacho Cabanes
+- Logtalk Paulo Moura
+- LOLcode Benny Baumann
+- LScript Beau McGuigan
+- LSL2 William Fry
+- Lua Roberto Rossi
+- m86k Benny Baumann
+- MagikSF Sjoerd van Leent
+- MapBasic Tomasz Berus
+- mIRC Alberto de Areba Sánchez
+- Modula 2 Benjamin Kowarsch
+- Modula-3 Martin Bishop
+- Motorola 6502 ASM Warren Willmey
+- Motorola 68k ASM Warren Willmey
+- MPASM Bakalex
+- MXML David Spurr
+- MySQL Carl Fürstenberg, Marjolein Katsma
+- Nagios Albéric de Pertat
+- NewLisp cormullion
+- NSIS Tux, Deguix
+- Oberon-2 Mike Mol
+- Objeck Progr. Lang. Randy Hollines
+- Objective C M. Uli Kusterer
+- Ocaml Flaie
+- Ocaml-brief Flaie
+- Octave Carnë Draug, Juan Pablo Carbajal
+- OpenBSD Packet Filter David Berard
+- OpenOffice.org BASIC Roberto Rossi
+- Oracle 8 Guy Wicks
+- Oracle 11i Simon Redhead
+- Oxygene (Delphi Prism) Carlo Kok
+- Oz Wolfgang Meyer
+- ParaSail sttaft
+- PARI/GP Charles R Greathouse IV
+- Pascal Tux
+- PCRE Benny Baumann
+- Perl Andreas Gohr, Ben Keen
+- Perl6 Kodi Arfer
+- PIC16xxx assembler Phil Mattison
+- Pike Rick E.
+- Pixel Bender Richard Olsson
+- PL/I Robert Prins
+- PL/SQL Victor Engmark
+- PostgreSQL Christophe Chauvet
+- POV-Ray Carl Fürstenberg
+- PowerBuilder Doug Porter
+- PowerShell Frode Aarebrot
+- ProFTPd Benny Baumann
+- Progress Marco Aurelio de Pasqual
+- Prolog Benny Baumann
+- Property Files Edy Hinzen
+- ProvideX Jeff Wilder
+- PureBasic Gustavo Julio Fiorenza
+- Python Roberto Rossi
+- Python for S60 Sohan Basak
+- PyCon Benny Baumann
+- q/kdb+ Ian Roddis
+- R / S+ Ron Fredericks, Fernando H.F.P. da Rosa
+- Rails Moises Deniz
+- Rebol Lecanu Guillaume
+- Reg SmokingRope
+- Rexx Jon Wolfers
+- Robots Christian Lescuyer
+- RPM Specification File Paul Grinberg
+- Ruby Amit Gupta, Moises Deniz
+- SAS Galen Johnson
+- Scheme Jon Raphaelson
+- SciLab Christophe David
+- SDLBasic Roberto Rossi
+- Smalltalk Bananeweizen
+- Smarty Alan Juden
+- SPARK Phil Thornley
+- SPARQL Karima Rafes
+- StoneScript Archimmersion
+- SystemVerilog Sean O'Boyle
+- TCL Reid van Melle
+- TeraTerm Boris Maisuradze
+- Text SmokingRope
+- thinBasic Eros Olmi
+- T-SQL Duncan Lock
+- TypoScript Jan-Philipp Halle
+- Unicon Matt Oates
+- Uno IDL Cedric Bosdonnat
+- UnrealScript pospi
+- UPC Viraj Sinha
+- Urbi Alexandre Morgand
+- Vala Nicolas Joseph
+- VB Roberto Rossi
+- VB.NET Alan Juden
+- Vedit Pauli Lindgren
+- Verilog Günter Dannoritzer
+- VHDL Alexander 'E-Razor' Krause, Kevin Thibedeau
+- VIM Script Swaroop C H
+- Visual FoxPro Roberto Armellin
+- Visual Prolog Thomas Linder Puls
+- Whitespace Benny Baumann
+- Whois \ RPSL format Benny Baumann
+- Winbatch Craig Storey
+- X++ Simon Butcher
+- XBasic José Gabriel Moya Yangüela
+- Xorg config Milian Wolff
+- YAML Josh Ventura
+- Z80 Assembler Benny Baumann
+- ZXBasic Jose Rodriguez
+
+Do you want your name in here? Help me out! Make a language file, or suggest a new
+feature, or make a plugin for GeSHi for some other software, then tell me about it! \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/TODO b/extensions/SyntaxHighlight_GeSHi/geshi/docs/TODO
new file mode 100644
index 00000000..d849261c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/TODO
@@ -0,0 +1,71 @@
+ TODO - List of things to do as of 2005/01/29
+
+Suggestions for things to add are welcome, if you have a feature request you
+can either post it to the forums:
+
+http://qbnz.com/highlighter/forum.php
+
+Or to the feature request tracker:
+
+http://sourceforge.net/tracker/?group_id=114997&atid=670234
+
+
+ TODO for version 1.0.8.x
+
+- Rework the load_from_file method and the one for getting a file extension,
+ as documented in the source.
+- use analogous vars to $next_comment_regexp_pos for more GeSHi structures,
+ should reduce number of functions called and hence improve performance
+- make a set of default colours which can be used in the language files.
+ this way we can give languages a uniform look and maybe even add "themes"
+- Get better coverage in our coderepo
+- README / INSTALL / ... file for phpdoc integration => take geshi-doc.*?
+- rework HARDQUOTE + styles, currently this is a bit of a mess imo (milian)
+- Allow per-keywordgroup AutoCaps/NoCaps
+- Complete API to support latest features
+ set_number_style ($key missing)
+ set_string_style ($key missing)
+ set_case_keywords (support for per_keywordgroup AutoCaps)
+
+
+ TODO for version 1.2.0
+
+- Rewrite engine to use remove/replace method (will hopefully almost
+ eliminate the need for regular expressions except for numbers/methods
+ etc). This will also assist for making different output formats [DONE]
+- "Intelligent" output format - eg if the user doesn't want lines to
+ wrap and wants line numbers don't use <ol>, use the <table> method
+ instead. (This saves on output)
+- Clear split between "public" and "private" methods [DONE]
+- PHP5 version
+- "Themes" for styles - basically pre-made stylesheets that can be used
+ to highlight code of any language in a similar manner [DONE]
+- "Dialects" for languages - eg php4, php5. One master language definition
+ file, and a bunch of "specialised" dialect files for each language
+ Ability to specify a "specialised" dialect as default? [DONE]
+- Look at load/memory usage and try to reduce
+- Make tabs into tab-stops like a normal editor [DONE]
+- Ability to add more than one multiline comment or string [DONE]
+- Ability to specify that strings cannot be multiline [DONE]
+- Create a "wrapper" class for ultra-easy use
+- Code written in a style that conforms to a phpdoc utility [DONE, PEAR]
+- Dig functions/methods out of code and where they are called make an internal
+ link back to their definition
+
+
+ TODO for version 2.0.0
+
+- Support for multiple output formats (XHTML, XML, PDF, RTF etc) [DONE IN 1.2]
+- Support for auto-indent/code "beautifing"
+- Option for "Lite" highlighting - aims for speed and low server load
+- "Intelligent" highlighting inside comments, and ability to highlight
+ source in multiple languages at once (eg PHP+HTML) [DONE IN 1.2]
+- Perhaps a script on the GeSHi site that would map urls to appropriate
+ definitions and relocate the user? (eg, java documentation is
+ structured in such a way that urls are not able to be used with GeSHi.
+ Instead the URL could become:
+ http://qbnz.com/highlighter/redirect.php?lang=java&kw=KeyWord
+ and that script would redirect to the correct location.
+ [BETTER FIX IN 1.2]
+
+ $Id: TODO 1725 2008-08-08 11:56:36Z benbe $
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/__filesource/fsource_geshi_core_geshi.php.html b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/__filesource/fsource_geshi_core_geshi.php.html
new file mode 100644
index 00000000..3d799821
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/__filesource/fsource_geshi_core_geshi.php.html
@@ -0,0 +1,4616 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <!-- template designed by Marco Von Ballmoos -->
+ <title>File Source for geshi.php</title>
+ <link rel="stylesheet" href="../media/stylesheet.css" />
+ <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
+ </head>
+ <body>
+ <h1>Source for file geshi.php</h1>
+<p>Documentation is available at <a href="../geshi/core/_geshi.php.html">geshi.php</a></p>
+<div class="src-code">
+<div class="src-code"><ol><li><div class="src-line"><a name="a1"></a><span class="src-php">&lt;?php</span></div></li>
+<li><div class="src-line"><a name="a2"></a><span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a3"></a><span class="src-doc">&nbsp;*&nbsp;GeSHi&nbsp;-&nbsp;Generic&nbsp;Syntax&nbsp;Highlighter</span></div></li>
+<li><div class="src-line"><a name="a4"></a><span class="src-doc">&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a5"></a><span class="src-doc">&nbsp;*&nbsp;The&nbsp;GeSHi&nbsp;class&nbsp;for&nbsp;Generic&nbsp;Syntax&nbsp;Highlighting.&nbsp;Please&nbsp;refer&nbsp;to&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a6"></a><span class="src-doc">&nbsp;*&nbsp;documentation&nbsp;at&nbsp;http://qbnz.com/highlighter/documentation.php&nbsp;for&nbsp;more</span></div></li>
+<li><div class="src-line"><a name="a7"></a><span class="src-doc">&nbsp;*&nbsp;information&nbsp;about&nbsp;how&nbsp;to&nbsp;use&nbsp;this&nbsp;class.</span></div></li>
+<li><div class="src-line"><a name="a8"></a><span class="src-doc">&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a9"></a><span class="src-doc">&nbsp;*&nbsp;For&nbsp;changes,&nbsp;release&nbsp;notes,&nbsp;TODOs&nbsp;etc,&nbsp;see&nbsp;the&nbsp;relevant&nbsp;files&nbsp;in&nbsp;the&nbsp;docs/</span></div></li>
+<li><div class="src-line"><a name="a10"></a><span class="src-doc">&nbsp;*&nbsp;directory.</span></div></li>
+<li><div class="src-line"><a name="a11"></a><span class="src-doc">&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a12"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;&nbsp;This&nbsp;file&nbsp;is&nbsp;part&nbsp;of&nbsp;GeSHi.</span></div></li>
+<li><div class="src-line"><a name="a13"></a><span class="src-doc">&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a14"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;GeSHi&nbsp;is&nbsp;free&nbsp;software;&nbsp;you&nbsp;can&nbsp;redistribute&nbsp;it&nbsp;and/or&nbsp;modify</span></div></li>
+<li><div class="src-line"><a name="a15"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;it&nbsp;under&nbsp;the&nbsp;terms&nbsp;of&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License&nbsp;as&nbsp;published&nbsp;by</span></div></li>
+<li><div class="src-line"><a name="a16"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;the&nbsp;Free&nbsp;Software&nbsp;Foundation;&nbsp;either&nbsp;version&nbsp;2&nbsp;of&nbsp;the&nbsp;License,&nbsp;or</span></div></li>
+<li><div class="src-line"><a name="a17"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;(at&nbsp;your&nbsp;option)&nbsp;any&nbsp;later&nbsp;version.</span></div></li>
+<li><div class="src-line"><a name="a18"></a><span class="src-doc">&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a19"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;GeSHi&nbsp;is&nbsp;distributed&nbsp;in&nbsp;the&nbsp;hope&nbsp;that&nbsp;it&nbsp;will&nbsp;be&nbsp;useful,</span></div></li>
+<li><div class="src-line"><a name="a20"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;but&nbsp;WITHOUT&nbsp;ANY&nbsp;WARRANTY;&nbsp;without&nbsp;even&nbsp;the&nbsp;implied&nbsp;warranty&nbsp;of</span></div></li>
+<li><div class="src-line"><a name="a21"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;MERCHANTABILITY&nbsp;or&nbsp;FITNESS&nbsp;FOR&nbsp;A&nbsp;PARTICULAR&nbsp;PURPOSE.&nbsp;&nbsp;See&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a22"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License&nbsp;for&nbsp;more&nbsp;details.</span></div></li>
+<li><div class="src-line"><a name="a23"></a><span class="src-doc">&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a24"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;You&nbsp;should&nbsp;have&nbsp;received&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License</span></div></li>
+<li><div class="src-line"><a name="a25"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;along&nbsp;with&nbsp;GeSHi;&nbsp;if&nbsp;not,&nbsp;write&nbsp;to&nbsp;the&nbsp;Free&nbsp;Software</span></div></li>
+<li><div class="src-line"><a name="a26"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;Foundation,&nbsp;Inc.,&nbsp;59&nbsp;Temple&nbsp;Place,&nbsp;Suite&nbsp;330,&nbsp;Boston,&nbsp;MA&nbsp;&nbsp;02111-1307&nbsp;&nbsp;USA</span></div></li>
+<li><div class="src-line"><a name="a27"></a><span class="src-doc">&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a28"></a><span class="src-doc">&nbsp;*&nbsp;</span><span class="src-doc-coretag">@package</span><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;geshi</span></div></li>
+<li><div class="src-line"><a name="a29"></a><span class="src-doc">&nbsp;*&nbsp;</span><span class="src-doc-coretag">@subpackage</span><span class="src-doc">&nbsp;core</span></div></li>
+<li><div class="src-line"><a name="a30"></a><span class="src-doc">&nbsp;*&nbsp;</span><span class="src-doc-coretag">@author</span><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Nigel&nbsp;McNie&nbsp;&lt;nigel@geshi.org&gt;,&nbsp;Benny&nbsp;Baumann&nbsp;&lt;BenBE@omorphia.de&gt;</span></div></li>
+<li><div class="src-line"><a name="a31"></a><span class="src-doc">&nbsp;*&nbsp;</span><span class="src-doc-coretag">@copyright</span><span class="src-doc">&nbsp;&nbsp;(C)&nbsp;2004&nbsp;-&nbsp;2007&nbsp;Nigel&nbsp;McNie,&nbsp;(C)&nbsp;2007&nbsp;-&nbsp;2008&nbsp;Benny&nbsp;Baumann</span></div></li>
+<li><div class="src-line"><a name="a32"></a><span class="src-doc">&nbsp;*&nbsp;</span><span class="src-doc-coretag">@license</span><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;http://gnu.org/copyleft/gpl.html&nbsp;GNU&nbsp;GPL</span></div></li>
+<li><div class="src-line"><a name="a33"></a><span class="src-doc">&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a34"></a><span class="src-doc">&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a35"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a36"></a><span class="src-comm">//</span></div></li>
+<li><div class="src-line"><a name="a37"></a><span class="src-comm">//&nbsp;GeSHi&nbsp;Constants</span></div></li>
+<li><div class="src-line"><a name="a38"></a><span class="src-comm">//&nbsp;You&nbsp;should&nbsp;use&nbsp;these&nbsp;constant&nbsp;names&nbsp;in&nbsp;your&nbsp;programs&nbsp;instead&nbsp;of</span></div></li>
+<li><div class="src-line"><a name="a39"></a><span class="src-comm">//&nbsp;their&nbsp;values&nbsp;-&nbsp;you&nbsp;never&nbsp;know&nbsp;when&nbsp;a&nbsp;value&nbsp;may&nbsp;change&nbsp;in&nbsp;a&nbsp;future</span></div></li>
+<li><div class="src-line"><a name="a40"></a><span class="src-comm">//&nbsp;version</span></div></li>
+<li><div class="src-line"><a name="a41"></a><span class="src-comm">//</span></div></li>
+<li><div class="src-line"><a name="a42"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a43"></a><span class="src-doc">/**&nbsp;The&nbsp;version&nbsp;of&nbsp;this&nbsp;GeSHi&nbsp;file&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a44"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_VERSION'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'1.0.8.2'</span><span class="src-sym">,</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a45"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a46"></a><span class="src-comm">//&nbsp;Define&nbsp;the&nbsp;root&nbsp;directory&nbsp;for&nbsp;the&nbsp;GeSHi&nbsp;code&nbsp;tree</span></div></li>
+<li><div class="src-line"><a name="a47"></a><span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-sym">!</span><a href="http://www.php.net/defined">defined</a><span class="src-sym">(</span><span class="src-str">'GESHI_ROOT'</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a48"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**&nbsp;The&nbsp;root&nbsp;directory&nbsp;for&nbsp;GeSHi&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a49"></a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_ROOT'</span><span class="src-sym">,&nbsp;</span><span class="src-id">dirname</span><span class="src-sym">(</span>__FILE__<span class="src-sym">)&nbsp;</span>.&nbsp;<span class="src-id">DIRECTORY_SEPARATOR</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a50"></a><span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a51"></a><span class="src-doc">/**&nbsp;The&nbsp;language&nbsp;file&nbsp;directory&nbsp;for&nbsp;GeSHi</span></div></li>
+<li><div class="src-line"><a name="a52"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;@access&nbsp;private&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a53"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_LANG_ROOT'</span><span class="src-sym">,&nbsp;</span><span class="src-id">GESHI_ROOT&nbsp;</span>.&nbsp;<span class="src-str">'geshi'&nbsp;</span>.&nbsp;<span class="src-id">DIRECTORY_SEPARATOR</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a54"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a55"></a><span class="src-comm">//&nbsp;Define&nbsp;if&nbsp;GeSHi&nbsp;should&nbsp;be&nbsp;paranoid&nbsp;about&nbsp;security</span></div></li>
+<li><div class="src-line"><a name="a56"></a><span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-sym">!</span><a href="http://www.php.net/defined">defined</a><span class="src-sym">(</span><span class="src-str">'GESHI_SECURITY_PARANOID'</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a57"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**&nbsp;Tells&nbsp;GeSHi&nbsp;to&nbsp;be&nbsp;paranoid&nbsp;about&nbsp;security&nbsp;settings&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a58"></a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_SECURITY_PARANOID'</span><span class="src-sym">,&nbsp;</span><span class="src-id">false</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a59"></a><span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a60"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a61"></a><span class="src-comm">//&nbsp;Line&nbsp;numbers&nbsp;-&nbsp;use&nbsp;with&nbsp;enable_line_numbers()</span></div></li>
+<li><div class="src-line"><a name="a62"></a><span class="src-doc">/**&nbsp;Use&nbsp;no&nbsp;line&nbsp;numbers&nbsp;when&nbsp;building&nbsp;the&nbsp;result&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a63"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NO_LINE_NUMBERS'</span><span class="src-sym">,&nbsp;</span><span class="src-num">0</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a64"></a><span class="src-doc">/**&nbsp;Use&nbsp;normal&nbsp;line&nbsp;numbers&nbsp;when&nbsp;building&nbsp;the&nbsp;result&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a65"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NORMAL_LINE_NUMBERS'</span><span class="src-sym">,&nbsp;</span><span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a66"></a><span class="src-doc">/**&nbsp;Use&nbsp;fancy&nbsp;line&nbsp;numbers&nbsp;when&nbsp;building&nbsp;the&nbsp;result&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a67"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_FANCY_LINE_NUMBERS'</span><span class="src-sym">,&nbsp;</span><span class="src-num">2</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a68"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a69"></a><span class="src-comm">//&nbsp;Container&nbsp;HTML&nbsp;type</span></div></li>
+<li><div class="src-line"><a name="a70"></a><span class="src-doc">/**&nbsp;Use&nbsp;nothing&nbsp;to&nbsp;surround&nbsp;the&nbsp;source&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a71"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_HEADER_NONE'</span><span class="src-sym">,&nbsp;</span><span class="src-num">0</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a72"></a><span class="src-doc">/**&nbsp;Use&nbsp;a&nbsp;&quot;div&quot;&nbsp;to&nbsp;surround&nbsp;the&nbsp;source&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a73"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_HEADER_DIV'</span><span class="src-sym">,&nbsp;</span><span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a74"></a><span class="src-doc">/**&nbsp;Use&nbsp;a&nbsp;&quot;pre&quot;&nbsp;to&nbsp;surround&nbsp;the&nbsp;source&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a75"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_HEADER_PRE'</span><span class="src-sym">,&nbsp;</span><span class="src-num">2</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a76"></a><span class="src-doc">/**&nbsp;Use&nbsp;a&nbsp;pre&nbsp;to&nbsp;wrap&nbsp;lines&nbsp;when&nbsp;line&nbsp;numbers&nbsp;are&nbsp;enabled&nbsp;or&nbsp;to&nbsp;wrap&nbsp;the&nbsp;whole&nbsp;code.&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a77"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_HEADER_PRE_VALID'</span><span class="src-sym">,&nbsp;</span><span class="src-num">3</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a78"></a><span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a79"></a><span class="src-doc">&nbsp;*&nbsp;Use&nbsp;a&nbsp;&quot;table&quot;&nbsp;to&nbsp;surround&nbsp;the&nbsp;source:</span></div></li>
+<li><div class="src-line"><a name="a80"></a><span class="src-doc">&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a81"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;&lt;table&gt;</span></div></li>
+<li><div class="src-line"><a name="a82"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&lt;thead&gt;&lt;tr&gt;&lt;td&nbsp;colspan=&quot;2&quot;&gt;$header&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;</span></div></li>
+<li><div class="src-line"><a name="a83"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;$linenumbers&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;$code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;</span></div></li>
+<li><div class="src-line"><a name="a84"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&lt;tfooter&gt;&lt;tr&gt;&lt;td&nbsp;colspan=&quot;2&quot;&gt;$footer&lt;/td&gt;&lt;/tr&gt;&lt;/tfoot&gt;</span></div></li>
+<li><div class="src-line"><a name="a85"></a><span class="src-doc">&nbsp;*&nbsp;&nbsp;&lt;/table&gt;</span></div></li>
+<li><div class="src-line"><a name="a86"></a><span class="src-doc">&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a87"></a><span class="src-doc">&nbsp;*&nbsp;this&nbsp;is&nbsp;essentially&nbsp;only&nbsp;a&nbsp;workaround&nbsp;for&nbsp;Firefox,&nbsp;see&nbsp;sf#1651996&nbsp;or&nbsp;take&nbsp;a&nbsp;look&nbsp;at</span></div></li>
+<li><div class="src-line"><a name="a88"></a><span class="src-doc">&nbsp;*&nbsp;https://bugzilla.mozilla.org/show_bug.cgi?id=365805</span></div></li>
+<li><div class="src-line"><a name="a89"></a><span class="src-doc">&nbsp;*&nbsp;</span><span class="src-doc-tag">@note</span><span class="src-doc">&nbsp;when&nbsp;linenumbers&nbsp;are&nbsp;disabled&nbsp;this&nbsp;is&nbsp;essentially&nbsp;the&nbsp;same&nbsp;as&nbsp;GESHI_HEADER_PRE</span></div></li>
+<li><div class="src-line"><a name="a90"></a><span class="src-doc">&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a91"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_HEADER_PRE_TABLE'</span><span class="src-sym">,&nbsp;</span><span class="src-num">4</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a92"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a93"></a><span class="src-comm">//&nbsp;Capatalisation&nbsp;constants</span></div></li>
+<li><div class="src-line"><a name="a94"></a><span class="src-doc">/**&nbsp;Lowercase&nbsp;keywords&nbsp;found&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a95"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_CAPS_NO_CHANGE'</span><span class="src-sym">,&nbsp;</span><span class="src-num">0</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a96"></a><span class="src-doc">/**&nbsp;Uppercase&nbsp;keywords&nbsp;found&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a97"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_CAPS_UPPER'</span><span class="src-sym">,&nbsp;</span><span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a98"></a><span class="src-doc">/**&nbsp;Leave&nbsp;keywords&nbsp;found&nbsp;as&nbsp;the&nbsp;case&nbsp;that&nbsp;they&nbsp;are&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a99"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_CAPS_LOWER'</span><span class="src-sym">,&nbsp;</span><span class="src-num">2</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a100"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a101"></a><span class="src-comm">//&nbsp;Link&nbsp;style&nbsp;constants</span></div></li>
+<li><div class="src-line"><a name="a102"></a><span class="src-doc">/**&nbsp;Links&nbsp;in&nbsp;the&nbsp;source&nbsp;in&nbsp;the&nbsp;:link&nbsp;state&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a103"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_LINK'</span><span class="src-sym">,&nbsp;</span><span class="src-num">0</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a104"></a><span class="src-doc">/**&nbsp;Links&nbsp;in&nbsp;the&nbsp;source&nbsp;in&nbsp;the&nbsp;:hover&nbsp;state&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a105"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_HOVER'</span><span class="src-sym">,&nbsp;</span><span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a106"></a><span class="src-doc">/**&nbsp;Links&nbsp;in&nbsp;the&nbsp;source&nbsp;in&nbsp;the&nbsp;:active&nbsp;state&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a107"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_ACTIVE'</span><span class="src-sym">,&nbsp;</span><span class="src-num">2</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a108"></a><span class="src-doc">/**&nbsp;Links&nbsp;in&nbsp;the&nbsp;source&nbsp;in&nbsp;the&nbsp;:visited&nbsp;state&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a109"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_VISITED'</span><span class="src-sym">,&nbsp;</span><span class="src-num">3</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a110"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a111"></a><span class="src-comm">//&nbsp;Important&nbsp;string&nbsp;starter/finisher</span></div></li>
+<li><div class="src-line"><a name="a112"></a><span class="src-comm">//&nbsp;Note&nbsp;that&nbsp;if&nbsp;you&nbsp;change&nbsp;these,&nbsp;they&nbsp;should&nbsp;be&nbsp;as-is:&nbsp;i.e.,&nbsp;don't</span></div></li>
+<li><div class="src-line"><a name="a113"></a><span class="src-comm">//&nbsp;write&nbsp;them&nbsp;as&nbsp;if&nbsp;they&nbsp;had&nbsp;been&nbsp;run&nbsp;through&nbsp;htmlentities()</span></div></li>
+<li><div class="src-line"><a name="a114"></a><span class="src-doc">/**&nbsp;The&nbsp;starter&nbsp;for&nbsp;important&nbsp;parts&nbsp;of&nbsp;the&nbsp;source&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a115"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_START_IMPORTANT'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'&lt;BEGIN&nbsp;GeSHi&gt;'</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a116"></a><span class="src-doc">/**&nbsp;The&nbsp;ender&nbsp;for&nbsp;important&nbsp;parts&nbsp;of&nbsp;the&nbsp;source&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a117"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_END_IMPORTANT'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'&lt;END&nbsp;GeSHi&gt;'</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a118"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a119"></a><span class="src-comm">/**#@+</span></div></li>
+<li><div class="src-line"><a name="a120"></a><span class="src-comm">&nbsp;*&nbsp;&nbsp;@access&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a121"></a><span class="src-comm">&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a122"></a><span class="src-comm">//&nbsp;When&nbsp;strict&nbsp;mode&nbsp;applies&nbsp;for&nbsp;a&nbsp;language</span></div></li>
+<li><div class="src-line"><a name="a123"></a><span class="src-doc">/**&nbsp;Strict&nbsp;mode&nbsp;never&nbsp;applies&nbsp;(this&nbsp;is&nbsp;the&nbsp;most&nbsp;common)&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a124"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NEVER'</span><span class="src-sym">,&nbsp;</span><span class="src-num">0</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a125"></a><span class="src-doc">/**&nbsp;Strict&nbsp;mode&nbsp;*might*&nbsp;apply,&nbsp;and&nbsp;can&nbsp;be&nbsp;enabled&nbsp;or</span></div></li>
+<li><div class="src-line"><a name="a126"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;disabled&nbsp;by&nbsp;</span><span class="src-doc-inlinetag">{@link&nbsp;GeSHi-&gt;enable_strict_mode()}</span><span class="src-doc">&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a127"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_MAYBE'</span><span class="src-sym">,&nbsp;</span><span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a128"></a><span class="src-doc">/**&nbsp;Strict&nbsp;mode&nbsp;always&nbsp;applies&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a129"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_ALWAYS'</span><span class="src-sym">,&nbsp;</span><span class="src-num">2</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a130"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a131"></a><span class="src-comm">//&nbsp;Advanced&nbsp;regexp&nbsp;handling&nbsp;constants,&nbsp;used&nbsp;in&nbsp;language&nbsp;files</span></div></li>
+<li><div class="src-line"><a name="a132"></a><span class="src-doc">/**&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;regex&nbsp;array&nbsp;defining&nbsp;what&nbsp;to&nbsp;search&nbsp;for&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a133"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_SEARCH'</span><span class="src-sym">,&nbsp;</span><span class="src-num">0</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a134"></a><span class="src-doc">/**&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;regex&nbsp;array&nbsp;defining&nbsp;what&nbsp;bracket&nbsp;group&nbsp;in&nbsp;a</span></div></li>
+<li><div class="src-line"><a name="a135"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;matched&nbsp;search&nbsp;to&nbsp;use&nbsp;as&nbsp;a&nbsp;replacement&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a136"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_REPLACE'</span><span class="src-sym">,&nbsp;</span><span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a137"></a><span class="src-doc">/**&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;regex&nbsp;array&nbsp;defining&nbsp;any&nbsp;modifiers&nbsp;to&nbsp;the&nbsp;regular&nbsp;expression&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a138"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_MODIFIERS'</span><span class="src-sym">,&nbsp;</span><span class="src-num">2</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a139"></a><span class="src-doc">/**&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;regex&nbsp;array&nbsp;defining&nbsp;what&nbsp;bracket&nbsp;group&nbsp;in&nbsp;a</span></div></li>
+<li><div class="src-line"><a name="a140"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;matched&nbsp;search&nbsp;to&nbsp;put&nbsp;before&nbsp;the&nbsp;replacement&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a141"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_BEFORE'</span><span class="src-sym">,&nbsp;</span><span class="src-num">3</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a142"></a><span class="src-doc">/**&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;regex&nbsp;array&nbsp;defining&nbsp;what&nbsp;bracket&nbsp;group&nbsp;in&nbsp;a</span></div></li>
+<li><div class="src-line"><a name="a143"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;matched&nbsp;search&nbsp;to&nbsp;put&nbsp;after&nbsp;the&nbsp;replacement&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a144"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_AFTER'</span><span class="src-sym">,&nbsp;</span><span class="src-num">4</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a145"></a><span class="src-doc">/**&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;regex&nbsp;array&nbsp;defining&nbsp;a&nbsp;custom&nbsp;keyword&nbsp;to&nbsp;use</span></div></li>
+<li><div class="src-line"><a name="a146"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;this&nbsp;regexp's&nbsp;html&nbsp;tag&nbsp;class&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a147"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_CLASS'</span><span class="src-sym">,&nbsp;</span><span class="src-num">5</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a148"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a149"></a><span class="src-doc">/**&nbsp;Used&nbsp;in&nbsp;language&nbsp;files&nbsp;to&nbsp;mark&nbsp;comments&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a150"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_COMMENTS'</span><span class="src-sym">,&nbsp;</span><span class="src-num">0</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a151"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a152"></a><span class="src-doc">/**&nbsp;Used&nbsp;to&nbsp;work&nbsp;around&nbsp;missing&nbsp;PHP&nbsp;features&nbsp;**/</span></div></li>
+<li><div class="src-line"><a name="a153"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_PHP_PRE_433'</span><span class="src-sym">,&nbsp;</span><span class="src-sym">!</span><span class="src-sym">(</span><span class="src-id">version_compare</span><span class="src-sym">(</span><span class="src-id">PHP_VERSION</span><span class="src-sym">,&nbsp;</span><span class="src-str">'4.3.3'</span><span class="src-sym">)&nbsp;</span>===&nbsp;<span class="src-num">1</span><span class="src-sym">))</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a154"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a155"></a><span class="src-doc">/**&nbsp;make&nbsp;sure&nbsp;we&nbsp;can&nbsp;call&nbsp;stripos&nbsp;**/</span></div></li>
+<li><div class="src-line"><a name="a156"></a><span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-sym">!</span><a href="http://www.php.net/function_exists">function_exists</a><span class="src-sym">(</span><span class="src-str">'stripos'</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a157"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;the&nbsp;offset&nbsp;param&nbsp;of&nbsp;preg_match&nbsp;is&nbsp;not&nbsp;supported&nbsp;below&nbsp;PHP&nbsp;4.3.3</span></div></li>
+<li><div class="src-line"><a name="a158"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-id">GESHI_PHP_PRE_433</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a159"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a160"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@ignore</span></div></li>
+<li><div class="src-line"><a name="a161"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a162"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function&nbsp;</span><a href="http://www.php.net/stripos">stripos</a><span class="src-sym">(</span><span class="src-var">$haystack</span><span class="src-sym">,&nbsp;</span><span class="src-var">$needle</span><span class="src-sym">,&nbsp;</span><span class="src-var">$offset&nbsp;</span>=&nbsp;<span class="src-id">null</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a163"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-sym">!</span><a href="http://www.php.net/is_null">is_null</a><span class="src-sym">(</span><span class="src-var">$offset</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a164"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$haystack&nbsp;</span>=&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$haystack</span><span class="src-sym">,&nbsp;</span><span class="src-var">$offset</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a165"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a166"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><a href="http://www.php.net/preg_match">preg_match</a><span class="src-sym">(</span><span class="src-str">'/'</span>.&nbsp;<a href="http://www.php.net/preg_quote">preg_quote</a><span class="src-sym">(</span><span class="src-var">$needle</span><span class="src-sym">,&nbsp;</span><span class="src-str">'/'</span><span class="src-sym">)&nbsp;</span>.&nbsp;<span class="src-str">'/'</span><span class="src-sym">,&nbsp;</span><span class="src-var">$haystack</span><span class="src-sym">,&nbsp;</span><span class="src-var">$match</span><span class="src-sym">,&nbsp;</span><span class="src-id">PREG_OFFSET_CAPTURE</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a167"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return&nbsp;</span><span class="src-var">$match</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a168"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a169"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return&nbsp;</span><span class="src-id">false</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a170"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a171"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a172"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">else&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a173"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a174"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@ignore</span></div></li>
+<li><div class="src-line"><a name="a175"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a176"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function&nbsp;</span><a href="http://www.php.net/stripos">stripos</a><span class="src-sym">(</span><span class="src-var">$haystack</span><span class="src-sym">,&nbsp;</span><span class="src-var">$needle</span><span class="src-sym">,&nbsp;</span><span class="src-var">$offset&nbsp;</span>=&nbsp;<span class="src-id">null</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a177"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><a href="http://www.php.net/preg_match">preg_match</a><span class="src-sym">(</span><span class="src-str">'/'</span>.&nbsp;<a href="http://www.php.net/preg_quote">preg_quote</a><span class="src-sym">(</span><span class="src-var">$needle</span><span class="src-sym">,&nbsp;</span><span class="src-str">'/'</span><span class="src-sym">)&nbsp;</span>.&nbsp;<span class="src-str">'/'</span><span class="src-sym">,&nbsp;</span><span class="src-var">$haystack</span><span class="src-sym">,&nbsp;</span><span class="src-var">$match</span><span class="src-sym">,&nbsp;</span><span class="src-id">PREG_OFFSET_CAPTURE</span><span class="src-sym">,&nbsp;</span><span class="src-var">$offset</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a178"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return&nbsp;</span><span class="src-var">$match</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a179"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a180"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return&nbsp;</span><span class="src-id">false</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a181"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a182"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a183"></a><span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a184"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a185"></a><span class="src-doc">/**&nbsp;some&nbsp;old&nbsp;PHP&nbsp;/&nbsp;PCRE&nbsp;subpatterns&nbsp;only&nbsp;support&nbsp;up&nbsp;to&nbsp;xxx&nbsp;subpatterns&nbsp;in</span></div></li>
+<li><div class="src-line"><a name="a186"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;regular&nbsp;expressions.&nbsp;Set&nbsp;this&nbsp;to&nbsp;false&nbsp;if&nbsp;your&nbsp;PCRE&nbsp;lib&nbsp;is&nbsp;up&nbsp;to&nbsp;date</span></div></li>
+<li><div class="src-line"><a name="a187"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;@see&nbsp;GeSHi-&gt;optimize_regexp_list()</span></div></li>
+<li><div class="src-line"><a name="a188"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;**/</span></div></li>
+<li><div class="src-line"><a name="a188"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a189"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_MAX_PCRE_SUBPATTERNS'</span><span class="src-sym">,&nbsp;</span><span class="src-num">500</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a190"></a><span class="src-doc">/**&nbsp;it's&nbsp;also&nbsp;important&nbsp;not&nbsp;to&nbsp;generate&nbsp;too&nbsp;long&nbsp;regular&nbsp;expressions</span></div></li>
+<li><div class="src-line"><a name="a191"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;be&nbsp;generous&nbsp;here...&nbsp;but&nbsp;keep&nbsp;in&nbsp;mind,&nbsp;that&nbsp;when&nbsp;reaching&nbsp;this&nbsp;limit&nbsp;we</span></div></li>
+<li><div class="src-line"><a name="a192"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;still&nbsp;have&nbsp;to&nbsp;close&nbsp;open&nbsp;patterns.&nbsp;12k&nbsp;should&nbsp;do&nbsp;just&nbsp;fine&nbsp;on&nbsp;a&nbsp;16k&nbsp;limit.</span></div></li>
+<li><div class="src-line"><a name="a193"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;@see&nbsp;GeSHi-&gt;optimize_regexp_list()</span></div></li>
+<li><div class="src-line"><a name="a194"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;**/</span></div></li>
+<li><div class="src-line"><a name="a194"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a195"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_MAX_PCRE_LENGTH'</span><span class="src-sym">,&nbsp;</span><span class="src-num">12288</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a196"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a197"></a><span class="src-comm">//Number&nbsp;format&nbsp;specification</span></div></li>
+<li><div class="src-line"><a name="a198"></a><span class="src-doc">/**&nbsp;Basic&nbsp;number&nbsp;format&nbsp;for&nbsp;integers&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a199"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NUMBER_INT_BASIC'</span><span class="src-sym">,&nbsp;</span><span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-comm">//Default&nbsp;integers&nbsp;\d+</span></div></li>
+<li><div class="src-line"><a name="a200"></a><span class="src-doc">/**&nbsp;Enhanced&nbsp;number&nbsp;format&nbsp;for&nbsp;integers&nbsp;like&nbsp;seen&nbsp;in&nbsp;C&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a201"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NUMBER_INT_CSTYLE'</span><span class="src-sym">,&nbsp;</span><span class="src-num">2</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-comm">//Default&nbsp;C-Style&nbsp;\d+[lL]?</span></div></li>
+<li><div class="src-line"><a name="a202"></a><span class="src-doc">/**&nbsp;Number&nbsp;format&nbsp;to&nbsp;highlight&nbsp;binary&nbsp;numbers&nbsp;with&nbsp;a&nbsp;suffix&nbsp;&quot;b&quot;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a203"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NUMBER_BIN_SUFFIX'</span><span class="src-sym">,&nbsp;</span><span class="src-num">16</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-comm">//[01]+[bB]</span></div></li>
+<li><div class="src-line"><a name="a204"></a><span class="src-doc">/**&nbsp;Number&nbsp;format&nbsp;to&nbsp;highlight&nbsp;binary&nbsp;numbers&nbsp;with&nbsp;a&nbsp;prefix&nbsp;%&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a205"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NUMBER_BIN_PREFIX_PERCENT'</span><span class="src-sym">,&nbsp;</span><span class="src-num">32</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;&nbsp;&nbsp;</span><span class="src-comm">//%[01]+</span></div></li>
+<li><div class="src-line"><a name="a206"></a><span class="src-doc">/**&nbsp;Number&nbsp;format&nbsp;to&nbsp;highlight&nbsp;binary&nbsp;numbers&nbsp;with&nbsp;a&nbsp;prefix&nbsp;0b&nbsp;(C)&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a207"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NUMBER_BIN_PREFIX_0B'</span><span class="src-sym">,&nbsp;</span><span class="src-num">64</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-comm">//0b[01]+</span></div></li>
+<li><div class="src-line"><a name="a208"></a><span class="src-doc">/**&nbsp;Number&nbsp;format&nbsp;to&nbsp;highlight&nbsp;octal&nbsp;numbers&nbsp;with&nbsp;a&nbsp;leading&nbsp;zero&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a209"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NUMBER_OCT_PREFIX'</span><span class="src-sym">,&nbsp;</span><span class="src-num">256</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-comm">//0[0-7]+</span></div></li>
+<li><div class="src-line"><a name="a210"></a><span class="src-doc">/**&nbsp;Number&nbsp;format&nbsp;to&nbsp;highlight&nbsp;octal&nbsp;numbers&nbsp;with&nbsp;a&nbsp;suffix&nbsp;of&nbsp;o&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a211"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NUMBER_OCT_SUFFIX'</span><span class="src-sym">,&nbsp;</span><span class="src-num">512</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-comm">//[0-7]+[oO]</span></div></li>
+<li><div class="src-line"><a name="a212"></a><span class="src-doc">/**&nbsp;Number&nbsp;format&nbsp;to&nbsp;highlight&nbsp;hex&nbsp;numbers&nbsp;with&nbsp;a&nbsp;prefix&nbsp;0x&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a213"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NUMBER_HEX_PREFIX'</span><span class="src-sym">,&nbsp;</span><span class="src-num">4096</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-comm">//0x[0-9a-fA-F]+</span></div></li>
+<li><div class="src-line"><a name="a214"></a><span class="src-doc">/**&nbsp;Number&nbsp;format&nbsp;to&nbsp;highlight&nbsp;hex&nbsp;numbers&nbsp;with&nbsp;a&nbsp;suffix&nbsp;of&nbsp;h&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a215"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NUMBER_HEX_SUFFIX'</span><span class="src-sym">,&nbsp;</span><span class="src-num">8192</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-comm">//[0-9][0-9a-fA-F]*h</span></div></li>
+<li><div class="src-line"><a name="a216"></a><span class="src-doc">/**&nbsp;Number&nbsp;format&nbsp;to&nbsp;highlight&nbsp;floating-point&nbsp;numbers&nbsp;without&nbsp;support&nbsp;for&nbsp;scientific&nbsp;notation&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a217"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NUMBER_FLT_NONSCI'</span><span class="src-sym">,&nbsp;</span><span class="src-num">65536</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-comm">//\d+\.\d+</span></div></li>
+<li><div class="src-line"><a name="a218"></a><span class="src-doc">/**&nbsp;Number&nbsp;format&nbsp;to&nbsp;highlight&nbsp;floating-point&nbsp;numbers&nbsp;without&nbsp;support&nbsp;for&nbsp;scientific&nbsp;notation&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a219"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NUMBER_FLT_NONSCI_F'</span><span class="src-sym">,&nbsp;</span><span class="src-num">131072</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-comm">//\d+(\.\d+)?f</span></div></li>
+<li><div class="src-line"><a name="a220"></a><span class="src-doc">/**&nbsp;Number&nbsp;format&nbsp;to&nbsp;highlight&nbsp;floating-point&nbsp;numbers&nbsp;with&nbsp;support&nbsp;for&nbsp;scientific&nbsp;notation&nbsp;(E)&nbsp;and&nbsp;optional&nbsp;leading&nbsp;zero&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a221"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NUMBER_FLT_SCI_SHORT'</span><span class="src-sym">,&nbsp;</span><span class="src-num">262144</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-comm">//\.\d+e\d+</span></div></li>
+<li><div class="src-line"><a name="a222"></a><span class="src-doc">/**&nbsp;Number&nbsp;format&nbsp;to&nbsp;highlight&nbsp;floating-point&nbsp;numbers&nbsp;with&nbsp;support&nbsp;for&nbsp;scientific&nbsp;notation&nbsp;(E)&nbsp;and&nbsp;required&nbsp;leading&nbsp;digit&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a223"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_NUMBER_FLT_SCI_ZERO'</span><span class="src-sym">,&nbsp;</span><span class="src-num">524288</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-comm">//\d+(\.\d+)?e\d+</span></div></li>
+<li><div class="src-line"><a name="a224"></a><span class="src-comm">//Custom&nbsp;formats&nbsp;are&nbsp;passed&nbsp;by&nbsp;RX&nbsp;array</span></div></li>
+<li><div class="src-line"><a name="a225"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a226"></a><span class="src-comm">//&nbsp;Error&nbsp;detection&nbsp;-&nbsp;use&nbsp;these&nbsp;to&nbsp;analyse&nbsp;faults</span></div></li>
+<li><div class="src-line"><a name="a227"></a><span class="src-doc">/**&nbsp;No&nbsp;sourcecode&nbsp;to&nbsp;highlight&nbsp;was&nbsp;specified</span></div></li>
+<li><div class="src-line"><a name="a228"></a><span class="src-doc">&nbsp;*&nbsp;</span><span class="src-doc-coretag">@deprecated</span></div></li>
+<li><div class="src-line"><a name="a229"></a><span class="src-doc">&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a230"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_ERROR_NO_INPUT'</span><span class="src-sym">,&nbsp;</span><span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a231"></a><span class="src-doc">/**&nbsp;The&nbsp;language&nbsp;specified&nbsp;does&nbsp;not&nbsp;exist&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a232"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_ERROR_NO_SUCH_LANG'</span><span class="src-sym">,&nbsp;</span><span class="src-num">2</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a233"></a><span class="src-doc">/**&nbsp;GeSHi&nbsp;could&nbsp;not&nbsp;open&nbsp;a&nbsp;file&nbsp;for&nbsp;reading&nbsp;(generally&nbsp;a&nbsp;language&nbsp;file)&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a234"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_ERROR_FILE_NOT_READABLE'</span><span class="src-sym">,&nbsp;</span><span class="src-num">3</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a235"></a><span class="src-doc">/**&nbsp;The&nbsp;header&nbsp;type&nbsp;passed&nbsp;to&nbsp;</span><span class="src-doc-inlinetag">{@link&nbsp;GeSHi-&gt;set_header_type()}</span><span class="src-doc">&nbsp;was&nbsp;invalid&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a236"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_ERROR_INVALID_HEADER_TYPE'</span><span class="src-sym">,&nbsp;</span><span class="src-num">4</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a237"></a><span class="src-doc">/**&nbsp;The&nbsp;line&nbsp;number&nbsp;type&nbsp;passed&nbsp;to&nbsp;</span><span class="src-doc-inlinetag">{@link&nbsp;GeSHi-&gt;enable_line_numbers()}</span><span class="src-doc">&nbsp;was&nbsp;invalid&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a238"></a><a href="http://www.php.net/define">define</a><span class="src-sym">(</span><span class="src-str">'GESHI_ERROR_INVALID_LINE_NUMBER_TYPE'</span><span class="src-sym">,&nbsp;</span><span class="src-num">5</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a239"></a><span class="src-comm">/**#@-*/</span></div></li>
+<li><div class="src-line"><a name="a240"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a241"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a242"></a><span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a243"></a><span class="src-doc">&nbsp;*&nbsp;The&nbsp;GeSHi&nbsp;Class.</span></div></li>
+<li><div class="src-line"><a name="a244"></a><span class="src-doc">&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a245"></a><span class="src-doc">&nbsp;*&nbsp;Please&nbsp;refer&nbsp;to&nbsp;the&nbsp;documentation&nbsp;for&nbsp;GeSHi&nbsp;1.0.X&nbsp;that&nbsp;is&nbsp;available</span></div></li>
+<li><div class="src-line"><a name="a246"></a><span class="src-doc">&nbsp;*&nbsp;at&nbsp;http://qbnz.com/highlighter/documentation.php&nbsp;for&nbsp;more&nbsp;information</span></div></li>
+<li><div class="src-line"><a name="a247"></a><span class="src-doc">&nbsp;*&nbsp;about&nbsp;how&nbsp;to&nbsp;use&nbsp;this&nbsp;class.</span></div></li>
+<li><div class="src-line"><a name="a248"></a><span class="src-doc">&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a249"></a><span class="src-doc">&nbsp;*&nbsp;</span><span class="src-doc-coretag">@package</span><span class="src-doc">&nbsp;&nbsp;&nbsp;geshi</span></div></li>
+<li><div class="src-line"><a name="a250"></a><span class="src-doc">&nbsp;*&nbsp;</span><span class="src-doc-coretag">@author</span><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;Nigel&nbsp;McNie&nbsp;&lt;nigel@geshi.org&gt;,&nbsp;Benny&nbsp;Baumann&nbsp;&lt;BenBE@omorphia.de&gt;</span></div></li>
+<li><div class="src-line"><a name="a251"></a><span class="src-doc">&nbsp;*&nbsp;</span><span class="src-doc-coretag">@copyright</span><span class="src-doc">&nbsp;(C)&nbsp;2004&nbsp;-&nbsp;2007&nbsp;Nigel&nbsp;McNie,&nbsp;(C)&nbsp;2007&nbsp;-&nbsp;2008&nbsp;Benny&nbsp;Baumann</span></div></li>
+<li><div class="src-line"><a name="a252"></a><span class="src-doc">&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a253"></a><span class="src-key">class&nbsp;</span><a href="../geshi/core/GeSHi.html">GeSHi</a>&nbsp;<span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a254"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">/**#@+</span></div></li>
+<li><div class="src-line"><a name="a255"></a><span class="src-comm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a256"></a><span class="src-comm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a257"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a258"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;source&nbsp;code&nbsp;to&nbsp;highlight</span></div></li>
+<li><div class="src-line"><a name="a259"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a260"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a261"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$source&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a262"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a263"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a264"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;language&nbsp;to&nbsp;use&nbsp;when&nbsp;highlighting</span></div></li>
+<li><div class="src-line"><a name="a265"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a266"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a267"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$language&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a268"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a269"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a270"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;data&nbsp;for&nbsp;the&nbsp;language&nbsp;used</span></div></li>
+<li><div class="src-line"><a name="a271"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">array&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a272"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a273"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$language_data&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a274"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a275"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a276"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;path&nbsp;to&nbsp;the&nbsp;language&nbsp;files</span></div></li>
+<li><div class="src-line"><a name="a277"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a278"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a279"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$language_path&nbsp;</span>=&nbsp;<span class="src-id">GESHI_LANG_ROOT</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a280"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a281"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a282"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;error&nbsp;message&nbsp;associated&nbsp;with&nbsp;an&nbsp;error</span></div></li>
+<li><div class="src-line"><a name="a283"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a284"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@todo</span><span class="src-doc">&nbsp;check&nbsp;err&nbsp;reporting&nbsp;works</span></div></li>
+<li><div class="src-line"><a name="a285"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a286"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$error&nbsp;</span>=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a287"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a288"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a289"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Possible&nbsp;error&nbsp;messages</span></div></li>
+<li><div class="src-line"><a name="a290"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">array&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a291"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a292"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$error_messages&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></div></li>
+<li><div class="src-line"><a name="a293"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_ERROR_NO_SUCH_LANG&nbsp;</span>=&gt;&nbsp;<span class="src-str">'GeSHi&nbsp;could&nbsp;not&nbsp;find&nbsp;the&nbsp;language&nbsp;{LANGUAGE}&nbsp;(using&nbsp;path&nbsp;{PATH})'</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a294"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_ERROR_FILE_NOT_READABLE&nbsp;</span>=&gt;&nbsp;<span class="src-str">'The&nbsp;file&nbsp;specified&nbsp;for&nbsp;load_from_file&nbsp;was&nbsp;not&nbsp;readable'</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a295"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_ERROR_INVALID_HEADER_TYPE&nbsp;</span>=&gt;&nbsp;<span class="src-str">'The&nbsp;header&nbsp;type&nbsp;specified&nbsp;is&nbsp;invalid'</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a296"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_ERROR_INVALID_LINE_NUMBER_TYPE&nbsp;</span>=&gt;&nbsp;<span class="src-str">'The&nbsp;line&nbsp;number&nbsp;type&nbsp;specified&nbsp;is&nbsp;invalid'</span></div></li>
+<li><div class="src-line"><a name="a297"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a298"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a299"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a300"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Whether&nbsp;highlighting&nbsp;is&nbsp;strict&nbsp;or&nbsp;not</span></div></li>
+<li><div class="src-line"><a name="a301"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a302"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a303"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$strict_mode&nbsp;</span>=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a304"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a305"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a306"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Whether&nbsp;to&nbsp;use&nbsp;CSS&nbsp;classes&nbsp;in&nbsp;output</span></div></li>
+<li><div class="src-line"><a name="a307"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a308"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a309"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$use_classes&nbsp;</span>=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a310"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a311"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a312"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;type&nbsp;of&nbsp;header&nbsp;to&nbsp;use.&nbsp;Can&nbsp;be&nbsp;one&nbsp;of&nbsp;the&nbsp;following</span></div></li>
+<li><div class="src-line"><a name="a313"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;values:</span></div></li>
+<li><div class="src-line"><a name="a314"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a315"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;-&nbsp;GESHI_HEADER_PRE:&nbsp;Source&nbsp;is&nbsp;outputted&nbsp;in&nbsp;a&nbsp;&quot;pre&quot;&nbsp;HTML&nbsp;element.</span></div></li>
+<li><div class="src-line"><a name="a316"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;-&nbsp;GESHI_HEADER_DIV:&nbsp;Source&nbsp;is&nbsp;outputted&nbsp;in&nbsp;a&nbsp;&quot;div&quot;&nbsp;HTML&nbsp;element.</span></div></li>
+<li><div class="src-line"><a name="a317"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;-&nbsp;GESHI_HEADER_NONE:&nbsp;No&nbsp;header&nbsp;is&nbsp;outputted.</span></div></li>
+<li><div class="src-line"><a name="a318"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a319"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">int&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a320"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a321"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$header_type&nbsp;</span>=&nbsp;<span class="src-id">GESHI_HEADER_PRE</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a322"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a323"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a324"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Array&nbsp;of&nbsp;permissions&nbsp;for&nbsp;which&nbsp;lexics&nbsp;should&nbsp;be&nbsp;highlighted</span></div></li>
+<li><div class="src-line"><a name="a325"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">array&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a326"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a327"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$lexic_permissions&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></div></li>
+<li><div class="src-line"><a name="a328"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'KEYWORDS'&nbsp;</span>=&gt;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a329"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'COMMENTS'&nbsp;</span>=&gt;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'MULTI'&nbsp;</span>=&gt;&nbsp;<span class="src-id">true</span><span class="src-sym">)</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a330"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'REGEXPS'&nbsp;</span>=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a331"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'ESCAPE_CHAR'&nbsp;</span>=&gt;&nbsp;<span class="src-id">true</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a332"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'BRACKETS'&nbsp;</span>=&gt;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">true</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a333"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'SYMBOLS'&nbsp;</span>=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">false</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a334"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'STRINGS'&nbsp;</span>=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">true</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a335"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'NUMBERS'&nbsp;</span>=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">true</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a336"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'METHODS'&nbsp;</span>=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">true</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a337"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'SCRIPT'&nbsp;</span>=&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">true</span></div></li>
+<li><div class="src-line"><a name="a338"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a339"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a340"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a341"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;time&nbsp;it&nbsp;took&nbsp;to&nbsp;parse&nbsp;the&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a342"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">double&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a343"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a344"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$time&nbsp;</span>=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a345"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a346"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a347"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;content&nbsp;of&nbsp;the&nbsp;header&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a348"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a349"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a350"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$header_content&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a351"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a352"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a353"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;content&nbsp;of&nbsp;the&nbsp;footer&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a354"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a355"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a356"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$footer_content&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a357"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a358"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a359"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;style&nbsp;of&nbsp;the&nbsp;header&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a360"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a361"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a362"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$header_content_style&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a363"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a364"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a365"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;style&nbsp;of&nbsp;the&nbsp;footer&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a366"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a367"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a368"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$footer_content_style&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a369"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a370"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a371"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Tells&nbsp;if&nbsp;a&nbsp;block&nbsp;around&nbsp;the&nbsp;highlighted&nbsp;source&nbsp;should&nbsp;be&nbsp;forced</span></div></li>
+<li><div class="src-line"><a name="a372"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;if&nbsp;not&nbsp;using&nbsp;line&nbsp;numbering</span></div></li>
+<li><div class="src-line"><a name="a373"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a374"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a375"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$force_code_block&nbsp;</span>=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a376"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a377"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a378"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;styles&nbsp;for&nbsp;hyperlinks&nbsp;in&nbsp;the&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a379"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">array&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a380"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a381"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$link_styles&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a382"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a383"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a384"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Whether&nbsp;important&nbsp;blocks&nbsp;should&nbsp;be&nbsp;recognised&nbsp;or&nbsp;not</span></div></li>
+<li><div class="src-line"><a name="a385"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a386"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@deprecated</span></div></li>
+<li><div class="src-line"><a name="a387"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@todo</span><span class="src-doc">&nbsp;REMOVE&nbsp;THIS&nbsp;FUNCTIONALITY!</span></div></li>
+<li><div class="src-line"><a name="a388"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a389"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$enable_important_blocks&nbsp;</span>=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a390"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a391"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a392"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Styles&nbsp;for&nbsp;important&nbsp;parts&nbsp;of&nbsp;the&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a393"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a394"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@deprecated</span></div></li>
+<li><div class="src-line"><a name="a395"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@todo</span><span class="src-doc">&nbsp;As&nbsp;above&nbsp;-&nbsp;rethink&nbsp;the&nbsp;whole&nbsp;idea&nbsp;of&nbsp;important&nbsp;blocks&nbsp;as&nbsp;it&nbsp;is&nbsp;buggy&nbsp;and</span></div></li>
+<li><div class="src-line"><a name="a396"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;will&nbsp;be&nbsp;hard&nbsp;to&nbsp;implement&nbsp;in&nbsp;1.2</span></div></li>
+<li><div class="src-line"><a name="a397"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a398"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$important_styles&nbsp;</span>=&nbsp;<span class="src-str">'font-weight:&nbsp;bold;&nbsp;color:&nbsp;red;'</span><span class="src-sym">;&nbsp;</span><span class="src-comm">//&nbsp;Styles&nbsp;for&nbsp;important&nbsp;parts&nbsp;of&nbsp;the&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a399"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a400"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a401"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Whether&nbsp;CSS&nbsp;IDs&nbsp;should&nbsp;be&nbsp;added&nbsp;to&nbsp;the&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a402"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a403"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a404"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$add_ids&nbsp;</span>=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a405"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a406"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a407"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Lines&nbsp;that&nbsp;should&nbsp;be&nbsp;highlighted&nbsp;extra</span></div></li>
+<li><div class="src-line"><a name="a408"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">array&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a409"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a410"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$highlight_extra_lines&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a411"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a412"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a413"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Styles&nbsp;of&nbsp;lines&nbsp;that&nbsp;should&nbsp;be&nbsp;highlighted&nbsp;extra</span></div></li>
+<li><div class="src-line"><a name="a414"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">array&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a415"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a416"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$highlight_extra_lines_styles&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a417"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a418"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a419"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Styles&nbsp;of&nbsp;extra-highlighted&nbsp;lines</span></div></li>
+<li><div class="src-line"><a name="a420"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a421"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a422"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$highlight_extra_lines_style&nbsp;</span>=&nbsp;<span class="src-str">'background-color:&nbsp;#ffc;'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a423"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a424"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a425"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;line&nbsp;ending</span></div></li>
+<li><div class="src-line"><a name="a426"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;If&nbsp;null,&nbsp;nl2br()&nbsp;will&nbsp;be&nbsp;used&nbsp;on&nbsp;the&nbsp;result&nbsp;string.</span></div></li>
+<li><div class="src-line"><a name="a427"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Otherwise,&nbsp;all&nbsp;instances&nbsp;of&nbsp;\n&nbsp;will&nbsp;be&nbsp;replaced&nbsp;with&nbsp;$line_ending</span></div></li>
+<li><div class="src-line"><a name="a428"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a429"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a430"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$line_ending&nbsp;</span>=&nbsp;<span class="src-id">null</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a431"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a432"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a433"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Number&nbsp;at&nbsp;which&nbsp;line&nbsp;numbers&nbsp;should&nbsp;start&nbsp;at</span></div></li>
+<li><div class="src-line"><a name="a434"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">int&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a435"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a436"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$line_numbers_start&nbsp;</span>=&nbsp;<span class="src-num">1</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a437"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a438"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a439"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;overall&nbsp;style&nbsp;for&nbsp;this&nbsp;code&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a440"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a441"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a442"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$overall_style&nbsp;</span>=&nbsp;<span class="src-str">'font-family:monospace;'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a443"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a444"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a445"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;The&nbsp;style&nbsp;for&nbsp;the&nbsp;actual&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a446"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a447"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a448"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$code_style&nbsp;</span>=&nbsp;<span class="src-str">'font:&nbsp;normal&nbsp;normal&nbsp;1em/1.2em&nbsp;monospace;&nbsp;margin:0;&nbsp;padding:0;&nbsp;background:none;&nbsp;vertical-align:top;'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a449"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a450"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a451"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;overall&nbsp;class&nbsp;for&nbsp;this&nbsp;code&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a452"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a453"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a454"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$overall_class&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a455"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a456"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a457"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;overall&nbsp;ID&nbsp;for&nbsp;this&nbsp;code&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a458"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a459"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a460"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$overall_id&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a461"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a462"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a463"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Line&nbsp;number&nbsp;styles</span></div></li>
+<li><div class="src-line"><a name="a464"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a465"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a466"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$line_style1&nbsp;</span>=&nbsp;<span class="src-str">'font-weight:&nbsp;normal;&nbsp;vertical-align:top;'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a467"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a468"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a469"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Line&nbsp;number&nbsp;styles&nbsp;for&nbsp;fancy&nbsp;lines</span></div></li>
+<li><div class="src-line"><a name="a470"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a471"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a472"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$line_style2&nbsp;</span>=&nbsp;<span class="src-str">'font-weight:&nbsp;bold;&nbsp;vertical-align:top;'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a473"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a474"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a475"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Style&nbsp;for&nbsp;line&nbsp;numbers&nbsp;when&nbsp;GESHI_HEADER_PRE_TABLE&nbsp;is&nbsp;chosen</span></div></li>
+<li><div class="src-line"><a name="a476"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a477"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a478"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$table_linenumber_style&nbsp;</span>=&nbsp;<span class="src-str">'width:1px;text-align:right;margin:0;padding:0&nbsp;2px;vertical-align:top;'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a479"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a480"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a481"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Flag&nbsp;for&nbsp;how&nbsp;line&nbsp;numbers&nbsp;are&nbsp;displayed</span></div></li>
+<li><div class="src-line"><a name="a482"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a483"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a484"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$line_numbers&nbsp;</span>=&nbsp;<span class="src-id">GESHI_NO_LINE_NUMBERS</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a485"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a486"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a487"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Flag&nbsp;to&nbsp;decide&nbsp;if&nbsp;multi&nbsp;line&nbsp;spans&nbsp;are&nbsp;allowed.&nbsp;Set&nbsp;it&nbsp;to&nbsp;false&nbsp;to&nbsp;make&nbsp;sure</span></div></li>
+<li><div class="src-line"><a name="a488"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;each&nbsp;tag&nbsp;is&nbsp;closed&nbsp;before&nbsp;and&nbsp;reopened&nbsp;after&nbsp;each&nbsp;linefeed.</span></div></li>
+<li><div class="src-line"><a name="a489"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a490"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a491"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$allow_multiline_span&nbsp;</span>=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a492"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a493"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a494"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;&quot;nth&quot;&nbsp;value&nbsp;for&nbsp;fancy&nbsp;line&nbsp;highlighting</span></div></li>
+<li><div class="src-line"><a name="a495"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">int&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a496"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a497"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$line_nth_row&nbsp;</span>=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a498"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a499"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a500"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;size&nbsp;of&nbsp;tab&nbsp;stops</span></div></li>
+<li><div class="src-line"><a name="a501"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">int&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a502"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a503"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$tab_width&nbsp;</span>=&nbsp;<span class="src-num">8</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a504"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a505"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a506"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Should&nbsp;we&nbsp;use&nbsp;language-defined&nbsp;tab&nbsp;stop&nbsp;widths?</span></div></li>
+<li><div class="src-line"><a name="a507"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">int&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a508"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a509"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$use_language_tab_width&nbsp;</span>=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a510"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a511"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a512"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Default&nbsp;target&nbsp;for&nbsp;keyword&nbsp;links</span></div></li>
+<li><div class="src-line"><a name="a513"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a514"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a515"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$link_target&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a516"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a517"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a518"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;encoding&nbsp;to&nbsp;use&nbsp;for&nbsp;entity&nbsp;encoding</span></div></li>
+<li><div class="src-line"><a name="a519"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;NOTE:&nbsp;Used&nbsp;with&nbsp;Escape&nbsp;Char&nbsp;Sequences&nbsp;to&nbsp;fix&nbsp;UTF-8&nbsp;handling&nbsp;(cf.&nbsp;SF#2037598)</span></div></li>
+<li><div class="src-line"><a name="a520"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a521"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a522"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$encoding&nbsp;</span>=&nbsp;<span class="src-str">'utf-8'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a523"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a524"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a525"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Should&nbsp;keywords&nbsp;be&nbsp;linked?</span></div></li>
+<li><div class="src-line"><a name="a526"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a527"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a528"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$keyword_links&nbsp;</span>=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a529"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a530"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a531"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Currently&nbsp;loaded&nbsp;language&nbsp;file</span></div></li>
+<li><div class="src-line"><a name="a532"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a533"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.7.22</span></div></li>
+<li><div class="src-line"><a name="a534"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a535"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$loaded_language&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a536"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a537"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a538"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Wether&nbsp;the&nbsp;caches&nbsp;needed&nbsp;for&nbsp;parsing&nbsp;are&nbsp;built&nbsp;or&nbsp;not</span></div></li>
+<li><div class="src-line"><a name="a539"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a540"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">bool&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a541"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.8</span></div></li>
+<li><div class="src-line"><a name="a542"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a543"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$parse_cache_built&nbsp;</span>=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a544"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a545"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a546"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Work&nbsp;around&nbsp;for&nbsp;Suhosin&nbsp;Patch&nbsp;with&nbsp;disabled&nbsp;/e&nbsp;modifier</span></div></li>
+<li><div class="src-line"><a name="a547"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a548"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Note&nbsp;from&nbsp;suhosins&nbsp;author&nbsp;in&nbsp;config&nbsp;file:</span></div></li>
+<li><div class="src-line"><a name="a549"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;blockquote&gt;</span></div></li>
+<li><div class="src-line"><a name="a550"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;The&nbsp;/e&nbsp;modifier&nbsp;inside&nbsp;&lt;code&gt;preg_replace()&lt;/code&gt;&nbsp;allows&nbsp;code&nbsp;execution.</span></div></li>
+<li><div class="src-line"><a name="a551"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;Often&nbsp;it&nbsp;is&nbsp;the&nbsp;cause&nbsp;for&nbsp;remote&nbsp;code&nbsp;execution&nbsp;exploits.&nbsp;It&nbsp;is&nbsp;wise&nbsp;to</span></div></li>
+<li><div class="src-line"><a name="a552"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;deactivate&nbsp;this&nbsp;feature&nbsp;and&nbsp;test&nbsp;where&nbsp;in&nbsp;the&nbsp;application&nbsp;it&nbsp;is&nbsp;used.</span></div></li>
+<li><div class="src-line"><a name="a553"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;The&nbsp;developer&nbsp;using&nbsp;the&nbsp;/e&nbsp;modifier&nbsp;should&nbsp;be&nbsp;made&nbsp;aware&nbsp;that&nbsp;he&nbsp;should</span></div></li>
+<li><div class="src-line"><a name="a554"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;use&nbsp;&lt;code&gt;preg_replace_callback()&lt;/code&gt;&nbsp;instead</span></div></li>
+<li><div class="src-line"><a name="a555"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;/blockquote&gt;</span></div></li>
+<li><div class="src-line"><a name="a556"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a557"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">array&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a558"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.8</span></div></li>
+<li><div class="src-line"><a name="a559"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a560"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$_kw_replace_group&nbsp;</span>=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a561"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$_rx_key&nbsp;</span>=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a562"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a563"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a564"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;some&nbsp;&quot;callback&nbsp;parameters&quot;&nbsp;for&nbsp;handle_multiline_regexps</span></div></li>
+<li><div class="src-line"><a name="a565"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a566"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.8</span></div></li>
+<li><div class="src-line"><a name="a567"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@access</span><span class="src-doc">&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a568"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@var&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a569"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a570"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$_hmr_before&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a571"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$_hmr_replace&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a572"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$_hmr_after&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a573"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">var&nbsp;</span><span class="src-var">$_hmr_key&nbsp;</span>=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a574"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a575"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">/**#@-*/</span></div></li>
+<li><div class="src-line"><a name="a576"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a577"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a578"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Creates&nbsp;a&nbsp;new&nbsp;GeSHi&nbsp;object,&nbsp;with&nbsp;source&nbsp;and&nbsp;language</span></div></li>
+<li><div class="src-line"><a name="a579"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a580"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;source&nbsp;code&nbsp;to&nbsp;highlight</span></div></li>
+<li><div class="src-line"><a name="a581"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;language&nbsp;to&nbsp;highlight&nbsp;the&nbsp;source&nbsp;with</span></div></li>
+<li><div class="src-line"><a name="a582"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;path&nbsp;to&nbsp;the&nbsp;language&nbsp;file&nbsp;directory.&nbsp;&lt;b&gt;This</span></div></li>
+<li><div class="src-line"><a name="a583"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;deprecated!&lt;/b&gt;&nbsp;I've&nbsp;backported&nbsp;the&nbsp;auto&nbsp;path</span></div></li>
+<li><div class="src-line"><a name="a584"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detection&nbsp;from&nbsp;the&nbsp;1.1.X&nbsp;dev&nbsp;branch,&nbsp;so&nbsp;now&nbsp;it</span></div></li>
+<li><div class="src-line"><a name="a585"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;should&nbsp;be&nbsp;automatically&nbsp;set&nbsp;correctly.&nbsp;If&nbsp;you&nbsp;have</span></div></li>
+<li><div class="src-line"><a name="a586"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renamed&nbsp;the&nbsp;language&nbsp;directory&nbsp;however,&nbsp;you&nbsp;will</span></div></li>
+<li><div class="src-line"><a name="a587"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;still&nbsp;need&nbsp;to&nbsp;set&nbsp;the&nbsp;path&nbsp;using&nbsp;this&nbsp;parameter&nbsp;or</span></div></li>
+<li><div class="src-line"><a name="a588"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-doc-inlinetag">{@link&nbsp;GeSHi-&gt;set_language_path()}</span></div></li>
+<li><div class="src-line"><a name="a589"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a590"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a591"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function&nbsp;</span><a href="../geshi/core/GeSHi.html#methodGeSHi">GeSHi</a><span class="src-sym">(</span><span class="src-var">$source&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">,&nbsp;</span><span class="src-var">$language&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">,&nbsp;</span><span class="src-var">$path&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a592"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$source</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a593"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodset_source">set_source</a><span class="src-sym">(</span><span class="src-var">$source</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a594"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a595"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$language</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a596"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodset_language">set_language</a><span class="src-sym">(</span><span class="src-var">$language</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a597"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a598"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodset_language_path">set_language_path</a><span class="src-sym">(</span><span class="src-var">$path</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a599"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a600"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a601"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-doc">/**</span></div></li>
+<li><div class="src-line"><a name="a602"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;an&nbsp;error&nbsp;message&nbsp;associated&nbsp;with&nbsp;the&nbsp;last&nbsp;GeSHi&nbsp;operation,</span></div></li>
+<li><div class="src-line"><a name="a603"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;or&nbsp;false&nbsp;if&nbsp;no&nbsp;error&nbsp;has&nbsp;occured</span></div></li>
+<li><div class="src-line"><a name="a604"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a605"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@return&nbsp;</span><span class="src-doc-type">string</span><span class="src-doc">|</span><span class="src-doc-type">false</span><span class="src-doc">An&nbsp;error&nbsp;message&nbsp;if&nbsp;there&nbsp;has&nbsp;been&nbsp;an&nbsp;error,&nbsp;else&nbsp;false</span></div></li>
+<li><div class="src-line"><a name="a606"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a607"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a608"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function&nbsp;</span><a href="../geshi/core/GeSHi.html#methoderror">error</a><span class="src-sym">(</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a609"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">error</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a610"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Put&nbsp;some&nbsp;template&nbsp;variables&nbsp;for&nbsp;debugging&nbsp;here&nbsp;...</span></div></li>
+<li><div class="src-line"><a name="a611"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$debug_tpl_vars&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></div></li>
+<li><div class="src-line"><a name="a612"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'{LANGUAGE}'&nbsp;</span>=&gt;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a613"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'{PATH}'&nbsp;</span>=&gt;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_path</span></div></li>
+<li><div class="src-line"><a name="a614"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a615"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$msg&nbsp;</span>=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span></div></li>
+<li><div class="src-line"><a name="a616"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/array_keys">array_keys</a><span class="src-sym">(</span><span class="src-var">$debug_tpl_vars</span><span class="src-sym">)</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a617"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/array_values">array_values</a><span class="src-sym">(</span><span class="src-var">$debug_tpl_vars</span><span class="src-sym">)</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a618"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">error_messages</span><span class="src-sym">[</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">error</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a619"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a620"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return&nbsp;</span><span class="src-str">&quot;</span><span class="src-str">&lt;br&nbsp;/&gt;&lt;strong&gt;GeSHi&nbsp;Error:&lt;/strong&gt;&nbsp;<span class="src-var">$msg</span>&nbsp;(code&nbsp;{<span class="src-var">$this</span></span><span class="src-sym">-&gt;</span><span class="src-var">error</span><span class="src-sym">}</span>)&lt;br&nbsp;/&gt;</span><span class="src-str"><span class="src-str">"</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a621"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a622"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a623"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a624"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a625"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;/**</span></div></li>
+<li><div class="src-line"><a name="a626"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Gets&nbsp;a&nbsp;human-readable&nbsp;language&nbsp;name&nbsp;(thanks&nbsp;to&nbsp;Simon&nbsp;Patterson</span></div></li>
+<li><div class="src-line"><a name="a627"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;for&nbsp;the&nbsp;idea&nbsp;:))</span></div></li>
+<li><div class="src-line"><a name="a628"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a629"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;The&nbsp;name&nbsp;for&nbsp;the&nbsp;current&nbsp;language</span></div></li>
+<li><div class="src-line"><a name="a630"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a631"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a632"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">get_language_name</span><span class="src-sym">(</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a633"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-id">GESHI_ERROR_NO_SUCH_LANG</span>&nbsp;==&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">error</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a634"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'LANG_NAME'</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&nbsp;(Unknown&nbsp;Language)'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a635"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a636"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'LANG_NAME'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a637"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a638"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a639"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a640"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;source&nbsp;code&nbsp;for&nbsp;this&nbsp;object</span></div></li>
+<li><div class="src-line"><a name="a641"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a642"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;source&nbsp;code&nbsp;to&nbsp;highlight</span></div></li>
+<li><div class="src-line"><a name="a643"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a644"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a645"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_source">set_source</a><span class="src-sym">(</span><span class="src-var">$source</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a646"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">source</span>&nbsp;=&nbsp;<span class="src-var">$source</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a647"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">highlight_extra_lines</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a648"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a649"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a650"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a651"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;language&nbsp;for&nbsp;this&nbsp;object</span></div></li>
+<li><div class="src-line"><a name="a652"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a653"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-tag">@note</span><span class="src-doc">&nbsp;since&nbsp;1.0.8&nbsp;this&nbsp;function&nbsp;won't&nbsp;reset&nbsp;language-settings&nbsp;by&nbsp;default&nbsp;anymore!</span></div></li>
+<li><div class="src-line"><a name="a654"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;you&nbsp;need&nbsp;this&nbsp;set&nbsp;$force_reset&nbsp;=&nbsp;true</span></div></li>
+<li><div class="src-line"><a name="a655"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a656"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;name&nbsp;of&nbsp;the&nbsp;language&nbsp;to&nbsp;use</span></div></li>
+<li><div class="src-line"><a name="a657"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a658"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a659"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_language">set_language</a><span class="src-sym">(</span><span class="src-var">$language</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$force_reset</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a660"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$force_reset</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a661"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">loaded_language</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a662"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a663"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a664"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Clean&nbsp;up&nbsp;the&nbsp;language&nbsp;name&nbsp;to&nbsp;prevent&nbsp;malicious&nbsp;code&nbsp;injection</span></span></div></li>
+<li><div class="src-line"><a name="a665"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$language</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_replace">preg_replace</a><span class="src-sym">(</span><span class="src-str">'#[^a-zA-Z0-9\-_]#'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">''</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$language</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a666"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a667"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$language</span>&nbsp;=&nbsp;<a href="http://www.php.net/strtolower">strtolower</a><span class="src-sym">(</span><span class="src-var">$language</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a668"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a669"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Retreive&nbsp;the&nbsp;full&nbsp;filename</span></span></div></li>
+<li><div class="src-line"><a name="a670"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$file_name</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_path</span>&nbsp;.&nbsp;<span class="src-var">$language</span>&nbsp;.&nbsp;<span class="src-str">'.php'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a671"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$file_name</span>&nbsp;==&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">loaded_language</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a672"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;this&nbsp;language&nbsp;is&nbsp;already&nbsp;loaded!</span></span></div></li>
+<li><div class="src-line"><a name="a673"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a674"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a675"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a676"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language</span>&nbsp;=&nbsp;<span class="src-var">$language</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a677"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a678"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">error</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a679"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">strict_mode</span>&nbsp;=&nbsp;<span class="src-id">GESHI_NEVER</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a680"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a681"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Check&nbsp;if&nbsp;we&nbsp;can&nbsp;read&nbsp;the&nbsp;desired&nbsp;file</span></span></div></li>
+<li><div class="src-line"><a name="a682"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><a href="http://www.php.net/is_readable">is_readable</a><span class="src-sym">(</span><span class="src-var">$file_name</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a683"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">error</span>&nbsp;=&nbsp;<span class="src-id">GESHI_ERROR_NO_SUCH_LANG</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a684"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a685"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a686"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a687"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Load&nbsp;the&nbsp;language&nbsp;for&nbsp;parsing</span></span></div></li>
+<li><div class="src-line"><a name="a688"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">load_language</span><span class="src-sym">(</span><span class="src-var">$file_name</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a689"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a690"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a691"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a692"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;path&nbsp;to&nbsp;the&nbsp;directory&nbsp;containing&nbsp;the&nbsp;language&nbsp;files.&nbsp;Note</span></div></li>
+<li><div class="src-line"><a name="a693"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;that&nbsp;this&nbsp;path&nbsp;is&nbsp;relative&nbsp;to&nbsp;the&nbsp;directory&nbsp;of&nbsp;the&nbsp;script&nbsp;that&nbsp;included</span></div></li>
+<li><div class="src-line"><a name="a694"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;geshi.php,&nbsp;NOT&nbsp;geshi.php&nbsp;itself.</span></div></li>
+<li><div class="src-line"><a name="a695"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a696"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;path&nbsp;to&nbsp;the&nbsp;language&nbsp;directory</span></div></li>
+<li><div class="src-line"><a name="a697"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a698"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@deprecated</span><span class="src-doc">&nbsp;The&nbsp;path&nbsp;to&nbsp;the&nbsp;language&nbsp;files&nbsp;should&nbsp;now&nbsp;be&nbsp;automatically</span></div></li>
+<li><div class="src-line"><a name="a699"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detected,&nbsp;so&nbsp;this&nbsp;method&nbsp;should&nbsp;no&nbsp;longer&nbsp;be&nbsp;needed.&nbsp;The</span></div></li>
+<li><div class="src-line"><a name="a700"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.1.X&nbsp;branch&nbsp;handles&nbsp;manual&nbsp;setting&nbsp;of&nbsp;the&nbsp;path&nbsp;differently</span></div></li>
+<li><div class="src-line"><a name="a701"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;so&nbsp;this&nbsp;method&nbsp;will&nbsp;disappear&nbsp;in&nbsp;1.2.0.</span></div></li>
+<li><div class="src-line"><a name="a702"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a703"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_language_path">set_language_path</a><span class="src-sym">(</span><span class="src-var">$path</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a704"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$path</span><span class="src-sym">,</span><span class="src-str">':'</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a705"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Security&nbsp;Fix&nbsp;to&nbsp;prevent&nbsp;external&nbsp;directories&nbsp;using&nbsp;fopen&nbsp;wrappers.</span></span></div></li>
+<li><div class="src-line"><a name="a706"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-id">DIRECTORY_SEPARATOR</span>&nbsp;==&nbsp;<span class="src-str">&quot;\\&quot;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a707"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-sym">!</span><a href="http://www.php.net/preg_match">preg_match</a><span class="src-sym">(</span><span class="src-str">'#^[a-zA-Z]:#'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$path</span><span class="src-sym">)</span>&nbsp;||&nbsp;<span class="src-id">false</span>&nbsp;!==&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$path</span><span class="src-sym">,</span>&nbsp;<span class="src-str">':'</span><span class="src-sym">,</span>&nbsp;<span class="src-num">2</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a708"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a709"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a710"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a711"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a712"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a713"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a714"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><a href="http://www.php.net/preg_match">preg_match</a><span class="src-sym">(</span><span class="src-str">'#[^/a-zA-Z0-9_\.\-\\\s:]#'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$path</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a715"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Security&nbsp;Fix&nbsp;to&nbsp;prevent&nbsp;external&nbsp;directories&nbsp;using&nbsp;fopen&nbsp;wrappers.</span></span></div></li>
+<li><div class="src-line"><a name="a716"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a717"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a718"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_SECURITY_PARANOID&quot;&gt;GESHI_SECURITY_PARANOID&lt;/a&gt;</span>&nbsp;&amp;&amp;&nbsp;<span class="src-id">false</span>&nbsp;!==&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$path</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'/.'</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a719"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Security&nbsp;Fix&nbsp;to&nbsp;prevent&nbsp;external&nbsp;directories&nbsp;using&nbsp;fopen&nbsp;wrappers.</span></span></div></li>
+<li><div class="src-line"><a name="a720"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a721"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a722"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_SECURITY_PARANOID&quot;&gt;GESHI_SECURITY_PARANOID&lt;/a&gt;</span>&nbsp;&amp;&amp;&nbsp;<span class="src-id">false</span>&nbsp;!==&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$path</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'..'</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a723"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Security&nbsp;Fix&nbsp;to&nbsp;prevent&nbsp;external&nbsp;directories&nbsp;using&nbsp;fopen&nbsp;wrappers.</span></span></div></li>
+<li><div class="src-line"><a name="a724"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a725"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a726"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$path</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a727"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_path</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-str">'/'</span>&nbsp;==&nbsp;<span class="src-var">$path</span><span class="src-sym">[</span><a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$path</span><span class="src-sym">)</span>&nbsp;-&nbsp;<span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-var">$path</span>&nbsp;:&nbsp;<span class="src-var">$path</span>&nbsp;.&nbsp;<span class="src-str">'/'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a728"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodset_language">set_language</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language</span><span class="src-sym">)</span><span class="src-sym">;</span>&nbsp;<span class="src-comm">//&nbsp;otherwise&nbsp;set_language_path&nbsp;has&nbsp;no&nbsp;effect</span></span></div></li>
+<li><div class="src-line"><a name="a729"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a730"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a731"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a732"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a733"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;type&nbsp;of&nbsp;header&nbsp;to&nbsp;be&nbsp;used.</span></div></li>
+<li><div class="src-line"><a name="a734"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a735"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;If&nbsp;GESHI_HEADER_DIV&nbsp;is&nbsp;used,&nbsp;the&nbsp;code&nbsp;is&nbsp;surrounded&nbsp;in&nbsp;a&nbsp;&quot;div&quot;.This</span></div></li>
+<li><div class="src-line"><a name="a736"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;means&nbsp;more&nbsp;source&nbsp;code&nbsp;but&nbsp;more&nbsp;control&nbsp;over&nbsp;tab&nbsp;width&nbsp;and&nbsp;line-wrapping.</span></div></li>
+<li><div class="src-line"><a name="a737"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;GESHI_HEADER_PRE&nbsp;means&nbsp;that&nbsp;a&nbsp;&quot;pre&quot;&nbsp;is&nbsp;used&nbsp;-&nbsp;less&nbsp;source,&nbsp;but&nbsp;less</span></div></li>
+<li><div class="src-line"><a name="a738"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;control.&nbsp;Default&nbsp;is&nbsp;GESHI_HEADER_PRE.</span></div></li>
+<li><div class="src-line"><a name="a739"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a740"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;From&nbsp;1.0.7.2,&nbsp;you&nbsp;can&nbsp;use&nbsp;GESHI_HEADER_NONE&nbsp;to&nbsp;specify&nbsp;that&nbsp;no&nbsp;header&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a741"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;should&nbsp;be&nbsp;outputted.</span></div></li>
+<li><div class="src-line"><a name="a742"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a743"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">The&nbsp;type&nbsp;of&nbsp;header&nbsp;to&nbsp;be&nbsp;used</span></div></li>
+<li><div class="src-line"><a name="a744"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a745"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a746"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_header_type">set_header_type</a><span class="src-sym">(</span><span class="src-var">$type</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a747"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Check&nbsp;if&nbsp;we&nbsp;got&nbsp;a&nbsp;valid&nbsp;header&nbsp;type</span></span></div></li>
+<li><div class="src-line"><a name="a748"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><a href="http://www.php.net/in_array">in_array</a><span class="src-sym">(</span><span class="src-var">$type</span><span class="src-sym">,</span>&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_NONE&quot;&gt;GESHI_HEADER_NONE&lt;/a&gt;</span><span class="src-sym">,</span>&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_DIV&quot;&gt;GESHI_HEADER_DIV&lt;/a&gt;</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a749"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE&quot;&gt;GESHI_HEADER_PRE&lt;/a&gt;</span><span class="src-sym">,</span>&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_VALID&quot;&gt;GESHI_HEADER_PRE_VALID&lt;/a&gt;</span><span class="src-sym">,</span>&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_TABLE&quot;&gt;GESHI_HEADER_PRE_TABLE&lt;/a&gt;</span><span class="src-sym">)))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a750"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">error</span>&nbsp;=&nbsp;<span class="src-id">GESHI_ERROR_INVALID_HEADER_TYPE</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a751"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a752"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a753"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a754"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Set&nbsp;that&nbsp;new&nbsp;header&nbsp;type</span></span></div></li>
+<li><div class="src-line"><a name="a755"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">header_type</span>&nbsp;=&nbsp;<span class="src-var">$type</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a756"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a757"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a758"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a759"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;styles&nbsp;for&nbsp;the&nbsp;code&nbsp;that&nbsp;will&nbsp;be&nbsp;outputted</span></div></li>
+<li><div class="src-line"><a name="a760"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;when&nbsp;this&nbsp;object&nbsp;is&nbsp;parsed.&nbsp;The&nbsp;style&nbsp;should&nbsp;be&nbsp;a</span></div></li>
+<li><div class="src-line"><a name="a761"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;string&nbsp;of&nbsp;valid&nbsp;stylesheet&nbsp;declarations</span></div></li>
+<li><div class="src-line"><a name="a762"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a763"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">&nbsp;The&nbsp;overall&nbsp;style&nbsp;for&nbsp;the&nbsp;outputted&nbsp;code&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a764"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;merge&nbsp;the&nbsp;styles&nbsp;with&nbsp;the&nbsp;current&nbsp;styles&nbsp;or&nbsp;not</span></div></li>
+<li><div class="src-line"><a name="a765"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a766"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a767"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_overall_style">set_overall_style</a><span class="src-sym">(</span><span class="src-var">$style</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$preserve_defaults</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a768"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$preserve_defaults</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a769"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">overall_style</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a770"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a771"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">overall_style</span>&nbsp;.=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a772"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a773"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a774"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a775"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a776"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;overall&nbsp;classname&nbsp;for&nbsp;this&nbsp;block&nbsp;of&nbsp;code.&nbsp;This</span></div></li>
+<li><div class="src-line"><a name="a777"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;class&nbsp;can&nbsp;then&nbsp;be&nbsp;used&nbsp;in&nbsp;a&nbsp;stylesheet&nbsp;to&nbsp;style&nbsp;this&nbsp;object's</span></div></li>
+<li><div class="src-line"><a name="a778"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;output</span></div></li>
+<li><div class="src-line"><a name="a779"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a780"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;class&nbsp;name&nbsp;to&nbsp;use&nbsp;for&nbsp;this&nbsp;block&nbsp;of&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a781"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a782"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a783"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_overall_class">set_overall_class</a><span class="src-sym">(</span><span class="src-var">$class</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a784"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">overall_class</span>&nbsp;=&nbsp;<span class="src-var">$class</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a785"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a786"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a787"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a788"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;overall&nbsp;id&nbsp;for&nbsp;this&nbsp;block&nbsp;of&nbsp;code.&nbsp;This&nbsp;id&nbsp;can&nbsp;then</span></div></li>
+<li><div class="src-line"><a name="a789"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;be&nbsp;used&nbsp;in&nbsp;a&nbsp;stylesheet&nbsp;to&nbsp;style&nbsp;this&nbsp;object's&nbsp;output</span></div></li>
+<li><div class="src-line"><a name="a790"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a791"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;ID&nbsp;to&nbsp;use&nbsp;for&nbsp;this&nbsp;block&nbsp;of&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a792"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a793"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a794"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_overall_id">set_overall_id</a><span class="src-sym">(</span><span class="src-var">$id</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a795"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">overall_id</span>&nbsp;=&nbsp;<span class="src-var">$id</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a796"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a797"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a798"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a799"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;whether&nbsp;CSS&nbsp;classes&nbsp;should&nbsp;be&nbsp;used&nbsp;to&nbsp;highlight&nbsp;the&nbsp;source.&nbsp;Default</span></div></li>
+<li><div class="src-line"><a name="a800"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;is&nbsp;off,&nbsp;calling&nbsp;this&nbsp;method&nbsp;with&nbsp;no&nbsp;arguments&nbsp;will&nbsp;turn&nbsp;it&nbsp;on</span></div></li>
+<li><div class="src-line"><a name="a801"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a802"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;turn&nbsp;classes&nbsp;on&nbsp;or&nbsp;not</span></div></li>
+<li><div class="src-line"><a name="a803"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a804"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a805"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodenable_classes">enable_classes</a><span class="src-sym">(</span><span class="src-var">$flag</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a806"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">use_classes</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a807"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a808"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a809"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a810"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;style&nbsp;for&nbsp;the&nbsp;actual&nbsp;code.&nbsp;This&nbsp;should&nbsp;be&nbsp;a&nbsp;string</span></div></li>
+<li><div class="src-line"><a name="a811"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;containing&nbsp;valid&nbsp;stylesheet&nbsp;declarations.&nbsp;If&nbsp;$preserve_defaults&nbsp;is</span></div></li>
+<li><div class="src-line"><a name="a812"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;true,&nbsp;then&nbsp;styles&nbsp;are&nbsp;merged&nbsp;with&nbsp;the&nbsp;default&nbsp;styles,&nbsp;with&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a813"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;user&nbsp;defined&nbsp;styles&nbsp;having&nbsp;priority</span></div></li>
+<li><div class="src-line"><a name="a814"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a815"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Note:&nbsp;Use&nbsp;this&nbsp;method&nbsp;to&nbsp;override&nbsp;any&nbsp;style&nbsp;changes&nbsp;you&nbsp;made&nbsp;to</span></div></li>
+<li><div class="src-line"><a name="a816"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;line&nbsp;numbers&nbsp;if&nbsp;you&nbsp;are&nbsp;using&nbsp;line&nbsp;numbers,&nbsp;else&nbsp;the&nbsp;line&nbsp;of</span></div></li>
+<li><div class="src-line"><a name="a817"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;code&nbsp;will&nbsp;have&nbsp;the&nbsp;same&nbsp;style&nbsp;as&nbsp;the&nbsp;line&nbsp;number!&nbsp;Consult&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a818"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;GeSHi&nbsp;documentation&nbsp;for&nbsp;more&nbsp;information&nbsp;about&nbsp;this.</span></div></li>
+<li><div class="src-line"><a name="a819"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a820"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">&nbsp;The&nbsp;style&nbsp;to&nbsp;use&nbsp;for&nbsp;actual&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a821"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;merge&nbsp;the&nbsp;current&nbsp;styles&nbsp;with&nbsp;the&nbsp;new&nbsp;styles</span></div></li>
+<li><div class="src-line"><a name="a822"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a823"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a824"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_code_style">set_code_style</a><span class="src-sym">(</span><span class="src-var">$style</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$preserve_defaults</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a825"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$preserve_defaults</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a826"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">code_style</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a827"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a828"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">code_style</span>&nbsp;.=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a829"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a830"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a831"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a832"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a833"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;styles&nbsp;for&nbsp;the&nbsp;line&nbsp;numbers.</span></div></li>
+<li><div class="src-line"><a name="a834"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a835"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;style&nbsp;for&nbsp;the&nbsp;line&nbsp;numbers&nbsp;that&nbsp;are&nbsp;&quot;normal&quot;</span></div></li>
+<li><div class="src-line"><a name="a836"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string</span><span class="src-doc">|</span><span class="src-doc-type">boolean</span><span class="src-doc">If&nbsp;a&nbsp;string,&nbsp;this&nbsp;is&nbsp;the&nbsp;style&nbsp;of&nbsp;the&nbsp;line</span></div></li>
+<li><div class="src-line"><a name="a837"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numbers&nbsp;that&nbsp;are&nbsp;&quot;fancy&quot;,&nbsp;otherwise&nbsp;if&nbsp;boolean&nbsp;then&nbsp;this</span></div></li>
+<li><div class="src-line"><a name="a838"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defines&nbsp;whether&nbsp;the&nbsp;normal&nbsp;styles&nbsp;should&nbsp;be&nbsp;merged&nbsp;with&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a839"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;normal&nbsp;styles&nbsp;or&nbsp;not</span></div></li>
+<li><div class="src-line"><a name="a840"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">If&nbsp;set,&nbsp;is&nbsp;the&nbsp;flag&nbsp;for&nbsp;whether&nbsp;to&nbsp;merge&nbsp;the&nbsp;&quot;fancy&quot;</span></div></li>
+<li><div class="src-line"><a name="a841"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styles&nbsp;with&nbsp;the&nbsp;current&nbsp;styles&nbsp;or&nbsp;not</span></div></li>
+<li><div class="src-line"><a name="a842"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a843"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a844"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_line_style">set_line_style</a><span class="src-sym">(</span><span class="src-var">$style1</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$style2</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$preserve_defaults</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a845"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Check&nbsp;if&nbsp;we&nbsp;got&nbsp;2&nbsp;or&nbsp;three&nbsp;parameters</span></span></div></li>
+<li><div class="src-line"><a name="a846"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/is_bool">is_bool</a><span class="src-sym">(</span><span class="src-var">$style2</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a847"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$preserve_defaults</span>&nbsp;=&nbsp;<span class="src-var">$style2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a848"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$style2</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a849"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a850"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a851"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Actually&nbsp;set&nbsp;the&nbsp;new&nbsp;styles</span></span></div></li>
+<li><div class="src-line"><a name="a852"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$preserve_defaults</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a853"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">line_style1</span>&nbsp;=&nbsp;<span class="src-var">$style1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a854"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">line_style2</span>&nbsp;=&nbsp;<span class="src-var">$style2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a855"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a856"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">line_style1</span>&nbsp;.=&nbsp;<span class="src-var">$style1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a857"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">line_style2</span>&nbsp;.=&nbsp;<span class="src-var">$style2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a858"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a859"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a860"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a861"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a862"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;whether&nbsp;line&nbsp;numbers&nbsp;should&nbsp;be&nbsp;displayed.</span></div></li>
+<li><div class="src-line"><a name="a863"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a864"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Valid&nbsp;values&nbsp;for&nbsp;the&nbsp;first&nbsp;parameter&nbsp;are:</span></div></li>
+<li><div class="src-line"><a name="a865"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a866"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;-&nbsp;GESHI_NO_LINE_NUMBERS:&nbsp;Line&nbsp;numbers&nbsp;will&nbsp;not&nbsp;be&nbsp;displayed</span></div></li>
+<li><div class="src-line"><a name="a867"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;-&nbsp;GESHI_NORMAL_LINE_NUMBERS:&nbsp;Line&nbsp;numbers&nbsp;will&nbsp;be&nbsp;displayed</span></div></li>
+<li><div class="src-line"><a name="a868"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;-&nbsp;GESHI_FANCY_LINE_NUMBERS:&nbsp;Fancy&nbsp;line&nbsp;numbers&nbsp;will&nbsp;be&nbsp;displayed</span></div></li>
+<li><div class="src-line"><a name="a869"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a870"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;For&nbsp;fancy&nbsp;line&nbsp;numbers,&nbsp;the&nbsp;second&nbsp;parameter&nbsp;is&nbsp;used&nbsp;to&nbsp;signal&nbsp;which&nbsp;lines</span></div></li>
+<li><div class="src-line"><a name="a871"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;are&nbsp;to&nbsp;be&nbsp;fancy.&nbsp;For&nbsp;example,&nbsp;if&nbsp;the&nbsp;value&nbsp;of&nbsp;this&nbsp;parameter&nbsp;is&nbsp;5&nbsp;then&nbsp;every</span></div></li>
+<li><div class="src-line"><a name="a872"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;5th&nbsp;line&nbsp;will&nbsp;be&nbsp;fancy.</span></div></li>
+<li><div class="src-line"><a name="a873"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a874"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">How&nbsp;line&nbsp;numbers&nbsp;should&nbsp;be&nbsp;displayed</span></div></li>
+<li><div class="src-line"><a name="a875"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">Defines&nbsp;which&nbsp;lines&nbsp;are&nbsp;fancy</span></div></li>
+<li><div class="src-line"><a name="a876"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a877"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a878"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodenable_line_numbers">enable_line_numbers</a><span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$nth_row</span>&nbsp;=&nbsp;<span class="src-num">5</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a879"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS&quot;&gt;GESHI_NO_LINE_NUMBERS&lt;/a&gt;</span>&nbsp;!=&nbsp;<span class="src-var">$flag</span>&nbsp;&amp;&amp;&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_NORMAL_LINE_NUMBERS&quot;&gt;GESHI_NORMAL_LINE_NUMBERS&lt;/a&gt;</span>&nbsp;!=&nbsp;<span class="src-var">$flag</span></span></div></li>
+<li><div class="src-line"><a name="a880"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_FANCY_LINE_NUMBERS&quot;&gt;GESHI_FANCY_LINE_NUMBERS&lt;/a&gt;</span>&nbsp;!=&nbsp;<span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a881"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">error</span>&nbsp;=&nbsp;<span class="src-id">GESHI_ERROR_INVALID_LINE_NUMBER_TYPE</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a882"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a883"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">line_numbers</span>&nbsp;=&nbsp;<span class="src-var">$flag</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a884"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">line_nth_row</span>&nbsp;=&nbsp;<span class="src-var">$nth_row</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a885"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a886"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a887"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a888"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;wether&nbsp;spans&nbsp;and&nbsp;other&nbsp;HTML&nbsp;markup&nbsp;generated&nbsp;by&nbsp;GeSHi&nbsp;can</span></div></li>
+<li><div class="src-line"><a name="a889"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;span&nbsp;over&nbsp;multiple&nbsp;lines&nbsp;or&nbsp;not.&nbsp;Defaults&nbsp;to&nbsp;true&nbsp;to&nbsp;reduce&nbsp;overhead.</span></div></li>
+<li><div class="src-line"><a name="a890"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Set&nbsp;it&nbsp;to&nbsp;false&nbsp;if&nbsp;you&nbsp;want&nbsp;to&nbsp;manipulate&nbsp;the&nbsp;output&nbsp;or&nbsp;manually&nbsp;display</span></div></li>
+<li><div class="src-line"><a name="a891"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;code&nbsp;in&nbsp;an&nbsp;ordered&nbsp;list.</span></div></li>
+<li><div class="src-line"><a name="a892"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a893"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Wether&nbsp;multiline&nbsp;spans&nbsp;are&nbsp;allowed&nbsp;or&nbsp;not</span></div></li>
+<li><div class="src-line"><a name="a894"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.7.22</span></div></li>
+<li><div class="src-line"><a name="a895"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a896"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodenable_multiline_span">enable_multiline_span</a><span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a897"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">allow_multiline_span</span>&nbsp;=&nbsp;(bool)&nbsp;<span class="src-var">$flag</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a898"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a899"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a900"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a901"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Get&nbsp;current&nbsp;setting&nbsp;for&nbsp;multiline&nbsp;spans,&nbsp;see&nbsp;GeSHi-&gt;enable_multiline_span().</span></div></li>
+<li><div class="src-line"><a name="a902"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a903"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@see</span><span class="src-doc">&nbsp;enable_multiline_span</span></div></li>
+<li><div class="src-line"><a name="a904"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@return&nbsp;</span><span class="src-doc-type">bool&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a905"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a906"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodget_multiline_span">get_multiline_span</a><span class="src-sym">(</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a907"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">allow_multiline_span</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a908"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a909"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a910"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a911"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;style&nbsp;for&nbsp;a&nbsp;keyword&nbsp;group.&nbsp;If&nbsp;$preserve_defaults&nbsp;is</span></div></li>
+<li><div class="src-line"><a name="a912"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;true,&nbsp;then&nbsp;styles&nbsp;are&nbsp;merged&nbsp;with&nbsp;the&nbsp;default&nbsp;styles,&nbsp;with&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a913"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;user&nbsp;defined&nbsp;styles&nbsp;having&nbsp;priority</span></div></li>
+<li><div class="src-line"><a name="a914"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a915"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;keyword&nbsp;group&nbsp;to&nbsp;change&nbsp;the&nbsp;styles&nbsp;of</span></div></li>
+<li><div class="src-line"><a name="a916"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">&nbsp;The&nbsp;style&nbsp;to&nbsp;make&nbsp;the&nbsp;keywords</span></div></li>
+<li><div class="src-line"><a name="a917"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;merge&nbsp;the&nbsp;new&nbsp;styles&nbsp;with&nbsp;the&nbsp;old&nbsp;or&nbsp;just</span></div></li>
+<li><div class="src-line"><a name="a918"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;overwrite&nbsp;them</span></div></li>
+<li><div class="src-line"><a name="a919"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a920"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a921"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_keyword_group_style">set_keyword_group_style</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$style</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$preserve_defaults</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a922"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Set&nbsp;the&nbsp;style&nbsp;for&nbsp;this&nbsp;keyword&nbsp;group</span></span></div></li>
+<li><div class="src-line"><a name="a923"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$preserve_defaults</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a924"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a925"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a926"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a927"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a928"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a929"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Update&nbsp;the&nbsp;lexic&nbsp;permissions</span></span></div></li>
+<li><div class="src-line"><a name="a930"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a931"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a932"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a933"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a934"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a935"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a936"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Turns&nbsp;highlighting&nbsp;on/off&nbsp;for&nbsp;a&nbsp;keyword&nbsp;group</span></div></li>
+<li><div class="src-line"><a name="a937"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a938"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;keyword&nbsp;group&nbsp;to&nbsp;turn&nbsp;on&nbsp;or&nbsp;off</span></div></li>
+<li><div class="src-line"><a name="a939"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;turn&nbsp;highlighting&nbsp;for&nbsp;that&nbsp;group&nbsp;on&nbsp;or&nbsp;off</span></div></li>
+<li><div class="src-line"><a name="a940"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a941"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a942"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_keyword_group_highlighting">set_keyword_group_highlighting</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$flag</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a943"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a944"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a945"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a946"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a947"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;styles&nbsp;for&nbsp;comment&nbsp;groups.&nbsp;&nbsp;If&nbsp;$preserve_defaults&nbsp;is</span></div></li>
+<li><div class="src-line"><a name="a948"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;true,&nbsp;then&nbsp;styles&nbsp;are&nbsp;merged&nbsp;with&nbsp;the&nbsp;default&nbsp;styles,&nbsp;with&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a949"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;user&nbsp;defined&nbsp;styles&nbsp;having&nbsp;priority</span></div></li>
+<li><div class="src-line"><a name="a950"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a951"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;comment&nbsp;group&nbsp;to&nbsp;change&nbsp;the&nbsp;styles&nbsp;of</span></div></li>
+<li><div class="src-line"><a name="a952"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">&nbsp;The&nbsp;style&nbsp;to&nbsp;make&nbsp;the&nbsp;comments</span></div></li>
+<li><div class="src-line"><a name="a953"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;merge&nbsp;the&nbsp;new&nbsp;styles&nbsp;with&nbsp;the&nbsp;old&nbsp;or&nbsp;just</span></div></li>
+<li><div class="src-line"><a name="a954"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;overwrite&nbsp;them</span></div></li>
+<li><div class="src-line"><a name="a955"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a956"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a957"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_comments_style">set_comments_style</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$style</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$preserve_defaults</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a958"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$preserve_defaults</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a959"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a960"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a961"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a962"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a963"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a964"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a965"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a966"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Turns&nbsp;highlighting&nbsp;on/off&nbsp;for&nbsp;comment&nbsp;groups</span></div></li>
+<li><div class="src-line"><a name="a967"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a968"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;comment&nbsp;group&nbsp;to&nbsp;turn&nbsp;on&nbsp;or&nbsp;off</span></div></li>
+<li><div class="src-line"><a name="a969"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;turn&nbsp;highlighting&nbsp;for&nbsp;that&nbsp;group&nbsp;on&nbsp;or&nbsp;off</span></div></li>
+<li><div class="src-line"><a name="a970"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a971"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a972"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_comments_highlighting">set_comments_highlighting</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$flag</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a973"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a974"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a975"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a976"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a977"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;styles&nbsp;for&nbsp;escaped&nbsp;characters.&nbsp;If&nbsp;$preserve_defaults&nbsp;is</span></div></li>
+<li><div class="src-line"><a name="a978"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;true,&nbsp;then&nbsp;styles&nbsp;are&nbsp;merged&nbsp;with&nbsp;the&nbsp;default&nbsp;styles,&nbsp;with&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a979"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;user&nbsp;defined&nbsp;styles&nbsp;having&nbsp;priority</span></div></li>
+<li><div class="src-line"><a name="a980"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a981"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">&nbsp;The&nbsp;style&nbsp;to&nbsp;make&nbsp;the&nbsp;escape&nbsp;characters</span></div></li>
+<li><div class="src-line"><a name="a982"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;merge&nbsp;the&nbsp;new&nbsp;styles&nbsp;with&nbsp;the&nbsp;old&nbsp;or&nbsp;just</span></div></li>
+<li><div class="src-line"><a name="a983"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;overwrite&nbsp;them</span></div></li>
+<li><div class="src-line"><a name="a984"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a985"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a986"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_escape_characters_style">set_escape_characters_style</a><span class="src-sym">(</span><span class="src-var">$style</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$preserve_defaults</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a987"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$preserve_defaults</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a988"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a989"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a990"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a991"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a992"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a993"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a994"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a995"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Turns&nbsp;highlighting&nbsp;on/off&nbsp;for&nbsp;escaped&nbsp;characters</span></div></li>
+<li><div class="src-line"><a name="a996"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a997"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;turn&nbsp;highlighting&nbsp;for&nbsp;escape&nbsp;characters&nbsp;on&nbsp;or&nbsp;off</span></div></li>
+<li><div class="src-line"><a name="a998"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a999"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1000"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_escape_characters_highlighting">set_escape_characters_highlighting</a><span class="src-sym">(</span><span class="src-var">$flag</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1001"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1002"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1003"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1004"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1005"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;styles&nbsp;for&nbsp;brackets.&nbsp;If&nbsp;$preserve_defaults&nbsp;is</span></div></li>
+<li><div class="src-line"><a name="a1006"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;true,&nbsp;then&nbsp;styles&nbsp;are&nbsp;merged&nbsp;with&nbsp;the&nbsp;default&nbsp;styles,&nbsp;with&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a1007"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;user&nbsp;defined&nbsp;styles&nbsp;having&nbsp;priority</span></div></li>
+<li><div class="src-line"><a name="a1008"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1009"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;method&nbsp;is&nbsp;DEPRECATED:&nbsp;use&nbsp;set_symbols_style&nbsp;instead.</span></div></li>
+<li><div class="src-line"><a name="a1010"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;method&nbsp;will&nbsp;be&nbsp;removed&nbsp;in&nbsp;1.2.X</span></div></li>
+<li><div class="src-line"><a name="a1011"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1012"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">&nbsp;The&nbsp;style&nbsp;to&nbsp;make&nbsp;the&nbsp;brackets</span></div></li>
+<li><div class="src-line"><a name="a1013"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;merge&nbsp;the&nbsp;new&nbsp;styles&nbsp;with&nbsp;the&nbsp;old&nbsp;or&nbsp;just</span></div></li>
+<li><div class="src-line"><a name="a1014"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;overwrite&nbsp;them</span></div></li>
+<li><div class="src-line"><a name="a1015"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1016"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@deprecated</span><span class="src-doc">&nbsp;In&nbsp;favour&nbsp;of&nbsp;set_symbols_style</span></div></li>
+<li><div class="src-line"><a name="a1017"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1018"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_brackets_style">set_brackets_style</a><span class="src-sym">(</span><span class="src-var">$style</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$preserve_defaults</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1019"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$preserve_defaults</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1020"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1021"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1022"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1023"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1024"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1025"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1026"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1027"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Turns&nbsp;highlighting&nbsp;on/off&nbsp;for&nbsp;brackets</span></div></li>
+<li><div class="src-line"><a name="a1028"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1029"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;method&nbsp;is&nbsp;DEPRECATED:&nbsp;use&nbsp;set_symbols_highlighting&nbsp;instead.</span></div></li>
+<li><div class="src-line"><a name="a1030"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;method&nbsp;will&nbsp;be&nbsp;remove&nbsp;in&nbsp;1.2.X</span></div></li>
+<li><div class="src-line"><a name="a1031"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1032"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;turn&nbsp;highlighting&nbsp;for&nbsp;brackets&nbsp;on&nbsp;or&nbsp;off</span></div></li>
+<li><div class="src-line"><a name="a1033"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1034"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@deprecated</span><span class="src-doc">&nbsp;In&nbsp;favour&nbsp;of&nbsp;set_symbols_highlighting</span></div></li>
+<li><div class="src-line"><a name="a1035"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1036"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_brackets_highlighting">set_brackets_highlighting</a><span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1037"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1038"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1039"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1040"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1041"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;styles&nbsp;for&nbsp;symbols.&nbsp;If&nbsp;$preserve_defaults&nbsp;is</span></div></li>
+<li><div class="src-line"><a name="a1042"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;true,&nbsp;then&nbsp;styles&nbsp;are&nbsp;merged&nbsp;with&nbsp;the&nbsp;default&nbsp;styles,&nbsp;with&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a1043"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;user&nbsp;defined&nbsp;styles&nbsp;having&nbsp;priority</span></div></li>
+<li><div class="src-line"><a name="a1044"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1045"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">&nbsp;The&nbsp;style&nbsp;to&nbsp;make&nbsp;the&nbsp;symbols</span></div></li>
+<li><div class="src-line"><a name="a1046"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;merge&nbsp;the&nbsp;new&nbsp;styles&nbsp;with&nbsp;the&nbsp;old&nbsp;or&nbsp;just</span></div></li>
+<li><div class="src-line"><a name="a1047"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;overwrite&nbsp;them</span></div></li>
+<li><div class="src-line"><a name="a1048"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;Tells&nbsp;the&nbsp;group&nbsp;of&nbsp;symbols&nbsp;for&nbsp;which&nbsp;style&nbsp;should&nbsp;be&nbsp;set.</span></div></li>
+<li><div class="src-line"><a name="a1049"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.1</span></div></li>
+<li><div class="src-line"><a name="a1050"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1051"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_symbols_style">set_symbols_style</a><span class="src-sym">(</span><span class="src-var">$style</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$preserve_defaults</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$group</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1052"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Update&nbsp;the&nbsp;style&nbsp;of&nbsp;symbols</span></span></div></li>
+<li><div class="src-line"><a name="a1053"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$preserve_defaults</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1054"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'SYMBOLS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$group</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1055"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1056"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'SYMBOLS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$group</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1057"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1058"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1059"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;For&nbsp;backward&nbsp;compatibility</span></span></div></li>
+<li><div class="src-line"><a name="a1060"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-num">0</span>&nbsp;==&nbsp;<span class="src-var">$group</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1061"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodset_brackets_style">set_brackets_style</a>&nbsp;<span class="src-sym">(</span><span class="src-var">$style</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$preserve_defaults</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1062"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1063"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1064"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1065"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1066"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Turns&nbsp;highlighting&nbsp;on/off&nbsp;for&nbsp;symbols</span></div></li>
+<li><div class="src-line"><a name="a1067"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1068"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;turn&nbsp;highlighting&nbsp;for&nbsp;symbols&nbsp;on&nbsp;or&nbsp;off</span></div></li>
+<li><div class="src-line"><a name="a1069"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1070"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1071"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_symbols_highlighting">set_symbols_highlighting</a><span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1072"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Update&nbsp;lexic&nbsp;permissions&nbsp;for&nbsp;this&nbsp;symbol&nbsp;group</span></span></div></li>
+<li><div class="src-line"><a name="a1073"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'SYMBOLS'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1074"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1075"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;For&nbsp;backward&nbsp;compatibility</span></span></div></li>
+<li><div class="src-line"><a name="a1076"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodset_brackets_highlighting">set_brackets_highlighting</a>&nbsp;<span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1077"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1078"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1079"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1080"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;styles&nbsp;for&nbsp;strings.&nbsp;If&nbsp;$preserve_defaults&nbsp;is</span></div></li>
+<li><div class="src-line"><a name="a1081"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;true,&nbsp;then&nbsp;styles&nbsp;are&nbsp;merged&nbsp;with&nbsp;the&nbsp;default&nbsp;styles,&nbsp;with&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a1082"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;user&nbsp;defined&nbsp;styles&nbsp;having&nbsp;priority</span></div></li>
+<li><div class="src-line"><a name="a1083"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1084"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">&nbsp;The&nbsp;style&nbsp;to&nbsp;make&nbsp;the&nbsp;escape&nbsp;characters</span></div></li>
+<li><div class="src-line"><a name="a1085"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;merge&nbsp;the&nbsp;new&nbsp;styles&nbsp;with&nbsp;the&nbsp;old&nbsp;or&nbsp;just</span></div></li>
+<li><div class="src-line"><a name="a1086"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;overwrite&nbsp;them</span></div></li>
+<li><div class="src-line"><a name="a1087"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1088"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1089"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_strings_style">set_strings_style</a><span class="src-sym">(</span><span class="src-var">$style</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$preserve_defaults</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1090"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$preserve_defaults</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1091"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'STRINGS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1092"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1093"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'STRINGS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1094"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1095"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1096"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1097"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1098"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Turns&nbsp;highlighting&nbsp;on/off&nbsp;for&nbsp;strings</span></div></li>
+<li><div class="src-line"><a name="a1099"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1100"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;turn&nbsp;highlighting&nbsp;for&nbsp;strings&nbsp;on&nbsp;or&nbsp;off</span></div></li>
+<li><div class="src-line"><a name="a1101"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1102"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1103"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_strings_highlighting">set_strings_highlighting</a><span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1104"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'STRINGS'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1105"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1106"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1107"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1108"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;styles&nbsp;for&nbsp;numbers.&nbsp;If&nbsp;$preserve_defaults&nbsp;is</span></div></li>
+<li><div class="src-line"><a name="a1109"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;true,&nbsp;then&nbsp;styles&nbsp;are&nbsp;merged&nbsp;with&nbsp;the&nbsp;default&nbsp;styles,&nbsp;with&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a1110"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;user&nbsp;defined&nbsp;styles&nbsp;having&nbsp;priority</span></div></li>
+<li><div class="src-line"><a name="a1111"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1112"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">&nbsp;The&nbsp;style&nbsp;to&nbsp;make&nbsp;the&nbsp;numbers</span></div></li>
+<li><div class="src-line"><a name="a1113"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;merge&nbsp;the&nbsp;new&nbsp;styles&nbsp;with&nbsp;the&nbsp;old&nbsp;or&nbsp;just</span></div></li>
+<li><div class="src-line"><a name="a1114"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;overwrite&nbsp;them</span></div></li>
+<li><div class="src-line"><a name="a1115"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1116"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1117"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_numbers_style">set_numbers_style</a><span class="src-sym">(</span><span class="src-var">$style</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$preserve_defaults</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1118"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$preserve_defaults</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1119"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1120"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1121"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1122"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1123"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1124"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1125"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1126"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Turns&nbsp;highlighting&nbsp;on/off&nbsp;for&nbsp;numbers</span></div></li>
+<li><div class="src-line"><a name="a1127"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1128"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;turn&nbsp;highlighting&nbsp;for&nbsp;numbers&nbsp;on&nbsp;or&nbsp;off</span></div></li>
+<li><div class="src-line"><a name="a1129"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1130"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1131"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_numbers_highlighting">set_numbers_highlighting</a><span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1132"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1133"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1134"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1135"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1136"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;styles&nbsp;for&nbsp;methods.&nbsp;$key&nbsp;is&nbsp;a&nbsp;number&nbsp;that&nbsp;references&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a1137"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;appropriate&nbsp;&quot;object&nbsp;splitter&quot;&nbsp;-&nbsp;see&nbsp;the&nbsp;language&nbsp;file&nbsp;for&nbsp;the&nbsp;language</span></div></li>
+<li><div class="src-line"><a name="a1138"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;you&nbsp;are&nbsp;highlighting&nbsp;to&nbsp;get&nbsp;this&nbsp;number.&nbsp;If&nbsp;$preserve_defaults&nbsp;is</span></div></li>
+<li><div class="src-line"><a name="a1139"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;true,&nbsp;then&nbsp;styles&nbsp;are&nbsp;merged&nbsp;with&nbsp;the&nbsp;default&nbsp;styles,&nbsp;with&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a1140"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;user&nbsp;defined&nbsp;styles&nbsp;having&nbsp;priority</span></div></li>
+<li><div class="src-line"><a name="a1141"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1142"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;object&nbsp;splitter&nbsp;to&nbsp;change&nbsp;the&nbsp;styles&nbsp;of</span></div></li>
+<li><div class="src-line"><a name="a1143"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">&nbsp;The&nbsp;style&nbsp;to&nbsp;make&nbsp;the&nbsp;methods</span></div></li>
+<li><div class="src-line"><a name="a1144"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;merge&nbsp;the&nbsp;new&nbsp;styles&nbsp;with&nbsp;the&nbsp;old&nbsp;or&nbsp;just</span></div></li>
+<li><div class="src-line"><a name="a1145"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;overwrite&nbsp;them</span></div></li>
+<li><div class="src-line"><a name="a1146"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1147"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1148"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_methods_style">set_methods_style</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$style</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$preserve_defaults</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1149"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$preserve_defaults</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1150"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'METHODS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1151"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1152"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'METHODS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1153"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1154"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1155"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1156"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1157"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Turns&nbsp;highlighting&nbsp;on/off&nbsp;for&nbsp;methods</span></div></li>
+<li><div class="src-line"><a name="a1158"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1159"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;turn&nbsp;highlighting&nbsp;for&nbsp;methods&nbsp;on&nbsp;or&nbsp;off</span></div></li>
+<li><div class="src-line"><a name="a1160"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1161"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1162"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_methods_highlighting">set_methods_highlighting</a><span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1163"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'METHODS'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1164"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1165"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1166"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1167"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;styles&nbsp;for&nbsp;regexps.&nbsp;If&nbsp;$preserve_defaults&nbsp;is</span></div></li>
+<li><div class="src-line"><a name="a1168"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;true,&nbsp;then&nbsp;styles&nbsp;are&nbsp;merged&nbsp;with&nbsp;the&nbsp;default&nbsp;styles,&nbsp;with&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a1169"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;user&nbsp;defined&nbsp;styles&nbsp;having&nbsp;priority</span></div></li>
+<li><div class="src-line"><a name="a1170"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1171"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">&nbsp;The&nbsp;style&nbsp;to&nbsp;make&nbsp;the&nbsp;regular&nbsp;expression&nbsp;matches</span></div></li>
+<li><div class="src-line"><a name="a1172"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;merge&nbsp;the&nbsp;new&nbsp;styles&nbsp;with&nbsp;the&nbsp;old&nbsp;or&nbsp;just</span></div></li>
+<li><div class="src-line"><a name="a1173"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;overwrite&nbsp;them</span></div></li>
+<li><div class="src-line"><a name="a1174"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1175"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1176"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_regexps_style">set_regexps_style</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$style</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$preserve_defaults</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1177"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$preserve_defaults</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1178"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1179"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1180"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1181"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1182"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1183"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1184"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1185"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Turns&nbsp;highlighting&nbsp;on/off&nbsp;for&nbsp;regexps</span></div></li>
+<li><div class="src-line"><a name="a1186"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1187"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;regular&nbsp;expression&nbsp;group&nbsp;to&nbsp;turn&nbsp;on&nbsp;or&nbsp;off</span></div></li>
+<li><div class="src-line"><a name="a1188"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;turn&nbsp;highlighting&nbsp;for&nbsp;the&nbsp;regular&nbsp;expression&nbsp;group&nbsp;on&nbsp;or&nbsp;off</span></div></li>
+<li><div class="src-line"><a name="a1189"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1190"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1191"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_regexps_highlighting">set_regexps_highlighting</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1192"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1193"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1194"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1195"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1196"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;whether&nbsp;a&nbsp;set&nbsp;of&nbsp;keywords&nbsp;are&nbsp;checked&nbsp;for&nbsp;in&nbsp;a&nbsp;case&nbsp;sensitive&nbsp;manner</span></div></li>
+<li><div class="src-line"><a name="a1197"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1198"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">The&nbsp;key&nbsp;of&nbsp;the&nbsp;keyword&nbsp;group&nbsp;to&nbsp;change&nbsp;the&nbsp;case&nbsp;sensitivity&nbsp;of</span></div></li>
+<li><div class="src-line"><a name="a1199"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;check&nbsp;in&nbsp;a&nbsp;case&nbsp;sensitive&nbsp;manner&nbsp;or&nbsp;not</span></div></li>
+<li><div class="src-line"><a name="a1200"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1201"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1202"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_case_sensitivity">set_case_sensitivity</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$case</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1203"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'CASE_SENSITIVE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$case</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1204"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1205"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1206"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1207"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;case&nbsp;that&nbsp;keywords&nbsp;should&nbsp;use&nbsp;when&nbsp;found.&nbsp;Use&nbsp;the&nbsp;constants:</span></div></li>
+<li><div class="src-line"><a name="a1208"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1209"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;-&nbsp;GESHI_CAPS_NO_CHANGE:&nbsp;leave&nbsp;keywords&nbsp;as-is</span></div></li>
+<li><div class="src-line"><a name="a1210"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;-&nbsp;GESHI_CAPS_UPPER:&nbsp;convert&nbsp;all&nbsp;keywords&nbsp;to&nbsp;uppercase&nbsp;where&nbsp;found</span></div></li>
+<li><div class="src-line"><a name="a1211"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;-&nbsp;GESHI_CAPS_LOWER:&nbsp;convert&nbsp;all&nbsp;keywords&nbsp;to&nbsp;lowercase&nbsp;where&nbsp;found</span></div></li>
+<li><div class="src-line"><a name="a1212"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1213"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">A&nbsp;constant&nbsp;specifying&nbsp;what&nbsp;to&nbsp;do&nbsp;with&nbsp;matched&nbsp;keywords</span></div></li>
+<li><div class="src-line"><a name="a1214"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.1</span></div></li>
+<li><div class="src-line"><a name="a1215"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1216"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_case_keywords">set_case_keywords</a><span class="src-sym">(</span><span class="src-var">$case</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1217"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/in_array">in_array</a><span class="src-sym">(</span><span class="src-var">$case</span><span class="src-sym">,</span>&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a1218"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_CAPS_NO_CHANGE&quot;&gt;GESHI_CAPS_NO_CHANGE&lt;/a&gt;</span><span class="src-sym">,</span>&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_CAPS_UPPER&quot;&gt;GESHI_CAPS_UPPER&lt;/a&gt;</span><span class="src-sym">,</span>&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_CAPS_LOWER&quot;&gt;GESHI_CAPS_LOWER&lt;/a&gt;</span><span class="src-sym">)))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1219"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'CASE_KEYWORDS'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$case</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1220"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1221"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1222"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1223"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1224"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;how&nbsp;many&nbsp;spaces&nbsp;a&nbsp;tab&nbsp;is&nbsp;substituted&nbsp;for</span></div></li>
+<li><div class="src-line"><a name="a1225"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1226"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Widths&nbsp;below&nbsp;zero&nbsp;are&nbsp;ignored</span></div></li>
+<li><div class="src-line"><a name="a1227"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1228"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">The&nbsp;tab&nbsp;width</span></div></li>
+<li><div class="src-line"><a name="a1229"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1230"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1231"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_tab_width">set_tab_width</a><span class="src-sym">(</span><span class="src-var">$width</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1232"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">tab_width</span>&nbsp;=&nbsp;<a href="http://www.php.net/intval">intval</a><span class="src-sym">(</span><span class="src-var">$width</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1233"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1234"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Check&nbsp;if&nbsp;it&nbsp;fit's&nbsp;the&nbsp;constraints:</span></span></div></li>
+<li><div class="src-line"><a name="a1235"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">tab_width</span>&nbsp;<&nbsp;<span class="src-num">1</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1236"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Return&nbsp;it&nbsp;to&nbsp;the&nbsp;default</span></span></div></li>
+<li><div class="src-line"><a name="a1237"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">tab_width</span>&nbsp;=&nbsp;<span class="src-num">8</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1238"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1239"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1240"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1241"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1242"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;whether&nbsp;or&nbsp;not&nbsp;to&nbsp;use&nbsp;tab-stop&nbsp;width&nbsp;specifed&nbsp;by&nbsp;language</span></div></li>
+<li><div class="src-line"><a name="a1243"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1244"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;use&nbsp;language-specific&nbsp;tab-stop&nbsp;widths</span></div></li>
+<li><div class="src-line"><a name="a1245"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.7.20</span></div></li>
+<li><div class="src-line"><a name="a1246"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1247"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_use_language_tab_width">set_use_language_tab_width</a><span class="src-sym">(</span><span class="src-var">$use</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1248"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">use_language_tab_width</span>&nbsp;=&nbsp;(bool)&nbsp;<span class="src-var">$use</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1249"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1250"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1251"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1252"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;the&nbsp;tab&nbsp;width&nbsp;to&nbsp;use,&nbsp;based&nbsp;on&nbsp;the&nbsp;current&nbsp;language&nbsp;and&nbsp;user</span></div></li>
+<li><div class="src-line"><a name="a1253"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;preference</span></div></li>
+<li><div class="src-line"><a name="a1254"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1255"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@return&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">Tab&nbsp;width</span></div></li>
+<li><div class="src-line"><a name="a1256"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.7.20</span></div></li>
+<li><div class="src-line"><a name="a1257"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1258"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodget_real_tab_width">get_real_tab_width</a><span class="src-sym">(</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1259"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">use_language_tab_width</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a1260"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'TAB_WIDTH'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1261"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">tab_width</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1262"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1263"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'TAB_WIDTH'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1264"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1265"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1266"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1267"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1268"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Enables/disables&nbsp;strict&nbsp;highlighting.&nbsp;Default&nbsp;is&nbsp;off,&nbsp;calling&nbsp;this</span></div></li>
+<li><div class="src-line"><a name="a1269"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;method&nbsp;without&nbsp;parameters&nbsp;will&nbsp;turn&nbsp;it&nbsp;on.&nbsp;See&nbsp;documentation</span></div></li>
+<li><div class="src-line"><a name="a1270"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;for&nbsp;more&nbsp;details&nbsp;on&nbsp;strict&nbsp;mode&nbsp;and&nbsp;where&nbsp;to&nbsp;use&nbsp;it.</span></div></li>
+<li><div class="src-line"><a name="a1271"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1272"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;to&nbsp;enable&nbsp;strict&nbsp;mode&nbsp;or&nbsp;not</span></div></li>
+<li><div class="src-line"><a name="a1273"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1274"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1275"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodenable_strict_mode">enable_strict_mode</a><span class="src-sym">(</span><span class="src-var">$mode</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1276"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-id">GESHI_MAYBE</span>&nbsp;==&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STRICT_MODE_APPLIES'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1277"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">strict_mode</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$mode</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">GESHI_ALWAYS</span>&nbsp;:&nbsp;<span class="src-id">GESHI_NEVER</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1278"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1279"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1280"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1281"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1282"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Disables&nbsp;all&nbsp;highlighting</span></div></li>
+<li><div class="src-line"><a name="a1283"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1284"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1285"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@todo</span><span class="src-doc">&nbsp;&nbsp;Rewrite&nbsp;with&nbsp;array&nbsp;traversal</span></div></li>
+<li><div class="src-line"><a name="a1286"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@deprecated</span><span class="src-doc">&nbsp;In&nbsp;favour&nbsp;of&nbsp;enable_highlighting</span></div></li>
+<li><div class="src-line"><a name="a1287"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1288"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methoddisable_highlighting">disable_highlighting</a><span class="src-sym">(</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1289"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodenable_highlighting">enable_highlighting</a><span class="src-sym">(</span><span class="src-id">false</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1290"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1291"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1292"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1293"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Enables&nbsp;all&nbsp;highlighting</span></div></li>
+<li><div class="src-line"><a name="a1294"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1295"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;optional&nbsp;flag&nbsp;parameter&nbsp;was&nbsp;added&nbsp;in&nbsp;version&nbsp;1.0.7.21&nbsp;and&nbsp;can&nbsp;be&nbsp;used</span></div></li>
+<li><div class="src-line"><a name="a1296"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;to&nbsp;enable&nbsp;(true)&nbsp;or&nbsp;disable&nbsp;(false)&nbsp;all&nbsp;highlighting.</span></div></li>
+<li><div class="src-line"><a name="a1297"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1298"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1299"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">A&nbsp;flag&nbsp;specifying&nbsp;whether&nbsp;to&nbsp;enable&nbsp;or&nbsp;disable&nbsp;all&nbsp;highlighting</span></div></li>
+<li><div class="src-line"><a name="a1300"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@todo</span><span class="src-doc">&nbsp;&nbsp;Rewrite&nbsp;with&nbsp;array&nbsp;traversal</span></div></li>
+<li><div class="src-line"><a name="a1301"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1302"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodenable_highlighting">enable_highlighting</a><span class="src-sym">(</span><span class="src-var">$flag</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1303"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$flag</span>&nbsp;=&nbsp;<span class="src-var">$flag</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1304"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span>&nbsp;=&gt;&nbsp;<span class="src-var">$value</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1305"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$value</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1306"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$value</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$k</span>&nbsp;=&gt;&nbsp;<span class="src-var">$v</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1307"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$flag</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1308"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1309"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1310"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$flag</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1311"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1312"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1313"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1314"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Context&nbsp;blocks</span></span></div></li>
+<li><div class="src-line"><a name="a1315"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">enable_important_blocks</span>&nbsp;=&nbsp;<span class="src-var">$flag</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1316"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1317"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1318"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1319"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Given&nbsp;a&nbsp;file&nbsp;extension,&nbsp;this&nbsp;method&nbsp;returns&nbsp;either&nbsp;a&nbsp;valid&nbsp;geshi&nbsp;language</span></div></li>
+<li><div class="src-line"><a name="a1320"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;name,&nbsp;or&nbsp;the&nbsp;empty&nbsp;string&nbsp;if&nbsp;it&nbsp;couldn't&nbsp;be&nbsp;found</span></div></li>
+<li><div class="src-line"><a name="a1321"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1322"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;extension&nbsp;to&nbsp;get&nbsp;a&nbsp;language&nbsp;name&nbsp;for</span></div></li>
+<li><div class="src-line"><a name="a1323"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">array&nbsp;</span><span class="src-doc">&nbsp;A&nbsp;lookup&nbsp;array&nbsp;to&nbsp;use&nbsp;instead&nbsp;of&nbsp;the&nbsp;default&nbsp;one</span></div></li>
+<li><div class="src-line"><a name="a1324"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.5</span></div></li>
+<li><div class="src-line"><a name="a1325"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@todo</span><span class="src-doc">&nbsp;Re-think&nbsp;about&nbsp;how&nbsp;this&nbsp;method&nbsp;works&nbsp;(maybe&nbsp;make&nbsp;it&nbsp;private&nbsp;and/or&nbsp;make&nbsp;it</span></div></li>
+<li><div class="src-line"><a name="a1326"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;extension-&gt;lang&nbsp;lookup?)</span></div></li>
+<li><div class="src-line"><a name="a1327"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@todo</span><span class="src-doc">&nbsp;static?</span></div></li>
+<li><div class="src-line"><a name="a1328"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1329"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodget_language_name_from_extension">get_language_name_from_extension</a><span class="src-sym">(</span>&nbsp;<span class="src-var">$extension</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$lookup</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1330"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>&nbsp;<span class="src-sym">!</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$lookup</span><span class="src-sym">)</span>&nbsp;||&nbsp;<span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$lookup</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1331"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$lookup</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a1332"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'actionscript'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'as'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1333"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'ada'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'a'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'ada'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'adb'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'ads'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1334"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'apache'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'conf'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1335"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'asm'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'ash'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'asm'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'inc'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1336"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'asp'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'asp'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1337"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'bash'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'sh'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1338"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'bf'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'bf'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1339"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'c'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'c'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'h'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1340"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'c_mac'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'c'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'h'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1341"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'caddcl'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1342"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'cadlisp'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1343"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'cdfg'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'cdfg'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1344"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'cobol'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'cbl'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1345"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'cpp'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'cpp'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'hpp'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'C'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'H'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'CPP'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'HPP'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1346"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'csharp'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'cs'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1347"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'css'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'css'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1348"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'d'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'d'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1349"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'delphi'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'dpk'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'dpr'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'pp'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'pas'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1350"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'diff'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'diff'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'patch'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1351"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'dos'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'bat'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'cmd'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1352"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'gettext'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'po'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'pot'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1353"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'gml'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'gml'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1354"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'gnuplot'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'plt'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1355"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'groovy'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'groovy'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1356"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'haskell'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'hs'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1357"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'html4strict'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'html'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'htm'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1358"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'ini'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'ini'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'desktop'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1359"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'java'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'java'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1360"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'javascript'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'js'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1361"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'klonec'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'kl1'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1362"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'klonecpp'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'klx'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1363"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'latex'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'tex'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1364"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'lisp'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'lisp'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1365"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'lua'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'lua'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1366"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'matlab'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'m'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1367"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'mpasm'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1368"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'mysql'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'sql'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1369"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'nsis'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1370"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'objc'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1371"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'oobas'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1372"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'oracle8'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1373"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'oracle10'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1374"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'pascal'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'pas'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1375"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'perl'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'pl'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'pm'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1376"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'php'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'php'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'php5'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'phtml'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'phps'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1377"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'povray'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'pov'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1378"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'providex'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'pvc'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'pvx'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1379"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'prolog'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'pl'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1380"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'python'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'py'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1381"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'qbasic'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'bi'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1382"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'reg'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'reg'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1383"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'ruby'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'rb'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1384"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'sas'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'sas'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1385"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'scala'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'scala'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1386"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'scheme'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'scm'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1387"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'scilab'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'sci'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1388"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'smalltalk'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'st'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1389"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'smarty'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1390"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'tcl'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'tcl'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1391"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'vb'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'bas'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1392"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'vbnet'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1393"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'visualfoxpro'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1394"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'whitespace'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'ws'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1395"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'xml'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'xml'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'svg'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1396"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'z80'</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'z80'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'asm'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'inc'</span><span class="src-sym">)</span></span></div></li>
+<li><div class="src-line"><a name="a1397"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1398"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1399"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1400"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$lookup</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$lang</span>&nbsp;=&gt;&nbsp;<span class="src-var">$extensions</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1401"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/in_array">in_array</a><span class="src-sym">(</span><span class="src-var">$extension</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$extensions</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1402"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$lang</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1403"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1404"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1405"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1406"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1407"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1408"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1409"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Given&nbsp;a&nbsp;file&nbsp;name,&nbsp;this&nbsp;method&nbsp;loads&nbsp;its&nbsp;contents&nbsp;in,&nbsp;and&nbsp;attempts</span></div></li>
+<li><div class="src-line"><a name="a1410"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;to&nbsp;set&nbsp;the&nbsp;language&nbsp;automatically.&nbsp;An&nbsp;optional&nbsp;lookup&nbsp;table&nbsp;can&nbsp;be</span></div></li>
+<li><div class="src-line"><a name="a1411"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;passed&nbsp;for&nbsp;looking&nbsp;up&nbsp;the&nbsp;language&nbsp;name.&nbsp;If&nbsp;not&nbsp;specified&nbsp;a&nbsp;default</span></div></li>
+<li><div class="src-line"><a name="a1412"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;table&nbsp;is&nbsp;used</span></div></li>
+<li><div class="src-line"><a name="a1413"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1414"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;language&nbsp;table&nbsp;is&nbsp;in&nbsp;the&nbsp;form</span></div></li>
+<li><div class="src-line"><a name="a1415"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;pre&gt;array(</span></div></li>
+<li><div class="src-line"><a name="a1416"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;'lang_name'&nbsp;=&gt;&nbsp;array('extension',&nbsp;'extension',&nbsp;...),</span></div></li>
+<li><div class="src-line"><a name="a1417"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;'lang_name'&nbsp;...</span></div></li>
+<li><div class="src-line"><a name="a1418"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;);&lt;/pre&gt;</span></div></li>
+<li><div class="src-line"><a name="a1419"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1420"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;filename&nbsp;to&nbsp;load&nbsp;the&nbsp;source&nbsp;from</span></div></li>
+<li><div class="src-line"><a name="a1421"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">array&nbsp;</span><span class="src-doc">&nbsp;A&nbsp;lookup&nbsp;array&nbsp;to&nbsp;use&nbsp;instead&nbsp;of&nbsp;the&nbsp;default&nbsp;one</span></div></li>
+<li><div class="src-line"><a name="a1422"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@todo</span><span class="src-doc">&nbsp;Complete&nbsp;rethink&nbsp;of&nbsp;this&nbsp;and&nbsp;above&nbsp;method</span></div></li>
+<li><div class="src-line"><a name="a1423"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.5</span></div></li>
+<li><div class="src-line"><a name="a1424"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1425"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodload_from_file">load_from_file</a><span class="src-sym">(</span><span class="src-var">$file_name</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$lookup</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1426"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/is_readable">is_readable</a><span class="src-sym">(</span><span class="src-var">$file_name</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1427"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodset_source">set_source</a><span class="src-sym">(</span><a href="http://www.php.net/file_get_contents">file_get_contents</a><span class="src-sym">(</span><span class="src-var">$file_name</span><span class="src-sym">))</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1428"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodset_language">set_language</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodget_language_name_from_extension">get_language_name_from_extension</a><span class="src-sym">(</span><a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><a href="http://www.php.net/strrchr">strrchr</a><span class="src-sym">(</span><span class="src-var">$file_name</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'.'</span><span class="src-sym">)</span><span class="src-sym">,</span>&nbsp;<span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$lookup</span><span class="src-sym">))</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1429"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1430"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">error</span>&nbsp;=&nbsp;<span class="src-id">GESHI_ERROR_FILE_NOT_READABLE</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1431"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1432"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1433"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1434"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1435"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Adds&nbsp;a&nbsp;keyword&nbsp;to&nbsp;a&nbsp;keyword&nbsp;group&nbsp;for&nbsp;highlighting</span></div></li>
+<li><div class="src-line"><a name="a1436"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1437"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">&nbsp;&nbsp;&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;keyword&nbsp;group&nbsp;to&nbsp;add&nbsp;the&nbsp;keyword&nbsp;to</span></div></li>
+<li><div class="src-line"><a name="a1438"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;word&nbsp;to&nbsp;add&nbsp;to&nbsp;the&nbsp;keyword&nbsp;group</span></div></li>
+<li><div class="src-line"><a name="a1439"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1440"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1441"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodadd_keyword">add_keyword</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$word</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1442"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><a href="http://www.php.net/in_array">in_array</a><span class="src-sym">(</span><span class="src-var">$word</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1443"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$word</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1444"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1445"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//NEW&nbsp;in&nbsp;1.0.8&nbsp;don't&nbsp;recompile&nbsp;the&nbsp;whole&nbsp;optimized&nbsp;regexp,&nbsp;simply&nbsp;append&nbsp;it</span></span></div></li>
+<li><div class="src-line"><a name="a1446"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">parse_cache_built</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1447"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$subkey</span>&nbsp;=&nbsp;<a href="http://www.php.net/count">count</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'CACHED_KEYWORD_LISTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;-&nbsp;<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1448"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'CACHED_KEYWORD_LISTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$subkey</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-str">'|'</span>&nbsp;.&nbsp;<a href="http://www.php.net/preg_quote">preg_quote</a><span class="src-sym">(</span><span class="src-var">$word</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'/'</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1449"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1450"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1451"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1452"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1453"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1454"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Removes&nbsp;a&nbsp;keyword&nbsp;from&nbsp;a&nbsp;keyword&nbsp;group</span></div></li>
+<li><div class="src-line"><a name="a1455"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1456"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">&nbsp;&nbsp;&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;keyword&nbsp;group&nbsp;to&nbsp;remove&nbsp;the&nbsp;keyword&nbsp;from</span></div></li>
+<li><div class="src-line"><a name="a1457"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;word&nbsp;to&nbsp;remove&nbsp;from&nbsp;the&nbsp;keyword&nbsp;group</span></div></li>
+<li><div class="src-line"><a name="a1458"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">bool&nbsp;</span><span class="src-doc">&nbsp;&nbsp;Wether&nbsp;to&nbsp;automatically&nbsp;recompile&nbsp;the&nbsp;optimized&nbsp;regexp&nbsp;list&nbsp;or&nbsp;not.</span></div></li>
+<li><div class="src-line"><a name="a1459"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Note:&nbsp;if&nbsp;you&nbsp;set&nbsp;this&nbsp;to&nbsp;false&nbsp;and&nbsp;@see&nbsp;GeSHi-&gt;parse_code()&nbsp;was&nbsp;already&nbsp;called&nbsp;once,</span></div></li>
+<li><div class="src-line"><a name="a1460"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;the&nbsp;current&nbsp;language,&nbsp;you&nbsp;have&nbsp;to&nbsp;manually&nbsp;call&nbsp;@see&nbsp;GeSHi-&gt;optimize_keyword_group()</span></div></li>
+<li><div class="src-line"><a name="a1461"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;the&nbsp;removed&nbsp;keyword&nbsp;will&nbsp;stay&nbsp;in&nbsp;cache&nbsp;and&nbsp;still&nbsp;be&nbsp;highlighted!&nbsp;On&nbsp;the&nbsp;other&nbsp;hand</span></div></li>
+<li><div class="src-line"><a name="a1462"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;might&nbsp;be&nbsp;too&nbsp;expensive&nbsp;to&nbsp;recompile&nbsp;the&nbsp;regexp&nbsp;list&nbsp;for&nbsp;every&nbsp;removal&nbsp;if&nbsp;you&nbsp;want&nbsp;to</span></div></li>
+<li><div class="src-line"><a name="a1463"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove&nbsp;a&nbsp;lot&nbsp;of&nbsp;keywords.</span></div></li>
+<li><div class="src-line"><a name="a1464"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1465"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1466"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodremove_keyword">remove_keyword</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$word</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$recompile</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1467"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$key_to_remove</span>&nbsp;=&nbsp;<a href="http://www.php.net/array_search">array_search</a><span class="src-sym">(</span><span class="src-var">$word</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1468"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$key_to_remove</span>&nbsp;!==&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1469"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key_to_remove</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1470"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1471"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//NEW&nbsp;in&nbsp;1.0.8,&nbsp;optionally&nbsp;recompile&nbsp;keyword&nbsp;group</span></span></div></li>
+<li><div class="src-line"><a name="a1472"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$recompile</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">parse_cache_built</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1473"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodoptimize_keyword_group">optimize_keyword_group</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1474"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1475"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1476"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1477"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1478"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1479"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Creates&nbsp;a&nbsp;new&nbsp;keyword&nbsp;group</span></div></li>
+<li><div class="src-line"><a name="a1480"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1481"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">&nbsp;&nbsp;&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;keyword&nbsp;group&nbsp;to&nbsp;create</span></div></li>
+<li><div class="src-line"><a name="a1482"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;styles&nbsp;for&nbsp;the&nbsp;keyword&nbsp;group</span></div></li>
+<li><div class="src-line"><a name="a1483"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Whether&nbsp;the&nbsp;keyword&nbsp;group&nbsp;is&nbsp;case&nbsp;sensitive&nbsp;ornot</span></div></li>
+<li><div class="src-line"><a name="a1484"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">array&nbsp;</span><span class="src-doc">&nbsp;The&nbsp;words&nbsp;to&nbsp;use&nbsp;for&nbsp;the&nbsp;keyword&nbsp;group</span></div></li>
+<li><div class="src-line"><a name="a1485"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1486"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1487"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodadd_keyword_group">add_keyword_group</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$styles</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$case_sensitive</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$words</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1488"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$words</span>&nbsp;=&nbsp;(array)&nbsp;<span class="src-var">$words</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1489"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$words</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1490"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;empty&nbsp;word&nbsp;lists&nbsp;mess&nbsp;up&nbsp;highlighting</span></span></div></li>
+<li><div class="src-line"><a name="a1491"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1492"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1493"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1494"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Add&nbsp;the&nbsp;new&nbsp;keyword&nbsp;group&nbsp;internally</span></span></div></li>
+<li><div class="src-line"><a name="a1495"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$words</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1496"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1497"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'CASE_SENSITIVE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$case_sensitive</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1498"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$styles</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1499"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1500"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//NEW&nbsp;in&nbsp;1.0.8,&nbsp;cache&nbsp;keyword&nbsp;regexp</span></span></div></li>
+<li><div class="src-line"><a name="a1501"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">parse_cache_built</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1502"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodoptimize_keyword_group">optimize_keyword_group</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1503"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1504"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1505"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1506"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1507"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Removes&nbsp;a&nbsp;keyword&nbsp;group</span></div></li>
+<li><div class="src-line"><a name="a1508"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1509"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">&nbsp;&nbsp;&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;keyword&nbsp;group&nbsp;to&nbsp;remove</span></div></li>
+<li><div class="src-line"><a name="a1510"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1511"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1512"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodremove_keyword_group">remove_keyword_group</a>&nbsp;<span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1513"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Remove&nbsp;the&nbsp;keyword&nbsp;group&nbsp;internally</span></span></div></li>
+<li><div class="src-line"><a name="a1514"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1515"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1516"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'CASE_SENSITIVE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1517"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1518"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1519"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//NEW&nbsp;in&nbsp;1.0.8</span></span></div></li>
+<li><div class="src-line"><a name="a1520"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'CACHED_KEYWORD_LISTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1521"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1522"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1523"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1524"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;compile&nbsp;optimized&nbsp;regexp&nbsp;list&nbsp;for&nbsp;keyword&nbsp;group</span></div></li>
+<li><div class="src-line"><a name="a1525"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1526"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">&nbsp;&nbsp;The&nbsp;key&nbsp;of&nbsp;the&nbsp;keyword&nbsp;group&nbsp;to&nbsp;compile&nbsp;&amp;&nbsp;optimize</span></div></li>
+<li><div class="src-line"><a name="a1527"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.8</span></div></li>
+<li><div class="src-line"><a name="a1528"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1529"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodoptimize_keyword_group">optimize_keyword_group</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1530"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'CACHED_KEYWORD_LISTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=</span></div></li>
+<li><div class="src-line"><a name="a1531"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">optimize_regexp_list</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1532"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1533"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1534"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1535"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;content&nbsp;of&nbsp;the&nbsp;header&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a1536"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1537"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;content&nbsp;of&nbsp;the&nbsp;header&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a1538"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1539"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1540"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_header_content">set_header_content</a><span class="src-sym">(</span><span class="src-var">$content</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1541"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">header_content</span>&nbsp;=&nbsp;<span class="src-var">$content</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1542"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1543"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1544"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1545"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;content&nbsp;of&nbsp;the&nbsp;footer&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a1546"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1547"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;content&nbsp;of&nbsp;the&nbsp;footer&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a1548"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1549"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1550"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_footer_content">set_footer_content</a><span class="src-sym">(</span><span class="src-var">$content</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1551"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">footer_content</span>&nbsp;=&nbsp;<span class="src-var">$content</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1552"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1553"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1554"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1555"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;style&nbsp;for&nbsp;the&nbsp;header&nbsp;content</span></div></li>
+<li><div class="src-line"><a name="a1556"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1557"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;style&nbsp;for&nbsp;the&nbsp;header&nbsp;content</span></div></li>
+<li><div class="src-line"><a name="a1558"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1559"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1560"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_header_content_style">set_header_content_style</a><span class="src-sym">(</span><span class="src-var">$style</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1561"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">header_content_style</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1562"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1563"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1564"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1565"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;style&nbsp;for&nbsp;the&nbsp;footer&nbsp;content</span></div></li>
+<li><div class="src-line"><a name="a1566"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1567"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;style&nbsp;for&nbsp;the&nbsp;footer&nbsp;content</span></div></li>
+<li><div class="src-line"><a name="a1568"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1569"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1570"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_footer_content_style">set_footer_content_style</a><span class="src-sym">(</span><span class="src-var">$style</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1571"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">footer_content_style</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1572"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1573"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1574"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1575"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;whether&nbsp;to&nbsp;force&nbsp;a&nbsp;surrounding&nbsp;block&nbsp;around</span></div></li>
+<li><div class="src-line"><a name="a1576"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;highlighted&nbsp;code&nbsp;or&nbsp;not</span></div></li>
+<li><div class="src-line"><a name="a1577"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1578"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Tells&nbsp;whether&nbsp;to&nbsp;enable&nbsp;or&nbsp;disable&nbsp;this&nbsp;feature</span></div></li>
+<li><div class="src-line"><a name="a1579"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.7.20</span></div></li>
+<li><div class="src-line"><a name="a1580"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1581"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodenable_inner_code_block">enable_inner_code_block</a><span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1582"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">force_code_block</span>&nbsp;=&nbsp;(bool)<span class="src-var">$flag</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1583"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1584"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1585"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1586"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;base&nbsp;URL&nbsp;to&nbsp;be&nbsp;used&nbsp;for&nbsp;keywords</span></div></li>
+<li><div class="src-line"><a name="a1587"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1588"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">The&nbsp;key&nbsp;of&nbsp;the&nbsp;keyword&nbsp;group&nbsp;to&nbsp;set&nbsp;the&nbsp;URL&nbsp;for</span></div></li>
+<li><div class="src-line"><a name="a1589"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;URL&nbsp;to&nbsp;set&nbsp;for&nbsp;the&nbsp;group.&nbsp;If&nbsp;{FNAME}&nbsp;is&nbsp;in</span></div></li>
+<li><div class="src-line"><a name="a1590"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;url&nbsp;somewhere,&nbsp;it&nbsp;is&nbsp;replaced&nbsp;by&nbsp;the&nbsp;keyword</span></div></li>
+<li><div class="src-line"><a name="a1591"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;that&nbsp;the&nbsp;URL&nbsp;is&nbsp;being&nbsp;made&nbsp;for</span></div></li>
+<li><div class="src-line"><a name="a1592"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1593"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1594"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_url_for_keyword_group">set_url_for_keyword_group</a><span class="src-sym">(</span><span class="src-var">$group</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$url</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1595"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'URLS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$group</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$url</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1596"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1597"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1598"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1599"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;styles&nbsp;for&nbsp;links&nbsp;in&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a1600"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1601"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">A&nbsp;constant&nbsp;that&nbsp;specifies&nbsp;what&nbsp;state&nbsp;the&nbsp;style&nbsp;is&nbsp;being</span></div></li>
+<li><div class="src-line"><a name="a1602"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;for&nbsp;-&nbsp;e.g.&nbsp;:hover&nbsp;or&nbsp;:visited</span></div></li>
+<li><div class="src-line"><a name="a1603"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;styles&nbsp;to&nbsp;use&nbsp;for&nbsp;that&nbsp;state</span></div></li>
+<li><div class="src-line"><a name="a1604"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1605"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1606"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_link_styles">set_link_styles</a><span class="src-sym">(</span><span class="src-var">$type</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$styles</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1607"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">link_styles</span><span class="src-sym">[</span><span class="src-var">$type</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$styles</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1608"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1609"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1610"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1611"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;target&nbsp;for&nbsp;links&nbsp;in&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a1612"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1613"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;target&nbsp;for&nbsp;links&nbsp;in&nbsp;the&nbsp;code,&nbsp;e.g.&nbsp;_blank</span></div></li>
+<li><div class="src-line"><a name="a1614"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.3</span></div></li>
+<li><div class="src-line"><a name="a1615"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1616"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_link_target">set_link_target</a><span class="src-sym">(</span><span class="src-var">$target</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1617"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$target</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1618"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">link_target</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1619"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1620"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">link_target</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;target=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$target</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&nbsp;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1621"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1622"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1623"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1624"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1625"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;styles&nbsp;for&nbsp;important&nbsp;parts&nbsp;of&nbsp;the&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a1626"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1627"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;styles&nbsp;to&nbsp;use&nbsp;on&nbsp;important&nbsp;parts&nbsp;of&nbsp;the&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a1628"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1629"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1630"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_important_styles">set_important_styles</a><span class="src-sym">(</span><span class="src-var">$styles</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1631"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">important_styles</span>&nbsp;=&nbsp;<span class="src-var">$styles</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1632"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1633"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1634"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1635"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;whether&nbsp;context-important&nbsp;blocks&nbsp;are&nbsp;highlighted</span></div></li>
+<li><div class="src-line"><a name="a1636"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1637"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">Tells&nbsp;whether&nbsp;to&nbsp;enable&nbsp;or&nbsp;disable&nbsp;highlighting&nbsp;of&nbsp;important&nbsp;blocks</span></div></li>
+<li><div class="src-line"><a name="a1638"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@todo</span><span class="src-doc">&nbsp;REMOVE&nbsp;THIS&nbsp;SHIZ&nbsp;FROM&nbsp;GESHI!</span></div></li>
+<li><div class="src-line"><a name="a1639"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@deprecated</span></div></li>
+<li><div class="src-line"><a name="a1640"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1641"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1642"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodenable_important_blocks">enable_important_blocks</a><span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1643"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">enable_important_blocks</span>&nbsp;=&nbsp;<span class="src-sym">(</span>&nbsp;<span class="src-var">$flag</span>&nbsp;<span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1644"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1645"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1646"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1647"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Whether&nbsp;CSS&nbsp;IDs&nbsp;should&nbsp;be&nbsp;added&nbsp;to&nbsp;each&nbsp;line</span></div></li>
+<li><div class="src-line"><a name="a1648"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1649"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">If&nbsp;true,&nbsp;IDs&nbsp;will&nbsp;be&nbsp;added&nbsp;to&nbsp;each&nbsp;line.</span></div></li>
+<li><div class="src-line"><a name="a1650"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1651"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1652"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodenable_ids">enable_ids</a><span class="src-sym">(</span><span class="src-var">$flag</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1653"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">add_ids</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$flag</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-id">true</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1654"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1655"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1656"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1657"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Specifies&nbsp;which&nbsp;lines&nbsp;to&nbsp;highlight&nbsp;extra</span></div></li>
+<li><div class="src-line"><a name="a1658"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1659"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;extra&nbsp;style&nbsp;parameter&nbsp;was&nbsp;added&nbsp;in&nbsp;1.0.7.21.</span></div></li>
+<li><div class="src-line"><a name="a1660"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1661"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">mixed&nbsp;</span><span class="src-doc">An&nbsp;array&nbsp;of&nbsp;line&nbsp;numbers&nbsp;to&nbsp;highlight,&nbsp;or&nbsp;just&nbsp;a&nbsp;line</span></div></li>
+<li><div class="src-line"><a name="a1662"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;number&nbsp;on&nbsp;its&nbsp;own.</span></div></li>
+<li><div class="src-line"><a name="a1663"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">A&nbsp;string&nbsp;specifying&nbsp;the&nbsp;style&nbsp;to&nbsp;use&nbsp;for&nbsp;this&nbsp;line.</span></div></li>
+<li><div class="src-line"><a name="a1664"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;null&nbsp;is&nbsp;specified,&nbsp;the&nbsp;default&nbsp;style&nbsp;is&nbsp;used.</span></div></li>
+<li><div class="src-line"><a name="a1665"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;false&nbsp;is&nbsp;specified,&nbsp;the&nbsp;line&nbsp;will&nbsp;be&nbsp;removed&nbsp;from</span></div></li>
+<li><div class="src-line"><a name="a1666"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;special&nbsp;highlighting</span></div></li>
+<li><div class="src-line"><a name="a1667"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1668"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@todo</span><span class="src-doc">&nbsp;&nbsp;Some&nbsp;data&nbsp;replication&nbsp;here&nbsp;that&nbsp;could&nbsp;be&nbsp;cut&nbsp;down&nbsp;on</span></div></li>
+<li><div class="src-line"><a name="a1669"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1670"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodhighlight_lines_extra">highlight_lines_extra</a><span class="src-sym">(</span><span class="src-var">$lines</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$style</span>&nbsp;=&nbsp;<span class="src-id">null</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1671"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$lines</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1672"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Split&nbsp;up&nbsp;the&nbsp;job&nbsp;using&nbsp;single&nbsp;lines&nbsp;at&nbsp;a&nbsp;time</span></span></div></li>
+<li><div class="src-line"><a name="a1673"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$lines</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$line</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1674"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodhighlight_lines_extra">highlight_lines_extra</a><span class="src-sym">(</span><span class="src-var">$line</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$style</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1675"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1676"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1677"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Mark&nbsp;the&nbsp;line&nbsp;as&nbsp;being&nbsp;highlighted&nbsp;specially</span></span></div></li>
+<li><div class="src-line"><a name="a1678"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$lines</span>&nbsp;=&nbsp;<a href="http://www.php.net/intval">intval</a><span class="src-sym">(</span><span class="src-var">$lines</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1679"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">highlight_extra_lines</span><span class="src-sym">[</span><span class="src-var">$lines</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$lines</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1680"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1681"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Decide&nbsp;on&nbsp;which&nbsp;style&nbsp;to&nbsp;use</span></span></div></li>
+<li><div class="src-line"><a name="a1682"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$style</span>&nbsp;===&nbsp;<span class="src-id">null</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span>&nbsp;<span class="src-comm">//Check&nbsp;if&nbsp;we&nbsp;should&nbsp;use&nbsp;default&nbsp;style</span></span></div></li>
+<li><div class="src-line"><a name="a1683"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">highlight_extra_lines_styles</span><span class="src-sym">[</span><span class="src-var">$lines</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1684"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$style</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span>&nbsp;<span class="src-comm">//Check&nbsp;if&nbsp;to&nbsp;remove&nbsp;this&nbsp;line</span></span></div></li>
+<li><div class="src-line"><a name="a1685"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">highlight_extra_lines</span><span class="src-sym">[</span><span class="src-var">$lines</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1686"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">highlight_extra_lines_styles</span><span class="src-sym">[</span><span class="src-var">$lines</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1687"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1688"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">highlight_extra_lines_styles</span><span class="src-sym">[</span><span class="src-var">$lines</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$style</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1689"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1690"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1691"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1692"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1693"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1694"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;style&nbsp;for&nbsp;extra-highlighted&nbsp;lines</span></div></li>
+<li><div class="src-line"><a name="a1695"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1696"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;style&nbsp;for&nbsp;extra-highlighted&nbsp;lines</span></div></li>
+<li><div class="src-line"><a name="a1697"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1698"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1699"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_highlight_lines_extra_style">set_highlight_lines_extra_style</a><span class="src-sym">(</span><span class="src-var">$styles</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1700"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">highlight_extra_lines_style</span>&nbsp;=&nbsp;<span class="src-var">$styles</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1701"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1702"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1703"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1704"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;line-ending</span></div></li>
+<li><div class="src-line"><a name="a1705"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1706"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;new&nbsp;line-ending</span></div></li>
+<li><div class="src-line"><a name="a1707"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1708"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1709"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_line_ending">set_line_ending</a><span class="src-sym">(</span><span class="src-var">$line_ending</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1710"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">line_ending</span>&nbsp;=&nbsp;(string)<span class="src-var">$line_ending</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1711"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1712"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1713"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1714"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;what&nbsp;number&nbsp;line&nbsp;numbers&nbsp;should&nbsp;start&nbsp;at.&nbsp;Should</span></div></li>
+<li><div class="src-line"><a name="a1715"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;be&nbsp;a&nbsp;positive&nbsp;integer,&nbsp;and&nbsp;will&nbsp;be&nbsp;converted&nbsp;to&nbsp;one.</span></div></li>
+<li><div class="src-line"><a name="a1716"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1717"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;b&gt;Warning:&lt;/b&gt;&nbsp;Using&nbsp;this&nbsp;method&nbsp;will&nbsp;add&nbsp;the&nbsp;&quot;start&quot;</span></div></li>
+<li><div class="src-line"><a name="a1718"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;attribute&nbsp;to&nbsp;the&nbsp;&amp;lt;ol&amp;gt;&nbsp;that&nbsp;is&nbsp;used&nbsp;for&nbsp;line&nbsp;numbering.</span></div></li>
+<li><div class="src-line"><a name="a1719"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;is&nbsp;&lt;b&gt;not&lt;/b&gt;&nbsp;valid&nbsp;XHTML&nbsp;strict,&nbsp;so&nbsp;if&nbsp;that's&nbsp;what&nbsp;you</span></div></li>
+<li><div class="src-line"><a name="a1720"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;care&nbsp;about&nbsp;then&nbsp;don't&nbsp;use&nbsp;this&nbsp;method.&nbsp;Firefox&nbsp;is&nbsp;getting</span></div></li>
+<li><div class="src-line"><a name="a1721"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;support&nbsp;for&nbsp;the&nbsp;CSS&nbsp;method&nbsp;of&nbsp;doing&nbsp;this&nbsp;in&nbsp;1.1&nbsp;and&nbsp;Opera</span></div></li>
+<li><div class="src-line"><a name="a1722"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;has&nbsp;support&nbsp;for&nbsp;the&nbsp;CSS&nbsp;method,&nbsp;but&nbsp;(of&nbsp;course)&nbsp;IE&nbsp;doesn't</span></div></li>
+<li><div class="src-line"><a name="a1723"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;so&nbsp;it's&nbsp;not&nbsp;worth&nbsp;doing&nbsp;it&nbsp;the&nbsp;CSS&nbsp;way&nbsp;yet.</span></div></li>
+<li><div class="src-line"><a name="a1724"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1725"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">int&nbsp;</span><span class="src-doc">The&nbsp;number&nbsp;to&nbsp;start&nbsp;line&nbsp;numbers&nbsp;at</span></div></li>
+<li><div class="src-line"><a name="a1726"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1727"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1728"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodstart_line_numbers_at">start_line_numbers_at</a><span class="src-sym">(</span><span class="src-var">$number</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1729"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">line_numbers_start</span>&nbsp;=&nbsp;<a href="http://www.php.net/abs">abs</a><span class="src-sym">(</span><a href="http://www.php.net/intval">intval</a><span class="src-sym">(</span><span class="src-var">$number</span><span class="src-sym">))</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1730"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1731"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1732"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1733"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;encoding&nbsp;used&nbsp;for&nbsp;htmlspecialchars(),&nbsp;for&nbsp;international</span></div></li>
+<li><div class="src-line"><a name="a1734"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;support.</span></div></li>
+<li><div class="src-line"><a name="a1735"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1736"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;NOTE:&nbsp;This&nbsp;is&nbsp;not&nbsp;needed&nbsp;for&nbsp;now&nbsp;because&nbsp;htmlspecialchars()&nbsp;is&nbsp;not</span></div></li>
+<li><div class="src-line"><a name="a1737"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;being&nbsp;used&nbsp;(it&nbsp;has&nbsp;a&nbsp;security&nbsp;hole&nbsp;in&nbsp;PHP4&nbsp;that&nbsp;has&nbsp;not&nbsp;been&nbsp;patched).</span></div></li>
+<li><div class="src-line"><a name="a1738"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Maybe&nbsp;in&nbsp;a&nbsp;future&nbsp;version&nbsp;it&nbsp;may&nbsp;make&nbsp;a&nbsp;return&nbsp;for&nbsp;speed&nbsp;reasons,&nbsp;but</span></div></li>
+<li><div class="src-line"><a name="a1739"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;I&nbsp;doubt&nbsp;it.</span></div></li>
+<li><div class="src-line"><a name="a1740"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1741"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;encoding&nbsp;to&nbsp;use&nbsp;for&nbsp;the&nbsp;source</span></div></li>
+<li><div class="src-line"><a name="a1742"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.3</span></div></li>
+<li><div class="src-line"><a name="a1743"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1744"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodset_encoding">set_encoding</a><span class="src-sym">(</span><span class="src-var">$encoding</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1745"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$encoding</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1746"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">encoding</span>&nbsp;=&nbsp;<a href="http://www.php.net/strtolower">strtolower</a><span class="src-sym">(</span><span class="src-var">$encoding</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1747"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1748"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1749"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1750"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1751"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Turns&nbsp;linking&nbsp;of&nbsp;keywords&nbsp;on&nbsp;or&nbsp;off.</span></div></li>
+<li><div class="src-line"><a name="a1752"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1753"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">boolean&nbsp;</span><span class="src-doc">If&nbsp;true,&nbsp;links&nbsp;will&nbsp;be&nbsp;added&nbsp;to&nbsp;keywords</span></div></li>
+<li><div class="src-line"><a name="a1754"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a1755"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1756"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodenable_keyword_links">enable_keyword_links</a><span class="src-sym">(</span><span class="src-var">$enable</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1757"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">keyword_links</span>&nbsp;=&nbsp;(bool)&nbsp;<span class="src-var">$enable</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1758"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1759"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1760"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1761"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Setup&nbsp;caches&nbsp;needed&nbsp;for&nbsp;styling.&nbsp;This&nbsp;is&nbsp;automatically&nbsp;called&nbsp;in</span></div></li>
+<li><div class="src-line"><a name="a1762"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;parse_code()&nbsp;and&nbsp;get_stylesheet()&nbsp;when&nbsp;appropriate.&nbsp;This&nbsp;function&nbsp;helps</span></div></li>
+<li><div class="src-line"><a name="a1763"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;stylesheet&nbsp;generators&nbsp;as&nbsp;they&nbsp;rely&nbsp;on&nbsp;some&nbsp;style&nbsp;information&nbsp;being</span></div></li>
+<li><div class="src-line"><a name="a1764"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;preprocessed</span></div></li>
+<li><div class="src-line"><a name="a1765"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1766"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.8</span></div></li>
+<li><div class="src-line"><a name="a1767"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@access</span><span class="src-doc">&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a1768"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1769"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">build_style_cache</span><span class="src-sym">(</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1770"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Build&nbsp;the&nbsp;style&nbsp;cache&nbsp;needed&nbsp;to&nbsp;highlight&nbsp;numbers&nbsp;appropriate</span></span></div></li>
+<li><div class="src-line"><a name="a1771"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1772"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//First&nbsp;check&nbsp;what&nbsp;way&nbsp;highlighting&nbsp;information&nbsp;for&nbsp;numbers&nbsp;are&nbsp;given</span></span></div></li>
+<li><div class="src-line"><a name="a1773"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1774"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1775"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1776"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1777"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1778"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS_CACHE'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1779"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1780"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS_CACHE'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1781"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1782"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span>&nbsp;=</span></div></li>
+<li><div class="src-line"><a name="a1783"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_INT_BASIC</span>&nbsp;|</span></div></li>
+<li><div class="src-line"><a name="a1784"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_FLT_NONSCI</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1785"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1786"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1787"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for</span><span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$j</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$j</span>&nbsp;>&nbsp;<span class="src-num">0</span><span class="src-sym">;</span>&nbsp;++<span class="src-var">$i</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$j</span>&gt;&gt;=<span class="src-num">1</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1788"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Rearrange&nbsp;style&nbsp;indices&nbsp;if&nbsp;required&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a1789"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span>&lt;&lt;<span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1790"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span>&nbsp;=</span></div></li>
+<li><div class="src-line"><a name="a1791"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span>&lt;&lt;<span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1792"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span>&lt;&lt;<span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1793"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1794"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1795"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Check&nbsp;if&nbsp;this&nbsp;bit&nbsp;is&nbsp;set&nbsp;for&nbsp;highlighting</span></span></div></li>
+<li><div class="src-line"><a name="a1796"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-var">$j</span><span class="src-sym">&</span><span class="src-num">1</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1797"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//So&nbsp;this&nbsp;bit&nbsp;is&nbsp;set&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a1798"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Check&nbsp;if&nbsp;it&nbsp;belongs&nbsp;to&nbsp;group&nbsp;0&nbsp;or&nbsp;the&nbsp;actual&nbsp;stylegroup</span></span></div></li>
+<li><div class="src-line"><a name="a1799"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1800"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS_CACHE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-num">1</span>&nbsp;&lt;&lt;&nbsp;<span class="src-var">$i</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1801"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1802"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS_CACHE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1803"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS_CACHE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1804"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1805"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS_CACHE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;|=&nbsp;<span class="src-num">1</span>&nbsp;&lt;&lt;&nbsp;<span class="src-var">$i</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1806"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1807"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1808"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1809"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1810"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1811"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1812"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1813"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a1814"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Setup&nbsp;caches&nbsp;needed&nbsp;for&nbsp;parsing.&nbsp;This&nbsp;is&nbsp;automatically&nbsp;called&nbsp;in&nbsp;parse_code()&nbsp;when&nbsp;appropriate.</span></div></li>
+<li><div class="src-line"><a name="a1815"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;function&nbsp;makes&nbsp;stylesheet&nbsp;generators&nbsp;much&nbsp;faster&nbsp;as&nbsp;they&nbsp;do&nbsp;not&nbsp;need&nbsp;these&nbsp;caches.</span></div></li>
+<li><div class="src-line"><a name="a1816"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1817"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.8</span></div></li>
+<li><div class="src-line"><a name="a1818"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@access</span><span class="src-doc">&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a1819"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a1820"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">build_parse_cache</span><span class="src-sym">(</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1821"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;cache&nbsp;symbol&nbsp;regexp</span></span></div></li>
+<li><div class="src-line"><a name="a1822"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//As&nbsp;this&nbsp;is&nbsp;a&nbsp;costy&nbsp;operation,&nbsp;we&nbsp;avoid&nbsp;doing&nbsp;it&nbsp;for&nbsp;multiple&nbsp;groups&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a1823"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Instead&nbsp;we&nbsp;perform&nbsp;it&nbsp;for&nbsp;all&nbsp;symbols&nbsp;at&nbsp;once.</span></span></div></li>
+<li><div class="src-line"><a name="a1824"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//</span></span></div></li>
+<li><div class="src-line"><a name="a1825"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//For&nbsp;this&nbsp;to&nbsp;work,&nbsp;we&nbsp;need&nbsp;to&nbsp;reorganize&nbsp;the&nbsp;data&nbsp;arrays.</span></span></div></li>
+<li><div class="src-line"><a name="a1826"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'SYMBOLS'</span><span class="src-sym">]</span>&nbsp;&amp;&amp;&nbsp;<span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOLS'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1827"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'MULTIPLE_SYMBOL_GROUPS'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<a href="http://www.php.net/count">count</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'SYMBOLS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;>&nbsp;<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1828"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1829"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOL_DATA'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1830"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_preg_multi</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span>&nbsp;<span class="src-comm">//&nbsp;multi&nbsp;char&nbsp;symbols</span></span></div></li>
+<li><div class="src-line"><a name="a1831"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_preg_single</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span>&nbsp;<span class="src-comm">//&nbsp;single&nbsp;char&nbsp;symbols</span></span></div></li>
+<li><div class="src-line"><a name="a1832"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOLS'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span>&nbsp;=&gt;&nbsp;<span class="src-var">$symbols</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1833"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$symbols</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1834"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$symbols</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$sym</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1835"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$sym</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$sym</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1836"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOL_DATA'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$sym</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1837"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOL_DATA'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$sym</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$key</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1838"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$sym</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span>&nbsp;<span class="src-comm">//&nbsp;multiple&nbsp;chars</span></span></div></li>
+<li><div class="src-line"><a name="a1839"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_preg_multi</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_quote">preg_quote</a><span class="src-sym">(</span><span class="src-var">$sym</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'/'</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1840"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span>&nbsp;<span class="src-comm">//&nbsp;single&nbsp;char</span></span></div></li>
+<li><div class="src-line"><a name="a1841"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$sym</span>&nbsp;==&nbsp;<span class="src-str">'-'</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1842"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;don't&nbsp;trigger&nbsp;range&nbsp;out&nbsp;of&nbsp;order&nbsp;error</span></span></div></li>
+<li><div class="src-line"><a name="a1843"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_preg_single</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'\-'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1844"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1845"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_preg_single</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_quote">preg_quote</a><span class="src-sym">(</span><span class="src-var">$sym</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'/'</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1846"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1847"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1848"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1849"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1850"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1851"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbols</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$symbols</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1852"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOL_DATA'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$symbols</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1853"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOL_DATA'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$symbols</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1854"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$symbols</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span>&nbsp;<span class="src-comm">//&nbsp;multiple&nbsp;chars</span></span></div></li>
+<li><div class="src-line"><a name="a1855"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_preg_multi</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_quote">preg_quote</a><span class="src-sym">(</span><span class="src-var">$symbols</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'/'</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1856"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$symbols</span>&nbsp;==&nbsp;<span class="src-str">'-'</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1857"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;don't&nbsp;trigger&nbsp;range&nbsp;out&nbsp;of&nbsp;order&nbsp;error</span></span></div></li>
+<li><div class="src-line"><a name="a1858"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_preg_single</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'\-'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1859"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span>&nbsp;<span class="src-comm">//&nbsp;single&nbsp;char</span></span></div></li>
+<li><div class="src-line"><a name="a1860"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_preg_single</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_quote">preg_quote</a><span class="src-sym">(</span><span class="src-var">$symbols</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'/'</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1861"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1862"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1863"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1864"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1865"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1866"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Now&nbsp;we&nbsp;have&nbsp;an&nbsp;array&nbsp;with&nbsp;each&nbsp;possible&nbsp;symbol&nbsp;as&nbsp;the&nbsp;key&nbsp;and&nbsp;the&nbsp;style&nbsp;as&nbsp;the&nbsp;actual&nbsp;data.</span></span></div></li>
+<li><div class="src-line"><a name="a1867"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//This&nbsp;way&nbsp;we&nbsp;can&nbsp;set&nbsp;the&nbsp;correct&nbsp;style&nbsp;just&nbsp;the&nbsp;moment&nbsp;we&nbsp;highlight&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a1868"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//</span></span></div></li>
+<li><div class="src-line"><a name="a1869"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Now&nbsp;we&nbsp;need&nbsp;to&nbsp;rewrite&nbsp;our&nbsp;array&nbsp;to&nbsp;get&nbsp;a&nbsp;search&nbsp;string&nbsp;that</span></span></div></li>
+<li><div class="src-line"><a name="a1870"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_preg</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1871"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$symbol_preg_multi</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1872"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/rsort">rsort</a><span class="src-sym">(</span><span class="src-var">$symbol_preg_multi</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1873"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_preg</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<a href="http://www.php.net/implode">implode</a><span class="src-sym">(</span><span class="src-str">'|'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$symbol_preg_multi</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1874"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1875"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$symbol_preg_single</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1876"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/rsort">rsort</a><span class="src-sym">(</span><span class="src-var">$symbol_preg_single</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1877"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_preg</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'['</span>&nbsp;.&nbsp;<a href="http://www.php.net/implode">implode</a><span class="src-sym">(</span><span class="src-str">''</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$symbol_preg_single</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">']'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1878"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1879"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOL_SEARCH'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<a href="http://www.php.net/implode">implode</a><span class="src-sym">(</span><span class="src-str">&quot;|&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$symbol_preg</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1880"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1881"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1882"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;cache&nbsp;optimized&nbsp;regexp&nbsp;for&nbsp;keyword&nbsp;matching</span></span></div></li>
+<li><div class="src-line"><a name="a1883"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;remove&nbsp;old&nbsp;cache</span></span></div></li>
+<li><div class="src-line"><a name="a1884"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'CACHED_KEYWORD_LISTS'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1885"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/array_keys">array_keys</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1886"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a1887"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1888"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodoptimize_keyword_group">optimize_keyword_group</a><span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1889"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1890"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1891"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1892"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;brackets</span></span></div></li>
+<li><div class="src-line"><a name="a1893"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1894"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'CACHE_BRACKET_MATCH'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'['</span><span class="src-sym">,</span>&nbsp;<span class="src-str">']'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'('</span><span class="src-sym">,</span>&nbsp;<span class="src-str">')'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'{'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'}'</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1895"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">use_classes</span>&nbsp;&amp;&amp;&nbsp;isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1896"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'CACHE_BRACKET_REPLACE'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a1897"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;|&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&gt;&amp;#91;|&gt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1898"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;|&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&gt;&amp;#93;|&gt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1899"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;|&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&gt;&amp;#40;|&gt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1900"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;|&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&gt;&amp;#41;|&gt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1901"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;|&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&gt;&amp;#123;|&gt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1902"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;|&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&gt;&amp;#125;|&gt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1903"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1904"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1905"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1906"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'CACHE_BRACKET_REPLACE'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a1907"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;|&nbsp;class=&quot;br0&quot;&gt;&amp;#91;|&gt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1908"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;|&nbsp;class=&quot;br0&quot;&gt;&amp;#93;|&gt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1909"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;|&nbsp;class=&quot;br0&quot;&gt;&amp;#40;|&gt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1910"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;|&nbsp;class=&quot;br0&quot;&gt;&amp;#41;|&gt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1911"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;|&nbsp;class=&quot;br0&quot;&gt;&amp;#123;|&gt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1912"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;|&nbsp;class=&quot;br0&quot;&gt;&amp;#125;|&gt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1913"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1914"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1915"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1916"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1917"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Build&nbsp;the&nbsp;parse&nbsp;cache&nbsp;needed&nbsp;to&nbsp;highlight&nbsp;numbers&nbsp;appropriate</span></span></div></li>
+<li><div class="src-line"><a name="a1918"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1919"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Check&nbsp;if&nbsp;the&nbsp;style&nbsp;rearrangements&nbsp;have&nbsp;been&nbsp;processed&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a1920"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//This&nbsp;also&nbsp;does&nbsp;some&nbsp;preprocessing&nbsp;to&nbsp;check&nbsp;which&nbsp;style&nbsp;groups&nbsp;are&nbsp;useable&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a1921"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS_CACHE'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1922"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">build_style_cache</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1923"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1924"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1925"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Number&nbsp;format&nbsp;specification</span></span></div></li>
+<li><div class="src-line"><a name="a1926"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//All&nbsp;this&nbsp;formats&nbsp;are&nbsp;matched&nbsp;case-insensitively!</span></span></div></li>
+<li><div class="src-line"><a name="a1927"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">static</span>&nbsp;<span class="src-var">$numbers_format</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a1928"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_INT_BASIC</span>&nbsp;=&gt;</span></div></li>
+<li><div class="src-line"><a name="a1929"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'(?&lt;![0-9a-z_\.%])(?&lt;![\d\.]e[+\-])([1-9]\d*?|0)(?![0-9a-z\.])'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1930"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_INT_CSTYLE</span>&nbsp;=&gt;</span></div></li>
+<li><div class="src-line"><a name="a1931"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'(?&lt;![0-9a-z_\.%])(?&lt;![\d\.]e[+\-])([1-9]\d*?|0)l(?![0-9a-z\.])'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1932"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_BIN_SUFFIX</span>&nbsp;=&gt;</span></div></li>
+<li><div class="src-line"><a name="a1933"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'(?&lt;![0-9a-z_\.])(?&lt;![\d\.]e[+\-])[01]+?b(?![0-9a-z\.])'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1934"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_BIN_PREFIX_PERCENT</span>&nbsp;=&gt;</span></div></li>
+<li><div class="src-line"><a name="a1935"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'(?&lt;![0-9a-z_\.%])(?&lt;![\d\.]e[+\-])%[01]+?(?![0-9a-z\.])'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1936"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_BIN_PREFIX_0B</span>&nbsp;=&gt;</span></div></li>
+<li><div class="src-line"><a name="a1937"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'(?&lt;![0-9a-z_\.%])(?&lt;![\d\.]e[+\-])0b[01]+?(?![0-9a-z\.])'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1938"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_OCT_PREFIX</span>&nbsp;=&gt;</span></div></li>
+<li><div class="src-line"><a name="a1939"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'(?&lt;![0-9a-z_\.])(?&lt;![\d\.]e[+\-])0[0-7]+?(?![0-9a-z\.])'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1940"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_OCT_SUFFIX</span>&nbsp;=&gt;</span></div></li>
+<li><div class="src-line"><a name="a1941"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'(?&lt;![0-9a-z_\.])(?&lt;![\d\.]e[+\-])[0-7]+?o(?![0-9a-z\.])'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1942"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_HEX_PREFIX</span>&nbsp;=&gt;</span></div></li>
+<li><div class="src-line"><a name="a1943"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'(?&lt;![0-9a-z_\.])(?&lt;![\d\.]e[+\-])0x[0-9a-f]+?(?![0-9a-z\.])'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1944"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_HEX_SUFFIX</span>&nbsp;=&gt;</span></div></li>
+<li><div class="src-line"><a name="a1945"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'(?&lt;![0-9a-z_\.])(?&lt;![\d\.]e[+\-])\d[0-9a-f]*?h(?![0-9a-z\.])'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1946"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_FLT_NONSCI</span>&nbsp;=&gt;</span></div></li>
+<li><div class="src-line"><a name="a1947"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'(?&lt;![0-9a-z_\.])(?&lt;![\d\.]e[+\-])\d+?\.\d+?(?![0-9a-z\.])'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1948"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_FLT_NONSCI_F</span>&nbsp;=&gt;</span></div></li>
+<li><div class="src-line"><a name="a1949"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'(?&lt;![0-9a-z_\.])(?&lt;![\d\.]e[+\-])(?:\d+?(?:\.\d*?)?|\.\d+?)f(?![0-9a-z\.])'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1950"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_FLT_SCI_SHORT</span>&nbsp;=&gt;</span></div></li>
+<li><div class="src-line"><a name="a1951"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'(?&lt;![0-9a-z_\.])(?&lt;![\d\.]e[+\-])\.\d+?(?:e[+\-]?\d+?)?(?![0-9a-z\.])'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a1952"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GESHI_NUMBER_FLT_SCI_ZERO</span>&nbsp;=&gt;</span></div></li>
+<li><div class="src-line"><a name="a1953"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'(?&lt;![0-9a-z_\.])(?&lt;![\d\.]e[+\-])(?:\d+?(?:\.\d*?)?|\.\d+?)(?:e[+\-]?\d+?)?(?![0-9a-z\.])'</span></span></div></li>
+<li><div class="src-line"><a name="a1954"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1955"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1956"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//At&nbsp;this&nbsp;step&nbsp;we&nbsp;have&nbsp;an&nbsp;associative&nbsp;array&nbsp;with&nbsp;flag&nbsp;groups&nbsp;for&nbsp;a</span></span></div></li>
+<li><div class="src-line"><a name="a1957"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//specific&nbsp;style&nbsp;or&nbsp;an&nbsp;string&nbsp;denoting&nbsp;a&nbsp;regexp&nbsp;given&nbsp;its&nbsp;index.</span></span></div></li>
+<li><div class="src-line"><a name="a1958"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS_RXCACHE'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1959"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS_CACHE'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span>&nbsp;=&gt;&nbsp;<span class="src-var">$rxdata</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1960"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-id">is_string</span><span class="src-sym">(</span><span class="src-var">$rxdata</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1961"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$regexp</span>&nbsp;=&nbsp;<span class="src-var">$rxdata</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1962"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1963"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//This&nbsp;is&nbsp;a&nbsp;bitfield&nbsp;of&nbsp;number&nbsp;flags&nbsp;to&nbsp;highlight:</span></span></div></li>
+<li><div class="src-line"><a name="a1964"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Build&nbsp;an&nbsp;array,&nbsp;implode&nbsp;them&nbsp;together&nbsp;and&nbsp;make&nbsp;this&nbsp;the&nbsp;actual&nbsp;RX</span></span></div></li>
+<li><div class="src-line"><a name="a1965"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$rxuse</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1966"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for</span><span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-num">1</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$i</span>&nbsp;&lt;=&nbsp;<span class="src-var">$rxdata</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$i</span>&lt;&lt;=<span class="src-num">1</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1967"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-var">$rxdata</span>&nbsp;<span class="src-sym">&</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1968"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$rxuse</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$numbers_format</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1969"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1970"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1971"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$regexp</span>&nbsp;=&nbsp;<a href="http://www.php.net/implode">implode</a><span class="src-sym">(</span><span class="src-str">&quot;|&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$rxuse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1972"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1973"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1974"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS_RXCACHE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=</span></div></li>
+<li><div class="src-line"><a name="a1975"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">"</span></span>/(?&lt;!&lt;\|\/NUM!)(?&lt;!\d\/&gt;)(<span class="src-var">$regexp</span>)(?!\|&gt;)/i<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1976"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1977"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1978"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1979"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">parse_cache_built</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1980"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a1981"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1982"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;/**</span></div></li>
+<li><div class="src-line"><a name="a1983"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;the&nbsp;code&nbsp;in&nbsp;$this-&gt;source,&nbsp;highlighted&nbsp;and&nbsp;surrounded&nbsp;by&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a1984"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;nessecary&nbsp;HTML.</span></div></li>
+<li><div class="src-line"><a name="a1985"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1986"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;should&nbsp;only&nbsp;be&nbsp;called&nbsp;ONCE,&nbsp;cos&nbsp;it's&nbsp;SLOW!&nbsp;If&nbsp;you&nbsp;want&nbsp;to&nbsp;highlight</span></div></li>
+<li><div class="src-line"><a name="a1987"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;same&nbsp;source&nbsp;multiple&nbsp;times,&nbsp;you're&nbsp;better&nbsp;off&nbsp;doing&nbsp;a&nbsp;whole&nbsp;lot&nbsp;of</span></div></li>
+<li><div class="src-line"><a name="a1988"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;str_replaces&nbsp;to&nbsp;replace&nbsp;the&nbsp;&amp;lt;span&amp;gt;s</span></div></li>
+<li><div class="src-line"><a name="a1989"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a1990"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a1991"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a1992"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">parse_code</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1993"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Start&nbsp;the&nbsp;timer</span></span></div></li>
+<li><div class="src-line"><a name="a1994"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start_time</span>&nbsp;=&nbsp;<span class="src-id">microtime</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a1995"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a1996"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Firstly,&nbsp;if&nbsp;there&nbsp;is&nbsp;an&nbsp;error,&nbsp;we&nbsp;won't&nbsp;highlight</span></span></div></li>
+<li><div class="src-line"><a name="a1997"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">error</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a1998"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Escape&nbsp;the&nbsp;source&nbsp;for&nbsp;output</span></span></div></li>
+<li><div class="src-line"><a name="a1999"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-var">source</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2000"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2001"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//This&nbsp;fix&nbsp;is&nbsp;related&nbsp;to&nbsp;SF#1923020,&nbsp;but&nbsp;has&nbsp;to&nbsp;be&nbsp;applied&nbsp;regardless&nbsp;of</span></span></div></li>
+<li><div class="src-line"><a name="a2002"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//actually&nbsp;highlighting&nbsp;symbols.</span></span></div></li>
+<li><div class="src-line"><a name="a2003"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;=&nbsp;<span class="src-id">str_replace</span><span class="src-sym">(</span><span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'&lt;SEMI&gt;'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'&lt;PIPE&gt;'</span><span class="src-sym">)</span><span class="src-sym">,</span>&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">';'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'|'</span><span class="src-sym">)</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$result</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2004"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2005"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Timing&nbsp;is&nbsp;irrelevant</span></span></div></li>
+<li><div class="src-line"><a name="a2006"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">set_time</span><span class="src-sym">(</span><span class="src-var">$start_time</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$start_time</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2007"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">finalise</span><span class="src-sym">(</span><span class="src-var">$result</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2008"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$result</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2009"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2010"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2011"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;make&nbsp;sure&nbsp;the&nbsp;parse&nbsp;cache&nbsp;is&nbsp;up2date</span></span></div></li>
+<li><div class="src-line"><a name="a2012"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">parse_cache_built</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2013"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">build_parse_cache</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2014"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2015"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2016"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Replace&nbsp;all&nbsp;newlines&nbsp;to&nbsp;a&nbsp;common&nbsp;form.</span></span></div></li>
+<li><div class="src-line"><a name="a2017"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$code</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">&quot;\r\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">source</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2018"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$code</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">&quot;\r&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$code</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2019"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2020"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Add&nbsp;spaces&nbsp;for&nbsp;regular&nbsp;expression&nbsp;matching&nbsp;and&nbsp;line&nbsp;numbers</span></span></div></li>
+<li><div class="src-line"><a name="a2021"></a></span><span class="src-str"><span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$code&nbsp;=&nbsp;&quot;\n&quot;&nbsp;.&nbsp;$code&nbsp;.&nbsp;&quot;\n&quot;;</span></span></div></li>
+<li><div class="src-line"><a name="a2022"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a2023"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Initialise&nbsp;various&nbsp;stuff</span></span></div></li>
+<li><div class="src-line"><a name="a2024"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$length</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2025"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$COMMENT_MATCHED</span>&nbsp;&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2026"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;&nbsp;&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2027"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$endresult</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2028"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2029"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;&quot;Important&quot;&nbsp;selections&nbsp;are&nbsp;handled&nbsp;like&nbsp;multiline&nbsp;comments</span></span></div></li>
+<li><div class="src-line"><a name="a2030"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;@todo&nbsp;GET&nbsp;RID&nbsp;OF&nbsp;THIS&nbsp;SHIZ</span></span></div></li>
+<li><div class="src-line"><a name="a2031"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodenable_important_blocks">enable_important_blocks</a><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2032"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'COMMENT_MULTI'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_START_IMPORTANT&quot;&gt;GESHI_START_IMPORTANT&lt;/a&gt;</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_END_IMPORTANT&quot;&gt;GESHI_END_IMPORTANT&lt;/a&gt;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2033"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2034"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2035"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">strict_mode</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2036"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Break&nbsp;the&nbsp;source&nbsp;into&nbsp;bits.&nbsp;Each&nbsp;bit&nbsp;will&nbsp;be&nbsp;a&nbsp;portion&nbsp;of&nbsp;the&nbsp;code</span></span></div></li>
+<li><div class="src-line"><a name="a2037"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;within&nbsp;script&nbsp;delimiters&nbsp;-&nbsp;for&nbsp;example,&nbsp;HTML&nbsp;between&nbsp;&lt;&nbsp;and&nbsp;&gt;</span></span></div></li>
+<li><div class="src-line"><a name="a2038"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$k</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2039"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parts</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2040"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$matches</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2041"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_match_pointer</span>&nbsp;=&nbsp;<span class="src-id">null</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2042"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;we&nbsp;use&nbsp;a&nbsp;copy&nbsp;to&nbsp;unset&nbsp;delimiters&nbsp;on&nbsp;demand&nbsp;(when&nbsp;they&nbsp;are&nbsp;not&nbsp;found)</span></span></div></li>
+<li><div class="src-line"><a name="a2043"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$delim_copy</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'SCRIPT_DELIMITERS'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2044"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2045"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">while</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;<&nbsp;<span class="src-var">$length</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2046"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_match_pos</span>&nbsp;=&nbsp;<span class="src-var">$length</span>&nbsp;+&nbsp;<span class="src-num">1</span><span class="src-sym">;</span>&nbsp;<span class="src-comm">//&nbsp;never&nbsp;true</span></span></div></li>
+<li><div class="src-line"><a name="a2047"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$delim_copy</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$dk</span>&nbsp;=&gt;&nbsp;<span class="src-var">$delimiters</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2048"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$delimiters</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2049"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$delimiters</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$open</span>&nbsp;=&gt;&nbsp;<span class="src-var">$close</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2050"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;make&nbsp;sure&nbsp;the&nbsp;cache&nbsp;is&nbsp;setup&nbsp;properly</span></span></div></li>
+<li><div class="src-line"><a name="a2051"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2052"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2053"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'next_match'</span>&nbsp;=&gt;&nbsp;-<span class="src-num">1</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2054"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'dk'</span>&nbsp;=&gt;&nbsp;<span class="src-var">$dk</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2055"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2056"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'open'</span>&nbsp;=&gt;&nbsp;<span class="src-var">$open</span><span class="src-sym">,</span>&nbsp;<span class="src-comm">//&nbsp;needed&nbsp;for&nbsp;grouping&nbsp;of&nbsp;adjacent&nbsp;code&nbsp;blocks&nbsp;(see&nbsp;below)</span></span></div></li>
+<li><div class="src-line"><a name="a2057"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'open_strlen'</span>&nbsp;=&gt;&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$open</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2058"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2059"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'close'</span>&nbsp;=&gt;&nbsp;<span class="src-var">$close</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2060"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'close_strlen'</span>&nbsp;=&gt;&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$close</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2061"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2062"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2063"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Get&nbsp;the&nbsp;next&nbsp;little&nbsp;bit&nbsp;for&nbsp;this&nbsp;opening&nbsp;string</span></span></div></li>
+<li><div class="src-line"><a name="a2064"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'next_match'</span><span class="src-sym">]</span>&nbsp;<&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2065"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;only&nbsp;find&nbsp;the&nbsp;next&nbsp;pos&nbsp;if&nbsp;it&nbsp;was&nbsp;not&nbsp;already&nbsp;cached</span></span></div></li>
+<li><div class="src-line"><a name="a2066"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$open_pos</span>&nbsp;=&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$open</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2067"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$open_pos</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2068"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;no&nbsp;match&nbsp;for&nbsp;this&nbsp;delimiter&nbsp;ever</span></span></div></li>
+<li><div class="src-line"><a name="a2069"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$delim_copy</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2070"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2071"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2072"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'next_match'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$open_pos</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2073"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2074"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'next_match'</span><span class="src-sym">]</span>&nbsp;<&nbsp;<span class="src-var">$next_match_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2075"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//So&nbsp;we&nbsp;got&nbsp;a&nbsp;new&nbsp;match,&nbsp;update&nbsp;the&nbsp;close_pos</span></span></div></li>
+<li><div class="src-line"><a name="a2076"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'close_pos'</span><span class="src-sym">]</span>&nbsp;=</span></div></li>
+<li><div class="src-line"><a name="a2077"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$close</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'next_match'</span><span class="src-sym">]</span>+<span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2078"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2079"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_match_pointer</span>&nbsp;=<span class="src-sym">&</span>&nbsp;<span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2080"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_match_pos</span>&nbsp;=&nbsp;<span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'next_match'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2081"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2082"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2083"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2084"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//So&nbsp;we&nbsp;should&nbsp;match&nbsp;an&nbsp;RegExp&nbsp;as&nbsp;Strict&nbsp;Block&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2085"></a><span class="src-doc">/**</span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a2086"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;value&nbsp;in&nbsp;$delimiters&nbsp;is&nbsp;expected&nbsp;to&nbsp;be&nbsp;an&nbsp;RegExp</span></div></li>
+<li><div class="src-line"><a name="a2087"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;containing&nbsp;exactly&nbsp;2&nbsp;matching&nbsp;groups:</span></div></li>
+<li><div class="src-line"><a name="a2088"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;-&nbsp;Group&nbsp;1&nbsp;is&nbsp;the&nbsp;opener</span></div></li>
+<li><div class="src-line"><a name="a2089"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;-&nbsp;Group&nbsp;2&nbsp;is&nbsp;the&nbsp;closer</span></div></li>
+<li><div class="src-line"><a name="a2090"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a2091"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-sym">!</span><span class="src-id">GESHI_PHP_PRE_433</span>&nbsp;&amp;&amp;&nbsp;<span class="src-comm">//Needs&nbsp;proper&nbsp;rewrite&nbsp;to&nbsp;work&nbsp;with&nbsp;PHP&nbsp;&gt;=4.3.0;&nbsp;4.3.3&nbsp;is&nbsp;guaranteed&nbsp;to&nbsp;work.</span></span></div></li>
+<li><div class="src-line"><a name="a2092"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/preg_match">preg_match</a><span class="src-sym">(</span><span class="src-var">$delimiters</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$code</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$matches_rx</span><span class="src-sym">,</span>&nbsp;<span class="src-id">PREG_OFFSET_CAPTURE</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2093"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//We&nbsp;got&nbsp;a&nbsp;match&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2094"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2095"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'next_match'</span>&nbsp;=&gt;&nbsp;<span class="src-var">$matches_rx</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2096"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'dk'</span>&nbsp;=&gt;&nbsp;<span class="src-var">$dk</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2097"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2098"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'close_strlen'</span>&nbsp;=&gt;&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$matches_rx</span><span class="src-sym">[</span><span class="src-num">2</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2099"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'close_pos'</span>&nbsp;=&gt;&nbsp;<span class="src-var">$matches_rx</span><span class="src-sym">[</span><span class="src-num">2</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2100"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2101"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2102"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;no&nbsp;match&nbsp;for&nbsp;this&nbsp;delimiter&nbsp;ever</span></span></div></li>
+<li><div class="src-line"><a name="a2103"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$delim_copy</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2104"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2105"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2106"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2107"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'next_match'</span><span class="src-sym">]</span>&nbsp;&lt;=&nbsp;<span class="src-var">$next_match_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2108"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_match_pointer</span>&nbsp;=<span class="src-sym">&</span>&nbsp;<span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2109"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_match_pos</span>&nbsp;=&nbsp;<span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-var">$dk</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'next_match'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2110"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2111"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2112"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2113"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;non-highlightable&nbsp;text</span></span></div></li>
+<li><div class="src-line"><a name="a2114"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parts</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2115"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-num">1</span>&nbsp;=&gt;&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$next_match_pos</span>&nbsp;-&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span></span></div></li>
+<li><div class="src-line"><a name="a2116"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2117"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++<span class="src-var">$k</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2118"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2119"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$next_match_pos</span>&nbsp;>&nbsp;<span class="src-var">$length</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2120"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;out&nbsp;of&nbsp;bounds&nbsp;means&nbsp;no&nbsp;next&nbsp;match&nbsp;was&nbsp;found</span></span></div></li>
+<li><div class="src-line"><a name="a2121"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2122"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2123"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2124"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;highlightable&nbsp;code</span></span></div></li>
+<li><div class="src-line"><a name="a2125"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parts</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$next_match_pointer</span><span class="src-sym">[</span><span class="src-str">'dk'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2126"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2127"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Only&nbsp;combine&nbsp;for&nbsp;non-rx&nbsp;script&nbsp;blocks</span></span></div></li>
+<li><div class="src-line"><a name="a2128"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$delim_copy</span><span class="src-sym">[</span><span class="src-var">$next_match_pointer</span><span class="src-sym">[</span><span class="src-str">'dk'</span><span class="src-sym">]]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2129"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;group&nbsp;adjacent&nbsp;script&nbsp;blocks,&nbsp;e.g.&nbsp;&lt;foobar&gt;&lt;asdf&gt;&nbsp;should&nbsp;be&nbsp;one&nbsp;block,&nbsp;not&nbsp;three!</span></span></div></li>
+<li><div class="src-line"><a name="a2130"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-var">$next_match_pos</span>&nbsp;+&nbsp;<span class="src-var">$next_match_pointer</span><span class="src-sym">[</span><span class="src-str">'open_strlen'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2131"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">while</span>&nbsp;<span class="src-sym">(</span><span class="src-id">true</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2132"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close_pos</span>&nbsp;=&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$next_match_pointer</span><span class="src-sym">[</span><span class="src-str">'close'</span><span class="src-sym">]</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2133"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$close_pos</span>&nbsp;==&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2134"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2135"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2136"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-var">$close_pos</span>&nbsp;+&nbsp;<span class="src-var">$next_match_pointer</span><span class="src-sym">[</span><span class="src-str">'close_strlen'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2137"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;==&nbsp;<span class="src-var">$length</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2138"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2139"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2140"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span>&nbsp;==&nbsp;<span class="src-var">$next_match_pointer</span><span class="src-sym">[</span><span class="src-str">'open'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;&amp;&amp;&nbsp;<span class="src-sym">(</span><span class="src-var">$next_match_pointer</span><span class="src-sym">[</span><span class="src-str">'open_strlen'</span><span class="src-sym">]</span>&nbsp;==&nbsp;<span class="src-num">1</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2141"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$next_match_pointer</span><span class="src-sym">[</span><span class="src-str">'open_strlen'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;==&nbsp;<span class="src-var">$next_match_pointer</span><span class="src-sym">[</span><span class="src-str">'open'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2142"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;merge&nbsp;adjacent&nbsp;but&nbsp;make&nbsp;sure&nbsp;we&nbsp;don't&nbsp;merge&nbsp;things&nbsp;like&nbsp;&lt;tag&gt;&lt;!--&nbsp;comment&nbsp;--&gt;</span></span></div></li>
+<li><div class="src-line"><a name="a2143"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$matches</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$submatches</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2144"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$submatches</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$match</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2145"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$match</span><span class="src-sym">[</span><span class="src-str">'next_match'</span><span class="src-sym">]</span>&nbsp;==&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2146"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;a&nbsp;different&nbsp;block&nbsp;already&nbsp;matches&nbsp;here!</span></span></div></li>
+<li><div class="src-line"><a name="a2147"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span>&nbsp;<span class="src-num">3</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2148"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2149"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2150"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2151"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2152"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2153"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2154"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2155"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2156"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close_pos</span>&nbsp;=&nbsp;<span class="src-var">$next_match_pointer</span><span class="src-sym">[</span><span class="src-str">'close_pos'</span><span class="src-sym">]</span>&nbsp;+&nbsp;<span class="src-var">$next_match_pointer</span><span class="src-sym">[</span><span class="src-str">'close_strlen'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2157"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-var">$close_pos</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2158"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2159"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2160"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$close_pos</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2161"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;no&nbsp;closing&nbsp;delimiter&nbsp;found!</span></span></div></li>
+<li><div class="src-line"><a name="a2162"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parts</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span>&nbsp;=&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$next_match_pos</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2163"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++<span class="src-var">$k</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2164"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2165"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2166"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parts</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span>&nbsp;=&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$next_match_pos</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span>&nbsp;-&nbsp;<span class="src-var">$next_match_pos</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2167"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++<span class="src-var">$k</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2168"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2169"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2170"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$delim_copy</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$next_match_pointer</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$next_match_pos</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$matches</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2171"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$num_parts</span>&nbsp;=&nbsp;<span class="src-var">$k</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2172"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2173"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$num_parts</span>&nbsp;==&nbsp;<span class="src-num">1</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">strict_mode</span>&nbsp;==&nbsp;<span class="src-id">GESHI_MAYBE</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2174"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;when&nbsp;we&nbsp;have&nbsp;only&nbsp;one&nbsp;part,&nbsp;we&nbsp;don't&nbsp;have&nbsp;anything&nbsp;to&nbsp;highlight&nbsp;at&nbsp;all.</span></span></div></li>
+<li><div class="src-line"><a name="a2175"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;if&nbsp;we&nbsp;have&nbsp;a&nbsp;&quot;maybe&quot;&nbsp;strict&nbsp;language,&nbsp;this&nbsp;should&nbsp;be&nbsp;handled&nbsp;as&nbsp;highlightable&nbsp;code</span></span></div></li>
+<li><div class="src-line"><a name="a2176"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parts</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2177"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-num">0</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2178"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-num">0</span>&nbsp;=&gt;&nbsp;<span class="src-str">''</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2179"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-num">1</span>&nbsp;=&gt;&nbsp;<span class="src-str">''</span></span></div></li>
+<li><div class="src-line"><a name="a2180"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2181"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-num">1</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2182"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-num">0</span>&nbsp;=&gt;&nbsp;<span class="src-id">null</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2183"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-num">1</span>&nbsp;=&gt;&nbsp;<span class="src-var">$parts</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span></span></div></li>
+<li><div class="src-line"><a name="a2184"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span></span></div></li>
+<li><div class="src-line"><a name="a2185"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2186"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$num_parts</span>&nbsp;=&nbsp;<span class="src-num">2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2187"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2188"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2189"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2190"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Not&nbsp;strict&nbsp;mode&nbsp;-&nbsp;simply&nbsp;dump&nbsp;the&nbsp;source&nbsp;into</span></span></div></li>
+<li><div class="src-line"><a name="a2191"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;the&nbsp;array&nbsp;at&nbsp;index&nbsp;1&nbsp;(the&nbsp;first&nbsp;highlightable&nbsp;block)</span></span></div></li>
+<li><div class="src-line"><a name="a2192"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parts</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2193"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-num">0</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2194"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-num">0</span>&nbsp;=&gt;&nbsp;<span class="src-str">''</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2195"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-num">1</span>&nbsp;=&gt;&nbsp;<span class="src-str">''</span></span></div></li>
+<li><div class="src-line"><a name="a2196"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2197"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-num">1</span>&nbsp;=&gt;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2198"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-num">0</span>&nbsp;=&gt;&nbsp;<span class="src-id">null</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2199"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-num">1</span>&nbsp;=&gt;&nbsp;<span class="src-var">$code</span></span></div></li>
+<li><div class="src-line"><a name="a2200"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span></span></div></li>
+<li><div class="src-line"><a name="a2201"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2202"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$num_parts</span>&nbsp;=&nbsp;<span class="src-num">2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2203"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2204"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2205"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Unset&nbsp;variables&nbsp;we&nbsp;won't&nbsp;need&nbsp;any&nbsp;longer</span></span></div></li>
+<li><div class="src-line"><a name="a2206"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2207"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2208"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Preload&nbsp;some&nbsp;repeatedly&nbsp;used&nbsp;values&nbsp;regarding&nbsp;hardquotes&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2209"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$hq</span>&nbsp;=&nbsp;isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'HARDQUOTE'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'HARDQUOTE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;:&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2210"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$hq_strlen</span>&nbsp;=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$hq</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2211"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2212"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Preload&nbsp;if&nbsp;line&nbsp;numbers&nbsp;are&nbsp;to&nbsp;be&nbsp;generated&nbsp;afterwards</span></span></div></li>
+<li><div class="src-line"><a name="a2213"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Added&nbsp;a&nbsp;check&nbsp;if&nbsp;line&nbsp;breaks&nbsp;should&nbsp;be&nbsp;forced&nbsp;even&nbsp;without&nbsp;line&nbsp;numbers,&nbsp;fixes&nbsp;SF#1727398</span></span></div></li>
+<li><div class="src-line"><a name="a2214"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$check_linenumbers</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS&quot;&gt;GESHI_NO_LINE_NUMBERS&lt;/a&gt;</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2215"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines</span><span class="src-sym">)</span>&nbsp;||&nbsp;<span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">allow_multiline_span</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2216"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2217"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//preload&nbsp;the&nbsp;escape&nbsp;char&nbsp;for&nbsp;faster&nbsp;checking&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2218"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escaped_escape_char</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2219"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2220"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;this&nbsp;is&nbsp;used&nbsp;for&nbsp;single-line&nbsp;comments</span></span></div></li>
+<li><div class="src-line"><a name="a2221"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$sc_disallowed_before</span>&nbsp;=&nbsp;<span class="src-str">&quot;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2222"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$sc_disallowed_after</span>&nbsp;=&nbsp;<span class="src-str">&quot;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2223"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2224"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2225"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2226"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'DISALLOWED_BEFORE'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2227"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$sc_disallowed_before</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'DISALLOWED_BEFORE'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2228"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2229"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'DISALLOWED_AFTER'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2230"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$sc_disallowed_after</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'DISALLOWED_AFTER'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2231"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2232"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2233"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2234"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2235"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Fix&nbsp;for&nbsp;SF#1932083:&nbsp;Multichar&nbsp;Quotemarks&nbsp;unsupported</span></span></div></li>
+<li><div class="src-line"><a name="a2236"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$is_string_starter</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2237"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'STRINGS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2238"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'QUOTEMARKS'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$quotemark</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2239"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$is_string_starter</span><span class="src-sym">[</span><span class="src-var">$quotemark</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2240"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$is_string_starter</span><span class="src-sym">[</span><span class="src-var">$quotemark</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]]</span>&nbsp;=&nbsp;(string)<span class="src-var">$quotemark</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2241"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/is_string">is_string</a><span class="src-sym">(</span><span class="src-var">$is_string_starter</span><span class="src-sym">[</span><span class="src-var">$quotemark</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2242"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$is_string_starter</span><span class="src-sym">[</span><span class="src-var">$quotemark</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]]</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2243"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$is_string_starter</span><span class="src-sym">[</span><span class="src-var">$quotemark</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]]</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2244"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$quotemark</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2245"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2246"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$is_string_starter</span><span class="src-sym">[</span><span class="src-var">$quotemark</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]]</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$quotemark</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2247"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2248"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2249"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2250"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2251"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Now&nbsp;we&nbsp;go&nbsp;through&nbsp;each&nbsp;part.&nbsp;We&nbsp;know&nbsp;that&nbsp;even-indexed&nbsp;parts&nbsp;are</span></span></div></li>
+<li><div class="src-line"><a name="a2252"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;code&nbsp;that&nbsp;shouldn't&nbsp;be&nbsp;highlighted,&nbsp;and&nbsp;odd-indexed&nbsp;parts&nbsp;should</span></span></div></li>
+<li><div class="src-line"><a name="a2253"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;be&nbsp;highlighted</span></span></div></li>
+<li><div class="src-line"><a name="a2254"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$key</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$key</span>&nbsp;<&nbsp;<span class="src-var">$num_parts</span><span class="src-sym">;</span>&nbsp;++<span class="src-var">$key</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2255"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$STRICTATTRS</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2256"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2257"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;If&nbsp;this&nbsp;block&nbsp;should&nbsp;be&nbsp;highlighted...</span></span></div></li>
+<li><div class="src-line"><a name="a2258"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-sym">(</span><span class="src-var">$key</span>&nbsp;<span class="src-sym">&</span>&nbsp;<span class="src-num">1</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2259"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Else&nbsp;not&nbsp;a&nbsp;block&nbsp;to&nbsp;highlight</span></span></div></li>
+<li><div class="src-line"><a name="a2260"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$endresult</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$parts</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2261"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$parts</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2262"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2263"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2264"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2265"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2266"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$part</span>&nbsp;=&nbsp;<span class="src-var">$parts</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2267"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2268"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$highlight_part</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2269"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">strict_mode</span>&nbsp;&amp;&amp;&nbsp;<span class="src-sym">!</span><a href="http://www.php.net/is_null">is_null</a><span class="src-sym">(</span><span class="src-var">$parts</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2270"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;get&nbsp;the&nbsp;class&nbsp;key&nbsp;for&nbsp;this&nbsp;block&nbsp;of&nbsp;code</span></span></div></li>
+<li><div class="src-line"><a name="a2271"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$script_key</span>&nbsp;=&nbsp;<span class="src-var">$parts</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2272"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$highlight_part</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'HIGHLIGHT_STRICT_BLOCK'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$script_key</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2273"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'SCRIPT'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$script_key</span><span class="src-sym">]</span>&nbsp;!=&nbsp;<span class="src-str">''</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2274"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'SCRIPT'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2275"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Add&nbsp;a&nbsp;span&nbsp;element&nbsp;around&nbsp;the&nbsp;source&nbsp;to</span></span></div></li>
+<li><div class="src-line"><a name="a2276"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;highlight&nbsp;the&nbsp;overall&nbsp;source&nbsp;block</span></span></div></li>
+<li><div class="src-line"><a name="a2277"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2278"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'SCRIPT'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$script_key</span><span class="src-sym">]</span>&nbsp;!=&nbsp;<span class="src-str">''</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2279"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'SCRIPT'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$script_key</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2280"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2281"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;sc'</span>&nbsp;.&nbsp;<span class="src-var">$script_key</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2282"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2283"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;.=&nbsp;<span class="src-str">"</span></span>&lt;span<span class="src-var">$attributes</span>&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2284"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$STRICTATTRS</span>&nbsp;=&nbsp;<span class="src-var">$attributes</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2285"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2286"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2287"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2288"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$highlight_part</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2289"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Now,&nbsp;highlight&nbsp;the&nbsp;code&nbsp;in&nbsp;this&nbsp;block.&nbsp;This&nbsp;code</span></span></div></li>
+<li><div class="src-line"><a name="a2290"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;is&nbsp;really&nbsp;the&nbsp;engine&nbsp;of&nbsp;GeSHi&nbsp;(along&nbsp;with&nbsp;the&nbsp;method</span></span></div></li>
+<li><div class="src-line"><a name="a2291"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;parse_non_string_part).</span></span></div></li>
+<li><div class="src-line"><a name="a2292"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a2293"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;cache&nbsp;comment&nbsp;regexps&nbsp;incrementally</span></span></div></li>
+<li><div class="src-line"><a name="a2294"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_comment_regexp_key</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2295"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_comment_regexp_pos</span>&nbsp;=&nbsp;-<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2296"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_comment_multi_pos</span>&nbsp;=&nbsp;-<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2297"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_comment_single_pos</span>&nbsp;=&nbsp;-<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2298"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_regexp_cache_per_key</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2299"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_multi_cache_per_key</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2300"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_single_cache_per_key</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2301"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_open_comment_multi</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2302"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_comment_single_key</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2303"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape_regexp_cache_per_key</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2304"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_escape_regexp_key</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2305"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_escape_regexp_pos</span>&nbsp;=&nbsp;-<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2306"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2307"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$length</span>&nbsp;=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2308"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$i</span>&nbsp;<&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span>&nbsp;++<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2309"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Get&nbsp;the&nbsp;next&nbsp;char</span></span></div></li>
+<li><div class="src-line"><a name="a2310"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$char</span>&nbsp;=&nbsp;<span class="src-var">$part</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2311"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$char_len</span>&nbsp;=&nbsp;<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2312"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2313"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;update&nbsp;regexp&nbsp;comment&nbsp;cache&nbsp;if&nbsp;needed</span></span></div></li>
+<li><div class="src-line"><a name="a2314"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'COMMENT_REGEXP'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$next_comment_regexp_pos</span>&nbsp;<&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2315"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_comment_regexp_pos</span>&nbsp;=&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2316"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'COMMENT_REGEXP'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$comment_key</span>&nbsp;=&gt;&nbsp;<span class="src-var">$regexp</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2317"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$match_i</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2318"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$comment_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2319"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-var">$comment_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'pos'</span><span class="src-sym">]</span>&nbsp;&gt;=&nbsp;<span class="src-var">$i</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2320"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'pos'</span><span class="src-sym">]</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2321"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;we&nbsp;have&nbsp;already&nbsp;matched&nbsp;something</span></span></div></li>
+<li><div class="src-line"><a name="a2322"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$comment_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'pos'</span><span class="src-sym">]</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2323"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;this&nbsp;comment&nbsp;is&nbsp;never&nbsp;matched</span></span></div></li>
+<li><div class="src-line"><a name="a2324"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2325"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2326"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$match_i</span>&nbsp;=&nbsp;<span class="src-var">$comment_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'pos'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2327"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2328"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//This&nbsp;is&nbsp;to&nbsp;allow&nbsp;use&nbsp;of&nbsp;the&nbsp;offset&nbsp;parameter&nbsp;in&nbsp;preg_match&nbsp;and&nbsp;stay&nbsp;as&nbsp;compatible&nbsp;with&nbsp;older&nbsp;PHP&nbsp;versions&nbsp;as&nbsp;possible</span></span></div></li>
+<li><div class="src-line"><a name="a2329"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-id">GESHI_PHP_PRE_433</span>&nbsp;&amp;&amp;&nbsp;<a href="http://www.php.net/preg_match">preg_match</a><span class="src-sym">(</span><span class="src-var">$regexp</span><span class="src-sym">,</span>&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$match</span><span class="src-sym">,</span>&nbsp;<span class="src-id">PREG_OFFSET_CAPTURE</span><span class="src-sym">))</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2330"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-id">GESHI_PHP_PRE_433</span>&nbsp;&amp;&amp;&nbsp;<a href="http://www.php.net/preg_match">preg_match</a><span class="src-sym">(</span><span class="src-var">$regexp</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$match</span><span class="src-sym">,</span>&nbsp;<span class="src-id">PREG_OFFSET_CAPTURE</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">))</span></span></div></li>
+<li><div class="src-line"><a name="a2331"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2332"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$match_i</span>&nbsp;=&nbsp;<span class="src-var">$match</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2333"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-id">GESHI_PHP_PRE_433</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2334"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$match_i</span>&nbsp;+=&nbsp;<span class="src-var">$i</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2335"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2336"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2337"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2338"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'key'</span>&nbsp;=&gt;&nbsp;<span class="src-var">$comment_key</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2339"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'length'</span>&nbsp;=&gt;&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$match</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2340"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'pos'</span>&nbsp;=&gt;&nbsp;<span class="src-var">$match_i</span></span></div></li>
+<li><div class="src-line"><a name="a2341"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2342"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2343"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'pos'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2344"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2345"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2346"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2347"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$match_i</span>&nbsp;!==&nbsp;<span class="src-id">false</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$match_i</span>&nbsp;<&nbsp;<span class="src-var">$next_comment_regexp_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2348"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_comment_regexp_pos</span>&nbsp;=&nbsp;<span class="src-var">$match_i</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2349"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_comment_regexp_key</span>&nbsp;=&nbsp;<span class="src-var">$comment_key</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2350"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$match_i</span>&nbsp;===&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2351"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2352"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2353"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2354"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2355"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2356"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2357"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string_started</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2358"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2359"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$is_string_starter</span><span class="src-sym">[</span><span class="src-var">$char</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2360"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Possibly&nbsp;the&nbsp;start&nbsp;of&nbsp;a&nbsp;new&nbsp;string&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2361"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a2362"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Check&nbsp;which&nbsp;starter&nbsp;it&nbsp;was&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2363"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Fix&nbsp;for&nbsp;SF#1932083:&nbsp;Multichar&nbsp;Quotemarks&nbsp;unsupported</span></span></div></li>
+<li><div class="src-line"><a name="a2364"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$is_string_starter</span><span class="src-sym">[</span><span class="src-var">$char</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2365"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$char_new</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2366"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$is_string_starter</span><span class="src-sym">[</span><span class="src-var">$char</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$testchar</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2367"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$testchar</span>&nbsp;===&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">,</span>&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$testchar</span><span class="src-sym">))</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2368"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$testchar</span><span class="src-sym">)</span>&nbsp;>&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$char_new</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2369"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$char_new</span>&nbsp;=&nbsp;<span class="src-var">$testchar</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2370"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string_started</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2371"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2372"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2373"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$string_started</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2374"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$char</span>&nbsp;=&nbsp;<span class="src-var">$char_new</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2375"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2376"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2377"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$testchar</span>&nbsp;=&nbsp;<span class="src-var">$is_string_starter</span><span class="src-sym">[</span><span class="src-var">$char</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2378"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$testchar</span>&nbsp;===&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">,</span>&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$testchar</span><span class="src-sym">)))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2379"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$char</span>&nbsp;=&nbsp;<span class="src-var">$testchar</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2380"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string_started</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2381"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2382"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2383"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$char_len</span>&nbsp;=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$char</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2384"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2385"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2386"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$string_started</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$i</span>&nbsp;!=&nbsp;<span class="src-var">$next_comment_regexp_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2387"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Hand&nbsp;out&nbsp;the&nbsp;correct&nbsp;style&nbsp;information&nbsp;for&nbsp;this&nbsp;string</span></span></div></li>
+<li><div class="src-line"><a name="a2388"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string_key</span>&nbsp;=&nbsp;<a href="http://www.php.net/array_search">array_search</a><span class="src-sym">(</span><span class="src-var">$char</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'QUOTEMARKS'</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2389"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'STRINGS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$string_key</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2390"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$string_key</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2391"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string_key</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2392"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2393"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2394"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;parse&nbsp;the&nbsp;stuff&nbsp;before&nbsp;this</span></span></div></li>
+<li><div class="src-line"><a name="a2395"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">parse_non_string_part</span><span class="src-sym">(</span><span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2396"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2397"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2398"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2399"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string_attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'STRINGS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$string_key</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2400"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2401"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string_attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;st'</span>.<span class="src-var">$string_key</span>.<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2402"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2403"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2404"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;now&nbsp;handle&nbsp;the&nbsp;string</span></span></div></li>
+<li><div class="src-line"><a name="a2405"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;=&nbsp;<span class="src-str">"</span></span>&lt;span<span class="src-var">$string_attributes</span>&gt;<span class="src-str">&quot;&nbsp;</span><span class="src-str">.&nbsp;<span class="src-id">GeSHi</span><span class="src-sym">::</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$char</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2406"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-var">$char_len</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2407"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string_open</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2408"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2409"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_REGEXP'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2410"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_escape_regexp_pos</span>&nbsp;=&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2411"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2412"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2413"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2414"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Get&nbsp;the&nbsp;regular&nbsp;ending&nbsp;pos&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2415"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close_pos</span>&nbsp;=&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$char</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$start</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2416"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-id">false</span>&nbsp;===&nbsp;<span class="src-var">$close_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2417"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close_pos</span>&nbsp;=&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2418"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2419"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2420"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2421"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;update&nbsp;escape&nbsp;regexp&nbsp;cache&nbsp;if&nbsp;needed</span></span></div></li>
+<li><div class="src-line"><a name="a2422"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_REGEXP'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$next_escape_regexp_pos</span>&nbsp;<&nbsp;<span class="src-var">$start</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2423"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_escape_regexp_pos</span>&nbsp;=&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2424"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_REGEXP'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$escape_key</span>&nbsp;=&gt;&nbsp;<span class="src-var">$regexp</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2425"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$match_i</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2426"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$escape_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$escape_key</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2427"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-var">$escape_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$escape_key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'pos'</span><span class="src-sym">]</span>&nbsp;&gt;=&nbsp;<span class="src-var">$start</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2428"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$escape_key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'pos'</span><span class="src-sym">]</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2429"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;we&nbsp;have&nbsp;already&nbsp;matched&nbsp;something</span></span></div></li>
+<li><div class="src-line"><a name="a2430"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$escape_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$escape_key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'pos'</span><span class="src-sym">]</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2431"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;this&nbsp;comment&nbsp;is&nbsp;never&nbsp;matched</span></span></div></li>
+<li><div class="src-line"><a name="a2432"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2433"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2434"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$match_i</span>&nbsp;=&nbsp;<span class="src-var">$escape_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$escape_key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'pos'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2435"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2436"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//This&nbsp;is&nbsp;to&nbsp;allow&nbsp;use&nbsp;of&nbsp;the&nbsp;offset&nbsp;parameter&nbsp;in&nbsp;preg_match&nbsp;and&nbsp;stay&nbsp;as&nbsp;compatible&nbsp;with&nbsp;older&nbsp;PHP&nbsp;versions&nbsp;as&nbsp;possible</span></span></div></li>
+<li><div class="src-line"><a name="a2437"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-id">GESHI_PHP_PRE_433</span>&nbsp;&amp;&amp;&nbsp;<a href="http://www.php.net/preg_match">preg_match</a><span class="src-sym">(</span><span class="src-var">$regexp</span><span class="src-sym">,</span>&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$start</span><span class="src-sym">)</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$match</span><span class="src-sym">,</span>&nbsp;<span class="src-id">PREG_OFFSET_CAPTURE</span><span class="src-sym">))</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2438"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-id">GESHI_PHP_PRE_433</span>&nbsp;&amp;&amp;&nbsp;<a href="http://www.php.net/preg_match">preg_match</a><span class="src-sym">(</span><span class="src-var">$regexp</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$match</span><span class="src-sym">,</span>&nbsp;<span class="src-id">PREG_OFFSET_CAPTURE</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$start</span><span class="src-sym">))</span></span></div></li>
+<li><div class="src-line"><a name="a2439"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2440"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$match_i</span>&nbsp;=&nbsp;<span class="src-var">$match</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2441"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-id">GESHI_PHP_PRE_433</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2442"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$match_i</span>&nbsp;+=&nbsp;<span class="src-var">$start</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2443"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2444"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2445"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$escape_key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2446"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'key'</span>&nbsp;=&gt;&nbsp;<span class="src-var">$escape_key</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2447"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'length'</span>&nbsp;=&gt;&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$match</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2448"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'pos'</span>&nbsp;=&gt;&nbsp;<span class="src-var">$match_i</span></span></div></li>
+<li><div class="src-line"><a name="a2449"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2450"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2451"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$escape_key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'pos'</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2452"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2453"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2454"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2455"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$match_i</span>&nbsp;!==&nbsp;<span class="src-id">false</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$match_i</span>&nbsp;<&nbsp;<span class="src-var">$next_escape_regexp_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2456"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_escape_regexp_pos</span>&nbsp;=&nbsp;<span class="src-var">$match_i</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2457"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_escape_regexp_key</span>&nbsp;=&nbsp;<span class="src-var">$escape_key</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2458"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$match_i</span>&nbsp;===&nbsp;<span class="src-var">$start</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2459"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2460"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2461"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2462"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2463"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2464"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2465"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Find&nbsp;the&nbsp;next&nbsp;simple&nbsp;escape&nbsp;position</span></span></div></li>
+<li><div class="src-line"><a name="a2466"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-str">''</span>&nbsp;!=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2467"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$simple_escape</span>&nbsp;=&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$start</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2468"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-id">false</span>&nbsp;===&nbsp;<span class="src-var">$simple_escape</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2469"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$simple_escape</span>&nbsp;=&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2470"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2471"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2472"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$simple_escape</span>&nbsp;=&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2473"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2474"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2475"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_escape_regexp_pos</span>&nbsp;=&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2476"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$simple_escape</span>&nbsp;=&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2477"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2478"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2479"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-var">$simple_escape</span>&nbsp;<&nbsp;<span class="src-var">$next_escape_regexp_pos</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2480"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$simple_escape</span>&nbsp;<&nbsp;<span class="src-var">$length</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2481"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$simple_escape</span>&nbsp;<&nbsp;<span class="src-var">$close_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2482"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//The&nbsp;nexxt&nbsp;escape&nbsp;sequence&nbsp;is&nbsp;a&nbsp;simple&nbsp;one&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2483"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$es_pos</span>&nbsp;=&nbsp;<span class="src-var">$simple_escape</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2484"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2485"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Add&nbsp;the&nbsp;stuff&nbsp;not&nbsp;in&nbsp;the&nbsp;string&nbsp;yet&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2486"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$start</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$es_pos</span>&nbsp;-&nbsp;<span class="src-var">$start</span><span class="src-sym">))</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2487"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2488"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Get&nbsp;the&nbsp;style&nbsp;for&nbsp;this&nbsp;escaped&nbsp;char&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2489"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2490"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape_char_attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2491"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2492"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape_char_attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;es0&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2493"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2494"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2495"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Add&nbsp;the&nbsp;style&nbsp;for&nbsp;the&nbsp;escape&nbsp;char&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2496"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;.=&nbsp;<span class="src-str">"</span></span>&lt;span<span class="src-var">$escape_char_attributes</span>&gt;<span class="src-str">&quot;&nbsp;</span><span class="src-str">.</span></div></li>
+<li><div class="src-line"><a name="a2497"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">GeSHi</span><span class="src-sym">::</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2498"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2499"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Get&nbsp;the&nbsp;byte&nbsp;AFTER&nbsp;the&nbsp;ESCAPE_CHAR&nbsp;we&nbsp;just&nbsp;found</span></span></div></li>
+<li><div class="src-line"><a name="a2500"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$es_char</span>&nbsp;=&nbsp;<span class="src-var">$part</span><span class="src-sym">[</span><span class="src-var">$es_pos</span>&nbsp;+&nbsp;<span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2501"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$es_char</span>&nbsp;==&nbsp;<span class="src-str">&quot;\n&quot;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2502"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;don't&nbsp;put&nbsp;a&nbsp;newline&nbsp;around&nbsp;newlines</span></span></div></li>
+<li><div class="src-line"><a name="a2503"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;.=&nbsp;<span class="src-str">&quot;&lt;/span&gt;\n&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2504"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-var">$es_pos</span>&nbsp;+&nbsp;<span class="src-num">2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2505"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/ord">ord</a><span class="src-sym">(</span><span class="src-var">$es_char</span><span class="src-sym">)</span>&nbsp;&gt;=&nbsp;<span class="src-num">128</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2506"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//This&nbsp;is&nbsp;an&nbsp;non-ASCII&nbsp;char&nbsp;(UTF8&nbsp;or&nbsp;single&nbsp;byte)</span></span></div></li>
+<li><div class="src-line"><a name="a2507"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//This&nbsp;code&nbsp;tries&nbsp;to&nbsp;work&nbsp;around&nbsp;SF#2037598&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2508"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><a href="http://www.php.net/function_exists">function_exists</a><span class="src-sym">(</span><span class="src-str">'mb_substr'</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2509"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$es_char_m</span>&nbsp;=&nbsp;<a href="http://www.php.net/mb_substr">mb_substr</a><span class="src-sym">(</span><a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$es_pos</span>+<span class="src-num">1</span><span class="src-sym">,</span>&nbsp;<span class="src-num">16</span><span class="src-sym">)</span><span class="src-sym">,</span>&nbsp;<span class="src-num">0</span><span class="src-sym">,</span>&nbsp;<span class="src-num">1</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">encoding</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2510"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;.=&nbsp;<span class="src-var">$es_char_m</span>&nbsp;.&nbsp;<span class="src-str">'&lt;/span&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2511"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-id">GESHI_PHP_PRE_433</span>&nbsp;&amp;&amp;&nbsp;<span class="src-str">'utf-8'</span>&nbsp;==&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">encoding</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2512"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><a href="http://www.php.net/preg_match">preg_match</a><span class="src-sym">(</span><span class="src-str">&quot;/[\xC2-\xDF][\x80-\xBF]&quot;</span>.</span></div></li>
+<li><div class="src-line"><a name="a2513"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;|\xE0[\xA0-\xBF][\x80-\xBF]&quot;</span>.</span></div></li>
+<li><div class="src-line"><a name="a2514"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}&quot;</span>.</span></div></li>
+<li><div class="src-line"><a name="a2515"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;|\xED[\x80-\x9F][\x80-\xBF]&quot;</span>.</span></div></li>
+<li><div class="src-line"><a name="a2516"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;|\xF0[\x90-\xBF][\x80-\xBF]{2}&quot;</span>.</span></div></li>
+<li><div class="src-line"><a name="a2517"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;|[\xF1-\xF3][\x80-\xBF]{3}&quot;</span>.</span></div></li>
+<li><div class="src-line"><a name="a2518"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;|\xF4[\x80-\x8F][\x80-\xBF]{2}/s&quot;</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2519"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$es_char_m</span><span class="src-sym">,</span>&nbsp;<span class="src-id">null</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$es_pos</span>&nbsp;+&nbsp;<span class="src-num">1</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2520"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$es_char_m</span>&nbsp;=&nbsp;<span class="src-var">$es_char_m</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2521"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2522"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$es_char_m</span>&nbsp;=&nbsp;<span class="src-var">$es_char</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2523"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2524"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$es_char_m</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">'&lt;/span&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2525"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2526"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$es_char_m</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$es_char</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2527"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2528"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-var">$es_pos</span>&nbsp;+&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$es_char_m</span><span class="src-sym">)</span>&nbsp;+&nbsp;<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2529"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2530"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$es_char</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">'&lt;/span&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2531"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-var">$es_pos</span>&nbsp;+&nbsp;<span class="src-num">2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2532"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2533"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$next_escape_regexp_pos</span>&nbsp;<&nbsp;<span class="src-var">$length</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2534"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_escape_regexp_pos</span>&nbsp;<&nbsp;<span class="src-var">$close_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2535"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$es_pos</span>&nbsp;=&nbsp;<span class="src-var">$next_escape_regexp_pos</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2536"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Add&nbsp;the&nbsp;stuff&nbsp;not&nbsp;in&nbsp;the&nbsp;string&nbsp;yet&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2537"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$start</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$es_pos</span>&nbsp;-&nbsp;<span class="src-var">$start</span><span class="src-sym">))</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2538"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2539"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Get&nbsp;the&nbsp;key&nbsp;and&nbsp;length&nbsp;of&nbsp;this&nbsp;match&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2540"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape</span>&nbsp;=&nbsp;<span class="src-var">$escape_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$next_escape_regexp_key</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2541"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape_str</span>&nbsp;=&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$es_pos</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$escape</span><span class="src-sym">[</span><span class="src-str">'length'</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2542"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape_key</span>&nbsp;=&nbsp;<span class="src-var">$escape</span><span class="src-sym">[</span><span class="src-str">'key'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2543"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2544"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Get&nbsp;the&nbsp;style&nbsp;for&nbsp;this&nbsp;escaped&nbsp;char&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2545"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2546"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape_char_attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$escape_key</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2547"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2548"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape_char_attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;es'</span>&nbsp;.&nbsp;<span class="src-var">$escape_key</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2549"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2550"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2551"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Add&nbsp;the&nbsp;style&nbsp;for&nbsp;the&nbsp;escape&nbsp;char&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2552"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;.=&nbsp;<span class="src-str">"</span></span>&lt;span<span class="src-var">$escape_char_attributes</span>&gt;<span class="src-str">&quot;&nbsp;</span><span class="src-str">.</span></div></li>
+<li><div class="src-line"><a name="a2553"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$escape_str</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">'&lt;/span&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2554"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2555"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-var">$es_pos</span>&nbsp;+&nbsp;<span class="src-var">$escape</span><span class="src-sym">[</span><span class="src-str">'length'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2556"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2557"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Copy&nbsp;the&nbsp;remainder&nbsp;of&nbsp;the&nbsp;string&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a2558"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$start</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$close_pos</span>&nbsp;-&nbsp;<span class="src-var">$start</span>&nbsp;+&nbsp;<span class="src-var">$char_len</span><span class="src-sym">))</span>&nbsp;.&nbsp;<span class="src-str">'&lt;/span&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2559"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-var">$close_pos</span>&nbsp;+&nbsp;<span class="src-var">$char_len</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2560"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string_open</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2561"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2562"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">while</span><span class="src-sym">(</span><span class="src-var">$string_open</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2563"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2564"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$check_linenumbers</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2565"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Are&nbsp;line&nbsp;numbers&nbsp;used?&nbsp;If,&nbsp;we&nbsp;should&nbsp;end&nbsp;the&nbsp;string&nbsp;before</span></span></div></li>
+<li><div class="src-line"><a name="a2566"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;the&nbsp;newline&nbsp;and&nbsp;begin&nbsp;it&nbsp;again&nbsp;(so&nbsp;when&nbsp;&lt;li&gt;s&nbsp;are&nbsp;put&nbsp;in&nbsp;the&nbsp;source</span></span></div></li>
+<li><div class="src-line"><a name="a2567"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;remains&nbsp;XHTML&nbsp;compliant)</span></span></div></li>
+<li><div class="src-line"><a name="a2568"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;note&nbsp;to&nbsp;self:&nbsp;This&nbsp;opens&nbsp;up&nbsp;possibility&nbsp;of&nbsp;config&nbsp;files&nbsp;specifying</span></span></div></li>
+<li><div class="src-line"><a name="a2569"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;that&nbsp;languages&nbsp;can/cannot&nbsp;have&nbsp;multiline&nbsp;strings???</span></span></div></li>
+<li><div class="src-line"><a name="a2570"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-str">"</span></span>&lt;/span&gt;\n&lt;span<span class="src-var">$string_attributes</span>&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span>&nbsp;<span class="src-var">$string</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2571"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2572"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2573"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;.=&nbsp;<span class="src-var">$string</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2574"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2575"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-var">$start</span>&nbsp;-&nbsp;<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2576"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2577"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'STRINGS'</span><span class="src-sym">]</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$hq</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$hq</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;==&nbsp;<span class="src-var">$char</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2578"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$hq_strlen</span><span class="src-sym">)</span>&nbsp;==&nbsp;<span class="src-var">$hq</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2579"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;The&nbsp;start&nbsp;of&nbsp;a&nbsp;hard&nbsp;quoted&nbsp;string</span></span></div></li>
+<li><div class="src-line"><a name="a2580"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2581"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string_attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'STRINGS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'HARD'</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2582"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape_char_attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'HARD'</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2583"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2584"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string_attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;st_h&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2585"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape_char_attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;es_h&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2586"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2587"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;parse&nbsp;the&nbsp;stuff&nbsp;before&nbsp;this</span></span></div></li>
+<li><div class="src-line"><a name="a2588"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">parse_non_string_part</span><span class="src-sym">(</span><span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2589"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2590"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2591"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;now&nbsp;handle&nbsp;the&nbsp;string</span></span></div></li>
+<li><div class="src-line"><a name="a2592"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2593"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2594"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;look&nbsp;for&nbsp;closing&nbsp;quote</span></span></div></li>
+<li><div class="src-line"><a name="a2595"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-var">$hq_strlen</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2596"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">while</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$close_pos</span>&nbsp;=&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'HARDQUOTE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$start</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2597"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-var">$close_pos</span>&nbsp;+&nbsp;<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2598"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$part</span><span class="src-sym">[</span><span class="src-var">$close_pos</span>&nbsp;-&nbsp;<span class="src-num">1</span><span class="src-sym">]</span>&nbsp;==&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2599"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;make&nbsp;sure&nbsp;this&nbsp;quote&nbsp;is&nbsp;not&nbsp;escaped</span></span></div></li>
+<li><div class="src-line"><a name="a2600"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'HARDESCAPE'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$hardescape</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2601"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$close_pos</span>&nbsp;-&nbsp;<span class="src-num">1</span><span class="src-sym">,</span>&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$hardescape</span><span class="src-sym">))</span>&nbsp;==&nbsp;<span class="src-var">$hardescape</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2602"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;check&nbsp;wether&nbsp;this&nbsp;quote&nbsp;is&nbsp;escaped&nbsp;or&nbsp;if&nbsp;it&nbsp;is&nbsp;something&nbsp;like&nbsp;'\\'</span></span></div></li>
+<li><div class="src-line"><a name="a2603"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$escape_char_pos</span>&nbsp;=&nbsp;<span class="src-var">$close_pos</span>&nbsp;-&nbsp;<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2604"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">while</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$escape_char_pos</span>&nbsp;>&nbsp;<span class="src-num">0</span></span></div></li>
+<li><div class="src-line"><a name="a2605"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;<span class="src-var">$part</span><span class="src-sym">[</span><span class="src-var">$escape_char_pos</span>&nbsp;-&nbsp;<span class="src-num">1</span><span class="src-sym">]</span>&nbsp;==&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2606"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--<span class="src-var">$escape_char_pos</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2607"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2608"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">((</span><span class="src-var">$close_pos</span>&nbsp;-&nbsp;<span class="src-var">$escape_char_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">&</span>&nbsp;<span class="src-num">1</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2609"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;uneven&nbsp;number&nbsp;of&nbsp;escape&nbsp;chars&nbsp;=&gt;&nbsp;this&nbsp;quote&nbsp;is&nbsp;escaped</span></span></div></li>
+<li><div class="src-line"><a name="a2610"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span>&nbsp;<span class="src-num">2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2611"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2612"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2613"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2614"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2615"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2616"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;found&nbsp;closing&nbsp;quote</span></span></div></li>
+<li><div class="src-line"><a name="a2617"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2618"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2619"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2620"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Found&nbsp;the&nbsp;closing&nbsp;delimiter?</span></span></div></li>
+<li><div class="src-line"><a name="a2621"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$close_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2622"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;span&nbsp;till&nbsp;the&nbsp;end&nbsp;of&nbsp;this&nbsp;$part&nbsp;when&nbsp;no&nbsp;closing&nbsp;delimiter&nbsp;is&nbsp;found</span></span></div></li>
+<li><div class="src-line"><a name="a2623"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close_pos</span>&nbsp;=&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2624"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2625"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2626"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Get&nbsp;the&nbsp;actual&nbsp;string</span></span></div></li>
+<li><div class="src-line"><a name="a2627"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;=&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$close_pos</span>&nbsp;-&nbsp;<span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2628"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-var">$close_pos</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2629"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2630"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;handle&nbsp;escape&nbsp;chars&nbsp;and&nbsp;encode&nbsp;html&nbsp;chars</span></span></div></li>
+<li><div class="src-line"><a name="a2631"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;(special&nbsp;because&nbsp;when&nbsp;we&nbsp;have&nbsp;escape&nbsp;chars&nbsp;within&nbsp;our&nbsp;string&nbsp;they&nbsp;may&nbsp;not&nbsp;be&nbsp;escaped)</span></span></div></li>
+<li><div class="src-line"><a name="a2632"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2633"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2634"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$new_string</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2635"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">while</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$es_pos</span>&nbsp;=&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$string</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$start</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2636"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;hmtl&nbsp;escape&nbsp;stuff&nbsp;before</span></span></div></li>
+<li><div class="src-line"><a name="a2637"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$new_string</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$string</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$start</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$es_pos</span>&nbsp;-&nbsp;<span class="src-var">$start</span><span class="src-sym">))</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2638"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;check&nbsp;if&nbsp;this&nbsp;is&nbsp;a&nbsp;hard&nbsp;escape</span></span></div></li>
+<li><div class="src-line"><a name="a2639"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'HARDESCAPE'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$hardescape</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2640"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$string</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$es_pos</span><span class="src-sym">,</span>&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$hardescape</span><span class="src-sym">))</span>&nbsp;==&nbsp;<span class="src-var">$hardescape</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2641"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;indeed,&nbsp;this&nbsp;is&nbsp;a&nbsp;hardescape</span></span></div></li>
+<li><div class="src-line"><a name="a2642"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$new_string</span>&nbsp;.=&nbsp;<span class="src-str">"</span></span>&lt;span<span class="src-var">$escape_char_attributes</span>&gt;<span class="src-str">&quot;&nbsp;</span><span class="src-str">.</span></div></li>
+<li><div class="src-line"><a name="a2643"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$hardescape</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">'&lt;/span&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2644"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-var">$es_pos</span>&nbsp;+&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$hardescape</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2645"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span>&nbsp;<span class="src-num">2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2646"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2647"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2648"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;not&nbsp;a&nbsp;hard&nbsp;escape,&nbsp;but&nbsp;a&nbsp;normal&nbsp;escape</span></span></div></li>
+<li><div class="src-line"><a name="a2649"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;they&nbsp;come&nbsp;in&nbsp;pairs&nbsp;of&nbsp;two</span></span></div></li>
+<li><div class="src-line"><a name="a2650"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$c</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2651"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">while</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$string</span><span class="src-sym">[</span><span class="src-var">$es_pos</span>&nbsp;+&nbsp;<span class="src-var">$c</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;&amp;&amp;&nbsp;isset<span class="src-sym">(</span><span class="src-var">$string</span><span class="src-sym">[</span><span class="src-var">$es_pos</span>&nbsp;+&nbsp;<span class="src-var">$c</span>&nbsp;+&nbsp;<span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">)</span></span></div></li>
+<li><div class="src-line"><a name="a2652"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;<span class="src-var">$string</span><span class="src-sym">[</span><span class="src-var">$es_pos</span>&nbsp;+&nbsp;<span class="src-var">$c</span><span class="src-sym">]</span>&nbsp;==&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span></span></div></li>
+<li><div class="src-line"><a name="a2653"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;<span class="src-var">$string</span><span class="src-sym">[</span><span class="src-var">$es_pos</span>&nbsp;+&nbsp;<span class="src-var">$c</span>&nbsp;+&nbsp;<span class="src-num">1</span><span class="src-sym">]</span>&nbsp;==&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2654"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$c</span>&nbsp;+=&nbsp;<span class="src-num">2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2655"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2656"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$c</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2657"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$new_string</span>&nbsp;.=&nbsp;<span class="src-str">"</span></span>&lt;span<span class="src-var">$escape_char_attributes</span>&gt;<span class="src-str">&quot;&nbsp;</span><span class="src-str">.</span></div></li>
+<li><div class="src-line"><a name="a2658"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">str_repeat</span><span class="src-sym">(</span><span class="src-var">$escaped_escape_char</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$c</span><span class="src-sym">)</span>&nbsp;.</span></div></li>
+<li><div class="src-line"><a name="a2659"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;/span&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2660"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-var">$es_pos</span>&nbsp;+&nbsp;<span class="src-var">$c</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2661"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2662"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;this&nbsp;is&nbsp;just&nbsp;a&nbsp;single&nbsp;lonely&nbsp;escape&nbsp;char...</span></span></div></li>
+<li><div class="src-line"><a name="a2663"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$new_string</span>&nbsp;.=&nbsp;<span class="src-var">$escaped_escape_char</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2664"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-var">$es_pos</span>&nbsp;+&nbsp;<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2665"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2666"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2667"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;=&nbsp;<span class="src-var">$new_string</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$string</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$start</span><span class="src-sym">))</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2668"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2669"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$string</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2670"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2671"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2672"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$check_linenumbers</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2673"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Are&nbsp;line&nbsp;numbers&nbsp;used?&nbsp;If,&nbsp;we&nbsp;should&nbsp;end&nbsp;the&nbsp;string&nbsp;before</span></span></div></li>
+<li><div class="src-line"><a name="a2674"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;the&nbsp;newline&nbsp;and&nbsp;begin&nbsp;it&nbsp;again&nbsp;(so&nbsp;when&nbsp;&lt;li&gt;s&nbsp;are&nbsp;put&nbsp;in&nbsp;the&nbsp;source</span></span></div></li>
+<li><div class="src-line"><a name="a2675"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;remains&nbsp;XHTML&nbsp;compliant)</span></span></div></li>
+<li><div class="src-line"><a name="a2676"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;note&nbsp;to&nbsp;self:&nbsp;This&nbsp;opens&nbsp;up&nbsp;possibility&nbsp;of&nbsp;config&nbsp;files&nbsp;specifying</span></span></div></li>
+<li><div class="src-line"><a name="a2677"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;that&nbsp;languages&nbsp;can/cannot&nbsp;have&nbsp;multiline&nbsp;strings???</span></span></div></li>
+<li><div class="src-line"><a name="a2678"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-str">"</span></span>&lt;/span&gt;\n&lt;span<span class="src-var">$string_attributes</span>&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span>&nbsp;<span class="src-var">$string</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2679"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2680"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2681"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;.=&nbsp;</span><span class="src-str">&quot;</span>&lt;span<span class="src-var">$string_attributes</span>&gt;<span class="src-str">&quot;&nbsp;</span><span class="src-str">.&nbsp;<span class="src-var">$string</span>&nbsp;.&nbsp;<span class="src-str">'&lt;/span&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2682"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$string</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2683"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2684"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2685"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Have&nbsp;a&nbsp;look&nbsp;for&nbsp;regexp&nbsp;comments</span></span></div></li>
+<li><div class="src-line"><a name="a2686"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;==&nbsp;<span class="src-var">$next_comment_regexp_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2687"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$COMMENT_MATCHED</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2688"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment</span>&nbsp;=&nbsp;<span class="src-var">$comment_regexp_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$next_comment_regexp_key</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2689"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$comment</span><span class="src-sym">[</span><span class="src-str">'length'</span><span class="src-sym">]</span><span class="src-sym">))</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2690"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2691"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//@todo&nbsp;If&nbsp;remove&nbsp;important&nbsp;do&nbsp;remove&nbsp;here</span></span></div></li>
+<li><div class="src-line"><a name="a2692"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'MULTI'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2693"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2694"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$comment</span><span class="src-sym">[</span><span class="src-str">'key'</span><span class="src-sym">]]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2695"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2696"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;co'</span>&nbsp;.&nbsp;<span class="src-var">$comment</span><span class="src-sym">[</span><span class="src-str">'key'</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2697"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2698"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2699"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;=&nbsp;<span class="src-str">"</span></span>&lt;span<span class="src-var">$attributes</span>&gt;<span class="src-str">&quot;&nbsp;</span><span class="src-str">.&nbsp;<span class="src-var">$test_str</span>&nbsp;.&nbsp;<span class="src-str">&quot;&lt;/span&gt;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2700"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2701"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Short-cut&nbsp;through&nbsp;all&nbsp;the&nbsp;multiline&nbsp;code</span></span></div></li>
+<li><div class="src-line"><a name="a2702"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$check_linenumbers</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2703"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;strreplace&nbsp;to&nbsp;put&nbsp;close&nbsp;span&nbsp;and&nbsp;open&nbsp;span&nbsp;around&nbsp;multiline&nbsp;newlines</span></span></div></li>
+<li><div class="src-line"><a name="a2704"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2705"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-str">"</span></span>&lt;/span&gt;\n&lt;span<span class="src-var">$attributes</span>&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2706"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">str_replace</span><span class="src-sym">(</span><span class="src-str">&quot;\n&nbsp;&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-str">&quot;\n&amp;nbsp;&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$test_str</span><span class="src-sym">)</span></span></div></li>
+<li><div class="src-line"><a name="a2707"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2708"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2709"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2710"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2711"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$i</span>&nbsp;+=&nbsp;<span class="src-var">$comment</span><span class="src-sym">[</span><span class="src-str">'length'</span><span class="src-sym">]</span>&nbsp;-&nbsp;<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2712"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2713"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;parse&nbsp;the&nbsp;rest</span></span></div></li>
+<li><div class="src-line"><a name="a2714"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">parse_non_string_part</span><span class="src-sym">(</span><span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2715"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2716"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2717"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2718"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;If&nbsp;we&nbsp;haven't&nbsp;matched&nbsp;a&nbsp;regexp&nbsp;comment,&nbsp;try&nbsp;multi-line&nbsp;comments</span></span></div></li>
+<li><div class="src-line"><a name="a2719"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$COMMENT_MATCHED</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2720"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Is&nbsp;this&nbsp;a&nbsp;multiline&nbsp;comment?</span></span></div></li>
+<li><div class="src-line"><a name="a2721"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'COMMENT_MULTI'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$next_comment_multi_pos</span>&nbsp;<&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2722"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_comment_multi_pos</span>&nbsp;=&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2723"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'COMMENT_MULTI'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$open</span>&nbsp;=&gt;&nbsp;<span class="src-var">$close</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2724"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$match_i</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2725"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$comment_multi_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2726"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-var">$comment_multi_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span>&nbsp;&gt;=&nbsp;<span class="src-var">$i</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2727"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_multi_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2728"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;we&nbsp;have&nbsp;already&nbsp;matched&nbsp;something</span></span></div></li>
+<li><div class="src-line"><a name="a2729"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$comment_multi_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2730"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;this&nbsp;comment&nbsp;is&nbsp;never&nbsp;matched</span></span></div></li>
+<li><div class="src-line"><a name="a2731"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2732"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2733"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$match_i</span>&nbsp;=&nbsp;<span class="src-var">$comment_multi_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2734"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">((</span><span class="src-var">$match_i</span>&nbsp;=&nbsp;<a href="http://www.php.net/stripos">stripos</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$open</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">))</span>&nbsp;!==&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2735"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_multi_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$match_i</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2736"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2737"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_multi_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2738"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2739"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2740"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$match_i</span>&nbsp;!==&nbsp;<span class="src-id">false</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$match_i</span>&nbsp;<&nbsp;<span class="src-var">$next_comment_multi_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2741"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_comment_multi_pos</span>&nbsp;=&nbsp;<span class="src-var">$match_i</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2742"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_open_comment_multi</span>&nbsp;=&nbsp;<span class="src-var">$open</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2743"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$match_i</span>&nbsp;===&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2744"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2745"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2746"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2747"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2748"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2749"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;==&nbsp;<span class="src-var">$next_comment_multi_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2750"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$open</span>&nbsp;=&nbsp;<span class="src-var">$next_open_comment_multi</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2751"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'COMMENT_MULTI'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$open</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2752"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$open_strlen</span>&nbsp;=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$open</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2753"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close_strlen</span>&nbsp;=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$close</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2754"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$COMMENT_MATCHED</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2755"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str_match</span>&nbsp;=&nbsp;<span class="src-var">$open</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2756"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//@todo&nbsp;If&nbsp;remove&nbsp;important&nbsp;do&nbsp;remove&nbsp;here</span></span></div></li>
+<li><div class="src-line"><a name="a2757"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'MULTI'</span><span class="src-sym">]</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2758"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$open</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_START_IMPORTANT&quot;&gt;GESHI_START_IMPORTANT&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2759"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$open</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_START_IMPORTANT&quot;&gt;GESHI_START_IMPORTANT&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2760"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2761"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'MULTI'</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2762"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2763"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;coMULTI&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2764"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2765"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;=&nbsp;<span class="src-str">"</span></span>&lt;span<span class="src-var">$attributes</span>&gt;<span class="src-str">&quot;&nbsp;</span><span class="src-str">.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$open</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2766"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2767"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2768"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">important_styles</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2769"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2770"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;imp&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2771"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2772"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2773"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;We&nbsp;don't&nbsp;include&nbsp;the&nbsp;start&nbsp;of&nbsp;the&nbsp;comment&nbsp;if&nbsp;it's&nbsp;an</span></span></div></li>
+<li><div class="src-line"><a name="a2774"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;&quot;important&quot;&nbsp;part</span></span></div></li>
+<li><div class="src-line"><a name="a2775"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;=&nbsp;<span class="src-str">"</span></span>&lt;span<span class="src-var">$attributes</span>&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2776"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2777"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2778"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$open</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2779"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2780"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2781"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close_pos</span>&nbsp;=&nbsp;<span class="src-id">strpos</span><span class="src-sym">(</span>&nbsp;<span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$close</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-var">$open_strlen</span>&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2782"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2783"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$close_pos</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2784"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close_pos</span>&nbsp;=&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2785"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2786"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2787"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Short-cut&nbsp;through&nbsp;all&nbsp;the&nbsp;multiline&nbsp;code</span></span></div></li>
+<li><div class="src-line"><a name="a2788"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$rest_of_comment</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-id">substr</span><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-var">$open_strlen</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$close_pos</span>&nbsp;-&nbsp;<span class="src-var">$i</span>&nbsp;-&nbsp;<span class="src-var">$open_strlen</span>&nbsp;+&nbsp;<span class="src-var">$close_strlen</span><span class="src-sym">))</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2789"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">((</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'MULTI'</span><span class="src-sym">]</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2790"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str_match</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_START_IMPORTANT&quot;&gt;GESHI_START_IMPORTANT&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2791"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$check_linenumbers</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2792"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2793"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;strreplace&nbsp;to&nbsp;put&nbsp;close&nbsp;span&nbsp;and&nbsp;open&nbsp;span&nbsp;around&nbsp;multiline&nbsp;newlines</span></span></div></li>
+<li><div class="src-line"><a name="a2794"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;.=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2795"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-str">"</span></span>&lt;/span&gt;\n&lt;span<span class="src-var">$attributes</span>&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a2796"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-id">str_replace</span><span class="src-sym">(</span><span class="src-str">&quot;\n&nbsp;&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-str">&quot;\n&amp;nbsp;&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$rest_of_comment</span><span class="src-sym">)</span></span></div></li>
+<li><div class="src-line"><a name="a2797"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2798"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2799"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;.=&nbsp;<span class="src-var">$rest_of_comment</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2800"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2801"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2802"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'MULTI'</span><span class="src-sym">]</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2803"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str_match</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_START_IMPORTANT&quot;&gt;GESHI_START_IMPORTANT&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2804"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;/span&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2805"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2806"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2807"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-var">$close_pos</span>&nbsp;+&nbsp;<span class="src-var">$close_strlen</span>&nbsp;-&nbsp;<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2808"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2809"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;parse&nbsp;the&nbsp;rest</span></span></div></li>
+<li><div class="src-line"><a name="a2810"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">parse_non_string_part</span><span class="src-sym">(</span><span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2811"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2812"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2813"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2814"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2815"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;If&nbsp;we&nbsp;haven't&nbsp;matched&nbsp;a&nbsp;multiline&nbsp;comment,&nbsp;try&nbsp;single-line&nbsp;comments</span></span></div></li>
+<li><div class="src-line"><a name="a2816"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$COMMENT_MATCHED</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2817"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;cache&nbsp;potential&nbsp;single&nbsp;line&nbsp;comment&nbsp;occurances</span></span></div></li>
+<li><div class="src-line"><a name="a2818"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'COMMENT_SINGLE'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$next_comment_single_pos</span>&nbsp;<&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2819"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_comment_single_pos</span>&nbsp;=&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2820"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'COMMENT_SINGLE'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$comment_key</span>&nbsp;=&gt;&nbsp;<span class="src-var">$comment_mark</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2821"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$match_i</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2822"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$comment_single_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2823"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-var">$comment_single_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span>&nbsp;&gt;=&nbsp;<span class="src-var">$i</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2824"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_single_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2825"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;we&nbsp;have&nbsp;already&nbsp;matched&nbsp;something</span></span></div></li>
+<li><div class="src-line"><a name="a2826"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$comment_single_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2827"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;this&nbsp;comment&nbsp;is&nbsp;never&nbsp;matched</span></span></div></li>
+<li><div class="src-line"><a name="a2828"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2829"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2830"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$match_i</span>&nbsp;=&nbsp;<span class="src-var">$comment_single_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2831"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a2832"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;case&nbsp;sensitive&nbsp;comments</span></span></div></li>
+<li><div class="src-line"><a name="a2833"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'CASE_SENSITIVE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-id">GESHI_COMMENTS</span><span class="src-sym">]</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2834"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-var">$match_i</span>&nbsp;=&nbsp;<a href="http://www.php.net/stripos">stripos</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$comment_mark</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">))</span>&nbsp;!==&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2835"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;non&nbsp;case&nbsp;sensitive</span></span></div></li>
+<li><div class="src-line"><a name="a2836"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'CASE_SENSITIVE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-id">GESHI_COMMENTS</span><span class="src-sym">]</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2837"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">((</span><span class="src-var">$match_i</span>&nbsp;=&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$comment_mark</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">))</span>&nbsp;!==&nbsp;<span class="src-id">false</span><span class="src-sym">)))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2838"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_single_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$match_i</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2839"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2840"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_single_cache_per_key</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2841"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2842"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2843"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$match_i</span>&nbsp;!==&nbsp;<span class="src-id">false</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$match_i</span>&nbsp;<&nbsp;<span class="src-var">$next_comment_single_pos</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2844"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_comment_single_pos</span>&nbsp;=&nbsp;<span class="src-var">$match_i</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2845"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$next_comment_single_key</span>&nbsp;=&nbsp;<span class="src-var">$comment_key</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2846"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$match_i</span>&nbsp;===&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2847"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2848"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2849"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2850"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2851"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2852"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$next_comment_single_pos</span>&nbsp;==&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2853"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_key</span>&nbsp;=&nbsp;<span class="src-var">$next_comment_single_key</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2854"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$comment_mark</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'COMMENT_SINGLE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2855"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$com_len</span>&nbsp;=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$comment_mark</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2856"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2857"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;This&nbsp;check&nbsp;will&nbsp;find&nbsp;special&nbsp;variables&nbsp;like&nbsp;$#&nbsp;in&nbsp;bash</span></span></div></li>
+<li><div class="src-line"><a name="a2858"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;or&nbsp;compiler&nbsp;directives&nbsp;of&nbsp;Delphi&nbsp;beginning&nbsp;{$</span></span></div></li>
+<li><div class="src-line"><a name="a2859"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">((</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$sc_disallowed_before</span><span class="src-sym">)</span>&nbsp;||&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;==&nbsp;<span class="src-num">0</span><span class="src-sym">)</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2860"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-id">false</span>&nbsp;===&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$sc_disallowed_before</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$part</span><span class="src-sym">[</span><span class="src-var">$i</span>-<span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">)))</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a2861"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$sc_disallowed_after</span><span class="src-sym">)</span>&nbsp;||&nbsp;<span class="src-sym">(</span><span class="src-var">$length</span>&nbsp;&lt;=&nbsp;<span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-var">$com_len</span><span class="src-sym">)</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a2862"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-id">false</span>&nbsp;===&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$sc_disallowed_after</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$part</span><span class="src-sym">[</span><span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-var">$com_len</span><span class="src-sym">]</span><span class="src-sym">))))</span></span></div></li>
+<li><div class="src-line"><a name="a2863"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2864"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;this&nbsp;is&nbsp;a&nbsp;valid&nbsp;comment</span></span></div></li>
+<li><div class="src-line"><a name="a2865"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$COMMENT_MATCHED</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2866"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2867"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2868"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2869"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2870"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;co'</span>&nbsp;.&nbsp;<span class="src-var">$comment_key</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2871"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2872"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;=&nbsp;<span class="src-str">"</span></span>&lt;span<span class="src-var">$attributes</span>&gt;<span class="src-str">&quot;&nbsp;</span><span class="src-str">.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">change_case</span><span class="src-sym">(</span><span class="src-var">$comment_mark</span><span class="src-sym">))</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2873"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2874"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$comment_mark</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2875"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2876"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2877"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Check&nbsp;if&nbsp;this&nbsp;comment&nbsp;is&nbsp;the&nbsp;last&nbsp;in&nbsp;the&nbsp;source</span></span></div></li>
+<li><div class="src-line"><a name="a2878"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close_pos</span>&nbsp;=&nbsp;<span class="src-id">strpos</span><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2879"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$oops</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2880"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$close_pos</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2881"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close_pos</span>&nbsp;=&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2882"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$oops</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2883"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2884"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-var">$com_len</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$close_pos</span>&nbsp;-&nbsp;<span class="src-var">$i</span>&nbsp;-&nbsp;<span class="src-var">$com_len</span><span class="src-sym">))</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2885"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$comment_key</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2886"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;.=&nbsp;<span class="src-str">&quot;&lt;/span&gt;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2887"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2888"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2889"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Take&nbsp;into&nbsp;account&nbsp;that&nbsp;the&nbsp;comment&nbsp;might&nbsp;be&nbsp;the&nbsp;last&nbsp;in&nbsp;the&nbsp;source</span></span></div></li>
+<li><div class="src-line"><a name="a2890"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$oops</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2891"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$test_str</span>&nbsp;.=&nbsp;<span class="src-str">&quot;\n&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2892"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2893"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2894"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-var">$close_pos</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2895"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2896"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;parse&nbsp;the&nbsp;rest</span></span></div></li>
+<li><div class="src-line"><a name="a2897"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">parse_non_string_part</span><span class="src-sym">(</span><span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2898"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2899"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2900"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2901"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2902"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2903"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2904"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Where&nbsp;are&nbsp;we&nbsp;adding&nbsp;this&nbsp;char?</span></span></div></li>
+<li><div class="src-line"><a name="a2905"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$COMMENT_MATCHED</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2906"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;.=&nbsp;<span class="src-var">$char</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2907"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2908"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;.=&nbsp;<span class="src-var">$test_str</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2909"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$test_str</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2910"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$COMMENT_MATCHED</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2911"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2912"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2913"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Parse&nbsp;the&nbsp;last&nbsp;bit</span></span></div></li>
+<li><div class="src-line"><a name="a2914"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">parse_non_string_part</span><span class="src-sym">(</span><span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2915"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2916"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2917"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2918"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2919"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Close&nbsp;the&nbsp;&lt;span&gt;&nbsp;that&nbsp;surrounds&nbsp;the&nbsp;block</span></span></div></li>
+<li><div class="src-line"><a name="a2920"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$STRICTATTRS</span>&nbsp;!=&nbsp;<span class="src-str">''</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2921"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-str">"</span></span>&lt;/span&gt;\n&lt;span<span class="src-var">$STRICTATTRS</span>&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span>&nbsp;<span class="src-var">$result</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2922"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;/span&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2923"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2924"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2925"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$endresult</span>&nbsp;.=&nbsp;<span class="src-var">$result</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2926"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$part</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$parts</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$result</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2927"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2928"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2929"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//This&nbsp;fix&nbsp;is&nbsp;related&nbsp;to&nbsp;SF#1923020,&nbsp;but&nbsp;has&nbsp;to&nbsp;be&nbsp;applied&nbsp;regardless&nbsp;of</span></span></div></li>
+<li><div class="src-line"><a name="a2930"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//actually&nbsp;highlighting&nbsp;symbols.</span></span></div></li>
+<li><div class="src-line"><a name="a2931"></a><span class="src-doc">/**&nbsp;NOTE:&nbsp;memorypeak&nbsp;#3&nbsp;*/</span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a2932"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$endresult</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'&lt;SEMI&gt;'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'&lt;PIPE&gt;'</span><span class="src-sym">)</span><span class="src-sym">,</span>&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">';'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'|'</span><span class="src-sym">)</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$endresult</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2933"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2934"></a></span><span class="src-str"><span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Parse&nbsp;the&nbsp;last&nbsp;stuff&nbsp;(redundant?)</span></span></div></li>
+<li><div class="src-line"><a name="a2935"></a></span><span class="src-str"><span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;.=&nbsp;$this-&gt;parse_non_string_part($stuff_to_parse);</span></span></div></li>
+<li><div class="src-line"><a name="a2936"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a2937"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Lop&nbsp;off&nbsp;the&nbsp;very&nbsp;first&nbsp;and&nbsp;last&nbsp;spaces</span></span></div></li>
+<li><div class="src-line"><a name="a2938"></a></span><span class="src-str"><span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;substr($result,&nbsp;1,&nbsp;-1);</span></span></div></li>
+<li><div class="src-line"><a name="a2939"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a2940"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;We're&nbsp;finished:&nbsp;stop&nbsp;timing</span></span></div></li>
+<li><div class="src-line"><a name="a2941"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">set_time</span><span class="src-sym">(</span><span class="src-var">$start_time</span><span class="src-sym">,</span>&nbsp;<a href="http://www.php.net/microtime">microtime</a><span class="src-sym">(</span><span class="src-sym">))</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2942"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2943"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">finalise</span><span class="src-sym">(</span><span class="src-var">$endresult</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2944"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$endresult</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2945"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2946"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2947"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a2948"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Swaps&nbsp;out&nbsp;spaces&nbsp;and&nbsp;tabs&nbsp;for&nbsp;HTML&nbsp;indentation.&nbsp;Not&nbsp;needed&nbsp;if</span></div></li>
+<li><div class="src-line"><a name="a2949"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;code&nbsp;is&nbsp;in&nbsp;a&nbsp;pre&nbsp;block...</span></div></li>
+<li><div class="src-line"><a name="a2950"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a2951"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc">&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;source&nbsp;to&nbsp;indent&nbsp;(reference!)</span></div></li>
+<li><div class="src-line"><a name="a2952"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a2953"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@access</span><span class="src-doc">&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a2954"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a2955"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">indent</span><span class="src-sym">(</span><span class="src-sym">&</span><span class="src-var">$result</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2956"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">///&nbsp;Replace&nbsp;tabs&nbsp;with&nbsp;the&nbsp;correct&nbsp;number&nbsp;of&nbsp;spaces</span></span></div></li>
+<li><div class="src-line"><a name="a2957"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-id">false</span>&nbsp;!==&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$result</span><span class="src-sym">,</span>&nbsp;<span class="src-str">&quot;\t&quot;</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2958"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$lines</span>&nbsp;=&nbsp;<a href="http://www.php.net/explode">explode</a><span class="src-sym">(</span><span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$result</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2959"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;=&nbsp;<span class="src-id">null</span><span class="src-sym">;</span><span class="src-comm">//Save&nbsp;memory&nbsp;while&nbsp;we&nbsp;process&nbsp;the&nbsp;lines&nbsp;individually</span></span></div></li>
+<li><div class="src-line"><a name="a2960"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$tab_width</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodget_real_tab_width">get_real_tab_width</a><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2961"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$tab_string</span>&nbsp;=&nbsp;<span class="src-str">'&amp;nbsp;'</span>&nbsp;.&nbsp;<a href="http://www.php.net/str_repeat">str_repeat</a><span class="src-sym">(</span><span class="src-str">'&nbsp;'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$tab_width</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2962"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2963"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$key</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$n</span>&nbsp;=&nbsp;<a href="http://www.php.net/count">count</a><span class="src-sym">(</span><span class="src-var">$lines</span><span class="src-sym">)</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$key</span>&nbsp;<&nbsp;<span class="src-var">$n</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$key</span>++<span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2964"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$line</span>&nbsp;=&nbsp;<span class="src-var">$lines</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2965"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-id">false</span>&nbsp;===&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$line</span><span class="src-sym">,</span>&nbsp;<span class="src-str">&quot;\t&quot;</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2966"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2967"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2968"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a2969"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$pos</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2970"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$length</span>&nbsp;=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$line</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2971"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$lines</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span>&nbsp;<span class="src-comm">//&nbsp;reduce&nbsp;memory</span></span></div></li>
+<li><div class="src-line"><a name="a2972"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a2973"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$IN_TAG</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2974"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$i</span>&nbsp;<&nbsp;<span class="src-var">$length</span><span class="src-sym">;</span>&nbsp;++<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2975"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$char</span>&nbsp;=&nbsp;<span class="src-var">$line</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2976"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Simple&nbsp;engine&nbsp;to&nbsp;work&nbsp;out&nbsp;whether&nbsp;we're&nbsp;in&nbsp;a&nbsp;tag.</span></span></div></li>
+<li><div class="src-line"><a name="a2977"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;If&nbsp;we&nbsp;are&nbsp;we&nbsp;modify&nbsp;$pos.&nbsp;This&nbsp;is&nbsp;so&nbsp;we&nbsp;ignore&nbsp;HTML</span></span></div></li>
+<li><div class="src-line"><a name="a2978"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;in&nbsp;the&nbsp;line&nbsp;and&nbsp;only&nbsp;workout&nbsp;the&nbsp;tab&nbsp;replacement</span></span></div></li>
+<li><div class="src-line"><a name="a2979"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;via&nbsp;the&nbsp;actual&nbsp;content&nbsp;of&nbsp;the&nbsp;string</span></span></div></li>
+<li><div class="src-line"><a name="a2980"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;This&nbsp;test&nbsp;could&nbsp;be&nbsp;improved&nbsp;to&nbsp;include&nbsp;strings&nbsp;in&nbsp;the</span></span></div></li>
+<li><div class="src-line"><a name="a2981"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;html&nbsp;so&nbsp;that&nbsp;&lt;&nbsp;or&nbsp;&gt;&nbsp;would&nbsp;be&nbsp;allowed&nbsp;in&nbsp;user's&nbsp;styles</span></span></div></li>
+<li><div class="src-line"><a name="a2982"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;(e.g.&nbsp;quotes:&nbsp;'&lt;'&nbsp;'&gt;';&nbsp;or&nbsp;similar)</span></span></div></li>
+<li><div class="src-line"><a name="a2983"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$IN_TAG</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2984"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-str">'&gt;'</span>&nbsp;==&nbsp;<span class="src-var">$char</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2985"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$IN_TAG</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2986"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2987"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$lines</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-var">$char</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2988"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-str">'&lt;'</span>&nbsp;==&nbsp;<span class="src-var">$char</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2989"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$IN_TAG</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2990"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$lines</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2991"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-str">'&amp;'</span>&nbsp;==&nbsp;<span class="src-var">$char</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2992"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$substr</span>&nbsp;=&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$line</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-num">3</span><span class="src-sym">,</span>&nbsp;<span class="src-num">5</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2993"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$posi</span>&nbsp;=&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$substr</span><span class="src-sym">,</span>&nbsp;<span class="src-str">';'</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2994"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-id">false</span>&nbsp;===&nbsp;<span class="src-var">$posi</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2995"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++<span class="src-var">$pos</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2996"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a2997"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$pos</span>&nbsp;-=&nbsp;<span class="src-var">$posi</span>+<span class="src-num">2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a2998"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a2999"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$lines</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-var">$char</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3000"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-str">&quot;\t&quot;</span>&nbsp;==&nbsp;<span class="src-var">$char</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3001"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$str</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3002"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;OPTIMISE&nbsp;-&nbsp;move&nbsp;$strs&nbsp;out.&nbsp;Make&nbsp;an&nbsp;array:</span></span></div></li>
+<li><div class="src-line"><a name="a3003"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;$tabs&nbsp;=&nbsp;array(</span></span></div></li>
+<li><div class="src-line"><a name="a3004"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;&nbsp;1&nbsp;=&gt;&nbsp;'&amp;nbsp;',</span></span></div></li>
+<li><div class="src-line"><a name="a3005"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;&nbsp;2&nbsp;=&gt;&nbsp;'&amp;nbsp;&nbsp;',</span></span></div></li>
+<li><div class="src-line"><a name="a3006"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;&nbsp;3&nbsp;=&gt;&nbsp;'&amp;nbsp;&nbsp;&amp;nbsp;'&nbsp;etc&nbsp;etc</span></span></div></li>
+<li><div class="src-line"><a name="a3007"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;to&nbsp;use&nbsp;instead&nbsp;of&nbsp;building&nbsp;a&nbsp;string&nbsp;every&nbsp;time</span></span></div></li>
+<li><div class="src-line"><a name="a3008"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$tab_end_width</span>&nbsp;=&nbsp;<span class="src-var">$tab_width</span>&nbsp;-&nbsp;<span class="src-sym">(</span><span class="src-var">$pos</span>&nbsp;%&nbsp;<span class="src-var">$tab_width</span><span class="src-sym">)</span><span class="src-sym">;</span>&nbsp;<span class="src-comm">//Moved&nbsp;out&nbsp;of&nbsp;the&nbsp;look&nbsp;as&nbsp;it&nbsp;doesn't&nbsp;change&nbsp;within&nbsp;the&nbsp;loop</span></span></div></li>
+<li><div class="src-line"><a name="a3009"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">((</span><span class="src-var">$pos</span>&nbsp;<span class="src-sym">&</span>&nbsp;<span class="src-num">1</span><span class="src-sym">)</span>&nbsp;||&nbsp;<span class="src-num">1</span>&nbsp;==&nbsp;<span class="src-var">$tab_end_width</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3010"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$str</span>&nbsp;.=&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$tab_string</span><span class="src-sym">,</span>&nbsp;<span class="src-num">6</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$tab_end_width</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3011"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3012"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$str</span>&nbsp;.=&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$tab_string</span><span class="src-sym">,</span>&nbsp;<span class="src-num">0</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$tab_end_width</span>+<span class="src-num">5</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3013"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3014"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$lines</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-var">$str</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3015"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$pos</span>&nbsp;+=&nbsp;<span class="src-var">$tab_end_width</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3016"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3017"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-id">false</span>&nbsp;===&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$line</span><span class="src-sym">,</span>&nbsp;<span class="src-str">&quot;\t&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-num">1</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3018"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$lines</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$line</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3019"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3020"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3021"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-num">0</span>&nbsp;==&nbsp;<span class="src-var">$pos</span>&nbsp;&amp;&amp;&nbsp;<span class="src-str">'&nbsp;'</span>&nbsp;==&nbsp;<span class="src-var">$char</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3022"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$lines</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-str">'&amp;nbsp;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3023"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++<span class="src-var">$pos</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3024"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3025"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$lines</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;.=&nbsp;<span class="src-var">$char</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3026"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++<span class="src-var">$pos</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3027"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3028"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3029"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3030"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;=&nbsp;<a href="http://www.php.net/implode">implode</a><span class="src-sym">(</span><span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$lines</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3031"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$lines</span><span class="src-sym">)</span><span class="src-sym">;</span><span class="src-comm">//We&nbsp;don't&nbsp;need&nbsp;the&nbsp;lines&nbsp;separated&nbsp;beyond&nbsp;this&nbsp;---&nbsp;free&nbsp;them!</span></span></div></li>
+<li><div class="src-line"><a name="a3032"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3033"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Other&nbsp;whitespace</span></span></div></li>
+<li><div class="src-line"><a name="a3034"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;BenBE:&nbsp;Fix&nbsp;to&nbsp;reduce&nbsp;the&nbsp;number&nbsp;of&nbsp;replacements&nbsp;to&nbsp;be&nbsp;done</span></span></div></li>
+<li><div class="src-line"><a name="a3035"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_replace">preg_replace</a><span class="src-sym">(</span><span class="src-str">'/^&nbsp;/m'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'&amp;nbsp;'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$result</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3036"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">'&nbsp;&nbsp;'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'&nbsp;&amp;nbsp;'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$result</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3037"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3038"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS&quot;&gt;GESHI_NO_LINE_NUMBERS&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3039"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_ending</span>&nbsp;===&nbsp;<span class="src-id">null</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3040"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;=&nbsp;<a href="http://www.php.net/nl2br">nl2br</a><span class="src-sym">(</span><span class="src-var">$result</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3041"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3042"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$result</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_ending</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$result</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3043"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3044"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3045"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3046"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3047"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a3048"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Changes&nbsp;the&nbsp;case&nbsp;of&nbsp;a&nbsp;keyword&nbsp;for&nbsp;those&nbsp;languages&nbsp;where&nbsp;a&nbsp;change&nbsp;is&nbsp;asked&nbsp;for</span></div></li>
+<li><div class="src-line"><a name="a3049"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3050"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc">&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;keyword&nbsp;to&nbsp;change&nbsp;the&nbsp;case&nbsp;of</span></div></li>
+<li><div class="src-line"><a name="a3051"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@return&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;keyword&nbsp;with&nbsp;its&nbsp;case&nbsp;changed</span></div></li>
+<li><div class="src-line"><a name="a3052"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a3053"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@access</span><span class="src-doc">&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a3054"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a3055"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">change_case</span><span class="src-sym">(</span><span class="src-var">$instr</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3056"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">switch</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'CASE_KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3057"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">case</span>&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_CAPS_UPPER&quot;&gt;GESHI_CAPS_UPPER&lt;/a&gt;</span>:</span></div></li>
+<li><div class="src-line"><a name="a3058"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<a href="http://www.php.net/strtoupper">strtoupper</a><span class="src-sym">(</span><span class="src-var">$instr</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3059"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">case</span>&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_CAPS_LOWER&quot;&gt;GESHI_CAPS_LOWER&lt;/a&gt;</span>:</span></div></li>
+<li><div class="src-line"><a name="a3060"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<a href="http://www.php.net/strtolower">strtolower</a><span class="src-sym">(</span><span class="src-var">$instr</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3061"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">default</span>:</span></div></li>
+<li><div class="src-line"><a name="a3062"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$instr</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3063"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3064"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3065"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3066"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a3067"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Handles&nbsp;replacements&nbsp;of&nbsp;keywords&nbsp;to&nbsp;include&nbsp;markup&nbsp;and&nbsp;links&nbsp;if&nbsp;requested</span></div></li>
+<li><div class="src-line"><a name="a3068"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3069"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc">&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;keyword&nbsp;to&nbsp;add&nbsp;the&nbsp;Markup&nbsp;to</span></div></li>
+<li><div class="src-line"><a name="a3070"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@return&nbsp;</span><span class="src-doc-type">The&nbsp;</span><span class="src-doc">HTML&nbsp;for&nbsp;the&nbsp;match&nbsp;found</span></div></li>
+<li><div class="src-line"><a name="a3071"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;&nbsp;1.0.8</span></div></li>
+<li><div class="src-line"><a name="a3072"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@access</span><span class="src-doc">&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a3073"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3074"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@todo</span><span class="src-doc">&nbsp;&nbsp;&nbsp;Get&nbsp;rid&nbsp;of&nbsp;ender&nbsp;in&nbsp;keyword&nbsp;links</span></div></li>
+<li><div class="src-line"><a name="a3075"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a3076"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">handle_keyword_replace</span><span class="src-sym">(</span><span class="src-var">$match</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3077"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$k</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_kw_replace_group</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3078"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$keyword</span>&nbsp;=&nbsp;<span class="src-var">$match</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3079"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3080"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$before</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3081"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$after</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3082"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3083"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">keyword_links</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3084"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Keyword&nbsp;links&nbsp;have&nbsp;been&nbsp;ebabled</span></span></div></li>
+<li><div class="src-line"><a name="a3085"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a3086"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'URLS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a3087"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'URLS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span>&nbsp;!=&nbsp;<span class="src-str">''</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3088"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;There&nbsp;is&nbsp;a&nbsp;base&nbsp;group&nbsp;for&nbsp;this&nbsp;keyword</span></span></div></li>
+<li><div class="src-line"><a name="a3089"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a3090"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Old&nbsp;system:&nbsp;strtolower</span></span></div></li>
+<li><div class="src-line"><a name="a3091"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//$keyword&nbsp;=&nbsp;(&nbsp;$this-&gt;language_data['CASE_SENSITIVE'][$group]&nbsp;)&nbsp;?&nbsp;$keyword&nbsp;:&nbsp;strtolower($keyword);</span></span></div></li>
+<li><div class="src-line"><a name="a3092"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;New&nbsp;system:&nbsp;get&nbsp;keyword&nbsp;from&nbsp;language&nbsp;file&nbsp;to&nbsp;get&nbsp;correct&nbsp;case</span></span></div></li>
+<li><div class="src-line"><a name="a3093"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'CASE_SENSITIVE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a3094"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'URLS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'{FNAME}'</span><span class="src-sym">)</span>&nbsp;!==&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3095"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$word</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3096"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/strcasecmp">strcasecmp</a><span class="src-sym">(</span><span class="src-var">$word</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$keyword</span><span class="src-sym">)</span>&nbsp;==&nbsp;<span class="src-num">0</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3097"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3098"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3099"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3100"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3101"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$word</span>&nbsp;=&nbsp;<span class="src-var">$keyword</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3102"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3103"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3104"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$before</span>&nbsp;=&nbsp;<span class="src-str">'&lt;|UR1|&quot;'</span>&nbsp;.</span></div></li>
+<li><div class="src-line"><a name="a3105"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a3106"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a3107"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'{FNAME}'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3108"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'{FNAMEL}'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3109"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'{FNAMEU}'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3110"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'.'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3111"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a3112"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">'+'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'%20'</span><span class="src-sym">,</span>&nbsp;<a href="http://www.php.net/urlencode">urlencode</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$word</span><span class="src-sym">)))</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3113"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">'+'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'%20'</span><span class="src-sym">,</span>&nbsp;<a href="http://www.php.net/urlencode">urlencode</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><a href="http://www.php.net/strtolower">strtolower</a><span class="src-sym">(</span><span class="src-var">$word</span><span class="src-sym">))))</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3114"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">'+'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'%20'</span><span class="src-sym">,</span>&nbsp;<a href="http://www.php.net/urlencode">urlencode</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><a href="http://www.php.net/strtoupper">strtoupper</a><span class="src-sym">(</span><span class="src-var">$word</span><span class="src-sym">))))</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3115"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;DOT&gt;'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3116"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'URLS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span></span></div></li>
+<li><div class="src-line"><a name="a3117"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3118"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$after</span>&nbsp;=&nbsp;<span class="src-str">'&lt;/a&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3119"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3120"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3121"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3122"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$before</span>&nbsp;.&nbsp;<span class="src-str">'&lt;|/'</span>.&nbsp;<span class="src-var">$k</span>&nbsp;.<span class="src-str">'/&gt;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">change_case</span><span class="src-sym">(</span><span class="src-var">$keyword</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">'|&gt;'</span>&nbsp;.&nbsp;<span class="src-var">$after</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3123"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3124"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3125"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a3126"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;handles&nbsp;regular&nbsp;expressions&nbsp;highlighting-definitions&nbsp;with&nbsp;callback&nbsp;functions</span></div></li>
+<li><div class="src-line"><a name="a3127"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3128"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-tag">@note</span><span class="src-doc">&nbsp;this&nbsp;is&nbsp;a&nbsp;callback,&nbsp;don't&nbsp;use&nbsp;it&nbsp;directly</span></div></li>
+<li><div class="src-line"><a name="a3129"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3130"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">array&nbsp;</span><span class="src-doc">the&nbsp;matches&nbsp;array</span></div></li>
+<li><div class="src-line"><a name="a3131"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@return&nbsp;</span><span class="src-doc-type">The&nbsp;</span><span class="src-doc">highlighted&nbsp;string</span></div></li>
+<li><div class="src-line"><a name="a3132"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.8</span></div></li>
+<li><div class="src-line"><a name="a3133"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@access</span><span class="src-doc">&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a3134"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a3135"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">handle_regexps_callback</span><span class="src-sym">(</span><span class="src-var">$matches</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3136"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;before:&nbsp;&quot;'&nbsp;style=\&quot;'&nbsp;.&nbsp;call_user_func(\&quot;$func\&quot;,&nbsp;'\\1')&nbsp;.&nbsp;'\&quot;\\1|&gt;'&quot;,</span></span></div></li>
+<li><div class="src-line"><a name="a3137"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<a href="http://www.php.net/call_user_func">call_user_func</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_rx_key</span><span class="src-sym">]</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span>.&nbsp;<span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'|&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3138"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3139"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3140"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a3141"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;handles&nbsp;newlines&nbsp;in&nbsp;REGEXPS&nbsp;matches.&nbsp;Set&nbsp;the&nbsp;_hmr_*&nbsp;vars&nbsp;before&nbsp;calling&nbsp;this</span></div></li>
+<li><div class="src-line"><a name="a3142"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3143"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-tag">@note</span><span class="src-doc">&nbsp;this&nbsp;is&nbsp;a&nbsp;callback,&nbsp;don't&nbsp;use&nbsp;it&nbsp;directly</span></div></li>
+<li><div class="src-line"><a name="a3144"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3145"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">array&nbsp;</span><span class="src-doc">the&nbsp;matches&nbsp;array</span></div></li>
+<li><div class="src-line"><a name="a3146"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@return&nbsp;</span><span class="src-doc-type">string&nbsp;</span></div></li>
+<li><div class="src-line"><a name="a3147"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.8</span></div></li>
+<li><div class="src-line"><a name="a3148"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@access</span><span class="src-doc">&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a3149"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a3150"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">handle_multiline_regexps</span><span class="src-sym">(</span><span class="src-var">$matches</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3151"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$before</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_before</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3152"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$after</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_after</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3153"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_replace</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3154"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$replace</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_replace</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3155"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$search</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3156"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3157"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/array_keys">array_keys</a><span class="src-sym">(</span><span class="src-var">$matches</span><span class="src-sym">)</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$k</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3158"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$search</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'\\'</span>&nbsp;.&nbsp;<span class="src-var">$k</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3159"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3160"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3161"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$before</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-var">$search</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$matches</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$before</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3162"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$after</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-var">$search</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$matches</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$after</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3163"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$replace</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-var">$search</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$matches</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$replace</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3164"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3165"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$replace</span>&nbsp;=&nbsp;<span class="src-var">$matches</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3166"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3167"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$before</span></span></div></li>
+<li><div class="src-line"><a name="a3168"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;<span class="src-str">'&lt;|!REG3XP'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_key</span>&nbsp;.<span class="src-str">'!&gt;'</span></span></div></li>
+<li><div class="src-line"><a name="a3169"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-str">&quot;|&gt;\n&lt;|!REG3XP&quot;</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_key</span>&nbsp;.&nbsp;<span class="src-str">'!&gt;'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$replace</span><span class="src-sym">)</span></span></div></li>
+<li><div class="src-line"><a name="a3170"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;<span class="src-str">'|&gt;'</span></span></div></li>
+<li><div class="src-line"><a name="a3171"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;<span class="src-var">$after</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3172"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3173"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3174"></a><span class="src-doc">/**</span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div></li>
+<li><div class="src-line"><a name="a3175"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Takes&nbsp;a&nbsp;string&nbsp;that&nbsp;has&nbsp;no&nbsp;strings&nbsp;or&nbsp;comments&nbsp;in&nbsp;it,&nbsp;and&nbsp;highlights</span></div></li>
+<li><div class="src-line"><a name="a3176"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;stuff&nbsp;like&nbsp;keywords,&nbsp;numbers&nbsp;and&nbsp;methods.</span></div></li>
+<li><div class="src-line"><a name="a3177"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3178"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@param&nbsp;</span><span class="src-doc-type">string&nbsp;</span><span class="src-doc">The&nbsp;string&nbsp;to&nbsp;parse&nbsp;for&nbsp;keyword,&nbsp;numbers&nbsp;etc.</span></div></li>
+<li><div class="src-line"><a name="a3179"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@since</span><span class="src-doc">&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a3180"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@access</span><span class="src-doc">&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a3181"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span class="src-doc-coretag">@todo</span><span class="src-doc">&nbsp;BUGGY!&nbsp;Why?&nbsp;Why&nbsp;not&nbsp;build&nbsp;string&nbsp;and&nbsp;return?</span></div></li>
+<li><div class="src-line"><a name="a3182"></a><span class="src-doc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span class="src-str"></span></span></div></li>
+<li><div class="src-line"><a name="a3183"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">parse_non_string_part</span><span class="src-sym">(</span><span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3184"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3185"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3186"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Regular&nbsp;expressions</span></span></div></li>
+<li><div class="src-line"><a name="a3187"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span>&nbsp;=&gt;&nbsp;<span class="src-var">$regexp</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3188"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3189"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$regexp</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3190"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS&quot;&gt;GESHI_NO_LINE_NUMBERS&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3191"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;produce&nbsp;valid&nbsp;HTML&nbsp;when&nbsp;we&nbsp;match&nbsp;multiple&nbsp;lines</span></span></div></li>
+<li><div class="src-line"><a name="a3192"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_replace</span>&nbsp;=&nbsp;<span class="src-var">$regexp</span><span class="src-sym">[</span><span class="src-id">GESHI_REPLACE</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3193"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_before</span>&nbsp;=&nbsp;<span class="src-var">$regexp</span><span class="src-sym">[</span><span class="src-id">GESHI_BEFORE</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3194"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_key</span>&nbsp;=&nbsp;<span class="src-var">$key</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3195"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_after</span>&nbsp;=&nbsp;<span class="src-var">$regexp</span><span class="src-sym">[</span><span class="src-id">GESHI_AFTER</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3196"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_replace_callback">preg_replace_callback</a><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a3197"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;/&quot;</span>&nbsp;.&nbsp;<span class="src-var">$regexp</span><span class="src-sym">[</span><span class="src-id">GESHI_SEARCH</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">"</span></span>/{<span class="src-var">$regexp</span><span class="src-sym">[</span><span class="src-id">GESHI_MODIFIERS</span><span class="src-sym">]</span><span class="src-sym">}</span><span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3198"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'handle_multiline_regexps'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3199"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3200"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_replace</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3201"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_before</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3202"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_after</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3203"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3204"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_replace">preg_replace</a><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a3205"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'/'</span>&nbsp;.&nbsp;<span class="src-var">$regexp</span><span class="src-sym">[</span><span class="src-id">GESHI_SEARCH</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'/'</span>&nbsp;.&nbsp;<span class="src-var">$regexp</span><span class="src-sym">[</span><span class="src-id">GESHI_MODIFIERS</span><span class="src-sym">]</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3206"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$regexp</span><span class="src-sym">[</span><span class="src-id">GESHI_BEFORE</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&lt;|!REG3XP'</span>.&nbsp;<span class="src-var">$key</span>&nbsp;.<span class="src-str">'!&gt;'</span>&nbsp;.&nbsp;<span class="src-var">$regexp</span><span class="src-sym">[</span><span class="src-id">GESHI_REPLACE</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'|&gt;'</span>&nbsp;.&nbsp;<span class="src-var">$regexp</span><span class="src-sym">[</span><span class="src-id">GESHI_AFTER</span><span class="src-sym">]</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3207"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3208"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3209"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3210"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS&quot;&gt;GESHI_NO_LINE_NUMBERS&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3211"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;produce&nbsp;valid&nbsp;HTML&nbsp;when&nbsp;we&nbsp;match&nbsp;multiple&nbsp;lines</span></span></div></li>
+<li><div class="src-line"><a name="a3212"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_key</span>&nbsp;=&nbsp;<span class="src-var">$key</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3213"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_replace_callback">preg_replace_callback</a><span class="src-sym">(</span>&nbsp;<span class="src-str">&quot;/(&quot;</span>&nbsp;.&nbsp;<span class="src-var">$regexp</span>&nbsp;.&nbsp;<span class="src-str">&quot;)/&quot;</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3214"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'handle_multiline_regexps'</span><span class="src-sym">)</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3215"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_hmr_key</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3216"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3217"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_replace">preg_replace</a><span class="src-sym">(</span>&nbsp;<span class="src-str">&quot;/(&quot;</span>&nbsp;.&nbsp;<span class="src-var">$regexp</span>&nbsp;.&nbsp;<span class="src-str">&quot;)/&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-str">"</span></span>&lt;|!REG3XP<span class="src-var">$key</span>!&gt;\\1|&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3218"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3219"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3220"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3221"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3222"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3223"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Highlight&nbsp;numbers.&nbsp;As&nbsp;of&nbsp;1.0.8&nbsp;we&nbsp;support&nbsp;diffent&nbsp;types&nbsp;of&nbsp;numbers</span></span></div></li>
+<li><div class="src-line"><a name="a3224"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$numbers_found</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3225"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span>&nbsp;&amp;&amp;&nbsp;<a href="http://www.php.net/preg_match">preg_match</a><span class="src-sym">(</span><span class="src-str">'#\d#'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;<span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3226"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$numbers_found</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3227"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3228"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//For&nbsp;each&nbsp;of&nbsp;the&nbsp;formats&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a3229"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS_RXCACHE'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$id</span>&nbsp;=&gt;&nbsp;<span class="src-var">$regexp</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3230"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Check&nbsp;if&nbsp;it&nbsp;should&nbsp;be&nbsp;highlighted&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a3231"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_replace">preg_replace</a><span class="src-sym">(</span><span class="src-var">$regexp</span><span class="src-sym">,</span>&nbsp;<span class="src-str">"</span></span>&lt;|/NUM!<span class="src-var">$id</span>/&gt;\\1|&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3232"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3233"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3234"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3235"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Highlight&nbsp;keywords</span></span></div></li>
+<li><div class="src-line"><a name="a3236"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$disallowed_before</span>&nbsp;=&nbsp;<span class="src-str">&quot;(?&lt;![a-zA-Z0-9\$_\|\#;&gt;|^&amp;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3237"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$disallowed_after</span>&nbsp;=&nbsp;<span class="src-str">&quot;(?![a-zA-Z0-9_\|%\\-&amp;;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3238"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'STRINGS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3239"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$quotemarks</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_quote">preg_quote</a><span class="src-sym">(</span><a href="http://www.php.net/implode">implode</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'QUOTEMARKS'</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'/'</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3240"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$disallowed_before</span>&nbsp;.=&nbsp;<span class="src-var">$quotemarks</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3241"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$disallowed_after</span>&nbsp;.=&nbsp;<span class="src-var">$quotemarks</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3242"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3243"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$disallowed_before</span>&nbsp;.=&nbsp;<span class="src-str">&quot;])&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3244"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$disallowed_after</span>&nbsp;.=&nbsp;<span class="src-str">&quot;])&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3245"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3246"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parser_control_pergroup</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3247"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3248"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3249"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$x</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span>&nbsp;<span class="src-comm">//&nbsp;check&nbsp;wether&nbsp;per-keyword-group&nbsp;parser_control&nbsp;is&nbsp;enabled</span></span></div></li>
+<li><div class="src-line"><a name="a3250"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'DISALLOWED_BEFORE'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3251"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$disallowed_before</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'DISALLOWED_BEFORE'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3252"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++<span class="src-var">$x</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3253"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3254"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'DISALLOWED_AFTER'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3255"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$disallowed_after</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'DISALLOWED_AFTER'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3256"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++<span class="src-var">$x</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3257"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3258"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parser_control_pergroup</span>&nbsp;=&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/count">count</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;-&nbsp;<span class="src-var">$x</span><span class="src-sym">)</span>&nbsp;>&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3259"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3260"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3261"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3262"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;if&nbsp;this&nbsp;is&nbsp;changed,&nbsp;don't&nbsp;forget&nbsp;to&nbsp;change&nbsp;it&nbsp;below</span></span></div></li>
+<li><div class="src-line"><a name="a3263"></a></span><span class="src-str"><span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!empty($disallowed_before))&nbsp;{</span></span></div></li>
+<li><div class="src-line"><a name="a3264"></a></span><span class="src-str"><span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$disallowed_before&nbsp;=&nbsp;&quot;(?&lt;![$disallowed_before])&quot;;</span></span></div></li>
+<li><div class="src-line"><a name="a3265"></a></span><span class="src-str"><span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div></li>
+<li><div class="src-line"><a name="a3266"></a></span><span class="src-str"><span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!empty($disallowed_after))&nbsp;{</span></span></div></li>
+<li><div class="src-line"><a name="a3267"></a></span><span class="src-str"><span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$disallowed_after&nbsp;=&nbsp;&quot;(?![$disallowed_after])&quot;;</span></span></div></li>
+<li><div class="src-line"><a name="a3268"></a></span><span class="src-str"><span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div></li>
+<li><div class="src-line"><a name="a3269"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a3270"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/array_keys">array_keys</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$k</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3271"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a3272"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3273"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3274"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$case_sensitive</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'CASE_SENSITIVE'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3275"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$modifiers</span>&nbsp;=&nbsp;<span class="src-var">$case_sensitive</span>&nbsp;?&nbsp;<span class="src-str">''</span>&nbsp;:&nbsp;<span class="src-str">'i'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3276"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3277"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;NEW&nbsp;in&nbsp;1.0.8&nbsp;-&nbsp;per-keyword-group&nbsp;parser&nbsp;control</span></span></div></li>
+<li><div class="src-line"><a name="a3278"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$disallowed_before_local</span>&nbsp;=&nbsp;<span class="src-var">$disallowed_before</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3279"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$disallowed_after_local</span>&nbsp;=&nbsp;<span class="src-var">$disallowed_after</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3280"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$parser_control_pergroup</span>&nbsp;&amp;&amp;&nbsp;isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3281"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'DISALLOWED_BEFORE'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3282"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$disallowed_before_local</span>&nbsp;=</span></div></li>
+<li><div class="src-line"><a name="a3283"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'DISALLOWED_BEFORE'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3284"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3285"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3286"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'DISALLOWED_AFTER'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3287"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$disallowed_after_local</span>&nbsp;=</span></div></li>
+<li><div class="src-line"><a name="a3288"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'DISALLOWED_AFTER'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3289"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3290"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3291"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3292"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_kw_replace_group</span>&nbsp;=&nbsp;<span class="src-var">$k</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3293"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3294"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//NEW&nbsp;in&nbsp;1.0.8,&nbsp;the&nbsp;cached&nbsp;regexp&nbsp;list</span></span></div></li>
+<li><div class="src-line"><a name="a3295"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;since&nbsp;we&nbsp;don't&nbsp;want&nbsp;PHP&nbsp;/&nbsp;PCRE&nbsp;to&nbsp;crash&nbsp;due&nbsp;to&nbsp;too&nbsp;large&nbsp;patterns&nbsp;we&nbsp;split&nbsp;them&nbsp;into&nbsp;smaller&nbsp;chunks</span></span></div></li>
+<li><div class="src-line"><a name="a3296"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$set</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$set_length</span>&nbsp;=&nbsp;<a href="http://www.php.net/count">count</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'CACHED_KEYWORD_LISTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$set</span>&nbsp;<&nbsp;&nbsp;<span class="src-var">$set_length</span><span class="src-sym">;</span>&nbsp;++<span class="src-var">$set</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3297"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$keywordset</span>&nbsp;=<span class="src-sym">&</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'CACHED_KEYWORD_LISTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$set</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3298"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Might&nbsp;make&nbsp;a&nbsp;more&nbsp;unique&nbsp;string&nbsp;for&nbsp;putting&nbsp;the&nbsp;number&nbsp;in&nbsp;soon</span></span></div></li>
+<li><div class="src-line"><a name="a3299"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Basically,&nbsp;we&nbsp;don't&nbsp;put&nbsp;the&nbsp;styles&nbsp;in&nbsp;yet&nbsp;because&nbsp;then&nbsp;the&nbsp;styles&nbsp;themselves&nbsp;will</span></span></div></li>
+<li><div class="src-line"><a name="a3300"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;get&nbsp;highlighted&nbsp;if&nbsp;the&nbsp;language&nbsp;has&nbsp;a&nbsp;CSS&nbsp;keyword&nbsp;in&nbsp;it&nbsp;(like&nbsp;CSS,&nbsp;for&nbsp;example&nbsp;;))</span></span></div></li>
+<li><div class="src-line"><a name="a3301"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_replace_callback">preg_replace_callback</a><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a3302"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">"</span></span>/<span class="src-var">$disallowed_before_local</span>({<span class="src-var">$keywordset</span><span class="src-sym">}</span>)(?!\&lt;DOT\&gt;(?:htm|php))<span class="src-var">$disallowed_after_local</span>/<span class="src-var">$modifiers</span><span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3303"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'handle_keyword_replace'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3304"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span></span></div></li>
+<li><div class="src-line"><a name="a3305"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3306"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3307"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3308"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3309"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3310"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//</span></span></div></li>
+<li><div class="src-line"><a name="a3311"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Now&nbsp;that's&nbsp;all&nbsp;done,&nbsp;replace&nbsp;/[number]/&nbsp;with&nbsp;the&nbsp;correct&nbsp;styles</span></span></div></li>
+<li><div class="src-line"><a name="a3312"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//</span></span></div></li>
+<li><div class="src-line"><a name="a3313"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/array_keys">array_keys</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$k</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3314"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3315"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.</span></div></li>
+<li><div class="src-line"><a name="a3316"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;?</span></div></li>
+<li><div class="src-line"><a name="a3317"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$k</span><span class="src-sym">]</span>&nbsp;:&nbsp;<span class="src-str">&quot;&quot;</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3318"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3319"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;kw'</span>&nbsp;.&nbsp;<span class="src-var">$k</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3320"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3321"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">"</span></span>&lt;|/<span class="src-var">$k</span>/&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span>&nbsp;</span><span class="src-str">&quot;</span>&lt;|<span class="src-var">$attributes</span>&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3322"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3323"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3324"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$numbers_found</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3325"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Put&nbsp;number&nbsp;styles&nbsp;in</span></span></div></li>
+<li><div class="src-line"><a name="a3326"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS_RXCACHE'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$id</span>&nbsp;=&gt;&nbsp;<span class="src-var">$regexp</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3327"></a></span><span class="src-str"><span class="src-comm">//Commented&nbsp;out&nbsp;for&nbsp;now,&nbsp;as&nbsp;this&nbsp;needs&nbsp;some&nbsp;review&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a3328"></a></span><span class="src-str"><span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($numbers_permissions&nbsp;&amp;&nbsp;$id)&nbsp;{</span></span></div></li>
+<li><div class="src-line"><a name="a3329"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Get&nbsp;the&nbsp;appropriate&nbsp;style&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a3330"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Checking&nbsp;for&nbsp;unset&nbsp;styles&nbsp;is&nbsp;done&nbsp;by&nbsp;the&nbsp;style&nbsp;cache&nbsp;builder&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a3331"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3332"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$id</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3333"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3334"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;nu'</span>.<span class="src-var">$id</span>.<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3335"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3336"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3337"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Set&nbsp;in&nbsp;the&nbsp;correct&nbsp;styles&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a3338"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">"</span></span>/NUM!<span class="src-var">$id</span>/<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span>&nbsp;<span class="src-var">$attributes</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3339"></a></span><span class="src-str"><span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div></li>
+<li><div class="src-line"><a name="a3340"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3341"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3342"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3343"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Highlight&nbsp;methods&nbsp;and&nbsp;fields&nbsp;in&nbsp;objects</span></span></div></li>
+<li><div class="src-line"><a name="a3344"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'METHODS'</span><span class="src-sym">]</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'OOLANG'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3345"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$oolang_spaces</span>&nbsp;=&nbsp;<span class="src-str">&quot;[\s]*&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3346"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$oolang_before</span>&nbsp;=&nbsp;<span class="src-str">&quot;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3347"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$oolang_after</span>&nbsp;=&nbsp;<span class="src-str">&quot;[a-zA-Z][a-zA-Z0-9_]*&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3348"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3349"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'OOLANG'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3350"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'OOLANG'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'MATCH_BEFORE'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3351"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$oolang_before</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'OOLANG'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'MATCH_BEFORE'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3352"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3353"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'OOLANG'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'MATCH_AFTER'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3354"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$oolang_after</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'OOLANG'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'MATCH_AFTER'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3355"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3356"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'OOLANG'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'MATCH_SPACES'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3357"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$oolang_spaces</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'OOLANG'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'MATCH_SPACES'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3358"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3359"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3360"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3361"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3362"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'OBJECT_SPLITTERS'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span>&nbsp;=&gt;&nbsp;<span class="src-var">$splitter</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3363"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-id">false</span>&nbsp;!==&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$stuff_to_parse</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$splitter</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3364"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3365"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'METHODS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3366"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3367"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;me'</span>&nbsp;.&nbsp;<span class="src-var">$key</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3368"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3369"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_replace">preg_replace</a><span class="src-sym">(</span><span class="src-str">"</span></span>/(<span class="src-var">$oolang_before</span>)(<span class="src-str">&quot;&nbsp;</span><span class="src-str">.&nbsp;<span class="src-id">preg_quote</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'OBJECT_SPLITTERS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'/'</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">"</span></span>)(<span class="src-var">$oolang_spaces</span>)(<span class="src-var">$oolang_after</span>)/<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span>&nbsp;</span><span class="src-str">&quot;</span>\\1\\2\\3&lt;|<span class="src-var">$attributes</span>&gt;\\4|&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3370"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3371"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3372"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3373"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3374"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//</span></span></div></li>
+<li><div class="src-line"><a name="a3375"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Highlight&nbsp;brackets.&nbsp;Yes,&nbsp;I've&nbsp;tried&nbsp;adding&nbsp;a&nbsp;semi-colon&nbsp;to&nbsp;this&nbsp;list.</span></span></div></li>
+<li><div class="src-line"><a name="a3376"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;You&nbsp;try&nbsp;it,&nbsp;and&nbsp;see&nbsp;what&nbsp;happens&nbsp;;)</span></span></div></li>
+<li><div class="src-line"><a name="a3377"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;TODO:&nbsp;Fix&nbsp;lexic&nbsp;permissions&nbsp;not&nbsp;converting&nbsp;entities&nbsp;if&nbsp;shouldn't</span></span></div></li>
+<li><div class="src-line"><a name="a3378"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;be&nbsp;highlighting&nbsp;regardless</span></span></div></li>
+<li><div class="src-line"><a name="a3379"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//</span></span></div></li>
+<li><div class="src-line"><a name="a3380"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3381"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'CACHE_BRACKET_MATCH'</span><span class="src-sym">]</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3382"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'CACHE_BRACKET_REPLACE'</span><span class="src-sym">]</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3383"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3384"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3385"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3386"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//FIX&nbsp;for&nbsp;symbol&nbsp;highlighting&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a3387"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'SYMBOLS'</span><span class="src-sym">]</span>&nbsp;&amp;&amp;&nbsp;<span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOLS'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3388"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Get&nbsp;all&nbsp;matches&nbsp;and&nbsp;throw&nbsp;away&nbsp;those&nbsp;witin&nbsp;a&nbsp;block&nbsp;that&nbsp;is&nbsp;already&nbsp;highlighted...&nbsp;(i.e.&nbsp;matched&nbsp;by&nbsp;a&nbsp;regexp)</span></span></div></li>
+<li><div class="src-line"><a name="a3389"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$n_symbols</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_match_all">preg_match_all</a><span class="src-sym">(</span><span class="src-str">&quot;/&lt;\|(?:&lt;DOT&gt;|[^&gt;])+&gt;(?:(?!\|&gt;).*?)\|&gt;|&lt;\/a&gt;|(?:&quot;</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOL_SEARCH'</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">&quot;)+/&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$pot_symbols</span><span class="src-sym">,</span>&nbsp;<span class="src-id">PREG_OFFSET_CAPTURE</span>&nbsp;|&nbsp;<span class="src-id">PREG_SET_ORDER</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3390"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$global_offset</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3391"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$s_id</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$s_id</span>&nbsp;<&nbsp;<span class="src-var">$n_symbols</span><span class="src-sym">;</span>&nbsp;++<span class="src-var">$s_id</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3392"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_match</span>&nbsp;=&nbsp;<span class="src-var">$pot_symbols</span><span class="src-sym">[</span><span class="src-var">$s_id</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3393"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$symbol_match</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'&lt;'</span><span class="src-sym">)</span>&nbsp;!==&nbsp;<span class="src-id">false</span>&nbsp;||&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$symbol_match</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'&gt;'</span><span class="src-sym">)</span>&nbsp;!==&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3394"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;already&nbsp;highlighted&nbsp;blocks&nbsp;_must_&nbsp;include&nbsp;either&nbsp;&lt;&nbsp;or&nbsp;&gt;</span></span></div></li>
+<li><div class="src-line"><a name="a3395"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;so&nbsp;if&nbsp;this&nbsp;conditional&nbsp;applies,&nbsp;we&nbsp;have&nbsp;to&nbsp;skip&nbsp;this&nbsp;match</span></span></div></li>
+<li><div class="src-line"><a name="a3396"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;BenBE:&nbsp;UNLESS&nbsp;the&nbsp;block&nbsp;contains&nbsp;&lt;SEMI&gt;&nbsp;or&nbsp;&lt;PIPE&gt;</span></span></div></li>
+<li><div class="src-line"><a name="a3397"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$symbol_match</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'&lt;SEMI&gt;'</span><span class="src-sym">)</span>&nbsp;===&nbsp;<span class="src-id">false</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a3398"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$symbol_match</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'&lt;PIPE&gt;'</span><span class="src-sym">)</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3399"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3400"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3401"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3402"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3403"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;if&nbsp;we&nbsp;reach&nbsp;this&nbsp;point,&nbsp;we&nbsp;have&nbsp;a&nbsp;valid&nbsp;match&nbsp;which&nbsp;needs&nbsp;to&nbsp;be&nbsp;highlighted</span></span></div></li>
+<li><div class="src-line"><a name="a3404"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a3405"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_length</span>&nbsp;=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$symbol_match</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3406"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_offset</span>&nbsp;=&nbsp;<span class="src-var">$pot_symbols</span><span class="src-sym">[</span><span class="src-var">$s_id</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3407"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$pot_symbols</span><span class="src-sym">[</span><span class="src-var">$s_id</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3408"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_end</span>&nbsp;=&nbsp;<span class="src-var">$symbol_length</span>&nbsp;+&nbsp;<span class="src-var">$symbol_offset</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3409"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_hl</span>&nbsp;=&nbsp;<span class="src-str">&quot;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3410"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3411"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;if&nbsp;we&nbsp;have&nbsp;multiple&nbsp;styles,&nbsp;we&nbsp;have&nbsp;to&nbsp;handle&nbsp;them&nbsp;properly</span></span></div></li>
+<li><div class="src-line"><a name="a3412"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'MULTIPLE_SYMBOL_GROUPS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3413"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$old_sym</span>&nbsp;=&nbsp;-<span class="src-num">1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3414"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Split&nbsp;the&nbsp;current&nbsp;stuff&nbsp;to&nbsp;replace&nbsp;into&nbsp;its&nbsp;atomic&nbsp;symbols&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a3415"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/preg_match_all">preg_match_all</a><span class="src-sym">(</span><span class="src-str">&quot;/&quot;</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOL_SEARCH'</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">&quot;/&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$symbol_match</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$sym_match_syms</span><span class="src-sym">,</span>&nbsp;<span class="src-id">PREG_PATTERN_ORDER</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3416"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$sym_match_syms</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$sym_ms</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3417"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Check&nbsp;if&nbsp;consequtive&nbsp;symbols&nbsp;belong&nbsp;to&nbsp;the&nbsp;same&nbsp;group&nbsp;to&nbsp;save&nbsp;output&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a3418"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOL_DATA'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$sym_ms</span><span class="src-sym">]</span><span class="src-sym">)</span></span></div></li>
+<li><div class="src-line"><a name="a3419"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOL_DATA'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$sym_ms</span><span class="src-sym">]</span>&nbsp;!=&nbsp;<span class="src-var">$old_sym</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3420"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>-<span class="src-num">1</span>&nbsp;!=&nbsp;<span class="src-var">$old_sym</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3421"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_hl</span>&nbsp;.=&nbsp;<span class="src-str">&quot;|&gt;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3422"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3423"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$old_sym</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'SYMBOL_DATA'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$sym_ms</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3424"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3425"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_hl</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;|&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'SYMBOLS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$old_sym</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3426"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3427"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_hl</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;|&nbsp;class=&quot;sy'</span>&nbsp;.&nbsp;<span class="src-var">$old_sym</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3428"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3429"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3430"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_hl</span>&nbsp;.=&nbsp;<span class="src-var">$sym_ms</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3431"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3432"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$sym_match_syms</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3433"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3434"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Close&nbsp;remaining&nbsp;tags&nbsp;and&nbsp;insert&nbsp;the&nbsp;replacement&nbsp;at&nbsp;the&nbsp;right&nbsp;position&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a3435"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Take&nbsp;caution&nbsp;if&nbsp;symbol_hl&nbsp;is&nbsp;empty&nbsp;to&nbsp;avoid&nbsp;doubled&nbsp;closing&nbsp;spans.</span></span></div></li>
+<li><div class="src-line"><a name="a3436"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>-<span class="src-num">1</span>&nbsp;!=&nbsp;<span class="src-var">$old_sym</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3437"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_hl</span>&nbsp;.=&nbsp;<span class="src-str">&quot;|&gt;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3438"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3439"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3440"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3441"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_hl</span>&nbsp;=&nbsp;<span class="src-str">'&lt;|&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'SYMBOLS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3442"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3443"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_hl</span>&nbsp;=&nbsp;<span class="src-str">'&lt;|&nbsp;class=&quot;sy0&quot;&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3444"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3445"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$symbol_hl</span>&nbsp;.=&nbsp;<span class="src-var">$symbol_match</span>&nbsp;.&nbsp;<span class="src-str">'|&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3446"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3447"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3448"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/substr_replace">substr_replace</a><span class="src-sym">(</span><span class="src-var">$stuff_to_parse</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$symbol_hl</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$symbol_offset</span>&nbsp;+&nbsp;<span class="src-var">$global_offset</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$symbol_length</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3449"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3450"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;since&nbsp;we&nbsp;replace&nbsp;old&nbsp;text&nbsp;with&nbsp;something&nbsp;of&nbsp;different&nbsp;size,</span></span></div></li>
+<li><div class="src-line"><a name="a3451"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;we'll&nbsp;have&nbsp;to&nbsp;keep&nbsp;track&nbsp;of&nbsp;the&nbsp;differences</span></span></div></li>
+<li><div class="src-line"><a name="a3452"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$global_offset</span>&nbsp;+=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$symbol_hl</span><span class="src-sym">)</span>&nbsp;-&nbsp;<span class="src-var">$symbol_length</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3453"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3454"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3455"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//FIX&nbsp;for&nbsp;symbol&nbsp;highlighting&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a3456"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a3457"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Add&nbsp;class/style&nbsp;for&nbsp;regexps</span></span></div></li>
+<li><div class="src-line"><a name="a3458"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/array_keys">array_keys</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3459"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3460"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/is_callable">is_callable</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3461"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_rx_key</span>&nbsp;=&nbsp;<span class="src-var">$key</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3462"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_replace_callback">preg_replace_callback</a><span class="src-sym">(</span><span class="src-str">"</span></span>/!REG3XP<span class="src-var">$key</span>!(.*)\|&gt;/U<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3463"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'handle_regexps_callback'</span><span class="src-sym">)</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a3464"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3465"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3466"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3467"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3468"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3469"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a3470"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/array_key_exists">array_key_exists</a><span class="src-sym">(</span><span class="src-id">GESHI_CLASS</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3471"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;'</span>&nbsp;.</span></div></li>
+<li><div class="src-line"><a name="a3472"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-id">GESHI_CLASS</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3473"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3474"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;re'</span>&nbsp;.&nbsp;<span class="src-var">$key</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3475"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3476"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3477"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">"</span></span>!REG3XP<span class="src-var">$key</span>!<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span>&nbsp;</span><span class="src-str">&quot;</span><span class="src-var">$attributes</span><span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3478"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3479"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3480"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3481"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3482"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Replace&nbsp;&lt;DOT&gt;&nbsp;with&nbsp;.&nbsp;for&nbsp;urls</span></span></div></li>
+<li><div class="src-line"><a name="a3483"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<span class="src-id">str_replace</span><span class="src-sym">(</span><span class="src-str">'&lt;DOT&gt;'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'.'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3484"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Replace&nbsp;&lt;|UR1|&nbsp;with&nbsp;&lt;a&nbsp;href=&nbsp;for&nbsp;urls&nbsp;also</span></span></div></li>
+<li><div class="src-line"><a name="a3485"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">link_styles</span><span class="src-sym">[</span><span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_LINK&quot;&gt;GESHI_LINK&lt;/a&gt;</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3486"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3487"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">'&lt;|UR1|'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'&lt;a'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">link_target</span>&nbsp;.&nbsp;<span class="src-str">'&nbsp;href='</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3488"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3489"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">'&lt;|UR1|'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'&lt;a'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">link_target</span>&nbsp;.&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">link_styles</span><span class="src-sym">[</span><span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_LINK&quot;&gt;GESHI_LINK&lt;/a&gt;</span><span class="src-sym">]</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&nbsp;href='</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3490"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3491"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3492"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">'&lt;|UR1|'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'&lt;a'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">link_target</span>&nbsp;.&nbsp;<span class="src-str">'&nbsp;href='</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3493"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3494"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3495"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//</span></span></div></li>
+<li><div class="src-line"><a name="a3496"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;NOW&nbsp;we&nbsp;add&nbsp;the&nbsp;span&nbsp;thingy&nbsp;;)</span></span></div></li>
+<li><div class="src-line"><a name="a3497"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//</span></span></div></li>
+<li><div class="src-line"><a name="a3498"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a3499"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">'&lt;|'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'&lt;span'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3500"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a>&nbsp;<span class="src-sym">(</span>&nbsp;<span class="src-str">'|&gt;'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'&lt;/span&gt;'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$stuff_to_parse</span>&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3501"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$stuff_to_parse</span><span class="src-sym">,</span>&nbsp;<span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3502"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3503"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3504"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;/**</span></div></li>
+<li><div class="src-line"><a name="a3505"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sets&nbsp;the&nbsp;time&nbsp;taken&nbsp;to&nbsp;parse&nbsp;the&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a3506"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3507"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;microtime&nbsp;The&nbsp;time&nbsp;when&nbsp;parsing&nbsp;started</span></div></li>
+<li><div class="src-line"><a name="a3508"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;microtime&nbsp;The&nbsp;time&nbsp;when&nbsp;parsing&nbsp;ended</span></div></li>
+<li><div class="src-line"><a name="a3509"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a3510"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a3511"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a3512"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">set_time</span><span class="src-sym">(</span><span class="src-var">$start_time</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$end_time</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3513"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<a href="http://www.php.net/explode">explode</a><span class="src-sym">(</span><span class="src-str">'&nbsp;'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$start_time</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3514"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$end</span>&nbsp;=&nbsp;<a href="http://www.php.net/explode">explode</a><span class="src-sym">(</span><span class="src-str">'&nbsp;'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$end_time</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3515"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="http://www.php.net/time">time</a>&nbsp;=&nbsp;<span class="src-var">$end</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;+&nbsp;<span class="src-var">$end</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span>&nbsp;-&nbsp;<span class="src-var">$start</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span>&nbsp;-&nbsp;<span class="src-var">$start</span><span class="src-sym">[</span><span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3516"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3517"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3518"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;/**</span></div></li>
+<li><div class="src-line"><a name="a3519"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Gets&nbsp;the&nbsp;time&nbsp;taken&nbsp;to&nbsp;parse&nbsp;the&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a3520"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3521"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;double&nbsp;The&nbsp;time&nbsp;taken&nbsp;to&nbsp;parse&nbsp;the&nbsp;code</span></div></li>
+<li><div class="src-line"><a name="a3522"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a3523"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a3524"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodget_time">get_time</a><span class="src-sym">(</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3525"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="http://www.php.net/time">time</a><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3526"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3527"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3528"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;/**</span></div></li>
+<li><div class="src-line"><a name="a3529"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Merges&nbsp;arrays&nbsp;recursively,&nbsp;overwriting&nbsp;values&nbsp;of&nbsp;the&nbsp;first&nbsp;array&nbsp;with&nbsp;values&nbsp;of&nbsp;later&nbsp;arrays</span></div></li>
+<li><div class="src-line"><a name="a3530"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3531"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;1.0.8</span></div></li>
+<li><div class="src-line"><a name="a3532"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a3533"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a3534"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">merge_arrays</span><span class="src-sym">(</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3535"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$arrays</span>&nbsp;=&nbsp;<a href="http://www.php.net/func_get_args">func_get_args</a><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3536"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$narrays</span>&nbsp;=&nbsp;<a href="http://www.php.net/count">count</a><span class="src-sym">(</span><span class="src-var">$arrays</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3537"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3538"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;check&nbsp;arguments</span></span></div></li>
+<li><div class="src-line"><a name="a3539"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;comment&nbsp;out&nbsp;if&nbsp;more&nbsp;performance&nbsp;is&nbsp;necessary&nbsp;(in&nbsp;this&nbsp;case&nbsp;the&nbsp;foreach&nbsp;loop&nbsp;will&nbsp;trigger&nbsp;a&nbsp;warning&nbsp;if&nbsp;the&nbsp;argument&nbsp;is&nbsp;not&nbsp;an&nbsp;array)</span></span></div></li>
+<li><div class="src-line"><a name="a3540"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$i</span>&nbsp;<&nbsp;<span class="src-var">$narrays</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$i</span>&nbsp;++<span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3541"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$arrays</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3542"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;also&nbsp;array_merge_recursive&nbsp;returns&nbsp;nothing&nbsp;in&nbsp;this&nbsp;case</span></span></div></li>
+<li><div class="src-line"><a name="a3543"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/trigger_error">trigger_error</a><span class="src-sym">(</span><span class="src-str">'Argument&nbsp;#'</span>&nbsp;.&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>+<span class="src-num">1</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">'&nbsp;is&nbsp;not&nbsp;an&nbsp;array&nbsp;-&nbsp;trying&nbsp;to&nbsp;merge&nbsp;array&nbsp;with&nbsp;scalar!&nbsp;Returning&nbsp;false!'</span><span class="src-sym">,</span>&nbsp;<span class="src-id">E_USER_WARNING</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3544"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3545"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3546"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3547"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3548"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;the&nbsp;first&nbsp;array&nbsp;is&nbsp;in&nbsp;the&nbsp;output&nbsp;set&nbsp;in&nbsp;every&nbsp;case</span></span></div></li>
+<li><div class="src-line"><a name="a3549"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$ret</span>&nbsp;=&nbsp;<span class="src-var">$arrays</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3550"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3551"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;merege&nbsp;$ret&nbsp;with&nbsp;the&nbsp;remaining&nbsp;arrays</span></span></div></li>
+<li><div class="src-line"><a name="a3552"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-num">1</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$i</span>&nbsp;<&nbsp;<span class="src-var">$narrays</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$i</span>&nbsp;++<span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3553"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$arrays</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span>&nbsp;=&gt;&nbsp;<span class="src-var">$value</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3554"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$value</span><span class="src-sym">)</span>&nbsp;&amp;&amp;&nbsp;isset<span class="src-sym">(</span><span class="src-var">$ret</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3555"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;if&nbsp;$ret[$key]&nbsp;is&nbsp;not&nbsp;an&nbsp;array&nbsp;you&nbsp;try&nbsp;to&nbsp;merge&nbsp;an&nbsp;scalar&nbsp;value&nbsp;with&nbsp;an&nbsp;array&nbsp;-&nbsp;the&nbsp;result&nbsp;is&nbsp;not&nbsp;defined&nbsp;(incompatible&nbsp;arrays)</span></span></div></li>
+<li><div class="src-line"><a name="a3556"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;in&nbsp;this&nbsp;case&nbsp;the&nbsp;call&nbsp;will&nbsp;trigger&nbsp;an&nbsp;E_USER_WARNING&nbsp;and&nbsp;the&nbsp;$ret[$key]&nbsp;will&nbsp;be&nbsp;false.</span></span></div></li>
+<li><div class="src-line"><a name="a3557"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$ret</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">merge_arrays</span><span class="src-sym">(</span><span class="src-var">$ret</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$value</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3558"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3559"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$ret</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$value</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3560"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3561"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3562"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3563"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3564"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$ret</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3565"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3566"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3567"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;/**</span></div></li>
+<li><div class="src-line"><a name="a3568"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Gets&nbsp;language&nbsp;information&nbsp;and&nbsp;stores&nbsp;it&nbsp;for&nbsp;later&nbsp;use</span></div></li>
+<li><div class="src-line"><a name="a3569"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3570"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;string&nbsp;The&nbsp;filename&nbsp;of&nbsp;the&nbsp;language&nbsp;file&nbsp;you&nbsp;want&nbsp;to&nbsp;load</span></div></li>
+<li><div class="src-line"><a name="a3571"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a3572"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a3573"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@todo&nbsp;Needs&nbsp;to&nbsp;load&nbsp;keys&nbsp;for&nbsp;lexic&nbsp;permissions&nbsp;for&nbsp;keywords,&nbsp;regexps&nbsp;etc</span></div></li>
+<li><div class="src-line"><a name="a3574"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a3575"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">load_language</span><span class="src-sym">(</span><span class="src-var">$file_name</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3576"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$file_name</span>&nbsp;==&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">loaded_language</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3577"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;this&nbsp;file&nbsp;is&nbsp;already&nbsp;loaded!</span></span></div></li>
+<li><div class="src-line"><a name="a3578"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3579"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3580"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3581"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Prepare&nbsp;some&nbsp;stuff&nbsp;before&nbsp;actually&nbsp;loading&nbsp;the&nbsp;language&nbsp;file</span></span></div></li>
+<li><div class="src-line"><a name="a3582"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">loaded_language</span>&nbsp;=&nbsp;<span class="src-var">$file_name</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3583"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">parse_cache_built</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3584"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodenable_highlighting">enable_highlighting</a><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3585"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$language_data</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3586"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3587"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Load&nbsp;the&nbsp;language&nbsp;file</span></span></div></li>
+<li><div class="src-line"><a name="a3588"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;require&nbsp;<span class="src-var">$file_name</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3589"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3590"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Perhaps&nbsp;some&nbsp;checking&nbsp;might&nbsp;be&nbsp;added&nbsp;here&nbsp;later&nbsp;to&nbsp;check&nbsp;that</span></span></div></li>
+<li><div class="src-line"><a name="a3591"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;$language&nbsp;data&nbsp;is&nbsp;a&nbsp;valid&nbsp;thing&nbsp;but&nbsp;maybe&nbsp;not</span></span></div></li>
+<li><div class="src-line"><a name="a3592"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span>&nbsp;=&nbsp;<span class="src-var">$language_data</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3593"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3594"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Set&nbsp;strict&nbsp;mode&nbsp;if&nbsp;should&nbsp;be&nbsp;set</span></span></div></li>
+<li><div class="src-line"><a name="a3595"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">strict_mode</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STRICT_MODE_APPLIES'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3596"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3597"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Set&nbsp;permissions&nbsp;for&nbsp;all&nbsp;lexics&nbsp;to&nbsp;true</span></span></div></li>
+<li><div class="src-line"><a name="a3598"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;so&nbsp;they'll&nbsp;be&nbsp;highlighted&nbsp;by&nbsp;default</span></span></div></li>
+<li><div class="src-line"><a name="a3599"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/array_keys">array_keys</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3600"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3601"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3602"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3603"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-id">false</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3604"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3605"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3606"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3607"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/array_keys">array_keys</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'COMMENT_SINGLE'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3608"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3609"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3610"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/array_keys">array_keys</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">)</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3611"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3612"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3613"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3614"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;for&nbsp;BenBE&nbsp;and&nbsp;future&nbsp;code&nbsp;reviews:</span></span></div></li>
+<li><div class="src-line"><a name="a3615"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;we&nbsp;can&nbsp;use&nbsp;empty&nbsp;here&nbsp;since&nbsp;we&nbsp;only&nbsp;check&nbsp;for&nbsp;existance&nbsp;and&nbsp;emptiness&nbsp;of&nbsp;an&nbsp;array</span></span></div></li>
+<li><div class="src-line"><a name="a3616"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;an&nbsp;array&nbsp;at&nbsp;all&nbsp;but&nbsp;rather&nbsp;false&nbsp;or&nbsp;null&nbsp;this&nbsp;will&nbsp;work&nbsp;as&nbsp;intended&nbsp;as&nbsp;well</span></span></div></li>
+<li><div class="src-line"><a name="a3617"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;even&nbsp;if&nbsp;$this-&gt;language_data['PARSER_CONTROL']&nbsp;is&nbsp;undefined&nbsp;this&nbsp;won't&nbsp;trigger&nbsp;a&nbsp;notice</span></span></div></li>
+<li><div class="src-line"><a name="a3618"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'ENABLE_FLAGS'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3619"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'ENABLE_FLAGS'</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$flag</span>&nbsp;=&gt;&nbsp;<span class="src-var">$value</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3620"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;it's&nbsp;either&nbsp;true&nbsp;or&nbsp;false&nbsp;and&nbsp;maybe&nbsp;is&nbsp;true&nbsp;as&nbsp;well</span></span></div></li>
+<li><div class="src-line"><a name="a3621"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$perm</span>&nbsp;=&nbsp;<span class="src-var">$value</span>&nbsp;!==&nbsp;<span class="src-id">GESHI_NEVER</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3622"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$flag</span>&nbsp;==&nbsp;<span class="src-str">'ALL'</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3623"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodenable_highlighting">enable_highlighting</a><span class="src-sym">(</span><span class="src-var">$perm</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3624"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3625"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3626"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-var">$flag</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3627"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;unknown&nbsp;lexic&nbsp;permission</span></span></div></li>
+<li><div class="src-line"><a name="a3628"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3629"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3630"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-var">$flag</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3631"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-var">$flag</span><span class="src-sym">]</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span>&nbsp;=&gt;&nbsp;<span class="src-var">$val</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3632"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-var">$flag</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$key</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$perm</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3633"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3634"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3635"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-var">$flag</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$perm</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3636"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3637"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3638"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'PARSER_CONTROL'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'ENABLE_FLAGS'</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3639"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3640"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3641"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//NEW&nbsp;in&nbsp;1.0.8:&nbsp;Allow&nbsp;styles&nbsp;to&nbsp;be&nbsp;loaded&nbsp;from&nbsp;a&nbsp;separate&nbsp;file&nbsp;to&nbsp;override&nbsp;defaults</span></span></div></li>
+<li><div class="src-line"><a name="a3642"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$style_filename</span>&nbsp;=&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$file_name</span><span class="src-sym">,</span>&nbsp;<span class="src-num">0</span><span class="src-sym">,</span>&nbsp;-<span class="src-num">4</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">'.style.php'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3643"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/is_readable">is_readable</a><span class="src-sym">(</span><span class="src-var">$style_filename</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3644"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Clear&nbsp;any&nbsp;style_data&nbsp;that&nbsp;could&nbsp;have&nbsp;been&nbsp;set&nbsp;before&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a3645"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$style_data</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3646"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$style_data</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3647"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3648"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3649"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Read&nbsp;the&nbsp;Style&nbsp;Information&nbsp;from&nbsp;the&nbsp;style&nbsp;file</span></span></div></li>
+<li><div class="src-line"><a name="a3650"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-inc">include</span>&nbsp;<span class="src-var">$style_filename</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3651"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3652"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Apply&nbsp;the&nbsp;new&nbsp;styles&nbsp;to&nbsp;our&nbsp;current&nbsp;language&nbsp;styles</span></span></div></li>
+<li><div class="src-line"><a name="a3653"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$style_data</span><span class="src-sym">)</span>&nbsp;&amp;&amp;&nbsp;<a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$style_data</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3654"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span>&nbsp;=</span></div></li>
+<li><div class="src-line"><a name="a3655"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">merge_arrays</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$style_data</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3656"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3657"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3658"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3659"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3660"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;/**</span></div></li>
+<li><div class="src-line"><a name="a3661"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Takes&nbsp;the&nbsp;parsed&nbsp;code&nbsp;and&nbsp;various&nbsp;options,&nbsp;and&nbsp;creates&nbsp;the&nbsp;HTML</span></div></li>
+<li><div class="src-line"><a name="a3662"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;surrounding&nbsp;it&nbsp;to&nbsp;make&nbsp;it&nbsp;look&nbsp;nice.</span></div></li>
+<li><div class="src-line"><a name="a3663"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3664"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;The&nbsp;code&nbsp;already&nbsp;parsed&nbsp;(reference!)</span></div></li>
+<li><div class="src-line"><a name="a3665"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a3666"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a3667"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a3668"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">finalise</span><span class="src-sym">(</span><span class="src-sym">&</span><span class="src-var">$parsed_code</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3669"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Remove&nbsp;end&nbsp;parts&nbsp;of&nbsp;important&nbsp;declarations</span></span></div></li>
+<li><div class="src-line"><a name="a3670"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;This&nbsp;is&nbsp;BUGGY!!&nbsp;My&nbsp;fault&nbsp;for&nbsp;bad&nbsp;code:&nbsp;fix&nbsp;coming&nbsp;in&nbsp;1.2</span></span></div></li>
+<li><div class="src-line"><a name="a3671"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;@todo&nbsp;Remove&nbsp;this&nbsp;crap</span></span></div></li>
+<li><div class="src-line"><a name="a3672"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodenable_important_blocks">enable_important_blocks</a>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a3673"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/strpos">strpos</a><span class="src-sym">(</span><span class="src-var">$parsed_code</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_START_IMPORTANT&quot;&gt;GESHI_START_IMPORTANT&lt;/a&gt;</span><span class="src-sym">))</span>&nbsp;===&nbsp;<span class="src-id">false</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3674"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_END_IMPORTANT&quot;&gt;GESHI_END_IMPORTANT&lt;/a&gt;</span><span class="src-sym">)</span><span class="src-sym">,</span>&nbsp;<span class="src-str">''</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$parsed_code</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3675"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3676"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3677"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Add&nbsp;HTML&nbsp;whitespace&nbsp;stuff&nbsp;if&nbsp;we're&nbsp;using&nbsp;the&nbsp;&lt;div&gt;&nbsp;header</span></span></div></li>
+<li><div class="src-line"><a name="a3678"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE&quot;&gt;GESHI_HEADER_PRE&lt;/a&gt;</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_VALID&quot;&gt;GESHI_HEADER_PRE_VALID&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3679"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">indent</span><span class="src-sym">(</span><span class="src-var">$parsed_code</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3680"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3681"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3682"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;purge&nbsp;some&nbsp;unnecessary&nbsp;stuff</span></span></div></li>
+<li><div class="src-line"><a name="a3683"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**&nbsp;NOTE:&nbsp;memorypeak&nbsp;#1&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a3684"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;=&nbsp;<a href="http://www.php.net/preg_replace">preg_replace</a><span class="src-sym">(</span><span class="src-str">'#&lt;span[^&gt;]+&gt;(\s*)&lt;/span&gt;#'</span><span class="src-sym">,</span>&nbsp;<span class="src-str">'\\1'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$parsed_code</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3685"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3686"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;If&nbsp;we&nbsp;are&nbsp;using&nbsp;IDs&nbsp;for&nbsp;line&nbsp;numbers,&nbsp;there&nbsp;needs&nbsp;to&nbsp;be&nbsp;an&nbsp;overall</span></span></div></li>
+<li><div class="src-line"><a name="a3687"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;ID&nbsp;set&nbsp;to&nbsp;prevent&nbsp;collisions.</span></span></div></li>
+<li><div class="src-line"><a name="a3688"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">add_ids</span>&nbsp;&amp;&amp;&nbsp;<span class="src-sym">!</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_id</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3689"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_id</span>&nbsp;=&nbsp;<span class="src-str">'geshi-'</span>&nbsp;.&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><a href="http://www.php.net/md5">md5</a><span class="src-sym">(</span><a href="http://www.php.net/microtime">microtime</a><span class="src-sym">(</span><span class="src-sym">))</span><span class="src-sym">,</span>&nbsp;<span class="src-num">0</span><span class="src-sym">,</span>&nbsp;<span class="src-num">4</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3690"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3691"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3692"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Get&nbsp;code&nbsp;into&nbsp;lines</span></span></div></li>
+<li><div class="src-line"><a name="a3693"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**&nbsp;NOTE:&nbsp;memorypeak&nbsp;#2&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a3694"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$code</span>&nbsp;=&nbsp;<a href="http://www.php.net/explode">explode</a><span class="src-sym">(</span><span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$parsed_code</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3695"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="http://www.php.net/header">header</a><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3696"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3697"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;If&nbsp;we're&nbsp;using&nbsp;line&nbsp;numbers,&nbsp;we&nbsp;insert&nbsp;&lt;li&gt;s&nbsp;and&nbsp;appropriate</span></span></div></li>
+<li><div class="src-line"><a name="a3698"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;markup&nbsp;to&nbsp;style&nbsp;them&nbsp;(otherwise&nbsp;we&nbsp;don't&nbsp;need&nbsp;to&nbsp;do&nbsp;anything)</span></span></div></li>
+<li><div class="src-line"><a name="a3699"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS&quot;&gt;GESHI_NO_LINE_NUMBERS&lt;/a&gt;</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_TABLE&quot;&gt;GESHI_HEADER_PRE_TABLE&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3700"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;If&nbsp;we're&nbsp;using&nbsp;the&nbsp;&lt;pre&gt;&nbsp;header,&nbsp;we&nbsp;shouldn't&nbsp;add&nbsp;newlines&nbsp;because</span></span></div></li>
+<li><div class="src-line"><a name="a3701"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;the&nbsp;&lt;pre&gt;&nbsp;will&nbsp;line-break&nbsp;them&nbsp;(and&nbsp;the&nbsp;&lt;li&gt;s&nbsp;already&nbsp;do&nbsp;this&nbsp;for&nbsp;us)</span></span></div></li>
+<li><div class="src-line"><a name="a3702"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$ls</span>&nbsp;=&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE&quot;&gt;GESHI_HEADER_PRE&lt;/a&gt;</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_VALID&quot;&gt;GESHI_HEADER_PRE_VALID&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-str">&quot;\n&quot;</span>&nbsp;:&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3703"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3704"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Set&nbsp;vars&nbsp;to&nbsp;defaults&nbsp;for&nbsp;following&nbsp;loop</span></span></div></li>
+<li><div class="src-line"><a name="a3705"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3706"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3707"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Foreach&nbsp;line...</span></span></div></li>
+<li><div class="src-line"><a name="a3708"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$n</span>&nbsp;=&nbsp;<a href="http://www.php.net/count">count</a><span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">)</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$i</span>&nbsp;<&nbsp;<span class="src-var">$n</span><span class="src-sym">;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3709"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Reset&nbsp;the&nbsp;attributes&nbsp;for&nbsp;a&nbsp;new&nbsp;line&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a3710"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attrs</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3711"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3712"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Make&nbsp;lines&nbsp;have&nbsp;at&nbsp;least&nbsp;one&nbsp;space&nbsp;in&nbsp;them&nbsp;if&nbsp;they're&nbsp;empty</span></span></div></li>
+<li><div class="src-line"><a name="a3713"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;BenBE:&nbsp;Checking&nbsp;emptiness&nbsp;using&nbsp;trim&nbsp;instead&nbsp;of&nbsp;relying&nbsp;on&nbsp;blanks</span></span></div></li>
+<li><div class="src-line"><a name="a3714"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-str">''</span>&nbsp;==&nbsp;<a href="http://www.php.net/trim">trim</a><span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3715"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$code</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'&amp;nbsp;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3716"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3717"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3718"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;If&nbsp;this&nbsp;is&nbsp;a&nbsp;&quot;special&nbsp;line&quot;...</span></span></div></li>
+<li><div class="src-line"><a name="a3719"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_FANCY_LINE_NUMBERS&quot;&gt;GESHI_FANCY_LINE_NUMBERS&lt;/a&gt;</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a3720"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$i</span>&nbsp;%&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_nth_row</span>&nbsp;==&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_nth_row</span>&nbsp;-&nbsp;<span class="src-num">1</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3721"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Set&nbsp;the&nbsp;attributes&nbsp;to&nbsp;style&nbsp;the&nbsp;line</span></span></div></li>
+<li><div class="src-line"><a name="a3722"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3723"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//$attr&nbsp;=&nbsp;'&nbsp;class=&quot;li2&quot;';</span></span></div></li>
+<li><div class="src-line"><a name="a3724"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attrs</span><span class="src-sym">[</span><span class="src-str">'class'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'li2'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3725"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$def_attr</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;de2&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3726"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3727"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//$attr&nbsp;=&nbsp;'&nbsp;style=&quot;'&nbsp;.&nbsp;$this-&gt;line_style2&nbsp;.&nbsp;'&quot;';</span></span></div></li>
+<li><div class="src-line"><a name="a3728"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attrs</span><span class="src-sym">[</span><span class="src-str">'style'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_style2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3729"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;This&nbsp;style&nbsp;&quot;covers&nbsp;up&quot;&nbsp;the&nbsp;special&nbsp;styles&nbsp;set&nbsp;for&nbsp;special&nbsp;lines</span></span></div></li>
+<li><div class="src-line"><a name="a3730"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;so&nbsp;that&nbsp;styles&nbsp;applied&nbsp;to&nbsp;special&nbsp;lines&nbsp;don't&nbsp;apply&nbsp;to&nbsp;the&nbsp;actual</span></span></div></li>
+<li><div class="src-line"><a name="a3731"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;code&nbsp;on&nbsp;that&nbsp;line</span></span></div></li>
+<li><div class="src-line"><a name="a3732"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$def_attr</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">code_style</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3733"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3734"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3735"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3736"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//$attr&nbsp;=&nbsp;'&nbsp;class=&quot;li1&quot;';</span></span></div></li>
+<li><div class="src-line"><a name="a3737"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attrs</span><span class="src-sym">[</span><span class="src-str">'class'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'li1'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3738"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$def_attr</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;de1&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3739"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3740"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//$attr&nbsp;=&nbsp;'&nbsp;style=&quot;'&nbsp;.&nbsp;$this-&gt;line_style1&nbsp;.&nbsp;'&quot;';</span></span></div></li>
+<li><div class="src-line"><a name="a3741"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attrs</span><span class="src-sym">[</span><span class="src-str">'style'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_style1</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3742"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$def_attr</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">code_style</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3743"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3744"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3745"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3746"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Check&nbsp;which&nbsp;type&nbsp;of&nbsp;tag&nbsp;to&nbsp;insert&nbsp;for&nbsp;this&nbsp;line</span></span></div></li>
+<li><div class="src-line"><a name="a3747"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_VALID&quot;&gt;GESHI_HEADER_PRE_VALID&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3748"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-str">"</span></span>&lt;pre<span class="src-var">$def_attr</span>&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3749"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$end</span>&nbsp;=&nbsp;<span class="src-str">'&lt;/pre&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3750"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3751"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Span&nbsp;or&nbsp;div?</span></span></div></li>
+<li><div class="src-line"><a name="a3752"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$start</span>&nbsp;=&nbsp;<span class="src-str">"</span></span>&lt;div<span class="src-var">$def_attr</span>&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3753"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$end</span>&nbsp;=&nbsp;<span class="src-str">'&lt;/div&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3754"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3755"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3756"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++<span class="src-var">$i</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3757"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3758"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Are&nbsp;we&nbsp;supposed&nbsp;to&nbsp;use&nbsp;ids?&nbsp;If&nbsp;so,&nbsp;add&nbsp;them</span></span></div></li>
+<li><div class="src-line"><a name="a3759"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">add_ids</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3760"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attrs</span><span class="src-sym">[</span><span class="src-str">'id'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">"</span></span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_id</span>-<span class="src-var">$i</span><span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3761"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3762"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3763"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Is&nbsp;this&nbsp;some&nbsp;line&nbsp;with&nbsp;extra&nbsp;styles???</span></span></div></li>
+<li><div class="src-line"><a name="a3764"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-id">in_array</span><span class="src-sym">(</span><span class="src-var">$i</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3765"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3766"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines_styles</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3767"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attrs</span><span class="src-sym">[</span><span class="src-str">'class'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">"</span></span>lx<span class="src-var">$i</span><span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3768"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3769"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attrs</span><span class="src-sym">[</span><span class="src-str">'class'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">&quot;ln-xtra&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3770"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3771"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3772"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/array_push">array_push</a><span class="src-sym">(</span><span class="src-var">$attrs</span><span class="src-sym">[</span><span class="src-str">'style'</span><span class="src-sym">]</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">get_line_style</span><span class="src-sym">(</span><span class="src-var">$i</span><span class="src-sym">))</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3773"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3774"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3775"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3776"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Add&nbsp;in&nbsp;the&nbsp;line&nbsp;surrounded&nbsp;by&nbsp;appropriate&nbsp;list&nbsp;HTML</span></span></div></li>
+<li><div class="src-line"><a name="a3777"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attr_string</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3778"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$attrs</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span>&nbsp;=&gt;&nbsp;<span class="src-var">$attr</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3779"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attr_string</span>&nbsp;.=&nbsp;<span class="src-str">'&nbsp;'</span>&nbsp;.&nbsp;<span class="src-var">$key</span>&nbsp;.&nbsp;<span class="src-str">'=&quot;'</span>&nbsp;.&nbsp;<a href="http://www.php.net/implode">implode</a><span class="src-sym">(</span><span class="src-str">'&nbsp;'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$attr</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3780"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3781"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3782"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">"</span></span>&lt;li<span class="src-var">$attr_string</span>&gt;<span class="src-var">$start</span>{<span class="src-var">$code</span><span class="src-sym">[</span><span class="src-var">$i</span>-<span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">}</span><span class="src-var">$end</span>&lt;/li&gt;<span class="src-var">$ls</span><span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3783"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">[</span><span class="src-var">$i</span>&nbsp;-&nbsp;<span class="src-num">1</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3784"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3785"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3786"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$n</span>&nbsp;=&nbsp;<span class="src-id">count</span><span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3787"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3788"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;de1&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3789"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3790"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">code_style</span>&nbsp;.<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3791"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3792"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_VALID&quot;&gt;GESHI_HEADER_PRE_VALID&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3793"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;pre'</span>.&nbsp;<span class="src-var">$attributes</span>&nbsp;.<span class="src-str">'&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3794"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">elseif</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_TABLE&quot;&gt;GESHI_HEADER_PRE_TABLE&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3795"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS&quot;&gt;GESHI_NO_LINE_NUMBERS&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3796"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3797"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attrs</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;ln&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3798"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3799"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attrs</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">table_linenumber_style</span>&nbsp;.<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3800"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3801"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;td'</span>.<span class="src-var">$attrs</span>.<span class="src-str">'&gt;&lt;pre'</span>.<span class="src-var">$attributes</span>.<span class="src-str">'&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3802"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;get&nbsp;linenumbers</span></span></div></li>
+<li><div class="src-line"><a name="a3803"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;we&nbsp;don't&nbsp;merge&nbsp;it&nbsp;with&nbsp;the&nbsp;for&nbsp;below,&nbsp;since&nbsp;it&nbsp;should&nbsp;be&nbsp;better&nbsp;for</span></span></div></li>
+<li><div class="src-line"><a name="a3804"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;memory&nbsp;consumption&nbsp;this&nbsp;way</span></span></div></li>
+<li><div class="src-line"><a name="a3805"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;@todo:&nbsp;but...&nbsp;actually&nbsp;it&nbsp;would&nbsp;still&nbsp;be&nbsp;somewhat&nbsp;nice&nbsp;to&nbsp;merge&nbsp;the&nbsp;two&nbsp;loops</span></span></div></li>
+<li><div class="src-line"><a name="a3806"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;mem&nbsp;peaks&nbsp;are&nbsp;at&nbsp;different&nbsp;positions</span></span></div></li>
+<li><div class="src-line"><a name="a3807"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$i</span>&nbsp;<&nbsp;<span class="src-var">$n</span><span class="src-sym">;</span>&nbsp;++<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3808"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3809"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;fancy&nbsp;lines</span></span></div></li>
+<li><div class="src-line"><a name="a3810"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_FANCY_LINE_NUMBERS&quot;&gt;GESHI_FANCY_LINE_NUMBERS&lt;/a&gt;</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a3811"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$i</span>&nbsp;%&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_nth_row</span>&nbsp;==&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_nth_row</span>&nbsp;-&nbsp;<span class="src-num">1</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3812"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Set&nbsp;the&nbsp;attributes&nbsp;to&nbsp;style&nbsp;the&nbsp;line</span></span></div></li>
+<li><div class="src-line"><a name="a3813"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3814"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;span&nbsp;class=&quot;xtra&nbsp;li2&quot;&gt;&lt;span&nbsp;class=&quot;de2&quot;&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3815"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3816"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;This&nbsp;style&nbsp;&quot;covers&nbsp;up&quot;&nbsp;the&nbsp;special&nbsp;styles&nbsp;set&nbsp;for&nbsp;special&nbsp;lines</span></span></div></li>
+<li><div class="src-line"><a name="a3817"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;so&nbsp;that&nbsp;styles&nbsp;applied&nbsp;to&nbsp;special&nbsp;lines&nbsp;don't&nbsp;apply&nbsp;to&nbsp;the&nbsp;actual</span></span></div></li>
+<li><div class="src-line"><a name="a3818"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;code&nbsp;on&nbsp;that&nbsp;line</span></span></div></li>
+<li><div class="src-line"><a name="a3819"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;span&nbsp;style=&quot;display:block;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_style2</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&gt;'</span></span></div></li>
+<li><div class="src-line"><a name="a3820"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.<span class="src-str">'&lt;span&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">code_style</span>&nbsp;.<span class="src-str">'&quot;&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3821"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3822"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close</span>&nbsp;+=&nbsp;<span class="src-num">2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3823"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3824"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Is&nbsp;this&nbsp;some&nbsp;line&nbsp;with&nbsp;extra&nbsp;styles???</span></span></div></li>
+<li><div class="src-line"><a name="a3825"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/in_array">in_array</a><span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-num">1</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3826"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3827"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines_styles</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3828"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">"</span></span>&lt;span&nbsp;class=\&quot;xtra&nbsp;lx<span class="src-var">$i</span>\&quot;&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3829"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3830"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">&quot;&lt;span&nbsp;class=\&quot;xtra&nbsp;ln-xtra\&quot;&gt;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3831"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3832"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3833"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">&quot;&lt;span&nbsp;style=\&quot;display:block;&quot;</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">get_line_style</span><span class="src-sym">(</span><span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">&quot;\&quot;&gt;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3834"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3835"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++<span class="src-var">$close</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3836"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3837"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers_start</span>&nbsp;+&nbsp;<span class="src-var">$i</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3838"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$close</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3839"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<a href="http://www.php.net/str_repeat">str_repeat</a><span class="src-sym">(</span><span class="src-str">'&lt;/span&gt;'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$close</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3840"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;!=&nbsp;<span class="src-var">$n</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3841"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">&quot;\n&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3842"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3843"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3844"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;/pre&gt;&lt;/td&gt;&lt;td'</span>.<span class="src-var">$attributes</span>.<span class="src-str">'&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3845"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3846"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;pre'</span>.&nbsp;<span class="src-var">$attributes</span>&nbsp;.<span class="src-str">'&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3847"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3848"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;No&nbsp;line&nbsp;numbers,&nbsp;but&nbsp;still&nbsp;need&nbsp;to&nbsp;handle&nbsp;highlighting&nbsp;lines&nbsp;extra.</span></span></div></li>
+<li><div class="src-line"><a name="a3849"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Have&nbsp;to&nbsp;use&nbsp;divs&nbsp;so&nbsp;the&nbsp;full&nbsp;width&nbsp;of&nbsp;the&nbsp;code&nbsp;is&nbsp;highlighted</span></span></div></li>
+<li><div class="src-line"><a name="a3850"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3851"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span>&nbsp;<span class="src-var">$i</span>&nbsp;<&nbsp;<span class="src-var">$n</span><span class="src-sym">;</span>&nbsp;++<span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3852"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Make&nbsp;lines&nbsp;have&nbsp;at&nbsp;least&nbsp;one&nbsp;space&nbsp;in&nbsp;them&nbsp;if&nbsp;they're&nbsp;empty</span></span></div></li>
+<li><div class="src-line"><a name="a3853"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;BenBE:&nbsp;Checking&nbsp;emptiness&nbsp;using&nbsp;trim&nbsp;instead&nbsp;of&nbsp;relying&nbsp;on&nbsp;blanks</span></span></div></li>
+<li><div class="src-line"><a name="a3854"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-str">''</span>&nbsp;==&nbsp;<a href="http://www.php.net/trim">trim</a><span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3855"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$code</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'&amp;nbsp;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3856"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3857"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;fancy&nbsp;lines</span></span></div></li>
+<li><div class="src-line"><a name="a3858"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_FANCY_LINE_NUMBERS&quot;&gt;GESHI_FANCY_LINE_NUMBERS&lt;/a&gt;</span>&nbsp;&amp;&amp;</span></div></li>
+<li><div class="src-line"><a name="a3859"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$i</span>&nbsp;%&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_nth_row</span>&nbsp;==&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_nth_row</span>&nbsp;-&nbsp;<span class="src-num">1</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3860"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Set&nbsp;the&nbsp;attributes&nbsp;to&nbsp;style&nbsp;the&nbsp;line</span></span></div></li>
+<li><div class="src-line"><a name="a3861"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3862"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;span&nbsp;class=&quot;xtra&nbsp;li2&quot;&gt;&lt;span&nbsp;class=&quot;de2&quot;&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3863"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3864"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;This&nbsp;style&nbsp;&quot;covers&nbsp;up&quot;&nbsp;the&nbsp;special&nbsp;styles&nbsp;set&nbsp;for&nbsp;special&nbsp;lines</span></span></div></li>
+<li><div class="src-line"><a name="a3865"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;so&nbsp;that&nbsp;styles&nbsp;applied&nbsp;to&nbsp;special&nbsp;lines&nbsp;don't&nbsp;apply&nbsp;to&nbsp;the&nbsp;actual</span></span></div></li>
+<li><div class="src-line"><a name="a3866"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;code&nbsp;on&nbsp;that&nbsp;line</span></span></div></li>
+<li><div class="src-line"><a name="a3867"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;span&nbsp;style=&quot;display:block;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_style2</span>&nbsp;.&nbsp;<span class="src-str">'&quot;&gt;'</span></span></div></li>
+<li><div class="src-line"><a name="a3868"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.<span class="src-str">'&lt;span&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">code_style</span>&nbsp;.<span class="src-str">'&quot;&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3869"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3870"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close</span>&nbsp;+=&nbsp;<span class="src-num">2</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3871"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3872"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Is&nbsp;this&nbsp;some&nbsp;line&nbsp;with&nbsp;extra&nbsp;styles???</span></span></div></li>
+<li><div class="src-line"><a name="a3873"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/in_array">in_array</a><span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-num">1</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3874"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3875"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines_styles</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3876"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">"</span></span>&lt;span&nbsp;class=\&quot;xtra&nbsp;lx<span class="src-var">$i</span>\&quot;&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3877"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3878"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">&quot;&lt;span&nbsp;class=\&quot;xtra&nbsp;ln-xtra\&quot;&gt;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3879"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3880"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3881"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">&quot;&lt;span&nbsp;style=\&quot;display:block;&quot;</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">get_line_style</span><span class="src-sym">(</span><span class="src-var">$i</span><span class="src-sym">)</span>&nbsp;.&nbsp;<span class="src-str">&quot;\&quot;&gt;&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3882"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3883"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++<span class="src-var">$close</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3884"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3885"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3886"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-var">$code</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3887"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3888"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$close</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3889"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<a href="http://www.php.net/str_repeat">str_repeat</a><span class="src-sym">(</span><span class="src-str">'&lt;/span&gt;'</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$close</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3890"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close</span>&nbsp;=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3891"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3892"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">elseif</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$i</span>&nbsp;+&nbsp;<span class="src-num">1</span>&nbsp;<&nbsp;<span class="src-var">$n</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3893"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">&quot;\n&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3894"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3895"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$code</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3896"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3897"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3898"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_VALID&quot;&gt;GESHI_HEADER_PRE_VALID&lt;/a&gt;</span>&nbsp;||&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_TABLE&quot;&gt;GESHI_HEADER_PRE_TABLE&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3899"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;/pre&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3900"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3901"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_TABLE&quot;&gt;GESHI_HEADER_PRE_TABLE&lt;/a&gt;</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS&quot;&gt;GESHI_NO_LINE_NUMBERS&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3902"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-str">'&lt;/td&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3903"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3904"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3905"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3906"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$parsed_code</span>&nbsp;.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">footer</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3907"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3908"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3909"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;/**</span></div></li>
+<li><div class="src-line"><a name="a3910"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Creates&nbsp;the&nbsp;header&nbsp;for&nbsp;the&nbsp;code&nbsp;block&nbsp;(with&nbsp;correct&nbsp;attributes)</span></div></li>
+<li><div class="src-line"><a name="a3911"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3912"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;The&nbsp;header&nbsp;for&nbsp;the&nbsp;code&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a3913"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a3914"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a3915"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a3916"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="http://www.php.net/header">header</a><span class="src-sym">(</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3917"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Get&nbsp;attributes&nbsp;needed</span></span></div></li>
+<li><div class="src-line"><a name="a3918"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**</span></div></li>
+<li><div class="src-line"><a name="a3919"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@todo&nbsp;&nbsp;&nbsp;Document&nbsp;behaviour&nbsp;change&nbsp;-&nbsp;class&nbsp;is&nbsp;outputted&nbsp;regardless&nbsp;of&nbsp;whether</span></div></li>
+<li><div class="src-line"><a name="a3920"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;we're&nbsp;using&nbsp;classes&nbsp;or&nbsp;not.&nbsp;Same&nbsp;with&nbsp;style</span></div></li>
+<li><div class="src-line"><a name="a3921"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a3922"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3923"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_class</span>&nbsp;!=&nbsp;<span class="src-str">''</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3924"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;.=&nbsp;<span class="src-str">&quot;&nbsp;&quot;</span>.<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_class</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3925"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3926"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;.=&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3927"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3928"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_id</span>&nbsp;!=&nbsp;<span class="src-str">''</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3929"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;.=&nbsp;<span class="src-str">"</span></span>&nbsp;id=\&quot;{<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_id</span><span class="src-sym">}</span>\&quot;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3930"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3931"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_style</span>&nbsp;!=&nbsp;<span class="src-str">''</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3932"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attributes</span>&nbsp;.=&nbsp;<span class="src-str">'&nbsp;style=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_style</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3933"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3934"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3935"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$ol_attributes</span>&nbsp;=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3936"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3937"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers_start</span>&nbsp;!=&nbsp;<span class="src-num">1</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3938"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$ol_attributes</span>&nbsp;.=&nbsp;<span class="src-str">'&nbsp;start=&quot;'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers_start</span>&nbsp;.&nbsp;<span class="src-str">'&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3939"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3940"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3941"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Get&nbsp;the&nbsp;header&nbsp;HTML</span></span></div></li>
+<li><div class="src-line"><a name="a3942"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$header</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_content</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3943"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$header</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3944"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE&quot;&gt;GESHI_HEADER_PRE&lt;/a&gt;</span>&nbsp;||&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_VALID&quot;&gt;GESHI_HEADER_PRE_VALID&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3945"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$header</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-str">''</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$header</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3946"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3947"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$header</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">replace_keywords</span><span class="src-sym">(</span><span class="src-var">$header</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3948"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3949"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3950"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attr</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;head&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3951"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3952"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attr</span>&nbsp;=&nbsp;<span class="src-str">"</span></span>&nbsp;style=\&quot;{<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_content_style</span><span class="src-sym">}</span>\&quot;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3953"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3954"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">GESHI_HEADER_PRE_TABLE</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">GESHI_NO_LINE_NUMBERS</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3955"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$header</span>&nbsp;=&nbsp;</span><span class="src-str">&quot;</span>&lt;thead&gt;&lt;tr&gt;&lt;td&nbsp;colspan=\&quot;2\&quot;&nbsp;<span class="src-var">$attr</span>&gt;<span class="src-var">$header</span>&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3956"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3957"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$header</span>&nbsp;=&nbsp;</span><span class="src-str">&quot;</span>&lt;div<span class="src-var">$attr</span>&gt;<span class="src-var">$header</span>&lt;/div&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3958"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3959"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3960"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3961"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-id">GESHI_HEADER_NONE</span>&nbsp;==&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3962"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">GESHI_NO_LINE_NUMBERS</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3963"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;</span><span class="src-str">&quot;</span><span class="src-var">$header</span>&lt;ol<span class="src-var">$attributes$ol_attributes</span>&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3964"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3965"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-var">$header</span>&nbsp;.&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">force_code_block</span>&nbsp;?&nbsp;<span class="src-str">'&lt;div&gt;'</span>&nbsp;:&nbsp;<span class="src-str">''</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3966"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3967"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3968"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Work&nbsp;out&nbsp;what&nbsp;to&nbsp;return&nbsp;and&nbsp;do&nbsp;it</span></span></div></li>
+<li><div class="src-line"><a name="a3969"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS&quot;&gt;GESHI_NO_LINE_NUMBERS&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3970"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE&quot;&gt;GESHI_HEADER_PRE&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3971"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-str">"</span></span>&lt;pre<span class="src-var">$attributes</span>&gt;<span class="src-var">$header</span>&lt;ol<span class="src-var">$ol_attributes</span>&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3972"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">GESHI_HEADER_DIV</span>&nbsp;||</span></div></li>
+<li><div class="src-line"><a name="a3973"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">GESHI_HEADER_PRE_VALID</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3974"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;</span><span class="src-str">&quot;</span>&lt;div<span class="src-var">$attributes</span>&gt;<span class="src-var">$header</span>&lt;ol<span class="src-var">$ol_attributes</span>&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3975"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">GESHI_HEADER_PRE_TABLE</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3976"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;</span><span class="src-str">&quot;</span>&lt;table<span class="src-var">$attributes</span>&gt;<span class="src-var">$header</span>&lt;tbody&gt;&lt;tr&nbsp;class=\&quot;li1\&quot;&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3977"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3978"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3979"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">GESHI_HEADER_PRE</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3980"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;</span><span class="src-str">&quot;</span>&lt;pre<span class="src-var">$attributes</span>&gt;<span class="src-var">$header</span><span class="src-str">&quot;&nbsp;&nbsp;</span><span class="src-str">.</span></div></li>
+<li><div class="src-line"><a name="a3981"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">force_code_block</span>&nbsp;?&nbsp;<span class="src-str">'&lt;div&gt;'</span>&nbsp;:&nbsp;<span class="src-str">''</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3982"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3983"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-str">"</span></span>&lt;div<span class="src-var">$attributes</span>&gt;<span class="src-var">$header</span><span class="src-str">&quot;&nbsp;</span><span class="src-str">.</span></div></li>
+<li><div class="src-line"><a name="a3984"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">force_code_block</span>&nbsp;?&nbsp;<span class="src-str">'&lt;div&gt;'</span>&nbsp;:&nbsp;<span class="src-str">''</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3985"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3986"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3987"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a3988"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a3989"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;/**</span></div></li>
+<li><div class="src-line"><a name="a3990"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;the&nbsp;footer&nbsp;for&nbsp;the&nbsp;code&nbsp;block.</span></div></li>
+<li><div class="src-line"><a name="a3991"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a3992"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;The&nbsp;footer&nbsp;for&nbsp;the&nbsp;code&nbsp;block</span></div></li>
+<li><div class="src-line"><a name="a3993"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a3994"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a3995"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a3996"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">footer</span><span class="src-sym">(</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3997"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$footer</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">footer_content</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a3998"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$footer</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a3999"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE&quot;&gt;GESHI_HEADER_PRE&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4000"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$footer</span>&nbsp;=&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-str">&quot;\n&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-str">''</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$footer</span><span class="src-sym">)</span><span class="src-sym">;;</span></span></div></li>
+<li><div class="src-line"><a name="a4001"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4002"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$footer</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">replace_keywords</span><span class="src-sym">(</span><span class="src-var">$footer</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4003"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4004"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">use_classes</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4005"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attr</span>&nbsp;=&nbsp;<span class="src-str">'&nbsp;class=&quot;foot&quot;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4006"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4007"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$attr</span>&nbsp;=&nbsp;<span class="src-str">"</span></span>&nbsp;style=\&quot;{<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">footer_content_style</span><span class="src-sym">}</span>\&quot;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4008"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4009"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">GESHI_HEADER_PRE_TABLE</span>&nbsp;&amp;&amp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">linenumbers</span>&nbsp;!=&nbsp;<span class="src-id">GESHI_NO_LINE_NUMBERS</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4010"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$footer</span>&nbsp;=&nbsp;</span><span class="src-str">&quot;</span>&lt;tfoot&gt;&lt;tr&gt;&lt;td&nbsp;colspan=\&quot;2\&quot;&gt;<span class="src-var">$footer</span>&lt;/td&gt;&lt;/tr&gt;&lt;/tfoot&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4011"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4012"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$footer</span>&nbsp;=&nbsp;</span><span class="src-str">&quot;</span>&lt;div<span class="src-var">$attr</span>&gt;<span class="src-var">$footer</span>&lt;/div&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4013"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4014"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4015"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4016"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-id">GESHI_HEADER_NONE</span>&nbsp;==&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4017"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">GESHI_NO_LINE_NUMBERS</span><span class="src-sym">)</span>&nbsp;?&nbsp;<span class="src-str">'&lt;/ol&gt;'</span>&nbsp;.&nbsp;<span class="src-var">$footer</span>&nbsp;:&nbsp;<span class="src-var">$footer</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4018"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4019"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4020"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_DIV&quot;&gt;GESHI_HEADER_DIV&lt;/a&gt;</span>&nbsp;||&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_VALID&quot;&gt;GESHI_HEADER_PRE_VALID&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4021"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS&quot;&gt;GESHI_NO_LINE_NUMBERS&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4022"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-str">"</span></span>&lt;/ol&gt;<span class="src-var">$footer</span>&lt;/div&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4023"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4024"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">force_code_block</span>&nbsp;?&nbsp;<span class="src-str">'&lt;/div&gt;'</span>&nbsp;:&nbsp;<span class="src-str">''</span><span class="src-sym">)</span>&nbsp;.</span></div></li>
+<li><div class="src-line"><a name="a4025"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">"</span></span><span class="src-var">$footer</span>&lt;/div&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4026"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4027"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">elseif</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_type</span>&nbsp;==&nbsp;<span class="src-id">GESHI_HEADER_PRE_TABLE</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4028"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">GESHI_NO_LINE_NUMBERS</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4029"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;</span><span class="src-str">&quot;</span>&lt;/tr&gt;&lt;/tbody&gt;<span class="src-var">$footer</span>&lt;/table&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4030"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4031"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">force_code_block</span>&nbsp;?&nbsp;<span class="src-str">'&lt;/div&gt;'</span>&nbsp;:&nbsp;<span class="src-str">''</span><span class="src-sym">)</span>&nbsp;.</span></div></li>
+<li><div class="src-line"><a name="a4032"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">"</span></span><span class="src-var">$footer</span>&lt;/div&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4033"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4034"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4035"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">GESHI_NO_LINE_NUMBERS</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4036"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;</span><span class="src-str">&quot;</span>&lt;/ol&gt;<span class="src-var">$footer</span>&lt;/pre&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4037"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4038"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">force_code_block</span>&nbsp;?&nbsp;<span class="src-str">'&lt;/div&gt;'</span>&nbsp;:&nbsp;<span class="src-str">''</span><span class="src-sym">)</span>&nbsp;.</span></div></li>
+<li><div class="src-line"><a name="a4039"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">"</span></span><span class="src-var">$footer</span>&lt;/pre&gt;<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4040"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4041"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4042"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4043"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;/**</span></div></li>
+<li><div class="src-line"><a name="a4044"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Replaces&nbsp;certain&nbsp;keywords&nbsp;in&nbsp;the&nbsp;header&nbsp;and&nbsp;footer&nbsp;with</span></div></li>
+<li><div class="src-line"><a name="a4045"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;certain&nbsp;configuration&nbsp;values</span></div></li>
+<li><div class="src-line"><a name="a4046"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a4047"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;string&nbsp;The&nbsp;header&nbsp;or&nbsp;footer&nbsp;content&nbsp;to&nbsp;do&nbsp;replacement&nbsp;on</span></div></li>
+<li><div class="src-line"><a name="a4048"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;The&nbsp;header&nbsp;or&nbsp;footer&nbsp;with&nbsp;replaced&nbsp;keywords</span></div></li>
+<li><div class="src-line"><a name="a4049"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;&nbsp;1.0.2</span></div></li>
+<li><div class="src-line"><a name="a4050"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a4051"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a4052"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">replace_keywords</span><span class="src-sym">(</span><span class="src-var">$instr</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4053"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$keywords</span>&nbsp;=&nbsp;<span class="src-var">$replacements</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4054"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4055"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$keywords</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'&lt;TIME&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4056"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$keywords</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'{TIME}'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4057"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$replacements</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$replacements</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<a href="http://www.php.net/number_format">number_format</a><span class="src-sym">(</span><span class="src-var">$time</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodget_time">get_time</a><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">,</span>&nbsp;<span class="src-num">3</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4058"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4059"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$keywords</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'&lt;LANGUAGE&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4060"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$keywords</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'{LANGUAGE}'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4061"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$replacements</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$replacements</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'LANG_NAME'</span><span class="src-sym">]</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4062"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4063"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$keywords</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'&lt;VERSION&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4064"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$keywords</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'{VERSION}'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4065"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$replacements</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$replacements</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_VERSION&quot;&gt;GESHI_VERSION&lt;/a&gt;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4066"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4067"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$keywords</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'&lt;SPEED&gt;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4068"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$keywords</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'{SPEED}'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4069"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$time</span>&nbsp;&lt;=&nbsp;<span class="src-num">0</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4070"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$speed</span>&nbsp;=&nbsp;<span class="src-str">'N/A'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4071"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4072"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$speed</span>&nbsp;=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">source</span><span class="src-sym">)</span>&nbsp;/&nbsp;<span class="src-var">$time</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4073"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$speed</span>&nbsp;&gt;=&nbsp;<span class="src-num">1024</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4074"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$speed</span>&nbsp;=&nbsp;<a href="http://www.php.net/sprintf">sprintf</a><span class="src-sym">(</span><span class="src-str">&quot;%.2f&nbsp;KB/s&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$speed</span>&nbsp;/&nbsp;<span class="src-num">1024.0</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4075"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4076"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$speed</span>&nbsp;=&nbsp;<a href="http://www.php.net/sprintf">sprintf</a><span class="src-sym">(</span><span class="src-str">&quot;%.0f&nbsp;B/s&quot;</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$speed</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4077"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4078"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4079"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$replacements</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$replacements</span><span class="src-sym">[</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-var">$speed</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4080"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4081"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<a href="http://www.php.net/str_replace">str_replace</a><span class="src-sym">(</span><span class="src-var">$keywords</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$replacements</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$instr</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4082"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4083"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4084"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;/**</span></div></li>
+<li><div class="src-line"><a name="a4085"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Secure&nbsp;replacement&nbsp;for&nbsp;PHP&nbsp;built-in&nbsp;function&nbsp;htmlspecialchars().</span></div></li>
+<li><div class="src-line"><a name="a4086"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a4087"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;See&nbsp;ticket&nbsp;#427&nbsp;(http://wush.net/trac/wikka/ticket/427)&nbsp;for&nbsp;the&nbsp;rationale</span></div></li>
+<li><div class="src-line"><a name="a4088"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;for&nbsp;this&nbsp;replacement&nbsp;function.</span></div></li>
+<li><div class="src-line"><a name="a4089"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a4090"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;INTERFACE&nbsp;for&nbsp;this&nbsp;function&nbsp;is&nbsp;almost&nbsp;the&nbsp;same&nbsp;as&nbsp;that&nbsp;for</span></div></li>
+<li><div class="src-line"><a name="a4091"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;htmlspecialchars(),&nbsp;with&nbsp;the&nbsp;same&nbsp;default&nbsp;for&nbsp;quote&nbsp;style;&nbsp;however,&nbsp;there</span></div></li>
+<li><div class="src-line"><a name="a4092"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;is&nbsp;no&nbsp;'charset'&nbsp;parameter.&nbsp;The&nbsp;reason&nbsp;for&nbsp;this&nbsp;is&nbsp;as&nbsp;follows:</span></div></li>
+<li><div class="src-line"><a name="a4093"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a4094"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;PHP&nbsp;docs&nbsp;say:</span></div></li>
+<li><div class="src-line"><a name="a4095"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;The&nbsp;third&nbsp;argument&nbsp;charset&nbsp;defines&nbsp;character&nbsp;set&nbsp;used&nbsp;in&nbsp;conversion.&quot;</span></div></li>
+<li><div class="src-line"><a name="a4096"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a4097"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;I&nbsp;suspect&nbsp;PHP's&nbsp;htmlspecialchars()&nbsp;is&nbsp;working&nbsp;at&nbsp;the&nbsp;byte-value&nbsp;level&nbsp;and</span></div></li>
+<li><div class="src-line"><a name="a4098"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;thus&nbsp;_needs_&nbsp;to&nbsp;know&nbsp;(or&nbsp;asssume)&nbsp;a&nbsp;character&nbsp;set&nbsp;because&nbsp;the&nbsp;special</span></div></li>
+<li><div class="src-line"><a name="a4099"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;characters&nbsp;to&nbsp;be&nbsp;replaced&nbsp;could&nbsp;exist&nbsp;at&nbsp;different&nbsp;code&nbsp;points&nbsp;in</span></div></li>
+<li><div class="src-line"><a name="a4100"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;different&nbsp;character&nbsp;sets.&nbsp;(If&nbsp;indeed&nbsp;htmlspecialchars()&nbsp;works&nbsp;at</span></div></li>
+<li><div class="src-line"><a name="a4101"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;byte-value&nbsp;level&nbsp;that&nbsp;goes&nbsp;some&nbsp;&nbsp;way&nbsp;towards&nbsp;explaining&nbsp;why&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a4102"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;vulnerability&nbsp;would&nbsp;exist&nbsp;in&nbsp;this&nbsp;function,&nbsp;too,&nbsp;and&nbsp;not&nbsp;only&nbsp;in</span></div></li>
+<li><div class="src-line"><a name="a4103"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;htmlentities()&nbsp;which&nbsp;certainly&nbsp;is&nbsp;working&nbsp;at&nbsp;byte-value&nbsp;level.)</span></div></li>
+<li><div class="src-line"><a name="a4104"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a4105"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;replacement&nbsp;function&nbsp;however&nbsp;works&nbsp;at&nbsp;character&nbsp;level&nbsp;and&nbsp;should</span></div></li>
+<li><div class="src-line"><a name="a4106"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;therefore&nbsp;be&nbsp;&quot;immune&quot;&nbsp;to&nbsp;character&nbsp;set&nbsp;differences&nbsp;-&nbsp;so&nbsp;no&nbsp;charset</span></div></li>
+<li><div class="src-line"><a name="a4107"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;parameter&nbsp;is&nbsp;needed&nbsp;or&nbsp;provided.&nbsp;If&nbsp;a&nbsp;third&nbsp;parameter&nbsp;is&nbsp;passed,&nbsp;it&nbsp;will</span></div></li>
+<li><div class="src-line"><a name="a4108"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;be&nbsp;silently&nbsp;ignored.</span></div></li>
+<li><div class="src-line"><a name="a4109"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a4110"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;In&nbsp;the&nbsp;OUTPUT&nbsp;there&nbsp;is&nbsp;a&nbsp;minor&nbsp;difference&nbsp;in&nbsp;that&nbsp;we&nbsp;use&nbsp;'&amp;#39;'&nbsp;instead</span></div></li>
+<li><div class="src-line"><a name="a4111"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;of&nbsp;PHP's&nbsp;'&amp;#039;'&nbsp;for&nbsp;a&nbsp;single&nbsp;quote:&nbsp;this&nbsp;provides&nbsp;compatibility&nbsp;with</span></div></li>
+<li><div class="src-line"><a name="a4112"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_html_translation_table(HTML_SPECIALCHARS,&nbsp;ENT_QUOTES)</span></div></li>
+<li><div class="src-line"><a name="a4113"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(see&nbsp;comment&nbsp;by&nbsp;mikiwoz&nbsp;at&nbsp;yahoo&nbsp;dot&nbsp;co&nbsp;dot&nbsp;uk&nbsp;on</span></div></li>
+<li><div class="src-line"><a name="a4114"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;http://php.net/htmlspecialchars);&nbsp;it&nbsp;also&nbsp;matches&nbsp;the&nbsp;entity&nbsp;definition</span></div></li>
+<li><div class="src-line"><a name="a4115"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;for&nbsp;XML&nbsp;1.0</span></div></li>
+<li><div class="src-line"><a name="a4116"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Special_characters).</span></div></li>
+<li><div class="src-line"><a name="a4117"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Like&nbsp;PHP&nbsp;we&nbsp;use&nbsp;a&nbsp;numeric&nbsp;character&nbsp;reference&nbsp;instead&nbsp;of&nbsp;'&amp;apos;'&nbsp;for&nbsp;the</span></div></li>
+<li><div class="src-line"><a name="a4118"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;single&nbsp;quote.&nbsp;For&nbsp;the&nbsp;other&nbsp;special&nbsp;characters&nbsp;we&nbsp;use&nbsp;the&nbsp;named&nbsp;entity</span></div></li>
+<li><div class="src-line"><a name="a4119"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;references,&nbsp;as&nbsp;PHP&nbsp;is&nbsp;doing.</span></div></li>
+<li><div class="src-line"><a name="a4120"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a4121"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{@link&nbsp;http://wikkawiki.org/JavaWoman&nbsp;Marjolein&nbsp;Katsma}</span></div></li>
+<li><div class="src-line"><a name="a4122"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a4123"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@license&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.gnu.org/copyleft/lgpl.html</span></div></li>
+<li><div class="src-line"><a name="a4124"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GNU&nbsp;Lesser&nbsp;General&nbsp;Public&nbsp;License</span></div></li>
+<li><div class="src-line"><a name="a4125"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@copyright&nbsp;&nbsp;&nbsp;Copyright&nbsp;2007,&nbsp;{@link&nbsp;http://wikkawiki.org/CreditsPage</span></div></li>
+<li><div class="src-line"><a name="a4126"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Wikka&nbsp;Development&nbsp;Team}</span></div></li>
+<li><div class="src-line"><a name="a4127"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a4128"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private</span></div></li>
+<li><div class="src-line"><a name="a4129"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;&nbsp;$string&nbsp;string&nbsp;to&nbsp;be&nbsp;converted</span></div></li>
+<li><div class="src-line"><a name="a4130"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;integer&nbsp;$quote_style</span></div></li>
+<li><div class="src-line"><a name="a4131"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;ENT_COMPAT:&nbsp;&nbsp;&nbsp;escapes&nbsp;&amp;,&nbsp;&lt;,&nbsp;&gt;&nbsp;and&nbsp;double&nbsp;quote&nbsp;(default)</span></div></li>
+<li><div class="src-line"><a name="a4132"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;ENT_NOQUOTES:&nbsp;escapes&nbsp;only&nbsp;&amp;,&nbsp;&lt;&nbsp;and&nbsp;&gt;</span></div></li>
+<li><div class="src-line"><a name="a4133"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;ENT_QUOTES:&nbsp;&nbsp;&nbsp;escapes&nbsp;&amp;,&nbsp;&lt;,&nbsp;&gt;,&nbsp;double&nbsp;and&nbsp;single&nbsp;quotes</span></div></li>
+<li><div class="src-line"><a name="a4134"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;&nbsp;converted&nbsp;string</span></div></li>
+<li><div class="src-line"><a name="a4135"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0.7.18</span></div></li>
+<li><div class="src-line"><a name="a4136"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a4137"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<span class="src-id">hsc</span><span class="src-sym">(</span><span class="src-var">$string</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$quote_style</span>&nbsp;=&nbsp;<span class="src-id">ENT_COMPAT</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4138"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;init</span></span></div></li>
+<li><div class="src-line"><a name="a4139"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">static</span>&nbsp;<span class="src-var">$aTransSpecchar</span>&nbsp;=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span></span></div></li>
+<li><div class="src-line"><a name="a4140"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&amp;'</span>&nbsp;=&gt;&nbsp;<span class="src-str">'&amp;amp;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a4141"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&quot;'</span>&nbsp;=&gt;&nbsp;<span class="src-str">'&amp;quot;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a4142"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&lt;'</span>&nbsp;=&gt;&nbsp;<span class="src-str">'&amp;lt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a4143"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'&gt;'</span>&nbsp;=&gt;&nbsp;<span class="src-str">'&amp;gt;'</span><span class="src-sym">,</span></span></div></li>
+<li><div class="src-line"><a name="a4144"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4145"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//This&nbsp;fix&nbsp;is&nbsp;related&nbsp;to&nbsp;SF#1923020,&nbsp;but&nbsp;has&nbsp;to&nbsp;be&nbsp;applied</span></span></div></li>
+<li><div class="src-line"><a name="a4146"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//regardless&nbsp;of&nbsp;actually&nbsp;highlighting&nbsp;symbols.</span></span></div></li>
+<li><div class="src-line"><a name="a4147"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a4148"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Circumvent&nbsp;a&nbsp;bug&nbsp;with&nbsp;symbol&nbsp;highlighting</span></span></div></li>
+<li><div class="src-line"><a name="a4149"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//This&nbsp;is&nbsp;required&nbsp;as&nbsp;;&nbsp;would&nbsp;produce&nbsp;undesirable&nbsp;side-effects&nbsp;if&nbsp;it</span></span></div></li>
+<li><div class="src-line"><a name="a4150"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//was&nbsp;not&nbsp;to&nbsp;be&nbsp;processed&nbsp;as&nbsp;an&nbsp;entity.</span></span></div></li>
+<li><div class="src-line"><a name="a4151"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">';'</span>&nbsp;=&gt;&nbsp;<span class="src-str">'&lt;SEMI&gt;'</span><span class="src-sym">,</span>&nbsp;<span class="src-comm">//&nbsp;Force&nbsp;;&nbsp;to&nbsp;be&nbsp;processed&nbsp;as&nbsp;entity</span></span></div></li>
+<li><div class="src-line"><a name="a4152"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'|'</span>&nbsp;=&gt;&nbsp;<span class="src-str">'&lt;PIPE&gt;'</span>&nbsp;<span class="src-comm">//&nbsp;Force&nbsp;|&nbsp;to&nbsp;be&nbsp;processed&nbsp;as&nbsp;entity</span></span></div></li>
+<li><div class="src-line"><a name="a4153"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">)</span><span class="src-sym">;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;ENT_COMPAT&nbsp;set</span></span></div></li>
+<li><div class="src-line"><a name="a4154"></a></span><span class="src-str"><span class="src-comm"></span></span></div></li>
+<li><div class="src-line"><a name="a4155"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">switch</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$quote_style</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4156"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">case</span>&nbsp;<span class="src-id">ENT_NOQUOTES</span>:&nbsp;<span class="src-comm">//&nbsp;don't&nbsp;convert&nbsp;double&nbsp;quotes</span></span></div></li>
+<li><div class="src-line"><a name="a4157"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$aTransSpecchar</span><span class="src-sym">[</span><span class="src-str">'&quot;'</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4158"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4159"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">case</span>&nbsp;<span class="src-id">ENT_QUOTES</span>:&nbsp;<span class="src-comm">//&nbsp;convert&nbsp;single&nbsp;quotes&nbsp;as&nbsp;well</span></span></div></li>
+<li><div class="src-line"><a name="a4160"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$aTransSpecchar</span><span class="src-sym">[</span><span class="src-str">&quot;'&quot;</span><span class="src-sym">]</span>&nbsp;=&nbsp;<span class="src-str">'&amp;#39;'</span><span class="src-sym">;</span>&nbsp;<span class="src-comm">//&nbsp;(apos)&nbsp;htmlspecialchars()&nbsp;uses&nbsp;'&amp;#039;'</span></span></div></li>
+<li><div class="src-line"><a name="a4161"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4162"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4163"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4164"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;return&nbsp;translated&nbsp;string</span></span></div></li>
+<li><div class="src-line"><a name="a4165"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<a href="http://www.php.net/strtr">strtr</a><span class="src-sym">(</span><span class="src-var">$string</span><span class="src-sym">,</span>&nbsp;<span class="src-var">$aTransSpecchar</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4166"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4167"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4168"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;/**</span></div></li>
+<li><div class="src-line"><a name="a4169"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;a&nbsp;stylesheet&nbsp;for&nbsp;the&nbsp;highlighted&nbsp;code.&nbsp;If&nbsp;$economy&nbsp;mode</span></div></li>
+<li><div class="src-line"><a name="a4170"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;is&nbsp;true,&nbsp;we&nbsp;only&nbsp;return&nbsp;the&nbsp;stylesheet&nbsp;declarations&nbsp;that&nbsp;matter&nbsp;for</span></div></li>
+<li><div class="src-line"><a name="a4171"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;this&nbsp;code&nbsp;block&nbsp;instead&nbsp;of&nbsp;the&nbsp;whole&nbsp;thing</span></div></li>
+<li><div class="src-line"><a name="a4172"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span></div></li>
+<li><div class="src-line"><a name="a4173"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&nbsp;boolean&nbsp;Whether&nbsp;to&nbsp;use&nbsp;economy&nbsp;mode&nbsp;or&nbsp;not</span></div></li>
+<li><div class="src-line"><a name="a4174"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;A&nbsp;stylesheet&nbsp;built&nbsp;on&nbsp;the&nbsp;data&nbsp;for&nbsp;the&nbsp;current&nbsp;language</span></div></li>
+<li><div class="src-line"><a name="a4175"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;&nbsp;1.0.0</span></div></li>
+<li><div class="src-line"><a name="a4176"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span></div></li>
+<li><div class="src-line"><a name="a4177"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function</span>&nbsp;<a href="../geshi/core/GeSHi.html#methodget_stylesheet">get_stylesheet</a><span class="src-sym">(</span><span class="src-var">$economy_mode</span>&nbsp;=&nbsp;<span class="src-id">true</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4178"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;If&nbsp;there's&nbsp;an&nbsp;error,&nbsp;chances&nbsp;are&nbsp;that&nbsp;the&nbsp;language&nbsp;file</span></span></div></li>
+<li><div class="src-line"><a name="a4179"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;won't&nbsp;have&nbsp;populated&nbsp;the&nbsp;language&nbsp;data&nbsp;file,&nbsp;so&nbsp;we&nbsp;can't</span></span></div></li>
+<li><div class="src-line"><a name="a4180"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;risk&nbsp;getting&nbsp;a&nbsp;stylesheet...</span></span></div></li>
+<li><div class="src-line"><a name="a4181"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methoderror">error</a><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4182"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return</span>&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4183"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4184"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4185"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//Check&nbsp;if&nbsp;the&nbsp;style&nbsp;rearrangements&nbsp;have&nbsp;been&nbsp;processed&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a4186"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//This&nbsp;also&nbsp;does&nbsp;some&nbsp;preprocessing&nbsp;to&nbsp;check&nbsp;which&nbsp;style&nbsp;groups&nbsp;are&nbsp;useable&nbsp;...</span></span></div></li>
+<li><div class="src-line"><a name="a4187"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span><span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'NUMBERS_CACHE'</span><span class="src-sym">]</span><span class="src-sym">))</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4188"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">build_style_cache</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4189"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4190"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4191"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;First,&nbsp;work&nbsp;out&nbsp;what&nbsp;the&nbsp;selector&nbsp;should&nbsp;be.&nbsp;If&nbsp;there's&nbsp;an&nbsp;ID,</span></span></div></li>
+<li><div class="src-line"><a name="a4192"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;that&nbsp;should&nbsp;be&nbsp;used,&nbsp;the&nbsp;same&nbsp;for&nbsp;a&nbsp;class.&nbsp;Otherwise,&nbsp;a&nbsp;selector</span></span></div></li>
+<li><div class="src-line"><a name="a4193"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;of&nbsp;''&nbsp;means&nbsp;that&nbsp;these&nbsp;styles&nbsp;will&nbsp;be&nbsp;applied&nbsp;anywhere</span></span></div></li>
+<li><div class="src-line"><a name="a4194"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_id</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4195"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$selector</span>&nbsp;=&nbsp;<span class="src-str">'#'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_id</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4196"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4197"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$selector</span>&nbsp;=&nbsp;<span class="src-str">'.'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4198"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_class</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4199"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$selector</span>&nbsp;.=&nbsp;<span class="src-str">'.'</span>&nbsp;.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_class</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4200"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4201"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4202"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$selector</span>&nbsp;.=&nbsp;<span class="src-str">'&nbsp;'</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4203"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4204"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Header&nbsp;of&nbsp;the&nbsp;stylesheet</span></span></div></li>
+<li><div class="src-line"><a name="a4205"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$economy_mode</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4206"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet</span>&nbsp;=&nbsp;<span class="src-str">&quot;/**\n&quot;</span>.</span></div></li>
+<li><div class="src-line"><a name="a4207"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;&nbsp;*&nbsp;GeSHi&nbsp;Dynamically&nbsp;Generated&nbsp;Stylesheet\n&quot;</span>.</span></div></li>
+<li><div class="src-line"><a name="a4208"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;&nbsp;*&nbsp;--------------------------------------\n&quot;</span>.</span></div></li>
+<li><div class="src-line"><a name="a4209"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">"</span></span>&nbsp;*&nbsp;Dynamically&nbsp;generated&nbsp;stylesheet&nbsp;for&nbsp;{<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language</span><span class="src-sym">}</span>\n<span class="src-str">&quot;</span><span class="src-str">.</span></div></li>
+<li><div class="src-line"><a name="a4210"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="src-str">&quot;</span>&nbsp;*&nbsp;CSS&nbsp;class:&nbsp;{<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_class</span><span class="src-sym">}</span>,&nbsp;CSS&nbsp;id:&nbsp;{<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_id</span><span class="src-sym">}</span>\n<span class="src-str">&quot;</span><span class="src-str">.</span></div></li>
+<li><div class="src-line"><a name="a4211"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;&nbsp;*&nbsp;GeSHi&nbsp;(C)&nbsp;2004&nbsp;-&nbsp;2007&nbsp;Nigel&nbsp;McNie,&nbsp;2007&nbsp;-&nbsp;2008&nbsp;Benny&nbsp;Baumann\n&quot;</span>&nbsp;.</span></div></li>
+<li><div class="src-line"><a name="a4212"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;&nbsp;*&nbsp;(http://qbnz.com/highlighter/&nbsp;and&nbsp;http://geshi.org/)\n&quot;</span>.</span></div></li>
+<li><div class="src-line"><a name="a4213"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;&nbsp;*&nbsp;--------------------------------------\n&quot;</span>.</span></div></li>
+<li><div class="src-line"><a name="a4214"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;&nbsp;*/\n&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4215"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span>&nbsp;<span class="src-key">else</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4216"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet</span>&nbsp;=&nbsp;<span class="src-str">&quot;/**\n&quot;</span>.</span></div></li>
+<li><div class="src-line"><a name="a4217"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;&nbsp;*&nbsp;GeSHi&nbsp;(C)&nbsp;2004&nbsp;-&nbsp;2007&nbsp;Nigel&nbsp;McNie,&nbsp;2007&nbsp;-&nbsp;2008&nbsp;Benny&nbsp;Baumann\n&quot;</span>&nbsp;.</span></div></li>
+<li><div class="src-line"><a name="a4218"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;&nbsp;*&nbsp;(http://qbnz.com/highlighter/&nbsp;and&nbsp;http://geshi.org/)\n&quot;</span>.</span></div></li>
+<li><div class="src-line"><a name="a4219"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">&quot;&nbsp;*/\n&quot;</span><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4220"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4221"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4222"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Set&nbsp;the&nbsp;&lt;ol&gt;&nbsp;to&nbsp;have&nbsp;no&nbsp;effect&nbsp;at&nbsp;all&nbsp;if&nbsp;there&nbsp;are&nbsp;line&nbsp;numbers</span></span></div></li>
+<li><div class="src-line"><a name="a4223"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;(&lt;ol&gt;s&nbsp;have&nbsp;margins&nbsp;that&nbsp;should&nbsp;be&nbsp;destroyed&nbsp;so&nbsp;all&nbsp;layout&nbsp;is</span></span></div></li>
+<li><div class="src-line"><a name="a4224"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;controlled&nbsp;by&nbsp;the&nbsp;set_overall_style&nbsp;method,&nbsp;which&nbsp;works&nbsp;on&nbsp;the</span></span></div></li>
+<li><div class="src-line"><a name="a4225"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;&lt;pre&gt;&nbsp;or&nbsp;&lt;div&gt;&nbsp;container).&nbsp;Additionally,&nbsp;set&nbsp;default&nbsp;styles&nbsp;for&nbsp;lines</span></span></div></li>
+<li><div class="src-line"><a name="a4226"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$economy_mode</span>&nbsp;||&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers</span>&nbsp;!=&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS&quot;&gt;GESHI_NO_LINE_NUMBERS&lt;/a&gt;</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4227"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//$stylesheet&nbsp;.=&nbsp;&quot;$selector,&nbsp;{$selector}ol,&nbsp;{$selector}ol&nbsp;li&nbsp;{margin:&nbsp;0;}\n&quot;;</span></span></div></li>
+<li><div class="src-line"><a name="a4228"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet</span>&nbsp;.=&nbsp;<span class="src-str">"</span></span><span class="src-var">$selector</span>.de1,&nbsp;<span class="src-var">$selector</span>.de2&nbsp;{{<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">code_style</span><span class="src-sym">}</span>}\n<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4229"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4230"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4231"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Add&nbsp;overall&nbsp;styles</span></span></div></li>
+<li><div class="src-line"><a name="a4232"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;note:&nbsp;neglect&nbsp;economy_mode,&nbsp;empty&nbsp;styles&nbsp;are&nbsp;meaningless</span></span></div></li>
+<li><div class="src-line"><a name="a4233"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_style</span>&nbsp;!=&nbsp;<span class="src-str">''</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4234"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet</span>&nbsp;.=&nbsp;<span class="src-str">"</span></span><span class="src-var">$selector</span>&nbsp;{{<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">overall_style</span><span class="src-sym">}</span>}\n<span class="src-str">&quot;</span><span class="src-str"><span class="src-sym">;</span></span></div></li>
+<li><div class="src-line"><a name="a4235"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></span></div></li>
+<li><div class="src-line"><a name="a4236"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4237"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Add&nbsp;styles&nbsp;for&nbsp;links</span></span></div></li>
+<li><div class="src-line"><a name="a4238"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;note:&nbsp;economy&nbsp;mode&nbsp;does&nbsp;not&nbsp;make&nbsp;_any_&nbsp;sense&nbsp;here</span></span></div></li>
+<li><div class="src-line"><a name="a4239"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;either&nbsp;the&nbsp;style&nbsp;is&nbsp;empty&nbsp;and&nbsp;thus&nbsp;no&nbsp;selector&nbsp;is&nbsp;needed</span></span></div></li>
+<li><div class="src-line"><a name="a4240"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;the&nbsp;appropriate&nbsp;key&nbsp;is&nbsp;given.</span></span></div></li>
+<li><div class="src-line"><a name="a4241"></a></span><span class="src-str"><span class="src-comm"></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">link_styles</span>&nbsp;<span class="src-key">as</span>&nbsp;<span class="src-var">$key</span>&nbsp;=&gt;&nbsp;<span class="src-var">$style</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4242"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$style</span>&nbsp;!=&nbsp;<span class="src-str">''</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4243"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">switch</span>&nbsp;<span class="src-sym">(</span><span class="src-var">$key</span><span class="src-sym">)</span>&nbsp;<span class="src-sym">{</span></span></div></li>
+<li><div class="src-line"><a name="a4244"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">case</span>&nbsp;<span class="src-id">&lt;a&nbsp;href=&quot;../geshi/core/_geshi.php.html#defineGESHI_LINK&quot;&gt;GESHI_LINK&lt;/a&gt;</span>:</span></div></li>
+<li><div class="src-line"><a name="a4245"></a></span><span class="src-str">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet</span>&nbsp;.=&nbsp;<span class="src-str">"</span>{<span class="src-var">$selector</span><span class="src-sym">}</span>a:link&nbsp;{{<span class="src-var">$style</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4246"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4247"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">case&nbsp;</span><span class="src-id"><a href="../geshi/core/_geshi.php.html#defineGESHI_HOVER">GESHI_HOVER</a></span>:</div></li>
+<li><div class="src-line"><a name="a4248"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span>{<span class="src-var">$selector</span><span class="src-str"></span><span class="src-sym">}</span>a:hover&nbsp;{{<span class="src-var">$style</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4249"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4250"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">case&nbsp;</span><span class="src-id"><a href="../geshi/core/_geshi.php.html#defineGESHI_ACTIVE">GESHI_ACTIVE</a></span>:</div></li>
+<li><div class="src-line"><a name="a4251"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span>{<span class="src-var">$selector</span><span class="src-str"></span><span class="src-sym">}</span>a:active&nbsp;{{<span class="src-var">$style</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4252"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4253"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">case&nbsp;</span><span class="src-id"><a href="../geshi/core/_geshi.php.html#defineGESHI_VISITED">GESHI_VISITED</a></span>:</div></li>
+<li><div class="src-line"><a name="a4254"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span>{<span class="src-var">$selector</span><span class="src-str"></span><span class="src-sym">}</span>a:visited&nbsp;{{<span class="src-var">$style</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4255"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4256"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4257"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4258"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4259"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4260"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Header&nbsp;and&nbsp;footer</span></div></li>
+<li><div class="src-line"><a name="a4261"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;note:&nbsp;neglect&nbsp;economy_mode,&nbsp;empty&nbsp;styles&nbsp;are&nbsp;meaningless</span></div></li>
+<li><div class="src-line"><a name="a4262"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">header_content_style&nbsp;</span>!=&nbsp;<span class="src-str">''</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4263"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.head&nbsp;{{<span class="src-var">$this</span></span><span class="src-sym">-&gt;</span><span class="src-id">header_content_style</span><span class="src-str"></span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4264"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4265"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">footer_content_style&nbsp;</span>!=&nbsp;<span class="src-str">''</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4266"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.foot&nbsp;{{<span class="src-var">$this</span></span><span class="src-sym">-&gt;</span><span class="src-id">footer_content_style</span><span class="src-str"></span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4267"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4268"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4269"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Styles&nbsp;for&nbsp;important&nbsp;stuff</span></div></li>
+<li><div class="src-line"><a name="a4270"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;note:&nbsp;neglect&nbsp;economy_mode,&nbsp;empty&nbsp;styles&nbsp;are&nbsp;meaningless</span></div></li>
+<li><div class="src-line"><a name="a4271"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">important_styles&nbsp;</span>!=&nbsp;<span class="src-str">''</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4272"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.imp&nbsp;{{<span class="src-var">$this</span></span><span class="src-sym">-&gt;</span><span class="src-id">important_styles</span><span class="src-str"></span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4273"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4274"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4275"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Simple&nbsp;line&nbsp;number&nbsp;styles</span></div></li>
+<li><div class="src-line"><a name="a4276"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">((</span><span class="src-sym">!</span><span class="src-var">$economy_mode&nbsp;</span>||&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers&nbsp;</span>!=&nbsp;<span class="src-id"><a href="../geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS">GESHI_NO_LINE_NUMBERS</a></span><span class="src-sym">)&nbsp;</span>&amp;&amp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_style1&nbsp;</span>!=&nbsp;<span class="src-str">''</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4277"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span>{<span class="src-var">$selector</span><span class="src-str"></span><span class="src-sym">}</span>li,&nbsp;{<span class="src-var">$selector</span><span class="src-sym">}</span>.li1&nbsp;{{<span class="src-var">$this</span></span><span class="src-sym">-&gt;</span><span class="src-id">line_style1</span><span class="src-str"></span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4278"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4279"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">((</span><span class="src-sym">!</span><span class="src-var">$economy_mode&nbsp;</span>||&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers&nbsp;</span>!=&nbsp;<span class="src-id"><a href="../geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS">GESHI_NO_LINE_NUMBERS</a></span><span class="src-sym">)&nbsp;</span>&amp;&amp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">table_linenumber_style&nbsp;</span>!=&nbsp;<span class="src-str">''</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4280"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span>{<span class="src-var">$selector</span><span class="src-str"></span><span class="src-sym">}</span>.ln&nbsp;{{<span class="src-var">$this</span></span><span class="src-sym">-&gt;</span><span class="src-id">table_linenumber_style</span><span class="src-str"></span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4281"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4282"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;If&nbsp;there&nbsp;is&nbsp;a&nbsp;style&nbsp;set&nbsp;for&nbsp;fancy&nbsp;line&nbsp;numbers,&nbsp;echo&nbsp;it&nbsp;out</span></div></li>
+<li><div class="src-line"><a name="a4283"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">((</span><span class="src-sym">!</span><span class="src-var">$economy_mode&nbsp;</span>||&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_numbers&nbsp;</span>==&nbsp;<span class="src-id"><a href="../geshi/core/_geshi.php.html#defineGESHI_FANCY_LINE_NUMBERS">GESHI_FANCY_LINE_NUMBERS</a></span><span class="src-sym">)&nbsp;</span>&amp;&amp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">line_style2&nbsp;</span>!=&nbsp;<span class="src-str">''</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4284"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span>{<span class="src-var">$selector</span><span class="src-str"></span><span class="src-sym">}</span>.li2&nbsp;{{<span class="src-var">$this</span></span><span class="src-sym">-&gt;</span><span class="src-id">line_style2</span><span class="src-str"></span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4285"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4286"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4287"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;note:&nbsp;empty&nbsp;styles&nbsp;are&nbsp;meaningless</span></div></li>
+<li><div class="src-line"><a name="a4288"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]&nbsp;</span><span class="src-key">as&nbsp;</span><span class="src-var">$group&nbsp;</span>=&gt;&nbsp;<span class="src-var">$styles</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4289"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$styles&nbsp;</span>!=&nbsp;<span class="src-str">''&nbsp;</span>&amp;&amp;&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$economy_mode&nbsp;</span>||</div></li>
+<li><div class="src-line"><a name="a4290"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$group</span><span class="src-sym">]</span><span class="src-sym">)&nbsp;</span>&amp;&amp;</div></li>
+<li><div class="src-line"><a name="a4291"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'KEYWORDS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$group</span><span class="src-sym">]</span><span class="src-sym">)))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4292"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.kw<span class="src-var">$group</span>&nbsp;{{<span class="src-var">$styles</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4293"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4294"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4295"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]&nbsp;</span><span class="src-key">as&nbsp;</span><span class="src-var">$group&nbsp;</span>=&gt;&nbsp;<span class="src-var">$styles</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4296"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$styles&nbsp;</span>!=&nbsp;<span class="src-str">''&nbsp;</span>&amp;&amp;&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$economy_mode&nbsp;</span>||</div></li>
+<li><div class="src-line"><a name="a4297"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$group</span><span class="src-sym">]</span><span class="src-sym">)&nbsp;</span>&amp;&amp;</div></li>
+<li><div class="src-line"><a name="a4298"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'COMMENTS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$group</span><span class="src-sym">]</span><span class="src-sym">)&nbsp;</span>||</div></li>
+<li><div class="src-line"><a name="a4299"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'COMMENT_REGEXP'</span><span class="src-sym">]</span><span class="src-sym">)&nbsp;</span>&amp;&amp;</div></li>
+<li><div class="src-line"><a name="a4300"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'COMMENT_REGEXP'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$group</span><span class="src-sym">]</span><span class="src-sym">))))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4301"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.co<span class="src-var">$group</span>&nbsp;{{<span class="src-var">$styles</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4302"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4303"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4304"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]&nbsp;</span><span class="src-key">as&nbsp;</span><span class="src-var">$group&nbsp;</span>=&gt;&nbsp;<span class="src-var">$styles</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4305"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$styles&nbsp;</span>!=&nbsp;<span class="src-str">''&nbsp;</span>&amp;&amp;&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$economy_mode&nbsp;</span>||&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'ESCAPE_CHAR'</span><span class="src-sym">]</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4306"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;NEW:&nbsp;since&nbsp;1.0.8&nbsp;we&nbsp;have&nbsp;to&nbsp;handle&nbsp;hardescapes</span></div></li>
+<li><div class="src-line"><a name="a4307"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$group&nbsp;</span>===&nbsp;<span class="src-str">'HARD'</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4308"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$group&nbsp;</span>=&nbsp;<span class="src-str">'_h'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4309"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4310"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.es<span class="src-var">$group</span>&nbsp;{{<span class="src-var">$styles</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4311"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4312"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4313"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]&nbsp;</span><span class="src-key">as&nbsp;</span><span class="src-var">$group&nbsp;</span>=&gt;&nbsp;<span class="src-var">$styles</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4314"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$styles&nbsp;</span>!=&nbsp;<span class="src-str">''&nbsp;</span>&amp;&amp;&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$economy_mode&nbsp;</span>||&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'BRACKETS'</span><span class="src-sym">]</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4315"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.br<span class="src-var">$group</span>&nbsp;{{<span class="src-var">$styles</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4316"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4317"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4318"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'SYMBOLS'</span><span class="src-sym">]&nbsp;</span><span class="src-key">as&nbsp;</span><span class="src-var">$group&nbsp;</span>=&gt;&nbsp;<span class="src-var">$styles</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4319"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$styles&nbsp;</span>!=&nbsp;<span class="src-str">''&nbsp;</span>&amp;&amp;&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$economy_mode&nbsp;</span>||&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'SYMBOLS'</span><span class="src-sym">]</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4320"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.sy<span class="src-var">$group</span>&nbsp;{{<span class="src-var">$styles</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4321"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4322"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4323"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'STRINGS'</span><span class="src-sym">]&nbsp;</span><span class="src-key">as&nbsp;</span><span class="src-var">$group&nbsp;</span>=&gt;&nbsp;<span class="src-var">$styles</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4324"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$styles&nbsp;</span>!=&nbsp;<span class="src-str">''&nbsp;</span>&amp;&amp;&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$economy_mode&nbsp;</span>||&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'STRINGS'</span><span class="src-sym">]</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4325"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;NEW:&nbsp;since&nbsp;1.0.8&nbsp;we&nbsp;have&nbsp;to&nbsp;handle&nbsp;hardquotes</span></div></li>
+<li><div class="src-line"><a name="a4326"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$group&nbsp;</span>===&nbsp;<span class="src-str">'HARD'</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4327"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$group&nbsp;</span>=&nbsp;<span class="src-str">'_h'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4328"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4329"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.st<span class="src-var">$group</span>&nbsp;{{<span class="src-var">$styles</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4330"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4331"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4332"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]&nbsp;</span><span class="src-key">as&nbsp;</span><span class="src-var">$group&nbsp;</span>=&gt;&nbsp;<span class="src-var">$styles</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4333"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$styles&nbsp;</span>!=&nbsp;<span class="src-str">''&nbsp;</span>&amp;&amp;&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$economy_mode&nbsp;</span>||&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'NUMBERS'</span><span class="src-sym">]</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4334"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.nu<span class="src-var">$group</span>&nbsp;{{<span class="src-var">$styles</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4335"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4336"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4337"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'METHODS'</span><span class="src-sym">]&nbsp;</span><span class="src-key">as&nbsp;</span><span class="src-var">$group&nbsp;</span>=&gt;&nbsp;<span class="src-var">$styles</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4338"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$styles&nbsp;</span>!=&nbsp;<span class="src-str">''&nbsp;</span>&amp;&amp;&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$economy_mode&nbsp;</span>||&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'METHODS'</span><span class="src-sym">]</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4339"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.me<span class="src-var">$group</span>&nbsp;{{<span class="src-var">$styles</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4340"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4341"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4342"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;note:&nbsp;neglect&nbsp;economy_mode,&nbsp;empty&nbsp;styles&nbsp;are&nbsp;meaningless</span></div></li>
+<li><div class="src-line"><a name="a4343"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'SCRIPT'</span><span class="src-sym">]&nbsp;</span><span class="src-key">as&nbsp;</span><span class="src-var">$group&nbsp;</span>=&gt;&nbsp;<span class="src-var">$styles</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4344"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$styles&nbsp;</span>!=&nbsp;<span class="src-str">''</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4345"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.sc<span class="src-var">$group</span>&nbsp;{{<span class="src-var">$styles</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4346"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4347"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4348"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'STYLES'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]&nbsp;</span><span class="src-key">as&nbsp;</span><span class="src-var">$group&nbsp;</span>=&gt;&nbsp;<span class="src-var">$styles</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4349"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$styles&nbsp;</span>!=&nbsp;<span class="src-str">''&nbsp;</span>&amp;&amp;&nbsp;<span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$economy_mode&nbsp;</span>||</div></li>
+<li><div class="src-line"><a name="a4350"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$group</span><span class="src-sym">]</span><span class="src-sym">)&nbsp;</span>&amp;&amp;</div></li>
+<li><div class="src-line"><a name="a4351"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">lexic_permissions</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$group</span><span class="src-sym">]</span><span class="src-sym">)))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4352"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><a href="http://www.php.net/is_array">is_array</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$group</span><span class="src-sym">]</span><span class="src-sym">)&nbsp;</span>&amp;&amp;</div></li>
+<li><div class="src-line"><a name="a4353"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/array_key_exists">array_key_exists</a><span class="src-sym">(</span><span class="src-id">GESHI_CLASS</span><span class="src-sym">,&nbsp;</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$group</span><span class="src-sym">]</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4354"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4355"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">language_data</span><span class="src-sym">[</span><span class="src-str">'REGEXPS'</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$group</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-id">GESHI_CLASS</span><span class="src-sym">]</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4356"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str">&nbsp;{{<span class="src-var">$styles</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4357"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}&nbsp;</span><span class="src-key">else&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4358"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span><span class="src-str"><span class="src-var">$selector</span>.re<span class="src-var">$group</span>&nbsp;{{<span class="src-var">$styles</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4359"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4360"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4361"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4362"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;Styles&nbsp;for&nbsp;lines&nbsp;being&nbsp;highlighted&nbsp;extra</span></div></li>
+<li><div class="src-line"><a name="a4363"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$economy_mode&nbsp;</span>||&nbsp;<span class="src-sym">(</span><a href="http://www.php.net/count">count</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines</span><span class="src-sym">)</span>!=<a href="http://www.php.net/count">count</a><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines_styles</span><span class="src-sym">)))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4364"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span>{<span class="src-var">$selector</span><span class="src-str"></span><span class="src-sym">}</span>.ln-xtra,&nbsp;{<span class="src-var">$selector</span><span class="src-sym">}</span>li.ln-xtra,&nbsp;{<span class="src-var">$selector</span><span class="src-sym">}</span>div.ln-xtra&nbsp;{{<span class="src-var">$this</span></span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines_style</span><span class="src-str"></span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4365"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4366"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span>{<span class="src-var">$selector</span><span class="src-str"></span><span class="src-sym">}</span>span.xtra&nbsp;{&nbsp;display:block;&nbsp;}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4367"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach&nbsp;</span><span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines_styles&nbsp;</span><span class="src-key">as&nbsp;</span><span class="src-var">$lineid&nbsp;</span>=&gt;&nbsp;<span class="src-var">$linestyle</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4368"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$stylesheet&nbsp;</span>.=&nbsp;<span class="src-str">&quot;</span>{<span class="src-var">$selector</span><span class="src-str"></span><span class="src-sym">}</span>.lx<span class="src-var">$lineid</span>,&nbsp;{<span class="src-var">$selector</span><span class="src-sym">}</span>li.lx<span class="src-var">$lineid</span>,&nbsp;{<span class="src-var">$selector</span><span class="src-sym">}</span>div.lx<span class="src-var">$lineid</span>&nbsp;{{<span class="src-var">$linestyle</span><span class="src-sym">}</span>}\n</span><span class="src-str">&quot;</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4369"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4370"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4371"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return&nbsp;</span><span class="src-var">$stylesheet</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4372"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4373"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4374"></a>&nbsp;&nbsp;&nbsp;&nbsp;/**</div></li>
+<li><div class="src-line"><a name="a4375"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Get's&nbsp;the&nbsp;style&nbsp;that&nbsp;is&nbsp;used&nbsp;for&nbsp;the&nbsp;specified&nbsp;line</div></li>
+<li><div class="src-line"><a name="a4376"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</div></li>
+<li><div class="src-line"><a name="a4377"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;int&nbsp;The&nbsp;line&nbsp;number&nbsp;information&nbsp;is&nbsp;requested&nbsp;for</div></li>
+<li><div class="src-line"><a name="a4378"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;private</div></li>
+<li><div class="src-line"><a name="a4379"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;1.0.7.21</div></li>
+<li><div class="src-line"><a name="a4380"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</div></li>
+<li><div class="src-line"><a name="a4381"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function&nbsp;</span><span class="src-id">get_line_style</span><span class="src-sym">(</span><span class="src-var">$line</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4382"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//$style&nbsp;=&nbsp;null;</span></div></li>
+<li><div class="src-line"><a name="a4383"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$style&nbsp;</span>=&nbsp;<span class="src-id">null</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4384"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines_styles</span><span class="src-sym">[</span><span class="src-var">$line</span><span class="src-sym">]</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4385"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$style&nbsp;</span>=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines_styles</span><span class="src-sym">[</span><span class="src-var">$line</span><span class="src-sym">]</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4386"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}&nbsp;</span><span class="src-key">else&nbsp;</span><span class="src-sym">{&nbsp;</span><span class="src-comm">//&nbsp;if&nbsp;no&nbsp;&quot;extra&quot;&nbsp;style&nbsp;assigned</span></div></li>
+<li><div class="src-line"><a name="a4387"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$style&nbsp;</span>=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">highlight_extra_lines_style</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4388"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4389"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4390"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return&nbsp;</span><span class="src-var">$style</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4391"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4392"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4393"></a>&nbsp;&nbsp;&nbsp;&nbsp;/**</div></li>
+<li><div class="src-line"><a name="a4394"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;this&nbsp;functions&nbsp;creates&nbsp;an&nbsp;optimized&nbsp;regular&nbsp;expression&nbsp;list</div></li>
+<li><div class="src-line"><a name="a4395"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;of&nbsp;an&nbsp;array&nbsp;of&nbsp;strings.</div></li>
+<li><div class="src-line"><a name="a4396"></a>&nbsp;&nbsp;&nbsp;&nbsp;*</div></li>
+<li><div class="src-line"><a name="a4397"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Example:</div></li>
+<li><div class="src-line"><a name="a4398"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;code&gt;$list&nbsp;=&nbsp;array('faa',&nbsp;'foo',&nbsp;'foobar');</div></li>
+<li><div class="src-line"><a name="a4399"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;string&nbsp;'f(aa|oo(bar)?)'&lt;/code&gt;</div></li>
+<li><div class="src-line"><a name="a4400"></a>&nbsp;&nbsp;&nbsp;&nbsp;*</div></li>
+<li><div class="src-line"><a name="a4401"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;$list&nbsp;array&nbsp;of&nbsp;(unquoted)&nbsp;strings</div></li>
+<li><div class="src-line"><a name="a4402"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;$regexp_delimiter&nbsp;your&nbsp;regular&nbsp;expression&nbsp;delimiter,&nbsp;@see&nbsp;preg_quote()</div></li>
+<li><div class="src-line"><a name="a4403"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;for&nbsp;regular&nbsp;expression</div></li>
+<li><div class="src-line"><a name="a4404"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@author&nbsp;Milian&nbsp;Wolff&nbsp;&lt;mail@milianw.de&gt;</div></li>
+<li><div class="src-line"><a name="a4405"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;1.0.8</div></li>
+<li><div class="src-line"><a name="a4406"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;private</div></li>
+<li><div class="src-line"><a name="a4407"></a>&nbsp;&nbsp;&nbsp;&nbsp;*/</div></li>
+<li><div class="src-line"><a name="a4408"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function&nbsp;</span><span class="src-id">optimize_regexp_list</span><span class="src-sym">(</span><span class="src-var">$list</span><span class="src-sym">,&nbsp;</span><span class="src-var">$regexp_delimiter&nbsp;</span>=&nbsp;<span class="src-str">'/'</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4409"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$regex_chars&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">'.'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'\\'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'+'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'*'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'?'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'['</span><span class="src-sym">,&nbsp;</span><span class="src-str">'^'</span><span class="src-sym">,&nbsp;</span><span class="src-str">']'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'$'</span><span class="src-sym">,</span></div></li>
+<li><div class="src-line"><a name="a4410"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-str">'('</span><span class="src-sym">,&nbsp;</span><span class="src-str">')'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'{'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'}'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'='</span><span class="src-sym">,&nbsp;</span><span class="src-str">'!'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'&lt;'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'&gt;'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'|'</span><span class="src-sym">,&nbsp;</span><span class="src-str">':'</span><span class="src-sym">,&nbsp;</span><span class="src-var">$regexp_delimiter</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4411"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/sort">sort</a><span class="src-sym">(</span><span class="src-var">$list</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4412"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$regexp_list&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">''</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4413"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$num_subpatterns&nbsp;</span>=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4414"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$list_key&nbsp;</span>=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4415"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4416"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;the&nbsp;tokens&nbsp;which&nbsp;we&nbsp;will&nbsp;use&nbsp;to&nbsp;generate&nbsp;the&nbsp;regexp&nbsp;list</span></div></li>
+<li><div class="src-line"><a name="a4417"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$tokens&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4418"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$prev_keys&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4419"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;go&nbsp;through&nbsp;all&nbsp;entries&nbsp;of&nbsp;the&nbsp;list&nbsp;and&nbsp;generate&nbsp;the&nbsp;token&nbsp;list</span></div></li>
+<li><div class="src-line"><a name="a4420"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$cur_len&nbsp;</span>=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4421"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">for&nbsp;</span><span class="src-sym">(</span><span class="src-var">$i&nbsp;</span>=&nbsp;<span class="src-num">0</span><span class="src-sym">,&nbsp;</span><span class="src-var">$i_max&nbsp;</span>=&nbsp;<a href="http://www.php.net/count">count</a><span class="src-sym">(</span><span class="src-var">$list</span><span class="src-sym">)</span><span class="src-sym">;&nbsp;</span><span class="src-var">$i&nbsp;</span>&lt;&nbsp;<span class="src-var">$i_max</span><span class="src-sym">;&nbsp;</span>++<span class="src-var">$i</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4422"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$cur_len&nbsp;</span>&gt;&nbsp;<span class="src-id">GESHI_MAX_PCRE_LENGTH</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4423"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;seems&nbsp;like&nbsp;the&nbsp;length&nbsp;of&nbsp;this&nbsp;pcre&nbsp;is&nbsp;growing&nbsp;exorbitantly</span></div></li>
+<li><div class="src-line"><a name="a4424"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$regexp_list</span><span class="src-sym">[</span>++<span class="src-var">$list_key</span><span class="src-sym">]&nbsp;</span>=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_optimize_regexp_list_tokens_to_string</span><span class="src-sym">(</span><span class="src-var">$tokens</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4425"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$num_subpatterns&nbsp;</span>=&nbsp;<a href="http://www.php.net/substr_count">substr_count</a><span class="src-sym">(</span><span class="src-var">$regexp_list</span><span class="src-sym">[</span><span class="src-var">$list_key</span><span class="src-sym">]</span><span class="src-sym">,&nbsp;</span><span class="src-str">'(?:'</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4426"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$tokens&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4427"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$cur_len&nbsp;</span>=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4428"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4429"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$level&nbsp;</span>=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4430"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$entry&nbsp;</span>=&nbsp;<a href="http://www.php.net/preg_quote">preg_quote</a><span class="src-sym">(</span>(string)&nbsp;<span class="src-var">$list</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">,&nbsp;</span><span class="src-var">$regexp_delimiter</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4431"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$pointer&nbsp;</span>=&nbsp;<span class="src-sym">&amp;</span><span class="src-var">$tokens</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4432"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;properly&nbsp;assign&nbsp;the&nbsp;new&nbsp;entry&nbsp;to&nbsp;the&nbsp;correct&nbsp;position&nbsp;in&nbsp;the&nbsp;token&nbsp;array</span></div></li>
+<li><div class="src-line"><a name="a4433"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;possibly&nbsp;generate&nbsp;smaller&nbsp;common&nbsp;denominator&nbsp;keys</span></div></li>
+<li><div class="src-line"><a name="a4434"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">while&nbsp;</span><span class="src-sym">(</span><span class="src-id">true</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4435"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;get&nbsp;the&nbsp;common&nbsp;denominator</span></div></li>
+<li><div class="src-line"><a name="a4436"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$prev_keys</span><span class="src-sym">[</span><span class="src-var">$level</span><span class="src-sym">]</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4437"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$prev_keys</span><span class="src-sym">[</span><span class="src-var">$level</span><span class="src-sym">]&nbsp;</span>==&nbsp;<span class="src-var">$entry</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4438"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;this&nbsp;is&nbsp;a&nbsp;duplicate&nbsp;entry,&nbsp;skip&nbsp;it</span></div></li>
+<li><div class="src-line"><a name="a4439"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue&nbsp;</span><span class="src-num">2</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4440"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4441"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$char&nbsp;</span>=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4442"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">while&nbsp;</span><span class="src-sym">(</span>isset<span class="src-sym">(</span><span class="src-var">$entry</span><span class="src-sym">[</span><span class="src-var">$char</span><span class="src-sym">]</span><span class="src-sym">)&nbsp;</span>&amp;&amp;&nbsp;isset<span class="src-sym">(</span><span class="src-var">$prev_keys</span><span class="src-sym">[</span><span class="src-var">$level</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$char</span><span class="src-sym">]</span><span class="src-sym">)</span></div></li>
+<li><div class="src-line"><a name="a4443"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;<span class="src-var">$entry</span><span class="src-sym">[</span><span class="src-var">$char</span><span class="src-sym">]&nbsp;</span>==&nbsp;<span class="src-var">$prev_keys</span><span class="src-sym">[</span><span class="src-var">$level</span><span class="src-sym">]</span><span class="src-sym">[</span><span class="src-var">$char</span><span class="src-sym">]</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4444"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++<span class="src-var">$char</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4445"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4446"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$char&nbsp;</span>&gt;&nbsp;<span class="src-num">0</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4447"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;this&nbsp;entry&nbsp;has&nbsp;at&nbsp;least&nbsp;some&nbsp;chars&nbsp;in&nbsp;common&nbsp;with&nbsp;the&nbsp;current&nbsp;key</span></div></li>
+<li><div class="src-line"><a name="a4448"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$char&nbsp;</span>==&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$prev_keys</span><span class="src-sym">[</span><span class="src-var">$level</span><span class="src-sym">]</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4449"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;current&nbsp;key&nbsp;is&nbsp;totally&nbsp;matched,&nbsp;i.e.&nbsp;this&nbsp;entry&nbsp;has&nbsp;just&nbsp;some&nbsp;bits&nbsp;appended</span></div></li>
+<li><div class="src-line"><a name="a4450"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$pointer&nbsp;</span>=&nbsp;<span class="src-sym">&amp;</span><span class="src-var">$pointer</span><span class="src-sym">[</span><span class="src-var">$prev_keys</span><span class="src-sym">[</span><span class="src-var">$level</span><span class="src-sym">]]</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4451"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}&nbsp;</span><span class="src-key">else&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4452"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;only&nbsp;part&nbsp;of&nbsp;the&nbsp;keys&nbsp;match</span></div></li>
+<li><div class="src-line"><a name="a4453"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$new_key_part1&nbsp;</span>=&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$prev_keys</span><span class="src-sym">[</span><span class="src-var">$level</span><span class="src-sym">]</span><span class="src-sym">,&nbsp;</span><span class="src-num">0</span><span class="src-sym">,&nbsp;</span><span class="src-var">$char</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4454"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$new_key_part2&nbsp;</span>=&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$prev_keys</span><span class="src-sym">[</span><span class="src-var">$level</span><span class="src-sym">]</span><span class="src-sym">,&nbsp;</span><span class="src-var">$char</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4455"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4456"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><a href="http://www.php.net/in_array">in_array</a><span class="src-sym">(</span><span class="src-var">$new_key_part1</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">,&nbsp;</span><span class="src-var">$regex_chars</span><span class="src-sym">)</span></div></li>
+<li><div class="src-line"><a name="a4457"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;<a href="http://www.php.net/in_array">in_array</a><span class="src-sym">(</span><span class="src-var">$new_key_part2</span><span class="src-sym">[</span><span class="src-num">0</span><span class="src-sym">]</span><span class="src-sym">,&nbsp;</span><span class="src-var">$regex_chars</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4458"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;this&nbsp;is&nbsp;bad,&nbsp;a&nbsp;regex&nbsp;char&nbsp;as&nbsp;first&nbsp;character</span></div></li>
+<li><div class="src-line"><a name="a4459"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$pointer</span><span class="src-sym">[</span><span class="src-var">$entry</span><span class="src-sym">]&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">''&nbsp;</span>=&gt;&nbsp;<span class="src-id">true</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4460"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/array_splice">array_splice</a><span class="src-sym">(</span><span class="src-var">$prev_keys</span><span class="src-sym">,&nbsp;</span><span class="src-var">$level</span><span class="src-sym">,&nbsp;</span><a href="http://www.php.net/count">count</a><span class="src-sym">(</span><span class="src-var">$prev_keys</span><span class="src-sym">)</span><span class="src-sym">,&nbsp;</span><span class="src-var">$entry</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4461"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$cur_len&nbsp;</span>+=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$entry</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4462"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4463"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}&nbsp;</span><span class="src-key">else&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4464"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;relocate&nbsp;previous&nbsp;tokens</span></div></li>
+<li><div class="src-line"><a name="a4465"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$pointer</span><span class="src-sym">[</span><span class="src-var">$new_key_part1</span><span class="src-sym">]&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-var">$new_key_part2&nbsp;</span>=&gt;&nbsp;<span class="src-var">$pointer</span><span class="src-sym">[</span><span class="src-var">$prev_keys</span><span class="src-sym">[</span><span class="src-var">$level</span><span class="src-sym">]]</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4466"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$pointer</span><span class="src-sym">[</span><span class="src-var">$prev_keys</span><span class="src-sym">[</span><span class="src-var">$level</span><span class="src-sym">]]</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4467"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$pointer&nbsp;</span>=&nbsp;<span class="src-sym">&amp;</span><span class="src-var">$pointer</span><span class="src-sym">[</span><span class="src-var">$new_key_part1</span><span class="src-sym">]</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4468"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;recreate&nbsp;key&nbsp;index</span></div></li>
+<li><div class="src-line"><a name="a4469"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/array_splice">array_splice</a><span class="src-sym">(</span><span class="src-var">$prev_keys</span><span class="src-sym">,&nbsp;</span><span class="src-var">$level</span><span class="src-sym">,&nbsp;</span><a href="http://www.php.net/count">count</a><span class="src-sym">(</span><span class="src-var">$prev_keys</span><span class="src-sym">)</span><span class="src-sym">,&nbsp;</span><span class="src-key">array</span><span class="src-sym">(</span><span class="src-var">$new_key_part1</span><span class="src-sym">,&nbsp;</span><span class="src-var">$new_key_part2</span><span class="src-sym">))</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4470"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$cur_len&nbsp;</span>+=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$new_key_part2</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4471"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4472"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4473"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++<span class="src-var">$level</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4474"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$entry&nbsp;</span>=&nbsp;<a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$entry</span><span class="src-sym">,&nbsp;</span><span class="src-var">$char</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4475"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">continue</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4476"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4477"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;else:&nbsp;fall&nbsp;trough,&nbsp;i.e.&nbsp;no&nbsp;common&nbsp;denominator&nbsp;was&nbsp;found</span></div></li>
+<li><div class="src-line"><a name="a4478"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4479"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$level&nbsp;</span>==&nbsp;<span class="src-num">0&nbsp;</span>&amp;&amp;&nbsp;<span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$tokens</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4480"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;we&nbsp;can&nbsp;dump&nbsp;current&nbsp;tokens&nbsp;into&nbsp;the&nbsp;string&nbsp;and&nbsp;throw&nbsp;them&nbsp;away&nbsp;afterwards</span></div></li>
+<li><div class="src-line"><a name="a4481"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$new_entry&nbsp;</span>=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_optimize_regexp_list_tokens_to_string</span><span class="src-sym">(</span><span class="src-var">$tokens</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4482"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$new_subpatterns&nbsp;</span>=&nbsp;<a href="http://www.php.net/substr_count">substr_count</a><span class="src-sym">(</span><span class="src-var">$new_entry</span><span class="src-sym">,&nbsp;</span><span class="src-str">'(?:'</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4483"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-id">GESHI_MAX_PCRE_SUBPATTERNS&nbsp;</span>&amp;&amp;&nbsp;<span class="src-var">$num_subpatterns&nbsp;</span>+&nbsp;<span class="src-var">$new_subpatterns&nbsp;</span>&gt;&nbsp;<span class="src-id">GESHI_MAX_PCRE_SUBPATTERNS</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4484"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$regexp_list</span><span class="src-sym">[</span>++<span class="src-var">$list_key</span><span class="src-sym">]&nbsp;</span>=&nbsp;<span class="src-var">$new_entry</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4485"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$num_subpatterns&nbsp;</span>=&nbsp;<span class="src-var">$new_subpatterns</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4486"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}&nbsp;</span><span class="src-key">else&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4487"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$regexp_list</span><span class="src-sym">[</span><span class="src-var">$list_key</span><span class="src-sym">]</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4488"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$new_entry&nbsp;</span>=&nbsp;<span class="src-str">'|'&nbsp;</span>.&nbsp;<span class="src-var">$new_entry</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4489"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4490"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$regexp_list</span><span class="src-sym">[</span><span class="src-var">$list_key</span><span class="src-sym">]&nbsp;</span>.=&nbsp;<span class="src-var">$new_entry</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4491"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$num_subpatterns&nbsp;</span>+=&nbsp;<span class="src-var">$new_subpatterns</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4492"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4493"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$tokens&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4494"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$cur_len&nbsp;</span>=&nbsp;<span class="src-num">0</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4495"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4496"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;no&nbsp;further&nbsp;common&nbsp;denominator&nbsp;found</span></div></li>
+<li><div class="src-line"><a name="a4497"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$pointer</span><span class="src-sym">[</span><span class="src-var">$entry</span><span class="src-sym">]&nbsp;</span>=&nbsp;<span class="src-key">array</span><span class="src-sym">(</span><span class="src-str">''&nbsp;</span>=&gt;&nbsp;<span class="src-id">true</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4498"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.php.net/array_splice">array_splice</a><span class="src-sym">(</span><span class="src-var">$prev_keys</span><span class="src-sym">,&nbsp;</span><span class="src-var">$level</span><span class="src-sym">,&nbsp;</span><a href="http://www.php.net/count">count</a><span class="src-sym">(</span><span class="src-var">$prev_keys</span><span class="src-sym">)</span><span class="src-sym">,&nbsp;</span><span class="src-var">$entry</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4499"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4500"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$cur_len&nbsp;</span>+=&nbsp;<a href="http://www.php.net/strlen">strlen</a><span class="src-sym">(</span><span class="src-var">$entry</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4501"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">break</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4502"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4503"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$list</span><span class="src-sym">[</span><span class="src-var">$i</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4504"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4505"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;make&nbsp;sure&nbsp;the&nbsp;last&nbsp;tokens&nbsp;get&nbsp;converted&nbsp;as&nbsp;well</span></div></li>
+<li><div class="src-line"><a name="a4506"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$new_entry&nbsp;</span>=&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_optimize_regexp_list_tokens_to_string</span><span class="src-sym">(</span><span class="src-var">$tokens</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4507"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-id">GESHI_MAX_PCRE_SUBPATTERNS&nbsp;</span>&amp;&amp;&nbsp;<span class="src-var">$num_subpatterns&nbsp;</span>+&nbsp;<a href="http://www.php.net/substr_count">substr_count</a><span class="src-sym">(</span><span class="src-var">$new_entry</span><span class="src-sym">,&nbsp;</span><span class="src-str">'(?:'</span><span class="src-sym">)&nbsp;</span>&gt;&nbsp;<span class="src-id">GESHI_MAX_PCRE_SUBPATTERNS</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4508"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$regexp_list</span><span class="src-sym">[</span>++<span class="src-var">$list_key</span><span class="src-sym">]&nbsp;</span>=&nbsp;<span class="src-var">$new_entry</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4509"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}&nbsp;</span><span class="src-key">else&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4510"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$regexp_list</span><span class="src-sym">[</span><span class="src-var">$list_key</span><span class="src-sym">]</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4511"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$new_entry&nbsp;</span>=&nbsp;<span class="src-str">'|'&nbsp;</span>.&nbsp;<span class="src-var">$new_entry</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4512"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4513"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$regexp_list</span><span class="src-sym">[</span><span class="src-var">$list_key</span><span class="src-sym">]&nbsp;</span>.=&nbsp;<span class="src-var">$new_entry</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4514"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4515"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return&nbsp;</span><span class="src-var">$regexp_list</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4516"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4517"></a>&nbsp;&nbsp;&nbsp;&nbsp;/**</div></li>
+<li><div class="src-line"><a name="a4518"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;this&nbsp;function&nbsp;creates&nbsp;the&nbsp;appropriate&nbsp;regexp&nbsp;string&nbsp;of&nbsp;an&nbsp;token&nbsp;array</div></li>
+<li><div class="src-line"><a name="a4519"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;you&nbsp;should&nbsp;not&nbsp;call&nbsp;this&nbsp;function&nbsp;directly,&nbsp;@see&nbsp;$this-&gt;optimize_regexp_list().</div></li>
+<li><div class="src-line"><a name="a4520"></a>&nbsp;&nbsp;&nbsp;&nbsp;*</div></li>
+<li><div class="src-line"><a name="a4521"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;&amp;$tokens&nbsp;array&nbsp;of&nbsp;tokens</div></li>
+<li><div class="src-line"><a name="a4522"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;$recursed&nbsp;bool&nbsp;to&nbsp;know&nbsp;wether&nbsp;we&nbsp;recursed&nbsp;or&nbsp;not</div></li>
+<li><div class="src-line"><a name="a4523"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string</div></li>
+<li><div class="src-line"><a name="a4524"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@author&nbsp;Milian&nbsp;Wolff&nbsp;&lt;mail@milianw.de&gt;</div></li>
+<li><div class="src-line"><a name="a4525"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;1.0.8</div></li>
+<li><div class="src-line"><a name="a4526"></a>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@access&nbsp;private</div></li>
+<li><div class="src-line"><a name="a4527"></a>&nbsp;&nbsp;&nbsp;&nbsp;*/</div></li>
+<li><div class="src-line"><a name="a4528"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function&nbsp;</span><span class="src-id">_optimize_regexp_list_tokens_to_string</span><span class="src-sym">(</span><span class="src-sym">&amp;</span><span class="src-var">$tokens</span><span class="src-sym">,&nbsp;</span><span class="src-var">$recursed&nbsp;</span>=&nbsp;<span class="src-id">false</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4529"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$list&nbsp;</span>=&nbsp;<span class="src-str">''</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4530"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">foreach&nbsp;</span><span class="src-sym">(</span><span class="src-var">$tokens&nbsp;</span><span class="src-key">as&nbsp;</span><span class="src-var">$token&nbsp;</span>=&gt;&nbsp;<span class="src-var">$sub_tokens</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4531"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$list&nbsp;</span>.=&nbsp;<span class="src-var">$token</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4532"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$close_entry&nbsp;</span>=&nbsp;isset<span class="src-sym">(</span><span class="src-var">$sub_tokens</span><span class="src-sym">[</span><span class="src-str">''</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4533"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset<span class="src-sym">(</span><span class="src-var">$sub_tokens</span><span class="src-sym">[</span><span class="src-str">''</span><span class="src-sym">]</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4534"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-sym">!</span><span class="src-key">empty</span><span class="src-sym">(</span><span class="src-var">$sub_tokens</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4535"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$list&nbsp;</span>.=&nbsp;<span class="src-str">'(?:'&nbsp;</span>.&nbsp;<span class="src-var">$this</span><span class="src-sym">-&gt;</span><span class="src-id">_optimize_regexp_list_tokens_to_string</span><span class="src-sym">(</span><span class="src-var">$sub_tokens</span><span class="src-sym">,&nbsp;</span><span class="src-id">true</span><span class="src-sym">)&nbsp;</span>.&nbsp;<span class="src-str">')'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4536"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$close_entry</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4537"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;make&nbsp;sub_tokens&nbsp;optional</span></div></li>
+<li><div class="src-line"><a name="a4538"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$list&nbsp;</span>.=&nbsp;<span class="src-str">'?'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4539"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4540"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4541"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$list&nbsp;</span>.=&nbsp;<span class="src-str">'|'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4542"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4543"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-sym">!</span><span class="src-var">$recursed</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4544"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;do&nbsp;some&nbsp;optimizations</span></div></li>
+<li><div class="src-line"><a name="a4545"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;common&nbsp;trailing&nbsp;strings</span></div></li>
+<li><div class="src-line"><a name="a4546"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;BUGGY!</span></div></li>
+<li><div class="src-line"><a name="a4547"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//$list&nbsp;=&nbsp;preg_replace_callback('#(?&lt;=^|\:|\|)\w+?(\w+)(?:\|.+\1)+(?=\|)#',&nbsp;create_function(</span></div></li>
+<li><div class="src-line"><a name="a4548"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;&nbsp;&nbsp;&nbsp;'$matches',&nbsp;'return&nbsp;&quot;(?:&quot;&nbsp;.&nbsp;preg_replace(&quot;#&quot;&nbsp;.&nbsp;preg_quote($matches[1],&nbsp;&quot;#&quot;)&nbsp;.&nbsp;&quot;(?=\||$)#&quot;,&nbsp;&quot;&quot;,&nbsp;$matches[0])&nbsp;.&nbsp;&quot;)&quot;&nbsp;.&nbsp;$matches[1];'),&nbsp;$list);</span></div></li>
+<li><div class="src-line"><a name="a4549"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;(?:p)?&nbsp;=&gt;&nbsp;p?</span></div></li>
+<li><div class="src-line"><a name="a4550"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$list&nbsp;</span>=&nbsp;<a href="http://www.php.net/preg_replace">preg_replace</a><span class="src-sym">(</span><span class="src-str">'#\(\?\:(.)\)\?#'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'\1?'</span><span class="src-sym">,&nbsp;</span><span class="src-var">$list</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4551"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;(?:a|b|c|d|...)?&nbsp;=&gt;&nbsp;[abcd...]?</span></div></li>
+<li><div class="src-line"><a name="a4552"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;TODO:&nbsp;a|bb|c&nbsp;=&gt;&nbsp;[ac]|bb</span></div></li>
+<li><div class="src-line"><a name="a4553"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">static&nbsp;</span><span class="src-var">$callback_2</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4554"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-sym">!</span>isset<span class="src-sym">(</span><span class="src-var">$callback_2</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4555"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$callback_2&nbsp;</span>=&nbsp;<a href="http://www.php.net/create_function">create_function</a><span class="src-sym">(</span><span class="src-str">'$matches'</span><span class="src-sym">,&nbsp;</span><span class="src-str">'return&nbsp;&quot;[&quot;&nbsp;.&nbsp;str_replace(&quot;|&quot;,&nbsp;&quot;&quot;,&nbsp;$matches[1])&nbsp;.&nbsp;&quot;]&quot;;'</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4556"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4557"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$list&nbsp;</span>=&nbsp;<a href="http://www.php.net/preg_replace_callback">preg_replace_callback</a><span class="src-sym">(</span><span class="src-str">'#\(\?\:((?:.\|)+.)\)#'</span><span class="src-sym">,&nbsp;</span><span class="src-var">$callback_2</span><span class="src-sym">,&nbsp;</span><span class="src-var">$list</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4558"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4559"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-comm">//&nbsp;return&nbsp;$list&nbsp;without&nbsp;trailing&nbsp;pipe</span></div></li>
+<li><div class="src-line"><a name="a4560"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return&nbsp;</span><a href="http://www.php.net/substr">substr</a><span class="src-sym">(</span><span class="src-var">$list</span><span class="src-sym">,&nbsp;</span><span class="src-num">0</span><span class="src-sym">,&nbsp;</span>-<span class="src-num">1</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4561"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4562"></a><span class="src-sym">}&nbsp;</span><span class="src-comm">//&nbsp;End&nbsp;Class&nbsp;GeSHi</span></div></li>
+<li><div class="src-line"><a name="a4563"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4564"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4565"></a><span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-sym">!</span><a href="http://www.php.net/function_exists">function_exists</a><span class="src-sym">(</span><span class="src-str">'geshi_highlight'</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4566"></a>&nbsp;&nbsp;&nbsp;&nbsp;/**</div></li>
+<li><div class="src-line"><a name="a4567"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Easy&nbsp;way&nbsp;to&nbsp;highlight&nbsp;stuff.&nbsp;Behaves&nbsp;just&nbsp;like&nbsp;highlight_string</div></li>
+<li><div class="src-line"><a name="a4568"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</div></li>
+<li><div class="src-line"><a name="a4569"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;string&nbsp;The&nbsp;code&nbsp;to&nbsp;highlight</div></li>
+<li><div class="src-line"><a name="a4570"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;string&nbsp;The&nbsp;language&nbsp;to&nbsp;highlight&nbsp;the&nbsp;code&nbsp;in</div></li>
+<li><div class="src-line"><a name="a4571"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;string&nbsp;The&nbsp;path&nbsp;to&nbsp;the&nbsp;language&nbsp;files.&nbsp;You&nbsp;can&nbsp;leave&nbsp;this&nbsp;blank&nbsp;if&nbsp;you&nbsp;need</div></li>
+<li><div class="src-line"><a name="a4572"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;as&nbsp;from&nbsp;version&nbsp;1.0.7&nbsp;the&nbsp;path&nbsp;should&nbsp;be&nbsp;automatically&nbsp;detected</div></li>
+<li><div class="src-line"><a name="a4573"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;boolean&nbsp;Whether&nbsp;to&nbsp;return&nbsp;the&nbsp;result&nbsp;or&nbsp;to&nbsp;echo</div></li>
+<li><div class="src-line"><a name="a4574"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;string&nbsp;The&nbsp;code&nbsp;highlighted&nbsp;(if&nbsp;$return&nbsp;is&nbsp;true)</div></li>
+<li><div class="src-line"><a name="a4575"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@since&nbsp;1.0.2</div></li>
+<li><div class="src-line"><a name="a4576"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</div></li>
+<li><div class="src-line"><a name="a4577"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">function&nbsp;</span><a href="../geshi/core/_geshi.php.html#functiongeshi_highlight">geshi_highlight</a><span class="src-sym">(</span><span class="src-var">$string</span><span class="src-sym">,&nbsp;</span><span class="src-var">$language</span><span class="src-sym">,&nbsp;</span><span class="src-var">$path&nbsp;</span>=&nbsp;<span class="src-id">null</span><span class="src-sym">,&nbsp;</span><span class="src-var">$return&nbsp;</span>=&nbsp;<span class="src-id">false</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4578"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$geshi&nbsp;</span>=&nbsp;<span class="src-key">new&nbsp;</span><a href="../geshi/core/GeSHi.html#methodGeSHi">GeSHi</a><span class="src-sym">(</span><span class="src-var">$string</span><span class="src-sym">,&nbsp;</span><span class="src-var">$language</span><span class="src-sym">,&nbsp;</span><span class="src-var">$path</span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4579"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-var">$geshi</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodset_header_type">set_header_type</a><span class="src-sym">(</span><span class="src-id"><a href="../geshi/core/_geshi.php.html#defineGESHI_HEADER_NONE">GESHI_HEADER_NONE</a></span><span class="src-sym">)</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4580"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4581"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$return</span><span class="src-sym">)&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4582"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return&nbsp;</span><span class="src-str">'&lt;code&gt;'&nbsp;</span>.&nbsp;<span class="src-var">$geshi</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodparse_code">parse_code</a><span class="src-sym">(</span><span class="src-sym">)&nbsp;</span>.&nbsp;<span class="src-str">'&lt;/code&gt;'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4583"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4584"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4585"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;<span class="src-str">'&lt;code&gt;'&nbsp;</span>.&nbsp;<span class="src-var">$geshi</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methodparse_code">parse_code</a><span class="src-sym">(</span><span class="src-sym">)&nbsp;</span>.&nbsp;<span class="src-str">'&lt;/code&gt;'</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4586"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4587"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">if&nbsp;</span><span class="src-sym">(</span><span class="src-var">$geshi</span><span class="src-sym">-&gt;</span><a href="../geshi/core/GeSHi.html#methoderror">error</a><span class="src-sym">(</span><span class="src-sym">))&nbsp;</span><span class="src-sym">{</span></div></li>
+<li><div class="src-line"><a name="a4588"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return&nbsp;</span><span class="src-id">false</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4589"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4590"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-key">return&nbsp;</span><span class="src-id">true</span><span class="src-sym">;</span></div></li>
+<li><div class="src-line"><a name="a4591"></a>&nbsp;&nbsp;&nbsp;&nbsp;<span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4592"></a><span class="src-sym">}</span></div></li>
+<li><div class="src-line"><a name="a4593"></a>&nbsp;</div></li>
+<li><div class="src-line"><a name="a4594"></a><span class="src-php">?&gt;</span></div></li>
+</ol></div>
+</div>
+ <p class="notes" id="credit">
+ Documentation generated on Thu, 25 Dec 2008 14:34:52 +0100 by <a href="http://www.phpdoc.org" target="_blank">phpDocumentor 1.4.2</a>
+ </p>
+ </body>
+</html> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/blank.html b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/blank.html
new file mode 100644
index 00000000..d44ac468
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/blank.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <title>GeSHi 1.0.8</title>
+ <link rel="stylesheet" href="media/stylesheet.css" />
+ <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
+</head>
+<body>
+<div align="center"><h1>GeSHi 1.0.8</h1></div>
+<b>Welcome to geshi!</b><br />
+<br />
+This documentation was generated by <a href="http://www.phpdoc.org">phpDocumentor v1.4.2</a><br />
+</body>
+</html> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/classtrees_geshi.html b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/classtrees_geshi.html
new file mode 100644
index 00000000..e5c3868e
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/classtrees_geshi.html
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <!-- template designed by Marco Von Ballmoos -->
+ <title></title>
+ <link rel="stylesheet" href="media/stylesheet.css" />
+ <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
+ </head>
+ <body>
+
+<!-- Start of Class Data -->
+<H2>
+
+</H2>
+<h2>Root class GeSHi</h2>
+<ul>
+<li><a href="geshi/core/GeSHi.html">GeSHi</a></li></ul>
+
+ <p class="notes" id="credit">
+ Documentation generated on Thu, 25 Dec 2008 14:34:34 +0100 by <a href="http://www.phpdoc.org" target="_blank">phpDocumentor 1.4.2</a>
+ </p>
+ </body>
+</html> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/elementindex.html b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/elementindex.html
new file mode 100644
index 00000000..970ebd19
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/elementindex.html
@@ -0,0 +1,867 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <!-- template designed by Marco Von Ballmoos -->
+ <title></title>
+ <link rel="stylesheet" href="media/stylesheet.css" />
+ <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
+ </head>
+ <body>
+ <a name="top"></a>
+<h2>Full index</h2>
+<h3>Package indexes</h3>
+<ul>
+ <li><a href="elementindex_geshi.html">geshi</a></li>
+</ul>
+<br />
+<div class="index-letter-menu">
+ <a class="index-letter" href="elementindex.html#a">a</a>
+ <a class="index-letter" href="elementindex.html#d">d</a>
+ <a class="index-letter" href="elementindex.html#e">e</a>
+ <a class="index-letter" href="elementindex.html#g">g</a>
+ <a class="index-letter" href="elementindex.html#h">h</a>
+ <a class="index-letter" href="elementindex.html#l">l</a>
+ <a class="index-letter" href="elementindex.html#o">o</a>
+ <a class="index-letter" href="elementindex.html#p">p</a>
+ <a class="index-letter" href="elementindex.html#r">r</a>
+ <a class="index-letter" href="elementindex.html#s">s</a>
+</div>
+
+ <a name="a"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">a</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">add_keyword</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodadd_keyword">GeSHi::add_keyword()</a> in geshi.php</div>
+ <div class="index-item-description">Adds a keyword to a keyword group for highlighting</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">add_keyword_group</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodadd_keyword_group">GeSHi::add_keyword_group()</a> in geshi.php</div>
+ <div class="index-item-description">Creates a new keyword group</div>
+ </dd>
+ </dl>
+ <a name="d"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">d</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">disable_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methoddisable_highlighting">GeSHi::disable_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Disables all highlighting</div>
+ </dd>
+ </dl>
+ <a name="e"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">e</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_classes</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_classes">GeSHi::enable_classes()</a> in geshi.php</div>
+ <div class="index-item-description">Sets whether CSS classes should be used to highlight the source. Default is off, calling this method with no arguments will turn it on</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_highlighting">GeSHi::enable_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Enables all highlighting</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_ids</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_ids">GeSHi::enable_ids()</a> in geshi.php</div>
+ <div class="index-item-description">Whether CSS IDs should be added to each line</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_important_blocks</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_important_blocks">GeSHi::enable_important_blocks()</a> in geshi.php</div>
+ <div class="index-item-description">Sets whether context-important blocks are highlighted</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_inner_code_block</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_inner_code_block">GeSHi::enable_inner_code_block()</a> in geshi.php</div>
+ <div class="index-item-description">Sets whether to force a surrounding block around the highlighted code or not</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_keyword_links</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_keyword_links">GeSHi::enable_keyword_links()</a> in geshi.php</div>
+ <div class="index-item-description">Turns linking of keywords on or off.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_line_numbers</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_line_numbers">GeSHi::enable_line_numbers()</a> in geshi.php</div>
+ <div class="index-item-description">Sets whether line numbers should be displayed.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_multiline_span</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_multiline_span">GeSHi::enable_multiline_span()</a> in geshi.php</div>
+ <div class="index-item-description">Sets wether spans and other HTML markup generated by GeSHi can span over multiple lines or not. Defaults to true to reduce overhead.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_strict_mode</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_strict_mode">GeSHi::enable_strict_mode()</a> in geshi.php</div>
+ <div class="index-item-description">Enables/disables strict highlighting. Default is off, calling this method without parameters will turn it on. See documentation for more details on strict mode and where to use it.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">error</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methoderror">GeSHi::error()</a> in geshi.php</div>
+ <div class="index-item-description">Returns an error message associated with the last GeSHi operation, or false if no error has occured</div>
+ </dd>
+ </dl>
+ <a name="g"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">g</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Constructor.png" alt="Method" title="Method" /></title>
+ <span class="method-title">GeSHi</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodGeSHi">GeSHi::GeSHi()</a> in geshi.php</div>
+ <div class="index-item-description">Creates a new GeSHi object, with source and language</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Class.png" alt="Class" title="Class" /></title>
+ GeSHi
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html">GeSHi</a> in geshi.php</div>
+ <div class="index-item-description">The GeSHi Class.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Page.png" alt="Page" title="Page" /></title>
+ <span class="include-title">geshi.php</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html">geshi.php</a> in geshi.php</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_ACTIVE</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_ACTIVE">GESHI_ACTIVE</a> in geshi.php</div>
+ <div class="index-item-description">Links in the source in the :active state</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_CAPS_LOWER</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_CAPS_LOWER">GESHI_CAPS_LOWER</a> in geshi.php</div>
+ <div class="index-item-description">Leave keywords found as the case that they are</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_CAPS_NO_CHANGE</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_CAPS_NO_CHANGE">GESHI_CAPS_NO_CHANGE</a> in geshi.php</div>
+ <div class="index-item-description">Lowercase keywords found</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_CAPS_UPPER</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_CAPS_UPPER">GESHI_CAPS_UPPER</a> in geshi.php</div>
+ <div class="index-item-description">Uppercase keywords found</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_END_IMPORTANT</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_END_IMPORTANT">GESHI_END_IMPORTANT</a> in geshi.php</div>
+ <div class="index-item-description">The ender for important parts of the source</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_FANCY_LINE_NUMBERS</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_FANCY_LINE_NUMBERS">GESHI_FANCY_LINE_NUMBERS</a> in geshi.php</div>
+ <div class="index-item-description">Use fancy line numbers when building the result</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_HEADER_DIV</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_DIV">GESHI_HEADER_DIV</a> in geshi.php</div>
+ <div class="index-item-description">Use a &quot;div&quot; to surround the source</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_HEADER_NONE</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_NONE">GESHI_HEADER_NONE</a> in geshi.php</div>
+ <div class="index-item-description">Use nothing to surround the source</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_HEADER_PRE</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE">GESHI_HEADER_PRE</a> in geshi.php</div>
+ <div class="index-item-description">Use a &quot;pre&quot; to surround the source</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_HEADER_PRE_TABLE</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_TABLE">GESHI_HEADER_PRE_TABLE</a> in geshi.php</div>
+ <div class="index-item-description">Use a &quot;table&quot; to surround the source:</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_HEADER_PRE_VALID</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_VALID">GESHI_HEADER_PRE_VALID</a> in geshi.php</div>
+ <div class="index-item-description">Use a pre to wrap lines when line numbers are enabled or to wrap the whole code.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Function.png" alt="Function" title="Function" /></title>
+ <span class="method-title">geshi_highlight</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#functiongeshi_highlight">geshi_highlight()</a> in geshi.php</div>
+ <div class="index-item-description">Easy way to highlight stuff. Behaves just like highlight_string</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_HOVER</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HOVER">GESHI_HOVER</a> in geshi.php</div>
+ <div class="index-item-description">Links in the source in the :hover state</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_LANG_ROOT</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_LANG_ROOT">GESHI_LANG_ROOT</a> in geshi.php</div>
+ <div class="index-item-description">The language file directory for GeSHi</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_LINK</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_LINK">GESHI_LINK</a> in geshi.php</div>
+ <div class="index-item-description">Links in the source in the :link state</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_NORMAL_LINE_NUMBERS</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_NORMAL_LINE_NUMBERS">GESHI_NORMAL_LINE_NUMBERS</a> in geshi.php</div>
+ <div class="index-item-description">Use normal line numbers when building the result</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_NO_LINE_NUMBERS</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS">GESHI_NO_LINE_NUMBERS</a> in geshi.php</div>
+ <div class="index-item-description">Use no line numbers when building the result</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_ROOT</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_ROOT">GESHI_ROOT</a> in geshi.php</div>
+ <div class="index-item-description">The root directory for GeSHi</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_SECURITY_PARANOID</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_SECURITY_PARANOID">GESHI_SECURITY_PARANOID</a> in geshi.php</div>
+ <div class="index-item-description">Tells GeSHi to be paranoid about security settings</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_START_IMPORTANT</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_START_IMPORTANT">GESHI_START_IMPORTANT</a> in geshi.php</div>
+ <div class="index-item-description">The starter for important parts of the source</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_VERSION</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_VERSION">GESHI_VERSION</a> in geshi.php</div>
+ <div class="index-item-description">The version of this GeSHi file</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_VISITED</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_VISITED">GESHI_VISITED</a> in geshi.php</div>
+ <div class="index-item-description">Links in the source in the :visited state</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">get_language_name</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_language_name">GeSHi::get_language_name()</a> in geshi.php</div>
+ <div class="index-item-description">Gets a human-readable language name (thanks to Simon Patterson for the idea :))</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">get_language_name_from_extension</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_language_name_from_extension">GeSHi::get_language_name_from_extension()</a> in geshi.php</div>
+ <div class="index-item-description">Given a file extension, this method returns either a valid geshi language name, or the empty string if it couldn't be found</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">get_multiline_span</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_multiline_span">GeSHi::get_multiline_span()</a> in geshi.php</div>
+ <div class="index-item-description">Get current setting for multiline spans, see GeSHi-&gt;enable_multiline_span().</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">get_real_tab_width</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_real_tab_width">GeSHi::get_real_tab_width()</a> in geshi.php</div>
+ <div class="index-item-description">Returns the tab width to use, based on the current language and user preference</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">get_stylesheet</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_stylesheet">GeSHi::get_stylesheet()</a> in geshi.php</div>
+ <div class="index-item-description">Returns a stylesheet for the highlighted code. If $economy mode is true, we only return the stylesheet declarations that matter for this code block instead of the whole thing</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">get_time</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_time">GeSHi::get_time()</a> in geshi.php</div>
+ <div class="index-item-description">Gets the time taken to parse the code</div>
+ </dd>
+ </dl>
+ <a name="h"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">h</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">highlight_lines_extra</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodhighlight_lines_extra">GeSHi::highlight_lines_extra()</a> in geshi.php</div>
+ <div class="index-item-description">Specifies which lines to highlight extra</div>
+ </dd>
+ </dl>
+ <a name="l"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">l</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">load_from_file</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodload_from_file">GeSHi::load_from_file()</a> in geshi.php</div>
+ <div class="index-item-description">Given a file name, this method loads its contents in, and attempts</div>
+ </dd>
+ </dl>
+ <a name="o"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">o</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">optimize_keyword_group</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodoptimize_keyword_group">GeSHi::optimize_keyword_group()</a> in geshi.php</div>
+ <div class="index-item-description">compile optimized regexp list for keyword group</div>
+ </dd>
+ </dl>
+ <a name="p"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">p</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">parse_code</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodparse_code">GeSHi::parse_code()</a> in geshi.php</div>
+ <div class="index-item-description">Returns the code in $this-&gt;source, highlighted and surrounded by the nessecary HTML.</div>
+ </dd>
+ </dl>
+ <a name="r"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">r</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">remove_keyword</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodremove_keyword">GeSHi::remove_keyword()</a> in geshi.php</div>
+ <div class="index-item-description">Removes a keyword from a keyword group</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">remove_keyword_group</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodremove_keyword_group">GeSHi::remove_keyword_group()</a> in geshi.php</div>
+ <div class="index-item-description">Removes a keyword group</div>
+ </dd>
+ </dl>
+ <a name="s"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">s</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_brackets_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_brackets_highlighting">GeSHi::set_brackets_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for brackets</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_brackets_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_brackets_style">GeSHi::set_brackets_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for brackets. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_case_keywords</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_case_keywords">GeSHi::set_case_keywords()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the case that keywords should use when found. Use the constants:</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_case_sensitivity</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_case_sensitivity">GeSHi::set_case_sensitivity()</a> in geshi.php</div>
+ <div class="index-item-description">Sets whether a set of keywords are checked for in a case sensitive manner</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_code_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_code_style">GeSHi::set_code_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the style for the actual code. This should be a string</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_comments_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_comments_highlighting">GeSHi::set_comments_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for comment groups</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_comments_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_comments_style">GeSHi::set_comments_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for comment groups. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_encoding</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_encoding">GeSHi::set_encoding()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the encoding used for htmlspecialchars(), for international support.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_escape_characters_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_escape_characters_highlighting">GeSHi::set_escape_characters_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for escaped characters</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_escape_characters_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_escape_characters_style">GeSHi::set_escape_characters_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for escaped characters. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_footer_content</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_footer_content">GeSHi::set_footer_content()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the content of the footer block</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_footer_content_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_footer_content_style">GeSHi::set_footer_content_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the style for the footer content</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_header_content</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_header_content">GeSHi::set_header_content()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the content of the header block</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_header_content_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_header_content_style">GeSHi::set_header_content_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the style for the header content</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_header_type</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_header_type">GeSHi::set_header_type()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the type of header to be used.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_highlight_lines_extra_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_highlight_lines_extra_style">GeSHi::set_highlight_lines_extra_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the style for extra-highlighted lines</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_important_styles</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_important_styles">GeSHi::set_important_styles()</a> in geshi.php</div>
+ <div class="index-item-description">Sets styles for important parts of the code</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_keyword_group_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_keyword_group_highlighting">GeSHi::set_keyword_group_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for a keyword group</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_keyword_group_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_keyword_group_style">GeSHi::set_keyword_group_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the style for a keyword group. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_language</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_language">GeSHi::set_language()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the language for this object</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_language_path</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_language_path">GeSHi::set_language_path()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the path to the directory containing the language files. Note that this path is relative to the directory of the script that included geshi.php, NOT geshi.php itself.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_line_ending</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_line_ending">GeSHi::set_line_ending()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the line-ending</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_line_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_line_style">GeSHi::set_line_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for the line numbers.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_link_styles</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_link_styles">GeSHi::set_link_styles()</a> in geshi.php</div>
+ <div class="index-item-description">Sets styles for links in code</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_link_target</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_link_target">GeSHi::set_link_target()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the target for links in code</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_methods_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_methods_highlighting">GeSHi::set_methods_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for methods</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_methods_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_methods_style">GeSHi::set_methods_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for methods. $key is a number that references the</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_numbers_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_numbers_highlighting">GeSHi::set_numbers_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for numbers</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_numbers_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_numbers_style">GeSHi::set_numbers_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for numbers. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_overall_class</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_overall_class">GeSHi::set_overall_class()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the overall classname for this block of code. This class can then be used in a stylesheet to style this object's output</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_overall_id</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_overall_id">GeSHi::set_overall_id()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the overall id for this block of code. This id can then be used in a stylesheet to style this object's output</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_overall_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_overall_style">GeSHi::set_overall_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for the code that will be outputted when this object is parsed. The style should be a string of valid stylesheet declarations</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_regexps_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_regexps_highlighting">GeSHi::set_regexps_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for regexps</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_regexps_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_regexps_style">GeSHi::set_regexps_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for regexps. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_source</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_source">GeSHi::set_source()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the source code for this object</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_strings_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_strings_highlighting">GeSHi::set_strings_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for strings</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_strings_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_strings_style">GeSHi::set_strings_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for strings. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_symbols_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_symbols_highlighting">GeSHi::set_symbols_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for symbols</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_symbols_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_symbols_style">GeSHi::set_symbols_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for symbols. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_tab_width</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_tab_width">GeSHi::set_tab_width()</a> in geshi.php</div>
+ <div class="index-item-description">Sets how many spaces a tab is substituted for</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_url_for_keyword_group</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_url_for_keyword_group">GeSHi::set_url_for_keyword_group()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the base URL to be used for keywords</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_use_language_tab_width</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_use_language_tab_width">GeSHi::set_use_language_tab_width()</a> in geshi.php</div>
+ <div class="index-item-description">Sets whether or not to use tab-stop width specifed by language</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">start_line_numbers_at</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodstart_line_numbers_at">GeSHi::start_line_numbers_at()</a> in geshi.php</div>
+ <div class="index-item-description">Sets what number line numbers should start at. Should be a positive integer, and will be converted to one.</div>
+ </dd>
+ </dl>
+
+<div class="index-letter-menu">
+ <a class="index-letter" href="elementindex.html#a">a</a>
+ <a class="index-letter" href="elementindex.html#d">d</a>
+ <a class="index-letter" href="elementindex.html#e">e</a>
+ <a class="index-letter" href="elementindex.html#g">g</a>
+ <a class="index-letter" href="elementindex.html#h">h</a>
+ <a class="index-letter" href="elementindex.html#l">l</a>
+ <a class="index-letter" href="elementindex.html#o">o</a>
+ <a class="index-letter" href="elementindex.html#p">p</a>
+ <a class="index-letter" href="elementindex.html#r">r</a>
+ <a class="index-letter" href="elementindex.html#s">s</a>
+</div> </body>
+</html> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/elementindex_geshi.html b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/elementindex_geshi.html
new file mode 100644
index 00000000..f3193965
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/elementindex_geshi.html
@@ -0,0 +1,864 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <!-- template designed by Marco Von Ballmoos -->
+ <title></title>
+ <link rel="stylesheet" href="media/stylesheet.css" />
+ <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
+ </head>
+ <body>
+ <a name="top"></a>
+<h2>[geshi] element index</h2>
+<a href="elementindex.html">All elements</a>
+<br />
+<div class="index-letter-menu">
+ <a class="index-letter" href="elementindex_geshi.html#a">a</a>
+ <a class="index-letter" href="elementindex_geshi.html#d">d</a>
+ <a class="index-letter" href="elementindex_geshi.html#e">e</a>
+ <a class="index-letter" href="elementindex_geshi.html#g">g</a>
+ <a class="index-letter" href="elementindex_geshi.html#h">h</a>
+ <a class="index-letter" href="elementindex_geshi.html#l">l</a>
+ <a class="index-letter" href="elementindex_geshi.html#o">o</a>
+ <a class="index-letter" href="elementindex_geshi.html#p">p</a>
+ <a class="index-letter" href="elementindex_geshi.html#r">r</a>
+ <a class="index-letter" href="elementindex_geshi.html#s">s</a>
+</div>
+
+ <a name="a"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">a</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">add_keyword</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodadd_keyword">GeSHi::add_keyword()</a> in geshi.php</div>
+ <div class="index-item-description">Adds a keyword to a keyword group for highlighting</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">add_keyword_group</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodadd_keyword_group">GeSHi::add_keyword_group()</a> in geshi.php</div>
+ <div class="index-item-description">Creates a new keyword group</div>
+ </dd>
+ </dl>
+ <a name="d"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">d</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">disable_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methoddisable_highlighting">GeSHi::disable_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Disables all highlighting</div>
+ </dd>
+ </dl>
+ <a name="e"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">e</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_classes</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_classes">GeSHi::enable_classes()</a> in geshi.php</div>
+ <div class="index-item-description">Sets whether CSS classes should be used to highlight the source. Default is off, calling this method with no arguments will turn it on</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_highlighting">GeSHi::enable_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Enables all highlighting</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_ids</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_ids">GeSHi::enable_ids()</a> in geshi.php</div>
+ <div class="index-item-description">Whether CSS IDs should be added to each line</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_important_blocks</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_important_blocks">GeSHi::enable_important_blocks()</a> in geshi.php</div>
+ <div class="index-item-description">Sets whether context-important blocks are highlighted</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_inner_code_block</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_inner_code_block">GeSHi::enable_inner_code_block()</a> in geshi.php</div>
+ <div class="index-item-description">Sets whether to force a surrounding block around the highlighted code or not</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_keyword_links</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_keyword_links">GeSHi::enable_keyword_links()</a> in geshi.php</div>
+ <div class="index-item-description">Turns linking of keywords on or off.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_line_numbers</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_line_numbers">GeSHi::enable_line_numbers()</a> in geshi.php</div>
+ <div class="index-item-description">Sets whether line numbers should be displayed.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_multiline_span</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_multiline_span">GeSHi::enable_multiline_span()</a> in geshi.php</div>
+ <div class="index-item-description">Sets wether spans and other HTML markup generated by GeSHi can span over multiple lines or not. Defaults to true to reduce overhead.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">enable_strict_mode</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_strict_mode">GeSHi::enable_strict_mode()</a> in geshi.php</div>
+ <div class="index-item-description">Enables/disables strict highlighting. Default is off, calling this method without parameters will turn it on. See documentation for more details on strict mode and where to use it.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">error</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methoderror">GeSHi::error()</a> in geshi.php</div>
+ <div class="index-item-description">Returns an error message associated with the last GeSHi operation, or false if no error has occured</div>
+ </dd>
+ </dl>
+ <a name="g"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">g</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Constructor.png" alt="Method" title="Method" /></title>
+ <span class="method-title">GeSHi</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodGeSHi">GeSHi::GeSHi()</a> in geshi.php</div>
+ <div class="index-item-description">Creates a new GeSHi object, with source and language</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Class.png" alt="Class" title="Class" /></title>
+ GeSHi
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html">GeSHi</a> in geshi.php</div>
+ <div class="index-item-description">The GeSHi Class.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Page.png" alt="Page" title="Page" /></title>
+ <span class="include-title">geshi.php</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html">geshi.php</a> in geshi.php</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_ACTIVE</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_ACTIVE">GESHI_ACTIVE</a> in geshi.php</div>
+ <div class="index-item-description">Links in the source in the :active state</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_CAPS_LOWER</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_CAPS_LOWER">GESHI_CAPS_LOWER</a> in geshi.php</div>
+ <div class="index-item-description">Leave keywords found as the case that they are</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_CAPS_NO_CHANGE</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_CAPS_NO_CHANGE">GESHI_CAPS_NO_CHANGE</a> in geshi.php</div>
+ <div class="index-item-description">Lowercase keywords found</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_CAPS_UPPER</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_CAPS_UPPER">GESHI_CAPS_UPPER</a> in geshi.php</div>
+ <div class="index-item-description">Uppercase keywords found</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_END_IMPORTANT</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_END_IMPORTANT">GESHI_END_IMPORTANT</a> in geshi.php</div>
+ <div class="index-item-description">The ender for important parts of the source</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_FANCY_LINE_NUMBERS</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_FANCY_LINE_NUMBERS">GESHI_FANCY_LINE_NUMBERS</a> in geshi.php</div>
+ <div class="index-item-description">Use fancy line numbers when building the result</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_HEADER_DIV</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_DIV">GESHI_HEADER_DIV</a> in geshi.php</div>
+ <div class="index-item-description">Use a &quot;div&quot; to surround the source</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_HEADER_NONE</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_NONE">GESHI_HEADER_NONE</a> in geshi.php</div>
+ <div class="index-item-description">Use nothing to surround the source</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_HEADER_PRE</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE">GESHI_HEADER_PRE</a> in geshi.php</div>
+ <div class="index-item-description">Use a &quot;pre&quot; to surround the source</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_HEADER_PRE_TABLE</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_TABLE">GESHI_HEADER_PRE_TABLE</a> in geshi.php</div>
+ <div class="index-item-description">Use a &quot;table&quot; to surround the source:</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_HEADER_PRE_VALID</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_VALID">GESHI_HEADER_PRE_VALID</a> in geshi.php</div>
+ <div class="index-item-description">Use a pre to wrap lines when line numbers are enabled or to wrap the whole code.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Function.png" alt="Function" title="Function" /></title>
+ <span class="method-title">geshi_highlight</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#functiongeshi_highlight">geshi_highlight()</a> in geshi.php</div>
+ <div class="index-item-description">Easy way to highlight stuff. Behaves just like highlight_string</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_HOVER</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HOVER">GESHI_HOVER</a> in geshi.php</div>
+ <div class="index-item-description">Links in the source in the :hover state</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_LANG_ROOT</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_LANG_ROOT">GESHI_LANG_ROOT</a> in geshi.php</div>
+ <div class="index-item-description">The language file directory for GeSHi</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_LINK</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_LINK">GESHI_LINK</a> in geshi.php</div>
+ <div class="index-item-description">Links in the source in the :link state</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_NORMAL_LINE_NUMBERS</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_NORMAL_LINE_NUMBERS">GESHI_NORMAL_LINE_NUMBERS</a> in geshi.php</div>
+ <div class="index-item-description">Use normal line numbers when building the result</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_NO_LINE_NUMBERS</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS">GESHI_NO_LINE_NUMBERS</a> in geshi.php</div>
+ <div class="index-item-description">Use no line numbers when building the result</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_ROOT</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_ROOT">GESHI_ROOT</a> in geshi.php</div>
+ <div class="index-item-description">The root directory for GeSHi</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_SECURITY_PARANOID</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_SECURITY_PARANOID">GESHI_SECURITY_PARANOID</a> in geshi.php</div>
+ <div class="index-item-description">Tells GeSHi to be paranoid about security settings</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_START_IMPORTANT</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_START_IMPORTANT">GESHI_START_IMPORTANT</a> in geshi.php</div>
+ <div class="index-item-description">The starter for important parts of the source</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_VERSION</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_VERSION">GESHI_VERSION</a> in geshi.php</div>
+ <div class="index-item-description">The version of this GeSHi file</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
+ <span class="const-title">GESHI_VISITED</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_VISITED">GESHI_VISITED</a> in geshi.php</div>
+ <div class="index-item-description">Links in the source in the :visited state</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">get_language_name</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_language_name">GeSHi::get_language_name()</a> in geshi.php</div>
+ <div class="index-item-description">Gets a human-readable language name (thanks to Simon Patterson for the idea :))</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">get_language_name_from_extension</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_language_name_from_extension">GeSHi::get_language_name_from_extension()</a> in geshi.php</div>
+ <div class="index-item-description">Given a file extension, this method returns either a valid geshi language name, or the empty string if it couldn't be found</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">get_multiline_span</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_multiline_span">GeSHi::get_multiline_span()</a> in geshi.php</div>
+ <div class="index-item-description">Get current setting for multiline spans, see GeSHi-&gt;enable_multiline_span().</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">get_real_tab_width</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_real_tab_width">GeSHi::get_real_tab_width()</a> in geshi.php</div>
+ <div class="index-item-description">Returns the tab width to use, based on the current language and user preference</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">get_stylesheet</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_stylesheet">GeSHi::get_stylesheet()</a> in geshi.php</div>
+ <div class="index-item-description">Returns a stylesheet for the highlighted code. If $economy mode is true, we only return the stylesheet declarations that matter for this code block instead of the whole thing</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">get_time</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_time">GeSHi::get_time()</a> in geshi.php</div>
+ <div class="index-item-description">Gets the time taken to parse the code</div>
+ </dd>
+ </dl>
+ <a name="h"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">h</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">highlight_lines_extra</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodhighlight_lines_extra">GeSHi::highlight_lines_extra()</a> in geshi.php</div>
+ <div class="index-item-description">Specifies which lines to highlight extra</div>
+ </dd>
+ </dl>
+ <a name="l"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">l</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">load_from_file</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodload_from_file">GeSHi::load_from_file()</a> in geshi.php</div>
+ <div class="index-item-description">Given a file name, this method loads its contents in, and attempts</div>
+ </dd>
+ </dl>
+ <a name="o"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">o</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">optimize_keyword_group</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodoptimize_keyword_group">GeSHi::optimize_keyword_group()</a> in geshi.php</div>
+ <div class="index-item-description">compile optimized regexp list for keyword group</div>
+ </dd>
+ </dl>
+ <a name="p"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">p</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">parse_code</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodparse_code">GeSHi::parse_code()</a> in geshi.php</div>
+ <div class="index-item-description">Returns the code in $this-&gt;source, highlighted and surrounded by the nessecary HTML.</div>
+ </dd>
+ </dl>
+ <a name="r"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">r</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">remove_keyword</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodremove_keyword">GeSHi::remove_keyword()</a> in geshi.php</div>
+ <div class="index-item-description">Removes a keyword from a keyword group</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">remove_keyword_group</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodremove_keyword_group">GeSHi::remove_keyword_group()</a> in geshi.php</div>
+ <div class="index-item-description">Removes a keyword group</div>
+ </dd>
+ </dl>
+ <a name="s"></a>
+ <div class="index-letter-section">
+ <div style="float: left" class="index-letter-title">s</div>
+ <div style="float: right"><a href="#top">top</a></div>
+ <div style="clear: both"></div>
+ </div>
+ <dl>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_brackets_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_brackets_highlighting">GeSHi::set_brackets_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for brackets</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_brackets_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_brackets_style">GeSHi::set_brackets_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for brackets. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_case_keywords</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_case_keywords">GeSHi::set_case_keywords()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the case that keywords should use when found. Use the constants:</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_case_sensitivity</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_case_sensitivity">GeSHi::set_case_sensitivity()</a> in geshi.php</div>
+ <div class="index-item-description">Sets whether a set of keywords are checked for in a case sensitive manner</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_code_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_code_style">GeSHi::set_code_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the style for the actual code. This should be a string</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_comments_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_comments_highlighting">GeSHi::set_comments_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for comment groups</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_comments_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_comments_style">GeSHi::set_comments_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for comment groups. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_encoding</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_encoding">GeSHi::set_encoding()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the encoding used for htmlspecialchars(), for international support.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_escape_characters_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_escape_characters_highlighting">GeSHi::set_escape_characters_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for escaped characters</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_escape_characters_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_escape_characters_style">GeSHi::set_escape_characters_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for escaped characters. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_footer_content</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_footer_content">GeSHi::set_footer_content()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the content of the footer block</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_footer_content_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_footer_content_style">GeSHi::set_footer_content_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the style for the footer content</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_header_content</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_header_content">GeSHi::set_header_content()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the content of the header block</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_header_content_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_header_content_style">GeSHi::set_header_content_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the style for the header content</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_header_type</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_header_type">GeSHi::set_header_type()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the type of header to be used.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_highlight_lines_extra_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_highlight_lines_extra_style">GeSHi::set_highlight_lines_extra_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the style for extra-highlighted lines</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_important_styles</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_important_styles">GeSHi::set_important_styles()</a> in geshi.php</div>
+ <div class="index-item-description">Sets styles for important parts of the code</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_keyword_group_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_keyword_group_highlighting">GeSHi::set_keyword_group_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for a keyword group</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_keyword_group_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_keyword_group_style">GeSHi::set_keyword_group_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the style for a keyword group. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_language</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_language">GeSHi::set_language()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the language for this object</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_language_path</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_language_path">GeSHi::set_language_path()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the path to the directory containing the language files. Note that this path is relative to the directory of the script that included geshi.php, NOT geshi.php itself.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_line_ending</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_line_ending">GeSHi::set_line_ending()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the line-ending</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_line_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_line_style">GeSHi::set_line_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for the line numbers.</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_link_styles</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_link_styles">GeSHi::set_link_styles()</a> in geshi.php</div>
+ <div class="index-item-description">Sets styles for links in code</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_link_target</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_link_target">GeSHi::set_link_target()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the target for links in code</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_methods_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_methods_highlighting">GeSHi::set_methods_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for methods</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_methods_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_methods_style">GeSHi::set_methods_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for methods. $key is a number that references the</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_numbers_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_numbers_highlighting">GeSHi::set_numbers_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for numbers</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_numbers_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_numbers_style">GeSHi::set_numbers_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for numbers. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_overall_class</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_overall_class">GeSHi::set_overall_class()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the overall classname for this block of code. This class can then be used in a stylesheet to style this object's output</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_overall_id</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_overall_id">GeSHi::set_overall_id()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the overall id for this block of code. This id can then be used in a stylesheet to style this object's output</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_overall_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_overall_style">GeSHi::set_overall_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for the code that will be outputted when this object is parsed. The style should be a string of valid stylesheet declarations</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_regexps_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_regexps_highlighting">GeSHi::set_regexps_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for regexps</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_regexps_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_regexps_style">GeSHi::set_regexps_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for regexps. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_source</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_source">GeSHi::set_source()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the source code for this object</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_strings_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_strings_highlighting">GeSHi::set_strings_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for strings</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_strings_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_strings_style">GeSHi::set_strings_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for strings. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_symbols_highlighting</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_symbols_highlighting">GeSHi::set_symbols_highlighting()</a> in geshi.php</div>
+ <div class="index-item-description">Turns highlighting on/off for symbols</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_symbols_style</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_symbols_style">GeSHi::set_symbols_style()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the styles for symbols. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_tab_width</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_tab_width">GeSHi::set_tab_width()</a> in geshi.php</div>
+ <div class="index-item-description">Sets how many spaces a tab is substituted for</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_url_for_keyword_group</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_url_for_keyword_group">GeSHi::set_url_for_keyword_group()</a> in geshi.php</div>
+ <div class="index-item-description">Sets the base URL to be used for keywords</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">set_use_language_tab_width</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_use_language_tab_width">GeSHi::set_use_language_tab_width()</a> in geshi.php</div>
+ <div class="index-item-description">Sets whether or not to use tab-stop width specifed by language</div>
+ </dd>
+ <dt class="field">
+ <img src="media/images/Method.png" alt="Method" title="Method" /></title>
+ <span class="method-title">start_line_numbers_at</span>
+ </dt>
+ <dd class="index-item-body">
+ <div class="index-item-details"><a href="geshi/core/GeSHi.html#methodstart_line_numbers_at">GeSHi::start_line_numbers_at()</a> in geshi.php</div>
+ <div class="index-item-description">Sets what number line numbers should start at. Should be a positive integer, and will be converted to one.</div>
+ </dd>
+ </dl>
+
+<div class="index-letter-menu">
+ <a class="index-letter" href="elementindex_geshi.html#a">a</a>
+ <a class="index-letter" href="elementindex_geshi.html#d">d</a>
+ <a class="index-letter" href="elementindex_geshi.html#e">e</a>
+ <a class="index-letter" href="elementindex_geshi.html#g">g</a>
+ <a class="index-letter" href="elementindex_geshi.html#h">h</a>
+ <a class="index-letter" href="elementindex_geshi.html#l">l</a>
+ <a class="index-letter" href="elementindex_geshi.html#o">o</a>
+ <a class="index-letter" href="elementindex_geshi.html#p">p</a>
+ <a class="index-letter" href="elementindex_geshi.html#r">r</a>
+ <a class="index-letter" href="elementindex_geshi.html#s">s</a>
+</div> </body>
+</html> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/errors.html b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/errors.html
new file mode 100644
index 00000000..c917f038
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/errors.html
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <!-- template designed by Marco Von Ballmoos -->
+ <title>phpDocumentor Parser Errors and Warnings</title>
+ <link rel="stylesheet" href="media/stylesheet.css" />
+ <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
+ </head>
+ <body>
+ <a href="#Post-parsing">Post-parsing</a><br>
+<a name="geshi.php"></a>
+<h1>geshi.php</h1>
+<h2>Errors:</h2><br>
+<b>Error on line 569</b> - DocBlock has multiple @access tags, illegal. ignoring additional tag "@access private"<br>
+ <p class="notes" id="credit">
+ Documentation generated on Thu, 25 Dec 2008 14:34:53 +0100 by <a href="http://www.phpdoc.org" target="_blank">phpDocumentor 1.4.2</a>
+ </p>
+ </body>
+</html> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/geshi/core/GeSHi.html b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/geshi/core/GeSHi.html
new file mode 100644
index 00000000..a8ccc7d0
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/geshi/core/GeSHi.html
@@ -0,0 +1,2676 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <!-- template designed by Marco Von Ballmoos -->
+ <title>Docs For Class GeSHi</title>
+ <link rel="stylesheet" href="../../media/stylesheet.css" />
+ <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
+ </head>
+ <body>
+ <div class="page-body">
+<h2 class="class-name"><img src="../../media/images/Class_logo.png"
+ alt=" Class"
+ title=" Class"
+ style="vertical-align: middle"> GeSHi</h2>
+
+<a name="sec-description"></a>
+<div class="info-box">
+ <div class="info-box-title">Description</div>
+ <div class="nav-bar">
+ <span class="disabled">Description</span> |
+ <a href="#sec-method-summary">Methods</a> (<a href="#sec-methods">details</a>)
+
+ </div>
+ <div class="info-box-body">
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">The GeSHi Class.</p>
+<p class="description"><p>Please refer to the documentation for GeSHi 1.0.X that is available at http://qbnz.com/highlighter/documentation.php for more information about how to use this class.</p></p>
+ <ul class="tags">
+ <li><span class="field">author:</span> Nigel McNie &lt;<a href="mailto:nigel@geshi.org">nigel@geshi.org</a>&gt;, Benny Baumann &lt;BenBE@omorphia.de&gt;</li>
+ <li><span class="field">copyright:</span> (C) 2004 - 2007 Nigel McNie, (C) 2007 - 2008 Benny Baumann</li>
+ </ul>
+ <p class="notes">
+ Located in <a class="field" href="_geshi.php.html">/geshi.php</a> (line <span class="field"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a253">253</a></span>)
+ </p>
+
+
+ <pre></pre>
+
+ </div>
+</div>
+
+
+
+
+ <a name="sec-method-summary"></a>
+ <div class="info-box">
+ <div class="info-box-title">Method Summary</span></div>
+ <div class="nav-bar">
+ <a href="#sec-description">Description</a> |
+ <span class="disabled">Methods</span> (<a href="#sec-methods">details</a>)
+ </div>
+ <div class="info-box-body">
+ <div class="method-summary">
+ <div class="method-definition">
+ <img src="../../media/images/Constructor.png" alt=" "/>
+ <span class="method-result">GeSHi</span>
+ <a href="#GeSHi" title="details" class="method-name">GeSHi</a>
+ ([<span class="var-type">string</span>&nbsp;<span class="var-name">$source</span> = <span class="var-default">''</span>], [<span class="var-type">string</span>&nbsp;<span class="var-name">$language</span> = <span class="var-default">''</span>], [<span class="var-type">string</span>&nbsp;<span class="var-name">$path</span> = <span class="var-default">''</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#add_keyword" title="details" class="method-name">add_keyword</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$word</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#add_keyword_group" title="details" class="method-name">add_keyword_group</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$styles</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$case_sensitive</span> = <span class="var-default">true</span>], [<span class="var-type">array</span>&nbsp;<span class="var-name">$words</span> = <span class="var-default">array()</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#disable_highlighting" title="details" class="method-name">disable_highlighting</a>
+ ()
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#enable_classes" title="details" class="method-name">enable_classes</a>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span> = <span class="var-default">true</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#enable_highlighting" title="details" class="method-name">enable_highlighting</a>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span> = <span class="var-default">true</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#enable_ids" title="details" class="method-name">enable_ids</a>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span> = <span class="var-default">true</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#enable_important_blocks" title="details" class="method-name">enable_important_blocks</a>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#enable_inner_code_block" title="details" class="method-name">enable_inner_code_block</a>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#enable_keyword_links" title="details" class="method-name">enable_keyword_links</a>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$enable</span> = <span class="var-default">true</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#enable_line_numbers" title="details" class="method-name">enable_line_numbers</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$flag</span>, [<span class="var-type">int</span>&nbsp;<span class="var-name">$nth_row</span> = <span class="var-default">5</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#enable_multiline_span" title="details" class="method-name">enable_multiline_span</a>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#enable_strict_mode" title="details" class="method-name">enable_strict_mode</a>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$mode</span> = <span class="var-default">true</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">string|false</span>
+ <a href="#error" title="details" class="method-name">error</a>
+ ()
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">string</span>
+ <a href="#get_language_name" title="details" class="method-name">get_language_name</a>
+ ()
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#get_language_name_from_extension" title="details" class="method-name">get_language_name_from_extension</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$extension</span>, [<span class="var-type">array</span>&nbsp;<span class="var-name">$lookup</span> = <span class="var-default">array()</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">bool</span>
+ <a href="#get_multiline_span" title="details" class="method-name">get_multiline_span</a>
+ ()
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">int</span>
+ <a href="#get_real_tab_width" title="details" class="method-name">get_real_tab_width</a>
+ ()
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">string</span>
+ <a href="#get_stylesheet" title="details" class="method-name">get_stylesheet</a>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$economy_mode</span> = <span class="var-default">true</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">double</span>
+ <a href="#get_time" title="details" class="method-name">get_time</a>
+ ()
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#highlight_lines_extra" title="details" class="method-name">highlight_lines_extra</a>
+ (<span class="var-type">mixed</span>&nbsp;<span class="var-name">$lines</span>, [<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span> = <span class="var-default">null</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#load_from_file" title="details" class="method-name">load_from_file</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$file_name</span>, [<span class="var-type">array</span>&nbsp;<span class="var-name">$lookup</span> = <span class="var-default">array()</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#optimize_keyword_group" title="details" class="method-name">optimize_keyword_group</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#parse_code" title="details" class="method-name">parse_code</a>
+ ()
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#remove_keyword" title="details" class="method-name">remove_keyword</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$word</span>, [<span class="var-type">bool</span>&nbsp;<span class="var-name">$recompile</span> = <span class="var-default">true</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#remove_keyword_group" title="details" class="method-name">remove_keyword_group</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_brackets_highlighting" title="details" class="method-name">set_brackets_highlighting</a>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_brackets_style" title="details" class="method-name">set_brackets_style</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_case_keywords" title="details" class="method-name">set_case_keywords</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$case</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_case_sensitivity" title="details" class="method-name">set_case_sensitivity</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">boolean</span>&nbsp;<span class="var-name">$case</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_code_style" title="details" class="method-name">set_code_style</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_comments_highlighting" title="details" class="method-name">set_comments_highlighting</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span> = <span class="var-default">true</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_comments_style" title="details" class="method-name">set_comments_style</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_encoding" title="details" class="method-name">set_encoding</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$encoding</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_escape_characters_highlighting" title="details" class="method-name">set_escape_characters_highlighting</a>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span> = <span class="var-default">true</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_escape_characters_style" title="details" class="method-name">set_escape_characters_style</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_footer_content" title="details" class="method-name">set_footer_content</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$content</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_footer_content_style" title="details" class="method-name">set_footer_content_style</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_header_content" title="details" class="method-name">set_header_content</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$content</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_header_content_style" title="details" class="method-name">set_header_content_style</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_header_type" title="details" class="method-name">set_header_type</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$type</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_highlight_lines_extra_style" title="details" class="method-name">set_highlight_lines_extra_style</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$styles</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_important_styles" title="details" class="method-name">set_important_styles</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$styles</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_keyword_group_highlighting" title="details" class="method-name">set_keyword_group_highlighting</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span> = <span class="var-default">true</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_keyword_group_style" title="details" class="method-name">set_keyword_group_style</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_language" title="details" class="method-name">set_language</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$language</span>, [<span class="var-type"></span>&nbsp;<span class="var-name">$force_reset</span> = <span class="var-default">false</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_language_path" title="details" class="method-name">set_language_path</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$path</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_line_ending" title="details" class="method-name">set_line_ending</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$line_ending</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_line_style" title="details" class="method-name">set_line_style</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style1</span>, [<span class="var-type">string|boolean</span>&nbsp;<span class="var-name">$style2</span> = <span class="var-default">''</span>], [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_link_styles" title="details" class="method-name">set_link_styles</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$type</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$styles</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_link_target" title="details" class="method-name">set_link_target</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$target</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_methods_highlighting" title="details" class="method-name">set_methods_highlighting</a>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_methods_style" title="details" class="method-name">set_methods_style</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_numbers_highlighting" title="details" class="method-name">set_numbers_highlighting</a>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_numbers_style" title="details" class="method-name">set_numbers_style</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_overall_class" title="details" class="method-name">set_overall_class</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$class</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_overall_id" title="details" class="method-name">set_overall_id</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$id</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_overall_style" title="details" class="method-name">set_overall_style</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_regexps_highlighting" title="details" class="method-name">set_regexps_highlighting</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_regexps_style" title="details" class="method-name">set_regexps_style</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">boolean</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type"></span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_source" title="details" class="method-name">set_source</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$source</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_strings_highlighting" title="details" class="method-name">set_strings_highlighting</a>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_strings_style" title="details" class="method-name">set_strings_style</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_symbols_highlighting" title="details" class="method-name">set_symbols_highlighting</a>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_symbols_style" title="details" class="method-name">set_symbols_style</a>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>], [<span class="var-type">int</span>&nbsp;<span class="var-name">$group</span> = <span class="var-default">0</span>])
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_tab_width" title="details" class="method-name">set_tab_width</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$width</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_url_for_keyword_group" title="details" class="method-name">set_url_for_keyword_group</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$group</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$url</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#set_use_language_tab_width" title="details" class="method-name">set_use_language_tab_width</a>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$use</span>)
+ </div>
+ <div class="method-definition">
+ <img src="../../media/images/Method.png" alt=" "/>
+ <span class="method-result">void</span>
+ <a href="#start_line_numbers_at" title="details" class="method-name">start_line_numbers_at</a>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$number</span>)
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+ <a name="sec-methods"></a>
+ <div class="info-box">
+ <div class="info-box-title">Methods</div>
+ <div class="nav-bar">
+ <a href="#sec-description">Description</a> |
+ <a href="#sec-method-summary">Methods</a> (<span class="disabled">details</span>)
+
+ </div>
+ <div class="info-box-body">
+ <A NAME='method_detail'></A>
+<a name="methodGeSHi" id="GeSHi"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Constructor.png" />
+ <span class="method-title">Constructor GeSHi</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a591">591</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Creates a new GeSHi object, with source and language</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">GeSHi</span>
+ <span class="method-name">
+ GeSHi
+ </span>
+ ([<span class="var-type">string</span>&nbsp;<span class="var-name">$source</span> = <span class="var-default">''</span>], [<span class="var-type">string</span>&nbsp;<span class="var-name">$language</span> = <span class="var-default">''</span>], [<span class="var-type">string</span>&nbsp;<span class="var-name">$path</span> = <span class="var-default">''</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$source</span><span class="var-description">: The source code to highlight</span> </li>
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$language</span><span class="var-description">: The language to highlight the source with</span> </li>
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$path</span><span class="var-description">: The path to the language file directory. <strong>This
+ is deprecated!</strong> I've backported the auto path detection from the 1.1.X dev branch, so now it should be automatically set correctly. If you have renamed the language directory however, you will still need to set the path using this parameter or GeSHi->set_language_path()</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodadd_keyword" id="add_keyword"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">add_keyword</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1441">1441</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Adds a keyword to a keyword group for highlighting</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ add_keyword
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$word</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$key</span><span class="var-description">: The key of the keyword group to add the keyword to</span> </li>
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$word</span><span class="var-description">: The word to add to the keyword group</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodadd_keyword_group" id="add_keyword_group"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">add_keyword_group</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1487">1487</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Creates a new keyword group</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ add_keyword_group
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$styles</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$case_sensitive</span> = <span class="var-default">true</span>], [<span class="var-type">array</span>&nbsp;<span class="var-name">$words</span> = <span class="var-default">array()</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$key</span><span class="var-description">: The key of the keyword group to create</span> </li>
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$styles</span><span class="var-description">: The styles for the keyword group</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$case_sensitive</span><span class="var-description">: Whether the keyword group is case sensitive ornot</span> </li>
+ <li>
+ <span class="var-type">array</span>
+ <span class="var-name">$words</span><span class="var-description">: The words to use for the keyword group</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methoddisable_highlighting" id="disable_highlighting"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">disable_highlighting</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1288">1288</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Disables all highlighting</p>
+ <ul class="tags">
+ <li><span class="field">deprecated:</span> In favour of enable_highlighting</li>
+ <li><span class="field">todo:</span> Rewrite with array traversal</li>
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ disable_highlighting
+ </span>
+ ()
+ </div>
+
+
+
+ </div>
+<a name="methodenable_classes" id="enable_classes"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">enable_classes</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a805">805</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets whether CSS classes should be used to highlight the source. Default is off, calling this method with no arguments will turn it on</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ enable_classes
+ </span>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span> = <span class="var-default">true</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: Whether to turn classes on or not</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodenable_highlighting" id="enable_highlighting"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">enable_highlighting</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1302">1302</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Enables all highlighting</p>
+<p class="description"><p>The optional flag parameter was added in version 1.0.7.21 and can be used to enable (true) or disable (false) all highlighting.</p></p>
+ <ul class="tags">
+ <li><span class="field">todo:</span> Rewrite with array traversal</li>
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ enable_highlighting
+ </span>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span> = <span class="var-default">true</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: A flag specifying whether to enable or disable all highlighting</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodenable_ids" id="enable_ids"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">enable_ids</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1652">1652</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Whether CSS IDs should be added to each line</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ enable_ids
+ </span>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span> = <span class="var-default">true</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: If true, IDs will be added to each line.</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodenable_important_blocks" id="enable_important_blocks"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">enable_important_blocks</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1642">1642</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets whether context-important blocks are highlighted</p>
+ <ul class="tags">
+ <li><span class="field">deprecated:</span> </li>
+ <li><span class="field">todo:</span> REMOVE THIS SHIZ FROM GESHI!</li>
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ enable_important_blocks
+ </span>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: Tells whether to enable or disable highlighting of important blocks</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodenable_inner_code_block" id="enable_inner_code_block"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">enable_inner_code_block</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1581">1581</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets whether to force a surrounding block around the highlighted code or not</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.7.20</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ enable_inner_code_block
+ </span>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: Tells whether to enable or disable this feature</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodenable_keyword_links" id="enable_keyword_links"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">enable_keyword_links</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1756">1756</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Turns linking of keywords on or off.</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ enable_keyword_links
+ </span>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$enable</span> = <span class="var-default">true</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$enable</span><span class="var-description">: If true, links will be added to keywords</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodenable_line_numbers" id="enable_line_numbers"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">enable_line_numbers</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a878">878</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets whether line numbers should be displayed.</p>
+<p class="description"><p>Valid values for the first parameter are:</p><p><ul><li>GESHI_NO_LINE_NUMBERS: Line numbers will not be displayed</li><li>GESHI_NORMAL_LINE_NUMBERS: Line numbers will be displayed</li><li>GESHI_FANCY_LINE_NUMBERS: Fancy line numbers will be displayed</li></ul> For fancy line numbers, the second parameter is used to signal which lines are to be fancy. For example, if the value of this parameter is 5 then every 5th line will be fancy.</p></p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ enable_line_numbers
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$flag</span>, [<span class="var-type">int</span>&nbsp;<span class="var-name">$nth_row</span> = <span class="var-default">5</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$flag</span><span class="var-description">: How line numbers should be displayed</span> </li>
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$nth_row</span><span class="var-description">: Defines which lines are fancy</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodenable_multiline_span" id="enable_multiline_span"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">enable_multiline_span</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a896">896</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets wether spans and other HTML markup generated by GeSHi can span over multiple lines or not. Defaults to true to reduce overhead.</p>
+<p class="description"><p>Set it to false if you want to manipulate the output or manually display the code in an ordered list.</p></p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.7.22</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ enable_multiline_span
+ </span>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: Wether multiline spans are allowed or not</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodenable_strict_mode" id="enable_strict_mode"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">enable_strict_mode</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1275">1275</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Enables/disables strict highlighting. Default is off, calling this method without parameters will turn it on. See documentation for more details on strict mode and where to use it.</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ enable_strict_mode
+ </span>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$mode</span> = <span class="var-default">true</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$mode</span><span class="var-description">: Whether to enable strict mode or not</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methoderror" id="error"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">error</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a608">608</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Returns an error message associated with the last GeSHi operation, or false if no error has occured</p>
+ <ul class="tags">
+ <li><span class="field">return:</span> An error message if there has been an error, else false</li>
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">string|false</span>
+ <span class="method-name">
+ error
+ </span>
+ ()
+ </div>
+
+
+
+ </div>
+<a name="methodget_language_name" id="get_language_name"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">get_language_name</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a632">632</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Gets a human-readable language name (thanks to Simon Patterson for the idea :))</p>
+ <ul class="tags">
+ <li><span class="field">return:</span> The name for the current language</li>
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">string</span>
+ <span class="method-name">
+ get_language_name
+ </span>
+ ()
+ </div>
+
+
+
+ </div>
+<a name="methodget_language_name_from_extension" id="get_language_name_from_extension"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">get_language_name_from_extension</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1329">1329</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Given a file extension, this method returns either a valid geshi language name, or the empty string if it couldn't be found</p>
+ <ul class="tags">
+ <li><span class="field">todo:</span> Re-think about how this method works (maybe make it private and/or make it a extension-&gt;lang lookup?)</li>
+ <li><span class="field">todo:</span> static?</li>
+ <li><span class="field">since:</span> 1.0.5</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ get_language_name_from_extension
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$extension</span>, [<span class="var-type">array</span>&nbsp;<span class="var-name">$lookup</span> = <span class="var-default">array()</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$extension</span><span class="var-description">: The extension to get a language name for</span> </li>
+ <li>
+ <span class="var-type">array</span>
+ <span class="var-name">$lookup</span><span class="var-description">: A lookup array to use instead of the default one</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodget_multiline_span" id="get_multiline_span"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">get_multiline_span</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a906">906</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Get current setting for multiline spans, see GeSHi-&gt;enable_multiline_span().</p>
+ <ul class="tags">
+ <li><span class="field">see:</span> <a href="../../geshi/core/GeSHi.html#methodenable_multiline_span">GeSHi::enable_multiline_span()</a></li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">bool</span>
+ <span class="method-name">
+ get_multiline_span
+ </span>
+ ()
+ </div>
+
+
+
+ </div>
+<a name="methodget_real_tab_width" id="get_real_tab_width"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">get_real_tab_width</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1258">1258</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Returns the tab width to use, based on the current language and user preference</p>
+ <ul class="tags">
+ <li><span class="field">return:</span> Tab width</li>
+ <li><span class="field">since:</span> 1.0.7.20</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">int</span>
+ <span class="method-name">
+ get_real_tab_width
+ </span>
+ ()
+ </div>
+
+
+
+ </div>
+<a name="methodget_stylesheet" id="get_stylesheet"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">get_stylesheet</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a4177">4177</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Returns a stylesheet for the highlighted code. If $economy mode is true, we only return the stylesheet declarations that matter for this code block instead of the whole thing</p>
+ <ul class="tags">
+ <li><span class="field">return:</span> A stylesheet built on the data for the current language</li>
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">string</span>
+ <span class="method-name">
+ get_stylesheet
+ </span>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$economy_mode</span> = <span class="var-default">true</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$economy_mode</span><span class="var-description">: Whether to use economy mode or not</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodget_time" id="get_time"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">get_time</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a3524">3524</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Gets the time taken to parse the code</p>
+ <ul class="tags">
+ <li><span class="field">return:</span> The time taken to parse the code</li>
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">double</span>
+ <span class="method-name">
+ get_time
+ </span>
+ ()
+ </div>
+
+
+
+ </div>
+<a name="methodhighlight_lines_extra" id="highlight_lines_extra"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">highlight_lines_extra</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1670">1670</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Specifies which lines to highlight extra</p>
+<p class="description"><p>The extra style parameter was added in 1.0.7.21.</p></p>
+ <ul class="tags">
+ <li><span class="field">todo:</span> Some data replication here that could be cut down on</li>
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ highlight_lines_extra
+ </span>
+ (<span class="var-type">mixed</span>&nbsp;<span class="var-name">$lines</span>, [<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span> = <span class="var-default">null</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">mixed</span>
+ <span class="var-name">$lines</span><span class="var-description">: An array of line numbers to highlight, or just a line number on its own.</span> </li>
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style</span><span class="var-description">: A string specifying the style to use for this line. If null is specified, the default style is used. If false is specified, the line will be removed from special highlighting</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodload_from_file" id="load_from_file"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">load_from_file</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1425">1425</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Given a file name, this method loads its contents in, and attempts</p>
+<p class="description"><p>to set the language automatically. An optional lookup table can be passed for looking up the language name. If not specified a default table is used</p><p>The language table is in the form <pre>array(
+ 'lang_name' => array('extension', 'extension', ...),
+ 'lang_name' ...
+ );</pre></p></p>
+ <ul class="tags">
+ <li><span class="field">todo:</span> Complete rethink of this and above method</li>
+ <li><span class="field">since:</span> 1.0.5</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ load_from_file
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$file_name</span>, [<span class="var-type">array</span>&nbsp;<span class="var-name">$lookup</span> = <span class="var-default">array()</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$file_name</span><span class="var-description">: The filename to load the source from</span> </li>
+ <li>
+ <span class="var-type">array</span>
+ <span class="var-name">$lookup</span><span class="var-description">: A lookup array to use instead of the default one</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodoptimize_keyword_group" id="optimize_keyword_group"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">optimize_keyword_group</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1529">1529</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">compile optimized regexp list for keyword group</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.8</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ optimize_keyword_group
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$key</span><span class="var-description">: The key of the keyword group to compile &amp; optimize</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodparse_code" id="parse_code"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">parse_code</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1992">1992</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Returns the code in $this-&gt;source, highlighted and surrounded by the nessecary HTML.</p>
+<p class="description"><p>This should only be called ONCE, cos it's SLOW! If you want to highlight the same source multiple times, you're better off doing a whole lot of str_replaces to replace the &amp;lt;span&amp;gt;s</p></p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ parse_code
+ </span>
+ ()
+ </div>
+
+
+
+ </div>
+<a name="methodremove_keyword" id="remove_keyword"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">remove_keyword</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1466">1466</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Removes a keyword from a keyword group</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ remove_keyword
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$word</span>, [<span class="var-type">bool</span>&nbsp;<span class="var-name">$recompile</span> = <span class="var-default">true</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$key</span><span class="var-description">: The key of the keyword group to remove the keyword from</span> </li>
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$word</span><span class="var-description">: The word to remove from the keyword group</span> </li>
+ <li>
+ <span class="var-type">bool</span>
+ <span class="var-name">$recompile</span><span class="var-description">: Wether to automatically recompile the optimized regexp list or not. Note: if you set this to false and @see GeSHi-&gt;parse_code() was already called once, for the current language, you have to manually call @see GeSHi-&gt;optimize_keyword_group() or the removed keyword will stay in cache and still be highlighted! On the other hand it might be too expensive to recompile the regexp list for every removal if you want to remove a lot of keywords.</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodremove_keyword_group" id="remove_keyword_group"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">remove_keyword_group</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1512">1512</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Removes a keyword group</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ remove_keyword_group
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$key</span><span class="var-description">: The key of the keyword group to remove</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_brackets_highlighting" id="set_brackets_highlighting"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_brackets_highlighting</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1036">1036</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Turns highlighting on/off for brackets</p>
+<p class="description"><p>This method is DEPRECATED: use set_symbols_highlighting instead. This method will be remove in 1.2.X</p></p>
+ <ul class="tags">
+ <li><span class="field">deprecated:</span> In favour of set_symbols_highlighting</li>
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_brackets_highlighting
+ </span>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: Whether to turn highlighting for brackets on or off</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_brackets_style" id="set_brackets_style"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_brackets_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1018">1018</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the styles for brackets. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</p>
+<p class="description"><p>This method is DEPRECATED: use set_symbols_style instead. This method will be removed in 1.2.X</p></p>
+ <ul class="tags">
+ <li><span class="field">deprecated:</span> In favour of set_symbols_style</li>
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_brackets_style
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style</span><span class="var-description">: The style to make the brackets</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$preserve_defaults</span><span class="var-description">: Whether to merge the new styles with the old or just to overwrite them</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_case_keywords" id="set_case_keywords"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_case_keywords</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1216">1216</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the case that keywords should use when found. Use the constants:</p>
+<p class="description"><p><ul><li>GESHI_CAPS_NO_CHANGE: leave keywords as-is</li><li>GESHI_CAPS_UPPER: convert all keywords to uppercase where found</li><li>GESHI_CAPS_LOWER: convert all keywords to lowercase where found</li></ul></p></p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.1</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_case_keywords
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$case</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$case</span><span class="var-description">: A constant specifying what to do with matched keywords</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_case_sensitivity" id="set_case_sensitivity"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_case_sensitivity</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1202">1202</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets whether a set of keywords are checked for in a case sensitive manner</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_case_sensitivity
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">boolean</span>&nbsp;<span class="var-name">$case</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$key</span><span class="var-description">: The key of the keyword group to change the case sensitivity of</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$case</span><span class="var-description">: Whether to check in a case sensitive manner or not</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_code_style" id="set_code_style"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_code_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a824">824</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the style for the actual code. This should be a string</p>
+<p class="description"><p>containing valid stylesheet declarations. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</p><p>Note: Use this method to override any style changes you made to the line numbers if you are using line numbers, else the line of code will have the same style as the line number! Consult the GeSHi documentation for more information about this.</p></p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_code_style
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style</span><span class="var-description">: The style to use for actual code</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$preserve_defaults</span><span class="var-description">: Whether to merge the current styles with the new styles</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_comments_highlighting" id="set_comments_highlighting"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_comments_highlighting</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a972">972</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Turns highlighting on/off for comment groups</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_comments_highlighting
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span> = <span class="var-default">true</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$key</span><span class="var-description">: The key of the comment group to turn on or off</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: Whether to turn highlighting for that group on or off</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_comments_style" id="set_comments_style"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_comments_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a957">957</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the styles for comment groups. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_comments_style
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$key</span><span class="var-description">: The key of the comment group to change the styles of</span> </li>
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style</span><span class="var-description">: The style to make the comments</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$preserve_defaults</span><span class="var-description">: Whether to merge the new styles with the old or just to overwrite them</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_encoding" id="set_encoding"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_encoding</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1744">1744</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the encoding used for htmlspecialchars(), for international support.</p>
+<p class="description"><p>NOTE: This is not needed for now because htmlspecialchars() is not being used (it has a security hole in PHP4 that has not been patched). Maybe in a future version it may make a return for speed reasons, but I doubt it.</p></p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.3</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_encoding
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$encoding</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$encoding</span><span class="var-description">: The encoding to use for the source</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_escape_characters_highlighting" id="set_escape_characters_highlighting"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_escape_characters_highlighting</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1000">1000</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Turns highlighting on/off for escaped characters</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_escape_characters_highlighting
+ </span>
+ ([<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span> = <span class="var-default">true</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: Whether to turn highlighting for escape characters on or off</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_escape_characters_style" id="set_escape_characters_style"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_escape_characters_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a986">986</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the styles for escaped characters. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_escape_characters_style
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style</span><span class="var-description">: The style to make the escape characters</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$preserve_defaults</span><span class="var-description">: Whether to merge the new styles with the old or just to overwrite them</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_footer_content" id="set_footer_content"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_footer_content</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1550">1550</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the content of the footer block</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_footer_content
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$content</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$content</span><span class="var-description">: The content of the footer block</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_footer_content_style" id="set_footer_content_style"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_footer_content_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1570">1570</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the style for the footer content</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_footer_content_style
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style</span><span class="var-description">: The style for the footer content</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_header_content" id="set_header_content"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_header_content</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1540">1540</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the content of the header block</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_header_content
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$content</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$content</span><span class="var-description">: The content of the header block</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_header_content_style" id="set_header_content_style"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_header_content_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1560">1560</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the style for the header content</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_header_content_style
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style</span><span class="var-description">: The style for the header content</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_header_type" id="set_header_type"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_header_type</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a746">746</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the type of header to be used.</p>
+<p class="description"><p>If GESHI_HEADER_DIV is used, the code is surrounded in a &quot;div&quot;.This means more source code but more control over tab width and line-wrapping. GESHI_HEADER_PRE means that a &quot;pre&quot; is used - less source, but less control. Default is GESHI_HEADER_PRE.</p><p>From 1.0.7.2, you can use GESHI_HEADER_NONE to specify that no header code should be outputted.</p></p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_header_type
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$type</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$type</span><span class="var-description">: The type of header to be used</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_highlight_lines_extra_style" id="set_highlight_lines_extra_style"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_highlight_lines_extra_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1699">1699</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the style for extra-highlighted lines</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_highlight_lines_extra_style
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$styles</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$styles</span><span class="var-description">: The style for extra-highlighted lines</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_important_styles" id="set_important_styles"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_important_styles</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1630">1630</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets styles for important parts of the code</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_important_styles
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$styles</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$styles</span><span class="var-description">: The styles to use on important parts of the code</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_keyword_group_highlighting" id="set_keyword_group_highlighting"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_keyword_group_highlighting</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a942">942</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Turns highlighting on/off for a keyword group</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_keyword_group_highlighting
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span> = <span class="var-default">true</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$key</span><span class="var-description">: The key of the keyword group to turn on or off</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: Whether to turn highlighting for that group on or off</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_keyword_group_style" id="set_keyword_group_style"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_keyword_group_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a921">921</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the style for a keyword group. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_keyword_group_style
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$key</span><span class="var-description">: The key of the keyword group to change the styles of</span> </li>
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style</span><span class="var-description">: The style to make the keywords</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$preserve_defaults</span><span class="var-description">: Whether to merge the new styles with the old or just to overwrite them</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_language" id="set_language"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_language</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a659">659</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the language for this object</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ <li><span class="field">note:</span> since 1.0.8 this function won't reset language-settings by default anymore! if you need this set $force_reset = true</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_language
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$language</span>, [<span class="var-type"></span>&nbsp;<span class="var-name">$force_reset</span> = <span class="var-default">false</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$language</span><span class="var-description">: The name of the language to use</span> </li>
+ <li>
+ <span class="var-type"></span>
+ <span class="var-name">$force_reset</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_language_path" id="set_language_path"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_language_path</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a703">703</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the path to the directory containing the language files. Note that this path is relative to the directory of the script that included geshi.php, NOT geshi.php itself.</p>
+ <ul class="tags">
+ <li><span class="field">deprecated:</span> The path to the language files should now be automatically detected, so this method should no longer be needed. The 1.1.X branch handles manual setting of the path differently so this method will disappear in 1.2.0.</li>
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_language_path
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$path</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$path</span><span class="var-description">: The path to the language directory</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_line_ending" id="set_line_ending"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_line_ending</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1709">1709</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the line-ending</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_line_ending
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$line_ending</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$line_ending</span><span class="var-description">: The new line-ending</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_line_style" id="set_line_style"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_line_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a844">844</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the styles for the line numbers.</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_line_style
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style1</span>, [<span class="var-type">string|boolean</span>&nbsp;<span class="var-name">$style2</span> = <span class="var-default">''</span>], [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style1</span><span class="var-description">: The style for the line numbers that are &quot;normal&quot;</span> </li>
+ <li>
+ <span class="var-type">string|boolean</span>
+ <span class="var-name">$style2</span><span class="var-description">: If a string, this is the style of the line numbers that are &quot;fancy&quot;, otherwise if boolean then this defines whether the normal styles should be merged with the new normal styles or not</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$preserve_defaults</span><span class="var-description">: If set, is the flag for whether to merge the &quot;fancy&quot; styles with the current styles or not</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_link_styles" id="set_link_styles"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_link_styles</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1606">1606</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets styles for links in code</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_link_styles
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$type</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$styles</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$type</span><span class="var-description">: A constant that specifies what state the style is being set for - e.g. :hover or :visited</span> </li>
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$styles</span><span class="var-description">: The styles to use for that state</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_link_target" id="set_link_target"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_link_target</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1616">1616</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the target for links in code</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.3</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_link_target
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$target</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$target</span><span class="var-description">: The target for links in the code, e.g. _blank</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_methods_highlighting" id="set_methods_highlighting"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_methods_highlighting</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1162">1162</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Turns highlighting on/off for methods</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_methods_highlighting
+ </span>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: Whether to turn highlighting for methods on or off</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_methods_style" id="set_methods_style"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_methods_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1148">1148</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the styles for methods. $key is a number that references the</p>
+<p class="description"><p>appropriate &quot;object splitter&quot; - see the language file for the language you are highlighting to get this number. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</p></p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_methods_style
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$key</span><span class="var-description">: The key of the object splitter to change the styles of</span> </li>
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style</span><span class="var-description">: The style to make the methods</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$preserve_defaults</span><span class="var-description">: Whether to merge the new styles with the old or just to overwrite them</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_numbers_highlighting" id="set_numbers_highlighting"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_numbers_highlighting</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1131">1131</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Turns highlighting on/off for numbers</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_numbers_highlighting
+ </span>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: Whether to turn highlighting for numbers on or off</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_numbers_style" id="set_numbers_style"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_numbers_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1117">1117</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the styles for numbers. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_numbers_style
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style</span><span class="var-description">: The style to make the numbers</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$preserve_defaults</span><span class="var-description">: Whether to merge the new styles with the old or just to overwrite them</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_overall_class" id="set_overall_class"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_overall_class</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a783">783</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the overall classname for this block of code. This class can then be used in a stylesheet to style this object's output</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_overall_class
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$class</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$class</span><span class="var-description">: The class name to use for this block of code</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_overall_id" id="set_overall_id"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_overall_id</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a794">794</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the overall id for this block of code. This id can then be used in a stylesheet to style this object's output</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_overall_id
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$id</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$id</span><span class="var-description">: The ID to use for this block of code</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_overall_style" id="set_overall_style"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_overall_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a767">767</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the styles for the code that will be outputted when this object is parsed. The style should be a string of valid stylesheet declarations</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_overall_style
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style</span><span class="var-description">: The overall style for the outputted code block</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$preserve_defaults</span><span class="var-description">: Whether to merge the styles with the current styles or not</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_regexps_highlighting" id="set_regexps_highlighting"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_regexps_highlighting</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1191">1191</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Turns highlighting on/off for regexps</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_regexps_highlighting
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$key</span><span class="var-description">: The key of the regular expression group to turn on or off</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: Whether to turn highlighting for the regular expression group on or off</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_regexps_style" id="set_regexps_style"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_regexps_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1176">1176</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the styles for regexps. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_regexps_style
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$key</span>, <span class="var-type">boolean</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type"></span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$key</span><span class="var-description">: The style to make the regular expression matches</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$style</span><span class="var-description">: Whether to merge the new styles with the old or just to overwrite them</span> </li>
+ <li>
+ <span class="var-type"></span>
+ <span class="var-name">$preserve_defaults</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_source" id="set_source"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_source</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a645">645</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the source code for this object</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_source
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$source</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$source</span><span class="var-description">: The source code to highlight</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_strings_highlighting" id="set_strings_highlighting"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_strings_highlighting</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1103">1103</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Turns highlighting on/off for strings</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_strings_highlighting
+ </span>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: Whether to turn highlighting for strings on or off</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_strings_style" id="set_strings_style"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_strings_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1089">1089</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the styles for strings. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_strings_style
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style</span><span class="var-description">: The style to make the escape characters</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$preserve_defaults</span><span class="var-description">: Whether to merge the new styles with the old or just to overwrite them</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_symbols_highlighting" id="set_symbols_highlighting"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_symbols_highlighting</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1071">1071</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Turns highlighting on/off for symbols</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_symbols_highlighting
+ </span>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$flag</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$flag</span><span class="var-description">: Whether to turn highlighting for symbols on or off</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_symbols_style" id="set_symbols_style"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_symbols_style</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1051">1051</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the styles for symbols. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.1</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_symbols_style
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$style</span>, [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$preserve_defaults</span> = <span class="var-default">false</span>], [<span class="var-type">int</span>&nbsp;<span class="var-name">$group</span> = <span class="var-default">0</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$style</span><span class="var-description">: The style to make the symbols</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$preserve_defaults</span><span class="var-description">: Whether to merge the new styles with the old or just to overwrite them</span> </li>
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$group</span><span class="var-description">: Tells the group of symbols for which style should be set.</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_tab_width" id="set_tab_width"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_tab_width</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1231">1231</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets how many spaces a tab is substituted for</p>
+<p class="description"><p>Widths below zero are ignored</p></p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.0</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_tab_width
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$width</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$width</span><span class="var-description">: The tab width</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_url_for_keyword_group" id="set_url_for_keyword_group"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_url_for_keyword_group</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1594">1594</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets the base URL to be used for keywords</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_url_for_keyword_group
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$group</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$url</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$group</span><span class="var-description">: The key of the keyword group to set the URL for</span> </li>
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$url</span><span class="var-description">: The URL to set for the group. If {FNAME} is in the url somewhere, it is replaced by the keyword that the URL is being made for</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodset_use_language_tab_width" id="set_use_language_tab_width"><!-- --></a>
+<div class="oddrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">set_use_language_tab_width</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1247">1247</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets whether or not to use tab-stop width specifed by language</p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.7.20</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ set_use_language_tab_width
+ </span>
+ (<span class="var-type">boolean</span>&nbsp;<span class="var-name">$use</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$use</span><span class="var-description">: Whether to use language-specific tab-stop widths</span> </li>
+ </ul>
+
+
+ </div>
+<a name="methodstart_line_numbers_at" id="start_line_numbers_at"><!-- --></a>
+<div class="evenrow">
+
+ <div class="method-header">
+ <img src="../../media/images/Method.png" />
+ <span class="method-title">start_line_numbers_at</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a1728">1728</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Sets what number line numbers should start at. Should be a positive integer, and will be converted to one.</p>
+<p class="description"><p><strong>Warning:</strong> Using this method will add the &quot;start&quot; attribute to the &amp;lt;ol&amp;gt; that is used for line numbering. This is <strong>not</strong> valid XHTML strict, so if that's what you care about then don't use this method. Firefox is getting support for the CSS method of doing this in 1.1 and Opera has support for the CSS method, but (of course) IE doesn't so it's not worth doing it the CSS way yet.</p></p>
+ <ul class="tags">
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+
+ <div class="method-signature">
+ <span class="method-result">void</span>
+ <span class="method-name">
+ start_line_numbers_at
+ </span>
+ (<span class="var-type">int</span>&nbsp;<span class="var-name">$number</span>)
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">int</span>
+ <span class="var-name">$number</span><span class="var-description">: The number to start line numbers at</span> </li>
+ </ul>
+
+
+ </div>
+
+ </div>
+ </div>
+
+
+ <p class="notes" id="credit">
+ Documentation generated on Thu, 25 Dec 2008 14:34:52 +0100 by <a href="http://www.phpdoc.org" target="_blank">phpDocumentor 1.4.2</a>
+ </p>
+ </div></body>
+</html> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/geshi/core/_geshi.php.html b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/geshi/core/_geshi.php.html
new file mode 100644
index 00000000..798f68f2
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/geshi/core/_geshi.php.html
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <!-- template designed by Marco Von Ballmoos -->
+ <title>Docs for page geshi.php</title>
+ <link rel="stylesheet" href="../../media/stylesheet.css" />
+ <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
+ </head>
+ <body>
+ <div class="page-body">
+<h2 class="file-name"><img src="../../media/images/Page_logo.png" alt="File" style="vertical-align: middle">/geshi.php</h2>
+
+<a name="sec-description"></a>
+<div class="info-box">
+ <div class="info-box-title">Description</div>
+ <div class="nav-bar">
+ <span class="disabled">Description</span> |
+ <a href="#sec-classes">Classes</a>
+ | <a href="#sec-constants">Constants</a>
+ | <a href="#sec-functions">Functions</a>
+ </div>
+ <div class="info-box-body">
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">GeSHi - Generic Syntax Highlighter</p>
+<p class="description"><p>The GeSHi class for Generic Syntax Highlighting. Please refer to the documentation at http://qbnz.com/highlighter/documentation.php for more information about how to use this class.</p><p>For changes, release notes, TODOs etc, see the relevant files in the docs/ directory.</p><p>This file is part of GeSHi.</p><p>GeSHi 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.</p><p>GeSHi 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.</p><p>You should have received a copy of the GNU General Public License along with GeSHi; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</p></p>
+ <ul class="tags">
+ <li><span class="field">author:</span> Nigel McNie &lt;<a href="mailto:nigel@geshi.org">nigel@geshi.org</a>&gt;, Benny Baumann &lt;BenBE@omorphia.de&gt;</li>
+ <li><span class="field">copyright:</span> (C) 2004 - 2007 Nigel McNie, (C) 2007 - 2008 Benny Baumann</li>
+ <li><span class="field">filesource:</span> <a href="../../__filesource/fsource_geshi_core_geshi.php.html">Source Code for this file</a></li>
+ <li><span class="field">license:</span> <a href="http://gnu.org/copyleft/gpl.html">GNU GPL</a></li>
+ </ul>
+
+ </div>
+</div>
+
+ <a name="sec-classes"></a>
+ <div class="info-box">
+ <div class="info-box-title">Classes</div>
+ <div class="nav-bar">
+ <a href="#sec-description">Description</a> |
+ <span class="disabled">Classes</span>
+ | <a href="#sec-constants">Constants</a>
+ | <a href="#sec-functions">Functions</a>
+ </div>
+ <div class="info-box-body">
+ <table cellpadding="2" cellspacing="0" class="class-table">
+ <tr>
+ <th class="class-table-header">Class</th>
+ <th class="class-table-header">Description</th>
+ </tr>
+ <tr>
+ <td style="padding-right: 2em; vertical-align: top; white-space: nowrap">
+ <img src="../../media/images/Class.png"
+ alt=" class"
+ title=" class"/>
+ <a href="../../geshi/core/GeSHi.html">GeSHi</a>
+ </td>
+ <td>
+ The GeSHi Class.
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+
+
+ <a name="sec-constants"></a>
+ <div class="info-box">
+ <div class="info-box-title">Constants</div>
+ <div class="nav-bar">
+ <a href="#sec-description">Description</a> |
+ <a href="#sec-classes">Classes</a>
+ | <span class="disabled">Constants</span>
+ | <a href="#sec-functions">Functions</a>
+ </div>
+ <div class="info-box-body">
+ <a name="defineGESHI_ACTIVE"><!-- --></a>
+<div class="oddrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_ACTIVE</span> = 2
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a107">107</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Links in the source in the :active state</p>
+
+
+</div>
+<a name="defineGESHI_CAPS_LOWER"><!-- --></a>
+<div class="evenrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_CAPS_LOWER</span> = 2
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a99">99</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Leave keywords found as the case that they are</p>
+
+
+</div>
+<a name="defineGESHI_CAPS_NO_CHANGE"><!-- --></a>
+<div class="oddrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_CAPS_NO_CHANGE</span> = 0
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a95">95</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Lowercase keywords found</p>
+
+
+</div>
+<a name="defineGESHI_CAPS_UPPER"><!-- --></a>
+<div class="evenrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_CAPS_UPPER</span> = 1
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a97">97</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Uppercase keywords found</p>
+
+
+</div>
+<a name="defineGESHI_END_IMPORTANT"><!-- --></a>
+<div class="oddrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_END_IMPORTANT</span> = '&lt;END GeSHi&gt;'
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a117">117</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">The ender for important parts of the source</p>
+
+
+</div>
+<a name="defineGESHI_FANCY_LINE_NUMBERS"><!-- --></a>
+<div class="evenrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_FANCY_LINE_NUMBERS</span> = 2
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a67">67</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Use fancy line numbers when building the result</p>
+
+
+</div>
+<a name="defineGESHI_HEADER_DIV"><!-- --></a>
+<div class="oddrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_HEADER_DIV</span> = 1
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a73">73</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Use a &quot;div&quot; to surround the source</p>
+
+
+</div>
+<a name="defineGESHI_HEADER_NONE"><!-- --></a>
+<div class="evenrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_HEADER_NONE</span> = 0
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a71">71</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Use nothing to surround the source</p>
+
+
+</div>
+<a name="defineGESHI_HEADER_PRE"><!-- --></a>
+<div class="oddrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_HEADER_PRE</span> = 2
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a75">75</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Use a &quot;pre&quot; to surround the source</p>
+
+
+</div>
+<a name="defineGESHI_HEADER_PRE_TABLE"><!-- --></a>
+<div class="evenrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_HEADER_PRE_TABLE</span> = 4
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a91">91</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Use a &quot;table&quot; to surround the source:</p>
+<p class="description"><p>&lt;table&gt; &lt;thead&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;$header&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;<pre>$linenumbers</pre>&lt;/td&gt;&lt;td&gt;<pre>$code></pre>&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;tfooter&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;$footer&lt;/td&gt;&lt;/tr&gt;&lt;/tfoot&gt; &lt;/table&gt;</p><p>this is essentially only a workaround for Firefox, see sf#1651996 or take a look at https://bugzilla.mozilla.org/show_bug.cgi?id=365805</p></p>
+ <ul class="tags">
+ <li><span class="field">note:</span> when linenumbers are disabled this is essentially the same as GESHI_HEADER_PRE</li>
+ </ul>
+
+
+</div>
+<a name="defineGESHI_HEADER_PRE_VALID"><!-- --></a>
+<div class="oddrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_HEADER_PRE_VALID</span> = 3
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a77">77</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Use a pre to wrap lines when line numbers are enabled or to wrap the whole code.</p>
+
+
+</div>
+<a name="defineGESHI_HOVER"><!-- --></a>
+<div class="evenrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_HOVER</span> = 1
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a105">105</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Links in the source in the :hover state</p>
+
+
+</div>
+<a name="defineGESHI_LANG_ROOT"><!-- --></a>
+<div class="oddrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_LANG_ROOT</span> = GESHI_ROOT.'geshi'.DIRECTORY_SEPARATOR
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a53">53</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">The language file directory for GeSHi</p>
+
+
+</div>
+<a name="defineGESHI_LINK"><!-- --></a>
+<div class="evenrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_LINK</span> = 0
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a103">103</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Links in the source in the :link state</p>
+
+
+</div>
+<a name="defineGESHI_NORMAL_LINE_NUMBERS"><!-- --></a>
+<div class="oddrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_NORMAL_LINE_NUMBERS</span> = 1
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a65">65</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Use normal line numbers when building the result</p>
+
+
+</div>
+<a name="defineGESHI_NO_LINE_NUMBERS"><!-- --></a>
+<div class="evenrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_NO_LINE_NUMBERS</span> = 0
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a63">63</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Use no line numbers when building the result</p>
+
+
+</div>
+<a name="defineGESHI_ROOT"><!-- --></a>
+<div class="oddrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_ROOT</span> = dirname(__FILE__).DIRECTORY_SEPARATOR
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a49">49</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">The root directory for GeSHi</p>
+
+
+</div>
+<a name="defineGESHI_SECURITY_PARANOID"><!-- --></a>
+<div class="evenrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_SECURITY_PARANOID</span> = false
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a58">58</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Tells GeSHi to be paranoid about security settings</p>
+
+
+</div>
+<a name="defineGESHI_START_IMPORTANT"><!-- --></a>
+<div class="oddrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_START_IMPORTANT</span> = '&lt;BEGIN GeSHi&gt;'
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a115">115</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">The starter for important parts of the source</p>
+
+
+</div>
+<a name="defineGESHI_VERSION"><!-- --></a>
+<div class="evenrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_VERSION</span> = '1.0.8.2',
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a44">44</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">The version of this GeSHi file</p>
+
+
+</div>
+<a name="defineGESHI_VISITED"><!-- --></a>
+<div class="oddrow">
+
+ <div>
+ <img src="../../media/images/Constant.png" />
+ <span class="const-title">
+ <span class="const-name">GESHI_VISITED</span> = 3
+ (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a109">109</a></span>)
+ </span>
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Links in the source in the :visited state</p>
+
+
+</div>
+ </div>
+ </div>
+
+
+ <a name="sec-functions"></a>
+ <div class="info-box">
+ <div class="info-box-title">Functions</div>
+ <div class="nav-bar">
+ <a href="#sec-description">Description</a> |
+ <a href="#sec-classes">Classes</a>
+ | <a href="#sec-constants">Constants</a>
+ | <span class="disabled">Functions</span>
+ </div>
+ <div class="info-box-body">
+ <a name="functiongeshi_highlight" id="functiongeshi_highlight"><!-- --></a>
+<div class="evenrow">
+
+ <div>
+ <img src="../../media/images/Function.png" />
+ <span class="method-title">geshi_highlight</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a4577">4577</a></span>)
+ </div>
+
+ <!-- ========== Info from phpDoc block ========= -->
+<p class="short-description">Easy way to highlight stuff. Behaves just like highlight_string</p>
+ <ul class="tags">
+ <li><span class="field">return:</span> The code highlighted (if $return is true)</li>
+ <li><span class="field">since:</span> 1.0.2</li>
+ </ul>
+ <div class="method-signature">
+ <span class="method-result">string</span>
+ <span class="method-name">
+ geshi_highlight
+ </span>
+ (<span class="var-type">string</span>&nbsp;<span class="var-name">$string</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$language</span>, [<span class="var-type">string</span>&nbsp;<span class="var-name">$path</span> = <span class="var-default">null</span>], [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$return</span> = <span class="var-default">false</span>])
+ </div>
+
+ <ul class="parameters">
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$string</span><span class="var-description">: The code to highlight</span> </li>
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$language</span><span class="var-description">: The language to highlight the code in</span> </li>
+ <li>
+ <span class="var-type">string</span>
+ <span class="var-name">$path</span><span class="var-description">: The path to the language files. You can leave this blank if you need as from version 1.0.7 the path should be automatically detected</span> </li>
+ <li>
+ <span class="var-type">boolean</span>
+ <span class="var-name">$return</span><span class="var-description">: Whether to return the result or to echo</span> </li>
+ </ul>
+
+
+</div>
+ </div>
+ </div>
+
+ <p class="notes" id="credit">
+ Documentation generated on Thu, 25 Dec 2008 14:34:34 +0100 by <a href="http://www.phpdoc.org" target="_blank">phpDocumentor 1.4.2</a>
+ </p>
+ </div></body>
+</html> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/index.html b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/index.html
new file mode 100644
index 00000000..f499a8f9
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/index.html
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//FR"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <!-- Generated by phpDocumentor on Thu, 25 Dec 2008 14:34:34 +0100 -->
+ <title>GeSHi 1.0.8</title>
+ <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
+</head>
+
+<FRAMESET rows='120,*'>
+ <FRAME src='packages.html' name='left_top' frameborder="1" bordercolor="#999999">
+ <FRAMESET cols='25%,*'>
+ <FRAME src='li_geshi.html' name='left_bottom' frameborder="1" bordercolor="#999999">
+ <FRAME src='blank.html' name='right' frameborder="1" bordercolor="#999999">
+ </FRAMESET>
+ <NOFRAMES>
+ <H2>Frame Alert</H2>
+ <P>This document is designed to be viewed using the frames feature.
+ If you see this message, you are using a non-frame-capable web client.</P>
+ </NOFRAMES>
+</FRAMESET>
+</HTML> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/li_geshi.html b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/li_geshi.html
new file mode 100644
index 00000000..f074e378
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/li_geshi.html
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <!-- template designed by Marco Von Ballmoos -->
+ <title></title>
+ <link rel="stylesheet" href="media/stylesheet.css" />
+ <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
+ </head>
+ <body>
+ <div class="package-title">geshi</div>
+<div class="package-details">
+
+ <dl class="tree">
+
+ <dt class="folder-title">Description</dt>
+ <dd>
+ <a href='classtrees_geshi.html' target='right'>Class trees</a><br />
+ <a href='elementindex_geshi.html' target='right'>Index of elements</a><br />
+ <a href="todolist.html" target="right">Todo List</a><br />
+ </dd>
+
+
+
+
+
+
+
+ <dt class="sub-package"><img class="tree-icon" src="media/images/package.png" alt="Sub-package">core</dt>
+ <dd>
+ <dl class="tree">
+ <dt class="folder-title"><img class="tree-icon" src="media/images/class_folder.png" alt=" ">Classes</dt>
+ <dd><img class="tree-icon" src="media/images/Class.png" alt="Class"><a href='geshi/core/GeSHi.html' target='right'>GeSHi</a></dd>
+ <dt class="folder-title"><img class="tree-icon" src="media/images/function_folder.png" alt=" ">Functions</dt>
+ <dd><img class="tree-icon" src="media/images/Function.png" alt="Function"><a href='geshi/core/_geshi.php.html#functiongeshi_highlight' target='right'>geshi_highlight</a></dd>
+ <dt class="folder-title"><img class="tree-icon" src="media/images/folder.png" alt=" ">Files</dt>
+ <dd><img class="tree-icon" src="media/images/Page.png" alt="File"><a href='geshi/core/_geshi.php.html' target='right'>geshi.php</a></dd>
+ </dl>
+ </dd>
+
+
+ </dl>
+</div>
+<p class="notes"><a href="http://www.phpdoc.org" target="_blank">phpDocumentor v <span class="field">1.4.2</span></a></p>
+</BODY>
+</HTML> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/banner.css b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/banner.css
new file mode 100644
index 00000000..032b037f
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/banner.css
@@ -0,0 +1,33 @@
+body
+{
+ background-color: #EEEEEE;
+ margin: 0px;
+ padding: 0px;
+}
+
+/* Banner (top bar) classes */
+
+.banner { }
+
+.banner-menu
+{
+ text-align: right;
+ clear: both;
+ padding: .5em;
+ border-top: 2px solid #AAAAAA;
+}
+
+.banner-title
+{
+ text-align: right;
+ font-size: 20pt;
+ font-weight: bold;
+ margin: .2em;
+}
+
+.package-selector
+{
+ background-color: #DDDDDD;
+ border: 1px solid #AAAAAA;
+ color: #000090;
+}
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractClass.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractClass.png
new file mode 100644
index 00000000..b1f60760
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractClass.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractClass_logo.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractClass_logo.png
new file mode 100644
index 00000000..ab21d652
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractClass_logo.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractMethod.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractMethod.png
new file mode 100644
index 00000000..635fa08b
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractMethod.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractPrivateClass.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractPrivateClass.png
new file mode 100644
index 00000000..eb2938e8
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractPrivateClass.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractPrivateClass_logo.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractPrivateClass_logo.png
new file mode 100644
index 00000000..93c1da85
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractPrivateClass_logo.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractPrivateMethod.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractPrivateMethod.png
new file mode 100644
index 00000000..203ce61d
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/AbstractPrivateMethod.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Class.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Class.png
new file mode 100644
index 00000000..9ac7daa9
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Class.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Class_logo.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Class_logo.png
new file mode 100644
index 00000000..2c97193a
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Class_logo.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Constant.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Constant.png
new file mode 100644
index 00000000..c3610cb9
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Constant.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Constructor.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Constructor.png
new file mode 100644
index 00000000..cb78dcd2
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Constructor.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Destructor.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Destructor.png
new file mode 100644
index 00000000..d60215d6
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Destructor.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Function.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Function.png
new file mode 100644
index 00000000..5f05eb2f
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Function.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Global.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Global.png
new file mode 100644
index 00000000..f00968b7
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Global.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/I.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/I.png
new file mode 100644
index 00000000..874f1ba5
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/I.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Index.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Index.png
new file mode 100644
index 00000000..09cead5f
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Index.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Interface.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Interface.png
new file mode 100644
index 00000000..4ab1592e
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Interface.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Interface_logo.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Interface_logo.png
new file mode 100644
index 00000000..2c97193a
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Interface_logo.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/L.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/L.png
new file mode 100644
index 00000000..dc49c4ee
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/L.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Lminus.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Lminus.png
new file mode 100644
index 00000000..a7346d22
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Lminus.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Lplus.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Lplus.png
new file mode 100644
index 00000000..673ab01b
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Lplus.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Method.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Method.png
new file mode 100644
index 00000000..e5b154b5
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Method.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Page.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Page.png
new file mode 100644
index 00000000..4d3a3771
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Page.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Page_logo.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Page_logo.png
new file mode 100644
index 00000000..91437deb
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Page_logo.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateClass.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateClass.png
new file mode 100644
index 00000000..88431d4f
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateClass.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateClass_logo.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateClass_logo.png
new file mode 100644
index 00000000..c9d3a58a
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateClass_logo.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateMethod.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateMethod.png
new file mode 100644
index 00000000..9b9f7335
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateMethod.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateVariable.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateVariable.png
new file mode 100644
index 00000000..fef0a273
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/PrivateVariable.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/StaticMethod.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/StaticMethod.png
new file mode 100644
index 00000000..e5b154b5
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/StaticMethod.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/StaticVariable.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/StaticVariable.png
new file mode 100644
index 00000000..2a372b48
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/StaticVariable.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/T.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/T.png
new file mode 100644
index 00000000..e6f55bd8
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/T.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Tminus.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Tminus.png
new file mode 100644
index 00000000..226ba0c0
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Tminus.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Tplus.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Tplus.png
new file mode 100644
index 00000000..e9a3c4ee
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Tplus.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Variable.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Variable.png
new file mode 100644
index 00000000..2a372b48
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/Variable.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/blank.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/blank.png
new file mode 100644
index 00000000..9c1bda19
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/blank.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/class_folder.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/class_folder.png
new file mode 100644
index 00000000..be0face2
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/class_folder.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/empty.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/empty.png
new file mode 100644
index 00000000..d5683865
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/empty.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/file.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/file.png
new file mode 100644
index 00000000..8ff962fd
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/file.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/folder.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/folder.png
new file mode 100644
index 00000000..b793328d
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/folder.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/function_folder.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/function_folder.png
new file mode 100644
index 00000000..6d8861c7
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/function_folder.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/next_button.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/next_button.png
new file mode 100644
index 00000000..521f29a8
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/next_button.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/next_button_disabled.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/next_button_disabled.png
new file mode 100644
index 00000000..def00128
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/next_button_disabled.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/package.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/package.png
new file mode 100644
index 00000000..6fe427a5
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/package.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/package_folder.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/package_folder.png
new file mode 100644
index 00000000..f504b70d
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/package_folder.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/previous_button.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/previous_button.png
new file mode 100644
index 00000000..9f0c62d4
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/previous_button.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/previous_button_disabled.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/previous_button_disabled.png
new file mode 100644
index 00000000..850edcfd
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/previous_button_disabled.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/private_class_logo.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/private_class_logo.png
new file mode 100644
index 00000000..c9d3a58a
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/private_class_logo.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/tutorial.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/tutorial.png
new file mode 100644
index 00000000..14443d8c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/tutorial.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/tutorial_folder.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/tutorial_folder.png
new file mode 100644
index 00000000..6e28f012
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/tutorial_folder.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/up_button.png b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/up_button.png
new file mode 100644
index 00000000..bd9ff8cd
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/images/up_button.png
Binary files differ
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/stylesheet.css b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/stylesheet.css
new file mode 100644
index 00000000..96729b65
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/media/stylesheet.css
@@ -0,0 +1,146 @@
+a { color: #000090; text-decoration: none; }
+a:hover, a:active, a:focus { color: highlighttext; background-color: highlight; text-decoration: none; }
+
+body { background: #FFFFFF; }
+body, table { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10pt; }
+
+a img { border: 0px; }
+
+/* Page layout/boxes */
+
+.info-box { }
+.info-box-title { margin: 1em 0em 0em 0em; font-weight: normal; font-size: 14pt; color: #999999; border-bottom: 2px solid #999999; }
+.info-box-body { border: 1px solid #999999; padding: .5em; }
+.nav-bar { font-size: 8pt; white-space: nowrap; text-align: right; padding: .2em; margin: 0em 0em 1em 0em; }
+
+.oddrow { background-color: #F8F8F8; border: 1px solid #AAAAAA; padding: .5em; margin-bottom: 1em}
+.evenrow { border: 1px solid #AAAAAA; padding: .5em; margin-bottom: 1em}
+
+.page-body { max-width: 800px; margin: auto; }
+.tree { white-space: nowrap; font: icon }
+.tree dd { margin-left: 19px }
+.tree dl { margin: 0px }
+.tree-icon { vertical-align: middle; border: 0px; margin-right: 3px }
+
+/* Index formatting classes */
+
+.index-item-body { margin-top: .5em; margin-bottom: .5em}
+.index-item-description { margin-top: .25em }
+.index-item-details { font-weight: normal; font-style: italic; font-size: 8pt }
+.index-letter-section { background-color: #EEEEEE; border: 1px dotted #999999; padding: .5em; margin-bottom: 1em}
+.index-letter-title { font-size: 12pt; font-weight: bold }
+.index-letter-menu { text-align: center; margin: 1em }
+.index-letter { font-size: 12pt }
+
+/* Docbook classes */
+
+.description {}
+.short-description { font-weight: bold; color: #666666; }
+.tags { padding-left: 0em; margin-left: 3em; color: #666666; list-style-type: square; }
+.parameters { padding-left: 0em; margin-left: 3em; color: #014fbe; list-style-type: square; }
+.redefinitions { font-size: 8pt; padding-left: 0em; margin-left: 2em; }
+.package { font-weight: bold; }
+.package-title { font-weight: bold; font-size: 14pt; border-bottom: 1px solid black }
+.package-details { font-size: 85%; }
+.sub-package { font-weight: bold; }
+.tutorial { border-width: thin; border-color: #0066ff; }
+.tutorial-nav-box { width: 100%; border: 1px solid #999999; background-color: #F8F8F8; }
+.folder-title { font-style: italic; font-family: Verdana, Arial, Helvetica, sans-serif }
+
+/* Generic formatting */
+
+.field { font-weight: bold; }
+.detail { font-size: 8pt; }
+.notes { font-style: italic; font-size: 8pt; }
+.separator { background-color: #999999; height: 2px; }
+.warning { color: #FF6600; }
+.disabled { font-style: italic; color: #999999; }
+
+/* Code elements */
+
+.line-number { }
+
+.class-table { width: 100%; }
+.class-table-header { border-bottom: 1px dotted #666666; text-align: left}
+.class-name { color: #0000AA; font-weight: bold; }
+
+.method-summary { color: #009000; padding-left: 1em; font-size: 8pt; }
+.method-header { }
+.method-definition { margin-bottom: .2em }
+.method-title { color: #009000; font-weight: bold; }
+.method-name { font-weight: bold; }
+.method-signature { font-size: 85%; color: #666666; margin: .5em 0em }
+.method-result { font-style: italic; }
+
+.var-summary { padding-left: 1em; font-size: 8pt; }
+.var-header { }
+.var-title { color: #014fbe; margin-bottom: .3em }
+.var-type { font-style: italic; }
+.var-name { font-weight: bold; }
+.var-default {}
+.var-description { font-weight: normal; color: #000000; }
+
+.include-title { color: #014fbe;}
+.include-type { font-style: italic; }
+.include-name { font-weight: bold; }
+
+.const-title { color: #FF6600; }
+.const-name { font-weight: bold; }
+
+/* Syntax highlighting */
+
+.src-code { font-family: 'Courier New', Courier, monospace; font-weight: normal; }
+.src-line { font-family: 'Courier New', Courier, monospace; font-weight: normal; }
+
+.src-code a:link { padding: 1px; text-decoration: underline; color: #0000DD; }
+.src-code a:visited { text-decoration: underline; color: #0000DD; }
+.src-code a:active { background-color: #FFFF66; color: #008000; }
+.src-code a:hover { background-color: #FFFF66; text-decoration: overline underline; color: #008000; }
+
+.src-comm { color: #666666; }
+.src-id { color: #FF6600; font-style: italic; }
+.src-inc { color: #0000AA; font-weight: bold; }
+.src-key { color: #0000AA; font-weight: bold; }
+.src-num { color: #CC0000; }
+.src-str { color: #CC0000; }
+.src-sym { }
+.src-var { }
+
+.src-php { font-weight: bold; }
+
+.src-doc { color: #666666; }
+.src-doc-close-template { color: #666666 }
+.src-doc-coretag { color: #008000; }
+.src-doc-inlinetag {}
+.src-doc-internal {}
+.src-doc-tag { color: #0080CC; }
+.src-doc-template { color: #666666 }
+.src-doc-type { font-style: italic; color: #444444 }
+.src-doc-var { color: #444444 }
+
+.tute-tag { color: #009999 }
+.tute-attribute-name { color: #0000FF }
+.tute-attribute-value { color: #0099FF }
+.tute-entity { font-weight: bold; }
+.tute-comment { font-style: italic }
+.tute-inline-tag { color: #636311; font-weight: bold }
+
+/* tutorial */
+
+.authors { }
+.author { font-style: italic; font-weight: bold }
+.author-blurb { margin: .5em 0em .5em 2em; font-size: 85%; font-weight: normal; font-style: normal }
+.example { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; }
+*[class="example"] { line-height : 1.0em; }
+.listing { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; white-space: nowrap; }
+*[class="listing"] { line-height : 1.0em; }
+.release-info { font-size: 85%; font-style: italic; margin: 1em 0em }
+.ref-title-box { }
+.ref-title { }
+.ref-purpose { font-style: italic; color: #666666 }
+.ref-synopsis { }
+.title { font-weight: bold; border-bottom: 1px solid #999999; color: #999999; }
+.cmd-synopsis { margin: 1em 0em }
+.cmd-title { font-weight: bold }
+.toc { margin-left: 2em; padding-left: 0em }
+
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/packages.html b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/packages.html
new file mode 100644
index 00000000..d8c4c04a
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/packages.html
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <!-- template designed by Marco Von Ballmoos -->
+ <title></title>
+ <link rel="stylesheet" href="media/stylesheet.css" />
+ <link rel="stylesheet" href="media/banner.css" />
+ <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
+ </head>
+ <body>
+ <div class="banner">
+ <div class="banner-title">geshi</div>
+ <div class="banner-menu">
+ <form>
+ <table cellpadding="0" cellspacing="0" style="width: 100%">
+ <tr>
+ <td>
+ </td>
+ <td style="width: 2em">&nbsp;</td>
+ <td style="text-align: right">
+ </td>
+ </tr>
+ </table>
+ </form>
+ </div>
+ </div>
+ </body>
+ </html> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/todolist.html b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/todolist.html
new file mode 100644
index 00000000..95177c15
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/api/todolist.html
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <!-- template designed by Marco Von Ballmoos -->
+ <title>Todo List</title>
+ <link rel="stylesheet" href="media/stylesheet.css" />
+ <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
+ </head>
+ <body>
+ <div align="center"><h1>Todo List</h1></div>
+<h2>geshi</h2>
+<h3><a href="geshi/core/GeSHi.html#methoddisable_highlighting">GeSHi::disable_highlighting()</a></h3>
+<ul>
+ <li>Rewrite with array traversal</li>
+</ul>
+<h3><a href="geshi/core/GeSHi.html#methodenable_highlighting">GeSHi::enable_highlighting()</a></h3>
+<ul>
+ <li>Rewrite with array traversal</li>
+</ul>
+<h3><a href="geshi/core/GeSHi.html#methodenable_important_blocks">GeSHi::enable_important_blocks()</a></h3>
+<ul>
+ <li>REMOVE THIS SHIZ FROM GESHI!</li>
+</ul>
+<h3><a href="geshi/core/GeSHi.html#methodget_language_name_from_extension">GeSHi::get_language_name_from_extension()</a></h3>
+<ul>
+ <li>Re-think about how this method works (maybe make it private and/or make it a extension-&gt;lang lookup?)</li>
+ <li>static?</li>
+</ul>
+<h3><a href="geshi/core/GeSHi.html#methodhighlight_lines_extra">GeSHi::highlight_lines_extra()</a></h3>
+<ul>
+ <li>Some data replication here that could be cut down on</li>
+</ul>
+<h3><a href="geshi/core/GeSHi.html#methodload_from_file">GeSHi::load_from_file()</a></h3>
+<ul>
+ <li>Complete rethink of this and above method</li>
+</ul>
+ <p class="notes" id="credit">
+ Documentation generated on Thu, 25 Dec 2008 14:34:53 +0100 by <a href="http://www.phpdoc.org" target="_blank">phpDocumentor 1.4.2</a>
+ </p>
+ </body>
+</html> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/geshi-doc.html b/extensions/SyntaxHighlight_GeSHi/geshi/docs/geshi-doc.html
new file mode 100644
index 00000000..dc5161f4
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/geshi-doc.html
@@ -0,0 +1,4077 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+ <head>
+ <title>GeSHi Documentation 1.0.8.11</title>
+
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
+ <meta name="keywords" content="GeSHi, syntax, highlighter, colorizer, beautifier, code, generic, php, sql, css, html, syntax, highlighting, documentation" />
+ <meta name="description" content="GeSHi - Generic Syntax Highlighter for PHP. Highlight many languages, including PHP, CSS, HTML, SQL, Java and C for XHTML compliant output using this easy PHP Class. Every aspect of the highlighting is customisable, from colours and other styles to case-sensitivity checking and more. GeSHi - the best syntax highlighter in the world!" />
+
+ <style type="text/css">
+ html {
+ background-color: #e6e6e6;
+ }
+ body {
+ font-family: Verdana, Arial, sans-serif;
+ margin: 10px;
+ border: 2px solid #d0d0d0;
+ background-color: #f6f6f6;
+ padding: 10px;
+ }
+ p, ul, ol, div, blockquote, dt, dd {
+ font-size: 80%;
+ line-height: 140%;
+ letter-spacing: 1px;
+ color: #002;
+ }
+ dt {
+ font-weight: bold;
+ }
+ acronym {
+ border-bottom: 1px dotted #303030;
+ cursor: help;
+ }
+ blockquote {
+ font-weight: bold;
+ }
+ pre, .geshicode {
+ border: 1px solid #c0e6ff;
+ background-color: #e0e8ef;
+ color: #002;
+ margin:0;
+ font-size: 12px;
+ width:100%;
+ }
+ table {
+ border-collapse:collapse;
+ }
+ .geshicode pre {
+ border:none;
+ background-color:inherit;
+ font-weight:bold;
+ }
+ .geshicode .li2 td {
+ background-color:#eee;
+ }
+ .geshicode .li1 td {
+ background-color:#fff;
+ }
+ .geshicode td td {
+ padding:0 2px;
+ }
+ .geshicode td, .geshicode table {
+ width: 100%;
+ }
+ .geshicode td.ln {
+ border-right:2px solid #e0e8ef;
+ }
+ .geshicode .head {
+ text-align:center;
+ font-weight:bold;
+ }
+ code, tt, kbd {
+ font-size: 125%;
+ font-weight:normal;
+ }
+ hr {
+ height: 0;
+ border: none;
+ border-top: 1px dotted #404040;
+ width: 75%;
+ }
+ var {
+ color: blue; font-style: normal; font-family: monospace;
+ }
+ li {
+ padding-top: 2px;
+ }
+ ul ul, ol ol, div ul, div ol {
+ font-size:100%;
+ }
+ .note {
+ border: 1px solid yellow;
+ background-color: #ffc;
+ color: #220;
+ padding: 5px;
+ margin: 1em 0 0 .75em;
+ }
+ .caution {
+ border: 6px double red;
+ background-color: #fcc;
+ color: #200;
+ padding: 5px;
+ margin: 1em 0 0 .75em;
+ }
+ .caution p:first-child, .note p:first-child {
+ margin-top: 0;
+ }
+ .caution-header {
+ border: 1px solid red;
+ border-width: 1px 2px 2px 1px;
+ margin-top: -1.6em;
+ background-color: #fcc;
+ width: 10%;
+ font-weight: bold;
+ text-align: center;
+ color: #600;
+ }
+ .note-header {
+ border: 1px solid #ff0;
+ border-width: 1px 2px 2px 1px;
+ margin-top: -1.2em;
+ background-color: #ffc;
+ width: 10%;
+ font-weight: bold;
+ text-align: center;
+ color: #660;
+ }
+ .nav {
+ font-size: 70%;
+ }
+ .nav a {
+ color: #707070;
+ border: 1px solid #a0a0a0;
+ border-width: 0 1px 1px 1px;
+ border-top: 1px dotted #c0c0c0;
+ text-decoration: none;
+ padding: 1px 2px;
+ background-color: #e0e0e0;
+ -moz-border-radius-bottomleft: 3px;
+ -moz-border-radius-bottomright: 3px;
+ }
+ h1, #contents {
+ margin-top: 0;
+ margin-bottom: 0;
+ text-align: center;
+ color: #404060;
+ }
+ #contents {
+ text-align:left;
+ background:none;
+ border:none;
+ }
+ h2 {
+ border-bottom: 1px dotted #b0b0b0;
+ margin-top: 2em;
+ border-top: 1px dotted #b0b0b0;
+ background-color: #ddd;
+ margin-bottom: 0;
+ }
+ h3 {
+ margin-top: 1.6em;
+ border-bottom: 1px dotted #c0c0c0;
+ margin-bottom: 0;
+ }
+ h4 {
+ border-bottom: 1px dotted #d0d0d0;
+ margin-top: 1.2em;
+ margin-bottom: 0;
+ }
+ h2, h3, h4 {
+ color: #707070;
+ font-weight: normal;
+ }
+ a {
+ color: #7777ff;
+ }
+ sup a {
+ text-decoration: none;
+ }
+ abbr {
+ cursor: help;
+ }
+ .header p {
+ text-align: center;
+ border-bottom: 1px dotted #d0d0d0;
+ }
+
+ .header dl {
+ background-color: #e0e8ef;
+ color: #002;
+ padding: 5px;
+ }
+
+ .header img {
+ float: right;
+ margin:2.5em 1em 0 0;
+ }
+
+ /**
+ * GeSHi Dynamically Generated Stylesheet
+ * --------------------------------------
+ * Dynamically generated stylesheet for bash
+ * CSS class: , CSS id:
+ * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
+ * (http://qbnz.com/highlighter/ and http://geshi.org/)
+ * --------------------------------------
+ */
+.bash .de1, .bash .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
+.bash {font-family:monospace;}
+.bash .imp {font-weight: bold; color: red;}
+.bash li, .bash .li1 {font-weight: normal; vertical-align:top;}
+.bash .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
+.bash .li2 {font-weight: bold; vertical-align:top;}
+.bash .kw1 {color: #000000; font-weight: bold;}
+.bash .kw2 {color: #c20cb9; font-weight: bold;}
+.bash .kw3 {color: #7a0874; font-weight: bold;}
+.bash .co0 {color: #666666; font-style: italic;}
+.bash .co1 {color: #800000;}
+.bash .co2 {color: #cc0000; font-style: italic;}
+.bash .co3 {color: #000000; font-weight: bold;}
+.bash .co4 {color: #666666;}
+.bash .es1 {color: #000099; font-weight: bold;}
+.bash .es2 {color: #007800;}
+.bash .es3 {color: #007800;}
+.bash .es4 {color: #007800;}
+.bash .es5 {color: #780078;}
+.bash .es_h {color: #000099; font-weight: bold;}
+.bash .br0 {color: #7a0874; font-weight: bold;}
+.bash .sy0 {color: #000000; font-weight: bold;}
+.bash .st0 {color: #ff0000;}
+.bash .st_h {color: #ff0000;}
+.bash .nu0 {color: #000000;}
+.bash .re0 {color: #007800;}
+.bash .re1 {color: #007800;}
+.bash .re2 {color: #007800;}
+.bash .re4 {color: #007800;}
+.bash .re5 {color: #660033;}
+.bash .ln-xtra, .bash li.ln-xtra, .bash div.ln-xtra {background-color: #ffc;}
+.bash span.xtra { display:block; }
+
+/**
+ * GeSHi Dynamically Generated Stylesheet
+ * --------------------------------------
+ * Dynamically generated stylesheet for php
+ * CSS class: , CSS id:
+ * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
+ * (http://qbnz.com/highlighter/ and http://geshi.org/)
+ * --------------------------------------
+ */
+.php .de1, .php .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
+.php {font-family:monospace;}
+.php .imp {font-weight: bold; color: red;}
+.php li, .php .li1 {font-weight: normal; vertical-align:top;}
+.php .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
+.php .li2 {font-weight: bold; vertical-align:top;}
+.php .kw1 {color: #b1b100;}
+.php .kw2 {color: #000000; font-weight: bold;}
+.php .kw3 {color: #990000;}
+.php .kw4 {color: #009900; font-weight: bold;}
+.php .co1 {color: #666666; font-style: italic;}
+.php .co2 {color: #666666; font-style: italic;}
+.php .co3 {color: #0000cc; font-style: italic;}
+.php .co4 {color: #009933; font-style: italic;}
+.php .coMULTI {color: #666666; font-style: italic;}
+.php .es0 {color: #000099; font-weight: bold;}
+.php .es1 {color: #000099; font-weight: bold;}
+.php .es2 {color: #660099; font-weight: bold;}
+.php .es3 {color: #660099; font-weight: bold;}
+.php .es4 {color: #006699; font-weight: bold;}
+.php .es5 {color: #006699; font-weight: bold; font-style: italic;}
+.php .es6 {color: #009933; font-weight: bold;}
+.php .es_h {color: #000099; font-weight: bold;}
+.php .br0 {color: #009900;}
+.php .sy0 {color: #339933;}
+.php .sy1 {color: #000000; font-weight: bold;}
+.php .st0 {color: #0000ff;}
+.php .st_h {color: #0000ff;}
+.php .nu0 {color: #cc66cc;}
+.php .nu8 {color: #208080;}
+.php .nu12 {color: #208080;}
+.php .nu19 {color:#800080;}
+.php .me1 {color: #004000;}
+.php .me2 {color: #004000;}
+.php .re0 {color: #000088;}
+.php .ln-xtra, .php li.ln-xtra, .php div.ln-xtra {background-color: #ffc;}
+.php span.xtra { display:block; }
+
+/**
+ * GeSHi Dynamically Generated Stylesheet
+ * --------------------------------------
+ * Dynamically generated stylesheet for html4strict
+ * CSS class: , CSS id:
+ * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
+ * (http://qbnz.com/highlighter/ and http://geshi.org/)
+ * --------------------------------------
+ */
+.html4strict .de1, .html4strict .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
+.html4strict {font-family:monospace;}
+.html4strict .imp {font-weight: bold; color: red;}
+.html4strict li, .html4strict .li1 {font-weight: normal; vertical-align:top;}
+.html4strict .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
+.html4strict .li2 {font-weight: bold; vertical-align:top;}
+.html4strict .kw2 {color: #000000; font-weight: bold;}
+.html4strict .kw3 {color: #000066;}
+.html4strict .es0 {color: #000099; font-weight: bold;}
+.html4strict .br0 {color: #66cc66;}
+.html4strict .sy0 {color: #66cc66;}
+.html4strict .st0 {color: #ff0000;}
+.html4strict .nu0 {color: #cc66cc;}
+.html4strict .sc-2 {color: #404040;}
+.html4strict .sc-1 {color: #808080; font-style: italic;}
+.html4strict .sc0 {color: #00bbdd;}
+.html4strict .sc1 {color: #ddbb00;}
+.html4strict .sc2 {color: #009900;}
+.html4strict .ln-xtra, .html4strict li.ln-xtra, .html4strict div.ln-xtra {background-color: #ffc;}
+.html4strict span.xtra { display:block; }
+
+/**
+ * GeSHi Dynamically Generated Stylesheet
+ * --------------------------------------
+ * Dynamically generated stylesheet for css
+ * CSS class: , CSS id:
+ * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
+ * (http://qbnz.com/highlighter/ and http://geshi.org/)
+ * --------------------------------------
+ */
+.css .de1, .css .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
+.css {font-family:monospace;}
+.css .imp {font-weight: bold; color: red;}
+.css li, .css .li1 {font-weight: normal; vertical-align:top;}
+.css .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
+.css .li2 {font-weight: bold; vertical-align:top;}
+.css .kw1 {color: #000000; font-weight: bold;}
+.css .kw2 {color: #993333;}
+.css .co1 {color: #a1a100;}
+.css .co2 {color: #ff0000; font-style: italic;}
+.css .coMULTI {color: #808080; font-style: italic;}
+.css .es0 {color: #000099; font-weight: bold;}
+.css .es2 {color: #000099; font-weight: bold;}
+.css .br0 {color: #00AA00;}
+.css .sy0 {color: #00AA00;}
+.css .st0 {color: #ff0000;}
+.css .nu0 {color: #cc66cc;}
+.css .re0 {color: #cc00cc;}
+.css .re1 {color: #6666ff;}
+.css .re2 {color: #3333ff;}
+.css .re3 {color: #933;}
+.css .ln-xtra, .css li.ln-xtra, .css div.ln-xtra {background-color: #ffc;}
+.css span.xtra { display:block; }
+
+/**
+ * GeSHi Dynamically Generated Stylesheet
+ * --------------------------------------
+ * Dynamically generated stylesheet for java
+ * CSS class: , CSS id:
+ * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
+ * (http://qbnz.com/highlighter/ and http://geshi.org/)
+ * --------------------------------------
+ */
+.java .de1, .java .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
+.java {font-family:monospace;}
+.java .imp {font-weight: bold; color: red;}
+.java li, .java .li1 {font-weight: normal; vertical-align:top;}
+.java .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
+.java .li2 {font-weight: bold; vertical-align:top;}
+.java .kw1 {color: #000000; font-weight: bold;}
+.java .kw2 {color: #000066; font-weight: bold;}
+.java .kw3 {color: #003399;}
+.java .kw4 {color: #000066; font-weight: bold;}
+.java .co1 {color: #666666; font-style: italic;}
+.java .co2 {color: #006699;}
+.java .co3 {color: #008000; font-style: italic; font-weight: bold;}
+.java .coMULTI {color: #666666; font-style: italic;}
+.java .es0 {color: #000099; font-weight: bold;}
+.java .br0 {color: #009900;}
+.java .sy0 {color: #339933;}
+.java .st0 {color: #0000ff;}
+.java .nu0 {color: #cc66cc;}
+.java .me1 {color: #006633;}
+.java .me2 {color: #006633;}
+.java .ln-xtra, .java li.ln-xtra, .java div.ln-xtra {background-color: #ffc;}
+.java span.xtra { display:block; }
+
+
+ </style>
+ </head>
+ <body>
+ <h1 id="top"><abbr title="Generic Syntax Highlighter">GeSHi</abbr> Documentation</h1>
+
+<div class="header">
+
+<p>Version 1.0.8.11</p>
+
+<p><img src="http://qbnz.com/highlighter/images/geshi.png" alt="The GeSHi Logo" /></p>
+
+<dl>
+<dt>Authors:</dt>
+<dd>&copy; 2004 - 2007&#160;<a href="mailto:nigel@geshi.org">Nigel McNie</a></dd>
+
+<dd>&copy; 2007 - 2012&#160;<a href="mailto:BenBE@geshi.org">Benny Baumann</a></dd>
+
+<dd>&copy; 2008 - 2009&#160;<a href="mailto:mail@milianw.de">Milian Wolff</a></dd>
+
+<dt><abbr title="Generic Syntax Highlighter">GeSHi</abbr> Website:</dt>
+<dd><a href="http://qbnz.com/highlighter">http://qbnz.com/highlighter</a></dd>
+</dl>
+
+</div>
+
+<p>This is the documentation for <abbr title="Generic Syntax Highlighter">GeSHi</abbr> - Generic Syntax Highlighter.</p>
+
+<p>The most modern version of this document is available on the web -
+go to <a href="http://qbnz.com/highlighter/documentation.php">http://qbnz.com/highlighter/documentation.php</a> to view it.</p>
+
+<p>Any comments, questions, confusing points? Please <a href="#feedback">get in contact</a> with the developers! We
+need all the information we can get to make the use of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> and everything related to it (including this documentation)
+a breeze.</p>
+
+<h2 id="contents">Contents</h2>
+
+<div id="toc"><ul>
+<li><a href="#introduction">1 Introduction</a><ul>
+<li><a href="#features">1.1 Features</a></li>
+<li><a href="#about-geshi">1.2 About <abbr title="Generic Syntax Highlighter">GeSHi</abbr></a></li>
+<li><a href="#credits">1.3 Credits</a></li>
+<li><a href="#feedback">1.4 Feedback</a></li>
+</ul></li>
+<li><a href="#the-basics">2 The Basics</a><ul>
+<li><a href="#getting-geshi">2.1 Getting <abbr title="Generic Syntax Highlighter">GeSHi</abbr> work</a><ul>
+<li><a href="#requirements">2.1.1 Requirements</a></li>
+<li><a href="#downloading-geshi">2.1.2 Downloading <abbr title="Generic Syntax Highlighter">GeSHi</abbr></a></li>
+<li><a href="#extracting-geshi">2.1.3 Extracting <abbr title="Generic Syntax Highlighter">GeSHi</abbr></a></li>
+<li><a href="#installing-geshi">2.1.4 Installing <abbr title="Generic Syntax Highlighter">GeSHi</abbr></a></li>
+</ul></li>
+<li><a href="#basic-usage">2.2 Basic Usage</a></li>
+</ul></li>
+<li><a href="#advanced-features">3 Advanced Features</a><ul>
+<li><a href="#the-code-container">3.1 The Code Container</a></li>
+<li><a href="#line-numbers">3.2 Line Numbers</a><ul>
+<li><a href="#enabling-line-numbers">3.2.1 Enabling Line Numbers</a></li>
+<li><a href="#styling-line-numbers">3.2.2 Styling Line Numbers</a></li>
+<li><a href="#starting-line-numbers">3.2.3 Choosing a Start Number</a></li>
+</ul></li>
+<li><a href="#using-css-classes">3.3 Using <abbr title="Cascading Style Sheets">CSS</abbr> Classes</a><ul>
+<li><a href="#enabling-css-classes">3.3.1 Enabling <abbr title="Cascading Style Sheets">CSS</abbr> Classes</a></li>
+<li><a href="#setting-css-class-id">3.3.2 Setting the <abbr title="Cascading Style Sheets">CSS</abbr> class and ID</a></li>
+<li><a href="#getting-stylesheet">3.3.3 Getting the stylesheet for your code</a></li>
+<li><a href="#using-an-external-stylesheet">3.3.4 Using an External Stylesheet</a></li>
+</ul></li>
+<li><a href="#changing-styles">3.4 Changing Styles</a><ul>
+<li><a href="#the-overall-styles">3.4.1 The Overall Styles</a></li>
+<li><a href="#line-number-styles">3.4.2 Line Number Styles</a></li>
+<li><a href="#setting-keyword-styles">3.4.3 Setting Keyword Styles</a></li>
+<li><a href="#setting-comment-styles">3.4.4 Setting Comment Styles</a></li>
+<li><a href="#setting-other-styles">3.4.5 Setting Other Styles</a></li>
+</ul></li>
+<li><a href="#case-caps">3.5 Case Sensitivity and Auto Casing</a><ul>
+<li><a href="#auto-caps-nocaps">3.5.1 Auto-Caps/NoCaps</a></li>
+<li><a href="#setting-case-sensitivity">3.5.2 Setting Case Sensitivity</a></li>
+</ul></li>
+<li><a href="#changing-config">3.6 Changing the Source, Language, Config Options</a><ul>
+<li><a href="#changing-the-source">3.6.1 Changing the Source Code</a></li>
+<li><a href="#changing-the-language">3.6.2 Changing the Language</a></li>
+<li><a href="#changing-the-path">3.6.3 Changing the Language Path</a></li>
+<li><a href="#changing-the-charset">3.6.4 Changing the Character Set</a></li>
+</ul></li>
+<li><a href="#error-handling">3.7 Error Handling</a></li>
+<li><a href="#disabling-lexics">3.8 Disabling styling of some Lexics</a></li>
+<li><a href="#setting-tab-width">3.9 Setting the Tab Width</a></li>
+<li><a href="#using-strict-mode">3.10 Using Strict Mode</a></li>
+<li><a href="#adding-removing-keywords">3.11 Adding/Removing Keywords</a><ul>
+<li><a href="#adding-a-keyword">3.11.1 Adding a Keyword</a></li>
+<li><a href="#removing-a-keyword">3.11.2 Removing a Keyword</a></li>
+<li><a href="#adding-a-keyword-group">3.11.3 Adding a Keyword Group</a></li>
+<li><a href="#removing-a-keyword-group">3.11.4 Removing a Keyword Group</a></li>
+</ul></li>
+<li><a href="#headers-and-footers">3.12 Headers and Footers for Your Code</a><ul>
+<li><a href="#keyword-substitution">3.12.1 Keyword Substitution</a></li>
+<li><a href="#setting-header-content">3.12.2 Setting Header Content</a></li>
+<li><a href="#setting-footer-content">3.12.3 Setting Footer Content</a></li>
+<li><a href="#styling-header-content">3.12.4 Styling Header Content</a></li>
+<li><a href="#styling-footer-content">3.12.5 Styling Footer Content</a></li>
+</ul></li>
+<li><a href="#keyword-urls">3.13 Keyword URLs</a><ul>
+<li><a href="#setting-a-url">3.13.1 Setting a URL for a Keyword Group</a></li>
+<li><a href="#disabling-urls">3.13.2 Disabling a URL for a Keyword Group</a></li>
+<li><a href="#disabling-all-urls">3.13.3 Disabling all URLs for Keywords</a></li>
+<li><a href="#styling-links">3.13.4 Styling Links</a></li>
+<li><a href="#using-targets">3.13.5 Setting the Link Target</a></li>
+</ul></li>
+<li><a href="#using-contextual-importance">3.14 Using Contextual Importance</a></li>
+<li><a href="#highlighting-special-lines-extra">3.15 Highlighting Special Lines &#8220;Extra&#8221;</a><ul>
+<li><a href="#specifying-lines-to-highlight-extra">3.15.1 Specifying the Lines to Highlight Extra</a></li>
+<li><a href="#styles-for-highlighted-lines">3.15.2 Styles for the Highlighted Lines</a></li>
+</ul></li>
+<li><a href="#adding-ids-to-each-line">3.16 Adding IDs to Each Line</a></li>
+<li><a href="#getting-the-time-of-styling">3.17 Getting the Time of Styling</a></li>
+</ul></li>
+<li><a href="#language-files">4 Language Files</a><ul>
+<li><a href="#language-file-example">4.1 An Example Language File</a></li>
+<li><a href="#language-file-conventions">4.2 Language File Conventions</a></li>
+<li><a href="#language-file-sections">4.3 Language File Sections</a><ul>
+<li><a href="#language-file-header">4.3.1 The Header</a></li>
+<li><a href="#language-file-start-indices">4.3.2 The First Indices</a></li>
+<li><a href="#language-file-keywords">4.3.3 Keywords</a></li>
+<li><a href="#language-file-symbols-case">4.3.4 Symbols and Case Sensitivity</a></li>
+<li><a href="#language-file-styles">4.3.5 Styles for your Language File</a></li>
+<li><a href="#language-file-urls">4.3.6 URLs for Functions</a></li>
+<li><a href="#language-file-numbers-support">4.3.7 Number Highlighting Support</a></li>
+<li><a href="#language-file-oo-support">4.3.8 Object Orientation Support</a></li>
+<li><a href="#language-file-regexps">4.3.9 Using Regular Expressions</a></li>
+<li><a href="#language-file-strict-mode">4.3.10 Contextual Highlighting and Strict Mode</a></li>
+<li><a href="#language-file-parser-control">4.3.11 Special Parser Settings (Experimental)</a></li>
+<li><a href="#language-file-tidying-up">4.3.12 Tidying Up</a></li>
+</ul></li>
+<li><a href="#lang-validation">4.4 Validating your language file</a></li>
+</ul></li>
+<li><a href="#method-constant-reference">5 Method/Constant Reference</a></li>
+</ul>
+</div>
+
+<h2 id="introduction">1 Introduction</h2><div class="nav"><a href="#features">Next</a></div>
+
+<p><abbr title="Generic Syntax Highlighter">GeSHi</abbr> is exactly what the acronym stands for: a <strong>Generic Syntax Highlighter</strong>. As long
+as you have a language file for almost any computer language - whether it be a
+scripting language, object orientated, markup or anything in between - <abbr title="Generic Syntax Highlighter">GeSHi</abbr> can
+highlight it! <abbr title="Generic Syntax Highlighter">GeSHi</abbr> is extremely customisable - the same source can be highlighted
+multiple times in multiple ways - the same source even with a different language.
+<abbr title="Generic Syntax Highlighter">GeSHi</abbr> outputs XHTML strict compliant code<sup id="fnref:xhtml-strict"><a href="#fn:xhtml-strict" rel="footnote">1</a></sup>, and can
+make use of <abbr title="Cascading Style Sheets">CSS</abbr> to save on the amount of output. And what is the cost for all of this? You need
+<a href="http://php.net"><abbr title="PHP: HTML Preprocessor">PHP</abbr></a>. That&#8217;s all!</p>
+
+<h3 id="features">1.1 Features</h3><div class="nav"><a href="#introduction">Previous</a> | <a href="#introduction">Top</a> | <a href="#about-geshi">Next</a></div>
+
+<p>Here are some of the standout features of <abbr title="Generic Syntax Highlighter">GeSHi</abbr>:</p>
+
+<dl>
+<dt>Programmed in <abbr title="PHP: HTML Preprocessor">PHP</abbr>:</dt>
+<dd><abbr title="Generic Syntax Highlighter">GeSHi</abbr> is coded entirely in <abbr title="PHP: HTML Preprocessor">PHP</abbr>. This means that where ever you have <abbr title="PHP: HTML Preprocessor">PHP</abbr>, you
+can have <abbr title="Generic Syntax Highlighter">GeSHi</abbr>! Almost any free webhost supports <abbr title="PHP: HTML Preprocessor">PHP</abbr>, and <abbr title="Generic Syntax Highlighter">GeSHi</abbr> works fine with <abbr title="PHP: HTML Preprocessor">PHP</abbr> > 4.3.0<sup id="fnref:php-version-note"><a href="#fn:php-version-note" rel="footnote">2</a></sup>.</dd>
+
+<dt>Support for many languages:</dt>
+<dd><abbr title="Generic Syntax Highlighter">GeSHi</abbr> comes with more than <em>100</em> languages, including <abbr title="PHP: HTML Preprocessor">PHP</abbr>, <abbr title="Hypertext Markup Language">HTML</abbr>, <abbr title="Cascading Style Sheets">CSS</abbr>, Java, C, Lisp, <abbr title="Extensible Markup Language">XML</abbr>, Perl, Python,
+<abbr title="Assembly language">ASM</abbr> and many more!</dd>
+
+<dt>XHTML compliant output:</dt>
+<dd><abbr title="Generic Syntax Highlighter">GeSHi</abbr> produces XHTML compliant output, using stylesheets, so you need not worry about
+<abbr title="Generic Syntax Highlighter">GeSHi</abbr> ruining your claims to perfection in the standards department ;)</dd>
+
+<dt>Highly customisable:</dt>
+<dd><abbr title="Generic Syntax Highlighter">GeSHi</abbr> allows you to change the style of the output on the fly, use <abbr title="Cascading Style Sheets">CSS</abbr> classes or not, use an external
+stylesheet or not, use line numbering, change the case of output keywords&#8230; the list goes on and on!</dd>
+
+<dt>Flexible:</dt>
+<dd>Unfortunately, <abbr title="Generic Syntax Highlighter">GeSHi</abbr> is quite load/time intensive for large blocks of code. However, you want speed?
+Turn off any features you don&#8217;t like, pre-make a stylesheet and use <abbr title="Cascading Style Sheets">CSS</abbr> classes to reduce the amount of output and more -
+it&#8217;s easy to strike a balance that suits you.</dd>
+</dl>
+
+<p>This is just a taste of what you get with <abbr title="Generic Syntax Highlighter">GeSHi</abbr> - the best syntax highlighter for the web in the world!</p>
+
+<h3 id="about-geshi">1.2 About <abbr title="Generic Syntax Highlighter">GeSHi</abbr></h3><div class="nav"><a href="#features">Previous</a> | <a href="#introduction">Top</a> | <a href="#credits">Next</a></div>
+
+<p><abbr title="Generic Syntax Highlighter">GeSHi</abbr> started as a mod for the <a href="http://phpbb.net"><abbr title="PHP Burning Board">phpBB</abbr></a> forum system, to enable highlighting of more
+languages than the available (which can be roughly estimated to exactly 0 ;)). However, it quickly spawned into an
+entire project on its own. But now it has been released, work continues on a mod
+for phpBB<sup id="fnref:phpbb-note"><a href="#fn:phpbb-note" rel="footnote">3</a></sup> - and hopefully for many forum systems, blogs and other web-based systems.</p>
+
+<p>Several systems are using <abbr title="Generic Syntax Highlighter">GeSHi</abbr> now, including:</p>
+
+<ul>
+<li><a href="http://www.splitbrain.org/docuwiki/">Dokuwiki</a> - An advanced wiki engine</li>
+<li><a href="http://gtk.php.net/">gtk.php.net</a> - Their manual uses <abbr title="Generic Syntax Highlighter">GeSHi</abbr> for syntax highlighting</li>
+<li><a href="http://www.wordpress.org/">WordPress</a> - A powerful blogging system<sup id="fnref:plugin-only"><a href="#fn:plugin-only" rel="footnote">4</a></sup></li>
+<li><a href="http://www.php-fusion.co.uk/"><abbr title="PHP: HTML Preprocessor">PHP</abbr>-Fusion</a> - A constantly evolving CMS</li>
+<li><a href="http://cypreess.dione.cc/sqlm">SQL Manager</a> - A Postgres DBAL</li>
+<li><a href="http://www.mamboserver.com/">Mambo</a> - A popular open source CMS</li>
+<li><a href="http://www.mediawiki.org/">MediaWiki</a> - A leader in Wikis[^plugin-only]</li>
+<li><a href="http://www.tikiwiki.org/">TikiWiki</a> - A megapowerful Wiki/CMS</li>
+<li><a href="http://www.tikipro.org/">TikiPro</a> - Another powerful Wiki based on TikiWiki</li>
+<li><a href="http://www.wikkawiki.org/">WikkaWiki</a> - A flexible and lightweight Wiki engine</li>
+<li><a href="http://robloach.net/projects/phpscripts/rweb/">RWeb</a> - A site-building tool</li>
+</ul>
+
+<p><abbr title="Generic Syntax Highlighter">GeSHi</abbr> is the original work of <a href="mailto:nigel@geshi.org">Nigel McNie</a>. The project was later handed over to <a href="mailto:BenBE@geshi.org">Benny Baumann</a>.
+Others have helped with aspects of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> also, they&#8217;re mentioned in the <a href="THANKS"><code>THANKS</code></a> file.</p>
+
+<h3 id="credits">1.3 Credits</h3><div class="nav"><a href="#about-geshi">Previous</a> | <a href="#introduction">Top</a> | <a href="#feedback">Next</a></div>
+
+<p>Many people have helped out with <abbr title="Generic Syntax Highlighter">GeSHi</abbr>, whether by creating language files, submitting bug
+reports, suggesting new ideas or simply pointing out a new idea or something I&#8217;d missed. All
+of these people have helped to build a better <abbr title="Generic Syntax Highlighter">GeSHi</abbr>, you can see them in the <a href="THANKS"><code>THANKS</code></a>
+file.</p>
+
+<p>Do you want your name on this list? Why not make a language file, or submit a valid bug? Or perhaps help me with an
+added feature I can&#8217;t get my head around, or suggest a new feature, or even port
+<abbr title="Generic Syntax Highlighter">GeSHi</abbr> to anothe language? There&#8217;s lots you can do to help out, and I need it all :)</p>
+
+<h3 id="feedback">1.4 Feedback</h3><div class="nav"><a href="#credits">Previous</a> | <a href="#introduction">Top</a> | <a href="#the-basics">Next</a></div>
+
+<p>I need your feedback! <em>ANY</em>thing you have to say is fine, whether it be a query,
+congratulations, a bug report or complaint, I don&#8217;t care! I want to make this software
+the best it can be, and I need your help! You can contact me in the following ways:</p>
+
+<ul>
+<li><strong>E-mail:</strong> <a href="mailto:nigel@geshi.org">Nigel McNie</a>, <a href="mailto:BenBE@geshi.org">Benny Baumann</a> or better yet: use the <a href="http://lists.sourceforge.net/mailman/listinfo/geshi-users">geshi-users</a> mailinglist</li>
+<li><strong>Forums:</strong> <a href="http://sourceforge.net/forum?group_id=114997">Sourceforge.net Forums</a></li>
+<li><strong>IRC:</strong> <a href="irc://irc.freenode.net/geshi">#geshi</a> on <a href="http://freenode.net">Freenode</a></li>
+</ul>
+
+<p>Remember, any help I am grateful for :)</p>
+
+<h2 id="the-basics">2 The Basics</h2><div class="nav"><a href="#feedback">Previous</a> | <a href="#getting-geshi">Next</a></div>
+
+<p>In this section, you&#8217;ll learn a bit about <abbr title="Generic Syntax Highlighter">GeSHi</abbr>, how it works and what it uses, how to install it and how to use
+it to perform basic highlighting.</p>
+
+<h3 id="getting-geshi">2.1 Getting <abbr title="Generic Syntax Highlighter">GeSHi</abbr> work</h3><div class="nav"><a href="#the-basics">Previous</a> | <a href="#the-basics">Top</a> | <a href="#requirements">Next</a></div>
+
+<p>If you&#8217;re reading this and don&#8217;t have <abbr title="Generic Syntax Highlighter">GeSHi</abbr>, that&#8217;s a problem ;). So, how do you get your hands on it?</p>
+
+<h4 id="requirements">2.1.1 Requirements</h4><div class="nav"><a href="#getting-geshi">Previous</a> | <a href="#getting-geshi">Top</a> | <a href="#downloading-geshi">Next</a></div>
+
+<p><abbr title="Generic Syntax Highlighter">GeSHi</abbr> requires the following to be installable:</p>
+
+<ul>
+<li><strong><a href="http://php.net"><abbr title="PHP: HTML Preprocessor">PHP</abbr></a></strong>. It&#8217;s untested with anything other below 4.4.X. I hope to extend this range soon. I see no reason why
+it won&#8217;t work with any version of <abbr title="PHP: HTML Preprocessor">PHP</abbr> above 4.3.0.</li>
+<li><strong>Approximately 2 megabytes of space</strong>. The actual script is small - around 150K - but most of the size comes
+from the large number of language files (over 100!). If you&#8217;re pushed for space, make sure you don&#8217;t upload to
+your server the <code>docs/</code> or <code>contrib/</code> directory, and you may want to leave out any language files that don&#8217;t
+take your fancy either.</li>
+</ul>
+
+<p>As you can see, the requirements are very small. If <abbr title="Generic Syntax Highlighter">GeSHi</abbr> does NOT work for you in a particular version of <abbr title="PHP: HTML Preprocessor">PHP</abbr>, let
+me know why and I&#8217;ll fix it.</p>
+
+<h4 id="downloading-geshi">2.1.2 Downloading <abbr title="Generic Syntax Highlighter">GeSHi</abbr></h4><div class="nav"><a href="#requirements">Previous</a> | <a href="#getting-geshi">Top</a> | <a href="#extracting-geshi">Next</a></div>
+
+<p>There are several ways to get a copy of <abbr title="Generic Syntax Highlighter">GeSHi</abbr>. The first and easiest way of all is
+visiting <a href="http://qbnz.com/highlighter/downloads.php">http://qbnz.com/highlighter/downloads.php</a> to obtain the latest version.
+This is suitable especially when you plan on using <abbr title="Generic Syntax Highlighter">GeSHi</abbr> on an production website
+or otherwise need a stable copy for flawless operation.</p>
+
+<p>If you are somewhat more sophisticated or need a feature just recently implemented
+you might consider getting <abbr title="Generic Syntax Highlighter">GeSHi</abbr> by downloading via SVN. There are multiple ways
+for doing so and each one has its own advantages and disadvantages. Let&#8217;s cover
+the various locations in the SVN you might download from:</p>
+
+<ul>
+<li><a href="https://geshi.svn.sourceforge.net/svnroot/geshi/tags/">https://geshi.svn.sourceforge.net/svnroot/geshi/tags/</a>:<br />
+This directory holds all previous releases of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> each as a subdirectory. By downloading from here you can test your code with various old versions
+in case something has been broken recently.</li>
+<li><a href="https://geshi.svn.sourceforge.net/svnroot/geshi/branches/RELEASE_1_0_X_STABLE/geshi-1.0.X/src/">https://geshi.svn.sourceforge.net/svnroot/geshi/branches/RELEASE_1_0_X_STABLE/geshi-1.0.X/src/</a>:<br />
+This directory is the right place for you if you want to have reasonably current versions of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> but need something that is stable. This directory
+is updated once in a while between updates whenever there&#8217;s something new but which is already reasonably stable. This branch is used to form the
+actual release once the work is done.</li>
+<li><a href="https://geshi.svn.sourceforge.net/svnroot/geshi/trunk/geshi-1.0.X/src/">https://geshi.svn.sourceforge.net/svnroot/geshi/trunk/geshi-1.0.X/src/</a>:<br />
+This directory is the working directory where every new feature, patch or improvement is committed to. This directory is updated regularly, but is not
+guaranteed to be tested and stable at all times. With this version you&#8217;ll always get the latest version of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> out there, but beware of bugs! There
+will be loads of them here! So this is absolutely <strong>not recommended</strong> for productive use!</li>
+</ul>
+
+<p>If you have choosen the right SVN directory for you do a quick
+<code class="highlighted bash"><span class="kw2">svn co</span> <span class="re1">$SVNPATH</span> geshi</code> where <code class="highlighted bash"><span class="co4">$</span>SVNPATH</code> is one of the above paths and your desired version of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> will be
+downloaded into an subdirectory called &#8220;geshi&#8221;. If you got a version of <abbr title="Generic Syntax Highlighter">GeSHi</abbr>
+you can go on installing as shown below.</p>
+
+<h4 id="extracting-geshi">2.1.3 Extracting <abbr title="Generic Syntax Highlighter">GeSHi</abbr></h4><div class="nav"><a href="#downloading-geshi">Previous</a> | <a href="#getting-geshi">Top</a> | <a href="#installing-geshi">Next</a></div>
+
+<p>Packages come in <code>.zip</code>, <code>.tar.gz</code> and <code>.tar.bz2</code> format, so there&#8217;s no complaining about whether it&#8217;s available for
+you. *nix users probably want <code>.tar.gz</code> or <code>.tar.bz2</code> and windows users probably want <code>.zip</code>.
+And those lucky to download it directly from SVN don&#8217;t even need to bother extracting <abbr title="Generic Syntax Highlighter">GeSHi</abbr>.</p>
+
+<p>To extract <abbr title="Generic Syntax Highlighter">GeSHi</abbr> in Linux (<code>.tar.gz</code>):</p>
+
+<ol>
+<li>Open a shell</li>
+<li><code class="highlighted bash"><span class="kw3">cd</span></code> to the directory where the archive lies</li>
+<li>Type <code class="highlighted bash"><span class="kw2">tar</span> <span class="re5">-xzvf</span> <span class="br0">&#91;</span>filename<span class="br0">&#93;</span></code> where <code>[filename]</code> is the name of the archive (typically <code>GeSHi-1.X.X.tar.gz</code>)</li>
+<li><abbr title="Generic Syntax Highlighter">GeSHi</abbr> will be extracted to its own directory</li>
+</ol>
+
+<p>To extract <abbr title="Generic Syntax Highlighter">GeSHi</abbr> in Windows (<code>.zip</code>):</p>
+
+<ol>
+<li>Open Explorer</li>
+<li>Navigate to the directory where the archive lies</li>
+<li>Extract the archive. The method you use will depend on your configuration. Some people can right-click upon
+the archive and select &#8220;Extract&#8221; from there, others may have to drag the archive and drop it upon an extraction program.</li>
+</ol>
+
+<p>To extract from <code>.zip</code> you&#8217;ll need an unzipping program - <code class="highlighted bash"><span class="kw2">unzip</span></code> in Linux, or 7-Zip, WinZip, WinRAR or similar for Windows.</p>
+
+<h4 id="installing-geshi">2.1.4 Installing <abbr title="Generic Syntax Highlighter">GeSHi</abbr></h4><div class="nav"><a href="#extracting-geshi">Previous</a> | <a href="#getting-geshi">Top</a> | <a href="#basic-usage">Next</a></div>
+
+<p>Installing <abbr title="Generic Syntax Highlighter">GeSHi</abbr> is a snap, even for those most new to <abbr title="PHP: HTML Preprocessor">PHP</abbr>. There&#8217;s no tricks involved. Honest!</p>
+
+<p><abbr title="Generic Syntax Highlighter">GeSHi</abbr> is nothing more than a <abbr title="PHP: HTML Preprocessor">PHP</abbr> class with related language support files. Those of you familiar with <abbr title="PHP: HTML Preprocessor">PHP</abbr> can then
+guess how easy the installation will be: simply copy it into your include path somewhere. You can put it wherever you
+like in this include path. I recommend that you put the language files in a subdirectory of your include path too -
+perhaps the same subdirectory that geshi.php is in. <strong>Remember this path</strong> for later.</p>
+
+<p>If you don&#8217;t know what an include path is, don&#8217;t worry. Simply copy <abbr title="Generic Syntax Highlighter">GeSHi</abbr> to your webserver. So for example, say your
+site is at <code>http://mysite.com/myfolder</code>, you can copy <abbr title="Generic Syntax Highlighter">GeSHi</abbr> to your site so the directory structure is like this:</p>
+
+<pre><code>http://mysite.com/myfolder/geshi/[language files]
+http://mysite.com/myfolder/geshi.php
+</code></pre>
+
+<p>Or you can put it in any subdirectory you like:</p>
+
+<pre><code>http://mysite.com/myfolder/includes/geshi/[language files]
+http://mysite.com/myfolder/includes/geshi.php
+</code></pre>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>When using <abbr title="Generic Syntax Highlighter">GeSHi</abbr> on a live site, the only directory required is the <code>geshi/</code> subdirectory. Both <code>contrib/</code> and <code>docs/</code> are
+worthless, and furthermore, as some people discovered, one of the files in contrib had a security hole (fixed as of 1.0.7.3).
+I suggest you delete these directories from any live site they are on.</p>
+
+</div>
+
+<h3 id="basic-usage">2.2 Basic Usage</h3><div class="nav"><a href="#installing-geshi">Previous</a> | <a href="#the-basics">Top</a> | <a href="#advanced-features">Next</a></div>
+
+<p>Use of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> is very easy. Here&#8217;s a simple example:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span>13
+<span class="xtra li2"><span class="de2">14</span></span>15
+<span class="xtra li2"><span class="de2">16</span></span>17
+<span class="xtra li2"><span class="de2">18</span></span>19
+<span class="xtra li2"><span class="de2">20</span></span>21
+<span class="xtra li2"><span class="de2">22</span></span>23
+<span class="xtra li2"><span class="de2">24</span></span>25
+<span class="xtra li2"><span class="de2">26</span></span>27
+<span class="xtra li2"><span class="de2">28</span></span></pre></td><td class="de1"><pre class="de1"><span class="co1">//</span>
+<span class="xtra li2"><span class="de2"><span class="co1">// Include the GeSHi library</span></span></span><span class="co1">//</span>
+<span class="xtra li2"><span class="de2"><span class="kw1">include_once</span> <span class="st_h">'geshi.php'</span><span class="sy0">;</span></span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="co1">//</span></span></span><span class="co1">// Define some source to highlight, a language to use</span>
+<span class="xtra li2"><span class="de2"><span class="co1">// and the path to the language files</span></span></span><span class="co1">//</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="re0">$source</span> <span class="sy0">=</span> <span class="st_h">'$foo = 45;</span>
+<span class="xtra li2"><span class="de2"><span class="st_h">for ( $i = 1; $i &lt; $foo; $i++ )</span></span></span><span class="st_h">{</span>
+<span class="xtra li2"><span class="de2"><span class="st_h"> &nbsp;echo &quot;$foo\n&quot;;</span></span></span><span class="st_h"> &nbsp;--$foo;</span>
+<span class="xtra li2"><span class="de2"><span class="st_h">}'</span><span class="sy0">;</span></span></span><span class="re0">$language</span> <span class="sy0">=</span> <span class="st_h">'php'</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="co1">//</span>
+<span class="xtra li2"><span class="de2"><span class="co1">// Create a GeSHi object</span></span></span><span class="co1">//</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="re0">$geshi</span> <span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="re0">$source</span><span class="sy0">,</span> <span class="re0">$language</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="co1">//</span>
+<span class="xtra li2"><span class="de2"><span class="co1">// And echo the result!</span></span></span><span class="co1">//</span>
+<span class="xtra li2"><span class="de2"><span class="kw1">echo</span> <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span></pre></td></tr></tbody></table>
+
+<p>As you can see, there&#8217;s only three really important lines:</p>
+
+<p><code class="highlighted php"><span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st_h">'geshi.php'</span><span class="br0">&#41;</span></code></p>
+
+<p>This line includes the <abbr title="Generic Syntax Highlighter">GeSHi</abbr> class for use</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span> <span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="re0">$source</span><span class="sy0">,</span> <span class="re0">$language</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>This line creates a new <abbr title="Generic Syntax Highlighter">GeSHi</abbr> object, holding the source and the language you want to use for highlighting.</p>
+
+<p><code class="highlighted php"><span class="kw1">echo</span> <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>This line spits out the result :)</p>
+
+<p>So as you can see, simple usage of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> is really easy. Just create a new <abbr title="Generic Syntax Highlighter">GeSHi</abbr> object and get the code!</p>
+
+<p>Since version 1.0.2, there is a function included with <abbr title="Generic Syntax Highlighter">GeSHi</abbr> called <code>geshi_highlight</code>. This behaves exactly as the php
+function <code class="highlighted php"><span class="kw3">highlight_string</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code> behaves - all you do is pass it the language you want to use to highlight and the
+path to the language files as well as the source. Here are some examples:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span>13
+<span class="xtra li2"><span class="de2">14</span></span>15
+<span class="xtra li2"><span class="de2">16</span></span>17
+<span class="xtra li2"><span class="de2">18</span></span>19
+<span class="xtra li2"><span class="de2">20</span></span>21
+</pre></td><td class="de1"><pre class="de1"><span class="co1">// Simply echo the highlighted code</span>
+<span class="xtra li2"><span class="de2">geshi_highlight<span class="br0">&#40;</span><span class="re0">$source</span><span class="sy0">,</span> <span class="st_h">'php'</span><span class="sy0">,</span> <span class="re0">$path</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="co1">// Get the code back, for use later</span></span></span><span class="re0">$code</span> <span class="sy0">=</span> geshi_highlight<span class="br0">&#40;</span><span class="re0">$source</span><span class="sy0">,</span> <span class="st_h">'java'</span><span class="sy0">,</span> <span class="re0">$path</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="co1">// Check if there is an error with parsing this code</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><a href="http://www.php.net/ob_start"><span class="kw3">ob_start</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="re0">$result</span> <span class="sy0">=</span> geshi_highlight<span class="br0">&#40;</span><span class="re0">$source</span><span class="sy0">,</span> <span class="st_h">'perl'</span><span class="sy0">,</span> <span class="re0">$path</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span><span class="re0">$code</span> <span class="sy0">=</span> <a href="http://www.php.net/ob_get_contents"><span class="kw3">ob_get_contents</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><a href="http://www.php.net/ob_end_clean"><span class="kw3">ob_end_clean</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="kw1">if</span> <span class="br0">&#40;</span> <span class="sy0">!</span><span class="re0">$result</span> <span class="br0">&#41;</span></span></span><span class="br0">&#123;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="co1">// There was an error with highlighting...</span></span></span><span class="br0">&#125;</span>
+<span class="xtra li2"><span class="de2"><span class="kw1">else</span></span></span><span class="br0">&#123;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="co1">// All OK :)</span></span></span><span class="br0">&#125;</span></pre></td></tr></tbody></table>
+
+<p>However, these are really simple examples and doesn&#8217;t even begin to cover all the advanced features of <abbr title="Generic Syntax Highlighter">GeSHi</abbr>.
+If you want to learn more, continue on to section 3: Advanced Features.</p>
+
+<h2 id="advanced-features">3 Advanced Features</h2><div class="nav"><a href="#basic-usage">Previous</a> | <a href="#the-code-container">Next</a></div>
+
+<p>This section documents the advanced features of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> - strict mode, using <abbr title="Cascading Style Sheets">CSS</abbr> classes, changing styles on the fly,
+disabling highlighting of some things and more.</p>
+
+<p>In this section there are many code snippets. For all of these, you should assume that the <abbr title="Generic Syntax Highlighter">GeSHi</abbr> library has been
+included, and a <abbr title="Generic Syntax Highlighter">GeSHi</abbr> object has been created and is referenced by the variable <code class="highlighted php"><span class="re0">$geshi</span></code>. Normally, the
+source, language and path used are arbitary.</p>
+
+<h3 id="the-code-container">3.1 The Code Container</h3><div class="nav"><a href="#advanced-features">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#line-numbers">Next</a></div>
+
+<p>The <strong>Code Container</strong> has a fundamental effect on the layout of your code before you even begin to style. What is the
+Code Container? It&#8217;s the bit of markup that goes around your code to contain it. By default your code is surrounded
+by a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code>, but you can also specify a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code>.</p>
+
+<p>The <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code> header is the default. If you&#8217;re familiar with <abbr title="Hypertext Markup Language">HTML</abbr> you&#8217;ll know that whitespace is rendered
+&#8220;as is&#8221; by a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code> element. The advantage for you is that if you use <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code> the whitespace
+you use will appear pretty much exactly how it is in the source, and what&#8217;s more <abbr title="Generic Syntax Highlighter">GeSHi</abbr> won&#8217;t have to add a whole
+lot of <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">br</span> <span class="sy0">/</span>&gt;</span></code>&#8217;s and non-breaking spaces (<code class="highlighted html4strict"><span class="sc1">&amp;nbsp;</span></code>) to your code to indent it. This saves
+you source code (and your valuable visitors waiting time and your bandwidth).</p>
+
+<p>But if you don&#8217;t like <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code> or it looks stupid in your browser no matter what styles you try to
+apply to it or something similar, you might want to use a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code> instead. A <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code> will
+result in more source - <abbr title="Generic Syntax Highlighter">GeSHi</abbr> will have to insert whitespace markup - but in return you can wrap long lines of code
+that would otherwise have your browser&#8217;s horizontal scrollbar appear. Of course with <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code> you can
+<em>not</em> wrap lines if you please. The highlighter demo at the <a href="http://qbnz.com/highlighter"><abbr title="Generic Syntax Highlighter">GeSHi</abbr> home page</a> uses the <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code>
+approach for this reason.</p>
+
+<p>At this stage there isn&#8217;t an option to wrap the code in <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">code</span>&gt;</span></code> tags (unless you use the function
+<code>geshi_highlight</code>), partly because of the inconsistent and unexpected ways stuff in <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">code</span>&gt;</span></code> tags is
+highlighted. Besides, <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">code</span>&gt;</span></code> is an inline element. But this may become an option in future versions.</p>
+
+<p>As of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.7.2 there is a new header type, that specifies that the code should not be wrapped in anything at all.</p>
+
+<p>Another requested addition has been made in <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.7.20 to force <abbr title="Generic Syntax Highlighter">GeSHi</abbr> to create a block around the highlighted
+source even if this wasn&#8217;t necessary, thus styles that are applied to the output of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> can directly influence
+the code only even if headers and footers are present.</p>
+
+<p>To change/set the header to use, you call the <strong><code class="highlighted php">set_header_type<span class="br0">&#40;</span><span class="br0">&#41;</span></code></strong> method. It has one required argument which
+defines the container type. Available are:</p>
+
+<dl>
+<dt><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_header_type</span><span class="br0">&#40;</span>GESHI_HEADER_DIV<span class="br0">&#41;</span><span class="sy0">;</span></code></dt>
+<dd>
+<p>Puts a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code> around both, code and linenumbers. Whitespace is converted to <code class="highlighted html4strict"><span class="sc1">&amp;nbsp;</span></code>
+sequences (i.e. one whitespace and the html entity of a non-breaking whitespace) to keep your indendation level
+in tact. Tabs are converted as well and you can manually <a href="#setting-tab-width">define the tab-width</a>. Lines are automatically wrapped.
+Linenumbers are created using an ordered list.</p>
+</dd>
+
+<dt><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_header_type</span><span class="br0">&#40;</span>GESHI_HEADER_PRE<span class="br0">&#41;</span><span class="sy0">;</span></code></dt>
+<dd>
+<p>Wraps code and linenumbers in a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code> container. This way whitespace is kept as-is and thus
+this header produces less overhead then the <code>GESHI_HEADER_DIV</code> header type. Since linenumbers are still
+created using an ordered list this header type produces <strong>invalid <abbr title="Hypertext Markup Language">HTML</abbr></strong>.</p>
+</dd>
+
+<dt><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_header_type</span><span class="br0">&#40;</span>GESHI_HEADER_PRE_VALID<span class="br0">&#41;</span><span class="sy0">;</span></code></dt>
+<dd><em><small>Available since 1.0.8</small></em></dd>
+
+<dd>
+<p>When linenumbers are disabled, this behaves just like <code>GESHI_HEADER_PRE</code>. In the other case though, a
+<code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code> is used to wrap the code and linenumbers and the <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code> is put inside the list
+items (<code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">li</span>&gt;</span></code>). This means slightly larger <abbr title="Hypertext Markup Language">HTML</abbr> output compared to <code>GESHI_HEADER_PRE</code>, but the
+output is <strong>valid <abbr title="Hypertext Markup Language">HTML</abbr></strong>.</p>
+</dd>
+
+<dt><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_header_type</span><span class="br0">&#40;</span>GESHI_HEADER_PRE_TABLE<span class="br0">&#41;</span><span class="sy0">;</span></code></dt>
+<dd><em><small>Available since 1.0.8</small></em></dd>
+
+<dd>
+<p>Once again a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code> tag wraps the output. This time though no ordered list is used to create an ordered list,
+but instead we use a table with two cells in a single row. The left cell contains a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code> tag which holds all
+linenumbers. The second cell holds the highlighted code, also wrapped in a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code> tag, just like with
+<code>GESHI_HEADER_PRE</code>.</p>
+</dd>
+
+<dd>
+<p>This produces <strong>valid <abbr title="Hypertext Markup Language">HTML</abbr></strong> and works around the nasty selection behaviour of Firefox and other Gecko based
+browsers, see <a href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1651996&amp;group_id=114997&amp;atid=670231">SF#1651996</a> for more information.</p>
+</dd>
+
+<dt><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_header_type</span><span class="br0">&#40;</span>GESHI_HEADER_NONE<span class="br0">&#41;</span><span class="sy0">;</span></code></dt>
+<dd><em><small>Available since 1.0.7.2</small></em></dd>
+
+<dd>
+<p>No wrapper is added.</p>
+</dd>
+</dl>
+
+<p>Those are the only arguments you should pass to <code class="highlighted php">set_header_type</code>. Passing anything else may cause inconsistencies
+in what is used as the Code Container (although it <em>should</em> simply use a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code>). Better not to risk it.</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>GESHI_HEADER_DIV, GESHI_HEADER_PRE, etc. are <em>constants</em>, so don&#8217;t put them in strings!</p>
+
+</div>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>The default styles for the <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code> and <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code> <em>will be different</em>, especially if you use
+ line numbers!</p>
+
+<p>I have found that a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code> results in code that is smaller than for that of a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code>, you
+ should rectify this difference by using <strong><code class="highlighted php">set_overall_style<span class="br0">&#40;</span><span class="br0">&#41;</span></code></strong> if you need to. But be aware of this
+ difference for if you are changing the header type!</p>
+
+</div>
+
+<h3 id="line-numbers">3.2 Line Numbers</h3><div class="nav"><a href="#the-code-container">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#enabling-line-numbers">Next</a></div>
+
+<p><abbr title="Generic Syntax Highlighter">GeSHi</abbr> has the ability to add line numbers to your code (see the demo available at <a href="http://qbnz.com/highlighter/demo.php">http://qbnz.com/highlighter/demo.php</a>
+to see what can be achieved). Line numbers are a great way to make your code look professional, especially if you use the
+fancy line numbers feature.</p>
+
+<p>There are multiple methods for highlighting line numbers, but none of them is perfect. Of the various ways to highlight
+line numbers <abbr title="Generic Syntax Highlighter">GeSHi</abbr> itself implements 2 different approaches, but allows you
+by the way it generates the code to do the line numbers yourself if necessary - but more on this case later.</p>
+
+<p>The easiest approach is using the <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">ol</span>&gt;</span></code>-tag for generating the line numbers, but
+even though this is the easiest one there&#8217;s a big drawback with this one when
+using Gecko-engine based browsers like Firefox or Konqueror. In these browsers
+this approach will select the line numbers along with the code or will include extra markup in the selection.</p>
+
+<p>The other approach has been implemented in the 1.0.8 release of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> with the <code class="highlighted php">GESHI_HEADER_PRE_TABLE</code> header type.
+When using this header type the line numbers are rendered apart from the source
+in a table cell while the actual source is formatted as if the <code class="highlighted php">GESHI_HEADER_PRE</code> header had been used.
+This approach works with Firefox and other Gecko-based browsers so far although extreme care
+has to be taken when applying styles to your source as Windows has some fonts
+where bold font is of different height than normal or italic text of the same fontface.</p>
+
+<h4 id="enabling-line-numbers">3.2.1 Enabling Line Numbers</h4><div class="nav"><a href="#line-numbers">Previous</a> | <a href="#line-numbers">Top</a> | <a href="#styling-line-numbers">Next</a></div>
+
+<p>To highlight a source with line numbers, you call the <code class="highlighted php">enable_line_numbers<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">enable_line_numbers</span><span class="br0">&#40;</span><span class="re0">$flag</span><span class="br0">&#41;</span><span class="sy0">;</span></code>
+Where <code class="highlighted php"><span class="re0">$flag</span></code> is one of the following:</p>
+
+<ul>
+<li><code>GESHI_NORMAL_LINE_NUMBERS</code> - Use normal line numbering</li>
+<li><code>GESHI_FANCY_LINE_NUMBERS</code> - Use fancy line numbering</li>
+<li><code>GESHI_NO_LINE_NUMBERS</code> - Disable line numbers (default)</li>
+</ul>
+
+<p>Normal line numbers means you specify a style for them, and that style gets applied to all of them. Fancy line numbers
+means that you can specify a different style for each n<sup>th</sup> line number. You change the value of n (default 5):</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">enable_line_numbers</span><span class="br0">&#40;</span>GESHI_FANCY_LINE_NUMBERS<span class="sy0">,</span> <span class="nu0">37</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>The second parameter is not used in any other mode. Setting it to <code>0</code> is the same as simply using normal line numbers.
+Setting it to <code>1</code> applies the fancy style to every line number.</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>The values above are CONSTANTS - so don&#8217;t put them in strings!</p>
+
+</div>
+
+<h4 id="styling-line-numbers">3.2.2 Styling Line Numbers</h4><div class="nav"><a href="#enabling-line-numbers">Previous</a> | <a href="#line-numbers">Top</a> | <a href="#starting-line-numbers">Next</a></div>
+
+<p>As of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.2, line numbers are added by the use of ordered lists. This solves the old issues of line number
+styles inheriting from styles meant for the code. Also, this solves an important issue about selecting code. For
+example, line numbers look nice, but when you go to select the code in your browser to copy it? You got the line
+numbers too! Not such a good thing, but thankfully this issue is now solved. What is the price? Unfortunately the
+whole way that styles are inherited/used has changed for those of you who were familiar with 1.0.1, and there is
+quite a bit more <abbr title="Hypertext Markup Language">HTML</abbr> involved. So think carefully about these things before you enable line numbers.</p>
+
+<p>Now, onto how to style line numbers:</p>
+
+<p>Styles are set for line numbers using the <code class="highlighted php">set_line_style<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_line_style</span><span class="br0">&#40;</span><span class="st_h">'background: #fcfcfc;'</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>If you&#8217;re using Fancy Line Numbers mode, you pass a second string for the style of the n<sup>th</sup> line number:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_line_style</span><span class="br0">&#40;</span><span class="st_h">'background: #fcfcfc;'</span><span class="sy0">,</span> <span class="st_h">'background: #f0f0f0;'</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>The second style will have no effect if you&#8217;re not using Fancy Line Numbers mode.</p>
+
+<p>By default, the styles you pass overwrite the current styles. Add a boolean &#8220;true&#8221; after the styles you specify to combine them with the current styles:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span></pre></td><td class="de1"><pre class="de1"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_line_style</span><span class="br0">&#40;</span><span class="st_h">'background: red;'</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="co1">// or, for fancy line numbers</span>
+<span class="xtra li2"><span class="de2"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_line_style</span><span class="br0">&#40;</span><span class="st_h">'background: red;'</span><span class="sy0">,</span> <span class="st_h">'background: blue;'</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span></pre></td></tr></tbody></table>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>Due to a bug with Firefox the issue that should have been fixed with 1.0.2 has reappeared in another form as Firefox
+ includes extra text\markup into plaintext versions of webpage copies. This can sometimes be useful (actually it&#8217;s
+ used to get the plaintext version of this documentation), but more often is quite annoying. Best practice so far is
+ to either not use line numbers, or offer the visitor of your page a plaintext version of your source. To learn more
+ have a look at the <a href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1651996&amp;group_id=114997&amp;atid=670231">SF.net BugTracker Issue #1651996</a>. This will hopefully be fixed in <abbr title="Generic Syntax Highlighter">GeSHi</abbr> version 1.2
+ or as soon as Firefox provides webdevelopers with adequate ways to control this feature - whichever comes first!</p>
+
+</div>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>When you set line number styles, the code will inherit those styles! This is the main issue to come out of the 1.0.2
+ release. If you want your code to be styled in a predictable manner, you&#8217;ll have to call the <code class="highlighted php">set_code_style<span class="br0">&#40;</span><span class="br0">&#41;</span></code>
+ method to rectify this problem.</p>
+
+<p>Note also that you cannot apply background colours to line numbers unless you use <code class="highlighted php">set_overall_style<span class="br0">&#40;</span><span class="br0">&#41;</span></code>.
+ Here&#8217;s how you&#8217;d style:</p>
+
+<ol>
+<li><p>Use <code class="highlighted php">set_overall_style<span class="br0">&#40;</span><span class="br0">&#41;</span></code> to style the overall code block. For example, you can set the border
+style/colour, any margins and padding etc. using this method. <strong>In addition:</strong> set the background colour for
+all the line numbers using this method.</p></li>
+<li><p>Use <code class="highlighted php">set_line_style<span class="br0">&#40;</span><span class="br0">&#41;</span></code> to style the foreground of the line numbers. For example, you can set the colour,
+weight, font, padding etc. of the line numbers using this method.</p></li>
+<li><p>Use <code class="highlighted php">set_code_style<span class="br0">&#40;</span><span class="br0">&#41;</span></code> to explicitly override the styles you set for line numbers using
+<code class="highlighted php">set_line_style</code>. For example, if you&#8217;d set the line numbers to be bold (or even if you&#8217;d only set
+the fancy line number style to be bold), and you didn&#8217;t actually want your code to be bold, you&#8217;d make sure
+that <code class="highlighted css"><span class="kw1">font-weight</span><span class="sy0">:</span> <span class="kw2">normal</span><span class="sy0">;</span></code> was in the stylesheet rule you passed to <code class="highlighted php">set_code_style<span class="br0">&#40;</span><span class="br0">&#41;</span></code>.</p>
+
+<p>This is the one major change from <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.1 - make sure you become familiar with this, and make sure that you check
+any code you have already styled with 1.0.1 when you upgrade to make sure nothing bad happens to it.</p></li>
+</ol>
+
+</div>
+
+<h4 id="starting-line-numbers">3.2.3 Choosing a Start Number</h4><div class="nav"><a href="#styling-line-numbers">Previous</a> | <a href="#line-numbers">Top</a> | <a href="#using-css-classes">Next</a></div>
+
+<p>As of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.2, you can now make the line numbers start at any number, rather than just 1. This feature is useful
+if you&#8217;re highlighting code from a file from around a certain line number in that file, as an additional guide to
+those who will view the code. You set the line numbers by calling the <code class="highlighted php">start_line_numbers_at<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">start_line_numbers_at</span><span class="br0">&#40;</span><span class="re0">$number</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p><code class="highlighted php"><span class="re0">$number</span></code> must be a positive integer (or zero). If it is not, <abbr title="Generic Syntax Highlighter">GeSHi</abbr> will convert it anyway.</p>
+
+<p>If you have not enabled line numbers, this will have no effect.</p>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>Although I&#8217;d like <abbr title="Generic Syntax Highlighter">GeSHi</abbr> to have XHTML strict compliance, this feature will break compliancy (however transitional
+ compliancy remains). This is because the only widely supported way to change the start value for line numbers is
+ by using the <strong>start=&#8221;number&#8221;</strong> attribute of the <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">ol</span>&gt;</span></code> tag. Although <abbr title="Cascading Style Sheets">CSS</abbr> does provide a mechanism for
+ doing this, it is only supported in Opera versions 7.5 and above (not even Firefox supports this).</p>
+
+</div>
+
+<h3 id="using-css-classes">3.3 Using <abbr title="Cascading Style Sheets">CSS</abbr> Classes</h3><div class="nav"><a href="#starting-line-numbers">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#enabling-css-classes">Next</a></div>
+
+<p>Using <abbr title="Cascading Style Sheets">CSS</abbr> to highlight your code instead of in-lining the styles is a definate bonus. Not only is it more compliant
+(the w3c is deprecating the style attribute in XHTML 2.0) but it results in far less outputted code - up to a whopping
+90% saving - which makes a &#42;huge&#42; difference to those unlucky of us on modems!</p>
+
+<h4 id="enabling-css-classes">3.3.1 Enabling <abbr title="Cascading Style Sheets">CSS</abbr> Classes</h4><div class="nav"><a href="#using-css-classes">Previous</a> | <a href="#using-css-classes">Top</a> | <a href="#setting-css-class-id">Next</a></div>
+
+<p>By default, <abbr title="Generic Syntax Highlighter">GeSHi</abbr> doesn&#8217;t use the classes, so it&#8217;s easy just to whack out some highlighted code if you need without
+worrying about stylesheets. However, if you&#8217;re a bit more organised about it, you should use the classes ;). To turn
+the use of classes on, you call the <code class="highlighted php">enable_classes<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">enable_classes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>If you want to turn classes OFF for some reason later:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">enable_classes</span><span class="br0">&#40;</span><span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>If classes are enabled when <code class="highlighted php">parse_code<span class="br0">&#40;</span><span class="br0">&#41;</span></code> is called, then the resultant source will use <abbr title="Cascading Style Sheets">CSS</abbr> classes in the
+output, otherwise it will in-line the styles. The advantages of using classes are great - the reduction in source will
+be very noticeable, and what&#8217;s more you can use one stylesheet for several different highlights on the same page. In
+fact, you can even use an external stylesheet and link to that, saving even more time and source (because stylesheets
+are cached by browsers).</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>There have been problems with inline styles and the Symbol Highlighting added in 1.0.7.21. If you can you should
+ therefore turn <abbr title="Cascading Style Sheets">CSS</abbr> classes ON to avoid those issues. Although latest reworks in 1.0.8 should fix most of those issues.</p>
+
+</div>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>This should be the very first method you call after creating a new <abbr title="Generic Syntax Highlighter">GeSHi</abbr> object! That way, various other methods
+ can act upon your choice to use classes correctly. In theory, you could call this method just before parsing the
+ code, but this may result in unexpected behaviour.</p>
+
+</div>
+
+<h4 id="setting-css-class-id">3.3.2 Setting the <abbr title="Cascading Style Sheets">CSS</abbr> class and ID</h4><div class="nav"><a href="#enabling-css-classes">Previous</a> | <a href="#using-css-classes">Top</a> | <a href="#getting-stylesheet">Next</a></div>
+
+<p>You can set an overall <abbr title="Cascading Style Sheets">CSS</abbr> class and id for the code. This is a good feature that allows you to use the same
+stylesheet for many different snippets of code. You call <code class="highlighted php">set_overall_class<span class="br0">&#40;</span><span class="br0">&#41;</span></code> and <code class="highlighted php">set_overall_id</code>
+to accomplish this:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span></pre></td><td class="de1"><pre class="de1"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_overall_class</span><span class="br0">&#40;</span><span class="st_h">'mycode'</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_overall_id</span><span class="br0">&#40;</span><span class="st_h">'dk48ck'</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span></pre></td></tr></tbody></table>
+
+<p>The default classname is the name of the language being used. This means you can use just the one stylesheet for all
+sources that use the same language, and incidentally means that you probably won&#8217;t have to call these methods too often.</p>
+
+<p><abbr title="Cascading Style Sheets">CSS</abbr> IDs are supposed to be unique, and you should use them as such. Basically, you can specify an ID for your code
+and then use that ID to highlight that code in a unique way. You&#8217;d do this for a block of code that you expressly
+wanted to be highlighted in a different way (see the section below on gettting the stylesheet for your code for an example).</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>As of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.8 the class name will always include the language name used for highlighting.</p>
+
+</div>
+
+<h4 id="getting-stylesheet">3.3.3 Getting the stylesheet for your code</h4><div class="nav"><a href="#setting-css-class-id">Previous</a> | <a href="#using-css-classes">Top</a> | <a href="#using-an-external-stylesheet">Next</a></div>
+
+<p>The other half of using <abbr title="Cascading Style Sheets">CSS</abbr> classes is getting the stylesheet for use with the classes. <abbr title="Generic Syntax Highlighter">GeSHi</abbr> makes it very easy to
+get a stylesheet for your code, with one easy method call:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span>13
+<span class="xtra li2"><span class="de2">14</span></span>15
+<span class="xtra li2"><span class="de2">16</span></span>17
+</pre></td><td class="de1"><pre class="de1"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">enable_classes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="co1">// Here we have code that will spit out a header for</span>
+<span class="xtra li2"><span class="de2"><span class="co1">// a stylesheet. For example:</span></span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="kw1">echo</span> <span class="st_h">'&lt;html&gt;</span></span></span><span class="st_h">&lt;head&gt;&lt;title&gt;Code&lt;/title&gt;</span>
+<span class="xtra li2"><span class="de2"><span class="st_h">&lt;style type=&quot;text/css&quot;&gt;</span></span></span><span class="st_h">&lt;!--'</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="co1">// Echo out the stylesheet for this code block</span></span></span><span class="kw1">echo</span> <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">get_stylesheet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="co1">// And continue echoing the page</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="kw1">echo</span> <span class="st_h">'--&gt;</span>
+<span class="xtra li2"><span class="de2"><span class="st_h">&lt;/style&gt;&lt;/head&gt;</span></span></span><span class="st_h">&lt;body&gt;'</span><span class="sy0">;</span></pre></td></tr></tbody></table>
+
+<p>The <code class="highlighted php">get_stylesheet<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method gets the stylesheet for your code in one easy call. All you need to do
+is output it in the correct place. As you can also see, you don&#8217;t even have to enable class usage to get the
+stylesheet nessecary either - however not enabling classes but using the stylesheet may result in problems later.</p>
+
+<p>By default, <code class="highlighted php">get_stylesheet<span class="br0">&#40;</span><span class="br0">&#41;</span></code> tries to echo the least amount of code possible. Although currently it doesn&#8217;t
+check to see if a certain lexic is even in the source, you can expect this feature in the future. At least for the
+present however, if you explicitly disable the highlighting of a certain lexic, or disable line numbers, the related
+<abbr title="Cascading Style Sheets">CSS</abbr> will not be outputted. This may be a bad thing for you perhaps you&#8217;re going to use the stylesheet for many blocks
+of code, some with line numbers, others with some lexic enabled where this source has it disabled. Or perhaps you&#8217;re
+building an external stylesheet and want all lexics included. So to get around this problem, you do this:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">get_stylesheet</span><span class="br0">&#40;</span><span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>This turns economy mode off, and all of the stylesheet will be outputted regardless.</p>
+
+<p>Now lets say you have several snippets of code, using the same language. In most of them you don&#8217;t mind if they&#8217;re
+highlighted the same way (in fact, that&#8217;s exactly what you want) but in one of them you&#8217;d like the source to be
+highlighted differently. Here&#8217;s how you can do that:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span>13
+<span class="xtra li2"><span class="de2">14</span></span>15
+<span class="xtra li2"><span class="de2">16</span></span>17
+<span class="xtra li2"><span class="de2">18</span></span>19
+<span class="xtra li2"><span class="de2">20</span></span>21
+<span class="xtra li2"><span class="de2">22</span></span>23
+<span class="xtra li2"><span class="de2">24</span></span>25
+<span class="xtra li2"><span class="de2">26</span></span>27
+<span class="xtra li2"><span class="de2">28</span></span>29
+<span class="xtra li2"><span class="de2">30</span></span>31
+<span class="xtra li2"><span class="de2">32</span></span>33
+<span class="xtra li2"><span class="de2">34</span></span>35
+<span class="xtra li2"><span class="de2">36</span></span>37
+<span class="xtra li2"><span class="de2">38</span></span>39
+<span class="xtra li2"><span class="de2">40</span></span>41
+<span class="xtra li2"><span class="de2">42</span></span>43
+<span class="xtra li2"><span class="de2">44</span></span>45
+<span class="xtra li2"><span class="de2">46</span></span>47
+<span class="xtra li2"><span class="de2">48</span></span></pre></td><td class="de1"><pre class="de1"><span class="co1">// assume path is the default &quot;geshi/&quot; relative to the current directory</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="re0">$geshi1</span> <span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="re0">$source1</span><span class="sy0">,</span> <span class="re0">$lang</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="re0">$geshi2</span> <span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="re0">$source2</span><span class="sy0">,</span> <span class="re0">$lang</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="re0">$geshi3</span> <span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="re0">$source3</span><span class="sy0">,</span> <span class="re0">$lang</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="co1">// Turn classes on for all sources</span></span></span><span class="re0">$geshi1</span><span class="sy0">-&gt;</span><span class="me1">enable_classes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="re0">$geshi2</span><span class="sy0">-&gt;</span><span class="me1">enable_classes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="re0">$geshi3</span><span class="sy0">-&gt;</span><span class="me1">enable_classes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="co1">// Make $geshi3 unique</span></span></span><span class="re0">$geshi3</span><span class="sy0">-&gt;</span><span class="me1">set_overall_id</span><span class="br0">&#40;</span><span class="st_h">'different'</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="co1">//</span></span></span><span class="co1">// Methods are called on $geshi3 to change styles...</span>
+<span class="xtra li2"><span class="de2"><span class="co1">//</span></span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="kw1">echo</span> <span class="st_h">'&lt;html&gt;</span></span></span><span class="st_h">&lt;head&gt;&lt;title&gt;Code&lt;/title&gt;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="st_h">&lt;style type=&quot;text/css&quot;&gt;</span>
+<span class="xtra li2"><span class="de2"><span class="st_h">&lt;!--</span></span></span><span class="st_h">'</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="co1">// Get the nessecary stylesheets</span>
+<span class="xtra li2"><span class="de2"><span class="kw1">echo</span> <span class="re0">$geshi1</span><span class="sy0">-&gt;</span><span class="me1">get_stylesheet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="kw1">echo</span> <span class="re0">$geshi3</span><span class="sy0">-&gt;</span><span class="me1">get_stylesheet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="kw1">echo</span> <span class="st_h">'--&gt;</span></span></span><span class="st_h">&lt;/style&gt;&lt;/head&gt;</span>
+<span class="xtra li2"><span class="de2"><span class="st_h">&lt;body&gt;'</span><span class="sy0">;</span></span></span>&nbsp;
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="kw1">echo</span> <span class="st_h">'Code snippet 1:'</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="kw1">echo</span> <span class="re0">$geshi1</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span><span class="kw1">echo</span> <span class="st_h">'Code snippet 2 (same highlighting as 1):'</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="kw1">echo</span> <span class="re0">$geshi2</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="kw1">echo</span> <span class="st_h">'Code snippet 3 (DIFFERENT highlighting):'</span><span class="sy0">;</span></span></span><span class="kw1">echo</span> <span class="re0">$geshi3</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="kw1">echo</span> <span class="st_h">'&lt;/body&gt;&lt;/html&gt;'</span><span class="sy0">;</span></span></span></pre></td></tr></tbody></table>
+
+<p>Before version 1.0.2, you needed to set the class of the code you wanted to be unique to the empty string. This
+limitation has been removed in version 1.0.2 - if you set the ID of a block of code, all styling will be done based
+on that ID alone.</p>
+
+<h4 id="using-an-external-stylesheet">3.3.4 Using an External Stylesheet</h4><div class="nav"><a href="#getting-stylesheet">Previous</a> | <a href="#using-css-classes">Top</a> | <a href="#changing-styles">Next</a></div>
+
+<p>An external stylesheet can reduce even more the amount of code needed to highlight some source. However there are some
+drawbacks with this. To use an external stylesheet, it&#8217;s up to you to link it in to your document, normally with
+the following <abbr title="Hypertext Markup Language">HTML</abbr>:</p>
+
+<table class="html4strict geshicode"><thead><tr><td colspan="2" class="head">HTML code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+</pre></td><td class="de1"><pre class="de1"><span class="sc2">&lt;<a href="http://december.com/html/4/element/html.html"><span class="kw2">html</span></a>&gt;</span>
+<span class="xtra li2"><span class="de2"><span class="sc2">&lt;<a href="http://december.com/html/4/element/head.html"><span class="kw2">head</span></a>&gt;</span></span></span><span class="sc2">&lt;<a href="http://december.com/html/4/element/link.html"><span class="kw2">link</span></a> <span class="kw3">rel</span><span class="sy0">=</span><span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/css&quot;</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;url_to_stylesheet.css&quot;</span> <span class="sy0">/</span>&gt;</span></pre></td></tr></tbody></table>
+
+<p>In your external stylesheet you put <abbr title="Cascading Style Sheets">CSS</abbr> declarations for your code. Then just make sure you&#8217;re using the correct class (use
+<code class="highlighted php">set_overall_class<span class="br0">&#40;</span><span class="br0">&#41;</span></code> to ensure this) and this should work fine.</p>
+
+<p>This method is great if you don&#8217;t mind the source always being highlighted the same (in particular, if you&#8217;re making a
+plugin for a forum/wiki/other system, using an external stylesheet is a good idea!). It saves a small amount of code and
+your bandwidth, and it&#8217;s relatively easy to just change the stylesheet should you need to. However, using this will render
+the methods that change the styles of the code useless, because of course the stylesheet is no longer being dynamically
+generated. You can still disable highlighting of certain lexics dynamically, however.</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>As of version 1.0.2, <abbr title="Generic Syntax Highlighter">GeSHi</abbr> comes with a <code>contrib/</code> directory, which in it contains a &#8220;wizard&#8221; script for creating
+ a stylesheet. Although this script is by no means a complete solution, it will create the necessary rules for the
+ basic lexics - comments, strings for example. Things not included in the wizard include regular expressions for any
+ language that uses them (<abbr title="PHP: HTML Preprocessor">PHP</abbr> and <abbr title="Extensible Markup Language">XML</abbr> are two languages that use them), and keyword-link styles. However, this script
+ should take some of the tedium out of the job of making an external stylesheet. Expect a much better version of this
+ script in version 1.2!</p>
+
+</div>
+
+<h3 id="changing-styles">3.4 Changing Styles</h3><div class="nav"><a href="#using-an-external-stylesheet">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#the-overall-styles">Next</a></div>
+
+<p>One of the more powerful features of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> is the ability to change the style of the output dynamically. Why be chained
+to the boring styles the language authors make up? You can change almost every single aspect of highlighted code - and
+can even say whether something is to be highlighted at all.</p>
+
+<p>If you&#8217;re confused about &#8220;styles&#8221;, you probably want to have a quick tutorial in them so you know what you can do with
+them. Checkout the homepage of <abbr title="Cascading Style Sheets">CSS</abbr> at <a href="http://www.w3.org/Style/CSS">http://www.w3.org/Style/CSS</a>.</p>
+
+<h4 id="the-overall-styles">3.4.1 The Overall Styles</h4><div class="nav"><a href="#changing-styles">Previous</a> | <a href="#changing-styles">Top</a> | <a href="#line-number-styles">Next</a></div>
+
+<p>The code outputted by <abbr title="Generic Syntax Highlighter">GeSHi</abbr> is either in a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code> or a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code> (see the section entitled &#8220;The
+Code Container&#8221;), and this can be styled.</p>
+
+<p><code>$geshi-&gt;set_overall_style('... styles ...');</code>
+Where styles is a string containing valid <abbr title="Cascading Style Sheets">CSS</abbr> declarations. By default, these styles overwrite the current styles, but you can change this by adding a second parameter:</p>
+
+<p><code>$geshi-&gt;set_overall_style('color: blue;', true);</code>
+The default styles &#8220;shine through&#8221; wherever anything isn&#8217;t highlighted. Also, you can apply more advanced styles, like position: (fixed|relative) etc, because a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code>/<code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code> is a block level element.</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>Remember that a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code> will by default have a larger font size than a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code>, as discussed in the section <a href="#the-code-container">&#8220;The Code Container&#8221;</a>.</p>
+
+</div>
+
+<h4 id="line-number-styles">3.4.2 Line Number Styles</h4><div class="nav"><a href="#the-overall-styles">Previous</a> | <a href="#changing-styles">Top</a> | <a href="#setting-keyword-styles">Next</a></div>
+
+<p>You may wish to refer to the section [Styling Line Numbers][1] before reading this section.</p>
+
+<p>As of version 1.0.2, the way line numbers are generated is different, so therefore the way that they are styled is
+different. In particular, now you cannot set the background style of the fancy line numbers to be different from that
+of the normal line numbers.</p>
+
+<p>Line number styles are set by using the method <code class="highlighted php">set_line_style</code>:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_line_style</span><span class="br0">&#40;</span><span class="re0">$style1</span><span class="sy0">,</span> <span class="re0">$style2</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p><code class="highlighted php"><span class="re0">$style1</span></code> is the style of the line numbers by default, and <code class="highlighted php"><span class="re0">$style2</span></code> is the style of the fancy line numbers.</p>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>Things have changed since 1.0.1! This note is <strong>very</strong> important - please make sure you check this twice before
+ complaining about line numbers!</p>
+
+<p>Because of the way that ordered lists are done in <abbr title="Hypertext Markup Language">HTML</abbr>, there really isn&#8217;t normally a way to style the actual
+ <em>numbers</em> in the list. I&#8217;ve cheated somewhat with <abbr title="Generic Syntax Highlighter">GeSHi</abbr> - I&#8217;ve made it possible to use <abbr title="Cascading Style Sheets">CSS</abbr> to style the <em>foreground</em> of
+ the line numbers. So therefore, you can change the color, font size and type, and padding on them. If you want to
+ have a pretty background, you <strong>must</strong> use <code class="highlighted php">set_overall_style<span class="br0">&#40;</span><span class="br0">&#41;</span></code> to do this, and use <code class="highlighted php">set_code_style<span class="br0">&#40;</span><span class="br0">&#41;</span></code>
+ to style the actual code! This is explained in the section above: <a href="#styling-line-numbers">Styling Line Numbers</a>.</p>
+
+<p>In addition, the styles for fancy line numbers <em>is now the difference between the normal styles and the styles you want
+ to achieve</em>. For example, in <abbr title="Generic Syntax Highlighter">GeSHi</abbr> prior to 1.0.2 you may have done this to style line numbers:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_line_style</span><span class="br0">&#40;</span><span class="st_h">'color: red; font-weight: bold;'</span><span class="sy0">,</span> <span class="st_h">'color: green; font-weight: bold'</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Now you instead can do this:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_line_style</span><span class="br0">&#40;</span><span class="st_h">'color: red; font-weight: bold;'</span><span class="sy0">,</span> <span class="st_h">'color: green;'</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>The <code class="highlighted css"><span class="kw1">font-weight</span><span class="sy0">:</span> <span class="kw2">bold</span><span class="sy0">;</span></code> will automatically carry through to the fancy styles. This is actually a small
+ saving in code - but the difference may be confusing for anyone using 1.0.1 at first.</p>
+
+</div>
+
+<h4 id="setting-keyword-styles">3.4.3 Setting Keyword Styles</h4><div class="nav"><a href="#line-number-styles">Previous</a> | <a href="#changing-styles">Top</a> | <a href="#setting-comment-styles">Next</a></div>
+
+<p>Perhaps the most regular change you will make will be to the styles of a keyword set. In order to change the styles for
+a particular set, you&#8217;ll have to know what the set is called first. Sets are numbered from 1 up. Typically, set 1
+contains keywords like <code>if</code>, <code>while</code>, <code>do</code>, <code>for</code>, <code>switch</code> etc, set 2 contains <code>null</code>, <code>false</code>, <code>true</code> etc, set 3
+contains function inbuilt into the language (<code>echo</code>, <code>htmlspecialchars</code> etc. in <abbr title="PHP: HTML Preprocessor">PHP</abbr>) and set 4 contains data types and
+similar variable modifiers: <code>int</code>, <code>double</code>, <code>real</code>, <code>static</code> etc. However these things are not fixed, and you should
+check the language file to see what key you want. Having a familiarity with a language file is definately a plus for
+using it.</p>
+
+<p>To change the styles for a keyword set, call the <code class="highlighted php">set_keyword_group_style<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_keyword_group_style</span><span class="br0">&#40;</span><span class="re0">$group</span><span class="sy0">,</span> <span class="re0">$styles</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$group</span></code> is the group to change the styles for and <code class="highlighted php"><span class="re0">$styles</span></code> is a string containing the styles
+to apply to that group.</p>
+
+<p>By default, the styles you pass overwrite the current styles. Add a boolean <code class="highlighted php"><span class="kw4">true</span></code> after the styles you specify to
+combine them with the current styles:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_keyword_group_style</span><span class="br0">&#40;</span><span class="nu0">3</span><span class="sy0">,</span> <span class="st_h">'color: white;'</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<h4 id="setting-comment-styles">3.4.4 Setting Comment Styles</h4><div class="nav"><a href="#setting-keyword-styles">Previous</a> | <a href="#changing-styles">Top</a> | <a href="#setting-other-styles">Next</a></div>
+
+<p>To change the styles for a comment group, call the <code class="highlighted php">set_comments_style<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_comments_style</span><span class="br0">&#40;</span><span class="re0">$group</span><span class="sy0">,</span> <span class="re0">$styles</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$group</span></code> is either a number corresponding to a single-line comment, or the string <code class="highlighted php"><span class="st_h">'MULTI'</span></code> to
+specify multiline comments:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span></pre></td><td class="de1"><pre class="de1"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_comments_style</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="st_h">'font-style: italic;'</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_comments_style</span><span class="br0">&#40;</span><span class="st_h">'MULTI'</span><span class="sy0">,</span> <span class="st_h">'display: hidden;'</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span></pre></td></tr></tbody></table>
+
+<p>By default, the styles you pass overwrite the current styles. Add a boolean <code class="highlighted php"><span class="kw4">true</span></code> after the styles you specify to
+combine them with the current styles:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_comments_style</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="st_h">'font-weight: 100;'</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>In 1.0.7.22 a new kind of Comments called &#8220;COMMENT_REGEXP&#8221; has been added. Those are handled by setting single
+ line comment styles.</p>
+
+</div>
+
+<h4 id="setting-other-styles">3.4.5 Setting Other Styles</h4><div class="nav"><a href="#setting-comment-styles">Previous</a> | <a href="#changing-styles">Top</a> | <a href="#case-caps">Next</a></div>
+
+<p><abbr title="Generic Syntax Highlighter">GeSHi</abbr> can highlight many other aspects of your source other than just keywords and comments. Strings, Numbers, Methods
+and Brackets among other things can all also be highlighted. Here are the related methods:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+</pre></td><td class="de1"><pre class="de1"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_escape_characters_style</span><span class="br0">&#40;</span><span class="re0">$styles</span><span class="br0">&#91;</span><span class="sy0">,</span> <span class="re0">$preserve_defaults</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_symbols_style</span><span class="br0">&#40;</span><span class="re0">$styles</span><span class="br0">&#91;</span><span class="sy0">,</span> <span class="re0">$preserve_defaults</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_strings_style</span><span class="br0">&#40;</span><span class="re0">$styles</span><span class="br0">&#91;</span><span class="sy0">,</span> <span class="re0">$preserve_defaults</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_numbers_style</span><span class="br0">&#40;</span><span class="re0">$styles</span><span class="br0">&#91;</span><span class="sy0">,</span> <span class="re0">$preserve_defaults</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_methods_style</span><span class="br0">&#40;</span><span class="re0">$key</span><span class="sy0">,</span> <span class="re0">$styles</span><span class="br0">&#91;</span><span class="sy0">,</span> <span class="re0">$preserve_defaults</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_regexps_style</span><span class="br0">&#40;</span><span class="re0">$key</span><span class="sy0">,</span> <span class="re0">$styles</span><span class="br0">&#91;</span><span class="sy0">,</span> <span class="re0">$preserve_defaults</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></td></tr></tbody></table>
+
+<p><code class="highlighted php"><span class="re0">$styles</span></code> is a string containing valid stylesheet declarations, while <code class="highlighted php"><span class="re0">$preserve_defaults</span></code> should be set
+to <code class="highlighted php"><span class="kw4">true</span></code> if you want your styles to be merged with the previous styles. In the case of <code class="highlighted php">set_methods_style<span class="br0">&#40;</span><span class="br0">&#41;</span></code>,
+you should select a group to set the styles of, check the language files for the number used for each &#8220;object splitter&#8221;.</p>
+
+<p>Like this was possible for <code class="highlighted php">set_method_style</code> a new parameter has been introduced for
+<code class="highlighted php">set_symbols_style</code> too which allows you to select the group of symbols for which you&#8217;d like to change your
+style. <code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_symbols_style</span><span class="br0">&#40;</span><span class="re0">$styles</span><span class="br0">&#91;</span><span class="sy0">,</span> <span class="re0">$preserve_defaults</span><span class="br0">&#91;</span><span class="sy0">,</span> <span class="re0">$group</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></code> If the third parameter is not
+given, group 0 is assumed. Furthermore you should note that any changes to group 0 are also reflected in the bracket
+style, i.e. a pass-through call to <code class="highlighted php">set_bracket_style</code> is made.</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>Since <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.8 multiple styles for strings and numbers are supported, though the API doesn&#8217;t provide full access yet.</p>
+
+</div>
+
+<h3 id="case-caps">3.5 Case Sensitivity and Auto Casing</h3><div class="nav"><a href="#setting-other-styles">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#auto-caps-nocaps">Next</a></div>
+
+<p>Controlling the case of the outputted source is an easy job with <abbr title="Generic Syntax Highlighter">GeSHi</abbr>. You can control which keywords are converted in
+case, and also control whether keywords are checked in a case sensitive manner.</p>
+
+<h4 id="auto-caps-nocaps">3.5.1 Auto-Caps/NoCaps</h4><div class="nav"><a href="#case-caps">Previous</a> | <a href="#case-caps">Top</a> | <a href="#setting-case-sensitivity">Next</a></div>
+
+<p>Auto-Caps/NoCaps is a nifty little feature that capitalises or lowercases automatically certain lexics when they are
+styled. I dabble in QuickBASIC, a dialect of BASIC which is well known for it&#8217;s capatalisation, and SQL is another
+language well known for using caps for readability.</p>
+
+<p>To change what case lexics are rendered in, you call the <code class="highlighted php">set_case_keywords<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_case_keywords</span><span class="br0">&#40;</span><span class="re0">$caps_modifier</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>The valid values to pass to this method are:</p>
+
+<ul>
+<li><code>GESHI_CAPS_NO_CHANGE</code> - Don&#8217;t change the case of any lexics, leave as they are found</li>
+<li><code>GESHI_CAPS_UPPER</code> - Uppercase all lexics found</li>
+<li><code>GESHI_CAPS_LOWER</code> - Lowercase all lexics found</li>
+</ul>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>When I say &#8220;lexic&#8221;, I mean &#8220;keywords&#8221;. <strong>Any</strong> keyword in <strong>any</strong> keyword array will be modified using this option!
+ This is one small area of inflexibility I hope to fix in 1.2.X.</p>
+
+</div>
+
+<p>I suspect this will only be used to specify <code>GESHI_CAPS_NO_CHANGE</code> to turn off autocaps for languages like SQL
+and BASIC variants, like so:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span></pre></td><td class="de1"><pre class="de1"><span class="re0">$geshi</span> <span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="re0">$source</span><span class="sy0">,</span> <span class="st_h">'sql'</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_case_keywords</span><span class="br0">&#40;</span>GESHI_CAPS_NO_CHANGE<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// don't want keywords capatalised</span></span></span></pre></td></tr></tbody></table>
+
+<p>All the same, it can be used for some interesting effects:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span></pre></td><td class="de1"><pre class="de1"><span class="re0">$geshi</span> <span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="re0">$source</span><span class="sy0">,</span> <span class="st_h">'java'</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="co1">// Anyone who's used java knows how picky it is about CapitalLetters...</span></span></span><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_case_keywords</span><span class="br0">&#40;</span>GESHI_CAPS_LOWER<span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="co1">// No *way* the source will look right now ;)</span></span></span></pre></td></tr></tbody></table>
+
+<h4 id="setting-case-sensitivity">3.5.2 Setting Case Sensitivity</h4><div class="nav"><a href="#auto-caps-nocaps">Previous</a> | <a href="#case-caps">Top</a> | <a href="#changing-config">Next</a></div>
+
+<p>Some languages, like <abbr title="PHP: HTML Preprocessor">PHP</abbr>, don&#8217;t mind what case function names and keywords are in, while others, like Java, depend on
+such pickiness to maintain their bad reputations ;). In any event, you can use the <code class="highlighted php">set_case_sensitivity<span class="br0">&#40;</span><span class="br0">&#41;</span></code>
+to change the case sensitiveness of a particular keyword group from the default:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_case_sensitivity</span><span class="br0">&#40;</span><span class="re0">$key</span><span class="sy0">,</span> <span class="re0">$sensitivity</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$key</span></code> is the key of the group for which you wish to change case sensitivness for (see the language file
+for that language), and <code class="highlighted php"><span class="re0">$sensitivity</span></code> is a boolean value - <code class="highlighted php"><span class="kw4">true</span></code> if the keyword is case sensitive, and
+<code class="highlighted php"><span class="kw4">false</span></code> if not.</p>
+
+<h3 id="changing-config">3.6 Changing the Source, Language, Config Options</h3><div class="nav"><a href="#setting-case-sensitivity">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#changing-the-source">Next</a></div>
+
+<p>What happens if you want to change the source to be highlighted on the fly, or the language. Or if you want to specify
+any of those basic fields after you&#8217;ve created a <abbr title="Generic Syntax Highlighter">GeSHi</abbr> object? Well, that&#8217;s where these methods come in.</p>
+
+<h4 id="changing-the-source">3.6.1 Changing the Source Code</h4><div class="nav"><a href="#changing-config">Previous</a> | <a href="#changing-config">Top</a> | <a href="#changing-the-language">Next</a></div>
+
+<p>To change the source code, you call the <code class="highlighted php">set_source<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_source</span><span class="br0">&#40;</span><span class="re0">$newsource</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Example:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span></pre></td><td class="de1"><pre class="de1"><span class="re0">$geshi</span> <span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="re0">$source1</span><span class="sy0">,</span> <span class="st_h">'php'</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="co1">// Method calls to specify various options...</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="re0">$code1</span> <span class="sy0">=</span> <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_source</span><span class="br0">&#40;</span><span class="re0">$source2</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="re0">$code2</span> <span class="sy0">=</span> <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span></pre></td></tr></tbody></table>
+
+<h4 id="changing-the-language">3.6.2 Changing the Language</h4><div class="nav"><a href="#changing-the-source">Previous</a> | <a href="#changing-config">Top</a> | <a href="#changing-the-path">Next</a></div>
+
+<p>What happens if you want to change the language used for highlighting? Just call <code class="highlighted php">set_language<span class="br0">&#40;</span><span class="br0">&#41;</span></code>:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_language</span><span class="br0">&#40;</span><span class="st_h">'newlanguage'</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Example:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span></pre></td><td class="de1"><pre class="de1"><span class="re0">$geshi</span> <span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="re0">$source</span><span class="sy0">,</span> <span class="st_h">'php'</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="re0">$code</span> <span class="sy0">=</span> <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="co1">// Highlight GeSHi's output</span>
+<span class="xtra li2"><span class="de2"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_source</span><span class="br0">&#40;</span><span class="re0">$code</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_language</span><span class="br0">&#40;</span><span class="st_h">'html4strict'</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">enable_classes</span><span class="br0">&#40;</span><span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="kw1">echo</span> <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span></pre></td></tr></tbody></table>
+
+<p>As of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.5, you can use the method <code class="highlighted php">load_from_file<span class="br0">&#40;</span><span class="br0">&#41;</span></code> to load the source code and language from a file.
+Simply pass this method a file name and it will attempt to load the source and set the language.</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">load_from_file</span><span class="br0">&#40;</span><span class="re0">$file_name</span><span class="sy0">,</span> <span class="re0">$lookup</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p><code class="highlighted php"><span class="re0">$file_name</span></code> is the file name to use, and <code class="highlighted php"><span class="re0">$lookup</span></code> is an optional parameter that contains a lookup
+array to use for deciding which language to choose. You can use this to override <abbr title="Generic Syntax Highlighter">GeSHi</abbr>&#8217;s default lookup array, which
+may not contain the extension of the file you&#8217;re after, or perhaps does have your extension but under a different
+language. The lookup array is of the form:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span></pre></td><td class="de1"><pre class="de1"><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp;<span class="st_h">'lang_name'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'extension'</span><span class="sy0">,</span> <span class="st_h">'extension'</span><span class="sy0">,</span> <span class="sy0">...</span><span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp;<span class="st_h">'lang_name'</span> <span class="sy0">...</span>
+<span class="xtra li2"><span class="de2"><span class="br0">&#41;</span><span class="sy0">;</span></span></span></pre></td></tr></tbody></table>
+
+<p>Also, you can use the method <code class="highlighted php">get_language_name_from_extension<span class="br0">&#40;</span><span class="br0">&#41;</span></code> if you need to convert a file extension
+to a valid language name. This method will return the empty string if it could not find a match in the lookup, and
+like <code class="highlighted php">load_from_file</code> it accepts an optional second parameter that contains a lookup array.</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>Names are case-insensitive - they will be converted to lower case to match a language file however. So if you&#8217;re
+ making a language file, remember it should have a name in lower case.</p>
+
+</div>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>What you pass to this method is the name of a language file, minus the .php extension. If you&#8217;re writing a plugin
+ for a particular application, it&#8217;s up to you to somehow convert user input into a valid language name.</p>
+
+</div>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>Since <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.8 this function does not reset language settings for an already loaded language. If you want
+ to highlight code in the same language with different settings add the optional
+ <code class="highlighted php"><span class="re0">$force_reset</span> parameter</code>:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_language</span><span class="br0">&#40;</span><span class="st_h">'language'</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+</div>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p><abbr title="Generic Syntax Highlighter">GeSHi</abbr> <code class="highlighted php"><span class="kw1">include</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code>s the language file, so be careful to make sure that users can&#8217;t pass some wierd
+ language name to include any old script! <abbr title="Generic Syntax Highlighter">GeSHi</abbr> tries to strip non-valid characters out of a language name, but
+ you should always do this your self anyway. In particular, language files are always lower-case, with either
+ alphanumeric characters, dashes or underscores in their name.</p>
+
+<p>At the very least, strip &#8220;/&#8221; characters out of a language name.</p>
+
+</div>
+
+<h4 id="changing-the-path">3.6.3 Changing the Language Path</h4><div class="nav"><a href="#changing-the-language">Previous</a> | <a href="#changing-config">Top</a> | <a href="#changing-the-charset">Next</a></div>
+
+<p>What happens if all of a sudden you want to use language files from a different directory from the current
+language file location? You call the <code class="highlighted php">set_language_path<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_language_path</span><span class="br0">&#40;</span><span class="re0">$newpath</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>It doesn&#8217;t matter whether the path has a trailing slash after it or not - only that it points to a valid folder.
+If it doesn&#8217;t, that&#8217;s your tough luck ;)</p>
+
+<h4 id="changing-the-charset">3.6.4 Changing the Character Set</h4><div class="nav"><a href="#changing-the-path">Previous</a> | <a href="#changing-config">Top</a> | <a href="#error-handling">Next</a></div>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>Although <abbr title="Generic Syntax Highlighter">GeSHi</abbr> itself does not require to know the exact charset of your source you
+ will need to set this option when processing sources where multi-byte characters can occur.
+ As of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.7.18 internally a rewrite of <code class="highlighted php"><span class="kw3">htmlspecialchars</span></code> is used
+ due to a security flaw in that function that is unpatched in even the most recent PHP4 versions and in PHP5 &lt; 5.2.
+ Although this does no longer explicitely require the charset it is required again
+ as of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.8 to properly handle multi-byte characters (e.g. after an escape char).</p>
+
+</div>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>As of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.8 the default charset has been changed to UTF-8.</p>
+
+</div>
+
+<p>As of version 1.0.3, you can use the method <code class="highlighted php">set_encoding<span class="br0">&#40;</span><span class="br0">&#41;</span></code> to specify the character set that your source
+is in. Valid names are those names that are valid for the <abbr title="PHP: HTML Preprocessor">PHP</abbr> mbstring library:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_encoding</span><span class="br0">&#40;</span><span class="re0">$encoding</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>There is a table of valid strings for <code class="highlighted php"><span class="re0">$encoding</span></code> at the php.net manual linked to above. If you do not
+specify an encoding, or specify an invalid encoding, the character set used is ISO-8859-1.</p>
+
+<h3 id="error-handling">3.7 Error Handling</h3><div class="nav"><a href="#changing-the-charset">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#disabling-lexics">Next</a></div>
+
+<p>What happens if you try to highlight using a language that doesn&#8217;t exist? Or if <abbr title="Generic Syntax Highlighter">GeSHi</abbr> can&#8217;t read a required file?
+The results you get may be confusing. You may check your code over and over, and never find anything wrong. <abbr title="Generic Syntax Highlighter">GeSHi</abbr>
+provides ways of finding out if <abbr title="Generic Syntax Highlighter">GeSHi</abbr> itself found anything wrong with what you tried to do. After highlighting,
+you can call the <code class="highlighted php">error<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span> <span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="st_h">'hi'</span><span class="sy0">,</span> <span class="st_h">'thisLangIsNotSupported'</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p><code class="highlighted php"><span class="kw1">echo</span> <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">error</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// echoes error message</span></code></p>
+
+<p>The error message you will get will look like this:</p>
+
+<blockquote>
+ <p><abbr title="Generic Syntax Highlighter">GeSHi</abbr> Error: <abbr title="Generic Syntax Highlighter">GeSHi</abbr> could not find the language thisLangIsNotSupported (using path geshi/) (code 2)</p>
+</blockquote>
+
+<p>The error outputted will be the last error <abbr title="Generic Syntax Highlighter">GeSHi</abbr> came across, just like how <code class="highlighted php"><span class="kw3">mysql_error</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code> works.</p>
+
+<h3 id="disabling-lexics">3.8 Disabling styling of some Lexics</h3><div class="nav"><a href="#error-handling">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#setting-tab-width">Next</a></div>
+
+<p>One disadvantage of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> is that for large source files using complex languages, it can be quite slow with
+every option turned on. Although future releases will concentrate on the speed/resource side of highlighting,
+you can gain speed by disabling some of the highlighting options. This is done by using a
+series of <code class="highlighted php">set_<span class="sy0">*</span>_highlighting</code> methods:</p>
+
+<dl>
+<dt><code class="highlighted php">set_keyword_group_highlighting<span class="br0">&#40;</span><span class="re0">$group</span><span class="sy0">,</span> <span class="re0">$flag</span><span class="br0">&#41;</span><span class="sy0">:</span></code></dt>
+<dd>Sets whether a particular <code class="highlighted php"><span class="re0">$group</span></code> of keywords is to be highlighted or not. Consult the necessary
+language file(s) to see what <code class="highlighted php"><span class="re0">$group</span></code> should be for each group (typically a positive integer).
+<code class="highlighted php"><span class="re0">$flag</span></code> is <code class="highlighted php"><span class="kw4">false</span></code> if you want to disable highlighting of this group, and <code class="highlighted php"><span class="kw4">true</span></code> if you want
+to re-enable higlighting of this group. If you disable a keyword group then even if the keyword group has a
+related URL one will not be generated for that keyword.</dd>
+
+<dt><code class="highlighted php">set_comments_highlighting<span class="br0">&#40;</span><span class="re0">$group</span><span class="sy0">,</span> <span class="re0">$flag</span><span class="br0">&#41;</span><span class="sy0">:</span></code></dt>
+<dd>Sets whether a particular <code class="highlighted php"><span class="re0">$group</span></code> of comments is to be highlighted or not. Consult the necessary
+language file(s) to see what <code class="highlighted php"><span class="re0">$group</span></code> should be for each group (typically a positive integer, or th
+string <code class="highlighted php"><span class="st_h">'MULTI'</span></code> for multiline comments. <code class="highlighted php"><span class="re0">$flag</span></code> is <code class="highlighted php"><span class="kw4">false</span></code> if you want to disable
+highlighting of this group, and <code class="highlighted php"><span class="kw4">true</span></code> if you want to re-enable highlighting of this group.</dd>
+
+<dt><code class="highlighted php">set_regexps_highlighting<span class="br0">&#40;</span><span class="re0">$regexp</span><span class="sy0">,</span> <span class="re0">$flag</span><span class="br0">&#41;</span><span class="sy0">:</span></code></dt>
+<dd>Sets whether a particular <code class="highlighted php"><span class="re0">$regexp</span></code> is to be highlighted or not. Consult the necessary language file(s)
+to see what <code class="highlighted php"><span class="re0">$regexp</span></code> should be for each regexp (typically a positive integer, or the string <code class="highlighted php"><span class="st_h">'MULTI'</span></code>
+for multiline comments. <code class="highlighted php"><span class="re0">$flag</span></code> is <code class="highlighted php"><span class="kw4">false</span></code> if you want to disable highlighting of this group,
+and <code class="highlighted php"><span class="kw4">true</span></code> if you want to re-enable highlighting of this group.</dd>
+</dl>
+
+<p>The following methods:</p>
+
+<ul>
+<li><code class="highlighted php">set_escape_characters_highlighting<span class="br0">&#40;</span><span class="re0">$flag</span><span class="br0">&#41;</span></code></li>
+<li><code class="highlighted php">set_symbols_highlighting<span class="br0">&#40;</span><span class="re0">$flag</span><span class="br0">&#41;</span></code></li>
+<li><code class="highlighted php">set_strings_highlighting<span class="br0">&#40;</span><span class="re0">$flag</span><span class="br0">&#41;</span></code></li>
+<li><code class="highlighted php">set_numbers_highlighting<span class="br0">&#40;</span><span class="re0">$flag</span><span class="br0">&#41;</span></code></li>
+<li><code class="highlighted php">set_methods_highlighting<span class="br0">&#40;</span><span class="re0">$flag</span><span class="br0">&#41;</span></code></li>
+</ul>
+
+<p>Work on their respective lexics (e.g. <code class="highlighted php">set_methods_highlighting<span class="br0">&#40;</span><span class="br0">&#41;</span></code> will disable/enable highlighting of methods).
+For each method, if <code class="highlighted php"><span class="re0">$flag</span></code> is <code class="highlighted php"><span class="kw4">false</span></code> then the related lexics will not be highlighted at all (this
+means no <abbr title="Hypertext Markup Language">HTML</abbr> will surround the lexic like usual, saving on time and bandwidth.</p>
+
+<p>In case all highlighting should be disabled or reenabled <abbr title="Generic Syntax Highlighter">GeSHi</abbr> provides two methods called <code class="highlighted php">disable_highlighting<span class="br0">&#40;</span><span class="br0">&#41;</span></code>
+and <code class="highlighted php">enable_highlighting<span class="br0">&#40;</span><span class="re0">$flag</span><span class="br0">&#41;</span></code>. The optional paramter <code class="highlighted php"><span class="re0">$flag</span></code> has been added in 1.0.7.21 and specifies
+the desired state, i.e. <code class="highlighted php"><span class="kw4">true</span></code> (default) to turn all highlighting on, or <code class="highlighted php"><span class="kw4">false</span></code> to turn all
+highlighting off. Since 1.0.7.21 the method <code class="highlighted php">disnable_highlighting<span class="br0">&#40;</span><span class="br0">&#41;</span></code> has become deprecated.</p>
+
+<h3 id="setting-tab-width">3.9 Setting the Tab Width</h3><div class="nav"><a href="#disabling-lexics">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#using-strict-mode">Next</a></div>
+
+<p>If you&#8217;re using the <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">pre</span>&gt;</span></code> header, tabs are handled automatically by your browser, and in general you can
+count on good results. However, if you&#8217;re using the <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code> header, you may want to specify a tab
+width explicitly.</p>
+
+<p>Note that tabs created in this fashion won&#8217;t be like normal tabs - there won&#8217;t be &#8220;tab-stops&#8221; as such, instead
+tabs will be replaced with the specified number of spaces - just like most editors do.</p>
+
+<p>To change the tab width, you call the <code class="highlighted php">set_tab_width<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_tab_width</span><span class="br0">&#40;</span><span class="re0">$width</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$width</span></code> is the width in spaces that you&#8217;d like tabs to be.</p>
+
+<h3 id="using-strict-mode">3.10 Using Strict Mode</h3><div class="nav"><a href="#setting-tab-width">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#adding-removing-keywords">Next</a></div>
+
+<p>Some languages like to get tricky, and jump in and out of the file that they&#8217;re in. For example, the vast
+majority of you reading this will have used a <abbr title="PHP: HTML Preprocessor">PHP</abbr> file. And you know that <abbr title="PHP: HTML Preprocessor">PHP</abbr> code is only executed if it&#8217;s
+within delimiters like <code class="highlighted php"><span class="kw2">&lt;?php</span></code> and <code class="highlighted php"><span class="sy1">?&gt;</span></code> (there are others of course&#8230;). So what happens if you do the
+following in a php file?</p>
+
+<p><code class="highlighted php">&lt;img src=&quot;<span class="kw2">&lt;?php</span> <span class="kw1">echo</span> <span class="kw3">rand</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="nu0">100</span><span class="br0">&#41;</span> <span class="sy1">?&gt;</span>&quot; /&gt;</code></p>
+
+<p>When using <abbr title="Generic Syntax Highlighter">GeSHi</abbr> without strict mode, or using a bad highlighter, you&#8217;ll end up with scrambled crap,
+especially if you&#8217;re being slack about where you&#8217;re putting your quotes, you could end up with the rest
+of your file as bright blue. Fortunately, you can tell <abbr title="Generic Syntax Highlighter">GeSHi</abbr> to be &#8220;strict&#8221; about just when it highlights
+and when it does not, using the <code class="highlighted php">enable_strict_mode<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">enable_strict_mode</span><span class="br0">&#40;</span><span class="re0">$mode</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$mode</span></code> is <code class="highlighted php"><span class="kw4">true</span></code> or not specified to enable strict mode, or <code class="highlighted php"><span class="kw4">false</span></code> to disable
+strict mode if you&#8217;ve already turned it and don&#8217;t want it now.</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>As of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.8 there is a new way to tell <abbr title="Generic Syntax Highlighter">GeSHi</abbr> when to use Strict Mode
+ which is somewhat more intelligent than in previous releases. <abbr title="Generic Syntax Highlighter">GeSHi</abbr> now also
+ allows <code class="highlighted php">GESHI_MAYBE</code>, <code class="highlighted php">GESHI_NEVER</code> and <code class="highlighted php">GESHI_ALWAYS</code> instead of <code class="highlighted php"><span class="kw4">true</span></code> and <code class="highlighted php"><span class="kw4">false</span></code>.
+ Basically <code class="highlighted php">GESHI_ALWAYS</code> (<code class="highlighted php"><span class="kw4">true</span></code>) always enables strict mode,
+ whereas <code class="highlighted php">GESHI_NEVER</code> (<code class="highlighted php"><span class="kw4">false</span></code>) completely disables strict mode. The new thing is
+ <code class="highlighted php">GESHI_MAYBE</code> which enables strict mode if it finds any sequences of code
+ that look like strict block delimiters.</p>
+
+<p>By the way: That&#8217;s why this section had to be changed, as the new documentation
+ tool we now use, applies this feature and thus auto-detects when strict mode has to be used&#8230;</p>
+
+</div>
+
+<h3 id="adding-removing-keywords">3.11 Adding/Removing Keywords</h3><div class="nav"><a href="#using-strict-mode">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#adding-a-keyword">Next</a></div>
+
+<p>Lets say that you&#8217;re working on a large project, with many files, many classes and many functions. Perhaps also you
+have the source code on the web and highlighted by <abbr title="Generic Syntax Highlighter">GeSHi</abbr>, perhaps as a front end to CVS, as a learning tool, something
+to refer to, whatever. Well, why not highlight the names of the functions and classes <em>your</em> project uses, as well
+as the standard functions and classes? Or perhaps you&#8217;re not interested in highlighting certain functions, and would
+like to remove them? Or maybe you don&#8217;t mind if an entire function group goes west in the interest of speed? <abbr title="Generic Syntax Highlighter">GeSHi</abbr>
+can handle all of this!</p>
+
+<h4 id="adding-a-keyword">3.11.1 Adding a Keyword</h4><div class="nav"><a href="#adding-removing-keywords">Previous</a> | <a href="#adding-removing-keywords">Top</a> | <a href="#removing-a-keyword">Next</a></div>
+
+<p>If you want to add a keyword to an existing keyword group, you use the <code class="highlighted php">add_keyword</code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">add_keyword</span><span class="br0">&#40;</span><span class="re0">$key</span><span class="sy0">,</span> <span class="re0">$word</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$key</span></code> is the index of the group of keywords you want to add this keyword to, and <code class="highlighted php"><span class="re0">$word</span></code> is
+the word to add.</p>
+
+<p>This implies knowledge of the language file to know the correct index.</p>
+
+<h4 id="removing-a-keyword">3.11.2 Removing a Keyword</h4><div class="nav"><a href="#adding-a-keyword">Previous</a> | <a href="#adding-removing-keywords">Top</a> | <a href="#adding-a-keyword-group">Next</a></div>
+
+<p>Perhaps you want to remove a keyword from an existing group. Maybe you don&#8217;t use it and want to save yourself some time. Whatever the reason, you can remove it using the <code class="highlighted php">remove_keyword</code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">remove_keyword</span><span class="br0">&#40;</span><span class="re0">$key</span><span class="sy0">,</span> <span class="re0">$word</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$key</span></code> is the index of the group of keywords that you want to remove this keyword from, and
+<code class="highlighted php"><span class="re0">$word</span></code> is the word to remove.</p>
+
+<p>This implies knowledge of the language file to know the correct index - most of the time the keywords you&#8217;ll
+want to remove will be in group 3, but this is not guaranteed and you should check the language file first.</p>
+
+<p>This function is silent - if the keyword is not in the group you specified, nothing awful will happen ;)</p>
+
+<h4 id="adding-a-keyword-group">3.11.3 Adding a Keyword Group</h4><div class="nav"><a href="#removing-a-keyword">Previous</a> | <a href="#adding-removing-keywords">Top</a> | <a href="#removing-a-keyword-group">Next</a></div>
+
+<p>Lets say for your big project you have several main functions and classes that you&#8217;d like highlighted. Why not
+add them as their own group instead of having them highlighted the same way as other keywords? Then you can make
+them stand out, and people can instantly see which functions and classes are user defined or inbuilt. Furthermore,
+you could set the URL for this group to point at the API documentation of your project.</p>
+
+<p>You add a keyword group by using the <code class="highlighted php">add_keyword_group</code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">add_keyword_group</span><span class="br0">&#40;</span><span class="re0">$key</span><span class="sy0">,</span> <span class="re0">$styles</span><span class="sy0">,</span> <span class="re0">$case_sensitive</span><span class="sy0">,</span> <span class="re0">$words</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$key</span></code> is the key that you want to use to refer to this group, <code class="highlighted php"><span class="re0">$styles</span></code> is the styles that
+you want to use to style this group, <code class="highlighted php"><span class="re0">$case_sensitive</span></code> is <strong>true</strong> or <strong>false</strong> depending on whether you want
+this group of keywords to be case sensitive or not and <code class="highlighted php"><span class="re0">$words</span></code> is an array of words (or a string) of which
+words to add to this group. For example:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">add_keyword_group</span><span class="br0">&#40;</span><span class="nu0">10</span><span class="sy0">,</span> <span class="st_h">'color: #600000;'</span><span class="sy0">,</span> <span class="kw4">false</span><span class="sy0">,</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st_h">'myfunc_1'</span><span class="sy0">,</span> <span class="st_h">'myfunc_2'</span><span class="sy0">,</span> <span class="st_h">'myfunc_3'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Adds a keyword group referenced by index 10, of which all keywords in the group will be dark red, each keyword
+can be in any case and which contains the keywords &#8220;myfunc_1&#8221;, &#8220;myfunc_2&#8221; and &#8220;myfunc_3&#8221;.</p>
+
+<p>After creating such a keyword group, you may call other <abbr title="Generic Syntax Highlighter">GeSHi</abbr> methods on it, just as you would for any other keyword group.</p>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>If you specify a <code class="highlighted php"><span class="re0">$key</span></code> for which there is already a keyword group, the old keyword group will be
+ overwritten! Most language files don&#8217;t use numbers larger than 5, so I recommend you play it safe and use a number
+ like 10 or 42.</p>
+
+</div>
+
+<h4 id="removing-a-keyword-group">3.11.4 Removing a Keyword Group</h4><div class="nav"><a href="#adding-a-keyword-group">Previous</a> | <a href="#adding-removing-keywords">Top</a> | <a href="#headers-and-footers">Next</a></div>
+
+<p>Perhaps you <em>really</em> need speed? Why not just remove an entire keyword group? <abbr title="Generic Syntax Highlighter">GeSHi</abbr> won&#8217;t have to loop through
+each keyword checking for its existance, saving much time. You remove a keyword group by using the
+<code class="highlighted php">remove_keyword_group</code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">remove_keyword_group</span><span class="br0">&#40;</span><span class="re0">$key</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$key</span></code> is the key of the group you wish to remove. This implies knowleged of the language file.</p>
+
+<h3 id="headers-and-footers">3.12 Headers and Footers for Your Code</h3><div class="nav"><a href="#removing-a-keyword-group">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#keyword-substitution">Next</a></div>
+
+<p>So you want to add some special information to the highlighted source? <abbr title="Generic Syntax Highlighter">GeSHi</abbr> can do that too! You can specify headers
+and footers for your code, style them, and insert information from the highlighted source into your header or footer.</p>
+
+<h4 id="keyword-substitution">3.12.1 Keyword Substitution</h4><div class="nav"><a href="#headers-and-footers">Previous</a> | <a href="#headers-and-footers">Top</a> | <a href="#setting-header-content">Next</a></div>
+
+<p>In your header and footer, you can put special keywords that will be replaced with actual configuration values for
+this <abbr title="Generic Syntax Highlighter">GeSHi</abbr> object. The keywords you can use are:</p>
+
+<ul>
+<li><strong><code>&lt;TIME&gt;</code></strong> or <strong><code>{TIME}</code></strong>: Is replaced by the time it took for the <code class="highlighted php">parse_code<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method - i.e.,
+how long it took for your code to be highlighted. The time is returned to three decimal places.</li>
+<li><strong><code>&lt;LANGUAGE&gt;</code></strong> or <strong><code>{LANGUAGE}</code></strong>: Is replaced by a nice, friendly version of the language name used to
+highlight this code.</li>
+<li><strong><code>&lt;SPEED&gt;</code></strong> or <strong><code>{SPEED}</code></strong>: Is replaced by the speed at which your source has been processed.</li>
+<li><strong><code>&lt;VERSION&gt;</code></strong> or <strong><code>{VERSION}</code></strong>: The <abbr title="Generic Syntax Highlighter">GeSHi</abbr> version used to highlight the code.</li>
+</ul>
+
+<h4 id="setting-header-content">3.12.2 Setting Header Content</h4><div class="nav"><a href="#keyword-substitution">Previous</a> | <a href="#headers-and-footers">Top</a> | <a href="#setting-footer-content">Next</a></div>
+
+<p>The header for your code is a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code>, which is inside the containing block. Therefore, it is affected by
+the method <code class="highlighted php">set_overall_style</code>, and should contain the sort of <abbr title="Hypertext Markup Language">HTML</abbr> that belongs in a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code>.
+You may use any <abbr title="Hypertext Markup Language">HTML</abbr> you like, and format it as an <abbr title="Hypertext Markup Language">HTML</abbr> document. You should use valid <abbr title="Hypertext Markup Language">HTML</abbr> - convert to entities
+any quotemarks or angle brackets you want displayed. You set the header content using the method
+<code class="highlighted php">set_header_content<span class="br0">&#40;</span><span class="br0">&#41;</span></code>:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_header_content</span><span class="br0">&#40;</span><span class="re0">$content</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$content</span></code> is the <abbr title="Hypertext Markup Language">HTML</abbr> you want to use for the header.</p>
+
+<h4 id="setting-footer-content">3.12.3 Setting Footer Content</h4><div class="nav"><a href="#setting-header-content">Previous</a> | <a href="#headers-and-footers">Top</a> | <a href="#styling-header-content">Next</a></div>
+
+<p>The footer for your code is a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code>, which is inside the containing block. Therefore, it is affected by
+the method <code class="highlighted php">set_overall_style</code>, and should contain the sort of <abbr title="Hypertext Markup Language">HTML</abbr> that belongs in a <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">div</span>&gt;</span></code>.
+You may use any <abbr title="Hypertext Markup Language">HTML</abbr> you like, and format it as an <abbr title="Hypertext Markup Language">HTML</abbr> document. You should use valid <abbr title="Hypertext Markup Language">HTML</abbr> - convert to entities
+any quotemarks or angle brackets you want displayed. You set the footer content using the method
+<code class="highlighted php">set_footer_content<span class="br0">&#40;</span><span class="br0">&#41;</span></code>:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_footer_content</span><span class="br0">&#40;</span><span class="re0">$content</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$content</span></code> is the <abbr title="Hypertext Markup Language">HTML</abbr> you want to use for the footer.</p>
+
+<h4 id="styling-header-content">3.12.4 Styling Header Content</h4><div class="nav"><a href="#setting-footer-content">Previous</a> | <a href="#headers-and-footers">Top</a> | <a href="#styling-footer-content">Next</a></div>
+
+<p>You can apply styles to the header content you have set with the <code class="highlighted php">set_header_content_style</code>:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_header_content_style</span><span class="br0">&#40;</span><span class="re0">$styles</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$styles</span></code> is the stylesheet declarations you want to use to style the header content.</p>
+
+<h4 id="styling-footer-content">3.12.5 Styling Footer Content</h4><div class="nav"><a href="#styling-header-content">Previous</a> | <a href="#headers-and-footers">Top</a> | <a href="#keyword-urls">Next</a></div>
+
+<p>You can apply styles to the footer content you have set with the <code class="highlighted php">set_footer_content_style</code>:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_footer_content_style</span><span class="br0">&#40;</span><span class="re0">$styles</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$styles</span></code> is the stylesheet declarations you want to use to style the footer content.</p>
+
+<h3 id="keyword-urls">3.13 Keyword URLs</h3><div class="nav"><a href="#styling-footer-content">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#setting-a-url">Next</a></div>
+
+<p>As of version 1.0.2, <abbr title="Generic Syntax Highlighter">GeSHi</abbr> allows you to specify a URL for keyword groups. This URL is used by <abbr title="Generic Syntax Highlighter">GeSHi</abbr> to convert
+the keywords in that group into URLs to appropriate documentation. And using <code class="highlighted php">add_keyword_group</code> you
+can add functions and classes from your own projects and use the URL functionality to provide a link to your
+own API documentation.</p>
+
+<h4 id="setting-a-url">3.13.1 Setting a URL for a Keyword Group</h4><div class="nav"><a href="#keyword-urls">Previous</a> | <a href="#keyword-urls">Top</a> | <a href="#disabling-urls">Next</a></div>
+
+<p>To set the URL to be used for a keyword group, you use the <code class="highlighted php">set_url_for_keyword_group<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_url_for_keyword_group</span><span class="br0">&#40;</span><span class="re0">$group</span><span class="sy0">,</span> <span class="re0">$url</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$group</span></code> is the keyword group you want to assign the URL for, and <code class="highlighted php"><span class="re0">$url</span></code> is the URL for
+this group of keywords.</p>
+
+<p>You may be wondering how to make each keyword in the group point to the correct URL. You do this by putting
+<code>{FNAME}</code> in the URL at the correct place. For example, <abbr title="PHP: HTML Preprocessor">PHP</abbr> makes it easy by linking <code>www.php.net/function-name</code>
+to the documentation for that function, so the URL used is <code>http://www.php.net/{FNAME}</code>.</p>
+
+<p>Of course, when you get to a language like Java, that puts its class documentation in related folders, it gets a
+little trickier to work out an appropriate URL (see the Java language file!). I hope to provide some kind of
+redirection service at the <abbr title="Generic Syntax Highlighter">GeSHi</abbr> website in the future.</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>As of Version 1.0.7.21 there have been added two more symbols you can use to link to functions. <code>{FNAMEL}</code>
+ will generate the lowercase version of the keyword, <code>{FNAMEU}</code> will generate the uppercase version. <code>{FNAME}</code>
+ will provide the keyword as specified in the language file. <strong>Use one of these more specific placeholders
+ if possible</strong>, as they result in less overhead while linking for case insensitive languages.</p>
+
+</div>
+
+<h4 id="disabling-urls">3.13.2 Disabling a URL for a Keyword Group</h4><div class="nav"><a href="#setting-a-url">Previous</a> | <a href="#keyword-urls">Top</a> | <a href="#disabling-all-urls">Next</a></div>
+
+<p>It&#8217;s easy to disable a URL for a keyword group: Simply use the method <code class="highlighted php">set_url_for_keyword_group<span class="br0">&#40;</span><span class="br0">&#41;</span></code> to pass
+an empty string as the URL:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_url_for_keyword_group</span><span class="br0">&#40;</span><span class="re0">$group</span><span class="sy0">,</span> <span class="st_h">''</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<h4 id="disabling-all-urls">3.13.3 Disabling all URLs for Keywords</h4><div class="nav"><a href="#disabling-urls">Previous</a> | <a href="#keyword-urls">Top</a> | <a href="#styling-links">Next</a></div>
+
+<p>As of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.7.18, you can disable all URL linking for keywords:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">enable_keyword_links</span><span class="br0">&#40;</span><span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<h4 id="styling-links">3.13.4 Styling Links</h4><div class="nav"><a href="#disabling-all-urls">Previous</a> | <a href="#keyword-urls">Top</a> | <a href="#using-targets">Next</a></div>
+
+<p>You can also style the function links. You can style their default status, hovered, active and visited status.
+All of this is controlled by one method, <code class="highlighted php">set_link_styles<span class="br0">&#40;</span><span class="br0">&#41;</span></code>:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_link_styles</span><span class="br0">&#40;</span><span class="re0">$mode</span><span class="sy0">,</span> <span class="re0">$styles</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$mode</span></code> is one of four values:</p>
+
+<ul>
+<li><strong><code class="highlighted php">GESHI_LINK</code>:</strong> The default style of the links.</li>
+<li><strong><code class="highlighted php">GESHI_HOVER</code>:</strong> The style of the links when they have focus (the mouse is hovering over them).</li>
+<li><strong><code class="highlighted php">GESHI_ACTIVE</code>:</strong> The style of the links when they are being clicked.</li>
+<li><strong><code class="highlighted php">GESHI_VISITED</code>:</strong> The style of links that the user has already visited.</li>
+</ul>
+
+<p>And <code class="highlighted php"><span class="re0">$styles</span></code> is the stylesheet declarations to apply to the links.</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>The names <code class="highlighted php">GESHI_LINK</code>, <code class="highlighted php">GESHI_HOVER</code> &#8230; are constants. Don&#8217;t put them in quotes!</p>
+
+</div>
+
+<h4 id="using-targets">3.13.5 Setting the Link Target</h4><div class="nav"><a href="#styling-links">Previous</a> | <a href="#keyword-urls">Top</a> | <a href="#using-contextual-importance">Next</a></div>
+
+<p>Perhaps you want to set the target of link attributes, so the manual pages open in a new window? Use the
+<code class="highlighted php">set_link_target<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_link_target</span><span class="br0">&#40;</span><span class="re0">$target</span><span class="sy0">,</span> <span class="re0">$styles</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$target</span></code> is any valid (X)<abbr title="Hypertext Markup Language">HTML</abbr> target value - <code>_blank</code> or <code>_top</code> for example.</p>
+
+<h3 id="using-contextual-importance">3.14 Using Contextual Importance</h3><div class="nav"><a href="#using-targets">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#highlighting-special-lines-extra">Next</a></div>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>This functionality is not only buggy, but is proving very hard to implement in 1.1.X. Therefore, this
+ functionality may well be <strong>removed</strong> in 1.2.0. You are hereby warned!</p>
+
+</div>
+
+<p>This feature allows you to mark a part of your source as important. But as the
+implementation its use is deprecated and you should consider using
+the &#8220;Highlight Lines Extra&#8221; feature described below.</p>
+
+<h3 id="highlighting-special-lines-extra">3.15 Highlighting Special Lines &#8220;Extra&#8221;</h3><div class="nav"><a href="#using-contextual-importance">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#specifying-lines-to-highlight-extra">Next</a></div>
+
+<p>An alternative (and more stable) method of highlighting code that is important
+is to use extra highlighting by line. Although you may not know what line numbers
+contain the important lines, if you do this method is a much more flexible way of
+making important lines stand out.</p>
+
+<h4 id="specifying-lines-to-highlight-extra">3.15.1 Specifying the Lines to Highlight Extra</h4><div class="nav"><a href="#highlighting-special-lines-extra">Previous</a> | <a href="#highlighting-special-lines-extra">Top</a> | <a href="#styles-for-highlighted-lines">Next</a></div>
+
+<p>To specify which lines to highlight extra, you pass an array containing the line numbers to <code class="highlighted php">highlight_lines_extra<span class="br0">&#40;</span><span class="br0">&#41;</span></code>:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">highlight_lines_extra</span><span class="br0">&#40;</span><span class="re0">$array</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>The array could be in the form <code class="highlighted php"><span class="kw3">array</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">,</span> <span class="nu0">3</span><span class="sy0">,</span> <span class="nu0">4</span><span class="sy0">,</span> <span class="nu0">7</span><span class="sy0">,</span> <span class="nu0">12</span><span class="sy0">,</span> <span class="nu0">344</span><span class="sy0">,</span> <span class="nu0">4242</span><span class="br0">&#41;</span></code>, made from a DB query, generated
+from looking through the source for certain important things and working out what line those things are&#8230;
+However you get the line numbers, the array should simply be an array of integers.</p>
+
+<p>Here&#8217;s an example, using the same source as before:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span>13
+<span class="xtra li2"><span class="de2">14</span></span>15
+<span class="xtra li2"><span class="de2">16</span></span>17
+<span class="xtra li2"><span class="de2">18</span></span>19
+<span class="xtra li2"><span class="de2">20</span></span>21
+</pre></td><td class="de1"><pre class="de1"><span class="co1">//</span>
+<span class="xtra li2"><span class="de2"><span class="co1">// Here we go again! This time we'll simply highlight the 8th line</span></span></span><span class="co1">//</span>
+<span class="xtra li2"><span class="de2"><span class="re0">$source</span> <span class="sy0">=</span> <span class="st_h">'public int[][] product ( n, m )</span></span></span><span class="st_h">{</span>
+<span class="xtra li2"><span class="de2"><span class="st_h"> &nbsp;int [][] ans = new int[n][m];</span></span></span><span class="st_h"> &nbsp;for ( int i = 0; i &lt; n; i++ )</span>
+<span class="xtra li2"><span class="de2"><span class="st_h"> &nbsp;{</span></span></span><span class="st_h"> &nbsp; &nbsp;for ( int j = 0; i &lt; m; j++ )</span>
+<span class="xtra li2"><span class="de2"><span class="st_h"> &nbsp; &nbsp;{</span></span></span><span class="st_h"> &nbsp; &nbsp; &nbsp;ans[i][j] = i * j;</span>
+<span class="xtra li2"><span class="de2"><span class="st_h"> &nbsp; &nbsp;}</span></span></span><span class="st_h"> &nbsp;}</span>
+<span class="xtra li2"><span class="de2"><span class="st_h"> &nbsp;return ans;</span></span></span><span class="st_h">}'</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="re0">$geshi</span> <span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="re0">$source</span><span class="sy0">,</span> <span class="st_h">'java'</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">highlight_lines_extra</span><span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="kw1">echo</span> <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></td></tr></tbody></table>
+
+<p>Which produces:</p>
+
+<table class="java geshicode"><thead><tr><td colspan="2" class="head">Java code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2"><span class="xtra ln-xtra">8</span></span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span></pre></td><td class="de1"><pre class="de1"><span class="kw1">public</span> <span class="kw4">int</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span> product <span class="br0">&#40;</span> n, m <span class="br0">&#41;</span>
+<span class="xtra li2"><span class="de2"><span class="br0">&#123;</span></span></span>&nbsp; <span class="kw4">int</span> <span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="br0">&#93;</span> ans <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw4">int</span><span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#91;</span>m<span class="br0">&#93;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> n<span class="sy0">;</span> i<span class="sy0">++</span> <span class="br0">&#41;</span></span></span>&nbsp; <span class="br0">&#123;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="kw4">int</span> j <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0">&lt;</span> m<span class="sy0">;</span> j<span class="sy0">++</span> <span class="br0">&#41;</span></span></span>&nbsp; &nbsp; <span class="br0">&#123;</span>
+<span class="xtra li2"><span class="de2"><span class="xtra ln-xtra">&nbsp; &nbsp; &nbsp; ans<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span>j<span class="br0">&#93;</span> <span class="sy0">=</span> i <span class="sy0">*</span> j<span class="sy0">;</span></span></span></span>&nbsp; &nbsp; <span class="br0">&#125;</span>
+<span class="xtra li2"><span class="de2">&nbsp; <span class="br0">&#125;</span></span></span>&nbsp; <span class="kw1">return</span> ans<span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="br0">&#125;</span></span></span></pre></td></tr></tbody></table>
+
+<p>What&#8217;s more, as you can see the code on a highlighted line is still actually highlighted itself.</p>
+
+<h4 id="styles-for-highlighted-lines">3.15.2 Styles for the Highlighted Lines</h4><div class="nav"><a href="#specifying-lines-to-highlight-extra">Previous</a> | <a href="#highlighting-special-lines-extra">Top</a> | <a href="#adding-ids-to-each-line">Next</a></div>
+
+<p>Again as with contextual importance, you&#8217;re not chained to the yellow theme that is the default. You can
+use the <code class="highlighted php">set_highlight_lines_extra_style</code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_highlight_lines_extra_style</span><span class="br0">&#40;</span><span class="re0">$styles</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$styles</span></code> is the stylesheet declarations that you want to apply to highlighted lines.</p>
+
+<h3 id="adding-ids-to-each-line">3.16 Adding IDs to Each Line</h3><div class="nav"><a href="#styles-for-highlighted-lines">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#getting-the-time-of-styling">Next</a></div>
+
+<p>Perhaps you&#8217;re a javascript junkie? <abbr title="Generic Syntax Highlighter">GeSHi</abbr> provides a way to give each line an ID so you can access that line with
+javascript, or perhaps just by plain <abbr title="Cascading Style Sheets">CSS</abbr> (though if you want to access lines by <abbr title="Cascading Style Sheets">CSS</abbr> you should use the method
+in the previous section). To enable IDs you call the <code class="highlighted php">enable_ids<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<p><code class="highlighted php"><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">enable_ids</span><span class="br0">&#40;</span><span class="re0">$flag</span><span class="br0">&#41;</span><span class="sy0">;</span></code></p>
+
+<p>Where <code class="highlighted php"><span class="re0">$flag</span></code> is <code class="highlighted php"><span class="kw4">true</span></code> or not present to enable IDs, and <code class="highlighted php"><span class="kw4">false</span></code> to disable them again if you need.</p>
+
+<p>The ID generated is in the form <code>{overall-css-id}-{line-number}</code>. So for example, if you set the overall <abbr title="Cascading Style Sheets">CSS</abbr> id to
+be &#8220;mycode&#8221;, then the IDs for each line would by &#8220;mycode-1&#8221;, &#8220;mycode-2&#8221; etc. If there is no <abbr title="Cascading Style Sheets">CSS</abbr> ID set, then one is
+made up in the form <code>geshi-[4 random characters]</code>, but this is not so useful for if you want to do javascript manipulation.</p>
+
+<h3 id="getting-the-time-of-styling">3.17 Getting the Time of Styling</h3><div class="nav"><a href="#adding-ids-to-each-line">Previous</a> | <a href="#advanced-features">Top</a> | <a href="#language-files">Next</a></div>
+
+<p>Once you&#8217;ve called <code class="highlighted php">parse_code<span class="br0">&#40;</span><span class="br0">&#41;</span></code>, you can get the time it took to run the highlighting by calling the
+<code class="highlighted php">get_time<span class="br0">&#40;</span><span class="br0">&#41;</span></code> method:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+</pre></td><td class="de1"><pre class="de1"><span class="re0">$geshi</span> <span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="re0">$source</span><span class="sy0">,</span> <span class="re0">$language</span><span class="sy0">,</span> <span class="re0">$path</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="re0">$code</span> <span class="sy0">=</span> <a href="http://www.php.net/mysql_real_escape_string"><span class="kw3">mysql_real_escape_string</span></a><span class="br0">&#40;</span><span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2"><span class="re0">$time</span> <span class="sy0">=</span> <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">get_time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></span></span>&nbsp;
+<span class="xtra li2"><span class="de2"><span class="co1">// do something with it</span></span></span><a href="http://www.php.net/mysql_query"><span class="kw3">mysql_query</span></a><span class="br0">&#40;</span><span class="st0">&quot;INSERT INTO code VALUES ('<span class="es4">$code</span>', '<span class="es4">$time</span>')&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></td></tr></tbody></table>
+
+<h2 id="language-files">4 Language Files</h2><div class="nav"><a href="#getting-the-time-of-styling">Previous</a> | <a href="#language-file-example">Next</a></div>
+
+<p>So now you know what features <abbr title="Generic Syntax Highlighter">GeSHi</abbr> offers, and perhaps you&#8217;ve even meddled with the source. Or perhaps
+you&#8217;d like a language file for language X but it doesn&#8217;t seem to be supported? Rubbish! <abbr title="Generic Syntax Highlighter">GeSHi</abbr> will highlight
+anything, what do you think I coded this for? ^_^ You&#8217;ll just have to learn how to make a language file
+yourself. And I promise it&#8217;s not too hard - and if you&#8217;re here you&#8217;re in the right place!</p>
+
+<h3 id="language-file-example">4.1 An Example Language File</h3><div class="nav"><a href="#language-files">Previous</a> | <a href="#language-files">Top</a> | <a href="#language-file-conventions">Next</a></div>
+
+<p>Let&#8217;s begin by looking at an example language file - the language file for the first language ever supported,
+<abbr title="PHP: HTML Preprocessor">PHP</abbr>:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span>13
+<span class="xtra li2"><span class="de2">14</span></span>15
+<span class="xtra li2"><span class="de2">16</span></span>17
+<span class="xtra li2"><span class="de2">18</span></span>19
+<span class="xtra li2"><span class="de2">20</span></span>21
+<span class="xtra li2"><span class="de2">22</span></span>23
+<span class="xtra li2"><span class="de2">24</span></span>25
+<span class="xtra li2"><span class="de2">26</span></span>27
+<span class="xtra li2"><span class="de2">28</span></span>29
+<span class="xtra li2"><span class="de2">30</span></span>31
+<span class="xtra li2"><span class="de2">32</span></span>33
+<span class="xtra li2"><span class="de2">34</span></span>35
+<span class="xtra li2"><span class="de2">36</span></span>37
+<span class="xtra li2"><span class="de2">38</span></span>39
+<span class="xtra li2"><span class="de2">40</span></span>41
+<span class="xtra li2"><span class="de2">42</span></span>43
+<span class="xtra li2"><span class="de2">44</span></span>45
+<span class="xtra li2"><span class="de2">46</span></span>47
+<span class="xtra li2"><span class="de2">48</span></span>49
+<span class="xtra li2"><span class="de2">50</span></span>51
+<span class="xtra li2"><span class="de2">52</span></span>53
+<span class="xtra li2"><span class="de2">54</span></span>55
+<span class="xtra li2"><span class="de2">56</span></span>57
+<span class="xtra li2"><span class="de2">58</span></span>59
+<span class="xtra li2"><span class="de2">60</span></span>61
+<span class="xtra li2"><span class="de2">62</span></span>63
+<span class="xtra li2"><span class="de2">64</span></span>65
+<span class="xtra li2"><span class="de2">66</span></span>67
+<span class="xtra li2"><span class="de2">68</span></span>69
+<span class="xtra li2"><span class="de2">70</span></span>71
+<span class="xtra li2"><span class="de2">72</span></span>73
+<span class="xtra li2"><span class="de2">74</span></span>75
+<span class="xtra li2"><span class="de2">76</span></span>77
+<span class="xtra li2"><span class="de2">78</span></span>79
+<span class="xtra li2"><span class="de2">80</span></span>81
+<span class="xtra li2"><span class="de2">82</span></span>83
+<span class="xtra li2"><span class="de2">84</span></span>85
+<span class="xtra li2"><span class="de2">86</span></span>87
+<span class="xtra li2"><span class="de2">88</span></span>89
+<span class="xtra li2"><span class="de2">90</span></span>91
+<span class="xtra li2"><span class="de2">92</span></span>93
+<span class="xtra li2"><span class="de2">94</span></span>95
+<span class="xtra li2"><span class="de2">96</span></span>97
+<span class="xtra li2"><span class="de2">98</span></span>99
+<span class="xtra li2"><span class="de2">100</span></span>101
+<span class="xtra li2"><span class="de2">102</span></span>103
+<span class="xtra li2"><span class="de2">104</span></span>105
+<span class="xtra li2"><span class="de2">106</span></span>107
+<span class="xtra li2"><span class="de2">108</span></span>109
+<span class="xtra li2"><span class="de2">110</span></span>111
+<span class="xtra li2"><span class="de2">112</span></span>113
+<span class="xtra li2"><span class="de2">114</span></span>115
+<span class="xtra li2"><span class="de2">116</span></span>117
+<span class="xtra li2"><span class="de2">118</span></span>119
+<span class="xtra li2"><span class="de2">120</span></span>121
+<span class="xtra li2"><span class="de2">122</span></span>123
+<span class="xtra li2"><span class="de2">124</span></span>125
+<span class="xtra li2"><span class="de2">126</span></span>127
+<span class="xtra li2"><span class="de2">128</span></span>129
+<span class="xtra li2"><span class="de2">130</span></span>131
+<span class="xtra li2"><span class="de2">132</span></span>133
+<span class="xtra li2"><span class="de2">134</span></span>135
+<span class="xtra li2"><span class="de2">136</span></span>137
+<span class="xtra li2"><span class="de2">138</span></span>139
+<span class="xtra li2"><span class="de2">140</span></span>141
+<span class="xtra li2"><span class="de2">142</span></span>143
+<span class="xtra li2"><span class="de2">144</span></span>145
+<span class="xtra li2"><span class="de2">146</span></span>147
+<span class="xtra li2"><span class="de2">148</span></span>149
+<span class="xtra li2"><span class="de2">150</span></span>151
+<span class="xtra li2"><span class="de2">152</span></span>153
+<span class="xtra li2"><span class="de2">154</span></span>155
+<span class="xtra li2"><span class="de2">156</span></span>157
+<span class="xtra li2"><span class="de2">158</span></span>159
+<span class="xtra li2"><span class="de2">160</span></span>161
+<span class="xtra li2"><span class="de2">162</span></span>163
+<span class="xtra li2"><span class="de2">164</span></span>165
+<span class="xtra li2"><span class="de2">166</span></span>167
+<span class="xtra li2"><span class="de2">168</span></span>169
+<span class="xtra li2"><span class="de2">170</span></span>171
+<span class="xtra li2"><span class="de2">172</span></span>173
+<span class="xtra li2"><span class="de2">174</span></span>175
+<span class="xtra li2"><span class="de2">176</span></span>177
+<span class="xtra li2"><span class="de2">178</span></span>179
+<span class="xtra li2"><span class="de2">180</span></span>181
+<span class="xtra li2"><span class="de2">182</span></span>183
+<span class="xtra li2"><span class="de2">184</span></span>185
+<span class="xtra li2"><span class="de2">186</span></span>187
+<span class="xtra li2"><span class="de2">188</span></span>189
+<span class="xtra li2"><span class="de2">190</span></span>191
+<span class="xtra li2"><span class="de2">192</span></span>193
+<span class="xtra li2"><span class="de2">194</span></span>195
+<span class="xtra li2"><span class="de2">196</span></span>197
+<span class="xtra li2"><span class="de2">198</span></span>199
+<span class="xtra li2"><span class="de2">200</span></span>201
+<span class="xtra li2"><span class="de2">202</span></span>203
+<span class="xtra li2"><span class="de2">204</span></span>205
+<span class="xtra li2"><span class="de2">206</span></span>207
+<span class="xtra li2"><span class="de2">208</span></span>209
+<span class="xtra li2"><span class="de2">210</span></span>211
+<span class="xtra li2"><span class="de2">212</span></span>213
+<span class="xtra li2"><span class="de2">214</span></span>215
+<span class="xtra li2"><span class="de2">216</span></span>217
+<span class="xtra li2"><span class="de2">218</span></span>219
+<span class="xtra li2"><span class="de2">220</span></span>221
+<span class="xtra li2"><span class="de2">222</span></span>223
+<span class="xtra li2"><span class="de2">224</span></span>225
+<span class="xtra li2"><span class="de2">226</span></span>227
+<span class="xtra li2"><span class="de2">228</span></span>229
+<span class="xtra li2"><span class="de2">230</span></span>231
+<span class="xtra li2"><span class="de2">232</span></span>233
+<span class="xtra li2"><span class="de2">234</span></span>235
+<span class="xtra li2"><span class="de2">236</span></span>237
+<span class="xtra li2"><span class="de2">238</span></span>239
+<span class="xtra li2"><span class="de2">240</span></span>241
+<span class="xtra li2"><span class="de2">242</span></span>243
+<span class="xtra li2"><span class="de2">244</span></span>245
+<span class="xtra li2"><span class="de2">246</span></span>247
+<span class="xtra li2"><span class="de2">248</span></span>249
+<span class="xtra li2"><span class="de2">250</span></span>251
+<span class="xtra li2"><span class="de2">252</span></span>253
+<span class="xtra li2"><span class="de2">254</span></span>255
+<span class="xtra li2"><span class="de2">256</span></span>257
+<span class="xtra li2"><span class="de2">258</span></span>259
+<span class="xtra li2"><span class="de2">260</span></span>261
+<span class="xtra li2"><span class="de2">262</span></span>263
+<span class="xtra li2"><span class="de2">264</span></span>265
+<span class="xtra li2"><span class="de2">266</span></span>267
+<span class="xtra li2"><span class="de2">268</span></span>269
+<span class="xtra li2"><span class="de2">270</span></span>271
+<span class="xtra li2"><span class="de2">272</span></span>273
+<span class="xtra li2"><span class="de2">274</span></span>275
+<span class="xtra li2"><span class="de2">276</span></span>277
+<span class="xtra li2"><span class="de2">278</span></span>279
+<span class="xtra li2"><span class="de2">280</span></span>281
+<span class="xtra li2"><span class="de2">282</span></span>283
+<span class="xtra li2"><span class="de2">284</span></span>285
+<span class="xtra li2"><span class="de2">286</span></span>287
+<span class="xtra li2"><span class="de2">288</span></span>289
+<span class="xtra li2"><span class="de2">290</span></span>291
+<span class="xtra li2"><span class="de2">292</span></span>293
+<span class="xtra li2"><span class="de2">294</span></span>295
+<span class="xtra li2"><span class="de2">296</span></span>297
+<span class="xtra li2"><span class="de2">298</span></span>299
+<span class="xtra li2"><span class="de2">300</span></span>301
+<span class="xtra li2"><span class="de2">302</span></span>303
+<span class="xtra li2"><span class="de2">304</span></span>305
+<span class="xtra li2"><span class="de2">306</span></span>307
+<span class="xtra li2"><span class="de2">308</span></span>309
+<span class="xtra li2"><span class="de2">310</span></span>311
+<span class="xtra li2"><span class="de2">312</span></span>313
+<span class="xtra li2"><span class="de2">314</span></span>315
+<span class="xtra li2"><span class="de2">316</span></span>317
+<span class="xtra li2"><span class="de2">318</span></span>319
+<span class="xtra li2"><span class="de2">320</span></span>321
+<span class="xtra li2"><span class="de2">322</span></span>323
+<span class="xtra li2"><span class="de2">324</span></span>325
+<span class="xtra li2"><span class="de2">326</span></span>327
+<span class="xtra li2"><span class="de2">328</span></span>329
+<span class="xtra li2"><span class="de2">330</span></span>331
+<span class="xtra li2"><span class="de2">332</span></span>333
+<span class="xtra li2"><span class="de2">334</span></span>335
+<span class="xtra li2"><span class="de2">336</span></span>337
+<span class="xtra li2"><span class="de2">338</span></span>339
+<span class="xtra li2"><span class="de2">340</span></span>341
+<span class="xtra li2"><span class="de2">342</span></span>343
+<span class="xtra li2"><span class="de2">344</span></span>345
+<span class="xtra li2"><span class="de2">346</span></span>347
+<span class="xtra li2"><span class="de2">348</span></span>349
+<span class="xtra li2"><span class="de2">350</span></span>351
+<span class="xtra li2"><span class="de2">352</span></span>353
+<span class="xtra li2"><span class="de2">354</span></span>355
+<span class="xtra li2"><span class="de2">356</span></span>357
+<span class="xtra li2"><span class="de2">358</span></span>359
+<span class="xtra li2"><span class="de2">360</span></span>361
+<span class="xtra li2"><span class="de2">362</span></span>363
+<span class="xtra li2"><span class="de2">364</span></span>365
+<span class="xtra li2"><span class="de2">366</span></span>367
+<span class="xtra li2"><span class="de2">368</span></span>369
+<span class="xtra li2"><span class="de2">370</span></span>371
+<span class="xtra li2"><span class="de2">372</span></span>373
+<span class="xtra li2"><span class="de2">374</span></span>375
+<span class="xtra li2"><span class="de2">376</span></span>377
+<span class="xtra li2"><span class="de2">378</span></span>379
+<span class="xtra li2"><span class="de2">380</span></span>381
+<span class="xtra li2"><span class="de2">382</span></span>383
+<span class="xtra li2"><span class="de2">384</span></span>385
+<span class="xtra li2"><span class="de2">386</span></span>387
+<span class="xtra li2"><span class="de2">388</span></span>389
+<span class="xtra li2"><span class="de2">390</span></span>391
+<span class="xtra li2"><span class="de2">392</span></span>393
+<span class="xtra li2"><span class="de2">394</span></span>395
+<span class="xtra li2"><span class="de2">396</span></span>397
+<span class="xtra li2"><span class="de2">398</span></span>399
+<span class="xtra li2"><span class="de2">400</span></span>401
+<span class="xtra li2"><span class="de2">402</span></span>403
+<span class="xtra li2"><span class="de2">404</span></span>405
+<span class="xtra li2"><span class="de2">406</span></span>407
+<span class="xtra li2"><span class="de2">408</span></span>409
+<span class="xtra li2"><span class="de2">410</span></span>411
+<span class="xtra li2"><span class="de2">412</span></span>413
+<span class="xtra li2"><span class="de2">414</span></span>415
+<span class="xtra li2"><span class="de2">416</span></span>417
+<span class="xtra li2"><span class="de2">418</span></span>419
+<span class="xtra li2"><span class="de2">420</span></span>421
+<span class="xtra li2"><span class="de2">422</span></span>423
+<span class="xtra li2"><span class="de2">424</span></span>425
+<span class="xtra li2"><span class="de2">426</span></span>427
+<span class="xtra li2"><span class="de2">428</span></span>429
+<span class="xtra li2"><span class="de2">430</span></span>431
+<span class="xtra li2"><span class="de2">432</span></span>433
+<span class="xtra li2"><span class="de2">434</span></span>435
+<span class="xtra li2"><span class="de2">436</span></span>437
+<span class="xtra li2"><span class="de2">438</span></span>439
+<span class="xtra li2"><span class="de2">440</span></span>441
+<span class="xtra li2"><span class="de2">442</span></span>443
+<span class="xtra li2"><span class="de2">444</span></span>445
+<span class="xtra li2"><span class="de2">446</span></span>447
+<span class="xtra li2"><span class="de2">448</span></span>449
+<span class="xtra li2"><span class="de2">450</span></span>451
+<span class="xtra li2"><span class="de2">452</span></span>453
+<span class="xtra li2"><span class="de2">454</span></span>455
+<span class="xtra li2"><span class="de2">456</span></span>457
+<span class="xtra li2"><span class="de2">458</span></span>459
+<span class="xtra li2"><span class="de2">460</span></span>461
+<span class="xtra li2"><span class="de2">462</span></span>463
+<span class="xtra li2"><span class="de2">464</span></span>465
+<span class="xtra li2"><span class="de2">466</span></span>467
+<span class="xtra li2"><span class="de2">468</span></span>469
+<span class="xtra li2"><span class="de2">470</span></span>471
+<span class="xtra li2"><span class="de2">472</span></span>473
+<span class="xtra li2"><span class="de2">474</span></span>475
+<span class="xtra li2"><span class="de2">476</span></span>477
+<span class="xtra li2"><span class="de2">478</span></span>479
+<span class="xtra li2"><span class="de2">480</span></span>481
+<span class="xtra li2"><span class="de2">482</span></span>483
+<span class="xtra li2"><span class="de2">484</span></span>485
+<span class="xtra li2"><span class="de2">486</span></span>487
+<span class="xtra li2"><span class="de2">488</span></span>489
+<span class="xtra li2"><span class="de2">490</span></span>491
+<span class="xtra li2"><span class="de2">492</span></span>493
+<span class="xtra li2"><span class="de2">494</span></span>495
+<span class="xtra li2"><span class="de2">496</span></span>497
+<span class="xtra li2"><span class="de2">498</span></span>499
+<span class="xtra li2"><span class="de2">500</span></span>501
+<span class="xtra li2"><span class="de2">502</span></span>503
+<span class="xtra li2"><span class="de2">504</span></span>505
+<span class="xtra li2"><span class="de2">506</span></span>507
+<span class="xtra li2"><span class="de2">508</span></span>509
+<span class="xtra li2"><span class="de2">510</span></span>511
+<span class="xtra li2"><span class="de2">512</span></span>513
+<span class="xtra li2"><span class="de2">514</span></span>515
+<span class="xtra li2"><span class="de2">516</span></span>517
+<span class="xtra li2"><span class="de2">518</span></span>519
+<span class="xtra li2"><span class="de2">520</span></span>521
+<span class="xtra li2"><span class="de2">522</span></span>523
+<span class="xtra li2"><span class="de2">524</span></span>525
+<span class="xtra li2"><span class="de2">526</span></span>527
+<span class="xtra li2"><span class="de2">528</span></span>529
+<span class="xtra li2"><span class="de2">530</span></span>531
+<span class="xtra li2"><span class="de2">532</span></span>533
+<span class="xtra li2"><span class="de2">534</span></span>535
+<span class="xtra li2"><span class="de2">536</span></span>537
+<span class="xtra li2"><span class="de2">538</span></span>539
+<span class="xtra li2"><span class="de2">540</span></span>541
+<span class="xtra li2"><span class="de2">542</span></span>543
+<span class="xtra li2"><span class="de2">544</span></span>545
+<span class="xtra li2"><span class="de2">546</span></span>547
+<span class="xtra li2"><span class="de2">548</span></span>549
+<span class="xtra li2"><span class="de2">550</span></span>551
+<span class="xtra li2"><span class="de2">552</span></span>553
+<span class="xtra li2"><span class="de2">554</span></span>555
+<span class="xtra li2"><span class="de2">556</span></span>557
+<span class="xtra li2"><span class="de2">558</span></span>559
+<span class="xtra li2"><span class="de2">560</span></span>561
+<span class="xtra li2"><span class="de2">562</span></span>563
+<span class="xtra li2"><span class="de2">564</span></span>565
+<span class="xtra li2"><span class="de2">566</span></span>567
+<span class="xtra li2"><span class="de2">568</span></span>569
+<span class="xtra li2"><span class="de2">570</span></span>571
+<span class="xtra li2"><span class="de2">572</span></span>573
+<span class="xtra li2"><span class="de2">574</span></span>575
+<span class="xtra li2"><span class="de2">576</span></span>577
+<span class="xtra li2"><span class="de2">578</span></span>579
+<span class="xtra li2"><span class="de2">580</span></span>581
+<span class="xtra li2"><span class="de2">582</span></span>583
+<span class="xtra li2"><span class="de2">584</span></span>585
+<span class="xtra li2"><span class="de2">586</span></span>587
+<span class="xtra li2"><span class="de2">588</span></span>589
+<span class="xtra li2"><span class="de2">590</span></span>591
+<span class="xtra li2"><span class="de2">592</span></span>593
+<span class="xtra li2"><span class="de2">594</span></span>595
+<span class="xtra li2"><span class="de2">596</span></span>597
+<span class="xtra li2"><span class="de2">598</span></span>599
+<span class="xtra li2"><span class="de2">600</span></span>601
+<span class="xtra li2"><span class="de2">602</span></span>603
+<span class="xtra li2"><span class="de2">604</span></span>605
+<span class="xtra li2"><span class="de2">606</span></span>607
+<span class="xtra li2"><span class="de2">608</span></span>609
+<span class="xtra li2"><span class="de2">610</span></span>611
+<span class="xtra li2"><span class="de2">612</span></span>613
+<span class="xtra li2"><span class="de2">614</span></span>615
+<span class="xtra li2"><span class="de2">616</span></span>617
+<span class="xtra li2"><span class="de2">618</span></span>619
+<span class="xtra li2"><span class="de2">620</span></span>621
+<span class="xtra li2"><span class="de2">622</span></span>623
+<span class="xtra li2"><span class="de2">624</span></span>625
+<span class="xtra li2"><span class="de2">626</span></span>627
+<span class="xtra li2"><span class="de2">628</span></span>629
+<span class="xtra li2"><span class="de2">630</span></span>631
+<span class="xtra li2"><span class="de2">632</span></span>633
+<span class="xtra li2"><span class="de2">634</span></span>635
+<span class="xtra li2"><span class="de2">636</span></span>637
+<span class="xtra li2"><span class="de2">638</span></span>639
+<span class="xtra li2"><span class="de2">640</span></span>641
+<span class="xtra li2"><span class="de2">642</span></span>643
+<span class="xtra li2"><span class="de2">644</span></span>645
+<span class="xtra li2"><span class="de2">646</span></span>647
+<span class="xtra li2"><span class="de2">648</span></span>649
+<span class="xtra li2"><span class="de2">650</span></span>651
+<span class="xtra li2"><span class="de2">652</span></span>653
+<span class="xtra li2"><span class="de2">654</span></span>655
+<span class="xtra li2"><span class="de2">656</span></span>657
+<span class="xtra li2"><span class="de2">658</span></span>659
+<span class="xtra li2"><span class="de2">660</span></span>661
+<span class="xtra li2"><span class="de2">662</span></span>663
+<span class="xtra li2"><span class="de2">664</span></span>665
+<span class="xtra li2"><span class="de2">666</span></span>667
+<span class="xtra li2"><span class="de2">668</span></span>669
+<span class="xtra li2"><span class="de2">670</span></span>671
+<span class="xtra li2"><span class="de2">672</span></span>673
+<span class="xtra li2"><span class="de2">674</span></span>675
+<span class="xtra li2"><span class="de2">676</span></span>677
+<span class="xtra li2"><span class="de2">678</span></span>679
+<span class="xtra li2"><span class="de2">680</span></span>681
+<span class="xtra li2"><span class="de2">682</span></span>683
+<span class="xtra li2"><span class="de2">684</span></span>685
+<span class="xtra li2"><span class="de2">686</span></span>687
+<span class="xtra li2"><span class="de2">688</span></span>689
+<span class="xtra li2"><span class="de2">690</span></span>691
+<span class="xtra li2"><span class="de2">692</span></span>693
+<span class="xtra li2"><span class="de2">694</span></span>695
+<span class="xtra li2"><span class="de2">696</span></span>697
+<span class="xtra li2"><span class="de2">698</span></span>699
+<span class="xtra li2"><span class="de2">700</span></span>701
+<span class="xtra li2"><span class="de2">702</span></span>703
+<span class="xtra li2"><span class="de2">704</span></span>705
+<span class="xtra li2"><span class="de2">706</span></span>707
+<span class="xtra li2"><span class="de2">708</span></span>709
+<span class="xtra li2"><span class="de2">710</span></span>711
+<span class="xtra li2"><span class="de2">712</span></span>713
+<span class="xtra li2"><span class="de2">714</span></span>715
+<span class="xtra li2"><span class="de2">716</span></span>717
+<span class="xtra li2"><span class="de2">718</span></span>719
+<span class="xtra li2"><span class="de2">720</span></span>721
+<span class="xtra li2"><span class="de2">722</span></span>723
+<span class="xtra li2"><span class="de2">724</span></span>725
+<span class="xtra li2"><span class="de2">726</span></span>727
+<span class="xtra li2"><span class="de2">728</span></span>729
+<span class="xtra li2"><span class="de2">730</span></span>731
+<span class="xtra li2"><span class="de2">732</span></span>733
+<span class="xtra li2"><span class="de2">734</span></span>735
+<span class="xtra li2"><span class="de2">736</span></span>737
+<span class="xtra li2"><span class="de2">738</span></span>739
+<span class="xtra li2"><span class="de2">740</span></span>741
+<span class="xtra li2"><span class="de2">742</span></span>743
+<span class="xtra li2"><span class="de2">744</span></span>745
+<span class="xtra li2"><span class="de2">746</span></span>747
+<span class="xtra li2"><span class="de2">748</span></span>749
+<span class="xtra li2"><span class="de2">750</span></span>751
+<span class="xtra li2"><span class="de2">752</span></span>753
+<span class="xtra li2"><span class="de2">754</span></span>755
+<span class="xtra li2"><span class="de2">756</span></span>757
+<span class="xtra li2"><span class="de2">758</span></span>759
+<span class="xtra li2"><span class="de2">760</span></span>761
+<span class="xtra li2"><span class="de2">762</span></span>763
+<span class="xtra li2"><span class="de2">764</span></span>765
+<span class="xtra li2"><span class="de2">766</span></span>767
+<span class="xtra li2"><span class="de2">768</span></span>769
+<span class="xtra li2"><span class="de2">770</span></span>771
+<span class="xtra li2"><span class="de2">772</span></span>773
+<span class="xtra li2"><span class="de2">774</span></span>775
+<span class="xtra li2"><span class="de2">776</span></span>777
+<span class="xtra li2"><span class="de2">778</span></span>779
+<span class="xtra li2"><span class="de2">780</span></span>781
+<span class="xtra li2"><span class="de2">782</span></span>783
+<span class="xtra li2"><span class="de2">784</span></span>785
+<span class="xtra li2"><span class="de2">786</span></span>787
+<span class="xtra li2"><span class="de2">788</span></span>789
+<span class="xtra li2"><span class="de2">790</span></span>791
+<span class="xtra li2"><span class="de2">792</span></span>793
+<span class="xtra li2"><span class="de2">794</span></span>795
+<span class="xtra li2"><span class="de2">796</span></span>797
+<span class="xtra li2"><span class="de2">798</span></span>799
+<span class="xtra li2"><span class="de2">800</span></span>801
+<span class="xtra li2"><span class="de2">802</span></span>803
+<span class="xtra li2"><span class="de2">804</span></span>805
+<span class="xtra li2"><span class="de2">806</span></span>807
+<span class="xtra li2"><span class="de2">808</span></span>809
+<span class="xtra li2"><span class="de2">810</span></span>811
+<span class="xtra li2"><span class="de2">812</span></span>813
+<span class="xtra li2"><span class="de2">814</span></span>815
+<span class="xtra li2"><span class="de2">816</span></span>817
+<span class="xtra li2"><span class="de2">818</span></span>819
+<span class="xtra li2"><span class="de2">820</span></span>821
+<span class="xtra li2"><span class="de2">822</span></span>823
+<span class="xtra li2"><span class="de2">824</span></span>825
+<span class="xtra li2"><span class="de2">826</span></span>827
+<span class="xtra li2"><span class="de2">828</span></span>829
+<span class="xtra li2"><span class="de2">830</span></span>831
+<span class="xtra li2"><span class="de2">832</span></span>833
+<span class="xtra li2"><span class="de2">834</span></span>835
+<span class="xtra li2"><span class="de2">836</span></span>837
+<span class="xtra li2"><span class="de2">838</span></span>839
+<span class="xtra li2"><span class="de2">840</span></span>841
+<span class="xtra li2"><span class="de2">842</span></span>843
+<span class="xtra li2"><span class="de2">844</span></span>845
+<span class="xtra li2"><span class="de2">846</span></span>847
+<span class="xtra li2"><span class="de2">848</span></span>849
+<span class="xtra li2"><span class="de2">850</span></span>851
+<span class="xtra li2"><span class="de2">852</span></span>853
+<span class="xtra li2"><span class="de2">854</span></span>855
+<span class="xtra li2"><span class="de2">856</span></span>857
+<span class="xtra li2"><span class="de2">858</span></span>859
+<span class="xtra li2"><span class="de2">860</span></span>861
+<span class="xtra li2"><span class="de2">862</span></span>863
+<span class="xtra li2"><span class="de2">864</span></span>865
+<span class="xtra li2"><span class="de2">866</span></span>867
+<span class="xtra li2"><span class="de2">868</span></span>869
+<span class="xtra li2"><span class="de2">870</span></span>871
+<span class="xtra li2"><span class="de2">872</span></span>873
+<span class="xtra li2"><span class="de2">874</span></span>875
+<span class="xtra li2"><span class="de2">876</span></span>877
+<span class="xtra li2"><span class="de2">878</span></span>879
+<span class="xtra li2"><span class="de2">880</span></span>881
+<span class="xtra li2"><span class="de2">882</span></span>883
+<span class="xtra li2"><span class="de2">884</span></span>885
+<span class="xtra li2"><span class="de2">886</span></span>887
+<span class="xtra li2"><span class="de2">888</span></span>889
+<span class="xtra li2"><span class="de2">890</span></span>891
+<span class="xtra li2"><span class="de2">892</span></span>893
+<span class="xtra li2"><span class="de2">894</span></span>895
+<span class="xtra li2"><span class="de2">896</span></span>897
+<span class="xtra li2"><span class="de2">898</span></span>899
+<span class="xtra li2"><span class="de2">900</span></span>901
+<span class="xtra li2"><span class="de2">902</span></span>903
+<span class="xtra li2"><span class="de2">904</span></span>905
+<span class="xtra li2"><span class="de2">906</span></span>907
+<span class="xtra li2"><span class="de2">908</span></span>909
+<span class="xtra li2"><span class="de2">910</span></span>911
+<span class="xtra li2"><span class="de2">912</span></span>913
+<span class="xtra li2"><span class="de2">914</span></span>915
+<span class="xtra li2"><span class="de2">916</span></span>917
+<span class="xtra li2"><span class="de2">918</span></span>919
+<span class="xtra li2"><span class="de2">920</span></span>921
+<span class="xtra li2"><span class="de2">922</span></span>923
+<span class="xtra li2"><span class="de2">924</span></span>925
+<span class="xtra li2"><span class="de2">926</span></span>927
+<span class="xtra li2"><span class="de2">928</span></span>929
+<span class="xtra li2"><span class="de2">930</span></span>931
+<span class="xtra li2"><span class="de2">932</span></span>933
+<span class="xtra li2"><span class="de2">934</span></span>935
+<span class="xtra li2"><span class="de2">936</span></span>937
+<span class="xtra li2"><span class="de2">938</span></span>939
+<span class="xtra li2"><span class="de2">940</span></span>941
+<span class="xtra li2"><span class="de2">942</span></span>943
+<span class="xtra li2"><span class="de2">944</span></span>945
+<span class="xtra li2"><span class="de2">946</span></span>947
+<span class="xtra li2"><span class="de2">948</span></span>949
+<span class="xtra li2"><span class="de2">950</span></span>951
+<span class="xtra li2"><span class="de2">952</span></span>953
+<span class="xtra li2"><span class="de2">954</span></span>955
+<span class="xtra li2"><span class="de2">956</span></span>957
+<span class="xtra li2"><span class="de2">958</span></span>959
+<span class="xtra li2"><span class="de2">960</span></span>961
+<span class="xtra li2"><span class="de2">962</span></span>963
+<span class="xtra li2"><span class="de2">964</span></span>965
+<span class="xtra li2"><span class="de2">966</span></span>967
+<span class="xtra li2"><span class="de2">968</span></span>969
+<span class="xtra li2"><span class="de2">970</span></span>971
+<span class="xtra li2"><span class="de2">972</span></span>973
+<span class="xtra li2"><span class="de2">974</span></span>975
+<span class="xtra li2"><span class="de2">976</span></span>977
+<span class="xtra li2"><span class="de2">978</span></span>979
+<span class="xtra li2"><span class="de2">980</span></span>981
+<span class="xtra li2"><span class="de2">982</span></span>983
+<span class="xtra li2"><span class="de2">984</span></span>985
+<span class="xtra li2"><span class="de2">986</span></span>987
+<span class="xtra li2"><span class="de2">988</span></span>989
+<span class="xtra li2"><span class="de2">990</span></span>991
+<span class="xtra li2"><span class="de2">992</span></span>993
+<span class="xtra li2"><span class="de2">994</span></span>995
+<span class="xtra li2"><span class="de2">996</span></span>997
+<span class="xtra li2"><span class="de2">998</span></span>999
+<span class="xtra li2"><span class="de2">1000</span></span>1001
+<span class="xtra li2"><span class="de2">1002</span></span>1003
+<span class="xtra li2"><span class="de2">1004</span></span>1005
+<span class="xtra li2"><span class="de2">1006</span></span>1007
+<span class="xtra li2"><span class="de2">1008</span></span>1009
+<span class="xtra li2"><span class="de2">1010</span></span>1011
+<span class="xtra li2"><span class="de2">1012</span></span>1013
+<span class="xtra li2"><span class="de2">1014</span></span>1015
+<span class="xtra li2"><span class="de2">1016</span></span>1017
+<span class="xtra li2"><span class="de2">1018</span></span>1019
+<span class="xtra li2"><span class="de2">1020</span></span>1021
+<span class="xtra li2"><span class="de2">1022</span></span>1023
+<span class="xtra li2"><span class="de2">1024</span></span>1025
+<span class="xtra li2"><span class="de2">1026</span></span>1027
+<span class="xtra li2"><span class="de2">1028</span></span>1029
+<span class="xtra li2"><span class="de2">1030</span></span>1031
+<span class="xtra li2"><span class="de2">1032</span></span>1033
+<span class="xtra li2"><span class="de2">1034</span></span>1035
+<span class="xtra li2"><span class="de2">1036</span></span>1037
+<span class="xtra li2"><span class="de2">1038</span></span>1039
+<span class="xtra li2"><span class="de2">1040</span></span>1041
+<span class="xtra li2"><span class="de2">1042</span></span>1043
+<span class="xtra li2"><span class="de2">1044</span></span>1045
+<span class="xtra li2"><span class="de2">1046</span></span>1047
+<span class="xtra li2"><span class="de2">1048</span></span>1049
+<span class="xtra li2"><span class="de2">1050</span></span>1051
+<span class="xtra li2"><span class="de2">1052</span></span>1053
+<span class="xtra li2"><span class="de2">1054</span></span>1055
+<span class="xtra li2"><span class="de2">1056</span></span>1057
+<span class="xtra li2"><span class="de2">1058</span></span>1059
+<span class="xtra li2"><span class="de2">1060</span></span>1061
+<span class="xtra li2"><span class="de2">1062</span></span>1063
+<span class="xtra li2"><span class="de2">1064</span></span>1065
+<span class="xtra li2"><span class="de2">1066</span></span>1067
+<span class="xtra li2"><span class="de2">1068</span></span>1069
+<span class="xtra li2"><span class="de2">1070</span></span>1071
+<span class="xtra li2"><span class="de2">1072</span></span>1073
+<span class="xtra li2"><span class="de2">1074</span></span>1075
+<span class="xtra li2"><span class="de2">1076</span></span>1077
+<span class="xtra li2"><span class="de2">1078</span></span>1079
+<span class="xtra li2"><span class="de2">1080</span></span>1081
+<span class="xtra li2"><span class="de2">1082</span></span>1083
+<span class="xtra li2"><span class="de2">1084</span></span>1085
+<span class="xtra li2"><span class="de2">1086</span></span>1087
+<span class="xtra li2"><span class="de2">1088</span></span>1089
+<span class="xtra li2"><span class="de2">1090</span></span>1091
+<span class="xtra li2"><span class="de2">1092</span></span>1093
+<span class="xtra li2"><span class="de2">1094</span></span>1095
+<span class="xtra li2"><span class="de2">1096</span></span>1097
+<span class="xtra li2"><span class="de2">1098</span></span>1099
+<span class="xtra li2"><span class="de2">1100</span></span>1101
+<span class="xtra li2"><span class="de2">1102</span></span>1103
+<span class="xtra li2"><span class="de2">1104</span></span>1105
+<span class="xtra li2"><span class="de2">1106</span></span>1107
+<span class="xtra li2"><span class="de2">1108</span></span>1109
+<span class="xtra li2"><span class="de2">1110</span></span>1111
+<span class="xtra li2"><span class="de2">1112</span></span>1113
+<span class="xtra li2"><span class="de2">1114</span></span>1115
+<span class="xtra li2"><span class="de2">1116</span></span>1117
+</pre></td><td class="de1"><pre class="de1"><span class="kw2">&lt;?php</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">/*************************************************************************************</span></span></span><span class="coMULTI">&nbsp;* php.php</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* --------</span></span></span><span class="coMULTI">&nbsp;* Author: Nigel McNie (nigel@geshi.org)</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)</span></span></span><span class="coMULTI">&nbsp;* Release Version: 1.0.8.10</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* Date Started: 2004/06/20</span></span></span><span class="coMULTI">&nbsp;*</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* PHP language file for GeSHi.</span></span></span><span class="coMULTI">&nbsp;*</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* CHANGES</span></span></span><span class="coMULTI">&nbsp;* -------</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* 2008/05/23 (1.0.7.22)</span></span></span><span class="coMULTI">&nbsp;* &nbsp;- &nbsp;Added description of extra language features (SF#1970248)</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* 2004/11/25 (1.0.3)</span></span></span><span class="coMULTI">&nbsp;* &nbsp;- &nbsp;Added support for multiple object splitters</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &nbsp;- &nbsp;Fixed &amp;new problem</span></span></span><span class="coMULTI">&nbsp;* 2004/10/27 (1.0.2)</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &nbsp;- &nbsp;Added URL support</span></span></span><span class="coMULTI">&nbsp;* &nbsp;- &nbsp;Added extra constants</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* 2004/08/05 (1.0.1)</span></span></span><span class="coMULTI">&nbsp;* &nbsp;- &nbsp;Added support for symbols</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* 2004/07/14 (1.0.0)</span></span></span><span class="coMULTI">&nbsp;* &nbsp;- &nbsp;First Release</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;*</span></span></span><span class="coMULTI">&nbsp;* TODO (updated 2004/07/14)</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* -------------------------</span></span></span><span class="coMULTI">&nbsp;* * Make sure the last few function I may have missed</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &nbsp; (like eval()) are included for highlighting</span></span></span><span class="coMULTI">&nbsp;* * Split to several files - php4, php5 etc</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;*</span></span></span><span class="coMULTI">&nbsp;*************************************************************************************</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;*</span></span></span><span class="coMULTI">&nbsp;* &nbsp; &nbsp; This file is part of GeSHi.</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;*</span></span></span><span class="coMULTI">&nbsp;* &nbsp; GeSHi is free software; you can redistribute it and/or modify</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &nbsp; it under the terms of the GNU General Public License as published by</span></span></span><span class="coMULTI">&nbsp;* &nbsp; the Free Software Foundation; either version 2 of the License, or</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &nbsp; (at your option) any later version.</span></span></span><span class="coMULTI">&nbsp;*</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &nbsp; GeSHi is distributed in the hope that it will be useful,</span></span></span><span class="coMULTI">&nbsp;* &nbsp; but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &nbsp; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. &nbsp;See the</span></span></span><span class="coMULTI">&nbsp;* &nbsp; GNU General Public License for more details.</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;*</span></span></span><span class="coMULTI">&nbsp;* &nbsp; You should have received a copy of the GNU General Public License</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &nbsp; along with GeSHi; if not, write to the Free Software</span></span></span><span class="coMULTI">&nbsp;* &nbsp; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA &nbsp;02111-1307 &nbsp;USA</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;*</span></span></span><span class="coMULTI">&nbsp;************************************************************************************/</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="re0">$language_data</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'LANG_NAME'</span> <span class="sy0">=&gt;</span> <span class="st_h">'PHP'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'COMMENT_SINGLE'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">'//'</span><span class="sy0">,</span> <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st_h">'#'</span><span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'COMMENT_MULTI'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'/*'</span> <span class="sy0">=&gt;</span> <span class="st_h">'*/'</span><span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'COMMENT_REGEXP'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Heredoc and Nowdoc syntax</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <span class="st_h">'/&lt;&lt;&lt;\s*?(\'?)([a-zA-Z0-9]+?)\1[^\n]*?\\n.*\\n\\2(?![a-zA-Z0-9])/siU'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// phpdoc comments</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <span class="st_h">'#/\*\*(?![\*\/]).*\*/#sU'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Advanced # handling</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;/#.*?(?:(?=\?\&gt;)|^)/smi&quot;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'CASE_KEYWORDS'</span> <span class="sy0">=&gt;</span> GESHI_CAPS_NO_CHANGE<span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'QUOTEMARKS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'&quot;'</span><span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'ESCAPE_CHAR'</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'ESCAPE_REGEXP'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Simple Single Char Escapes</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;#<span class="es1">\\</span><span class="es1">\\</span>[nfrtv<span class="es1">\$</span><span class="es1">\&quot;</span><span class="es1">\n</span><span class="es1">\\</span><span class="es1">\\</span>]#i&quot;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Hexadecimal Char Specs</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;#<span class="es1">\\</span><span class="es1">\\</span>x[\da-fA-F]{1,2}#i&quot;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Octal Char Specs</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;#<span class="es1">\\</span><span class="es1">\\</span>[0-7]{1,3}#&quot;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//String Parsing of Variable Names</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;#<span class="es1">\\</span>$[a-z0-9_]+(?:<span class="es1">\\</span>[[a-z0-9_]+<span class="es1">\\</span>]|-&gt;[a-z0-9_]+)?|(?:<span class="es1">\\</span>{<span class="es1">\\</span>$|<span class="es1">\\</span>$<span class="es1">\\</span>{)[a-z0-9_]+(?:<span class="es1">\\</span>[('?)[a-z0-9_]*<span class="es1">\\</span>1<span class="es1">\\</span>]|-&gt;[a-z0-9_]+)*<span class="es1">\\</span>}#i&quot;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Experimental extension supporting cascaded {${$var}} syntax</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">5</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;#<span class="es1">\$</span>[a-z0-9_]+(?:\[[a-z0-9_]+\]|-&gt;[a-z0-9_]+)?|(?:\{<span class="es1">\$</span>|<span class="es1">\$</span>\{)[a-z0-9_]+(?:\[('?)[a-z0-9_]*<span class="es1">\\</span>1\]|-&gt;[a-z0-9_]+)*\}|\{<span class="es1">\$</span>(?R)\}#i&quot;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Format String support in &quot;&quot;-Strings</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">6</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;#%(?:%|(?:\d+<span class="es1">\\</span><span class="es1">\\</span><span class="es1">\\</span><span class="es1">\$</span>)?<span class="es1">\\</span>+?(?:<span class="es2">\x20</span>|0|'.)?-?(?:\d+|<span class="es1">\\</span>*)?(?:\.\d+)?[bcdefFosuxX])#&quot;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'HARDQUOTE'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&quot;'&quot;</span><span class="sy0">,</span> <span class="st0">&quot;'&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'HARDESCAPE'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&quot;'&quot;</span><span class="sy0">,</span> <span class="st0">&quot;<span class="es1">\\</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'HARDCHAR'</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;<span class="es1">\\</span>&quot;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'NUMBERS'</span> <span class="sy0">=&gt;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; GESHI_NUMBER_INT_BASIC <span class="sy0">|</span> GESHI_NUMBER_OCT_PREFIX <span class="sy0">|</span> GESHI_NUMBER_HEX_PREFIX <span class="sy0">|</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; GESHI_NUMBER_FLT_SCI_ZERO<span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'KEYWORDS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'as'</span><span class="sy0">,</span><span class="st_h">'break'</span><span class="sy0">,</span><span class="st_h">'case'</span><span class="sy0">,</span><span class="st_h">'continue'</span><span class="sy0">,</span><span class="st_h">'default'</span><span class="sy0">,</span><span class="st_h">'do'</span><span class="sy0">,</span><span class="st_h">'else'</span><span class="sy0">,</span><span class="st_h">'elseif'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'endfor'</span><span class="sy0">,</span><span class="st_h">'endforeach'</span><span class="sy0">,</span><span class="st_h">'endif'</span><span class="sy0">,</span><span class="st_h">'endswitch'</span><span class="sy0">,</span><span class="st_h">'endwhile'</span><span class="sy0">,</span><span class="st_h">'for'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'foreach'</span><span class="sy0">,</span><span class="st_h">'if'</span><span class="sy0">,</span><span class="st_h">'include'</span><span class="sy0">,</span><span class="st_h">'include_once'</span><span class="sy0">,</span><span class="st_h">'require'</span><span class="sy0">,</span><span class="st_h">'require_once'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'return'</span><span class="sy0">,</span><span class="st_h">'switch'</span><span class="sy0">,</span><span class="st_h">'throw'</span><span class="sy0">,</span><span class="st_h">'while'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'echo'</span><span class="sy0">,</span><span class="st_h">'print'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'&amp;amp;new'</span><span class="sy0">,</span><span class="st_h">'&amp;lt;/script&amp;gt;'</span><span class="sy0">,</span><span class="st_h">'&amp;lt;?php'</span><span class="sy0">,</span><span class="st_h">'&amp;lt;script language'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'abstract'</span><span class="sy0">,</span><span class="st_h">'class'</span><span class="sy0">,</span><span class="st_h">'const'</span><span class="sy0">,</span><span class="st_h">'declare'</span><span class="sy0">,</span><span class="st_h">'extends'</span><span class="sy0">,</span><span class="st_h">'function'</span><span class="sy0">,</span><span class="st_h">'global'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'interface'</span><span class="sy0">,</span><span class="st_h">'namespace'</span><span class="sy0">,</span><span class="st_h">'new'</span><span class="sy0">,</span><span class="st_h">'private'</span><span class="sy0">,</span><span class="st_h">'protected'</span><span class="sy0">,</span><span class="st_h">'public'</span><span class="sy0">,</span><span class="st_h">'self'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'use'</span><span class="sy0">,</span><span class="st_h">'var'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'abs'</span><span class="sy0">,</span><span class="st_h">'acos'</span><span class="sy0">,</span><span class="st_h">'acosh'</span><span class="sy0">,</span><span class="st_h">'addcslashes'</span><span class="sy0">,</span><span class="st_h">'addslashes'</span><span class="sy0">,</span><span class="st_h">'aggregate'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'aggregate_methods'</span><span class="sy0">,</span><span class="st_h">'aggregate_methods_by_list'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'aggregate_methods_by_regexp'</span><span class="sy0">,</span><span class="st_h">'aggregate_properties'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'aggregate_properties_by_list'</span><span class="sy0">,</span><span class="st_h">'aggregate_properties_by_regexp'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'aggregation_info'</span><span class="sy0">,</span><span class="st_h">'apache_child_terminate'</span><span class="sy0">,</span><span class="st_h">'apache_get_modules'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'apache_get_version'</span><span class="sy0">,</span><span class="st_h">'apache_getenv'</span><span class="sy0">,</span><span class="st_h">'apache_lookup_uri'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'apache_note'</span><span class="sy0">,</span><span class="st_h">'apache_request_headers'</span><span class="sy0">,</span><span class="st_h">'apache_response_headers'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'apache_setenv'</span><span class="sy0">,</span><span class="st_h">'array'</span><span class="sy0">,</span><span class="st_h">'array_change_key_case'</span><span class="sy0">,</span><span class="st_h">'array_chunk'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'array_combine'</span><span class="sy0">,</span><span class="st_h">'array_count_values'</span><span class="sy0">,</span><span class="st_h">'array_diff'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'array_diff_assoc'</span><span class="sy0">,</span><span class="st_h">'array_diff_key'</span><span class="sy0">,</span><span class="st_h">'array_diff_uassoc'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'array_diff_ukey'</span><span class="sy0">,</span><span class="st_h">'array_fill'</span><span class="sy0">,</span><span class="st_h">'array_fill_keys'</span><span class="sy0">,</span><span class="st_h">'array_filter'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'array_flip'</span><span class="sy0">,</span><span class="st_h">'array_intersect'</span><span class="sy0">,</span><span class="st_h">'array_intersect_assoc'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'array_intersect_key'</span><span class="sy0">,</span><span class="st_h">'array_intersect_uassoc'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'array_intersect_ukey'</span><span class="sy0">,</span><span class="st_h">'array_key_exists'</span><span class="sy0">,</span><span class="st_h">'array_keys'</span><span class="sy0">,</span><span class="st_h">'array_map'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'array_merge'</span><span class="sy0">,</span><span class="st_h">'array_merge_recursive'</span><span class="sy0">,</span><span class="st_h">'array_multisort'</span><span class="sy0">,</span><span class="st_h">'array_pad'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'array_pop'</span><span class="sy0">,</span><span class="st_h">'array_product'</span><span class="sy0">,</span><span class="st_h">'array_push'</span><span class="sy0">,</span><span class="st_h">'array_rand'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'array_reduce'</span><span class="sy0">,</span><span class="st_h">'array_reverse'</span><span class="sy0">,</span><span class="st_h">'array_search'</span><span class="sy0">,</span><span class="st_h">'array_shift'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'array_slice'</span><span class="sy0">,</span><span class="st_h">'array_splice'</span><span class="sy0">,</span><span class="st_h">'array_sum'</span><span class="sy0">,</span><span class="st_h">'array_udiff'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'array_udiff_assoc'</span><span class="sy0">,</span><span class="st_h">'array_udiff_uassoc'</span><span class="sy0">,</span><span class="st_h">'array_uintersect'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'array_uintersect_assoc'</span><span class="sy0">,</span><span class="st_h">'array_uintersect_uassoc'</span><span class="sy0">,</span><span class="st_h">'array_unique'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'array_unshift'</span><span class="sy0">,</span><span class="st_h">'array_values'</span><span class="sy0">,</span><span class="st_h">'array_walk'</span><span class="sy0">,</span><span class="st_h">'array_walk_recursive'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'arsort'</span><span class="sy0">,</span><span class="st_h">'asin'</span><span class="sy0">,</span><span class="st_h">'asinh'</span><span class="sy0">,</span><span class="st_h">'asort'</span><span class="sy0">,</span><span class="st_h">'assert'</span><span class="sy0">,</span><span class="st_h">'assert_options'</span><span class="sy0">,</span><span class="st_h">'atan'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'atan2'</span><span class="sy0">,</span><span class="st_h">'atanh'</span><span class="sy0">,</span><span class="st_h">'base_convert'</span><span class="sy0">,</span><span class="st_h">'base64_decode'</span><span class="sy0">,</span><span class="st_h">'base64_encode'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'basename'</span><span class="sy0">,</span><span class="st_h">'bcadd'</span><span class="sy0">,</span><span class="st_h">'bccomp'</span><span class="sy0">,</span><span class="st_h">'bcdiv'</span><span class="sy0">,</span><span class="st_h">'bcmod'</span><span class="sy0">,</span><span class="st_h">'bcmul'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bcompiler_load'</span><span class="sy0">,</span><span class="st_h">'bcompiler_load_exe'</span><span class="sy0">,</span><span class="st_h">'bcompiler_parse_class'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bcompiler_read'</span><span class="sy0">,</span><span class="st_h">'bcompiler_write_class'</span><span class="sy0">,</span><span class="st_h">'bcompiler_write_constant'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bcompiler_write_exe_footer'</span><span class="sy0">,</span><span class="st_h">'bcompiler_write_file'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bcompiler_write_footer'</span><span class="sy0">,</span><span class="st_h">'bcompiler_write_function'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bcompiler_write_functions_from_file'</span><span class="sy0">,</span><span class="st_h">'bcompiler_write_header'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bcompiler_write_included_filename'</span><span class="sy0">,</span><span class="st_h">'bcpow'</span><span class="sy0">,</span><span class="st_h">'bcpowmod'</span><span class="sy0">,</span><span class="st_h">'bcscale'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bcsqrt'</span><span class="sy0">,</span><span class="st_h">'bcsub'</span><span class="sy0">,</span><span class="st_h">'bin2hex'</span><span class="sy0">,</span><span class="st_h">'bindec'</span><span class="sy0">,</span><span class="st_h">'bindtextdomain'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bind_textdomain_codeset'</span><span class="sy0">,</span><span class="st_h">'bitset_empty'</span><span class="sy0">,</span><span class="st_h">'bitset_equal'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bitset_excl'</span><span class="sy0">,</span><span class="st_h">'bitset_fill'</span><span class="sy0">,</span><span class="st_h">'bitset_from_array'</span><span class="sy0">,</span><span class="st_h">'bitset_from_hash'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bitset_from_string'</span><span class="sy0">,</span><span class="st_h">'bitset_in'</span><span class="sy0">,</span><span class="st_h">'bitset_incl'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bitset_intersection'</span><span class="sy0">,</span><span class="st_h">'bitset_invert'</span><span class="sy0">,</span><span class="st_h">'bitset_is_empty'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bitset_subset'</span><span class="sy0">,</span><span class="st_h">'bitset_to_array'</span><span class="sy0">,</span><span class="st_h">'bitset_to_hash'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bitset_to_string'</span><span class="sy0">,</span><span class="st_h">'bitset_union'</span><span class="sy0">,</span><span class="st_h">'blenc_encrypt'</span><span class="sy0">,</span><span class="st_h">'bzclose'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bzcompress'</span><span class="sy0">,</span><span class="st_h">'bzdecompress'</span><span class="sy0">,</span><span class="st_h">'bzerrno'</span><span class="sy0">,</span><span class="st_h">'bzerror'</span><span class="sy0">,</span><span class="st_h">'bzerrstr'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'bzflush'</span><span class="sy0">,</span><span class="st_h">'bzopen'</span><span class="sy0">,</span><span class="st_h">'bzread'</span><span class="sy0">,</span><span class="st_h">'bzwrite'</span><span class="sy0">,</span><span class="st_h">'cal_days_in_month'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cal_from_jd'</span><span class="sy0">,</span><span class="st_h">'cal_info'</span><span class="sy0">,</span><span class="st_h">'cal_to_jd'</span><span class="sy0">,</span><span class="st_h">'call_user_func'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'call_user_func_array'</span><span class="sy0">,</span><span class="st_h">'call_user_method'</span><span class="sy0">,</span><span class="st_h">'call_user_method_array'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ceil'</span><span class="sy0">,</span><span class="st_h">'chdir'</span><span class="sy0">,</span><span class="st_h">'checkdate'</span><span class="sy0">,</span><span class="st_h">'checkdnsrr'</span><span class="sy0">,</span><span class="st_h">'chgrp'</span><span class="sy0">,</span><span class="st_h">'chmod'</span><span class="sy0">,</span><span class="st_h">'chop'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'chown'</span><span class="sy0">,</span><span class="st_h">'chr'</span><span class="sy0">,</span><span class="st_h">'chunk_split'</span><span class="sy0">,</span><span class="st_h">'class_exists'</span><span class="sy0">,</span><span class="st_h">'class_implements'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'class_parents'</span><span class="sy0">,</span><span class="st_h">'classkit_aggregate_methods'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'classkit_doc_comments'</span><span class="sy0">,</span><span class="st_h">'classkit_import'</span><span class="sy0">,</span><span class="st_h">'classkit_method_add'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'classkit_method_copy'</span><span class="sy0">,</span><span class="st_h">'classkit_method_redefine'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'classkit_method_remove'</span><span class="sy0">,</span><span class="st_h">'classkit_method_rename'</span><span class="sy0">,</span><span class="st_h">'clearstatcache'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'closedir'</span><span class="sy0">,</span><span class="st_h">'closelog'</span><span class="sy0">,</span><span class="st_h">'com_create_guid'</span><span class="sy0">,</span><span class="st_h">'com_event_sink'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'com_get_active_object'</span><span class="sy0">,</span><span class="st_h">'com_load_typelib'</span><span class="sy0">,</span><span class="st_h">'com_message_pump'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'com_print_typeinfo'</span><span class="sy0">,</span><span class="st_h">'compact'</span><span class="sy0">,</span><span class="st_h">'confirm_phpdoc_compiled'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'connection_aborted'</span><span class="sy0">,</span><span class="st_h">'connection_status'</span><span class="sy0">,</span><span class="st_h">'constant'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'convert_cyr_string'</span><span class="sy0">,</span><span class="st_h">'convert_uudecode'</span><span class="sy0">,</span><span class="st_h">'convert_uuencode'</span><span class="sy0">,</span><span class="st_h">'copy'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cos'</span><span class="sy0">,</span><span class="st_h">'cosh'</span><span class="sy0">,</span><span class="st_h">'count'</span><span class="sy0">,</span><span class="st_h">'count_chars'</span><span class="sy0">,</span><span class="st_h">'cpdf_add_annotation'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_add_outline'</span><span class="sy0">,</span><span class="st_h">'cpdf_arc'</span><span class="sy0">,</span><span class="st_h">'cpdf_begin_text'</span><span class="sy0">,</span><span class="st_h">'cpdf_circle'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_clip'</span><span class="sy0">,</span><span class="st_h">'cpdf_close'</span><span class="sy0">,</span><span class="st_h">'cpdf_closepath'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_closepath_fill_stroke'</span><span class="sy0">,</span><span class="st_h">'cpdf_closepath_stroke'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_continue_text'</span><span class="sy0">,</span><span class="st_h">'cpdf_curveto'</span><span class="sy0">,</span><span class="st_h">'cpdf_end_text'</span><span class="sy0">,</span><span class="st_h">'cpdf_fill'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_fill_stroke'</span><span class="sy0">,</span><span class="st_h">'cpdf_finalize'</span><span class="sy0">,</span><span class="st_h">'cpdf_finalize_page'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_global_set_document_limits'</span><span class="sy0">,</span><span class="st_h">'cpdf_import_jpeg'</span><span class="sy0">,</span><span class="st_h">'cpdf_lineto'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_moveto'</span><span class="sy0">,</span><span class="st_h">'cpdf_newpath'</span><span class="sy0">,</span><span class="st_h">'cpdf_open'</span><span class="sy0">,</span><span class="st_h">'cpdf_output_buffer'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_page_init'</span><span class="sy0">,</span><span class="st_h">'cpdf_rect'</span><span class="sy0">,</span><span class="st_h">'cpdf_restore'</span><span class="sy0">,</span><span class="st_h">'cpdf_rlineto'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_rmoveto'</span><span class="sy0">,</span><span class="st_h">'cpdf_rotate'</span><span class="sy0">,</span><span class="st_h">'cpdf_rotate_text'</span><span class="sy0">,</span><span class="st_h">'cpdf_save'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_save_to_file'</span><span class="sy0">,</span><span class="st_h">'cpdf_scale'</span><span class="sy0">,</span><span class="st_h">'cpdf_set_action_url'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_set_char_spacing'</span><span class="sy0">,</span><span class="st_h">'cpdf_set_creator'</span><span class="sy0">,</span><span class="st_h">'cpdf_set_current_page'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_set_font'</span><span class="sy0">,</span><span class="st_h">'cpdf_set_font_directories'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_set_font_map_file'</span><span class="sy0">,</span><span class="st_h">'cpdf_set_horiz_scaling'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_set_keywords'</span><span class="sy0">,</span><span class="st_h">'cpdf_set_leading'</span><span class="sy0">,</span><span class="st_h">'cpdf_set_page_animation'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_set_subject'</span><span class="sy0">,</span><span class="st_h">'cpdf_set_text_matrix'</span><span class="sy0">,</span><span class="st_h">'cpdf_set_text_pos'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_set_text_rendering'</span><span class="sy0">,</span><span class="st_h">'cpdf_set_text_rise'</span><span class="sy0">,</span><span class="st_h">'cpdf_set_title'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_set_viewer_preferences'</span><span class="sy0">,</span><span class="st_h">'cpdf_set_word_spacing'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_setdash'</span><span class="sy0">,</span><span class="st_h">'cpdf_setflat'</span><span class="sy0">,</span><span class="st_h">'cpdf_setgray'</span><span class="sy0">,</span><span class="st_h">'cpdf_setgray_fill'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_setgray_stroke'</span><span class="sy0">,</span><span class="st_h">'cpdf_setlinecap'</span><span class="sy0">,</span><span class="st_h">'cpdf_setlinejoin'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_setlinewidth'</span><span class="sy0">,</span><span class="st_h">'cpdf_setmiterlimit'</span><span class="sy0">,</span><span class="st_h">'cpdf_setrgbcolor'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_setrgbcolor_fill'</span><span class="sy0">,</span><span class="st_h">'cpdf_setrgbcolor_stroke'</span><span class="sy0">,</span><span class="st_h">'cpdf_show'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_show_xy'</span><span class="sy0">,</span><span class="st_h">'cpdf_stringwidth'</span><span class="sy0">,</span><span class="st_h">'cpdf_stroke'</span><span class="sy0">,</span><span class="st_h">'cpdf_text'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cpdf_translate'</span><span class="sy0">,</span><span class="st_h">'crack_check'</span><span class="sy0">,</span><span class="st_h">'crack_closedict'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'crack_getlastmessage'</span><span class="sy0">,</span><span class="st_h">'crack_opendict'</span><span class="sy0">,</span><span class="st_h">'crc32'</span><span class="sy0">,</span><span class="st_h">'create_function'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'crypt'</span><span class="sy0">,</span><span class="st_h">'ctype_alnum'</span><span class="sy0">,</span><span class="st_h">'ctype_alpha'</span><span class="sy0">,</span><span class="st_h">'ctype_cntrl'</span><span class="sy0">,</span><span class="st_h">'ctype_digit'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ctype_graph'</span><span class="sy0">,</span><span class="st_h">'ctype_lower'</span><span class="sy0">,</span><span class="st_h">'ctype_print'</span><span class="sy0">,</span><span class="st_h">'ctype_punct'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ctype_space'</span><span class="sy0">,</span><span class="st_h">'ctype_upper'</span><span class="sy0">,</span><span class="st_h">'ctype_xdigit'</span><span class="sy0">,</span><span class="st_h">'curl_close'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'curl_copy_handle'</span><span class="sy0">,</span><span class="st_h">'curl_errno'</span><span class="sy0">,</span><span class="st_h">'curl_error'</span><span class="sy0">,</span><span class="st_h">'curl_exec'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'curl_getinfo'</span><span class="sy0">,</span><span class="st_h">'curl_init'</span><span class="sy0">,</span><span class="st_h">'curl_multi_add_handle'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'curl_multi_close'</span><span class="sy0">,</span><span class="st_h">'curl_multi_exec'</span><span class="sy0">,</span><span class="st_h">'curl_multi_getcontent'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'curl_multi_info_read'</span><span class="sy0">,</span><span class="st_h">'curl_multi_init'</span><span class="sy0">,</span><span class="st_h">'curl_multi_remove_handle'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'curl_multi_select'</span><span class="sy0">,</span><span class="st_h">'curl_setopt'</span><span class="sy0">,</span><span class="st_h">'curl_setopt_array'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'curl_version'</span><span class="sy0">,</span><span class="st_h">'current'</span><span class="sy0">,</span><span class="st_h">'cvsclient_connect'</span><span class="sy0">,</span><span class="st_h">'cvsclient_log'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'cvsclient_login'</span><span class="sy0">,</span><span class="st_h">'cvsclient_retrieve'</span><span class="sy0">,</span><span class="st_h">'date'</span><span class="sy0">,</span><span class="st_h">'date_create'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'date_date_set'</span><span class="sy0">,</span><span class="st_h">'date_default_timezone_get'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'date_default_timezone_set'</span><span class="sy0">,</span><span class="st_h">'date_format'</span><span class="sy0">,</span><span class="st_h">'date_isodate_set'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'date_modify'</span><span class="sy0">,</span><span class="st_h">'date_offset_get'</span><span class="sy0">,</span><span class="st_h">'date_parse'</span><span class="sy0">,</span><span class="st_h">'date_sun_info'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'date_sunrise'</span><span class="sy0">,</span><span class="st_h">'date_sunset'</span><span class="sy0">,</span><span class="st_h">'date_time_set'</span><span class="sy0">,</span><span class="st_h">'date_timezone_get'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'date_timezone_set'</span><span class="sy0">,</span><span class="st_h">'db_id_list'</span><span class="sy0">,</span><span class="st_h">'dba_close'</span><span class="sy0">,</span><span class="st_h">'dba_delete'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dba_exists'</span><span class="sy0">,</span><span class="st_h">'dba_fetch'</span><span class="sy0">,</span><span class="st_h">'dba_firstkey'</span><span class="sy0">,</span><span class="st_h">'dba_handlers'</span><span class="sy0">,</span><span class="st_h">'dba_insert'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dba_key_split'</span><span class="sy0">,</span><span class="st_h">'dba_list'</span><span class="sy0">,</span><span class="st_h">'dba_nextkey'</span><span class="sy0">,</span><span class="st_h">'dba_open'</span><span class="sy0">,</span><span class="st_h">'dba_optimize'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dba_popen'</span><span class="sy0">,</span><span class="st_h">'dba_replace'</span><span class="sy0">,</span><span class="st_h">'dba_sync'</span><span class="sy0">,</span><span class="st_h">'dbase_add_record'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dbase_close'</span><span class="sy0">,</span><span class="st_h">'dbase_create'</span><span class="sy0">,</span><span class="st_h">'dbase_delete_record'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dbase_get_header_info'</span><span class="sy0">,</span><span class="st_h">'dbase_get_record'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dbase_get_record_with_names'</span><span class="sy0">,</span><span class="st_h">'dbase_numfields'</span><span class="sy0">,</span><span class="st_h">'dbase_numrecords'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dbase_open'</span><span class="sy0">,</span><span class="st_h">'dbase_pack'</span><span class="sy0">,</span><span class="st_h">'dbase_replace_record'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dbg_get_all_contexts'</span><span class="sy0">,</span><span class="st_h">'dbg_get_all_module_names'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dbg_get_all_source_lines'</span><span class="sy0">,</span><span class="st_h">'dbg_get_context_name'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dbg_get_module_name'</span><span class="sy0">,</span><span class="st_h">'dbg_get_profiler_results'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dbg_get_source_context'</span><span class="sy0">,</span><span class="st_h">'dblist'</span><span class="sy0">,</span><span class="st_h">'dbmclose'</span><span class="sy0">,</span><span class="st_h">'dbmdelete'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dbmexists'</span><span class="sy0">,</span><span class="st_h">'dbmfetch'</span><span class="sy0">,</span><span class="st_h">'dbmfirstkey'</span><span class="sy0">,</span><span class="st_h">'dbminsert'</span><span class="sy0">,</span><span class="st_h">'dbmnextkey'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dbmopen'</span><span class="sy0">,</span><span class="st_h">'dbmreplace'</span><span class="sy0">,</span><span class="st_h">'dbx_close'</span><span class="sy0">,</span><span class="st_h">'dbx_compare'</span><span class="sy0">,</span><span class="st_h">'dbx_connect'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dbx_error'</span><span class="sy0">,</span><span class="st_h">'dbx_escape_string'</span><span class="sy0">,</span><span class="st_h">'dbx_fetch_row'</span><span class="sy0">,</span><span class="st_h">'dbx_query'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dbx_sort'</span><span class="sy0">,</span><span class="st_h">'dcgettext'</span><span class="sy0">,</span><span class="st_h">'dcngettext'</span><span class="sy0">,</span><span class="st_h">'deaggregate'</span><span class="sy0">,</span><span class="st_h">'debug_backtrace'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'debug_zval_dump'</span><span class="sy0">,</span><span class="st_h">'debugbreak'</span><span class="sy0">,</span><span class="st_h">'decbin'</span><span class="sy0">,</span><span class="st_h">'dechex'</span><span class="sy0">,</span><span class="st_h">'decoct'</span><span class="sy0">,</span><span class="st_h">'define'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'defined'</span><span class="sy0">,</span><span class="st_h">'define_syslog_variables'</span><span class="sy0">,</span><span class="st_h">'deg2rad'</span><span class="sy0">,</span><span class="st_h">'dgettext'</span><span class="sy0">,</span><span class="st_h">'die'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dio_close'</span><span class="sy0">,</span><span class="st_h">'dio_open'</span><span class="sy0">,</span><span class="st_h">'dio_read'</span><span class="sy0">,</span><span class="st_h">'dio_seek'</span><span class="sy0">,</span><span class="st_h">'dio_stat'</span><span class="sy0">,</span><span class="st_h">'dio_write'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'dir'</span><span class="sy0">,</span><span class="st_h">'dirname'</span><span class="sy0">,</span><span class="st_h">'disk_free_space'</span><span class="sy0">,</span><span class="st_h">'disk_total_space'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'diskfreespace'</span><span class="sy0">,</span><span class="st_h">'dl'</span><span class="sy0">,</span><span class="st_h">'dngettext'</span><span class="sy0">,</span><span class="st_h">'docblock_token_name'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'docblock_tokenize'</span><span class="sy0">,</span><span class="st_h">'dom_import_simplexml'</span><span class="sy0">,</span><span class="st_h">'domxml_add_root'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_attributes'</span><span class="sy0">,</span><span class="st_h">'domxml_children'</span><span class="sy0">,</span><span class="st_h">'domxml_doc_add_root'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_doc_document_element'</span><span class="sy0">,</span><span class="st_h">'domxml_doc_get_element_by_id'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_doc_get_elements_by_tagname'</span><span class="sy0">,</span><span class="st_h">'domxml_doc_get_root'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_doc_set_root'</span><span class="sy0">,</span><span class="st_h">'domxml_doc_validate'</span><span class="sy0">,</span><span class="st_h">'domxml_doc_xinclude'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_dump_mem'</span><span class="sy0">,</span><span class="st_h">'domxml_dump_mem_file'</span><span class="sy0">,</span><span class="st_h">'domxml_dump_node'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_dumpmem'</span><span class="sy0">,</span><span class="st_h">'domxml_elem_get_attribute'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_elem_set_attribute'</span><span class="sy0">,</span><span class="st_h">'domxml_get_attribute'</span><span class="sy0">,</span><span class="st_h">'domxml_getattr'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_html_dump_mem'</span><span class="sy0">,</span><span class="st_h">'domxml_new_child'</span><span class="sy0">,</span><span class="st_h">'domxml_new_doc'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_new_xmldoc'</span><span class="sy0">,</span><span class="st_h">'domxml_node'</span><span class="sy0">,</span><span class="st_h">'domxml_node_add_namespace'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_node_attributes'</span><span class="sy0">,</span><span class="st_h">'domxml_node_children'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_node_get_content'</span><span class="sy0">,</span><span class="st_h">'domxml_node_has_attributes'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_node_new_child'</span><span class="sy0">,</span><span class="st_h">'domxml_node_set_content'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_node_set_namespace'</span><span class="sy0">,</span><span class="st_h">'domxml_node_unlink_node'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_open_file'</span><span class="sy0">,</span><span class="st_h">'domxml_open_mem'</span><span class="sy0">,</span><span class="st_h">'domxml_parser'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_parser_add_chunk'</span><span class="sy0">,</span><span class="st_h">'domxml_parser_cdata_section'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_parser_characters'</span><span class="sy0">,</span><span class="st_h">'domxml_parser_comment'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_parser_end'</span><span class="sy0">,</span><span class="st_h">'domxml_parser_end_document'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_parser_end_element'</span><span class="sy0">,</span><span class="st_h">'domxml_parser_entity_reference'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_parser_get_document'</span><span class="sy0">,</span><span class="st_h">'domxml_parser_namespace_decl'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_parser_processing_instruction'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_parser_start_document'</span><span class="sy0">,</span><span class="st_h">'domxml_parser_start_element'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_root'</span><span class="sy0">,</span><span class="st_h">'domxml_set_attribute'</span><span class="sy0">,</span><span class="st_h">'domxml_setattr'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_substitute_entities_default'</span><span class="sy0">,</span><span class="st_h">'domxml_unlink_node'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'domxml_version'</span><span class="sy0">,</span><span class="st_h">'domxml_xmltree'</span><span class="sy0">,</span><span class="st_h">'doubleval'</span><span class="sy0">,</span><span class="st_h">'each'</span><span class="sy0">,</span><span class="st_h">'easter_date'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'easter_days'</span><span class="sy0">,</span><span class="st_h">'empty'</span><span class="sy0">,</span><span class="st_h">'end'</span><span class="sy0">,</span><span class="st_h">'ereg'</span><span class="sy0">,</span><span class="st_h">'ereg_replace'</span><span class="sy0">,</span><span class="st_h">'eregi'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'eregi_replace'</span><span class="sy0">,</span><span class="st_h">'error_get_last'</span><span class="sy0">,</span><span class="st_h">'error_log'</span><span class="sy0">,</span><span class="st_h">'error_reporting'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'escapeshellarg'</span><span class="sy0">,</span><span class="st_h">'escapeshellcmd'</span><span class="sy0">,</span><span class="st_h">'eval'</span><span class="sy0">,</span><span class="st_h">'event_deschedule'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'event_dispatch'</span><span class="sy0">,</span><span class="st_h">'event_free'</span><span class="sy0">,</span><span class="st_h">'event_handle_signal'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'event_have_events'</span><span class="sy0">,</span><span class="st_h">'event_init'</span><span class="sy0">,</span><span class="st_h">'event_new'</span><span class="sy0">,</span><span class="st_h">'event_pending'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'event_priority_set'</span><span class="sy0">,</span><span class="st_h">'event_schedule'</span><span class="sy0">,</span><span class="st_h">'event_set'</span><span class="sy0">,</span><span class="st_h">'event_timeout'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'exec'</span><span class="sy0">,</span><span class="st_h">'exif_imagetype'</span><span class="sy0">,</span><span class="st_h">'exif_read_data'</span><span class="sy0">,</span><span class="st_h">'exif_tagname'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'exif_thumbnail'</span><span class="sy0">,</span><span class="st_h">'exit'</span><span class="sy0">,</span><span class="st_h">'exp'</span><span class="sy0">,</span><span class="st_h">'explode'</span><span class="sy0">,</span><span class="st_h">'expm1'</span><span class="sy0">,</span><span class="st_h">'extension_loaded'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'extract'</span><span class="sy0">,</span><span class="st_h">'ezmlm_hash'</span><span class="sy0">,</span><span class="st_h">'fbird_add_user'</span><span class="sy0">,</span><span class="st_h">'fbird_affected_rows'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_backup'</span><span class="sy0">,</span><span class="st_h">'fbird_blob_add'</span><span class="sy0">,</span><span class="st_h">'fbird_blob_cancel'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_blob_close'</span><span class="sy0">,</span><span class="st_h">'fbird_blob_create'</span><span class="sy0">,</span><span class="st_h">'fbird_blob_echo'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_blob_get'</span><span class="sy0">,</span><span class="st_h">'fbird_blob_import'</span><span class="sy0">,</span><span class="st_h">'fbird_blob_info'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_blob_open'</span><span class="sy0">,</span><span class="st_h">'fbird_close'</span><span class="sy0">,</span><span class="st_h">'fbird_commit'</span><span class="sy0">,</span><span class="st_h">'fbird_commit_ret'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_connect'</span><span class="sy0">,</span><span class="st_h">'fbird_db_info'</span><span class="sy0">,</span><span class="st_h">'fbird_delete_user'</span><span class="sy0">,</span><span class="st_h">'fbird_drop_db'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_errcode'</span><span class="sy0">,</span><span class="st_h">'fbird_errmsg'</span><span class="sy0">,</span><span class="st_h">'fbird_execute'</span><span class="sy0">,</span><span class="st_h">'fbird_fetch_assoc'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_fetch_object'</span><span class="sy0">,</span><span class="st_h">'fbird_fetch_row'</span><span class="sy0">,</span><span class="st_h">'fbird_field_info'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_free_event_handler'</span><span class="sy0">,</span><span class="st_h">'fbird_free_query'</span><span class="sy0">,</span><span class="st_h">'fbird_free_result'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_gen_id'</span><span class="sy0">,</span><span class="st_h">'fbird_maintain_db'</span><span class="sy0">,</span><span class="st_h">'fbird_modify_user'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_name_result'</span><span class="sy0">,</span><span class="st_h">'fbird_num_fields'</span><span class="sy0">,</span><span class="st_h">'fbird_num_params'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_param_info'</span><span class="sy0">,</span><span class="st_h">'fbird_pconnect'</span><span class="sy0">,</span><span class="st_h">'fbird_prepare'</span><span class="sy0">,</span><span class="st_h">'fbird_query'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_restore'</span><span class="sy0">,</span><span class="st_h">'fbird_rollback'</span><span class="sy0">,</span><span class="st_h">'fbird_rollback_ret'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_server_info'</span><span class="sy0">,</span><span class="st_h">'fbird_service_attach'</span><span class="sy0">,</span><span class="st_h">'fbird_service_detach'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fbird_set_event_handler'</span><span class="sy0">,</span><span class="st_h">'fbird_trans'</span><span class="sy0">,</span><span class="st_h">'fbird_wait_event'</span><span class="sy0">,</span><span class="st_h">'fclose'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fdf_add_doc_javascript'</span><span class="sy0">,</span><span class="st_h">'fdf_add_template'</span><span class="sy0">,</span><span class="st_h">'fdf_close'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fdf_create'</span><span class="sy0">,</span><span class="st_h">'fdf_enum_values'</span><span class="sy0">,</span><span class="st_h">'fdf_errno'</span><span class="sy0">,</span><span class="st_h">'fdf_error'</span><span class="sy0">,</span><span class="st_h">'fdf_get_ap'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fdf_get_attachment'</span><span class="sy0">,</span><span class="st_h">'fdf_get_encoding'</span><span class="sy0">,</span><span class="st_h">'fdf_get_file'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fdf_get_flags'</span><span class="sy0">,</span><span class="st_h">'fdf_get_opt'</span><span class="sy0">,</span><span class="st_h">'fdf_get_status'</span><span class="sy0">,</span><span class="st_h">'fdf_get_value'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fdf_get_version'</span><span class="sy0">,</span><span class="st_h">'fdf_header'</span><span class="sy0">,</span><span class="st_h">'fdf_next_field_name'</span><span class="sy0">,</span><span class="st_h">'fdf_open'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fdf_open_string'</span><span class="sy0">,</span><span class="st_h">'fdf_remove_item'</span><span class="sy0">,</span><span class="st_h">'fdf_save'</span><span class="sy0">,</span><span class="st_h">'fdf_save_string'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fdf_set_ap'</span><span class="sy0">,</span><span class="st_h">'fdf_set_encoding'</span><span class="sy0">,</span><span class="st_h">'fdf_set_file'</span><span class="sy0">,</span><span class="st_h">'fdf_set_flags'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fdf_set_javascript_action'</span><span class="sy0">,</span><span class="st_h">'fdf_set_on_import_javascript'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fdf_set_opt'</span><span class="sy0">,</span><span class="st_h">'fdf_set_status'</span><span class="sy0">,</span><span class="st_h">'fdf_set_submit_form_action'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fdf_set_target_frame'</span><span class="sy0">,</span><span class="st_h">'fdf_set_value'</span><span class="sy0">,</span><span class="st_h">'fdf_set_version'</span><span class="sy0">,</span><span class="st_h">'feof'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fflush'</span><span class="sy0">,</span><span class="st_h">'fgetc'</span><span class="sy0">,</span><span class="st_h">'fgetcsv'</span><span class="sy0">,</span><span class="st_h">'fgets'</span><span class="sy0">,</span><span class="st_h">'fgetss'</span><span class="sy0">,</span><span class="st_h">'file'</span><span class="sy0">,</span><span class="st_h">'file_exists'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'file_get_contents'</span><span class="sy0">,</span><span class="st_h">'file_put_contents'</span><span class="sy0">,</span><span class="st_h">'fileatime'</span><span class="sy0">,</span><span class="st_h">'filectime'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'filegroup'</span><span class="sy0">,</span><span class="st_h">'fileinode'</span><span class="sy0">,</span><span class="st_h">'filemtime'</span><span class="sy0">,</span><span class="st_h">'fileowner'</span><span class="sy0">,</span><span class="st_h">'fileperms'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'filepro'</span><span class="sy0">,</span><span class="st_h">'filepro_fieldcount'</span><span class="sy0">,</span><span class="st_h">'filepro_fieldname'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'filepro_fieldtype'</span><span class="sy0">,</span><span class="st_h">'filepro_fieldwidth'</span><span class="sy0">,</span><span class="st_h">'filepro_retrieve'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'filepro_rowcount'</span><span class="sy0">,</span><span class="st_h">'filesize'</span><span class="sy0">,</span><span class="st_h">'filetype'</span><span class="sy0">,</span><span class="st_h">'filter_has_var'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'filter_id'</span><span class="sy0">,</span><span class="st_h">'filter_input'</span><span class="sy0">,</span><span class="st_h">'filter_input_array'</span><span class="sy0">,</span><span class="st_h">'filter_list'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'filter_var'</span><span class="sy0">,</span><span class="st_h">'filter_var_array'</span><span class="sy0">,</span><span class="st_h">'finfo_buffer'</span><span class="sy0">,</span><span class="st_h">'finfo_close'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'finfo_file'</span><span class="sy0">,</span><span class="st_h">'finfo_open'</span><span class="sy0">,</span><span class="st_h">'finfo_set_flags'</span><span class="sy0">,</span><span class="st_h">'floatval'</span><span class="sy0">,</span><span class="st_h">'flock'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'floor'</span><span class="sy0">,</span><span class="st_h">'flush'</span><span class="sy0">,</span><span class="st_h">'fmod'</span><span class="sy0">,</span><span class="st_h">'fnmatch'</span><span class="sy0">,</span><span class="st_h">'fopen'</span><span class="sy0">,</span><span class="st_h">'fpassthru'</span><span class="sy0">,</span><span class="st_h">'fprintf'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fputcsv'</span><span class="sy0">,</span><span class="st_h">'fputs'</span><span class="sy0">,</span><span class="st_h">'fread'</span><span class="sy0">,</span><span class="st_h">'frenchtojd'</span><span class="sy0">,</span><span class="st_h">'fribidi_charset_info'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fribidi_get_charsets'</span><span class="sy0">,</span><span class="st_h">'fribidi_log2vis'</span><span class="sy0">,</span><span class="st_h">'fscanf'</span><span class="sy0">,</span><span class="st_h">'fseek'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'fsockopen'</span><span class="sy0">,</span><span class="st_h">'fstat'</span><span class="sy0">,</span><span class="st_h">'ftell'</span><span class="sy0">,</span><span class="st_h">'ftok'</span><span class="sy0">,</span><span class="st_h">'ftp_alloc'</span><span class="sy0">,</span><span class="st_h">'ftp_cdup'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ftp_chdir'</span><span class="sy0">,</span><span class="st_h">'ftp_chmod'</span><span class="sy0">,</span><span class="st_h">'ftp_close'</span><span class="sy0">,</span><span class="st_h">'ftp_connect'</span><span class="sy0">,</span><span class="st_h">'ftp_delete'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ftp_exec'</span><span class="sy0">,</span><span class="st_h">'ftp_fget'</span><span class="sy0">,</span><span class="st_h">'ftp_fput'</span><span class="sy0">,</span><span class="st_h">'ftp_get'</span><span class="sy0">,</span><span class="st_h">'ftp_get_option'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ftp_login'</span><span class="sy0">,</span><span class="st_h">'ftp_mdtm'</span><span class="sy0">,</span><span class="st_h">'ftp_mkdir'</span><span class="sy0">,</span><span class="st_h">'ftp_nb_continue'</span><span class="sy0">,</span><span class="st_h">'ftp_nb_fget'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ftp_nb_fput'</span><span class="sy0">,</span><span class="st_h">'ftp_nb_get'</span><span class="sy0">,</span><span class="st_h">'ftp_nb_put'</span><span class="sy0">,</span><span class="st_h">'ftp_nlist'</span><span class="sy0">,</span><span class="st_h">'ftp_pasv'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ftp_put'</span><span class="sy0">,</span><span class="st_h">'ftp_pwd'</span><span class="sy0">,</span><span class="st_h">'ftp_quit'</span><span class="sy0">,</span><span class="st_h">'ftp_raw'</span><span class="sy0">,</span><span class="st_h">'ftp_rawlist'</span><span class="sy0">,</span><span class="st_h">'ftp_rename'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ftp_rmdir'</span><span class="sy0">,</span><span class="st_h">'ftp_set_option'</span><span class="sy0">,</span><span class="st_h">'ftp_site'</span><span class="sy0">,</span><span class="st_h">'ftp_size'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ftp_ssl_connect'</span><span class="sy0">,</span><span class="st_h">'ftp_systype'</span><span class="sy0">,</span><span class="st_h">'ftruncate'</span><span class="sy0">,</span><span class="st_h">'function_exists'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'func_get_arg'</span><span class="sy0">,</span><span class="st_h">'func_get_args'</span><span class="sy0">,</span><span class="st_h">'func_num_args'</span><span class="sy0">,</span><span class="st_h">'fwrite'</span><span class="sy0">,</span><span class="st_h">'gd_info'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'getallheaders'</span><span class="sy0">,</span><span class="st_h">'getcwd'</span><span class="sy0">,</span><span class="st_h">'getdate'</span><span class="sy0">,</span><span class="st_h">'getenv'</span><span class="sy0">,</span><span class="st_h">'gethostbyaddr'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'gethostbyname'</span><span class="sy0">,</span><span class="st_h">'gethostbynamel'</span><span class="sy0">,</span><span class="st_h">'getimagesize'</span><span class="sy0">,</span><span class="st_h">'getlastmod'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'getmxrr'</span><span class="sy0">,</span><span class="st_h">'getmygid'</span><span class="sy0">,</span><span class="st_h">'getmyinode'</span><span class="sy0">,</span><span class="st_h">'getmypid'</span><span class="sy0">,</span><span class="st_h">'getmyuid'</span><span class="sy0">,</span><span class="st_h">'getopt'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'getprotobyname'</span><span class="sy0">,</span><span class="st_h">'getprotobynumber'</span><span class="sy0">,</span><span class="st_h">'getrandmax'</span><span class="sy0">,</span><span class="st_h">'getrusage'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'getservbyname'</span><span class="sy0">,</span><span class="st_h">'getservbyport'</span><span class="sy0">,</span><span class="st_h">'gettext'</span><span class="sy0">,</span><span class="st_h">'gettimeofday'</span><span class="sy0">,</span><span class="st_h">'gettype'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'get_browser'</span><span class="sy0">,</span><span class="st_h">'get_cfg_var'</span><span class="sy0">,</span><span class="st_h">'get_class'</span><span class="sy0">,</span><span class="st_h">'get_class_methods'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'get_class_vars'</span><span class="sy0">,</span><span class="st_h">'get_current_user'</span><span class="sy0">,</span><span class="st_h">'get_declared_classes'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'get_defined_constants'</span><span class="sy0">,</span><span class="st_h">'get_defined_functions'</span><span class="sy0">,</span><span class="st_h">'get_defined_vars'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'get_extension_funcs'</span><span class="sy0">,</span><span class="st_h">'get_headers'</span><span class="sy0">,</span><span class="st_h">'get_html_translation_table'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'get_included_files'</span><span class="sy0">,</span><span class="st_h">'get_include_path'</span><span class="sy0">,</span><span class="st_h">'get_loaded_extensions'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'get_magic_quotes_gpc'</span><span class="sy0">,</span><span class="st_h">'get_magic_quotes_runtime'</span><span class="sy0">,</span><span class="st_h">'get_meta_tags'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'get_object_vars'</span><span class="sy0">,</span><span class="st_h">'get_parent_class'</span><span class="sy0">,</span><span class="st_h">'get_required_files'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'get_resource_type'</span><span class="sy0">,</span><span class="st_h">'glob'</span><span class="sy0">,</span><span class="st_h">'gmdate'</span><span class="sy0">,</span><span class="st_h">'gmmktime'</span><span class="sy0">,</span><span class="st_h">'gmp_abs'</span><span class="sy0">,</span><span class="st_h">'gmp_add'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'gmp_and'</span><span class="sy0">,</span><span class="st_h">'gmp_clrbit'</span><span class="sy0">,</span><span class="st_h">'gmp_cmp'</span><span class="sy0">,</span><span class="st_h">'gmp_com'</span><span class="sy0">,</span><span class="st_h">'gmp_div'</span><span class="sy0">,</span><span class="st_h">'gmp_div_q'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'gmp_div_qr'</span><span class="sy0">,</span><span class="st_h">'gmp_div_r'</span><span class="sy0">,</span><span class="st_h">'gmp_divexact'</span><span class="sy0">,</span><span class="st_h">'gmp_fact'</span><span class="sy0">,</span><span class="st_h">'gmp_gcd'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'gmp_gcdext'</span><span class="sy0">,</span><span class="st_h">'gmp_hamdist'</span><span class="sy0">,</span><span class="st_h">'gmp_init'</span><span class="sy0">,</span><span class="st_h">'gmp_intval'</span><span class="sy0">,</span><span class="st_h">'gmp_invert'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'gmp_jacobi'</span><span class="sy0">,</span><span class="st_h">'gmp_legendre'</span><span class="sy0">,</span><span class="st_h">'gmp_mod'</span><span class="sy0">,</span><span class="st_h">'gmp_mul'</span><span class="sy0">,</span><span class="st_h">'gmp_neg'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'gmp_nextprime'</span><span class="sy0">,</span><span class="st_h">'gmp_or'</span><span class="sy0">,</span><span class="st_h">'gmp_perfect_square'</span><span class="sy0">,</span><span class="st_h">'gmp_popcount'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'gmp_pow'</span><span class="sy0">,</span><span class="st_h">'gmp_powm'</span><span class="sy0">,</span><span class="st_h">'gmp_prob_prime'</span><span class="sy0">,</span><span class="st_h">'gmp_random'</span><span class="sy0">,</span><span class="st_h">'gmp_scan0'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'gmp_scan1'</span><span class="sy0">,</span><span class="st_h">'gmp_setbit'</span><span class="sy0">,</span><span class="st_h">'gmp_sign'</span><span class="sy0">,</span><span class="st_h">'gmp_sqrt'</span><span class="sy0">,</span><span class="st_h">'gmp_sqrtrem'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'gmp_strval'</span><span class="sy0">,</span><span class="st_h">'gmp_sub'</span><span class="sy0">,</span><span class="st_h">'gmp_xor'</span><span class="sy0">,</span><span class="st_h">'gmstrftime'</span><span class="sy0">,</span><span class="st_h">'gopher_parsedir'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'gregoriantojd'</span><span class="sy0">,</span><span class="st_h">'gzclose'</span><span class="sy0">,</span><span class="st_h">'gzcompress'</span><span class="sy0">,</span><span class="st_h">'gzdeflate'</span><span class="sy0">,</span><span class="st_h">'gzencode'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'gzeof'</span><span class="sy0">,</span><span class="st_h">'gzfile'</span><span class="sy0">,</span><span class="st_h">'gzgetc'</span><span class="sy0">,</span><span class="st_h">'gzgets'</span><span class="sy0">,</span><span class="st_h">'gzgetss'</span><span class="sy0">,</span><span class="st_h">'gzinflate'</span><span class="sy0">,</span><span class="st_h">'gzopen'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'gzpassthru'</span><span class="sy0">,</span><span class="st_h">'gzputs'</span><span class="sy0">,</span><span class="st_h">'gzread'</span><span class="sy0">,</span><span class="st_h">'gzrewind'</span><span class="sy0">,</span><span class="st_h">'gzseek'</span><span class="sy0">,</span><span class="st_h">'gztell'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'gzuncompress'</span><span class="sy0">,</span><span class="st_h">'gzwrite'</span><span class="sy0">,</span><span class="st_h">'hash'</span><span class="sy0">,</span><span class="st_h">'hash_algos'</span><span class="sy0">,</span><span class="st_h">'hash_file'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'hash_final'</span><span class="sy0">,</span><span class="st_h">'hash_hmac'</span><span class="sy0">,</span><span class="st_h">'hash_hmac_file'</span><span class="sy0">,</span><span class="st_h">'hash_init'</span><span class="sy0">,</span><span class="st_h">'hash_update'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'hash_update_file'</span><span class="sy0">,</span><span class="st_h">'hash_update_stream'</span><span class="sy0">,</span><span class="st_h">'header'</span><span class="sy0">,</span><span class="st_h">'headers_list'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'headers_sent'</span><span class="sy0">,</span><span class="st_h">'hebrev'</span><span class="sy0">,</span><span class="st_h">'hebrevc'</span><span class="sy0">,</span><span class="st_h">'hexdec'</span><span class="sy0">,</span><span class="st_h">'highlight_file'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'highlight_string'</span><span class="sy0">,</span><span class="st_h">'html_doc'</span><span class="sy0">,</span><span class="st_h">'html_doc_file'</span><span class="sy0">,</span><span class="st_h">'html_entity_decode'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'htmlentities'</span><span class="sy0">,</span><span class="st_h">'htmlspecialchars'</span><span class="sy0">,</span><span class="st_h">'htmlspecialchars_decode'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_build_cookie'</span><span class="sy0">,</span><span class="st_h">'http_build_query'</span><span class="sy0">,</span><span class="st_h">'http_build_str'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_build_url'</span><span class="sy0">,</span><span class="st_h">'http_cache_etag'</span><span class="sy0">,</span><span class="st_h">'http_cache_last_modified'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_chunked_decode'</span><span class="sy0">,</span><span class="st_h">'http_date'</span><span class="sy0">,</span><span class="st_h">'http_deflate'</span><span class="sy0">,</span><span class="st_h">'http_get'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_get_request_body'</span><span class="sy0">,</span><span class="st_h">'http_get_request_body_stream'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_get_request_headers'</span><span class="sy0">,</span><span class="st_h">'http_head'</span><span class="sy0">,</span><span class="st_h">'http_inflate'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_match_etag'</span><span class="sy0">,</span><span class="st_h">'http_match_modified'</span><span class="sy0">,</span><span class="st_h">'http_match_request_header'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_negotiate_charset'</span><span class="sy0">,</span><span class="st_h">'http_negotiate_content_type'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_negotiate_language'</span><span class="sy0">,</span><span class="st_h">'http_parse_cookie'</span><span class="sy0">,</span><span class="st_h">'http_parse_headers'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_parse_message'</span><span class="sy0">,</span><span class="st_h">'http_parse_params'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_persistent_handles_clean'</span><span class="sy0">,</span><span class="st_h">'http_persistent_handles_count'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_persistent_handles_ident'</span><span class="sy0">,</span><span class="st_h">'http_post_data'</span><span class="sy0">,</span><span class="st_h">'http_post_fields'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_put_data'</span><span class="sy0">,</span><span class="st_h">'http_put_file'</span><span class="sy0">,</span><span class="st_h">'http_put_stream'</span><span class="sy0">,</span><span class="st_h">'http_redirect'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_request'</span><span class="sy0">,</span><span class="st_h">'http_request_body_encode'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_request_method_exists'</span><span class="sy0">,</span><span class="st_h">'http_request_method_name'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_request_method_register'</span><span class="sy0">,</span><span class="st_h">'http_request_method_unregister'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_send_content_disposition'</span><span class="sy0">,</span><span class="st_h">'http_send_content_type'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_send_data'</span><span class="sy0">,</span><span class="st_h">'http_send_file'</span><span class="sy0">,</span><span class="st_h">'http_send_last_modified'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_send_status'</span><span class="sy0">,</span><span class="st_h">'http_send_stream'</span><span class="sy0">,</span><span class="st_h">'http_support'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'http_throttle'</span><span class="sy0">,</span><span class="st_h">'hypot'</span><span class="sy0">,</span><span class="st_h">'i18n_convert'</span><span class="sy0">,</span><span class="st_h">'i18n_discover_encoding'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'i18n_http_input'</span><span class="sy0">,</span><span class="st_h">'i18n_http_output'</span><span class="sy0">,</span><span class="st_h">'i18n_internal_encoding'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'i18n_ja_jp_hantozen'</span><span class="sy0">,</span><span class="st_h">'i18n_mime_header_decode'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'i18n_mime_header_encode'</span><span class="sy0">,</span><span class="st_h">'ibase_add_user'</span><span class="sy0">,</span><span class="st_h">'ibase_affected_rows'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_backup'</span><span class="sy0">,</span><span class="st_h">'ibase_blob_add'</span><span class="sy0">,</span><span class="st_h">'ibase_blob_cancel'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_blob_close'</span><span class="sy0">,</span><span class="st_h">'ibase_blob_create'</span><span class="sy0">,</span><span class="st_h">'ibase_blob_echo'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_blob_get'</span><span class="sy0">,</span><span class="st_h">'ibase_blob_import'</span><span class="sy0">,</span><span class="st_h">'ibase_blob_info'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_blob_open'</span><span class="sy0">,</span><span class="st_h">'ibase_close'</span><span class="sy0">,</span><span class="st_h">'ibase_commit'</span><span class="sy0">,</span><span class="st_h">'ibase_commit_ret'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_connect'</span><span class="sy0">,</span><span class="st_h">'ibase_db_info'</span><span class="sy0">,</span><span class="st_h">'ibase_delete_user'</span><span class="sy0">,</span><span class="st_h">'ibase_drop_db'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_errcode'</span><span class="sy0">,</span><span class="st_h">'ibase_errmsg'</span><span class="sy0">,</span><span class="st_h">'ibase_execute'</span><span class="sy0">,</span><span class="st_h">'ibase_fetch_assoc'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_fetch_object'</span><span class="sy0">,</span><span class="st_h">'ibase_fetch_row'</span><span class="sy0">,</span><span class="st_h">'ibase_field_info'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_free_event_handler'</span><span class="sy0">,</span><span class="st_h">'ibase_free_query'</span><span class="sy0">,</span><span class="st_h">'ibase_free_result'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_gen_id'</span><span class="sy0">,</span><span class="st_h">'ibase_maintain_db'</span><span class="sy0">,</span><span class="st_h">'ibase_modify_user'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_name_result'</span><span class="sy0">,</span><span class="st_h">'ibase_num_fields'</span><span class="sy0">,</span><span class="st_h">'ibase_num_params'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_param_info'</span><span class="sy0">,</span><span class="st_h">'ibase_pconnect'</span><span class="sy0">,</span><span class="st_h">'ibase_prepare'</span><span class="sy0">,</span><span class="st_h">'ibase_query'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_restore'</span><span class="sy0">,</span><span class="st_h">'ibase_rollback'</span><span class="sy0">,</span><span class="st_h">'ibase_rollback_ret'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_server_info'</span><span class="sy0">,</span><span class="st_h">'ibase_service_attach'</span><span class="sy0">,</span><span class="st_h">'ibase_service_detach'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ibase_set_event_handler'</span><span class="sy0">,</span><span class="st_h">'ibase_trans'</span><span class="sy0">,</span><span class="st_h">'ibase_wait_event'</span><span class="sy0">,</span><span class="st_h">'iconv'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'iconv_get_encoding'</span><span class="sy0">,</span><span class="st_h">'iconv_mime_decode'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'iconv_mime_decode_headers'</span><span class="sy0">,</span><span class="st_h">'iconv_mime_encode'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'iconv_set_encoding'</span><span class="sy0">,</span><span class="st_h">'iconv_strlen'</span><span class="sy0">,</span><span class="st_h">'iconv_strpos'</span><span class="sy0">,</span><span class="st_h">'iconv_strrpos'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'iconv_substr'</span><span class="sy0">,</span><span class="st_h">'id3_get_frame_long_name'</span><span class="sy0">,</span><span class="st_h">'id3_get_frame_short_name'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'id3_get_genre_id'</span><span class="sy0">,</span><span class="st_h">'id3_get_genre_list'</span><span class="sy0">,</span><span class="st_h">'id3_get_genre_name'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'id3_get_tag'</span><span class="sy0">,</span><span class="st_h">'id3_get_version'</span><span class="sy0">,</span><span class="st_h">'id3_remove_tag'</span><span class="sy0">,</span><span class="st_h">'id3_set_tag'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'idate'</span><span class="sy0">,</span><span class="st_h">'ignore_user_abort'</span><span class="sy0">,</span><span class="st_h">'image_type_to_extension'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'image_type_to_mime_type'</span><span class="sy0">,</span><span class="st_h">'image2wbmp'</span><span class="sy0">,</span><span class="st_h">'imagealphablending'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imageantialias'</span><span class="sy0">,</span><span class="st_h">'imagearc'</span><span class="sy0">,</span><span class="st_h">'imagechar'</span><span class="sy0">,</span><span class="st_h">'imagecharup'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagecolorallocate'</span><span class="sy0">,</span><span class="st_h">'imagecolorallocatealpha'</span><span class="sy0">,</span><span class="st_h">'imagecolorat'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagecolorclosest'</span><span class="sy0">,</span><span class="st_h">'imagecolorclosestalpha'</span><span class="sy0">,</span><span class="st_h">'imagecolordeallocate'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagecolorexact'</span><span class="sy0">,</span><span class="st_h">'imagecolorexactalpha'</span><span class="sy0">,</span><span class="st_h">'imagecolormatch'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagecolorresolve'</span><span class="sy0">,</span><span class="st_h">'imagecolorresolvealpha'</span><span class="sy0">,</span><span class="st_h">'imagecolorset'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagecolorsforindex'</span><span class="sy0">,</span><span class="st_h">'imagecolorstotal'</span><span class="sy0">,</span><span class="st_h">'imagecolortransparent'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imageconvolution'</span><span class="sy0">,</span><span class="st_h">'imagecopy'</span><span class="sy0">,</span><span class="st_h">'imagecopymerge'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagecopymergegray'</span><span class="sy0">,</span><span class="st_h">'imagecopyresampled'</span><span class="sy0">,</span><span class="st_h">'imagecopyresized'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagecreate'</span><span class="sy0">,</span><span class="st_h">'imagecreatefromgd'</span><span class="sy0">,</span><span class="st_h">'imagecreatefromgd2'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagecreatefromgd2part'</span><span class="sy0">,</span><span class="st_h">'imagecreatefromgif'</span><span class="sy0">,</span><span class="st_h">'imagecreatefromjpeg'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagecreatefrompng'</span><span class="sy0">,</span><span class="st_h">'imagecreatefromstring'</span><span class="sy0">,</span><span class="st_h">'imagecreatefromwbmp'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagecreatefromxbm'</span><span class="sy0">,</span><span class="st_h">'imagecreatetruecolor'</span><span class="sy0">,</span><span class="st_h">'imagedashedline'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagedestroy'</span><span class="sy0">,</span><span class="st_h">'imageellipse'</span><span class="sy0">,</span><span class="st_h">'imagefill'</span><span class="sy0">,</span><span class="st_h">'imagefilledarc'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagefilledellipse'</span><span class="sy0">,</span><span class="st_h">'imagefilledpolygon'</span><span class="sy0">,</span><span class="st_h">'imagefilledrectangle'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagefilltoborder'</span><span class="sy0">,</span><span class="st_h">'imagefilter'</span><span class="sy0">,</span><span class="st_h">'imagefontheight'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagefontwidth'</span><span class="sy0">,</span><span class="st_h">'imageftbbox'</span><span class="sy0">,</span><span class="st_h">'imagefttext'</span><span class="sy0">,</span><span class="st_h">'imagegammacorrect'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagegd'</span><span class="sy0">,</span><span class="st_h">'imagegd2'</span><span class="sy0">,</span><span class="st_h">'imagegif'</span><span class="sy0">,</span><span class="st_h">'imagegrabscreen'</span><span class="sy0">,</span><span class="st_h">'imagegrabwindow'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imageinterlace'</span><span class="sy0">,</span><span class="st_h">'imageistruecolor'</span><span class="sy0">,</span><span class="st_h">'imagejpeg'</span><span class="sy0">,</span><span class="st_h">'imagelayereffect'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imageline'</span><span class="sy0">,</span><span class="st_h">'imageloadfont'</span><span class="sy0">,</span><span class="st_h">'imagepalettecopy'</span><span class="sy0">,</span><span class="st_h">'imagepng'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagepolygon'</span><span class="sy0">,</span><span class="st_h">'imagepsbbox'</span><span class="sy0">,</span><span class="st_h">'imagepsencodefont'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagepsextendfont'</span><span class="sy0">,</span><span class="st_h">'imagepsfreefont'</span><span class="sy0">,</span><span class="st_h">'imagepsloadfont'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagepsslantfont'</span><span class="sy0">,</span><span class="st_h">'imagepstext'</span><span class="sy0">,</span><span class="st_h">'imagerectangle'</span><span class="sy0">,</span><span class="st_h">'imagerotate'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagesavealpha'</span><span class="sy0">,</span><span class="st_h">'imagesetbrush'</span><span class="sy0">,</span><span class="st_h">'imagesetpixel'</span><span class="sy0">,</span><span class="st_h">'imagesetstyle'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagesetthickness'</span><span class="sy0">,</span><span class="st_h">'imagesettile'</span><span class="sy0">,</span><span class="st_h">'imagestring'</span><span class="sy0">,</span><span class="st_h">'imagestringup'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagesx'</span><span class="sy0">,</span><span class="st_h">'imagesy'</span><span class="sy0">,</span><span class="st_h">'imagetruecolortopalette'</span><span class="sy0">,</span><span class="st_h">'imagettfbbox'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imagettftext'</span><span class="sy0">,</span><span class="st_h">'imagetypes'</span><span class="sy0">,</span><span class="st_h">'imagewbmp'</span><span class="sy0">,</span><span class="st_h">'imagexbm'</span><span class="sy0">,</span><span class="st_h">'imap_8bit'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_alerts'</span><span class="sy0">,</span><span class="st_h">'imap_append'</span><span class="sy0">,</span><span class="st_h">'imap_base64'</span><span class="sy0">,</span><span class="st_h">'imap_binary'</span><span class="sy0">,</span><span class="st_h">'imap_body'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_bodystruct'</span><span class="sy0">,</span><span class="st_h">'imap_check'</span><span class="sy0">,</span><span class="st_h">'imap_clearflag_full'</span><span class="sy0">,</span><span class="st_h">'imap_close'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_create'</span><span class="sy0">,</span><span class="st_h">'imap_createmailbox'</span><span class="sy0">,</span><span class="st_h">'imap_delete'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_deletemailbox'</span><span class="sy0">,</span><span class="st_h">'imap_errors'</span><span class="sy0">,</span><span class="st_h">'imap_expunge'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_fetch_overview'</span><span class="sy0">,</span><span class="st_h">'imap_fetchbody'</span><span class="sy0">,</span><span class="st_h">'imap_fetchheader'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_fetchstructure'</span><span class="sy0">,</span><span class="st_h">'imap_fetchtext'</span><span class="sy0">,</span><span class="st_h">'imap_get_quota'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_get_quotaroot'</span><span class="sy0">,</span><span class="st_h">'imap_getacl'</span><span class="sy0">,</span><span class="st_h">'imap_getmailboxes'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_getsubscribed'</span><span class="sy0">,</span><span class="st_h">'imap_header'</span><span class="sy0">,</span><span class="st_h">'imap_headerinfo'</span><span class="sy0">,</span><span class="st_h">'imap_headers'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_last_error'</span><span class="sy0">,</span><span class="st_h">'imap_list'</span><span class="sy0">,</span><span class="st_h">'imap_listmailbox'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_listsubscribed'</span><span class="sy0">,</span><span class="st_h">'imap_lsub'</span><span class="sy0">,</span><span class="st_h">'imap_mail'</span><span class="sy0">,</span><span class="st_h">'imap_mail_compose'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_mail_copy'</span><span class="sy0">,</span><span class="st_h">'imap_mail_move'</span><span class="sy0">,</span><span class="st_h">'imap_mailboxmsginfo'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_mime_header_decode'</span><span class="sy0">,</span><span class="st_h">'imap_msgno'</span><span class="sy0">,</span><span class="st_h">'imap_num_msg'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_num_recent'</span><span class="sy0">,</span><span class="st_h">'imap_open'</span><span class="sy0">,</span><span class="st_h">'imap_ping'</span><span class="sy0">,</span><span class="st_h">'imap_qprint'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_rename'</span><span class="sy0">,</span><span class="st_h">'imap_renamemailbox'</span><span class="sy0">,</span><span class="st_h">'imap_reopen'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_rfc822_parse_adrlist'</span><span class="sy0">,</span><span class="st_h">'imap_rfc822_parse_headers'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_rfc822_write_address'</span><span class="sy0">,</span><span class="st_h">'imap_savebody'</span><span class="sy0">,</span><span class="st_h">'imap_scan'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_scanmailbox'</span><span class="sy0">,</span><span class="st_h">'imap_search'</span><span class="sy0">,</span><span class="st_h">'imap_set_quota'</span><span class="sy0">,</span><span class="st_h">'imap_setacl'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_setflag_full'</span><span class="sy0">,</span><span class="st_h">'imap_sort'</span><span class="sy0">,</span><span class="st_h">'imap_status'</span><span class="sy0">,</span><span class="st_h">'imap_subscribe'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_thread'</span><span class="sy0">,</span><span class="st_h">'imap_timeout'</span><span class="sy0">,</span><span class="st_h">'imap_uid'</span><span class="sy0">,</span><span class="st_h">'imap_undelete'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_unsubscribe'</span><span class="sy0">,</span><span class="st_h">'imap_utf7_decode'</span><span class="sy0">,</span><span class="st_h">'imap_utf7_encode'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'imap_utf8'</span><span class="sy0">,</span><span class="st_h">'implode'</span><span class="sy0">,</span><span class="st_h">'import_request_variables'</span><span class="sy0">,</span><span class="st_h">'in_array'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ini_alter'</span><span class="sy0">,</span><span class="st_h">'ini_get'</span><span class="sy0">,</span><span class="st_h">'ini_get_all'</span><span class="sy0">,</span><span class="st_h">'ini_restore'</span><span class="sy0">,</span><span class="st_h">'ini_set'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'intval'</span><span class="sy0">,</span><span class="st_h">'ip2long'</span><span class="sy0">,</span><span class="st_h">'iptcembed'</span><span class="sy0">,</span><span class="st_h">'iptcparse'</span><span class="sy0">,</span><span class="st_h">'isset'</span><span class="sy0">,</span><span class="st_h">'is_a'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'is_array'</span><span class="sy0">,</span><span class="st_h">'is_bool'</span><span class="sy0">,</span><span class="st_h">'is_callable'</span><span class="sy0">,</span><span class="st_h">'is_dir'</span><span class="sy0">,</span><span class="st_h">'is_double'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'is_executable'</span><span class="sy0">,</span><span class="st_h">'is_file'</span><span class="sy0">,</span><span class="st_h">'is_finite'</span><span class="sy0">,</span><span class="st_h">'is_float'</span><span class="sy0">,</span><span class="st_h">'is_infinite'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'is_int'</span><span class="sy0">,</span><span class="st_h">'is_integer'</span><span class="sy0">,</span><span class="st_h">'is_link'</span><span class="sy0">,</span><span class="st_h">'is_long'</span><span class="sy0">,</span><span class="st_h">'is_nan'</span><span class="sy0">,</span><span class="st_h">'is_null'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'is_numeric'</span><span class="sy0">,</span><span class="st_h">'is_object'</span><span class="sy0">,</span><span class="st_h">'is_readable'</span><span class="sy0">,</span><span class="st_h">'is_real'</span><span class="sy0">,</span><span class="st_h">'is_resource'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'is_scalar'</span><span class="sy0">,</span><span class="st_h">'is_soap_fault'</span><span class="sy0">,</span><span class="st_h">'is_string'</span><span class="sy0">,</span><span class="st_h">'is_subclass_of'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'is_uploaded_file'</span><span class="sy0">,</span><span class="st_h">'is_writable'</span><span class="sy0">,</span><span class="st_h">'is_writeable'</span><span class="sy0">,</span><span class="st_h">'iterator_apply'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'iterator_count'</span><span class="sy0">,</span><span class="st_h">'iterator_to_array'</span><span class="sy0">,</span><span class="st_h">'java_last_exception_clear'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'java_last_exception_get'</span><span class="sy0">,</span><span class="st_h">'jddayofweek'</span><span class="sy0">,</span><span class="st_h">'jdmonthname'</span><span class="sy0">,</span><span class="st_h">'jdtofrench'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'jdtogregorian'</span><span class="sy0">,</span><span class="st_h">'jdtojewish'</span><span class="sy0">,</span><span class="st_h">'jdtojulian'</span><span class="sy0">,</span><span class="st_h">'jdtounix'</span><span class="sy0">,</span><span class="st_h">'jewishtojd'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'join'</span><span class="sy0">,</span><span class="st_h">'jpeg2wbmp'</span><span class="sy0">,</span><span class="st_h">'json_decode'</span><span class="sy0">,</span><span class="st_h">'json_encode'</span><span class="sy0">,</span><span class="st_h">'juliantojd'</span><span class="sy0">,</span><span class="st_h">'key'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'key_exists'</span><span class="sy0">,</span><span class="st_h">'krsort'</span><span class="sy0">,</span><span class="st_h">'ksort'</span><span class="sy0">,</span><span class="st_h">'lcg_value'</span><span class="sy0">,</span><span class="st_h">'ldap_add'</span><span class="sy0">,</span><span class="st_h">'ldap_bind'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ldap_close'</span><span class="sy0">,</span><span class="st_h">'ldap_compare'</span><span class="sy0">,</span><span class="st_h">'ldap_connect'</span><span class="sy0">,</span><span class="st_h">'ldap_count_entries'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ldap_delete'</span><span class="sy0">,</span><span class="st_h">'ldap_dn2ufn'</span><span class="sy0">,</span><span class="st_h">'ldap_err2str'</span><span class="sy0">,</span><span class="st_h">'ldap_errno'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ldap_error'</span><span class="sy0">,</span><span class="st_h">'ldap_explode_dn'</span><span class="sy0">,</span><span class="st_h">'ldap_first_attribute'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ldap_first_entry'</span><span class="sy0">,</span><span class="st_h">'ldap_first_reference'</span><span class="sy0">,</span><span class="st_h">'ldap_free_result'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ldap_get_attributes'</span><span class="sy0">,</span><span class="st_h">'ldap_get_dn'</span><span class="sy0">,</span><span class="st_h">'ldap_get_entries'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ldap_get_option'</span><span class="sy0">,</span><span class="st_h">'ldap_get_values'</span><span class="sy0">,</span><span class="st_h">'ldap_get_values_len'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ldap_list'</span><span class="sy0">,</span><span class="st_h">'ldap_mod_add'</span><span class="sy0">,</span><span class="st_h">'ldap_mod_del'</span><span class="sy0">,</span><span class="st_h">'ldap_mod_replace'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ldap_modify'</span><span class="sy0">,</span><span class="st_h">'ldap_next_attribute'</span><span class="sy0">,</span><span class="st_h">'ldap_next_entry'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ldap_next_reference'</span><span class="sy0">,</span><span class="st_h">'ldap_parse_reference'</span><span class="sy0">,</span><span class="st_h">'ldap_parse_result'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ldap_read'</span><span class="sy0">,</span><span class="st_h">'ldap_rename'</span><span class="sy0">,</span><span class="st_h">'ldap_search'</span><span class="sy0">,</span><span class="st_h">'ldap_set_option'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ldap_sort'</span><span class="sy0">,</span><span class="st_h">'ldap_start_tls'</span><span class="sy0">,</span><span class="st_h">'ldap_unbind'</span><span class="sy0">,</span><span class="st_h">'levenshtein'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'libxml_clear_errors'</span><span class="sy0">,</span><span class="st_h">'libxml_get_errors'</span><span class="sy0">,</span><span class="st_h">'libxml_get_last_error'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'libxml_set_streams_context'</span><span class="sy0">,</span><span class="st_h">'libxml_use_internal_errors'</span><span class="sy0">,</span><span class="st_h">'link'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'linkinfo'</span><span class="sy0">,</span><span class="st_h">'list'</span><span class="sy0">,</span><span class="st_h">'localeconv'</span><span class="sy0">,</span><span class="st_h">'localtime'</span><span class="sy0">,</span><span class="st_h">'log'</span><span class="sy0">,</span><span class="st_h">'log1p'</span><span class="sy0">,</span><span class="st_h">'log10'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'long2ip'</span><span class="sy0">,</span><span class="st_h">'lstat'</span><span class="sy0">,</span><span class="st_h">'ltrim'</span><span class="sy0">,</span><span class="st_h">'lzf_compress'</span><span class="sy0">,</span><span class="st_h">'lzf_decompress'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'lzf_optimized_for'</span><span class="sy0">,</span><span class="st_h">'magic_quotes_runtime'</span><span class="sy0">,</span><span class="st_h">'mail'</span><span class="sy0">,</span><span class="st_h">'max'</span><span class="sy0">,</span><span class="st_h">'mbereg'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mberegi'</span><span class="sy0">,</span><span class="st_h">'mberegi_replace'</span><span class="sy0">,</span><span class="st_h">'mbereg_match'</span><span class="sy0">,</span><span class="st_h">'mbereg_replace'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mbereg_search'</span><span class="sy0">,</span><span class="st_h">'mbereg_search_getpos'</span><span class="sy0">,</span><span class="st_h">'mbereg_search_getregs'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mbereg_search_init'</span><span class="sy0">,</span><span class="st_h">'mbereg_search_pos'</span><span class="sy0">,</span><span class="st_h">'mbereg_search_regs'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mbereg_search_setpos'</span><span class="sy0">,</span><span class="st_h">'mbregex_encoding'</span><span class="sy0">,</span><span class="st_h">'mbsplit'</span><span class="sy0">,</span><span class="st_h">'mbstrcut'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mbstrlen'</span><span class="sy0">,</span><span class="st_h">'mbstrpos'</span><span class="sy0">,</span><span class="st_h">'mbstrrpos'</span><span class="sy0">,</span><span class="st_h">'mbsubstr'</span><span class="sy0">,</span><span class="st_h">'mb_check_encoding'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_convert_case'</span><span class="sy0">,</span><span class="st_h">'mb_convert_encoding'</span><span class="sy0">,</span><span class="st_h">'mb_convert_kana'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_convert_variables'</span><span class="sy0">,</span><span class="st_h">'mb_decode_mimeheader'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_decode_numericentity'</span><span class="sy0">,</span><span class="st_h">'mb_detect_encoding'</span><span class="sy0">,</span><span class="st_h">'mb_detect_order'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_encode_mimeheader'</span><span class="sy0">,</span><span class="st_h">'mb_encode_numericentity'</span><span class="sy0">,</span><span class="st_h">'mb_ereg'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_eregi'</span><span class="sy0">,</span><span class="st_h">'mb_eregi_replace'</span><span class="sy0">,</span><span class="st_h">'mb_ereg_match'</span><span class="sy0">,</span><span class="st_h">'mb_ereg_replace'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_ereg_search'</span><span class="sy0">,</span><span class="st_h">'mb_ereg_search_getpos'</span><span class="sy0">,</span><span class="st_h">'mb_ereg_search_getregs'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_ereg_search_init'</span><span class="sy0">,</span><span class="st_h">'mb_ereg_search_pos'</span><span class="sy0">,</span><span class="st_h">'mb_ereg_search_regs'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_ereg_search_setpos'</span><span class="sy0">,</span><span class="st_h">'mb_get_info'</span><span class="sy0">,</span><span class="st_h">'mb_http_input'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_http_output'</span><span class="sy0">,</span><span class="st_h">'mb_internal_encoding'</span><span class="sy0">,</span><span class="st_h">'mb_language'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_list_encodings'</span><span class="sy0">,</span><span class="st_h">'mb_output_handler'</span><span class="sy0">,</span><span class="st_h">'mb_parse_str'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_preferred_mime_name'</span><span class="sy0">,</span><span class="st_h">'mb_regex_encoding'</span><span class="sy0">,</span><span class="st_h">'mb_regex_set_options'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_send_mail'</span><span class="sy0">,</span><span class="st_h">'mb_split'</span><span class="sy0">,</span><span class="st_h">'mb_strcut'</span><span class="sy0">,</span><span class="st_h">'mb_strimwidth'</span><span class="sy0">,</span><span class="st_h">'mb_stripos'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_stristr'</span><span class="sy0">,</span><span class="st_h">'mb_strlen'</span><span class="sy0">,</span><span class="st_h">'mb_strpos'</span><span class="sy0">,</span><span class="st_h">'mb_strrchr'</span><span class="sy0">,</span><span class="st_h">'mb_strrichr'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_strripos'</span><span class="sy0">,</span><span class="st_h">'mb_strrpos'</span><span class="sy0">,</span><span class="st_h">'mb_strstr'</span><span class="sy0">,</span><span class="st_h">'mb_strtolower'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_strtoupper'</span><span class="sy0">,</span><span class="st_h">'mb_strwidth'</span><span class="sy0">,</span><span class="st_h">'mb_substitute_character'</span><span class="sy0">,</span><span class="st_h">'mb_substr'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mb_substr_count'</span><span class="sy0">,</span><span class="st_h">'mcrypt_cbc'</span><span class="sy0">,</span><span class="st_h">'mcrypt_cfb'</span><span class="sy0">,</span><span class="st_h">'mcrypt_create_iv'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_decrypt'</span><span class="sy0">,</span><span class="st_h">'mcrypt_ecb'</span><span class="sy0">,</span><span class="st_h">'mcrypt_enc_get_algorithms_name'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_enc_get_block_size'</span><span class="sy0">,</span><span class="st_h">'mcrypt_enc_get_iv_size'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_enc_get_key_size'</span><span class="sy0">,</span><span class="st_h">'mcrypt_enc_get_modes_name'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_enc_get_supported_key_sizes'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_enc_is_block_algorithm'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_enc_is_block_algorithm_mode'</span><span class="sy0">,</span><span class="st_h">'mcrypt_enc_is_block_mode'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_enc_self_test'</span><span class="sy0">,</span><span class="st_h">'mcrypt_encrypt'</span><span class="sy0">,</span><span class="st_h">'mcrypt_generic'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_generic_deinit'</span><span class="sy0">,</span><span class="st_h">'mcrypt_generic_end'</span><span class="sy0">,</span><span class="st_h">'mcrypt_generic_init'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_get_block_size'</span><span class="sy0">,</span><span class="st_h">'mcrypt_get_cipher_name'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_get_iv_size'</span><span class="sy0">,</span><span class="st_h">'mcrypt_get_key_size'</span><span class="sy0">,</span><span class="st_h">'mcrypt_list_algorithms'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_list_modes'</span><span class="sy0">,</span><span class="st_h">'mcrypt_module_close'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_module_get_algo_block_size'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_module_get_algo_key_size'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_module_get_supported_key_sizes'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_module_is_block_algorithm'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_module_is_block_algorithm_mode'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_module_is_block_mode'</span><span class="sy0">,</span><span class="st_h">'mcrypt_module_open'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mcrypt_module_self_test'</span><span class="sy0">,</span><span class="st_h">'mcrypt_ofb'</span><span class="sy0">,</span><span class="st_h">'md5'</span><span class="sy0">,</span><span class="st_h">'md5_file'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mdecrypt_generic'</span><span class="sy0">,</span><span class="st_h">'memcache_add'</span><span class="sy0">,</span><span class="st_h">'memcache_add_server'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'memcache_close'</span><span class="sy0">,</span><span class="st_h">'memcache_connect'</span><span class="sy0">,</span><span class="st_h">'memcache_debug'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'memcache_decrement'</span><span class="sy0">,</span><span class="st_h">'memcache_delete'</span><span class="sy0">,</span><span class="st_h">'memcache_flush'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'memcache_get'</span><span class="sy0">,</span><span class="st_h">'memcache_get_extended_stats'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'memcache_get_server_status'</span><span class="sy0">,</span><span class="st_h">'memcache_get_stats'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'memcache_get_version'</span><span class="sy0">,</span><span class="st_h">'memcache_increment'</span><span class="sy0">,</span><span class="st_h">'memcache_pconnect'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'memcache_replace'</span><span class="sy0">,</span><span class="st_h">'memcache_set'</span><span class="sy0">,</span><span class="st_h">'memcache_set_compress_threshold'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'memcache_set_server_params'</span><span class="sy0">,</span><span class="st_h">'memory_get_peak_usage'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'memory_get_usage'</span><span class="sy0">,</span><span class="st_h">'metaphone'</span><span class="sy0">,</span><span class="st_h">'mhash'</span><span class="sy0">,</span><span class="st_h">'mhash_count'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mhash_get_block_size'</span><span class="sy0">,</span><span class="st_h">'mhash_get_hash_name'</span><span class="sy0">,</span><span class="st_h">'mhash_keygen_s2k'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'method_exists'</span><span class="sy0">,</span><span class="st_h">'microtime'</span><span class="sy0">,</span><span class="st_h">'mime_content_type'</span><span class="sy0">,</span><span class="st_h">'min'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ming_keypress'</span><span class="sy0">,</span><span class="st_h">'ming_setcubicthreshold'</span><span class="sy0">,</span><span class="st_h">'ming_setscale'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ming_useconstants'</span><span class="sy0">,</span><span class="st_h">'ming_useswfversion'</span><span class="sy0">,</span><span class="st_h">'mkdir'</span><span class="sy0">,</span><span class="st_h">'mktime'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'money_format'</span><span class="sy0">,</span><span class="st_h">'move_uploaded_file'</span><span class="sy0">,</span><span class="st_h">'msql'</span><span class="sy0">,</span><span class="st_h">'msql_affected_rows'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'msql_close'</span><span class="sy0">,</span><span class="st_h">'msql_connect'</span><span class="sy0">,</span><span class="st_h">'msql_create_db'</span><span class="sy0">,</span><span class="st_h">'msql_createdb'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'msql_data_seek'</span><span class="sy0">,</span><span class="st_h">'msql_db_query'</span><span class="sy0">,</span><span class="st_h">'msql_dbname'</span><span class="sy0">,</span><span class="st_h">'msql_drop_db'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'msql_dropdb'</span><span class="sy0">,</span><span class="st_h">'msql_error'</span><span class="sy0">,</span><span class="st_h">'msql_fetch_array'</span><span class="sy0">,</span><span class="st_h">'msql_fetch_field'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'msql_fetch_object'</span><span class="sy0">,</span><span class="st_h">'msql_fetch_row'</span><span class="sy0">,</span><span class="st_h">'msql_field_flags'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'msql_field_len'</span><span class="sy0">,</span><span class="st_h">'msql_field_name'</span><span class="sy0">,</span><span class="st_h">'msql_field_seek'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'msql_field_table'</span><span class="sy0">,</span><span class="st_h">'msql_field_type'</span><span class="sy0">,</span><span class="st_h">'msql_fieldflags'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'msql_fieldlen'</span><span class="sy0">,</span><span class="st_h">'msql_fieldname'</span><span class="sy0">,</span><span class="st_h">'msql_fieldtable'</span><span class="sy0">,</span><span class="st_h">'msql_fieldtype'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'msql_free_result'</span><span class="sy0">,</span><span class="st_h">'msql_freeresult'</span><span class="sy0">,</span><span class="st_h">'msql_list_dbs'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'msql_list_fields'</span><span class="sy0">,</span><span class="st_h">'msql_list_tables'</span><span class="sy0">,</span><span class="st_h">'msql_listdbs'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'msql_listfields'</span><span class="sy0">,</span><span class="st_h">'msql_listtables'</span><span class="sy0">,</span><span class="st_h">'msql_num_fields'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'msql_num_rows'</span><span class="sy0">,</span><span class="st_h">'msql_numfields'</span><span class="sy0">,</span><span class="st_h">'msql_numrows'</span><span class="sy0">,</span><span class="st_h">'msql_pconnect'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'msql_query'</span><span class="sy0">,</span><span class="st_h">'msql_regcase'</span><span class="sy0">,</span><span class="st_h">'msql_result'</span><span class="sy0">,</span><span class="st_h">'msql_select_db'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'msql_selectdb'</span><span class="sy0">,</span><span class="st_h">'msql_tablename'</span><span class="sy0">,</span><span class="st_h">'mssql_bind'</span><span class="sy0">,</span><span class="st_h">'mssql_close'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mssql_connect'</span><span class="sy0">,</span><span class="st_h">'mssql_data_seek'</span><span class="sy0">,</span><span class="st_h">'mssql_execute'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mssql_fetch_array'</span><span class="sy0">,</span><span class="st_h">'mssql_fetch_assoc'</span><span class="sy0">,</span><span class="st_h">'mssql_fetch_batch'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mssql_fetch_field'</span><span class="sy0">,</span><span class="st_h">'mssql_fetch_object'</span><span class="sy0">,</span><span class="st_h">'mssql_fetch_row'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mssql_field_length'</span><span class="sy0">,</span><span class="st_h">'mssql_field_name'</span><span class="sy0">,</span><span class="st_h">'mssql_field_seek'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mssql_field_type'</span><span class="sy0">,</span><span class="st_h">'mssql_free_result'</span><span class="sy0">,</span><span class="st_h">'mssql_free_statement'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mssql_get_last_message'</span><span class="sy0">,</span><span class="st_h">'mssql_guid_string'</span><span class="sy0">,</span><span class="st_h">'mssql_init'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mssql_min_error_severity'</span><span class="sy0">,</span><span class="st_h">'mssql_min_message_severity'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mssql_next_result'</span><span class="sy0">,</span><span class="st_h">'mssql_num_fields'</span><span class="sy0">,</span><span class="st_h">'mssql_num_rows'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mssql_pconnect'</span><span class="sy0">,</span><span class="st_h">'mssql_query'</span><span class="sy0">,</span><span class="st_h">'mssql_result'</span><span class="sy0">,</span><span class="st_h">'mssql_rows_affected'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mssql_select_db'</span><span class="sy0">,</span><span class="st_h">'mt_getrandmax'</span><span class="sy0">,</span><span class="st_h">'mt_rand'</span><span class="sy0">,</span><span class="st_h">'mt_srand'</span><span class="sy0">,</span><span class="st_h">'mysql'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_affected_rows'</span><span class="sy0">,</span><span class="st_h">'mysql_client_encoding'</span><span class="sy0">,</span><span class="st_h">'mysql_close'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_connect'</span><span class="sy0">,</span><span class="st_h">'mysql_createdb'</span><span class="sy0">,</span><span class="st_h">'mysql_create_db'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_data_seek'</span><span class="sy0">,</span><span class="st_h">'mysql_dbname'</span><span class="sy0">,</span><span class="st_h">'mysql_db_name'</span><span class="sy0">,</span><span class="st_h">'mysql_db_query'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_dropdb'</span><span class="sy0">,</span><span class="st_h">'mysql_drop_db'</span><span class="sy0">,</span><span class="st_h">'mysql_errno'</span><span class="sy0">,</span><span class="st_h">'mysql_error'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_escape_string'</span><span class="sy0">,</span><span class="st_h">'mysql_fetch_array'</span><span class="sy0">,</span><span class="st_h">'mysql_fetch_assoc'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_fetch_field'</span><span class="sy0">,</span><span class="st_h">'mysql_fetch_lengths'</span><span class="sy0">,</span><span class="st_h">'mysql_fetch_object'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_fetch_row'</span><span class="sy0">,</span><span class="st_h">'mysql_fieldflags'</span><span class="sy0">,</span><span class="st_h">'mysql_fieldlen'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_fieldname'</span><span class="sy0">,</span><span class="st_h">'mysql_fieldtable'</span><span class="sy0">,</span><span class="st_h">'mysql_fieldtype'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_field_flags'</span><span class="sy0">,</span><span class="st_h">'mysql_field_len'</span><span class="sy0">,</span><span class="st_h">'mysql_field_name'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_field_seek'</span><span class="sy0">,</span><span class="st_h">'mysql_field_table'</span><span class="sy0">,</span><span class="st_h">'mysql_field_type'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_freeresult'</span><span class="sy0">,</span><span class="st_h">'mysql_free_result'</span><span class="sy0">,</span><span class="st_h">'mysql_get_client_info'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_get_host_info'</span><span class="sy0">,</span><span class="st_h">'mysql_get_proto_info'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_get_server_info'</span><span class="sy0">,</span><span class="st_h">'mysql_info'</span><span class="sy0">,</span><span class="st_h">'mysql_insert_id'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_listdbs'</span><span class="sy0">,</span><span class="st_h">'mysql_listfields'</span><span class="sy0">,</span><span class="st_h">'mysql_listtables'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_list_dbs'</span><span class="sy0">,</span><span class="st_h">'mysql_list_fields'</span><span class="sy0">,</span><span class="st_h">'mysql_list_processes'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_list_tables'</span><span class="sy0">,</span><span class="st_h">'mysql_numfields'</span><span class="sy0">,</span><span class="st_h">'mysql_numrows'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_num_fields'</span><span class="sy0">,</span><span class="st_h">'mysql_num_rows'</span><span class="sy0">,</span><span class="st_h">'mysql_pconnect'</span><span class="sy0">,</span><span class="st_h">'mysql_ping'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_query'</span><span class="sy0">,</span><span class="st_h">'mysql_real_escape_string'</span><span class="sy0">,</span><span class="st_h">'mysql_result'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_selectdb'</span><span class="sy0">,</span><span class="st_h">'mysql_select_db'</span><span class="sy0">,</span><span class="st_h">'mysql_set_charset'</span><span class="sy0">,</span><span class="st_h">'mysql_stat'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_tablename'</span><span class="sy0">,</span><span class="st_h">'mysql_table_name'</span><span class="sy0">,</span><span class="st_h">'mysql_thread_id'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysql_unbuffered_query'</span><span class="sy0">,</span><span class="st_h">'mysqli_affected_rows'</span><span class="sy0">,</span><span class="st_h">'mysqli_autocommit'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_bind_param'</span><span class="sy0">,</span><span class="st_h">'mysqli_bind_result'</span><span class="sy0">,</span><span class="st_h">'mysqli_change_user'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_character_set_name'</span><span class="sy0">,</span><span class="st_h">'mysqli_client_encoding'</span><span class="sy0">,</span><span class="st_h">'mysqli_close'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_commit'</span><span class="sy0">,</span><span class="st_h">'mysqli_connect'</span><span class="sy0">,</span><span class="st_h">'mysqli_connect_errno'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_connect_error'</span><span class="sy0">,</span><span class="st_h">'mysqli_data_seek'</span><span class="sy0">,</span><span class="st_h">'mysqli_debug'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_disable_reads_from_master'</span><span class="sy0">,</span><span class="st_h">'mysqli_disable_rpl_parse'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_dump_debug_info'</span><span class="sy0">,</span><span class="st_h">'mysqli_embedded_server_end'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_embedded_server_start'</span><span class="sy0">,</span><span class="st_h">'mysqli_enable_reads_from_master'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_enable_rpl_parse'</span><span class="sy0">,</span><span class="st_h">'mysqli_errno'</span><span class="sy0">,</span><span class="st_h">'mysqli_error'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_escape_string'</span><span class="sy0">,</span><span class="st_h">'mysqli_execute'</span><span class="sy0">,</span><span class="st_h">'mysqli_fetch'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_fetch_array'</span><span class="sy0">,</span><span class="st_h">'mysqli_fetch_assoc'</span><span class="sy0">,</span><span class="st_h">'mysqli_fetch_field'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_fetch_field_direct'</span><span class="sy0">,</span><span class="st_h">'mysqli_fetch_fields'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_fetch_lengths'</span><span class="sy0">,</span><span class="st_h">'mysqli_fetch_object'</span><span class="sy0">,</span><span class="st_h">'mysqli_fetch_row'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_field_count'</span><span class="sy0">,</span><span class="st_h">'mysqli_field_seek'</span><span class="sy0">,</span><span class="st_h">'mysqli_field_tell'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_free_result'</span><span class="sy0">,</span><span class="st_h">'mysqli_get_charset'</span><span class="sy0">,</span><span class="st_h">'mysqli_get_client_info'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_get_client_version'</span><span class="sy0">,</span><span class="st_h">'mysqli_get_host_info'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_get_metadata'</span><span class="sy0">,</span><span class="st_h">'mysqli_get_proto_info'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_get_server_info'</span><span class="sy0">,</span><span class="st_h">'mysqli_get_server_version'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_get_warnings'</span><span class="sy0">,</span><span class="st_h">'mysqli_info'</span><span class="sy0">,</span><span class="st_h">'mysqli_init'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_insert_id'</span><span class="sy0">,</span><span class="st_h">'mysqli_kill'</span><span class="sy0">,</span><span class="st_h">'mysqli_master_query'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_more_results'</span><span class="sy0">,</span><span class="st_h">'mysqli_multi_query'</span><span class="sy0">,</span><span class="st_h">'mysqli_next_result'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_num_fields'</span><span class="sy0">,</span><span class="st_h">'mysqli_num_rows'</span><span class="sy0">,</span><span class="st_h">'mysqli_options'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_param_count'</span><span class="sy0">,</span><span class="st_h">'mysqli_ping'</span><span class="sy0">,</span><span class="st_h">'mysqli_prepare'</span><span class="sy0">,</span><span class="st_h">'mysqli_query'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_real_connect'</span><span class="sy0">,</span><span class="st_h">'mysqli_real_escape_string'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_real_query'</span><span class="sy0">,</span><span class="st_h">'mysqli_report'</span><span class="sy0">,</span><span class="st_h">'mysqli_rollback'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_rpl_parse_enabled'</span><span class="sy0">,</span><span class="st_h">'mysqli_rpl_probe'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_rpl_query_type'</span><span class="sy0">,</span><span class="st_h">'mysqli_select_db'</span><span class="sy0">,</span><span class="st_h">'mysqli_send_long_data'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_send_query'</span><span class="sy0">,</span><span class="st_h">'mysqli_set_charset'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_set_local_infile_default'</span><span class="sy0">,</span><span class="st_h">'mysqli_set_local_infile_handler'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_set_opt'</span><span class="sy0">,</span><span class="st_h">'mysqli_slave_query'</span><span class="sy0">,</span><span class="st_h">'mysqli_sqlstate'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_ssl_set'</span><span class="sy0">,</span><span class="st_h">'mysqli_stat'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_affected_rows'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_stmt_attr_get'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_attr_set'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_stmt_bind_param'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_bind_result'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_stmt_close'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_data_seek'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_errno'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_stmt_error'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_execute'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_fetch'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_stmt_field_count'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_free_result'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_stmt_get_warnings'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_init'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_stmt_insert_id'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_num_rows'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_stmt_param_count'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_prepare'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_reset'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_stmt_result_metadata'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_send_long_data'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_stmt_sqlstate'</span><span class="sy0">,</span><span class="st_h">'mysqli_stmt_store_result'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_store_result'</span><span class="sy0">,</span><span class="st_h">'mysqli_thread_id'</span><span class="sy0">,</span><span class="st_h">'mysqli_thread_safe'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'mysqli_use_result'</span><span class="sy0">,</span><span class="st_h">'mysqli_warning_count'</span><span class="sy0">,</span><span class="st_h">'natcasesort'</span><span class="sy0">,</span><span class="st_h">'natsort'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'new_xmldoc'</span><span class="sy0">,</span><span class="st_h">'next'</span><span class="sy0">,</span><span class="st_h">'ngettext'</span><span class="sy0">,</span><span class="st_h">'nl2br'</span><span class="sy0">,</span><span class="st_h">'nl_langinfo'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ntuser_getdomaincontroller'</span><span class="sy0">,</span><span class="st_h">'ntuser_getusergroups'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ntuser_getuserinfo'</span><span class="sy0">,</span><span class="st_h">'ntuser_getuserlist'</span><span class="sy0">,</span><span class="st_h">'number_format'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ob_clean'</span><span class="sy0">,</span><span class="st_h">'ob_deflatehandler'</span><span class="sy0">,</span><span class="st_h">'ob_end_clean'</span><span class="sy0">,</span><span class="st_h">'ob_end_flush'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ob_etaghandler'</span><span class="sy0">,</span><span class="st_h">'ob_flush'</span><span class="sy0">,</span><span class="st_h">'ob_get_clean'</span><span class="sy0">,</span><span class="st_h">'ob_get_contents'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ob_get_flush'</span><span class="sy0">,</span><span class="st_h">'ob_get_length'</span><span class="sy0">,</span><span class="st_h">'ob_get_level'</span><span class="sy0">,</span><span class="st_h">'ob_get_status'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ob_gzhandler'</span><span class="sy0">,</span><span class="st_h">'ob_iconv_handler'</span><span class="sy0">,</span><span class="st_h">'ob_implicit_flush'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ob_inflatehandler'</span><span class="sy0">,</span><span class="st_h">'ob_list_handlers'</span><span class="sy0">,</span><span class="st_h">'ob_start'</span><span class="sy0">,</span><span class="st_h">'ob_tidyhandler'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'octdec'</span><span class="sy0">,</span><span class="st_h">'odbc_autocommit'</span><span class="sy0">,</span><span class="st_h">'odbc_binmode'</span><span class="sy0">,</span><span class="st_h">'odbc_close'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'odbc_close_all'</span><span class="sy0">,</span><span class="st_h">'odbc_columnprivileges'</span><span class="sy0">,</span><span class="st_h">'odbc_columns'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'odbc_commit'</span><span class="sy0">,</span><span class="st_h">'odbc_connect'</span><span class="sy0">,</span><span class="st_h">'odbc_cursor'</span><span class="sy0">,</span><span class="st_h">'odbc_data_source'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'odbc_do'</span><span class="sy0">,</span><span class="st_h">'odbc_error'</span><span class="sy0">,</span><span class="st_h">'odbc_errormsg'</span><span class="sy0">,</span><span class="st_h">'odbc_exec'</span><span class="sy0">,</span><span class="st_h">'odbc_execute'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'odbc_fetch_array'</span><span class="sy0">,</span><span class="st_h">'odbc_fetch_into'</span><span class="sy0">,</span><span class="st_h">'odbc_fetch_object'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'odbc_fetch_row'</span><span class="sy0">,</span><span class="st_h">'odbc_field_len'</span><span class="sy0">,</span><span class="st_h">'odbc_field_name'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'odbc_field_num'</span><span class="sy0">,</span><span class="st_h">'odbc_field_precision'</span><span class="sy0">,</span><span class="st_h">'odbc_field_scale'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'odbc_field_type'</span><span class="sy0">,</span><span class="st_h">'odbc_foreignkeys'</span><span class="sy0">,</span><span class="st_h">'odbc_free_result'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'odbc_gettypeinfo'</span><span class="sy0">,</span><span class="st_h">'odbc_longreadlen'</span><span class="sy0">,</span><span class="st_h">'odbc_next_result'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'odbc_num_fields'</span><span class="sy0">,</span><span class="st_h">'odbc_num_rows'</span><span class="sy0">,</span><span class="st_h">'odbc_pconnect'</span><span class="sy0">,</span><span class="st_h">'odbc_prepare'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'odbc_primarykeys'</span><span class="sy0">,</span><span class="st_h">'odbc_procedurecolumns'</span><span class="sy0">,</span><span class="st_h">'odbc_procedures'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'odbc_result'</span><span class="sy0">,</span><span class="st_h">'odbc_result_all'</span><span class="sy0">,</span><span class="st_h">'odbc_rollback'</span><span class="sy0">,</span><span class="st_h">'odbc_setoption'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'odbc_specialcolumns'</span><span class="sy0">,</span><span class="st_h">'odbc_statistics'</span><span class="sy0">,</span><span class="st_h">'odbc_tableprivileges'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'odbc_tables'</span><span class="sy0">,</span><span class="st_h">'opendir'</span><span class="sy0">,</span><span class="st_h">'openlog'</span><span class="sy0">,</span><span class="st_h">'openssl_csr_export'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_csr_export_to_file'</span><span class="sy0">,</span><span class="st_h">'openssl_csr_get_public_key'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_csr_get_subject'</span><span class="sy0">,</span><span class="st_h">'openssl_csr_new'</span><span class="sy0">,</span><span class="st_h">'openssl_csr_sign'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_error_string'</span><span class="sy0">,</span><span class="st_h">'openssl_free_key'</span><span class="sy0">,</span><span class="st_h">'openssl_get_privatekey'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_get_publickey'</span><span class="sy0">,</span><span class="st_h">'openssl_open'</span><span class="sy0">,</span><span class="st_h">'openssl_pkcs12_export'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_pkcs12_export_to_file'</span><span class="sy0">,</span><span class="st_h">'openssl_pkcs12_read'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_pkcs7_decrypt'</span><span class="sy0">,</span><span class="st_h">'openssl_pkcs7_encrypt'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_pkcs7_sign'</span><span class="sy0">,</span><span class="st_h">'openssl_pkcs7_verify'</span><span class="sy0">,</span><span class="st_h">'openssl_pkey_export'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_pkey_export_to_file'</span><span class="sy0">,</span><span class="st_h">'openssl_pkey_free'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_pkey_get_details'</span><span class="sy0">,</span><span class="st_h">'openssl_pkey_get_private'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_pkey_get_public'</span><span class="sy0">,</span><span class="st_h">'openssl_pkey_new'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_private_decrypt'</span><span class="sy0">,</span><span class="st_h">'openssl_private_encrypt'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_public_decrypt'</span><span class="sy0">,</span><span class="st_h">'openssl_public_encrypt'</span><span class="sy0">,</span><span class="st_h">'openssl_seal'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_sign'</span><span class="sy0">,</span><span class="st_h">'openssl_verify'</span><span class="sy0">,</span><span class="st_h">'openssl_x509_checkpurpose'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_x509_check_private_key'</span><span class="sy0">,</span><span class="st_h">'openssl_x509_export'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_x509_export_to_file'</span><span class="sy0">,</span><span class="st_h">'openssl_x509_free'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'openssl_x509_parse'</span><span class="sy0">,</span><span class="st_h">'openssl_x509_read'</span><span class="sy0">,</span><span class="st_h">'ord'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'output_add_rewrite_var'</span><span class="sy0">,</span><span class="st_h">'output_reset_rewrite_vars'</span><span class="sy0">,</span><span class="st_h">'overload'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'outputdebugstring'</span><span class="sy0">,</span><span class="st_h">'pack'</span><span class="sy0">,</span><span class="st_h">'parse_ini_file'</span><span class="sy0">,</span><span class="st_h">'parse_str'</span><span class="sy0">,</span><span class="st_h">'parse_url'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'parsekit_compile_file'</span><span class="sy0">,</span><span class="st_h">'parsekit_compile_string'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'parsekit_func_arginfo'</span><span class="sy0">,</span><span class="st_h">'parsekit_opcode_flags'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'parsekit_opcode_name'</span><span class="sy0">,</span><span class="st_h">'passthru'</span><span class="sy0">,</span><span class="st_h">'pathinfo'</span><span class="sy0">,</span><span class="st_h">'pclose'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_add_bookmark'</span><span class="sy0">,</span><span class="st_h">'pdf_add_launchlink'</span><span class="sy0">,</span><span class="st_h">'pdf_add_locallink'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_add_nameddest'</span><span class="sy0">,</span><span class="st_h">'pdf_add_note'</span><span class="sy0">,</span><span class="st_h">'pdf_add_pdflink'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_add_thumbnail'</span><span class="sy0">,</span><span class="st_h">'pdf_add_weblink'</span><span class="sy0">,</span><span class="st_h">'pdf_arc'</span><span class="sy0">,</span><span class="st_h">'pdf_arcn'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_attach_file'</span><span class="sy0">,</span><span class="st_h">'pdf_begin_font'</span><span class="sy0">,</span><span class="st_h">'pdf_begin_glyph'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_begin_page'</span><span class="sy0">,</span><span class="st_h">'pdf_begin_pattern'</span><span class="sy0">,</span><span class="st_h">'pdf_begin_template'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_circle'</span><span class="sy0">,</span><span class="st_h">'pdf_clip'</span><span class="sy0">,</span><span class="st_h">'pdf_close'</span><span class="sy0">,</span><span class="st_h">'pdf_close_image'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_close_pdi'</span><span class="sy0">,</span><span class="st_h">'pdf_close_pdi_page'</span><span class="sy0">,</span><span class="st_h">'pdf_closepath'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_closepath_fill_stroke'</span><span class="sy0">,</span><span class="st_h">'pdf_closepath_stroke'</span><span class="sy0">,</span><span class="st_h">'pdf_concat'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_continue_text'</span><span class="sy0">,</span><span class="st_h">'pdf_create_gstate'</span><span class="sy0">,</span><span class="st_h">'pdf_create_pvf'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_curveto'</span><span class="sy0">,</span><span class="st_h">'pdf_delete'</span><span class="sy0">,</span><span class="st_h">'pdf_delete_pvf'</span><span class="sy0">,</span><span class="st_h">'pdf_encoding_set_char'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_end_font'</span><span class="sy0">,</span><span class="st_h">'pdf_end_glyph'</span><span class="sy0">,</span><span class="st_h">'pdf_end_page'</span><span class="sy0">,</span><span class="st_h">'pdf_end_pattern'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_end_template'</span><span class="sy0">,</span><span class="st_h">'pdf_endpath'</span><span class="sy0">,</span><span class="st_h">'pdf_fill'</span><span class="sy0">,</span><span class="st_h">'pdf_fill_imageblock'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_fill_pdfblock'</span><span class="sy0">,</span><span class="st_h">'pdf_fill_stroke'</span><span class="sy0">,</span><span class="st_h">'pdf_fill_textblock'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_findfont'</span><span class="sy0">,</span><span class="st_h">'pdf_fit_image'</span><span class="sy0">,</span><span class="st_h">'pdf_fit_pdi_page'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_fit_textline'</span><span class="sy0">,</span><span class="st_h">'pdf_get_apiname'</span><span class="sy0">,</span><span class="st_h">'pdf_get_buffer'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_get_errmsg'</span><span class="sy0">,</span><span class="st_h">'pdf_get_errnum'</span><span class="sy0">,</span><span class="st_h">'pdf_get_parameter'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_get_pdi_parameter'</span><span class="sy0">,</span><span class="st_h">'pdf_get_pdi_value'</span><span class="sy0">,</span><span class="st_h">'pdf_get_value'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_initgraphics'</span><span class="sy0">,</span><span class="st_h">'pdf_lineto'</span><span class="sy0">,</span><span class="st_h">'pdf_load_font'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_load_iccprofile'</span><span class="sy0">,</span><span class="st_h">'pdf_load_image'</span><span class="sy0">,</span><span class="st_h">'pdf_makespotcolor'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_moveto'</span><span class="sy0">,</span><span class="st_h">'pdf_new'</span><span class="sy0">,</span><span class="st_h">'pdf_open_ccitt'</span><span class="sy0">,</span><span class="st_h">'pdf_open_file'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_open_image'</span><span class="sy0">,</span><span class="st_h">'pdf_open_image_file'</span><span class="sy0">,</span><span class="st_h">'pdf_open_pdi'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_open_pdi_page'</span><span class="sy0">,</span><span class="st_h">'pdf_place_image'</span><span class="sy0">,</span><span class="st_h">'pdf_place_pdi_page'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_process_pdi'</span><span class="sy0">,</span><span class="st_h">'pdf_rect'</span><span class="sy0">,</span><span class="st_h">'pdf_restore'</span><span class="sy0">,</span><span class="st_h">'pdf_rotate'</span><span class="sy0">,</span><span class="st_h">'pdf_save'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_scale'</span><span class="sy0">,</span><span class="st_h">'pdf_set_border_color'</span><span class="sy0">,</span><span class="st_h">'pdf_set_border_dash'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_set_border_style'</span><span class="sy0">,</span><span class="st_h">'pdf_set_gstate'</span><span class="sy0">,</span><span class="st_h">'pdf_set_info'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_set_parameter'</span><span class="sy0">,</span><span class="st_h">'pdf_set_text_pos'</span><span class="sy0">,</span><span class="st_h">'pdf_set_value'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_setcolor'</span><span class="sy0">,</span><span class="st_h">'pdf_setdash'</span><span class="sy0">,</span><span class="st_h">'pdf_setdashpattern'</span><span class="sy0">,</span><span class="st_h">'pdf_setflat'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_setfont'</span><span class="sy0">,</span><span class="st_h">'pdf_setlinecap'</span><span class="sy0">,</span><span class="st_h">'pdf_setlinejoin'</span><span class="sy0">,</span><span class="st_h">'pdf_setlinewidth'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_setmatrix'</span><span class="sy0">,</span><span class="st_h">'pdf_setmiterlimit'</span><span class="sy0">,</span><span class="st_h">'pdf_setpolydash'</span><span class="sy0">,</span><span class="st_h">'pdf_shading'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_shading_pattern'</span><span class="sy0">,</span><span class="st_h">'pdf_shfill'</span><span class="sy0">,</span><span class="st_h">'pdf_show'</span><span class="sy0">,</span><span class="st_h">'pdf_show_boxed'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_show_xy'</span><span class="sy0">,</span><span class="st_h">'pdf_skew'</span><span class="sy0">,</span><span class="st_h">'pdf_stringwidth'</span><span class="sy0">,</span><span class="st_h">'pdf_stroke'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pdf_translate'</span><span class="sy0">,</span><span class="st_h">'pdo_drivers'</span><span class="sy0">,</span><span class="st_h">'pfsockopen'</span><span class="sy0">,</span><span class="st_h">'pg_affected_rows'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_cancel_query'</span><span class="sy0">,</span><span class="st_h">'pg_clientencoding'</span><span class="sy0">,</span><span class="st_h">'pg_client_encoding'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_close'</span><span class="sy0">,</span><span class="st_h">'pg_cmdtuples'</span><span class="sy0">,</span><span class="st_h">'pg_connect'</span><span class="sy0">,</span><span class="st_h">'pg_connection_busy'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_connection_reset'</span><span class="sy0">,</span><span class="st_h">'pg_connection_status'</span><span class="sy0">,</span><span class="st_h">'pg_convert'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_copy_from'</span><span class="sy0">,</span><span class="st_h">'pg_copy_to'</span><span class="sy0">,</span><span class="st_h">'pg_dbname'</span><span class="sy0">,</span><span class="st_h">'pg_delete'</span><span class="sy0">,</span><span class="st_h">'pg_end_copy'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_errormessage'</span><span class="sy0">,</span><span class="st_h">'pg_escape_bytea'</span><span class="sy0">,</span><span class="st_h">'pg_escape_string'</span><span class="sy0">,</span><span class="st_h">'pg_exec'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_execute'</span><span class="sy0">,</span><span class="st_h">'pg_fetch_all'</span><span class="sy0">,</span><span class="st_h">'pg_fetch_all_columns'</span><span class="sy0">,</span><span class="st_h">'pg_fetch_array'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_fetch_assoc'</span><span class="sy0">,</span><span class="st_h">'pg_fetch_object'</span><span class="sy0">,</span><span class="st_h">'pg_fetch_result'</span><span class="sy0">,</span><span class="st_h">'pg_fetch_row'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_fieldisnull'</span><span class="sy0">,</span><span class="st_h">'pg_fieldname'</span><span class="sy0">,</span><span class="st_h">'pg_fieldnum'</span><span class="sy0">,</span><span class="st_h">'pg_fieldprtlen'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_fieldsize'</span><span class="sy0">,</span><span class="st_h">'pg_fieldtype'</span><span class="sy0">,</span><span class="st_h">'pg_field_is_null'</span><span class="sy0">,</span><span class="st_h">'pg_field_name'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_field_num'</span><span class="sy0">,</span><span class="st_h">'pg_field_prtlen'</span><span class="sy0">,</span><span class="st_h">'pg_field_size'</span><span class="sy0">,</span><span class="st_h">'pg_field_table'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_field_type'</span><span class="sy0">,</span><span class="st_h">'pg_field_type_oid'</span><span class="sy0">,</span><span class="st_h">'pg_free_result'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_freeresult'</span><span class="sy0">,</span><span class="st_h">'pg_get_notify'</span><span class="sy0">,</span><span class="st_h">'pg_get_pid'</span><span class="sy0">,</span><span class="st_h">'pg_get_result'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_getlastoid'</span><span class="sy0">,</span><span class="st_h">'pg_host'</span><span class="sy0">,</span><span class="st_h">'pg_insert'</span><span class="sy0">,</span><span class="st_h">'pg_last_error'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_last_notice'</span><span class="sy0">,</span><span class="st_h">'pg_last_oid'</span><span class="sy0">,</span><span class="st_h">'pg_loclose'</span><span class="sy0">,</span><span class="st_h">'pg_locreate'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_loexport'</span><span class="sy0">,</span><span class="st_h">'pg_loimport'</span><span class="sy0">,</span><span class="st_h">'pg_loopen'</span><span class="sy0">,</span><span class="st_h">'pg_loread'</span><span class="sy0">,</span><span class="st_h">'pg_loreadall'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_lounlink'</span><span class="sy0">,</span><span class="st_h">'pg_lowrite'</span><span class="sy0">,</span><span class="st_h">'pg_lo_close'</span><span class="sy0">,</span><span class="st_h">'pg_lo_create'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_lo_export'</span><span class="sy0">,</span><span class="st_h">'pg_lo_import'</span><span class="sy0">,</span><span class="st_h">'pg_lo_open'</span><span class="sy0">,</span><span class="st_h">'pg_lo_read'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_lo_read_all'</span><span class="sy0">,</span><span class="st_h">'pg_lo_seek'</span><span class="sy0">,</span><span class="st_h">'pg_lo_tell'</span><span class="sy0">,</span><span class="st_h">'pg_lo_unlink'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_lo_write'</span><span class="sy0">,</span><span class="st_h">'pg_meta_data'</span><span class="sy0">,</span><span class="st_h">'pg_numfields'</span><span class="sy0">,</span><span class="st_h">'pg_numrows'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_num_fields'</span><span class="sy0">,</span><span class="st_h">'pg_num_rows'</span><span class="sy0">,</span><span class="st_h">'pg_options'</span><span class="sy0">,</span><span class="st_h">'pg_parameter_status'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_pconnect'</span><span class="sy0">,</span><span class="st_h">'pg_ping'</span><span class="sy0">,</span><span class="st_h">'pg_port'</span><span class="sy0">,</span><span class="st_h">'pg_prepare'</span><span class="sy0">,</span><span class="st_h">'pg_put_line'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_query'</span><span class="sy0">,</span><span class="st_h">'pg_query_params'</span><span class="sy0">,</span><span class="st_h">'pg_result'</span><span class="sy0">,</span><span class="st_h">'pg_result_error'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_result_error_field'</span><span class="sy0">,</span><span class="st_h">'pg_result_seek'</span><span class="sy0">,</span><span class="st_h">'pg_result_status'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_select'</span><span class="sy0">,</span><span class="st_h">'pg_send_execute'</span><span class="sy0">,</span><span class="st_h">'pg_send_prepare'</span><span class="sy0">,</span><span class="st_h">'pg_send_query'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_send_query_params'</span><span class="sy0">,</span><span class="st_h">'pg_set_client_encoding'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_set_error_verbosity'</span><span class="sy0">,</span><span class="st_h">'pg_setclientencoding'</span><span class="sy0">,</span><span class="st_h">'pg_trace'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_transaction_status'</span><span class="sy0">,</span><span class="st_h">'pg_tty'</span><span class="sy0">,</span><span class="st_h">'pg_unescape_bytea'</span><span class="sy0">,</span><span class="st_h">'pg_untrace'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pg_update'</span><span class="sy0">,</span><span class="st_h">'pg_version'</span><span class="sy0">,</span><span class="st_h">'php_egg_logo_guid'</span><span class="sy0">,</span><span class="st_h">'php_ini_loaded_file'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'php_ini_scanned_files'</span><span class="sy0">,</span><span class="st_h">'php_logo_guid'</span><span class="sy0">,</span><span class="st_h">'php_real_logo_guid'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'php_sapi_name'</span><span class="sy0">,</span><span class="st_h">'php_strip_whitespace'</span><span class="sy0">,</span><span class="st_h">'php_uname'</span><span class="sy0">,</span><span class="st_h">'phpcredits'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'phpdoc_xml_from_string'</span><span class="sy0">,</span><span class="st_h">'phpinfo'</span><span class="sy0">,</span><span class="st_h">'phpversion'</span><span class="sy0">,</span><span class="st_h">'pi'</span><span class="sy0">,</span><span class="st_h">'png2wbmp'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pop3_close'</span><span class="sy0">,</span><span class="st_h">'pop3_delete_message'</span><span class="sy0">,</span><span class="st_h">'pop3_get_account_size'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pop3_get_message'</span><span class="sy0">,</span><span class="st_h">'pop3_get_message_count'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pop3_get_message_header'</span><span class="sy0">,</span><span class="st_h">'pop3_get_message_ids'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pop3_get_message_size'</span><span class="sy0">,</span><span class="st_h">'pop3_get_message_sizes'</span><span class="sy0">,</span><span class="st_h">'pop3_open'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'pop3_undelete'</span><span class="sy0">,</span><span class="st_h">'popen'</span><span class="sy0">,</span><span class="st_h">'pos'</span><span class="sy0">,</span><span class="st_h">'posix_ctermid'</span><span class="sy0">,</span><span class="st_h">'posix_errno'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'posix_getcwd'</span><span class="sy0">,</span><span class="st_h">'posix_getegid'</span><span class="sy0">,</span><span class="st_h">'posix_geteuid'</span><span class="sy0">,</span><span class="st_h">'posix_getgid'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'posix_getgrgid'</span><span class="sy0">,</span><span class="st_h">'posix_getgrnam'</span><span class="sy0">,</span><span class="st_h">'posix_getgroups'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'posix_getlogin'</span><span class="sy0">,</span><span class="st_h">'posix_getpgid'</span><span class="sy0">,</span><span class="st_h">'posix_getpgrp'</span><span class="sy0">,</span><span class="st_h">'posix_getpid'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'posix_getppid'</span><span class="sy0">,</span><span class="st_h">'posix_getpwnam'</span><span class="sy0">,</span><span class="st_h">'posix_getpwuid'</span><span class="sy0">,</span><span class="st_h">'posix_getrlimit'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'posix_getsid'</span><span class="sy0">,</span><span class="st_h">'posix_getuid'</span><span class="sy0">,</span><span class="st_h">'posix_get_last_error'</span><span class="sy0">,</span><span class="st_h">'posix_isatty'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'posix_kill'</span><span class="sy0">,</span><span class="st_h">'posix_mkfifo'</span><span class="sy0">,</span><span class="st_h">'posix_setegid'</span><span class="sy0">,</span><span class="st_h">'posix_seteuid'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'posix_setgid'</span><span class="sy0">,</span><span class="st_h">'posix_setpgid'</span><span class="sy0">,</span><span class="st_h">'posix_setsid'</span><span class="sy0">,</span><span class="st_h">'posix_setuid'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'posix_strerror'</span><span class="sy0">,</span><span class="st_h">'posix_times'</span><span class="sy0">,</span><span class="st_h">'posix_ttyname'</span><span class="sy0">,</span><span class="st_h">'posix_uname'</span><span class="sy0">,</span><span class="st_h">'pow'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'preg_grep'</span><span class="sy0">,</span><span class="st_h">'preg_last_error'</span><span class="sy0">,</span><span class="st_h">'preg_match'</span><span class="sy0">,</span><span class="st_h">'preg_match_all'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'preg_quote'</span><span class="sy0">,</span><span class="st_h">'preg_replace'</span><span class="sy0">,</span><span class="st_h">'preg_replace_callback'</span><span class="sy0">,</span><span class="st_h">'preg_split'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'prev'</span><span class="sy0">,</span><span class="st_h">'print_r'</span><span class="sy0">,</span><span class="st_h">'printf'</span><span class="sy0">,</span><span class="st_h">'proc_close'</span><span class="sy0">,</span><span class="st_h">'proc_get_status'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'proc_open'</span><span class="sy0">,</span><span class="st_h">'proc_terminate'</span><span class="sy0">,</span><span class="st_h">'putenv'</span><span class="sy0">,</span><span class="st_h">'quoted_printable_decode'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'quotemeta'</span><span class="sy0">,</span><span class="st_h">'rad2deg'</span><span class="sy0">,</span><span class="st_h">'radius_acct_open'</span><span class="sy0">,</span><span class="st_h">'radius_add_server'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'radius_auth_open'</span><span class="sy0">,</span><span class="st_h">'radius_close'</span><span class="sy0">,</span><span class="st_h">'radius_config'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'radius_create_request'</span><span class="sy0">,</span><span class="st_h">'radius_cvt_addr'</span><span class="sy0">,</span><span class="st_h">'radius_cvt_int'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'radius_cvt_string'</span><span class="sy0">,</span><span class="st_h">'radius_demangle'</span><span class="sy0">,</span><span class="st_h">'radius_demangle_mppe_key'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'radius_get_attr'</span><span class="sy0">,</span><span class="st_h">'radius_get_vendor_attr'</span><span class="sy0">,</span><span class="st_h">'radius_put_addr'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'radius_put_attr'</span><span class="sy0">,</span><span class="st_h">'radius_put_int'</span><span class="sy0">,</span><span class="st_h">'radius_put_string'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'radius_put_vendor_addr'</span><span class="sy0">,</span><span class="st_h">'radius_put_vendor_attr'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'radius_put_vendor_int'</span><span class="sy0">,</span><span class="st_h">'radius_put_vendor_string'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'radius_request_authenticator'</span><span class="sy0">,</span><span class="st_h">'radius_send_request'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'radius_server_secret'</span><span class="sy0">,</span><span class="st_h">'radius_strerror'</span><span class="sy0">,</span><span class="st_h">'rand'</span><span class="sy0">,</span><span class="st_h">'range'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'rawurldecode'</span><span class="sy0">,</span><span class="st_h">'rawurlencode'</span><span class="sy0">,</span><span class="st_h">'read_exif_data'</span><span class="sy0">,</span><span class="st_h">'readdir'</span><span class="sy0">,</span><span class="st_h">'readfile'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'readgzfile'</span><span class="sy0">,</span><span class="st_h">'readlink'</span><span class="sy0">,</span><span class="st_h">'realpath'</span><span class="sy0">,</span><span class="st_h">'reg_close_key'</span><span class="sy0">,</span><span class="st_h">'reg_create_key'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'reg_enum_key'</span><span class="sy0">,</span><span class="st_h">'reg_enum_value'</span><span class="sy0">,</span><span class="st_h">'reg_get_value'</span><span class="sy0">,</span><span class="st_h">'reg_open_key'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'reg_set_value'</span><span class="sy0">,</span><span class="st_h">'register_shutdown_function'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'register_tick_function'</span><span class="sy0">,</span><span class="st_h">'rename'</span><span class="sy0">,</span><span class="st_h">'res_close'</span><span class="sy0">,</span><span class="st_h">'res_get'</span><span class="sy0">,</span><span class="st_h">'res_list'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'res_list_type'</span><span class="sy0">,</span><span class="st_h">'res_open'</span><span class="sy0">,</span><span class="st_h">'res_set'</span><span class="sy0">,</span><span class="st_h">'reset'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'restore_error_handler'</span><span class="sy0">,</span><span class="st_h">'restore_include_path'</span><span class="sy0">,</span><span class="st_h">'rewind'</span><span class="sy0">,</span><span class="st_h">'rewinddir'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'rmdir'</span><span class="sy0">,</span><span class="st_h">'round'</span><span class="sy0">,</span><span class="st_h">'rsort'</span><span class="sy0">,</span><span class="st_h">'rtrim'</span><span class="sy0">,</span><span class="st_h">'runkit_class_adopt'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'runkit_class_emancipate'</span><span class="sy0">,</span><span class="st_h">'runkit_constant_add'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'runkit_constant_redefine'</span><span class="sy0">,</span><span class="st_h">'runkit_constant_remove'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'runkit_default_property_add'</span><span class="sy0">,</span><span class="st_h">'runkit_function_add'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'runkit_function_copy'</span><span class="sy0">,</span><span class="st_h">'runkit_function_redefine'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'runkit_function_remove'</span><span class="sy0">,</span><span class="st_h">'runkit_function_rename'</span><span class="sy0">,</span><span class="st_h">'runkit_import'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'runkit_lint'</span><span class="sy0">,</span><span class="st_h">'runkit_lint_file'</span><span class="sy0">,</span><span class="st_h">'runkit_method_add'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'runkit_method_copy'</span><span class="sy0">,</span><span class="st_h">'runkit_method_redefine'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'runkit_method_remove'</span><span class="sy0">,</span><span class="st_h">'runkit_method_rename'</span><span class="sy0">,</span><span class="st_h">'runkit_object_id'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'runkit_return_value_used'</span><span class="sy0">,</span><span class="st_h">'runkit_sandbox_output_handler'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'runkit_superglobals'</span><span class="sy0">,</span><span class="st_h">'runkit_zval_inspect'</span><span class="sy0">,</span><span class="st_h">'scandir'</span><span class="sy0">,</span><span class="st_h">'sem_acquire'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sem_get'</span><span class="sy0">,</span><span class="st_h">'sem_release'</span><span class="sy0">,</span><span class="st_h">'sem_remove'</span><span class="sy0">,</span><span class="st_h">'serialize'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'session_cache_expire'</span><span class="sy0">,</span><span class="st_h">'session_cache_limiter'</span><span class="sy0">,</span><span class="st_h">'session_commit'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'session_decode'</span><span class="sy0">,</span><span class="st_h">'session_destroy'</span><span class="sy0">,</span><span class="st_h">'session_encode'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'session_get_cookie_params'</span><span class="sy0">,</span><span class="st_h">'session_id'</span><span class="sy0">,</span><span class="st_h">'session_is_registered'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'session_module_name'</span><span class="sy0">,</span><span class="st_h">'session_name'</span><span class="sy0">,</span><span class="st_h">'session_regenerate_id'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'session_register'</span><span class="sy0">,</span><span class="st_h">'session_save_path'</span><span class="sy0">,</span><span class="st_h">'session_set_cookie_params'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'session_set_save_handler'</span><span class="sy0">,</span><span class="st_h">'session_start'</span><span class="sy0">,</span><span class="st_h">'session_unregister'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'session_unset'</span><span class="sy0">,</span><span class="st_h">'session_write_close'</span><span class="sy0">,</span><span class="st_h">'set_content'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'set_error_handler'</span><span class="sy0">,</span><span class="st_h">'set_file_buffer'</span><span class="sy0">,</span><span class="st_h">'set_include_path'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'set_magic_quotes_runtime'</span><span class="sy0">,</span><span class="st_h">'set_socket_blocking'</span><span class="sy0">,</span><span class="st_h">'set_time_limit'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'setcookie'</span><span class="sy0">,</span><span class="st_h">'setlocale'</span><span class="sy0">,</span><span class="st_h">'setrawcookie'</span><span class="sy0">,</span><span class="st_h">'settype'</span><span class="sy0">,</span><span class="st_h">'sha1'</span><span class="sy0">,</span><span class="st_h">'sha1_file'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'shell_exec'</span><span class="sy0">,</span><span class="st_h">'shmop_close'</span><span class="sy0">,</span><span class="st_h">'shmop_delete'</span><span class="sy0">,</span><span class="st_h">'shmop_open'</span><span class="sy0">,</span><span class="st_h">'shmop_read'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'shmop_size'</span><span class="sy0">,</span><span class="st_h">'shmop_write'</span><span class="sy0">,</span><span class="st_h">'shm_attach'</span><span class="sy0">,</span><span class="st_h">'shm_detach'</span><span class="sy0">,</span><span class="st_h">'shm_get_var'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'shm_put_var'</span><span class="sy0">,</span><span class="st_h">'shm_remove'</span><span class="sy0">,</span><span class="st_h">'shm_remove_var'</span><span class="sy0">,</span><span class="st_h">'show_source'</span><span class="sy0">,</span><span class="st_h">'shuffle'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'similar_text'</span><span class="sy0">,</span><span class="st_h">'simplexml_import_dom'</span><span class="sy0">,</span><span class="st_h">'simplexml_load_file'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'simplexml_load_string'</span><span class="sy0">,</span><span class="st_h">'sin'</span><span class="sy0">,</span><span class="st_h">'sinh'</span><span class="sy0">,</span><span class="st_h">'sizeof'</span><span class="sy0">,</span><span class="st_h">'sleep'</span><span class="sy0">,</span><span class="st_h">'smtp_close'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'smtp_cmd_data'</span><span class="sy0">,</span><span class="st_h">'smtp_cmd_mail'</span><span class="sy0">,</span><span class="st_h">'smtp_cmd_rcpt'</span><span class="sy0">,</span><span class="st_h">'smtp_connect'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'snmp_get_quick_print'</span><span class="sy0">,</span><span class="st_h">'snmp_get_valueretrieval'</span><span class="sy0">,</span><span class="st_h">'snmp_read_mib'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'snmp_set_quick_print'</span><span class="sy0">,</span><span class="st_h">'snmp_set_valueretrieval'</span><span class="sy0">,</span><span class="st_h">'snmp2_get'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'snmp2_getnext'</span><span class="sy0">,</span><span class="st_h">'snmp2_real_walk'</span><span class="sy0">,</span><span class="st_h">'snmp2_set'</span><span class="sy0">,</span><span class="st_h">'snmp2_walk'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'snmp3_get'</span><span class="sy0">,</span><span class="st_h">'snmp3_getnext'</span><span class="sy0">,</span><span class="st_h">'snmp3_real_walk'</span><span class="sy0">,</span><span class="st_h">'snmp3_set'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'snmp3_walk'</span><span class="sy0">,</span><span class="st_h">'snmpget'</span><span class="sy0">,</span><span class="st_h">'snmpgetnext'</span><span class="sy0">,</span><span class="st_h">'snmprealwalk'</span><span class="sy0">,</span><span class="st_h">'snmpset'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'snmpwalk'</span><span class="sy0">,</span><span class="st_h">'snmpwalkoid'</span><span class="sy0">,</span><span class="st_h">'socket_accept'</span><span class="sy0">,</span><span class="st_h">'socket_bind'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'socket_clear_error'</span><span class="sy0">,</span><span class="st_h">'socket_close'</span><span class="sy0">,</span><span class="st_h">'socket_connect'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'socket_create'</span><span class="sy0">,</span><span class="st_h">'socket_create_listen'</span><span class="sy0">,</span><span class="st_h">'socket_create_pair'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'socket_getopt'</span><span class="sy0">,</span><span class="st_h">'socket_getpeername'</span><span class="sy0">,</span><span class="st_h">'socket_getsockname'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'socket_get_option'</span><span class="sy0">,</span><span class="st_h">'socket_get_status'</span><span class="sy0">,</span><span class="st_h">'socket_iovec_add'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'socket_iovec_alloc'</span><span class="sy0">,</span><span class="st_h">'socket_iovec_delete'</span><span class="sy0">,</span><span class="st_h">'socket_iovec_fetch'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'socket_iovec_free'</span><span class="sy0">,</span><span class="st_h">'socket_iovec_set'</span><span class="sy0">,</span><span class="st_h">'socket_last_error'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'socket_listen'</span><span class="sy0">,</span><span class="st_h">'socket_read'</span><span class="sy0">,</span><span class="st_h">'socket_readv'</span><span class="sy0">,</span><span class="st_h">'socket_recv'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'socket_recvfrom'</span><span class="sy0">,</span><span class="st_h">'socket_recvmsg'</span><span class="sy0">,</span><span class="st_h">'socket_select'</span><span class="sy0">,</span><span class="st_h">'socket_send'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'socket_sendmsg'</span><span class="sy0">,</span><span class="st_h">'socket_sendto'</span><span class="sy0">,</span><span class="st_h">'socket_setopt'</span><span class="sy0">,</span><span class="st_h">'socket_set_block'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'socket_set_blocking'</span><span class="sy0">,</span><span class="st_h">'socket_set_nonblock'</span><span class="sy0">,</span><span class="st_h">'socket_set_option'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'socket_set_timeout'</span><span class="sy0">,</span><span class="st_h">'socket_shutdown'</span><span class="sy0">,</span><span class="st_h">'socket_strerror'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'socket_write'</span><span class="sy0">,</span><span class="st_h">'socket_writev'</span><span class="sy0">,</span><span class="st_h">'sort'</span><span class="sy0">,</span><span class="st_h">'soundex'</span><span class="sy0">,</span><span class="st_h">'spl_autoload'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'spl_autoload_call'</span><span class="sy0">,</span><span class="st_h">'spl_autoload_extensions'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'spl_autoload_functions'</span><span class="sy0">,</span><span class="st_h">'spl_autoload_register'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'spl_autoload_unregister'</span><span class="sy0">,</span><span class="st_h">'spl_classes'</span><span class="sy0">,</span><span class="st_h">'spl_object_hash'</span><span class="sy0">,</span><span class="st_h">'split'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'spliti'</span><span class="sy0">,</span><span class="st_h">'sprintf'</span><span class="sy0">,</span><span class="st_h">'sql_regcase'</span><span class="sy0">,</span><span class="st_h">'sqlite_array_query'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sqlite_busy_timeout'</span><span class="sy0">,</span><span class="st_h">'sqlite_changes'</span><span class="sy0">,</span><span class="st_h">'sqlite_close'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sqlite_column'</span><span class="sy0">,</span><span class="st_h">'sqlite_create_aggregate'</span><span class="sy0">,</span><span class="st_h">'sqlite_create_function'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sqlite_current'</span><span class="sy0">,</span><span class="st_h">'sqlite_error_string'</span><span class="sy0">,</span><span class="st_h">'sqlite_escape_string'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sqlite_exec'</span><span class="sy0">,</span><span class="st_h">'sqlite_factory'</span><span class="sy0">,</span><span class="st_h">'sqlite_fetch_all'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sqlite_fetch_array'</span><span class="sy0">,</span><span class="st_h">'sqlite_fetch_column_types'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sqlite_fetch_object'</span><span class="sy0">,</span><span class="st_h">'sqlite_fetch_single'</span><span class="sy0">,</span><span class="st_h">'sqlite_fetch_string'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sqlite_field_name'</span><span class="sy0">,</span><span class="st_h">'sqlite_has_more'</span><span class="sy0">,</span><span class="st_h">'sqlite_has_prev'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sqlite_last_error'</span><span class="sy0">,</span><span class="st_h">'sqlite_last_insert_rowid'</span><span class="sy0">,</span><span class="st_h">'sqlite_libencoding'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sqlite_libversion'</span><span class="sy0">,</span><span class="st_h">'sqlite_next'</span><span class="sy0">,</span><span class="st_h">'sqlite_num_fields'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sqlite_num_rows'</span><span class="sy0">,</span><span class="st_h">'sqlite_open'</span><span class="sy0">,</span><span class="st_h">'sqlite_popen'</span><span class="sy0">,</span><span class="st_h">'sqlite_prev'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sqlite_query'</span><span class="sy0">,</span><span class="st_h">'sqlite_rewind'</span><span class="sy0">,</span><span class="st_h">'sqlite_seek'</span><span class="sy0">,</span><span class="st_h">'sqlite_single_query'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sqlite_udf_decode_binary'</span><span class="sy0">,</span><span class="st_h">'sqlite_udf_encode_binary'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sqlite_unbuffered_query'</span><span class="sy0">,</span><span class="st_h">'sqlite_valid'</span><span class="sy0">,</span><span class="st_h">'sqrt'</span><span class="sy0">,</span><span class="st_h">'srand'</span><span class="sy0">,</span><span class="st_h">'sscanf'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ssh2_auth_hostbased_file'</span><span class="sy0">,</span><span class="st_h">'ssh2_auth_none'</span><span class="sy0">,</span><span class="st_h">'ssh2_auth_password'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ssh2_auth_pubkey_file'</span><span class="sy0">,</span><span class="st_h">'ssh2_connect'</span><span class="sy0">,</span><span class="st_h">'ssh2_exec'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ssh2_fetch_stream'</span><span class="sy0">,</span><span class="st_h">'ssh2_fingerprint'</span><span class="sy0">,</span><span class="st_h">'ssh2_forward_accept'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ssh2_forward_listen'</span><span class="sy0">,</span><span class="st_h">'ssh2_methods_negotiated'</span><span class="sy0">,</span><span class="st_h">'ssh2_poll'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ssh2_publickey_add'</span><span class="sy0">,</span><span class="st_h">'ssh2_publickey_init'</span><span class="sy0">,</span><span class="st_h">'ssh2_publickey_list'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ssh2_publickey_remove'</span><span class="sy0">,</span><span class="st_h">'ssh2_scp_recv'</span><span class="sy0">,</span><span class="st_h">'ssh2_scp_send'</span><span class="sy0">,</span><span class="st_h">'ssh2_sftp'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ssh2_sftp_lstat'</span><span class="sy0">,</span><span class="st_h">'ssh2_sftp_mkdir'</span><span class="sy0">,</span><span class="st_h">'ssh2_sftp_readlink'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ssh2_sftp_realpath'</span><span class="sy0">,</span><span class="st_h">'ssh2_sftp_rename'</span><span class="sy0">,</span><span class="st_h">'ssh2_sftp_rmdir'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ssh2_sftp_stat'</span><span class="sy0">,</span><span class="st_h">'ssh2_sftp_symlink'</span><span class="sy0">,</span><span class="st_h">'ssh2_sftp_unlink'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ssh2_shell'</span><span class="sy0">,</span><span class="st_h">'ssh2_tunnel'</span><span class="sy0">,</span><span class="st_h">'stat'</span><span class="sy0">,</span><span class="st_h">'stats_absolute_deviation'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_cdf_beta'</span><span class="sy0">,</span><span class="st_h">'stats_cdf_binomial'</span><span class="sy0">,</span><span class="st_h">'stats_cdf_cauchy'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_cdf_chisquare'</span><span class="sy0">,</span><span class="st_h">'stats_cdf_exponential'</span><span class="sy0">,</span><span class="st_h">'stats_cdf_f'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_cdf_gamma'</span><span class="sy0">,</span><span class="st_h">'stats_cdf_laplace'</span><span class="sy0">,</span><span class="st_h">'stats_cdf_logistic'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_cdf_negative_binomial'</span><span class="sy0">,</span><span class="st_h">'stats_cdf_noncentral_chisquare'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_cdf_noncentral_f'</span><span class="sy0">,</span><span class="st_h">'stats_cdf_noncentral_t'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_cdf_normal'</span><span class="sy0">,</span><span class="st_h">'stats_cdf_poisson'</span><span class="sy0">,</span><span class="st_h">'stats_cdf_t'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_cdf_uniform'</span><span class="sy0">,</span><span class="st_h">'stats_cdf_weibull'</span><span class="sy0">,</span><span class="st_h">'stats_covariance'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_dens_beta'</span><span class="sy0">,</span><span class="st_h">'stats_dens_cauchy'</span><span class="sy0">,</span><span class="st_h">'stats_dens_chisquare'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_dens_exponential'</span><span class="sy0">,</span><span class="st_h">'stats_dens_f'</span><span class="sy0">,</span><span class="st_h">'stats_dens_gamma'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_dens_laplace'</span><span class="sy0">,</span><span class="st_h">'stats_dens_logistic'</span><span class="sy0">,</span><span class="st_h">'stats_dens_normal'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_dens_pmf_binomial'</span><span class="sy0">,</span><span class="st_h">'stats_dens_pmf_hypergeometric'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_dens_pmf_negative_binomial'</span><span class="sy0">,</span><span class="st_h">'stats_dens_pmf_poisson'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_dens_t'</span><span class="sy0">,</span><span class="st_h">'stats_dens_uniform'</span><span class="sy0">,</span><span class="st_h">'stats_dens_weibull'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_harmonic_mean'</span><span class="sy0">,</span><span class="st_h">'stats_kurtosis'</span><span class="sy0">,</span><span class="st_h">'stats_rand_gen_beta'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_rand_gen_chisquare'</span><span class="sy0">,</span><span class="st_h">'stats_rand_gen_exponential'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_rand_gen_f'</span><span class="sy0">,</span><span class="st_h">'stats_rand_gen_funiform'</span><span class="sy0">,</span><span class="st_h">'stats_rand_gen_gamma'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_rand_gen_ipoisson'</span><span class="sy0">,</span><span class="st_h">'stats_rand_gen_iuniform'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_rand_gen_noncenral_f'</span><span class="sy0">,</span><span class="st_h">'stats_rand_gen_noncentral_chisquare'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_rand_gen_noncentral_t'</span><span class="sy0">,</span><span class="st_h">'stats_rand_gen_normal'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_rand_gen_t'</span><span class="sy0">,</span><span class="st_h">'stats_rand_getsd'</span><span class="sy0">,</span><span class="st_h">'stats_rand_ibinomial'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_rand_ibinomial_negative'</span><span class="sy0">,</span><span class="st_h">'stats_rand_ignlgi'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_rand_phrase_to_seeds'</span><span class="sy0">,</span><span class="st_h">'stats_rand_ranf'</span><span class="sy0">,</span><span class="st_h">'stats_rand_setall'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_skew'</span><span class="sy0">,</span><span class="st_h">'stats_standard_deviation'</span><span class="sy0">,</span><span class="st_h">'stats_stat_binomial_coef'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_stat_correlation'</span><span class="sy0">,</span><span class="st_h">'stats_stat_factorial'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_stat_independent_t'</span><span class="sy0">,</span><span class="st_h">'stats_stat_innerproduct'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_stat_paired_t'</span><span class="sy0">,</span><span class="st_h">'stats_stat_percentile'</span><span class="sy0">,</span><span class="st_h">'stats_stat_powersum'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stats_variance'</span><span class="sy0">,</span><span class="st_h">'strcasecmp'</span><span class="sy0">,</span><span class="st_h">'strchr'</span><span class="sy0">,</span><span class="st_h">'strcmp'</span><span class="sy0">,</span><span class="st_h">'strcoll'</span><span class="sy0">,</span><span class="st_h">'strcspn'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_bucket_append'</span><span class="sy0">,</span><span class="st_h">'stream_bucket_make_writeable'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_bucket_new'</span><span class="sy0">,</span><span class="st_h">'stream_bucket_prepend'</span><span class="sy0">,</span><span class="st_h">'stream_context_create'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_context_get_default'</span><span class="sy0">,</span><span class="st_h">'stream_context_get_options'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_context_set_default'</span><span class="sy0">,</span><span class="st_h">'stream_context_set_option'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_context_set_params'</span><span class="sy0">,</span><span class="st_h">'stream_copy_to_stream'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_encoding'</span><span class="sy0">,</span><span class="st_h">'stream_filter_append'</span><span class="sy0">,</span><span class="st_h">'stream_filter_prepend'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_filter_register'</span><span class="sy0">,</span><span class="st_h">'stream_filter_remove'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_get_contents'</span><span class="sy0">,</span><span class="st_h">'stream_get_filters'</span><span class="sy0">,</span><span class="st_h">'stream_get_line'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_get_meta_data'</span><span class="sy0">,</span><span class="st_h">'stream_get_transports'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_get_wrappers'</span><span class="sy0">,</span><span class="st_h">'stream_is_local'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_notification_callback'</span><span class="sy0">,</span><span class="st_h">'stream_register_wrapper'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_resolve_include_path'</span><span class="sy0">,</span><span class="st_h">'stream_select'</span><span class="sy0">,</span><span class="st_h">'stream_set_blocking'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_set_timeout'</span><span class="sy0">,</span><span class="st_h">'stream_set_write_buffer'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_socket_accept'</span><span class="sy0">,</span><span class="st_h">'stream_socket_client'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_socket_enable_crypto'</span><span class="sy0">,</span><span class="st_h">'stream_socket_get_name'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_socket_pair'</span><span class="sy0">,</span><span class="st_h">'stream_socket_recvfrom'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_socket_sendto'</span><span class="sy0">,</span><span class="st_h">'stream_socket_server'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_socket_shutdown'</span><span class="sy0">,</span><span class="st_h">'stream_supports_lock'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_wrapper_register'</span><span class="sy0">,</span><span class="st_h">'stream_wrapper_restore'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stream_wrapper_unregister'</span><span class="sy0">,</span><span class="st_h">'strftime'</span><span class="sy0">,</span><span class="st_h">'stripcslashes'</span><span class="sy0">,</span><span class="st_h">'stripos'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'stripslashes'</span><span class="sy0">,</span><span class="st_h">'strip_tags'</span><span class="sy0">,</span><span class="st_h">'stristr'</span><span class="sy0">,</span><span class="st_h">'strlen'</span><span class="sy0">,</span><span class="st_h">'strnatcasecmp'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'strnatcmp'</span><span class="sy0">,</span><span class="st_h">'strpbrk'</span><span class="sy0">,</span><span class="st_h">'strncasecmp'</span><span class="sy0">,</span><span class="st_h">'strncmp'</span><span class="sy0">,</span><span class="st_h">'strpos'</span><span class="sy0">,</span><span class="st_h">'strrchr'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'strrev'</span><span class="sy0">,</span><span class="st_h">'strripos'</span><span class="sy0">,</span><span class="st_h">'strrpos'</span><span class="sy0">,</span><span class="st_h">'strspn'</span><span class="sy0">,</span><span class="st_h">'strstr'</span><span class="sy0">,</span><span class="st_h">'strtok'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'strtolower'</span><span class="sy0">,</span><span class="st_h">'strtotime'</span><span class="sy0">,</span><span class="st_h">'strtoupper'</span><span class="sy0">,</span><span class="st_h">'strtr'</span><span class="sy0">,</span><span class="st_h">'strval'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'str_ireplace'</span><span class="sy0">,</span><span class="st_h">'str_pad'</span><span class="sy0">,</span><span class="st_h">'str_repeat'</span><span class="sy0">,</span><span class="st_h">'str_replace'</span><span class="sy0">,</span><span class="st_h">'str_rot13'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'str_split'</span><span class="sy0">,</span><span class="st_h">'str_shuffle'</span><span class="sy0">,</span><span class="st_h">'str_word_count'</span><span class="sy0">,</span><span class="st_h">'substr'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'substr_compare'</span><span class="sy0">,</span><span class="st_h">'substr_count'</span><span class="sy0">,</span><span class="st_h">'substr_replace'</span><span class="sy0">,</span><span class="st_h">'svn_add'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_auth_get_parameter'</span><span class="sy0">,</span><span class="st_h">'svn_auth_set_parameter'</span><span class="sy0">,</span><span class="st_h">'svn_cat'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_checkout'</span><span class="sy0">,</span><span class="st_h">'svn_cleanup'</span><span class="sy0">,</span><span class="st_h">'svn_client_version'</span><span class="sy0">,</span><span class="st_h">'svn_commit'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_diff'</span><span class="sy0">,</span><span class="st_h">'svn_export'</span><span class="sy0">,</span><span class="st_h">'svn_fs_abort_txn'</span><span class="sy0">,</span><span class="st_h">'svn_fs_apply_text'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_fs_begin_txn2'</span><span class="sy0">,</span><span class="st_h">'svn_fs_change_node_prop'</span><span class="sy0">,</span><span class="st_h">'svn_fs_check_path'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_fs_contents_changed'</span><span class="sy0">,</span><span class="st_h">'svn_fs_copy'</span><span class="sy0">,</span><span class="st_h">'svn_fs_delete'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_fs_dir_entries'</span><span class="sy0">,</span><span class="st_h">'svn_fs_file_contents'</span><span class="sy0">,</span><span class="st_h">'svn_fs_file_length'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_fs_is_dir'</span><span class="sy0">,</span><span class="st_h">'svn_fs_is_file'</span><span class="sy0">,</span><span class="st_h">'svn_fs_make_dir'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_fs_make_file'</span><span class="sy0">,</span><span class="st_h">'svn_fs_node_created_rev'</span><span class="sy0">,</span><span class="st_h">'svn_fs_node_prop'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_fs_props_changed'</span><span class="sy0">,</span><span class="st_h">'svn_fs_revision_prop'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_fs_revision_root'</span><span class="sy0">,</span><span class="st_h">'svn_fs_txn_root'</span><span class="sy0">,</span><span class="st_h">'svn_fs_youngest_rev'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_import'</span><span class="sy0">,</span><span class="st_h">'svn_info'</span><span class="sy0">,</span><span class="st_h">'svn_log'</span><span class="sy0">,</span><span class="st_h">'svn_ls'</span><span class="sy0">,</span><span class="st_h">'svn_repos_create'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_repos_fs'</span><span class="sy0">,</span><span class="st_h">'svn_repos_fs_begin_txn_for_commit'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_repos_fs_commit_txn'</span><span class="sy0">,</span><span class="st_h">'svn_repos_hotcopy'</span><span class="sy0">,</span><span class="st_h">'svn_repos_open'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'svn_repos_recover'</span><span class="sy0">,</span><span class="st_h">'svn_status'</span><span class="sy0">,</span><span class="st_h">'svn_update'</span><span class="sy0">,</span><span class="st_h">'symlink'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'sys_get_temp_dir'</span><span class="sy0">,</span><span class="st_h">'syslog'</span><span class="sy0">,</span><span class="st_h">'system'</span><span class="sy0">,</span><span class="st_h">'tan'</span><span class="sy0">,</span><span class="st_h">'tanh'</span><span class="sy0">,</span><span class="st_h">'tempnam'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'textdomain'</span><span class="sy0">,</span><span class="st_h">'thread_get'</span><span class="sy0">,</span><span class="st_h">'thread_include'</span><span class="sy0">,</span><span class="st_h">'thread_lock'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'thread_lock_try'</span><span class="sy0">,</span><span class="st_h">'thread_mutex_destroy'</span><span class="sy0">,</span><span class="st_h">'thread_mutex_init'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'thread_set'</span><span class="sy0">,</span><span class="st_h">'thread_start'</span><span class="sy0">,</span><span class="st_h">'thread_unlock'</span><span class="sy0">,</span><span class="st_h">'tidy_access_count'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'tidy_clean_repair'</span><span class="sy0">,</span><span class="st_h">'tidy_config_count'</span><span class="sy0">,</span><span class="st_h">'tidy_diagnose'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'tidy_error_count'</span><span class="sy0">,</span><span class="st_h">'tidy_get_body'</span><span class="sy0">,</span><span class="st_h">'tidy_get_config'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'tidy_get_error_buffer'</span><span class="sy0">,</span><span class="st_h">'tidy_get_head'</span><span class="sy0">,</span><span class="st_h">'tidy_get_html'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'tidy_get_html_ver'</span><span class="sy0">,</span><span class="st_h">'tidy_get_output'</span><span class="sy0">,</span><span class="st_h">'tidy_get_release'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'tidy_get_root'</span><span class="sy0">,</span><span class="st_h">'tidy_get_status'</span><span class="sy0">,</span><span class="st_h">'tidy_getopt'</span><span class="sy0">,</span><span class="st_h">'tidy_is_xhtml'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'tidy_is_xml'</span><span class="sy0">,</span><span class="st_h">'tidy_parse_file'</span><span class="sy0">,</span><span class="st_h">'tidy_parse_string'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'tidy_repair_file'</span><span class="sy0">,</span><span class="st_h">'tidy_repair_string'</span><span class="sy0">,</span><span class="st_h">'tidy_warning_count'</span><span class="sy0">,</span><span class="st_h">'time'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'timezone_abbreviations_list'</span><span class="sy0">,</span><span class="st_h">'timezone_identifiers_list'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'timezone_name_from_abbr'</span><span class="sy0">,</span><span class="st_h">'timezone_name_get'</span><span class="sy0">,</span><span class="st_h">'timezone_offset_get'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'timezone_open'</span><span class="sy0">,</span><span class="st_h">'timezone_transitions_get'</span><span class="sy0">,</span><span class="st_h">'tmpfile'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'token_get_all'</span><span class="sy0">,</span><span class="st_h">'token_name'</span><span class="sy0">,</span><span class="st_h">'touch'</span><span class="sy0">,</span><span class="st_h">'trigger_error'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'transliterate'</span><span class="sy0">,</span><span class="st_h">'transliterate_filters_get'</span><span class="sy0">,</span><span class="st_h">'trim'</span><span class="sy0">,</span><span class="st_h">'uasort'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ucfirst'</span><span class="sy0">,</span><span class="st_h">'ucwords'</span><span class="sy0">,</span><span class="st_h">'uksort'</span><span class="sy0">,</span><span class="st_h">'umask'</span><span class="sy0">,</span><span class="st_h">'uniqid'</span><span class="sy0">,</span><span class="st_h">'unixtojd'</span><span class="sy0">,</span><span class="st_h">'unlink'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'unpack'</span><span class="sy0">,</span><span class="st_h">'unregister_tick_function'</span><span class="sy0">,</span><span class="st_h">'unserialize'</span><span class="sy0">,</span><span class="st_h">'unset'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'urldecode'</span><span class="sy0">,</span><span class="st_h">'urlencode'</span><span class="sy0">,</span><span class="st_h">'user_error'</span><span class="sy0">,</span><span class="st_h">'use_soap_error_handler'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'usleep'</span><span class="sy0">,</span><span class="st_h">'usort'</span><span class="sy0">,</span><span class="st_h">'utf8_decode'</span><span class="sy0">,</span><span class="st_h">'utf8_encode'</span><span class="sy0">,</span><span class="st_h">'var_dump'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'var_export'</span><span class="sy0">,</span><span class="st_h">'variant_abs'</span><span class="sy0">,</span><span class="st_h">'variant_add'</span><span class="sy0">,</span><span class="st_h">'variant_and'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'variant_cast'</span><span class="sy0">,</span><span class="st_h">'variant_cat'</span><span class="sy0">,</span><span class="st_h">'variant_cmp'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'variant_date_from_timestamp'</span><span class="sy0">,</span><span class="st_h">'variant_date_to_timestamp'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'variant_div'</span><span class="sy0">,</span><span class="st_h">'variant_eqv'</span><span class="sy0">,</span><span class="st_h">'variant_fix'</span><span class="sy0">,</span><span class="st_h">'variant_get_type'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'variant_idiv'</span><span class="sy0">,</span><span class="st_h">'variant_imp'</span><span class="sy0">,</span><span class="st_h">'variant_int'</span><span class="sy0">,</span><span class="st_h">'variant_mod'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'variant_mul'</span><span class="sy0">,</span><span class="st_h">'variant_neg'</span><span class="sy0">,</span><span class="st_h">'variant_not'</span><span class="sy0">,</span><span class="st_h">'variant_or'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'variant_pow'</span><span class="sy0">,</span><span class="st_h">'variant_round'</span><span class="sy0">,</span><span class="st_h">'variant_set'</span><span class="sy0">,</span><span class="st_h">'variant_set_type'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'variant_sub'</span><span class="sy0">,</span><span class="st_h">'variant_xor'</span><span class="sy0">,</span><span class="st_h">'version_compare'</span><span class="sy0">,</span><span class="st_h">'virtual'</span><span class="sy0">,</span><span class="st_h">'vfprintf'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'vprintf'</span><span class="sy0">,</span><span class="st_h">'vsprintf'</span><span class="sy0">,</span><span class="st_h">'wddx_add_vars'</span><span class="sy0">,</span><span class="st_h">'wddx_deserialize'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'wddx_packet_end'</span><span class="sy0">,</span><span class="st_h">'wddx_packet_start'</span><span class="sy0">,</span><span class="st_h">'wddx_serialize_value'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'wddx_serialize_vars'</span><span class="sy0">,</span><span class="st_h">'win_beep'</span><span class="sy0">,</span><span class="st_h">'win_browse_file'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'win_browse_folder'</span><span class="sy0">,</span><span class="st_h">'win_create_link'</span><span class="sy0">,</span><span class="st_h">'win_message_box'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'win_play_wav'</span><span class="sy0">,</span><span class="st_h">'win_shell_execute'</span><span class="sy0">,</span><span class="st_h">'win32_create_service'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'win32_delete_service'</span><span class="sy0">,</span><span class="st_h">'win32_get_last_control_message'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'win32_ps_list_procs'</span><span class="sy0">,</span><span class="st_h">'win32_ps_stat_mem'</span><span class="sy0">,</span><span class="st_h">'win32_ps_stat_proc'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'win32_query_service_status'</span><span class="sy0">,</span><span class="st_h">'win32_scheduler_delete_task'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'win32_scheduler_enum_tasks'</span><span class="sy0">,</span><span class="st_h">'win32_scheduler_get_task_info'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'win32_scheduler_run'</span><span class="sy0">,</span><span class="st_h">'win32_scheduler_set_task_info'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'win32_set_service_status'</span><span class="sy0">,</span><span class="st_h">'win32_start_service'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'win32_start_service_ctrl_dispatcher'</span><span class="sy0">,</span><span class="st_h">'win32_stop_service'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'wordwrap'</span><span class="sy0">,</span><span class="st_h">'xml_error_string'</span><span class="sy0">,</span><span class="st_h">'xml_get_current_byte_index'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_get_current_column_number'</span><span class="sy0">,</span><span class="st_h">'xml_get_current_line_number'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_get_error_code'</span><span class="sy0">,</span><span class="st_h">'xml_parse'</span><span class="sy0">,</span><span class="st_h">'xml_parser_create'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_parser_create_ns'</span><span class="sy0">,</span><span class="st_h">'xml_parser_free'</span><span class="sy0">,</span><span class="st_h">'xml_parser_get_option'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_parser_set_option'</span><span class="sy0">,</span><span class="st_h">'xml_parse_into_struct'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_character_data_handler'</span><span class="sy0">,</span><span class="st_h">'xml_set_default_handler'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_element_handler'</span><span class="sy0">,</span><span class="st_h">'xml_set_end_namespace_decl_handler'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_external_entity_ref_handler'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_notation_decl_handler'</span><span class="sy0">,</span><span class="st_h">'xml_set_object'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_processing_instruction_handler'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_start_namespace_decl_handler'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_unparsed_entity_decl_handler'</span><span class="sy0">,</span><span class="st_h">'xmldoc'</span><span class="sy0">,</span><span class="st_h">'xmldocfile'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlrpc_decode'</span><span class="sy0">,</span><span class="st_h">'xmlrpc_decode_request'</span><span class="sy0">,</span><span class="st_h">'xmlrpc_encode'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlrpc_encode_request'</span><span class="sy0">,</span><span class="st_h">'xmlrpc_get_type'</span><span class="sy0">,</span><span class="st_h">'xmlrpc_is_fault'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlrpc_parse_method_descriptions'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlrpc_server_add_introspection_data'</span><span class="sy0">,</span><span class="st_h">'xmlrpc_server_call_method'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlrpc_server_create'</span><span class="sy0">,</span><span class="st_h">'xmlrpc_server_destroy'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlrpc_server_register_introspection_callback'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlrpc_server_register_method'</span><span class="sy0">,</span><span class="st_h">'xmlrpc_set_type'</span><span class="sy0">,</span><span class="st_h">'xmltree'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_end_attribute'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_end_cdata'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_end_comment'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_end_document'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_end_dtd'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_end_dtd_attlist'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_end_dtd_element'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_end_dtd_entity'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_end_element'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_end_pi'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_flush'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_full_end_element'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_open_memory'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_open_uri'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_output_memory'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_set_indent'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_set_indent_string'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_start_attribute'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_start_attribute_ns'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_start_cdata'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_start_comment'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_start_document'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_start_dtd'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_start_dtd_attlist'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_start_dtd_element'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_start_dtd_entity'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_start_element'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_start_element_ns'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_start_pi'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_text'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_write_attribute'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_write_attribute_ns'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_write_cdata'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_write_comment'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_write_dtd'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_write_dtd_attlist'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_write_dtd_element'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_write_dtd_entity'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_write_element'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_write_element_ns'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xmlwriter_write_pi'</span><span class="sy0">,</span><span class="st_h">'xmlwriter_write_raw'</span><span class="sy0">,</span><span class="st_h">'xpath_eval'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xpath_eval_expression'</span><span class="sy0">,</span><span class="st_h">'xpath_new_context'</span><span class="sy0">,</span><span class="st_h">'xpath_register_ns'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xpath_register_ns_auto'</span><span class="sy0">,</span><span class="st_h">'xptr_eval'</span><span class="sy0">,</span><span class="st_h">'xptr_new_context'</span><span class="sy0">,</span><span class="st_h">'yp_all'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'yp_cat'</span><span class="sy0">,</span><span class="st_h">'yp_errno'</span><span class="sy0">,</span><span class="st_h">'yp_err_string'</span><span class="sy0">,</span><span class="st_h">'yp_first'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'yp_get_default_domain'</span><span class="sy0">,</span><span class="st_h">'yp_master'</span><span class="sy0">,</span><span class="st_h">'yp_match'</span><span class="sy0">,</span><span class="st_h">'yp_next'</span><span class="sy0">,</span><span class="st_h">'yp_order'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'zend_current_obfuscation_level'</span><span class="sy0">,</span><span class="st_h">'zend_get_cfg_var'</span><span class="sy0">,</span><span class="st_h">'zend_get_id'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'zend_loader_current_file'</span><span class="sy0">,</span><span class="st_h">'zend_loader_enabled'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'zend_loader_file_encoded'</span><span class="sy0">,</span><span class="st_h">'zend_loader_file_licensed'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'zend_loader_install_license'</span><span class="sy0">,</span><span class="st_h">'zend_loader_version'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'zend_logo_guid'</span><span class="sy0">,</span><span class="st_h">'zend_match_hostmasks'</span><span class="sy0">,</span><span class="st_h">'zend_obfuscate_class_name'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'zend_obfuscate_function_name'</span><span class="sy0">,</span><span class="st_h">'zend_optimizer_version'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'zend_runtime_obfuscate'</span><span class="sy0">,</span><span class="st_h">'zend_version'</span><span class="sy0">,</span><span class="st_h">'zip_close'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'zip_entry_close'</span><span class="sy0">,</span><span class="st_h">'zip_entry_compressedsize'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'zip_entry_compressionmethod'</span><span class="sy0">,</span><span class="st_h">'zip_entry_filesize'</span><span class="sy0">,</span><span class="st_h">'zip_entry_name'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'zip_entry_open'</span><span class="sy0">,</span><span class="st_h">'zip_entry_read'</span><span class="sy0">,</span><span class="st_h">'zip_open'</span><span class="sy0">,</span><span class="st_h">'zip_read'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'zlib_get_coding_type'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'DEFAULT_INCLUDE_PATH'</span><span class="sy0">,</span> <span class="st_h">'DIRECTORY_SEPARATOR'</span><span class="sy0">,</span> <span class="st_h">'E_ALL'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'E_COMPILE_ERROR'</span><span class="sy0">,</span> <span class="st_h">'E_COMPILE_WARNING'</span><span class="sy0">,</span> <span class="st_h">'E_CORE_ERROR'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'E_CORE_WARNING'</span><span class="sy0">,</span> <span class="st_h">'E_ERROR'</span><span class="sy0">,</span> <span class="st_h">'E_NOTICE'</span><span class="sy0">,</span> <span class="st_h">'E_PARSE'</span><span class="sy0">,</span> <span class="st_h">'E_STRICT'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'E_USER_ERROR'</span><span class="sy0">,</span> <span class="st_h">'E_USER_NOTICE'</span><span class="sy0">,</span> <span class="st_h">'E_USER_WARNING'</span><span class="sy0">,</span> <span class="st_h">'E_WARNING'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ENT_COMPAT'</span><span class="sy0">,</span><span class="st_h">'ENT_QUOTES'</span><span class="sy0">,</span><span class="st_h">'ENT_NOQUOTES'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'false'</span><span class="sy0">,</span> <span class="st_h">'null'</span><span class="sy0">,</span> <span class="st_h">'PEAR_EXTENSION_DIR'</span><span class="sy0">,</span> <span class="st_h">'PEAR_INSTALL_DIR'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'PHP_BINDIR'</span><span class="sy0">,</span> <span class="st_h">'PHP_CONFIG_FILE_PATH'</span><span class="sy0">,</span> <span class="st_h">'PHP_DATADIR'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'PHP_EXTENSION_DIR'</span><span class="sy0">,</span> <span class="st_h">'PHP_LIBDIR'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'PHP_LOCALSTATEDIR'</span><span class="sy0">,</span> <span class="st_h">'PHP_OS'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'PHP_OUTPUT_HANDLER_CONT'</span><span class="sy0">,</span> <span class="st_h">'PHP_OUTPUT_HANDLER_END'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'PHP_OUTPUT_HANDLER_START'</span><span class="sy0">,</span> <span class="st_h">'PHP_SYSCONFDIR'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'PHP_VERSION'</span><span class="sy0">,</span> <span class="st_h">'true'</span><span class="sy0">,</span> <span class="st_h">'__CLASS__'</span><span class="sy0">,</span> <span class="st_h">'__FILE__'</span><span class="sy0">,</span> <span class="st_h">'__FUNCTION__'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'__LINE__'</span><span class="sy0">,</span> <span class="st_h">'__METHOD__'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'SYMBOLS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'&lt;'</span><span class="sy0">.</span><span class="st_h">'%'</span><span class="sy0">,</span> <span class="st_h">'&lt;'</span><span class="sy0">.</span><span class="st_h">'%='</span><span class="sy0">,</span> <span class="st_h">'%'</span><span class="sy0">.</span><span class="st_h">'&gt;'</span><span class="sy0">,</span> <span class="st_h">'&lt;'</span><span class="sy0">.</span><span class="st_h">'?'</span><span class="sy0">,</span> <span class="st_h">'&lt;'</span><span class="sy0">.</span><span class="st_h">'?='</span><span class="sy0">,</span> <span class="st_h">'?'</span><span class="sy0">.</span><span class="st_h">'&gt;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'('</span><span class="sy0">,</span> <span class="st_h">')'</span><span class="sy0">,</span> <span class="st_h">'['</span><span class="sy0">,</span> <span class="st_h">']'</span><span class="sy0">,</span> <span class="st_h">'{'</span><span class="sy0">,</span> <span class="st_h">'}'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'!'</span><span class="sy0">,</span> <span class="st_h">'@'</span><span class="sy0">,</span> <span class="st_h">'%'</span><span class="sy0">,</span> <span class="st_h">'&amp;'</span><span class="sy0">,</span> <span class="st_h">'|'</span><span class="sy0">,</span> <span class="st_h">'/'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'&lt;'</span><span class="sy0">,</span> <span class="st_h">'&gt;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'='</span><span class="sy0">,</span> <span class="st_h">'-'</span><span class="sy0">,</span> <span class="st_h">'+'</span><span class="sy0">,</span> <span class="st_h">'*'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'.'</span><span class="sy0">,</span> <span class="st_h">':'</span><span class="sy0">,</span> <span class="st_h">','</span><span class="sy0">,</span> <span class="st_h">';'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'CASE_SENSITIVE'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; GESHI_COMMENTS <span class="sy0">=&gt;</span> <span class="kw4">false</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="kw4">false</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="kw4">false</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <span class="kw4">false</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <span class="kw4">false</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'STYLES'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'KEYWORDS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #b1b100;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #000000; font-weight: bold;'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #990000;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #009900; font-weight: bold;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'COMMENTS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #666666; font-style: italic;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #666666; font-style: italic;'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #0000cc; font-style: italic;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #009933; font-style: italic;'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'MULTI'</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #666666; font-style: italic;'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ESCAPE_CHAR'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #000099; font-weight: bold;'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #000099; font-weight: bold;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #660099; font-weight: bold;'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #660099; font-weight: bold;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #006699; font-weight: bold;'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">5</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #006699; font-weight: bold; font-style: italic;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">6</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #009933; font-weight: bold;'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'HARD'</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #000099; font-weight: bold;'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'BRACKETS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #009900;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'STRINGS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #0000ff;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'HARD'</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #0000ff;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'NUMBERS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #cc66cc;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GESHI_NUMBER_OCT_PREFIX <span class="sy0">=&gt;</span> <span class="st_h">'color: #208080;'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GESHI_NUMBER_HEX_PREFIX <span class="sy0">=&gt;</span> <span class="st_h">'color: #208080;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GESHI_NUMBER_FLT_SCI_ZERO <span class="sy0">=&gt;</span> <span class="st_h">'color:#800080;'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'METHODS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #004000;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #004000;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'SYMBOLS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #339933;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #000000; font-weight: bold;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'REGEXPS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #000088;'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'SCRIPT'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">5</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'URLS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <span class="st_h">'http://www.php.net/{FNAMEL}'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'OOLANG'</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'OBJECT_SPLITTERS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">'-&amp;gt;'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st_h">'::'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'REGEXPS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Variables</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;[<span class="es1">\\</span>$]+[a-zA-Z_<span class="es2">\x7f</span>-<span class="es2">\xff</span>][a-zA-Z0-9_<span class="es2">\x7f</span>-<span class="es2">\xff</span>]*&quot;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'STRICT_MODE_APPLIES'</span> <span class="sy0">=&gt;</span> GESHI_MAYBE<span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'SCRIPT_DELIMITERS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'&lt;'</span><span class="sy0">.</span><span class="st_h">'?php'</span> <span class="sy0">=&gt;</span> <span class="st_h">'?'</span><span class="sy0">.</span><span class="st_h">'&gt;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'&lt;'</span><span class="sy0">.</span><span class="st_h">'?'</span> <span class="sy0">=&gt;</span> <span class="st_h">'?'</span><span class="sy0">.</span><span class="st_h">'&gt;'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'&lt;'</span><span class="sy0">.</span><span class="st_h">'%'</span> <span class="sy0">=&gt;</span> <span class="st_h">'%'</span><span class="sy0">.</span><span class="st_h">'&gt;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'&lt;script language=&quot;php&quot;&gt;'</span> <span class="sy0">=&gt;</span> <span class="st_h">'&lt;/script&gt;'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;/(?P&lt;start&gt;&lt;<span class="es1">\\</span>?(?&gt;php\b)?)(?:&quot;</span><span class="sy0">.</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;(?&gt;[^<span class="es1">\&quot;</span>'?<span class="es1">\\</span>/&lt;]+)|&quot;</span><span class="sy0">.</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;<span class="es1">\\</span>?(?!&gt;)|&quot;</span><span class="sy0">.</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;(?&gt;'(?&gt;[^'<span class="es1">\\</span><span class="es1">\\</span>]|<span class="es1">\\</span><span class="es1">\\</span>'|<span class="es1">\\</span><span class="es1">\\</span><span class="es1">\\</span>\|<span class="es1">\\</span><span class="es1">\\</span>)*')|&quot;</span><span class="sy0">.</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;(?&gt;<span class="es1">\&quot;</span>(?&gt;[^<span class="es1">\&quot;</span><span class="es1">\\</span><span class="es1">\\</span>]|<span class="es1">\\</span><span class="es1">\\</span><span class="es1">\&quot;</span>|<span class="es1">\\</span><span class="es1">\\</span><span class="es1">\\</span><span class="es1">\\</span>|<span class="es1">\\</span><span class="es1">\\</span>)*<span class="es1">\&quot;</span>)|&quot;</span><span class="sy0">.</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;(?&gt;<span class="es1">\\</span>/<span class="es1">\\</span>*(?&gt;[^<span class="es1">\\</span>*]|(?!<span class="es1">\\</span>*<span class="es1">\\</span>/)<span class="es1">\\</span>*)*<span class="es1">\\</span>*<span class="es1">\\</span>/)|&quot;</span><span class="sy0">.</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;<span class="es1">\\</span>/<span class="es1">\\</span>/(?&gt;.*?(?:<span class="es1">\\</span>?&gt;|$))|&quot;</span><span class="sy0">.</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;#(?&gt;.*?(?:<span class="es1">\\</span>?&gt;|$))|&quot;</span><span class="sy0">.</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;<span class="es1">\\</span>/(?=[^*<span class="es1">\\</span>/])|&quot;</span><span class="sy0">.</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;&lt;(?!&lt;&lt;)|&quot;</span><span class="sy0">.</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;&lt;&lt;&lt;(?P&lt;phpdoc&gt;\w+)\s.*?\s\k&lt;phpdoc&gt;&quot;</span><span class="sy0">.</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;)*?(?P&lt;end&gt;<span class="es1">\\</span>?&gt;|\Z)/sm&quot;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">5</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;/(?P&lt;start&gt;&lt;%)(?:&quot;</span><span class="sy0">.</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;(?&gt;[^<span class="es1">\&quot;</span>'%<span class="es1">\\</span>/&lt;]+)|&quot;</span><span class="sy0">.</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;%(?!&gt;)|&quot;</span><span class="sy0">.</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;(?&gt;'(?&gt;[^'<span class="es1">\\</span><span class="es1">\\</span>]|<span class="es1">\\</span><span class="es1">\\</span>'|<span class="es1">\\</span><span class="es1">\\</span><span class="es1">\\</span>\|<span class="es1">\\</span><span class="es1">\\</span>)*')|&quot;</span><span class="sy0">.</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;(?&gt;<span class="es1">\&quot;</span>(?&gt;[^<span class="es1">\\</span><span class="es1">\&quot;</span><span class="es1">\\</span><span class="es1">\\</span>]|<span class="es1">\\</span><span class="es1">\\</span><span class="es1">\&quot;</span>|<span class="es1">\\</span><span class="es1">\\</span><span class="es1">\\</span><span class="es1">\\</span>|<span class="es1">\\</span><span class="es1">\\</span>)*<span class="es1">\&quot;</span>)|&quot;</span><span class="sy0">.</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;(?&gt;<span class="es1">\\</span>/<span class="es1">\\</span>*(?&gt;[^<span class="es1">\\</span>*]|(?!<span class="es1">\\</span>*<span class="es1">\\</span>/)<span class="es1">\\</span>*)*<span class="es1">\\</span>*<span class="es1">\\</span>/)|&quot;</span><span class="sy0">.</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;<span class="es1">\\</span>/<span class="es1">\\</span>/(?&gt;.*?(?:%&gt;|$))|&quot;</span><span class="sy0">.</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;#(?&gt;.*?(?:%&gt;|$))|&quot;</span><span class="sy0">.</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;<span class="es1">\\</span>/(?=[^*<span class="es1">\\</span>/])|&quot;</span><span class="sy0">.</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;&lt;(?!&lt;&lt;)|&quot;</span><span class="sy0">.</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;&lt;&lt;&lt;(?P&lt;phpdoc&gt;\w+)\s.*?\s\k&lt;phpdoc&gt;&quot;</span><span class="sy0">.</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;)*?(?P&lt;end&gt;%&gt;|\Z)/sm&quot;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'HIGHLIGHT_STRICT_BLOCK'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">5</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'TAB_WIDTH'</span> <span class="sy0">=&gt;</span> <span class="nu0">4</span></span></span><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="sy1">?&gt;</span></pre></td></tr></tbody></table>
+
+<p>If you&#8217;re remotely familiar with <abbr title="PHP: HTML Preprocessor">PHP</abbr> (or even if you&#8217;re not), you can see that all that a language file consists of is
+a glorified variable assignment. Easy! All a language file does is assign a variable <code class="highlighted php"><span class="re0">$language_data</span></code>. Though
+still, there&#8217;s a lot of indices to that array&#8230; but this section is here to break each index down and explain it to you.</p>
+
+<h3 id="language-file-conventions">4.2 Language File Conventions</h3><div class="nav"><a href="#language-file-example">Previous</a> | <a href="#language-files">Top</a> | <a href="#language-file-sections">Next</a></div>
+
+<p>There are several conventions that are used in language files. For ease of use and readability, your language
+files should obey the following rules:</p>
+
+<ul>
+<li><strong>Indentation is <em>4 spaces</em>, not tabs:</strong> Use spaces! as editors continiously screw up tabs there should be
+no tabs in your documents since it would look differently on every computer otherwise.</li>
+<li><strong>Strings are in single quotes:</strong> Every string in a language file should be in single quotes (&#8216;), unless you are
+specifying a single quote as a quotemark or escape character, in which case they can be in double quotes for
+readability; or if you are specifying a REGEXP (see below). This ensures that the language file can be loaded
+as fast as possible by <abbr title="PHP: HTML Preprocessor">PHP</abbr> as unnecessary parsing can be avoided.</li>
+<li><strong>Large arrays are multi-lined:</strong> An array with more than three or four values should be broken into multiple
+lines. In any case, lines should not be wider than a full-screen window (about 100 chars per line max).
+Don&#8217;t break the keywords arrays after every keyword.</li>
+<li><strong>Ending brackets for multi-lined arrays on a new line:</strong> Also with a comma after them, unless the array is
+the last one in a parent array. See the <abbr title="PHP: HTML Preprocessor">PHP</abbr> language file for examples of where to use commas.</li>
+<li><strong>Use <abbr title="Generic Syntax Highlighter">GeSHi</abbr>&#8217;s constants:</strong> For capatalisation, regular expressions etc. use the <abbr title="Generic Syntax Highlighter">GeSHi</abbr> constants, <em>not</em>
+their actual values.</li>
+<li><strong>Verbatim header format:</strong> Copy the file header verbatim from other language files and modify the values
+afterwards. Don&#8217;t try to invent own header formats, as your languages else will fail validation!</li>
+</ul>
+
+<p>There are more notes on each convention where it may appear in the language file sections below.</p>
+
+<h3 id="language-file-sections">4.3 Language File Sections</h3><div class="nav"><a href="#language-file-conventions">Previous</a> | <a href="#language-files">Top</a> | <a href="#language-file-header">Next</a></div>
+
+<p>This section will look at all the sections of a language file, and how they relate to the final highlighting result.</p>
+
+<h4 id="language-file-header">4.3.1 The Header</h4><div class="nav"><a href="#language-file-sections">Previous</a> | <a href="#language-file-sections">Top</a> | <a href="#language-file-start-indices">Next</a></div>
+
+<p>The <em>header</em> of a language file is the first lines with the big comment and the start of the variable
+<code class="highlighted php"><span class="re0">$language_data</span></code>:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span>13
+<span class="xtra li2"><span class="de2">14</span></span>15
+<span class="xtra li2"><span class="de2">16</span></span>17
+<span class="xtra li2"><span class="de2">18</span></span>19
+<span class="xtra li2"><span class="de2">20</span></span>21
+<span class="xtra li2"><span class="de2">22</span></span>23
+<span class="xtra li2"><span class="de2">24</span></span>25
+<span class="xtra li2"><span class="de2">26</span></span>27
+<span class="xtra li2"><span class="de2">28</span></span>29
+<span class="xtra li2"><span class="de2">30</span></span>31
+<span class="xtra li2"><span class="de2">32</span></span>33
+<span class="xtra li2"><span class="de2">34</span></span>35
+<span class="xtra li2"><span class="de2">36</span></span>37
+<span class="xtra li2"><span class="de2">38</span></span>39
+<span class="xtra li2"><span class="de2">40</span></span>41
+<span class="xtra li2"><span class="de2">42</span></span>43
+</pre></td><td class="de1"><pre class="de1"><span class="kw2">&lt;?php</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">/*************************************************************************************</span></span></span><span class="coMULTI">&nbsp;* &lt;name-of-language-file.php&gt;</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* ---------------------------------</span></span></span><span class="coMULTI">&nbsp;* Author: &lt;name&gt; (&lt;e-mail address&gt;)</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* Copyright: (c) 2008 &lt;name&gt; (&lt;website URL&gt;)</span></span></span><span class="coMULTI">&nbsp;* Release Version: &lt;GeSHi release&gt;</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* Date Started: &lt;date started&gt;</span></span></span><span class="coMULTI">&nbsp;*</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &lt;name-of-language&gt; language file for GeSHi.</span></span></span><span class="coMULTI">&nbsp;*</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &lt;any-comments...&gt;</span></span></span><span class="coMULTI">&nbsp;*</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* CHANGES</span></span></span><span class="coMULTI">&nbsp;* -------</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &lt;date-of-release&gt; (&lt;GeSHi release&gt;)</span></span></span><span class="coMULTI">&nbsp;* &nbsp;- &nbsp;First Release</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;*</span></span></span><span class="coMULTI">&nbsp;* TODO (updated &lt;date-of-release&gt;)</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* -------------------------</span></span></span><span class="coMULTI">&nbsp;* &lt;things-to-do&gt;</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;*</span></span></span><span class="coMULTI">&nbsp;*************************************************************************************</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;*</span></span></span><span class="coMULTI">&nbsp;* &nbsp; &nbsp; This file is part of GeSHi.</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;*</span></span></span><span class="coMULTI">&nbsp;* &nbsp; GeSHi is free software; you can redistribute it and/or modify</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &nbsp; it under the terms of the GNU General Public License as published by</span></span></span><span class="coMULTI">&nbsp;* &nbsp; the Free Software Foundation; either version 2 of the License, or</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &nbsp; (at your option) any later version.</span></span></span><span class="coMULTI">&nbsp;*</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &nbsp; GeSHi is distributed in the hope that it will be useful,</span></span></span><span class="coMULTI">&nbsp;* &nbsp; but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &nbsp; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. &nbsp;See the</span></span></span><span class="coMULTI">&nbsp;* &nbsp; GNU General Public License for more details.</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;*</span></span></span><span class="coMULTI">&nbsp;* &nbsp; You should have received a copy of the GNU General Public License</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;* &nbsp; along with GeSHi; if not, write to the Free Software</span></span></span><span class="coMULTI">&nbsp;* &nbsp; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA &nbsp;02111-1307 &nbsp;USA</span>
+<span class="xtra li2"><span class="de2"><span class="coMULTI">&nbsp;*</span></span></span><span class="coMULTI">&nbsp;************************************************************************************/</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="re0">$language_data</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a> <span class="br0">&#40;</span></pre></td></tr></tbody></table>
+
+<p>The parts in angle brackets are the parts that you change for your language file. <strong>Everything else <em>must</em> remain the same!</strong></p>
+
+<p>Here are the parts you should change:</p>
+
+<ul>
+<li><code>&lt;name-of-language-file.php&gt;</code> - This should become the name of your language file. Language file names are in
+lower case and contain only alphanumeric characters, dashes and underscores. Language files end with .php (which
+you should put with the name of your language file, eg language.php)</li>
+<li><code>&lt;name&gt;</code> - Your name, or alias.</li>
+<li><code>&lt;e-mail address&gt;</code> - Your e-mail address. If you want your language file included with <abbr title="Generic Syntax Highlighter">GeSHi</abbr> you <em>must</em>
+include an e-mail address that refers to an inbox controlled by you.</li>
+<li><code>&lt;website&gt;</code> - A URL of a website of yours (perhaps to a page that deals with your contribution to <abbr title="Generic Syntax Highlighter">GeSHi</abbr>, or
+your home page/blog)</li>
+<li><code>&lt;date-started&gt;</code> - The date you started working on the language file. If you can&#8217;t remember, guestimate.</li>
+<li><code>&lt;name-of-language&gt;</code> - The name of the language you made this language file for (probably similar to
+the language file name).</li>
+<li><code>&lt;any-comments&gt;</code> - Any comments you have to make about this language file, perhaps on where you got the keywords for,
+what dialect of the language this language file is for etc etc. If you don&#8217;t have any comments, remove the space for them.</li>
+<li><code>&lt;date-of-release</code> - The date you released the language file to the public. If you simply send it to me for inclusion
+in a new <abbr title="Generic Syntax Highlighter">GeSHi</abbr> and don&#8217;t release it, leave this blank, and I&#8217;ll replace it with the date of the <abbr title="Generic Syntax Highlighter">GeSHi</abbr> release that
+it is first added to.</li>
+<li><code>&lt;GeSHi release&gt;</code> - This is the version of the release that will contain the changes you made.
+So if you have version 1.0.8 of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> running this will be the next version to be released, e.g. 1.0.8.1.</li>
+</ul>
+
+<p>Everything should remain the same.</p>
+
+<p><strong>Also:</strong> I&#8217;m not sure about the copyright on a new language file. I&#8217;m not a lawyer, could someone contact me about
+whether the copyright for a new language file should be exclusivly the authors, or joint with me (if included in a
+<abbr title="Generic Syntax Highlighter">GeSHi</abbr> release)?</p>
+
+<h4 id="language-file-start-indices">4.3.2 The First Indices</h4><div class="nav"><a href="#language-file-header">Previous</a> | <a href="#language-file-sections">Top</a> | <a href="#language-file-keywords">Next</a></div>
+
+<p>Here is an example from the php language file of the first indices:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span></pre></td><td class="de1"><pre class="de1"><span class="st_h">'LANG_NAME'</span> <span class="sy0">=&gt;</span> <span class="st_h">'PHP'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2"><span class="st_h">'COMMENT_SINGLE'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">'//'</span><span class="sy0">,</span> <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st_h">'#'</span><span class="br0">&#41;</span><span class="sy0">,</span></span></span><span class="st_h">'COMMENT_MULTI'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'/*'</span> <span class="sy0">=&gt;</span> <span class="st_h">'*/'</span><span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2"><span class="st_h">'CASE_KEYWORDS'</span> <span class="sy0">=&gt;</span> GESHI_CAPS_NO_CHANGE<span class="sy0">,</span></span></span><span class="st_h">'QUOTEMARKS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st0">&quot;'&quot;</span><span class="sy0">,</span> <span class="st_h">'&quot;'</span><span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2"><span class="st_h">'ESCAPE_CHAR'</span> <span class="sy0">=&gt;</span> <span class="st_h">'\\'</span><span class="sy0">,</span></span></span></pre></td></tr></tbody></table>
+
+<p>The first indices are the first few lines of a language file before the KEYWORDS index. These indices specify:</p>
+
+<ul>
+<li><strong>&#8216;LANG_NAME&#8217;</strong>: The name of the language. This name should be a human-readable version of the name
+(e.g. <abbr title="Hypertext Markup Language">HTML</abbr> 4 (transitional) instead of html4trans)</li>
+<li><strong>&#8216;COMMENT_SINGLE&#8217;:</strong> An array of single-line comments in your language, indexed by integers starting
+from 1. A single line comment is a comment that starts at the marker and goes until the end of the line. These
+comments may be any length > 0, and since they can be styled individually, can be used for other things than comments
+(for example the Java language file defines &#8220;import&#8221; as a single line comment). If you are making a language that
+uses a &#8217; (apostrophe) as a comment (or in the comment marker somewhere), use double quotes. e.g.: &#8220;&#8217;&#8221;</li>
+<li><strong>&#8216;COMMENT_MULTI&#8217;:</strong> Used to specify multiline comments, an array in the form &#8216;OPEN&#8217; => &#8216;CLOSE&#8217;. Unfortunately,
+all of these comments you add here will be styled the same way (an area of improvement for <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.2.X).
+These comment markers may be any length > 0.</li>
+<li><strong>&#8216;CASE_KEYWORDS&#8217;:</strong> Used to set whether the case of keywords should be changed automatically as they are found.
+For example, in an SQL or BASIC dialect you may want all keywords to be upper case. The accepted values for this are:</li>
+<li><code>GESHI_CAPS_UPPER</code>: Convert the case of all keywords to upper case.</li>
+<li><code>GESHI_CAPS_LOWER</code>: Convert the case of all keywords to lower case.</li>
+<li><code>GESHI_CAPS_NO_CHANGE</code>: Don&#8217;t change the case of any keyword.</li>
+<li><strong>&#8216;QUOTEMARKS&#8217;:</strong> Specifies the characters that mark the beginning and end of a string. This is another example
+where if your language includes the &#8217; string delimiter you should use double quotes around it.</li>
+<li><strong>&#8216;ESCAPE_CHAR&#8217;:</strong> Specifies the escape character used in all strings. If your language does not have an escape
+character then make this the empty string (<code>''</code>). This is not an array! If found, any character after an
+escape character and the escape character itself will be highlighted differently, and the character after the
+escape character cannot end a string.</li>
+</ul>
+
+<p>In some language files you might see here other indices too, but those are dealt with later on.</p>
+
+<h4 id="language-file-keywords">4.3.3 Keywords</h4><div class="nav"><a href="#language-file-start-indices">Previous</a> | <a href="#language-file-sections">Top</a> | <a href="#language-file-symbols-case">Next</a></div>
+
+<p>Keywords will make up the bulk of a language file. In this part you add keywords for your language, including
+inbuilt functions, data types, predefined constants etc etc.</p>
+
+<p>Here&#8217;s a (shortened) example from the php language file:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span>13
+<span class="xtra li2"><span class="de2">14</span></span>15
+<span class="xtra li2"><span class="de2">16</span></span>17
+<span class="xtra li2"><span class="de2">18</span></span>19
+<span class="xtra li2"><span class="de2">20</span></span>21
+<span class="xtra li2"><span class="de2">22</span></span>23
+<span class="xtra li2"><span class="de2">24</span></span>25
+<span class="xtra li2"><span class="de2">26</span></span>27
+<span class="xtra li2"><span class="de2">28</span></span>29
+<span class="xtra li2"><span class="de2">30</span></span>31
+<span class="xtra li2"><span class="de2">32</span></span>33
+<span class="xtra li2"><span class="de2">34</span></span>35
+<span class="xtra li2"><span class="de2">36</span></span>37
+<span class="xtra li2"><span class="de2">38</span></span>39
+<span class="xtra li2"><span class="de2">40</span></span></pre></td><td class="de1"><pre class="de1"><span class="st_h">'KEYWORDS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'as'</span><span class="sy0">,</span> <span class="st_h">'break'</span><span class="sy0">,</span> <span class="st_h">'case'</span><span class="sy0">,</span> <span class="st_h">'do'</span><span class="sy0">,</span> <span class="st_h">'else'</span><span class="sy0">,</span> <span class="st_h">'elseif'</span><span class="sy0">,</span> <span class="st_h">'endif'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'endswitch'</span><span class="sy0">,</span> <span class="st_h">'endwhile'</span><span class="sy0">,</span> <span class="st_h">'for'</span><span class="sy0">,</span> <span class="st_h">'foreach'</span><span class="sy0">,</span> <span class="st_h">'if'</span><span class="sy0">,</span> <span class="st_h">'include'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'include_once'</span><span class="sy0">,</span> <span class="st_h">'require'</span><span class="sy0">,</span> <span class="st_h">'require_once'</span><span class="sy0">,</span> <span class="st_h">'return'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'switch'</span><span class="sy0">,</span> <span class="st_h">'while'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'&amp;lt;/script&gt;'</span><span class="sy0">,</span> <span class="st_h">'&amp;lt;?'</span><span class="sy0">,</span> <span class="st_h">'&amp;lt;?php'</span><span class="sy0">,</span> <span class="st_h">'&amp;lt;script language='</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'?&gt;'</span><span class="sy0">,</span> <span class="st_h">'class'</span><span class="sy0">,</span> <span class="st_h">'default'</span><span class="sy0">,</span> <span class="st_h">'DEFAULT_INCLUDE_PATH'</span><span class="sy0">,</span> <span class="st_h">'E_ALL'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'E_COMPILE_ERROR'</span><span class="sy0">,</span> <span class="st_h">'E_COMPILE_WARNING'</span><span class="sy0">,</span> <span class="st_h">'E_CORE_ERROR'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'E_CORE_WARNING'</span><span class="sy0">,</span> <span class="st_h">'E_ERROR'</span><span class="sy0">,</span> <span class="st_h">'E_NOTICE'</span><span class="sy0">,</span> <span class="st_h">'E_PARSE'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'E_USER_ERROR'</span><span class="sy0">,</span> <span class="st_h">'E_USER_NOTICE'</span><span class="sy0">,</span> <span class="st_h">'E_USER_WARNING'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'E_WARNING'</span><span class="sy0">,</span> <span class="st_h">'false'</span><span class="sy0">,</span> <span class="st_h">'function'</span><span class="sy0">,</span> <span class="st_h">'new'</span><span class="sy0">,</span> <span class="st_h">'null'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'PEAR_EXTENSION_DIR'</span><span class="sy0">,</span> <span class="st_h">'PEAR_INSTALL_DIR'</span><span class="sy0">,</span> <span class="st_h">'PHP_BINDIR'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'PHP_CONFIG_FILE_PATH'</span><span class="sy0">,</span> <span class="st_h">'PHP_DATADIR'</span><span class="sy0">,</span> <span class="st_h">'PHP_EXTENSION_DIR'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'PHP_LIBDIR'</span><span class="sy0">,</span> <span class="st_h">'PHP_LOCALSTATEDIR'</span><span class="sy0">,</span> <span class="st_h">'PHP_OS'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'PHP_OUTPUT_HANDLER_CONT'</span><span class="sy0">,</span> <span class="st_h">'PHP_OUTPUT_HANDLER_END'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'PHP_OUTPUT_HANDLER_START'</span><span class="sy0">,</span> <span class="st_h">'PHP_SYSCONFDIR'</span><span class="sy0">,</span> <span class="st_h">'PHP_VERSION'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'true'</span><span class="sy0">,</span> <span class="st_h">'var'</span><span class="sy0">,</span> <span class="st_h">'__CLASS__'</span><span class="sy0">,</span> <span class="st_h">'__FILE__'</span><span class="sy0">,</span> <span class="st_h">'__FUNCTION__'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'__LINE__'</span><span class="sy0">,</span> <span class="st_h">'__METHOD__'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_parser_create'</span><span class="sy0">,</span> <span class="st_h">'xml_parser_create_ns'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_parser_free'</span><span class="sy0">,</span> <span class="st_h">'xml_parser_get_option'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_parser_set_option'</span><span class="sy0">,</span> <span class="st_h">'xml_parse_into_struct'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_character_data_handler'</span><span class="sy0">,</span> <span class="st_h">'xml_set_default_handler'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_element_handler'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_end_namespace_decl_handler'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_external_entity_ref_handler'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_notation_decl_handler'</span><span class="sy0">,</span> <span class="st_h">'xml_set_object'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_processing_instruction_handler'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_start_namespace_decl_handler'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'xml_set_unparsed_entity_decl_handler'</span><span class="sy0">,</span> <span class="st_h">'yp_all'</span><span class="sy0">,</span> <span class="st_h">'yp_cat'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'yp_errno'</span><span class="sy0">,</span> <span class="st_h">'yp_err_string'</span><span class="sy0">,</span> <span class="st_h">'yp_first'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'yp_get_default_domain'</span><span class="sy0">,</span> <span class="st_h">'yp_master'</span><span class="sy0">,</span> <span class="st_h">'yp_match'</span><span class="sy0">,</span> <span class="st_h">'yp_next'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'yp_order'</span><span class="sy0">,</span> <span class="st_h">'zend_logo_guid'</span><span class="sy0">,</span> <span class="st_h">'zend_version'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'zlib_get_coding_type'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span></pre></td></tr></tbody></table>
+
+<p>You can see that the index &#8216;KEYWORDS&#8217; refers to an array of arrays, indexed by positive integers. In each array,
+there are some keywords (in the actual php language file there is in fact many more keywords in the array indexed by 3).
+Here are some points to note about these keywords:</p>
+
+<ul>
+<li><strong>Indexed by positive integers:</strong> Use nothing else! I may change this in 1.2.X, but for the 1.0.X series,
+use positive integers only. Using strings here results in unnecessary overhead degrading performance when
+highlighting code with your language file!</li>
+<li><strong>Keywords sorted ascending:</strong> Keywords <em>should</em> be sorted in <em>ascending</em> order. This is mainly for
+readability. An issue with versions before 1.0.8 has been solved, so the reverse sorting order
+is no longer required and should thus be avoided. <abbr title="Generic Syntax Highlighter">GeSHi</abbr> itself sorts the keywords internally when
+building some of its caches, so the order doesn&#8217;t matter, but makes things easier to read and maintain.</li>
+<li><strong>Keywords are case sensitive (sometimes):</strong> If your language is case-sensitive, the correct casing of the
+keywords is defined as the case of the keywords in these keyword arrays. If you check the java language file you
+will see that everything is in exact casing. So if any of these keyword arrays are case sensitive, put the
+keywords in as their correct case! (note that which groups are case sensitive and which are not is configurable,
+see later on). If a keyword group is case insensitive, put the lowercase version of the keyword here
+<strong>OR</strong> in case documentation links require a special casing (other than all lowercase or all uppercase)
+the casing required for them use their casing.</li>
+<li><strong>Keywords must be in <code class="highlighted php"><span class="kw3">htmlentities</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code> form:</strong> All keywords should be written as if they had been
+run through the php function <code class="highlighted php"><span class="kw3">htmlentities</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code>. E.g, the keyword is <code class="highlighted html4strict"><span class="sc1">&amp;lt;</span>foo<span class="sc1">&amp;gt;</span></code>, not
+<code class="highlighted html4strict"><span class="sc2">&lt;foo&gt;</span></code></li>
+<li><strong>Don&#8217;t use keywords to highlight symbols:</strong> Just don&#8217;t!!! It doesn&#8217;t work, and there is seperate support
+for symbols since <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.7.21.</li>
+<li><strong>Markup Languages are special cases:</strong> Check the html4strict language file for an example: You need to tweak
+the Parser control here to tell the surroundings of tagnames. In case of doubt, feel free to ask.</li>
+</ul>
+
+<h4 id="language-file-symbols-case">4.3.4 Symbols and Case Sensitivity</h4><div class="nav"><a href="#language-file-keywords">Previous</a> | <a href="#language-file-sections">Top</a> | <a href="#language-file-styles">Next</a></div>
+
+<p>So you&#8217;ve put all the keywords for your language in? Now for a breather before we style them :). Symbols define
+what symbols your language uses. These are things like colons, brackets/braces, and other such general punctuation.
+No alphanumeric stuff belongs here, just the same as no symbols belong into the keywords section.</p>
+
+<p>As of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> version 1.0.7.21 the symbols section can be used in two ways:</p>
+
+<dl>
+<dt>Flat usage:</dt>
+<dd>This mode is the suggested way for existing language files and languages that only need few symbols where no
+further differentiation is needed or desired. You simply put all the characters in an array under symbols as shown
+in the first example below. All symbols in flat usage belong to symbol style group 0.</dd>
+
+<dt>Group usage:</dt>
+<dd>This is a slightly more enhanced way to provide <abbr title="Generic Syntax Highlighter">GeSHi</abbr> symbol information. To use group you create several subarrays
+each containing only a subset of the symbols to highlight. Every array will need to have an unique index thus
+you can assign the appropriate styles later.</dd>
+</dl>
+
+<p>Here&#8217;s an example for flat symbol usage</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+</pre></td><td class="de1"><pre class="de1"><span class="st_h">'SYMBOLS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; <span class="st_h">'('</span><span class="sy0">,</span> <span class="st_h">')'</span><span class="sy0">,</span> <span class="st_h">'['</span><span class="sy0">,</span> <span class="st_h">']'</span><span class="sy0">,</span> <span class="st_h">'{'</span><span class="sy0">,</span> <span class="st_h">'}'</span><span class="sy0">,</span> <span class="st_h">'!'</span><span class="sy0">,</span> <span class="st_h">'@'</span><span class="sy0">,</span> <span class="st_h">'|'</span><span class="sy0">,</span> <span class="st_h">'&amp;'</span><span class="sy0">,</span> <span class="st_h">'+'</span><span class="sy0">,</span> <span class="st_h">'-'</span><span class="sy0">,</span> <span class="st_h">'*'</span><span class="sy0">,</span> <span class="st_h">'/'</span><span class="sy0">,</span> <span class="st_h">'%'</span><span class="sy0">,</span> <span class="st_h">'='</span><span class="sy0">,</span> <span class="st_h">'&lt;'</span><span class="sy0">,</span> <span class="st_h">'&gt;'</span></span></span><span class="br0">&#41;</span><span class="sy0">,</span></pre></td></tr></tbody></table>
+
+<p>which is not too different from the newly introduced group usage shown below:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span></pre></td><td class="de1"><pre class="de1"><span class="st_h">'SYMBOLS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'('</span><span class="sy0">,</span> <span class="st_h">')'</span><span class="sy0">,</span> <span class="st_h">'['</span><span class="sy0">,</span> <span class="st_h">']'</span><span class="sy0">,</span> <span class="st_h">'{'</span><span class="sy0">,</span> <span class="st_h">'}'</span><span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'!'</span><span class="sy0">,</span> <span class="st_h">'@'</span><span class="sy0">,</span> <span class="st_h">'|'</span><span class="sy0">,</span> <span class="st_h">'&amp;'</span><span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'+'</span><span class="sy0">,</span> <span class="st_h">'-'</span><span class="sy0">,</span> <span class="st_h">'*'</span><span class="sy0">,</span> <span class="st_h">'/'</span><span class="sy0">,</span> <span class="st_h">'%'</span><span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'='</span><span class="sy0">,</span> <span class="st_h">'&amp;lt;'</span><span class="sy0">,</span> <span class="st_h">'&gt;'</span><span class="br0">&#41;</span>
+<span class="xtra li2"><span class="de2"><span class="br0">&#41;</span><span class="sy0">,</span></span></span></pre></td></tr></tbody></table>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>Please note that versions before 1.0.7.21 will silently ignore this setting.</p>
+
+<p>Also note that <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.7.21 itself had some bugs in Symbol highlighting that could cause
+ heavily scrambled code output.</p>
+
+</div>
+
+<p>The following case sensitivity group alludes to the keywords section: here you can set which keyword groups are case sensitive.</p>
+
+<p>In the <strong>&#8216;CASE_SENSITIVE&#8217;</strong> group there&#8217;s a special key <code>GESHI_COMMENTS</code> which is used to set whether comments are
+case sensitive or not (for example, BASIC has the REM statement which while not being case sensitive is still alphanumeric, and
+as in the example given before about the Java language file using &#8220;import&#8221; as a single line comment, this can be
+useful sometimes. <strong>true</strong> if comments are case sensitive, <strong>false</strong> otherwise. All of the other indices
+correspond to indices in the <code>'KEYWORDS'</code> section (see above).</p>
+
+<h4 id="language-file-styles">4.3.5 Styles for your Language File</h4><div class="nav"><a href="#language-file-symbols-case">Previous</a> | <a href="#language-file-sections">Top</a> | <a href="#language-file-urls">Next</a></div>
+
+<p>This is the fun part! Here you get to choose the colours, fonts, backgrounds and anything else you&#8217;d like for your
+language file.</p>
+
+<p>Here&#8217;s an example:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span>13
+<span class="xtra li2"><span class="de2">14</span></span>15
+<span class="xtra li2"><span class="de2">16</span></span>17
+<span class="xtra li2"><span class="de2">18</span></span>19
+<span class="xtra li2"><span class="de2">20</span></span>21
+<span class="xtra li2"><span class="de2">22</span></span>23
+<span class="xtra li2"><span class="de2">24</span></span>25
+<span class="xtra li2"><span class="de2">26</span></span>27
+<span class="xtra li2"><span class="de2">28</span></span>29
+<span class="xtra li2"><span class="de2">30</span></span>31
+<span class="xtra li2"><span class="de2">32</span></span>33
+<span class="xtra li2"><span class="de2">34</span></span>35
+<span class="xtra li2"><span class="de2">36</span></span>37
+<span class="xtra li2"><span class="de2">38</span></span>39
+</pre></td><td class="de1"><pre class="de1"><span class="st_h">'STYLES'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'KEYWORDS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #b1b100;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #000000; font-weight: bold;'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #000066;'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'COMMENTS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #808080; font-style: italic;'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #808080; font-style: italic;'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'MULTI'</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #808080; font-style: italic;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'ESCAPE_CHAR'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #000099; font-weight: bold;'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'BRACKETS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #66cc66;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'STRINGS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #ff0000;'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'NUMBERS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #cc66cc;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'METHODS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #006600;'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'SYMBOLS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #66cc66;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="st_h">'REGEXPS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">'color: #0000ff;'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="st_h">'SCRIPT'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span></span></span>&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></pre></td></tr></tbody></table>
+
+<p>Note that all style rules should end with a semi-colon! This is important: <abbr title="Generic Syntax Highlighter">GeSHi</abbr> may add extra rules to the rules you
+specify (and will do so if a user tries to change your styles on the fly), so the last semi-colon in any stylesheet
+rule is important!</p>
+
+<p>All strings here should contain valid stylesheet declarations (it&#8217;s also fine to have the empty string).</p>
+
+<ul>
+<li><strong>&#8216;KEYWORDS&#8217;:</strong> This is an array, from keyword index to style. The index you use is the index you used in
+the keywords section to specify the keywords belonging to that group.</li>
+<li><strong>&#8216;COMMENTS&#8217;:</strong> This is an array, from single-line comment index to style for that index. The index &#8216;MULTI&#8217; is
+used for multiline comments (and cannot be an array). COMMENT_REGEXP use the style given for their key as
+if they were single-line comments.</li>
+<li><strong>&#8216;ESCAPE_CHAR&#8217;, &#8216;BRACKETS&#8217; and &#8216;METHODS&#8217;:</strong> These are arrays with only one index: 0. You cannot add other indices to
+these arrays.</li>
+<li><strong>&#8216;STRINGS&#8217;:</strong> This defines the various styles for the Quotemarks you defined earlier. If you don&#8217;t use
+multiple styles for strings there&#8217;s only one index: 0. Please also add this index in case no strings are present.</li>
+<li><strong>&#8216;NUMBERS&#8217;:</strong> This sets the styles used to highlight numbers. The format used here depends on the format used to
+set the formats of numbers to highlight. If you just used an integer (bitmask) for numbers, you have to either
+specify one key with the respective constant, and\or include a key 0 as a default style. If you used an
+array for the number markup, copy the keys used there and assign the styles accordingly.</li>
+<li><strong>&#8216;SYMBOLS&#8217;:</strong> This provides one key for each symbol group you defined above. If you used the flat usage
+make sure you include a key for symbols group 0.</li>
+<li><strong>&#8216;REGEXPS&#8217;:</strong> This is an array with a style for each matching regex. Also, since 1.0.7.21, you can specify the
+name of a function to be called, that will be given the text matched by the regex, each time a match is found.
+Note that my testing found that <code>create_function</code> would not work with this due to a <abbr title="PHP: HTML Preprocessor">PHP</abbr> bug, so you have to
+put the function definition at the top of the language file. Be sure to prefix the function name
+with <code>geshi_[languagename]_</code> as to not conflict with other functions!</li>
+<li><strong>&#8216;SCRIPT&#8217;:</strong> For languages that use script delimiters, this is where you can style each block of script. For
+example, <abbr title="Hypertext Markup Language">HTML</abbr> and <abbr title="Extensible Markup Language">XML</abbr> have blocks that begin with &lt; and end with > (i.e. tags) and blocks that begin with &amp; and
+end with&#160;; (i.e. character entities), and you can set a style to apply to each whole block. You specify the
+delimiters for the blocks below. Note that many languages will not need this feature.</li>
+</ul>
+
+<h4 id="language-file-urls">4.3.6 URLs for Functions</h4><div class="nav"><a href="#language-file-styles">Previous</a> | <a href="#language-file-sections">Top</a> | <a href="#language-file-numbers-support">Next</a></div>
+
+<p>This section lets you specify a url to visit for each keyword group. Useful for pointing functions at their online
+manual entries.</p>
+
+<p>Here is an example:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span></pre></td><td class="de1"><pre class="de1"><span class="st_h">'URLS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <span class="st_h">'http://www.php.net/{FNAME}'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span></pre></td></tr></tbody></table>
+
+<p>The indices of this array correspond to the keyword groups you specified in the keywords section. The string <code>{FNAME}</code>
+marks where the name of the function is substituted in. So for the example above, if the keyword being highlighted is
+&#8220;echo&#8221;, then the keyword will be a URL pointing to <code>http://www.php.net/echo</code>. Because some languages (Java!) don&#8217;t
+keep a uniform URL for functions/classes, you may have trouble in creating a URL for that language (though look in the
+java language file for a novel solution to it&#8217;s problem)</p>
+
+<h4 id="language-file-numbers-support">4.3.7 Number Highlighting Support</h4><div class="nav"><a href="#language-file-urls">Previous</a> | <a href="#language-file-sections">Top</a> | <a href="#language-file-oo-support">Next</a></div>
+
+<p>If your language supports different formats of numbers (e.g. integers and float representations) and you want
+<abbr title="Generic Syntax Highlighter">GeSHi</abbr> to handle them differently you can select from a set of predefined formats.</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span></pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="st_h">'NUMBERS'</span> <span class="sy0">=&gt;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; GESHI_NUMBER_INT_BASIC <span class="sy0">|</span> GESHI_NUMBER_INT_CSTYLE <span class="sy0">|</span> GESHI_NUMBER_BIN_PREFIX_0B <span class="sy0">|</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; GESHI_NUMBER_OCT_PREFIX <span class="sy0">|</span> GESHI_NUMBER_HEX_PREFIX <span class="sy0">|</span> GESHI_NUMBER_FLT_NONSCI <span class="sy0">|</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; GESHI_NUMBER_FLT_NONSCI_F <span class="sy0">|</span> GESHI_NUMBER_FLT_SCI_SHORT <span class="sy0">|</span> GESHI_NUMBER_FLT_SCI_ZERO<span class="sy0">,</span></span></span></pre></td></tr></tbody></table>
+
+<p>All the formats you want <abbr title="Generic Syntax Highlighter">GeSHi</abbr> to recognize are selected via a bitmask that is built by bitwise OR-ing the format constants.
+When styling you use these constants to assign the proper styles. A style not assigned will automatically fallback to style group 0.</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>For a complete list of formats supported by <abbr title="Generic Syntax Highlighter">GeSHi</abbr> have a look into the sources of geshi.php.</p>
+
+</div>
+
+<p>If you want to define your own formats for numbers or when you want to group the style for two or more formats you can use the array syntax.</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="st_h">'NUMBERS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> GESHI_NUMBER_INT_BASIC <span class="sy0">|</span> GESHI_NUMBER_INT_CSTYLE<span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> GESHI_NUMBER_BIN_PREFIX_0B<span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> GESHI_NUMBER_OCT_PREFIX<span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> GESHI_NUMBER_HEX_PREFIX<span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">5</span> <span class="sy0">=&gt;</span> GESHI_NUMBER_FLT_NONSCI <span class="sy0">|</span> GESHI_NUMBER_FLT_NONSCI_F <span class="sy0">|</span> GESHI_NUMBER_FLT_SCI_SHORT <span class="sy0">|</span> GESHI_NUMBER_FLT_SCI_ZERO</span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></pre></td></tr></tbody></table>
+
+<p>This creates 5 style groups 1..5 that will highlight each of the formats specified for each group.
+Styling of these groups doesn&#8217;t use the constants but uses the indices you just defined.</p>
+
+<p>Instead of using those predefined constants you also can assign a PCRE that matches a number when using this advanced format.</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>The extended format hasn&#8217;t been exhaustively been tested. So beware of bugs there.</p>
+
+</div>
+
+<h4 id="language-file-oo-support">4.3.8 Object Orientation Support</h4><div class="nav"><a href="#language-file-numbers-support">Previous</a> | <a href="#language-file-sections">Top</a> | <a href="#language-file-regexps">Next</a></div>
+
+<p>Now we&#8217;re reaching the most little-used section of a language file, which includes such goodies as object orientation
+support and context support. <abbr title="Generic Syntax Highlighter">GeSHi</abbr> can highlight methods and data fields of objects easily, all you need to do is to
+tell it to do so and what the &#8220;splitter&#8221; is between object/method etc.</p>
+
+<p>Here&#8217;s an example:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span></pre></td><td class="de1"><pre class="de1"><span class="st_h">'OOLANG'</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2"><span class="st_h">'OBJECT_SPLITTER'</span> <span class="sy0">=&gt;</span> <span class="st_h">'-&amp;gt;'</span><span class="sy0">,</span></span></span></pre></td></tr></tbody></table>
+
+<p>If your language has object orientation, the value of <code>'OOLANG'</code> is true, otherwise it is false. If it is object
+orientated, in the <code>'OBJECT_SPLITTER'</code> value you put the <code>htmlentities()</code> version of the &#8220;splitter&#8221; between
+objects and methods/fields. If it is not, then make this the empty string.</p>
+
+<h4 id="language-file-regexps">4.3.9 Using Regular Expressions</h4><div class="nav"><a href="#language-file-oo-support">Previous</a> | <a href="#language-file-sections">Top</a> | <a href="#language-file-strict-mode">Next</a></div>
+
+<p>Regular expressions are a good way to catch any other lexic that fits certain rules but can&#8217;t be listed as a keyword.
+A good example is variables in <abbr title="PHP: HTML Preprocessor">PHP</abbr>: variables always start with either one or two &#8220;$&#8221; signs, then alphanumeric
+characters (a simplification). This is easy to catch with regular expressions.</p>
+
+<p>And new to version 1.0.2, there is an advanced way of using regular expressions to catch certain things but highlight
+only part of those things. This is particularly useful for languages like <abbr title="Extensible Markup Language">XML</abbr>.</p>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>Regular expressions use the PCRE syntax (perl-style), <em>not</em> the <code class="highlighted php"><span class="kw3">ereg</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code> style!</p>
+
+</div>
+
+<p>Here is an example (this time the <abbr title="PHP: HTML Preprocessor">PHP</abbr> file merged with the <abbr title="Extensible Markup Language">XML</abbr> file):</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span>13
+<span class="xtra li2"><span class="de2">14</span></span>15
+</pre></td><td class="de1"><pre class="de1"><span class="nu0">0</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; GESHI_SEARCH <span class="sy0">=&gt;</span> <span class="st_h">'(((xml:)?[a-z\-]+))(=)'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; GESHI_REPLACE <span class="sy0">=&gt;</span> <span class="st_h">'\\1'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; GESHI_MODIFIERS <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; GESHI_BEFORE <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; GESHI_AFTER <span class="sy0">=&gt;</span> <span class="st_h">'\\4'</span></span></span>&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2"><span class="nu0">1</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; GESHI_SEARCH <span class="sy0">=&gt;</span> <span class="st_h">'(&gt;/?[a-z0-9]*(&gt;)?)'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; GESHI_REPLACE <span class="sy0">=&gt;</span> <span class="st_h">'\\1'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; GESHI_MODIFIERS <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; GESHI_BEFORE <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; GESHI_AFTER <span class="sy0">=&gt;</span> <span class="st_h">''</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span><span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;[<span class="es1">\\</span>$]{1,2}[a-zA-Z_][a-zA-Z0-9_]*&quot;</span></pre></td></tr></tbody></table>
+
+<p>As you can see there are two formats. One is the &#8220;simple&#8221; format used in <abbr title="Generic Syntax Highlighter">GeSHi</abbr> &lt; 1.0.2, and the other is a more
+advanced syntax. Firstly, the simple syntax:</p>
+
+<ul>
+<li><strong>May be in double quotes:</strong> To make it easier for those who always place their regular expressions in double quotes,
+you may place any regular expression here in double quotes if you wish.</li>
+<li><strong>Don&#8217;t use curly brackets where possible:</strong> If you want to use curly brackets (<code>()</code>) then by all means give it a try,
+but I&#8217;m not sure whether under some circumstances <abbr title="Generic Syntax Highlighter">GeSHi</abbr> may throw a wobbly. You have been warned! If you want to
+use brackets, it would be better to use the advanced syntax.</li>
+<li><strong>Don&#8217;t use the &#8220;everything&#8221; regex:</strong> (That&#8217;s the <code>.*?</code> regex). Use advanced syntax instead.</li>
+</ul>
+
+<p>And now for advanced syntax, which gives you much more control over exactly what is highlighted:</p>
+
+<ul>
+<li><strong>GESHI_SEARCH:</strong> This element specifies the regular expression to search for. If you plan to capture the output,
+use brackets (<code>()</code>). See how in the first example above, most of the regular expression is in one set of brackets
+(with the equals sign in other brackets). You should make sure that the part of the regular expression that is
+supposed to match what is highlighted is in brackets.</li>
+<li><strong>GESHI_REPLACE:</strong> This is what the stuff matched by the regular expression will be replaced with. If you&#8217;ve
+grouped the stuff you want highlighted into brackets in the GESHI_SEARCH element, then you can use <code>\\number</code>
+to match that group, where <code>number</code> is a number corresponding to how many open brackets are between the open
+bracket of the group you want highlighted and the start of the GESHI_SEARCH string + 1. This may sound confusing,
+and it probably is, but if you&#8217;re familiar with how <abbr title="PHP: HTML Preprocessor">PHP</abbr>&#8217;s regular expressions work you should understand. In the
+example above, the opening bracket for the stuff we want highlighted is the very first bracket in the string, so
+the number of brackets before that bracket and the start of the string is 0. So we add 1 and get our replacement
+string of <code>\\1</code> <small>(whew!)</small>.</li>
+</ul>
+
+<p>If you didn&#8217;t understand a word of that, make sure that there are brackets around the string in <code>GESHI_SEARCH</code>
+and use <code>\\1</code> for <code>GESHI_REPLACE</code> ;)</p>
+
+<ul>
+<li><strong>GESHI_MODIFIERS:</strong> Specify modifiers for your regular expression. If your regular expression includes the
+everything matcher (<code>.*?</code>), then your modifiers should include &#8220;s&#8221; and &#8220;i&#8221; (e.g. use &#8216;si&#8217; for this).</li>
+<li><strong>GESHI_BEFORE:</strong>Specifies a bracket group that should appear before the highlighted match (this bracketed group will
+not be highlighted). Use this if you had to match what you wanted by matching part of your regexp string to something
+before what you wanted to highlight, and you don&#8217;t want that part to disappear in the highlighted result.</li>
+<li><strong>GESHI_AFTER:</strong>Specifies a bracket group that should appear after the highlighted match (this bracketed group will
+not be highlighted). Use this if you had to match what you wanted by matching part of your regexp string to something
+after what you wanted to highlight, and you don&#8217;t want that part to disappear in the highlighted result.</li>
+</ul>
+
+<p>Is that totally confusing? Here&#8217;s the test for if you&#8217;re an android or not: If you found that perfectly understandable
+then you&#8217;re an android ;). Here&#8217;s a better example:</p>
+
+<p>Let&#8217;s say that I&#8217;m making a language, and variables in this language always start with a dollar sign ($), are always
+written in lowercase letters and always end with an ampersand (&amp;). eg:</p>
+
+<p><code class="highlighted php"><span class="re0">$foo</span><span class="sy0">&amp;</span> <span class="sy0">=</span> <span class="st_h">'bar'</span></code></p>
+
+<p>I want to highlight <em>only the text between the $ and the &amp;</em>. How do I do that? With simple regular expressions I can&#8217;t,
+but with advanced, it&#8217;s relatively easy:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span>13
+<span class="xtra li2"><span class="de2">14</span></span></pre></td><td class="de1"><pre class="de1"><span class="nu0">1</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="co1">// search for a dollar sign, then one or more of the characters a-z, then an ampersand</span></span></span>&nbsp; &nbsp; GESHI_SEARCH <span class="sy0">=&gt;</span> <span class="st_h">'(\$)([a-z]+)(&amp;)'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="co1">// we wanna highlight the characters, which are in the second bracketed group</span></span></span>&nbsp; &nbsp; GESHI_REPLACE <span class="sy0">=&gt;</span> <span class="st_h">'\\2'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="co1">// no modifiers, since we're not matching the &quot;anything&quot; regex</span></span></span>&nbsp; &nbsp; GESHI_MODIFIERS <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="co1">// before the highlighted characters should be the first</span></span></span>&nbsp; &nbsp; <span class="co1">// bracketed group (always a dollar sign in this example)</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; GESHI_BEFORE <span class="sy0">=&gt;</span> <span class="st_h">'\\1'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="co1">// after the highlighted characters should be the third</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="co1">// bracketed group (always an ampersand in this example)</span></span></span>&nbsp; &nbsp; GESHI_AFTER <span class="sy0">=&gt;</span> <span class="st_h">'\\3'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span></pre></td></tr></tbody></table>
+
+<p>So if someone tried to highlight using my language, all cases of <code>$foo&amp;</code> would turn into:</p>
+
+<p><code class="highlighted html4strict">$<span class="sc2">&lt;<span class="kw2">span</span> <span class="kw3">style</span><span class="sy0">=</span><span class="st0">&quot;color: blue;&quot;</span>&gt;</span>foo<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">span</span>&gt;&lt;<span class="kw2">span</span> <span class="kw3">style</span><span class="sy0">=</span><span class="st0">&quot;color: green;&quot;</span>&gt;</span><span class="sc1">&amp;amp;</span><span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">span</span>&gt;</span></code></p>
+
+<p>(which would of course be viewed in a browser to get something like <code class="highlighted php"><span class="re0">$foo</span><span class="sy0">&amp;</span></code>)</p>
+
+<h4 id="language-file-strict-mode">4.3.10 Contextual Highlighting and Strict Mode</h4><div class="nav"><a href="#language-file-regexps">Previous</a> | <a href="#language-file-sections">Top</a> | <a href="#language-file-parser-control">Next</a></div>
+
+<p>For languages like <abbr title="Hypertext Markup Language">HTML</abbr>, it&#8217;s good if we can highlight a tag (like <code class="highlighted html4strict"><span class="sc2">&lt;<span class="kw2">a</span>&gt;</span></code> for example). But how do we stop
+every single &#8220;a&#8221; in the source getting highlighted? What about for attributes? If I&#8217;ve got the word &#8220;colspan&#8221; in my
+text I don&#8217;t want that highlighted! So how do you tell <abbr title="Generic Syntax Highlighter">GeSHi</abbr> not to highlight in that case? You do it with &#8220;Strict Blocks&#8221;.</p>
+
+<p>Here is an example:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span>13
+<span class="xtra li2"><span class="de2">14</span></span>15
+<span class="xtra li2"><span class="de2">16</span></span>17
+<span class="xtra li2"><span class="de2">18</span></span>19
+<span class="xtra li2"><span class="de2">20</span></span>21
+<span class="xtra li2"><span class="de2">22</span></span>23
+<span class="xtra li2"><span class="de2">24</span></span>25
+<span class="xtra li2"><span class="de2">26</span></span>27
+</pre></td><td class="de1"><pre class="de1"><span class="sy1">&lt;?</span> <span class="coMULTI">/* ... */</span>
+<span class="xtra li2"><span class="de2"><span class="st_h">'STRICT_MODE_APPLIES'</span> <span class="sy0">=&gt;</span> GESHI_MAYBE<span class="sy0">,</span></span></span><span class="st_h">'SCRIPT_DELIMITERS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'&lt;?php'</span> <span class="sy0">=&gt;</span> <span class="st_h">'?&gt;'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'&lt;?'</span> <span class="sy0">=&gt;</span> <span class="st_h">'?&gt;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'&lt;%'</span> <span class="sy0">=&gt;</span> <span class="st_h">'%&gt;'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'&lt;script language=&quot;php&quot;&gt;'</span> <span class="sy0">=&gt;</span> <span class="st_h">'&lt;/script&gt;'</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;/(&lt;\?(?:php)?)(?:'(?:[^'<span class="es1">\\</span><span class="es1">\\</span>]|<span class="es1">\\</span><span class="es1">\\</span>.)*?'|<span class="es1">\&quot;</span>(?:[^<span class="es1">\&quot;</span><span class="es1">\\</span><span class="es1">\\</span>]|<span class="es1">\\</span><span class="es1">\\</span>.)*?<span class="es1">\&quot;</span>|\/\*(?!\*\/).*?\*\/|.)*?(\?&gt;|\Z)/sm&quot;</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="nu0">5</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;/(&lt;%)(?:'(?:[^'<span class="es1">\\</span><span class="es1">\\</span>]|<span class="es1">\\</span><span class="es1">\\</span>.)*?'|<span class="es1">\&quot;</span>(?:[^<span class="es1">\&quot;</span><span class="es1">\\</span><span class="es1">\\</span>]|<span class="es1">\\</span><span class="es1">\\</span>.)*?<span class="es1">\&quot;</span>|\/\*(?!\*\/).*?\*\/|.)*?(%&gt;|\Z)/sm&quot;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></span></span><span class="st_h">'HIGHLIGHT_STRICT_BLOCK'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="nu0">0</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="nu0">1</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="nu0">3</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="nu0">4</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; <span class="nu0">5</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="br0">&#41;</span></span></span><span class="coMULTI">/* ... */</span> <span class="sy1">?&gt;</span></pre></td></tr></tbody></table>
+
+<p>What is strict mode? Strict mode says that highlighting only occurs inside the blocks you specify. You can see from
+the example above that highlighting will only occur if the source is inside <code class="highlighted php"><span class="kw2">&lt;?php</span> <span class="sy0">...</span> <span class="sy1">?&gt;</span></code> (though note the
+<code>GESHI_MAYBE</code>!). Here are some points about strict highlighting:</p>
+
+<ul>
+<li><strong>&#8216;STRICT_MODE_APPLIES&#8217;:</strong> This takes three values (all constants):
+
+<ul>
+<li><code>GESHI_ALWAYS</code>: Strict mode always applies for all of the blocks you specify. Users of your language
+file cannot turn strict mode off. This should be used for markup languages.</li>
+<li><code>GESHI_NEVER</code>: Strict mode is never used. Users of your language file cannot turn strict mode on. Use this
+value if there is no such thing as a block of code that would not be highlighted in your language
+(most languages, like C, Java etc. use this because anything in a C file should be highlighted).</li>
+<li><code>GESHI_MAYBE</code>: Strict mode &#42;sometimes&#42; applies. It defaults to &#8220;off&#8221;. Users can turn strict mode on if
+they please. If strict mode is off then everything in the source will be highlighted, even things outside
+the strict block markers. If strict mode is on then nothing outside strict block markers will be highlighted.</li>
+</ul></li>
+<li><strong>&#8216;SCRIPT_DELIMITERS&#8217;:</strong> This is an array of script delimiters, in the format of the above. The indices are use in the
+&#8216;SCRIPT&#8217; part of the styles section for highlighting everything in a strict block in a certain way.
+For example, you could set up your language file to make the background yellow of any code inside a strict
+block this way. The delimiters are in the form <code class="highlighted php"><span class="st_h">'OPEN'</span> <span class="sy0">=&gt;</span> <span class="st_h">'CLOSE'</span></code>. Delimiters can be of any
+length > 0. Delimiters are <em>not</em> formatted as if they were run through <code class="highlighted php"><span class="kw3">htmlentities</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code>!</li>
+<li><strong>&#8216;HIGHLIGHT_STRICT_BLOCK&#8217;:</strong> specifies whether any highlighting should go on inside each block. Most of
+the time this should be true, but for example, in the <abbr title="Extensible Markup Language">XML</abbr> language file highlighting is turned off for
+blocks beginning with <code class="highlighted html4strict"><span class="sc0">&lt;!DOCTYPE</span></code> and ending with <code class="highlighted html4strict">&gt;</code>. However, you can still
+style the overall block using the method described above, and the <abbr title="Extensible Markup Language">XML</abbr> language file does just that.</li>
+</ul>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>The delimiters should be in <em>reverse alphabetical order</em>. Note that in the above example, <code class="highlighted php"><span class="kw2">&lt;?php</span></code>
+ comes before <code class="highlighted php"><span class="sy1">&lt;?</span></code>.</p>
+
+</div>
+
+<p>Since <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.8 instead of specifying an array with starter and ender you may also provide a regular expression
+that matches <em>the full block</em> you wish to highlight. If the regular expression match starts at the same position
+as a previous array declaration the Regexp match is taken. This is to allow for a fall-back when a preg_match
+doesn&#8217;t quite work as expected so you still get reasonably well results.</p>
+
+<p>If you didn&#8217;t get this, you might want to look into the <abbr title="PHP: HTML Preprocessor">PHP</abbr> or <abbr title="Hypertext Markup Language">HTML</abbr> language files as this feature is used there
+to fix some issues that have been there for about 3 years.</p>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>For <abbr title="PHP: HTML Preprocessor">PHP</abbr> versions &lt;4.3.3 Strict Block Regexps are completely ignored due to problems in those version
+ that would cause loads of warning messages otherwise.</p>
+
+</div>
+
+<h4 id="language-file-parser-control">4.3.11 Special Parser Settings (Experimental)</h4><div class="nav"><a href="#language-file-strict-mode">Previous</a> | <a href="#language-file-sections">Top</a> | <a href="#language-file-tidying-up">Next</a></div>
+
+<p>Sometimes it is necessary for a language to render correctly to tweak some of the assumptions <abbr title="Generic Syntax Highlighter">GeSHi</abbr> usually makes to match the behaviour your language expects.
+To achieve this there is an experimental section called <code class="highlighted php"><span class="st_h">'PARSER_CONTROL'</span></code> which is optional and should be used only if necessary.
+With the help of this section some internal parameters of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> can be set which are not overrideable by the API and thus their use should be limited as much as possible.</p>
+
+<p>The syntax of the <strong>PARSER_CONTROL</strong> basically resembles an array structure simular to the one found in the rest of the language file. All subsections of the <strong>PARSER_CONTROL</strong> are optional.
+If a given setting isn&#8217;t present the usual default values of <abbr title="Generic Syntax Highlighter">GeSHi</abbr> are used.
+No validation of settings is performed for these settings. Also note that unknown settings are silently ignored.</p>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>All <strong>PARSER_CONTROL</strong> settings are experimental and subject to change.
+ So if you need a special setting in a public language file you should consider requesting it upstream.
+ This is also the reason why documentation on these settings will only cover broad usage information as the underlying implementation might change without further notice.</p>
+
+</div>
+
+<p>One of the most common reasons why you might want to use the <strong>PARSER_CONTROL</strong> settings is to tweak what characters are allowed to surround a keyword.
+Usually <abbr title="Generic Syntax Highlighter">GeSHi</abbr> checks for a fixed set of characters like brackets and common symbols that denote the word boundary for a keyword.
+If this set conflicts with your language (e.g. - is allowed inside a keyword) or you want to limit the usage of a keyword to certain areas (e.g. for <abbr title="Hypertext Markup Language">HTML</abbr> tag names only match after &lt;) you can change those conditions here.</p>
+
+<p>Keyword boundary rules can either be set globally (directly within the PARSER_CONTROL&#8217;s KEYWORDS section or on a per-group basis.
+E.g. the following sample from the <abbr title="Hypertext Markup Language">HTML</abbr> language file sets different settings for keyword matching only for Keyword Group 2 and leaves the other groups alone.</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span></pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="st_h">'PARSER_CONTROL'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'KEYWORDS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'DISALLOWED_BEFORE'</span> <span class="sy0">=&gt;</span> <span class="st_h">'(?&lt;=&amp;lt;|&amp;lt;\/)'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'DISALLOWED_AFTER'</span> <span class="sy0">=&gt;</span> <span class="st_h">'(?=\s|\/|&amp;gt;)'</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="br0">&#41;</span></span></span></pre></td></tr></tbody></table>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>The name <code class="highlighted php"><span class="st_h">'DISALLOWED_BEFORE'</span></code> and <code class="highlighted php"><span class="st_h">'DISALLOWED_AFTER'</span></code> might sound confusing at first, since they don&#8217;t define what to prevent, but what to match in order to find a keyword.
+ The reason for this strange naming is based in the original implementation of this feature when Nigel implemented this in the old parser statically.
+ When this implementation was brought out via the <strong>PARSER_CONTROL</strong> settings the original naming wasn&#8217;t altered since at that time this really was a blacklist of characters.
+ Later on this implementation was changed from a blacklist of characters to a part of a PCRE regexp, but leaving the name.
+ The naming might be subject to change though.</p>
+
+</div>
+
+<p>Another option you can change since <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.8.3 is whether to treat spaces within keywords as literals (only a single space as given) or if the space should match any whitespace at that location.
+The following code will enable this behaviour for the whole keyword set. As said above you can choose to enable this for single keyword groups only though.</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="st_h">'PARSER_CONTROL'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'KEYWORDS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'SPACE_AS_WHITESPACE'</span> <span class="sy0">=&gt;</span> <span class="kw4">true</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span></span></span>&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">,</span></pre></td></tr></tbody></table>
+
+<p>Another option of interest might be disabling certain features for a given language.
+This might come in handy if the language file you are working on doesn&#8217;t support a given function or highlighting certain aspects won&#8217;t work properly or would interfere with custom implementations using regular expressions.</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+<span class="xtra li2"><span class="de2">8</span></span>9
+<span class="xtra li2"><span class="de2">10</span></span>11
+<span class="xtra li2"><span class="de2">12</span></span></pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="st_h">'PARSER_CONTROL'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ENABLE_FLAGS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ALL'</span> <span class="sy0">=&gt;</span> GESHI_NEVER<span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'NUMBERS'</span> <span class="sy0">=&gt;</span> GESHI_NEVER<span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'METHODS'</span> <span class="sy0">=&gt;</span> GESHI_NEVER<span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'SCRIPT'</span> <span class="sy0">=&gt;</span> GESHI_NEVER<span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'SYMBOLS'</span> <span class="sy0">=&gt;</span> GESHI_NEVER<span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'ESCAPE_CHAR'</span> <span class="sy0">=&gt;</span> GESHI_NEVER<span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'BRACKETS'</span> <span class="sy0">=&gt;</span> GESHI_NEVER<span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'STRINGS'</span> <span class="sy0">=&gt;</span> GESHI_NEVER<span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; <span class="br0">&#41;</span></span></span></pre></td></tr></tbody></table>
+
+<p>Inside the <code class="highlighted php"><span class="st_h">'ENABLE_FLAGS'</span></code> section follows an array of <code class="highlighted php"><span class="st_h">'name'</span><span class="sy0">=&gt;</span>value</code> pairs.
+Valid names are the sections below the <code class="highlighted php"><span class="st_h">'STYLES'</span></code> section (well, not exactly, but you can look there for what the features are called inside <abbr title="Generic Syntax Highlighter">GeSHi</abbr>).
+Valid values are the <abbr title="Generic Syntax Highlighter">GeSHi</abbr> constants <code class="highlighted php">GESHI_NEVER</code> (don&#8217;t process this feature), <code class="highlighted php">GESHI_ALWAYS</code> (always process this feature, ignore the user) and <code class="highlighted php">GESHI_MAYBE</code> (listen to the user if he want&#8217;s this highlighted).
+The value <code class="highlighted php">GESHI_MAYBE</code> is the default one and thus needs not to be set explicitely.</p>
+
+<p>Another setting available through the <strong>PARSER_CONTROL</strong> settings is the possibility to limit the allowed characters before an single line comment.</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="st_h">'PARSER_CONTROL'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'COMMENTS'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'DISALLOWED_BEFORE'</span> <span class="sy0">=&gt;</span> <span class="st_h">'$'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span></span></span>&nbsp; &nbsp; <span class="br0">&#41;</span></pre></td></tr></tbody></table>
+
+<p>With the current implementation the DISALLOWED_BEFORE COMMENT-specific setting is a list of characters. But this is subject to change.</p>
+
+<div class="note">
+
+<div class="note-header">Note:</div>
+
+<p>There is no <code class="highlighted php"><span class="st_h">'DISALLOWED_AFTER'</span></code> setting with the <code class="highlighted php"><span class="st_h">'COMMENTS'</span></code>-<strong>PARSER_CONTROL</strong>.</p>
+
+</div>
+
+<p>Another <strong>PARSER_CONTROL</strong> setting for the environment around certain syntactic constructs refers to the handling of object-oriented languages.</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+<span class="xtra li2"><span class="de2">4</span></span>5
+<span class="xtra li2"><span class="de2">6</span></span>7
+</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="st_h">'PARSER_CONTROL'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'OOLANG'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'MATCH_BEFORE'</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="sy0">,</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'MATCH_AFTER'</span> <span class="sy0">=&gt;</span> <span class="st_h">'[a-zA-Z_][a-zA-Z0-9_]*'</span><span class="sy0">,</span></span></span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">'MATCH_SPACES'</span> <span class="sy0">=&gt;</span> <span class="st_h">'[\s]*'</span>
+<span class="xtra li2"><span class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span></span></span>&nbsp; &nbsp; <span class="br0">&#41;</span></pre></td></tr></tbody></table>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>Please note that the settings discussed in this section are experimental and might be changed, removed or altered in their meaning at any time.</p>
+
+</div>
+
+<h4 id="language-file-tidying-up">4.3.12 Tidying Up</h4><div class="nav"><a href="#language-file-parser-control">Previous</a> | <a href="#language-file-sections">Top</a> | <a href="#lang-validation">Next</a></div>
+
+<p>All language files should end with:</p>
+
+<table class="php geshicode"><thead><tr><td colspan="2" class="head">PHP code</td></tr></thead><tbody><tr class="li1"><td class="ln"><pre class="de1">1
+<span class="xtra li2"><span class="de2">2</span></span>3
+</pre></td><td class="de1"><pre class="de1"><span class="br0">&#41;</span><span class="sy0">;</span>
+<span class="xtra li2"><span class="de2">&nbsp;</span></span><span class="sy1">?&gt;</span></pre></td></tr></tbody></table>
+
+<p>That is the string content <code class="highlighted php"><span class="st0">&quot;<span class="es1">\n</span>);<span class="es1">\n</span>?&gt;<span class="es1">\n</span>&quot;</span></code>.</p>
+
+<div class="caution">
+
+<div class="caution-header">Caution:</div>
+
+<p>Make sure that there is EXACTLY one linebreak character at the end. If you accidentially include more
+ you might end up with messages like &#8220;Headers already sent&#8221;.</p>
+
+</div>
+
+<h3 id="lang-validation">4.4 Validating your language file</h3><div class="nav"><a href="#language-file-tidying-up">Previous</a> | <a href="#language-files">Top</a> | <a href="#method-constant-reference">Next</a></div>
+
+<p>Since <abbr title="Generic Syntax Highlighter">GeSHi</abbr> 1.0.8 there is a new script <code>langcheck.php</code> in the contrib directory that scans all
+language files it finds in the geshi/ subdirectory of the <abbr title="Generic Syntax Highlighter">GeSHi</abbr> installation for mistakes.</p>
+
+<p>Please make sure that your language does not contain any mistakes that this script shows you when sending in
+your language file for inclusion into the official release as this saves work for us when including your file.
+Also you can be sure your language file will work as expected once your language file validates correctly.</p>
+
+<p>Please note that not all of the language files shipped with <abbr title="Generic Syntax Highlighter">GeSHi</abbr> are fully valid yet, but we&#8217;re working on it
+and are happy about every patch we get!</p>
+
+<h2 id="method-constant-reference">5 Method/Constant Reference</h2><div class="nav"><a href="#lang-validation">Previous</a></div>
+
+<p>I&#8217;m afraid I have been lying for a little while about this now! Since 1.0.7 I have been including a phpdoc API for
+the sourcecode in the <a href="api/index.html">api</a> directory, but have forgot to update the documentation! However, it is available,
+and may assist you in coding, especially for plugin coders.</p>
+
+<hr />
+
+<p>That&#8217;s all, folks!</p>
+
+<p>I&#8217;ve improved the documentation greatly from version 1.0.1, but there may still be problems with it, or it may still
+be confusing for you. Or perhaps I was just plain wrong about one point! If so, contact me and I&#8217;ll do my best to sort it out.</p>
+
+<p>In case you were wondering, I&#8217;ve finished development of the 1.0.X thread of <abbr title="Generic Syntax Highlighter">GeSHi</abbr>. The only releases I&#8217;ll make in this
+thread will be of the bug-fix/add language files type. In particular, version 1.0.2 was a &#8220;concept&#8221; release - testing
+how far I could take the highlighting idea (as well as ideas from others).</p>
+
+<p>I&#8217;m planning a code rewrite for 1.2.X, which will be based on a new engine - a &#8220;psuedo-tokenizer&#8221; engine. Hopefully
+it will massively reduce the server load and time taken (by almost eliminating regexps), while providing
+superior highlighting. But fear not! The interface and method names should all remain the same ^_^ (though I can&#8217;t
+say the same for language files!)</p>
+
+<p>And finally, a couple of people have been asking me: how did you generate that documentation? The amazing answer is: my
+brain. And yes, it took a long time, and I don&#8217;t recommend doing it this way. And yes, you can borrow the styles if
+you like, though flick me an e-mail if you do.</p>
+
+<p>Anyway, enough blather from me. Get <abbr title="Generic Syntax Highlighter">GeSHi</abbr> working for you already! :D</p>
+
+<div class="header">
+
+<dl>
+<dt>Authors:</dt>
+<dd>&copy; 2004 - 2007&#160;<a href="mailto:nigel@geshi.org">Nigel McNie</a></dd>
+
+<dd>&copy; 2007 - 2012&#160;<a href="mailto:BenBE@geshi.org">Benny Baumann</a></dd>
+
+<dd>&copy; 2008 - 2009&#160;<a href="mailto:mail@milianw.de">Milian Wolff</a></dd>
+
+<dt><abbr title="Generic Syntax Highlighter">GeSHi</abbr> Website:</dt>
+<dd><a href="http://qbnz.com/highlighter">http://qbnz.com/highlighter</a></dd>
+</dl>
+
+</div>
+
+<div class="footnotes">
+<hr />
+<ol>
+
+<li id="fn:xhtml-strict">
+<p>The PRE header (see <a href="#the-code-container">The Code Container</a>) is not valid <abbr title="Hypertext Markup Language">HTML</abbr>, you might want
+to use one of the other header types instead.&#160;<a href="#fnref:xhtml-strict" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn:php-version-note">
+<p>Support is granted for <abbr title="PHP: HTML Preprocessor">PHP</abbr> 4.3.0 and above, but especially 4.3.x cannot be guaranteed to
+work due to a lack of test systems. If you are forced to use such old <abbr title="PHP: HTML Preprocessor">PHP</abbr> versions complain at your hoster or
+contact us if you find compatibility issues so we can try to resolve them. It&#8217;s only <abbr title="PHP: HTML Preprocessor">PHP</abbr> 4.4.X and above that
+is verified to work.&#160;<a href="#fnref:php-version-note" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn:phpbb-note">
+<p>I am no longer working on this MOD, however if someone else wants to they can contact me for more
+information.&#160;<a href="#fnref:phpbb-note" rev="footnote">&#8617;</a></p>
+</li>
+
+<li id="fn:plugin-only">
+<p>Available as plugin only. In addition, some of the other entries mentioned
+here may only have <abbr title="Generic Syntax Highlighter">GeSHi</abbr> available as a plugin.&#160;<a href="#fnref:plugin-only" rev="footnote">&#8617;</a></p>
+</li>
+
+</ol>
+</div>
+ </body>
+</html> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/geshi-doc.txt b/extensions/SyntaxHighlight_GeSHi/geshi/docs/geshi-doc.txt
new file mode 100644
index 00000000..e0f38ff6
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/geshi-doc.txt
@@ -0,0 +1,1741 @@
+[NOTE: This documentation has simply been copy-pasted from the HTML form and is NOT up to date, I recommend you
+read that instead]
+
+GeSHi Documentation
+Version 1.0.7.22
+
+Author: Nigel McNie, Benny Baumann
+Copyright: © 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
+Email: nigel@geshi.org, BenBE@omorphia.de
+GeSHi Website: http://qbnz.com/highlighter
+
+This is the documentation for GeSHi - Generic Syntax Highlighter. The most modern version of this document is available on the web - go to http://qbnz.com/highlighter/documentation.php to view it.
+
+Any comments, questions, confusing points? Please contact me! I need all the information I can get to make the use of GeSHi and everything related to it (including this documentation) a breeze.
+Contents
+
+ * 1. Introduction
+ o 1.1 Features
+ o 1.2 About GeSHi
+ o 1.3 Credits
+ o 1.4 Feedback
+ * 2. The Basics
+ o 2.1 Getting GeSHi
+ o 2.2 Installing GeSHi
+ + 2.2.1 Requirements
+ + 2.2.2 Extracting GeSHi
+ + 2.2.3 Installation
+ o 2.3 Basic Usage
+ * 3. Advanced Features
+ o 3.1 The Code Container
+ o 3.2 Line Numbers
+ + 3.2.1 Enabling Line Numbers
+ + 3.2.2 Styling Line Numbers
+ + 3.2.3 Choosing a Start Number
+ o 3.3 Using CSS Classes
+ + 3.3.1 Enabling CSS Classes
+ + 3.3.2 Setting the CSS Class/ID
+ + 3.3.3 Getting the Stylesheet
+ + 3.3.4 Using an External Stylesheet
+ o 3.4 Changing Styles
+ + 3.4.1 The Overall Styles
+ + 3.4.2 Line Number Styles
+ + 3.4.3 Setting Keyword Styles
+ + 3.4.4 Setting Comment Styles
+ + 3.4.5 Setting Other Styles
+ o 3.5 Case Sensitivity and Auto Casing
+ + 3.5.1 Auto Caps/Nocaps
+ + 3.5.2 Setting Case Sensitivity
+ o 3.6 Changing the Source/Language/Path/Charset
+ + 3.6.1 Changing the Source Code
+ + 3.6.2 Changing the Language
+ + 3.6.3 Changing the Path
+ + 3.6.4 Changing the Character Set
+ + 3.6.5 Using load_from_file to change the language and source code
+ o 3.7 Error Handling
+ o 3.8 Disabling Styling of Some Lexics
+ o 3.9 Setting the Tab Width
+ o 3.10 Using Strict Mode
+ o 3.11 Adding/Removing Keywords
+ + 3.11.1 Adding a Keyword
+ + 3.11.2 Removing a Keyword
+ + 3.11.3 Adding a Keyword Group
+ + 3.11.4 Removing a Keyword Group
+ o 3.12 Headers and Footers for your code
+ + 3.12.1 Keyword Substitution
+ + 3.12.2 Setting Header Content
+ + 3.12.3 Setting Footer Content
+ + 3.12.4 Styling Header Content
+ + 3.12.5 Styling Footer Content
+ o 3.13 Keyword URLs
+ + 3.13.1 Setting a URL for a Keyword Group
+ + 3.13.2 Disabling URLs for a Keyword Group
+ + 3.13.3 Disabling all URLs for Keywords
+ + 3.13.4 Styling Links
+ + 3.13.5 Setting the Link Target
+ o 3.14 Using Contextual Importance
+ o 3.15 Highlighting Special Lines "Extra"
+ + Specifying the Lines to Highlight Extra
+ + Styles for the Highlighted Lines
+ o 3.16 Adding IDs to Each Line
+ o 3.17 Getting the Time of Styling
+ * 4 Language Files
+ o 4.1 An Example Language File
+ o 4.2 Language File Conventions
+ o 4.3 Language File Sections
+ + 4.3.1 The Header
+ + 4.3.2 The First Indices
+ + 4.3.3 Keywords
+ + 4.3.4 Symbols and Case Sensitivity
+ + 4.3.5 Styles for your Language Files
+ + 4.3.6 URLs for Functions
+ + 4.3.7 Object Orientation Support
+ + 4.3.8 Using Regular Expressions
+ + 4.3.9 Contextual Highlighting and Strict Mode
+ + 4.3.10 Tidying Up
+ * 5 Method/Constant Reference
+
+1: Introduction
+Top | Contents | Next | Previous
+
+GeSHi is exactly what the acronym stands for: a Generic Syntax Highlighter. As long as you have a language file for almost any computer language - whether it be a scripting language, object orientated, markup or anything in between - GeSHi can highlight it! GeSHi is extremely customisable - the same source can be highlighted multiple times in multiple ways - the same source even with a different language. GeSHi outputs XHTML strict compliant code*, and can make use of CSS to save on the amount of output. And what is the cost for all of this? You need PHP. That's all!
+
+*Most of the time. Some languages do not output XHTML strict code, and using line numbers with the PRE header is not legal either. These problems will be fixed in 1.2.
+1.1: Features
+Top | Contents | Next | Previous
+
+Here are some of the standout features of GeSHi:
+
+ * Programmed in PHP: GeSHi is coded entirely in PHP. This means that where ever you have PHP, you can have GeSHi! Almost any free webhost supports PHP, and GeSHi works fine with PHP > 4.3.0*.
+ * Support for many languages: GeSHi comes with about 100 languages, including PHP, HTML, CSS, Java, C, Lisp, XML, Perl, Python, ASM and many more!
+ * XHTML compliant output: GeSHi produces XHTML compliant output, using stylesheets, so you need not worry about GeSHi ruining your claims to perfection in the standards department ;)
+ * Highly customisable: GeSHi allows you to change the style of the output on the fly, use CSS classes or not, use an external stylesheet or not, use line numbering, change the case of output keywords... the list goes on and on!
+ * Flexible: Unfortunately, GeSHi is quite load/time intensive for large blocks of code. However, you want speed? Turn off any features you don't like, pre-make a stylesheet and use CSS classes to reduce the amount of output and more - it's easy to strike a balance that suits you.
+
+This is just a taste of what you get with GeSHi - the best syntax highlighter for the web in the world!
+
+*Support is granted for PHP 4.3.0 and above, but especially 4.3.x cannot be guaranteed to work due to a lack of test systems. If you are forced to use such old PHP versions complain at your hoster or contact us if you find compatibility issues so we can try to resolve them. It's only PHP 4.4.X and above that is verified to work.
+1.2: About GeSHi
+Top | Contents | Next | Previous
+
+GeSHi started as a mod for the phpBB forum system, to enable highlighting of more languages than the available (which can be roughly estimated to exactly 0 ;)). However, it quickly spawned into an entire project on its own. But now it has been released, work continues on a mod for phpBB* - and hopefully for many forum systems, blogs and other web-based systems.
+
+*I am no longer working on this MOD, however if someone else wants to they can contact me for more information.
+
+Several systems are using GeSHi now, including:
+
+ * Dokuwiki - An advanced wiki engine
+ * gtk.php.net - Their manual uses GeSHi for syntax highlighting
+ * WordPress - A powerful blogging system*
+ * PHP-Fusion - A constantly evovling CMS
+ * SQL Manager - A Postgres DBAL
+ * Mambo - A popular open source CMS
+ * MediaWiki - A leader in Wikis*
+ * TikiWiki - A megapowerful Wiki/CMS
+ * TikiPro - Another powerful Wiki based on Tikiwiki
+ * RWeb - A site-building tool
+
+* Available as plugin only. In addition, some of the other entries mentioned here may only have GeSHi available as a plugin.
+
+GeSHi is the original work of Nigel McNie. The project was later handed over to Benny Baumann. Others have helped with aspects of GeSHi also, they're mentioned in the THANKS file.
+1.3: Credits
+Top | Contents | Next | Previous
+
+Many people have helped out with GeSHi, whether by creating language files, submitting bug reports, suggesting new ideas or simply pointing out a new idea or something I'd missed. All of these people have helped to build a better GeSHi, you can see them in the THANKS file.
+
+Do you want your name on this list? Why not make a language file, or submit a valid bug? Or perhaps help me with an added feature I can't get my head around, or suggest a new feature, or even port GeSHi to anothe language? There's lots you can do to help out, and I need it all :)
+1.4: Feedback
+Top | Contents | Next | Previous
+
+I need your feedback! ANYthing you have to say is fine, whether it be a query, congratulations, a bug report or complaint, I don't care! I want to make this software the best it can be, and I need your help! You can contact me in the following ways:
+
+ * E-mail: nigel@geshi.org
+ * Forums: Sourceforge.net Forums or GeSHi home forums
+
+Remember, any help I am grateful for :)
+2: The Basics
+Top | Contents | Next | Previous
+
+In this section, you'll learn a bit about GeSHi, how it works and what it uses, how to install it and how to use it to perform basic highlighting.
+2.1: Getting GeSHi
+Top | Contents | Next | Previous
+
+If you're reading this and don't have GeSHi, that's a problem ;). So, how do you get your hands on it? Visit http://qbnz.com/highlighter/downloads.php to obtain the latest version.
+2.2: Installing GeSHi
+Top | Contents | Next | Previous
+
+Installing GeSHi is a snap, even for those most new to PHP. There's no tricks involved. Honest!
+2.2.1: Requirements
+Top | Contents | Next | Previous
+
+GeSHi requires the following to be installable:
+
+ * PHP. It's untested with anything other below 4.4.X. I hope to extend this range soon. I see no reason why it won't work with any version of PHP above 4.3.0.
+ * Approximately 2 megabytes of space. The actual script is small - around 150K - but most of the size comes from the large number of language files (over 100!). If you're pushed for space, make sure you don't upload to your server the docs/ or contrib/ directory, and you may want to leave out any language files that don't take your fancy either.
+
+As you can see, the requirements are very small. If GeSHi does NOT work for you in a particular version of PHP, let me know why and I'll fix it.
+
+Packages come in .zip, .tar.gz and .tar.bz2 format, so there's no complaining about whether it's available for you. *nix users probably want .tar.gz or .tar.bz2 and windows users probably want .zip.
+2.2.2: Extracting GeSHi
+Top | Contents | Next | Previous
+
+To extract GeSHi in Linux (.tar.gz):
+
+ 1. Open a shell
+ 2. cd to the directory where the archive lies
+ 3. Type tar -xzvf [filename] where [filename] is the name of the archive (typically GeSHi-1.X.X.tar.gz)
+ 4. GeSHi will be extracted to its own directory
+
+To extract GeSHi in Windows (.zip):
+
+ 1. Open Explorer
+ 2. Navigate to the directory where the archive lies
+ 3. Extract the archive. The method you use will depend on your configuration. Some people can right-click upon the archive and select "Extract" from there, others may have to drag the archive and drop it upon an extraction program.
+
+To extract from .zip you'll need an unzipping program - unzip in Linux, or Winzip, Winrar or similar for Windows.
+2.2.3: Installation
+Top | Contents | Next | Previous
+
+GeSHi is nothing more than a PHP class with related language support files. Those of you familiar with PHP can then guess how easy the installation will be: simply copy it into your include path somewhere. You can put it wherever you like in this include path. I recommend that you put the language files in a subdirectory of your include path too - perhaps the same subdirectory that geshi.php is in. Remember this path for later.
+
+If you don't know what an include path is, don't worry. Simply copy GeSHi to your webserver. So for example, say your site is at http://mysite.com/myfolder, you can copy GeSHi to your site so the directory structure is like this:
+
+http://mysite.com/myfolder/geshi/[language files]
+http://mysite.com/myfolder/geshi.php
+
+Or you can put it in any subdirectory you like:
+
+http://mysite.com/myfolder/includes/geshi/[language files]
+http://mysite.com/myfolder/includes/geshi.php
+
+Caution:
+
+When using GeSHi on a live site, the only directory required is the geshi/ subdirectory. Both contrib/ and docs/ are worthless, and furthermore, as some people discovered, one of the files in contrib had a security hole (fixed as of 1.0.7.3). I suggest you delete these directories from any live site they are on.
+2.3: Basic Usage
+Top | Contents | Next | Previous
+
+Use of GeSHi is very easy. Here's a simple example:
+//
+// Include the GeSHi library
+//
+include_once('geshi.php');
+
+//
+// Define some source to highlight, a language to use
+// and the path to the language files
+//
+$source = '$foo = 45;
+for ( $i = 1; $i < $foo; $i++ )
+{
+ echo "$foo<br />\n";
+ --$foo;
+}';
+$language = 'php';
+//
+// Create a GeSHi object
+//
+$geshi =& new GeSHi($source, $language);
+
+//
+// And echo the result!
+//
+echo $geshi->parse_code();
+
+As you can see, there's only three really important lines:
+include_once('geshi.php');
+
+This line includes the GeSHi class for use
+$geshi = new GeSHi($source, $language);
+
+This line creates a new GeSHi object, holding the source and the language you want to use for highlighting.
+echo $geshi->parse_code();
+
+This line spits out the result :)
+
+So as you can see, simple usage of GeSHi is really easy. Just create a new GeSHi object and get the code!
+
+Since version 1.0.2, there is a function included with GeSHi called geshi_highlight. This behaves exactly as the php function highlight_string behaves - all you do is pass it the language you want to use to highlight and the path to the language files as well as the source. Here are some examples:
+// Simply echo the highlighted code
+geshi_highlight($source, 'php', $path);
+
+// Get the code back, for use later
+$code = geshi_highlight($source, 'java', $path, true)
+
+// Check if there is an error with parsing this code
+ob_start();
+$result = geshi_highlight($source, 'perl', $path);
+$code = ob_get_contents();
+ob_end_clean();
+if ( !$result )
+{
+ // There was an error with highlighting...
+}
+else
+{
+ // All OK :)
+}
+
+However, these are really simple examples and doesn't even begin to cover all the advanced features of GeSHi. If you want to learn more, continue on to section 3: Advanced Features.
+3: Advanced Features
+Top | Contents | Next | Previous
+
+This section documents the advanced features of GeSHi - strict mode, using CSS classes, changing styles on the fly, disabling highlighting of some things and more.
+
+In this section there are many code snippets. For all of these, you should assume that the GeSHi library has been included, and a GeSHi object has been created and is referenced by the variable $geshi. Normally, the source, language and path used are arbitary.
+3.1 The Code Container
+Top | Contents | Next | Previous
+
+The Code Container has a fundamental effect on the layout of your code before you even begin to style. What is the Code Container? It's the bit of markup that goes around your code to contain it. By default your code is surrounded by a <pre>, but you can also specify a <div>.
+
+The <pre> header is the default. If you're familiar with HTML you'll know that whitespace is rendered "as is" by a <pre> element. The advantage for you is that if you use <pre> the whitespace you use will appear pretty much exactly how it is in the source, and what's more GeSHi won't have to add a whole lot of <br />'s and non-breaking spaces (&nbsp;) to your code to indent it. This saves you source code (and your valuable visitors waiting time and your bandwidth).
+
+But if you don't like <pre> or it looks stupid in your browser no matter what styles you try to apply to it or something similar, you might want to use a <div> instead. A <div> will result in more source - GeSHi will have to insert whitespace markup - but in return you can wrap long lines of code that would otherwise have your browser's horizontal scrollbar appear. Of course with <div> you can *not* wrap lines if you please. The highlighter demo at the GeSHi home page uses the <div> approach for this reason.
+
+At this stage there isn't an option to wrap the code in <code> tags (unless you use the function geshi_highlight), partly because of the inconsistent and unexpected ways stuff in <code> tags is highlighted. Besides, <code> is an inline element. But this may become an option in future versions.
+
+As of GeSHi 1.0.7.2 there is a new header type, that specifies that the code should not be wrapped in anything at all.
+
+Another requested addition has been made in GeSHi 1.0.7.20 to force GeSHi to create a block around the highlighted source even if this wasn't necessary, thus styles that are applied to the output of GeSHi can directly influence the code only even if headers and footers are present.
+
+To change/set the header to use, you call the set_header_type() method:
+$geshi->set_header_type(GESHI_HEADER_DIV);
+// or...
+$geshi->set_header_type(GESHI_HEADER_PRE); // or...
+$geshi->set_header_type(GESHI_HEADER_NONE);
+
+Those are the only three arguments you should pass to set_header_type. Passing anything else may cause inconsistencies in what is used as the Code Container (although it *should* simply use a <pre>). Better not to risk it.
+Note:
+
+GESHI_HEADER_DIV, GESHI_HEADER_PRE and GESHI_HEADER_NONE are constants, so don't put them in strings!
+Caution:
+
+The default styles for the <pre> and <div> will be different, especially if you use line numbers!. I have found that a <pre> results in code that is smaller than for that of a <div>, you should rectify this difference by using set_overall_style() if you need to. But be aware of this difference for if you are changing the header type!
+3.2: Line Numbers
+Top | Contents | Next | Previous
+
+GeSHi has the ability to add line numbers to your code (see the demo available at http://qbnz.com/highlighter/demo.php to see what can be achieved). Line numbers are a great way to make your code look professional, especially if you use the fancy line numbers feature.
+3.2.1: Enabling Line Numbers
+Top | Contents | Next | Previous
+
+To highlight a source with line numbers, you call the enable_line_numbers() method:
+$geshi->enable_line_numbers($flag);
+
+Where $flag is one of the following:
+
+ * GESHI_NORMAL_LINE_NUMBERS - Use normal line numbering
+ * GESHI_FANCY_LINE_NUMBERS - Use fancy line numbering
+ * GESHI_NO_LINE_NUMBERS - Disable line numbers (default)
+
+Normal line numbers means you specify a style for them, and that style gets applied to all of them. Fancy line numbers means that you can specify a different style for each nth line number. You change the value of n (default 5):
+$geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS, 37);
+
+The second parameter is not used in any other mode. Setting it to 0 is the same as simply using normal line numbers. Setting it to 1 applies the fancy style to every line number.
+Note:
+
+The values above are CONSTANTS - so don't put them in strings!
+3.2.2 Styling Line Numbers
+Top | Contents | Next | Previous
+
+As of GeSHi 1.0.2, line numbers are added by the use of ordered lists. This solves the old issues of line number styles inheriting from styles meant for the code. Also, this solves an important issue about selecting code. For example, line numbers look nice, but when you go to select the code in your browser to copy it? You got the line numbers too! Not such a good thing, but thankfully this issue is now solved. What is the price? Unfortunately the whole way that styles are inherited/used has changed for those of you who were familiar with 1.0.1, and there is quite a bit more HTML involved. So think carefully about these things before you enable line numbers.
+
+Now, onto how to style line numbers:
+
+Styles are set for line numbers using the set_line_style() method:
+$geshi->set_line_style('background: #fcfcfc;');
+
+If you're using Fancy Line Numbers mode, you pass a second string for the style of the nth line number:
+$geshi->set_line_style('background: #fcfcfc;', 'background: #f0f0f0;');
+
+The second style will have no effect if you're not using Fancy Line Numbers mode.
+
+By default, the styles you pass overwrite the current styles. Add a boolean "true" after the styles you specify to combine them with the current styles:
+$geshi->set_line_style('background: red;', true);
+// or, for fancy line numbers
+$geshi->set_line_style('background: red;', 'background: blue;', true);
+Note:
+
+Due to a bug with Firefox the issue that should have been fixed with 1.0.2 has reappeared in another form as Firefox includes extra text\markup into plaintext versions of webpage copies. This can sometimes be useful (actually it's used to get the plaintext version of this documentation), but more often is quite annoying. Best practice so far is to either not use line numbers, or offer the visitor of your page a plaintext version of your source. To learn more have a look at the SF.net BugTracker Issue #1651996. This will hopefully be fixed in GeSHi version 1.2 or as soon as Firefox provides webdevelopers with adequate ways to control this feature - whichever comes first!
+Caution:
+
+When you set line number styles, the code will inherit those styles! This is the main issue to come out of the 1.0.2 release. If you want your code to be styled in a predictable manner, you'll have to call the set_code_style() method to rectify this problem.
+
+Note also that you cannot apply background colours to line numbers unless you use set_overall_style(). Here's how you'd style:
+
+ 1. Use set_overall_style() to style the overall code block. For example, you can set the border style/colour, any margins and padding etc. using this method. In addition: set the background colour for all the line numbers using this method.
+ 2. Use set_line_style() to style the foreground of the line numbers. For example, you can set the colour, weight, font, padding etc. of the line numbers using this method.
+ 3. Use set_code_style() to explicitly override the styles you set for line numbers using set_line_style. For example, if you'd set the line numbers to be bold (or even if you'd only set the fancy line number style to be bold), and you didn't actually want your code to be bold, you'd make sure that font-weight: normal; was in the stylesheet rule you passed to set_code_style
+
+This is the one major change from GeSHi 1.0.1 - make sure you become familiar with this, and make sure that you check any code you have already styled with 1.0.1 when you upgrade to make sure nothing bad happens to it.
+3.2.3: Choosing a Start Number
+Top | Contents | Next | Previous
+
+As of GeSHi 1.0.2, you can now make the line numbers start at any number, rather than just 1. This feature is useful if you're highlighting code from a file from around a certain line number in that file, as an additional guide to those who will view the code. You set the line numbers by calling the start_line_numbers_at() method:
+$geshi->start_line_numbers_at($number);
+
+$number must be a positive integer (or zero). If it is not, GeSHi will convert it anyway.
+
+If you have not enabled line numbers, this will have no effect.
+Caution:
+
+Although I'd like GeSHi to have XHTML strict compliance, this feature will break compliancy (however transitional compliancy remains). This is because the only widely supported way to change the start value for line numbers is by using the start="number" attribute of the <ol> tag. Although CSS does provide a mechanism for doing this, it is only supported in Opera versions 7.5 and above (not even Firefox supports this).
+3.3: Using CSS Classes
+Top | Contents | Next | Previous
+
+Using CSS to highlight your code instead of in-lining the styles is a definate bonus. Not only is it more compliant (the w3c is deprecating the style attribute in XHTML 2.0) but it results in far less outputted code - up to a whopping 90% saving - which makes a *huge* difference to those unlucky of us on modems!
+3.3.1: Enabling CSS Classes
+Top | Contents | Next | Previous
+
+By default, GeSHi doesn't use the classes, so it's easy just to whack out some highlighted code if you need without worrying about stylesheets. However, if you're a bit more organised about it, you should use the classes ;). To turn the use of classes on, you call the enable_classes() method:
+$geshi->enable_classes();
+
+If you want to turn classes OFF for some reason later:
+$geshi->enable_classes(false);
+
+If classes are enabled when parse_code() is called, then the resultant source will use CSS classes in the output, otherwise it will in-line the styles. The advantages of using classes are great - the reduction in source will be very noticeable, and what's more you can use one stylesheet for several different highlights on the same page. In fact, you can even use an external stylesheet and link to that, saving even more time and source (because stylesheets are cached by browsers).
+Note:
+
+There have been problems with inline styles and the Symbol Highlighting added in 1.0.7.21. If you can you should therefore turn CSS classes ON to avoid those issues.
+Caution:
+
+This should be the very first method you call after creating a new GeSHi object! That way, various other methods can act upon your choice to use classes correctly. In theory, you could call this method just before parsing the code, but this may result in unexpected behaviour.
+3.3.2: Setting the CSS class and ID
+Top | Contents | Next | Previous
+
+You can set an overall CSS class and id for the code. This is a good feature that allows you to use the same stylesheet for many different snippets of code. You call set_overall_class() and set_overall_id to accomplish this:
+$geshi->set_overall_class('mycode');
+$geshi->set_overall_id('dk48ck');
+
+The default classname is the name of the language being used. This means you can use just the one stylesheet for all sources that use the same language, and incidentally means that you probably won't have to call these methods too often.
+
+CSS IDs are supposed to be unique, and you should use them as such. Basically, you can specify an ID for your code and then use that ID to highlight that code in a unique way. You'd do this for a block of code that you expressly wanted to be highlighted in a different way (see the section below on gettting the stylesheet for your code for an example).
+3.3.3: Getting the stylesheet for your code
+Top | Contents | Next | Previous
+
+The other half of using CSS classes is getting the stylesheet for use with the classes. GeSHi makes it very easy to get a stylesheet for your code, with one easy method call:
+$geshi->enable_classes();
+
+// Here we have code that will spit out a header for
+// a stylesheet. For example:
+
+echo '<html>
+<head><title>Code</title>
+<style type="text/css">
+<!--';
+
+// Echo out the stylesheet for this code block
+
+echo $geshi->get_stylesheet();
+
+// And continue echoing the page
+
+echo '-->
+</style></head>
+<body>';
+
+The get_stylesheet() method gets the stylesheet for your code in one easy call. All you need to do is output it in the correct place. As you can also see, you don't even have to enable class usage to get the stylesheet nessecary either - however not enabling classes but using the stylesheet may result in problems later.
+
+By default, get_stylesheet() tries to echo the least amount of code possible. Although currently it doesn't check to see if a certain lexic is even in the source, you can expect this feature in the future. At least for the present however, if you explicitly disable the highlighting of a certain lexic, or disable line numbers, the related CSS will not be outputted. This may be a bad thing for you perhaps you're going to use the stylesheet for many blocks of code, some with line numbers, others with some lexic enabled where this source has it disabled. Or perhaps you're building an external stylesheet and want all lexics included. So to get around this problem, you do this:
+$geshi->get_stylesheet(false);
+
+This turns economy mode off, and all of the stylesheet will be outputted regardless.
+
+Now lets say you have several snippets of code, using the same language. In most of them you don't mind if they're highlighted the same way (in fact, that's exactly what you want) but in one of them you'd like the source to be highlighted differently. Here's how you can do that:
+// assume path is the default "geshi/" relative to the current directory
+$geshi1 = new GeSHi($source1, $lang);
+$geshi2 = new GeSHi($source2, $lang);
+$geshi3 = new GeSHi($source3, $lang);
+
+// Turn classes on for all sources
+$geshi1->enable_classes();
+$geshi2->enable_classes();
+$geshi3->enable_classes();
+
+// Make $geshi3 unique
+$geshi3->set_overall_id('different');
+
+//
+// Methods are called on $geshi3 to change styles...
+//
+
+echo '<html>
+<head><title>Code</title>
+<style type="text/css">
+<!--
+';
+
+// Get the nessecary stylesheets
+echo $geshi1->get_stylesheet();
+echo $geshi3->get_stylesheet();
+
+echo '-->
+</style></head>
+<body>';
+
+
+echo 'Code snippet 1:';
+echo $geshi1->parse_code();
+echo 'Code snippet 2 (same highlighting as 1):';
+echo $geshi2->parse_code();
+echo 'Code snippet 3 (DIFFERENT highlighting):';
+echo $geshi3->parse_code();
+
+echo '</body></html>';
+
+Before version 1.0.2, you needed to set the class of the code you wanted to be unique to the empty string. This limitation has been removed in version 1.0.2 - if you set the ID of a block of code, all styling will be done based on that ID alone.
+3.3.4: Using an External Stylesheet
+Top | Contents | Next | Previous
+
+An external stylesheet can reduce even more the amount of code needed to highlight some source. However there are some drawbacks with this. To use an external stylesheet, it's up to you to link it in to your document, normally with the following HTML:
+<html>
+<head>
+<link rel="stylesheet" type="text/css" href="url_to_stylesheet.css" />
+
+In your external stylesheet you put CSS declarations for your code. Then just make sure you're using the correct class (use set_overall_class() to ensure this) and this should work fine.
+
+This method is great if you don't mind the source always being highlighted the same (in particular, if you're making a plugin for a forum/wiki/other system, using an external stylesheet is a good idea!). It saves a small amount of code and your bandwidth, and it's relatively easy to just change the stylesheet should you need to. However, using this will render the methods that change the styles of the code useless, because of course the stylesheet is no longer being dynamically generated. You can still disable highlighting of certain lexics dynamically, however.
+Note:
+
+As of version 1.0.2, GeSHi comes with a contrib/ directory, which in it contains a "wizard" script for creating a stylesheet. Although this script is by no means a complete solution, it will create the necessary rules for the basic lexics - comments, strings for example. Things not included in the wizard include regular expressions for any language that uses them (PHP and XML are two languages that use them), and keyword-link styles. However, this script should take some of the tedium out of the job of making an external stylesheet. Expect a much better version of this script in version 1.2!
+3.4: Changing Styles
+Top | Contents | Next | Previous
+
+One of the more powerful features of GeSHi is the ability to change the style of the output dynamically. Why be chained to the boring styles the language authors make up? You can change almost every single aspect of highlighted code - and can even say whether something is to be highlighted at all.
+
+If you're confused about "styles", you probably want to have a quick tutorial in them so you know what you can do with them. Checkout the homepage of CSS at http://www.w3.org/Style/CSS.
+3.4.1: The Overall Styles
+Top | Contents | Next | Previous
+
+The code outputted by GeSHi is either in a <div> or a <pre> (see the section entitled "The Code Container"), and this can be styled.
+$geshi->set_overall_style('... styles ...');
+
+Where styles is a string containing valid CSS declarations. By default, these styles overwrite the current styles, but you can change this by adding a second parameter:
+$geshi->set_overall_style('color: blue;', true);
+
+The default styles "shine through" wherever anything isn't highlighted. Also, you can apply more advanced styles, like position: (fixed|relative) etc, because a <div>/<pre> is a block level element.
+Note:
+
+Remember that a <div> will by default have a larger font size than a <pre>, as discussed in the section "The Code Container".
+3.4.2: Line Number Styles
+Top | Contents | Next | Previous
+
+You may wish to refer to the section Styling Line Numbers before reading this section.
+
+As of version 1.0.2, the way line numbers are generated is different, so therefore the way that they are styled is different. In particular, now you cannot set the background style of the fancy line numbers to be different from that of the normal line numbers.
+
+Line number styles are set by using the method set_line_style:
+$geshi->set_line_style($style1, $style2);
+
+$style1 is the style of the line numbers by default, and $style2 is the style of the fancy line numbers.
+Caution:
+
+Things have changed since 1.0.1! This note is very important - please make sure you check this twice before complaining about line numbers!
+
+Because of the way that ordered lists are done in HTML, there really isn't normally a way to style the actual numbers in the list. I've cheated somewhat with GeSHi - I've made it possible to use CSS to style the foreground of the line numbers. So therefore, you can change the color, font size and type, and padding on them. If you want to have a pretty background, you must use set_overall_style() to do this, and use set_code_style() to style the actual code! This is explained in the section above: Styling Line Numbers.
+
+In addition, the styles for fancy line numbers is now the difference between the normal styles and the styles you want to achieve. For example, in GeSHi prior to 1.0.2 you may have done this to style line numbers:
+$geshi->set_line_style('color: red; font-weight: bold;', 'color: green; font-weight: bold');
+
+Now you instead can do this:
+$geshi->set_line_style('color: red; font-weight: bold;', 'color: green;');
+
+The font-weight: bold; will automatically carry through to the fancy styles. This is actually a small saving in code - but the difference may be confusing for anyone using 1.0.1 at first.
+3.4.3: Setting Keyword Styles
+Top | Contents | Next | Previous
+
+Perhaps the most regular change you will make will be to the styles of a keyword set. In order to change the styles for a particular set, you'll have to know what the set is called first. Sets are numbered from 1 up. Typically, set 1 contains keywords like if, while, do, for, switch etc, set 2 contains null, false, true etc, set 3 contains function inbuilt into the language (echo, htmlspecialchars etc. in PHP) and set 4 contains data types and similar variable modifiers: int, double, real, static etc. However these things are not fixed, and you should check the language file to see what key you want. Having a familiarity with a language file is definately a plus for using it.
+
+To change the styles for a keyword set, call the set_keyword_group_style() method:
+$geshi->set_keyword_group_style($group, $styles);
+
+Where $group is the group to change the styles for and $styles is a string containing the styles to apply to that group.
+
+By default, the styles you pass overwrite the current styles. Add a boolean true after the styles you specify to combine them with the current styles:
+$geshi->set_keyword_group_style(3, 'color: white;', true);
+3.4.4: Setting Comment Styles
+Top | Contents | Next | Previous
+
+To change the styles for a comment group, call the set_comments_style() method:
+$geshi->set_comments_style($group, $styles);
+
+Where $group is either a number corresponding to a single-line comment, or the string 'MULTI' to specify multiline comments:
+$geshi->set_comments_style(1, 'font-style: italic;');
+$geshi->set_comments_style('MULTI', 'display: hidden;');
+
+By default, the styles you pass overwrite the current styles. Add a boolean true after the styles you specify to combine them with the current styles:
+$geshi->set_comments_style(1, 'font-weight: 100;', true);
+Note:
+
+In 1.0.7.22 a new kind of Comments called "COMMENT_REGEXP" has been added. Those are handled by setting single line comment styles.
+3.4.5: Setting Other Styles
+Top | Contents | Next | Previous
+
+GeSHi can highlight many other aspects of your source other than just keywords and comments. Strings, Numbers, Methods and Brackets among other things can all also be highlighted. Here are the related methods:
+$geshi->set_escape_characters_style($styles[, $preserve_defaults]);
+$geshi->set_symbols_style($styles[, $preserve_defaults]);
+$geshi->set_strings_style($styles[, $preserve_defaults]);
+$geshi->set_numbers_style($styles[, $preserve_defaults]);
+$geshi->set_methods_style($key, $styles[, $preserve_defaults]);
+$geshi->set_regexps_style($key, $styles[, $preserve_defaults]);
+
+$styles is a string containing valid stylesheet declarations, while $preserve_defaults should be set to true if you want your styles to be merged with the previous styles. In the case of set_methods_style, you should select a group to set the styles of, check the language files for the number used for each "object splitter".
+
+Like this was possible for set_method_style a new parameter has been introduced for set_symbols_style too which allows you to select the group of symbols for which you'd like to change your style. $geshi->set_symbols_style($styles[, $preserve_defaults[, $group]]);
+If the third parameter is not given, group 0 is assumed. Furthermore you should note that any changes to group 0 are also reflected in the bracket style, i.e. a pass-through call to set_bracket_style is made.
+3.5: Case Sensitivity and Auto Casing
+Top | Contents | Next | Previous
+
+Controlling the case of the outputted source is an easy job with GeSHi. You can control which keywords are converted in case, and also control whether keywords are checked in a case sensitive manner.
+3.5.1: Auto-Caps/Nocaps
+Top | Contents | Next | Previous
+
+Auto-Caps/Nocaps is a nifty little feature that capitalises or lowercases automatically certain lexics when they are styled. I dabble in QuickBASIC, a dialect of BASIC which is well known for it's capatalisation, and SQL is another language well known for using caps for readability.
+
+To change what case lexics are rendered in, you call the set_case_keywords() method:
+$geshi->set_case_keywords($caps_modifier);
+
+The valid values to pass to this method are:
+
+ * GESHI_CAPS_NO_CHANGE - Don't change the case of any lexics, leave as they are found
+ * GESHI_CAPS_UPPER - Uppercase all lexics found
+ * GESHI_CAPS_LOWER - Lowercase all lexics found
+
+Caution:
+
+When I say "lexic", I mean "keywords". Any keyword in any keyword array will be modified using this option! This is one small area of inflexibility I hope to fix in 1.2.X.
+
+I suspect this will only be used to specify GESHI_CAPS_NO_CHANGE to turn off autocaps for languages like SQL and BASIC variants, like so:
+$geshi = new GeSHi($source, 'sql');
+$geshi->set_case_keywords(GESHI_CAPS_NO_CHANGE); // don't want keywords capatalised
+
+All the same, it can be used for some interesting effects:
+$geshi = new GeSHi($source, 'java');
+// Anyone who's used java knows how picky it is about CapitalLetters...
+$geshi->set_case_keywords(GESHI_CAPS_LOWER);
+// No *way* the source will look right now ;)
+3.5.2: Setting Case Sensitivity
+Top | Contents | Next | Previous
+
+Some languages, like PHP, don't mind what case function names and keywords are in, while others, like Java, depend on such pickiness to maintain their bad reputations ;). In any event, you can use the set_case_sensitivity to change the case sensitiveness of a particular keyword group from the default:
+$geshi->set_case_sensitivity($key, $sensitivity);
+
+Where $key is the key of the group for which you wish to change case sensitivness for (see the language file for that language), and $sensitivity is a boolean value - true if the keyword is case sensitive, and false if not.
+3.6: Changing the Source, Language, Config Options
+Top | Contents | Next | Previous
+
+What happens if you want to change the source to be highlighted on the fly, or the language. Or if you want to specify any of those basic fields after you've created a GeSHi object? Well, that's where these methods come in.
+3.6.1: Changing the Source Code
+Top | Contents | Next | Previous
+
+To change the source code, you call the set_source() method:
+$geshi->set_source($newsource);
+
+Example:
+$geshi = new GeSHi($source1, 'php');
+
+// Method calls to specify various options...
+
+$code1 = $geshi->parse_code();
+
+$geshi->set_source($source2);
+$code2 = $geshi->parse_code();
+3.6.2: Changing the Language
+Top | Contents | Next | Previous
+
+What happens if you want to change the language used for highlighting? Just call set_language():
+$geshi->set_language('newlanguage');
+
+Example:
+$geshi = new GeSHi($source, 'php');
+
+$code = $geshi->parse_code();
+
+// Highlight GeSHi's output
+$geshi->set_source($code);
+$geshi->set_language('html4strict');
+$geshi->enable_classes(false);
+echo $geshi->parse_code();
+Note:
+
+Names are case-insensitive - they will be converted to lower case to match a language file however. So if you're making a language file, remember it should have a name in lower case.
+Note:
+
+What you pass to this method is the name of a language file, minus the .php extension. If you're writing a plugin for a particular application, it's up to you to somehow convert user input into a valid language name.
+Caution:
+
+GeSHi include()s the language file, so be careful to make sure that users can't pass some wierd language name to include any old script! GeSHi tries to strip non-valid characters out of a language name, but you should always do this your self anyway. In particular, language files are always lower-case, with either alphanumeric characters, dashes or underscores in their name.
+
+At the very least, strip "/" characters out of a language name.
+3.6.3: Changing the Language Path
+Top | Contents | Next | Previous
+
+What happens if all of a sudden you want to use language files from a different directory from the current language file location? You call the set_language_path() method:
+$geshi->set_language_path($newpath);
+
+It doesn't matter whether the path has a trailing slash after it or not - only that it points to a valid folder. If it doesn't, that's your tough luck ;)
+3.6.4: Changing the Character Set
+Top | Contents | Next | Previous
+Note:
+
+As of GeSHi 1.0.7.18, you don't need to use this, as htmlspecialchars is not being used due to a security flaw in it (that is unpatched in even the most recent PHP4 versions, and in PHP5 < 5.2). As long as you set the encoding properly with a php header() call, your foreign characters will be displayed correctly.
+
+As of version 1.0.3, you can use the method set_encoding to specify the character set that your source is in. Valid names are those names that are valid for the PHP function htmlentities():
+$geshi->set_encoding($encoding);
+
+There is a table of valid strings for $encoding at the php.net manual linked to above. If you do not specify an encoding, or specify an invalid encoding, the character set used is ISO-8859-1.
+Using load_from_file to Change the Language and Source Code
+Top | Contents | Next | Previous
+
+As of GeSHi 1.0.5, you can use the method load_from_file to load the source code and language from a file. Simply pass this method a file name and it will attempt to load the source and set the language.
+$geshi->load_from_file($file_name, $lookup);
+
+$file_name is the file name to use, and $lookup is an optional parameter that contains a lookup array to use for deciding which language to choose. You can use this to override GeSHi's default lookup array, which may not contain the extension of the file you're after, or perhaps does have your extension but under a different language. The lookup array is of the form:
+
+array(
+ * 'lang_name' => array('extension', 'extension', ...),
+ * 'lang_name' ...
+ * );
+
+Also, you can use the method get_language_name_from_extension if you need to convert a file extension to a valid language name. This method will return the empty string if it could not find a match in the lookup, and like load_from_file it accepts an optional second parameter that contains a lookup array.
+3.7: Error Handling
+Top | Contents | Next | Previous
+
+What happens if you try to highlight using a language that doesn't exist? Or if GeSHi can't read a required file? The results you get may be confusing. You may check your code over and over, and never find anything wrong. GeSHi provides ways of finding out if GeSHi itself found anything wrong with what you tried to do. After highlighting, you can call the error() method:
+$geshi = new GeSHi('hi', 'thisLangIsNotSupported');
+
+echo $geshi->error(); // echoes error message
+
+The error message you will get will look like this:
+
+ GeSHi Error: GeSHi could not find the language thisLangIsNotSupported (using path geshi/) (code 2)
+
+The error outputted will be the last error GeSHi came across, just like how mysql_error() works.
+3.8: Disabling styling of some Lexics
+Top | Contents | Next | Previous
+
+One disadvantage of GeSHi is that for large source files using complex languages, it can be quite slow with every option turned on. Although future releases will concentrate on the speed/resource side of highlighting, for now you can gain speed increases by disabling some of the highlighting options. This is done by using a series of set_*_highlighting methods:
+
+ * set_keyword_group_highlighting($group, $flag): Sets whether a particular $group of keywords is to be highlighted or not. Consult the necessary language file(s) to see what $group should be for each group (typically a positive integer). $flag is false if you want to disable highlighting of this group, and true if you want to re-enable higlighting of this group. If you disable a keyword group then even if the keyword group has a related URL one will not be generated for that keyword.
+ * set_comments_highlighting($group, $flag): Sets whether a particular $group of comments is to be highlighted or not. Consult the necessary language file(s) to see what $group should be for each group (typically a positive integer, or the string 'MULTI' for multiline comments. $flag is false if you want to disable highlighting of this group, and true if you want to re-enable highlighting of this group.
+ * set_regexps_highlighting($regexp, $flag): Sets whether a particular $regexp is to be highlighted or not. Consult the necessary language file(s) to see what $regexp should be for each regexp (typically a positive integer, or the string 'MULTI' for multiline comments. $flag is false if you want to disable highlighting of this group, and true if you want to re-enable highlighting of this group.
+ * The following methods:
+ o set_escape_characters_highlighting($flag)
+ o set_symbols_highlighting($flag)
+ o set_strings_highlighting($flag)
+ o set_numbers_highlighting($flag)
+ o set_methods_highlighting($flag)
+ Work on their respective lexics (e.g. set_methods_highlighting will disable/enable highlighting of methods). For each method, if $flag is false then the related lexics will not be highlighted at all (this means no HTML will surround the lexic like usual, saving on time and bandwidth.
+
+In case all highlighting should be disabled or reenabled GeSHi provides two methods called disable_highlighting() and enable_highlighting($flag). The optional paramter $flag has been added in 1.0.7.21 and specifies the desired state, i.e. true (default) to turn all highlighting on, or false to turn all highlighting off. Since 1.0.7.21 the method disnable_highlighting() has become deprecated.
+3.9: Setting the Tab Width
+Top | Contents | Next | Previous
+
+If you're using the <pre> header, tabs are handled automatically by your browser, and in general you can count on good results. However, if you're using the <div> header, you may want to specify a tab width explicitly.
+
+Note that tabs created in this fashion won't be like normal tabs - there won't be "tab-stops" as such, instead tabs will be replaced with the specified number of spaces.
+
+To change the tab width, you call the set_tab_width() method:
+$geshi->set_tab_width($width);
+
+Where $width is the width in spaces that you'd like tabs to be.
+3.10: Using Strict Mode
+Top | Contents | Next | Previous
+
+Some languages like to get tricky, and jump in and out of the file that they're in. For example, the vast majority of you reading this will have used a PHP file. And you know that PHP code is only executed if it's within delimiters like <?php and ?> (there are others of course...). So what happens if you do the following in a php file?
+<img src="<?php echo rand(1, 100) ?>" />
+
+Well normally using GeSHi with PHP, or using a bad highlighter, you'll end up with this:
+<img src="<?php echo rand(1, 100) ?>" />
+
+What a mess! Especially if you're being slack about where you're putting your quotes, you could end up with the rest of your file as bright red. Fortunately, you can tell GeSHi to be "strict" about just when it highlights and when it does not, using the enable_strict_mode method:
+$geshi->enable_strict_mode($mode);
+
+Where $mode is true or not specified to enable strict mode, or false to disable strict mode if you've already turned it and don't want it now.
+
+Here's the result: much better!
+<img src="<?php echo rand(1, 100) ?>" />
+3.11: Adding/Removing Keywords
+Top | Contents | Next | Previous
+
+Lets say that you're working on a large project, with many files, many classes and many functions. Perhaps also you have the source code on the web and highlighted by GeSHi, perhaps as a front end to CVS, as a learning tool, something to refer to, whatever. Well, why not highlight the names of the functions and classes *your* project uses, as well as the standard functions and classes? Or perhaps you're not interested in highlighting certain functions, and would like to remove them? Or maybe you don't mind if an entire function group goes west in the interest of speed? GeSHi can handle all of this!
+3.11.1: Adding a Keyword
+Top | Contents | Next | Previous
+
+If you want to add a keyword to an existing keyword group, you use the add_keyword method:
+$geshi->add_keyword($key, $word);
+
+Where $key is the index of the group of keywords you want to add this keyword to, and $word is the word to add.
+
+This implies knowledge of the language file to know the correct index.
+Note:
+
+Keywords should contain at least two alphabetical characters (lower or upper case letters only). This is to enable GeSHi to work much faster by not bothering to try to detect keywords in parts of your source where there is no alphabetical characters.
+3.11.2: Removing a Keyword
+Top | Contents | Next | Previous
+
+Perhaps you want to remove a keyword from an existing group. Maybe you don't use it and want to save yourself some time. Whatever the reason, you can remove it using the remove_keyword method:
+$geshi->remove_keyword($key, $word);
+
+Where $key is the index of the gropu of keywords that you want to remove this keyword from, and $word is the word to remove.
+
+This implies knowledge of the language file to know the correct index - most of the time the keywords you'll want to remove will be in group 3, but this is not guaranteed and you should check the language file first.
+
+This function is silent - if the keyword is not in the group you specified, nothing awful will happen ;)
+3.11.3: Adding a Keyword Group
+Top | Contents | Next | Previous
+
+Lets say for your big project you have several main functions and classes that you'd like highlighted. Why not add them as their own group instead of having them highlighted the same way as other keywords? Then you can make them stand out, and people can instantly see which functions and classes are user defined or inbuilt. Furthermore, you could set the URL for this group to point at the API documentation of your project.
+
+You add a keyword group by using the add_keyword_group method:
+$geshi->add_keyword_group($key, $styles, $case_sensitive, $words);
+
+Where $key is the key that you want to use to refer to this group, $styles is the styles that you want to use to style this group, $case_sensitive is true or false depending on whether you want this group of keywords to be case sensitive or not and $words is an array of words (or a string) of which words to add to this group. For example:
+$geshi->add_keyword_group(10, 'color: #600000;', false, array('myfunc_1', 'myfunc_2', 'myfunc_3'));
+
+Adds a keyword group referenced by index 10, of which all keywords in the group will be dark red, each keyword can be in any case and which contains the keywords "myfunc_1", "myfunc_2" and "myfunc_3".
+
+After creating such a keyword group, you may call other GeSHi methods on it, just as you would for any other keyword group.
+Caution:
+
+If you specify a $key for which there is already a keyword group, the old keyword group will be overwritten! Most language files don't use numbers larger than 5, so I recommend you play it safe and use a number like 10 or 42.
+3.11.4: Removing a Keyword Group
+Top | Contents | Next | Previous
+
+Perhaps you *really* need speed? Why not just remove an entire keyword group? GeSHi won't have to loop through each keyword checking for its existance, saving much time. You remove a keyword group by using the remove_keyword_group method:
+$geshi->remove_keyword_group($key);
+
+Where $key is the key of the group you wish to remove. This implies knowleged of the language file.
+3.12: Headers and Footers for Your Code
+Top | Contents | Next | Previous
+
+So you want to add some special information to the highlighted source? GeSHi can do that too! You can specify headers and footers for your code, style them, and insert information from the highlighted source into your header or footer.
+3.12.1: Keyword Substitution
+Top | Contents | Next | Previous
+
+In your header and footer, you can put special keywords that will be replaced with actual configuration values for this GeSHi object. The keywords you can use are:
+
+ * <TIME> or {TIME}: Is replaced by the time it took for the parse_code method - i.e., how long it took for your code to be highlighted. The time is returned to three decimal places.
+ * <LANGUAGE> or {LANGUAGE}: Is replaced by a nice, friendly version of the language name used to highlight this code.
+ * <VERSION> or {VERSION}: The GeSHi version used to highlight the code.
+
+3.12.2: Setting Header Content
+Top | Contents | Next | Previous
+
+The header for your code is a <div>, which is inside the containing block. Therefore, it is affected by the method set_overall_style, and should contain the sort of HTML that belongs in a <div>. You may use any HTML you like, and format it as an HTML document. You should use valid HTML - convert to entities any quotemarks or angle brackets you want displayed. You set the header content using the method set_header_content:
+$geshi->set_header_content($content);
+
+Where $content is the HTML you want to use for the header.
+3.12.3: Setting Footer Content
+Top | Contents | Next | Previous
+
+The footer for your code is a <div>, which is inside the containing block. Therefore, it is affected by the method set_overall_style, and should contain the sort of HTML that belongs in a <div>. You may use any HTML you like, and format it as an HTML document. You should use valid HTML - convert to entities any quotemarks or angle brackets you want displayed. You set the footer content using the method set_footer_content:
+$geshi->set_footer_content($content);
+
+Where $content is the HTML you want to use for the footer.
+3.12.4: Styling Header Content
+Top | Contents | Next | Previous
+
+You can apply styles to the header content you have set with the set_header_content_style:
+$geshi->set_header_content_style($styles);
+
+Where $styles is the stylesheet declarations you want to use to style the header content.
+3.12.5: Styling Footer Content
+Top | Contents | Next | Previous
+
+You can apply styles to the footer content you have set with the set_footer_content_style:
+$geshi->set_footer_content_style($styles);
+
+Where $styles is the stylesheet declarations you want to use to style the footer content.
+3.13: Keyword URLs
+Top | Contents | Next | Previous
+
+As of version 1.0.2, GeSHi allows you to specify a URL for keyword groups. This URL is used by GeSHi to convert the keywords in that group into URLs to appropriate documentation. And using add_keyword_group you can add functions and classes from your own projects and use the URL functionality to provide a link to your own API documentation.
+3.13.1: Setting a URL for a Keyword Group
+Top | Contents | Next | Previous
+
+To set the URL to be used for a keyword group, you use the set_url_for_keyword_group method:
+$geshi->set_url_for_keyword_group($group, $url);
+
+Where $group is the keyword group you want to assign the URL for, and $url is the URL for this group of keywords.
+
+You may be wondering how to make each keyword in the group point to the correct URL. You do this by putting {FNAME} in the URL at the correct place. For example, PHP makes it easy by linking www.php.net/function-name to the documentation for that function, so the URL used is http://www.php.net/{FNAME}.
+
+Of course, when you get to a language like Java, that puts its class documentation in related folders, it gets a little trickier to work out an appropriate URL (see the Java language file!). I hope to provide some kind of redirection service at the GeSHi website in the future.
+Note:
+
+As of Version 1.0.7.21 there have been added two more symbols you can use to link to functions. {FNAMEL} will generate the lowercase version of the keyword, {FNAMEU} will generate the upper-case version. {FNAME} will provide the keyword as specified in the language file.
+3.13.2: Disabling a URL for a Keyword Group
+Top | Contents | Next | Previous
+
+It's easy to disable a URL for a keyword group: Simply use the method set_url_for_keyword_group to pass an empty string as the URL:
+$geshi->set_url_for_keyword_group($group, '');
+3.13.3 Disabling all URLs for Keywords
+Top | Contents | Next | Previous
+
+As of GeSHi 1.0.7.18, you can disable all URL linking for keywords:
+$geshi->enable_keyword_links(false);
+3.13.4: Styling Links
+Top | Contents | Next | Previous
+
+You can also style the function links. You can style their default status, hovered, active and visited status. All of this is controlled by one method, set_link_styles:
+$geshi->set_link_styles($mode, $styles);
+
+Where $mode is one of four values:
+
+ * GESHI_LINK: The default style of the links.
+ * GESHI_HOVER: The style of the links when they have focus (the mouse is hovering over them).
+ * GESHI_ACTIVE: The style of the links when they are being clicked.
+ * GESHI_VISITED: The style of links that the user has already visited.
+
+And $styles is the stylesheet declarations to apply to the links.
+3.13.5: Setting the Link Target
+Top | Contents | Next | Previous
+
+Perhaps you want to set the target of link attributes, so the manual pages open in a new window? Use the set_link_target method:
+$geshi->set_link_target($target, $styles);
+
+Where $target is any valid (X)HTML target value - _blank or _top for example.
+3.14: Using Contextual Importance
+Top | Contents | Next | Previous
+Caution:
+
+This functionality is not only buggy, but is proving very hard to implement in 1.1.X. Therefore, this functionality may well be removed in 1.2.0. You are hereby warned!
+3.15: Highlighting Special Lines "Extra"
+Top | Contents | Next | Previous
+
+An alternative (and more stable) method of highlighting code that is important is to use extra highlighting by line. Although you may not know what line numbers contain the important lines, if you do this method is a much more flexible way of making important lines stand out.
+3.15.1: Specifying the Lines to Highlight Extra
+Top | Contents | Next | Previous
+
+To specify which lines to highlight extra, you past an array containing the line numbers to highlight_lines_extra:
+$geshi->highlight_lines_extra($array);
+
+The array could be in the form array(2, 3, 4, 7, 12, 344, 4242), made from a DB query, generated from looking through the source for certain important things and working out what line those things are... however you get the line numbers, the array should simply be an array of integers.
+
+Here's an example, using the same source as before:
+//
+// Here we go again! This time we'll simply highlight the 8th line
+//
+$source = 'public int[][] product ( n, m )
+{
+ int [][] ans = new int[n][m];
+ for ( int i = 0; i < n; i++ )
+ {
+ for ( int j = 0; i < m; j++ )
+ {
+ ans[i][j] = i * j;
+ }
+ }
+ return ans;
+}';
+
+$geshi = new GeSHi($source, 'java');
+
+$geshi->highlight_lines_extra(array(8));
+echo $geshi->parse_code();
+
+Which produces:
+public int[][] product ( n, m )
+{
+ int [][] ans = new int[n][m];
+ for ( int i = 0; i < n; i++ )
+ {
+ for ( int j = 0; i < m; j++ )
+ {
+ ans[i][j] = i * j;
+ }
+ }
+ return ans;
+}
+
+What's more, as you can see the code on a highlighted line is still actually highlighted itself.
+Note:
+
+As you can see, this is a little buggy, but that is because of HTML laws (code elements should not contain div elements). This works just fine if you use line numbers.
+3.15.2: Styles for the Highlighted Lines
+Top | Contents | Next | Previous
+
+Again as with contextual importance, you're not chained to the yellow theme that is the default. You can use the set_highlight_lines_extra_style method:
+$geshi->set_highlight_lines_extra_style($styles);
+
+Where $styles is the stylesheet declarations that you want to apply to highlighted lines.
+3.16: Adding IDs to Each Line
+Top | Contents | Next | Previous
+
+Perhaps you're a javascript junkie? GeSHi provides a way to give each line an ID so you can access that line with javascript, or perhaps just by plain CSS (though if you want to access lines by CSS you should use the method in the previous section). To enable IDs you call the enable_ids method:
+$geshi->enable_ids($flag);
+
+Where $flag is true or not present to enable IDs, and false to disable them again if you need.
+
+The ID generated is in the form {overall-css-id}-{line-number}. So for example, if you set the overall CSS id to be "mycode", then the IDs for each line would by "mycode-1", "mycode-2" etc. If there is no CSS ID set, then one is made up in the form geshi-[4 random characters], but this is not so useful for if you want to do javascript manipulation.
+3.17: Getting the Time of Styling
+Top | Contents | Next | Previous
+
+Once you've called parse_code, you can get the time it took to run the highlighting by calling the get_time method:
+$geshi = new GeSHi($source, $language, $path);
+
+$code = mysql_real_escape_string($geshi->parse_code());
+$time = $geshi->get_time();
+
+// do something with it
+mysql_query("INSERT INTO code VALUES ('$code', '$time')");
+4: Language Files
+Top | Contents | Next | Previous
+
+So now you know what features GeSHi offers, and perhaps you've even meddled with the source. Or perhaps you'd like a language file for language X but it doesn't seem to be supported? Rubbish! GeSHi will highlight anything, what do you think I coded this for? ^_^ You'll just have to learn how to make a language file yourself. And I promise it's not too hard - and if you're here you're in the right place!
+4.1: An Example Language File
+Top | Contents | Next | Previous
+
+Let's begin by looking at an example language file - the language file for the first language ever supported, PHP.
+
+<?php
+/*************************************************************************************
+ * php.php
+ * --------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.2
+ * CVS Revision Version: $Revision: 1195 $
+ * Date Started: 2004/06/20
+ * Last Modified: $Date: 2008-06-08 19:44:08 +0200 (So, 08. Jun 2008) $
+ *
+ * PHP language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2004/XX/XX (1.0.2)
+ * - Added URL support
+ * - Added extra constants
+ * 2004/08/05 (1.0.1)
+ * - Added support for symbols
+ * 2004/07/14 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/07/14)
+ * -------------------------
+ * * Make sure the last few function I may have missed
+ * (like eval()) are included for highlighting
+ * * Split to several files - php4, php5 etc
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'PHP',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'include', 'require', 'include_once', 'require_once',
+ 'for', 'foreach', 'as', 'if', 'elseif', 'else', 'while', 'do', 'endwhile', 'endif', 'switch', 'case', 'endswitch',
+ 'return', 'break'
+ ),
+ 2 => array(
+ 'null', '__LINE__', '__FILE__',
+ 'false', '&lt;?php', '?&gt;', '&lt;?',
+ '&lt;script language=', '&lt;/script&gt;',
+ 'true', 'var', 'default',
+ 'function', 'class', 'new',
+ '__FUNCTION__', '__CLASS__', '__METHOD__', 'PHP_VERSION',
+ 'PHP_OS', 'DEFAULT_INCLUDE_PATH', 'PEAR_INSTALL_DIR', 'PEAR_EXTENSION_DIR',
+ 'PHP_EXTENSION_DIR', 'PHP_BINDIR', 'PHP_LIBDIR', 'PHP_DATADIR', 'PHP_SYSCONFDIR',
+ 'PHP_LOCALSTATEDIR', 'PHP_CONFIG_FILE_PATH', 'PHP_OUTPUT_HANDLER_START', 'PHP_OUTPUT_HANDLER_CONT',
+ 'PHP_OUTPUT_HANDLER_END', 'E_ERROR', 'E_WARNING', 'E_PARSE', 'E_NOTICE',
+ 'E_CORE_ERROR', 'E_CORE_WARNING', 'E_COMPILE_ERROR', 'E_COMPILE_WARNING', 'E_USER_ERROR',
+ 'E_USER_WARNING', 'E_USER_NOTICE', 'E_ALL'
+ ),
+ 3 => array(
+ 'zlib_get_coding_type','zend_version','zend_logo_guid','yp_order','yp_next',
+ 'yp_match','yp_master','yp_get_default_domain','yp_first','yp_errno','yp_err_string',
+ 'yp_cat','yp_all','xml_set_unparsed_entity_decl_handler','xml_set_start_namespace_decl_handler','xml_set_processing_instruction_handler','xml_set_object',
+ 'xml_set_notation_decl_handler','xml_set_external_entity_ref_handler','xml_set_end_namespace_decl_handler','xml_set_element_handler','xml_set_default_handler','xml_set_character_data_handler',
+ 'xml_parser_set_option','xml_parser_get_option','xml_parser_free','xml_parser_create_ns','xml_parser_create','xml_parse_into_struct',
+ 'xml_parse','xml_get_error_code','xml_get_current_line_number','xml_get_current_column_number','xml_get_current_byte_index','xml_error_string',
+ 'wordwrap','wddx_serialize_vars','wddx_serialize_value','wddx_packet_start','wddx_packet_end','wddx_deserialize',
+ 'wddx_add_vars','vsprintf','vprintf','virtual','version_compare','var_export',
+ 'var_dump','utf8_encode','utf8_decode','usort','usleep','user_error',
+ 'urlencode','urldecode','unserialize','unregister_tick_function','unpack','unlink',
+ 'unixtojd','uniqid','umask','uksort','ucwords','ucfirst',
+ 'uasort','trim','trigger_error','touch','token_name','token_get_all',
+ 'tmpfile','time','textdomain','tempnam','tanh','tan',
+ 'system','syslog','symlink','substr_replace','substr_count','substr',
+ 'strval','strtr','strtoupper','strtotime','strtolower','strtok',
+ 'strstr','strspn','strrpos','strrev','strrchr','strpos',
+ 'strncmp','strncasecmp','strnatcmp','strnatcasecmp','strlen','stristr',
+ 'stripslashes','stripcslashes','strip_tags','strftime','stream_wrapper_register','stream_set_write_buffer',
+ 'stream_set_timeout','stream_set_blocking','stream_select','stream_register_wrapper','stream_get_meta_data','stream_filter_prepend',
+ 'stream_filter_append','stream_context_set_params','stream_context_set_option','stream_context_get_options','stream_context_create','strcspn',
+ 'strcoll','strcmp','strchr','strcasecmp','str_word_count','str_shuffle',
+ 'str_rot13','str_replace','str_repeat','str_pad','stat','sscanf',
+ 'srand','sqrt','sql_regcase','sprintf','spliti','split',
+ 'soundex','sort','socket_writev','socket_write','socket_strerror','socket_shutdown',
+ 'socket_setopt','socket_set_timeout','socket_set_option','socket_set_nonblock','socket_set_blocking','socket_set_block',
+ 'socket_sendto','socket_sendmsg','socket_send','socket_select','socket_recvmsg','socket_recvfrom',
+ 'socket_recv','socket_readv','socket_read','socket_listen','socket_last_error','socket_iovec_set',
+ 'socket_iovec_free','socket_iovec_fetch','socket_iovec_delete','socket_iovec_alloc','socket_iovec_add','socket_getsockname',
+ 'socket_getpeername','socket_getopt','socket_get_status','socket_get_option','socket_create_pair','socket_create_listen',
+ 'socket_create','socket_connect','socket_close','socket_clear_error','socket_bind','socket_accept',
+ 'sleep','sizeof','sinh','sin','similar_text','shuffle',
+ 'show_source','shmop_write','shmop_size','shmop_read','shmop_open','shmop_delete',
+ 'shmop_close','shm_remove_var','shm_remove','shm_put_var','shm_get_var','shm_detach',
+ 'shm_attach','shell_exec','sha1_file','sha1','settype','setlocale',
+ 'setcookie','set_time_limit','set_socket_blocking','set_magic_quotes_runtime','set_include_path','set_file_buffer',
+ 'set_error_handler','session_write_close','session_unset','session_unregister','session_start','session_set_save_handler',
+ 'session_set_cookie_params','session_save_path','session_register','session_regenerate_id','session_name','session_module_name',
+ 'session_is_registered','session_id','session_get_cookie_params','session_encode','session_destroy','session_decode',
+ 'session_cache_limiter','session_cache_expire','serialize','sem_remove','sem_release','sem_get',
+ 'sem_acquire','rtrim','rsort','round','rmdir','rewinddir',
+ 'rewind','restore_include_path','restore_error_handler','reset','rename','register_tick_function',
+ 'register_shutdown_function','realpath','readlink','readgzfile','readfile','readdir',
+ 'read_exif_data','rawurlencode','rawurldecode','range','rand','rad2deg',
+ 'quotemeta','quoted_printable_decode','putenv','proc_open','proc_close','printf',
+ 'print_r','prev','preg_split','preg_replace_callback','preg_replace','preg_quote',
+ 'preg_match_all','preg_match','preg_grep','pow','posix_uname','posix_ttyname',
+ 'posix_times','posix_strerror','posix_setuid','posix_setsid','posix_setpgid','posix_setgid',
+ 'posix_seteuid','posix_setegid','posix_mkfifo','posix_kill','posix_isatty','posix_getuid',
+ 'posix_getsid','posix_getrlimit','posix_getpwuid','posix_getpwnam','posix_getppid','posix_getpid',
+ 'posix_getpgrp','posix_getpgid','posix_getlogin','posix_getgroups','posix_getgrnam','posix_getgrgid',
+ 'posix_getgid','posix_geteuid','posix_getegid','posix_getcwd','posix_get_last_error','posix_errno',
+ 'posix_ctermid','pos','popen','pi','phpversion','phpinfo',
+ 'phpcredits','php_uname','php_sapi_name','php_logo_guid','php_ini_scanned_files','pg_update',
+ 'pg_untrace','pg_unescape_bytea','pg_tty','pg_trace','pg_setclientencoding','pg_set_client_encoding',
+ 'pg_send_query','pg_select','pg_result_status','pg_result_seek','pg_result_error','pg_result',
+ 'pg_query','pg_put_line','pg_port','pg_ping','pg_pconnect','pg_options',
+ 'pg_numrows','pg_numfields','pg_num_rows','pg_num_fields','pg_meta_data','pg_lowrite',
+ 'pg_lounlink','pg_loreadall','pg_loread','pg_loopen','pg_loimport','pg_loexport',
+ 'pg_locreate','pg_loclose','pg_lo_write','pg_lo_unlink','pg_lo_tell','pg_lo_seek',
+ 'pg_lo_read_all','pg_lo_read','pg_lo_open','pg_lo_import','pg_lo_export','pg_lo_create',
+ 'pg_lo_close','pg_last_oid','pg_last_notice','pg_last_error','pg_insert','pg_host',
+ 'pg_getlastoid','pg_get_result','pg_get_pid','pg_get_notify','pg_freeresult','pg_free_result',
+ 'pg_fieldtype','pg_fieldsize','pg_fieldprtlen','pg_fieldnum','pg_fieldname','pg_fieldisnull',
+ 'pg_field_type','pg_field_size','pg_field_prtlen','pg_field_num','pg_field_name','pg_field_is_null',
+ 'pg_fetch_row','pg_fetch_result','pg_fetch_object','pg_fetch_assoc','pg_fetch_array','pg_fetch_all',
+ 'pg_exec','pg_escape_string','pg_escape_bytea','pg_errormessage','pg_end_copy','pg_delete',
+ 'pg_dbname','pg_copy_to','pg_copy_from','pg_convert','pg_connection_status','pg_connection_reset',
+ 'pg_connection_busy','pg_connect','pg_cmdtuples','pg_close','pg_clientencoding','pg_client_encoding',
+ 'pg_cancel_query','pg_affected_rows','pfsockopen','pclose','pathinfo','passthru',
+ 'parse_url','parse_str','parse_ini_file','pack','overload','output_reset_rewrite_vars',
+ 'output_add_rewrite_var','ord','openssl_x509_read','openssl_x509_parse','openssl_x509_free','openssl_x509_export_to_file',
+ 'openssl_x509_export','openssl_x509_checkpurpose','openssl_x509_check_private_key','openssl_verify','openssl_sign','openssl_seal',
+ 'openssl_public_encrypt','openssl_public_decrypt','openssl_private_encrypt','openssl_private_decrypt','openssl_pkey_new','openssl_pkey_get_public',
+ 'openssl_pkey_get_private','openssl_pkey_free','openssl_pkey_export_to_file','openssl_pkey_export','openssl_pkcs7_verify','openssl_pkcs7_sign',
+ 'openssl_pkcs7_encrypt','openssl_pkcs7_decrypt','openssl_open','openssl_get_publickey','openssl_get_privatekey','openssl_free_key',
+ 'openssl_error_string','openssl_csr_sign','openssl_csr_new','openssl_csr_export_to_file','openssl_csr_export','openlog',
+ 'opendir','octdec','ob_start','ob_list_handlers','ob_implicit_flush','ob_iconv_handler',
+ 'ob_gzhandler','ob_get_status','ob_get_level','ob_get_length','ob_get_flush','ob_get_contents',
+ 'ob_get_clean','ob_flush','ob_end_flush','ob_end_clean','ob_clean','number_format',
+ 'nl_langinfo','nl2br','ngettext','next','natsort','natcasesort',
+ 'mysql_unbuffered_query','mysql_thread_id','mysql_tablename','mysql_table_name','mysql_stat','mysql_selectdb',
+ 'mysql_select_db','mysql_result','mysql_real_escape_string','mysql_query','mysql_ping','mysql_pconnect',
+ 'mysql_numrows','mysql_numfields','mysql_num_rows','mysql_num_fields','mysql_listtables','mysql_listfields',
+ 'mysql_listdbs','mysql_list_tables','mysql_list_processes','mysql_list_fields','mysql_list_dbs','mysql_insert_id',
+ 'mysql_info','mysql_get_server_info','mysql_get_proto_info','mysql_get_host_info','mysql_get_client_info','mysql_freeresult',
+ 'mysql_free_result','mysql_fieldtype','mysql_fieldtable','mysql_fieldname','mysql_fieldlen','mysql_fieldflags',
+ 'mysql_field_type','mysql_field_table','mysql_field_seek','mysql_field_name','mysql_field_len','mysql_field_flags',
+ 'mysql_fetch_row','mysql_fetch_object','mysql_fetch_lengths','mysql_fetch_field','mysql_fetch_assoc','mysql_fetch_array',
+ 'mysql_escape_string','mysql_error','mysql_errno','mysql_dropdb','mysql_drop_db','mysql_dbname',
+ 'mysql_db_query','mysql_db_name','mysql_data_seek','mysql_createdb','mysql_create_db','mysql_connect',
+ 'mysql_close','mysql_client_encoding','mysql_affected_rows','mysql','mt_srand','mt_rand',
+ 'mt_getrandmax','move_uploaded_file','money_format','mktime','mkdir','min',
+ 'microtime','method_exists','metaphone','memory_get_usage','md5_file','md5',
+ 'mbsubstr','mbstrrpos','mbstrpos','mbstrlen','mbstrcut','mbsplit',
+ 'mbregex_encoding','mberegi_replace','mberegi','mbereg_search_setpos','mbereg_search_regs','mbereg_search_pos',
+ 'mbereg_search_init','mbereg_search_getregs','mbereg_search_getpos','mbereg_search','mbereg_replace','mbereg_match',
+ 'mbereg','mb_substr_count','mb_substr','mb_substitute_character','mb_strwidth','mb_strtoupper',
+ 'mb_strtolower','mb_strrpos','mb_strpos','mb_strlen','mb_strimwidth','mb_strcut',
+ 'mb_split','mb_send_mail','mb_regex_set_options','mb_regex_encoding','mb_preferred_mime_name','mb_parse_str',
+ 'mb_output_handler','mb_language','mb_internal_encoding','mb_http_output','mb_http_input','mb_get_info',
+ 'mb_eregi_replace','mb_eregi','mb_ereg_search_setpos','mb_ereg_search_regs','mb_ereg_search_pos','mb_ereg_search_init',
+ 'mb_ereg_search_getregs','mb_ereg_search_getpos','mb_ereg_search','mb_ereg_replace','mb_ereg_match','mb_ereg',
+ 'mb_encode_numericentity','mb_encode_mimeheader','mb_detect_order','mb_detect_encoding','mb_decode_numericentity','mb_decode_mimeheader',
+ 'mb_convert_variables','mb_convert_kana','mb_convert_encoding','mb_convert_case','max','mail',
+ 'magic_quotes_runtime','ltrim','lstat','long2ip','log1p','log10',
+ 'log','localtime','localeconv','linkinfo','link','levenshtein',
+ 'lcg_value','ksort','krsort','key_exists','key','juliantojd',
+ 'join','jewishtojd','jdtounix','jdtojulian','jdtojewish','jdtogregorian',
+ 'jdtofrench','jdmonthname','jddayofweek','is_writeable','is_writable','is_uploaded_file',
+ 'is_subclass_of','is_string','is_scalar','is_resource','is_real','is_readable',
+ 'is_object','is_numeric','is_null','is_nan','is_long','is_link',
+ 'is_integer','is_int','is_infinite','is_float','is_finite','is_file',
+ 'is_executable','is_double','is_dir','is_callable','is_bool','is_array',
+ 'is_a','iptcparse','iptcembed','ip2long','intval','ini_set',
+ 'ini_restore','ini_get_all','ini_get','ini_alter','in_array','import_request_variables',
+ 'implode','image_type_to_mime_type','ignore_user_abort','iconv_set_encoding','iconv_get_encoding','iconv',
+ 'i18n_mime_header_encode','i18n_mime_header_decode','i18n_ja_jp_hantozen','i18n_internal_encoding','i18n_http_output','i18n_http_input',
+ 'i18n_discover_encoding','i18n_convert','hypot','htmlspecialchars','htmlentities','html_entity_decode',
+ 'highlight_string','highlight_file','hexdec','hebrevc','hebrev','headers_sent',
+ 'header','gzwrite','gzuncompress','gztell','gzseek','gzrewind',
+ 'gzread','gzputs','gzpassthru','gzopen','gzinflate','gzgetss',
+ 'gzgets','gzgetc','gzfile','gzeof','gzencode','gzdeflate',
+ 'gzcompress','gzclose','gregoriantojd','gmstrftime','gmmktime','gmdate',
+ 'glob','gettype','gettimeofday','gettext','getservbyport','getservbyname',
+ 'getrusage','getrandmax','getprotobynumber','getprotobyname','getopt','getmyuid',
+ 'getmypid','getmyinode','getmygid','getmxrr','getlastmod','getimagesize',
+ 'gethostbynamel','gethostbyname','gethostbyaddr','getenv','getdate','getcwd',
+ 'getallheaders','get_resource_type','get_required_files','get_parent_class','get_object_vars','get_meta_tags',
+ 'get_magic_quotes_runtime','get_magic_quotes_gpc','get_loaded_extensions','get_included_files','get_include_path','get_html_translation_table',
+ 'get_extension_funcs','get_defined_vars','get_defined_functions','get_defined_constants','get_declared_classes','get_current_user',
+ 'get_class_vars','get_class_methods','get_class','get_cfg_var','get_browser','fwrite',
+ 'function_exists','func_num_args','func_get_args','func_get_arg','ftruncate','ftp_systype',
+ 'ftp_ssl_connect','ftp_size','ftp_site','ftp_set_option','ftp_rmdir','ftp_rename',
+ 'ftp_rawlist','ftp_quit','ftp_pwd','ftp_put','ftp_pasv','ftp_nlist',
+ 'ftp_nb_put','ftp_nb_get','ftp_nb_fput','ftp_nb_fget','ftp_nb_continue','ftp_mkdir',
+ 'ftp_mdtm','ftp_login','ftp_get_option','ftp_get','ftp_fput','ftp_fget',
+ 'ftp_exec','ftp_delete','ftp_connect','ftp_close','ftp_chdir','ftp_cdup',
+ 'ftok','ftell','fstat','fsockopen','fseek','fscanf',
+ 'frenchtojd','fread','fputs','fpassthru','fopen','fnmatch',
+ 'fmod','flush','floor','flock','floatval','filetype',
+ 'filesize','filepro_rowcount','filepro_retrieve','filepro_fieldwidth','filepro_fieldtype','filepro_fieldname',
+ 'filepro_fieldcount','filepro','fileperms','fileowner','filemtime','fileinode',
+ 'filegroup','filectime','fileatime','file_get_contents','file_exists','file',
+ 'fgetss','fgets','fgetcsv','fgetc','fflush','feof',
+ 'fclose','ezmlm_hash','extract','extension_loaded','expm1','explode',
+ 'exp','exif_thumbnail','exif_tagname','exif_read_data','exif_imagetype','exec',
+ 'escapeshellcmd','escapeshellarg','error_reporting','error_log','eregi_replace','eregi',
+ 'ereg_replace','ereg','end','easter_days','easter_date','each',
+ 'doubleval','dngettext','dl','diskfreespace','disk_total_space','disk_free_space',
+ 'dirname','dir','dgettext','deg2rad','defined','define_syslog_variables',
+ 'define','decoct','dechex','decbin','debug_zval_dump','debug_backtrace',
+ 'deaggregate','dcngettext','dcgettext','dba_sync','dba_replace','dba_popen',
+ 'dba_optimize','dba_open','dba_nextkey','dba_list','dba_insert','dba_handlers',
+ 'dba_firstkey','dba_fetch','dba_exists','dba_delete','dba_close','date',
+ 'current','ctype_xdigit','ctype_upper','ctype_space','ctype_punct','ctype_print',
+ 'ctype_lower','ctype_graph','ctype_digit','ctype_cntrl','ctype_alpha','ctype_alnum',
+ 'crypt','create_function','crc32','count_chars','count','cosh',
+ 'cos','copy','convert_cyr_string','constant','connection_status','connection_aborted',
+ 'compact','closelog','closedir','clearstatcache','class_exists','chunk_split',
+ 'chr','chown','chop','chmod','chgrp','checkdnsrr',
+ 'checkdate','chdir','ceil','call_user_method_array','call_user_method','call_user_func_array',
+ 'call_user_func','cal_to_jd','cal_info','cal_from_jd','cal_days_in_month','bzwrite',
+ 'bzread','bzopen','bzflush','bzerrstr','bzerror','bzerrno',
+ 'bzdecompress','bzcompress','bzclose','bindtextdomain','bindec','bind_textdomain_codeset',
+ 'bin2hex','bcsub','bcsqrt','bcscale','bcpow','bcmul',
+ 'bcmod','bcdiv','bccomp','bcadd','basename','base_convert',
+ 'base64_encode','base64_decode','atanh','atan2','atan','assert_options',
+ 'assert','asort','asinh','asin','arsort','array_walk',
+ 'array_values','array_unshift','array_unique','array_sum','array_splice','array_slice',
+ 'array_shift','array_search','array_reverse','array_reduce','array_rand','array_push',
+ 'array_pop','array_pad','array_multisort','array_merge_recursive','array_merge','array_map',
+ 'array_keys','array_key_exists','array_intersect_assoc','array_intersect','array_flip','array_filter',
+ 'array_fill','array_diff_assoc','array_diff','array_count_values','array_chunk','array_change_key_case',
+ 'apache_setenv','apache_response_headers','apache_request_headers','apache_note','apache_lookup_uri','apache_get_version',
+ 'apache_child_terminate','aggregation_info','aggregate_properties_by_regexp','aggregate_properties_by_list','aggregate_properties','aggregate_methods_by_regexp',
+ 'aggregate_methods_by_list','aggregate_methods','aggregate','addslashes','addcslashes','acosh',
+ 'acos','abs','_','echo', 'print', 'global', 'static', 'exit', 'array', 'empty', 'eval', 'isset', 'unset', 'die'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '!', '@', '%', '&', '*', '|', '/', '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.php.net/{FNAME}',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTER' => '-&gt;',
+ 'REGEXPS' => array(
+ 0 => "[\\$]{1,2}[a-zA-Z_][a-zA-Z0-9_]*"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<?php' => '?>'
+ ),
+ 1 => array(
+ '<?' => '?>'
+ ),
+ 2 => array(
+ '<%' => '%>'
+ ),
+ 3 => array(
+ '<script language="php">' => '</script>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ )
+);
+
+?>
+
+If you're remotely familiar with PHP (or even if you're not), you can see that all that a language file consists of is a glorified variable assignment. Easy! All a language file does is assign a variable $language_data. Though still, there's a lot of indices to that array... but this section is here to break each index down and explain it to you.
+4.2: Language File Conventions
+Top | Contents | Next | Previous
+
+There are several conventions that are used in language files. For ease of use and readability, your language files should obey the following rules:
+
+ * Indentation is in tabs, not spaces: Use tabs! There's no excuse for using spaces in this day and age, where almost every good editor allows you to change the tab width. Tabs also take up less space, and ensure proper alignment. When you indent, use tabs, and if your editor converts tabs to spaces, tell it not to.
+ * Strings are in single quotes: Every string in a language file should be in single quotes ('), unless you are specifying a single quote as a quotemark or escape character, in which case they can be in double quotes for readability; or if you are specifying a REGEXP (see below)
+ * Large arrays are multi-lined: An array with more than three or four values should be broken into multiple lines. In any case, lines should not be wider than a full-screen window (about 100 chars per line max).
+ * Ending brackets for multi-lined arrays on a new line: Also with a comma after them, unless the array is the last one in a parent array. See the PHP language file for examples of where to use commas.
+ * Use GeSHi's constants: For capatalisation, regular expressions etc. use the GeSHi constants, not their actual values.
+
+There are more notes on each convention where it may appear in the language file sections below.
+4.3: Language File Sections
+Top | Contents | Next | Previous
+
+This section will look at all the sections of a language file, and how they relate to the final highlighting result.
+4.3.1: The Header
+Top | Contents | Next | Previous
+
+The header of a language file is the first lines with the big comment and the start of the variable $language_data:
+
+<?php
+/*************************************************************************************
+ * <name-of-language-file.php>
+ * ---------------------------------
+ * Author: <name> (<e-mail address>)
+ * Copyright: (c) 2004 <name> (<website URL>)
+ * Release Version: 1.0.0
+ * CVS Revision Version: $Revision: 1195 $
+ * Date Started: <date started>
+ * Last Modified: $Date: 2008-06-08 19:44:08 +0200 (So, 08. Jun 2008) $
+ *
+ * <name-of-language> language file for GeSHi.
+ *
+ * <any-comments...>
+ *
+ * CHANGES
+ * -------
+ * <date-of-release> (1.0.0)
+ * - First Release
+ *
+ * TODO (updated <date-of-release>)
+ * -------------------------
+ * <things-to-do>
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+
+The parts in angle brackets are the parts that you change for your language file. Everything else *must* remain the same!
+
+Here are the parts you should change:
+
+ * <name-of-language-file.php> - This should become the name of your language file. Language file names are in lower case and contain only alphanumeric characters, dashes and underscores. Language files end with .php (which you should put with the name of your language file, eg language.php)
+ * <name> - Your name, or alias.
+ * <e-mail address> - Your e-mail address. If you want your language file included with GeSHi you must include an e-mail address that refers to an inbox controlled by you.
+ * <website> - A URL of a website of yours (perhaps to a page that deals with your contribution to GeSHi, or your home page/blog)
+ * <date-started> - The date you started working on the language file. If you can't remember, guestimate.
+ * <name-of-language> - The name of the language you made this language file for (probably similar to the language file name).
+ * <any-comments> - Any comments you have to make about this language file, perhaps on where you got the keywords for, what dialect of the language this language file is for etc etc. If you don't have any comments, remove the space for them.
+ * <date-of-release - The date you released the language file to the public. If you simply send it to me for inclusion in a new GeSHi and don't release it, leave this blank, and I'll replace it with the date of the GeSHi release that it is first added to.
+
+Everything should remain the same, including $Revision: 1195 $ and $Date: 2008-06-08 19:44:08 +0200 (So, 08. Jun 2008) $ (I know these may look funny but they have their purpose for those of you who don't know about SVN).
+
+Also: I'm not sure about the copyright on a new language file. I'm not a lawyer, could someone contact me about whether the copyright for a new language file should be exclusivly the authors, or joint with me (if included in a GeSHi release)?
+4.3.2: The First Indices
+Top | Contents | Next | Previous
+
+Here is an example from the php language file of the first indices:
+
+ 'LANG_NAME' => 'PHP',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+
+The first indices are the first few lines of a language file before the KEYWORDS index. These indices specify:
+
+ * 'LANG_NAME': The name of the language. This name should be a human-readable version of the name (e.g. HTML 4 (transitional) instead of html4trans)
+ * 'COMMENT_SINGLE': An array of single-line comments in your language, indexed by integers starting from 1. A single line comment is a comment that starts at the marker and goes until the end of the line. These comments may be any length > 0, and since they can be styled individually, can be used for other things than comments (for example the Java language file defines "import" as a single line comment). If you are making a language that uses a ' (apostrophe) as a comment (or in the comment marker somewhere), use double quotes. e.g.: "'"
+ * 'COMMENT_MULTI': Used to specify multiline comments, an array in the form 'OPEN' => 'CLOSE'. Unfortunately, all of these comments you add here will be styled the same way (an area of improvement for GeSHi 1.2.X). These comment markers may be any length > 0.
+ * 'CASE_KEYWORDS': Used to set whether the case of keywords should be changed automatically as they are found. For example, in an SQL or BASIC dialect you may want all keywords to be upper case. The accepted values for this are:
+ o GESHI_CAPS_UPPER: Convert the case of all keywords to upper case.
+ o GESHI_CAPS_LOWER: Convert the case of all keywords to lower case.
+ o GESHI_CAPS_NO_CHANGE: Don't change the case of any keyword.
+ * 'QUOTEMARKS': Specifies the characters that mark the beginning and end of a string. This is another example where if your language includes the ' string delimiter you should use double quotes around it.
+ * 'ESCAPE_CHAR': Specifies the escape character used in all strings. If your language does not have an escape character then make this the empty string (''). This is not an array! If found, any character after an escape character and the escape character itself will be highlighted differently, and the character after the escape character cannot end a string.
+
+4.3.3: Keywords
+Top | Contents | Next | Previous
+
+Keywords will make up the bulk of a language file. In this part you add keywords for your language, including inbuilt functions, data types, predefined constants etc etc.
+
+Here's a (shortened) example from the php language file:
+
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'include', 'require', 'include_once', 'require_once',
+ 'for', 'foreach', 'as', 'if', 'elseif', 'else', 'while', 'do', 'endwhile', 'endif', 'switch', 'case', 'endswitch',
+ 'return', 'break'
+ ),
+ 2 => array(
+ 'null', '__LINE__', '__FILE__',
+ 'false', '<?php', '?>', '<?',
+ '<script language=', '</script>',
+ 'true', 'var', 'default',
+ 'function', 'class', 'new',
+ '__FUNCTION__', '__CLASS__', '__METHOD__', 'PHP_VERSION',
+ 'PHP_OS', 'DEFAULT_INCLUDE_PATH', 'PEAR_INSTALL_DIR', 'PEAR_EXTENSION_DIR',
+ 'PHP_EXTENSION_DIR', 'PHP_BINDIR', 'PHP_LIBDIR', 'PHP_DATADIR', 'PHP_SYSCONFDIR',
+ 'PHP_LOCALSTATEDIR', 'PHP_CONFIG_FILE_PATH', 'PHP_OUTPUT_HANDLER_START', 'PHP_OUTPUT_HANDLER_CONT',
+ 'PHP_OUTPUT_HANDLER_END', 'E_ERROR', 'E_WARNING', 'E_PARSE', 'E_NOTICE',
+ 'E_CORE_ERROR', 'E_CORE_WARNING', 'E_COMPILE_ERROR', 'E_COMPILE_WARNING', 'E_USER_ERROR',
+ 'E_USER_WARNING', 'E_USER_NOTICE', 'E_ALL'
+ ),
+ 3 => array(
+ 'zlib_get_coding_type','zend_version','zend_logo_guid','yp_order','yp_next',
+ 'yp_match','yp_master','yp_get_default_domain','yp_first','yp_errno','yp_err_string',
+ 'yp_cat','yp_all','xml_set_unparsed_entity_decl_handler','xml_set_start_namespace_decl_handler','xml_set_processing_instruction_handler','xml_set_object',
+ 'xml_set_notation_decl_handler','xml_set_external_entity_ref_handler','xml_set_end_namespace_decl_handler','xml_set_element_handler','xml_set_default_handler','xml_set_character_data_handler',
+ 'xml_parser_set_option','xml_parser_get_option','xml_parser_free','xml_parser_create_ns','xml_parser_create','xml_parse_into_struct'
+ )
+ ),
+
+You can see that the index 'KEYWORDS' refers to an array of arrays, indexed by positive integers. In each array, there are some keywords (in the actual php language file there is in fact many more keywords in the array indexed by 3). Here are some points to note about these keywords:
+
+ * Indexed by positive integers: Use nothing else! I may change this in 1.2.X, but for the 1.0.X series, use positive integers only.
+ * Keywords sorted in reverse: Keywords *should* be sorted in reverse order. I know that many of the language files I've made do not follow this rule, but that's because I made the files before I discovered the following issue with GeSHi: If you have two keywords, as and ascfor example, then when GeSHi encounters the "as" keyword it will be highlighted even if the "as" is part of "asc". I would get GeSHi to reverse-sort keyword arrays, but there's no harm in you doing this yourself and saving some processing time. At the least (and in fact this is sufficient) you should swap any keywords you come across that would be caught by this issue.
+ * Keywords are case sensitive (sometimes): If your language is case-sensitive, the correct casing of the keywords is defined as the case of the keywords in these keyword arrays. If you check the java language file you will see that everything is in exact casing. So if any of these keyword arrays are case sensitive, put the keywords in as their correct case! (note that which groups are case sensitive and which are not is configurable, see later on)
+ * Keywords must be in htmlentities() form: All keywords should be written as if they had been run through the php function htmlentities(). E.g, the keyword is &lt;foo&gt;, not <foo>
+ * Don't use keywords to highlight symbols: Just don't. It doesn't work, and there will be seperate support for symbols later.
+ * Markup Languages are special cases: Check the html4strict language file for an example: keywords have to be specified twice for opening tags and twice for each closing tag.
+
+4.3.4: Symbols and Case Sensitivity
+Top | Contents | Next | Previous
+
+So you've put all the keywords for your language in? Now for a breather before we style them :). Symbols define what symbols your language uses, these are things like colons, brackets/braces, and other such general punctuation, and case sensitivity alludes to the previous section: here you can set which keyword groups are case sensitive.
+
+As of GeSHi version 1.0.7.21 the symbols section is used in two ways:
+
+ * Flat usage:
+ This mode is the suggested way for existing language files and languages that only need few symbols where no further differentiation is needed or desired. You simply put all the characters in an array under symbols as shown in the first example below. All symbols in flat usage belong to symbol style group 0.
+ * Group usage:
+ This is a slightly more enhanced way to provide GeSHi symbol information. To use group you create several subarrays each containing only a subset of the symbols to highlight. Every array will need to have an unique index thus you can assign the appropriate styles later.
+
+Here's an example for flat symbol usage
+
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '!', '@', '|', '&', '+', '-', '*', '/', '%', '=', '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+
+which is not too different from the newly introduced group usage shown below:
+
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '[', ']', '{', '}'),
+ 1 => array('!', '@', '|', '&'),
+ 2 => array('+', '-', '*', '/', '%'),
+ 3 => array('=', '<', '>')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+
+ * 'SYMBOLS': An array of the symbols, or - as of 1.0.7.21 - an array of symbol groups, used in your language. Please note that versions before 1.0.7.21 will silently ignore this setting.
+ * 'CASE_SENSITIVE': Note the GESHI_COMMENTS! This is used to set whether comments are case sensitive or not (for example, BASIC has the REM statement which while not being case sensitive is still alphanumeric, and as in the example given before about the Java language file using "import" as a single line comment, this can be useful sometimes. true if comments are case sensitive, false otherwise. All of the other indices correspond to indices in the 'KEYWORDS' section (see above).
+
+4.3.5: Styles for your Language File
+Top | Contents | Next | Previous
+
+This is the fun part! Here you get to choose the colours, fonts, backgrounds and anything else you'd like for your language file.
+
+Here's an example:
+
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ )
+ ),
+
+Note that all style rules should end with a semi-colon! This is important: GeSHi may add extra rules to the rules you specify (and will do so if a user tries to change your styles on the fly), so the last semi-colon in any stylesheet rule is important.
+
+All strings here should contain valid stylesheet declarations (it's also find to have the empty string).
+
+ * 'KEYWORDS': This is an array, from keyword index to style. The index you use is the index you used in the keywords section to specify the keywords belonging to that group.
+ * 'COMMENTS': This is an array, from single-line comment index to style for that index. The index 'MULTI' is used for multiline comments (and cannot be an array)
+ * 'ESCAPE_CHAR' down to 'SYMBOLS': These are arrays with only one index: 0. You cannot add other indices to these arrays.
+ * 'REGEXPS':This is an array with a style for each matching regex. Also, since 1.0.7.21, you can specify the name of a function to be called, that will be given the text matched by the regex, each time a match is found. Note that my testing found that create_function would not work with this due to a PHP bug, so you have to put the function definition at the top of the language file. Be sure to prefix the function name with geshi_[languagename]_ as to not conflict with other functions!
+ * 'SCRIPT': For languages that use script delimiters, this is where you can style each block of script. For example, HTML and XML have blocks that begin with < and end with > (i.e. tags) and blocks that begin with & and end with ; (i.e. character entities), and you can set a style to apply to each whole block. You specify the delimiters for the blocks below. Note that many languages will not need this feature.
+
+4.3.6: URLs for Functions
+Top | Contents | Next | Previous
+
+This section lets you specify a url to visit for each keyword group. Useful for pointing functions at their online manual entries.
+
+Here is an example:
+
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.php.net/{FNAME}',
+ 4 => ''
+ ),
+
+The indices of this array correspond to the keyword groups you specified in the keywords section. The string {FNAME} marks where the name of the function is substituted in. So for the example above, if the keyword being highlighted is "echo", then the keyword will be a URL pointing to http://www.php.net/echo. Because some languages (Java!) don't keep a uniform URL for functions/classes, you may have trouble in creating a URL for that language (though look in the java language file for a novel solution to it's problem)
+4.3.7: Object Orientation Support
+Top | Contents | Next | Previous
+
+Now we're reaching the most little-used section of a language file, which includes such goodies as object orientation support and context support. GeSHi can highlight methods and data fields of objects easily, all you need to do is to tell it to do so and what the "splitter" is between object/method etc.
+
+Here's an example:
+
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTER' => '->',
+
+If your language has object orientation, the value of 'OOLANG' is true, otherwise it is false. If it is object orientated, in the 'OBJECT_SPLITTER' value you put the htmlentities() version of the "splitter" between objects and methods/fields. If it is not, then make this the empty string.
+4.3.8: Using Regular Expressions
+Top | Contents | Next | Previous
+
+Regular expressions are a good way to catch any other lexic that fits certain rules but can't be listed as a keyword. A good example is variables in PHP: variables always start with either one or two "$" signs, then alphanumeric characters (a simplification). This is easy to catch with regular expressions.
+
+And new to version 1.0.2, there is an advanced way of using regular expressions to catch certain things but highlight only part of those things. This is particularly useful for languages like XML.
+Caution:
+
+Regular expressions use the PCRE syntax (perl-style), not the ereg() style!
+
+Here is an example (this time the PHP file merged with the XML file):
+
+ 0 => array(
+ GESHI_SEARCH => '(((xml:)?[a-z\-]+))(=)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '\\4'
+ ),
+ 1 => array(
+ GESHI_SEARCH => '(>/?[a-z0-9]*(>)?)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 2 => "[\\$]{1,2}[a-zA-Z_][a-zA-Z0-9_]*"
+
+As you can see there are two formats. One is the "simple" format used in GeSHi < 1.0.2, and the other is a more advanced syntax. Firstly, the simple syntax:
+
+ * May be in double quotes: To make it easier for those who always place their regular expressions in double quotes, you may place any regular expression here in double quotes if you wish.
+ * Don't use curly brackets where possible: If you want to use curly brackets (()) then by all means give it a try, but I'm not sure whether under some circumstances GeSHi may throw a wobbly. You have been warned! If you want to use brackets, it would be better to use the advanced syntax.
+ * Don't use the "everything" regex: (That's the .*? regex). Use advanced syntax instead.
+
+And now for advanced syntax, which gives you much more control over exactly what is highlighted:
+
+ * GESHI_SEARCH: This element specifies the regular expression to search for. If you plan to capture the output, use brackets (()). See how in the first example above, most of the regular expression is in one set of brackets (with the equals sign in other brackets). You should make sure that the part of the regular expression that is supposed to match what is highlighted is in brackets.
+ * GESHI_REPLACE: This is what the stuff matched by the regular expression will be replaced with. If you've grouped the stuff you want highlighted into brackets in the GESHI_SEARCH element, then you can use \\number to match that group, where number is a number corresponding to how many open brackets are between the open bracket of the group you want highlighted and the start of the GESHI_SEARCH string + 1. This may sound confusing, and it probably is, but if you're familiar with how PHP's regular expressions work you should understand. In the example above, the opening bracket for the stuff we want highlighted is the very first bracket in the string, so the number of brackets before that bracket and the start of the string is 0. So we add 1 and get our replacement string of \\1 (whew!).
+
+ If you didn't understand a word of that, make sure that there are brackets around the string in GESHI_SEARCH and use \\1 for GESHI_REPLACE ;)
+ * GESHI_MODIFIERS: Specify modifiers for your regular expression. If your regular expression includes the everything matcher (.*?), then your modifiers should include "s" and "i" (e.g. use 'si' for this).
+ * GESHI_BEFORE:Specifies a bracket group that should appear before the highlighted match (this bracketed group will not be highlighted). Use this if you had to match what you wanted by matching part of your regexp string to something before what you wanted to highlight, and you don't want that part to disappear in the highlighted result.
+ * GESHI_AFTER:Specifies a bracket group that should appear after the highlighted match (this bracketed group will not be highlighted). Use this if you had to match what you wanted by matching part of your regexp string to something after what you wanted to highlight, and you don't want that part to disappear in the highlighted result.
+
+Is that totally confusing? Here's the test for if you're an android or not: If you found that perfectly understandable then you're an android ;). Here's a better example:
+
+Let's say that I'm making a language, and variables in this language always start with a dollar sign ($), are always written in lowercase letters and always end with an ampersand (&). eg:
+$foo& = 'bar'
+
+I want to highlight only the text between the $ and the &. How do I do that? With simple regular expressions I can't, but with advanced, it's relatively easy:
+
+ 1 => array(
+ GESHI_SEARCH => '(\$)([a-z]+)(&)', // search for a dollar sign, then one or more of the characters a-z, then an ampersand
+ GESHI_REPLACE => '\\2', // we wanna highlight the characters, which are in the second bracketed group
+ GESHI_MODIFIERS => '', // no modifiers, since we're not matching the "anything" regex
+ GESHI_BEFORE => '\\1', // before the highlighted characters should be the first bracketed group (always a dollar sign in this example)
+ GESHI_AFTER => '\\3' // after the highlighted characters should be the third bracketed group (always an ampersand in this example)
+ ),
+
+So if someone tried to highlight using my language, all cases of $foo& would turn into:
+$<span style="color: blue;">foo</span>&
+
+(which would of course be viewed in a browser to get something like $foo&)
+4.3.9: Contextual Highlighting and Strict Mode
+Top | Contents | Next | Previous
+
+For languages like HTML, it's good if we can highlight a tag (like <a> for example). But how do we stop every single "a" in the source getting highlighted? What about for attributes? If I've got the word "colspan" in my text I don't want that highlighted! So how do you tell GeSHi not to highlight in that case? You do it with "Strict Blocks".
+
+Here is an example:
+
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<?php' => '?>'
+ ),
+ 1 => array(
+ '<?' => '?>'
+ ),
+ 2 => array(
+ '<%' => '%>'
+ ),
+ 3 => array(
+ '<script language="php">' => '</script>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ )
+
+What is strict mode? Strict mode says that highlighting only occurs inside the blocks you specify. You can see from the example above that highlighting will only occur if the source is inside <?php ... ?> (though note the GESHI_MAYBE!). Here are some points about strict highlighting:
+
+ * 'STRICT_MODE_APPLIES': This takes three values (all constants):
+ o GESHI_ALWAYS: Strict mode always applies for all of the blocks you specify. Users of your language file cannot turn strict mode off. This should be used for markup languages.
+ o GESHI_NEVER: Strict mode is never used. Users of your language file cannot turn strict mode on. Use this value if there is no such thing as a block of code that would not be highlighted in your language (most languages, like C, Java etc. use this because anything in a C file should be highlighted).
+ o GESHI_MAYBE: Strict mode *sometimes* applies. It defaults to "off". Users can turn strict mode on if they please. If strict mode is off then everything in the source will be highlighted, even things outside the strict block markers. If strict mode is on the nothing outside strict block markers will be highlighted.
+ * SCRIPT_DELIMITERS: This is an array of script delimiters, in the format of the above. The indices are use in the 'SCRIPT' part of the styles section for highlighting everything in a strict block in a certain way. For example, you could set up your language file to make the background yellow of any code inside a strict block this way. The delimiters are in the form 'OPEN' => 'CLOSE'. Delimiters can be of any length > 0. Delimiters are not formatted as if they were run through htmlentities()!
+ * 'HIGHLIGHT_STRICT_BLOCK': specifies whether any highlighting should go on inside each block. Most of the time this should be true, but for example, in the XML language file highlighting is turned off for blocks beginning with <!DOCTYPE and ending with >. However, you can still style the overall block using the method described above, and the XML language file does just that.
+
+Note:
+
+The delimiters should be in reverse alphabetical order. Note that in the above example, <?php comes before <?.
+4.3.10: Tidying Up
+Top | Contents | Next | Previous
+
+All language files should end with:
+
+);
+
+?>
+
+5: Method/Constant Reference
+Top | Contents | Next | Previous
+
+I'm afraid I have been lying for a little while about this now! Since 1.0.7 I have been including a phpdoc API for the sourcecode in the api directory, but have forgot to update the documentation! However, it is available, and may assist you in coding, especially for plugin coders.
+
+That's all, folks!
+
+I've improved the documentation greatly from version 1.0.1, but there may still be problems with it, or it may still be confusing for you. Or perhaps I was just plain wrong about one point! If so, contact me and I'll do my best to sort it out.
+
+In case you were wondering, I've finished development of the 1.0.X thread of GeSHi. The only releases I'll make in this thread will be of the bug-fix/add language files type. In particular, version 1.0.2 was a "concept" release - testing how far I could take the highlighting idea (as well as ideas from others).
+
+I'm planning a code rewrite for 1.2.X, which will be based on a new engine - a "psuedo-tokenizer" engine. Hopefully it will massively reduce the server load and time taken (by almost eliminating regexps), while providing superior highlighting. But fear not! The interface and method names should all remain the same ^_^ (though I can't say the same for language files!)
+
+And finally, a couple of people have been asking me: how did you generate that documentation? The amazing answer is: my brain. And yes, it took a long time, and I don't reccommend doing it this way. And yes, you can borrow the styles if you like, though flick me an e-mail if you do.
+
+Anyway, enough blather from me. Get GeSHi working for you already! :D
+
+Nigel McNie
+nigel@geshi.org
+http://qbnz.com/highlighter/
+
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/docs/phpdoc.ini b/extensions/SyntaxHighlight_GeSHi/geshi/docs/phpdoc.ini
new file mode 100644
index 00000000..a55bc337
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/docs/phpdoc.ini
@@ -0,0 +1,90 @@
+;; phpDocumentor parse configuration file
+;;
+;; This file is designed to cut down on repetitive typing on the command-line or web interface
+;; You can copy this file to create a number of configuration files that can be used with the
+;; command-line switch -c, as in phpdoc -c default.ini or phpdoc -c myini.ini. The web
+;; interface will automatically generate a list of .ini files that can be used.
+;;
+;; default.ini is used to generate the online manual at http://www.phpdoc.org/docs
+;;
+;; ALL .ini files must be in the user subdirectory of phpDocumentor with an extension of .ini
+;;
+;; Copyright 2002, Greg Beaver <cellog@users.sourceforge.net>
+;;
+;; WARNING: do not change the name of any command-line parameters, phpDocumentor will ignore them
+
+[Parse Data]
+;; title of all the documentation
+;; legal values: any string
+title = GeSHi 1.0.8
+
+;; parse files that start with a . like .bash_profile
+;; legal values: true, false
+hidden = false
+
+;; show elements marked @access private in documentation by setting this to on
+;; legal values: on, off
+parseprivate = off
+
+;; parse with javadoc-like description (first sentence is always the short description)
+;; legal values: on, off
+javadocdesc = off
+
+;; add any custom @tags separated by commas here
+;; legal values: any legal tagname separated by commas.
+customtags = note
+
+;; This is only used by the XML:DocBook/peardoc2 converter
+defaultcategoryname = Documentation
+
+;; what is the main package?
+;; legal values: alphanumeric string plus - and _
+defaultpackagename = core
+
+;; output any parsing information? set to on for cron jobs
+;; legal values: on
+;quiet = on
+
+;; parse a PEAR-style repository. Do not turn this on if your project does
+;; not have a parent directory named "pear"
+;; legal values: on/off
+;pear = on
+
+;; where should the documentation be written?
+;; legal values: a legal path
+target = api
+
+;; limit output to the specified packages, even if others are parsed
+;; legal values: package names separated by commas
+;packageoutput = package1,package2
+
+;; comma-separated list of files to parse
+;; legal values: paths separated by commas
+filename = ../geshi.php
+
+;; comma-separated list of directories to parse
+;; legal values: directory paths separated by commas
+;directory = /path1,/path2,.,..,subdirectory
+;directory = /home/jeichorn/cvs/pear
+;directory = geshi
+
+;; template base directory (the equivalent directory of <installdir>/phpDocumentor)
+;templatebase = /path/to/my/templates
+
+;; comma-separated list of files, directories or wildcards ? and * (any wildcard) to ignore
+;; legal values: any wildcard strings separated by commas
+;ignore = /path/to/ignore*,*list.php,myfile.php,subdirectory/
+ignore = /*.svn/*
+
+;; comma-separated list of Converters to use in outputformat:Convertername:templatedirectory format
+;; legal values: HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib,
+;; HTML:frames:earthli,
+;; HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de,
+;; HTML:frames:DOM/phphtmllib,HTML:frames:DOM/earthli
+;; HTML:Smarty:default,HTML:Smarty:PHP,HTML:Smarty:HandS
+;; PDF:default:default,CHM:default:default,XML:DocBook/peardoc2:default
+output=HTML:frames:earthli
+
+;; turn this option on if you want highlighted source code for every file
+;; legal values: on/off
+sourcecode = on
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php
new file mode 100644
index 00000000..60741577
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php
@@ -0,0 +1,4775 @@
+<?php
+/**
+ * GeSHi - Generic Syntax Highlighter
+ *
+ * The GeSHi class for Generic Syntax Highlighting. Please refer to the
+ * documentation at http://qbnz.com/highlighter/documentation.php for more
+ * information about how to use this class.
+ *
+ * For changes, release notes, TODOs etc, see the relevant files in the docs/
+ * directory.
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * @package geshi
+ * @subpackage core
+ * @author Nigel McNie <nigel@geshi.org>, Benny Baumann <BenBE@omorphia.de>
+ * @copyright (C) 2004 - 2007 Nigel McNie, (C) 2007 - 2008 Benny Baumann
+ * @license http://gnu.org/copyleft/gpl.html GNU GPL
+ *
+ */
+
+//
+// GeSHi Constants
+// You should use these constant names in your programs instead of
+// their values - you never know when a value may change in a future
+// version
+//
+
+/** The version of this GeSHi file */
+define('GESHI_VERSION', '1.0.8.11');
+
+// Define the root directory for the GeSHi code tree
+if (!defined('GESHI_ROOT')) {
+ /** The root directory for GeSHi */
+ define('GESHI_ROOT', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+}
+/** The language file directory for GeSHi
+ @access private */
+define('GESHI_LANG_ROOT', GESHI_ROOT . 'geshi' . DIRECTORY_SEPARATOR);
+
+// Define if GeSHi should be paranoid about security
+if (!defined('GESHI_SECURITY_PARANOID')) {
+ /** Tells GeSHi to be paranoid about security settings */
+ define('GESHI_SECURITY_PARANOID', false);
+}
+
+// Line numbers - use with enable_line_numbers()
+/** Use no line numbers when building the result */
+define('GESHI_NO_LINE_NUMBERS', 0);
+/** Use normal line numbers when building the result */
+define('GESHI_NORMAL_LINE_NUMBERS', 1);
+/** Use fancy line numbers when building the result */
+define('GESHI_FANCY_LINE_NUMBERS', 2);
+
+// Container HTML type
+/** Use nothing to surround the source */
+define('GESHI_HEADER_NONE', 0);
+/** Use a "div" to surround the source */
+define('GESHI_HEADER_DIV', 1);
+/** Use a "pre" to surround the source */
+define('GESHI_HEADER_PRE', 2);
+/** Use a pre to wrap lines when line numbers are enabled or to wrap the whole code. */
+define('GESHI_HEADER_PRE_VALID', 3);
+/**
+ * Use a "table" to surround the source:
+ *
+ * <table>
+ * <thead><tr><td colspan="2">$header</td></tr></thead>
+ * <tbody><tr><td><pre>$linenumbers</pre></td><td><pre>$code></pre></td></tr></tbody>
+ * <tfooter><tr><td colspan="2">$footer</td></tr></tfoot>
+ * </table>
+ *
+ * this is essentially only a workaround for Firefox, see sf#1651996 or take a look at
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=365805
+ * @note when linenumbers are disabled this is essentially the same as GESHI_HEADER_PRE
+ */
+define('GESHI_HEADER_PRE_TABLE', 4);
+
+// Capatalisation constants
+/** Lowercase keywords found */
+define('GESHI_CAPS_NO_CHANGE', 0);
+/** Uppercase keywords found */
+define('GESHI_CAPS_UPPER', 1);
+/** Leave keywords found as the case that they are */
+define('GESHI_CAPS_LOWER', 2);
+
+// Link style constants
+/** Links in the source in the :link state */
+define('GESHI_LINK', 0);
+/** Links in the source in the :hover state */
+define('GESHI_HOVER', 1);
+/** Links in the source in the :active state */
+define('GESHI_ACTIVE', 2);
+/** Links in the source in the :visited state */
+define('GESHI_VISITED', 3);
+
+// Important string starter/finisher
+// Note that if you change these, they should be as-is: i.e., don't
+// write them as if they had been run through htmlentities()
+/** The starter for important parts of the source */
+define('GESHI_START_IMPORTANT', '<BEGIN GeSHi>');
+/** The ender for important parts of the source */
+define('GESHI_END_IMPORTANT', '<END GeSHi>');
+
+/**#@+
+ * @access private
+ */
+// When strict mode applies for a language
+/** Strict mode never applies (this is the most common) */
+define('GESHI_NEVER', 0);
+/** Strict mode *might* apply, and can be enabled or
+ disabled by {@link GeSHi->enable_strict_mode()} */
+define('GESHI_MAYBE', 1);
+/** Strict mode always applies */
+define('GESHI_ALWAYS', 2);
+
+// Advanced regexp handling constants, used in language files
+/** The key of the regex array defining what to search for */
+define('GESHI_SEARCH', 0);
+/** The key of the regex array defining what bracket group in a
+ matched search to use as a replacement */
+define('GESHI_REPLACE', 1);
+/** The key of the regex array defining any modifiers to the regular expression */
+define('GESHI_MODIFIERS', 2);
+/** The key of the regex array defining what bracket group in a
+ matched search to put before the replacement */
+define('GESHI_BEFORE', 3);
+/** The key of the regex array defining what bracket group in a
+ matched search to put after the replacement */
+define('GESHI_AFTER', 4);
+/** The key of the regex array defining a custom keyword to use
+ for this regexp's html tag class */
+define('GESHI_CLASS', 5);
+
+/** Used in language files to mark comments */
+define('GESHI_COMMENTS', 0);
+
+/** Used to work around missing PHP features **/
+define('GESHI_PHP_PRE_433', !(version_compare(PHP_VERSION, '4.3.3') === 1));
+
+/** make sure we can call stripos **/
+if (!function_exists('stripos')) {
+ // the offset param of preg_match is not supported below PHP 4.3.3
+ if (GESHI_PHP_PRE_433) {
+ /**
+ * @ignore
+ */
+ function stripos($haystack, $needle, $offset = null) {
+ if (!is_null($offset)) {
+ $haystack = substr($haystack, $offset);
+ }
+ if (preg_match('/'. preg_quote($needle, '/') . '/', $haystack, $match, PREG_OFFSET_CAPTURE)) {
+ return $match[0][1];
+ }
+ return false;
+ }
+ }
+ else {
+ /**
+ * @ignore
+ */
+ function stripos($haystack, $needle, $offset = null) {
+ if (preg_match('/'. preg_quote($needle, '/') . '/', $haystack, $match, PREG_OFFSET_CAPTURE, $offset)) {
+ return $match[0][1];
+ }
+ return false;
+ }
+ }
+}
+
+/** some old PHP / PCRE subpatterns only support up to xxx subpatterns in
+ regular expressions. Set this to false if your PCRE lib is up to date
+ @see GeSHi->optimize_regexp_list()
+ **/
+define('GESHI_MAX_PCRE_SUBPATTERNS', 500);
+/** it's also important not to generate too long regular expressions
+ be generous here... but keep in mind, that when reaching this limit we
+ still have to close open patterns. 12k should do just fine on a 16k limit.
+ @see GeSHi->optimize_regexp_list()
+ **/
+define('GESHI_MAX_PCRE_LENGTH', 12288);
+
+//Number format specification
+/** Basic number format for integers */
+define('GESHI_NUMBER_INT_BASIC', 1); //Default integers \d+
+/** Enhanced number format for integers like seen in C */
+define('GESHI_NUMBER_INT_CSTYLE', 2); //Default C-Style \d+[lL]?
+/** Number format to highlight binary numbers with a suffix "b" */
+define('GESHI_NUMBER_BIN_SUFFIX', 16); //[01]+[bB]
+/** Number format to highlight binary numbers with a prefix % */
+define('GESHI_NUMBER_BIN_PREFIX_PERCENT', 32); //%[01]+
+/** Number format to highlight binary numbers with a prefix 0b (C) */
+define('GESHI_NUMBER_BIN_PREFIX_0B', 64); //0b[01]+
+/** Number format to highlight octal numbers with a leading zero */
+define('GESHI_NUMBER_OCT_PREFIX', 256); //0[0-7]+
+/** Number format to highlight octal numbers with a prefix 0o (logtalk) */
+define('GESHI_NUMBER_OCT_PREFIX_0O', 512); //0[0-7]+
+/** Number format to highlight octal numbers with a leading @ (Used in HiSofts Devpac series). */
+define('GESHI_NUMBER_OCT_PREFIX_AT', 1024); //@[0-7]+
+/** Number format to highlight octal numbers with a suffix of o */
+define('GESHI_NUMBER_OCT_SUFFIX', 2048); //[0-7]+[oO]
+/** Number format to highlight hex numbers with a prefix 0x */
+define('GESHI_NUMBER_HEX_PREFIX', 4096); //0x[0-9a-fA-F]+
+/** Number format to highlight hex numbers with a prefix $ */
+define('GESHI_NUMBER_HEX_PREFIX_DOLLAR', 8192); //$[0-9a-fA-F]+
+/** Number format to highlight hex numbers with a suffix of h */
+define('GESHI_NUMBER_HEX_SUFFIX', 16384); //[0-9][0-9a-fA-F]*h
+/** Number format to highlight floating-point numbers without support for scientific notation */
+define('GESHI_NUMBER_FLT_NONSCI', 65536); //\d+\.\d+
+/** Number format to highlight floating-point numbers without support for scientific notation */
+define('GESHI_NUMBER_FLT_NONSCI_F', 131072); //\d+(\.\d+)?f
+/** Number format to highlight floating-point numbers with support for scientific notation (E) and optional leading zero */
+define('GESHI_NUMBER_FLT_SCI_SHORT', 262144); //\.\d+e\d+
+/** Number format to highlight floating-point numbers with support for scientific notation (E) and required leading digit */
+define('GESHI_NUMBER_FLT_SCI_ZERO', 524288); //\d+(\.\d+)?e\d+
+//Custom formats are passed by RX array
+
+// Error detection - use these to analyse faults
+/** No sourcecode to highlight was specified
+ * @deprecated
+ */
+define('GESHI_ERROR_NO_INPUT', 1);
+/** The language specified does not exist */
+define('GESHI_ERROR_NO_SUCH_LANG', 2);
+/** GeSHi could not open a file for reading (generally a language file) */
+define('GESHI_ERROR_FILE_NOT_READABLE', 3);
+/** The header type passed to {@link GeSHi->set_header_type()} was invalid */
+define('GESHI_ERROR_INVALID_HEADER_TYPE', 4);
+/** The line number type passed to {@link GeSHi->enable_line_numbers()} was invalid */
+define('GESHI_ERROR_INVALID_LINE_NUMBER_TYPE', 5);
+/**#@-*/
+
+
+/**
+ * The GeSHi Class.
+ *
+ * Please refer to the documentation for GeSHi 1.0.X that is available
+ * at http://qbnz.com/highlighter/documentation.php for more information
+ * about how to use this class.
+ *
+ * @package geshi
+ * @author Nigel McNie <nigel@geshi.org>, Benny Baumann <BenBE@omorphia.de>
+ * @copyright (C) 2004 - 2007 Nigel McNie, (C) 2007 - 2008 Benny Baumann
+ */
+class GeSHi {
+ /**#@+
+ * @access private
+ */
+ /**
+ * The source code to highlight
+ * @var string
+ */
+ var $source = '';
+
+ /**
+ * The language to use when highlighting
+ * @var string
+ */
+ var $language = '';
+
+ /**
+ * The data for the language used
+ * @var array
+ */
+ var $language_data = array();
+
+ /**
+ * The path to the language files
+ * @var string
+ */
+ var $language_path = GESHI_LANG_ROOT;
+
+ /**
+ * The error message associated with an error
+ * @var string
+ * @todo check err reporting works
+ */
+ var $error = false;
+
+ /**
+ * Possible error messages
+ * @var array
+ */
+ var $error_messages = array(
+ GESHI_ERROR_NO_SUCH_LANG => 'GeSHi could not find the language {LANGUAGE} (using path {PATH})',
+ GESHI_ERROR_FILE_NOT_READABLE => 'The file specified for load_from_file was not readable',
+ GESHI_ERROR_INVALID_HEADER_TYPE => 'The header type specified is invalid',
+ GESHI_ERROR_INVALID_LINE_NUMBER_TYPE => 'The line number type specified is invalid'
+ );
+
+ /**
+ * Whether highlighting is strict or not
+ * @var boolean
+ */
+ var $strict_mode = false;
+
+ /**
+ * Whether to use CSS classes in output
+ * @var boolean
+ */
+ var $use_classes = false;
+
+ /**
+ * The type of header to use. Can be one of the following
+ * values:
+ *
+ * - GESHI_HEADER_PRE: Source is outputted in a "pre" HTML element.
+ * - GESHI_HEADER_DIV: Source is outputted in a "div" HTML element.
+ * - GESHI_HEADER_NONE: No header is outputted.
+ *
+ * @var int
+ */
+ var $header_type = GESHI_HEADER_PRE;
+
+ /**
+ * Array of permissions for which lexics should be highlighted
+ * @var array
+ */
+ var $lexic_permissions = array(
+ 'KEYWORDS' => array(),
+ 'COMMENTS' => array('MULTI' => true),
+ 'REGEXPS' => array(),
+ 'ESCAPE_CHAR' => true,
+ 'BRACKETS' => true,
+ 'SYMBOLS' => false,
+ 'STRINGS' => true,
+ 'NUMBERS' => true,
+ 'METHODS' => true,
+ 'SCRIPT' => true
+ );
+
+ /**
+ * The time it took to parse the code
+ * @var double
+ */
+ var $time = 0;
+
+ /**
+ * The content of the header block
+ * @var string
+ */
+ var $header_content = '';
+
+ /**
+ * The content of the footer block
+ * @var string
+ */
+ var $footer_content = '';
+
+ /**
+ * The style of the header block
+ * @var string
+ */
+ var $header_content_style = '';
+
+ /**
+ * The style of the footer block
+ * @var string
+ */
+ var $footer_content_style = '';
+
+ /**
+ * Tells if a block around the highlighted source should be forced
+ * if not using line numbering
+ * @var boolean
+ */
+ var $force_code_block = false;
+
+ /**
+ * The styles for hyperlinks in the code
+ * @var array
+ */
+ var $link_styles = array();
+
+ /**
+ * Whether important blocks should be recognised or not
+ * @var boolean
+ * @deprecated
+ * @todo REMOVE THIS FUNCTIONALITY!
+ */
+ var $enable_important_blocks = false;
+
+ /**
+ * Styles for important parts of the code
+ * @var string
+ * @deprecated
+ * @todo As above - rethink the whole idea of important blocks as it is buggy and
+ * will be hard to implement in 1.2
+ */
+ var $important_styles = 'font-weight: bold; color: red;'; // Styles for important parts of the code
+
+ /**
+ * Whether CSS IDs should be added to the code
+ * @var boolean
+ */
+ var $add_ids = false;
+
+ /**
+ * Lines that should be highlighted extra
+ * @var array
+ */
+ var $highlight_extra_lines = array();
+
+ /**
+ * Styles of lines that should be highlighted extra
+ * @var array
+ */
+ var $highlight_extra_lines_styles = array();
+
+ /**
+ * Styles of extra-highlighted lines
+ * @var string
+ */
+ var $highlight_extra_lines_style = 'background-color: #ffc;';
+
+ /**
+ * The line ending
+ * If null, nl2br() will be used on the result string.
+ * Otherwise, all instances of \n will be replaced with $line_ending
+ * @var string
+ */
+ var $line_ending = null;
+
+ /**
+ * Number at which line numbers should start at
+ * @var int
+ */
+ var $line_numbers_start = 1;
+
+ /**
+ * The overall style for this code block
+ * @var string
+ */
+ var $overall_style = 'font-family:monospace;';
+
+ /**
+ * The style for the actual code
+ * @var string
+ */
+ var $code_style = 'font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;';
+
+ /**
+ * The overall class for this code block
+ * @var string
+ */
+ var $overall_class = '';
+
+ /**
+ * The overall ID for this code block
+ * @var string
+ */
+ var $overall_id = '';
+
+ /**
+ * Line number styles
+ * @var string
+ */
+ var $line_style1 = 'font-weight: normal; vertical-align:top;';
+
+ /**
+ * Line number styles for fancy lines
+ * @var string
+ */
+ var $line_style2 = 'font-weight: bold; vertical-align:top;';
+
+ /**
+ * Style for line numbers when GESHI_HEADER_PRE_TABLE is chosen
+ * @var string
+ */
+ var $table_linenumber_style = 'width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;';
+
+ /**
+ * Flag for how line numbers are displayed
+ * @var boolean
+ */
+ var $line_numbers = GESHI_NO_LINE_NUMBERS;
+
+ /**
+ * Flag to decide if multi line spans are allowed. Set it to false to make sure
+ * each tag is closed before and reopened after each linefeed.
+ * @var boolean
+ */
+ var $allow_multiline_span = true;
+
+ /**
+ * The "nth" value for fancy line highlighting
+ * @var int
+ */
+ var $line_nth_row = 0;
+
+ /**
+ * The size of tab stops
+ * @var int
+ */
+ var $tab_width = 8;
+
+ /**
+ * Should we use language-defined tab stop widths?
+ * @var int
+ */
+ var $use_language_tab_width = false;
+
+ /**
+ * Default target for keyword links
+ * @var string
+ */
+ var $link_target = '';
+
+ /**
+ * The encoding to use for entity encoding
+ * NOTE: Used with Escape Char Sequences to fix UTF-8 handling (cf. SF#2037598)
+ * @var string
+ */
+ var $encoding = 'utf-8';
+
+ /**
+ * Should keywords be linked?
+ * @var boolean
+ */
+ var $keyword_links = true;
+
+ /**
+ * Currently loaded language file
+ * @var string
+ * @since 1.0.7.22
+ */
+ var $loaded_language = '';
+
+ /**
+ * Wether the caches needed for parsing are built or not
+ *
+ * @var bool
+ * @since 1.0.8
+ */
+ var $parse_cache_built = false;
+
+ /**
+ * Work around for Suhosin Patch with disabled /e modifier
+ *
+ * Note from suhosins author in config file:
+ * <blockquote>
+ * The /e modifier inside <code>preg_replace()</code> allows code execution.
+ * Often it is the cause for remote code execution exploits. It is wise to
+ * deactivate this feature and test where in the application it is used.
+ * The developer using the /e modifier should be made aware that he should
+ * use <code>preg_replace_callback()</code> instead
+ * </blockquote>
+ *
+ * @var array
+ * @since 1.0.8
+ */
+ var $_kw_replace_group = 0;
+ var $_rx_key = 0;
+
+ /**
+ * some "callback parameters" for handle_multiline_regexps
+ *
+ * @since 1.0.8
+ * @access private
+ * @var string
+ */
+ var $_hmr_before = '';
+ var $_hmr_replace = '';
+ var $_hmr_after = '';
+ var $_hmr_key = 0;
+
+ /**#@-*/
+
+ /**
+ * Creates a new GeSHi object, with source and language
+ *
+ * @param string The source code to highlight
+ * @param string The language to highlight the source with
+ * @param string The path to the language file directory. <b>This
+ * is deprecated!</b> I've backported the auto path
+ * detection from the 1.1.X dev branch, so now it
+ * should be automatically set correctly. If you have
+ * renamed the language directory however, you will
+ * still need to set the path using this parameter or
+ * {@link GeSHi->set_language_path()}
+ * @since 1.0.0
+ */
+ function GeSHi($source = '', $language = '', $path = '') {
+ if ($source !== '') {
+ $this->set_source($source);
+ }
+ if ($language !== '') {
+ $this->set_language($language);
+ }
+ $this->set_language_path($path);
+ }
+
+ /**
+ * Returns the version of GeSHi
+ *
+ * @return string
+ * @since 1 0.8.11
+ */
+ function get_version()
+ {
+ return GESHI_VERSION;
+ }
+
+ /**
+ * Returns an error message associated with the last GeSHi operation,
+ * or false if no error has occured
+ *
+ * @return string|false An error message if there has been an error, else false
+ * @since 1.0.0
+ */
+ function error() {
+ if ($this->error) {
+ //Put some template variables for debugging here ...
+ $debug_tpl_vars = array(
+ '{LANGUAGE}' => $this->language,
+ '{PATH}' => $this->language_path
+ );
+ $msg = str_replace(
+ array_keys($debug_tpl_vars),
+ array_values($debug_tpl_vars),
+ $this->error_messages[$this->error]);
+
+ return "<br /><strong>GeSHi Error:</strong> $msg (code {$this->error})<br />";
+ }
+ return false;
+ }
+
+ /**
+ * Gets a human-readable language name (thanks to Simon Patterson
+ * for the idea :))
+ *
+ * @return string The name for the current language
+ * @since 1.0.2
+ */
+ function get_language_name() {
+ if (GESHI_ERROR_NO_SUCH_LANG == $this->error) {
+ return $this->language_data['LANG_NAME'] . ' (Unknown Language)';
+ }
+ return $this->language_data['LANG_NAME'];
+ }
+
+ /**
+ * Sets the source code for this object
+ *
+ * @param string The source code to highlight
+ * @since 1.0.0
+ */
+ function set_source($source) {
+ $this->source = $source;
+ $this->highlight_extra_lines = array();
+ }
+
+ /**
+ * Sets the language for this object
+ *
+ * @note since 1.0.8 this function won't reset language-settings by default anymore!
+ * if you need this set $force_reset = true
+ *
+ * @param string The name of the language to use
+ * @since 1.0.0
+ */
+ function set_language($language, $force_reset = false) {
+ if ($force_reset) {
+ $this->loaded_language = false;
+ }
+
+ //Clean up the language name to prevent malicious code injection
+ $language = preg_replace('#[^a-zA-Z0-9\-_]#', '', $language);
+
+ $language = strtolower($language);
+
+ //Retreive the full filename
+ $file_name = $this->language_path . $language . '.php';
+ if ($file_name == $this->loaded_language) {
+ // this language is already loaded!
+ return;
+ }
+
+ $this->language = $language;
+
+ $this->error = false;
+ $this->strict_mode = GESHI_NEVER;
+
+ //Check if we can read the desired file
+ if (!is_readable($file_name)) {
+ $this->error = GESHI_ERROR_NO_SUCH_LANG;
+ return;
+ }
+
+ // Load the language for parsing
+ $this->load_language($file_name);
+ }
+
+ /**
+ * Sets the path to the directory containing the language files. Note
+ * that this path is relative to the directory of the script that included
+ * geshi.php, NOT geshi.php itself.
+ *
+ * @param string The path to the language directory
+ * @since 1.0.0
+ * @deprecated The path to the language files should now be automatically
+ * detected, so this method should no longer be needed. The
+ * 1.1.X branch handles manual setting of the path differently
+ * so this method will disappear in 1.2.0.
+ */
+ function set_language_path($path) {
+ if(strpos($path,':')) {
+ //Security Fix to prevent external directories using fopen wrappers.
+ if(DIRECTORY_SEPARATOR == "\\") {
+ if(!preg_match('#^[a-zA-Z]:#', $path) || false !== strpos($path, ':', 2)) {
+ return;
+ }
+ } else {
+ return;
+ }
+ }
+ if(preg_match('#[^/a-zA-Z0-9_\.\-\\\s:]#', $path)) {
+ //Security Fix to prevent external directories using fopen wrappers.
+ return;
+ }
+ if(GESHI_SECURITY_PARANOID && false !== strpos($path, '/.')) {
+ //Security Fix to prevent external directories using fopen wrappers.
+ return;
+ }
+ if(GESHI_SECURITY_PARANOID && false !== strpos($path, '..')) {
+ //Security Fix to prevent external directories using fopen wrappers.
+ return;
+ }
+ if ($path) {
+ $this->language_path = ('/' == $path[strlen($path) - 1]) ? $path : $path . '/';
+ $this->set_language($this->language); // otherwise set_language_path has no effect
+ }
+ }
+
+ /**
+ * Get supported langs or an associative array lang=>full_name.
+ * @param boolean $longnames
+ * @return array
+ */
+ function get_supported_languages($full_names=false)
+ {
+ // return array
+ $back = array();
+
+ // we walk the lang root
+ $dir = dir($this->language_path);
+
+ // foreach entry
+ while (false !== ($entry = $dir->read()))
+ {
+ $full_path = $this->language_path.$entry;
+
+ // Skip all dirs
+ if (is_dir($full_path)) {
+ continue;
+ }
+
+ // we only want lang.php files
+ if (!preg_match('/^([^.]+)\.php$/', $entry, $matches)) {
+ continue;
+ }
+
+ // Raw lang name is here
+ $langname = $matches[1];
+
+ // We want the fullname too?
+ if ($full_names === true)
+ {
+ if (false !== ($fullname = $this->get_language_fullname($langname)))
+ {
+ $back[$langname] = $fullname; // we go associative
+ }
+ }
+ else
+ {
+ // just store raw langname
+ $back[] = $langname;
+ }
+ }
+
+ $dir->close();
+
+ return $back;
+ }
+
+ /**
+ * Get full_name for a lang or false.
+ * @param string $language short langname (html4strict for example)
+ * @return mixed
+ */
+ function get_language_fullname($language)
+ {
+ //Clean up the language name to prevent malicious code injection
+ $language = preg_replace('#[^a-zA-Z0-9\-_]#', '', $language);
+
+ $language = strtolower($language);
+
+ // get fullpath-filename for a langname
+ $fullpath = $this->language_path.$language.'.php';
+
+ // we need to get contents :S
+ if (false === ($data = file_get_contents($fullpath))) {
+ $this->error = sprintf('Geshi::get_lang_fullname() Unknown Language: %s', $language);
+ return false;
+ }
+
+ // match the langname
+ if (!preg_match('/\'LANG_NAME\'\s*=>\s*\'((?:[^\']|\\\')+?)\'/', $data, $matches)) {
+ $this->error = sprintf('Geshi::get_lang_fullname(%s): Regex can not detect language', $language);
+ return false;
+ }
+
+ // return fullname for langname
+ return stripcslashes($matches[1]);
+ }
+
+ /**
+ * Sets the type of header to be used.
+ *
+ * If GESHI_HEADER_DIV is used, the code is surrounded in a "div".This
+ * means more source code but more control over tab width and line-wrapping.
+ * GESHI_HEADER_PRE means that a "pre" is used - less source, but less
+ * control. Default is GESHI_HEADER_PRE.
+ *
+ * From 1.0.7.2, you can use GESHI_HEADER_NONE to specify that no header code
+ * should be outputted.
+ *
+ * @param int The type of header to be used
+ * @since 1.0.0
+ */
+ function set_header_type($type) {
+ //Check if we got a valid header type
+ if (!in_array($type, array(GESHI_HEADER_NONE, GESHI_HEADER_DIV,
+ GESHI_HEADER_PRE, GESHI_HEADER_PRE_VALID, GESHI_HEADER_PRE_TABLE))) {
+ $this->error = GESHI_ERROR_INVALID_HEADER_TYPE;
+ return;
+ }
+
+ //Set that new header type
+ $this->header_type = $type;
+ }
+
+ /**
+ * Sets the styles for the code that will be outputted
+ * when this object is parsed. The style should be a
+ * string of valid stylesheet declarations
+ *
+ * @param string The overall style for the outputted code block
+ * @param boolean Whether to merge the styles with the current styles or not
+ * @since 1.0.0
+ */
+ function set_overall_style($style, $preserve_defaults = false) {
+ if (!$preserve_defaults) {
+ $this->overall_style = $style;
+ } else {
+ $this->overall_style .= $style;
+ }
+ }
+
+ /**
+ * Sets the overall classname for this block of code. This
+ * class can then be used in a stylesheet to style this object's
+ * output
+ *
+ * @param string The class name to use for this block of code
+ * @since 1.0.0
+ */
+ function set_overall_class($class) {
+ $this->overall_class = $class;
+ }
+
+ /**
+ * Sets the overall id for this block of code. This id can then
+ * be used in a stylesheet to style this object's output
+ *
+ * @param string The ID to use for this block of code
+ * @since 1.0.0
+ */
+ function set_overall_id($id) {
+ $this->overall_id = $id;
+ }
+
+ /**
+ * Sets whether CSS classes should be used to highlight the source. Default
+ * is off, calling this method with no arguments will turn it on
+ *
+ * @param boolean Whether to turn classes on or not
+ * @since 1.0.0
+ */
+ function enable_classes($flag = true) {
+ $this->use_classes = ($flag) ? true : false;
+ }
+
+ /**
+ * Sets the style for the actual code. This should be a string
+ * containing valid stylesheet declarations. If $preserve_defaults is
+ * true, then styles are merged with the default styles, with the
+ * user defined styles having priority
+ *
+ * Note: Use this method to override any style changes you made to
+ * the line numbers if you are using line numbers, else the line of
+ * code will have the same style as the line number! Consult the
+ * GeSHi documentation for more information about this.
+ *
+ * @param string The style to use for actual code
+ * @param boolean Whether to merge the current styles with the new styles
+ * @since 1.0.2
+ */
+ function set_code_style($style, $preserve_defaults = false) {
+ if (!$preserve_defaults) {
+ $this->code_style = $style;
+ } else {
+ $this->code_style .= $style;
+ }
+ }
+
+ /**
+ * Sets the styles for the line numbers.
+ *
+ * @param string The style for the line numbers that are "normal"
+ * @param string|boolean If a string, this is the style of the line
+ * numbers that are "fancy", otherwise if boolean then this
+ * defines whether the normal styles should be merged with the
+ * new normal styles or not
+ * @param boolean If set, is the flag for whether to merge the "fancy"
+ * styles with the current styles or not
+ * @since 1.0.2
+ */
+ function set_line_style($style1, $style2 = '', $preserve_defaults = false) {
+ //Check if we got 2 or three parameters
+ if (is_bool($style2)) {
+ $preserve_defaults = $style2;
+ $style2 = '';
+ }
+
+ //Actually set the new styles
+ if (!$preserve_defaults) {
+ $this->line_style1 = $style1;
+ $this->line_style2 = $style2;
+ } else {
+ $this->line_style1 .= $style1;
+ $this->line_style2 .= $style2;
+ }
+ }
+
+ /**
+ * Sets whether line numbers should be displayed.
+ *
+ * Valid values for the first parameter are:
+ *
+ * - GESHI_NO_LINE_NUMBERS: Line numbers will not be displayed
+ * - GESHI_NORMAL_LINE_NUMBERS: Line numbers will be displayed
+ * - GESHI_FANCY_LINE_NUMBERS: Fancy line numbers will be displayed
+ *
+ * For fancy line numbers, the second parameter is used to signal which lines
+ * are to be fancy. For example, if the value of this parameter is 5 then every
+ * 5th line will be fancy.
+ *
+ * @param int How line numbers should be displayed
+ * @param int Defines which lines are fancy
+ * @since 1.0.0
+ */
+ function enable_line_numbers($flag, $nth_row = 5) {
+ if (GESHI_NO_LINE_NUMBERS != $flag && GESHI_NORMAL_LINE_NUMBERS != $flag
+ && GESHI_FANCY_LINE_NUMBERS != $flag) {
+ $this->error = GESHI_ERROR_INVALID_LINE_NUMBER_TYPE;
+ }
+ $this->line_numbers = $flag;
+ $this->line_nth_row = $nth_row;
+ }
+
+ /**
+ * Sets wether spans and other HTML markup generated by GeSHi can
+ * span over multiple lines or not. Defaults to true to reduce overhead.
+ * Set it to false if you want to manipulate the output or manually display
+ * the code in an ordered list.
+ *
+ * @param boolean Wether multiline spans are allowed or not
+ * @since 1.0.7.22
+ */
+ function enable_multiline_span($flag) {
+ $this->allow_multiline_span = (bool) $flag;
+ }
+
+ /**
+ * Get current setting for multiline spans, see GeSHi->enable_multiline_span().
+ *
+ * @see enable_multiline_span
+ * @return bool
+ */
+ function get_multiline_span() {
+ return $this->allow_multiline_span;
+ }
+
+ /**
+ * Sets the style for a keyword group. If $preserve_defaults is
+ * true, then styles are merged with the default styles, with the
+ * user defined styles having priority
+ *
+ * @param int The key of the keyword group to change the styles of
+ * @param string The style to make the keywords
+ * @param boolean Whether to merge the new styles with the old or just
+ * to overwrite them
+ * @since 1.0.0
+ */
+ function set_keyword_group_style($key, $style, $preserve_defaults = false) {
+ //Set the style for this keyword group
+ if (!$preserve_defaults) {
+ $this->language_data['STYLES']['KEYWORDS'][$key] = $style;
+ } else {
+ $this->language_data['STYLES']['KEYWORDS'][$key] .= $style;
+ }
+
+ //Update the lexic permissions
+ if (!isset($this->lexic_permissions['KEYWORDS'][$key])) {
+ $this->lexic_permissions['KEYWORDS'][$key] = true;
+ }
+ }
+
+ /**
+ * Turns highlighting on/off for a keyword group
+ *
+ * @param int The key of the keyword group to turn on or off
+ * @param boolean Whether to turn highlighting for that group on or off
+ * @since 1.0.0
+ */
+ function set_keyword_group_highlighting($key, $flag = true) {
+ $this->lexic_permissions['KEYWORDS'][$key] = ($flag) ? true : false;
+ }
+
+ /**
+ * Sets the styles for comment groups. If $preserve_defaults is
+ * true, then styles are merged with the default styles, with the
+ * user defined styles having priority
+ *
+ * @param int The key of the comment group to change the styles of
+ * @param string The style to make the comments
+ * @param boolean Whether to merge the new styles with the old or just
+ * to overwrite them
+ * @since 1.0.0
+ */
+ function set_comments_style($key, $style, $preserve_defaults = false) {
+ if (!$preserve_defaults) {
+ $this->language_data['STYLES']['COMMENTS'][$key] = $style;
+ } else {
+ $this->language_data['STYLES']['COMMENTS'][$key] .= $style;
+ }
+ }
+
+ /**
+ * Turns highlighting on/off for comment groups
+ *
+ * @param int The key of the comment group to turn on or off
+ * @param boolean Whether to turn highlighting for that group on or off
+ * @since 1.0.0
+ */
+ function set_comments_highlighting($key, $flag = true) {
+ $this->lexic_permissions['COMMENTS'][$key] = ($flag) ? true : false;
+ }
+
+ /**
+ * Sets the styles for escaped characters. If $preserve_defaults is
+ * true, then styles are merged with the default styles, with the
+ * user defined styles having priority
+ *
+ * @param string The style to make the escape characters
+ * @param boolean Whether to merge the new styles with the old or just
+ * to overwrite them
+ * @since 1.0.0
+ */
+ function set_escape_characters_style($style, $preserve_defaults = false, $group = 0) {
+ if (!$preserve_defaults) {
+ $this->language_data['STYLES']['ESCAPE_CHAR'][$group] = $style;
+ } else {
+ $this->language_data['STYLES']['ESCAPE_CHAR'][$group] .= $style;
+ }
+ }
+
+ /**
+ * Turns highlighting on/off for escaped characters
+ *
+ * @param boolean Whether to turn highlighting for escape characters on or off
+ * @since 1.0.0
+ */
+ function set_escape_characters_highlighting($flag = true) {
+ $this->lexic_permissions['ESCAPE_CHAR'] = ($flag) ? true : false;
+ }
+
+ /**
+ * Sets the styles for brackets. If $preserve_defaults is
+ * true, then styles are merged with the default styles, with the
+ * user defined styles having priority
+ *
+ * This method is DEPRECATED: use set_symbols_style instead.
+ * This method will be removed in 1.2.X
+ *
+ * @param string The style to make the brackets
+ * @param boolean Whether to merge the new styles with the old or just
+ * to overwrite them
+ * @since 1.0.0
+ * @deprecated In favour of set_symbols_style
+ */
+ function set_brackets_style($style, $preserve_defaults = false) {
+ if (!$preserve_defaults) {
+ $this->language_data['STYLES']['BRACKETS'][0] = $style;
+ } else {
+ $this->language_data['STYLES']['BRACKETS'][0] .= $style;
+ }
+ }
+
+ /**
+ * Turns highlighting on/off for brackets
+ *
+ * This method is DEPRECATED: use set_symbols_highlighting instead.
+ * This method will be remove in 1.2.X
+ *
+ * @param boolean Whether to turn highlighting for brackets on or off
+ * @since 1.0.0
+ * @deprecated In favour of set_symbols_highlighting
+ */
+ function set_brackets_highlighting($flag) {
+ $this->lexic_permissions['BRACKETS'] = ($flag) ? true : false;
+ }
+
+ /**
+ * Sets the styles for symbols. If $preserve_defaults is
+ * true, then styles are merged with the default styles, with the
+ * user defined styles having priority
+ *
+ * @param string The style to make the symbols
+ * @param boolean Whether to merge the new styles with the old or just
+ * to overwrite them
+ * @param int Tells the group of symbols for which style should be set.
+ * @since 1.0.1
+ */
+ function set_symbols_style($style, $preserve_defaults = false, $group = 0) {
+ // Update the style of symbols
+ if (!$preserve_defaults) {
+ $this->language_data['STYLES']['SYMBOLS'][$group] = $style;
+ } else {
+ $this->language_data['STYLES']['SYMBOLS'][$group] .= $style;
+ }
+
+ // For backward compatibility
+ if (0 == $group) {
+ $this->set_brackets_style ($style, $preserve_defaults);
+ }
+ }
+
+ /**
+ * Turns highlighting on/off for symbols
+ *
+ * @param boolean Whether to turn highlighting for symbols on or off
+ * @since 1.0.0
+ */
+ function set_symbols_highlighting($flag) {
+ // Update lexic permissions for this symbol group
+ $this->lexic_permissions['SYMBOLS'] = ($flag) ? true : false;
+
+ // For backward compatibility
+ $this->set_brackets_highlighting ($flag);
+ }
+
+ /**
+ * Sets the styles for strings. If $preserve_defaults is
+ * true, then styles are merged with the default styles, with the
+ * user defined styles having priority
+ *
+ * @param string The style to make the escape characters
+ * @param boolean Whether to merge the new styles with the old or just
+ * to overwrite them
+ * @param int Tells the group of strings for which style should be set.
+ * @since 1.0.0
+ */
+ function set_strings_style($style, $preserve_defaults = false, $group = 0) {
+ if (!$preserve_defaults) {
+ $this->language_data['STYLES']['STRINGS'][$group] = $style;
+ } else {
+ $this->language_data['STYLES']['STRINGS'][$group] .= $style;
+ }
+ }
+
+ /**
+ * Turns highlighting on/off for strings
+ *
+ * @param boolean Whether to turn highlighting for strings on or off
+ * @since 1.0.0
+ */
+ function set_strings_highlighting($flag) {
+ $this->lexic_permissions['STRINGS'] = ($flag) ? true : false;
+ }
+
+ /**
+ * Sets the styles for strict code blocks. If $preserve_defaults is
+ * true, then styles are merged with the default styles, with the
+ * user defined styles having priority
+ *
+ * @param string The style to make the script blocks
+ * @param boolean Whether to merge the new styles with the old or just
+ * to overwrite them
+ * @param int Tells the group of script blocks for which style should be set.
+ * @since 1.0.8.4
+ */
+ function set_script_style($style, $preserve_defaults = false, $group = 0) {
+ // Update the style of symbols
+ if (!$preserve_defaults) {
+ $this->language_data['STYLES']['SCRIPT'][$group] = $style;
+ } else {
+ $this->language_data['STYLES']['SCRIPT'][$group] .= $style;
+ }
+ }
+
+ /**
+ * Sets the styles for numbers. If $preserve_defaults is
+ * true, then styles are merged with the default styles, with the
+ * user defined styles having priority
+ *
+ * @param string The style to make the numbers
+ * @param boolean Whether to merge the new styles with the old or just
+ * to overwrite them
+ * @param int Tells the group of numbers for which style should be set.
+ * @since 1.0.0
+ */
+ function set_numbers_style($style, $preserve_defaults = false, $group = 0) {
+ if (!$preserve_defaults) {
+ $this->language_data['STYLES']['NUMBERS'][$group] = $style;
+ } else {
+ $this->language_data['STYLES']['NUMBERS'][$group] .= $style;
+ }
+ }
+
+ /**
+ * Turns highlighting on/off for numbers
+ *
+ * @param boolean Whether to turn highlighting for numbers on or off
+ * @since 1.0.0
+ */
+ function set_numbers_highlighting($flag) {
+ $this->lexic_permissions['NUMBERS'] = ($flag) ? true : false;
+ }
+
+ /**
+ * Sets the styles for methods. $key is a number that references the
+ * appropriate "object splitter" - see the language file for the language
+ * you are highlighting to get this number. If $preserve_defaults is
+ * true, then styles are merged with the default styles, with the
+ * user defined styles having priority
+ *
+ * @param int The key of the object splitter to change the styles of
+ * @param string The style to make the methods
+ * @param boolean Whether to merge the new styles with the old or just
+ * to overwrite them
+ * @since 1.0.0
+ */
+ function set_methods_style($key, $style, $preserve_defaults = false) {
+ if (!$preserve_defaults) {
+ $this->language_data['STYLES']['METHODS'][$key] = $style;
+ } else {
+ $this->language_data['STYLES']['METHODS'][$key] .= $style;
+ }
+ }
+
+ /**
+ * Turns highlighting on/off for methods
+ *
+ * @param boolean Whether to turn highlighting for methods on or off
+ * @since 1.0.0
+ */
+ function set_methods_highlighting($flag) {
+ $this->lexic_permissions['METHODS'] = ($flag) ? true : false;
+ }
+
+ /**
+ * Sets the styles for regexps. If $preserve_defaults is
+ * true, then styles are merged with the default styles, with the
+ * user defined styles having priority
+ *
+ * @param string The style to make the regular expression matches
+ * @param boolean Whether to merge the new styles with the old or just
+ * to overwrite them
+ * @since 1.0.0
+ */
+ function set_regexps_style($key, $style, $preserve_defaults = false) {
+ if (!$preserve_defaults) {
+ $this->language_data['STYLES']['REGEXPS'][$key] = $style;
+ } else {
+ $this->language_data['STYLES']['REGEXPS'][$key] .= $style;
+ }
+ }
+
+ /**
+ * Turns highlighting on/off for regexps
+ *
+ * @param int The key of the regular expression group to turn on or off
+ * @param boolean Whether to turn highlighting for the regular expression group on or off
+ * @since 1.0.0
+ */
+ function set_regexps_highlighting($key, $flag) {
+ $this->lexic_permissions['REGEXPS'][$key] = ($flag) ? true : false;
+ }
+
+ /**
+ * Sets whether a set of keywords are checked for in a case sensitive manner
+ *
+ * @param int The key of the keyword group to change the case sensitivity of
+ * @param boolean Whether to check in a case sensitive manner or not
+ * @since 1.0.0
+ */
+ function set_case_sensitivity($key, $case) {
+ $this->language_data['CASE_SENSITIVE'][$key] = ($case) ? true : false;
+ }
+
+ /**
+ * Sets the case that keywords should use when found. Use the constants:
+ *
+ * - GESHI_CAPS_NO_CHANGE: leave keywords as-is
+ * - GESHI_CAPS_UPPER: convert all keywords to uppercase where found
+ * - GESHI_CAPS_LOWER: convert all keywords to lowercase where found
+ *
+ * @param int A constant specifying what to do with matched keywords
+ * @since 1.0.1
+ */
+ function set_case_keywords($case) {
+ if (in_array($case, array(
+ GESHI_CAPS_NO_CHANGE, GESHI_CAPS_UPPER, GESHI_CAPS_LOWER))) {
+ $this->language_data['CASE_KEYWORDS'] = $case;
+ }
+ }
+
+ /**
+ * Sets how many spaces a tab is substituted for
+ *
+ * Widths below zero are ignored
+ *
+ * @param int The tab width
+ * @since 1.0.0
+ */
+ function set_tab_width($width) {
+ $this->tab_width = intval($width);
+
+ //Check if it fit's the constraints:
+ if ($this->tab_width < 1) {
+ //Return it to the default
+ $this->tab_width = 8;
+ }
+ }
+
+ /**
+ * Sets whether or not to use tab-stop width specifed by language
+ *
+ * @param boolean Whether to use language-specific tab-stop widths
+ * @since 1.0.7.20
+ */
+ function set_use_language_tab_width($use) {
+ $this->use_language_tab_width = (bool) $use;
+ }
+
+ /**
+ * Returns the tab width to use, based on the current language and user
+ * preference
+ *
+ * @return int Tab width
+ * @since 1.0.7.20
+ */
+ function get_real_tab_width() {
+ if (!$this->use_language_tab_width ||
+ !isset($this->language_data['TAB_WIDTH'])) {
+ return $this->tab_width;
+ } else {
+ return $this->language_data['TAB_WIDTH'];
+ }
+ }
+
+ /**
+ * Enables/disables strict highlighting. Default is off, calling this
+ * method without parameters will turn it on. See documentation
+ * for more details on strict mode and where to use it.
+ *
+ * @param boolean Whether to enable strict mode or not
+ * @since 1.0.0
+ */
+ function enable_strict_mode($mode = true) {
+ if (GESHI_MAYBE == $this->language_data['STRICT_MODE_APPLIES']) {
+ $this->strict_mode = ($mode) ? GESHI_ALWAYS : GESHI_NEVER;
+ }
+ }
+
+ /**
+ * Disables all highlighting
+ *
+ * @since 1.0.0
+ * @todo Rewrite with array traversal
+ * @deprecated In favour of enable_highlighting
+ */
+ function disable_highlighting() {
+ $this->enable_highlighting(false);
+ }
+
+ /**
+ * Enables all highlighting
+ *
+ * The optional flag parameter was added in version 1.0.7.21 and can be used
+ * to enable (true) or disable (false) all highlighting.
+ *
+ * @since 1.0.0
+ * @param boolean A flag specifying whether to enable or disable all highlighting
+ * @todo Rewrite with array traversal
+ */
+ function enable_highlighting($flag = true) {
+ $flag = $flag ? true : false;
+ foreach ($this->lexic_permissions as $key => $value) {
+ if (is_array($value)) {
+ foreach ($value as $k => $v) {
+ $this->lexic_permissions[$key][$k] = $flag;
+ }
+ } else {
+ $this->lexic_permissions[$key] = $flag;
+ }
+ }
+
+ // Context blocks
+ $this->enable_important_blocks = $flag;
+ }
+
+ /**
+ * Given a file extension, this method returns either a valid geshi language
+ * name, or the empty string if it couldn't be found
+ *
+ * @param string The extension to get a language name for
+ * @param array A lookup array to use instead of the default one
+ * @since 1.0.5
+ * @todo Re-think about how this method works (maybe make it private and/or make it
+ * a extension->lang lookup?)
+ * @todo static?
+ */
+ function get_language_name_from_extension( $extension, $lookup = array() ) {
+ $extension = strtolower($extension);
+
+ if ( !is_array($lookup) || empty($lookup)) {
+ $lookup = array(
+ '6502acme' => array( 'a', 's', 'asm', 'inc' ),
+ '6502tasm' => array( 'a', 's', 'asm', 'inc' ),
+ '6502kickass' => array( 'a', 's', 'asm', 'inc' ),
+ '68000devpac' => array( 'a', 's', 'asm', 'inc' ),
+ 'abap' => array('abap'),
+ 'actionscript' => array('as'),
+ 'ada' => array('a', 'ada', 'adb', 'ads'),
+ 'apache' => array('conf'),
+ 'asm' => array('ash', 'asm', 'inc'),
+ 'asp' => array('asp'),
+ 'bash' => array('sh'),
+ 'bf' => array('bf'),
+ 'c' => array('c', 'h'),
+ 'c_mac' => array('c', 'h'),
+ 'caddcl' => array(),
+ 'cadlisp' => array(),
+ 'cdfg' => array('cdfg'),
+ 'cobol' => array('cbl'),
+ 'cpp' => array('cpp', 'hpp', 'C', 'H', 'CPP', 'HPP'),
+ 'csharp' => array('cs'),
+ 'css' => array('css'),
+ 'd' => array('d'),
+ 'delphi' => array('dpk', 'dpr', 'pp', 'pas'),
+ 'diff' => array('diff', 'patch'),
+ 'dos' => array('bat', 'cmd'),
+ 'gdb' => array('kcrash', 'crash', 'bt'),
+ 'gettext' => array('po', 'pot'),
+ 'gml' => array('gml'),
+ 'gnuplot' => array('plt'),
+ 'groovy' => array('groovy'),
+ 'haskell' => array('hs'),
+ 'haxe' => array('hx'),
+ 'html4strict' => array('html', 'htm'),
+ 'ini' => array('ini', 'desktop'),
+ 'java' => array('java'),
+ 'javascript' => array('js'),
+ 'klonec' => array('kl1'),
+ 'klonecpp' => array('klx'),
+ 'latex' => array('tex'),
+ 'lisp' => array('lisp'),
+ 'lua' => array('lua'),
+ 'matlab' => array('m'),
+ 'mpasm' => array(),
+ 'mysql' => array('sql'),
+ 'nsis' => array(),
+ 'objc' => array(),
+ 'oobas' => array(),
+ 'oracle8' => array(),
+ 'oracle10' => array(),
+ 'pascal' => array('pas'),
+ 'perl' => array('pl', 'pm'),
+ 'php' => array('php', 'php5', 'phtml', 'phps'),
+ 'povray' => array('pov'),
+ 'providex' => array('pvc', 'pvx'),
+ 'prolog' => array('pl'),
+ 'python' => array('py'),
+ 'qbasic' => array('bi'),
+ 'reg' => array('reg'),
+ 'ruby' => array('rb'),
+ 'sas' => array('sas'),
+ 'scala' => array('scala'),
+ 'scheme' => array('scm'),
+ 'scilab' => array('sci'),
+ 'smalltalk' => array('st'),
+ 'smarty' => array(),
+ 'tcl' => array('tcl'),
+ 'text' => array('txt'),
+ 'vb' => array('bas'),
+ 'vbnet' => array(),
+ 'visualfoxpro' => array(),
+ 'whitespace' => array('ws'),
+ 'xml' => array('xml', 'svg', 'xrc'),
+ 'z80' => array('z80', 'asm', 'inc')
+ );
+ }
+
+ foreach ($lookup as $lang => $extensions) {
+ if (in_array($extension, $extensions)) {
+ return $lang;
+ }
+ }
+
+ return 'text';
+ }
+
+ /**
+ * Given a file name, this method loads its contents in, and attempts
+ * to set the language automatically. An optional lookup table can be
+ * passed for looking up the language name. If not specified a default
+ * table is used
+ *
+ * The language table is in the form
+ * <pre>array(
+ * 'lang_name' => array('extension', 'extension', ...),
+ * 'lang_name' ...
+ * );</pre>
+ *
+ * @param string The filename to load the source from
+ * @param array A lookup array to use instead of the default one
+ * @todo Complete rethink of this and above method
+ * @since 1.0.5
+ */
+ function load_from_file($file_name, $lookup = array()) {
+ if (is_readable($file_name)) {
+ $this->set_source(file_get_contents($file_name));
+ $this->set_language($this->get_language_name_from_extension(substr(strrchr($file_name, '.'), 1), $lookup));
+ } else {
+ $this->error = GESHI_ERROR_FILE_NOT_READABLE;
+ }
+ }
+
+ /**
+ * Adds a keyword to a keyword group for highlighting
+ *
+ * @param int The key of the keyword group to add the keyword to
+ * @param string The word to add to the keyword group
+ * @since 1.0.0
+ */
+ function add_keyword($key, $word) {
+ if (!is_array($this->language_data['KEYWORDS'][$key])) {
+ $this->language_data['KEYWORDS'][$key] = array();
+ }
+ if (!in_array($word, $this->language_data['KEYWORDS'][$key])) {
+ $this->language_data['KEYWORDS'][$key][] = $word;
+
+ //NEW in 1.0.8 don't recompile the whole optimized regexp, simply append it
+ if ($this->parse_cache_built) {
+ $subkey = count($this->language_data['CACHED_KEYWORD_LISTS'][$key]) - 1;
+ $this->language_data['CACHED_KEYWORD_LISTS'][$key][$subkey] .= '|' . preg_quote($word, '/');
+ }
+ }
+ }
+
+ /**
+ * Removes a keyword from a keyword group
+ *
+ * @param int The key of the keyword group to remove the keyword from
+ * @param string The word to remove from the keyword group
+ * @param bool Wether to automatically recompile the optimized regexp list or not.
+ * Note: if you set this to false and @see GeSHi->parse_code() was already called once,
+ * for the current language, you have to manually call @see GeSHi->optimize_keyword_group()
+ * or the removed keyword will stay in cache and still be highlighted! On the other hand
+ * it might be too expensive to recompile the regexp list for every removal if you want to
+ * remove a lot of keywords.
+ * @since 1.0.0
+ */
+ function remove_keyword($key, $word, $recompile = true) {
+ $key_to_remove = array_search($word, $this->language_data['KEYWORDS'][$key]);
+ if ($key_to_remove !== false) {
+ unset($this->language_data['KEYWORDS'][$key][$key_to_remove]);
+
+ //NEW in 1.0.8, optionally recompile keyword group
+ if ($recompile && $this->parse_cache_built) {
+ $this->optimize_keyword_group($key);
+ }
+ }
+ }
+
+ /**
+ * Creates a new keyword group
+ *
+ * @param int The key of the keyword group to create
+ * @param string The styles for the keyword group
+ * @param boolean Whether the keyword group is case sensitive ornot
+ * @param array The words to use for the keyword group
+ * @since 1.0.0
+ */
+ function add_keyword_group($key, $styles, $case_sensitive = true, $words = array()) {
+ $words = (array) $words;
+ if (empty($words)) {
+ // empty word lists mess up highlighting
+ return false;
+ }
+
+ //Add the new keyword group internally
+ $this->language_data['KEYWORDS'][$key] = $words;
+ $this->lexic_permissions['KEYWORDS'][$key] = true;
+ $this->language_data['CASE_SENSITIVE'][$key] = $case_sensitive;
+ $this->language_data['STYLES']['KEYWORDS'][$key] = $styles;
+
+ //NEW in 1.0.8, cache keyword regexp
+ if ($this->parse_cache_built) {
+ $this->optimize_keyword_group($key);
+ }
+ }
+
+ /**
+ * Removes a keyword group
+ *
+ * @param int The key of the keyword group to remove
+ * @since 1.0.0
+ */
+ function remove_keyword_group ($key) {
+ //Remove the keyword group internally
+ unset($this->language_data['KEYWORDS'][$key]);
+ unset($this->lexic_permissions['KEYWORDS'][$key]);
+ unset($this->language_data['CASE_SENSITIVE'][$key]);
+ unset($this->language_data['STYLES']['KEYWORDS'][$key]);
+
+ //NEW in 1.0.8
+ unset($this->language_data['CACHED_KEYWORD_LISTS'][$key]);
+ }
+
+ /**
+ * compile optimized regexp list for keyword group
+ *
+ * @param int The key of the keyword group to compile & optimize
+ * @since 1.0.8
+ */
+ function optimize_keyword_group($key) {
+ $this->language_data['CACHED_KEYWORD_LISTS'][$key] =
+ $this->optimize_regexp_list($this->language_data['KEYWORDS'][$key]);
+ $space_as_whitespace = false;
+ if(isset($this->language_data['PARSER_CONTROL'])) {
+ if(isset($this->language_data['PARSER_CONTROL']['KEYWORDS'])) {
+ if(isset($this->language_data['PARSER_CONTROL']['KEYWORDS']['SPACE_AS_WHITESPACE'])) {
+ $space_as_whitespace = $this->language_data['PARSER_CONTROL']['KEYWORDS']['SPACE_AS_WHITESPACE'];
+ }
+ if(isset($this->language_data['PARSER_CONTROL']['KEYWORDS'][$key]['SPACE_AS_WHITESPACE'])) {
+ if(isset($this->language_data['PARSER_CONTROL']['KEYWORDS'][$key]['SPACE_AS_WHITESPACE'])) {
+ $space_as_whitespace = $this->language_data['PARSER_CONTROL']['KEYWORDS'][$key]['SPACE_AS_WHITESPACE'];
+ }
+ }
+ }
+ }
+ if($space_as_whitespace) {
+ foreach($this->language_data['CACHED_KEYWORD_LISTS'][$key] as $rxk => $rxv) {
+ $this->language_data['CACHED_KEYWORD_LISTS'][$key][$rxk] =
+ str_replace(" ", "\\s+", $rxv);
+ }
+ }
+ }
+
+ /**
+ * Sets the content of the header block
+ *
+ * @param string The content of the header block
+ * @since 1.0.2
+ */
+ function set_header_content($content) {
+ $this->header_content = $content;
+ }
+
+ /**
+ * Sets the content of the footer block
+ *
+ * @param string The content of the footer block
+ * @since 1.0.2
+ */
+ function set_footer_content($content) {
+ $this->footer_content = $content;
+ }
+
+ /**
+ * Sets the style for the header content
+ *
+ * @param string The style for the header content
+ * @since 1.0.2
+ */
+ function set_header_content_style($style) {
+ $this->header_content_style = $style;
+ }
+
+ /**
+ * Sets the style for the footer content
+ *
+ * @param string The style for the footer content
+ * @since 1.0.2
+ */
+ function set_footer_content_style($style) {
+ $this->footer_content_style = $style;
+ }
+
+ /**
+ * Sets whether to force a surrounding block around
+ * the highlighted code or not
+ *
+ * @param boolean Tells whether to enable or disable this feature
+ * @since 1.0.7.20
+ */
+ function enable_inner_code_block($flag) {
+ $this->force_code_block = (bool)$flag;
+ }
+
+ /**
+ * Sets the base URL to be used for keywords
+ *
+ * @param int The key of the keyword group to set the URL for
+ * @param string The URL to set for the group. If {FNAME} is in
+ * the url somewhere, it is replaced by the keyword
+ * that the URL is being made for
+ * @since 1.0.2
+ */
+ function set_url_for_keyword_group($group, $url) {
+ $this->language_data['URLS'][$group] = $url;
+ }
+
+ /**
+ * Sets styles for links in code
+ *
+ * @param int A constant that specifies what state the style is being
+ * set for - e.g. :hover or :visited
+ * @param string The styles to use for that state
+ * @since 1.0.2
+ */
+ function set_link_styles($type, $styles) {
+ $this->link_styles[$type] = $styles;
+ }
+
+ /**
+ * Sets the target for links in code
+ *
+ * @param string The target for links in the code, e.g. _blank
+ * @since 1.0.3
+ */
+ function set_link_target($target) {
+ if (!$target) {
+ $this->link_target = '';
+ } else {
+ $this->link_target = ' target="' . $target . '"';
+ }
+ }
+
+ /**
+ * Sets styles for important parts of the code
+ *
+ * @param string The styles to use on important parts of the code
+ * @since 1.0.2
+ */
+ function set_important_styles($styles) {
+ $this->important_styles = $styles;
+ }
+
+ /**
+ * Sets whether context-important blocks are highlighted
+ *
+ * @param boolean Tells whether to enable or disable highlighting of important blocks
+ * @todo REMOVE THIS SHIZ FROM GESHI!
+ * @deprecated
+ * @since 1.0.2
+ */
+ function enable_important_blocks($flag) {
+ $this->enable_important_blocks = ( $flag ) ? true : false;
+ }
+
+ /**
+ * Whether CSS IDs should be added to each line
+ *
+ * @param boolean If true, IDs will be added to each line.
+ * @since 1.0.2
+ */
+ function enable_ids($flag = true) {
+ $this->add_ids = ($flag) ? true : false;
+ }
+
+ /**
+ * Specifies which lines to highlight extra
+ *
+ * The extra style parameter was added in 1.0.7.21.
+ *
+ * @param mixed An array of line numbers to highlight, or just a line
+ * number on its own.
+ * @param string A string specifying the style to use for this line.
+ * If null is specified, the default style is used.
+ * If false is specified, the line will be removed from
+ * special highlighting
+ * @since 1.0.2
+ * @todo Some data replication here that could be cut down on
+ */
+ function highlight_lines_extra($lines, $style = null) {
+ if (is_array($lines)) {
+ //Split up the job using single lines at a time
+ foreach ($lines as $line) {
+ $this->highlight_lines_extra($line, $style);
+ }
+ } else {
+ //Mark the line as being highlighted specially
+ $lines = intval($lines);
+ $this->highlight_extra_lines[$lines] = $lines;
+
+ //Decide on which style to use
+ if ($style === null) { //Check if we should use default style
+ unset($this->highlight_extra_lines_styles[$lines]);
+ } elseif ($style === false) { //Check if to remove this line
+ unset($this->highlight_extra_lines[$lines]);
+ unset($this->highlight_extra_lines_styles[$lines]);
+ } else {
+ $this->highlight_extra_lines_styles[$lines] = $style;
+ }
+ }
+ }
+
+ /**
+ * Sets the style for extra-highlighted lines
+ *
+ * @param string The style for extra-highlighted lines
+ * @since 1.0.2
+ */
+ function set_highlight_lines_extra_style($styles) {
+ $this->highlight_extra_lines_style = $styles;
+ }
+
+ /**
+ * Sets the line-ending
+ *
+ * @param string The new line-ending
+ * @since 1.0.2
+ */
+ function set_line_ending($line_ending) {
+ $this->line_ending = (string)$line_ending;
+ }
+
+ /**
+ * Sets what number line numbers should start at. Should
+ * be a positive integer, and will be converted to one.
+ *
+ * <b>Warning:</b> Using this method will add the "start"
+ * attribute to the &lt;ol&gt; that is used for line numbering.
+ * This is <b>not</b> valid XHTML strict, so if that's what you
+ * care about then don't use this method. Firefox is getting
+ * support for the CSS method of doing this in 1.1 and Opera
+ * has support for the CSS method, but (of course) IE doesn't
+ * so it's not worth doing it the CSS way yet.
+ *
+ * @param int The number to start line numbers at
+ * @since 1.0.2
+ */
+ function start_line_numbers_at($number) {
+ $this->line_numbers_start = abs(intval($number));
+ }
+
+ /**
+ * Sets the encoding used for htmlspecialchars(), for international
+ * support.
+ *
+ * NOTE: This is not needed for now because htmlspecialchars() is not
+ * being used (it has a security hole in PHP4 that has not been patched).
+ * Maybe in a future version it may make a return for speed reasons, but
+ * I doubt it.
+ *
+ * @param string The encoding to use for the source
+ * @since 1.0.3
+ */
+ function set_encoding($encoding) {
+ if ($encoding) {
+ $this->encoding = strtolower($encoding);
+ }
+ }
+
+ /**
+ * Turns linking of keywords on or off.
+ *
+ * @param boolean If true, links will be added to keywords
+ * @since 1.0.2
+ */
+ function enable_keyword_links($enable = true) {
+ $this->keyword_links = (bool) $enable;
+ }
+
+ /**
+ * Setup caches needed for styling. This is automatically called in
+ * parse_code() and get_stylesheet() when appropriate. This function helps
+ * stylesheet generators as they rely on some style information being
+ * preprocessed
+ *
+ * @since 1.0.8
+ * @access private
+ */
+ function build_style_cache() {
+ //Build the style cache needed to highlight numbers appropriate
+ if($this->lexic_permissions['NUMBERS']) {
+ //First check what way highlighting information for numbers are given
+ if(!isset($this->language_data['NUMBERS'])) {
+ $this->language_data['NUMBERS'] = 0;
+ }
+
+ if(is_array($this->language_data['NUMBERS'])) {
+ $this->language_data['NUMBERS_CACHE'] = $this->language_data['NUMBERS'];
+ } else {
+ $this->language_data['NUMBERS_CACHE'] = array();
+ if(!$this->language_data['NUMBERS']) {
+ $this->language_data['NUMBERS'] =
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_FLT_NONSCI;
+ }
+
+ for($i = 0, $j = $this->language_data['NUMBERS']; $j > 0; ++$i, $j>>=1) {
+ //Rearrange style indices if required ...
+ if(isset($this->language_data['STYLES']['NUMBERS'][1<<$i])) {
+ $this->language_data['STYLES']['NUMBERS'][$i] =
+ $this->language_data['STYLES']['NUMBERS'][1<<$i];
+ unset($this->language_data['STYLES']['NUMBERS'][1<<$i]);
+ }
+
+ //Check if this bit is set for highlighting
+ if($j&1) {
+ //So this bit is set ...
+ //Check if it belongs to group 0 or the actual stylegroup
+ if(isset($this->language_data['STYLES']['NUMBERS'][$i])) {
+ $this->language_data['NUMBERS_CACHE'][$i] = 1 << $i;
+ } else {
+ if(!isset($this->language_data['NUMBERS_CACHE'][0])) {
+ $this->language_data['NUMBERS_CACHE'][0] = 0;
+ }
+ $this->language_data['NUMBERS_CACHE'][0] |= 1 << $i;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Setup caches needed for parsing. This is automatically called in parse_code() when appropriate.
+ * This function makes stylesheet generators much faster as they do not need these caches.
+ *
+ * @since 1.0.8
+ * @access private
+ */
+ function build_parse_cache() {
+ // cache symbol regexp
+ //As this is a costy operation, we avoid doing it for multiple groups ...
+ //Instead we perform it for all symbols at once.
+ //
+ //For this to work, we need to reorganize the data arrays.
+ if ($this->lexic_permissions['SYMBOLS'] && !empty($this->language_data['SYMBOLS'])) {
+ $this->language_data['MULTIPLE_SYMBOL_GROUPS'] = count($this->language_data['STYLES']['SYMBOLS']) > 1;
+
+ $this->language_data['SYMBOL_DATA'] = array();
+ $symbol_preg_multi = array(); // multi char symbols
+ $symbol_preg_single = array(); // single char symbols
+ foreach ($this->language_data['SYMBOLS'] as $key => $symbols) {
+ if (is_array($symbols)) {
+ foreach ($symbols as $sym) {
+ $sym = $this->hsc($sym);
+ if (!isset($this->language_data['SYMBOL_DATA'][$sym])) {
+ $this->language_data['SYMBOL_DATA'][$sym] = $key;
+ if (isset($sym[1])) { // multiple chars
+ $symbol_preg_multi[] = preg_quote($sym, '/');
+ } else { // single char
+ if ($sym == '-') {
+ // don't trigger range out of order error
+ $symbol_preg_single[] = '\-';
+ } else {
+ $symbol_preg_single[] = preg_quote($sym, '/');
+ }
+ }
+ }
+ }
+ } else {
+ $symbols = $this->hsc($symbols);
+ if (!isset($this->language_data['SYMBOL_DATA'][$symbols])) {
+ $this->language_data['SYMBOL_DATA'][$symbols] = 0;
+ if (isset($symbols[1])) { // multiple chars
+ $symbol_preg_multi[] = preg_quote($symbols, '/');
+ } elseif ($symbols == '-') {
+ // don't trigger range out of order error
+ $symbol_preg_single[] = '\-';
+ } else { // single char
+ $symbol_preg_single[] = preg_quote($symbols, '/');
+ }
+ }
+ }
+ }
+
+ //Now we have an array with each possible symbol as the key and the style as the actual data.
+ //This way we can set the correct style just the moment we highlight ...
+ //
+ //Now we need to rewrite our array to get a search string that
+ $symbol_preg = array();
+ if (!empty($symbol_preg_multi)) {
+ rsort($symbol_preg_multi);
+ $symbol_preg[] = implode('|', $symbol_preg_multi);
+ }
+ if (!empty($symbol_preg_single)) {
+ rsort($symbol_preg_single);
+ $symbol_preg[] = '[' . implode('', $symbol_preg_single) . ']';
+ }
+ $this->language_data['SYMBOL_SEARCH'] = implode("|", $symbol_preg);
+ }
+
+ // cache optimized regexp for keyword matching
+ // remove old cache
+ $this->language_data['CACHED_KEYWORD_LISTS'] = array();
+ foreach (array_keys($this->language_data['KEYWORDS']) as $key) {
+ if (!isset($this->lexic_permissions['KEYWORDS'][$key]) ||
+ $this->lexic_permissions['KEYWORDS'][$key]) {
+ $this->optimize_keyword_group($key);
+ }
+ }
+
+ // brackets
+ if ($this->lexic_permissions['BRACKETS']) {
+ $this->language_data['CACHE_BRACKET_MATCH'] = array('[', ']', '(', ')', '{', '}');
+ if (!$this->use_classes && isset($this->language_data['STYLES']['BRACKETS'][0])) {
+ $this->language_data['CACHE_BRACKET_REPLACE'] = array(
+ '<| style="' . $this->language_data['STYLES']['BRACKETS'][0] . '">&#91;|>',
+ '<| style="' . $this->language_data['STYLES']['BRACKETS'][0] . '">&#93;|>',
+ '<| style="' . $this->language_data['STYLES']['BRACKETS'][0] . '">&#40;|>',
+ '<| style="' . $this->language_data['STYLES']['BRACKETS'][0] . '">&#41;|>',
+ '<| style="' . $this->language_data['STYLES']['BRACKETS'][0] . '">&#123;|>',
+ '<| style="' . $this->language_data['STYLES']['BRACKETS'][0] . '">&#125;|>',
+ );
+ }
+ else {
+ $this->language_data['CACHE_BRACKET_REPLACE'] = array(
+ '<| class="br0">&#91;|>',
+ '<| class="br0">&#93;|>',
+ '<| class="br0">&#40;|>',
+ '<| class="br0">&#41;|>',
+ '<| class="br0">&#123;|>',
+ '<| class="br0">&#125;|>',
+ );
+ }
+ }
+
+ //Build the parse cache needed to highlight numbers appropriate
+ if($this->lexic_permissions['NUMBERS']) {
+ //Check if the style rearrangements have been processed ...
+ //This also does some preprocessing to check which style groups are useable ...
+ if(!isset($this->language_data['NUMBERS_CACHE'])) {
+ $this->build_style_cache();
+ }
+
+ //Number format specification
+ //All this formats are matched case-insensitively!
+ static $numbers_format = array(
+ GESHI_NUMBER_INT_BASIC =>
+ '(?:(?<![0-9a-z_\.%$@])|(?<=\.\.))(?<![\d\.]e[+\-])([1-9]\d*?|0)(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_INT_CSTYLE =>
+ '(?<![0-9a-z_\.%])(?<![\d\.]e[+\-])([1-9]\d*?|0)l(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_BIN_SUFFIX =>
+ '(?<![0-9a-z_\.])(?<![\d\.]e[+\-])[01]+?[bB](?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_BIN_PREFIX_PERCENT =>
+ '(?<![0-9a-z_\.%])(?<![\d\.]e[+\-])%[01]+?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_BIN_PREFIX_0B =>
+ '(?<![0-9a-z_\.%])(?<![\d\.]e[+\-])0b[01]+?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_OCT_PREFIX =>
+ '(?<![0-9a-z_\.])(?<![\d\.]e[+\-])0[0-7]+?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_OCT_PREFIX_0O =>
+ '(?<![0-9a-z_\.%])(?<![\d\.]e[+\-])0o[0-7]+?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_OCT_PREFIX_AT =>
+ '(?<![0-9a-z_\.%])(?<![\d\.]e[+\-])\@[0-7]+?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_OCT_SUFFIX =>
+ '(?<![0-9a-z_\.])(?<![\d\.]e[+\-])[0-7]+?o(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_HEX_PREFIX =>
+ '(?<![0-9a-z_\.])(?<![\d\.]e[+\-])0x[0-9a-fA-F]+?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR =>
+ '(?<![0-9a-z_\.])(?<![\d\.]e[+\-])\$[0-9a-fA-F]+?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_HEX_SUFFIX =>
+ '(?<![0-9a-z_\.])(?<![\d\.]e[+\-])\d[0-9a-fA-F]*?[hH](?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_FLT_NONSCI =>
+ '(?<![0-9a-z_\.])(?<![\d\.]e[+\-])\d+?\.\d+?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_FLT_NONSCI_F =>
+ '(?<![0-9a-z_\.])(?<![\d\.]e[+\-])(?:\d+?(?:\.\d*?)?|\.\d+?)f(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_FLT_SCI_SHORT =>
+ '(?<![0-9a-z_\.])(?<![\d\.]e[+\-])\.\d+?(?:e[+\-]?\d+?)?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)',
+ GESHI_NUMBER_FLT_SCI_ZERO =>
+ '(?<![0-9a-z_\.])(?<![\d\.]e[+\-])(?:\d+?(?:\.\d*?)?|\.\d+?)(?:e[+\-]?\d+?)?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)'
+ );
+
+ //At this step we have an associative array with flag groups for a
+ //specific style or an string denoting a regexp given its index.
+ $this->language_data['NUMBERS_RXCACHE'] = array();
+ foreach($this->language_data['NUMBERS_CACHE'] as $key => $rxdata) {
+ if(is_string($rxdata)) {
+ $regexp = $rxdata;
+ } else {
+ //This is a bitfield of number flags to highlight:
+ //Build an array, implode them together and make this the actual RX
+ $rxuse = array();
+ for($i = 1; $i <= $rxdata; $i<<=1) {
+ if($rxdata & $i) {
+ $rxuse[] = $numbers_format[$i];
+ }
+ }
+ $regexp = implode("|", $rxuse);
+ }
+
+ $this->language_data['NUMBERS_RXCACHE'][$key] =
+ "/(?<!<\|\/)(?<!<\|!REG3XP)(?<!<\|\/NUM!)(?<!\d\/>)($regexp)(?!(?:<DOT>|(?>[^\<]+))+>)(?![^<]*>)(?!\|>)(?!\/>)/i"; //
+ }
+
+ if(!isset($this->language_data['PARSER_CONTROL']['NUMBERS']['PRECHECK_RX'])) {
+ $this->language_data['PARSER_CONTROL']['NUMBERS']['PRECHECK_RX'] = '#\d#';
+ }
+ }
+
+ $this->parse_cache_built = true;
+ }
+
+ /**
+ * Returns the code in $this->source, highlighted and surrounded by the
+ * nessecary HTML.
+ *
+ * This should only be called ONCE, cos it's SLOW! If you want to highlight
+ * the same source multiple times, you're better off doing a whole lot of
+ * str_replaces to replace the &lt;span&gt;s
+ *
+ * @since 1.0.0
+ */
+ function parse_code () {
+ // Start the timer
+ $start_time = microtime();
+
+ // Replace all newlines to a common form.
+ $code = str_replace("\r\n", "\n", $this->source);
+ $code = str_replace("\r", "\n", $code);
+
+ // Firstly, if there is an error, we won't highlight
+ if ($this->error) {
+ //Escape the source for output
+ $result = $this->hsc($this->source);
+
+ //This fix is related to SF#1923020, but has to be applied regardless of
+ //actually highlighting symbols.
+ $result = str_replace(array('<SEMI>', '<PIPE>'), array(';', '|'), $result);
+
+ // Timing is irrelevant
+ $this->set_time($start_time, $start_time);
+ $this->finalise($result);
+ return $result;
+ }
+
+ // make sure the parse cache is up2date
+ if (!$this->parse_cache_built) {
+ $this->build_parse_cache();
+ }
+
+ // Initialise various stuff
+ $length = strlen($code);
+ $COMMENT_MATCHED = false;
+ $stuff_to_parse = '';
+ $endresult = '';
+
+ // "Important" selections are handled like multiline comments
+ // @todo GET RID OF THIS SHIZ
+ if ($this->enable_important_blocks) {
+ $this->language_data['COMMENT_MULTI'][GESHI_START_IMPORTANT] = GESHI_END_IMPORTANT;
+ }
+
+ if ($this->strict_mode) {
+ // Break the source into bits. Each bit will be a portion of the code
+ // within script delimiters - for example, HTML between < and >
+ $k = 0;
+ $parts = array();
+ $matches = array();
+ $next_match_pointer = null;
+ // we use a copy to unset delimiters on demand (when they are not found)
+ $delim_copy = $this->language_data['SCRIPT_DELIMITERS'];
+ $i = 0;
+ while ($i < $length) {
+ $next_match_pos = $length + 1; // never true
+ foreach ($delim_copy as $dk => $delimiters) {
+ if(is_array($delimiters)) {
+ foreach ($delimiters as $open => $close) {
+ // make sure the cache is setup properly
+ if (!isset($matches[$dk][$open])) {
+ $matches[$dk][$open] = array(
+ 'next_match' => -1,
+ 'dk' => $dk,
+
+ 'open' => $open, // needed for grouping of adjacent code blocks (see below)
+ 'open_strlen' => strlen($open),
+
+ 'close' => $close,
+ 'close_strlen' => strlen($close),
+ );
+ }
+ // Get the next little bit for this opening string
+ if ($matches[$dk][$open]['next_match'] < $i) {
+ // only find the next pos if it was not already cached
+ $open_pos = strpos($code, $open, $i);
+ if ($open_pos === false) {
+ // no match for this delimiter ever
+ unset($delim_copy[$dk][$open]);
+ continue;
+ }
+ $matches[$dk][$open]['next_match'] = $open_pos;
+ }
+ if ($matches[$dk][$open]['next_match'] < $next_match_pos) {
+ //So we got a new match, update the close_pos
+ $matches[$dk][$open]['close_pos'] =
+ strpos($code, $close, $matches[$dk][$open]['next_match']+1);
+
+ $next_match_pointer =& $matches[$dk][$open];
+ $next_match_pos = $matches[$dk][$open]['next_match'];
+ }
+ }
+ } else {
+ //So we should match an RegExp as Strict Block ...
+ /**
+ * The value in $delimiters is expected to be an RegExp
+ * containing exactly 2 matching groups:
+ * - Group 1 is the opener
+ * - Group 2 is the closer
+ */
+ if(!GESHI_PHP_PRE_433 && //Needs proper rewrite to work with PHP >=4.3.0; 4.3.3 is guaranteed to work.
+ preg_match($delimiters, $code, $matches_rx, PREG_OFFSET_CAPTURE, $i)) {
+ //We got a match ...
+ if(isset($matches_rx['start']) && isset($matches_rx['end']))
+ {
+ $matches[$dk] = array(
+ 'next_match' => $matches_rx['start'][1],
+ 'dk' => $dk,
+
+ 'close_strlen' => strlen($matches_rx['end'][0]),
+ 'close_pos' => $matches_rx['end'][1],
+ );
+ } else {
+ $matches[$dk] = array(
+ 'next_match' => $matches_rx[1][1],
+ 'dk' => $dk,
+
+ 'close_strlen' => strlen($matches_rx[2][0]),
+ 'close_pos' => $matches_rx[2][1],
+ );
+ }
+ } else {
+ // no match for this delimiter ever
+ unset($delim_copy[$dk]);
+ continue;
+ }
+
+ if ($matches[$dk]['next_match'] <= $next_match_pos) {
+ $next_match_pointer =& $matches[$dk];
+ $next_match_pos = $matches[$dk]['next_match'];
+ }
+ }
+ }
+
+ // non-highlightable text
+ $parts[$k] = array(
+ 1 => substr($code, $i, $next_match_pos - $i)
+ );
+ ++$k;
+
+ if ($next_match_pos > $length) {
+ // out of bounds means no next match was found
+ break;
+ }
+
+ // highlightable code
+ $parts[$k][0] = $next_match_pointer['dk'];
+
+ //Only combine for non-rx script blocks
+ if(is_array($delim_copy[$next_match_pointer['dk']])) {
+ // group adjacent script blocks, e.g. <foobar><asdf> should be one block, not three!
+ $i = $next_match_pos + $next_match_pointer['open_strlen'];
+ while (true) {
+ $close_pos = strpos($code, $next_match_pointer['close'], $i);
+ if ($close_pos == false) {
+ break;
+ }
+ $i = $close_pos + $next_match_pointer['close_strlen'];
+ if ($i == $length) {
+ break;
+ }
+ if ($code[$i] == $next_match_pointer['open'][0] && ($next_match_pointer['open_strlen'] == 1 ||
+ substr($code, $i, $next_match_pointer['open_strlen']) == $next_match_pointer['open'])) {
+ // merge adjacent but make sure we don't merge things like <tag><!-- comment -->
+ foreach ($matches as $submatches) {
+ foreach ($submatches as $match) {
+ if ($match['next_match'] == $i) {
+ // a different block already matches here!
+ break 3;
+ }
+ }
+ }
+ } else {
+ break;
+ }
+ }
+ } else {
+ $close_pos = $next_match_pointer['close_pos'] + $next_match_pointer['close_strlen'];
+ $i = $close_pos;
+ }
+
+ if ($close_pos === false) {
+ // no closing delimiter found!
+ $parts[$k][1] = substr($code, $next_match_pos);
+ ++$k;
+ break;
+ } else {
+ $parts[$k][1] = substr($code, $next_match_pos, $i - $next_match_pos);
+ ++$k;
+ }
+ }
+ unset($delim_copy, $next_match_pointer, $next_match_pos, $matches);
+ $num_parts = $k;
+
+ if ($num_parts == 1 && $this->strict_mode == GESHI_MAYBE) {
+ // when we have only one part, we don't have anything to highlight at all.
+ // if we have a "maybe" strict language, this should be handled as highlightable code
+ $parts = array(
+ 0 => array(
+ 0 => '',
+ 1 => ''
+ ),
+ 1 => array(
+ 0 => null,
+ 1 => $parts[0][1]
+ )
+ );
+ $num_parts = 2;
+ }
+
+ } else {
+ // Not strict mode - simply dump the source into
+ // the array at index 1 (the first highlightable block)
+ $parts = array(
+ 0 => array(
+ 0 => '',
+ 1 => ''
+ ),
+ 1 => array(
+ 0 => null,
+ 1 => $code
+ )
+ );
+ $num_parts = 2;
+ }
+
+ //Unset variables we won't need any longer
+ unset($code);
+
+ //Preload some repeatedly used values regarding hardquotes ...
+ $hq = isset($this->language_data['HARDQUOTE']) ? $this->language_data['HARDQUOTE'][0] : false;
+ $hq_strlen = strlen($hq);
+
+ //Preload if line numbers are to be generated afterwards
+ //Added a check if line breaks should be forced even without line numbers, fixes SF#1727398
+ $check_linenumbers = $this->line_numbers != GESHI_NO_LINE_NUMBERS ||
+ !empty($this->highlight_extra_lines) || !$this->allow_multiline_span;
+
+ //preload the escape char for faster checking ...
+ $escaped_escape_char = $this->hsc($this->language_data['ESCAPE_CHAR']);
+
+ // this is used for single-line comments
+ $sc_disallowed_before = "";
+ $sc_disallowed_after = "";
+
+ if (isset($this->language_data['PARSER_CONTROL'])) {
+ if (isset($this->language_data['PARSER_CONTROL']['COMMENTS'])) {
+ if (isset($this->language_data['PARSER_CONTROL']['COMMENTS']['DISALLOWED_BEFORE'])) {
+ $sc_disallowed_before = $this->language_data['PARSER_CONTROL']['COMMENTS']['DISALLOWED_BEFORE'];
+ }
+ if (isset($this->language_data['PARSER_CONTROL']['COMMENTS']['DISALLOWED_AFTER'])) {
+ $sc_disallowed_after = $this->language_data['PARSER_CONTROL']['COMMENTS']['DISALLOWED_AFTER'];
+ }
+ }
+ }
+
+ //Fix for SF#1932083: Multichar Quotemarks unsupported
+ $is_string_starter = array();
+ if ($this->lexic_permissions['STRINGS']) {
+ foreach ($this->language_data['QUOTEMARKS'] as $quotemark) {
+ if (!isset($is_string_starter[$quotemark[0]])) {
+ $is_string_starter[$quotemark[0]] = (string)$quotemark;
+ } elseif (is_string($is_string_starter[$quotemark[0]])) {
+ $is_string_starter[$quotemark[0]] = array(
+ $is_string_starter[$quotemark[0]],
+ $quotemark);
+ } else {
+ $is_string_starter[$quotemark[0]][] = $quotemark;
+ }
+ }
+ }
+
+ // Now we go through each part. We know that even-indexed parts are
+ // code that shouldn't be highlighted, and odd-indexed parts should
+ // be highlighted
+ for ($key = 0; $key < $num_parts; ++$key) {
+ $STRICTATTRS = '';
+
+ // If this block should be highlighted...
+ if (!($key & 1)) {
+ // Else not a block to highlight
+ $endresult .= $this->hsc($parts[$key][1]);
+ unset($parts[$key]);
+ continue;
+ }
+
+ $result = '';
+ $part = $parts[$key][1];
+
+ $highlight_part = true;
+ if ($this->strict_mode && !is_null($parts[$key][0])) {
+ // get the class key for this block of code
+ $script_key = $parts[$key][0];
+ $highlight_part = $this->language_data['HIGHLIGHT_STRICT_BLOCK'][$script_key];
+ if ($this->language_data['STYLES']['SCRIPT'][$script_key] != '' &&
+ $this->lexic_permissions['SCRIPT']) {
+ // Add a span element around the source to
+ // highlight the overall source block
+ if (!$this->use_classes &&
+ $this->language_data['STYLES']['SCRIPT'][$script_key] != '') {
+ $attributes = ' style="' . $this->language_data['STYLES']['SCRIPT'][$script_key] . '"';
+ } else {
+ $attributes = ' class="sc' . $script_key . '"';
+ }
+ $result .= "<span$attributes>";
+ $STRICTATTRS = $attributes;
+ }
+ }
+
+ if ($highlight_part) {
+ // Now, highlight the code in this block. This code
+ // is really the engine of GeSHi (along with the method
+ // parse_non_string_part).
+
+ // cache comment regexps incrementally
+ $next_comment_regexp_key = '';
+ $next_comment_regexp_pos = -1;
+ $next_comment_multi_pos = -1;
+ $next_comment_single_pos = -1;
+ $comment_regexp_cache_per_key = array();
+ $comment_multi_cache_per_key = array();
+ $comment_single_cache_per_key = array();
+ $next_open_comment_multi = '';
+ $next_comment_single_key = '';
+ $escape_regexp_cache_per_key = array();
+ $next_escape_regexp_key = '';
+ $next_escape_regexp_pos = -1;
+
+ $length = strlen($part);
+ for ($i = 0; $i < $length; ++$i) {
+ // Get the next char
+ $char = $part[$i];
+ $char_len = 1;
+
+ // update regexp comment cache if needed
+ if (isset($this->language_data['COMMENT_REGEXP']) && $next_comment_regexp_pos < $i) {
+ $next_comment_regexp_pos = $length;
+ foreach ($this->language_data['COMMENT_REGEXP'] as $comment_key => $regexp) {
+ $match_i = false;
+ if (isset($comment_regexp_cache_per_key[$comment_key]) &&
+ ($comment_regexp_cache_per_key[$comment_key]['pos'] >= $i ||
+ $comment_regexp_cache_per_key[$comment_key]['pos'] === false)) {
+ // we have already matched something
+ if ($comment_regexp_cache_per_key[$comment_key]['pos'] === false) {
+ // this comment is never matched
+ continue;
+ }
+ $match_i = $comment_regexp_cache_per_key[$comment_key]['pos'];
+ } elseif (
+ //This is to allow use of the offset parameter in preg_match and stay as compatible with older PHP versions as possible
+ (GESHI_PHP_PRE_433 && preg_match($regexp, substr($part, $i), $match, PREG_OFFSET_CAPTURE)) ||
+ (!GESHI_PHP_PRE_433 && preg_match($regexp, $part, $match, PREG_OFFSET_CAPTURE, $i))
+ ) {
+ $match_i = $match[0][1];
+ if (GESHI_PHP_PRE_433) {
+ $match_i += $i;
+ }
+
+ $comment_regexp_cache_per_key[$comment_key] = array(
+ 'key' => $comment_key,
+ 'length' => strlen($match[0][0]),
+ 'pos' => $match_i
+ );
+ } else {
+ $comment_regexp_cache_per_key[$comment_key]['pos'] = false;
+ continue;
+ }
+
+ if ($match_i !== false && $match_i < $next_comment_regexp_pos) {
+ $next_comment_regexp_pos = $match_i;
+ $next_comment_regexp_key = $comment_key;
+ if ($match_i === $i) {
+ break;
+ }
+ }
+ }
+ }
+
+ $string_started = false;
+
+ if (isset($is_string_starter[$char])) {
+ // Possibly the start of a new string ...
+
+ //Check which starter it was ...
+ //Fix for SF#1932083: Multichar Quotemarks unsupported
+ if (is_array($is_string_starter[$char])) {
+ $char_new = '';
+ foreach ($is_string_starter[$char] as $testchar) {
+ if ($testchar === substr($part, $i, strlen($testchar)) &&
+ strlen($testchar) > strlen($char_new)) {
+ $char_new = $testchar;
+ $string_started = true;
+ }
+ }
+ if ($string_started) {
+ $char = $char_new;
+ }
+ } else {
+ $testchar = $is_string_starter[$char];
+ if ($testchar === substr($part, $i, strlen($testchar))) {
+ $char = $testchar;
+ $string_started = true;
+ }
+ }
+ $char_len = strlen($char);
+ }
+
+ if ($string_started && ($i != $next_comment_regexp_pos)) {
+ // Hand out the correct style information for this string
+ $string_key = array_search($char, $this->language_data['QUOTEMARKS']);
+ if (!isset($this->language_data['STYLES']['STRINGS'][$string_key]) ||
+ !isset($this->language_data['STYLES']['ESCAPE_CHAR'][$string_key])) {
+ $string_key = 0;
+ }
+
+ // parse the stuff before this
+ $result .= $this->parse_non_string_part($stuff_to_parse);
+ $stuff_to_parse = '';
+
+ if (!$this->use_classes) {
+ $string_attributes = ' style="' . $this->language_data['STYLES']['STRINGS'][$string_key] . '"';
+ } else {
+ $string_attributes = ' class="st'.$string_key.'"';
+ }
+
+ // now handle the string
+ $string = "<span$string_attributes>" . GeSHi::hsc($char);
+ $start = $i + $char_len;
+ $string_open = true;
+
+ if(empty($this->language_data['ESCAPE_REGEXP'])) {
+ $next_escape_regexp_pos = $length;
+ }
+
+ do {
+ //Get the regular ending pos ...
+ $close_pos = strpos($part, $char, $start);
+ if(false === $close_pos) {
+ $close_pos = $length;
+ }
+
+ if($this->lexic_permissions['ESCAPE_CHAR']) {
+ // update escape regexp cache if needed
+ if (isset($this->language_data['ESCAPE_REGEXP']) && $next_escape_regexp_pos < $start) {
+ $next_escape_regexp_pos = $length;
+ foreach ($this->language_data['ESCAPE_REGEXP'] as $escape_key => $regexp) {
+ $match_i = false;
+ if (isset($escape_regexp_cache_per_key[$escape_key]) &&
+ ($escape_regexp_cache_per_key[$escape_key]['pos'] >= $start ||
+ $escape_regexp_cache_per_key[$escape_key]['pos'] === false)) {
+ // we have already matched something
+ if ($escape_regexp_cache_per_key[$escape_key]['pos'] === false) {
+ // this comment is never matched
+ continue;
+ }
+ $match_i = $escape_regexp_cache_per_key[$escape_key]['pos'];
+ } elseif (
+ //This is to allow use of the offset parameter in preg_match and stay as compatible with older PHP versions as possible
+ (GESHI_PHP_PRE_433 && preg_match($regexp, substr($part, $start), $match, PREG_OFFSET_CAPTURE)) ||
+ (!GESHI_PHP_PRE_433 && preg_match($regexp, $part, $match, PREG_OFFSET_CAPTURE, $start))
+ ) {
+ $match_i = $match[0][1];
+ if (GESHI_PHP_PRE_433) {
+ $match_i += $start;
+ }
+
+ $escape_regexp_cache_per_key[$escape_key] = array(
+ 'key' => $escape_key,
+ 'length' => strlen($match[0][0]),
+ 'pos' => $match_i
+ );
+ } else {
+ $escape_regexp_cache_per_key[$escape_key]['pos'] = false;
+ continue;
+ }
+
+ if ($match_i !== false && $match_i < $next_escape_regexp_pos) {
+ $next_escape_regexp_pos = $match_i;
+ $next_escape_regexp_key = $escape_key;
+ if ($match_i === $start) {
+ break;
+ }
+ }
+ }
+ }
+
+ //Find the next simple escape position
+ if('' != $this->language_data['ESCAPE_CHAR']) {
+ $simple_escape = strpos($part, $this->language_data['ESCAPE_CHAR'], $start);
+ if(false === $simple_escape) {
+ $simple_escape = $length;
+ }
+ } else {
+ $simple_escape = $length;
+ }
+ } else {
+ $next_escape_regexp_pos = $length;
+ $simple_escape = $length;
+ }
+
+ if($simple_escape < $next_escape_regexp_pos &&
+ $simple_escape < $length &&
+ $simple_escape < $close_pos) {
+ //The nexxt escape sequence is a simple one ...
+ $es_pos = $simple_escape;
+
+ //Add the stuff not in the string yet ...
+ $string .= $this->hsc(substr($part, $start, $es_pos - $start));
+
+ //Get the style for this escaped char ...
+ if (!$this->use_classes) {
+ $escape_char_attributes = ' style="' . $this->language_data['STYLES']['ESCAPE_CHAR'][0] . '"';
+ } else {
+ $escape_char_attributes = ' class="es0"';
+ }
+
+ //Add the style for the escape char ...
+ $string .= "<span$escape_char_attributes>" .
+ GeSHi::hsc($this->language_data['ESCAPE_CHAR']);
+
+ //Get the byte AFTER the ESCAPE_CHAR we just found
+ $es_char = $part[$es_pos + 1];
+ if ($es_char == "\n") {
+ // don't put a newline around newlines
+ $string .= "</span>\n";
+ $start = $es_pos + 2;
+ } elseif (ord($es_char) >= 128) {
+ //This is an non-ASCII char (UTF8 or single byte)
+ //This code tries to work around SF#2037598 ...
+ if(function_exists('mb_substr')) {
+ $es_char_m = mb_substr(substr($part, $es_pos+1, 16), 0, 1, $this->encoding);
+ $string .= $es_char_m . '</span>';
+ } elseif (!GESHI_PHP_PRE_433 && 'utf-8' == $this->encoding) {
+ if(preg_match("/[\xC2-\xDF][\x80-\xBF]".
+ "|\xE0[\xA0-\xBF][\x80-\xBF]".
+ "|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}".
+ "|\xED[\x80-\x9F][\x80-\xBF]".
+ "|\xF0[\x90-\xBF][\x80-\xBF]{2}".
+ "|[\xF1-\xF3][\x80-\xBF]{3}".
+ "|\xF4[\x80-\x8F][\x80-\xBF]{2}/s",
+ $part, $es_char_m, null, $es_pos + 1)) {
+ $es_char_m = $es_char_m[0];
+ } else {
+ $es_char_m = $es_char;
+ }
+ $string .= $this->hsc($es_char_m) . '</span>';
+ } else {
+ $es_char_m = $this->hsc($es_char);
+ }
+ $start = $es_pos + strlen($es_char_m) + 1;
+ } else {
+ $string .= $this->hsc($es_char) . '</span>';
+ $start = $es_pos + 2;
+ }
+ } elseif ($next_escape_regexp_pos < $length &&
+ $next_escape_regexp_pos < $close_pos) {
+ $es_pos = $next_escape_regexp_pos;
+ //Add the stuff not in the string yet ...
+ $string .= $this->hsc(substr($part, $start, $es_pos - $start));
+
+ //Get the key and length of this match ...
+ $escape = $escape_regexp_cache_per_key[$next_escape_regexp_key];
+ $escape_str = substr($part, $es_pos, $escape['length']);
+ $escape_key = $escape['key'];
+
+ //Get the style for this escaped char ...
+ if (!$this->use_classes) {
+ $escape_char_attributes = ' style="' . $this->language_data['STYLES']['ESCAPE_CHAR'][$escape_key] . '"';
+ } else {
+ $escape_char_attributes = ' class="es' . $escape_key . '"';
+ }
+
+ //Add the style for the escape char ...
+ $string .= "<span$escape_char_attributes>" .
+ $this->hsc($escape_str) . '</span>';
+
+ $start = $es_pos + $escape['length'];
+ } else {
+ //Copy the remainder of the string ...
+ $string .= $this->hsc(substr($part, $start, $close_pos - $start + $char_len)) . '</span>';
+ $start = $close_pos + $char_len;
+ $string_open = false;
+ }
+ } while($string_open);
+
+ if ($check_linenumbers) {
+ // Are line numbers used? If, we should end the string before
+ // the newline and begin it again (so when <li>s are put in the source
+ // remains XHTML compliant)
+ // note to self: This opens up possibility of config files specifying
+ // that languages can/cannot have multiline strings???
+ $string = str_replace("\n", "</span>\n<span$string_attributes>", $string);
+ }
+
+ $result .= $string;
+ $string = '';
+ $i = $start - 1;
+ continue;
+ } elseif ($this->lexic_permissions['STRINGS'] && $hq && $hq[0] == $char &&
+ substr($part, $i, $hq_strlen) == $hq && ($i != $next_comment_regexp_pos)) {
+ // The start of a hard quoted string
+ if (!$this->use_classes) {
+ $string_attributes = ' style="' . $this->language_data['STYLES']['STRINGS']['HARD'] . '"';
+ $escape_char_attributes = ' style="' . $this->language_data['STYLES']['ESCAPE_CHAR']['HARD'] . '"';
+ } else {
+ $string_attributes = ' class="st_h"';
+ $escape_char_attributes = ' class="es_h"';
+ }
+ // parse the stuff before this
+ $result .= $this->parse_non_string_part($stuff_to_parse);
+ $stuff_to_parse = '';
+
+ // now handle the string
+ $string = '';
+
+ // look for closing quote
+ $start = $i + $hq_strlen;
+ while ($close_pos = strpos($part, $this->language_data['HARDQUOTE'][1], $start)) {
+ $start = $close_pos + 1;
+ if ($this->lexic_permissions['ESCAPE_CHAR'] && $part[$close_pos - 1] == $this->language_data['HARDCHAR'] &&
+ (($i + $hq_strlen) != ($close_pos))) { //Support empty string for HQ escapes if Starter = Escape
+ // make sure this quote is not escaped
+ foreach ($this->language_data['HARDESCAPE'] as $hardescape) {
+ if (substr($part, $close_pos - 1, strlen($hardescape)) == $hardescape) {
+ // check wether this quote is escaped or if it is something like '\\'
+ $escape_char_pos = $close_pos - 1;
+ while ($escape_char_pos > 0
+ && $part[$escape_char_pos - 1] == $this->language_data['HARDCHAR']) {
+ --$escape_char_pos;
+ }
+ if (($close_pos - $escape_char_pos) & 1) {
+ // uneven number of escape chars => this quote is escaped
+ continue 2;
+ }
+ }
+ }
+ }
+
+ // found closing quote
+ break;
+ }
+
+ //Found the closing delimiter?
+ if (!$close_pos) {
+ // span till the end of this $part when no closing delimiter is found
+ $close_pos = $length;
+ }
+
+ //Get the actual string
+ $string = substr($part, $i, $close_pos - $i + 1);
+ $i = $close_pos;
+
+ // handle escape chars and encode html chars
+ // (special because when we have escape chars within our string they may not be escaped)
+ if ($this->lexic_permissions['ESCAPE_CHAR'] && $this->language_data['ESCAPE_CHAR']) {
+ $start = 0;
+ $new_string = '';
+ while ($es_pos = strpos($string, $this->language_data['ESCAPE_CHAR'], $start)) {
+ // hmtl escape stuff before
+ $new_string .= $this->hsc(substr($string, $start, $es_pos - $start));
+ // check if this is a hard escape
+ foreach ($this->language_data['HARDESCAPE'] as $hardescape) {
+ if (substr($string, $es_pos, strlen($hardescape)) == $hardescape) {
+ // indeed, this is a hardescape
+ $new_string .= "<span$escape_char_attributes>" .
+ $this->hsc($hardescape) . '</span>';
+ $start = $es_pos + strlen($hardescape);
+ continue 2;
+ }
+ }
+ // not a hard escape, but a normal escape
+ // they come in pairs of two
+ $c = 0;
+ while (isset($string[$es_pos + $c]) && isset($string[$es_pos + $c + 1])
+ && $string[$es_pos + $c] == $this->language_data['ESCAPE_CHAR']
+ && $string[$es_pos + $c + 1] == $this->language_data['ESCAPE_CHAR']) {
+ $c += 2;
+ }
+ if ($c) {
+ $new_string .= "<span$escape_char_attributes>" .
+ str_repeat($escaped_escape_char, $c) .
+ '</span>';
+ $start = $es_pos + $c;
+ } else {
+ // this is just a single lonely escape char...
+ $new_string .= $escaped_escape_char;
+ $start = $es_pos + 1;
+ }
+ }
+ $string = $new_string . $this->hsc(substr($string, $start));
+ } else {
+ $string = $this->hsc($string);
+ }
+
+ if ($check_linenumbers) {
+ // Are line numbers used? If, we should end the string before
+ // the newline and begin it again (so when <li>s are put in the source
+ // remains XHTML compliant)
+ // note to self: This opens up possibility of config files specifying
+ // that languages can/cannot have multiline strings???
+ $string = str_replace("\n", "</span>\n<span$string_attributes>", $string);
+ }
+
+ $result .= "<span$string_attributes>" . $string . '</span>';
+ $string = '';
+ continue;
+ } else {
+ //Have a look for regexp comments
+ if ($i == $next_comment_regexp_pos) {
+ $COMMENT_MATCHED = true;
+ $comment = $comment_regexp_cache_per_key[$next_comment_regexp_key];
+ $test_str = $this->hsc(substr($part, $i, $comment['length']));
+
+ //@todo If remove important do remove here
+ if ($this->lexic_permissions['COMMENTS']['MULTI']) {
+ if (!$this->use_classes) {
+ $attributes = ' style="' . $this->language_data['STYLES']['COMMENTS'][$comment['key']] . '"';
+ } else {
+ $attributes = ' class="co' . $comment['key'] . '"';
+ }
+
+ $test_str = "<span$attributes>" . $test_str . "</span>";
+
+ // Short-cut through all the multiline code
+ if ($check_linenumbers) {
+ // strreplace to put close span and open span around multiline newlines
+ $test_str = str_replace(
+ "\n", "</span>\n<span$attributes>",
+ str_replace("\n ", "\n&nbsp;", $test_str)
+ );
+ }
+ }
+
+ $i += $comment['length'] - 1;
+
+ // parse the rest
+ $result .= $this->parse_non_string_part($stuff_to_parse);
+ $stuff_to_parse = '';
+ }
+
+ // If we haven't matched a regexp comment, try multi-line comments
+ if (!$COMMENT_MATCHED) {
+ // Is this a multiline comment?
+ if (!empty($this->language_data['COMMENT_MULTI']) && $next_comment_multi_pos < $i) {
+ $next_comment_multi_pos = $length;
+ foreach ($this->language_data['COMMENT_MULTI'] as $open => $close) {
+ $match_i = false;
+ if (isset($comment_multi_cache_per_key[$open]) &&
+ ($comment_multi_cache_per_key[$open] >= $i ||
+ $comment_multi_cache_per_key[$open] === false)) {
+ // we have already matched something
+ if ($comment_multi_cache_per_key[$open] === false) {
+ // this comment is never matched
+ continue;
+ }
+ $match_i = $comment_multi_cache_per_key[$open];
+ } elseif (($match_i = stripos($part, $open, $i)) !== false) {
+ $comment_multi_cache_per_key[$open] = $match_i;
+ } else {
+ $comment_multi_cache_per_key[$open] = false;
+ continue;
+ }
+ if ($match_i !== false && $match_i < $next_comment_multi_pos) {
+ $next_comment_multi_pos = $match_i;
+ $next_open_comment_multi = $open;
+ if ($match_i === $i) {
+ break;
+ }
+ }
+ }
+ }
+ if ($i == $next_comment_multi_pos) {
+ $open = $next_open_comment_multi;
+ $close = $this->language_data['COMMENT_MULTI'][$open];
+ $open_strlen = strlen($open);
+ $close_strlen = strlen($close);
+ $COMMENT_MATCHED = true;
+ $test_str_match = $open;
+ //@todo If remove important do remove here
+ if ($this->lexic_permissions['COMMENTS']['MULTI'] ||
+ $open == GESHI_START_IMPORTANT) {
+ if ($open != GESHI_START_IMPORTANT) {
+ if (!$this->use_classes) {
+ $attributes = ' style="' . $this->language_data['STYLES']['COMMENTS']['MULTI'] . '"';
+ } else {
+ $attributes = ' class="coMULTI"';
+ }
+ $test_str = "<span$attributes>" . $this->hsc($open);
+ } else {
+ if (!$this->use_classes) {
+ $attributes = ' style="' . $this->important_styles . '"';
+ } else {
+ $attributes = ' class="imp"';
+ }
+
+ // We don't include the start of the comment if it's an
+ // "important" part
+ $test_str = "<span$attributes>";
+ }
+ } else {
+ $test_str = $this->hsc($open);
+ }
+
+ $close_pos = strpos( $part, $close, $i + $open_strlen );
+
+ if ($close_pos === false) {
+ $close_pos = $length;
+ }
+
+ // Short-cut through all the multiline code
+ $rest_of_comment = $this->hsc(substr($part, $i + $open_strlen, $close_pos - $i - $open_strlen + $close_strlen));
+ if (($this->lexic_permissions['COMMENTS']['MULTI'] ||
+ $test_str_match == GESHI_START_IMPORTANT) &&
+ $check_linenumbers) {
+
+ // strreplace to put close span and open span around multiline newlines
+ $test_str .= str_replace(
+ "\n", "</span>\n<span$attributes>",
+ str_replace("\n ", "\n&nbsp;", $rest_of_comment)
+ );
+ } else {
+ $test_str .= $rest_of_comment;
+ }
+
+ if ($this->lexic_permissions['COMMENTS']['MULTI'] ||
+ $test_str_match == GESHI_START_IMPORTANT) {
+ $test_str .= '</span>';
+ }
+
+ $i = $close_pos + $close_strlen - 1;
+
+ // parse the rest
+ $result .= $this->parse_non_string_part($stuff_to_parse);
+ $stuff_to_parse = '';
+ }
+ }
+
+ // If we haven't matched a multiline comment, try single-line comments
+ if (!$COMMENT_MATCHED) {
+ // cache potential single line comment occurances
+ if (!empty($this->language_data['COMMENT_SINGLE']) && $next_comment_single_pos < $i) {
+ $next_comment_single_pos = $length;
+ foreach ($this->language_data['COMMENT_SINGLE'] as $comment_key => $comment_mark) {
+ $match_i = false;
+ if (isset($comment_single_cache_per_key[$comment_key]) &&
+ ($comment_single_cache_per_key[$comment_key] >= $i ||
+ $comment_single_cache_per_key[$comment_key] === false)) {
+ // we have already matched something
+ if ($comment_single_cache_per_key[$comment_key] === false) {
+ // this comment is never matched
+ continue;
+ }
+ $match_i = $comment_single_cache_per_key[$comment_key];
+ } elseif (
+ // case sensitive comments
+ ($this->language_data['CASE_SENSITIVE'][GESHI_COMMENTS] &&
+ ($match_i = stripos($part, $comment_mark, $i)) !== false) ||
+ // non case sensitive
+ (!$this->language_data['CASE_SENSITIVE'][GESHI_COMMENTS] &&
+ (($match_i = strpos($part, $comment_mark, $i)) !== false))) {
+ $comment_single_cache_per_key[$comment_key] = $match_i;
+ } else {
+ $comment_single_cache_per_key[$comment_key] = false;
+ continue;
+ }
+ if ($match_i !== false && $match_i < $next_comment_single_pos) {
+ $next_comment_single_pos = $match_i;
+ $next_comment_single_key = $comment_key;
+ if ($match_i === $i) {
+ break;
+ }
+ }
+ }
+ }
+ if ($next_comment_single_pos == $i) {
+ $comment_key = $next_comment_single_key;
+ $comment_mark = $this->language_data['COMMENT_SINGLE'][$comment_key];
+ $com_len = strlen($comment_mark);
+
+ // This check will find special variables like $# in bash
+ // or compiler directives of Delphi beginning {$
+ if ((empty($sc_disallowed_before) || ($i == 0) ||
+ (false === strpos($sc_disallowed_before, $part[$i-1]))) &&
+ (empty($sc_disallowed_after) || ($length <= $i + $com_len) ||
+ (false === strpos($sc_disallowed_after, $part[$i + $com_len]))))
+ {
+ // this is a valid comment
+ $COMMENT_MATCHED = true;
+ if ($this->lexic_permissions['COMMENTS'][$comment_key]) {
+ if (!$this->use_classes) {
+ $attributes = ' style="' . $this->language_data['STYLES']['COMMENTS'][$comment_key] . '"';
+ } else {
+ $attributes = ' class="co' . $comment_key . '"';
+ }
+ $test_str = "<span$attributes>" . $this->hsc($this->change_case($comment_mark));
+ } else {
+ $test_str = $this->hsc($comment_mark);
+ }
+
+ //Check if this comment is the last in the source
+ $close_pos = strpos($part, "\n", $i);
+ $oops = false;
+ if ($close_pos === false) {
+ $close_pos = $length;
+ $oops = true;
+ }
+ $test_str .= $this->hsc(substr($part, $i + $com_len, $close_pos - $i - $com_len));
+ if ($this->lexic_permissions['COMMENTS'][$comment_key]) {
+ $test_str .= "</span>";
+ }
+
+ // Take into account that the comment might be the last in the source
+ if (!$oops) {
+ $test_str .= "\n";
+ }
+
+ $i = $close_pos;
+
+ // parse the rest
+ $result .= $this->parse_non_string_part($stuff_to_parse);
+ $stuff_to_parse = '';
+ }
+ }
+ }
+ }
+
+ // Where are we adding this char?
+ if (!$COMMENT_MATCHED) {
+ $stuff_to_parse .= $char;
+ } else {
+ $result .= $test_str;
+ unset($test_str);
+ $COMMENT_MATCHED = false;
+ }
+ }
+ // Parse the last bit
+ $result .= $this->parse_non_string_part($stuff_to_parse);
+ $stuff_to_parse = '';
+ } else {
+ $result .= $this->hsc($part);
+ }
+ // Close the <span> that surrounds the block
+ if ($STRICTATTRS != '') {
+ $result = str_replace("\n", "</span>\n<span$STRICTATTRS>", $result);
+ $result .= '</span>';
+ }
+
+ $endresult .= $result;
+ unset($part, $parts[$key], $result);
+ }
+
+ //This fix is related to SF#1923020, but has to be applied regardless of
+ //actually highlighting symbols.
+ /** NOTE: memorypeak #3 */
+ $endresult = str_replace(array('<SEMI>', '<PIPE>'), array(';', '|'), $endresult);
+
+// // Parse the last stuff (redundant?)
+// $result .= $this->parse_non_string_part($stuff_to_parse);
+
+ // Lop off the very first and last spaces
+// $result = substr($result, 1, -1);
+
+ // We're finished: stop timing
+ $this->set_time($start_time, microtime());
+
+ $this->finalise($endresult);
+ return $endresult;
+ }
+
+ /**
+ * Swaps out spaces and tabs for HTML indentation. Not needed if
+ * the code is in a pre block...
+ *
+ * @param string The source to indent (reference!)
+ * @since 1.0.0
+ * @access private
+ */
+ function indent(&$result) {
+ /// Replace tabs with the correct number of spaces
+ if (false !== strpos($result, "\t")) {
+ $lines = explode("\n", $result);
+ $result = null;//Save memory while we process the lines individually
+ $tab_width = $this->get_real_tab_width();
+ $tab_string = '&nbsp;' . str_repeat(' ', $tab_width);
+
+ for ($key = 0, $n = count($lines); $key < $n; $key++) {
+ $line = $lines[$key];
+ if (false === strpos($line, "\t")) {
+ continue;
+ }
+
+ $pos = 0;
+ $length = strlen($line);
+ $lines[$key] = ''; // reduce memory
+
+ $IN_TAG = false;
+ for ($i = 0; $i < $length; ++$i) {
+ $char = $line[$i];
+ // Simple engine to work out whether we're in a tag.
+ // If we are we modify $pos. This is so we ignore HTML
+ // in the line and only workout the tab replacement
+ // via the actual content of the string
+ // This test could be improved to include strings in the
+ // html so that < or > would be allowed in user's styles
+ // (e.g. quotes: '<' '>'; or similar)
+ if ($IN_TAG) {
+ if ('>' == $char) {
+ $IN_TAG = false;
+ }
+ $lines[$key] .= $char;
+ } elseif ('<' == $char) {
+ $IN_TAG = true;
+ $lines[$key] .= '<';
+ } elseif ('&' == $char) {
+ $substr = substr($line, $i + 3, 5);
+ $posi = strpos($substr, ';');
+ if (false === $posi) {
+ ++$pos;
+ } else {
+ $pos -= $posi+2;
+ }
+ $lines[$key] .= $char;
+ } elseif ("\t" == $char) {
+ $str = '';
+ // OPTIMISE - move $strs out. Make an array:
+ // $tabs = array(
+ // 1 => '&nbsp;',
+ // 2 => '&nbsp; ',
+ // 3 => '&nbsp; &nbsp;' etc etc
+ // to use instead of building a string every time
+ $tab_end_width = $tab_width - ($pos % $tab_width); //Moved out of the look as it doesn't change within the loop
+ if (($pos & 1) || 1 == $tab_end_width) {
+ $str .= substr($tab_string, 6, $tab_end_width);
+ } else {
+ $str .= substr($tab_string, 0, $tab_end_width+5);
+ }
+ $lines[$key] .= $str;
+ $pos += $tab_end_width;
+
+ if (false === strpos($line, "\t", $i + 1)) {
+ $lines[$key] .= substr($line, $i + 1);
+ break;
+ }
+ } elseif (0 == $pos && ' ' == $char) {
+ $lines[$key] .= '&nbsp;';
+ ++$pos;
+ } else {
+ $lines[$key] .= $char;
+ ++$pos;
+ }
+ }
+ }
+ $result = implode("\n", $lines);
+ unset($lines);//We don't need the lines separated beyond this --- free them!
+ }
+ // Other whitespace
+ // BenBE: Fix to reduce the number of replacements to be done
+ $result = preg_replace('/^ /m', '&nbsp;', $result);
+ $result = str_replace(' ', ' &nbsp;', $result);
+
+ if ($this->line_numbers == GESHI_NO_LINE_NUMBERS && $this->header_type != GESHI_HEADER_PRE_TABLE) {
+ if ($this->line_ending === null) {
+ $result = nl2br($result);
+ } else {
+ $result = str_replace("\n", $this->line_ending, $result);
+ }
+ }
+ }
+
+ /**
+ * Changes the case of a keyword for those languages where a change is asked for
+ *
+ * @param string The keyword to change the case of
+ * @return string The keyword with its case changed
+ * @since 1.0.0
+ * @access private
+ */
+ function change_case($instr) {
+ switch ($this->language_data['CASE_KEYWORDS']) {
+ case GESHI_CAPS_UPPER:
+ return strtoupper($instr);
+ case GESHI_CAPS_LOWER:
+ return strtolower($instr);
+ default:
+ return $instr;
+ }
+ }
+
+ /**
+ * Handles replacements of keywords to include markup and links if requested
+ *
+ * @param string The keyword to add the Markup to
+ * @return The HTML for the match found
+ * @since 1.0.8
+ * @access private
+ *
+ * @todo Get rid of ender in keyword links
+ */
+ function handle_keyword_replace($match) {
+ $k = $this->_kw_replace_group;
+ $keyword = $match[0];
+ $keyword_match = $match[1];
+
+ $before = '';
+ $after = '';
+
+ if ($this->keyword_links) {
+ // Keyword links have been ebabled
+
+ if (isset($this->language_data['URLS'][$k]) &&
+ $this->language_data['URLS'][$k] != '') {
+ // There is a base group for this keyword
+
+ // Old system: strtolower
+ //$keyword = ( $this->language_data['CASE_SENSITIVE'][$group] ) ? $keyword : strtolower($keyword);
+ // New system: get keyword from language file to get correct case
+ if (!$this->language_data['CASE_SENSITIVE'][$k] &&
+ strpos($this->language_data['URLS'][$k], '{FNAME}') !== false) {
+ foreach ($this->language_data['KEYWORDS'][$k] as $word) {
+ if (strcasecmp($word, $keyword_match) == 0) {
+ break;
+ }
+ }
+ } else {
+ $word = $keyword_match;
+ }
+
+ $before = '<|UR1|"' .
+ str_replace(
+ array(
+ '{FNAME}',
+ '{FNAMEL}',
+ '{FNAMEU}',
+ '.'),
+ array(
+ str_replace('+', '%20', urlencode($this->hsc($word))),
+ str_replace('+', '%20', urlencode($this->hsc(strtolower($word)))),
+ str_replace('+', '%20', urlencode($this->hsc(strtoupper($word)))),
+ '<DOT>'),
+ $this->language_data['URLS'][$k]
+ ) . '">';
+ $after = '</a>';
+ }
+ }
+
+ return $before . '<|/'. $k .'/>' . $this->change_case($keyword) . '|>' . $after;
+ }
+
+ /**
+ * handles regular expressions highlighting-definitions with callback functions
+ *
+ * @note this is a callback, don't use it directly
+ *
+ * @param array the matches array
+ * @return The highlighted string
+ * @since 1.0.8
+ * @access private
+ */
+ function handle_regexps_callback($matches) {
+ // before: "' style=\"' . call_user_func(\"$func\", '\\1') . '\"\\1|>'",
+ return ' style="' . call_user_func($this->language_data['STYLES']['REGEXPS'][$this->_rx_key], $matches[1]) . '"'. $matches[1] . '|>';
+ }
+
+ /**
+ * handles newlines in REGEXPS matches. Set the _hmr_* vars before calling this
+ *
+ * @note this is a callback, don't use it directly
+ *
+ * @param array the matches array
+ * @return string
+ * @since 1.0.8
+ * @access private
+ */
+ function handle_multiline_regexps($matches) {
+ $before = $this->_hmr_before;
+ $after = $this->_hmr_after;
+ if ($this->_hmr_replace) {
+ $replace = $this->_hmr_replace;
+ $search = array();
+
+ foreach (array_keys($matches) as $k) {
+ $search[] = '\\' . $k;
+ }
+
+ $before = str_replace($search, $matches, $before);
+ $after = str_replace($search, $matches, $after);
+ $replace = str_replace($search, $matches, $replace);
+ } else {
+ $replace = $matches[0];
+ }
+ return $before
+ . '<|!REG3XP' . $this->_hmr_key .'!>'
+ . str_replace("\n", "|>\n<|!REG3XP" . $this->_hmr_key . '!>', $replace)
+ . '|>'
+ . $after;
+ }
+
+ /**
+ * Takes a string that has no strings or comments in it, and highlights
+ * stuff like keywords, numbers and methods.
+ *
+ * @param string The string to parse for keyword, numbers etc.
+ * @since 1.0.0
+ * @access private
+ * @todo BUGGY! Why? Why not build string and return?
+ */
+ function parse_non_string_part($stuff_to_parse) {
+ $stuff_to_parse = ' ' . $this->hsc($stuff_to_parse);
+
+ // Highlight keywords
+ $disallowed_before = "(?<![a-zA-Z0-9\$_\|\#|^&";
+ $disallowed_after = "(?![a-zA-Z0-9_\|%\\-&;";
+ if ($this->lexic_permissions['STRINGS']) {
+ $quotemarks = preg_quote(implode($this->language_data['QUOTEMARKS']), '/');
+ $disallowed_before .= $quotemarks;
+ $disallowed_after .= $quotemarks;
+ }
+ $disallowed_before .= "])";
+ $disallowed_after .= "])";
+
+ $parser_control_pergroup = false;
+ if (isset($this->language_data['PARSER_CONTROL'])) {
+ if (isset($this->language_data['PARSER_CONTROL']['KEYWORDS'])) {
+ $x = 0; // check wether per-keyword-group parser_control is enabled
+ if (isset($this->language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_BEFORE'])) {
+ $disallowed_before = $this->language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_BEFORE'];
+ ++$x;
+ }
+ if (isset($this->language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_AFTER'])) {
+ $disallowed_after = $this->language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_AFTER'];
+ ++$x;
+ }
+ $parser_control_pergroup = (count($this->language_data['PARSER_CONTROL']['KEYWORDS']) - $x) > 0;
+ }
+ }
+
+ foreach (array_keys($this->language_data['KEYWORDS']) as $k) {
+ if (!isset($this->lexic_permissions['KEYWORDS'][$k]) ||
+ $this->lexic_permissions['KEYWORDS'][$k]) {
+
+ $case_sensitive = $this->language_data['CASE_SENSITIVE'][$k];
+ $modifiers = $case_sensitive ? '' : 'i';
+
+ // NEW in 1.0.8 - per-keyword-group parser control
+ $disallowed_before_local = $disallowed_before;
+ $disallowed_after_local = $disallowed_after;
+ if ($parser_control_pergroup && isset($this->language_data['PARSER_CONTROL']['KEYWORDS'][$k])) {
+ if (isset($this->language_data['PARSER_CONTROL']['KEYWORDS'][$k]['DISALLOWED_BEFORE'])) {
+ $disallowed_before_local =
+ $this->language_data['PARSER_CONTROL']['KEYWORDS'][$k]['DISALLOWED_BEFORE'];
+ }
+
+ if (isset($this->language_data['PARSER_CONTROL']['KEYWORDS'][$k]['DISALLOWED_AFTER'])) {
+ $disallowed_after_local =
+ $this->language_data['PARSER_CONTROL']['KEYWORDS'][$k]['DISALLOWED_AFTER'];
+ }
+ }
+
+ $this->_kw_replace_group = $k;
+
+ //NEW in 1.0.8, the cached regexp list
+ // since we don't want PHP / PCRE to crash due to too large patterns we split them into smaller chunks
+ for ($set = 0, $set_length = count($this->language_data['CACHED_KEYWORD_LISTS'][$k]); $set < $set_length; ++$set) {
+ $keywordset =& $this->language_data['CACHED_KEYWORD_LISTS'][$k][$set];
+ // Might make a more unique string for putting the number in soon
+ // Basically, we don't put the styles in yet because then the styles themselves will
+ // get highlighted if the language has a CSS keyword in it (like CSS, for example ;))
+ $stuff_to_parse = preg_replace_callback(
+ "/$disallowed_before_local({$keywordset})(?!\<DOT\>(?:htm|php|aspx?))$disallowed_after_local/$modifiers",
+ array($this, 'handle_keyword_replace'),
+ $stuff_to_parse
+ );
+ }
+ }
+ }
+
+ // Regular expressions
+ foreach ($this->language_data['REGEXPS'] as $key => $regexp) {
+ if ($this->lexic_permissions['REGEXPS'][$key]) {
+ if (is_array($regexp)) {
+ if ($this->line_numbers != GESHI_NO_LINE_NUMBERS) {
+ // produce valid HTML when we match multiple lines
+ $this->_hmr_replace = $regexp[GESHI_REPLACE];
+ $this->_hmr_before = $regexp[GESHI_BEFORE];
+ $this->_hmr_key = $key;
+ $this->_hmr_after = $regexp[GESHI_AFTER];
+ $stuff_to_parse = preg_replace_callback(
+ "/" . $regexp[GESHI_SEARCH] . "/{$regexp[GESHI_MODIFIERS]}",
+ array($this, 'handle_multiline_regexps'),
+ $stuff_to_parse);
+ $this->_hmr_replace = false;
+ $this->_hmr_before = '';
+ $this->_hmr_after = '';
+ } else {
+ $stuff_to_parse = preg_replace(
+ '/' . $regexp[GESHI_SEARCH] . '/' . $regexp[GESHI_MODIFIERS],
+ $regexp[GESHI_BEFORE] . '<|!REG3XP'. $key .'!>' . $regexp[GESHI_REPLACE] . '|>' . $regexp[GESHI_AFTER],
+ $stuff_to_parse);
+ }
+ } else {
+ if ($this->line_numbers != GESHI_NO_LINE_NUMBERS) {
+ // produce valid HTML when we match multiple lines
+ $this->_hmr_key = $key;
+ $stuff_to_parse = preg_replace_callback( "/(" . $regexp . ")/",
+ array($this, 'handle_multiline_regexps'), $stuff_to_parse);
+ $this->_hmr_key = '';
+ } else {
+ $stuff_to_parse = preg_replace( "/(" . $regexp . ")/", "<|!REG3XP$key!>\\1|>", $stuff_to_parse);
+ }
+ }
+ }
+ }
+
+ // Highlight numbers. As of 1.0.8 we support different types of numbers
+ $numbers_found = false;
+
+ if ($this->lexic_permissions['NUMBERS'] && preg_match($this->language_data['PARSER_CONTROL']['NUMBERS']['PRECHECK_RX'], $stuff_to_parse )) {
+ $numbers_found = true;
+
+ //For each of the formats ...
+ foreach($this->language_data['NUMBERS_RXCACHE'] as $id => $regexp) {
+ //Check if it should be highlighted ...
+ $stuff_to_parse = preg_replace($regexp, "<|/NUM!$id/>\\1|>", $stuff_to_parse);
+ }
+ }
+
+ //
+ // Now that's all done, replace /[number]/ with the correct styles
+ //
+ foreach (array_keys($this->language_data['KEYWORDS']) as $k) {
+ if (!$this->use_classes) {
+ $attributes = ' style="' .
+ (isset($this->language_data['STYLES']['KEYWORDS'][$k]) ?
+ $this->language_data['STYLES']['KEYWORDS'][$k] : "") . '"';
+ } else {
+ $attributes = ' class="kw' . $k . '"';
+ }
+ $stuff_to_parse = str_replace("<|/$k/>", "<|$attributes>", $stuff_to_parse);
+ }
+
+ if ($numbers_found) {
+ // Put number styles in
+ foreach($this->language_data['NUMBERS_RXCACHE'] as $id => $regexp) {
+ //Commented out for now, as this needs some review ...
+ // if ($numbers_permissions & $id) {
+ //Get the appropriate style ...
+ //Checking for unset styles is done by the style cache builder ...
+ if (!$this->use_classes) {
+ $attributes = ' style="' . $this->language_data['STYLES']['NUMBERS'][$id] . '"';
+ } else {
+ $attributes = ' class="nu'.$id.'"';
+ }
+
+ //Set in the correct styles ...
+ $stuff_to_parse = str_replace("/NUM!$id/", $attributes, $stuff_to_parse);
+ // }
+ }
+ }
+
+ // Highlight methods and fields in objects
+ if ($this->lexic_permissions['METHODS'] && $this->language_data['OOLANG']) {
+ $oolang_spaces = "[\s]*";
+ $oolang_before = "";
+ $oolang_after = "[a-zA-Z][a-zA-Z0-9_]*";
+ if (isset($this->language_data['PARSER_CONTROL'])) {
+ if (isset($this->language_data['PARSER_CONTROL']['OOLANG'])) {
+ if (isset($this->language_data['PARSER_CONTROL']['OOLANG']['MATCH_BEFORE'])) {
+ $oolang_before = $this->language_data['PARSER_CONTROL']['OOLANG']['MATCH_BEFORE'];
+ }
+ if (isset($this->language_data['PARSER_CONTROL']['OOLANG']['MATCH_AFTER'])) {
+ $oolang_after = $this->language_data['PARSER_CONTROL']['OOLANG']['MATCH_AFTER'];
+ }
+ if (isset($this->language_data['PARSER_CONTROL']['OOLANG']['MATCH_SPACES'])) {
+ $oolang_spaces = $this->language_data['PARSER_CONTROL']['OOLANG']['MATCH_SPACES'];
+ }
+ }
+ }
+
+ foreach ($this->language_data['OBJECT_SPLITTERS'] as $key => $splitter) {
+ if (false !== strpos($stuff_to_parse, $splitter)) {
+ if (!$this->use_classes) {
+ $attributes = ' style="' . $this->language_data['STYLES']['METHODS'][$key] . '"';
+ } else {
+ $attributes = ' class="me' . $key . '"';
+ }
+ $stuff_to_parse = preg_replace("/($oolang_before)(" . preg_quote($this->language_data['OBJECT_SPLITTERS'][$key], '/') . ")($oolang_spaces)($oolang_after)/", "\\1\\2\\3<|$attributes>\\4|>", $stuff_to_parse);
+ }
+ }
+ }
+
+ //
+ // Highlight brackets. Yes, I've tried adding a semi-colon to this list.
+ // You try it, and see what happens ;)
+ // TODO: Fix lexic permissions not converting entities if shouldn't
+ // be highlighting regardless
+ //
+ if ($this->lexic_permissions['BRACKETS']) {
+ $stuff_to_parse = str_replace( $this->language_data['CACHE_BRACKET_MATCH'],
+ $this->language_data['CACHE_BRACKET_REPLACE'], $stuff_to_parse );
+ }
+
+
+ //FIX for symbol highlighting ...
+ if ($this->lexic_permissions['SYMBOLS'] && !empty($this->language_data['SYMBOLS'])) {
+ //Get all matches and throw away those witin a block that is already highlighted... (i.e. matched by a regexp)
+ $n_symbols = preg_match_all("/<\|(?:<DOT>|[^>])+>(?:(?!\|>).*?)\|>|<\/a>|(?:" . $this->language_data['SYMBOL_SEARCH'] . ")+(?![^<]+?>)/", $stuff_to_parse, $pot_symbols, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
+ $global_offset = 0;
+ for ($s_id = 0; $s_id < $n_symbols; ++$s_id) {
+ $symbol_match = $pot_symbols[$s_id][0][0];
+ if (strpos($symbol_match, '<') !== false || strpos($symbol_match, '>') !== false) {
+ // already highlighted blocks _must_ include either < or >
+ // so if this conditional applies, we have to skip this match
+ // BenBE: UNLESS the block contains <SEMI> or <PIPE>
+ if(strpos($symbol_match, '<SEMI>') === false &&
+ strpos($symbol_match, '<PIPE>') === false) {
+ continue;
+ }
+ }
+
+ // if we reach this point, we have a valid match which needs to be highlighted
+
+ $symbol_length = strlen($symbol_match);
+ $symbol_offset = $pot_symbols[$s_id][0][1];
+ unset($pot_symbols[$s_id]);
+ $symbol_end = $symbol_length + $symbol_offset;
+ $symbol_hl = "";
+
+ // if we have multiple styles, we have to handle them properly
+ if ($this->language_data['MULTIPLE_SYMBOL_GROUPS']) {
+ $old_sym = -1;
+ // Split the current stuff to replace into its atomic symbols ...
+ preg_match_all("/" . $this->language_data['SYMBOL_SEARCH'] . "/", $symbol_match, $sym_match_syms, PREG_PATTERN_ORDER);
+ foreach ($sym_match_syms[0] as $sym_ms) {
+ //Check if consequtive symbols belong to the same group to save output ...
+ if (isset($this->language_data['SYMBOL_DATA'][$sym_ms])
+ && ($this->language_data['SYMBOL_DATA'][$sym_ms] != $old_sym)) {
+ if (-1 != $old_sym) {
+ $symbol_hl .= "|>";
+ }
+ $old_sym = $this->language_data['SYMBOL_DATA'][$sym_ms];
+ if (!$this->use_classes) {
+ $symbol_hl .= '<| style="' . $this->language_data['STYLES']['SYMBOLS'][$old_sym] . '">';
+ } else {
+ $symbol_hl .= '<| class="sy' . $old_sym . '">';
+ }
+ }
+ $symbol_hl .= $sym_ms;
+ }
+ unset($sym_match_syms);
+
+ //Close remaining tags and insert the replacement at the right position ...
+ //Take caution if symbol_hl is empty to avoid doubled closing spans.
+ if (-1 != $old_sym) {
+ $symbol_hl .= "|>";
+ }
+ } else {
+ if (!$this->use_classes) {
+ $symbol_hl = '<| style="' . $this->language_data['STYLES']['SYMBOLS'][0] . '">';
+ } else {
+ $symbol_hl = '<| class="sy0">';
+ }
+ $symbol_hl .= $symbol_match . '|>';
+ }
+
+ $stuff_to_parse = substr_replace($stuff_to_parse, $symbol_hl, $symbol_offset + $global_offset, $symbol_length);
+
+ // since we replace old text with something of different size,
+ // we'll have to keep track of the differences
+ $global_offset += strlen($symbol_hl) - $symbol_length;
+ }
+ }
+ //FIX for symbol highlighting ...
+
+ // Add class/style for regexps
+ foreach (array_keys($this->language_data['REGEXPS']) as $key) {
+ if ($this->lexic_permissions['REGEXPS'][$key]) {
+ if (is_callable($this->language_data['STYLES']['REGEXPS'][$key])) {
+ $this->_rx_key = $key;
+ $stuff_to_parse = preg_replace_callback("/!REG3XP$key!(.*)\|>/U",
+ array($this, 'handle_regexps_callback'),
+ $stuff_to_parse);
+ } else {
+ if (!$this->use_classes) {
+ $attributes = ' style="' . $this->language_data['STYLES']['REGEXPS'][$key] . '"';
+ } else {
+ if (is_array($this->language_data['REGEXPS'][$key]) &&
+ array_key_exists(GESHI_CLASS, $this->language_data['REGEXPS'][$key])) {
+ $attributes = ' class="' .
+ $this->language_data['REGEXPS'][$key][GESHI_CLASS] . '"';
+ } else {
+ $attributes = ' class="re' . $key . '"';
+ }
+ }
+ $stuff_to_parse = str_replace("!REG3XP$key!", "$attributes", $stuff_to_parse);
+ }
+ }
+ }
+
+ // Replace <DOT> with . for urls
+ $stuff_to_parse = str_replace('<DOT>', '.', $stuff_to_parse);
+ // Replace <|UR1| with <a href= for urls also
+ if (isset($this->link_styles[GESHI_LINK])) {
+ if ($this->use_classes) {
+ $stuff_to_parse = str_replace('<|UR1|', '<a' . $this->link_target . ' href=', $stuff_to_parse);
+ } else {
+ $stuff_to_parse = str_replace('<|UR1|', '<a' . $this->link_target . ' style="' . $this->link_styles[GESHI_LINK] . '" href=', $stuff_to_parse);
+ }
+ } else {
+ $stuff_to_parse = str_replace('<|UR1|', '<a' . $this->link_target . ' href=', $stuff_to_parse);
+ }
+
+ //
+ // NOW we add the span thingy ;)
+ //
+
+ $stuff_to_parse = str_replace('<|', '<span', $stuff_to_parse);
+ $stuff_to_parse = str_replace ( '|>', '</span>', $stuff_to_parse );
+ return substr($stuff_to_parse, 1);
+ }
+
+ /**
+ * Sets the time taken to parse the code
+ *
+ * @param microtime The time when parsing started
+ * @param microtime The time when parsing ended
+ * @since 1.0.2
+ * @access private
+ */
+ function set_time($start_time, $end_time) {
+ $start = explode(' ', $start_time);
+ $end = explode(' ', $end_time);
+ $this->time = $end[0] + $end[1] - $start[0] - $start[1];
+ }
+
+ /**
+ * Gets the time taken to parse the code
+ *
+ * @return double The time taken to parse the code
+ * @since 1.0.2
+ */
+ function get_time() {
+ return $this->time;
+ }
+
+ /**
+ * Merges arrays recursively, overwriting values of the first array with values of later arrays
+ *
+ * @since 1.0.8
+ * @access private
+ */
+ function merge_arrays() {
+ $arrays = func_get_args();
+ $narrays = count($arrays);
+
+ // check arguments
+ // comment out if more performance is necessary (in this case the foreach loop will trigger a warning if the argument is not an array)
+ for ($i = 0; $i < $narrays; $i ++) {
+ if (!is_array($arrays[$i])) {
+ // also array_merge_recursive returns nothing in this case
+ trigger_error('Argument #' . ($i+1) . ' is not an array - trying to merge array with scalar! Returning false!', E_USER_WARNING);
+ return false;
+ }
+ }
+
+ // the first array is in the output set in every case
+ $ret = $arrays[0];
+
+ // merege $ret with the remaining arrays
+ for ($i = 1; $i < $narrays; $i ++) {
+ foreach ($arrays[$i] as $key => $value) {
+ if (is_array($value) && isset($ret[$key])) {
+ // if $ret[$key] is not an array you try to merge an scalar value with an array - the result is not defined (incompatible arrays)
+ // in this case the call will trigger an E_USER_WARNING and the $ret[$key] will be false.
+ $ret[$key] = $this->merge_arrays($ret[$key], $value);
+ } else {
+ $ret[$key] = $value;
+ }
+ }
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Gets language information and stores it for later use
+ *
+ * @param string The filename of the language file you want to load
+ * @since 1.0.0
+ * @access private
+ * @todo Needs to load keys for lexic permissions for keywords, regexps etc
+ */
+ function load_language($file_name) {
+ if ($file_name == $this->loaded_language) {
+ // this file is already loaded!
+ return;
+ }
+
+ //Prepare some stuff before actually loading the language file
+ $this->loaded_language = $file_name;
+ $this->parse_cache_built = false;
+ $this->enable_highlighting();
+ $language_data = array();
+
+ //Load the language file
+ require $file_name;
+
+ // Perhaps some checking might be added here later to check that
+ // $language data is a valid thing but maybe not
+ $this->language_data = $language_data;
+
+ // Set strict mode if should be set
+ $this->strict_mode = $this->language_data['STRICT_MODE_APPLIES'];
+
+ // Set permissions for all lexics to true
+ // so they'll be highlighted by default
+ foreach (array_keys($this->language_data['KEYWORDS']) as $key) {
+ if (!empty($this->language_data['KEYWORDS'][$key])) {
+ $this->lexic_permissions['KEYWORDS'][$key] = true;
+ } else {
+ $this->lexic_permissions['KEYWORDS'][$key] = false;
+ }
+ }
+
+ foreach (array_keys($this->language_data['COMMENT_SINGLE']) as $key) {
+ $this->lexic_permissions['COMMENTS'][$key] = true;
+ }
+ foreach (array_keys($this->language_data['REGEXPS']) as $key) {
+ $this->lexic_permissions['REGEXPS'][$key] = true;
+ }
+
+ // for BenBE and future code reviews:
+ // we can use empty here since we only check for existance and emptiness of an array
+ // if it is not an array at all but rather false or null this will work as intended as well
+ // even if $this->language_data['PARSER_CONTROL'] is undefined this won't trigger a notice
+ if (!empty($this->language_data['PARSER_CONTROL']['ENABLE_FLAGS'])) {
+ foreach ($this->language_data['PARSER_CONTROL']['ENABLE_FLAGS'] as $flag => $value) {
+ // it's either true or false and maybe is true as well
+ $perm = $value !== GESHI_NEVER;
+ if ($flag == 'ALL') {
+ $this->enable_highlighting($perm);
+ continue;
+ }
+ if (!isset($this->lexic_permissions[$flag])) {
+ // unknown lexic permission
+ continue;
+ }
+ if (is_array($this->lexic_permissions[$flag])) {
+ foreach ($this->lexic_permissions[$flag] as $key => $val) {
+ $this->lexic_permissions[$flag][$key] = $perm;
+ }
+ } else {
+ $this->lexic_permissions[$flag] = $perm;
+ }
+ }
+ unset($this->language_data['PARSER_CONTROL']['ENABLE_FLAGS']);
+ }
+
+ //Fix: Problem where hardescapes weren't handled if no ESCAPE_CHAR was given
+ //You need to set one for HARDESCAPES only in this case.
+ if(!isset($this->language_data['HARDCHAR'])) {
+ $this->language_data['HARDCHAR'] = $this->language_data['ESCAPE_CHAR'];
+ }
+
+ //NEW in 1.0.8: Allow styles to be loaded from a separate file to override defaults
+ $style_filename = substr($file_name, 0, -4) . '.style.php';
+ if (is_readable($style_filename)) {
+ //Clear any style_data that could have been set before ...
+ if (isset($style_data)) {
+ unset($style_data);
+ }
+
+ //Read the Style Information from the style file
+ include $style_filename;
+
+ //Apply the new styles to our current language styles
+ if (isset($style_data) && is_array($style_data)) {
+ $this->language_data['STYLES'] =
+ $this->merge_arrays($this->language_data['STYLES'], $style_data);
+ }
+ }
+ }
+
+ /**
+ * Takes the parsed code and various options, and creates the HTML
+ * surrounding it to make it look nice.
+ *
+ * @param string The code already parsed (reference!)
+ * @since 1.0.0
+ * @access private
+ */
+ function finalise(&$parsed_code) {
+ // Remove end parts of important declarations
+ // This is BUGGY!! My fault for bad code: fix coming in 1.2
+ // @todo Remove this crap
+ if ($this->enable_important_blocks &&
+ (strpos($parsed_code, $this->hsc(GESHI_START_IMPORTANT)) === false)) {
+ $parsed_code = str_replace($this->hsc(GESHI_END_IMPORTANT), '', $parsed_code);
+ }
+
+ // Add HTML whitespace stuff if we're using the <div> header
+ if ($this->header_type != GESHI_HEADER_PRE && $this->header_type != GESHI_HEADER_PRE_VALID) {
+ $this->indent($parsed_code);
+ }
+
+ // purge some unnecessary stuff
+ /** NOTE: memorypeak #1 */
+ $parsed_code = preg_replace('#<span[^>]+>(\s*)</span>#', '\\1', $parsed_code);
+
+ // If we are using IDs for line numbers, there needs to be an overall
+ // ID set to prevent collisions.
+ if ($this->add_ids && !$this->overall_id) {
+ $this->overall_id = 'geshi-' . substr(md5(microtime()), 0, 4);
+ }
+
+ // Get code into lines
+ /** NOTE: memorypeak #2 */
+ $code = explode("\n", $parsed_code);
+ $parsed_code = $this->header();
+
+ // If we're using line numbers, we insert <li>s and appropriate
+ // markup to style them (otherwise we don't need to do anything)
+ if ($this->line_numbers != GESHI_NO_LINE_NUMBERS && $this->header_type != GESHI_HEADER_PRE_TABLE) {
+ // If we're using the <pre> header, we shouldn't add newlines because
+ // the <pre> will line-break them (and the <li>s already do this for us)
+ $ls = ($this->header_type != GESHI_HEADER_PRE && $this->header_type != GESHI_HEADER_PRE_VALID) ? "\n" : '';
+
+ // Set vars to defaults for following loop
+ $i = 0;
+
+ // Foreach line...
+ for ($i = 0, $n = count($code); $i < $n;) {
+ //Reset the attributes for a new line ...
+ $attrs = array();
+
+ // Make lines have at least one space in them if they're empty
+ // BenBE: Checking emptiness using trim instead of relying on blanks
+ if ('' == trim($code[$i])) {
+ $code[$i] = '&nbsp;';
+ }
+
+ // If this is a "special line"...
+ if ($this->line_numbers == GESHI_FANCY_LINE_NUMBERS &&
+ $i % $this->line_nth_row == ($this->line_nth_row - 1)) {
+ // Set the attributes to style the line
+ if ($this->use_classes) {
+ //$attr = ' class="li2"';
+ $attrs['class'][] = 'li2';
+ $def_attr = ' class="de2"';
+ } else {
+ //$attr = ' style="' . $this->line_style2 . '"';
+ $attrs['style'][] = $this->line_style2;
+ // This style "covers up" the special styles set for special lines
+ // so that styles applied to special lines don't apply to the actual
+ // code on that line
+ $def_attr = ' style="' . $this->code_style . '"';
+ }
+ } else {
+ if ($this->use_classes) {
+ //$attr = ' class="li1"';
+ $attrs['class'][] = 'li1';
+ $def_attr = ' class="de1"';
+ } else {
+ //$attr = ' style="' . $this->line_style1 . '"';
+ $attrs['style'][] = $this->line_style1;
+ $def_attr = ' style="' . $this->code_style . '"';
+ }
+ }
+
+ //Check which type of tag to insert for this line
+ if ($this->header_type == GESHI_HEADER_PRE_VALID) {
+ $start = "<pre$def_attr>";
+ $end = '</pre>';
+ } else {
+ // Span or div?
+ $start = "<div$def_attr>";
+ $end = '</div>';
+ }
+
+ ++$i;
+
+ // Are we supposed to use ids? If so, add them
+ if ($this->add_ids) {
+ $attrs['id'][] = "$this->overall_id-$i";
+ }
+
+ //Is this some line with extra styles???
+ if (in_array($i, $this->highlight_extra_lines)) {
+ if ($this->use_classes) {
+ if (isset($this->highlight_extra_lines_styles[$i])) {
+ $attrs['class'][] = "lx$i";
+ } else {
+ $attrs['class'][] = "ln-xtra";
+ }
+ } else {
+ array_push($attrs['style'], $this->get_line_style($i));
+ }
+ }
+
+ // Add in the line surrounded by appropriate list HTML
+ $attr_string = '';
+ foreach ($attrs as $key => $attr) {
+ $attr_string .= ' ' . $key . '="' . implode(' ', $attr) . '"';
+ }
+
+ $parsed_code .= "<li$attr_string>$start{$code[$i-1]}$end</li>$ls";
+ unset($code[$i - 1]);
+ }
+ } else {
+ $n = count($code);
+ if ($this->use_classes) {
+ $attributes = ' class="de1"';
+ } else {
+ $attributes = ' style="'. $this->code_style .'"';
+ }
+ if ($this->header_type == GESHI_HEADER_PRE_VALID) {
+ $parsed_code .= '<pre'. $attributes .'>';
+ } elseif ($this->header_type == GESHI_HEADER_PRE_TABLE) {
+ if ($this->line_numbers != GESHI_NO_LINE_NUMBERS) {
+ if ($this->use_classes) {
+ $attrs = ' class="ln"';
+ } else {
+ $attrs = ' style="'. $this->table_linenumber_style .'"';
+ }
+ $parsed_code .= '<td'.$attrs.'><pre'.$attributes.'>';
+ // get linenumbers
+ // we don't merge it with the for below, since it should be better for
+ // memory consumption this way
+ // @todo: but... actually it would still be somewhat nice to merge the two loops
+ // the mem peaks are at different positions
+ for ($i = 0; $i < $n; ++$i) {
+ $close = 0;
+ // fancy lines
+ if ($this->line_numbers == GESHI_FANCY_LINE_NUMBERS &&
+ $i % $this->line_nth_row == ($this->line_nth_row - 1)) {
+ // Set the attributes to style the line
+ if ($this->use_classes) {
+ $parsed_code .= '<span class="xtra li2"><span class="de2">';
+ } else {
+ // This style "covers up" the special styles set for special lines
+ // so that styles applied to special lines don't apply to the actual
+ // code on that line
+ $parsed_code .= '<span style="display:block;' . $this->line_style2 . '">'
+ .'<span style="' . $this->code_style .'">';
+ }
+ $close += 2;
+ }
+ //Is this some line with extra styles???
+ if (in_array($i + 1, $this->highlight_extra_lines)) {
+ if ($this->use_classes) {
+ if (isset($this->highlight_extra_lines_styles[$i])) {
+ $parsed_code .= "<span class=\"xtra lx$i\">";
+ } else {
+ $parsed_code .= "<span class=\"xtra ln-xtra\">";
+ }
+ } else {
+ $parsed_code .= "<span style=\"display:block;" . $this->get_line_style($i) . "\">";
+ }
+ ++$close;
+ }
+ $parsed_code .= $this->line_numbers_start + $i;
+ if ($close) {
+ $parsed_code .= str_repeat('</span>', $close);
+ } elseif ($i != $n) {
+ $parsed_code .= "\n";
+ }
+ }
+ $parsed_code .= '</pre></td><td'.$attributes.'>';
+ }
+ $parsed_code .= '<pre'. $attributes .'>';
+ }
+ // No line numbers, but still need to handle highlighting lines extra.
+ // Have to use divs so the full width of the code is highlighted
+ $close = 0;
+ for ($i = 0; $i < $n; ++$i) {
+ // Make lines have at least one space in them if they're empty
+ // BenBE: Checking emptiness using trim instead of relying on blanks
+ if ('' == trim($code[$i])) {
+ $code[$i] = '&nbsp;';
+ }
+ // fancy lines
+ if ($this->line_numbers == GESHI_FANCY_LINE_NUMBERS &&
+ $i % $this->line_nth_row == ($this->line_nth_row - 1)) {
+ // Set the attributes to style the line
+ if ($this->use_classes) {
+ $parsed_code .= '<span class="xtra li2"><span class="de2">';
+ } else {
+ // This style "covers up" the special styles set for special lines
+ // so that styles applied to special lines don't apply to the actual
+ // code on that line
+ $parsed_code .= '<span style="display:block;' . $this->line_style2 . '">'
+ .'<span style="' . $this->code_style .'">';
+ }
+ $close += 2;
+ }
+ //Is this some line with extra styles???
+ if (in_array($i + 1, $this->highlight_extra_lines)) {
+ if ($this->use_classes) {
+ if (isset($this->highlight_extra_lines_styles[$i])) {
+ $parsed_code .= "<span class=\"xtra lx$i\">";
+ } else {
+ $parsed_code .= "<span class=\"xtra ln-xtra\">";
+ }
+ } else {
+ $parsed_code .= "<span style=\"display:block;" . $this->get_line_style($i) . "\">";
+ }
+ ++$close;
+ }
+
+ $parsed_code .= $code[$i];
+
+ if ($close) {
+ $parsed_code .= str_repeat('</span>', $close);
+ $close = 0;
+ }
+ elseif ($i + 1 < $n) {
+ $parsed_code .= "\n";
+ }
+ unset($code[$i]);
+ }
+
+ if ($this->header_type == GESHI_HEADER_PRE_VALID || $this->header_type == GESHI_HEADER_PRE_TABLE) {
+ $parsed_code .= '</pre>';
+ }
+ if ($this->header_type == GESHI_HEADER_PRE_TABLE && $this->line_numbers != GESHI_NO_LINE_NUMBERS) {
+ $parsed_code .= '</td>';
+ }
+ }
+
+ $parsed_code .= $this->footer();
+ }
+
+ /**
+ * Creates the header for the code block (with correct attributes)
+ *
+ * @return string The header for the code block
+ * @since 1.0.0
+ * @access private
+ */
+ function header() {
+ // Get attributes needed
+ /**
+ * @todo Document behaviour change - class is outputted regardless of whether
+ * we're using classes or not. Same with style
+ */
+ $attributes = ' class="' . $this->_genCSSName($this->language);
+ if ($this->overall_class != '') {
+ $attributes .= " ".$this->_genCSSName($this->overall_class);
+ }
+ $attributes .= '"';
+
+ if ($this->overall_id != '') {
+ $attributes .= " id=\"{$this->overall_id}\"";
+ }
+ if ($this->overall_style != '' && !$this->use_classes) {
+ $attributes .= ' style="' . $this->overall_style . '"';
+ }
+
+ $ol_attributes = '';
+
+ if ($this->line_numbers_start != 1) {
+ $ol_attributes .= ' start="' . $this->line_numbers_start . '"';
+ }
+
+ // Get the header HTML
+ $header = $this->header_content;
+ if ($header) {
+ if ($this->header_type == GESHI_HEADER_PRE || $this->header_type == GESHI_HEADER_PRE_VALID) {
+ $header = str_replace("\n", '', $header);
+ }
+ $header = $this->replace_keywords($header);
+
+ if ($this->use_classes) {
+ $attr = ' class="head"';
+ } else {
+ $attr = " style=\"{$this->header_content_style}\"";
+ }
+ if ($this->header_type == GESHI_HEADER_PRE_TABLE && $this->line_numbers != GESHI_NO_LINE_NUMBERS) {
+ $header = "<thead><tr><td colspan=\"2\" $attr>$header</td></tr></thead>";
+ } else {
+ $header = "<div$attr>$header</div>";
+ }
+ }
+
+ if (GESHI_HEADER_NONE == $this->header_type) {
+ if ($this->line_numbers != GESHI_NO_LINE_NUMBERS) {
+ return "$header<ol$attributes$ol_attributes>";
+ }
+ return $header . ($this->force_code_block ? '<div>' : '');
+ }
+
+ // Work out what to return and do it
+ if ($this->line_numbers != GESHI_NO_LINE_NUMBERS) {
+ if ($this->header_type == GESHI_HEADER_PRE) {
+ return "<pre$attributes>$header<ol$ol_attributes>";
+ } elseif ($this->header_type == GESHI_HEADER_DIV ||
+ $this->header_type == GESHI_HEADER_PRE_VALID) {
+ return "<div$attributes>$header<ol$ol_attributes>";
+ } elseif ($this->header_type == GESHI_HEADER_PRE_TABLE) {
+ return "<table$attributes>$header<tbody><tr class=\"li1\">";
+ }
+ } else {
+ if ($this->header_type == GESHI_HEADER_PRE) {
+ return "<pre$attributes>$header" .
+ ($this->force_code_block ? '<div>' : '');
+ } else {
+ return "<div$attributes>$header" .
+ ($this->force_code_block ? '<div>' : '');
+ }
+ }
+ }
+
+ /**
+ * Returns the footer for the code block.
+ *
+ * @return string The footer for the code block
+ * @since 1.0.0
+ * @access private
+ */
+ function footer() {
+ $footer = $this->footer_content;
+ if ($footer) {
+ if ($this->header_type == GESHI_HEADER_PRE) {
+ $footer = str_replace("\n", '', $footer);;
+ }
+ $footer = $this->replace_keywords($footer);
+
+ if ($this->use_classes) {
+ $attr = ' class="foot"';
+ } else {
+ $attr = " style=\"{$this->footer_content_style}\"";
+ }
+ if ($this->header_type == GESHI_HEADER_PRE_TABLE && $this->line_numbers != GESHI_NO_LINE_NUMBERS) {
+ $footer = "<tfoot><tr><td colspan=\"2\">$footer</td></tr></tfoot>";
+ } else {
+ $footer = "<div$attr>$footer</div>";
+ }
+ }
+
+ if (GESHI_HEADER_NONE == $this->header_type) {
+ return ($this->line_numbers != GESHI_NO_LINE_NUMBERS) ? '</ol>' . $footer : $footer;
+ }
+
+ if ($this->header_type == GESHI_HEADER_DIV || $this->header_type == GESHI_HEADER_PRE_VALID) {
+ if ($this->line_numbers != GESHI_NO_LINE_NUMBERS) {
+ return "</ol>$footer</div>";
+ }
+ return ($this->force_code_block ? '</div>' : '') .
+ "$footer</div>";
+ }
+ elseif ($this->header_type == GESHI_HEADER_PRE_TABLE) {
+ if ($this->line_numbers != GESHI_NO_LINE_NUMBERS) {
+ return "</tr></tbody>$footer</table>";
+ }
+ return ($this->force_code_block ? '</div>' : '') .
+ "$footer</div>";
+ }
+ else {
+ if ($this->line_numbers != GESHI_NO_LINE_NUMBERS) {
+ return "</ol>$footer</pre>";
+ }
+ return ($this->force_code_block ? '</div>' : '') .
+ "$footer</pre>";
+ }
+ }
+
+ /**
+ * Replaces certain keywords in the header and footer with
+ * certain configuration values
+ *
+ * @param string The header or footer content to do replacement on
+ * @return string The header or footer with replaced keywords
+ * @since 1.0.2
+ * @access private
+ */
+ function replace_keywords($instr) {
+ $keywords = $replacements = array();
+
+ $keywords[] = '<TIME>';
+ $keywords[] = '{TIME}';
+ $replacements[] = $replacements[] = number_format($time = $this->get_time(), 3);
+
+ $keywords[] = '<LANGUAGE>';
+ $keywords[] = '{LANGUAGE}';
+ $replacements[] = $replacements[] = $this->language_data['LANG_NAME'];
+
+ $keywords[] = '<VERSION>';
+ $keywords[] = '{VERSION}';
+ $replacements[] = $replacements[] = GESHI_VERSION;
+
+ $keywords[] = '<SPEED>';
+ $keywords[] = '{SPEED}';
+ if ($time <= 0) {
+ $speed = 'N/A';
+ } else {
+ $speed = strlen($this->source) / $time;
+ if ($speed >= 1024) {
+ $speed = sprintf("%.2f KB/s", $speed / 1024.0);
+ } else {
+ $speed = sprintf("%.0f B/s", $speed);
+ }
+ }
+ $replacements[] = $replacements[] = $speed;
+
+ return str_replace($keywords, $replacements, $instr);
+ }
+
+ /**
+ * Secure replacement for PHP built-in function htmlspecialchars().
+ *
+ * See ticket #427 (http://wush.net/trac/wikka/ticket/427) for the rationale
+ * for this replacement function.
+ *
+ * The INTERFACE for this function is almost the same as that for
+ * htmlspecialchars(), with the same default for quote style; however, there
+ * is no 'charset' parameter. The reason for this is as follows:
+ *
+ * The PHP docs say:
+ * "The third argument charset defines character set used in conversion."
+ *
+ * I suspect PHP's htmlspecialchars() is working at the byte-value level and
+ * thus _needs_ to know (or asssume) a character set because the special
+ * characters to be replaced could exist at different code points in
+ * different character sets. (If indeed htmlspecialchars() works at
+ * byte-value level that goes some way towards explaining why the
+ * vulnerability would exist in this function, too, and not only in
+ * htmlentities() which certainly is working at byte-value level.)
+ *
+ * This replacement function however works at character level and should
+ * therefore be "immune" to character set differences - so no charset
+ * parameter is needed or provided. If a third parameter is passed, it will
+ * be silently ignored.
+ *
+ * In the OUTPUT there is a minor difference in that we use '&#39;' instead
+ * of PHP's '&#039;' for a single quote: this provides compatibility with
+ * get_html_translation_table(HTML_SPECIALCHARS, ENT_QUOTES)
+ * (see comment by mikiwoz at yahoo dot co dot uk on
+ * http://php.net/htmlspecialchars); it also matches the entity definition
+ * for XML 1.0
+ * (http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Special_characters).
+ * Like PHP we use a numeric character reference instead of '&apos;' for the
+ * single quote. For the other special characters we use the named entity
+ * references, as PHP is doing.
+ *
+ * @author {@link http://wikkawiki.org/JavaWoman Marjolein Katsma}
+ *
+ * @license http://www.gnu.org/copyleft/lgpl.html
+ * GNU Lesser General Public License
+ * @copyright Copyright 2007, {@link http://wikkawiki.org/CreditsPage
+ * Wikka Development Team}
+ *
+ * @access private
+ * @param string $string string to be converted
+ * @param integer $quote_style
+ * - ENT_COMPAT: escapes &, <, > and double quote (default)
+ * - ENT_NOQUOTES: escapes only &, < and >
+ * - ENT_QUOTES: escapes &, <, >, double and single quotes
+ * @return string converted string
+ * @since 1.0.7.18
+ */
+ function hsc($string, $quote_style = ENT_COMPAT) {
+ // init
+ static $aTransSpecchar = array(
+ '&' => '&amp;',
+ '"' => '&quot;',
+ '<' => '&lt;',
+ '>' => '&gt;',
+
+ //This fix is related to SF#1923020, but has to be applied
+ //regardless of actually highlighting symbols.
+
+ //Circumvent a bug with symbol highlighting
+ //This is required as ; would produce undesirable side-effects if it
+ //was not to be processed as an entity.
+ ';' => '<SEMI>', // Force ; to be processed as entity
+ '|' => '<PIPE>' // Force | to be processed as entity
+ ); // ENT_COMPAT set
+
+ switch ($quote_style) {
+ case ENT_NOQUOTES: // don't convert double quotes
+ unset($aTransSpecchar['"']);
+ break;
+ case ENT_QUOTES: // convert single quotes as well
+ $aTransSpecchar["'"] = '&#39;'; // (apos) htmlspecialchars() uses '&#039;'
+ break;
+ }
+
+ // return translated string
+ return strtr($string, $aTransSpecchar);
+ }
+
+ function _genCSSName($name){
+ return (is_numeric($name[0]) ? '_' : '') . $name;
+ }
+
+ /**
+ * Returns a stylesheet for the highlighted code. If $economy mode
+ * is true, we only return the stylesheet declarations that matter for
+ * this code block instead of the whole thing
+ *
+ * @param boolean Whether to use economy mode or not
+ * @return string A stylesheet built on the data for the current language
+ * @since 1.0.0
+ */
+ function get_stylesheet($economy_mode = true) {
+ // If there's an error, chances are that the language file
+ // won't have populated the language data file, so we can't
+ // risk getting a stylesheet...
+ if ($this->error) {
+ return '';
+ }
+
+ //Check if the style rearrangements have been processed ...
+ //This also does some preprocessing to check which style groups are useable ...
+ if(!isset($this->language_data['NUMBERS_CACHE'])) {
+ $this->build_style_cache();
+ }
+
+ // First, work out what the selector should be. If there's an ID,
+ // that should be used, the same for a class. Otherwise, a selector
+ // of '' means that these styles will be applied anywhere
+ if ($this->overall_id) {
+ $selector = '#' . $this->_genCSSName($this->overall_id);
+ } else {
+ $selector = '.' . $this->_genCSSName($this->language);
+ if ($this->overall_class) {
+ $selector .= '.' . $this->_genCSSName($this->overall_class);
+ }
+ }
+ $selector .= ' ';
+
+ // Header of the stylesheet
+ if (!$economy_mode) {
+ $stylesheet = "/**\n".
+ " * GeSHi Dynamically Generated Stylesheet\n".
+ " * --------------------------------------\n".
+ " * Dynamically generated stylesheet for {$this->language}\n".
+ " * CSS class: {$this->overall_class}, CSS id: {$this->overall_id}\n".
+ " * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann\n" .
+ " * (http://qbnz.com/highlighter/ and http://geshi.org/)\n".
+ " * --------------------------------------\n".
+ " */\n";
+ } else {
+ $stylesheet = "/**\n".
+ " * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann\n" .
+ " * (http://qbnz.com/highlighter/ and http://geshi.org/)\n".
+ " */\n";
+ }
+
+ // Set the <ol> to have no effect at all if there are line numbers
+ // (<ol>s have margins that should be destroyed so all layout is
+ // controlled by the set_overall_style method, which works on the
+ // <pre> or <div> container). Additionally, set default styles for lines
+ if (!$economy_mode || $this->line_numbers != GESHI_NO_LINE_NUMBERS) {
+ //$stylesheet .= "$selector, {$selector}ol, {$selector}ol li {margin: 0;}\n";
+ $stylesheet .= "$selector.de1, $selector.de2 {{$this->code_style}}\n";
+ }
+
+ // Add overall styles
+ // note: neglect economy_mode, empty styles are meaningless
+ if ($this->overall_style != '') {
+ $stylesheet .= "$selector {{$this->overall_style}}\n";
+ }
+
+ // Add styles for links
+ // note: economy mode does not make _any_ sense here
+ // either the style is empty and thus no selector is needed
+ // or the appropriate key is given.
+ foreach ($this->link_styles as $key => $style) {
+ if ($style != '') {
+ switch ($key) {
+ case GESHI_LINK:
+ $stylesheet .= "{$selector}a:link {{$style}}\n";
+ break;
+ case GESHI_HOVER:
+ $stylesheet .= "{$selector}a:hover {{$style}}\n";
+ break;
+ case GESHI_ACTIVE:
+ $stylesheet .= "{$selector}a:active {{$style}}\n";
+ break;
+ case GESHI_VISITED:
+ $stylesheet .= "{$selector}a:visited {{$style}}\n";
+ break;
+ }
+ }
+ }
+
+ // Header and footer
+ // note: neglect economy_mode, empty styles are meaningless
+ if ($this->header_content_style != '') {
+ $stylesheet .= "$selector.head {{$this->header_content_style}}\n";
+ }
+ if ($this->footer_content_style != '') {
+ $stylesheet .= "$selector.foot {{$this->footer_content_style}}\n";
+ }
+
+ // Styles for important stuff
+ // note: neglect economy_mode, empty styles are meaningless
+ if ($this->important_styles != '') {
+ $stylesheet .= "$selector.imp {{$this->important_styles}}\n";
+ }
+
+ // Simple line number styles
+ if ((!$economy_mode || $this->line_numbers != GESHI_NO_LINE_NUMBERS) && $this->line_style1 != '') {
+ $stylesheet .= "{$selector}li, {$selector}.li1 {{$this->line_style1}}\n";
+ }
+ if ((!$economy_mode || $this->line_numbers != GESHI_NO_LINE_NUMBERS) && $this->table_linenumber_style != '') {
+ $stylesheet .= "{$selector}.ln {{$this->table_linenumber_style}}\n";
+ }
+ // If there is a style set for fancy line numbers, echo it out
+ if ((!$economy_mode || $this->line_numbers == GESHI_FANCY_LINE_NUMBERS) && $this->line_style2 != '') {
+ $stylesheet .= "{$selector}.li2 {{$this->line_style2}}\n";
+ }
+
+ // note: empty styles are meaningless
+ foreach ($this->language_data['STYLES']['KEYWORDS'] as $group => $styles) {
+ if ($styles != '' && (!$economy_mode ||
+ (isset($this->lexic_permissions['KEYWORDS'][$group]) &&
+ $this->lexic_permissions['KEYWORDS'][$group]))) {
+ $stylesheet .= "$selector.kw$group {{$styles}}\n";
+ }
+ }
+ foreach ($this->language_data['STYLES']['COMMENTS'] as $group => $styles) {
+ if ($styles != '' && (!$economy_mode ||
+ (isset($this->lexic_permissions['COMMENTS'][$group]) &&
+ $this->lexic_permissions['COMMENTS'][$group]) ||
+ (!empty($this->language_data['COMMENT_REGEXP']) &&
+ !empty($this->language_data['COMMENT_REGEXP'][$group])))) {
+ $stylesheet .= "$selector.co$group {{$styles}}\n";
+ }
+ }
+ foreach ($this->language_data['STYLES']['ESCAPE_CHAR'] as $group => $styles) {
+ if ($styles != '' && (!$economy_mode || $this->lexic_permissions['ESCAPE_CHAR'])) {
+ // NEW: since 1.0.8 we have to handle hardescapes
+ if ($group === 'HARD') {
+ $group = '_h';
+ }
+ $stylesheet .= "$selector.es$group {{$styles}}\n";
+ }
+ }
+ foreach ($this->language_data['STYLES']['BRACKETS'] as $group => $styles) {
+ if ($styles != '' && (!$economy_mode || $this->lexic_permissions['BRACKETS'])) {
+ $stylesheet .= "$selector.br$group {{$styles}}\n";
+ }
+ }
+ foreach ($this->language_data['STYLES']['SYMBOLS'] as $group => $styles) {
+ if ($styles != '' && (!$economy_mode || $this->lexic_permissions['SYMBOLS'])) {
+ $stylesheet .= "$selector.sy$group {{$styles}}\n";
+ }
+ }
+ foreach ($this->language_data['STYLES']['STRINGS'] as $group => $styles) {
+ if ($styles != '' && (!$economy_mode || $this->lexic_permissions['STRINGS'])) {
+ // NEW: since 1.0.8 we have to handle hardquotes
+ if ($group === 'HARD') {
+ $group = '_h';
+ }
+ $stylesheet .= "$selector.st$group {{$styles}}\n";
+ }
+ }
+ foreach ($this->language_data['STYLES']['NUMBERS'] as $group => $styles) {
+ if ($styles != '' && (!$economy_mode || $this->lexic_permissions['NUMBERS'])) {
+ $stylesheet .= "$selector.nu$group {{$styles}}\n";
+ }
+ }
+ foreach ($this->language_data['STYLES']['METHODS'] as $group => $styles) {
+ if ($styles != '' && (!$economy_mode || $this->lexic_permissions['METHODS'])) {
+ $stylesheet .= "$selector.me$group {{$styles}}\n";
+ }
+ }
+ // note: neglect economy_mode, empty styles are meaningless
+ foreach ($this->language_data['STYLES']['SCRIPT'] as $group => $styles) {
+ if ($styles != '') {
+ $stylesheet .= "$selector.sc$group {{$styles}}\n";
+ }
+ }
+ foreach ($this->language_data['STYLES']['REGEXPS'] as $group => $styles) {
+ if ($styles != '' && (!$economy_mode ||
+ (isset($this->lexic_permissions['REGEXPS'][$group]) &&
+ $this->lexic_permissions['REGEXPS'][$group]))) {
+ if (is_array($this->language_data['REGEXPS'][$group]) &&
+ array_key_exists(GESHI_CLASS, $this->language_data['REGEXPS'][$group])) {
+ $stylesheet .= "$selector.";
+ $stylesheet .= $this->language_data['REGEXPS'][$group][GESHI_CLASS];
+ $stylesheet .= " {{$styles}}\n";
+ } else {
+ $stylesheet .= "$selector.re$group {{$styles}}\n";
+ }
+ }
+ }
+ // Styles for lines being highlighted extra
+ if (!$economy_mode || (count($this->highlight_extra_lines)!=count($this->highlight_extra_lines_styles))) {
+ $stylesheet .= "{$selector}.ln-xtra, {$selector}li.ln-xtra, {$selector}div.ln-xtra {{$this->highlight_extra_lines_style}}\n";
+ }
+ $stylesheet .= "{$selector}span.xtra { display:block; }\n";
+ foreach ($this->highlight_extra_lines_styles as $lineid => $linestyle) {
+ $stylesheet .= "{$selector}.lx$lineid, {$selector}li.lx$lineid, {$selector}div.lx$lineid {{$linestyle}}\n";
+ }
+
+ return $stylesheet;
+ }
+
+ /**
+ * Get's the style that is used for the specified line
+ *
+ * @param int The line number information is requested for
+ * @access private
+ * @since 1.0.7.21
+ */
+ function get_line_style($line) {
+ //$style = null;
+ $style = null;
+ if (isset($this->highlight_extra_lines_styles[$line])) {
+ $style = $this->highlight_extra_lines_styles[$line];
+ } else { // if no "extra" style assigned
+ $style = $this->highlight_extra_lines_style;
+ }
+
+ return $style;
+ }
+
+ /**
+ * this functions creates an optimized regular expression list
+ * of an array of strings.
+ *
+ * Example:
+ * <code>$list = array('faa', 'foo', 'foobar');
+ * => string 'f(aa|oo(bar)?)'</code>
+ *
+ * @param $list array of (unquoted) strings
+ * @param $regexp_delimiter your regular expression delimiter, @see preg_quote()
+ * @return string for regular expression
+ * @author Milian Wolff <mail@milianw.de>
+ * @since 1.0.8
+ * @access private
+ */
+ function optimize_regexp_list($list, $regexp_delimiter = '/') {
+ $regex_chars = array('.', '\\', '+', '-', '*', '?', '[', '^', ']', '$',
+ '(', ')', '{', '}', '=', '!', '<', '>', '|', ':', $regexp_delimiter);
+ sort($list);
+ $regexp_list = array('');
+ $num_subpatterns = 0;
+ $list_key = 0;
+
+ // the tokens which we will use to generate the regexp list
+ $tokens = array();
+ $prev_keys = array();
+ // go through all entries of the list and generate the token list
+ $cur_len = 0;
+ for ($i = 0, $i_max = count($list); $i < $i_max; ++$i) {
+ if ($cur_len > GESHI_MAX_PCRE_LENGTH) {
+ // seems like the length of this pcre is growing exorbitantly
+ $regexp_list[++$list_key] = $this->_optimize_regexp_list_tokens_to_string($tokens);
+ $num_subpatterns = substr_count($regexp_list[$list_key], '(?:');
+ $tokens = array();
+ $cur_len = 0;
+ }
+ $level = 0;
+ $entry = preg_quote((string) $list[$i], $regexp_delimiter);
+ $pointer = &$tokens;
+ // properly assign the new entry to the correct position in the token array
+ // possibly generate smaller common denominator keys
+ while (true) {
+ // get the common denominator
+ if (isset($prev_keys[$level])) {
+ if ($prev_keys[$level] == $entry) {
+ // this is a duplicate entry, skip it
+ continue 2;
+ }
+ $char = 0;
+ while (isset($entry[$char]) && isset($prev_keys[$level][$char])
+ && $entry[$char] == $prev_keys[$level][$char]) {
+ ++$char;
+ }
+ if ($char > 0) {
+ // this entry has at least some chars in common with the current key
+ if ($char == strlen($prev_keys[$level])) {
+ // current key is totally matched, i.e. this entry has just some bits appended
+ $pointer = &$pointer[$prev_keys[$level]];
+ } else {
+ // only part of the keys match
+ $new_key_part1 = substr($prev_keys[$level], 0, $char);
+ $new_key_part2 = substr($prev_keys[$level], $char);
+
+ if (in_array($new_key_part1[0], $regex_chars)
+ || in_array($new_key_part2[0], $regex_chars)) {
+ // this is bad, a regex char as first character
+ $pointer[$entry] = array('' => true);
+ array_splice($prev_keys, $level, count($prev_keys), $entry);
+ $cur_len += strlen($entry);
+ continue;
+ } else {
+ // relocate previous tokens
+ $pointer[$new_key_part1] = array($new_key_part2 => $pointer[$prev_keys[$level]]);
+ unset($pointer[$prev_keys[$level]]);
+ $pointer = &$pointer[$new_key_part1];
+ // recreate key index
+ array_splice($prev_keys, $level, count($prev_keys), array($new_key_part1, $new_key_part2));
+ $cur_len += strlen($new_key_part2);
+ }
+ }
+ ++$level;
+ $entry = substr($entry, $char);
+ continue;
+ }
+ // else: fall trough, i.e. no common denominator was found
+ }
+ if ($level == 0 && !empty($tokens)) {
+ // we can dump current tokens into the string and throw them away afterwards
+ $new_entry = $this->_optimize_regexp_list_tokens_to_string($tokens);
+ $new_subpatterns = substr_count($new_entry, '(?:');
+ if (GESHI_MAX_PCRE_SUBPATTERNS && $num_subpatterns + $new_subpatterns > GESHI_MAX_PCRE_SUBPATTERNS) {
+ $regexp_list[++$list_key] = $new_entry;
+ $num_subpatterns = $new_subpatterns;
+ } else {
+ if (!empty($regexp_list[$list_key])) {
+ $new_entry = '|' . $new_entry;
+ }
+ $regexp_list[$list_key] .= $new_entry;
+ $num_subpatterns += $new_subpatterns;
+ }
+ $tokens = array();
+ $cur_len = 0;
+ }
+ // no further common denominator found
+ $pointer[$entry] = array('' => true);
+ array_splice($prev_keys, $level, count($prev_keys), $entry);
+
+ $cur_len += strlen($entry);
+ break;
+ }
+ unset($list[$i]);
+ }
+ // make sure the last tokens get converted as well
+ $new_entry = $this->_optimize_regexp_list_tokens_to_string($tokens);
+ if (GESHI_MAX_PCRE_SUBPATTERNS && $num_subpatterns + substr_count($new_entry, '(?:') > GESHI_MAX_PCRE_SUBPATTERNS) {
+ if ( !empty($regexp_list[$list_key]) ) {
+ ++$list_key;
+ }
+ $regexp_list[$list_key] = $new_entry;
+ } else {
+ if (!empty($regexp_list[$list_key])) {
+ $new_entry = '|' . $new_entry;
+ }
+ $regexp_list[$list_key] .= $new_entry;
+ }
+ return $regexp_list;
+ }
+ /**
+ * this function creates the appropriate regexp string of an token array
+ * you should not call this function directly, @see $this->optimize_regexp_list().
+ *
+ * @param &$tokens array of tokens
+ * @param $recursed bool to know wether we recursed or not
+ * @return string
+ * @author Milian Wolff <mail@milianw.de>
+ * @since 1.0.8
+ * @access private
+ */
+ function _optimize_regexp_list_tokens_to_string(&$tokens, $recursed = false) {
+ $list = '';
+ foreach ($tokens as $token => $sub_tokens) {
+ $list .= $token;
+ $close_entry = isset($sub_tokens['']);
+ unset($sub_tokens['']);
+ if (!empty($sub_tokens)) {
+ $list .= '(?:' . $this->_optimize_regexp_list_tokens_to_string($sub_tokens, true) . ')';
+ if ($close_entry) {
+ // make sub_tokens optional
+ $list .= '?';
+ }
+ }
+ $list .= '|';
+ }
+ if (!$recursed) {
+ // do some optimizations
+ // common trailing strings
+ // BUGGY!
+ //$list = preg_replace_callback('#(?<=^|\:|\|)\w+?(\w+)(?:\|.+\1)+(?=\|)#', create_function(
+ // '$matches', 'return "(?:" . preg_replace("#" . preg_quote($matches[1], "#") . "(?=\||$)#", "", $matches[0]) . ")" . $matches[1];'), $list);
+ // (?:p)? => p?
+ $list = preg_replace('#\(\?\:(.)\)\?#', '\1?', $list);
+ // (?:a|b|c|d|...)? => [abcd...]?
+ // TODO: a|bb|c => [ac]|bb
+ static $callback_2;
+ if (!isset($callback_2)) {
+ $callback_2 = create_function('$matches', 'return "[" . str_replace("|", "", $matches[1]) . "]";');
+ }
+ $list = preg_replace_callback('#\(\?\:((?:.\|)+.)\)#', $callback_2, $list);
+ }
+ // return $list without trailing pipe
+ return substr($list, 0, -1);
+ }
+} // End Class GeSHi
+
+
+if (!function_exists('geshi_highlight')) {
+ /**
+ * Easy way to highlight stuff. Behaves just like highlight_string
+ *
+ * @param string The code to highlight
+ * @param string The language to highlight the code in
+ * @param string The path to the language files. You can leave this blank if you need
+ * as from version 1.0.7 the path should be automatically detected
+ * @param boolean Whether to return the result or to echo
+ * @return string The code highlighted (if $return is true)
+ * @since 1.0.2
+ */
+ function geshi_highlight($string, $language, $path = null, $return = false) {
+ $geshi = new GeSHi($string, $language, $path);
+ $geshi->set_header_type(GESHI_HEADER_NONE);
+
+ if ($return) {
+ return '<code>' . $geshi->parse_code() . '</code>';
+ }
+
+ echo '<code>' . $geshi->parse_code() . '</code>';
+
+ if ($geshi->error()) {
+ return false;
+ }
+ return true;
+ }
+}
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/4cs.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/4cs.php
new file mode 100644
index 00000000..5209c51e
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/4cs.php
@@ -0,0 +1,139 @@
+<?php
+/*************************************************************************************
+ * 4cs.php
+ * ------
+ * Author: Jason Curl (jason.curl@continental-corporation.com)
+ * Copyright: (c) 2009 Jason Curl
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/09/05
+ *
+ * 4CS language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/09/05
+ * - First Release
+ *
+ * TODO (updated 2009/09/01)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'GADV 4CS',
+ 'COMMENT_SINGLE' => array(1 => "//"),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'All', 'AllMatches', 'And', 'And_Filters', 'As', 'Asc', 'BasedOn',
+ 'BestMatch', 'Block', 'Buffer', 'ByRef', 'ByVal', 'Call', 'Channel',
+ 'Chr', 'Clear', 'Close', 'Confirm', 'Const', 'Continue', 'Cos',
+ 'Critical', 'Declare', 'Default', 'DefaultChannel', 'DefaultDelayTime',
+ 'DefaultReceiveMode', 'DefaultResponseTime', '#Define', 'DelayTime',
+ 'Delete', 'Div', 'Else', '#Else', 'ElseIf', '#ElseIf', 'End', 'EndCritical',
+ 'EndInlineC', 'EndFunction', 'EndIf', '#EndIf', 'EndInputList',
+ 'EndLocalChannel', 'EndScenario', 'EndSub', 'EndWhile', 'Error',
+ 'ErrorLevelOff', 'ErrorLevelOn', 'ErrorLevelSet', 'ErrorLevelSetRaw',
+ 'Event', 'EventMode', 'EventOff', 'EventOn', 'EventSet', 'EventSetRaw',
+ 'Execute', 'Exit', 'Exp', 'FileClose', 'FilterClear', 'FileEOF', 'FileOpen',
+ 'FileRead', 'FileSize', 'FileWrite', 'FilterAdd', 'FilterMode',
+ 'FilterOff', 'FilterOn', 'For', 'Format', 'Function', 'GoOnline', 'GoTo',
+ 'Handle', 'Hide', 'If', '#If', '#IfDef', '#IfNDef', 'Ignore', '#Include',
+ 'InlineC', 'Input', 'InputItem', 'InputList', 'Kill', 'LBound', 'LocalChannel',
+ 'Local', 'Log', 'Log10', 'LogOff', 'LogOn', 'Loop', 'Message', 'Mod',
+ 'MonitorChannel', 'MostFormat', 'MostMessage', 'Named', 'Never', 'Next',
+ 'NoOrder', 'Not', 'Nothing', 'NoWait', 'Numeric', 'OnError', 'OnEvent',
+ 'Or', 'Or_Filters', 'Order', 'Pass', 'Pow', 'Prototype', 'Quit', 'Raise',
+ 'Random', 'Receive', 'ReceiveMode', 'ReceiveRaw', 'Redim', 'Remote', 'Repeat',
+ 'Repeated', 'ResponseTime', 'Resume', 'ResumeCritical', 'RT_Common',
+ 'RT_Dll_Call', 'RT_FILEIO', 'RT_General', 'RT_HardwareAccess',
+ 'RT_MessageVariableAccess', 'RT_Scenario', 'RT_VariableAccess', 'Runtime',
+ 'Scenario', 'ScenarioEnd', 'ScenarioStart', 'ScenarioStatus', 'ScenarioTerminate',
+ 'Send', 'SendRaw', 'Set', 'SetError', 'Sin', 'Single', 'Show', 'Start',
+ 'StartCritical', 'Starts', 'Static', 'Step', 'Stop', 'String', 'Sub',
+ 'System_Error', 'TerminateAllChilds', 'Terminates', 'Then', 'Throw', 'TimeOut',
+ 'To', 'TooLate', 'Trunc', 'UBound', 'Unexpected', 'Until', 'User_Error',
+ 'View', 'Wait', 'Warning', 'While', 'XOr'
+ ),
+ 2 => array(
+ 'alias', 'winapi', 'long', 'char', 'double', 'float', 'int', 'short', 'lib'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '=', ':=', '<', '>', '<>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000C0; font-weight: bold;',
+ 2 => 'color: #808080;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000080;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #800080;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #66cc66;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000080;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/6502acme.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/6502acme.php
new file mode 100644
index 00000000..203e04df
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/6502acme.php
@@ -0,0 +1,230 @@
+<?php
+/*************************************************************************************
+ * 6502acme.php
+ * -------
+ * Author: Warren Willmey
+ * Copyright: (c) 2010 Warren Willmey.
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/05/26
+ *
+ * MOS 6502 (more specifically 6510) ACME Cross Assembler 0.93 by Marco Baye language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/22
+ * - First Release
+ *
+ * TODO (updated 2010/07/22)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'MOS 6502 (6510) ACME Cross Assembler format',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* 6502/6510 Opcodes. */
+ 1 => array(
+ 'adc', 'and', 'asl', 'bcc', 'bcs', 'beq', 'bit', 'bmi',
+ 'bne', 'bpl', 'brk', 'bvc', 'bvs', 'clc', 'cld', 'cli',
+ 'clv', 'cmp', 'cpx', 'cpy', 'dec', 'dex', 'dey', 'eor',
+ 'inc', 'inx', 'iny', 'jmp', 'jsr', 'lda', 'ldx', 'ldy',
+ 'lsr', 'nop', 'ora', 'pha', 'php', 'pla', 'plp', 'rol',
+ 'ror', 'rti', 'rts', 'sbc', 'sec', 'sed', 'sei', 'sta',
+ 'stx', 'sty', 'tax', 'tay', 'tsx', 'txa', 'txs', 'tya',
+ ),
+ /* Index Registers, yes the 6502 has other registers by they are only
+ * accessable by specific opcodes. The 65816 also has access to the stack pointer S. */
+ 2 => array(
+ 'x', 'y', 's'
+ ),
+ /* Directives or "pseudo opcodes" as defined by ACME 0.93 file AllPOs.txt. */
+ 3 => array(
+ '!8', '!08', '!by', '!byte',
+ '!16', '!wo', '!word',
+ '!24', '!32',
+ '!fi', '!fill',
+ '!align',
+ '!ct', '!convtab',
+ '!tx', '!text',
+ '!pet',
+ '!raw',
+ '!scrxor',
+ '!to',
+ '!source',
+ '!bin', '!binary',
+ '!zn', '!zone',
+ '!sl',
+ '!svl',
+ '!sal',
+ '!if', '!ifdef',
+ '!for',
+ '!set',
+ '!do', 'while', 'until',
+ '!eof', '!endoffile',
+ '!warn', '!error', '!serious',
+ '!macro',
+// , '*=' // Not a valid keyword (uses both * and = signs) moved to symbols instead.
+ '!initmem',
+ '!pseudopc',
+ '!cpu',
+ '!al', '!as', '!rl', '!rs',
+ ),
+
+ /* 6502/6510 undocumented opcodes (often referred to as illegal instructions).
+ * These are present in the 6502/6510 but NOT in the newer CMOS revisions of the 65C02 or 65816.
+ * As they are undocumented instructions there are no "official" names for them, there are also
+ * several more that mainly perform various forms of crash and are not supported by ACME 0.93.
+ */
+ 4 => array(
+ 'anc', 'arr', 'asr', 'dcp', 'dop', 'isc', 'jam', 'lax',
+ 'rla', 'rra', 'sax', 'sbx', 'slo', 'sre', 'top',
+ ),
+ /* 65c02 instructions, MOS added a few (much needed) instructions in the CMOS version of the 6502, but stupidly removed the undocumented/illegal opcodes.
+ * ACME 0.93 does not support the rmb0-7 and smb0-7 instructions (they are currently rem'ed out). */
+ 5 => array(
+ 'bra', 'phx', 'phy', 'plx', 'ply', 'stz', 'trb', 'tsb'
+ ),
+ /* 65816 instructions. */
+ 6 => array(
+ 'brl', 'cop', 'jml', 'jsl', 'mvn', 'mvp', 'pea', 'pei',
+ 'per', 'phb', 'phd', 'phk', 'plb', 'pld', 'rep', 'rtl',
+ 'sep', 'tcd', 'tcs', 'tdc', 'tsc', 'txy', 'tyx', 'wdm',
+ 'xba', 'xce',
+ ),
+ /* Deprecated directives or "pseudo opcodes" as defined by ACME 0.93 file AllPOs.txt. */
+ 7 => array(
+ '!cbm',
+ '!sz', '!subzone',
+ '!realpc',
+ ),
+ /* Math functions, some are aliases for the symbols. */
+ 8 => array(
+ 'not', 'div', 'mod', 'xor', 'or', 'sin', 'cos', 'tan',
+ 'arcsin', 'arccos', 'arctan', 'int', 'float',
+
+ ),
+
+ ),
+ 'SYMBOLS' => array(
+// '[', ']', '(', ')', '{', '}', // These are already defined by GeSHi as BRACKETS.
+ '*=', '#', '!', '^', '-', '*', '/',
+ '%', '+', '-', '<<', '>>', '>>>',
+ '<', '>', '^', '<=', '<', '>=', '>', '!=',
+ '=', '&', '|', '<>',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ 8 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00f; font-weight:bold;',
+ 2 => 'color: #00f; font-weight:bold;',
+ 3 => 'color: #080; font-weight:bold;',
+ 4 => 'color: #f00; font-weight:bold;',
+ 5 => 'color: #80f; font-weight:bold;',
+ 6 => 'color: #f08; font-weight:bold;',
+ 7 => 'color: #a04; font-weight:bold; font-style: italic;',
+ 8 => 'color: #000;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #999; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #009; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'NUMBERS' => array(
+ GESHI_NUMBER_INT_BASIC => 'color: #f00;',
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR => 'color: #f00;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #f00;',
+ GESHI_NUMBER_BIN_PREFIX_PERCENT => 'color: #f00;',
+ GESHI_NUMBER_FLT_NONSCI => 'color: #f00;',
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #f00;'
+ , 1 => 'color: #933;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR |
+ GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_BIN_PREFIX_PERCENT,
+ // AMCE Octal format not support and gets picked up as Decimal unfortunately.
+ 'REGEXPS' => array(
+ //ACME .# Binary number format. e.g. %..##..##..##
+ 0 => '\%[\.\#]{1,64}',
+ //ACME Local Labels
+ 1 => '\.[_a-zA-Z][_a-zA-Z0-9]*',
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8,
+ 'PARSER_CONTROL' => array(
+ 'NUMBERS' => array(
+ 'PRECHECK_RX' => '/[\da-fA-F\.\$\%]/'
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/6502kickass.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/6502kickass.php
new file mode 100644
index 00000000..80428262
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/6502kickass.php
@@ -0,0 +1,241 @@
+<?php
+/*************************************************************************************
+ * 6502kickass.php
+ * -------
+ * Author: Warren Willmey
+ * Copyright: (c) 2010 Warren Willmey.
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/06/07
+ *
+ * MOS 6502 (6510) Kick Assembler 3.13 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/22
+ * - First Release
+ *
+ * TODO (updated 2010/07/22)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'MOS 6502 (6510) Kick Assembler format',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* 6502/6510 Opcodes including undocumented opcodes as Kick Assembler 3.13 does not make a distinction - they are ALL valid. */
+ 1 => array(
+ 'adc', 'ahx', 'alr', 'anc', 'anc2', 'and', 'arr', 'asl',
+ 'axs', 'bcc', 'bcs', 'beq', 'bit', 'bmi', 'bne', 'bpl',
+ 'brk', 'bvc', 'bvs', 'clc', 'cld', 'cli', 'clv', 'cmp',
+ 'cpx', 'cpy', 'dcp', 'dec', 'dex', 'dey', 'eor', 'inc',
+ 'inx', 'iny', 'isc', 'jmp', 'jsr', 'las', 'lax', 'lda',
+ 'ldx', 'ldy', 'lsr', 'nop', 'ora', 'pha', 'php', 'pla',
+ 'plp', 'rla', 'rol', 'ror', 'rra', 'rti', 'rts', 'sax',
+ 'sbc', 'sbc2', 'sec', 'sed', 'sei', 'shx', 'shy', 'slo',
+ 'sre', 'sta', 'stx', 'sty', 'tas', 'tax', 'tay', 'tsx',
+ 'txa', 'txs', 'tya', 'xaa',
+ ),
+ /* DTV additional Opcodes. */
+ 2 => array(
+ 'bra', 'sac', 'sir'
+ ),
+ /* Index Registers, yes the 6502 has other registers by they are only
+ * accessable by specific opcodes. */
+ 3 => array(
+ 'x', 'y'
+ ),
+ /* Directives. */
+ 4 => array(
+ '.pc', '.pseudopc', 'virtual', '.align', '.byte', '.word', '.text', '.fill',
+ '.import source', '.import binary', '.import c64', '.import text', '.import', '.print', '.printnow',
+ '.error', '.var', '.eval', '.const', '.eval const', '.enum', '.label', '.define', '.struct',
+ 'if', '.for', '.macro', '.function', '.return', '.pseudocommand', '.namespace', '.filenamespace',
+ '.assert', '.asserterror',
+ ),
+ /* Kick Assembler 3.13 Functions/Operators. */
+ 5 => array(
+ 'size', 'charAt', 'substring', 'asNumber', 'asBoolean', 'toIntString', 'toBinaryString', 'toOctalString',
+ 'toHexString', 'lock', // String functions/operators.
+ 'get', 'set', 'add', 'remove', 'shuffle', // List functions.
+ 'put', 'keys', // Hashtable functions.
+ 'getType', 'getValue', 'CmdArgument', // Pseudo Commands functions.
+ 'asmCommandSize', // Opcode Constants functions.
+ 'LoadBinary', 'getSize',
+ 'LoadSid', 'getData',
+ 'LoadPicture', 'width', 'height', 'getPixel', 'getSinglecolorByte', 'getMulticolorByte',
+ 'createFile', 'writeln',
+ 'cmdLineVars',
+ 'getX', 'getY', 'getZ', // Vector functions.
+ 'RotationMatrix', 'ScaleMatrix', 'MoveMatrix', 'PerspectiveMatrix', // Matrix functions.
+
+ ),
+
+ /* Kick Assembler 3.13 Math Functions. */
+ 6 => array(
+ 'abs', 'acos', 'asin', 'atan', 'atan2', 'cbrt', 'ceil', 'cos', 'cosh',
+ 'exp', 'expm1', 'floor', 'hypot', 'IEEEremainder', 'log', 'log10',
+ 'log1p', 'max', 'min', 'pow', 'mod', 'random', 'round', 'signum',
+ 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'toDegrees', 'toRadians',
+ ),
+
+ /* Kick Assembler 3.13 Objects/Data Types. */
+ 7 => array(
+ 'List', // List() Object.
+ 'Hashtable', // Hashtable() Object.
+ 'Vector', // Vector() Object.
+ 'Matrix', // Matrix() Object.
+ ),
+
+ /* Kick Assembler 3.13 Constants. */
+ 8 => array(
+ 'PI', 'E', // Math Constants.
+ 'AT_ABSOLUTE' , 'AT_ABSOLUTEX' , 'AT_ABSOLUTEY' , 'AT_IMMEDIATE', // Pseudo Commands Constants.
+ 'AT_INDIRECT' , 'AT_IZEROPAGEX' , 'AT_IZEROPAGEY' , 'AT_NONE',
+ 'BLACK', 'WHITE', 'RED', 'CYAN', 'PURPLE', 'GREEN', 'BLUE', // Colour Constants.
+ 'YELLOW', 'ORANGE', 'BROWN', 'LIGHT_RED', 'DARK_GRAY', 'GRAY',
+ 'LIGHT_GREEN', 'LIGHT_BLUE', 'LIGHT_GRAY',
+ 'C64FILE', // Template Tag names.
+ 'BF_C64FILE', 'BF_BITMAP_SINGLECOLOR', 'BF_KOALA' , 'BF_FLI', // Binary format constant
+ ),
+
+ ),
+ 'SYMBOLS' => array(
+// '[', ']', '(', ')', '{', '}', // These are already defined by GeSHi as BRACKETS.
+ '-', '+', '-', '*', '/', '>', '<', '<<', '>>', '&', '|', '^', '=', '==',
+ '!=', '>=', '<=', '!', '&&', '||', '#',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00f; font-weight:bold;',
+ 2 => 'color: #00f; font-weight:bold;',
+ 3 => 'color: #00f; font-weight:bold;',
+ 4 => 'color: #080; font-weight:bold;',
+ 5 => 'color: #80f; font-weight:bold;',
+ 6 => 'color: #f08; font-weight:bold;',
+ 7 => 'color: #a04; font-weight:bold; font-style: italic;',
+ 8 => 'color: #f08; font-weight:bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #999; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #009; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'NUMBERS' => array(
+ GESHI_NUMBER_INT_BASIC => 'color: #f00;',
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR => 'color: #f00;',
+ GESHI_NUMBER_BIN_PREFIX_PERCENT => 'color: #f00;',
+ GESHI_NUMBER_FLT_NONSCI => 'color: #f00;',
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #933;',
+ 1 => 'color: #933;',
+ 2 => 'color: #933;',
+ 3 => 'color: #00f; font-weight:bold;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR |
+ GESHI_NUMBER_BIN_PREFIX_PERCENT,
+ // AMCE Octal format not support and gets picked up as Decimal unfortunately.
+ 'REGEXPS' => array(
+ //Labels end with a collon.
+ 0 => '[!]{0,1}[_a-zA-Z][_a-zA-Z0-9]*\:',
+ //Multi Labels (local labels) references start with ! and end with + or - for forward/backward reference.
+ 1 => '![_a-zA-Z][_a-zA-Z0-9]*[+-]',
+ //Macros start with a colon :Macro.
+ 2 => ':[_a-zA-Z][_a-zA-Z0-9]*',
+ // Opcode Constants, such as LDA_IMM, STA_IZPY are basically all 6502 opcodes
+ // in UPPER case followed by _underscore_ and the ADDRESS MODE.
+ // As you might imagine that is rather a lot ( 78 supported Opcodes * 12 Addressing modes = 936 variations)
+ // So I thought it better and easier to maintain as a regular expression.
+ // NOTE: The order of the Address Modes must be maintained or it wont work properly (eg. place ZP first and find out!)
+ 3 => '[A-Z]{3}[2]?_(?:IMM|IND|IZPX|IZPY|ZPX|ZPY|ABSX|ABSY|REL|ABS|ZP)',
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8,
+ 'PARSER_CONTROL' => array(
+ 'NUMBERS' => array(
+ 'PRECHECK_RX' => '/[\da-fA-F\.\$\%]/'
+ ),
+ 'KEYWORDS' => array(
+ 5 => array (
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\;>|^&'\"])"
+ ),
+ 6 => array (
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\;>|^&'\"])"
+ ),
+ 8 => array (
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\;>|^&'\"])"
+ )
+ )
+ ),
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/6502tasm.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/6502tasm.php
new file mode 100644
index 00000000..86aa479d
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/6502tasm.php
@@ -0,0 +1,189 @@
+<?php
+/*************************************************************************************
+ * 6502tasm.php
+ * -------
+ * Author: Warren Willmey
+ * Copyright: (c) 2010 Warren Willmey.
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/06/02
+ *
+ * MOS 6502 (6510) TASM/64TASS (64TASS being the super set of TASM) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/22
+ * - First Release
+ *
+ * TODO (updated 2010/07/22)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'MOS 6502 (6510) TASM/64TASS 1.46 Assembler format',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* 6502/6510 Opcodes. */
+ 1 => array(
+ 'adc', 'and', 'asl', 'bcc', 'bcs', 'beq', 'bit', 'bmi',
+ 'bne', 'bpl', 'brk', 'bvc', 'bvs', 'clc', 'cld', 'cli',
+ 'clv', 'cmp', 'cpx', 'cpy', 'dec', 'dex', 'dey', 'eor',
+ 'inc', 'inx', 'iny', 'jmp', 'jsr', 'lda', 'ldx', 'ldy',
+ 'lsr', 'nop', 'ora', 'pha', 'php', 'pla', 'plp', 'rol',
+ 'ror', 'rti', 'rts', 'sbc', 'sec', 'sed', 'sei', 'sta',
+ 'stx', 'sty', 'tax', 'tay', 'tsx', 'txa', 'txs', 'tya',
+ ),
+ /* Index Registers, yes the 6502 has other registers by they are only
+ * accessable by specific opcodes. The 65816 also has access to the stack pointer S. */
+ 2 => array(
+ 'x', 'y', 's'
+ ),
+ /* Directives. */
+ 3 => array(
+ '.al', '.align', '.as', '.assert', '.binary', '.byte', '.cerror', '.char',
+ '.comment', '.cpu', '.cwarn', '.databank', '.dpage', '.else', '.elsif',
+ '.enc', '.endc', '.endif', '.endm', '.endp', '.error', '.fi', '.fill',
+ '.for', '.here', '.if', '.ifeq', '.ifmi', '.ifne', '.ifpl',
+ '.include', '.int', '.logical', '.long', '.macro', '.next', '.null', '.offs',
+ '.page', '.pend', '.proc', '.rept', '.rta', '.shift', '.text', '.warn', '.word',
+ '.xl', '.xs',
+// , '*=' // Not a valid keyword (uses both * and = signs) moved to symbols instead.
+ ),
+
+ /* 6502/6510 undocumented opcodes (often referred to as illegal instructions).
+ * These are present in the 6502/6510 but NOT in the newer CMOS revisions of the 65C02 or 65816.
+ * As they are undocumented instructions there are no "official" names for them, these are the names
+ * used by 64TASS V1.46.
+ */
+ 4 => array(
+ 'ahx', 'alr', 'anc', 'ane', 'arr', 'asr', 'axs', 'dcm',
+ 'dcp', 'ins', 'isb', 'isc', 'jam', 'lae', 'las', 'lax',
+ 'lds', 'lxa', 'rla', 'rra', 'sax', 'sbx', 'sha', 'shs',
+ 'shx', 'shy', 'slo', 'sre', 'tas', 'xaa',
+ ),
+ /* 65c02 instructions, MOS added a few (much needed) instructions in the
+ * CMOS version of the 6502, but stupidly removed the undocumented/illegal opcodes. */
+ 5 => array(
+ 'bra', 'dea', 'gra', 'ina', 'phx', 'phy', 'plx', 'ply',
+ 'stz', 'trb', 'tsb',
+ ),
+ /* 65816 instructions. */
+ 6 => array(
+ 'brl', 'cop', 'jml', 'jsl', 'mvn', 'mvp', 'pea', 'pei',
+ 'per', 'phb', 'phd', 'phk', 'plb', 'pld', 'rep', 'rtl',
+ 'sep', 'stp', 'swa', 'tad', 'tcd', 'tcs', 'tda',
+ 'tdc', 'tsa', 'tsc', 'txy', 'tyx', 'wai', 'xba', 'xce',
+ ),
+ /* Deprecated directives (or yet to be implemented). */
+ 7 => array(
+ '.global', '.check'
+ ),
+ ),
+ 'SYMBOLS' => array(
+// '[', ']', '(', ')', '{', '}', // These are already defined by GeSHi as BRACKETS.
+ '*=', '#', '<', '>', '`', '=', '<', '>',
+ '!=', '>=', '<=', '+', '-', '*', '/', '//', '|',
+ '^', '&', '<<', '>>', '-', '~', '!',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00f; font-weight:bold;',
+ 2 => 'color: #00f; font-weight:bold;',
+ 3 => 'color: #080; font-weight:bold;',
+ 4 => 'color: #f00; font-weight:bold;',
+ 5 => 'color: #80f; font-weight:bold;',
+ 6 => 'color: #f08; font-weight:bold;',
+ 7 => 'color: #a04; font-weight:bold; font-style: italic;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #999; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #009; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'NUMBERS' => array(
+ GESHI_NUMBER_INT_BASIC => 'color: #f00;',
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR => 'color: #f00;',
+ GESHI_NUMBER_BIN_PREFIX_PERCENT => 'color: #f00;',
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR |
+ GESHI_NUMBER_BIN_PREFIX_PERCENT,
+ // AMCE Octal format not support and gets picked up as Decimal unfortunately.
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8,
+ 'PARSER_CONTROL' => array(
+ 'NUMBERS' => array(
+ 'PRECHECK_RX' => '/[\da-fA-F\.\$\%]/'
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/68000devpac.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/68000devpac.php
new file mode 100644
index 00000000..f46387ae
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/68000devpac.php
@@ -0,0 +1,168 @@
+<?php
+/*************************************************************************************
+ * 68000devpac.php
+ * -------
+ * Author: Warren Willmey
+ * Copyright: (c) 2010 Warren Willmey.
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/06/09
+ *
+ * Motorola 68000 - HiSoft Devpac ST 2 Assembler language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/22
+ * - First Release
+ *
+ * TODO (updated 2010/07/22)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Motorola 68000 - HiSoft Devpac ST 2 Assembler format',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* Directives. */
+ 1 => array(
+ 'end', 'include', 'incbin', 'opt', 'even', 'cnop', 'dc.b', 'dc.w',
+ 'dc.l', 'ds.b', 'ds.w', 'ds.l', 'dcb.b', 'dcb.w', 'dcb.l',
+ 'fail', 'output', '__g2', 'rept', 'endr', 'list', 'nolist', 'plen',
+ 'llen', 'ttl', 'subttl', 'spc', 'page', 'listchar', 'format',
+ 'equ', 'equr', 'set', 'reg', 'rs.b', 'rs.w', 'rs.l', 'rsreset',
+ 'rsset', '__rs', 'ifeq', 'ifne', 'ifgt', 'ifge', 'iflt', 'ifle', 'endc',
+ 'ifd', 'ifnd', 'ifc', 'ifnc', 'elseif', 'iif', 'macro', 'endm', 'mexit',
+ 'narg', '\@', 'section', 'text', 'data', 'bss', 'xdef', 'xref', 'org',
+ 'offset', '__lk', 'comment',
+ ),
+ /* 68000 Opcodes. */
+ 2 => array(
+ 'abcd', 'add', 'adda', 'addi', 'addq', 'addx', 'and', 'andi',
+ 'asl', 'asr', 'bcc', 'bchg', 'bclr', 'bcs', 'beq', 'bge',
+ 'bgt', 'bhi', 'ble', 'bls', 'blt', 'bmi', 'bne', 'bpl',
+ 'bra', 'bset', 'bsr', 'btst', 'bvc', 'bvs', 'chk', 'clr',
+ 'cmp', 'cmpa', 'cmpi', 'cmpm', 'dbcc', 'dbcs', 'dbeq', 'dbf',
+ 'dbge', 'dbgt', 'dbhi', 'dble', 'dbls', 'dblt', 'dbmi', 'dbne',
+ 'dbpl', 'dbra', 'dbt', 'dbvc', 'dbvs', 'divs', 'divu', 'eor',
+ 'eori', 'exg', 'ext','illegal','jmp', 'jsr', 'lea', 'link',
+ 'lsl', 'lsr', 'move','movea','movem','movep','moveq', 'muls',
+ 'mulu', 'nbcd', 'neg', 'negx', 'nop', 'not', 'or', 'ori',
+ 'pea', 'reset', 'rol', 'ror', 'roxl', 'roxr', 'rte', 'rtr',
+ 'rts', 'sbcd', 'scc', 'scs', 'seq', 'sf', 'sge', 'sgt',
+ 'shi', 'sle', 'sls', 'slt', 'smi', 'sne', 'spl', 'st',
+ 'stop', 'sub', 'suba', 'subi', 'subq', 'subx', 'svc', 'svs',
+ 'swap', 'tas', 'trap','trapv', 'tst', 'unlk',
+ ),
+ /* oprand sizes. */
+ 3 => array(
+ 'b', 'w', 'l' , 's'
+ ),
+ /* 68000 Registers. */
+ 4 => array(
+ 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7',
+ 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'sp', 'usp', 'ssp',
+ 'pc', 'ccr', 'sr',
+ ),
+ ),
+ 'SYMBOLS' => array(
+// '[', ']', '(', ')', '{', '}', // These are already defined by GeSHi as BRACKETS.
+ '+', '-', '~', '<<', '>>', '&',
+ '!', '^', '*', '/', '=', '<', '>',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #f08; font-weight:bold;',
+ 2 => 'color: #00f; font-weight:bold;',
+ 3 => 'color: #00f; font-weight:bold;',
+ 4 => 'color: #080; font-weight:bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #999; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #009; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'NUMBERS' => array(
+ GESHI_NUMBER_INT_BASIC => 'color: #f00;',
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR => 'color: #f00;',
+ GESHI_NUMBER_BIN_PREFIX_PERCENT => 'color: #f00;',
+ GESHI_NUMBER_OCT_PREFIX_AT => 'color: #f00;',
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #933;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_HEX_PREFIX_DOLLAR |
+ GESHI_NUMBER_OCT_PREFIX_AT |
+ GESHI_NUMBER_BIN_PREFIX_PERCENT,
+ 'REGEXPS' => array(
+ //Labels may end in a colon.
+ 0 => '(?<=\A\x20|\r|\n|^)[\._a-zA-Z][\._a-zA-Z0-9]*[\:]?[\s]'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8,
+ 'PARSER_CONTROL' => array(
+ 'NUMBERS' => array(
+ 'PRECHECK_RX' => '/[\da-fA-F\.\$\%\@]/'
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/abap.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/abap.php
new file mode 100644
index 00000000..5acd261c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/abap.php
@@ -0,0 +1,1409 @@
+<?php
+/*************************************************************************************
+ * abap.php
+ * --------
+ * Author: Andres Picazo (andres@andrespicazo.com)
+ * Contributors:
+ * - Sandra Rossi (sandra.rossi@gmail.com)
+ * - Jacob Laursen (jlu@kmd.dk)
+ * Copyright: (c) 2007 Andres Picazo
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/04
+ *
+ * ABAP language file for GeSHi.
+ *
+ * Reference abap language documentation (abap 7.1) : http://help.sap.com/abapdocu/en/ABENABAP_INDEX.htm
+ *
+ * ABAP syntax is highly complex, several problems could not be addressed, see TODO below if you dare ;-)
+ * Be aware that in ABAP language, keywords may be composed of several tokens,
+ * separated by one or more spaces or carriage returns
+ * (for example CONCATENATE 'hello' 'world' INTO string SEPARATED BY ' ')
+ * it's why we must decode them with REGEXPS. As there are many keywords with several tokens,
+ * I had to create a separate section in the code to simplify the reading.
+ * Be aware that some words may be highlighted several times like for "ref to data", which is first
+ * highlighted for "ref to data", then secondly for "ref to". It is very important to
+ * position "ref to" after "ref to data" otherwise "data" wouldn't be highlighted because
+ * of the previous highlight.
+ * Control, declarative and other statements are assigned URLs to sap documentation website:
+ * http://help.sap.com/abapdocu/en/ABAP<statement_name>.htm
+ *
+ * CHANGES
+ * -------
+ * 2009/02/25 (1.0.8.3)
+ * - Some more rework of the language file
+ * 2009/01/04 (1.0.8.2)
+ * - Major Release, more than 1000 statements and keywords added = whole abap 7.1 (Sandra Rossi)
+ * 2007/06/27 (1.0.0)
+ * - First Release
+ *
+ * TODO
+ * ----
+ * - in DATA data TYPE type, 2nd "data" and 2nd "type" are highlighted with data
+ * style, but should be ignored. Same problem for all words!!! This is quite impossible to
+ * solve it as we should define syntaxes of all statements (huge effort!) and use a lex
+ * or something like that instead of regexp I guess.
+ * - Some words are considered as being statement names (report, tables, etc.) though they
+ * are used as keyword in some statements. For example: FORM xxxx TABLES itab. It was
+ * arbitrary decided to define them as statement instead of keyword, because it may be
+ * useful to have the URL to SAP help for some of them.
+ * - if a comment is between 2 words of a keyword (for example SEPARATED "comment \n BY),
+ * it is not considered as a keyword, but it should!
+ * - for statements like "READ DATASET", GeSHi does not allow to set URLs because these
+ * statements are determined by REGEXPS. For "READ DATASET", the URL should be
+ * ABAPREAD_DATASET.htm. If a technical solution is found, be careful : URLs
+ * are sometimes not valid because the URL does not exist. For example, for "AT NEW"
+ * statement, the URL should be ABAPAT_ITAB.htm (not ABAPAT_NEW.htm).
+ * There are many other exceptions.
+ * Note: for adding this functionality within your php program, you can execute this code:
+ * function add_urls_to_multi_tokens( $matches ) {
+ * $url = preg_replace( "/[ \n]+/" , "_" , $matches[3] );
+ * if( $url == $matches[3] ) return $matches[0] ;
+ * else return $matches[1]."<a href=\"http://help.sap.com/abapdocu/en/ABAP".strtoupper($url).".htm\">".$matches[3]."</a>".$matches[4];
+ * }
+ * $html = $geshi->parse_code();
+ * $html = preg_replace_callback( "£(zzz:(control|statement|data);\">)(.+?)(</span>)£s", "add_urls_to_multi_tokens", $html );
+ * echo $html;
+ * - Numbers followed by a dot terminating the statement are not properly recognized
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'ABAP',
+ 'COMMENT_SINGLE' => array(
+ 1 => '"'
+ ),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ // lines beginning with star at 1st position are comments
+ // (star anywhere else is not a comment, especially be careful with
+ // "assign dref->* to <fs>" statement)
+ 2 => '/^\*.*?$/m'
+ ),
+ 'CASE_KEYWORDS' => 0,
+ 'QUOTEMARKS' => array(
+ 1 => "'",
+ 2 => "`"
+ ),
+ 'ESCAPE_CHAR' => '',
+
+ 'KEYWORDS' => array(
+ //***********************************************
+ // Section 2 : process sequences of several tokens
+ //***********************************************
+
+ 7 => array(
+ 'at new',
+ 'at end of',
+ 'at first',
+ 'at last',
+ 'loop at',
+ 'loop at screen',
+ ),
+
+ 8 => array(
+ 'private section',
+ 'protected section',
+ 'public section',
+ 'at line-selection',
+ 'at selection-screen',
+ 'at user-command',
+ 'assign component',
+ 'assign table field',
+ 'call badi',
+ 'call customer-function',
+ 'call customer subscreen',
+ 'call dialog',
+ 'call function',
+ 'call method',
+ 'call screen',
+ 'call selection-screen',
+ 'call transaction',
+ 'call transformation',
+ 'close cursor',
+ 'close dataset',
+ 'commit work',
+ 'convert date',
+ 'convert text',
+ 'convert time stamp',
+ 'create data',
+ 'create object',
+ 'delete dataset',
+ 'delete from',
+ 'describe distance',
+ 'describe field',
+ 'describe list',
+ 'describe table',
+ 'exec sql',
+ 'exit from sql',
+ 'exit from step-loop',
+ 'export dynpro',
+ 'export nametab',
+ 'free memory',
+ 'generate subroutine-pool',
+ 'get badi',
+ 'get bit',
+ 'get cursor',
+ 'get dataset',
+ 'get locale',
+ 'get parameter',
+ 'get pf-status',
+ 'get property',
+ 'get reference',
+ 'get run time',
+ 'get time',
+ 'get time stamp',
+ 'import directory',
+ 'insert report',
+ 'insert text-pool',
+ 'leave list-processing',
+ 'leave program',
+ 'leave screen',
+ 'leave to list-processing',
+ 'leave to transaction',
+ 'modify line',
+ 'modify screen',
+ 'move percentage',
+ 'open cursor',
+ 'open dataset',
+ 'raise event',
+ 'raise exception',
+ 'read dataset',
+ 'read line',
+ 'read report',
+ 'read table',
+ 'read textpool',
+ 'receive results from function',
+ 'refresh control',
+ 'rollback work',
+ 'set bit',
+ 'set blank lines',
+ 'set country',
+ 'set cursor',
+ 'set dataset',
+ 'set extended check',
+ 'set handler',
+ 'set hold data',
+ 'set language',
+ 'set left scroll-boundary',
+ 'set locale',
+ 'set margin',
+ 'set parameter',
+ 'set pf-status',
+ 'set property',
+ 'set run time analyzer',
+ 'set run time clock',
+ 'set screen',
+ 'set titlebar',
+ 'set update task',
+ 'set user-command',
+ 'suppress dialog',
+ 'truncate dataset',
+ 'wait until',
+ 'wait up to',
+ ),
+
+ 9 => array(
+ 'accepting duplicate keys',
+ 'accepting padding',
+ 'accepting truncation',
+ 'according to',
+ 'actual length',
+ 'adjacent duplicates',
+ 'after input',
+ 'all blob columns',
+ 'all clob columns',
+ 'all fields',
+ 'all methods',
+ 'all other columns',
+ 'and mark',
+ 'and return to screen',
+ 'and return',
+ 'and skip first screen',
+ 'and wait',
+ 'any table',
+ 'appendage type',
+ 'archive mode',
+ 'archiving parameters',
+ 'area handle',
+ 'as checkbox',
+ 'as icon',
+ 'as line',
+ 'as listbox',
+ 'as person table',
+ 'as search patterns',
+ 'as separate unit',
+ 'as subscreen',
+ 'as symbol',
+ 'as text',
+ 'as window',
+ 'at cursor-selection',
+ 'at exit-command',
+ 'at next application statement',
+ 'at position',
+
+ 'backup into',
+ 'before output',
+ 'before unwind',
+ 'begin of block',
+ 'begin of common part',
+ 'begin of line',
+ 'begin of screen',
+ 'begin of tabbed block',
+ 'begin of version',
+ 'begin of',
+ 'big endian',
+ 'binary mode',
+ 'binary search',
+ 'by kernel module',
+ 'bypassing buffer',
+
+ 'client specified',
+ 'code page',
+ 'code page hint',
+ 'code page into',
+ 'color black',
+ 'color blue',
+ 'color green',
+ 'color pink',
+ 'color red',
+ 'color yellow',
+ 'compression off',
+ 'compression on',
+ 'connect to',
+ 'corresponding fields of table',
+ 'corresponding fields of',
+ 'cover page',
+ 'cover text',
+ 'create package',
+ 'create private',
+ 'create protected',
+ 'create public',
+ 'current position',
+
+ 'data buffer',
+ 'data values',
+ 'dataset expiration',
+ 'daylight saving time',
+ 'default key',
+ 'default program',
+ 'default screen',
+ 'defining database',
+ 'deleting leading',
+ 'deleting trailing',
+ 'directory entry',
+ 'display like',
+ 'display offset',
+ 'during line-selection',
+ 'dynamic selections',
+
+ 'edit mask',
+ 'end of block',
+ 'end of common part',
+ 'end of file',
+ 'end of line',
+ 'end of screen',
+ 'end of tabbed block',
+ 'end of version',
+ 'end of',
+ 'endian into',
+ 'ending at',
+ 'enhancement options into',
+ 'enhancement into',
+ 'environment time format',
+ 'execute procedure',
+ 'exporting list to memory',
+ 'extension type',
+
+ 'field format',
+ 'field selection',
+ 'field value into',
+ 'final methods',
+ 'first occurrence of',
+ 'fixed-point arithmetic',
+ 'for all entries',
+ 'for all instances',
+ 'for appending',
+ 'for columns',
+ 'for event of',
+ 'for field',
+ 'for high',
+ 'for input',
+ 'for lines',
+ 'for low',
+ 'for node',
+ 'for output',
+ 'for select',
+ 'for table',
+ 'for testing',
+ 'for update',
+ 'for user',
+ 'frame entry',
+ 'frame program from',
+ 'from code page',
+ 'from context',
+ 'from database',
+ 'from logfile id',
+ 'from number format',
+ 'from screen',
+ 'from table',
+ 'function key',
+
+ 'get connection',
+ 'global friends',
+ 'group by',
+
+ 'hashed table of',
+ 'hashed table',
+
+ 'if found',
+ 'ignoring case',
+ 'ignoring conversion errors',
+ 'ignoring structure boundaries',
+ 'implementations from',
+ 'in background',
+ 'in background task',
+ 'in background unit',
+ 'in binary mode',
+ 'in byte mode',
+ 'in char-to-hex mode',
+ 'in character mode',
+ 'in group',
+ 'in legacy binary mode',
+ 'in legacy text mode',
+ 'in program',
+ 'in remote task',
+ 'in text mode',
+ 'in table',
+ 'in update task',
+ 'include bound',
+ 'include into',
+ 'include program from',
+ 'include structure',
+ 'include type',
+ 'including gaps',
+ 'index table',
+ 'inheriting from',
+ 'init destination',
+ 'initial line of',
+ 'initial line',
+ 'initial size',
+ 'internal table',
+ 'into sortable code',
+
+ 'keep in spool',
+ 'keeping directory entry',
+ 'keeping logical unit of work',
+ 'keeping task',
+ 'keywords from',
+
+ 'left margin',
+ 'left outer',
+ 'levels into',
+ 'line format',
+ 'line into',
+ 'line of',
+ 'line page',
+ 'line value from',
+ 'line value into',
+ 'lines of',
+ 'list authority',
+ 'list dataset',
+ 'list name',
+ 'little endian',
+ 'lob handle for',
+ 'local friends',
+ 'locator for',
+ 'lower case',
+
+ 'main table field',
+ 'match count',
+ 'match length',
+ 'match line',
+ 'match offset',
+ 'matchcode object',
+ 'maximum length',
+ 'maximum width into',
+ 'memory id',
+ 'message into',
+ 'messages into',
+ 'modif id',
+
+ 'nesting level',
+ 'new list identification',
+ 'next cursor',
+ 'no database selection',
+ 'no dialog',
+ 'no end of line',
+ 'no fields',
+ 'no flush',
+ 'no intervals',
+ 'no intervals off',
+ 'no standard page heading',
+ 'no-extension off',
+ 'non-unique key',
+ 'non-unique sorted key',
+ 'not at end of mode',
+ 'number of lines',
+ 'number of pages',
+
+ 'object key',
+ 'obligatory off',
+ 'of current page',
+ 'of page',
+ 'of program',
+ 'offset into',
+ 'on block',
+ 'on commit',
+ 'on end of task',
+ 'on end of',
+ 'on exit-command',
+ 'on help-request for',
+ 'on radiobutton group',
+ 'on rollback',
+ 'on value-request for',
+ 'open for package',
+ 'option class-coding',
+ 'option class',
+ 'option coding',
+ 'option expand',
+ 'option syncpoints',
+ 'options from',
+ 'order by',
+ 'overflow into',
+
+ 'package section',
+ 'package size',
+ 'preferred parameter',
+ 'preserving identifier escaping',
+ 'primary key',
+ 'print off',
+ 'print on',
+ 'program from',
+ 'program type',
+
+ 'radiobutton groups',
+ 'radiobutton group',
+ 'range of',
+ 'reader for',
+ 'receive buffer',
+ 'reduced functionality',
+ 'ref to data',
+ 'ref to object',
+ 'ref to',
+
+ 'reference into',
+ 'renaming with suffix',
+ 'replacement character',
+ 'replacement count',
+ 'replacement length',
+ 'replacement line',
+ 'replacement offset',
+ 'respecting blanks',
+ 'respecting case',
+ 'result into',
+ 'risk level',
+
+ 'sap cover page',
+ 'search fkeq',
+ 'search fkge',
+ 'search gkeq',
+ 'search gkge',
+ 'section of',
+ 'send buffer',
+ 'separated by',
+ 'shared buffer',
+ 'shared memory',
+ 'shared memory enabled',
+ 'skipping byte-order mark',
+ 'sorted by',
+ 'sorted table of',
+ 'sorted table',
+ 'spool parameters',
+ 'standard table of',
+ 'standard table',
+ 'starting at',
+ 'starting new task',
+ 'statements into',
+ 'structure default',
+ 'structures into',
+
+ 'table field',
+ 'table of',
+ 'text mode',
+ 'time stamp',
+ 'time zone',
+ 'to code page',
+ 'to column',
+ 'to context',
+ 'to first page',
+ 'to last page',
+ 'to last line',
+ 'to line',
+ 'to lower case',
+ 'to number format',
+ 'to page',
+ 'to sap spool',
+ 'to upper case',
+ 'tokens into',
+ 'transporting no fields',
+ 'type tableview',
+ 'type tabstrip',
+
+ 'unicode enabling',
+ 'up to',
+ 'upper case',
+ 'using edit mask',
+ 'using key',
+ 'using no edit mask',
+ 'using screen',
+ 'using selection-screen',
+ 'using selection-set',
+ 'using selection-sets of program',
+
+ 'valid between',
+ 'valid from',
+ 'value check',
+ 'via job',
+ 'via selection-screen',
+ 'visible length',
+
+ 'whenever found',
+ 'with analysis',
+ 'with byte-order mark',
+ 'with comments',
+ 'with current switchstates',
+ 'with explicit enhancements',
+ 'with frame',
+ 'with free selections',
+ 'with further secondary keys',
+ 'with header line',
+ 'with hold',
+ 'with implicit enhancements',
+ 'with inactive enhancements',
+ 'with includes',
+ 'with key',
+ 'with linefeed',
+ 'with list tokenization',
+ 'with native linefeed',
+ 'with non-unique key',
+ 'with null',
+ 'with pragmas',
+ 'with precompiled headers',
+ 'with selection-table',
+ 'with smart linefeed',
+ 'with table key',
+ 'with test code',
+ 'with type-pools',
+ 'with unique key',
+ 'with unix linefeed',
+ 'with windows linefeed',
+ 'without further secondary keys',
+ 'without selection-screen',
+ 'without spool dynpro',
+ 'without trmac',
+ 'word into',
+ 'writer for'
+ ),
+
+ //**********************************************************
+ // Other abap statements
+ //**********************************************************
+ 3 => array(
+ 'add',
+ 'add-corresponding',
+ 'aliases',
+ 'append',
+ 'assign',
+ 'at',
+ 'authority-check',
+
+ 'break-point',
+
+ 'clear',
+ 'collect',
+ 'compute',
+ 'concatenate',
+ 'condense',
+ 'class',
+ 'class-events',
+ 'class-methods',
+ 'class-pool',
+
+ 'define',
+ 'delete',
+ 'demand',
+ 'detail',
+ 'divide',
+ 'divide-corresponding',
+
+ 'editor-call',
+ 'end-of-file',
+ 'end-enhancement-section',
+ 'end-of-definition',
+ 'end-of-page',
+ 'end-of-selection',
+ 'endclass',
+ 'endenhancement',
+ 'endexec',
+ 'endform',
+ 'endfunction',
+ 'endinterface',
+ 'endmethod',
+ 'endmodule',
+ 'endon',
+ 'endprovide',
+ 'endselect',
+ 'enhancement',
+ 'enhancement-point',
+ 'enhancement-section',
+ 'export',
+ 'extract',
+ 'events',
+
+ 'fetch',
+ 'field-groups',
+ 'find',
+ 'format',
+ 'form',
+ 'free',
+ 'function-pool',
+ 'function',
+
+ 'get',
+
+ 'hide',
+
+ 'import',
+ 'infotypes',
+ 'input',
+ 'insert',
+ 'include',
+ 'initialization',
+ 'interface',
+ 'interface-pool',
+ 'interfaces',
+
+ 'leave',
+ 'load-of-program',
+ 'log-point',
+
+ 'maximum',
+ 'message',
+ 'methods',
+ 'method',
+ 'minimum',
+ 'modify',
+ 'move',
+ 'move-corresponding',
+ 'multiply',
+ 'multiply-corresponding',
+
+ 'new-line',
+ 'new-page',
+ 'new-section',
+
+ 'overlay',
+
+ 'pack',
+ 'perform',
+ 'position',
+ 'print-control',
+ 'program',
+ 'provide',
+ 'put',
+
+ 'raise',
+ 'refresh',
+ 'reject',
+ 'replace',
+ 'report',
+ 'reserve',
+
+ 'scroll',
+ 'search',
+ 'select',
+ 'selection-screen',
+ 'shift',
+ 'skip',
+ 'sort',
+ 'split',
+ 'start-of-selection',
+ 'submit',
+ 'subtract',
+ 'subtract-corresponding',
+ 'sum',
+ 'summary',
+ 'summing',
+ 'supply',
+ 'syntax-check',
+
+ 'top-of-page',
+ 'transfer',
+ 'translate',
+ 'type-pool',
+
+ 'uline',
+ 'unpack',
+ 'update',
+
+ 'window',
+ 'write'
+
+ ),
+
+ //**********************************************************
+ // keywords
+ //**********************************************************
+
+ 4 => array(
+ 'abbreviated',
+ 'abstract',
+ 'accept',
+ 'acos',
+ 'activation',
+ 'alias',
+ 'align',
+ 'all',
+ 'allocate',
+ 'and',
+ 'assigned',
+ 'any',
+ 'appending',
+ 'area',
+ 'as',
+ 'ascending',
+ 'asin',
+ 'assigning',
+ 'atan',
+ 'attributes',
+ 'avg',
+
+ 'backward',
+ 'between',
+ 'bit-and',
+ 'bit-not',
+ 'bit-or',
+ 'bit-set',
+ 'bit-xor',
+ 'boolc',
+ 'boolx',
+ 'bound',
+ 'bt',
+ 'blocks',
+ 'bounds',
+ 'boxed',
+ 'by',
+ 'byte-ca',
+ 'byte-cn',
+ 'byte-co',
+ 'byte-cs',
+ 'byte-na',
+ 'byte-ns',
+
+ 'ca',
+ 'calling',
+ 'casting',
+ 'ceil',
+ 'center',
+ 'centered',
+ 'changing',
+ 'char_off',
+ 'charlen',
+ 'circular',
+ 'class_constructor',
+ 'client',
+ 'clike',
+ 'close',
+ 'cmax',
+ 'cmin',
+ 'cn',
+ 'cnt',
+ 'co',
+ 'col_background',
+ 'col_group',
+ 'col_heading',
+ 'col_key',
+ 'col_negative',
+ 'col_normal',
+ 'col_positive',
+ 'col_total',
+ 'color',
+ 'column',
+ 'comment',
+ 'comparing',
+ 'components',
+ 'condition',
+ 'context',
+ 'copies',
+ 'count',
+ 'country',
+ 'cpi',
+ 'creating',
+ 'critical',
+ 'concat_lines_of',
+ 'cos',
+ 'cosh',
+ 'count_any_not_of',
+ 'count_any_of',
+ 'cp',
+ 'cs',
+ 'csequence',
+ 'currency',
+ 'current',
+ 'cx_static_check',
+ 'cx_root',
+ 'cx_dynamic_check',
+
+ 'dangerous',
+ 'database',
+ 'datainfo',
+ 'date',
+ 'dbmaxlen',
+ 'dd/mm/yy',
+ 'dd/mm/yyyy',
+ 'ddmmyy',
+ 'deallocate',
+ 'decfloat',
+ 'decfloat16',
+ 'decfloat34',
+ 'decimals',
+ 'default',
+ 'deferred',
+ 'definition',
+ 'department',
+ 'descending',
+ 'destination',
+ 'disconnect',
+ 'display-mode',
+ 'distance',
+ 'distinct',
+ 'div',
+ 'dummy',
+
+ 'encoding',
+ 'end-lines',
+ 'engineering',
+ 'environment',
+ 'eq',
+ 'equiv',
+ 'error_message',
+ 'errormessage',
+ 'escape',
+ 'exact',
+ 'exception-table',
+ 'exceptions',
+ 'exclude',
+ 'excluding',
+ 'exists',
+ 'exp',
+ 'exponent',
+ 'exporting',
+ 'extended_monetary',
+
+ 'field',
+ 'filter-table',
+ 'filters',
+ 'filter',
+ 'final',
+ 'find_any_not_of',
+ 'find_any_of',
+ 'find_end',
+ 'floor',
+ 'first-line',
+ 'font',
+ 'forward',
+ 'for',
+ 'frac',
+ 'from_mixed',
+ 'friends',
+ 'from',
+
+ 'giving',
+ 'ge',
+ 'gt',
+
+ 'handle',
+ 'harmless',
+ 'having',
+ 'head-lines',
+ 'help-id',
+ 'help-request',
+ 'high',
+ 'hold',
+ 'hotspot',
+
+ 'id',
+ 'ids',
+ 'immediately',
+ 'implementation',
+ 'importing',
+ 'in',
+ 'initial',
+ 'incl',
+ 'including',
+ 'increment',
+ 'index',
+ 'index-line',
+ 'inner',
+ 'inout',
+ 'intensified',
+ 'into',
+ 'inverse',
+ 'is',
+ 'iso',
+
+ 'join',
+
+ 'key',
+ 'kind',
+
+ 'log10',
+ 'language',
+ 'late',
+ 'layout',
+ 'le',
+ 'lt',
+ 'left-justified',
+ 'leftplus',
+ 'leftspace',
+ 'left',
+ 'length',
+ 'level',
+ 'like',
+ 'line-count',
+ 'line-size',
+ 'lines',
+ 'line',
+ 'load',
+ 'long',
+ 'lower',
+ 'low',
+ 'lpi',
+
+ 'matches',
+ 'match',
+ 'mail',
+ 'major-id',
+ 'max',
+ 'medium',
+ 'memory',
+ 'message-id',
+ 'module',
+ 'minor-id',
+ 'min',
+ 'mm/dd/yyyy',
+ 'mm/dd/yy',
+ 'mmddyy',
+ 'mode',
+ 'modifier',
+ 'mod',
+ 'monetary',
+
+ 'name',
+ 'nb',
+ 'ne',
+ 'next',
+ 'no-display',
+ 'no-extension',
+ 'no-gap',
+ 'no-gaps',
+ 'no-grouping',
+ 'no-heading',
+ 'no-scrolling',
+ 'no-sign',
+ 'no-title',
+ 'no-topofpage',
+ 'no-zero',
+ 'nodes',
+ 'non-unicode',
+ 'no',
+ 'number',
+ 'nmax',
+ 'nmin',
+ 'not',
+ 'null',
+ 'numeric',
+ 'numofchar',
+
+ 'o',
+ 'objects',
+ 'obligatory',
+ 'occurs',
+ 'offset',
+ 'off',
+ 'of',
+ 'only',
+ 'open',
+ 'option',
+ 'optional',
+ 'options',
+ 'output-length',
+ 'output',
+ 'out',
+ 'on change of',
+ 'or',
+ 'others',
+
+ 'pad',
+ 'page',
+ 'pages',
+ 'parameter-table',
+ 'part',
+ 'performing',
+ 'pos_high',
+ 'pos_low',
+ 'priority',
+ 'public',
+ 'pushbutton',
+
+ 'queue-only',
+ 'quickinfo',
+
+ 'raising',
+ 'range',
+ 'read-only',
+ 'received',
+ 'receiver',
+ 'receiving',
+ 'redefinition',
+ 'reference',
+ 'regex',
+ 'replacing',
+ 'reset',
+ 'responsible',
+ 'result',
+ 'results',
+ 'resumable',
+ 'returncode',
+ 'returning',
+ 'right',
+ 'right-specified',
+ 'rightplus',
+ 'rightspace',
+ 'round',
+ 'rows',
+ 'repeat',
+ 'requested',
+ 'rescale',
+ 'reverse',
+
+ 'scale_preserving',
+ 'scale_preserving_scientific',
+ 'scientific',
+ 'scientific_with_leading_zero',
+ 'screen',
+ 'scrolling',
+ 'seconds',
+ 'segment',
+ 'shift_left',
+ 'shift_right',
+ 'sign',
+ 'simple',
+ 'sin',
+ 'sinh',
+ 'short',
+ 'shortdump-id',
+ 'sign_as_postfix',
+ 'single',
+ 'size',
+ 'some',
+ 'source',
+ 'space',
+ 'spots',
+ 'stable',
+ 'state',
+ 'static',
+ 'statusinfo',
+ 'sqrt',
+ 'string',
+ 'strlen',
+ 'structure',
+ 'style',
+ 'subkey',
+ 'submatches',
+ 'substring',
+ 'substring_after',
+ 'substring_before',
+ 'substring_from',
+ 'substring_to',
+ 'super',
+ 'supplied',
+ 'switch',
+
+ 'tan',
+ 'tanh',
+ 'table_line',
+ 'table',
+ 'tab',
+ 'then',
+ 'timestamp',
+ 'times',
+ 'time',
+ 'timezone',
+ 'title-lines',
+ 'title',
+ 'top-lines',
+ 'to',
+ 'to_lower',
+ 'to_mixed',
+ 'to_upper',
+ 'trace-file',
+ 'trace-table',
+ 'transporting',
+ 'trunc',
+ 'type',
+
+ 'under',
+ 'unique',
+ 'unit',
+ 'user-command',
+ 'using',
+ 'utf-8',
+
+ 'valid',
+ 'value',
+ 'value-request',
+ 'values',
+ 'vary',
+ 'varying',
+ 'version',
+
+ 'warning',
+ 'where',
+ 'width',
+ 'with',
+ 'word',
+ 'with-heading',
+ 'with-title',
+
+ 'xsequence',
+ 'xstring',
+ 'xstrlen',
+
+ 'yes',
+ 'yymmdd',
+
+ 'z',
+ 'zero'
+
+ ),
+
+ //**********************************************************
+ // screen statements
+ //**********************************************************
+
+ 5 => array(
+ 'call subscreen',
+ 'chain',
+ 'endchain',
+ 'on chain-input',
+ 'on chain-request',
+ 'on help-request',
+ 'on input',
+ 'on request',
+ 'on value-request',
+ 'process'
+ ),
+
+ //**********************************************************
+ // internal statements
+ //**********************************************************
+
+ 6 => array(
+ 'generate dynpro',
+ 'generate report',
+ 'import dynpro',
+ 'import nametab',
+ 'include methods',
+ 'load report',
+ 'scan abap-source',
+ 'scan and check abap-source',
+ 'syntax-check for dynpro',
+ 'syntax-check for program',
+ 'syntax-trace',
+ 'system-call',
+ 'system-exit',
+ 'verification-message'
+ ),
+
+ //**********************************************************
+ // Control statements
+ //**********************************************************
+
+ 1 => array(
+ 'assert',
+ 'case',
+ 'catch',
+ 'check',
+ 'cleanup',
+ 'continue',
+ 'do',
+ 'else',
+ 'elseif',
+ 'endat',
+ 'endcase',
+ 'endcatch',
+ 'endif',
+ 'enddo',
+ 'endloop',
+ 'endtry',
+ 'endwhile',
+ 'exit',
+ 'if',
+ 'loop',
+ 'resume',
+ 'retry',
+ 'return',
+ 'stop',
+ 'try',
+ 'when',
+ 'while'
+
+ ),
+
+ //**********************************************************
+ // variable declaration statements
+ //**********************************************************
+
+ 2 => array(
+ 'class-data',
+ 'controls',
+ 'constants',
+ 'data',
+ 'field-symbols',
+ 'fields',
+ 'local',
+ 'parameters',
+ 'ranges',
+ 'select-options',
+ 'statics',
+ 'tables',
+ 'type-pools',
+ 'types'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '->*', '->', '=>',
+ '(', ')', '{', '}', '[', ']', '+', '-', '*', '/', '!', '%', '^', '&', ':', ',', '.'
+ ),
+ 1 => array(
+ '>=', '<=', '<', '>', '='
+ ),
+ 2 => array(
+ '?='
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ 8 => false,
+ 9 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;', //control statements
+ 2 => 'color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;', //data statements
+ 3 => 'color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;', //first token of other statements
+ 4 => 'color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;', // next tokens of other statements ("keywords")
+ 5 => 'color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;',
+ 6 => 'color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;',
+ 7 => 'color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;',
+ 8 => 'color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;',
+ 9 => 'color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #339933;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #808080;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #4da619;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #3399ff;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #808080;',
+ 1 => 'color: #800080;',
+ 2 => 'color: #0000ff;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://help.sap.com/abapdocu/en/ABAP{FNAMEU}.htm',
+ 2 => 'http://help.sap.com/abapdocu/en/ABAP{FNAMEU}.htm',
+ 3 => 'http://help.sap.com/abapdocu/en/ABAP{FNAMEU}.htm',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+ 9 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '-&gt;',
+ 2 => '=&gt;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 7 => array(
+ 'SPACE_AS_WHITESPACE' => true
+ ),
+ 8 => array(
+ 'SPACE_AS_WHITESPACE' => true
+ ),
+ 9 => array(
+ 'SPACE_AS_WHITESPACE' => true
+ )
+ )
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/actionscript.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/actionscript.php
new file mode 100644
index 00000000..08e5b49a
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/actionscript.php
@@ -0,0 +1,197 @@
+<?php
+/*************************************************************************************
+ * actionscript.php
+ * ----------------
+ * Author: Steffen Krause (Steffen.krause@muse.de)
+ * Copyright: (c) 2004 Steffen Krause, Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/20
+ *
+ * Actionscript language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ActionScript',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ '#include', 'for', 'foreach', 'each', 'if', 'elseif', 'else', 'while', 'do', 'dowhile',
+ 'endwhile', 'endif', 'switch', 'case', 'endswitch', 'return', 'break', 'continue', 'in'
+ ),
+ 2 => array(
+ 'null', 'false', 'true', 'var',
+ 'default', 'function', 'class',
+ 'new', '_global'
+ ),
+ 3 => array(
+ '#endinitclip', '#initclip', '__proto__', '_accProps', '_alpha', '_currentframe',
+ '_droptarget', '_focusrect', '_framesloaded', '_height', '_highquality', '_lockroot',
+ '_name', '_parent', '_quality', '_root', '_rotation', '_soundbuftime', '_target', '_totalframes',
+ '_url', '_visible', '_width', '_x', '_xmouse', '_xscale', '_y', '_ymouse', '_yscale', 'abs',
+ 'Accessibility', 'acos', 'activityLevel', 'add', 'addListener', 'addPage', 'addProperty',
+ 'addRequestHeader', 'align', 'allowDomain', 'allowInsecureDomain', 'and', 'appendChild',
+ 'apply', 'Arguments', 'Array', 'asfunction', 'asin', 'atan', 'atan2', 'attachAudio', 'attachMovie',
+ 'attachSound', 'attachVideo', 'attributes', 'autosize', 'avHardwareDisable', 'background',
+ 'backgroundColor', 'BACKSPACE', 'bandwidth', 'beginFill', 'beginGradientFill', 'blockIndent',
+ 'bold', 'Boolean', 'border', 'borderColor', 'bottomScroll', 'bufferLength', 'bufferTime',
+ 'builtInItems', 'bullet', 'Button', 'bytesLoaded', 'bytesTotal', 'call', 'callee', 'caller',
+ 'Camera', 'capabilities', 'CAPSLOCK', 'caption', 'catch', 'ceil', 'charAt', 'charCodeAt',
+ 'childNodes', 'chr', 'clear', 'clearInterval', 'cloneNode', 'close', 'Color', 'concat',
+ 'connect', 'condenseWhite', 'constructor', 'contentType', 'ContextMenu', 'ContextMenuItem',
+ 'CONTROL', 'copy', 'cos', 'createElement', 'createEmptyMovieClip', 'createTextField',
+ 'createTextNode', 'currentFps', 'curveTo', 'CustomActions', 'customItems', 'data', 'Date',
+ 'deblocking', 'delete', 'DELETEKEY', 'docTypeDecl', 'domain', 'DOWN',
+ 'duplicateMovieClip', 'duration', 'dynamic', 'E', 'embedFonts', 'enabled',
+ 'END', 'endFill', 'ENTER', 'eq', 'Error', 'ESCAPE(Konstante)', 'escape(Funktion)', 'eval',
+ 'exactSettings', 'exp', 'extends', 'finally', 'findText', 'firstChild', 'floor',
+ 'flush', 'focusEnabled', 'font', 'fps', 'fromCharCode', 'fscommand',
+ 'gain', 'ge', 'get', 'getAscii', 'getBeginIndex', 'getBounds', 'getBytesLoaded', 'getBytesTotal',
+ 'getCaretIndex', 'getCode', 'getCount', 'getDate', 'getDay', 'getDepth', 'getEndIndex', 'getFocus',
+ 'getFontList', 'getFullYear', 'getHours', 'getInstanceAtDepth', 'getLocal', 'getMilliseconds',
+ 'getMinutes', 'getMonth', 'getNewTextFormat', 'getNextHighestDepth', 'getPan', 'getProgress',
+ 'getProperty', 'getRGB', 'getSeconds', 'getSelected', 'getSelectedText', 'getSize', 'getStyle',
+ 'getStyleNames', 'getSWFVersion', 'getText', 'getTextExtent', 'getTextFormat', 'getTextSnapshot',
+ 'getTime', 'getTimer', 'getTimezoneOffset', 'getTransform', 'getURL', 'getUTCDate', 'getUTCDay',
+ 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds', 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds',
+ 'getVersion', 'getVolume', 'getYear', 'globalToLocal', 'goto', 'gotoAndPlay', 'gotoAndStop',
+ 'hasAccessibility', 'hasAudio', 'hasAudioEncoder', 'hasChildNodes', 'hasEmbeddedVideo', 'hasMP3',
+ 'hasPrinting', 'hasScreenBroadcast', 'hasScreenPlayback', 'hasStreamingAudio', 'hasStreamingVideo',
+ 'hasVideoEncoder', 'height', 'hide', 'hideBuiltInItems', 'hitArea', 'hitTest', 'hitTestTextNearPos',
+ 'HOME', 'hscroll', 'html', 'htmlText', 'ID3', 'ifFrameLoaded', 'ignoreWhite', 'implements',
+ 'import', 'indent', 'index', 'indexOf', 'Infinity', '-Infinity', 'INSERT', 'insertBefore', 'install',
+ 'instanceof', 'int', 'interface', 'isActive', 'isDebugger', 'isDown', 'isFinite', 'isNaN', 'isToggled',
+ 'italic', 'join', 'Key', 'language', 'lastChild', 'lastIndexOf', 'le', 'leading', 'LEFT', 'leftMargin',
+ 'length', 'level', 'lineStyle', 'lineTo', 'list', 'LN10', 'LN2', 'load', 'loadClip', 'loaded', 'loadMovie',
+ 'loadMovieNum', 'loadSound', 'loadVariables', 'loadVariablesNum', 'LoadVars', 'LocalConnection',
+ 'localFileReadDisable', 'localToGlobal', 'log', 'LOG10E', 'LOG2E', 'manufacturer', 'Math', 'max',
+ 'MAX_VALUE', 'maxChars', 'maxhscroll', 'maxscroll', 'mbchr', 'mblength', 'mbord', 'mbsubstring', 'menu',
+ 'message', 'Microphone', 'min', 'MIN_VALUE', 'MMExecute', 'motionLevel', 'motionTimeOut', 'Mouse',
+ 'mouseWheelEnabled', 'moveTo', 'Movieclip', 'MovieClipLoader', 'multiline', 'muted', 'name', 'names', 'NaN',
+ 'ne', 'NEGATIVE_INFINITY', 'NetConnection', 'NetStream', 'newline', 'nextFrame',
+ 'nextScene', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue', 'not', 'Number', 'Object',
+ 'on', 'onActivity', 'onChanged', 'onClipEvent', 'onClose', 'onConnect', 'onData', 'onDragOut',
+ 'onDragOver', 'onEnterFrame', 'onID3', 'onKeyDown', 'onKeyUp', 'onKillFocus', 'onLoad', 'onLoadComplete',
+ 'onLoadError', 'onLoadInit', 'onLoadProgress', 'onLoadStart', 'onMouseDown', 'onMouseMove', 'onMouseUp',
+ 'onMouseWheel', 'onPress', 'onRelease', 'onReleaseOutside', 'onResize', 'onRollOut', 'onRollOver',
+ 'onScroller', 'onSelect', 'onSetFocus', 'onSoundComplete', 'onStatus', 'onUnload', 'onUpdate', 'onXML',
+ 'or(logischesOR)', 'ord', 'os', 'parentNode', 'parseCSS', 'parseFloat', 'parseInt', 'parseXML', 'password',
+ 'pause', 'PGDN', 'PGUP', 'PI', 'pixelAspectRatio', 'play', 'playerType', 'pop', 'position',
+ 'POSITIVE_INFINITY', 'pow', 'prevFrame', 'previousSibling', 'prevScene', 'print', 'printAsBitmap',
+ 'printAsBitmapNum', 'PrintJob', 'printNum', 'private', 'prototype', 'public', 'push', 'quality',
+ 'random', 'rate', 'registerClass', 'removeListener', 'removeMovieClip', 'removeNode', 'removeTextField',
+ 'replaceSel', 'replaceText', 'resolutionX', 'resolutionY', 'restrict', 'reverse', 'RIGHT',
+ 'rightMargin', 'round', 'scaleMode', 'screenColor', 'screenDPI', 'screenResolutionX', 'screenResolutionY',
+ 'scroll', 'seek', 'selectable', 'Selection', 'send', 'sendAndLoad', 'separatorBefore', 'serverString',
+ 'set', 'setvariable', 'setBufferTime', 'setClipboard', 'setDate', 'setFocus', 'setFullYear', 'setGain',
+ 'setHours', 'setInterval', 'setMask', 'setMilliseconds', 'setMinutes', 'setMode', 'setMonth',
+ 'setMotionLevel', 'setNewTextFormat', 'setPan', 'setProperty', 'setQuality', 'setRate', 'setRGB',
+ 'setSeconds', 'setSelectColor', 'setSelected', 'setSelection', 'setSilenceLevel', 'setStyle',
+ 'setTextFormat', 'setTime', 'setTransform', 'setUseEchoSuppression', 'setUTCDate', 'setUTCFullYear',
+ 'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setVolume',
+ 'setYear', 'SharedObject', 'SHIFT(Konstante)', 'shift(Methode)', 'show', 'showMenu', 'showSettings',
+ 'silenceLevel', 'silenceTimeout', 'sin', 'size', 'slice', 'smoothing', 'sort', 'sortOn', 'Sound', 'SPACE',
+ 'splice', 'split', 'sqrt', 'SQRT1_2', 'SQRT2', 'Stage', 'start', 'startDrag', 'static', 'status', 'stop',
+ 'stopAllSounds', 'stopDrag', 'String', 'StyleSheet(Klasse)', 'styleSheet(Eigenschaft)', 'substr',
+ 'substring', 'super', 'swapDepths', 'System', 'TAB', 'tabChildren', 'tabEnabled', 'tabIndex',
+ 'tabStops', 'tan', 'target', 'targetPath', 'tellTarget', 'text', 'textColor', 'TextField', 'TextFormat',
+ 'textHeight', 'TextSnapshot', 'textWidth', 'this', 'throw', 'time', 'toggleHighQuality', 'toLowerCase',
+ 'toString', 'toUpperCase', 'trace', 'trackAsMenu', 'try', 'type', 'typeof', 'undefined',
+ 'underline', 'unescape', 'uninstall', 'unloadClip', 'unloadMovie', 'unLoadMovieNum', 'unshift', 'unwatch',
+ 'UP', 'updateAfterEvent', 'updateProperties', 'url', 'useCodePage', 'useEchoSuppression', 'useHandCursor',
+ 'UTC', 'valueOf', 'variable', 'version', 'Video', 'visible', 'void', 'watch', 'width',
+ 'with', 'wordwrap', 'XML', 'xmlDecl', 'XMLNode', 'XMLSocket'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '!', '@', '%', '&', '*', '|', '/', '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #0066CC;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/actionscript3.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/actionscript3.php
new file mode 100644
index 00000000..189d714b
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/actionscript3.php
@@ -0,0 +1,473 @@
+<?php
+/*************************************************************************************
+ * actionscript3.php
+ * ----------------
+ * Author: Jordi Boggiano (j.boggiano@seld.be)
+ * Copyright: (c) 2007 Jordi Boggiano (http://www.seld.be/), Benny Baumann (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/11/26
+ *
+ * ActionScript3 language file for GeSHi.
+ *
+ * All keywords scraped from the Flex 2.0.1 Documentation
+ *
+ * The default style is based on FlexBuilder2 coloring, with the addition of class, package, method and
+ * constant names that are highlighted to help identifying problem when used on public pastebins.
+ *
+ * For styling, keywords data from 0 to 1 (accessible through .kw1, etc.) are described here :
+ *
+ * 1 : operators
+ * 2 : 'var' keyword
+ * 3 : 'function' keyword
+ * 4 : 'class' and 'package' keywords
+ * 5 : all flash.* class names plus Top Level classes, mx are excluded
+ * 6 : all flash.* package names, mx are excluded
+ * 7 : valid flash method names and properties (there is no type checks sadly, for example String().x will be highlighted as 'x' is valid, but obviously strings don't have a x property)
+ * 8 : valid flash constant names (again, no type check)
+ *
+ *
+ * CHANGES
+ * -------
+ * 2007/12/06 (1.0.7.22)
+ * - Added the 'this' keyword (oops)
+ *
+ * TODO (updated 2007/11/30)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ActionScript 3',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Regular expressions
+ 2 => "/(?<=[\\s^])(s|tr|y)\\/(?!\s)(?:\\\\.|(?!\n)[^\\/\\\\])+(?<!\s)\\/(?!\s)(?:\\\\.|(?!\n)[^\\/\\\\])*(?<!\s)\\/[msixpogcde]*(?=[\\s$\\.\\;])|(?<=[\\s^(=])(m|q[qrwx]?)?\\/(?!\s)(?:\\\\.|(?!\n)[^\\/\\\\])+(?<!\s)\\/[msixpogc]*(?=[\\s$\\.\\,\\;\\)])/iU",
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'with', 'while', 'void', 'undefined', 'typeof', 'try', 'true',
+ 'throw', 'this', 'switch', 'super', 'set', 'return', 'public', 'protected',
+ 'private', 'null', 'new', 'is', 'internal', 'instanceof', 'in',
+ 'import', 'if', 'get', 'for', 'false', 'else', 'each', 'do',
+ 'delete', 'default', 'continue', 'catch', 'case', 'break', 'as',
+ 'extends', 'override'
+ ),
+ 2 => array(
+ 'var'
+ ),
+ 3 => array(
+ 'function'
+ ),
+ 4 => array(
+ 'class', 'package'
+ ),
+ 6 => array(
+ 'flash.xml', 'flash.utils', 'flash.ui', 'flash.text',
+ 'flash.system', 'flash.profiler', 'flash.printing', 'flash.net',
+ 'flash.media', 'flash.geom', 'flash.filters', 'flash.external',
+ 'flash.events', 'flash.errors', 'flash.display',
+ 'flash.accessibility'
+ ),
+ 7 => array(
+ 'zoom', 'year', 'y', 'xmlDecl', 'x', 'writeUnsignedInt',
+ 'writeUTFBytes', 'writeUTF', 'writeShort', 'writeObject',
+ 'writeMultiByte', 'writeInt', 'writeFloat', 'writeExternal',
+ 'writeDynamicProperty', 'writeDynamicProperties', 'writeDouble',
+ 'writeBytes', 'writeByte', 'writeBoolean', 'wordWrap',
+ 'willTrigger', 'width', 'volume', 'visible', 'videoWidth',
+ 'videoHeight', 'version', 'valueOf', 'value', 'usingTLS',
+ 'useRichTextClipboard', 'useHandCursor', 'useEchoSuppression',
+ 'useCodePage', 'url', 'uri', 'uploadCompleteData', 'upload',
+ 'updateProperties', 'updateAfterEvent', 'upState', 'unshift',
+ 'unlock', 'unload', 'union', 'unescapeMultiByte', 'unescape',
+ 'underline', 'uncompress', 'type', 'ty', 'tx', 'transparent',
+ 'translate', 'transformPoint', 'transform', 'trackAsMenu', 'track',
+ 'trace', 'totalMemory', 'totalFrames', 'topLeft', 'top',
+ 'togglePause', 'toXMLString', 'toUpperCase', 'toUTCString',
+ 'toTimeString', 'toString', 'toPrecision', 'toLowerCase',
+ 'toLocaleUpperCase', 'toLocaleTimeString', 'toLocaleString',
+ 'toLocaleLowerCase', 'toLocaleDateString', 'toFixed',
+ 'toExponential', 'toDateString', 'timezoneOffset', 'timerComplete',
+ 'timer', 'time', 'threshold', 'thickness', 'textWidth',
+ 'textSnapshot', 'textInput', 'textHeight', 'textColor', 'text',
+ 'test', 'target', 'tan', 'tabStops', 'tabIndexChange', 'tabIndex',
+ 'tabEnabledChange', 'tabEnabled', 'tabChildrenChange',
+ 'tabChildren', 'sync', 'swfVersion', 'swapChildrenAt',
+ 'swapChildren', 'subtract', 'substring', 'substr', 'styleSheet',
+ 'styleNames', 'strength', 'stopPropagation',
+ 'stopImmediatePropagation', 'stopDrag', 'stopAll', 'stop', 'status',
+ 'startDrag', 'start', 'stageY', 'stageX', 'stageWidth',
+ 'stageHeight', 'stageFocusRect', 'stage', 'sqrt', 'split', 'splice',
+ 'source', 'soundTransform', 'soundComplete', 'sortOn', 'sort',
+ 'songName', 'some', 'socketData', 'smoothing', 'slice', 'size',
+ 'sin', 'silent', 'silenceTimeout', 'silenceLevel', 'showSettings',
+ 'showRedrawRegions', 'showDefaultContextMenu', 'show', 'shortcut',
+ 'shiftKey', 'shift', 'sharpness', 'sharedEvents', 'shadowColor',
+ 'shadowAlpha', 'settings', 'setUseEchoSuppression', 'setUTCSeconds',
+ 'setUTCMonth', 'setUTCMinutes', 'setUTCMilliseconds', 'setUTCHours',
+ 'setUTCFullYear', 'setUTCDate', 'setTimeout', 'setTime',
+ 'setTextFormat', 'setStyle', 'setSilenceLevel', 'setSettings',
+ 'setSelection', 'setSelected', 'setSelectColor', 'setSeconds',
+ 'setQuality', 'setPropertyIsEnumerable', 'setProperty', 'setPixels',
+ 'setPixel32', 'setPixel', 'setNamespace', 'setName',
+ 'setMotionLevel', 'setMonth', 'setMode', 'setMinutes',
+ 'setMilliseconds', 'setLoopback', 'setLoopBack', 'setLocalName',
+ 'setKeyFrameInterval', 'setInterval', 'setHours', 'setFullYear',
+ 'setEmpty', 'setDirty', 'setDate', 'setCompositionString',
+ 'setClipboard', 'setChildren', 'setChildIndex',
+ 'setAdvancedAntiAliasingTable', 'serverString', 'separatorBefore',
+ 'sendToURL', 'send', 'selectionEndIndex', 'selectionBeginIndex',
+ 'selectable', 'select', 'seek', 'securityError', 'securityDomain',
+ 'secondsUTC', 'seconds', 'search', 'scrollV', 'scrollRect',
+ 'scrollH', 'scroll', 'screenResolutionY', 'screenResolutionX',
+ 'screenDPI', 'screenColor', 'scenes', 'scaleY', 'scaleX',
+ 'scaleMode', 'scale9Grid', 'scale', 'save', 'sandboxType',
+ 'sameDomain', 'running', 'round', 'rotation', 'rotate', 'root',
+ 'rollOver', 'rollOut', 'rightToRight', 'rightToLeft', 'rightPeak',
+ 'rightMargin', 'right', 'rewind', 'reverse', 'resume', 'restrict',
+ 'resize', 'reset', 'requestHeaders', 'replaceText',
+ 'replaceSelectedText', 'replace', 'repeatCount', 'render',
+ 'removedFromStage', 'removed', 'removeNode', 'removeNamespace',
+ 'removeEventListener', 'removeChildAt', 'removeChild',
+ 'relatedObject', 'registerFont', 'registerClassAlias', 'redOffset',
+ 'redMultiplier', 'rect', 'receiveVideo', 'receiveAudio',
+ 'readUnsignedShort', 'readUnsignedInt', 'readUnsignedByte',
+ 'readUTFBytes', 'readUTF', 'readShort', 'readObject',
+ 'readMultiByte', 'readInt', 'readFloat', 'readExternal',
+ 'readDouble', 'readBytes', 'readByte', 'readBoolean', 'ratios',
+ 'rate', 'random', 'quality', 'push', 'publish', 'proxyType',
+ 'prototype', 'propertyIsEnumerable', 'progress',
+ 'processingInstructions', 'printAsBitmap', 'print',
+ 'previousSibling', 'preventDefault', 'prevScene', 'prevFrame',
+ 'prettyPrinting', 'prettyIndent', 'preserveAlpha', 'prependChild',
+ 'prefix', 'pow', 'position', 'pop', 'polar', 'playerType', 'play',
+ 'pixelSnapping', 'pixelDissolve', 'pixelBounds', 'pixelAspectRatio',
+ 'perlinNoise', 'pause', 'parseXML', 'parseInt', 'parseFloat',
+ 'parseCSS', 'parse', 'parentNode', 'parentDomain',
+ 'parentAllowsChild', 'parent', 'parameters', 'paperWidth',
+ 'paperHeight', 'pan', 'paletteMap', 'pageWidth', 'pageHeight',
+ 'overState', 'outsideCutoff', 'os', 'orientation', 'open',
+ 'opaqueBackground', 'onPlayStatus', 'onMetaData', 'onCuePoint',
+ 'offsetPoint', 'offset', 'objectID', 'objectEncoding', 'numLock',
+ 'numLines', 'numFrames', 'numChildren', 'normalize', 'noise',
+ 'nodeValue', 'nodeType', 'nodeName', 'nodeKind', 'noAutoLabeling',
+ 'nextValue', 'nextSibling', 'nextScene', 'nextNameIndex',
+ 'nextName', 'nextFrame', 'netStatus', 'navigateToURL',
+ 'namespaceURI', 'namespaceDeclarations', 'namespace', 'names',
+ 'name', 'muted', 'multiline', 'moveTo', 'mouseY', 'mouseX',
+ 'mouseWheelEnabled', 'mouseWheel', 'mouseUp', 'mouseTarget',
+ 'mouseOver', 'mouseOut', 'mouseMove', 'mouseLeave',
+ 'mouseFocusChange', 'mouseEnabled', 'mouseDown', 'mouseChildren',
+ 'motionTimeout', 'motionLevel', 'monthUTC', 'month',
+ 'modificationDate', 'mode', 'minutesUTC', 'minutes', 'min',
+ 'millisecondsUTC', 'milliseconds', 'method', 'message', 'merge',
+ 'menuSelect', 'menuItemSelect', 'maxScrollV', 'maxScrollH',
+ 'maxLevel', 'maxChars', 'max', 'matrixY', 'matrixX', 'matrix',
+ 'match', 'mask', 'mapPoint', 'mapBitmap', 'map', 'manufacturer',
+ 'macType', 'loopback', 'loop', 'log', 'lock', 'localeCompare',
+ 'localY', 'localX', 'localToGlobal', 'localName',
+ 'localFileReadDisable', 'loaderURL', 'loaderInfo', 'loader',
+ 'loadPolicyFile', 'loadBytes', 'load', 'liveDelay', 'link',
+ 'lineTo', 'lineStyle', 'lineGradientStyle', 'level',
+ 'letterSpacing', 'length', 'leftToRight', 'leftToLeft', 'leftPeak',
+ 'leftMargin', 'left', 'leading', 'lastIndexOf', 'lastIndex',
+ 'lastChild', 'language', 'labels', 'knockout', 'keyUp',
+ 'keyLocation', 'keyFrameInterval', 'keyFocusChange', 'keyDown',
+ 'keyCode', 'kerning', 'join', 'italic', 'isXMLName',
+ 'isPrototypeOf', 'isNaN', 'isFocusInaccessible', 'isFinite',
+ 'isEmpty', 'isDefaultPrevented', 'isDebugger', 'isBuffering',
+ 'isAttribute', 'isAccessible', 'ioError', 'invert', 'invalidate',
+ 'intersects', 'intersection', 'interpolate', 'insideCutoff',
+ 'insertChildBefore', 'insertChildAfter', 'insertBefore', 'inner',
+ 'init', 'info', 'inflatePoint', 'inflate', 'indexOf', 'index',
+ 'indent', 'inScopeNamespaces', 'imeComposition', 'ime',
+ 'ignoreWhitespace', 'ignoreWhite', 'ignoreProcessingInstructions',
+ 'ignoreComments', 'ignoreCase', 'identity', 'idMap', 'id3',
+ 'httpStatus', 'htmlText', 'hoursUTC', 'hours', 'hitTestTextNearPos',
+ 'hitTestState', 'hitTestPoint', 'hitTestObject', 'hitTest',
+ 'hitArea', 'highlightColor', 'highlightAlpha', 'hideObject',
+ 'hideBuiltInItems', 'hide', 'height', 'hasVideoEncoder', 'hasTLS',
+ 'hasStreamingVideo', 'hasStreamingAudio', 'hasSimpleContent',
+ 'hasScreenPlayback', 'hasScreenBroadcast', 'hasProperty',
+ 'hasPrinting', 'hasOwnProperty', 'hasMP3', 'hasIME', 'hasGlyphs',
+ 'hasEventListener', 'hasEmbeddedVideo', 'hasDefinition',
+ 'hasComplexContent', 'hasChildNodes', 'hasAudioEncoder', 'hasAudio',
+ 'hasAccessibility', 'gridFitType', 'greenOffset', 'greenMultiplier',
+ 'graphics', 'gotoAndStop', 'gotoAndPlay', 'globalToLocal', 'global',
+ 'getUTCSeconds', 'getUTCMonth', 'getUTCMinutes',
+ 'getUTCMilliseconds', 'getUTCHours', 'getUTCFullYear', 'getUTCDay',
+ 'getUTCDate', 'getTimezoneOffset', 'getTimer', 'getTime',
+ 'getTextRunInfo', 'getTextFormat', 'getText', 'getStyle',
+ 'getStackTrace', 'getSelectedText', 'getSelected', 'getSeconds',
+ 'getRemote', 'getRect', 'getQualifiedSuperclassName',
+ 'getQualifiedClassName', 'getProperty', 'getPrefixForNamespace',
+ 'getPixels', 'getPixel32', 'getPixel', 'getParagraphLength',
+ 'getObjectsUnderPoint', 'getNamespaceForPrefix', 'getMonth',
+ 'getMinutes', 'getMilliseconds', 'getMicrophone', 'getLocal',
+ 'getLineText', 'getLineOffset', 'getLineMetrics', 'getLineLength',
+ 'getLineIndexOfChar', 'getLineIndexAtPoint', 'getImageReference',
+ 'getHours', 'getFullYear', 'getFirstCharInParagraph',
+ 'getDescendants', 'getDefinitionByName', 'getDefinition', 'getDay',
+ 'getDate', 'getColorBoundsRect', 'getClassByAlias', 'getChildIndex',
+ 'getChildByName', 'getChildAt', 'getCharIndexAtPoint',
+ 'getCharBoundaries', 'getCamera', 'getBounds', 'genre',
+ 'generateFilterRect', 'gain', 'fullYearUTC', 'fullYear',
+ 'fullScreen', 'fscommand', 'fromCharCode', 'framesLoaded',
+ 'frameRate', 'frame', 'fps', 'forwardAndBack', 'formatToString',
+ 'forceSimple', 'forEach', 'fontType', 'fontStyle', 'fontSize',
+ 'fontName', 'font', 'focusRect', 'focusOut', 'focusIn', 'focus',
+ 'flush', 'floor', 'floodFill', 'firstChild', 'findText', 'filters',
+ 'filter', 'fillRect', 'fileList', 'extension', 'extended', 'exp',
+ 'exec', 'exactSettings', 'every', 'eventPhase', 'escapeMultiByte',
+ 'escape', 'errorID', 'error', 'equals', 'enumerateFonts',
+ 'enterFrame', 'endian', 'endFill', 'encodeURIComponent',
+ 'encodeURI', 'enabled', 'embedFonts', 'elements',
+ 'dynamicPropertyWriter', 'dropTarget', 'drawRoundRect', 'drawRect',
+ 'drawEllipse', 'drawCircle', 'draw', 'download', 'downState',
+ 'doubleClickEnabled', 'doubleClick', 'dotall', 'domain',
+ 'docTypeDecl', 'doConversion', 'divisor', 'distance', 'dispose',
+ 'displayState', 'displayMode', 'displayAsPassword', 'dispatchEvent',
+ 'description', 'describeType', 'descent', 'descendants',
+ 'deltaTransformPoint', 'delta', 'deleteProperty', 'delay',
+ 'defaultTextFormat', 'defaultSettings', 'defaultObjectEncoding',
+ 'decodeURIComponent', 'decodeURI', 'decode', 'deblocking',
+ 'deactivate', 'dayUTC', 'day', 'dateUTC', 'date', 'dataFormat',
+ 'data', 'd', 'customItems', 'curveTo', 'currentTarget',
+ 'currentScene', 'currentLabels', 'currentLabel', 'currentFrame',
+ 'currentFPS', 'currentDomain', 'currentCount', 'ctrlKey', 'creator',
+ 'creationDate', 'createTextNode', 'createGradientBox',
+ 'createElement', 'createBox', 'cos', 'copyPixels', 'copyChannel',
+ 'copy', 'conversionMode', 'contextMenuOwner', 'contextMenu',
+ 'contentType', 'contentLoaderInfo', 'content', 'containsRect',
+ 'containsPoint', 'contains', 'constructor', 'connectedProxyType',
+ 'connected', 'connect', 'condenseWhite', 'concatenatedMatrix',
+ 'concatenatedColorTransform', 'concat', 'computeSpectrum',
+ 'compress', 'componentY', 'componentX', 'complete', 'compare',
+ 'comments', 'comment', 'colors', 'colorTransform', 'color', 'code',
+ 'close', 'cloneNode', 'clone', 'client', 'click', 'clearTimeout',
+ 'clearInterval', 'clear', 'clamp', 'children', 'childNodes',
+ 'childIndex', 'childAllowsParent', 'child', 'checkPolicyFile',
+ 'charCount', 'charCodeAt', 'charCode', 'charAt', 'changeList',
+ 'change', 'ceil', 'caretIndex', 'caption', 'capsLock', 'cancelable',
+ 'cancel', 'callee', 'callProperty', 'call', 'cacheAsBitmap', 'c',
+ 'bytesTotal', 'bytesLoaded', 'bytesAvailable', 'buttonMode',
+ 'buttonDown', 'bullet', 'builtInItems', 'bufferTime',
+ 'bufferLength', 'bubbles', 'browse', 'bottomScrollV', 'bottomRight',
+ 'bottom', 'borderColor', 'border', 'bold', 'blurY', 'blurX',
+ 'blueOffset', 'blueMultiplier', 'blockIndent', 'blendMode',
+ 'bitmapData', 'bias', 'beginGradientFill', 'beginFill',
+ 'beginBitmapFill', 'bandwidth', 'backgroundColor', 'background',
+ 'b', 'available', 'avHardwareDisable', 'autoSize', 'attributes',
+ 'attribute', 'attachNetStream', 'attachCamera', 'attachAudio',
+ 'atan2', 'atan', 'asyncError', 'asin', 'ascent', 'artist',
+ 'areSoundsInaccessible', 'areInaccessibleObjectsUnderPoint',
+ 'applyFilter', 'apply', 'applicationDomain', 'appendText',
+ 'appendChild', 'antiAliasType', 'angle', 'alwaysShowSelection',
+ 'altKey', 'alphas', 'alphaOffset', 'alphaMultiplier', 'alpha',
+ 'allowInsecureDomain', 'allowDomain', 'align', 'album',
+ 'addedToStage', 'added', 'addPage', 'addNamespace', 'addHeader',
+ 'addEventListener', 'addChildAt', 'addChild', 'addCallback', 'add',
+ 'activityLevel', 'activity', 'active', 'activating', 'activate',
+ 'actionScriptVersion', 'acos', 'accessibilityProperties', 'abs'
+ ),
+ 8 => array(
+ 'WRAP', 'VERTICAL', 'VARIABLES',
+ 'UTC', 'UPLOAD_COMPLETE_DATA', 'UP', 'UNLOAD', 'UNKNOWN',
+ 'UNIQUESORT', 'TOP_RIGHT', 'TOP_LEFT', 'TOP', 'TIMER_COMPLETE',
+ 'TIMER', 'TEXT_NODE', 'TEXT_INPUT', 'TEXT', 'TAB_INDEX_CHANGE',
+ 'TAB_ENABLED_CHANGE', 'TAB_CHILDREN_CHANGE', 'TAB', 'SYNC',
+ 'SUBTRACT', 'SUBPIXEL', 'STATUS', 'STANDARD', 'SQUARE', 'SQRT2',
+ 'SQRT1_2', 'SPACE', 'SOUND_COMPLETE', 'SOCKET_DATA', 'SHOW_ALL',
+ 'SHIFT', 'SETTINGS_MANAGER', 'SELECT', 'SECURITY_ERROR', 'SCROLL',
+ 'SCREEN', 'ROUND', 'ROLL_OVER', 'ROLL_OUT', 'RIGHT', 'RGB',
+ 'RETURNINDEXEDARRAY', 'RESIZE', 'REPEAT', 'RENDER',
+ 'REMOVED_FROM_STAGE', 'REMOVED', 'REMOTE', 'REGULAR', 'REFLECT',
+ 'RED', 'RADIAL', 'PROGRESS', 'PRIVACY', 'POST', 'POSITIVE_INFINITY',
+ 'PORTRAIT', 'PIXEL', 'PI', 'PENDING', 'PAGE_UP', 'PAGE_DOWN', 'PAD',
+ 'OVERLAY', 'OUTER', 'OPEN', 'NaN', 'NUM_PAD', 'NUMPAD_SUBTRACT',
+ 'NUMPAD_MULTIPLY', 'NUMPAD_ENTER', 'NUMPAD_DIVIDE',
+ 'NUMPAD_DECIMAL', 'NUMPAD_ADD', 'NUMPAD_9', 'NUMPAD_8', 'NUMPAD_7',
+ 'NUMPAD_6', 'NUMPAD_5', 'NUMPAD_4', 'NUMPAD_3', 'NUMPAD_2',
+ 'NUMPAD_1', 'NUMPAD_0', 'NUMERIC', 'NO_SCALE', 'NO_BORDER',
+ 'NORMAL', 'NONE', 'NEVER', 'NET_STATUS', 'NEGATIVE_INFINITY',
+ 'MULTIPLY', 'MOUSE_WHEEL', 'MOUSE_UP', 'MOUSE_OVER', 'MOUSE_OUT',
+ 'MOUSE_MOVE', 'MOUSE_LEAVE', 'MOUSE_FOCUS_CHANGE', 'MOUSE_DOWN',
+ 'MITER', 'MIN_VALUE', 'MICROPHONE', 'MENU_SELECT',
+ 'MENU_ITEM_SELECT', 'MEDIUM', 'MAX_VALUE', 'LOW', 'LOG2E', 'LOG10E',
+ 'LOCAL_WITH_NETWORK', 'LOCAL_WITH_FILE', 'LOCAL_TRUSTED',
+ 'LOCAL_STORAGE', 'LN2', 'LN10', 'LITTLE_ENDIAN', 'LINK',
+ 'LINEAR_RGB', 'LINEAR', 'LIGHT_COLOR', 'LIGHTEN', 'LEFT', 'LCD',
+ 'LAYER', 'LANDSCAPE', 'KOREAN', 'KEY_UP', 'KEY_FOCUS_CHANGE',
+ 'KEY_DOWN', 'JUSTIFY', 'JAPANESE_KATAKANA_HALF',
+ 'JAPANESE_KATAKANA_FULL', 'JAPANESE_HIRAGANA', 'Infinity', 'ITALIC',
+ 'IO_ERROR', 'INVERT', 'INSERT', 'INPUT', 'INNER', 'INIT',
+ 'IME_COMPOSITION', 'IGNORE', 'ID3', 'HTTP_STATUS', 'HORIZONTAL',
+ 'HOME', 'HIGH', 'HARDLIGHT', 'GREEN', 'GET', 'FULLSCREEN', 'FULL',
+ 'FOCUS_OUT', 'FOCUS_IN', 'FLUSHED', 'FLASH9', 'FLASH8', 'FLASH7',
+ 'FLASH6', 'FLASH5', 'FLASH4', 'FLASH3', 'FLASH2', 'FLASH1', 'F9',
+ 'F8', 'F7', 'F6', 'F5', 'F4', 'F3', 'F2', 'F15', 'F14', 'F13',
+ 'F12', 'F11', 'F10', 'F1', 'EXACT_FIT', 'ESCAPE', 'ERROR', 'ERASE',
+ 'ENTER_FRAME', 'ENTER', 'END', 'EMBEDDED', 'ELEMENT_NODE', 'E',
+ 'DYNAMIC', 'DOWN', 'DOUBLE_CLICK', 'DIFFERENCE', 'DEVICE',
+ 'DESCENDING', 'DELETE', 'DEFAULT', 'DEACTIVATE', 'DATA',
+ 'DARK_COLOR', 'DARKEN', 'CRT', 'CONTROL', 'CONNECT', 'COMPLETE',
+ 'COLOR', 'CLOSE', 'CLICK', 'CLAMP', 'CHINESE', 'CHANGE', 'CENTER',
+ 'CASEINSENSITIVE', 'CAPTURING_PHASE', 'CAPS_LOCK', 'CANCEL',
+ 'CAMERA', 'BUBBLING_PHASE', 'BOTTOM_RIGHT', 'BOTTOM_LEFT', 'BOTTOM',
+ 'BOLD_ITALIC', 'BOLD', 'BLUE', 'BINARY', 'BIG_ENDIAN', 'BEVEL',
+ 'BEST', 'BACKSPACE', 'AUTO', 'AT_TARGET', 'ASYNC_ERROR', 'AMF3',
+ 'AMF0', 'ALWAYS', 'ALPHANUMERIC_HALF', 'ALPHANUMERIC_FULL', 'ALPHA',
+ 'ADVANCED', 'ADDED_TO_STAGE', 'ADDED', 'ADD', 'ACTIVITY',
+ 'ACTIONSCRIPT3', 'ACTIONSCRIPT2'
+ ),
+ //FIX: Must be last in order to avoid conflicts with keywords present
+ //in other keyword groups, that might get highlighted as part of the URL.
+ //I know this is not a proper work-around, but should do just fine.
+ 5 => array(
+ 'uint', 'int', 'arguments', 'XMLSocket', 'XMLNodeType', 'XMLNode',
+ 'XMLList', 'XMLDocument', 'XML', 'Video', 'VerifyError',
+ 'URLVariables', 'URLStream', 'URLRequestMethod', 'URLRequestHeader',
+ 'URLRequest', 'URLLoaderDataFormat', 'URLLoader', 'URIError',
+ 'TypeError', 'Transform', 'TimerEvent', 'Timer', 'TextSnapshot',
+ 'TextRenderer', 'TextLineMetrics', 'TextFormatAlign', 'TextFormat',
+ 'TextFieldType', 'TextFieldAutoSize', 'TextField', 'TextEvent',
+ 'TextDisplayMode', 'TextColorType', 'System', 'SyntaxError',
+ 'SyncEvent', 'StyleSheet', 'String', 'StatusEvent', 'StaticText',
+ 'StageScaleMode', 'StageQuality', 'StageAlign', 'Stage',
+ 'StackOverflowError', 'Sprite', 'SpreadMethod', 'SoundTransform',
+ 'SoundMixer', 'SoundLoaderContext', 'SoundChannel', 'Sound',
+ 'Socket', 'SimpleButton', 'SharedObjectFlushStatus', 'SharedObject',
+ 'Shape', 'SecurityPanel', 'SecurityErrorEvent', 'SecurityError',
+ 'SecurityDomain', 'Security', 'ScriptTimeoutError', 'Scene',
+ 'SWFVersion', 'Responder', 'RegExp', 'ReferenceError', 'Rectangle',
+ 'RangeError', 'QName', 'Proxy', 'ProgressEvent',
+ 'PrintJobOrientation', 'PrintJobOptions', 'PrintJob', 'Point',
+ 'PixelSnapping', 'ObjectEncoding', 'Object', 'Number', 'NetStream',
+ 'NetStatusEvent', 'NetConnection', 'Namespace', 'MovieClip',
+ 'MouseEvent', 'Mouse', 'MorphShape', 'Microphone', 'MemoryError',
+ 'Matrix', 'Math', 'LocalConnection', 'LoaderInfo', 'LoaderContext',
+ 'Loader', 'LineScaleMode', 'KeyboardEvent', 'Keyboard',
+ 'KeyLocation', 'JointStyle', 'InvalidSWFError',
+ 'InterpolationMethod', 'InteractiveObject', 'IllegalOperationError',
+ 'IOErrorEvent', 'IOError', 'IMEEvent', 'IMEConversionMode', 'IME',
+ 'IExternalizable', 'IEventDispatcher', 'IDynamicPropertyWriter',
+ 'IDynamicPropertyOutput', 'IDataOutput', 'IDataInput', 'ID3Info',
+ 'IBitmapDrawable', 'HTTPStatusEvent', 'GridFitType', 'Graphics',
+ 'GradientType', 'GradientGlowFilter', 'GradientBevelFilter',
+ 'GlowFilter', 'Function', 'FrameLabel', 'FontType', 'FontStyle',
+ 'Font', 'FocusEvent', 'FileReferenceList', 'FileReference',
+ 'FileFilter', 'ExternalInterface', 'EventPhase', 'EventDispatcher',
+ 'Event', 'EvalError', 'ErrorEvent', 'Error', 'Endian', 'EOFError',
+ 'DropShadowFilter', 'DisplayObjectContainer', 'DisplayObject',
+ 'DisplacementMapFilterMode', 'DisplacementMapFilter', 'Dictionary',
+ 'DefinitionError', 'Date', 'DataEvent', 'ConvolutionFilter',
+ 'ContextMenuItem', 'ContextMenuEvent', 'ContextMenuBuiltInItems',
+ 'ContextMenu', 'ColorTransform', 'ColorMatrixFilter', 'Class',
+ 'CapsStyle', 'Capabilities', 'Camera', 'CSMSettings', 'ByteArray',
+ 'Boolean', 'BlurFilter', 'BlendMode', 'BitmapFilterType',
+ 'BitmapFilterQuality', 'BitmapFilter', 'BitmapDataChannel',
+ 'BitmapData', 'Bitmap', 'BevelFilter', 'AsyncErrorEvent', 'Array',
+ 'ArgumentError', 'ApplicationDomain', 'AntiAliasType',
+ 'ActivityEvent', 'ActionScriptVersion', 'AccessibilityProperties',
+ 'Accessibility', 'AVM1Movie'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '!', '%', '&', '*', '|', '/', '<', '>', '^', '-', '+', '~', '?', ':', ';', '.', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0033ff; font-weight: bold;',
+ 2 => 'color: #6699cc; font-weight: bold;',
+ 3 => 'color: #339966; font-weight: bold;',
+ 4 => 'color: #9900cc; font-weight: bold;',
+ 5 => 'color: #004993;',
+ 6 => 'color: #004993;',
+ 7 => 'color: #004993;',
+ 8 => 'color: #004993;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #009900; font-style: italic;',
+ 2 => 'color: #009966; font-style: italic;',
+ 'MULTI' => 'color: #3f5fbf;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #990000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000000; font-weight:bold;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #000000;',
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => 'http://www.google.com/search?q={FNAMEL}%20inurl:http://livedocs.adobe.com/flex/201/langref/%20inurl:{FNAMEL}.html',
+ 6 => '',
+ 7 => '',
+ 8 => ''
+ ),
+ 'OOLANG' => false,//Save some time as OO identifiers aren't used
+ 'OBJECT_SPLITTERS' => array(
+ // commented out because it's not very relevant for AS, as all properties, methods and constants are dot-accessed.
+ // I believe it's preferable to have package highlighting for example, which is not possible with this enabled.
+ // 0 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ada.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ada.php
new file mode 100644
index 00000000..c4ef2c39
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ada.php
@@ -0,0 +1,135 @@
+<?php
+/*************************************************************************************
+ * ada.php
+ * -------
+ * Author: Tux (tux@inmail.cz)
+ * Copyright: (c) 2004 Tux (http://tux.a4.cz/), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/07/29
+ *
+ * Ada language file for GeSHi.
+ * Words are from SciTe configuration file
+ *
+ * CHANGES
+ * -------
+ * 2004/11/27 (1.0.2)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.1)
+ * - Removed apostrophe as string delimiter
+ * - Added URL support
+ * 2004/08/05 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Ada',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'begin', 'declare', 'do', 'else', 'elsif', 'exception', 'for', 'if',
+ 'is', 'loop', 'while', 'then', 'end', 'select', 'case', 'until',
+ 'goto', 'return'
+ ),
+ 2 => array(
+ 'abs', 'and', 'at', 'mod', 'not', 'or', 'rem', 'xor'
+ ),
+ 3 => array(
+ 'abort', 'abstract', 'accept', 'access', 'aliased', 'all', 'array',
+ 'body', 'constant', 'delay', 'delta', 'digits', 'entry', 'exit',
+ 'function', 'generic', 'in', 'interface', 'limited', 'new', 'null',
+ 'of', 'others', 'out', 'overriding', 'package', 'pragma', 'private',
+ 'procedure', 'protected', 'raise', 'range', 'record', 'renames',
+ 'requeue', 'reverse', 'separate', 'subtype', 'synchronized',
+ 'tagged', 'task', 'terminate', 'type', 'use', 'when', 'with'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00007f;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #46aa03; font-weight:bold;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/algol68.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/algol68.php
new file mode 100644
index 00000000..5b1e5aa7
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/algol68.php
@@ -0,0 +1,329 @@
+<?php
+/*************************************************************************************
+ * algol68.php
+ * --------
+ * Author: Neville Dempsey (NevilleD.sourceforge@sgr-a.net)
+ * Copyright: (c) 2010 Neville Dempsey (https://sourceforge.net/projects/algol68/files/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/04/24
+ *
+ * ALGOL 68 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/04/24 (1.0.8.8.0)
+ * - First Release - machine generated by http://rosettacode.org/geshi/
+ * 2010/05/24 (1.0.8.8.1)
+ * - #2324 - converted comment detection to RegEx
+ * 2010/06/16 (1.0.8.8.2)
+ * - separate symbols from keywords - quick fix
+ * 2010/06/16 (1.0.8.8.3)
+ * - reverse length order symbols
+ * - Add RegEx for BITS and REAL literals (INT to do)
+ * - recognise LONG and SHORT prefixes to literals
+ * 2010/07/23 (1.0.8.8.4)
+ * - fix errors detected by langcheck.php, eg rm tab, fix indenting, rm duplicate keywords, fix symbols as keywords etc
+ * - removed bulk of local variables from name space.
+ * - unfolded arrays
+ *
+ * TODO (updated yyyy/mm/dd)
+ * -------------------------
+ * - Use "Parser Control" to fix KEYWORD parsing, eg: (INT minus one= -1; print(ABSminus one))
+ * - Parse $FORMATS$ more fully - if possible.
+ * - Pull reserved words from the source of A68G and A68RS
+ * - Pull stdlib PROC/OP/MODE symbols from the soruce of A68G and A68RS
+ * - Pull PROC/OP/MODE extensions from the soruce of A68G and A68RS
+ * - Use RegEx to detect extended precision PROC names, eg 'long long sin' etc
+ * - Use RegEx to detect white space std PROC names, eg 'new line'
+ * - Use RegEx to detect white space ext PROC names, eg 'cgs speed of light'
+ * - Use RegEx to detect BOLD symbols, eg userdefined MODEs and OPs
+ * - Add REgEx for INT literals - Adding INT breaks formatting...
+ * - Adding PIPE as a key word breaks formatting of "|" symbols!!
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+if(!function_exists('geshi_langfile_algol68_vars')) {
+ function geshi_langfile_algol68_vars(){
+ $pre='(?<![0-9a-z_\.])';
+ $post='?(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)';
+ $post=""; # assuming the RegEx is greedy #
+
+ $_="\s*";
+
+ $srad="Rr"; $rrad="[".$srad."]"; # either one digit, OR opt-space in digits #
+ $sbin="0-1"; $rbin="[".$sbin."]"; $_bin=$rbin."(?:[".$sbin."\s]*".$rbin."|)";
+ $snib="0-3"; $rnib="[".$snib."]"; $_nib=$rnib."(?:[".$snib."\s]*".$rnib."|)";
+ $soct="0-7"; $roct="[".$soct."]"; $_oct=$roct."(?:[".$soct."\s]*".$roct."|)";
+ $sdec="0-9"; $rdec="[".$sdec."]"; $_dec=$rdec."(?:[".$sdec."\s]*".$rdec."|)";
+ $shex="0-9A-Fa-f"; $rhex="[".$shex."]"; $_hex=$rhex."(?:[".$shex."\s]*".$rhex."|)";
+
+ # Define BITS: #
+ $prebits=$pre; $postbits=$post;
+ $bl="2".$_.$rrad.$_.$_bin;
+ $bl=$bl."|"."2".$_.$rrad.$_.$_bin;
+ $bl=$bl."|"."4".$_.$rrad.$_.$_nib;
+ $bl=$bl."|"."8".$_.$rrad.$_.$_oct;
+ $bl=$bl."|"."1".$_."0".$_.$rrad.$_.$_dec;
+ $bl=$bl."|"."1".$_."6".$_.$rrad.$_.$_hex;
+
+ # Define INT: #
+ $preint=$pre; $postint=$post;
+ # for some reason ".0 e - 2" is not recognised, but ".0 e + 2" IS!
+ # work around: remove spaces between sign and digits! Maybe because
+ # of the Unary '-' Operator
+ $sign_="(?:-|\-|[-]|[\-]|\+|)"; # attempts #
+
+ $sign_="(?:-\s*|\+\s*|)"; # n.b. sign is followed by white space #
+
+ $_int=$sign_.$_dec;
+ $il= $_int; # +_9 #
+
+ $GESHI_NUMBER_INT_BASIC='(?:(?<![0-9a-z_\.%])|(?<=\.\.))(?<![\d\.]e[+\-])([1-9]\d*?|0)(?![0-9a-z]|\.(?:[eE][+\-]?)?\d)';
+
+ # Define REAL: #
+ $prereal=$pre; $postreal=$post;
+ $sexp="Ee\\\\"; $_exp="(?:â¨|[".$sexp."])".$_.$_int;
+ $_decimal="[.]".$_.$_dec;
+
+ # Add permitted permutations of various parts #
+ $rl= $_int.$_.$_decimal.$_.$_exp; # +_9_._9_e_+_9 #
+ $rl=$rl."|".$_int.$_."[.]".$_.$_exp; # +_9_.___e_+_9 #
+ $rl=$rl."|".$_int.$_.$_exp; # +_9_____e_+_9 #
+ $rl=$rl."|".$sign_.$_decimal.$_.$_exp; # +___._9_e_+_9 #
+
+ $rl=$rl."|".$_int.$_.$_decimal; # +_9_._9 #
+ $rl=$rl."|".$sign_.$_decimal; # +___._9 #
+
+ # The following line damaged formatting...
+ #$rl=$rl."|".$_int; # +_9 #
+
+ # Apparently Algol68 does not support '2.', c.f. Algol 68G
+ #$rl=$rl."|".$_int.$_."[.]"; # +_9_. #
+
+ # Literal prefixes are overridden by KEYWORDS :-(
+ $LONGS="(?:(?:(LONG\s+)*|(SHORT\s+))*|)";
+
+ return array(
+ "BITS" => $prebits.$LONGS."(?:".$bl.")".$postbits,
+ "INT" => $preint.$LONGS."(?:".$il.")".$postint,
+ "REAL" => $prereal.$LONGS."(?:".$rl.")".$postreal,
+
+ "BOLD" => 'color: #b1b100; font-weight: bold;',
+ "ITALIC" => 'color: #b1b100;', # procedures traditionally italic #
+ "NONSTD" => 'color: #FF0000; font-weight: bold;', # RED #
+ "COMMENT" => 'color: #666666; font-style: italic;'
+ );
+ }
+}
+$a68=geshi_langfile_algol68_vars();
+
+$language_data = array(
+ 'LANG_NAME' => 'ALGOL 68',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(
+ '¢' => '¢',
+ '£' => '£',
+ '#' => '#',
+ ),
+ 'COMMENT_REGEXP' => array(
+ 1 => '/\bCO((?:MMENT)?)\b.*?\bCO\\1\b/i',
+ 2 => '/\bPR((?:AGMAT)?)\b.*?\bPR\\1\b/i',
+ 3 => '/\bQUOTE\b.*?\bQUOTE\b/i'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '"',
+ 'NUMBERS' => GESHI_NUMBER_HEX_SUFFIX, # Warning: Feature!! #
+# GESHI_NUMBER_HEX_SUFFIX, # Attempt ignore default #
+ 'KEYWORDS' => array(
+# Extensions
+ 1 => array('KEEP', 'FINISH', 'USE', 'SYSPROCS', 'IOSTATE', 'USING', 'ENVIRON', 'PROGRAM', 'CONTEXT'),
+# 2 => array('CASE', 'IN', 'OUSE', 'IN', 'OUT', 'ESAC', '(', '|', '|:', ')', 'FOR', 'FROM', 'TO', 'BY', 'WHILE', 'DO', 'OD', 'IF', 'THEN', 'ELIF', 'THEN', 'ELSE', 'FI', 'PAR', 'BEGIN', 'EXIT', 'END', 'GO', 'GOTO', 'FORALL', 'UPTO', 'DOWNTO', 'FOREACH', 'ASSERT'), #
+ 2 => array('CASE', 'IN', 'OUSE', /* 'IN',*/ 'OUT', 'ESAC', 'PAR', 'BEGIN', 'EXIT', 'END', 'GO TO', 'GOTO', 'FOR', 'FROM', 'TO', 'BY', 'WHILE', 'DO', 'OD', 'IF', 'THEN', 'ELIF', /* 'THEN',*/ 'ELSE', 'FI' ),
+ 3 => array('BITS', 'BOOL', 'BYTES', 'CHAR', 'COMPL', 'INT', 'REAL', 'SEMA', 'STRING', 'VOID'),
+ 4 => array('MODE', 'OP', 'PRIO', 'PROC', 'FLEX', 'HEAP', 'LOC', 'REF', 'LONG', 'SHORT', 'EITHER'),
+# Extensions or deprecated keywords
+# 'PIPE': keyword somehow interferes with the internal operation of GeSHi
+ 5 => array('FORALL', 'UPTO', 'DOWNTO', 'FOREACH', 'ASSERT', 'CTB', 'CT', 'CTAB', 'COMPLEX', 'VECTOR', 'SOUND' /*, 'PIPE'*/),
+ 6 => array('CHANNEL', 'FILE', 'FORMAT', 'STRUCT', 'UNION', 'OF'),
+# '(', '|', '|:', ')', #
+# 7 => array('OF', 'AT', '@', 'IS', ':=:', 'ISNT', ':/=:', ':≠:', 'CTB', 'CT', '::', 'CTAB', '::=', 'TRUE', 'FALSE', 'EMPTY', 'NIL', '○', 'SKIP', '~'),
+ 7 => array('AT', 'IS', 'ISNT', 'TRUE', 'FALSE', 'EMPTY', 'NIL', 'SKIP'),
+ 8 => array('NOT', 'UP', 'DOWN', 'LWB', 'UPB', /* '-',*/ 'ABS', 'ARG', 'BIN', 'ENTIER', 'LENG', 'LEVEL', 'ODD', 'REPR', 'ROUND', 'SHORTEN', 'CONJ', 'SIGN'),
+# OPERATORS ordered roughtly by PRIORITY #
+# 9 => array('¬', '↑', '↓', '⌊', '⌈', '~', '⎩', '⎧'),
+# 10 => array('+*', 'I', '+×', '⊥', '!', 'â¨'),
+ 10 => array('I'),
+# 11 => array('SHL', 'SHR', '**', 'UP', 'DOWN', 'LWB', 'UPB', '↑', '↓', '⌊', '⌈', '⎩', '⎧'),
+ 11 => array('SHL', 'SHR', /*'UP', 'DOWN', 'LWB', 'UPB'*/),
+# 12 => array('*', '/', '%', 'OVER', '%*', 'MOD', 'ELEM', '×', '÷', '÷×', '÷*', '%×', '□', '÷:'),
+ 12 => array('OVER', 'MOD', 'ELEM'),
+# 13 => array('-', '+'),
+# 14 => array('<', 'LT', '<=', 'LE', '>=', 'GE', '>', 'GT', '≤', '≥'),
+ 14 => array('LT', 'LE', 'GE', 'GT'),
+# 15 => array('=', 'EQ', '/=', 'NE', '≠', '~='),
+ 15 => array('EQ', 'NE'),
+# 16 => array('&', 'AND', '∧', 'OR', '∨', '/\\', '\\/'),
+ 16 => array('AND', 'OR'),
+ 17 => array('MINUSAB', 'PLUSAB', 'TIMESAB', 'DIVAB', 'OVERAB', 'MODAB', 'PLUSTO'),
+# 18 => array('-:=', '+:=', '*:=', '/:=', '%:=', '%*:=', '+=:', '×:=', '÷:=', '÷×:=', '÷*:=', '%×:=', '÷::=', 'MINUS', 'PLUS', 'DIV', 'MOD', 'PRUS'),
+# Extensions or deprecated keywords
+ 18 => array('MINUS', 'PLUS', 'DIV', /* 'MOD',*/ 'PRUS', 'IS NOT'),
+# Extensions or deprecated keywords
+ 19 => array('THEF', 'ANDF', 'ORF', 'ANDTH', 'OREL', 'ANDTHEN', 'ORELSE'),
+# Built in procedures - from standard prelude #
+ 20 => array('int lengths', 'intlengths', 'int shorths', 'intshorths', 'max int', 'maxint', 'real lengths', 'reallengths', 'real shorths', 'realshorths', 'bits lengths', 'bitslengths', 'bits shorths', 'bitsshorths', 'bytes lengths', 'byteslengths', 'bytes shorths', 'bytesshorths', 'max abs char', 'maxabschar', 'int width', 'intwidth', 'long int width', 'longintwidth', 'long long int width', 'longlongintwidth', 'real width', 'realwidth', 'long real width', 'longrealwidth', 'long long real width', 'longlongrealwidth', 'exp width', 'expwidth', 'long exp width', 'longexpwidth', 'long long exp width', 'longlongexpwidth', 'bits width', 'bitswidth', 'long bits width', 'longbitswidth', 'long long bits width', 'longlongbitswidth', 'bytes width', 'byteswidth', 'long bytes width', 'longbyteswidth', 'max real', 'maxreal', 'small real', 'smallreal', 'long max int', 'longmaxint', 'long long max int', 'longlongmaxint', 'long max real', 'longmaxreal', 'long small real', 'longsmallreal', 'long long max real', 'longlongmaxreal', 'long long small real', 'longlongsmallreal', 'long max bits', 'longmaxbits', 'long long max bits', 'longlongmaxbits', 'null character', 'nullcharacter', 'blank', 'flip', 'flop', 'error char', 'errorchar', 'exp char', 'expchar', 'newline char', 'newlinechar', 'formfeed char', 'formfeedchar', 'tab char', 'tabchar'),
+ 21 => array('stand in channel', 'standinchannel', 'stand out channel', 'standoutchannel', 'stand back channel', 'standbackchannel', 'stand draw channel', 'standdrawchannel', 'stand error channel', 'standerrorchannel'),
+ 22 => array('put possible', 'putpossible', 'get possible', 'getpossible', 'bin possible', 'binpossible', 'set possible', 'setpossible', 'reset possible', 'resetpossible', 'reidf possible', 'reidfpossible', 'draw possible', 'drawpossible', 'compressible', 'on logical file end', 'onlogicalfileend', 'on physical file end', 'onphysicalfileend', 'on line end', 'onlineend', 'on page end', 'onpageend', 'on format end', 'onformatend', 'on value error', 'onvalueerror', 'on open error', 'onopenerror', 'on transput error', 'ontransputerror', 'on format error', 'onformaterror', 'open', 'establish', 'create', 'associate', 'close', 'lock', 'scratch', 'space', 'new line', 'newline', 'print', 'write f', 'writef', 'print f', 'printf', 'write bin', 'writebin', 'print bin', 'printbin', 'read f', 'readf', 'read bin', 'readbin', 'put f', 'putf', 'get f', 'getf', 'make term', 'maketerm', 'make device', 'makedevice', 'idf', 'term', 'read int', 'readint', 'read long int', 'readlongint', 'read long long int', 'readlonglongint', 'read real', 'readreal', 'read long real', 'readlongreal', 'read long long real', 'readlonglongreal', 'read complex', 'readcomplex', 'read long complex', 'readlongcomplex', 'read long long complex', 'readlonglongcomplex', 'read bool', 'readbool', 'read bits', 'readbits', 'read long bits', 'readlongbits', 'read long long bits', 'readlonglongbits', 'read char', 'readchar', 'read string', 'readstring', 'print int', 'printint', 'print long int', 'printlongint', 'print long long int', 'printlonglongint', 'print real', 'printreal', 'print long real', 'printlongreal', 'print long long real', 'printlonglongreal', 'print complex', 'printcomplex', 'print long complex', 'printlongcomplex', 'print long long complex', 'printlonglongcomplex', 'print bool', 'printbool', 'print bits', 'printbits', 'print long bits', 'printlongbits', 'print long long bits', 'printlonglongbits', 'print char', 'printchar', 'print string', 'printstring', 'whole', 'fixed', 'float'),
+ 23 => array('pi', 'long pi', 'longpi', 'long long pi', 'longlongpi'),
+ 24 => array('sqrt', 'curt', 'cbrt', 'exp', 'ln', 'log', 'sin', 'arc sin', 'arcsin', 'cos', 'arc cos', 'arccos', 'tan', 'arc tan', 'arctan', 'long sqrt', 'longsqrt', 'long curt', 'longcurt', 'long cbrt', 'longcbrt', 'long exp', 'longexp', 'long ln', 'longln', 'long log', 'longlog', 'long sin', 'longsin', 'long arc sin', 'longarcsin', 'long cos', 'longcos', 'long arc cos', 'longarccos', 'long tan', 'longtan', 'long arc tan', 'longarctan', 'long long sqrt', 'longlongsqrt', 'long long curt', 'longlongcurt', 'long long cbrt', 'longlongcbrt', 'long long exp', 'longlongexp', 'long long ln', 'longlongln', 'long long log', 'longlonglog', 'long long sin', 'longlongsin', 'long long arc sin', 'longlongarcsin', 'long long cos', 'longlongcos', 'long long arc cos', 'longlongarccos', 'long long tan', 'longlongtan', 'long long arc tan', 'longlongarctan'),
+ 25 => array('first random', 'firstrandom', 'next random', 'nextrandom', 'long next random', 'longnextrandom', 'long long next random', 'longlongnextrandom'),
+ 26 => array('real', 'bits pack', 'bitspack', 'long bits pack', 'longbitspack', 'long long bits pack', 'longlongbitspack', 'bytes pack', 'bytespack', 'long bytes pack', 'longbytespack', 'char in string', 'charinstring', 'last char in string', 'lastcharinstring', 'string in string', 'stringinstring'),
+ 27 => array('utc time', 'utctime', 'local time', 'localtime', 'argc', 'argv', 'get env', 'getenv', 'reset errno', 'reseterrno', 'errno', 'strerror'),
+ 28 => array('sinh', 'long sinh', 'longsinh', 'long long sinh', 'longlongsinh', 'arc sinh', 'arcsinh', 'long arc sinh', 'longarcsinh', 'long long arc sinh', 'longlongarcsinh', 'cosh', 'long cosh', 'longcosh', 'long long cosh', 'longlongcosh', 'arc cosh', 'arccosh', 'long arc cosh', 'longarccosh', 'long long arc cosh', 'longlongarccosh', 'tanh', 'long tanh', 'longtanh', 'long long tanh', 'longlongtanh', 'arc tanh', 'arctanh', 'long arc tanh', 'longarctanh', 'long long arc tanh', 'longlongarctanh', 'arc tan2', 'arctan2', 'long arc tan2', 'longarctan2', 'long long arc tan2', 'longlongarctan2'),
+ 29 => array('complex sqrt', 'complexsqrt', 'long complex sqrt', 'longcomplexsqrt', 'long long complex sqrt', 'longlongcomplexsqrt', 'complex exp', 'complexexp', 'long complex exp', 'longcomplexexp', 'long long complex exp', 'longlongcomplexexp', 'complex ln', 'complexln', 'long complex ln', 'longcomplexln', 'long long complex ln', 'longlongcomplexln', 'complex sin', 'complexsin', 'long complex sin', 'longcomplexsin', 'long long complex sin', 'longlongcomplexsin', 'complex arc sin', 'complexarcsin', 'long complex arc sin', 'longcomplexarcsin', 'long long complex arc sin', 'longlongcomplexarcsin', 'complex cos', 'complexcos', 'long complex cos', 'longcomplexcos', 'long long complex cos', 'longlongcomplexcos', 'complex arc cos', 'complexarccos', 'long complex arc cos', 'longcomplexarccos', 'long long complex arc cos', 'longlongcomplexarccos', 'complex tan', 'complextan', 'long complex tan', 'longcomplextan', 'long long complex tan', 'longlongcomplextan', 'complex arc tan', 'complexarctan', 'long complex arc tan', 'longcomplexarctan', 'long long complex arc tan', 'longlongcomplexarctan', 'complex sinh', 'complexsinh', 'complex arc sinh', 'complexarcsinh', 'complex cosh', 'complexcosh', 'complex arc cosh', 'complexarccosh', 'complex tanh', 'complextanh', 'complex arc tanh', 'complexarctanh')
+ ),
+ 'SYMBOLS' => array(
+ 1 => array( /* reverse length sorted... */ '÷×:=', '%×:=', ':≠:', '÷*:=', '÷::=', '%*:=', ':/=:', '×:=', '÷:=', '÷×', '%:=', '%×', '*:=', '+:=', '+=:', '+×', '-:=', '/:=', '::=', ':=:', '÷*', '÷:', '↑', '↓', '∧', '∨', '≠', '≤', '≥', '⊥', '⌈', '⌊', '⎧', '⎩', /* 'â¨', */ 'â–¡', 'â—‹', '%*', '**', '+*', '/=', '::', '/\\', '\\/', '<=', '>=', '|:', '~=', '¬', '×', '÷', '!', '%', '&', '(', ')', '*', '+', ',', '-', '/', ':', ';', '<', '=', '>', '?', '@', '[', ']', '^', '{', '|', '}', '~')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+# 9 => true,
+ 10 => true,
+ 11 => true,
+ 12 => true,
+# 13 => true,
+ 14 => true,
+ 15 => true,
+ 16 => true,
+ 17 => true,
+ 18 => true,
+ 19 => true,
+ 20 => true,
+ 21 => true,
+ 22 => true,
+ 23 => true,
+ 24 => true,
+ 25 => true,
+ 26 => true,
+ 27 => true,
+ 28 => true,
+ 29 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => $a68['NONSTD'], 2 => $a68['BOLD'], 3 => $a68['BOLD'], 4 => $a68['BOLD'],
+ 5 => $a68['NONSTD'], 6 => $a68['BOLD'], 7 => $a68['BOLD'], 8 => $a68['BOLD'],
+ /* 9 => $a68['BOLD'],*/ 10 => $a68['BOLD'], 11 => $a68['BOLD'], 12 => $a68['BOLD'],
+ /* 13 => $a68['BOLD'],*/ 14 => $a68['BOLD'], 15 => $a68['BOLD'], 16 => $a68['BOLD'], 17 => $a68['BOLD'],
+ 18 => $a68['NONSTD'], 19 => $a68['NONSTD'],
+ 20 => $a68['ITALIC'], 21 => $a68['ITALIC'], 22 => $a68['ITALIC'], 23 => $a68['ITALIC'],
+ 24 => $a68['ITALIC'], 25 => $a68['ITALIC'], 26 => $a68['ITALIC'], 27 => $a68['ITALIC'],
+ 28 => $a68['ITALIC'], 29 => $a68['ITALIC']
+ ),
+ 'COMMENTS' => array(
+ 1 => $a68['COMMENT'], 2 => $a68['COMMENT'], 3 => $a68['COMMENT'], /* 4 => $a68['COMMENT'],
+ 5 => $a68['COMMENT'],*/ 'MULTI' => $a68['COMMENT']
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;',
+ 1 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;',
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #cc66cc;', # BITS #
+ 1 => 'color: #cc66cc;', # REAL #
+ /* 2 => 'color: #cc66cc;', # INT # */
+ ),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+# 9 => '',
+ 10 => '',
+ 11 => '',
+ 12 => '',
+# 13 => '',
+ 14 => '',
+ 15 => '',
+ 16 => '',
+ 17 => '',
+ 18 => '',
+ 19 => '',
+ 20 => '',
+ 21 => '',
+ 22 => '',
+ 23 => '',
+ 24 => '',
+ 25 => '',
+ 26 => '',
+ 27 => '',
+ 28 => '',
+ 29 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 0 => '→',
+ 1 => 'OF'
+ ),
+ 'REGEXPS' => array(
+ 0 => $a68['BITS'],
+ 1 => $a68['REAL']
+ # 2 => $a68['INT'], # Breaks formatting for some reason #
+ # 2 => $GESHI_NUMBER_INT_BASIC # Also breaks formatting #
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+unset($a68);
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/apache.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/apache.php
new file mode 100644
index 00000000..c944443c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/apache.php
@@ -0,0 +1,483 @@
+<?php
+/*************************************************************************************
+ * apache.php
+ * ----------
+ * Author: Tux (tux@inmail.cz)
+ * Copyright: (c) 2004 Tux (http://tux.a4.cz/), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/29/07
+ *
+ * Apache language file for GeSHi.
+ * Words are from SciTe configuration file
+ *
+ * CHANGES
+ * -------
+ * 2008/17/06 (1.0.8)
+ * - Added support for apache configuration sections (milian)
+ * - Added missing php keywords (milian)
+ * - Added some more keywords
+ * - Disabled highlighting of brackets by default
+ * 2004/11/27 (1.0.2)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.1)
+ * - Added support for URLs
+ * 2004/08/05 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/07/29)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Apache configuration',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ /*keywords*/
+ 1 => array(
+ //core.c
+ 'AcceptFilter','AcceptPathInfo','AccessConfig','AccessFileName',
+ 'AddDefaultCharset','AddOutputFilterByType','AllowEncodedSlashes',
+ 'AllowOverride','AuthName','AuthType','ContentDigest',
+ 'CoreDumpDirectory','DefaultType','DocumentRoot','EnableMMAP',
+ 'EnableSendfile','ErrorDocument','ErrorLog','FileETag','ForceType',
+ 'HostnameLookups','Include','LimitInternalRecursion',
+ 'LimitRequestBody','LimitRequestFields','LimitRequestFieldsize',
+ 'LimitRequestLine','LimitXMLRequestBody','LogLevel','MaxMemFree',
+ 'MaxRequestsPerChild','NameVirtualHost','Options','PidFile','Port',
+ 'Protocol','Require','RLimitCPU','RLimitMEM','RLimitNPROC',
+ 'Satisfy','ScoreBoardFile','ServerAdmin','ServerAlias','ServerName',
+ 'ServerPath','ServerRoot','ServerSignature','ServerTokens',
+ 'SetHandler','SetInputFilter','SetOutputFilter','ThreadStackSize',
+ 'Timeout','TraceEnable','UseCanonicalName',
+ 'UseCanonicalPhysicalPort',
+
+ //http_core.c
+ 'KeepAlive','KeepAliveTimeout','MaxKeepAliveRequests',
+
+ //mod_actions.c
+ 'Action','Script',
+
+ //mod_alias.c
+ 'Alias','AliasMatch','Redirect','RedirectMatch','RedirectPermanent',
+ 'RedirectTemp','ScriptAlias','ScriptAliasMatch',
+
+ //mod_asis.c
+
+ //mod_auth_basic.c
+ 'AuthBasicAuthoritative','AuthBasicProvider',
+
+ //mod_auth_digest.c
+ 'AuthDigestAlgorithm','AuthDigestDomain','AuthDigestNcCheck',
+ 'AuthDigestNonceFormat','AuthDigestNonceLifetime',
+ 'AuthDigestProvider','AuthDigestQop','AuthDigestShmemSize',
+
+ //mod_authn_alias.c
+
+ //mod_authn_anon.c
+ 'Anonymous','Anonymous_LogEmail','Anonymous_MustGiveEmail',
+ 'Anonymous_NoUserId','Anonymous_VerifyEmail',
+
+ //mod_authn_dbd.c
+ 'AuthDBDUserPWQuery','AuthDBDUserRealmQuery',
+
+ //mod_authn_dbm.c
+ 'AuthDBMType','AuthDBMUserFile',
+
+ //mod_authn_default.c
+ 'AuthDefaultAuthoritative',
+
+ //mod_authn_file.c
+ 'AuthUserFile',
+
+ //mod_authnz_ldap.c
+ 'AuthLDAPBindDN','AuthLDAPBindPassword','AuthLDAPCharsetConfig',
+ 'AuthLDAPCompareDNOnServer','AuthLDAPDereferenceAliases',
+ 'AuthLDAPGroupAttribute','AuthLDAPGroupAttributeIsDN',
+ 'AuthLDAPRemoteUserAttribute','AuthLDAPRemoteUserIsDN',
+ 'AuthLDAPURL','AuthzLDAPAuthoritative',
+
+ //mod_authz_dbm.c
+ 'AuthDBMGroupFile','AuthzDBMAuthoritative','AuthzDBMType',
+
+ //mod_authz_default.c
+ 'AuthzDefaultAuthoritative',
+
+ //mod_authz_groupfile.c
+ 'AuthGroupFile','AuthzGroupFileAuthoritative',
+
+ //mod_authz_host.c
+ 'Allow','Deny','Order',
+
+ //mod_authz_owner.c
+ 'AuthzOwnerAuthoritative',
+
+ //mod_authz_svn.c
+ 'AuthzForceUsernameCase','AuthzSVNAccessFile','AuthzSVNAnonymous',
+ 'AuthzSVNAuthoritative','AuthzSVNNoAuthWhenAnonymousAllowed',
+
+ //mod_authz_user.c
+ 'AuthzUserAuthoritative',
+
+ //mod_autoindex.c
+ 'AddAlt','AddAltByEncoding','AddAltByType','AddDescription',
+ 'AddIcon','AddIconByEncoding','AddIconByType','DefaultIcon',
+ 'FancyIndexing','HeaderName','IndexHeadInsert','IndexIgnore',
+ 'IndexOptions','IndexOrderDefault','IndexStyleSheet','ReadmeName',
+
+ //mod_bt.c
+ 'Tracker','TrackerDetailURL','TrackerFlags','TrackerHashMaxAge',
+ 'TrackerHashMinAge','TrackerHashWatermark','TrackerHome',
+ 'TrackerReturnInterval','TrackerReturnMax',
+ 'TrackerReturnPeerFactor','TrackerReturnPeers','TrackerRootInclude',
+ 'TrackerStyleSheet',
+
+ //mod_bw.c
+ 'BandWidth','BandWidthError','BandWidthModule','BandWidthPacket',
+ 'ForceBandWidthModule','LargeFileLimit','MaxConnection',
+ 'MinBandWidth',
+
+ //mod_cache.c
+ 'CacheDefaultExpire','CacheDisable','CacheEnable',
+ 'CacheIgnoreCacheControl','CacheIgnoreHeaders',
+ 'CacheIgnoreNoLastMod','CacheIgnoreQueryString',
+ 'CacheLastModifiedFactor','CacheMaxExpire','CacheStoreNoStore',
+ 'CacheStorePrivate',
+
+ //mod_cern_meta.c
+ 'MetaDir','MetaFiles','MetaSuffix',
+
+ //mod_cgi.c
+ 'ScriptLog','ScriptLogBuffer','ScriptLogLength',
+
+ //mod_charset_lite.c
+ 'CharsetDefault','CharsetOptions','CharsetSourceEnc',
+
+ //mod_dav.c
+ 'DAV','DAVDepthInfinity','DAVMinTimeout',
+
+ //mod_dav_fs.c
+ 'DAVLockDB',
+
+ //mod_dav_lock.c
+ 'DAVGenericLockDB',
+
+ //mod_dav_svn.c
+ 'SVNActivitiesDB','SVNAllowBulkUpdates','SVNAutoversioning',
+ 'SVNIndexXSLT','SVNListParentPath','SVNMasterURI','SVNParentPath',
+ 'SVNPath','SVNPathAuthz','SVNReposName','SVNSpecialURI',
+
+ //mod_dbd.c
+ 'DBDExptime','DBDKeep','DBDMax','DBDMin','DBDParams','DBDPersist',
+ 'DBDPrepareSQL','DBDriver',
+
+ //mod_deflate.c
+ 'DeflateBufferSize','DeflateCompressionLevel','DeflateFilterNote',
+ 'DeflateMemLevel','DeflateWindowSize',
+
+ //mod_dir.c
+ 'DirectoryIndex','DirectorySlash',
+
+ //mod_disk_cache.c
+ 'CacheDirLength','CacheDirLevels','CacheMaxFileSize',
+ 'CacheMinFileSize','CacheRoot',
+
+ //mod_dumpio.c
+ 'DumpIOInput','DumpIOLogLevel','DumpIOOutput',
+
+ //mod_env.c
+ 'PassEnv','SetEnv','UnsetEnv',
+
+ //mod_expires.c
+ 'ExpiresActive','ExpiresByType','ExpiresDefault',
+
+ //mod_ext_filter.c
+ 'ExtFilterDefine','ExtFilterOptions',
+
+ //mod_file_cache.c
+ 'cachefile','mmapfile',
+
+ //mod_filter.c
+ 'FilterChain','FilterDeclare','FilterProtocol','FilterProvider',
+ 'FilterTrace',
+
+ //mod_gnutls.c
+ 'GnuTLSCache','GnuTLSCacheTimeout','GnuTLSCertificateFile',
+ 'GnuTLSKeyFile','GnuTLSPGPCertificateFile','GnuTLSPGPKeyFile',
+ 'GnuTLSClientVerify','GnuTLSClientCAFile','GnuTLSPGPKeyringFile',
+ 'GnuTLSEnable','GnuTLSDHFile','GnuTLSRSAFile','GnuTLSSRPPasswdFile',
+ 'GnuTLSSRPPasswdConfFile','GnuTLSPriorities',
+ 'GnuTLSExportCertificates',
+
+ //mod_headers.c
+ 'Header','RequestHeader',
+
+ //mod_imagemap.c
+ 'ImapBase','ImapDefault','ImapMenu',
+
+ //mod_include.c
+ 'SSIAccessEnable','SSIEndTag','SSIErrorMsg','SSIStartTag',
+ 'SSITimeFormat','SSIUndefinedEcho','XBitHack',
+
+ //mod_ident.c
+ 'IdentityCheck','IdentityCheckTimeout',
+
+ //mod_info.c
+ 'AddModuleInfo',
+
+ //mod_isapi.c
+ 'ISAPIAppendLogToErrors','ISAPIAppendLogToQuery','ISAPICacheFile',
+ 'ISAPIFakeAsync','ISAPILogNotSupported','ISAPIReadAheadBuffer',
+
+ //mod_log_config.c
+ 'BufferedLogs','CookieLog','CustomLog','LogFormat','TransferLog',
+
+ //mod_log_forensic.c
+ 'ForensicLog',
+
+ //mod_log_rotate.c
+ 'RotateInterval','RotateLogs','RotateLogsLocalTime',
+
+ //mod_logio.c
+
+ //mod_mem_cache.c
+ 'MCacheMaxObjectCount','MCacheMaxObjectSize',
+ 'MCacheMaxStreamingBuffer','MCacheMinObjectSize',
+ 'MCacheRemovalAlgorithm','MCacheSize',
+
+ //mod_mime.c
+ 'AddCharset','AddEncoding','AddHandler','AddInputFilter',
+ 'AddLanguage','AddOutputFilter','AddType','DefaultLanguage',
+ 'ModMimeUsePathInfo','MultiviewsMatch','RemoveCharset',
+ 'RemoveEncoding','RemoveHandler','RemoveInputFilter',
+ 'RemoveLanguage','RemoveOutputFilter','RemoveType','TypesConfig',
+
+ //mod_mime_magic.c
+ 'MimeMagicFile',
+
+ //mod_negotiation.c
+ 'CacheNegotiatedDocs','ForceLanguagePriority','LanguagePriority',
+
+ //mod_php5.c
+ 'php_admin_flag','php_admin_value','php_flag','php_value',
+ 'PHPINIDir',
+
+ //mod_proxy.c
+ 'AllowCONNECT','BalancerMember','NoProxy','ProxyBadHeader',
+ 'ProxyBlock','ProxyDomain','ProxyErrorOverride',
+ 'ProxyFtpDirCharset','ProxyIOBufferSize','ProxyMaxForwards',
+ 'ProxyPass','ProxyPassInterpolateEnv','ProxyPassMatch',
+ 'ProxyPassReverse','ProxyPassReverseCookieDomain',
+ 'ProxyPassReverseCookiePath','ProxyPreserveHost',
+ 'ProxyReceiveBufferSize','ProxyRemote','ProxyRemoteMatch',
+ 'ProxyRequests','ProxySet','ProxyStatus','ProxyTimeout','ProxyVia',
+
+ //mod_proxy_ajp.c
+
+ //mod_proxy_balancer.c
+
+ //mod_proxy_connect.c
+
+ //mod_proxy_ftp.c
+
+ //mod_proxy_http.c
+
+ //mod_rewrite.c
+ 'RewriteBase','RewriteCond','RewriteEngine','RewriteLock',
+ 'RewriteLog','RewriteLogLevel','RewriteMap','RewriteOptions',
+ 'RewriteRule',
+
+ //mod_setenvif.c
+ 'BrowserMatch','BrowserMatchNoCase','SetEnvIf','SetEnvIfNoCase',
+
+ //mod_so.c
+ 'LoadFile','LoadModule',
+
+ //mod_speling.c
+ 'CheckCaseOnly','CheckSpelling',
+
+ //mod_ssl.c
+ 'SSLCACertificateFile','SSLCACertificatePath','SSLCADNRequestFile',
+ 'SSLCADNRequestPath','SSLCARevocationFile','SSLCARevocationPath',
+ 'SSLCertificateChainFile','SSLCertificateFile',
+ 'SSLCertificateKeyFile','SSLCipherSuite','SSLCryptoDevice',
+ 'SSLEngine','SSLHonorCipherOrder','SSLMutex','SSLOptions',
+ 'SSLPassPhraseDialog','SSLProtocol','SSLProxyCACertificateFile',
+ 'SSLProxyCACertificatePath','SSLProxyCARevocationFile',
+ 'SSLProxyCARevocationPath','SSLProxyCipherSuite','SSLProxyEngine',
+ 'SSLProxyMachineCertificateFile','SSLProxyMachineCertificatePath',
+ 'SSLProxyProtocol','SSLProxyVerify','SSLProxyVerifyDepth',
+ 'SSLRandomSeed','SSLRenegBufferSize','SSLRequire','SSLRequireSSL',
+ 'SSLSessionCache','SSLSessionCacheTimeout','SSLUserName',
+ 'SSLVerifyClient','SSLVerifyDepth',
+
+ //mod_status.c
+ 'ExtendedStatus','SeeRequestTail',
+
+ //mod_substitute.c
+ 'Substitute',
+
+ //mod_suexec.c
+ 'SuexecUserGroup',
+
+ //mod_unique_id.c
+
+ //mod_upload_progress
+ 'ReportUploads', 'TrackUploads', 'UploadProgressSharedMemorySize',
+
+ //mod_userdir.c
+ 'UserDir',
+
+ //mod_usertrack.c
+ 'CookieDomain','CookieExpires','CookieName','CookieStyle',
+ 'CookieTracking',
+
+ //mod_version.c
+
+ //mod_vhost_alias.c
+ 'VirtualDocumentRoot','VirtualDocumentRootIP',
+ 'VirtualScriptAlias','VirtualScriptAliasIP',
+
+ //mod_view.c
+ 'ViewEnable',
+
+ //mod_win32.c
+ 'ScriptInterpreterSource',
+
+ //mpm_winnt.c
+ 'Listen','ListenBacklog','ReceiveBufferSize','SendBufferSize',
+ 'ThreadLimit','ThreadsPerChild','Win32DisableAcceptEx',
+
+ //mpm_common.c
+ 'AcceptMutex','AddModule','ClearModuleList','EnableExceptionHook',
+ 'Group','LockFile','MaxClients','MaxSpareServers','MaxSpareThreads',
+ 'MinSpareServers','MinSpareThreads','ServerLimit','StartServers',
+ 'StartThreads','User',
+
+ //util_ldap.c
+ 'LDAPCacheEntries','LDAPCacheTTL','LDAPConnectionTimeout',
+ 'LDAPOpCacheEntries','LDAPOpCacheTTL','LDAPSharedCacheFile',
+ 'LDAPSharedCacheSize','LDAPTrustedClientCert',
+ 'LDAPTrustedGlobalCert','LDAPTrustedMode','LDAPVerifyServerCert',
+
+ //Unknown Mods ...
+ 'AgentLog','BindAddress','bs2000account','CacheForceCompletion',
+ 'CacheGCInterval','CacheSize','NoCache','qsc','RefererIgnore',
+ 'RefererLog','Resourceconfig','ServerType','SingleListen'
+ ),
+ /*keywords 2*/
+ 2 => array(
+ 'all','on','off','standalone','inetd','indexes',
+ 'force-response-1.0','downgrade-1.0','nokeepalive',
+ 'includes','followsymlinks','none',
+ 'x-compress','x-gzip'
+ ),
+ /*keywords 3*/
+ 3 => array(
+ //core.c
+ 'Directory','DirectoryMatch','Files','FilesMatch','IfDefine',
+ 'IfModule','Limit','LimitExcept','Location','LocationMatch',
+ 'VirtualHost',
+
+ //mod_authn_alias.c
+ 'AuthnProviderAlias',
+
+ //mod_proxy.c
+ 'Proxy','ProxyMatch',
+
+ //mod_version.c
+ 'IfVersion'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '+', '-'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00007f;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #000000; font-weight:bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER,
+ 'SYMBOLS' => GESHI_NEVER
+ ),
+ 'KEYWORDS' => array(
+ 3 => array(
+ 'DISALLOWED_BEFORE' => '(?<=&lt;|&lt;\/)',
+ 'DISALLOWED_AFTER' => '(?=\s|\/|&gt;)',
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/applescript.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/applescript.php
new file mode 100644
index 00000000..603fa4a3
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/applescript.php
@@ -0,0 +1,157 @@
+<?php
+/*************************************************************************************
+ * applescript.php
+ * --------
+ * Author: Stephan Klimek (http://www.initware.org)
+ * Copyright: Stephan Klimek (http://www.initware.org)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/07/20
+ *
+ * AppleScript language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ *
+ * TODO
+ * -------------------------
+ * URL settings to references
+ *
+ **************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'AppleScript',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array( '(*' => '*)'),
+ 'COMMENT_REGEXP' => array(
+ 2 => '/(?<=[a-z])\'/i',
+ 3 => '/(?<![a-z])\'.*?\'/i',
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'application','close','count','delete','duplicate','exists','launch','make','move','open',
+ 'print','quit','reopen','run','save','saving', 'idle', 'path to', 'number', 'alias', 'list', 'text', 'string',
+ 'integer', 'it','me','version','pi','result','space','tab','anything','case','diacriticals','expansion',
+ 'hyphens','punctuation','bold','condensed','expanded','hidden','italic','outline','plain',
+ 'shadow','strikethrough','subscript','superscript','underline','ask','no','yes','false', 'id',
+ 'true','weekday','monday','mon','tuesday','tue','wednesday','wed','thursday','thu','friday',
+ 'fri','saturday','sat','sunday','sun','month','january','jan','february','feb','march',
+ 'mar','april','apr','may','june','jun','july','jul','august','aug','september', 'quote', 'do JavaScript',
+ 'sep','october','oct','november','nov','december','dec','minutes','hours', 'name', 'default answer',
+ 'days','weeks', 'folder', 'folders', 'file', 'files', 'window', 'eject', 'disk', 'reveal', 'sleep',
+ 'shut down', 'restart', 'display dialog', 'buttons', 'invisibles', 'item', 'items', 'delimiters', 'offset of',
+ 'AppleScript\'s', 'choose file', 'choose folder', 'choose from list', 'beep', 'contents', 'do shell script',
+ 'paragraph', 'paragraphs', 'missing value', 'quoted form', 'desktop', 'POSIX path', 'POSIX file',
+ 'activate', 'document', 'adding', 'receiving', 'content', 'new', 'properties', 'info for', 'bounds',
+ 'selection', 'extension', 'into', 'onto', 'by', 'between', 'against', 'set the clipboard to', 'the clipboard'
+ ),
+ 2 => array(
+ 'each','some','every','whose','where','index','first','second','third','fourth',
+ 'fifth','sixth','seventh','eighth','ninth','tenth','last','front','back','st','nd',
+ 'rd','th','middle','named','through','thru','before','after','beginning','the', 'as',
+ 'div','mod','and','not','or','contains','equal','equals','isnt', 'less', 'greater'
+ ),
+ 3 => array(
+ 'script','property','prop','end','to','set','global','local','on','of',
+ 'in','given','with','without','return','continue','tell','if','then','else','repeat',
+ 'times','while','until','from','exit','try','error','considering','ignoring','timeout',
+ 'transaction','my','get','put','is', 'copy'
+ )
+ ),
+ 'SYMBOLS' => array(
+ ')','+','-','^','*','/','&','<','>=','<','<=','=','�'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0066ff;',
+ 2 => 'color: #ff0033;',
+ 3 => 'color: #ff0033; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => '',
+ 3 => 'color: #ff0000;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000000; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #339933;',
+ 4 => 'color: #0066ff;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => ',+-=&lt;&gt;/?^&amp;*'
+ ),
+ 'REGEXPS' => array(
+ //Variables
+ 0 => '[\\$%@]+[a-zA-Z_][a-zA-Z0-9_]*',
+ //File descriptors
+ 4 => '&lt;[a-zA-Z_][a-zA-Z0-9_]*&gt;',
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'SPACE_AS_WHITESPACE' => true
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/apt_sources.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/apt_sources.php
new file mode 100644
index 00000000..9f1ed045
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/apt_sources.php
@@ -0,0 +1,148 @@
+<?php
+/*************************************************************************************
+ * apt_sources.php
+ * ----------
+ * Author: Milian Wolff (mail@milianw.de)
+ * Copyright: (c) 2008 Milian Wolff (http://milianw.de)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/06/17
+ *
+ * Apt sources.list language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/06/17 (1.0.8)
+ * - Initial import
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Apt sources',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ /*keywords*/
+ 1 => array(
+ 'deb-src', 'deb'
+ ),
+ 2 => array(
+ //Generic
+ 'stable', 'old-stable', 'testing', 'testing-proposed-updates',
+ 'unstable', 'unstable-proposed-updates', 'experimental',
+ 'non-US', 'security', 'volatile', 'volatile-sloppy',
+ 'apt-build',
+ 'stable/updates',
+ //Debian
+ 'buzz', 'rex', 'bo', 'hamm', 'slink', 'potato', 'woody', 'sarge',
+ 'etch', 'lenny', 'wheezy', 'sid',
+ //Ubuntu
+ 'warty', 'warty-updates', 'warty-security', 'warty-proposed', 'warty-backports',
+ 'hoary', 'hoary-updates', 'hoary-security', 'hoary-proposed', 'hoary-backports',
+ 'breezy', 'breezy-updates', 'breezy-security', 'breezy-proposed', 'breezy-backports',
+ 'dapper', 'dapper-updates', 'dapper-security', 'dapper-proposed', 'dapper-backports',
+ 'edgy', 'edgy-updates', 'edgy-security', 'edgy-proposed', 'edgy-backports',
+ 'feisty', 'feisty-updates', 'feisty-security', 'feisty-proposed', 'feisty-backports',
+ 'gutsy', 'gutsy-updates', 'gutsy-security', 'gutsy-proposed', 'gutsy-backports',
+ 'hardy', 'hardy-updates', 'hardy-security', 'hardy-proposed', 'hardy-backports',
+ 'intrepid', 'intrepid-updates', 'intrepid-security', 'intrepid-proposed', 'intrepid-backports',
+ 'jaunty', 'jaunty-updates', 'jaunty-security', 'jaunty-proposed', 'jaunty-backports',
+ 'karmic', 'karmic-updates', 'karmic-security', 'karmic-proposed', 'karmic-backports',
+ 'lucid', 'lucid-updates', 'lucid-security', 'lucid-proposed', 'lucid-backports',
+ 'maverick', 'maverick-updates', 'maverick-security', 'maverick-proposed', 'maverick-backports'
+ ),
+ 3 => array(
+ 'main', 'restricted', 'preview', 'contrib', 'non-free',
+ 'commercial', 'universe', 'multiverse'
+ )
+ ),
+ 'REGEXPS' => array(
+ 0 => "(((http|ftp):\/\/|file:\/)[^\s]+)|(cdrom:\[[^\]]*\][^\s]*)",
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => true,
+ 3 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00007f;',
+ 2 => 'color: #b1b100;',
+ 3 => 'color: #b16000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'BRACKETS' => array(
+ ),
+ 'STRINGS' => array(
+ ),
+ 'NUMBERS' => array(
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #009900;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'NUMBERS' => GESHI_NEVER,
+ 'METHODS' => GESHI_NEVER,
+ 'SCRIPT' => GESHI_NEVER,
+ 'SYMBOLS' => GESHI_NEVER,
+ 'ESCAPE_CHAR' => GESHI_NEVER,
+ 'BRACKETS' => GESHI_NEVER,
+ 'STRINGS' => GESHI_NEVER,
+ ),
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => '(?<![a-zA-Z0-9\$_\|\#;>|^\/])',
+ 'DISALLOWED_AFTER' => '(?![a-zA-Z0-9_\|%\\-&\.])'
+ )
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/arm.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/arm.php
new file mode 100644
index 00000000..8e3c0a37
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/arm.php
@@ -0,0 +1,3318 @@
+<?php
+/*************************************************************************************
+ * arm.php
+ * -------
+ * Author: Marat Dukhan (mdukhan3.at.gatech.dot.edu)
+ * Copyright: (c) Marat Dukhan (mdukhan3.at.gatech.dot.edu)
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/10/06
+ *
+ * ARM Assembler language file for GeSHi.
+ * Based on the following documents:
+ * - "ARM Architecture Reference Manual: ARMv7-A and ARMv7-R edition"
+ * - "Intel XScale Technology: Intel Wireless MMX2 Coprocessor",
+ * Revision 1.5, July 2006
+ *
+ * CHANGES
+ * -------
+ * 2011/10/06
+ * - First Release (supported UAL syntax for up to ARMv7 A/R, VFPv3, NEON, WMMX/WMMX2)
+ *
+ * TODO (updated 2011/10/06)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ARM ASSEMBLER',
+ 'COMMENT_SINGLE' => array(
+ 1 => ';'
+ ),
+ 'COMMENT_MULTI' => array(),
+ //Line address prefix suppression
+ 'COMMENT_REGEXP' => array(
+ 2 => "/^(?:[0-9a-f]{0,4}:)?[0-9a-f]{4}(?:[0-9a-f]{4})?/mi"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* Unconditional Data Processing Instructions */
+ 1 => array(
+ /* Data Processing: Unconditional Addition & Subtraction */
+ 'adc.w','adcal.w',
+ 'adc','adcal',
+ 'add.w','addal.w',
+ 'add','addal',
+ 'addw','addwal',
+ 'rsb.w','rsbal.w',
+ 'rsb','rsbal',
+ 'rsc','rscal',
+ 'sbc.w','sbcal.w',
+ 'sbc','sbcal',
+ 'sub.w','subal.w',
+ 'sub','subal',
+ 'neg.w','negal.w',
+ 'neg','negal',
+ 'adr.w','adral.w',
+ 'adr','adral',
+ /* Data Processing: Unconditional Logical */
+ 'and.w','andal.w',
+ 'and','andal',
+ 'bic.w','bical.w',
+ 'bic','bical',
+ 'orr.w','orral.w',
+ 'orr','orral',
+ 'orn.w','ornal.w',
+ 'orn','ornal',
+ 'eor.w','eoral.w',
+ 'eor','eoral',
+ 'mov.w','moval.w',
+ 'mov','moval',
+ 'movw','movwal',
+ 'movt','movtal',
+ 'cpy','cpyal',
+ 'mvn.w','mvnal.w',
+ 'mvn','mvnal',
+ /* Data Processing: Unconditional Shifts and Rotates */
+ 'asr.w','asral.w',
+ 'asr','asral',
+ 'lsl.w','lslal.w',
+ 'lsl','lslal',
+ 'lsr.w','lsral.w',
+ 'lsr','lsral',
+ 'ror.w','roral.w',
+ 'ror','roral',
+ 'rrx','rrxal',
+ /* Data Processing: Unconditional Word Multiply and Multiply-Add */
+ 'mul','mulal',
+ 'mla','mlaal',
+ 'mls','mlsal',
+ 'smull','smullal',
+ 'muls','mulsal',
+ 'umull','umullal',
+ 'smlal','smlalal',
+ 'umlal','umlalal',
+ /* Data Processing: Unconditional Halfword Multiply and Multiply-Add (ARMv5TE) */
+ 'smulbb','smulbbal',
+ 'smulbt','smulbtal',
+ 'smultb','smultbal',
+ 'smultt','smulttal',
+ 'smulwb','smulwbal',
+ 'smulwt','smulwtal',
+ 'smlalbb','smlalbbal',
+ 'smlalbt','smlalbtal',
+ 'smlaltb','smlaltbal',
+ 'smlaltt','smlalttal',
+ 'smlabb','smlabbal',
+ 'smlabt','smlabtal',
+ 'smlatb','smlatbal',
+ 'smlatt','smlattal',
+ 'smlawb','smlawbal',
+ 'smlawt','smlawtal',
+ /* Data Processing: Unconditional Bit Operations */
+ 'ubfx','ubfxal',
+ 'sbfx','sbfxal',
+ 'bfc','bfcal',
+ 'bfi','bfial',
+ 'clz','clzal',
+ /* Data Processing: Unconditional Divide (ARMv7-R) */
+ 'sdiv','sdival',
+ 'udiv','udival'
+ ),
+ /* Conditional Data Processing Instructions */
+ 2 => array(
+ /* Data Processing: Conditional Addition & Subtraction */
+ 'adceq.w','adcne.w','adccs.w','adchs.w','adccc.w','adclo.w','adcmi.w','adcpl.w','adcvs.w','adcvc.w','adchi.w','adcls.w','adcge.w','adclt.w','adcgt.w','adcle.w',
+ 'adceq','adcne','adccs','adchs','adccc','adclo','adcmi','adcpl','adcvs','adcvc','adchi','adcls','adcge','adclt','adcgt','adcle',
+ 'addeq.w','addne.w','addcs.w','addhs.w','addcc.w','addlo.w','addmi.w','addpl.w','addvs.w','addvc.w','addhi.w','addls.w','addge.w','addlt.w','addgt.w','addle.w',
+ 'addeq','addne','addcs','addhs','addcc','addlo','addmi','addpl','addvs','addvc','addhi','addls','addge','addlt','addgt','addle',
+ 'addweq','addwne','addwcs','addwhs','addwcc','addwlo','addwmi','addwpl','addwvs','addwvc','addwhi','addwls','addwge','addwlt','addwgt','addwle',
+ 'rsbeq.w','rsbne.w','rsbcs.w','rsbhs.w','rsbcc.w','rsblo.w','rsbmi.w','rsbpl.w','rsbvs.w','rsbvc.w','rsbhi.w','rsbls.w','rsbge.w','rsblt.w','rsbgt.w','rsble.w',
+ 'rsbeq','rsbne','rsbcs','rsbhs','rsbcc','rsblo','rsbmi','rsbpl','rsbvs','rsbvc','rsbhi','rsbls','rsbge','rsblt','rsbgt','rsble',
+ 'rsceq','rscne','rsccs','rschs','rsccc','rsclo','rscmi','rscpl','rscvs','rscvc','rschi','rscls','rscge','rsclt','rscgt','rscle',
+ 'sbceq.w','sbcne.w','sbccs.w','sbchs.w','sbccc.w','sbclo.w','sbcmi.w','sbcpl.w','sbcvs.w','sbcvc.w','sbchi.w','sbcls.w','sbcge.w','sbclt.w','sbcgt.w','sbcle.w',
+ 'sbceq','sbcne','sbccs','sbchs','sbccc','sbclo','sbcmi','sbcpl','sbcvs','sbcvc','sbchi','sbcls','sbcge','sbclt','sbcgt','sbcle',
+ 'subeq.w','subne.w','subcs.w','subhs.w','subcc.w','sublo.w','submi.w','subpl.w','subvs.w','subvc.w','subhi.w','subls.w','subge.w','sublt.w','subgt.w','suble.w',
+ 'subeq','subne','subcs','subhs','subcc','sublo','submi','subpl','subvs','subvc','subhi','subls','subge','sublt','subgt','suble',
+ 'negeq.w','negne.w','negcs.w','neghs.w','negcc.w','neglo.w','negmi.w','negpl.w','negvs.w','negvc.w','neghi.w','negls.w','negge.w','neglt.w','neggt.w','negle.w',
+ 'negeq','negne','negcs','neghs','negcc','neglo','negmi','negpl','negvs','negvc','neghi','negls','negge','neglt','neggt','negle',
+ 'adreq.w','adrne.w','adrcs.w','adrhs.w','adrcc.w','adrlo.w','adrmi.w','adrpl.w','adrvs.w','adrvc.w','adrhi.w','adrls.w','adrge.w','adrlt.w','adrgt.w','adrle.w',
+ 'adreq','adrne','adrcs','adrhs','adrcc','adrlo','adrmi','adrpl','adrvs','adrvc','adrhi','adrls','adrge','adrlt','adrgt','adrle',
+ /* Data Processing: Conditional Logical */
+ 'andeq.w','andne.w','andcs.w','andhs.w','andcc.w','andlo.w','andmi.w','andpl.w','andvs.w','andvc.w','andhi.w','andls.w','andge.w','andlt.w','andgt.w','andle.w',
+ 'andeq','andne','andcs','andhs','andcc','andlo','andmi','andpl','andvs','andvc','andhi','andls','andge','andlt','andgt','andle',
+ 'biceq.w','bicne.w','biccs.w','bichs.w','biccc.w','biclo.w','bicmi.w','bicpl.w','bicvs.w','bicvc.w','bichi.w','bicls.w','bicge.w','biclt.w','bicgt.w','bicle.w',
+ 'biceq','bicne','biccs','bichs','biccc','biclo','bicmi','bicpl','bicvs','bicvc','bichi','bicls','bicge','biclt','bicgt','bicle',
+ 'orreq.w','orrne.w','orrcs.w','orrhs.w','orrcc.w','orrlo.w','orrmi.w','orrpl.w','orrvs.w','orrvc.w','orrhi.w','orrls.w','orrge.w','orrlt.w','orrgt.w','orrle.w',
+ 'orreq','orrne','orrcs','orrhs','orrcc','orrlo','orrmi','orrpl','orrvs','orrvc','orrhi','orrls','orrge','orrlt','orrgt','orrle',
+ 'orneq.w','ornne.w','orncs.w','ornhs.w','orncc.w','ornlo.w','ornmi.w','ornpl.w','ornvs.w','ornvc.w','ornhi.w','ornls.w','ornge.w','ornlt.w','orngt.w','ornle.w',
+ 'orneq','ornne','orncs','ornhs','orncc','ornlo','ornmi','ornpl','ornvs','ornvc','ornhi','ornls','ornge','ornlt','orngt','ornle',
+ 'eoreq.w','eorne.w','eorcs.w','eorhs.w','eorcc.w','eorlo.w','eormi.w','eorpl.w','eorvs.w','eorvc.w','eorhi.w','eorls.w','eorge.w','eorlt.w','eorgt.w','eorle.w',
+ 'eoreq','eorne','eorcs','eorhs','eorcc','eorlo','eormi','eorpl','eorvs','eorvc','eorhi','eorls','eorge','eorlt','eorgt','eorle',
+ 'moveq.w','movne.w','movcs.w','movhs.w','movcc.w','movlo.w','movmi.w','movpl.w','movvs.w','movvc.w','movhi.w','movls.w','movge.w','movlt.w','movgt.w','movle.w',
+ 'moveq','movne','movcs','movhs','movcc','movlo','movmi','movpl','movvs','movvc','movhi','movls','movge','movlt','movgt','movle',
+ 'movweq','movwne','movwcs','movwhs','movwcc','movwlo','movwmi','movwpl','movwvs','movwvc','movwhi','movwls','movwge','movwlt','movwgt','movwle',
+ 'movteq','movtne','movtcs','movths','movtcc','movtlo','movtmi','movtpl','movtvs','movtvc','movthi','movtls','movtge','movtlt','movtgt','movtle',
+ 'cpyeq','cpyne','cpycs','cpyhs','cpycc','cpylo','cpymi','cpypl','cpyvs','cpyvc','cpyhi','cpyls','cpyge','cpylt','cpygt','cpyle',
+ 'mvneq.w','mvnne.w','mvncs.w','mvnhs.w','mvncc.w','mvnlo.w','mvnmi.w','mvnpl.w','mvnvs.w','mvnvc.w','mvnhi.w','mvnls.w','mvnge.w','mvnlt.w','mvngt.w','mvnle.w',
+ 'mvneq','mvnne','mvncs','mvnhs','mvncc','mvnlo','mvnmi','mvnpl','mvnvs','mvnvc','mvnhi','mvnls','mvnge','mvnlt','mvngt','mvnle',
+ /* Data Processing: Conditional Shifts and Rotates */
+ 'asreq.w','asrne.w','asrcs.w','asrhs.w','asrcc.w','asrlo.w','asrmi.w','asrpl.w','asrvs.w','asrvc.w','asrhi.w','asrls.w','asrge.w','asrlt.w','asrgt.w','asrle.w',
+ 'asreq','asrne','asrcs','asrhs','asrcc','asrlo','asrmi','asrpl','asrvs','asrvc','asrhi','asrls','asrge','asrlt','asrgt','asrle',
+ 'lsleq.w','lslne.w','lslcs.w','lslhs.w','lslcc.w','lsllo.w','lslmi.w','lslpl.w','lslvs.w','lslvc.w','lslhi.w','lslls.w','lslge.w','lsllt.w','lslgt.w','lslle.w',
+ 'lsleq','lslne','lslcs','lslhs','lslcc','lsllo','lslmi','lslpl','lslvs','lslvc','lslhi','lslls','lslge','lsllt','lslgt','lslle',
+ 'lsreq.w','lsrne.w','lsrcs.w','lsrhs.w','lsrcc.w','lsrlo.w','lsrmi.w','lsrpl.w','lsrvs.w','lsrvc.w','lsrhi.w','lsrls.w','lsrge.w','lsrlt.w','lsrgt.w','lsrle.w',
+ 'lsreq','lsrne','lsrcs','lsrhs','lsrcc','lsrlo','lsrmi','lsrpl','lsrvs','lsrvc','lsrhi','lsrls','lsrge','lsrlt','lsrgt','lsrle',
+ 'roreq.w','rorne.w','rorcs.w','rorhs.w','rorcc.w','rorlo.w','rormi.w','rorpl.w','rorvs.w','rorvc.w','rorhi.w','rorls.w','rorge.w','rorlt.w','rorgt.w','rorle.w',
+ 'roreq','rorne','rorcs','rorhs','rorcc','rorlo','rormi','rorpl','rorvs','rorvc','rorhi','rorls','rorge','rorlt','rorgt','rorle',
+ 'rrxeq','rrxne','rrxcs','rrxhs','rrxcc','rrxlo','rrxmi','rrxpl','rrxvs','rrxvc','rrxhi','rrxls','rrxge','rrxlt','rrxgt','rrxle',
+ /* Data Processing: Conditional Word Multiply and Multiply-Add */
+ 'muleq','mulne','mulcs','mulhs','mulcc','mullo','mulmi','mulpl','mulvs','mulvc','mulhi','mulls','mulge','mullt','mulgt','mulle',
+ 'mlaeq','mlane','mlacs','mlahs','mlacc','mlalo','mlami','mlapl','mlavs','mlavc','mlahi','mlals','mlage','mlalt','mlagt','mlale',
+ 'mlseq','mlsne','mlscs','mlshs','mlscc','mlslo','mlsmi','mlspl','mlsvs','mlsvc','mlshi','mlsls','mlsge','mlslt','mlsgt','mlsle',
+ 'smulleq','smullne','smullcs','smullhs','smullcc','smulllo','smullmi','smullpl','smullvs','smullvc','smullhi','smullls','smullge','smulllt','smullgt','smullle',
+ 'mulseq','mulsne','mulscs','mulshs','mulscc','mulslo','mulsmi','mulspl','mulsvs','mulsvc','mulshi','mulsls','mulsge','mulslt','mulsgt','mulsle',
+ 'umulleq','umullne','umullcs','umullhs','umullcc','umulllo','umullmi','umullpl','umullvs','umullvc','umullhi','umullls','umullge','umulllt','umullgt','umullle',
+ 'smlaleq','smlalne','smlalcs','smlalhs','smlalcc','smlallo','smlalmi','smlalpl','smlalvs','smlalvc','smlalhi','smlalls','smlalge','smlallt','smlalgt','smlalle',
+ 'umlaleq','umlalne','umlalcs','umlalhs','umlalcc','umlallo','umlalmi','umlalpl','umlalvs','umlalvc','umlalhi','umlalls','umlalge','umlallt','umlalgt','umlalle',
+ /* Data Processing: Conditional Halfword Multiply and Multiply-Add (ARMv5TE) */
+ 'smulbbeq','smulbbne','smulbbcs','smulbbhs','smulbbcc','smulbblo','smulbbmi','smulbbpl','smulbbvs','smulbbvc','smulbbhi','smulbbls','smulbbge','smulbblt','smulbbgt','smulbble',
+ 'smulbteq','smulbtne','smulbtcs','smulbths','smulbtcc','smulbtlo','smulbtmi','smulbtpl','smulbtvs','smulbtvc','smulbthi','smulbtls','smulbtge','smulbtlt','smulbtgt','smulbtle',
+ 'smultbeq','smultbne','smultbcs','smultbhs','smultbcc','smultblo','smultbmi','smultbpl','smultbvs','smultbvc','smultbhi','smultbls','smultbge','smultblt','smultbgt','smultble',
+ 'smultteq','smulttne','smulttcs','smultths','smulttcc','smulttlo','smulttmi','smulttpl','smulttvs','smulttvc','smultthi','smulttls','smulttge','smulttlt','smulttgt','smulttle',
+ 'smulwbeq','smulwbne','smulwbcs','smulwbhs','smulwbcc','smulwblo','smulwbmi','smulwbpl','smulwbvs','smulwbvc','smulwbhi','smulwbls','smulwbge','smulwblt','smulwbgt','smulwble',
+ 'smulwteq','smulwtne','smulwtcs','smulwths','smulwtcc','smulwtlo','smulwtmi','smulwtpl','smulwtvs','smulwtvc','smulwthi','smulwtls','smulwtge','smulwtlt','smulwtgt','smulwtle',
+ 'smlalbbeq','smlalbbne','smlalbbcs','smlalbbhs','smlalbbcc','smlalbblo','smlalbbmi','smlalbbpl','smlalbbvs','smlalbbvc','smlalbbhi','smlalbbls','smlalbbge','smlalbblt','smlalbbgt','smlalbble',
+ 'smlalbteq','smlalbtne','smlalbtcs','smlalbths','smlalbtcc','smlalbtlo','smlalbtmi','smlalbtpl','smlalbtvs','smlalbtvc','smlalbthi','smlalbtls','smlalbtge','smlalbtlt','smlalbtgt','smlalbtle',
+ 'smlaltbeq','smlaltbne','smlaltbcs','smlaltbhs','smlaltbcc','smlaltblo','smlaltbmi','smlaltbpl','smlaltbvs','smlaltbvc','smlaltbhi','smlaltbls','smlaltbge','smlaltblt','smlaltbgt','smlaltble',
+ 'smlaltteq','smlalttne','smlalttcs','smlaltths','smlalttcc','smlalttlo','smlalttmi','smlalttpl','smlalttvs','smlalttvc','smlaltthi','smlalttls','smlalttge','smlalttlt','smlalttgt','smlalttle',
+ 'smlabbeq','smlabbne','smlabbcs','smlabbhs','smlabbcc','smlabblo','smlabbmi','smlabbpl','smlabbvs','smlabbvc','smlabbhi','smlabbls','smlabbge','smlabblt','smlabbgt','smlabble',
+ 'smlabteq','smlabtne','smlabtcs','smlabths','smlabtcc','smlabtlo','smlabtmi','smlabtpl','smlabtvs','smlabtvc','smlabthi','smlabtls','smlabtge','smlabtlt','smlabtgt','smlabtle',
+ 'smlatbeq','smlatbne','smlatbcs','smlatbhs','smlatbcc','smlatblo','smlatbmi','smlatbpl','smlatbvs','smlatbvc','smlatbhi','smlatbls','smlatbge','smlatblt','smlatbgt','smlatble',
+ 'smlatteq','smlattne','smlattcs','smlatths','smlattcc','smlattlo','smlattmi','smlattpl','smlattvs','smlattvc','smlatthi','smlattls','smlattge','smlattlt','smlattgt','smlattle',
+ 'smlawbeq','smlawbne','smlawbcs','smlawbhs','smlawbcc','smlawblo','smlawbmi','smlawbpl','smlawbvs','smlawbvc','smlawbhi','smlawbls','smlawbge','smlawblt','smlawbgt','smlawble',
+ 'smlawteq','smlawtne','smlawtcs','smlawths','smlawtcc','smlawtlo','smlawtmi','smlawtpl','smlawtvs','smlawtvc','smlawthi','smlawtls','smlawtge','smlawtlt','smlawtgt','smlawtle',
+ /* Data Processing: Conditional Bit Operations */
+ 'ubfxeq','ubfxne','ubfxcs','ubfxhs','ubfxcc','ubfxlo','ubfxmi','ubfxpl','ubfxvs','ubfxvc','ubfxhi','ubfxls','ubfxge','ubfxlt','ubfxgt','ubfxle',
+ 'sbfxeq','sbfxne','sbfxcs','sbfxhs','sbfxcc','sbfxlo','sbfxmi','sbfxpl','sbfxvs','sbfxvc','sbfxhi','sbfxls','sbfxge','sbfxlt','sbfxgt','sbfxle',
+ 'bfceq','bfcne','bfccs','bfchs','bfccc','bfclo','bfcmi','bfcpl','bfcvs','bfcvc','bfchi','bfcls','bfcge','bfclt','bfcgt','bfcle',
+ 'bfieq','bfine','bfics','bfihs','bficc','bfilo','bfimi','bfipl','bfivs','bfivc','bfihi','bfils','bfige','bfilt','bfigt','bfile',
+ 'clzeq','clzne','clzcs','clzhs','clzcc','clzlo','clzmi','clzpl','clzvs','clzvc','clzhi','clzls','clzge','clzlt','clzgt','clzle',
+ /* ARMv7-R: Conditional Divide */
+ 'sdiveq','sdivne','sdivcs','sdivhs','sdivcc','sdivlo','sdivmi','sdivpl','sdivvs','sdivvc','sdivhi','sdivls','sdivge','sdivlt','sdivgt','sdivle',
+ 'udiveq','udivne','udivcs','udivhs','udivcc','udivlo','udivmi','udivpl','udivvs','udivvc','udivhi','udivls','udivge','udivlt','udivgt','udivle'
+ ),
+ /* Unconditional Memory Access */
+ 3 => array(
+ /* Memory Access: Unconditional Memory Loads and Prefetches */
+ 'ldm.w','ldmal.w',
+ 'ldm','ldmal',
+ 'ldmda','ldmdaal',
+ 'ldmdb','ldmdbal',
+ 'ldmib','ldmibal',
+ 'ldmia','ldmiaal',
+ 'ldmea','ldmeaal',
+ 'ldmed','ldmedal',
+ 'ldmfa','ldmfaal',
+ 'ldmfd','ldmfdal',
+ 'ldrd','ldrdal',
+ 'ldr.w','ldral.w',
+ 'ldr','ldral',
+ 'ldrh.w','ldrhal.w',
+ 'ldrh','ldrhal',
+ 'ldrb.w','ldrbal.w',
+ 'ldrb','ldrbal',
+ 'ldrsh.w','ldrshal.w',
+ 'ldrsh','ldrshal',
+ 'ldrsb.w','ldrsbal.w',
+ 'ldrsb','ldrsbal',
+ 'ldrt','ldrtal',
+ 'ldrht','ldrhtal',
+ 'ldrbt','ldrbtal',
+ 'ldrsht','ldrshtal',
+ 'ldrsbt','ldrsbtal',
+ 'pop.w','popal.w',
+ 'pop','popal',
+ 'pld','pldal',
+ 'pldw','pldwal',
+ 'pli','plial',
+ /* Memory Access: Unconditional Memory Stores */
+ 'stm.w','stmal.w',
+ 'stm','stmal',
+ 'stmda','stmdaal',
+ 'stmdb','stmdbal',
+ 'stmib','stmibal',
+ 'stmia','stmiaal',
+ 'stmea','stmeaal',
+ 'stmed','stmedal',
+ 'stdfa','stdfaal',
+ 'stdfd','stdfdal',
+ 'strd','strdal',
+ 'str.w','stral.w',
+ 'str','stral',
+ 'strh.w','strhal.w',
+ 'strh','strhal',
+ 'strb.w','strbal.w',
+ 'strb','strbal',
+ 'strt','strtal',
+ 'strht','strhtal',
+ 'strbt','strbtal',
+ 'push.w','pushal.w',
+ 'push','pushal'
+ ),
+ /* Conditional Memory Access */
+ 4 => array(
+ /* Memory Access: Conditional Memory Loads and Prefetches */
+ 'ldmeq.w','ldmne.w','ldmcs.w','ldmhs.w','ldmcc.w','ldmlo.w','ldmmi.w','ldmpl.w','ldmvs.w','ldmvc.w','ldmhi.w','ldmls.w','ldmge.w','ldmlt.w','ldmgt.w','ldmle.w',
+ 'ldmeq','ldmne','ldmcs','ldmhs','ldmcc','ldmlo','ldmmi','ldmpl','ldmvs','ldmvc','ldmhi','ldmls','ldmge','ldmlt','ldmgt','ldmle',
+ 'ldmdaeq','ldmdane','ldmdacs','ldmdahs','ldmdacc','ldmdalo','ldmdami','ldmdapl','ldmdavs','ldmdavc','ldmdahi','ldmdals','ldmdage','ldmdalt','ldmdagt','ldmdale',
+ 'ldmdbeq','ldmdbne','ldmdbcs','ldmdbhs','ldmdbcc','ldmdblo','ldmdbmi','ldmdbpl','ldmdbvs','ldmdbvc','ldmdbhi','ldmdbls','ldmdbge','ldmdblt','ldmdbgt','ldmdble',
+ 'ldmibeq','ldmibne','ldmibcs','ldmibhs','ldmibcc','ldmiblo','ldmibmi','ldmibpl','ldmibvs','ldmibvc','ldmibhi','ldmibls','ldmibge','ldmiblt','ldmibgt','ldmible',
+ 'ldmiaeq','ldmiane','ldmiacs','ldmiahs','ldmiacc','ldmialo','ldmiami','ldmiapl','ldmiavs','ldmiavc','ldmiahi','ldmials','ldmiage','ldmialt','ldmiagt','ldmiale',
+ 'ldmeaeq','ldmeane','ldmeacs','ldmeahs','ldmeacc','ldmealo','ldmeami','ldmeapl','ldmeavs','ldmeavc','ldmeahi','ldmeals','ldmeage','ldmealt','ldmeagt','ldmeale',
+ 'ldmedeq','ldmedne','ldmedcs','ldmedhs','ldmedcc','ldmedlo','ldmedmi','ldmedpl','ldmedvs','ldmedvc','ldmedhi','ldmedls','ldmedge','ldmedlt','ldmedgt','ldmedle',
+ 'ldmfaeq','ldmfane','ldmfacs','ldmfahs','ldmfacc','ldmfalo','ldmfami','ldmfapl','ldmfavs','ldmfavc','ldmfahi','ldmfals','ldmfage','ldmfalt','ldmfagt','ldmfale',
+ 'ldmfdeq','ldmfdne','ldmfdcs','ldmfdhs','ldmfdcc','ldmfdlo','ldmfdmi','ldmfdpl','ldmfdvs','ldmfdvc','ldmfdhi','ldmfdls','ldmfdge','ldmfdlt','ldmfdgt','ldmfdle',
+ 'ldrdeq','ldrdne','ldrdcs','ldrdhs','ldrdcc','ldrdlo','ldrdmi','ldrdpl','ldrdvs','ldrdvc','ldrdhi','ldrdls','ldrdge','ldrdlt','ldrdgt','ldrdle',
+ 'ldreq.w','ldrne.w','ldrcs.w','ldrhs.w','ldrcc.w','ldrlo.w','ldrmi.w','ldrpl.w','ldrvs.w','ldrvc.w','ldrhi.w','ldrls.w','ldrge.w','ldrlt.w','ldrgt.w','ldrle.w',
+ 'ldreq','ldrne','ldrcs','ldrhs','ldrcc','ldrlo','ldrmi','ldrpl','ldrvs','ldrvc','ldrhi','ldrls','ldrge','ldrlt','ldrgt','ldrle',
+ 'ldrheq.w','ldrhne.w','ldrhcs.w','ldrhhs.w','ldrhcc.w','ldrhlo.w','ldrhmi.w','ldrhpl.w','ldrhvs.w','ldrhvc.w','ldrhhi.w','ldrhls.w','ldrhge.w','ldrhlt.w','ldrhgt.w','ldrhle.w',
+ 'ldrheq','ldrhne','ldrhcs','ldrhhs','ldrhcc','ldrhlo','ldrhmi','ldrhpl','ldrhvs','ldrhvc','ldrhhi','ldrhls','ldrhge','ldrhlt','ldrhgt','ldrhle',
+ 'ldrbeq.w','ldrbne.w','ldrbcs.w','ldrbhs.w','ldrbcc.w','ldrblo.w','ldrbmi.w','ldrbpl.w','ldrbvs.w','ldrbvc.w','ldrbhi.w','ldrbls.w','ldrbge.w','ldrblt.w','ldrbgt.w','ldrble.w',
+ 'ldrbeq','ldrbne','ldrbcs','ldrbhs','ldrbcc','ldrblo','ldrbmi','ldrbpl','ldrbvs','ldrbvc','ldrbhi','ldrbls','ldrbge','ldrblt','ldrbgt','ldrble',
+ 'ldrsheq.w','ldrshne.w','ldrshcs.w','ldrshhs.w','ldrshcc.w','ldrshlo.w','ldrshmi.w','ldrshpl.w','ldrshvs.w','ldrshvc.w','ldrshhi.w','ldrshls.w','ldrshge.w','ldrshlt.w','ldrshgt.w','ldrshle.w',
+ 'ldrsheq','ldrshne','ldrshcs','ldrshhs','ldrshcc','ldrshlo','ldrshmi','ldrshpl','ldrshvs','ldrshvc','ldrshhi','ldrshls','ldrshge','ldrshlt','ldrshgt','ldrshle',
+ 'ldrsbeq.w','ldrsbne.w','ldrsbcs.w','ldrsbhs.w','ldrsbcc.w','ldrsblo.w','ldrsbmi.w','ldrsbpl.w','ldrsbvs.w','ldrsbvc.w','ldrsbhi.w','ldrsbls.w','ldrsbge.w','ldrsblt.w','ldrsbgt.w','ldrsble.w',
+ 'ldrsbeq','ldrsbne','ldrsbcs','ldrsbhs','ldrsbcc','ldrsblo','ldrsbmi','ldrsbpl','ldrsbvs','ldrsbvc','ldrsbhi','ldrsbls','ldrsbge','ldrsblt','ldrsbgt','ldrsble',
+ 'ldrteq','ldrtne','ldrtcs','ldrths','ldrtcc','ldrtlo','ldrtmi','ldrtpl','ldrtvs','ldrtvc','ldrthi','ldrtls','ldrtge','ldrtlt','ldrtgt','ldrtle',
+ 'ldrhteq','ldrhtne','ldrhtcs','ldrhths','ldrhtcc','ldrhtlo','ldrhtmi','ldrhtpl','ldrhtvs','ldrhtvc','ldrhthi','ldrhtls','ldrhtge','ldrhtlt','ldrhtgt','ldrhtle',
+ 'ldrbteq','ldrbtne','ldrbtcs','ldrbths','ldrbtcc','ldrbtlo','ldrbtmi','ldrbtpl','ldrbtvs','ldrbtvc','ldrbthi','ldrbtls','ldrbtge','ldrbtlt','ldrbtgt','ldrbtle',
+ 'ldrshteq','ldrshtne','ldrshtcs','ldrshths','ldrshtcc','ldrshtlo','ldrshtmi','ldrshtpl','ldrshtvs','ldrshtvc','ldrshthi','ldrshtls','ldrshtge','ldrshtlt','ldrshtgt','ldrshtle',
+ 'ldrsbteq','ldrsbtne','ldrsbtcs','ldrsbths','ldrsbtcc','ldrsbtlo','ldrsbtmi','ldrsbtpl','ldrsbtvs','ldrsbtvc','ldrsbthi','ldrsbtls','ldrsbtge','ldrsbtlt','ldrsbtgt','ldrsbtle',
+ 'popeq.w','popne.w','popcs.w','pophs.w','popcc.w','poplo.w','popmi.w','poppl.w','popvs.w','popvc.w','pophi.w','popls.w','popge.w','poplt.w','popgt.w','pople.w',
+ 'popeq','popne','popcs','pophs','popcc','poplo','popmi','poppl','popvs','popvc','pophi','popls','popge','poplt','popgt','pople',
+ 'pldeq','pldne','pldcs','pldhs','pldcc','pldlo','pldmi','pldpl','pldvs','pldvc','pldhi','pldls','pldge','pldlt','pldgt','pldle',
+ 'pldweq','pldwne','pldwcs','pldwhs','pldwcc','pldwlo','pldwmi','pldwpl','pldwvs','pldwvc','pldwhi','pldwls','pldwge','pldwlt','pldwgt','pldwle',
+ 'plieq','pline','plics','plihs','plicc','plilo','plimi','plipl','plivs','plivc','plihi','plils','plige','plilt','pligt','plile',
+ /* Memory Access: Conditional Memory Stores */
+ 'stmeq.w','stmne.w','stmcs.w','stmhs.w','stmcc.w','stmlo.w','stmmi.w','stmpl.w','stmvs.w','stmvc.w','stmhi.w','stmls.w','stmge.w','stmlt.w','stmgt.w','stmle.w',
+ 'stmeq','stmne','stmcs','stmhs','stmcc','stmlo','stmmi','stmpl','stmvs','stmvc','stmhi','stmls','stmge','stmlt','stmgt','stmle',
+ 'stmdaeq','stmdane','stmdacs','stmdahs','stmdacc','stmdalo','stmdami','stmdapl','stmdavs','stmdavc','stmdahi','stmdals','stmdage','stmdalt','stmdagt','stmdale',
+ 'stmdbeq','stmdbne','stmdbcs','stmdbhs','stmdbcc','stmdblo','stmdbmi','stmdbpl','stmdbvs','stmdbvc','stmdbhi','stmdbls','stmdbge','stmdblt','stmdbgt','stmdble',
+ 'stmibeq','stmibne','stmibcs','stmibhs','stmibcc','stmiblo','stmibmi','stmibpl','stmibvs','stmibvc','stmibhi','stmibls','stmibge','stmiblt','stmibgt','stmible',
+ 'stmiaeq','stmiane','stmiacs','stmiahs','stmiacc','stmialo','stmiami','stmiapl','stmiavs','stmiavc','stmiahi','stmials','stmiage','stmialt','stmiagt','stmiale',
+ 'stmeaeq','stmeane','stmeacs','stmeahs','stmeacc','stmealo','stmeami','stmeapl','stmeavs','stmeavc','stmeahi','stmeals','stmeage','stmealt','stmeagt','stmeale',
+ 'stmedeq','stmedne','stmedcs','stmedhs','stmedcc','stmedlo','stmedmi','stmedpl','stmedvs','stmedvc','stmedhi','stmedls','stmedge','stmedlt','stmedgt','stmedle',
+ 'stdfaeq','stdfane','stdfacs','stdfahs','stdfacc','stdfalo','stdfami','stdfapl','stdfavs','stdfavc','stdfahi','stdfals','stdfage','stdfalt','stdfagt','stdfale',
+ 'stdfdeq','stdfdne','stdfdcs','stdfdhs','stdfdcc','stdfdlo','stdfdmi','stdfdpl','stdfdvs','stdfdvc','stdfdhi','stdfdls','stdfdge','stdfdlt','stdfdgt','stdfdle',
+ 'strdeq','strdne','strdcs','strdhs','strdcc','strdlo','strdmi','strdpl','strdvs','strdvc','strdhi','strdls','strdge','strdlt','strdgt','strdle',
+ 'streq.w','strne.w','strcs.w','strhs.w','strcc.w','strlo.w','strmi.w','strpl.w','strvs.w','strvc.w','strhi.w','strls.w','strge.w','strlt.w','strgt.w','strle.w',
+ 'streq','strne','strcs','strhs','strcc','strlo','strmi','strpl','strvs','strvc','strhi','strls','strge','strlt','strgt','strle',
+ 'strheq.w','strhne.w','strhcs.w','strhhs.w','strhcc.w','strhlo.w','strhmi.w','strhpl.w','strhvs.w','strhvc.w','strhhi.w','strhls.w','strhge.w','strhlt.w','strhgt.w','strhle.w',
+ 'strheq','strhne','strhcs','strhhs','strhcc','strhlo','strhmi','strhpl','strhvs','strhvc','strhhi','strhls','strhge','strhlt','strhgt','strhle',
+ 'strbeq.w','strbne.w','strbcs.w','strbhs.w','strbcc.w','strblo.w','strbmi.w','strbpl.w','strbvs.w','strbvc.w','strbhi.w','strbls.w','strbge.w','strblt.w','strbgt.w','strble.w',
+ 'strbeq','strbne','strbcs','strbhs','strbcc','strblo','strbmi','strbpl','strbvs','strbvc','strbhi','strbls','strbge','strblt','strbgt','strble',
+ 'strteq','strtne','strtcs','strths','strtcc','strtlo','strtmi','strtpl','strtvs','strtvc','strthi','strtls','strtge','strtlt','strtgt','strtle',
+ 'strhteq','strhtne','strhtcs','strhths','strhtcc','strhtlo','strhtmi','strhtpl','strhtvs','strhtvc','strhthi','strhtls','strhtge','strhtlt','strhtgt','strhtle',
+ 'strbteq','strbtne','strbtcs','strbths','strbtcc','strbtlo','strbtmi','strbtpl','strbtvs','strbtvc','strbthi','strbtls','strbtge','strbtlt','strbtgt','strbtle',
+ 'pusheq.w','pushne.w','pushcs.w','pushhs.w','pushcc.w','pushlo.w','pushmi.w','pushpl.w','pushvs.w','pushvc.w','pushhi.w','pushls.w','pushge.w','pushlt.w','pushgt.w','pushle.w',
+ 'pusheq','pushne','pushcs','pushhs','pushcc','pushlo','pushmi','pushpl','pushvs','pushvc','pushhi','pushls','pushge','pushlt','pushgt','pushle'
+ ),
+ /* Unconditional Flags-Affecting Instructions */
+ 5 => array(
+ /* Set Flags: Unconditional Addition and Subtraction */
+ 'adds.w','addsal.w',
+ 'adds','addsal',
+ 'subs.w','subsal.w',
+ 'subs','subsal',
+ 'rsbs.w','rsbsal.w',
+ 'rsbs','rsbsal',
+ 'negs.w','negsal.w',
+ 'negs','negsal',
+ 'adcs.w','adcsal.w',
+ 'adcs','adcsal',
+ 'sbcs.w','sbcsal.w',
+ 'sbcs','sbcsal',
+ 'rscs','rscsal',
+ 'cmp.w','cmpal.w',
+ 'cmp','cmpal',
+ 'cmn.w','cmnal.w',
+ 'cmn','cmnal',
+ /* Set Flags: Unconditional Logical */
+ 'ands.w','andsal.w',
+ 'ands','andsal',
+ 'bics.w','bicsal.w',
+ 'bics','bicsal',
+ 'orrs.w','orrsal.w',
+ 'orrs','orrsal',
+ 'orns.w','ornsal.w',
+ 'orns','ornsal',
+ 'eors.w','eorsal.w',
+ 'eors','eorsal',
+ 'mvns.w','mvnsal.w',
+ 'mvns','mvnsal',
+ 'movs.w','movsal.w',
+ 'movs','movsal',
+ 'teq','teqal',
+ 'tst.w','tstal.w',
+ 'tst','tstal',
+ 'mrs','mrsal',
+ 'msr','msral',
+ /* Set Flags: Unconditional Shifts and Rotates */
+ 'asrs.w','asrsal.w',
+ 'asrs','asrsal',
+ 'lsls.w','lslsal.w',
+ 'lsls','lslsal',
+ 'lsrs.w','lsrsal.w',
+ 'lsrs','lsrsal',
+ 'rors.w','rorsal.w',
+ 'rors','rorsal',
+ 'rrxs','rrxsal',
+ /* Set Flags: Unconditional Multiply and Multiply-Add */
+ 'mlas','mlasal',
+ 'smulls','smullsal',
+ 'umulls','umullsal',
+ 'smlals','smlalsal',
+ 'umlals','umlalsal'
+ ),
+ /* Conditional Flags-Affecting Instructions */
+ 6 => array(
+ /* Set Flags: Conditional Addition and Subtraction */
+ 'addseq.w','addsne.w','addscs.w','addshs.w','addscc.w','addslo.w','addsmi.w','addspl.w','addsvs.w','addsvc.w','addshi.w','addsls.w','addsge.w','addslt.w','addsgt.w','addsle.w',
+ 'addseq','addsne','addscs','addshs','addscc','addslo','addsmi','addspl','addsvs','addsvc','addshi','addsls','addsge','addslt','addsgt','addsle',
+ 'subseq.w','subsne.w','subscs.w','subshs.w','subscc.w','subslo.w','subsmi.w','subspl.w','subsvs.w','subsvc.w','subshi.w','subsls.w','subsge.w','subslt.w','subsgt.w','subsle.w',
+ 'subseq','subsne','subscs','subshs','subscc','subslo','subsmi','subspl','subsvs','subsvc','subshi','subsls','subsge','subslt','subsgt','subsle',
+ 'rsbseq.w','rsbsne.w','rsbscs.w','rsbshs.w','rsbscc.w','rsbslo.w','rsbsmi.w','rsbspl.w','rsbsvs.w','rsbsvc.w','rsbshi.w','rsbsls.w','rsbsge.w','rsbslt.w','rsbsgt.w','rsbsle.w',
+ 'rsbseq','rsbsne','rsbscs','rsbshs','rsbscc','rsbslo','rsbsmi','rsbspl','rsbsvs','rsbsvc','rsbshi','rsbsls','rsbsge','rsbslt','rsbsgt','rsbsle',
+ 'negseq.w','negsne.w','negscs.w','negshs.w','negscc.w','negslo.w','negsmi.w','negspl.w','negsvs.w','negsvc.w','negshi.w','negsls.w','negsge.w','negslt.w','negsgt.w','negsle.w',
+ 'negseq','negsne','negscs','negshs','negscc','negslo','negsmi','negspl','negsvs','negsvc','negshi','negsls','negsge','negslt','negsgt','negsle',
+ 'adcseq.w','adcsne.w','adcscs.w','adcshs.w','adcscc.w','adcslo.w','adcsmi.w','adcspl.w','adcsvs.w','adcsvc.w','adcshi.w','adcsls.w','adcsge.w','adcslt.w','adcsgt.w','adcsle.w',
+ 'adcseq','adcsne','adcscs','adcshs','adcscc','adcslo','adcsmi','adcspl','adcsvs','adcsvc','adcshi','adcsls','adcsge','adcslt','adcsgt','adcsle',
+ 'sbcseq.w','sbcsne.w','sbcscs.w','sbcshs.w','sbcscc.w','sbcslo.w','sbcsmi.w','sbcspl.w','sbcsvs.w','sbcsvc.w','sbcshi.w','sbcsls.w','sbcsge.w','sbcslt.w','sbcsgt.w','sbcsle.w',
+ 'sbcseq','sbcsne','sbcscs','sbcshs','sbcscc','sbcslo','sbcsmi','sbcspl','sbcsvs','sbcsvc','sbcshi','sbcsls','sbcsge','sbcslt','sbcsgt','sbcsle',
+ 'rscseq','rscsne','rscscs','rscshs','rscscc','rscslo','rscsmi','rscspl','rscsvs','rscsvc','rscshi','rscsls','rscsge','rscslt','rscsgt','rscsle',
+ 'cmpeq.w','cmpne.w','cmpcs.w','cmphs.w','cmpcc.w','cmplo.w','cmpmi.w','cmppl.w','cmpvs.w','cmpvc.w','cmphi.w','cmpls.w','cmpge.w','cmplt.w','cmpgt.w','cmple.w',
+ 'cmpeq','cmpne','cmpcs','cmphs','cmpcc','cmplo','cmpmi','cmppl','cmpvs','cmpvc','cmphi','cmpls','cmpge','cmplt','cmpgt','cmple',
+ 'cmneq.w','cmnne.w','cmncs.w','cmnhs.w','cmncc.w','cmnlo.w','cmnmi.w','cmnpl.w','cmnvs.w','cmnvc.w','cmnhi.w','cmnls.w','cmnge.w','cmnlt.w','cmngt.w','cmnle.w',
+ 'cmneq','cmnne','cmncs','cmnhs','cmncc','cmnlo','cmnmi','cmnpl','cmnvs','cmnvc','cmnhi','cmnls','cmnge','cmnlt','cmngt','cmnle',
+ /* Set Flags: Conditional Logical */
+ 'andseq.w','andsne.w','andscs.w','andshs.w','andscc.w','andslo.w','andsmi.w','andspl.w','andsvs.w','andsvc.w','andshi.w','andsls.w','andsge.w','andslt.w','andsgt.w','andsle.w',
+ 'andseq','andsne','andscs','andshs','andscc','andslo','andsmi','andspl','andsvs','andsvc','andshi','andsls','andsge','andslt','andsgt','andsle',
+ 'bicseq.w','bicsne.w','bicscs.w','bicshs.w','bicscc.w','bicslo.w','bicsmi.w','bicspl.w','bicsvs.w','bicsvc.w','bicshi.w','bicsls.w','bicsge.w','bicslt.w','bicsgt.w','bicsle.w',
+ 'bicseq','bicsne','bicscs','bicshs','bicscc','bicslo','bicsmi','bicspl','bicsvs','bicsvc','bicshi','bicsls','bicsge','bicslt','bicsgt','bicsle',
+ 'orrseq.w','orrsne.w','orrscs.w','orrshs.w','orrscc.w','orrslo.w','orrsmi.w','orrspl.w','orrsvs.w','orrsvc.w','orrshi.w','orrsls.w','orrsge.w','orrslt.w','orrsgt.w','orrsle.w',
+ 'orrseq','orrsne','orrscs','orrshs','orrscc','orrslo','orrsmi','orrspl','orrsvs','orrsvc','orrshi','orrsls','orrsge','orrslt','orrsgt','orrsle',
+ 'ornseq.w','ornsne.w','ornscs.w','ornshs.w','ornscc.w','ornslo.w','ornsmi.w','ornspl.w','ornsvs.w','ornsvc.w','ornshi.w','ornsls.w','ornsge.w','ornslt.w','ornsgt.w','ornsle.w',
+ 'ornseq','ornsne','ornscs','ornshs','ornscc','ornslo','ornsmi','ornspl','ornsvs','ornsvc','ornshi','ornsls','ornsge','ornslt','ornsgt','ornsle',
+ 'eorseq.w','eorsne.w','eorscs.w','eorshs.w','eorscc.w','eorslo.w','eorsmi.w','eorspl.w','eorsvs.w','eorsvc.w','eorshi.w','eorsls.w','eorsge.w','eorslt.w','eorsgt.w','eorsle.w',
+ 'eorseq','eorsne','eorscs','eorshs','eorscc','eorslo','eorsmi','eorspl','eorsvs','eorsvc','eorshi','eorsls','eorsge','eorslt','eorsgt','eorsle',
+ 'mvnseq.w','mvnsne.w','mvnscs.w','mvnshs.w','mvnscc.w','mvnslo.w','mvnsmi.w','mvnspl.w','mvnsvs.w','mvnsvc.w','mvnshi.w','mvnsls.w','mvnsge.w','mvnslt.w','mvnsgt.w','mvnsle.w',
+ 'mvnseq','mvnsne','mvnscs','mvnshs','mvnscc','mvnslo','mvnsmi','mvnspl','mvnsvs','mvnsvc','mvnshi','mvnsls','mvnsge','mvnslt','mvnsgt','mvnsle',
+ 'movseq.w','movsne.w','movscs.w','movshs.w','movscc.w','movslo.w','movsmi.w','movspl.w','movsvs.w','movsvc.w','movshi.w','movsls.w','movsge.w','movslt.w','movsgt.w','movsle.w',
+ 'movseq','movsne','movscs','movshs','movscc','movslo','movsmi','movspl','movsvs','movsvc','movshi','movsls','movsge','movslt','movsgt','movsle',
+ 'teqeq','teqne','teqcs','teqhs','teqcc','teqlo','teqmi','teqpl','teqvs','teqvc','teqhi','teqls','teqge','teqlt','teqgt','teqle',
+ 'tsteq.w','tstne.w','tstcs.w','tsths.w','tstcc.w','tstlo.w','tstmi.w','tstpl.w','tstvs.w','tstvc.w','tsthi.w','tstls.w','tstge.w','tstlt.w','tstgt.w','tstle.w',
+ 'tsteq','tstne','tstcs','tsths','tstcc','tstlo','tstmi','tstpl','tstvs','tstvc','tsthi','tstls','tstge','tstlt','tstgt','tstle',
+ 'mrseq','mrsne','mrscs','mrshs','mrscc','mrslo','mrsmi','mrspl','mrsvs','mrsvc','mrshi','mrsls','mrsge','mrslt','mrsgt','mrsle',
+ 'msreq','msrne','msrcs','msrhs','msrcc','msrlo','msrmi','msrpl','msrvs','msrvc','msrhi','msrls','msrge','msrlt','msrgt','msrle',
+ /* Set Flags: Conditional Shifts and Rotates */
+ 'asrseq.w','asrsne.w','asrscs.w','asrshs.w','asrscc.w','asrslo.w','asrsmi.w','asrspl.w','asrsvs.w','asrsvc.w','asrshi.w','asrsls.w','asrsge.w','asrslt.w','asrsgt.w','asrsle.w',
+ 'asrseq','asrsne','asrscs','asrshs','asrscc','asrslo','asrsmi','asrspl','asrsvs','asrsvc','asrshi','asrsls','asrsge','asrslt','asrsgt','asrsle',
+ 'lslseq.w','lslsne.w','lslscs.w','lslshs.w','lslscc.w','lslslo.w','lslsmi.w','lslspl.w','lslsvs.w','lslsvc.w','lslshi.w','lslsls.w','lslsge.w','lslslt.w','lslsgt.w','lslsle.w',
+ 'lslseq','lslsne','lslscs','lslshs','lslscc','lslslo','lslsmi','lslspl','lslsvs','lslsvc','lslshi','lslsls','lslsge','lslslt','lslsgt','lslsle',
+ 'lsrseq.w','lsrsne.w','lsrscs.w','lsrshs.w','lsrscc.w','lsrslo.w','lsrsmi.w','lsrspl.w','lsrsvs.w','lsrsvc.w','lsrshi.w','lsrsls.w','lsrsge.w','lsrslt.w','lsrsgt.w','lsrsle.w',
+ 'lsrseq','lsrsne','lsrscs','lsrshs','lsrscc','lsrslo','lsrsmi','lsrspl','lsrsvs','lsrsvc','lsrshi','lsrsls','lsrsge','lsrslt','lsrsgt','lsrsle',
+ 'rorseq.w','rorsne.w','rorscs.w','rorshs.w','rorscc.w','rorslo.w','rorsmi.w','rorspl.w','rorsvs.w','rorsvc.w','rorshi.w','rorsls.w','rorsge.w','rorslt.w','rorsgt.w','rorsle.w',
+ 'rorseq','rorsne','rorscs','rorshs','rorscc','rorslo','rorsmi','rorspl','rorsvs','rorsvc','rorshi','rorsls','rorsge','rorslt','rorsgt','rorsle',
+ 'rrxseq','rrxsne','rrxscs','rrxshs','rrxscc','rrxslo','rrxsmi','rrxspl','rrxsvs','rrxsvc','rrxshi','rrxsls','rrxsge','rrxslt','rrxsgt','rrxsle',
+ /* Set Flags: Conditional Multiply and Multiply-Add */
+ 'mlaseq','mlasne','mlascs','mlashs','mlascc','mlaslo','mlasmi','mlaspl','mlasvs','mlasvc','mlashi','mlasls','mlasge','mlaslt','mlasgt','mlasle',
+ 'smullseq','smullsne','smullscs','smullshs','smullscc','smullslo','smullsmi','smullspl','smullsvs','smullsvc','smullshi','smullsls','smullsge','smullslt','smullsgt','smullsle',
+ 'umullseq','umullsne','umullscs','umullshs','umullscc','umullslo','umullsmi','umullspl','umullsvs','umullsvc','umullshi','umullsls','umullsge','umullslt','umullsgt','umullsle',
+ 'smlalseq','smlalsne','smlalscs','smlalshs','smlalscc','smlalslo','smlalsmi','smlalspl','smlalsvs','smlalsvc','smlalshi','smlalsls','smlalsge','smlalslt','smlalsgt','smlalsle',
+ 'umlalseq','umlalsne','umlalscs','umlalshs','umlalscc','umlalslo','umlalsmi','umlalspl','umlalsvs','umlalsvc','umlalshi','umlalsls','umlalsge','umlalslt','umlalsgt','umlalsle'
+ ),
+ /* Unconditional Flow Control Instructions */
+ 7 => array(
+ /* Flow Control: Unconditional Branch and If-Then-Else */
+ 'b.w','bal.w',
+ 'b','bal',
+ 'bl','blal',
+ 'bx','bxal',
+ 'blx','blxal',
+ 'bxj','bxjal',
+ 'cbnz',
+ 'cbz',
+ 'tbb','tbbal',
+ 'tbh','tbhal',
+ 'it',
+ 'itt',
+ 'ite',
+ 'ittt',
+ 'itet',
+ 'itte',
+ 'itee',
+ 'itttt',
+ 'itett',
+ 'ittet',
+ 'iteet',
+ 'ittte',
+ 'itete',
+ 'ittee',
+ 'iteee'
+ ),
+ /* Conditional Flow Control Instructions */
+ 8 => array(
+ /* Flow Control: Conditional Branch and If-Then-Else */
+ 'beq.w','bne.w','bcs.w','bhs.w','bcc.w','blo.w','bmi.w','bpl.w','bvs.w','bvc.w','bhi.w','bls.w','bge.w','blt.w','bgt.w','ble.w',
+ 'beq','bne','bcs','bhs','bcc','blo','bmi','bpl','bvs','bvc','bhi','bls','bge','blt','bgt','ble',
+ 'bleq','blne','blcs','blhs','blcc','bllo','blmi','blpl','blvs','blvc','blhi','blls','blge','bllt','blgt','blle',
+ 'bxeq','bxne','bxcs','bxhs','bxcc','bxlo','bxmi','bxpl','bxvs','bxvc','bxhi','bxls','bxge','bxlt','bxgt','bxle',
+ 'blxeq','blxne','blxcs','blxhs','blxcc','blxlo','blxmi','blxpl','blxvs','blxvc','blxhi','blxls','blxge','blxlt','blxgt','blxle',
+ 'bxjeq','bxjne','bxjcs','bxjhs','bxjcc','bxjlo','bxjmi','bxjpl','bxjvs','bxjvc','bxjhi','bxjls','bxjge','bxjlt','bxjgt','bxjle',
+ 'tbbeq','tbbne','tbbcs','tbbhs','tbbcc','tbblo','tbbmi','tbbpl','tbbvs','tbbvc','tbbhi','tbbls','tbbge','tbblt','tbbgt','tbble',
+ 'tbheq','tbhne','tbhcs','tbhhs','tbhcc','tbhlo','tbhmi','tbhpl','tbhvs','tbhvc','tbhhi','tbhls','tbhge','tbhlt','tbhgt','tbhle'
+ ),
+ /* Unconditional Syncronization Instructions */
+ 9 => array(
+ /* Synchronization: Unconditional Loads, Stores and Barriers */
+ 'ldrexd','ldrexdal',
+ 'ldrex','ldrexal',
+ 'ldrexh','ldrexhal',
+ 'ldrexb','ldrexbal',
+ 'strexd','strexdal',
+ 'strex','strexal',
+ 'strexh','strexhal',
+ 'strexb','strexbal',
+ 'clrex','clrexal',
+ 'swp','swpal',
+ 'swpb','swpbal',
+ 'dbc','dbcal',
+ 'dsb','dsbal',
+ 'isb','isbal',
+ 'yield.w','yieldal.w',
+ 'yield','yieldal',
+ 'nop.w','nopal.w',
+ 'nop','nopal'
+ ),
+ /* Conditional Syncronization Instructions */
+ 10 => array(
+ /* Synchronization: Conditional Loads, Stores and Barriers */
+ 'ldrexdeq','ldrexdne','ldrexdcs','ldrexdhs','ldrexdcc','ldrexdlo','ldrexdmi','ldrexdpl','ldrexdvs','ldrexdvc','ldrexdhi','ldrexdls','ldrexdge','ldrexdlt','ldrexdgt','ldrexdle',
+ 'ldrexeq','ldrexne','ldrexcs','ldrexhs','ldrexcc','ldrexlo','ldrexmi','ldrexpl','ldrexvs','ldrexvc','ldrexhi','ldrexls','ldrexge','ldrexlt','ldrexgt','ldrexle',
+ 'ldrexheq','ldrexhne','ldrexhcs','ldrexhhs','ldrexhcc','ldrexhlo','ldrexhmi','ldrexhpl','ldrexhvs','ldrexhvc','ldrexhhi','ldrexhls','ldrexhge','ldrexhlt','ldrexhgt','ldrexhle',
+ 'ldrexbeq','ldrexbne','ldrexbcs','ldrexbhs','ldrexbcc','ldrexblo','ldrexbmi','ldrexbpl','ldrexbvs','ldrexbvc','ldrexbhi','ldrexbls','ldrexbge','ldrexblt','ldrexbgt','ldrexble',
+ 'strexdeq','strexdne','strexdcs','strexdhs','strexdcc','strexdlo','strexdmi','strexdpl','strexdvs','strexdvc','strexdhi','strexdls','strexdge','strexdlt','strexdgt','strexdle',
+ 'strexeq','strexne','strexcs','strexhs','strexcc','strexlo','strexmi','strexpl','strexvs','strexvc','strexhi','strexls','strexge','strexlt','strexgt','strexle',
+ 'strexheq','strexhne','strexhcs','strexhhs','strexhcc','strexhlo','strexhmi','strexhpl','strexhvs','strexhvc','strexhhi','strexhls','strexhge','strexhlt','strexhgt','strexhle',
+ 'strexbeq','strexbne','strexbcs','strexbhs','strexbcc','strexblo','strexbmi','strexbpl','strexbvs','strexbvc','strexbhi','strexbls','strexbge','strexblt','strexbgt','strexble',
+ 'clrexeq','clrexne','clrexcs','clrexhs','clrexcc','clrexlo','clrexmi','clrexpl','clrexvs','clrexvc','clrexhi','clrexls','clrexge','clrexlt','clrexgt','clrexle',
+ 'swpeq','swpne','swpcs','swphs','swpcc','swplo','swpmi','swppl','swpvs','swpvc','swphi','swpls','swpge','swplt','swpgt','swple',
+ 'swpbeq','swpbne','swpbcs','swpbhs','swpbcc','swpblo','swpbmi','swpbpl','swpbvs','swpbvc','swpbhi','swpbls','swpbge','swpblt','swpbgt','swpble',
+ 'dbceq','dbcne','dbccs','dbchs','dbccc','dbclo','dbcmi','dbcpl','dbcvs','dbcvc','dbchi','dbcls','dbcge','dbclt','dbcgt','dbcle',
+ 'dsbeq','dsbne','dsbcs','dsbhs','dsbcc','dsblo','dsbmi','dsbpl','dsbvs','dsbvc','dsbhi','dsbls','dsbge','dsblt','dsbgt','dsble',
+ 'isbeq','isbne','isbcs','isbhs','isbcc','isblo','isbmi','isbpl','isbvs','isbvc','isbhi','isbls','isbge','isblt','isbgt','isble',
+ 'yieldeq.w','yieldne.w','yieldcs.w','yieldhs.w','yieldcc.w','yieldlo.w','yieldmi.w','yieldpl.w','yieldvs.w','yieldvc.w','yieldhi.w','yieldls.w','yieldge.w','yieldlt.w','yieldgt.w','yieldle.w',
+ 'yieldeq','yieldne','yieldcs','yieldhs','yieldcc','yieldlo','yieldmi','yieldpl','yieldvs','yieldvc','yieldhi','yieldls','yieldge','yieldlt','yieldgt','yieldle',
+ 'nopeq.w','nopne.w','nopcs.w','nophs.w','nopcc.w','noplo.w','nopmi.w','noppl.w','nopvs.w','nopvc.w','nophi.w','nopls.w','nopge.w','noplt.w','nopgt.w','nople.w',
+ 'nopeq','nopne','nopcs','nophs','nopcc','noplo','nopmi','noppl','nopvs','nopvc','nophi','nopls','nopge','noplt','nopgt','nople'
+ ),
+ /* Unconditional ARMv6 SIMD */
+ 11 => array(
+ /* ARMv6 SIMD: Unconditional Addition, Subtraction & Saturation */
+ 'sadd16','sadd16al',
+ 'sadd8','sadd8al',
+ 'uadd16','uadd16al',
+ 'uadd8','uadd8al',
+ 'ssub16','ssub16al',
+ 'ssub8','ssub8al',
+ 'usub16','usub16al',
+ 'usub8','usub8al',
+ 'sasx','sasxal',
+ 'ssax','ssaxal',
+ 'uasx','uasxal',
+ 'usax','usaxal',
+ 'usad8','usad8al',
+ 'usada8','usada8al',
+ /* ARMv6 SIMD: Unconditional Halving Addition & Subtraction */
+ 'shadd16','shadd16al',
+ 'shadd8','shadd8al',
+ 'uhadd16','uhadd16al',
+ 'uhadd8','uhadd8al',
+ 'shsub16','shsub16al',
+ 'shsub8','shsub8al',
+ 'uhsub16','uhsub16al',
+ 'uhsub8','uhsub8al',
+ 'shasx','shasxal',
+ 'shsax','shsaxal',
+ 'uhasx','uhasxal',
+ 'uhsax','uhsaxal',
+ /* ARMv6 SIMD: Unconditional Saturating Operations */
+ 'qadd','qaddal',
+ 'qadd16','qadd16al',
+ 'qadd8','qadd8al',
+ 'uqadd16','uqadd16al',
+ 'uqadd8','uqadd8al',
+ 'qsub','qsubal',
+ 'qsub16','qsub16al',
+ 'qsub8','qsub8al',
+ 'uqsub16','uqsub16al',
+ 'uqsub8','uqsub8al',
+ 'qasx','qasxal',
+ 'qsax','qsaxal',
+ 'uqasx','uqasxal',
+ 'uqsax','uqsaxal',
+ 'qdadd','qdaddal',
+ 'qdsub','qdsubal',
+ 'ssat','ssatal',
+ 'ssat16','ssat16al',
+ 'usat','usatal',
+ 'usat16','usat16al',
+ /* ARMv6 SIMD: Unconditional Permutation and Combine Operations */
+ 'sxtah','sxtahal',
+ 'sxtab','sxtabal',
+ 'sxtab16','sxtab16al',
+ 'uxtah','uxtahal',
+ 'uxtab','uxtabal',
+ 'uxtab16','uxtab16al',
+ 'sxth.w','sxthal.w',
+ 'sxth','sxthal',
+ 'sxtb.w','sxtbal.w',
+ 'sxtb','sxtbal',
+ 'sxtb16','sxtb16al',
+ 'uxth.w','uxthal.w',
+ 'uxth','uxthal',
+ 'uxtb.w','uxtbal.w',
+ 'uxtb','uxtbal',
+ 'uxtb16','uxtb16al',
+ 'pkhbt','pkhbtal',
+ 'pkhtb','pkhtbal',
+ 'rbit','rbital',
+ 'rev.w','reval.w',
+ 'rev','reval',
+ 'rev16.w','rev16al.w',
+ 'rev16','rev16al',
+ 'revsh.w','revshal.w',
+ 'revsh','revshal',
+ 'sel','selal',
+ /* ARMv6 SIMD: Unconditional Multiply and Multiply-Add */
+ 'smlad','smladal',
+ 'smladx','smladxal',
+ 'smlsd','smlsdal',
+ 'smlsdx','smlsdxal',
+ 'smlald','smlaldal',
+ 'smlaldx','smlaldxal',
+ 'smlsld','smlsldal',
+ 'smlsldx','smlsldxal',
+ 'smmul','smmulal',
+ 'smmulr','smmulral',
+ 'smmla','smmlaal',
+ 'smmlar','smmlaral',
+ 'smmls','smmlsal',
+ 'smmlsr','smmlsral',
+ 'smuad','smuadal',
+ 'smuadx','smuadxal',
+ 'smusd','smusdal',
+ 'smusdx','smusdxal',
+ 'umaal','umaalal'
+ ),
+ /* Conditional ARMv6 SIMD */
+ 12 => array(
+ /* ARMv6 SIMD: Conditional Addition, Subtraction & Saturation */
+ 'sadd16eq','sadd16ne','sadd16cs','sadd16hs','sadd16cc','sadd16lo','sadd16mi','sadd16pl','sadd16vs','sadd16vc','sadd16hi','sadd16ls','sadd16ge','sadd16lt','sadd16gt','sadd16le',
+ 'sadd8eq','sadd8ne','sadd8cs','sadd8hs','sadd8cc','sadd8lo','sadd8mi','sadd8pl','sadd8vs','sadd8vc','sadd8hi','sadd8ls','sadd8ge','sadd8lt','sadd8gt','sadd8le',
+ 'uadd16eq','uadd16ne','uadd16cs','uadd16hs','uadd16cc','uadd16lo','uadd16mi','uadd16pl','uadd16vs','uadd16vc','uadd16hi','uadd16ls','uadd16ge','uadd16lt','uadd16gt','uadd16le',
+ 'uadd8eq','uadd8ne','uadd8cs','uadd8hs','uadd8cc','uadd8lo','uadd8mi','uadd8pl','uadd8vs','uadd8vc','uadd8hi','uadd8ls','uadd8ge','uadd8lt','uadd8gt','uadd8le',
+ 'ssub16eq','ssub16ne','ssub16cs','ssub16hs','ssub16cc','ssub16lo','ssub16mi','ssub16pl','ssub16vs','ssub16vc','ssub16hi','ssub16ls','ssub16ge','ssub16lt','ssub16gt','ssub16le',
+ 'ssub8eq','ssub8ne','ssub8cs','ssub8hs','ssub8cc','ssub8lo','ssub8mi','ssub8pl','ssub8vs','ssub8vc','ssub8hi','ssub8ls','ssub8ge','ssub8lt','ssub8gt','ssub8le',
+ 'usub16eq','usub16ne','usub16cs','usub16hs','usub16cc','usub16lo','usub16mi','usub16pl','usub16vs','usub16vc','usub16hi','usub16ls','usub16ge','usub16lt','usub16gt','usub16le',
+ 'usub8eq','usub8ne','usub8cs','usub8hs','usub8cc','usub8lo','usub8mi','usub8pl','usub8vs','usub8vc','usub8hi','usub8ls','usub8ge','usub8lt','usub8gt','usub8le',
+ 'sasxeq','sasxne','sasxcs','sasxhs','sasxcc','sasxlo','sasxmi','sasxpl','sasxvs','sasxvc','sasxhi','sasxls','sasxge','sasxlt','sasxgt','sasxle',
+ 'ssaxeq','ssaxne','ssaxcs','ssaxhs','ssaxcc','ssaxlo','ssaxmi','ssaxpl','ssaxvs','ssaxvc','ssaxhi','ssaxls','ssaxge','ssaxlt','ssaxgt','ssaxle',
+ 'uasxeq','uasxne','uasxcs','uasxhs','uasxcc','uasxlo','uasxmi','uasxpl','uasxvs','uasxvc','uasxhi','uasxls','uasxge','uasxlt','uasxgt','uasxle',
+ 'usaxeq','usaxne','usaxcs','usaxhs','usaxcc','usaxlo','usaxmi','usaxpl','usaxvs','usaxvc','usaxhi','usaxls','usaxge','usaxlt','usaxgt','usaxle',
+ 'usad8eq','usad8ne','usad8cs','usad8hs','usad8cc','usad8lo','usad8mi','usad8pl','usad8vs','usad8vc','usad8hi','usad8ls','usad8ge','usad8lt','usad8gt','usad8le',
+ 'usada8eq','usada8ne','usada8cs','usada8hs','usada8cc','usada8lo','usada8mi','usada8pl','usada8vs','usada8vc','usada8hi','usada8ls','usada8ge','usada8lt','usada8gt','usada8le',
+ /* ARMv6 SIMD: Conditional Halving Addition & Subtraction */
+ 'shadd16eq','shadd16ne','shadd16cs','shadd16hs','shadd16cc','shadd16lo','shadd16mi','shadd16pl','shadd16vs','shadd16vc','shadd16hi','shadd16ls','shadd16ge','shadd16lt','shadd16gt','shadd16le',
+ 'shadd8eq','shadd8ne','shadd8cs','shadd8hs','shadd8cc','shadd8lo','shadd8mi','shadd8pl','shadd8vs','shadd8vc','shadd8hi','shadd8ls','shadd8ge','shadd8lt','shadd8gt','shadd8le',
+ 'uhadd16eq','uhadd16ne','uhadd16cs','uhadd16hs','uhadd16cc','uhadd16lo','uhadd16mi','uhadd16pl','uhadd16vs','uhadd16vc','uhadd16hi','uhadd16ls','uhadd16ge','uhadd16lt','uhadd16gt','uhadd16le',
+ 'uhadd8eq','uhadd8ne','uhadd8cs','uhadd8hs','uhadd8cc','uhadd8lo','uhadd8mi','uhadd8pl','uhadd8vs','uhadd8vc','uhadd8hi','uhadd8ls','uhadd8ge','uhadd8lt','uhadd8gt','uhadd8le',
+ 'shsub16eq','shsub16ne','shsub16cs','shsub16hs','shsub16cc','shsub16lo','shsub16mi','shsub16pl','shsub16vs','shsub16vc','shsub16hi','shsub16ls','shsub16ge','shsub16lt','shsub16gt','shsub16le',
+ 'shsub8eq','shsub8ne','shsub8cs','shsub8hs','shsub8cc','shsub8lo','shsub8mi','shsub8pl','shsub8vs','shsub8vc','shsub8hi','shsub8ls','shsub8ge','shsub8lt','shsub8gt','shsub8le',
+ 'uhsub16eq','uhsub16ne','uhsub16cs','uhsub16hs','uhsub16cc','uhsub16lo','uhsub16mi','uhsub16pl','uhsub16vs','uhsub16vc','uhsub16hi','uhsub16ls','uhsub16ge','uhsub16lt','uhsub16gt','uhsub16le',
+ 'uhsub8eq','uhsub8ne','uhsub8cs','uhsub8hs','uhsub8cc','uhsub8lo','uhsub8mi','uhsub8pl','uhsub8vs','uhsub8vc','uhsub8hi','uhsub8ls','uhsub8ge','uhsub8lt','uhsub8gt','uhsub8le',
+ 'shasxeq','shasxne','shasxcs','shasxhs','shasxcc','shasxlo','shasxmi','shasxpl','shasxvs','shasxvc','shasxhi','shasxls','shasxge','shasxlt','shasxgt','shasxle',
+ 'shsaxeq','shsaxne','shsaxcs','shsaxhs','shsaxcc','shsaxlo','shsaxmi','shsaxpl','shsaxvs','shsaxvc','shsaxhi','shsaxls','shsaxge','shsaxlt','shsaxgt','shsaxle',
+ 'uhasxeq','uhasxne','uhasxcs','uhasxhs','uhasxcc','uhasxlo','uhasxmi','uhasxpl','uhasxvs','uhasxvc','uhasxhi','uhasxls','uhasxge','uhasxlt','uhasxgt','uhasxle',
+ 'uhsaxeq','uhsaxne','uhsaxcs','uhsaxhs','uhsaxcc','uhsaxlo','uhsaxmi','uhsaxpl','uhsaxvs','uhsaxvc','uhsaxhi','uhsaxls','uhsaxge','uhsaxlt','uhsaxgt','uhsaxle',
+ /* ARMv6 SIMD: Conditional Saturating Operations */
+ 'qaddeq','qaddne','qaddcs','qaddhs','qaddcc','qaddlo','qaddmi','qaddpl','qaddvs','qaddvc','qaddhi','qaddls','qaddge','qaddlt','qaddgt','qaddle',
+ 'qadd16eq','qadd16ne','qadd16cs','qadd16hs','qadd16cc','qadd16lo','qadd16mi','qadd16pl','qadd16vs','qadd16vc','qadd16hi','qadd16ls','qadd16ge','qadd16lt','qadd16gt','qadd16le',
+ 'qadd8eq','qadd8ne','qadd8cs','qadd8hs','qadd8cc','qadd8lo','qadd8mi','qadd8pl','qadd8vs','qadd8vc','qadd8hi','qadd8ls','qadd8ge','qadd8lt','qadd8gt','qadd8le',
+ 'uqadd16eq','uqadd16ne','uqadd16cs','uqadd16hs','uqadd16cc','uqadd16lo','uqadd16mi','uqadd16pl','uqadd16vs','uqadd16vc','uqadd16hi','uqadd16ls','uqadd16ge','uqadd16lt','uqadd16gt','uqadd16le',
+ 'uqadd8eq','uqadd8ne','uqadd8cs','uqadd8hs','uqadd8cc','uqadd8lo','uqadd8mi','uqadd8pl','uqadd8vs','uqadd8vc','uqadd8hi','uqadd8ls','uqadd8ge','uqadd8lt','uqadd8gt','uqadd8le',
+ 'qsubeq','qsubne','qsubcs','qsubhs','qsubcc','qsublo','qsubmi','qsubpl','qsubvs','qsubvc','qsubhi','qsubls','qsubge','qsublt','qsubgt','qsuble',
+ 'qsub16eq','qsub16ne','qsub16cs','qsub16hs','qsub16cc','qsub16lo','qsub16mi','qsub16pl','qsub16vs','qsub16vc','qsub16hi','qsub16ls','qsub16ge','qsub16lt','qsub16gt','qsub16le',
+ 'qsub8eq','qsub8ne','qsub8cs','qsub8hs','qsub8cc','qsub8lo','qsub8mi','qsub8pl','qsub8vs','qsub8vc','qsub8hi','qsub8ls','qsub8ge','qsub8lt','qsub8gt','qsub8le',
+ 'uqsub16eq','uqsub16ne','uqsub16cs','uqsub16hs','uqsub16cc','uqsub16lo','uqsub16mi','uqsub16pl','uqsub16vs','uqsub16vc','uqsub16hi','uqsub16ls','uqsub16ge','uqsub16lt','uqsub16gt','uqsub16le',
+ 'uqsub8eq','uqsub8ne','uqsub8cs','uqsub8hs','uqsub8cc','uqsub8lo','uqsub8mi','uqsub8pl','uqsub8vs','uqsub8vc','uqsub8hi','uqsub8ls','uqsub8ge','uqsub8lt','uqsub8gt','uqsub8le',
+ 'qasxeq','qasxne','qasxcs','qasxhs','qasxcc','qasxlo','qasxmi','qasxpl','qasxvs','qasxvc','qasxhi','qasxls','qasxge','qasxlt','qasxgt','qasxle',
+ 'qsaxeq','qsaxne','qsaxcs','qsaxhs','qsaxcc','qsaxlo','qsaxmi','qsaxpl','qsaxvs','qsaxvc','qsaxhi','qsaxls','qsaxge','qsaxlt','qsaxgt','qsaxle',
+ 'uqasxeq','uqasxne','uqasxcs','uqasxhs','uqasxcc','uqasxlo','uqasxmi','uqasxpl','uqasxvs','uqasxvc','uqasxhi','uqasxls','uqasxge','uqasxlt','uqasxgt','uqasxle',
+ 'uqsaxeq','uqsaxne','uqsaxcs','uqsaxhs','uqsaxcc','uqsaxlo','uqsaxmi','uqsaxpl','uqsaxvs','uqsaxvc','uqsaxhi','uqsaxls','uqsaxge','uqsaxlt','uqsaxgt','uqsaxle',
+ 'qdaddeq','qdaddne','qdaddcs','qdaddhs','qdaddcc','qdaddlo','qdaddmi','qdaddpl','qdaddvs','qdaddvc','qdaddhi','qdaddls','qdaddge','qdaddlt','qdaddgt','qdaddle',
+ 'qdsubeq','qdsubne','qdsubcs','qdsubhs','qdsubcc','qdsublo','qdsubmi','qdsubpl','qdsubvs','qdsubvc','qdsubhi','qdsubls','qdsubge','qdsublt','qdsubgt','qdsuble',
+ 'ssateq','ssatne','ssatcs','ssaths','ssatcc','ssatlo','ssatmi','ssatpl','ssatvs','ssatvc','ssathi','ssatls','ssatge','ssatlt','ssatgt','ssatle',
+ 'ssat16eq','ssat16ne','ssat16cs','ssat16hs','ssat16cc','ssat16lo','ssat16mi','ssat16pl','ssat16vs','ssat16vc','ssat16hi','ssat16ls','ssat16ge','ssat16lt','ssat16gt','ssat16le',
+ 'usateq','usatne','usatcs','usaths','usatcc','usatlo','usatmi','usatpl','usatvs','usatvc','usathi','usatls','usatge','usatlt','usatgt','usatle',
+ 'usat16eq','usat16ne','usat16cs','usat16hs','usat16cc','usat16lo','usat16mi','usat16pl','usat16vs','usat16vc','usat16hi','usat16ls','usat16ge','usat16lt','usat16gt','usat16le',
+ /* ARMv6 SIMD: Conditional Permutation and Combine Operations */
+ 'sxtaheq','sxtahne','sxtahcs','sxtahhs','sxtahcc','sxtahlo','sxtahmi','sxtahpl','sxtahvs','sxtahvc','sxtahhi','sxtahls','sxtahge','sxtahlt','sxtahgt','sxtahle',
+ 'sxtabeq','sxtabne','sxtabcs','sxtabhs','sxtabcc','sxtablo','sxtabmi','sxtabpl','sxtabvs','sxtabvc','sxtabhi','sxtabls','sxtabge','sxtablt','sxtabgt','sxtable',
+ 'sxtab16eq','sxtab16ne','sxtab16cs','sxtab16hs','sxtab16cc','sxtab16lo','sxtab16mi','sxtab16pl','sxtab16vs','sxtab16vc','sxtab16hi','sxtab16ls','sxtab16ge','sxtab16lt','sxtab16gt','sxtab16le',
+ 'uxtaheq','uxtahne','uxtahcs','uxtahhs','uxtahcc','uxtahlo','uxtahmi','uxtahpl','uxtahvs','uxtahvc','uxtahhi','uxtahls','uxtahge','uxtahlt','uxtahgt','uxtahle',
+ 'uxtabeq','uxtabne','uxtabcs','uxtabhs','uxtabcc','uxtablo','uxtabmi','uxtabpl','uxtabvs','uxtabvc','uxtabhi','uxtabls','uxtabge','uxtablt','uxtabgt','uxtable',
+ 'uxtab16eq','uxtab16ne','uxtab16cs','uxtab16hs','uxtab16cc','uxtab16lo','uxtab16mi','uxtab16pl','uxtab16vs','uxtab16vc','uxtab16hi','uxtab16ls','uxtab16ge','uxtab16lt','uxtab16gt','uxtab16le',
+ 'sxtheq.w','sxthne.w','sxthcs.w','sxthhs.w','sxthcc.w','sxthlo.w','sxthmi.w','sxthpl.w','sxthvs.w','sxthvc.w','sxthhi.w','sxthls.w','sxthge.w','sxthlt.w','sxthgt.w','sxthle.w',
+ 'sxtheq','sxthne','sxthcs','sxthhs','sxthcc','sxthlo','sxthmi','sxthpl','sxthvs','sxthvc','sxthhi','sxthls','sxthge','sxthlt','sxthgt','sxthle',
+ 'sxtbeq.w','sxtbne.w','sxtbcs.w','sxtbhs.w','sxtbcc.w','sxtblo.w','sxtbmi.w','sxtbpl.w','sxtbvs.w','sxtbvc.w','sxtbhi.w','sxtbls.w','sxtbge.w','sxtblt.w','sxtbgt.w','sxtble.w',
+ 'sxtbeq','sxtbne','sxtbcs','sxtbhs','sxtbcc','sxtblo','sxtbmi','sxtbpl','sxtbvs','sxtbvc','sxtbhi','sxtbls','sxtbge','sxtblt','sxtbgt','sxtble',
+ 'sxtb16eq','sxtb16ne','sxtb16cs','sxtb16hs','sxtb16cc','sxtb16lo','sxtb16mi','sxtb16pl','sxtb16vs','sxtb16vc','sxtb16hi','sxtb16ls','sxtb16ge','sxtb16lt','sxtb16gt','sxtb16le',
+ 'uxtheq.w','uxthne.w','uxthcs.w','uxthhs.w','uxthcc.w','uxthlo.w','uxthmi.w','uxthpl.w','uxthvs.w','uxthvc.w','uxthhi.w','uxthls.w','uxthge.w','uxthlt.w','uxthgt.w','uxthle.w',
+ 'uxtheq','uxthne','uxthcs','uxthhs','uxthcc','uxthlo','uxthmi','uxthpl','uxthvs','uxthvc','uxthhi','uxthls','uxthge','uxthlt','uxthgt','uxthle',
+ 'uxtbeq.w','uxtbne.w','uxtbcs.w','uxtbhs.w','uxtbcc.w','uxtblo.w','uxtbmi.w','uxtbpl.w','uxtbvs.w','uxtbvc.w','uxtbhi.w','uxtbls.w','uxtbge.w','uxtblt.w','uxtbgt.w','uxtble.w',
+ 'uxtbeq','uxtbne','uxtbcs','uxtbhs','uxtbcc','uxtblo','uxtbmi','uxtbpl','uxtbvs','uxtbvc','uxtbhi','uxtbls','uxtbge','uxtblt','uxtbgt','uxtble',
+ 'uxtb16eq','uxtb16ne','uxtb16cs','uxtb16hs','uxtb16cc','uxtb16lo','uxtb16mi','uxtb16pl','uxtb16vs','uxtb16vc','uxtb16hi','uxtb16ls','uxtb16ge','uxtb16lt','uxtb16gt','uxtb16le',
+ 'pkhbteq','pkhbtne','pkhbtcs','pkhbths','pkhbtcc','pkhbtlo','pkhbtmi','pkhbtpl','pkhbtvs','pkhbtvc','pkhbthi','pkhbtls','pkhbtge','pkhbtlt','pkhbtgt','pkhbtle',
+ 'pkhtbeq','pkhtbne','pkhtbcs','pkhtbhs','pkhtbcc','pkhtblo','pkhtbmi','pkhtbpl','pkhtbvs','pkhtbvc','pkhtbhi','pkhtbls','pkhtbge','pkhtblt','pkhtbgt','pkhtble',
+ 'rbiteq','rbitne','rbitcs','rbiths','rbitcc','rbitlo','rbitmi','rbitpl','rbitvs','rbitvc','rbithi','rbitls','rbitge','rbitlt','rbitgt','rbitle',
+ 'reveq.w','revne.w','revcs.w','revhs.w','revcc.w','revlo.w','revmi.w','revpl.w','revvs.w','revvc.w','revhi.w','revls.w','revge.w','revlt.w','revgt.w','revle.w',
+ 'reveq','revne','revcs','revhs','revcc','revlo','revmi','revpl','revvs','revvc','revhi','revls','revge','revlt','revgt','revle',
+ 'rev16eq.w','rev16ne.w','rev16cs.w','rev16hs.w','rev16cc.w','rev16lo.w','rev16mi.w','rev16pl.w','rev16vs.w','rev16vc.w','rev16hi.w','rev16ls.w','rev16ge.w','rev16lt.w','rev16gt.w','rev16le.w',
+ 'rev16eq','rev16ne','rev16cs','rev16hs','rev16cc','rev16lo','rev16mi','rev16pl','rev16vs','rev16vc','rev16hi','rev16ls','rev16ge','rev16lt','rev16gt','rev16le',
+ 'revsheq.w','revshne.w','revshcs.w','revshhs.w','revshcc.w','revshlo.w','revshmi.w','revshpl.w','revshvs.w','revshvc.w','revshhi.w','revshls.w','revshge.w','revshlt.w','revshgt.w','revshle.w',
+ 'revsheq','revshne','revshcs','revshhs','revshcc','revshlo','revshmi','revshpl','revshvs','revshvc','revshhi','revshls','revshge','revshlt','revshgt','revshle',
+ 'seleq','selne','selcs','selhs','selcc','sello','selmi','selpl','selvs','selvc','selhi','sells','selge','sellt','selgt','selle',
+ /* ARMv6 SIMD: Conditional Multiply and Multiply-Add */
+ 'smladeq','smladne','smladcs','smladhs','smladcc','smladlo','smladmi','smladpl','smladvs','smladvc','smladhi','smladls','smladge','smladlt','smladgt','smladle',
+ 'smladxeq','smladxne','smladxcs','smladxhs','smladxcc','smladxlo','smladxmi','smladxpl','smladxvs','smladxvc','smladxhi','smladxls','smladxge','smladxlt','smladxgt','smladxle',
+ 'smlsdeq','smlsdne','smlsdcs','smlsdhs','smlsdcc','smlsdlo','smlsdmi','smlsdpl','smlsdvs','smlsdvc','smlsdhi','smlsdls','smlsdge','smlsdlt','smlsdgt','smlsdle',
+ 'smlsdxeq','smlsdxne','smlsdxcs','smlsdxhs','smlsdxcc','smlsdxlo','smlsdxmi','smlsdxpl','smlsdxvs','smlsdxvc','smlsdxhi','smlsdxls','smlsdxge','smlsdxlt','smlsdxgt','smlsdxle',
+ 'smlaldeq','smlaldne','smlaldcs','smlaldhs','smlaldcc','smlaldlo','smlaldmi','smlaldpl','smlaldvs','smlaldvc','smlaldhi','smlaldls','smlaldge','smlaldlt','smlaldgt','smlaldle',
+ 'smlaldxeq','smlaldxne','smlaldxcs','smlaldxhs','smlaldxcc','smlaldxlo','smlaldxmi','smlaldxpl','smlaldxvs','smlaldxvc','smlaldxhi','smlaldxls','smlaldxge','smlaldxlt','smlaldxgt','smlaldxle',
+ 'smlsldeq','smlsldne','smlsldcs','smlsldhs','smlsldcc','smlsldlo','smlsldmi','smlsldpl','smlsldvs','smlsldvc','smlsldhi','smlsldls','smlsldge','smlsldlt','smlsldgt','smlsldle',
+ 'smlsldxeq','smlsldxne','smlsldxcs','smlsldxhs','smlsldxcc','smlsldxlo','smlsldxmi','smlsldxpl','smlsldxvs','smlsldxvc','smlsldxhi','smlsldxls','smlsldxge','smlsldxlt','smlsldxgt','smlsldxle',
+ 'smmuleq','smmulne','smmulcs','smmulhs','smmulcc','smmullo','smmulmi','smmulpl','smmulvs','smmulvc','smmulhi','smmulls','smmulge','smmullt','smmulgt','smmulle',
+ 'smmulreq','smmulrne','smmulrcs','smmulrhs','smmulrcc','smmulrlo','smmulrmi','smmulrpl','smmulrvs','smmulrvc','smmulrhi','smmulrls','smmulrge','smmulrlt','smmulrgt','smmulrle',
+ 'smmlaeq','smmlane','smmlacs','smmlahs','smmlacc','smmlalo','smmlami','smmlapl','smmlavs','smmlavc','smmlahi','smmlals','smmlage','smmlalt','smmlagt','smmlale',
+ 'smmlareq','smmlarne','smmlarcs','smmlarhs','smmlarcc','smmlarlo','smmlarmi','smmlarpl','smmlarvs','smmlarvc','smmlarhi','smmlarls','smmlarge','smmlarlt','smmlargt','smmlarle',
+ 'smmlseq','smmlsne','smmlscs','smmlshs','smmlscc','smmlslo','smmlsmi','smmlspl','smmlsvs','smmlsvc','smmlshi','smmlsls','smmlsge','smmlslt','smmlsgt','smmlsle',
+ 'smmlsreq','smmlsrne','smmlsrcs','smmlsrhs','smmlsrcc','smmlsrlo','smmlsrmi','smmlsrpl','smmlsrvs','smmlsrvc','smmlsrhi','smmlsrls','smmlsrge','smmlsrlt','smmlsrgt','smmlsrle',
+ 'smuadeq','smuadne','smuadcs','smuadhs','smuadcc','smuadlo','smuadmi','smuadpl','smuadvs','smuadvc','smuadhi','smuadls','smuadge','smuadlt','smuadgt','smuadle',
+ 'smuadxeq','smuadxne','smuadxcs','smuadxhs','smuadxcc','smuadxlo','smuadxmi','smuadxpl','smuadxvs','smuadxvc','smuadxhi','smuadxls','smuadxge','smuadxlt','smuadxgt','smuadxle',
+ 'smusdeq','smusdne','smusdcs','smusdhs','smusdcc','smusdlo','smusdmi','smusdpl','smusdvs','smusdvc','smusdhi','smusdls','smusdge','smusdlt','smusdgt','smusdle',
+ 'smusdxeq','smusdxne','smusdxcs','smusdxhs','smusdxcc','smusdxlo','smusdxmi','smusdxpl','smusdxvs','smusdxvc','smusdxhi','smusdxls','smusdxge','smusdxlt','smusdxgt','smusdxle',
+ 'umaaleq','umaalne','umaalcs','umaalhs','umaalcc','umaallo','umaalmi','umaalpl','umaalvs','umaalvc','umaalhi','umaalls','umaalge','umaallt','umaalgt','umaalle'
+ ),
+ /* Unconditional Coprocessor Instructions */
+ 13 => array(
+ /* Data Processing: Unconditional Coprocessor Instructions */
+ 'cdp','cdpal',
+ 'cdp2','cdp2al',
+ 'ldc','ldcal',
+ 'ldcl','ldclal',
+ 'ldc2','ldc2al',
+ 'ldc2l','ldc2lal',
+ 'stc','stcal',
+ 'stcl','stclal',
+ 'stc2','stc2al',
+ 'stc2l','stc2lal',
+ 'mcr','mcral',
+ 'mcr2','mcr2al',
+ 'mcrr','mcrral',
+ 'mcrr2','mcrr2al',
+ 'mrc','mrcal',
+ 'mrc2','mrc2al',
+ 'mrrc','mrrcal',
+ 'mrrc2','mrrc2al'
+ ),
+ /* Conditional Coprocessor Instructions */
+ 14 => array(
+ /* Data Processing: Conditional Coprocessor Instructions */
+ 'cdpeq','cdpne','cdpcs','cdphs','cdpcc','cdplo','cdpmi','cdppl','cdpvs','cdpvc','cdphi','cdpls','cdpge','cdplt','cdpgt','cdple',
+ 'cdp2eq','cdp2ne','cdp2cs','cdp2hs','cdp2cc','cdp2lo','cdp2mi','cdp2pl','cdp2vs','cdp2vc','cdp2hi','cdp2ls','cdp2ge','cdp2lt','cdp2gt','cdp2le',
+ 'ldceq','ldcne','ldccs','ldchs','ldccc','ldclo','ldcmi','ldcpl','ldcvs','ldcvc','ldchi','ldcls','ldcge','ldclt','ldcgt','ldcle',
+ 'ldcleq','ldclne','ldclcs','ldclhs','ldclcc','ldcllo','ldclmi','ldclpl','ldclvs','ldclvc','ldclhi','ldclls','ldclge','ldcllt','ldclgt','ldclle',
+ 'ldc2eq','ldc2ne','ldc2cs','ldc2hs','ldc2cc','ldc2lo','ldc2mi','ldc2pl','ldc2vs','ldc2vc','ldc2hi','ldc2ls','ldc2ge','ldc2lt','ldc2gt','ldc2le',
+ 'ldc2leq','ldc2lne','ldc2lcs','ldc2lhs','ldc2lcc','ldc2llo','ldc2lmi','ldc2lpl','ldc2lvs','ldc2lvc','ldc2lhi','ldc2lls','ldc2lge','ldc2llt','ldc2lgt','ldc2lle',
+ 'stceq','stcne','stccs','stchs','stccc','stclo','stcmi','stcpl','stcvs','stcvc','stchi','stcls','stcge','stclt','stcgt','stcle',
+ 'stcleq','stclne','stclcs','stclhs','stclcc','stcllo','stclmi','stclpl','stclvs','stclvc','stclhi','stclls','stclge','stcllt','stclgt','stclle',
+ 'stc2eq','stc2ne','stc2cs','stc2hs','stc2cc','stc2lo','stc2mi','stc2pl','stc2vs','stc2vc','stc2hi','stc2ls','stc2ge','stc2lt','stc2gt','stc2le',
+ 'stc2leq','stc2lne','stc2lcs','stc2lhs','stc2lcc','stc2llo','stc2lmi','stc2lpl','stc2lvs','stc2lvc','stc2lhi','stc2lls','stc2lge','stc2llt','stc2lgt','stc2lle',
+ 'mcreq','mcrne','mcrcs','mcrhs','mcrcc','mcrlo','mcrmi','mcrpl','mcrvs','mcrvc','mcrhi','mcrls','mcrge','mcrlt','mcrgt','mcrle',
+ 'mcr2eq','mcr2ne','mcr2cs','mcr2hs','mcr2cc','mcr2lo','mcr2mi','mcr2pl','mcr2vs','mcr2vc','mcr2hi','mcr2ls','mcr2ge','mcr2lt','mcr2gt','mcr2le',
+ 'mcrreq','mcrrne','mcrrcs','mcrrhs','mcrrcc','mcrrlo','mcrrmi','mcrrpl','mcrrvs','mcrrvc','mcrrhi','mcrrls','mcrrge','mcrrlt','mcrrgt','mcrrle',
+ 'mcrr2eq','mcrr2ne','mcrr2cs','mcrr2hs','mcrr2cc','mcrr2lo','mcrr2mi','mcrr2pl','mcrr2vs','mcrr2vc','mcrr2hi','mcrr2ls','mcrr2ge','mcrr2lt','mcrr2gt','mcrr2le',
+ 'mrceq','mrcne','mrccs','mrchs','mrccc','mrclo','mrcmi','mrcpl','mrcvs','mrcvc','mrchi','mrcls','mrcge','mrclt','mrcgt','mrcle',
+ 'mrc2eq','mrc2ne','mrc2cs','mrc2hs','mrc2cc','mrc2lo','mrc2mi','mrc2pl','mrc2vs','mrc2vc','mrc2hi','mrc2ls','mrc2ge','mrc2lt','mrc2gt','mrc2le',
+ 'mrrceq','mrrcne','mrrccs','mrrchs','mrrccc','mrrclo','mrrcmi','mrrcpl','mrrcvs','mrrcvc','mrrchi','mrrcls','mrrcge','mrrclt','mrrcgt','mrrcle',
+ 'mrrc2eq','mrrc2ne','mrrc2cs','mrrc2hs','mrrc2cc','mrrc2lo','mrrc2mi','mrrc2pl','mrrc2vs','mrrc2vc','mrrc2hi','mrrc2ls','mrrc2ge','mrrc2lt','mrrc2gt','mrrc2le'
+ ),
+ /* Unconditional System Instructions */
+ 15 => array(
+ /* System: Unconditional Debug and State-Change Instructions */
+ 'bkpt',
+ 'dbg','dbgal',
+ 'setend',
+ 'svc','svcal',
+ 'sev.w','seval.w',
+ 'sev','seval',
+ 'wfe.w','wfeal.w',
+ 'wfe','wfeal',
+ 'wfi.w','wfial.w',
+ 'wfi','wfial',
+ /* System: Unconditional ThumbEE Instructions */
+ 'enterx',
+ 'leavex',
+ 'chka.n','chkaal.n',
+ 'chka','chkaal',
+ 'hb.n','hbal.n',
+ 'hb','hbal',
+ 'hbl.n','hblal.n',
+ 'hbl','hblal',
+ 'hblp.n','hblpal.n',
+ 'hblp','hblpal',
+ 'hbp.n','hbpal.n',
+ 'hbp','hbpal',
+ /* System: Unconditional Privileged Instructions */
+ 'cpsie.n',
+ 'cpsie.w',
+ 'cpsie',
+ 'cpsid.n',
+ 'cpsid.w',
+ 'cpsid',
+ 'smc','smcal',
+ 'rfeda','rfedaal',
+ 'rfedb','rfedbal',
+ 'rfeia','rfeiaal',
+ 'rfeib','rfeibal',
+ 'srsda','srsdaal',
+ 'srsdb','srsdbal',
+ 'srsia','srsiaal',
+ 'srsib','srsibal'
+ ),
+ /* Conditional System Instructions */
+ 16 => array(
+ /* System: Conditional Debug and State-Change Instructions */
+ 'dbgeq','dbgne','dbgcs','dbghs','dbgcc','dbglo','dbgmi','dbgpl','dbgvs','dbgvc','dbghi','dbgls','dbgge','dbglt','dbggt','dbgle',
+ 'svceq','svcne','svccs','svchs','svccc','svclo','svcmi','svcpl','svcvs','svcvc','svchi','svcls','svcge','svclt','svcgt','svcle',
+ 'seveq.w','sevne.w','sevcs.w','sevhs.w','sevcc.w','sevlo.w','sevmi.w','sevpl.w','sevvs.w','sevvc.w','sevhi.w','sevls.w','sevge.w','sevlt.w','sevgt.w','sevle.w',
+ 'seveq','sevne','sevcs','sevhs','sevcc','sevlo','sevmi','sevpl','sevvs','sevvc','sevhi','sevls','sevge','sevlt','sevgt','sevle',
+ 'wfeeq.w','wfene.w','wfecs.w','wfehs.w','wfecc.w','wfelo.w','wfemi.w','wfepl.w','wfevs.w','wfevc.w','wfehi.w','wfels.w','wfege.w','wfelt.w','wfegt.w','wfele.w',
+ 'wfeeq','wfene','wfecs','wfehs','wfecc','wfelo','wfemi','wfepl','wfevs','wfevc','wfehi','wfels','wfege','wfelt','wfegt','wfele',
+ 'wfieq.w','wfine.w','wfics.w','wfihs.w','wficc.w','wfilo.w','wfimi.w','wfipl.w','wfivs.w','wfivc.w','wfihi.w','wfils.w','wfige.w','wfilt.w','wfigt.w','wfile.w',
+ 'wfieq','wfine','wfics','wfihs','wficc','wfilo','wfimi','wfipl','wfivs','wfivc','wfihi','wfils','wfige','wfilt','wfigt','wfile',
+ /* System: Conditional ThumbEE Instructions */
+ 'chkaeq.n','chkane.n','chkacs.n','chkahs.n','chkacc.n','chkalo.n','chkami.n','chkapl.n','chkavs.n','chkavc.n','chkahi.n','chkals.n','chkage.n','chkalt.n','chkagt.n','chkale.n',
+ 'chkaeq','chkane','chkacs','chkahs','chkacc','chkalo','chkami','chkapl','chkavs','chkavc','chkahi','chkals','chkage','chkalt','chkagt','chkale',
+ 'hbeq.n','hbne.n','hbcs.n','hbhs.n','hbcc.n','hblo.n','hbmi.n','hbpl.n','hbvs.n','hbvc.n','hbhi.n','hbls.n','hbge.n','hblt.n','hbgt.n','hble.n',
+ 'hbeq','hbne','hbcs','hbhs','hbcc','hblo','hbmi','hbpl','hbvs','hbvc','hbhi','hbls','hbge','hblt','hbgt','hble',
+ 'hbleq.n','hblne.n','hblcs.n','hblhs.n','hblcc.n','hbllo.n','hblmi.n','hblpl.n','hblvs.n','hblvc.n','hblhi.n','hblls.n','hblge.n','hbllt.n','hblgt.n','hblle.n',
+ 'hbleq','hblne','hblcs','hblhs','hblcc','hbllo','hblmi','hblpl','hblvs','hblvc','hblhi','hblls','hblge','hbllt','hblgt','hblle',
+ 'hblpeq.n','hblpne.n','hblpcs.n','hblphs.n','hblpcc.n','hblplo.n','hblpmi.n','hblppl.n','hblpvs.n','hblpvc.n','hblphi.n','hblpls.n','hblpge.n','hblplt.n','hblpgt.n','hblple.n',
+ 'hblpeq','hblpne','hblpcs','hblphs','hblpcc','hblplo','hblpmi','hblppl','hblpvs','hblpvc','hblphi','hblpls','hblpge','hblplt','hblpgt','hblple',
+ 'hbpeq.n','hbpne.n','hbpcs.n','hbphs.n','hbpcc.n','hbplo.n','hbpmi.n','hbppl.n','hbpvs.n','hbpvc.n','hbphi.n','hbpls.n','hbpge.n','hbplt.n','hbpgt.n','hbple.n',
+ 'hbpeq','hbpne','hbpcs','hbphs','hbpcc','hbplo','hbpmi','hbppl','hbpvs','hbpvc','hbphi','hbpls','hbpge','hbplt','hbpgt','hbple',
+ /* System: Conditional Privileged Instructions */
+ 'smceq','smcne','smccs','smchs','smccc','smclo','smcmi','smcpl','smcvs','smcvc','smchi','smcls','smcge','smclt','smcgt','smcle',
+ 'rfedaeq','rfedane','rfedacs','rfedahs','rfedacc','rfedalo','rfedami','rfedapl','rfedavs','rfedavc','rfedahi','rfedals','rfedage','rfedalt','rfedagt','rfedale',
+ 'rfedbeq','rfedbne','rfedbcs','rfedbhs','rfedbcc','rfedblo','rfedbmi','rfedbpl','rfedbvs','rfedbvc','rfedbhi','rfedbls','rfedbge','rfedblt','rfedbgt','rfedble',
+ 'rfeiaeq','rfeiane','rfeiacs','rfeiahs','rfeiacc','rfeialo','rfeiami','rfeiapl','rfeiavs','rfeiavc','rfeiahi','rfeials','rfeiage','rfeialt','rfeiagt','rfeiale',
+ 'rfeibeq','rfeibne','rfeibcs','rfeibhs','rfeibcc','rfeiblo','rfeibmi','rfeibpl','rfeibvs','rfeibvc','rfeibhi','rfeibls','rfeibge','rfeiblt','rfeibgt','rfeible',
+ 'srsdaeq','srsdane','srsdacs','srsdahs','srsdacc','srsdalo','srsdami','srsdapl','srsdavs','srsdavc','srsdahi','srsdals','srsdage','srsdalt','srsdagt','srsdale',
+ 'srsdbeq','srsdbne','srsdbcs','srsdbhs','srsdbcc','srsdblo','srsdbmi','srsdbpl','srsdbvs','srsdbvc','srsdbhi','srsdbls','srsdbge','srsdblt','srsdbgt','srsdble',
+ 'srsiaeq','srsiane','srsiacs','srsiahs','srsiacc','srsialo','srsiami','srsiapl','srsiavs','srsiavc','srsiahi','srsials','srsiage','srsialt','srsiagt','srsiale',
+ 'srsibeq','srsibne','srsibcs','srsibhs','srsibcc','srsiblo','srsibmi','srsibpl','srsibvs','srsibvc','srsibhi','srsibls','srsibge','srsiblt','srsibgt','srsible'
+ ),
+ /* Unconditional WMMX/WMMX2 instructions */
+ 17 => array(
+ /* Unconditional WMMX/WMMX2 SIMD Instructions */
+ 'tandcb','tandcbal',
+ 'tandch','tandchal',
+ 'tandcw','tandcwal',
+ 'tbcstb','tbcstbal',
+ 'tbcsth','tbcsthal',
+ 'tbcstw','tbcstwal',
+ 'textrcb','textrcbal',
+ 'textrch','textrchal',
+ 'textrcw','textrcwal',
+ 'textrmsb','textrmsbal',
+ 'textrmsh','textrmshal',
+ 'textrmsw','textrmswal',
+ 'textrmub','textrmubal',
+ 'textrmuh','textrmuhal',
+ 'textrmuw','textrmuwal',
+ 'tinsrb','tinsrbal',
+ 'tinsrh','tinsrhal',
+ 'tinsrw','tinsrwal',
+ 'tmcr','tmcral',
+ 'tmcrr','tmcrral',
+ 'tmia','tmiaal',
+ 'tmiaph','tmiaphal',
+ 'tmiabb','tmiabbal',
+ 'tmiabt','tmiabtal',
+ 'tmiatb','tmiatbal',
+ 'tmiatt','tmiattal',
+ 'tmovmskb','tmovmskbal',
+ 'tmovmskh','tmovmskhal',
+ 'tmovmskw','tmovmskwal',
+ 'tmrc','tmrcal',
+ 'tmrrc','tmrrcal',
+ 'torcb','torcbal',
+ 'torch','torchal',
+ 'torcw','torcwal',
+ 'torvscb','torvscbal',
+ 'torvsch','torvschal',
+ 'torvscw','torvscwal',
+ 'wabsb','wabsbal',
+ 'wabsh','wabshal',
+ 'wabsw','wabswal',
+ 'wabsdiffb','wabsdiffbal',
+ 'wabsdiffh','wabsdiffhal',
+ 'wabsdiffw','wabsdiffwal',
+ 'waccb','waccbal',
+ 'wacch','wacchal',
+ 'waccw','waccwal',
+ 'waddb','waddbal',
+ 'waddh','waddhal',
+ 'waddw','waddwal',
+ 'waddbc','waddbcal',
+ 'waddhc','waddhcal',
+ 'waddwc','waddwcal',
+ 'waddbss','waddbssal',
+ 'waddhss','waddhssal',
+ 'waddwss','waddwssal',
+ 'waddbus','waddbusal',
+ 'waddhus','waddhusal',
+ 'waddwus','waddwusal',
+ 'waddsubhx','waddsubhxal',
+ 'waligni','walignial',
+ 'walignr0','walignr0al',
+ 'walignr1','walignr1al',
+ 'walignr2','walignr2al',
+ 'walignr3','walignr3al',
+ 'wand','wandal',
+ 'wandn','wandnal',
+ 'wavg2b','wavg2bal',
+ 'wavg2h','wavg2hal',
+ 'wavg2br','wavg2bral',
+ 'wavg2hr','wavg2hral',
+ 'wavg4','wavg4al',
+ 'wavg4r','wavg4ral',
+ 'wcmpeqb','wcmpeqbal',
+ 'wcmpeqh','wcmpeqhal',
+ 'wcmpeqw','wcmpeqwal',
+ 'wcmpgtsb','wcmpgtsbal',
+ 'wcmpgtsh','wcmpgtshal',
+ 'wcmpgtsw','wcmpgtswal',
+ 'wcmpgtub','wcmpgtubal',
+ 'wcmpgtuh','wcmpgtuhal',
+ 'wcmpgtuw','wcmpgtuwal',
+ 'wldrb','wldrbal',
+ 'wldrh','wldrhal',
+ 'wldrw','wldrwal',
+ 'wldrd','wldrdal',
+ 'wmacs','wmacsal',
+ 'wmacu','wmacual',
+ 'wmacsz','wmacszal',
+ 'wmacuz','wmacuzal',
+ 'wmadds','wmaddsal',
+ 'wmaddu','wmaddual',
+ 'wmaddsx','wmaddsxal',
+ 'wmaddux','wmadduxal',
+ 'wmaddsn','wmaddsnal',
+ 'wmaddun','wmaddunal',
+ 'wmaxsb','wmaxsbal',
+ 'wmaxsh','wmaxshal',
+ 'wmaxsw','wmaxswal',
+ 'wmaxub','wmaxubal',
+ 'wmaxuh','wmaxuhal',
+ 'wmaxuw','wmaxuwal',
+ 'wmerge','wmergeal',
+ 'wmiabb','wmiabbal',
+ 'wmiabt','wmiabtal',
+ 'wmiatb','wmiatbal',
+ 'wmiatt','wmiattal',
+ 'wmiabbn','wmiabbnal',
+ 'wmiabtn','wmiabtnal',
+ 'wmiatbn','wmiatbnal',
+ 'wmiattn','wmiattnal',
+ 'wmiawbb','wmiawbbal',
+ 'wmiawbt','wmiawbtal',
+ 'wmiawtb','wmiawtbal',
+ 'wmiawtt','wmiawttal',
+ 'wmiawbbn','wmiawbbnal',
+ 'wmiawbtn','wmiawbtnal',
+ 'wmiawtbn','wmiawtbnal',
+ 'wmiawttn','wmiawttnal',
+ 'wminsb','wminsbal',
+ 'wminsh','wminshal',
+ 'wminsw','wminswal',
+ 'wminub','wminubal',
+ 'wminuh','wminuhal',
+ 'wminuw','wminuwal',
+ 'wmov','wmoval',
+ 'wmulsm','wmulsmal',
+ 'wmulsl','wmulslal',
+ 'wmulum','wmulumal',
+ 'wmulul','wmululal',
+ 'wmulsmr','wmulsmral',
+ 'wmulslr','wmulslral',
+ 'wmulumr','wmulumral',
+ 'wmululr','wmululral',
+ 'wmulwum','wmulwumal',
+ 'wmulwsm','wmulwsmal',
+ 'wmulwl','wmulwlal',
+ 'wmulwumr','wmulwumral',
+ 'wmulwsmr','wmulwsmral',
+ 'wor','woral',
+ 'wpackhss','wpackhssal',
+ 'wpackwss','wpackwssal',
+ 'wpackdss','wpackdssal',
+ 'wpackhus','wpackhusal',
+ 'wpackwus','wpackwusal',
+ 'wpackdus','wpackdusal',
+ 'wqmiabb','wqmiabbal',
+ 'wqmiabt','wqmiabtal',
+ 'wqmiatb','wqmiatbal',
+ 'wqmiatt','wqmiattal',
+ 'wqmiabbn','wqmiabbnal',
+ 'wqmiabtn','wqmiabtnal',
+ 'wqmiatbn','wqmiatbnal',
+ 'wqmiattn','wqmiattnal',
+ 'wqmulm','wqmulmal',
+ 'wqmulmr','wqmulmral',
+ 'wqmulwm','wqmulwmal',
+ 'wqmulwmr','wqmulwmral',
+ 'wrorh','wrorhal',
+ 'wrorw','wrorwal',
+ 'wrord','wrordal',
+ 'wrorhg','wrorhgal',
+ 'wrorwg','wrorwgal',
+ 'wrordg','wrordgal',
+ 'wsadb','wsadbal',
+ 'wsadh','wsadhal',
+ 'wsadbz','wsadbzal',
+ 'wsadhz','wsadhzal',
+ 'wshufh','wshufhal',
+ 'wsllh','wsllhal',
+ 'wsllw','wsllwal',
+ 'wslld','wslldal',
+ 'wsllhg','wsllhgal',
+ 'wsllwg','wsllwgal',
+ 'wslldg','wslldgal',
+ 'wsrah','wsrahal',
+ 'wsraw','wsrawal',
+ 'wsrad','wsradal',
+ 'wsrahg','wsrahgal',
+ 'wsrawg','wsrawgal',
+ 'wsradg','wsradgal',
+ 'wsrlh','wsrlhal',
+ 'wsrlw','wsrlwal',
+ 'wsrld','wsrldal',
+ 'wsrlhg','wsrlhgal',
+ 'wsrlwg','wsrlwgal',
+ 'wsrldg','wsrldgal',
+ 'wstrb','wstrbal',
+ 'wstrh','wstrhal',
+ 'wstrw','wstrwal',
+ 'wstrd','wstrdal',
+ 'wsubb','wsubbal',
+ 'wsubh','wsubhal',
+ 'wsubw','wsubwal',
+ 'wsubbss','wsubbssal',
+ 'wsubhss','wsubhssal',
+ 'wsubwss','wsubwssal',
+ 'wsubbus','wsubbusal',
+ 'wsubhus','wsubhusal',
+ 'wsubwus','wsubwusal',
+ 'wsubaddhx','wsubaddhxal',
+ 'wunpckehsb','wunpckehsbal',
+ 'wunpckehsh','wunpckehshal',
+ 'wunpckehsw','wunpckehswal',
+ 'wunpckehub','wunpckehubal',
+ 'wunpckehuh','wunpckehuhal',
+ 'wunpckehuw','wunpckehuwal',
+ 'wunpckihb','wunpckihbal',
+ 'wunpckihh','wunpckihhal',
+ 'wunpckihw','wunpckihwal',
+ 'wunpckelsb','wunpckelsbal',
+ 'wunpckelsh','wunpckelshal',
+ 'wunpckelsw','wunpckelswal',
+ 'wunpckelub','wunpckelubal',
+ 'wunpckeluh','wunpckeluhal',
+ 'wunpckeluw','wunpckeluwal',
+ 'wunpckilb','wunpckilbal',
+ 'wunpckilh','wunpckilhal',
+ 'wunpckilw','wunpckilwal',
+ 'wxor','wxoral',
+ 'wzero','wzeroal'
+ ),
+ /* Conditional WMMX/WMMX2 SIMD Instructions */
+ 18 => array(
+ /* Conditional WMMX/WMMX2 SIMD Instructions */
+ 'tandcbeq','tandcbne','tandcbcs','tandcbhs','tandcbcc','tandcblo','tandcbmi','tandcbpl','tandcbvs','tandcbvc','tandcbhi','tandcbls','tandcbge','tandcblt','tandcbgt','tandcble',
+ 'tandcheq','tandchne','tandchcs','tandchhs','tandchcc','tandchlo','tandchmi','tandchpl','tandchvs','tandchvc','tandchhi','tandchls','tandchge','tandchlt','tandchgt','tandchle',
+ 'tandcweq','tandcwne','tandcwcs','tandcwhs','tandcwcc','tandcwlo','tandcwmi','tandcwpl','tandcwvs','tandcwvc','tandcwhi','tandcwls','tandcwge','tandcwlt','tandcwgt','tandcwle',
+ 'tbcstbeq','tbcstbne','tbcstbcs','tbcstbhs','tbcstbcc','tbcstblo','tbcstbmi','tbcstbpl','tbcstbvs','tbcstbvc','tbcstbhi','tbcstbls','tbcstbge','tbcstblt','tbcstbgt','tbcstble',
+ 'tbcstheq','tbcsthne','tbcsthcs','tbcsthhs','tbcsthcc','tbcsthlo','tbcsthmi','tbcsthpl','tbcsthvs','tbcsthvc','tbcsthhi','tbcsthls','tbcsthge','tbcsthlt','tbcsthgt','tbcsthle',
+ 'tbcstweq','tbcstwne','tbcstwcs','tbcstwhs','tbcstwcc','tbcstwlo','tbcstwmi','tbcstwpl','tbcstwvs','tbcstwvc','tbcstwhi','tbcstwls','tbcstwge','tbcstwlt','tbcstwgt','tbcstwle',
+ 'textrcbeq','textrcbne','textrcbcs','textrcbhs','textrcbcc','textrcblo','textrcbmi','textrcbpl','textrcbvs','textrcbvc','textrcbhi','textrcbls','textrcbge','textrcblt','textrcbgt','textrcble',
+ 'textrcheq','textrchne','textrchcs','textrchhs','textrchcc','textrchlo','textrchmi','textrchpl','textrchvs','textrchvc','textrchhi','textrchls','textrchge','textrchlt','textrchgt','textrchle',
+ 'textrcweq','textrcwne','textrcwcs','textrcwhs','textrcwcc','textrcwlo','textrcwmi','textrcwpl','textrcwvs','textrcwvc','textrcwhi','textrcwls','textrcwge','textrcwlt','textrcwgt','textrcwle',
+ 'textrmsbeq','textrmsbne','textrmsbcs','textrmsbhs','textrmsbcc','textrmsblo','textrmsbmi','textrmsbpl','textrmsbvs','textrmsbvc','textrmsbhi','textrmsbls','textrmsbge','textrmsblt','textrmsbgt','textrmsble',
+ 'textrmsheq','textrmshne','textrmshcs','textrmshhs','textrmshcc','textrmshlo','textrmshmi','textrmshpl','textrmshvs','textrmshvc','textrmshhi','textrmshls','textrmshge','textrmshlt','textrmshgt','textrmshle',
+ 'textrmsweq','textrmswne','textrmswcs','textrmswhs','textrmswcc','textrmswlo','textrmswmi','textrmswpl','textrmswvs','textrmswvc','textrmswhi','textrmswls','textrmswge','textrmswlt','textrmswgt','textrmswle',
+ 'textrmubeq','textrmubne','textrmubcs','textrmubhs','textrmubcc','textrmublo','textrmubmi','textrmubpl','textrmubvs','textrmubvc','textrmubhi','textrmubls','textrmubge','textrmublt','textrmubgt','textrmuble',
+ 'textrmuheq','textrmuhne','textrmuhcs','textrmuhhs','textrmuhcc','textrmuhlo','textrmuhmi','textrmuhpl','textrmuhvs','textrmuhvc','textrmuhhi','textrmuhls','textrmuhge','textrmuhlt','textrmuhgt','textrmuhle',
+ 'textrmuweq','textrmuwne','textrmuwcs','textrmuwhs','textrmuwcc','textrmuwlo','textrmuwmi','textrmuwpl','textrmuwvs','textrmuwvc','textrmuwhi','textrmuwls','textrmuwge','textrmuwlt','textrmuwgt','textrmuwle',
+ 'tinsrbeq','tinsrbne','tinsrbcs','tinsrbhs','tinsrbcc','tinsrblo','tinsrbmi','tinsrbpl','tinsrbvs','tinsrbvc','tinsrbhi','tinsrbls','tinsrbge','tinsrblt','tinsrbgt','tinsrble',
+ 'tinsrheq','tinsrhne','tinsrhcs','tinsrhhs','tinsrhcc','tinsrhlo','tinsrhmi','tinsrhpl','tinsrhvs','tinsrhvc','tinsrhhi','tinsrhls','tinsrhge','tinsrhlt','tinsrhgt','tinsrhle',
+ 'tinsrweq','tinsrwne','tinsrwcs','tinsrwhs','tinsrwcc','tinsrwlo','tinsrwmi','tinsrwpl','tinsrwvs','tinsrwvc','tinsrwhi','tinsrwls','tinsrwge','tinsrwlt','tinsrwgt','tinsrwle',
+ 'tmcreq','tmcrne','tmcrcs','tmcrhs','tmcrcc','tmcrlo','tmcrmi','tmcrpl','tmcrvs','tmcrvc','tmcrhi','tmcrls','tmcrge','tmcrlt','tmcrgt','tmcrle',
+ 'tmcrreq','tmcrrne','tmcrrcs','tmcrrhs','tmcrrcc','tmcrrlo','tmcrrmi','tmcrrpl','tmcrrvs','tmcrrvc','tmcrrhi','tmcrrls','tmcrrge','tmcrrlt','tmcrrgt','tmcrrle',
+ 'tmiaeq','tmiane','tmiacs','tmiahs','tmiacc','tmialo','tmiami','tmiapl','tmiavs','tmiavc','tmiahi','tmials','tmiage','tmialt','tmiagt','tmiale',
+ 'tmiapheq','tmiaphne','tmiaphcs','tmiaphhs','tmiaphcc','tmiaphlo','tmiaphmi','tmiaphpl','tmiaphvs','tmiaphvc','tmiaphhi','tmiaphls','tmiaphge','tmiaphlt','tmiaphgt','tmiaphle',
+ 'tmiabbeq','tmiabbne','tmiabbcs','tmiabbhs','tmiabbcc','tmiabblo','tmiabbmi','tmiabbpl','tmiabbvs','tmiabbvc','tmiabbhi','tmiabbls','tmiabbge','tmiabblt','tmiabbgt','tmiabble',
+ 'tmiabteq','tmiabtne','tmiabtcs','tmiabths','tmiabtcc','tmiabtlo','tmiabtmi','tmiabtpl','tmiabtvs','tmiabtvc','tmiabthi','tmiabtls','tmiabtge','tmiabtlt','tmiabtgt','tmiabtle',
+ 'tmiatbeq','tmiatbne','tmiatbcs','tmiatbhs','tmiatbcc','tmiatblo','tmiatbmi','tmiatbpl','tmiatbvs','tmiatbvc','tmiatbhi','tmiatbls','tmiatbge','tmiatblt','tmiatbgt','tmiatble',
+ 'tmiatteq','tmiattne','tmiattcs','tmiatths','tmiattcc','tmiattlo','tmiattmi','tmiattpl','tmiattvs','tmiattvc','tmiatthi','tmiattls','tmiattge','tmiattlt','tmiattgt','tmiattle',
+ 'tmovmskbeq','tmovmskbne','tmovmskbcs','tmovmskbhs','tmovmskbcc','tmovmskblo','tmovmskbmi','tmovmskbpl','tmovmskbvs','tmovmskbvc','tmovmskbhi','tmovmskbls','tmovmskbge','tmovmskblt','tmovmskbgt','tmovmskble',
+ 'tmovmskheq','tmovmskhne','tmovmskhcs','tmovmskhhs','tmovmskhcc','tmovmskhlo','tmovmskhmi','tmovmskhpl','tmovmskhvs','tmovmskhvc','tmovmskhhi','tmovmskhls','tmovmskhge','tmovmskhlt','tmovmskhgt','tmovmskhle',
+ 'tmovmskweq','tmovmskwne','tmovmskwcs','tmovmskwhs','tmovmskwcc','tmovmskwlo','tmovmskwmi','tmovmskwpl','tmovmskwvs','tmovmskwvc','tmovmskwhi','tmovmskwls','tmovmskwge','tmovmskwlt','tmovmskwgt','tmovmskwle',
+ 'tmrceq','tmrcne','tmrccs','tmrchs','tmrccc','tmrclo','tmrcmi','tmrcpl','tmrcvs','tmrcvc','tmrchi','tmrcls','tmrcge','tmrclt','tmrcgt','tmrcle',
+ 'tmrrceq','tmrrcne','tmrrccs','tmrrchs','tmrrccc','tmrrclo','tmrrcmi','tmrrcpl','tmrrcvs','tmrrcvc','tmrrchi','tmrrcls','tmrrcge','tmrrclt','tmrrcgt','tmrrcle',
+ 'torcbeq','torcbne','torcbcs','torcbhs','torcbcc','torcblo','torcbmi','torcbpl','torcbvs','torcbvc','torcbhi','torcbls','torcbge','torcblt','torcbgt','torcble',
+ 'torcheq','torchne','torchcs','torchhs','torchcc','torchlo','torchmi','torchpl','torchvs','torchvc','torchhi','torchls','torchge','torchlt','torchgt','torchle',
+ 'torcweq','torcwne','torcwcs','torcwhs','torcwcc','torcwlo','torcwmi','torcwpl','torcwvs','torcwvc','torcwhi','torcwls','torcwge','torcwlt','torcwgt','torcwle',
+ 'torvscbeq','torvscbne','torvscbcs','torvscbhs','torvscbcc','torvscblo','torvscbmi','torvscbpl','torvscbvs','torvscbvc','torvscbhi','torvscbls','torvscbge','torvscblt','torvscbgt','torvscble',
+ 'torvscheq','torvschne','torvschcs','torvschhs','torvschcc','torvschlo','torvschmi','torvschpl','torvschvs','torvschvc','torvschhi','torvschls','torvschge','torvschlt','torvschgt','torvschle',
+ 'torvscweq','torvscwne','torvscwcs','torvscwhs','torvscwcc','torvscwlo','torvscwmi','torvscwpl','torvscwvs','torvscwvc','torvscwhi','torvscwls','torvscwge','torvscwlt','torvscwgt','torvscwle',
+ 'wabsbeq','wabsbne','wabsbcs','wabsbhs','wabsbcc','wabsblo','wabsbmi','wabsbpl','wabsbvs','wabsbvc','wabsbhi','wabsbls','wabsbge','wabsblt','wabsbgt','wabsble',
+ 'wabsheq','wabshne','wabshcs','wabshhs','wabshcc','wabshlo','wabshmi','wabshpl','wabshvs','wabshvc','wabshhi','wabshls','wabshge','wabshlt','wabshgt','wabshle',
+ 'wabsweq','wabswne','wabswcs','wabswhs','wabswcc','wabswlo','wabswmi','wabswpl','wabswvs','wabswvc','wabswhi','wabswls','wabswge','wabswlt','wabswgt','wabswle',
+ 'wabsdiffbeq','wabsdiffbne','wabsdiffbcs','wabsdiffbhs','wabsdiffbcc','wabsdiffblo','wabsdiffbmi','wabsdiffbpl','wabsdiffbvs','wabsdiffbvc','wabsdiffbhi','wabsdiffbls','wabsdiffbge','wabsdiffblt','wabsdiffbgt','wabsdiffble',
+ 'wabsdiffheq','wabsdiffhne','wabsdiffhcs','wabsdiffhhs','wabsdiffhcc','wabsdiffhlo','wabsdiffhmi','wabsdiffhpl','wabsdiffhvs','wabsdiffhvc','wabsdiffhhi','wabsdiffhls','wabsdiffhge','wabsdiffhlt','wabsdiffhgt','wabsdiffhle',
+ 'wabsdiffweq','wabsdiffwne','wabsdiffwcs','wabsdiffwhs','wabsdiffwcc','wabsdiffwlo','wabsdiffwmi','wabsdiffwpl','wabsdiffwvs','wabsdiffwvc','wabsdiffwhi','wabsdiffwls','wabsdiffwge','wabsdiffwlt','wabsdiffwgt','wabsdiffwle',
+ 'waccbeq','waccbne','waccbcs','waccbhs','waccbcc','waccblo','waccbmi','waccbpl','waccbvs','waccbvc','waccbhi','waccbls','waccbge','waccblt','waccbgt','waccble',
+ 'waccheq','wacchne','wacchcs','wacchhs','wacchcc','wacchlo','wacchmi','wacchpl','wacchvs','wacchvc','wacchhi','wacchls','wacchge','wacchlt','wacchgt','wacchle',
+ 'waccweq','waccwne','waccwcs','waccwhs','waccwcc','waccwlo','waccwmi','waccwpl','waccwvs','waccwvc','waccwhi','waccwls','waccwge','waccwlt','waccwgt','waccwle',
+ 'waddbeq','waddbne','waddbcs','waddbhs','waddbcc','waddblo','waddbmi','waddbpl','waddbvs','waddbvc','waddbhi','waddbls','waddbge','waddblt','waddbgt','waddble',
+ 'waddheq','waddhne','waddhcs','waddhhs','waddhcc','waddhlo','waddhmi','waddhpl','waddhvs','waddhvc','waddhhi','waddhls','waddhge','waddhlt','waddhgt','waddhle',
+ 'waddweq','waddwne','waddwcs','waddwhs','waddwcc','waddwlo','waddwmi','waddwpl','waddwvs','waddwvc','waddwhi','waddwls','waddwge','waddwlt','waddwgt','waddwle',
+ 'waddbceq','waddbcne','waddbccs','waddbchs','waddbccc','waddbclo','waddbcmi','waddbcpl','waddbcvs','waddbcvc','waddbchi','waddbcls','waddbcge','waddbclt','waddbcgt','waddbcle',
+ 'waddhceq','waddhcne','waddhccs','waddhchs','waddhccc','waddhclo','waddhcmi','waddhcpl','waddhcvs','waddhcvc','waddhchi','waddhcls','waddhcge','waddhclt','waddhcgt','waddhcle',
+ 'waddwceq','waddwcne','waddwccs','waddwchs','waddwccc','waddwclo','waddwcmi','waddwcpl','waddwcvs','waddwcvc','waddwchi','waddwcls','waddwcge','waddwclt','waddwcgt','waddwcle',
+ 'waddbsseq','waddbssne','waddbsscs','waddbsshs','waddbsscc','waddbsslo','waddbssmi','waddbsspl','waddbssvs','waddbssvc','waddbsshi','waddbssls','waddbssge','waddbsslt','waddbssgt','waddbssle',
+ 'waddhsseq','waddhssne','waddhsscs','waddhsshs','waddhsscc','waddhsslo','waddhssmi','waddhsspl','waddhssvs','waddhssvc','waddhsshi','waddhssls','waddhssge','waddhsslt','waddhssgt','waddhssle',
+ 'waddwsseq','waddwssne','waddwsscs','waddwsshs','waddwsscc','waddwsslo','waddwssmi','waddwsspl','waddwssvs','waddwssvc','waddwsshi','waddwssls','waddwssge','waddwsslt','waddwssgt','waddwssle',
+ 'waddbuseq','waddbusne','waddbuscs','waddbushs','waddbuscc','waddbuslo','waddbusmi','waddbuspl','waddbusvs','waddbusvc','waddbushi','waddbusls','waddbusge','waddbuslt','waddbusgt','waddbusle',
+ 'waddhuseq','waddhusne','waddhuscs','waddhushs','waddhuscc','waddhuslo','waddhusmi','waddhuspl','waddhusvs','waddhusvc','waddhushi','waddhusls','waddhusge','waddhuslt','waddhusgt','waddhusle',
+ 'waddwuseq','waddwusne','waddwuscs','waddwushs','waddwuscc','waddwuslo','waddwusmi','waddwuspl','waddwusvs','waddwusvc','waddwushi','waddwusls','waddwusge','waddwuslt','waddwusgt','waddwusle',
+ 'waddsubhxeq','waddsubhxne','waddsubhxcs','waddsubhxhs','waddsubhxcc','waddsubhxlo','waddsubhxmi','waddsubhxpl','waddsubhxvs','waddsubhxvc','waddsubhxhi','waddsubhxls','waddsubhxge','waddsubhxlt','waddsubhxgt','waddsubhxle',
+ 'walignieq','walignine','walignics','walignihs','walignicc','walignilo','walignimi','walignipl','walignivs','walignivc','walignihi','walignils','walignige','walignilt','walignigt','walignile',
+ 'walignr0eq','walignr0ne','walignr0cs','walignr0hs','walignr0cc','walignr0lo','walignr0mi','walignr0pl','walignr0vs','walignr0vc','walignr0hi','walignr0ls','walignr0ge','walignr0lt','walignr0gt','walignr0le',
+ 'walignr1eq','walignr1ne','walignr1cs','walignr1hs','walignr1cc','walignr1lo','walignr1mi','walignr1pl','walignr1vs','walignr1vc','walignr1hi','walignr1ls','walignr1ge','walignr1lt','walignr1gt','walignr1le',
+ 'walignr2eq','walignr2ne','walignr2cs','walignr2hs','walignr2cc','walignr2lo','walignr2mi','walignr2pl','walignr2vs','walignr2vc','walignr2hi','walignr2ls','walignr2ge','walignr2lt','walignr2gt','walignr2le',
+ 'walignr3eq','walignr3ne','walignr3cs','walignr3hs','walignr3cc','walignr3lo','walignr3mi','walignr3pl','walignr3vs','walignr3vc','walignr3hi','walignr3ls','walignr3ge','walignr3lt','walignr3gt','walignr3le',
+ 'wandeq','wandne','wandcs','wandhs','wandcc','wandlo','wandmi','wandpl','wandvs','wandvc','wandhi','wandls','wandge','wandlt','wandgt','wandle',
+ 'wandneq','wandnne','wandncs','wandnhs','wandncc','wandnlo','wandnmi','wandnpl','wandnvs','wandnvc','wandnhi','wandnls','wandnge','wandnlt','wandngt','wandnle',
+ 'wavg2beq','wavg2bne','wavg2bcs','wavg2bhs','wavg2bcc','wavg2blo','wavg2bmi','wavg2bpl','wavg2bvs','wavg2bvc','wavg2bhi','wavg2bls','wavg2bge','wavg2blt','wavg2bgt','wavg2ble',
+ 'wavg2heq','wavg2hne','wavg2hcs','wavg2hhs','wavg2hcc','wavg2hlo','wavg2hmi','wavg2hpl','wavg2hvs','wavg2hvc','wavg2hhi','wavg2hls','wavg2hge','wavg2hlt','wavg2hgt','wavg2hle',
+ 'wavg2breq','wavg2brne','wavg2brcs','wavg2brhs','wavg2brcc','wavg2brlo','wavg2brmi','wavg2brpl','wavg2brvs','wavg2brvc','wavg2brhi','wavg2brls','wavg2brge','wavg2brlt','wavg2brgt','wavg2brle',
+ 'wavg2hreq','wavg2hrne','wavg2hrcs','wavg2hrhs','wavg2hrcc','wavg2hrlo','wavg2hrmi','wavg2hrpl','wavg2hrvs','wavg2hrvc','wavg2hrhi','wavg2hrls','wavg2hrge','wavg2hrlt','wavg2hrgt','wavg2hrle',
+ 'wavg4eq','wavg4ne','wavg4cs','wavg4hs','wavg4cc','wavg4lo','wavg4mi','wavg4pl','wavg4vs','wavg4vc','wavg4hi','wavg4ls','wavg4ge','wavg4lt','wavg4gt','wavg4le',
+ 'wavg4req','wavg4rne','wavg4rcs','wavg4rhs','wavg4rcc','wavg4rlo','wavg4rmi','wavg4rpl','wavg4rvs','wavg4rvc','wavg4rhi','wavg4rls','wavg4rge','wavg4rlt','wavg4rgt','wavg4rle',
+ 'wcmpeqbeq','wcmpeqbne','wcmpeqbcs','wcmpeqbhs','wcmpeqbcc','wcmpeqblo','wcmpeqbmi','wcmpeqbpl','wcmpeqbvs','wcmpeqbvc','wcmpeqbhi','wcmpeqbls','wcmpeqbge','wcmpeqblt','wcmpeqbgt','wcmpeqble',
+ 'wcmpeqheq','wcmpeqhne','wcmpeqhcs','wcmpeqhhs','wcmpeqhcc','wcmpeqhlo','wcmpeqhmi','wcmpeqhpl','wcmpeqhvs','wcmpeqhvc','wcmpeqhhi','wcmpeqhls','wcmpeqhge','wcmpeqhlt','wcmpeqhgt','wcmpeqhle',
+ 'wcmpeqweq','wcmpeqwne','wcmpeqwcs','wcmpeqwhs','wcmpeqwcc','wcmpeqwlo','wcmpeqwmi','wcmpeqwpl','wcmpeqwvs','wcmpeqwvc','wcmpeqwhi','wcmpeqwls','wcmpeqwge','wcmpeqwlt','wcmpeqwgt','wcmpeqwle',
+ 'wcmpgtsbeq','wcmpgtsbne','wcmpgtsbcs','wcmpgtsbhs','wcmpgtsbcc','wcmpgtsblo','wcmpgtsbmi','wcmpgtsbpl','wcmpgtsbvs','wcmpgtsbvc','wcmpgtsbhi','wcmpgtsbls','wcmpgtsbge','wcmpgtsblt','wcmpgtsbgt','wcmpgtsble',
+ 'wcmpgtsheq','wcmpgtshne','wcmpgtshcs','wcmpgtshhs','wcmpgtshcc','wcmpgtshlo','wcmpgtshmi','wcmpgtshpl','wcmpgtshvs','wcmpgtshvc','wcmpgtshhi','wcmpgtshls','wcmpgtshge','wcmpgtshlt','wcmpgtshgt','wcmpgtshle',
+ 'wcmpgtsweq','wcmpgtswne','wcmpgtswcs','wcmpgtswhs','wcmpgtswcc','wcmpgtswlo','wcmpgtswmi','wcmpgtswpl','wcmpgtswvs','wcmpgtswvc','wcmpgtswhi','wcmpgtswls','wcmpgtswge','wcmpgtswlt','wcmpgtswgt','wcmpgtswle',
+ 'wcmpgtubeq','wcmpgtubne','wcmpgtubcs','wcmpgtubhs','wcmpgtubcc','wcmpgtublo','wcmpgtubmi','wcmpgtubpl','wcmpgtubvs','wcmpgtubvc','wcmpgtubhi','wcmpgtubls','wcmpgtubge','wcmpgtublt','wcmpgtubgt','wcmpgtuble',
+ 'wcmpgtuheq','wcmpgtuhne','wcmpgtuhcs','wcmpgtuhhs','wcmpgtuhcc','wcmpgtuhlo','wcmpgtuhmi','wcmpgtuhpl','wcmpgtuhvs','wcmpgtuhvc','wcmpgtuhhi','wcmpgtuhls','wcmpgtuhge','wcmpgtuhlt','wcmpgtuhgt','wcmpgtuhle',
+ 'wcmpgtuweq','wcmpgtuwne','wcmpgtuwcs','wcmpgtuwhs','wcmpgtuwcc','wcmpgtuwlo','wcmpgtuwmi','wcmpgtuwpl','wcmpgtuwvs','wcmpgtuwvc','wcmpgtuwhi','wcmpgtuwls','wcmpgtuwge','wcmpgtuwlt','wcmpgtuwgt','wcmpgtuwle',
+ 'wldrbeq','wldrbne','wldrbcs','wldrbhs','wldrbcc','wldrblo','wldrbmi','wldrbpl','wldrbvs','wldrbvc','wldrbhi','wldrbls','wldrbge','wldrblt','wldrbgt','wldrble',
+ 'wldrheq','wldrhne','wldrhcs','wldrhhs','wldrhcc','wldrhlo','wldrhmi','wldrhpl','wldrhvs','wldrhvc','wldrhhi','wldrhls','wldrhge','wldrhlt','wldrhgt','wldrhle',
+ 'wldrweq','wldrwne','wldrwcs','wldrwhs','wldrwcc','wldrwlo','wldrwmi','wldrwpl','wldrwvs','wldrwvc','wldrwhi','wldrwls','wldrwge','wldrwlt','wldrwgt','wldrwle',
+ 'wldrdeq','wldrdne','wldrdcs','wldrdhs','wldrdcc','wldrdlo','wldrdmi','wldrdpl','wldrdvs','wldrdvc','wldrdhi','wldrdls','wldrdge','wldrdlt','wldrdgt','wldrdle',
+ 'wmacseq','wmacsne','wmacscs','wmacshs','wmacscc','wmacslo','wmacsmi','wmacspl','wmacsvs','wmacsvc','wmacshi','wmacsls','wmacsge','wmacslt','wmacsgt','wmacsle',
+ 'wmacueq','wmacune','wmacucs','wmacuhs','wmacucc','wmaculo','wmacumi','wmacupl','wmacuvs','wmacuvc','wmacuhi','wmaculs','wmacuge','wmacult','wmacugt','wmacule',
+ 'wmacszeq','wmacszne','wmacszcs','wmacszhs','wmacszcc','wmacszlo','wmacszmi','wmacszpl','wmacszvs','wmacszvc','wmacszhi','wmacszls','wmacszge','wmacszlt','wmacszgt','wmacszle',
+ 'wmacuzeq','wmacuzne','wmacuzcs','wmacuzhs','wmacuzcc','wmacuzlo','wmacuzmi','wmacuzpl','wmacuzvs','wmacuzvc','wmacuzhi','wmacuzls','wmacuzge','wmacuzlt','wmacuzgt','wmacuzle',
+ 'wmaddseq','wmaddsne','wmaddscs','wmaddshs','wmaddscc','wmaddslo','wmaddsmi','wmaddspl','wmaddsvs','wmaddsvc','wmaddshi','wmaddsls','wmaddsge','wmaddslt','wmaddsgt','wmaddsle',
+ 'wmaddueq','wmaddune','wmadducs','wmadduhs','wmadducc','wmaddulo','wmaddumi','wmaddupl','wmadduvs','wmadduvc','wmadduhi','wmadduls','wmadduge','wmaddult','wmaddugt','wmaddule',
+ 'wmaddsxeq','wmaddsxne','wmaddsxcs','wmaddsxhs','wmaddsxcc','wmaddsxlo','wmaddsxmi','wmaddsxpl','wmaddsxvs','wmaddsxvc','wmaddsxhi','wmaddsxls','wmaddsxge','wmaddsxlt','wmaddsxgt','wmaddsxle',
+ 'wmadduxeq','wmadduxne','wmadduxcs','wmadduxhs','wmadduxcc','wmadduxlo','wmadduxmi','wmadduxpl','wmadduxvs','wmadduxvc','wmadduxhi','wmadduxls','wmadduxge','wmadduxlt','wmadduxgt','wmadduxle',
+ 'wmaddsneq','wmaddsnne','wmaddsncs','wmaddsnhs','wmaddsncc','wmaddsnlo','wmaddsnmi','wmaddsnpl','wmaddsnvs','wmaddsnvc','wmaddsnhi','wmaddsnls','wmaddsnge','wmaddsnlt','wmaddsngt','wmaddsnle',
+ 'wmadduneq','wmaddunne','wmadduncs','wmaddunhs','wmadduncc','wmaddunlo','wmaddunmi','wmaddunpl','wmaddunvs','wmaddunvc','wmaddunhi','wmaddunls','wmaddunge','wmaddunlt','wmaddungt','wmaddunle',
+ 'wmaxsbeq','wmaxsbne','wmaxsbcs','wmaxsbhs','wmaxsbcc','wmaxsblo','wmaxsbmi','wmaxsbpl','wmaxsbvs','wmaxsbvc','wmaxsbhi','wmaxsbls','wmaxsbge','wmaxsblt','wmaxsbgt','wmaxsble',
+ 'wmaxsheq','wmaxshne','wmaxshcs','wmaxshhs','wmaxshcc','wmaxshlo','wmaxshmi','wmaxshpl','wmaxshvs','wmaxshvc','wmaxshhi','wmaxshls','wmaxshge','wmaxshlt','wmaxshgt','wmaxshle',
+ 'wmaxsweq','wmaxswne','wmaxswcs','wmaxswhs','wmaxswcc','wmaxswlo','wmaxswmi','wmaxswpl','wmaxswvs','wmaxswvc','wmaxswhi','wmaxswls','wmaxswge','wmaxswlt','wmaxswgt','wmaxswle',
+ 'wmaxubeq','wmaxubne','wmaxubcs','wmaxubhs','wmaxubcc','wmaxublo','wmaxubmi','wmaxubpl','wmaxubvs','wmaxubvc','wmaxubhi','wmaxubls','wmaxubge','wmaxublt','wmaxubgt','wmaxuble',
+ 'wmaxuheq','wmaxuhne','wmaxuhcs','wmaxuhhs','wmaxuhcc','wmaxuhlo','wmaxuhmi','wmaxuhpl','wmaxuhvs','wmaxuhvc','wmaxuhhi','wmaxuhls','wmaxuhge','wmaxuhlt','wmaxuhgt','wmaxuhle',
+ 'wmaxuweq','wmaxuwne','wmaxuwcs','wmaxuwhs','wmaxuwcc','wmaxuwlo','wmaxuwmi','wmaxuwpl','wmaxuwvs','wmaxuwvc','wmaxuwhi','wmaxuwls','wmaxuwge','wmaxuwlt','wmaxuwgt','wmaxuwle',
+ 'wmergeeq','wmergene','wmergecs','wmergehs','wmergecc','wmergelo','wmergemi','wmergepl','wmergevs','wmergevc','wmergehi','wmergels','wmergege','wmergelt','wmergegt','wmergele',
+ 'wmiabbeq','wmiabbne','wmiabbcs','wmiabbhs','wmiabbcc','wmiabblo','wmiabbmi','wmiabbpl','wmiabbvs','wmiabbvc','wmiabbhi','wmiabbls','wmiabbge','wmiabblt','wmiabbgt','wmiabble',
+ 'wmiabteq','wmiabtne','wmiabtcs','wmiabths','wmiabtcc','wmiabtlo','wmiabtmi','wmiabtpl','wmiabtvs','wmiabtvc','wmiabthi','wmiabtls','wmiabtge','wmiabtlt','wmiabtgt','wmiabtle',
+ 'wmiatbeq','wmiatbne','wmiatbcs','wmiatbhs','wmiatbcc','wmiatblo','wmiatbmi','wmiatbpl','wmiatbvs','wmiatbvc','wmiatbhi','wmiatbls','wmiatbge','wmiatblt','wmiatbgt','wmiatble',
+ 'wmiatteq','wmiattne','wmiattcs','wmiatths','wmiattcc','wmiattlo','wmiattmi','wmiattpl','wmiattvs','wmiattvc','wmiatthi','wmiattls','wmiattge','wmiattlt','wmiattgt','wmiattle',
+ 'wmiabbneq','wmiabbnne','wmiabbncs','wmiabbnhs','wmiabbncc','wmiabbnlo','wmiabbnmi','wmiabbnpl','wmiabbnvs','wmiabbnvc','wmiabbnhi','wmiabbnls','wmiabbnge','wmiabbnlt','wmiabbngt','wmiabbnle',
+ 'wmiabtneq','wmiabtnne','wmiabtncs','wmiabtnhs','wmiabtncc','wmiabtnlo','wmiabtnmi','wmiabtnpl','wmiabtnvs','wmiabtnvc','wmiabtnhi','wmiabtnls','wmiabtnge','wmiabtnlt','wmiabtngt','wmiabtnle',
+ 'wmiatbneq','wmiatbnne','wmiatbncs','wmiatbnhs','wmiatbncc','wmiatbnlo','wmiatbnmi','wmiatbnpl','wmiatbnvs','wmiatbnvc','wmiatbnhi','wmiatbnls','wmiatbnge','wmiatbnlt','wmiatbngt','wmiatbnle',
+ 'wmiattneq','wmiattnne','wmiattncs','wmiattnhs','wmiattncc','wmiattnlo','wmiattnmi','wmiattnpl','wmiattnvs','wmiattnvc','wmiattnhi','wmiattnls','wmiattnge','wmiattnlt','wmiattngt','wmiattnle',
+ 'wmiawbbeq','wmiawbbne','wmiawbbcs','wmiawbbhs','wmiawbbcc','wmiawbblo','wmiawbbmi','wmiawbbpl','wmiawbbvs','wmiawbbvc','wmiawbbhi','wmiawbbls','wmiawbbge','wmiawbblt','wmiawbbgt','wmiawbble',
+ 'wmiawbteq','wmiawbtne','wmiawbtcs','wmiawbths','wmiawbtcc','wmiawbtlo','wmiawbtmi','wmiawbtpl','wmiawbtvs','wmiawbtvc','wmiawbthi','wmiawbtls','wmiawbtge','wmiawbtlt','wmiawbtgt','wmiawbtle',
+ 'wmiawtbeq','wmiawtbne','wmiawtbcs','wmiawtbhs','wmiawtbcc','wmiawtblo','wmiawtbmi','wmiawtbpl','wmiawtbvs','wmiawtbvc','wmiawtbhi','wmiawtbls','wmiawtbge','wmiawtblt','wmiawtbgt','wmiawtble',
+ 'wmiawtteq','wmiawttne','wmiawttcs','wmiawtths','wmiawttcc','wmiawttlo','wmiawttmi','wmiawttpl','wmiawttvs','wmiawttvc','wmiawtthi','wmiawttls','wmiawttge','wmiawttlt','wmiawttgt','wmiawttle',
+ 'wmiawbbneq','wmiawbbnne','wmiawbbncs','wmiawbbnhs','wmiawbbncc','wmiawbbnlo','wmiawbbnmi','wmiawbbnpl','wmiawbbnvs','wmiawbbnvc','wmiawbbnhi','wmiawbbnls','wmiawbbnge','wmiawbbnlt','wmiawbbngt','wmiawbbnle',
+ 'wmiawbtneq','wmiawbtnne','wmiawbtncs','wmiawbtnhs','wmiawbtncc','wmiawbtnlo','wmiawbtnmi','wmiawbtnpl','wmiawbtnvs','wmiawbtnvc','wmiawbtnhi','wmiawbtnls','wmiawbtnge','wmiawbtnlt','wmiawbtngt','wmiawbtnle',
+ 'wmiawtbneq','wmiawtbnne','wmiawtbncs','wmiawtbnhs','wmiawtbncc','wmiawtbnlo','wmiawtbnmi','wmiawtbnpl','wmiawtbnvs','wmiawtbnvc','wmiawtbnhi','wmiawtbnls','wmiawtbnge','wmiawtbnlt','wmiawtbngt','wmiawtbnle',
+ 'wmiawttneq','wmiawttnne','wmiawttncs','wmiawttnhs','wmiawttncc','wmiawttnlo','wmiawttnmi','wmiawttnpl','wmiawttnvs','wmiawttnvc','wmiawttnhi','wmiawttnls','wmiawttnge','wmiawttnlt','wmiawttngt','wmiawttnle',
+ 'wminsbeq','wminsbne','wminsbcs','wminsbhs','wminsbcc','wminsblo','wminsbmi','wminsbpl','wminsbvs','wminsbvc','wminsbhi','wminsbls','wminsbge','wminsblt','wminsbgt','wminsble',
+ 'wminsheq','wminshne','wminshcs','wminshhs','wminshcc','wminshlo','wminshmi','wminshpl','wminshvs','wminshvc','wminshhi','wminshls','wminshge','wminshlt','wminshgt','wminshle',
+ 'wminsweq','wminswne','wminswcs','wminswhs','wminswcc','wminswlo','wminswmi','wminswpl','wminswvs','wminswvc','wminswhi','wminswls','wminswge','wminswlt','wminswgt','wminswle',
+ 'wminubeq','wminubne','wminubcs','wminubhs','wminubcc','wminublo','wminubmi','wminubpl','wminubvs','wminubvc','wminubhi','wminubls','wminubge','wminublt','wminubgt','wminuble',
+ 'wminuheq','wminuhne','wminuhcs','wminuhhs','wminuhcc','wminuhlo','wminuhmi','wminuhpl','wminuhvs','wminuhvc','wminuhhi','wminuhls','wminuhge','wminuhlt','wminuhgt','wminuhle',
+ 'wminuweq','wminuwne','wminuwcs','wminuwhs','wminuwcc','wminuwlo','wminuwmi','wminuwpl','wminuwvs','wminuwvc','wminuwhi','wminuwls','wminuwge','wminuwlt','wminuwgt','wminuwle',
+ 'wmoveq','wmovne','wmovcs','wmovhs','wmovcc','wmovlo','wmovmi','wmovpl','wmovvs','wmovvc','wmovhi','wmovls','wmovge','wmovlt','wmovgt','wmovle',
+ 'wmulsmeq','wmulsmne','wmulsmcs','wmulsmhs','wmulsmcc','wmulsmlo','wmulsmmi','wmulsmpl','wmulsmvs','wmulsmvc','wmulsmhi','wmulsmls','wmulsmge','wmulsmlt','wmulsmgt','wmulsmle',
+ 'wmulsleq','wmulslne','wmulslcs','wmulslhs','wmulslcc','wmulsllo','wmulslmi','wmulslpl','wmulslvs','wmulslvc','wmulslhi','wmulslls','wmulslge','wmulsllt','wmulslgt','wmulslle',
+ 'wmulumeq','wmulumne','wmulumcs','wmulumhs','wmulumcc','wmulumlo','wmulummi','wmulumpl','wmulumvs','wmulumvc','wmulumhi','wmulumls','wmulumge','wmulumlt','wmulumgt','wmulumle',
+ 'wmululeq','wmululne','wmululcs','wmululhs','wmululcc','wmulullo','wmululmi','wmululpl','wmululvs','wmululvc','wmululhi','wmululls','wmululge','wmulullt','wmululgt','wmululle',
+ 'wmulsmreq','wmulsmrne','wmulsmrcs','wmulsmrhs','wmulsmrcc','wmulsmrlo','wmulsmrmi','wmulsmrpl','wmulsmrvs','wmulsmrvc','wmulsmrhi','wmulsmrls','wmulsmrge','wmulsmrlt','wmulsmrgt','wmulsmrle',
+ 'wmulslreq','wmulslrne','wmulslrcs','wmulslrhs','wmulslrcc','wmulslrlo','wmulslrmi','wmulslrpl','wmulslrvs','wmulslrvc','wmulslrhi','wmulslrls','wmulslrge','wmulslrlt','wmulslrgt','wmulslrle',
+ 'wmulumreq','wmulumrne','wmulumrcs','wmulumrhs','wmulumrcc','wmulumrlo','wmulumrmi','wmulumrpl','wmulumrvs','wmulumrvc','wmulumrhi','wmulumrls','wmulumrge','wmulumrlt','wmulumrgt','wmulumrle',
+ 'wmululreq','wmululrne','wmululrcs','wmululrhs','wmululrcc','wmululrlo','wmululrmi','wmululrpl','wmululrvs','wmululrvc','wmululrhi','wmululrls','wmululrge','wmululrlt','wmululrgt','wmululrle',
+ 'wmulwumeq','wmulwumne','wmulwumcs','wmulwumhs','wmulwumcc','wmulwumlo','wmulwummi','wmulwumpl','wmulwumvs','wmulwumvc','wmulwumhi','wmulwumls','wmulwumge','wmulwumlt','wmulwumgt','wmulwumle',
+ 'wmulwsmeq','wmulwsmne','wmulwsmcs','wmulwsmhs','wmulwsmcc','wmulwsmlo','wmulwsmmi','wmulwsmpl','wmulwsmvs','wmulwsmvc','wmulwsmhi','wmulwsmls','wmulwsmge','wmulwsmlt','wmulwsmgt','wmulwsmle',
+ 'wmulwleq','wmulwlne','wmulwlcs','wmulwlhs','wmulwlcc','wmulwllo','wmulwlmi','wmulwlpl','wmulwlvs','wmulwlvc','wmulwlhi','wmulwlls','wmulwlge','wmulwllt','wmulwlgt','wmulwlle',
+ 'wmulwumreq','wmulwumrne','wmulwumrcs','wmulwumrhs','wmulwumrcc','wmulwumrlo','wmulwumrmi','wmulwumrpl','wmulwumrvs','wmulwumrvc','wmulwumrhi','wmulwumrls','wmulwumrge','wmulwumrlt','wmulwumrgt','wmulwumrle',
+ 'wmulwsmreq','wmulwsmrne','wmulwsmrcs','wmulwsmrhs','wmulwsmrcc','wmulwsmrlo','wmulwsmrmi','wmulwsmrpl','wmulwsmrvs','wmulwsmrvc','wmulwsmrhi','wmulwsmrls','wmulwsmrge','wmulwsmrlt','wmulwsmrgt','wmulwsmrle',
+ 'woreq','worne','worcs','worhs','worcc','worlo','wormi','worpl','worvs','worvc','worhi','worls','worge','worlt','worgt','worle',
+ 'wpackhsseq','wpackhssne','wpackhsscs','wpackhsshs','wpackhsscc','wpackhsslo','wpackhssmi','wpackhsspl','wpackhssvs','wpackhssvc','wpackhsshi','wpackhssls','wpackhssge','wpackhsslt','wpackhssgt','wpackhssle',
+ 'wpackwsseq','wpackwssne','wpackwsscs','wpackwsshs','wpackwsscc','wpackwsslo','wpackwssmi','wpackwsspl','wpackwssvs','wpackwssvc','wpackwsshi','wpackwssls','wpackwssge','wpackwsslt','wpackwssgt','wpackwssle',
+ 'wpackdsseq','wpackdssne','wpackdsscs','wpackdsshs','wpackdsscc','wpackdsslo','wpackdssmi','wpackdsspl','wpackdssvs','wpackdssvc','wpackdsshi','wpackdssls','wpackdssge','wpackdsslt','wpackdssgt','wpackdssle',
+ 'wpackhuseq','wpackhusne','wpackhuscs','wpackhushs','wpackhuscc','wpackhuslo','wpackhusmi','wpackhuspl','wpackhusvs','wpackhusvc','wpackhushi','wpackhusls','wpackhusge','wpackhuslt','wpackhusgt','wpackhusle',
+ 'wpackwuseq','wpackwusne','wpackwuscs','wpackwushs','wpackwuscc','wpackwuslo','wpackwusmi','wpackwuspl','wpackwusvs','wpackwusvc','wpackwushi','wpackwusls','wpackwusge','wpackwuslt','wpackwusgt','wpackwusle',
+ 'wpackduseq','wpackdusne','wpackduscs','wpackdushs','wpackduscc','wpackduslo','wpackdusmi','wpackduspl','wpackdusvs','wpackdusvc','wpackdushi','wpackdusls','wpackdusge','wpackduslt','wpackdusgt','wpackdusle',
+ 'wqmiabbeq','wqmiabbne','wqmiabbcs','wqmiabbhs','wqmiabbcc','wqmiabblo','wqmiabbmi','wqmiabbpl','wqmiabbvs','wqmiabbvc','wqmiabbhi','wqmiabbls','wqmiabbge','wqmiabblt','wqmiabbgt','wqmiabble',
+ 'wqmiabteq','wqmiabtne','wqmiabtcs','wqmiabths','wqmiabtcc','wqmiabtlo','wqmiabtmi','wqmiabtpl','wqmiabtvs','wqmiabtvc','wqmiabthi','wqmiabtls','wqmiabtge','wqmiabtlt','wqmiabtgt','wqmiabtle',
+ 'wqmiatbeq','wqmiatbne','wqmiatbcs','wqmiatbhs','wqmiatbcc','wqmiatblo','wqmiatbmi','wqmiatbpl','wqmiatbvs','wqmiatbvc','wqmiatbhi','wqmiatbls','wqmiatbge','wqmiatblt','wqmiatbgt','wqmiatble',
+ 'wqmiatteq','wqmiattne','wqmiattcs','wqmiatths','wqmiattcc','wqmiattlo','wqmiattmi','wqmiattpl','wqmiattvs','wqmiattvc','wqmiatthi','wqmiattls','wqmiattge','wqmiattlt','wqmiattgt','wqmiattle',
+ 'wqmiabbneq','wqmiabbnne','wqmiabbncs','wqmiabbnhs','wqmiabbncc','wqmiabbnlo','wqmiabbnmi','wqmiabbnpl','wqmiabbnvs','wqmiabbnvc','wqmiabbnhi','wqmiabbnls','wqmiabbnge','wqmiabbnlt','wqmiabbngt','wqmiabbnle',
+ 'wqmiabtneq','wqmiabtnne','wqmiabtncs','wqmiabtnhs','wqmiabtncc','wqmiabtnlo','wqmiabtnmi','wqmiabtnpl','wqmiabtnvs','wqmiabtnvc','wqmiabtnhi','wqmiabtnls','wqmiabtnge','wqmiabtnlt','wqmiabtngt','wqmiabtnle',
+ 'wqmiatbneq','wqmiatbnne','wqmiatbncs','wqmiatbnhs','wqmiatbncc','wqmiatbnlo','wqmiatbnmi','wqmiatbnpl','wqmiatbnvs','wqmiatbnvc','wqmiatbnhi','wqmiatbnls','wqmiatbnge','wqmiatbnlt','wqmiatbngt','wqmiatbnle',
+ 'wqmiattneq','wqmiattnne','wqmiattncs','wqmiattnhs','wqmiattncc','wqmiattnlo','wqmiattnmi','wqmiattnpl','wqmiattnvs','wqmiattnvc','wqmiattnhi','wqmiattnls','wqmiattnge','wqmiattnlt','wqmiattngt','wqmiattnle',
+ 'wqmulmeq','wqmulmne','wqmulmcs','wqmulmhs','wqmulmcc','wqmulmlo','wqmulmmi','wqmulmpl','wqmulmvs','wqmulmvc','wqmulmhi','wqmulmls','wqmulmge','wqmulmlt','wqmulmgt','wqmulmle',
+ 'wqmulmreq','wqmulmrne','wqmulmrcs','wqmulmrhs','wqmulmrcc','wqmulmrlo','wqmulmrmi','wqmulmrpl','wqmulmrvs','wqmulmrvc','wqmulmrhi','wqmulmrls','wqmulmrge','wqmulmrlt','wqmulmrgt','wqmulmrle',
+ 'wqmulwmeq','wqmulwmne','wqmulwmcs','wqmulwmhs','wqmulwmcc','wqmulwmlo','wqmulwmmi','wqmulwmpl','wqmulwmvs','wqmulwmvc','wqmulwmhi','wqmulwmls','wqmulwmge','wqmulwmlt','wqmulwmgt','wqmulwmle',
+ 'wqmulwmreq','wqmulwmrne','wqmulwmrcs','wqmulwmrhs','wqmulwmrcc','wqmulwmrlo','wqmulwmrmi','wqmulwmrpl','wqmulwmrvs','wqmulwmrvc','wqmulwmrhi','wqmulwmrls','wqmulwmrge','wqmulwmrlt','wqmulwmrgt','wqmulwmrle',
+ 'wrorheq','wrorhne','wrorhcs','wrorhhs','wrorhcc','wrorhlo','wrorhmi','wrorhpl','wrorhvs','wrorhvc','wrorhhi','wrorhls','wrorhge','wrorhlt','wrorhgt','wrorhle',
+ 'wrorweq','wrorwne','wrorwcs','wrorwhs','wrorwcc','wrorwlo','wrorwmi','wrorwpl','wrorwvs','wrorwvc','wrorwhi','wrorwls','wrorwge','wrorwlt','wrorwgt','wrorwle',
+ 'wrordeq','wrordne','wrordcs','wrordhs','wrordcc','wrordlo','wrordmi','wrordpl','wrordvs','wrordvc','wrordhi','wrordls','wrordge','wrordlt','wrordgt','wrordle',
+ 'wrorhgeq','wrorhgne','wrorhgcs','wrorhghs','wrorhgcc','wrorhglo','wrorhgmi','wrorhgpl','wrorhgvs','wrorhgvc','wrorhghi','wrorhgls','wrorhgge','wrorhglt','wrorhggt','wrorhgle',
+ 'wrorwgeq','wrorwgne','wrorwgcs','wrorwghs','wrorwgcc','wrorwglo','wrorwgmi','wrorwgpl','wrorwgvs','wrorwgvc','wrorwghi','wrorwgls','wrorwgge','wrorwglt','wrorwggt','wrorwgle',
+ 'wrordgeq','wrordgne','wrordgcs','wrordghs','wrordgcc','wrordglo','wrordgmi','wrordgpl','wrordgvs','wrordgvc','wrordghi','wrordgls','wrordgge','wrordglt','wrordggt','wrordgle',
+ 'wsadbeq','wsadbne','wsadbcs','wsadbhs','wsadbcc','wsadblo','wsadbmi','wsadbpl','wsadbvs','wsadbvc','wsadbhi','wsadbls','wsadbge','wsadblt','wsadbgt','wsadble',
+ 'wsadheq','wsadhne','wsadhcs','wsadhhs','wsadhcc','wsadhlo','wsadhmi','wsadhpl','wsadhvs','wsadhvc','wsadhhi','wsadhls','wsadhge','wsadhlt','wsadhgt','wsadhle',
+ 'wsadbzeq','wsadbzne','wsadbzcs','wsadbzhs','wsadbzcc','wsadbzlo','wsadbzmi','wsadbzpl','wsadbzvs','wsadbzvc','wsadbzhi','wsadbzls','wsadbzge','wsadbzlt','wsadbzgt','wsadbzle',
+ 'wsadhzeq','wsadhzne','wsadhzcs','wsadhzhs','wsadhzcc','wsadhzlo','wsadhzmi','wsadhzpl','wsadhzvs','wsadhzvc','wsadhzhi','wsadhzls','wsadhzge','wsadhzlt','wsadhzgt','wsadhzle',
+ 'wshufheq','wshufhne','wshufhcs','wshufhhs','wshufhcc','wshufhlo','wshufhmi','wshufhpl','wshufhvs','wshufhvc','wshufhhi','wshufhls','wshufhge','wshufhlt','wshufhgt','wshufhle',
+ 'wsllheq','wsllhne','wsllhcs','wsllhhs','wsllhcc','wsllhlo','wsllhmi','wsllhpl','wsllhvs','wsllhvc','wsllhhi','wsllhls','wsllhge','wsllhlt','wsllhgt','wsllhle',
+ 'wsllweq','wsllwne','wsllwcs','wsllwhs','wsllwcc','wsllwlo','wsllwmi','wsllwpl','wsllwvs','wsllwvc','wsllwhi','wsllwls','wsllwge','wsllwlt','wsllwgt','wsllwle',
+ 'wslldeq','wslldne','wslldcs','wslldhs','wslldcc','wslldlo','wslldmi','wslldpl','wslldvs','wslldvc','wslldhi','wslldls','wslldge','wslldlt','wslldgt','wslldle',
+ 'wsllhgeq','wsllhgne','wsllhgcs','wsllhghs','wsllhgcc','wsllhglo','wsllhgmi','wsllhgpl','wsllhgvs','wsllhgvc','wsllhghi','wsllhgls','wsllhgge','wsllhglt','wsllhggt','wsllhgle',
+ 'wsllwgeq','wsllwgne','wsllwgcs','wsllwghs','wsllwgcc','wsllwglo','wsllwgmi','wsllwgpl','wsllwgvs','wsllwgvc','wsllwghi','wsllwgls','wsllwgge','wsllwglt','wsllwggt','wsllwgle',
+ 'wslldgeq','wslldgne','wslldgcs','wslldghs','wslldgcc','wslldglo','wslldgmi','wslldgpl','wslldgvs','wslldgvc','wslldghi','wslldgls','wslldgge','wslldglt','wslldggt','wslldgle',
+ 'wsraheq','wsrahne','wsrahcs','wsrahhs','wsrahcc','wsrahlo','wsrahmi','wsrahpl','wsrahvs','wsrahvc','wsrahhi','wsrahls','wsrahge','wsrahlt','wsrahgt','wsrahle',
+ 'wsraweq','wsrawne','wsrawcs','wsrawhs','wsrawcc','wsrawlo','wsrawmi','wsrawpl','wsrawvs','wsrawvc','wsrawhi','wsrawls','wsrawge','wsrawlt','wsrawgt','wsrawle',
+ 'wsradeq','wsradne','wsradcs','wsradhs','wsradcc','wsradlo','wsradmi','wsradpl','wsradvs','wsradvc','wsradhi','wsradls','wsradge','wsradlt','wsradgt','wsradle',
+ 'wsrahgeq','wsrahgne','wsrahgcs','wsrahghs','wsrahgcc','wsrahglo','wsrahgmi','wsrahgpl','wsrahgvs','wsrahgvc','wsrahghi','wsrahgls','wsrahgge','wsrahglt','wsrahggt','wsrahgle',
+ 'wsrawgeq','wsrawgne','wsrawgcs','wsrawghs','wsrawgcc','wsrawglo','wsrawgmi','wsrawgpl','wsrawgvs','wsrawgvc','wsrawghi','wsrawgls','wsrawgge','wsrawglt','wsrawggt','wsrawgle',
+ 'wsradgeq','wsradgne','wsradgcs','wsradghs','wsradgcc','wsradglo','wsradgmi','wsradgpl','wsradgvs','wsradgvc','wsradghi','wsradgls','wsradgge','wsradglt','wsradggt','wsradgle',
+ 'wsrlheq','wsrlhne','wsrlhcs','wsrlhhs','wsrlhcc','wsrlhlo','wsrlhmi','wsrlhpl','wsrlhvs','wsrlhvc','wsrlhhi','wsrlhls','wsrlhge','wsrlhlt','wsrlhgt','wsrlhle',
+ 'wsrlweq','wsrlwne','wsrlwcs','wsrlwhs','wsrlwcc','wsrlwlo','wsrlwmi','wsrlwpl','wsrlwvs','wsrlwvc','wsrlwhi','wsrlwls','wsrlwge','wsrlwlt','wsrlwgt','wsrlwle',
+ 'wsrldeq','wsrldne','wsrldcs','wsrldhs','wsrldcc','wsrldlo','wsrldmi','wsrldpl','wsrldvs','wsrldvc','wsrldhi','wsrldls','wsrldge','wsrldlt','wsrldgt','wsrldle',
+ 'wsrlhgeq','wsrlhgne','wsrlhgcs','wsrlhghs','wsrlhgcc','wsrlhglo','wsrlhgmi','wsrlhgpl','wsrlhgvs','wsrlhgvc','wsrlhghi','wsrlhgls','wsrlhgge','wsrlhglt','wsrlhggt','wsrlhgle',
+ 'wsrlwgeq','wsrlwgne','wsrlwgcs','wsrlwghs','wsrlwgcc','wsrlwglo','wsrlwgmi','wsrlwgpl','wsrlwgvs','wsrlwgvc','wsrlwghi','wsrlwgls','wsrlwgge','wsrlwglt','wsrlwggt','wsrlwgle',
+ 'wsrldgeq','wsrldgne','wsrldgcs','wsrldghs','wsrldgcc','wsrldglo','wsrldgmi','wsrldgpl','wsrldgvs','wsrldgvc','wsrldghi','wsrldgls','wsrldgge','wsrldglt','wsrldggt','wsrldgle',
+ 'wstrbeq','wstrbne','wstrbcs','wstrbhs','wstrbcc','wstrblo','wstrbmi','wstrbpl','wstrbvs','wstrbvc','wstrbhi','wstrbls','wstrbge','wstrblt','wstrbgt','wstrble',
+ 'wstrheq','wstrhne','wstrhcs','wstrhhs','wstrhcc','wstrhlo','wstrhmi','wstrhpl','wstrhvs','wstrhvc','wstrhhi','wstrhls','wstrhge','wstrhlt','wstrhgt','wstrhle',
+ 'wstrweq','wstrwne','wstrwcs','wstrwhs','wstrwcc','wstrwlo','wstrwmi','wstrwpl','wstrwvs','wstrwvc','wstrwhi','wstrwls','wstrwge','wstrwlt','wstrwgt','wstrwle',
+ 'wstrdeq','wstrdne','wstrdcs','wstrdhs','wstrdcc','wstrdlo','wstrdmi','wstrdpl','wstrdvs','wstrdvc','wstrdhi','wstrdls','wstrdge','wstrdlt','wstrdgt','wstrdle',
+ 'wsubbeq','wsubbne','wsubbcs','wsubbhs','wsubbcc','wsubblo','wsubbmi','wsubbpl','wsubbvs','wsubbvc','wsubbhi','wsubbls','wsubbge','wsubblt','wsubbgt','wsubble',
+ 'wsubheq','wsubhne','wsubhcs','wsubhhs','wsubhcc','wsubhlo','wsubhmi','wsubhpl','wsubhvs','wsubhvc','wsubhhi','wsubhls','wsubhge','wsubhlt','wsubhgt','wsubhle',
+ 'wsubweq','wsubwne','wsubwcs','wsubwhs','wsubwcc','wsubwlo','wsubwmi','wsubwpl','wsubwvs','wsubwvc','wsubwhi','wsubwls','wsubwge','wsubwlt','wsubwgt','wsubwle',
+ 'wsubbsseq','wsubbssne','wsubbsscs','wsubbsshs','wsubbsscc','wsubbsslo','wsubbssmi','wsubbsspl','wsubbssvs','wsubbssvc','wsubbsshi','wsubbssls','wsubbssge','wsubbsslt','wsubbssgt','wsubbssle',
+ 'wsubhsseq','wsubhssne','wsubhsscs','wsubhsshs','wsubhsscc','wsubhsslo','wsubhssmi','wsubhsspl','wsubhssvs','wsubhssvc','wsubhsshi','wsubhssls','wsubhssge','wsubhsslt','wsubhssgt','wsubhssle',
+ 'wsubwsseq','wsubwssne','wsubwsscs','wsubwsshs','wsubwsscc','wsubwsslo','wsubwssmi','wsubwsspl','wsubwssvs','wsubwssvc','wsubwsshi','wsubwssls','wsubwssge','wsubwsslt','wsubwssgt','wsubwssle',
+ 'wsubbuseq','wsubbusne','wsubbuscs','wsubbushs','wsubbuscc','wsubbuslo','wsubbusmi','wsubbuspl','wsubbusvs','wsubbusvc','wsubbushi','wsubbusls','wsubbusge','wsubbuslt','wsubbusgt','wsubbusle',
+ 'wsubhuseq','wsubhusne','wsubhuscs','wsubhushs','wsubhuscc','wsubhuslo','wsubhusmi','wsubhuspl','wsubhusvs','wsubhusvc','wsubhushi','wsubhusls','wsubhusge','wsubhuslt','wsubhusgt','wsubhusle',
+ 'wsubwuseq','wsubwusne','wsubwuscs','wsubwushs','wsubwuscc','wsubwuslo','wsubwusmi','wsubwuspl','wsubwusvs','wsubwusvc','wsubwushi','wsubwusls','wsubwusge','wsubwuslt','wsubwusgt','wsubwusle',
+ 'wsubaddhxeq','wsubaddhxne','wsubaddhxcs','wsubaddhxhs','wsubaddhxcc','wsubaddhxlo','wsubaddhxmi','wsubaddhxpl','wsubaddhxvs','wsubaddhxvc','wsubaddhxhi','wsubaddhxls','wsubaddhxge','wsubaddhxlt','wsubaddhxgt','wsubaddhxle',
+ 'wunpckehsbeq','wunpckehsbne','wunpckehsbcs','wunpckehsbhs','wunpckehsbcc','wunpckehsblo','wunpckehsbmi','wunpckehsbpl','wunpckehsbvs','wunpckehsbvc','wunpckehsbhi','wunpckehsbls','wunpckehsbge','wunpckehsblt','wunpckehsbgt','wunpckehsble',
+ 'wunpckehsheq','wunpckehshne','wunpckehshcs','wunpckehshhs','wunpckehshcc','wunpckehshlo','wunpckehshmi','wunpckehshpl','wunpckehshvs','wunpckehshvc','wunpckehshhi','wunpckehshls','wunpckehshge','wunpckehshlt','wunpckehshgt','wunpckehshle',
+ 'wunpckehsweq','wunpckehswne','wunpckehswcs','wunpckehswhs','wunpckehswcc','wunpckehswlo','wunpckehswmi','wunpckehswpl','wunpckehswvs','wunpckehswvc','wunpckehswhi','wunpckehswls','wunpckehswge','wunpckehswlt','wunpckehswgt','wunpckehswle',
+ 'wunpckehubeq','wunpckehubne','wunpckehubcs','wunpckehubhs','wunpckehubcc','wunpckehublo','wunpckehubmi','wunpckehubpl','wunpckehubvs','wunpckehubvc','wunpckehubhi','wunpckehubls','wunpckehubge','wunpckehublt','wunpckehubgt','wunpckehuble',
+ 'wunpckehuheq','wunpckehuhne','wunpckehuhcs','wunpckehuhhs','wunpckehuhcc','wunpckehuhlo','wunpckehuhmi','wunpckehuhpl','wunpckehuhvs','wunpckehuhvc','wunpckehuhhi','wunpckehuhls','wunpckehuhge','wunpckehuhlt','wunpckehuhgt','wunpckehuhle',
+ 'wunpckehuweq','wunpckehuwne','wunpckehuwcs','wunpckehuwhs','wunpckehuwcc','wunpckehuwlo','wunpckehuwmi','wunpckehuwpl','wunpckehuwvs','wunpckehuwvc','wunpckehuwhi','wunpckehuwls','wunpckehuwge','wunpckehuwlt','wunpckehuwgt','wunpckehuwle',
+ 'wunpckihbeq','wunpckihbne','wunpckihbcs','wunpckihbhs','wunpckihbcc','wunpckihblo','wunpckihbmi','wunpckihbpl','wunpckihbvs','wunpckihbvc','wunpckihbhi','wunpckihbls','wunpckihbge','wunpckihblt','wunpckihbgt','wunpckihble',
+ 'wunpckihheq','wunpckihhne','wunpckihhcs','wunpckihhhs','wunpckihhcc','wunpckihhlo','wunpckihhmi','wunpckihhpl','wunpckihhvs','wunpckihhvc','wunpckihhhi','wunpckihhls','wunpckihhge','wunpckihhlt','wunpckihhgt','wunpckihhle',
+ 'wunpckihweq','wunpckihwne','wunpckihwcs','wunpckihwhs','wunpckihwcc','wunpckihwlo','wunpckihwmi','wunpckihwpl','wunpckihwvs','wunpckihwvc','wunpckihwhi','wunpckihwls','wunpckihwge','wunpckihwlt','wunpckihwgt','wunpckihwle',
+ 'wunpckelsbeq','wunpckelsbne','wunpckelsbcs','wunpckelsbhs','wunpckelsbcc','wunpckelsblo','wunpckelsbmi','wunpckelsbpl','wunpckelsbvs','wunpckelsbvc','wunpckelsbhi','wunpckelsbls','wunpckelsbge','wunpckelsblt','wunpckelsbgt','wunpckelsble',
+ 'wunpckelsheq','wunpckelshne','wunpckelshcs','wunpckelshhs','wunpckelshcc','wunpckelshlo','wunpckelshmi','wunpckelshpl','wunpckelshvs','wunpckelshvc','wunpckelshhi','wunpckelshls','wunpckelshge','wunpckelshlt','wunpckelshgt','wunpckelshle',
+ 'wunpckelsweq','wunpckelswne','wunpckelswcs','wunpckelswhs','wunpckelswcc','wunpckelswlo','wunpckelswmi','wunpckelswpl','wunpckelswvs','wunpckelswvc','wunpckelswhi','wunpckelswls','wunpckelswge','wunpckelswlt','wunpckelswgt','wunpckelswle',
+ 'wunpckelubeq','wunpckelubne','wunpckelubcs','wunpckelubhs','wunpckelubcc','wunpckelublo','wunpckelubmi','wunpckelubpl','wunpckelubvs','wunpckelubvc','wunpckelubhi','wunpckelubls','wunpckelubge','wunpckelublt','wunpckelubgt','wunpckeluble',
+ 'wunpckeluheq','wunpckeluhne','wunpckeluhcs','wunpckeluhhs','wunpckeluhcc','wunpckeluhlo','wunpckeluhmi','wunpckeluhpl','wunpckeluhvs','wunpckeluhvc','wunpckeluhhi','wunpckeluhls','wunpckeluhge','wunpckeluhlt','wunpckeluhgt','wunpckeluhle',
+ 'wunpckeluweq','wunpckeluwne','wunpckeluwcs','wunpckeluwhs','wunpckeluwcc','wunpckeluwlo','wunpckeluwmi','wunpckeluwpl','wunpckeluwvs','wunpckeluwvc','wunpckeluwhi','wunpckeluwls','wunpckeluwge','wunpckeluwlt','wunpckeluwgt','wunpckeluwle',
+ 'wunpckilbeq','wunpckilbne','wunpckilbcs','wunpckilbhs','wunpckilbcc','wunpckilblo','wunpckilbmi','wunpckilbpl','wunpckilbvs','wunpckilbvc','wunpckilbhi','wunpckilbls','wunpckilbge','wunpckilblt','wunpckilbgt','wunpckilble',
+ 'wunpckilheq','wunpckilhne','wunpckilhcs','wunpckilhhs','wunpckilhcc','wunpckilhlo','wunpckilhmi','wunpckilhpl','wunpckilhvs','wunpckilhvc','wunpckilhhi','wunpckilhls','wunpckilhge','wunpckilhlt','wunpckilhgt','wunpckilhle',
+ 'wunpckilweq','wunpckilwne','wunpckilwcs','wunpckilwhs','wunpckilwcc','wunpckilwlo','wunpckilwmi','wunpckilwpl','wunpckilwvs','wunpckilwvc','wunpckilwhi','wunpckilwls','wunpckilwge','wunpckilwlt','wunpckilwgt','wunpckilwle',
+ 'wxoreq','wxorne','wxorcs','wxorhs','wxorcc','wxorlo','wxormi','wxorpl','wxorvs','wxorvc','wxorhi','wxorls','wxorge','wxorlt','wxorgt','wxorle',
+ 'wzeroeq','wzerone','wzerocs','wzerohs','wzerocc','wzerolo','wzeromi','wzeropl','wzerovs','wzerovc','wzerohi','wzerols','wzeroge','wzerolt','wzerogt','wzerole'
+ ),
+ /* Unconditional VFPv3 & NEON SIMD Memory Access Instructions */
+ 19 => array(
+ /* Unconditional VFPv3 & NEON SIMD Memory Access: Loads */
+ 'vld.8','vldal.8',
+ 'vld.16','vldal.16',
+ 'vld.32','vldal.32',
+ 'vld.64','vldal.64',
+
+ 'vld1.8','vld1al.8',
+ 'vld1.16','vld1al.16',
+ 'vld1.32','vld1al.32',
+
+ 'vld2.8','vld2al.8',
+ 'vld2.16','vld2al.16',
+ 'vld2.32','vld2al.32',
+
+ 'vld3.8','vld3al.8',
+ 'vld3.16','vld3al.16',
+ 'vld3.32','vld3al.32',
+
+ 'vld4.8','vld4al.8',
+ 'vld4.16','vld4al.16',
+ 'vld4.32','vld4al.32',
+
+ 'vldm','vldmal',
+ 'vldm.32','vldmal.32',
+ 'vldm.64','vldmal.64',
+
+ 'vldmia','vldmiaal',
+ 'vldmia.32','vldmiaal.32',
+ 'vldmia.64','vldmiaal.64',
+
+ 'vldmdb','vldmdbal',
+ 'vldmdb.32','vldmdbal.32',
+ 'vldmdb.64','vldmdbal.64',
+
+ 'vldr','vldral',
+ 'vldr.32','vldral.32',
+ 'vldr.64','vldral.64',
+
+ 'vpop','vpopal',
+ 'vpop.32','vpopal.32',
+ 'vpop.64','vpopal.64',
+
+ /* Unconditional VFPv3 & NEON SIMD Memory Access: Stores */
+ 'vst1.8','vst1al.8',
+ 'vst1.16','vst1al.16',
+ 'vst1.32','vst1al.32',
+ 'vst1.64','vst1al.64',
+
+ 'vst2.8','vst2al.8',
+ 'vst2.16','vst2al.16',
+ 'vst2.32','vst2al.32',
+
+ 'vst3.8','vst3al.8',
+ 'vst3.16','vst3al.16',
+ 'vst3.32','vst3al.32',
+
+ 'vst4.8','vst4al.8',
+ 'vst4.16','vst4al.16',
+ 'vst4.32','vst4al.32',
+
+ 'vstm','vstmal',
+ 'vstm.32','vstmal.32',
+ 'vstm.64','vstmal.64',
+
+ 'vstmia','vstmiaal',
+ 'vstmia.32','vstmiaal.32',
+ 'vstmia.64','vstmiaal.64',
+
+ 'vstmdb','vstmdbal',
+ 'vstmdb.32','vstmdbal.32',
+ 'vstmdb.64','vstmdbal.64',
+
+ 'vstr','vstral',
+ 'vstr.32','vstral.32',
+ 'vstr.64','vstral.64',
+
+ 'vpush','vpushal',
+ 'vpush.32','vpushal.32',
+ 'vpush.64','vpushal.64'
+ ),
+ /* Unconditional NEON SIMD Logical Instructions */
+ 20 => array(
+ 'vand','vandal',
+ 'vand.i8','vandal.i8',
+ 'vand.i16','vandal.i16',
+ 'vand.i32','vandal.i32',
+ 'vand.i64','vandal.i64',
+ 'vand.s8','vandal.s8',
+ 'vand.s16','vandal.s16',
+ 'vand.s32','vandal.s32',
+ 'vand.s64','vandal.s64',
+ 'vand.u8','vandal.u8',
+ 'vand.u16','vandal.u16',
+ 'vand.u32','vandal.u32',
+ 'vand.u64','vandal.u64',
+ 'vand.f32','vandal.f32',
+ 'vand.f64','vandal.f64',
+
+ 'vbic','vbical',
+ 'vbic.i8','vbical.i8',
+ 'vbic.i16','vbical.i16',
+ 'vbic.i32','vbical.i32',
+ 'vbic.i64','vbical.i64',
+ 'vbic.s8','vbical.s8',
+ 'vbic.s16','vbical.s16',
+ 'vbic.s32','vbical.s32',
+ 'vbic.s64','vbical.s64',
+ 'vbic.u8','vbical.u8',
+ 'vbic.u16','vbical.u16',
+ 'vbic.u32','vbical.u32',
+ 'vbic.u64','vbical.u64',
+ 'vbic.f32','vbical.f32',
+ 'vbic.f64','vbical.f64',
+
+ 'vbif','vbifal',
+ 'vbif.i8','vbifal.i8',
+ 'vbif.i16','vbifal.i16',
+ 'vbif.i32','vbifal.i32',
+ 'vbif.i64','vbifal.i64',
+ 'vbif.s8','vbifal.s8',
+ 'vbif.s16','vbifal.s16',
+ 'vbif.s32','vbifal.s32',
+ 'vbif.s64','vbifal.s64',
+ 'vbif.u8','vbifal.u8',
+ 'vbif.u16','vbifal.u16',
+ 'vbif.u32','vbifal.u32',
+ 'vbif.u64','vbifal.u64',
+ 'vbif.f32','vbifal.f32',
+ 'vbif.f64','vbifal.f64',
+
+ 'vbit','vbital',
+ 'vbit.i8','vbital.i8',
+ 'vbit.i16','vbital.i16',
+ 'vbit.i32','vbital.i32',
+ 'vbit.i64','vbital.i64',
+ 'vbit.s8','vbital.s8',
+ 'vbit.s16','vbital.s16',
+ 'vbit.s32','vbital.s32',
+ 'vbit.s64','vbital.s64',
+ 'vbit.u8','vbital.u8',
+ 'vbit.u16','vbital.u16',
+ 'vbit.u32','vbital.u32',
+ 'vbit.u64','vbital.u64',
+ 'vbit.f32','vbital.f32',
+ 'vbit.f64','vbital.f64',
+
+ 'vbsl','vbslal',
+ 'vbsl.i8','vbslal.i8',
+ 'vbsl.i16','vbslal.i16',
+ 'vbsl.i32','vbslal.i32',
+ 'vbsl.i64','vbslal.i64',
+ 'vbsl.s8','vbslal.s8',
+ 'vbsl.s16','vbslal.s16',
+ 'vbsl.s32','vbslal.s32',
+ 'vbsl.s64','vbslal.s64',
+ 'vbsl.u8','vbslal.u8',
+ 'vbsl.u16','vbslal.u16',
+ 'vbsl.u32','vbslal.u32',
+ 'vbsl.u64','vbslal.u64',
+ 'vbsl.f32','vbslal.f32',
+ 'vbsl.f64','vbslal.f64',
+
+ 'veor','veoral',
+ 'veor.i8','veoral.i8',
+ 'veor.i16','veoral.i16',
+ 'veor.i32','veoral.i32',
+ 'veor.i64','veoral.i64',
+ 'veor.s8','veoral.s8',
+ 'veor.s16','veoral.s16',
+ 'veor.s32','veoral.s32',
+ 'veor.s64','veoral.s64',
+ 'veor.u8','veoral.u8',
+ 'veor.u16','veoral.u16',
+ 'veor.u32','veoral.u32',
+ 'veor.u64','veoral.u64',
+ 'veor.f32','veoral.f32',
+ 'veor.f64','veoral.f64',
+
+ 'vmov','vmoval',
+ 'vmov.8','vmoval.8',
+ 'vmov.16','vmoval.16',
+ 'vmov.32','vmoval.32',
+ 'vmov.i8','vmoval.i8',
+ 'vmov.i16','vmoval.i16',
+ 'vmov.i32','vmoval.i32',
+ 'vmov.i64','vmoval.i64',
+ 'vmov.f32','vmoval.f32',
+ 'vmov.f64','vmoval.f64',
+
+ 'vmvn','vmvnal',
+ 'vmvn.s8','vmvnal.s8',
+ 'vmvn.s16','vmvnal.s16',
+ 'vmvn.s32','vmvnal.s32',
+ 'vmvn.s64','vmvnal.s64',
+ 'vmvn.u8','vmvnal.u8',
+ 'vmvn.u16','vmvnal.u16',
+ 'vmvn.u32','vmvnal.u32',
+ 'vmvn.u64','vmvnal.u64',
+ 'vmvn.i8','vmvnal.i8',
+ 'vmvn.i16','vmvnal.i16',
+ 'vmvn.i32','vmvnal.i32',
+ 'vmvn.i64','vmvnal.i64',
+ 'vmvn.f32','vmvnal.f32',
+ 'vmvn.f64','vmvnal.f64',
+
+ 'vorn','vornal',
+ 'vorn.s8','vornal.s8',
+ 'vorn.s16','vornal.s16',
+ 'vorn.s32','vornal.s32',
+ 'vorn.s64','vornal.s64',
+ 'vorn.u8','vornal.u8',
+ 'vorn.u16','vornal.u16',
+ 'vorn.u32','vornal.u32',
+ 'vorn.u64','vornal.u64',
+ 'vorn.i8','vornal.i8',
+ 'vorn.i16','vornal.i16',
+ 'vorn.i32','vornal.i32',
+ 'vorn.i64','vornal.i64',
+ 'vorn.f32','vornal.f32',
+ 'vorn.f64','vornal.f64',
+
+ 'vorr','vorral',
+ 'vorr.s8','vorral.s8',
+ 'vorr.s16','vorral.s16',
+ 'vorr.s32','vorral.s32',
+ 'vorr.s64','vorral.s64',
+ 'vorr.u8','vorral.u8',
+ 'vorr.u16','vorral.u16',
+ 'vorr.u32','vorral.u32',
+ 'vorr.u64','vorral.u64',
+ 'vorr.i8','vorral.i8',
+ 'vorr.i16','vorral.i16',
+ 'vorr.i32','vorral.i32',
+ 'vorr.i64','vorral.i64',
+ 'vorr.f32','vorral.f32',
+ 'vorr.f64','vorral.f64',
+
+ 'vswp','vswpal',
+ 'vswp.s8','vswpal.s8',
+ 'vswp.s16','vswpal.s16',
+ 'vswp.s32','vswpal.s32',
+ 'vswp.s64','vswpal.s64',
+ 'vswp.u8','vswpal.u8',
+ 'vswp.u16','vswpal.u16',
+ 'vswp.u32','vswpal.u32',
+ 'vswp.u64','vswpal.u64',
+ 'vswp.i8','vswpal.i8',
+ 'vswp.i16','vswpal.i16',
+ 'vswp.i32','vswpal.i32',
+ 'vswp.i64','vswpal.i64',
+ 'vswp.f32','vswpal.f32',
+ 'vswp.f64','vswpal.f64'
+ ),
+ /* Unconditional NEON SIMD ARM Registers Interop Instructions */
+ 21 => array(
+ 'vmrs','vmrsal',
+ 'vmsr','vmsral'
+ ),
+ /* Unconditional NEON SIMD Bit/Byte-Level Instructions */
+ 22 => array(
+ 'vcnt.8','vcntal.8',
+ 'vdup.8','vdupal.8',
+
+ 'vdup.16','vdupal.16',
+ 'vdup.32','vdupal.32',
+
+ 'vext.8','vextal.8',
+ 'vext.16','vextal.16',
+
+ 'vext.32','vextal.32',
+ 'vext.64','vextal.64',
+
+ 'vrev16.8','vrev16al.8',
+ 'vrev32.8','vrev32al.8',
+ 'vrev32.16','vrev32al.16',
+ 'vrev64.8','vrev64al.8',
+ 'vrev64.16','vrev64al.16',
+ 'vrev64.32','vrev64al.32',
+
+ 'vsli.8','vslial.8',
+ 'vsli.16','vslial.16',
+ 'vsli.32','vslial.32',
+ 'vsli.64','vslial.64',
+
+ 'vsri.8','vsrial.8',
+ 'vsri.16','vsrial.16',
+ 'vsri.32','vsrial.32',
+ 'vsri.64','vsrial.64',
+
+ 'vtbl.8','vtblal.8',
+
+ 'vtbx','vtbxal',
+
+ 'vtrn.8','vtrnal.8',
+ 'vtrn.16','vtrnal.16',
+ 'vtrn.32','vtrnal.32',
+
+ 'vtst.8','vtstal.8',
+ 'vtst.16','vtstal.16',
+ 'vtst.32','vtstal.32',
+
+ 'vuzp.8','vuzpal.8',
+ 'vuzp.16','vuzpal.16',
+ 'vuzp.32','vuzpal.32',
+
+ 'vzip.8','vzipal.8',
+ 'vzip.16','vzipal.16',
+ 'vzip.32','vzipal.32',
+
+ 'vmull.p8','vmullal.p8'
+ ),
+ /* Unconditional NEON SIMD Universal Integer Instructions */
+ 23 => array(
+ 'vadd.i8','vaddal.i8',
+ 'vadd.i16','vaddal.i16',
+ 'vadd.i32','vaddal.i32',
+ 'vadd.i64','vaddal.i64',
+
+ 'vsub.i8','vsubal.i8',
+ 'vsub.i16','vsubal.i16',
+ 'vsub.i32','vsubal.i32',
+ 'vsub.i64','vsubal.i64',
+
+ 'vaddhn.i16','vaddhnal.i16',
+ 'vaddhn.i32','vaddhnal.i32',
+ 'vaddhn.i64','vaddhnal.i64',
+
+ 'vsubhn.i16','vsubhnal.i16',
+ 'vsubhn.i32','vsubhnal.i32',
+ 'vsubhn.i64','vsubhnal.i64',
+
+ 'vraddhn.i16','vraddhnal.i16',
+ 'vraddhn.i32','vraddhnal.i32',
+ 'vraddhn.i64','vraddhnal.i64',
+
+ 'vrsubhn.i16','vrsubhnal.i16',
+ 'vrsubhn.i32','vrsubhnal.i32',
+ 'vrsubhn.i64','vrsubhnal.i64',
+
+ 'vpadd.i8','vpaddal.i8',
+ 'vpadd.i16','vpaddal.i16',
+ 'vpadd.i32','vpaddal.i32',
+
+ 'vceq.i8','vceqal.i8',
+ 'vceq.i16','vceqal.i16',
+ 'vceq.i32','vceqal.i32',
+
+ 'vclz.i8','vclzal.i8',
+ 'vclz.i16','vclzal.i16',
+ 'vclz.i32','vclzal.i32',
+
+ 'vmovn.i16','vmovnal.i16',
+ 'vmovn.i32','vmovnal.i32',
+ 'vmovn.i64','vmovnal.i64',
+
+ 'vmla.s8','vmlaal.s8',
+ 'vmla.s16','vmlaal.s16',
+ 'vmla.s32','vmlaal.s32',
+ 'vmla.u8','vmlaal.u8',
+ 'vmla.u16','vmlaal.u16',
+ 'vmla.u32','vmlaal.u32',
+ 'vmla.i8','vmlaal.i8',
+ 'vmla.i16','vmlaal.i16',
+ 'vmla.i32','vmlaal.i32',
+
+ 'vmls.s8','vmlsal.s8',
+ 'vmls.s16','vmlsal.s16',
+ 'vmls.s32','vmlsal.s32',
+ 'vmls.u8','vmlsal.u8',
+ 'vmls.u16','vmlsal.u16',
+ 'vmls.u32','vmlsal.u32',
+ 'vmls.i8','vmlsal.i8',
+ 'vmls.i16','vmlsal.i16',
+ 'vmls.i32','vmlsal.i32',
+
+ 'vmul.s8','vmulal.s8',
+ 'vmul.s16','vmulal.s16',
+ 'vmul.s32','vmulal.s32',
+ 'vmul.u8','vmulal.u8',
+ 'vmul.u16','vmulal.u16',
+ 'vmul.u32','vmulal.u32',
+ 'vmul.i8','vmulal.i8',
+ 'vmul.i16','vmulal.i16',
+ 'vmul.i32','vmulal.i32',
+ 'vmul.p8','vmulal.p8',
+
+ 'vrshrn.i16','vrshrnal.i16',
+ 'vrshrn.i32','vrshrnal.i32',
+ 'vrshrn.i64','vrshrnal.i64',
+
+ 'vshrn.i16','vshrnal.i16',
+ 'vshrn.i32','vshrnal.i32',
+ 'vshrn.i64','vshrnal.i64',
+
+ 'vshl.i8','vshlal.i8',
+ 'vshl.i16','vshlal.i16',
+ 'vshl.i32','vshlal.i32',
+ 'vshl.i64','vshlal.i64',
+
+ 'vshll.i8','vshllal.i8',
+ 'vshll.i16','vshllal.i16',
+ 'vshll.i32','vshllal.i32'
+ ),
+ /* Unconditional NEON SIMD Signed Integer Instructions */
+ 24 => array(
+ 'vaba.s8','vabaal.s8',
+ 'vaba.s16','vabaal.s16',
+ 'vaba.s32','vabaal.s32',
+
+ 'vabal.s8','vabalal.s8',
+ 'vabal.s16','vabalal.s16',
+ 'vabal.s32','vabalal.s32',
+
+ 'vabd.s8','vabdal.s8',
+ 'vabd.s16','vabdal.s16',
+ 'vabd.s32','vabdal.s32',
+
+ 'vabs.s8','vabsal.s8',
+ 'vabs.s16','vabsal.s16',
+ 'vabs.s32','vabsal.s32',
+
+ 'vaddl.s8','vaddlal.s8',
+ 'vaddl.s16','vaddlal.s16',
+ 'vaddl.s32','vaddlal.s32',
+
+ 'vcge.s8','vcgeal.s8',
+ 'vcge.s16','vcgeal.s16',
+ 'vcge.s32','vcgeal.s32',
+
+ 'vcle.s8','vcleal.s8',
+ 'vcle.s16','vcleal.s16',
+ 'vcle.s32','vcleal.s32',
+
+ 'vcgt.s8','vcgtal.s8',
+ 'vcgt.s16','vcgtal.s16',
+ 'vcgt.s32','vcgtal.s32',
+
+ 'vclt.s8','vcltal.s8',
+ 'vclt.s16','vcltal.s16',
+ 'vclt.s32','vcltal.s32',
+
+ 'vcls.s8','vclsal.s8',
+ 'vcls.s16','vclsal.s16',
+ 'vcls.s32','vclsal.s32',
+
+ 'vaddw.s8','vaddwal.s8',
+ 'vaddw.s16','vaddwal.s16',
+ 'vaddw.s32','vaddwal.s32',
+
+ 'vhadd.s8','vhaddal.s8',
+ 'vhadd.s16','vhaddal.s16',
+ 'vhadd.s32','vhaddal.s32',
+
+ 'vhsub.s8','vhsubal.s8',
+ 'vhsub.s16','vhsubal.s16',
+ 'vhsub.s32','vhsubal.s32',
+
+ 'vmax.s8','vmaxal.s8',
+ 'vmax.s16','vmaxal.s16',
+ 'vmax.s32','vmaxal.s32',
+
+ 'vmin.s8','vminal.s8',
+ 'vmin.s16','vminal.s16',
+ 'vmin.s32','vminal.s32',
+
+ 'vmlal.s8','vmlalal.s8',
+ 'vmlal.s16','vmlalal.s16',
+ 'vmlal.s32','vmlalal.s32',
+
+ 'vmlsl.s8','vmlslal.s8',
+ 'vmlsl.s16','vmlslal.s16',
+ 'vmlsl.s32','vmlslal.s32',
+
+ 'vneg.s8','vnegal.s8',
+ 'vneg.s16','vnegal.s16',
+ 'vneg.s32','vnegal.s32',
+
+ 'vpadal.s8','vpadalal.s8',
+ 'vpadal.s16','vpadalal.s16',
+ 'vpadal.s32','vpadalal.s32',
+
+ 'vmovl.s8','vmovlal.s8',
+ 'vmovl.s16','vmovlal.s16',
+ 'vmovl.s32','vmovlal.s32',
+
+ 'vmull.s8','vmullal.s8',
+ 'vmull.s16','vmullal.s16',
+ 'vmull.s32','vmullal.s32',
+
+ 'vpaddl.s8','vpaddlal.s8',
+ 'vpaddl.s16','vpaddlal.s16',
+ 'vpaddl.s32','vpaddlal.s32',
+
+ 'vpmax.s8','vpmaxal.s8',
+ 'vpmax.s16','vpmaxal.s16',
+ 'vpmax.s32','vpmaxal.s32',
+
+ 'vpmin.s8','vpminal.s8',
+ 'vpmin.s16','vpminal.s16',
+ 'vpmin.s32','vpminal.s32',
+
+ 'vqabs.s8','vqabsal.s8',
+ 'vqabs.s16','vqabsal.s16',
+ 'vqabs.s32','vqabsal.s32',
+
+ 'vqadd.s8','vqaddal.s8',
+ 'vqadd.s16','vqaddal.s16',
+ 'vqadd.s32','vqaddal.s32',
+ 'vqadd.s64','vqaddal.s64',
+
+ 'vqdmlal.s16','vqdmlalal.s16',
+ 'vqdmlal.s32','vqdmlalal.s32',
+
+ 'vqdmlsl.s16','vqdmlslal.s16',
+ 'vqdmlsl.s32','vqdmlslal.s32',
+
+ 'vqdmulh.s16','vqdmulhal.s16',
+ 'vqdmulh.s32','vqdmulhal.s32',
+
+ 'vqdmull.s16','vqdmullal.s16',
+ 'vqdmull.s32','vqdmullal.s32',
+
+ 'vqmovn.s16','vqmovnal.s16',
+ 'vqmovn.s32','vqmovnal.s32',
+ 'vqmovn.s64','vqmovnal.s64',
+
+ 'vqmovun.s16','vqmovunal.s16',
+ 'vqmovun.s32','vqmovunal.s32',
+ 'vqmovun.s64','vqmovunal.s64',
+
+ 'vqneg.s8','vqnegal.s8',
+ 'vqneg.s16','vqnegal.s16',
+ 'vqneg.s32','vqnegal.s32',
+
+ 'vqrdmulh.s16','vqrdmulhal.s16',
+ 'vqrdmulh.s32','vqrdmulhal.s32',
+
+ 'vqrshl.s8','vqrshlal.s8',
+ 'vqrshl.s16','vqrshlal.s16',
+ 'vqrshl.s32','vqrshlal.s32',
+ 'vqrshl.s64','vqrshlal.s64',
+
+ 'vqrshrn.s16','vqrshrnal.s16',
+ 'vqrshrn.s32','vqrshrnal.s32',
+ 'vqrshrn.s64','vqrshrnal.s64',
+
+ 'vqrshrun.s16','vqrshrunal.s16',
+ 'vqrshrun.s32','vqrshrunal.s32',
+ 'vqrshrun.s64','vqrshrunal.s64',
+
+ 'vqshl.s8','vqshlal.s8',
+ 'vqshl.s16','vqshlal.s16',
+ 'vqshl.s32','vqshlal.s32',
+ 'vqshl.s64','vqshlal.s64',
+
+ 'vqshlu.s8','vqshlual.s8',
+ 'vqshlu.s16','vqshlual.s16',
+ 'vqshlu.s32','vqshlual.s32',
+ 'vqshlu.s64','vqshlual.s64',
+
+ 'vqshrn.s16','vqshrnal.s16',
+ 'vqshrn.s32','vqshrnal.s32',
+ 'vqshrn.s64','vqshrnal.s64',
+
+ 'vqshrun.s16','vqshrunal.s16',
+ 'vqshrun.s32','vqshrunal.s32',
+ 'vqshrun.s64','vqshrunal.s64',
+
+ 'vqsub.s8','vqsubal.s8',
+ 'vqsub.s16','vqsubal.s16',
+ 'vqsub.s32','vqsubal.s32',
+ 'vqsub.s64','vqsubal.s64',
+
+ 'vrhadd.s8','vrhaddal.s8',
+ 'vrhadd.s16','vrhaddal.s16',
+ 'vrhadd.s32','vrhaddal.s32',
+
+ 'vrshl.s8','vrshlal.s8',
+ 'vrshl.s16','vrshlal.s16',
+ 'vrshl.s32','vrshlal.s32',
+ 'vrshl.s64','vrshlal.s64',
+
+ 'vrshr.s8','vrshral.s8',
+ 'vrshr.s16','vrshral.s16',
+ 'vrshr.s32','vrshral.s32',
+ 'vrshr.s64','vrshral.s64',
+
+ 'vrsra.s8','vrsraal.s8',
+ 'vrsra.s16','vrsraal.s16',
+ 'vrsra.s32','vrsraal.s32',
+ 'vrsra.s64','vrsraal.s64',
+
+ 'vshl.s8','vshlal.s8',
+ 'vshl.s16','vshlal.s16',
+ 'vshl.s32','vshlal.s32',
+ 'vshl.s64','vshlal.s64',
+
+ 'vshll.s8','vshllal.s8',
+ 'vshll.s16','vshllal.s16',
+ 'vshll.s32','vshllal.s32',
+
+ 'vshr.s8','vshral.s8',
+ 'vshr.s16','vshral.s16',
+ 'vshr.s32','vshral.s32',
+ 'vshr.s64','vshral.s64',
+
+ 'vsra.s8','vsraal.s8',
+ 'vsra.s16','vsraal.s16',
+ 'vsra.s32','vsraal.s32',
+ 'vsra.s64','vsraal.s64',
+
+ 'vsubl.s8','vsublal.s8',
+ 'vsubl.s16','vsublal.s16',
+ 'vsubl.s32','vsublal.s32',
+
+ 'vsubh.s8','vsubhal.s8',
+ 'vsubh.s16','vsubhal.s16',
+ 'vsubh.s32','vsubhal.s32'
+ ),
+ /* Unconditional NEON SIMD Unsigned Integer Instructions */
+ 25 => array(
+ 'vaba.u8','vabaal.u8',
+ 'vaba.u16','vabaal.u16',
+ 'vaba.u32','vabaal.u32',
+
+ 'vabal.u8','vabalal.u8',
+ 'vabal.u16','vabalal.u16',
+ 'vabal.u32','vabalal.u32',
+
+ 'vabd.u8','vabdal.u8',
+ 'vabd.u16','vabdal.u16',
+ 'vabd.u32','vabdal.u32',
+
+ 'vaddl.u8','vaddlal.u8',
+ 'vaddl.u16','vaddlal.u16',
+ 'vaddl.u32','vaddlal.u32',
+
+ 'vsubl.u8','vsublal.u8',
+ 'vsubl.u16','vsublal.u16',
+ 'vsubl.u32','vsublal.u32',
+
+ 'vaddw.u8','vaddwal.u8',
+ 'vaddw.u16','vaddwal.u16',
+ 'vaddw.u32','vaddwal.u32',
+
+ 'vsubh.u8','vsubhal.u8',
+ 'vsubh.u16','vsubhal.u16',
+ 'vsubh.u32','vsubhal.u32',
+
+ 'vhadd.u8','vhaddal.u8',
+ 'vhadd.u16','vhaddal.u16',
+ 'vhadd.u32','vhaddal.u32',
+
+ 'vhsub.u8','vhsubal.u8',
+ 'vhsub.u16','vhsubal.u16',
+ 'vhsub.u32','vhsubal.u32',
+
+ 'vpadal.u8','vpadalal.u8',
+ 'vpadal.u16','vpadalal.u16',
+ 'vpadal.u32','vpadalal.u32',
+
+ 'vpaddl.u8','vpaddlal.u8',
+ 'vpaddl.u16','vpaddlal.u16',
+ 'vpaddl.u32','vpaddlal.u32',
+
+ 'vcge.u8','vcgeal.u8',
+ 'vcge.u16','vcgeal.u16',
+ 'vcge.u32','vcgeal.u32',
+
+ 'vcle.u8','vcleal.u8',
+ 'vcle.u16','vcleal.u16',
+ 'vcle.u32','vcleal.u32',
+
+ 'vcgt.u8','vcgtal.u8',
+ 'vcgt.u16','vcgtal.u16',
+ 'vcgt.u32','vcgtal.u32',
+
+ 'vclt.u8','vcltal.u8',
+ 'vclt.u16','vcltal.u16',
+ 'vclt.u32','vcltal.u32',
+
+ 'vmax.u8','vmaxal.u8',
+ 'vmax.u16','vmaxal.u16',
+ 'vmax.u32','vmaxal.u32',
+
+ 'vmin.u8','vminal.u8',
+ 'vmin.u16','vminal.u16',
+ 'vmin.u32','vminal.u32',
+
+ 'vmlal.u8','vmlalal.u8',
+ 'vmlal.u16','vmlalal.u16',
+ 'vmlal.u32','vmlalal.u32',
+
+ 'vmlsl.u8','vmlslal.u8',
+ 'vmlsl.u16','vmlslal.u16',
+ 'vmlsl.u32','vmlslal.u32',
+
+ 'vmull.u8','vmullal.u8',
+ 'vmull.u16','vmullal.u16',
+ 'vmull.u32','vmullal.u32',
+
+ 'vmovl.u8','vmovlal.u8',
+ 'vmovl.u16','vmovlal.u16',
+ 'vmovl.u32','vmovlal.u32',
+
+ 'vshl.u8','vshlal.u8',
+ 'vshl.u16','vshlal.u16',
+ 'vshl.u32','vshlal.u32',
+ 'vshl.u64','vshlal.u64',
+
+ 'vshll.u8','vshllal.u8',
+ 'vshll.u16','vshllal.u16',
+ 'vshll.u32','vshllal.u32',
+
+ 'vshr.u8','vshral.u8',
+ 'vshr.u16','vshral.u16',
+ 'vshr.u32','vshral.u32',
+ 'vshr.u64','vshral.u64',
+
+ 'vsra.u8','vsraal.u8',
+ 'vsra.u16','vsraal.u16',
+ 'vsra.u32','vsraal.u32',
+ 'vsra.u64','vsraal.u64',
+
+ 'vpmax.u8','vpmaxal.u8',
+ 'vpmax.u16','vpmaxal.u16',
+ 'vpmax.u32','vpmaxal.u32',
+
+ 'vpmin.u8','vpminal.u8',
+ 'vpmin.u16','vpminal.u16',
+ 'vpmin.u32','vpminal.u32',
+
+ 'vqadd.u8','vqaddal.u8',
+ 'vqadd.u16','vqaddal.u16',
+ 'vqadd.u32','vqaddal.u32',
+ 'vqadd.u64','vqaddal.u64',
+
+ 'vqsub.u8','vqsubal.u8',
+ 'vqsub.u16','vqsubal.u16',
+ 'vqsub.u32','vqsubal.u32',
+ 'vqsub.u64','vqsubal.u64',
+
+ 'vqmovn.u16','vqmovnal.u16',
+ 'vqmovn.u32','vqmovnal.u32',
+ 'vqmovn.u64','vqmovnal.u64',
+
+ 'vqshl.u8','vqshlal.u8',
+ 'vqshl.u16','vqshlal.u16',
+ 'vqshl.u32','vqshlal.u32',
+ 'vqshl.u64','vqshlal.u64',
+
+ 'vqshrn.u16','vqshrnal.u16',
+ 'vqshrn.u32','vqshrnal.u32',
+ 'vqshrn.u64','vqshrnal.u64',
+
+ 'vqrshl.u8','vqrshlal.u8',
+ 'vqrshl.u16','vqrshlal.u16',
+ 'vqrshl.u32','vqrshlal.u32',
+ 'vqrshl.u64','vqrshlal.u64',
+
+ 'vqrshrn.u16','vqrshrnal.u16',
+ 'vqrshrn.u32','vqrshrnal.u32',
+ 'vqrshrn.u64','vqrshrnal.u64',
+
+ 'vrhadd.u8','vrhaddal.u8',
+ 'vrhadd.u16','vrhaddal.u16',
+ 'vrhadd.u32','vrhaddal.u32',
+
+ 'vrshl.u8','vrshlal.u8',
+ 'vrshl.u16','vrshlal.u16',
+ 'vrshl.u32','vrshlal.u32',
+ 'vrshl.u64','vrshlal.u64',
+
+ 'vrshr.u8','vrshral.u8',
+ 'vrshr.u16','vrshral.u16',
+ 'vrshr.u32','vrshral.u32',
+ 'vrshr.u64','vrshral.u64',
+
+ 'vrsra.u8','vrsraal.u8',
+ 'vrsra.u16','vrsraal.u16',
+ 'vrsra.u32','vrsraal.u32',
+ 'vrsra.u64','vrsraal.u64'
+ ),
+ /* Unconditional VFPv3 & NEON SIMD Floating-Point Instructions */
+ 26 => array(
+ 'vabd.f32','vabdal.f32',
+
+ 'vabs.f32','vabsal.f32',
+ 'vabs.f64','vabsal.f64',
+
+ 'vacge.f32','vacgeal.f32',
+ 'vacgt.f32','vacgtal.f32',
+ 'vacle.f32','vacleal.f32',
+ 'vaclt.f32','vacltal.f32',
+
+ 'vadd.f32','vaddal.f32',
+ 'vadd.f64','vaddal.f64',
+
+ 'vceq.f32','vceqal.f32',
+ 'vcge.f32','vcgeal.f32',
+ 'vcle.f32','vcleal.f32',
+ 'vcgt.f32','vcgtal.f32',
+ 'vclt.f32','vcltal.f32',
+
+ 'vcmp.f32','vcmpal.f32',
+ 'vcmp.f64','vcmpal.f64',
+
+ 'vcmpe.f32','vcmpeal.f32',
+ 'vcmpe.f64','vcmpeal.f64',
+
+ 'vcvt.s16.f32','vcvtal.s16.f32',
+ 'vcvt.s16.f64','vcvtal.s16.f64',
+ 'vcvt.s32.f32','vcvtal.s32.f32',
+ 'vcvt.s32.f64','vcvtal.s32.f64',
+ 'vcvt.u16.f32','vcvtal.u16.f32',
+ 'vcvt.u16.f64','vcvtal.u16.f64',
+ 'vcvt.u32.f32','vcvtal.u32.f32',
+ 'vcvt.u32.f64','vcvtal.u32.f64',
+ 'vcvt.f16.f32','vcvtal.f16.f32',
+ 'vcvt.f32.s32','vcvtal.f32.s32',
+ 'vcvt.f32.u32','vcvtal.f32.u32',
+ 'vcvt.f32.f16','vcvtal.f32.f16',
+ 'vcvt.f32.f64','vcvtal.f32.f64',
+ 'vcvt.f64.s32','vcvtal.f64.s32',
+ 'vcvt.f64.u32','vcvtal.f64.u32',
+ 'vcvt.f64.f32','vcvtal.f64.f32',
+
+ 'vcvtr.s32.f32','vcvtral.s32.f32',
+ 'vcvtr.s32.f64','vcvtral.s32.f64',
+ 'vcvtr.u32.f32','vcvtral.u32.f32',
+ 'vcvtr.u32.f64','vcvtral.u32.f64',
+
+ 'vcvtb.f16.f32','vcvtbal.f16.f32',
+ 'vcvtb.f32.f16','vcvtbal.f32.f16',
+
+ 'vcvtt.f16.f32','vcvttal.f16.f32',
+ 'vcvtt.f32.f16','vcvttal.f32.f16',
+
+ 'vdiv.f32','vdival.f32',
+ 'vdiv.f64','vdival.f64',
+
+ 'vmax.f32','vmaxal.f32',
+ 'vmin.f32','vminal.f32',
+
+ 'vmla.f32','vmlaal.f32',
+ 'vmla.f64','vmlaal.f64',
+
+ 'vmls.f32','vmlsal.f32',
+ 'vmls.f64','vmlsal.f64',
+
+ 'vmul.f32','vmulal.f32',
+ 'vmul.f64','vmulal.f64',
+
+ 'vneg.f32','vnegal.f32',
+ 'vneg.f64','vnegal.f64',
+
+ 'vnmla.f32','vnmlaal.f32',
+ 'vnmla.f64','vnmlaal.f64',
+
+ 'vnmls.f32','vnmlsal.f32',
+ 'vnmls.f64','vnmlsal.f64',
+
+ 'vnmul.f64','vnmulal.f64',
+ 'vnmul.f32','vnmulal.f32',
+
+ 'vpadd.f32','vpaddal.f32',
+
+ 'vpmax.f32','vpmaxal.f32',
+ 'vpmin.f32','vpminal.f32',
+
+ 'vrecpe.u32','vrecpeal.u32',
+ 'vrecpe.f32','vrecpeal.f32',
+ 'vrecps.f32','vrecpsal.f32',
+
+ 'vrsqrte.u32','vrsqrteal.u32',
+ 'vrsqrte.f32','vrsqrteal.f32',
+ 'vrsqrts.f32','vrsqrtsal.f32',
+
+ 'vsqrt.f32','vsqrtal.f32',
+ 'vsqrt.f64','vsqrtal.f64',
+
+ 'vsub.f32','vsubal.f32',
+ 'vsub.f64','vsubal.f64'
+ ),
+ /* Conditional VFPv3 & NEON SIMD Memory Access Instructions */
+ 27 => array(
+ /* Conditional VFPv3 & NEON SIMD Memory Access: Loads */
+ 'vldeq.8','vldne.8','vldcs.8','vldhs.8','vldcc.8','vldlo.8','vldmi.8','vldpl.8','vldvs.8','vldvc.8','vldhi.8','vldls.8','vldge.8','vldlt.8','vldgt.8','vldle.8',
+ 'vldeq.16','vldne.16','vldcs.16','vldhs.16','vldcc.16','vldlo.16','vldmi.16','vldpl.16','vldvs.16','vldvc.16','vldhi.16','vldls.16','vldge.16','vldlt.16','vldgt.16','vldle.16',
+ 'vldeq.32','vldne.32','vldcs.32','vldhs.32','vldcc.32','vldlo.32','vldmi.32','vldpl.32','vldvs.32','vldvc.32','vldhi.32','vldls.32','vldge.32','vldlt.32','vldgt.32','vldle.32',
+ 'vldeq.64','vldne.64','vldcs.64','vldhs.64','vldcc.64','vldlo.64','vldmi.64','vldpl.64','vldvs.64','vldvc.64','vldhi.64','vldls.64','vldge.64','vldlt.64','vldgt.64','vldle.64',
+
+ 'vld1eq.8','vld1ne.8','vld1cs.8','vld1hs.8','vld1cc.8','vld1lo.8','vld1mi.8','vld1pl.8','vld1vs.8','vld1vc.8','vld1hi.8','vld1ls.8','vld1ge.8','vld1lt.8','vld1gt.8','vld1le.8',
+ 'vld1eq.16','vld1ne.16','vld1cs.16','vld1hs.16','vld1cc.16','vld1lo.16','vld1mi.16','vld1pl.16','vld1vs.16','vld1vc.16','vld1hi.16','vld1ls.16','vld1ge.16','vld1lt.16','vld1gt.16','vld1le.16',
+ 'vld1eq.32','vld1ne.32','vld1cs.32','vld1hs.32','vld1cc.32','vld1lo.32','vld1mi.32','vld1pl.32','vld1vs.32','vld1vc.32','vld1hi.32','vld1ls.32','vld1ge.32','vld1lt.32','vld1gt.32','vld1le.32',
+
+ 'vld2eq.8','vld2ne.8','vld2cs.8','vld2hs.8','vld2cc.8','vld2lo.8','vld2mi.8','vld2pl.8','vld2vs.8','vld2vc.8','vld2hi.8','vld2ls.8','vld2ge.8','vld2lt.8','vld2gt.8','vld2le.8',
+ 'vld2eq.16','vld2ne.16','vld2cs.16','vld2hs.16','vld2cc.16','vld2lo.16','vld2mi.16','vld2pl.16','vld2vs.16','vld2vc.16','vld2hi.16','vld2ls.16','vld2ge.16','vld2lt.16','vld2gt.16','vld2le.16',
+ 'vld2eq.32','vld2ne.32','vld2cs.32','vld2hs.32','vld2cc.32','vld2lo.32','vld2mi.32','vld2pl.32','vld2vs.32','vld2vc.32','vld2hi.32','vld2ls.32','vld2ge.32','vld2lt.32','vld2gt.32','vld2le.32',
+
+ 'vld3eq.8','vld3ne.8','vld3cs.8','vld3hs.8','vld3cc.8','vld3lo.8','vld3mi.8','vld3pl.8','vld3vs.8','vld3vc.8','vld3hi.8','vld3ls.8','vld3ge.8','vld3lt.8','vld3gt.8','vld3le.8',
+ 'vld3eq.16','vld3ne.16','vld3cs.16','vld3hs.16','vld3cc.16','vld3lo.16','vld3mi.16','vld3pl.16','vld3vs.16','vld3vc.16','vld3hi.16','vld3ls.16','vld3ge.16','vld3lt.16','vld3gt.16','vld3le.16',
+ 'vld3eq.32','vld3ne.32','vld3cs.32','vld3hs.32','vld3cc.32','vld3lo.32','vld3mi.32','vld3pl.32','vld3vs.32','vld3vc.32','vld3hi.32','vld3ls.32','vld3ge.32','vld3lt.32','vld3gt.32','vld3le.32',
+
+ 'vld4eq.8','vld4ne.8','vld4cs.8','vld4hs.8','vld4cc.8','vld4lo.8','vld4mi.8','vld4pl.8','vld4vs.8','vld4vc.8','vld4hi.8','vld4ls.8','vld4ge.8','vld4lt.8','vld4gt.8','vld4le.8',
+ 'vld4eq.16','vld4ne.16','vld4cs.16','vld4hs.16','vld4cc.16','vld4lo.16','vld4mi.16','vld4pl.16','vld4vs.16','vld4vc.16','vld4hi.16','vld4ls.16','vld4ge.16','vld4lt.16','vld4gt.16','vld4le.16',
+ 'vld4eq.32','vld4ne.32','vld4cs.32','vld4hs.32','vld4cc.32','vld4lo.32','vld4mi.32','vld4pl.32','vld4vs.32','vld4vc.32','vld4hi.32','vld4ls.32','vld4ge.32','vld4lt.32','vld4gt.32','vld4le.32',
+
+ 'vldmeq','vldmne','vldmcs','vldmhs','vldmcc','vldmlo','vldmmi','vldmpl','vldmvs','vldmvc','vldmhi','vldmls','vldmge','vldmlt','vldmgt','vldmle',
+ 'vldmeq.32','vldmne.32','vldmcs.32','vldmhs.32','vldmcc.32','vldmlo.32','vldmmi.32','vldmpl.32','vldmvs.32','vldmvc.32','vldmhi.32','vldmls.32','vldmge.32','vldmlt.32','vldmgt.32','vldmle.32',
+ 'vldmeq.64','vldmne.64','vldmcs.64','vldmhs.64','vldmcc.64','vldmlo.64','vldmmi.64','vldmpl.64','vldmvs.64','vldmvc.64','vldmhi.64','vldmls.64','vldmge.64','vldmlt.64','vldmgt.64','vldmle.64',
+
+ 'vldmiaeq','vldmiane','vldmiacs','vldmiahs','vldmiacc','vldmialo','vldmiami','vldmiapl','vldmiavs','vldmiavc','vldmiahi','vldmials','vldmiage','vldmialt','vldmiagt','vldmiale',
+ 'vldmiaeq.32','vldmiane.32','vldmiacs.32','vldmiahs.32','vldmiacc.32','vldmialo.32','vldmiami.32','vldmiapl.32','vldmiavs.32','vldmiavc.32','vldmiahi.32','vldmials.32','vldmiage.32','vldmialt.32','vldmiagt.32','vldmiale.32',
+ 'vldmiaeq.64','vldmiane.64','vldmiacs.64','vldmiahs.64','vldmiacc.64','vldmialo.64','vldmiami.64','vldmiapl.64','vldmiavs.64','vldmiavc.64','vldmiahi.64','vldmials.64','vldmiage.64','vldmialt.64','vldmiagt.64','vldmiale.64',
+
+ 'vldmdbeq','vldmdbne','vldmdbcs','vldmdbhs','vldmdbcc','vldmdblo','vldmdbmi','vldmdbpl','vldmdbvs','vldmdbvc','vldmdbhi','vldmdbls','vldmdbge','vldmdblt','vldmdbgt','vldmdble',
+ 'vldmdbeq.32','vldmdbne.32','vldmdbcs.32','vldmdbhs.32','vldmdbcc.32','vldmdblo.32','vldmdbmi.32','vldmdbpl.32','vldmdbvs.32','vldmdbvc.32','vldmdbhi.32','vldmdbls.32','vldmdbge.32','vldmdblt.32','vldmdbgt.32','vldmdble.32',
+ 'vldmdbeq.64','vldmdbne.64','vldmdbcs.64','vldmdbhs.64','vldmdbcc.64','vldmdblo.64','vldmdbmi.64','vldmdbpl.64','vldmdbvs.64','vldmdbvc.64','vldmdbhi.64','vldmdbls.64','vldmdbge.64','vldmdblt.64','vldmdbgt.64','vldmdble.64',
+
+ 'vldreq','vldrne','vldrcs','vldrhs','vldrcc','vldrlo','vldrmi','vldrpl','vldrvs','vldrvc','vldrhi','vldrls','vldrge','vldrlt','vldrgt','vldrle',
+ 'vldreq.32','vldrne.32','vldrcs.32','vldrhs.32','vldrcc.32','vldrlo.32','vldrmi.32','vldrpl.32','vldrvs.32','vldrvc.32','vldrhi.32','vldrls.32','vldrge.32','vldrlt.32','vldrgt.32','vldrle.32',
+ 'vldreq.64','vldrne.64','vldrcs.64','vldrhs.64','vldrcc.64','vldrlo.64','vldrmi.64','vldrpl.64','vldrvs.64','vldrvc.64','vldrhi.64','vldrls.64','vldrge.64','vldrlt.64','vldrgt.64','vldrle.64',
+
+ 'vpopeq','vpopne','vpopcs','vpophs','vpopcc','vpoplo','vpopmi','vpoppl','vpopvs','vpopvc','vpophi','vpopls','vpopge','vpoplt','vpopgt','vpople',
+ 'vpopeq.32','vpopne.32','vpopcs.32','vpophs.32','vpopcc.32','vpoplo.32','vpopmi.32','vpoppl.32','vpopvs.32','vpopvc.32','vpophi.32','vpopls.32','vpopge.32','vpoplt.32','vpopgt.32','vpople.32',
+ 'vpopeq.64','vpopne.64','vpopcs.64','vpophs.64','vpopcc.64','vpoplo.64','vpopmi.64','vpoppl.64','vpopvs.64','vpopvc.64','vpophi.64','vpopls.64','vpopge.64','vpoplt.64','vpopgt.64','vpople.64',
+
+ /* Conditional VFPv3 & NEON SIMD Memory Access: Stores */
+ 'vst1eq.8','vst1ne.8','vst1cs.8','vst1hs.8','vst1cc.8','vst1lo.8','vst1mi.8','vst1pl.8','vst1vs.8','vst1vc.8','vst1hi.8','vst1ls.8','vst1ge.8','vst1lt.8','vst1gt.8','vst1le.8',
+ 'vst1eq.16','vst1ne.16','vst1cs.16','vst1hs.16','vst1cc.16','vst1lo.16','vst1mi.16','vst1pl.16','vst1vs.16','vst1vc.16','vst1hi.16','vst1ls.16','vst1ge.16','vst1lt.16','vst1gt.16','vst1le.16',
+ 'vst1eq.32','vst1ne.32','vst1cs.32','vst1hs.32','vst1cc.32','vst1lo.32','vst1mi.32','vst1pl.32','vst1vs.32','vst1vc.32','vst1hi.32','vst1ls.32','vst1ge.32','vst1lt.32','vst1gt.32','vst1le.32',
+ 'vst1eq.64','vst1ne.64','vst1cs.64','vst1hs.64','vst1cc.64','vst1lo.64','vst1mi.64','vst1pl.64','vst1vs.64','vst1vc.64','vst1hi.64','vst1ls.64','vst1ge.64','vst1lt.64','vst1gt.64','vst1le.64',
+
+ 'vst2eq.8','vst2ne.8','vst2cs.8','vst2hs.8','vst2cc.8','vst2lo.8','vst2mi.8','vst2pl.8','vst2vs.8','vst2vc.8','vst2hi.8','vst2ls.8','vst2ge.8','vst2lt.8','vst2gt.8','vst2le.8',
+ 'vst2eq.16','vst2ne.16','vst2cs.16','vst2hs.16','vst2cc.16','vst2lo.16','vst2mi.16','vst2pl.16','vst2vs.16','vst2vc.16','vst2hi.16','vst2ls.16','vst2ge.16','vst2lt.16','vst2gt.16','vst2le.16',
+ 'vst2eq.32','vst2ne.32','vst2cs.32','vst2hs.32','vst2cc.32','vst2lo.32','vst2mi.32','vst2pl.32','vst2vs.32','vst2vc.32','vst2hi.32','vst2ls.32','vst2ge.32','vst2lt.32','vst2gt.32','vst2le.32',
+
+ 'vst3eq.8','vst3ne.8','vst3cs.8','vst3hs.8','vst3cc.8','vst3lo.8','vst3mi.8','vst3pl.8','vst3vs.8','vst3vc.8','vst3hi.8','vst3ls.8','vst3ge.8','vst3lt.8','vst3gt.8','vst3le.8',
+ 'vst3eq.16','vst3ne.16','vst3cs.16','vst3hs.16','vst3cc.16','vst3lo.16','vst3mi.16','vst3pl.16','vst3vs.16','vst3vc.16','vst3hi.16','vst3ls.16','vst3ge.16','vst3lt.16','vst3gt.16','vst3le.16',
+ 'vst3eq.32','vst3ne.32','vst3cs.32','vst3hs.32','vst3cc.32','vst3lo.32','vst3mi.32','vst3pl.32','vst3vs.32','vst3vc.32','vst3hi.32','vst3ls.32','vst3ge.32','vst3lt.32','vst3gt.32','vst3le.32',
+
+ 'vst4eq.8','vst4ne.8','vst4cs.8','vst4hs.8','vst4cc.8','vst4lo.8','vst4mi.8','vst4pl.8','vst4vs.8','vst4vc.8','vst4hi.8','vst4ls.8','vst4ge.8','vst4lt.8','vst4gt.8','vst4le.8',
+ 'vst4eq.16','vst4ne.16','vst4cs.16','vst4hs.16','vst4cc.16','vst4lo.16','vst4mi.16','vst4pl.16','vst4vs.16','vst4vc.16','vst4hi.16','vst4ls.16','vst4ge.16','vst4lt.16','vst4gt.16','vst4le.16',
+ 'vst4eq.32','vst4ne.32','vst4cs.32','vst4hs.32','vst4cc.32','vst4lo.32','vst4mi.32','vst4pl.32','vst4vs.32','vst4vc.32','vst4hi.32','vst4ls.32','vst4ge.32','vst4lt.32','vst4gt.32','vst4le.32',
+
+ 'vstmeq','vstmne','vstmcs','vstmhs','vstmcc','vstmlo','vstmmi','vstmpl','vstmvs','vstmvc','vstmhi','vstmls','vstmge','vstmlt','vstmgt','vstmle',
+ 'vstmeq.32','vstmne.32','vstmcs.32','vstmhs.32','vstmcc.32','vstmlo.32','vstmmi.32','vstmpl.32','vstmvs.32','vstmvc.32','vstmhi.32','vstmls.32','vstmge.32','vstmlt.32','vstmgt.32','vstmle.32',
+ 'vstmeq.64','vstmne.64','vstmcs.64','vstmhs.64','vstmcc.64','vstmlo.64','vstmmi.64','vstmpl.64','vstmvs.64','vstmvc.64','vstmhi.64','vstmls.64','vstmge.64','vstmlt.64','vstmgt.64','vstmle.64',
+
+ 'vstmiaeq','vstmiane','vstmiacs','vstmiahs','vstmiacc','vstmialo','vstmiami','vstmiapl','vstmiavs','vstmiavc','vstmiahi','vstmials','vstmiage','vstmialt','vstmiagt','vstmiale',
+ 'vstmiaeq.32','vstmiane.32','vstmiacs.32','vstmiahs.32','vstmiacc.32','vstmialo.32','vstmiami.32','vstmiapl.32','vstmiavs.32','vstmiavc.32','vstmiahi.32','vstmials.32','vstmiage.32','vstmialt.32','vstmiagt.32','vstmiale.32',
+ 'vstmiaeq.64','vstmiane.64','vstmiacs.64','vstmiahs.64','vstmiacc.64','vstmialo.64','vstmiami.64','vstmiapl.64','vstmiavs.64','vstmiavc.64','vstmiahi.64','vstmials.64','vstmiage.64','vstmialt.64','vstmiagt.64','vstmiale.64',
+
+ 'vstmdbeq','vstmdbne','vstmdbcs','vstmdbhs','vstmdbcc','vstmdblo','vstmdbmi','vstmdbpl','vstmdbvs','vstmdbvc','vstmdbhi','vstmdbls','vstmdbge','vstmdblt','vstmdbgt','vstmdble',
+ 'vstmdbeq.32','vstmdbne.32','vstmdbcs.32','vstmdbhs.32','vstmdbcc.32','vstmdblo.32','vstmdbmi.32','vstmdbpl.32','vstmdbvs.32','vstmdbvc.32','vstmdbhi.32','vstmdbls.32','vstmdbge.32','vstmdblt.32','vstmdbgt.32','vstmdble.32',
+ 'vstmdbeq.64','vstmdbne.64','vstmdbcs.64','vstmdbhs.64','vstmdbcc.64','vstmdblo.64','vstmdbmi.64','vstmdbpl.64','vstmdbvs.64','vstmdbvc.64','vstmdbhi.64','vstmdbls.64','vstmdbge.64','vstmdblt.64','vstmdbgt.64','vstmdble.64',
+
+ 'vstreq','vstrne','vstrcs','vstrhs','vstrcc','vstrlo','vstrmi','vstrpl','vstrvs','vstrvc','vstrhi','vstrls','vstrge','vstrlt','vstrgt','vstrle',
+ 'vstreq.32','vstrne.32','vstrcs.32','vstrhs.32','vstrcc.32','vstrlo.32','vstrmi.32','vstrpl.32','vstrvs.32','vstrvc.32','vstrhi.32','vstrls.32','vstrge.32','vstrlt.32','vstrgt.32','vstrle.32',
+ 'vstreq.64','vstrne.64','vstrcs.64','vstrhs.64','vstrcc.64','vstrlo.64','vstrmi.64','vstrpl.64','vstrvs.64','vstrvc.64','vstrhi.64','vstrls.64','vstrge.64','vstrlt.64','vstrgt.64','vstrle.64',
+
+ 'vpusheq','vpushne','vpushcs','vpushhs','vpushcc','vpushlo','vpushmi','vpushpl','vpushvs','vpushvc','vpushhi','vpushls','vpushge','vpushlt','vpushgt','vpushle',
+ 'vpusheq.32','vpushne.32','vpushcs.32','vpushhs.32','vpushcc.32','vpushlo.32','vpushmi.32','vpushpl.32','vpushvs.32','vpushvc.32','vpushhi.32','vpushls.32','vpushge.32','vpushlt.32','vpushgt.32','vpushle.32',
+ 'vpusheq.64','vpushne.64','vpushcs.64','vpushhs.64','vpushcc.64','vpushlo.64','vpushmi.64','vpushpl.64','vpushvs.64','vpushvc.64','vpushhi.64','vpushls.64','vpushge.64','vpushlt.64','vpushgt.64','vpushle.64'
+ ),
+ /* Conditional NEON SIMD Logical Instructions */
+ 28 => array(
+ 'vandeq','vandne','vandcs','vandhs','vandcc','vandlo','vandmi','vandpl','vandvs','vandvc','vandhi','vandls','vandge','vandlt','vandgt','vandle',
+ 'vandeq.i8','vandne.i8','vandcs.i8','vandhs.i8','vandcc.i8','vandlo.i8','vandmi.i8','vandpl.i8','vandvs.i8','vandvc.i8','vandhi.i8','vandls.i8','vandge.i8','vandlt.i8','vandgt.i8','vandle.i8',
+ 'vandeq.i16','vandne.i16','vandcs.i16','vandhs.i16','vandcc.i16','vandlo.i16','vandmi.i16','vandpl.i16','vandvs.i16','vandvc.i16','vandhi.i16','vandls.i16','vandge.i16','vandlt.i16','vandgt.i16','vandle.i16',
+ 'vandeq.i32','vandne.i32','vandcs.i32','vandhs.i32','vandcc.i32','vandlo.i32','vandmi.i32','vandpl.i32','vandvs.i32','vandvc.i32','vandhi.i32','vandls.i32','vandge.i32','vandlt.i32','vandgt.i32','vandle.i32',
+ 'vandeq.i64','vandne.i64','vandcs.i64','vandhs.i64','vandcc.i64','vandlo.i64','vandmi.i64','vandpl.i64','vandvs.i64','vandvc.i64','vandhi.i64','vandls.i64','vandge.i64','vandlt.i64','vandgt.i64','vandle.i64',
+ 'vandeq.s8','vandne.s8','vandcs.s8','vandhs.s8','vandcc.s8','vandlo.s8','vandmi.s8','vandpl.s8','vandvs.s8','vandvc.s8','vandhi.s8','vandls.s8','vandge.s8','vandlt.s8','vandgt.s8','vandle.s8',
+ 'vandeq.s16','vandne.s16','vandcs.s16','vandhs.s16','vandcc.s16','vandlo.s16','vandmi.s16','vandpl.s16','vandvs.s16','vandvc.s16','vandhi.s16','vandls.s16','vandge.s16','vandlt.s16','vandgt.s16','vandle.s16',
+ 'vandeq.s32','vandne.s32','vandcs.s32','vandhs.s32','vandcc.s32','vandlo.s32','vandmi.s32','vandpl.s32','vandvs.s32','vandvc.s32','vandhi.s32','vandls.s32','vandge.s32','vandlt.s32','vandgt.s32','vandle.s32',
+ 'vandeq.s64','vandne.s64','vandcs.s64','vandhs.s64','vandcc.s64','vandlo.s64','vandmi.s64','vandpl.s64','vandvs.s64','vandvc.s64','vandhi.s64','vandls.s64','vandge.s64','vandlt.s64','vandgt.s64','vandle.s64',
+ 'vandeq.u8','vandne.u8','vandcs.u8','vandhs.u8','vandcc.u8','vandlo.u8','vandmi.u8','vandpl.u8','vandvs.u8','vandvc.u8','vandhi.u8','vandls.u8','vandge.u8','vandlt.u8','vandgt.u8','vandle.u8',
+ 'vandeq.u16','vandne.u16','vandcs.u16','vandhs.u16','vandcc.u16','vandlo.u16','vandmi.u16','vandpl.u16','vandvs.u16','vandvc.u16','vandhi.u16','vandls.u16','vandge.u16','vandlt.u16','vandgt.u16','vandle.u16',
+ 'vandeq.u32','vandne.u32','vandcs.u32','vandhs.u32','vandcc.u32','vandlo.u32','vandmi.u32','vandpl.u32','vandvs.u32','vandvc.u32','vandhi.u32','vandls.u32','vandge.u32','vandlt.u32','vandgt.u32','vandle.u32',
+ 'vandeq.u64','vandne.u64','vandcs.u64','vandhs.u64','vandcc.u64','vandlo.u64','vandmi.u64','vandpl.u64','vandvs.u64','vandvc.u64','vandhi.u64','vandls.u64','vandge.u64','vandlt.u64','vandgt.u64','vandle.u64',
+ 'vandeq.f32','vandne.f32','vandcs.f32','vandhs.f32','vandcc.f32','vandlo.f32','vandmi.f32','vandpl.f32','vandvs.f32','vandvc.f32','vandhi.f32','vandls.f32','vandge.f32','vandlt.f32','vandgt.f32','vandle.f32',
+ 'vandeq.f64','vandne.f64','vandcs.f64','vandhs.f64','vandcc.f64','vandlo.f64','vandmi.f64','vandpl.f64','vandvs.f64','vandvc.f64','vandhi.f64','vandls.f64','vandge.f64','vandlt.f64','vandgt.f64','vandle.f64',
+
+ 'vbiceq','vbicne','vbiccs','vbichs','vbiccc','vbiclo','vbicmi','vbicpl','vbicvs','vbicvc','vbichi','vbicls','vbicge','vbiclt','vbicgt','vbicle',
+ 'vbiceq.i8','vbicne.i8','vbiccs.i8','vbichs.i8','vbiccc.i8','vbiclo.i8','vbicmi.i8','vbicpl.i8','vbicvs.i8','vbicvc.i8','vbichi.i8','vbicls.i8','vbicge.i8','vbiclt.i8','vbicgt.i8','vbicle.i8',
+ 'vbiceq.i16','vbicne.i16','vbiccs.i16','vbichs.i16','vbiccc.i16','vbiclo.i16','vbicmi.i16','vbicpl.i16','vbicvs.i16','vbicvc.i16','vbichi.i16','vbicls.i16','vbicge.i16','vbiclt.i16','vbicgt.i16','vbicle.i16',
+ 'vbiceq.i32','vbicne.i32','vbiccs.i32','vbichs.i32','vbiccc.i32','vbiclo.i32','vbicmi.i32','vbicpl.i32','vbicvs.i32','vbicvc.i32','vbichi.i32','vbicls.i32','vbicge.i32','vbiclt.i32','vbicgt.i32','vbicle.i32',
+ 'vbiceq.i64','vbicne.i64','vbiccs.i64','vbichs.i64','vbiccc.i64','vbiclo.i64','vbicmi.i64','vbicpl.i64','vbicvs.i64','vbicvc.i64','vbichi.i64','vbicls.i64','vbicge.i64','vbiclt.i64','vbicgt.i64','vbicle.i64',
+ 'vbiceq.s8','vbicne.s8','vbiccs.s8','vbichs.s8','vbiccc.s8','vbiclo.s8','vbicmi.s8','vbicpl.s8','vbicvs.s8','vbicvc.s8','vbichi.s8','vbicls.s8','vbicge.s8','vbiclt.s8','vbicgt.s8','vbicle.s8',
+ 'vbiceq.s16','vbicne.s16','vbiccs.s16','vbichs.s16','vbiccc.s16','vbiclo.s16','vbicmi.s16','vbicpl.s16','vbicvs.s16','vbicvc.s16','vbichi.s16','vbicls.s16','vbicge.s16','vbiclt.s16','vbicgt.s16','vbicle.s16',
+ 'vbiceq.s32','vbicne.s32','vbiccs.s32','vbichs.s32','vbiccc.s32','vbiclo.s32','vbicmi.s32','vbicpl.s32','vbicvs.s32','vbicvc.s32','vbichi.s32','vbicls.s32','vbicge.s32','vbiclt.s32','vbicgt.s32','vbicle.s32',
+ 'vbiceq.s64','vbicne.s64','vbiccs.s64','vbichs.s64','vbiccc.s64','vbiclo.s64','vbicmi.s64','vbicpl.s64','vbicvs.s64','vbicvc.s64','vbichi.s64','vbicls.s64','vbicge.s64','vbiclt.s64','vbicgt.s64','vbicle.s64',
+ 'vbiceq.u8','vbicne.u8','vbiccs.u8','vbichs.u8','vbiccc.u8','vbiclo.u8','vbicmi.u8','vbicpl.u8','vbicvs.u8','vbicvc.u8','vbichi.u8','vbicls.u8','vbicge.u8','vbiclt.u8','vbicgt.u8','vbicle.u8',
+ 'vbiceq.u16','vbicne.u16','vbiccs.u16','vbichs.u16','vbiccc.u16','vbiclo.u16','vbicmi.u16','vbicpl.u16','vbicvs.u16','vbicvc.u16','vbichi.u16','vbicls.u16','vbicge.u16','vbiclt.u16','vbicgt.u16','vbicle.u16',
+ 'vbiceq.u32','vbicne.u32','vbiccs.u32','vbichs.u32','vbiccc.u32','vbiclo.u32','vbicmi.u32','vbicpl.u32','vbicvs.u32','vbicvc.u32','vbichi.u32','vbicls.u32','vbicge.u32','vbiclt.u32','vbicgt.u32','vbicle.u32',
+ 'vbiceq.u64','vbicne.u64','vbiccs.u64','vbichs.u64','vbiccc.u64','vbiclo.u64','vbicmi.u64','vbicpl.u64','vbicvs.u64','vbicvc.u64','vbichi.u64','vbicls.u64','vbicge.u64','vbiclt.u64','vbicgt.u64','vbicle.u64',
+ 'vbiceq.f32','vbicne.f32','vbiccs.f32','vbichs.f32','vbiccc.f32','vbiclo.f32','vbicmi.f32','vbicpl.f32','vbicvs.f32','vbicvc.f32','vbichi.f32','vbicls.f32','vbicge.f32','vbiclt.f32','vbicgt.f32','vbicle.f32',
+ 'vbiceq.f64','vbicne.f64','vbiccs.f64','vbichs.f64','vbiccc.f64','vbiclo.f64','vbicmi.f64','vbicpl.f64','vbicvs.f64','vbicvc.f64','vbichi.f64','vbicls.f64','vbicge.f64','vbiclt.f64','vbicgt.f64','vbicle.f64',
+
+ 'vbifeq','vbifne','vbifcs','vbifhs','vbifcc','vbiflo','vbifmi','vbifpl','vbifvs','vbifvc','vbifhi','vbifls','vbifge','vbiflt','vbifgt','vbifle',
+ 'vbifeq.i8','vbifne.i8','vbifcs.i8','vbifhs.i8','vbifcc.i8','vbiflo.i8','vbifmi.i8','vbifpl.i8','vbifvs.i8','vbifvc.i8','vbifhi.i8','vbifls.i8','vbifge.i8','vbiflt.i8','vbifgt.i8','vbifle.i8',
+ 'vbifeq.i16','vbifne.i16','vbifcs.i16','vbifhs.i16','vbifcc.i16','vbiflo.i16','vbifmi.i16','vbifpl.i16','vbifvs.i16','vbifvc.i16','vbifhi.i16','vbifls.i16','vbifge.i16','vbiflt.i16','vbifgt.i16','vbifle.i16',
+ 'vbifeq.i32','vbifne.i32','vbifcs.i32','vbifhs.i32','vbifcc.i32','vbiflo.i32','vbifmi.i32','vbifpl.i32','vbifvs.i32','vbifvc.i32','vbifhi.i32','vbifls.i32','vbifge.i32','vbiflt.i32','vbifgt.i32','vbifle.i32',
+ 'vbifeq.i64','vbifne.i64','vbifcs.i64','vbifhs.i64','vbifcc.i64','vbiflo.i64','vbifmi.i64','vbifpl.i64','vbifvs.i64','vbifvc.i64','vbifhi.i64','vbifls.i64','vbifge.i64','vbiflt.i64','vbifgt.i64','vbifle.i64',
+ 'vbifeq.s8','vbifne.s8','vbifcs.s8','vbifhs.s8','vbifcc.s8','vbiflo.s8','vbifmi.s8','vbifpl.s8','vbifvs.s8','vbifvc.s8','vbifhi.s8','vbifls.s8','vbifge.s8','vbiflt.s8','vbifgt.s8','vbifle.s8',
+ 'vbifeq.s16','vbifne.s16','vbifcs.s16','vbifhs.s16','vbifcc.s16','vbiflo.s16','vbifmi.s16','vbifpl.s16','vbifvs.s16','vbifvc.s16','vbifhi.s16','vbifls.s16','vbifge.s16','vbiflt.s16','vbifgt.s16','vbifle.s16',
+ 'vbifeq.s32','vbifne.s32','vbifcs.s32','vbifhs.s32','vbifcc.s32','vbiflo.s32','vbifmi.s32','vbifpl.s32','vbifvs.s32','vbifvc.s32','vbifhi.s32','vbifls.s32','vbifge.s32','vbiflt.s32','vbifgt.s32','vbifle.s32',
+ 'vbifeq.s64','vbifne.s64','vbifcs.s64','vbifhs.s64','vbifcc.s64','vbiflo.s64','vbifmi.s64','vbifpl.s64','vbifvs.s64','vbifvc.s64','vbifhi.s64','vbifls.s64','vbifge.s64','vbiflt.s64','vbifgt.s64','vbifle.s64',
+ 'vbifeq.u8','vbifne.u8','vbifcs.u8','vbifhs.u8','vbifcc.u8','vbiflo.u8','vbifmi.u8','vbifpl.u8','vbifvs.u8','vbifvc.u8','vbifhi.u8','vbifls.u8','vbifge.u8','vbiflt.u8','vbifgt.u8','vbifle.u8',
+ 'vbifeq.u16','vbifne.u16','vbifcs.u16','vbifhs.u16','vbifcc.u16','vbiflo.u16','vbifmi.u16','vbifpl.u16','vbifvs.u16','vbifvc.u16','vbifhi.u16','vbifls.u16','vbifge.u16','vbiflt.u16','vbifgt.u16','vbifle.u16',
+ 'vbifeq.u32','vbifne.u32','vbifcs.u32','vbifhs.u32','vbifcc.u32','vbiflo.u32','vbifmi.u32','vbifpl.u32','vbifvs.u32','vbifvc.u32','vbifhi.u32','vbifls.u32','vbifge.u32','vbiflt.u32','vbifgt.u32','vbifle.u32',
+ 'vbifeq.u64','vbifne.u64','vbifcs.u64','vbifhs.u64','vbifcc.u64','vbiflo.u64','vbifmi.u64','vbifpl.u64','vbifvs.u64','vbifvc.u64','vbifhi.u64','vbifls.u64','vbifge.u64','vbiflt.u64','vbifgt.u64','vbifle.u64',
+ 'vbifeq.f32','vbifne.f32','vbifcs.f32','vbifhs.f32','vbifcc.f32','vbiflo.f32','vbifmi.f32','vbifpl.f32','vbifvs.f32','vbifvc.f32','vbifhi.f32','vbifls.f32','vbifge.f32','vbiflt.f32','vbifgt.f32','vbifle.f32',
+ 'vbifeq.f64','vbifne.f64','vbifcs.f64','vbifhs.f64','vbifcc.f64','vbiflo.f64','vbifmi.f64','vbifpl.f64','vbifvs.f64','vbifvc.f64','vbifhi.f64','vbifls.f64','vbifge.f64','vbiflt.f64','vbifgt.f64','vbifle.f64',
+
+ 'vbiteq','vbitne','vbitcs','vbiths','vbitcc','vbitlo','vbitmi','vbitpl','vbitvs','vbitvc','vbithi','vbitls','vbitge','vbitlt','vbitgt','vbitle',
+ 'vbiteq.i8','vbitne.i8','vbitcs.i8','vbiths.i8','vbitcc.i8','vbitlo.i8','vbitmi.i8','vbitpl.i8','vbitvs.i8','vbitvc.i8','vbithi.i8','vbitls.i8','vbitge.i8','vbitlt.i8','vbitgt.i8','vbitle.i8',
+ 'vbiteq.i16','vbitne.i16','vbitcs.i16','vbiths.i16','vbitcc.i16','vbitlo.i16','vbitmi.i16','vbitpl.i16','vbitvs.i16','vbitvc.i16','vbithi.i16','vbitls.i16','vbitge.i16','vbitlt.i16','vbitgt.i16','vbitle.i16',
+ 'vbiteq.i32','vbitne.i32','vbitcs.i32','vbiths.i32','vbitcc.i32','vbitlo.i32','vbitmi.i32','vbitpl.i32','vbitvs.i32','vbitvc.i32','vbithi.i32','vbitls.i32','vbitge.i32','vbitlt.i32','vbitgt.i32','vbitle.i32',
+ 'vbiteq.i64','vbitne.i64','vbitcs.i64','vbiths.i64','vbitcc.i64','vbitlo.i64','vbitmi.i64','vbitpl.i64','vbitvs.i64','vbitvc.i64','vbithi.i64','vbitls.i64','vbitge.i64','vbitlt.i64','vbitgt.i64','vbitle.i64',
+ 'vbiteq.s8','vbitne.s8','vbitcs.s8','vbiths.s8','vbitcc.s8','vbitlo.s8','vbitmi.s8','vbitpl.s8','vbitvs.s8','vbitvc.s8','vbithi.s8','vbitls.s8','vbitge.s8','vbitlt.s8','vbitgt.s8','vbitle.s8',
+ 'vbiteq.s16','vbitne.s16','vbitcs.s16','vbiths.s16','vbitcc.s16','vbitlo.s16','vbitmi.s16','vbitpl.s16','vbitvs.s16','vbitvc.s16','vbithi.s16','vbitls.s16','vbitge.s16','vbitlt.s16','vbitgt.s16','vbitle.s16',
+ 'vbiteq.s32','vbitne.s32','vbitcs.s32','vbiths.s32','vbitcc.s32','vbitlo.s32','vbitmi.s32','vbitpl.s32','vbitvs.s32','vbitvc.s32','vbithi.s32','vbitls.s32','vbitge.s32','vbitlt.s32','vbitgt.s32','vbitle.s32',
+ 'vbiteq.s64','vbitne.s64','vbitcs.s64','vbiths.s64','vbitcc.s64','vbitlo.s64','vbitmi.s64','vbitpl.s64','vbitvs.s64','vbitvc.s64','vbithi.s64','vbitls.s64','vbitge.s64','vbitlt.s64','vbitgt.s64','vbitle.s64',
+ 'vbiteq.u8','vbitne.u8','vbitcs.u8','vbiths.u8','vbitcc.u8','vbitlo.u8','vbitmi.u8','vbitpl.u8','vbitvs.u8','vbitvc.u8','vbithi.u8','vbitls.u8','vbitge.u8','vbitlt.u8','vbitgt.u8','vbitle.u8',
+ 'vbiteq.u16','vbitne.u16','vbitcs.u16','vbiths.u16','vbitcc.u16','vbitlo.u16','vbitmi.u16','vbitpl.u16','vbitvs.u16','vbitvc.u16','vbithi.u16','vbitls.u16','vbitge.u16','vbitlt.u16','vbitgt.u16','vbitle.u16',
+ 'vbiteq.u32','vbitne.u32','vbitcs.u32','vbiths.u32','vbitcc.u32','vbitlo.u32','vbitmi.u32','vbitpl.u32','vbitvs.u32','vbitvc.u32','vbithi.u32','vbitls.u32','vbitge.u32','vbitlt.u32','vbitgt.u32','vbitle.u32',
+ 'vbiteq.u64','vbitne.u64','vbitcs.u64','vbiths.u64','vbitcc.u64','vbitlo.u64','vbitmi.u64','vbitpl.u64','vbitvs.u64','vbitvc.u64','vbithi.u64','vbitls.u64','vbitge.u64','vbitlt.u64','vbitgt.u64','vbitle.u64',
+ 'vbiteq.f32','vbitne.f32','vbitcs.f32','vbiths.f32','vbitcc.f32','vbitlo.f32','vbitmi.f32','vbitpl.f32','vbitvs.f32','vbitvc.f32','vbithi.f32','vbitls.f32','vbitge.f32','vbitlt.f32','vbitgt.f32','vbitle.f32',
+ 'vbiteq.f64','vbitne.f64','vbitcs.f64','vbiths.f64','vbitcc.f64','vbitlo.f64','vbitmi.f64','vbitpl.f64','vbitvs.f64','vbitvc.f64','vbithi.f64','vbitls.f64','vbitge.f64','vbitlt.f64','vbitgt.f64','vbitle.f64',
+
+ 'vbsleq','vbslne','vbslcs','vbslhs','vbslcc','vbsllo','vbslmi','vbslpl','vbslvs','vbslvc','vbslhi','vbslls','vbslge','vbsllt','vbslgt','vbslle',
+ 'vbsleq.i8','vbslne.i8','vbslcs.i8','vbslhs.i8','vbslcc.i8','vbsllo.i8','vbslmi.i8','vbslpl.i8','vbslvs.i8','vbslvc.i8','vbslhi.i8','vbslls.i8','vbslge.i8','vbsllt.i8','vbslgt.i8','vbslle.i8',
+ 'vbsleq.i16','vbslne.i16','vbslcs.i16','vbslhs.i16','vbslcc.i16','vbsllo.i16','vbslmi.i16','vbslpl.i16','vbslvs.i16','vbslvc.i16','vbslhi.i16','vbslls.i16','vbslge.i16','vbsllt.i16','vbslgt.i16','vbslle.i16',
+ 'vbsleq.i32','vbslne.i32','vbslcs.i32','vbslhs.i32','vbslcc.i32','vbsllo.i32','vbslmi.i32','vbslpl.i32','vbslvs.i32','vbslvc.i32','vbslhi.i32','vbslls.i32','vbslge.i32','vbsllt.i32','vbslgt.i32','vbslle.i32',
+ 'vbsleq.i64','vbslne.i64','vbslcs.i64','vbslhs.i64','vbslcc.i64','vbsllo.i64','vbslmi.i64','vbslpl.i64','vbslvs.i64','vbslvc.i64','vbslhi.i64','vbslls.i64','vbslge.i64','vbsllt.i64','vbslgt.i64','vbslle.i64',
+ 'vbsleq.s8','vbslne.s8','vbslcs.s8','vbslhs.s8','vbslcc.s8','vbsllo.s8','vbslmi.s8','vbslpl.s8','vbslvs.s8','vbslvc.s8','vbslhi.s8','vbslls.s8','vbslge.s8','vbsllt.s8','vbslgt.s8','vbslle.s8',
+ 'vbsleq.s16','vbslne.s16','vbslcs.s16','vbslhs.s16','vbslcc.s16','vbsllo.s16','vbslmi.s16','vbslpl.s16','vbslvs.s16','vbslvc.s16','vbslhi.s16','vbslls.s16','vbslge.s16','vbsllt.s16','vbslgt.s16','vbslle.s16',
+ 'vbsleq.s32','vbslne.s32','vbslcs.s32','vbslhs.s32','vbslcc.s32','vbsllo.s32','vbslmi.s32','vbslpl.s32','vbslvs.s32','vbslvc.s32','vbslhi.s32','vbslls.s32','vbslge.s32','vbsllt.s32','vbslgt.s32','vbslle.s32',
+ 'vbsleq.s64','vbslne.s64','vbslcs.s64','vbslhs.s64','vbslcc.s64','vbsllo.s64','vbslmi.s64','vbslpl.s64','vbslvs.s64','vbslvc.s64','vbslhi.s64','vbslls.s64','vbslge.s64','vbsllt.s64','vbslgt.s64','vbslle.s64',
+ 'vbsleq.u8','vbslne.u8','vbslcs.u8','vbslhs.u8','vbslcc.u8','vbsllo.u8','vbslmi.u8','vbslpl.u8','vbslvs.u8','vbslvc.u8','vbslhi.u8','vbslls.u8','vbslge.u8','vbsllt.u8','vbslgt.u8','vbslle.u8',
+ 'vbsleq.u16','vbslne.u16','vbslcs.u16','vbslhs.u16','vbslcc.u16','vbsllo.u16','vbslmi.u16','vbslpl.u16','vbslvs.u16','vbslvc.u16','vbslhi.u16','vbslls.u16','vbslge.u16','vbsllt.u16','vbslgt.u16','vbslle.u16',
+ 'vbsleq.u32','vbslne.u32','vbslcs.u32','vbslhs.u32','vbslcc.u32','vbsllo.u32','vbslmi.u32','vbslpl.u32','vbslvs.u32','vbslvc.u32','vbslhi.u32','vbslls.u32','vbslge.u32','vbsllt.u32','vbslgt.u32','vbslle.u32',
+ 'vbsleq.u64','vbslne.u64','vbslcs.u64','vbslhs.u64','vbslcc.u64','vbsllo.u64','vbslmi.u64','vbslpl.u64','vbslvs.u64','vbslvc.u64','vbslhi.u64','vbslls.u64','vbslge.u64','vbsllt.u64','vbslgt.u64','vbslle.u64',
+ 'vbsleq.f32','vbslne.f32','vbslcs.f32','vbslhs.f32','vbslcc.f32','vbsllo.f32','vbslmi.f32','vbslpl.f32','vbslvs.f32','vbslvc.f32','vbslhi.f32','vbslls.f32','vbslge.f32','vbsllt.f32','vbslgt.f32','vbslle.f32',
+ 'vbsleq.f64','vbslne.f64','vbslcs.f64','vbslhs.f64','vbslcc.f64','vbsllo.f64','vbslmi.f64','vbslpl.f64','vbslvs.f64','vbslvc.f64','vbslhi.f64','vbslls.f64','vbslge.f64','vbsllt.f64','vbslgt.f64','vbslle.f64',
+
+ 'veoreq','veorne','veorcs','veorhs','veorcc','veorlo','veormi','veorpl','veorvs','veorvc','veorhi','veorls','veorge','veorlt','veorgt','veorle',
+ 'veoreq.i8','veorne.i8','veorcs.i8','veorhs.i8','veorcc.i8','veorlo.i8','veormi.i8','veorpl.i8','veorvs.i8','veorvc.i8','veorhi.i8','veorls.i8','veorge.i8','veorlt.i8','veorgt.i8','veorle.i8',
+ 'veoreq.i16','veorne.i16','veorcs.i16','veorhs.i16','veorcc.i16','veorlo.i16','veormi.i16','veorpl.i16','veorvs.i16','veorvc.i16','veorhi.i16','veorls.i16','veorge.i16','veorlt.i16','veorgt.i16','veorle.i16',
+ 'veoreq.i32','veorne.i32','veorcs.i32','veorhs.i32','veorcc.i32','veorlo.i32','veormi.i32','veorpl.i32','veorvs.i32','veorvc.i32','veorhi.i32','veorls.i32','veorge.i32','veorlt.i32','veorgt.i32','veorle.i32',
+ 'veoreq.i64','veorne.i64','veorcs.i64','veorhs.i64','veorcc.i64','veorlo.i64','veormi.i64','veorpl.i64','veorvs.i64','veorvc.i64','veorhi.i64','veorls.i64','veorge.i64','veorlt.i64','veorgt.i64','veorle.i64',
+ 'veoreq.s8','veorne.s8','veorcs.s8','veorhs.s8','veorcc.s8','veorlo.s8','veormi.s8','veorpl.s8','veorvs.s8','veorvc.s8','veorhi.s8','veorls.s8','veorge.s8','veorlt.s8','veorgt.s8','veorle.s8',
+ 'veoreq.s16','veorne.s16','veorcs.s16','veorhs.s16','veorcc.s16','veorlo.s16','veormi.s16','veorpl.s16','veorvs.s16','veorvc.s16','veorhi.s16','veorls.s16','veorge.s16','veorlt.s16','veorgt.s16','veorle.s16',
+ 'veoreq.s32','veorne.s32','veorcs.s32','veorhs.s32','veorcc.s32','veorlo.s32','veormi.s32','veorpl.s32','veorvs.s32','veorvc.s32','veorhi.s32','veorls.s32','veorge.s32','veorlt.s32','veorgt.s32','veorle.s32',
+ 'veoreq.s64','veorne.s64','veorcs.s64','veorhs.s64','veorcc.s64','veorlo.s64','veormi.s64','veorpl.s64','veorvs.s64','veorvc.s64','veorhi.s64','veorls.s64','veorge.s64','veorlt.s64','veorgt.s64','veorle.s64',
+ 'veoreq.u8','veorne.u8','veorcs.u8','veorhs.u8','veorcc.u8','veorlo.u8','veormi.u8','veorpl.u8','veorvs.u8','veorvc.u8','veorhi.u8','veorls.u8','veorge.u8','veorlt.u8','veorgt.u8','veorle.u8',
+ 'veoreq.u16','veorne.u16','veorcs.u16','veorhs.u16','veorcc.u16','veorlo.u16','veormi.u16','veorpl.u16','veorvs.u16','veorvc.u16','veorhi.u16','veorls.u16','veorge.u16','veorlt.u16','veorgt.u16','veorle.u16',
+ 'veoreq.u32','veorne.u32','veorcs.u32','veorhs.u32','veorcc.u32','veorlo.u32','veormi.u32','veorpl.u32','veorvs.u32','veorvc.u32','veorhi.u32','veorls.u32','veorge.u32','veorlt.u32','veorgt.u32','veorle.u32',
+ 'veoreq.u64','veorne.u64','veorcs.u64','veorhs.u64','veorcc.u64','veorlo.u64','veormi.u64','veorpl.u64','veorvs.u64','veorvc.u64','veorhi.u64','veorls.u64','veorge.u64','veorlt.u64','veorgt.u64','veorle.u64',
+ 'veoreq.f32','veorne.f32','veorcs.f32','veorhs.f32','veorcc.f32','veorlo.f32','veormi.f32','veorpl.f32','veorvs.f32','veorvc.f32','veorhi.f32','veorls.f32','veorge.f32','veorlt.f32','veorgt.f32','veorle.f32',
+ 'veoreq.f64','veorne.f64','veorcs.f64','veorhs.f64','veorcc.f64','veorlo.f64','veormi.f64','veorpl.f64','veorvs.f64','veorvc.f64','veorhi.f64','veorls.f64','veorge.f64','veorlt.f64','veorgt.f64','veorle.f64',
+
+ 'vmoveq','vmovne','vmovcs','vmovhs','vmovcc','vmovlo','vmovmi','vmovpl','vmovvs','vmovvc','vmovhi','vmovls','vmovge','vmovlt','vmovgt','vmovle',
+ 'vmoveq.8','vmovne.8','vmovcs.8','vmovhs.8','vmovcc.8','vmovlo.8','vmovmi.8','vmovpl.8','vmovvs.8','vmovvc.8','vmovhi.8','vmovls.8','vmovge.8','vmovlt.8','vmovgt.8','vmovle.8',
+ 'vmoveq.16','vmovne.16','vmovcs.16','vmovhs.16','vmovcc.16','vmovlo.16','vmovmi.16','vmovpl.16','vmovvs.16','vmovvc.16','vmovhi.16','vmovls.16','vmovge.16','vmovlt.16','vmovgt.16','vmovle.16',
+ 'vmoveq.32','vmovne.32','vmovcs.32','vmovhs.32','vmovcc.32','vmovlo.32','vmovmi.32','vmovpl.32','vmovvs.32','vmovvc.32','vmovhi.32','vmovls.32','vmovge.32','vmovlt.32','vmovgt.32','vmovle.32',
+ 'vmoveq.i8','vmovne.i8','vmovcs.i8','vmovhs.i8','vmovcc.i8','vmovlo.i8','vmovmi.i8','vmovpl.i8','vmovvs.i8','vmovvc.i8','vmovhi.i8','vmovls.i8','vmovge.i8','vmovlt.i8','vmovgt.i8','vmovle.i8',
+ 'vmoveq.i16','vmovne.i16','vmovcs.i16','vmovhs.i16','vmovcc.i16','vmovlo.i16','vmovmi.i16','vmovpl.i16','vmovvs.i16','vmovvc.i16','vmovhi.i16','vmovls.i16','vmovge.i16','vmovlt.i16','vmovgt.i16','vmovle.i16',
+ 'vmoveq.i32','vmovne.i32','vmovcs.i32','vmovhs.i32','vmovcc.i32','vmovlo.i32','vmovmi.i32','vmovpl.i32','vmovvs.i32','vmovvc.i32','vmovhi.i32','vmovls.i32','vmovge.i32','vmovlt.i32','vmovgt.i32','vmovle.i32',
+ 'vmoveq.i64','vmovne.i64','vmovcs.i64','vmovhs.i64','vmovcc.i64','vmovlo.i64','vmovmi.i64','vmovpl.i64','vmovvs.i64','vmovvc.i64','vmovhi.i64','vmovls.i64','vmovge.i64','vmovlt.i64','vmovgt.i64','vmovle.i64',
+ 'vmoveq.f32','vmovne.f32','vmovcs.f32','vmovhs.f32','vmovcc.f32','vmovlo.f32','vmovmi.f32','vmovpl.f32','vmovvs.f32','vmovvc.f32','vmovhi.f32','vmovls.f32','vmovge.f32','vmovlt.f32','vmovgt.f32','vmovle.f32',
+ 'vmoveq.f64','vmovne.f64','vmovcs.f64','vmovhs.f64','vmovcc.f64','vmovlo.f64','vmovmi.f64','vmovpl.f64','vmovvs.f64','vmovvc.f64','vmovhi.f64','vmovls.f64','vmovge.f64','vmovlt.f64','vmovgt.f64','vmovle.f64',
+
+ 'vmvneq','vmvnne','vmvncs','vmvnhs','vmvncc','vmvnlo','vmvnmi','vmvnpl','vmvnvs','vmvnvc','vmvnhi','vmvnls','vmvnge','vmvnlt','vmvngt','vmvnle',
+ 'vmvneq.s8','vmvnne.s8','vmvncs.s8','vmvnhs.s8','vmvncc.s8','vmvnlo.s8','vmvnmi.s8','vmvnpl.s8','vmvnvs.s8','vmvnvc.s8','vmvnhi.s8','vmvnls.s8','vmvnge.s8','vmvnlt.s8','vmvngt.s8','vmvnle.s8',
+ 'vmvneq.s16','vmvnne.s16','vmvncs.s16','vmvnhs.s16','vmvncc.s16','vmvnlo.s16','vmvnmi.s16','vmvnpl.s16','vmvnvs.s16','vmvnvc.s16','vmvnhi.s16','vmvnls.s16','vmvnge.s16','vmvnlt.s16','vmvngt.s16','vmvnle.s16',
+ 'vmvneq.s32','vmvnne.s32','vmvncs.s32','vmvnhs.s32','vmvncc.s32','vmvnlo.s32','vmvnmi.s32','vmvnpl.s32','vmvnvs.s32','vmvnvc.s32','vmvnhi.s32','vmvnls.s32','vmvnge.s32','vmvnlt.s32','vmvngt.s32','vmvnle.s32',
+ 'vmvneq.s64','vmvnne.s64','vmvncs.s64','vmvnhs.s64','vmvncc.s64','vmvnlo.s64','vmvnmi.s64','vmvnpl.s64','vmvnvs.s64','vmvnvc.s64','vmvnhi.s64','vmvnls.s64','vmvnge.s64','vmvnlt.s64','vmvngt.s64','vmvnle.s64',
+ 'vmvneq.u8','vmvnne.u8','vmvncs.u8','vmvnhs.u8','vmvncc.u8','vmvnlo.u8','vmvnmi.u8','vmvnpl.u8','vmvnvs.u8','vmvnvc.u8','vmvnhi.u8','vmvnls.u8','vmvnge.u8','vmvnlt.u8','vmvngt.u8','vmvnle.u8',
+ 'vmvneq.u16','vmvnne.u16','vmvncs.u16','vmvnhs.u16','vmvncc.u16','vmvnlo.u16','vmvnmi.u16','vmvnpl.u16','vmvnvs.u16','vmvnvc.u16','vmvnhi.u16','vmvnls.u16','vmvnge.u16','vmvnlt.u16','vmvngt.u16','vmvnle.u16',
+ 'vmvneq.u32','vmvnne.u32','vmvncs.u32','vmvnhs.u32','vmvncc.u32','vmvnlo.u32','vmvnmi.u32','vmvnpl.u32','vmvnvs.u32','vmvnvc.u32','vmvnhi.u32','vmvnls.u32','vmvnge.u32','vmvnlt.u32','vmvngt.u32','vmvnle.u32',
+ 'vmvneq.u64','vmvnne.u64','vmvncs.u64','vmvnhs.u64','vmvncc.u64','vmvnlo.u64','vmvnmi.u64','vmvnpl.u64','vmvnvs.u64','vmvnvc.u64','vmvnhi.u64','vmvnls.u64','vmvnge.u64','vmvnlt.u64','vmvngt.u64','vmvnle.u64',
+ 'vmvneq.i8','vmvnne.i8','vmvncs.i8','vmvnhs.i8','vmvncc.i8','vmvnlo.i8','vmvnmi.i8','vmvnpl.i8','vmvnvs.i8','vmvnvc.i8','vmvnhi.i8','vmvnls.i8','vmvnge.i8','vmvnlt.i8','vmvngt.i8','vmvnle.i8',
+ 'vmvneq.i16','vmvnne.i16','vmvncs.i16','vmvnhs.i16','vmvncc.i16','vmvnlo.i16','vmvnmi.i16','vmvnpl.i16','vmvnvs.i16','vmvnvc.i16','vmvnhi.i16','vmvnls.i16','vmvnge.i16','vmvnlt.i16','vmvngt.i16','vmvnle.i16',
+ 'vmvneq.i32','vmvnne.i32','vmvncs.i32','vmvnhs.i32','vmvncc.i32','vmvnlo.i32','vmvnmi.i32','vmvnpl.i32','vmvnvs.i32','vmvnvc.i32','vmvnhi.i32','vmvnls.i32','vmvnge.i32','vmvnlt.i32','vmvngt.i32','vmvnle.i32',
+ 'vmvneq.i64','vmvnne.i64','vmvncs.i64','vmvnhs.i64','vmvncc.i64','vmvnlo.i64','vmvnmi.i64','vmvnpl.i64','vmvnvs.i64','vmvnvc.i64','vmvnhi.i64','vmvnls.i64','vmvnge.i64','vmvnlt.i64','vmvngt.i64','vmvnle.i64',
+ 'vmvneq.f32','vmvnne.f32','vmvncs.f32','vmvnhs.f32','vmvncc.f32','vmvnlo.f32','vmvnmi.f32','vmvnpl.f32','vmvnvs.f32','vmvnvc.f32','vmvnhi.f32','vmvnls.f32','vmvnge.f32','vmvnlt.f32','vmvngt.f32','vmvnle.f32',
+ 'vmvneq.f64','vmvnne.f64','vmvncs.f64','vmvnhs.f64','vmvncc.f64','vmvnlo.f64','vmvnmi.f64','vmvnpl.f64','vmvnvs.f64','vmvnvc.f64','vmvnhi.f64','vmvnls.f64','vmvnge.f64','vmvnlt.f64','vmvngt.f64','vmvnle.f64',
+
+ 'vorneq','vornne','vorncs','vornhs','vorncc','vornlo','vornmi','vornpl','vornvs','vornvc','vornhi','vornls','vornge','vornlt','vorngt','vornle',
+ 'vorneq.s8','vornne.s8','vorncs.s8','vornhs.s8','vorncc.s8','vornlo.s8','vornmi.s8','vornpl.s8','vornvs.s8','vornvc.s8','vornhi.s8','vornls.s8','vornge.s8','vornlt.s8','vorngt.s8','vornle.s8',
+ 'vorneq.s16','vornne.s16','vorncs.s16','vornhs.s16','vorncc.s16','vornlo.s16','vornmi.s16','vornpl.s16','vornvs.s16','vornvc.s16','vornhi.s16','vornls.s16','vornge.s16','vornlt.s16','vorngt.s16','vornle.s16',
+ 'vorneq.s32','vornne.s32','vorncs.s32','vornhs.s32','vorncc.s32','vornlo.s32','vornmi.s32','vornpl.s32','vornvs.s32','vornvc.s32','vornhi.s32','vornls.s32','vornge.s32','vornlt.s32','vorngt.s32','vornle.s32',
+ 'vorneq.s64','vornne.s64','vorncs.s64','vornhs.s64','vorncc.s64','vornlo.s64','vornmi.s64','vornpl.s64','vornvs.s64','vornvc.s64','vornhi.s64','vornls.s64','vornge.s64','vornlt.s64','vorngt.s64','vornle.s64',
+ 'vorneq.u8','vornne.u8','vorncs.u8','vornhs.u8','vorncc.u8','vornlo.u8','vornmi.u8','vornpl.u8','vornvs.u8','vornvc.u8','vornhi.u8','vornls.u8','vornge.u8','vornlt.u8','vorngt.u8','vornle.u8',
+ 'vorneq.u16','vornne.u16','vorncs.u16','vornhs.u16','vorncc.u16','vornlo.u16','vornmi.u16','vornpl.u16','vornvs.u16','vornvc.u16','vornhi.u16','vornls.u16','vornge.u16','vornlt.u16','vorngt.u16','vornle.u16',
+ 'vorneq.u32','vornne.u32','vorncs.u32','vornhs.u32','vorncc.u32','vornlo.u32','vornmi.u32','vornpl.u32','vornvs.u32','vornvc.u32','vornhi.u32','vornls.u32','vornge.u32','vornlt.u32','vorngt.u32','vornle.u32',
+ 'vorneq.u64','vornne.u64','vorncs.u64','vornhs.u64','vorncc.u64','vornlo.u64','vornmi.u64','vornpl.u64','vornvs.u64','vornvc.u64','vornhi.u64','vornls.u64','vornge.u64','vornlt.u64','vorngt.u64','vornle.u64',
+ 'vorneq.i8','vornne.i8','vorncs.i8','vornhs.i8','vorncc.i8','vornlo.i8','vornmi.i8','vornpl.i8','vornvs.i8','vornvc.i8','vornhi.i8','vornls.i8','vornge.i8','vornlt.i8','vorngt.i8','vornle.i8',
+ 'vorneq.i16','vornne.i16','vorncs.i16','vornhs.i16','vorncc.i16','vornlo.i16','vornmi.i16','vornpl.i16','vornvs.i16','vornvc.i16','vornhi.i16','vornls.i16','vornge.i16','vornlt.i16','vorngt.i16','vornle.i16',
+ 'vorneq.i32','vornne.i32','vorncs.i32','vornhs.i32','vorncc.i32','vornlo.i32','vornmi.i32','vornpl.i32','vornvs.i32','vornvc.i32','vornhi.i32','vornls.i32','vornge.i32','vornlt.i32','vorngt.i32','vornle.i32',
+ 'vorneq.i64','vornne.i64','vorncs.i64','vornhs.i64','vorncc.i64','vornlo.i64','vornmi.i64','vornpl.i64','vornvs.i64','vornvc.i64','vornhi.i64','vornls.i64','vornge.i64','vornlt.i64','vorngt.i64','vornle.i64',
+ 'vorneq.f32','vornne.f32','vorncs.f32','vornhs.f32','vorncc.f32','vornlo.f32','vornmi.f32','vornpl.f32','vornvs.f32','vornvc.f32','vornhi.f32','vornls.f32','vornge.f32','vornlt.f32','vorngt.f32','vornle.f32',
+ 'vorneq.f64','vornne.f64','vorncs.f64','vornhs.f64','vorncc.f64','vornlo.f64','vornmi.f64','vornpl.f64','vornvs.f64','vornvc.f64','vornhi.f64','vornls.f64','vornge.f64','vornlt.f64','vorngt.f64','vornle.f64',
+
+ 'vorreq','vorrne','vorrcs','vorrhs','vorrcc','vorrlo','vorrmi','vorrpl','vorrvs','vorrvc','vorrhi','vorrls','vorrge','vorrlt','vorrgt','vorrle',
+ 'vorreq.s8','vorrne.s8','vorrcs.s8','vorrhs.s8','vorrcc.s8','vorrlo.s8','vorrmi.s8','vorrpl.s8','vorrvs.s8','vorrvc.s8','vorrhi.s8','vorrls.s8','vorrge.s8','vorrlt.s8','vorrgt.s8','vorrle.s8',
+ 'vorreq.s16','vorrne.s16','vorrcs.s16','vorrhs.s16','vorrcc.s16','vorrlo.s16','vorrmi.s16','vorrpl.s16','vorrvs.s16','vorrvc.s16','vorrhi.s16','vorrls.s16','vorrge.s16','vorrlt.s16','vorrgt.s16','vorrle.s16',
+ 'vorreq.s32','vorrne.s32','vorrcs.s32','vorrhs.s32','vorrcc.s32','vorrlo.s32','vorrmi.s32','vorrpl.s32','vorrvs.s32','vorrvc.s32','vorrhi.s32','vorrls.s32','vorrge.s32','vorrlt.s32','vorrgt.s32','vorrle.s32',
+ 'vorreq.s64','vorrne.s64','vorrcs.s64','vorrhs.s64','vorrcc.s64','vorrlo.s64','vorrmi.s64','vorrpl.s64','vorrvs.s64','vorrvc.s64','vorrhi.s64','vorrls.s64','vorrge.s64','vorrlt.s64','vorrgt.s64','vorrle.s64',
+ 'vorreq.u8','vorrne.u8','vorrcs.u8','vorrhs.u8','vorrcc.u8','vorrlo.u8','vorrmi.u8','vorrpl.u8','vorrvs.u8','vorrvc.u8','vorrhi.u8','vorrls.u8','vorrge.u8','vorrlt.u8','vorrgt.u8','vorrle.u8',
+ 'vorreq.u16','vorrne.u16','vorrcs.u16','vorrhs.u16','vorrcc.u16','vorrlo.u16','vorrmi.u16','vorrpl.u16','vorrvs.u16','vorrvc.u16','vorrhi.u16','vorrls.u16','vorrge.u16','vorrlt.u16','vorrgt.u16','vorrle.u16',
+ 'vorreq.u32','vorrne.u32','vorrcs.u32','vorrhs.u32','vorrcc.u32','vorrlo.u32','vorrmi.u32','vorrpl.u32','vorrvs.u32','vorrvc.u32','vorrhi.u32','vorrls.u32','vorrge.u32','vorrlt.u32','vorrgt.u32','vorrle.u32',
+ 'vorreq.u64','vorrne.u64','vorrcs.u64','vorrhs.u64','vorrcc.u64','vorrlo.u64','vorrmi.u64','vorrpl.u64','vorrvs.u64','vorrvc.u64','vorrhi.u64','vorrls.u64','vorrge.u64','vorrlt.u64','vorrgt.u64','vorrle.u64',
+ 'vorreq.i8','vorrne.i8','vorrcs.i8','vorrhs.i8','vorrcc.i8','vorrlo.i8','vorrmi.i8','vorrpl.i8','vorrvs.i8','vorrvc.i8','vorrhi.i8','vorrls.i8','vorrge.i8','vorrlt.i8','vorrgt.i8','vorrle.i8',
+ 'vorreq.i16','vorrne.i16','vorrcs.i16','vorrhs.i16','vorrcc.i16','vorrlo.i16','vorrmi.i16','vorrpl.i16','vorrvs.i16','vorrvc.i16','vorrhi.i16','vorrls.i16','vorrge.i16','vorrlt.i16','vorrgt.i16','vorrle.i16',
+ 'vorreq.i32','vorrne.i32','vorrcs.i32','vorrhs.i32','vorrcc.i32','vorrlo.i32','vorrmi.i32','vorrpl.i32','vorrvs.i32','vorrvc.i32','vorrhi.i32','vorrls.i32','vorrge.i32','vorrlt.i32','vorrgt.i32','vorrle.i32',
+ 'vorreq.i64','vorrne.i64','vorrcs.i64','vorrhs.i64','vorrcc.i64','vorrlo.i64','vorrmi.i64','vorrpl.i64','vorrvs.i64','vorrvc.i64','vorrhi.i64','vorrls.i64','vorrge.i64','vorrlt.i64','vorrgt.i64','vorrle.i64',
+ 'vorreq.f32','vorrne.f32','vorrcs.f32','vorrhs.f32','vorrcc.f32','vorrlo.f32','vorrmi.f32','vorrpl.f32','vorrvs.f32','vorrvc.f32','vorrhi.f32','vorrls.f32','vorrge.f32','vorrlt.f32','vorrgt.f32','vorrle.f32',
+ 'vorreq.f64','vorrne.f64','vorrcs.f64','vorrhs.f64','vorrcc.f64','vorrlo.f64','vorrmi.f64','vorrpl.f64','vorrvs.f64','vorrvc.f64','vorrhi.f64','vorrls.f64','vorrge.f64','vorrlt.f64','vorrgt.f64','vorrle.f64',
+
+ 'vswpeq','vswpne','vswpcs','vswphs','vswpcc','vswplo','vswpmi','vswppl','vswpvs','vswpvc','vswphi','vswpls','vswpge','vswplt','vswpgt','vswple',
+ 'vswpeq.s8','vswpne.s8','vswpcs.s8','vswphs.s8','vswpcc.s8','vswplo.s8','vswpmi.s8','vswppl.s8','vswpvs.s8','vswpvc.s8','vswphi.s8','vswpls.s8','vswpge.s8','vswplt.s8','vswpgt.s8','vswple.s8',
+ 'vswpeq.s16','vswpne.s16','vswpcs.s16','vswphs.s16','vswpcc.s16','vswplo.s16','vswpmi.s16','vswppl.s16','vswpvs.s16','vswpvc.s16','vswphi.s16','vswpls.s16','vswpge.s16','vswplt.s16','vswpgt.s16','vswple.s16',
+ 'vswpeq.s32','vswpne.s32','vswpcs.s32','vswphs.s32','vswpcc.s32','vswplo.s32','vswpmi.s32','vswppl.s32','vswpvs.s32','vswpvc.s32','vswphi.s32','vswpls.s32','vswpge.s32','vswplt.s32','vswpgt.s32','vswple.s32',
+ 'vswpeq.s64','vswpne.s64','vswpcs.s64','vswphs.s64','vswpcc.s64','vswplo.s64','vswpmi.s64','vswppl.s64','vswpvs.s64','vswpvc.s64','vswphi.s64','vswpls.s64','vswpge.s64','vswplt.s64','vswpgt.s64','vswple.s64',
+ 'vswpeq.u8','vswpne.u8','vswpcs.u8','vswphs.u8','vswpcc.u8','vswplo.u8','vswpmi.u8','vswppl.u8','vswpvs.u8','vswpvc.u8','vswphi.u8','vswpls.u8','vswpge.u8','vswplt.u8','vswpgt.u8','vswple.u8',
+ 'vswpeq.u16','vswpne.u16','vswpcs.u16','vswphs.u16','vswpcc.u16','vswplo.u16','vswpmi.u16','vswppl.u16','vswpvs.u16','vswpvc.u16','vswphi.u16','vswpls.u16','vswpge.u16','vswplt.u16','vswpgt.u16','vswple.u16',
+ 'vswpeq.u32','vswpne.u32','vswpcs.u32','vswphs.u32','vswpcc.u32','vswplo.u32','vswpmi.u32','vswppl.u32','vswpvs.u32','vswpvc.u32','vswphi.u32','vswpls.u32','vswpge.u32','vswplt.u32','vswpgt.u32','vswple.u32',
+ 'vswpeq.u64','vswpne.u64','vswpcs.u64','vswphs.u64','vswpcc.u64','vswplo.u64','vswpmi.u64','vswppl.u64','vswpvs.u64','vswpvc.u64','vswphi.u64','vswpls.u64','vswpge.u64','vswplt.u64','vswpgt.u64','vswple.u64',
+ 'vswpeq.i8','vswpne.i8','vswpcs.i8','vswphs.i8','vswpcc.i8','vswplo.i8','vswpmi.i8','vswppl.i8','vswpvs.i8','vswpvc.i8','vswphi.i8','vswpls.i8','vswpge.i8','vswplt.i8','vswpgt.i8','vswple.i8',
+ 'vswpeq.i16','vswpne.i16','vswpcs.i16','vswphs.i16','vswpcc.i16','vswplo.i16','vswpmi.i16','vswppl.i16','vswpvs.i16','vswpvc.i16','vswphi.i16','vswpls.i16','vswpge.i16','vswplt.i16','vswpgt.i16','vswple.i16',
+ 'vswpeq.i32','vswpne.i32','vswpcs.i32','vswphs.i32','vswpcc.i32','vswplo.i32','vswpmi.i32','vswppl.i32','vswpvs.i32','vswpvc.i32','vswphi.i32','vswpls.i32','vswpge.i32','vswplt.i32','vswpgt.i32','vswple.i32',
+ 'vswpeq.i64','vswpne.i64','vswpcs.i64','vswphs.i64','vswpcc.i64','vswplo.i64','vswpmi.i64','vswppl.i64','vswpvs.i64','vswpvc.i64','vswphi.i64','vswpls.i64','vswpge.i64','vswplt.i64','vswpgt.i64','vswple.i64',
+ 'vswpeq.f32','vswpne.f32','vswpcs.f32','vswphs.f32','vswpcc.f32','vswplo.f32','vswpmi.f32','vswppl.f32','vswpvs.f32','vswpvc.f32','vswphi.f32','vswpls.f32','vswpge.f32','vswplt.f32','vswpgt.f32','vswple.f32',
+ 'vswpeq.f64','vswpne.f64','vswpcs.f64','vswphs.f64','vswpcc.f64','vswplo.f64','vswpmi.f64','vswppl.f64','vswpvs.f64','vswpvc.f64','vswphi.f64','vswpls.f64','vswpge.f64','vswplt.f64','vswpgt.f64','vswple.f64'
+ ),
+ /* Conditional NEON SIMD ARM Registers Interop Instructions */
+ 29 => array(
+ 'vmrseq','vmrsne','vmrscs','vmrshs','vmrscc','vmrslo','vmrsmi','vmrspl','vmrsvs','vmrsvc','vmrshi','vmrsls','vmrsge','vmrslt','vmrsgt','vmrsle',
+ 'vmsreq','vmsrne','vmsrcs','vmsrhs','vmsrcc','vmsrlo','vmsrmi','vmsrpl','vmsrvs','vmsrvc','vmsrhi','vmsrls','vmsrge','vmsrlt','vmsrgt','vmsrle'
+ ),
+ /* Conditional NEON SIMD Bit/Byte-Level Instructions */
+ 30 => array(
+ 'vcnteq.8','vcntne.8','vcntcs.8','vcnths.8','vcntcc.8','vcntlo.8','vcntmi.8','vcntpl.8','vcntvs.8','vcntvc.8','vcnthi.8','vcntls.8','vcntge.8','vcntlt.8','vcntgt.8','vcntle.8',
+ 'vdupeq.8','vdupne.8','vdupcs.8','vduphs.8','vdupcc.8','vduplo.8','vdupmi.8','vduppl.8','vdupvs.8','vdupvc.8','vduphi.8','vdupls.8','vdupge.8','vduplt.8','vdupgt.8','vduple.8',
+
+ 'vdupeq.16','vdupne.16','vdupcs.16','vduphs.16','vdupcc.16','vduplo.16','vdupmi.16','vduppl.16','vdupvs.16','vdupvc.16','vduphi.16','vdupls.16','vdupge.16','vduplt.16','vdupgt.16','vduple.16',
+ 'vdupeq.32','vdupne.32','vdupcs.32','vduphs.32','vdupcc.32','vduplo.32','vdupmi.32','vduppl.32','vdupvs.32','vdupvc.32','vduphi.32','vdupls.32','vdupge.32','vduplt.32','vdupgt.32','vduple.32',
+
+ 'vexteq.8','vextne.8','vextcs.8','vexths.8','vextcc.8','vextlo.8','vextmi.8','vextpl.8','vextvs.8','vextvc.8','vexthi.8','vextls.8','vextge.8','vextlt.8','vextgt.8','vextle.8',
+ 'vexteq.16','vextne.16','vextcs.16','vexths.16','vextcc.16','vextlo.16','vextmi.16','vextpl.16','vextvs.16','vextvc.16','vexthi.16','vextls.16','vextge.16','vextlt.16','vextgt.16','vextle.16',
+
+ 'vexteq.32','vextne.32','vextcs.32','vexths.32','vextcc.32','vextlo.32','vextmi.32','vextpl.32','vextvs.32','vextvc.32','vexthi.32','vextls.32','vextge.32','vextlt.32','vextgt.32','vextle.32',
+ 'vexteq.64','vextne.64','vextcs.64','vexths.64','vextcc.64','vextlo.64','vextmi.64','vextpl.64','vextvs.64','vextvc.64','vexthi.64','vextls.64','vextge.64','vextlt.64','vextgt.64','vextle.64',
+
+ 'vrev16eq.8','vrev16ne.8','vrev16cs.8','vrev16hs.8','vrev16cc.8','vrev16lo.8','vrev16mi.8','vrev16pl.8','vrev16vs.8','vrev16vc.8','vrev16hi.8','vrev16ls.8','vrev16ge.8','vrev16lt.8','vrev16gt.8','vrev16le.8',
+ 'vrev32eq.8','vrev32ne.8','vrev32cs.8','vrev32hs.8','vrev32cc.8','vrev32lo.8','vrev32mi.8','vrev32pl.8','vrev32vs.8','vrev32vc.8','vrev32hi.8','vrev32ls.8','vrev32ge.8','vrev32lt.8','vrev32gt.8','vrev32le.8',
+ 'vrev32eq.16','vrev32ne.16','vrev32cs.16','vrev32hs.16','vrev32cc.16','vrev32lo.16','vrev32mi.16','vrev32pl.16','vrev32vs.16','vrev32vc.16','vrev32hi.16','vrev32ls.16','vrev32ge.16','vrev32lt.16','vrev32gt.16','vrev32le.16',
+ 'vrev64eq.8','vrev64ne.8','vrev64cs.8','vrev64hs.8','vrev64cc.8','vrev64lo.8','vrev64mi.8','vrev64pl.8','vrev64vs.8','vrev64vc.8','vrev64hi.8','vrev64ls.8','vrev64ge.8','vrev64lt.8','vrev64gt.8','vrev64le.8',
+ 'vrev64eq.16','vrev64ne.16','vrev64cs.16','vrev64hs.16','vrev64cc.16','vrev64lo.16','vrev64mi.16','vrev64pl.16','vrev64vs.16','vrev64vc.16','vrev64hi.16','vrev64ls.16','vrev64ge.16','vrev64lt.16','vrev64gt.16','vrev64le.16',
+ 'vrev64eq.32','vrev64ne.32','vrev64cs.32','vrev64hs.32','vrev64cc.32','vrev64lo.32','vrev64mi.32','vrev64pl.32','vrev64vs.32','vrev64vc.32','vrev64hi.32','vrev64ls.32','vrev64ge.32','vrev64lt.32','vrev64gt.32','vrev64le.32',
+
+ 'vslieq.8','vsline.8','vslics.8','vslihs.8','vslicc.8','vslilo.8','vslimi.8','vslipl.8','vslivs.8','vslivc.8','vslihi.8','vslils.8','vslige.8','vslilt.8','vsligt.8','vslile.8',
+ 'vslieq.16','vsline.16','vslics.16','vslihs.16','vslicc.16','vslilo.16','vslimi.16','vslipl.16','vslivs.16','vslivc.16','vslihi.16','vslils.16','vslige.16','vslilt.16','vsligt.16','vslile.16',
+ 'vslieq.32','vsline.32','vslics.32','vslihs.32','vslicc.32','vslilo.32','vslimi.32','vslipl.32','vslivs.32','vslivc.32','vslihi.32','vslils.32','vslige.32','vslilt.32','vsligt.32','vslile.32',
+ 'vslieq.64','vsline.64','vslics.64','vslihs.64','vslicc.64','vslilo.64','vslimi.64','vslipl.64','vslivs.64','vslivc.64','vslihi.64','vslils.64','vslige.64','vslilt.64','vsligt.64','vslile.64',
+
+ 'vsrieq.8','vsrine.8','vsrics.8','vsrihs.8','vsricc.8','vsrilo.8','vsrimi.8','vsripl.8','vsrivs.8','vsrivc.8','vsrihi.8','vsrils.8','vsrige.8','vsrilt.8','vsrigt.8','vsrile.8',
+ 'vsrieq.16','vsrine.16','vsrics.16','vsrihs.16','vsricc.16','vsrilo.16','vsrimi.16','vsripl.16','vsrivs.16','vsrivc.16','vsrihi.16','vsrils.16','vsrige.16','vsrilt.16','vsrigt.16','vsrile.16',
+ 'vsrieq.32','vsrine.32','vsrics.32','vsrihs.32','vsricc.32','vsrilo.32','vsrimi.32','vsripl.32','vsrivs.32','vsrivc.32','vsrihi.32','vsrils.32','vsrige.32','vsrilt.32','vsrigt.32','vsrile.32',
+ 'vsrieq.64','vsrine.64','vsrics.64','vsrihs.64','vsricc.64','vsrilo.64','vsrimi.64','vsripl.64','vsrivs.64','vsrivc.64','vsrihi.64','vsrils.64','vsrige.64','vsrilt.64','vsrigt.64','vsrile.64',
+
+ 'vtbleq.8','vtblne.8','vtblcs.8','vtblhs.8','vtblcc.8','vtbllo.8','vtblmi.8','vtblpl.8','vtblvs.8','vtblvc.8','vtblhi.8','vtblls.8','vtblge.8','vtbllt.8','vtblgt.8','vtblle.8',
+
+ 'vtbxeq','vtbxne','vtbxcs','vtbxhs','vtbxcc','vtbxlo','vtbxmi','vtbxpl','vtbxvs','vtbxvc','vtbxhi','vtbxls','vtbxge','vtbxlt','vtbxgt','vtbxle',
+
+ 'vtrneq.8','vtrnne.8','vtrncs.8','vtrnhs.8','vtrncc.8','vtrnlo.8','vtrnmi.8','vtrnpl.8','vtrnvs.8','vtrnvc.8','vtrnhi.8','vtrnls.8','vtrnge.8','vtrnlt.8','vtrngt.8','vtrnle.8',
+ 'vtrneq.16','vtrnne.16','vtrncs.16','vtrnhs.16','vtrncc.16','vtrnlo.16','vtrnmi.16','vtrnpl.16','vtrnvs.16','vtrnvc.16','vtrnhi.16','vtrnls.16','vtrnge.16','vtrnlt.16','vtrngt.16','vtrnle.16',
+ 'vtrneq.32','vtrnne.32','vtrncs.32','vtrnhs.32','vtrncc.32','vtrnlo.32','vtrnmi.32','vtrnpl.32','vtrnvs.32','vtrnvc.32','vtrnhi.32','vtrnls.32','vtrnge.32','vtrnlt.32','vtrngt.32','vtrnle.32',
+
+ 'vtsteq.8','vtstne.8','vtstcs.8','vtsths.8','vtstcc.8','vtstlo.8','vtstmi.8','vtstpl.8','vtstvs.8','vtstvc.8','vtsthi.8','vtstls.8','vtstge.8','vtstlt.8','vtstgt.8','vtstle.8',
+ 'vtsteq.16','vtstne.16','vtstcs.16','vtsths.16','vtstcc.16','vtstlo.16','vtstmi.16','vtstpl.16','vtstvs.16','vtstvc.16','vtsthi.16','vtstls.16','vtstge.16','vtstlt.16','vtstgt.16','vtstle.16',
+ 'vtsteq.32','vtstne.32','vtstcs.32','vtsths.32','vtstcc.32','vtstlo.32','vtstmi.32','vtstpl.32','vtstvs.32','vtstvc.32','vtsthi.32','vtstls.32','vtstge.32','vtstlt.32','vtstgt.32','vtstle.32',
+
+ 'vuzpeq.8','vuzpne.8','vuzpcs.8','vuzphs.8','vuzpcc.8','vuzplo.8','vuzpmi.8','vuzppl.8','vuzpvs.8','vuzpvc.8','vuzphi.8','vuzpls.8','vuzpge.8','vuzplt.8','vuzpgt.8','vuzple.8',
+ 'vuzpeq.16','vuzpne.16','vuzpcs.16','vuzphs.16','vuzpcc.16','vuzplo.16','vuzpmi.16','vuzppl.16','vuzpvs.16','vuzpvc.16','vuzphi.16','vuzpls.16','vuzpge.16','vuzplt.16','vuzpgt.16','vuzple.16',
+ 'vuzpeq.32','vuzpne.32','vuzpcs.32','vuzphs.32','vuzpcc.32','vuzplo.32','vuzpmi.32','vuzppl.32','vuzpvs.32','vuzpvc.32','vuzphi.32','vuzpls.32','vuzpge.32','vuzplt.32','vuzpgt.32','vuzple.32',
+
+ 'vzipeq.8','vzipne.8','vzipcs.8','vziphs.8','vzipcc.8','vziplo.8','vzipmi.8','vzippl.8','vzipvs.8','vzipvc.8','vziphi.8','vzipls.8','vzipge.8','vziplt.8','vzipgt.8','vziple.8',
+ 'vzipeq.16','vzipne.16','vzipcs.16','vziphs.16','vzipcc.16','vziplo.16','vzipmi.16','vzippl.16','vzipvs.16','vzipvc.16','vziphi.16','vzipls.16','vzipge.16','vziplt.16','vzipgt.16','vziple.16',
+ 'vzipeq.32','vzipne.32','vzipcs.32','vziphs.32','vzipcc.32','vziplo.32','vzipmi.32','vzippl.32','vzipvs.32','vzipvc.32','vziphi.32','vzipls.32','vzipge.32','vziplt.32','vzipgt.32','vziple.32',
+
+ 'vmulleq.p8','vmullne.p8','vmullcs.p8','vmullhs.p8','vmullcc.p8','vmulllo.p8','vmullmi.p8','vmullpl.p8','vmullvs.p8','vmullvc.p8','vmullhi.p8','vmullls.p8','vmullge.p8','vmulllt.p8','vmullgt.p8','vmullle.p8'
+ ),
+ /* Conditional NEON SIMD Universal Integer Instructions */
+ 31 => array(
+ 'vaddeq.i8','vaddne.i8','vaddcs.i8','vaddhs.i8','vaddcc.i8','vaddlo.i8','vaddmi.i8','vaddpl.i8','vaddvs.i8','vaddvc.i8','vaddhi.i8','vaddls.i8','vaddge.i8','vaddlt.i8','vaddgt.i8','vaddle.i8',
+ 'vaddeq.i16','vaddne.i16','vaddcs.i16','vaddhs.i16','vaddcc.i16','vaddlo.i16','vaddmi.i16','vaddpl.i16','vaddvs.i16','vaddvc.i16','vaddhi.i16','vaddls.i16','vaddge.i16','vaddlt.i16','vaddgt.i16','vaddle.i16',
+ 'vaddeq.i32','vaddne.i32','vaddcs.i32','vaddhs.i32','vaddcc.i32','vaddlo.i32','vaddmi.i32','vaddpl.i32','vaddvs.i32','vaddvc.i32','vaddhi.i32','vaddls.i32','vaddge.i32','vaddlt.i32','vaddgt.i32','vaddle.i32',
+ 'vaddeq.i64','vaddne.i64','vaddcs.i64','vaddhs.i64','vaddcc.i64','vaddlo.i64','vaddmi.i64','vaddpl.i64','vaddvs.i64','vaddvc.i64','vaddhi.i64','vaddls.i64','vaddge.i64','vaddlt.i64','vaddgt.i64','vaddle.i64',
+
+ 'vsubeq.i8','vsubne.i8','vsubcs.i8','vsubhs.i8','vsubcc.i8','vsublo.i8','vsubmi.i8','vsubpl.i8','vsubvs.i8','vsubvc.i8','vsubhi.i8','vsubls.i8','vsubge.i8','vsublt.i8','vsubgt.i8','vsuble.i8',
+ 'vsubeq.i16','vsubne.i16','vsubcs.i16','vsubhs.i16','vsubcc.i16','vsublo.i16','vsubmi.i16','vsubpl.i16','vsubvs.i16','vsubvc.i16','vsubhi.i16','vsubls.i16','vsubge.i16','vsublt.i16','vsubgt.i16','vsuble.i16',
+ 'vsubeq.i32','vsubne.i32','vsubcs.i32','vsubhs.i32','vsubcc.i32','vsublo.i32','vsubmi.i32','vsubpl.i32','vsubvs.i32','vsubvc.i32','vsubhi.i32','vsubls.i32','vsubge.i32','vsublt.i32','vsubgt.i32','vsuble.i32',
+ 'vsubeq.i64','vsubne.i64','vsubcs.i64','vsubhs.i64','vsubcc.i64','vsublo.i64','vsubmi.i64','vsubpl.i64','vsubvs.i64','vsubvc.i64','vsubhi.i64','vsubls.i64','vsubge.i64','vsublt.i64','vsubgt.i64','vsuble.i64',
+
+ 'vaddhneq.i16','vaddhnne.i16','vaddhncs.i16','vaddhnhs.i16','vaddhncc.i16','vaddhnlo.i16','vaddhnmi.i16','vaddhnpl.i16','vaddhnvs.i16','vaddhnvc.i16','vaddhnhi.i16','vaddhnls.i16','vaddhnge.i16','vaddhnlt.i16','vaddhngt.i16','vaddhnle.i16',
+ 'vaddhneq.i32','vaddhnne.i32','vaddhncs.i32','vaddhnhs.i32','vaddhncc.i32','vaddhnlo.i32','vaddhnmi.i32','vaddhnpl.i32','vaddhnvs.i32','vaddhnvc.i32','vaddhnhi.i32','vaddhnls.i32','vaddhnge.i32','vaddhnlt.i32','vaddhngt.i32','vaddhnle.i32',
+ 'vaddhneq.i64','vaddhnne.i64','vaddhncs.i64','vaddhnhs.i64','vaddhncc.i64','vaddhnlo.i64','vaddhnmi.i64','vaddhnpl.i64','vaddhnvs.i64','vaddhnvc.i64','vaddhnhi.i64','vaddhnls.i64','vaddhnge.i64','vaddhnlt.i64','vaddhngt.i64','vaddhnle.i64',
+
+ 'vsubhneq.i16','vsubhnne.i16','vsubhncs.i16','vsubhnhs.i16','vsubhncc.i16','vsubhnlo.i16','vsubhnmi.i16','vsubhnpl.i16','vsubhnvs.i16','vsubhnvc.i16','vsubhnhi.i16','vsubhnls.i16','vsubhnge.i16','vsubhnlt.i16','vsubhngt.i16','vsubhnle.i16',
+ 'vsubhneq.i32','vsubhnne.i32','vsubhncs.i32','vsubhnhs.i32','vsubhncc.i32','vsubhnlo.i32','vsubhnmi.i32','vsubhnpl.i32','vsubhnvs.i32','vsubhnvc.i32','vsubhnhi.i32','vsubhnls.i32','vsubhnge.i32','vsubhnlt.i32','vsubhngt.i32','vsubhnle.i32',
+ 'vsubhneq.i64','vsubhnne.i64','vsubhncs.i64','vsubhnhs.i64','vsubhncc.i64','vsubhnlo.i64','vsubhnmi.i64','vsubhnpl.i64','vsubhnvs.i64','vsubhnvc.i64','vsubhnhi.i64','vsubhnls.i64','vsubhnge.i64','vsubhnlt.i64','vsubhngt.i64','vsubhnle.i64',
+
+ 'vraddhneq.i16','vraddhnne.i16','vraddhncs.i16','vraddhnhs.i16','vraddhncc.i16','vraddhnlo.i16','vraddhnmi.i16','vraddhnpl.i16','vraddhnvs.i16','vraddhnvc.i16','vraddhnhi.i16','vraddhnls.i16','vraddhnge.i16','vraddhnlt.i16','vraddhngt.i16','vraddhnle.i16',
+ 'vraddhneq.i32','vraddhnne.i32','vraddhncs.i32','vraddhnhs.i32','vraddhncc.i32','vraddhnlo.i32','vraddhnmi.i32','vraddhnpl.i32','vraddhnvs.i32','vraddhnvc.i32','vraddhnhi.i32','vraddhnls.i32','vraddhnge.i32','vraddhnlt.i32','vraddhngt.i32','vraddhnle.i32',
+ 'vraddhneq.i64','vraddhnne.i64','vraddhncs.i64','vraddhnhs.i64','vraddhncc.i64','vraddhnlo.i64','vraddhnmi.i64','vraddhnpl.i64','vraddhnvs.i64','vraddhnvc.i64','vraddhnhi.i64','vraddhnls.i64','vraddhnge.i64','vraddhnlt.i64','vraddhngt.i64','vraddhnle.i64',
+
+ 'vrsubhneq.i16','vrsubhnne.i16','vrsubhncs.i16','vrsubhnhs.i16','vrsubhncc.i16','vrsubhnlo.i16','vrsubhnmi.i16','vrsubhnpl.i16','vrsubhnvs.i16','vrsubhnvc.i16','vrsubhnhi.i16','vrsubhnls.i16','vrsubhnge.i16','vrsubhnlt.i16','vrsubhngt.i16','vrsubhnle.i16',
+ 'vrsubhneq.i32','vrsubhnne.i32','vrsubhncs.i32','vrsubhnhs.i32','vrsubhncc.i32','vrsubhnlo.i32','vrsubhnmi.i32','vrsubhnpl.i32','vrsubhnvs.i32','vrsubhnvc.i32','vrsubhnhi.i32','vrsubhnls.i32','vrsubhnge.i32','vrsubhnlt.i32','vrsubhngt.i32','vrsubhnle.i32',
+ 'vrsubhneq.i64','vrsubhnne.i64','vrsubhncs.i64','vrsubhnhs.i64','vrsubhncc.i64','vrsubhnlo.i64','vrsubhnmi.i64','vrsubhnpl.i64','vrsubhnvs.i64','vrsubhnvc.i64','vrsubhnhi.i64','vrsubhnls.i64','vrsubhnge.i64','vrsubhnlt.i64','vrsubhngt.i64','vrsubhnle.i64',
+
+ 'vpaddeq.i8','vpaddne.i8','vpaddcs.i8','vpaddhs.i8','vpaddcc.i8','vpaddlo.i8','vpaddmi.i8','vpaddpl.i8','vpaddvs.i8','vpaddvc.i8','vpaddhi.i8','vpaddls.i8','vpaddge.i8','vpaddlt.i8','vpaddgt.i8','vpaddle.i8',
+ 'vpaddeq.i16','vpaddne.i16','vpaddcs.i16','vpaddhs.i16','vpaddcc.i16','vpaddlo.i16','vpaddmi.i16','vpaddpl.i16','vpaddvs.i16','vpaddvc.i16','vpaddhi.i16','vpaddls.i16','vpaddge.i16','vpaddlt.i16','vpaddgt.i16','vpaddle.i16',
+ 'vpaddeq.i32','vpaddne.i32','vpaddcs.i32','vpaddhs.i32','vpaddcc.i32','vpaddlo.i32','vpaddmi.i32','vpaddpl.i32','vpaddvs.i32','vpaddvc.i32','vpaddhi.i32','vpaddls.i32','vpaddge.i32','vpaddlt.i32','vpaddgt.i32','vpaddle.i32',
+
+ 'vceqeq.i8','vceqne.i8','vceqcs.i8','vceqhs.i8','vceqcc.i8','vceqlo.i8','vceqmi.i8','vceqpl.i8','vceqvs.i8','vceqvc.i8','vceqhi.i8','vceqls.i8','vceqge.i8','vceqlt.i8','vceqgt.i8','vceqle.i8',
+ 'vceqeq.i16','vceqne.i16','vceqcs.i16','vceqhs.i16','vceqcc.i16','vceqlo.i16','vceqmi.i16','vceqpl.i16','vceqvs.i16','vceqvc.i16','vceqhi.i16','vceqls.i16','vceqge.i16','vceqlt.i16','vceqgt.i16','vceqle.i16',
+ 'vceqeq.i32','vceqne.i32','vceqcs.i32','vceqhs.i32','vceqcc.i32','vceqlo.i32','vceqmi.i32','vceqpl.i32','vceqvs.i32','vceqvc.i32','vceqhi.i32','vceqls.i32','vceqge.i32','vceqlt.i32','vceqgt.i32','vceqle.i32',
+
+ 'vclzeq.i8','vclzne.i8','vclzcs.i8','vclzhs.i8','vclzcc.i8','vclzlo.i8','vclzmi.i8','vclzpl.i8','vclzvs.i8','vclzvc.i8','vclzhi.i8','vclzls.i8','vclzge.i8','vclzlt.i8','vclzgt.i8','vclzle.i8',
+ 'vclzeq.i16','vclzne.i16','vclzcs.i16','vclzhs.i16','vclzcc.i16','vclzlo.i16','vclzmi.i16','vclzpl.i16','vclzvs.i16','vclzvc.i16','vclzhi.i16','vclzls.i16','vclzge.i16','vclzlt.i16','vclzgt.i16','vclzle.i16',
+ 'vclzeq.i32','vclzne.i32','vclzcs.i32','vclzhs.i32','vclzcc.i32','vclzlo.i32','vclzmi.i32','vclzpl.i32','vclzvs.i32','vclzvc.i32','vclzhi.i32','vclzls.i32','vclzge.i32','vclzlt.i32','vclzgt.i32','vclzle.i32',
+
+ 'vmovneq.i16','vmovnne.i16','vmovncs.i16','vmovnhs.i16','vmovncc.i16','vmovnlo.i16','vmovnmi.i16','vmovnpl.i16','vmovnvs.i16','vmovnvc.i16','vmovnhi.i16','vmovnls.i16','vmovnge.i16','vmovnlt.i16','vmovngt.i16','vmovnle.i16',
+ 'vmovneq.i32','vmovnne.i32','vmovncs.i32','vmovnhs.i32','vmovncc.i32','vmovnlo.i32','vmovnmi.i32','vmovnpl.i32','vmovnvs.i32','vmovnvc.i32','vmovnhi.i32','vmovnls.i32','vmovnge.i32','vmovnlt.i32','vmovngt.i32','vmovnle.i32',
+ 'vmovneq.i64','vmovnne.i64','vmovncs.i64','vmovnhs.i64','vmovncc.i64','vmovnlo.i64','vmovnmi.i64','vmovnpl.i64','vmovnvs.i64','vmovnvc.i64','vmovnhi.i64','vmovnls.i64','vmovnge.i64','vmovnlt.i64','vmovngt.i64','vmovnle.i64',
+
+ 'vmlaeq.s8','vmlane.s8','vmlacs.s8','vmlahs.s8','vmlacc.s8','vmlalo.s8','vmlami.s8','vmlapl.s8','vmlavs.s8','vmlavc.s8','vmlahi.s8','vmlals.s8','vmlage.s8','vmlalt.s8','vmlagt.s8','vmlale.s8',
+ 'vmlaeq.s16','vmlane.s16','vmlacs.s16','vmlahs.s16','vmlacc.s16','vmlalo.s16','vmlami.s16','vmlapl.s16','vmlavs.s16','vmlavc.s16','vmlahi.s16','vmlals.s16','vmlage.s16','vmlalt.s16','vmlagt.s16','vmlale.s16',
+ 'vmlaeq.s32','vmlane.s32','vmlacs.s32','vmlahs.s32','vmlacc.s32','vmlalo.s32','vmlami.s32','vmlapl.s32','vmlavs.s32','vmlavc.s32','vmlahi.s32','vmlals.s32','vmlage.s32','vmlalt.s32','vmlagt.s32','vmlale.s32',
+ 'vmlaeq.u8','vmlane.u8','vmlacs.u8','vmlahs.u8','vmlacc.u8','vmlalo.u8','vmlami.u8','vmlapl.u8','vmlavs.u8','vmlavc.u8','vmlahi.u8','vmlals.u8','vmlage.u8','vmlalt.u8','vmlagt.u8','vmlale.u8',
+ 'vmlaeq.u16','vmlane.u16','vmlacs.u16','vmlahs.u16','vmlacc.u16','vmlalo.u16','vmlami.u16','vmlapl.u16','vmlavs.u16','vmlavc.u16','vmlahi.u16','vmlals.u16','vmlage.u16','vmlalt.u16','vmlagt.u16','vmlale.u16',
+ 'vmlaeq.u32','vmlane.u32','vmlacs.u32','vmlahs.u32','vmlacc.u32','vmlalo.u32','vmlami.u32','vmlapl.u32','vmlavs.u32','vmlavc.u32','vmlahi.u32','vmlals.u32','vmlage.u32','vmlalt.u32','vmlagt.u32','vmlale.u32',
+ 'vmlaeq.i8','vmlane.i8','vmlacs.i8','vmlahs.i8','vmlacc.i8','vmlalo.i8','vmlami.i8','vmlapl.i8','vmlavs.i8','vmlavc.i8','vmlahi.i8','vmlals.i8','vmlage.i8','vmlalt.i8','vmlagt.i8','vmlale.i8',
+ 'vmlaeq.i16','vmlane.i16','vmlacs.i16','vmlahs.i16','vmlacc.i16','vmlalo.i16','vmlami.i16','vmlapl.i16','vmlavs.i16','vmlavc.i16','vmlahi.i16','vmlals.i16','vmlage.i16','vmlalt.i16','vmlagt.i16','vmlale.i16',
+ 'vmlaeq.i32','vmlane.i32','vmlacs.i32','vmlahs.i32','vmlacc.i32','vmlalo.i32','vmlami.i32','vmlapl.i32','vmlavs.i32','vmlavc.i32','vmlahi.i32','vmlals.i32','vmlage.i32','vmlalt.i32','vmlagt.i32','vmlale.i32',
+
+ 'vmlseq.s8','vmlsne.s8','vmlscs.s8','vmlshs.s8','vmlscc.s8','vmlslo.s8','vmlsmi.s8','vmlspl.s8','vmlsvs.s8','vmlsvc.s8','vmlshi.s8','vmlsls.s8','vmlsge.s8','vmlslt.s8','vmlsgt.s8','vmlsle.s8',
+ 'vmlseq.s16','vmlsne.s16','vmlscs.s16','vmlshs.s16','vmlscc.s16','vmlslo.s16','vmlsmi.s16','vmlspl.s16','vmlsvs.s16','vmlsvc.s16','vmlshi.s16','vmlsls.s16','vmlsge.s16','vmlslt.s16','vmlsgt.s16','vmlsle.s16',
+ 'vmlseq.s32','vmlsne.s32','vmlscs.s32','vmlshs.s32','vmlscc.s32','vmlslo.s32','vmlsmi.s32','vmlspl.s32','vmlsvs.s32','vmlsvc.s32','vmlshi.s32','vmlsls.s32','vmlsge.s32','vmlslt.s32','vmlsgt.s32','vmlsle.s32',
+ 'vmlseq.u8','vmlsne.u8','vmlscs.u8','vmlshs.u8','vmlscc.u8','vmlslo.u8','vmlsmi.u8','vmlspl.u8','vmlsvs.u8','vmlsvc.u8','vmlshi.u8','vmlsls.u8','vmlsge.u8','vmlslt.u8','vmlsgt.u8','vmlsle.u8',
+ 'vmlseq.u16','vmlsne.u16','vmlscs.u16','vmlshs.u16','vmlscc.u16','vmlslo.u16','vmlsmi.u16','vmlspl.u16','vmlsvs.u16','vmlsvc.u16','vmlshi.u16','vmlsls.u16','vmlsge.u16','vmlslt.u16','vmlsgt.u16','vmlsle.u16',
+ 'vmlseq.u32','vmlsne.u32','vmlscs.u32','vmlshs.u32','vmlscc.u32','vmlslo.u32','vmlsmi.u32','vmlspl.u32','vmlsvs.u32','vmlsvc.u32','vmlshi.u32','vmlsls.u32','vmlsge.u32','vmlslt.u32','vmlsgt.u32','vmlsle.u32',
+ 'vmlseq.i8','vmlsne.i8','vmlscs.i8','vmlshs.i8','vmlscc.i8','vmlslo.i8','vmlsmi.i8','vmlspl.i8','vmlsvs.i8','vmlsvc.i8','vmlshi.i8','vmlsls.i8','vmlsge.i8','vmlslt.i8','vmlsgt.i8','vmlsle.i8',
+ 'vmlseq.i16','vmlsne.i16','vmlscs.i16','vmlshs.i16','vmlscc.i16','vmlslo.i16','vmlsmi.i16','vmlspl.i16','vmlsvs.i16','vmlsvc.i16','vmlshi.i16','vmlsls.i16','vmlsge.i16','vmlslt.i16','vmlsgt.i16','vmlsle.i16',
+ 'vmlseq.i32','vmlsne.i32','vmlscs.i32','vmlshs.i32','vmlscc.i32','vmlslo.i32','vmlsmi.i32','vmlspl.i32','vmlsvs.i32','vmlsvc.i32','vmlshi.i32','vmlsls.i32','vmlsge.i32','vmlslt.i32','vmlsgt.i32','vmlsle.i32',
+
+ 'vmuleq.s8','vmulne.s8','vmulcs.s8','vmulhs.s8','vmulcc.s8','vmullo.s8','vmulmi.s8','vmulpl.s8','vmulvs.s8','vmulvc.s8','vmulhi.s8','vmulls.s8','vmulge.s8','vmullt.s8','vmulgt.s8','vmulle.s8',
+ 'vmuleq.s16','vmulne.s16','vmulcs.s16','vmulhs.s16','vmulcc.s16','vmullo.s16','vmulmi.s16','vmulpl.s16','vmulvs.s16','vmulvc.s16','vmulhi.s16','vmulls.s16','vmulge.s16','vmullt.s16','vmulgt.s16','vmulle.s16',
+ 'vmuleq.s32','vmulne.s32','vmulcs.s32','vmulhs.s32','vmulcc.s32','vmullo.s32','vmulmi.s32','vmulpl.s32','vmulvs.s32','vmulvc.s32','vmulhi.s32','vmulls.s32','vmulge.s32','vmullt.s32','vmulgt.s32','vmulle.s32',
+ 'vmuleq.u8','vmulne.u8','vmulcs.u8','vmulhs.u8','vmulcc.u8','vmullo.u8','vmulmi.u8','vmulpl.u8','vmulvs.u8','vmulvc.u8','vmulhi.u8','vmulls.u8','vmulge.u8','vmullt.u8','vmulgt.u8','vmulle.u8',
+ 'vmuleq.u16','vmulne.u16','vmulcs.u16','vmulhs.u16','vmulcc.u16','vmullo.u16','vmulmi.u16','vmulpl.u16','vmulvs.u16','vmulvc.u16','vmulhi.u16','vmulls.u16','vmulge.u16','vmullt.u16','vmulgt.u16','vmulle.u16',
+ 'vmuleq.u32','vmulne.u32','vmulcs.u32','vmulhs.u32','vmulcc.u32','vmullo.u32','vmulmi.u32','vmulpl.u32','vmulvs.u32','vmulvc.u32','vmulhi.u32','vmulls.u32','vmulge.u32','vmullt.u32','vmulgt.u32','vmulle.u32',
+ 'vmuleq.i8','vmulne.i8','vmulcs.i8','vmulhs.i8','vmulcc.i8','vmullo.i8','vmulmi.i8','vmulpl.i8','vmulvs.i8','vmulvc.i8','vmulhi.i8','vmulls.i8','vmulge.i8','vmullt.i8','vmulgt.i8','vmulle.i8',
+ 'vmuleq.i16','vmulne.i16','vmulcs.i16','vmulhs.i16','vmulcc.i16','vmullo.i16','vmulmi.i16','vmulpl.i16','vmulvs.i16','vmulvc.i16','vmulhi.i16','vmulls.i16','vmulge.i16','vmullt.i16','vmulgt.i16','vmulle.i16',
+ 'vmuleq.i32','vmulne.i32','vmulcs.i32','vmulhs.i32','vmulcc.i32','vmullo.i32','vmulmi.i32','vmulpl.i32','vmulvs.i32','vmulvc.i32','vmulhi.i32','vmulls.i32','vmulge.i32','vmullt.i32','vmulgt.i32','vmulle.i32',
+ 'vmuleq.p8','vmulne.p8','vmulcs.p8','vmulhs.p8','vmulcc.p8','vmullo.p8','vmulmi.p8','vmulpl.p8','vmulvs.p8','vmulvc.p8','vmulhi.p8','vmulls.p8','vmulge.p8','vmullt.p8','vmulgt.p8','vmulle.p8',
+
+ 'vrshrneq.i16','vrshrnne.i16','vrshrncs.i16','vrshrnhs.i16','vrshrncc.i16','vrshrnlo.i16','vrshrnmi.i16','vrshrnpl.i16','vrshrnvs.i16','vrshrnvc.i16','vrshrnhi.i16','vrshrnls.i16','vrshrnge.i16','vrshrnlt.i16','vrshrngt.i16','vrshrnle.i16',
+ 'vrshrneq.i32','vrshrnne.i32','vrshrncs.i32','vrshrnhs.i32','vrshrncc.i32','vrshrnlo.i32','vrshrnmi.i32','vrshrnpl.i32','vrshrnvs.i32','vrshrnvc.i32','vrshrnhi.i32','vrshrnls.i32','vrshrnge.i32','vrshrnlt.i32','vrshrngt.i32','vrshrnle.i32',
+ 'vrshrneq.i64','vrshrnne.i64','vrshrncs.i64','vrshrnhs.i64','vrshrncc.i64','vrshrnlo.i64','vrshrnmi.i64','vrshrnpl.i64','vrshrnvs.i64','vrshrnvc.i64','vrshrnhi.i64','vrshrnls.i64','vrshrnge.i64','vrshrnlt.i64','vrshrngt.i64','vrshrnle.i64',
+
+ 'vshrneq.i16','vshrnne.i16','vshrncs.i16','vshrnhs.i16','vshrncc.i16','vshrnlo.i16','vshrnmi.i16','vshrnpl.i16','vshrnvs.i16','vshrnvc.i16','vshrnhi.i16','vshrnls.i16','vshrnge.i16','vshrnlt.i16','vshrngt.i16','vshrnle.i16',
+ 'vshrneq.i32','vshrnne.i32','vshrncs.i32','vshrnhs.i32','vshrncc.i32','vshrnlo.i32','vshrnmi.i32','vshrnpl.i32','vshrnvs.i32','vshrnvc.i32','vshrnhi.i32','vshrnls.i32','vshrnge.i32','vshrnlt.i32','vshrngt.i32','vshrnle.i32',
+ 'vshrneq.i64','vshrnne.i64','vshrncs.i64','vshrnhs.i64','vshrncc.i64','vshrnlo.i64','vshrnmi.i64','vshrnpl.i64','vshrnvs.i64','vshrnvc.i64','vshrnhi.i64','vshrnls.i64','vshrnge.i64','vshrnlt.i64','vshrngt.i64','vshrnle.i64',
+
+ 'vshleq.i8','vshlne.i8','vshlcs.i8','vshlhs.i8','vshlcc.i8','vshllo.i8','vshlmi.i8','vshlpl.i8','vshlvs.i8','vshlvc.i8','vshlhi.i8','vshlls.i8','vshlge.i8','vshllt.i8','vshlgt.i8','vshlle.i8',
+ 'vshleq.i16','vshlne.i16','vshlcs.i16','vshlhs.i16','vshlcc.i16','vshllo.i16','vshlmi.i16','vshlpl.i16','vshlvs.i16','vshlvc.i16','vshlhi.i16','vshlls.i16','vshlge.i16','vshllt.i16','vshlgt.i16','vshlle.i16',
+ 'vshleq.i32','vshlne.i32','vshlcs.i32','vshlhs.i32','vshlcc.i32','vshllo.i32','vshlmi.i32','vshlpl.i32','vshlvs.i32','vshlvc.i32','vshlhi.i32','vshlls.i32','vshlge.i32','vshllt.i32','vshlgt.i32','vshlle.i32',
+ 'vshleq.i64','vshlne.i64','vshlcs.i64','vshlhs.i64','vshlcc.i64','vshllo.i64','vshlmi.i64','vshlpl.i64','vshlvs.i64','vshlvc.i64','vshlhi.i64','vshlls.i64','vshlge.i64','vshllt.i64','vshlgt.i64','vshlle.i64',
+
+ 'vshlleq.i8','vshllne.i8','vshllcs.i8','vshllhs.i8','vshllcc.i8','vshlllo.i8','vshllmi.i8','vshllpl.i8','vshllvs.i8','vshllvc.i8','vshllhi.i8','vshllls.i8','vshllge.i8','vshlllt.i8','vshllgt.i8','vshllle.i8',
+ 'vshlleq.i16','vshllne.i16','vshllcs.i16','vshllhs.i16','vshllcc.i16','vshlllo.i16','vshllmi.i16','vshllpl.i16','vshllvs.i16','vshllvc.i16','vshllhi.i16','vshllls.i16','vshllge.i16','vshlllt.i16','vshllgt.i16','vshllle.i16',
+ 'vshlleq.i32','vshllne.i32','vshllcs.i32','vshllhs.i32','vshllcc.i32','vshlllo.i32','vshllmi.i32','vshllpl.i32','vshllvs.i32','vshllvc.i32','vshllhi.i32','vshllls.i32','vshllge.i32','vshlllt.i32','vshllgt.i32','vshllle.i32'
+ ),
+ /* Conditional NEON SIMD Signed Integer Instructions */
+ 32 => array(
+ 'vabaeq.s8','vabane.s8','vabacs.s8','vabahs.s8','vabacc.s8','vabalo.s8','vabami.s8','vabapl.s8','vabavs.s8','vabavc.s8','vabahi.s8','vabals.s8','vabage.s8','vabalt.s8','vabagt.s8','vabale.s8',
+ 'vabaeq.s16','vabane.s16','vabacs.s16','vabahs.s16','vabacc.s16','vabalo.s16','vabami.s16','vabapl.s16','vabavs.s16','vabavc.s16','vabahi.s16','vabals.s16','vabage.s16','vabalt.s16','vabagt.s16','vabale.s16',
+ 'vabaeq.s32','vabane.s32','vabacs.s32','vabahs.s32','vabacc.s32','vabalo.s32','vabami.s32','vabapl.s32','vabavs.s32','vabavc.s32','vabahi.s32','vabals.s32','vabage.s32','vabalt.s32','vabagt.s32','vabale.s32',
+
+ 'vabaleq.s8','vabalne.s8','vabalcs.s8','vabalhs.s8','vabalcc.s8','vaballo.s8','vabalmi.s8','vabalpl.s8','vabalvs.s8','vabalvc.s8','vabalhi.s8','vaballs.s8','vabalge.s8','vaballt.s8','vabalgt.s8','vaballe.s8',
+ 'vabaleq.s16','vabalne.s16','vabalcs.s16','vabalhs.s16','vabalcc.s16','vaballo.s16','vabalmi.s16','vabalpl.s16','vabalvs.s16','vabalvc.s16','vabalhi.s16','vaballs.s16','vabalge.s16','vaballt.s16','vabalgt.s16','vaballe.s16',
+ 'vabaleq.s32','vabalne.s32','vabalcs.s32','vabalhs.s32','vabalcc.s32','vaballo.s32','vabalmi.s32','vabalpl.s32','vabalvs.s32','vabalvc.s32','vabalhi.s32','vaballs.s32','vabalge.s32','vaballt.s32','vabalgt.s32','vaballe.s32',
+
+ 'vabdeq.s8','vabdne.s8','vabdcs.s8','vabdhs.s8','vabdcc.s8','vabdlo.s8','vabdmi.s8','vabdpl.s8','vabdvs.s8','vabdvc.s8','vabdhi.s8','vabdls.s8','vabdge.s8','vabdlt.s8','vabdgt.s8','vabdle.s8',
+ 'vabdeq.s16','vabdne.s16','vabdcs.s16','vabdhs.s16','vabdcc.s16','vabdlo.s16','vabdmi.s16','vabdpl.s16','vabdvs.s16','vabdvc.s16','vabdhi.s16','vabdls.s16','vabdge.s16','vabdlt.s16','vabdgt.s16','vabdle.s16',
+ 'vabdeq.s32','vabdne.s32','vabdcs.s32','vabdhs.s32','vabdcc.s32','vabdlo.s32','vabdmi.s32','vabdpl.s32','vabdvs.s32','vabdvc.s32','vabdhi.s32','vabdls.s32','vabdge.s32','vabdlt.s32','vabdgt.s32','vabdle.s32',
+
+ 'vabseq.s8','vabsne.s8','vabscs.s8','vabshs.s8','vabscc.s8','vabslo.s8','vabsmi.s8','vabspl.s8','vabsvs.s8','vabsvc.s8','vabshi.s8','vabsls.s8','vabsge.s8','vabslt.s8','vabsgt.s8','vabsle.s8',
+ 'vabseq.s16','vabsne.s16','vabscs.s16','vabshs.s16','vabscc.s16','vabslo.s16','vabsmi.s16','vabspl.s16','vabsvs.s16','vabsvc.s16','vabshi.s16','vabsls.s16','vabsge.s16','vabslt.s16','vabsgt.s16','vabsle.s16',
+ 'vabseq.s32','vabsne.s32','vabscs.s32','vabshs.s32','vabscc.s32','vabslo.s32','vabsmi.s32','vabspl.s32','vabsvs.s32','vabsvc.s32','vabshi.s32','vabsls.s32','vabsge.s32','vabslt.s32','vabsgt.s32','vabsle.s32',
+
+ 'vaddleq.s8','vaddlne.s8','vaddlcs.s8','vaddlhs.s8','vaddlcc.s8','vaddllo.s8','vaddlmi.s8','vaddlpl.s8','vaddlvs.s8','vaddlvc.s8','vaddlhi.s8','vaddlls.s8','vaddlge.s8','vaddllt.s8','vaddlgt.s8','vaddlle.s8',
+ 'vaddleq.s16','vaddlne.s16','vaddlcs.s16','vaddlhs.s16','vaddlcc.s16','vaddllo.s16','vaddlmi.s16','vaddlpl.s16','vaddlvs.s16','vaddlvc.s16','vaddlhi.s16','vaddlls.s16','vaddlge.s16','vaddllt.s16','vaddlgt.s16','vaddlle.s16',
+ 'vaddleq.s32','vaddlne.s32','vaddlcs.s32','vaddlhs.s32','vaddlcc.s32','vaddllo.s32','vaddlmi.s32','vaddlpl.s32','vaddlvs.s32','vaddlvc.s32','vaddlhi.s32','vaddlls.s32','vaddlge.s32','vaddllt.s32','vaddlgt.s32','vaddlle.s32',
+
+ 'vcgeeq.s8','vcgene.s8','vcgecs.s8','vcgehs.s8','vcgecc.s8','vcgelo.s8','vcgemi.s8','vcgepl.s8','vcgevs.s8','vcgevc.s8','vcgehi.s8','vcgels.s8','vcgege.s8','vcgelt.s8','vcgegt.s8','vcgele.s8',
+ 'vcgeeq.s16','vcgene.s16','vcgecs.s16','vcgehs.s16','vcgecc.s16','vcgelo.s16','vcgemi.s16','vcgepl.s16','vcgevs.s16','vcgevc.s16','vcgehi.s16','vcgels.s16','vcgege.s16','vcgelt.s16','vcgegt.s16','vcgele.s16',
+ 'vcgeeq.s32','vcgene.s32','vcgecs.s32','vcgehs.s32','vcgecc.s32','vcgelo.s32','vcgemi.s32','vcgepl.s32','vcgevs.s32','vcgevc.s32','vcgehi.s32','vcgels.s32','vcgege.s32','vcgelt.s32','vcgegt.s32','vcgele.s32',
+
+ 'vcleeq.s8','vclene.s8','vclecs.s8','vclehs.s8','vclecc.s8','vclelo.s8','vclemi.s8','vclepl.s8','vclevs.s8','vclevc.s8','vclehi.s8','vclels.s8','vclege.s8','vclelt.s8','vclegt.s8','vclele.s8',
+ 'vcleeq.s16','vclene.s16','vclecs.s16','vclehs.s16','vclecc.s16','vclelo.s16','vclemi.s16','vclepl.s16','vclevs.s16','vclevc.s16','vclehi.s16','vclels.s16','vclege.s16','vclelt.s16','vclegt.s16','vclele.s16',
+ 'vcleeq.s32','vclene.s32','vclecs.s32','vclehs.s32','vclecc.s32','vclelo.s32','vclemi.s32','vclepl.s32','vclevs.s32','vclevc.s32','vclehi.s32','vclels.s32','vclege.s32','vclelt.s32','vclegt.s32','vclele.s32',
+
+ 'vcgteq.s8','vcgtne.s8','vcgtcs.s8','vcgths.s8','vcgtcc.s8','vcgtlo.s8','vcgtmi.s8','vcgtpl.s8','vcgtvs.s8','vcgtvc.s8','vcgthi.s8','vcgtls.s8','vcgtge.s8','vcgtlt.s8','vcgtgt.s8','vcgtle.s8',
+ 'vcgteq.s16','vcgtne.s16','vcgtcs.s16','vcgths.s16','vcgtcc.s16','vcgtlo.s16','vcgtmi.s16','vcgtpl.s16','vcgtvs.s16','vcgtvc.s16','vcgthi.s16','vcgtls.s16','vcgtge.s16','vcgtlt.s16','vcgtgt.s16','vcgtle.s16',
+ 'vcgteq.s32','vcgtne.s32','vcgtcs.s32','vcgths.s32','vcgtcc.s32','vcgtlo.s32','vcgtmi.s32','vcgtpl.s32','vcgtvs.s32','vcgtvc.s32','vcgthi.s32','vcgtls.s32','vcgtge.s32','vcgtlt.s32','vcgtgt.s32','vcgtle.s32',
+
+ 'vclteq.s8','vcltne.s8','vcltcs.s8','vclths.s8','vcltcc.s8','vcltlo.s8','vcltmi.s8','vcltpl.s8','vcltvs.s8','vcltvc.s8','vclthi.s8','vcltls.s8','vcltge.s8','vcltlt.s8','vcltgt.s8','vcltle.s8',
+ 'vclteq.s16','vcltne.s16','vcltcs.s16','vclths.s16','vcltcc.s16','vcltlo.s16','vcltmi.s16','vcltpl.s16','vcltvs.s16','vcltvc.s16','vclthi.s16','vcltls.s16','vcltge.s16','vcltlt.s16','vcltgt.s16','vcltle.s16',
+ 'vclteq.s32','vcltne.s32','vcltcs.s32','vclths.s32','vcltcc.s32','vcltlo.s32','vcltmi.s32','vcltpl.s32','vcltvs.s32','vcltvc.s32','vclthi.s32','vcltls.s32','vcltge.s32','vcltlt.s32','vcltgt.s32','vcltle.s32',
+
+ 'vclseq.s8','vclsne.s8','vclscs.s8','vclshs.s8','vclscc.s8','vclslo.s8','vclsmi.s8','vclspl.s8','vclsvs.s8','vclsvc.s8','vclshi.s8','vclsls.s8','vclsge.s8','vclslt.s8','vclsgt.s8','vclsle.s8',
+ 'vclseq.s16','vclsne.s16','vclscs.s16','vclshs.s16','vclscc.s16','vclslo.s16','vclsmi.s16','vclspl.s16','vclsvs.s16','vclsvc.s16','vclshi.s16','vclsls.s16','vclsge.s16','vclslt.s16','vclsgt.s16','vclsle.s16',
+ 'vclseq.s32','vclsne.s32','vclscs.s32','vclshs.s32','vclscc.s32','vclslo.s32','vclsmi.s32','vclspl.s32','vclsvs.s32','vclsvc.s32','vclshi.s32','vclsls.s32','vclsge.s32','vclslt.s32','vclsgt.s32','vclsle.s32',
+
+ 'vaddweq.s8','vaddwne.s8','vaddwcs.s8','vaddwhs.s8','vaddwcc.s8','vaddwlo.s8','vaddwmi.s8','vaddwpl.s8','vaddwvs.s8','vaddwvc.s8','vaddwhi.s8','vaddwls.s8','vaddwge.s8','vaddwlt.s8','vaddwgt.s8','vaddwle.s8',
+ 'vaddweq.s16','vaddwne.s16','vaddwcs.s16','vaddwhs.s16','vaddwcc.s16','vaddwlo.s16','vaddwmi.s16','vaddwpl.s16','vaddwvs.s16','vaddwvc.s16','vaddwhi.s16','vaddwls.s16','vaddwge.s16','vaddwlt.s16','vaddwgt.s16','vaddwle.s16',
+ 'vaddweq.s32','vaddwne.s32','vaddwcs.s32','vaddwhs.s32','vaddwcc.s32','vaddwlo.s32','vaddwmi.s32','vaddwpl.s32','vaddwvs.s32','vaddwvc.s32','vaddwhi.s32','vaddwls.s32','vaddwge.s32','vaddwlt.s32','vaddwgt.s32','vaddwle.s32',
+
+ 'vhaddeq.s8','vhaddne.s8','vhaddcs.s8','vhaddhs.s8','vhaddcc.s8','vhaddlo.s8','vhaddmi.s8','vhaddpl.s8','vhaddvs.s8','vhaddvc.s8','vhaddhi.s8','vhaddls.s8','vhaddge.s8','vhaddlt.s8','vhaddgt.s8','vhaddle.s8',
+ 'vhaddeq.s16','vhaddne.s16','vhaddcs.s16','vhaddhs.s16','vhaddcc.s16','vhaddlo.s16','vhaddmi.s16','vhaddpl.s16','vhaddvs.s16','vhaddvc.s16','vhaddhi.s16','vhaddls.s16','vhaddge.s16','vhaddlt.s16','vhaddgt.s16','vhaddle.s16',
+ 'vhaddeq.s32','vhaddne.s32','vhaddcs.s32','vhaddhs.s32','vhaddcc.s32','vhaddlo.s32','vhaddmi.s32','vhaddpl.s32','vhaddvs.s32','vhaddvc.s32','vhaddhi.s32','vhaddls.s32','vhaddge.s32','vhaddlt.s32','vhaddgt.s32','vhaddle.s32',
+
+ 'vhsubeq.s8','vhsubne.s8','vhsubcs.s8','vhsubhs.s8','vhsubcc.s8','vhsublo.s8','vhsubmi.s8','vhsubpl.s8','vhsubvs.s8','vhsubvc.s8','vhsubhi.s8','vhsubls.s8','vhsubge.s8','vhsublt.s8','vhsubgt.s8','vhsuble.s8',
+ 'vhsubeq.s16','vhsubne.s16','vhsubcs.s16','vhsubhs.s16','vhsubcc.s16','vhsublo.s16','vhsubmi.s16','vhsubpl.s16','vhsubvs.s16','vhsubvc.s16','vhsubhi.s16','vhsubls.s16','vhsubge.s16','vhsublt.s16','vhsubgt.s16','vhsuble.s16',
+ 'vhsubeq.s32','vhsubne.s32','vhsubcs.s32','vhsubhs.s32','vhsubcc.s32','vhsublo.s32','vhsubmi.s32','vhsubpl.s32','vhsubvs.s32','vhsubvc.s32','vhsubhi.s32','vhsubls.s32','vhsubge.s32','vhsublt.s32','vhsubgt.s32','vhsuble.s32',
+
+ 'vmaxeq.s8','vmaxne.s8','vmaxcs.s8','vmaxhs.s8','vmaxcc.s8','vmaxlo.s8','vmaxmi.s8','vmaxpl.s8','vmaxvs.s8','vmaxvc.s8','vmaxhi.s8','vmaxls.s8','vmaxge.s8','vmaxlt.s8','vmaxgt.s8','vmaxle.s8',
+ 'vmaxeq.s16','vmaxne.s16','vmaxcs.s16','vmaxhs.s16','vmaxcc.s16','vmaxlo.s16','vmaxmi.s16','vmaxpl.s16','vmaxvs.s16','vmaxvc.s16','vmaxhi.s16','vmaxls.s16','vmaxge.s16','vmaxlt.s16','vmaxgt.s16','vmaxle.s16',
+ 'vmaxeq.s32','vmaxne.s32','vmaxcs.s32','vmaxhs.s32','vmaxcc.s32','vmaxlo.s32','vmaxmi.s32','vmaxpl.s32','vmaxvs.s32','vmaxvc.s32','vmaxhi.s32','vmaxls.s32','vmaxge.s32','vmaxlt.s32','vmaxgt.s32','vmaxle.s32',
+
+ 'vmineq.s8','vminne.s8','vmincs.s8','vminhs.s8','vmincc.s8','vminlo.s8','vminmi.s8','vminpl.s8','vminvs.s8','vminvc.s8','vminhi.s8','vminls.s8','vminge.s8','vminlt.s8','vmingt.s8','vminle.s8',
+ 'vmineq.s16','vminne.s16','vmincs.s16','vminhs.s16','vmincc.s16','vminlo.s16','vminmi.s16','vminpl.s16','vminvs.s16','vminvc.s16','vminhi.s16','vminls.s16','vminge.s16','vminlt.s16','vmingt.s16','vminle.s16',
+ 'vmineq.s32','vminne.s32','vmincs.s32','vminhs.s32','vmincc.s32','vminlo.s32','vminmi.s32','vminpl.s32','vminvs.s32','vminvc.s32','vminhi.s32','vminls.s32','vminge.s32','vminlt.s32','vmingt.s32','vminle.s32',
+
+ 'vmlaleq.s8','vmlalne.s8','vmlalcs.s8','vmlalhs.s8','vmlalcc.s8','vmlallo.s8','vmlalmi.s8','vmlalpl.s8','vmlalvs.s8','vmlalvc.s8','vmlalhi.s8','vmlalls.s8','vmlalge.s8','vmlallt.s8','vmlalgt.s8','vmlalle.s8',
+ 'vmlaleq.s16','vmlalne.s16','vmlalcs.s16','vmlalhs.s16','vmlalcc.s16','vmlallo.s16','vmlalmi.s16','vmlalpl.s16','vmlalvs.s16','vmlalvc.s16','vmlalhi.s16','vmlalls.s16','vmlalge.s16','vmlallt.s16','vmlalgt.s16','vmlalle.s16',
+ 'vmlaleq.s32','vmlalne.s32','vmlalcs.s32','vmlalhs.s32','vmlalcc.s32','vmlallo.s32','vmlalmi.s32','vmlalpl.s32','vmlalvs.s32','vmlalvc.s32','vmlalhi.s32','vmlalls.s32','vmlalge.s32','vmlallt.s32','vmlalgt.s32','vmlalle.s32',
+
+ 'vmlsleq.s8','vmlslne.s8','vmlslcs.s8','vmlslhs.s8','vmlslcc.s8','vmlsllo.s8','vmlslmi.s8','vmlslpl.s8','vmlslvs.s8','vmlslvc.s8','vmlslhi.s8','vmlslls.s8','vmlslge.s8','vmlsllt.s8','vmlslgt.s8','vmlslle.s8',
+ 'vmlsleq.s16','vmlslne.s16','vmlslcs.s16','vmlslhs.s16','vmlslcc.s16','vmlsllo.s16','vmlslmi.s16','vmlslpl.s16','vmlslvs.s16','vmlslvc.s16','vmlslhi.s16','vmlslls.s16','vmlslge.s16','vmlsllt.s16','vmlslgt.s16','vmlslle.s16',
+ 'vmlsleq.s32','vmlslne.s32','vmlslcs.s32','vmlslhs.s32','vmlslcc.s32','vmlsllo.s32','vmlslmi.s32','vmlslpl.s32','vmlslvs.s32','vmlslvc.s32','vmlslhi.s32','vmlslls.s32','vmlslge.s32','vmlsllt.s32','vmlslgt.s32','vmlslle.s32',
+
+ 'vnegeq.s8','vnegne.s8','vnegcs.s8','vneghs.s8','vnegcc.s8','vneglo.s8','vnegmi.s8','vnegpl.s8','vnegvs.s8','vnegvc.s8','vneghi.s8','vnegls.s8','vnegge.s8','vneglt.s8','vneggt.s8','vnegle.s8',
+ 'vnegeq.s16','vnegne.s16','vnegcs.s16','vneghs.s16','vnegcc.s16','vneglo.s16','vnegmi.s16','vnegpl.s16','vnegvs.s16','vnegvc.s16','vneghi.s16','vnegls.s16','vnegge.s16','vneglt.s16','vneggt.s16','vnegle.s16',
+ 'vnegeq.s32','vnegne.s32','vnegcs.s32','vneghs.s32','vnegcc.s32','vneglo.s32','vnegmi.s32','vnegpl.s32','vnegvs.s32','vnegvc.s32','vneghi.s32','vnegls.s32','vnegge.s32','vneglt.s32','vneggt.s32','vnegle.s32',
+
+ 'vpadaleq.s8','vpadalne.s8','vpadalcs.s8','vpadalhs.s8','vpadalcc.s8','vpadallo.s8','vpadalmi.s8','vpadalpl.s8','vpadalvs.s8','vpadalvc.s8','vpadalhi.s8','vpadalls.s8','vpadalge.s8','vpadallt.s8','vpadalgt.s8','vpadalle.s8',
+ 'vpadaleq.s16','vpadalne.s16','vpadalcs.s16','vpadalhs.s16','vpadalcc.s16','vpadallo.s16','vpadalmi.s16','vpadalpl.s16','vpadalvs.s16','vpadalvc.s16','vpadalhi.s16','vpadalls.s16','vpadalge.s16','vpadallt.s16','vpadalgt.s16','vpadalle.s16',
+ 'vpadaleq.s32','vpadalne.s32','vpadalcs.s32','vpadalhs.s32','vpadalcc.s32','vpadallo.s32','vpadalmi.s32','vpadalpl.s32','vpadalvs.s32','vpadalvc.s32','vpadalhi.s32','vpadalls.s32','vpadalge.s32','vpadallt.s32','vpadalgt.s32','vpadalle.s32',
+
+ 'vmovleq.s8','vmovlne.s8','vmovlcs.s8','vmovlhs.s8','vmovlcc.s8','vmovllo.s8','vmovlmi.s8','vmovlpl.s8','vmovlvs.s8','vmovlvc.s8','vmovlhi.s8','vmovlls.s8','vmovlge.s8','vmovllt.s8','vmovlgt.s8','vmovlle.s8',
+ 'vmovleq.s16','vmovlne.s16','vmovlcs.s16','vmovlhs.s16','vmovlcc.s16','vmovllo.s16','vmovlmi.s16','vmovlpl.s16','vmovlvs.s16','vmovlvc.s16','vmovlhi.s16','vmovlls.s16','vmovlge.s16','vmovllt.s16','vmovlgt.s16','vmovlle.s16',
+ 'vmovleq.s32','vmovlne.s32','vmovlcs.s32','vmovlhs.s32','vmovlcc.s32','vmovllo.s32','vmovlmi.s32','vmovlpl.s32','vmovlvs.s32','vmovlvc.s32','vmovlhi.s32','vmovlls.s32','vmovlge.s32','vmovllt.s32','vmovlgt.s32','vmovlle.s32',
+
+ 'vmulleq.s8','vmullne.s8','vmullcs.s8','vmullhs.s8','vmullcc.s8','vmulllo.s8','vmullmi.s8','vmullpl.s8','vmullvs.s8','vmullvc.s8','vmullhi.s8','vmullls.s8','vmullge.s8','vmulllt.s8','vmullgt.s8','vmullle.s8',
+ 'vmulleq.s16','vmullne.s16','vmullcs.s16','vmullhs.s16','vmullcc.s16','vmulllo.s16','vmullmi.s16','vmullpl.s16','vmullvs.s16','vmullvc.s16','vmullhi.s16','vmullls.s16','vmullge.s16','vmulllt.s16','vmullgt.s16','vmullle.s16',
+ 'vmulleq.s32','vmullne.s32','vmullcs.s32','vmullhs.s32','vmullcc.s32','vmulllo.s32','vmullmi.s32','vmullpl.s32','vmullvs.s32','vmullvc.s32','vmullhi.s32','vmullls.s32','vmullge.s32','vmulllt.s32','vmullgt.s32','vmullle.s32',
+
+ 'vpaddleq.s8','vpaddlne.s8','vpaddlcs.s8','vpaddlhs.s8','vpaddlcc.s8','vpaddllo.s8','vpaddlmi.s8','vpaddlpl.s8','vpaddlvs.s8','vpaddlvc.s8','vpaddlhi.s8','vpaddlls.s8','vpaddlge.s8','vpaddllt.s8','vpaddlgt.s8','vpaddlle.s8',
+ 'vpaddleq.s16','vpaddlne.s16','vpaddlcs.s16','vpaddlhs.s16','vpaddlcc.s16','vpaddllo.s16','vpaddlmi.s16','vpaddlpl.s16','vpaddlvs.s16','vpaddlvc.s16','vpaddlhi.s16','vpaddlls.s16','vpaddlge.s16','vpaddllt.s16','vpaddlgt.s16','vpaddlle.s16',
+ 'vpaddleq.s32','vpaddlne.s32','vpaddlcs.s32','vpaddlhs.s32','vpaddlcc.s32','vpaddllo.s32','vpaddlmi.s32','vpaddlpl.s32','vpaddlvs.s32','vpaddlvc.s32','vpaddlhi.s32','vpaddlls.s32','vpaddlge.s32','vpaddllt.s32','vpaddlgt.s32','vpaddlle.s32',
+
+ 'vpmaxeq.s8','vpmaxne.s8','vpmaxcs.s8','vpmaxhs.s8','vpmaxcc.s8','vpmaxlo.s8','vpmaxmi.s8','vpmaxpl.s8','vpmaxvs.s8','vpmaxvc.s8','vpmaxhi.s8','vpmaxls.s8','vpmaxge.s8','vpmaxlt.s8','vpmaxgt.s8','vpmaxle.s8',
+ 'vpmaxeq.s16','vpmaxne.s16','vpmaxcs.s16','vpmaxhs.s16','vpmaxcc.s16','vpmaxlo.s16','vpmaxmi.s16','vpmaxpl.s16','vpmaxvs.s16','vpmaxvc.s16','vpmaxhi.s16','vpmaxls.s16','vpmaxge.s16','vpmaxlt.s16','vpmaxgt.s16','vpmaxle.s16',
+ 'vpmaxeq.s32','vpmaxne.s32','vpmaxcs.s32','vpmaxhs.s32','vpmaxcc.s32','vpmaxlo.s32','vpmaxmi.s32','vpmaxpl.s32','vpmaxvs.s32','vpmaxvc.s32','vpmaxhi.s32','vpmaxls.s32','vpmaxge.s32','vpmaxlt.s32','vpmaxgt.s32','vpmaxle.s32',
+
+ 'vpmineq.s8','vpminne.s8','vpmincs.s8','vpminhs.s8','vpmincc.s8','vpminlo.s8','vpminmi.s8','vpminpl.s8','vpminvs.s8','vpminvc.s8','vpminhi.s8','vpminls.s8','vpminge.s8','vpminlt.s8','vpmingt.s8','vpminle.s8',
+ 'vpmineq.s16','vpminne.s16','vpmincs.s16','vpminhs.s16','vpmincc.s16','vpminlo.s16','vpminmi.s16','vpminpl.s16','vpminvs.s16','vpminvc.s16','vpminhi.s16','vpminls.s16','vpminge.s16','vpminlt.s16','vpmingt.s16','vpminle.s16',
+ 'vpmineq.s32','vpminne.s32','vpmincs.s32','vpminhs.s32','vpmincc.s32','vpminlo.s32','vpminmi.s32','vpminpl.s32','vpminvs.s32','vpminvc.s32','vpminhi.s32','vpminls.s32','vpminge.s32','vpminlt.s32','vpmingt.s32','vpminle.s32',
+
+ 'vqabseq.s8','vqabsne.s8','vqabscs.s8','vqabshs.s8','vqabscc.s8','vqabslo.s8','vqabsmi.s8','vqabspl.s8','vqabsvs.s8','vqabsvc.s8','vqabshi.s8','vqabsls.s8','vqabsge.s8','vqabslt.s8','vqabsgt.s8','vqabsle.s8',
+ 'vqabseq.s16','vqabsne.s16','vqabscs.s16','vqabshs.s16','vqabscc.s16','vqabslo.s16','vqabsmi.s16','vqabspl.s16','vqabsvs.s16','vqabsvc.s16','vqabshi.s16','vqabsls.s16','vqabsge.s16','vqabslt.s16','vqabsgt.s16','vqabsle.s16',
+ 'vqabseq.s32','vqabsne.s32','vqabscs.s32','vqabshs.s32','vqabscc.s32','vqabslo.s32','vqabsmi.s32','vqabspl.s32','vqabsvs.s32','vqabsvc.s32','vqabshi.s32','vqabsls.s32','vqabsge.s32','vqabslt.s32','vqabsgt.s32','vqabsle.s32',
+
+ 'vqaddeq.s8','vqaddne.s8','vqaddcs.s8','vqaddhs.s8','vqaddcc.s8','vqaddlo.s8','vqaddmi.s8','vqaddpl.s8','vqaddvs.s8','vqaddvc.s8','vqaddhi.s8','vqaddls.s8','vqaddge.s8','vqaddlt.s8','vqaddgt.s8','vqaddle.s8',
+ 'vqaddeq.s16','vqaddne.s16','vqaddcs.s16','vqaddhs.s16','vqaddcc.s16','vqaddlo.s16','vqaddmi.s16','vqaddpl.s16','vqaddvs.s16','vqaddvc.s16','vqaddhi.s16','vqaddls.s16','vqaddge.s16','vqaddlt.s16','vqaddgt.s16','vqaddle.s16',
+ 'vqaddeq.s32','vqaddne.s32','vqaddcs.s32','vqaddhs.s32','vqaddcc.s32','vqaddlo.s32','vqaddmi.s32','vqaddpl.s32','vqaddvs.s32','vqaddvc.s32','vqaddhi.s32','vqaddls.s32','vqaddge.s32','vqaddlt.s32','vqaddgt.s32','vqaddle.s32',
+ 'vqaddeq.s64','vqaddne.s64','vqaddcs.s64','vqaddhs.s64','vqaddcc.s64','vqaddlo.s64','vqaddmi.s64','vqaddpl.s64','vqaddvs.s64','vqaddvc.s64','vqaddhi.s64','vqaddls.s64','vqaddge.s64','vqaddlt.s64','vqaddgt.s64','vqaddle.s64',
+
+ 'vqdmlaleq.s16','vqdmlalne.s16','vqdmlalcs.s16','vqdmlalhs.s16','vqdmlalcc.s16','vqdmlallo.s16','vqdmlalmi.s16','vqdmlalpl.s16','vqdmlalvs.s16','vqdmlalvc.s16','vqdmlalhi.s16','vqdmlalls.s16','vqdmlalge.s16','vqdmlallt.s16','vqdmlalgt.s16','vqdmlalle.s16',
+ 'vqdmlaleq.s32','vqdmlalne.s32','vqdmlalcs.s32','vqdmlalhs.s32','vqdmlalcc.s32','vqdmlallo.s32','vqdmlalmi.s32','vqdmlalpl.s32','vqdmlalvs.s32','vqdmlalvc.s32','vqdmlalhi.s32','vqdmlalls.s32','vqdmlalge.s32','vqdmlallt.s32','vqdmlalgt.s32','vqdmlalle.s32',
+
+ 'vqdmlsleq.s16','vqdmlslne.s16','vqdmlslcs.s16','vqdmlslhs.s16','vqdmlslcc.s16','vqdmlsllo.s16','vqdmlslmi.s16','vqdmlslpl.s16','vqdmlslvs.s16','vqdmlslvc.s16','vqdmlslhi.s16','vqdmlslls.s16','vqdmlslge.s16','vqdmlsllt.s16','vqdmlslgt.s16','vqdmlslle.s16',
+ 'vqdmlsleq.s32','vqdmlslne.s32','vqdmlslcs.s32','vqdmlslhs.s32','vqdmlslcc.s32','vqdmlsllo.s32','vqdmlslmi.s32','vqdmlslpl.s32','vqdmlslvs.s32','vqdmlslvc.s32','vqdmlslhi.s32','vqdmlslls.s32','vqdmlslge.s32','vqdmlsllt.s32','vqdmlslgt.s32','vqdmlslle.s32',
+
+ 'vqdmulheq.s16','vqdmulhne.s16','vqdmulhcs.s16','vqdmulhhs.s16','vqdmulhcc.s16','vqdmulhlo.s16','vqdmulhmi.s16','vqdmulhpl.s16','vqdmulhvs.s16','vqdmulhvc.s16','vqdmulhhi.s16','vqdmulhls.s16','vqdmulhge.s16','vqdmulhlt.s16','vqdmulhgt.s16','vqdmulhle.s16',
+ 'vqdmulheq.s32','vqdmulhne.s32','vqdmulhcs.s32','vqdmulhhs.s32','vqdmulhcc.s32','vqdmulhlo.s32','vqdmulhmi.s32','vqdmulhpl.s32','vqdmulhvs.s32','vqdmulhvc.s32','vqdmulhhi.s32','vqdmulhls.s32','vqdmulhge.s32','vqdmulhlt.s32','vqdmulhgt.s32','vqdmulhle.s32',
+
+ 'vqdmulleq.s16','vqdmullne.s16','vqdmullcs.s16','vqdmullhs.s16','vqdmullcc.s16','vqdmulllo.s16','vqdmullmi.s16','vqdmullpl.s16','vqdmullvs.s16','vqdmullvc.s16','vqdmullhi.s16','vqdmullls.s16','vqdmullge.s16','vqdmulllt.s16','vqdmullgt.s16','vqdmullle.s16',
+ 'vqdmulleq.s32','vqdmullne.s32','vqdmullcs.s32','vqdmullhs.s32','vqdmullcc.s32','vqdmulllo.s32','vqdmullmi.s32','vqdmullpl.s32','vqdmullvs.s32','vqdmullvc.s32','vqdmullhi.s32','vqdmullls.s32','vqdmullge.s32','vqdmulllt.s32','vqdmullgt.s32','vqdmullle.s32',
+
+ 'vqmovneq.s16','vqmovnne.s16','vqmovncs.s16','vqmovnhs.s16','vqmovncc.s16','vqmovnlo.s16','vqmovnmi.s16','vqmovnpl.s16','vqmovnvs.s16','vqmovnvc.s16','vqmovnhi.s16','vqmovnls.s16','vqmovnge.s16','vqmovnlt.s16','vqmovngt.s16','vqmovnle.s16',
+ 'vqmovneq.s32','vqmovnne.s32','vqmovncs.s32','vqmovnhs.s32','vqmovncc.s32','vqmovnlo.s32','vqmovnmi.s32','vqmovnpl.s32','vqmovnvs.s32','vqmovnvc.s32','vqmovnhi.s32','vqmovnls.s32','vqmovnge.s32','vqmovnlt.s32','vqmovngt.s32','vqmovnle.s32',
+ 'vqmovneq.s64','vqmovnne.s64','vqmovncs.s64','vqmovnhs.s64','vqmovncc.s64','vqmovnlo.s64','vqmovnmi.s64','vqmovnpl.s64','vqmovnvs.s64','vqmovnvc.s64','vqmovnhi.s64','vqmovnls.s64','vqmovnge.s64','vqmovnlt.s64','vqmovngt.s64','vqmovnle.s64',
+
+ 'vqmovuneq.s16','vqmovunne.s16','vqmovuncs.s16','vqmovunhs.s16','vqmovuncc.s16','vqmovunlo.s16','vqmovunmi.s16','vqmovunpl.s16','vqmovunvs.s16','vqmovunvc.s16','vqmovunhi.s16','vqmovunls.s16','vqmovunge.s16','vqmovunlt.s16','vqmovungt.s16','vqmovunle.s16',
+ 'vqmovuneq.s32','vqmovunne.s32','vqmovuncs.s32','vqmovunhs.s32','vqmovuncc.s32','vqmovunlo.s32','vqmovunmi.s32','vqmovunpl.s32','vqmovunvs.s32','vqmovunvc.s32','vqmovunhi.s32','vqmovunls.s32','vqmovunge.s32','vqmovunlt.s32','vqmovungt.s32','vqmovunle.s32',
+ 'vqmovuneq.s64','vqmovunne.s64','vqmovuncs.s64','vqmovunhs.s64','vqmovuncc.s64','vqmovunlo.s64','vqmovunmi.s64','vqmovunpl.s64','vqmovunvs.s64','vqmovunvc.s64','vqmovunhi.s64','vqmovunls.s64','vqmovunge.s64','vqmovunlt.s64','vqmovungt.s64','vqmovunle.s64',
+
+ 'vqnegeq.s8','vqnegne.s8','vqnegcs.s8','vqneghs.s8','vqnegcc.s8','vqneglo.s8','vqnegmi.s8','vqnegpl.s8','vqnegvs.s8','vqnegvc.s8','vqneghi.s8','vqnegls.s8','vqnegge.s8','vqneglt.s8','vqneggt.s8','vqnegle.s8',
+ 'vqnegeq.s16','vqnegne.s16','vqnegcs.s16','vqneghs.s16','vqnegcc.s16','vqneglo.s16','vqnegmi.s16','vqnegpl.s16','vqnegvs.s16','vqnegvc.s16','vqneghi.s16','vqnegls.s16','vqnegge.s16','vqneglt.s16','vqneggt.s16','vqnegle.s16',
+ 'vqnegeq.s32','vqnegne.s32','vqnegcs.s32','vqneghs.s32','vqnegcc.s32','vqneglo.s32','vqnegmi.s32','vqnegpl.s32','vqnegvs.s32','vqnegvc.s32','vqneghi.s32','vqnegls.s32','vqnegge.s32','vqneglt.s32','vqneggt.s32','vqnegle.s32',
+
+ 'vqrdmulheq.s16','vqrdmulhne.s16','vqrdmulhcs.s16','vqrdmulhhs.s16','vqrdmulhcc.s16','vqrdmulhlo.s16','vqrdmulhmi.s16','vqrdmulhpl.s16','vqrdmulhvs.s16','vqrdmulhvc.s16','vqrdmulhhi.s16','vqrdmulhls.s16','vqrdmulhge.s16','vqrdmulhlt.s16','vqrdmulhgt.s16','vqrdmulhle.s16',
+ 'vqrdmulheq.s32','vqrdmulhne.s32','vqrdmulhcs.s32','vqrdmulhhs.s32','vqrdmulhcc.s32','vqrdmulhlo.s32','vqrdmulhmi.s32','vqrdmulhpl.s32','vqrdmulhvs.s32','vqrdmulhvc.s32','vqrdmulhhi.s32','vqrdmulhls.s32','vqrdmulhge.s32','vqrdmulhlt.s32','vqrdmulhgt.s32','vqrdmulhle.s32',
+
+ 'vqrshleq.s8','vqrshlne.s8','vqrshlcs.s8','vqrshlhs.s8','vqrshlcc.s8','vqrshllo.s8','vqrshlmi.s8','vqrshlpl.s8','vqrshlvs.s8','vqrshlvc.s8','vqrshlhi.s8','vqrshlls.s8','vqrshlge.s8','vqrshllt.s8','vqrshlgt.s8','vqrshlle.s8',
+ 'vqrshleq.s16','vqrshlne.s16','vqrshlcs.s16','vqrshlhs.s16','vqrshlcc.s16','vqrshllo.s16','vqrshlmi.s16','vqrshlpl.s16','vqrshlvs.s16','vqrshlvc.s16','vqrshlhi.s16','vqrshlls.s16','vqrshlge.s16','vqrshllt.s16','vqrshlgt.s16','vqrshlle.s16',
+ 'vqrshleq.s32','vqrshlne.s32','vqrshlcs.s32','vqrshlhs.s32','vqrshlcc.s32','vqrshllo.s32','vqrshlmi.s32','vqrshlpl.s32','vqrshlvs.s32','vqrshlvc.s32','vqrshlhi.s32','vqrshlls.s32','vqrshlge.s32','vqrshllt.s32','vqrshlgt.s32','vqrshlle.s32',
+ 'vqrshleq.s64','vqrshlne.s64','vqrshlcs.s64','vqrshlhs.s64','vqrshlcc.s64','vqrshllo.s64','vqrshlmi.s64','vqrshlpl.s64','vqrshlvs.s64','vqrshlvc.s64','vqrshlhi.s64','vqrshlls.s64','vqrshlge.s64','vqrshllt.s64','vqrshlgt.s64','vqrshlle.s64',
+
+ 'vqrshrneq.s16','vqrshrnne.s16','vqrshrncs.s16','vqrshrnhs.s16','vqrshrncc.s16','vqrshrnlo.s16','vqrshrnmi.s16','vqrshrnpl.s16','vqrshrnvs.s16','vqrshrnvc.s16','vqrshrnhi.s16','vqrshrnls.s16','vqrshrnge.s16','vqrshrnlt.s16','vqrshrngt.s16','vqrshrnle.s16',
+ 'vqrshrneq.s32','vqrshrnne.s32','vqrshrncs.s32','vqrshrnhs.s32','vqrshrncc.s32','vqrshrnlo.s32','vqrshrnmi.s32','vqrshrnpl.s32','vqrshrnvs.s32','vqrshrnvc.s32','vqrshrnhi.s32','vqrshrnls.s32','vqrshrnge.s32','vqrshrnlt.s32','vqrshrngt.s32','vqrshrnle.s32',
+ 'vqrshrneq.s64','vqrshrnne.s64','vqrshrncs.s64','vqrshrnhs.s64','vqrshrncc.s64','vqrshrnlo.s64','vqrshrnmi.s64','vqrshrnpl.s64','vqrshrnvs.s64','vqrshrnvc.s64','vqrshrnhi.s64','vqrshrnls.s64','vqrshrnge.s64','vqrshrnlt.s64','vqrshrngt.s64','vqrshrnle.s64',
+
+ 'vqrshruneq.s16','vqrshrunne.s16','vqrshruncs.s16','vqrshrunhs.s16','vqrshruncc.s16','vqrshrunlo.s16','vqrshrunmi.s16','vqrshrunpl.s16','vqrshrunvs.s16','vqrshrunvc.s16','vqrshrunhi.s16','vqrshrunls.s16','vqrshrunge.s16','vqrshrunlt.s16','vqrshrungt.s16','vqrshrunle.s16',
+ 'vqrshruneq.s32','vqrshrunne.s32','vqrshruncs.s32','vqrshrunhs.s32','vqrshruncc.s32','vqrshrunlo.s32','vqrshrunmi.s32','vqrshrunpl.s32','vqrshrunvs.s32','vqrshrunvc.s32','vqrshrunhi.s32','vqrshrunls.s32','vqrshrunge.s32','vqrshrunlt.s32','vqrshrungt.s32','vqrshrunle.s32',
+ 'vqrshruneq.s64','vqrshrunne.s64','vqrshruncs.s64','vqrshrunhs.s64','vqrshruncc.s64','vqrshrunlo.s64','vqrshrunmi.s64','vqrshrunpl.s64','vqrshrunvs.s64','vqrshrunvc.s64','vqrshrunhi.s64','vqrshrunls.s64','vqrshrunge.s64','vqrshrunlt.s64','vqrshrungt.s64','vqrshrunle.s64',
+
+ 'vqshleq.s8','vqshlne.s8','vqshlcs.s8','vqshlhs.s8','vqshlcc.s8','vqshllo.s8','vqshlmi.s8','vqshlpl.s8','vqshlvs.s8','vqshlvc.s8','vqshlhi.s8','vqshlls.s8','vqshlge.s8','vqshllt.s8','vqshlgt.s8','vqshlle.s8',
+ 'vqshleq.s16','vqshlne.s16','vqshlcs.s16','vqshlhs.s16','vqshlcc.s16','vqshllo.s16','vqshlmi.s16','vqshlpl.s16','vqshlvs.s16','vqshlvc.s16','vqshlhi.s16','vqshlls.s16','vqshlge.s16','vqshllt.s16','vqshlgt.s16','vqshlle.s16',
+ 'vqshleq.s32','vqshlne.s32','vqshlcs.s32','vqshlhs.s32','vqshlcc.s32','vqshllo.s32','vqshlmi.s32','vqshlpl.s32','vqshlvs.s32','vqshlvc.s32','vqshlhi.s32','vqshlls.s32','vqshlge.s32','vqshllt.s32','vqshlgt.s32','vqshlle.s32',
+ 'vqshleq.s64','vqshlne.s64','vqshlcs.s64','vqshlhs.s64','vqshlcc.s64','vqshllo.s64','vqshlmi.s64','vqshlpl.s64','vqshlvs.s64','vqshlvc.s64','vqshlhi.s64','vqshlls.s64','vqshlge.s64','vqshllt.s64','vqshlgt.s64','vqshlle.s64',
+
+ 'vqshlueq.s8','vqshlune.s8','vqshlucs.s8','vqshluhs.s8','vqshlucc.s8','vqshlulo.s8','vqshlumi.s8','vqshlupl.s8','vqshluvs.s8','vqshluvc.s8','vqshluhi.s8','vqshluls.s8','vqshluge.s8','vqshlult.s8','vqshlugt.s8','vqshlule.s8',
+ 'vqshlueq.s16','vqshlune.s16','vqshlucs.s16','vqshluhs.s16','vqshlucc.s16','vqshlulo.s16','vqshlumi.s16','vqshlupl.s16','vqshluvs.s16','vqshluvc.s16','vqshluhi.s16','vqshluls.s16','vqshluge.s16','vqshlult.s16','vqshlugt.s16','vqshlule.s16',
+ 'vqshlueq.s32','vqshlune.s32','vqshlucs.s32','vqshluhs.s32','vqshlucc.s32','vqshlulo.s32','vqshlumi.s32','vqshlupl.s32','vqshluvs.s32','vqshluvc.s32','vqshluhi.s32','vqshluls.s32','vqshluge.s32','vqshlult.s32','vqshlugt.s32','vqshlule.s32',
+ 'vqshlueq.s64','vqshlune.s64','vqshlucs.s64','vqshluhs.s64','vqshlucc.s64','vqshlulo.s64','vqshlumi.s64','vqshlupl.s64','vqshluvs.s64','vqshluvc.s64','vqshluhi.s64','vqshluls.s64','vqshluge.s64','vqshlult.s64','vqshlugt.s64','vqshlule.s64',
+
+ 'vqshrneq.s16','vqshrnne.s16','vqshrncs.s16','vqshrnhs.s16','vqshrncc.s16','vqshrnlo.s16','vqshrnmi.s16','vqshrnpl.s16','vqshrnvs.s16','vqshrnvc.s16','vqshrnhi.s16','vqshrnls.s16','vqshrnge.s16','vqshrnlt.s16','vqshrngt.s16','vqshrnle.s16',
+ 'vqshrneq.s32','vqshrnne.s32','vqshrncs.s32','vqshrnhs.s32','vqshrncc.s32','vqshrnlo.s32','vqshrnmi.s32','vqshrnpl.s32','vqshrnvs.s32','vqshrnvc.s32','vqshrnhi.s32','vqshrnls.s32','vqshrnge.s32','vqshrnlt.s32','vqshrngt.s32','vqshrnle.s32',
+ 'vqshrneq.s64','vqshrnne.s64','vqshrncs.s64','vqshrnhs.s64','vqshrncc.s64','vqshrnlo.s64','vqshrnmi.s64','vqshrnpl.s64','vqshrnvs.s64','vqshrnvc.s64','vqshrnhi.s64','vqshrnls.s64','vqshrnge.s64','vqshrnlt.s64','vqshrngt.s64','vqshrnle.s64',
+
+ 'vqshruneq.s16','vqshrunne.s16','vqshruncs.s16','vqshrunhs.s16','vqshruncc.s16','vqshrunlo.s16','vqshrunmi.s16','vqshrunpl.s16','vqshrunvs.s16','vqshrunvc.s16','vqshrunhi.s16','vqshrunls.s16','vqshrunge.s16','vqshrunlt.s16','vqshrungt.s16','vqshrunle.s16',
+ 'vqshruneq.s32','vqshrunne.s32','vqshruncs.s32','vqshrunhs.s32','vqshruncc.s32','vqshrunlo.s32','vqshrunmi.s32','vqshrunpl.s32','vqshrunvs.s32','vqshrunvc.s32','vqshrunhi.s32','vqshrunls.s32','vqshrunge.s32','vqshrunlt.s32','vqshrungt.s32','vqshrunle.s32',
+ 'vqshruneq.s64','vqshrunne.s64','vqshruncs.s64','vqshrunhs.s64','vqshruncc.s64','vqshrunlo.s64','vqshrunmi.s64','vqshrunpl.s64','vqshrunvs.s64','vqshrunvc.s64','vqshrunhi.s64','vqshrunls.s64','vqshrunge.s64','vqshrunlt.s64','vqshrungt.s64','vqshrunle.s64',
+
+ 'vqsubeq.s8','vqsubne.s8','vqsubcs.s8','vqsubhs.s8','vqsubcc.s8','vqsublo.s8','vqsubmi.s8','vqsubpl.s8','vqsubvs.s8','vqsubvc.s8','vqsubhi.s8','vqsubls.s8','vqsubge.s8','vqsublt.s8','vqsubgt.s8','vqsuble.s8',
+ 'vqsubeq.s16','vqsubne.s16','vqsubcs.s16','vqsubhs.s16','vqsubcc.s16','vqsublo.s16','vqsubmi.s16','vqsubpl.s16','vqsubvs.s16','vqsubvc.s16','vqsubhi.s16','vqsubls.s16','vqsubge.s16','vqsublt.s16','vqsubgt.s16','vqsuble.s16',
+ 'vqsubeq.s32','vqsubne.s32','vqsubcs.s32','vqsubhs.s32','vqsubcc.s32','vqsublo.s32','vqsubmi.s32','vqsubpl.s32','vqsubvs.s32','vqsubvc.s32','vqsubhi.s32','vqsubls.s32','vqsubge.s32','vqsublt.s32','vqsubgt.s32','vqsuble.s32',
+ 'vqsubeq.s64','vqsubne.s64','vqsubcs.s64','vqsubhs.s64','vqsubcc.s64','vqsublo.s64','vqsubmi.s64','vqsubpl.s64','vqsubvs.s64','vqsubvc.s64','vqsubhi.s64','vqsubls.s64','vqsubge.s64','vqsublt.s64','vqsubgt.s64','vqsuble.s64',
+
+ 'vrhaddeq.s8','vrhaddne.s8','vrhaddcs.s8','vrhaddhs.s8','vrhaddcc.s8','vrhaddlo.s8','vrhaddmi.s8','vrhaddpl.s8','vrhaddvs.s8','vrhaddvc.s8','vrhaddhi.s8','vrhaddls.s8','vrhaddge.s8','vrhaddlt.s8','vrhaddgt.s8','vrhaddle.s8',
+ 'vrhaddeq.s16','vrhaddne.s16','vrhaddcs.s16','vrhaddhs.s16','vrhaddcc.s16','vrhaddlo.s16','vrhaddmi.s16','vrhaddpl.s16','vrhaddvs.s16','vrhaddvc.s16','vrhaddhi.s16','vrhaddls.s16','vrhaddge.s16','vrhaddlt.s16','vrhaddgt.s16','vrhaddle.s16',
+ 'vrhaddeq.s32','vrhaddne.s32','vrhaddcs.s32','vrhaddhs.s32','vrhaddcc.s32','vrhaddlo.s32','vrhaddmi.s32','vrhaddpl.s32','vrhaddvs.s32','vrhaddvc.s32','vrhaddhi.s32','vrhaddls.s32','vrhaddge.s32','vrhaddlt.s32','vrhaddgt.s32','vrhaddle.s32',
+
+ 'vrshleq.s8','vrshlne.s8','vrshlcs.s8','vrshlhs.s8','vrshlcc.s8','vrshllo.s8','vrshlmi.s8','vrshlpl.s8','vrshlvs.s8','vrshlvc.s8','vrshlhi.s8','vrshlls.s8','vrshlge.s8','vrshllt.s8','vrshlgt.s8','vrshlle.s8',
+ 'vrshleq.s16','vrshlne.s16','vrshlcs.s16','vrshlhs.s16','vrshlcc.s16','vrshllo.s16','vrshlmi.s16','vrshlpl.s16','vrshlvs.s16','vrshlvc.s16','vrshlhi.s16','vrshlls.s16','vrshlge.s16','vrshllt.s16','vrshlgt.s16','vrshlle.s16',
+ 'vrshleq.s32','vrshlne.s32','vrshlcs.s32','vrshlhs.s32','vrshlcc.s32','vrshllo.s32','vrshlmi.s32','vrshlpl.s32','vrshlvs.s32','vrshlvc.s32','vrshlhi.s32','vrshlls.s32','vrshlge.s32','vrshllt.s32','vrshlgt.s32','vrshlle.s32',
+ 'vrshleq.s64','vrshlne.s64','vrshlcs.s64','vrshlhs.s64','vrshlcc.s64','vrshllo.s64','vrshlmi.s64','vrshlpl.s64','vrshlvs.s64','vrshlvc.s64','vrshlhi.s64','vrshlls.s64','vrshlge.s64','vrshllt.s64','vrshlgt.s64','vrshlle.s64',
+
+ 'vrshreq.s8','vrshrne.s8','vrshrcs.s8','vrshrhs.s8','vrshrcc.s8','vrshrlo.s8','vrshrmi.s8','vrshrpl.s8','vrshrvs.s8','vrshrvc.s8','vrshrhi.s8','vrshrls.s8','vrshrge.s8','vrshrlt.s8','vrshrgt.s8','vrshrle.s8',
+ 'vrshreq.s16','vrshrne.s16','vrshrcs.s16','vrshrhs.s16','vrshrcc.s16','vrshrlo.s16','vrshrmi.s16','vrshrpl.s16','vrshrvs.s16','vrshrvc.s16','vrshrhi.s16','vrshrls.s16','vrshrge.s16','vrshrlt.s16','vrshrgt.s16','vrshrle.s16',
+ 'vrshreq.s32','vrshrne.s32','vrshrcs.s32','vrshrhs.s32','vrshrcc.s32','vrshrlo.s32','vrshrmi.s32','vrshrpl.s32','vrshrvs.s32','vrshrvc.s32','vrshrhi.s32','vrshrls.s32','vrshrge.s32','vrshrlt.s32','vrshrgt.s32','vrshrle.s32',
+ 'vrshreq.s64','vrshrne.s64','vrshrcs.s64','vrshrhs.s64','vrshrcc.s64','vrshrlo.s64','vrshrmi.s64','vrshrpl.s64','vrshrvs.s64','vrshrvc.s64','vrshrhi.s64','vrshrls.s64','vrshrge.s64','vrshrlt.s64','vrshrgt.s64','vrshrle.s64',
+
+ 'vrsraeq.s8','vrsrane.s8','vrsracs.s8','vrsrahs.s8','vrsracc.s8','vrsralo.s8','vrsrami.s8','vrsrapl.s8','vrsravs.s8','vrsravc.s8','vrsrahi.s8','vrsrals.s8','vrsrage.s8','vrsralt.s8','vrsragt.s8','vrsrale.s8',
+ 'vrsraeq.s16','vrsrane.s16','vrsracs.s16','vrsrahs.s16','vrsracc.s16','vrsralo.s16','vrsrami.s16','vrsrapl.s16','vrsravs.s16','vrsravc.s16','vrsrahi.s16','vrsrals.s16','vrsrage.s16','vrsralt.s16','vrsragt.s16','vrsrale.s16',
+ 'vrsraeq.s32','vrsrane.s32','vrsracs.s32','vrsrahs.s32','vrsracc.s32','vrsralo.s32','vrsrami.s32','vrsrapl.s32','vrsravs.s32','vrsravc.s32','vrsrahi.s32','vrsrals.s32','vrsrage.s32','vrsralt.s32','vrsragt.s32','vrsrale.s32',
+ 'vrsraeq.s64','vrsrane.s64','vrsracs.s64','vrsrahs.s64','vrsracc.s64','vrsralo.s64','vrsrami.s64','vrsrapl.s64','vrsravs.s64','vrsravc.s64','vrsrahi.s64','vrsrals.s64','vrsrage.s64','vrsralt.s64','vrsragt.s64','vrsrale.s64',
+
+ 'vshleq.s8','vshlne.s8','vshlcs.s8','vshlhs.s8','vshlcc.s8','vshllo.s8','vshlmi.s8','vshlpl.s8','vshlvs.s8','vshlvc.s8','vshlhi.s8','vshlls.s8','vshlge.s8','vshllt.s8','vshlgt.s8','vshlle.s8',
+ 'vshleq.s16','vshlne.s16','vshlcs.s16','vshlhs.s16','vshlcc.s16','vshllo.s16','vshlmi.s16','vshlpl.s16','vshlvs.s16','vshlvc.s16','vshlhi.s16','vshlls.s16','vshlge.s16','vshllt.s16','vshlgt.s16','vshlle.s16',
+ 'vshleq.s32','vshlne.s32','vshlcs.s32','vshlhs.s32','vshlcc.s32','vshllo.s32','vshlmi.s32','vshlpl.s32','vshlvs.s32','vshlvc.s32','vshlhi.s32','vshlls.s32','vshlge.s32','vshllt.s32','vshlgt.s32','vshlle.s32',
+ 'vshleq.s64','vshlne.s64','vshlcs.s64','vshlhs.s64','vshlcc.s64','vshllo.s64','vshlmi.s64','vshlpl.s64','vshlvs.s64','vshlvc.s64','vshlhi.s64','vshlls.s64','vshlge.s64','vshllt.s64','vshlgt.s64','vshlle.s64',
+
+ 'vshlleq.s8','vshllne.s8','vshllcs.s8','vshllhs.s8','vshllcc.s8','vshlllo.s8','vshllmi.s8','vshllpl.s8','vshllvs.s8','vshllvc.s8','vshllhi.s8','vshllls.s8','vshllge.s8','vshlllt.s8','vshllgt.s8','vshllle.s8',
+ 'vshlleq.s16','vshllne.s16','vshllcs.s16','vshllhs.s16','vshllcc.s16','vshlllo.s16','vshllmi.s16','vshllpl.s16','vshllvs.s16','vshllvc.s16','vshllhi.s16','vshllls.s16','vshllge.s16','vshlllt.s16','vshllgt.s16','vshllle.s16',
+ 'vshlleq.s32','vshllne.s32','vshllcs.s32','vshllhs.s32','vshllcc.s32','vshlllo.s32','vshllmi.s32','vshllpl.s32','vshllvs.s32','vshllvc.s32','vshllhi.s32','vshllls.s32','vshllge.s32','vshlllt.s32','vshllgt.s32','vshllle.s32',
+
+ 'vshreq.s8','vshrne.s8','vshrcs.s8','vshrhs.s8','vshrcc.s8','vshrlo.s8','vshrmi.s8','vshrpl.s8','vshrvs.s8','vshrvc.s8','vshrhi.s8','vshrls.s8','vshrge.s8','vshrlt.s8','vshrgt.s8','vshrle.s8',
+ 'vshreq.s16','vshrne.s16','vshrcs.s16','vshrhs.s16','vshrcc.s16','vshrlo.s16','vshrmi.s16','vshrpl.s16','vshrvs.s16','vshrvc.s16','vshrhi.s16','vshrls.s16','vshrge.s16','vshrlt.s16','vshrgt.s16','vshrle.s16',
+ 'vshreq.s32','vshrne.s32','vshrcs.s32','vshrhs.s32','vshrcc.s32','vshrlo.s32','vshrmi.s32','vshrpl.s32','vshrvs.s32','vshrvc.s32','vshrhi.s32','vshrls.s32','vshrge.s32','vshrlt.s32','vshrgt.s32','vshrle.s32',
+ 'vshreq.s64','vshrne.s64','vshrcs.s64','vshrhs.s64','vshrcc.s64','vshrlo.s64','vshrmi.s64','vshrpl.s64','vshrvs.s64','vshrvc.s64','vshrhi.s64','vshrls.s64','vshrge.s64','vshrlt.s64','vshrgt.s64','vshrle.s64',
+
+ 'vsraeq.s8','vsrane.s8','vsracs.s8','vsrahs.s8','vsracc.s8','vsralo.s8','vsrami.s8','vsrapl.s8','vsravs.s8','vsravc.s8','vsrahi.s8','vsrals.s8','vsrage.s8','vsralt.s8','vsragt.s8','vsrale.s8',
+ 'vsraeq.s16','vsrane.s16','vsracs.s16','vsrahs.s16','vsracc.s16','vsralo.s16','vsrami.s16','vsrapl.s16','vsravs.s16','vsravc.s16','vsrahi.s16','vsrals.s16','vsrage.s16','vsralt.s16','vsragt.s16','vsrale.s16',
+ 'vsraeq.s32','vsrane.s32','vsracs.s32','vsrahs.s32','vsracc.s32','vsralo.s32','vsrami.s32','vsrapl.s32','vsravs.s32','vsravc.s32','vsrahi.s32','vsrals.s32','vsrage.s32','vsralt.s32','vsragt.s32','vsrale.s32',
+ 'vsraeq.s64','vsrane.s64','vsracs.s64','vsrahs.s64','vsracc.s64','vsralo.s64','vsrami.s64','vsrapl.s64','vsravs.s64','vsravc.s64','vsrahi.s64','vsrals.s64','vsrage.s64','vsralt.s64','vsragt.s64','vsrale.s64',
+
+ 'vsubleq.s8','vsublne.s8','vsublcs.s8','vsublhs.s8','vsublcc.s8','vsubllo.s8','vsublmi.s8','vsublpl.s8','vsublvs.s8','vsublvc.s8','vsublhi.s8','vsublls.s8','vsublge.s8','vsubllt.s8','vsublgt.s8','vsublle.s8',
+ 'vsubleq.s16','vsublne.s16','vsublcs.s16','vsublhs.s16','vsublcc.s16','vsubllo.s16','vsublmi.s16','vsublpl.s16','vsublvs.s16','vsublvc.s16','vsublhi.s16','vsublls.s16','vsublge.s16','vsubllt.s16','vsublgt.s16','vsublle.s16',
+ 'vsubleq.s32','vsublne.s32','vsublcs.s32','vsublhs.s32','vsublcc.s32','vsubllo.s32','vsublmi.s32','vsublpl.s32','vsublvs.s32','vsublvc.s32','vsublhi.s32','vsublls.s32','vsublge.s32','vsubllt.s32','vsublgt.s32','vsublle.s32',
+
+ 'vsubheq.s8','vsubhne.s8','vsubhcs.s8','vsubhhs.s8','vsubhcc.s8','vsubhlo.s8','vsubhmi.s8','vsubhpl.s8','vsubhvs.s8','vsubhvc.s8','vsubhhi.s8','vsubhls.s8','vsubhge.s8','vsubhlt.s8','vsubhgt.s8','vsubhle.s8',
+ 'vsubheq.s16','vsubhne.s16','vsubhcs.s16','vsubhhs.s16','vsubhcc.s16','vsubhlo.s16','vsubhmi.s16','vsubhpl.s16','vsubhvs.s16','vsubhvc.s16','vsubhhi.s16','vsubhls.s16','vsubhge.s16','vsubhlt.s16','vsubhgt.s16','vsubhle.s16',
+ 'vsubheq.s32','vsubhne.s32','vsubhcs.s32','vsubhhs.s32','vsubhcc.s32','vsubhlo.s32','vsubhmi.s32','vsubhpl.s32','vsubhvs.s32','vsubhvc.s32','vsubhhi.s32','vsubhls.s32','vsubhge.s32','vsubhlt.s32','vsubhgt.s32','vsubhle.s32'
+ ),
+ /* Conditional NEON SIMD Unsigned Integer Instructions */
+ 33 => array(
+ 'vabaeq.u8','vabane.u8','vabacs.u8','vabahs.u8','vabacc.u8','vabalo.u8','vabami.u8','vabapl.u8','vabavs.u8','vabavc.u8','vabahi.u8','vabals.u8','vabage.u8','vabalt.u8','vabagt.u8','vabale.u8',
+ 'vabaeq.u16','vabane.u16','vabacs.u16','vabahs.u16','vabacc.u16','vabalo.u16','vabami.u16','vabapl.u16','vabavs.u16','vabavc.u16','vabahi.u16','vabals.u16','vabage.u16','vabalt.u16','vabagt.u16','vabale.u16',
+ 'vabaeq.u32','vabane.u32','vabacs.u32','vabahs.u32','vabacc.u32','vabalo.u32','vabami.u32','vabapl.u32','vabavs.u32','vabavc.u32','vabahi.u32','vabals.u32','vabage.u32','vabalt.u32','vabagt.u32','vabale.u32',
+
+ 'vabaleq.u8','vabalne.u8','vabalcs.u8','vabalhs.u8','vabalcc.u8','vaballo.u8','vabalmi.u8','vabalpl.u8','vabalvs.u8','vabalvc.u8','vabalhi.u8','vaballs.u8','vabalge.u8','vaballt.u8','vabalgt.u8','vaballe.u8',
+ 'vabaleq.u16','vabalne.u16','vabalcs.u16','vabalhs.u16','vabalcc.u16','vaballo.u16','vabalmi.u16','vabalpl.u16','vabalvs.u16','vabalvc.u16','vabalhi.u16','vaballs.u16','vabalge.u16','vaballt.u16','vabalgt.u16','vaballe.u16',
+ 'vabaleq.u32','vabalne.u32','vabalcs.u32','vabalhs.u32','vabalcc.u32','vaballo.u32','vabalmi.u32','vabalpl.u32','vabalvs.u32','vabalvc.u32','vabalhi.u32','vaballs.u32','vabalge.u32','vaballt.u32','vabalgt.u32','vaballe.u32',
+
+ 'vabdeq.u8','vabdne.u8','vabdcs.u8','vabdhs.u8','vabdcc.u8','vabdlo.u8','vabdmi.u8','vabdpl.u8','vabdvs.u8','vabdvc.u8','vabdhi.u8','vabdls.u8','vabdge.u8','vabdlt.u8','vabdgt.u8','vabdle.u8',
+ 'vabdeq.u16','vabdne.u16','vabdcs.u16','vabdhs.u16','vabdcc.u16','vabdlo.u16','vabdmi.u16','vabdpl.u16','vabdvs.u16','vabdvc.u16','vabdhi.u16','vabdls.u16','vabdge.u16','vabdlt.u16','vabdgt.u16','vabdle.u16',
+ 'vabdeq.u32','vabdne.u32','vabdcs.u32','vabdhs.u32','vabdcc.u32','vabdlo.u32','vabdmi.u32','vabdpl.u32','vabdvs.u32','vabdvc.u32','vabdhi.u32','vabdls.u32','vabdge.u32','vabdlt.u32','vabdgt.u32','vabdle.u32',
+
+ 'vaddleq.u8','vaddlne.u8','vaddlcs.u8','vaddlhs.u8','vaddlcc.u8','vaddllo.u8','vaddlmi.u8','vaddlpl.u8','vaddlvs.u8','vaddlvc.u8','vaddlhi.u8','vaddlls.u8','vaddlge.u8','vaddllt.u8','vaddlgt.u8','vaddlle.u8',
+ 'vaddleq.u16','vaddlne.u16','vaddlcs.u16','vaddlhs.u16','vaddlcc.u16','vaddllo.u16','vaddlmi.u16','vaddlpl.u16','vaddlvs.u16','vaddlvc.u16','vaddlhi.u16','vaddlls.u16','vaddlge.u16','vaddllt.u16','vaddlgt.u16','vaddlle.u16',
+ 'vaddleq.u32','vaddlne.u32','vaddlcs.u32','vaddlhs.u32','vaddlcc.u32','vaddllo.u32','vaddlmi.u32','vaddlpl.u32','vaddlvs.u32','vaddlvc.u32','vaddlhi.u32','vaddlls.u32','vaddlge.u32','vaddllt.u32','vaddlgt.u32','vaddlle.u32',
+
+ 'vsubleq.u8','vsublne.u8','vsublcs.u8','vsublhs.u8','vsublcc.u8','vsubllo.u8','vsublmi.u8','vsublpl.u8','vsublvs.u8','vsublvc.u8','vsublhi.u8','vsublls.u8','vsublge.u8','vsubllt.u8','vsublgt.u8','vsublle.u8',
+ 'vsubleq.u16','vsublne.u16','vsublcs.u16','vsublhs.u16','vsublcc.u16','vsubllo.u16','vsublmi.u16','vsublpl.u16','vsublvs.u16','vsublvc.u16','vsublhi.u16','vsublls.u16','vsublge.u16','vsubllt.u16','vsublgt.u16','vsublle.u16',
+ 'vsubleq.u32','vsublne.u32','vsublcs.u32','vsublhs.u32','vsublcc.u32','vsubllo.u32','vsublmi.u32','vsublpl.u32','vsublvs.u32','vsublvc.u32','vsublhi.u32','vsublls.u32','vsublge.u32','vsubllt.u32','vsublgt.u32','vsublle.u32',
+
+ 'vaddweq.u8','vaddwne.u8','vaddwcs.u8','vaddwhs.u8','vaddwcc.u8','vaddwlo.u8','vaddwmi.u8','vaddwpl.u8','vaddwvs.u8','vaddwvc.u8','vaddwhi.u8','vaddwls.u8','vaddwge.u8','vaddwlt.u8','vaddwgt.u8','vaddwle.u8',
+ 'vaddweq.u16','vaddwne.u16','vaddwcs.u16','vaddwhs.u16','vaddwcc.u16','vaddwlo.u16','vaddwmi.u16','vaddwpl.u16','vaddwvs.u16','vaddwvc.u16','vaddwhi.u16','vaddwls.u16','vaddwge.u16','vaddwlt.u16','vaddwgt.u16','vaddwle.u16',
+ 'vaddweq.u32','vaddwne.u32','vaddwcs.u32','vaddwhs.u32','vaddwcc.u32','vaddwlo.u32','vaddwmi.u32','vaddwpl.u32','vaddwvs.u32','vaddwvc.u32','vaddwhi.u32','vaddwls.u32','vaddwge.u32','vaddwlt.u32','vaddwgt.u32','vaddwle.u32',
+
+ 'vsubheq.u8','vsubhne.u8','vsubhcs.u8','vsubhhs.u8','vsubhcc.u8','vsubhlo.u8','vsubhmi.u8','vsubhpl.u8','vsubhvs.u8','vsubhvc.u8','vsubhhi.u8','vsubhls.u8','vsubhge.u8','vsubhlt.u8','vsubhgt.u8','vsubhle.u8',
+ 'vsubheq.u16','vsubhne.u16','vsubhcs.u16','vsubhhs.u16','vsubhcc.u16','vsubhlo.u16','vsubhmi.u16','vsubhpl.u16','vsubhvs.u16','vsubhvc.u16','vsubhhi.u16','vsubhls.u16','vsubhge.u16','vsubhlt.u16','vsubhgt.u16','vsubhle.u16',
+ 'vsubheq.u32','vsubhne.u32','vsubhcs.u32','vsubhhs.u32','vsubhcc.u32','vsubhlo.u32','vsubhmi.u32','vsubhpl.u32','vsubhvs.u32','vsubhvc.u32','vsubhhi.u32','vsubhls.u32','vsubhge.u32','vsubhlt.u32','vsubhgt.u32','vsubhle.u32',
+
+ 'vhaddeq.u8','vhaddne.u8','vhaddcs.u8','vhaddhs.u8','vhaddcc.u8','vhaddlo.u8','vhaddmi.u8','vhaddpl.u8','vhaddvs.u8','vhaddvc.u8','vhaddhi.u8','vhaddls.u8','vhaddge.u8','vhaddlt.u8','vhaddgt.u8','vhaddle.u8',
+ 'vhaddeq.u16','vhaddne.u16','vhaddcs.u16','vhaddhs.u16','vhaddcc.u16','vhaddlo.u16','vhaddmi.u16','vhaddpl.u16','vhaddvs.u16','vhaddvc.u16','vhaddhi.u16','vhaddls.u16','vhaddge.u16','vhaddlt.u16','vhaddgt.u16','vhaddle.u16',
+ 'vhaddeq.u32','vhaddne.u32','vhaddcs.u32','vhaddhs.u32','vhaddcc.u32','vhaddlo.u32','vhaddmi.u32','vhaddpl.u32','vhaddvs.u32','vhaddvc.u32','vhaddhi.u32','vhaddls.u32','vhaddge.u32','vhaddlt.u32','vhaddgt.u32','vhaddle.u32',
+
+ 'vhsubeq.u8','vhsubne.u8','vhsubcs.u8','vhsubhs.u8','vhsubcc.u8','vhsublo.u8','vhsubmi.u8','vhsubpl.u8','vhsubvs.u8','vhsubvc.u8','vhsubhi.u8','vhsubls.u8','vhsubge.u8','vhsublt.u8','vhsubgt.u8','vhsuble.u8',
+ 'vhsubeq.u16','vhsubne.u16','vhsubcs.u16','vhsubhs.u16','vhsubcc.u16','vhsublo.u16','vhsubmi.u16','vhsubpl.u16','vhsubvs.u16','vhsubvc.u16','vhsubhi.u16','vhsubls.u16','vhsubge.u16','vhsublt.u16','vhsubgt.u16','vhsuble.u16',
+ 'vhsubeq.u32','vhsubne.u32','vhsubcs.u32','vhsubhs.u32','vhsubcc.u32','vhsublo.u32','vhsubmi.u32','vhsubpl.u32','vhsubvs.u32','vhsubvc.u32','vhsubhi.u32','vhsubls.u32','vhsubge.u32','vhsublt.u32','vhsubgt.u32','vhsuble.u32',
+
+ 'vpadaleq.u8','vpadalne.u8','vpadalcs.u8','vpadalhs.u8','vpadalcc.u8','vpadallo.u8','vpadalmi.u8','vpadalpl.u8','vpadalvs.u8','vpadalvc.u8','vpadalhi.u8','vpadalls.u8','vpadalge.u8','vpadallt.u8','vpadalgt.u8','vpadalle.u8',
+ 'vpadaleq.u16','vpadalne.u16','vpadalcs.u16','vpadalhs.u16','vpadalcc.u16','vpadallo.u16','vpadalmi.u16','vpadalpl.u16','vpadalvs.u16','vpadalvc.u16','vpadalhi.u16','vpadalls.u16','vpadalge.u16','vpadallt.u16','vpadalgt.u16','vpadalle.u16',
+ 'vpadaleq.u32','vpadalne.u32','vpadalcs.u32','vpadalhs.u32','vpadalcc.u32','vpadallo.u32','vpadalmi.u32','vpadalpl.u32','vpadalvs.u32','vpadalvc.u32','vpadalhi.u32','vpadalls.u32','vpadalge.u32','vpadallt.u32','vpadalgt.u32','vpadalle.u32',
+
+ 'vpaddleq.u8','vpaddlne.u8','vpaddlcs.u8','vpaddlhs.u8','vpaddlcc.u8','vpaddllo.u8','vpaddlmi.u8','vpaddlpl.u8','vpaddlvs.u8','vpaddlvc.u8','vpaddlhi.u8','vpaddlls.u8','vpaddlge.u8','vpaddllt.u8','vpaddlgt.u8','vpaddlle.u8',
+ 'vpaddleq.u16','vpaddlne.u16','vpaddlcs.u16','vpaddlhs.u16','vpaddlcc.u16','vpaddllo.u16','vpaddlmi.u16','vpaddlpl.u16','vpaddlvs.u16','vpaddlvc.u16','vpaddlhi.u16','vpaddlls.u16','vpaddlge.u16','vpaddllt.u16','vpaddlgt.u16','vpaddlle.u16',
+ 'vpaddleq.u32','vpaddlne.u32','vpaddlcs.u32','vpaddlhs.u32','vpaddlcc.u32','vpaddllo.u32','vpaddlmi.u32','vpaddlpl.u32','vpaddlvs.u32','vpaddlvc.u32','vpaddlhi.u32','vpaddlls.u32','vpaddlge.u32','vpaddllt.u32','vpaddlgt.u32','vpaddlle.u32',
+
+ 'vcgeeq.u8','vcgene.u8','vcgecs.u8','vcgehs.u8','vcgecc.u8','vcgelo.u8','vcgemi.u8','vcgepl.u8','vcgevs.u8','vcgevc.u8','vcgehi.u8','vcgels.u8','vcgege.u8','vcgelt.u8','vcgegt.u8','vcgele.u8',
+ 'vcgeeq.u16','vcgene.u16','vcgecs.u16','vcgehs.u16','vcgecc.u16','vcgelo.u16','vcgemi.u16','vcgepl.u16','vcgevs.u16','vcgevc.u16','vcgehi.u16','vcgels.u16','vcgege.u16','vcgelt.u16','vcgegt.u16','vcgele.u16',
+ 'vcgeeq.u32','vcgene.u32','vcgecs.u32','vcgehs.u32','vcgecc.u32','vcgelo.u32','vcgemi.u32','vcgepl.u32','vcgevs.u32','vcgevc.u32','vcgehi.u32','vcgels.u32','vcgege.u32','vcgelt.u32','vcgegt.u32','vcgele.u32',
+
+ 'vcleeq.u8','vclene.u8','vclecs.u8','vclehs.u8','vclecc.u8','vclelo.u8','vclemi.u8','vclepl.u8','vclevs.u8','vclevc.u8','vclehi.u8','vclels.u8','vclege.u8','vclelt.u8','vclegt.u8','vclele.u8',
+ 'vcleeq.u16','vclene.u16','vclecs.u16','vclehs.u16','vclecc.u16','vclelo.u16','vclemi.u16','vclepl.u16','vclevs.u16','vclevc.u16','vclehi.u16','vclels.u16','vclege.u16','vclelt.u16','vclegt.u16','vclele.u16',
+ 'vcleeq.u32','vclene.u32','vclecs.u32','vclehs.u32','vclecc.u32','vclelo.u32','vclemi.u32','vclepl.u32','vclevs.u32','vclevc.u32','vclehi.u32','vclels.u32','vclege.u32','vclelt.u32','vclegt.u32','vclele.u32',
+
+ 'vcgteq.u8','vcgtne.u8','vcgtcs.u8','vcgths.u8','vcgtcc.u8','vcgtlo.u8','vcgtmi.u8','vcgtpl.u8','vcgtvs.u8','vcgtvc.u8','vcgthi.u8','vcgtls.u8','vcgtge.u8','vcgtlt.u8','vcgtgt.u8','vcgtle.u8',
+ 'vcgteq.u16','vcgtne.u16','vcgtcs.u16','vcgths.u16','vcgtcc.u16','vcgtlo.u16','vcgtmi.u16','vcgtpl.u16','vcgtvs.u16','vcgtvc.u16','vcgthi.u16','vcgtls.u16','vcgtge.u16','vcgtlt.u16','vcgtgt.u16','vcgtle.u16',
+ 'vcgteq.u32','vcgtne.u32','vcgtcs.u32','vcgths.u32','vcgtcc.u32','vcgtlo.u32','vcgtmi.u32','vcgtpl.u32','vcgtvs.u32','vcgtvc.u32','vcgthi.u32','vcgtls.u32','vcgtge.u32','vcgtlt.u32','vcgtgt.u32','vcgtle.u32',
+
+ 'vclteq.u8','vcltne.u8','vcltcs.u8','vclths.u8','vcltcc.u8','vcltlo.u8','vcltmi.u8','vcltpl.u8','vcltvs.u8','vcltvc.u8','vclthi.u8','vcltls.u8','vcltge.u8','vcltlt.u8','vcltgt.u8','vcltle.u8',
+ 'vclteq.u16','vcltne.u16','vcltcs.u16','vclths.u16','vcltcc.u16','vcltlo.u16','vcltmi.u16','vcltpl.u16','vcltvs.u16','vcltvc.u16','vclthi.u16','vcltls.u16','vcltge.u16','vcltlt.u16','vcltgt.u16','vcltle.u16',
+ 'vclteq.u32','vcltne.u32','vcltcs.u32','vclths.u32','vcltcc.u32','vcltlo.u32','vcltmi.u32','vcltpl.u32','vcltvs.u32','vcltvc.u32','vclthi.u32','vcltls.u32','vcltge.u32','vcltlt.u32','vcltgt.u32','vcltle.u32',
+
+ 'vmaxeq.u8','vmaxne.u8','vmaxcs.u8','vmaxhs.u8','vmaxcc.u8','vmaxlo.u8','vmaxmi.u8','vmaxpl.u8','vmaxvs.u8','vmaxvc.u8','vmaxhi.u8','vmaxls.u8','vmaxge.u8','vmaxlt.u8','vmaxgt.u8','vmaxle.u8',
+ 'vmaxeq.u16','vmaxne.u16','vmaxcs.u16','vmaxhs.u16','vmaxcc.u16','vmaxlo.u16','vmaxmi.u16','vmaxpl.u16','vmaxvs.u16','vmaxvc.u16','vmaxhi.u16','vmaxls.u16','vmaxge.u16','vmaxlt.u16','vmaxgt.u16','vmaxle.u16',
+ 'vmaxeq.u32','vmaxne.u32','vmaxcs.u32','vmaxhs.u32','vmaxcc.u32','vmaxlo.u32','vmaxmi.u32','vmaxpl.u32','vmaxvs.u32','vmaxvc.u32','vmaxhi.u32','vmaxls.u32','vmaxge.u32','vmaxlt.u32','vmaxgt.u32','vmaxle.u32',
+
+ 'vmineq.u8','vminne.u8','vmincs.u8','vminhs.u8','vmincc.u8','vminlo.u8','vminmi.u8','vminpl.u8','vminvs.u8','vminvc.u8','vminhi.u8','vminls.u8','vminge.u8','vminlt.u8','vmingt.u8','vminle.u8',
+ 'vmineq.u16','vminne.u16','vmincs.u16','vminhs.u16','vmincc.u16','vminlo.u16','vminmi.u16','vminpl.u16','vminvs.u16','vminvc.u16','vminhi.u16','vminls.u16','vminge.u16','vminlt.u16','vmingt.u16','vminle.u16',
+ 'vmineq.u32','vminne.u32','vmincs.u32','vminhs.u32','vmincc.u32','vminlo.u32','vminmi.u32','vminpl.u32','vminvs.u32','vminvc.u32','vminhi.u32','vminls.u32','vminge.u32','vminlt.u32','vmingt.u32','vminle.u32',
+
+ 'vmlaleq.u8','vmlalne.u8','vmlalcs.u8','vmlalhs.u8','vmlalcc.u8','vmlallo.u8','vmlalmi.u8','vmlalpl.u8','vmlalvs.u8','vmlalvc.u8','vmlalhi.u8','vmlalls.u8','vmlalge.u8','vmlallt.u8','vmlalgt.u8','vmlalle.u8',
+ 'vmlaleq.u16','vmlalne.u16','vmlalcs.u16','vmlalhs.u16','vmlalcc.u16','vmlallo.u16','vmlalmi.u16','vmlalpl.u16','vmlalvs.u16','vmlalvc.u16','vmlalhi.u16','vmlalls.u16','vmlalge.u16','vmlallt.u16','vmlalgt.u16','vmlalle.u16',
+ 'vmlaleq.u32','vmlalne.u32','vmlalcs.u32','vmlalhs.u32','vmlalcc.u32','vmlallo.u32','vmlalmi.u32','vmlalpl.u32','vmlalvs.u32','vmlalvc.u32','vmlalhi.u32','vmlalls.u32','vmlalge.u32','vmlallt.u32','vmlalgt.u32','vmlalle.u32',
+
+ 'vmlsleq.u8','vmlslne.u8','vmlslcs.u8','vmlslhs.u8','vmlslcc.u8','vmlsllo.u8','vmlslmi.u8','vmlslpl.u8','vmlslvs.u8','vmlslvc.u8','vmlslhi.u8','vmlslls.u8','vmlslge.u8','vmlsllt.u8','vmlslgt.u8','vmlslle.u8',
+ 'vmlsleq.u16','vmlslne.u16','vmlslcs.u16','vmlslhs.u16','vmlslcc.u16','vmlsllo.u16','vmlslmi.u16','vmlslpl.u16','vmlslvs.u16','vmlslvc.u16','vmlslhi.u16','vmlslls.u16','vmlslge.u16','vmlsllt.u16','vmlslgt.u16','vmlslle.u16',
+ 'vmlsleq.u32','vmlslne.u32','vmlslcs.u32','vmlslhs.u32','vmlslcc.u32','vmlsllo.u32','vmlslmi.u32','vmlslpl.u32','vmlslvs.u32','vmlslvc.u32','vmlslhi.u32','vmlslls.u32','vmlslge.u32','vmlsllt.u32','vmlslgt.u32','vmlslle.u32',
+
+ 'vmulleq.u8','vmullne.u8','vmullcs.u8','vmullhs.u8','vmullcc.u8','vmulllo.u8','vmullmi.u8','vmullpl.u8','vmullvs.u8','vmullvc.u8','vmullhi.u8','vmullls.u8','vmullge.u8','vmulllt.u8','vmullgt.u8','vmullle.u8',
+ 'vmulleq.u16','vmullne.u16','vmullcs.u16','vmullhs.u16','vmullcc.u16','vmulllo.u16','vmullmi.u16','vmullpl.u16','vmullvs.u16','vmullvc.u16','vmullhi.u16','vmullls.u16','vmullge.u16','vmulllt.u16','vmullgt.u16','vmullle.u16',
+ 'vmulleq.u32','vmullne.u32','vmullcs.u32','vmullhs.u32','vmullcc.u32','vmulllo.u32','vmullmi.u32','vmullpl.u32','vmullvs.u32','vmullvc.u32','vmullhi.u32','vmullls.u32','vmullge.u32','vmulllt.u32','vmullgt.u32','vmullle.u32',
+
+ 'vmovleq.u8','vmovlne.u8','vmovlcs.u8','vmovlhs.u8','vmovlcc.u8','vmovllo.u8','vmovlmi.u8','vmovlpl.u8','vmovlvs.u8','vmovlvc.u8','vmovlhi.u8','vmovlls.u8','vmovlge.u8','vmovllt.u8','vmovlgt.u8','vmovlle.u8',
+ 'vmovleq.u16','vmovlne.u16','vmovlcs.u16','vmovlhs.u16','vmovlcc.u16','vmovllo.u16','vmovlmi.u16','vmovlpl.u16','vmovlvs.u16','vmovlvc.u16','vmovlhi.u16','vmovlls.u16','vmovlge.u16','vmovllt.u16','vmovlgt.u16','vmovlle.u16',
+ 'vmovleq.u32','vmovlne.u32','vmovlcs.u32','vmovlhs.u32','vmovlcc.u32','vmovllo.u32','vmovlmi.u32','vmovlpl.u32','vmovlvs.u32','vmovlvc.u32','vmovlhi.u32','vmovlls.u32','vmovlge.u32','vmovllt.u32','vmovlgt.u32','vmovlle.u32',
+
+ 'vshleq.u8','vshlne.u8','vshlcs.u8','vshlhs.u8','vshlcc.u8','vshllo.u8','vshlmi.u8','vshlpl.u8','vshlvs.u8','vshlvc.u8','vshlhi.u8','vshlls.u8','vshlge.u8','vshllt.u8','vshlgt.u8','vshlle.u8',
+ 'vshleq.u16','vshlne.u16','vshlcs.u16','vshlhs.u16','vshlcc.u16','vshllo.u16','vshlmi.u16','vshlpl.u16','vshlvs.u16','vshlvc.u16','vshlhi.u16','vshlls.u16','vshlge.u16','vshllt.u16','vshlgt.u16','vshlle.u16',
+ 'vshleq.u32','vshlne.u32','vshlcs.u32','vshlhs.u32','vshlcc.u32','vshllo.u32','vshlmi.u32','vshlpl.u32','vshlvs.u32','vshlvc.u32','vshlhi.u32','vshlls.u32','vshlge.u32','vshllt.u32','vshlgt.u32','vshlle.u32',
+ 'vshleq.u64','vshlne.u64','vshlcs.u64','vshlhs.u64','vshlcc.u64','vshllo.u64','vshlmi.u64','vshlpl.u64','vshlvs.u64','vshlvc.u64','vshlhi.u64','vshlls.u64','vshlge.u64','vshllt.u64','vshlgt.u64','vshlle.u64',
+
+ 'vshlleq.u8','vshllne.u8','vshllcs.u8','vshllhs.u8','vshllcc.u8','vshlllo.u8','vshllmi.u8','vshllpl.u8','vshllvs.u8','vshllvc.u8','vshllhi.u8','vshllls.u8','vshllge.u8','vshlllt.u8','vshllgt.u8','vshllle.u8',
+ 'vshlleq.u16','vshllne.u16','vshllcs.u16','vshllhs.u16','vshllcc.u16','vshlllo.u16','vshllmi.u16','vshllpl.u16','vshllvs.u16','vshllvc.u16','vshllhi.u16','vshllls.u16','vshllge.u16','vshlllt.u16','vshllgt.u16','vshllle.u16',
+ 'vshlleq.u32','vshllne.u32','vshllcs.u32','vshllhs.u32','vshllcc.u32','vshlllo.u32','vshllmi.u32','vshllpl.u32','vshllvs.u32','vshllvc.u32','vshllhi.u32','vshllls.u32','vshllge.u32','vshlllt.u32','vshllgt.u32','vshllle.u32',
+
+ 'vshreq.u8','vshrne.u8','vshrcs.u8','vshrhs.u8','vshrcc.u8','vshrlo.u8','vshrmi.u8','vshrpl.u8','vshrvs.u8','vshrvc.u8','vshrhi.u8','vshrls.u8','vshrge.u8','vshrlt.u8','vshrgt.u8','vshrle.u8',
+ 'vshreq.u16','vshrne.u16','vshrcs.u16','vshrhs.u16','vshrcc.u16','vshrlo.u16','vshrmi.u16','vshrpl.u16','vshrvs.u16','vshrvc.u16','vshrhi.u16','vshrls.u16','vshrge.u16','vshrlt.u16','vshrgt.u16','vshrle.u16',
+ 'vshreq.u32','vshrne.u32','vshrcs.u32','vshrhs.u32','vshrcc.u32','vshrlo.u32','vshrmi.u32','vshrpl.u32','vshrvs.u32','vshrvc.u32','vshrhi.u32','vshrls.u32','vshrge.u32','vshrlt.u32','vshrgt.u32','vshrle.u32',
+ 'vshreq.u64','vshrne.u64','vshrcs.u64','vshrhs.u64','vshrcc.u64','vshrlo.u64','vshrmi.u64','vshrpl.u64','vshrvs.u64','vshrvc.u64','vshrhi.u64','vshrls.u64','vshrge.u64','vshrlt.u64','vshrgt.u64','vshrle.u64',
+
+ 'vsraeq.u8','vsrane.u8','vsracs.u8','vsrahs.u8','vsracc.u8','vsralo.u8','vsrami.u8','vsrapl.u8','vsravs.u8','vsravc.u8','vsrahi.u8','vsrals.u8','vsrage.u8','vsralt.u8','vsragt.u8','vsrale.u8',
+ 'vsraeq.u16','vsrane.u16','vsracs.u16','vsrahs.u16','vsracc.u16','vsralo.u16','vsrami.u16','vsrapl.u16','vsravs.u16','vsravc.u16','vsrahi.u16','vsrals.u16','vsrage.u16','vsralt.u16','vsragt.u16','vsrale.u16',
+ 'vsraeq.u32','vsrane.u32','vsracs.u32','vsrahs.u32','vsracc.u32','vsralo.u32','vsrami.u32','vsrapl.u32','vsravs.u32','vsravc.u32','vsrahi.u32','vsrals.u32','vsrage.u32','vsralt.u32','vsragt.u32','vsrale.u32',
+ 'vsraeq.u64','vsrane.u64','vsracs.u64','vsrahs.u64','vsracc.u64','vsralo.u64','vsrami.u64','vsrapl.u64','vsravs.u64','vsravc.u64','vsrahi.u64','vsrals.u64','vsrage.u64','vsralt.u64','vsragt.u64','vsrale.u64',
+
+ 'vpmaxeq.u8','vpmaxne.u8','vpmaxcs.u8','vpmaxhs.u8','vpmaxcc.u8','vpmaxlo.u8','vpmaxmi.u8','vpmaxpl.u8','vpmaxvs.u8','vpmaxvc.u8','vpmaxhi.u8','vpmaxls.u8','vpmaxge.u8','vpmaxlt.u8','vpmaxgt.u8','vpmaxle.u8',
+ 'vpmaxeq.u16','vpmaxne.u16','vpmaxcs.u16','vpmaxhs.u16','vpmaxcc.u16','vpmaxlo.u16','vpmaxmi.u16','vpmaxpl.u16','vpmaxvs.u16','vpmaxvc.u16','vpmaxhi.u16','vpmaxls.u16','vpmaxge.u16','vpmaxlt.u16','vpmaxgt.u16','vpmaxle.u16',
+ 'vpmaxeq.u32','vpmaxne.u32','vpmaxcs.u32','vpmaxhs.u32','vpmaxcc.u32','vpmaxlo.u32','vpmaxmi.u32','vpmaxpl.u32','vpmaxvs.u32','vpmaxvc.u32','vpmaxhi.u32','vpmaxls.u32','vpmaxge.u32','vpmaxlt.u32','vpmaxgt.u32','vpmaxle.u32',
+
+ 'vpmineq.u8','vpminne.u8','vpmincs.u8','vpminhs.u8','vpmincc.u8','vpminlo.u8','vpminmi.u8','vpminpl.u8','vpminvs.u8','vpminvc.u8','vpminhi.u8','vpminls.u8','vpminge.u8','vpminlt.u8','vpmingt.u8','vpminle.u8',
+ 'vpmineq.u16','vpminne.u16','vpmincs.u16','vpminhs.u16','vpmincc.u16','vpminlo.u16','vpminmi.u16','vpminpl.u16','vpminvs.u16','vpminvc.u16','vpminhi.u16','vpminls.u16','vpminge.u16','vpminlt.u16','vpmingt.u16','vpminle.u16',
+ 'vpmineq.u32','vpminne.u32','vpmincs.u32','vpminhs.u32','vpmincc.u32','vpminlo.u32','vpminmi.u32','vpminpl.u32','vpminvs.u32','vpminvc.u32','vpminhi.u32','vpminls.u32','vpminge.u32','vpminlt.u32','vpmingt.u32','vpminle.u32',
+
+ 'vqaddeq.u8','vqaddne.u8','vqaddcs.u8','vqaddhs.u8','vqaddcc.u8','vqaddlo.u8','vqaddmi.u8','vqaddpl.u8','vqaddvs.u8','vqaddvc.u8','vqaddhi.u8','vqaddls.u8','vqaddge.u8','vqaddlt.u8','vqaddgt.u8','vqaddle.u8',
+ 'vqaddeq.u16','vqaddne.u16','vqaddcs.u16','vqaddhs.u16','vqaddcc.u16','vqaddlo.u16','vqaddmi.u16','vqaddpl.u16','vqaddvs.u16','vqaddvc.u16','vqaddhi.u16','vqaddls.u16','vqaddge.u16','vqaddlt.u16','vqaddgt.u16','vqaddle.u16',
+ 'vqaddeq.u32','vqaddne.u32','vqaddcs.u32','vqaddhs.u32','vqaddcc.u32','vqaddlo.u32','vqaddmi.u32','vqaddpl.u32','vqaddvs.u32','vqaddvc.u32','vqaddhi.u32','vqaddls.u32','vqaddge.u32','vqaddlt.u32','vqaddgt.u32','vqaddle.u32',
+ 'vqaddeq.u64','vqaddne.u64','vqaddcs.u64','vqaddhs.u64','vqaddcc.u64','vqaddlo.u64','vqaddmi.u64','vqaddpl.u64','vqaddvs.u64','vqaddvc.u64','vqaddhi.u64','vqaddls.u64','vqaddge.u64','vqaddlt.u64','vqaddgt.u64','vqaddle.u64',
+
+ 'vqsubeq.u8','vqsubne.u8','vqsubcs.u8','vqsubhs.u8','vqsubcc.u8','vqsublo.u8','vqsubmi.u8','vqsubpl.u8','vqsubvs.u8','vqsubvc.u8','vqsubhi.u8','vqsubls.u8','vqsubge.u8','vqsublt.u8','vqsubgt.u8','vqsuble.u8',
+ 'vqsubeq.u16','vqsubne.u16','vqsubcs.u16','vqsubhs.u16','vqsubcc.u16','vqsublo.u16','vqsubmi.u16','vqsubpl.u16','vqsubvs.u16','vqsubvc.u16','vqsubhi.u16','vqsubls.u16','vqsubge.u16','vqsublt.u16','vqsubgt.u16','vqsuble.u16',
+ 'vqsubeq.u32','vqsubne.u32','vqsubcs.u32','vqsubhs.u32','vqsubcc.u32','vqsublo.u32','vqsubmi.u32','vqsubpl.u32','vqsubvs.u32','vqsubvc.u32','vqsubhi.u32','vqsubls.u32','vqsubge.u32','vqsublt.u32','vqsubgt.u32','vqsuble.u32',
+ 'vqsubeq.u64','vqsubne.u64','vqsubcs.u64','vqsubhs.u64','vqsubcc.u64','vqsublo.u64','vqsubmi.u64','vqsubpl.u64','vqsubvs.u64','vqsubvc.u64','vqsubhi.u64','vqsubls.u64','vqsubge.u64','vqsublt.u64','vqsubgt.u64','vqsuble.u64',
+
+ 'vqmovneq.u16','vqmovnne.u16','vqmovncs.u16','vqmovnhs.u16','vqmovncc.u16','vqmovnlo.u16','vqmovnmi.u16','vqmovnpl.u16','vqmovnvs.u16','vqmovnvc.u16','vqmovnhi.u16','vqmovnls.u16','vqmovnge.u16','vqmovnlt.u16','vqmovngt.u16','vqmovnle.u16',
+ 'vqmovneq.u32','vqmovnne.u32','vqmovncs.u32','vqmovnhs.u32','vqmovncc.u32','vqmovnlo.u32','vqmovnmi.u32','vqmovnpl.u32','vqmovnvs.u32','vqmovnvc.u32','vqmovnhi.u32','vqmovnls.u32','vqmovnge.u32','vqmovnlt.u32','vqmovngt.u32','vqmovnle.u32',
+ 'vqmovneq.u64','vqmovnne.u64','vqmovncs.u64','vqmovnhs.u64','vqmovncc.u64','vqmovnlo.u64','vqmovnmi.u64','vqmovnpl.u64','vqmovnvs.u64','vqmovnvc.u64','vqmovnhi.u64','vqmovnls.u64','vqmovnge.u64','vqmovnlt.u64','vqmovngt.u64','vqmovnle.u64',
+
+ 'vqshleq.u8','vqshlne.u8','vqshlcs.u8','vqshlhs.u8','vqshlcc.u8','vqshllo.u8','vqshlmi.u8','vqshlpl.u8','vqshlvs.u8','vqshlvc.u8','vqshlhi.u8','vqshlls.u8','vqshlge.u8','vqshllt.u8','vqshlgt.u8','vqshlle.u8',
+ 'vqshleq.u16','vqshlne.u16','vqshlcs.u16','vqshlhs.u16','vqshlcc.u16','vqshllo.u16','vqshlmi.u16','vqshlpl.u16','vqshlvs.u16','vqshlvc.u16','vqshlhi.u16','vqshlls.u16','vqshlge.u16','vqshllt.u16','vqshlgt.u16','vqshlle.u16',
+ 'vqshleq.u32','vqshlne.u32','vqshlcs.u32','vqshlhs.u32','vqshlcc.u32','vqshllo.u32','vqshlmi.u32','vqshlpl.u32','vqshlvs.u32','vqshlvc.u32','vqshlhi.u32','vqshlls.u32','vqshlge.u32','vqshllt.u32','vqshlgt.u32','vqshlle.u32',
+ 'vqshleq.u64','vqshlne.u64','vqshlcs.u64','vqshlhs.u64','vqshlcc.u64','vqshllo.u64','vqshlmi.u64','vqshlpl.u64','vqshlvs.u64','vqshlvc.u64','vqshlhi.u64','vqshlls.u64','vqshlge.u64','vqshllt.u64','vqshlgt.u64','vqshlle.u64',
+
+ 'vqshrneq.u16','vqshrnne.u16','vqshrncs.u16','vqshrnhs.u16','vqshrncc.u16','vqshrnlo.u16','vqshrnmi.u16','vqshrnpl.u16','vqshrnvs.u16','vqshrnvc.u16','vqshrnhi.u16','vqshrnls.u16','vqshrnge.u16','vqshrnlt.u16','vqshrngt.u16','vqshrnle.u16',
+ 'vqshrneq.u32','vqshrnne.u32','vqshrncs.u32','vqshrnhs.u32','vqshrncc.u32','vqshrnlo.u32','vqshrnmi.u32','vqshrnpl.u32','vqshrnvs.u32','vqshrnvc.u32','vqshrnhi.u32','vqshrnls.u32','vqshrnge.u32','vqshrnlt.u32','vqshrngt.u32','vqshrnle.u32',
+ 'vqshrneq.u64','vqshrnne.u64','vqshrncs.u64','vqshrnhs.u64','vqshrncc.u64','vqshrnlo.u64','vqshrnmi.u64','vqshrnpl.u64','vqshrnvs.u64','vqshrnvc.u64','vqshrnhi.u64','vqshrnls.u64','vqshrnge.u64','vqshrnlt.u64','vqshrngt.u64','vqshrnle.u64',
+
+ 'vqrshleq.u8','vqrshlne.u8','vqrshlcs.u8','vqrshlhs.u8','vqrshlcc.u8','vqrshllo.u8','vqrshlmi.u8','vqrshlpl.u8','vqrshlvs.u8','vqrshlvc.u8','vqrshlhi.u8','vqrshlls.u8','vqrshlge.u8','vqrshllt.u8','vqrshlgt.u8','vqrshlle.u8',
+ 'vqrshleq.u16','vqrshlne.u16','vqrshlcs.u16','vqrshlhs.u16','vqrshlcc.u16','vqrshllo.u16','vqrshlmi.u16','vqrshlpl.u16','vqrshlvs.u16','vqrshlvc.u16','vqrshlhi.u16','vqrshlls.u16','vqrshlge.u16','vqrshllt.u16','vqrshlgt.u16','vqrshlle.u16',
+ 'vqrshleq.u32','vqrshlne.u32','vqrshlcs.u32','vqrshlhs.u32','vqrshlcc.u32','vqrshllo.u32','vqrshlmi.u32','vqrshlpl.u32','vqrshlvs.u32','vqrshlvc.u32','vqrshlhi.u32','vqrshlls.u32','vqrshlge.u32','vqrshllt.u32','vqrshlgt.u32','vqrshlle.u32',
+ 'vqrshleq.u64','vqrshlne.u64','vqrshlcs.u64','vqrshlhs.u64','vqrshlcc.u64','vqrshllo.u64','vqrshlmi.u64','vqrshlpl.u64','vqrshlvs.u64','vqrshlvc.u64','vqrshlhi.u64','vqrshlls.u64','vqrshlge.u64','vqrshllt.u64','vqrshlgt.u64','vqrshlle.u64',
+
+ 'vqrshrneq.u16','vqrshrnne.u16','vqrshrncs.u16','vqrshrnhs.u16','vqrshrncc.u16','vqrshrnlo.u16','vqrshrnmi.u16','vqrshrnpl.u16','vqrshrnvs.u16','vqrshrnvc.u16','vqrshrnhi.u16','vqrshrnls.u16','vqrshrnge.u16','vqrshrnlt.u16','vqrshrngt.u16','vqrshrnle.u16',
+ 'vqrshrneq.u32','vqrshrnne.u32','vqrshrncs.u32','vqrshrnhs.u32','vqrshrncc.u32','vqrshrnlo.u32','vqrshrnmi.u32','vqrshrnpl.u32','vqrshrnvs.u32','vqrshrnvc.u32','vqrshrnhi.u32','vqrshrnls.u32','vqrshrnge.u32','vqrshrnlt.u32','vqrshrngt.u32','vqrshrnle.u32',
+ 'vqrshrneq.u64','vqrshrnne.u64','vqrshrncs.u64','vqrshrnhs.u64','vqrshrncc.u64','vqrshrnlo.u64','vqrshrnmi.u64','vqrshrnpl.u64','vqrshrnvs.u64','vqrshrnvc.u64','vqrshrnhi.u64','vqrshrnls.u64','vqrshrnge.u64','vqrshrnlt.u64','vqrshrngt.u64','vqrshrnle.u64',
+
+ 'vrhaddeq.u8','vrhaddne.u8','vrhaddcs.u8','vrhaddhs.u8','vrhaddcc.u8','vrhaddlo.u8','vrhaddmi.u8','vrhaddpl.u8','vrhaddvs.u8','vrhaddvc.u8','vrhaddhi.u8','vrhaddls.u8','vrhaddge.u8','vrhaddlt.u8','vrhaddgt.u8','vrhaddle.u8',
+ 'vrhaddeq.u16','vrhaddne.u16','vrhaddcs.u16','vrhaddhs.u16','vrhaddcc.u16','vrhaddlo.u16','vrhaddmi.u16','vrhaddpl.u16','vrhaddvs.u16','vrhaddvc.u16','vrhaddhi.u16','vrhaddls.u16','vrhaddge.u16','vrhaddlt.u16','vrhaddgt.u16','vrhaddle.u16',
+ 'vrhaddeq.u32','vrhaddne.u32','vrhaddcs.u32','vrhaddhs.u32','vrhaddcc.u32','vrhaddlo.u32','vrhaddmi.u32','vrhaddpl.u32','vrhaddvs.u32','vrhaddvc.u32','vrhaddhi.u32','vrhaddls.u32','vrhaddge.u32','vrhaddlt.u32','vrhaddgt.u32','vrhaddle.u32',
+
+ 'vrshleq.u8','vrshlne.u8','vrshlcs.u8','vrshlhs.u8','vrshlcc.u8','vrshllo.u8','vrshlmi.u8','vrshlpl.u8','vrshlvs.u8','vrshlvc.u8','vrshlhi.u8','vrshlls.u8','vrshlge.u8','vrshllt.u8','vrshlgt.u8','vrshlle.u8',
+ 'vrshleq.u16','vrshlne.u16','vrshlcs.u16','vrshlhs.u16','vrshlcc.u16','vrshllo.u16','vrshlmi.u16','vrshlpl.u16','vrshlvs.u16','vrshlvc.u16','vrshlhi.u16','vrshlls.u16','vrshlge.u16','vrshllt.u16','vrshlgt.u16','vrshlle.u16',
+ 'vrshleq.u32','vrshlne.u32','vrshlcs.u32','vrshlhs.u32','vrshlcc.u32','vrshllo.u32','vrshlmi.u32','vrshlpl.u32','vrshlvs.u32','vrshlvc.u32','vrshlhi.u32','vrshlls.u32','vrshlge.u32','vrshllt.u32','vrshlgt.u32','vrshlle.u32',
+ 'vrshleq.u64','vrshlne.u64','vrshlcs.u64','vrshlhs.u64','vrshlcc.u64','vrshllo.u64','vrshlmi.u64','vrshlpl.u64','vrshlvs.u64','vrshlvc.u64','vrshlhi.u64','vrshlls.u64','vrshlge.u64','vrshllt.u64','vrshlgt.u64','vrshlle.u64',
+
+ 'vrshreq.u8','vrshrne.u8','vrshrcs.u8','vrshrhs.u8','vrshrcc.u8','vrshrlo.u8','vrshrmi.u8','vrshrpl.u8','vrshrvs.u8','vrshrvc.u8','vrshrhi.u8','vrshrls.u8','vrshrge.u8','vrshrlt.u8','vrshrgt.u8','vrshrle.u8',
+ 'vrshreq.u16','vrshrne.u16','vrshrcs.u16','vrshrhs.u16','vrshrcc.u16','vrshrlo.u16','vrshrmi.u16','vrshrpl.u16','vrshrvs.u16','vrshrvc.u16','vrshrhi.u16','vrshrls.u16','vrshrge.u16','vrshrlt.u16','vrshrgt.u16','vrshrle.u16',
+ 'vrshreq.u32','vrshrne.u32','vrshrcs.u32','vrshrhs.u32','vrshrcc.u32','vrshrlo.u32','vrshrmi.u32','vrshrpl.u32','vrshrvs.u32','vrshrvc.u32','vrshrhi.u32','vrshrls.u32','vrshrge.u32','vrshrlt.u32','vrshrgt.u32','vrshrle.u32',
+ 'vrshreq.u64','vrshrne.u64','vrshrcs.u64','vrshrhs.u64','vrshrcc.u64','vrshrlo.u64','vrshrmi.u64','vrshrpl.u64','vrshrvs.u64','vrshrvc.u64','vrshrhi.u64','vrshrls.u64','vrshrge.u64','vrshrlt.u64','vrshrgt.u64','vrshrle.u64',
+
+ 'vrsraeq.u8','vrsrane.u8','vrsracs.u8','vrsrahs.u8','vrsracc.u8','vrsralo.u8','vrsrami.u8','vrsrapl.u8','vrsravs.u8','vrsravc.u8','vrsrahi.u8','vrsrals.u8','vrsrage.u8','vrsralt.u8','vrsragt.u8','vrsrale.u8',
+ 'vrsraeq.u16','vrsrane.u16','vrsracs.u16','vrsrahs.u16','vrsracc.u16','vrsralo.u16','vrsrami.u16','vrsrapl.u16','vrsravs.u16','vrsravc.u16','vrsrahi.u16','vrsrals.u16','vrsrage.u16','vrsralt.u16','vrsragt.u16','vrsrale.u16',
+ 'vrsraeq.u32','vrsrane.u32','vrsracs.u32','vrsrahs.u32','vrsracc.u32','vrsralo.u32','vrsrami.u32','vrsrapl.u32','vrsravs.u32','vrsravc.u32','vrsrahi.u32','vrsrals.u32','vrsrage.u32','vrsralt.u32','vrsragt.u32','vrsrale.u32',
+ 'vrsraeq.u64','vrsrane.u64','vrsracs.u64','vrsrahs.u64','vrsracc.u64','vrsralo.u64','vrsrami.u64','vrsrapl.u64','vrsravs.u64','vrsravc.u64','vrsrahi.u64','vrsrals.u64','vrsrage.u64','vrsralt.u64','vrsragt.u64','vrsrale.u64',
+ ),
+ /* Conditional VFPv3 & NEON SIMD Floating-Point Instructions */
+ 34 => array(
+ 'vabdeq.f32','vabdne.f32','vabdcs.f32','vabdhs.f32','vabdcc.f32','vabdlo.f32','vabdmi.f32','vabdpl.f32','vabdvs.f32','vabdvc.f32','vabdhi.f32','vabdls.f32','vabdge.f32','vabdlt.f32','vabdgt.f32','vabdle.f32',
+
+ 'vabseq.f32','vabsne.f32','vabscs.f32','vabshs.f32','vabscc.f32','vabslo.f32','vabsmi.f32','vabspl.f32','vabsvs.f32','vabsvc.f32','vabshi.f32','vabsls.f32','vabsge.f32','vabslt.f32','vabsgt.f32','vabsle.f32',
+ 'vabseq.f64','vabsne.f64','vabscs.f64','vabshs.f64','vabscc.f64','vabslo.f64','vabsmi.f64','vabspl.f64','vabsvs.f64','vabsvc.f64','vabshi.f64','vabsls.f64','vabsge.f64','vabslt.f64','vabsgt.f64','vabsle.f64',
+
+ 'vacgeeq.f32','vacgene.f32','vacgecs.f32','vacgehs.f32','vacgecc.f32','vacgelo.f32','vacgemi.f32','vacgepl.f32','vacgevs.f32','vacgevc.f32','vacgehi.f32','vacgels.f32','vacgege.f32','vacgelt.f32','vacgegt.f32','vacgele.f32',
+ 'vacgteq.f32','vacgtne.f32','vacgtcs.f32','vacgths.f32','vacgtcc.f32','vacgtlo.f32','vacgtmi.f32','vacgtpl.f32','vacgtvs.f32','vacgtvc.f32','vacgthi.f32','vacgtls.f32','vacgtge.f32','vacgtlt.f32','vacgtgt.f32','vacgtle.f32',
+ 'vacleeq.f32','vaclene.f32','vaclecs.f32','vaclehs.f32','vaclecc.f32','vaclelo.f32','vaclemi.f32','vaclepl.f32','vaclevs.f32','vaclevc.f32','vaclehi.f32','vaclels.f32','vaclege.f32','vaclelt.f32','vaclegt.f32','vaclele.f32',
+ 'vaclteq.f32','vacltne.f32','vacltcs.f32','vaclths.f32','vacltcc.f32','vacltlo.f32','vacltmi.f32','vacltpl.f32','vacltvs.f32','vacltvc.f32','vaclthi.f32','vacltls.f32','vacltge.f32','vacltlt.f32','vacltgt.f32','vacltle.f32',
+
+ 'vaddeq.f32','vaddne.f32','vaddcs.f32','vaddhs.f32','vaddcc.f32','vaddlo.f32','vaddmi.f32','vaddpl.f32','vaddvs.f32','vaddvc.f32','vaddhi.f32','vaddls.f32','vaddge.f32','vaddlt.f32','vaddgt.f32','vaddle.f32',
+ 'vaddeq.f64','vaddne.f64','vaddcs.f64','vaddhs.f64','vaddcc.f64','vaddlo.f64','vaddmi.f64','vaddpl.f64','vaddvs.f64','vaddvc.f64','vaddhi.f64','vaddls.f64','vaddge.f64','vaddlt.f64','vaddgt.f64','vaddle.f64',
+
+ 'vceqeq.f32','vceqne.f32','vceqcs.f32','vceqhs.f32','vceqcc.f32','vceqlo.f32','vceqmi.f32','vceqpl.f32','vceqvs.f32','vceqvc.f32','vceqhi.f32','vceqls.f32','vceqge.f32','vceqlt.f32','vceqgt.f32','vceqle.f32',
+ 'vcgeeq.f32','vcgene.f32','vcgecs.f32','vcgehs.f32','vcgecc.f32','vcgelo.f32','vcgemi.f32','vcgepl.f32','vcgevs.f32','vcgevc.f32','vcgehi.f32','vcgels.f32','vcgege.f32','vcgelt.f32','vcgegt.f32','vcgele.f32',
+ 'vcleeq.f32','vclene.f32','vclecs.f32','vclehs.f32','vclecc.f32','vclelo.f32','vclemi.f32','vclepl.f32','vclevs.f32','vclevc.f32','vclehi.f32','vclels.f32','vclege.f32','vclelt.f32','vclegt.f32','vclele.f32',
+ 'vcgteq.f32','vcgtne.f32','vcgtcs.f32','vcgths.f32','vcgtcc.f32','vcgtlo.f32','vcgtmi.f32','vcgtpl.f32','vcgtvs.f32','vcgtvc.f32','vcgthi.f32','vcgtls.f32','vcgtge.f32','vcgtlt.f32','vcgtgt.f32','vcgtle.f32',
+ 'vclteq.f32','vcltne.f32','vcltcs.f32','vclths.f32','vcltcc.f32','vcltlo.f32','vcltmi.f32','vcltpl.f32','vcltvs.f32','vcltvc.f32','vclthi.f32','vcltls.f32','vcltge.f32','vcltlt.f32','vcltgt.f32','vcltle.f32',
+
+ 'vcmpeq.f32','vcmpne.f32','vcmpcs.f32','vcmphs.f32','vcmpcc.f32','vcmplo.f32','vcmpmi.f32','vcmppl.f32','vcmpvs.f32','vcmpvc.f32','vcmphi.f32','vcmpls.f32','vcmpge.f32','vcmplt.f32','vcmpgt.f32','vcmple.f32',
+ 'vcmpeq.f64','vcmpne.f64','vcmpcs.f64','vcmphs.f64','vcmpcc.f64','vcmplo.f64','vcmpmi.f64','vcmppl.f64','vcmpvs.f64','vcmpvc.f64','vcmphi.f64','vcmpls.f64','vcmpge.f64','vcmplt.f64','vcmpgt.f64','vcmple.f64',
+
+ 'vcmpeeq.f32','vcmpene.f32','vcmpecs.f32','vcmpehs.f32','vcmpecc.f32','vcmpelo.f32','vcmpemi.f32','vcmpepl.f32','vcmpevs.f32','vcmpevc.f32','vcmpehi.f32','vcmpels.f32','vcmpege.f32','vcmpelt.f32','vcmpegt.f32','vcmpele.f32',
+ 'vcmpeeq.f64','vcmpene.f64','vcmpecs.f64','vcmpehs.f64','vcmpecc.f64','vcmpelo.f64','vcmpemi.f64','vcmpepl.f64','vcmpevs.f64','vcmpevc.f64','vcmpehi.f64','vcmpels.f64','vcmpege.f64','vcmpelt.f64','vcmpegt.f64','vcmpele.f64',
+
+ 'vcvteq.s16.f32','vcvtne.s16.f32','vcvtcs.s16.f32','vcvths.s16.f32','vcvtcc.s16.f32','vcvtlo.s16.f32','vcvtmi.s16.f32','vcvtpl.s16.f32','vcvtvs.s16.f32','vcvtvc.s16.f32','vcvthi.s16.f32','vcvtls.s16.f32','vcvtge.s16.f32','vcvtlt.s16.f32','vcvtgt.s16.f32','vcvtle.s16.f32',
+ 'vcvteq.s16.f64','vcvtne.s16.f64','vcvtcs.s16.f64','vcvths.s16.f64','vcvtcc.s16.f64','vcvtlo.s16.f64','vcvtmi.s16.f64','vcvtpl.s16.f64','vcvtvs.s16.f64','vcvtvc.s16.f64','vcvthi.s16.f64','vcvtls.s16.f64','vcvtge.s16.f64','vcvtlt.s16.f64','vcvtgt.s16.f64','vcvtle.s16.f64',
+ 'vcvteq.s32.f32','vcvtne.s32.f32','vcvtcs.s32.f32','vcvths.s32.f32','vcvtcc.s32.f32','vcvtlo.s32.f32','vcvtmi.s32.f32','vcvtpl.s32.f32','vcvtvs.s32.f32','vcvtvc.s32.f32','vcvthi.s32.f32','vcvtls.s32.f32','vcvtge.s32.f32','vcvtlt.s32.f32','vcvtgt.s32.f32','vcvtle.s32.f32',
+ 'vcvteq.s32.f64','vcvtne.s32.f64','vcvtcs.s32.f64','vcvths.s32.f64','vcvtcc.s32.f64','vcvtlo.s32.f64','vcvtmi.s32.f64','vcvtpl.s32.f64','vcvtvs.s32.f64','vcvtvc.s32.f64','vcvthi.s32.f64','vcvtls.s32.f64','vcvtge.s32.f64','vcvtlt.s32.f64','vcvtgt.s32.f64','vcvtle.s32.f64',
+ 'vcvteq.u16.f32','vcvtne.u16.f32','vcvtcs.u16.f32','vcvths.u16.f32','vcvtcc.u16.f32','vcvtlo.u16.f32','vcvtmi.u16.f32','vcvtpl.u16.f32','vcvtvs.u16.f32','vcvtvc.u16.f32','vcvthi.u16.f32','vcvtls.u16.f32','vcvtge.u16.f32','vcvtlt.u16.f32','vcvtgt.u16.f32','vcvtle.u16.f32',
+ 'vcvteq.u16.f64','vcvtne.u16.f64','vcvtcs.u16.f64','vcvths.u16.f64','vcvtcc.u16.f64','vcvtlo.u16.f64','vcvtmi.u16.f64','vcvtpl.u16.f64','vcvtvs.u16.f64','vcvtvc.u16.f64','vcvthi.u16.f64','vcvtls.u16.f64','vcvtge.u16.f64','vcvtlt.u16.f64','vcvtgt.u16.f64','vcvtle.u16.f64',
+ 'vcvteq.u32.f32','vcvtne.u32.f32','vcvtcs.u32.f32','vcvths.u32.f32','vcvtcc.u32.f32','vcvtlo.u32.f32','vcvtmi.u32.f32','vcvtpl.u32.f32','vcvtvs.u32.f32','vcvtvc.u32.f32','vcvthi.u32.f32','vcvtls.u32.f32','vcvtge.u32.f32','vcvtlt.u32.f32','vcvtgt.u32.f32','vcvtle.u32.f32',
+ 'vcvteq.u32.f64','vcvtne.u32.f64','vcvtcs.u32.f64','vcvths.u32.f64','vcvtcc.u32.f64','vcvtlo.u32.f64','vcvtmi.u32.f64','vcvtpl.u32.f64','vcvtvs.u32.f64','vcvtvc.u32.f64','vcvthi.u32.f64','vcvtls.u32.f64','vcvtge.u32.f64','vcvtlt.u32.f64','vcvtgt.u32.f64','vcvtle.u32.f64',
+ 'vcvteq.f16.f32','vcvtne.f16.f32','vcvtcs.f16.f32','vcvths.f16.f32','vcvtcc.f16.f32','vcvtlo.f16.f32','vcvtmi.f16.f32','vcvtpl.f16.f32','vcvtvs.f16.f32','vcvtvc.f16.f32','vcvthi.f16.f32','vcvtls.f16.f32','vcvtge.f16.f32','vcvtlt.f16.f32','vcvtgt.f16.f32','vcvtle.f16.f32',
+ 'vcvteq.f32.s32','vcvtne.f32.s32','vcvtcs.f32.s32','vcvths.f32.s32','vcvtcc.f32.s32','vcvtlo.f32.s32','vcvtmi.f32.s32','vcvtpl.f32.s32','vcvtvs.f32.s32','vcvtvc.f32.s32','vcvthi.f32.s32','vcvtls.f32.s32','vcvtge.f32.s32','vcvtlt.f32.s32','vcvtgt.f32.s32','vcvtle.f32.s32',
+ 'vcvteq.f32.u32','vcvtne.f32.u32','vcvtcs.f32.u32','vcvths.f32.u32','vcvtcc.f32.u32','vcvtlo.f32.u32','vcvtmi.f32.u32','vcvtpl.f32.u32','vcvtvs.f32.u32','vcvtvc.f32.u32','vcvthi.f32.u32','vcvtls.f32.u32','vcvtge.f32.u32','vcvtlt.f32.u32','vcvtgt.f32.u32','vcvtle.f32.u32',
+ 'vcvteq.f32.f16','vcvtne.f32.f16','vcvtcs.f32.f16','vcvths.f32.f16','vcvtcc.f32.f16','vcvtlo.f32.f16','vcvtmi.f32.f16','vcvtpl.f32.f16','vcvtvs.f32.f16','vcvtvc.f32.f16','vcvthi.f32.f16','vcvtls.f32.f16','vcvtge.f32.f16','vcvtlt.f32.f16','vcvtgt.f32.f16','vcvtle.f32.f16',
+ 'vcvteq.f32.f64','vcvtne.f32.f64','vcvtcs.f32.f64','vcvths.f32.f64','vcvtcc.f32.f64','vcvtlo.f32.f64','vcvtmi.f32.f64','vcvtpl.f32.f64','vcvtvs.f32.f64','vcvtvc.f32.f64','vcvthi.f32.f64','vcvtls.f32.f64','vcvtge.f32.f64','vcvtlt.f32.f64','vcvtgt.f32.f64','vcvtle.f32.f64',
+ 'vcvteq.f64.s32','vcvtne.f64.s32','vcvtcs.f64.s32','vcvths.f64.s32','vcvtcc.f64.s32','vcvtlo.f64.s32','vcvtmi.f64.s32','vcvtpl.f64.s32','vcvtvs.f64.s32','vcvtvc.f64.s32','vcvthi.f64.s32','vcvtls.f64.s32','vcvtge.f64.s32','vcvtlt.f64.s32','vcvtgt.f64.s32','vcvtle.f64.s32',
+ 'vcvteq.f64.u32','vcvtne.f64.u32','vcvtcs.f64.u32','vcvths.f64.u32','vcvtcc.f64.u32','vcvtlo.f64.u32','vcvtmi.f64.u32','vcvtpl.f64.u32','vcvtvs.f64.u32','vcvtvc.f64.u32','vcvthi.f64.u32','vcvtls.f64.u32','vcvtge.f64.u32','vcvtlt.f64.u32','vcvtgt.f64.u32','vcvtle.f64.u32',
+ 'vcvteq.f64.f32','vcvtne.f64.f32','vcvtcs.f64.f32','vcvths.f64.f32','vcvtcc.f64.f32','vcvtlo.f64.f32','vcvtmi.f64.f32','vcvtpl.f64.f32','vcvtvs.f64.f32','vcvtvc.f64.f32','vcvthi.f64.f32','vcvtls.f64.f32','vcvtge.f64.f32','vcvtlt.f64.f32','vcvtgt.f64.f32','vcvtle.f64.f32',
+
+ 'vcvtreq.s32.f32','vcvtrne.s32.f32','vcvtrcs.s32.f32','vcvtrhs.s32.f32','vcvtrcc.s32.f32','vcvtrlo.s32.f32','vcvtrmi.s32.f32','vcvtrpl.s32.f32','vcvtrvs.s32.f32','vcvtrvc.s32.f32','vcvtrhi.s32.f32','vcvtrls.s32.f32','vcvtrge.s32.f32','vcvtrlt.s32.f32','vcvtrgt.s32.f32','vcvtrle.s32.f32',
+ 'vcvtreq.s32.f64','vcvtrne.s32.f64','vcvtrcs.s32.f64','vcvtrhs.s32.f64','vcvtrcc.s32.f64','vcvtrlo.s32.f64','vcvtrmi.s32.f64','vcvtrpl.s32.f64','vcvtrvs.s32.f64','vcvtrvc.s32.f64','vcvtrhi.s32.f64','vcvtrls.s32.f64','vcvtrge.s32.f64','vcvtrlt.s32.f64','vcvtrgt.s32.f64','vcvtrle.s32.f64',
+ 'vcvtreq.u32.f32','vcvtrne.u32.f32','vcvtrcs.u32.f32','vcvtrhs.u32.f32','vcvtrcc.u32.f32','vcvtrlo.u32.f32','vcvtrmi.u32.f32','vcvtrpl.u32.f32','vcvtrvs.u32.f32','vcvtrvc.u32.f32','vcvtrhi.u32.f32','vcvtrls.u32.f32','vcvtrge.u32.f32','vcvtrlt.u32.f32','vcvtrgt.u32.f32','vcvtrle.u32.f32',
+ 'vcvtreq.u32.f64','vcvtrne.u32.f64','vcvtrcs.u32.f64','vcvtrhs.u32.f64','vcvtrcc.u32.f64','vcvtrlo.u32.f64','vcvtrmi.u32.f64','vcvtrpl.u32.f64','vcvtrvs.u32.f64','vcvtrvc.u32.f64','vcvtrhi.u32.f64','vcvtrls.u32.f64','vcvtrge.u32.f64','vcvtrlt.u32.f64','vcvtrgt.u32.f64','vcvtrle.u32.f64',
+
+ 'vcvtbeq.f16.f32','vcvtbne.f16.f32','vcvtbcs.f16.f32','vcvtbhs.f16.f32','vcvtbcc.f16.f32','vcvtblo.f16.f32','vcvtbmi.f16.f32','vcvtbpl.f16.f32','vcvtbvs.f16.f32','vcvtbvc.f16.f32','vcvtbhi.f16.f32','vcvtbls.f16.f32','vcvtbge.f16.f32','vcvtblt.f16.f32','vcvtbgt.f16.f32','vcvtble.f16.f32',
+ 'vcvtbeq.f32.f16','vcvtbne.f32.f16','vcvtbcs.f32.f16','vcvtbhs.f32.f16','vcvtbcc.f32.f16','vcvtblo.f32.f16','vcvtbmi.f32.f16','vcvtbpl.f32.f16','vcvtbvs.f32.f16','vcvtbvc.f32.f16','vcvtbhi.f32.f16','vcvtbls.f32.f16','vcvtbge.f32.f16','vcvtblt.f32.f16','vcvtbgt.f32.f16','vcvtble.f32.f16',
+
+ 'vcvtteq.f16.f32','vcvttne.f16.f32','vcvttcs.f16.f32','vcvtths.f16.f32','vcvttcc.f16.f32','vcvttlo.f16.f32','vcvttmi.f16.f32','vcvttpl.f16.f32','vcvttvs.f16.f32','vcvttvc.f16.f32','vcvtthi.f16.f32','vcvttls.f16.f32','vcvttge.f16.f32','vcvttlt.f16.f32','vcvttgt.f16.f32','vcvttle.f16.f32',
+ 'vcvtteq.f32.f16','vcvttne.f32.f16','vcvttcs.f32.f16','vcvtths.f32.f16','vcvttcc.f32.f16','vcvttlo.f32.f16','vcvttmi.f32.f16','vcvttpl.f32.f16','vcvttvs.f32.f16','vcvttvc.f32.f16','vcvtthi.f32.f16','vcvttls.f32.f16','vcvttge.f32.f16','vcvttlt.f32.f16','vcvttgt.f32.f16','vcvttle.f32.f16',
+
+ 'vdiveq.f32','vdivne.f32','vdivcs.f32','vdivhs.f32','vdivcc.f32','vdivlo.f32','vdivmi.f32','vdivpl.f32','vdivvs.f32','vdivvc.f32','vdivhi.f32','vdivls.f32','vdivge.f32','vdivlt.f32','vdivgt.f32','vdivle.f32',
+ 'vdiveq.f64','vdivne.f64','vdivcs.f64','vdivhs.f64','vdivcc.f64','vdivlo.f64','vdivmi.f64','vdivpl.f64','vdivvs.f64','vdivvc.f64','vdivhi.f64','vdivls.f64','vdivge.f64','vdivlt.f64','vdivgt.f64','vdivle.f64',
+
+ 'vmaxeq.f32','vmaxne.f32','vmaxcs.f32','vmaxhs.f32','vmaxcc.f32','vmaxlo.f32','vmaxmi.f32','vmaxpl.f32','vmaxvs.f32','vmaxvc.f32','vmaxhi.f32','vmaxls.f32','vmaxge.f32','vmaxlt.f32','vmaxgt.f32','vmaxle.f32',
+ 'vmineq.f32','vminne.f32','vmincs.f32','vminhs.f32','vmincc.f32','vminlo.f32','vminmi.f32','vminpl.f32','vminvs.f32','vminvc.f32','vminhi.f32','vminls.f32','vminge.f32','vminlt.f32','vmingt.f32','vminle.f32',
+
+ 'vmlaeq.f32','vmlane.f32','vmlacs.f32','vmlahs.f32','vmlacc.f32','vmlalo.f32','vmlami.f32','vmlapl.f32','vmlavs.f32','vmlavc.f32','vmlahi.f32','vmlals.f32','vmlage.f32','vmlalt.f32','vmlagt.f32','vmlale.f32',
+ 'vmlaeq.f64','vmlane.f64','vmlacs.f64','vmlahs.f64','vmlacc.f64','vmlalo.f64','vmlami.f64','vmlapl.f64','vmlavs.f64','vmlavc.f64','vmlahi.f64','vmlals.f64','vmlage.f64','vmlalt.f64','vmlagt.f64','vmlale.f64',
+
+ 'vmlseq.f32','vmlsne.f32','vmlscs.f32','vmlshs.f32','vmlscc.f32','vmlslo.f32','vmlsmi.f32','vmlspl.f32','vmlsvs.f32','vmlsvc.f32','vmlshi.f32','vmlsls.f32','vmlsge.f32','vmlslt.f32','vmlsgt.f32','vmlsle.f32',
+ 'vmlseq.f64','vmlsne.f64','vmlscs.f64','vmlshs.f64','vmlscc.f64','vmlslo.f64','vmlsmi.f64','vmlspl.f64','vmlsvs.f64','vmlsvc.f64','vmlshi.f64','vmlsls.f64','vmlsge.f64','vmlslt.f64','vmlsgt.f64','vmlsle.f64',
+
+ 'vmuleq.f32','vmulne.f32','vmulcs.f32','vmulhs.f32','vmulcc.f32','vmullo.f32','vmulmi.f32','vmulpl.f32','vmulvs.f32','vmulvc.f32','vmulhi.f32','vmulls.f32','vmulge.f32','vmullt.f32','vmulgt.f32','vmulle.f32',
+ 'vmuleq.f64','vmulne.f64','vmulcs.f64','vmulhs.f64','vmulcc.f64','vmullo.f64','vmulmi.f64','vmulpl.f64','vmulvs.f64','vmulvc.f64','vmulhi.f64','vmulls.f64','vmulge.f64','vmullt.f64','vmulgt.f64','vmulle.f64',
+
+ 'vnegeq.f32','vnegne.f32','vnegcs.f32','vneghs.f32','vnegcc.f32','vneglo.f32','vnegmi.f32','vnegpl.f32','vnegvs.f32','vnegvc.f32','vneghi.f32','vnegls.f32','vnegge.f32','vneglt.f32','vneggt.f32','vnegle.f32',
+ 'vnegeq.f64','vnegne.f64','vnegcs.f64','vneghs.f64','vnegcc.f64','vneglo.f64','vnegmi.f64','vnegpl.f64','vnegvs.f64','vnegvc.f64','vneghi.f64','vnegls.f64','vnegge.f64','vneglt.f64','vneggt.f64','vnegle.f64',
+
+ 'vnmlaeq.f32','vnmlane.f32','vnmlacs.f32','vnmlahs.f32','vnmlacc.f32','vnmlalo.f32','vnmlami.f32','vnmlapl.f32','vnmlavs.f32','vnmlavc.f32','vnmlahi.f32','vnmlals.f32','vnmlage.f32','vnmlalt.f32','vnmlagt.f32','vnmlale.f32',
+ 'vnmlaeq.f64','vnmlane.f64','vnmlacs.f64','vnmlahs.f64','vnmlacc.f64','vnmlalo.f64','vnmlami.f64','vnmlapl.f64','vnmlavs.f64','vnmlavc.f64','vnmlahi.f64','vnmlals.f64','vnmlage.f64','vnmlalt.f64','vnmlagt.f64','vnmlale.f64',
+
+ 'vnmlseq.f32','vnmlsne.f32','vnmlscs.f32','vnmlshs.f32','vnmlscc.f32','vnmlslo.f32','vnmlsmi.f32','vnmlspl.f32','vnmlsvs.f32','vnmlsvc.f32','vnmlshi.f32','vnmlsls.f32','vnmlsge.f32','vnmlslt.f32','vnmlsgt.f32','vnmlsle.f32',
+ 'vnmlseq.f64','vnmlsne.f64','vnmlscs.f64','vnmlshs.f64','vnmlscc.f64','vnmlslo.f64','vnmlsmi.f64','vnmlspl.f64','vnmlsvs.f64','vnmlsvc.f64','vnmlshi.f64','vnmlsls.f64','vnmlsge.f64','vnmlslt.f64','vnmlsgt.f64','vnmlsle.f64',
+
+ 'vnmuleq.f64','vnmulne.f64','vnmulcs.f64','vnmulhs.f64','vnmulcc.f64','vnmullo.f64','vnmulmi.f64','vnmulpl.f64','vnmulvs.f64','vnmulvc.f64','vnmulhi.f64','vnmulls.f64','vnmulge.f64','vnmullt.f64','vnmulgt.f64','vnmulle.f64',
+ 'vnmuleq.f32','vnmulne.f32','vnmulcs.f32','vnmulhs.f32','vnmulcc.f32','vnmullo.f32','vnmulmi.f32','vnmulpl.f32','vnmulvs.f32','vnmulvc.f32','vnmulhi.f32','vnmulls.f32','vnmulge.f32','vnmullt.f32','vnmulgt.f32','vnmulle.f32',
+
+ 'vpaddeq.f32','vpaddne.f32','vpaddcs.f32','vpaddhs.f32','vpaddcc.f32','vpaddlo.f32','vpaddmi.f32','vpaddpl.f32','vpaddvs.f32','vpaddvc.f32','vpaddhi.f32','vpaddls.f32','vpaddge.f32','vpaddlt.f32','vpaddgt.f32','vpaddle.f32',
+
+ 'vpmaxeq.f32','vpmaxne.f32','vpmaxcs.f32','vpmaxhs.f32','vpmaxcc.f32','vpmaxlo.f32','vpmaxmi.f32','vpmaxpl.f32','vpmaxvs.f32','vpmaxvc.f32','vpmaxhi.f32','vpmaxls.f32','vpmaxge.f32','vpmaxlt.f32','vpmaxgt.f32','vpmaxle.f32',
+ 'vpmineq.f32','vpminne.f32','vpmincs.f32','vpminhs.f32','vpmincc.f32','vpminlo.f32','vpminmi.f32','vpminpl.f32','vpminvs.f32','vpminvc.f32','vpminhi.f32','vpminls.f32','vpminge.f32','vpminlt.f32','vpmingt.f32','vpminle.f32',
+
+ 'vrecpeeq.u32','vrecpene.u32','vrecpecs.u32','vrecpehs.u32','vrecpecc.u32','vrecpelo.u32','vrecpemi.u32','vrecpepl.u32','vrecpevs.u32','vrecpevc.u32','vrecpehi.u32','vrecpels.u32','vrecpege.u32','vrecpelt.u32','vrecpegt.u32','vrecpele.u32',
+ 'vrecpeeq.f32','vrecpene.f32','vrecpecs.f32','vrecpehs.f32','vrecpecc.f32','vrecpelo.f32','vrecpemi.f32','vrecpepl.f32','vrecpevs.f32','vrecpevc.f32','vrecpehi.f32','vrecpels.f32','vrecpege.f32','vrecpelt.f32','vrecpegt.f32','vrecpele.f32',
+ 'vrecpseq.f32','vrecpsne.f32','vrecpscs.f32','vrecpshs.f32','vrecpscc.f32','vrecpslo.f32','vrecpsmi.f32','vrecpspl.f32','vrecpsvs.f32','vrecpsvc.f32','vrecpshi.f32','vrecpsls.f32','vrecpsge.f32','vrecpslt.f32','vrecpsgt.f32','vrecpsle.f32',
+
+ 'vrsqrteeq.u32','vrsqrtene.u32','vrsqrtecs.u32','vrsqrtehs.u32','vrsqrtecc.u32','vrsqrtelo.u32','vrsqrtemi.u32','vrsqrtepl.u32','vrsqrtevs.u32','vrsqrtevc.u32','vrsqrtehi.u32','vrsqrtels.u32','vrsqrtege.u32','vrsqrtelt.u32','vrsqrtegt.u32','vrsqrtele.u32',
+ 'vrsqrteeq.f32','vrsqrtene.f32','vrsqrtecs.f32','vrsqrtehs.f32','vrsqrtecc.f32','vrsqrtelo.f32','vrsqrtemi.f32','vrsqrtepl.f32','vrsqrtevs.f32','vrsqrtevc.f32','vrsqrtehi.f32','vrsqrtels.f32','vrsqrtege.f32','vrsqrtelt.f32','vrsqrtegt.f32','vrsqrtele.f32',
+ 'vrsqrtseq.f32','vrsqrtsne.f32','vrsqrtscs.f32','vrsqrtshs.f32','vrsqrtscc.f32','vrsqrtslo.f32','vrsqrtsmi.f32','vrsqrtspl.f32','vrsqrtsvs.f32','vrsqrtsvc.f32','vrsqrtshi.f32','vrsqrtsls.f32','vrsqrtsge.f32','vrsqrtslt.f32','vrsqrtsgt.f32','vrsqrtsle.f32',
+
+ 'vsqrteq.f32','vsqrtne.f32','vsqrtcs.f32','vsqrths.f32','vsqrtcc.f32','vsqrtlo.f32','vsqrtmi.f32','vsqrtpl.f32','vsqrtvs.f32','vsqrtvc.f32','vsqrthi.f32','vsqrtls.f32','vsqrtge.f32','vsqrtlt.f32','vsqrtgt.f32','vsqrtle.f32',
+ 'vsqrteq.f64','vsqrtne.f64','vsqrtcs.f64','vsqrths.f64','vsqrtcc.f64','vsqrtlo.f64','vsqrtmi.f64','vsqrtpl.f64','vsqrtvs.f64','vsqrtvc.f64','vsqrthi.f64','vsqrtls.f64','vsqrtge.f64','vsqrtlt.f64','vsqrtgt.f64','vsqrtle.f64',
+
+ 'vsubeq.f32','vsubne.f32','vsubcs.f32','vsubhs.f32','vsubcc.f32','vsublo.f32','vsubmi.f32','vsubpl.f32','vsubvs.f32','vsubvc.f32','vsubhi.f32','vsubls.f32','vsubge.f32','vsublt.f32','vsubgt.f32','vsuble.f32',
+ 'vsubeq.f64','vsubne.f64','vsubcs.f64','vsubhs.f64','vsubcc.f64','vsublo.f64','vsubmi.f64','vsubpl.f64','vsubvs.f64','vsubvc.f64','vsubhi.f64','vsubls.f64','vsubge.f64','vsublt.f64','vsubgt.f64','vsuble.f64'
+ ),
+ /* Registers */
+ 35 => array(
+ /* General-Purpose Registers */
+ 'r0','r1','r2','r3','r4','r5','r6','r7',
+ 'r8','r9','r10','r11','r12','r13','r14','r15',
+ /* Scratch Registers */
+ 'a1','a2','a3','a4',
+ /* Variable Registers */
+ 'v1','v2','v3','v4','v5','v6','v7','v8',
+ /* Other Synonims for General-Purpose Registers */
+ 'sb','sl','fp','ip','sp','lr','pc',
+ /* WMMX Data Registers */
+ 'wr0','wr1','wr2','wr3','wr4','wr5','wr6','wr7',
+ 'wr8','wr9','wr10','wr11','wr12','wr13','wr14','wr15',
+ /* WMMX Control Registers */
+ 'wcid','wcon','wcssf','wcasf',
+ /* WMMX-Mapped General-Purpose Registers */
+ 'wcgr0','wcgr1','wcgr2','wcgr3',
+ /* VFPv3 Registers */
+ 's0','s1','s2','s3','s4','s5','s6','s7',
+ 's8','s9','s10','s11','s12','s13','s14','s15',
+ 's16','s17','s18','s19','s20','s21','s22','s23',
+ 's24','s25','s26','s27','s28','s29','s30','s31',
+ /* VFPv3/NEON Registers */
+ 'd0','d1','d2','d3','d4','d5','d6','d7',
+ 'd8','d9','d10','d11','d12','d13','d14','d15',
+ 'd16','d17','d18','d19','d20','d21','d22','d23',
+ 'd24','d25','d26','d27','d28','d29','d30','d31',
+ /* NEON Registers */
+ 'q0','q1','q2','q3','q4','q5','q6','q7',
+ 'q8','q9','q10','q11','q12','q13','q14','q15'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '[', ']', '(', ')',
+ '+', '-', '*', '/', '%',
+ '.', ',', ';', ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ 8 => false,
+ 9 => false,
+ 10 => false,
+ 11 => false,
+ 12 => false,
+ 13 => false,
+ 14 => false,
+ 15 => false,
+ 16 => false,
+ 17 => false,
+ 18 => false,
+ 19 => false,
+ 20 => false,
+ 21 => false,
+ 22 => false,
+ 23 => false,
+ 24 => false,
+ 25 => false,
+ 26 => false,
+ 27 => false,
+ 28 => false,
+ 29 => false,
+ 30 => false,
+ 31 => false,
+ 32 => false,
+ 33 => false,
+ 34 => false,
+ 35 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ /* Unconditional Data Processing Instructions */
+ 1 => 'color: #00007f; font-weight: normal; font-style: normal;',
+ /* Conditional Data Processing Instructions */
+ 2 => 'color: #00007f; font-weight: normal; font-style: italic;',
+ /* Unconditional Memory Access Instructions */
+ 3 => 'color: #00007f; font-weight: normal; font-style: normal;',
+ /* Conditional Memory Access Instructions */
+ 4 => 'color: #00007f; font-weight: normal; font-style: italic;',
+ /* Unconditional Flags Changing Instructions */
+ 5 => 'color: #00007f; font-weight: bold; font-style: normal;',
+ /* Conditional Flags Changing Instructions */
+ 6 => 'color: #00007f; font-weight: bold; font-style: italic;',
+ /* Unconditional Flow Control Instructions */
+ 7 => 'color: #0000ff; font-weight: normal; font-style: normal;',
+ /* Conditional Flow Control Instructions */
+ 8 => 'color: #0000ff; font-weight: normal; font-style: italic;',
+ /* Unconditional Syncronization Instructions */
+ 9 => 'color: #00007f; font-weight: normal; font-style: normal;',
+ /* Conditional Syncronization Instructions */
+ 10 => 'color: #00007f; font-weight: normal; font-style: italic;',
+ /* Unonditional ARMv6 SIMD */
+ 11 => 'color: #b00040; font-weight: normal; font-style: normal;',
+ /* Conditional ARMv6 SIMD */
+ 12 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional Coprocessor Instructions */
+ 13 => 'color: #00007f; font-weight: normal; font-style: normal;',
+ /* Conditional Coprocessor Instructions */
+ 14 => 'color: #00007f; font-weight: bold; font-style: italic;',
+ /* Unconditional System Instructions */
+ 15 => 'color: #00007f; font-weight: normal; font-style: normal;',
+ /* Conditional System Instructions */
+ 16 => 'color: #00007f; font-weight: bold; font-style: italic;',
+ /* Unconditional WMMX/WMMX2 SIMD Instructions */
+ 17 => 'color: #b00040; font-weight: normal; font-style: normal;',
+ /* Conditional WMMX/WMMX2 SIMD Instructions */
+ 18 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional VFPv3 & NEON SIMD Memory Access Instructions */
+ 19 => 'color: #b00040; font-weight: normal; font-style: normal;',
+ /* Unconditional NEON SIMD Logical Instructions */
+ 20 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional NEON SIMD ARM Registers Interop Instructions */
+ 21 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional NEON SIMD Bit/Byte-Level Instructions */
+ 22 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional NEON SIMD Universal Integer Instructions */
+ 23 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional NEON SIMD Signed Integer Instructions */
+ 24 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional NEON SIMD Unsigned Integer Instructions */
+ 25 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Unconditional VFPv3 & NEON SIMD Floating-Point Instructions */
+ 26 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional VFPv3 & NEON SIMD Memory Access Instructions */
+ 27 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional NEON SIMD Logical Instructions */
+ 28 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional NEON SIMD ARM Registers Interop Instructions */
+ 29 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional NEON SIMD Bit/Byte-Level Instructions */
+ 30 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional NEON SIMD Universal Integer Instructions */
+ 31 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional NEON SIMD Signed Integer Instructions */
+ 32 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional NEON SIMD Unsigned Integer Instructions */
+ 33 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Conditional VFPv3 & NEON SIMD Floating-Point Instructions */
+ 34 => 'color: #b00040; font-weight: normal; font-style: italic;',
+ /* Registers */
+ 35 => 'color: #46aa03; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #adadad; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+ 9 => '',
+ 10 => '',
+ 11 => '',
+ 12 => '',
+ 13 => '',
+ 14 => '',
+ 15 => '',
+ 16 => '',
+ 17 => '',
+ 18 => '',
+ 19 => '',
+ 20 => '',
+ 21 => '',
+ 22 => '',
+ 23 => '',
+ 24 => '',
+ 25 => '',
+ 26 => '',
+ 27 => '',
+ 28 => '',
+ 29 => '',
+ 30 => '',
+ 31 => '',
+ 32 => '',
+ 33 => '',
+ 34 => '',
+ 35 => ''
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_BIN_PREFIX_PERCENT |
+ GESHI_NUMBER_BIN_SUFFIX |
+ GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_HEX_SUFFIX |
+ GESHI_NUMBER_OCT_SUFFIX |
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F |
+ GESHI_NUMBER_FLT_SCI_ZERO,
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#>|^])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_<\|%])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/asm.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/asm.php
new file mode 100644
index 00000000..dd0a7ec5
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/asm.php
@@ -0,0 +1,603 @@
+<?php
+/*************************************************************************************
+ * asm.php
+ * -------
+ * Author: Tux (tux@inmail.cz)
+ * Copyright: (c) 2004 Tux (http://tux.a4.cz/),
+ * 2004-2009 Nigel McNie (http://qbnz.com/highlighter),
+ * 2009-2011 Benny Baumann (http://qbnz.com/highlighter),
+ * 2011 Dennis Yurichev (dennis@conus.info),
+ * 2011 Marat Dukhan (mdukhan3.at.gatech.dot.edu)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/07/27
+ *
+ * x86 Assembler language file for GeSHi.
+ * Based on the following documents:
+ * - "Intel64 and IA-32 Architectures Programmer's Reference Manual
+ * Volume 2 (2A & 2B): Instructions Set Reference, A-Z",
+ * Order Number 25383-039US, May 2011
+ * - "Intel Advanced Vector Extensions Programming Reference",
+ * Order Number 319433-011, June 2011
+ * - "AMD64 Architecture Programmer's Manual Volume 3:
+ * General-Purpose and System Instructions", Publication No. 24594,
+ * Revision 3.15, November 2009
+ * - "AMD64 Architecture Programmer's Manual Volume 4:
+ * 128-Bit and 256-Bit Media Instructions", Publication No. 26568,
+ * Revision 3.12, May 2011
+ * - "AMD64 Architecture Programmer's Manual Volume 5:
+ * 64-Bit Media and x87 Floating-Point Instructions",
+ * Publication No. 26569, Revision 3.11, December 2009
+ * - "AMD64 Technology Lightweight Profiling Specification",
+ * Publication No. 43724, Revision 3.08, August 2010
+ * - "Application Note 108: Cyrix Extended MMX Instruction Set"
+ * - "VIA Padlock Programming Guide", 3rd May 2005
+ * - http://en.wikipedia.org/wiki/X86_instruction_listings
+ * - NASM 2.10rc8 Online Documenation at
+ * http://www.nasm.us/xdoc/2.10rc8/html/nasmdoc0.html
+ * Color scheme is taken from SciTE. Previous versions of this file
+ * also used words from SciTE configuration file (based on NASM syntax)
+ *
+ * CHANGES
+ * -------
+ * 2011/10/07
+ * - Rearranged instructions and registers into groups
+ * - Updated to support the following extensions
+ * - CMOV, BMI1, BMI2, TBM, FSGSBASE
+ * - LZCNT, TZCNT, POPCNT, MOVBE, CRC32
+ * - MMX, MMX+, EMMX
+ * - 3dnow!, 3dnow!+, 3dnow! Geode, 3dnow! Prefetch
+ * - SSE, SSE2, SSE3, SSSE3, SSE4A, SSE4.1, SSE4.2
+ * - AVX, AVX2, XOP, FMA3, FMA4, CVT16
+ * - VMX, SVM
+ * - AES, PCLMULQDQ, Padlock, RDRAND
+ * - Updated NASM macros and directives
+ * 2010/07/01 (1.0.8.11)
+ * - Added MMX/SSE/new x86-64 registers, MMX/SSE (up to 4.2) instructions
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2004/11/27 (1.0.2)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.1)
+ * - Added support for URLs
+ * - Added binary and hexadecimal regexps
+ * 2004/08/05 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ASM',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ //Line address prefix suppression
+ 'COMMENT_REGEXP' => array(2 => "/^(?:[0-9a-f]{0,4}:)?[0-9a-f]{4}(?:[0-9a-f]{4})?/mi"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* General-Purpose */
+ 1 => array(
+ /* BCD instructions */
+ 'aaa','aad','aam','aas','daa','das',
+ /* Control flow instructions */
+ 'ja','jae','jb','jbe','jc','je','jg','jge','jl','jle','jmp','jna',
+ 'jnae','jnb','jnbe','jnc','jne','jng','jnge','jnl','jnle','jno','jnp','jns','jnz',
+ 'jo','jp','jpe','jpo','js','jz','jcxz','jecxz','jrcxz','loop','loope','loopne',
+ 'call','ret','enter','leave','syscall','sysenter','int','into',
+ /* Predicate instructions */
+ 'seta','setae','setb','setbe','setc','sete','setg','setge','setl','setle','setna',
+ 'setnae','setnb','setnbe','setnc','setne','setng','setnge','setnl','setnle','setno',
+ 'setnp','setns','setnz','seto','setp','setpe','setpo','sets','setz','salc',
+ /* Conditional move instructions */
+ 'cmovo','cmovno','cmovb','cmovc','cmovnae','cmovae','cmovnb','cmovnc','cmove','cmovz',
+ 'cmovne','cmovnz','cmovbe','cmovna','cmova','cmovnbe','cmovs','cmovns','cmovp','cmovpe',
+ 'cmovnp','cmovpo','cmovl','cmovnge','cmovge','cmovnl','cmovle','cmovng','cmovg','cmovnle',
+ /* ALU instructions */
+ 'add','sub','adc','sbb','neg','cmp','inc','dec','and','or','xor','not','test',
+ 'shl','shr','sal','sar','shld','shrd','rol','ror','rcl','rcr',
+ 'cbw','cwd','cwde','cdq','cdqe','cqo','bsf','bsr','bt','btc','btr','bts',
+ 'idiv','imul','div','mul','bswap','nop',
+ /* Memory instructions */
+ 'lea','mov','movsx','movsxd','movzx','xlatb','bound','xchg','xadd','cmpxchg','cmpxchg8b','cmpxchg16b',
+ /* Stack instructions */
+ 'push','pop','pusha','popa','pushad','popad','pushf','popf','pushfd','popfd','pushfq','popfq',
+ /* EFLAGS manipulations instructions */
+ 'clc','cld','stc','std','cmc','lahf','sahf',
+ /* Prefix instructions */
+ 'lock','rep','repe','repz','repne','repnz',
+ /* String instructions */
+ 'cmps','cmpsb','cmpsw',/*'cmpsd',*/ 'cmpsq', /*CMPSD conflicts with the SSE2 instructions of the same name*/
+ 'movs','movsb','movsw',/*'movsd',*/ 'movsq', /*MOVSD conflicts with the SSE2 instructions of the same name*/
+ 'scas','scasb','scasw','scasd','scasq',
+ 'stos','stosb','stosw','stosd','stosq',
+ 'lods','lodsb','lodsw','lodsd','lodsq',
+ /* Information instructions */
+ 'cpuid','rdtsc','rdtscp','rdpmc','xgetbv',
+ 'sgdt','sidt','sldt','smsw','str','lar',
+ /* LWP instructions */
+ 'llwpcb','slwpcb','lwpval','lwpins',
+ /* Instructions from miscellaneous extensions */
+ 'crc32','popcnt','lzcnt','tzcnt','movbe','pclmulqdq','rdrand',
+ /* FSGSBASE instructions */
+ 'rdfsbase','rdgsbase','wrfsbase','wrgsbase',
+ /* BMI1 instructions */
+ 'andn','bextr','blsi','blsmk','blsr',
+ /* BMI2 instructions */
+ 'bzhi','mulx','pdep','pext','rorx','sarx','shlx','shrx',
+ /* TBM instructions */
+ 'blcfill','blci','blcic','blcmsk','blcs','blsfill','blsic','t1mskc','tzmsk',
+ /* Legacy instructions */
+ 'arpl','ud2','lds','les','lfs','lgs','lss','lsl','verr','verw',
+ /* Privileged instructions */
+ 'cli','sti','clts','hlt','rsm','in','insb','insw','insd',
+ 'out','outsb','outsw','outsd','clflush','invd','invlpg','invpcid','wbinvd',
+ 'iret','iretd','iretq','sysexit','sysret','lidt','lgdt','lldt','lmsw','ltr',
+ 'monitor','mwait','rdmsr','wrmsr','swapgs',
+ 'fxsave','fxsave64','fxrstor','fxrstor64',
+ 'xsave','xsaveopt','xrstor','xsetbv','getsec',
+ /* VMX instructions */
+ 'invept','invvpid','vmcall','vmclear','vmlaunch','vmresume',
+ 'vmptrld','vmptrst','vmread','vmwrite','vmxoff','vmxon',
+ /* SVM (AMD-V) instructions */
+ 'invlpga','skinit','clgi','stgi','vmload','vmsave','vmmcall','vmrun'
+ ),
+ /*FPU*/
+ 2 => array(
+ 'f2xm1','fabs','fadd','faddp','fbld','fbstp','fchs','fclex','fcom','fcomp','fcompp','fdecstp',
+ 'fdisi','fdiv','fdivp','fdivr','fdivrp','feni','ffree','fiadd','ficom','ficomp','fidiv',
+ 'fidivr','fild','fimul','fincstp','finit','fist','fistp','fisub','fisubr','fld','fld1',
+ 'fldcw','fldenv','fldenvw','fldl2e','fldl2t','fldlg2','fldln2','fldpi','fldz','fmul',
+ 'fmulp','fnclex','fndisi','fneni','fninit','fnop','fnsave','fnsavew','fnstcw','fnstenv',
+ 'fnstenvw','fnstsw','fpatan','fprem','fptan','frndint','frstor','frstorw','fsave',
+ 'fsavew','fscale','fsqrt','fst','fstcw','fstenv','fstenvw','fstp','fstsw','fsub','fsubp',
+ 'fsubr','fsubrp','ftst','fwait','fxam','fxch','fxtract','fyl2x','fyl2xp1',
+ 'fsetpm','fcos','fldenvd','fnsaved','fnstenvd','fprem1','frstord','fsaved','fsin','fsincos',
+ 'fstenvd','fucom','fucomp','fucompp','ffreep',
+ /* FCMOV instructions */
+ 'fcomi','fcomip','fucomi','fucomip',
+ 'fcmovb','fcmove','fcmovbe','fcmovu','fcmovnb','fcmovne','fcmovnbe','fcmovnu',
+ /* SSE3 instructions */
+ 'fisttp'
+ ),
+ /*SIMD*/
+ 3 => array(
+ /* MMX instructions */
+ 'movd','movq',
+ 'paddb','paddw','paddd','paddsb','paddsw','paddusb','paddusw',
+ 'psubb','psubw','psubd','psubsb','psubsw','psubusb','psubusw',
+ 'pand','pandn','por','pxor',
+ 'pcmpeqb','pcmpeqd','pcmpeqw','pcmpgtb','pcmpgtd','pcmpgtw',
+ 'pmaddwd','pmulhw','pmullw',
+ 'psllw','pslld','psllq','psrlw','psrld','psrlq','psraw','psrad',
+ 'packuswb','packsswb','packssdw',
+ 'punpcklbw','punpcklwd','punpckldq','punpckhbw','punpckhwd','punpckhdq',
+ 'emms',
+ /* MMX+ instructions */
+ 'pavgb','pavgw',
+ 'pextrw','pinsrw','pmovmskb',
+ 'pmaxsw','pmaxub','pminsw','pminub',
+ 'pmulhuw','psadbw','pshufw',
+ 'prefetchnta','prefetcht0','prefetcht1','prefetcht2',
+ 'maskmovq','movntq','sfence',
+ /* EMMX instructions (only available on Cyrix MediaGXm) */
+ 'paddsiw','psubsiw',
+ /*'pmulhrw',*/'pmachriw','pmulhriw', /* PMULHRW conflicts with the 3dnow! instruction of the same name */
+ 'pmagw','pdistib','paveb',
+ 'pmvzb','pmvnzb','pmvlzb','pmvgezb',
+ /* 3dnow! instructions! */
+ 'pfacc','pfadd','pfsub','pfsubr','pfmul',
+ 'pfcmpeq','pfcmpge','pfcmpgt',
+ 'pfmax','pfmin',
+ 'pfrcp','pfrcpit1','pfrcpit2','pfrsqit1','pfrsqrt',
+ 'pi2fd','pf2id',
+ 'pavgusb','pmulhrw',
+ 'femms',
+ /* 3dnow!+ instructions */
+ 'pfnacc','pfpnacc','pi2fw','pf2iw','pswapd',
+ /* 3dnow! Geode instructions */
+ 'pfrsqrtv','pfrcpv',
+ /* 3dnow! Prefetch instructions */
+ 'prefetch','prefetchw',
+ /* SSE instructions */
+ 'addss','addps','subss','subps',
+ 'mulss','mulps','divss','divps','sqrtss','sqrtps',
+ 'rcpss','rcpps','rsqrtss','rsqrtps',
+ 'maxss','maxps','minss','minps',
+ 'cmpss','comiss','ucomiss','cmpps',
+ 'cmpeqss','cmpltss','cmpless','cmpunordss','cmpneqss','cmpnltss','cmpnless','cmpordss',
+ 'cmpeqps','cmpltps','cmpleps','cmpunordps','cmpneqps','cmpnltps','cmpnleps','cmpordps',
+ 'andnps','andps','orps','xorps',
+ 'cvtsi2ss','cvtss2si','cvttss2si',
+ 'cvtpi2ps','cvtps2pi','cvttps2pi',
+ 'movss','movlps','movhps','movlhps','movhlps','movaps','movups','movntps','movmskps',
+ 'shufps','unpckhps','unpcklps',
+ 'ldmxcsr','stmxcsr',
+ /* SSE2 instructions */
+ 'addpd','addsd','subpd','subsd',
+ 'mulsd','mulpd','divsd','divpd','sqrtsd','sqrtpd',
+ 'maxsd','maxpd','minsd','minpd',
+ 'cmpsd','comisd','ucomisd','cmppd',
+ 'cmpeqsd','cmpltsd','cmplesd','cmpunordsd','cmpneqsd','cmpnltsd','cmpnlesd','cmpordsd',
+ 'cmpeqpd','cmpltpd','cmplepd','cmpunordpd','cmpneqpd','cmpnltpd','cmpnlepd','cmpordpd',
+ 'andnpd','andpd','orpd','xorpd',
+ 'cvtsd2ss','cvtpd2ps','cvtss2sd','cvtps2pd',
+ 'cvtdq2ps','cvtps2dq','cvttps2dq',
+ 'cvtdq2pd','cvtpd2dq','cvttpd2dq',
+ 'cvtsi2sd','cvtsd2si','cvttsd2si',
+ 'cvtpi2pd','cvtpd2pi','cvttpd2pi',
+ 'movsd','movlpd','movhpd','movapd','movupd','movntpd','movmskpd',
+ 'shufpd','unpckhpd','unpcklpd',
+ 'movnti','movdqa','movdqu','movntdq','maskmovdqu',
+ 'movdq2q','movq2dq',
+ 'paddq','psubq','pmuludq',
+ 'pslldq','psrldq',
+ 'punpcklqdq','punpckhqdq',
+ 'pshufhw','pshuflw','pshufd',
+ 'lfence','mfence',
+ /* SSE3 instructions */
+ 'addsubps','addsubpd',
+ 'haddps','haddpd','hsubps','hsubpd',
+ 'movsldup','movshdup','movddup',
+ 'lddqu',
+ /* SSSE3 instructions */
+ 'psignb','psignw','psignd',
+ 'pabsb','pabsw','pabsd',
+ 'palignr','pshufb',
+ 'pmulhrsw','pmaddubsw',
+ 'phaddw','phaddd','phaddsw',
+ 'phsubw','phsubd','phsubsw',
+ /* SSE4A instructions */
+ 'extrq','insertq','movntsd','movntss',
+ /* SSE4.1 instructions */
+ 'mpsadbw','phminposuw',
+ 'pmuldq','pmulld',
+ 'dpps','dppd',
+ 'blendps','blendpd','blendvps','blendvpd','pblendvb','pblendw',
+ 'pmaxsb','pmaxuw','pmaxsd','pmaxud','pminsb','pminuw','pminsd','pminud',
+ 'roundps','roundss','roundpd','roundsd',
+ 'insertps','pinsrb','pinsrd','pinsrq',
+ 'extractps','pextrb','pextrd','pextrq',
+ 'pmovsxbw','pmovsxbd','pmovsxbq','pmovsxwd','pmovsxwq','pmovsxdq',
+ 'pmovzxbw','pmovzxbd','pmovzxbq','pmovzxwd','pmovzxwq','pmovzxdq',
+ 'ptest',
+ 'pcmpeqq',
+ 'packusdw',
+ 'movntdqa',
+ /* SSE4.2 instructions */
+ 'pcmpgtq',
+ 'pcmpestri','pcmpestrm','pcmpistri','pcmpistrm',
+ /* AES instructions */
+ 'aesenc','aesenclast','aesdec','aesdeclast','aeskeygenassist','aesimc',
+ /* VIA Padlock instructions */
+ 'xcryptcbc','xcryptcfb','xcryptctr','xcryptecb','xcryptofb',
+ 'xsha1','xsha256','montmul','xstore',
+ /* AVX instructions */
+ 'vaddss','vaddps','vaddsd','vaddpd','vsubss','vsubps','vsubsd','vsubpd',
+ 'vaddsubps','vaddsubpd',
+ 'vhaddps','vhaddpd','vhsubps','vhsubpd',
+ 'vmulss','vmulps','vmulsd','vmulpd',
+ 'vmaxss','vmaxps','vmaxsd','vmaxpd','vminss','vminps','vminsd','vminpd',
+ 'vandps','vandpd','vandnps','vandnpd','vorps','vorpd','vxorps','vxorpd',
+ 'vblendps','vblendpd','vblendvps','vblendvpd',
+ 'vcmpss','vcomiss','vucomiss','vcmpsd','vcomisd','vucomisd','vcmpps','vcmppd',
+ 'vcmpeqss','vcmpltss','vcmpless','vcmpunordss','vcmpneqss','vcmpnltss','vcmpnless','vcmpordss',
+ 'vcmpeq_uqss','vcmpngess','vcmpngtss','vcmpfalsess','vcmpneq_oqss','vcmpgess','vcmpgtss','vcmptruess',
+ 'vcmpeq_osss','vcmplt_oqss','vcmple_oqss','vcmpunord_sss','vcmpneq_usss','vcmpnlt_uqss','vcmpnle_uqss','vcmpord_sss',
+ 'vcmpeq_usss','vcmpnge_uqss','vcmpngt_uqss','vcmpfalse_osss','vcmpneq_osss','vcmpge_oqss','vcmpgt_oqss','vcmptrue_usss',
+ 'vcmpeqps','vcmpltps','vcmpleps','vcmpunordps','vcmpneqps','vcmpnltps','vcmpnleps','vcmpordps',
+ 'vcmpeq_uqps','vcmpngeps','vcmpngtps','vcmpfalseps','vcmpneq_oqps','vcmpgeps','vcmpgtps','vcmptrueps',
+ 'vcmpeq_osps','vcmplt_oqps','vcmple_oqps','vcmpunord_sps','vcmpneq_usps','vcmpnlt_uqps','vcmpnle_uqps','vcmpord_sps',
+ 'vcmpeq_usps','vcmpnge_uqps','vcmpngt_uqps','vcmpfalse_osps','vcmpneq_osps','vcmpge_oqps','vcmpgt_oqps','vcmptrue_usps',
+ 'vcmpeqsd','vcmpltsd','vcmplesd','vcmpunordsd','vcmpneqsd','vcmpnltsd','vcmpnlesd','vcmpordsd',
+ 'vcmpeq_uqsd','vcmpngesd','vcmpngtsd','vcmpfalsesd','vcmpneq_oqsd','vcmpgesd','vcmpgtsd','vcmptruesd',
+ 'vcmpeq_ossd','vcmplt_oqsd','vcmple_oqsd','vcmpunord_ssd','vcmpneq_ussd','vcmpnlt_uqsd','vcmpnle_uqsd','vcmpord_ssd',
+ 'vcmpeq_ussd','vcmpnge_uqsd','vcmpngt_uqsd','vcmpfalse_ossd','vcmpneq_ossd','vcmpge_oqsd','vcmpgt_oqsd','vcmptrue_ussd',
+ 'vcmpeqpd','vcmpltpd','vcmplepd','vcmpunordpd','vcmpneqpd','vcmpnltpd','vcmpnlepd','vcmpordpd',
+ 'vcmpeq_uqpd','vcmpngepd','vcmpngtpd','vcmpfalsepd','vcmpneq_oqpd','vcmpgepd','vcmpgtpd','vcmptruepd',
+ 'vcmpeq_ospd','vcmplt_oqpd','vcmple_oqpd','vcmpunord_spd','vcmpneq_uspd','vcmpnlt_uqpd','vcmpnle_uqpd','vcmpord_spd',
+ 'vcmpeq_uspd','vcmpnge_uqpd','vcmpngt_uqpd','vcmpfalse_ospd','vcmpneq_ospd','vcmpge_oqpd','vcmpgt_oqpd','vcmptrue_uspd',
+ 'vcvtsd2ss','vcvtpd2ps','vcvtss2sd','vcvtps2pd',
+ 'vcvtsi2ss','vcvtss2si','vcvttss2si',
+ 'vcvtpi2ps','vcvtps2pi','vcvttps2pi',
+ 'vcvtdq2ps','vcvtps2dq','vcvttps2dq',
+ 'vcvtdq2pd','vcvtpd2dq','vcvttpd2dq',
+ 'vcvtsi2sd','vcvtsd2si','vcvttsd2si',
+ 'vcvtpi2pd','vcvtpd2pi','vcvttpd2pi',
+ 'vdivss','vdivps','vdivsd','vdivpd','vsqrtss','vsqrtps','vsqrtsd','vsqrtpd',
+ 'vdpps','vdppd',
+ 'vmaskmovps','vmaskmovpd',
+ 'vmovss','vmovsd','vmovaps','vmovapd','vmovups','vmovupd','vmovntps','vmovntpd',
+ 'vmovhlps','vmovlhps','vmovlps','vmovlpd','vmovhps','vmovhpd',
+ 'vmovsldup','vmovshdup','vmovddup',
+ 'vmovmskps','vmovmskpd',
+ 'vroundss','vroundps','vroundsd','vroundpd',
+ 'vrcpss','vrcpps','vrsqrtss','vrsqrtps',
+ 'vunpcklps','vunpckhps','vunpcklpd','vunpckhpd',
+ 'vbroadcastss','vbroadcastsd','vbroadcastf128',
+ 'vextractps','vinsertps','vextractf128','vinsertf128',
+ 'vshufps','vshufpd','vpermilps','vpermilpd','vperm2f128',
+ 'vtestps','vtestpd',
+ 'vpaddb','vpaddusb','vpaddsb','vpaddw','vpaddusw','vpaddsw','vpaddd','vpaddq',
+ 'vpsubb','vpsubusb','vpsubsb','vpsubw','vpsubusw','vpsubsw','vpsubd','vpsubq',
+ 'vphaddw','vphaddsw','vphaddd','vphsubw','vphsubsw','vphsubd',
+ 'vpsllw','vpslld','vpsllq','vpsrlw','vpsrld','vpsrlq','vpsraw','vpsrad',
+ 'vpand','vpandn','vpor','vpxor',
+ 'vpblendwb','vpblendw',
+ 'vpsignb','vpsignw','vpsignd',
+ 'vpavgb','vpavgw',
+ 'vpabsb','vpabsw','vpabsd',
+ 'vmovd','vmovq','vmovdqa','vmovdqu','vlddqu','vmovntdq','vmovntdqa','vmaskmovdqu',
+ 'vpmovsxbw','vpmovsxbd','vpmovsxbq','vpmovsxwd','vpmovsxwq','vpmovsxdq',
+ 'vpmovzxbw','vpmovzxbd','vpmovzxbq','vpmovzxwd','vpmovzxwq','vpmovzxdq',
+ 'vpackuswb','vpacksswb','vpackusdw','vpackssdw',
+ 'vpcmpeqb','vpcmpeqw','vpcmpeqd','vpcmpeqq','vpcmpgtb','vpcmpgtw','vpcmpgtd','vpcmpgtq',
+ 'vpmaddubsw','vpmaddwd',
+ 'vpmullw','vpmulhuw','vpmulhw','vpmulhrsw','vpmulld','vpmuludq','vpmuldq',
+ 'vpmaxub','vpmaxsb','vpmaxuw','vpmaxsw','vpmaxud','vpmaxsd',
+ 'vpminub','vpminsb','vpminuw','vpminsw','vpminud','vpminsd',
+ 'vpmovmskb','vptest',
+ 'vpunpcklbw','vpunpcklwd','vpunpckldq','vpunpcklqdq',
+ 'vpunpckhbw','vpunpckhwd','vpunpckhdq','vpunpckhqdq',
+ 'vpslldq','vpsrldq','vpalignr',
+ 'vpshufb','vpshuflw','vpshufhw','vpshufd',
+ 'vpextrb','vpextrw','vpextrd','vpextrq','vpinsrb','vpinsrw','vpinsrd','vpinsrq',
+ 'vpsadbw','vmpsadbw','vphminposuw',
+ 'vpcmpestri','vpcmpestrm','vpcmpistri','vpcmpistrm',
+ 'vpclmulqdq','vaesenc','vaesenclast','vaesdec','vaesdeclast','vaeskeygenassist','vaesimc',
+ 'vldmxcsr','vstmxcsr','vzeroall','vzeroupper',
+ /* AVX2 instructions */
+ 'vbroadcasti128','vpbroadcastb','vpbroadcastw','vpbroadcastd','vpbroadcastq',
+ 'vpblendd',
+ 'vpermd','vpermq','vperm2i128',
+ 'vextracti128','vinserti128',
+ 'vpmaskmovd','vpmaskmovq',
+ 'vpsllvd','vpsllvq','vpsravd','vpsrlvd',
+ 'vpgatherdd','vpgatherqd','vgatherdq','vgatherqq',
+ 'vpermps','vpermpd',
+ 'vgatherdpd','vgatherqpd','vgatherdps','vgatherqps',
+ /* XOP instructions */
+ 'vfrczss','vfrczps','vfrczsd','vfrczpd',
+ 'vpermil2ps','vperlil2pd',
+ 'vpcomub','vpcomb','vpcomuw','vpcomw','vpcomud','vpcomd','vpcomuq','vpcomq',
+ 'vphaddubw','vphaddbw','vphaddubd','vphaddbd','vphaddubq','vphaddbq',
+ 'vphadduwd','vphaddwd','vphadduwq','vphaddwq','vphaddudq','vphadddq',
+ 'vphsubbw','vphsubwd','vphsubdq',
+ 'vpmacsdd','vpmacssdd','vpmacsdql','vpmacssdql','vpmacsdqh','vpmacssdqh',
+ 'vpmacsww','vpmacssww','vpmacswd','vpmacsswd',
+ 'vpmadcswd','vpmadcsswd',
+ 'vpcmov','vpperm',
+ 'vprotb','vprotw','vprotd','vprotq',
+ 'vpshab','vpshaw','vpshad','vpshaq',
+ 'vpshlb','vpshlw','vpshld','vpshlq',
+ /* CVT16 instructions */
+ 'vcvtph2ps','vcvtps2ph',
+ /* FMA4 instructions */
+ 'vfmaddss','vfmaddps','vfmaddsd','vfmaddpd',
+ 'vfmsubss','vfmsubps','vfmsubsd','vfmsubpd',
+ 'vnfmaddss','vnfmaddps','vnfmaddsd','vnfmaddpd',
+ 'vnfmsubss','vnfmsubps','vnfmsubsd','vnfmsubpd',
+ 'vfmaddsubps','vfmaddsubpd','vfmsubaddps','vfmsubaddpd',
+ /* FMA3 instructions */
+ 'vfmadd132ss','vfmadd213ss','vfmadd231ss',
+ 'vfmadd132ps','vfmadd213ps','vfmadd231ps',
+ 'vfmadd132sd','vfmadd213sd','vfmadd231sd',
+ 'vfmadd132pd','vfmadd213pd','vfmadd231pd',
+ 'vfmaddsub132ps','vfmaddsub213ps','vfmaddsub231ps',
+ 'vfmaddsub132pd','vfmaddsub213pd','vfmaddsub231pd',
+ 'vfmsubadd132ps','vfmsubadd213ps','vfmsubadd231ps',
+ 'vfmsubadd132pd','vfmsubadd213pd','vfmsubadd231pd',
+ 'vfmsub132ss','vfmsub213ss','vfmsub231ss',
+ 'vfmsub132ps','vfmsub213ps','vfmsub231ps',
+ 'vfmsub132sd','vfmsub213sd','vfmsub231sd',
+ 'vfmsub132pd','vfmsub213pd','vfmsub231pd',
+ 'vfnmadd132ss','vfnmadd213ss','vfnmadd231ss',
+ 'vfnmadd132ps','vfnmadd213ps','vfnmadd231ps',
+ 'vfnmadd132sd','vfnmadd213sd','vfnmadd231sd',
+ 'vfnmadd132pd','vfnmadd213pd','vfnmadd231pd',
+ 'vfnmsub132ss','vfnmsub213ss','vfnmsub231ss',
+ 'vfnmsub132ps','vfnmsub213ps','vfnmsub231ps',
+ 'vfnmsub132sd','vfnmsub213sd','vfnmsub231sd',
+ 'vfnmsub132pd','vfnmsub213pd','vfnmsub231pd'
+ ),
+ /*registers*/
+ 4 => array(
+ /* General-Purpose Registers */
+ 'al','ah','bl','bh','cl','ch','dl','dh','sil','dil','bpl','spl',
+ 'r8b','r9b','r10b','r11b','r12b','r13b','r14b','r15b',
+ 'ax','bx','cx','dx','si','di','bp','sp',
+ 'r8w','r9w','r10w','r11w','r12w','r13w','r14w','r15w',
+ 'eax','ebx','ecx','edx','esi','edi','ebp','esp',
+ 'r8d','r9d','r10d','r11d','r12d','r13d','r14d','r15d',
+ 'rax','rcx','rdx','rbx','rsp','rbp','rsi','rdi',
+ 'r8','r9','r10','r11','r12','r13','r14','r15',
+ /* Debug Registers */
+ 'dr0','dr1','dr2','dr3','dr6','dr7',
+ /* Control Registers */
+ 'cr0','cr2','cr3','cr4','cr8',
+ /* Test Registers (Supported on Intel 486 only) */
+ 'tr3','tr4','tr5','tr6','tr7',
+ /* Segment Registers */
+ 'cs','ds','es','fs','gs','ss',
+ /* FPU Registers */
+ 'st','st0','st1','st2','st3','st4','st5','st6','st7',
+ /* MMX Registers */
+ 'mm0','mm1','mm2','mm3','mm4','mm5','mm6','mm7',
+ /* SSE Registers */
+ 'xmm0','xmm1','xmm2','xmm3','xmm4','xmm5','xmm6','xmm7',
+ 'xmm8','xmm9','xmm10','xmm11','xmm12','xmm13','xmm14','xmm15',
+ /* AVX Registers */
+ 'ymm0','ymm1','ymm2','ymm3','ymm4','ymm5','ymm6','ymm7',
+ 'ymm8','ymm9','ymm10','ymm11','ymm12','ymm13','ymm14','ymm15'
+ ),
+ /*Directive*/
+ 5 => array(
+ 'db','dw','dd','dq','dt','do','dy',
+ 'resb','resw','resd','resq','rest','reso','resy','incbin','equ','times','safeseh',
+ '__utf16__','__utf32__',
+ 'default','cpu','float','start','imagebase','osabi',
+ '..start','..imagebase','..gotpc','..gotoff','..gottpoff','..got','..plt','..sym','..tlsie',
+ 'section','segment','__sect__','group','absolute',
+ '.bss','.comment','.data','.lbss','.ldata','.lrodata','.rdata','.rodata','.tbss','.tdata','.text',
+ 'alloc','bss','code','exec','data','noalloc','nobits','noexec','nowrite','progbits','rdata','tls','write',
+ 'private','public','common','stack','overlay','class',
+ 'extern','global','import','export',
+ '%define','%idefine','%xdefine','%ixdefine','%assign','%undef',
+ '%defstr','%idefstr','%deftok','%ideftok',
+ '%strcat','%strlen','%substr',
+ '%macro','%imacro','%rmacro','%exitmacro','%endmacro','%unmacro',
+ '%if','%ifn','%elif','%elifn','%else','%endif',
+ '%ifdef','%ifndef','%elifdef','%elifndef',
+ '%ifmacro','%ifnmacro','%elifmacro','%elifnmacro',
+ '%ifctx','%ifnctx','%elifctx','%elifnctx',
+ '%ifidn','%ifnidn','%elifidn','%elifnidn',
+ '%ifidni','%ifnidni','%elifidni','%elifnidni',
+ '%ifid','%ifnid','%elifid','%elifnid',
+ '%ifnum','%ifnnum','%elifnum','%elifnnum',
+ '%ifstr','%ifnstr','%elifstr','%elifnstr',
+ '%iftoken','%ifntoken','%eliftoken','%elifntoken',
+ '%ifempty','%ifnempty','%elifempty','%elifnempty',
+ '%ifenv','%ifnenv','%elifenv','%elifnenv',
+ '%rep','%exitrep','%endrep',
+ '%while','%exitwhile','%endwhile',
+ '%include','%pathsearch','%depend','%use',
+ '%push','%pop','%repl','%arg','%local','%stacksize','flat','flat64','large','small',
+ '%error','%warning','%fatal',
+ '%00','.nolist','%rotate','%line','%!','%final','%clear',
+ 'struc','endstruc','istruc','at','iend',
+ 'align','alignb','sectalign',
+ 'bits','use16','use32','use64',
+ '__nasm_major__','__nasm_minor__','__nasm_subminor__','___nasm_patchlevel__',
+ '__nasm_version_id__','__nasm_ver__',
+ '__file__','__line__','__pass__','__bits__','__output_format__',
+ '__date__','__time__','__date_num__','__time_num__','__posix_time__',
+ '__utc_date__','__utc_time__','__utc_date_num__','__utc_time_num__',
+ '__float_daz__','__float_round__','__float__',
+ /* Keywords from standard packages */
+ '__use_altreg__',
+ '__use_smartalign__','smartalign','__alignmode__',
+ '__use_fp__','__infinity__','__nan__','__qnan__','__snan__',
+ '__float8__','__float16__','__float32__','__float64__','__float80m__','__float80e__','__float128l__','__float128h__'
+ ),
+ /*Operands*/
+ 6 => array(
+ 'a16','a32','a64','o16','o32','o64','strict',
+ 'byte','word','dword','qword','tword','oword','yword','nosplit',
+ '%0','%1','%2','%3','%4','%5','%6','%7','%8','%9',
+ 'abs','rel',
+ 'seg','wrt'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '[', ']', '(', ')',
+ '+', '-', '*', '/', '%',
+ '.', ',', ';', ':'
+ ),
+ 2 => array(
+ '$','$$','%+','%?','%??'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00007f; font-weight: bold;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #b00040;',
+ 4 => 'color: #46aa03; font-weight: bold;',
+ 5 => 'color: #0000ff; font-weight: bold;',
+ 6 => 'color: #0000ff; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #adadad; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;',
+ 2 => 'color: #0000ff; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => ''
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_BIN_PREFIX_PERCENT |
+ GESHI_NUMBER_BIN_SUFFIX |
+ GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_HEX_SUFFIX |
+ GESHI_NUMBER_OCT_SUFFIX |
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F |
+ GESHI_NUMBER_FLT_SCI_ZERO,
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#>|^])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_<\|%])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/asp.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/asp.php
new file mode 100644
index 00000000..0096a169
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/asp.php
@@ -0,0 +1,164 @@
+<?php
+/*************************************************************************************
+ * asp.php
+ * --------
+ * Author: Amit Gupta (http://blog.igeek.info/)
+ * Copyright: (c) 2004 Amit Gupta (http://blog.igeek.info/), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/08/13
+ *
+ * ASP language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/12/30 (1.0.3)
+ * - Strings only delimited by ", comments by '
+ * 2004/11/27 (1.0.2)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.1)
+ * - Added support for URLs
+ * 2004/08/13 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ * * Include all the functions, keywords etc that I have missed
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ASP',
+ 'COMMENT_SINGLE' => array(1 => "'", 2 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'include', 'file', 'Const', 'Dim', 'Option', 'Explicit', 'Implicit', 'Set', 'Select', 'ReDim', 'Preserve',
+ 'ByVal', 'ByRef', 'End', 'Private', 'Public', 'If', 'Then', 'Else', 'ElseIf', 'Case', 'With', 'NOT',
+ 'While', 'Wend', 'For', 'Loop', 'Do', 'Request', 'Response', 'Server', 'ADODB', 'Session', 'Application',
+ 'Each', 'In', 'Get', 'Next', 'INT', 'CINT', 'CBOOL', 'CDATE', 'CBYTE', 'CCUR', 'CDBL', 'CLNG', 'CSNG',
+ 'CSTR', 'Fix', 'Is', 'Sgn', 'String', 'Boolean', 'Currency', 'Me', 'Single', 'Long', 'Integer', 'Byte',
+ 'Variant', 'Double', 'To', 'Let', 'Xor', 'Resume', 'On', 'Error', 'Imp', 'GoTo', 'Call', 'Global'
+ ),
+ 2 => array(
+ 'Null', 'Nothing', 'And',
+ 'False',
+ 'True', 'var', 'Or', 'BOF', 'EOF', 'xor',
+ 'Function', 'Class', 'New', 'Sub'
+ ),
+ 3 => array(
+ 'CreateObject', 'Write', 'Redirect', 'Cookies', 'BinaryRead', 'ClientCertificate', 'Form', 'QueryString',
+ 'ServerVariables', 'TotalBytes', 'AddHeader', 'AppendToLog', 'BinaryWrite', 'Buffer', 'CacheControl',
+ 'Charset', 'Clear', 'ContentType', 'End()', 'Expires', 'ExpiresAbsolute', 'Flush()', 'IsClientConnected',
+ 'PICS', 'Status', 'Connection', 'Recordset', 'Execute', 'Abandon', 'Lock', 'UnLock', 'Command', 'Fields',
+ 'Properties', 'Property', 'Send', 'Replace', 'InStr', 'TRIM', 'NOW', 'Day', 'Month', 'Hour', 'Minute', 'Second',
+ 'Year', 'MonthName', 'LCase', 'UCase', 'Abs', 'Array', 'As', 'LEN', 'MoveFirst', 'MoveLast', 'MovePrevious',
+ 'MoveNext', 'LBound', 'UBound', 'Transfer', 'Open', 'Close', 'MapPath', 'FileExists', 'OpenTextFile', 'ReadAll'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '<%', '%>'
+ ),
+ 0 => array(
+ '(', ')', '[', ']', '!', '@', '%', '&', '*', '|', '/', '<', '>',
+ ';', ':', '?', '='),
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #990099; font-weight: bold;',
+ 2 => 'color: #0000ff; font-weight: bold;',
+ 3 => 'color: #330066;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000;',
+ 2 => 'color: #ff6600;',
+ 'MULTI' => 'color: #008000;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #006600; font-weight:bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #cc0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #800000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #9900cc;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #006600; font-weight: bold;',
+ 1 => 'color: #000000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<%' => '%>'
+ ),
+ 1 => array(
+ '<script language="vbscript" runat="server">' => '</script>'
+ ),
+ 2 => array(
+ '<script language="javascript" runat="server">' => '</script>'
+ ),
+ 3 => "/(?P<start><%=?)(?:\"[^\"]*?\"|\/\*(?!\*\/).*?\*\/|.)*?(?P<end>%>|\Z)/sm"
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/asymptote.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/asymptote.php
new file mode 100644
index 00000000..8683588e
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/asymptote.php
@@ -0,0 +1,194 @@
+<?php
+/*************************************************************************************
+ * asymptote.php
+ * -------------
+ * Author: Manuel Yguel (manuel.yguel.robotics@gmail.com)
+ * Copyright: (c) 2012 Manuel Yguel (http://manuelyguel.eu)
+ * Release Version: 1.0.8.11
+ * Date Started: 2012/05/24
+ *
+ * asymptote language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/05/24 (1.0.0.0)
+ * - First Release
+ *
+ * TODO (updated 2012/05/24)
+ * -------------------------
+ * * Split to several files - php4, php5 etc
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'asymptote',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Multiline-continued single-line comments
+ 1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Multiline-continued preprocessor define
+ 2 => '/#(?:\\\\\\\\|\\\\\\n|.)*$/m'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[\\\\abfnrtv\'\"?\n]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{2}#",
+ //Hexadecimal Char Specs
+ 3 => "#\\\\u[\da-fA-F]{4}#",
+ //Hexadecimal Char Specs
+ 4 => "#\\\\U[\da-fA-F]{8}#",
+ //Octal Char Specs
+ 5 => "#\\\\[0-7]{1,3}#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'and','controls','tension','atleast','curl','if','else','while','for','do','return','break','continue','struct','typedef','new','access','import','unravel','from','include','quote','static','public','private','restricted','this','explicit','true','false','null','cycle','newframe','operator'
+ ),
+ 2 => array(
+ 'Braid','FitResult','Label','Legend','Segment','Solution','TreeNode','abscissa','arc','arrowhead','binarytree','binarytreeNode','block','bool','bool3','bounds','bqe','circle','conic','coord','coordsys','cputime','ellipse','file','filltype','frame','grid3','guide','horner','hsv','hyperbola','indexedTransform','int','inversion','key','light','line','linefit','marginT','marker','mass','object','pair','parabola','path','path3','pen','picture','point','position','projection','real','revolution','scaleT','scientific','segment','side','slice','solution','splitface','string','surface','tensionSpecifier','ticklocate','ticksgridT','tickvalues','transform','transformation','tree','triangle','trilinear','triple','vector','vertex','void'),
+ 3 => array(
+ 'AND','Arc','ArcArrow','ArcArrows','Arrow','Arrows','Automatic','AvantGarde','BBox','BWRainbow','BWRainbow2','Bar','Bars','BeginArcArrow','BeginArrow','BeginBar','BeginDotMargin','BeginMargin','BeginPenMargin','Blank','Bookman','Bottom','BottomTop','Bounds','Break','Broken','BrokenLog','CLZ','CTZ','Ceil','Circle','CircleBarIntervalMarker','Cos','Courier','CrossIntervalMarker','DOSendl','DOSnewl','DefaultFormat','DefaultLogFormat','Degrees','Dir','DotMargin','DotMargins','Dotted','Draw','Drawline','Embed','EndArcArrow','EndArrow','EndBar','EndDotMargin','EndMargin','EndPenMargin','Fill','FillDraw','Floor','Format','Full','Gaussian','Gaussrand','Gaussrandpair',
+ 'Gradient','Grayscale','Helvetica','Hermite','HookHead','InOutTicks','InTicks','Jn','Label','Landscape','Left','LeftRight','LeftTicks','Legend','Linear','Link','Log','LogFormat','Margin','Margins','Mark','MidArcArrow','MidArrow','NOT','NewCenturySchoolBook','NoBox','NoMargin','NoModifier','NoTicks','NoTicks3','NoZero','NoZeroFormat','None','OR','OmitFormat','OmitTick','OmitTickInterval','OmitTickIntervals','OutTicks','Ox','Oy','Palatino','PaletteTicks','Pen','PenMargin','PenMargins','Pentype','Portrait','RadialShade','RadialShadeDraw','Rainbow','Range','Relative','Right','RightTicks','Rotate','Round','SQR','Scale','ScaleX','ScaleY','ScaleZ','Seascape','Segment','Shift','Sin','Slant','Spline','StickIntervalMarker','Straight','Symbol','Tan','TeXify','Ticks','Ticks3','TildeIntervalMarker','TimesRoman','Top','TrueMargin','UnFill','UpsideDown','Wheel','X','XEquals','XOR','XY','XYEquals','XYZero','XYgrid','XZEquals','XZZero','XZero','XZgrid','Y','YEquals','YXgrid','YZ','YZEquals','YZZero','YZero','YZgrid','Yn','Z','ZX','ZXgrid','ZYgrid','ZapfChancery','ZapfDingbats','_begingroup3','_cputime','_draw','_eval','_image','_labelpath','_projection','_strokepath','_texpath','aCos','aSin','aTan','abort','abs','accel','acos','acosh','acot','acsc','activatequote','add',
+ 'addArrow','addMargins','addSaveFunction','addpenarc','addpenline','adjust','alias','align','all','altitude','angabscissa','angle','angpoint','animate','annotate','anticomplementary','antipedal','apply','approximate','arc','arcarrowsize','arccircle','arcdir','arcfromcenter','arcfromfocus','arclength','arcnodesnumber','arcpoint','arcsubtended','arcsubtendedcenter','arctime','arctopath','array','arrow','arrow2','arrowbase','arrowbasepoints','arrowsize','asec','asin','asinh','ask','assert','asy','asycode','asydir','asyfigure','asyfilecode','asyinclude','asywrite','atan','atan2','atanh','atbreakpoint','atexit','attach','attract','atupdate','autoformat','autoscale','autoscale3','axes','axes3','axialshade','axis','axiscoverage','azimuth','babel','background','bangles','bar','barmarksize','barsize','basealign','baseline','bbox','beep','begin','beginclip','begingroup','beginpoint','between','bevel','bezier','bezierP','bezierPP','bezierPPP','bezulate','bibliography','bibliographystyle','binarytree','binarytreeNode','binomial','binput','bins','bisector','bisectorpoint','bispline','blend','blockconnector','boutput','box','bqe','breakpoint','breakpoints','brick','buildRestoreDefaults','buildRestoreThunk','buildcycle','bulletcolor','byte','calculateScaling','canonical','canonicalcartesiansystem','cartesiansystem','case1','case2','case3','case4','cbrt','cd','ceil','center','centerToFocus',
+ 'centroid','cevian','change2','changecoordsys','checkSegment','checkconditionlength','checker','checkincreasing','checklengths','checkposition','checktriangle','choose','circle','circlebarframe','circlemarkradius','circlenodesnumber','circumcenter','circumcircle','clamped','clear','clip','clipdraw','close','cmyk','code','colatitude','collect','collinear','color','colorless','colors','colorspace','comma','compassmark','complement','complementary','concat','concurrent','cone','conic','conicnodesnumber','conictype','conj','connect','connected','connectedindex','containmentTree','contains','contour','contour3','contouredges','controlSpecifier','convert','coordinates','coordsys','copy','copyPairOrTriple','cos','cosh','cot','countIntersections','cputime','crop','cropcode','cross',
+ 'crossframe','crosshatch','crossmarksize','csc','cubicroots','curabscissa','curlSpecifier','curpoint','currentarrow','currentexitfunction','currentmomarrow','currentpolarconicroutine','curve','cut','cutafter','cutbefore','cyclic','cylinder','deactivatequote','debugger','deconstruct','defaultdir','defaultformat','defaultpen','defined','degenerate','degrees','delete','deletepreamble','determinant','diagonal','diamond','diffdiv','dir','dirSpecifier','dirtime','display','distance',
+ 'divisors','do_overpaint','dot','dotframe','dotsize','downcase','draw','drawAll','drawDoubleLine','drawFermion','drawGhost','drawGluon','drawMomArrow','drawPRCcylinder','drawPRCdisk','drawPRCsphere','drawPRCtube','drawPhoton','drawScalar','drawVertex','drawVertexBox','drawVertexBoxO','drawVertexBoxX','drawVertexO','drawVertexOX','drawVertexTriangle','drawVertexTriangleO','drawVertexX','drawarrow','drawarrow2','drawline','drawpixel','drawtick','duplicate','elle','ellipse','ellipsenodesnumber','embed','embed3','empty','enclose','end','endScript','endclip','endgroup','endgroup3','endl','endpoint','endpoints','eof','eol','equation','equations','erase','erasestep','erf','erfc','error','errorbar','errorbars','eval','excenter','excircle','exit','exitXasyMode','exitfunction','exp','expfactors','expi','expm1','exradius','extend','extension','extouch','fabs','factorial','fermat','fft','fhorner','figure','file','filecode','fill','filldraw','filloutside','fillrule','filltype','find','finite','finiteDifferenceJacobian','firstcut','firstframe','fit','fit2','fixedscaling','floor','flush','fmdefaults','fmod','focusToCenter','font','fontcommand','fontsize','foot','format','frac','frequency','fromCenter','fromFocus','fspline','functionshade','gamma','generate_random_backtrace','generateticks','gergonne','getc','getint','getpair','getreal','getstring','gettriple','gluon','gouraudshade','graph','graphic','gray','grestore','grid','grid3','gsave','halfbox','hatch','hdiffdiv','hermite','hex','histogram','history','hline','hprojection',
+ 'hsv','hyperbola','hyperbolanodesnumber','hyperlink','hypot','identity','image','incenter','incentral','incircle','increasing','incrementposition','indexedTransform','indexedfigure','initXasyMode','initdefaults','input','inradius','insert','inside','integrate','interactive','interior','interp','interpolate','intersect','intersection','intersectionpoint','intersectionpoints','intersections','intouch','inverse','inversion','invisible','is3D','isCCW','isDuplicate','isogonal','isogonalconjugate','isotomic','isotomicconjugate','isparabola','italic','item','jobname','key','kurtosis','kurtosisexcess','label','labelaxis','labelmargin','labelpath','labels','labeltick','labelx','labelx3','labely','labely3','labelz','labelz3','lastcut','latex','latitude','latticeshade','layer','layout','ldexp','leastsquares','legend','legenditem','length','lexorder','lift','light','limits','line','linear','linecap','lineinversion','linejoin','linemargin','lineskip','linetype','linewidth','link','list','lm_enorm','lm_evaluate_default','lm_lmdif','lm_lmpar','lm_minimize','lm_print_default','lm_print_quiet','lm_qrfac','lm_qrsolv','locale','locate',
+ 'locatefile','location','log','log10','log1p','logaxiscoverage','longitude','lookup','makeNode','makedraw','makepen','map','margin','markangle','markangleradius','markanglespace','markarc','marker','markinterval','marknodes','markrightangle','markuniform','mass','masscenter','massformat','math','max','max3','maxAfterTransform','maxbezier','maxbound','maxcoords','maxlength','maxratio','maxtimes','mean','medial','median','midpoint','min','min3','minAfterTransform','minbezier','minbound','minipage','minratio','mintimes','miterlimit','mktemp','momArrowPath','momarrowsize','monotonic','multifigure','nativeformat','natural','needshipout','newl','newpage','newslide','newton','newtree','nextframe','nextnormal','nextpage','nib','nodabscissa','none','norm','normalvideo','notaknot','nowarn','numberpage','nurb','object','offset','onpath','opacity','opposite','orientation','origin','orthic','orthocentercenter','outformat','outline','outname','outprefix','output','overloadedMessage','overwrite','pack','pad','pairs','palette','parabola','parabolanodesnumber','parallel','parallelogram','partialsum','path','path3','pattern','pause','pdf','pedal','periodic','perp','perpendicular','perpendicularmark','phantom','phi1','phi2','phi3','photon','piecewisestraight','point','polar','polarconicroutine','polargraph','polygon','postcontrol','postscript','pow10','ppoint','prc','prc0','precision','precontrol','prepend','printBytecode','print_random_addresses','project','projection','purge','pwhermite','quadrant','quadraticroots','quantize','quarticroots','quotient','radialshade','radians','radicalcenter','radicalline','radius','rand','randompath','rd','readline','realmult','realquarticroots','rectangle','rectangular','rectify','reflect','relabscissa','relative','relativedistance','reldir','relpoint','reltime','remainder','remark','removeDuplicates','rename','replace','report','resetdefaultpen','restore','restoredefaults','reverse','reversevideo','rf','rfind','rgb','rgba','rgbint','rms',
+ 'rotate','rotateO','rotation','round','roundbox','roundedpath','roundrectangle','same','samecoordsys','sameside','sample','save','savedefaults','saveline','scale','scale3','scaleO','scaleT','scaleless','scientific','search','searchindex','searchtree','sec','secondaryX','secondaryY','seconds','section','sector','seek','seekeof','segment','sequence','setcontour','setpens','sgn','sgnd','sharpangle','sharpdegrees','shift','shiftless','shipout','shipout3','show','side','simeq','simpson','sin','sinh','size','size3','skewness','skip','slant','sleep','slope','slopefield','solve','solveBVP','sort','sourceline','sphere','split','sqrt','square','srand','standardizecoordsys','startScript','stdev','step','stickframe','stickmarksize','stickmarkspace','stop','straight','straightness','string','stripdirectory','stripextension','stripfile','stripsuffix','strokepath','subdivide','subitem','subpath','substr','sum','surface','symmedial','symmedian','system',
+ 'tab','tableau','tan','tangent','tangential','tangents','tanh','tell','tensionSpecifier','tensorshade','tex','texcolor','texify','texpath','texpreamble','texreset','texshipout','texsize','textpath','thick','thin','tick','tickMax','tickMax3','tickMin','tickMin3','ticklabelshift','ticklocate','tildeframe','tildemarksize','tile','tiling','time','times','title','titlepage','topbox','transform','transformation','transpose','trembleFuzz','triangle','triangleAbc','triangleabc','triangulate','tricoef','tridiagonal','trilinear','trim','truepoint','tube','uncycle','unfill','uniform','unique','unit','unitrand','unitsize','unityroot','unstraighten','upcase','updatefunction','uperiodic','upscale','uptodate','usepackage','usersetting','usetypescript','usleep','value','variance','variancebiased','vbox','vector','vectorfield','verbatim','view','vline','vperiodic','vprojection','warn','warning','windingnumber','write','xaxis','xaxis3','xaxis3At','xaxisAt','xequals','xinput','xlimits','xoutput','xpart','xscale','xscaleO','xtick','xtick3','xtrans','yaxis','yaxis3','yaxis3At','yaxisAt','yequals','ylimits','ypart','yscale','yscaleO','ytick','ytick3','ytrans','zaxis3','zaxis3At','zero','zero3','zlimits','zpart','ztick','ztick3','ztrans'
+ ),
+ 4 => array(
+ 'AliceBlue','Align','Allow','AntiqueWhite','Apricot','Aqua','Aquamarine','Aspect','Azure','BeginPoint','Beige','Bisque','Bittersweet','Black','BlanchedAlmond','Blue','BlueGreen','BlueViolet','Both','Break','BrickRed','Brown','BurlyWood','BurntOrange','CCW','CW','CadetBlue','CarnationPink','Center','Centered','Cerulean','Chartreuse','Chocolate','Coeff','Coral','CornflowerBlue','Cornsilk','Crimson','Crop','Cyan','Dandelion','DarkBlue','DarkCyan','DarkGoldenrod','DarkGray','DarkGreen','DarkKhaki','DarkMagenta','DarkOliveGreen','DarkOrange','DarkOrchid','DarkRed','DarkSalmon','DarkSeaGreen','DarkSlateBlue','DarkSlateGray','DarkTurquoise','DarkViolet','DeepPink','DeepSkyBlue','DefaultHead','DimGray','DodgerBlue','Dotted','Down','Draw','E','ENE','EPS','ESE','E_Euler','E_PC','E_RK2','E_RK3BS','Emerald','EndPoint','Euler','Fill','FillDraw','FireBrick','FloralWhite','ForestGreen','Fuchsia','Gainsboro','GhostWhite','Gold','Goldenrod','Gray','Green','GreenYellow','Honeydew','HookHead','Horizontal','HotPink','I','IgnoreAspect','IndianRed','Indigo','Ivory','JOIN_IN','JOIN_OUT','JungleGreen','Khaki','LM_DWARF','LM_MACHEP','LM_SQRT_DWARF','LM_SQRT_GIANT','LM_USERTOL','Label','Lavender','LavenderBlush','LawnGreen','Left','LeftJustified','LeftSide','LemonChiffon','LightBlue','LightCoral','LightCyan','LightGoldenrodYellow',
+ 'LightGreen','LightGrey','LightPink','LightSalmon','LightSeaGreen','LightSkyBlue','LightSlateGray','LightSteelBlue','LightYellow','Lime','LimeGreen','Linear','Linen','Log','Logarithmic','Magenta','Mahogany','Mark','MarkFill','Maroon','Max','MediumAquamarine','MediumBlue','MediumOrchid','MediumPurple','MediumSeaGreen','MediumSlateBlue','MediumSpringGreen','MediumTurquoise','MediumVioletRed','Melon','MidPoint','MidnightBlue','Min','MintCream','MistyRose','Moccasin','Move','MoveQuiet','Mulberry','N','NE','NNE','NNW','NW','NavajoWhite','Navy','NavyBlue','NoAlign','NoCrop','NoFill','NoSide','OldLace','Olive','OliveDrab','OliveGreen','Orange','OrangeRed','Orchid','Ox','Oy','PC','PaleGoldenrod','PaleGreen','PaleTurquoise','PaleVioletRed','PapayaWhip','Peach','PeachPuff','Periwinkle','Peru','PineGreen','Pink','Plum','PowderBlue','ProcessBlue','Purple','RK2','RK3','RK3BS','RK4','RK5','RK5DP','RK5F','RawSienna','Red','RedOrange','RedViolet','Rhodamine','Right','RightJustified','RightSide','RosyBrown','RoyalBlue','RoyalPurple','RubineRed','S','SE','SSE','SSW','SW','SaddleBrown','Salmon','SandyBrown','SeaGreen','Seashell','Sepia','Sienna','Silver','SimpleHead','SkyBlue','SlateBlue','SlateGray','Snow','SpringGreen','SteelBlue','Suppress','SuppressQuiet','Tan','TeXHead','Teal','TealBlue','Thistle','Ticksize','Tomato',
+ 'Turquoise','UnFill','Up','VERSION','Value','Vertical','Violet','VioletRed','W','WNW','WSW','Wheat','White','WhiteSmoke','WildStrawberry','XYAlign','YAlign','Yellow','YellowGreen','YellowOrange','addpenarc','addpenline','align','allowstepping','angularsystem','animationdelay','appendsuffix','arcarrowangle','arcarrowfactor','arrow2sizelimit','arrowangle','arrowbarb','arrowdir','arrowfactor','arrowhookfactor','arrowlength','arrowsizelimit','arrowtexfactor','authorpen','axis','axiscoverage','axislabelfactor','background','backgroundcolor','backgroundpen','barfactor','barmarksizefactor','basealign','baselinetemplate','beveljoin','bigvertexpen','bigvertexsize','black','blue','bm','bottom','bp','brown','bullet','byfoci','byvertices','camerafactor','chartreuse','circlemarkradiusfactor','circlenodesnumberfactor','circleprecision','circlescale','cm','codefile','codepen','codeskip','colorPen','coloredNodes','coloredSegments',
+ 'conditionlength','conicnodesfactor','count','cputimeformat','crossmarksizefactor','currentcoordsys','currentlight','currentpatterns','currentpen','currentpicture','currentposition','currentprojection','curvilinearsystem','cuttings','cyan','darkblue','darkbrown','darkcyan','darkgray','darkgreen','darkgrey','darkmagenta','darkolive','darkred','dashdotted','dashed','datepen','dateskip','debuggerlines','debugging','deepblue','deepcyan','deepgray','deepgreen','deepgrey','deepmagenta','deepred','default','defaultControl','defaultS','defaultbackpen','defaultcoordsys','defaultexcursion','defaultfilename','defaultformat','defaultmassformat','defaultpen','diagnostics','differentlengths','dot','dotfactor','dotframe','dotted','doublelinepen','doublelinespacing','down','duplicateFuzz','edge','ellipsenodesnumberfactor','eps','epsgeo','epsilon','evenodd','expansionfactor','extendcap','exterior','fermionpen','figureborder','figuremattpen','file3','firstnode','firststep','foregroundcolor','fuchsia','fuzz','gapfactor','ghostpen','gluonamplitude','gluonpen','gluonratio','gray','green','grey','hatchepsilon','havepagenumber','heavyblue','heavycyan','heavygray','heavygreen','heavygrey','heavymagenta','heavyred','hline','hwratio','hyperbola','hyperbolanodesnumberfactor','identity4','ignore','inXasyMode','inch','inches','includegraphicscommand','inf','infinity','institutionpen','intMax','intMin','interior','invert','invisible','itempen','itemskip','itemstep','labelmargin','landscape','lastnode','left','legendhskip','legendlinelength',
+ 'legendmargin','legendmarkersize','legendmaxrelativewidth','legendvskip','lightblue','lightcyan','lightgray','lightgreen','lightgrey','lightmagenta','lightolive','lightred','lightyellow','line','linemargin','lm_infmsg','lm_shortmsg','longdashdotted','longdashed','magenta','magneticRadius','mantissaBits','markangleradius','markangleradiusfactor','markanglespace','markanglespacefactor','mediumblue','mediumcyan','mediumgray','mediumgreen','mediumgrey','mediummagenta','mediumred','mediumyellow','middle','minDistDefault','minblockheight','minblockwidth','mincirclediameter','minipagemargin','minipagewidth','minvertexangle','miterjoin','mm','momarrowfactor','momarrowlength','momarrowmargin','momarrowoffset','momarrowpen','monoPen','morepoints','nCircle','newbulletcolor','ngraph','nil','nmesh','nobasealign','nodeMarginDefault','nodesystem','nomarker','nopoint','noprimary','nullpath','nullpen','numarray','ocgindex','oldbulletcolor','olive','orange','origin','overpaint','page','pageheight','pagemargin','pagenumberalign','pagenumberpen','pagenumberposition','pagewidth','paleblue','palecyan','palegray','palegreen','palegrey',
+ 'palemagenta','palered','paleyellow','parabolanodesnumberfactor','perpfactor','phi','photonamplitude','photonpen','photonratio','pi','pink','plain','plain_bounds','plain_scaling','plus','preamblenodes','pt','purple','r3','r4a','r4b','randMax','realDigits','realEpsilon','realMax','realMin','red','relativesystem','reverse','right','roundcap','roundjoin','royalblue','salmon','saveFunctions','scalarpen','sequencereal','settings','shipped','signedtrailingzero','solid','springgreen','sqrtEpsilon','squarecap','squarepen','startposition','stdin','stdout','stepfactor','stepfraction','steppagenumberpen','stepping','stickframe','stickmarksizefactor','stickmarkspacefactor','swap','textpen','ticksize','tildeframe','tildemarksizefactor','tinv','titlealign','titlepagepen','titlepageposition','titlepen','titleskip','top','trailingzero','treeLevelStep','treeMinNodeWidth','treeNodeStep','trembleAngle','trembleFrequency','trembleRandom','undefined','unitcircle','unitsquare','up','urlpen','urlskip','version','vertexpen','vertexsize','viewportmargin','viewportsize','vline','white','wye','xformStack','yellow','ylabelwidth','zerotickfuzz','zerowinding'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '(', ')', '{', '}', '[', ']'
+ ),
+ 1 => array('<', '>','='),
+ 2 => array('+', '-', '*', '/', '%'),
+ 3 => array('!', '^', '&', '|'),
+ 4 => array('?', ':', ';'),
+ 5 => array('..')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #990000;',
+ 4 => 'color: #009900; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666;',
+ 2 => 'color: #339900;',
+ 'MULTI' => 'color: #ff0000; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #660099; font-weight: bold;',
+ 3 => 'color: #660099; font-weight: bold;',
+ 4 => 'color: #660099; font-weight: bold;',
+ 5 => 'color: #006699; font-weight: bold;',
+ 'HARD' => '',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #208080;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color:#800080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI => 'color:#800080;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #007788;',
+ 2 => 'color: #007788;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;',
+ 1 => 'color: #000080;',
+ 2 => 'color: #000040;',
+ 3 => 'color: #000040;',
+ 4 => 'color: #008080;',
+ 5 => 'color: #009080;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_\|%\\-])"
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/autoconf.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/autoconf.php
new file mode 100644
index 00000000..7a0f1ee9
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/autoconf.php
@@ -0,0 +1,512 @@
+<?php
+/*************************************************************************************
+ * autoconf.php
+ * -----
+ * Author: Mihai Vasilian (grayasm@gmail.com)
+ * Copyright: (c) 2010 Mihai Vasilian
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/01/25
+ *
+ * autoconf language file for GeSHi.
+ *
+ ***********************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Autoconf',
+ 'COMMENT_SINGLE' => array(2 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ //Multiline-continued single-line comments
+ 1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Multiline-continued preprocessor define
+ 2 => '/#(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Single Line comment started by dnl
+ 3 => '/(?<!\$)\bdnl\b.*$/m',
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'AC_ACT_IFELSE',
+ 'AC_AIX',
+ 'AC_ALLOCA',
+ 'AC_ARG_ARRAY',
+ 'AC_ARG_ENABLE',
+ 'AC_ARG_PROGRAM',
+ 'AC_ARG_VAR',
+ 'AC_ARG_WITH',
+ 'AC_AUTOCONF_VERSION',
+ 'AC_BEFORE',
+ 'AC_C_BACKSLASH_A',
+ 'AC_C_BIGENDIAN',
+ 'AC_C_CHAR_UNSIGNED',
+ 'AC_C_CONST',
+ 'AC_C_CROSS',
+ 'AC_C_FLEXIBLE_ARRAY_MEMBER',
+ 'AC_C_INLINE',
+ 'AC_C_LONG_DOUBLE',
+ 'AC_C_PROTOTYPES',
+ 'AC_C_RESTRICT',
+ 'AC_C_STRINGIZE',
+ 'AC_C_TYPEOF',
+ 'AC_C_VARARRAYS',
+ 'AC_C_VOLATILE',
+ 'AC_CACHE_CHECK',
+ 'AC_CACHE_LOAD',
+ 'AC_CACHE_SAVE',
+ 'AC_CACHE_VAL',
+ 'AC_CANONICAL_BUILD',
+ 'AC_CANONICAL_HOST',
+ 'AC_CANONICAL_SYSTEM',
+ 'AC_CANONICAL_TARGET',
+ 'AC_CHAR_UNSIGNED',
+ 'AC_CHECK_ALIGNOF',
+ 'AC_CHECK_DECL',
+ 'AC_CHECK_DECLS',
+ 'AC_CHECK_DECLS_ONCE',
+ 'AC_CHECK_FILE',
+ 'AC_CHECK_FILES',
+ 'AC_CHECK_FUNC',
+ 'AC_CHECK_FUNCS',
+ 'AC_CHECK_FUNCS_ONCE',
+ 'AC_CHECK_HEADER',
+ 'AC_CHECK_HEADERS',
+ 'AC_CHECK_HEADERS_ONCE',
+ 'AC_CHECK_LIB',
+ 'AC_CHECK_MEMBER',
+ 'AC_CHECK_MEMBERS',
+ 'AC_CHECK_PROG',
+ 'AC_CHECK_PROGS',
+ 'AC_CHECK_SIZEOF',
+ 'AC_CHECK_TARGET_TOOL',
+ 'AC_CHECK_TARGET_TOOLS',
+ 'AC_CHECK_TOOL',
+ 'AC_CHECK_TOOLS',
+ 'AC_CHECK_TYPE',
+ 'AC_CHECK_TYPES',
+ 'AC_CHECKING',
+ 'AC_COMPILE_CHECK',
+ 'AC_COMPILE_IFELSE',
+ 'AC_COMPUTE_INT',
+ 'AC_CONFIG_AUX_DIR',
+ 'AC_CONFIG_COMMANDS',
+ 'AC_CONFIG_COMMANDS_POST',
+ 'AC_CONFIG_COMMANDS_PRE',
+ 'AC_CONFIG_FILES',
+ 'AC_CONFIG_HEADERS',
+ 'AC_CONFIG_ITEMS',
+ 'AC_CONFIG_LIBOBJ_DIR',
+ 'AC_CONFIG_LINKS',
+ 'AC_CONFIG_MACRO_DIR',
+ 'AC_CONFIG_SRCDIR',
+ 'AC_CONFIG_SUBDIRS',
+ 'AC_CONFIG_TESTDIR',
+ 'AC_CONST',
+ 'AC_COPYRIGHT',
+ 'AC_CROSS_CHECK',
+ 'AC_CYGWIN',
+ 'AC_DATAROOTDIR_CHECKED',
+ 'AC_DECL_SYS_SIGLIST',
+ 'AC_DECL_YYTEXT',
+ 'AC_DEFINE',
+ 'AC_DEFINE_UNQUOTED',
+ 'AC_DEFUN',
+ 'AC_DEFUN_ONCE',
+ 'AC_DIAGNOSE',
+ 'AC_DIR_HEADER',
+ 'AC_DISABLE_OPTION_CHECKING',
+ 'AC_DYNIX_SEQ',
+ 'AC_EGREP_CPP',
+ 'AC_EGREP_HEADER',
+ 'AC_EMXOS2',
+ 'AC_ENABLE',
+ 'AC_ERLANG_CHECK_LIB',
+ 'AC_ERLANG_NEED_ERL',
+ 'AC_ERLANG_NEED_ERLC',
+ 'AC_ERLANG_PATH_ERL',
+ 'AC_ERLANG_PATH_ERLC',
+ 'AC_ERLANG_SUBST_ERTS_VER',
+ 'AC_ERLANG_SUBST_INSTALL_LIB_DIR',
+ 'AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR',
+ 'AC_ERLANG_SUBST_LIB_DIR',
+ 'AC_ERLANG_SUBST_ROOT_DIR',
+ 'AC_ERROR',
+ 'AC_EXEEXT',
+ 'AC_F77_DUMMY_MAIN',
+ 'AC_F77_FUNC',
+ 'AC_F77_LIBRARY_LDFLAGS',
+ 'AC_F77_MAIN',
+ 'AC_F77_WRAPPERS',
+ 'AC_FATAL',
+ 'AC_FC_FREEFORM',
+ 'AC_FC_FUNC',
+ 'AC_FC_LIBRARY_LDFLAGS',
+ 'AC_FC_MAIN',
+ 'AC_FC_SRCEXT',
+ 'AC_FC_WRAPPERS',
+ 'AC_FIND_X',
+ 'AC_FIND_XTRA',
+ 'AC_FOREACH',
+ 'AC_FUNC_ALLOCA',
+ 'AC_FUNC_CHECK',
+ 'AC_FUNC_CHOWN',
+ 'AC_FUNC_CLOSEDIR_VOID',
+ 'AC_FUNC_ERROR_AT_LINE',
+ 'AC_FUNC_FNMATCH',
+ 'AC_FUNC_FNMATCH_GNU',
+ 'AC_FUNC_FORK',
+ 'AC_FUNC_FSEEKO',
+ 'AC_FUNC_GETGROUPS',
+ 'AC_FUNC_GETLOADAVG',
+ 'AC_FUNC_GETMNTENT',
+ 'AC_FUNC_GETPGRP',
+ 'AC_FUNC_LSTAT',
+ 'AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK',
+ 'AC_FUNC_MALLOC',
+ 'AC_FUNC_MBRTOWC',
+ 'AC_FUNC_MEMCMP',
+ 'AC_FUNC_MKTIME',
+ 'AC_FUNC_MMAP',
+ 'AC_FUNC_OBSTACK',
+ 'AC_FUNC_REALLOC',
+ 'AC_FUNC_SELECT_ARGTYPES',
+ 'AC_FUNC_SETPGRP',
+ 'AC_FUNC_SETVBUF_REVERSED',
+ 'AC_FUNC_STAT',
+ 'AC_FUNC_STRCOLL',
+ 'AC_FUNC_STRERROR_R',
+ 'AC_FUNC_STRFTIME',
+ 'AC_FUNC_STRNLEN',
+ 'AC_FUNC_STRTOD',
+ 'AC_FUNC_STRTOLD',
+ 'AC_FUNC_UTIME_NULL',
+ 'AC_FUNC_VPRINTF',
+ 'AC_FUNC_WAIT3',
+ 'AC_GCC_TRADITIONAL',
+ 'AC_GETGROUPS_T',
+ 'AC_GETLOADAVG',
+ 'AC_GNU_SOURCE',
+ 'AC_HAVE_FUNCS',
+ 'AC_HAVE_HEADERS',
+ 'AC_HAVE_LIBRARY',
+ 'AC_HAVE_POUNDBANG',
+ 'AC_HEADER_ASSERT',
+ 'AC_HEADER_CHECK',
+ 'AC_HEADER_DIRENT',
+ 'AC_HEADER_EGREP',
+ 'AC_HEADER_MAJOR',
+ 'AC_HEADER_RESOLV',
+ 'AC_HEADER_STAT',
+ 'AC_HEADER_STDBOOL',
+ 'AC_HEADER_STDC',
+ 'AC_HEADER_SYS_WAIT',
+ 'AC_HEADER_TIME',
+ 'AC_HEADER_TIOCGWINSZ',
+ 'AC_HELP_STRING',
+ 'AC_INCLUDES_DEFAULT',
+ 'AC_INIT',
+ 'AC_INLINE',
+ 'AC_INT_16_BITS',
+ 'AC_IRIX_SUN',
+ 'AC_ISC_POSIX',
+ 'AC_LANG_ASSERT',
+ 'AC_LANG_C',
+ 'AC_LANG_CALL',
+ 'AC_LANG_CONFTEST',
+ 'AC_LANG_CPLUSPLUS',
+ 'AC_LANG_FORTRAN77',
+ 'AC_LANG_FUNC_LINK_TRY',
+ 'AC_LANG_POP',
+ 'AC_LANG_PROGRAM',
+ 'AC_LANG_PUSH',
+ 'AC_LANG_RESTORE',
+ 'AC_LANG_SAVE',
+ 'AC_LANG_SOURCE',
+ 'AC_LANG_WERROR',
+ 'AC_LIBOBJ',
+ 'AC_LIBSOURCE',
+ 'AC_LIBSOURCES',
+ 'AC_LINK_FILES',
+ 'AC_LINK_IFELSE',
+ 'AC_LN_S',
+ 'AC_LONG_64_BITS',
+ 'AC_LONG_DOUBLE',
+ 'AC_LONG_FILE_NAMES',
+ 'AC_MAJOR_HEADER',
+ 'AC_MEMORY_H',
+ 'AC_MINGW32',
+ 'AC_MINIX',
+ 'AC_MINUS_C_MINUS_O',
+ 'AC_MMAP',
+ 'AC_MODE_T',
+ 'AC_MSG_CHECKING',
+ 'AC_MSG_ERROR',
+ 'AC_MSG_FAILURE',
+ 'AC_MSG_NOTICE',
+ 'AC_MSG_RESULT',
+ 'AC_MSG_WARN',
+ 'AC_OBJEXT',
+ 'AC_OBSOLETE',
+ 'AC_OFF_T',
+ 'AC_OPENMP',
+ 'AC_OUTPUT',
+ 'AC_OUTPUT_COMMANDS',
+ 'AC_PACKAGE_BUGREPORT',
+ 'AC_PACKAGE_NAME',
+ 'AC_PACKAGE_STRING',
+ 'AC_PACKAGE_TARNAME',
+ 'AC_PACKAGE_URL',
+ 'AC_PACKAGE_VERSION',
+ 'AC_PATH_PROG',
+ 'AC_PATH_PROGS',
+ 'AC_PATH_PROGS_FEATURE_CHECK',
+ 'AC_PATH_TARGET_TOOL',
+ 'AC_PATH_TOOL',
+ 'AC_PATH_X',
+ 'AC_PATH_XTRA',
+ 'AC_PID_T',
+ 'AC_PREFIX',
+ 'AC_PREFIX_DEFAULT',
+ 'AC_PREFIX_PROGRAM',
+ 'AC_PREPROC_IFELSE',
+ 'AC_PREREQ',
+ 'AC_PRESERVE_HELP_ORDER',
+ 'AC_PROG_AWK',
+ 'AC_PROG_CC',
+ 'AC_PROG_CC_C89',
+ 'AC_PROG_CC_C99',
+ 'AC_PROG_CC_C_O',
+ 'AC_PROG_CC_STDC',
+ 'AC_PROG_CPP',
+ 'AC_PROG_CPP_WERROR',
+ 'AC_PROG_CXX',
+ 'AC_PROG_CXX_C_O',
+ 'AC_PROG_CXXCPP',
+ 'AC_PROG_EGREP',
+ 'AC_PROG_F77',
+ 'AC_PROG_F77_C_O',
+ 'AC_PROG_FC',
+ 'AC_PROG_FC_C_O',
+ 'AC_PROG_FGREP',
+ 'AC_PROG_GCC_TRADITIONAL',
+ 'AC_PROG_GREP',
+ 'AC_PROG_INSTALL',
+ 'AC_PROG_LEX',
+ 'AC_PROG_LN_S',
+ 'AC_PROG_MAKE_SET',
+ 'AC_PROG_MKDIR_P',
+ 'AC_PROG_OBJC',
+ 'AC_PROG_OBJCPP',
+ 'AC_PROG_OBJCXX',
+ 'AC_PROG_OBJCXXCPP',
+ 'AC_PROG_RANLIB',
+ 'AC_PROG_SED',
+ 'AC_PROG_YACC',
+ 'AC_PROGRAM_CHECK',
+ 'AC_PROGRAM_EGREP',
+ 'AC_PROGRAM_PATH',
+ 'AC_PROGRAMS_CHECK',
+ 'AC_PROGRAMS_PATH',
+ 'AC_REMOTE_TAPE',
+ 'AC_REPLACE_FNMATCH',
+ 'AC_REPLACE_FUNCS',
+ 'AC_REQUIRE',
+ 'AC_REQUIRE_AUX_FILE',
+ 'AC_REQUIRE_CPP',
+ 'AC_RESTARTABLE_SYSCALLS',
+ 'AC_RETSIGTYPE',
+ 'AC_REVISION',
+ 'AC_RSH',
+ 'AC_RUN_IFELSE',
+ 'AC_SCO_INTL',
+ 'AC_SEARCH_LIBS',
+ 'AC_SET_MAKE',
+ 'AC_SETVBUF_REVERSED',
+ 'AC_SIZE_T',
+ 'AC_SIZEOF_TYPE',
+ 'AC_ST_BLKSIZE',
+ 'AC_ST_BLOCKS',
+ 'AC_ST_RDEV',
+ 'AC_STAT_MACROS_BROKEN',
+ 'AC_STDC_HEADERS',
+ 'AC_STRCOLL',
+ 'AC_STRUCT_DIRENT_D_INO',
+ 'AC_STRUCT_DIRENT_D_TYPE',
+ 'AC_STRUCT_ST_BLKSIZE',
+ 'AC_STRUCT_ST_BLOCKS',
+ 'AC_STRUCT_ST_RDEV',
+ 'AC_STRUCT_TIMEZONE',
+ 'AC_STRUCT_TM',
+ 'AC_SUBST',
+ 'AC_SUBST_FILE',
+ 'AC_SYS_INTERPRETER',
+ 'AC_SYS_LARGEFILE',
+ 'AC_SYS_LONG_FILE_NAMES',
+ 'AC_SYS_POSIX_TERMIOS',
+ 'AC_SYS_RESTARTABLE_SYSCALLS',
+ 'AC_SYS_SIGLIST_DECLARED',
+ 'AC_TEST_CPP',
+ 'AC_TEST_PROGRAM',
+ 'AC_TIME_WITH_SYS_TIME',
+ 'AC_TIMEZONE',
+ 'AC_TRY_ACT',
+ 'AC_TRY_COMPILE',
+ 'AC_TRY_CPP',
+ 'AC_TRY_LINK',
+ 'AC_TRY_LINK_FUNC',
+ 'AC_TRY_RUN',
+ 'AC_TYPE_GETGROUPS',
+ 'AC_TYPE_INT16_T',
+ 'AC_TYPE_INT32_T',
+ 'AC_TYPE_INT64_T',
+ 'AC_TYPE_INT8_T',
+ 'AC_TYPE_INTMAX_T',
+ 'AC_TYPE_INTPTR_T',
+ 'AC_TYPE_LONG_DOUBLE',
+ 'AC_TYPE_LONG_DOUBLE_WIDER',
+ 'AC_TYPE_LONG_LONG_INT',
+ 'AC_TYPE_MBSTATE_T',
+ 'AC_TYPE_MODE_T',
+ 'AC_TYPE_OFF_T',
+ 'AC_TYPE_PID_T',
+ 'AC_TYPE_SIGNAL',
+ 'AC_TYPE_SIZE_T',
+ 'AC_TYPE_SSIZE_T',
+ 'AC_TYPE_UID_T',
+ 'AC_TYPE_UINT16_T',
+ 'AC_TYPE_UINT32_T',
+ 'AC_TYPE_UINT64_T',
+ 'AC_TYPE_UINT8_T',
+ 'AC_TYPE_UINTMAX_T',
+ 'AC_TYPE_UINTPTR_T',
+ 'AC_TYPE_UNSIGNED_LONG_LONG_INT',
+ 'AC_UID_T',
+ 'AC_UNISTD_H',
+ 'AC_USE_SYSTEM_EXTENSIONS',
+ 'AC_USG',
+ 'AC_UTIME_NULL',
+ 'AC_VALIDATE_CACHED_SYSTEM_TUPLE',
+ 'AC_VERBOSE',
+ 'AC_VFORK',
+ 'AC_VPRINTF',
+ 'AC_WAIT3',
+ 'AC_WARN',
+ 'AC_WARNING',
+ 'AC_WITH',
+ 'AC_WORDS_BIGENDIAN',
+ 'AC_XENIX_DIR',
+ 'AC_YYTEXT_POINTER',
+ 'AH_BOTTOM',
+ 'AH_HEADER',
+ 'AH_TEMPLATE',
+ 'AH_TOP',
+ 'AH_VERBATIM',
+ 'AU_ALIAS',
+ 'AU_DEFUN'),
+ ),
+ 'SYMBOLS' => array('(', ')', '[', ']', '!', '@', '%', '&', '*', '|', '/', '<', '>', ';;', '`'),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00ffff;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666;',
+ 2 => 'color: #339900;',
+ 3 => 'color: #666666;',
+ 'MULTI' => 'color: #ff0000; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;',
+ 1 => 'color: #000099;',
+ 2 => 'color: #660099;',
+ 3 => 'color: #660099;',
+ 4 => 'color: #660099;',
+ 5 => 'color: #006699;',
+ 'HARD' => '',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #996600;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #208080;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color:#800080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI => 'color:#800080;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;',
+ 1 => 'color: #000080;',
+ 2 => 'color: #000040;',
+ 3 => 'color: #000040;',
+ 4 => 'color: #008080;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'COMMENTS' => array(
+ 'DISALLOWED_BEFORE' => '$'
+ ),
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![\.\-a-zA-Z0-9_\$\#])",
+ 'DISALLOWED_AFTER' => "(?![\.\-a-zA-Z0-9_%\\/])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/autohotkey.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/autohotkey.php
new file mode 100644
index 00000000..970684da
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/autohotkey.php
@@ -0,0 +1,373 @@
+<?php
+/*************************************************************************************
+ * autohotkey.php
+ * --------
+ * Author: Naveen Garg (naveen.garg@gmail.com)
+ * Copyright: (c) 2009 Naveen Garg and GeSHi
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/06/11
+ *
+ * Autohotkey language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * Release 1.0.8.5 (2009/06/11)
+ * - First Release
+ *
+ * TODO
+ * ----
+ * Reference: http://www.autohotkey.com/docs/
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Autohotkey',
+ 'COMMENT_SINGLE' => array(
+ 1 => ';'
+ ),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'while','if','and','or','else','return'
+ ),
+ 2 => array(
+ // built in variables
+ 'A_AhkPath','A_AhkVersion','A_AppData','A_AppDataCommon',
+ 'A_AutoTrim','A_BatchLines','A_CaretX','A_CaretY',
+ 'A_ComputerName','A_ControlDelay','A_Cursor','A_DD',
+ 'A_DDD','A_DDDD','A_DefaultMouseSpeed','A_Desktop',
+ 'A_DesktopCommon','A_DetectHiddenText','A_DetectHiddenWindows','A_EndChar',
+ 'A_EventInfo','A_ExitReason','A_FormatFloat','A_FormatInteger',
+ 'A_Gui','A_GuiEvent','A_GuiControl','A_GuiControlEvent',
+ 'A_GuiHeight','A_GuiWidth','A_GuiX','A_GuiY',
+ 'A_Hour','A_IconFile','A_IconHidden','A_IconNumber',
+ 'A_IconTip','A_Index','A_IPAddress1','A_IPAddress2',
+ 'A_IPAddress3','A_IPAddress4','A_ISAdmin','A_IsCompiled',
+ 'A_IsCritical','A_IsPaused','A_IsSuspended','A_KeyDelay',
+ 'A_Language','A_LastError','A_LineFile','A_LineNumber',
+ 'A_LoopField','A_LoopFileAttrib','A_LoopFileDir','A_LoopFileExt',
+ 'A_LoopFileFullPath','A_LoopFileLongPath','A_LoopFileName','A_LoopFileShortName',
+ 'A_LoopFileShortPath','A_LoopFileSize','A_LoopFileSizeKB','A_LoopFileSizeMB',
+ 'A_LoopFileTimeAccessed','A_LoopFileTimeCreated','A_LoopFileTimeModified','A_LoopReadLine',
+ 'A_LoopRegKey','A_LoopRegName','A_LoopRegSubkey','A_LoopRegTimeModified',
+ 'A_LoopRegType','A_MDAY','A_Min','A_MM',
+ 'A_MMM','A_MMMM','A_Mon','A_MouseDelay',
+ 'A_MSec','A_MyDocuments','A_Now','A_NowUTC',
+ 'A_NumBatchLines','A_OSType','A_OSVersion','A_PriorHotkey',
+ 'A_ProgramFiles','A_Programs','A_ProgramsCommon','A_ScreenHeight',
+ 'A_ScreenWidth','A_ScriptDir','A_ScriptFullPath','A_ScriptName',
+ 'A_Sec','A_Space','A_StartMenu','A_StartMenuCommon',
+ 'A_Startup','A_StartupCommon','A_StringCaseSense','A_Tab',
+ 'A_Temp','A_ThisFunc','A_ThisHotkey','A_ThisLabel',
+ 'A_ThisMenu','A_ThisMenuItem','A_ThisMenuItemPos','A_TickCount',
+ 'A_TimeIdle','A_TimeIdlePhysical','A_TimeSincePriorHotkey','A_TimeSinceThisHotkey',
+ 'A_TitleMatchMode','A_TitleMatchModeSpeed','A_UserName','A_WDay',
+ 'A_WinDelay','A_WinDir','A_WorkingDir','A_YDay',
+ 'A_YEAR','A_YWeek','A_YYYY','Clipboard',
+ 'ClipboardAll','ComSpec','ErrorLevel','ProgramFiles',
+ ),
+ 3 => array(
+ 'AutoTrim',
+ 'BlockInput','Break','Click',
+ 'ClipWait','Continue','Control',
+ 'ControlClick','ControlFocus','ControlGet',
+ 'ControlGetFocus','ControlGetPos','ControlGetText',
+ 'ControlMove','ControlSend','ControlSendRaw',
+ 'ControlSetText','CoordMode','Critical',
+ 'DetectHiddenText','DetectHiddenWindows','DllCall','Drive',
+ 'DriveGet','DriveSpaceFree',
+ 'Else','EnvAdd','EnvDiv',
+ 'EnvGet','EnvMult','EnvSet',
+ 'EnvSub','EnvUpdate','Exit',
+ 'ExitApp','FileAppend','FileCopy',
+ 'FileCopyDir','FileCreateDir','FileCreateShortcut',
+ 'FileDelete','FileGetAttrib','FileGetShortcut',
+ 'FileGetSize','FileGetTime','FileGetVersion',
+ 'FileInstall','FileMove','FileMoveDir',
+ 'FileRead','FileReadLine','FileRecycle',
+ 'FileRecycleEmpty','FileRemoveDir','FileSelectFile',
+ 'FileSelectFolder','FileSetAttrib','FileSetTime',
+ 'FormatTime','Gosub',
+ 'Goto','GroupActivate','GroupAdd',
+ 'GroupClose','GroupDeactivate','Gui',
+ 'GuiControl','GuiControlGet','Hotkey',
+ 'IfExist','IfGreater','IfGreaterOrEqual',
+ 'IfInString','IfLess','IfLessOrEqual',
+ 'IfMsgBox','IfNotEqual','IfNotExist',
+ 'IfNotInString','IfWinActive','IfWinExist',
+ 'IfWinNotActive','IfWinNotExist','ImageSearch',
+ 'IniDelete','IniRead','IniWrite',
+ 'Input','InputBox','KeyHistory',
+ 'KeyWait','ListHotkeys','ListLines',
+ 'ListVars','Loop',
+ 'Menu','MouseClick','MouseClickDrag',
+ 'MouseGetPos','MouseMove','MsgBox',
+ 'OnMessage','OnExit','OutputDebug',
+ 'PixelGetColor','PixelSearch','PostMessage',
+ 'Process','Progress','Random',
+ 'RegExMatch','RegExReplace','RegisterCallback',
+ 'RegDelete','RegRead','RegWrite',
+ 'Reload','Repeat','Return',
+ 'Run','RunAs','RunWait',
+ 'Send','SendEvent','SendInput',
+ 'SendMessage','SendMode','SendPlay',
+ 'SendRaw','SetBatchLines','SetCapslockState',
+ 'SetControlDelay','SetDefaultMouseSpeed','SetEnv',
+ 'SetFormat','SetKeyDelay','SetMouseDelay',
+ 'SetNumlockState','SetScrollLockState','SetStoreCapslockMode',
+ 'SetTimer','SetTitleMatchMode','SetWinDelay',
+ 'SetWorkingDir','Shutdown','Sleep',
+ 'Sort','SoundBeep','SoundGet',
+ 'SoundGetWaveVolume','SoundPlay','SoundSet',
+ 'SoundSetWaveVolume','SplashImage','SplashTextOff',
+ 'SplashTextOn','SplitPath','StatusBarGetText',
+ 'StatusBarWait','StringCaseSense','StringGetPos',
+ 'StringLeft','StringLen','StringLower',
+ 'StringMid','StringReplace','StringRight',
+ 'StringSplit','StringTrimLeft','StringTrimRight',
+ 'StringUpper','Suspend','SysGet',
+ 'Thread','ToolTip','Transform',
+ 'TrayTip','URLDownloadToFile','While',
+ 'VarSetCapacity',
+ 'WinActivate','WinActivateBottom','WinClose',
+ 'WinGet','WinGetActiveStats','WinGetActiveTitle',
+ 'WinGetClass','WinGetPos','WinGetText',
+ 'WinGetTitle','WinHide','WinKill',
+ 'WinMaximize','WinMenuSelectItem','WinMinimize',
+ 'WinMinimizeAll','WinMinimizeAllUndo','WinMove',
+ 'WinRestore','WinSet','WinSetTitle',
+ 'WinShow','WinWait','WinWaitActive',
+ 'WinWaitClose','WinWaitNotActive'
+ ),
+ 4 => array(
+ 'Abs','ACos','Asc','ASin',
+ 'ATan','Ceil','Chr','Cos',
+ 'Exp','FileExist','Floor',
+ 'GetKeyState','IL_Add','IL_Create','IL_Destroy',
+ 'InStr','IsFunc','IsLabel','Ln',
+ 'Log','LV_Add','LV_Delete','LV_DeleteCol',
+ 'LV_GetCount','LV_GetNext','LV_GetText','LV_Insert',
+ 'LV_InsertCol','LV_Modify','LV_ModifyCol','LV_SetImageList',
+ 'Mod','NumGet','NumPut',
+ 'Round',
+ 'SB_SetIcon','SB_SetParts','SB_SetText','Sin',
+ 'Sqrt','StrLen','SubStr','Tan',
+ 'TV_Add','TV_Delete','TV_GetChild','TV_GetCount',
+ 'TV_GetNext','TV_Get','TV_GetParent','TV_GetPrev',
+ 'TV_GetSelection','TV_GetText','TV_Modify',
+ 'WinActive','WinExist'
+ ),
+ 5 => array(
+ // #Directives
+ 'AllowSameLineComments','ClipboardTimeout','CommentFlag',
+ 'ErrorStdOut','EscapeChar','HotkeyInterval',
+ 'HotkeyModifierTimeout','Hotstring','IfWinActive',
+ 'IfWinExist','IfWinNotActive','IfWinNotExist',
+ 'Include','IncludeAgain','InstallKeybdHook',
+ 'InstallMouseHook','KeyHistory','LTrim',
+ 'MaxHotkeysPerInterval','MaxMem','MaxThreads',
+ 'MaxThreadsBuffer','MaxThreadsPerHotkey','NoEnv',
+ 'NoTrayIcon','Persistent','SingleInstance',
+ 'UseHook','WinActivateForce'
+ ),
+ 6 => array(
+ 'Shift','LShift','RShift',
+ 'Alt','LAlt','RAlt',
+ 'LControl','RControl',
+ 'Ctrl','LCtrl','RCtrl',
+ 'LWin','RWin','AppsKey',
+ 'AltDown','AltUp','ShiftDown',
+ 'ShiftUp','CtrlDown','CtrlUp',
+ 'LWinDown','LWinUp','RWinDown',
+ 'RWinUp','LButton','RButton',
+ 'MButton','WheelUp','WheelDown',
+ 'WheelLeft','WheelRight','XButton1',
+ 'XButton2','Joy1','Joy2',
+ 'Joy3','Joy4','Joy5',
+ 'Joy6','Joy7','Joy8',
+ 'Joy9','Joy10','Joy11',
+ 'Joy12','Joy13','Joy14',
+ 'Joy15','Joy16','Joy17',
+ 'Joy18','Joy19','Joy20',
+ 'Joy21','Joy22','Joy23',
+ 'Joy24','Joy25','Joy26',
+ 'Joy27','Joy28','Joy29',
+ 'Joy30','Joy31','Joy32',
+ 'JoyX','JoyY','JoyZ',
+ 'JoyR','JoyU','JoyV',
+ 'JoyPOV','JoyName','JoyButtons',
+ 'JoyAxes','JoyInfo','Space',
+ 'Tab','Enter',
+ 'Escape','Esc','BackSpace',
+ 'BS','Delete','Del',
+ 'Insert','Ins','PGUP',
+ 'PGDN','Home','End',
+ 'Up','Down','Left',
+ 'Right','PrintScreen','CtrlBreak',
+ 'Pause','ScrollLock','CapsLock',
+ 'NumLock','Numpad0','Numpad1',
+ 'Numpad2','Numpad3','Numpad4',
+ 'Numpad5','Numpad6','Numpad7',
+ 'Numpad8','Numpad9','NumpadMult',
+ 'NumpadAdd','NumpadSub','NumpadDiv',
+ 'NumpadDot','NumpadDel','NumpadIns',
+ 'NumpadClear','NumpadUp','NumpadDown',
+ 'NumpadLeft','NumpadRight','NumpadHome',
+ 'NumpadEnd','NumpadPgup','NumpadPgdn',
+ 'NumpadEnter','F1','F2',
+ 'F3','F4','F5',
+ 'F6','F7','F8',
+ 'F9','F10','F11',
+ 'F12','F13','F14',
+ 'F15','F16','F17',
+ 'F18','F19','F20',
+ 'F21','F22','F23',
+ 'F24','Browser_Back','Browser_Forward',
+ 'Browser_Refresh','Browser_Stop','Browser_Search',
+ 'Browser_Favorites','Browser_Home','Volume_Mute',
+ 'Volume_Down','Volume_Up','Media_Next',
+ 'Media_Prev','Media_Stop','Media_Play_Pause',
+ 'Launch_Mail','Launch_Media','Launch_App1',
+ 'Launch_App2'
+ ),
+ 7 => array(
+ // Gui commands
+ 'Add',
+ 'Show', 'Submit', 'Cancel', 'Destroy',
+ 'Font', 'Color', 'Margin', 'Flash', 'Default',
+ 'GuiEscape','GuiClose','GuiSize','GuiContextMenu','GuiDropFilesTabStop',
+ ),
+ 8 => array(
+ // Gui Controls
+ 'Button',
+ 'Checkbox','Radio','DropDownList','DDL',
+ 'ComboBox','ListBox','ListView',
+ 'Text', 'Edit', 'UpDown', 'Picture',
+ 'TreeView','DateTime', 'MonthCal',
+ 'Slider'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(',')','[',']',
+ '+','-','*','/','&','^',
+ '=','+=','-=','*=','/=','&=',
+ '==','<','<=','>','>=',':=',
+ ',','.'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ 8 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #AAAAFF; font-weight: bold;', // reserved #blue
+ 2 => 'color: #88FF88;', // BIV yellow
+ 3 => 'color: #FF00FF; font-style: italic;', // commands purple
+ 4 => 'color: #888844; font-weight: bold;', // functions #0080FF
+ 5 => 'color: #000000; font-style: italic;', // directives #black
+ 6 => 'color: #FF0000; font-style: italic;', // hotkeys #red
+ 7 => 'color: #000000; font-style: italic;', // gui commands #black
+ 8 => 'color: #000000; font-style: italic;' // gui controls
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'font-style: italic; color: #669900;',
+ 1 => 'font-style: italic; color: #009933;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #00FF00; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'font-weight: bold; color: #008080;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0000FF; font-style: italic; font-weight: italic;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000; font-weight: italic;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'font-weight: italic; color: #A00A0;',
+ 1 => 'color: #CC0000; font-style: italic;',
+ 2 => 'color: #DD0000; font-style: italic;',
+ 3 => 'color: #88FF88;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '_'
+ ),
+ 'REGEXPS' => array(
+ //Variables
+ 0 => '%[a-zA-Z_][a-zA-Z0-9_]*%',
+ //hotstrings
+ 1 => '::[\w\d]+::',
+ //labels
+ 2 => '\w[\w\d]+:\s',
+ //Built-in Variables
+ 3 => '\bA_\w+\b(?![^<]*>)'
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => 'http://www.autohotkey.com/docs/Variables.htm#{FNAME}',
+ 3 => 'http://www.autohotkey.com/docs/commands/{FNAME}.htm',
+ 4 => 'http://www.autohotkey.com/docs/Functions.htm#BuiltIn',
+ 5 => 'http://www.autohotkey.com/docs/commands/_{FNAME}.htm',
+ 6 => '',
+ 7 => 'http://www.autohotkey.com/docs/commands/Gui.htm#{FNAME}',
+ 8 => 'http://www.autohotkey.com/docs/commands/GuiControls.htm#{FNAME}'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 5 => array(
+ 'DISALLOWED_BEFORE' => '(?<!\w)\#'
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/autoit.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/autoit.php
new file mode 100644
index 00000000..ab401b4c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/autoit.php
@@ -0,0 +1,1175 @@
+<?php
+/*************************************************************************************
+ * autoit.php
+ * --------
+ * Author: big_daddy (robert.i.anthony@gmail.com)
+ * Copyright: (c) 2006 and to GESHi ;)
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/01/26
+ *
+ * AutoIT language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * Release 1.0.8.1 (2008/09/15)
+ * - Updated on 22.03.2008 By Tlem (tlem@tuxolem.fr)
+ * - The link on functions will now correctly re-direct to
+ * - http://www.autoitscript.com/autoit3/docs/functions/{FNAME}.htm
+ * - Updated whith au3.api (09.02.2008).
+ * - Updated - 16 Mai 2008 - v3.2.12.0
+ * - Updated - 12 June 2008 - v3.2.12.1
+ * Release 1.0.7.20 (2006/01/26)
+ * - First Release
+ *
+ * Current bugs & todo:
+ * ----------
+ * - not sure how to get sendkeys to work " {!}, {SPACE} etc... "
+ * - just copyied the regexp for variable from php so this HAVE to be checked and fixed to a better one ;)
+ *
+ * Reference: http://www.autoitscript.com/autoit3/docs/
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not,
+write to the Free Software
+ * Foundation,
+Inc.,
+59 Temple Place,
+Suite 330,
+Boston,
+MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'AutoIt',
+ 'COMMENT_SINGLE' => array(';'),
+ 'COMMENT_MULTI' => array(
+ '#comments-start' => '#comments-end',
+ '#cs' => '#ce'),
+ 'COMMENT_REGEXP' => array(
+ 0 => '/(?<!#)#(\s.*)?$/m',
+ 1 => '/(?<=include)\s+<.*?>/'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'And','ByRef','Case','Const','ContinueCase','ContinueLoop',
+ 'Default','Dim','Do','Else','ElseIf','EndFunc','EndIf','EndSelect',
+ 'EndSwitch','EndWith','Enum','Exit','ExitLoop','False','For','Func',
+ 'Global','If','In','Local','Next','Not','Or','ReDim','Return',
+ 'Select','Step','Switch','Then','To','True','Until','WEnd','While',
+ 'With'
+ ),
+ 2 => array(
+ '@AppDataCommonDir','@AppDataDir','@AutoItExe','@AutoItPID',
+ '@AutoItUnicode','@AutoItVersion','@AutoItX64','@COM_EventObj',
+ '@CommonFilesDir','@Compiled','@ComputerName','@ComSpec','@CR',
+ '@CRLF','@DesktopCommonDir','@DesktopDepth','@DesktopDir',
+ '@DesktopHeight','@DesktopRefresh','@DesktopWidth',
+ '@DocumentsCommonDir','@error','@exitCode','@exitMethod',
+ '@extended','@FavoritesCommonDir','@FavoritesDir','@GUI_CtrlHandle',
+ '@GUI_CtrlId','@GUI_DragFile','@GUI_DragId','@GUI_DropId',
+ '@GUI_WinHandle','@HomeDrive','@HomePath','@HomeShare',
+ '@HotKeyPressed','@HOUR','@InetGetActive','@InetGetBytesRead',
+ '@IPAddress1','@IPAddress2','@IPAddress3','@IPAddress4','@KBLayout',
+ '@LF','@LogonDNSDomain','@LogonDomain','@LogonServer','@MDAY',
+ '@MIN','@MON','@MyDocumentsDir','@NumParams','@OSBuild','@OSLang',
+ '@OSServicePack','@OSTYPE','@OSVersion','@ProcessorArch',
+ '@ProgramFilesDir','@ProgramsCommonDir','@ProgramsDir','@ScriptDir',
+ '@ScriptFullPath','@ScriptLineNumber','@ScriptName','@SEC',
+ '@StartMenuCommonDir','@StartMenuDir','@StartupCommonDir',
+ '@StartupDir','@SW_DISABLE','@SW_ENABLE','@SW_HIDE','@SW_LOCK',
+ '@SW_MAXIMIZE','@SW_MINIMIZE','@SW_RESTORE','@SW_SHOW',
+ '@SW_SHOWDEFAULT','@SW_SHOWMAXIMIZED','@SW_SHOWMINIMIZED',
+ '@SW_SHOWMINNOACTIVE','@SW_SHOWNA','@SW_SHOWNOACTIVATE',
+ '@SW_SHOWNORMAL','@SW_UNLOCK','@SystemDir','@TAB','@TempDir',
+ '@TRAY_ID','@TrayIconFlashing','@TrayIconVisible','@UserName',
+ '@UserProfileDir','@WDAY','@WindowsDir','@WorkingDir','@YDAY',
+ '@YEAR'
+ ),
+ 3 => array(
+ 'Abs','ACos','AdlibDisable','AdlibEnable','Asc','AscW','ASin',
+ 'Assign','ATan','AutoItSetOption','AutoItWinGetTitle',
+ 'AutoItWinSetTitle','Beep','Binary','BinaryLen','BinaryMid',
+ 'BinaryToString','BitAND','BitNOT','BitOR','BitRotate','BitShift',
+ 'BitXOR','BlockInput','Break','Call','CDTray','Ceiling','Chr',
+ 'ChrW','ClipGet','ClipPut','ConsoleRead','ConsoleWrite',
+ 'ConsoleWriteError','ControlClick','ControlCommand',
+ 'ControlDisable','ControlEnable','ControlFocus','ControlGetFocus',
+ 'ControlGetHandle','ControlGetPos','ControlGetText','ControlHide',
+ 'ControlListView','ControlMove','ControlSend','ControlSetText',
+ 'ControlShow','ControlTreeView','Cos','Dec','DirCopy','DirCreate',
+ 'DirGetSize','DirMove','DirRemove','DllCall','DllCallbackFree',
+ 'DllCallbackGetPtr','DllCallbackRegister','DllClose','DllOpen',
+ 'DllStructCreate','DllStructGetData','DllStructGetPtr',
+ 'DllStructGetSize','DllStructSetData','DriveGetDrive',
+ 'DriveGetFileSystem','DriveGetLabel','DriveGetSerial',
+ 'DriveGetType','DriveMapAdd','DriveMapDel','DriveMapGet',
+ 'DriveSetLabel','DriveSpaceFree','DriveSpaceTotal','DriveStatus',
+ 'EnvGet','EnvSet','EnvUpdate','Eval','Execute','Exp',
+ 'FileChangeDir','FileClose','FileCopy','FileCreateNTFSLink',
+ 'FileCreateShortcut','FileDelete','FileExists','FileFindFirstFile',
+ 'FileFindNextFile','FileGetAttrib','FileGetLongName',
+ 'FileGetShortcut','FileGetShortName','FileGetSize','FileGetTime',
+ 'FileGetVersion','FileInstall','FileMove','FileOpen',
+ 'FileOpenDialog','FileRead','FileReadLine','FileRecycle',
+ 'FileRecycleEmpty','FileSaveDialog','FileSelectFolder',
+ 'FileSetAttrib','FileSetTime','FileWrite','FileWriteLine','Floor',
+ 'FtpSetProxy','GUICreate','GUICtrlCreateAvi','GUICtrlCreateButton',
+ 'GUICtrlCreateCheckbox','GUICtrlCreateCombo',
+ 'GUICtrlCreateContextMenu','GUICtrlCreateDate','GUICtrlCreateDummy',
+ 'GUICtrlCreateEdit','GUICtrlCreateGraphic','GUICtrlCreateGroup',
+ 'GUICtrlCreateIcon','GUICtrlCreateInput','GUICtrlCreateLabel',
+ 'GUICtrlCreateList','GUICtrlCreateListView',
+ 'GUICtrlCreateListViewItem','GUICtrlCreateMenu',
+ 'GUICtrlCreateMenuItem','GUICtrlCreateMonthCal','GUICtrlCreateObj',
+ 'GUICtrlCreatePic','GUICtrlCreateProgress','GUICtrlCreateRadio',
+ 'GUICtrlCreateSlider','GUICtrlCreateTab','GUICtrlCreateTabItem',
+ 'GUICtrlCreateTreeView','GUICtrlCreateTreeViewItem',
+ 'GUICtrlCreateUpdown','GUICtrlDelete','GUICtrlGetHandle',
+ 'GUICtrlGetState','GUICtrlRead','GUICtrlRecvMsg',
+ 'GUICtrlRegisterListViewSort','GUICtrlSendMsg','GUICtrlSendToDummy',
+ 'GUICtrlSetBkColor','GUICtrlSetColor','GUICtrlSetCursor',
+ 'GUICtrlSetData','GUICtrlSetFont','GUICtrlSetDefColor',
+ 'GUICtrlSetDefBkColor','GUICtrlSetGraphic','GUICtrlSetImage',
+ 'GUICtrlSetLimit','GUICtrlSetOnEvent','GUICtrlSetPos',
+ 'GUICtrlSetResizing','GUICtrlSetState','GUICtrlSetStyle',
+ 'GUICtrlSetTip','GUIDelete','GUIGetCursorInfo','GUIGetMsg',
+ 'GUIGetStyle','GUIRegisterMsg','GUISetAccelerators()',
+ 'GUISetBkColor','GUISetCoord','GUISetCursor','GUISetFont',
+ 'GUISetHelp','GUISetIcon','GUISetOnEvent','GUISetState',
+ 'GUISetStyle','GUIStartGroup','GUISwitch','Hex','HotKeySet',
+ 'HttpSetProxy','HWnd','InetGet','InetGetSize','IniDelete','IniRead',
+ 'IniReadSection','IniReadSectionNames','IniRenameSection',
+ 'IniWrite','IniWriteSection','InputBox','Int','IsAdmin','IsArray',
+ 'IsBinary','IsBool','IsDeclared','IsDllStruct','IsFloat','IsHWnd',
+ 'IsInt','IsKeyword','IsNumber','IsObj','IsPtr','IsString','Log',
+ 'MemGetStats','Mod','MouseClick','MouseClickDrag','MouseDown',
+ 'MouseGetCursor','MouseGetPos','MouseMove','MouseUp','MouseWheel',
+ 'MsgBox','Number','ObjCreate','ObjEvent','ObjGet','ObjName','Opt',
+ 'Ping','PixelChecksum','PixelGetColor','PixelSearch','PluginClose',
+ 'PluginOpen','ProcessClose','ProcessExists','ProcessGetStats',
+ 'ProcessList','ProcessSetPriority','ProcessWait','ProcessWaitClose',
+ 'ProgressOff','ProgressOn','ProgressSet','Ptr','Random','RegDelete',
+ 'RegEnumKey','RegEnumVal','RegRead','RegWrite','Round','Run',
+ 'RunAs','RunAsWait','RunWait','Send','SendKeepActive','SetError',
+ 'SetExtended','ShellExecute','ShellExecuteWait','Shutdown','Sin',
+ 'Sleep','SoundPlay','SoundSetWaveVolume','SplashImageOn',
+ 'SplashOff','SplashTextOn','Sqrt','SRandom','StatusbarGetText',
+ 'StderrRead','StdinWrite','StdioClose','StdoutRead','String',
+ 'StringAddCR','StringCompare','StringFormat','StringInStr',
+ 'StringIsAlNum','StringIsAlpha','StringIsASCII','StringIsDigit',
+ 'StringIsFloat','StringIsInt','StringIsLower','StringIsSpace',
+ 'StringIsUpper','StringIsXDigit','StringLeft','StringLen',
+ 'StringLower','StringMid','StringRegExp','StringRegExpReplace',
+ 'StringReplace','StringRight','StringSplit','StringStripCR',
+ 'StringStripWS','StringToBinary','StringTrimLeft','StringTrimRight',
+ 'StringUpper','Tan','TCPAccept','TCPCloseSocket','TCPConnect',
+ 'TCPListen','TCPNameToIP','TCPRecv','TCPSend','TCPShutdown',
+ 'TCPStartup','TimerDiff','TimerInit','ToolTip','TrayCreateItem',
+ 'TrayCreateMenu','TrayGetMsg','TrayItemDelete','TrayItemGetHandle',
+ 'TrayItemGetState','TrayItemGetText','TrayItemSetOnEvent',
+ 'TrayItemSetState','TrayItemSetText','TraySetClick','TraySetIcon',
+ 'TraySetOnEvent','TraySetPauseIcon','TraySetState','TraySetToolTip',
+ 'TrayTip','UBound','UDPBind','UDPCloseSocket','UDPOpen','UDPRecv',
+ 'UDPSend','UDPShutdown','UDPStartup','VarGetType','WinActivate',
+ 'WinActive','WinClose','WinExists','WinFlash','WinGetCaretPos',
+ 'WinGetClassList','WinGetClientSize','WinGetHandle','WinGetPos',
+ 'WinGetProcess','WinGetState','WinGetText','WinGetTitle','WinKill',
+ 'WinList','WinMenuSelectItem','WinMinimizeAll','WinMinimizeAllUndo',
+ 'WinMove','WinSetOnTop','WinSetState','WinSetTitle','WinSetTrans',
+ 'WinWait','WinWaitActive','WinWaitClose','WinWaitNotActive'
+ ),
+ 4 => array(
+ 'ArrayAdd','ArrayBinarySearch','ArrayConcatenate','ArrayDelete',
+ 'ArrayDisplay','ArrayFindAll','ArrayInsert','ArrayMax',
+ 'ArrayMaxIndex','ArrayMin','ArrayMinIndex','ArrayPop','ArrayPush',
+ 'ArrayReverse','ArraySearch','ArraySort','ArraySwap','ArrayToClip',
+ 'ArrayToString','ArrayTrim','ChooseColor','ChooseFont',
+ 'ClipBoard_ChangeChain','ClipBoard_Close','ClipBoard_CountFormats',
+ 'ClipBoard_Empty','ClipBoard_EnumFormats','ClipBoard_FormatStr',
+ 'ClipBoard_GetData','ClipBoard_GetDataEx','ClipBoard_GetFormatName',
+ 'ClipBoard_GetOpenWindow','ClipBoard_GetOwner',
+ 'ClipBoard_GetPriorityFormat','ClipBoard_GetSequenceNumber',
+ 'ClipBoard_GetViewer','ClipBoard_IsFormatAvailable',
+ 'ClipBoard_Open','ClipBoard_RegisterFormat','ClipBoard_SetData',
+ 'ClipBoard_SetDataEx','ClipBoard_SetViewer','ClipPutFile',
+ 'ColorConvertHSLtoRGB','ColorConvertRGBtoHSL','ColorGetBlue',
+ 'ColorGetGreen','ColorGetRed','Date_Time_CompareFileTime',
+ 'Date_Time_DOSDateTimeToArray','Date_Time_DOSDateTimeToFileTime',
+ 'Date_Time_DOSDateTimeToStr','Date_Time_DOSDateToArray',
+ 'Date_Time_DOSDateToStr','Date_Time_DOSTimeToArray',
+ 'Date_Time_DOSTimeToStr','Date_Time_EncodeFileTime',
+ 'Date_Time_EncodeSystemTime','Date_Time_FileTimeToArray',
+ 'Date_Time_FileTimeToDOSDateTime',
+ 'Date_Time_FileTimeToLocalFileTime','Date_Time_FileTimeToStr',
+ 'Date_Time_FileTimeToSystemTime','Date_Time_GetFileTime',
+ 'Date_Time_GetLocalTime','Date_Time_GetSystemTime',
+ 'Date_Time_GetSystemTimeAdjustment',
+ 'Date_Time_GetSystemTimeAsFileTime',
+ 'Date_Time_GetSystemTimes','Date_Time_GetTickCount',
+ 'Date_Time_GetTimeZoneInformation',
+ 'Date_Time_LocalFileTimeToFileTime','Date_Time_SetFileTime',
+ 'Date_Time_SetLocalTime','Date_Time_SetSystemTime',
+ 'Date_Time_SetSystemTimeAdjustment',
+ 'Date_Time_SetTimeZoneInformation','Date_Time_SystemTimeToArray',
+ 'Date_Time_SystemTimeToDateStr','Date_Time_SystemTimeToDateTimeStr',
+ 'Date_Time_SystemTimeToFileTime','Date_Time_SystemTimeToTimeStr',
+ 'Date_Time_SystemTimeToTzSpecificLocalTime',
+ 'Date_Time_TzSpecificLocalTimeToSystemTime','DateAdd',
+ 'DateDayOfWeek','DateDaysInMonth','DateDiff','DateIsLeapYear',
+ 'DateIsValid','DateTimeFormat','DateTimeSplit','DateToDayOfWeek',
+ 'DateToDayOfWeekISO','DateToDayValue','DateToMonth',
+ 'DayValueToDate','DebugBugReportEnv','DebugOut','DebugSetup',
+ 'Degree','EventLog__Backup','EventLog__Clear','EventLog__Close',
+ 'EventLog__Count','EventLog__DeregisterSource','EventLog__Full',
+ 'EventLog__Notify','EventLog__Oldest','EventLog__Open',
+ 'EventLog__OpenBackup','EventLog__Read','EventLog__RegisterSource',
+ 'EventLog__Report','FileCountLines','FileCreate','FileListToArray',
+ 'FilePrint','FileReadToArray','FileWriteFromArray',
+ 'FileWriteLog','FileWriteToLine','GDIPlus_ArrowCapCreate',
+ 'GDIPlus_ArrowCapDispose','GDIPlus_ArrowCapGetFillState',
+ 'GDIPlus_ArrowCapGetHeight','GDIPlus_ArrowCapGetMiddleInset',
+ 'GDIPlus_ArrowCapGetWidth','GDIPlus_ArrowCapSetFillState',
+ 'GDIPlus_ArrowCapSetHeight','GDIPlus_ArrowCapSetMiddleInset',
+ 'GDIPlus_ArrowCapSetWidth','GDIPlus_BitmapCloneArea',
+ 'GDIPlus_BitmapCreateFromFile','GDIPlus_BitmapCreateFromGraphics',
+ 'GDIPlus_BitmapCreateFromHBITMAP',
+ 'GDIPlus_BitmapCreateHBITMAPFromBitmap','GDIPlus_BitmapDispose',
+ 'GDIPlus_BitmapLockBits','GDIPlus_BitmapUnlockBits',
+ 'GDIPlus_BrushClone','GDIPlus_BrushCreateSolid',
+ 'GDIPlus_BrushDispose','GDIPlus_BrushGetType',
+ 'GDIPlus_CustomLineCapDispose','GDIPlus_Decoders',
+ 'GDIPlus_DecodersGetCount','GDIPlus_DecodersGetSize',
+ 'GDIPlus_Encoders','GDIPlus_EncodersGetCLSID',
+ 'GDIPlus_EncodersGetCount','GDIPlus_EncodersGetParamList',
+ 'GDIPlus_EncodersGetParamListSize','GDIPlus_EncodersGetSize',
+ 'GDIPlus_FontCreate','GDIPlus_FontDispose',
+ 'GDIPlus_FontFamilyCreate','GDIPlus_FontFamilyDispose',
+ 'GDIPlus_GraphicsClear','GDIPlus_GraphicsCreateFromHDC',
+ 'GDIPlus_GraphicsCreateFromHWND','GDIPlus_GraphicsDispose',
+ 'GDIPlus_GraphicsDrawArc','GDIPlus_GraphicsDrawBezier',
+ 'GDIPlus_GraphicsDrawClosedCurve','GDIPlus_GraphicsDrawCurve',
+ 'GDIPlus_GraphicsDrawEllipse','GDIPlus_GraphicsDrawImage',
+ 'GDIPlus_GraphicsDrawImageRect','GDIPlus_GraphicsDrawImageRectRect',
+ 'GDIPlus_GraphicsDrawLine','GDIPlus_GraphicsDrawPie',
+ 'GDIPlus_GraphicsDrawPolygon','GDIPlus_GraphicsDrawRect',
+ 'GDIPlus_GraphicsDrawString','GDIPlus_GraphicsDrawStringEx',
+ 'GDIPlus_GraphicsFillClosedCurve','GDIPlus_GraphicsFillEllipse',
+ 'GDIPlus_GraphicsFillPie','GDIPlus_GraphicsFillRect',
+ 'GDIPlus_GraphicsGetDC','GDIPlus_GraphicsGetSmoothingMode',
+ 'GDIPlus_GraphicsMeasureString','GDIPlus_GraphicsReleaseDC',
+ 'GDIPlus_GraphicsSetSmoothingMode','GDIPlus_GraphicsSetTransform',
+ 'GDIPlus_ImageDispose','GDIPlus_ImageGetGraphicsContext',
+ 'GDIPlus_ImageGetHeight','GDIPlus_ImageGetWidth',
+ 'GDIPlus_ImageLoadFromFile','GDIPlus_ImageSaveToFile',
+ 'GDIPlus_ImageSaveToFileEx','GDIPlus_MatrixCreate',
+ 'GDIPlus_MatrixDispose','GDIPlus_MatrixRotate','GDIPlus_ParamAdd',
+ 'GDIPlus_ParamInit','GDIPlus_PenCreate','GDIPlus_PenDispose',
+ 'GDIPlus_PenGetAlignment','GDIPlus_PenGetColor',
+ 'GDIPlus_PenGetCustomEndCap','GDIPlus_PenGetDashCap',
+ 'GDIPlus_PenGetDashStyle','GDIPlus_PenGetEndCap',
+ 'GDIPlus_PenGetWidth','GDIPlus_PenSetAlignment',
+ 'GDIPlus_PenSetColor','GDIPlus_PenSetCustomEndCap',
+ 'GDIPlus_PenSetDashCap','GDIPlus_PenSetDashStyle',
+ 'GDIPlus_PenSetEndCap','GDIPlus_PenSetWidth','GDIPlus_RectFCreate',
+ 'GDIPlus_Shutdown','GDIPlus_Startup','GDIPlus_StringFormatCreate',
+ 'GDIPlus_StringFormatDispose','GetIP','GUICtrlAVI_Close',
+ 'GUICtrlAVI_Create','GUICtrlAVI_Destroy','GUICtrlAVI_Open',
+ 'GUICtrlAVI_OpenEx','GUICtrlAVI_Play','GUICtrlAVI_Seek',
+ 'GUICtrlAVI_Show','GUICtrlAVI_Stop','GUICtrlButton_Click',
+ 'GUICtrlButton_Create','GUICtrlButton_Destroy',
+ 'GUICtrlButton_Enable','GUICtrlButton_GetCheck',
+ 'GUICtrlButton_GetFocus','GUICtrlButton_GetIdealSize',
+ 'GUICtrlButton_GetImage','GUICtrlButton_GetImageList',
+ 'GUICtrlButton_GetState','GUICtrlButton_GetText',
+ 'GUICtrlButton_GetTextMargin','GUICtrlButton_SetCheck',
+ 'GUICtrlButton_SetFocus','GUICtrlButton_SetImage',
+ 'GUICtrlButton_SetImageList','GUICtrlButton_SetSize',
+ 'GUICtrlButton_SetState','GUICtrlButton_SetStyle',
+ 'GUICtrlButton_SetText','GUICtrlButton_SetTextMargin',
+ 'GUICtrlButton_Show','GUICtrlComboBox_AddDir',
+ 'GUICtrlComboBox_AddString','GUICtrlComboBox_AutoComplete',
+ 'GUICtrlComboBox_BeginUpdate','GUICtrlComboBox_Create',
+ 'GUICtrlComboBox_DeleteString','GUICtrlComboBox_Destroy',
+ 'GUICtrlComboBox_EndUpdate','GUICtrlComboBox_FindString',
+ 'GUICtrlComboBox_FindStringExact','GUICtrlComboBox_GetComboBoxInfo',
+ 'GUICtrlComboBox_GetCount','GUICtrlComboBox_GetCurSel',
+ 'GUICtrlComboBox_GetDroppedControlRect',
+ 'GUICtrlComboBox_GetDroppedControlRectEx',
+ 'GUICtrlComboBox_GetDroppedState','GUICtrlComboBox_GetDroppedWidth',
+ 'GUICtrlComboBox_GetEditSel','GUICtrlComboBox_GetEditText',
+ 'GUICtrlComboBox_GetExtendedUI',
+ 'GUICtrlComboBox_GetHorizontalExtent',
+ 'GUICtrlComboBox_GetItemHeight','GUICtrlComboBox_GetLBText',
+ 'GUICtrlComboBox_GetLBTextLen','GUICtrlComboBox_GetList',
+ 'GUICtrlComboBox_GetListArray','GUICtrlComboBox_GetLocale',
+ 'GUICtrlComboBox_GetLocaleCountry','GUICtrlComboBox_GetLocaleLang',
+ 'GUICtrlComboBox_GetLocalePrimLang',
+ 'GUICtrlComboBox_GetLocaleSubLang','GUICtrlComboBox_GetMinVisible',
+ 'GUICtrlComboBox_GetTopIndex','GUICtrlComboBox_InitStorage',
+ 'GUICtrlComboBox_InsertString','GUICtrlComboBox_LimitText',
+ 'GUICtrlComboBox_ReplaceEditSel','GUICtrlComboBox_ResetContent',
+ 'GUICtrlComboBox_SelectString','GUICtrlComboBox_SetCurSel',
+ 'GUICtrlComboBox_SetDroppedWidth','GUICtrlComboBox_SetEditSel',
+ 'GUICtrlComboBox_SetEditText','GUICtrlComboBox_SetExtendedUI',
+ 'GUICtrlComboBox_SetHorizontalExtent',
+ 'GUICtrlComboBox_SetItemHeight','GUICtrlComboBox_SetMinVisible',
+ 'GUICtrlComboBox_SetTopIndex','GUICtrlComboBox_ShowDropDown',
+ 'GUICtrlComboBoxEx_AddDir','GUICtrlComboBoxEx_AddString',
+ 'GUICtrlComboBoxEx_BeginUpdate','GUICtrlComboBoxEx_Create',
+ 'GUICtrlComboBoxEx_CreateSolidBitMap',
+ 'GUICtrlComboBoxEx_DeleteString','GUICtrlComboBoxEx_Destroy',
+ 'GUICtrlComboBoxEx_EndUpdate','GUICtrlComboBoxEx_FindStringExact',
+ 'GUICtrlComboBoxEx_GetComboBoxInfo',
+ 'GUICtrlComboBoxEx_GetComboControl','GUICtrlComboBoxEx_GetCount',
+ 'GUICtrlComboBoxEx_GetCurSel',
+ 'GUICtrlComboBoxEx_GetDroppedControlRect',
+ 'GUICtrlComboBoxEx_GetDroppedControlRectEx',
+ 'GUICtrlComboBoxEx_GetDroppedState',
+ 'GUICtrlComboBoxEx_GetDroppedWidth',
+ 'GUICtrlComboBoxEx_GetEditControl','GUICtrlComboBoxEx_GetEditSel',
+ 'GUICtrlComboBoxEx_GetEditText',
+ 'GUICtrlComboBoxEx_GetExtendedStyle',
+ 'GUICtrlComboBoxEx_GetExtendedUI','GUICtrlComboBoxEx_GetImageList',
+ 'GUICtrlComboBoxEx_GetItem','GUICtrlComboBoxEx_GetItemEx',
+ 'GUICtrlComboBoxEx_GetItemHeight','GUICtrlComboBoxEx_GetItemImage',
+ 'GUICtrlComboBoxEx_GetItemIndent',
+ 'GUICtrlComboBoxEx_GetItemOverlayImage',
+ 'GUICtrlComboBoxEx_GetItemParam',
+ 'GUICtrlComboBoxEx_GetItemSelectedImage',
+ 'GUICtrlComboBoxEx_GetItemText','GUICtrlComboBoxEx_GetItemTextLen',
+ 'GUICtrlComboBoxEx_GetList','GUICtrlComboBoxEx_GetListArray',
+ 'GUICtrlComboBoxEx_GetLocale','GUICtrlComboBoxEx_GetLocaleCountry',
+ 'GUICtrlComboBoxEx_GetLocaleLang',
+ 'GUICtrlComboBoxEx_GetLocalePrimLang',
+ 'GUICtrlComboBoxEx_GetLocaleSubLang',
+ 'GUICtrlComboBoxEx_GetMinVisible','GUICtrlComboBoxEx_GetTopIndex',
+ 'GUICtrlComboBoxEx_InitStorage','GUICtrlComboBoxEx_InsertString',
+ 'GUICtrlComboBoxEx_LimitText','GUICtrlComboBoxEx_ReplaceEditSel',
+ 'GUICtrlComboBoxEx_ResetContent','GUICtrlComboBoxEx_SetCurSel',
+ 'GUICtrlComboBoxEx_SetDroppedWidth','GUICtrlComboBoxEx_SetEditSel',
+ 'GUICtrlComboBoxEx_SetEditText',
+ 'GUICtrlComboBoxEx_SetExtendedStyle',
+ 'GUICtrlComboBoxEx_SetExtendedUI','GUICtrlComboBoxEx_SetImageList',
+ 'GUICtrlComboBoxEx_SetItem','GUICtrlComboBoxEx_SetItemEx',
+ 'GUICtrlComboBoxEx_SetItemHeight','GUICtrlComboBoxEx_SetItemImage',
+ 'GUICtrlComboBoxEx_SetItemIndent',
+ 'GUICtrlComboBoxEx_SetItemOverlayImage',
+ 'GUICtrlComboBoxEx_SetItemParam',
+ 'GUICtrlComboBoxEx_SetItemSelectedImage',
+ 'GUICtrlComboBoxEx_SetMinVisible','GUICtrlComboBoxEx_SetTopIndex',
+ 'GUICtrlComboBoxEx_ShowDropDown','GUICtrlDTP_Create',
+ 'GUICtrlDTP_Destroy','GUICtrlDTP_GetMCColor','GUICtrlDTP_GetMCFont',
+ 'GUICtrlDTP_GetMonthCal','GUICtrlDTP_GetRange',
+ 'GUICtrlDTP_GetRangeEx','GUICtrlDTP_GetSystemTime',
+ 'GUICtrlDTP_GetSystemTimeEx','GUICtrlDTP_SetFormat',
+ 'GUICtrlDTP_SetMCColor','GUICtrlDTP_SetMCFont',
+ 'GUICtrlDTP_SetRange','GUICtrlDTP_SetRangeEx',
+ 'GUICtrlDTP_SetSystemTime','GUICtrlDTP_SetSystemTimeEx',
+ 'GUICtrlEdit_AppendText','GUICtrlEdit_BeginUpdate',
+ 'GUICtrlEdit_CanUndo','GUICtrlEdit_CharFromPos',
+ 'GUICtrlEdit_Create','GUICtrlEdit_Destroy',
+ 'GUICtrlEdit_EmptyUndoBuffer','GUICtrlEdit_EndUpdate',
+ 'GUICtrlEdit_Find','GUICtrlEdit_FmtLines',
+ 'GUICtrlEdit_GetFirstVisibleLine','GUICtrlEdit_GetLimitText',
+ 'GUICtrlEdit_GetLine','GUICtrlEdit_GetLineCount',
+ 'GUICtrlEdit_GetMargins','GUICtrlEdit_GetModify',
+ 'GUICtrlEdit_GetPasswordChar','GUICtrlEdit_GetRECT',
+ 'GUICtrlEdit_GetRECTEx','GUICtrlEdit_GetSel','GUICtrlEdit_GetText',
+ 'GUICtrlEdit_GetTextLen','GUICtrlEdit_HideBalloonTip',
+ 'GUICtrlEdit_InsertText','GUICtrlEdit_LineFromChar',
+ 'GUICtrlEdit_LineIndex','GUICtrlEdit_LineLength',
+ 'GUICtrlEdit_LineScroll','GUICtrlEdit_PosFromChar',
+ 'GUICtrlEdit_ReplaceSel','GUICtrlEdit_Scroll',
+ 'GUICtrlEdit_SetLimitText','GUICtrlEdit_SetMargins',
+ 'GUICtrlEdit_SetModify','GUICtrlEdit_SetPasswordChar',
+ 'GUICtrlEdit_SetReadOnly','GUICtrlEdit_SetRECT',
+ 'GUICtrlEdit_SetRECTEx','GUICtrlEdit_SetRECTNP',
+ 'GUICtrlEdit_SetRectNPEx','GUICtrlEdit_SetSel',
+ 'GUICtrlEdit_SetTabStops','GUICtrlEdit_SetText',
+ 'GUICtrlEdit_ShowBalloonTip','GUICtrlEdit_Undo',
+ 'GUICtrlHeader_AddItem','GUICtrlHeader_ClearFilter',
+ 'GUICtrlHeader_ClearFilterAll','GUICtrlHeader_Create',
+ 'GUICtrlHeader_CreateDragImage','GUICtrlHeader_DeleteItem',
+ 'GUICtrlHeader_Destroy','GUICtrlHeader_EditFilter',
+ 'GUICtrlHeader_GetBitmapMargin','GUICtrlHeader_GetImageList',
+ 'GUICtrlHeader_GetItem','GUICtrlHeader_GetItemAlign',
+ 'GUICtrlHeader_GetItemBitmap','GUICtrlHeader_GetItemCount',
+ 'GUICtrlHeader_GetItemDisplay','GUICtrlHeader_GetItemFlags',
+ 'GUICtrlHeader_GetItemFormat','GUICtrlHeader_GetItemImage',
+ 'GUICtrlHeader_GetItemOrder','GUICtrlHeader_GetItemParam',
+ 'GUICtrlHeader_GetItemRect','GUICtrlHeader_GetItemRectEx',
+ 'GUICtrlHeader_GetItemText','GUICtrlHeader_GetItemWidth',
+ 'GUICtrlHeader_GetOrderArray','GUICtrlHeader_GetUnicodeFormat',
+ 'GUICtrlHeader_HitTest','GUICtrlHeader_InsertItem',
+ 'GUICtrlHeader_Layout','GUICtrlHeader_OrderToIndex',
+ 'GUICtrlHeader_SetBitmapMargin',
+ 'GUICtrlHeader_SetFilterChangeTimeout',
+ 'GUICtrlHeader_SetHotDivider','GUICtrlHeader_SetImageList',
+ 'GUICtrlHeader_SetItem','GUICtrlHeader_SetItemAlign',
+ 'GUICtrlHeader_SetItemBitmap','GUICtrlHeader_SetItemDisplay',
+ 'GUICtrlHeader_SetItemFlags','GUICtrlHeader_SetItemFormat',
+ 'GUICtrlHeader_SetItemImage','GUICtrlHeader_SetItemOrder',
+ 'GUICtrlHeader_SetItemParam','GUICtrlHeader_SetItemText',
+ 'GUICtrlHeader_SetItemWidth','GUICtrlHeader_SetOrderArray',
+ 'GUICtrlHeader_SetUnicodeFormat','GUICtrlIpAddress_ClearAddress',
+ 'GUICtrlIpAddress_Create','GUICtrlIpAddress_Destroy',
+ 'GUICtrlIpAddress_Get','GUICtrlIpAddress_GetArray',
+ 'GUICtrlIpAddress_GetEx','GUICtrlIpAddress_IsBlank',
+ 'GUICtrlIpAddress_Set','GUICtrlIpAddress_SetArray',
+ 'GUICtrlIpAddress_SetEx','GUICtrlIpAddress_SetFocus',
+ 'GUICtrlIpAddress_SetFont','GUICtrlIpAddress_SetRange',
+ 'GUICtrlIpAddress_ShowHide','GUICtrlListBox_AddFile',
+ 'GUICtrlListBox_AddString','GUICtrlListBox_BeginUpdate',
+ 'GUICtrlListBox_Create','GUICtrlListBox_DeleteString',
+ 'GUICtrlListBox_Destroy','GUICtrlListBox_Dir',
+ 'GUICtrlListBox_EndUpdate','GUICtrlListBox_FindInText',
+ 'GUICtrlListBox_FindString','GUICtrlListBox_GetAnchorIndex',
+ 'GUICtrlListBox_GetCaretIndex','GUICtrlListBox_GetCount',
+ 'GUICtrlListBox_GetCurSel','GUICtrlListBox_GetHorizontalExtent',
+ 'GUICtrlListBox_GetItemData','GUICtrlListBox_GetItemHeight',
+ 'GUICtrlListBox_GetItemRect','GUICtrlListBox_GetItemRectEx',
+ 'GUICtrlListBox_GetListBoxInfo','GUICtrlListBox_GetLocale',
+ 'GUICtrlListBox_GetLocaleCountry','GUICtrlListBox_GetLocaleLang',
+ 'GUICtrlListBox_GetLocalePrimLang',
+ 'GUICtrlListBox_GetLocaleSubLang','GUICtrlListBox_GetSel',
+ 'GUICtrlListBox_GetSelCount','GUICtrlListBox_GetSelItems',
+ 'GUICtrlListBox_GetSelItemsText','GUICtrlListBox_GetText',
+ 'GUICtrlListBox_GetTextLen','GUICtrlListBox_GetTopIndex',
+ 'GUICtrlListBox_InitStorage','GUICtrlListBox_InsertString',
+ 'GUICtrlListBox_ItemFromPoint','GUICtrlListBox_ReplaceString',
+ 'GUICtrlListBox_ResetContent','GUICtrlListBox_SelectString',
+ 'GUICtrlListBox_SelItemRange','GUICtrlListBox_SelItemRangeEx',
+ 'GUICtrlListBox_SetAnchorIndex','GUICtrlListBox_SetCaretIndex',
+ 'GUICtrlListBox_SetColumnWidth','GUICtrlListBox_SetCurSel',
+ 'GUICtrlListBox_SetHorizontalExtent','GUICtrlListBox_SetItemData',
+ 'GUICtrlListBox_SetItemHeight','GUICtrlListBox_SetLocale',
+ 'GUICtrlListBox_SetSel','GUICtrlListBox_SetTabStops',
+ 'GUICtrlListBox_SetTopIndex','GUICtrlListBox_Sort',
+ 'GUICtrlListBox_SwapString','GUICtrlListBox_UpdateHScroll',
+ 'GUICtrlListView_AddArray','GUICtrlListView_AddColumn',
+ 'GUICtrlListView_AddItem','GUICtrlListView_AddSubItem',
+ 'GUICtrlListView_ApproximateViewHeight',
+ 'GUICtrlListView_ApproximateViewRect',
+ 'GUICtrlListView_ApproximateViewWidth','GUICtrlListView_Arrange',
+ 'GUICtrlListView_BeginUpdate','GUICtrlListView_CancelEditLabel',
+ 'GUICtrlListView_ClickItem','GUICtrlListView_CopyItems',
+ 'GUICtrlListView_Create','GUICtrlListView_CreateDragImage',
+ 'GUICtrlListView_CreateSolidBitMap',
+ 'GUICtrlListView_DeleteAllItems','GUICtrlListView_DeleteColumn',
+ 'GUICtrlListView_DeleteItem','GUICtrlListView_DeleteItemsSelected',
+ 'GUICtrlListView_Destroy','GUICtrlListView_DrawDragImage',
+ 'GUICtrlListView_EditLabel','GUICtrlListView_EnableGroupView',
+ 'GUICtrlListView_EndUpdate','GUICtrlListView_EnsureVisible',
+ 'GUICtrlListView_FindInText','GUICtrlListView_FindItem',
+ 'GUICtrlListView_FindNearest','GUICtrlListView_FindParam',
+ 'GUICtrlListView_FindText','GUICtrlListView_GetBkColor',
+ 'GUICtrlListView_GetBkImage','GUICtrlListView_GetCallbackMask',
+ 'GUICtrlListView_GetColumn','GUICtrlListView_GetColumnCount',
+ 'GUICtrlListView_GetColumnOrder',
+ 'GUICtrlListView_GetColumnOrderArray',
+ 'GUICtrlListView_GetColumnWidth','GUICtrlListView_GetCounterPage',
+ 'GUICtrlListView_GetEditControl',
+ 'GUICtrlListView_GetExtendedListViewStyle',
+ 'GUICtrlListView_GetGroupInfo',
+ 'GUICtrlListView_GetGroupViewEnabled','GUICtrlListView_GetHeader',
+ 'GUICtrlListView_GetHotCursor','GUICtrlListView_GetHotItem',
+ 'GUICtrlListView_GetHoverTime','GUICtrlListView_GetImageList',
+ 'GUICtrlListView_GetISearchString','GUICtrlListView_GetItem',
+ 'GUICtrlListView_GetItemChecked','GUICtrlListView_GetItemCount',
+ 'GUICtrlListView_GetItemCut','GUICtrlListView_GetItemDropHilited',
+ 'GUICtrlListView_GetItemEx','GUICtrlListView_GetItemFocused',
+ 'GUICtrlListView_GetItemGroupID','GUICtrlListView_GetItemImage',
+ 'GUICtrlListView_GetItemIndent','GUICtrlListView_GetItemParam',
+ 'GUICtrlListView_GetItemPosition',
+ 'GUICtrlListView_GetItemPositionX',
+ 'GUICtrlListView_GetItemPositionY','GUICtrlListView_GetItemRect',
+ 'GUICtrlListView_GetItemRectEx','GUICtrlListView_GetItemSelected',
+ 'GUICtrlListView_GetItemSpacing','GUICtrlListView_GetItemSpacingX',
+ 'GUICtrlListView_GetItemSpacingY','GUICtrlListView_GetItemState',
+ 'GUICtrlListView_GetItemStateImage','GUICtrlListView_GetItemText',
+ 'GUICtrlListView_GetItemTextArray',
+ 'GUICtrlListView_GetItemTextString','GUICtrlListView_GetNextItem',
+ 'GUICtrlListView_GetNumberOfWorkAreas','GUICtrlListView_GetOrigin',
+ 'GUICtrlListView_GetOriginX','GUICtrlListView_GetOriginY',
+ 'GUICtrlListView_GetOutlineColor',
+ 'GUICtrlListView_GetSelectedColumn',
+ 'GUICtrlListView_GetSelectedCount',
+ 'GUICtrlListView_GetSelectedIndices',
+ 'GUICtrlListView_GetSelectionMark','GUICtrlListView_GetStringWidth',
+ 'GUICtrlListView_GetSubItemRect','GUICtrlListView_GetTextBkColor',
+ 'GUICtrlListView_GetTextColor','GUICtrlListView_GetToolTips',
+ 'GUICtrlListView_GetTopIndex','GUICtrlListView_GetUnicodeFormat',
+ 'GUICtrlListView_GetView','GUICtrlListView_GetViewDetails',
+ 'GUICtrlListView_GetViewLarge','GUICtrlListView_GetViewList',
+ 'GUICtrlListView_GetViewRect','GUICtrlListView_GetViewSmall',
+ 'GUICtrlListView_GetViewTile','GUICtrlListView_HideColumn',
+ 'GUICtrlListView_HitTest','GUICtrlListView_InsertColumn',
+ 'GUICtrlListView_InsertGroup','GUICtrlListView_InsertItem',
+ 'GUICtrlListView_JustifyColumn','GUICtrlListView_MapIDToIndex',
+ 'GUICtrlListView_MapIndexToID','GUICtrlListView_RedrawItems',
+ 'GUICtrlListView_RegisterSortCallBack',
+ 'GUICtrlListView_RemoveAllGroups','GUICtrlListView_RemoveGroup',
+ 'GUICtrlListView_Scroll','GUICtrlListView_SetBkColor',
+ 'GUICtrlListView_SetBkImage','GUICtrlListView_SetCallBackMask',
+ 'GUICtrlListView_SetColumn','GUICtrlListView_SetColumnOrder',
+ 'GUICtrlListView_SetColumnOrderArray',
+ 'GUICtrlListView_SetColumnWidth',
+ 'GUICtrlListView_SetExtendedListViewStyle',
+ 'GUICtrlListView_SetGroupInfo','GUICtrlListView_SetHotItem',
+ 'GUICtrlListView_SetHoverTime','GUICtrlListView_SetIconSpacing',
+ 'GUICtrlListView_SetImageList','GUICtrlListView_SetItem',
+ 'GUICtrlListView_SetItemChecked','GUICtrlListView_SetItemCount',
+ 'GUICtrlListView_SetItemCut','GUICtrlListView_SetItemDropHilited',
+ 'GUICtrlListView_SetItemEx','GUICtrlListView_SetItemFocused',
+ 'GUICtrlListView_SetItemGroupID','GUICtrlListView_SetItemImage',
+ 'GUICtrlListView_SetItemIndent','GUICtrlListView_SetItemParam',
+ 'GUICtrlListView_SetItemPosition',
+ 'GUICtrlListView_SetItemPosition32',
+ 'GUICtrlListView_SetItemSelected','GUICtrlListView_SetItemState',
+ 'GUICtrlListView_SetItemStateImage','GUICtrlListView_SetItemText',
+ 'GUICtrlListView_SetOutlineColor',
+ 'GUICtrlListView_SetSelectedColumn',
+ 'GUICtrlListView_SetSelectionMark','GUICtrlListView_SetTextBkColor',
+ 'GUICtrlListView_SetTextColor','GUICtrlListView_SetToolTips',
+ 'GUICtrlListView_SetUnicodeFormat','GUICtrlListView_SetView',
+ 'GUICtrlListView_SetWorkAreas','GUICtrlListView_SimpleSort',
+ 'GUICtrlListView_SortItems','GUICtrlListView_SubItemHitTest',
+ 'GUICtrlListView_UnRegisterSortCallBack',
+ 'GUICtrlMenu_AddMenuItem','GUICtrlMenu_AppendMenu',
+ 'GUICtrlMenu_CheckMenuItem','GUICtrlMenu_CheckRadioItem',
+ 'GUICtrlMenu_CreateMenu','GUICtrlMenu_CreatePopup',
+ 'GUICtrlMenu_DeleteMenu','GUICtrlMenu_DestroyMenu',
+ 'GUICtrlMenu_DrawMenuBar','GUICtrlMenu_EnableMenuItem',
+ 'GUICtrlMenu_FindItem','GUICtrlMenu_FindParent',
+ 'GUICtrlMenu_GetItemBmp','GUICtrlMenu_GetItemBmpChecked',
+ 'GUICtrlMenu_GetItemBmpUnchecked','GUICtrlMenu_GetItemChecked',
+ 'GUICtrlMenu_GetItemCount','GUICtrlMenu_GetItemData',
+ 'GUICtrlMenu_GetItemDefault','GUICtrlMenu_GetItemDisabled',
+ 'GUICtrlMenu_GetItemEnabled','GUICtrlMenu_GetItemGrayed',
+ 'GUICtrlMenu_GetItemHighlighted','GUICtrlMenu_GetItemID',
+ 'GUICtrlMenu_GetItemInfo','GUICtrlMenu_GetItemRect',
+ 'GUICtrlMenu_GetItemRectEx','GUICtrlMenu_GetItemState',
+ 'GUICtrlMenu_GetItemStateEx','GUICtrlMenu_GetItemSubMenu',
+ 'GUICtrlMenu_GetItemText','GUICtrlMenu_GetItemType',
+ 'GUICtrlMenu_GetMenu','GUICtrlMenu_GetMenuBackground',
+ 'GUICtrlMenu_GetMenuBarInfo','GUICtrlMenu_GetMenuContextHelpID',
+ 'GUICtrlMenu_GetMenuData','GUICtrlMenu_GetMenuDefaultItem',
+ 'GUICtrlMenu_GetMenuHeight','GUICtrlMenu_GetMenuInfo',
+ 'GUICtrlMenu_GetMenuStyle','GUICtrlMenu_GetSystemMenu',
+ 'GUICtrlMenu_InsertMenuItem','GUICtrlMenu_InsertMenuItemEx',
+ 'GUICtrlMenu_IsMenu','GUICtrlMenu_LoadMenu',
+ 'GUICtrlMenu_MapAccelerator','GUICtrlMenu_MenuItemFromPoint',
+ 'GUICtrlMenu_RemoveMenu','GUICtrlMenu_SetItemBitmaps',
+ 'GUICtrlMenu_SetItemBmp','GUICtrlMenu_SetItemBmpChecked',
+ 'GUICtrlMenu_SetItemBmpUnchecked','GUICtrlMenu_SetItemChecked',
+ 'GUICtrlMenu_SetItemData','GUICtrlMenu_SetItemDefault',
+ 'GUICtrlMenu_SetItemDisabled','GUICtrlMenu_SetItemEnabled',
+ 'GUICtrlMenu_SetItemGrayed','GUICtrlMenu_SetItemHighlighted',
+ 'GUICtrlMenu_SetItemID','GUICtrlMenu_SetItemInfo',
+ 'GUICtrlMenu_SetItemState','GUICtrlMenu_SetItemSubMenu',
+ 'GUICtrlMenu_SetItemText','GUICtrlMenu_SetItemType',
+ 'GUICtrlMenu_SetMenu','GUICtrlMenu_SetMenuBackground',
+ 'GUICtrlMenu_SetMenuContextHelpID','GUICtrlMenu_SetMenuData',
+ 'GUICtrlMenu_SetMenuDefaultItem','GUICtrlMenu_SetMenuHeight',
+ 'GUICtrlMenu_SetMenuInfo','GUICtrlMenu_SetMenuStyle',
+ 'GUICtrlMenu_TrackPopupMenu','GUICtrlMonthCal_Create',
+ 'GUICtrlMonthCal_Destroy','GUICtrlMonthCal_GetColor',
+ 'GUICtrlMonthCal_GetColorArray','GUICtrlMonthCal_GetCurSel',
+ 'GUICtrlMonthCal_GetCurSelStr','GUICtrlMonthCal_GetFirstDOW',
+ 'GUICtrlMonthCal_GetFirstDOWStr','GUICtrlMonthCal_GetMaxSelCount',
+ 'GUICtrlMonthCal_GetMaxTodayWidth',
+ 'GUICtrlMonthCal_GetMinReqHeight','GUICtrlMonthCal_GetMinReqRect',
+ 'GUICtrlMonthCal_GetMinReqRectArray',
+ 'GUICtrlMonthCal_GetMinReqWidth','GUICtrlMonthCal_GetMonthDelta',
+ 'GUICtrlMonthCal_GetMonthRange','GUICtrlMonthCal_GetMonthRangeMax',
+ 'GUICtrlMonthCal_GetMonthRangeMaxStr',
+ 'GUICtrlMonthCal_GetMonthRangeMin',
+ 'GUICtrlMonthCal_GetMonthRangeMinStr',
+ 'GUICtrlMonthCal_GetMonthRangeSpan','GUICtrlMonthCal_GetRange',
+ 'GUICtrlMonthCal_GetRangeMax','GUICtrlMonthCal_GetRangeMaxStr',
+ 'GUICtrlMonthCal_GetRangeMin','GUICtrlMonthCal_GetRangeMinStr',
+ 'GUICtrlMonthCal_GetSelRange','GUICtrlMonthCal_GetSelRangeMax',
+ 'GUICtrlMonthCal_GetSelRangeMaxStr',
+ 'GUICtrlMonthCal_GetSelRangeMin',
+ 'GUICtrlMonthCal_GetSelRangeMinStr','GUICtrlMonthCal_GetToday',
+ 'GUICtrlMonthCal_GetTodayStr','GUICtrlMonthCal_GetUnicodeFormat',
+ 'GUICtrlMonthCal_HitTest','GUICtrlMonthCal_SetColor',
+ 'GUICtrlMonthCal_SetCurSel','GUICtrlMonthCal_SetDayState',
+ 'GUICtrlMonthCal_SetFirstDOW','GUICtrlMonthCal_SetMaxSelCount',
+ 'GUICtrlMonthCal_SetMonthDelta','GUICtrlMonthCal_SetRange',
+ 'GUICtrlMonthCal_SetSelRange','GUICtrlMonthCal_SetToday',
+ 'GUICtrlMonthCal_SetUnicodeFormat','GUICtrlRebar_AddBand',
+ 'GUICtrlRebar_AddToolBarBand','GUICtrlRebar_BeginDrag',
+ 'GUICtrlRebar_Create','GUICtrlRebar_DeleteBand',
+ 'GUICtrlRebar_Destroy','GUICtrlRebar_DragMove',
+ 'GUICtrlRebar_EndDrag','GUICtrlRebar_GetBandBackColor',
+ 'GUICtrlRebar_GetBandBorders','GUICtrlRebar_GetBandBordersEx',
+ 'GUICtrlRebar_GetBandChildHandle','GUICtrlRebar_GetBandChildSize',
+ 'GUICtrlRebar_GetBandCount','GUICtrlRebar_GetBandForeColor',
+ 'GUICtrlRebar_GetBandHeaderSize','GUICtrlRebar_GetBandID',
+ 'GUICtrlRebar_GetBandIdealSize','GUICtrlRebar_GetBandLength',
+ 'GUICtrlRebar_GetBandLParam','GUICtrlRebar_GetBandMargins',
+ 'GUICtrlRebar_GetBandMarginsEx','GUICtrlRebar_GetBandRect',
+ 'GUICtrlRebar_GetBandRectEx','GUICtrlRebar_GetBandStyle',
+ 'GUICtrlRebar_GetBandStyleBreak',
+ 'GUICtrlRebar_GetBandStyleChildEdge',
+ 'GUICtrlRebar_GetBandStyleFixedBMP',
+ 'GUICtrlRebar_GetBandStyleFixedSize',
+ 'GUICtrlRebar_GetBandStyleGripperAlways',
+ 'GUICtrlRebar_GetBandStyleHidden',
+ 'GUICtrlRebar_GetBandStyleHideTitle',
+ 'GUICtrlRebar_GetBandStyleNoGripper',
+ 'GUICtrlRebar_GetBandStyleTopAlign',
+ 'GUICtrlRebar_GetBandStyleUseChevron',
+ 'GUICtrlRebar_GetBandStyleVariableHeight',
+ 'GUICtrlRebar_GetBandText','GUICtrlRebar_GetBarHeight',
+ 'GUICtrlRebar_GetBKColor','GUICtrlRebar_GetColorScheme',
+ 'GUICtrlRebar_GetRowCount','GUICtrlRebar_GetRowHeight',
+ 'GUICtrlRebar_GetTextColor','GUICtrlRebar_GetToolTips',
+ 'GUICtrlRebar_GetUnicodeFormat','GUICtrlRebar_HitTest',
+ 'GUICtrlRebar_IDToIndex','GUICtrlRebar_MaximizeBand',
+ 'GUICtrlRebar_MinimizeBand','GUICtrlRebar_MoveBand',
+ 'GUICtrlRebar_SetBandBackColor','GUICtrlRebar_SetBandForeColor',
+ 'GUICtrlRebar_SetBandHeaderSize','GUICtrlRebar_SetBandID',
+ 'GUICtrlRebar_SetBandIdealSize','GUICtrlRebar_SetBandLength',
+ 'GUICtrlRebar_SetBandLParam','GUICtrlRebar_SetBandStyle',
+ 'GUICtrlRebar_SetBandStyleBreak',
+ 'GUICtrlRebar_SetBandStyleChildEdge',
+ 'GUICtrlRebar_SetBandStyleFixedBMP',
+ 'GUICtrlRebar_SetBandStyleFixedSize',
+ 'GUICtrlRebar_SetBandStyleGripperAlways',
+ 'GUICtrlRebar_SetBandStyleHidden',
+ 'GUICtrlRebar_SetBandStyleHideTitle',
+ 'GUICtrlRebar_SetBandStyleNoGripper',
+ 'GUICtrlRebar_SetBandStyleTopAlign',
+ 'GUICtrlRebar_SetBandStyleUseChevron',
+ 'GUICtrlRebar_SetBandStyleVariableHeight',
+ 'GUICtrlRebar_SetBandText','GUICtrlRebar_SetBKColor',
+ 'GUICtrlRebar_SetColorScheme','GUICtrlRebar_SetTextColor',
+ 'GUICtrlRebar_SetToolTips','GUICtrlRebar_SetUnicodeFormat',
+ 'GUICtrlRebar_ShowBand','GUICtrlSlider_ClearSel',
+ 'GUICtrlSlider_ClearTics','GUICtrlSlider_Create',
+ 'GUICtrlSlider_Destroy','GUICtrlSlider_GetBuddy',
+ 'GUICtrlSlider_GetChannelRect','GUICtrlSlider_GetLineSize',
+ 'GUICtrlSlider_GetNumTics','GUICtrlSlider_GetPageSize',
+ 'GUICtrlSlider_GetPos','GUICtrlSlider_GetPTics',
+ 'GUICtrlSlider_GetRange','GUICtrlSlider_GetRangeMax',
+ 'GUICtrlSlider_GetRangeMin','GUICtrlSlider_GetSel',
+ 'GUICtrlSlider_GetSelEnd','GUICtrlSlider_GetSelStart',
+ 'GUICtrlSlider_GetThumbLength','GUICtrlSlider_GetThumbRect',
+ 'GUICtrlSlider_GetThumbRectEx','GUICtrlSlider_GetTic',
+ 'GUICtrlSlider_GetTicPos','GUICtrlSlider_GetToolTips',
+ 'GUICtrlSlider_GetUnicodeFormat','GUICtrlSlider_SetBuddy',
+ 'GUICtrlSlider_SetLineSize','GUICtrlSlider_SetPageSize',
+ 'GUICtrlSlider_SetPos','GUICtrlSlider_SetRange',
+ 'GUICtrlSlider_SetRangeMax','GUICtrlSlider_SetRangeMin',
+ 'GUICtrlSlider_SetSel','GUICtrlSlider_SetSelEnd',
+ 'GUICtrlSlider_SetSelStart','GUICtrlSlider_SetThumbLength',
+ 'GUICtrlSlider_SetTic','GUICtrlSlider_SetTicFreq',
+ 'GUICtrlSlider_SetTipSide','GUICtrlSlider_SetToolTips',
+ 'GUICtrlSlider_SetUnicodeFormat','GUICtrlStatusBar_Create',
+ 'GUICtrlStatusBar_Destroy','GUICtrlStatusBar_EmbedControl',
+ 'GUICtrlStatusBar_GetBorders','GUICtrlStatusBar_GetBordersHorz',
+ 'GUICtrlStatusBar_GetBordersRect','GUICtrlStatusBar_GetBordersVert',
+ 'GUICtrlStatusBar_GetCount','GUICtrlStatusBar_GetHeight',
+ 'GUICtrlStatusBar_GetIcon','GUICtrlStatusBar_GetParts',
+ 'GUICtrlStatusBar_GetRect','GUICtrlStatusBar_GetRectEx',
+ 'GUICtrlStatusBar_GetText','GUICtrlStatusBar_GetTextFlags',
+ 'GUICtrlStatusBar_GetTextLength','GUICtrlStatusBar_GetTextLengthEx',
+ 'GUICtrlStatusBar_GetTipText','GUICtrlStatusBar_GetUnicodeFormat',
+ 'GUICtrlStatusBar_GetWidth','GUICtrlStatusBar_IsSimple',
+ 'GUICtrlStatusBar_Resize','GUICtrlStatusBar_SetBkColor',
+ 'GUICtrlStatusBar_SetIcon','GUICtrlStatusBar_SetMinHeight',
+ 'GUICtrlStatusBar_SetParts','GUICtrlStatusBar_SetSimple',
+ 'GUICtrlStatusBar_SetText','GUICtrlStatusBar_SetTipText',
+ 'GUICtrlStatusBar_SetUnicodeFormat','GUICtrlStatusBar_ShowHide',
+ 'GUICtrlTab_Create','GUICtrlTab_DeleteAllItems',
+ 'GUICtrlTab_DeleteItem','GUICtrlTab_DeselectAll',
+ 'GUICtrlTab_Destroy','GUICtrlTab_FindTab','GUICtrlTab_GetCurFocus',
+ 'GUICtrlTab_GetCurSel','GUICtrlTab_GetDisplayRect',
+ 'GUICtrlTab_GetDisplayRectEx','GUICtrlTab_GetExtendedStyle',
+ 'GUICtrlTab_GetImageList','GUICtrlTab_GetItem',
+ 'GUICtrlTab_GetItemCount','GUICtrlTab_GetItemImage',
+ 'GUICtrlTab_GetItemParam','GUICtrlTab_GetItemRect',
+ 'GUICtrlTab_GetItemRectEx','GUICtrlTab_GetItemState',
+ 'GUICtrlTab_GetItemText','GUICtrlTab_GetRowCount',
+ 'GUICtrlTab_GetToolTips','GUICtrlTab_GetUnicodeFormat',
+ 'GUICtrlTab_HighlightItem','GUICtrlTab_HitTest',
+ 'GUICtrlTab_InsertItem','GUICtrlTab_RemoveImage',
+ 'GUICtrlTab_SetCurFocus','GUICtrlTab_SetCurSel',
+ 'GUICtrlTab_SetExtendedStyle','GUICtrlTab_SetImageList',
+ 'GUICtrlTab_SetItem','GUICtrlTab_SetItemImage',
+ 'GUICtrlTab_SetItemParam','GUICtrlTab_SetItemSize',
+ 'GUICtrlTab_SetItemState','GUICtrlTab_SetItemText',
+ 'GUICtrlTab_SetMinTabWidth','GUICtrlTab_SetPadding',
+ 'GUICtrlTab_SetToolTips','GUICtrlTab_SetUnicodeFormat',
+ 'GUICtrlToolbar_AddBitmap','GUICtrlToolbar_AddButton',
+ 'GUICtrlToolbar_AddButtonSep','GUICtrlToolbar_AddString',
+ 'GUICtrlToolbar_ButtonCount','GUICtrlToolbar_CheckButton',
+ 'GUICtrlToolbar_ClickAccel','GUICtrlToolbar_ClickButton',
+ 'GUICtrlToolbar_ClickIndex','GUICtrlToolbar_CommandToIndex',
+ 'GUICtrlToolbar_Create','GUICtrlToolbar_Customize',
+ 'GUICtrlToolbar_DeleteButton','GUICtrlToolbar_Destroy',
+ 'GUICtrlToolbar_EnableButton','GUICtrlToolbar_FindToolbar',
+ 'GUICtrlToolbar_GetAnchorHighlight','GUICtrlToolbar_GetBitmapFlags',
+ 'GUICtrlToolbar_GetButtonBitmap','GUICtrlToolbar_GetButtonInfo',
+ 'GUICtrlToolbar_GetButtonInfoEx','GUICtrlToolbar_GetButtonParam',
+ 'GUICtrlToolbar_GetButtonRect','GUICtrlToolbar_GetButtonRectEx',
+ 'GUICtrlToolbar_GetButtonSize','GUICtrlToolbar_GetButtonState',
+ 'GUICtrlToolbar_GetButtonStyle','GUICtrlToolbar_GetButtonText',
+ 'GUICtrlToolbar_GetColorScheme',
+ 'GUICtrlToolbar_GetDisabledImageList',
+ 'GUICtrlToolbar_GetExtendedStyle','GUICtrlToolbar_GetHotImageList',
+ 'GUICtrlToolbar_GetHotItem','GUICtrlToolbar_GetImageList',
+ 'GUICtrlToolbar_GetInsertMark','GUICtrlToolbar_GetInsertMarkColor',
+ 'GUICtrlToolbar_GetMaxSize','GUICtrlToolbar_GetMetrics',
+ 'GUICtrlToolbar_GetPadding','GUICtrlToolbar_GetRows',
+ 'GUICtrlToolbar_GetString','GUICtrlToolbar_GetStyle',
+ 'GUICtrlToolbar_GetStyleAltDrag',
+ 'GUICtrlToolbar_GetStyleCustomErase','GUICtrlToolbar_GetStyleFlat',
+ 'GUICtrlToolbar_GetStyleList','GUICtrlToolbar_GetStyleRegisterDrop',
+ 'GUICtrlToolbar_GetStyleToolTips',
+ 'GUICtrlToolbar_GetStyleTransparent',
+ 'GUICtrlToolbar_GetStyleWrapable','GUICtrlToolbar_GetTextRows',
+ 'GUICtrlToolbar_GetToolTips','GUICtrlToolbar_GetUnicodeFormat',
+ 'GUICtrlToolbar_HideButton','GUICtrlToolbar_HighlightButton',
+ 'GUICtrlToolbar_HitTest','GUICtrlToolbar_IndexToCommand',
+ 'GUICtrlToolbar_InsertButton','GUICtrlToolbar_InsertMarkHitTest',
+ 'GUICtrlToolbar_IsButtonChecked','GUICtrlToolbar_IsButtonEnabled',
+ 'GUICtrlToolbar_IsButtonHidden',
+ 'GUICtrlToolbar_IsButtonHighlighted',
+ 'GUICtrlToolbar_IsButtonIndeterminate',
+ 'GUICtrlToolbar_IsButtonPressed','GUICtrlToolbar_LoadBitmap',
+ 'GUICtrlToolbar_LoadImages','GUICtrlToolbar_MapAccelerator',
+ 'GUICtrlToolbar_MoveButton','GUICtrlToolbar_PressButton',
+ 'GUICtrlToolbar_SetAnchorHighlight','GUICtrlToolbar_SetBitmapSize',
+ 'GUICtrlToolbar_SetButtonBitMap','GUICtrlToolbar_SetButtonInfo',
+ 'GUICtrlToolbar_SetButtonInfoEx','GUICtrlToolbar_SetButtonParam',
+ 'GUICtrlToolbar_SetButtonSize','GUICtrlToolbar_SetButtonState',
+ 'GUICtrlToolbar_SetButtonStyle','GUICtrlToolbar_SetButtonText',
+ 'GUICtrlToolbar_SetButtonWidth','GUICtrlToolbar_SetCmdID',
+ 'GUICtrlToolbar_SetColorScheme',
+ 'GUICtrlToolbar_SetDisabledImageList',
+ 'GUICtrlToolbar_SetDrawTextFlags','GUICtrlToolbar_SetExtendedStyle',
+ 'GUICtrlToolbar_SetHotImageList','GUICtrlToolbar_SetHotItem',
+ 'GUICtrlToolbar_SetImageList','GUICtrlToolbar_SetIndent',
+ 'GUICtrlToolbar_SetIndeterminate','GUICtrlToolbar_SetInsertMark',
+ 'GUICtrlToolbar_SetInsertMarkColor','GUICtrlToolbar_SetMaxTextRows',
+ 'GUICtrlToolbar_SetMetrics','GUICtrlToolbar_SetPadding',
+ 'GUICtrlToolbar_SetParent','GUICtrlToolbar_SetRows',
+ 'GUICtrlToolbar_SetStyle','GUICtrlToolbar_SetStyleAltDrag',
+ 'GUICtrlToolbar_SetStyleCustomErase','GUICtrlToolbar_SetStyleFlat',
+ 'GUICtrlToolbar_SetStyleList','GUICtrlToolbar_SetStyleRegisterDrop',
+ 'GUICtrlToolbar_SetStyleToolTips',
+ 'GUICtrlToolbar_SetStyleTransparent',
+ 'GUICtrlToolbar_SetStyleWrapable','GUICtrlToolbar_SetToolTips',
+ 'GUICtrlToolbar_SetUnicodeFormat','GUICtrlToolbar_SetWindowTheme',
+ 'GUICtrlTreeView_Add','GUICtrlTreeView_AddChild',
+ 'GUICtrlTreeView_AddChildFirst','GUICtrlTreeView_AddFirst',
+ 'GUICtrlTreeView_BeginUpdate','GUICtrlTreeView_ClickItem',
+ 'GUICtrlTreeView_Create','GUICtrlTreeView_CreateDragImage',
+ 'GUICtrlTreeView_CreateSolidBitMap','GUICtrlTreeView_Delete',
+ 'GUICtrlTreeView_DeleteAll','GUICtrlTreeView_DeleteChildren',
+ 'GUICtrlTreeView_Destroy','GUICtrlTreeView_DisplayRect',
+ 'GUICtrlTreeView_DisplayRectEx','GUICtrlTreeView_EditText',
+ 'GUICtrlTreeView_EndEdit','GUICtrlTreeView_EndUpdate',
+ 'GUICtrlTreeView_EnsureVisible','GUICtrlTreeView_Expand',
+ 'GUICtrlTreeView_ExpandedOnce','GUICtrlTreeView_FindItem',
+ 'GUICtrlTreeView_FindItemEx','GUICtrlTreeView_GetBkColor',
+ 'GUICtrlTreeView_GetBold','GUICtrlTreeView_GetChecked',
+ 'GUICtrlTreeView_GetChildCount','GUICtrlTreeView_GetChildren',
+ 'GUICtrlTreeView_GetCount','GUICtrlTreeView_GetCut',
+ 'GUICtrlTreeView_GetDropTarget','GUICtrlTreeView_GetEditControl',
+ 'GUICtrlTreeView_GetExpanded','GUICtrlTreeView_GetFirstChild',
+ 'GUICtrlTreeView_GetFirstItem','GUICtrlTreeView_GetFirstVisible',
+ 'GUICtrlTreeView_GetFocused','GUICtrlTreeView_GetHeight',
+ 'GUICtrlTreeView_GetImageIndex',
+ 'GUICtrlTreeView_GetImageListIconHandle',
+ 'GUICtrlTreeView_GetIndent','GUICtrlTreeView_GetInsertMarkColor',
+ 'GUICtrlTreeView_GetISearchString','GUICtrlTreeView_GetItemByIndex',
+ 'GUICtrlTreeView_GetItemHandle','GUICtrlTreeView_GetItemParam',
+ 'GUICtrlTreeView_GetLastChild','GUICtrlTreeView_GetLineColor',
+ 'GUICtrlTreeView_GetNext','GUICtrlTreeView_GetNextChild',
+ 'GUICtrlTreeView_GetNextSibling','GUICtrlTreeView_GetNextVisible',
+ 'GUICtrlTreeView_GetNormalImageList',
+ 'GUICtrlTreeView_GetParentHandle','GUICtrlTreeView_GetParentParam',
+ 'GUICtrlTreeView_GetPrev','GUICtrlTreeView_GetPrevChild',
+ 'GUICtrlTreeView_GetPrevSibling','GUICtrlTreeView_GetPrevVisible',
+ 'GUICtrlTreeView_GetScrollTime','GUICtrlTreeView_GetSelected',
+ 'GUICtrlTreeView_GetSelectedImageIndex',
+ 'GUICtrlTreeView_GetSelection','GUICtrlTreeView_GetSiblingCount',
+ 'GUICtrlTreeView_GetState','GUICtrlTreeView_GetStateImageIndex',
+ 'GUICtrlTreeView_GetStateImageList','GUICtrlTreeView_GetText',
+ 'GUICtrlTreeView_GetTextColor','GUICtrlTreeView_GetToolTips',
+ 'GUICtrlTreeView_GetTree','GUICtrlTreeView_GetUnicodeFormat',
+ 'GUICtrlTreeView_GetVisible','GUICtrlTreeView_GetVisibleCount',
+ 'GUICtrlTreeView_HitTest','GUICtrlTreeView_HitTestEx',
+ 'GUICtrlTreeView_HitTestItem','GUICtrlTreeView_Index',
+ 'GUICtrlTreeView_InsertItem','GUICtrlTreeView_IsFirstItem',
+ 'GUICtrlTreeView_IsParent','GUICtrlTreeView_Level',
+ 'GUICtrlTreeView_SelectItem','GUICtrlTreeView_SelectItemByIndex',
+ 'GUICtrlTreeView_SetBkColor','GUICtrlTreeView_SetBold',
+ 'GUICtrlTreeView_SetChecked','GUICtrlTreeView_SetCheckedByIndex',
+ 'GUICtrlTreeView_SetChildren','GUICtrlTreeView_SetCut',
+ 'GUICtrlTreeView_SetDropTarget','GUICtrlTreeView_SetFocused',
+ 'GUICtrlTreeView_SetHeight','GUICtrlTreeView_SetIcon',
+ 'GUICtrlTreeView_SetImageIndex','GUICtrlTreeView_SetIndent',
+ 'GUICtrlTreeView_SetInsertMark',
+ 'GUICtrlTreeView_SetInsertMarkColor',
+ 'GUICtrlTreeView_SetItemHeight','GUICtrlTreeView_SetItemParam',
+ 'GUICtrlTreeView_SetLineColor','GUICtrlTreeView_SetNormalImageList',
+ 'GUICtrlTreeView_SetScrollTime','GUICtrlTreeView_SetSelected',
+ 'GUICtrlTreeView_SetSelectedImageIndex','GUICtrlTreeView_SetState',
+ 'GUICtrlTreeView_SetStateImageIndex',
+ 'GUICtrlTreeView_SetStateImageList','GUICtrlTreeView_SetText',
+ 'GUICtrlTreeView_SetTextColor','GUICtrlTreeView_SetToolTips',
+ 'GUICtrlTreeView_SetUnicodeFormat','GUICtrlTreeView_Sort',
+ 'GUIImageList_Add','GUIImageList_AddBitmap','GUIImageList_AddIcon',
+ 'GUIImageList_AddMasked','GUIImageList_BeginDrag',
+ 'GUIImageList_Copy','GUIImageList_Create','GUIImageList_Destroy',
+ 'GUIImageList_DestroyIcon','GUIImageList_DragEnter',
+ 'GUIImageList_DragLeave','GUIImageList_DragMove',
+ 'GUIImageList_Draw','GUIImageList_DrawEx','GUIImageList_Duplicate',
+ 'GUIImageList_EndDrag','GUIImageList_GetBkColor',
+ 'GUIImageList_GetIcon','GUIImageList_GetIconHeight',
+ 'GUIImageList_GetIconSize','GUIImageList_GetIconSizeEx',
+ 'GUIImageList_GetIconWidth','GUIImageList_GetImageCount',
+ 'GUIImageList_GetImageInfoEx','GUIImageList_Remove',
+ 'GUIImageList_ReplaceIcon','GUIImageList_SetBkColor',
+ 'GUIImageList_SetIconSize','GUIImageList_SetImageCount',
+ 'GUIImageList_Swap','GUIScrollBars_EnableScrollBar',
+ 'GUIScrollBars_GetScrollBarInfoEx','GUIScrollBars_GetScrollBarRect',
+ 'GUIScrollBars_GetScrollBarRGState',
+ 'GUIScrollBars_GetScrollBarXYLineButton',
+ 'GUIScrollBars_GetScrollBarXYThumbBottom',
+ 'GUIScrollBars_GetScrollBarXYThumbTop',
+ 'GUIScrollBars_GetScrollInfo','GUIScrollBars_GetScrollInfoEx',
+ 'GUIScrollBars_GetScrollInfoMax','GUIScrollBars_GetScrollInfoMin',
+ 'GUIScrollBars_GetScrollInfoPage','GUIScrollBars_GetScrollInfoPos',
+ 'GUIScrollBars_GetScrollInfoTrackPos','GUIScrollBars_GetScrollPos',
+ 'GUIScrollBars_GetScrollRange','GUIScrollBars_Init',
+ 'GUIScrollBars_ScrollWindow','GUIScrollBars_SetScrollInfo',
+ 'GUIScrollBars_SetScrollInfoMax','GUIScrollBars_SetScrollInfoMin',
+ 'GUIScrollBars_SetScrollInfoPage','GUIScrollBars_SetScrollInfoPos',
+ 'GUIScrollBars_SetScrollRange','GUIScrollBars_ShowScrollBar',
+ 'GUIToolTip_Activate','GUIToolTip_AddTool','GUIToolTip_AdjustRect',
+ 'GUIToolTip_BitsToTTF','GUIToolTip_Create','GUIToolTip_DelTool',
+ 'GUIToolTip_Destroy','GUIToolTip_EnumTools',
+ 'GUIToolTip_GetBubbleHeight','GUIToolTip_GetBubbleSize',
+ 'GUIToolTip_GetBubbleWidth','GUIToolTip_GetCurrentTool',
+ 'GUIToolTip_GetDelayTime','GUIToolTip_GetMargin',
+ 'GUIToolTip_GetMarginEx','GUIToolTip_GetMaxTipWidth',
+ 'GUIToolTip_GetText','GUIToolTip_GetTipBkColor',
+ 'GUIToolTip_GetTipTextColor','GUIToolTip_GetTitleBitMap',
+ 'GUIToolTip_GetTitleText','GUIToolTip_GetToolCount',
+ 'GUIToolTip_GetToolInfo','GUIToolTip_HitTest',
+ 'GUIToolTip_NewToolRect','GUIToolTip_Pop','GUIToolTip_PopUp',
+ 'GUIToolTip_SetDelayTime','GUIToolTip_SetMargin',
+ 'GUIToolTip_SetMaxTipWidth','GUIToolTip_SetTipBkColor',
+ 'GUIToolTip_SetTipTextColor','GUIToolTip_SetTitle',
+ 'GUIToolTip_SetToolInfo','GUIToolTip_SetWindowTheme',
+ 'GUIToolTip_ToolExists','GUIToolTip_ToolToArray',
+ 'GUIToolTip_TrackActivate','GUIToolTip_TrackPosition',
+ 'GUIToolTip_TTFToBits','GUIToolTip_Update',
+ 'GUIToolTip_UpdateTipText','HexToString','IE_Example',
+ 'IE_Introduction','IE_VersionInfo','IEAction','IEAttach',
+ 'IEBodyReadHTML','IEBodyReadText','IEBodyWriteHTML','IECreate',
+ 'IECreateEmbedded','IEDocGetObj','IEDocInsertHTML',
+ 'IEDocInsertText','IEDocReadHTML','IEDocWriteHTML',
+ 'IEErrorHandlerDeRegister','IEErrorHandlerRegister','IEErrorNotify',
+ 'IEFormElementCheckBoxSelect','IEFormElementGetCollection',
+ 'IEFormElementGetObjByName','IEFormElementGetValue',
+ 'IEFormElementOptionSelect','IEFormElementRadioSelect',
+ 'IEFormElementSetValue','IEFormGetCollection','IEFormGetObjByName',
+ 'IEFormImageClick','IEFormReset','IEFormSubmit',
+ 'IEFrameGetCollection','IEFrameGetObjByName','IEGetObjById',
+ 'IEGetObjByName','IEHeadInsertEventScript','IEImgClick',
+ 'IEImgGetCollection','IEIsFrameSet','IELinkClickByIndex',
+ 'IELinkClickByText','IELinkGetCollection','IELoadWait',
+ 'IELoadWaitTimeout','IENavigate','IEPropertyGet','IEPropertySet',
+ 'IEQuit','IETableGetCollection','IETableWriteToArray',
+ 'IETagNameAllGetCollection','IETagNameGetCollection','Iif',
+ 'INetExplorerCapable','INetGetSource','INetMail','INetSmtpMail',
+ 'IsPressed','MathCheckDiv','Max','MemGlobalAlloc','MemGlobalFree',
+ 'MemGlobalLock','MemGlobalSize','MemGlobalUnlock','MemMoveMemory',
+ 'MemMsgBox','MemShowError','MemVirtualAlloc','MemVirtualAllocEx',
+ 'MemVirtualFree','MemVirtualFreeEx','Min','MouseTrap',
+ 'NamedPipes_CallNamedPipe','NamedPipes_ConnectNamedPipe',
+ 'NamedPipes_CreateNamedPipe','NamedPipes_CreatePipe',
+ 'NamedPipes_DisconnectNamedPipe',
+ 'NamedPipes_GetNamedPipeHandleState','NamedPipes_GetNamedPipeInfo',
+ 'NamedPipes_PeekNamedPipe','NamedPipes_SetNamedPipeHandleState',
+ 'NamedPipes_TransactNamedPipe','NamedPipes_WaitNamedPipe',
+ 'Net_Share_ConnectionEnum','Net_Share_FileClose',
+ 'Net_Share_FileEnum','Net_Share_FileGetInfo','Net_Share_PermStr',
+ 'Net_Share_ResourceStr','Net_Share_SessionDel',
+ 'Net_Share_SessionEnum','Net_Share_SessionGetInfo',
+ 'Net_Share_ShareAdd','Net_Share_ShareCheck','Net_Share_ShareDel',
+ 'Net_Share_ShareEnum','Net_Share_ShareGetInfo',
+ 'Net_Share_ShareSetInfo','Net_Share_StatisticsGetSvr',
+ 'Net_Share_StatisticsGetWrk','Now','NowCalc','NowCalcDate',
+ 'NowDate','NowTime','PathFull','PathMake','PathSplit',
+ 'ProcessGetName','ProcessGetPriority','Radian',
+ 'ReplaceStringInFile','RunDOS','ScreenCapture_Capture',
+ 'ScreenCapture_CaptureWnd','ScreenCapture_SaveImage',
+ 'ScreenCapture_SetBMPFormat','ScreenCapture_SetJPGQuality',
+ 'ScreenCapture_SetTIFColorDepth','ScreenCapture_SetTIFCompression',
+ 'Security__AdjustTokenPrivileges','Security__GetAccountSid',
+ 'Security__GetLengthSid','Security__GetTokenInformation',
+ 'Security__ImpersonateSelf','Security__IsValidSid',
+ 'Security__LookupAccountName','Security__LookupAccountSid',
+ 'Security__LookupPrivilegeValue','Security__OpenProcessToken',
+ 'Security__OpenThreadToken','Security__OpenThreadTokenEx',
+ 'Security__SetPrivilege','Security__SidToStringSid',
+ 'Security__SidTypeStr','Security__StringSidToSid','SendMessage',
+ 'SendMessageA','SetDate','SetTime','Singleton','SoundClose',
+ 'SoundLength','SoundOpen','SoundPause','SoundPlay','SoundPos',
+ 'SoundResume','SoundSeek','SoundStatus','SoundStop',
+ 'SQLite_Changes','SQLite_Close','SQLite_Display2DResult',
+ 'SQLite_Encode','SQLite_ErrCode','SQLite_ErrMsg','SQLite_Escape',
+ 'SQLite_Exec','SQLite_FetchData','SQLite_FetchNames',
+ 'SQLite_GetTable','SQLite_GetTable2d','SQLite_LastInsertRowID',
+ 'SQLite_LibVersion','SQLite_Open','SQLite_Query',
+ 'SQLite_QueryFinalize','SQLite_QueryReset','SQLite_QuerySingleRow',
+ 'SQLite_SaveMode','SQLite_SetTimeout','SQLite_Shutdown',
+ 'SQLite_SQLiteExe','SQLite_Startup','SQLite_TotalChanges',
+ 'StringAddComma','StringBetween','StringEncrypt','StringInsert',
+ 'StringProper','StringRepeat','StringReverse','StringSplit',
+ 'StringToHex','TCPIpToName','TempFile','TicksToTime','Timer_Diff',
+ 'Timer_GetTimerID','Timer_Init','Timer_KillAllTimers',
+ 'Timer_KillTimer','Timer_SetTimer','TimeToTicks','VersionCompare',
+ 'viClose','viExecCommand','viFindGpib','viGpibBusReset','viGTL',
+ 'viOpen','viSetAttribute','viSetTimeout','WeekNumberISO',
+ 'WinAPI_AttachConsole','WinAPI_AttachThreadInput','WinAPI_Beep',
+ 'WinAPI_BitBlt','WinAPI_CallNextHookEx','WinAPI_Check',
+ 'WinAPI_ClientToScreen','WinAPI_CloseHandle',
+ 'WinAPI_CommDlgExtendedError','WinAPI_CopyIcon',
+ 'WinAPI_CreateBitmap','WinAPI_CreateCompatibleBitmap',
+ 'WinAPI_CreateCompatibleDC','WinAPI_CreateEvent',
+ 'WinAPI_CreateFile','WinAPI_CreateFont','WinAPI_CreateFontIndirect',
+ 'WinAPI_CreateProcess','WinAPI_CreateSolidBitmap',
+ 'WinAPI_CreateSolidBrush','WinAPI_CreateWindowEx',
+ 'WinAPI_DefWindowProc','WinAPI_DeleteDC','WinAPI_DeleteObject',
+ 'WinAPI_DestroyIcon','WinAPI_DestroyWindow','WinAPI_DrawEdge',
+ 'WinAPI_DrawFrameControl','WinAPI_DrawIcon','WinAPI_DrawIconEx',
+ 'WinAPI_DrawText','WinAPI_EnableWindow','WinAPI_EnumDisplayDevices',
+ 'WinAPI_EnumWindows','WinAPI_EnumWindowsPopup',
+ 'WinAPI_EnumWindowsTop','WinAPI_ExpandEnvironmentStrings',
+ 'WinAPI_ExtractIconEx','WinAPI_FatalAppExit','WinAPI_FillRect',
+ 'WinAPI_FindExecutable','WinAPI_FindWindow','WinAPI_FlashWindow',
+ 'WinAPI_FlashWindowEx','WinAPI_FloatToInt',
+ 'WinAPI_FlushFileBuffers','WinAPI_FormatMessage','WinAPI_FrameRect',
+ 'WinAPI_FreeLibrary','WinAPI_GetAncestor','WinAPI_GetAsyncKeyState',
+ 'WinAPI_GetClassName','WinAPI_GetClientHeight',
+ 'WinAPI_GetClientRect','WinAPI_GetClientWidth',
+ 'WinAPI_GetCurrentProcess','WinAPI_GetCurrentProcessID',
+ 'WinAPI_GetCurrentThread','WinAPI_GetCurrentThreadId',
+ 'WinAPI_GetCursorInfo','WinAPI_GetDC','WinAPI_GetDesktopWindow',
+ 'WinAPI_GetDeviceCaps','WinAPI_GetDIBits','WinAPI_GetDlgCtrlID',
+ 'WinAPI_GetDlgItem','WinAPI_GetFileSizeEx','WinAPI_GetFocus',
+ 'WinAPI_GetForegroundWindow','WinAPI_GetIconInfo',
+ 'WinAPI_GetLastError','WinAPI_GetLastErrorMessage',
+ 'WinAPI_GetModuleHandle','WinAPI_GetMousePos','WinAPI_GetMousePosX',
+ 'WinAPI_GetMousePosY','WinAPI_GetObject','WinAPI_GetOpenFileName',
+ 'WinAPI_GetOverlappedResult','WinAPI_GetParent',
+ 'WinAPI_GetProcessAffinityMask','WinAPI_GetSaveFileName',
+ 'WinAPI_GetStdHandle','WinAPI_GetStockObject','WinAPI_GetSysColor',
+ 'WinAPI_GetSysColorBrush','WinAPI_GetSystemMetrics',
+ 'WinAPI_GetTextExtentPoint32','WinAPI_GetWindow',
+ 'WinAPI_GetWindowDC','WinAPI_GetWindowHeight',
+ 'WinAPI_GetWindowLong','WinAPI_GetWindowRect',
+ 'WinAPI_GetWindowText','WinAPI_GetWindowThreadProcessId',
+ 'WinAPI_GetWindowWidth','WinAPI_GetXYFromPoint',
+ 'WinAPI_GlobalMemStatus','WinAPI_GUIDFromString',
+ 'WinAPI_GUIDFromStringEx','WinAPI_HiWord','WinAPI_InProcess',
+ 'WinAPI_IntToFloat','WinAPI_InvalidateRect','WinAPI_IsClassName',
+ 'WinAPI_IsWindow','WinAPI_IsWindowVisible','WinAPI_LoadBitmap',
+ 'WinAPI_LoadImage','WinAPI_LoadLibrary','WinAPI_LoadLibraryEx',
+ 'WinAPI_LoadShell32Icon','WinAPI_LoadString','WinAPI_LocalFree',
+ 'WinAPI_LoWord','WinAPI_MakeDWord','WinAPI_MAKELANGID',
+ 'WinAPI_MAKELCID','WinAPI_MakeLong','WinAPI_MessageBeep',
+ 'WinAPI_Mouse_Event','WinAPI_MoveWindow','WinAPI_MsgBox',
+ 'WinAPI_MulDiv','WinAPI_MultiByteToWideChar',
+ 'WinAPI_MultiByteToWideCharEx','WinAPI_OpenProcess',
+ 'WinAPI_PointFromRect','WinAPI_PostMessage','WinAPI_PrimaryLangId',
+ 'WinAPI_PtInRect','WinAPI_ReadFile','WinAPI_ReadProcessMemory',
+ 'WinAPI_RectIsEmpty','WinAPI_RedrawWindow',
+ 'WinAPI_RegisterWindowMessage','WinAPI_ReleaseCapture',
+ 'WinAPI_ReleaseDC','WinAPI_ScreenToClient','WinAPI_SelectObject',
+ 'WinAPI_SetBkColor','WinAPI_SetCapture','WinAPI_SetCursor',
+ 'WinAPI_SetDefaultPrinter','WinAPI_SetDIBits','WinAPI_SetEvent',
+ 'WinAPI_SetFocus','WinAPI_SetFont','WinAPI_SetHandleInformation',
+ 'WinAPI_SetLastError','WinAPI_SetParent',
+ 'WinAPI_SetProcessAffinityMask','WinAPI_SetSysColors',
+ 'WinAPI_SetTextColor','WinAPI_SetWindowLong','WinAPI_SetWindowPos',
+ 'WinAPI_SetWindowsHookEx','WinAPI_SetWindowText',
+ 'WinAPI_ShowCursor','WinAPI_ShowError','WinAPI_ShowMsg',
+ 'WinAPI_ShowWindow','WinAPI_StringFromGUID','WinAPI_SubLangId',
+ 'WinAPI_SystemParametersInfo','WinAPI_TwipsPerPixelX',
+ 'WinAPI_TwipsPerPixelY','WinAPI_UnhookWindowsHookEx',
+ 'WinAPI_UpdateLayeredWindow','WinAPI_UpdateWindow',
+ 'WinAPI_ValidateClassName','WinAPI_WaitForInputIdle',
+ 'WinAPI_WaitForMultipleObjects','WinAPI_WaitForSingleObject',
+ 'WinAPI_WideCharToMultiByte','WinAPI_WindowFromPoint',
+ 'WinAPI_WriteConsole','WinAPI_WriteFile',
+ 'WinAPI_WriteProcessMemory','WinNet_AddConnection',
+ 'WinNet_AddConnection2','WinNet_AddConnection3',
+ 'WinNet_CancelConnection','WinNet_CancelConnection2',
+ 'WinNet_CloseEnum','WinNet_ConnectionDialog',
+ 'WinNet_ConnectionDialog1','WinNet_DisconnectDialog',
+ 'WinNet_DisconnectDialog1','WinNet_EnumResource',
+ 'WinNet_GetConnection','WinNet_GetConnectionPerformance',
+ 'WinNet_GetLastError','WinNet_GetNetworkInformation',
+ 'WinNet_GetProviderName','WinNet_GetResourceInformation',
+ 'WinNet_GetResourceParent','WinNet_GetUniversalName',
+ 'WinNet_GetUser','WinNet_OpenEnum','WinNet_RestoreConnection',
+ 'WinNet_UseConnection','Word_VersionInfo','WordAttach','WordCreate',
+ 'WordDocAdd','WordDocAddLink','WordDocAddPicture','WordDocClose',
+ 'WordDocFindReplace','WordDocGetCollection',
+ 'WordDocLinkGetCollection','WordDocOpen','WordDocPrint',
+ 'WordDocPropertyGet','WordDocPropertySet','WordDocSave',
+ 'WordDocSaveAs','WordErrorHandlerDeRegister',
+ 'WordErrorHandlerRegister','WordErrorNotify','WordMacroRun',
+ 'WordPropertyGet','WordPropertySet','WordQuit'
+ ),
+ 5 => array(
+ 'ce','comments-end','comments-start','cs','include','include-once',
+ 'NoTrayIcon','RequireAdmin'
+ ),
+ 6 => array(
+ 'AutoIt3Wrapper_Au3Check_Parameters',
+ 'AutoIt3Wrapper_Au3Check_Stop_OnWarning',
+ 'AutoIt3Wrapper_Change2CUI','AutoIt3Wrapper_Compression',
+ 'AutoIt3Wrapper_cvsWrapper_Parameters','AutoIt3Wrapper_Icon',
+ 'AutoIt3Wrapper_Outfile','AutoIt3Wrapper_Outfile_Type',
+ 'AutoIt3Wrapper_Plugin_Funcs','AutoIt3Wrapper_Res_Comment',
+ 'AutoIt3Wrapper_Res_Description','AutoIt3Wrapper_Res_Field',
+ 'AutoIt3Wrapper_Res_File_Add','AutoIt3Wrapper_Res_Fileversion',
+ 'AutoIt3Wrapper_Res_FileVersion_AutoIncrement',
+ 'AutoIt3Wrapper_Res_Icon_Add','AutoIt3Wrapper_Res_Language',
+ 'AutoIt3Wrapper_Res_LegalCopyright',
+ 'AutoIt3Wrapper_res_requestedExecutionLevel',
+ 'AutoIt3Wrapper_Res_SaveSource','AutoIt3Wrapper_Run_After',
+ 'AutoIt3Wrapper_Run_Au3check','AutoIt3Wrapper_Run_Before',
+ 'AutoIt3Wrapper_Run_cvsWrapper','AutoIt3Wrapper_Run_Debug_Mode',
+ 'AutoIt3Wrapper_Run_Obfuscator','AutoIt3Wrapper_Run_Tidy',
+ 'AutoIt3Wrapper_Tidy_Stop_OnError','AutoIt3Wrapper_UseAnsi',
+ 'AutoIt3Wrapper_UseUpx','AutoIt3Wrapper_UseX64',
+ 'AutoIt3Wrapper_Version','EndRegion','forceref',
+ 'Obfuscator_Ignore_Funcs','Obfuscator_Ignore_Variables',
+ 'Obfuscator_Parameters','Region','Tidy_Parameters'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(',')','[',']',
+ '+','-','*','/','&','^',
+ '=','+=','-=','*=','/=','&=',
+ '==','<','<=','>','>=',
+ ',','.'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000FF; font-weight: bold;',
+ 2 => 'color: #800000; font-weight: bold;',
+ 3 => 'color: #000080; font-style: italic; font-weight: bold;',
+ 4 => 'color: #0080FF; font-style: italic; font-weight: bold;',
+ 5 => 'color: #F000FF; font-style: italic;',
+ 6 => 'color: #A00FF0; font-style: italic;'
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'font-style: italic; color: #669900;',
+ 0 => 'font-style: italic; color: #009933;',
+ 1 => 'font-style: italic; color: #9977BB;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #FF0000; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'font-weight: bold; color: #9977BB;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #AC00A9; font-style: italic; font-weight: bold;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0000FF; font-style: italic; font-weight: bold;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #FF0000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'font-weight: bold; color: #AA0000;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://www.autoitscript.com/autoit3/docs/keywords.htm',
+ 2 => 'http://www.autoitscript.com/autoit3/docs/macros.htm',
+ 3 => 'http://www.autoitscript.com/autoit3/docs/functions/{FNAME}.htm',
+ 4 => '',
+ 5 => '',
+ 6 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ //Variables
+ 0 => '[\\$%@]+[a-zA-Z_][a-zA-Z0-9_]*'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 4 => array(
+ 'DISALLOWED_BEFORE' => '(?<!\w)\_'
+ ),
+ 5 => array(
+ 'DISALLOWED_BEFORE' => '(?<!\w)\#'
+ ),
+ 6 => array(
+ 'DISALLOWED_BEFORE' => '(?<!\w)\#'
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/avisynth.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/avisynth.php
new file mode 100644
index 00000000..88f66288
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/avisynth.php
@@ -0,0 +1,194 @@
+<?php
+/*************************************************************************************
+ * avisynth.php
+ * --------
+ * Author: Ryan Jones (sciguyryan@gmail.com)
+ * Copyright: (c) 2008 Ryan Jones
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/10/08
+ *
+ * AviSynth language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/10/08 (1.0.8.1)
+ * - First Release
+ *
+ * TODO (updated 2008/10/08)
+ * -------------------------
+ * * There are also some special words that can't currently be specified directly in GeSHi as they may
+ * also be used as variables which would really mess things up.
+ * * Also there is an issue with the escape character as this language uses a muti-character escape system. Escape char should be """ but has been left
+ * as empty due to this restiction.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'AviSynth',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/', '[*' => '*]'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ // Reserved words.
+ 1 => array(
+ 'try', 'cache', 'function', 'global', 'return'
+ ),
+ // Constants / special variables.
+ 2 => array(
+ 'true', 'yes', 'false', 'no', '__END__'
+ ),
+ // Internal Filters.
+ 3 => array(
+ 'AviSource', 'AviFileSource', 'AddBorders', 'AlignedSplice', 'AssumeFPS', 'AssumeScaledFPS',
+ 'AssumeFrameBased', 'AssumeFieldBased', 'AssumeBFF', 'AssumeTFF', 'Amplify', 'AmplifydB',
+ 'AssumeSampleRate', 'AudioDub', 'AudioDubEx', 'Animate', 'ApplyRange',
+ 'BicubicResize', 'BilinearResize', 'BlackmanResize', 'Blur', 'Bob', 'BlankClip', 'Blackness',
+ 'ColorYUV', 'ConvertBackToYUY2', 'ConvertToRGB', 'ConvertToRGB24', 'ConvertToRGB32',
+ 'ConvertToYUY2', 'ConvertToY8', 'ConvertToYV411', 'ConvertToYV12', 'ConvertToYV16', 'ConvertToYV24',
+ 'ColorKeyMask', 'Crop', 'CropBottom', 'ChangeFPS', 'ConvertFPS', 'ComplementParity', 'ConvertAudioTo8bit',
+ 'ConvertAudioTo16bit', 'ConvertAudioTo24bit', 'ConvertAudioTo32bit', 'ConvertAudioToFloat', 'ConvertToMono',
+ 'ConditionalFilter', 'ConditionalReader', 'ColorBars', 'Compare',
+ 'DirectShowSource', 'DeleteFrame', 'Dissolve', 'DuplicateFrame', 'DoubleWeave', 'DelayAudio',
+ 'EnsureVBRMP3Sync',
+ 'FixLuminance', 'FlipHorizontal', 'FlipVertical', 'FixBrokenChromaUpsampling', 'FadeIn0', 'FadeIn',
+ 'FadeIn2', 'FadeOut0', 'FadeOut', 'FadeOut2', 'FadeIO0', 'FadeIO', 'FadeIO2', 'FreezeFrame', 'FrameEvaluate',
+ 'GreyScale', 'GaussResize', 'GeneralConvolution', 'GetChannel', 'GetLeftChannel', 'GetRightChannel',
+ 'HorizontalReduceBy2', 'Histogram',
+ 'ImageReader', 'ImageSource', 'ImageWriter', 'Invert', 'Interleave', 'Info',
+ 'KillAudio', 'KillVideo',
+ 'Levels', 'Limiter', 'Layer', 'Letterbox', 'LanczosResize', 'Lanczos4Resize', 'Loop',
+ 'MergeARGB', 'MergeRGB', 'MergeChroma', 'MergeLuma', 'Merge', 'Mask', 'MaskHS', 'MergeChannels', 'MixAudio',
+ 'MonoToStereo', 'MessageClip',
+ 'Normalize',
+ 'OpenDMLSource', 'Overlay',
+ 'PointResize', 'PeculiarBlend', 'Pulldown',
+ 'RGBAdjust', 'ResetMask', 'Reverse', 'ResampleAudio', 'ReduceBy2',
+ 'SegmentedAviSource', 'SegmentedDirectShowSource', 'SoundOut', 'ShowAlpha', 'ShowRed', 'ShowGreen',
+ 'ShowBlue', 'SwapUV', 'Subtract', 'SincResize', 'Spline16Resize', 'Spline36Resize', 'Spline64Resize',
+ 'SelectEven', 'SelectOdd', 'SelectEvery', 'SelectRangeEvery', 'Sharpen', 'SpatialSoften', 'SeparateFields',
+ 'ShowFiveVersions', 'ShowFrameNumber', 'ShowSMPTE', 'ShowTime', 'StackHorizontal', 'StackVertical', 'Subtitle',
+ 'SwapFields', 'SuperEQ', 'SSRC', 'ScriptClip',
+ 'Tweak', 'TurnLeft', 'TurnRight', 'Turn180', 'TemporalSoften', 'TimeStretch', 'TCPServer', 'TCPSource', 'Trim',
+ 'Tone',
+ 'UToY', 'UToY8', 'UnalignedSplice',
+ 'VToY', 'VToY8', 'VerticalReduceBy2', 'Version',
+ 'WavSource', 'Weave', 'WriteFile', 'WriteFileIf', 'WriteFileStart', 'WriteFileEnd',
+ 'YToUV'
+ ),
+ // Internal functions.
+ 4 => array(
+ 'Abs', 'Apply', 'Assert', 'AverageLuma', 'AverageChromaU', 'AverageChromaV',
+ 'Ceil', 'Cos', 'Chr', 'ChromaUDifference', 'ChromaVDifference',
+ 'Defined', 'Default',
+ 'Exp', 'Exist', 'Eval',
+ 'Floor', 'Frac', 'Float', 'Findstr', 'GetMTMode',
+ 'HexValue',
+ 'Int', 'IsBool', 'IsClip', 'IsFloat', 'IsInt', 'IsString', 'Import',
+ 'LoadPlugin', 'Log', 'LCase', 'LeftStr', 'LumaDifference', 'LoadVirtualDubPlugin', 'LoadVFAPIPlugin',
+ 'LoadCPlugin', 'Load_Stdcall_Plugin',
+ 'Max', 'MulDiv', 'MidStr',
+ 'NOP',
+ 'OPT_AllowFloatAudio', 'OPT_UseWaveExtensible',
+ 'Pi', 'Pow',
+ 'Round', 'Rand', 'RevStr', 'RightStr', 'RGBDifference', 'RGBDifferenceFromPrevious', 'RGBDifferenceToNext',
+ 'Sin', 'Sqrt', 'Sign', 'Spline', 'StrLen', 'String', 'Select', 'SetMemoryMax', 'SetWorkingDir', 'SetMTMode',
+ 'SetPlanarLegacyAlignment',
+ 'Time',
+ 'UCase', 'UDifferenceFromPrevious', 'UDifferenceToNext', 'UPlaneMax', 'UPlaneMin', 'UPlaneMedian',
+ 'UPlaneMinMaxDifference',
+ 'Value', 'VersionNumber', 'VersionString', 'VDifferenceFromPrevious', 'VDifferenceToNext', 'VPlaneMax',
+ 'VPlaneMin', 'VPlaneMedian', 'VPlaneMinMaxDifference',
+ 'YDifferenceFromPrevious', 'YDifferenceToNext', 'YPlaneMax', 'YPlaneMin', 'YPlaneMedian',
+ 'YPlaneMinMaxDifference'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '+', '++', '-', '--', '/', '*', '%',
+ '=', '==', '<', '<=', '>', '>=', '<>', '!=',
+ '!', '?', ':',
+ '|', '||', '&&',
+ '\\',
+ '(', ')', '{', '}',
+ '.', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color:#9966CC; font-weight:bold;',
+ 2 => 'color:#0000FF; font-weight:bold;',
+ 3 => 'color:#CC3300; font-weight:bold;',
+ 4 => 'color:#660000; font-weight:bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color:#008000; font-style:italic;',
+ 'MULTI' => 'color:#000080; font-style:italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color:#000099;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color:#006600; font-weight:bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color:#996600;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color:#006666;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color:#9900CC;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color:#006600; font-weight:bold;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://avisynth.org/mediawiki/{FNAME}',
+ 4 => ''
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/awk.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/awk.php
new file mode 100644
index 00000000..1ec239b7
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/awk.php
@@ -0,0 +1,158 @@
+<?php
+/************************************************
+ * awk.php
+ * -------
+ * Author: George Pollard (porges@porg.es)
+ * Copyright: (c) 2009 George Pollard
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/01/28
+ *
+ * Awk language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/01/28 (1.0.8.5)
+ * - First Release
+ *
+ * TODO (updated 2009/01/28)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'awk',
+ 'COMMENT_SINGLE' => array(
+ 1 => '#'
+ ),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array (
+ 1 => array(
+ 'for', 'in', 'if', 'else', 'while', 'do', 'continue', 'break'
+ ),
+ 2 => array(
+ 'BEGIN', 'END'
+ ),
+ 3 => array(
+ 'ARGC', 'ARGV', 'CONVFMT', 'ENVIRON',
+ 'FILENAME', 'FNR', 'FS', 'NF', 'NR', 'OFMT',
+ 'OFS','ORS','RLENGTH','RS','RSTART','SUBSEP'
+ ),
+ 4 => array(
+ 'gsub','index','length','match','split',
+ 'sprintf','sub','substr','tolower','toupper',
+ 'atan2','cos','exp','int','log','rand',
+ 'sin','sqrt','srand'
+ ),
+ 5 => array(
+ 'print','printf','getline','close','fflush','system'
+ ),
+ 6 => array(
+ 'function', 'return'
+ )
+ ),
+ 'SYMBOLS' => array (
+ 0 => array(
+ '(',')','[',']','{','}'
+ ),
+ 1 => array(
+ '!','||','&&'
+ ),
+ 2 => array(
+ '<','>','<=','>=','==','!='
+ ),
+ 3 => array(
+ '+','-','*','/','%','^','++','--'
+ ),
+ 4 => array(
+ '~','!~'
+ ),
+ 5 => array(
+ '?',':'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #C20CB9; font-weight: bold;',
+ 3 => 'color: #4107D5; font-weight: bold;',
+ 4 => 'color: #07D589; font-weight: bold;',
+ 5 => 'color: #0BD507; font-weight: bold;',
+ 6 => 'color: #078CD5; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color:#808080;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color:black;',
+ 1 => 'color:black;',
+ 2 => 'color:black;',
+ 3 => 'color:black;',
+ 4 => 'color:#C4C364;',
+ 5 => 'color:black;font-weight:bold;'),
+ 'SCRIPT' => array(),
+ 'REGEXPS' => array(
+ 0 => 'color:#000088;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #7a0874; font-weight: bold;'
+ ),
+ 'METHODS' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array (),
+ 'REGEXPS' => array(
+ 0 => "\\$[a-zA-Z0-9_]+"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array (),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bascomavr.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bascomavr.php
new file mode 100644
index 00000000..864f74e8
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bascomavr.php
@@ -0,0 +1,185 @@
+<?php
+/*************************************************************************************
+ * bascomavr.php
+ * ---------------------------------
+ * Author: aquaticus.info
+ * Copyright: (c) 2008 aquaticus.info
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/01/09
+ *
+ * BASCOM AVR language file for GeSHi.
+ *
+ * You can find the BASCOM AVR Website at (www.mcselec.com/bascom-avr.htm)
+ *
+ * CHANGES
+ * -------
+ * 2008/01/09 (1.0.8.10)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'BASCOM AVR',
+ 'COMMENT_SINGLE' => array(1 => "'"),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ // Navy Blue Bold Keywords
+ '1WRESET' , '1WREAD' , '1WWRITE' , '1WSEARCHFIRST' , '1WSEARCHNEXT' ,'1WVERIFY' , '1WIRECOUNT',
+ 'CONFIG' , 'ACI' , 'ADC' , 'BCCARD' , 'CLOCK' , 'COM1' ,
+ 'COM2' , 'PS2EMU' , 'ATEMU' , 'I2CSLAVE' ,
+ 'INPUT', 'OUTPUT', 'GRAPHLCD' , 'KEYBOARD' , 'TIMER0' , 'TIMER1' ,
+ 'LCDBUS' , 'LCDMODE' , '1WIRE' , 'LCD' , 'SERIALOUT' ,
+ 'SERIALIN' , 'SPI' , 'LCDPIN' , 'SDA' , 'SCL' ,
+ 'WATCHDOG' , 'PORT' , 'COUNTER0', 'COUNTER1' , 'TCPIP' , 'TWISLAVE' ,
+ 'X10' , 'XRAM' , 'USB',
+ 'BCD' , 'GRAY2BIN' , 'BIN2GRAY' , 'BIN' , 'MAKEBCD' , 'MAKEDEC' , 'MAKEINT' , 'FORMAT' , 'FUSING' , 'BINVAL' ,
+ 'CRC8' , 'CRC16' , 'CRC16UNI' , 'CRC32' , 'HIGH' , 'HIGHW' , 'LOW',
+ 'DATE' , 'TIME' , 'DATE$' , 'TIME$' , 'DAYOFWEEK' , 'DAYOFYEAR' , 'SECOFDAY' , 'SECELAPSED' , 'SYSDAY' , 'SYSSEC' , 'SYSSECELAPSED',
+ 'WAIT' , 'WAITMS' , 'WAITUS' , 'DELAY',
+ 'BSAVE' , 'BLOAD' , 'GET' , 'VER' , 'DISKFREE' , 'DIR' , 'DriveReset' , 'DriveInit' , 'LINE' , 'INITFILESYSTEM' ,
+ 'EOF' , 'WRITE' , 'FLUSH' , 'FREEFILE' , 'FILEATTR' , 'FILEDATE' , 'FILETIME' , 'FILEDATETIME' , 'FILELEN' , 'SEEK' ,
+ 'KILL' , 'DriveGetIdentity' , 'DriveWriteSector' , 'DriveReadSector' , 'LOC' , 'LOF' , 'PUT' , 'OPEN' , 'CLOSE',
+ 'GLCDCMD' , 'GLCDDATA' , 'SETFONT' , 'PSET' , 'SHOWPIC' , 'SHOWPICE' , 'CIRCLE' , 'BOX',
+ 'I2CINIT' , 'I2CRECEIVE' , 'I2CSEND' , 'I2CSTART','I2CSTOP','I2CRBYTE','I2CWBYTE',
+ 'ALIAS' , 'BITWAIT' , 'TOGGLE' , 'RESET' , 'SET' , 'SHIFTIN' , 'SHIFTOUT' , 'DEBOUNCE' , 'PULSEIN' , 'PULSEOUT',
+ 'IDLE' , 'POWERDOWN' , 'POWERSAVE' , 'ON', 'INTERRUPT' , 'ENABLE' , 'DISABLE' , 'START' , 'VERSION' , 'CLOCKDIVISION' , 'CRYSTAL' , 'STOP',
+ 'ADR' , 'ADR2' , 'WRITEEEPROM' , 'CPEEK' , 'CPEEKH' , 'PEEK' , 'POKE' , 'OUT' , 'READEEPROM' , 'DATA' , 'INP' , 'READ' , 'RESTORE' , 'LOOKDOWN' , 'LOOKUP' , 'LOOKUPSTR' , 'LOAD' , 'LOADADR' , 'LOADLABEL' , 'LOADWORDADR' , 'MEMCOPY',
+ 'RC5SEND' , 'RC6SEND' , 'GETRC5' , 'SONYSEND',
+ 'BAUD' , 'BAUD1', 'BUFSPACE' , 'CLEAR', 'ECHO' , 'WAITKEY' , 'ISCHARWAITING' , 'INKEY' , 'INPUTBIN' , 'INPUTHEX' , 'PRINT', 'PRINT1','PRINT0', 'PRINTBIN' , 'SERIN' , 'SEROUT' , 'SPC' , 'MAKEMODBUS',
+ 'SPIIN' , 'SPIINIT' , 'SPIMOVE' , 'SPIOUT', 'SINGLE',
+ 'ASC' , 'UCASE' , 'LCASE' , 'TRIM' , 'SPLIT' , 'LTRIM' , 'INSTR' , 'SPACE' , 'RTRIM' , 'LEFT' , 'LEN' , 'MID' , 'RIGHT' , 'VAL' , 'STR' , 'CHR' , 'CHECKSUM' , 'HEX' , 'HEXVAL',
+ 'BASE64DEC' , 'BASE64ENC' , 'IP2STR' , 'UDPREAD' , 'UDPWRITE' , 'UDPWRITESTR' , 'TCPWRITE' , 'TCPWRITESTR' , 'TCPREAD' , 'GETDSTIP' , 'GETDSTPORT' , 'SOCKETSTAT' , 'SOCKETCONNECT' , 'SOCKETLISTEN' , 'GETSOCKET' , 'CLOSESOCKET' ,
+ 'SETTCP' , 'GETTCPREGS' , 'SETTCPREGS' , 'SETIPPROTOCOL' , 'TCPCHECKSUM',
+ 'HOME' , 'CURSOR' , 'UPPERLINE' , 'THIRDLINE' , 'INITLCD' , 'LOWERLINE' , 'LCDAT' , 'FOURTHLINE' , 'DISPLAY' , 'LCDCONTRAST' , 'LOCATE' , 'SHIFTCURSOR' , 'DEFLCDCHAR' , 'SHIFTLCD' , 'CLS',
+ 'ACOS' , 'ASIN' , 'ATN' , 'ATN2' , 'EXP' , 'RAD2DEG' , 'FRAC' , 'TAN' , 'TANH' , 'COS' , 'COSH' , 'LOG' , 'LOG10' , 'ROUND' , 'ABS' , 'INT' , 'MAX' , 'MIN' , 'SQR' , 'SGN' , 'POWER' , 'SIN' , 'SINH' , 'FIX' , 'INCR' , 'DECR' , 'DEG2RAD',
+ 'DBG' , 'DEBUG', 'DTMFOUT' , 'ENCODER' , 'GETADC' , 'GETKBD' , 'GETATKBD' , 'GETRC' , 'VALUE' , 'POPALL' , 'PS2MOUSEXY' , 'PUSHALL' ,
+ 'RETURN' , 'RND' , 'ROTATE' , 'SENDSCAN' , 'SENDSCANKBD' , 'SHIFT' , 'SOUND' , 'STCHECK' , 'SWAP' , 'VARPTR' , 'X10DETECT' , 'X10SEND' , 'READMAGCARD' , 'REM' , 'BITS' , 'BYVAL' , 'CALL' , 'READHITAG',
+ 'Buffered', 'Size', 'Dummy', 'Parity', 'None', 'Stopbits', 'Databits', 'Clockpol', 'Synchrone', 'Prescaler', 'Reference', 'int0', 'int1', 'Interrupts',
+ 'Auto', 'avcc', 'ack', 'nack', 'Pin', 'Db4', 'Db3', 'Db2', 'Db1', 'Db7', 'Db6', 'Db5', 'Db0', 'e', 'rs', 'twi',
+ ),
+ 2 => array(
+ // Red Lowercase Keywords
+ '$ASM' , '$BAUD' , '$BAUD1' , '$BGF' , '$BOOT' , '$CRYSTAL' , '$DATA' , '$DBG' , '$DEFAULT' , '$EEPLEAVE' , '$EEPROM' ,
+ '$EEPROMHEX' , '$EXTERNAL' , '$HWSTACK' , '$INC' , '$INCLUDE' , '$INITMICRO' , '$LCD' , '$LCDRS' , '$LCDPUTCTRL' ,
+ '$LCDPUTDATA' , '$LCDVFO' , '$LIB' , '$LOADER' , '$LOADERSIZE' , '$MAP' , '$NOCOMPILE' , '$NOINIT' , '$NORAMCLEAR' ,
+ '$PROG' , '$PROGRAMMER' , '$REGFILE' , '$RESOURCE' , '$ROMSTART', '$SERIALINPUT', '$SERIALINPUT1' , '$SERIALINPUT2LCD' ,
+ '$SERIALOUTPUT' , '$SERIALOUTPUT1' , '$SIM' , '$SWSTACK' , '$TIMEOUT' , '$TINY' , '$WAITSTATE' , '$XRAMSIZE' , '$XRAMSTART', '$XA',
+ '#IF' , '#ELSE' , '#ENDIF', '$framesize'
+ ),
+ 3 => array(
+ // Blue Lowercase Keywords
+ 'IF', 'THEN', 'ELSE', 'END', 'WHILE', 'WEND', 'DO', 'LOOP', 'SELECT', 'CASE', 'FOR', 'NEXT',
+ 'GOSUB' , 'GOTO' , 'LOCAL' , 'SUB' , 'DEFBIT', 'DEFBYTE', 'DEFINT', 'DEFWORD', 'DEFLNG', 'DEFSNG', 'DEFDBL',
+ 'CONST', 'DECLARE', 'FUNCTION', 'DIM', 'EXIT', 'LONG', 'INTEGER', 'BYTE', 'AS', 'STRING', 'WORD'
+ ),
+ 4 => array(
+ //light blue
+ 'PINA.0', 'PINA.1', 'PINA.2', 'PINA.3', 'PINA.4', 'PINA.5', 'PINA.6', 'PINA.7',
+ 'PINB.0', 'PINB.1', 'PINB.2', 'PINB.3', 'PINB.4', 'PINB.5', 'PINB.6', 'PINB.7',
+ 'PINC.0', 'PINC.1', 'PINC.2', 'PINC.3', 'PINC.4', 'PINC.5', 'PINC.6', 'PINC.7',
+ 'PIND.0', 'PIND.1', 'PIND.2', 'PIND.3', 'PIND.4', 'PIND.5', 'PIND.6', 'PIND.7',
+ 'PINE.0', 'PINE.1', 'PINE.2', 'PINE.3', 'PINE.4', 'PINE.5', 'PINE.6', 'PINE.7',
+ 'PINF.0', 'PINF.1', 'PINF.2', 'PINF.3', 'PINF.4', 'PINF.5', 'PINF.6', 'PINF.7',
+
+ 'PORTA.0', 'PORTA.1', 'PORTA.2', 'PORTA.3', 'PORTA.4', 'PORTA.5', 'PORTA.6', 'PORTA.7',
+ 'PORTB.0', 'PORTB.1', 'PORTB.2', 'PORTB.3', 'PORTB.4', 'PORTB.5', 'PORTB.6', 'PORTB.7',
+ 'PORTC.0', 'PORTC.1', 'PORTC.2', 'PORTC.3', 'PORTC.4', 'PORTC.5', 'PORTC.6', 'PORTC.7',
+ 'PORTD.0', 'PORTD.1', 'PORTD.2', 'PORTD.3', 'PORTD.4', 'PORTD.5', 'PORTD.6', 'PORTD.7',
+ 'PORTE.0', 'PORTE.1', 'PORTE.2', 'PORTE.3', 'PORTE.4', 'PORTE.5', 'PORTE.6', 'PORTE.7',
+ 'PORTF.0', 'PORTF.1', 'PORTF.2', 'PORTF.3', 'PORTF.4', 'PORTF.5', 'PORTF.6', 'PORTF.7',
+
+ 'DDRA.0', 'DDRA.1', 'DDRA.2', 'DDRA.3', 'DDRA.4', 'DDRA.5', 'DDRA.6', 'DDRA.7',
+ 'DDRB.0', 'DDRB.1', 'DDRB.2', 'DDRB.3', 'DDRB.4', 'DDRB.5', 'DDRB.6', 'DDRB.7',
+ 'DDRC.0', 'DDRC.1', 'DDRC.2', 'DDRC.3', 'DDRC.4', 'DDRC.5', 'DDRC.6', 'DDRC.7',
+ 'DDRD.0', 'DDRD.1', 'DDRD.2', 'DDRD.3', 'DDRD.4', 'DDRD.5', 'DDRD.6', 'DDRD.7',
+ 'DDRE.0', 'DDRE.1', 'DDRE.2', 'DDRE.3', 'DDRE.4', 'DDRE.5', 'DDRE.6', 'DDRE.7',
+ 'DDRF.0', 'DDRF.1', 'DDRF.2', 'DDRF.3', 'DDRF.4', 'DDRF.5', 'DDRF.6', 'DDRF.7',
+
+ 'DDRA','DDRB','DDRC','DDRD','DDRE','DDRF',
+ 'PORTA','PORTB','PORTC','PORTD','PORTE','PORTF',
+ 'PINA','PINB','PINC','PIND','PINE','PINF',
+ )
+ ),
+ 'SYMBOLS' => array(
+ '=', '<', '>', '>=', '<=', '+', '-', '*', '/', '%', '(', ')', '{', '}', '[', ']', ';', ':', '$', '&H'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000080; font-weight: bold;',
+ 2 => 'color: #FF0000;',
+ 3 => 'color: #0000FF;',
+ 4 => 'color: #0080FF;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #657CC4; font-style: italic;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000080;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000080; font-weight: bold;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #0000FF;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bash.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bash.php
new file mode 100644
index 00000000..c69f0054
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bash.php
@@ -0,0 +1,440 @@
+<?php
+/*************************************************************************************
+ * bash.php
+ * --------
+ * Author: Andreas Gohr (andi@splitbrain.org)
+ * Copyright: (c) 2004 Andreas Gohr, Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/08/20
+ *
+ * BASH language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/06/21 (1.0.8)
+ * - Added loads of keywords and commands of GNU/Linux
+ * - Added support for parameters starting with a dash
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2007/09/05 (1.0.7.21)
+ * - PARSER_CONTROL patch using SF #1788408 (BenBE)
+ * 2007/06/11 (1.0.7.20)
+ * - Added a lot of keywords (BenBE / Jan G)
+ * 2004/11/27 (1.0.2)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.1)
+ * - Added support for URLs
+ * 2004/08/20 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ * * Get symbols working
+ * * Highlight builtin vars
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Bash',
+ // Bash DOES have single line comments with # markers. But bash also has
+ // the $# variable, so comments need special handling (see sf.net
+ // 1564839)
+ 'COMMENT_SINGLE' => array('#'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ //Variables
+ 1 => "/\\$\\{[^\\n\\}]*?\\}/i",
+ //BASH-style Heredoc
+ 2 => '/<<-?\s*?(\'?)([a-zA-Z0-9]+)\1\\n.*\\n\\2(?![a-zA-Z0-9])/siU',
+ //Escaped String Starters
+ 3 => "/\\\\['\"]/siU",
+ // Single-Line Shell usage: Hide the prompt at the beginning
+ /* 4 => "/\A(?!#!)\s*(?>[\w:@\\/\\-\\._~]*[$#]\s?)?(?=[^\n]+\n?\Z)|^(?!#!)(\w+@)?[\w\\-\\.]+(:~?)[\w\\/\\-\\._]*?[$#]\s?/ms" */
+ 4 => "/\A(?!#!)(?:(?>[\w:@\\/\\-\\._~]*)[$#]\s?)(?=(?>[^\n]+)\n?\Z)|^(?!#!)(?:\w+@)?(?>[\w\\-\\.]+)(?>:~?[\w\\/\\-\\._]*?)?[$#]\s?/sm"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'HARDQUOTE' => array("'", "'"),
+ 'HARDESCAPE' => array("\'"),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[nfrtv\\$\\\"\n]#i",
+ // $var
+ 2 => "#\\$[a-z_][a-z0-9_]*#i",
+ // ${...}
+ 3 => "/\\$\\{[^\\n\\}]*?\\}/i",
+ // $(...)
+ 4 => "/\\$\\([^\\n\\)]*?\\)/i",
+ // `...`
+ 5 => "/`[^`]*`/"
+ ),
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'case', 'do', 'done', 'elif', 'else', 'esac', 'fi', 'for', 'function',
+ 'if', 'in', 'select', 'set', 'then', 'until', 'while', 'time'
+ ),
+ 2 => array(
+ 'aclocal', 'aconnect', 'apachectl', 'apache2ctl', 'aplay', 'apm',
+ 'apmsleep', 'apropos', 'apt-cache', 'apt-cdrom', 'apt-config',
+ 'apt-file', 'apt-ftparchive', 'apt-get', 'apt-key', 'apt-listbugs',
+ 'apt-listchanges', 'apt-mark', 'apt-mirror', 'apt-sortpkgs',
+ 'apt-src', 'apticron', 'aptitude', 'aptsh', 'apxs', 'apxs2', 'ar',
+ 'arch', 'arecord', 'as', 'as86', 'ash', 'autoconf', 'autoheader',
+ 'automake', 'awk',
+
+ 'apachectl start', 'apachectl stop', 'apachectl restart',
+ 'apachectl graceful', 'apachectl graceful-stop',
+ 'apachectl configtest', 'apachectl status', 'apachectl fullstatus',
+ 'apachectl help', 'apache2ctl start', 'apache2ctl stop',
+ 'apache2ctl restart', 'apache2ctl graceful',
+ 'apache2ctl graceful-stop', 'apache2ctl configtest',
+ 'apache2ctl status', 'apache2ctl fullstatus', 'apache2ctl help',
+
+ 'apt-cache add', 'apt-cache depends', 'apt-cache dotty',
+ 'apt-cache dump', 'apt-cache dumpavail', 'apt-cache gencaches',
+ 'apt-cache pkgnames', 'apt-cache policy', 'apt-cache rdepends',
+ 'apt-cache search', 'apt-cache show', 'apt-cache showauto',
+ 'apt-cache showpkg', 'apt-cache showsrc', 'apt-cache stats',
+ 'apt-cache unmet', 'apt-cache xvcg', 'apt-cdrom add',
+ 'apt-cdrom ident', 'apt-config dump', 'apt-config shell',
+ 'apt-file find', 'apt-file list', 'apt-file purge',
+ 'apt-file search', 'apt-file shot', 'apt-file update',
+ 'apt-get autoclean', 'apt-get autoremove', 'apt-get build-dep',
+ 'apt-get check', 'apt-get clean', 'apt-get dist-upgrade',
+ 'apt-get dselect-upgrade', 'apt-get install', 'apt-get markauto',
+ 'apt-get purge', 'apt-get remove', 'apt-get source',
+ 'apt-get unmarkauto', 'apt-get update', 'apt-get upgrade',
+ 'apt-key add', 'apt-key adv', 'apt-key del', 'apt-key export',
+ 'apt-key exportall', 'apt-key finger', 'apt-key list',
+ 'apt-key net-update', 'apt-key update', 'apt-listbugs apt',
+ 'apt-listbugs list', 'apt-listbugs rss', 'apt-src build',
+ 'apt-src clean', 'apt-src import', 'apt-src install',
+ 'apt-src list', 'apt-src location', 'apt-src name',
+ 'apt-src remove', 'apt-src update', 'apt-src upgrade',
+ 'apt-src version',
+
+ 'basename', 'bash', 'bc', 'bison', 'bunzip2', 'bzcat',
+ 'bzcmp', 'bzdiff', 'bzegrep', 'bzfgrep', 'bzgrep',
+ 'bzip2', 'bzip2recover', 'bzless', 'bzmore',
+
+ 'c++', 'cal', 'cat', 'chattr', 'cc', 'cdda2wav', 'cdparanoia',
+ 'cdrdao', 'cd-read', 'cdrecord', 'chfn', 'chgrp', 'chmod',
+ 'chown', 'chroot', 'chsh', 'chvt', 'clear', 'cmp', 'comm', 'co',
+ 'col', 'cp', 'cpio', 'cpp', 'csh', 'cut', 'cvs', 'cvs-pserver',
+
+ 'cvs add', 'cvs admin', 'cvs annotate', 'cvs checkout',
+ 'cvs commit', 'cvs diff', 'cvs edit', 'cvs editors', 'cvs export',
+ 'cvs history', 'cvs import', 'cvs init', 'cvs log', 'cvs login',
+ 'cvs logout', 'cvs ls', 'cvs pserver', 'cvs rannotate',
+ 'cvs rdiff', 'cvs release', 'cvs remove', 'cvs rlog', 'cvs rls',
+ 'cvs rtag', 'cvs server', 'cvs status', 'cvs tag', 'cvs unedit',
+ 'cvs update', 'cvs version', 'cvs watch', 'cvs watchers',
+
+ 'dash', 'date', 'dc', 'dch', 'dcop', 'dd', 'ddate', 'ddd',
+ 'deallocvt', 'debconf', 'defoma', 'depmod', 'df', 'dh',
+ 'dialog', 'diff', 'diff3', 'dig', 'dir', 'dircolors', 'directomatic',
+ 'dirname', 'dmesg', 'dnsdomainname', 'domainname', 'dpkg',
+ 'dselect', 'du', 'dumpkeys',
+
+ 'ed', 'egrep', 'env', 'expr',
+
+ 'false', 'fbset', 'fdisk', 'ffmpeg', 'fgconsole','fgrep', 'file',
+ 'find', 'flex', 'flex++', 'fmt', 'free', 'ftp', 'funzip', 'fuser',
+
+ 'g++', 'gawk', 'gc','gcc', 'gdb', 'getent', 'getkeycodes',
+ 'getopt', 'gettext', 'gettextize', 'gimp', 'gimp-remote',
+ 'gimptool', 'gmake', 'gocr', 'grep', 'groups', 'gs', 'gunzip',
+ 'gzexe', 'gzip',
+
+ 'git', 'git add', 'git add--interactive', 'git am', 'git annotate',
+ 'git apply', 'git archive', 'git bisect', 'git bisect--helper',
+ 'git blame', 'git branch', 'git bundle', 'git cat-file',
+ 'git check-attr', 'git checkout', 'git checkout-index',
+ 'git check-ref-format', 'git cherry', 'git cherry-pick',
+ 'git clean', 'git clone', 'git commit', 'git commit-tree',
+ 'git config', 'git count-objects', 'git daemon', 'git describe',
+ 'git diff', 'git diff-files', 'git diff-index', 'git difftool',
+ 'git difftool--helper', 'git diff-tree', 'git fast-export',
+ 'git fast-import', 'git fetch', 'git fetch-pack',
+ 'git filter-branch', 'git fmt-merge-msg', 'git for-each-ref',
+ 'git format-patch', 'git fsck', 'git fsck-objects', 'git gc',
+ 'git get-tar-commit-id', 'git grep', 'git hash-object', 'git help',
+ 'git http-backend', 'git http-fetch', 'git http-push',
+ 'git imap-send', 'git index-pack', 'git init', 'git init-db',
+ 'git instaweb', 'git log', 'git lost-found', 'git ls-files',
+ 'git ls-remote', 'git ls-tree', 'git mailinfo', 'git mailsplit',
+ 'git merge', 'git merge-base', 'git merge-file', 'git merge-index',
+ 'git merge-octopus', 'git merge-one-file', 'git merge-ours',
+ 'git merge-recursive', 'git merge-resolve', 'git merge-subtree',
+ 'git mergetool', 'git merge-tree', 'git mktag', 'git mktree',
+ 'git mv', 'git name-rev', 'git notes', 'git pack-objects',
+ 'git pack-redundant', 'git pack-refs', 'git patch-id',
+ 'git peek-remote', 'git prune', 'git prune-packed', 'git pull',
+ 'git push', 'git quiltimport', 'git read-tree', 'git rebase',
+ 'git rebase--interactive', 'git receive-pack', 'git reflog',
+ 'git relink', 'git remote', 'git remote-ftp', 'git remote-ftps',
+ 'git remote-http', 'git remote-https', 'git remote-testgit',
+ 'git repack', 'git replace', 'git repo-config', 'git request-pull',
+ 'git rerere', 'git reset', 'git revert', 'git rev-list',
+ 'git rev-parse', 'git rm', 'git send-pack', 'git shell',
+ 'git shortlog', 'git show', 'git show-branch', 'git show-index',
+ 'git show-ref', 'git stage', 'git stash', 'git status',
+ 'git stripspace', 'git submodule', 'git symbolic-ref', 'git tag',
+ 'git tar-tree', 'git unpack-file', 'git unpack-objects',
+ 'git update-index', 'git update-ref', 'git update-server-info',
+ 'git upload-archive', 'git upload-pack', 'git var',
+ 'git verify-pack', 'git verify-tag', 'git web--browse',
+ 'git whatchanged', 'git write-tree',
+
+ 'gitaction', 'git-add', 'git-add--interactive', 'git-am',
+ 'git-annotate', 'git-apply', 'git-archive', 'git-bisect',
+ 'git-bisect--helper', 'git-blame', 'git-branch', 'git-bundle',
+ 'git-cat-file', 'git-check-attr', 'git-checkout',
+ 'git-checkout-index', 'git-check-ref-format', 'git-cherry',
+ 'git-cherry-pick', 'git-clean', 'git-clone', 'git-commit',
+ 'git-commit-tree', 'git-config', 'git-count-objects', 'git-daemon',
+ 'git-describe', 'git-diff', 'git-diff-files', 'git-diff-index',
+ 'git-difftool', 'git-difftool--helper', 'git-diff-tree',
+ 'gitdpkgname', 'git-fast-export', 'git-fast-import', 'git-fetch',
+ 'git-fetch-pack', 'git-fetch--tool', 'git-filter-branch', 'gitfm',
+ 'git-fmt-merge-msg', 'git-for-each-ref', 'git-format-patch',
+ 'git-fsck', 'git-fsck-objects', 'git-gc', 'git-get-tar-commit-id',
+ 'git-grep', 'git-hash-object', 'git-help', 'git-http-fetch',
+ 'git-http-push', 'git-imap-send', 'git-index-pack', 'git-init',
+ 'git-init-db', 'git-instaweb', 'gitkeys', 'git-log',
+ 'git-lost-found', 'git-ls-files', 'git-ls-remote', 'git-ls-tree',
+ 'git-mailinfo', 'git-mailsplit', 'git-merge', 'git-merge-base',
+ 'git-merge-file', 'git-merge-index', 'git-merge-octopus',
+ 'git-merge-one-file', 'git-merge-ours', 'git-merge-recursive',
+ 'git-merge-resolve', 'git-merge-subtree', 'git-mergetool',
+ 'git-mergetool--lib', 'git-merge-tree', 'gitmkdirs', 'git-mktag',
+ 'git-mktree', 'gitmount', 'git-mv', 'git-name-rev',
+ 'git-pack-objects', 'git-pack-redundant', 'git-pack-refs',
+ 'git-parse-remote', 'git-patch-id', 'git-peek-remote', 'git-prune',
+ 'git-prune-packed', 'gitps', 'git-pull', 'git-push',
+ 'git-quiltimport', 'git-read-tree', 'git-rebase',
+ 'git-rebase--interactive', 'git-receive-pack', 'git-reflog',
+ 'gitregrep', 'git-relink', 'git-remote', 'git-repack',
+ 'git-repo-config', 'git-request-pull', 'git-rerere', 'git-reset',
+ 'git-revert', 'git-rev-list', 'git-rev-parse', 'gitrfgrep',
+ 'gitrgrep', 'git-rm', 'git-send-pack', 'git-shell', 'git-shortlog',
+ 'git-show', 'git-show-branch', 'git-show-index', 'git-show-ref',
+ 'git-sh-setup', 'git-stage', 'git-stash', 'git-status',
+ 'git-stripspace', 'git-submodule', 'git-svn', 'git-symbolic-ref',
+ 'git-tag', 'git-tar-tree', 'gitunpack', 'git-unpack-file',
+ 'git-unpack-objects', 'git-update-index', 'git-update-ref',
+ 'git-update-server-info', 'git-upload-archive', 'git-upload-pack',
+ 'git-var', 'git-verify-pack', 'git-verify-tag', 'gitview',
+ 'git-web--browse', 'git-whatchanged', 'gitwhich', 'gitwipe',
+ 'git-write-tree', 'gitxgrep',
+
+ 'head', 'hexdump', 'hostname',
+
+ 'id', 'ifconfig', 'ifdown', 'ifup', 'igawk', 'install',
+
+ 'ip', 'ip addr', 'ip addrlabel', 'ip link', 'ip maddr', 'ip mroute',
+ 'ip neigh', 'ip route', 'ip rule', 'ip tunnel', 'ip xfrm',
+
+ 'join',
+
+ 'kbd_mode','kbdrate', 'kdialog', 'kfile', 'kill', 'killall',
+
+ 'lame', 'last', 'lastb', 'ld', 'ld86', 'ldd', 'less', 'lex', 'link',
+ 'ln', 'loadkeys', 'loadunimap', 'locate', 'lockfile', 'login',
+ 'logname', 'lp', 'lpr', 'ls', 'lsattr', 'lsmod', 'lsmod.old',
+ 'lspci', 'ltrace', 'lynx',
+
+ 'm4', 'make', 'man', 'mapscrn', 'mesg', 'mkdir', 'mkfifo',
+ 'mknod', 'mktemp', 'more', 'mount', 'mplayer', 'msgfmt', 'mv',
+
+ 'namei', 'nano', 'nasm', 'nawk', 'netstat', 'nice',
+ 'nisdomainname', 'nl', 'nm', 'nm86', 'nmap', 'nohup', 'nop',
+
+ 'od', 'openvt',
+
+ 'passwd', 'patch', 'pcregrep', 'pcretest', 'perl', 'perror',
+ 'pgawk', 'pidof', 'ping', 'pr', 'procmail', 'prune', 'ps', 'pstree',
+ 'ps2ascii', 'ps2epsi', 'ps2frag', 'ps2pdf', 'ps2ps', 'psbook',
+ 'psmerge', 'psnup', 'psresize', 'psselect', 'pstops',
+
+ 'rbash', 'rcs', 'rcs2log', 'read', 'readlink', 'red', 'resizecons',
+ 'rev', 'rm', 'rmdir', 'rsh', 'run-parts',
+
+ 'sash', 'scp', 'screen', 'sed', 'seq', 'sendmail', 'setfont',
+ 'setkeycodes', 'setleds', 'setmetamode', 'setserial', 'setterm',
+ 'sh', 'showkey', 'shred', 'size', 'size86', 'skill', 'sleep',
+ 'slogin', 'snice', 'sort', 'sox', 'split', 'ssed', 'ssh', 'ssh-add',
+ 'ssh-agent', 'ssh-keygen', 'ssh-keyscan', 'stat', 'strace',
+ 'strings', 'strip', 'stty', 'su', 'sudo', 'suidperl', 'sum', 'svn',
+ 'svnadmin', 'svndumpfilter', 'svnlook', 'svnmerge', 'svnmucc',
+ 'svnserve', 'svnshell', 'svnsync', 'svnversion', 'svnwrap', 'sync',
+
+ 'svn add', 'svn ann', 'svn annotate', 'svn blame', 'svn cat',
+ 'svn changelist', 'svn checkout', 'svn ci', 'svn cl', 'svn cleanup',
+ 'svn co', 'svn commit', 'svn copy', 'svn cp', 'svn del',
+ 'svn delete', 'svn di', 'svn diff', 'svn export', 'svn h',
+ 'svn help', 'svn import', 'svn info', 'svn list', 'svn lock',
+ 'svn log', 'svn ls', 'svn merge', 'svn mergeinfo', 'svn mkdir',
+ 'svn move', 'svn mv', 'svn pd', 'svn pdel', 'svn pe', 'svn pedit',
+ 'svn pg', 'svn pget', 'svn pl', 'svn plist', 'svn praise',
+ 'svn propdel', 'svn propedit', 'svn propget', 'svn proplist',
+ 'svn propset', 'svn ps', 'svn pset', 'svn remove', 'svn ren',
+ 'svn rename', 'svn resolve', 'svn resolved', 'svn revert', 'svn rm',
+ 'svn st', 'svn stat', 'svn status', 'svn sw', 'svn switch',
+ 'svn unlock', 'svn up', 'svn update',
+
+ 'tac', 'tail', 'tar', 'tee', 'tempfile', 'touch', 'tr', 'tree',
+ 'true',
+
+ 'umount', 'uname', 'unicode_start', 'unicode_stop', 'uniq',
+ 'unlink', 'unzip', 'updatedb', 'updmap', 'uptime', 'users',
+ 'utmpdump', 'uuidgen',
+
+ 'valgrind', 'vdir', 'vi', 'vim', 'vmstat',
+
+ 'w', 'wall', 'watch', 'wc', 'wget', 'whatis', 'whereis',
+ 'which', 'whiptail', 'who', 'whoami', 'whois', 'wine', 'wineboot',
+ 'winebuild', 'winecfg', 'wineconsole', 'winedbg', 'winedump',
+ 'winefile', 'wodim', 'write',
+
+ 'xargs', 'xhost', 'xmodmap', 'xset',
+
+ 'yacc', 'yes', 'ypdomainname', 'yum',
+
+ 'yum check-update', 'yum clean', 'yum deplist', 'yum erase',
+ 'yum groupinfo', 'yum groupinstall', 'yum grouplist',
+ 'yum groupremove', 'yum groupupdate', 'yum info', 'yum install',
+ 'yum list', 'yum localinstall', 'yum localupdate', 'yum makecache',
+ 'yum provides', 'yum remove', 'yum resolvedep', 'yum search',
+ 'yum shell', 'yum update', 'yum upgrade', 'yum whatprovides',
+
+ 'zcat', 'zcmp', 'zdiff', 'zdump', 'zegrep', 'zfgrep', 'zforce',
+ 'zgrep', 'zip', 'zipgrep', 'zipinfo', 'zless', 'zmore', 'znew',
+ 'zsh', 'zsoelim'
+ ),
+ 3 => array(
+ 'alias', 'bg', 'bind', 'break', 'builtin', 'cd', 'command',
+ 'compgen', 'complete', 'continue', 'declare', 'dirs', 'disown',
+ 'echo', 'enable', 'eval', 'exec', 'exit', 'export', 'fc',
+ 'fg', 'getopts', 'hash', 'help', 'history', 'jobs', 'let',
+ 'local', 'logout', 'popd', 'printf', 'pushd', 'pwd', 'readonly',
+ 'return', 'shift', 'shopt', 'source', 'suspend', 'test', 'times',
+ 'trap', 'type', 'typeset', 'ulimit', 'umask', 'unalias', 'unset',
+ 'wait'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '!', '@', '%', '&', '*', '|', '/', '<', '>', ';;', '`'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #c20cb9; font-weight: bold;',
+ 3 => 'color: #7a0874; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #666666; font-style: italic;',
+ 1 => 'color: #800000;',
+ 2 => 'color: #cc0000; font-style: italic;',
+ 3 => 'color: #000000; font-weight: bold;',
+ 4 => 'color: #666666;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #007800;',
+ 3 => 'color: #007800;',
+ 4 => 'color: #007800;',
+ 5 => 'color: #780078;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #7a0874; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;',
+ 'HARD' => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #007800;',
+ 1 => 'color: #007800;',
+ 2 => 'color: #007800;',
+ 4 => 'color: #007800;',
+ 5 => 'color: #660033;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Variables (will be handled by comment_regexps)
+ 0 => "\\$\\{[a-zA-Z_][a-zA-Z0-9_]*?\\}",
+ //Variables without braces
+ 1 => "\\$[a-zA-Z_][a-zA-Z0-9_]*",
+ //Variable assignment
+ 2 => "(?<![\.a-zA-Z_\-])([a-zA-Z_][a-zA-Z0-9_]*?)(?==)",
+ //Shorthand shell variables
+ 4 => "\\$[*#\$\\-\\?!\d]",
+ //Parameters of commands
+ 5 => "(?<=\s)--?[0-9a-zA-Z\-]+(?=[\s=]|<(?:SEMI|PIPE)>|$)"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'COMMENTS' => array(
+ 'DISALLOWED_BEFORE' => '$'
+ ),
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![\.\-a-zA-Z0-9_\$\#:])",
+ 'DISALLOWED_AFTER' => "(?![\.\-a-zA-Z0-9_%=\\/:])",
+ 2 => array(
+ 'SPACE_AS_WHITESPACE' => false
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/basic4gl.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/basic4gl.php
new file mode 100644
index 00000000..35c92740
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/basic4gl.php
@@ -0,0 +1,341 @@
+<?php
+/*************************************************************************************
+ * basic4gl.php
+ * ---------------------------------
+ * Author: Matthew Webb (bmatthew1@blueyonder.co.uk)
+ * Copyright: (c) 2004 Matthew Webb (http://matthew-4gl.wikispaces.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/09/15
+ *
+ * Basic4GL language file for GeSHi.
+ *
+ * You can find the Basic4GL Website at (http://www.basic4gl.net/)
+ *
+ * CHANGES
+ * -------
+ * 2007/09/17 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2007/09/17)
+ * -------------------------
+ * Make sure all the OpenGL and Basic4GL commands have been added and are complete.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Basic4GL',
+ 'COMMENT_SINGLE' => array(1 => "'"),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+
+ // Navy Blue Bold Keywords
+
+ 'true','rnd_max','m_pi','m_e','false','VK_ZOOM','VK_UP','VK_TAB','VK_SUBTRACT','VK_SPACE','VK_SNAPSHOT',
+ 'VK_SHIFT','VK_SEPARATOR','VK_SELECT','VK_SCROLL','VK_RWIN','VK_RSHIFT','VK_RMENU','VK_RIGHT','VK_RETURN',
+ 'VK_RCONTROL','VK_RBUTTON','VK_PROCESSKEY','VK_PRIOR','VK_PRINT','VK_PLAY','VK_PAUSE','VK_NUMPAD9','VK_NUMPAD8',
+ 'VK_NUMPAD7','VK_NUMPAD6','VK_NUMPAD5','VK_NUMPAD4','VK_NUMPAD3','VK_NUMPAD2','VK_NUMPAD1','VK_NUMPAD0',
+ 'VK_NUMLOCK','VK_NONCONVERT','VK_NEXT','VK_MULTIPLY','VK_MODECHANGE','VK_MENU','VK_MBUTTON','VK_LWIN',
+ 'VK_LSHIFT','VK_LMENU','VK_LEFT','VK_LCONTROL','VK_LBUTTON','VK_KANJI','VK_KANA','VK_JUNJA','VK_INSERT',
+ 'VK_HOME','VK_HELP','VK_HANJA','VK_HANGUL','VK_HANGEUL','VK_FINAL','VK_F9','VK_F8','VK_F7','VK_F6','VK_F5',
+ 'VK_F4','VK_F3','VK_F24','VK_F23','VK_F22','VK_F21','VK_F20','VK_F2','VK_F19','VK_F18','VK_F17','VK_F16',
+ 'VK_F15','VK_F14','VK_F13','VK_F12','VK_F11','VK_F10','VK_F1','VK_EXSEL','VK_EXECUTE','VK_ESCAPE','VK_EREOF',
+ 'VK_END','VK_DOWN','VK_DIVIDE','VK_DELETE','VK_DECIMAL','VK_CRSEL','VK_CONVERT','VK_CONTROL','VK_CLEAR',
+ 'VK_CAPITAL','VK_CANCEL','VK_BACK','VK_ATTN','VK_APPS','VK_ADD','VK_ACCEPT','TEXT_SIMPLE','TEXT_OVERLAID',
+ 'TEXT_BUFFERED','SPR_TILEMAP','SPR_SPRITE','SPR_INVALID','MOUSE_RBUTTON','MOUSE_MBUTTON','MOUSE_LBUTTON',
+ 'GL_ZOOM_Y','GL_ZOOM_X','GL_ZERO','GL_XOR','GL_WIN_swap_hint','GL_WIN_draw_range_elements','GL_VIEWPORT_BIT',
+ 'GL_VIEWPORT','GL_VERTEX_ARRAY_TYPE_EXT','GL_VERTEX_ARRAY_TYPE','GL_VERTEX_ARRAY_STRIDE_EXT','GL_VERTEX_ARRAY_STRIDE',
+ 'GL_VERTEX_ARRAY_SIZE_EXT','GL_VERTEX_ARRAY_SIZE','GL_VERTEX_ARRAY_POINTER_EXT','GL_VERTEX_ARRAY_POINTER',
+ 'GL_VERTEX_ARRAY_EXT','GL_VERTEX_ARRAY_COUNT_EXT','GL_VERTEX_ARRAY','GL_VERSION_1_1','GL_VERSION','GL_VENDOR',
+ 'GL_V3F','GL_V2F','GL_UNSIGNED_SHORT','GL_UNSIGNED_INT','GL_UNSIGNED_BYTE','GL_UNPACK_SWAP_BYTES','GL_UNPACK_SKIP_ROWS',
+ 'GL_UNPACK_SKIP_PIXELS','GL_UNPACK_ROW_LENGTH','GL_UNPACK_LSB_FIRST','GL_UNPACK_ALIGNMENT','GL_TRUE','GL_TRIANGLE_STRIP',
+ 'GL_TRIANGLE_FAN','GL_TRIANGLES','GL_TRANSFORM_BIT','GL_TEXTURE_WRAP_T','GL_TEXTURE_WRAP_S','GL_TEXTURE_WIDTH',
+ 'GL_TEXTURE_STACK_DEPTH','GL_TEXTURE_RESIDENT','GL_TEXTURE_RED_SIZE','GL_TEXTURE_PRIORITY','GL_TEXTURE_MIN_FILTER',
+ 'GL_TEXTURE_MATRIX','GL_TEXTURE_MAG_FILTER','GL_TEXTURE_LUMINANCE_SIZE','GL_TEXTURE_INTERNAL_FORMAT','GL_TEXTURE_INTENSITY_SIZE',
+ 'GL_TEXTURE_HEIGHT','GL_TEXTURE_GREEN_SIZE','GL_TEXTURE_GEN_T','GL_TEXTURE_GEN_S','GL_TEXTURE_GEN_R','GL_TEXTURE_GEN_Q',
+ 'GL_TEXTURE_GEN_MODE','GL_TEXTURE_ENV_MODE','GL_TEXTURE_ENV_COLOR','GL_TEXTURE_ENV','GL_TEXTURE_COORD_ARRAY_TYPE_EXT',
+ 'GL_TEXTURE_COORD_ARRAY_TYPE','GL_TEXTURE_COORD_ARRAY_STRIDE_EXT','GL_TEXTURE_COORD_ARRAY_STRIDE','GL_TEXTURE_COORD_ARRAY_SIZE_EXT',
+ 'GL_TEXTURE_COORD_ARRAY_SIZE','GL_TEXTURE_COORD_ARRAY_POINTER_EXT','GL_TEXTURE_COORD_ARRAY_POINTER','GL_TEXTURE_COORD_ARRAY_EXT',
+ 'GL_TEXTURE_COORD_ARRAY_COUNT_EXT','GL_TEXTURE_COORD_ARRAY','GL_TEXTURE_COMPONENTS','GL_TEXTURE_BORDER_COLOR','GL_TEXTURE_BORDER',
+ 'GL_TEXTURE_BLUE_SIZE','GL_TEXTURE_BIT','GL_TEXTURE_BINDING_2D','GL_TEXTURE_BINDING_1D','GL_TEXTURE_ALPHA_SIZE',
+ 'GL_TEXTURE_2D','GL_TEXTURE_1D','GL_TEXTURE9_ARB','GL_TEXTURE9','GL_TEXTURE8_ARB','GL_TEXTURE8','GL_TEXTURE7_ARB',
+ 'GL_TEXTURE7','GL_TEXTURE6_ARB','GL_TEXTURE6','GL_TEXTURE5_ARB','GL_TEXTURE5','GL_TEXTURE4_ARB','GL_TEXTURE4',
+ 'GL_TEXTURE3_ARB','GL_TEXTURE31_ARB','GL_TEXTURE31','GL_TEXTURE30_ARB','GL_TEXTURE30','GL_TEXTURE3','GL_TEXTURE2_ARB',
+ 'GL_TEXTURE29_ARB','GL_TEXTURE29','GL_TEXTURE28_ARB','GL_TEXTURE28','GL_TEXTURE27_ARB','GL_TEXTURE27','GL_TEXTURE26_ARB',
+ 'GL_TEXTURE26','GL_TEXTURE25_ARB','GL_TEXTURE25','GL_TEXTURE24_ARB','GL_TEXTURE24','GL_TEXTURE23_ARB','GL_TEXTURE23',
+ 'GL_TEXTURE22_ARB','GL_TEXTURE22','GL_TEXTURE21_ARB','GL_TEXTURE21','GL_TEXTURE20_ARB','GL_TEXTURE20','GL_TEXTURE2',
+ 'GL_TEXTURE1_ARB','GL_TEXTURE19_ARB','GL_TEXTURE19','GL_TEXTURE18_ARB','GL_TEXTURE18','GL_TEXTURE17_ARB',
+ 'GL_TEXTURE17','GL_TEXTURE16_ARB','GL_TEXTURE16','GL_TEXTURE15_ARB','GL_TEXTURE15','GL_TEXTURE14_ARB','GL_TEXTURE14',
+ 'GL_TEXTURE13_ARB','GL_TEXTURE13','GL_TEXTURE12_ARB','GL_TEXTURE12','GL_TEXTURE11_ARB','GL_TEXTURE11','GL_TEXTURE10_ARB',
+ 'GL_TEXTURE10','GL_TEXTURE1','GL_TEXTURE0_ARB','GL_TEXTURE0','GL_TEXTURE','GL_T4F_V4F','GL_T4F_C4F_N3F_V4F','GL_T2F_V3F',
+ 'GL_T2F_N3F_V3F','GL_T2F_C4UB_V3F','GL_T2F_C4F_N3F_V3F','GL_T2F_C3F_V3F','GL_T','GL_SUBPIXEL_BITS','GL_STEREO',
+ 'GL_STENCIL_WRITEMASK','GL_STENCIL_VALUE_MASK','GL_STENCIL_TEST','GL_STENCIL_REF','GL_STENCIL_PASS_DEPTH_PASS',
+ 'GL_STENCIL_PASS_DEPTH_FAIL','GL_STENCIL_INDEX','GL_STENCIL_FUNC','GL_STENCIL_FAIL','GL_STENCIL_CLEAR_VALUE',
+ 'GL_STENCIL_BUFFER_BIT','GL_STENCIL_BITS','GL_STENCIL','GL_STACK_UNDERFLOW','GL_STACK_OVERFLOW','GL_SRC_COLOR',
+ 'GL_SRC_ALPHA_SATURATE','GL_SRC_ALPHA','GL_SPOT_EXPONENT','GL_SPOT_DIRECTION','GL_SPOT_CUTOFF','GL_SPHERE_MAP',
+ 'GL_SPECULAR','GL_SOURCE2_RGB_EXT','GL_SOURCE2_RGB','GL_SOURCE2_ALPHA_EXT','GL_SOURCE2_ALPHA','GL_SOURCE1_RGB_EXT',
+ 'GL_SOURCE1_RGB','GL_SOURCE1_ALPHA_EXT','GL_SOURCE1_ALPHA','GL_SOURCE0_RGB_EXT','GL_SOURCE0_RGB','GL_SOURCE0_ALPHA_EXT',
+ 'GL_SOURCE0_ALPHA','GL_SMOOTH','GL_SHORT','GL_SHININESS','GL_SHADE_MODEL','GL_SET','GL_SELECTION_BUFFER_SIZE',
+ 'GL_SELECTION_BUFFER_POINTER','GL_SELECT','GL_SCISSOR_TEST','GL_SCISSOR_BOX','GL_SCISSOR_BIT','GL_S','GL_RIGHT',
+ 'GL_RGB_SCALE_EXT','GL_RGB_SCALE','GL_RGBA_MODE','GL_RGBA8','GL_RGBA4','GL_RGBA2','GL_RGBA16','GL_RGBA12','GL_RGBA',
+ 'GL_RGB8','GL_RGB5_A1','GL_RGB5','GL_RGB4','GL_RGB16','GL_RGB12','GL_RGB10_A2','GL_RGB10','GL_RGB','GL_RETURN',
+ 'GL_REPLACE','GL_REPEAT','GL_RENDER_MODE','GL_RENDERER','GL_RENDER','GL_RED_SCALE','GL_RED_BITS','GL_RED_BIAS',
+ 'GL_RED','GL_READ_BUFFER','GL_R3_G3_B2','GL_R','GL_QUAD_STRIP','GL_QUADS','GL_QUADRATIC_ATTENUATION','GL_Q',
+ 'GL_PROXY_TEXTURE_2D','GL_PROXY_TEXTURE_1D','GL_PROJECTION_STACK_DEPTH','GL_PROJECTION_MATRIX','GL_PROJECTION',
+ 'GL_PRIMARY_COLOR_EXT','GL_PRIMARY_COLOR','GL_PREVIOUS_EXT','GL_PREVIOUS','GL_POSITION','GL_POLYGON_TOKEN',
+ 'GL_POLYGON_STIPPLE_BIT','GL_POLYGON_STIPPLE','GL_POLYGON_SMOOTH_HINT','GL_POLYGON_SMOOTH','GL_POLYGON_OFFSET_UNITS',
+ 'GL_POLYGON_OFFSET_POINT','GL_POLYGON_OFFSET_LINE','GL_POLYGON_OFFSET_FILL','GL_POLYGON_OFFSET_FACTOR','GL_POLYGON_MODE',
+ 'GL_POLYGON_BIT','GL_POLYGON','GL_POINT_TOKEN','GL_POINT_SMOOTH_HINT','GL_POINT_SMOOTH','GL_POINT_SIZE_RANGE',
+ 'GL_POINT_SIZE_GRANULARITY','GL_POINT_SIZE','GL_POINT_BIT','GL_POINTS','GL_POINT','GL_PIXEL_MODE_BIT',
+ 'GL_PIXEL_MAP_S_TO_S_SIZE','GL_PIXEL_MAP_S_TO_S','GL_PIXEL_MAP_R_TO_R_SIZE','GL_PIXEL_MAP_R_TO_R','GL_PIXEL_MAP_I_TO_R_SIZE',
+ 'GL_PIXEL_MAP_I_TO_R','GL_PIXEL_MAP_I_TO_I_SIZE','GL_PIXEL_MAP_I_TO_I','GL_PIXEL_MAP_I_TO_G_SIZE','GL_PIXEL_MAP_I_TO_G',
+ 'GL_PIXEL_MAP_I_TO_B_SIZE','GL_PIXEL_MAP_I_TO_B','GL_PIXEL_MAP_I_TO_A_SIZE','GL_PIXEL_MAP_I_TO_A','GL_PIXEL_MAP_G_TO_G_SIZE',
+ 'GL_PIXEL_MAP_G_TO_G','GL_PIXEL_MAP_B_TO_B_SIZE','GL_PIXEL_MAP_B_TO_B','GL_PIXEL_MAP_A_TO_A_SIZE','GL_PIXEL_MAP_A_TO_A',
+ 'GL_PHONG_WIN','GL_PHONG_HINT_WIN','GL_PERSPECTIVE_CORRECTION_HINT','GL_PASS_THROUGH_TOKEN','GL_PACK_SWAP_BYTES',
+ 'GL_PACK_SKIP_ROWS','GL_PACK_SKIP_PIXELS','GL_PACK_ROW_LENGTH','GL_PACK_LSB_FIRST','GL_PACK_ALIGNMENT','GL_OUT_OF_MEMORY',
+ 'GL_OR_REVERSE','GL_OR_INVERTED','GL_ORDER','GL_OR','GL_OPERAND2_RGB_EXT','GL_OPERAND2_RGB','GL_OPERAND2_ALPHA_EXT',
+ 'GL_OPERAND2_ALPHA','GL_OPERAND1_RGB_EXT','GL_OPERAND1_RGB','GL_OPERAND1_ALPHA_EXT','GL_OPERAND1_ALPHA','GL_OPERAND0_RGB_EXT',
+ 'GL_OPERAND0_RGB','GL_OPERAND0_ALPHA_EXT','GL_OPERAND0_ALPHA','GL_ONE_MINUS_SRC_COLOR','GL_ONE_MINUS_SRC_ALPHA',
+ 'GL_ONE_MINUS_DST_COLOR','GL_ONE_MINUS_DST_ALPHA','GL_ONE','GL_OBJECT_PLANE','GL_OBJECT_LINEAR','GL_NO_ERROR',
+ 'GL_NOTEQUAL','GL_NORMAL_ARRAY_TYPE_EXT','GL_NORMAL_ARRAY_TYPE','GL_NORMAL_ARRAY_STRIDE_EXT','GL_NORMAL_ARRAY_STRIDE',
+ 'GL_NORMAL_ARRAY_POINTER_EXT','GL_NORMAL_ARRAY_POINTER','GL_NORMAL_ARRAY_EXT','GL_NORMAL_ARRAY_COUNT_EXT',
+ 'GL_NORMAL_ARRAY','GL_NORMALIZE','GL_NOR','GL_NOOP','GL_NONE','GL_NICEST','GL_NEVER','GL_NEAREST_MIPMAP_NEAREST','GL_NEAREST_MIPMAP_LINEAR',
+ 'GL_NEAREST','GL_NAND','GL_NAME_STACK_DEPTH','GL_N3F_V3F','GL_MULT','GL_MODULATE','GL_MODELVIEW_STACK_DEPTH','GL_MODELVIEW_MATRIX',
+ 'GL_MODELVIEW','GL_MAX_VIEWPORT_DIMS','GL_MAX_TEXTURE_UNITS_ARB','GL_MAX_TEXTURE_UNITS','GL_MAX_TEXTURE_STACK_DEPTH',
+ 'GL_MAX_TEXTURE_SIZE','GL_MAX_PROJECTION_STACK_DEPTH','GL_MAX_PIXEL_MAP_TABLE','GL_MAX_NAME_STACK_DEPTH','GL_MAX_MODELVIEW_STACK_DEPTH',
+ 'GL_MAX_LIST_NESTING','GL_MAX_LIGHTS','GL_MAX_EVAL_ORDER','GL_MAX_ELEMENTS_VERTICES_WIN','GL_MAX_ELEMENTS_INDICES_WIN',
+ 'GL_MAX_CLIP_PLANES','GL_MAX_CLIENT_ATTRIB_STACK_DEPTH','GL_MAX_ATTRIB_STACK_DEPTH','GL_MATRIX_MODE','GL_MAP_STENCIL',
+ 'GL_MAP_COLOR','GL_MAP2_VERTEX_4','GL_MAP2_VERTEX_3','GL_MAP2_TEXTURE_COORD_4','GL_MAP2_TEXTURE_COORD_3','GL_MAP2_TEXTURE_COORD_2',
+ 'GL_MAP2_TEXTURE_COORD_1','GL_MAP2_NORMAL','GL_MAP2_INDEX','GL_MAP2_GRID_SEGMENTS','GL_MAP2_GRID_DOMAIN','GL_MAP2_COLOR_4',
+ 'GL_MAP1_VERTEX_4','GL_MAP1_VERTEX_3','GL_MAP1_TEXTURE_COORD_4','GL_MAP1_TEXTURE_COORD_3','GL_MAP1_TEXTURE_COORD_2',
+ 'GL_MAP1_TEXTURE_COORD_1','GL_MAP1_NORMAL','GL_MAP1_INDEX','GL_MAP1_GRID_SEGMENTS','GL_MAP1_GRID_DOMAIN',
+ 'GL_MAP1_COLOR_4','GL_LUMINANCE_ALPHA','GL_LUMINANCE8_ALPHA8','GL_LUMINANCE8','GL_LUMINANCE6_ALPHA2','GL_LUMINANCE4_ALPHA4',
+ 'GL_LUMINANCE4','GL_LUMINANCE16_ALPHA16','GL_LUMINANCE16','GL_LUMINANCE12_ALPHA4','GL_LUMINANCE12_ALPHA12','GL_LUMINANCE12',
+ 'GL_LUMINANCE','GL_LOGIC_OP_MODE','GL_LOGIC_OP','GL_LOAD','GL_LIST_MODE','GL_LIST_INDEX','GL_LIST_BIT',
+ 'GL_LIST_BASE','GL_LINE_WIDTH_RANGE','GL_LINE_WIDTH_GRANULARITY','GL_LINE_WIDTH','GL_LINE_TOKEN','GL_LINE_STRIP','GL_LINE_STIPPLE_REPEAT',
+ 'GL_LINE_STIPPLE_PATTERN','GL_LINE_STIPPLE','GL_LINE_SMOOTH_HINT','GL_LINE_SMOOTH','GL_LINE_RESET_TOKEN','GL_LINE_LOOP',
+ 'GL_LINE_BIT','GL_LINES','GL_LINEAR_MIPMAP_NEAREST','GL_LINEAR_MIPMAP_LINEAR','GL_LINEAR_ATTENUATION','GL_LINEAR',
+ 'GL_LINE','GL_LIGHT_MODEL_TWO_SIDE','GL_LIGHT_MODEL_LOCAL_VIEWER','GL_LIGHT_MODEL_AMBIENT','GL_LIGHTING_BIT',
+ 'GL_LIGHTING','GL_LIGHT7','GL_LIGHT6','GL_LIGHT5','GL_LIGHT4','GL_LIGHT3','GL_LIGHT2','GL_LIGHT1','GL_LIGHT0',
+ 'GL_LESS','GL_LEQUAL','GL_LEFT','GL_KEEP','GL_INVERT','GL_INVALID_VALUE','GL_INVALID_OPERATION','GL_INVALID_ENUM','GL_INTERPOLATE_EXT',
+ 'GL_INTERPOLATE','GL_INTENSITY8','GL_INTENSITY4','GL_INTENSITY16','GL_INTENSITY12','GL_INTENSITY','GL_INT',
+ 'GL_INDEX_WRITEMASK','GL_INDEX_SHIFT','GL_INDEX_OFFSET','GL_INDEX_MODE','GL_INDEX_LOGIC_OP','GL_INDEX_CLEAR_VALUE','GL_INDEX_BITS',
+ 'GL_INDEX_ARRAY_TYPE_EXT','GL_INDEX_ARRAY_TYPE','GL_INDEX_ARRAY_STRIDE_EXT','GL_INDEX_ARRAY_STRIDE','GL_INDEX_ARRAY_POINTER_EXT',
+ 'GL_INDEX_ARRAY_POINTER','GL_INDEX_ARRAY_EXT','GL_INDEX_ARRAY_COUNT_EXT','GL_INDEX_ARRAY','GL_INCR','GL_HINT_BIT',
+ 'GL_GREEN_SCALE','GL_GREEN_BITS','GL_GREEN_BIAS','GL_GREEN','GL_GREATER','GL_GEQUAL','GL_FRONT_RIGHT','GL_FRONT_LEFT',
+ 'GL_FRONT_FACE','GL_FRONT_AND_BACK','GL_FRONT','GL_FOG_START','GL_FOG_SPECULAR_TEXTURE_WIN','GL_FOG_MODE','GL_FOG_INDEX',
+ 'GL_FOG_HINT','GL_FOG_END','GL_FOG_DENSITY','GL_FOG_COLOR','GL_FOG_BIT','GL_FOG','GL_FLOAT','GL_FLAT','GL_FILL',
+ 'GL_FEEDBACK_BUFFER_TYPE','GL_FEEDBACK_BUFFER_SIZE','GL_FEEDBACK_BUFFER_POINTER','GL_FEEDBACK','GL_FASTEST','GL_FALSE',
+ 'GL_EYE_PLANE','GL_EYE_LINEAR','GL_EXT_vertex_array','GL_EXT_paletted_texture','GL_EXT_bgra','GL_EXTENSIONS','GL_EXP2',
+ 'GL_EXP','GL_EVAL_BIT','GL_EQUIV','GL_EQUAL','GL_ENABLE_BIT','GL_EMISSION','GL_EDGE_FLAG_ARRAY_STRIDE_EXT','GL_EDGE_FLAG_ARRAY_STRIDE',
+ 'GL_EDGE_FLAG_ARRAY_POINTER_EXT','GL_EDGE_FLAG_ARRAY_POINTER','GL_EDGE_FLAG_ARRAY_EXT','GL_EDGE_FLAG_ARRAY_COUNT_EXT','GL_EDGE_FLAG_ARRAY',
+ 'GL_EDGE_FLAG','GL_DST_COLOR','GL_DST_ALPHA','GL_DRAW_PIXEL_TOKEN','GL_DRAW_BUFFER','GL_DOUBLE_EXT','GL_DOUBLEBUFFER',
+ 'GL_DOUBLE','GL_DONT_CARE','GL_DOMAIN','GL_DITHER','GL_DIFFUSE','GL_DEPTH_WRITEMASK','GL_DEPTH_TEST','GL_DEPTH_SCALE',
+ 'GL_DEPTH_RANGE','GL_DEPTH_FUNC','GL_DEPTH_COMPONENT','GL_DEPTH_CLEAR_VALUE','GL_DEPTH_BUFFER_BIT','GL_DEPTH_BITS',
+ 'GL_DEPTH_BIAS','GL_DEPTH','GL_DECR','GL_DECAL','GL_CW','GL_CURRENT_TEXTURE_COORDS','GL_CURRENT_RASTER_TEXTURE_COORDS','GL_CURRENT_RASTER_POSITION_VALID',
+ 'GL_CURRENT_RASTER_POSITION','GL_CURRENT_RASTER_INDEX','GL_CURRENT_RASTER_DISTANCE','GL_CURRENT_RASTER_COLOR','GL_CURRENT_NORMAL',
+ 'GL_CURRENT_INDEX','GL_CURRENT_COLOR','GL_CURRENT_BIT','GL_CULL_FACE_MODE','GL_CULL_FACE','GL_COPY_PIXEL_TOKEN',
+ 'GL_COPY_INVERTED','GL_COPY','GL_CONSTANT_EXT','GL_CONSTANT_ATTENUATION','GL_CONSTANT','GL_COMPILE_AND_EXECUTE','GL_COMPILE','GL_COMBINE_RGB_EXT',
+ 'GL_COMBINE_RGB','GL_COMBINE_EXT','GL_COMBINE_ALPHA_EXT','GL_COMBINE_ALPHA','GL_COMBINE','GL_COLOR_WRITEMASK',
+ 'GL_COLOR_TABLE_WIDTH_EXT','GL_COLOR_TABLE_RED_SIZE_EXT','GL_COLOR_TABLE_LUMINANCE_SIZE_EXT','GL_COLOR_TABLE_INTENSITY_SIZE_EXT',
+ 'GL_COLOR_TABLE_GREEN_SIZE_EXT','GL_COLOR_TABLE_FORMAT_EXT','GL_COLOR_TABLE_BLUE_SIZE_EXT','GL_COLOR_TABLE_ALPHA_SIZE_EXT',
+ 'GL_COLOR_MATERIAL_PARAMETER','GL_COLOR_MATERIAL_FACE','GL_COLOR_MATERIAL','GL_COLOR_LOGIC_OP','GL_COLOR_INDEXES',
+ 'GL_COLOR_INDEX8_EXT','GL_COLOR_INDEX4_EXT','GL_COLOR_INDEX2_EXT','GL_COLOR_INDEX1_EXT','GL_COLOR_INDEX16_EXT',
+ 'GL_COLOR_INDEX12_EXT','GL_COLOR_INDEX','GL_COLOR_CLEAR_VALUE','GL_COLOR_BUFFER_BIT','GL_COLOR_ARRAY_TYPE_EXT',
+ 'GL_COLOR_ARRAY_TYPE','GL_COLOR_ARRAY_STRIDE_EXT','GL_COLOR_ARRAY_STRIDE','GL_COLOR_ARRAY_SIZE_EXT','GL_COLOR_ARRAY_SIZE',
+ 'GL_COLOR_ARRAY_POINTER_EXT','GL_COLOR_ARRAY_POINTER','GL_COLOR_ARRAY_EXT','GL_COLOR_ARRAY_COUNT_EXT','GL_COLOR_ARRAY',
+ 'GL_COLOR','GL_COEFF','GL_CLIP_PLANE5','GL_CLIP_PLANE4','GL_CLIP_PLANE3','GL_CLIP_PLANE2','GL_CLIP_PLANE1','GL_CLIP_PLANE0',
+ 'GL_CLIENT_VERTEX_ARRAY_BIT','GL_CLIENT_PIXEL_STORE_BIT','GL_CLIENT_ATTRIB_STACK_DEPTH','GL_CLIENT_ALL_ATTRIB_BITS',
+ 'GL_CLIENT_ACTIVE_TEXTURE_ARB','GL_CLIENT_ACTIVE_TEXTURE','GL_CLEAR','GL_CLAMP','GL_CCW','GL_C4UB_V3F','GL_C4UB_V2F',
+ 'GL_C4F_N3F_V3F','GL_C3F_V3F','GL_BYTE','GL_BLUE_SCALE','GL_BLUE_BITS','GL_BLUE_BIAS','GL_BLUE','GL_BLEND_SRC','GL_BLEND_DST',
+ 'GL_BLEND','GL_BITMAP_TOKEN','GL_BITMAP','GL_BGR_EXT','GL_BGRA_EXT','GL_BACK_RIGHT','GL_BACK_LEFT','GL_BACK',
+ 'GL_AUX_BUFFERS','GL_AUX3','GL_AUX2','GL_AUX1','GL_AUX0','GL_AUTO_NORMAL','GL_ATTRIB_STACK_DEPTH','GL_AND_REVERSE',
+ 'GL_AND_INVERTED','GL_AND','GL_AMBIENT_AND_DIFFUSE','GL_AMBIENT','GL_ALWAYS','GL_ALPHA_TEST_REF','GL_ALPHA_TEST_FUNC',
+ 'GL_ALPHA_TEST','GL_ALPHA_SCALE','GL_ALPHA_BITS','GL_ALPHA_BIAS','GL_ALPHA8','GL_ALPHA4','GL_ALPHA16','GL_ALPHA12',
+ 'GL_ALPHA','GL_ALL_ATTRIB_BITS','GL_ADD_SIGNED_EXT','GL_ADD_SIGNED','GL_ADD','GL_ACTIVE_TEXTURE_ARB','GL_ACTIVE_TEXTURE',
+ 'GL_ACCUM_RED_BITS','GL_ACCUM_GREEN_BITS','GL_ACCUM_CLEAR_VALUE','GL_ACCUM_BUFFER_BIT','GL_ACCUM_BLUE_BITS','GL_ACCUM_ALPHA_BITS',
+ 'GL_ACCUM','GL_4_BYTES','GL_4D_COLOR_TEXTURE','GL_3_BYTES','GL_3D_COLOR_TEXTURE','GL_3D_COLOR','GL_3D','GL_2_BYTES',
+ 'GL_2D','GLU_V_STEP','GLU_VERTEX','GLU_VERSION_1_2','GLU_VERSION_1_1','GLU_VERSION','GLU_U_STEP','GLU_UNKNOWN','GLU_TRUE',
+ 'GLU_TESS_WINDING_RULE','GLU_TESS_WINDING_POSITIVE','GLU_TESS_WINDING_ODD','GLU_TESS_WINDING_NONZERO','GLU_TESS_WINDING_NEGATIVE',
+ 'GLU_TESS_WINDING_ABS_GEQ_TWO','GLU_TESS_VERTEX_DATA','GLU_TESS_VERTEX','GLU_TESS_TOLERANCE','GLU_TESS_NEED_COMBINE_CALLBACK','GLU_TESS_MISSING_END_POLYGON',
+ 'GLU_TESS_MISSING_END_CONTOUR','GLU_TESS_MISSING_BEGIN_POLYGON','GLU_TESS_MISSING_BEGIN_CONTOUR','GLU_TESS_ERROR_DATA',
+ 'GLU_TESS_ERROR8','GLU_TESS_ERROR7','GLU_TESS_ERROR6','GLU_TESS_ERROR5','GLU_TESS_ERROR4','GLU_TESS_ERROR3','GLU_TESS_ERROR2',
+ 'GLU_TESS_ERROR1','GLU_TESS_ERROR','GLU_TESS_END_DATA','GLU_TESS_END','GLU_TESS_EDGE_FLAG_DATA','GLU_TESS_EDGE_FLAG',
+ 'GLU_TESS_COORD_TOO_LARGE','GLU_TESS_COMBINE_DATA','GLU_TESS_COMBINE','GLU_TESS_BOUNDARY_ONLY','GLU_TESS_BEGIN_DATA',
+ 'GLU_TESS_BEGIN','GLU_SMOOTH','GLU_SILHOUETTE','GLU_SAMPLING_TOLERANCE','GLU_SAMPLING_METHOD','GLU_POINT','GLU_PATH_LENGTH',
+ 'GLU_PARAMETRIC_TOLERANCE','GLU_PARAMETRIC_ERROR','GLU_OUT_OF_MEMORY','GLU_OUTSIDE','GLU_OUTLINE_POLYGON','GLU_OUTLINE_PATCH',
+ 'GLU_NURBS_ERROR9','GLU_NURBS_ERROR8','GLU_NURBS_ERROR7','GLU_NURBS_ERROR6','GLU_NURBS_ERROR5','GLU_NURBS_ERROR4',
+ 'GLU_NURBS_ERROR37','GLU_NURBS_ERROR36','GLU_NURBS_ERROR35','GLU_NURBS_ERROR34','GLU_NURBS_ERROR33','GLU_NURBS_ERROR32',
+ 'GLU_NURBS_ERROR31','GLU_NURBS_ERROR30','GLU_NURBS_ERROR3','GLU_NURBS_ERROR29','GLU_NURBS_ERROR28','GLU_NURBS_ERROR27','GLU_NURBS_ERROR26',
+ 'GLU_NURBS_ERROR25','GLU_NURBS_ERROR24','GLU_NURBS_ERROR23','GLU_NURBS_ERROR22','GLU_NURBS_ERROR21','GLU_NURBS_ERROR20',
+ 'GLU_NURBS_ERROR2','GLU_NURBS_ERROR19','GLU_NURBS_ERROR18','GLU_NURBS_ERROR17','GLU_NURBS_ERROR16','GLU_NURBS_ERROR15','GLU_NURBS_ERROR14',
+ 'GLU_NURBS_ERROR13','GLU_NURBS_ERROR12','GLU_NURBS_ERROR11','GLU_NURBS_ERROR10','GLU_NURBS_ERROR1','GLU_NONE',
+ 'GLU_MAP1_TRIM_3','GLU_MAP1_TRIM_2','GLU_LINE','GLU_INVALID_VALUE','GLU_INVALID_ENUM','GLU_INTERIOR','GLU_INSIDE','GLU_INCOMPATIBLE_GL_VERSION',
+ 'GLU_FLAT','GLU_FILL','GLU_FALSE','GLU_EXTERIOR','GLU_EXTENSIONS','GLU_ERROR','GLU_END','GLU_EDGE_FLAG','GLU_DOMAIN_DISTANCE',
+ 'GLU_DISPLAY_MODE','GLU_CW','GLU_CULLING','GLU_CCW','GLU_BEGIN','GLU_AUTO_LOAD_MATRIX','CHANNEL_UNORDERED','CHANNEL_ORDERED',
+ 'CHANNEL_MAX'
+ ),
+ 2 => array(
+
+ // Red Lowercase Keywords
+
+ 'WriteWord','WriteString','WriteReal','WriteLine','WriteInt','WriteFloat','WriteDouble','WriteChar','WriteByte',
+ 'windowwidth','windowheight','waittimer','Vec4','Vec3','Vec2','val','UpdateJoystick','ucase$','Transpose','tickcount',
+ 'textscroll','textrows','textmode','textcols','tanh','tand','tan','synctimercatchup','synctimer','swapbuffers',
+ 'str$','stopsoundvoice','stopsounds','stopmusic','sqrt','sqr','sprzorder','spryvel','sprytiles','sprysize','spryrepeat',
+ 'spryflip','sprycentre','spry','sprxvel','sprxtiles','sprxsize','sprxrepeat','sprxflip','sprxcentre','sprx',
+ 'sprvisible','sprvel','sprtype','sprtop','sprspin','sprsolid','sprsetzorder','sprsetyvel','sprsetysize','sprsetyrepeat',
+ 'sprsetyflip','sprsetycentre','sprsety','sprsetxvel','sprsetxsize','sprsetxrepeat','sprsetxflip','sprsetxcentre',
+ 'sprsetx','sprsetvisible','sprsetvel','sprsettiles','sprsettextures','sprsettexture','sprsetspin','sprsetsolid',
+ 'sprsetsize','sprsetscale','sprsetpos','sprsetparallax','sprsetframe','sprsetcolor','sprsetanimspeed','sprsetanimloop',
+ 'sprsetangle','sprsetalpha','sprscale','sprright','sprpos','sprparallax','sprleft','spriteareawidth','spriteareaheight',
+ 'sprframe','sprcolor','sprcameraz','sprcameray','sprcamerax','sprcamerasetz','sprcamerasety','sprcamerasetx',
+ 'sprcamerasetpos','sprcamerasetfov','sprcamerasetangle','sprcamerapos','sprcamerafov','sprcameraangle',
+ 'sprbottom','spranimspeed','spranimloop','spranimdone','sprangle','spralpha','spraddtextures','spraddtexture',
+ 'sounderror','sleep','sind','sin','showcursor','sgn','settextscroll','setmusicvolume','SendMessage','Seek',
+ 'scankeydown','RTInvert','rnd','right$','resizetext','resizespritearea','RejectConnection','ReceiveMessage','ReadWord',
+ 'ReadText','ReadReal','ReadLine','ReadInt','ReadFloat','ReadDouble','ReadChar','ReadByte','randomize','printr',
+ 'print','pow','playsound','playmusic','performancecounter','Orthonormalize','OpenFileWrite','OpenFileRead','Normalize',
+ 'newtilemap','newsprite','NewServer','NewConnection','musicplaying','mouse_yd','mouse_y','mouse_xd','mouse_x',
+ 'mouse_wheel','mouse_button','mid$','MessageSmoothed','MessageReliable','MessagePending','MessageChannel','maxtextureunits',
+ 'MatrixZero','MatrixTranslate','MatrixScale','MatrixRotateZ','MatrixRotateY','MatrixRotateX','MatrixRotate','MatrixIdentity',
+ 'MatrixCrossProduct','MatrixBasis','log','locate','loadtexture','loadsound','loadmipmaptexture','loadmipmapimagestrip',
+ 'loadimagestrip','loadimage','Length','len','left$','lcase$','keydown','Joy_Y','Joy_X','Joy_Up','Joy_Right','Joy_Left',
+ 'Joy_Keys','Joy_Down','Joy_Button','Joy_3','Joy_2','Joy_1','Joy_0','int','inscankey','input$','inkey$','inittimer',
+ 'imagewidth','imagestripframes','imageheight','imageformat','imagedatatype','hidecursor','glViewport','glVertex4sv',
+ 'glVertex4s','glVertex4iv','glVertex4i','glVertex4fv','glVertex4f','glVertex4dv','glVertex4d','glVertex3sv','glVertex3s',
+ 'glVertex3iv','glVertex3i','glVertex3fv','glVertex3f','glVertex3dv','glVertex3d','glVertex2sv','glVertex2s','glVertex2iv',
+ 'glVertex2i','glVertex2fv','glVertex2f','glVertex2dv','glVertex2d','gluPerspective','gluOrtho2D','gluLookAt',
+ 'glubuild2dmipmaps','glTranslatef','glTranslated','gltexsubimage2d','glTexParameteriv','glTexParameteri',
+ 'glTexParameterfv','glTexParameterf','glteximage2d','glTexGeniv','glTexGeni','glTexGenfv','glTexGenf','glTexGendv',
+ 'glTexGend','glTexEnviv','glTexEnvi','glTexEnvfv','glTexEnvf','glTexCoord4sv','glTexCoord4s','glTexCoord4iv','glTexCoord4i',
+ 'glTexCoord4fv','glTexCoord4f','glTexCoord4dv','glTexCoord4d','glTexCoord3sv','glTexCoord3s','glTexCoord3iv','glTexCoord3i',
+ 'glTexCoord3fv','glTexCoord3f','glTexCoord3dv','glTexCoord3d','glTexCoord2sv','glTexCoord2s','glTexCoord2iv','glTexCoord2i',
+ 'glTexCoord2fv','glTexCoord2f','glTexCoord2dv','glTexCoord2d','glTexCoord1sv','glTexCoord1s','glTexCoord1iv','glTexCoord1i','glTexCoord1fv',
+ 'glTexCoord1f','glTexCoord1dv','glTexCoord1d','glStencilOp','glStencilMask','glStencilFunc','glShadeModel','glSelectBuffer',
+ 'glScissor','glScalef','glScaled','glRotatef','glRotated','glRenderMode','glRectsv','glRects','glRectiv','glRecti',
+ 'glRectfv','glRectf','glRectdv','glRectd','glReadBuffer','glRasterPos4sv','glRasterPos4s','glRasterPos4iv',
+ 'glRasterPos4i','glRasterPos4fv','glRasterPos4f','glRasterPos4dv','glRasterPos4d','glRasterPos3sv','glRasterPos3s',
+ 'glRasterPos3iv','glRasterPos3i','glRasterPos3fv','glRasterPos3f','glRasterPos3dv','glRasterPos3d','glRasterPos2sv',
+ 'glRasterPos2s','glRasterPos2iv','glRasterPos2i','glRasterPos2fv','glRasterPos2f','glRasterPos2dv','glRasterPos2d',
+ 'glPushName','glPushMatrix','glPushClientAttrib','glPushAttrib','glPrioritizeTextures','glPopName','glPopMatrix',
+ 'glPopClientAttrib','glPopAttrib','glpolygonstipple','glPolygonOffset','glPolygonMode','glPointSize','glPixelZoom',
+ 'glPixelTransferi','glPixelTransferf','glPixelStorei','glPixelStoref','glPassThrough','glOrtho','glNormal3sv','glNormal3s',
+ 'glNormal3iv','glNormal3i','glNormal3fv','glNormal3f','glNormal3dv','glNormal3d','glNormal3bv','glNormal3b','glNewList',
+ 'glMultMatrixf','glMultMatrixd','glmultitexcoord2f','glmultitexcoord2d','glMatrixMode','glMaterialiv','glMateriali',
+ 'glMaterialfv','glMaterialf','glMapGrid2f','glMapGrid2d','glMapGrid1f','glMapGrid1d','glLogicOp','glLoadName','glLoadMatrixf',
+ 'glLoadMatrixd','glLoadIdentity','glListBase','glLineWidth','glLineStipple','glLightModeliv','glLightModeli','glLightModelfv',
+ 'glLightModelf','glLightiv','glLighti','glLightfv','glLightf','glIsTexture','glIsList','glIsEnabled','glInitNames',
+ 'glIndexubv','glIndexub','glIndexsv','glIndexs','glIndexMask','glIndexiv','glIndexi','glIndexfv','glIndexf','glIndexdv',
+ 'glIndexd','glHint','glGetTexParameteriv','glGetTexParameterfv','glGetTexLevelParameteriv','glGetTexLevelParameterfv',
+ 'glGetTexGeniv','glGetTexGenfv','glGetTexGendv','glGetTexEnviv','glGetTexEnvfv','glgetstring','glgetpolygonstipple','glGetPixelMapuiv',
+ 'glGetMaterialiv','glGetMaterialfv','glGetLightiv','glGetLightfv','glGetIntegerv','glGetFloatv',
+ 'glGetError','glGetDoublev','glGetClipPlane','glGetBooleanv','glgentextures','glgentexture',
+ 'glgenlists','glFrustum','glFrontFace','glFogiv','glFogi','glFogfv','glFogf','glFlush','glFinish','glFeedbackBuffer',
+ 'glEvalPoint2','glEvalPoint1','glEvalMesh2','glEvalMesh1','glEvalCoord2fv','glEvalCoord2f','glEvalCoord2dv','glEvalCoord2d',
+ 'glEvalCoord1fv','glEvalCoord1f','glEvalCoord1dv','glEvalCoord1d','glEndList','glEnd','glEnableClientState','glEnable',
+ 'glEdgeFlagv','glEdgeFlag','glDrawBuffer','glDrawArrays','glDisableClientState','glDisable','glDepthRange','glDepthMask',
+ 'glDepthFunc','gldeletetextures','gldeletetexture','gldeletelists','glCullFace','glCopyTexSubImage2D','glCopyTexSubImage1D',
+ 'glCopyTexImage2D','glCopyTexImage1D','glColorMaterial','glColorMask','glColor4usv','glColor4us','glColor4uiv','glColor4ui',
+ 'glColor4ubv','glColor4ub','glColor4sv','glColor4s','glColor4iv','glColor4i','glColor4fv','glColor4f','glColor4dv',
+ 'glColor4d','glColor4bv','glColor4b','glColor3usv','glColor3us','glColor3uiv','glColor3ui','glColor3ubv','glColor3ub',
+ 'glColor3sv','glColor3s','glColor3iv','glColor3i','glColor3fv','glColor3f','glColor3dv','glColor3d','glColor3bv',
+ 'glColor3b','glClipPlane','glClearStencil','glClearIndex','glClearDepth','glClearColor','glClearAccum','glClear',
+ 'glcalllists','glCallList','glBlendFunc','glBindTexture','glBegin','glArrayElement','glAreTexturesResident',
+ 'glAlphaFunc','glactivetexture','glAccum','font','FindNextFile','FindFirstFile','FindClose','FileError',
+ 'extensionsupported','exp','execute','EndOfFile','drawtext','divbyzero','Determinant','deletesprite','deletesound',
+ 'DeleteServer','deleteimage','DeleteConnection','defaultfont','CrossProduct','cosd','cos','copysprite','ConnectionPending',
+ 'ConnectionHandShaking','ConnectionConnected','ConnectionAddress','compilererrorline','compilererrorcol','compilererror',
+ 'compilefile','compile','color','cls','CloseFile','clearregion','clearline','clearkeys','chr$','charat$','bindsprite',
+ 'beep','atnd','atn2d','atn2','atn','atand','asc','argcount','arg','animatesprites','AcceptConnection','abs'
+ ),
+ 3 => array(
+
+ // Blue Lowercase Keywords
+
+ 'xor','while','wend','until','type','traditional_print','traditional','to','then','struc','string','step','single',
+ 'run','return','reset','read','or','null','not','next','lor','loop','language','land','integer','input','if',
+ 'goto','gosub','for','endstruc','endif','end','elseif','else','double','do','dim','data','const','basic4gl','as',
+ 'and','alloc'
+ )
+
+ ),
+ 'SYMBOLS' => array(
+ '=', '<', '>', '>=', '<=', '+', '-', '*', '/', '%', '(', ')', '{', '}', '[', ']', '&', ';', ':', '$'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000080; font-weight: bold;',
+ 2 => 'color: #FF0000;',
+ 3 => 'color: #0000FF;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #657CC4; font-style: italic;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000080;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000080; font-weight: bold;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #0000FF;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bf.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bf.php
new file mode 100644
index 00000000..c06ca5bf
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bf.php
@@ -0,0 +1,115 @@
+<?php
+/*************************************************************************************
+ * bf.php
+ * ----------
+ * Author: Benny Baumann (BenBE@geshi.org)
+ * Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/10/31
+ *
+ * Brainfuck language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/10/31 (1.0.8.1)
+ * - First Release
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+$language_data = array (
+ 'LANG_NAME' => 'Brainfuck',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(1 => '/[^\n+\-<>\[\]\.\,Y]+/s'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('+', '-'),
+ 1 => array('[', ']'),
+ 2 => array('<', '>'),
+ 3 => array('.', ','),
+ 4 => array('Y') //Brainfork Extension ;-)
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #660000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #006600;',
+ 1 => 'color: #660000;',
+ 2 => 'color: #000066;',
+ 3 => 'color: #666600;',
+ 4 => 'color: #660066;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'STRINGS' => GESHI_NEVER,
+ 'NUMBERS' => GESHI_NEVER,
+ 'BRACKETS' => GESHI_NEVER
+ ),
+ 'KEYWORDS' => array(
+ 'DISALLOW_BEFORE' => '',
+ 'DISALLOW_AFTER' => ''
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bibtex.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bibtex.php
new file mode 100644
index 00000000..51cb4ceb
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bibtex.php
@@ -0,0 +1,183 @@
+<?php
+/********************************************************************************
+ * bibtex.php
+ * -----
+ * Author: Quinn Taylor (quinntaylor@mac.com)
+ * Copyright: (c) 2009 Quinn Taylor (quinntaylor@mac.com), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/04/29
+ *
+ * BibTeX language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/04/29 (1.0.8.4)
+ * - First Release
+ *
+ * TODO
+ * -------------------------
+ * - Add regex for matching and replacing URLs with corresponding hyperlinks
+ * - Add regex for matching more LaTeX commands that may be embedded in BibTeX
+ * (Someone who understands regex better than I should borrow from latex.php)
+ ********************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ *
+*******************************************************************************/
+
+// http://en.wikipedia.org/wiki/BibTeX
+// http://www.fb10.uni-bremen.de/anglistik/langpro/bibliographies/jacobsen-bibtex.html
+
+$language_data = array (
+ 'LANG_NAME' => 'BibTeX',
+ 'OOLANG' => false,
+ 'COMMENT_SINGLE' => array(
+ 1 => '%%'
+ ),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 0 => array(
+ '@comment','@preamble','@string'
+ ),
+ // Standard entry types
+ 1 => array(
+ '@article','@book','@booklet','@conference','@inbook',
+ '@incollection','@inproceedings','@manual','@mastersthesis',
+ '@misc','@phdthesis','@proceedings','@techreport','@unpublished'
+ ),
+ // Custom entry types
+ 2 => array(
+ '@collection','@patent','@webpage'
+ ),
+ // Standard entry field names
+ 3 => array(
+ 'address','annote','author','booktitle','chapter','crossref',
+ 'edition','editor','howpublished','institution','journal','key',
+ 'month','note','number','organization','pages','publisher','school',
+ 'series','title','type','volume','year'
+ ),
+ // Custom entry field names
+ 4 => array(
+ 'abstract','affiliation','chaptername','cited-by','cites',
+ 'contents','copyright','date-added','date-modified','doi','eprint',
+ 'isbn','issn','keywords','language','lccn','lib-congress',
+ 'location','price','rating','read','size','source','url'
+ )
+ ),
+ 'URLS' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'SYMBOLS' => array(
+ '{', '}', '#', '=', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ GESHI_COMMENTS => false,
+ ),
+ // Define the colors for the groups listed above
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #C02020;', // Standard entry types
+ 2 => 'color: #C02020;', // Custom entry types
+ 3 => 'color: #C08020;', // Standard entry field names
+ 4 => 'color: #C08020;' // Custom entry field names
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #2C922C; font-style: italic;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #2020C0;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #E02020;'
+ ),
+ 'REGEXPS' => array(
+ 1 => 'color: #2020C0;', // {...}
+ 2 => 'color: #C08020;', // BibDesk fields
+ 3 => 'color: #800000;' // LaTeX commands
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000000; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #E02020;'
+ ),
+ 'NUMBERS' => array(
+ ),
+ 'METHODS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'REGEXPS' => array(
+ // {parameters}
+ 1 => array(
+ GESHI_SEARCH => "(?<=\\{)(?:\\{(?R)\\}|[^\\{\\}])*(?=\\})",
+ GESHI_REPLACE => '\0',
+ GESHI_MODIFIERS => 's',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 2 => array(
+ GESHI_SEARCH => "\bBdsk-(File|Url)-\d+",
+ GESHI_REPLACE => '\0',
+ GESHI_MODIFIERS => 'Us',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 3 => array(
+ GESHI_SEARCH => "\\\\[A-Za-z0-9]*+",
+ GESHI_REPLACE => '\0',
+ GESHI_MODIFIERS => 'Us',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'NUMBERS' => GESHI_NEVER
+ ),
+ 'KEYWORDS' => array(
+ 3 => array(
+ 'DISALLOWED_AFTER' => '(?=\s*=)'
+ ),
+ 4 => array(
+ 'DISALLOWED_AFTER' => '(?=\s*=)'
+ ),
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/blitzbasic.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/blitzbasic.php
new file mode 100644
index 00000000..1d3c08d0
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/blitzbasic.php
@@ -0,0 +1,185 @@
+<?php
+/*************************************************************************************
+ * blitzbasic.php
+ * --------------
+ * Author: P�draig O`Connel (info@moonsword.info)
+ * Copyright: (c) 2005 P�draig O`Connel (http://moonsword.info)
+ * Release Version: 1.0.8.11
+ * Date Started: 16.10.2005
+ *
+ * BlitzBasic language file for GeSHi.
+ *
+ * It is a simple Basic dialect. Released for Games and Network Connections.
+ * In this Language File are all functions included (2D BB and 3D BB)
+ *
+ *
+ * CHANGES
+ * -------
+ * 2005/12/28 (1.0.1)
+ * - Remove unnecessary style index for regexps
+ * 2005/10/22 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2005/10/22)
+ * -------------------------
+ * * Sort out the Basic commands for splitting up.
+ * * To set up the right colors.
+ * (the colors are ok, but not the correct ones)
+ * * Split to BlitzBasic 2D and BlitzBasic 3D.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'BlitzBasic',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'If','EndIf','ElseIf','Else','While','Wend','Return','Next','Include','End Type','End Select','End If','End Function','End','Select',
+ 'Type','Forever','For','Or','And','AppTitle','Case','Goto','Gosub','Step','Stop','Int','Last','False','Then','To','True','Until','Float',
+ 'String','Before','Not'
+ ),
+ 2 => array(
+ // All Functions - 2D BB and 3D BB
+ 'Xor','WriteString','WriteShort','WritePixelFast','WritePixel','WriteLine','WriteInt','WriteFloat','WriteFile','WriteBytes',
+ 'WriteByte','Write','WaitTimer','WaitMouse','WaitKey','WaitJoy','VWait','Viewport',
+ 'Upper','UpdateGamma','UnlockBuffer','UDPTimeouts','UDPStreamPort','UDPStreamIP','UDPMsgPort','UDPMsgIP',
+ 'Trim','TotalVidMem','TileImage','TileBlock','TFormImage','TFormFilter','Text',
+ 'TCPTimeouts','TCPStreamPort','TCPStreamIP','Tan','SystemProperty','StringWidth','StringHeight','Str','StopNetGame',
+ 'StopChannel','StartNetGame','Sqr','SoundVolume','SoundPitch','SoundPan','Sin','Shr',
+ 'ShowPointer','Shl','Sgn','SetGfxDriver','SetGamma','SetFont','SetEnv','SetBuffer','SendUDPMsg','SendNetMsg',
+ 'SeekFile','SeedRnd','ScanLine','ScaleImage','SaveImage','SaveBuffer','Sar','RuntimeError','RSet',
+ 'RotateImage','RndSeed','Rnd','Right','ResumeChannel','Restore','ResizeImage','ResizeBank','Replace',
+ 'Repeat','RecvUDPMsg','RecvNetMsg','RectsOverlap','Rect','ReadString','ReadShort','ReadPixelFast','ReadPixel','ReadLine',
+ 'ReadInt','ReadFloat','ReadFile','ReadDir','ReadBytes','ReadByte','ReadAvail','Read','Rand','Print',
+ 'PokeShort','PokeInt','PokeFloat','PokeByte','Plot','PlaySound','PlayMusic','PlayCDTrack','Pi','PeekShort',
+ 'PeekInt','PeekFloat','PeekByte','PauseChannel','Oval','Origin','OpenTCPStream','OpenMovie','OpenFile',
+ 'Null','NextFile','New','NetPlayerName','NetPlayerLocal','NetMsgType','NetMsgTo','NetMsgFrom',
+ 'NetMsgData','MovieWidth','MoviePlaying','MovieHeight','MoveMouse','MouseZSpeed','MouseZ','MouseYSpeed','MouseY','MouseXSpeed',
+ 'MouseX','MouseHit','MouseDown','Mod','Millisecs','MidHandle','Mid','MaskImage','LSet','Lower',
+ 'LoopSound','Log10','Log','LockBuffer','Locate','Local','LoadSound','LoadImage','LoadFont','LoadBuffer',
+ 'LoadAnimImage','Line','Len','Left','KeyHit','KeyDown','JoyZDir','JoyZ','JoyYDir',
+ 'JoyYaw','JoyY','JoyXDir','JoyX','JoyVDir','JoyV','JoyUDir','JoyU','JoyType','JoyRoll',
+ 'JoyPitch','JoyHit','JoyHat','JoyDown','JoinNetGame','Instr','Insert','Input',
+ 'ImageYHandle','ImageXHandle','ImageWidth','ImagesOverlap','ImagesCollide','ImageRectOverlap','ImageRectCollide','ImageHeight','ImageBuffer',
+ 'HostNetGame','HostIP','HidePointer','Hex','HandleImage','GraphicsWidth','GraphicsHeight','GraphicsDepth','GraphicsBuffer','Graphics',
+ 'GrabImage','Global','GFXModeWidth','GFXModeHeight','GfxModeExists','GFXModeDepth','GfxDriverName','GetMouse',
+ 'GetKey','GetJoy','GetEnv','GetColor','GammaRed','GammaGreen','GammaBlue','Function','FrontBuffer','FreeTimer',
+ 'FreeSound','FreeImage','FreeFont','FreeBank','FontWidth','FontHeight','FlushMouse','FlushKeys',
+ 'FlushJoy','Floor','Flip','First','FileType','FileSize','FilePos','Field',
+ 'Exp','Exit','ExecFile','Eof','EndGraphics','Each','DrawMovie','DrawImageRect','DrawImage','DrawBlockRect','DrawBlock',
+ 'DottedIP','Dim','DeleteNetPlayer','DeleteFile','DeleteDir','Delete','Delay','Default','DebugLog','Data',
+ 'CurrentTime','CurrentDir','CurrentDate','CreateUDPStream','CreateTimer','CreateTCPServer','CreateNetPlayer','CreateImage','CreateDir','CreateBank',
+ 'CountHostIPs','CountGFXModes','CountGfxDrivers','Cos','CopyStream','CopyRect','CopyPixelFast','CopyPixel','CopyImage','CopyFile',
+ 'CopyBank','Const','CommandLine','ColorRed','ColorGreen','ColorBlue','Color','ClsColor','Cls','CloseUDPStream',
+ 'CloseTCPStream','CloseTCPServer','CloseMovie','CloseFile','CloseDir','Chr','ChannelVolume','ChannelPlaying','ChannelPitch','ChannelPan',
+ 'ChangeDir','Ceil','CallDLL','Bin','BankSize','BackBuffer','AvailVidMem','AutoMidHandle',
+ 'ATan2','ATan','ASin','Asc','After','ACos','AcceptTCPStream','Abs',
+ // 3D Commands
+ 'Wireframe','Windowed3D','WBuffer','VertexZ','VertexY',
+ 'VertexX','VertexW','VertexV','VertexU','VertexTexCoords','VertexRed','VertexNZ','VertexNY','VertexNX','VertexNormal',
+ 'VertexGreen','VertexCoords','VertexColor','VertexBlue','VertexAlpha','VectorYaw','VectorPitch','UpdateWorld','UpdateNormals','TurnEntity',
+ 'TrisRendered','TriangleVertex','TranslateEntity','TFormVector','TFormPoint','TFormNormal','TFormedZ','TFormedY','TFormedX','TextureWidth',
+ 'TextureName','TextureHeight','TextureFilter','TextureCoords','TextureBuffer','TextureBlend','TerrainZ','TerrainY','TerrainX','TerrainSize',
+ 'TerrainShading','TerrainHeight','TerrainDetail','SpriteViewMode','ShowEntity','SetCubeFace','SetAnimTime','SetAnimKey','ScaleTexture','ScaleSprite',
+ 'ScaleMesh','ScaleEntity','RotateTexture','RotateSprite','RotateMesh','RotateEntity','ResetEntity','RenderWorld','ProjectedZ','ProjectedY',
+ 'ProjectedX','PositionTexture','PositionMesh','PositionEntity','PointEntity','PickedZ','PickedY','PickedX','PickedTriangle','PickedTime',
+ 'PickedSurface','PickedNZ','PickedNY','PickedNX','PickedEntity','PaintSurface','PaintMesh','PaintEntity','NameEntity','MoveEntity',
+ 'ModifyTerrain','MeshWidth','MeshHeight','MeshesIntersect','MeshDepth','MD2AnimTime','MD2AnimLength','MD2Animating','LoadTexture','LoadTerrain',
+ 'LoadSprite','LoadMesh','LoadMD2','LoaderMatrix','LoadBSP','LoadBrush','LoadAnimTexture','LoadAnimSeq','LoadAnimMesh','Load3DSound',
+ 'LinePick','LightRange','LightMesh','LightConeAngles','LightColor','HWMultiTex','HideEntity','HandleSprite','Graphics3D','GfxMode3DExists',
+ 'GfxMode3D','GfxDriverCaps3D','GfxDriver3D','GetSurfaceBrush','GetSurface','GetParent','GetMatElement','GetEntityType','GetEntityBrush','GetChild',
+ 'GetBrushTexture','FreeTexture','FreeEntity','FreeBrush','FlipMesh','FitMesh','FindSurface','FindChild','ExtractAnimSeq','EntityZ',
+ 'EntityYaw','EntityY','EntityX','EntityVisible','EntityType','EntityTexture','EntityShininess','EntityRoll','EntityRadius','EntityPitch',
+ 'EntityPickMode','EntityPick','EntityParent','EntityOrder','EntityName','EntityInView','EntityFX','EntityDistance','EntityColor','EntityCollided',
+ 'EntityBox','EntityBlend','EntityAutoFade','EntityAlpha','EmitSound','Dither','DeltaYaw','DeltaPitch','CreateTexture','CreateTerrain',
+ 'CreateSurface','CreateSprite','CreateSphere','CreatePlane','CreatePivot','CreateMirror','CreateMesh','CreateListener','CreateLight','CreateCylinder',
+ 'CreateCube','CreateCone','CreateCamera','CreateBrush','CountVertices','CountTriangles','CountSurfaces','CountGfxModes3D','CountCollisions','CountChildren',
+ 'CopyMesh','CopyEntity','CollisionZ','CollisionY','CollisionX','CollisionTriangle','CollisionTime','CollisionSurface','Collisions','CollisionNZ',
+ 'CollisionNY','CollisionNX','CollisionEntity','ClearWorld','ClearTextureFilters','ClearSurface','ClearCollisions','CaptureWorld','CameraZoom','CameraViewport',
+ 'CameraRange','CameraProjMode','CameraProject','CameraPick','CameraFogRange','CameraFogMode','CameraFogColor','CameraClsMode','CameraClsColor','BSPLighting',
+ 'BSPAmbientLight','BrushTexture','BrushShininess','BrushFX','BrushColor','BrushBlend','BrushAlpha','AntiAlias','AnimTime','AnimSeq',
+ 'AnimLength','Animating','AnimateMD2','Animate','AmbientLight','AlignToVector','AddVertex','AddTriangle','AddMesh','AddAnimSeq',
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(',')'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000066; font-weight: bold;',
+ 2 => 'color: #0000ff;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #D9D100; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000066;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #CC0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '\\'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => false,
+ 1 => false
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bnf.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bnf.php
new file mode 100644
index 00000000..ca15cf9e
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/bnf.php
@@ -0,0 +1,119 @@
+<?php
+/*************************************************************************************
+ * bnf.php
+ * --------
+ * Author: Rowan Rodrik van der Molen (rowan@bigsmoke.us)
+ * Copyright: (c) 2006 Rowan Rodrik van der Molen (http://www.bigsmoke.us/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/09/28
+ *
+ * BNF (Backus-Naur form) language file for GeSHi.
+ *
+ * See http://en.wikipedia.org/wiki/Backus-Naur_form for more info on BNF.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * - Removed superflicious regexps
+ * 2006/09/18 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2006/09/18)
+ * -------------------------
+ * * Nothing I can think of
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'bnf',
+ 'COMMENT_SINGLE' => array(';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', "'"),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')'),
+ 1 => array('<', '>'),
+ 2 => array('[', ']'),
+ 3 => array('{', '}'),
+ 4 => array('=', '*', '/', '|', ':'),
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(),
+ 'COMMENTS' => array(
+ 0 => 'color: #666666; font-style: italic;', // Single Line comments
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => ''
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #a00;',
+ 1 => 'color: #a00;'
+ ),
+ 'NUMBERS' => array(
+ 0 => ''
+ ),
+ 'METHODS' => array(
+ 0 => ''
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066; font-weight: bold;', // Round brackets
+ 1 => 'color: #000066; font-weight: bold;', // Angel Brackets
+ 2 => 'color: #000066; font-weight: bold;', // Square Brackets
+ 3 => 'color: #000066; font-weight: bold;', // BRaces
+ 4 => 'color: #006600; font-weight: bold;', // Other operator symbols
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #007;',
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(
+ //terminal symbols
+ 0 => array(
+ GESHI_SEARCH => '(&lt;)([^&]+?)(&gt;)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/boo.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/boo.php
new file mode 100644
index 00000000..b68d442f
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/boo.php
@@ -0,0 +1,217 @@
+<?php
+/*************************************************************************************
+ * boo.php
+ * --------
+ * Author: Marcus Griep (neoeinstein+GeSHi@gmail.com)
+ * Copyright: (c) 2007 Marcus Griep (http://www.xpdm.us)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/09/10
+ *
+ * Boo language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2004/09/10 (1.0.8)
+ * - First Release
+ *
+ * TODO (updated 2007/09/10)
+ * -------------------------
+ * Regular Expression Literal matching
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Boo',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'''", "'", '"""', '"'),
+ 'HARDQUOTE' => array('"""', '"""'),
+ 'HARDESCAPE' => array('\"""'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(//Namespace
+ 'namespace', 'import', 'from'
+ ),
+ 2 => array(//Jump
+ 'yield', 'return', 'goto', 'continue', 'break'
+ ),
+ 3 => array(//Conditional
+ 'while', 'unless', 'then', 'in', 'if', 'for', 'else', 'elif'
+ ),
+ 4 => array(//Property
+ 'set', 'get'
+ ),
+ 5 => array(//Exception
+ 'try', 'raise', 'failure', 'except', 'ensure'
+ ),
+ 6 => array(//Visibility
+ 'public', 'private', 'protected', 'internal'
+ ),
+ 7 => array(//Define
+ 'struct', 'ref', 'of', 'interface', 'event', 'enum', 'do', 'destructor', 'def', 'constructor', 'class'
+ ),
+ 8 => array(//Cast
+ 'typeof', 'cast', 'as'
+ ),
+ 9 => array(//BiMacro
+ 'yieldAll', 'using', 'unchecked', 'rawArayIndexing', 'print', 'normalArrayIndexing', 'lock',
+ 'debug', 'checked', 'assert'
+ ),
+ 10 => array(//BiAttr
+ 'required', 'property', 'meta', 'getter', 'default'
+ ),
+ 11 => array(//BiFunc
+ 'zip', 'shellp', 'shellm', 'shell', 'reversed', 'range', 'prompt',
+ 'matrix', 'map', 'len', 'join', 'iterator', 'gets', 'enumerate', 'cat', 'array'
+ ),
+ 12 => array(//HiFunc
+ '__switch__', '__initobj__', '__eval__', '__addressof__', 'quack'
+ ),
+ 13 => array(//Primitive
+ 'void', 'ushort', 'ulong', 'uint', 'true', 'timespan', 'string', 'single',
+ 'short', 'sbyte', 'regex', 'object', 'null', 'long', 'int', 'false', 'duck',
+ 'double', 'decimal', 'date', 'char', 'callable', 'byte', 'bool'
+ ),
+ 14 => array(//Operator
+ 'not', 'or', 'and', 'is', 'isa',
+ ),
+ 15 => array(//Modifier
+ 'virtual', 'transient', 'static', 'partial', 'override', 'final', 'abstract'
+ ),
+ 16 => array(//Access
+ 'super', 'self'
+ ),
+ 17 => array(//Pass
+ 'pass'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '[|', '|]', '${', '(', ')', '[', ']', '{', '}', '!', '@', '%', '&', '*', '|', '/', '<', '>', '+', '-', ';'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ 9 => true,
+ 10 => true,
+ 11 => true,
+ 12 => true,
+ 13 => true,
+ 14 => true,
+ 15 => true,
+ 16 => true,
+ 17 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color:green;font-weight:bold;',
+ 2 => 'color:navy;',
+ 3 => 'color:blue;font-weight:bold;',
+ 4 => 'color:#8B4513;',
+ 5 => 'color:teal;font-weight:bold;',
+ 6 => 'color:blue;font-weight:bold;',
+ 7 => 'color:blue;font-weight:bold;',
+ 8 => 'color:blue;font-weight:bold;',
+ 9 => 'color:maroon;',
+ 10 => 'color:maroon;',
+ 11 => 'color:purple;',
+ 12 => 'color:#4B0082;',
+ 13 => 'color:purple;font-weight:bold;',
+ 14 => 'color:#008B8B;font-weight:bold;',
+ 15 => 'color:brown;',
+ 16 => 'color:black;font-weight:bold;',
+ 17 => 'color:gray;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #999999; font-style: italic;',
+ 2 => 'color: #999999; font-style: italic;',
+ 'MULTI' => 'color: #008000; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #0000FF; font-weight: bold;',
+ 'HARD' => 'color: #0000FF; font-weight: bold;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #006400;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #008000;',
+ 'HARD' => 'color: #008000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #00008B;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: 000000;',
+ 1 => 'color: 000000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #006400;'
+ ),
+ 'REGEXPS' => array(
+ #0 => 'color: #0066ff;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+ 9 => '',
+ 10 => '',
+ 11 => '',
+ 12 => '',
+ 13 => '',
+ 14 => '',
+ 15 => '',
+ 16 => '',
+ 17 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 0 => '.',
+ 1 => '::'
+ ),
+ 'REGEXPS' => array(
+ #0 => '%(@)?\/(?:(?(1)[^\/\\\\\r\n]+|[^\/\\\\\r\n \t]+)|\\\\[\/\\\\\w+()|.*?$^[\]{}\d])+\/%'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/c.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/c.php
new file mode 100644
index 00000000..35d5b019
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/c.php
@@ -0,0 +1,281 @@
+<?php
+/*************************************************************************************
+ * c.php
+ * -----
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Contributors:
+ * - Jack Lloyd (lloyd@randombit.net)
+ * - Michael Mol (mikemol@gmail.com)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/04
+ *
+ * C language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/01/22 (1.0.8.3)
+ * - Made keywords case-sensitive.
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2004/XX/XX (1.0.4)
+ * - Added a couple of new keywords (Jack Lloyd)
+ * 2004/11/27 (1.0.3)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.2)
+ * - Added support for URLs
+ * 2004/08/05 (1.0.1)
+ * - Added support for symbols
+ * 2004/07/14 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2009/02/08)
+ * -------------------------
+ * - Get a list of inbuilt functions to add (and explore C more
+ * to complete this rather bare language file
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'C',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Multiline-continued single-line comments
+ 1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Multiline-continued preprocessor define
+ 2 => '/#(?:\\\\\\\\|\\\\\\n|.)*$/m'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[\\\\abfnrtv\'\"?\n]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{2}#",
+ //Hexadecimal Char Specs
+ 3 => "#\\\\u[\da-fA-F]{4}#",
+ //Hexadecimal Char Specs
+ 4 => "#\\\\U[\da-fA-F]{8}#",
+ //Octal Char Specs
+ 5 => "#\\\\[0-7]{1,3}#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'if', 'return', 'while', 'case', 'continue', 'default',
+ 'do', 'else', 'for', 'switch', 'goto'
+ ),
+ 2 => array(
+ 'null', 'false', 'break', 'true', 'function', 'enum', 'extern', 'inline'
+ ),
+ 3 => array(
+ // assert.h
+ 'assert',
+
+ //complex.h
+ 'cabs', 'cacos', 'cacosh', 'carg', 'casin', 'casinh', 'catan',
+ 'catanh', 'ccos', 'ccosh', 'cexp', 'cimag', 'cis', 'clog', 'conj',
+ 'cpow', 'cproj', 'creal', 'csin', 'csinh', 'csqrt', 'ctan', 'ctanh',
+
+ //ctype.h
+ 'digittoint', 'isalnum', 'isalpha', 'isascii', 'isblank', 'iscntrl',
+ 'isdigit', 'isgraph', 'islower', 'isprint', 'ispunct', 'isspace',
+ 'isupper', 'isxdigit', 'toascii', 'tolower', 'toupper',
+
+ //inttypes.h
+ 'imaxabs', 'imaxdiv', 'strtoimax', 'strtoumax', 'wcstoimax',
+ 'wcstoumax',
+
+ //locale.h
+ 'localeconv', 'setlocale',
+
+ //math.h
+ 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'exp',
+ 'fabs', 'floor', 'frexp', 'ldexp', 'log', 'log10', 'modf', 'pow',
+ 'sin', 'sinh', 'sqrt', 'tan', 'tanh',
+
+ //setjmp.h
+ 'longjmp', 'setjmp',
+
+ //signal.h
+ 'raise',
+
+ //stdarg.h
+ 'va_arg', 'va_copy', 'va_end', 'va_start',
+
+ //stddef.h
+ 'offsetof',
+
+ //stdio.h
+ 'clearerr', 'fclose', 'fdopen', 'feof', 'ferror', 'fflush', 'fgetc',
+ 'fgetpos', 'fgets', 'fopen', 'fprintf', 'fputc', 'fputchar',
+ 'fputs', 'fread', 'freopen', 'fscanf', 'fseek', 'fsetpos', 'ftell',
+ 'fwrite', 'getc', 'getch', 'getchar', 'gets', 'perror', 'printf',
+ 'putc', 'putchar', 'puts', 'remove', 'rename', 'rewind', 'scanf',
+ 'setbuf', 'setvbuf', 'snprintf', 'sprintf', 'sscanf', 'tmpfile',
+ 'tmpnam', 'ungetc', 'vfprintf', 'vfscanf', 'vprintf', 'vscanf',
+ 'vsprintf', 'vsscanf',
+
+ //stdlib.h
+ 'abort', 'abs', 'atexit', 'atof', 'atoi', 'atol', 'bsearch',
+ 'calloc', 'div', 'exit', 'free', 'getenv', 'itoa', 'labs', 'ldiv',
+ 'ltoa', 'malloc', 'qsort', 'rand', 'realloc', 'srand', 'strtod',
+ 'strtol', 'strtoul', 'system',
+
+ //string.h
+ 'memchr', 'memcmp', 'memcpy', 'memmove', 'memset', 'strcat',
+ 'strchr', 'strcmp', 'strcoll', 'strcpy', 'strcspn', 'strerror',
+ 'strlen', 'strncat', 'strncmp', 'strncpy', 'strpbrk', 'strrchr',
+ 'strspn', 'strstr', 'strtok', 'strxfrm',
+
+ //time.h
+ 'asctime', 'clock', 'ctime', 'difftime', 'gmtime', 'localtime',
+ 'mktime', 'strftime', 'time',
+
+ //wchar.h
+ 'btowc', 'fgetwc', 'fgetws', 'fputwc', 'fputws', 'fwide',
+ 'fwprintf', 'fwscanf', 'getwc', 'getwchar', 'mbrlen', 'mbrtowc',
+ 'mbsinit', 'mbsrtowcs', 'putwc', 'putwchar', 'swprintf', 'swscanf',
+ 'ungetwc', 'vfwprintf', 'vswprintf', 'vwprintf', 'wcrtomb',
+ 'wcscat', 'wcschr', 'wcscmp', 'wcscoll', 'wcscpy', 'wcscspn',
+ 'wcsftime', 'wcslen', 'wcsncat', 'wcsncmp', 'wcsncpy', 'wcspbrk',
+ 'wcsrchr', 'wcsrtombs', 'wcsspn', 'wcsstr', 'wcstod', 'wcstok',
+ 'wcstol', 'wcstoul', 'wcsxfrm', 'wctob', 'wmemchr', 'wmemcmp',
+ 'wmemcpy', 'wmemmove', 'wmemset', 'wprintf', 'wscanf',
+
+ //wctype.h
+ 'iswalnum', 'iswalpha', 'iswcntrl', 'iswctype', 'iswdigit',
+ 'iswgraph', 'iswlower', 'iswprint', 'iswpunct', 'iswspace',
+ 'iswupper', 'iswxdigit', 'towctrans', 'towlower', 'towupper',
+ 'wctrans', 'wctype'
+ ),
+ 4 => array(
+ 'auto', 'char', 'const', 'double', 'float', 'int', 'long',
+ 'register', 'short', 'signed', 'sizeof', 'static', 'struct',
+ 'typedef', 'union', 'unsigned', 'void', 'volatile', 'wchar_t',
+
+ 'int8', 'int16', 'int32', 'int64',
+ 'uint8', 'uint16', 'uint32', 'uint64',
+
+ 'int_fast8_t', 'int_fast16_t', 'int_fast32_t', 'int_fast64_t',
+ 'uint_fast8_t', 'uint_fast16_t', 'uint_fast32_t', 'uint_fast64_t',
+
+ 'int_least8_t', 'int_least16_t', 'int_least32_t', 'int_least64_t',
+ 'uint_least8_t', 'uint_least16_t', 'uint_least32_t', 'uint_least64_t',
+
+ 'int8_t', 'int16_t', 'int32_t', 'int64_t',
+ 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t',
+
+ 'intmax_t', 'uintmax_t', 'intptr_t', 'uintptr_t',
+ 'size_t', 'off_t'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']',
+ '+', '-', '*', '/', '%',
+ '=', '<', '>',
+ '!', '^', '&', '|',
+ '?', ':',
+ ';', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;',
+ 4 => 'color: #993333;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #339933;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #660099; font-weight: bold;',
+ 3 => 'color: #660099; font-weight: bold;',
+ 4 => 'color: #660099; font-weight: bold;',
+ 5 => 'color: #006699; font-weight: bold;',
+ 'HARD' => '',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #208080;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color:#800080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI => 'color:#800080;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.opengroup.org/onlinepubs/009695399/functions/{FNAMEL}.html',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/c_loadrunner.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/c_loadrunner.php
new file mode 100644
index 00000000..42b3d772
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/c_loadrunner.php
@@ -0,0 +1,323 @@
+<?php
+/*************************************************************************************
+ * c_loadrunner.php
+ * ---------------------------------
+ * Author: Stuart Moncrieff (stuart at myloadtest dot com)
+ * Copyright: (c) 2010 Stuart Moncrieff (http://www.myloadtest.com/loadrunner-syntax-highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010-07-25
+ *
+ * C (for LoadRunner) language file for GeSHi.
+ *
+ * Based on LoadRunner 9.52.
+ *
+ * CHANGES
+ * -------
+ * 2010-08-01 (1.0.8.9)
+ * - Added highlighting support for LoadRunner {parameters}.
+ * 2010-07-25 (1.0.8.8)
+ * - First Release. Syntax highlighting support for lr_, web_, and sapgui_ functions only.
+ *
+ * TODO (updated 2010-07-25)
+ * -------------------------
+ * - Add support for other vuser types: MMS, FTP, etc.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * ************************************************************************************/
+
+$language_data = array (
+ // The First Indices
+ 'LANG_NAME' => 'C (LoadRunner)',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ // Escape characters within strings (like \\) are not highlighted differently in LoadRunner, so
+ // I am using GeSHi escape characters (or regular expressions) to highlight LoadRunner {parameters}.
+ // LoadRunner {parameters} must begin with a letter and contain only alphanumeric characters and '_'
+ 'ESCAPE_REGEXP' => array(
+ 0 => "#\{[a-zA-Z]{1}[a-zA-Z_]{0,}\}#",
+ ),
+
+ // Keywords
+ 'KEYWORDS' => array(
+ // Keywords from http://en.wikipedia.org/wiki/C_syntax
+ 1 => array(
+ 'auto', 'break', 'case', 'char', 'const', 'continue', 'default',
+ 'do', 'double', 'else', 'enum', 'extern', 'float', 'for', 'goto',
+ 'if', 'inline', 'int', 'long', 'register', 'restrict', 'return',
+ 'short', 'signed', 'sizeof', 'static', 'struct', 'switch',
+ 'typedef', 'union', 'unsigned', 'void', 'volatile', 'while',
+ '_Bool', '_Complex', '_Imaginary'
+ ),
+ // C preprocessor directives from http://en.wikipedia.org/wiki/C_preprocessor
+ 2 => array(
+ '#define', '#if', '#ifdef', '#ifndef', '#include', '#else', '#elif', '#endif', '#pragma', '#undef'
+ ),
+ // Functions from lrun.h
+ 3 => array(
+ 'lr_start_transaction', 'lr_start_sub_transaction', 'lr_start_transaction_instance', 'lr_end_transaction',
+ 'lr_end_sub_transaction', 'lr_end_transaction_instance', 'lr_stop_transaction', 'lr_stop_transaction_instance',
+ 'lr_resume_transaction', 'lr_resume_transaction_instance', 'lr_wasted_time', 'lr_set_transaction', 'lr_user_data_point',
+ 'lr_user_data_point_instance', 'lr_user_data_point_ex', 'lr_user_data_point_instance_ex', 'lr_get_transaction_duration',
+ 'lr_get_trans_instance_duration', 'lr_get_transaction_think_time', 'lr_get_trans_instance_think_time',
+ 'lr_get_transaction_wasted_time', 'lr_get_trans_instance_wasted_time', 'lr_get_transaction_status',
+ 'lr_get_trans_instance_status', 'lr_set_transaction_status', 'lr_set_transaction_status_by_name',
+ 'lr_set_transaction_instance_status', 'lr_start_timer', 'lr_end_timer', 'lr_rendezvous', 'lr_rendezvous_ex',
+ 'lr_get_vuser_ip', 'lr_whoami', 'lr_get_host_name', 'lr_get_master_host_name', 'lr_get_attrib_long',
+ 'lr_get_attrib_string', 'lr_get_attrib_double', 'lr_paramarr_idx', 'lr_paramarr_random', 'lr_paramarr_len',
+ 'lr_param_unique', 'lr_param_sprintf', 'lr_load_dll', 'lr_continue_on_error', 'lr_decrypt', 'lr_abort', 'lr_exit',
+ 'lr_peek_events', 'lr_think_time', 'lr_debug_message', 'lr_log_message', 'lr_message', 'lr_error_message',
+ 'lr_output_message', 'lr_vuser_status_message', 'lr_fail_trans_with_error', 'lr_next_row', 'lr_advance_param',
+ 'lr_eval_string', 'lr_eval_string_ext', 'lr_eval_string_ext_free', 'lr_param_increment', 'lr_save_var',
+ 'lr_save_string', 'lr_save_int', 'lr_save_datetime', 'lr_save_searched_string', 'lr_set_debug_message',
+ 'lr_get_debug_message', 'lr_enable_ip_spoofing', 'lr_disable_ip_spoofing', 'lr_convert_string_encoding'
+ ),
+ // Constants from lrun.h
+ 4 => array(
+ 'DP_FLAGS_NO_LOG', 'DP_FLAGS_STANDARD_LOG', 'DP_FLAGS_EXTENDED_LOG', 'merc_timer_handle_t', 'LR_EXIT_VUSER',
+ 'LR_EXIT_ACTION_AND_CONTINUE', 'LR_EXIT_ITERATION_AND_CONTINUE', 'LR_EXIT_VUSER_AFTER_ITERATION',
+ 'LR_EXIT_VUSER_AFTER_ACTION', 'LR_EXIT_MAIN_ITERATION_AND_CONTINUE', 'LR_MSG_CLASS_DISABLE_LOG',
+ 'LR_MSG_CLASS_STANDARD_LOG', 'LR_MSG_CLASS_RETURNED_DATA', 'LR_MSG_CLASS_PARAMETERS', 'LR_MSG_CLASS_ADVANCED_TRACE',
+ 'LR_MSG_CLASS_EXTENDED_LOG', 'LR_MSG_CLASS_SENT_DATA', 'LR_MSG_CLASS_JIT_LOG_ON_ERROR', 'LR_SWITCH_OFF', 'LR_SWITCH_ON',
+ 'LR_SWITCH_DEFAULT', 'ONE_DAY', 'ONE_HOUR', 'ONE_MIN', 'DATE_NOW', 'TIME_NOW', 'LR_MSG_CLASS_BRIEF_LOG',
+ 'LR_MSG_CLASS_RESULT_DATA', 'LR_MSG_CLASS_FULL_TRACE', 'LR_MSG_CLASS_AUTO_LOG', 'LR_MSG_OFF', 'LR_MSG_ON',
+ 'LR_MSG_DEFAULT'
+ ),
+ // Functions from web_api.h
+ 5 => array(
+ 'web_reg_add_cookie', 'web_report_data_point', 'web_text_link', 'web_element', 'web_image_link', 'web_static_image',
+ 'web_image_submit', 'web_button', 'web_edit_field', 'web_radio_group', 'web_check_box', 'web_list', 'web_text_area',
+ 'web_map_area', 'web_eval_java_script', 'web_reg_dialog', 'web_reg_cross_step_download', 'web_browser',
+ 'web_set_rts_key', 'web_save_param_length', 'web_save_timestamp_param', 'web_load_cache', 'web_dump_cache',
+ 'web_add_cookie_ex'
+ ),
+ // Constants from web_api.h
+ 6 => array(
+ 'DESCRIPTION', 'ACTION', 'VERIFICATION', 'LR_NOT_FOUND', 'HTTP_INFO_TOTAL_REQUEST_STAT',
+ 'HTTP_INFO_TOTAL_RESPONSE_STAT', 'LRW_OPT_STOP_VUSER_ON_ERROR', 'LRW_OPT_DISPLAY_IMAGE_BODY'
+ ),
+ // Functions from as_web.h
+ 7 => array(
+ 'web_add_filter', 'web_add_auto_filter', 'web_add_auto_header', 'web_add_header', 'web_add_cookie',
+ 'web_cleanup_auto_headers', 'web_cleanup_cookies', 'web_concurrent_end', 'web_concurrent_start', 'web_create_html_param',
+ 'web_create_html_param_ex', 'web_custom_request', 'web_disable_keep_alive', 'web_enable_keep_alive', 'web_find',
+ 'web_get_int_property', 'web_image', 'web_image_check', 'web_link', 'web_global_verification', 'web_reg_find',
+ 'web_reg_save_param', 'web_convert_param', 'web_remove_auto_filter', 'web_remove_auto_header', 'web_revert_auto_header',
+ 'web_remove_cookie', 'web_save_header', 'web_set_certificate', 'web_set_certificate_ex', 'web_set_connections_limit',
+ 'web_set_max_html_param_len', 'web_set_max_retries', 'web_set_proxy', 'web_set_proxy_bypass', 'web_set_secure_proxy',
+ 'web_set_sockets_option', 'web_set_option', 'web_set_timeout', 'web_set_user', 'web_sjis_to_euc_param',
+ 'web_submit_data', 'web_submit_form', 'web_url', 'web_set_proxy_bypass_local', 'web_cache_cleanup',
+ 'web_create_html_query', 'web_create_radio_button_param', 'web_switch_net_layer'
+ ),
+ // Constants from as_web.h
+ 8 => array(
+ 'ENDFORM', 'LAST', 'ENDITEM', 'EXTRARES', 'ITEMDATA', 'STARTHIDDENS', 'ENDHIDDENS', 'CONNECT', 'RECEIVE', 'RESOLVE',
+ 'STEP', 'REQUEST', 'RESPONSE', 'STARTQUERY', 'ENDQUERY', 'INPROPS', 'OUTPROPS', 'ENDPROPS', 'RAW_BODY_START',
+ 'RAW_BODY_END', 'HTTP_INFO_RETURN_CODE', 'HTTP_INFO_DOWNLOAD_SIZE', 'HTTP_INFO_DOWNLOAD_TIME',
+ 'LRW_NET_SOCKET_OPT_LOAD_VERIFY_FILE', 'LRW_NET_SOCKET_OPT_DEFAULT_VERIFY_PATH', 'LRW_NET_SOCKET_OPT_SSL_VERSION',
+ 'LRW_NET_SOCKET_OPT_SSL_CIPHER_LIST', 'LRW_NET_SOCKET_OPT_SO_REUSE_ADDRESS', 'LRW_NET_SOCKET_OPT_USER_IP_ADDRESS',
+ 'LRW_NET_SOCKET_OPT_IP_ADDRESS_BY_INDEX', 'LRW_NET_SOCKET_OPT_HELP', 'LRW_NET_SOCKET_OPT_PRINT_USER_IP_ADDRESS_LIST',
+ 'LRW_OPT_HTML_CHAR_REF_BACKWARD_COMPATIBILITY', 'LRW_OPT_VALUE_YES', 'LRW_OPT_VALUE_NO'
+ ),
+ // Functions from as_sapgui.h
+ 9 => array(
+ 'sapgui_open_connection', 'sapgui_open_connection_ex', 'sapgui_logon', 'sapgui_create_session',
+ 'sapgui_create_new_session', 'sapgui_call_method', 'sapgui_call_method_ex', 'sapgui_set_property',
+ 'sapgui_get_property', 'sapgui_set_collection_property', 'sapgui_active_object_from_parent_method',
+ 'sapgui_active_object_from_parent_property', 'sapgui_call_method_of_active_object',
+ 'sapgui_call_method_of_active_object_ex', 'sapgui_set_property_of_active_object', 'sapgui_get_property_of_active_object',
+ 'sapgui_select_active_connection', 'sapgui_select_active_session', 'sapgui_select_active_window ',
+ 'sapgui_status_bar_get_text', 'sapgui_status_bar_get_param', 'sapgui_status_bar_get_type', 'sapgui_get_status_bar_text',
+ 'sapgui_get_active_window_title', 'sapgui_is_object_available', 'sapgui_is_tab_selected', 'sapgui_is_object_changeable',
+ 'sapgui_set_ok_code', 'sapgui_send_vkey', 'sapgui_resize_window', 'sapgui_window_resize', 'sapgui_window_maximize',
+ 'sapgui_window_close', 'sapgui_window_restore', 'sapgui_window_scroll_to_row', 'sapgui_press_button',
+ 'sapgui_select_radio_button', 'sapgui_set_password', 'sapgui_set_text', 'sapgui_select_menu', 'sapgui_select_tab',
+ 'sapgui_set_checkbox', 'sapgui_set_focus', 'sapgui_select_combobox_entry', 'sapgui_get_ok_code',
+ 'sapgui_is_radio_button_selected', 'sapgui_get_text', 'sapgui_is_checkbox_selected', 'sapgui_table_set_focus',
+ 'sapgui_table_press_button', 'sapgui_table_select_radio_button', 'sapgui_table_set_password', 'sapgui_table_set_text',
+ 'sapgui_table_set_checkbox', 'sapgui_table_select_combobox_entry', 'sapgui_table_set_row_selected',
+ 'sapgui_table_set_column_selected', 'sapgui_table_set_column_width', 'sapgui_table_reorder', 'sapgui_table_fill_data',
+ 'sapgui_table_get_text', 'sapgui_table_is_radio_button_selected', 'sapgui_table_is_checkbox_selected',
+ 'sapgui_table_is_row_selected', 'sapgui_table_is_column_selected', 'sapgui_table_get_column_width',
+ 'sapgui_grid_clear_selection', 'sapgui_grid_select_all', 'sapgui_grid_selection_changed',
+ 'sapgui_grid_press_column_header', 'sapgui_grid_select_cell', 'sapgui_grid_select_rows', 'sapgui_grid_select_column',
+ 'sapgui_grid_deselect_column', 'sapgui_grid_select_columns', 'sapgui_grid_select_cells', 'sapgui_grid_select_cell_row',
+ 'sapgui_grid_select_cell_column', 'sapgui_grid_set_column_order', 'sapgui_grid_set_column_width',
+ 'sapgui_grid_scroll_to_row', 'sapgui_grid_double_click', 'sapgui_grid_click', 'sapgui_grid_press_button',
+ 'sapgui_grid_press_total_row', 'sapgui_grid_set_cell_data', 'sapgui_grid_set_checkbox',
+ 'sapgui_grid_double_click_current_cell', 'sapgui_grid_click_current_cell', 'sapgui_grid_press_button_current_cell',
+ 'sapgui_grid_press_total_row_current_cell', 'sapgui_grid_press_F1', 'sapgui_grid_press_F4', 'sapgui_grid_press_ENTER',
+ 'sapgui_grid_press_toolbar_button', 'sapgui_grid_press_toolbar_context_button', 'sapgui_grid_open_context_menu',
+ 'sapgui_grid_select_context_menu', 'sapgui_grid_select_toolbar_menu', 'sapgui_grid_fill_data',
+ 'sapgui_grid_get_current_cell_row', 'sapgui_grid_get_current_cell_column', 'sapgui_grid_get_rows_count',
+ 'sapgui_grid_get_columns_count', 'sapgui_grid_get_cell_data', 'sapgui_grid_is_checkbox_selected',
+ 'sapgui_tree_scroll_to_node', 'sapgui_tree_set_hierarchy_header_width', 'sapgui_tree_set_selected_node',
+ 'sapgui_tree_double_click_node', 'sapgui_tree_press_key', 'sapgui_tree_press_button', 'sapgui_tree_set_checkbox',
+ 'sapgui_tree_double_click_item', 'sapgui_tree_click_link', 'sapgui_tree_open_default_context_menu',
+ 'sapgui_tree_open_node_context_menu', 'sapgui_tree_open_header_context_menu', 'sapgui_tree_open_item_context_menu',
+ 'sapgui_tree_select_context_menu', 'sapgui_tree_select_item', 'sapgui_tree_select_node', 'sapgui_tree_unselect_node',
+ 'sapgui_tree_unselect_all', 'sapgui_tree_select_column', 'sapgui_tree_unselect_column', 'sapgui_tree_set_column_order',
+ 'sapgui_tree_collapse_node', 'sapgui_tree_expand_node', 'sapgui_tree_scroll_to_item', 'sapgui_tree_set_column_width',
+ 'sapgui_tree_press_header', 'sapgui_tree_is_checkbox_selected', 'sapgui_tree_get_node_text', 'sapgui_tree_get_item_text',
+ 'sapgui_calendar_scroll_to_date', 'sapgui_calendar_focus_date', 'sapgui_calendar_select_interval',
+ 'sapgui_apogrid_select_all', 'sapgui_apogrid_clear_selection', 'sapgui_apogrid_select_cell',
+ 'sapgui_apogrid_deselect_cell', 'sapgui_apogrid_select_row', 'sapgui_apogrid_deselect_row',
+ 'sapgui_apogrid_select_column', 'sapgui_apogrid_deselect_column', 'sapgui_apogrid_scroll_to_row',
+ 'sapgui_apogrid_scroll_to_column', 'sapgui_apogrid_double_click', 'sapgui_apogrid_set_cell_data',
+ 'sapgui_apogrid_get_cell_data', 'sapgui_apogrid_is_cell_changeable', 'sapgui_apogrid_get_cell_format',
+ 'sapgui_apogrid_get_cell_tooltip', 'sapgui_apogrid_press_ENTER', 'sapgui_apogrid_open_cell_context_menu',
+ 'sapgui_apogrid_select_context_menu_item', 'sapgui_text_edit_scroll_to_line', 'sapgui_text_edit_set_selection_indexes',
+ 'sapgui_text_edit_set_unprotected_text_part', 'sapgui_text_edit_get_first_visible_line',
+ 'sapgui_text_edit_get_selection_index_start', 'sapgui_text_edit_get_selection_index_end',
+ 'sapgui_text_edit_get_number_of_unprotected_text_parts', 'sapgui_text_edit_double_click',
+ 'sapgui_text_edit_single_file_dropped', 'sapgui_text_edit_multiple_files_dropped', 'sapgui_text_edit_press_F1',
+ 'sapgui_text_edit_press_F4', 'sapgui_text_edit_open_context_menu', 'sapgui_text_edit_select_context_menu',
+ 'sapgui_text_edit_modified_status_changed', 'sapgui_htmlviewer_send_event', 'sapgui_htmlviewer_dom_get_property',
+ 'sapgui_toolbar_press_button', 'sapgui_toolbar_press_context_button', 'sapgui_toolbar_select_menu_item',
+ 'sapgui_toolbar_select_menu_item_by_text', 'sapgui_toolbar_select_context_menu_item',
+ 'sapgui_toolbar_select_context_menu_item_by_text'
+ ),
+ // Constants from as_sapgui.h
+ 10 => array(
+ 'BEGIN_OPTIONAL', 'END_OPTIONAL', 'al-keys', 'ENTER', 'HELP', 'F2', 'BACK', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9',
+ 'F10', 'F11', 'ESC', 'SHIFT_F1', 'SHIFT_F2', 'SHIFT_F3', 'SHIFT_F4', 'SHIFT_F5', 'SHIFT_F6', 'SHIFT_F7', 'SHIFT_F8',
+ 'SHIFT_F9', 'SHIFT_F10', 'SHIFT_F11', 'SHIFT_F12', 'CTRL_F1', 'CTRL_F2', 'CTRL_F3', 'CTRL_F4', 'CTRL_F5', 'CTRL_F6',
+ 'CTRL_F7', 'CTRL_F8', 'CTRL_F9', 'CTRL_F10', 'CTRL_F11', 'CTRL_F12', 'CTRL_SHIFT_F1', 'CTRL_SHIFT_F2', 'CTRL_SHIFT_F3',
+ 'CTRL_SHIFT_F4', 'CTRL_SHIFT_F5', 'CTRL_SHIFT_F6', 'CTRL_SHIFT_F7', 'CTRL_SHIFT_F8', 'CTRL_SHIFT_F9', 'CTRL_SHIFT_F10',
+ 'CTRL_SHIFT_F11', 'CTRL_SHIFT_F12', 'CANCEL', 'CTRL_F', 'CTRL_PAGE_UP', 'PAGE_UP', 'PAGE_DOWN', 'CTRL_PAGE_DOWN',
+ 'CTRL_G', 'CTRL_P'
+ ),
+ ),
+
+ // Symbols and Case Sensitivity
+ // Symbols from: http://en.wikipedia.org/wiki/C_syntax
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']',
+ '+', '-', '*', '/', '%',
+ '=', '<', '>', '!', '^', '&', '|', '?', ':', ';', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true, // Standard C reserved keywords
+ 2 => true, // C preprocessor directives
+ 3 => true, // Functions from lrun.h
+ 4 => true, // Constants from lrun.h
+ 5 => true, // Functions from web_api.h
+ 6 => true, // Constants from web_api.h
+ 7 => true, // Functions from as_web.h
+ 8 => true, // Constants from as_web.h
+ 9 => true, // Functions from as_sapgui.h
+ 10 => true, // Constants from as_sapgui.h
+ ),
+
+ // Styles
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ // Functions are brown, constants and reserved words are blue
+ 1 => 'color: #0000ff;', // Standard C reserved keywords
+ 2 => 'color: #0000ff;', // C preprocessor directives
+ 3 => 'color: #8a0000;', // Functions from lrun.h
+ 4 => 'color: #0000ff;', // Constants from lrun.h
+ 5 => 'color: #8a0000;', // Functions from web_api.h
+ 6 => 'color: #0000ff;', // Constants from web_api.h
+ 7 => 'color: #8a0000;', // Functions from as_web.h
+ 8 => 'color: #0000ff;', // Constants from as_web.h
+ 9 => 'color: #8a0000;', // Functions from as_sapgui.h
+ 10 => 'color: #0000ff;', // Constants from as_sapgui.h
+ ),
+ 'COMMENTS' => array(
+ // Comments are grey
+ 1 => 'color: #9b9b9b;',
+ 'MULTI' => 'color: #9b9b9b;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ // GeSHi cannot define a separate style for ESCAPE_REGEXP. The style for ESCAPE_CHAR also applies to ESCAPE_REGEXP.
+ // This is used for LoadRunner {parameters}
+ // {parameters} are pink
+ 0 => 'color: #c000c0;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ // Strings are green
+ 0 => 'color: #008080;'
+ ),
+ 'NUMBERS' => array(
+ // Numbers are green
+ 0 => 'color: #008080;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #008080;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #008080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #008080;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color:#008080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#008080;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color:#008080;',
+ GESHI_NUMBER_FLT_NONSCI => 'color:#008080;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #000000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+
+ // URLs for Functions
+ 'URLS' => array(
+ 1 => '', // Standard C reserved keywords
+ 2 => '', // C preprocessor directives
+ 3 => '', // Functions from lrun.h
+ 4 => '', // Constants from lrun.h
+ 5 => '', // Functions from web_api.h
+ 6 => '', // Constants from web_api.h
+ 7 => '', // Functions from as_web.h
+ 8 => '', // Constants from as_web.h
+ 9 => '', // Functions from as_sapgui.h
+ 10 => '', // Constants from as_sapgui.h
+ ),
+
+ // Object Orientation
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+
+ // Regular Expressions
+ // Note that REGEXPS are not applied within strings.
+ 'REGEXPS' => array(
+ ),
+
+ // Contextual Highlighting and Strict Mode
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+
+ // Tabs
+ // Note that if you are using <pre> tags for your code, then the browser chooses how many spaces your tabs will translate to.
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/c_mac.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/c_mac.php
new file mode 100644
index 00000000..41c21ce5
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/c_mac.php
@@ -0,0 +1,227 @@
+<?php
+/*************************************************************************************
+ * c_mac.php
+ * ---------
+ * Author: M. Uli Kusterer (witness.of.teachtext@gmx.net)
+ * Copyright: (c) 2004 M. Uli Kusterer, Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/04
+ *
+ * C for Macs language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2004/11/27
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'C (Mac)',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Multiline-continued single-line comments
+ 1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Multiline-continued preprocessor define
+ 2 => '/#(?:\\\\\\\\|\\\\\\n|.)*$/m'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[\\\\abfnrtv\'\"?\n]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{2}#",
+ //Hexadecimal Char Specs
+ 3 => "#\\\\u[\da-fA-F]{4}#",
+ //Hexadecimal Char Specs
+ 4 => "#\\\\U[\da-fA-F]{8}#",
+ //Octal Char Specs
+ 5 => "#\\\\[0-7]{1,3}#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'if', 'return', 'while', 'case', 'continue', 'default',
+ 'do', 'else', 'for', 'switch', 'goto'
+ ),
+ 2 => array(
+ 'NULL', 'false', 'break', 'true', 'enum', 'errno', 'EDOM',
+ 'ERANGE', 'FLT_RADIX', 'FLT_ROUNDS', 'FLT_DIG', 'DBL_DIG', 'LDBL_DIG',
+ 'FLT_EPSILON', 'DBL_EPSILON', 'LDBL_EPSILON', 'FLT_MANT_DIG', 'DBL_MANT_DIG',
+ 'LDBL_MANT_DIG', 'FLT_MAX', 'DBL_MAX', 'LDBL_MAX', 'FLT_MAX_EXP', 'DBL_MAX_EXP',
+ 'LDBL_MAX_EXP', 'FLT_MIN', 'DBL_MIN', 'LDBL_MIN', 'FLT_MIN_EXP', 'DBL_MIN_EXP',
+ 'LDBL_MIN_EXP', 'CHAR_BIT', 'CHAR_MAX', 'CHAR_MIN', 'SCHAR_MAX', 'SCHAR_MIN',
+ 'UCHAR_MAX', 'SHRT_MAX', 'SHRT_MIN', 'USHRT_MAX', 'INT_MAX', 'INT_MIN',
+ 'UINT_MAX', 'LONG_MAX', 'LONG_MIN', 'ULONG_MAX', 'HUGE_VAL', 'SIGABRT',
+ 'SIGFPE', 'SIGILL', 'SIGINT', 'SIGSEGV', 'SIGTERM', 'SIG_DFL', 'SIG_ERR',
+ 'SIG_IGN', 'BUFSIZ', 'EOF', 'FILENAME_MAX', 'FOPEN_MAX', 'L_tmpnam',
+ 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'stdin', 'stdout', 'stderr',
+ 'EXIT_FAILURE', 'EXIT_SUCCESS', 'RAND_MAX', 'CLOCKS_PER_SEC',
+ // Mac-specific constants:
+ 'kCFAllocatorDefault'
+ ),
+ 3 => array(
+ 'printf', 'fprintf', 'snprintf', 'sprintf', 'assert',
+ 'isalnum', 'isalpha', 'isdigit', 'iscntrl', 'isgraph', 'islower', 'isprint',
+ 'ispunct', 'isspace', 'isupper', 'isxdigit', 'tolower', 'toupper',
+ 'exp', 'log', 'log10', 'pow', 'sqrt', 'ceil', 'floor', 'fabs', 'ldexp',
+ 'frexp', 'modf', 'fmod', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'atan2',
+ 'sinh', 'cosh', 'tanh', 'setjmp', 'longjmp',
+ 'va_start', 'va_arg', 'va_end', 'offsetof', 'sizeof', 'fopen', 'freopen',
+ 'fflush', 'fclose', 'remove', 'rename', 'tmpfile', 'tmpname', 'setvbuf',
+ 'setbuf', 'vfprintf', 'vprintf', 'vsprintf', 'fscanf', 'scanf', 'sscanf',
+ 'fgetc', 'fgets', 'fputc', 'fputs', 'getc', 'getchar', 'gets', 'putc',
+ 'putchar', 'puts', 'ungetc', 'fread', 'fwrite', 'fseek', 'ftell', 'rewind',
+ 'fgetpos', 'fsetpos', 'clearerr', 'feof', 'ferror', 'perror', 'abs', 'labs',
+ 'div', 'ldiv', 'atof', 'atoi', 'atol', 'strtod', 'strtol', 'strtoul', 'calloc',
+ 'malloc', 'realloc', 'free', 'abort', 'exit', 'atexit', 'system', 'getenv',
+ 'bsearch', 'qsort', 'rand', 'srand', 'strcpy', 'strncpy', 'strcat', 'strncat',
+ 'strcmp', 'strncmp', 'strcoll', 'strchr', 'strrchr', 'strspn', 'strcspn',
+ 'strpbrk', 'strstr', 'strlen', 'strerror', 'strtok', 'strxfrm', 'memcpy',
+ 'memmove', 'memcmp', 'memchr', 'memset', 'clock', 'time', 'difftime', 'mktime',
+ 'asctime', 'ctime', 'gmtime', 'localtime', 'strftime'
+ ),
+ 4 => array(
+ 'auto', 'char', 'const', 'double', 'float', 'int', 'long',
+ 'register', 'short', 'signed', 'static', 'struct',
+ 'typedef', 'union', 'unsigned', 'void', 'volatile', 'extern', 'jmp_buf',
+ 'signal', 'raise', 'va_list', 'ptrdiff_t', 'size_t', 'FILE', 'fpos_t',
+ 'div_t', 'ldiv_t', 'clock_t', 'time_t', 'tm', 'wchar_t',
+
+ 'int8', 'int16', 'int32', 'int64',
+ 'uint8', 'uint16', 'uint32', 'uint64',
+
+ 'int_fast8_t', 'int_fast16_t', 'int_fast32_t', 'int_fast64_t',
+ 'uint_fast8_t', 'uint_fast16_t', 'uint_fast32_t', 'uint_fast64_t',
+
+ 'int_least8_t', 'int_least16_t', 'int_least32_t', 'int_least64_t',
+ 'uint_least8_t', 'uint_least16_t', 'uint_least32_t', 'uint_least64_t',
+
+ 'int8_t', 'int16_t', 'int32_t', 'int64_t',
+ 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t',
+
+ 'intmax_t', 'uintmax_t', 'intptr_t', 'uintptr_t',
+
+ // Mac-specific types:
+ 'CFArrayRef', 'CFDictionaryRef', 'CFMutableDictionaryRef', 'CFBundleRef', 'CFSetRef', 'CFStringRef',
+ 'CFURLRef', 'CFLocaleRef', 'CFDateFormatterRef', 'CFNumberFormatterRef', 'CFPropertyListRef',
+ 'CFTreeRef', 'CFWriteStreamRef', 'CFCharacterSetRef', 'CFMutableStringRef', 'CFNotificationRef',
+ 'CFReadStreamRef', 'CFNull', 'CFAllocatorRef', 'CFBagRef', 'CFBinaryHeapRef',
+ 'CFBitVectorRef', 'CFBooleanRef', 'CFDataRef', 'CFDateRef', 'CFMachPortRef', 'CFMessagePortRef',
+ 'CFMutableArrayRef', 'CFMutableBagRef', 'CFMutableBitVectorRef', 'CFMutableCharacterSetRef',
+ 'CFMutableDataRef', 'CFMutableSetRef', 'CFNumberRef', 'CFPlugInRef', 'CFPlugInInstanceRef',
+ 'CFRunLoopRef', 'CFRunLoopObserverRef', 'CFRunLoopSourceRef', 'CFRunLoopTimerRef', 'CFSocketRef',
+ 'CFTimeZoneRef', 'CFTypeRef', 'CFUserNotificationRef', 'CFUUIDRef', 'CFXMLNodeRef', 'CFXMLParserRef',
+ 'CFXMLTreeRef'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '=', '+', '-', '*', '/', '!', '%', '^', '&', ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #0000dd;',
+ 4 => 'color: #0000ff;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #ff0000;',
+ 2 => 'color: #339900;',
+ 'MULTI' => 'color: #ff0000; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #660099; font-weight: bold;',
+ 3 => 'color: #660099; font-weight: bold;',
+ 4 => 'color: #660099; font-weight: bold;',
+ 5 => 'color: #006699; font-weight: bold;',
+ 'HARD' => '',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #666666;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #208080;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color:#800080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI => 'color:#800080;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #00eeff;',
+ 2 => 'color: #00eeff;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.opengroup.org/onlinepubs/009695399/functions/{FNAMEL}.html',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/caddcl.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/caddcl.php
new file mode 100644
index 00000000..8b8b2f24
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/caddcl.php
@@ -0,0 +1,126 @@
+<?php
+/*************************************************************************************
+ * caddcl.php
+ * ----------
+ * Author: Roberto Rossi (rsoftware@altervista.org)
+ * Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/08/30
+ *
+ * CAD DCL (Dialog Control Language) language file for GeSHi.
+ *
+ * DCL for AutoCAD 12 or later and IntelliCAD all versions.
+ *
+ * CHANGES
+ * -------
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/1!/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'CAD DCL',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'boxed_column','boxed_radio_column','boxed_radio_row','boxed_row',
+ 'column','concatenation','button','dialog','edit_box','image','image_button',
+ 'errtile','list_box','ok_cancel','ok_cancel_help','ok_cancel_help_errtile',
+ 'ok_cancel_help_info','ok_only','paragraph','popup_list','radio_button',
+ 'radio_column','radio_row','row','slider','spacer','spacer_0','spacer_1','text',
+ 'text_part','toggle',
+ 'action','alignment','allow_accept','aspect_ratio','big_increment',
+ 'children_alignment','children_fixed_height',
+ 'children_fixed_width','color',
+ 'edit_limit','edit_width','fixed_height','fixed_width',
+ 'height','initial_focus','is_cancel','is_default',
+ 'is_enabled','is_tab_stop','is-bold','key','label','layout','list',
+ 'max_value','min_value','mnemonic','multiple_select','password_char',
+ 'small_increment','tabs','tab_truncate','value','width',
+ 'false','true','left','right','centered','top','bottom',
+ 'dialog_line','dialog_foreground','dialog_background',
+ 'graphics_background','black','red','yellow','green','cyan',
+ 'blue','magenta','whitegraphics_foreground',
+ 'horizontal','vertical'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '=', '+', '-', '*', '/', '!', '%', '^', '&', ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cadlisp.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cadlisp.php
new file mode 100644
index 00000000..3fa7ead0
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cadlisp.php
@@ -0,0 +1,186 @@
+<?php
+/*************************************************************************************
+ * cadlisp.php
+ * -----------
+ * Author: Roberto Rossi (rsoftware@altervista.org)
+ * Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/blog)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/08/30
+ *
+ * AutoCAD/IntelliCAD Lisp language file for GeSHi.
+ *
+ * For AutoCAD V.12..2005 and IntelliCAD all versions.
+ *
+ * CHANGES
+ * -------
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'CAD Lisp',
+ 'COMMENT_SINGLE' => array(1 => ";"),
+ 'COMMENT_MULTI' => array(";|" => "|;"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'abs','acad_colordlg','acad_helpdlg','acad_strlsort','action_tile',
+ 'add_list','alert','alloc','and','angle','angtof','angtos','append','apply',
+ 'arx','arxload','arxunload','ascii','assoc','atan','atof','atoi','atom',
+ 'atoms-family','autoarxload','autoload','Boole','boundp','caddr',
+ 'cadr','car','cdr','chr','client_data_tile','close','command','cond',
+ 'cons','cos','cvunit','defun','defun-q','defun-q-list-ref',
+ 'defun-q-list-set','dictadd','dictnext','dictremove','dictrename',
+ 'dictsearch','dimx_tile','dimy_tile','distance','distof','done_dialog',
+ 'end_image','end_list','entdel','entget','entlast','entmake',
+ 'entmakex','entmod','entnext','entsel','entupd','eq','equal','eval','exit',
+ 'exp','expand','expt','fill_image','findfile','fix','float','foreach','function',
+ 'gc','gcd','get_attr','get_tile','getangle','getcfg','getcname','getcorner',
+ 'getdist','getenv','getfiled','getint','getkword','getorient','getpoint',
+ 'getreal','getstring','getvar','graphscr','grclear','grdraw','grread','grtext',
+ 'grvecs','handent','help','if','initdia','initget','inters','itoa','lambda','last',
+ 'layoutlist','length','list','listp','load','load_dialog','log','logand','logior',
+ 'lsh','mapcar','max','mem','member','menucmd','menugroup','min','minusp','mode_tile',
+ 'namedobjdict','nentsel','nentselp','new_dialog','nil','not','nth','null',
+ 'numberp','open','or','osnap','polar','prin1','princ','print','progn','prompt',
+ 'quit','quote','read','read-char','read-line','redraw','regapp','rem','repeat',
+ 'reverse','rtos','set','set_tile','setcfg','setenv','setfunhelp','setq','setvar',
+ 'setview','sin','slide_image','snvalid','sqrt','ssadd','ssdel','ssget','ssgetfirst',
+ 'sslength','ssmemb','ssname','ssnamex','sssetfirst','start_dialog','start_image',
+ 'start_list','startapp','strcase','strcat','strlen','subst','substr','t','tablet',
+ 'tblnext','tblobjname','tblsearch','term_dialog','terpri','textbox','textpage',
+ 'textscr','trace','trans','type','unload_dialog','untrace','vector_image','ver',
+ 'vports','wcmatch','while','write-char','write-line','xdroom','xdsize','zerop',
+ 'vl-acad-defun','vl-acad-undefun','vl-arx-import','vlax-3D-point',
+ 'vlax-add-cmd','vlax-create-object','vlax-curve-getArea',
+ 'vlax-curve-getClosestPointTo','vlax-curve-getClosestPointToProjection',
+ 'vlax-curve-getDistAtParam','vlax-curve-getDistAtPoint',
+ 'vlax-curve-getEndParam','vlax-curve-getEndPoint',
+ 'vlax-curve-getFirstDeriv','vlax-curve-getParamAtDist',
+ 'vlax-curve-getParamAtPoint','vlax-curve-getPointAtDist',
+ 'vlax-curve-getPointAtParam','vlax-curve-getSecondDeriv',
+ 'vlax-curve-getStartParam','vlax-curve-getStartPoint',
+ 'vlax-curve-isClosed','vlax-curve-isPeriodic','vlax-curve-isPlanar',
+ 'vlax-dump-object','vlax-erased-p','vlax-for','vlax-get-acad-object',
+ 'vlax-get-object','vlax-get-or-create-object','vlax-get-property',
+ 'vlax-import-type-library','vlax-invoke-method','vlax-ldata-delete',
+ 'vlax-ldata-get','vlax-ldata-list','vlax-ldata-put','vlax-ldata-test',
+ 'vlax-make-safearray','vlax-make-variant','vlax-map-collection',
+ 'vlax-method-applicable-p','vlax-object-released-p','vlax-product-key',
+ 'vlax-property-available-p','vlax-put-property','vlax-read-enabled-p',
+ 'vlax-release-object','vlax-remove-cmd','vlax-safearray-fill',
+ 'vlax-safearray-get-dim','vlax-safearray-get-element',
+ 'vlax-safearray-get-l-bound','vlax-safearray-get-u-bound',
+ 'vlax-safearray-put-element','vlax-safearray-type','vlax-tmatrix',
+ 'vlax-typeinfo-available-p','vlax-variant-change-type',
+ 'vlax-variant-type','vlax-variant-value','vlax-write-enabled-p',
+ 'vl-bb-ref','vl-bb-set','vl-catch-all-apply','vl-catch-all-error-message',
+ 'vl-catch-all-error-p','vl-cmdf','vl-consp','vl-directory-files','vl-doc-export',
+ 'vl-doc-import','vl-doc-ref','vl-doc-set','vl-every','vl-exit-with-error',
+ 'vl-exit-with-value','vl-file-copy','vl-file-delete','vl-file-directory-p',
+ 'vl-filename-base','vl-filename-directory','vl-filename-extension',
+ 'vl-filename-mktemp','vl-file-rename','vl-file-size','vl-file-systime',
+ 'vl-get-resource','vlisp-compile','vl-list-exported-functions',
+ 'vl-list-length','vl-list-loaded-vlx','vl-load-all','vl-load-com',
+ 'vl-load-reactors','vl-member-if','vl-member-if-not','vl-position',
+ 'vl-prin1-to-string','vl-princ-to-string','vl-propagate','vlr-acdb-reactor',
+ 'vlr-add','vlr-added-p','vlr-beep-reaction','vlr-command-reactor',
+ 'vlr-current-reaction-name','vlr-data','vlr-data-set',
+ 'vlr-deepclone-reactor','vlr-docmanager-reactor','vlr-dwg-reactor',
+ 'vlr-dxf-reactor','vlr-editor-reactor','vl-registry-delete',
+ 'vl-registry-descendents','vl-registry-read','vl-registry-write',
+ 'vl-remove','vl-remove-if','vl-remove-if-not','vlr-insert-reactor',
+ 'vlr-linker-reactor','vlr-lisp-reactor','vlr-miscellaneous-reactor',
+ 'vlr-mouse-reactor','vlr-notification','vlr-object-reactor',
+ 'vlr-owner-add','vlr-owner-remove','vlr-owners','vlr-pers','vlr-pers-list',
+ 'vlr-pers-p','vlr-pers-release','vlr-reaction-names','vlr-reactions',
+ 'vlr-reaction-set','vlr-reactors','vlr-remove','vlr-remove-all',
+ 'vlr-set-notification','vlr-sysvar-reactor','vlr-toolbar-reactor',
+ 'vlr-trace-reaction','vlr-type','vlr-types','vlr-undo-reactor',
+ 'vlr-wblock-reactor','vlr-window-reactor','vlr-xref-reactor',
+ 'vl-some','vl-sort','vl-sort-i','vl-string-elt','vl-string-left-trim',
+ 'vl-string-mismatch','vl-string-position','vl-string-right-trim',
+ 'vl-string-search','vl-string-subst','vl-string-translate','vl-string-trim',
+ 'vl-symbol-name','vl-symbolp','vl-symbol-value','vl-unload-vlx','vl-vbaload',
+ 'vl-vbarun','vl-vlx-loaded-p'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '!', '%', '^', '&', '/','+','-','*','=','<','>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cfdg.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cfdg.php
new file mode 100644
index 00000000..e40963f0
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cfdg.php
@@ -0,0 +1,124 @@
+<?php
+/*************************************************************************************
+ * cfdg.php
+ * --------
+ * Author: John Horigan <john@glyphic.com>
+ * Copyright: (c) 2006 John Horigan http://www.ozonehouse.com/john/
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/03/11
+ *
+ * CFDG language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2006/03/11 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2006/03/11)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'CFDG',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'include', 'startshape', 'rule', 'background'
+ ),
+ 2 => array(
+ 'SQUARE', 'CIRCLE', 'TRIANGLE',
+ ),
+ 3 => array(
+ 'b','brightness','h','hue','sat','saturation',
+ 'a','alpha','x','y','z','s','size',
+ 'r','rotate','f','flip','skew','xml_set_object'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '[', ']', '{', '}', '*', '|'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #717100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #006666;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cfm.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cfm.php
new file mode 100644
index 00000000..2d165bd6
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cfm.php
@@ -0,0 +1,299 @@
+<?php
+/*************************************************************************************
+ * cfm.php
+ * -------
+ * Author: Diego
+ * Copyright: (c) 2006 Diego
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/02/25
+ *
+ * ColdFusion language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2006/02/25 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2006/02/25)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ColdFusion',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ /* CFM Tags */
+ 1 => array(
+ 'cfabort', 'cfapplet', 'cfapplication', 'cfargument', 'cfassociate',
+ 'cfbreak', 'cfcache', 'cfcase', 'cfcatch', 'cfchart', 'cfchartdata',
+ 'cfchartseries', 'cfcol', 'cfcollection', 'cfcomponent',
+ 'cfcontent', 'cfcookie', 'cfdefaultcase', 'cfdirectory',
+ 'cfdocument', 'cfdocumentitem', 'cfdocumentsection', 'cfdump',
+ 'cfelse', 'cfelseif', 'cferror', 'cfexecute', 'cfexit', 'cffile',
+ 'cfflush', 'cfform', 'cfformgroup', 'cfformitem', 'cfftp',
+ 'cffunction', 'cfgrid', 'cfgridcolumn', 'cfgridrow', 'cfgridupdate',
+ 'cfheader', 'cfhtmlhead', 'cfhttp', 'cfhttpparam', 'cfif',
+ 'cfimport', 'cfinclude', 'cfindex', 'cfinput', 'cfinsert',
+ 'cfinvoke', 'cfinvokeargument', 'cfldap', 'cflocation', 'cflock',
+ 'cflog', 'cflogin', 'cfloginuser', 'cflogout', 'cfloop', 'cfmail',
+ 'cfmailparam', 'cfmailpart', 'cfmodule', 'cfNTauthenticate',
+ 'cfobject', 'cfobjectcache', 'cfoutput', 'cfparam', 'cfpop',
+ 'cfprocessingdirective', 'cfprocparam',
+ 'cfprocresult', 'cfproperty', 'cfquery', 'cfqueryparam',
+ 'cfregistry', 'cfreport', 'cfreportparam', 'cfrethrow', 'cfreturn',
+ 'cfsavecontent', 'cfschedule', 'cfscript', 'cfsearch', 'cfselect',
+ 'cfset', 'cfsetting', 'cfsilent', 'cfstoredproc',
+ 'cfswitch', 'cftable', 'cftextarea', 'cfthrow', 'cftimer',
+ 'cftrace', 'cftransaction', 'cftree', 'cftreeitem', 'cftry',
+ 'cfupdate', 'cfwddx'
+ ),
+ /* HTML Tags */
+ 2 => array(
+ 'a', 'abbr', 'acronym', 'address', 'applet',
+
+ 'base', 'basefont', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'b',
+
+ 'caption', 'center', 'cite', 'code', 'colgroup', 'col',
+
+ 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt',
+
+ 'em',
+
+ 'fieldset', 'font', 'form', 'frame', 'frameset',
+
+ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html',
+
+ 'iframe', 'ilayer', 'img', 'input', 'ins', 'isindex', 'i',
+
+ 'kbd',
+
+ 'label', 'legend', 'link', 'li',
+
+ 'map', 'meta',
+
+ 'noframes', 'noscript',
+
+ 'object', 'ol', 'optgroup', 'option',
+
+ 'param', 'pre', 'p',
+
+ 'q',
+
+ 'samp', 'script', 'select', 'small', 'span', 'strike', 'strong', 'style', 'sub', 'sup', 's',
+
+ 'table', 'tbody', 'td', 'textarea', 'text', 'tfoot', 'thead', 'th', 'title', 'tr', 'tt',
+
+ 'ul', 'u',
+
+ 'var',
+ ),
+ /* HTML attributes */
+ 3 => array(
+ 'abbr', 'accept-charset', 'accept', 'accesskey', 'action', 'align', 'alink', 'alt', 'archive', 'axis',
+ 'background', 'bgcolor', 'border',
+ 'cellpadding', 'cellspacing', 'char', 'charoff', 'charset', 'checked', 'cite', 'class', 'classid', 'clear', 'code', 'codebase', 'codetype', 'color', 'cols', 'colspan', 'compact', 'content', 'coords',
+ 'data', 'datetime', 'declare', 'defer', 'dir', 'disabled',
+ 'enctype',
+ 'face', 'for', 'frame', 'frameborder',
+ 'headers', 'height', 'href', 'hreflang', 'hspace', 'http-equiv',
+ 'id', 'ismap',
+ 'label', 'lang', 'language', 'link', 'longdesc',
+ 'marginheight', 'marginwidth', 'maxlength', 'media', 'method', 'multiple',
+ 'name', 'nohref', 'noresize', 'noshade', 'nowrap',
+ 'object', 'onblur', 'onchange', 'onclick', 'ondblclick', 'onfocus', 'onkeydown', 'onkeypress', 'onkeyup', 'onload', 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onreset', 'onselect', 'onsubmit', 'onunload',
+ 'profile', 'prompt',
+ 'readonly', 'rel', 'rev', 'rowspan', 'rows', 'rules',
+ 'scheme', 'scope', 'scrolling', 'selected', 'shape', 'size', 'span', 'src', 'standby', 'start', 'style', 'summary',
+ 'tabindex', 'target', 'text', 'title', 'type',
+ 'usemap',
+ 'valign', 'value', 'valuetype', 'version', 'vlink', 'vspace',
+ 'width'
+ ),
+ /* CFM Script delimeters */
+ 4 => array(
+ 'var', 'function', 'while', 'if','else'
+ ),
+ /* CFM Functions */
+ 5 => array(
+ 'Abs', 'GetFunctionList', 'LSTimeFormat','ACos','GetGatewayHelper','LTrim','AddSOAPRequestHeader','GetHttpRequestData',
+ 'Max','AddSOAPResponseHeader','GetHttpTimeString','Mid','ArrayAppend','GetLocale','Min','ArrayAvg','GetLocaleDisplayName',
+ 'Minute','ArrayClear','GetMetaData','Month','ArrayDeleteAt','GetMetricData','MonthAsString','ArrayInsertAt','GetPageContext',
+ 'Now','ArrayIsEmpty','GetProfileSections','NumberFormat','ArrayLen','GetProfileString','ParagraphFormat','ArrayMax',
+ 'GetLocalHostIP','ParseDateTime','ArrayMin','GetSOAPRequest','Pi','ArrayNew','GetSOAPRequestHeader','PreserveSingleQuotes',
+ 'ArrayPrepend','GetSOAPResponse','Quarter','ArrayResize','GetSOAPResponseHeader','QueryAddColumn','ArraySet',
+ 'GetTempDirectory','QueryAddRow','ArraySort','QueryNew','ArraySum','GetTempFile','QuerySetCell',
+ 'ArraySwap','GetTickCount','QuotedValueList','ArrayToList','GetTimeZoneInfo','Rand','Asc','GetToken','Randomize',
+ 'ASin','Hash','RandRange','Atn','Hour','REFind','BinaryDecode','HTMLCodeFormat','REFindNoCase','BinaryEncode',
+ 'HTMLEditFormat','ReleaseComObject','BitAnd','IIf','RemoveChars','BitMaskClear','IncrementValue','RepeatString',
+ 'BitMaskRead','InputBaseN','Replace','BitMaskSet','Insert','ReplaceList','BitNot','Int','ReplaceNoCase','BitOr',
+ 'IsArray','REReplace','BitSHLN','IsBinary','REReplaceNoCase','BitSHRN','IsBoolean','Reverse','BitXor','IsCustomFunction',
+ 'Right','Ceiling','IsDate','RJustify','CharsetDecode','IsDebugMode','Round','CharsetEncode','IsDefined','RTrim',
+ 'Chr','IsLeapYear','Second','CJustify','IsLocalHost','SendGatewayMessage','Compare','IsNumeric','SetEncoding',
+ 'CompareNoCase','IsNumericDate','SetLocale','Cos','IsObject','SetProfileString','CreateDate','IsQuery','SetVariable',
+ 'CreateDateTime','IsSimpleValue','Sgn','CreateObject','IsSOAPRequest','Sin','CreateODBCDate','IsStruct','SpanExcluding',
+ 'CreateODBCDateTime','IsUserInRole','SpanIncluding','CreateODBCTime','IsValid','Sqr','CreateTime','IsWDDX','StripCR',
+ 'CreateTimeSpan','IsXML','StructAppend','CreateUUID','IsXmlAttribute','StructClear','DateAdd','IsXmlDoc','StructCopy',
+ 'DateCompare','IsXmlElem','StructCount','DateConvert','IsXmlNode','StructDelete','DateDiff','IsXmlRoot','StructFind',
+ 'DateFormat','JavaCast','StructFindKey','DatePart','JSStringFormat','StructFindValue','Day','LCase','StructGet',
+ 'DayOfWeek','Left','StructInsert','DayOfWeekAsString','Len','StructIsEmpty','DayOfYear','ListAppend','StructKeyArray',
+ 'DaysInMonth','ListChangeDelims','StructKeyExists','DaysInYear','ListContains','StructKeyList','DE','ListContainsNoCase',
+ 'StructNew','DecimalFormat','ListDeleteAt','StructSort','DecrementValue','ListFind','StructUpdate','Decrypt','ListFindNoCase',
+ 'Tan','DecryptBinary','ListFirst','TimeFormat','DeleteClientVariable','ListGetAt','ToBase64','DirectoryExists',
+ 'ListInsertAt','ToBinary','DollarFormat','ListLast','ToScript','Duplicate','ListLen','ToString','Encrypt','ListPrepend',
+ 'Trim','EncryptBinary','ListQualify','UCase','Evaluate','ListRest','URLDecode','Exp','ListSetAt','URLEncodedFormat',
+ 'ExpandPath','ListSort','URLSessionFormat','FileExists','ListToArray','Val','Find','ListValueCount','ValueList',
+ 'FindNoCase','ListValueCountNoCase','Week','FindOneOf','LJustify','Wrap','FirstDayOfMonth','Log','WriteOutput',
+ 'Fix','Log10','XmlChildPos','FormatBaseN','LSCurrencyFormat','XmlElemNew','GetAuthUser','LSDateFormat','XmlFormat',
+ 'GetBaseTagData','LSEuroCurrencyFormat','XmlGetNodeType','GetBaseTagList','LSIsCurrency','XmlNew','GetBaseTemplatePath',
+ 'LSIsDate','XmlParse','GetClientVariablesList','LSIsNumeric','XmlSearch','GetCurrentTemplatePath','LSNumberFormat',
+ 'XmlTransform','GetDirectoryFromPath','LSParseCurrency','XmlValidate','GetEncoding','LSParseDateTime','Year',
+ 'GetException','LSParseEuroCurrency','YesNoFormat','GetFileFromPath','LSParseNumber'
+ ),
+ /* CFM Attributes */
+ 6 => array(
+ 'dbtype','connectstring','datasource','username','password','query','delimeter','description','required','hint','default','access','from','to','list','index'
+ ),
+ 7 => array(
+ 'EQ', 'GT', 'LT', 'GTE', 'LTE', 'IS', 'LIKE', 'NEQ'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '/', '=', '{', '}', '(', ')', '[', ']', '<', '>', '&'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #990000; font-weight: bold;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #0000FF;',
+ 4 => 'color: #000000; font-weight: bold;',
+ 5 => 'color: #0000FF;',
+ 6 => 'color: #0000FF;',
+ 7 => 'color: #0000FF;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #0000FF;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #0000FF;'
+ ),
+ 'SCRIPT' => array(
+ 0 => 'color: #808080; font-style: italic;',
+ 1 => 'color: #00bbdd;',
+ 2 => 'color: #0000FF;',
+ 3 => 'color: #000099;',
+ 4 => 'color: #333333;',
+ 5 => 'color: #333333;'
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => 'http://december.com/html/4/element/{FNAMEL}.html',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_ALWAYS,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<!--' => '-->'
+ ),
+ 1 => array(
+ '<!DOCTYPE' => '>'
+ ),
+ 2 => "/(?!<#)(?:(?:##)*)(#)[a-zA-Z0-9_\.\(\)]+(#)/",
+ 3 => array(
+ '<cfscript>' => '</cfscript>'
+ ),
+ 4 => array(
+ '<' => '>'
+ ),
+ 5 => '/((?!<!)<)(?:"[^"]*"|\'[^\']*\'|(?R)|[^">])+?(>)/si'
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => false,
+ 1 => false,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'DISALLOWED_BEFORE' => '(?<=&lt;|&lt;\/)',
+ 'DISALLOWED_AFTER' => '(?=\s|\/|&gt;)',
+ ),
+ 2 => array(
+ 'DISALLOWED_BEFORE' => '(?<=&lt;|&lt;\/)',
+ 'DISALLOWED_AFTER' => '(?=\s|\/|&gt;)',
+ ),
+ 3 => array(
+ 'DISALLOWED_BEFORE' => '(?<![a-zA-Z0-9\$_\|\#>|^])', // allow ; before keywords
+ 'DISALLOWED_AFTER' => '(?![a-zA-Z0-9_\|%\\-])', // allow & after keywords
+ ),
+ 7 => array(
+ 'DISALLOWED_BEFORE' => '(?<![a-zA-Z0-9\$_\|\#>&|^])', // allow ; before keywords
+ 'DISALLOWED_AFTER' => '(?![a-zA-Z0-9_\|%\\-])', // allow & after keywords
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/chaiscript.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/chaiscript.php
new file mode 100644
index 00000000..f9d0a868
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/chaiscript.php
@@ -0,0 +1,140 @@
+<?php
+/*************************************************************************************
+ * chaiscript.php
+ * --------------
+ * Author: Jason Turner & Jonathan Turner
+ * Copyright: (c) 2010 Jason Turner (lefticus@gmail.com),
+ * (c) 2009 Jonathan Turner,
+ * (c) 2004 Ben Keen (ben.keen@gmail.com), Benny Baumann (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/07/03
+ *
+ * ChaiScript language file for GeSHi.
+ *
+ * Based on JavaScript by Ben Keen (ben.keen@gmail.com)
+ *
+ * CHANGES
+ * -------
+ * 2010/03/30 (1.0.8.8)
+ * - Updated to include more language features
+ * - Removed left over pieces from JavaScript
+ * 2009/07/03 (1.0.0)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ChaiScript',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ //Regular Expressions
+ 'COMMENT_REGEXP' => array(2 => "/(?<=[\\s^])s\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/[gimsu]*(?=[\\s$\\.\\;])|(?<=[\\s^(=])m?\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/[gimsu]*(?=[\\s$\\.\\,\\;\\)])/iU"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'break', 'else', 'elseif', 'eval', 'for', 'if', 'return', 'while', 'try', 'catch', 'finally',
+ ),
+ 2 => array(
+ 'def', 'false', 'fun', 'true', 'var', 'attr',
+ ),
+ 3 => array(
+ // built in functions
+ 'throw',
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}',
+ '+', '-', '*', '/', '%',
+ '!', '@', '&', '|', '^',
+ '<', '>', '=',
+ ',', ';', '?', ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000066; font-weight: bold;',
+ 2 => 'color: #003366; font-weight: bold;',
+ 3 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #006600; font-style: italic;',
+ 2 => 'color: #009966; font-style: italic;',
+ 'MULTI' => 'color: #006600; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #3366CC;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #CC0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #660066;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ ),
+ 1 => array(
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cil.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cil.php
new file mode 100644
index 00000000..9872e755
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cil.php
@@ -0,0 +1,196 @@
+<?php
+/*************************************************************************************
+ * cil.php
+ * --------
+ * Author: Marcus Griep (neoeinstein+GeSHi@gmail.com)
+ * Copyright: (c) 2007 Marcus Griep (http://www.xpdm.us)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/10/24
+ *
+ * CIL (Common Intermediate Language) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2004/10/24 (1.0.8)
+ * - First Release
+ *
+ * TODO (updated 2007/10/24)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'CIL',
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'COMMENT_SINGLE' => array('//'),
+ 'COMMENT_MULTI' => array(),
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(//Dotted
+ '.zeroinit', '.vtfixup', '.vtentry', '.vtable', '.ver', '.try', '.subsystem', '.size', '.set', '.removeon',
+ '.publickeytoken', '.publickey', '.property', '.permissionset', '.permission', '.pdirect', '.param', '.pack',
+ '.override', '.other', '.namespace', '.mresource', '.module', '.method', '.maxstack', '.manifestres', '.locals',
+ '.localized', '.locale', '.line', '.language', '.import', '.imagebase', '.hash', '.get', '.fire', '.file', '.field',
+ '.export', '.event', '.entrypoint', '.emitbyte', '.data', '.custom', '.culture', '.ctor', '.corflags', '.class',
+ '.cctor', '.assembly', '.addon'
+ ),
+ 2 => array(//Attributes
+ 'wrapper', 'with', 'winapi', 'virtual', 'vector', 'vararg', 'value', 'userdefined', 'unused', 'unmanagedexp',
+ 'unmanaged', 'unicode', 'to', 'tls', 'thiscall', 'synchronized', 'struct', 'strict', 'storage', 'stdcall',
+ 'static', 'specialname', 'special', 'serializable', 'sequential', 'sealed', 'runtime', 'rtspecialname', 'request',
+ 'reqsecobj', 'reqrefuse', 'reqopt', 'reqmin', 'record', 'public', 'privatescope', 'private', 'preservesig',
+ 'prejitgrant', 'prejitdeny', 'platformapi', 'pinvokeimpl', 'pinned', 'permitonly', 'out', 'optil', 'opt',
+ 'notserialized', 'notremotable', 'not_in_gc_heap', 'noprocess', 'noncaslinkdemand', 'noncasinheritance',
+ 'noncasdemand', 'nometadata', 'nomangle', 'nomachine', 'noinlining', 'noappdomain', 'newslot', 'nested', 'native',
+ 'modreq', 'modopt', 'marshal', 'managed', 'literal', 'linkcheck', 'lcid', 'lasterr', 'internalcall', 'interface',
+ 'instance', 'initonly', 'init', 'inheritcheck', 'in', 'import', 'implicitres', 'implicitcom', 'implements',
+ 'illegal', 'il', 'hidebysig', 'handler', 'fromunmanaged', 'forwardref', 'fixed', 'finally', 'final', 'filter',
+ 'filetime', 'field', 'fault', 'fastcall', 'famorassem', 'family', 'famandassem', 'extern', 'extends', 'explicit',
+ 'error', 'enum', 'endmac', 'deny', 'demand', 'default', 'custom', 'compilercontrolled', 'clsid', 'class', 'cil',
+ 'cf', 'cdecl', 'catch', 'beforefieldinit', 'autochar', 'auto', 'at', 'assert', 'assembly', 'as', 'any', 'ansi',
+ 'alignment', 'algorithm', 'abstract'
+ ),
+ 3 => array(//Types
+ 'wchar', 'void', 'variant', 'unsigned', 'valuetype', 'typedref', 'tbstr', 'sysstring', 'syschar', 'string',
+ 'streamed_object', 'stream', 'stored_object', 'safearray', 'objectref', 'object', 'nullref', 'method', 'lpwstr',
+ 'lpvoid', 'lptstr', 'lpstruct', 'lpstr', 'iunknown', 'int64', 'int32', 'int16', 'int8', 'int', 'idispatch',
+ 'hresult', 'float64', 'float32', 'float', 'decimal', 'date', 'currency', 'char', 'carray', 'byvalstr',
+ 'bytearray', 'boxed', 'bool', 'blob_object', 'blob', 'array'
+ ),
+ 4 => array(//Prefix
+ 'volatile', 'unaligned', 'tail', 'readonly', 'no', 'constrained'
+ ),
+ 5 => array(//Suffix
+ 'un', 'u8', 'u4', 'u2', 'u1', 'u', 's', 'ref', 'r8', 'r4', 'm1', 'i8', 'i4', 'i2', 'i1', 'i'#, '.8', '.7', '.6', '.5', '.4', '.3', '.2', '.1', '.0'
+ ),
+ 6 => array(//Base
+ 'xor', 'switch', 'sub', 'stloc',
+ 'stind', 'starg',
+ 'shr', 'shl', 'ret', 'rem', 'pop', 'or', 'not', 'nop', 'neg', 'mul',
+ 'localloc', 'leave', 'ldnull', 'ldloca',
+ 'ldloc', 'ldind', 'ldftn', 'ldc', 'ldarga',
+ 'ldarg', 'jmp', 'initblk', 'endfinally', 'endfilter',
+ 'endfault', 'dup', 'div', 'cpblk', 'conv', 'clt', 'ckfinite', 'cgt', 'ceq', 'calli',
+ 'call', 'brzero', 'brtrue', 'brnull', 'brinst',
+ 'brfalse', 'break', 'br', 'bne', 'blt', 'ble', 'bgt', 'bge', 'beq', 'arglist',
+ 'and', 'add'
+ ),
+ 7 => array(//Object
+ 'unbox.any', 'unbox', 'throw', 'stsfld', 'stobj', 'stfld', 'stelem', 'sizeof', 'rethrow', 'refanyval', 'refanytype', 'newobj',
+ 'newarr', 'mkrefany', 'ldvirtftn', 'ldtoken', 'ldstr', 'ldsflda', 'ldsfld', 'ldobj', 'ldlen', 'ldflda', 'ldfld',
+ 'ldelema', 'ldelem', 'isinst', 'initobj', 'cpobj', 'castclass',
+ 'callvirt', 'callmostderived', 'box'
+ ),
+ 8 => array(//Other
+ 'prefixref', 'prefix7', 'prefix6', 'prefix5', 'prefix4', 'prefix3', 'prefix2', 'prefix1', 'prefix0'
+ ),
+ 9 => array(//Literal
+ 'true', 'null', 'false'
+ ),
+ 10 => array(//Comment-like
+ '#line', '^THE_END^'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '!', '!!'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ 9 => true,
+ 10 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color:maroon;font-weight:bold;',
+ 2 => 'color:blue;font-weight:bold;',
+ 3 => 'color:purple;font-weight:bold;',
+ 4 => 'color:teal;',
+ 5 => 'color:blue;',
+ 6 => 'color:blue;',
+ 7 => 'color:blue;',
+ 8 => 'color:blue;',
+ 9 => 'color:00008B',
+ 10 => 'color:gray'
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color:gray;font-style:italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #008000; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #006400;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #00008B;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #000033;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #006400;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color:blue;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+ 9 => '',
+ 10 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '::'
+ ),
+ 'REGEXPS' => array(
+ 0 => '(?<=ldc\\.i4\\.)[0-8]|(?<=(?:ldarg|ldloc|stloc)\\.)[0-3]' # Pickup the opcodes that end with integers
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/clojure.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/clojure.php
new file mode 100644
index 00000000..0ad4e4ad
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/clojure.php
@@ -0,0 +1,134 @@
+<?php
+/*************************************************************************************
+ * clojure.php
+ * --------
+ * Author: Jess Johnson (jess@grok-code.com)
+ * Copyright: (c) 2009 Jess Johnson (http://grok-code.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/09/20
+ *
+ * Clojure language file for GeSHi.
+ *
+ * This file borrows significantly from the lisp language file for GeSHi
+ *
+ * CHANGES
+ * -------
+ * 2009/09/20 (1.0.8.6)
+ * - First Release
+ *
+ * TODO (updated 2009/09/20)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Clojure',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(';|' => '|;'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'defn', 'defn-', 'defmulti', 'defmethod', 'defmacro', 'deftest',
+ 'defstruct', 'def', 'defonce', 'let', 'letfn', 'do', 'cond', 'condp',
+ 'for', 'loop', 'recur', 'when', 'when-not', 'when-let', 'when-first',
+ 'if', 'if-let', 'if-not', 'doto', 'and', 'or','not','aget','aset',
+ 'dosync', 'doseq', 'dotimes', 'dorun', 'doall',
+ 'load', 'import', 'unimport', 'ns', 'in-ns', 'refer', 'print',
+ 'try', 'catch', 'finally', 'throw', 'fn', 'update-in',
+ 'with-open', 'with-local-vars', 'binding',
+ 'gen-class', 'gen-and-load-class', 'gen-and-save-class',
+ 'implement', 'proxy', 'lazy-cons', 'with-meta',
+ 'struct', 'struct-map', 'delay', 'locking', 'sync', 'time', 'apply',
+ 'remove', 'merge', 'interleave', 'interpose', 'distinct',
+ 'cons', 'concat', 'lazy-cat', 'cycle', 'rest', 'frest', 'drop',
+ 'drop-while', 'nthrest', 'take', 'take-while', 'take-nth', 'butlast',
+ 'reverse', 'sort', 'sort-by', 'split-at', 'partition', 'split-with',
+ 'first', 'ffirst', 'rfirst', 'zipmap', 'into', 'set', 'vec',
+ 'to-array-2d', 'not-empty', 'seq?', 'not-every?', 'every?', 'not-any?',
+ 'map', 'mapcat', 'vector?', 'list?', 'hash-map', 'reduce', 'filter',
+ 'vals', 'keys', 'rseq', 'subseq', 'rsubseq', 'count', 'empty?',
+ 'fnseq', 'repeatedly', 'iterate', 'drop-last',
+ 'repeat', 'replicate', 'range', 'into-array',
+ 'line-seq', 'resultset-seq', 're-seq', 're-find', 'tree-seq', 'file-seq',
+ 'iterator-seq', 'enumeration-seq', 'declare', 'xml-seq',
+ 'symbol?', 'string?', 'vector', 'conj', 'str',
+ 'pos?', 'neg?', 'zero?', 'nil?', 'inc', 'dec', 'format',
+ 'alter', 'commute', 'ref-set', 'floor', 'assoc', 'send', 'send-off'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '!', '%', '^', '&', '/','+','-','*','=','<','>',';','|', '.', '..', '->',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #555;',
+ 1 => 'color: #555;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ '::', ':'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cmake.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cmake.php
new file mode 100644
index 00000000..67277aa9
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cmake.php
@@ -0,0 +1,181 @@
+<?php
+/*************************************************************************************
+ * cmake.php
+ * -------
+ * Author: Daniel Nelson (danieln@eng.utah.edu)
+ * Copyright: (c) 2009 Daniel Nelson
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/04/06
+ *
+ * CMake language file for GeSHi.
+ *
+ * Keyword list generated using CMake 2.6.3.
+ *
+ * CHANGES
+ * -------
+ * <date-of-release> (<GeSHi release>)
+ * - First Release
+ *
+ * TODO (updated <date-of-release>)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'CMake',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'ESCAPE_REGEXP' => array(
+ // Quoted variables ${...}
+ 1 => "/\\$(ENV)?\\{[^\\n\\}]*?\\}/i",
+ // Quoted registry keys [...]
+ 2 => "/\\[HKEY[^\n\\]]*?]/i"
+ ),
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'add_custom_command', 'add_custom_target', 'add_definitions',
+ 'add_dependencies', 'add_executable', 'add_library',
+ 'add_subdirectory', 'add_test', 'aux_source_directory', 'break',
+ 'build_command', 'cmake_minimum_required', 'cmake_policy',
+ 'configure_file', 'create_test_sourcelist', 'define_property',
+ 'else', 'elseif', 'enable_language', 'enable_testing',
+ 'endforeach', 'endfunction', 'endif', 'endmacro',
+ 'endwhile', 'execute_process', 'export', 'file', 'find_file',
+ 'find_library', 'find_package', 'find_path', 'find_program',
+ 'fltk_wrap_ui', 'foreach', 'function', 'get_cmake_property',
+ 'get_directory_property', 'get_filename_component', 'get_property',
+ 'get_source_file_property', 'get_target_property',
+ 'get_test_property', 'if', 'include', 'include_directories',
+ 'include_external_msproject', 'include_regular_expression',
+ 'install', 'link_directories', 'list', 'load_cache',
+ 'load_command', 'macro', 'mark_as_advanced', 'math', 'message',
+ 'option', 'output_required_files', 'project', 'qt_wrap_cpp',
+ 'qt_wrap_ui', 'remove_definitions', 'return', 'separate_arguments',
+ 'set', 'set_directory_properties', 'set_property',
+ 'set_source_files_properties', 'set_target_properties',
+ 'set_tests_properties', 'site_name', 'source_group', 'string',
+ 'target_link_libraries', 'try_compile', 'try_run', 'unset',
+ 'variable_watch', 'while'
+ ),
+ 2 => array(
+ // Deprecated commands
+ 'build_name', 'exec_program', 'export_library_dependencies',
+ 'install_files', 'install_programs', 'install_targets',
+ 'link_libraries', 'make_directory', 'remove', 'subdir_depends',
+ 'subdirs', 'use_mangled_mesa', 'utility_source',
+ 'variable_requires', 'write_file'
+ ),
+ 3 => array(
+ // Special command arguments, this list is not comprehesive.
+ 'AND', 'APPEND', 'ASCII', 'BOOL', 'CACHE', 'COMMAND', 'COMMENT',
+ 'COMPARE', 'CONFIGURE', 'DEFINED', 'DEPENDS', 'DIRECTORY',
+ 'EQUAL', 'EXCLUDE_FROM_ALL', 'EXISTS', 'FALSE', 'FATAL_ERROR',
+ 'FILEPATH', 'FIND', 'FORCE', 'GET', 'GLOBAL', 'GREATER',
+ 'IMPLICIT_DEPENDS', 'INSERT', 'INTERNAL', 'IS_ABSOLUTE',
+ 'IS_DIRECTORY', 'IS_NEWER_THAN', 'LENGTH', 'LESS',
+ 'MAIN_DEPENDENCY', 'MATCH', 'MATCHALL', 'MATCHES', 'MODULE', 'NOT',
+ 'NOTFOUND', 'OFF', 'ON', 'OR', 'OUTPUT', 'PARENT_SCOPE', 'PATH',
+ 'POLICY', 'POST_BUILD', 'PRE_BUILD', 'PRE_LINK', 'PROPERTY',
+ 'RANDOM', 'REGEX', 'REMOVE_AT', 'REMOVE_DUPLICATES', 'REMOVE_ITEM',
+ 'REPLACE', 'REVERSE', 'SEND_ERROR', 'SHARED', 'SORT', 'SOURCE',
+ 'STATIC', 'STATUS', 'STREQUAL', 'STRGREATER', 'STRING', 'STRIP',
+ 'STRLESS', 'SUBSTRING', 'TARGET', 'TEST', 'TOLOWER', 'TOUPPER',
+ 'TRUE', 'VERBATIM', 'VERSION', 'VERSION_EQUAL', 'VERSION_GREATOR',
+ 'VERSION_LESS', 'WORKING_DIRECTORY',
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => true
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')')
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #1f3f81; font-style: bold;',
+ 2 => 'color: #1f3f81;',
+ 3 => 'color: #077807; font-sytle: italic;'
+ ),
+ 'BRACKETS' => array(),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #b08000;',
+ 2 => 'color: #0000cd;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #912f11;',
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #197d8b;'
+ ),
+ 'NUMBERS' => array(),
+ 'METHODS' => array(),
+ 'REGEXPS' => array(
+ 0 => 'color: #b08000;',
+ 1 => 'color: #0000cd;'
+ ),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => 'http://www.cmake.org/cmake/help/cmake2.6docs.html#command:{FNAMEL}',
+ 2 => 'http://www.cmake.org/cmake/help/cmake2.6docs.html#command:{FNAMEL}',
+ 3 => '',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(
+ // Unquoted variables
+ 0 => "\\$(ENV)?\\{[^\\n}]*?\\}",
+ // Unquoted registry keys
+ 1 => "\\[HKEY[^\n\\]]*?]"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ // These keywords cannot come after a open paren
+ 1 => array(
+ 'DISALLOWED_AFTER' => '(?= *\()'
+ ),
+ 2 => array(
+ 'DISALLOWED_AFTER' => '(?= *\()'
+ )
+ ),
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER,
+ 'METHODS' => GESHI_NEVER,
+ 'NUMBERS' => GESHI_NEVER
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cobol.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cobol.php
new file mode 100644
index 00000000..b07be48a
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cobol.php
@@ -0,0 +1,244 @@
+<?php
+/*************************************************************************************
+ * cobol.php
+ * ----------
+ * Author: BenBE (BenBE@omorphia.org)
+ * Copyright: (c) 2007-2008 BenBE (http://www.omorphia.de/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/07/02
+ *
+ * COBOL language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ *
+ * TODO (updated 2007/07/02)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'COBOL',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(1 => '/^\*.*?$/m'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', "'"),
+ 'ESCAPE_CHAR' => '\\',
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_SCI_SHORT |
+ GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array( //Compiler Directives
+ 'ANSI', 'BLANK', 'NOBLANK', 'CALL-SHARED', 'CANCEL', 'NOCANCEL',
+ 'CHECK', 'CODE', 'NOCODE', 'COLUMNS', 'COMPACT', 'NOCOMPACT',
+ 'COMPILE', 'CONSULT', 'NOCONSULT', 'CROSSREF', 'NOCROSSREF',
+ 'DIAGNOSE-74', 'NODIAGNOSE-74', 'DIAGNOSE-85', 'NODIAGNOSE-85',
+ 'DIAGNOSEALL', 'NODIAGNOSEALL', 'ENDIF', 'ENDUNIT', 'ENV',
+ 'ERRORFILE', 'ERRORS', 'FIPS', 'NOFIPS', 'FMAP', 'HEADING', 'HEAP',
+ 'HIGHPIN', 'HIGHREQUESTERS', 'ICODE', 'NOICODE', 'IF', 'IFNOT',
+ 'INNERLIST', 'NOINNERLIST', 'INSPECT', 'NOINSPECT', 'LARGEDATA',
+ 'LD', 'LESS-CODE', 'LIBRARY', 'LINES', 'LIST', 'NOLIST', 'LMAP',
+ 'NOLMAP', 'MAIN', 'MAP', 'NOMAP', 'NLD', 'NONSTOP', 'NON-SHARED',
+ 'OPTIMIZE', 'PERFORM-TRACE', 'PORT', 'NOPORT', 'RESETTOG',
+ 'RUNNABLE', 'RUNNAMED', 'SAVE', 'SAVEABEND', 'NOSAVEABEND',
+ 'SEARCH', 'NOSEARCH', 'SECTION', 'SETTOG', 'SHARED', 'SHOWCOPY',
+ 'NOSHOWCOPY', 'SHOWFILE', 'NOSHOWFILE', 'SOURCE', 'SQL', 'NOSQL',
+ 'SQLMEM', 'SUBSET', 'SUBTYPE', 'SUPPRESS', 'NOSUPPRESS', 'SYMBOLS',
+ 'NOSYMBOLS', 'SYNTAX', 'TANDEM', 'TRAP2', 'NOTRAP2', 'TRAP2-74',
+ 'NOTRAP2-74', 'UL', 'WARN', 'NOWARN'
+ ),
+ 2 => array( //Statement Keywords
+ 'ACCEPT', 'ADD', 'TO', 'GIVING', 'CORRESPONDING', 'ALTER', 'CALL',
+ 'CHECKPOINT', 'CLOSE', 'COMPUTE', 'CONTINUE', 'COPY',
+ 'DELETE', 'DISPLAY', 'DIVIDE', 'INTO', 'REMAINDER', 'ENTER',
+ 'COBOL', 'EVALUATE', 'EXIT', 'GO', 'INITIALIZE',
+ 'TALLYING', 'REPLACING', 'CONVERTING', 'LOCKFILE', 'MERGE', 'MOVE',
+ 'MULTIPLY', 'OPEN', 'PERFORM', 'TIMES',
+ 'UNTIL', 'VARYING', 'RETURN',
+ ),
+ 3 => array( //Reserved in some contexts
+ 'ACCESS', 'ADDRESS', 'ADVANCING', 'AFTER', 'ALL',
+ 'ALPHABET', 'ALPHABETIC', 'ALPHABETIC-LOWER', 'ALPHABETIC-UPPER',
+ 'ALPHANUMERIC', 'ALPHANUMERIC-EDITED', 'ALSO', 'ALTERNATE',
+ 'AND', 'ANY', 'APPROXIMATE', 'AREA', 'AREAS', 'ASCENDING', 'ASSIGN',
+ 'AT', 'AUTHOR', 'BEFORE', 'BINARY', 'BLOCK', 'BOTTOM', 'BY',
+ 'CD', 'CF', 'CH', 'CHARACTER', 'CHARACTERS',
+ 'CHARACTER-SET', 'CLASS', 'CLOCK-UNITS',
+ 'CODE-SET', 'COLLATING', 'COLUMN', 'COMMA',
+ 'COMMON', 'COMMUNICATION', 'COMP', 'COMP-3', 'COMP-5',
+ 'COMPUTATIONAL', 'COMPUTATIONAL-3', 'COMPUTATIONAL-5',
+ 'CONFIGURATION', 'CONTAINS', 'CONTENT', 'CONTROL',
+ 'CONTROLS', 'CORR', 'COUNT',
+ 'CURRENCY', 'DATA', 'DATE', 'DATE-COMPILED', 'DATE-WRITTEN', 'DAY',
+ 'DAY-OF-WEEK', 'DE', 'DEBUG-CONTENTS', 'DEBUG-ITEM', 'DEBUG-LINE',
+ 'DEBUG-SUB-2', 'DEBUG-SUB-3', 'DEBUGGING', 'DECIMAL-POINT',
+ 'DECLARATIVES', 'DEBUG-NAME', 'DEBUG-SUB-1', 'DELIMITED',
+ 'DELIMITER', 'DEPENDING', 'DESCENDING', 'DESTINATION', 'DETAIL',
+ 'DISABLE', 'DIVISION', 'DOWN', 'DUPLICATES',
+ 'DYNAMIC', 'EGI', 'ELSE', 'EMI', 'ENABLE', 'END', 'END-ADD',
+ 'END-COMPUTE', 'END-DELETE', 'END-DIVIDE', 'END-EVALUATE', 'END-IF',
+ 'END-MULTIPLY', 'END-OF-PAGE', 'END-PERFORM', 'END-READ',
+ 'END-RECEIVE', 'END-RETURN', 'END-REWRITE', 'END-SEARCH',
+ 'END-START', 'END-STRING', 'END-SUBTRACT', 'END-UNSTRING',
+ 'END-WRITE', 'EOP', 'EQUAL', 'ERROR', 'ESI',
+ 'EVERY', 'EXCEPTION', 'EXCLUSIVE', 'EXTEND',
+ 'EXTENDED-STORAGE', 'EXTERNAL', 'FALSE', 'FD', 'FILE',
+ 'FILE-CONTROL', 'FILLER', 'FINAL', 'FIRST', 'FOOTING', 'FOR',
+ 'FROM', 'FUNCTION', 'GENERATE', 'GENERIC', 'GLOBAL',
+ 'GREATER', 'GROUP', 'GUARDIAN-ERR', 'HIGH-VALUE',
+ 'HIGH-VALUES', 'I-O', 'I-O-CONTROL', 'IDENTIFICATION', 'IN',
+ 'INDEX', 'INDEXED', 'INDICATE', 'INITIAL', 'INITIATE',
+ 'INPUT', 'INPUT-OUTPUT', 'INSTALLATION',
+ 'INVALID', 'IS', 'JUST', 'JUSTIFIED', 'KEY', 'LABEL', 'LAST',
+ 'LEADING', 'LEFT', 'LESS', 'LIMIT', 'LIMITS', 'LINAGE',
+ 'LINAGE-COUNTER', 'LINE', 'LINE-COUNTER', 'LINKAGE', 'LOCK',
+ 'LOW-VALUE', 'LOW-VALUES', 'MEMORY', 'MESSAGE',
+ 'MODE', 'MODULES', 'MULTIPLE', 'NATIVE',
+ 'NEGATIVE', 'NEXT', 'NO', 'NOT', 'NULL', 'NULLS', 'NUMBER',
+ 'NUMERIC', 'NUMERIC-EDITED', 'OBJECT-COMPUTER', 'OCCURS', 'OF',
+ 'OFF', 'OMITTED', 'ON', 'OPTIONAL', 'OR', 'ORDER',
+ 'ORGANIZATION', 'OTHER', 'OUTPUT', 'OVERFLOW', 'PACKED-DECIMAL',
+ 'PADDING', 'PAGE', 'PAGE-COUNTER', 'PF', 'PH', 'PIC',
+ 'PICTURE', 'PLUS', 'POINTER', 'POSITION', 'POSITIVE', 'PRINTING',
+ 'PROCEDURE', 'PROCEDURES', 'PROCEED', 'PROGRAM', 'PROGRAM-ID',
+ 'PROGRAM-STATUS', 'PROGRAM-STATUS-1', 'PROGRAM-STATUS-2', 'PROMPT',
+ 'PROTECTED', 'PURGE', 'QUEUE', 'QUOTE', 'QUOTES', 'RD',
+ 'RECEIVE', 'RECEIVE-CONTROL', 'RECORD', 'RECORDS',
+ 'REDEFINES', 'REEL', 'REFERENCE', 'REFERENCES', 'RELATIVE',
+ 'REMOVAL', 'RENAMES', 'REPLACE',
+ 'REPLY', 'REPORT', 'REPORTING', 'REPORTS', 'RERUN',
+ 'RESERVE', 'RESET', 'REVERSED', 'REWIND', 'REWRITE', 'RF',
+ 'RH', 'RIGHT', 'ROUNDED', 'RUN', 'SAME', 'SD',
+ 'SECURITY', 'SEGMENT', 'SEGMENT-LIMIT', 'SELECT', 'SEND',
+ 'SENTENCE', 'SEPARATE', 'SEQUENCE', 'SEQUENTIAL', 'SET',
+ 'SIGN', 'SIZE', 'SORT', 'SORT-MERGE', 'SOURCE-COMPUTER',
+ 'SPACE', 'SPACES', 'SPECIAL-NAMES', 'STANDARD', 'STANDARD-1',
+ 'STANDARD-2', 'START', 'STARTBACKUP', 'STATUS', 'STOP', 'STRING',
+ 'SUB-QUEUE-1', 'SUB-QUEUE-2', 'SUB-QUEUE-3', 'SUBTRACT',
+ 'SYMBOLIC', 'SYNC', 'SYNCDEPTH', 'SYNCHRONIZED',
+ 'TABLE', 'TAL', 'TAPE', 'TERMINAL', 'TERMINATE', 'TEST',
+ 'TEXT', 'THAN', 'THEN', 'THROUGH', 'THRU', 'TIME',
+ 'TOP', 'TRAILING', 'TRUE', 'TYPE', 'UNIT', 'UNLOCK', 'UNLOCKFILE',
+ 'UNLOCKRECORD', 'UNSTRING', 'UP', 'UPON', 'USAGE', 'USE',
+ 'USING', 'VALUE', 'VALUES', 'WHEN', 'WITH', 'WORDS',
+ 'WORKING-STORAGE', 'WRITE', 'ZERO', 'ZEROES'
+ ),
+ 4 => array( //Standard functions
+ 'ACOS', 'ANNUITY', 'ASIN', 'ATAN', 'CHAR', 'COS', 'CURRENT-DATE',
+ 'DATE-OF-INTEGER', 'DAY-OF-INTEGER', 'FACTORIAL', 'INTEGER',
+ 'INTEGER-OF-DATE', 'INTEGER-OF-DAY', 'INTEGER-PART', 'LENGTH',
+ 'LOG', 'LOG10', 'LOWER-CASE', 'MAX', 'MEAN', 'MEDIAN', 'MIDRANGE',
+ 'MIN', 'MOD', 'NUMVAL', 'NUMVAL-C', 'ORD', 'ORD-MAX', 'ORD-MIN',
+ 'PRESENT-VALUE', 'RANDOM', 'RANGE', 'REM', 'REVERSE', 'SIN', 'SQRT',
+ 'STANDARD-DEVIATION', 'SUM', 'TAN', 'UPPER-CASE', 'VARIANCE',
+ 'WHEN-COMPILED'
+ ),
+ 5 => array( //Privileged Built-in Functions
+ '#IN', '#OUT', '#TERM', '#TEMP', '#DYNAMIC', 'COBOL85^ARMTRAP',
+ 'COBOL85^COMPLETION', 'COBOL_COMPLETION_', 'COBOL_CONTROL_',
+ 'COBOL_GETENV_', 'COBOL_PUTENV_', 'COBOL85^RETURN^SORT^ERRORS',
+ 'COBOL_RETURN_SORT_ERRORS_', 'COBOL85^REWIND^SEQUENTIAL',
+ 'COBOL_REWIND_SEQUENTIAL_', 'COBOL85^SET^SORT^PARAM^TEXT',
+ 'COBOL_SET_SORT_PARAM_TEXT_', 'COBOL85^SET^SORT^PARAM^VALUE',
+ 'COBOL_SET_SORT_PARAM_VALUE_', 'COBOL_SET_MAX_RECORD_',
+ 'COBOL_SETMODE_', 'COBOL85^SPECIAL^OPEN', 'COBOL_SPECIAL_OPEN_',
+ 'COBOLASSIGN', 'COBOL_ASSIGN_', 'COBOLFILEINFO', 'COBOL_FILE_INFO_',
+ 'COBOLSPOOLOPEN', 'CREATEPROCESS', 'ALTERPARAMTEXT',
+ 'CHECKLOGICALNAME', 'CHECKMESSAGE', 'DELETEASSIGN', 'DELETEPARAM',
+ 'DELETESTARTUP', 'GETASSIGNTEXT', 'GETASSIGNVALUE', 'GETBACKUPCPU',
+ 'GETPARAMTEXT', 'GETSTARTUPTEXT', 'PUTASSIGNTEXT', 'PUTASSIGNVALUE',
+ 'PUTPARAMTEXT', 'PUTSTARTUPTEXT'
+ )
+ ),
+ 'SYMBOLS' => array(
+ //Avoid having - in identifiers marked as symbols
+ ' + ', ' - ', ' * ', ' / ', ' ** ',
+ '.', ',',
+ '=',
+ '(', ')', '[', ']'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000080; font-weight: bold;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #008000; font-weight: bold;',
+ 4 => 'color: #000080;',
+ 5 => 'color: #008000;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #a0a0a0; font-style: italic;',
+ 'MULTI' => 'color: #a0a0a0; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #993399;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+ );
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/coffeescript.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/coffeescript.php
new file mode 100644
index 00000000..194aecd0
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/coffeescript.php
@@ -0,0 +1,146 @@
+<?php
+/*************************************************************************************
+ * coffeescript.php
+ * ----------
+ * Author: Trevor Burnham (trevorburnham@gmail.com)
+ * Copyright: (c) 2010 Trevor Burnham (http://iterative.ly)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/06/08
+ *
+ * CoffeeScript language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/06/08 (1.0.8.9)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'CoffeeScript',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array('###' => '###'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ //Longest quotemarks ALWAYS first
+ 'QUOTEMARKS' => array('"""', "'''", '"', "'"),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+
+ /*
+ ** Set 1: control keywords
+ */
+ 1 => array(
+ 'break', 'by', 'catch', 'continue', 'else', 'finally', 'for', 'in', 'of', 'if',
+ 'return', 'switch', 'then', 'throw', 'try', 'unless', 'when', 'while', 'until'
+ ),
+
+ /*
+ ** Set 2: logic keywords
+ */
+ 2 => array(
+ 'and', 'or', 'is', 'isnt', 'not'
+ ),
+
+ /*
+ ** Set 3: other keywords
+ */
+ 3 => array(
+ 'instanceof', 'new', 'delete', 'typeof',
+ 'class', 'super', 'this', 'extends'
+ ),
+
+ /*
+ ** Set 4: constants
+ */
+ 4 => array(
+ 'true', 'false', 'on', 'off', 'yes', 'no',
+ 'Infinity', 'NaN', 'undefined', 'null'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '*', '&', '|', '%', '!', ',', ';', '<', '>', '?', '`',
+ '+', '-', '*', '/', '->', '=>', '<<', '>>', '@', ':', '^'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #ff7700;font-weight:bold;',
+ 2 => 'color: #008000;',
+ 3 => 'color: #dc143c;',
+ 4 => 'color: #0000cd;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: black;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #483d8b;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff4500;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: black;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<script type="text/coffeescript">' => '</script>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cpp-qt.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cpp-qt.php
new file mode 100644
index 00000000..36626c90
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cpp-qt.php
@@ -0,0 +1,564 @@
+<?php
+/*************************************************************************************
+ * cpp.php
+ * -------
+ * Author: Iulian M
+ * Copyright: (c) 2006 Iulian M
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/09/27
+ *
+ * C++ (with Qt extensions) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/06/28 (1.0.8.4)
+ * - Updated list of Keywords from Qt 4.5
+ *
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'C++ (Qt)',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Multiline-continued single-line comments
+ 1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Multiline-continued preprocessor define
+ 2 => '/#(?:\\\\\\\\|\\\\\\n|.)*$/m'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[abfnrtv\\\'\"?\n]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{2}#",
+ //Hexadecimal Char Specs
+ 3 => "#\\\\u[\da-fA-F]{4}#",
+ //Hexadecimal Char Specs
+ 4 => "#\\\\U[\da-fA-F]{8}#",
+ //Octal Char Specs
+ 5 => "#\\\\[0-7]{1,3}#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'case', 'continue', 'default', 'do', 'else', 'for', 'goto', 'if', 'return',
+ 'switch', 'while', 'delete', 'new', 'this'
+ ),
+ 2 => array(
+ 'NULL', 'false', 'break', 'true', 'enum', 'errno', 'EDOM',
+ 'ERANGE', 'FLT_RADIX', 'FLT_ROUNDS', 'FLT_DIG', 'DBL_DIG', 'LDBL_DIG',
+ 'FLT_EPSILON', 'DBL_EPSILON', 'LDBL_EPSILON', 'FLT_MANT_DIG', 'DBL_MANT_DIG',
+ 'LDBL_MANT_DIG', 'FLT_MAX', 'DBL_MAX', 'LDBL_MAX', 'FLT_MAX_EXP', 'DBL_MAX_EXP',
+ 'LDBL_MAX_EXP', 'FLT_MIN', 'DBL_MIN', 'LDBL_MIN', 'FLT_MIN_EXP', 'DBL_MIN_EXP',
+ 'LDBL_MIN_EXP', 'CHAR_BIT', 'CHAR_MAX', 'CHAR_MIN', 'SCHAR_MAX', 'SCHAR_MIN',
+ 'UCHAR_MAX', 'SHRT_MAX', 'SHRT_MIN', 'USHRT_MAX', 'INT_MAX', 'INT_MIN',
+ 'UINT_MAX', 'LONG_MAX', 'LONG_MIN', 'ULONG_MAX', 'HUGE_VAL', 'SIGABRT',
+ 'SIGFPE', 'SIGILL', 'SIGINT', 'SIGSEGV', 'SIGTERM', 'SIG_DFL', 'SIG_ERR',
+ 'SIG_IGN', 'BUFSIZ', 'EOF', 'FILENAME_MAX', 'FOPEN_MAX', 'L_tmpnam',
+ 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'stdin', 'stdout', 'stderr',
+ 'EXIT_FAILURE', 'EXIT_SUCCESS', 'RAND_MAX', 'CLOCKS_PER_SEC',
+ 'virtual', 'public', 'private', 'protected', 'template', 'using', 'namespace',
+ 'try', 'catch', 'inline', 'dynamic_cast', 'const_cast', 'reinterpret_cast',
+ 'static_cast', 'explicit', 'friend', 'typename', 'typeid', 'class' ,
+ 'foreach','connect', 'Q_OBJECT' , 'slots' , 'signals', 'Q_SIGNALS', 'Q_SLOTS',
+ 'Q_FOREACH', 'QCOMPARE', 'QVERIFY', 'qDebug', 'kDebug', 'QBENCHMARK'
+ ),
+ 3 => array(
+ 'cin', 'cerr', 'clog', 'cout',
+ 'printf', 'fprintf', 'snprintf', 'sprintf', 'assert',
+ 'isalnum', 'isalpha', 'isdigit', 'iscntrl', 'isgraph', 'islower', 'isprint',
+ 'ispunct', 'isspace', 'isupper', 'isxdigit', 'tolower', 'toupper',
+ 'exp', 'log', 'log10', 'pow', 'sqrt', 'ceil', 'floor', 'fabs', 'ldexp',
+ 'frexp', 'modf', 'fmod', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'atan2',
+ 'sinh', 'cosh', 'tanh', 'setjmp', 'longjmp',
+ 'va_start', 'va_arg', 'va_end', 'offsetof', 'sizeof', 'fopen', 'freopen',
+ 'fflush', 'fclose', 'remove', 'rename', 'tmpfile', 'tmpname', 'setvbuf',
+ 'setbuf', 'vfprintf', 'vprintf', 'vsprintf', 'fscanf', 'scanf', 'sscanf',
+ 'fgetc', 'fgets', 'fputc', 'fputs', 'getc', 'getchar', 'gets', 'putc',
+ 'putchar', 'puts', 'ungetc', 'fread', 'fwrite', 'fseek', 'ftell', 'rewind',
+ 'fgetpos', 'fsetpos', 'clearerr', 'feof', 'ferror', 'perror', 'abs', 'labs',
+ 'div', 'ldiv', 'atof', 'atoi', 'atol', 'strtod', 'strtol', 'strtoul', 'calloc',
+ 'malloc', 'realloc', 'free', 'abort', 'exit', 'atexit', 'system', 'getenv',
+ 'bsearch', 'qsort', 'rand', 'srand', 'strcpy', 'strncpy', 'strcat', 'strncat',
+ 'strcmp', 'strncmp', 'strcoll', 'strchr', 'strrchr', 'strspn', 'strcspn',
+ 'strpbrk', 'strstr', 'strlen', 'strerror', 'strtok', 'strxfrm', 'memcpy',
+ 'memmove', 'memcmp', 'memchr', 'memset', 'clock', 'time', 'difftime', 'mktime',
+ 'asctime', 'ctime', 'gmtime', 'localtime', 'strftime'
+ ),
+ 4 => array(
+ 'auto', 'bool', 'char', 'const', 'double', 'float', 'int', 'long', 'longint',
+ 'register', 'short', 'shortint', 'signed', 'static', 'struct',
+ 'typedef', 'union', 'unsigned', 'void', 'volatile', 'extern', 'jmp_buf',
+ 'signal', 'raise', 'va_list', 'ptrdiff_t', 'size_t', 'FILE', 'fpos_t',
+ 'div_t', 'ldiv_t', 'clock_t', 'time_t', 'tm', 'wchar_t',
+
+ 'int8', 'int16', 'int32', 'int64',
+ 'uint8', 'uint16', 'uint32', 'uint64',
+
+ 'int_fast8_t', 'int_fast16_t', 'int_fast32_t', 'int_fast64_t',
+ 'uint_fast8_t', 'uint_fast16_t', 'uint_fast32_t', 'uint_fast64_t',
+
+ 'int_least8_t', 'int_least16_t', 'int_least32_t', 'int_least64_t',
+ 'uint_least8_t', 'uint_least16_t', 'uint_least32_t', 'uint_least64_t',
+
+ 'int8_t', 'int16_t', 'int32_t', 'int64_t',
+ 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t',
+
+ 'intmax_t', 'uintmax_t', 'intptr_t', 'uintptr_t'
+ ),
+ 5 => array(
+ "Q_UINT16", "Q_UINT32", "Q_UINT64", "Q_UINT8", "Q_ULLONG",
+ "Q_ULONG", "Q3Accel", "Q3Action", "Q3ActionGroup", "Q3AsciiBucket",
+ "Q3AsciiCache", "Q3AsciiCacheIterator", "Q3AsciiDict",
+ "Q3AsciiDictIterator", "Q3BaseBucket", "Q3BoxLayout", "Q3Button",
+ "Q3ButtonGroup", "Q3Cache", "Q3CacheIterator", "Q3Canvas",
+ "Q3CanvasEllipse", "Q3CanvasItem", "Q3CanvasItemList",
+ "Q3CanvasLine", "Q3CanvasPixmap", "Q3CanvasPixmapArray",
+ "Q3CanvasPolygon", "Q3CanvasPolygonalItem", "Q3CanvasRectangle",
+ "Q3CanvasSpline", "Q3CanvasSprite", "Q3CanvasText", "Q3CanvasView",
+ "Q3CheckListItem", "Q3CheckTableItem", "Q3CleanupHandler",
+ "Q3ColorDrag", "Q3ComboBox", "Q3ComboTableItem", "Q3CString",
+ "Q3DataBrowser", "Q3DataTable", "Q3DataView", "Q3DateEdit",
+ "Q3DateTimeEdit", "Q3DateTimeEditBase", "Q3DeepCopy", "Q3Dict",
+ "Q3DictIterator", "Q3Dns", "Q3DnsSocket", "Q3DockArea",
+ "Q3DockAreaLayout", "Q3DockWindow", "Q3DragObject", "Q3DropSite",
+ "Q3EditorFactory", "Q3FileDialog", "Q3FileIconProvider",
+ "Q3FilePreview", "Q3Frame", "Q3Ftp", "Q3GArray", "Q3GCache",
+ "Q3GCacheIterator", "Q3GDict", "Q3GDictIterator", "Q3GList",
+ "Q3GListIterator", "Q3GListStdIterator", "Q3Grid", "Q3GridLayout",
+ "Q3GridView", "Q3GroupBox", "Q3GVector", "Q3HBox", "Q3HBoxLayout",
+ "Q3HButtonGroup", "Q3Header", "Q3HGroupBox", "Q3Http",
+ "Q3HttpHeader", "Q3HttpRequestHeader", "Q3HttpResponseHeader",
+ "Q3IconDrag", "Q3IconDragItem", "Q3IconView", "Q3IconViewItem",
+ "Q3ImageDrag", "Q3IntBucket", "Q3IntCache", "Q3IntCacheIterator",
+ "Q3IntDict", "Q3IntDictIterator", "Q3ListBox", "Q3ListBoxItem",
+ "Q3ListBoxPixmap", "Q3ListBoxText", "Q3ListView", "Q3ListViewItem",
+ "Q3ListViewItemIterator", "Q3LNode", "Q3LocalFs", "Q3MainWindow",
+ "Q3MemArray", "Q3MimeSourceFactory", "Q3MultiLineEdit",
+ "Q3NetworkOperation", "Q3NetworkProtocol", "Q3NetworkProtocolDict",
+ "Q3NetworkProtocolFactory", "Q3NetworkProtocolFactoryBase",
+ "Q3ObjectDictionary", "Q3PaintDeviceMetrics", "Q3Painter",
+ "Q3Picture", "Q3PointArray", "Q3PolygonScanner", "Q3PopupMenu",
+ "Q3Process", "Q3ProgressBar", "Q3ProgressDialog", "Q3PtrBucket",
+ "Q3PtrCollection", "Q3PtrDict", "Q3PtrDictIterator", "Q3PtrList",
+ "Q3PtrListIterator", "Q3PtrListStdIterator", "Q3PtrQueue",
+ "Q3PtrStack", "Q3PtrVector", "Q3RangeControl", "Q3ScrollView",
+ "Q3Semaphore", "Q3ServerSocket", "Q3Shared", "Q3Signal",
+ "Q3SimpleRichText", "Q3SingleCleanupHandler", "Q3Socket",
+ "Q3SocketDevice", "Q3SortedList", "Q3SpinWidget", "Q3SqlCursor",
+ "Q3SqlEditorFactory", "Q3SqlFieldInfo", "Q3SqlFieldInfoList",
+ "Q3SqlForm", "Q3SqlPropertyMap", "Q3SqlRecordInfo",
+ "Q3SqlSelectCursor", "Q3StoredDrag", "Q3StrIList", "Q3StringBucket",
+ "Q3StrIVec", "Q3StrList", "Q3StrListIterator", "Q3StrVec",
+ "Q3StyleSheet", "Q3StyleSheetItem", "Q3SyntaxHighlighter",
+ "Q3TabDialog", "Q3Table", "Q3TableItem", "Q3TableSelection",
+ "Q3TextBrowser", "Q3TextDrag", "Q3TextEdit",
+ "Q3TextEditOptimPrivate", "Q3TextStream", "Q3TextView",
+ "Q3TimeEdit", "Q3ToolBar", "Q3TSFUNC", "Q3UriDrag", "Q3Url",
+ "Q3UrlOperator", "Q3ValueList", "Q3ValueListConstIterator",
+ "Q3ValueListIterator", "Q3ValueStack", "Q3ValueVector", "Q3VBox",
+ "Q3VBoxLayout", "Q3VButtonGroup", "Q3VGroupBox", "Q3WhatsThis",
+ "Q3WidgetStack", "Q3Wizard", "QAbstractButton",
+ "QAbstractEventDispatcher", "QAbstractExtensionFactory",
+ "QAbstractExtensionManager", "QAbstractFileEngine",
+ "QAbstractFileEngineHandler", "QAbstractFileEngineIterator",
+ "QAbstractFormBuilder", "QAbstractGraphicsShapeItem",
+ "QAbstractItemDelegate", "QAbstractItemModel", "QAbstractItemView",
+ "QAbstractListModel", "QAbstractMessageHandler",
+ "QAbstractNetworkCache", "QAbstractPageSetupDialog",
+ "QAbstractPrintDialog", "QAbstractProxyModel",
+ "QAbstractScrollArea", "QAbstractSlider", "QAbstractSocket",
+ "QAbstractSpinBox", "QAbstractTableModel",
+ "QAbstractTextDocumentLayout", "QAbstractUndoItem",
+ "QAbstractUriResolver", "QAbstractXmlNodeModel",
+ "QAbstractXmlReceiver", "QAccessible", "QAccessible2Interface",
+ "QAccessibleApplication", "QAccessibleBridge",
+ "QAccessibleBridgeFactoryInterface", "QAccessibleBridgePlugin",
+ "QAccessibleEditableTextInterface", "QAccessibleEvent",
+ "QAccessibleFactoryInterface", "QAccessibleInterface",
+ "QAccessibleInterfaceEx", "QAccessibleObject",
+ "QAccessibleObjectEx", "QAccessiblePlugin",
+ "QAccessibleSimpleEditableTextInterface",
+ "QAccessibleTableInterface", "QAccessibleTextInterface",
+ "QAccessibleValueInterface", "QAccessibleWidget",
+ "QAccessibleWidgetEx", "QAction", "QActionEvent", "QActionGroup",
+ "QApplication", "QArgument", "QAssistantClient", "QAtomicInt",
+ "QAtomicPointer", "QAuthenticator", "QBasicAtomicInt",
+ "QBasicAtomicPointer", "QBasicTimer", "QBitArray", "QBitmap",
+ "QBitRef", "QBool", "QBoxLayout", "QBrush", "QBrushData", "QBuffer",
+ "QButtonGroup", "QByteArray", "QByteArrayMatcher", "QByteRef",
+ "QCache", "QCalendarWidget", "QCDEStyle", "QChar", "QCharRef",
+ "QCheckBox", "QChildEvent", "QCleanlooksStyle", "QClipboard",
+ "QClipboardEvent", "QCloseEvent", "QColor", "QColorDialog",
+ "QColorGroup", "QColormap", "QColumnView", "QComboBox",
+ "QCommandLinkButton", "QCommonStyle", "QCompleter",
+ "QConicalGradient", "QConstString", "QContextMenuEvent", "QCOORD",
+ "QCoreApplication", "QCryptographicHash", "QCursor", "QCursorShape",
+ "QCustomEvent", "QDataStream", "QDataWidgetMapper", "QDate",
+ "QDateEdit", "QDateTime", "QDateTimeEdit", "QDB2Driver",
+ "QDB2Result", "QDBusAbstractAdaptor", "QDBusAbstractInterface",
+ "QDBusArgument", "QDBusConnection", "QDBusConnectionInterface",
+ "QDBusContext", "QDBusError", "QDBusInterface", "QDBusMessage",
+ "QDBusMetaType", "QDBusObjectPath", "QDBusPendingCall",
+ "QDBusPendingCallWatcher", "QDBusPendingReply",
+ "QDBusPendingReplyData", "QDBusReply", "QDBusServer",
+ "QDBusSignature", "QDBusVariant", "QDebug",
+ "QDesignerActionEditorInterface", "QDesignerBrushManagerInterface",
+ "QDesignerComponents", "QDesignerContainerExtension",
+ "QDesignerCustomWidgetCollectionInterface",
+ "QDesignerCustomWidgetInterface", "QDesignerDnDItemInterface",
+ "QDesignerDynamicPropertySheetExtension", "QDesignerExportWidget",
+ "QDesignerExtraInfoExtension", "QDesignerFormEditorInterface",
+ "QDesignerFormEditorPluginInterface", "QDesignerFormWindowCursorInterface",
+ "QDesignerFormWindowInterface", "QDesignerFormWindowManagerInterface",
+ "QDesignerFormWindowToolInterface",
+ "QDesignerIconCacheInterface", "QDesignerIntegrationInterface",
+ "QDesignerLanguageExtension", "QDesignerLayoutDecorationExtension",
+ "QDesignerMemberSheetExtension", "QDesignerMetaDataBaseInterface",
+ "QDesignerMetaDataBaseItemInterface",
+ "QDesignerObjectInspectorInterface", "QDesignerPromotionInterface",
+ "QDesignerPropertyEditorInterface",
+ "QDesignerPropertySheetExtension", "QDesignerResourceBrowserInterface",
+ "QDesignerTaskMenuExtension", "QDesignerWidgetBoxInterface",
+ "QDesignerWidgetDataBaseInterface", "QDesignerWidgetDataBaseItemInterface",
+ "QDesignerWidgetFactoryInterface", "QDesktopServices",
+ "QDesktopWidget", "QDial", "QDialog", "QDialogButtonBox", "QDir",
+ "QDirIterator", "QDirModel", "QDockWidget", "QDomAttr",
+ "QDomCDATASection", "QDomCharacterData", "QDomComment",
+ "QDomDocument", "QDomDocumentFragment", "QDomDocumentType",
+ "QDomElement", "QDomEntity", "QDomEntityReference",
+ "QDomImplementation", "QDomNamedNodeMap", "QDomNode",
+ "QDomNodeList", "QDomNotation", "QDomProcessingInstruction",
+ "QDomText", "QDoubleSpinBox", "QDoubleValidator", "QDrag",
+ "QDragEnterEvent", "QDragLeaveEvent", "QDragMoveEvent",
+ "QDragResponseEvent", "QDropEvent", "QDynamicPropertyChangeEvent",
+ "QErrorMessage", "QEvent", "QEventLoop", "QEventSizeOfChecker",
+ "QExplicitlySharedDataPointer", "QExtensionFactory",
+ "QExtensionManager", "QFactoryInterface", "QFile", "QFileDialog",
+ "QFileIconProvider", "QFileInfo", "QFileInfoList",
+ "QFileInfoListIterator", "QFileOpenEvent", "QFileSystemModel",
+ "QFileSystemWatcher", "QFlag", "QFlags", "QFocusEvent",
+ "QFocusFrame", "QFont", "QFontComboBox", "QFontDatabase",
+ "QFontDialog", "QFontInfo", "QFontMetrics", "QFontMetricsF",
+ "QForeachContainer", "QForeachContainerBase", "QFormBuilder",
+ "QFormLayout", "QFrame", "QFSFileEngine", "QFtp", "QFuture",
+ "QFutureInterface", "QFutureInterfaceBase", "QFutureIterator",
+ "QFutureSynchronizer", "QFutureWatcher", "QFutureWatcherBase",
+ "QGenericArgument", "QGenericReturnArgument", "QGLColormap",
+ "QGLContext", "QGLFormat", "QGLFramebufferObject", "QGlobalStatic",
+ "QGlobalStaticDeleter", "QGLPixelBuffer", "QGLWidget", "QGradient",
+ "QGradientStop", "QGradientStops", "QGraphicsEllipseItem",
+ "QGraphicsGridLayout", "QGraphicsItem", "QGraphicsItemAnimation",
+ "QGraphicsItemGroup", "QGraphicsLayout", "QGraphicsLayoutItem",
+ "QGraphicsLinearLayout", "QGraphicsLineItem", "QGraphicsPathItem",
+ "QGraphicsPixmapItem", "QGraphicsPolygonItem",
+ "QGraphicsProxyWidget", "QGraphicsRectItem", "QGraphicsScene",
+ "QGraphicsSceneContextMenuEvent", "QGraphicsSceneDragDropEvent",
+ "QGraphicsSceneEvent", "QGraphicsSceneHelpEvent",
+ "QGraphicsSceneHoverEvent", "QGraphicsSceneMouseEvent",
+ "QGraphicsSceneMoveEvent", "QGraphicsSceneResizeEvent",
+ "QGraphicsSceneWheelEvent", "QGraphicsSimpleTextItem",
+ "QGraphicsSvgItem", "QGraphicsTextItem", "QGraphicsView",
+ "QGraphicsWidget", "QGridLayout", "QGroupBox", "QGtkStyle", "QHash",
+ "QHashData", "QHashDummyNode", "QHashDummyValue", "QHashIterator",
+ "QHashNode", "QHBoxLayout", "QHeaderView", "QHelpContentItem",
+ "QHelpContentModel", "QHelpContentWidget", "QHelpEngine",
+ "QHelpEngineCore", "QHelpEvent", "QHelpGlobal", "QHelpIndexModel",
+ "QHelpIndexWidget", "QHelpSearchEngine", "QHelpSearchQuery",
+ "QHelpSearchQueryWidget", "QHelpSearchResultWidget", "QHideEvent",
+ "QHostAddress", "QHostInfo", "QHoverEvent", "QHttp", "QHttpHeader",
+ "QHttpRequestHeader", "QHttpResponseHeader", "QIBaseDriver",
+ "QIBaseResult", "QIcon", "QIconDragEvent", "QIconEngine",
+ "QIconEngineFactoryInterface", "QIconEngineFactoryInterfaceV2",
+ "QIconEnginePlugin", "QIconEnginePluginV2", "QIconEngineV2",
+ "QIconSet", "QImage", "QImageIOHandler",
+ "QImageIOHandlerFactoryInterface", "QImageIOPlugin", "QImageReader",
+ "QImageTextKeyLang", "QImageWriter", "QIncompatibleFlag",
+ "QInputContext", "QInputContextFactory",
+ "QInputContextFactoryInterface", "QInputContextPlugin",
+ "QInputDialog", "QInputEvent", "QInputMethodEvent", "Q_INT16",
+ "Q_INT32", "Q_INT64", "Q_INT8", "QInternal", "QIntForSize",
+ "QIntForType", "QIntValidator", "QIODevice", "Q_IPV6ADDR",
+ "QIPv6Address", "QItemDelegate", "QItemEditorCreator",
+ "QItemEditorCreatorBase", "QItemEditorFactory", "QItemSelection",
+ "QItemSelectionModel", "QItemSelectionRange", "QKeyEvent",
+ "QKeySequence", "QLabel", "QLatin1Char", "QLatin1String", "QLayout",
+ "QLayoutItem", "QLayoutIterator", "QLCDNumber", "QLibrary",
+ "QLibraryInfo", "QLine", "QLinearGradient", "QLineEdit", "QLineF",
+ "QLinkedList", "QLinkedListData", "QLinkedListIterator",
+ "QLinkedListNode", "QList", "QListData", "QListIterator",
+ "QListView", "QListWidget", "QListWidgetItem", "Q_LLONG", "QLocale",
+ "QLocalServer", "QLocalSocket", "Q_LONG", "QMacCompatGLenum",
+ "QMacCompatGLint", "QMacCompatGLuint", "QMacGLCompatTypes",
+ "QMacMime", "QMacPasteboardMime", "QMainWindow", "QMap", "QMapData",
+ "QMapIterator", "QMapNode", "QMapPayloadNode", "QMatrix",
+ "QMdiArea", "QMdiSubWindow", "QMenu", "QMenuBar",
+ "QMenubarUpdatedEvent", "QMenuItem", "QMessageBox",
+ "QMetaClassInfo", "QMetaEnum", "QMetaMethod", "QMetaObject",
+ "QMetaObjectExtraData", "QMetaProperty", "QMetaType", "QMetaTypeId",
+ "QMetaTypeId2", "QMimeData", "QMimeSource", "QModelIndex",
+ "QModelIndexList", "QMotifStyle", "QMouseEvent", "QMoveEvent",
+ "QMovie", "QMultiHash", "QMultiMap", "QMutableFutureIterator",
+ "QMutableHashIterator", "QMutableLinkedListIterator",
+ "QMutableListIterator", "QMutableMapIterator",
+ "QMutableSetIterator", "QMutableStringListIterator",
+ "QMutableVectorIterator", "QMutex", "QMutexLocker", "QMYSQLDriver",
+ "QMYSQLResult", "QNetworkAccessManager", "QNetworkAddressEntry",
+ "QNetworkCacheMetaData", "QNetworkCookie", "QNetworkCookieJar",
+ "QNetworkDiskCache", "QNetworkInterface", "QNetworkProxy",
+ "QNetworkProxyFactory", "QNetworkProxyQuery", "QNetworkReply",
+ "QNetworkRequest", "QNoDebug", "QNoImplicitBoolCast", "QObject",
+ "QObjectCleanupHandler", "QObjectData", "QObjectList",
+ "QObjectUserData", "QOCIDriver", "QOCIResult", "QODBCDriver",
+ "QODBCResult", "QPageSetupDialog", "QPaintDevice", "QPaintEngine",
+ "QPaintEngineState", "QPainter", "QPainterPath",
+ "QPainterPathPrivate", "QPainterPathStroker", "QPaintEvent",
+ "QPair", "QPalette", "QPen", "QPersistentModelIndex", "QPicture",
+ "QPictureFormatInterface", "QPictureFormatPlugin", "QPictureIO",
+ "Q_PID", "QPixmap", "QPixmapCache", "QPlainTextDocumentLayout",
+ "QPlainTextEdit", "QPlastiqueStyle", "QPluginLoader", "QPoint",
+ "QPointer", "QPointF", "QPolygon", "QPolygonF", "QPrintDialog",
+ "QPrintEngine", "QPrinter", "QPrinterInfo", "QPrintPreviewDialog",
+ "QPrintPreviewWidget", "QProcess", "QProgressBar",
+ "QProgressDialog", "QProxyModel", "QPSQLDriver", "QPSQLResult",
+ "QPushButton", "QQueue", "QRadialGradient", "QRadioButton",
+ "QReadLocker", "QReadWriteLock", "QRect", "QRectF", "QRegExp",
+ "QRegExpValidator", "QRegion", "QResizeEvent", "QResource",
+ "QReturnArgument", "QRgb", "QRubberBand", "QRunnable",
+ "QScriptable", "QScriptClass", "QScriptClassPropertyIterator",
+ "QScriptContext", "QScriptContextInfo", "QScriptContextInfoList",
+ "QScriptEngine", "QScriptEngineAgent", "QScriptEngineDebugger",
+ "QScriptExtensionInterface", "QScriptExtensionPlugin",
+ "QScriptString", "QScriptSyntaxCheckResult", "QScriptValue",
+ "QScriptValueIterator", "QScriptValueList", "QScrollArea",
+ "QScrollBar", "QSemaphore", "QSessionManager", "QSet",
+ "QSetIterator", "QSettings", "QSharedData", "QSharedDataPointer",
+ "QSharedMemory", "QSharedPointer", "QShortcut", "QShortcutEvent",
+ "QShowEvent", "QSignalMapper", "QSignalSpy", "QSimpleXmlNodeModel",
+ "QSize", "QSizeF", "QSizeGrip", "QSizePolicy", "QSlider",
+ "QSocketNotifier", "QSortFilterProxyModel", "QSound",
+ "QSourceLocation", "QSpacerItem", "QSpinBox", "QSplashScreen",
+ "QSplitter", "QSplitterHandle", "QSpontaneKeyEvent", "QSqlDatabase",
+ "QSqlDriver", "QSqlDriverCreator", "QSqlDriverCreatorBase",
+ "QSqlDriverFactoryInterface", "QSqlDriverPlugin", "QSqlError",
+ "QSqlField", "QSqlIndex", "QSQLite2Driver", "QSQLite2Result",
+ "QSQLiteDriver", "QSQLiteResult", "QSqlQuery", "QSqlQueryModel",
+ "QSqlRecord", "QSqlRelation", "QSqlRelationalDelegate",
+ "QSqlRelationalTableModel", "QSqlResult", "QSqlTableModel", "QSsl",
+ "QSslCertificate", "QSslCipher", "QSslConfiguration", "QSslError",
+ "QSslKey", "QSslSocket", "QStack", "QStackedLayout",
+ "QStackedWidget", "QStandardItem", "QStandardItemEditorCreator",
+ "QStandardItemModel", "QStatusBar", "QStatusTipEvent",
+ "QStdWString", "QString", "QStringList", "QStringListIterator",
+ "QStringListModel", "QStringMatcher", "QStringRef", "QStyle",
+ "QStyledItemDelegate", "QStyleFactory", "QStyleFactoryInterface",
+ "QStyleHintReturn", "QStyleHintReturnMask",
+ "QStyleHintReturnVariant", "QStyleOption", "QStyleOptionButton",
+ "QStyleOptionComboBox", "QStyleOptionComplex",
+ "QStyleOptionDockWidget", "QStyleOptionDockWidgetV2",
+ "QStyleOptionFocusRect", "QStyleOptionFrame", "QStyleOptionFrameV2",
+ "QStyleOptionFrameV3", "QStyleOptionGraphicsItem",
+ "QStyleOptionGroupBox", "QStyleOptionHeader",
+ "QStyleOptionMenuItem", "QStyleOptionProgressBar",
+ "QStyleOptionProgressBarV2", "QStyleOptionQ3DockWindow",
+ "QStyleOptionQ3ListView", "QStyleOptionQ3ListViewItem",
+ "QStyleOptionRubberBand", "QStyleOptionSizeGrip",
+ "QStyleOptionSlider", "QStyleOptionSpinBox", "QStyleOptionTab",
+ "QStyleOptionTabBarBase", "QStyleOptionTabBarBaseV2",
+ "QStyleOptionTabV2", "QStyleOptionTabV3",
+ "QStyleOptionTabWidgetFrame", "QStyleOptionTitleBar",
+ "QStyleOptionToolBar", "QStyleOptionToolBox",
+ "QStyleOptionToolBoxV2", "QStyleOptionToolButton",
+ "QStyleOptionViewItem", "QStyleOptionViewItemV2",
+ "QStyleOptionViewItemV3", "QStyleOptionViewItemV4", "QStylePainter",
+ "QStylePlugin", "QSvgGenerator", "QSvgRenderer", "QSvgWidget",
+ "QSyntaxHighlighter", "QSysInfo", "QSystemLocale",
+ "QSystemSemaphore", "QSystemTrayIcon", "Qt", "Qt3Support",
+ "QTabBar", "QTabletEvent", "QTableView", "QTableWidget",
+ "QTableWidgetItem", "QTableWidgetSelectionRange", "QTabWidget",
+ "QtAlgorithms", "QtAssistant", "QtCleanUpFunction",
+ "QtConcurrentFilter", "QtConcurrentMap", "QtConcurrentRun",
+ "QtContainerFwd", "QtCore", "QTcpServer", "QTcpSocket", "QtDBus",
+ "QtDebug", "QtDesigner", "QTDSDriver", "QTDSResult",
+ "QTemporaryFile", "QtEndian", "QTest", "QTestAccessibility",
+ "QTestAccessibilityEvent", "QTestData", "QTestDelayEvent",
+ "QTestEvent", "QTestEventList", "QTestEventLoop",
+ "QTestKeyClicksEvent", "QTestKeyEvent", "QTestMouseEvent",
+ "QtEvents", "QTextBlock", "QTextBlockFormat", "QTextBlockGroup",
+ "QTextBlockUserData", "QTextBoundaryFinder", "QTextBrowser",
+ "QTextCharFormat", "QTextCodec", "QTextCodecFactoryInterface",
+ "QTextCodecPlugin", "QTextCursor", "QTextDecoder", "QTextDocument",
+ "QTextDocumentFragment", "QTextDocumentWriter", "QTextEdit",
+ "QTextEncoder", "QTextFormat", "QTextFragment", "QTextFrame",
+ "QTextFrameFormat", "QTextFrameLayoutData", "QTextImageFormat",
+ "QTextInlineObject", "QTextIStream", "QTextItem", "QTextLayout",
+ "QTextLength", "QTextLine", "QTextList", "QTextListFormat",
+ "QTextObject", "QTextObjectInterface", "QTextOption",
+ "QTextOStream", "QTextStream", "QTextStreamFunction",
+ "QTextStreamManipulator", "QTextTable", "QTextTableCell",
+ "QTextTableCellFormat", "QTextTableFormat", "QtGlobal", "QtGui",
+ "QtHelp", "QThread", "QThreadPool", "QThreadStorage",
+ "QThreadStorageData", "QTime", "QTimeEdit", "QTimeLine", "QTimer",
+ "QTimerEvent", "QtMsgHandler", "QtNetwork", "QToolBar",
+ "QToolBarChangeEvent", "QToolBox", "QToolButton", "QToolTip",
+ "QtOpenGL", "QtPlugin", "QtPluginInstanceFunction", "QTransform",
+ "QTranslator", "QTreeView", "QTreeWidget", "QTreeWidgetItem",
+ "QTreeWidgetItemIterator", "QTS", "QtScript", "QtScriptTools",
+ "QtSql", "QtSvg", "QtTest", "QtUiTools", "QtWebKit", "QtXml",
+ "QtXmlPatterns", "QTypeInfo", "QUdpSocket", "QUiLoader",
+ "QUintForSize", "QUintForType", "QUndoCommand", "QUndoGroup",
+ "QUndoStack", "QUndoView", "QUnixPrintWidget", "QUpdateLaterEvent",
+ "QUrl", "QUrlInfo", "QUuid", "QValidator", "QVariant",
+ "QVariantComparisonHelper", "QVariantHash", "QVariantList",
+ "QVariantMap", "QVarLengthArray", "QVBoxLayout", "QVector",
+ "QVectorData", "QVectorIterator", "QVectorTypedData",
+ "QWaitCondition", "QWeakPointer", "QWebDatabase", "QWebFrame",
+ "QWebHistory", "QWebHistoryInterface", "QWebHistoryItem",
+ "QWebHitTestResult", "QWebPage", "QWebPluginFactory",
+ "QWebSecurityOrigin", "QWebSettings", "QWebView", "QWhatsThis",
+ "QWhatsThisClickedEvent", "QWheelEvent", "QWidget", "QWidgetAction",
+ "QWidgetData", "QWidgetItem", "QWidgetItemV2", "QWidgetList",
+ "QWidgetMapper", "QWidgetSet", "QWindowsCEStyle", "QWindowsMime",
+ "QWindowsMobileStyle", "QWindowsStyle", "QWindowStateChangeEvent",
+ "QWindowsVistaStyle", "QWindowsXPStyle", "QWizard", "QWizardPage",
+ "QWMatrix", "QWorkspace", "QWriteLocker", "QX11EmbedContainer",
+ "QX11EmbedWidget", "QX11Info", "QXmlAttributes",
+ "QXmlContentHandler", "QXmlDeclHandler", "QXmlDefaultHandler",
+ "QXmlDTDHandler", "QXmlEntityResolver", "QXmlErrorHandler",
+ "QXmlFormatter", "QXmlInputSource", "QXmlItem",
+ "QXmlLexicalHandler", "QXmlLocator", "QXmlName", "QXmlNamePool",
+ "QXmlNamespaceSupport", "QXmlNodeModelIndex", "QXmlParseException",
+ "QXmlQuery", "QXmlReader", "QXmlResultItems", "QXmlSerializer",
+ "QXmlSimpleReader", "QXmlStreamAttribute", "QXmlStreamAttributes",
+ "QXmlStreamEntityDeclaration", "QXmlStreamEntityDeclarations",
+ "QXmlStreamEntityResolver", "QXmlStreamNamespaceDeclaration",
+ "QXmlStreamNamespaceDeclarations", "QXmlStreamNotationDeclaration",
+ "QXmlStreamNotationDeclarations", "QXmlStreamReader",
+ "QXmlStreamStringRef", "QXmlStreamWriter"
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '=', '+', '-', '*', '/', '!', '%', '^', '&', ':', ',', ';', '|', '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight:bold;',
+ 2 => 'color: #0057AE;',
+ 3 => 'color: #2B74C7;',
+ 4 => 'color: #0057AE;',
+ 5 => 'color: #22aadd;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #888888;',
+ 2 => 'color: #006E28;',
+ 'MULTI' => 'color: #888888; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #660099; font-weight: bold;',
+ 3 => 'color: #660099; font-weight: bold;',
+ 4 => 'color: #660099; font-weight: bold;',
+ 5 => 'color: #006699; font-weight: bold;',
+ 'HARD' => '',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #006E28;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #BF0303;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #B08000;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #208080;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color:#800080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI => 'color:#800080;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #2B74C7;',
+ 2 => 'color: #2B74C7;',
+ 3 => 'color: #2B74C7;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #006E28;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => 'http://doc.trolltech.com/latest/{FNAMEL}.html'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::',
+ 3 => '-&gt;',
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#>|^])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_<\|%\\-])"
+ ),
+ 'OOLANG' => array(
+ 'MATCH_AFTER' => '~?[a-zA-Z][a-zA-Z0-9_]*',
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cpp.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cpp.php
new file mode 100644
index 00000000..42ab311c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cpp.php
@@ -0,0 +1,240 @@
+<?php
+/*************************************************************************************
+ * cpp.php
+ * -------
+ * Author: Dennis Bayer (Dennis.Bayer@mnifh-giessen.de)
+ * Contributors:
+ * - M. Uli Kusterer (witness.of.teachtext@gmx.net)
+ * - Jack Lloyd (lloyd@randombit.net)
+ * Copyright: (c) 2004 Dennis Bayer, Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/09/27
+ *
+ * C++ language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2004/XX/XX (1.0.2)
+ * - Added several new keywords (Jack Lloyd)
+ * 2004/11/27 (1.0.1)
+ * - Added StdCLib function and constant names, changed color scheme to
+ * a cleaner one. (M. Uli Kusterer)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'C++',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Multiline-continued single-line comments
+ 1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Multiline-continued preprocessor define
+ 2 => '/#(?:\\\\\\\\|\\\\\\n|.)*$/m'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[abfnrtv\\\'\"?\n]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{2}#",
+ //Hexadecimal Char Specs
+ 3 => "#\\\\u[\da-fA-F]{4}#",
+ //Hexadecimal Char Specs
+ 4 => "#\\\\U[\da-fA-F]{8}#",
+ //Octal Char Specs
+ 5 => "#\\\\[0-7]{1,3}#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'break', 'case', 'continue', 'default', 'do', 'else', 'for', 'goto', 'if', 'return',
+ 'switch', 'throw', 'while'
+ ),
+ 2 => array(
+ 'NULL', 'false', 'true', 'enum', 'errno', 'EDOM',
+ 'ERANGE', 'FLT_RADIX', 'FLT_ROUNDS', 'FLT_DIG', 'DBL_DIG', 'LDBL_DIG',
+ 'FLT_EPSILON', 'DBL_EPSILON', 'LDBL_EPSILON', 'FLT_MANT_DIG', 'DBL_MANT_DIG',
+ 'LDBL_MANT_DIG', 'FLT_MAX', 'DBL_MAX', 'LDBL_MAX', 'FLT_MAX_EXP', 'DBL_MAX_EXP',
+ 'LDBL_MAX_EXP', 'FLT_MIN', 'DBL_MIN', 'LDBL_MIN', 'FLT_MIN_EXP', 'DBL_MIN_EXP',
+ 'LDBL_MIN_EXP', 'CHAR_BIT', 'CHAR_MAX', 'CHAR_MIN', 'SCHAR_MAX', 'SCHAR_MIN',
+ 'UCHAR_MAX', 'SHRT_MAX', 'SHRT_MIN', 'USHRT_MAX', 'INT_MAX', 'INT_MIN',
+ 'UINT_MAX', 'LONG_MAX', 'LONG_MIN', 'ULONG_MAX', 'HUGE_VAL', 'SIGABRT',
+ 'SIGFPE', 'SIGILL', 'SIGINT', 'SIGSEGV', 'SIGTERM', 'SIG_DFL', 'SIG_ERR',
+ 'SIG_IGN', 'BUFSIZ', 'EOF', 'FILENAME_MAX', 'FOPEN_MAX', 'L_tmpnam',
+ 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'stdin', 'stdout', 'stderr',
+ 'EXIT_FAILURE', 'EXIT_SUCCESS', 'RAND_MAX', 'CLOCKS_PER_SEC',
+ 'virtual', 'public', 'private', 'protected', 'template', 'using', 'namespace',
+ 'try', 'catch', 'inline', 'dynamic_cast', 'const_cast', 'reinterpret_cast',
+ 'static_cast', 'explicit', 'friend', 'typename', 'typeid', 'class'
+ ),
+ 3 => array(
+ 'cin', 'cerr', 'clog', 'cout', 'delete', 'new', 'this',
+ 'printf', 'fprintf', 'snprintf', 'sprintf', 'assert',
+ 'isalnum', 'isalpha', 'isdigit', 'iscntrl', 'isgraph', 'islower', 'isprint',
+ 'ispunct', 'isspace', 'isupper', 'isxdigit', 'tolower', 'toupper',
+ 'exp', 'log', 'log10', 'pow', 'sqrt', 'ceil', 'floor', 'fabs', 'ldexp',
+ 'frexp', 'modf', 'fmod', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'atan2',
+ 'sinh', 'cosh', 'tanh', 'setjmp', 'longjmp',
+ 'va_start', 'va_arg', 'va_end', 'offsetof', 'sizeof', 'fopen', 'freopen',
+ 'fflush', 'fclose', 'remove', 'rename', 'tmpfile', 'tmpname', 'setvbuf',
+ 'setbuf', 'vfprintf', 'vprintf', 'vsprintf', 'fscanf', 'scanf', 'sscanf',
+ 'fgetc', 'fgets', 'fputc', 'fputs', 'getc', 'getchar', 'gets', 'putc',
+ 'putchar', 'puts', 'ungetc', 'fread', 'fwrite', 'fseek', 'ftell', 'rewind',
+ 'fgetpos', 'fsetpos', 'clearerr', 'feof', 'ferror', 'perror', 'abs', 'labs',
+ 'div', 'ldiv', 'atof', 'atoi', 'atol', 'strtod', 'strtol', 'strtoul', 'calloc',
+ 'malloc', 'realloc', 'free', 'abort', 'exit', 'atexit', 'system', 'getenv',
+ 'bsearch', 'qsort', 'rand', 'srand', 'strcpy', 'strncpy', 'strcat', 'strncat',
+ 'strcmp', 'strncmp', 'strcoll', 'strchr', 'strrchr', 'strspn', 'strcspn',
+ 'strpbrk', 'strstr', 'strlen', 'strerror', 'strtok', 'strxfrm', 'memcpy',
+ 'memmove', 'memcmp', 'memchr', 'memset', 'clock', 'time', 'difftime', 'mktime',
+ 'asctime', 'ctime', 'gmtime', 'localtime', 'strftime'
+ ),
+ 4 => array(
+ 'auto', 'bool', 'char', 'const', 'double', 'float', 'int', 'long', 'longint',
+ 'register', 'short', 'shortint', 'signed', 'static', 'struct',
+ 'typedef', 'union', 'unsigned', 'void', 'volatile', 'extern', 'jmp_buf',
+ 'signal', 'raise', 'va_list', 'ptrdiff_t', 'size_t', 'FILE', 'fpos_t',
+ 'div_t', 'ldiv_t', 'clock_t', 'time_t', 'tm', 'wchar_t',
+
+ 'int8', 'int16', 'int32', 'int64',
+ 'uint8', 'uint16', 'uint32', 'uint64',
+
+ 'int_fast8_t', 'int_fast16_t', 'int_fast32_t', 'int_fast64_t',
+ 'uint_fast8_t', 'uint_fast16_t', 'uint_fast32_t', 'uint_fast64_t',
+
+ 'int_least8_t', 'int_least16_t', 'int_least32_t', 'int_least64_t',
+ 'uint_least8_t', 'uint_least16_t', 'uint_least32_t', 'uint_least64_t',
+
+ 'int8_t', 'int16_t', 'int32_t', 'int64_t',
+ 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t',
+
+ 'intmax_t', 'uintmax_t', 'intptr_t', 'uintptr_t'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '{', '}', '[', ']'),
+ 1 => array('<', '>','='),
+ 2 => array('+', '-', '*', '/', '%'),
+ 3 => array('!', '^', '&', '|'),
+ 4 => array('?', ':', ';')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #0000dd;',
+ 4 => 'color: #0000ff;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666;',
+ 2 => 'color: #339900;',
+ 'MULTI' => 'color: #ff0000; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #660099; font-weight: bold;',
+ 3 => 'color: #660099; font-weight: bold;',
+ 4 => 'color: #660099; font-weight: bold;',
+ 5 => 'color: #006699; font-weight: bold;',
+ 'HARD' => '',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #208080;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color:#800080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI => 'color:#800080;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #007788;',
+ 2 => 'color: #007788;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;',
+ 1 => 'color: #000080;',
+ 2 => 'color: #000040;',
+ 3 => 'color: #000040;',
+ 4 => 'color: #008080;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_\|%\\-])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/csharp.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/csharp.php
new file mode 100644
index 00000000..26024e91
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/csharp.php
@@ -0,0 +1,256 @@
+<?php
+/*************************************************************************************
+ * csharp.php
+ * ----------
+ * Author: Alan Juden (alan@judenware.org)
+ * Revised by: Michael Mol (mikemol@gmail.com)
+ * Copyright: (c) 2004 Alan Juden, Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/04
+ *
+ * C# language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/06/18 (1.0.8.11)
+ * - Added missing keywords (Christian Stelzmann)
+ * 2009/04/03 (1.0.8.6)
+ * - Added missing keywords identified by Rosetta Code users.
+ * 2008/05/25 (1.0.7.22)
+ * - Added highlighting of using and namespace directives as non-OOP
+ * 2005/01/05 (1.0.1)
+ * - Used hardquote support for @"..." strings (Cliff Stanford)
+ * 2004/11/27 (1.0.0)
+ * - Initial release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'C#',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Using and Namespace directives (basic support)
+ //Please note that the alias syntax for using is not supported
+ 3 => '/(?:(?<=using[\\n\\s])|(?<=namespace[\\n\\s]))[\\n\\s]*([a-zA-Z0-9_]+\\.)*[a-zA-Z0-9_]+[\n\s]*(?=[;=])/i'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'HARDQUOTE' => array('@"', '"'),
+ 'HARDESCAPE' => array('"'),
+ 'HARDCHAR' => '"',
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'abstract', 'add', 'as', 'base', 'break', 'by', 'case', 'catch', 'const', 'continue',
+ 'default', 'do', 'else', 'event', 'explicit', 'extern', 'false',
+ 'finally', 'fixed', 'for', 'foreach', 'from', 'get', 'goto', 'group', 'if',
+ 'implicit', 'in', 'into', 'internal', 'join', 'lock', 'namespace', 'null',
+ 'operator', 'out', 'override', 'params', 'partial', 'private',
+ 'protected', 'public', 'readonly', 'remove', 'ref', 'return', 'sealed',
+ 'select', 'set', 'stackalloc', 'static', 'switch', 'this', 'throw', 'true',
+ 'try', 'unsafe', 'using', 'var', 'value', 'virtual', 'volatile', 'where',
+ 'while', 'yield'
+ ),
+ 2 => array(
+ '#elif', '#endif', '#endregion', '#else', '#error', '#define', '#if',
+ '#line', '#region', '#undef', '#warning'
+ ),
+ 3 => array(
+ 'checked', 'is', 'new', 'sizeof', 'typeof', 'unchecked'
+ ),
+ 4 => array(
+ 'bool', 'byte', 'char', 'class', 'decimal', 'delegate', 'double',
+ 'dynamic', 'enum', 'float', 'int', 'interface', 'long', 'object', 'sbyte',
+ 'short', 'string', 'struct', 'uint', 'ulong', 'ushort', 'void'
+ ),
+ 5 => array(
+ 'Microsoft.Win32',
+ 'System',
+ 'System.CodeDOM',
+ 'System.CodeDOM.Compiler',
+ 'System.Collections',
+ 'System.Collections.Bases',
+ 'System.ComponentModel',
+ 'System.ComponentModel.Design',
+ 'System.ComponentModel.Design.CodeModel',
+ 'System.Configuration',
+ 'System.Configuration.Assemblies',
+ 'System.Configuration.Core',
+ 'System.Configuration.Install',
+ 'System.Configuration.Interceptors',
+ 'System.Configuration.Schema',
+ 'System.Configuration.Web',
+ 'System.Core',
+ 'System.Data',
+ 'System.Data.ADO',
+ 'System.Data.Design',
+ 'System.Data.Internal',
+ 'System.Data.SQL',
+ 'System.Data.SQLTypes',
+ 'System.Data.XML',
+ 'System.Data.XML.DOM',
+ 'System.Data.XML.XPath',
+ 'System.Data.XML.XSLT',
+ 'System.Diagnostics',
+ 'System.Diagnostics.SymbolStore',
+ 'System.DirectoryServices',
+ 'System.Drawing',
+ 'System.Drawing.Design',
+ 'System.Drawing.Drawing2D',
+ 'System.Drawing.Imaging',
+ 'System.Drawing.Printing',
+ 'System.Drawing.Text',
+ 'System.Globalization',
+ 'System.IO',
+ 'System.IO.IsolatedStorage',
+ 'System.Messaging',
+ 'System.Net',
+ 'System.Net.Sockets',
+ 'System.NewXml',
+ 'System.NewXml.XPath',
+ 'System.NewXml.Xsl',
+ 'System.Reflection',
+ 'System.Reflection.Emit',
+ 'System.Resources',
+ 'System.Runtime.InteropServices',
+ 'System.Runtime.InteropServices.Expando',
+ 'System.Runtime.Remoting',
+ 'System.Runtime.Serialization',
+ 'System.Runtime.Serialization.Formatters',
+ 'System.Runtime.Serialization.Formatters.Binary',
+ 'System.Security',
+ 'System.Security.Cryptography',
+ 'System.Security.Cryptography.X509Certificates',
+ 'System.Security.Permissions',
+ 'System.Security.Policy',
+ 'System.Security.Principal',
+ 'System.ServiceProcess',
+ 'System.Text',
+ 'System.Text.RegularExpressions',
+ 'System.Threading',
+ 'System.Timers',
+ 'System.Web',
+ 'System.Web.Caching',
+ 'System.Web.Configuration',
+ 'System.Web.Security',
+ 'System.Web.Services',
+ 'System.Web.Services.Description',
+ 'System.Web.Services.Discovery',
+ 'System.Web.Services.Protocols',
+ 'System.Web.UI',
+ 'System.Web.UI.Design',
+ 'System.Web.UI.Design.WebControls',
+ 'System.Web.UI.Design.WebControls.ListControls',
+ 'System.Web.UI.HtmlControls',
+ 'System.Web.UI.WebControls',
+ 'System.WinForms',
+ 'System.WinForms.ComponentModel',
+ 'System.WinForms.Design',
+ 'System.Xml',
+ 'System.Xml.Serialization',
+ 'System.Xml.Serialization.Code',
+ 'System.Xml.Serialization.Schema'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '+', '-', '*', '?', '=', '/', '%', '&', '>', '<', '^', '!', ':', ';',
+ '(', ')', '{', '}', '[', ']', '|', '.'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0600FF; font-weight: bold;',
+ 2 => 'color: #FF8000; font-weight: bold;',
+ 3 => 'color: #008000;',
+ 4 => 'color: #6666cc; font-weight: bold;',
+ 5 => 'color: #000000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008080; font-style: italic;',
+ 2 => 'color: #008080;',
+ 3 => 'color: #008080;',
+ 'MULTI' => 'color: #008080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #008080; font-weight: bold;',
+ 'HARD' => 'color: #008080; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #666666;',
+ 'HARD' => 'color: #666666;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0000FF;',
+ 2 => 'color: #0000FF;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.google.com/search?q={FNAMEL}+msdn.microsoft.com',
+ 4 => '',
+ 5 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#>|^])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_%\\-])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/css.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/css.php
new file mode 100644
index 00000000..d09bea7d
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/css.php
@@ -0,0 +1,226 @@
+<?php
+/*************************************************************************************
+ * css.php
+ * -------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/18
+ *
+ * CSS language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2004/11/27 (1.0.3)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.2)
+ * - Changed regexps to catch "-" symbols
+ * - Added support for URLs
+ * 2004/08/05 (1.0.1)
+ * - Added support for symbols
+ * 2004/07/14 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ * * Improve or drop regexps for class/id/psuedoclass highlighting
+ * * Re-look at keywords - possibly to make several CSS language
+ * files, all with different versions of CSS in them
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'CSS',
+ 'COMMENT_SINGLE' => array(1 => '@'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ 2 => "/(?<=\\()\\s*(?:(?:[a-z0-9]+?:\\/\\/)?[a-z0-9_\\-\\.\\/:]+?)?[a-z]+?\\.[a-z]+?(\\?[^\)]+?)?\\s*?(?=\\))/i"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', "'"),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ //1 => "#\\\\[nfrtv\$\"\n\\\\]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\[\da-fA-F]{1,6}\s?#i",
+ //Unicode Char Specs
+ //3 => "#\\\\u[\da-fA-F]{1,8}#i",
+ ),
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'aqua', 'azimuth', 'background-attachment', 'background-color',
+ 'background-image', 'background-position', 'background-repeat',
+ 'background', 'black', 'blue', 'border-bottom-color',
+ 'border-radius', 'border-top-left-radius', 'border-top-right-radius',
+ 'border-bottom-right-radius', 'border-bottom-left-radius',
+ 'border-bottom-style', 'border-bottom-width', 'border-left-color',
+ 'border-left-style', 'border-left-width', 'border-right',
+ 'border-right-color', 'border-right-style', 'border-right-width',
+ 'border-top-color', 'border-top-style',
+ 'border-top-width','border-bottom', 'border-collapse',
+ 'border-left', 'border-width', 'border-color', 'border-spacing',
+ 'border-style', 'border-top', 'border', 'caption-side', 'clear',
+ 'clip', 'color', 'content', 'counter-increment', 'counter-reset',
+ 'cue-after', 'cue-before', 'cue', 'cursor', 'direction', 'display',
+ 'elevation', 'empty-cells', 'float', 'font-family', 'font-size',
+ 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant',
+ 'font-weight', 'font', 'line-height', 'letter-spacing',
+ 'list-style', 'list-style-image', 'list-style-position',
+ 'list-style-type', 'margin-bottom', 'margin-left', 'margin-right',
+ 'margin-top', 'margin', 'marker-offset', 'marks', 'max-height',
+ 'max-width', 'min-height', 'min-width', 'orphans', 'outline',
+ 'outline-color', 'outline-style', 'outline-width', 'overflow',
+ 'padding-bottom', 'padding-left', 'padding-right', 'padding-top',
+ 'padding', 'page', 'page-break-after', 'page-break-before',
+ 'page-break-inside', 'pause-after', 'pause-before', 'pause',
+ 'pitch', 'pitch-range', 'play-during', 'position', 'quotes',
+ 'richness', 'right', 'size', 'speak-header', 'speak-numeral',
+ 'speak-punctuation', 'speak', 'speech-rate', 'stress',
+ 'table-layout', 'text-align', 'text-decoration', 'text-indent',
+ 'text-shadow', 'text-transform', 'top', 'unicode-bidi',
+ 'vertical-align', 'visibility', 'voice-family', 'volume',
+ 'white-space', 'widows', 'width', 'word-spacing', 'z-index',
+ 'bottom', 'left', 'height'
+ ),
+ 2 => array(
+ 'above', 'absolute', 'always', 'armenian', 'aural', 'auto',
+ 'avoid', 'baseline', 'behind', 'below', 'bidi-override', 'blink',
+ 'block', 'bold', 'bolder', 'both', 'capitalize', 'center-left',
+ 'center-right', 'center', 'circle', 'cjk-ideographic',
+ 'close-quote', 'collapse', 'condensed', 'continuous', 'crop',
+ 'crosshair', 'cross', 'cursive', 'dashed', 'decimal-leading-zero',
+ 'decimal', 'default', 'digits', 'disc', 'dotted', 'double',
+ 'e-resize', 'embed', 'extra-condensed', 'extra-expanded',
+ 'expanded', 'fantasy', 'far-left', 'far-right', 'faster', 'fast',
+ 'fixed', 'fuchsia', 'georgian', 'gray', 'green', 'groove',
+ 'hebrew', 'help', 'hidden', 'hide', 'higher', 'high',
+ 'hiragana-iroha', 'hiragana', 'icon', 'inherit', 'inline-table',
+ 'inline', 'inset', 'inside', 'invert', 'italic', 'justify',
+ 'katakana-iroha', 'katakana', 'landscape', 'larger', 'large',
+ 'left-side', 'leftwards', 'level', 'lighter', 'lime',
+ 'line-through', 'list-item', 'loud', 'lower-alpha', 'lower-greek',
+ 'lower-roman', 'lowercase', 'ltr', 'lower', 'low', 'maroon',
+ 'medium', 'message-box', 'middle', 'mix', 'monospace', 'n-resize',
+ 'narrower', 'navy', 'ne-resize', 'no-close-quote',
+ 'no-open-quote', 'no-repeat', 'none', 'normal', 'nowrap',
+ 'nw-resize', 'oblique', 'olive', 'once', 'open-quote', 'outset',
+ 'outside', 'overline', 'pointer', 'portrait', 'purple', 'px',
+ 'red', 'relative', 'repeat-x', 'repeat-y', 'repeat', 'rgb',
+ 'ridge', 'right-side', 'rightwards', 's-resize', 'sans-serif',
+ 'scroll', 'se-resize', 'semi-condensed', 'semi-expanded',
+ 'separate', 'serif', 'show', 'silent', 'silver', 'slow', 'slower',
+ 'small-caps', 'small-caption', 'smaller', 'soft', 'solid',
+ 'spell-out', 'square', 'static', 'status-bar', 'super',
+ 'sw-resize', 'table-caption', 'table-cell', 'table-column',
+ 'table-column-group', 'table-footer-group', 'table-header-group',
+ 'table-row', 'table-row-group', 'teal', 'text', 'text-bottom',
+ 'text-top', 'thick', 'thin', 'transparent', 'ultra-condensed',
+ 'ultra-expanded', 'underline', 'upper-alpha', 'upper-latin',
+ 'upper-roman', 'uppercase', 'url', 'visible', 'w-resize', 'wait',
+ 'white', 'wider', 'x-fast', 'x-high', 'x-large', 'x-loud',
+ 'x-low', 'x-small', 'x-soft', 'xx-large', 'xx-small', 'yellow',
+ 'yes'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', ':', ';',
+ '>', '+', '*', ',', '^', '='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #993333;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #a1a100;',
+ 2 => 'color: #ff0000; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ //1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #000099; font-weight: bold;'
+ //3 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #00AA00;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #00AA00;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #cc00cc;',
+ 1 => 'color: #6666ff;',
+ 2 => 'color: #3333ff;',
+ 3 => 'color: #933;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //DOM Node ID
+ 0 => '\#[a-zA-Z0-9\-_]+(?:\\\\:[a-zA-Z0-9\-_]+)*',
+ //CSS classname
+ 1 => '\.(?!\d)[a-zA-Z0-9\-_]+(?:\\\\:[a-zA-Z0-9\-_]+)*\b(?=[\{\.#\s,:].|<\|)',
+ //CSS Pseudo classes
+ //note: & is needed for &gt; (i.e. > )
+ 2 => '(?<!\\\\):(?!\d)[a-zA-Z0-9\-]+\b(?:\s*(?=[\{\.#a-zA-Z,:+*&](.|\n)|<\|))',
+ //Measurements
+ 3 => '[+\-]?(\d+|(\d*\.\d+))(em|ex|pt|px|cm|in|%)',
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_AFTER' => '(?![\-a-zA-Z0-9_\|%\\-&\.])',
+ 'DISALLOWED_BEFORE' => '(?<![\-a-zA-Z0-9_\|%\\~&\.])'
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cuesheet.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cuesheet.php
new file mode 100644
index 00000000..ebaca955
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/cuesheet.php
@@ -0,0 +1,138 @@
+<?php
+/*************************************************************************************
+ * cuesheet.php
+ * ----------
+ * Author: Benny Baumann (benbe@geshi.org)
+ * Copyright: (c) 2009 Benny Baumann (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/12/21
+ *
+ * Cuesheet language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/12/21 (1.0.8.6)
+ * - First Release
+ *
+ * TODO (updated 2009/12/21)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Cuesheet',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ //Single-Line Comments using REM command
+ 1 => "/(?<=\bREM\b).*?$/im",
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'CATALOG','CDTEXTFILE','FILE','FLAGS','INDEX','ISRC','PERFORMER',
+ 'POSTGAP','PREGAP','REM','SONGWRITER','TITLE','TRACK'
+ ),
+ 2 => array(
+ 'AIFF', 'BINARY', 'MOTOROLA', 'MP3', 'WAVE'
+ ),
+ 3 => array(
+ '4CH', 'DCP', 'PRE', 'SCMS'
+ ),
+ 4 => array(
+ 'AUDIO', 'CDG', 'MODE1/2048', 'MODE1/2336', 'MODE2/2336',
+ 'MODE2/2352', 'CDI/2336', 'CDI/2352'
+ )
+ ),
+ 'SYMBOLS' => array(
+ ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #000066; font-weight: bold;',
+ 3 => 'color: #000066; font-weight: bold;',
+ 4 => 'color: #000066; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #006600;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ 1 => 'color: #000099;',
+ 2 => 'color: #009900;',
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://digitalx.org/cuesheetsyntax.php#{FNAMEL}',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 2 => '\b[A-Za-z0-9]{5}\d{7}\b',
+ 1 => '(?<=[\s:]|^)\d+(?=[\s:]|$)',
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 2,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => '(?<![\w\.])',
+ 'DISALLOWED_AFTER' => '(?![\w\.])',
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/d.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/d.php
new file mode 100644
index 00000000..7f3e9857
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/d.php
@@ -0,0 +1,252 @@
+<?php
+/*************************************************************************************
+ * d.php
+ * -----
+ * Author: Thomas Kuehne (thomas@kuehne.cn)
+ * Contributors:
+ * - Jimmy Cao
+ * Copyright: (c) 2005 Thomas Kuehne (http://thomas.kuehne.cn/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/04/22
+ *
+ * D language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2011/06/28 (0.0.3) (Jimmy Cao)
+ * - added D2 features
+ * 2005/04/22 (0.0.2)
+ * - added _d_* and sizeof/ptrdiff_t
+ * 2005/04/20 (0.0.1)
+ * - First release
+ *
+ * TODO (updated 2005/04/22)
+ * -------------------------
+ * * nested comments
+ * * correct handling of r"" and ``
+ * * correct handling of ... and ..
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'D',
+ 'COMMENT_SINGLE' => array(2 => '///', 1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/', '/+' => '+/'),
+ 'COMMENT_REGEXP' => array(
+ // doxygen comments
+ 3 => '#/\*\*(?![\*\/]).*\*/#sU',
+ // raw strings
+ 4 => '#r"[^"]*"#s',
+ // Script Style interpreter comment
+ 5 => "/\A#!(?=\\/).*?$/m"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', "'"),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[abfnrtv\\'\"?\n\\\\]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{2}#",
+ //Hexadecimal Char Specs
+ 3 => "#\\\\u[\da-fA-F]{4}#",
+ //Hexadecimal Char Specs
+ 4 => "#\\\\U[\da-fA-F]{8}#",
+ //Octal Char Specs
+ 5 => "#\\\\[0-7]{1,3}#",
+ //Named entity escapes
+ /*6 => "#\\\\&(?:quot|amp|lt|gt|OElig|oelig|Scaron|scaron|Yuml|circ|tilde|".
+ "ensp|emsp|thinsp|zwnj|zwj|lrm|rlm|ndash|mdash|lsquo|rsquo|sbquo|".
+ "ldquo|rdquo|bdquo|dagger|Dagger|permil|lsaquo|rsaquo|euro|nbsp|".
+ "iexcl|cent|pound|curren|yen|brvbar|sect|uml|copy|ordf|laquo|not|".
+ "shy|reg|macr|deg|plusmn|sup2|sup3|acute|micro|para|middot|cedil|".
+ "sup1|ordm|raquo|frac14|frac12|frac34|iquest|Agrave|Aacute|Acirc|".
+ "Atilde|Auml|Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|".
+ "Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|Ouml|".
+ "times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|szlig|agrave|".
+ "aacute|acirc|atilde|auml|aring|aelig|ccedil|egrave|eacute|ecirc|".
+ "euml|igrave|iacute|icirc|iuml|eth|ntilde|ograve|oacute|ocirc|".
+ "otilde|ouml|divide|oslash|ugrave|uacute|ucirc|uuml|yacute|thorn|".
+ "yuml|fnof|Alpha|Beta|Gamma|Delta|Epsilon|Zeta|Eta|Theta|Iota|".
+ "Kappa|Lambda|Mu|Nu|Xi|Omicron|Pi|Rho|Sigma|Tau|Upsilon|Phi|Chi|".
+ "Psi|Omega|alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|".
+ "kappa|lambda|mu|nu|xi|omicron|pi|rho|sigmaf|sigma|tau|upsilon|".
+ "phi|chi|psi|omega|thetasym|upsih|piv|bull|hellip|prime|Prime|".
+ "oline|frasl|weierp|image|real|trade|alefsym|larr|uarr|rarr|darr|".
+ "harr|crarr|lArr|uArr|rArr|dArr|hArr|forall|part|exist|empty|".
+ "nabla|isin|notin|ni|prod|sum|minus|lowast|radic|prop|infin|ang|".
+ "and|or|cap|cup|int|there4|sim|cong|asymp|ne|equiv|le|ge|sub|sup|".
+ "nsub|sube|supe|oplus|otimes|perp|sdot|lceil|rceil|lfloor|rfloor|".
+ "lang|rang|loz|spades|clubs|hearts|diams);#",*/
+ // optimized:
+ 6 => "#\\\\&(?:A(?:Elig|acute|circ|grave|lpha|ring|tilde|uml)|Beta|".
+ "C(?:cedil|hi)|D(?:agger|elta)|E(?:TH|acute|circ|grave|psilon|ta|uml)|".
+ "Gamma|I(?:acute|circ|grave|ota|uml)|Kappa|Lambda|Mu|N(?:tilde|u)|".
+ "O(?:Elig|acute|circ|grave|m(?:ega|icron)|slash|tilde|uml)|".
+ "P(?:hi|i|rime|si)|Rho|S(?:caron|igma)|T(?:HORN|au|heta)|".
+ "U(?:acute|circ|grave|psilon|uml)|Xi|Y(?:acute|uml)|Zeta|".
+ "a(?:acute|c(?:irc|ute)|elig|grave|l(?:efsym|pha)|mp|n[dg]|ring|".
+ "symp|tilde|uml)|b(?:dquo|eta|rvbar|ull)|c(?:ap|cedil|e(?:dil|nt)|".
+ "hi|irc|lubs|o(?:ng|py)|rarr|u(?:p|rren))|d(?:Arr|a(?:gger|rr)|".
+ "e(?:g|lta)|i(?:ams|vide))|e(?:acute|circ|grave|m(?:pty|sp)|nsp|".
+ "psilon|quiv|t[ah]|u(?:ml|ro)|xist)|f(?:nof|orall|ra(?:c(?:1[24]|34)|sl))|".
+ "g(?:amma|e|t)|h(?:Arr|arr|e(?:arts|llip))|i(?:acute|circ|excl|grave|mage|".
+ "n(?:fin|t)|ota|quest|sin|uml)|kappa|l(?:Arr|a(?:mbda|ng|quo|rr)|ceil|".
+ "dquo|e|floor|o(?:wast|z)|rm|s(?:aquo|quo)|t)|m(?:acr|dash|".
+ "i(?:cro|ddot|nus)|u)|n(?:abla|bsp|dash|e|i|ot(?:in)?|sub|tilde|u)|".
+ "o(?:acute|circ|elig|grave|line|m(?:ega|icron)|plus|r(?:d[fm])?|".
+ "slash|ti(?:lde|mes)|uml)|p(?:ar[at]|er(?:mil|p)|hi|iv?|lusmn|ound|".
+ "r(?:ime|o[dp])|si)|quot|r(?:Arr|a(?:dic|ng|quo|rr)|ceil|dquo|e(?:al|g)|".
+ "floor|ho|lm|s(?:aquo|quo))|s(?:bquo|caron|dot|ect|hy|i(?:gmaf?|m)|".
+ "pades|u(?:be?|m|p[123e]?)|zlig)|t(?:au|h(?:e(?:re4|ta(?:sym)?)|insp|".
+ "orn)|i(?:lde|mes)|rade)|u(?:Arr|a(?:cute|rr)|circ|grave|ml|".
+ "psi(?:h|lon)|uml)|weierp|xi|y(?:acute|en|uml)|z(?:eta|w(?:j|nj)));#",
+ ),
+ 'HARDQUOTE' => array('`', '`'),
+ 'HARDESCAPE' => array(),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'break', 'case', 'continue', 'do', 'else',
+ 'for', 'foreach', 'goto', 'if', 'return',
+ 'switch', 'while', 'foreach_reverse'
+ ),
+ 2 => array(
+ 'alias', 'asm', 'assert', 'body', 'cast',
+ 'catch', 'default', 'delegate', 'delete',
+ 'extern', 'false', 'finally', 'function',
+ 'import', 'in', 'inout',
+ 'invariant', 'is', 'lazy', 'mixin', 'module', 'new',
+ 'null', 'out', 'pragma', 'ref', 'super', 'this',
+ 'throw', 'true', 'try', 'typeid',
+ 'typeof', 'union', 'with', 'scope'
+ ),
+ 3 => array(
+ 'ClassInfo', 'Error', 'Exception',
+ 'Interface', 'Object', 'IMonitor',
+ 'OffsetTypeInfo', 'Throwable',
+ 'TypeInfo_Class', 'TypeInfo', '__traits',
+ '__EOF__', '__FILE__', '__LINE__',
+ ),
+ 4 => array(
+ 'abstract', 'align', 'auto', 'bit', 'bool',
+ 'byte', 'cdouble', 'cfloat', 'char',
+ 'class', 'const', 'creal', 'dchar', 'dstring', 'debug',
+ 'deprecated', 'double', 'enum', 'export',
+ 'final', 'float', 'idouble', 'ifloat', 'immutable', 'int',
+ 'interface', 'ireal', 'long', 'nothrow', 'override',
+ 'package', 'private', 'protected', 'ptrdiff_t',
+ 'public', 'real', 'short', 'shared', 'size_t',
+ 'static', 'string', 'struct', 'synchronized',
+ 'template', 'ubyte', 'ucent', 'uint',
+ 'ulong', 'unittest', 'ushort', 'version',
+ 'void', 'volatile', 'wchar', 'wstring',
+ '__gshared', '@disable', '@property', 'pure', 'safe'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '?', '!', ';', ':', ',', '...', '..',
+ '+', '-', '*', '/', '%', '&', '|', '^', '<', '>', '=', '~',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #aaaadd; font-weight: bold;',
+ 4 => 'color: #993333;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #009933; font-style: italic;',
+ 3 => 'color: #009933; font-style: italic;',
+ 4 => 'color: #ff0000;',
+ 5 => 'color: #0040ff;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #660099; font-weight: bold;',
+ 3 => 'color: #660099; font-weight: bold;',
+ 4 => 'color: #660099; font-weight: bold;',
+ 5 => 'color: #006699; font-weight: bold;',
+ 6 => 'color: #666699; font-weight: bold; font-style: italic;',
+ 'HARD' => '',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;',
+ 'HARD' => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #208080;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color:#800080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI => 'color:#800080;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dcl.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dcl.php
new file mode 100644
index 00000000..db12a4c4
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dcl.php
@@ -0,0 +1,192 @@
+<?php
+/*************************************************************************************
+ * dcl.php
+ * --------
+ * Author: Petr Hendl (petr@hendl.cz)
+ * Copyright: (c) 2011 Petr Hendl http://hendl.cz/geshi/
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/02/17
+ *
+ * DCL language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2011-02-17 (1.0.8.11)
+ * - First Release
+ *
+ * TODO
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'DCL',
+ 'COMMENT_SINGLE' => array('$!', '!'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ 2 => '/(?<=\$)\s*sql\s+.*?(?:quit|exit);?\s*?$/sim' // do not highlight inline sql
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'HARDESCAPE' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ 1 => "/''[a-zA-Z\\-_]+'/"
+ ),
+ 'KEYWORDS' => array(
+ 1 => array( // commands
+ 'ACCOUNTING', 'ALLOCATE', 'ANALYZE', 'APPEND', 'ASSIGN', 'ATTACH', 'BACKUP',
+ 'CALL', 'CANCEL', 'CHECKSUM', 'CLOSE', 'CONNECT', 'CONTINUE', 'CONVERT',
+ 'COPY', 'CREATE', 'DEALLOCATE', 'DEASSIGN', 'DEBUG', 'DECK',
+ 'DECRYPT', 'DEFINE', 'DELETE', 'DEPOSIT', 'DIFFERENCES', 'DIRECTORY',
+ 'DISABLE', 'AUTOSTART', 'DISCONNECT', 'DISMOUNT', 'DUMP', 'EDIT', 'ENABLE',
+ 'ENCRYPT', 'ENDSUBROUTINE', 'EOD', 'EOJ', 'EXAMINE', 'EXCHANGE',
+ 'EXIT', 'FONT', 'GOSUB', 'GOTO', 'HELP', 'IF', 'THEN', 'ELSE', 'ENDIF', 'INITIALIZE', 'INQUIRE',
+ 'INSTALL', 'JAVA', 'JOB', 'LIBRARY', 'LICENSE', 'LINK', 'LOGIN', 'LOGOUT',
+ 'MACRO', 'MAIL', 'MERGE', 'MESSAGE', 'MONITOR', 'MOUNT', 'NCS', 'ON', 'OPEN',
+ 'PASSWORD', 'PATCH', 'PHONE', 'PIPE', 'PPPD', 'PRINT', 'PRODUCT', 'PURGE',
+ 'READ', 'RECALL', 'RENAME', 'REPLY', 'REQUEST', 'RETURN', 'RMU', 'RUN', 'RUNOFF',
+ 'SEARCH', 'SET', 'SET AUDIT', 'SET BOOTBLOCK', 'SET BROADCAST',
+ 'SET CACHE', 'SET CARD_READER', 'SET CLUSTER', 'SET COMMAND', 'SET CONTROL',
+ 'SET CPU', 'SET DAY', 'SET DEFAULT', 'SET DEVICE', 'SET DIRECTORY',
+ 'SET DISPLAY', 'SET ENTRY', 'SET FILE', 'SET HOST', 'SET IMAGE', 'SET KEY',
+ 'SET LOGINS', 'SET MAGTAPE', 'SET MESSAGE', 'SET NETWORK', 'SET ON', 'SET OUTPUT_RATE',
+ 'SET PASSWORD', 'SET PREFERRED_PATH', 'SET PREFIX', 'SET PRINTER', 'SET PROCESS',
+ 'SET PROMPT', 'SET PROTECTION', 'SET QUEUE', 'SET RESTART_VALUE',
+ 'SET RIGHTS_LIST', 'SET RMS_DEFAULT', 'SET ROOT', 'SET SECURITY',
+ 'SET SERVER ACME_SERVER', 'SET SERVER REGISTRY_SERVER', 'SET SERVER SECURITY_SERVER',
+ 'SET SHADOW', 'SET SYMBOL', 'SET TERMINAL', 'SET TIME', 'SET VERIFY',
+ 'SET VOLUME', 'SET WORKING_SET', 'SHOW', 'SHOW AUDIT',
+ 'SHOW BROADCAST', 'SHOW CLUSTER', 'SHOW CPU', 'SHOW DEFAULT', 'SHOW DEVICES',
+ 'SHOW DISPLAY', 'SHOW ENTRY', 'SHOW ERROR', 'SHOW FASTPATH', 'SHOW IMAGE',
+ 'SHOW INTRUSION', 'SHOW KEY', 'SHOW LICENSE', 'SHOW LOGICAL', 'SHOW MEMORY',
+ 'SHOW NETWORK', 'SHOW PRINTER', 'SHOW PROCESS', 'SHOW PROTECTION', 'SHOW QUEUE',
+ 'SHOW QUOTA', 'SHOW RMS_DEFAULT', 'SHOW ROOT', 'SHOW SECURITY',
+ 'SHOW SERVER ACME_SERVER', 'SHOW SERVER REGISTRY_SERVER', 'SHOW SHADOW',
+ 'SHOW STATUS', 'SHOW SYMBOL', 'SHOW SYSTEM', 'SHOW TERMINAL', 'SHOW TIME',
+ 'SHOW TRANSLATION', 'SHOW USERS', 'SHOW WORKING_SET', 'SHOW ZONE', 'SORT',
+ 'SPAWN', 'START', 'STOP', 'SUBMIT', 'SUBROUTINE', 'SYNCHRONIZE', 'TYPE',
+ 'UNLOCK', 'VIEW', 'WAIT', 'WRITE', 'XAUTH'
+ ),
+ 2 => array( // lexical functions
+ 'F$CONTEXT', 'F$CSID', 'F$CUNITS', 'F$CVSI', 'F$CVTIME', 'F$CVUI',
+ 'F$DELTA_TIME', 'F$DEVICE', 'F$DIRECTORY', 'F$EDIT', 'F$ELEMENT',
+ 'F$ENVIRONMENT', 'F$EXTRACT', 'F$FAO', 'F$FID_TO_NAME', 'F$FILE_ATTRIBUTES',
+ 'F$GETDVI', 'F$GETENV', 'F$GETJPI', 'F$GETQUI', 'F$GETSYI', 'F$IDENTIFIER',
+ 'F$INTEGER', 'F$LENGTH', 'F$LICENSE', 'F$LOCATE', 'F$MATCH_WILD', 'F$MESSAGE',
+ 'F$MODE', 'F$MULTIPATH', 'F$PARSE', 'F$PID', 'F$PRIVILEGE', 'F$PROCESS',
+ 'F$SEARCH', 'F$SETPRV', 'F$STRING', 'F$TIME', 'F$TRNLNM', 'F$TYPE', 'F$UNIQUE',
+ 'F$USER', 'F$VERIFY'
+ ),
+ 3 => array( // special variables etc
+ 'sql$database', 'P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7', 'P8', 'P9',
+ '$status', '$severity', 'sys$login', 'sys$system',
+ 'sys$input', 'sys$output', 'sys$pipe'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '@', '&', '|', '<', '>', '-',
+ '.eqs.', '.eq.', '.lt.', '.lts.', '.gt.', '.gts.', '.ne.', '.nes.',
+ '.le.', '.ge.', '.ges.', '.les.',
+ '.EQS.', '.EQ.', '.LT.', '.LTS.', '.GT.', '.GTS.', '.NE.', '.NES.',
+ '.LE.', '.GE.', '.GES.', '.LES.',
+ '.and.', '.or.', '.not.',
+ '.AND.', '.OR.', '.NOT.',
+ '==', ':==', '=', ':='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #0066FF;',
+ 3 => 'color: #993300;'
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #666666; font-style: italic;',
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #9999FF; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #006666;',
+ 1 => 'color: #0099FF;',
+ 2 => 'color: red;',
+ 3 => 'color: #007800;',
+ 4 => 'color: #007800;',
+ 5 => 'color: #780078;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #7a0874; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0099FF;', // variables
+ 1 => 'color: #0000FF;', // qualifiers
+ 2 => 'color: #FF6600; font-weight: bold;' // labels
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ // variables
+ 0 => "'[a-zA-Z_\\-$]+'",
+ // qualifiers and parameters
+ 1 => "(?:\/[a-zA-Z_\/]+)[\s=]",
+ // labels
+ 2 => '(?<=\$)\s*[a-zA-Z\-_]+:'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'COMMENTS' => array(
+ ),
+ 'KEYWORDS' => array(
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dcpu16.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dcpu16.php
new file mode 100644
index 00000000..5fcb25e5
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dcpu16.php
@@ -0,0 +1,131 @@
+<?php
+/*************************************************************************************
+ * dcpu16.php
+ * -------
+ * Author: Benny Baumann (BenBE@omorphia.de)
+ * Copyright: (c) 2007-2012 Benny Baumann (http://geshi.org/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2012/04/12
+ *
+ * DCPU/16 Assembly language file for GeSHi.
+ * Syntax definition based on http://0x10c.com/doc/dcpu-16.txt
+ *
+ * CHANGES
+ * -------
+ * 2012/04/12 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2012/04/12)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'DCPU-16 Assembly',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'NUMBERS' => GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_HEX_PREFIX,
+ 'KEYWORDS' => array(
+ /*CPU*/
+ 1 => array(
+ 'set','add','sub','mul','div','mod','shl','shr','and','bor','xor',
+ 'ife','ifn','ifg','ifb',
+ 'jsr'
+ ),
+ /*registers*/
+ 2 => array(
+ 'a','b','c','x','y','z','i','j',
+ 'pc','sp','o',
+ 'pop','peek','push' //Special cases with DCPU-16
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '[', ']', '+', '-', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000088; font-weight:bold;',
+ 2 => 'color: #0000ff;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000088;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #880000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'REGEXPS' => array(
+ 2 => 'color: #993333;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://0x10c.com/doc/dcpu-16.txt',
+ 2 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Hex numbers
+ //0 => '0[0-9a-fA-F]{1,32}[hH]',
+ //Binary numbers
+ //1 => '\%[01]{1,64}|[01]{1,64}[bB]?(?![^<]*>)',
+ //Labels
+ 2 => '^:[_a-zA-Z][_a-zA-Z0-9]?(?=\s|$)'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#\/])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_\|%\\-])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dcs.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dcs.php
new file mode 100644
index 00000000..d32cfc5b
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dcs.php
@@ -0,0 +1,182 @@
+<?php
+/*************************************************************************************
+ * dcs.php
+ * ---------------------------------
+ * Author: Stelio Passaris (GeSHi@stelio.net)
+ * Copyright: (c) 2009 Stelio Passaris (http://stelio.net/stiki/GeSHi)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/01/20
+ *
+ * DCS language file for GeSHi.
+ *
+ * DCS (Data Conversion System) is part of Sungard iWorks' Prophet suite and is used
+ * to convert external data files into a format that Prophet and Glean can read.
+ * See http://www.prophet-web.com/Products/DCS for product information.
+ * This language file is current for DCS version 7.3.2.
+ *
+ * Note that the DCS IDE does not handle escape characters correctly. The IDE thinks
+ * that a backslash '\' is an escape character, but in practice the backslash does
+ * not escape the string delimiter character '"' when the program runs. A '\\' is
+ * escaped to '\' when the program runs, but '\"' is treated as '\' at the end of a
+ * string. Therefore in this language file, we do not recognise the backslash as an
+ * escape character. For the purposes of GeSHi, there is no character escaping.
+ *
+ * CHANGES
+ * -------
+ * 2009/02/21 (1.0.8.3)
+ * - First Release
+ *
+ * TODO (updated 2009/02/21)
+ * -------------------------
+ * * Add handling for embedded C code. Note that the DCS IDE does not highlight C code
+ * correctly, but that doesn't mean that we can't! This will be included for a
+ * stable release of GeSHi of version 1.1.x (or later) that allows for highlighting
+ * embedded code using that code's appropriate language file.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'DCS',
+ 'COMMENT_SINGLE' => array(
+ 1 => ';'
+ ),
+ 'COMMENT_MULTI' => array(
+ ),
+ 'COMMENT_REGEXP' => array(
+ // Highlight embedded C code in a separate color:
+ 2 => '/\bINSERT_C_CODE\b.*?\bEND_C_CODE\b/ims'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
+ 'QUOTEMARKS' => array(
+ '"'
+ ),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => '',
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'abs', 'ascii_value', 'bit_value', 'blank_date', 'calc_unit_values', 'cm',
+ 'complete_months', 'complete_years', 'correct', 'create_input_file', 'cy',
+ 'date_convert', 'day', 'del_output_separator',
+ 'delete_existing_output_files', 'div', 'ex', 'exact_years', 'exp',
+ 'extract_date', 'failed_validation', 'file_number', 'first_record',
+ 'fract', 'fund_fac_a', 'fund_fac_b', 'fund_fac_c', 'fund_fac_d',
+ 'fund_fac_e', 'fund_fac_f', 'fund_fac_g', 'fund_fac_h', 'fund_fac_i',
+ 'fund_fac_j', 'fund_fac_k', 'fund_fac_l', 'fund_fac_m', 'fund_fac_n',
+ 'fund_fac_o', 'fund_fac_p', 'fund_fac_q', 'fund_fac_r', 'fund_fac_s',
+ 'fund_fac_t', 'fund_fac_u', 'fund_fac_v', 'fund_fac_w', 'fund_fac_x',
+ 'fund_fac_y', 'fund_fac_z', 'group', 'group_record',
+ 'input_file_date_time', 'input_file_extension', 'input_file_location',
+ 'input_file_name', 'int', 'invalid', 'last_record', 'leap_year', 'len',
+ 'ln', 'log', 'main_format_name', 'max', 'max_num_subrecords', 'message',
+ 'min', 'mod', 'month', 'months_add', 'months_sub', 'nearest_months',
+ 'nearest_years', 'next_record', 'nm', 'no_of_current_records',
+ 'no_of_records', 'numval', 'ny', 'output', 'output_array_as_constants',
+ 'output_file_path', 'output_record', 'pmdf_output', 'previous', 'rand',
+ 're_start', 'read_generic_table', 'read_generic_table_text',
+ 'read_input_footer', 'read_input_footer_text', 'read_input_header',
+ 'read_input_header_text', 'record_count', 'record_suppressed', 'round',
+ 'round_down', 'round_near', 'round_up', 'run_dcs_program', 'run_parameter',
+ 'run_parameter_text', 'set_main_record', 'set_num_subrecords',
+ 'sort_array', 'sort_current_records', 'sort_input', 'strval', 'substr',
+ 'summarise', 'summarise_record', 'summarise_units',
+ 'summarise_units_record', 'suppress_record', 'table_correct',
+ 'table_validate', 'terminate', 'time', 'today', 'trim', 'ubound', 'year',
+ 'years_add', 'years_sub'
+ ),
+ 2 => array(
+ 'and', 'as', 'begin', 'boolean', 'byref', 'byval', 'call', 'case', 'date',
+ 'default', 'do', 'else', 'elseif', 'end_c_code', 'endfor', 'endfunction',
+ 'endif', 'endproc', 'endswitch', 'endwhile', 'eq',
+ 'explicit_declarations', 'false', 'for', 'from', 'function', 'ge', 'gt',
+ 'if', 'insert_c_code', 'integer', 'le', 'loop', 'lt', 'ne', 'not',
+ 'number', 'or', 'private', 'proc', 'public', 'quitloop', 'return',
+ 'short', 'step', 'switch', 'text', 'then', 'to', 'true', 'while'
+ ),
+ 3 => array(
+ // These keywords are not highlighted by the DCS IDE but we may as well
+ // keep track of them anyway:
+ 'mp_file', 'odbc_file'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']',
+ '=', '<', '>',
+ '+', '-', '*', '/', '^',
+ ':', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: red;',
+ 2 => 'color: blue;',
+ 3 => 'color: black;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: black; background-color: silver;',
+ // Colors for highlighting embedded C code:
+ 2 => 'color: maroon; background-color: pink;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: black;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: green;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: green;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: black;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ ),
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/delphi.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/delphi.php
new file mode 100644
index 00000000..d5596e0c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/delphi.php
@@ -0,0 +1,301 @@
+<?php
+/*************************************************************************************
+ * delphi.php
+ * ----------
+ * Author: J�rja Norbert (jnorbi@vipmail.hu), Benny Baumann (BenBE@omorphia.de)
+ * Copyright: (c) 2004 J�rja Norbert, Benny Baumann (BenBE@omorphia.de), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/07/26
+ *
+ * Delphi (Object Pascal) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/06/27 (1.0.8.11)
+ * - Added some keywords
+ * - fixed hex numbers and hex char literals (including WideChar)
+ * - Added support for FPC-Style generics
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2005/11/19 (1.0.3)
+ * - Updated the very incomplete keyword and type lists
+ * 2005/09/03 (1.0.2)
+ * - Added support for hex numbers and string entities
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Delphi',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('(*' => '*)', '{' => '}'),
+ //Compiler directives
+ 'COMMENT_REGEXP' => array(2 => '/\\{\\$.*?}|\\(\\*\\$.*?\\*\\)/U'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'"),
+ 'ESCAPE_CHAR' => '',
+
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'Abstract', 'And', 'Array', 'As', 'Asm', 'At', 'Begin', 'Case',
+ 'Class', 'Const', 'Constructor', 'Contains', 'Default', 'delayed', 'Destructor',
+ 'DispInterface', 'Div', 'Do', 'DownTo', 'Else', 'End', 'Except',
+ 'Export', 'Exports', 'External', 'File', 'Finalization', 'Finally', 'For',
+ 'Function', 'Generic', 'Goto', 'If', 'Implementation', 'In', 'Inherited',
+ 'Initialization', 'Inline', 'Interface', 'Is', 'Label', 'Library', 'Message',
+ 'Mod', 'Nil', 'Not', 'Object', 'Of', 'On', 'Or', 'Overload', 'Override',
+ 'Package', 'Packed', 'Private', 'Procedure', 'Program', 'Property',
+ 'Protected', 'Public', 'Published', 'Read', 'Raise', 'Record', 'Register',
+ 'Repeat', 'Requires', 'Resourcestring', 'Set', 'Shl', 'Shr', 'Specialize', 'Stored',
+ 'Then', 'ThreadVar', 'To', 'Try', 'Type', 'Unit', 'Until', 'Uses', 'Var',
+ 'Virtual', 'While', 'With', 'Write', 'Xor', 'assembler', 'far',
+ 'near', 'pascal', 'cdecl', 'safecall', 'stdcall', 'varargs'
+ ),
+ 2 => array(
+ 'false', 'self', 'true',
+ ),
+ 3 => array(
+ 'Abs', 'AcquireExceptionObject', 'Addr', 'AnsiToUtf8', 'Append', 'ArcTan',
+ 'Assert', 'AssignFile', 'Assigned', 'BeginThread', 'BlockRead',
+ 'BlockWrite', 'Break', 'ChDir', 'Chr', 'Close', 'CloseFile',
+ 'CompToCurrency', 'CompToDouble', 'Concat', 'Continue', 'Copy', 'Cos',
+ 'Dec', 'Delete', 'Dispose', 'DoubleToComp', 'EndThread', 'EnumModules',
+ 'EnumResourceModules', 'Eof', 'Eoln', 'Erase', 'ExceptAddr',
+ 'ExceptObject', 'Exclude', 'Exit', 'Exp', 'FilePos', 'FileSize',
+ 'FillChar', 'Finalize', 'FindClassHInstance', 'FindHInstance',
+ 'FindResourceHInstance', 'Flush', 'Frac', 'FreeMem', 'Get8087CW',
+ 'GetDir', 'GetLastError', 'GetMem', 'GetMemoryManager',
+ 'GetModuleFileName', 'GetVariantManager', 'Halt', 'Hi', 'High',
+ 'IOResult', 'Inc', 'Include', 'Initialize', 'Insert', 'Int',
+ 'IsMemoryManagerSet', 'IsVariantManagerSet', 'Length', 'Ln', 'Lo', 'Low',
+ 'MkDir', 'Move', 'New', 'Odd', 'OleStrToStrVar', 'OleStrToString', 'Ord',
+ 'PUCS4Chars', 'ParamCount', 'ParamStr', 'Pi', 'Pos', 'Pred', 'Ptr',
+ 'Random', 'Randomize', 'Read', 'ReadLn', 'ReallocMem',
+ 'ReleaseExceptionObject', 'Rename', 'Reset', 'Rewrite', 'RmDir', 'Round',
+ 'RunError', 'Seek', 'SeekEof', 'SeekEoln', 'Set8087CW', 'SetLength',
+ 'SetLineBreakStyle', 'SetMemoryManager', 'SetString', 'SetTextBuf',
+ 'SetVariantManager', 'Sin', 'SizeOf', 'Slice', 'Sqr', 'Sqrt', 'Str',
+ 'StringOfChar', 'StringToOleStr', 'StringToWideChar', 'Succ', 'Swap',
+ 'Trunc', 'Truncate', 'TypeInfo', 'UCS4StringToWideString', 'UTF8Decode',
+ 'UTF8Encode', 'UnicodeToUtf8', 'UniqueString', 'UpCase', 'Utf8ToAnsi',
+ 'Utf8ToUnicode', 'Val', 'VarArrayRedim', 'VarClear',
+ 'WideCharLenToStrVar', 'WideCharLenToString', 'WideCharToStrVar',
+ 'WideCharToString', 'WideStringToUCS4String', 'Write', 'WriteLn',
+
+ 'Abort', 'AddExitProc', 'AddTerminateProc', 'AdjustLineBreaks', 'AllocMem',
+ 'AnsiCompareFileName', 'AnsiCompareStr', 'AnsiCompareText',
+ 'AnsiDequotedStr', 'AnsiExtractQuotedStr', 'AnsiLastChar',
+ 'AnsiLowerCase', 'AnsiLowerCaseFileName', 'AnsiPos', 'AnsiQuotedStr',
+ 'AnsiSameStr', 'AnsiSameText', 'AnsiStrComp', 'AnsiStrIComp',
+ 'AnsiStrLComp', 'AnsiStrLIComp', 'AnsiStrLastChar', 'AnsiStrLower',
+ 'AnsiStrPos', 'AnsiStrRScan', 'AnsiStrScan', 'AnsiStrUpper',
+ 'AnsiUpperCase', 'AnsiUpperCaseFileName', 'AppendStr', 'AssignStr',
+ 'Beep', 'BoolToStr', 'ByteToCharIndex', 'ByteToCharLen', 'ByteType',
+ 'CallTerminateProcs', 'ChangeFileExt', 'CharLength', 'CharToByteIndex',
+ 'CharToByteLen', 'CompareMem', 'CompareStr', 'CompareText', 'CreateDir',
+ 'CreateGUID', 'CurrToStr', 'CurrToStrF', 'CurrentYear', 'Date',
+ 'DateTimeToFileDate', 'DateTimeToStr', 'DateTimeToString',
+ 'DateTimeToSystemTime', 'DateTimeToTimeStamp', 'DateToStr', 'DayOfWeek',
+ 'DecodeDate', 'DecodeDateFully', 'DecodeTime', 'DeleteFile',
+ 'DirectoryExists', 'DiskFree', 'DiskSize', 'DisposeStr', 'EncodeDate',
+ 'EncodeTime', 'ExceptionErrorMessage', 'ExcludeTrailingBackslash',
+ 'ExcludeTrailingPathDelimiter', 'ExpandFileName', 'ExpandFileNameCase',
+ 'ExpandUNCFileName', 'ExtractFileDir', 'ExtractFileDrive',
+ 'ExtractFileExt', 'ExtractFileName', 'ExtractFilePath',
+ 'ExtractRelativePath', 'ExtractShortPathName', 'FileAge', 'FileClose',
+ 'FileCreate', 'FileDateToDateTime', 'FileExists', 'FileGetAttr',
+ 'FileGetDate', 'FileIsReadOnly', 'FileOpen', 'FileRead', 'FileSearch',
+ 'FileSeek', 'FileSetAttr', 'FileSetDate', 'FileSetReadOnly', 'FileWrite',
+ 'FinalizePackage', 'FindClose', 'FindCmdLineSwitch', 'FindFirst',
+ 'FindNext', 'FloatToCurr', 'FloatToDateTime', 'FloatToDecimal',
+ 'FloatToStr', 'FloatToStrF', 'FloatToText', 'FloatToTextFmt',
+ 'FmtLoadStr', 'FmtStr', 'ForceDirectories', 'Format', 'FormatBuf',
+ 'FormatCurr', 'FormatDateTime', 'FormatFloat', 'FreeAndNil',
+ 'GUIDToString', 'GetCurrentDir', 'GetEnvironmentVariable',
+ 'GetFileVersion', 'GetFormatSettings', 'GetLocaleFormatSettings',
+ 'GetModuleName', 'GetPackageDescription', 'GetPackageInfo', 'GetTime',
+ 'IncAMonth', 'IncMonth', 'IncludeTrailingBackslash',
+ 'IncludeTrailingPathDelimiter', 'InitializePackage', 'IntToHex',
+ 'IntToStr', 'InterlockedDecrement', 'InterlockedExchange',
+ 'InterlockedExchangeAdd', 'InterlockedIncrement', 'IsDelimiter',
+ 'IsEqualGUID', 'IsLeapYear', 'IsPathDelimiter', 'IsValidIdent',
+ 'Languages', 'LastDelimiter', 'LoadPackage', 'LoadStr', 'LowerCase',
+ 'MSecsToTimeStamp', 'NewStr', 'NextCharIndex', 'Now', 'OutOfMemoryError',
+ 'QuotedStr', 'RaiseLastOSError', 'RaiseLastWin32Error', 'RemoveDir',
+ 'RenameFile', 'ReplaceDate', 'ReplaceTime', 'SafeLoadLibrary',
+ 'SameFileName', 'SameText', 'SetCurrentDir', 'ShowException', 'Sleep',
+ 'StrAlloc', 'StrBufSize', 'StrByteType', 'StrCat', 'StrCharLength',
+ 'StrComp', 'StrCopy', 'StrDispose', 'StrECopy', 'StrEnd', 'StrFmt',
+ 'StrIComp', 'StrLCat', 'StrLComp', 'StrLCopy', 'StrLFmt', 'StrLIComp',
+ 'StrLen', 'StrLower', 'StrMove', 'StrNew', 'StrNextChar', 'StrPCopy',
+ 'StrPLCopy', 'StrPas', 'StrPos', 'StrRScan', 'StrScan', 'StrToBool',
+ 'StrToBoolDef', 'StrToCurr', 'StrToCurrDef', 'StrToDate', 'StrToDateDef',
+ 'StrToDateTime', 'StrToDateTimeDef', 'StrToFloat', 'StrToFloatDef',
+ 'StrToInt', 'StrToInt64', 'StrToInt64Def', 'StrToIntDef', 'StrToTime',
+ 'StrToTimeDef', 'StrUpper', 'StringReplace', 'StringToGUID', 'Supports',
+ 'SysErrorMessage', 'SystemTimeToDateTime', 'TextToFloat', 'Time',
+ 'TimeStampToDateTime', 'TimeStampToMSecs', 'TimeToStr', 'Trim',
+ 'TrimLeft', 'TrimRight', 'TryEncodeDate', 'TryEncodeTime',
+ 'TryFloatToCurr', 'TryFloatToDateTime', 'TryStrToBool', 'TryStrToCurr',
+ 'TryStrToDate', 'TryStrToDateTime', 'TryStrToFloat', 'TryStrToInt',
+ 'TryStrToInt64', 'TryStrToTime', 'UnloadPackage', 'UpperCase',
+ 'WideCompareStr', 'WideCompareText', 'WideFmtStr', 'WideFormat',
+ 'WideFormatBuf', 'WideLowerCase', 'WideSameStr', 'WideSameText',
+ 'WideUpperCase', 'Win32Check', 'WrapText',
+
+ 'ActivateClassGroup', 'AllocateHwnd', 'BinToHex', 'CheckSynchronize',
+ 'CollectionsEqual', 'CountGenerations', 'DeallocateHwnd', 'EqualRect',
+ 'ExtractStrings', 'FindClass', 'FindGlobalComponent', 'GetClass',
+ 'GroupDescendantsWith', 'HexToBin', 'IdentToInt',
+ 'InitInheritedComponent', 'IntToIdent', 'InvalidPoint',
+ 'IsUniqueGlobalComponentName', 'LineStart', 'ObjectBinaryToText',
+ 'ObjectResourceToText', 'ObjectTextToBinary', 'ObjectTextToResource',
+ 'PointsEqual', 'ReadComponentRes', 'ReadComponentResEx',
+ 'ReadComponentResFile', 'Rect', 'RegisterClass', 'RegisterClassAlias',
+ 'RegisterClasses', 'RegisterComponents', 'RegisterIntegerConsts',
+ 'RegisterNoIcon', 'RegisterNonActiveX', 'SmallPoint', 'StartClassGroup',
+ 'TestStreamFormat', 'UnregisterClass', 'UnregisterClasses',
+ 'UnregisterIntegerConsts', 'UnregisterModuleClasses',
+ 'WriteComponentResFile',
+
+ 'ArcCos', 'ArcCosh', 'ArcCot', 'ArcCotH', 'ArcCsc', 'ArcCscH', 'ArcSec',
+ 'ArcSecH', 'ArcSin', 'ArcSinh', 'ArcTan2', 'ArcTanh', 'Ceil',
+ 'CompareValue', 'Cosecant', 'Cosh', 'Cot', 'CotH', 'Cotan', 'Csc', 'CscH',
+ 'CycleToDeg', 'CycleToGrad', 'CycleToRad', 'DegToCycle', 'DegToGrad',
+ 'DegToRad', 'DivMod', 'DoubleDecliningBalance', 'EnsureRange', 'Floor',
+ 'Frexp', 'FutureValue', 'GetExceptionMask', 'GetPrecisionMode',
+ 'GetRoundMode', 'GradToCycle', 'GradToDeg', 'GradToRad', 'Hypot',
+ 'InRange', 'IntPower', 'InterestPayment', 'InterestRate',
+ 'InternalRateOfReturn', 'IsInfinite', 'IsNan', 'IsZero', 'Ldexp', 'LnXP1',
+ 'Log10', 'Log2', 'LogN', 'Max', 'MaxIntValue', 'MaxValue', 'Mean',
+ 'MeanAndStdDev', 'Min', 'MinIntValue', 'MinValue', 'MomentSkewKurtosis',
+ 'NetPresentValue', 'Norm', 'NumberOfPeriods', 'Payment', 'PeriodPayment',
+ 'Poly', 'PopnStdDev', 'PopnVariance', 'Power', 'PresentValue',
+ 'RadToCycle', 'RadToDeg', 'RadToGrad', 'RandG', 'RandomRange', 'RoundTo',
+ 'SLNDepreciation', 'SYDDepreciation', 'SameValue', 'Sec', 'SecH',
+ 'Secant', 'SetExceptionMask', 'SetPrecisionMode', 'SetRoundMode', 'Sign',
+ 'SimpleRoundTo', 'SinCos', 'Sinh', 'StdDev', 'Sum', 'SumInt',
+ 'SumOfSquares', 'SumsAndSquares', 'Tan', 'Tanh', 'TotalVariance',
+ 'Variance'
+ ),
+ 4 => array(
+ 'AnsiChar', 'AnsiString', 'Bool', 'Boolean', 'Byte', 'ByteBool', 'Cardinal', 'Char',
+ 'Comp', 'Currency', 'DWORD', 'Double', 'Extended', 'Int64', 'Integer', 'IUnknown',
+ 'LongBool', 'LongInt', 'LongWord', 'PAnsiChar', 'PAnsiString', 'PBool', 'PBoolean', 'PByte',
+ 'PByteArray', 'PCardinal', 'PChar', 'PComp', 'PCurrency', 'PDWORD', 'PDate', 'PDateTime',
+ 'PDouble', 'PExtended', 'PInt64', 'PInteger', 'PLongInt', 'PLongWord', 'Pointer', 'PPointer',
+ 'PShortInt', 'PShortString', 'PSingle', 'PSmallInt', 'PString', 'PHandle', 'PVariant', 'PWord',
+ 'PWordArray', 'PWordBool', 'PWideChar', 'PWideString', 'Real', 'Real48', 'ShortInt', 'ShortString',
+ 'Single', 'SmallInt', 'String', 'TClass', 'TDate', 'TDateTime', 'TextFile', 'THandle',
+ 'TObject', 'TTime', 'Variant', 'WideChar', 'WideString', 'Word', 'WordBool'
+ ),
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '[', ']'),
+ 1 => array('.', ',', ':', ';'),
+ 2 => array('@', '^'),
+ 3 => array('=', '+', '-', '*', '/')
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;',
+ 4 => 'color: #000066; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #008000; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #ff0000; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000066;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000cc;',
+ 1 => 'color: #ff0000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066;',
+ 1 => 'color: #000066;',
+ 2 => 'color: #000066;',
+ 3 => 'color: #000066;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ //Hex numbers
+ 0 => '(?<!\#)\$[0-9a-fA-F]+(?!\w)',
+ //Characters
+ 1 => '\#(?:\$[0-9a-fA-F]{1,4}|\d{1,5})'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 2,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 3 => array(
+ 'DISALLOWED_AFTER' => '(?=\s*[(;])'
+ )
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/diff.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/diff.php
new file mode 100644
index 00000000..5b681717
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/diff.php
@@ -0,0 +1,196 @@
+<?php
+/*************************************************************************************
+ * diff.php
+ * --------
+ * Author: Conny Brunnkvist (conny@fuchsia.se), W. Tasin (tasin@fhm.edu)
+ * Copyright: (c) 2004 Fuchsia Open Source Solutions (http://www.fuchsia.se/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/12/29
+ *
+ * Diff-output language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2006/02/27
+ * - changing language file to use matching of start (^) and end ($) (wt)
+ * 2004/12/29 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2006/02/27)
+ * -------------------------
+ *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+
+$language_data = array (
+ 'LANG_NAME' => 'Diff',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => ' ',
+ 'KEYWORDS' => array(
+ 1 => array(
+ '\ No newline at end of file'
+ ),
+// 2 => array(
+// '***************' /* This only seems to works in some cases? */
+// ),
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'CASE_SENSITIVE' => array(
+ 1 => false,
+// 2 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #aaaaaa; font-style: italic;',
+// 2 => 'color: #dd6611;',
+ ),
+ 'COMMENTS' => array(
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => ''
+ ),
+ 'STRINGS' => array(
+ 0 => ''
+ ),
+ 'NUMBERS' => array(
+ 0 => ''
+ ),
+ 'METHODS' => array(
+ 0 => ''
+ ),
+ 'SYMBOLS' => array(
+ 0 => ''
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #440088;',
+ 1 => 'color: #991111;',
+ 2 => 'color: #00b000;',
+ 3 => 'color: #888822;',
+ 4 => 'color: #888822;',
+ 5 => 'color: #0011dd;',
+ 6 => 'color: #440088;',
+ 7 => 'color: #991111;',
+ 8 => 'color: #00b000;',
+ 9 => 'color: #888822;',
+ ),
+ ),
+ 'URLS' => array(
+ 1 => '',
+// 2 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(
+ 0 => "[0-9,]+[acd][0-9,]+",
+ //Removed lines
+ 1 => array(
+ GESHI_SEARCH => '(^|(?<=\A\s))\\&lt;.*$',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ //Inserted lines
+ 2 => array(
+ GESHI_SEARCH => '(^|(?<=\A\s))\\&gt;.*$',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ //Location line
+ 3 => array(
+ GESHI_SEARCH => '(^|(?<=\A\s))-{3}\\s.*$',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ //Inserted line
+ 4 => array(
+ GESHI_SEARCH => '(^|(?<=\A\s))(\\+){3}\\s.*$',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ //Modified line
+ 5 => array(
+ GESHI_SEARCH => '(^|(?<=\A\s))\\!.*$',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ //File specification
+ 6 => array(
+ GESHI_SEARCH => '(^|(?<=\A\s))[\\@]{2}.*$',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ //Removed line
+ 7 => array(
+ GESHI_SEARCH => '(^|(?<=\A\s))\\-.*$',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ //Inserted line
+ 8 => array(
+ GESHI_SEARCH => '(^|(?<=\A\s))\\+.*$',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ //File specification
+ 9 => array(
+ GESHI_SEARCH => '(^|(?<=\A\s))(\\*){3}\\s.*$',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/div.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/div.php
new file mode 100644
index 00000000..aa11795a
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/div.php
@@ -0,0 +1,126 @@
+<?php
+/*************************************************************************************
+ * div.php
+ * ---------------------------------
+ * Author: Gabriel Lorenzo (ermakina@gmail.com)
+ * Copyright: (c) 2005 Gabriel Lorenzo (http://ermakina.gazpachito.net)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/06/19
+ *
+ * DIV language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/06/22 (1.0.0)
+ * - First Release, includes "2nd gen" ELSEIF statement
+ *
+ * TODO (updated 2005/06/22)
+ * -------------------------
+ * - I'm pretty satisfied with this, so nothing for now... :P
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'DIV',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'while','until','to','switch','step','return','repeat','loop','if','from','frame','for','end','elseif',
+ 'else','default','debug','continue','clone','case','break','begin'
+ ),
+ 2 => array(
+ 'xor','whoami','type','sizeof','pointer','or','offset','not','neg','mod','id','dup','and','_ne','_lt',
+ '_le','_gt','_ge','_eq'
+ ),
+ 3 => array(
+ 'setup_program','program','process','private','local','import','global','function','const',
+ 'compiler_options'
+ ),
+ 4 => array(
+ 'word','struct','string','int','byte'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(',')','[',']','=','+','-','*','/','!','%','^','&',':',';',',','<','>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0040b1;',
+ 2 => 'color: #000000;',
+ 3 => 'color: #000066; font-weight: bold;',
+ 4 => 'color: #993333;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #44aa44;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #202020;',
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #44aa44;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dos.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dos.php
new file mode 100644
index 00000000..36d99836
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dos.php
@@ -0,0 +1,227 @@
+<?php
+/*************************************************************************************
+ * dos.php
+ * -------
+ * Author: Alessandro Staltari (staltari@geocities.com)
+ * Copyright: (c) 2005 Alessandro Staltari (http://www.geocities.com/SiliconValley/Vista/8155/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/07/05
+ *
+ * DOS language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2005/07/05 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2005/07/05)
+ * -------------------------
+ *
+ * - Highlight pipes and redirection (do we really need this?)
+ * - Add missing keywords.
+ * - Find a good hyperlink for keywords.
+ * - Improve styles.
+ *
+ * KNOWN ISSUES (updated 2005/07/07)
+ * ---------------------------------
+ *
+ * - Doesn't even try to handle spaces in variables name or labels (I can't
+ * find a reliable way to establish if a sting is a name or not, in some
+ * cases it depends on the contex or enviroment status).
+ * - Doesn't handle %%[letter] pseudo variable used inside FOR constructs
+ * (it should be done only into its scope: how to handle variable it?).
+ * - Doesn't handle %~[something] pseudo arguments.
+ * - If the same keyword is placed at the end of the line and the
+ * beginning of the next, the second occourrence is not highlighted
+ * (this should be a GeSHi bug, not related to the language definition).
+ * - I can't avoid to have keyword highlighted even when they are not used
+ * as keywords but, for example, as arguments to the echo command.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'DOS',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ //DOS comment lines
+ 'COMMENT_REGEXP' => array(
+ 1 => "/^\s*@?REM\b.*$/mi",
+ 2 => "/^\s*::.*$/m",
+ 3 => "/\^./"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* Flow control keywords */
+ 1 => array(
+ 'if', 'else', 'goto', 'shift',
+ 'for', 'in', 'do',
+ 'call', 'exit'
+ ),
+ /* IF statement keywords */
+ 2 => array(
+ 'not', 'exist', 'errorlevel',
+ 'defined',
+ 'equ', 'neq', 'lss', 'leq', 'gtr', 'geq'
+ ),
+ /* Internal commands */
+ 3 => array(
+ 'cd', 'md', 'rd', 'chdir', 'mkdir', 'rmdir', 'dir',
+ 'del', 'copy', 'move', 'ren', 'rename',
+ 'echo',
+ 'setlocal', 'endlocal', 'set',
+ 'pause',
+ 'pushd', 'popd', 'title', 'verify'
+ ),
+ /* Special files */
+ 4 => array(
+ 'prn', 'nul', 'lpt3', 'lpt2', 'lpt1', 'con',
+ 'com4', 'com3', 'com2', 'com1', 'aux'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '@', '%', '!', '|', '<', '>', '&'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00b100; font-weight: bold;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #b1b100; font-weight: bold;',
+ 4 => 'color: #0000ff; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #b100b1; font-style: italic;',
+ 3 => 'color: #33cc33;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #ff0000; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #33cc33;',
+ 1 => 'color: #33cc33;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #b100b1; font-weight: bold;',
+ 1 => 'color: #448844;',
+ 2 => 'color: #448888;',
+ 3 => 'color: #448888;'
+ )
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'URLS' => array(
+ 1 => 'http://www.ss64.com/nt/{FNAMEL}.html',
+ 2 => 'http://www.ss64.com/nt/{FNAMEL}.html',
+ 3 => 'http://www.ss64.com/nt/{FNAMEL}.html',
+ 4 => 'http://www.ss64.com/nt/{FNAMEL}.html'
+ ),
+ 'REGEXPS' => array(
+ /* Label */
+ 0 => array(
+/* GESHI_SEARCH => '((?si:[@\s]+GOTO\s+|\s+:)[\s]*)((?<!\n)[^\s\n]*)',*/
+ GESHI_SEARCH => '((?si:[@\s]+GOTO\s+|\s+:)[\s]*)((?<!\n)[^\s\n]*)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'si',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ /* Variable assignement */
+ 1 => array(
+/* GESHI_SEARCH => '(SET[\s]+(?si:\/A[\s]+|\/P[\s]+|))([^=\s\n]+)([\s]*=)',*/
+ GESHI_SEARCH => '(SET\s+(?si:\\/A\s+|\\/P\s+)?)([^=\n]+)(\s*=)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'si',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+ /* Arguments or variable evaluation */
+ 2 => array(
+/* GESHI_SEARCH => '(%)([\d*]|[^%\s]*(?=%))((?<!%\d)%|)',*/
+ GESHI_SEARCH => '(!(?:!(?=[a-z0-9]))?)([\d*]|(?:~[adfnpstxz]*(?:$\w+:)?)?[a-z0-9](?!\w)|[^!>\n]*(?=!))((?<!%\d)%|)(?!!>)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'si',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+ /* Arguments or variable evaluation */
+ 3 => array(
+/* GESHI_SEARCH => '(%)([\d*]|[^%\s]*(?=%))((?<!%\d)%|)',*/
+ GESHI_SEARCH => '(%(?:%(?=[a-z0-9]))?)([\d*]|(?:~[adfnpstxz]*(?:$\w+:)?)?[a-z0-9](?!\w)|[^%\n]*(?=%))((?<!%\d)%|)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'si',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER,
+ 'NUMBERS' => GESHI_NEVER
+ ),
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'DISALLOWED_BEFORE' => '(?<![\w\-])'
+ ),
+ 2 => array(
+ 'DISALLOWED_BEFORE' => '(?<![\w\-])'
+ ),
+ 3 => array(
+ 'DISALLOWED_BEFORE' => '(?<![\w\-])'
+ ),
+ 4 => array(
+ 'DISALLOWED_BEFORE' => '(?<!\w)'
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dot.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dot.php
new file mode 100644
index 00000000..bdf240a1
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/dot.php
@@ -0,0 +1,164 @@
+<?php
+/*************************************************************************************
+ * dot.php
+ * ---------------------------------
+ * Author: Adrien Friggeri (adrien@friggeri.net)
+ * Copyright: (c) 2007 Adrien Friggeri (http://www.friggeri.net)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/05/30
+ *
+ * dot language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2007/05/30 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2007/05/30)
+ * -------------------------
+ * Everything
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'dot',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'URL', 'arrowhead', 'arrowsize', 'arrowtail', 'bb', 'bgcolor', 'bottomlabel',
+ 'center', 'clusterrank', 'color', 'comment', 'constraint', 'decorate',
+ 'dir', 'distortion', 'fillcolor', 'fixedsize', 'fontcolor',
+ 'fontname', 'fontsize', 'group', 'headclip', 'headlabel', 'headport',
+ 'height', 'id', 'label', 'labelangle', 'labeldistance', 'labelfontcolor',
+ 'labelfontname', 'labelfontsize', 'layer', 'layers', 'margin', 'mclimit',
+ 'minlen', 'nodesep', 'nslimit', 'ordering', 'orientation', 'page',
+ 'pagedir', 'peripheries', 'port_label_distance', 'quantum', 'rank', 'rankdir',
+ 'ranksep', 'ratio', 'regular', 'rotate', 'samehead', 'sametail', 'searchsize',
+ 'shape', 'shapefile', 'showboxes', 'sides', 'size', 'skew', 'style',
+ 'tailclip', 'taillabel', 'tailport', 'toplabel', 'weight', 'width'
+ ),
+ 2 => array(
+ 'node', 'graph', 'digraph', 'strict', 'edge', 'subgraph'
+ ),
+ 3 => array(
+ 'Mcircle', 'Mdiamond', 'Mrecord', 'Msquare', 'auto', 'back', 'bold',
+ 'both', 'box', 'circle', 'compress', 'dashed', 'diamond', 'dot',
+ 'dotted', 'doublecircle', 'doubleoctagon', 'egg', 'ellipse', 'epsf',
+ 'false', 'fill', 'filled', 'forward', 'global', 'hexagon', 'house',
+ 'inv', 'invdot', 'invhouse', 'invis', 'invodot', 'invtrapezium',
+ 'invtriangle', 'local', 'max', 'min', 'none', 'normal', 'octagon',
+ 'odot', 'out', 'parallelogram', 'plaintext', 'polygon', 'record',
+ 'same', 'solid', 'trapezium', 'triangle', 'tripleoctagon', 'true'
+ ),
+ 4 => array(
+ 'aliceblue', 'antiquewhite', 'aquamarine', 'azure', 'beige', 'bisque', 'black',
+ 'blanchedalmond', 'blue', 'blueviolet', 'brown', 'burlywood', 'cadetblue',
+ 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson',
+ 'cyan', 'darkgoldenrod', 'darkgreen', 'darkkhaki', 'darkolivegreen',
+ 'darkorange', 'darkorchid', 'darksalmon', 'darkseagreen', 'darkslateblue',
+ 'darkslategray', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue',
+ 'dimgray', 'dodgerblue', 'firebrick', 'forestgreen', 'gainsboro', 'ghostwhite',
+ 'gold', 'goldenrod', 'gray', 'green', 'greenyellow', 'honeydew', 'hotpink',
+ 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush',
+ 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcyan', 'lightgoldenrod',
+ 'lightgoldenrodyellow', 'lightgray', 'lightpink', 'lightsalmon',
+ 'lightseagreen', 'lightskyblue', 'lightslateblue', 'lightslategray',
+ 'lightyellow', 'limegreen', 'linen', 'magenta', 'maroon', 'mediumaquamarine',
+ 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen',
+ 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred',
+ 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'navy',
+ 'navyblue', 'oldlace', 'olivedrab', 'oralwhite', 'orange', 'orangered',
+ 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred',
+ 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'purple',
+ 'red', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'salmon2', 'sandybrown',
+ 'seagreen', 'seashell', 'sienna', 'skyblue', 'slateblue', 'slategray', 'snow',
+ 'springgreen', 'steelblue', 'tan', 'thistle', 'tomato', 'turquoise', 'violet',
+ 'violetred', 'wheat', 'white', 'whitesmoke', 'yellow', 'yellowgreen'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '[', ']', '{', '}', '-', '+', '*', '/', '<', '>', '!', '~', '%', '&', '|', '='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000066;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #993333;',
+ 4 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #339933;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #af624d; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/e.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/e.php
new file mode 100644
index 00000000..319bee01
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/e.php
@@ -0,0 +1,208 @@
+<?php
+/*************************************************************************************
+ * e.php
+ * --------
+ * Author: Kevin Reid (kpreid@switchb.org)
+ * Copyright: (c) 2010 Kevin Reid (http://switchb.org/kpreid/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/04/16
+ *
+ * E language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010-04-21 (1.0.8.8)
+ * - Fixing langcheck-reported bugs.
+ * 2010-04-14 (0.1)
+ * - First Release
+ *
+ * TODO (updated 2010-04-21)
+ * -------------------------
+ * - Do something useful with the keyword groups. Since RC uses CSS classes named
+ * by the group numbers, either
+ * - change the numbering to match conventional uses by other languages,
+ * - or find or create some way to produce usefully named classes.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'E',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array('/**' => '*/'), // Note: This is method doc, not a general comment syntax.
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+
+ // FIXME: The escaping inside ` is actually doubling of any interior `, $, or @ -- backslash is NOT special
+ 'QUOTEMARKS' => array('\'', '"', '`'),
+ 'ESCAPE_CHAR' => '\\',
+
+ 'KEYWORDS' => array(
+ // builtin control structures
+ 1 => array(
+ 'accum', 'break', 'try', 'continue', 'if', 'while', 'for', 'switch'
+ ),
+
+ // control structures subsidiary keywords
+ 2 => array(
+ 'catch', 'else', 'finally', 'in', 'exit'
+ ),
+
+ // named operators
+ 3 => array(
+ 'fn', 'via'
+ ),
+
+ // variable/function/object definers
+ 4 => array(
+ 'def', 'bind', 'var'
+ ),
+
+ // object definition subsidiary keywords
+ 5 => array(
+ 'extends', 'as', 'implements', 'guards', 'match', 'to', 'method'
+ ),
+
+ // builtin nouns in safeEnv
+ 6 => array(
+ 'null', 'false', 'true', 'throw', '__loop', '__makeList',
+ '__makeMap', '__makeProtocolDesc', '__makeMessageDesc',
+ '__makeParamDesc', 'any', 'void', 'boolean', '__makeOrderedSpace',
+ 'ValueGuard', '__MatchContext', 'require', '__makeVerbFacet', 'NaN',
+ 'Infinity', '__identityFunc', '__makeInt', '__makeFinalSlot',
+ '__makeVarSlot', '__makeGuardedSlot', '__makeGuard', '__makeTwine',
+ '__makeSourceSpan', '__auditedBy', 'Guard', 'near', 'pbc',
+ 'PassByCopy', 'DeepPassByCopy', 'Data', 'Persistent', 'DeepFrozen',
+ 'int', 'float64', 'char', 'String', 'Twine', 'TextWriter', 'List',
+ 'Map', 'nullOk', 'Tuple', '__Portrayal', 'notNull', 'vow', 'rcvr',
+ 'SturdyRef', 'simple__quasiParser', 'twine__quasiParser',
+ 'rx__quasiParser', 'e__quasiParser', 'epatt__quasiParser',
+ 'sml__quasiParser', 'term__quasiParser', 'traceln', '__equalizer',
+ '__comparer', 'Ref', 'E', 'promiseAllFulfilled', 'EIO', 'help',
+ 'safeScope', '__eval', 'resource__uriGetter', 'type__uriGetter',
+ 'import__uriGetter', 'elib__uriGetter', 'elang__uriGetter',
+ 'opaque__uriGetter'
+ ),
+
+ // builtin nouns in privilegedEnv
+ 7 => array(
+ 'file__uriGetter', 'fileURL__uriGetter', 'jar__uriGetter',
+ 'http__uriGetter', 'ftp__uriGetter', 'gopher__uriGetter',
+ 'news__uriGetter', 'cap__uriGetter', 'makeCommand', 'stdout',
+ 'stderr', 'stdin', 'print', 'println', 'interp', 'entropy', 'timer',
+ 'introducer', 'identityMgr', 'makeSturdyRef', 'timeMachine',
+ 'unsafe__uriGetter', 'currentVat', 'rune', 'awt__uriGetter',
+ 'swing__uriGetter', 'JPanel__quasiParser', 'swt__uriGetter',
+ 'currentDisplay', 'swtGrid__quasiParser', 'swtGrid`',
+ 'privilegedScope'
+ ),
+
+ // reserved keywords
+ 8 => array(
+ 'abstract', 'an', 'assert', 'attribute', 'be', 'begin', 'behalf',
+ 'belief', 'believe', 'believes', 'case', 'class', 'const',
+ 'constructor', 'declare', 'default', 'define', 'defmacro',
+ 'delicate', 'deprecated', 'dispatch', 'do', 'encapsulate',
+ 'encapsulated', 'encapsulates', 'end', 'ensure', 'enum', 'eventual',
+ 'eventually', 'export', 'facet', 'forall', 'function', 'given',
+ 'hidden', 'hides', 'inline', 'is', 'know', 'knows', 'lambda', 'let',
+ 'methods', 'module', 'namespace', 'native', 'obeys', 'octet',
+ 'oneway', 'operator', 'package', 'private', 'protected', 'public',
+ 'raises', 'reliance', 'reliant', 'relies', 'rely', 'reveal', 'sake',
+ 'signed', 'static', 'struct', 'suchthat', 'supports', 'suspect',
+ 'suspects', 'synchronized', 'this', 'transient', 'truncatable',
+ 'typedef', 'unsigned', 'unum', 'uses', 'using', 'utf8', 'utf16',
+ 'virtual', 'volatile', 'wstring'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(', ')', '{', '}', '[', ']', '+', '-', '*', '/', '%', '=', '<', '>', '!', '^', '&', '|', '?', ':', ';', ','
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #b1b100;',
+ 3 => 'color: #b1b100;',
+ 4 => 'color: #b1b100;',
+ 5 => 'color: #b1b100;',
+ 6 => 'color: #b1b100;',
+ 7 => 'color: #b1b100;',
+ 8 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 2 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 3 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 4 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 5 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 6 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 7 => 'http://wiki.erights.org/wiki/{FNAME}',
+ 8 => 'http://wiki.erights.org/wiki/{FNAME}'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '<-',
+ 3 => '::'
+ ),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ecmascript.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ecmascript.php
new file mode 100644
index 00000000..69a55c9a
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ecmascript.php
@@ -0,0 +1,210 @@
+<?php
+/*************************************************************************************
+ * ecmascript.php
+ * --------------
+ * Author: Michel Mariani (http://www.tonton-pixel.com/site/)
+ * Copyright: (c) 2010 Michel Mariani (http://www.tonton-pixel.com/site/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/01/08
+ *
+ * ECMAScript language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/01/08 (1.0.8.6)
+ * - First Release
+ * - Adapted from javascript.php to support plain ECMAScript/JavaScript (no HTML, no DOM)
+ * - Fixed regular expression for 'COMMENT_REGEXP' to exclude 'COMMENT_MULTI' syntax
+ * - Added '~' and removed '@' from 'SYMBOLS'
+ * - Cleaned up and expanded the list of 'KEYWORDS'
+ * - Added support for 'ESCAPE_REGEXP' and 'NUMBERS' (from c.php)
+ * - Selected colors to match my web site color chart
+ * - Added full number highlighting in all C language style formats
+ * - Added highlighting of escape sequences in strings, in all C language style formats including Unicode (\uXXXX).
+ *
+ * TODO (updated 2010/01/08)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ECMAScript',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ // Regular Expression Literals
+ 'COMMENT_REGEXP' => array(2 => "/(?<=[\\s^])s\\/(?:\\\\.|(?!\n)[^\\*\\/\\\\])+\\/(?:\\\\.|(?!\n)[^\\*\\/\\\\])+\\/[gimsu]*(?=[\\s$\\.\\;])|(?<=[\\s^(=])m?\\/(?:\\\\.|(?!\n)[^\\*\\/\\\\])+\\/[gimsu]*(?=[\\s$\\.\\,\\;\\)])/iU"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[\\\\abfnrtv\'\"?\n]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{2}#",
+ //Hexadecimal Char Specs
+ 3 => "#\\\\u[\da-fA-F]{4}#",
+ //Hexadecimal Char Specs
+ 4 => "#\\\\U[\da-fA-F]{8}#",
+ //Octal Char Specs
+ 5 => "#\\\\[0-7]{1,3}#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array( // Reserved literals
+ 'false', 'true',
+ 'null'
+ ),
+ 2 => array( // Main keywords
+ 'break', 'case', 'catch', 'continue', 'default', 'delete', 'do', 'else',
+ 'finally', 'for', 'function', 'if', 'in', 'instanceof', 'new', 'return',
+ 'switch', 'this', 'throw', 'try', 'typeof', 'var', 'void', 'while',
+ 'with'
+ ),
+ 3 => array( // Extra keywords or keywords reserved for future use
+ 'abstract', 'as', 'boolean', 'byte', 'char', 'class', 'const', 'debugger',
+ 'double', 'enum', 'export', 'extends', 'final', 'float', 'goto', 'implements',
+ 'import', 'int', 'interface', 'is', 'long', 'native', 'namespace', 'package',
+ 'private', 'protected', 'public', 'short', 'static', 'super', 'synchronized', 'throws',
+ 'transient', 'use', 'volatile'
+ ),
+ 4 => array( // Operators
+ 'get', 'set'
+ ),
+ 5 => array( // Built-in object classes
+ 'Array', 'Boolean', 'Date', 'EvalError', 'Error', 'Function', 'Math', 'Number',
+ 'Object', 'RangeError', 'ReferenceError', 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError'
+ ),
+ 6 => array( // Global properties
+ 'Infinity', 'NaN', 'undefined'
+ ),
+ 7 => array( // Global methods
+ 'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent',
+ 'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt',
+ // The escape and unescape functions do not work properly for non-ASCII characters and have been deprecated.
+ // In JavaScript 1.5 and later, use encodeURI, decodeURI, encodeURIComponent, and decodeURIComponent.
+ 'escape', 'unescape'
+ ),
+ 8 => array( // Function's arguments
+ 'arguments'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}',
+ '+', '-', '*', '/', '%',
+ '!', '.', '&', '|', '^',
+ '<', '>', '=', '~',
+ ',', ';', '?', ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #009999;',
+ 2 => 'color: #1500C8;',
+ 3 => 'color: #1500C8;',
+ 4 => 'color: #1500C8;',
+ 5 => 'color: #1500C8;',
+ 6 => 'color: #1500C8;',
+ 7 => 'color: #1500C8;',
+ 8 => 'color: #1500C8;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #CC0000;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #3366CC;',
+ 1 => 'color: #3366CC;',
+ 2 => 'color: #3366CC;',
+ 3 => 'color: #3366CC;',
+ 4 => 'color: #3366CC;',
+ 5 => 'color: #3366CC;',
+ 'HARD' => '',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #008800;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #9900FF;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF00FF;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #FF00FF;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #FF00FF;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #FF00FF;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color: #FF00FF;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color: #FF00FF;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color: #FF00FF;',
+ GESHI_NUMBER_FLT_NONSCI => 'color: #FF00FF;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #660066;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/eiffel.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/eiffel.php
new file mode 100644
index 00000000..baa13c31
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/eiffel.php
@@ -0,0 +1,395 @@
+<?php
+/*************************************************************************************
+ * eiffel.php
+ * ----------
+ * Author: Zoran Simic (zsimic@axarosenberg.com)
+ * Copyright: (c) 2005 Zoran Simic
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/06/30
+ *
+ * Eiffel language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/06/30 (1.0.7)
+ * - Initial release
+ *
+ * TODO (updated 2005/06/30)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Eiffel',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '%',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'separate',
+ 'invariant',
+ 'inherit',
+ 'indexing',
+ 'feature',
+ 'expanded',
+ 'deferred',
+ 'class'
+ ),
+ 2 => array(
+ 'xor',
+ 'when',
+ 'variant',
+ 'until',
+ 'unique',
+ 'undefine',
+ 'then',
+ 'strip',
+ 'select',
+ 'retry',
+ 'rescue',
+ 'require',
+ 'rename',
+ 'reference',
+ 'redefine',
+ 'prefix',
+ 'or',
+ 'once',
+ 'old',
+ 'obsolete',
+ 'not',
+ 'loop',
+ 'local',
+ 'like',
+ 'is',
+ 'inspect',
+ 'infix',
+ 'include',
+ 'implies',
+ 'if',
+ 'frozen',
+ 'from',
+ 'external',
+ 'export',
+ 'ensure',
+ 'end',
+ 'elseif',
+ 'else',
+ 'do',
+ 'creation',
+ 'create',
+ 'check',
+ 'as',
+ 'and',
+ 'alias',
+ 'agent'
+ ),
+ 3 => array(
+ 'Void',
+ 'True',
+ 'Result',
+ 'Precursor',
+ 'False',
+ 'Current'
+ ),
+ 4 => array(
+ 'UNIX_SIGNALS',
+ 'UNIX_FILE_INFO',
+ 'UNBOUNDED',
+ 'TWO_WAY_TREE_CURSOR',
+ 'TWO_WAY_TREE',
+ 'TWO_WAY_SORTED_SET',
+ 'TWO_WAY_LIST',
+ 'TWO_WAY_CURSOR_TREE',
+ 'TWO_WAY_CIRCULAR',
+ 'TWO_WAY_CHAIN_ITERATOR',
+ 'TUPLE',
+ 'TREE',
+ 'TRAVERSABLE',
+ 'TO_SPECIAL',
+ 'THREAD_CONTROL',
+ 'THREAD_ATTRIBUTES',
+ 'THREAD',
+ 'TABLE',
+ 'SUBSET',
+ 'STRING_HANDLER',
+ 'STRING',
+ 'STREAM',
+ 'STORABLE',
+ 'STD_FILES',
+ 'STACK',
+ 'SPECIAL',
+ 'SORTED_TWO_WAY_LIST',
+ 'SORTED_STRUCT',
+ 'SORTED_LIST',
+ 'SINGLE_MATH',
+ 'SET',
+ 'SEQUENCE',
+ 'SEQ_STRING',
+ 'SEMAPHORE',
+ 'ROUTINE',
+ 'RESIZABLE',
+ 'RECURSIVE_TREE_CURSOR',
+ 'RECURSIVE_CURSOR_TREE',
+ 'REAL_REF',
+ 'REAL',
+ 'RAW_FILE',
+ 'RANDOM',
+ 'QUEUE',
+ 'PROXY',
+ 'PROFILING_SETTING',
+ 'PROCEDURE',
+ 'PRIORITY_QUEUE',
+ 'PRIMES',
+ 'PRECOMP',
+ 'POINTER_REF',
+ 'POINTER',
+ 'PLATFORM',
+ 'PLAIN_TEXT_FILE',
+ 'PATH_NAME',
+ 'PART_SORTED_TWO_WAY_LIST',
+ 'PART_SORTED_SET',
+ 'PART_SORTED_LIST',
+ 'PART_COMPARABLE',
+ 'OPERATING_ENVIRONMENT',
+ 'ONCE_CONTROL',
+ 'OBJECT_OWNER',
+ 'OBJECT_CONTROL',
+ 'NUMERIC',
+ 'NONE',
+ 'MUTEX',
+ 'MULTI_ARRAY_LIST',
+ 'MULTAR_LIST_CURSOR',
+ 'MEMORY',
+ 'MEM_INFO',
+ 'MEM_CONST',
+ 'MATH_CONST',
+ 'LIST',
+ 'LINKED_TREE_CURSOR',
+ 'LINKED_TREE',
+ 'LINKED_STACK',
+ 'LINKED_SET',
+ 'LINKED_QUEUE',
+ 'LINKED_PRIORITY_QUEUE',
+ 'LINKED_LIST_CURSOR',
+ 'LINKED_LIST',
+ 'LINKED_CURSOR_TREE',
+ 'LINKED_CIRCULAR',
+ 'LINKABLE',
+ 'LINEAR_ITERATOR',
+ 'LINEAR',
+ 'ITERATOR',
+ 'IO_MEDIUM',
+ 'INTERNAL',
+ 'INTEGER_REF',
+ 'INTEGER_INTERVAL',
+ 'INTEGER',
+ 'INFINITE',
+ 'INDEXABLE',
+ 'IDENTIFIED_CONTROLLER',
+ 'IDENTIFIED',
+ 'HIERARCHICAL',
+ 'HEAP_PRIORITY_QUEUE',
+ 'HASHABLE',
+ 'HASH_TABLE_CURSOR',
+ 'HASH_TABLE',
+ 'GENERAL',
+ 'GC_INFO',
+ 'FUNCTION',
+ 'FORMAT_INTEGER',
+ 'FORMAT_DOUBLE',
+ 'FIXED_TREE',
+ 'FIXED_LIST',
+ 'FIXED',
+ 'FINITE',
+ 'FILE_NAME',
+ 'FILE',
+ 'FIBONACCI',
+ 'EXECUTION_ENVIRONMENT',
+ 'EXCEPTIONS',
+ 'EXCEP_CONST',
+ 'DYNAMIC_TREE',
+ 'DYNAMIC_LIST',
+ 'DYNAMIC_CIRCULAR',
+ 'DYNAMIC_CHAIN',
+ 'DOUBLE_REF',
+ 'DOUBLE_MATH',
+ 'DOUBLE',
+ 'DISPENSER',
+ 'DIRECTORY_NAME',
+ 'DIRECTORY',
+ 'DECLARATOR',
+ 'DEBUG_OUTPUT',
+ 'CURSOR_TREE_ITERATOR',
+ 'CURSOR_TREE',
+ 'CURSOR_STRUCTURE',
+ 'CURSOR',
+ 'COUNTABLE_SEQUENCE',
+ 'COUNTABLE',
+ 'CONTAINER',
+ 'CONSOLE',
+ 'CONDITION_VARIABLE',
+ 'COMPARABLE_STRUCT',
+ 'COMPARABLE_SET',
+ 'COMPARABLE',
+ 'COMPACT_TREE_CURSOR',
+ 'COMPACT_CURSOR_TREE',
+ 'COLLECTION',
+ 'CIRCULAR_CURSOR',
+ 'CIRCULAR',
+ 'CHARACTER_REF',
+ 'CHARACTER',
+ 'CHAIN',
+ 'CELL',
+ 'BOX',
+ 'BOUNDED_STACK',
+ 'BOUNDED_QUEUE',
+ 'BOUNDED',
+ 'BOOLEAN_REF',
+ 'BOOLEAN',
+ 'BOOL_STRING',
+ 'BIT_REF',
+ 'BINARY_TREE',
+ 'BINARY_SEARCH_TREE_SET',
+ 'BINARY_SEARCH_TREE',
+ 'BILINEAR',
+ 'BI_LINKABLE',
+ 'BASIC_ROUTINES',
+ 'BAG',
+ 'ASCII',
+ 'ARRAYED_TREE',
+ 'ARRAYED_STACK',
+ 'ARRAYED_QUEUE',
+ 'ARRAYED_LIST_CURSOR',
+ 'ARRAYED_LIST',
+ 'ARRAYED_CIRCULAR',
+ 'ARRAY2',
+ 'ARRAY',
+ 'ARGUMENTS',
+ 'ANY',
+ 'ACTIVE'
+ ),
+ 5 => array(
+ 'yes',
+ 'visible',
+ 'trace',
+ 'system',
+ 'root',
+ 'profile',
+ 'override_cluster',
+ 'object',
+ 'no',
+ 'multithreaded',
+ 'msil_generation_type',
+ 'line_generation',
+ 'library',
+ 'inlining_size',
+ 'inlining',
+ 'include_path',
+ 'il_verifiable',
+ 'exclude',
+ 'exception_trace',
+ 'dynamic_runtime',
+ 'dotnet_naming_convention',
+ 'disabled_debug',
+ 'default',
+ 'debug',
+ 'dead_code_removal',
+ 'console_application',
+ 'cluster',
+ 'cls_compliant',
+ 'check_vape',
+ 'assertion',
+ 'array_optimization',
+ 'all',
+ 'address_expression'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '+', '-', '*', '?', '=', '/', '%', '&', '>', '<', '^', '!', '|', ':',
+ '(', ')', '{', '}', '[', ']', '#'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => true,
+ 5 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0600FF; font-weight: bold;',
+ 2 => 'color: #0600FF; font-weight: bold;',
+ 3 => 'color: #800080;',
+ 4 => 'color: #800000',
+ 5 => 'color: #603000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000; font-style: italic;',
+ 'MULTI' => ''
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #005070; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0080A0;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #000060;',
+ 2 => 'color: #000050;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #600000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => 'http://www.google.com/search?q=site%3Ahttp%3A%2F%2Fdocs.eiffel.com%2Feiffelstudio%2Flibraries+{FNAMEL}&amp;btnI=I%27m+Feeling+Lucky',
+ 5 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/email.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/email.php
new file mode 100644
index 00000000..8a313d48
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/email.php
@@ -0,0 +1,222 @@
+<?php
+/*************************************************************************************
+ * email.php
+ * ---------------
+ * Author: Benny Baumann (BenBE@geshi.org)
+ * Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/10/19
+ *
+ * Email (mbox \ eml \ RFC format) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/10/19 (1.0.8.1)
+ * - First Release
+ *
+ * TODO (updated 2008/10/19)
+ * -------------------------
+ * * Better checks when a header field should be expected
+ * * Fix the bound checks for kw groups 2 and 3, as well as rx group 1
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'eMail (mbox)',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'HTTP', 'SMTP', 'ASMTP', 'ESMTP'
+ ),
+ 2 => array(
+ 'Authentication-Results','Comment','Content-Description','Content-Type',
+ 'Content-Disposition','Content-Transfer-Encoding','Delivered-To',
+ 'Dkim-Signature','Domainkey-Signature','In-Reply-To','Message-Id',
+ 'MIME-Version','OpenPGP','Received','Received-SPF','References',
+ 'Reply-To', 'Resend-From','Resend-To','Return-Path','User-Agent'
+ ),
+ 3 => array(
+ 'Date','From','Sender','Subject','To','CC'
+ ),
+ 4 => array(
+ 'by', 'for', 'from', 'id', 'with'
+ )
+ ),
+ 'SYMBOLS' => array(
+ ':', ';', '<', '>', '[', ']'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => false,
+ 3 => false,
+ 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000FF; font-weight: bold;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #800000; font-weight: bold;',
+ 4 => 'font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SCRIPT' => array(
+ 0 => 'color: #000040;',
+ ),
+ 'REGEXPS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #0000FF;',
+ 3 => 'color: #008000;',
+ 4 => 'color: #0000FF; font-weight: bold;',
+ 5 => 'font-weight: bold;',
+ 6 => 'color: #400080;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ // Non-Standard-Header
+ 1 => array(
+ GESHI_SEARCH => "(?<=\A\x20|\n)x-[a-z0-9\-]*(?=\s*:|\s*<)",
+ GESHI_REPLACE => "\\0",
+ GESHI_MODIFIERS => "smi",
+ GESHI_BEFORE => "",
+ GESHI_AFTER => ""
+ ),
+ //Email-Adresses or Mail-IDs
+ 2 => array(
+ GESHI_SEARCH => "\b(?<!\\/)(?P<q>\"?)[\w\.\-]+\k<q>@(?!-)[\w\-]+(?<!-)(?:(?:\.(?!-)[\w\-]+(?<!-))*)?",
+ GESHI_REPLACE => "\\0",
+ GESHI_MODIFIERS => "mi",
+ GESHI_BEFORE => "",
+ GESHI_AFTER => ""
+ ),
+ //Date values in RFC format
+ 3 => array(
+ GESHI_SEARCH => "\b(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s+\d\d?\s+" .
+ "(?:Jan|Feb|Mar|apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+" .
+ "\d{4}\s+\d\d?:\d\d:\d\d\s+[+\-]\d{4}(?:\s+\(\w+\))?",
+ GESHI_REPLACE => "\\0",
+ GESHI_MODIFIERS => "mi",
+ GESHI_BEFORE => "",
+ GESHI_AFTER => ""
+ ),
+ //IP addresses
+ 4 => array(
+ GESHI_SEARCH => "(?<=\s)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?=\s)|".
+ "(?<=\[)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?=\])|".
+ "(?<==)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?=<)|".
+
+ "(?<=\s)(?:[a-f\d]{1,4}\:)+(?:[a-f\d]{0,4})?(?:\:[a-f\d]{1,4})+(?=\s)|".
+ "(?<=\[)(?:[a-f\d]{1,4}\:)+(?:[a-f\d]{0,4})?(?:\:[a-f\d]{1,4})+(?=\])|".
+ "(?<==)(?:[a-f\d]{1,4}\:)+(?:[a-f\d]{0,4})?(?:\:[a-f\d]{1,4})+(?=<)|".
+
+ "(?<=\s)\:(?:\:[a-f\d]{1,4})+(?=\s)|".
+ "(?<=\[)\:(?:\:[a-f\d]{1,4})+(?=\])|".
+ "(?<==)\:(?:\:[a-f\d]{1,4})+(?=<)|".
+
+ "(?<=\s)(?:[a-f\d]{1,4}\:)+\:(?=\s)|".
+ "(?<=\[)(?:[a-f\d]{1,4}\:)+\:(?=\])|".
+ "(?<==)(?:[a-f\d]{1,4}\:)+\:(?=<)",
+ GESHI_REPLACE => "\\0",
+ GESHI_MODIFIERS => "i",
+ GESHI_BEFORE => "",
+ GESHI_AFTER => ""
+ ),
+ //Field-Assignments
+ 5 => array(
+ GESHI_SEARCH => "(?<=\s)[A-Z0-9\-\.]+(?==(?:$|\s$|[^\s=]))",
+ GESHI_REPLACE => "\\0",
+ GESHI_MODIFIERS => "mi",
+ GESHI_BEFORE => "",
+ GESHI_AFTER => ""
+ ),
+ //MIME type
+ 6 => array(
+ GESHI_SEARCH => "(?<=\s)(?:audio|application|image|multipart|text|".
+ "video|x-[a-z0-9\-]+)\/[a-z0-9][a-z0-9\-]*(?=\s|<|$)",
+ GESHI_REPLACE => "\\0",
+ GESHI_MODIFIERS => "m",
+ GESHI_BEFORE => "",
+ GESHI_AFTER => ""
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_ALWAYS,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => "/(?P<start>^)[A-Za-z][a-zA-Z0-9\-]*\s*:\s*(?:.|(?=\n\s)\n)*(?P<end>$)/m"
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 2 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\A\x20|\n)',
+ 'DISALLOWED_AFTER' => '(?=\s*:)',
+ ),
+ 3 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\A\x20|\n)',
+ 'DISALLOWED_AFTER' => '(?=\s*:)',
+ ),
+ 4 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\s)',
+ 'DISALLOWED_AFTER' => '(?=\s|\b)',
+ )
+ ),
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER,
+ 'COMMENTS' => GESHI_NEVER,
+ 'NUMBERS' => GESHI_NEVER
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/epc.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/epc.php
new file mode 100644
index 00000000..c575c0c6
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/epc.php
@@ -0,0 +1,154 @@
+<?php
+/*************************************************************************************
+ * epc.php
+ * --------
+ * Author: Thorsten Muehlfelder (muehlfelder@enertex.de)
+ * Copyright: (c) 2010 Enertex Bayern GmbH
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/08/26
+ *
+ * Enerscript language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/08/26 (1.0.8.10)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'EPC',
+ 'COMMENT_SINGLE' => array('//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //[Sections]
+ //1 => "/^\\[.*\\]/"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(
+ 0 => '"',
+ 1 => '$'
+ ),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'if', 'then', 'else', 'endif',
+ 'and', 'or', 'xor', 'hysteresis'
+ ),
+ 2 => array(
+ 'read', 'write', 'event',
+ 'gettime', 'settime', 'getdate', 'setdate', 'gettimedate', 'settimedate',
+ 'hour', 'minute', 'second', 'changehour', 'changeminute', 'changesecond',
+ 'date', 'month', 'day', 'dayofweek', 'sun', 'azimuth', 'elevation',
+ 'sunrisehour', 'sunriseminute', 'sunsethour', 'sunsetminute',
+ 'wtime', 'htime', 'mtime', 'stime',
+ 'cwtime', 'chtime', 'cmtime', 'cstime',
+ 'delay', 'after', 'cycle',
+ 'readflash', 'writeflash',
+ 'abs', 'acos', 'asin', 'atan', 'cos', 'ceil', 'average', 'exp', 'floor',
+ 'log', 'max', 'min', 'mod', 'pow', 'sqrt', 'sin', 'tan', 'change', 'convert',
+ 'eval', 'systemstart', 'random', 'comobject', 'sleep', 'scene', 'storescene', 'callscene',
+ 'find', 'stringcast', 'stringset', 'stringformat', 'split', 'size',
+ 'readrs232'. 'sendrs232', 'address', 'readknx',
+ 'readudp', 'sendudp', 'connecttcp', 'closetcp', 'readtcp', 'sendtcp',
+ 'resolve', 'sendmail',
+ 'button', 'webbutton', 'chart', 'webchart', 'webdisplay', 'getslider', 'pshifter', 'mpshifter',
+ 'getpslider', 'mbutton', 'mbbutton', 'mchart', 'mpchart', 'mpbutton', 'pdisplay', 'pchart',
+ 'pbutton', 'setslider', 'setpslider', 'slider', 'pslider', 'page', 'line', 'header',
+ 'footer', 'none', 'plink', 'link', 'frame', 'dframe'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '%', 'b01',
+ ),
+ 1 => array(
+ '+', '-', '==', '>=', '=<',
+ ),
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #e63ec3;',
+ 2 => 'color: #e63ec3;'
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #0000ff;'
+ //1 => 'color: #ffa500;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 1 => 'color: #000099;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #8a0808;',
+ 1 => 'color: #6e6e6e;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0b610b;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #0b610b;',
+ 1 => 'color: #e63ec3;'
+ ),
+ 'REGEXPS' => array(
+ 1 => 'color: #0b610b;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ // Numbers, e.g. 255u08
+ 1 => "[0-9]*[subf][0136][12468]"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'COMMENTS' => array(
+ 'DISALLOWED_BEFORE' => '$'
+ ),
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![\.\-a-zA-Z0-9_\$\#])",
+ 'DISALLOWED_AFTER' => "(?![\.\-a-zA-Z0-9_%=\\/])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/erlang.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/erlang.php
new file mode 100644
index 00000000..4b8d406b
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/erlang.php
@@ -0,0 +1,441 @@
+<?php
+/*************************************************************************************
+ * erlang.php
+ * --------
+ * Author: Benny Baumann (BenBE@geshi.org)
+ * Contributions:
+ * - Uwe Dauernheim (uwe@dauernheim.net)
+ * - Dan Forest-Barbier (dan@twisted.in)
+ * Copyright: (c) 2008 Uwe Dauernheim (http://www.kreisquadratur.de/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008-09-27
+ *
+ * Erlang language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/05/02 (1.0.8.3)
+ * - Now using 'PARSER_CONTROL' instead of huge rexgexps, better and cleaner
+ *
+ * 2009/04/26 (1.0.8.3)
+ * - Only link to existing docs / Fixes
+ *
+ * 2008-09-28 (1.0.0.1)
+ * [!] Bug fixed with keyword module.
+ * [+] Added more function names
+ *
+ * 2008-09-27 (1.0.0)
+ * [ ] First Release
+ *
+ * TODO (updated 2008-09-27)
+ * -------------------------
+ * [!] Stop ';' from being transformed to '<SEMI>'
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Erlang',
+ 'COMMENT_SINGLE' => array(1 => '%'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'HARDQUOTE' => array("'", "'"),
+ 'HARDESCAPE' => array("'", "\\"),
+ 'HARDCHAR' => "\\",
+ 'ESCAPE_CHAR' => '\\',
+ 'NUMBERS' => GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ //Control flow keywrods
+ 1 => array(
+ 'after', 'andalso', 'begin', 'case', 'catch', 'end', 'fun', 'if',
+ 'of', 'orelse', 'receive', 'try', 'when', 'query'
+ ),
+ //Binary operators
+ 2 => array(
+ 'and', 'band', 'bnot', 'bor', 'bsl', 'bsr', 'bxor', 'div', 'not',
+ 'or', 'rem', 'xor'
+ ),
+ 3 => array(
+ 'abs', 'alive', 'apply', 'atom_to_list', 'binary_to_list',
+ 'binary_to_term', 'concat_binary', 'date', 'disconnect_node',
+ 'element', 'erase', 'exit', 'float', 'float_to_list', 'get',
+ 'get_keys', 'group_leader', 'halt', 'hd', 'integer_to_list',
+ 'is_alive', 'length', 'link', 'list_to_atom', 'list_to_binary',
+ 'list_to_float', 'list_to_integer', 'list_to_pid', 'list_to_tuple',
+ 'load_module', 'make_ref', 'monitor_node', 'node', 'nodes', 'now',
+ 'open_port', 'pid_to_list', 'process_flag', 'process_info',
+ 'process', 'put', 'register', 'registered', 'round', 'self',
+ 'setelement', 'size', 'spawn', 'spawn_link', 'split_binary',
+ 'statistics', 'term_to_binary', 'throw', 'time', 'tl', 'trunc',
+ 'tuple_to_list', 'unlink', 'unregister', 'whereis'
+ ),
+ // Built-In Functions
+ 4 => array(
+ 'atom', 'binary', 'constant', 'function', 'integer', 'is_atom',
+ 'is_binary', 'is_constant', 'is_function', 'is_integer', 'is_list',
+ 'is_number', 'is_pid', 'is_reference', 'is_record', 'list',
+ 'number', 'pid', 'ports', 'port_close', 'port_info', 'reference'
+ ),
+ // Erlang/OTP internal modules (scary one)
+ 5 => array(
+ 'alarm_handler', 'any', 'app', 'application', 'appmon', 'appup',
+ 'array', 'asn1ct', 'asn1rt', 'auth', 'base64', 'beam_lib', 'c',
+ 'calendar', 'code', 'common_test_app', 'compile', 'config',
+ 'corba', 'corba_object', 'cosEventApp', 'CosEventChannelAdmin',
+ 'CosEventChannelAdmin_ConsumerAdmin',
+ 'CosEventChannelAdmin_EventChannel',
+ 'CosEventChannelAdmin_ProxyPullConsumer',
+ 'CosEventChannelAdmin_ProxyPullSupplier',
+ 'CosEventChannelAdmin_ProxyPushConsumer',
+ 'CosEventChannelAdmin_ProxyPushSupplier',
+ 'CosEventChannelAdmin_SupplierAdmin', 'CosEventDomainAdmin',
+ 'CosEventDomainAdmin_EventDomain',
+ 'CosEventDomainAdmin_EventDomainFactory',
+ 'cosEventDomainApp', 'CosFileTransfer_Directory',
+ 'CosFileTransfer_File', 'CosFileTransfer_FileIterator',
+ 'CosFileTransfer_FileTransferSession',
+ 'CosFileTransfer_VirtualFileSystem',
+ 'cosFileTransferApp', 'CosNaming', 'CosNaming_BindingIterator',
+ 'CosNaming_NamingContext', 'CosNaming_NamingContextExt',
+ 'CosNotification', 'CosNotification_AdminPropertiesAdmin',
+ 'CosNotification_QoSAdmin', 'cosNotificationApp',
+ 'CosNotifyChannelAdmin_ConsumerAdmin',
+ 'CosNotifyChannelAdmin_EventChannel',
+ 'CosNotifyChannelAdmin_EventChannelFactory',
+ 'CosNotifyChannelAdmin_ProxyConsumer',
+ 'CosNotifyChannelAdmin_ProxyPullConsumer',
+ 'CosNotifyChannelAdmin_ProxyPullSupplier',
+ 'CosNotifyChannelAdmin_ProxyPushConsumer',
+ 'CosNotifyChannelAdmin_ProxyPushSupplier',
+ 'CosNotifyChannelAdmin_ProxySupplier',
+ 'CosNotifyChannelAdmin_SequenceProxyPullConsumer',
+ 'CosNotifyChannelAdmin_SequenceProxyPullSupplier',
+ 'CosNotifyChannelAdmin_SequenceProxyPushConsumer',
+ 'CosNotifyChannelAdmin_SequenceProxyPushSupplier',
+ 'CosNotifyChannelAdmin_StructuredProxyPullConsumer',
+ 'CosNotifyChannelAdmin_StructuredProxyPullSupplier',
+ 'CosNotifyChannelAdmin_StructuredProxyPushConsumer',
+ 'CosNotifyChannelAdmin_StructuredProxyPushSupplier',
+ 'CosNotifyChannelAdmin_SupplierAdmin',
+ 'CosNotifyComm_NotifyPublish', 'CosNotifyComm_NotifySubscribe',
+ 'CosNotifyFilter_Filter', 'CosNotifyFilter_FilterAdmin',
+ 'CosNotifyFilter_FilterFactory', 'CosNotifyFilter_MappingFilter',
+ 'cosProperty', 'CosPropertyService_PropertiesIterator',
+ 'CosPropertyService_PropertyNamesIterator',
+ 'CosPropertyService_PropertySet',
+ 'CosPropertyService_PropertySetDef',
+ 'CosPropertyService_PropertySetDefFactory',
+ 'CosPropertyService_PropertySetFactory', 'cosTime',
+ 'CosTime_TimeService', 'CosTime_TIO', 'CosTime_UTO',
+ 'CosTimerEvent_TimerEventHandler',
+ 'CosTimerEvent_TimerEventService', 'cosTransactions',
+ 'CosTransactions_Control', 'CosTransactions_Coordinator',
+ 'CosTransactions_RecoveryCoordinator', 'CosTransactions_Resource',
+ 'CosTransactions_SubtransactionAwareResource',
+ 'CosTransactions_Terminator', 'CosTransactions_TransactionFactory',
+ 'cover', 'cprof', 'cpu_sup', 'crashdump', 'crypto', 'crypto_app',
+ 'ct', 'ct_cover', 'ct_ftp', 'ct_master', 'ct_rpc', 'ct_snmp',
+ 'ct_ssh', 'ct_telnet', 'dbg', 'debugger', 'dets', 'dialyzer',
+ 'dict', 'digraph', 'digraph_utils', 'disk_log', 'disksup',
+ 'docb_gen', 'docb_transform', 'docb_xml_check', 'docbuilder_app',
+ 'driver_entry', 'edoc', 'edoc_doclet', 'edoc_extract',
+ 'edoc_layout', 'edoc_lib', 'edoc_run', 'egd', 'ei', 'ei_connect',
+ 'epmd', 'epp', 'epp_dodger', 'eprof', 'erl', 'erl_boot_server',
+ 'erl_call', 'erl_comment_scan', 'erl_connect', 'erl_ddll',
+ 'erl_driver', 'erl_error', 'erl_eterm', 'erl_eval',
+ 'erl_expand_records', 'erl_format', 'erl_global', 'erl_id_trans',
+ 'erl_internal', 'erl_lint', 'erl_malloc', 'erl_marshal',
+ 'erl_parse', 'erl_pp', 'erl_prettypr', 'erl_prim_loader',
+ 'erl_prim_loader_stub', 'erl_recomment', 'erl_scan',
+ 'erl_set_memory_block', 'erl_syntax', 'erl_syntax_lib', 'erl_tar',
+ 'erl_tidy', 'erlang', 'erlang_mode', 'erlang_stub', 'erlc',
+ 'erlsrv', 'error_handler', 'error_logger', 'erts_alloc',
+ 'erts_alloc_config', 'escript', 'et', 'et_collector',
+ 'et_selector', 'et_viewer', 'etop', 'ets', 'eunit', 'file',
+ 'file_sorter', 'filelib', 'filename', 'fixed', 'fprof', 'ftp',
+ 'gb_sets', 'gb_trees', 'gen_event', 'gen_fsm', 'gen_sctp',
+ 'gen_server', 'gen_tcp', 'gen_udp', 'gl', 'global', 'global_group',
+ 'glu', 'gs', 'heart', 'http', 'httpd', 'httpd_conf',
+ 'httpd_socket', 'httpd_util', 'i', 'ic', 'ic_c_protocol',
+ 'ic_clib', 'igor', 'inet', 'inets', 'init', 'init_stub',
+ 'instrument', 'int', 'interceptors', 'inviso', 'inviso_as_lib',
+ 'inviso_lfm', 'inviso_lfm_tpfreader', 'inviso_rt',
+ 'inviso_rt_meta', 'io', 'io_lib', 'kernel_app', 'lib', 'lists',
+ 'lname', 'lname_component', 'log_mf_h', 'make', 'math', 'megaco',
+ 'megaco_codec_meas', 'megaco_codec_transform',
+ 'megaco_edist_compress', 'megaco_encoder', 'megaco_flex_scanner',
+ 'megaco_tcp', 'megaco_transport', 'megaco_udp', 'megaco_user',
+ 'memsup', 'mnesia', 'mnesia_frag_hash', 'mnesia_registry',
+ 'mod_alias', 'mod_auth', 'mod_esi', 'mod_security',
+ 'Module_Interface', 'ms_transform', 'net_adm', 'net_kernel',
+ 'new_ssl', 'nteventlog', 'observer_app', 'odbc', 'orber',
+ 'orber_acl', 'orber_diagnostics', 'orber_ifr', 'orber_tc',
+ 'orddict', 'ordsets', 'os', 'os_mon', 'os_mon_mib', 'os_sup',
+ 'otp_mib', 'overload', 'packages', 'percept', 'percept_profile',
+ 'pg', 'pg2', 'pman', 'pool', 'prettypr', 'proc_lib', 'proplists',
+ 'public_key', 'qlc', 'queue', 'random', 'rb', 're', 'regexp',
+ 'registry', 'rel', 'release_handler', 'reltool', 'relup', 'rpc',
+ 'run_erl', 'run_test', 'runtime_tools_app', 'sasl_app', 'script',
+ 'seq_trace', 'sets', 'shell', 'shell_default', 'slave', 'snmp',
+ 'snmp_app', 'snmp_community_mib', 'snmp_framework_mib',
+ 'snmp_generic', 'snmp_index', 'snmp_notification_mib', 'snmp_pdus',
+ 'snmp_standard_mib', 'snmp_target_mib', 'snmp_user_based_sm_mib',
+ 'snmp_view_based_acm_mib', 'snmpa', 'snmpa_conf', 'snmpa_error',
+ 'snmpa_error_io', 'snmpa_error_logger', 'snmpa_error_report',
+ 'snmpa_local_db', 'snmpa_mpd', 'snmpa_network_interface',
+ 'snmpa_network_interface_filter',
+ 'snmpa_notification_delivery_info_receiver',
+ 'snmpa_notification_filter', 'snmpa_supervisor', 'snmpc', 'snmpm',
+ 'snmpm_conf', 'snmpm_mpd', 'snmpm_network_interface', 'snmpm_user',
+ 'sofs', 'ssh', 'ssh_channel', 'ssh_connection', 'ssh_sftp',
+ 'ssh_sftpd', 'ssl', 'ssl_app', 'ssl_pkix', 'start', 'start_erl',
+ 'start_webtool', 'stdlib_app', 'string', 'supervisor',
+ 'supervisor_bridge', 'sys', 'systools', 'tags', 'test_server',
+ 'test_server_app', 'test_server_ctrl', 'tftp', 'timer', 'toolbar',
+ 'ttb', 'tv', 'unicode', 'unix_telnet', 'user', 'webtool', 'werl',
+ 'win32reg', 'wrap_log_reader', 'wx', 'wx_misc', 'wx_object',
+ 'wxAcceleratorEntry', 'wxAcceleratorTable', 'wxArtProvider',
+ 'wxAuiDockArt', 'wxAuiManager', 'wxAuiNotebook', 'wxAuiPaneInfo',
+ 'wxAuiTabArt', 'wxBitmap', 'wxBitmapButton', 'wxBitmapDataObject',
+ 'wxBoxSizer', 'wxBrush', 'wxBufferedDC', 'wxBufferedPaintDC',
+ 'wxButton', 'wxCalendarCtrl', 'wxCalendarDateAttr',
+ 'wxCalendarEvent', 'wxCaret', 'wxCheckBox', 'wxCheckListBox',
+ 'wxChildFocusEvent', 'wxChoice', 'wxClientDC', 'wxClipboard',
+ 'wxCloseEvent', 'wxColourData', 'wxColourDialog',
+ 'wxColourPickerCtrl', 'wxColourPickerEvent', 'wxComboBox',
+ 'wxCommandEvent', 'wxContextMenuEvent', 'wxControl',
+ 'wxControlWithItems', 'wxCursor', 'wxDataObject', 'wxDateEvent',
+ 'wxDatePickerCtrl', 'wxDC', 'wxDialog', 'wxDirDialog',
+ 'wxDirPickerCtrl', 'wxDisplayChangedEvent', 'wxEraseEvent',
+ 'wxEvent', 'wxEvtHandler', 'wxFileDataObject', 'wxFileDialog',
+ 'wxFileDirPickerEvent', 'wxFilePickerCtrl', 'wxFindReplaceData',
+ 'wxFindReplaceDialog', 'wxFlexGridSizer', 'wxFocusEvent', 'wxFont',
+ 'wxFontData', 'wxFontDialog', 'wxFontPickerCtrl',
+ 'wxFontPickerEvent', 'wxFrame', 'wxGauge', 'wxGBSizerItem',
+ 'wxGenericDirCtrl', 'wxGLCanvas', 'wxGraphicsBrush',
+ 'wxGraphicsContext', 'wxGraphicsFont', 'wxGraphicsMatrix',
+ 'wxGraphicsObject', 'wxGraphicsPath', 'wxGraphicsPen',
+ 'wxGraphicsRenderer', 'wxGrid', 'wxGridBagSizer', 'wxGridCellAttr',
+ 'wxGridCellEditor', 'wxGridCellRenderer', 'wxGridEvent',
+ 'wxGridSizer', 'wxHelpEvent', 'wxHtmlEasyPrinting', 'wxIcon',
+ 'wxIconBundle', 'wxIconizeEvent', 'wxIdleEvent', 'wxImage',
+ 'wxImageList', 'wxJoystickEvent', 'wxKeyEvent',
+ 'wxLayoutAlgorithm', 'wxListBox', 'wxListCtrl', 'wxListEvent',
+ 'wxListItem', 'wxListView', 'wxMask', 'wxMaximizeEvent',
+ 'wxMDIChildFrame', 'wxMDIClientWindow', 'wxMDIParentFrame',
+ 'wxMemoryDC', 'wxMenu', 'wxMenuBar', 'wxMenuEvent', 'wxMenuItem',
+ 'wxMessageDialog', 'wxMiniFrame', 'wxMirrorDC',
+ 'wxMouseCaptureChangedEvent', 'wxMouseEvent', 'wxMoveEvent',
+ 'wxMultiChoiceDialog', 'wxNavigationKeyEvent', 'wxNcPaintEvent',
+ 'wxNotebook', 'wxNotebookEvent', 'wxNotifyEvent',
+ 'wxPageSetupDialog', 'wxPageSetupDialogData', 'wxPaintDC',
+ 'wxPaintEvent', 'wxPalette', 'wxPaletteChangedEvent', 'wxPanel',
+ 'wxPasswordEntryDialog', 'wxPen', 'wxPickerBase', 'wxPostScriptDC',
+ 'wxPreviewCanvas', 'wxPreviewControlBar', 'wxPreviewFrame',
+ 'wxPrintData', 'wxPrintDialog', 'wxPrintDialogData', 'wxPrinter',
+ 'wxPrintout', 'wxPrintPreview', 'wxProgressDialog',
+ 'wxQueryNewPaletteEvent', 'wxRadioBox', 'wxRadioButton',
+ 'wxRegion', 'wxSashEvent', 'wxSashLayoutWindow', 'wxSashWindow',
+ 'wxScreenDC', 'wxScrollBar', 'wxScrolledWindow', 'wxScrollEvent',
+ 'wxScrollWinEvent', 'wxSetCursorEvent', 'wxShowEvent',
+ 'wxSingleChoiceDialog', 'wxSizeEvent', 'wxSizer', 'wxSizerFlags',
+ 'wxSizerItem', 'wxSlider', 'wxSpinButton', 'wxSpinCtrl',
+ 'wxSpinEvent', 'wxSplashScreen', 'wxSplitterEvent',
+ 'wxSplitterWindow', 'wxStaticBitmap', 'wxStaticBox',
+ 'wxStaticBoxSizer', 'wxStaticLine', 'wxStaticText', 'wxStatusBar',
+ 'wxStdDialogButtonSizer', 'wxStyledTextCtrl', 'wxStyledTextEvent',
+ 'wxSysColourChangedEvent', 'wxTextAttr', 'wxTextCtrl',
+ 'wxTextDataObject', 'wxTextEntryDialog', 'wxToggleButton',
+ 'wxToolBar', 'wxToolTip', 'wxTopLevelWindow', 'wxTreeCtrl',
+ 'wxTreeEvent', 'wxUpdateUIEvent', 'wxWindow', 'wxWindowCreateEvent',
+ 'wxWindowDC', 'wxWindowDestroyEvent', 'wxXmlResource', 'xmerl',
+ 'xmerl_eventp', 'xmerl_scan', 'xmerl_xpath', 'xmerl_xs',
+ 'xmerl_xsd', 'xref', 'yecc', 'zip', 'zlib', 'zlib_stub'
+ ),
+ // Binary modifiers
+ 6 => array(
+ 'big', 'binary', 'float', 'integer', 'little', 'signed', 'unit', 'unsigned'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '[', ']', '{', '}'),
+ 1 => array('->', ',', ';', '.'),
+ 2 => array('<<', '>>'),
+ 3 => array('=', '||', '-', '+', '*', '/', '++', '--', '!', '<', '>', '>=',
+ '=<', '==', '/=', '=:=', '=/=')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #186895;',
+ 2 => 'color: #014ea4;',
+ 3 => 'color: #fa6fff;',
+ 4 => 'color: #fa6fff;',
+ 5 => 'color: #ff4e18;',
+ 6 => 'color: #9d4f37;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #109ab8;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff7800;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff9600;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #004866;',
+ 1 => 'color: #6bb810;',
+ 2 => 'color: #ee3800;',
+ 3 => 'color: #014ea4;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #6941fd;',
+ 1 => 'color: #d400ed;',
+ 2 => 'color: #5400b3;',
+ 3 => 'color: #ff3c00;',
+ 4 => 'color: #6941fd;',
+ 5 => 'color: #45b3e6;',
+ 6 => 'color: #ff9600;',
+ 7 => 'color: #d400ed;',
+ 8 => 'color: #ff9600;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => 'http://erlang.org/doc/man/{FNAME}.html',
+ 6 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '-&gt;',
+ 2 => ':'
+ ),
+ 'REGEXPS' => array(
+ //�Macro definitions
+ 0 => array(
+ GESHI_SEARCH => '(-define\s*\()([a-zA-Z0-9_]+)(\(|,)',
+ GESHI_REPLACE => '\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\1',
+ GESHI_AFTER => '\3'
+ ),
+ // Record definitions
+ 1 => array(
+ GESHI_SEARCH => '(-record\s*\()([a-zA-Z0-9_]+)(,)',
+ GESHI_REPLACE => '\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\1',
+ GESHI_AFTER => '\3'
+ ),
+ // Precompiler directives
+ 2 => array(
+ GESHI_SEARCH => '(-)([a-z][a-zA-Z0-9_]*)(\()',
+ GESHI_REPLACE => '\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\1',
+ GESHI_AFTER => '\3'
+ ),
+ // Functions
+ 3 => array(
+ GESHI_SEARCH => '([a-z]\w*|\'\w*\')(\s*\()',
+ GESHI_REPLACE => '\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '\2'
+ ),
+ // Macros
+ 4 => array(
+ GESHI_SEARCH => '(\?)([a-zA-Z0-9_]+)',
+ GESHI_REPLACE => '\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\1',
+ GESHI_AFTER => ''
+ ),
+ // Variables - With hack to avoid interfering wish GeSHi internals
+ 5 => array(
+ GESHI_SEARCH => '([([{,<+*-\/=\s!]|&lt;)(?!(?:PIPE|SEMI|DOT|NUM|REG3XP\d*)\W)([A-Z_]\w*)(?!\w)',
+ GESHI_REPLACE => '\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\1',
+ GESHI_AFTER => ''
+ ),
+ // ASCII�codes
+ 6 => '(\$[a-zA-Z0-9_])',
+ // Records
+ 7 => array(
+ GESHI_SEARCH => '(#)([a-z][a-zA-Z0-9_]*)(\.|\{)',
+ GESHI_REPLACE => '\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\1',
+ GESHI_AFTER => '\3'
+ ),
+ // Numbers with a different radix
+ 8 => '(?<=>)(#[a-zA-Z0-9]*)'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 3 => array(
+ 'DISALLOWED_BEFORE' => '(?<![\w])',
+ 'DISALLOWED_AFTER' => ''//'(?=\s*\()'
+ ),
+ 5 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\'|)',
+ 'DISALLOWED_AFTER' => '(?=(\'|):)'
+ ),
+ 6 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\/|-)',
+ 'DISALLOWED_AFTER' => ''
+ )
+ )
+ ),
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/euphoria.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/euphoria.php
new file mode 100644
index 00000000..7bbf8846
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/euphoria.php
@@ -0,0 +1,140 @@
+<?php
+/*************************************************************************************
+ * euphoria.php
+ * ---------------------------------
+ * Author: Nicholas Koceja (nerketur@hotmail.com)
+ * Copyright: (c) 2010 Nicholas Koceja
+ * Release Version: 1.0.8.11
+ * Date Started: 11/24/2010
+ *
+ * Euphoria language file for GeSHi.
+ *
+ * Author's note: The colors are based off of the Euphoria Editor (ed.ex) colors.
+ * Also, I added comments in places so I could remember a few things about Euphoria.
+ *
+ *
+ * CHANGES
+ * -------
+ * <date-of-release> (1.0.8.9)
+ * - First Release
+ *
+ * TODO (updated <date-of-release>)
+ * -------------------------
+ * seperate the funtions from the procedures, and have a slight color change for each.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Euphoria',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array(), //Euphoria doesn't support multi-line comments
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array( // keywords
+ 'and', 'by', 'constant', 'do', 'else', 'elsif', 'end', 'exit',
+ 'for', 'function', 'global', 'if', 'include', 'not', 'or',
+ 'procedure', 'return', 'then', 'to', 'type', 'while', 'with',
+ 'without', 'xor'
+ ),
+ 2 => array( // built-ins
+ 'abort', 'and_bits', 'append', 'arctan', 'atom', 'c_func', 'call',
+ 'c_proc', 'call_func', 'call_proc', 'clear_screen', 'close', 'compare',
+ 'command_line', 'cos', 'date', 'equal', 'find', 'find_from', 'floor',
+ 'getc', 'getenv', 'gets', 'get_key', 'get_pixel', 'integer', 'length',
+ 'log', 'machine_func', 'machine_proc', 'match', 'match_from',
+ 'mem_copy', 'mem_set', 'not_bits', 'object', 'open', 'or_bits', 'peek',
+ 'peek4s', 'peek4u', 'pixel', 'platform', 'poke', 'poke4', 'position',
+ 'power', 'prepend', 'print', 'printf', 'profile', 'puts', 'rand',
+ 'remainder', 'repeat', 'routine_id', 'sequence', 'sin', 'sprintf',
+ 'sqrt', 'system', 'system_exec', 'tan', 'task_clock_stop',
+ 'task_clock_start', 'task_create', 'task_list', 'task_schedule',
+ 'task_self', 'task_status', 'task_suspend', 'task_yield', 'time',
+ 'trace', 'xor_bits'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '(', ')', '{', '}', '[', ']'
+ ),
+ 1 => array(
+ '+', '-', '*', '/', '=', '&', '^'
+ ),
+ 2 => array(
+ '&', '?', ','
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff; font-weight: bold;', // keywords
+ 2 => 'color: #cc33ff; font-weight: bold;', // builtins
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #ff0000; font-style: italic;',
+ 'MULTI' => '' // doesn't exist
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #009900; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #999900; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #00cc00;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc33cc; font-style: italic'
+ ),
+ 'METHODS' => array( // Doesn't exist in Euphoria. Everything is a function =)
+ 0 => ''
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #999900;', // brackets
+ 1 => 'color: #333333;', // operators
+ 2 => 'color: #333333; font-style: bold' // print+concat
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array( // Never included in scripts.
+ )
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/f1.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/f1.php
new file mode 100644
index 00000000..7d767608
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/f1.php
@@ -0,0 +1,151 @@
+<?php
+/*************************************************************************************
+ * f1.php
+ * -------
+ * Author: Juro Bystricky (juro@f1compiler.com)
+ * Copyright: K2 Software Corp.
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/07/06
+ *
+ * Formula One language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/06 (1.0.8.9)
+ * - First Release
+ *
+ * TODO
+ * -------------------------
+ * - Add more RTL functions with URLs
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Formula One',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('{' => '}'),
+ 'COMMENT_REGEXP' => array(
+ //Nested Comments
+ 2 => "/(\{(?:\{.*\}|[^\{])*\})/m"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'",'"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[\\\\nrt\'\"?\n]#i",
+ //Hexadecimal Char Specs (Utf16 codes, Unicode versions only)
+ 2 => "#\\\\u[\da-fA-F]{4}#",
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE |
+ GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX_0O |
+ GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'pred','proc','subr','else','elsif','iff','if','then','false','true',
+ 'case','of','use','local','mod','end','list','file','all','one','max','min','rel',
+ 'external','Nil','_stdcall','_cdecl','_addressof','_pred','_file','_line'
+ ),
+ 2 => array(
+ 'Ascii','Bin','I','L','P','R','S','U'
+ ),
+ 3 => array(
+ 'Append','in','Dupl','Len','Print','_AllDifferent','_AllAscending',
+ '_AllDescending','_Ascending','_Descending'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '[', ']'),
+ 1 => array('<', '>','='),
+ 2 => array('+', '-', '*', '/'),
+ 3 => array('&', '|'),
+ 4 => array(':', ';')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #000080;',
+ 3 => 'color: #000080;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000; font-style: italic;',
+ 2 => 'color: #008000; font-style: italic;',
+ 'MULTI' => 'color: #008000; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #009999; font-weight: bold;',
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #800000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;',
+ 1 => 'color: #000000;',
+ 2 => 'color: #000000;',
+ 3 => 'color: #000000;',
+ 4 => 'color: #000000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.f1compiler.com/f1helponline/f1_runtime_library.html#{FNAME}'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/falcon.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/falcon.php
new file mode 100644
index 00000000..2111d9e8
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/falcon.php
@@ -0,0 +1,218 @@
+<?php
+/*************************************************************************************
+ * falcon.php
+ * ---------------------------------
+ * Author: billykater (billykater+geshi@gmail.com)
+ * Copyright: (c) 2010 billykater (http://falconpl.org/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/06/07
+ *
+ * Falcon language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * <2010/8/1> (1.0.8.10)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Falcon',
+ 'COMMENT_SINGLE' => array( 1 => '//' ),
+ 'COMMENT_MULTI' => array( '/*' => '*/' ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array( "'", '"' ),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'break','case','catch','class','const','continue','def','default',
+ 'dropping','elif','else','end','enum','for','forfirst','forlast',
+ 'formiddle','from','function','global','if','init','innerfunc',
+ 'launch','loop','object','raise','return','select','state','static',
+ 'switch','try','while'
+ ),
+ 2 => array(
+ 'false','nil','true',
+ ),
+ 3 => array(
+ 'and','as','eq','fself','in','not','notin','or','provides','self','to'
+ ),
+ 4 => array(
+ 'directive','export','import','load','macro'
+ ),
+ 5 => array(
+ 'ArrayType','BooleanType','ClassMethodType','ClassType','DictionaryType',
+ 'FunctionType','MemBufType','MethodType','NilType','NumericType','ObjectType',
+ 'RangeType','StringType','LBindType'
+ ),
+ 6 => array(
+ "CurrentTime","IOStream","InputStream","MemBufFromPtr","OutputStream",
+ "PageDict","ParseRFC2822","abs","acos","all",
+ "allp","any","anyp","argd","argv",
+ "arrayAdd","arrayBuffer","arrayCompact","arrayDel","arrayDelAll",
+ "arrayFill","arrayFind","arrayHead","arrayIns","arrayMerge",
+ "arrayNM","arrayRemove","arrayResize","arrayScan","arraySort",
+ "arrayTail","asin","assert","atan","atan2",
+ "attributes","baseClass","beginCritical","bless","brigade",
+ "broadcast","cascade","ceil","choice","chr",
+ "className","clone","combinations","compare","consume",
+ "cos","deg2rad","deoob","derivedFrom","describe",
+ "deserialize","dictBack","dictBest","dictClear","dictFill",
+ "dictFind","dictFront","dictGet","dictKeys","dictMerge",
+ "dictRemove","dictSet","dictValues","dirChange","dirCurrent",
+ "dirMake","dirMakeLink","dirReadLink","dirRemove","dolist",
+ "endCritical","epoch","eval","exit","exp",
+ "factorial","fileChgroup","fileChmod","fileChown","fileCopy",
+ "fileExt","fileMove","fileName","fileNameMerge","filePath",
+ "fileRemove","fileType","fileUnit","filter","fint",
+ "firstOf","floop","floor","fract","getAssert",
+ "getEnviron","getProperty","getSlot","getSystemEncoding","getenv",
+ "iff","include","input","inspect","int",
+ "isBound","isCallable","isoob","lbind","len",
+ "let","lit","log","map","max",
+ "metaclass","min","numeric","oob","ord",
+ "paramCount","paramIsRef","paramSet","parameter","passvp",
+ "permutations","pow","print","printl","properties",
+ "rad2deg","random","randomChoice","randomDice","randomGrab",
+ "randomPick","randomSeed","randomWalk","readURI","reduce",
+ "retract","round","seconds","serialize","set",
+ "setProperty","setenv","sin","sleep","stdErr",
+ "stdErrRaw","stdIn","stdInRaw","stdOut","stdOutRaw",
+ "strBack","strBackFind","strBackTrim","strBuffer","strCmpIgnoreCase",
+ "strEndsWith","strEscape","strEsq","strFill","strFind",
+ "strFromMemBuf","strFront","strFrontTrim","strLower","strMerge",
+ "strReplace","strReplicate","strSplit","strSplitTrimmed","strStartsWith",
+ "strToMemBuf","strTrim","strUnescape","strUnesq","strUpper",
+ "strWildcardMatch","subscribe","systemErrorDescription","tan","times",
+ "toString","transcodeFrom","transcodeTo","typeOf","unsetenv",
+ "unsubscribe","valof","vmFalconPath","vmIsMain","vmModuleName",
+ "vmModuleVersionInfo","vmSearchPath","vmSystemType","vmVersionInfo","vmVersionName",
+ "writeURI","xmap","yield","yieldOut"
+ ),
+ 7 => array(
+ "AccessError","Array","BOM","Base64","Class",
+ "ClassMethod","CloneError","CmdlineParser","CodeError","Continuation",
+ "Dictionary","Directory","Error","FileStat","Format",
+ "Function","GarbagePointer","GenericError","Integer","InterruptedError",
+ "IoError","Iterator","LateBinding","List","MathError",
+ "MemoryBuffer","MessageError","Method","Numeric","Object",
+ "ParamError","ParseError","Path","Range","Semaphore",
+ "Sequence","Set","Stream","String","StringStream",
+ "SyntaxError","Table","TableError","TimeStamp","TimeZone",
+ "Tokenizer","TypeError","URI","VMSlot"
+ ),
+ 8 => array(
+ "args","scriptName","scriptPath"
+ ),
+ 9 => array(
+ "GC"
+ ),
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => 'http://falconpl.org/project_docs/core/functions.html#typeOf',
+ 6 => 'http://falconpl.org/project_docs/core/functions.html#{FNAME}',
+ 7 => 'http://falconpl.org/project_docs/core/class_{FNAME}.html',
+ 8 => 'http://falconpl.org/project_docs/core/globals.html#{FNAME}',
+ 9 => 'http://falconpl.org/project_docs/core/object_{FNAME}.html)'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ 9 => true
+ ),
+ 'SYMBOLS' => array(
+ '(',')','$','%','&','/','{','[',']','=','}','?','+','-','#','*','@',
+ '<','>','|',',',':',';','\\','^'
+ ),
+ 'REGEXPS' => array(
+ 0 => array(
+ GESHI_SEARCH => '(\[)([a-zA-Z_]|\c{C})(?:[a-zA-Z0-9_]|\p{C})*(\])',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3',
+
+ ),
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array( '<?' => '?>' )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000080;font-weight:bold;',
+ 2 => 'color: #800000;font-weight:bold;',
+ 3 => 'color: #800000;font-weight:bold;',
+ 4 => 'color: #000080;font-weight:bold;',
+ 5 => 'color: #000000;font-weight:bold;',
+ 6 => 'font-weight:bold;',
+ 7 => 'font-weight:bold;',
+ 8 => 'font-weight:bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #29B900;',
+ 'MULTI' => 'color: #008080'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #800000'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #800000'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000000'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #000000'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #8B0513'
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #FF00FF'
+ )
+ ),
+
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ '.'
+ )
+);
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/fo.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/fo.php
new file mode 100644
index 00000000..ba4a5924
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/fo.php
@@ -0,0 +1,327 @@
+<?php
+/*************************************************************************************
+ * fo.php
+ * --------
+ * Author: Tan-Vinh Nguyen (tvnguyen@web.de)
+ * Copyright: (c) 2009 Tan-Vinh Nguyen
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/03/23
+ *
+ * fo language file for GeSHi.
+ *
+ * FO stands for "Flexible Oberflaechen" (Flexible Surfaces) and
+ * is part of the abas-ERP.
+ *
+ * CHANGES
+ * -------
+ * 2009/03/23 (1.0.0)
+ * - First Release
+ * Basic commands in German and English
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'FO (abas-ERP)',
+ 'COMMENT_SINGLE' => array(1 => '..'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ //Control Flow
+ 1 => array(
+ /* see http://www.abas.de/sub_de/kunden/help/hd/html/9.html */
+
+ /* fo keywords, part 1: control flow */
+ '.weiter', '.continue'
+
+ /* this language works with goto's only*/
+ ),
+
+ //FO Keywords
+ 2 => array(
+ /* fo keywords, part 2 */
+ '.fo', '.formel', '.formula',
+ '.zuweisen', '.assign',
+ '.fehler', '.error',
+ '.ende', '.end'
+ ),
+
+ //Java Keywords
+ 3 => array(
+ /* Java keywords, part 3: primitive data types */
+ '.art', '.type',
+ 'integer', 'real', 'bool', 'text', 'datum', 'woche', 'termin', 'zeit',
+ 'mehr', 'MEHR'
+ ),
+
+ //Reserved words in fo literals
+ 4 => array(
+ /* other reserved words in fo literals */
+ /* should be styled to look similar to numbers and Strings */
+ 'false', 'null', 'true',
+ 'OBJEKT',
+ 'VORGANG', 'PROCESS',
+ 'OFFEN', 'OPEN',
+ 'ABORT',
+ 'AN', 'ADDEDTO',
+ 'AUF', 'NEW',
+ 'BILDSCHIRM', 'TERMINAL',
+ 'PC',
+ 'MASKE', 'SCREEN',
+ 'ZEILE', 'LINE'
+ ),
+
+ // interpreter settings
+ 5 => array (
+ '..!INTERPRETER', 'DEBUG'
+ ),
+
+ // database commands
+ 6 => array (
+ '.hole', '.hol', '.select',
+ '.lade', '.load',
+ '.aktion', '.action',
+ '.belegen', '.occupy',
+ '.bringe', '.rewrite',
+ '.dazu', '.add',
+ '.löschen', '.delete',
+ '.mache', '.make',
+ '.merke', '.reserve',
+ '.setze', '.set',
+ 'SPERREN', 'LOCK',
+ 'TEIL', 'PART',
+ 'KEINESPERRE',
+ 'AMASKE', 'ASCREEN',
+ 'BETRIEB', 'WORK-ORDER',
+ 'NUMERISCH', 'NUMERICAL',
+ 'VORSCHLAG', 'SUGGESTION',
+ 'OBLIGO', 'OUTSTANDING',
+ 'LISTE', 'LIST',
+ 'DRUCK', 'PRINT',
+ 'ÃœBERNAHME', 'TAGEOVER',
+ 'ABLAGE', 'FILINGSYSTEM',
+ 'BDE', 'PDC',
+ 'BINDUNG', 'ALLOCATION',
+ 'BUCHUNG', 'ENTRY',
+ 'COLLI', 'SERIAL',
+ 'DATEI', 'FILE',
+ 'VERKAUF', 'SALES',
+ 'EINKAUF', 'PURCHASING',
+ 'EXEMPLAR', 'EXAMPLE',
+ 'FERTIGUNG', 'PRODUCTION',
+ 'FIFO',
+ 'GRUPPE', 'GROUP',
+ 'JAHR', 'YEAR',
+ 'JOURNAL',
+ 'KOPF', 'HEADER',
+ 'KOSTEN',
+ 'LIFO',
+ 'LMENGE', 'SQUANTITY',
+ 'LOHNFERTIGUNG', 'SUBCONTRACTING',
+ 'LPLATZ', 'LOCATION',
+ 'MBELEGUNG', 'MACHLOADING',
+ 'MONAT', 'MONTH', 'MZ',
+ 'NACHRICHT', 'MESSAGE',
+ 'PLAN', 'TARGET',
+ 'REGIONEN', 'REGIONS',
+ 'SERVICEANFRAGE', 'SERVICEREQUEST',
+ 'VERWENDUNG', 'APPLICATION',
+ 'WEITER', 'CONTINUE',
+ 'ABBRUCH', 'CANCEL',
+ 'ABLAGEKENNZEICHEN', 'FILLINGCODE',
+ 'ALLEIN', 'SINGLEUSER',
+ 'AUFZAEHLTYP', 'ENUMERATION-TYPE',
+ 'AUSGABE', 'OUTPUT',
+ 'DEZPUNKT', 'DECPOINT'
+ ),
+
+ // output settings
+ 7 => array (
+ '.absatz', '.para',
+ '.blocksatz', '.justified',
+ '.flattersatz', '.unjustified',
+ '.format',
+ '.box',
+ '.drucken', '.print',
+ '.gedruckt', '.printed',
+ '.länge', '.length',
+ '.links', '.left',
+ '.rechts', '.right',
+ '.oben', '.up',
+ '.unten', '.down',
+ '.seite', '.page',
+ '.tabellensatz', '.tablerecord',
+ '.trenner', '.separator',
+ 'ARCHIV'
+ ),
+
+ // text commands
+ 8 => array (
+ '.text',
+ '.atext',
+ '.println',
+ '.uebersetzen', '.translate'
+ ),
+
+ // I/O commands
+ 9 => array (
+ '.aus', '.ausgabe', '.output',
+ '.ein', '.eingabe', '.input',
+ '.datei', '.file',
+ '.lesen', '.read',
+ '.sortiere', '.sort',
+ '-ÖFFNEN', '-OPEN',
+ '-TEST',
+ '-LESEN', '-READ',
+ 'VON', 'FROM'
+ ),
+
+ //system
+ 10 => array (
+ '.browser',
+ '.kommando', '.command',
+ '.system', '.dde',
+ '.editiere', '.edit',
+ '.hilfe', '.help',
+ '.kopieren', '.copy',
+ '.pc.clip',
+ '.pc.copy',
+ '.pc.dll',
+ '.pc.exec',
+ '.pc.open',
+ 'DIAGNOSE', 'ERRORREPORT',
+ 'DOPPELPUNKT', 'COLON',
+ 'ERSETZUNG', 'REPLACEMENT',
+ 'WARTEN', 'PARALLEL'
+ ),
+
+ //fibu/accounting specific commands
+ 11 => array (
+ '.budget',
+ '.chart',
+ 'VKZ',
+ 'KONTO', 'ACCOUNT',
+ 'AUSZUG', 'STATEMENT',
+ 'WAEHRUNG', 'CURRENCY',
+ 'WAEHRUNGSKURS', 'EXCHANGERATE',
+ 'AUSWAEHR', 'FORCURR',
+ 'BUCHUNGSKREIS', 'SET OF BOOKS'
+ ),
+
+ // efop - extended flexible surface
+ 12 => array (
+ '.cursor',
+ '.farbe', '.colour',
+ '.fenster', '.window',
+ '.hinweis', '.note',
+ '.menue', '.menu',
+ '.schutz', '.protection',
+ '.zeigen', '.view',
+ '.zeile', '.line',
+ 'VORDERGRUND', 'FOREGROUND',
+ 'HINTERGRUND', 'BACKGROUND',
+ 'SOFORT', 'IMMEDIATELY',
+ 'AKTUALISIEREN', 'UPDATE',
+ 'FENSTERSCHLIESSEN', 'CLOSEWINDOWS'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '[', ']', '{', '}', '*', '&', '%', ';', '<', '>'),
+ 1 => array('?', '!')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ /* all fo keywords are case sensitive, don't have to but I like this type of coding */
+ 1 => true, 2 => true, 3 => true, 4 => true,
+ 5 => true, 6 => true, 7 => true, 8 => true, 9 => true,
+ 10 => true, 11 => true, 12 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #006600; font-weight: bold;',
+ 4 => 'color: #006600; font-weight: bold;',
+ 5 => 'color: #003399; font-weight: bold;',
+ 6 => 'color: #003399; font-weight: bold;',
+ 7 => 'color: #003399; font-weight: bold;',
+ 8 => 'color: #003399; font-weight: bold;',
+ 9 => 'color: #003399; font-weight: bold;',
+ 10 => 'color: #003399; font-weight: bold;',
+ 11 => 'color: #003399; font-weight: bold;',
+ 12 => 'color: #003399; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ //2 => 'color: #006699;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006633;',
+ 2 => 'color: #006633;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;',
+ 1 => 'color: #000000; font-weight: bold;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+ 9 => '',
+ 10 => '',
+ 11 => '',
+ 12 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/fortran.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/fortran.php
new file mode 100644
index 00000000..c21ccd19
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/fortran.php
@@ -0,0 +1,160 @@
+<?php
+/*************************************************************************************
+ * fortran.php
+ * -----------
+ * Author: Cedric Arrabie (cedric.arrabie@univ-pau.fr)
+ * Copyright: (C) 2006 Cetric Arrabie
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/04/22
+ *
+ * Fortran language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2006/04/20 (1.0.0)
+ * - First Release
+ *
+ * TODO
+ * -------------------------
+ * - Get a list of inbuilt functions to add (and explore fortran more
+ * to complete this rather bare language file)
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME'=>'Fortran',
+ 'COMMENT_SINGLE'=> array(1 =>'!',2=>'Cf2py'),
+ 'COMMENT_MULTI'=> array(),
+ //Fortran Comments
+ 'COMMENT_REGEXP' => array(1 => '/^C.*?$/mi'),
+ 'CASE_KEYWORDS'=> GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS'=> array("'",'"'),
+ 'ESCAPE_CHAR'=>'\\',
+ 'KEYWORDS'=> array(
+ 1 => array(
+ 'allocate','block','call','case','contains','continue','cycle','deallocate',
+ 'default','do','else','elseif','elsewhere','end','enddo','endif','endwhere',
+ 'entry','exit','function','go','goto','if','interface','module','nullify','only',
+ 'operator','procedure','program','recursive','return','select','stop',
+ 'subroutine','then','to','where','while',
+ 'access','action','advance','blank','blocksize','carriagecontrol',
+ 'delim','direct','eor','err','exist','file','flen','fmt','form','formatted',
+ 'iostat','name','named','nextrec','nml','number','opened','pad','position',
+ 'readwrite','recl','sequential','status','unformatted','unit'
+ ),
+ 2 => array(
+ '.AND.','.EQ.','.EQV.','.GE.','.GT.','.LE.','.LT.','.NE.','.NEQV.','.NOT.',
+ '.OR.','.TRUE.','.FALSE.'
+ ),
+ 3 => array(
+ 'allocatable','character','common','complex','data','dimension','double',
+ 'equivalence','external','implicit','in','inout','integer','intent','intrinsic',
+ 'kind','logical','namelist','none','optional','out','parameter','pointer',
+ 'private','public','real','result','save','sequence','target','type','use'
+ ),
+ 4 => array(
+ 'abs','achar','acos','adjustl','adjustr','aimag','aint','all','allocated',
+ 'anint','any','asin','atan','atan2','bit_size','break','btest','carg',
+ 'ceiling','char','cmplx','conjg','cos','cosh','cpu_time','count','cshift',
+ 'date_and_time','dble','digits','dim','dot_product','dprod dvchk',
+ 'eoshift','epsilon','error','exp','exponent','floor','flush','fraction',
+ 'getcl','huge','iachar','iand','ibclr','ibits','ibset','ichar','ieor','index',
+ 'int','intrup','invalop','ior','iostat_msg','ishft','ishftc','lbound',
+ 'len','len_trim','lge','lgt','lle','llt','log','log10','matmul','max','maxexponent',
+ 'maxloc','maxval','merge','min','minexponent','minloc','minval','mod','modulo',
+ 'mvbits','nbreak','ndperr','ndpexc','nearest','nint','not','offset','ovefl',
+ 'pack','precfill','precision','present','product','prompt','radix',
+ 'random_number','random_seed','range','repeat','reshape','rrspacing',
+ 'scale','scan','segment','selected_int_kind','selected_real_kind',
+ 'set_exponent','shape','sign','sin','sinh','size','spacing','spread','sqrt',
+ 'sum system','system_clock','tan','tanh','timer','tiny','transfer','transpose',
+ 'trim','ubound','undfl','unpack','val','verify'
+ ),
+ ),
+ 'SYMBOLS'=> array(
+ '(',')','{','}','[',']','=','+','-','*','/','!','%','^','&',':'
+ ),
+ 'CASE_SENSITIVE'=> array(
+ GESHI_COMMENTS => true,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES'=> array(
+ 'KEYWORDS'=> array(
+ 1 =>'color: #b1b100;',
+ 2 =>'color: #000000; font-weight: bold;',
+ 3 =>'color: #000066;',
+ 4 =>'color: #993333;'
+ ),
+ 'COMMENTS'=> array(
+ 1 =>'color: #666666; font-style: italic;',
+ 2 =>'color: #339933;',
+ 'MULTI'=>'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR'=> array(
+ 0 =>'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS'=> array(
+ 0 =>'color: #009900;'
+ ),
+ 'STRINGS'=> array(
+ 0 =>'color: #ff0000;'
+ ),
+ 'NUMBERS'=> array(
+ 0 =>'color: #cc66cc;'
+ ),
+ 'METHODS'=> array(
+ 1 =>'color: #202020;',
+ 2 =>'color: #202020;'
+ ),
+ 'SYMBOLS'=> array(
+ 0 =>'color: #339933;'
+ ),
+ 'REGEXPS'=> array(
+ ),
+ 'SCRIPT'=> array(
+ )
+ ),
+ 'URLS'=> array(
+ 1 =>'',
+ 2 =>'',
+ 3 =>'',
+ 4 =>''
+ ),
+ 'OOLANG'=> true,
+ 'OBJECT_SPLITTERS'=> array(
+ 1 =>'.',
+ 2 =>'::'
+ ),
+ 'REGEXPS'=> array(
+ ),
+ 'STRICT_MODE_APPLIES'=> GESHI_NEVER,
+ 'SCRIPT_DELIMITERS'=> array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK'=> array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/freebasic.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/freebasic.php
new file mode 100644
index 00000000..b23f39bc
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/freebasic.php
@@ -0,0 +1,141 @@
+<?php
+/*************************************************************************************
+ * freebasic.php
+ * -------------
+ * Author: Roberto Rossi
+ * Copyright: (c) 2005 Roberto Rossi (http://rsoftware.altervista.org)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/08/19
+ *
+ * FreeBasic (http://www.freebasic.net/) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/08/19 (1.0.0)
+ * - First Release
+ *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'FreeBasic',
+ 'COMMENT_SINGLE' => array(1 => "'", 2 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ "append", "as", "asc", "asin", "asm", "atan2", "atn", "beep", "bin", "binary", "bit",
+ "bitreset", "bitset", "bload", "bsave", "byref", "byte", "byval", "call",
+ "callocate", "case", "cbyte", "cdbl", "cdecl", "chain", "chdir", "chr", "cint",
+ "circle", "clear", "clng", "clngint", "close", "cls", "color", "command",
+ "common", "cons", "const", "continue", "cos", "cshort", "csign", "csng",
+ "csrlin", "cubyte", "cuint", "culngint", "cunsg", "curdir", "cushort", "custom",
+ "cvd", "cvi", "cvl", "cvlongint", "cvs", "cvshort", "data", "date",
+ "deallocate", "declare", "defbyte", "defdbl", "defined", "defint", "deflng",
+ "deflngint", "defshort", "defsng", "defstr", "defubyte", "defuint",
+ "defulngint", "defushort", "dim", "dir", "do", "double", "draw", "dylibload",
+ "dylibsymbol", "else", "elseif", "end", "enum", "environ", 'environ$', "eof",
+ "eqv", "erase", "err", "error", "exec", "exepath", "exit", "exp", "export",
+ "extern", "field", "fix", "flip", "for", "fre", "freefile", "function", "get",
+ "getjoystick", "getkey", "getmouse", "gosub", "goto", "hex", "hibyte", "hiword",
+ "if", "iif", "imagecreate", "imagedestroy", "imp", "inkey", "inp", "input",
+ "instr", "int", "integer", "is", "kill", "lbound", "lcase", "left", "len",
+ "let", "lib", "line", "lobyte", "loc", "local", "locate", "lock", "lof", "log",
+ "long", "longint", "loop", "loword", "lset", "ltrim", "mid", "mkd", "mkdir",
+ "mki", "mkl", "mklongint", "mks", "mkshort", "mod", "multikey", "mutexcreate",
+ "mutexdestroy", "mutexlock", "mutexunlock", "name", "next", "not", "oct", "on",
+ "once", "open", "option", "or", "out", "output", "overload", "paint", "palette",
+ "pascal", "pcopy", "peek", "peeki", "peeks", "pipe", "pmap", "point", "pointer",
+ "poke", "pokei", "pokes", "pos", "preserve", "preset", "print", "private",
+ "procptr", "pset", "ptr", "public", "put", "random", "randomize", "read",
+ "reallocate", "redim", "rem", "reset", "restore", "resume",
+ "return", "rgb", "rgba", "right", "rmdir", "rnd", "rset", "rtrim", "run",
+ "sadd", "screen", "screencopy", "screeninfo", "screenlock", "screenptr",
+ "screenres", "screenset", "screensync", "screenunlock", "seek", "statement",
+ "selectcase", "setdate", "setenviron", "setmouse",
+ "settime", "sgn", "shared", "shell", "shl", "short", "shr", "sin", "single",
+ "sizeof", "sleep", "space", "spc", "sqr", "static", "stdcall", "step", "stop",
+ "str", "string", "strptr", "sub", "swap", "system", "tab", "tan",
+ "then", "threadcreate", "threadwait", "time", "timer", "to", "trans",
+ "trim", "type", "ubound", "ubyte", "ucase", "uinteger", "ulongint", "union",
+ "unlock", "unsigned", "until", "ushort", "using", "va_arg", "va_first",
+ "va_next", "val", "val64", "valint", "varptr", "view", "viewprint", "wait",
+ "wend", "while", "width", "window", "windowtitle", "with", "write", "xor",
+ "zstring", "explicit", "escape", "true", "false"
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080;',
+ 2 => 'color: #339933;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/freeswitch.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/freeswitch.php
new file mode 100644
index 00000000..c6fff276
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/freeswitch.php
@@ -0,0 +1,168 @@
+<?php
+/*************************************************************************************
+ * freeswitch.php
+ * --------
+ * Author: James Rose (james.gs@stubbornroses.com)
+ * Copyright: (c) 2006 Christian Lescuyer http://xtian.goelette.info
+ * Release Version: 1.0.8.11n/a
+ * Date Started: 2011/11/18
+ *
+ * FreeSWITCH language file for GeSHi.
+ *
+ * This file is based on robots.php
+ *
+ * 2011/11/18 (1.0.0)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'FreeSWITCH',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(1 => "/^Comment:.*?$/m"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+// 1 => array(
+// 'Disallow', 'Request-rate', 'Robot-version',
+// 'Sitemap', 'User-agent', 'Visit-time'
+// )
+ ),
+ 'SYMBOLS' => array(
+// ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false
+ ),
+
+//order is important. regexes will overwrite most things....
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+// 1 => 'color: #FF0000; font-weight: bold;',//red
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+// 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+// 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+// 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+// 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: firebrick; font-weight: bold;',
+ 1 => 'color: cornflowerblue; font-weight: bold;',
+ 2 => 'color: goldenrod; font-weight: bold;',
+ 3 => 'color: green; font-weight: bold;',
+ 4 => 'color: dimgrey; font-style: italic;',
+ 5 => 'color: green; font-weight: bold;',
+ 6 => 'color: firebrick; font-weight: bold;',
+ 7 => 'color: indigo; font-weight: italic;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+// 1 => 'http://www.robotstxt.org/wc/norobots.html'
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => array(
+ GESHI_SEARCH => '(^.*ERROR.*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'im',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 1 => array(
+ GESHI_SEARCH => '(^.*NOTICE.*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'im',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 2 => array(
+ GESHI_SEARCH => '(^.*DEBUG.*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 3 => array(
+ GESHI_SEARCH => '(^.*INFO.*|.*info\(.*|^Channel.*|^Caller.*|^variable.*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 4 => array(
+ GESHI_SEARCH => '(^Dialplan.*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'im',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 5 => array(
+ GESHI_SEARCH => '(Regex\ \(PASS\))',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 6 => array(
+ GESHI_SEARCH => '(Regex\ \(FAIL\))',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 7 => array(
+ GESHI_SEARCH => '(\d{7,15})',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ )
+ ),
+
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/fsharp.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/fsharp.php
new file mode 100644
index 00000000..d85a7c75
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/fsharp.php
@@ -0,0 +1,213 @@
+<?php
+/*************************************************************************************
+ * fsharp.php
+ * ----------
+ * Author: julien ortin (jo_spam-divers@yahoo.fr)
+ * Copyright: (c) 2009 julien ortin
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/09/20
+ *
+ * F# language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/09/22 (1.0.1)
+ * - added rules for single char handling (generics ['a] vs char ['x'])
+ * - added symbols and keywords
+ * 2009/09/20 (1.0.0)
+ * - Initial release
+ *
+ * TODO
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'F#',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(3 => '/\(\*(?!\)).*?\*\)/s'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'HARDQUOTE' => array('@"', '"'),
+ 'HARDESCAPE' => array('"'),
+ 'HARDCHAR' => '"',
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ /* main F# keywords */
+ /* section 3.4 */
+ 1 => array(
+ 'abstract', 'and', 'as', 'assert', 'base', 'begin', 'class', 'default', 'delegate', 'do', 'done',
+ 'downcast', 'downto', 'elif', 'else', 'end', 'exception', 'extern', 'false', 'finally', 'for',
+ 'fun', 'function', 'if', 'in', 'inherit', 'inline', 'interface', 'internal', 'lazy', 'let',
+ 'match', 'member', 'module', 'mutable', 'namespace', 'new', 'not', 'null', 'of', 'open', 'or',
+ 'override', 'private', 'public', 'rec', 'return', 'sig', 'static', 'struct', 'then', 'to',
+ 'true', 'try', 'type', 'upcast', 'use', 'val', 'void', 'when', 'while', 'with', 'yield',
+ 'asr', 'land', 'lor', 'lsl', 'lsr', 'lxor', 'mod',
+ /* identifiers are reserved for future use by F# */
+ 'atomic', 'break', 'checked', 'component', 'const', 'constraint', 'constructor',
+ 'continue', 'eager', 'fixed', 'fori', 'functor', 'global', 'include', 'method', 'mixin',
+ 'object', 'parallel', 'params', 'process', 'protected', 'pure', 'sealed', 'tailcall',
+ 'trait', 'virtual', 'volatile',
+ /* take monads into account */
+ 'let!', 'yield!'
+ ),
+ /* define names of main libraries in F# Core, so we can link to it
+ * http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/namespaces.html
+ */
+ 2 => array(
+ 'Array', 'Array2D', 'Array3D', 'Array4D', 'ComparisonIdentity', 'HashIdentity', 'List',
+ 'Map', 'Seq', 'SequenceExpressionHelpers', 'Set', 'CommonExtensions', 'Event',
+ 'ExtraTopLevelOperators', 'LanguagePrimitives', 'NumericLiterals', 'Operators',
+ 'OptimizedClosures', 'Option', 'String', 'NativePtr', 'Printf'
+ ),
+ /* 17.2 & 17.3 */
+ 3 => array(
+ 'abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'exp',
+ 'floor', 'log', 'log10', 'pown', 'round', 'sign', 'sin', 'sinh', 'sqrt',
+ 'tan', 'tanh',
+ 'ignore',
+ 'fst', 'snd',
+ 'stdin', 'stdout', 'stderr',
+ 'KeyValue',
+ 'max', 'min'
+ ),
+ /* Pervasives Types & Overloaded Conversion Functions */
+ 4 => array(
+ 'bool', 'byref', 'byte', 'char', 'decimal', 'double', 'exn', 'float', 'float32',
+ 'FuncConvert', 'ilsigptr', 'int', 'int16', 'int32', 'int64', 'int8',
+ 'nativeint', 'nativeptr', 'obj', 'option', 'ref', 'sbyte', 'single', 'string', 'uint16',
+ 'uint32', 'uint64', 'uint8', 'unativeint', 'unit',
+ 'enum',
+ 'async', 'seq', 'dict'
+ ),
+ /* 17.2 Exceptions */
+ 5 => array (
+ 'failwith', 'invalidArg', 'raise', 'rethrow'
+ ),
+ /* 3.3 Conditional compilation & 13.3 Compiler Directives + light / light off */
+ 6 => array(
+ '(*IF-FSHARP', 'ENDIF-FSHARP*)', '(*F#', 'F#*)', '(*IF-OCAML', 'ENDIF-OCAML*)',
+ '#light',
+ '#if', '#else', '#endif', '#indent', '#nowarn', '#r', '#reference',
+ '#I', '#Include', '#load', '#time', '#help', '#q', '#quit',
+ ),
+ /* 3.11 Pre-processor Declarations / Identifier Replacements */
+ 7 => array(
+ '__SOURCE_DIRECTORY__', '__SOURCE_FILE__', '__LINE__'
+ ),
+ /* 17.2 Object Transformation Operators */
+ 8 => array(
+ 'box', 'hash', 'sizeof', 'typeof', 'typedefof', 'unbox'
+ )
+ ),
+ /* 17.2 basic operators + the yield and yield! arrows */
+ 'SYMBOLS' => array(
+ 1 => array('+', '-', '/', '*', '**', '%', '~-'),
+ 2 => array('<', '<=', '>', '<=', '=', '<>'),
+ 3 => array('<<<', '>>>', '^^^', '&&&', '|||', '~~~'),
+ 4 => array('|>', '>>', '<|', '<<'),
+ 5 => array('!', '->', '->>'),
+ 6 => array('[',']','(',')','{','}', '[|', '|]', '(|', '|)'),
+ 7 => array(':=', ';', ';;')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true, /* keywords */
+ 2 => true, /* modules */
+ 3 => true, /* pervasives functions */
+ 4 => true, /* types and overloaded conversion operators */
+ 5 => true, /* exceptions */
+ 6 => true, /* conditional compilation & compiler Directives */
+ 7 => true, /* pre-processor declarations / identifier replacements */
+ 8 => true /* object transformation operators */
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #06c; font-weight: bold;', /* nice blue */
+ 2 => 'color: #06c; font-weight: bold;', /* nice blue */
+ 3 => 'color: #06c; font-weight: bold;', /* nice blue */
+ 4 => 'color: #06c; font-weight: bold;', /* nice blue */
+ 5 => 'color: #06c; font-weight: bold;', /* nice blue */
+ 6 => 'color: #06c; font-weight: bold;', /* nice blue */
+ 7 => 'color: #06c; font-weight: bold;', /* nice blue */
+ 8 => 'color: #06c; font-weight: bold;' /* nice blue */
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'color: #5d478b; font-style: italic;', /* light purple */
+ 1 => 'color: #5d478b; font-style: italic;',
+ 2 => 'color: #5d478b; font-style: italic;', /* light purple */
+ 3 => 'color: #5d478b; font-style: italic;' /* light purple */
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #6c6;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #3cb371;' /* nice green */
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #c6c;' /* pink */
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #060;' /* dark green */
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #a52a2a;' /* maroon */
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ /* some of keywords are Pervasives functions (land, lxor, asr, ...) */
+ 1 => '',
+ 2 => 'http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/namespaces.html',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#>|^])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_<\|%\\-])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gambas.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gambas.php
new file mode 100644
index 00000000..352830eb
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gambas.php
@@ -0,0 +1,214 @@
+<?php
+/*************************************************************************************
+ * gambas.php
+ * ---------
+ * Author: Jesus Guardon (jguardon@telefonica.net)
+ * Copyright: (c) 2009 Jesus Guardon (http://gambas-es.org),
+ * Benny Baumann (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/08/20
+ *
+ * GAMBAS language file for GeSHi.
+ * GAMBAS Official Site: http://gambas.sourceforge.net
+ *
+ * CHANGES
+ * -------
+ * 2009/09/26 (1.0.1)
+ * - Splitted dollar-ended keywords in another group to match with or without '$'
+ * - Modified URL for object/components keywords search through Google "I'm feeling lucky"
+ * 2009/09/23 (1.0.0)
+ * - Initial release
+ *
+ * TODO (updated 2009/09/26)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'GAMBAS',
+ 'COMMENT_SINGLE' => array(1 => "'"),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ //keywords
+ 1 => array(
+ 'APPEND', 'AS', 'BREAK', 'BYREF', 'CASE', 'CATCH', 'CLASS', 'CLOSE', 'CONST', 'CONTINUE', 'COPY',
+ 'CREATE', 'DEBUG', 'DEC', 'DEFAULT', 'DIM', 'DO', 'EACH', 'ELSE', 'END', 'ENDIF', 'ERROR', 'EVENT', 'EXEC',
+ 'EXPORT', 'EXTERN', 'FALSE', 'FINALLY', 'FLUSH', 'FOR', 'FUNCTION', 'GOTO', 'IF', 'IN', 'INC', 'INHERITS',
+ 'INPUT', 'FROM', 'IS', 'KILL', 'LAST', 'LIBRARY', 'LIKE', 'LINE INPUT', 'LINK', 'LOCK', 'LOOP', 'ME',
+ 'MKDIR', 'MOVE', 'NEW', 'NEXT', 'NULL', 'OPEN', 'OPTIONAL', 'OUTPUT', 'PIPE', 'PRINT', 'PRIVATE',
+ 'PROCEDURE', 'PROPERTY', 'PUBLIC', 'QUIT', 'RAISE', 'RANDOMIZE', 'READ', 'REPEAT', 'RETURN', 'RMDIR',
+ 'SEEK', 'SELECT', 'SHELL', 'SLEEP', 'STATIC', 'STEP', 'STOP', 'SUB', 'SUPER', 'SWAP', 'THEN', 'TO',
+ 'TRUE', 'TRY', 'UNLOCK', 'UNTIL', 'WAIT', 'WATCH', 'WEND', 'WHILE', 'WITH', 'WRITE'
+ ),
+ //functions
+ 2 => array(
+ 'Abs', 'Access', 'Acos', 'Acosh', 'Alloc', 'Ang', 'Asc', 'ASin', 'ASinh', 'Asl', 'Asr', 'Assign', 'Atan',
+ 'ATan2', 'ATanh',
+ 'BChg', 'BClr', 'Bin', 'BSet', 'BTst',
+ 'CBool', 'Cbr', 'CByte', 'CDate', 'CFloat', 'Choose', 'Chr', 'CInt', 'CLong', 'Comp', 'Conv', 'Cos',
+ 'Cosh', 'CShort', 'CSng', 'CStr',
+ 'DateAdd', 'DateDiff', 'Day', 'DConv', 'Deg', 'DFree', 'Dir',
+ 'Eof', 'Eval', 'Exist', 'Exp', 'Exp10', 'Exp2', 'Expm',
+ 'Fix', 'Format', 'Frac', 'Free',
+ 'Hex', 'Hour', 'Hyp',
+ 'Iif', 'InStr', 'Int', 'IsAscii', 'IsBlank', 'IsBoolean', 'IsByte', 'IsDate', 'IsDigit', 'IsDir',
+ 'IsFloat', 'IsHexa', 'IsInteger', 'IsLCase', 'IsLetter', 'IsLong', 'IsNull', 'IsNumber', 'IsObject',
+ 'IsPunct', 'IsShort', 'IsSingle', 'IsSpace', 'IsString', 'IsUCase', 'IsVariant',
+ 'LCase', 'Left', 'Len', 'Lof', 'Log', 'Log10', 'Log2', 'Logp', 'Lsl', 'Lsr', 'LTrim',
+ 'Mag', 'Max', 'Mid', 'Min', 'Minute', 'Month', 'Now', 'Quote',
+ 'Rad', 'RDir', 'Realloc', 'Replace', 'Right', 'RInStr', 'Rnd', 'Rol', 'Ror', 'Round', 'RTrim',
+ 'Scan', 'SConv', 'Second', 'Seek', 'Sgn', 'Shl', 'Shr', 'Sin', 'Sinh', 'Space', 'Split', 'Sqr',
+ 'Stat', 'Str', 'StrPtr', 'Subst',
+ 'Tan', 'Tanh', 'Temp$', 'Time', 'Timer', 'Tr', 'Trim', 'TypeOf',
+ 'UCase', 'Unquote', 'Val', 'VarPtr', 'Week', 'WeekDay', 'Year'
+ ),
+ //string functions
+ 3 => array(
+ 'Bin$', 'Chr$', 'Conv$', 'DConv$', 'Format$', 'Hex$', 'LCase$', 'Left$', 'LTrim$', 'Mid$', 'Quote$',
+ 'Replace$', 'Right$', 'SConv$', 'Space$', 'Str$', 'String$', 'Subst$', 'Tr$', 'Trim$', 'UCase$',
+ 'Unquote$'
+ ),
+ //datatypes
+ 4 => array(
+ 'Boolean', 'Byte', 'Short', 'Integer', 'Long', 'Single', 'Float', 'Date', 'String', 'Variant', 'Object',
+ 'Pointer', 'File'
+ ),
+ //operators
+ 5 => array(
+ 'AND', 'DIV', 'MOD', 'NOT', 'OR', 'XOR'
+ ),
+ //objects/classes
+ 6 => array(
+ 'Application', 'Array', 'Byte[]', 'Collection', 'Component', 'Enum', 'Observer', 'Param', 'Process',
+ 'Stream', 'System', 'User', 'Chart', 'Compress', 'Crypt', 'Blob', 'Connection', 'DB', 'Database',
+ 'DatabaseUser', 'Field', 'Index', 'Result', 'ResultField', 'Table', 'DataBrowser', 'DataCombo',
+ 'DataControl', 'DataSource', 'DataView', 'Desktop', 'DesktopFile', 'Balloon', 'ColorButton',
+ 'ColorChooser', 'DateChooser', 'DirChooser', 'DirView', 'Expander', 'FileChooser', 'FileView',
+ 'FontChooser', 'InputBox', 'ListContainer', 'SidePanel', 'Stock', 'TableView', 'ToolPanel', 'ValueBox',
+ 'Wizard', 'Dialog', 'ToolBar', 'WorkSpace', 'DnsClient', 'SerialPort', 'ServerSocket', 'Socket',
+ 'UdpSocket', 'FtpClient', 'HttpClient', 'SmtpClient', 'Regexp', 'Action', 'Button', 'CheckBox',
+ 'ColumnView', 'ComboBox', 'Draw', 'Container', 'Control', 'Cursor', 'DrawingArea', 'Embedder',
+ 'Font', 'Form', 'Frame', 'GridView', 'HBox', 'HPanel', 'HSplit', 'IconView', 'Image', 'Key', 'Label',
+ 'Line', 'ListBox', 'ListView', 'Menu', 'Message', 'Mouse', 'MovieBox', 'Panel', 'Picture', 'PictureBox',
+ 'ProgressBar', 'RadioButton', 'ScrollBar', 'ScrollView', 'Separator', 'Slider', 'SpinBox', 'TabStrip',
+ 'TextArea', 'TextBox', 'TextLabel', 'ToggleButton', 'TrayIcon', 'TreeView', 'VBox', 'VPanel', 'VSplit',
+ 'Watcher', 'Window', 'Dial', 'Editor', 'LCDNumber', 'Printer', 'TextEdit', 'WebBrowser', 'GLarea',
+ 'Report', 'ReportCloner', 'ReportContainer', 'ReportControl', 'ReportDrawing', 'ReportField', 'ReportHBox',
+ 'ReportImage', 'ReportLabel', 'ReportSection', 'ReportSpecialField', 'ReportTextLabel', 'ReportVBox',
+ 'CDRom', 'Channel', 'Music', 'Sound', 'Settings', 'VideoDevice', 'Vb', 'CGI', 'HTML', 'Request', 'Response',
+ 'Session', 'XmlDocument', 'XmlNode', 'XmlReader', 'XmlReaderNodeType', 'XmlWriter', 'RpcArray', 'RpcClient',
+ 'RpcFunction', 'RpcServer', 'RpcStruct', 'RpcType', 'XmlRpc', 'Xslt'
+ ),
+ //constants
+ 7 => array(
+ 'Pi'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '&', '&=', '&/', '*', '*=', '+', '+=', '-', '-=', '//', '/', '/=', '=', '==', '\\', '\\=',
+ '^', '^=', '[', ']', '{', '}', '<', '>', '<>', '<=', '>='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0600FF; font-weight: bold;', // Keywords
+ 2 => 'color: #8B1433;', // Functions
+ 3 => 'color: #8B1433;', // String Functions
+ 4 => 'color: #0600FF;', // Data Types
+ 5 => 'color: #1E90FF;', // Operators
+ 6 => 'color: #0600FF;', // Objects/Components
+ 7 => 'color: #0600FF;' // Constants
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #1A5B1A; font-style: italic;',
+ 'MULTI' => 'color: #1A5B1A; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #008080;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #612188;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7E4B05;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF0000;',
+ GESHI_NUMBER_INT_BASIC => 'color: #FF0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0000FF;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #6132B2;'
+ ),
+ 'REGEXPS' => array(
+ //3 => 'color: #8B1433;' //fakes '$' colour matched by REGEXP
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://gambasdoc.org/help/lang/{FNAMEL}',
+ 2 => 'http://gambasdoc.org/help/lang/{FNAMEL}',
+ 3 => 'http://www.google.com/search?hl=en&amp;q={FNAMEL}+site:http://gambasdoc.org/help/lang/&amp;btnI=I%27m%20Feeling%20Lucky',
+ 4 => 'http://gambasdoc.org/help/lang/type/{FNAMEL}',
+ 5 => 'http://gambasdoc.org/help/lang/{FNAMEL}',
+ 6 => 'http://www.google.com/search?hl=en&amp;q={FNAMEL}+site:http://gambasdoc.org/&amp;btnI=I%27m%20Feeling%20Lucky',
+ 7 => 'http://gambasdoc.org/help/lang/{FNAMEL}'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 =>'.'
+ ),
+ 'REGEXPS' => array(
+ //3 => "\\$(?!\\w)" //matches '$' at the end of Keyword
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 2 => array(
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_\|%\\-&;\$])"
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gdb.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gdb.php
new file mode 100644
index 00000000..0a5e32c3
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gdb.php
@@ -0,0 +1,198 @@
+<?php
+/*************************************************************************************
+ * gdb.php
+ * --------
+ * Author: Milian Wolff (mail@milianw.de)
+ * Copyright: (c) 2009 Milian Wolff
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/06/24
+ *
+ * GDB language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/06/24 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2009/06/24)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'GDB',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 0 => array(
+ 'Application',
+ 'signal',
+ ),
+ 1 => array(
+ 'Segmentation fault',
+ '[KCrash Handler]',
+ ),
+ ),
+ 'NUMBERS' => false,
+ 'SYMBOLS' => array(
+ ),
+ 'CASE_SENSITIVE' => array(
+ 0 => true,
+ 1 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 0 => 'font-weight:bold;',
+ 1 => 'font-weight:bold; color: #ff0000;'
+ ),
+ 'COMMENTS' => array(
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => 'font-weight:bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #933;'
+ ),
+ 'NUMBERS' => array(
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #000066; font-weight:bold;',
+ 1 => 'color: #006600;',
+ 2 => 'color: #B07E00;',
+ 3 => 'color: #0057AE; text-style:italic;',
+ 4 => 'color: #0057AE; text-style:italic;',
+ 5 => 'color: #442886;',
+ 6 => 'color: #442886; font-weight:bold;',
+ 7 => 'color: #FF0000; font-weight:bold;',
+ 8 => 'color: #006E26;',
+ 9 => 'color: #555;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 0 => '',
+ 1 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //[Current Thread...], [KCrash Handler] etc.
+ 0 => array(
+ GESHI_SEARCH => '^\[.+\]',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ //stack number
+ 1 => array(
+ GESHI_SEARCH => '^#\d+',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ //Thread X (Thread...)
+ 2 => array(
+ GESHI_SEARCH => '^Thread \d.+$',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ //Files with linenumbers
+ 3 => array(
+ GESHI_SEARCH => '(at\s+)(.+)(:\d+\s*)$',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+ //Libs without linenumbers
+ 4 => array(
+ GESHI_SEARCH => '(from\s+)(.+)(\s*)$',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+ //Line numbers
+ 5 => array(
+ GESHI_SEARCH => '(:)(\d+)(\s*)$',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+ //Location
+ 6 => array(
+ GESHI_SEARCH => '(\s+)(in\s+)?([^ 0-9][^ ]*)([ \n]+\()',
+ GESHI_REPLACE => '\\3',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1\\2',
+ GESHI_AFTER => '\\4'
+ ),
+ // interesting parts: abort, qFatal, assertions, null ptrs, ...
+ 7 => array(
+ GESHI_SEARCH => '\b((?:\*__GI_)?(?:__assert_fail|abort)|qFatal|0x0)\b([^\.]|$)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '\\2'
+ ),
+ // Namespace / Classes
+ 8 => array(
+ GESHI_SEARCH => '\b(\w+)(::)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'U',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '\\2'
+ ),
+ // make ptr adresses and <value optimized out> uninteresting
+ 9 => '\b(?:0x[a-f0-9]{2,}|value\s+optimized\s+out)\b'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'NUMBERS' => false
+ ),
+ )
+);
+
+// kate: replace-tabs on; indent-width 4;
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/genero.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/genero.php
new file mode 100644
index 00000000..e1b20b3e
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/genero.php
@@ -0,0 +1,463 @@
+<?php
+/*************************************************************************************
+ * genero.php
+ * ----------
+ * Author: Lars Gersmann (lars.gersmann@gmail.com)
+ * Copyright: (c) 2007 Lars Gersmann, Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/07/01
+ *
+ * Genero (FOURJ's Genero 4GL) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2007/07/01 (1.0.0)
+ * - Initial release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'genero',
+ 'COMMENT_SINGLE' => array(1 => '--', 2 => '#'),
+ 'COMMENT_MULTI' => array('{' => '}'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ "ABSOLUTE",
+ "ACCEPT",
+ "ACTION",
+ "ADD",
+ "AFTER",
+ "ALL",
+ "ALTER",
+ "AND",
+ "ANY",
+ "APPEND",
+ "APPLICATION",
+ "AS",
+ "AT",
+ "ATTRIBUTE",
+ "ATTRIBUTES",
+ "AUDIT",
+ "AVG",
+ "BEFORE",
+ "BEGIN",
+ "BETWEEN",
+ "BORDER",
+ "BOTTOM",
+ "BREAKPOINT",
+ "BUFFER",
+ "BUFFERED",
+ "BY",
+ "CALL",
+ "CANCEL",
+ "CASE",
+ "CENTURY",
+ "CHANGE",
+ "CHECK",
+ "CLEAR",
+ "CLIPPED",
+ "CLOSE",
+ "CLUSTER",
+ "COLUMN",
+ "COLUMNS",
+ "COMMAND",
+ "COMMENT",
+ "COMMIT",
+ "COMMITTED",
+ "CONCURRENT ",
+ "CONNECT",
+ "CONNECTION",
+ "CONSTANT",
+ "CONSTRAINED",
+ "CONSTRAINT",
+ "CONSTRUCT",
+ "CONTINUE",
+ "CONTROL",
+ "COUNT",
+ "CREATE",
+ "CROSS",
+ "CURRENT",
+ "DATABASE",
+ "DBA",
+ "DEC",
+ "DECLARE",
+ "DEFAULT",
+ "DEFAULTS",
+ "DEFER",
+ "DEFINE",
+ "DELETE",
+ "DELIMITER",
+ "DESCRIBE",
+ "DESTINATION",
+ "DIM",
+ "DIALOG",
+ "DIMENSION",
+ "DIRTY",
+ "DISCONNECT",
+ "DISPLAY",
+ "DISTINCT",
+ "DORMANT",
+ "DOWN",
+ "DROP",
+ "DYNAMIC",
+ "ELSE",
+ "END",
+ "ERROR",
+ "ESCAPE",
+ "EVERY",
+ "EXCLUSIVE",
+ "EXECUTE",
+ "EXISTS",
+ "EXIT",
+ "EXPLAIN",
+ "EXTEND",
+ "EXTENT",
+ "EXTERNAL",
+ "FETCH",
+ "FGL_DRAWBOX",
+ "FIELD",
+ "FIELD_TOUCHED",
+ "FILE",
+ "FILL",
+ "FINISH",
+ "FIRST",
+ "FLOAT",
+ "FLUSH",
+ "FOR",
+ "FOREACH",
+ "FORM",
+ "FORMAT",
+ "FOUND",
+ "FRACTION",
+ "FREE",
+ "FROM",
+ "FULL",
+ "FUNCTION",
+ "GET_FLDBUF",
+ "GLOBALS",
+ "GO",
+ "GOTO",
+ "GRANT",
+ "GROUP",
+ "HAVING",
+ "HEADER",
+ "HELP",
+ "HIDE",
+ "HOLD",
+ "HOUR",
+ "IDLE",
+ "IF",
+ "IMAGE",
+ "IMMEDIATE",
+ "IN",
+ "INDEX",
+ "INFIELD",
+ "INITIALIZE",
+ "INNER",
+ "INPUT",
+ "INSERT",
+ "INTERRUPT",
+ "INTERVAL",
+ "INTO",
+ "INVISIBLE",
+ "IS",
+ "ISOLATION",
+ "JOIN",
+ "KEEP",
+ "KEY",
+ "LABEL",
+ "LAST",
+ "LEFT",
+ "LENGTH",
+ "LET",
+ "LIKE",
+ "LINE",
+ "LINENO",
+ "LINES",
+ "LOAD",
+ "LOCATE",
+ "LOCK",
+ "LOG",
+ "LSTR",
+ "MAIN",
+ "MARGIN",
+ "MATCHES",
+ "MAX",
+ "MAXCOUNT",
+ "MDY",
+ "MEMORY",
+ "MENU",
+ "MESSAGE",
+ "MIN",
+ "MINUTE",
+ "MOD",
+ "MODE",
+ "MODIFY",
+ "MONEY",
+ "NAME",
+ "NEED",
+ "NEXT",
+ "NO",
+ "NORMAL",
+ "NOT",
+ "NOTFOUND",
+ "NULL",
+ "NUMERIC",
+ "OF",
+ "ON",
+ "OPEN",
+ "OPTION",
+ "OPTIONS",
+ "OR",
+ "ORDER",
+ "OTHERWISE",
+ "OUTER",
+ "OUTPUT",
+ "PAGE",
+ "PAGENO",
+ "PAUSE",
+ "PERCENT",
+ "PICTURE",
+ "PIPE",
+ "PRECISION",
+ "PREPARE",
+ "PREVIOUS",
+ "PRINT",
+ "PRINTER",
+ "PRINTX",
+ "PRIOR",
+ "PRIVILEGES",
+ "PROCEDURE",
+ "PROGRAM",
+ "PROMPT",
+ "PUBLIC",
+ "PUT",
+ "QUIT",
+ "READ",
+ "REAL",
+ "RECORD",
+ "RECOVER",
+ "RED ",
+ "RELATIVE",
+ "RENAME",
+ "REOPTIMIZATION",
+ "REPEATABLE",
+ "REPORT",
+ "RESOURCE",
+ "RETURN",
+ "RETURNING",
+ "REVERSE",
+ "REVOKE",
+ "RIGHT",
+ "ROLLBACK",
+ "ROLLFORWARD",
+ "ROW",
+ "ROWS",
+ "RUN",
+ "SCHEMA",
+ "SCREEN",
+ "SCROLL",
+ "SECOND",
+ "SELECT",
+ "SERIAL",
+ "SET",
+ "SFMT",
+ "SHARE",
+ "SHIFT",
+ "SHOW",
+ "SIGNAL ",
+ "SIZE",
+ "SKIP",
+ "SLEEP",
+ "SOME",
+ "SPACE",
+ "SPACES",
+ "SQL",
+ "SQLERRMESSAGE",
+ "SQLERROR",
+ "SQLSTATE",
+ "STABILITY",
+ "START",
+ "STATISTICS",
+ "STEP",
+ "STOP",
+ "STYLE",
+ "SUM",
+ "SYNONYM",
+ "TABLE",
+ "TEMP",
+ "TERMINATE",
+ "TEXT",
+ "THEN",
+ "THROUGH",
+ "THRU",
+ "TO",
+ "TODAY",
+ "TOP",
+ "TRAILER",
+ "TRANSACTION ",
+ "UNBUFFERED",
+ "UNCONSTRAINED",
+ "UNDERLINE",
+ "UNION",
+ "UNIQUE",
+ "UNITS",
+ "UNLOAD",
+ "UNLOCK",
+ "UP",
+ "UPDATE",
+ "USE",
+ "USER",
+ "USING",
+ "VALIDATE",
+ "VALUE",
+ "VALUES",
+ "VARCHAR",
+ "VIEW",
+ "WAIT",
+ "WAITING",
+ "WARNING",
+ "WHEN",
+ "WHENEVER",
+ "WHERE",
+ "WHILE",
+ "WINDOW",
+ "WITH",
+ "WITHOUT",
+ "WORDWRAP",
+ "WORK",
+ "WRAP"
+ ),
+ 2 => array(
+ '&amp;IFDEF', '&amp;ENDIF'
+ ),
+ 3 => array(
+ "ARRAY",
+ "BYTE",
+ "CHAR",
+ "CHARACTER",
+ "CURSOR",
+ "DATE",
+ "DATETIME",
+ "DECIMAL",
+ "DOUBLE",
+ "FALSE",
+ "INT",
+ "INTEGER",
+ "SMALLFLOAT",
+ "SMALLINT",
+ "STRING",
+ "TIME",
+ "TRUE"
+ ),
+ 4 => array(
+ "BLACK",
+ "BLINK",
+ "BLUE",
+ "BOLD",
+ "ANSI",
+ "ASC",
+ "ASCENDING",
+ "ASCII",
+ "CYAN",
+ "DESC",
+ "DESCENDING",
+ "GREEN",
+ "MAGENTA",
+ "OFF",
+ "WHITE",
+ "YELLOW",
+ "YEAR",
+ "DAY",
+ "MONTH",
+ "WEEKDAY"
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '+', '-', '*', '?', '=', '/', '%', '>', '<', '^', '!', '|', ':',
+ '(', ')', '[', ']'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0600FF;',
+ 2 => 'color: #0000FF; font-weight: bold;',
+ 3 => 'color: #008000;',
+ 4 => 'color: #FF0000;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008080; font-style: italic;',
+ 2 => 'color: #008080;',
+ 'MULTI' => 'color: #008080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #008080; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #808080;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0000FF;',
+ 2 => 'color: #0000FF;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/genie.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/genie.php
new file mode 100644
index 00000000..db05ec06
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/genie.php
@@ -0,0 +1,157 @@
+<?php
+/*************************************************************************************
+ * genie.php
+ * ----------
+ * Author: Nicolas Joseph (nicolas.joseph@valaide.org)
+ * Copyright: (c) 2009 Nicolas Joseph
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/04/29
+ *
+ * Genie language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Genie',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Using and Namespace directives (basic support)
+ //Please note that the alias syntax for using is not supported
+ 3 => '/(?:(?<=using[\\n\\s])|(?<=namespace[\\n\\s]))[\\n\\s]*([a-zA-Z0-9_]+\\.)*[a-zA-Z0-9_]+[\n\s]*(?=[;=])/i'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'HARDQUOTE' => array('@"', '"'),
+ 'HARDESCAPE' => array('""'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'and', 'as', 'abstract', 'break', 'case', 'cast', 'catch', 'const',
+ 'construct', 'continue', 'default', 'def', 'delete', 'div',
+ 'dynamic', 'do', 'downto', 'else', 'ensures', 'except', 'extern',
+ 'false', 'final', 'finally', 'for', 'foreach', 'get', 'if', 'in',
+ 'init', 'inline', 'internal', 'implements', 'lock', 'not', 'null',
+ 'of', 'or', 'otherwise', 'out', 'override', 'pass', 'raise',
+ 'raises', 'readonly', 'ref', 'requires', 'self', 'set', 'static',
+ 'super', 'switch', 'to', 'true', 'try', 'unless', 'uses', 'var', 'virtual',
+ 'volatile', 'void', 'when', 'while'
+ ),
+// 2 => array(
+// ),
+ 3 => array(
+ 'is', 'isa', 'new', 'owned', 'sizeof', 'typeof', 'unchecked',
+ 'unowned', 'weak'
+ ),
+ 4 => array(
+ 'bool', 'byte', 'class', 'char', 'date', 'datetime', 'decimal', 'delegate',
+ 'double', 'enum', 'event', 'exception', 'float', 'int', 'interface',
+ 'long', 'object', 'prop', 'sbyte', 'short', 'single', 'string',
+ 'struct', 'ulong', 'ushort'
+ ),
+// 5 => array(
+// ),
+ ),
+ 'SYMBOLS' => array(
+ '+', '-', '*', '?', '=', '/', '%', '&', '>', '<', '^', '!', ':', ';',
+ '(', ')', '{', '}', '[', ']', '|'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+// 2 => false,
+ 3 => false,
+ 4 => false,
+// 5 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0600FF;',
+// 2 => 'color: #FF8000; font-weight: bold;',
+ 3 => 'color: #008000;',
+ 4 => 'color: #FF0000;',
+// 5 => 'color: #000000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008080; font-style: italic;',
+// 2 => 'color: #008080;',
+ 3 => 'color: #008080;',
+ 'MULTI' => 'color: #008080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #008080; font-weight: bold;',
+ 'HARD' => 'color: #008080; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #666666;',
+ 'HARD' => 'color: #666666;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0000FF;',
+ 2 => 'color: #0000FF;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+// 2 => '',
+ 3 => '',
+ 4 => '',
+// 5 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#>|^])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_<\|%\\-])"
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gettext.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gettext.php
new file mode 100644
index 00000000..80b531c1
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gettext.php
@@ -0,0 +1,97 @@
+<?php
+/*************************************************************************************
+ * gettext.php
+ * --------
+ * Author: Milian Wolff (mail@milianw.de)
+ * Copyright: (c) 2008 Milian Wolff
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/05/25
+ *
+ * GNU Gettext .po/.pot language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/08/02 (1.0.8)
+ * - New comments: flags and previous-fields
+ * - New keywords: msgctxt, msgid_plural
+ * - Msgstr array indices
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'GNU Gettext',
+ 'COMMENT_SINGLE' => array('#:', '#.', '#,', '#|', '#'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array('msgctxt', 'msgid_plural', 'msgid', 'msgstr'),
+ ),
+ 'SYMBOLS' => array(),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #000099;',
+ 1 => 'color: #000099;',
+ 2 => 'color: #000099;',
+ 3 => 'color: #006666;',
+ 4 => 'color: #666666; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'REGEXPS' => array(),
+ 'SYMBOLS' => array(),
+ 'NUMBERS' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'METHODS' => array(),
+ 'SCRIPT' => array(),
+ 'BRACKETS' => array(
+ 0 => 'color: #000099;'
+ ),
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/glsl.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/glsl.php
new file mode 100644
index 00000000..3615cfe7
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/glsl.php
@@ -0,0 +1,205 @@
+<?php
+/*************************************************************************************
+ * glsl.php
+ * -----
+ * Author: Benny Baumann (BenBE@omorphia.de)
+ * Copyright: (c) 2008 Benny Baumann (BenBE@omorphia.de)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/03/20
+ *
+ * glSlang language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/03/20 (1.0.7.21)
+ * - First Release
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'glSlang',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Multiline-continued single-line comments
+ 1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Multiline-continued preprocessor define
+ 2 => '/#(?:\\\\\\\\|\\\\\\n|.)*$/m'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'if', 'else', 'for', 'while', 'do', 'break', 'continue', 'asm',
+ 'switch', 'case', 'default', 'return', 'discard',
+ 'namespace', 'using', 'sizeof', 'cast'
+ ),
+ 2 => array(
+ 'const', 'uniform', 'attribute', 'centroid', 'varying', 'invariant',
+ 'in', 'out', 'inout', 'input', 'output', 'typedef', 'volatile',
+ 'public', 'static', 'extern', 'external', 'packed',
+ 'inline', 'noinline', 'noperspective', 'flat'
+ ),
+ 3 => array(
+ 'void', 'bool', 'int', 'long', 'short', 'float', 'half', 'fixed',
+ 'unsigned', 'lowp', 'mediump', 'highp', 'precision',
+ 'vec2', 'vec3', 'vec4', 'bvec2', 'bvec3', 'bvec4',
+ 'dvec2', 'dvec3', 'dvec4', 'fvec2', 'fvec3', 'fvec4',
+ 'hvec2', 'hvec3', 'hvec4', 'ivec2', 'ivec3', 'ivec4',
+ 'mat2', 'mat3', 'mat4', 'mat2x2', 'mat3x2', 'mat4x2',
+ 'mat2x3', 'mat3x3', 'mat4x3', 'mat2x4', 'mat3x4', 'mat4x4',
+ 'sampler1D', 'sampler2D', 'sampler3D', 'samplerCube',
+ 'sampler1DShadow', 'sampler2DShadow',
+ 'struct', 'class', 'union', 'enum', 'interface', 'template'
+ ),
+ 4 => array(
+ 'this', 'false', 'true'
+ ),
+ 5 => array(
+ 'radians', 'degrees', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan',
+ 'pow', 'exp2', 'log2', 'sqrt', 'inversesqrt', 'abs', 'sign', 'ceil',
+ 'floor', 'fract', 'mod', 'min', 'max', 'clamp', 'mix', 'step',
+ 'smoothstep', 'length', 'distance', 'dot', 'cross', 'normalize',
+ 'ftransform', 'faceforward', 'reflect', 'matrixCompMult', 'equal',
+ 'lessThan', 'lessThanEqual', 'greaterThan', 'greaterThanEqual',
+ 'notEqual', 'any', 'all', 'not', 'texture1D', 'texture1DProj',
+ 'texture1DLod', 'texture1DProjLod', 'texture2D', 'texture2DProj',
+ 'texture2DLod', 'texture2DProjLod', 'texture3D', 'texture3DProj',
+ 'texture3DLod', 'texture3DProjLod', 'textureCube', 'textureCubeLod',
+ 'shadow1D', 'shadow1DProj', 'shadow1DLod', 'shadow1DProjLod',
+ 'shadow2D', 'shadow2DProj', 'shadow2DLod', 'shadow2DProjLod',
+ 'noise1', 'noise2', 'noise3', 'noise4'
+ ),
+ 6 => array(
+ 'gl_Position', 'gl_PointSize', 'gl_ClipVertex', 'gl_FragColor',
+ 'gl_FragData', 'gl_FragDepth', 'gl_FragCoord', 'gl_FrontFacing',
+ 'gl_Color', 'gl_SecondaryColor', 'gl_Normal', 'gl_Vertex',
+ 'gl_MultiTexCoord0', 'gl_MultiTexCoord1', 'gl_MultiTexCoord2',
+ 'gl_MultiTexCoord3', 'gl_MultiTexCoord4', 'gl_MultiTexCoord5',
+ 'gl_MultiTexCoord6', 'gl_MultiTexCoord7', 'gl_FogCoord',
+ 'gl_MaxLights', 'gl_MaxClipPlanes', 'gl_MaxTextureUnits',
+ 'gl_MaxTextureCoords', 'gl_MaxVertexAttribs', 'gl_MaxVaryingFloats',
+ 'gl_MaxVertexUniformComponents', 'gl_MaxVertexTextureImageUnits',
+ 'gl_MaxCombinedTextureImageUnits', 'gl_MaxTextureImageUnits',
+ 'gl_MaxFragmentUniformComponents', 'gl_MaxDrawBuffers', 'gl_Point',
+ 'gl_ModelViewMatrix', 'gl_ProjectionMatrix', 'gl_FrontMaterial',
+ 'gl_ModelViewProjectionMatrix', 'gl_TextureMatrix', 'gl_ClipPlane',
+ 'gl_NormalMatrix', 'gl_ModelViewMatrixInverse', 'gl_BackMaterial',
+ 'gl_ProjectionMatrixInverse', 'gl_ModelViewProjectionMatrixInverse',
+ 'gl_TextureMatrixInverse', 'gl_ModelViewMatrixTranspose', 'gl_Fog',
+ 'gl_ProjectionMatrixTranspose', 'gl_NormalScale', 'gl_DepthRange',
+ 'gl_odelViewProjectionMatrixTranspose', 'gl_TextureMatrixTranspose',
+ 'gl_ModelViewMatrixInverseTranspose', 'gl_LightSource',
+ 'gl_ProjectionMatrixInverseTranspose', 'gl_LightModel',
+ 'gl_ModelViewProjectionMatrixInverseTranspose', 'gl_TexCoord',
+ 'gl_TextureMatrixInverseTranspose', 'gl_TextureEnvColor',
+ 'gl_FrontLightModelProduct', 'gl_BackLightModelProduct',
+ 'gl_FrontLightProduct', 'gl_BackLightProduct', 'gl_ObjectPlaneS',
+ 'gl_ObjectPlaneT', 'gl_ObjectPlaneR', 'gl_ObjectPlaneQ',
+ 'gl_EyePlaneS', 'gl_EyePlaneT', 'gl_EyePlaneR', 'gl_EyePlaneQ',
+ 'gl_FrontColor', 'gl_BackColor', 'gl_FrontSecondaryColor',
+ 'gl_BackSecondaryColor', 'gl_FogFragCoord', 'gl_PointCoord'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '=', '+', '-', '*', '/', '!', '%', '^',
+ '&', '?', ':', '.', '|', ';', ',', '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #333399; font-weight: bold;',
+ 3 => 'color: #000066; font-weight: bold;',
+ 4 => 'color: #333399; font-weight: bold;',
+ 5 => 'color: #993333; font-weight: bold;',
+ 6 => 'color: #551111;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #009900;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000066;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'OOLANG' => array(
+ 'MATCH_BEFORE' => '',
+ 'MATCH_AFTER' => '[a-zA-Z_][a-zA-Z0-9_]*',
+ 'MATCH_SPACES' => '[\s]*'
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gml.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gml.php
new file mode 100644
index 00000000..999251b2
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gml.php
@@ -0,0 +1,506 @@
+<?php
+/*************************************************************************************
+ * gml.php
+ * --------
+ * Author: Jos� Jorge Enr�quez (jenriquez@users.sourceforge.net)
+ * Copyright: (c) 2005 Jos� Jorge Enr�quez Rodr�guez (http://www.zonamakers.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/06/21
+ *
+ * GML language file for GeSHi.
+ *
+ * GML (Game Maker Language) is a script language that is built-in into Game Maker,
+ * a game creation program, more info about Game Maker can be found at
+ * http://www.gamemaker.nl/
+ * All GML keywords were extracted from the Game Maker HTML Help file using a PHP
+ * script (one section at a time). I love PHP for saving me that bunch of work :P!.
+ * I think all GML functions have been indexed here, but I'm not sure about it, so
+ * please let me know of any issue you may find.
+ *
+ * CHANGES
+ * -------
+ * 2005/11/11
+ * - Changed 'CASE_KEYWORDS' fom 'GESHI_CAPS_LOWER' to 'GESHI_CAPS_NO_CHANGE',
+ * so that MCI_command appears correctly (the only GML function using capitals).
+ * - Changed 'CASE_SENSITIVE' options, 'GESHI_COMMENTS' from true to false and all
+ * of the others from false to true.
+ * - Deleted repeated entries.
+ * - div and mod are language keywords, moved (from symbols) to the appropiate section (1).
+ * - Moved self, other, all, noone and global identifiers to language keywords section 1.
+ * - Edited this file lines to a maximum width of 100 characters (as stated in
+ * the GeSHi docs). Well, not strictly to 100 but around it.
+ * - Corrected some minor issues (the vk_f1...vk_f12 keys and similar).
+ * - Deleted the KEYWORDS=>5 and KEYWORDS=>6 sections (actually, they were empty).
+ * I was planning of using those for the GML functions available only in the
+ * registered version of the program, but not anymore.
+ *
+ * 2005/06/26 (1.0.3)
+ * - First Release.
+ *
+ * TODO (updated 2005/11/11)
+ * -------------------------
+ * - Test it for a while and make the appropiate corrections.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'GML',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'"),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ // language keywords
+ 1 => array(
+ 'break', 'continue', 'do', 'until', 'if', 'else',
+ 'exit', 'for', 'repeat', 'return', 'switch',
+ 'case', 'default', 'var', 'while', 'with', 'div', 'mod',
+ // GML Language overview
+ 'self', 'other', 'all', 'noone', 'global',
+ ),
+ // modifiers and built-in variables
+ 2 => array(
+ // Game play
+ 'x','y','xprevious','yprevious','xstart','ystart','hspeed','vspeed','direction','speed',
+ 'friction','gravity','gravity_direction',
+ 'path_index','path_position','path_positionprevious','path_speed','path_orientation',
+ 'path_endaction',
+ 'object_index','id','mask_index','solid','persistent','instance_count','instance_id',
+ 'room_speed','fps','current_time','current_year','current_month','current_day','current_weekday',
+ 'current_hour','current_minute','current_second','alarm','timeline_index','timeline_position',
+ 'timeline_speed',
+ 'room','room_first','room_last','room_width','room_height','room_caption','room_persistent',
+ 'score','lives','health','show_score','show_lives','show_health','caption_score','caption_lives',
+ 'caption_health',
+ 'event_type','event_number','event_object','event_action',
+ 'error_occurred','error_last',
+ // User interaction
+ 'keyboard_lastkey','keyboard_key','keyboard_lastchar','keyboard_string',
+ 'mouse_x','mouse_y','mouse_button','mouse_lastbutton',
+ // Game Graphics
+ 'sprite_index','sprite_width','sprite_height','sprite_xoffset','sprite_yoffset',
+ 'image_number','image_index','image_speed','image_xscale','image_yscale','image_angle',
+ 'image_alpha','image_blend','bbox_left','bbox_right','bbox_top','bbox_bottom',
+ 'background_color','background_showcolor','background_visible','background_foreground',
+ 'background_index','background_x','background_y','background_width','background_height',
+ 'background_htiled','background_vtiled','background_xscale','background_yscale',
+ 'background_hspeed','background_vspeed','background_blend','background_alpha',
+ 'background','left, top, width, height','depth','visible','xscale','yscale','blend','alpha',
+ 'view_enabled','view_current','view_visible','view_yview','view_wview','view_hview','view_xport',
+ 'view_yport','view_wport','view_hport','view_angle','view_hborder','view_vborder','view_hspeed',
+ 'view_vspeed','view_object',
+ 'transition_kind',
+ // Files, registry and executing programs
+ 'game_id','working_directory','temp_directory',
+ 'secure_mode',
+ // Creating particles
+ 'xmin', 'xmax', 'ymin', 'ymax','shape','distribution','particle type','number',
+ 'force','dist','kind','additive', 'parttype1', 'parttype2'
+ ),
+ // functions
+ 3 => array(
+ // Computing things
+ 'random','choose','abs','sign','round','floor','ceil','frac','sqrt','sqr','power','exp','ln',
+ 'log2','log10','logn','sin','cos','tan','arcsin','arccos','arctan','arctan2','degtorad',
+ 'radtodeg','min','max','mean','median','point_distance','point_direction','lengthdir_x',
+ 'lengthdir_y','is_real','is_string',
+ 'chr','ord','real','string','string_format','string_length','string_pos','string_copy',
+ 'string_char_at','string_delete','string_insert','string_replace','string_replace_all',
+ 'string_count','string_lower','string_upper','string_repeat','string_letters','string_digits',
+ 'string_lettersdigits','clipboard_has_text','clipboard_get_text','clipboard_set_text',
+ 'date_current_datetime','date_current_date','date_current_time','date_create_datetime',
+ 'date_create_date','date_create_time','date_valid_datetime','date_valid_date','date_valid_time',
+ 'date_inc_year','date_inc_month','date_inc_week','date_inc_day','date_inc_hour',
+ 'date_inc_minute','date_inc_second','date_get_year','date_get_month','date_get_week',
+ 'date_get_day','date_get_hour', 'date_get_minute','date_get_second','date_get_weekday',
+ 'date_get_day_of_year','date_get_hour_of_year','date_get_minute_of_year',
+ 'date_get_second_of_year','date_year_span','date_month_span','date_week_span','date_day_span',
+ 'date_hour_span','date_minute_span','date_second_span','date_compare_datetime',
+ 'date_compare_date','date_compare_time','date_date_of','date_time_of','date_datetime_string',
+ 'date_date_string','date_time_string','date_days_in_month','date_days_in_year','date_leap_year',
+ 'date_is_today',
+ // Game play
+ 'motion_set','motion_add','place_free','place_empty','place_meeting','place_snapped',
+ 'move_random','move_snap','move_wrap','move_towards_point','move_bounce_solid','move_bounce_all',
+ 'move_contact_solid','move_contact_all','move_outside_solid','move_outside_all',
+ 'distance_to_point','distance_to_object','position_empty','position_meeting',
+ 'path_start','path_end',
+ 'mp_linear_step','mp_linear_step_object','mp_potential_step','mp_potential_step_object',
+ 'mp_potential_settings','mp_linear_path','mp_linear_path_object', 'mp_potential_path',
+ 'mp_potential_path_object','mp_grid_create','mp_grid_destroy','mp_grid_clear_all',
+ 'mp_grid_clear_cell','mp_grid_clear_rectangle','mp_grid_add_cell','mp_grid_add_rectangle',
+ 'mp_grid_add_instances','mp_grid_path','mp_grid_draw',
+ 'collision_point','collision_rectangle','collision_circle','collision_ellipse','collision_line',
+ 'instance_find','instance_exists','instance_number','instance_position','instance_nearest',
+ 'instance_furthest','instance_place','instance_create','instance_copy','instance_destroy',
+ 'instance_change','position_destroy','position_change',
+ 'instance_deactivate_all','instance_deactivate_object','instance_deactivate_region',
+ 'instance_activate_all','instance_activate_object','instance_activate_region',
+ 'sleep',
+ 'room_goto','room_goto_previous','room_goto_next','room_restart','room_previous','room_next',
+ 'game_end','game_restart','game_save','game_load',
+ 'event_perform', 'event_perform_object','event_user','event_inherited',
+ 'show_debug_message','variable_global_exists','variable_local_exists','variable_global_get',
+ 'variable_global_array_get','variable_global_array2_get','variable_local_get',
+ 'variable_local_array_get','variable_local_array2_get','variable_global_set',
+ 'variable_global_array_set','variable_global_array2_set','variable_local_set',
+ 'variable_local_array_set','variable_local_array2_set','set_program_priority',
+ // User interaction
+ 'keyboard_set_map','keyboard_get_map','keyboard_unset_map','keyboard_check',
+ 'keyboard_check_pressed','keyboard_check_released','keyboard_check_direct',
+ 'keyboard_get_numlock','keyboard_set_numlock','keyboard_key_press','keyboard_key_release',
+ 'keyboard_clear','io_clear','io_handle','keyboard_wait',
+ 'mouse_check_button','mouse_check_button_pressed','mouse_check_button_released','mouse_clear',
+ 'mouse_wait',
+ 'joystick_exists','joystick_name','joystick_axes','joystick_buttons','joystick_has_pov',
+ 'joystick_direction','joystick_check_button','joystick_xpos','joystick_ypos','joystick_zpos',
+ 'joystick_rpos','joystick_upos','joystick_vpos','joystick_pov',
+ // Game Graphics
+ 'draw_sprite','draw_sprite_stretched','draw_sprite_tiled','draw_sprite_part','draw_background',
+ 'draw_background_stretched','draw_background_tiled','draw_background_part','draw_sprite_ext',
+ 'draw_sprite_stretched_ext','draw_sprite_tiled_ext','draw_sprite_part_ext','draw_sprite_general',
+ 'draw_background_ext','draw_background_stretched_ext','draw_background_tiled_ext',
+ 'draw_background_part_ext','draw_background_general',
+ 'draw_clear','draw_clear_alpha','draw_point','draw_line','draw_rectangle','draw_roundrect',
+ 'draw_triangle','draw_circle','draw_ellipse','draw_arrow','draw_button','draw_path',
+ 'draw_healthbar','draw_set_color','draw_set_alpha','draw_get_color','draw_get_alpha',
+ 'make_color_rgb','make_color_hsv','color_get_red','color_get_green','color_get_blue',
+ 'color_get_hue','color_get_saturation','color_get_value','merge_color','draw_getpixel',
+ 'screen_save','screen_save_part',
+ 'draw_set_font','draw_set_halign','draw_set_valign','draw_text','draw_text_ext','string_width',
+ 'string_height','string_width_ext','string_height_ext','draw_text_transformed',
+ 'draw_text_ext_transformed','draw_text_color','draw_text_ext_color',
+ 'draw_text_transformed_color','draw_text_ext_transformed_color',
+ 'draw_point_color','draw_line_color','draw_rectangle_color','draw_roundrect_color',
+ 'draw_triangle_color','draw_circle_color','draw_ellipse_color','draw_primitive_begin',
+ 'draw_vertex','draw_vertex_color','draw_primitive_end','sprite_get_texture',
+ 'background_get_texture','texture_preload','texture_set_priority',
+ 'texture_get_width','texture_get_height','draw_primitive_begin_texture','draw_vertex_texture',
+ 'draw_vertex_texture_color','texture_set_interpolation',
+ 'texture_set_blending','texture_set_repeat','draw_set_blend_mode','draw_set_blend_mode_ext',
+ 'surface_create','surface_free','surface_exists','surface_get_width','surface_get_height',
+ 'surface_get_texture','surface_set_target','surface_reset_target','surface_getpixel',
+ 'surface_save','surface_save_part','draw_surface','draw_surface_stretched','draw_surface_tiled',
+ 'draw_surface_part','draw_surface_ext','draw_surface_stretched_ext','draw_surface_tiled_ext',
+ 'draw_surface_part_ext','draw_surface_general','surface_copy','surface_copy_part',
+ 'tile_add','tile_delete','tile_exists','tile_get_x','tile_get_y','tile_get_left','tile_get_top',
+ 'tile_get_width','tile_get_height','tile_get_depth','tile_get_visible','tile_get_xscale',
+ 'tile_get_yscale','tile_get_background','tile_get_blend','tile_get_alpha','tile_set_position',
+ 'tile_set_region','tile_set_background','tile_set_visible','tile_set_depth','tile_set_scale',
+ 'tile_set_blend','tile_set_alpha','tile_layer_hide','tile_layer_show','tile_layer_delete',
+ 'tile_layer_shift','tile_layer_find','tile_layer_delete_at','tile_layer_depth',
+ 'display_get_width','display_get_height','display_get_colordepth','display_get_frequency',
+ 'display_set_size','display_set_colordepth','display_set_frequency','display_set_all',
+ 'display_test_all','display_reset','display_mouse_get_x','display_mouse_get_y','display_mouse_set',
+ 'window_set_visible','window_get_visible','window_set_fullscreen','window_get_fullscreen',
+ 'window_set_showborder','window_get_showborder','window_set_showicons','window_get_showicons',
+ 'window_set_stayontop','window_get_stayontop','window_set_sizeable','window_get_sizeable',
+ 'window_set_caption','window_get_caption','window_set_cursor', 'window_get_cursor',
+ 'window_set_color','window_get_color','window_set_region_scale','window_get_region_scale',
+ 'window_set_position','window_set_size','window_set_rectangle','window_center','window_default',
+ 'window_get_x','window_get_y','window_get_width','window_get_height','window_mouse_get_x',
+ 'window_mouse_get_y','window_mouse_set',
+ 'window_set_region_size','window_get_region_width','window_get_region_height',
+ 'window_view_mouse_get_x','window_view_mouse_get_y','window_view_mouse_set',
+ 'window_views_mouse_get_x','window_views_mouse_get_y','window_views_mouse_set',
+ 'screen_redraw','screen_refresh','set_automatic_draw','set_synchronization','screen_wait_vsync',
+ // Sound and music)
+ 'sound_play','sound_loop','sound_stop','sound_stop_all','sound_isplaying','sound_volume',
+ 'sound_global_volume','sound_fade','sound_pan','sound_background_tempo','sound_set_search_directory',
+ 'sound_effect_set','sound_effect_chorus','sound_effect_echo', 'sound_effect_flanger',
+ 'sound_effect_gargle','sound_effect_reverb','sound_effect_compressor','sound_effect_equalizer',
+ 'sound_3d_set_sound_position','sound_3d_set_sound_velocity','sound_3d_set_sound_distance',
+ 'sound_3d_set_sound_cone',
+ 'cd_init','cd_present','cd_number','cd_playing','cd_paused','cd_track','cd_length',
+ 'cd_track_length','cd_position','cd_track_position','cd_play','cd_stop','cd_pause','cd_resume',
+ 'cd_set_position','cd_set_track_position','cd_open_door','cd_close_door','MCI_command',
+ // Splash screens, highscores, and other pop-ups
+ 'show_text','show_image','show_video','show_info','load_info',
+ 'show_message','show_message_ext','show_question','get_integer','get_string',
+ 'message_background','message_alpha','message_button','message_text_font','message_button_font',
+ 'message_input_font','message_mouse_color','message_input_color','message_caption',
+ 'message_position','message_size','show_menu','show_menu_pos','get_color','get_open_filename',
+ 'get_save_filename','get_directory','get_directory_alt','show_error',
+ 'highscore_show','highscore_set_background','highscore_set_border','highscore_set_font',
+ 'highscore_set_colors','highscore_set_strings','highscore_show_ext','highscore_clear',
+ 'highscore_add','highscore_add_current','highscore_value','highscore_name','draw_highscore',
+ // Resources
+ 'sprite_exists','sprite_get_name','sprite_get_number','sprite_get_width','sprite_get_height',
+ 'sprite_get_transparent','sprite_get_smooth','sprite_get_preload','sprite_get_xoffset',
+ 'sprite_get_yoffset','sprite_get_bbox_left','sprite_get_bbox_right','sprite_get_bbox_top',
+ 'sprite_get_bbox_bottom','sprite_get_bbox_mode','sprite_get_precise',
+ 'sound_exists','sound_get_name','sound_get_kind','sound_get_preload','sound_discard',
+ 'sound_restore',
+ 'background_exists','background_get_name','background_get_width','background_get_height',
+ 'background_get_transparent','background_get_smooth','background_get_preload',
+ 'font_exists','font_get_name','font_get_fontname','font_get_bold','font_get_italic',
+ 'font_get_first','font_get_last',
+ 'path_exists','path_get_name','path_get_length','path_get_kind','path_get_closed',
+ 'path_get_precision','path_get_number','path_get_point_x','path_get_point_y',
+ 'path_get_point_speed','path_get_x','path_get_y','path_get_speed',
+ 'script_exists','script_get_name','script_get_text',
+ 'timeline_exists','timeline_get_name',
+ 'object_exists','object_get_name','object_get_sprite','object_get_solid','object_get_visible',
+ 'object_get_depth','object_get_persistent','object_get_mask','object_get_parent',
+ 'object_is_ancestor',
+ 'room_exists','room_get_name',
+ // Changing resources
+ 'sprite_set_offset','sprite_set_bbox_mode','sprite_set_bbox','sprite_set_precise',
+ 'sprite_duplicate','sprite_assign','sprite_merge','sprite_add','sprite_replace',
+ 'sprite_create_from_screen','sprite_add_from_screen','sprite_create_from_surface',
+ 'sprite_add_from_surface','sprite_delete','sprite_set_alpha_from_sprite',
+ 'sound_add','sound_replace','sound_delete',
+ 'background_duplicate','background_assign','background_add','background_replace',
+ 'background_create_color','background_create_gradient','background_create_from_screen',
+ 'background_create_from_surface','background_delete','background_set_alpha_from_background',
+ 'font_add','font_add_sprite','font_replace_sprite','font_delete',
+ 'path_set_kind','path_set_closed','path_set_precision','path_add','path_delete','path_duplicate',
+ 'path_assign','path_append','path_add_point','path_insert_point','path_change_point',
+ 'path_delete_point','path_clear_points','path_reverse','path_mirror','path_flip','path_rotate',
+ 'path_scale','path_shift',
+ 'execute_string','execute_file','script_execute',
+ 'timeline_add','timeline_delete','timeline_moment_add','timeline_moment_clear',
+ 'object_set_sprite','object_set_solid','object_set_visible','object_set_depth',
+ 'object_set_persistent','object_set_mask','object_set_parent','object_add','object_delete',
+ 'object_event_add','object_event_clear',
+ 'room_set_width','room_set_height','room_set_caption','room_set_persistent','room_set_code',
+ 'room_set_background_color','room_set_background','room_set_view','room_set_view_enabled',
+ 'room_add','room_duplicate','room_assign','room_instance_add','room_instance_clear',
+ 'room_tile_add','room_tile_add_ext','room_tile_clear',
+ // Files, registry and executing programs
+ 'file_text_open_read','file_text_open_write','file_text_open_append','file_text_close',
+ 'file_text_write_string','file_text_write_real','file_text_writeln','file_text_read_string',
+ 'file_text_read_real','file_text_readln','file_text_eof','file_exists','file_delete',
+ 'file_rename','file_copy','directory_exists','directory_create','file_find_first',
+ 'file_find_next','file_find_close','file_attributes', 'filename_name','filename_path',
+ 'filename_dir','filename_drive','filename_ext','filename_change_ext','file_bin_open',
+ 'file_bin_rewrite','file_bin_close','file_bin_size','file_bin_position','file_bin_seek',
+ 'file_bin_write_byte','file_bin_read_byte','parameter_count','parameter_string',
+ 'environment_get_variable',
+ 'registry_write_string','registry_write_real','registry_read_string','registry_read_real',
+ 'registry_exists','registry_write_string_ext','registry_write_real_ext',
+ 'registry_read_string_ext','registry_read_real_ext','registry_exists_ext','registry_set_root',
+ 'ini_open','ini_close','ini_read_string','ini_read_real','ini_write_string','ini_write_real',
+ 'ini_key_exists','ini_section_exists','ini_key_delete','ini_section_delete',
+ 'execute_program','execute_shell',
+ // Data structures
+ 'ds_stack_create','ds_stack_destroy','ds_stack_clear','ds_stack_size','ds_stack_empty',
+ 'ds_stack_push','ds_stack_pop','ds_stack_top',
+ 'ds_queue_create','ds_queue_destroy','ds_queue_clear','ds_queue_size','ds_queue_empty',
+ 'ds_queue_enqueue','ds_queue_dequeue','ds_queue_head','ds_queue_tail',
+ 'ds_list_create','ds_list_destroy','ds_list_clear','ds_list_size','ds_list_empty','ds_list_add',
+ 'ds_list_insert','ds_list_replace','ds_list_delete','ds_list_find_index','ds_list_find_value',
+ 'ds_list_sort',
+ 'ds_map_create','ds_map_destroy','ds_map_clear','ds_map_size','ds_map_empty','ds_map_add',
+ 'ds_map_replace','ds_map_delete','ds_map_exists','ds_map_find_value','ds_map_find_previous',
+ 'ds_map_find_next','ds_map_find_first','ds_map_find_last',
+ 'ds_priority_create','ds_priority_destroy','ds_priority_clear','ds_priority_size',
+ 'ds_priority_empty','ds_priority_add','ds_priority_change_priority','ds_priority_find_priority',
+ 'ds_priority_delete_value','ds_priority_delete_min','ds_priority_find_min',
+ 'ds_priority_delete_max','ds_priority_find_max',
+ 'ds_grid_create','ds_grid_destroy','ds_grid_resize','ds_grid_width','ds_grid_height',
+ 'ds_grid_clear','ds_grid_set','ds_grid_add','ds_grid_multiply','ds_grid_set_region',
+ 'ds_grid_add_region','ds_grid_multiply_region','ds_grid_set_disk','ds_grid_add_disk',
+ 'ds_grid_multiply_disk','ds_grid_get','ds_grid_get_sum','ds_grid_get_max','ds_grid_get_min',
+ 'ds_grid_get_mean','ds_grid_get_disk_sum','ds_grid_get_disk_min','ds_grid_get_disk_max',
+ 'ds_grid_get_disk_mean','ds_grid_value_exists','ds_grid_value_x','ds_grid_value_y',
+ 'ds_grid_value_disk_exists','ds_grid_value_disk_x','ds_grid_value_disk_y',
+ // Creating particles
+ 'effect_create_below','effect_create_above','effect_clear',
+ 'part_type_create','part_type_destroy','part_type_exists','part_type_clear','part_type_shape',
+ 'part_type_sprite','part_type_size','part_type_scale',
+ 'part_type_orientation','part_type_color1','part_type_color2','part_type_color3',
+ 'part_type_color_mix','part_type_color_rgb','part_type_color_hsv',
+ 'part_type_alpha1','part_type_alpha2','part_type_alpha3','part_type_blend','part_type_life',
+ 'part_type_step','part_type_death','part_type_speed','part_type_direction','part_type_gravity',
+ 'part_system_create','part_system_destroy','part_system_exists','part_system_clear',
+ 'part_system_draw_order','part_system_depth','part_system_position',
+ 'part_system_automatic_update','part_system_automatic_draw','part_system_update',
+ 'part_system_drawit','part_particles_create','part_particles_create_color',
+ 'part_particles_clear','part_particles_count',
+ 'part_emitter_create','part_emitter_destroy','part_emitter_destroy_all','part_emitter_exists',
+ 'part_emitter_clear','part_emitter_region','part_emitter_burst','part_emitter_stream',
+ 'part_attractor_create','part_attractor_destroy','part_attractor_destroy_all',
+ 'part_attractor_exists','part_attractor_clear','part_attractor_position','part_attractor_force',
+ 'part_destroyer_create','part_destroyer_destroy','part_destroyer_destroy_all',
+ 'part_destroyer_exists','part_destroyer_clear','part_destroyer_region',
+ 'part_deflector_create','part_deflector_destroy','part_deflector_destroy_all',
+ 'part_deflector_exists','part_deflector_clear','part_deflector_region','part_deflector_kind',
+ 'part_deflector_friction',
+ 'part_changer_create','part_changer_destroy','part_changer_destroy_all','part_changer_exists',
+ 'part_changer_clear','part_changer_region','part_changer_types','part_changer_kind',
+ // Multiplayer games
+ 'mplay_init_ipx','mplay_init_tcpip','mplay_init_modem','mplay_init_serial',
+ 'mplay_connect_status','mplay_end','mplay_ipaddress',
+ 'mplay_session_create','mplay_session_find','mplay_session_name','mplay_session_join',
+ 'mplay_session_mode','mplay_session_status','mplay_session_end',
+ 'mplay_player_find','mplay_player_name','mplay_player_id',
+ 'mplay_data_write','mplay_data_read','mplay_data_mode',
+ 'mplay_message_send','mplay_message_send_guaranteed','mplay_message_receive','mplay_message_id',
+ 'mplay_message_value','mplay_message_player','mplay_message_name','mplay_message_count',
+ 'mplay_message_clear',
+ // Using DLL's
+ 'external_define','external_call','external_free','window_handle',
+ // 3D Graphics
+ 'd3d_start','d3d_end','d3d_set_hidden','d3d_set_perspective',
+ 'd3d_set_depth',
+ 'd3d_primitive_begin','d3d_vertex','d3d_vertex_color','d3d_primitive_end',
+ 'd3d_primitive_begin_texture','d3d_vertex_texture','d3d_vertex_texture_color','d3d_set_culling',
+ 'd3d_draw_block','d3d_draw_cylinder','d3d_draw_cone','d3d_draw_ellipsoid','d3d_draw_wall',
+ 'd3d_draw_floor',
+ 'd3d_set_projection','d3d_set_projection_ext','d3d_set_projection_ortho',
+ 'd3d_set_projection_perspective',
+ 'd3d_transform_set_identity','d3d_transform_set_translation','d3d_transform_set_scaling',
+ 'd3d_transform_set_rotation_x','d3d_transform_set_rotation_y','d3d_transform_set_rotation_z',
+ 'd3d_transform_set_rotation_axis','d3d_transform_add_translation','d3d_transform_add_scaling',
+ 'd3d_transform_add_rotation_x','d3d_transform_add_rotation_y','d3d_transform_add_rotation_z',
+ 'd3d_transform_add_rotation_axis','d3d_transform_stack_clear','d3d_transform_stack_empty',
+ 'd3d_transform_stack_push','d3d_transform_stack_pop','d3d_transform_stack_top',
+ 'd3d_transform_stack_discard',
+ 'd3d_set_fog',
+ 'd3d_set_lighting','d3d_set_shading','d3d_light_define_direction','d3d_light_define_point',
+ 'd3d_light_enable','d3d_vertex_normal','d3d_vertex_normal_color','d3d_vertex_normal_texture',
+ 'd3d_vertex_normal_texture_color',
+ 'd3d_model_create','d3d_model_destroy','d3d_model_clear','d3d_model_save','d3d_model_load',
+ 'd3d_model_draw','d3d_model_primitive_begin','d3d_model_vertex','d3d_model_vertex_color',
+ 'd3d_model_vertex_texture','d3d_model_vertex_texture_color','d3d_model_vertex_normal',
+ 'd3d_model_vertex_normal_color','d3d_model_vertex_normal_texture',
+ 'd3d_model_vertex_normal_texture_color','d3d_model_primitive_end','d3d_model_block',
+ 'd3d_model_cylinder','d3d_model_cone','d3d_model_ellipsoid','d3d_model_wall','d3d_model_floor'
+ ),
+ // constants
+ 4 => array(
+ 'true', 'false', 'pi',
+ 'ev_destroy','ev_step','ev_alarm','ev_keyboard','ev_mouse','ev_collision','ev_other','ev_draw',
+ 'ev_keypress','ev_keyrelease','ev_left_button','ev_right_button','ev_middle_button',
+ 'ev_no_button','ev_left_press','ev_right_press','ev_middle_press','ev_left_release',
+ 'ev_right_release','ev_middle_release','ev_mouse_enter','ev_mouse_leave','ev_mouse_wheel_up',
+ 'ev_mouse_wheel_down','ev_global_left_button','ev_global_right_button','ev_global_middle_button',
+ 'ev_global_left_press','ev_global_right_press','ev_global_middle_press','ev_global_left_release',
+ 'ev_global_right_release','ev_global_middle_release','ev_joystick1_left','ev_joystick1_right',
+ 'ev_joystick1_up','ev_joystick1_down','ev_joystick1_button1','ev_joystick1_button2',
+ 'ev_joystick1_button3','ev_joystick1_button4','ev_joystick1_button5','ev_joystick1_button6',
+ 'ev_joystick1_button7','ev_joystick1_button8','ev_joystick2_left','ev_joystick2_right',
+ 'ev_joystick2_up','ev_joystick2_down','ev_joystick2_button1','ev_joystick2_button2',
+ 'ev_joystick2_button3','ev_joystick2_button4','ev_joystick2_button5','ev_joystick2_button6',
+ 'ev_joystick2_button7','ev_joystick2_button8',
+ 'ev_outside','ev_boundary','ev_game_start','ev_game_end','ev_room_start','ev_room_end',
+ 'ev_no_more_lives','ev_no_more_health','ev_animation_end','ev_end_of_path','ev_user0','ev_user1',
+ 'ev_user2','ev_user3','ev_user4','ev_user5','ev_user6','ev_user7','ev_user8','ev_user9',
+ 'ev_user10','ev_user11','ev_user12','ev_user13','ev_user14','ev_user15','ev_step_normal',
+ 'ev_step_begin','ev_step_end',
+ 'vk_nokey','vk_anykey','vk_left','vk_right','vk_up','vk_down','vk_enter','vk_escape','vk_space',
+ 'vk_shift','vk_control','vk_alt','vk_backspace','vk_tab','vk_home','vk_end','vk_delete',
+ 'vk_insert','vk_pageup','vk_pagedown','vk_pause','vk_printscreen',
+ 'vk_f1','vk_f2','vk_f3','vk_f4','vk_f5','vk_f6','vk_f7','vk_f8','vk_f9','vk_f10','vk_f11','vk_f12',
+ 'vk_numpad0','vk_numpad1','vk_numpad2','vk_numpad3','vk_numpad4','vk_numpad5','vk_numpad6',
+ 'vk_numpad7','vk_numpad8','vk_numpad9', 'vk_multiply','vk_divide','vk_add','vk_subtract',
+ 'vk_decimal','vk_lshift','vk_lcontrol','vk_lalt','vk_rshift','vk_rcontrol','vk_ralt',
+ 'c_aqua','c_black','c_blue','c_dkgray','c_fuchsia','c_gray','c_green','c_lime','c_ltgray',
+ 'c_maroon','c_navy','c_olive','c_purple','c_red','c_silver','c_teal','c_white','c_yellow',
+ 'fa_left', 'fa_center','fa_right','fa_top','fa_middle','fa_bottom',
+ 'pr_pointlist','pr_linelist','pr_linestrip','pr_trianglelist','pr_trianglestrip',
+ 'pr_trianglefan',
+ 'cr_none','cr_arrow','cr_cross','cr_beam','cr_size_nesw','cr_size_ns','cr_size_nwse',
+ 'cr_size_we','cr_uparrow','cr_hourglass','cr_drag','cr_nodrop','cr_hsplit','cr_vsplit',
+ 'cr_multidrag','cr_sqlwait','cr_no','cr_appstart','cr_help','cr_handpoint','cr_size_all',
+ 'se_chorus','se_echo','se_flanger','se_gargle','se_reverb','se_compressor','se_equalizer',
+ 'fa_readonly','fa_hidden','fa_sysfile','fa_volumeid','fa_directory','fa_archive',
+ 'pt_shape_pixel','pt_shape_disk','pt_shape_square','pt_shape_line','pt_shape_star',
+ 'pt_shape_circle','pt_shape_ring','pt_shape_sphere','pt_shape_flare','pt_shape_spark',
+ 'pt_shape_explosion','pt_shape_cloud','pt_shape_smoke','pt_shape_snow',
+ 'ps_shape_rectangle','ps_shape_ellipse ','ps_shape_diamond','ps_shape_line',
+ 'ps_distr_linear','ps_distr_gaussian','ps_force_constant','ps_force_linear','ps_force_quadratic',
+ 'ps_deflect_horizontal', 'ps_deflect_vertical',
+ 'ps_change_motion','ps_change_shape','ps_change_all'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']',
+ '&&', '||', '^^', '&', '|', '^',
+ '<', '<=', '==', '!=', '>', '>=', '=',
+ '<<', '>>',
+ '+=', '-=', '*=', '/=',
+ '+', '-', '*', '/',
+ '!', '~', ',', ';'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'font-weight: bold; color: #000000;',
+ 2 => 'font-weight: bold; color: #000000;',
+ 3 => 'color: navy;',
+ 4 => 'color: #663300;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'font-style: italic; color: green;',
+ 'MULTI' => 'font-style: italic; color: green;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;' //'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gnuplot.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gnuplot.php
new file mode 100644
index 00000000..d8445eab
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gnuplot.php
@@ -0,0 +1,296 @@
+<?php
+/*************************************************************************************
+ * gnuplot.php
+ * ----------
+ * Author: Milian Wolff (mail@milianw.de)
+ * Copyright: (c) 2008 Milian Wolff (http://milianw.de)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/07/07
+ *
+ * Gnuplot script language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/07/07 (1.0.8)
+ * - Initial import
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Gnuplot',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('`', '"', "'"),
+ 'ESCAPE_CHAR' => '\\',
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_SCI_SHORT |
+ GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ // copy output of help command, indent properly and use this replace regexp:
+ // ([a-z0-9_\-]+)(( )+|$) => '\1',\3
+
+ // commands as found in `help commands`
+ 1 => array(
+ 'bind', 'call', 'cd', 'clear',
+ 'exit', 'fit', 'help', 'history',
+ 'if', 'load', 'lower', 'pause',
+ 'plot', 'print', 'pwd', 'quit',
+ 'raise', 'replot', 'reread', 'reset',
+ 'save', 'set', 'shell', 'show',
+ 'splot', 'system', 'test', 'unset',
+ 'update'
+ ),
+ 2 => array(
+ // set commands as returned by `help set`
+ 'angles', 'arrow', 'autoscale', 'bars',
+ 'bmargin', 'border', 'boxwidth', 'cbdata',
+ 'cbdtics', 'cblabel', 'cbmtics', 'cbrange',
+ 'cbtics', 'clabel', 'clip', 'cntrparam',
+ 'colorbox', 'contour', 'datafile', 'date_specifiers',
+ 'decimalsign', 'dgrid3d', 'dummy', 'encoding',
+ 'fontpath', 'format', 'grid',
+ 'hidden3d', 'historysize', 'isosamples', 'key',
+ 'label', 'lmargin', 'loadpath', 'locale',
+ 'log', 'logscale', 'macros', 'mapping',
+ 'margin', 'missing', 'mouse', 'multiplot',
+ 'mx2tics', 'mxtics', 'my2tics', 'mytics',
+ 'mztics', 'object', 'offsets', 'origin',
+ 'output', 'palette', 'parametric', 'pm3d',
+ 'pointsize', 'polar', 'rmargin',
+ 'rrange', 'samples', 'size', 'style',
+ 'surface', 'table', 'term', 'terminal',
+ 'termoption', 'tics', 'ticscale', 'ticslevel',
+ 'time_specifiers', 'timefmt', 'timestamp', 'title',
+ 'trange', 'urange', 'view',
+ 'vrange', 'x2data', 'x2dtics', 'x2label',
+ 'x2mtics', 'x2range', 'x2tics', 'x2zeroaxis',
+ 'xdata', 'xdtics', 'xlabel', 'xmtics',
+ 'xrange', 'xtics', 'xyplane', 'xzeroaxis',
+ 'y2data', 'y2dtics', 'y2label', 'y2mtics',
+ 'y2range', 'y2tics', 'y2zeroaxis', 'ydata',
+ 'ydtics', 'ylabel', 'ymtics', 'yrange',
+ 'ytics', 'yzeroaxis', 'zdata', 'zdtics',
+ 'zero', 'zeroaxis', 'zlabel', 'zmtics',
+ 'zrange', 'ztics', 'zzeroaxis',
+ // same but with leading no
+ 'noangles', 'noarrow', 'noautoscale', 'nobars',
+ 'nobmargin', 'noborder', 'noboxwidth', 'nocbdata',
+ 'nocbdtics', 'nocblabel', 'nocbmtics', 'nocbrange',
+ 'nocbtics', 'noclabel', 'noclip', 'nocntrparam',
+ 'nocolorbox', 'nocontour', 'nodatafile', 'nodate_specifiers',
+ 'nodecimalsign', 'nodgrid3d', 'nodummy', 'noencoding',
+ 'nofit', 'nofontpath', 'noformat', 'nogrid',
+ 'nohidden3d', 'nohistorysize', 'noisosamples', 'nokey',
+ 'nolabel', 'nolmargin', 'noloadpath', 'nolocale',
+ 'nolog', 'nologscale', 'nomacros', 'nomapping',
+ 'nomargin', 'nomissing', 'nomouse', 'nomultiplot',
+ 'nomx2tics', 'nomxtics', 'nomy2tics', 'nomytics',
+ 'nomztics', 'noobject', 'nooffsets', 'noorigin',
+ 'nooutput', 'nopalette', 'noparametric', 'nopm3d',
+ 'nopointsize', 'nopolar', 'noprint', 'normargin',
+ 'norrange', 'nosamples', 'nosize', 'nostyle',
+ 'nosurface', 'notable', 'noterm', 'noterminal',
+ 'notermoption', 'notics', 'noticscale', 'noticslevel',
+ 'notime_specifiers', 'notimefmt', 'notimestamp', 'notitle',
+ 'notmargin', 'notrange', 'nourange', 'noview',
+ 'novrange', 'nox2data', 'nox2dtics', 'nox2label',
+ 'nox2mtics', 'nox2range', 'nox2tics', 'nox2zeroaxis',
+ 'noxdata', 'noxdtics', 'noxlabel', 'noxmtics',
+ 'noxrange', 'noxtics', 'noxyplane', 'noxzeroaxis',
+ 'noy2data', 'noy2dtics', 'noy2label', 'noy2mtics',
+ 'noy2range', 'noy2tics', 'noy2zeroaxis', 'noydata',
+ 'noydtics', 'noylabel', 'noymtics', 'noyrange',
+ 'noytics', 'noyzeroaxis', 'nozdata', 'nozdtics',
+ 'nozero', 'nozeroaxis', 'nozlabel', 'nozmtics',
+ 'nozrange', 'noztics', 'nozzeroaxis',
+ ),
+ 3 => array(
+ // predefined variables
+ 'pi', 'NaN', 'GNUTERM',
+ 'GPVAL_X_MIN', 'GPVAL_X_MAX', 'GPVAL_Y_MIN', 'GPVAL_Y_MAX',
+ 'GPVAL_TERM', 'GPVAL_TERMOPTIONS', 'GPVAL_OUTPUT',
+ 'GPVAL_VERSION', 'GPVAL_PATcHLEVEL', 'GPVAL_COMPILE_OPTIONS',
+ 'MOUSE_KEY', 'MOUSE_X', 'MOUSE_X2', 'MOUSE_Y', 'MOUSE_Y2',
+ 'MOUSE_BUTTON', 'MOUSE_SHIFT', 'MOUSE_ALT', 'MOUSE_CTRL'
+ ),
+ 4 => array(
+ // predefined functions `help functions`
+ 'abs', 'acos', 'acosh', 'arg',
+ 'asin', 'asinh', 'atan', 'atan2',
+ 'atanh', 'besj0', 'besj1', 'besy0',
+ 'besy1', 'ceil', 'column', 'cos',
+ 'cosh', 'defined', 'erf', 'erfc',
+ 'exists', 'exp', 'floor', 'gamma',
+ 'gprintf', 'ibeta', 'igamma', 'imag',
+ 'int', 'inverf', 'invnorm', 'lambertw',
+ 'lgamma', 'log10', 'norm',
+ 'rand', 'random', 'real', 'sgn',
+ 'sin', 'sinh', 'sprintf', 'sqrt',
+ 'stringcolumn', 'strlen', 'strstrt', 'substr',
+ 'tan', 'tanh', 'timecolumn',
+ 'tm_hour', 'tm_mday', 'tm_min', 'tm_mon',
+ 'tm_sec', 'tm_wday', 'tm_yday', 'tm_year',
+ 'valid', 'word', 'words',
+ ),
+ 5 => array(
+ // mixed arguments
+ // there is no sane way to get these ones easily...
+ 'autofreq', 'x', 'y', 'z',
+ 'lt', 'linetype', 'lw', 'linewidth', 'ls', 'linestyle',
+ 'out', 'rotate by', 'screen',
+ 'enhanced', 'via',
+ // `help set key`
+ 'on', 'off', 'default', 'inside', 'outside', 'tmargin',
+ 'at', 'left', 'right', 'center', 'top', 'bottom', 'vertical', 'horizontal', 'Left', 'Right',
+ 'noreverse', 'reverse', 'noinvert', 'invert', 'samplen', 'spacing', 'width', 'height',
+ 'noautotitle', 'autotitle', 'noenhanced', 'nobox', 'box',
+
+ // help set terminal postscript
+ 'landscape', 'portrait', 'eps', 'defaultplex', 'simplex', 'duplex',
+ 'fontfile', 'add', 'delete', 'nofontfiles', 'level1', 'leveldefault',
+ 'color', 'colour', 'monochrome', 'solid', 'dashed', 'dashlength', 'dl',
+ 'rounded', 'butt', 'palfuncparam', 'blacktext', 'colortext', 'colourtext',
+ 'font',
+
+ // help set terminal png
+ 'notransparent', 'transparent', 'nointerlace', 'interlace',
+ 'notruecolor', 'truecolor', 'tiny', 'small', 'medium', 'large', 'giant',
+ 'nocrop', 'crop',
+
+ // `help plot`
+ 'acsplines', 'bezier', 'binary', 'csplines',
+ 'every',
+ 'example', 'frequency', 'index', 'matrix',
+ 'ranges', 'sbezier', 'smooth',
+ 'special-filenames', 'thru',
+ 'unique', 'using', 'with',
+
+ // `help plotting styles`
+ 'boxerrorbars', 'boxes', 'boxxyerrorbars', 'candlesticks',
+ 'dots', 'errorbars', 'errorlines', 'filledcurves',
+ 'financebars', 'fsteps', 'histeps', 'histograms',
+ 'image', 'impulses', 'labels', 'lines',
+ 'linespoints', 'points', 'rgbimage', 'steps',
+ 'vectors', 'xerrorbars', 'xerrorlines', 'xyerrorbars',
+ 'xyerrorlines', 'yerrorbars', 'yerrorlines',
+
+
+ // terminals `help terminals`
+ 'aed512', 'aed767', 'aifm', 'bitgraph',
+ 'cgm', 'corel', 'dumb', 'dxf',
+ 'eepic', 'emf', 'emtex', 'epslatex',
+ 'epson-180dpi', 'epson-60dpi', 'epson-lx800', 'fig',
+ 'gif', 'gpic', 'hp2623a', 'hp2648',
+ 'hp500c', 'hpdj', 'hpgl', 'hpljii',
+ 'hppj', 'imagen', 'jpeg', 'kc-tek40xx',
+ 'km-tek40xx', 'latex', 'mf', 'mif',
+ 'mp', 'nec-cp6', 'okidata', 'pbm',
+ 'pcl5', 'png', 'pop', 'postscript',
+ 'pslatex', 'pstex', 'pstricks', 'push',
+ 'qms', 'regis', 'selanar', 'starc',
+ 'svg', 'tandy-60dpi', 'tek40xx', 'tek410x',
+ 'texdraw', 'tgif', 'tkcanvas', 'tpic',
+ 'vttek', 'x11', 'xlib',
+ )
+ ),
+ 'REGEXPS' => array(
+ //Variable assignment
+ 0 => "(?<![?;>\w])([a-zA-Z_][a-zA-Z0-9_]*)\s*=",
+ //Numbers with unit
+ 1 => "(?<=^|\s)([0-9]*\.?[0-9]+\s*cm)"
+ ),
+ 'SYMBOLS' => array(
+ '-', '+', '~', '!', '$',
+ '*', '/', '%', '=', '<', '>', '&',
+ '^', '|', '.', 'eq', 'ne', '?:', ':', '`', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #990000;',
+ 3 => 'color: #550000;',
+ 4 => 'color: #7a0874;',
+ 5 => 'color: #448888;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight:bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000099; font-weight:bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;',
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #007800;',
+ 1 => 'color: #cc66cc;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => 'http://www.google.com/search?q=%22set+{FNAME}%22+site%3Ahttp%3A%2F%2Fwww.gnuplot.info%2Fdocs%2F&amp;btnI=lucky',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 4 => array(
+ 'DISALLOWED_AFTER' => "(?![\.\-a-zA-Z0-9_%])"
+ )
+ )
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/go.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/go.php
new file mode 100644
index 00000000..5b7a47db
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/go.php
@@ -0,0 +1,375 @@
+<?php
+/*************************************************************************************
+ * go.php
+ * --------
+ * Author: Markus Jarderot (mizardx at gmail dot com)
+ * Copyright: (c) 2010 Markus Jarderot
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/05/20
+ *
+ * Go language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/05/20 (1.0.8.9)
+ * - First Release
+ *
+ * TODO (updated 2010/05/20)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Go',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ # Raw strings (escapes and linebreaks ignored)
+ 2 => "#`[^`]*`#"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', "'"),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ 1 => "#\\\\[abfnrtv\\\\\'\"]#",
+ 2 => "#\\\\[0-7]{3}#",
+ 3 => "#\\\\x[0-9a-fA-F]{2}#",
+ 4 => "#\\\\u[0-9a-fA-F]{4}#",
+ 5 => "#\\\\U[0-9a-fA-F]{8}#"
+ ),
+ 'NUMBERS' => array(
+ # integer literals (possibly imaginary)
+ 0 => '\b([1-9][0-9]*i?|0[0-7]*|0[xX][0-9a-f]+|0[0-9]*i)\b',
+ # real floating point literals
+ 1 => '\b((?:\d+\.\d*(?:[Ee][+-]?\d+\b)?|\.\d+(?:[Ee][+-]?\d+)?|\d+[Ee][+-]?\d+)?)\b',
+ # imaginary floating point literals
+ 2 => '\b((?:\d+\.\d*(?:[Ee][+-]?\d+)?|\.\d+(?:[Ee][+-]?\d+)?|\d+[Ee][+-]?\d+)?i)\b'
+ ),
+ 'KEYWORDS' => array(
+ # statements
+ 1 => array(
+ 'break', 'case', 'const', 'continue', 'default', 'defer', 'else',
+ 'fallthrough', 'for', 'go', 'goto', 'if', 'import', 'package',
+ 'range', 'return', 'select', 'switch', 'type', 'var'
+ ),
+ # literals
+ 2 => array(
+ 'nil', 'true', 'false'
+ ),
+ # built-in functions
+ 3 => array(
+ 'close', 'closed', 'len', 'cap', 'new', 'make', 'copy', 'cmplx',
+ 'real', 'imag', 'panic', 'recover', 'print', 'println'
+ ),
+ # built-in types
+ 4 => array(
+ 'chan', 'func', 'interface', 'map', 'struct', 'bool', 'uint8',
+ 'uint16', 'uint32', 'uint64', 'int8', 'int16', 'int32', 'int64',
+ 'float32', 'float64', 'complex64', 'complex128', 'byte', 'uint',
+ 'int', 'float', 'complex', 'uintptr', 'string'
+ ),
+ # library types
+ 5 => array(
+ 'aes.Cipher', 'aes.KeySizeError', 'ascii85.CorruptInputError', 'asn1.BitString',
+ 'asn1.RawValue', 'asn1.StructuralError', 'asn1.SyntaxError', 'ast.ChanDir',
+ 'ast.Comment', 'ast.CommentGroup', 'ast.Decl', 'ast.Expr', 'ast.Field',
+ 'ast.FieldList', 'ast.File', 'ast.Filter', 'ast.MergeMode', 'ast.Node',
+ 'ast.ObjKind', 'ast.Object', 'ast.Package', 'ast.Scope', 'ast.Stmt',
+ 'ast.Visitor', 'av.Color', 'av.Image', 'av.Window', 'base64.CorruptInputError',
+ 'base64.Encoding', 'big.Int', 'big.Word', 'bignum.Integer', 'bignum.Rational',
+ 'binary.ByteOrder', 'block.Cipher', 'block.EAXTagError', 'blowfish.Cipher',
+ 'blowfish.KeySizeError', 'bufio.BufSizeError', 'bufio.Error', 'bufio.ReadWriter',
+ 'bufio.Reader', 'bufio.Writer', 'bytes.Buffer', 'datafmt.Environment',
+ 'datafmt.Format', 'datafmt.Formatter', 'datafmt.FormatterMap', 'datafmt.State',
+ 'doc.Filter', 'doc.FuncDoc', 'doc.PackageDoc', 'doc.TypeDoc', 'doc.ValueDoc',
+ 'draw.Color', 'draw.Context', 'draw.Image', 'draw.Mouse', 'draw.Op',
+ 'draw.Point', 'draw.Rectangle', 'dwarf.AddrType', 'dwarf.ArrayType',
+ 'dwarf.Attr', 'dwarf.BasicType', 'dwarf.BoolType', 'dwarf.CharType',
+ 'dwarf.CommonType', 'dwarf.ComplexType', 'dwarf.Data', 'dwarf.DecodeError',
+ 'dwarf.DotDotDotType', 'dwarf.Entry', 'dwarf.EnumType', 'dwarf.EnumValue',
+ 'dwarf.Field', 'dwarf.FloatType', 'dwarf.FuncType', 'dwarf.IntType',
+ 'dwarf.Offset', 'dwarf.PtrType', 'dwarf.QualType', 'dwarf.Reader',
+ 'dwarf.StructField', 'dwarf.StructType', 'dwarf.Tag', 'dwarf.Type',
+ 'dwarf.TypedefType', 'dwarf.UcharType', 'dwarf.UintType', 'dwarf.VoidType',
+ 'elf.Class', 'elf.Data', 'elf.Dyn32', 'elf.Dyn64', 'elf.DynFlag', 'elf.DynTag',
+ 'elf.File', 'elf.FileHeader', 'elf.FormatError', 'elf.Header32', 'elf.Header64',
+ 'elf.Machine', 'elf.NType', 'elf.OSABI', 'elf.Prog', 'elf.Prog32', 'elf.Prog64',
+ 'elf.ProgFlag', 'elf.ProgHeader', 'elf.ProgType', 'elf.R_386', 'elf.R_ALPHA',
+ 'elf.R_ARM', 'elf.R_PPC', 'elf.R_SPARC', 'elf.R_X86_64', 'elf.Rel32',
+ 'elf.Rel64', 'elf.Rela32', 'elf.Rela64', 'elf.Section', 'elf.Section32',
+ 'elf.Section64', 'elf.SectionFlag', 'elf.SectionHeader', 'elf.SectionIndex',
+ 'elf.SectionType', 'elf.Sym32', 'elf.Sym64', 'elf.SymBind', 'elf.SymType',
+ 'elf.SymVis', 'elf.Symbol', 'elf.Type', 'elf.Version', 'eval.ArrayType',
+ 'eval.ArrayValue', 'eval.BoolValue', 'eval.BoundedType', 'eval.ChanType',
+ 'eval.Code', 'eval.Constant', 'eval.Def', 'eval.DivByZeroError',
+ 'eval.FloatValue', 'eval.Frame', 'eval.Func', 'eval.FuncDecl', 'eval.FuncType',
+ 'eval.FuncValue', 'eval.IMethod', 'eval.IdealFloatValue', 'eval.IdealIntValue',
+ 'eval.IndexError', 'eval.IntValue', 'eval.Interface', 'eval.InterfaceType',
+ 'eval.InterfaceValue', 'eval.KeyError', 'eval.Map', 'eval.MapType',
+ 'eval.MapValue', 'eval.Method', 'eval.MultiType', 'eval.NamedType',
+ 'eval.NegativeCapacityError', 'eval.NegativeLengthError', 'eval.NilPointerError',
+ 'eval.PtrType', 'eval.PtrValue', 'eval.RedefinitionError', 'eval.Scope',
+ 'eval.Slice', 'eval.SliceError', 'eval.SliceType', 'eval.SliceValue',
+ 'eval.StringValue', 'eval.StructField', 'eval.StructType', 'eval.StructValue',
+ 'eval.Thread', 'eval.Type', 'eval.UintValue', 'eval.Value', 'eval.Variable',
+ 'eval.World', 'exec.Cmd', 'expvar.Int', 'expvar.IntFunc', 'expvar.KeyValue',
+ 'expvar.Map', 'expvar.String', 'expvar.StringFunc', 'expvar.Var', 'flag.Flag',
+ 'flag.Value', 'flate.CorruptInputError', 'flate.InternalError',
+ 'flate.ReadError', 'flate.Reader', 'flate.WriteError', 'flate.WrongValueError',
+ 'fmt.Formatter', 'fmt.GoStringer', 'fmt.State', 'fmt.Stringer',
+ 'git85.CorruptInputError', 'gob.Decoder', 'gob.Encoder', 'gosym.DecodingError',
+ 'gosym.Func', 'gosym.LineTable', 'gosym.Obj', 'gosym.Sym', 'gosym.Table',
+ 'gosym.UnknownFileError', 'gosym.UnknownLineError', 'gzip.Deflater',
+ 'gzip.Header', 'gzip.Inflater', 'hash.Hash', 'hash.Hash32', 'hash.Hash64',
+ 'heap.Interface', 'hex.InvalidHexCharError', 'hex.OddLengthInputError',
+ 'http.ClientConn', 'http.Conn', 'http.Handler', 'http.HandlerFunc',
+ 'http.ProtocolError', 'http.Request', 'http.Response', 'http.ServeMux',
+ 'http.ServerConn', 'http.URL', 'http.URLError', 'http.URLEscapeError',
+ 'image.Alpha', 'image.AlphaColor', 'image.Color', 'image.ColorImage',
+ 'image.ColorModel', 'image.ColorModelFunc', 'image.Image', 'image.NRGBA',
+ 'image.NRGBA64', 'image.NRGBA64Color', 'image.NRGBAColor', 'image.Paletted',
+ 'image.RGBA', 'image.RGBA64', 'image.RGBA64Color', 'image.RGBAColor',
+ 'io.Closer', 'io.Error', 'io.PipeReader', 'io.PipeWriter', 'io.ReadByter',
+ 'io.ReadCloser', 'io.ReadSeeker', 'io.ReadWriteCloser', 'io.ReadWriteSeeker',
+ 'io.ReadWriter', 'io.Reader', 'io.ReaderAt', 'io.ReaderFrom', 'io.SectionReader',
+ 'io.Seeker', 'io.WriteCloser', 'io.WriteSeeker', 'io.Writer', 'io.WriterAt',
+ 'io.WriterTo', 'iterable.Func', 'iterable.Group', 'iterable.Grouper',
+ 'iterable.Injector', 'iterable.Iterable', 'jpeg.FormatError', 'jpeg.Reader',
+ 'jpeg.UnsupportedError', 'json.Decoder', 'json.Encoder',
+ 'json.InvalidUnmarshalError', 'json.Marshaler', 'json.MarshalerError',
+ 'json.SyntaxError', 'json.UnmarshalTypeError', 'json.Unmarshaler',
+ 'json.UnsupportedTypeError', 'list.Element', 'list.List', 'log.Logger',
+ 'macho.Cpu', 'macho.File', 'macho.FileHeader', 'macho.FormatError', 'macho.Load',
+ 'macho.LoadCmd', 'macho.Regs386', 'macho.RegsAMD64', 'macho.Section',
+ 'macho.Section32', 'macho.Section64', 'macho.SectionHeader', 'macho.Segment',
+ 'macho.Segment32', 'macho.Segment64', 'macho.SegmentHeader', 'macho.Thread',
+ 'macho.Type', 'net.Addr', 'net.AddrError', 'net.Conn', 'net.DNSConfigError',
+ 'net.DNSError', 'net.Error', 'net.InvalidAddrError', 'net.InvalidConnError',
+ 'net.Listener', 'net.OpError', 'net.PacketConn', 'net.TCPAddr', 'net.TCPConn',
+ 'net.TCPListener', 'net.UDPAddr', 'net.UDPConn', 'net.UnixAddr', 'net.UnixConn',
+ 'net.UnixListener', 'net.UnknownNetworkError', 'net.UnknownSocketError',
+ 'netchan.Dir', 'netchan.Exporter', 'netchan.Importer', 'nntp.Article',
+ 'nntp.Conn', 'nntp.Error', 'nntp.Group', 'nntp.ProtocolError', 'ogle.Arch',
+ 'ogle.ArchAlignedMultiple', 'ogle.ArchLSB', 'ogle.Breakpoint', 'ogle.Event',
+ 'ogle.EventAction', 'ogle.EventHandler', 'ogle.EventHook', 'ogle.FormatError',
+ 'ogle.Frame', 'ogle.Goroutine', 'ogle.GoroutineCreate', 'ogle.GoroutineExit',
+ 'ogle.NoCurrentGoroutine', 'ogle.NotOnStack', 'ogle.Process',
+ 'ogle.ProcessNotStopped', 'ogle.ReadOnlyError', 'ogle.RemoteMismatchError',
+ 'ogle.UnknownArchitecture', 'ogle.UnknownGoroutine', 'ogle.UsageError',
+ 'os.Errno', 'os.Error', 'os.ErrorString', 'os.File', 'os.FileInfo',
+ 'os.LinkError', 'os.PathError', 'os.SyscallError', 'os.Waitmsg', 'patch.Diff',
+ 'patch.File', 'patch.GitBinaryLiteral', 'patch.Op', 'patch.Set',
+ 'patch.SyntaxError', 'patch.TextChunk', 'patch.Verb', 'path.Visitor',
+ 'pdp1.HaltError', 'pdp1.LoopError', 'pdp1.Trapper', 'pdp1.UnknownInstrError',
+ 'pdp1.Word', 'pem.Block', 'png.FormatError', 'png.IDATDecodingError',
+ 'png.UnsupportedError', 'printer.Config', 'printer.HTMLTag', 'printer.Styler',
+ 'proc.Breakpoint', 'proc.Cause', 'proc.Process', 'proc.ProcessExited',
+ 'proc.Regs', 'proc.Signal', 'proc.Stopped', 'proc.Thread', 'proc.ThreadCreate',
+ 'proc.ThreadExit', 'proc.Word', 'quick.CheckEqualError', 'quick.CheckError',
+ 'quick.Config', 'quick.Generator', 'quick.SetupError', 'rand.Rand',
+ 'rand.Source', 'rand.Zipf', 'rc4.Cipher', 'rc4.KeySizeError',
+ 'reflect.ArrayOrSliceType', 'reflect.ArrayOrSliceValue', 'reflect.ArrayType',
+ 'reflect.ArrayValue', 'reflect.BoolType', 'reflect.BoolValue', 'reflect.ChanDir',
+ 'reflect.ChanType', 'reflect.ChanValue', 'reflect.Complex128Type',
+ 'reflect.Complex128Value', 'reflect.Complex64Type', 'reflect.Complex64Value',
+ 'reflect.ComplexType', 'reflect.ComplexValue', 'reflect.Float32Type',
+ 'reflect.Float32Value', 'reflect.Float64Type', 'reflect.Float64Value',
+ 'reflect.FloatType', 'reflect.FloatValue', 'reflect.FuncType',
+ 'reflect.FuncValue', 'reflect.Int16Type', 'reflect.Int16Value',
+ 'reflect.Int32Type', 'reflect.Int32Value', 'reflect.Int64Type',
+ 'reflect.Int64Value', 'reflect.Int8Type', 'reflect.Int8Value', 'reflect.IntType',
+ 'reflect.IntValue', 'reflect.InterfaceType', 'reflect.InterfaceValue',
+ 'reflect.MapType', 'reflect.MapValue', 'reflect.Method', 'reflect.PtrType',
+ 'reflect.PtrValue', 'reflect.SliceHeader', 'reflect.SliceType',
+ 'reflect.SliceValue', 'reflect.StringHeader', 'reflect.StringType',
+ 'reflect.StringValue', 'reflect.StructField', 'reflect.StructType',
+ 'reflect.StructValue', 'reflect.Type', 'reflect.Uint16Type',
+ 'reflect.Uint16Value', 'reflect.Uint32Type', 'reflect.Uint32Value',
+ 'reflect.Uint64Type', 'reflect.Uint64Value', 'reflect.Uint8Type',
+ 'reflect.Uint8Value', 'reflect.UintType', 'reflect.UintValue',
+ 'reflect.UintptrType', 'reflect.UintptrValue', 'reflect.UnsafePointerType',
+ 'reflect.UnsafePointerValue', 'reflect.Value', 'regexp.Error', 'regexp.Regexp',
+ 'ring.Ring', 'rpc.Call', 'rpc.Client', 'rpc.ClientCodec', 'rpc.InvalidRequest',
+ 'rpc.Request', 'rpc.Response', 'rpc.ServerCodec', 'rsa.DecryptionError',
+ 'rsa.MessageTooLongError', 'rsa.PKCS1v15Hash', 'rsa.PrivateKey', 'rsa.PublicKey',
+ 'rsa.VerificationError', 'runtime.ArrayType', 'runtime.BoolType',
+ 'runtime.ChanDir', 'runtime.ChanType', 'runtime.Complex128Type',
+ 'runtime.Complex64Type', 'runtime.ComplexType', 'runtime.Error',
+ 'runtime.Float32Type', 'runtime.Float64Type', 'runtime.FloatType',
+ 'runtime.Func', 'runtime.FuncType', 'runtime.Int16Type', 'runtime.Int32Type',
+ 'runtime.Int64Type', 'runtime.Int8Type', 'runtime.IntType',
+ 'runtime.InterfaceType', 'runtime.Itable', 'runtime.MapType',
+ 'runtime.MemProfileRecord', 'runtime.MemStatsType', 'runtime.PtrType',
+ 'runtime.SliceType', 'runtime.StringType', 'runtime.StructType', 'runtime.Type',
+ 'runtime.TypeAssertionError', 'runtime.Uint16Type', 'runtime.Uint32Type',
+ 'runtime.Uint64Type', 'runtime.Uint8Type', 'runtime.UintType',
+ 'runtime.UintptrType', 'runtime.UnsafePointerType', 'scanner.Error',
+ 'scanner.ErrorHandler', 'scanner.ErrorVector', 'scanner.Position',
+ 'scanner.Scanner', 'script.Close', 'script.Closed', 'script.Event',
+ 'script.ReceivedUnexpected', 'script.Recv', 'script.RecvMatch', 'script.Send',
+ 'script.SetupError', 'signal.Signal', 'signal.UnixSignal', 'sort.Interface',
+ 'srpc.Client', 'srpc.Errno', 'srpc.Handler', 'srpc.RPC', 'strconv.NumError',
+ 'strings.Reader', 'sync.Mutex', 'sync.RWMutex',
+ 'syscall.ByHandleFileInformation', 'syscall.Cmsghdr', 'syscall.Dirent',
+ 'syscall.EpollEvent', 'syscall.Fbootstraptransfer_t', 'syscall.FdSet',
+ 'syscall.Filetime', 'syscall.Flock_t', 'syscall.Fstore_t', 'syscall.Iovec',
+ 'syscall.Kevent_t', 'syscall.Linger', 'syscall.Log2phys_t', 'syscall.Msghdr',
+ 'syscall.Overlapped', 'syscall.PtraceRegs', 'syscall.Radvisory_t',
+ 'syscall.RawSockaddr', 'syscall.RawSockaddrAny', 'syscall.RawSockaddrInet4',
+ 'syscall.RawSockaddrInet6', 'syscall.RawSockaddrUnix', 'syscall.Rlimit',
+ 'syscall.Rusage', 'syscall.Sockaddr', 'syscall.SockaddrInet4',
+ 'syscall.SockaddrInet6', 'syscall.SockaddrUnix', 'syscall.Stat_t',
+ 'syscall.Statfs_t', 'syscall.Sysinfo_t', 'syscall.Time_t', 'syscall.Timespec',
+ 'syscall.Timeval', 'syscall.Timex', 'syscall.Tms', 'syscall.Ustat_t',
+ 'syscall.Utimbuf', 'syscall.Utsname', 'syscall.WaitStatus',
+ 'syscall.Win32finddata', 'syslog.Priority', 'syslog.Writer', 'tabwriter.Writer',
+ 'tar.Header', 'tar.Reader', 'tar.Writer', 'template.Error',
+ 'template.FormatterMap', 'template.Template', 'testing.Benchmark',
+ 'testing.Regexp', 'testing.Test', 'time.ParseError', 'time.Ticker', 'time.Time',
+ 'tls.CASet', 'tls.Certificate', 'tls.Config', 'tls.Conn', 'tls.ConnectionState',
+ 'tls.Listener', 'token.Position', 'token.Token', 'unicode.CaseRange',
+ 'unicode.Range', 'unsafe.ArbitraryType', 'vector.LessInterface',
+ 'websocket.Conn', 'websocket.Draft75Handler', 'websocket.Handler',
+ 'websocket.ProtocolError', 'websocket.WebSocketAddr', 'x509.Certificate',
+ 'x509.ConstraintViolationError', 'x509.KeyUsage', 'x509.Name',
+ 'x509.PublicKeyAlgorithm', 'x509.SignatureAlgorithm',
+ 'x509.UnhandledCriticalExtension', 'x509.UnsupportedAlgorithmError', 'xml.Attr',
+ 'xml.EndElement', 'xml.Name', 'xml.Parser', 'xml.ProcInst', 'xml.StartElement',
+ 'xml.SyntaxError', 'xml.Token', 'xml.UnmarshalError', 'xtea.Cipher',
+ 'xtea.KeySizeError'
+ )
+ ),
+ 'SYMBOLS' => array(
+ # delimiters
+ 1 => array(
+ '(', ')', '{', '}', '[', ']', ',', ':', ';'
+ ),
+ # assignments
+ 2 => array(
+ '<<=', '!=', '%=', '&=', '&^=', '*=', '+=', '-=', '/=', ':=', '>>=',
+ '^=', '|=', '=', '++', '--'
+ ),
+ # operators
+ 3 => array(
+ '<=', '<', '==', '>', '>=', '&&', '!', '||', '&', '&^', '|', '^',
+ '>>', '<<', '*', '%', '+', '-', '.', '/', '<-'),
+ # vararg
+ 4 => array(
+ '...'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ # statements
+ 1 => 'color: #b1b100; font-weight: bold;',
+ # literals
+ 2 => 'color: #000000; font-weight: bold;',
+ # built-in functions
+ 3 => 'color: #000066;',
+ # built-in types
+ 4 => 'color: #993333;',
+ # library types
+ 5 => 'color: #003399;'
+ ),
+ 'COMMENTS' => array(
+ # single-line comments
+ 1 => 'color: #666666; font-style: italic;',
+ # raw strings
+ 2 => 'color: #0000ff;',
+ # multi-line comments
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ # simple escape
+ 1 => 'color: #000099; font-weight: bold;',
+ # octal escape
+ 2 => 'color: #000099;',
+ # hex escape
+ 3 => 'color: #000099;',
+ # unicode escape
+ 4 => 'color: #000099;',
+ # long unicode escape
+ 5 => 'color: #000099;'
+ ),
+ 'BRACKETS' => array(
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;',
+ 0 => 'color: #cc66cc;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ # delimiters
+ 1 => 'color: #339933;',
+ # assignments
+ 2 => 'color: #339933;',
+ # operators
+ 3 => 'color: #339933;',
+ # vararg (highlighted as a keyword)
+ 4 => 'color: #000000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ # If CSS classes are enabled, these would be highlighted as numbers (nu0)
+ # integer literals (possibly imaginary)
+ //0 => 'color: #cc66cc;',
+ # real floating point literals
+ //1 => 'color: #cc66cc;',
+ # imaginary floating point literals
+ //2 => 'color: #cc66cc;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => 'http://golang.org/search?q={FNAME}'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(1 => '.'),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER, # handled by symbols
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/groovy.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/groovy.php
new file mode 100644
index 00000000..45290d2f
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/groovy.php
@@ -0,0 +1,1011 @@
+<?php
+/*************************************************************************************
+ * groovy.php
+ * ----------
+ * Author: Ivan F. Villanueva B. (geshi_groovy@artificialidea.com)
+ * Copyright: (c) 2006 Ivan F. Villanueva B.(http://www.artificialidea.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/04/29
+ *
+ * Groovy language file for GeSHi.
+ *
+ * Keywords from http: http://docs.codehaus.org/download/attachments/2715/groovy-reference-card.pdf?version=1
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2006/04/29 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2006/04/29)
+ * -------------------------
+ * Testing
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Groovy',
+ 'COMMENT_SINGLE' => array(1 => '//', 3 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Import and Package directives (Basic Support only)
+ 2 => '/(?:(?<=import[\\n\\s])|(?<=package[\\n\\s]))[\\n\\s]*([a-zA-Z0-9_]+\\.)*([a-zA-Z0-9_]+|\*)(?=[\n\s;])/i',
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'''", '"""', "'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'case', 'do', 'else', 'for', 'foreach', 'if', 'in', 'switch',
+ 'while',
+ ),
+ 2 => array(
+ 'abstract', 'as', 'assert', 'break', 'catch', 'class', 'const',
+ 'continue', 'def', 'default', 'enum', 'extends',
+ 'false', 'final', 'finally', 'goto', 'implements', 'import',
+ 'instanceof', 'interface', 'native', 'new', 'null',
+ 'package', 'private', 'property', 'protected',
+ 'public', 'return', 'static', 'strictfp', 'super',
+ 'synchronized', 'this', 'throw', 'throws',
+ 'transient', 'true', 'try', 'volatile'
+ ),
+ 3 => array(
+ 'AbstractAction', 'AbstractBorder', 'AbstractButton',
+ 'AbstractCellEditor', 'AbstractCollection',
+ 'AbstractColorChooserPanel', 'AbstractDocument',
+ 'AbstractDocument.AttributeContext',
+ 'AbstractDocument.Content',
+ 'AbstractDocument.ElementEdit',
+ 'AbstractLayoutCache',
+ 'AbstractLayoutCache.NodeDimensions', 'AbstractList',
+ 'AbstractListModel', 'AbstractMap',
+ 'AbstractMethodError', 'AbstractSequentialList',
+ 'AbstractSet', 'AbstractTableModel',
+ 'AbstractUndoableEdit', 'AbstractWriter',
+ 'AccessControlContext', 'AccessControlException',
+ 'AccessController', 'AccessException', 'Accessible',
+ 'AccessibleAction', 'AccessibleBundle',
+ 'AccessibleComponent', 'AccessibleContext',
+ 'AccessibleHyperlink', 'AccessibleHypertext',
+ 'AccessibleIcon', 'AccessibleObject',
+ 'AccessibleRelation', 'AccessibleRelationSet',
+ 'AccessibleResourceBundle', 'AccessibleRole',
+ 'AccessibleSelection', 'AccessibleState',
+ 'AccessibleStateSet', 'AccessibleTable',
+ 'AccessibleTableModelChange', 'AccessibleText',
+ 'AccessibleValue', 'Acl', 'AclEntry',
+ 'AclNotFoundException', 'Action', 'ActionEvent',
+ 'ActionListener', 'ActionMap', 'ActionMapUIResource',
+ 'Activatable', 'ActivateFailedException',
+ 'ActivationDesc', 'ActivationException',
+ 'ActivationGroup', 'ActivationGroupDesc',
+ 'ActivationGroupDesc.CommandEnvironment',
+ 'ActivationGroupID', 'ActivationID',
+ 'ActivationInstantiator', 'ActivationMonitor',
+ 'ActivationSystem', 'Activator', 'ActiveEvent',
+ 'Adjustable', 'AdjustmentEvent',
+ 'AdjustmentListener', 'Adler32', 'AffineTransform',
+ 'AffineTransformOp', 'AlgorithmParameterGenerator',
+ 'AlgorithmParameterGeneratorSpi',
+ 'AlgorithmParameters', 'AlgorithmParameterSpec',
+ 'AlgorithmParametersSpi', 'AllPermission',
+ 'AlphaComposite', 'AlreadyBound',
+ 'AlreadyBoundException', 'AlreadyBoundHelper',
+ 'AlreadyBoundHolder', 'AncestorEvent',
+ 'AncestorListener', 'Annotation', 'Any', 'AnyHolder',
+ 'AnySeqHelper', 'AnySeqHolder', 'Applet',
+ 'AppletContext', 'AppletInitializer', 'AppletStub',
+ 'ApplicationException', 'Arc2D', 'Arc2D.Double',
+ 'Arc2D.Float', 'Area', 'AreaAveragingScaleFilter',
+ 'ARG_IN', 'ARG_INOUT', 'ARG_OUT',
+ 'ArithmeticException', 'Array',
+ 'ArrayIndexOutOfBoundsException', 'ArrayList',
+ 'Arrays', 'ArrayStoreException', 'AsyncBoxView',
+ 'Attribute', 'AttributedCharacterIterator',
+ 'AttributedCharacterIterator.Attribute',
+ 'AttributedString', 'AttributeInUseException',
+ 'AttributeList', 'AttributeModificationException',
+ 'Attributes', 'Attributes.Name', 'AttributeSet',
+ 'AttributeSet.CharacterAttribute',
+ 'AttributeSet.ColorAttribute',
+ 'AttributeSet.FontAttribute',
+ 'AttributeSet.ParagraphAttribute', 'AudioClip',
+ 'AudioFileFormat', 'AudioFileFormat.Type',
+ 'AudioFileReader', 'AudioFileWriter', 'AudioFormat',
+ 'AudioFormat.Encoding', 'AudioInputStream',
+ 'AudioPermission', 'AudioSystem',
+ 'AuthenticationException',
+ 'AuthenticationNotSupportedException',
+ 'Authenticator', 'Autoscroll', 'AWTError',
+ 'AWTEvent', 'AWTEventListener',
+ 'AWTEventMulticaster', 'AWTException',
+ 'AWTPermission', 'BadKind', 'BadLocationException',
+ 'BAD_CONTEXT', 'BAD_INV_ORDER', 'BAD_OPERATION',
+ 'BAD_PARAM', 'BAD_POLICY', 'BAD_POLICY_TYPE',
+ 'BAD_POLICY_VALUE', 'BAD_TYPECODE', 'BandCombineOp',
+ 'BandedSampleModel', 'BasicArrowButton',
+ 'BasicAttribute', 'BasicAttributes', 'BasicBorders',
+ 'BasicBorders.ButtonBorder',
+ 'BasicBorders.FieldBorder',
+ 'BasicBorders.MarginBorder',
+ 'BasicBorders.MenuBarBorder',
+ 'BasicBorders.RadioButtonBorder',
+ 'BasicBorders.SplitPaneBorder',
+ 'BasicBorders.ToggleButtonBorder',
+ 'BasicButtonListener', 'BasicButtonUI',
+ 'BasicCheckBoxMenuItemUI', 'BasicCheckBoxUI',
+ 'BasicColorChooserUI', 'BasicComboBoxEditor',
+ 'BasicComboBoxEditor.UIResource',
+ 'BasicComboBoxRenderer',
+ 'BasicComboBoxRenderer.UIResource',
+ 'BasicComboBoxUI', 'BasicComboPopup',
+ 'BasicDesktopIconUI', 'BasicDesktopPaneUI',
+ 'BasicDirectoryModel', 'BasicEditorPaneUI',
+ 'BasicFileChooserUI', 'BasicGraphicsUtils',
+ 'BasicHTML', 'BasicIconFactory',
+ 'BasicInternalFrameTitlePane',
+ 'BasicInternalFrameUI', 'BasicLabelUI',
+ 'BasicListUI', 'BasicLookAndFeel', 'BasicMenuBarUI',
+ 'BasicMenuItemUI', 'BasicMenuUI',
+ 'BasicOptionPaneUI',
+ 'BasicOptionPaneUI.ButtonAreaLayout', 'BasicPanelUI',
+ 'BasicPasswordFieldUI', 'BasicPermission',
+ 'BasicPopupMenuSeparatorUI', 'BasicPopupMenuUI',
+ 'BasicProgressBarUI', 'BasicRadioButtonMenuItemUI',
+ 'BasicRadioButtonUI', 'BasicRootPaneUI',
+ 'BasicScrollBarUI', 'BasicScrollPaneUI',
+ 'BasicSeparatorUI', 'BasicSliderUI',
+ 'BasicSplitPaneDivider', 'BasicSplitPaneUI',
+ 'BasicStroke', 'BasicTabbedPaneUI',
+ 'BasicTableHeaderUI', 'BasicTableUI',
+ 'BasicTextAreaUI', 'BasicTextFieldUI',
+ 'BasicTextPaneUI', 'BasicTextUI',
+ 'BasicTextUI.BasicCaret',
+ 'BasicTextUI.BasicHighlighter',
+ 'BasicToggleButtonUI', 'BasicToolBarSeparatorUI',
+ 'BasicToolBarUI', 'BasicToolTipUI', 'BasicTreeUI',
+ 'BasicViewportUI', 'BatchUpdateException',
+ 'BeanContext', 'BeanContextChild',
+ 'BeanContextChildComponentProxy',
+ 'BeanContextChildSupport',
+ 'BeanContextContainerProxy', 'BeanContextEvent',
+ 'BeanContextMembershipEvent',
+ 'BeanContextMembershipListener', 'BeanContextProxy',
+ 'BeanContextServiceAvailableEvent',
+ 'BeanContextServiceProvider',
+ 'BeanContextServiceProviderBeanInfo',
+ 'BeanContextServiceRevokedEvent',
+ 'BeanContextServiceRevokedListener',
+ 'BeanContextServices', 'BeanContextServicesListener',
+ 'BeanContextServicesSupport',
+ 'BeanContextServicesSupport.BCSSServiceProvider',
+ 'BeanContextSupport',
+ 'BeanContextSupport.BCSIterator', 'BeanDescriptor',
+ 'BeanInfo', 'Beans', 'BevelBorder', 'BigDecimal',
+ 'BigInteger', 'BinaryRefAddr', 'BindException',
+ 'Binding', 'BindingHelper', 'BindingHolder',
+ 'BindingIterator', 'BindingIteratorHelper',
+ 'BindingIteratorHolder', 'BindingIteratorOperations',
+ 'BindingListHelper', 'BindingListHolder',
+ 'BindingType', 'BindingTypeHelper',
+ 'BindingTypeHolder', 'BitSet', 'Blob', 'BlockView',
+ 'Book', 'Boolean', 'BooleanControl',
+ 'BooleanControl.Type', 'BooleanHolder',
+ 'BooleanSeqHelper', 'BooleanSeqHolder', 'Border',
+ 'BorderFactory', 'BorderLayout', 'BorderUIResource',
+ 'BorderUIResource.BevelBorderUIResource',
+ 'BorderUIResource.CompoundBorderUIResource',
+ 'BorderUIResource.EmptyBorderUIResource',
+ 'BorderUIResource.EtchedBorderUIResource',
+ 'BorderUIResource.LineBorderUIResource',
+ 'BorderUIResource.MatteBorderUIResource',
+ 'BorderUIResource.TitledBorderUIResource',
+ 'BoundedRangeModel', 'Bounds', 'Box', 'Box.Filler',
+ 'BoxedValueHelper', 'BoxLayout', 'BoxView',
+ 'BreakIterator', 'BufferedImage',
+ 'BufferedImageFilter', 'BufferedImageOp',
+ 'BufferedInputStream', 'BufferedOutputStream',
+ 'BufferedReader', 'BufferedWriter', 'Button',
+ 'ButtonGroup', 'ButtonModel', 'ButtonUI', 'Byte',
+ 'ByteArrayInputStream', 'ByteArrayOutputStream',
+ 'ByteHolder', 'ByteLookupTable', 'Calendar',
+ 'CallableStatement', 'CannotProceed',
+ 'CannotProceedException', 'CannotProceedHelper',
+ 'CannotProceedHolder', 'CannotRedoException',
+ 'CannotUndoException', 'Canvas', 'CardLayout',
+ 'Caret', 'CaretEvent', 'CaretListener', 'CellEditor',
+ 'CellEditorListener', 'CellRendererPane',
+ 'Certificate', 'Certificate.CertificateRep',
+ 'CertificateEncodingException',
+ 'CertificateException',
+ 'CertificateExpiredException', 'CertificateFactory',
+ 'CertificateFactorySpi',
+ 'CertificateNotYetValidException',
+ 'CertificateParsingException',
+ 'ChangedCharSetException', 'ChangeEvent',
+ 'ChangeListener', 'Character', 'Character.Subset',
+ 'Character.UnicodeBlock', 'CharacterIterator',
+ 'CharArrayReader', 'CharArrayWriter',
+ 'CharConversionException', 'CharHolder',
+ 'CharSeqHelper', 'CharSeqHolder', 'Checkbox',
+ 'CheckboxGroup', 'CheckboxMenuItem',
+ 'CheckedInputStream', 'CheckedOutputStream',
+ 'Checksum', 'Choice', 'ChoiceFormat', 'Class',
+ 'ClassCastException', 'ClassCircularityError',
+ 'ClassDesc', 'ClassFormatError', 'ClassLoader',
+ 'ClassNotFoundException', 'Clip', 'Clipboard',
+ 'ClipboardOwner', 'Clob', 'Cloneable',
+ 'CloneNotSupportedException', 'CMMException',
+ 'CodeSource', 'CollationElementIterator',
+ 'CollationKey', 'Collator', 'Collection',
+ 'Collections', 'Color',
+ 'ColorChooserComponentFactory', 'ColorChooserUI',
+ 'ColorConvertOp', 'ColorModel',
+ 'ColorSelectionModel', 'ColorSpace',
+ 'ColorUIResource', 'ComboBoxEditor', 'ComboBoxModel',
+ 'ComboBoxUI', 'ComboPopup', 'CommunicationException',
+ 'COMM_FAILURE', 'Comparable', 'Comparator',
+ 'Compiler', 'CompletionStatus',
+ 'CompletionStatusHelper', 'Component',
+ 'ComponentAdapter', 'ComponentColorModel',
+ 'ComponentEvent', 'ComponentInputMap',
+ 'ComponentInputMapUIResource', 'ComponentListener',
+ 'ComponentOrientation', 'ComponentSampleModel',
+ 'ComponentUI', 'ComponentView', 'Composite',
+ 'CompositeContext', 'CompositeName', 'CompositeView',
+ 'CompoundBorder', 'CompoundControl',
+ 'CompoundControl.Type', 'CompoundEdit',
+ 'CompoundName', 'ConcurrentModificationException',
+ 'ConfigurationException', 'ConnectException',
+ 'ConnectIOException', 'Connection', 'Constructor',
+ 'Container', 'ContainerAdapter', 'ContainerEvent',
+ 'ContainerListener', 'ContentHandler',
+ 'ContentHandlerFactory', 'ContentModel', 'Context',
+ 'ContextList', 'ContextNotEmptyException',
+ 'ContextualRenderedImageFactory', 'Control',
+ 'Control.Type', 'ControlFactory',
+ 'ControllerEventListener', 'ConvolveOp', 'CRC32',
+ 'CRL', 'CRLException', 'CropImageFilter', 'CSS',
+ 'CSS.Attribute', 'CTX_RESTRICT_SCOPE',
+ 'CubicCurve2D', 'CubicCurve2D.Double',
+ 'CubicCurve2D.Float', 'Current', 'CurrentHelper',
+ 'CurrentHolder', 'CurrentOperations', 'Cursor',
+ 'Customizer', 'CustomMarshal', 'CustomValue',
+ 'DatabaseMetaData', 'DataBuffer', 'DataBufferByte',
+ 'DataBufferInt', 'DataBufferShort',
+ 'DataBufferUShort', 'DataFlavor',
+ 'DataFormatException', 'DatagramPacket',
+ 'DatagramSocket', 'DatagramSocketImpl',
+ 'DatagramSocketImplFactory', 'DataInput',
+ 'DataInputStream', 'DataLine', 'DataLine.Info',
+ 'DataOutput', 'DataOutputStream', 'DataTruncation',
+ 'DATA_CONVERSION', 'Date', 'DateFormat',
+ 'DateFormatSymbols', 'DebugGraphics',
+ 'DecimalFormat', 'DecimalFormatSymbols',
+ 'DefaultBoundedRangeModel', 'DefaultButtonModel',
+ 'DefaultCaret', 'DefaultCellEditor',
+ 'DefaultColorSelectionModel', 'DefaultComboBoxModel',
+ 'DefaultDesktopManager', 'DefaultEditorKit',
+ 'DefaultEditorKit.BeepAction',
+ 'DefaultEditorKit.CopyAction',
+ 'DefaultEditorKit.CutAction',
+ 'DefaultEditorKit.DefaultKeyTypedAction',
+ 'DefaultEditorKit.InsertBreakAction',
+ 'DefaultEditorKit.InsertContentAction',
+ 'DefaultEditorKit.InsertTabAction',
+ 'DefaultEditorKit.PasteAction,',
+ 'DefaultFocusManager', 'DefaultHighlighter',
+ 'DefaultHighlighter.DefaultHighlightPainter',
+ 'DefaultListCellRenderer',
+ 'DefaultListCellRenderer.UIResource',
+ 'DefaultListModel', 'DefaultListSelectionModel',
+ 'DefaultMenuLayout', 'DefaultMetalTheme',
+ 'DefaultMutableTreeNode',
+ 'DefaultSingleSelectionModel',
+ 'DefaultStyledDocument',
+ 'DefaultStyledDocument.AttributeUndoableEdit',
+ 'DefaultStyledDocument.ElementSpec',
+ 'DefaultTableCellRenderer',
+ 'DefaultTableCellRenderer.UIResource',
+ 'DefaultTableColumnModel', 'DefaultTableModel',
+ 'DefaultTextUI', 'DefaultTreeCellEditor',
+ 'DefaultTreeCellRenderer', 'DefaultTreeModel',
+ 'DefaultTreeSelectionModel', 'DefinitionKind',
+ 'DefinitionKindHelper', 'Deflater',
+ 'DeflaterOutputStream', 'Delegate', 'DesignMode',
+ 'DesktopIconUI', 'DesktopManager', 'DesktopPaneUI',
+ 'DGC', 'Dialog', 'Dictionary', 'DigestException',
+ 'DigestInputStream', 'DigestOutputStream',
+ 'Dimension', 'Dimension2D', 'DimensionUIResource',
+ 'DirContext', 'DirectColorModel', 'DirectoryManager',
+ 'DirObjectFactory', 'DirStateFactory',
+ 'DirStateFactory.Result', 'DnDConstants', 'Document',
+ 'DocumentEvent', 'DocumentEvent.ElementChange',
+ 'DocumentEvent.EventType', 'DocumentListener',
+ 'DocumentParser', 'DomainCombiner', 'DomainManager',
+ 'DomainManagerOperations', 'Double', 'DoubleHolder',
+ 'DoubleSeqHelper', 'DoubleSeqHolder',
+ 'DragGestureEvent', 'DragGestureListener',
+ 'DragGestureRecognizer', 'DragSource',
+ 'DragSourceContext', 'DragSourceDragEvent',
+ 'DragSourceDropEvent', 'DragSourceEvent',
+ 'DragSourceListener', 'Driver', 'DriverManager',
+ 'DriverPropertyInfo', 'DropTarget',
+ 'DropTarget.DropTargetAutoScroller',
+ 'DropTargetContext', 'DropTargetDragEvent',
+ 'DropTargetDropEvent', 'DropTargetEvent',
+ 'DropTargetListener', 'DSAKey',
+ 'DSAKeyPairGenerator', 'DSAParameterSpec',
+ 'DSAParams', 'DSAPrivateKey', 'DSAPrivateKeySpec',
+ 'DSAPublicKey', 'DSAPublicKeySpec', 'DTD',
+ 'DTDConstants', 'DynamicImplementation', 'DynAny',
+ 'DynArray', 'DynEnum', 'DynFixed', 'DynSequence',
+ 'DynStruct', 'DynUnion', 'DynValue', 'EditorKit',
+ 'Element', 'ElementIterator', 'Ellipse2D',
+ 'Ellipse2D.Double', 'Ellipse2D.Float', 'EmptyBorder',
+ 'EmptyStackException', 'EncodedKeySpec', 'Entity',
+ 'EnumControl', 'EnumControl.Type', 'Enumeration',
+ 'Environment', 'EOFException', 'Error',
+ 'EtchedBorder', 'Event', 'EventContext',
+ 'EventDirContext', 'EventListener',
+ 'EventListenerList', 'EventObject', 'EventQueue',
+ 'EventSetDescriptor', 'Exception',
+ 'ExceptionInInitializerError', 'ExceptionList',
+ 'ExpandVetoException', 'ExportException',
+ 'ExtendedRequest', 'ExtendedResponse',
+ 'Externalizable', 'FeatureDescriptor', 'Field',
+ 'FieldNameHelper', 'FieldPosition', 'FieldView',
+ 'File', 'FileChooserUI', 'FileDescriptor',
+ 'FileDialog', 'FileFilter', 'FileInputStream',
+ 'FilenameFilter', 'FileNameMap',
+ 'FileNotFoundException', 'FileOutputStream',
+ 'FilePermission', 'FileReader', 'FileSystemView',
+ 'FileView', 'FileWriter', 'FilteredImageSource',
+ 'FilterInputStream', 'FilterOutputStream',
+ 'FilterReader', 'FilterWriter',
+ 'FixedHeightLayoutCache', 'FixedHolder',
+ 'FlatteningPathIterator', 'FlavorMap', 'Float',
+ 'FloatControl', 'FloatControl.Type', 'FloatHolder',
+ 'FloatSeqHelper', 'FloatSeqHolder', 'FlowLayout',
+ 'FlowView', 'FlowView.FlowStrategy', 'FocusAdapter',
+ 'FocusEvent', 'FocusListener', 'FocusManager',
+ 'Font', 'FontFormatException', 'FontMetrics',
+ 'FontRenderContext', 'FontUIResource', 'Format',
+ 'FormatConversionProvider', 'FormView', 'Frame',
+ 'FREE_MEM', 'GapContent', 'GeneralPath',
+ 'GeneralSecurityException', 'GlyphJustificationInfo',
+ 'GlyphMetrics', 'GlyphVector', 'GlyphView',
+ 'GlyphView.GlyphPainter', 'GradientPaint',
+ 'GraphicAttribute', 'Graphics', 'Graphics2D',
+ 'GraphicsConfigTemplate', 'GraphicsConfiguration',
+ 'GraphicsDevice', 'GraphicsEnvironment',
+ 'GrayFilter', 'GregorianCalendar',
+ 'GridBagConstraints', 'GridBagLayout', 'GridLayout',
+ 'Group', 'Guard', 'GuardedObject', 'GZIPInputStream',
+ 'GZIPOutputStream', 'HasControls', 'HashMap',
+ 'HashSet', 'Hashtable', 'HierarchyBoundsAdapter',
+ 'HierarchyBoundsListener', 'HierarchyEvent',
+ 'HierarchyListener', 'Highlighter',
+ 'Highlighter.Highlight',
+ 'Highlighter.HighlightPainter', 'HTML',
+ 'HTML.Attribute', 'HTML.Tag', 'HTML.UnknownTag',
+ 'HTMLDocument', 'HTMLDocument.Iterator',
+ 'HTMLEditorKit', 'HTMLEditorKit.HTMLFactory',
+ 'HTMLEditorKit.HTMLTextAction',
+ 'HTMLEditorKit.InsertHTMLTextAction',
+ 'HTMLEditorKit.LinkController',
+ 'HTMLEditorKit.Parser',
+ 'HTMLEditorKit.ParserCallback',
+ 'HTMLFrameHyperlinkEvent', 'HTMLWriter',
+ 'HttpURLConnection', 'HyperlinkEvent',
+ 'HyperlinkEvent.EventType', 'HyperlinkListener',
+ 'ICC_ColorSpace', 'ICC_Profile', 'ICC_ProfileGray',
+ 'ICC_ProfileRGB', 'Icon', 'IconUIResource',
+ 'IconView', 'IdentifierHelper', 'Identity',
+ 'IdentityScope', 'IDLEntity', 'IDLType',
+ 'IDLTypeHelper', 'IDLTypeOperations',
+ 'IllegalAccessError', 'IllegalAccessException',
+ 'IllegalArgumentException',
+ 'IllegalComponentStateException',
+ 'IllegalMonitorStateException',
+ 'IllegalPathStateException', 'IllegalStateException',
+ 'IllegalThreadStateException', 'Image',
+ 'ImageConsumer', 'ImageFilter',
+ 'ImageGraphicAttribute', 'ImageIcon',
+ 'ImageObserver', 'ImageProducer',
+ 'ImagingOpException', 'IMP_LIMIT',
+ 'IncompatibleClassChangeError',
+ 'InconsistentTypeCode', 'IndexColorModel',
+ 'IndexedPropertyDescriptor',
+ 'IndexOutOfBoundsException', 'IndirectionException',
+ 'InetAddress', 'Inflater', 'InflaterInputStream',
+ 'InheritableThreadLocal', 'InitialContext',
+ 'InitialContextFactory',
+ 'InitialContextFactoryBuilder', 'InitialDirContext',
+ 'INITIALIZE', 'Initializer', 'InitialLdapContext',
+ 'InlineView', 'InputContext', 'InputEvent',
+ 'InputMap', 'InputMapUIResource', 'InputMethod',
+ 'InputMethodContext', 'InputMethodDescriptor',
+ 'InputMethodEvent', 'InputMethodHighlight',
+ 'InputMethodListener', 'InputMethodRequests',
+ 'InputStream', 'InputStreamReader', 'InputSubset',
+ 'InputVerifier', 'Insets', 'InsetsUIResource',
+ 'InstantiationError', 'InstantiationException',
+ 'Instrument', 'InsufficientResourcesException',
+ 'Integer', 'INTERNAL', 'InternalError',
+ 'InternalFrameAdapter', 'InternalFrameEvent',
+ 'InternalFrameListener', 'InternalFrameUI',
+ 'InterruptedException', 'InterruptedIOException',
+ 'InterruptedNamingException', 'INTF_REPOS',
+ 'IntHolder', 'IntrospectionException',
+ 'Introspector', 'Invalid',
+ 'InvalidAlgorithmParameterException',
+ 'InvalidAttributeIdentifierException',
+ 'InvalidAttributesException',
+ 'InvalidAttributeValueException',
+ 'InvalidClassException',
+ 'InvalidDnDOperationException',
+ 'InvalidKeyException', 'InvalidKeySpecException',
+ 'InvalidMidiDataException', 'InvalidName',
+ 'InvalidNameException', 'InvalidNameHelper',
+ 'InvalidNameHolder', 'InvalidObjectException',
+ 'InvalidParameterException',
+ 'InvalidParameterSpecException',
+ 'InvalidSearchControlsException',
+ 'InvalidSearchFilterException', 'InvalidSeq',
+ 'InvalidTransactionException', 'InvalidValue',
+ 'INVALID_TRANSACTION', 'InvocationEvent',
+ 'InvocationHandler', 'InvocationTargetException',
+ 'InvokeHandler', 'INV_FLAG', 'INV_IDENT',
+ 'INV_OBJREF', 'INV_POLICY', 'IOException',
+ 'IRObject', 'IRObjectOperations', 'IstringHelper',
+ 'ItemEvent', 'ItemListener', 'ItemSelectable',
+ 'Iterator', 'JApplet', 'JarEntry', 'JarException',
+ 'JarFile', 'JarInputStream', 'JarOutputStream',
+ 'JarURLConnection', 'JButton', 'JCheckBox',
+ 'JCheckBoxMenuItem', 'JColorChooser', 'JComboBox',
+ 'JComboBox.KeySelectionManager', 'JComponent',
+ 'JDesktopPane', 'JDialog', 'JEditorPane',
+ 'JFileChooser', 'JFrame', 'JInternalFrame',
+ 'JInternalFrame.JDesktopIcon', 'JLabel',
+ 'JLayeredPane', 'JList', 'JMenu', 'JMenuBar',
+ 'JMenuItem', 'JobAttributes',
+ 'JobAttributes.DefaultSelectionType',
+ 'JobAttributes.DestinationType',
+ 'JobAttributes.DialogType',
+ 'JobAttributes.MultipleDocumentHandlingType',
+ 'JobAttributes.SidesType', 'JOptionPane', 'JPanel',
+ 'JPasswordField', 'JPopupMenu',
+ 'JPopupMenu.Separator', 'JProgressBar',
+ 'JRadioButton', 'JRadioButtonMenuItem', 'JRootPane',
+ 'JScrollBar', 'JScrollPane', 'JSeparator', 'JSlider',
+ 'JSplitPane', 'JTabbedPane', 'JTable',
+ 'JTableHeader', 'JTextArea', 'JTextComponent',
+ 'JTextComponent.KeyBinding', 'JTextField',
+ 'JTextPane', 'JToggleButton',
+ 'JToggleButton.ToggleButtonModel', 'JToolBar',
+ 'JToolBar.Separator', 'JToolTip', 'JTree',
+ 'JTree.DynamicUtilTreeNode',
+ 'JTree.EmptySelectionModel', 'JViewport', 'JWindow',
+ 'Kernel', 'Key', 'KeyAdapter', 'KeyEvent',
+ 'KeyException', 'KeyFactory', 'KeyFactorySpi',
+ 'KeyListener', 'KeyManagementException', 'Keymap',
+ 'KeyPair', 'KeyPairGenerator', 'KeyPairGeneratorSpi',
+ 'KeySpec', 'KeyStore', 'KeyStoreException',
+ 'KeyStoreSpi', 'KeyStroke', 'Label', 'LabelUI',
+ 'LabelView', 'LastOwnerException',
+ 'LayeredHighlighter',
+ 'LayeredHighlighter.LayerPainter', 'LayoutManager',
+ 'LayoutManager2', 'LayoutQueue', 'LdapContext',
+ 'LdapReferralException', 'Lease',
+ 'LimitExceededException', 'Line', 'Line.Info',
+ 'Line2D', 'Line2D.Double', 'Line2D.Float',
+ 'LineBorder', 'LineBreakMeasurer', 'LineEvent',
+ 'LineEvent.Type', 'LineListener', 'LineMetrics',
+ 'LineNumberInputStream', 'LineNumberReader',
+ 'LineUnavailableException', 'LinkageError',
+ 'LinkedList', 'LinkException', 'LinkLoopException',
+ 'LinkRef', 'List', 'ListCellRenderer',
+ 'ListDataEvent', 'ListDataListener', 'ListIterator',
+ 'ListModel', 'ListResourceBundle',
+ 'ListSelectionEvent', 'ListSelectionListener',
+ 'ListSelectionModel', 'ListUI', 'ListView',
+ 'LoaderHandler', 'Locale', 'LocateRegistry',
+ 'LogStream', 'Long', 'LongHolder',
+ 'LongLongSeqHelper', 'LongLongSeqHolder',
+ 'LongSeqHelper', 'LongSeqHolder', 'LookAndFeel',
+ 'LookupOp', 'LookupTable', 'MalformedLinkException',
+ 'MalformedURLException', 'Manifest', 'Map',
+ 'Map.Entry', 'MARSHAL', 'MarshalException',
+ 'MarshalledObject', 'Math', 'MatteBorder',
+ 'MediaTracker', 'Member', 'MemoryImageSource',
+ 'Menu', 'MenuBar', 'MenuBarUI', 'MenuComponent',
+ 'MenuContainer', 'MenuDragMouseEvent',
+ 'MenuDragMouseListener', 'MenuElement', 'MenuEvent',
+ 'MenuItem', 'MenuItemUI', 'MenuKeyEvent',
+ 'MenuKeyListener', 'MenuListener',
+ 'MenuSelectionManager', 'MenuShortcut',
+ 'MessageDigest', 'MessageDigestSpi', 'MessageFormat',
+ 'MetaEventListener', 'MetalBorders',
+ 'MetalBorders.ButtonBorder',
+ 'MetalBorders.Flush3DBorder',
+ 'MetalBorders.InternalFrameBorder',
+ 'MetalBorders.MenuBarBorder',
+ 'MetalBorders.MenuItemBorder',
+ 'MetalBorders.OptionDialogBorder',
+ 'MetalBorders.PaletteBorder',
+ 'MetalBorders.PopupMenuBorder',
+ 'MetalBorders.RolloverButtonBorder',
+ 'MetalBorders.ScrollPaneBorder',
+ 'MetalBorders.TableHeaderBorder',
+ 'MetalBorders.TextFieldBorder',
+ 'MetalBorders.ToggleButtonBorder',
+ 'MetalBorders.ToolBarBorder', 'MetalButtonUI',
+ 'MetalCheckBoxIcon', 'MetalCheckBoxUI',
+ 'MetalComboBoxButton', 'MetalComboBoxEditor',
+ 'MetalComboBoxEditor.UIResource',
+ 'MetalComboBoxIcon', 'MetalComboBoxUI',
+ 'MetalDesktopIconUI', 'MetalFileChooserUI',
+ 'MetalIconFactory', 'MetalIconFactory.FileIcon16',
+ 'MetalIconFactory.FolderIcon16',
+ 'MetalIconFactory.PaletteCloseIcon',
+ 'MetalIconFactory.TreeControlIcon',
+ 'MetalIconFactory.TreeFolderIcon',
+ 'MetalIconFactory.TreeLeafIcon',
+ 'MetalInternalFrameTitlePane',
+ 'MetalInternalFrameUI', 'MetalLabelUI',
+ 'MetalLookAndFeel', 'MetalPopupMenuSeparatorUI',
+ 'MetalProgressBarUI', 'MetalRadioButtonUI',
+ 'MetalScrollBarUI', 'MetalScrollButton',
+ 'MetalScrollPaneUI', 'MetalSeparatorUI',
+ 'MetalSliderUI', 'MetalSplitPaneUI',
+ 'MetalTabbedPaneUI', 'MetalTextFieldUI',
+ 'MetalTheme', 'MetalToggleButtonUI',
+ 'MetalToolBarUI', 'MetalToolTipUI', 'MetalTreeUI',
+ 'MetaMessage', 'Method', 'MethodDescriptor',
+ 'MidiChannel', 'MidiDevice', 'MidiDevice.Info',
+ 'MidiDeviceProvider', 'MidiEvent', 'MidiFileFormat',
+ 'MidiFileReader', 'MidiFileWriter', 'MidiMessage',
+ 'MidiSystem', 'MidiUnavailableException',
+ 'MimeTypeParseException', 'MinimalHTMLWriter',
+ 'MissingResourceException', 'Mixer', 'Mixer.Info',
+ 'MixerProvider', 'ModificationItem', 'Modifier',
+ 'MouseAdapter', 'MouseDragGestureRecognizer',
+ 'MouseEvent', 'MouseInputAdapter',
+ 'MouseInputListener', 'MouseListener',
+ 'MouseMotionAdapter', 'MouseMotionListener',
+ 'MultiButtonUI', 'MulticastSocket',
+ 'MultiColorChooserUI', 'MultiComboBoxUI',
+ 'MultiDesktopIconUI', 'MultiDesktopPaneUI',
+ 'MultiFileChooserUI', 'MultiInternalFrameUI',
+ 'MultiLabelUI', 'MultiListUI', 'MultiLookAndFeel',
+ 'MultiMenuBarUI', 'MultiMenuItemUI',
+ 'MultiOptionPaneUI', 'MultiPanelUI',
+ 'MultiPixelPackedSampleModel', 'MultipleMaster',
+ 'MultiPopupMenuUI', 'MultiProgressBarUI',
+ 'MultiScrollBarUI', 'MultiScrollPaneUI',
+ 'MultiSeparatorUI', 'MultiSliderUI',
+ 'MultiSplitPaneUI', 'MultiTabbedPaneUI',
+ 'MultiTableHeaderUI', 'MultiTableUI', 'MultiTextUI',
+ 'MultiToolBarUI', 'MultiToolTipUI', 'MultiTreeUI',
+ 'MultiViewportUI', 'MutableAttributeSet',
+ 'MutableComboBoxModel', 'MutableTreeNode', 'Name',
+ 'NameAlreadyBoundException', 'NameClassPair',
+ 'NameComponent', 'NameComponentHelper',
+ 'NameComponentHolder', 'NamedValue', 'NameHelper',
+ 'NameHolder', 'NameNotFoundException', 'NameParser',
+ 'NamespaceChangeListener', 'NameValuePair',
+ 'NameValuePairHelper', 'Naming', 'NamingContext',
+ 'NamingContextHelper', 'NamingContextHolder',
+ 'NamingContextOperations', 'NamingEnumeration',
+ 'NamingEvent', 'NamingException',
+ 'NamingExceptionEvent', 'NamingListener',
+ 'NamingManager', 'NamingSecurityException',
+ 'NegativeArraySizeException', 'NetPermission',
+ 'NoClassDefFoundError', 'NoInitialContextException',
+ 'NoninvertibleTransformException',
+ 'NoPermissionException', 'NoRouteToHostException',
+ 'NoSuchAlgorithmException',
+ 'NoSuchAttributeException', 'NoSuchElementException',
+ 'NoSuchFieldError', 'NoSuchFieldException',
+ 'NoSuchMethodError', 'NoSuchMethodException',
+ 'NoSuchObjectException', 'NoSuchProviderException',
+ 'NotActiveException', 'NotBoundException',
+ 'NotContextException', 'NotEmpty', 'NotEmptyHelper',
+ 'NotEmptyHolder', 'NotFound', 'NotFoundHelper',
+ 'NotFoundHolder', 'NotFoundReason',
+ 'NotFoundReasonHelper', 'NotFoundReasonHolder',
+ 'NotOwnerException', 'NotSerializableException',
+ 'NO_IMPLEMENT', 'NO_MEMORY', 'NO_PERMISSION',
+ 'NO_RESOURCES', 'NO_RESPONSE',
+ 'NullPointerException', 'Number', 'NumberFormat',
+ 'NumberFormatException', 'NVList', 'Object',
+ 'ObjectChangeListener', 'ObjectFactory',
+ 'ObjectFactoryBuilder', 'ObjectHelper',
+ 'ObjectHolder', 'ObjectImpl', 'ObjectInput',
+ 'ObjectInputStream', 'ObjectInputStream.GetField',
+ 'ObjectInputValidation', 'ObjectOutput',
+ 'ObjectOutputStream', 'ObjectOutputStream.PutField',
+ 'ObjectStreamClass', 'ObjectStreamConstants',
+ 'ObjectStreamException', 'ObjectStreamField',
+ 'ObjectView', 'OBJECT_NOT_EXIST', 'ObjID',
+ 'OBJ_ADAPTER', 'Observable', 'Observer',
+ 'OctetSeqHelper', 'OctetSeqHolder', 'OMGVMCID',
+ 'OpenType', 'Operation',
+ 'OperationNotSupportedException', 'Option',
+ 'OptionalDataException', 'OptionPaneUI', 'ORB',
+ 'OutOfMemoryError', 'OutputStream',
+ 'OutputStreamWriter', 'OverlayLayout', 'Owner',
+ 'Package', 'PackedColorModel', 'Pageable',
+ 'PageAttributes', 'PageAttributes.ColorType',
+ 'PageAttributes.MediaType',
+ 'PageAttributes.OrientationRequestedType',
+ 'PageAttributes.OriginType',
+ 'PageAttributes.PrintQualityType', 'PageFormat',
+ 'Paint', 'PaintContext', 'PaintEvent', 'Panel',
+ 'PanelUI', 'Paper', 'ParagraphView',
+ 'ParameterBlock', 'ParameterDescriptor',
+ 'ParseException', 'ParsePosition', 'Parser',
+ 'ParserDelegator', 'PartialResultException',
+ 'PasswordAuthentication', 'PasswordView', 'Patch',
+ 'PathIterator', 'Permission', 'PermissionCollection',
+ 'Permissions', 'PERSIST_STORE', 'PhantomReference',
+ 'PipedInputStream', 'PipedOutputStream',
+ 'PipedReader', 'PipedWriter', 'PixelGrabber',
+ 'PixelInterleavedSampleModel', 'PKCS8EncodedKeySpec',
+ 'PlainDocument', 'PlainView', 'Point', 'Point2D',
+ 'Point2D.Double', 'Point2D.Float', 'Policy',
+ 'PolicyError', 'PolicyHelper', 'PolicyHolder',
+ 'PolicyListHelper', 'PolicyListHolder',
+ 'PolicyOperations', 'PolicyTypeHelper', 'Polygon',
+ 'PopupMenu', 'PopupMenuEvent', 'PopupMenuListener',
+ 'PopupMenuUI', 'Port', 'Port.Info',
+ 'PortableRemoteObject',
+ 'PortableRemoteObjectDelegate', 'Position',
+ 'Position.Bias', 'PreparedStatement', 'Principal',
+ 'PrincipalHolder', 'Printable',
+ 'PrinterAbortException', 'PrinterException',
+ 'PrinterGraphics', 'PrinterIOException',
+ 'PrinterJob', 'PrintGraphics', 'PrintJob',
+ 'PrintStream', 'PrintWriter', 'PrivateKey',
+ 'PRIVATE_MEMBER', 'PrivilegedAction',
+ 'PrivilegedActionException',
+ 'PrivilegedExceptionAction', 'Process',
+ 'ProfileDataException', 'ProgressBarUI',
+ 'ProgressMonitor', 'ProgressMonitorInputStream',
+ 'Properties', 'PropertyChangeEvent',
+ 'PropertyChangeListener', 'PropertyChangeSupport',
+ 'PropertyDescriptor', 'PropertyEditor',
+ 'PropertyEditorManager', 'PropertyEditorSupport',
+ 'PropertyPermission', 'PropertyResourceBundle',
+ 'PropertyVetoException', 'ProtectionDomain',
+ 'ProtocolException', 'Provider', 'ProviderException',
+ 'Proxy', 'PublicKey', 'PUBLIC_MEMBER',
+ 'PushbackInputStream', 'PushbackReader',
+ 'QuadCurve2D', 'QuadCurve2D.Double',
+ 'QuadCurve2D.Float', 'Random', 'RandomAccessFile',
+ 'Raster', 'RasterFormatException', 'RasterOp',
+ 'Reader', 'Receiver', 'Rectangle', 'Rectangle2D',
+ 'Rectangle2D.Double', 'Rectangle2D.Float',
+ 'RectangularShape', 'Ref', 'RefAddr', 'Reference',
+ 'Referenceable', 'ReferenceQueue',
+ 'ReferralException', 'ReflectPermission', 'Registry',
+ 'RegistryHandler', 'RemarshalException', 'Remote',
+ 'RemoteCall', 'RemoteException', 'RemoteObject',
+ 'RemoteRef', 'RemoteServer', 'RemoteStub',
+ 'RenderableImage', 'RenderableImageOp',
+ 'RenderableImageProducer', 'RenderContext',
+ 'RenderedImage', 'RenderedImageFactory', 'Renderer',
+ 'RenderingHints', 'RenderingHints.Key',
+ 'RepaintManager', 'ReplicateScaleFilter',
+ 'Repository', 'RepositoryIdHelper', 'Request',
+ 'RescaleOp', 'Resolver', 'ResolveResult',
+ 'ResourceBundle', 'ResponseHandler', 'ResultSet',
+ 'ResultSetMetaData', 'ReverbType', 'RGBImageFilter',
+ 'RMIClassLoader', 'RMIClientSocketFactory',
+ 'RMIFailureHandler', 'RMISecurityException',
+ 'RMISecurityManager', 'RMIServerSocketFactory',
+ 'RMISocketFactory', 'Robot', 'RootPaneContainer',
+ 'RootPaneUI', 'RoundRectangle2D',
+ 'RoundRectangle2D.Double', 'RoundRectangle2D.Float',
+ 'RowMapper', 'RSAKey', 'RSAKeyGenParameterSpec',
+ 'RSAPrivateCrtKey', 'RSAPrivateCrtKeySpec',
+ 'RSAPrivateKey', 'RSAPrivateKeySpec', 'RSAPublicKey',
+ 'RSAPublicKeySpec', 'RTFEditorKit',
+ 'RuleBasedCollator', 'Runnable', 'Runtime',
+ 'RunTime', 'RuntimeException', 'RunTimeOperations',
+ 'RuntimePermission', 'SampleModel',
+ 'SchemaViolationException', 'Scrollable',
+ 'Scrollbar', 'ScrollBarUI', 'ScrollPane',
+ 'ScrollPaneConstants', 'ScrollPaneLayout',
+ 'ScrollPaneLayout.UIResource', 'ScrollPaneUI',
+ 'SearchControls', 'SearchResult',
+ 'SecureClassLoader', 'SecureRandom',
+ 'SecureRandomSpi', 'Security', 'SecurityException',
+ 'SecurityManager', 'SecurityPermission', 'Segment',
+ 'SeparatorUI', 'Sequence', 'SequenceInputStream',
+ 'Sequencer', 'Sequencer.SyncMode', 'Serializable',
+ 'SerializablePermission', 'ServantObject',
+ 'ServerCloneException', 'ServerError',
+ 'ServerException', 'ServerNotActiveException',
+ 'ServerRef', 'ServerRequest',
+ 'ServerRuntimeException', 'ServerSocket',
+ 'ServiceDetail', 'ServiceDetailHelper',
+ 'ServiceInformation', 'ServiceInformationHelper',
+ 'ServiceInformationHolder',
+ 'ServiceUnavailableException', 'Set',
+ 'SetOverrideType', 'SetOverrideTypeHelper', 'Shape',
+ 'ShapeGraphicAttribute', 'Short', 'ShortHolder',
+ 'ShortLookupTable', 'ShortMessage', 'ShortSeqHelper',
+ 'ShortSeqHolder', 'Signature', 'SignatureException',
+ 'SignatureSpi', 'SignedObject', 'Signer',
+ 'SimpleAttributeSet', 'SimpleBeanInfo',
+ 'SimpleDateFormat', 'SimpleTimeZone',
+ 'SinglePixelPackedSampleModel',
+ 'SingleSelectionModel', 'SizeLimitExceededException',
+ 'SizeRequirements', 'SizeSequence', 'Skeleton',
+ 'SkeletonMismatchException',
+ 'SkeletonNotFoundException', 'SliderUI', 'Socket',
+ 'SocketException', 'SocketImpl', 'SocketImplFactory',
+ 'SocketOptions', 'SocketPermission',
+ 'SocketSecurityException', 'SoftBevelBorder',
+ 'SoftReference', 'SortedMap', 'SortedSet',
+ 'Soundbank', 'SoundbankReader', 'SoundbankResource',
+ 'SourceDataLine', 'SplitPaneUI', 'SQLData',
+ 'SQLException', 'SQLInput', 'SQLOutput',
+ 'SQLPermission', 'SQLWarning', 'Stack',
+ 'StackOverflowError', 'StateEdit', 'StateEditable',
+ 'StateFactory', 'Statement', 'Streamable',
+ 'StreamableValue', 'StreamCorruptedException',
+ 'StreamTokenizer', 'StrictMath', 'String',
+ 'StringBuffer', 'StringBufferInputStream',
+ 'StringCharacterIterator', 'StringContent',
+ 'StringHolder', 'StringIndexOutOfBoundsException',
+ 'StringReader', 'StringRefAddr', 'StringSelection',
+ 'StringTokenizer', 'StringValueHelper',
+ 'StringWriter', 'Stroke', 'Struct', 'StructMember',
+ 'StructMemberHelper', 'Stub', 'StubDelegate',
+ 'StubNotFoundException', 'Style', 'StyleConstants',
+ 'StyleConstants.CharacterConstants',
+ 'StyleConstants.ColorConstants',
+ 'StyleConstants.FontConstants',
+ 'StyleConstants.ParagraphConstants', 'StyleContext',
+ 'StyledDocument', 'StyledEditorKit',
+ 'StyledEditorKit.AlignmentAction',
+ 'StyledEditorKit.BoldAction',
+ 'StyledEditorKit.FontFamilyAction',
+ 'StyledEditorKit.FontSizeAction',
+ 'StyledEditorKit.ForegroundAction',
+ 'StyledEditorKit.ItalicAction',
+ 'StyledEditorKit.StyledTextAction',
+ 'StyledEditorKit.UnderlineAction', 'StyleSheet',
+ 'StyleSheet.BoxPainter', 'StyleSheet.ListPainter',
+ 'SwingConstants', 'SwingPropertyChangeSupport',
+ 'SwingUtilities', 'SyncFailedException',
+ 'Synthesizer', 'SysexMessage', 'System',
+ 'SystemColor', 'SystemException', 'SystemFlavorMap',
+ 'TabableView', 'TabbedPaneUI', 'TabExpander',
+ 'TableCellEditor', 'TableCellRenderer',
+ 'TableColumn', 'TableColumnModel',
+ 'TableColumnModelEvent', 'TableColumnModelListener',
+ 'TableHeaderUI', 'TableModel', 'TableModelEvent',
+ 'TableModelListener', 'TableUI', 'TableView',
+ 'TabSet', 'TabStop', 'TagElement', 'TargetDataLine',
+ 'TCKind', 'TextAction', 'TextArea', 'TextAttribute',
+ 'TextComponent', 'TextEvent', 'TextField',
+ 'TextHitInfo', 'TextLayout',
+ 'TextLayout.CaretPolicy', 'TextListener',
+ 'TextMeasurer', 'TextUI', 'TexturePaint', 'Thread',
+ 'ThreadDeath', 'ThreadGroup', 'ThreadLocal',
+ 'Throwable', 'Tie', 'TileObserver', 'Time',
+ 'TimeLimitExceededException', 'Timer', 'TimerTask',
+ 'Timestamp', 'TimeZone', 'TitledBorder', 'ToolBarUI',
+ 'Toolkit', 'ToolTipManager', 'ToolTipUI',
+ 'TooManyListenersException', 'Track',
+ 'TransactionRequiredException',
+ 'TransactionRolledbackException',
+ 'TRANSACTION_REQUIRED', 'TRANSACTION_ROLLEDBACK',
+ 'Transferable', 'TransformAttribute', 'TRANSIENT',
+ 'Transmitter', 'Transparency', 'TreeCellEditor',
+ 'TreeCellRenderer', 'TreeExpansionEvent',
+ 'TreeExpansionListener', 'TreeMap', 'TreeModel',
+ 'TreeModelEvent', 'TreeModelListener', 'TreeNode',
+ 'TreePath', 'TreeSelectionEvent',
+ 'TreeSelectionListener', 'TreeSelectionModel',
+ 'TreeSet', 'TreeUI', 'TreeWillExpandListener',
+ 'TypeCode', 'TypeCodeHolder', 'TypeMismatch',
+ 'Types', 'UID', 'UIDefaults',
+ 'UIDefaults.ActiveValue', 'UIDefaults.LazyInputMap',
+ 'UIDefaults.LazyValue', 'UIDefaults.ProxyLazyValue',
+ 'UIManager', 'UIManager.LookAndFeelInfo',
+ 'UIResource', 'ULongLongSeqHelper',
+ 'ULongLongSeqHolder', 'ULongSeqHelper',
+ 'ULongSeqHolder', 'UndeclaredThrowableException',
+ 'UndoableEdit', 'UndoableEditEvent',
+ 'UndoableEditListener', 'UndoableEditSupport',
+ 'UndoManager', 'UnexpectedException',
+ 'UnicastRemoteObject', 'UnionMember',
+ 'UnionMemberHelper', 'UNKNOWN', 'UnknownError',
+ 'UnknownException', 'UnknownGroupException',
+ 'UnknownHostException', 'UnknownObjectException',
+ 'UnknownServiceException', 'UnknownUserException',
+ 'UnmarshalException', 'UnrecoverableKeyException',
+ 'Unreferenced', 'UnresolvedPermission',
+ 'UnsatisfiedLinkError', 'UnsolicitedNotification',
+ 'UnsolicitedNotificationEvent',
+ 'UnsolicitedNotificationListener',
+ 'UnsupportedAudioFileException',
+ 'UnsupportedClassVersionError',
+ 'UnsupportedEncodingException',
+ 'UnsupportedFlavorException',
+ 'UnsupportedLookAndFeelException',
+ 'UnsupportedOperationException',
+ 'UNSUPPORTED_POLICY', 'UNSUPPORTED_POLICY_VALUE',
+ 'URL', 'URLClassLoader', 'URLConnection',
+ 'URLDecoder', 'URLEncoder', 'URLStreamHandler',
+ 'URLStreamHandlerFactory', 'UserException',
+ 'UShortSeqHelper', 'UShortSeqHolder',
+ 'UTFDataFormatException', 'Util', 'UtilDelegate',
+ 'Utilities', 'ValueBase', 'ValueBaseHelper',
+ 'ValueBaseHolder', 'ValueFactory', 'ValueHandler',
+ 'ValueMember', 'ValueMemberHelper',
+ 'VariableHeightLayoutCache', 'Vector', 'VerifyError',
+ 'VersionSpecHelper', 'VetoableChangeListener',
+ 'VetoableChangeSupport', 'View', 'ViewFactory',
+ 'ViewportLayout', 'ViewportUI',
+ 'VirtualMachineError', 'Visibility',
+ 'VisibilityHelper', 'VMID', 'VM_ABSTRACT',
+ 'VM_CUSTOM', 'VM_NONE', 'VM_TRUNCATABLE',
+ 'VoiceStatus', 'Void', 'WCharSeqHelper',
+ 'WCharSeqHolder', 'WeakHashMap', 'WeakReference',
+ 'Window', 'WindowAdapter', 'WindowConstants',
+ 'WindowEvent', 'WindowListener', 'WrappedPlainView',
+ 'WritableRaster', 'WritableRenderedImage',
+ 'WriteAbortedException', 'Writer',
+ 'WrongTransaction', 'WStringValueHelper',
+ 'X509Certificate', 'X509CRL', 'X509CRLEntry',
+ 'X509EncodedKeySpec', 'X509Extension', 'ZipEntry',
+ 'ZipException', 'ZipFile', 'ZipInputStream',
+ 'ZipOutputStream', 'ZoneView',
+ '_BindingIteratorImplBase', '_BindingIteratorStub',
+ '_IDLTypeStub', '_NamingContextImplBase',
+ '_NamingContextStub', '_PolicyStub', '_Remote_Stub'
+ ),
+ 4 => array(
+ 'boolean', 'byte', 'char', 'double', 'float', 'int', 'long',
+ 'short', 'void'
+ ),
+ 5 => array(
+ 'allProperties', 'asImmutable', 'asSynchronized', 'collect',
+ 'count', 'each', 'eachProperty', 'eachPropertyName',
+ 'eachWithIndex', 'find', 'findAll', 'findIndexOf',
+ 'flatten', 'get', 'grep', 'inject', 'intersect',
+ 'join', 'max', 'min', 'pop', 'reverse',
+ 'reverseEach', 'size', 'sort', 'subMap', 'toList'
+ ),
+ 6 => array(
+ 'center', 'contains', 'eachMatch', 'padLeft', 'padRight',
+ 'toCharacter', 'tokenize', 'toLong', 'toURL'
+ ),
+ 7 => array(
+ 'append', 'eachByte', 'eachFile', 'eachFileRecurse', 'eachLine',
+ 'eachLines', 'encodeBase64', 'filterLine', 'getText',
+ 'splitEachLine', 'transformChar', 'transformLine',
+ 'withOutputStream', 'withPrintWriter', 'withReader',
+ 'withStream', 'withStreams', 'withWriter',
+ 'withWriterAppend', 'write', 'writeLine'
+ ),
+ 8 => array(
+ 'dump', 'getLastMatcher', 'inspect', 'invokeMethod', 'print',
+ 'println', 'start', 'startDaemon', 'step', 'times',
+ 'upto', 'use'
+ ),
+ 9 => array(
+ 'call', 'close', 'eachRow', 'execute', 'executeUpdate', 'Sql'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '*', '&', '%', '!', ';', '<', '>', '?', '|', '=',
+ '=>', '||', '-', '+', '<<', '<<<', '&&'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => false,
+ 2 => false,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ 9 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #aaaadd; font-weight: bold;',
+ 4 => 'color: #993333;',
+ 5 => 'color: #663399;',
+ 6 => 'color: #CC0099;',
+ 7 => 'color: #FFCC33;',
+ 8 => 'color: #993399;',
+ 9 => 'color: #993399; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1=> 'color: #808080; font-style: italic;',
+ 2=> 'color: #a1a100;',
+ 3=> 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000ff;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAMEL}',
+ 2 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAMEL}',
+ 3 => 'http://www.google.de/search?as_q={FNAME}&amp;num=100&amp;hl=en&amp;as_occt=url&amp;as_sitesearch=java.sun.com%2Fj2se%2F1%2E5%2E0%2Fdocs%2Fapi%2F',
+ 4 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAME}',
+ 5 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAME}',
+ 6 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAME}',
+ 7 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAME}',
+ 8 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAME}',
+ 9 => 'http://www.google.de/search?q=site%3Agroovy.codehaus.org/%20{FNAME}'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ //Variables
+ 0 => '\\$\\{[a-zA-Z_][a-zA-Z0-9_]*\\}'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gwbasic.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gwbasic.php
new file mode 100644
index 00000000..ecc16341
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/gwbasic.php
@@ -0,0 +1,153 @@
+<?php
+/*************************************************************************************
+ * gwbasic.php
+ * ----------
+ * Author: José Gabriel Moya Yangüela (josemoya@gmail.com)
+ * Copyright: (c) 2010 José Gabriel Moya Yangüela (http://doc.apagada.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/01/30
+ *
+ * GwBasic language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * REM was not classified as comment.
+ * APPEND and RANDOM missing.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'GwBasic',
+ 'COMMENT_SINGLE' => array(1 => "'", 2=> "REM"),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* Statements */
+ 1 => array('END','FOR','NEXT','DATA','INPUT','DIM','READ','LET',
+ 'GOTO','RUN','IF','RESTORE','GOSUB','RETURN','REM',
+ 'STOP','PRINT','CLEAR','LIST','NEW','ON','WAIT','DEF',
+ 'POKE','CONT','OUT','LPRINT','LLIST','WIDTH','ELSE',
+ 'TRON','TROFF','SWAP','ERASE','EDIT','ERROR','RESUME',
+ 'DELETE','AUTO','RENUM','DEFSTR','DEFINT','DEFSNG',
+ 'DEFDBL','LINE','WHILE','WEND','CALL','WRITE','OPTION',
+ 'RANDOMIZE','OPEN','CLOSE','LOAD','MERGE','SAVE',
+ 'COLOR','CLS','MOTOR','BSAVE','BLOAD','SOUND','BEEP',
+ 'PSET','PRESET','SCREEN','KEY','LOCATE','TO','THEN',
+ 'STEP','USR','FN','SPC','NOT','ERL','ERR','STRING',
+ 'USING','INSTR','VARPTR','CSRLIN','POINT','OFF',
+ 'FILES','FIELD','SYSTEM','NAME','LSET','RSET','KILL',
+ 'PUT','GET','RESET','COMMON','CHAIN','PAINT','COM',
+ 'CIRCLE','DRAW','PLAY','TIMER','IOCTL','CHDIR','MKDIR',
+ 'RMDIR','SHELL','VIEW','WINDOW','PMAP','PALETTE','LCOPY',
+ 'CALLS','PCOPY','LOCK','UNLOCK','RANDOM','APPEND',
+ ),
+ 2 => array(
+ /* Functions */
+ 'CVI','CVS','CVD','MKI','MKS','MKD','ENVIRON',
+ 'LEFT','RIGHT','MID','SGN','INT','ABS',
+ 'SQR','SIN','LOG','EXP','COS','TAN','ATN',
+ 'FRE','INP','POS','LEN','STR','VAL','ASC',
+ 'CHR','PEEK','SPACE','OCT','HEX','LPOS',
+ 'CINT','CSNG','CDBL','FIX','PEN','STICK',
+ 'STRIG','EOF','LOC','LOF'
+ ),
+ 3 => array(
+ /* alpha Operators */
+ 'AND','OR','XOR','EQV','IMP','MOD'
+ ),
+ 4 => array(
+ /* parameterless functions */
+ 'INKEY','DATE','TIME','ERDEV','RND'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '>','=','<','+','-','*','/','^','\\'
+ ),
+ 1 => array(
+ '?'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00a1a1;font-weight: bold',
+ 2 => 'color: #000066;font-weight: bold',
+ 3 => 'color: #00a166;font-weight: bold',
+ 4 => 'color: #0066a1;font-weight: bold'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080;',
+ 2 => 'color: #808080;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ /* Same as KEYWORDS[3] (and, or, not...) */
+ 0 => 'color: #00a166;font-weight: bold',
+ 1 => 'color: #00a1a1;font-weight: bold',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ 1 => 'color: #708090'
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 1 => '^[0-9]+ '
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haskell.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haskell.php
new file mode 100644
index 00000000..adae1116
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haskell.php
@@ -0,0 +1,202 @@
+<?php
+/*************************************************************************************
+ * haskell.php
+ * ----------
+ * Author: Jason Dagit (dagit@codersbase.com) based on ocaml.php by Flaie (fireflaie@gmail.com)
+ * Copyright: (c) 2005 Flaie, Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/08/27
+ *
+ * Haskell language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/08/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2005/08/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Haskell',
+ 'COMMENT_SINGLE' => array( 1 => '--'),
+ 'COMMENT_MULTI' => array('{-' => '-}'),
+ 'COMMENT_REGEXP' => array(
+ 2 => "/-->/",
+ 3 => "/{-(?:(?R)|.)-}/s", //Nested Comments
+ ),
+ 'CASE_KEYWORDS' => 0,
+ 'QUOTEMARKS' => array('"',"'"),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ /* main haskell keywords */
+ 1 => array(
+ 'as',
+ 'case', 'of', 'class', 'data', 'default',
+ 'deriving', 'do', 'forall', 'hiding', 'if', 'then',
+ 'else', 'import', 'infix', 'infixl', 'infixr',
+ 'instance', 'let', 'in', 'module', 'newtype',
+ 'qualified', 'type', 'where'
+ ),
+ /* define names of main librarys, so we can link to it */
+ 2 => array(
+ 'Foreign', 'Numeric', 'Prelude'
+ ),
+ /* just link to Prelude functions, cause it's the default opened library when starting Haskell */
+ 3 => array(
+ 'not', 'otherwise', 'maybe',
+ 'either', 'fst', 'snd', 'curry', 'uncurry',
+ 'compare',
+ 'max', 'min', 'succ', 'pred', 'toEnum', 'fromEnum',
+ 'enumFrom', 'enumFromThen', 'enumFromTo',
+ 'enumFromThenTo', 'minBound', 'maxBound',
+ 'negate', 'abs', 'signum',
+ 'fromInteger', 'toRational', 'quot', 'rem',
+ 'div', 'mod', 'quotRem', 'divMod', 'toInteger',
+ 'recip', 'fromRational', 'pi', 'exp',
+ 'log', 'sqrt', 'logBase', 'sin', 'cos',
+ 'tan', 'asin', 'acos', 'atan', 'sinh', 'cosh',
+ 'tanh', 'asinh', 'acosh', 'atanh',
+ 'properFraction', 'truncate', 'round', 'ceiling',
+ 'floor', 'floatRadix', 'floatDigits', 'floatRange',
+ 'decodeFloat', 'encodeFloat', 'exponent',
+ 'significand', 'scaleFloat', 'isNaN', 'isInfinite',
+ 'isDenomalized', 'isNegativeZero', 'isIEEE',
+ 'atan2', 'subtract', 'even', 'odd', 'gcd',
+ 'lcm', 'fromIntegral', 'realToFrac',
+ 'return', 'fail', 'fmap',
+ 'mapM', 'mapM_', 'sequence', 'sequence_',
+ 'id', 'const','flip',
+ 'until', 'asTypeOf', 'error', 'undefined',
+ 'seq','map','filter', 'head',
+ 'last', 'tail', 'init', 'null', 'length',
+ 'reverse', 'foldl', 'foldl1', 'foldr',
+ 'foldr1', 'and', 'or', 'any', 'all', 'sum',
+ 'product', 'concat', 'concatMap', 'maximum',
+ 'minimum', 'scanl', 'scanl1', 'scanr', 'scanr1',
+ 'iterate', 'repeat', 'cycle', 'take', 'drop',
+ 'splitAt', 'takeWhile', 'dropWhile', 'span',
+ 'break', 'elem', 'notElem', 'lookup', 'zip',
+ 'zip3', 'zipWith', 'zipWith3', 'unzip', 'unzip3',
+ 'lines', 'words', 'unlines',
+ 'unwords', 'showPrec', 'show', 'showList',
+ 'shows', 'showChar', 'showString', 'showParen',
+ 'readsPrec', 'readList', 'reads', 'readParen',
+ 'read', 'lex', 'putChar', 'putStr', 'putStrLn',
+ 'print', 'getChar', 'getLine', 'getContents',
+ 'interact', 'readFile', 'writeFile', 'appendFile',
+ 'readIO', 'readLn', 'ioError', 'userError', 'catch'
+ ),
+ /* here Prelude Types */
+ 4 => array (
+ 'Bool', 'Maybe', 'Either', 'Ord', 'Ordering',
+ 'Char', 'String', 'Eq', 'Enum', 'Bounded',
+ 'Int', 'Integer', 'Float', 'Double', 'Rational',
+ 'Num', 'Real', 'Integral', 'Fractional',
+ 'Floating', 'RealFrac', 'RealFloat', 'Monad',
+ 'Functor', 'Show', 'ShowS', 'Read', 'ReadS',
+ 'IO'
+ ),
+ /* finally Prelude Exceptions */
+ 5 => array (
+ 'IOError', 'IOException'
+ )
+ ),
+ /* highlighting symbols is really important in Haskell */
+ 'SYMBOLS' => array(
+ '|', '->', '<-', '@', '!', '::', '_', '~', '=', '?',
+ '&&', '||', '==', '/=', '<', '<=', '>',
+ '>=','+', '-', '*','/', '%', '**', '^', '^^',
+ '>>=', '>>', '=<<', '$', '.', ',', '$!',
+ '++', '!!'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true, /* functions name are case seinsitive */
+ 3 => true, /* types name too */
+ 4 => true, /* finally exceptions too */
+ 5 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #06c; font-weight: bold;', /* nice blue */
+ 2 => 'color: #06c; font-weight: bold;', /* blue as well */
+ 3 => 'font-weight: bold;', /* make the preduled functions bold */
+ 4 => 'color: #cccc00; font-weight: bold;', /* give types a different bg */
+ 5 => 'color: maroon;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #5d478b; font-style: italic;',
+ 2 => 'color: #339933; font-weight: bold;',
+ 3 => 'color: #5d478b; font-style: italic;', /* light purple */
+ 'MULTI' => 'color: #5d478b; font-style: italic;' /* light purple */
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'background-color: #3cb371; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: green;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'background-color: #3cb371;' /* nice green */
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: red;' /* pink */
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #060;' /* dark green */
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933; font-weight: bold;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ /* some of keywords are Prelude functions */
+ 1 => '',
+ /* link to the wanted library */
+ 2 => 'http://haskell.org/ghc/docs/latest/html/libraries/base/{FNAME}.html',
+ /* link to Prelude functions */
+ 3 => 'http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:{FNAME}',
+ /* link to Prelude types */
+ 4 => 'http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:{FNAME}',
+ /* link to Prelude exceptions */
+ 5 => 'http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#t:{FNAME}',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haxe.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haxe.php
new file mode 100644
index 00000000..778637e2
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haxe.php
@@ -0,0 +1,161 @@
+<?php
+/*************************************************************************************
+ * haxe.php
+ * --------
+ * Author: Andy Li (andy@onthewings.net)
+ * John Liao (colorhook@gmail.com)
+ * Copyright: (c) 2012 onthewings (http://www.onthewings.net/)
+ * 2010 colorhook (http://colorhook.com/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/10/05
+ *
+ * Haxe language file for GeSHi.
+ * Haxe version: 2.10
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Haxe',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Import and Package directives (Basic Support only)
+ 2 => '/(?:(?<=import[\\n\\s])|(?<=using[\\n\\s])|(?<=package[\\n\\s]))[\\n\\s]*([a-zA-Z0-9_]+\\.)*([a-zA-Z0-9_]+|\*)(?=[\n\s;])/i',
+ // Haxe comments
+ 3 => '#/\*\*(?![\*\/]).*\*/#sU',
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ //http://haxe.org/ref/keywords
+ 'break', 'callback', 'case', 'cast', 'catch', 'class', 'continue', 'default', 'do', 'dynamic',
+ 'else', 'enum', 'extends', 'extern', /*'false',*/ 'for', 'function', 'here', 'if',
+ 'implements', 'import', 'in', 'inline', 'interface', 'never', 'new', /*'null',*/ 'override',
+ 'package', 'private', 'public', 'return', 'static', 'super', 'switch', 'this', 'throw',
+ 'trace', /*'true',*/ 'try', 'typedef', 'untyped', 'using', 'var', 'while',
+ 'macro', '$type',
+ ),
+ 2 => array(
+ //primitive values
+ 'null', 'false', 'true',
+ ),
+ 3 => array(
+ //global types
+ 'Array', 'ArrayAccess', /*'Bool',*/ 'Class', 'Date', 'DateTools', 'Dynamic',
+ 'EReg', 'Enum', 'EnumValue', /*'Float',*/ 'Hash', /*'Int',*/ 'IntHash', 'IntIter',
+ 'Iterable', 'Iterator', 'Lambda', 'List', 'Math', 'Null', 'Reflect', 'Std',
+ /*'String',*/ 'StringBuf', 'StringTools', 'Sys', 'Type', /*'UInt',*/ 'ValueType',
+ /*'Void',*/ 'Xml', 'XmlType',
+ ),
+ 4 => array(
+ //primitive types
+ 'Void', 'Bool', 'Int', 'Float', 'UInt', 'String',
+ ),
+ 5 => array(
+ //compiler switches
+ "#if", "#elseif", "#else", "#end", "#error",
+ ),
+ ),
+ 'SYMBOLS' => array(
+ //http://haxe.org/manual/operators
+ '++', '--',
+ '%',
+ '*', '/',
+ '+', '-',
+ '<<', '>>', '>>>',
+ '|', '&', '^',
+ '==', '!=', '>', '>=', '<', '<=',
+ '...',
+ '&&',
+ '||',
+ '?', ':',
+ '=', '+=', '-=', '/=', '*=', '<<=', '>>=', '>>>=', '|=', '&=', '^=',
+ '(', ')', '[', ']', '{', '}', ';',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #6699cc; font-weight: bold;',
+ 2 => 'color: #000066; font-weight: bold;',
+ 3 => 'color: #03F; ',
+ 4 => 'color: #000033; font-weight: bold;',
+ 5 => 'color: #330000; font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #006699;',
+ 3 => 'color: #008000; font-style: italic; font-weight: bold;',
+ 3 => 'color: #008000; font-style: italic; font-weight: bold;',
+ 'MULTI' => 'color: #666666; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;',
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #FF0000;',
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006633;',
+ 2 => 'color: #006633;',
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;',
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/hicest.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/hicest.php
new file mode 100644
index 00000000..78a2bc20
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/hicest.php
@@ -0,0 +1,108 @@
+<?php
+/*************************************************************************************
+ * hicest.php
+ * --------
+ * Author: Georg Petrich (spt@hicest.com)
+ * Copyright: (c) 2010 Georg Petrich (http://www.HicEst.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/03/15
+ *
+ * HicEst language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * yyyy/mm/dd (v.v.v.v)
+ * - First Release
+ *
+ * TODO (updated yyyy/mm/dd)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'HicEst',
+ 'COMMENT_SINGLE' => array(1 => '!'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', '\''),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ '$cmd_line', 'abs', 'acos', 'alarm', 'alias', 'allocate', 'appendix', 'asin', 'atan', 'axis', 'beep',
+ 'call', 'ceiling', 'char', 'character', 'com', 'continue', 'cos', 'cosh', 'data', 'diffeq', 'dimension', 'dlg', 'dll',
+ 'do', 'edit', 'else', 'elseif', 'end', 'enddo', 'endif', 'exp', 'floor', 'function', 'fuz', 'goto', 'iand', 'ichar',
+ 'ieor', 'if', 'index', 'init', 'int', 'intpol', 'ior', 'key', 'len', 'len_trim', 'line', 'lock', 'log', 'max', 'maxloc',
+ 'min', 'minloc', 'mod', 'nint', 'not', 'open', 'pop', 'ran', 'read', 'real', 'return', 'rgb', 'roots', 'sign', 'sin',
+ 'sinh', 'solve', 'sort', 'subroutine', 'sum', 'system', 'tan', 'tanh', 'then', 'time', 'use', 'window', 'write', 'xeq'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(', ')', '+', '-', '*', '/', '=', '<', '>', '!', '^', ':', ','
+ ),
+ 2 => array(
+ '$', '$$'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #ff0000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;',
+ 2 => 'color: #ff0000;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(1 => ''),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/hq9plus.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/hq9plus.php
new file mode 100644
index 00000000..7ba1a73c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/hq9plus.php
@@ -0,0 +1,104 @@
+<?php
+/*************************************************************************************
+ * hq9plus.php
+ * ----------
+ * Author: Benny Baumann (BenBE@geshi.org)
+ * Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/10/31
+ *
+ * HQ9+ language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/10/31 (1.0.8.1)
+ * - First Release
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+$language_data = array (
+ 'LANG_NAME' => 'HQ9+',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 'H', 'Q', '9', '+', 'h', 'q'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ ),
+ 'COMMENTS' => array(
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #a16000;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'KEYWORDS' => GESHI_NEVER,
+ 'COMMENTS' => GESHI_NEVER,
+ 'STRINGS' => GESHI_NEVER,
+ 'REGEXPS' => GESHI_NEVER,
+ 'NUMBERS' => GESHI_NEVER
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/html4strict.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/html4strict.php
new file mode 100644
index 00000000..97392fa8
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/html4strict.php
@@ -0,0 +1,190 @@
+<?php
+/*************************************************************************************
+ * html4strict.php
+ * ---------------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/07/10
+ *
+ * HTML 4.01 strict language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/12/28 (1.0.4)
+ * - Removed escape character for strings
+ * 2004/11/27 (1.0.3)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.2)
+ * - Added support for URLs
+ * 2004/08/05 (1.0.1)
+ * - Added INS and DEL
+ * - Removed the background colour from tags' styles
+ * 2004/07/14 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ * * Check that only HTML4 strict attributes are highlighted
+ * * Eliminate empty tags that aren't allowed in HTML4 strict
+ * * Split to several files - html4trans, xhtml1 etc
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'HTML',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 2 => array(
+ 'a', 'abbr', 'acronym', 'address', 'applet', 'area',
+ 'base', 'basefont', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'b',
+ 'caption', 'center', 'cite', 'code', 'colgroup', 'col',
+ 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt',
+ 'em',
+ 'fieldset', 'font', 'form', 'frame', 'frameset',
+ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html',
+ 'iframe', 'ilayer', 'img', 'input', 'ins', 'isindex', 'i',
+ 'kbd',
+ 'label', 'legend', 'link', 'li',
+ 'map', 'meta',
+ 'noframes', 'noscript',
+ 'object', 'ol', 'optgroup', 'option',
+ 'param', 'pre', 'p',
+ 'q',
+ 'samp', 'script', 'select', 'small', 'span', 'strike', 'strong', 'style', 'sub', 'sup', 's',
+ 'table', 'tbody', 'td', 'textarea', 'text', 'tfoot', 'thead', 'th', 'title', 'tr', 'tt',
+ 'ul', 'u',
+ 'var',
+ ),
+ 3 => array(
+ 'abbr', 'accept-charset', 'accept', 'accesskey', 'action', 'align', 'alink', 'alt', 'archive', 'axis',
+ 'background', 'bgcolor', 'border',
+ 'cellpadding', 'cellspacing', 'char', 'charoff', 'charset', 'checked', 'cite', 'class', 'classid', 'clear', 'code', 'codebase', 'codetype', 'color', 'cols', 'colspan', 'compact', 'content', 'coords',
+ 'data', 'datetime', 'declare', 'defer', 'dir', 'disabled',
+ 'enctype',
+ 'face', 'for', 'frame', 'frameborder',
+ 'headers', 'height', 'href', 'hreflang', 'hspace', 'http-equiv',
+ 'id', 'ismap',
+ 'label', 'lang', 'language', 'link', 'longdesc',
+ 'marginheight', 'marginwidth', 'maxlength', 'media', 'method', 'multiple',
+ 'name', 'nohref', 'noresize', 'noshade', 'nowrap',
+ 'object', 'onblur', 'onchange', 'onclick', 'ondblclick', 'onfocus', 'onkeydown', 'onkeypress', 'onkeyup', 'onload', 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onreset', 'onselect', 'onsubmit', 'onunload',
+ 'profile', 'prompt',
+ 'readonly', 'rel', 'rev', 'rowspan', 'rows', 'rules',
+ 'scheme', 'scope', 'scrolling', 'selected', 'shape', 'size', 'span', 'src', 'standby', 'start', 'style', 'summary',
+ 'tabindex', 'target', 'text', 'title', 'type',
+ 'usemap',
+ 'valign', 'value', 'valuetype', 'version', 'vlink', 'vspace',
+ 'width'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '/', '='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SCRIPT' => array(
+ -2 => 'color: #404040;', // CDATA
+ -1 => 'color: #808080; font-style: italic;', // comments
+ 0 => 'color: #00bbdd;',
+ 1 => 'color: #ddbb00;',
+ 2 => 'color: #009900;'
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 2 => 'http://december.com/html/4/element/{FNAMEL}.html',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_ALWAYS,
+ 'SCRIPT_DELIMITERS' => array(
+ -2 => array(
+ '<![CDATA[' => ']]>'
+ ),
+ -1 => array(
+ '<!--' => '-->'
+ ),
+ 0 => array(
+ '<!DOCTYPE' => '>'
+ ),
+ 1 => array(
+ '&' => ';'
+ ),
+ 2 => array(
+ '<' => '>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ -2 => false,
+ -1 => false,
+ 0 => false,
+ 1 => false,
+ 2 => true
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 2 => array(
+ 'DISALLOWED_BEFORE' => '(?<=&lt;|&lt;\/)',
+ 'DISALLOWED_AFTER' => '(?=\s|\/|&gt;)',
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/html5.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/html5.php
new file mode 100644
index 00000000..0d975594
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/html5.php
@@ -0,0 +1,212 @@
+<?php
+/*************************************************************************************
+ * html5.php
+ * ---------------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/07/10
+ *
+ * HTML 5 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/12/28 (1.0.4)
+ * - Removed escape character for strings
+ * 2004/11/27 (1.0.3)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.2)
+ * - Added support for URLs
+ * 2004/08/05 (1.0.1)
+ * - Added INS and DEL
+ * - Removed the background colour from tags' styles
+ * 2004/07/14 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ * * Check that only HTML4 strict attributes are highlighted
+ * * Eliminate empty tags that aren't allowed in HTML4 strict
+ * * Split to several files - html4trans, xhtml1 etc
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'HTML5',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 2 => array(
+ 'a', 'abbr', 'address', 'article', 'area', 'aside', 'audio',
+
+ 'base', 'bdo', 'blockquote', 'body', 'br', 'button', 'b',
+
+ 'caption', 'cite', 'code', 'colgroup', 'col', 'canvas', 'command', 'datalist', 'details',
+
+ 'dd', 'del', 'dfn', 'div', 'dl', 'dt',
+
+ 'em', 'embed',
+
+ 'fieldset', 'form', 'figcaption', 'figure', 'footer',
+
+ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html', 'header', 'hgroup',
+
+ 'iframe', 'ilayer', 'img', 'input', 'ins', 'isindex', 'i',
+
+ 'kbd', 'keygen',
+
+ 'label', 'legend', 'link', 'li',
+
+ 'map', 'meta', 'mark', 'meter',
+
+ 'noscript', 'nav',
+
+ 'object', 'ol', 'optgroup', 'option', 'output',
+
+ 'param', 'pre', 'p', 'progress',
+
+ 'q',
+
+ 'rp', 'rt', 'ruby',
+
+ 'samp', 'script', 'select', 'small', 'span', 'strong', 'style', 'sub', 'sup', 's', 'section', 'source', 'summary',
+
+ 'table', 'tbody', 'td', 'textarea', 'text', 'tfoot', 'thead', 'th', 'title', 'tr', 'time',
+
+ 'ul',
+
+ 'var', 'video',
+
+ 'wbr',
+ ),
+ 3 => array(
+ 'abbr', 'accept-charset', 'accept', 'accesskey', 'action', 'align', 'alink', 'alt', 'archive', 'axis', 'autocomplete', 'autofocus',
+ 'background', 'bgcolor', 'border',
+ 'cellpadding', 'cellspacing', 'char', 'charoff', 'charset', 'checked', 'cite', 'class', 'classid', 'clear', 'code', 'codebase', 'codetype', 'color', 'cols', 'colspan', 'compact', 'content', 'coords', 'contenteditable', 'contextmenu',
+ 'data', 'datetime', 'declare', 'defer', 'dir', 'disabled', 'draggable', 'dropzone',
+ 'enctype',
+ 'face', 'for', 'frame', 'frameborder', 'form', 'formaction', 'formenctype', 'formmethod', 'formnovalidate', 'formtarget',
+ 'headers', 'height', 'href', 'hreflang', 'hspace', 'http-equiv', 'hidden',
+ 'id', 'ismap',
+ 'label', 'lang', 'language', 'link', 'longdesc',
+ 'marginheight', 'marginwidth', 'maxlength', 'media', 'method', 'multiple', 'min', 'max',
+ 'name', 'nohref', 'noresize', 'noshade', 'nowrap', 'novalidate',
+ 'object', 'onblur', 'onchange', 'onclick', 'ondblclick', 'onfocus', 'onkeydown', 'onkeypress', 'onkeyup', 'onload', 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onselect', 'onsubmit', 'onunload', 'onafterprint', 'onbeforeprint', 'onbeforeonload', 'onerror', 'onhaschange', 'onmessage', 'onoffline', 'ononline', 'onpagehide', 'onpageshow', 'onpopstate', 'onredo', 'onresize', 'onstorage', 'onundo', 'oncontextmenu', 'onformchange', 'onforminput', 'oninput', 'oninvalid', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onmousewheel', 'onscroll', 'oncanplay', 'oncanplaythrough', 'ondurationchange', 'onemptied', 'onended', 'onloadeddata', 'onloadedmetadata', 'onloadstart', 'onpause', 'onplay', 'onplaying', 'onprogress', 'onratechange', 'onreadystatechange', 'onseeked', 'onseeking', 'onstalled', 'onsuspend', 'ontimeupdate', 'onvolumechange', 'onwaiting',
+ 'profile', 'prompt', 'pattern', 'placeholder',
+ 'readonly', 'rel', 'rev', 'rowspan', 'rows', 'rules', 'required',
+ 'scheme', 'scope', 'scrolling', 'selected', 'shape', 'size', 'span', 'src', 'standby', 'start', 'style', 'summary', 'spellcheck', 'step',
+ 'tabindex', 'target', 'text', 'title', 'type',
+ 'usemap',
+ 'valign', 'value', 'valuetype', 'version', 'vlink', 'vspace',
+ 'width'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '/', '='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SCRIPT' => array(
+ -2 => 'color: #404040;', // CDATA
+ -1 => 'color: #808080; font-style: italic;', // comments
+ 0 => 'color: #00bbdd;',
+ 1 => 'color: #ddbb00;',
+ 2 => 'color: #009900;'
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 2 => 'http://december.com/html/4/element/{FNAMEL}.html',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_ALWAYS,
+ 'SCRIPT_DELIMITERS' => array(
+ -2 => array(
+ '<![CDATA[' => ']]>'
+ ),
+ -1 => array(
+ '<!--' => '-->'
+ ),
+ 0 => array(
+ '<!DOCTYPE' => '>'
+ ),
+ 1 => array(
+ '&' => ';'
+ ),
+ 2 => array(
+ '<' => '>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ -2 => false,
+ -1 => false,
+ 0 => false,
+ 1 => false,
+ 2 => true
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 2 => array(
+ 'DISALLOWED_BEFORE' => '(?<=&lt;|&lt;\/)',
+ 'DISALLOWED_AFTER' => '(?=\s|\/|&gt;)',
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/icon.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/icon.php
new file mode 100644
index 00000000..06383ea5
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/icon.php
@@ -0,0 +1,212 @@
+<?php
+/*************************************************************************************
+ * icon.php
+ * --------
+ * Author: Matt Oates (mattoates@gmail.com)
+ * Copyright: (c) 2010 Matt Oates (http://mattoates.co.uk)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/04/24
+ *
+ * Icon language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/04/24 (0.0.0.2)
+ * - Validated with Geshi langcheck.php FAILED due to preprocessor keywords looking like symbols
+ * - Hard wrapped to improve readability
+ * 2010/04/20 (0.0.0.1)
+ * - First Release
+ *
+ * TODO (updated 2010/04/20)
+ * -------------------------
+ * - Do the &amp; need replacing with &?
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Icon',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', '\''),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'break', 'case', 'continue', 'create', 'default', 'do', 'else',
+ 'end', 'every', 'fail', 'for', 'if', 'import', 'initial',
+ 'initially', 'invocable', 'link', 'next', 'not', 'of', 'package',
+ 'procedure', 'record', 'repeat', 'return', 'switch', 'suspend',
+ 'then', 'to', 'until', 'while'
+ ),
+ 2 => array(
+ 'global', 'local', 'static'
+ ),
+ 3 => array(
+ 'allocated', 'ascii', 'clock', 'collections',
+ 'column', 'cset', 'current', 'date', 'dateline', 'digits',
+ 'dump', 'e', 'error', 'errornumber', 'errortext',
+ 'errorvalue', 'errout', 'eventcode', 'eventsource', 'eventvalue',
+ 'fail', 'features', 'file', 'host', 'input', 'lcase',
+ 'letters', 'level', 'line', 'main', 'now', 'null',
+ 'output', 'phi', 'pi', 'pos', 'progname', 'random',
+ 'regions', 'source', 'storage', 'subject', 'syserr', 'time',
+ 'trace', 'ucase', 'version', 'col', 'control', 'interval',
+ 'ldrag', 'lpress', 'lrelease', 'mdrag', 'meta', 'mpress',
+ 'mrelease', 'rdrag', 'resize', 'row', 'rpress', 'rrelease',
+ 'shift', 'window', 'x', 'y'
+ ),
+ 4 => array(
+ 'abs', 'acos', 'any', 'args', 'asin', 'atan', 'bal', 'center', 'char',
+ 'chmod', 'close', 'cofail', 'collect', 'copy', 'cos', 'cset', 'ctime', 'delay', 'delete',
+ 'detab', 'display', 'dtor', 'entab', 'errorclear', 'event', 'eventmask', 'EvGet', 'exit',
+ 'exp', 'fetch', 'fieldnames', 'find', 'flock', 'flush', 'function', 'get', 'getch',
+ 'getche', 'getenv', 'gettimeofday', 'globalnames', 'gtime', 'iand', 'icom', 'image',
+ 'insert', 'integer', 'ior', 'ishift', 'ixor', 'key', 'left', 'list', 'load', 'loadfunc',
+ 'localnames', 'log', 'many', 'map', 'match', 'member', 'mkdir', 'move', 'name', 'numeric',
+ 'open', 'opmask', 'ord', 'paramnames', 'parent', 'pipe', 'pop', 'pos', 'proc', 'pull',
+ 'push', 'put', 'read', 'reads', 'real', 'receive', 'remove', 'rename', 'repl', 'reverse',
+ 'right', 'rmdir', 'rtod', 'runerr', 'seek', 'select', 'send', 'seq', 'serial', 'set',
+ 'setenv', 'sort', 'sortf', 'sql', 'sqrt', 'stat', 'stop', 'string', 'system', 'tab',
+ 'table', 'tan', 'trap', 'trim', 'truncate', 'type', 'upto', 'utime', 'variable', 'where',
+ 'write', 'writes'
+ ),
+ 5 => array(
+ 'Active', 'Alert', 'Bg', 'Clip', 'Clone', 'Color', 'ColorValue',
+ 'CopyArea', 'Couple', 'DrawArc', 'DrawCircle', 'DrawCurve', 'DrawCylinder', 'DrawDisk',
+ 'DrawImage', 'DrawLine', 'DrawPoint', 'DrawPolygon', 'DrawRectangle', 'DrawSegment',
+ 'DrawSphere', 'DrawString', 'DrawTorus', 'EraseArea', 'Event', 'Fg', 'FillArc',
+ 'FillCircle', 'FillPolygon', 'FillRectangle', 'Font', 'FreeColor', 'GotoRC', 'GotoXY',
+ 'IdentifyMatrix', 'Lower', 'MatrixMode', 'NewColor', 'PaletteChars', 'PaletteColor',
+ 'PaletteKey', 'Pattern', 'Pending', 'Pixel', 'PopMatrix', 'PushMatrix', 'PushRotate',
+ 'PushScale', 'PushTranslate', 'QueryPointer', 'Raise', 'ReadImage', 'Refresh', 'Rotate',
+ 'Scale', 'Texcoord', 'TextWidth', 'Texture', 'Translate', 'Uncouple', 'WAttrib',
+ 'WDefault', 'WFlush', 'WindowContents', 'WriteImage', 'WSync'
+ ),
+ 6 => array(
+ 'define', 'include', 'ifdef', 'ifndef', 'else', 'endif', 'error',
+ 'line', 'undef'
+ ),
+ 7 => array(
+ '_V9', '_AMIGA', '_ACORN', '_CMS', '_MACINTOSH', '_MSDOS_386',
+ '_MS_WINDOWS_NT', '_MSDOS', '_MVS', '_OS2', '_POR', 'T', '_UNIX', '_POSIX', '_DBM',
+ '_VMS', '_ASCII', '_EBCDIC', '_CO_EXPRESSIONS', '_CONSOLE_WINDOW', '_DYNAMIC_LOADING',
+ '_EVENT_MONITOR', '_EXTERNAL_FUNCTIONS', '_KEYBOARD_FUNCTIONS', '_LARGE_INTEGERS',
+ '_MULTITASKING', '_PIPES', '_RECORD_IO', '_SYSTEM_FUNCTION', '_MESSAGING', '_GRAPHICS',
+ '_X_WINDOW_SYSTEM', '_MS_WINDOWS', '_WIN32', '_PRESENTATION_MGR', '_ARM_FUNCTIONS',
+ '_DOS_FUNCTIONS'
+ ),
+ 8 => array(
+ 'line'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(', ')', '{', '}', '[', ']', '+', '-', '*', '/', '\\', '%', '=', '<', '>', '!', '^',
+ '&', '|', '?', ':', ';', ',', '.', '~', '@'
+ ),
+ 2 => array(
+ '$(', '$)', '$<', '$>', '$'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #b1b100;',
+ 3 => 'color: #b1b100;',
+ 4 => 'color: #b1b100;',
+ 5 => 'color: #b1b100;',
+ 6 => 'color: #b1b100;',
+ 7 => 'color: #b1b100;',
+ 8 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;',
+ 2 => 'color: #b1b100;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(1 => '.'),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 3 => array(
+ 'DISALLOWED_BEFORE' => '(?<=&amp;)'
+ ),
+ 4 => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9_\"\'])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_\"\'])"
+ ),
+ 6 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\$)'
+ ),
+ 8 => array(
+ 'DISALLOWED_BEFORE' => '(?<=#)'
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/idl.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/idl.php
new file mode 100644
index 00000000..69bd14ff
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/idl.php
@@ -0,0 +1,123 @@
+<?php
+/*************************************************************************************
+ * idl.php
+ * -------
+ * Author: Cedric Bosdonnat (cedricbosdo@openoffice.org)
+ * Copyright: (c) 2006 Cedric Bosdonnat
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/08/20
+ *
+ * Unoidl language file for GeSHi.
+ *
+ * 2006/08/20 (1.0.0)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+
+$language_data = array (
+ 'LANG_NAME' => 'Uno Idl',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'published', 'get', 'set', 'service', 'singleton', 'type', 'module', 'interface', 'struct',
+ 'const', 'constants', 'exception', 'enum', 'raises', 'typedef'
+ ),
+ 2 => array(
+ 'bound', 'maybeambiguous', 'maybedefault', 'maybevoid', 'oneway', 'optional',
+ 'readonly', 'in', 'out', 'inout', 'attribute', 'transient', 'removable'
+ ),
+ 3 => array(
+ 'True', 'False', 'TRUE', 'FALSE'
+ ),
+ 4 => array(
+ 'string', 'long', 'byte', 'hyper', 'boolean', 'any', 'char', 'double',
+ 'void', 'sequence', 'unsigned'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '=', '+', '-', '*', '/', '!', '%', '^', '&', ':', ';', '...'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #990078; font-weight: bold',
+ 2 => 'color: #36dd1c;',
+ 3 => 'color: #990078; font-weight: bold',
+ 4 => 'color: #0000ec;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #3f7f5f;',
+ 2 => 'color: #808080;',
+ 'MULTI' => 'color: #4080ff; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #666666; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #808080;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '::'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ini.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ini.php
new file mode 100644
index 00000000..8e6ca76d
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ini.php
@@ -0,0 +1,128 @@
+<?php
+/*************************************************************************************
+ * ini.php
+ * --------
+ * Author: deguix (cevo_deguix@yahoo.com.br)
+ * Copyright: (c) 2005 deguix
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/03/27
+ *
+ * INI language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2005/12/28 (1.0.1)
+ * - Removed unnecessary keyword style index
+ * - Added support for " strings
+ * 2005/04/05 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2005/03/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'INI',
+ 'COMMENT_SINGLE' => array(0 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ ),
+ 'SYMBOLS' => array(
+ '[', ']', '='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => ''
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #933;'
+ ),
+ 'NUMBERS' => array(
+ 0 => ''
+ ),
+ 'METHODS' => array(
+ 0 => ''
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066; font-weight:bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #000066; font-weight:bold;',
+ 1 => 'color: #000099;',
+ 2 => 'color: #660066;'
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Section names
+ 0 => '\[.+\]',
+ //Entry names
+ 1 => array(
+ GESHI_SEARCH => '^(\s*)([a-zA-Z0-9_\-]+)(\s*=)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+ //Entry values
+ 2 => array(
+ // Evil hackery to get around GeSHi bug: <>" and ; are added so <span>s can be matched
+ // Explicit match on variable names because if a comment is before the first < of the span
+ // gets chewed up...
+ GESHI_SEARCH => '([<>";a-zA-Z0-9_]+\s*)=(.*)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1=',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/inno.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/inno.php
new file mode 100644
index 00000000..1e2ee8be
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/inno.php
@@ -0,0 +1,212 @@
+<?php
+/*************************************************************************************
+ * Inno.php
+ * ----------
+ * Author: Thomas Klingler (hotline@theratech.de) based on delphi.php from J�rja Norbert (jnorbi@vipmail.hu)
+ * Copyright: (c) 2004 J�rja Norbert, Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/07/29
+ *
+ * Inno Script language inkl. Delphi (Object Pascal) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/09/03
+ * - First Release
+ *
+ * TODO (updated 2005/07/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Inno',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('(*' => '*)'),
+ 'CASE_KEYWORDS' => 0,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'Setup','Types','Components','Tasks','Dirs','Files','Icons','INI',
+ 'InstallDelete','Languages','Messages','CustomMessage',
+ 'LangOptions','Registry','RUN','UninstallDelete','UninstallRun',
+ 'app','win','sys','syswow64','src','sd','pf','pf32','pf64','cf',
+ 'cf32','cf64','tmp','fonts','dao','group','localappdata','sendto',
+ 'userappdata','commonappdata','userdesktop','commondesktop',
+ 'userdocs','commondocs','userfavorites','commonfavorites',
+ 'userprograms','commonprograms','userstartmenu','commonstartmenu',
+ 'userstartup','commonstartup','usertemplates','commontemplates'
+ ),
+ 2 => array(
+ 'nil', 'false', 'true', 'var', 'type', 'const','And', 'Array', 'As', 'Begin', 'Case', 'Class', 'Constructor', 'Destructor', 'Div', 'Do', 'DownTo', 'Else',
+ 'End', 'Except', 'File', 'Finally', 'For', 'Function', 'Goto', 'If', 'Implementation', 'In', 'Inherited', 'Interface',
+ 'Is', 'Mod', 'Not', 'Object', 'Of', 'On', 'Or', 'Packed', 'Procedure', 'Property', 'Raise', 'Record',
+ 'Repeat', 'Set', 'Shl', 'Shr', 'Then', 'ThreadVar', 'To', 'Try', 'Unit', 'Until', 'Uses', 'While', 'With', 'Xor',
+
+ 'HKCC','HKCR','HKCU','HKLM','HKU','alwaysoverwrite','alwaysskipifsameorolder','append',
+ 'binary','classic','closeonexit','comparetimestamp','confirmoverwrite',
+ 'createkeyifdoesntexist','createonlyiffileexists','createvalueifdoesntexist',
+ 'deleteafterinstall','deletekey','deletevalue','dirifempty','dontcloseonexit',
+ 'dontcopy','dontcreatekey','disablenouninstallwarning','dword','exclusive','expandsz',
+ 'external','files','filesandordirs','fixed','fontisnttruetype','ignoreversion','iscustom','isreadme',
+ 'modern','multisz','new','noerror','none','normal','nowait','onlyifdestfileexists',
+ 'onlyifdoesntexist','onlyifnewer','overwrite','overwritereadonly','postinstall',
+ 'preservestringtype','promptifolder','regserver','regtypelib','restart','restartreplace',
+ 'runhidden','runmaximized','runminimized','sharedfile','shellexec','showcheckbox',
+ 'skipifnotsilent','skipifsilent','silent','skipifdoesntexist',
+ 'skipifsourcedoesntexist','sortfilesbyextension','unchecked','uninsalwaysuninstall',
+ 'uninsclearvalue','uninsdeleteentry','uninsdeletekey','uninsdeletekeyifempty',
+ 'uninsdeletesection','uninsdeletesectionifempty','uninsdeletevalue',
+ 'uninsneveruninstall','useapppaths','verysilent','waituntilidle'
+ ),
+ 3 => array(
+ 'Abs', 'Addr', 'AnsiCompareStr', 'AnsiCompareText', 'AnsiContainsStr', 'AnsiEndsStr', 'AnsiIndexStr', 'AnsiLeftStr',
+ 'AnsiLowerCase', 'AnsiMatchStr', 'AnsiMidStr', 'AnsiPos', 'AnsiReplaceStr', 'AnsiReverseString', 'AnsiRightStr',
+ 'AnsiStartsStr', 'AnsiUpperCase', 'ArcCos', 'ArcSin', 'ArcTan', 'Assigned', 'BeginThread', 'Bounds', 'CelsiusToFahrenheit',
+ 'ChangeFileExt', 'Chr', 'CompareStr', 'CompareText', 'Concat', 'Convert', 'Copy', 'Cos', 'CreateDir', 'CurrToStr',
+ 'CurrToStrF', 'Date', 'DateTimeToFileDate', 'DateTimeToStr', 'DateToStr', 'DayOfTheMonth', 'DayOfTheWeek', 'DayOfTheYear',
+ 'DayOfWeek', 'DaysBetween', 'DaysInAMonth', 'DaysInAYear', 'DaySpan', 'DegToRad', 'DeleteFile', 'DiskFree', 'DiskSize',
+ 'DupeString', 'EncodeDate', 'EncodeDateTime', 'EncodeTime', 'EndOfADay', 'EndOfAMonth', 'Eof', 'Eoln', 'Exp', 'ExtractFileDir',
+ 'ExtractFileDrive', 'ExtractFileExt', 'ExtractFileName', 'ExtractFilePath', 'FahrenheitToCelsius', 'FileAge',
+ 'FileDateToDateTime', 'FileExists', 'FilePos', 'FileSearch', 'FileSetDate', 'FileSize', 'FindClose', 'FindCmdLineSwitch',
+ 'FindFirst', 'FindNext', 'FloatToStr', 'FloatToStrF', 'Format', 'FormatCurr', 'FormatDateTime', 'FormatFloat', 'Frac',
+ 'GetCurrentDir', 'GetLastError', 'GetMem', 'High', 'IncDay', 'IncMinute', 'IncMonth', 'IncYear', 'InputBox',
+ 'InputQuery', 'Int', 'IntToHex', 'IntToStr', 'IOResult', 'IsInfinite', 'IsLeapYear', 'IsMultiThread', 'IsNaN',
+ 'LastDelimiter', 'Length', 'Ln', 'Lo', 'Log10', 'Low', 'LowerCase', 'Max', 'Mean', 'MessageDlg', 'MessageDlgPos',
+ 'MonthOfTheYear', 'Now', 'Odd', 'Ord', 'ParamCount', 'ParamStr', 'Pi', 'Point', 'PointsEqual', 'Pos', 'Pred',
+ 'Printer', 'PromptForFileName', 'PtInRect', 'RadToDeg', 'Random', 'RandomRange', 'RecodeDate', 'RecodeTime', 'Rect',
+ 'RemoveDir', 'RenameFile', 'Round', 'SeekEof', 'SeekEoln', 'SelectDirectory', 'SetCurrentDir', 'Sin', 'SizeOf',
+ 'Slice', 'Sqr', 'Sqrt', 'StringOfChar', 'StringReplace', 'StringToWideChar', 'StrToCurr', 'StrToDate', 'StrToDateTime',
+ 'StrToFloat', 'StrToInt', 'StrToInt64', 'StrToInt64Def', 'StrToIntDef', 'StrToTime', 'StuffString', 'Succ', 'Sum', 'Tan',
+ 'Time', 'TimeToStr', 'Tomorrow', 'Trunc', 'UpCase', 'UpperCase', 'VarType', 'WideCharToString', 'WrapText', 'Yesterday',
+ 'Append', 'AppendStr', 'Assign', 'AssignFile', 'AssignPrn', 'Beep', 'BlockRead', 'BlockWrite', 'Break',
+ 'ChDir', 'Close', 'CloseFile', 'Continue', 'DateTimeToString', 'Dec', 'DecodeDate', 'DecodeDateTime',
+ 'DecodeTime', 'Delete', 'Dispose', 'EndThread', 'Erase', 'Exclude', 'Exit', 'FillChar', 'Flush', 'FreeAndNil',
+ 'FreeMem', 'GetDir', 'GetLocaleFormatSettings', 'Halt', 'Inc', 'Include', 'Insert', 'MkDir', 'Move', 'New',
+ 'ProcessPath', 'Randomize', 'Read', 'ReadLn', 'ReallocMem', 'Rename', 'ReplaceDate', 'ReplaceTime',
+ 'Reset', 'ReWrite', 'RmDir', 'RunError', 'Seek', 'SetLength', 'SetString', 'ShowMessage', 'ShowMessageFmt',
+ 'ShowMessagePos', 'Str', 'Truncate', 'Val', 'Write', 'WriteLn',
+
+ 'AdminPrivilegesRequired','AfterInstall','AllowCancelDuringInstall','AllowNoIcons','AllowRootDirectory','AllowUNCPath','AlwaysRestart','AlwaysShowComponentsList','AlwaysShowDirOnReadyPage','AlwaysShowGroupOnReadyPage ','AlwaysUsePersonalGroup','AppComments','AppContact','AppCopyright','AppendDefaultDirName',
+ 'AppendDefaultGroupName','AppId','AppModifyPath','AppMutex','AppName','AppPublisher',
+ 'AppPublisherURL','AppReadmeFile','AppSupportURL','AppUpdatesURL','AppVerName','AppVersion',
+ 'Attribs','BackColor','BackColor2','BackColorDirection','BackSolid','BeforeInstall',
+ 'ChangesAssociations','ChangesEnvironment','Check','CodeFile','Comment','Compression','CopyMode',
+ 'CreateAppDir','CreateUninstallRegKey','DefaultDirName','DefaultGroupName',
+ 'DefaultUserInfoName','DefaultUserInfoOrg','DefaultUserInfoSerial',
+ 'Description','DestDir','DestName','DirExistsWarning',
+ 'DisableDirPage','DisableFinishedPage',
+ 'DisableProgramGroupPage','DisableReadyMemo','DisableReadyPage',
+ 'DisableStartupPrompt','DiskClusterSize','DiskSliceSize','DiskSpaceMBLabel',
+ 'DiskSpanning','DontMergeDuplicateFiles','EnableDirDoesntExistWarning','Encryption',
+ 'Excludes','ExtraDiskSpaceRequired','Filename','Flags','FlatComponentsList','FontInstall',
+ 'GroupDescription','HotKey','IconFilename','IconIndex','InfoAfterFile','InfoBeforeFile',
+ 'InternalCompressLevel','Key','LanguageDetectionMethod',
+ 'LicenseFile','MergeDuplicateFiles','MessagesFile','MinVersion','Name',
+ 'OnlyBelowVersion','OutputBaseFilename','OutputManifestFile','OutputDir',
+ 'Parameters','Password','Permissions','PrivilegesRequired','ReserveBytes',
+ 'RestartIfNeededByRun','Root','RunOnceId','Section','SetupIconFile',
+ 'ShowComponentSizes','ShowLanguageDialog','ShowTasksTreeLines','SlicesPerDisk',
+ 'SolidCompression','Source','SourceDir','StatusMsg','Subkey',
+ 'TimeStampRounding','TimeStampsInUTC','TouchDate','TouchTime','Type',
+ 'UninstallDisplayIcon','UninstallDisplayName','UninstallFilesDir','UninstallIconFile',
+ 'UninstallLogMode','UninstallRestartComputer','UninstallStyle','Uninstallable',
+ 'UpdateUninstallLogAppName','UsePreviousAppDir','UsePreviousGroup',
+ 'UsePreviousTasks','UsePreviousSetupType','UsePreviousUserInfo',
+ 'UserInfoPage','UseSetupLdr','ValueData','ValueName','ValueType',
+ 'VersionInfoVersion','VersionInfoCompany','VersionInfoDescription','VersionInfoTextVersion',
+ 'WindowResizable','WindowShowCaption','WindowStartMaximized',
+ 'WindowVisible','WizardImageBackColor','WizardImageFile','WizardImageStretch','WizardSmallImageBackColor','WizardSmallImageFile','WizardStyle','WorkingDir'
+ ),
+ 4 => array(
+ 'AnsiChar', 'AnsiString', 'Boolean', 'Byte', 'Cardinal', 'Char', 'Comp', 'Currency', 'Double', 'Extended',
+ 'Int64', 'Integer', 'LongInt', 'LongWord', 'PAnsiChar', 'PAnsiString', 'PChar', 'PCurrency', 'PDateTime',
+ 'PExtended', 'PInt64', 'Pointer', 'PShortString', 'PString', 'PVariant', 'PWideChar', 'PWideString',
+ 'Real', 'Real48', 'ShortInt', 'ShortString', 'Single', 'SmallInt', 'String', 'TBits', 'TConvType', 'TDateTime',
+ 'Text', 'TextFile', 'TFloatFormat', 'TFormatSettings', 'TList', 'TObject', 'TOpenDialog', 'TPoint',
+ 'TPrintDialog', 'TRect', 'TReplaceFlags', 'TSaveDialog', 'TSearchRec', 'TStringList', 'TSysCharSet',
+ 'TThreadFunc', 'Variant', 'WideChar', 'WideString', 'Word'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '@', '%', '&', '*', '|', '/', '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',/*bold Black*/
+ 2 => 'color: #000000;font-style: italic;',/*Black*/
+ 3 => 'color: #0000FF;',/*blue*/
+ 4 => 'color: #CC0000;'/*red*/
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #33FF00; font-style: italic;',
+ 'MULTI' => 'color: #33FF00; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000; font-weight: bold;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/intercal.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/intercal.php
new file mode 100644
index 00000000..3c81b81c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/intercal.php
@@ -0,0 +1,122 @@
+<?php
+/*************************************************************************************
+ * intercal.php
+ * ----------
+ * Author: Benny Baumann (BenBE@geshi.org)
+ * Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/10/31
+ *
+ * INTERCAL language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/10/31 (1.0.8.1)
+ * - First Release
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+$language_data = array (
+ 'LANG_NAME' => 'INTERCAL',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ //Politeness
+ 1 => array(
+ 'DO', 'DOES', 'DONT', 'DON\'T', 'NOT', 'PLEASE', 'PLEASENT', 'PLEASEN\'T', 'MAYBE'
+ ),
+ //Statements
+ 2 => array(
+ 'STASH', 'RETRIEVE', 'NEXT', 'RESUME', 'FORGET', 'ABSTAIN', 'ABSTAINING',
+ 'COME', 'FROM', 'CALCULATING', 'REINSTATE', 'IGNORE', 'REMEMBER',
+ 'WRITE', 'IN', 'READ', 'OUT', 'GIVE', 'UP'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '.', ',', ':', ';', '#',
+ '~', '$', '&', '?',
+ '\'', '"', '<-'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000080; font-weight: bold;',
+ 2 => 'color: #000080; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ 1 => 'color: #808080; font-style: italic;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 1 => '^\(\d+\)'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'COMMENTS' => GESHI_NEVER,
+ 'STRINGS' => GESHI_NEVER,
+ 'NUMBERS' => GESHI_NEVER
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/io.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/io.php
new file mode 100644
index 00000000..51fad43a
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/io.php
@@ -0,0 +1,138 @@
+<?php
+/*************************************************************************************
+ * io.php
+ * -------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Copyright: (c) 2006 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/09/23
+ *
+ * Io language file for GeSHi. Thanks to Johnathan Wright for the suggestion and help
+ * with this language :)
+ *
+ * CHANGES
+ * -------
+ * 2006/09/23(1.0.0)
+ * - First Release
+ *
+ * TODO
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Io',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'and', 'break', 'else', 'elseif', 'exit', 'for', 'foreach', 'if', 'ifFalse', 'ifNil',
+ 'ifTrue', 'or', 'pass', 'raise', 'return', 'then', 'try', 'wait', 'while', 'yield'
+ ),
+ 2 => array(
+ 'activate', 'activeCoroCount', 'asString', 'block', 'catch', 'clone', 'collectGarbage',
+ 'compileString', 'continue', 'do', 'doFile', 'doMessage', 'doString', 'forward',
+ 'getSlot', 'getenv', 'hasSlot', 'isActive', 'isNil', 'isResumable', 'list', 'message',
+ 'method', 'parent', 'pause', 'perform', 'performWithArgList', 'print', 'proto',
+ 'raiseResumable', 'removeSlot', 'resend', 'resume', 'schedulerSleepSeconds', 'self',
+ 'sender', 'setSchedulerSleepSeconds', 'setSlot', 'shallowCopy', 'slotNames', 'super',
+ 'system', 'thisBlock', 'thisContext', 'thisMessage', 'type', 'uniqueId', 'updateSlot',
+ 'write'
+ ),
+ 3 => array(
+ 'Array', 'AudioDevice', 'AudioMixer', 'Block', 'Box', 'Buffer', 'CFunction', 'CGI',
+ 'Color', 'Curses', 'DBM', 'DNSResolver', 'DOConnection', 'DOProxy', 'DOServer',
+ 'Date', 'Directory', 'Duration', 'DynLib', 'Error', 'Exception', 'FFT', 'File',
+ 'Fnmatch', 'Font', 'Future', 'GL', 'GLE', 'GLScissor', 'GLU', 'GLUCylinder',
+ 'GLUQuadric', 'GLUSphere', 'GLUT', 'Host', 'Image', 'Importer', 'LinkList', 'List',
+ 'Lobby', 'Locals', 'MD5', 'MP3Decoder', 'MP3Encoder', 'Map', 'Message', 'Movie',
+ 'NULL', 'Nil', 'Nop', 'Notifiction', 'Number', 'Object', 'OpenGL', 'Point', 'Protos',
+ 'Regex', 'SGMLTag', 'SQLite', 'Server', 'ShowMessage', 'SleepyCat', 'SleepyCatCursor',
+ 'Socket', 'SocketManager', 'Sound', 'Soup', 'Store', 'String', 'Tree', 'UDPSender',
+ 'UDPReceiver', 'URL', 'User', 'Warning', 'WeakLink'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '!', '@', '%', '&', '*', '|', '/', '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/j.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/j.php
new file mode 100644
index 00000000..5565bb49
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/j.php
@@ -0,0 +1,190 @@
+<?php
+/*************************************************************************************
+ * j.php
+ * --------
+ * Author: Ric Sherlock (tikkanz@gmail.com)
+ * Copyright: (c) 2009 Ric Sherlock
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/11/10
+ *
+ * J language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/18 (1.0.8.10)
+ * - Infinity and negative infinity recognized as numbers
+ * 2010/03/01 (1.0.8.8)
+ * - Add support for label_xyz. and goto_xyz.
+ * - Fix highlighting of for_i.
+ * - Use alternative method for highlighting for_xyz. construct
+ * 2010/02/14 (1.0.8.7)
+ * - Add support for primitives
+ * 2010/01/12 (1.0.2)
+ * - Use HARDQUOTE for strings
+ * - Highlight open quotes/incomplete strings
+ * - Highlight multi-line comments that use Note
+ * - Refinements for NUMBERS and Argument keywords
+ * - Highlight infinity and neg. infinity using REGEXPS
+ * - Highlight "for_myvar." style Control keyword using REGEXPS
+ * 2009/12/14 (1.0.1)
+ * - Regex for NUMBERS, SYMBOLS for () and turn off BRACKETS
+ * 2009/11/12 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2010/01/27)
+ * -------------------------
+ * * combine keyword categories by using conditional regex statement in PARSER CONTROL?
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'J',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ 1 => '/(?<!\w)NB\..*?$/m', //singleline comments NB.
+ 2 => '/(?<=\bNote\b).*?$\s+\)(?:(?!\n)\s)*$/sm', //multiline comments in Note
+ 3 => "/'[^']*?$/m" //incomplete strings/open quotes
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'HARDQUOTE' => array("'", "'"),
+ 'HARDESCAPE' => array("'"),
+ 'HARDCHAR' => "'",
+ 'NUMBERS' => array(
+ 0 => '\b(?:_?\d+(?:\.\d+)?(?:x|[bejprx]_?[\da-z]+(?:\.[\da-z]+)?)?|__?)(?![\w\.\:])',
+ ),
+ 'KEYWORDS' => array(
+ //Control words
+ 1 => array(
+ 'assert.', 'break.', 'case.', 'catch.', 'catcht.', 'continue.', 'do.',
+ 'else.', 'elseif.', 'end.', 'fcase.', 'for.', 'goto.', 'if.', 'label.',
+ 'return.', 'select.', 'throw.', 'trap.', 'try.', 'while.', 'whilst.'
+ ),
+ //Arguments
+ 2 => array(
+ 'm', 'n', 'u', 'v', 'x', 'y'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ //Punctuation
+ 0 => array(
+ '(', ')'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ //6 => true,
+ //7 => true,
+ //8 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff; font-weight: bold;',
+ 2 => 'color: #0000cc; font-weight: bold;',
+ //6 => 'color: #000000; font-weight: bold;',
+ //7 => 'color: #000000; font-weight: bold;',
+ //8 => 'color: #000000; font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #666666; font-style: italic; font-weight: bold;',
+ 3 => 'color: #ff00ff; ', //open quote
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 'HARD' => 'font-weight: bold;',
+ 0 => '',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 'HARD' => 'color: #ff0000;',
+ 0 => 'color: #ff0000;',
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #009999; font-weight: bold;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #009900; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000ff; font-weight: bold;', //for_xyz. - same as kw1
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '', //'http://www.jsoftware.com/help/dictionary/ctrl.htm',
+ 2 => '',
+ //6 => '', //'http://www.jsoftware.com/jwiki/Vocabulary',
+ //7 => '', //'http://www.jsoftware.com/jwiki/Vocabulary',
+ //8 => '', //'http://www.jsoftware.com/jwiki/Vocabulary',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => '\b(for|goto|label)_[a-zA-Z]\w*\.', //for_xyz. - should be kw1
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER,
+ ),
+ 'NUMBERS' => array(
+ 'PRECHECK_RX' => '#[\d_]#', // underscore is valid number
+ ),
+ 'KEYWORDS' => array(
+ //Control words
+ 2 => array(
+ 'DISALLOWED_BEFORE' => '(?<!\w)',
+ 'DISALLOWED_AFTER' => '(?![\w\.\:])',
+ ),
+ //Primtives starting with a symbol (except . or :)
+ 6 => array(
+ 'DISALLOWED_BEFORE' => '(?!K)', // effect should be to allow anything
+ 'DISALLOWED_AFTER' => '(?=.*)',
+ ),
+ //Primtives starting with a letter
+ 7 => array(
+ 'DISALLOWED_BEFORE' => '(?<!\w)',
+ 'DISALLOWED_AFTER' => '(?=.*)',
+ ),
+ //Primtives starting with symbol . or :
+ 8 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\s)',
+ 'DISALLOWED_AFTER' => '(?=.*)',
+ ),
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/java.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/java.php
new file mode 100644
index 00000000..652b8ddd
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/java.php
@@ -0,0 +1,983 @@
+<?php
+/*************************************************************************************
+ * java.php
+ * --------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/07/10
+ *
+ * Java language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/25 (1.0.7.22)
+ * - Added highlighting of import and package directives as non-OOP
+ * 2005/12/28 (1.0.4)
+ * - Added instanceof keyword
+ * 2004/11/27 (1.0.3)
+ * - Added support for multiple object splitters
+ * 2004/08/05 (1.0.2)
+ * - Added URL support
+ * - Added keyword "this", as bugs in GeSHi class ironed out
+ * 2004/08/05 (1.0.1)
+ * - Added support for symbols
+ * - Added extra missed keywords
+ * 2004/07/14 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ * * Compact the class names like the first few have been
+ * and eliminate repeats
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Java',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Import and Package directives (Basic Support only)
+ 2 => '/(?:(?<=import[\\n\\s])|(?<=package[\\n\\s]))[\\n\\s]*([a-zA-Z0-9_]+\\.)*([a-zA-Z0-9_]+|\*)(?=[\n\s;])/i',
+ // javadoc comments
+ 3 => '#/\*\*(?![\*\/]).*\*/#sU'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'for', 'foreach', 'if', 'else', 'while', 'do',
+ 'switch', 'case', 'return', 'public',
+ 'private', 'protected', 'extends', 'break', 'class',
+ 'new', 'try', 'catch', 'throws', 'finally', 'implements',
+ 'interface', 'throw', 'final', 'native', 'synchronized', 'this',
+ 'abstract', 'transient', 'instanceof', 'assert', 'continue',
+ 'default', 'enum', 'package', 'static', 'strictfp', 'super',
+ 'volatile', 'const', 'goto', 'import'
+ ),
+ 2 => array(
+ 'null', 'false', 'true'
+ ),
+ 3 => array(
+ 'AbstractAction', 'AbstractBorder', 'AbstractButton',
+ 'AbstractCellEditor', 'AbstractCollection',
+ 'AbstractColorChooserPanel', 'AbstractDocument',
+ 'AbstractDocument.AttributeContext',
+ 'AbstractDocument.Content',
+ 'AbstractDocument.ElementEdit',
+ 'AbstractLayoutCache',
+ 'AbstractLayoutCache.NodeDimensions', 'AbstractList',
+ 'AbstractListModel', 'AbstractMap',
+ 'AbstractMethodError', 'AbstractSequentialList',
+ 'AbstractSet', 'AbstractTableModel',
+ 'AbstractUndoableEdit', 'AbstractWriter',
+ 'AccessControlContext', 'AccessControlException',
+ 'AccessController', 'AccessException', 'Accessible',
+ 'AccessibleAction', 'AccessibleBundle',
+ 'AccessibleComponent', 'AccessibleContext',
+ 'AccessibleHyperlink', 'AccessibleHypertext',
+ 'AccessibleIcon', 'AccessibleObject',
+ 'AccessibleRelation', 'AccessibleRelationSet',
+ 'AccessibleResourceBundle', 'AccessibleRole',
+ 'AccessibleSelection', 'AccessibleState',
+ 'AccessibleStateSet', 'AccessibleTable',
+ 'AccessibleTableModelChange', 'AccessibleText',
+ 'AccessibleValue', 'Acl', 'AclEntry',
+ 'AclNotFoundException', 'Action', 'ActionEvent',
+ 'ActionListener', 'ActionMap', 'ActionMapUIResource',
+ 'Activatable', 'ActivateFailedException',
+ 'ActivationDesc', 'ActivationException',
+ 'ActivationGroup', 'ActivationGroupDesc',
+ 'ActivationGroupDesc.CommandEnvironment',
+ 'ActivationGroupID', 'ActivationID',
+ 'ActivationInstantiator', 'ActivationMonitor',
+ 'ActivationSystem', 'Activator', 'ActiveEvent',
+ 'Adjustable', 'AdjustmentEvent',
+ 'AdjustmentListener', 'Adler32', 'AffineTransform',
+ 'AffineTransformOp', 'AlgorithmParameterGenerator',
+ 'AlgorithmParameterGeneratorSpi',
+ 'AlgorithmParameters', 'AlgorithmParameterSpec',
+ 'AlgorithmParametersSpi', 'AllPermission',
+ 'AlphaComposite', 'AlreadyBound',
+ 'AlreadyBoundException', 'AlreadyBoundHelper',
+ 'AlreadyBoundHolder', 'AncestorEvent',
+ 'AncestorListener', 'Annotation', 'Any', 'AnyHolder',
+ 'AnySeqHelper', 'AnySeqHolder', 'Applet',
+ 'AppletContext', 'AppletInitializer', 'AppletStub',
+ 'ApplicationException', 'Arc2D', 'Arc2D.Double',
+ 'Arc2D.Float', 'Area', 'AreaAveragingScaleFilter',
+ 'ARG_IN', 'ARG_INOUT', 'ARG_OUT',
+ 'ArithmeticException', 'Array',
+ 'ArrayIndexOutOfBoundsException', 'ArrayList',
+ 'Arrays', 'ArrayStoreException', 'AsyncBoxView',
+ 'Attribute', 'AttributedCharacterIterator',
+ 'AttributedCharacterIterator.Attribute',
+ 'AttributedString', 'AttributeInUseException',
+ 'AttributeList', 'AttributeModificationException',
+ 'Attributes', 'Attributes.Name', 'AttributeSet',
+ 'AttributeSet.CharacterAttribute',
+ 'AttributeSet.ColorAttribute',
+ 'AttributeSet.FontAttribute',
+ 'AttributeSet.ParagraphAttribute', 'AudioClip',
+ 'AudioFileFormat', 'AudioFileFormat.Type',
+ 'AudioFileReader', 'AudioFileWriter', 'AudioFormat',
+ 'AudioFormat.Encoding', 'AudioInputStream',
+ 'AudioPermission', 'AudioSystem',
+ 'AuthenticationException',
+ 'AuthenticationNotSupportedException',
+ 'Authenticator', 'Autoscroll', 'AWTError',
+ 'AWTEvent', 'AWTEventListener',
+ 'AWTEventMulticaster', 'AWTException',
+ 'AWTPermission', 'BadKind', 'BadLocationException',
+ 'BAD_CONTEXT', 'BAD_INV_ORDER', 'BAD_OPERATION',
+ 'BAD_PARAM', 'BAD_POLICY', 'BAD_POLICY_TYPE',
+ 'BAD_POLICY_VALUE', 'BAD_TYPECODE', 'BandCombineOp',
+ 'BandedSampleModel', 'BasicArrowButton',
+ 'BasicAttribute', 'BasicAttributes', 'BasicBorders',
+ 'BasicBorders.ButtonBorder',
+ 'BasicBorders.FieldBorder',
+ 'BasicBorders.MarginBorder',
+ 'BasicBorders.MenuBarBorder',
+ 'BasicBorders.RadioButtonBorder',
+ 'BasicBorders.SplitPaneBorder',
+ 'BasicBorders.ToggleButtonBorder',
+ 'BasicButtonListener', 'BasicButtonUI',
+ 'BasicCheckBoxMenuItemUI', 'BasicCheckBoxUI',
+ 'BasicColorChooserUI', 'BasicComboBoxEditor',
+ 'BasicComboBoxEditor.UIResource',
+ 'BasicComboBoxRenderer',
+ 'BasicComboBoxRenderer.UIResource',
+ 'BasicComboBoxUI', 'BasicComboPopup',
+ 'BasicDesktopIconUI', 'BasicDesktopPaneUI',
+ 'BasicDirectoryModel', 'BasicEditorPaneUI',
+ 'BasicFileChooserUI', 'BasicGraphicsUtils',
+ 'BasicHTML', 'BasicIconFactory',
+ 'BasicInternalFrameTitlePane',
+ 'BasicInternalFrameUI', 'BasicLabelUI',
+ 'BasicListUI', 'BasicLookAndFeel', 'BasicMenuBarUI',
+ 'BasicMenuItemUI', 'BasicMenuUI',
+ 'BasicOptionPaneUI',
+ 'BasicOptionPaneUI.ButtonAreaLayout', 'BasicPanelUI',
+ 'BasicPasswordFieldUI', 'BasicPermission',
+ 'BasicPopupMenuSeparatorUI', 'BasicPopupMenuUI',
+ 'BasicProgressBarUI', 'BasicRadioButtonMenuItemUI',
+ 'BasicRadioButtonUI', 'BasicRootPaneUI',
+ 'BasicScrollBarUI', 'BasicScrollPaneUI',
+ 'BasicSeparatorUI', 'BasicSliderUI',
+ 'BasicSplitPaneDivider', 'BasicSplitPaneUI',
+ 'BasicStroke', 'BasicTabbedPaneUI',
+ 'BasicTableHeaderUI', 'BasicTableUI',
+ 'BasicTextAreaUI', 'BasicTextFieldUI',
+ 'BasicTextPaneUI', 'BasicTextUI',
+ 'BasicTextUI.BasicCaret',
+ 'BasicTextUI.BasicHighlighter',
+ 'BasicToggleButtonUI', 'BasicToolBarSeparatorUI',
+ 'BasicToolBarUI', 'BasicToolTipUI', 'BasicTreeUI',
+ 'BasicViewportUI', 'BatchUpdateException',
+ 'BeanContext', 'BeanContextChild',
+ 'BeanContextChildComponentProxy',
+ 'BeanContextChildSupport',
+ 'BeanContextContainerProxy', 'BeanContextEvent',
+ 'BeanContextMembershipEvent',
+ 'BeanContextMembershipListener', 'BeanContextProxy',
+ 'BeanContextServiceAvailableEvent',
+ 'BeanContextServiceProvider',
+ 'BeanContextServiceProviderBeanInfo',
+ 'BeanContextServiceRevokedEvent',
+ 'BeanContextServiceRevokedListener',
+ 'BeanContextServices', 'BeanContextServicesListener',
+ 'BeanContextServicesSupport',
+ 'BeanContextServicesSupport.BCSSServiceProvider',
+ 'BeanContextSupport',
+ 'BeanContextSupport.BCSIterator', 'BeanDescriptor',
+ 'BeanInfo', 'Beans', 'BevelBorder', 'BigDecimal',
+ 'BigInteger', 'BinaryRefAddr', 'BindException',
+ 'Binding', 'BindingHelper', 'BindingHolder',
+ 'BindingIterator', 'BindingIteratorHelper',
+ 'BindingIteratorHolder', 'BindingIteratorOperations',
+ 'BindingListHelper', 'BindingListHolder',
+ 'BindingType', 'BindingTypeHelper',
+ 'BindingTypeHolder', 'BitSet', 'Blob', 'BlockView',
+ 'Book', 'Boolean', 'BooleanControl',
+ 'BooleanControl.Type', 'BooleanHolder',
+ 'BooleanSeqHelper', 'BooleanSeqHolder', 'Border',
+ 'BorderFactory', 'BorderLayout', 'BorderUIResource',
+ 'BorderUIResource.BevelBorderUIResource',
+ 'BorderUIResource.CompoundBorderUIResource',
+ 'BorderUIResource.EmptyBorderUIResource',
+ 'BorderUIResource.EtchedBorderUIResource',
+ 'BorderUIResource.LineBorderUIResource',
+ 'BorderUIResource.MatteBorderUIResource',
+ 'BorderUIResource.TitledBorderUIResource',
+ 'BoundedRangeModel', 'Bounds', 'Box', 'Box.Filler',
+ 'BoxedValueHelper', 'BoxLayout', 'BoxView',
+ 'BreakIterator', 'BufferedImage',
+ 'BufferedImageFilter', 'BufferedImageOp',
+ 'BufferedInputStream', 'BufferedOutputStream',
+ 'BufferedReader', 'BufferedWriter', 'Button',
+ 'ButtonGroup', 'ButtonModel', 'ButtonUI', 'Byte',
+ 'ByteArrayInputStream', 'ByteArrayOutputStream',
+ 'ByteHolder', 'ByteLookupTable', 'Calendar',
+ 'CallableStatement', 'CannotProceed',
+ 'CannotProceedException', 'CannotProceedHelper',
+ 'CannotProceedHolder', 'CannotRedoException',
+ 'CannotUndoException', 'Canvas', 'CardLayout',
+ 'Caret', 'CaretEvent', 'CaretListener', 'CellEditor',
+ 'CellEditorListener', 'CellRendererPane',
+ 'Certificate', 'Certificate.CertificateRep',
+ 'CertificateEncodingException',
+ 'CertificateException',
+ 'CertificateExpiredException', 'CertificateFactory',
+ 'CertificateFactorySpi',
+ 'CertificateNotYetValidException',
+ 'CertificateParsingException',
+ 'ChangedCharSetException', 'ChangeEvent',
+ 'ChangeListener', 'Character', 'Character.Subset',
+ 'Character.UnicodeBlock', 'CharacterIterator',
+ 'CharArrayReader', 'CharArrayWriter',
+ 'CharConversionException', 'CharHolder',
+ 'CharSeqHelper', 'CharSeqHolder', 'Checkbox',
+ 'CheckboxGroup', 'CheckboxMenuItem',
+ 'CheckedInputStream', 'CheckedOutputStream',
+ 'Checksum', 'Choice', 'ChoiceFormat', 'Class',
+ 'ClassCastException', 'ClassCircularityError',
+ 'ClassDesc', 'ClassFormatError', 'ClassLoader',
+ 'ClassNotFoundException', 'Clip', 'Clipboard',
+ 'ClipboardOwner', 'Clob', 'Cloneable',
+ 'CloneNotSupportedException', 'CMMException',
+ 'CodeSource', 'CollationElementIterator',
+ 'CollationKey', 'Collator', 'Collection',
+ 'Collections', 'Color',
+ 'ColorChooserComponentFactory', 'ColorChooserUI',
+ 'ColorConvertOp', 'ColorModel',
+ 'ColorSelectionModel', 'ColorSpace',
+ 'ColorUIResource', 'ComboBoxEditor', 'ComboBoxModel',
+ 'ComboBoxUI', 'ComboPopup', 'CommunicationException',
+ 'COMM_FAILURE', 'Comparable', 'Comparator',
+ 'Compiler', 'CompletionStatus',
+ 'CompletionStatusHelper', 'Component',
+ 'ComponentAdapter', 'ComponentColorModel',
+ 'ComponentEvent', 'ComponentInputMap',
+ 'ComponentInputMapUIResource', 'ComponentListener',
+ 'ComponentOrientation', 'ComponentSampleModel',
+ 'ComponentUI', 'ComponentView', 'Composite',
+ 'CompositeContext', 'CompositeName', 'CompositeView',
+ 'CompoundBorder', 'CompoundControl',
+ 'CompoundControl.Type', 'CompoundEdit',
+ 'CompoundName', 'ConcurrentModificationException',
+ 'ConfigurationException', 'ConnectException',
+ 'ConnectIOException', 'Connection', 'Constructor', 'Container',
+ 'ContainerAdapter', 'ContainerEvent',
+ 'ContainerListener', 'ContentHandler',
+ 'ContentHandlerFactory', 'ContentModel', 'Context',
+ 'ContextList', 'ContextNotEmptyException',
+ 'ContextualRenderedImageFactory', 'Control',
+ 'Control.Type', 'ControlFactory',
+ 'ControllerEventListener', 'ConvolveOp', 'CRC32',
+ 'CRL', 'CRLException', 'CropImageFilter', 'CSS',
+ 'CSS.Attribute', 'CTX_RESTRICT_SCOPE',
+ 'CubicCurve2D', 'CubicCurve2D.Double',
+ 'CubicCurve2D.Float', 'Current', 'CurrentHelper',
+ 'CurrentHolder', 'CurrentOperations', 'Cursor',
+ 'Customizer', 'CustomMarshal', 'CustomValue',
+ 'DatabaseMetaData', 'DataBuffer', 'DataBufferByte',
+ 'DataBufferInt', 'DataBufferShort',
+ 'DataBufferUShort', 'DataFlavor',
+ 'DataFormatException', 'DatagramPacket',
+ 'DatagramSocket', 'DatagramSocketImpl',
+ 'DatagramSocketImplFactory', 'DataInput',
+ 'DataInputStream', 'DataLine', 'DataLine.Info',
+ 'DataOutput', 'DataOutputStream',
+ 'DataTruncation', 'DATA_CONVERSION', 'Date',
+ 'DateFormat', 'DateFormatSymbols', 'DebugGraphics',
+ 'DecimalFormat', 'DecimalFormatSymbols',
+ 'DefaultBoundedRangeModel', 'DefaultButtonModel',
+ 'DefaultCaret', 'DefaultCellEditor',
+ 'DefaultColorSelectionModel', 'DefaultComboBoxModel',
+ 'DefaultDesktopManager', 'DefaultEditorKit',
+ 'DefaultEditorKit.BeepAction',
+ 'DefaultEditorKit.CopyAction',
+ 'DefaultEditorKit.CutAction',
+ 'DefaultEditorKit.DefaultKeyTypedAction',
+ 'DefaultEditorKit.InsertBreakAction',
+ 'DefaultEditorKit.InsertContentAction',
+ 'DefaultEditorKit.InsertTabAction',
+ 'DefaultEditorKit.PasteAction,',
+ 'DefaultFocusManager', 'DefaultHighlighter',
+ 'DefaultHighlighter.DefaultHighlightPainter',
+ 'DefaultListCellRenderer',
+ 'DefaultListCellRenderer.UIResource',
+ 'DefaultListModel', 'DefaultListSelectionModel',
+ 'DefaultMenuLayout', 'DefaultMetalTheme',
+ 'DefaultMutableTreeNode',
+ 'DefaultSingleSelectionModel',
+ 'DefaultStyledDocument',
+ 'DefaultStyledDocument.AttributeUndoableEdit',
+ 'DefaultStyledDocument.ElementSpec',
+ 'DefaultTableCellRenderer',
+ 'DefaultTableCellRenderer.UIResource',
+ 'DefaultTableColumnModel', 'DefaultTableModel',
+ 'DefaultTextUI', 'DefaultTreeCellEditor',
+ 'DefaultTreeCellRenderer', 'DefaultTreeModel',
+ 'DefaultTreeSelectionModel', 'DefinitionKind',
+ 'DefinitionKindHelper', 'Deflater',
+ 'DeflaterOutputStream', 'Delegate', 'DesignMode',
+ 'DesktopIconUI', 'DesktopManager', 'DesktopPaneUI',
+ 'DGC', 'Dialog', 'Dictionary', 'DigestException',
+ 'DigestInputStream', 'DigestOutputStream',
+ 'Dimension', 'Dimension2D', 'DimensionUIResource',
+ 'DirContext', 'DirectColorModel', 'DirectoryManager',
+ 'DirObjectFactory', 'DirStateFactory',
+ 'DirStateFactory.Result', 'DnDConstants', 'Document',
+ 'DocumentEvent', 'DocumentEvent.ElementChange',
+ 'DocumentEvent.EventType', 'DocumentListener',
+ 'DocumentParser', 'DomainCombiner', 'DomainManager',
+ 'DomainManagerOperations', 'Double', 'DoubleHolder',
+ 'DoubleSeqHelper', 'DoubleSeqHolder',
+ 'DragGestureEvent', 'DragGestureListener',
+ 'DragGestureRecognizer', 'DragSource',
+ 'DragSourceContext', 'DragSourceDragEvent',
+ 'DragSourceDropEvent', 'DragSourceEvent',
+ 'DragSourceListener', 'Driver', 'DriverManager',
+ 'DriverPropertyInfo', 'DropTarget',
+ 'DropTarget.DropTargetAutoScroller',
+ 'DropTargetContext', 'DropTargetDragEvent',
+ 'DropTargetDropEvent', 'DropTargetEvent',
+ 'DropTargetListener', 'DSAKey',
+ 'DSAKeyPairGenerator', 'DSAParameterSpec',
+ 'DSAParams', 'DSAPrivateKey', 'DSAPrivateKeySpec',
+ 'DSAPublicKey', 'DSAPublicKeySpec', 'DTD',
+ 'DTDConstants', 'DynamicImplementation', 'DynAny',
+ 'DynArray', 'DynEnum', 'DynFixed', 'DynSequence',
+ 'DynStruct', 'DynUnion', 'DynValue', 'EditorKit',
+ 'Element', 'ElementIterator', 'Ellipse2D',
+ 'Ellipse2D.Double', 'Ellipse2D.Float', 'EmptyBorder',
+ 'EmptyStackException', 'EncodedKeySpec', 'Entity',
+ 'EnumControl', 'EnumControl.Type', 'Enumeration',
+ 'Environment', 'EOFException', 'Error',
+ 'EtchedBorder', 'Event', 'EventContext',
+ 'EventDirContext', 'EventListener',
+ 'EventListenerList', 'EventObject', 'EventQueue',
+ 'EventSetDescriptor', 'Exception',
+ 'ExceptionInInitializerError', 'ExceptionList',
+ 'ExpandVetoException', 'ExportException',
+ 'ExtendedRequest', 'ExtendedResponse',
+ 'Externalizable', 'FeatureDescriptor', 'Field',
+ 'FieldNameHelper', 'FieldPosition', 'FieldView',
+ 'File', 'FileChooserUI', 'FileDescriptor',
+ 'FileDialog', 'FileFilter',
+ 'FileInputStream', 'FilenameFilter', 'FileNameMap',
+ 'FileNotFoundException', 'FileOutputStream',
+ 'FilePermission', 'FileReader', 'FileSystemView',
+ 'FileView', 'FileWriter', 'FilteredImageSource',
+ 'FilterInputStream', 'FilterOutputStream',
+ 'FilterReader', 'FilterWriter',
+ 'FixedHeightLayoutCache', 'FixedHolder',
+ 'FlatteningPathIterator', 'FlavorMap', 'Float',
+ 'FloatControl', 'FloatControl.Type', 'FloatHolder',
+ 'FloatSeqHelper', 'FloatSeqHolder', 'FlowLayout',
+ 'FlowView', 'FlowView.FlowStrategy', 'FocusAdapter',
+ 'FocusEvent', 'FocusListener', 'FocusManager',
+ 'Font', 'FontFormatException', 'FontMetrics',
+ 'FontRenderContext', 'FontUIResource', 'Format',
+ 'FormatConversionProvider', 'FormView', 'Frame',
+ 'FREE_MEM', 'GapContent', 'GeneralPath',
+ 'GeneralSecurityException', 'GlyphJustificationInfo',
+ 'GlyphMetrics', 'GlyphVector', 'GlyphView',
+ 'GlyphView.GlyphPainter', 'GradientPaint',
+ 'GraphicAttribute', 'Graphics', 'Graphics2D',
+ 'GraphicsConfigTemplate', 'GraphicsConfiguration',
+ 'GraphicsDevice', 'GraphicsEnvironment',
+ 'GrayFilter', 'GregorianCalendar',
+ 'GridBagConstraints', 'GridBagLayout', 'GridLayout',
+ 'Group', 'Guard', 'GuardedObject', 'GZIPInputStream',
+ 'GZIPOutputStream', 'HasControls', 'HashMap',
+ 'HashSet', 'Hashtable', 'HierarchyBoundsAdapter',
+ 'HierarchyBoundsListener', 'HierarchyEvent',
+ 'HierarchyListener', 'Highlighter',
+ 'Highlighter.Highlight',
+ 'Highlighter.HighlightPainter', 'HTML',
+ 'HTML.Attribute', 'HTML.Tag', 'HTML.UnknownTag',
+ 'HTMLDocument', 'HTMLDocument.Iterator',
+ 'HTMLEditorKit', 'HTMLEditorKit.HTMLFactory',
+ 'HTMLEditorKit.HTMLTextAction',
+ 'HTMLEditorKit.InsertHTMLTextAction',
+ 'HTMLEditorKit.LinkController',
+ 'HTMLEditorKit.Parser',
+ 'HTMLEditorKit.ParserCallback',
+ 'HTMLFrameHyperlinkEvent', 'HTMLWriter',
+ 'HttpURLConnection', 'HyperlinkEvent',
+ 'HyperlinkEvent.EventType', 'HyperlinkListener',
+ 'ICC_ColorSpace', 'ICC_Profile', 'ICC_ProfileGray',
+ 'ICC_ProfileRGB', 'Icon', 'IconUIResource',
+ 'IconView', 'IdentifierHelper', 'Identity',
+ 'IdentityScope', 'IDLEntity', 'IDLType',
+ 'IDLTypeHelper', 'IDLTypeOperations',
+ 'IllegalAccessError', 'IllegalAccessException',
+ 'IllegalArgumentException',
+ 'IllegalComponentStateException',
+ 'IllegalMonitorStateException',
+ 'IllegalPathStateException', 'IllegalStateException',
+ 'IllegalThreadStateException', 'Image',
+ 'ImageConsumer', 'ImageFilter',
+ 'ImageGraphicAttribute', 'ImageIcon',
+ 'ImageObserver', 'ImageProducer',
+ 'ImagingOpException', 'IMP_LIMIT',
+ 'IncompatibleClassChangeError',
+ 'InconsistentTypeCode', 'IndexColorModel',
+ 'IndexedPropertyDescriptor',
+ 'IndexOutOfBoundsException', 'IndirectionException',
+ 'InetAddress', 'Inflater', 'InflaterInputStream',
+ 'InheritableThreadLocal', 'InitialContext',
+ 'InitialContextFactory',
+ 'InitialContextFactoryBuilder', 'InitialDirContext',
+ 'INITIALIZE', 'Initializer', 'InitialLdapContext',
+ 'InlineView', 'InputContext', 'InputEvent',
+ 'InputMap', 'InputMapUIResource', 'InputMethod',
+ 'InputMethodContext', 'InputMethodDescriptor',
+ 'InputMethodEvent', 'InputMethodHighlight',
+ 'InputMethodListener', 'InputMethodRequests',
+ 'InputStream',
+ 'InputStreamReader', 'InputSubset', 'InputVerifier',
+ 'Insets', 'InsetsUIResource', 'InstantiationError',
+ 'InstantiationException', 'Instrument',
+ 'InsufficientResourcesException', 'Integer',
+ 'INTERNAL', 'InternalError', 'InternalFrameAdapter',
+ 'InternalFrameEvent', 'InternalFrameListener',
+ 'InternalFrameUI', 'InterruptedException',
+ 'InterruptedIOException',
+ 'InterruptedNamingException', 'INTF_REPOS',
+ 'IntHolder', 'IntrospectionException',
+ 'Introspector', 'Invalid',
+ 'InvalidAlgorithmParameterException',
+ 'InvalidAttributeIdentifierException',
+ 'InvalidAttributesException',
+ 'InvalidAttributeValueException',
+ 'InvalidClassException',
+ 'InvalidDnDOperationException',
+ 'InvalidKeyException', 'InvalidKeySpecException',
+ 'InvalidMidiDataException', 'InvalidName',
+ 'InvalidNameException',
+ 'InvalidNameHelper', 'InvalidNameHolder',
+ 'InvalidObjectException',
+ 'InvalidParameterException',
+ 'InvalidParameterSpecException',
+ 'InvalidSearchControlsException',
+ 'InvalidSearchFilterException', 'InvalidSeq',
+ 'InvalidTransactionException', 'InvalidValue',
+ 'INVALID_TRANSACTION', 'InvocationEvent',
+ 'InvocationHandler', 'InvocationTargetException',
+ 'InvokeHandler', 'INV_FLAG', 'INV_IDENT',
+ 'INV_OBJREF', 'INV_POLICY', 'IOException',
+ 'IRObject', 'IRObjectOperations', 'IstringHelper',
+ 'ItemEvent', 'ItemListener', 'ItemSelectable',
+ 'Iterator', 'JApplet', 'JarEntry', 'JarException',
+ 'JarFile', 'JarInputStream', 'JarOutputStream',
+ 'JarURLConnection', 'JButton', 'JCheckBox',
+ 'JCheckBoxMenuItem', 'JColorChooser', 'JComboBox',
+ 'JComboBox.KeySelectionManager', 'JComponent',
+ 'JDesktopPane', 'JDialog', 'JEditorPane',
+ 'JFileChooser', 'JFrame', 'JInternalFrame',
+ 'JInternalFrame.JDesktopIcon', 'JLabel',
+ 'JLayeredPane', 'JList', 'JMenu', 'JMenuBar',
+ 'JMenuItem', 'JobAttributes',
+ 'JobAttributes.DefaultSelectionType',
+ 'JobAttributes.DestinationType',
+ 'JobAttributes.DialogType',
+ 'JobAttributes.MultipleDocumentHandlingType',
+ 'JobAttributes.SidesType', 'JOptionPane', 'JPanel',
+ 'JPasswordField', 'JPopupMenu',
+ 'JPopupMenu.Separator', 'JProgressBar',
+ 'JRadioButton', 'JRadioButtonMenuItem', 'JRootPane',
+ 'JScrollBar', 'JScrollPane', 'JSeparator', 'JSlider',
+ 'JSplitPane', 'JTabbedPane', 'JTable',
+ 'JTableHeader', 'JTextArea', 'JTextComponent',
+ 'JTextComponent.KeyBinding', 'JTextField',
+ 'JTextPane', 'JToggleButton',
+ 'JToggleButton.ToggleButtonModel', 'JToolBar',
+ 'JToolBar.Separator', 'JToolTip', 'JTree',
+ 'JTree.DynamicUtilTreeNode',
+ 'JTree.EmptySelectionModel', 'JViewport', 'JWindow',
+ 'Kernel', 'Key', 'KeyAdapter', 'KeyEvent',
+ 'KeyException', 'KeyFactory', 'KeyFactorySpi',
+ 'KeyListener', 'KeyManagementException', 'Keymap',
+ 'KeyPair', 'KeyPairGenerator', 'KeyPairGeneratorSpi',
+ 'KeySpec', 'KeyStore', 'KeyStoreException',
+ 'KeyStoreSpi', 'KeyStroke', 'Label', 'LabelUI',
+ 'LabelView', 'LastOwnerException',
+ 'LayeredHighlighter',
+ 'LayeredHighlighter.LayerPainter', 'LayoutManager',
+ 'LayoutManager2', 'LayoutQueue', 'LdapContext',
+ 'LdapReferralException', 'Lease',
+ 'LimitExceededException', 'Line', 'Line.Info',
+ 'Line2D', 'Line2D.Double', 'Line2D.Float',
+ 'LineBorder', 'LineBreakMeasurer', 'LineEvent',
+ 'LineEvent.Type', 'LineListener', 'LineMetrics',
+ 'LineNumberInputStream', 'LineNumberReader',
+ 'LineUnavailableException', 'LinkageError',
+ 'LinkedList', 'LinkException', 'LinkLoopException',
+ 'LinkRef', 'List', 'ListCellRenderer',
+ 'ListDataEvent', 'ListDataListener', 'ListIterator',
+ 'ListModel', 'ListResourceBundle',
+ 'ListSelectionEvent', 'ListSelectionListener',
+ 'ListSelectionModel', 'ListUI', 'ListView',
+ 'LoaderHandler', 'Locale', 'LocateRegistry',
+ 'LogStream', 'Long', 'LongHolder',
+ 'LongLongSeqHelper', 'LongLongSeqHolder',
+ 'LongSeqHelper', 'LongSeqHolder', 'LookAndFeel',
+ 'LookupOp', 'LookupTable', 'MalformedLinkException',
+ 'MalformedURLException', 'Manifest', 'Map',
+ 'Map.Entry', 'MARSHAL', 'MarshalException',
+ 'MarshalledObject', 'Math', 'MatteBorder',
+ 'MediaTracker', 'Member', 'MemoryImageSource',
+ 'Menu', 'MenuBar', 'MenuBarUI', 'MenuComponent',
+ 'MenuContainer', 'MenuDragMouseEvent',
+ 'MenuDragMouseListener', 'MenuElement', 'MenuEvent',
+ 'MenuItem', 'MenuItemUI', 'MenuKeyEvent',
+ 'MenuKeyListener', 'MenuListener',
+ 'MenuSelectionManager', 'MenuShortcut',
+ 'MessageDigest', 'MessageDigestSpi', 'MessageFormat',
+ 'MetaEventListener', 'MetalBorders',
+ 'MetalBorders.ButtonBorder',
+ 'MetalBorders.Flush3DBorder',
+ 'MetalBorders.InternalFrameBorder',
+ 'MetalBorders.MenuBarBorder',
+ 'MetalBorders.MenuItemBorder',
+ 'MetalBorders.OptionDialogBorder',
+ 'MetalBorders.PaletteBorder',
+ 'MetalBorders.PopupMenuBorder',
+ 'MetalBorders.RolloverButtonBorder',
+ 'MetalBorders.ScrollPaneBorder',
+ 'MetalBorders.TableHeaderBorder',
+ 'MetalBorders.TextFieldBorder',
+ 'MetalBorders.ToggleButtonBorder',
+ 'MetalBorders.ToolBarBorder', 'MetalButtonUI',
+ 'MetalCheckBoxIcon', 'MetalCheckBoxUI',
+ 'MetalComboBoxButton', 'MetalComboBoxEditor',
+ 'MetalComboBoxEditor.UIResource',
+ 'MetalComboBoxIcon', 'MetalComboBoxUI',
+ 'MetalDesktopIconUI', 'MetalFileChooserUI',
+ 'MetalIconFactory', 'MetalIconFactory.FileIcon16',
+ 'MetalIconFactory.FolderIcon16',
+ 'MetalIconFactory.PaletteCloseIcon',
+ 'MetalIconFactory.TreeControlIcon',
+ 'MetalIconFactory.TreeFolderIcon',
+ 'MetalIconFactory.TreeLeafIcon',
+ 'MetalInternalFrameTitlePane',
+ 'MetalInternalFrameUI', 'MetalLabelUI',
+ 'MetalLookAndFeel', 'MetalPopupMenuSeparatorUI',
+ 'MetalProgressBarUI', 'MetalRadioButtonUI',
+ 'MetalScrollBarUI', 'MetalScrollButton',
+ 'MetalScrollPaneUI', 'MetalSeparatorUI',
+ 'MetalSliderUI', 'MetalSplitPaneUI',
+ 'MetalTabbedPaneUI', 'MetalTextFieldUI',
+ 'MetalTheme', 'MetalToggleButtonUI',
+ 'MetalToolBarUI', 'MetalToolTipUI', 'MetalTreeUI',
+ 'MetaMessage', 'Method', 'MethodDescriptor',
+ 'MidiChannel', 'MidiDevice', 'MidiDevice.Info',
+ 'MidiDeviceProvider', 'MidiEvent', 'MidiFileFormat',
+ 'MidiFileReader', 'MidiFileWriter', 'MidiMessage',
+ 'MidiSystem', 'MidiUnavailableException',
+ 'MimeTypeParseException', 'MinimalHTMLWriter',
+ 'MissingResourceException', 'Mixer', 'Mixer.Info',
+ 'MixerProvider', 'ModificationItem', 'Modifier',
+ 'MouseAdapter', 'MouseDragGestureRecognizer',
+ 'MouseEvent', 'MouseInputAdapter',
+ 'MouseInputListener', 'MouseListener',
+ 'MouseMotionAdapter', 'MouseMotionListener',
+ 'MultiButtonUI', 'MulticastSocket',
+ 'MultiColorChooserUI', 'MultiComboBoxUI',
+ 'MultiDesktopIconUI', 'MultiDesktopPaneUI',
+ 'MultiFileChooserUI', 'MultiInternalFrameUI',
+ 'MultiLabelUI', 'MultiListUI', 'MultiLookAndFeel',
+ 'MultiMenuBarUI', 'MultiMenuItemUI',
+ 'MultiOptionPaneUI', 'MultiPanelUI',
+ 'MultiPixelPackedSampleModel', 'MultipleMaster',
+ 'MultiPopupMenuUI', 'MultiProgressBarUI',
+ 'MultiScrollBarUI', 'MultiScrollPaneUI',
+ 'MultiSeparatorUI', 'MultiSliderUI',
+ 'MultiSplitPaneUI', 'MultiTabbedPaneUI',
+ 'MultiTableHeaderUI', 'MultiTableUI', 'MultiTextUI',
+ 'MultiToolBarUI', 'MultiToolTipUI', 'MultiTreeUI',
+ 'MultiViewportUI', 'MutableAttributeSet',
+ 'MutableComboBoxModel', 'MutableTreeNode', 'Name',
+ 'NameAlreadyBoundException', 'NameClassPair',
+ 'NameComponent', 'NameComponentHelper',
+ 'NameComponentHolder', 'NamedValue', 'NameHelper',
+ 'NameHolder', 'NameNotFoundException', 'NameParser',
+ 'NamespaceChangeListener', 'NameValuePair',
+ 'NameValuePairHelper', 'Naming', 'NamingContext',
+ 'NamingContextHelper', 'NamingContextHolder',
+ 'NamingContextOperations', 'NamingEnumeration',
+ 'NamingEvent', 'NamingException',
+ 'NamingExceptionEvent', 'NamingListener',
+ 'NamingManager', 'NamingSecurityException',
+ 'NegativeArraySizeException', 'NetPermission',
+ 'NoClassDefFoundError', 'NoInitialContextException',
+ 'NoninvertibleTransformException',
+ 'NoPermissionException', 'NoRouteToHostException',
+ 'NoSuchAlgorithmException',
+ 'NoSuchAttributeException', 'NoSuchElementException',
+ 'NoSuchFieldError', 'NoSuchFieldException',
+ 'NoSuchMethodError', 'NoSuchMethodException',
+ 'NoSuchObjectException', 'NoSuchProviderException',
+ 'NotActiveException', 'NotBoundException',
+ 'NotContextException', 'NotEmpty', 'NotEmptyHelper',
+ 'NotEmptyHolder', 'NotFound', 'NotFoundHelper',
+ 'NotFoundHolder', 'NotFoundReason',
+ 'NotFoundReasonHelper', 'NotFoundReasonHolder',
+ 'NotOwnerException', 'NotSerializableException',
+ 'NO_IMPLEMENT', 'NO_MEMORY', 'NO_PERMISSION',
+ 'NO_RESOURCES', 'NO_RESPONSE',
+ 'NullPointerException', 'Number', 'NumberFormat',
+ 'NumberFormatException', 'NVList', 'Object',
+ 'ObjectChangeListener', 'ObjectFactory',
+ 'ObjectFactoryBuilder', 'ObjectHelper',
+ 'ObjectHolder', 'ObjectImpl',
+ 'ObjectInput', 'ObjectInputStream',
+ 'ObjectInputStream.GetField',
+ 'ObjectInputValidation', 'ObjectOutput',
+ 'ObjectOutputStream', 'ObjectOutputStream.PutField',
+ 'ObjectStreamClass', 'ObjectStreamConstants',
+ 'ObjectStreamException', 'ObjectStreamField',
+ 'ObjectView', 'OBJECT_NOT_EXIST', 'ObjID',
+ 'OBJ_ADAPTER', 'Observable', 'Observer',
+ 'OctetSeqHelper', 'OctetSeqHolder', 'OMGVMCID',
+ 'OpenType', 'Operation',
+ 'OperationNotSupportedException', 'Option',
+ 'OptionalDataException', 'OptionPaneUI', 'ORB',
+ 'OutOfMemoryError', 'OutputStream',
+ 'OutputStreamWriter', 'OverlayLayout', 'Owner',
+ 'Package', 'PackedColorModel', 'Pageable',
+ 'PageAttributes', 'PageAttributes.ColorType',
+ 'PageAttributes.MediaType',
+ 'PageAttributes.OrientationRequestedType',
+ 'PageAttributes.OriginType',
+ 'PageAttributes.PrintQualityType', 'PageFormat',
+ 'Paint', 'PaintContext', 'PaintEvent', 'Panel',
+ 'PanelUI', 'Paper', 'ParagraphView',
+ 'ParameterBlock', 'ParameterDescriptor',
+ 'ParseException', 'ParsePosition', 'Parser',
+ 'ParserDelegator', 'PartialResultException',
+ 'PasswordAuthentication', 'PasswordView', 'Patch',
+ 'PathIterator', 'Permission',
+ 'PermissionCollection', 'Permissions',
+ 'PERSIST_STORE', 'PhantomReference',
+ 'PipedInputStream', 'PipedOutputStream',
+ 'PipedReader', 'PipedWriter', 'PixelGrabber',
+ 'PixelInterleavedSampleModel', 'PKCS8EncodedKeySpec',
+ 'PlainDocument', 'PlainView', 'Point', 'Point2D',
+ 'Point2D.Double', 'Point2D.Float', 'Policy',
+ 'PolicyError', 'PolicyHelper',
+ 'PolicyHolder', 'PolicyListHelper',
+ 'PolicyListHolder', 'PolicyOperations',
+ 'PolicyTypeHelper', 'Polygon', 'PopupMenu',
+ 'PopupMenuEvent', 'PopupMenuListener', 'PopupMenuUI',
+ 'Port', 'Port.Info', 'PortableRemoteObject',
+ 'PortableRemoteObjectDelegate', 'Position',
+ 'Position.Bias', 'PreparedStatement', 'Principal',
+ 'PrincipalHolder', 'Printable',
+ 'PrinterAbortException', 'PrinterException',
+ 'PrinterGraphics', 'PrinterIOException',
+ 'PrinterJob', 'PrintGraphics', 'PrintJob',
+ 'PrintStream', 'PrintWriter', 'PrivateKey',
+ 'PRIVATE_MEMBER', 'PrivilegedAction',
+ 'PrivilegedActionException',
+ 'PrivilegedExceptionAction', 'Process',
+ 'ProfileDataException', 'ProgressBarUI',
+ 'ProgressMonitor', 'ProgressMonitorInputStream',
+ 'Properties', 'PropertyChangeEvent',
+ 'PropertyChangeListener', 'PropertyChangeSupport',
+ 'PropertyDescriptor', 'PropertyEditor',
+ 'PropertyEditorManager', 'PropertyEditorSupport',
+ 'PropertyPermission', 'PropertyResourceBundle',
+ 'PropertyVetoException', 'ProtectionDomain',
+ 'ProtocolException', 'Provider', 'ProviderException',
+ 'Proxy', 'PublicKey', 'PUBLIC_MEMBER',
+ 'PushbackInputStream', 'PushbackReader',
+ 'QuadCurve2D', 'QuadCurve2D.Double',
+ 'QuadCurve2D.Float', 'Random', 'RandomAccessFile',
+ 'Raster', 'RasterFormatException', 'RasterOp',
+ 'Reader', 'Receiver', 'Rectangle', 'Rectangle2D',
+ 'Rectangle2D.Double', 'Rectangle2D.Float',
+ 'RectangularShape', 'Ref', 'RefAddr', 'Reference',
+ 'Referenceable', 'ReferenceQueue',
+ 'ReferralException', 'ReflectPermission', 'Registry',
+ 'RegistryHandler', 'RemarshalException', 'Remote',
+ 'RemoteCall', 'RemoteException', 'RemoteObject',
+ 'RemoteRef', 'RemoteServer', 'RemoteStub',
+ 'RenderableImage', 'RenderableImageOp',
+ 'RenderableImageProducer', 'RenderContext',
+ 'RenderedImage', 'RenderedImageFactory', 'Renderer',
+ 'RenderingHints', 'RenderingHints.Key',
+ 'RepaintManager', 'ReplicateScaleFilter',
+ 'Repository', 'RepositoryIdHelper', 'Request',
+ 'RescaleOp', 'Resolver', 'ResolveResult',
+ 'ResourceBundle', 'ResponseHandler', 'ResultSet',
+ 'ResultSetMetaData', 'ReverbType', 'RGBImageFilter',
+ 'RMIClassLoader', 'RMIClientSocketFactory',
+ 'RMIFailureHandler', 'RMISecurityException',
+ 'RMISecurityManager', 'RMIServerSocketFactory',
+ 'RMISocketFactory', 'Robot', 'RootPaneContainer',
+ 'RootPaneUI', 'RoundRectangle2D',
+ 'RoundRectangle2D.Double', 'RoundRectangle2D.Float',
+ 'RowMapper', 'RSAKey', 'RSAKeyGenParameterSpec',
+ 'RSAPrivateCrtKey', 'RSAPrivateCrtKeySpec',
+ 'RSAPrivateKey', 'RSAPrivateKeySpec', 'RSAPublicKey',
+ 'RSAPublicKeySpec', 'RTFEditorKit',
+ 'RuleBasedCollator', 'Runnable', 'RunTime',
+ 'Runtime', 'RuntimeException', 'RunTimeOperations',
+ 'RuntimePermission', 'SampleModel',
+ 'SchemaViolationException', 'Scrollable',
+ 'Scrollbar', 'ScrollBarUI', 'ScrollPane',
+ 'ScrollPaneConstants', 'ScrollPaneLayout',
+ 'ScrollPaneLayout.UIResource', 'ScrollPaneUI',
+ 'SearchControls', 'SearchResult',
+ 'SecureClassLoader', 'SecureRandom',
+ 'SecureRandomSpi', 'Security', 'SecurityException',
+ 'SecurityManager', 'SecurityPermission', 'Segment',
+ 'SeparatorUI', 'Sequence', 'SequenceInputStream',
+ 'Sequencer', 'Sequencer.SyncMode', 'Serializable',
+ 'SerializablePermission', 'ServantObject',
+ 'ServerCloneException', 'ServerError',
+ 'ServerException', 'ServerNotActiveException',
+ 'ServerRef', 'ServerRequest',
+ 'ServerRuntimeException', 'ServerSocket',
+ 'ServiceDetail', 'ServiceDetailHelper',
+ 'ServiceInformation', 'ServiceInformationHelper',
+ 'ServiceInformationHolder',
+ 'ServiceUnavailableException', 'Set',
+ 'SetOverrideType', 'SetOverrideTypeHelper', 'Shape',
+ 'ShapeGraphicAttribute', 'Short', 'ShortHolder',
+ 'ShortLookupTable', 'ShortMessage', 'ShortSeqHelper',
+ 'ShortSeqHolder', 'Signature', 'SignatureException',
+ 'SignatureSpi', 'SignedObject', 'Signer',
+ 'SimpleAttributeSet', 'SimpleBeanInfo',
+ 'SimpleDateFormat', 'SimpleTimeZone',
+ 'SinglePixelPackedSampleModel',
+ 'SingleSelectionModel', 'SizeLimitExceededException',
+ 'SizeRequirements', 'SizeSequence', 'Skeleton',
+ 'SkeletonMismatchException',
+ 'SkeletonNotFoundException', 'SliderUI', 'Socket',
+ 'SocketException', 'SocketImpl', 'SocketImplFactory',
+ 'SocketOptions', 'SocketPermission',
+ 'SocketSecurityException', 'SoftBevelBorder',
+ 'SoftReference', 'SortedMap', 'SortedSet',
+ 'Soundbank', 'SoundbankReader', 'SoundbankResource',
+ 'SourceDataLine', 'SplitPaneUI', 'SQLData',
+ 'SQLException', 'SQLInput', 'SQLOutput',
+ 'SQLPermission', 'SQLWarning', 'Stack',
+ 'StackOverflowError', 'StateEdit', 'StateEditable',
+ 'StateFactory', 'Statement', 'Streamable',
+ 'StreamableValue', 'StreamCorruptedException',
+ 'StreamTokenizer', 'StrictMath', 'String',
+ 'StringBuffer', 'StringBufferInputStream',
+ 'StringCharacterIterator', 'StringContent',
+ 'StringHolder', 'StringIndexOutOfBoundsException',
+ 'StringReader', 'StringRefAddr', 'StringSelection',
+ 'StringTokenizer', 'StringValueHelper',
+ 'StringWriter', 'Stroke', 'Struct', 'StructMember',
+ 'StructMemberHelper', 'Stub', 'StubDelegate',
+ 'StubNotFoundException', 'Style', 'StyleConstants',
+ 'StyleConstants.CharacterConstants',
+ 'StyleConstants.ColorConstants',
+ 'StyleConstants.FontConstants',
+ 'StyleConstants.ParagraphConstants', 'StyleContext',
+ 'StyledDocument', 'StyledEditorKit',
+ 'StyledEditorKit.AlignmentAction',
+ 'StyledEditorKit.BoldAction',
+ 'StyledEditorKit.FontFamilyAction',
+ 'StyledEditorKit.FontSizeAction',
+ 'StyledEditorKit.ForegroundAction',
+ 'StyledEditorKit.ItalicAction',
+ 'StyledEditorKit.StyledTextAction',
+ 'StyledEditorKit.UnderlineAction', 'StyleSheet',
+ 'StyleSheet.BoxPainter', 'StyleSheet.ListPainter',
+ 'SwingConstants', 'SwingPropertyChangeSupport',
+ 'SwingUtilities', 'SyncFailedException',
+ 'Synthesizer', 'SysexMessage', 'System',
+ 'SystemColor', 'SystemException', 'SystemFlavorMap',
+ 'TabableView', 'TabbedPaneUI', 'TabExpander',
+ 'TableCellEditor', 'TableCellRenderer',
+ 'TableColumn', 'TableColumnModel',
+ 'TableColumnModelEvent', 'TableColumnModelListener',
+ 'TableHeaderUI', 'TableModel', 'TableModelEvent',
+ 'TableModelListener', 'TableUI', 'TableView',
+ 'TabSet', 'TabStop', 'TagElement', 'TargetDataLine',
+ 'TCKind', 'TextAction', 'TextArea', 'TextAttribute',
+ 'TextComponent', 'TextEvent', 'TextField',
+ 'TextHitInfo', 'TextLayout',
+ 'TextLayout.CaretPolicy', 'TextListener',
+ 'TextMeasurer', 'TextUI', 'TexturePaint', 'Thread',
+ 'ThreadDeath', 'ThreadGroup', 'ThreadLocal',
+ 'Throwable', 'Tie', 'TileObserver', 'Time',
+ 'TimeLimitExceededException', 'Timer',
+ 'TimerTask', 'Timestamp', 'TimeZone', 'TitledBorder',
+ 'ToolBarUI', 'Toolkit', 'ToolTipManager',
+ 'ToolTipUI', 'TooManyListenersException', 'Track',
+ 'TransactionRequiredException',
+ 'TransactionRolledbackException',
+ 'TRANSACTION_REQUIRED', 'TRANSACTION_ROLLEDBACK',
+ 'Transferable', 'TransformAttribute', 'TRANSIENT',
+ 'Transmitter', 'Transparency', 'TreeCellEditor',
+ 'TreeCellRenderer', 'TreeExpansionEvent',
+ 'TreeExpansionListener', 'TreeMap', 'TreeModel',
+ 'TreeModelEvent', 'TreeModelListener', 'TreeNode',
+ 'TreePath', 'TreeSelectionEvent',
+ 'TreeSelectionListener', 'TreeSelectionModel',
+ 'TreeSet', 'TreeUI', 'TreeWillExpandListener',
+ 'TypeCode', 'TypeCodeHolder', 'TypeMismatch',
+ 'Types', 'UID', 'UIDefaults',
+ 'UIDefaults.ActiveValue', 'UIDefaults.LazyInputMap',
+ 'UIDefaults.LazyValue', 'UIDefaults.ProxyLazyValue',
+ 'UIManager', 'UIManager.LookAndFeelInfo',
+ 'UIResource', 'ULongLongSeqHelper',
+ 'ULongLongSeqHolder', 'ULongSeqHelper',
+ 'ULongSeqHolder', 'UndeclaredThrowableException',
+ 'UndoableEdit', 'UndoableEditEvent',
+ 'UndoableEditListener', 'UndoableEditSupport',
+ 'UndoManager', 'UnexpectedException',
+ 'UnicastRemoteObject', 'UnionMember',
+ 'UnionMemberHelper', 'UNKNOWN', 'UnknownError',
+ 'UnknownException', 'UnknownGroupException',
+ 'UnknownHostException',
+ 'UnknownObjectException', 'UnknownServiceException',
+ 'UnknownUserException', 'UnmarshalException',
+ 'UnrecoverableKeyException', 'Unreferenced',
+ 'UnresolvedPermission', 'UnsatisfiedLinkError',
+ 'UnsolicitedNotification',
+ 'UnsolicitedNotificationEvent',
+ 'UnsolicitedNotificationListener',
+ 'UnsupportedAudioFileException',
+ 'UnsupportedClassVersionError',
+ 'UnsupportedEncodingException',
+ 'UnsupportedFlavorException',
+ 'UnsupportedLookAndFeelException',
+ 'UnsupportedOperationException',
+ 'UNSUPPORTED_POLICY', 'UNSUPPORTED_POLICY_VALUE',
+ 'URL', 'URLClassLoader', 'URLConnection',
+ 'URLDecoder', 'URLEncoder', 'URLStreamHandler',
+ 'URLStreamHandlerFactory', 'UserException',
+ 'UShortSeqHelper', 'UShortSeqHolder',
+ 'UTFDataFormatException', 'Util', 'UtilDelegate',
+ 'Utilities', 'ValueBase', 'ValueBaseHelper',
+ 'ValueBaseHolder', 'ValueFactory', 'ValueHandler',
+ 'ValueMember', 'ValueMemberHelper',
+ 'VariableHeightLayoutCache', 'Vector', 'VerifyError',
+ 'VersionSpecHelper', 'VetoableChangeListener',
+ 'VetoableChangeSupport', 'View', 'ViewFactory',
+ 'ViewportLayout', 'ViewportUI',
+ 'VirtualMachineError', 'Visibility',
+ 'VisibilityHelper', 'VMID', 'VM_ABSTRACT',
+ 'VM_CUSTOM', 'VM_NONE', 'VM_TRUNCATABLE',
+ 'VoiceStatus', 'Void', 'WCharSeqHelper',
+ 'WCharSeqHolder', 'WeakHashMap', 'WeakReference',
+ 'Window', 'WindowAdapter', 'WindowConstants',
+ 'WindowEvent', 'WindowListener', 'WrappedPlainView',
+ 'WritableRaster', 'WritableRenderedImage',
+ 'WriteAbortedException', 'Writer',
+ 'WrongTransaction', 'WStringValueHelper',
+ 'X509Certificate', 'X509CRL', 'X509CRLEntry',
+ 'X509EncodedKeySpec', 'X509Extension', 'ZipEntry',
+ 'ZipException', 'ZipFile', 'ZipInputStream',
+ 'ZipOutputStream', 'ZoneView',
+ '_BindingIteratorImplBase', '_BindingIteratorStub',
+ '_IDLTypeStub', '_NamingContextImplBase',
+ '_NamingContextStub', '_PolicyStub', '_Remote_Stub'
+ ),
+ 4 => array(
+ 'void', 'double', 'int', 'boolean', 'byte', 'short', 'long', 'char', 'float'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}',
+ '+', '-', '*', '/', '%',
+ '!', '&', '|', '^',
+ '<', '>', '=',
+ '?', ':', ';',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => true,
+ 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #000066; font-weight: bold;',
+ 3 => 'color: #003399;',
+ 4 => 'color: #000066; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #006699;',
+ 3 => 'color: #008000; font-style: italic; font-weight: bold;',
+ 3 => 'color: #008000; font-style: italic; font-weight: bold;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006633;',
+ 2 => 'color: #006633;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.google.com/search?hl=en&amp;q=allinurl%3Adocs.oracle.com+javase+docs+api+{FNAMEL}',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/java5.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/java5.php
new file mode 100644
index 00000000..af16bd1e
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/java5.php
@@ -0,0 +1,1037 @@
+<?php
+/*************************************************************************************
+ * java.php
+ * --------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/07/10
+ *
+ * Java language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/25 (1.0.7.22)
+ * - Added highlighting of import and package directives as non-OOP
+ * 2005/12/28 (1.0.4)
+ * - Added instanceof keyword
+ * 2004/11/27 (1.0.3)
+ * - Added support for multiple object splitters
+ * 2004/08/05 (1.0.2)
+ * - Added URL support
+ * - Added keyword "this", as bugs in GeSHi class ironed out
+ * 2004/08/05 (1.0.1)
+ * - Added support for symbols
+ * - Added extra missed keywords
+ * 2004/07/14 (1.0.0)
+ * - First Release
+ *
+ * TODO
+ * -------------------------
+ * *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Java(TM) 2 Platform Standard Edition 5.0',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Import and Package directives (Basic Support only)
+ 2 => '/(?:(?<=import[\\n\\s](?!static))|(?<=import[\\n\\s]static[\\n\\s])|(?<=package[\\n\\s]))[\\n\\s]*([a-zA-Z0-9_]+\\.)*([a-zA-Z0-9_]+|\*)(?=[\n\s;])/i',
+ // javadoc comments
+ 3 => '#/\*\*(?![\*\/]).*\*/#sU'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ /* see the authoritative list of all 50 Java keywords at */
+ /* http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#229308 */
+
+ /* java keywords, part 1: control flow */
+ 'case', 'default', 'do', 'else', 'for',
+ 'goto', 'if', 'switch', 'while'
+
+ /* IMO 'break', 'continue', 'return' and 'throw' */
+ /* should also be added to this group, as they */
+ /* also manage the control flow, */
+ /* arguably 'try'/'catch'/'finally' as well */
+ ),
+ 2 => array(
+ /* java keywords, part 2 */
+
+ 'break', 'continue', 'return', 'throw',
+ 'try', 'catch', 'finally',
+
+ 'abstract', 'assert', 'class', 'const', 'enum', 'extends',
+ 'final', 'implements', 'import', 'instanceof', 'interface',
+ 'native', 'new', 'package', 'private', 'protected',
+ 'public', 'static', 'strictfp', 'super', 'synchronized',
+ 'this', 'throws', 'transient', 'volatile'
+ ),
+ 3 => array(
+ /* Java keywords, part 3: primitive data types and 'void' */
+ 'boolean', 'byte', 'char', 'double',
+ 'float', 'int', 'long', 'short', 'void'
+ ),
+ 4 => array(
+ /* other reserved words in Java: literals */
+ /* should be styled to look similar to numbers and Strings */
+ 'false', 'null', 'true'
+ ),
+ 5 => array (
+ 'Applet', 'AppletContext', 'AppletStub', 'AudioClip'
+ ),
+ 6 => array (
+ 'AWTError', 'AWTEvent', 'AWTEventMulticaster', 'AWTException', 'AWTKeyStroke', 'AWTPermission', 'ActiveEvent', 'Adjustable', 'AlphaComposite', 'BasicStroke', 'BorderLayout', 'BufferCapabilities', 'BufferCapabilities.FlipContents', 'Button', 'Canvas', 'CardLayout', 'Checkbox', 'CheckboxGroup', 'CheckboxMenuItem', 'Choice', 'Color', 'Component', 'ComponentOrientation', 'Composite', 'CompositeContext', 'Container', 'ContainerOrderFocusTraversalPolicy', 'Cursor', 'DefaultFocusTraversalPolicy', 'DefaultKeyboardFocusManager', 'Dialog', 'Dimension', 'DisplayMode', 'EventQueue', 'FileDialog', 'FlowLayout', 'FocusTraversalPolicy', 'Font', 'FontFormatException', 'FontMetrics', 'Frame', 'GradientPaint', 'Graphics', 'Graphics2D', 'GraphicsConfigTemplate', 'GraphicsConfiguration', 'GraphicsDevice', 'GraphicsEnvironment', 'GridBagConstraints', 'GridBagLayout', 'GridLayout', 'HeadlessException', 'IllegalComponentStateException', 'Image', 'ImageCapabilities', 'Insets', 'ItemSelectable', 'JobAttributes',
+ 'JobAttributes.DefaultSelectionType', 'JobAttributes.DestinationType', 'JobAttributes.DialogType', 'JobAttributes.MultipleDocumentHandlingType', 'JobAttributes.SidesType', 'KeyEventDispatcher', 'KeyEventPostProcessor', 'KeyboardFocusManager', 'Label', 'LayoutManager', 'LayoutManager2', 'MediaTracker', 'Menu', 'MenuBar', 'MenuComponent', 'MenuContainer', 'MenuItem', 'MenuShortcut', 'MouseInfo', 'PageAttributes', 'PageAttributes.ColorType', 'PageAttributes.MediaType', 'PageAttributes.OrientationRequestedType', 'PageAttributes.OriginType', 'PageAttributes.PrintQualityType', 'Paint', 'PaintContext', 'Panel', 'Point', 'PointerInfo', 'Polygon', 'PopupMenu', 'PrintGraphics', 'PrintJob', 'Rectangle', 'RenderingHints', 'RenderingHints.Key', 'Robot', 'ScrollPane', 'ScrollPaneAdjustable', 'Scrollbar', 'Shape', 'Stroke', 'SystemColor', 'TextArea', 'TextComponent', 'TextField', 'TexturePaint', 'Toolkit', 'Transparency', 'Window'
+ ),
+ 7 => array (
+ 'CMMException', 'ColorSpace', 'ICC_ColorSpace', 'ICC_Profile', 'ICC_ProfileGray', 'ICC_ProfileRGB', 'ProfileDataException'
+ ),
+ 8 => array (
+ 'Clipboard', 'ClipboardOwner', 'DataFlavor', 'FlavorEvent', 'FlavorListener', 'FlavorMap', 'FlavorTable', 'MimeTypeParseException', 'StringSelection', 'SystemFlavorMap', 'Transferable', 'UnsupportedFlavorException'
+ ),
+ 9 => array (
+ 'Autoscroll', 'DnDConstants', 'DragGestureEvent', 'DragGestureListener', 'DragGestureRecognizer', 'DragSource', 'DragSourceAdapter', 'DragSourceContext', 'DragSourceDragEvent', 'DragSourceDropEvent', 'DragSourceEvent', 'DragSourceListener', 'DragSourceMotionListener', 'DropTarget', 'DropTarget.DropTargetAutoScroller', 'DropTargetAdapter', 'DropTargetContext', 'DropTargetDragEvent', 'DropTargetDropEvent', 'DropTargetEvent', 'DropTargetListener', 'InvalidDnDOperationException', 'MouseDragGestureRecognizer'
+ ),
+ 10 => array (
+ 'AWTEventListener', 'AWTEventListenerProxy', 'ActionEvent', 'ActionListener', 'AdjustmentEvent', 'AdjustmentListener', 'ComponentAdapter', 'ComponentEvent', 'ComponentListener', 'ContainerAdapter', 'ContainerEvent', 'ContainerListener', 'FocusAdapter', 'FocusEvent', 'FocusListener', 'HierarchyBoundsAdapter', 'HierarchyBoundsListener', 'HierarchyEvent', 'HierarchyListener', 'InputEvent', 'InputMethodEvent', 'InputMethodListener', 'InvocationEvent', 'ItemEvent', 'ItemListener', 'KeyAdapter', 'KeyEvent', 'KeyListener', 'MouseAdapter', 'MouseListener', 'MouseMotionAdapter', 'MouseMotionListener', 'MouseWheelEvent', 'MouseWheelListener', 'PaintEvent', 'TextEvent', 'TextListener', 'WindowAdapter', 'WindowEvent', 'WindowFocusListener', 'WindowListener', 'WindowStateListener'
+ ),
+ 11 => array (
+ 'FontRenderContext', 'GlyphJustificationInfo', 'GlyphMetrics', 'GlyphVector', 'GraphicAttribute', 'ImageGraphicAttribute', 'LineBreakMeasurer', 'LineMetrics', 'MultipleMaster', 'NumericShaper', 'ShapeGraphicAttribute', 'TextAttribute', 'TextHitInfo', 'TextLayout', 'TextLayout.CaretPolicy', 'TextMeasurer', 'TransformAttribute'
+ ),
+ 12 => array (
+ 'AffineTransform', 'Arc2D', 'Arc2D.Double', 'Arc2D.Float', 'Area', 'CubicCurve2D', 'CubicCurve2D.Double', 'CubicCurve2D.Float', 'Dimension2D', 'Ellipse2D', 'Ellipse2D.Double', 'Ellipse2D.Float', 'FlatteningPathIterator', 'GeneralPath', 'IllegalPathStateException', 'Line2D', 'Line2D.Double', 'Line2D.Float', 'NoninvertibleTransformException', 'PathIterator', 'Point2D', 'Point2D.Double', 'Point2D.Float', 'QuadCurve2D', 'QuadCurve2D.Double', 'QuadCurve2D.Float', 'Rectangle2D', 'Rectangle2D.Double', 'Rectangle2D.Float', 'RectangularShape', 'RoundRectangle2D', 'RoundRectangle2D.Double', 'RoundRectangle2D.Float'
+ ),
+ 13 => array (
+ 'InputContext', 'InputMethodHighlight', 'InputMethodRequests', 'InputSubset'
+ ),
+ 14 => array (
+ 'InputMethod', 'InputMethodContext', 'InputMethodDescriptor'
+ ),
+ 15 => array (
+ 'AffineTransformOp', 'AreaAveragingScaleFilter', 'BandCombineOp', 'BandedSampleModel', 'BufferStrategy', 'BufferedImage', 'BufferedImageFilter', 'BufferedImageOp', 'ByteLookupTable', 'ColorConvertOp', 'ColorModel', 'ComponentColorModel', 'ComponentSampleModel', 'ConvolveOp', 'CropImageFilter', 'DataBuffer', 'DataBufferByte', 'DataBufferDouble', 'DataBufferFloat', 'DataBufferInt', 'DataBufferShort', 'DataBufferUShort', 'DirectColorModel', 'FilteredImageSource', 'ImageConsumer', 'ImageFilter', 'ImageObserver', 'ImageProducer', 'ImagingOpException', 'IndexColorModel', 'Kernel', 'LookupOp', 'LookupTable', 'MemoryImageSource', 'MultiPixelPackedSampleModel', 'PackedColorModel', 'PixelGrabber', 'PixelInterleavedSampleModel', 'RGBImageFilter', 'Raster', 'RasterFormatException', 'RasterOp', 'RenderedImage', 'ReplicateScaleFilter', 'RescaleOp', 'SampleModel', 'ShortLookupTable', 'SinglePixelPackedSampleModel', 'TileObserver', 'VolatileImage', 'WritableRaster', 'WritableRenderedImage'
+ ),
+ 16 => array (
+ 'ContextualRenderedImageFactory', 'ParameterBlock', 'RenderContext', 'RenderableImage', 'RenderableImageOp', 'RenderableImageProducer', 'RenderedImageFactory'
+ ),
+ 17 => array (
+ 'Book', 'PageFormat', 'Pageable', 'Paper', 'Printable', 'PrinterAbortException', 'PrinterException', 'PrinterGraphics', 'PrinterIOException', 'PrinterJob'
+ ),
+ 18 => array (
+ 'AppletInitializer', 'BeanDescriptor', 'BeanInfo', 'Beans', 'Customizer', 'DefaultPersistenceDelegate', 'DesignMode', 'Encoder', 'EventHandler', 'EventSetDescriptor', 'ExceptionListener', 'Expression', 'FeatureDescriptor', 'IndexedPropertyChangeEvent', 'IndexedPropertyDescriptor', 'Introspector', 'MethodDescriptor', 'ParameterDescriptor', 'PersistenceDelegate', 'PropertyChangeEvent', 'PropertyChangeListener', 'PropertyChangeListenerProxy', 'PropertyChangeSupport', 'PropertyDescriptor', 'PropertyEditor', 'PropertyEditorManager', 'PropertyEditorSupport', 'PropertyVetoException', 'SimpleBeanInfo', 'VetoableChangeListener', 'VetoableChangeListenerProxy', 'VetoableChangeSupport', 'Visibility', 'XMLDecoder', 'XMLEncoder'
+ ),
+ 19 => array (
+ 'BeanContext', 'BeanContextChild', 'BeanContextChildComponentProxy', 'BeanContextChildSupport', 'BeanContextContainerProxy', 'BeanContextEvent', 'BeanContextMembershipEvent', 'BeanContextMembershipListener', 'BeanContextProxy', 'BeanContextServiceAvailableEvent', 'BeanContextServiceProvider', 'BeanContextServiceProviderBeanInfo', 'BeanContextServiceRevokedEvent', 'BeanContextServiceRevokedListener', 'BeanContextServices', 'BeanContextServicesListener', 'BeanContextServicesSupport', 'BeanContextServicesSupport.BCSSServiceProvider', 'BeanContextSupport', 'BeanContextSupport.BCSIterator'
+ ),
+ 20 => array (
+ 'BufferedInputStream', 'BufferedOutputStream', 'BufferedReader', 'BufferedWriter', 'ByteArrayInputStream', 'ByteArrayOutputStream', 'CharArrayReader', 'CharArrayWriter', 'CharConversionException', 'Closeable', 'DataInput', 'DataOutput', 'EOFException', 'Externalizable', 'File', 'FileDescriptor', 'FileInputStream', 'FileNotFoundException', 'FileOutputStream', 'FilePermission', 'FileReader', 'FileWriter', 'FilenameFilter', 'FilterInputStream', 'FilterOutputStream', 'FilterReader', 'FilterWriter', 'Flushable', 'IOException', 'InputStreamReader', 'InterruptedIOException', 'InvalidClassException', 'InvalidObjectException', 'LineNumberInputStream', 'LineNumberReader', 'NotActiveException', 'NotSerializableException', 'ObjectInput', 'ObjectInputStream', 'ObjectInputStream.GetField', 'ObjectInputValidation', 'ObjectOutput', 'ObjectOutputStream', 'ObjectOutputStream.PutField', 'ObjectStreamClass', 'ObjectStreamConstants', 'ObjectStreamException', 'ObjectStreamField', 'OptionalDataException', 'OutputStreamWriter',
+ 'PipedInputStream', 'PipedOutputStream', 'PipedReader', 'PipedWriter', 'PrintStream', 'PrintWriter', 'PushbackInputStream', 'PushbackReader', 'RandomAccessFile', 'Reader', 'SequenceInputStream', 'Serializable', 'SerializablePermission', 'StreamCorruptedException', 'StreamTokenizer', 'StringBufferInputStream', 'StringReader', 'StringWriter', 'SyncFailedException', 'UTFDataFormatException', 'UnsupportedEncodingException', 'WriteAbortedException', 'Writer'
+ ),
+ 21 => array (
+ 'AbstractMethodError', 'Appendable', 'ArithmeticException', 'ArrayIndexOutOfBoundsException', 'ArrayStoreException', 'AssertionError', 'Boolean', 'Byte', 'CharSequence', 'Character', 'Character.Subset', 'Character.UnicodeBlock', 'Class', 'ClassCastException', 'ClassCircularityError', 'ClassFormatError', 'ClassLoader', 'ClassNotFoundException', 'CloneNotSupportedException', 'Cloneable', 'Comparable', 'Compiler', 'Deprecated', 'Double', 'Enum', 'EnumConstantNotPresentException', 'Error', 'Exception', 'ExceptionInInitializerError', 'Float', 'IllegalAccessError', 'IllegalAccessException', 'IllegalArgumentException', 'IllegalMonitorStateException', 'IllegalStateException', 'IllegalThreadStateException', 'IncompatibleClassChangeError', 'IndexOutOfBoundsException', 'InheritableThreadLocal', 'InstantiationError', 'InstantiationException', 'Integer', 'InternalError', 'InterruptedException', 'Iterable', 'LinkageError', 'Long', 'Math', 'NegativeArraySizeException', 'NoClassDefFoundError', 'NoSuchFieldError',
+ 'NoSuchFieldException', 'NoSuchMethodError', 'NoSuchMethodException', 'NullPointerException', 'Number', 'NumberFormatException', 'OutOfMemoryError', 'Override', 'Package', 'Process', 'ProcessBuilder', 'Readable', 'Runnable', 'Runtime', 'RuntimeException', 'RuntimePermission', 'SecurityException', 'SecurityManager', 'Short', 'StackOverflowError', 'StackTraceElement', 'StrictMath', 'String', 'StringBuffer', 'StringBuilder', 'StringIndexOutOfBoundsException', 'SuppressWarnings', 'System', 'Thread', 'Thread.State', 'Thread.UncaughtExceptionHandler', 'ThreadDeath', 'ThreadGroup', 'ThreadLocal', 'Throwable', 'TypeNotPresentException', 'UnknownError', 'UnsatisfiedLinkError', 'UnsupportedClassVersionError', 'UnsupportedOperationException', 'VerifyError', 'VirtualMachineError', 'Void'
+ ),
+ 22 => array (
+ 'AnnotationFormatError', 'AnnotationTypeMismatchException', 'Documented', 'ElementType', 'IncompleteAnnotationException', 'Inherited', 'Retention', 'RetentionPolicy', 'Target'
+ ),
+ 23 => array (
+ 'ClassDefinition', 'ClassFileTransformer', 'IllegalClassFormatException', 'Instrumentation', 'UnmodifiableClassException'
+ ),
+ 24 => array (
+ 'ClassLoadingMXBean', 'CompilationMXBean', 'GarbageCollectorMXBean', 'ManagementFactory', 'ManagementPermission', 'MemoryMXBean', 'MemoryManagerMXBean', 'MemoryNotificationInfo', 'MemoryPoolMXBean', 'MemoryType', 'MemoryUsage', 'OperatingSystemMXBean', 'RuntimeMXBean', 'ThreadInfo', 'ThreadMXBean'
+ ),
+ 25 => array (
+ 'PhantomReference', 'ReferenceQueue', 'SoftReference', 'WeakReference'
+ ),
+ 26 => array (
+ 'AccessibleObject', 'AnnotatedElement', 'Constructor', 'Field', 'GenericArrayType', 'GenericDeclaration', 'GenericSignatureFormatError', 'InvocationHandler', 'InvocationTargetException', 'MalformedParameterizedTypeException', 'Member', 'Method', 'Modifier', 'ParameterizedType', 'ReflectPermission', 'Type', 'TypeVariable', 'UndeclaredThrowableException', 'WildcardType'
+ ),
+ 27 => array (
+ 'BigDecimal', 'BigInteger', 'MathContext', 'RoundingMode'
+ ),
+ 28 => array (
+ 'Authenticator', 'Authenticator.RequestorType', 'BindException', 'CacheRequest', 'CacheResponse', 'ContentHandlerFactory', 'CookieHandler', 'DatagramPacket', 'DatagramSocket', 'DatagramSocketImpl', 'DatagramSocketImplFactory', 'FileNameMap', 'HttpRetryException', 'HttpURLConnection', 'Inet4Address', 'Inet6Address', 'InetAddress', 'InetSocketAddress', 'JarURLConnection', 'MalformedURLException', 'MulticastSocket', 'NetPermission', 'NetworkInterface', 'NoRouteToHostException', 'PasswordAuthentication', 'PortUnreachableException', 'ProtocolException', 'Proxy.Type', 'ProxySelector', 'ResponseCache', 'SecureCacheResponse', 'ServerSocket', 'Socket', 'SocketAddress', 'SocketException', 'SocketImpl', 'SocketImplFactory', 'SocketOptions', 'SocketPermission', 'SocketTimeoutException', 'URI', 'URISyntaxException', 'URL', 'URLClassLoader', 'URLConnection', 'URLDecoder', 'URLEncoder', 'URLStreamHandler', 'URLStreamHandlerFactory', 'UnknownServiceException'
+ ),
+ 29 => array (
+ 'Buffer', 'BufferOverflowException', 'BufferUnderflowException', 'ByteBuffer', 'ByteOrder', 'CharBuffer', 'DoubleBuffer', 'FloatBuffer', 'IntBuffer', 'InvalidMarkException', 'LongBuffer', 'MappedByteBuffer', 'ReadOnlyBufferException', 'ShortBuffer'
+ ),
+ 30 => array (
+ 'AlreadyConnectedException', 'AsynchronousCloseException', 'ByteChannel', 'CancelledKeyException', 'Channel', 'Channels', 'ClosedByInterruptException', 'ClosedChannelException', 'ClosedSelectorException', 'ConnectionPendingException', 'DatagramChannel', 'FileChannel', 'FileChannel.MapMode', 'FileLock', 'FileLockInterruptionException', 'GatheringByteChannel', 'IllegalBlockingModeException', 'IllegalSelectorException', 'InterruptibleChannel', 'NoConnectionPendingException', 'NonReadableChannelException', 'NonWritableChannelException', 'NotYetBoundException', 'NotYetConnectedException', 'OverlappingFileLockException', 'Pipe', 'Pipe.SinkChannel', 'Pipe.SourceChannel', 'ReadableByteChannel', 'ScatteringByteChannel', 'SelectableChannel', 'SelectionKey', 'Selector', 'ServerSocketChannel', 'SocketChannel', 'UnresolvedAddressException', 'UnsupportedAddressTypeException', 'WritableByteChannel'
+ ),
+ 31 => array (
+ 'AbstractInterruptibleChannel', 'AbstractSelectableChannel', 'AbstractSelectionKey', 'AbstractSelector', 'SelectorProvider'
+ ),
+ 32 => array (
+ 'CharacterCodingException', 'Charset', 'CharsetDecoder', 'CharsetEncoder', 'CoderMalfunctionError', 'CoderResult', 'CodingErrorAction', 'IllegalCharsetNameException', 'MalformedInputException', 'UnmappableCharacterException', 'UnsupportedCharsetException'
+ ),
+ 33 => array (
+ 'CharsetProvider'
+ ),
+ 34 => array (
+ 'AccessException', 'AlreadyBoundException', 'ConnectIOException', 'MarshalException', 'MarshalledObject', 'Naming', 'NoSuchObjectException', 'NotBoundException', 'RMISecurityException', 'RMISecurityManager', 'Remote', 'RemoteException', 'ServerError', 'ServerException', 'ServerRuntimeException', 'StubNotFoundException', 'UnexpectedException', 'UnmarshalException'
+ ),
+ 35 => array (
+ 'Activatable', 'ActivateFailedException', 'ActivationDesc', 'ActivationException', 'ActivationGroup', 'ActivationGroupDesc', 'ActivationGroupDesc.CommandEnvironment', 'ActivationGroupID', 'ActivationGroup_Stub', 'ActivationID', 'ActivationInstantiator', 'ActivationMonitor', 'ActivationSystem', 'Activator', 'UnknownGroupException', 'UnknownObjectException'
+ ),
+ 36 => array (
+ 'DGC', 'Lease', 'VMID'
+ ),
+ 37 => array (
+ 'LocateRegistry', 'Registry', 'RegistryHandler'
+ ),
+ 38 => array (
+ 'ExportException', 'LoaderHandler', 'LogStream', 'ObjID', 'Operation', 'RMIClassLoader', 'RMIClassLoaderSpi', 'RMIClientSocketFactory', 'RMIFailureHandler', 'RMIServerSocketFactory', 'RMISocketFactory', 'RemoteCall', 'RemoteObject', 'RemoteObjectInvocationHandler', 'RemoteRef', 'RemoteServer', 'RemoteStub', 'ServerCloneException', 'ServerNotActiveException', 'ServerRef', 'Skeleton', 'SkeletonMismatchException', 'SkeletonNotFoundException', 'SocketSecurityException', 'UID', 'UnicastRemoteObject', 'Unreferenced'
+ ),
+ 39 => array (
+ 'AccessControlContext', 'AccessControlException', 'AccessController', 'AlgorithmParameterGenerator', 'AlgorithmParameterGeneratorSpi', 'AlgorithmParameters', 'AlgorithmParametersSpi', 'AllPermission', 'AuthProvider', 'BasicPermission', 'CodeSigner', 'CodeSource', 'DigestException', 'DigestInputStream', 'DigestOutputStream', 'DomainCombiner', 'GeneralSecurityException', 'Guard', 'GuardedObject', 'Identity', 'IdentityScope', 'InvalidAlgorithmParameterException', 'InvalidParameterException', 'Key', 'KeyException', 'KeyFactory', 'KeyFactorySpi', 'KeyManagementException', 'KeyPair', 'KeyPairGenerator', 'KeyPairGeneratorSpi', 'KeyRep', 'KeyRep.Type', 'KeyStore', 'KeyStore.Builder', 'KeyStore.CallbackHandlerProtection', 'KeyStore.Entry', 'KeyStore.LoadStoreParameter', 'KeyStore.PasswordProtection', 'KeyStore.PrivateKeyEntry', 'KeyStore.ProtectionParameter', 'KeyStore.SecretKeyEntry', 'KeyStore.TrustedCertificateEntry', 'KeyStoreException', 'KeyStoreSpi', 'MessageDigest', 'MessageDigestSpi',
+ 'NoSuchAlgorithmException', 'NoSuchProviderException', 'PermissionCollection', 'Permissions', 'PrivateKey', 'PrivilegedAction', 'PrivilegedActionException', 'PrivilegedExceptionAction', 'ProtectionDomain', 'Provider', 'Provider.Service', 'ProviderException', 'PublicKey', 'SecureClassLoader', 'SecureRandom', 'SecureRandomSpi', 'Security', 'SecurityPermission', 'Signature', 'SignatureException', 'SignatureSpi', 'SignedObject', 'Signer', 'UnrecoverableEntryException', 'UnrecoverableKeyException', 'UnresolvedPermission'
+ ),
+ 40 => array (
+ 'Acl', 'AclEntry', 'AclNotFoundException', 'Group', 'LastOwnerException', 'NotOwnerException', 'Owner'
+ ),
+ 41 => array (
+ 'CRL', 'CRLException', 'CRLSelector', 'CertPath', 'CertPath.CertPathRep', 'CertPathBuilder', 'CertPathBuilderException', 'CertPathBuilderResult', 'CertPathBuilderSpi', 'CertPathParameters', 'CertPathValidator', 'CertPathValidatorException', 'CertPathValidatorResult', 'CertPathValidatorSpi', 'CertSelector', 'CertStore', 'CertStoreException', 'CertStoreParameters', 'CertStoreSpi', 'Certificate.CertificateRep', 'CertificateFactory', 'CertificateFactorySpi', 'CollectionCertStoreParameters', 'LDAPCertStoreParameters', 'PKIXBuilderParameters', 'PKIXCertPathBuilderResult', 'PKIXCertPathChecker', 'PKIXCertPathValidatorResult', 'PKIXParameters', 'PolicyNode', 'PolicyQualifierInfo', 'TrustAnchor', 'X509CRL', 'X509CRLEntry', 'X509CRLSelector', 'X509CertSelector', 'X509Extension'
+ ),
+ 42 => array (
+ 'DSAKey', 'DSAKeyPairGenerator', 'DSAParams', 'DSAPrivateKey', 'DSAPublicKey', 'ECKey', 'ECPrivateKey', 'ECPublicKey', 'RSAKey', 'RSAMultiPrimePrivateCrtKey', 'RSAPrivateCrtKey', 'RSAPrivateKey', 'RSAPublicKey'
+ ),
+ 43 => array (
+ 'AlgorithmParameterSpec', 'DSAParameterSpec', 'DSAPrivateKeySpec', 'DSAPublicKeySpec', 'ECField', 'ECFieldF2m', 'ECFieldFp', 'ECGenParameterSpec', 'ECParameterSpec', 'ECPoint', 'ECPrivateKeySpec', 'ECPublicKeySpec', 'EllipticCurve', 'EncodedKeySpec', 'InvalidKeySpecException', 'InvalidParameterSpecException', 'KeySpec', 'MGF1ParameterSpec', 'PKCS8EncodedKeySpec', 'PSSParameterSpec', 'RSAKeyGenParameterSpec', 'RSAMultiPrimePrivateCrtKeySpec', 'RSAOtherPrimeInfo', 'RSAPrivateCrtKeySpec', 'RSAPrivateKeySpec', 'RSAPublicKeySpec', 'X509EncodedKeySpec'
+ ),
+ 44 => array (
+ 'BatchUpdateException', 'Blob', 'CallableStatement', 'Clob', 'Connection', 'DataTruncation', 'DatabaseMetaData', 'Driver', 'DriverManager', 'DriverPropertyInfo', 'ParameterMetaData', 'PreparedStatement', 'Ref', 'ResultSet', 'ResultSetMetaData', 'SQLData', 'SQLException', 'SQLInput', 'SQLOutput', 'SQLPermission', 'SQLWarning', 'Savepoint', 'Struct', 'Time', 'Types'
+ ),
+ 45 => array (
+ 'AttributedCharacterIterator', 'AttributedCharacterIterator.Attribute', 'AttributedString', 'Bidi', 'BreakIterator', 'CharacterIterator', 'ChoiceFormat', 'CollationElementIterator', 'CollationKey', 'Collator', 'DateFormat', 'DateFormat.Field', 'DateFormatSymbols', 'DecimalFormat', 'DecimalFormatSymbols', 'FieldPosition', 'Format', 'Format.Field', 'MessageFormat', 'MessageFormat.Field', 'NumberFormat', 'NumberFormat.Field', 'ParseException', 'ParsePosition', 'RuleBasedCollator', 'SimpleDateFormat', 'StringCharacterIterator'
+ ),
+ 46 => array (
+ 'AbstractCollection', 'AbstractList', 'AbstractMap', 'AbstractQueue', 'AbstractSequentialList', 'AbstractSet', 'ArrayList', 'Arrays', 'BitSet', 'Calendar', 'Collection', 'Collections', 'Comparator', 'ConcurrentModificationException', 'Currency', 'Dictionary', 'DuplicateFormatFlagsException', 'EmptyStackException', 'EnumMap', 'EnumSet', 'Enumeration', 'EventListenerProxy', 'EventObject', 'FormatFlagsConversionMismatchException', 'Formattable', 'FormattableFlags', 'Formatter.BigDecimalLayoutForm', 'FormatterClosedException', 'GregorianCalendar', 'HashMap', 'HashSet', 'Hashtable', 'IdentityHashMap', 'IllegalFormatCodePointException', 'IllegalFormatConversionException', 'IllegalFormatException', 'IllegalFormatFlagsException', 'IllegalFormatPrecisionException', 'IllegalFormatWidthException', 'InputMismatchException', 'InvalidPropertiesFormatException', 'Iterator', 'LinkedHashMap', 'LinkedHashSet', 'LinkedList', 'ListIterator', 'ListResourceBundle', 'Locale', 'Map', 'Map.Entry', 'MissingFormatArgumentException',
+ 'MissingFormatWidthException', 'MissingResourceException', 'NoSuchElementException', 'Observable', 'Observer', 'PriorityQueue', 'Properties', 'PropertyPermission', 'PropertyResourceBundle', 'Queue', 'Random', 'RandomAccess', 'ResourceBundle', 'Scanner', 'Set', 'SimpleTimeZone', 'SortedMap', 'SortedSet', 'Stack', 'StringTokenizer', 'TimeZone', 'TimerTask', 'TooManyListenersException', 'TreeMap', 'TreeSet', 'UUID', 'UnknownFormatConversionException', 'UnknownFormatFlagsException', 'Vector', 'WeakHashMap'
+ ),
+ 47 => array (
+ 'AbstractExecutorService', 'ArrayBlockingQueue', 'BlockingQueue', 'BrokenBarrierException', 'Callable', 'CancellationException', 'CompletionService', 'ConcurrentHashMap', 'ConcurrentLinkedQueue', 'ConcurrentMap', 'CopyOnWriteArrayList', 'CopyOnWriteArraySet', 'CountDownLatch', 'CyclicBarrier', 'DelayQueue', 'Delayed', 'Exchanger', 'ExecutionException', 'Executor', 'ExecutorCompletionService', 'ExecutorService', 'Executors', 'Future', 'FutureTask', 'LinkedBlockingQueue', 'PriorityBlockingQueue', 'RejectedExecutionException', 'RejectedExecutionHandler', 'ScheduledExecutorService', 'ScheduledFuture', 'ScheduledThreadPoolExecutor', 'Semaphore', 'SynchronousQueue', 'ThreadFactory', 'ThreadPoolExecutor', 'ThreadPoolExecutor.AbortPolicy', 'ThreadPoolExecutor.CallerRunsPolicy', 'ThreadPoolExecutor.DiscardOldestPolicy', 'ThreadPoolExecutor.DiscardPolicy', 'TimeUnit', 'TimeoutException'
+ ),
+ 48 => array (
+ 'AtomicBoolean', 'AtomicInteger', 'AtomicIntegerArray', 'AtomicIntegerFieldUpdater', 'AtomicLong', 'AtomicLongArray', 'AtomicLongFieldUpdater', 'AtomicMarkableReference', 'AtomicReference', 'AtomicReferenceArray', 'AtomicReferenceFieldUpdater', 'AtomicStampedReference'
+ ),
+ 49 => array (
+ 'AbstractQueuedSynchronizer', 'Condition', 'Lock', 'LockSupport', 'ReadWriteLock', 'ReentrantLock', 'ReentrantReadWriteLock', 'ReentrantReadWriteLock.ReadLock', 'ReentrantReadWriteLock.WriteLock'
+ ),
+ 50 => array (
+ 'Attributes.Name', 'JarEntry', 'JarException', 'JarFile', 'JarInputStream', 'JarOutputStream', 'Manifest', 'Pack200', 'Pack200.Packer', 'Pack200.Unpacker'
+ ),
+ 51 => array (
+ 'ConsoleHandler', 'ErrorManager', 'FileHandler', 'Filter', 'Handler', 'Level', 'LogManager', 'LogRecord', 'Logger', 'LoggingMXBean', 'LoggingPermission', 'MemoryHandler', 'SimpleFormatter', 'SocketHandler', 'StreamHandler', 'XMLFormatter'
+ ),
+ 52 => array (
+ 'AbstractPreferences', 'BackingStoreException', 'InvalidPreferencesFormatException', 'NodeChangeEvent', 'NodeChangeListener', 'PreferenceChangeEvent', 'PreferenceChangeListener', 'Preferences', 'PreferencesFactory'
+ ),
+ 53 => array (
+ 'MatchResult', 'Matcher', 'Pattern', 'PatternSyntaxException'
+ ),
+ 54 => array (
+ 'Adler32', 'CRC32', 'CheckedInputStream', 'CheckedOutputStream', 'Checksum', 'DataFormatException', 'Deflater', 'DeflaterOutputStream', 'GZIPInputStream', 'GZIPOutputStream', 'Inflater', 'InflaterInputStream', 'ZipEntry', 'ZipException', 'ZipFile', 'ZipInputStream', 'ZipOutputStream'
+ ),
+ 55 => array (
+ 'Accessible', 'AccessibleAction', 'AccessibleAttributeSequence', 'AccessibleBundle', 'AccessibleComponent', 'AccessibleContext', 'AccessibleEditableText', 'AccessibleExtendedComponent', 'AccessibleExtendedTable', 'AccessibleExtendedText', 'AccessibleHyperlink', 'AccessibleHypertext', 'AccessibleIcon', 'AccessibleKeyBinding', 'AccessibleRelation', 'AccessibleRelationSet', 'AccessibleResourceBundle', 'AccessibleRole', 'AccessibleSelection', 'AccessibleState', 'AccessibleStateSet', 'AccessibleStreamable', 'AccessibleTable', 'AccessibleTableModelChange', 'AccessibleText', 'AccessibleTextSequence', 'AccessibleValue'
+ ),
+ 56 => array (
+ 'ActivityCompletedException', 'ActivityRequiredException', 'InvalidActivityException'
+ ),
+ 57 => array (
+ 'BadPaddingException', 'Cipher', 'CipherInputStream', 'CipherOutputStream', 'CipherSpi', 'EncryptedPrivateKeyInfo', 'ExemptionMechanism', 'ExemptionMechanismException', 'ExemptionMechanismSpi', 'IllegalBlockSizeException', 'KeyAgreement', 'KeyAgreementSpi', 'KeyGenerator', 'KeyGeneratorSpi', 'Mac', 'MacSpi', 'NoSuchPaddingException', 'NullCipher', 'SealedObject', 'SecretKey', 'SecretKeyFactory', 'SecretKeyFactorySpi', 'ShortBufferException'
+ ),
+ 58 => array (
+ 'DHKey', 'DHPrivateKey', 'DHPublicKey', 'PBEKey'
+ ),
+ 59 => array (
+ 'DESKeySpec', 'DESedeKeySpec', 'DHGenParameterSpec', 'DHParameterSpec', 'DHPrivateKeySpec', 'DHPublicKeySpec', 'IvParameterSpec', 'OAEPParameterSpec', 'PBEKeySpec', 'PBEParameterSpec', 'PSource', 'PSource.PSpecified', 'RC2ParameterSpec', 'RC5ParameterSpec', 'SecretKeySpec'
+ ),
+ 60 => array (
+ 'IIOException', 'IIOImage', 'IIOParam', 'IIOParamController', 'ImageIO', 'ImageReadParam', 'ImageReader', 'ImageTranscoder', 'ImageTypeSpecifier', 'ImageWriteParam', 'ImageWriter'
+ ),
+ 61 => array (
+ 'IIOReadProgressListener', 'IIOReadUpdateListener', 'IIOReadWarningListener', 'IIOWriteProgressListener', 'IIOWriteWarningListener'
+ ),
+ 62 => array (
+ 'IIOInvalidTreeException', 'IIOMetadata', 'IIOMetadataController', 'IIOMetadataFormat', 'IIOMetadataFormatImpl', 'IIOMetadataNode'
+ ),
+ 63 => array (
+ 'BMPImageWriteParam'
+ ),
+ 64 => array (
+ 'JPEGHuffmanTable', 'JPEGImageReadParam', 'JPEGImageWriteParam', 'JPEGQTable'
+ ),
+ 65 => array (
+ 'IIORegistry', 'IIOServiceProvider', 'ImageInputStreamSpi', 'ImageOutputStreamSpi', 'ImageReaderSpi', 'ImageReaderWriterSpi', 'ImageTranscoderSpi', 'ImageWriterSpi', 'RegisterableService', 'ServiceRegistry', 'ServiceRegistry.Filter'
+ ),
+ 66 => array (
+ 'FileCacheImageInputStream', 'FileCacheImageOutputStream', 'FileImageInputStream', 'FileImageOutputStream', 'IIOByteBuffer', 'ImageInputStream', 'ImageInputStreamImpl', 'ImageOutputStream', 'ImageOutputStreamImpl', 'MemoryCacheImageInputStream', 'MemoryCacheImageOutputStream'
+ ),
+ 67 => array (
+ 'AttributeChangeNotification', 'AttributeChangeNotificationFilter', 'AttributeNotFoundException', 'AttributeValueExp', 'BadAttributeValueExpException', 'BadBinaryOpValueExpException', 'BadStringOperationException', 'Descriptor', 'DescriptorAccess', 'DynamicMBean', 'InstanceAlreadyExistsException', 'InstanceNotFoundException', 'InvalidApplicationException', 'JMException', 'JMRuntimeException', 'ListenerNotFoundException', 'MBeanAttributeInfo', 'MBeanConstructorInfo', 'MBeanException', 'MBeanFeatureInfo', 'MBeanInfo', 'MBeanNotificationInfo', 'MBeanOperationInfo', 'MBeanParameterInfo', 'MBeanPermission', 'MBeanRegistration', 'MBeanRegistrationException', 'MBeanServer', 'MBeanServerBuilder', 'MBeanServerConnection', 'MBeanServerDelegate', 'MBeanServerDelegateMBean', 'MBeanServerFactory', 'MBeanServerInvocationHandler', 'MBeanServerNotification', 'MBeanServerPermission', 'MBeanTrustPermission', 'MalformedObjectNameException', 'NotCompliantMBeanException', 'Notification', 'NotificationBroadcaster',
+ 'NotificationBroadcasterSupport', 'NotificationEmitter', 'NotificationFilter', 'NotificationFilterSupport', 'NotificationListener', 'ObjectInstance', 'ObjectName', 'OperationsException', 'PersistentMBean', 'Query', 'QueryEval', 'QueryExp', 'ReflectionException', 'RuntimeErrorException', 'RuntimeMBeanException', 'RuntimeOperationsException', 'ServiceNotFoundException', 'StandardMBean', 'StringValueExp', 'ValueExp'
+ ),
+ 68 => array (
+ 'ClassLoaderRepository', 'MLet', 'MLetMBean', 'PrivateClassLoader', 'PrivateMLet'
+ ),
+ 69 => array (
+ 'DescriptorSupport', 'InvalidTargetObjectTypeException', 'ModelMBean', 'ModelMBeanAttributeInfo', 'ModelMBeanConstructorInfo', 'ModelMBeanInfo', 'ModelMBeanInfoSupport', 'ModelMBeanNotificationBroadcaster', 'ModelMBeanNotificationInfo', 'ModelMBeanOperationInfo', 'RequiredModelMBean', 'XMLParseException'
+ ),
+ 70 => array (
+ 'CounterMonitor', 'CounterMonitorMBean', 'GaugeMonitor', 'GaugeMonitorMBean', 'Monitor', 'MonitorMBean', 'MonitorNotification', 'MonitorSettingException', 'StringMonitor', 'StringMonitorMBean'
+ ),
+ 71 => array (
+ 'ArrayType', 'CompositeData', 'CompositeDataSupport', 'CompositeType', 'InvalidOpenTypeException', 'KeyAlreadyExistsException', 'OpenDataException', 'OpenMBeanAttributeInfo', 'OpenMBeanAttributeInfoSupport', 'OpenMBeanConstructorInfo', 'OpenMBeanConstructorInfoSupport', 'OpenMBeanInfo', 'OpenMBeanInfoSupport', 'OpenMBeanOperationInfo', 'OpenMBeanOperationInfoSupport', 'OpenMBeanParameterInfo', 'OpenMBeanParameterInfoSupport', 'SimpleType', 'TabularData', 'TabularDataSupport', 'TabularType'
+ ),
+ 72 => array (
+ 'InvalidRelationIdException', 'InvalidRelationServiceException', 'InvalidRelationTypeException', 'InvalidRoleInfoException', 'InvalidRoleValueException', 'MBeanServerNotificationFilter', 'Relation', 'RelationException', 'RelationNotFoundException', 'RelationNotification', 'RelationService', 'RelationServiceMBean', 'RelationServiceNotRegisteredException', 'RelationSupport', 'RelationSupportMBean', 'RelationType', 'RelationTypeNotFoundException', 'RelationTypeSupport', 'Role', 'RoleInfo', 'RoleInfoNotFoundException', 'RoleList', 'RoleNotFoundException', 'RoleResult', 'RoleStatus', 'RoleUnresolved', 'RoleUnresolvedList'
+ ),
+ 73 => array (
+ 'JMXAuthenticator', 'JMXConnectionNotification', 'JMXConnector', 'JMXConnectorFactory', 'JMXConnectorProvider', 'JMXConnectorServer', 'JMXConnectorServerFactory', 'JMXConnectorServerMBean', 'JMXConnectorServerProvider', 'JMXPrincipal', 'JMXProviderException', 'JMXServerErrorException', 'JMXServiceURL', 'MBeanServerForwarder', 'NotificationResult', 'SubjectDelegationPermission', 'TargetedNotification'
+ ),
+ 74 => array (
+ 'RMIConnection', 'RMIConnectionImpl', 'RMIConnectionImpl_Stub', 'RMIConnector', 'RMIConnectorServer', 'RMIIIOPServerImpl', 'RMIJRMPServerImpl', 'RMIServer', 'RMIServerImpl', 'RMIServerImpl_Stub'
+ ),
+ 75 => array (
+ 'TimerAlarmClockNotification', 'TimerMBean', 'TimerNotification'
+ ),
+ 76 => array (
+ 'AuthenticationNotSupportedException', 'BinaryRefAddr', 'CannotProceedException', 'CommunicationException', 'CompositeName', 'CompoundName', 'ConfigurationException', 'ContextNotEmptyException', 'InitialContext', 'InsufficientResourcesException', 'InterruptedNamingException', 'InvalidNameException', 'LimitExceededException', 'LinkException', 'LinkLoopException', 'LinkRef', 'MalformedLinkException', 'Name', 'NameAlreadyBoundException', 'NameClassPair', 'NameNotFoundException', 'NameParser', 'NamingEnumeration', 'NamingException', 'NamingSecurityException', 'NoInitialContextException', 'NoPermissionException', 'NotContextException', 'OperationNotSupportedException', 'PartialResultException', 'RefAddr', 'Referenceable', 'ReferralException', 'ServiceUnavailableException', 'SizeLimitExceededException', 'StringRefAddr', 'TimeLimitExceededException'
+ ),
+ 77 => array (
+ 'AttributeInUseException', 'AttributeModificationException', 'BasicAttribute', 'BasicAttributes', 'DirContext', 'InitialDirContext', 'InvalidAttributeIdentifierException', 'InvalidAttributesException', 'InvalidSearchControlsException', 'InvalidSearchFilterException', 'ModificationItem', 'NoSuchAttributeException', 'SchemaViolationException', 'SearchControls', 'SearchResult'
+ ),
+ 78 => array (
+ 'EventContext', 'EventDirContext', 'NamespaceChangeListener', 'NamingEvent', 'NamingExceptionEvent', 'NamingListener', 'ObjectChangeListener'
+ ),
+ 79 => array (
+ 'BasicControl', 'ControlFactory', 'ExtendedRequest', 'ExtendedResponse', 'HasControls', 'InitialLdapContext', 'LdapContext', 'LdapName', 'LdapReferralException', 'ManageReferralControl', 'PagedResultsControl', 'PagedResultsResponseControl', 'Rdn', 'SortControl', 'SortKey', 'SortResponseControl', 'StartTlsRequest', 'StartTlsResponse', 'UnsolicitedNotification', 'UnsolicitedNotificationEvent', 'UnsolicitedNotificationListener'
+ ),
+ 80 => array (
+ 'DirObjectFactory', 'DirStateFactory', 'DirStateFactory.Result', 'DirectoryManager', 'InitialContextFactory', 'InitialContextFactoryBuilder', 'NamingManager', 'ObjectFactory', 'ObjectFactoryBuilder', 'ResolveResult', 'Resolver', 'StateFactory'
+ ),
+ 81 => array (
+ 'ServerSocketFactory', 'SocketFactory'
+ ),
+ 82 => array (
+ 'CertPathTrustManagerParameters', 'HandshakeCompletedEvent', 'HandshakeCompletedListener', 'HostnameVerifier', 'HttpsURLConnection', 'KeyManager', 'KeyManagerFactory', 'KeyManagerFactorySpi', 'KeyStoreBuilderParameters', 'ManagerFactoryParameters', 'SSLContext', 'SSLContextSpi', 'SSLEngine', 'SSLEngineResult', 'SSLEngineResult.HandshakeStatus', 'SSLEngineResult.Status', 'SSLException', 'SSLHandshakeException', 'SSLKeyException', 'SSLPeerUnverifiedException', 'SSLPermission', 'SSLProtocolException', 'SSLServerSocket', 'SSLServerSocketFactory', 'SSLSession', 'SSLSessionBindingEvent', 'SSLSessionBindingListener', 'SSLSessionContext', 'SSLSocket', 'SSLSocketFactory', 'TrustManager', 'TrustManagerFactory', 'TrustManagerFactorySpi', 'X509ExtendedKeyManager', 'X509KeyManager', 'X509TrustManager'
+ ),
+ 83 => array (
+ 'AttributeException', 'CancelablePrintJob', 'Doc', 'DocFlavor', 'DocFlavor.BYTE_ARRAY', 'DocFlavor.CHAR_ARRAY', 'DocFlavor.INPUT_STREAM', 'DocFlavor.READER', 'DocFlavor.SERVICE_FORMATTED', 'DocFlavor.STRING', 'DocFlavor.URL', 'DocPrintJob', 'FlavorException', 'MultiDoc', 'MultiDocPrintJob', 'MultiDocPrintService', 'PrintException', 'PrintService', 'PrintServiceLookup', 'ServiceUI', 'ServiceUIFactory', 'SimpleDoc', 'StreamPrintService', 'StreamPrintServiceFactory', 'URIException'
+ ),
+ 84 => array (
+ 'AttributeSetUtilities', 'DateTimeSyntax', 'DocAttribute', 'DocAttributeSet', 'EnumSyntax', 'HashAttributeSet', 'HashDocAttributeSet', 'HashPrintJobAttributeSet', 'HashPrintRequestAttributeSet', 'HashPrintServiceAttributeSet', 'IntegerSyntax', 'PrintJobAttribute', 'PrintJobAttributeSet', 'PrintRequestAttribute', 'PrintRequestAttributeSet', 'PrintServiceAttribute', 'PrintServiceAttributeSet', 'ResolutionSyntax', 'SetOfIntegerSyntax', 'Size2DSyntax', 'SupportedValuesAttribute', 'TextSyntax', 'URISyntax', 'UnmodifiableSetException'
+ ),
+ 85 => array (
+ 'Chromaticity', 'ColorSupported', 'Compression', 'Copies', 'CopiesSupported', 'DateTimeAtCompleted', 'DateTimeAtCreation', 'DateTimeAtProcessing', 'Destination', 'DocumentName', 'Fidelity', 'Finishings', 'JobHoldUntil', 'JobImpressions', 'JobImpressionsCompleted', 'JobImpressionsSupported', 'JobKOctets', 'JobKOctetsProcessed', 'JobKOctetsSupported', 'JobMediaSheets', 'JobMediaSheetsCompleted', 'JobMediaSheetsSupported', 'JobMessageFromOperator', 'JobName', 'JobOriginatingUserName', 'JobPriority', 'JobPrioritySupported', 'JobSheets', 'JobState', 'JobStateReason', 'JobStateReasons', 'Media', 'MediaName', 'MediaPrintableArea', 'MediaSize', 'MediaSize.Engineering', 'MediaSize.ISO', 'MediaSize.JIS', 'MediaSize.NA', 'MediaSize.Other', 'MediaSizeName', 'MediaTray', 'MultipleDocumentHandling', 'NumberOfDocuments', 'NumberOfInterveningJobs', 'NumberUp', 'NumberUpSupported', 'OrientationRequested', 'OutputDeviceAssigned', 'PDLOverrideSupported', 'PageRanges', 'PagesPerMinute', 'PagesPerMinuteColor',
+ 'PresentationDirection', 'PrintQuality', 'PrinterInfo', 'PrinterIsAcceptingJobs', 'PrinterLocation', 'PrinterMakeAndModel', 'PrinterMessageFromOperator', 'PrinterMoreInfo', 'PrinterMoreInfoManufacturer', 'PrinterName', 'PrinterResolution', 'PrinterState', 'PrinterStateReason', 'PrinterStateReasons', 'PrinterURI', 'QueuedJobCount', 'ReferenceUriSchemesSupported', 'RequestingUserName', 'Severity', 'SheetCollate', 'Sides'
+ ),
+ 86 => array (
+ 'PrintEvent', 'PrintJobAdapter', 'PrintJobAttributeEvent', 'PrintJobAttributeListener', 'PrintJobEvent', 'PrintJobListener', 'PrintServiceAttributeEvent', 'PrintServiceAttributeListener'
+ ),
+ 87 => array (
+ 'PortableRemoteObject'
+ ),
+ 88 => array (
+ 'ClassDesc', 'PortableRemoteObjectDelegate', 'Stub', 'StubDelegate', 'Tie', 'Util', 'UtilDelegate', 'ValueHandler', 'ValueHandlerMultiFormat'
+ ),
+ 89 => array (
+ 'SslRMIClientSocketFactory', 'SslRMIServerSocketFactory'
+ ),
+ 90 => array (
+ 'AuthPermission', 'DestroyFailedException', 'Destroyable', 'PrivateCredentialPermission', 'RefreshFailedException', 'Refreshable', 'Subject', 'SubjectDomainCombiner'
+ ),
+ 91 => array (
+ 'Callback', 'CallbackHandler', 'ChoiceCallback', 'ConfirmationCallback', 'LanguageCallback', 'NameCallback', 'PasswordCallback', 'TextInputCallback', 'TextOutputCallback', 'UnsupportedCallbackException'
+ ),
+ 92 => array (
+ 'DelegationPermission', 'KerberosKey', 'KerberosPrincipal', 'KerberosTicket', 'ServicePermission'
+ ),
+ 93 => array (
+ 'AccountException', 'AccountExpiredException', 'AccountLockedException', 'AccountNotFoundException', 'AppConfigurationEntry', 'AppConfigurationEntry.LoginModuleControlFlag', 'Configuration', 'CredentialException', 'CredentialExpiredException', 'CredentialNotFoundException', 'FailedLoginException', 'LoginContext', 'LoginException'
+ ),
+ 94 => array (
+ 'LoginModule'
+ ),
+ 95 => array (
+ 'X500Principal', 'X500PrivateCredential'
+ ),
+ 96 => array (
+ 'AuthorizeCallback', 'RealmCallback', 'RealmChoiceCallback', 'Sasl', 'SaslClient', 'SaslClientFactory', 'SaslException', 'SaslServer', 'SaslServerFactory'
+ ),
+ 97 => array (
+ 'ControllerEventListener', 'Instrument', 'InvalidMidiDataException', 'MetaEventListener', 'MetaMessage', 'MidiChannel', 'MidiDevice', 'MidiDevice.Info', 'MidiEvent', 'MidiFileFormat', 'MidiMessage', 'MidiSystem', 'MidiUnavailableException', 'Patch', 'Receiver', 'Sequence', 'Sequencer', 'Sequencer.SyncMode', 'ShortMessage', 'Soundbank', 'SoundbankResource', 'Synthesizer', 'SysexMessage', 'Track', 'Transmitter', 'VoiceStatus'
+ ),
+ 98 => array (
+ 'MidiDeviceProvider', 'MidiFileReader', 'MidiFileWriter', 'SoundbankReader'
+ ),
+ 99 => array (
+ 'AudioFileFormat', 'AudioFileFormat.Type', 'AudioFormat', 'AudioFormat.Encoding', 'AudioInputStream', 'AudioPermission', 'AudioSystem', 'BooleanControl', 'BooleanControl.Type', 'Clip', 'CompoundControl', 'CompoundControl.Type', 'Control.Type', 'DataLine', 'DataLine.Info', 'EnumControl', 'EnumControl.Type', 'FloatControl', 'FloatControl.Type', 'Line', 'Line.Info', 'LineEvent', 'LineEvent.Type', 'LineListener', 'LineUnavailableException', 'Mixer', 'Mixer.Info', 'Port', 'Port.Info', 'ReverbType', 'SourceDataLine', 'TargetDataLine', 'UnsupportedAudioFileException'
+ ),
+ 100 => array (
+ 'AudioFileReader', 'AudioFileWriter', 'FormatConversionProvider', 'MixerProvider'
+ ),
+ 101 => array (
+ 'ConnectionEvent', 'ConnectionEventListener', 'ConnectionPoolDataSource', 'DataSource', 'PooledConnection', 'RowSet', 'RowSetEvent', 'RowSetInternal', 'RowSetListener', 'RowSetMetaData', 'RowSetReader', 'RowSetWriter', 'XAConnection', 'XADataSource'
+ ),
+ 102 => array (
+ 'BaseRowSet', 'CachedRowSet', 'FilteredRowSet', 'JdbcRowSet', 'JoinRowSet', 'Joinable', 'Predicate', 'RowSetMetaDataImpl', 'RowSetWarning', 'WebRowSet'
+ ),
+ 103 => array (
+ 'SQLInputImpl', 'SQLOutputImpl', 'SerialArray', 'SerialBlob', 'SerialClob', 'SerialDatalink', 'SerialException', 'SerialJavaObject', 'SerialRef', 'SerialStruct'
+ ),
+ 104 => array (
+ 'SyncFactory', 'SyncFactoryException', 'SyncProvider', 'SyncProviderException', 'SyncResolver', 'TransactionalWriter', 'XmlReader', 'XmlWriter'
+ ),
+ 105 => array (
+ 'AbstractAction', 'AbstractButton', 'AbstractCellEditor', 'AbstractListModel', 'AbstractSpinnerModel', 'Action', 'ActionMap', 'BorderFactory', 'BoundedRangeModel', 'Box', 'Box.Filler', 'BoxLayout', 'ButtonGroup', 'ButtonModel', 'CellEditor', 'CellRendererPane', 'ComboBoxEditor', 'ComboBoxModel', 'ComponentInputMap', 'DebugGraphics', 'DefaultBoundedRangeModel', 'DefaultButtonModel', 'DefaultCellEditor', 'DefaultComboBoxModel', 'DefaultDesktopManager', 'DefaultFocusManager', 'DefaultListCellRenderer', 'DefaultListCellRenderer.UIResource', 'DefaultListModel', 'DefaultListSelectionModel', 'DefaultSingleSelectionModel', 'DesktopManager', 'FocusManager', 'GrayFilter', 'Icon', 'ImageIcon', 'InputMap', 'InputVerifier', 'InternalFrameFocusTraversalPolicy', 'JApplet', 'JButton', 'JCheckBox', 'JCheckBoxMenuItem', 'JColorChooser', 'JComboBox', 'JComboBox.KeySelectionManager', 'JComponent', 'JDesktopPane', 'JDialog', 'JEditorPane', 'JFileChooser', 'JFormattedTextField', 'JFormattedTextField.AbstractFormatter',
+ 'JFormattedTextField.AbstractFormatterFactory', 'JFrame', 'JInternalFrame', 'JInternalFrame.JDesktopIcon', 'JLabel', 'JLayeredPane', 'JList', 'JMenu', 'JMenuBar', 'JMenuItem', 'JOptionPane', 'JPanel', 'JPasswordField', 'JPopupMenu', 'JPopupMenu.Separator', 'JProgressBar', 'JRadioButton', 'JRadioButtonMenuItem', 'JRootPane', 'JScrollBar', 'JScrollPane', 'JSeparator', 'JSlider', 'JSpinner', 'JSpinner.DateEditor', 'JSpinner.DefaultEditor', 'JSpinner.ListEditor', 'JSpinner.NumberEditor', 'JSplitPane', 'JTabbedPane', 'JTable', 'JTable.PrintMode', 'JTextArea', 'JTextField', 'JTextPane', 'JToggleButton', 'JToggleButton.ToggleButtonModel', 'JToolBar', 'JToolBar.Separator', 'JToolTip', 'JTree', 'JTree.DynamicUtilTreeNode', 'JTree.EmptySelectionModel', 'JViewport', 'JWindow', 'KeyStroke', 'LayoutFocusTraversalPolicy', 'ListCellRenderer', 'ListModel', 'ListSelectionModel', 'LookAndFeel', 'MenuElement', 'MenuSelectionManager', 'MutableComboBoxModel', 'OverlayLayout', 'Popup', 'PopupFactory', 'ProgressMonitor',
+ 'ProgressMonitorInputStream', 'Renderer', 'RepaintManager', 'RootPaneContainer', 'ScrollPaneConstants', 'ScrollPaneLayout', 'ScrollPaneLayout.UIResource', 'Scrollable', 'SingleSelectionModel', 'SizeRequirements', 'SizeSequence', 'SortingFocusTraversalPolicy', 'SpinnerDateModel', 'SpinnerListModel', 'SpinnerModel', 'SpinnerNumberModel', 'Spring', 'SpringLayout', 'SpringLayout.Constraints', 'SwingConstants', 'SwingUtilities', 'ToolTipManager', 'TransferHandler', 'UIDefaults', 'UIDefaults.ActiveValue', 'UIDefaults.LazyInputMap', 'UIDefaults.LazyValue', 'UIDefaults.ProxyLazyValue', 'UIManager', 'UIManager.LookAndFeelInfo', 'UnsupportedLookAndFeelException', 'ViewportLayout', 'WindowConstants'
+ ),
+ 106 => array (
+ 'AbstractBorder', 'BevelBorder', 'Border', 'CompoundBorder', 'EmptyBorder', 'EtchedBorder', 'LineBorder', 'MatteBorder', 'SoftBevelBorder', 'TitledBorder'
+ ),
+ 107 => array (
+ 'AbstractColorChooserPanel', 'ColorChooserComponentFactory', 'ColorSelectionModel', 'DefaultColorSelectionModel'
+ ),
+ 108 => array (
+ 'AncestorEvent', 'AncestorListener', 'CaretEvent', 'CaretListener', 'CellEditorListener', 'ChangeEvent', 'ChangeListener', 'DocumentEvent.ElementChange', 'DocumentEvent.EventType', 'DocumentListener', 'EventListenerList', 'HyperlinkEvent', 'HyperlinkEvent.EventType', 'HyperlinkListener', 'InternalFrameAdapter', 'InternalFrameEvent', 'InternalFrameListener', 'ListDataEvent', 'ListDataListener', 'ListSelectionEvent', 'ListSelectionListener', 'MenuDragMouseEvent', 'MenuDragMouseListener', 'MenuEvent', 'MenuKeyEvent', 'MenuKeyListener', 'MenuListener', 'MouseInputAdapter', 'MouseInputListener', 'PopupMenuEvent', 'PopupMenuListener', 'SwingPropertyChangeSupport', 'TableColumnModelEvent', 'TableColumnModelListener', 'TableModelEvent', 'TableModelListener', 'TreeExpansionEvent', 'TreeExpansionListener', 'TreeModelEvent', 'TreeModelListener', 'TreeSelectionEvent', 'TreeSelectionListener', 'TreeWillExpandListener', 'UndoableEditEvent', 'UndoableEditListener'
+ ),
+ 109 => array (
+ 'FileSystemView', 'FileView'
+ ),
+ 110 => array (
+ 'ActionMapUIResource', 'BorderUIResource', 'BorderUIResource.BevelBorderUIResource', 'BorderUIResource.CompoundBorderUIResource', 'BorderUIResource.EmptyBorderUIResource', 'BorderUIResource.EtchedBorderUIResource', 'BorderUIResource.LineBorderUIResource', 'BorderUIResource.MatteBorderUIResource', 'BorderUIResource.TitledBorderUIResource', 'ButtonUI', 'ColorChooserUI', 'ColorUIResource', 'ComboBoxUI', 'ComponentInputMapUIResource', 'ComponentUI', 'DesktopIconUI', 'DesktopPaneUI', 'DimensionUIResource', 'FileChooserUI', 'FontUIResource', 'IconUIResource', 'InputMapUIResource', 'InsetsUIResource', 'InternalFrameUI', 'LabelUI', 'ListUI', 'MenuBarUI', 'MenuItemUI', 'OptionPaneUI', 'PanelUI', 'PopupMenuUI', 'ProgressBarUI', 'RootPaneUI', 'ScrollBarUI', 'ScrollPaneUI', 'SeparatorUI', 'SliderUI', 'SpinnerUI', 'SplitPaneUI', 'TabbedPaneUI', 'TableHeaderUI', 'TableUI', 'TextUI', 'ToolBarUI', 'ToolTipUI', 'TreeUI', 'UIResource', 'ViewportUI'
+ ),
+ 111 => array (
+ 'BasicArrowButton', 'BasicBorders', 'BasicBorders.ButtonBorder', 'BasicBorders.FieldBorder', 'BasicBorders.MarginBorder', 'BasicBorders.MenuBarBorder', 'BasicBorders.RadioButtonBorder', 'BasicBorders.RolloverButtonBorder', 'BasicBorders.SplitPaneBorder', 'BasicBorders.ToggleButtonBorder', 'BasicButtonListener', 'BasicButtonUI', 'BasicCheckBoxMenuItemUI', 'BasicCheckBoxUI', 'BasicColorChooserUI', 'BasicComboBoxEditor', 'BasicComboBoxEditor.UIResource', 'BasicComboBoxRenderer', 'BasicComboBoxRenderer.UIResource', 'BasicComboBoxUI', 'BasicComboPopup', 'BasicDesktopIconUI', 'BasicDesktopPaneUI', 'BasicDirectoryModel', 'BasicEditorPaneUI', 'BasicFileChooserUI', 'BasicFormattedTextFieldUI', 'BasicGraphicsUtils', 'BasicHTML', 'BasicIconFactory', 'BasicInternalFrameTitlePane', 'BasicInternalFrameUI', 'BasicLabelUI', 'BasicListUI', 'BasicLookAndFeel', 'BasicMenuBarUI', 'BasicMenuItemUI', 'BasicMenuUI', 'BasicOptionPaneUI', 'BasicOptionPaneUI.ButtonAreaLayout', 'BasicPanelUI', 'BasicPasswordFieldUI',
+ 'BasicPopupMenuSeparatorUI', 'BasicPopupMenuUI', 'BasicProgressBarUI', 'BasicRadioButtonMenuItemUI', 'BasicRadioButtonUI', 'BasicRootPaneUI', 'BasicScrollBarUI', 'BasicScrollPaneUI', 'BasicSeparatorUI', 'BasicSliderUI', 'BasicSpinnerUI', 'BasicSplitPaneDivider', 'BasicSplitPaneUI', 'BasicTabbedPaneUI', 'BasicTableHeaderUI', 'BasicTableUI', 'BasicTextAreaUI', 'BasicTextFieldUI', 'BasicTextPaneUI', 'BasicTextUI', 'BasicTextUI.BasicCaret', 'BasicTextUI.BasicHighlighter', 'BasicToggleButtonUI', 'BasicToolBarSeparatorUI', 'BasicToolBarUI', 'BasicToolTipUI', 'BasicTreeUI', 'BasicViewportUI', 'ComboPopup', 'DefaultMenuLayout'
+ ),
+ 112 => array (
+ 'DefaultMetalTheme', 'MetalBorders', 'MetalBorders.ButtonBorder', 'MetalBorders.Flush3DBorder', 'MetalBorders.InternalFrameBorder', 'MetalBorders.MenuBarBorder', 'MetalBorders.MenuItemBorder', 'MetalBorders.OptionDialogBorder', 'MetalBorders.PaletteBorder', 'MetalBorders.PopupMenuBorder', 'MetalBorders.RolloverButtonBorder', 'MetalBorders.ScrollPaneBorder', 'MetalBorders.TableHeaderBorder', 'MetalBorders.TextFieldBorder', 'MetalBorders.ToggleButtonBorder', 'MetalBorders.ToolBarBorder', 'MetalButtonUI', 'MetalCheckBoxIcon', 'MetalCheckBoxUI', 'MetalComboBoxButton', 'MetalComboBoxEditor', 'MetalComboBoxEditor.UIResource', 'MetalComboBoxIcon', 'MetalComboBoxUI', 'MetalDesktopIconUI', 'MetalFileChooserUI', 'MetalIconFactory', 'MetalIconFactory.FileIcon16', 'MetalIconFactory.FolderIcon16', 'MetalIconFactory.PaletteCloseIcon', 'MetalIconFactory.TreeControlIcon', 'MetalIconFactory.TreeFolderIcon', 'MetalIconFactory.TreeLeafIcon', 'MetalInternalFrameTitlePane', 'MetalInternalFrameUI', 'MetalLabelUI',
+ 'MetalLookAndFeel', 'MetalMenuBarUI', 'MetalPopupMenuSeparatorUI', 'MetalProgressBarUI', 'MetalRadioButtonUI', 'MetalRootPaneUI', 'MetalScrollBarUI', 'MetalScrollButton', 'MetalScrollPaneUI', 'MetalSeparatorUI', 'MetalSliderUI', 'MetalSplitPaneUI', 'MetalTabbedPaneUI', 'MetalTextFieldUI', 'MetalTheme', 'MetalToggleButtonUI', 'MetalToolBarUI', 'MetalToolTipUI', 'MetalTreeUI', 'OceanTheme'
+ ),
+ 113 => array (
+ 'MultiButtonUI', 'MultiColorChooserUI', 'MultiComboBoxUI', 'MultiDesktopIconUI', 'MultiDesktopPaneUI', 'MultiFileChooserUI', 'MultiInternalFrameUI', 'MultiLabelUI', 'MultiListUI', 'MultiLookAndFeel', 'MultiMenuBarUI', 'MultiMenuItemUI', 'MultiOptionPaneUI', 'MultiPanelUI', 'MultiPopupMenuUI', 'MultiProgressBarUI', 'MultiRootPaneUI', 'MultiScrollBarUI', 'MultiScrollPaneUI', 'MultiSeparatorUI', 'MultiSliderUI', 'MultiSpinnerUI', 'MultiSplitPaneUI', 'MultiTabbedPaneUI', 'MultiTableHeaderUI', 'MultiTableUI', 'MultiTextUI', 'MultiToolBarUI', 'MultiToolTipUI', 'MultiTreeUI', 'MultiViewportUI'
+ ),
+ 114 => array (
+ 'ColorType', 'Region', 'SynthConstants', 'SynthContext', 'SynthGraphicsUtils', 'SynthLookAndFeel', 'SynthPainter', 'SynthStyle', 'SynthStyleFactory'
+ ),
+ 115 => array (
+ 'AbstractTableModel', 'DefaultTableCellRenderer', 'DefaultTableCellRenderer.UIResource', 'DefaultTableColumnModel', 'DefaultTableModel', 'JTableHeader', 'TableCellEditor', 'TableCellRenderer', 'TableColumn', 'TableColumnModel', 'TableModel'
+ ),
+ 116 => array (
+ 'AbstractDocument', 'AbstractDocument.AttributeContext', 'AbstractDocument.Content', 'AbstractDocument.ElementEdit', 'AbstractWriter', 'AsyncBoxView', 'AttributeSet.CharacterAttribute', 'AttributeSet.ColorAttribute', 'AttributeSet.FontAttribute', 'AttributeSet.ParagraphAttribute', 'BadLocationException', 'BoxView', 'Caret', 'ChangedCharSetException', 'ComponentView', 'CompositeView', 'DateFormatter', 'DefaultCaret', 'DefaultEditorKit', 'DefaultEditorKit.BeepAction', 'DefaultEditorKit.CopyAction', 'DefaultEditorKit.CutAction', 'DefaultEditorKit.DefaultKeyTypedAction', 'DefaultEditorKit.InsertBreakAction', 'DefaultEditorKit.InsertContentAction', 'DefaultEditorKit.InsertTabAction', 'DefaultEditorKit.PasteAction', 'DefaultFormatter', 'DefaultFormatterFactory', 'DefaultHighlighter', 'DefaultHighlighter.DefaultHighlightPainter', 'DefaultStyledDocument', 'DefaultStyledDocument.AttributeUndoableEdit', 'DefaultStyledDocument.ElementSpec', 'DefaultTextUI', 'DocumentFilter', 'DocumentFilter.FilterBypass',
+ 'EditorKit', 'ElementIterator', 'FieldView', 'FlowView', 'FlowView.FlowStrategy', 'GapContent', 'GlyphView', 'GlyphView.GlyphPainter', 'Highlighter', 'Highlighter.Highlight', 'Highlighter.HighlightPainter', 'IconView', 'InternationalFormatter', 'JTextComponent', 'JTextComponent.KeyBinding', 'Keymap', 'LabelView', 'LayeredHighlighter', 'LayeredHighlighter.LayerPainter', 'LayoutQueue', 'MaskFormatter', 'MutableAttributeSet', 'NavigationFilter', 'NavigationFilter.FilterBypass', 'NumberFormatter', 'PasswordView', 'PlainDocument', 'PlainView', 'Position', 'Position.Bias', 'Segment', 'SimpleAttributeSet', 'StringContent', 'Style', 'StyleConstants', 'StyleConstants.CharacterConstants', 'StyleConstants.ColorConstants', 'StyleConstants.FontConstants', 'StyleConstants.ParagraphConstants', 'StyleContext', 'StyledDocument', 'StyledEditorKit', 'StyledEditorKit.AlignmentAction', 'StyledEditorKit.BoldAction', 'StyledEditorKit.FontFamilyAction', 'StyledEditorKit.FontSizeAction', 'StyledEditorKit.ForegroundAction',
+ 'StyledEditorKit.ItalicAction', 'StyledEditorKit.StyledTextAction', 'StyledEditorKit.UnderlineAction', 'TabExpander', 'TabSet', 'TabStop', 'TabableView', 'TableView', 'TextAction', 'Utilities', 'View', 'ViewFactory', 'WrappedPlainView', 'ZoneView'
+ ),
+ 117 => array (
+ 'BlockView', 'CSS', 'CSS.Attribute', 'FormSubmitEvent', 'FormSubmitEvent.MethodType', 'FormView', 'HTML', 'HTML.Attribute', 'HTML.Tag', 'HTML.UnknownTag', 'HTMLDocument', 'HTMLDocument.Iterator', 'HTMLEditorKit', 'HTMLEditorKit.HTMLFactory', 'HTMLEditorKit.HTMLTextAction', 'HTMLEditorKit.InsertHTMLTextAction', 'HTMLEditorKit.LinkController', 'HTMLEditorKit.Parser', 'HTMLEditorKit.ParserCallback', 'HTMLFrameHyperlinkEvent', 'HTMLWriter', 'ImageView', 'InlineView', 'ListView', 'MinimalHTMLWriter', 'ObjectView', 'Option', 'StyleSheet', 'StyleSheet.BoxPainter', 'StyleSheet.ListPainter'
+ ),
+ 118 => array (
+ 'ContentModel', 'DTD', 'DTDConstants', 'DocumentParser', 'ParserDelegator', 'TagElement'
+ ),
+ 119 => array (
+ 'RTFEditorKit'
+ ),
+ 120 => array (
+ 'AbstractLayoutCache', 'AbstractLayoutCache.NodeDimensions', 'DefaultMutableTreeNode', 'DefaultTreeCellEditor', 'DefaultTreeCellRenderer', 'DefaultTreeModel', 'DefaultTreeSelectionModel', 'ExpandVetoException', 'FixedHeightLayoutCache', 'MutableTreeNode', 'RowMapper', 'TreeCellEditor', 'TreeCellRenderer', 'TreeModel', 'TreeNode', 'TreePath', 'TreeSelectionModel', 'VariableHeightLayoutCache'
+ ),
+ 121 => array (
+ 'AbstractUndoableEdit', 'CannotRedoException', 'CannotUndoException', 'CompoundEdit', 'StateEdit', 'StateEditable', 'UndoManager', 'UndoableEdit', 'UndoableEditSupport'
+ ),
+ 122 => array (
+ 'InvalidTransactionException', 'TransactionRequiredException', 'TransactionRolledbackException'
+ ),
+ 123 => array (
+ 'XAException', 'XAResource', 'Xid'
+ ),
+ 124 => array (
+ 'XMLConstants'
+ ),
+ 125 => array (
+ 'DatatypeConfigurationException', 'DatatypeConstants', 'DatatypeConstants.Field', 'DatatypeFactory', 'Duration', 'XMLGregorianCalendar'
+ ),
+ 126 => array (
+ 'NamespaceContext', 'QName'
+ ),
+ 127 => array (
+ 'DocumentBuilder', 'DocumentBuilderFactory', 'FactoryConfigurationError', 'ParserConfigurationException', 'SAXParser', 'SAXParserFactory'
+ ),
+ 128 => array (
+ 'ErrorListener', 'OutputKeys', 'Result', 'Source', 'SourceLocator', 'Templates', 'Transformer', 'TransformerConfigurationException', 'TransformerException', 'TransformerFactory', 'TransformerFactoryConfigurationError', 'URIResolver'
+ ),
+ 129 => array (
+ 'DOMResult', 'DOMSource'
+ ),
+ 130 => array (
+ 'SAXResult', 'SAXSource', 'SAXTransformerFactory', 'TemplatesHandler', 'TransformerHandler'
+ ),
+ 131 => array (
+ 'StreamResult', 'StreamSource'
+ ),
+ 132 => array (
+ 'Schema', 'SchemaFactory', 'SchemaFactoryLoader', 'TypeInfoProvider', 'Validator', 'ValidatorHandler'
+ ),
+ 133 => array (
+ 'XPath', 'XPathConstants', 'XPathException', 'XPathExpression', 'XPathExpressionException', 'XPathFactory', 'XPathFactoryConfigurationException', 'XPathFunction', 'XPathFunctionException', 'XPathFunctionResolver', 'XPathVariableResolver'
+ ),
+ 134 => array (
+ 'ChannelBinding', 'GSSContext', 'GSSCredential', 'GSSException', 'GSSManager', 'GSSName', 'MessageProp', 'Oid'
+ ),
+ 135 => array (
+ 'ACTIVITY_COMPLETED', 'ACTIVITY_REQUIRED', 'ARG_IN', 'ARG_INOUT', 'ARG_OUT', 'Any', 'AnyHolder', 'AnySeqHolder', 'BAD_CONTEXT', 'BAD_INV_ORDER', 'BAD_OPERATION', 'BAD_PARAM', 'BAD_POLICY', 'BAD_POLICY_TYPE', 'BAD_POLICY_VALUE', 'BAD_QOS', 'BAD_TYPECODE', 'BooleanHolder', 'BooleanSeqHelper', 'BooleanSeqHolder', 'ByteHolder', 'CODESET_INCOMPATIBLE', 'COMM_FAILURE', 'CTX_RESTRICT_SCOPE', 'CharHolder', 'CharSeqHelper', 'CharSeqHolder', 'CompletionStatus', 'CompletionStatusHelper', 'ContextList', 'CurrentHolder', 'CustomMarshal', 'DATA_CONVERSION', 'DefinitionKind', 'DefinitionKindHelper', 'DomainManager', 'DomainManagerOperations', 'DoubleHolder', 'DoubleSeqHelper', 'DoubleSeqHolder', 'Environment', 'ExceptionList', 'FREE_MEM', 'FixedHolder', 'FloatHolder', 'FloatSeqHelper', 'FloatSeqHolder', 'IDLType', 'IDLTypeHelper', 'IDLTypeOperations', 'IMP_LIMIT', 'INITIALIZE', 'INTERNAL', 'INTF_REPOS', 'INVALID_ACTIVITY', 'INVALID_TRANSACTION', 'INV_FLAG', 'INV_IDENT', 'INV_OBJREF', 'INV_POLICY', 'IRObject',
+ 'IRObjectOperations', 'IdentifierHelper', 'IntHolder', 'LocalObject', 'LongHolder', 'LongLongSeqHelper', 'LongLongSeqHolder', 'LongSeqHelper', 'LongSeqHolder', 'MARSHAL', 'NO_IMPLEMENT', 'NO_MEMORY', 'NO_PERMISSION', 'NO_RESOURCES', 'NO_RESPONSE', 'NVList', 'NamedValue', 'OBJECT_NOT_EXIST', 'OBJ_ADAPTER', 'OMGVMCID', 'ObjectHelper', 'ObjectHolder', 'OctetSeqHelper', 'OctetSeqHolder', 'PERSIST_STORE', 'PRIVATE_MEMBER', 'PUBLIC_MEMBER', 'ParameterMode', 'ParameterModeHelper', 'ParameterModeHolder', 'PolicyError', 'PolicyErrorCodeHelper', 'PolicyErrorHelper', 'PolicyErrorHolder', 'PolicyHelper', 'PolicyHolder', 'PolicyListHelper', 'PolicyListHolder', 'PolicyOperations', 'PolicyTypeHelper', 'PrincipalHolder', 'REBIND', 'RepositoryIdHelper', 'Request', 'ServerRequest', 'ServiceDetail', 'ServiceDetailHelper', 'ServiceInformation', 'ServiceInformationHelper', 'ServiceInformationHolder', 'SetOverrideType', 'SetOverrideTypeHelper', 'ShortHolder', 'ShortSeqHelper', 'ShortSeqHolder', 'StringHolder',
+ 'StringSeqHelper', 'StringSeqHolder', 'StringValueHelper', 'StructMember', 'StructMemberHelper', 'SystemException', 'TCKind', 'TIMEOUT', 'TRANSACTION_MODE', 'TRANSACTION_REQUIRED', 'TRANSACTION_ROLLEDBACK', 'TRANSACTION_UNAVAILABLE', 'TRANSIENT', 'TypeCode', 'TypeCodeHolder', 'ULongLongSeqHelper', 'ULongLongSeqHolder', 'ULongSeqHelper', 'ULongSeqHolder', 'UNSUPPORTED_POLICY', 'UNSUPPORTED_POLICY_VALUE', 'UShortSeqHelper', 'UShortSeqHolder', 'UnionMember', 'UnionMemberHelper', 'UnknownUserException', 'UnknownUserExceptionHelper', 'UnknownUserExceptionHolder', 'UserException', 'VM_ABSTRACT', 'VM_CUSTOM', 'VM_NONE', 'VM_TRUNCATABLE', 'ValueBaseHelper', 'ValueBaseHolder', 'ValueMember', 'ValueMemberHelper', 'VersionSpecHelper', 'VisibilityHelper', 'WCharSeqHelper', 'WCharSeqHolder', 'WStringSeqHelper', 'WStringSeqHolder', 'WStringValueHelper', 'WrongTransaction', 'WrongTransactionHelper', 'WrongTransactionHolder', '_IDLTypeStub', '_PolicyStub'
+ ),
+ 136 => array (
+ 'Invalid', 'InvalidSeq'
+ ),
+ 137 => array (
+ 'BadKind'
+ ),
+ 138 => array (
+ 'ApplicationException', 'BoxedValueHelper', 'CustomValue', 'IDLEntity', 'IndirectionException', 'InvokeHandler', 'RemarshalException', 'ResponseHandler', 'ServantObject', 'Streamable', 'StreamableValue', 'UnknownException', 'ValueBase', 'ValueFactory', 'ValueInputStream', 'ValueOutputStream'
+ ),
+ 139 => array (
+ 'BindingHelper', 'BindingHolder', 'BindingIterator', 'BindingIteratorHelper', 'BindingIteratorHolder', 'BindingIteratorOperations', 'BindingIteratorPOA', 'BindingListHelper', 'BindingListHolder', 'BindingType', 'BindingTypeHelper', 'BindingTypeHolder', 'IstringHelper', 'NameComponent', 'NameComponentHelper', 'NameComponentHolder', 'NameHelper', 'NameHolder', 'NamingContext', 'NamingContextExt', 'NamingContextExtHelper', 'NamingContextExtHolder', 'NamingContextExtOperations', 'NamingContextExtPOA', 'NamingContextHelper', 'NamingContextHolder', 'NamingContextOperations', 'NamingContextPOA', '_BindingIteratorImplBase', '_BindingIteratorStub', '_NamingContextExtStub', '_NamingContextImplBase', '_NamingContextStub'
+ ),
+ 140 => array (
+ 'AddressHelper', 'InvalidAddress', 'InvalidAddressHelper', 'InvalidAddressHolder', 'StringNameHelper', 'URLStringHelper'
+ ),
+ 141 => array (
+ 'AlreadyBound', 'AlreadyBoundHelper', 'AlreadyBoundHolder', 'CannotProceed', 'CannotProceedHelper', 'CannotProceedHolder', 'InvalidNameHolder', 'NotEmpty', 'NotEmptyHelper', 'NotEmptyHolder', 'NotFound', 'NotFoundHelper', 'NotFoundHolder', 'NotFoundReason', 'NotFoundReasonHelper', 'NotFoundReasonHolder'
+ ),
+ 142 => array (
+ 'Parameter'
+ ),
+ 143 => array (
+ 'DynAnyFactory', 'DynAnyFactoryHelper', 'DynAnyFactoryOperations', 'DynAnyHelper', 'DynAnyOperations', 'DynAnySeqHelper', 'DynArrayHelper', 'DynArrayOperations', 'DynEnumHelper', 'DynEnumOperations', 'DynFixedHelper', 'DynFixedOperations', 'DynSequenceHelper', 'DynSequenceOperations', 'DynStructHelper', 'DynStructOperations', 'DynUnionHelper', 'DynUnionOperations', 'DynValueBox', 'DynValueBoxOperations', 'DynValueCommon', 'DynValueCommonOperations', 'DynValueHelper', 'DynValueOperations', 'NameDynAnyPair', 'NameDynAnyPairHelper', 'NameDynAnyPairSeqHelper', 'NameValuePairSeqHelper', '_DynAnyFactoryStub', '_DynAnyStub', '_DynArrayStub', '_DynEnumStub', '_DynFixedStub', '_DynSequenceStub', '_DynStructStub', '_DynUnionStub', '_DynValueStub'
+ ),
+ 144 => array (
+ 'InconsistentTypeCodeHelper'
+ ),
+ 145 => array (
+ 'InvalidValueHelper'
+ ),
+ 146 => array (
+ 'CodeSets', 'Codec', 'CodecFactory', 'CodecFactoryHelper', 'CodecFactoryOperations', 'CodecOperations', 'ComponentIdHelper', 'ENCODING_CDR_ENCAPS', 'Encoding', 'ExceptionDetailMessage', 'IOR', 'IORHelper', 'IORHolder', 'MultipleComponentProfileHelper', 'MultipleComponentProfileHolder', 'ProfileIdHelper', 'RMICustomMaxStreamFormat', 'ServiceContext', 'ServiceContextHelper', 'ServiceContextHolder', 'ServiceContextListHelper', 'ServiceContextListHolder', 'ServiceIdHelper', 'TAG_ALTERNATE_IIOP_ADDRESS', 'TAG_CODE_SETS', 'TAG_INTERNET_IOP', 'TAG_JAVA_CODEBASE', 'TAG_MULTIPLE_COMPONENTS', 'TAG_ORB_TYPE', 'TAG_POLICIES', 'TAG_RMI_CUSTOM_MAX_STREAM_FORMAT', 'TaggedComponent', 'TaggedComponentHelper', 'TaggedComponentHolder', 'TaggedProfile', 'TaggedProfileHelper', 'TaggedProfileHolder', 'TransactionService'
+ ),
+ 147 => array (
+ 'UnknownEncoding', 'UnknownEncodingHelper'
+ ),
+ 148 => array (
+ 'FormatMismatch', 'FormatMismatchHelper', 'InvalidTypeForEncoding', 'InvalidTypeForEncodingHelper'
+ ),
+ 149 => array (
+ 'SYNC_WITH_TRANSPORT', 'SyncScopeHelper'
+ ),
+ 150 => array (
+ 'ACTIVE', 'AdapterManagerIdHelper', 'AdapterNameHelper', 'AdapterStateHelper', 'ClientRequestInfo', 'ClientRequestInfoOperations', 'ClientRequestInterceptor', 'ClientRequestInterceptorOperations', 'DISCARDING', 'HOLDING', 'INACTIVE', 'IORInfo', 'IORInfoOperations', 'IORInterceptor', 'IORInterceptorOperations', 'IORInterceptor_3_0', 'IORInterceptor_3_0Helper', 'IORInterceptor_3_0Holder', 'IORInterceptor_3_0Operations', 'Interceptor', 'InterceptorOperations', 'InvalidSlot', 'InvalidSlotHelper', 'LOCATION_FORWARD', 'NON_EXISTENT', 'ORBIdHelper', 'ORBInitInfo', 'ORBInitInfoOperations', 'ORBInitializer', 'ORBInitializerOperations', 'ObjectReferenceFactory', 'ObjectReferenceFactoryHelper', 'ObjectReferenceFactoryHolder', 'ObjectReferenceTemplate', 'ObjectReferenceTemplateHelper', 'ObjectReferenceTemplateHolder', 'ObjectReferenceTemplateSeqHelper', 'ObjectReferenceTemplateSeqHolder', 'PolicyFactory', 'PolicyFactoryOperations', 'RequestInfo', 'RequestInfoOperations', 'SUCCESSFUL', 'SYSTEM_EXCEPTION',
+ 'ServerIdHelper', 'ServerRequestInfo', 'ServerRequestInfoOperations', 'ServerRequestInterceptor', 'ServerRequestInterceptorOperations', 'TRANSPORT_RETRY', 'USER_EXCEPTION'
+ ),
+ 151 => array (
+ 'DuplicateName', 'DuplicateNameHelper'
+ ),
+ 152 => array (
+ 'AdapterActivator', 'AdapterActivatorOperations', 'ID_ASSIGNMENT_POLICY_ID', 'ID_UNIQUENESS_POLICY_ID', 'IMPLICIT_ACTIVATION_POLICY_ID', 'IdAssignmentPolicy', 'IdAssignmentPolicyOperations', 'IdAssignmentPolicyValue', 'IdUniquenessPolicy', 'IdUniquenessPolicyOperations', 'IdUniquenessPolicyValue', 'ImplicitActivationPolicy', 'ImplicitActivationPolicyOperations', 'ImplicitActivationPolicyValue', 'LIFESPAN_POLICY_ID', 'LifespanPolicy', 'LifespanPolicyOperations', 'LifespanPolicyValue', 'POA', 'POAHelper', 'POAManager', 'POAManagerOperations', 'POAOperations', 'REQUEST_PROCESSING_POLICY_ID', 'RequestProcessingPolicy', 'RequestProcessingPolicyOperations', 'RequestProcessingPolicyValue', 'SERVANT_RETENTION_POLICY_ID', 'Servant', 'ServantActivator', 'ServantActivatorHelper', 'ServantActivatorOperations', 'ServantActivatorPOA', 'ServantLocator', 'ServantLocatorHelper', 'ServantLocatorOperations', 'ServantLocatorPOA', 'ServantManager', 'ServantManagerOperations', 'ServantRetentionPolicy',
+ 'ServantRetentionPolicyOperations', 'ServantRetentionPolicyValue', 'THREAD_POLICY_ID', 'ThreadPolicy', 'ThreadPolicyOperations', 'ThreadPolicyValue', '_ServantActivatorStub', '_ServantLocatorStub'
+ ),
+ 153 => array (
+ 'NoContext', 'NoContextHelper'
+ ),
+ 154 => array (
+ 'AdapterInactive', 'AdapterInactiveHelper', 'State'
+ ),
+ 155 => array (
+ 'AdapterAlreadyExists', 'AdapterAlreadyExistsHelper', 'AdapterNonExistent', 'AdapterNonExistentHelper', 'InvalidPolicy', 'InvalidPolicyHelper', 'NoServant', 'NoServantHelper', 'ObjectAlreadyActive', 'ObjectAlreadyActiveHelper', 'ObjectNotActive', 'ObjectNotActiveHelper', 'ServantAlreadyActive', 'ServantAlreadyActiveHelper', 'ServantNotActive', 'ServantNotActiveHelper', 'WrongAdapter', 'WrongAdapterHelper', 'WrongPolicy', 'WrongPolicyHelper'
+ ),
+ 156 => array (
+ 'CookieHolder'
+ ),
+ 157 => array (
+ 'RunTime', 'RunTimeOperations'
+ ),
+ 158 => array (
+ '_Remote_Stub'
+ ),
+ 159 => array (
+ 'Attr', 'CDATASection', 'CharacterData', 'Comment', 'DOMConfiguration', 'DOMError', 'DOMErrorHandler', 'DOMException', 'DOMImplementation', 'DOMImplementationList', 'DOMImplementationSource', 'DOMStringList', 'DocumentFragment', 'DocumentType', 'EntityReference', 'NameList', 'NamedNodeMap', 'Node', 'NodeList', 'Notation', 'ProcessingInstruction', 'Text', 'TypeInfo', 'UserDataHandler'
+ ),
+ 160 => array (
+ 'DOMImplementationRegistry'
+ ),
+ 161 => array (
+ 'EventException', 'EventTarget', 'MutationEvent', 'UIEvent'
+ ),
+ 162 => array (
+ 'DOMImplementationLS', 'LSException', 'LSInput', 'LSLoadEvent', 'LSOutput', 'LSParser', 'LSParserFilter', 'LSProgressEvent', 'LSResourceResolver', 'LSSerializer', 'LSSerializerFilter'
+ ),
+ 163 => array (
+ 'DTDHandler', 'DocumentHandler', 'EntityResolver', 'ErrorHandler', 'HandlerBase', 'InputSource', 'Locator', 'SAXException', 'SAXNotRecognizedException', 'SAXNotSupportedException', 'SAXParseException', 'XMLFilter', 'XMLReader'
+ ),
+ 164 => array (
+ 'Attributes2', 'Attributes2Impl', 'DeclHandler', 'DefaultHandler2', 'EntityResolver2', 'LexicalHandler', 'Locator2', 'Locator2Impl'
+ ),
+ 165 => array (
+ 'AttributeListImpl', 'AttributesImpl', 'DefaultHandler', 'LocatorImpl', 'NamespaceSupport', 'ParserAdapter', 'ParserFactory', 'XMLFilterImpl', 'XMLReaderAdapter', 'XMLReaderFactory'
+ ),
+ /* ambiguous class names (appear in more than one package) */
+ 166 => array (
+ 'Annotation', 'AnySeqHelper', 'Array', 'Attribute', 'AttributeList', 'AttributeSet', 'Attributes', 'AuthenticationException', 'Binding', 'Bounds', 'Certificate', 'CertificateEncodingException', 'CertificateException', 'CertificateExpiredException', 'CertificateNotYetValidException', 'CertificateParsingException', 'ConnectException', 'ContentHandler', 'Context', 'Control', 'Current', 'CurrentHelper', 'CurrentOperations', 'DOMLocator', 'DataInputStream', 'DataOutputStream', 'Date', 'DefaultLoaderRepository', 'Delegate', 'Document', 'DocumentEvent', 'DynAny', 'DynArray', 'DynEnum', 'DynFixed', 'DynSequence', 'DynStruct', 'DynUnion', 'DynValue', 'DynamicImplementation', 'Element', 'Entity', 'Event', 'EventListener', 'FieldNameHelper', 'FileFilter', 'Formatter', 'ForwardRequest', 'ForwardRequestHelper', 'InconsistentTypeCode', 'InputStream', 'IntrospectionException', 'InvalidAttributeValueException', 'InvalidKeyException', 'InvalidName', 'InvalidNameHelper', 'InvalidValue', 'List', 'MouseEvent',
+ 'NameValuePair', 'NameValuePairHelper', 'ORB', 'Object', 'ObjectIdHelper', 'ObjectImpl', 'OpenType', 'OutputStream', 'ParagraphView', 'Parser', 'Permission', 'Policy', 'Principal', 'Proxy', 'Reference', 'Statement', 'Timer', 'Timestamp', 'TypeMismatch', 'TypeMismatchHelper', 'UNKNOWN', 'UnknownHostException', 'X509Certificate'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '*', '&', '%', '!', ';', '<', '>', '?'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ /* all Java keywords are case sensitive */
+ 1 => true, 2 => true, 3 => true, 4 => true,
+ 5 => true, 6 => true, 7 => true, 8 => true, 9 => true,
+ 10 => true, 11 => true, 12 => true, 13 => true, 14 => true,
+ 15 => true, 16 => true, 17 => true, 18 => true, 19 => true,
+ 20 => true, 21 => true, 22 => true, 23 => true, 24 => true,
+ 25 => true, 26 => true, 27 => true, 28 => true, 29 => true,
+ 30 => true, 31 => true, 32 => true, 33 => true, 34 => true,
+ 35 => true, 36 => true, 37 => true, 38 => true, 39 => true,
+ 40 => true, 41 => true, 42 => true, 43 => true, 44 => true,
+ 45 => true, 46 => true, 47 => true, 48 => true, 49 => true,
+ 50 => true, 51 => true, 52 => true, 53 => true, 54 => true,
+ 55 => true, 56 => true, 57 => true, 58 => true, 59 => true,
+ 60 => true, 61 => true, 62 => true, 63 => true, 64 => true,
+ 65 => true, 66 => true, 67 => true, 68 => true, 69 => true,
+ 70 => true, 71 => true, 72 => true, 73 => true, 74 => true,
+ 75 => true, 76 => true, 77 => true, 78 => true, 79 => true,
+ 80 => true, 81 => true, 82 => true, 83 => true, 84 => true,
+ 85 => true, 86 => true, 87 => true, 88 => true, 89 => true,
+ 90 => true, 91 => true, 92 => true, 93 => true, 94 => true,
+ 95 => true, 96 => true, 97 => true, 98 => true, 99 => true,
+ 100 => true, 101 => true, 102 => true, 103 => true, 104 => true,
+ 105 => true, 106 => true, 107 => true, 108 => true, 109 => true,
+ 110 => true, 111 => true, 112 => true, 113 => true, 114 => true,
+ 115 => true, 116 => true, 117 => true, 118 => true, 119 => true,
+ 120 => true, 121 => true, 122 => true, 123 => true, 124 => true,
+ 125 => true, 126 => true, 127 => true, 128 => true, 129 => true,
+ 130 => true, 131 => true, 132 => true, 133 => true, 134 => true,
+ 135 => true, 136 => true, 137 => true, 138 => true, 139 => true,
+ 140 => true, 141 => true, 142 => true, 143 => true, 144 => true,
+ 145 => true, 146 => true, 147 => true, 148 => true, 149 => true,
+ 150 => true, 151 => true, 152 => true, 153 => true, 154 => true,
+ 155 => true, 156 => true, 157 => true, 158 => true, 159 => true,
+ 160 => true, 161 => true, 162 => true, 163 => true, 164 => true,
+ 165 => true, 166 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #006600; font-weight: bold;',
+ 4 => 'color: #006600; font-weight: bold;',
+ 5 => 'color: #003399; font-weight: bold;',
+ 6 => 'color: #003399; font-weight: bold;',
+ 7 => 'color: #003399; font-weight: bold;',
+ 8 => 'color: #003399; font-weight: bold;',
+ 9 => 'color: #003399; font-weight: bold;',
+ 10 => 'color: #003399; font-weight: bold;',
+ 11 => 'color: #003399; font-weight: bold;',
+ 12 => 'color: #003399; font-weight: bold;',
+ 13 => 'color: #003399; font-weight: bold;',
+ 14 => 'color: #003399; font-weight: bold;',
+ 15 => 'color: #003399; font-weight: bold;',
+ 16 => 'color: #003399; font-weight: bold;',
+ 17 => 'color: #003399; font-weight: bold;',
+ 18 => 'color: #003399; font-weight: bold;',
+ 19 => 'color: #003399; font-weight: bold;',
+ 20 => 'color: #003399; font-weight: bold;',
+ 21 => 'color: #003399; font-weight: bold;',
+ 22 => 'color: #003399; font-weight: bold;',
+ 23 => 'color: #003399; font-weight: bold;',
+ 24 => 'color: #003399; font-weight: bold;',
+ 25 => 'color: #003399; font-weight: bold;',
+ 26 => 'color: #003399; font-weight: bold;',
+ 27 => 'color: #003399; font-weight: bold;',
+ 28 => 'color: #003399; font-weight: bold;',
+ 29 => 'color: #003399; font-weight: bold;',
+ 30 => 'color: #003399; font-weight: bold;',
+ 31 => 'color: #003399; font-weight: bold;',
+ 32 => 'color: #003399; font-weight: bold;',
+ 33 => 'color: #003399; font-weight: bold;',
+ 34 => 'color: #003399; font-weight: bold;',
+ 35 => 'color: #003399; font-weight: bold;',
+ 36 => 'color: #003399; font-weight: bold;',
+ 37 => 'color: #003399; font-weight: bold;',
+ 38 => 'color: #003399; font-weight: bold;',
+ 39 => 'color: #003399; font-weight: bold;',
+ 40 => 'color: #003399; font-weight: bold;',
+ 41 => 'color: #003399; font-weight: bold;',
+ 42 => 'color: #003399; font-weight: bold;',
+ 43 => 'color: #003399; font-weight: bold;',
+ 44 => 'color: #003399; font-weight: bold;',
+ 45 => 'color: #003399; font-weight: bold;',
+ 46 => 'color: #003399; font-weight: bold;',
+ 47 => 'color: #003399; font-weight: bold;',
+ 48 => 'color: #003399; font-weight: bold;',
+ 49 => 'color: #003399; font-weight: bold;',
+ 50 => 'color: #003399; font-weight: bold;',
+ 51 => 'color: #003399; font-weight: bold;',
+ 52 => 'color: #003399; font-weight: bold;',
+ 53 => 'color: #003399; font-weight: bold;',
+ 54 => 'color: #003399; font-weight: bold;',
+ 55 => 'color: #003399; font-weight: bold;',
+ 56 => 'color: #003399; font-weight: bold;',
+ 57 => 'color: #003399; font-weight: bold;',
+ 58 => 'color: #003399; font-weight: bold;',
+ 59 => 'color: #003399; font-weight: bold;',
+ 60 => 'color: #003399; font-weight: bold;',
+ 61 => 'color: #003399; font-weight: bold;',
+ 62 => 'color: #003399; font-weight: bold;',
+ 63 => 'color: #003399; font-weight: bold;',
+ 64 => 'color: #003399; font-weight: bold;',
+ 65 => 'color: #003399; font-weight: bold;',
+ 66 => 'color: #003399; font-weight: bold;',
+ 67 => 'color: #003399; font-weight: bold;',
+ 68 => 'color: #003399; font-weight: bold;',
+ 69 => 'color: #003399; font-weight: bold;',
+ 70 => 'color: #003399; font-weight: bold;',
+ 71 => 'color: #003399; font-weight: bold;',
+ 72 => 'color: #003399; font-weight: bold;',
+ 73 => 'color: #003399; font-weight: bold;',
+ 74 => 'color: #003399; font-weight: bold;',
+ 75 => 'color: #003399; font-weight: bold;',
+ 76 => 'color: #003399; font-weight: bold;',
+ 77 => 'color: #003399; font-weight: bold;',
+ 78 => 'color: #003399; font-weight: bold;',
+ 79 => 'color: #003399; font-weight: bold;',
+ 80 => 'color: #003399; font-weight: bold;',
+ 81 => 'color: #003399; font-weight: bold;',
+ 82 => 'color: #003399; font-weight: bold;',
+ 83 => 'color: #003399; font-weight: bold;',
+ 84 => 'color: #003399; font-weight: bold;',
+ 85 => 'color: #003399; font-weight: bold;',
+ 86 => 'color: #003399; font-weight: bold;',
+ 87 => 'color: #003399; font-weight: bold;',
+ 88 => 'color: #003399; font-weight: bold;',
+ 89 => 'color: #003399; font-weight: bold;',
+ 90 => 'color: #003399; font-weight: bold;',
+ 91 => 'color: #003399; font-weight: bold;',
+ 92 => 'color: #003399; font-weight: bold;',
+ 93 => 'color: #003399; font-weight: bold;',
+ 94 => 'color: #003399; font-weight: bold;',
+ 95 => 'color: #003399; font-weight: bold;',
+ 96 => 'color: #003399; font-weight: bold;',
+ 97 => 'color: #003399; font-weight: bold;',
+ 98 => 'color: #003399; font-weight: bold;',
+ 99 => 'color: #003399; font-weight: bold;',
+ 100 => 'color: #003399; font-weight: bold;',
+ 101 => 'color: #003399; font-weight: bold;',
+ 102 => 'color: #003399; font-weight: bold;',
+ 103 => 'color: #003399; font-weight: bold;',
+ 104 => 'color: #003399; font-weight: bold;',
+ 105 => 'color: #003399; font-weight: bold;',
+ 106 => 'color: #003399; font-weight: bold;',
+ 107 => 'color: #003399; font-weight: bold;',
+ 108 => 'color: #003399; font-weight: bold;',
+ 109 => 'color: #003399; font-weight: bold;',
+ 110 => 'color: #003399; font-weight: bold;',
+ 111 => 'color: #003399; font-weight: bold;',
+ 112 => 'color: #003399; font-weight: bold;',
+ 113 => 'color: #003399; font-weight: bold;',
+ 114 => 'color: #003399; font-weight: bold;',
+ 115 => 'color: #003399; font-weight: bold;',
+ 116 => 'color: #003399; font-weight: bold;',
+ 117 => 'color: #003399; font-weight: bold;',
+ 118 => 'color: #003399; font-weight: bold;',
+ 119 => 'color: #003399; font-weight: bold;',
+ 120 => 'color: #003399; font-weight: bold;',
+ 121 => 'color: #003399; font-weight: bold;',
+ 122 => 'color: #003399; font-weight: bold;',
+ 123 => 'color: #003399; font-weight: bold;',
+ 124 => 'color: #003399; font-weight: bold;',
+ 125 => 'color: #003399; font-weight: bold;',
+ 126 => 'color: #003399; font-weight: bold;',
+ 127 => 'color: #003399; font-weight: bold;',
+ 128 => 'color: #003399; font-weight: bold;',
+ 129 => 'color: #003399; font-weight: bold;',
+ 130 => 'color: #003399; font-weight: bold;',
+ 131 => 'color: #003399; font-weight: bold;',
+ 132 => 'color: #003399; font-weight: bold;',
+ 133 => 'color: #003399; font-weight: bold;',
+ 134 => 'color: #003399; font-weight: bold;',
+ 135 => 'color: #003399; font-weight: bold;',
+ 136 => 'color: #003399; font-weight: bold;',
+ 137 => 'color: #003399; font-weight: bold;',
+ 138 => 'color: #003399; font-weight: bold;',
+ 139 => 'color: #003399; font-weight: bold;',
+ 140 => 'color: #003399; font-weight: bold;',
+ 141 => 'color: #003399; font-weight: bold;',
+ 142 => 'color: #003399; font-weight: bold;',
+ 143 => 'color: #003399; font-weight: bold;',
+ 144 => 'color: #003399; font-weight: bold;',
+ 145 => 'color: #003399; font-weight: bold;',
+ 146 => 'color: #003399; font-weight: bold;',
+ 147 => 'color: #003399; font-weight: bold;',
+ 148 => 'color: #003399; font-weight: bold;',
+ 149 => 'color: #003399; font-weight: bold;',
+ 150 => 'color: #003399; font-weight: bold;',
+ 151 => 'color: #003399; font-weight: bold;',
+ 152 => 'color: #003399; font-weight: bold;',
+ 153 => 'color: #003399; font-weight: bold;',
+ 154 => 'color: #003399; font-weight: bold;',
+ 155 => 'color: #003399; font-weight: bold;',
+ 156 => 'color: #003399; font-weight: bold;',
+ 157 => 'color: #003399; font-weight: bold;',
+ 158 => 'color: #003399; font-weight: bold;',
+ 159 => 'color: #003399; font-weight: bold;',
+ 160 => 'color: #003399; font-weight: bold;',
+ 161 => 'color: #003399; font-weight: bold;',
+ 162 => 'color: #003399; font-weight: bold;',
+ 163 => 'color: #003399; font-weight: bold;',
+ 164 => 'color: #003399; font-weight: bold;',
+ 165 => 'color: #003399; font-weight: bold;',
+ 166 => 'color: #003399; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #006699;',
+ 3 => 'color: #008000; font-style: italic; font-weight: bold;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006633;',
+ 2 => 'color: #006633;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => 'http://docs.oracle.com/javase/7/docs/api/java/applet/{FNAME}.html',
+ 6 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/{FNAME}.html',
+ 7 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/color/{FNAME}.html',
+ 8 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/datatransfer/{FNAME}.html',
+ 9 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/dnd/{FNAME}.html',
+ 10 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/event/{FNAME}.html',
+ 11 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/font/{FNAME}.html',
+ 12 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/geom/{FNAME}.html',
+ 13 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/im/{FNAME}.html',
+ 14 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/im/spi/{FNAME}.html',
+ 15 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/image/{FNAME}.html',
+ 16 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/image/renderable/{FNAME}.html',
+ 17 => 'http://docs.oracle.com/javase/7/docs/api/java/awt/print/{FNAME}.html',
+ 18 => 'http://docs.oracle.com/javase/7/docs/api/java/beans/{FNAME}.html',
+ 19 => 'http://docs.oracle.com/javase/7/docs/api/java/beans/beancontext/{FNAME}.html',
+ 20 => 'http://docs.oracle.com/javase/7/docs/api/java/io/{FNAME}.html',
+ 21 => 'http://docs.oracle.com/javase/7/docs/api/java/lang/{FNAME}.html',
+ 22 => 'http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/{FNAME}.html',
+ 23 => 'http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/{FNAME}.html',
+ 24 => 'http://docs.oracle.com/javase/7/docs/api/java/lang/management/{FNAME}.html',
+ 25 => 'http://docs.oracle.com/javase/7/docs/api/java/lang/ref/{FNAME}.html',
+ 26 => 'http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/{FNAME}.html',
+ 27 => 'http://docs.oracle.com/javase/7/docs/api/java/math/{FNAME}.html',
+ 28 => 'http://docs.oracle.com/javase/7/docs/api/java/net/{FNAME}.html',
+ 29 => 'http://docs.oracle.com/javase/7/docs/api/java/nio/{FNAME}.html',
+ 30 => 'http://docs.oracle.com/javase/7/docs/api/java/nio/channels/{FNAME}.html',
+ 31 => 'http://docs.oracle.com/javase/7/docs/api/java/nio/channels/spi/{FNAME}.html',
+ 32 => 'http://docs.oracle.com/javase/7/docs/api/java/nio/charset/{FNAME}.html',
+ 33 => 'http://docs.oracle.com/javase/7/docs/api/java/nio/charset/spi/{FNAME}.html',
+ 34 => 'http://docs.oracle.com/javase/7/docs/api/java/rmi/{FNAME}.html',
+ 35 => 'http://docs.oracle.com/javase/7/docs/api/java/rmi/activation/{FNAME}.html',
+ 36 => 'http://docs.oracle.com/javase/7/docs/api/java/rmi/dgc/{FNAME}.html',
+ 37 => 'http://docs.oracle.com/javase/7/docs/api/java/rmi/registry/{FNAME}.html',
+ 38 => 'http://docs.oracle.com/javase/7/docs/api/java/rmi/server/{FNAME}.html',
+ 39 => 'http://docs.oracle.com/javase/7/docs/api/java/security/{FNAME}.html',
+ 40 => 'http://docs.oracle.com/javase/7/docs/api/java/security/acl/{FNAME}.html',
+ 41 => 'http://docs.oracle.com/javase/7/docs/api/java/security/cert/{FNAME}.html',
+ 42 => 'http://docs.oracle.com/javase/7/docs/api/java/security/interfaces/{FNAME}.html',
+ 43 => 'http://docs.oracle.com/javase/7/docs/api/java/security/spec/{FNAME}.html',
+ 44 => 'http://docs.oracle.com/javase/7/docs/api/java/sql/{FNAME}.html',
+ 45 => 'http://docs.oracle.com/javase/7/docs/api/java/text/{FNAME}.html',
+ 46 => 'http://docs.oracle.com/javase/7/docs/api/java/util/{FNAME}.html',
+ 47 => 'http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/{FNAME}.html',
+ 48 => 'http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/{FNAME}.html',
+ 49 => 'http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/{FNAME}.html',
+ 50 => 'http://docs.oracle.com/javase/7/docs/api/java/util/jar/{FNAME}.html',
+ 51 => 'http://docs.oracle.com/javase/7/docs/api/java/util/logging/{FNAME}.html',
+ 52 => 'http://docs.oracle.com/javase/7/docs/api/java/util/prefs/{FNAME}.html',
+ 53 => 'http://docs.oracle.com/javase/7/docs/api/java/util/regex/{FNAME}.html',
+ 54 => 'http://docs.oracle.com/javase/7/docs/api/java/util/zip/{FNAME}.html',
+ 55 => 'http://docs.oracle.com/javase/7/docs/api/javax/accessibility/{FNAME}.html',
+ 56 => 'http://docs.oracle.com/javase/7/docs/api/javax/activity/{FNAME}.html',
+ 57 => 'http://docs.oracle.com/javase/7/docs/api/javax/crypto/{FNAME}.html',
+ 58 => 'http://docs.oracle.com/javase/7/docs/api/javax/crypto/interfaces/{FNAME}.html',
+ 59 => 'http://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/{FNAME}.html',
+ 60 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/{FNAME}.html',
+ 61 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/event/{FNAME}.html',
+ 62 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/metadata/{FNAME}.html',
+ 63 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/plugins/bmp/{FNAME}.html',
+ 64 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/plugins/jpeg/{FNAME}.html',
+ 65 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/spi/{FNAME}.html',
+ 66 => 'http://docs.oracle.com/javase/7/docs/api/javax/imageio/stream/{FNAME}.html',
+ 67 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/{FNAME}.html',
+ 68 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/loading/{FNAME}.html',
+ 69 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/modelmbean/{FNAME}.html',
+ 70 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/monitor/{FNAME}.html',
+ 71 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/openmbean/{FNAME}.html',
+ 72 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/relation/{FNAME}.html',
+ 73 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/remote/{FNAME}.html',
+ 74 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/remote/rmi/{FNAME}.html',
+ 75 => 'http://docs.oracle.com/javase/7/docs/api/javax/management/timer/{FNAME}.html',
+ 76 => 'http://docs.oracle.com/javase/7/docs/api/javax/naming/{FNAME}.html',
+ 77 => 'http://docs.oracle.com/javase/7/docs/api/javax/naming/directory/{FNAME}.html',
+ 78 => 'http://docs.oracle.com/javase/7/docs/api/javax/naming/event/{FNAME}.html',
+ 79 => 'http://docs.oracle.com/javase/7/docs/api/javax/naming/ldap/{FNAME}.html',
+ 80 => 'http://docs.oracle.com/javase/7/docs/api/javax/naming/spi/{FNAME}.html',
+ 81 => 'http://docs.oracle.com/javase/7/docs/api/javax/net/{FNAME}.html',
+ 82 => 'http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/{FNAME}.html',
+ 83 => 'http://docs.oracle.com/javase/7/docs/api/javax/print/{FNAME}.html',
+ 84 => 'http://docs.oracle.com/javase/7/docs/api/javax/print/attribute/{FNAME}.html',
+ 85 => 'http://docs.oracle.com/javase/7/docs/api/javax/print/attribute/standard/{FNAME}.html',
+ 86 => 'http://docs.oracle.com/javase/7/docs/api/javax/print/event/{FNAME}.html',
+ 87 => 'http://docs.oracle.com/javase/7/docs/api/javax/rmi/{FNAME}.html',
+ 88 => 'http://docs.oracle.com/javase/7/docs/api/javax/rmi/CORBA/{FNAME}.html',
+ 89 => 'http://docs.oracle.com/javase/7/docs/api/javax/rmi/ssl/{FNAME}.html',
+ 90 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/auth/{FNAME}.html',
+ 91 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/auth/callback/{FNAME}.html',
+ 92 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/auth/kerberos/{FNAME}.html',
+ 93 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/auth/login/{FNAME}.html',
+ 94 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/auth/spi/{FNAME}.html',
+ 95 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/auth/x500/{FNAME}.html',
+ 96 => 'http://docs.oracle.com/javase/7/docs/api/javax/security/sasl/{FNAME}.html',
+ 97 => 'http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/{FNAME}.html',
+ 98 => 'http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/spi/{FNAME}.html',
+ 99 => 'http://docs.oracle.com/javase/7/docs/api/javax/sound/sampled/{FNAME}.html',
+ 100 => 'http://docs.oracle.com/javase/7/docs/api/javax/sound/sampled/spi/{FNAME}.html',
+ 101 => 'http://docs.oracle.com/javase/7/docs/api/javax/sql/{FNAME}.html',
+ 102 => 'http://docs.oracle.com/javase/7/docs/api/javax/sql/rowset/{FNAME}.html',
+ 103 => 'http://docs.oracle.com/javase/7/docs/api/javax/sql/rowset/serial/{FNAME}.html',
+ 104 => 'http://docs.oracle.com/javase/7/docs/api/javax/sql/rowset/spi/{FNAME}.html',
+ 105 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/{FNAME}.html',
+ 106 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/border/{FNAME}.html',
+ 107 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/colorchooser/{FNAME}.html',
+ 108 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/event/{FNAME}.html',
+ 109 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/filechooser/{FNAME}.html',
+ 110 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/plaf/{FNAME}.html',
+ 111 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/plaf/basic/{FNAME}.html',
+ 112 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/plaf/metal/{FNAME}.html',
+ 113 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/plaf/multi/{FNAME}.html',
+ 114 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/plaf/synth/{FNAME}.html',
+ 115 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/table/{FNAME}.html',
+ 116 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/text/{FNAME}.html',
+ 117 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/text/html/{FNAME}.html',
+ 118 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/text/html/parser/{FNAME}.html',
+ 119 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/text/rtf/{FNAME}.html',
+ 120 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/tree/{FNAME}.html',
+ 121 => 'http://docs.oracle.com/javase/7/docs/api/javax/swing/undo/{FNAME}.html',
+ 122 => 'http://docs.oracle.com/javase/7/docs/api/javax/transaction/{FNAME}.html',
+ 123 => 'http://docs.oracle.com/javase/7/docs/api/javax/transaction/xa/{FNAME}.html',
+ 124 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/{FNAME}.html',
+ 125 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/datatype/{FNAME}.html',
+ 126 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/namespace/{FNAME}.html',
+ 127 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/{FNAME}.html',
+ 128 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/{FNAME}.html',
+ 129 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/dom/{FNAME}.html',
+ 130 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/sax/{FNAME}.html',
+ 131 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/stream/{FNAME}.html',
+ 132 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/validation/{FNAME}.html',
+ 133 => 'http://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/{FNAME}.html',
+ 134 => 'http://docs.oracle.com/javase/7/docs/api/org/ietf/jgss/{FNAME}.html',
+ 135 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/{FNAME}.html',
+ 136 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/DynAnyPackage/{FNAME}.html',
+ 137 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/TypeCodePackage/{FNAME}.html',
+ 138 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/portable/{FNAME}.html',
+ 139 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CosNaming/{FNAME}.html',
+ 140 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CosNaming/NamingContextExtPackage/{FNAME}.html',
+ 141 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/CosNaming/NamingContextPackage/{FNAME}.html',
+ 142 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/Dynamic/{FNAME}.html',
+ 143 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/DynamicAny/{FNAME}.html',
+ 144 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/DynamicAny/DynAnyFactoryPackage/{FNAME}.html',
+ 145 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/DynamicAny/DynAnyPackage/{FNAME}.html',
+ 146 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/IOP/{FNAME}.html',
+ 147 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/IOP/CodecFactoryPackage/{FNAME}.html',
+ 148 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/IOP/CodecPackage/{FNAME}.html',
+ 149 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/Messaging/{FNAME}.html',
+ 150 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableInterceptor/{FNAME}.html',
+ 151 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableInterceptor/ORBInitInfoPackage/{FNAME}.html',
+ 152 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableServer/{FNAME}.html',
+ 153 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableServer/CurrentPackage/{FNAME}.html',
+ 154 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableServer/POAManagerPackage/{FNAME}.html',
+ 155 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableServer/POAPackage/{FNAME}.html',
+ 156 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/PortableServer/ServantLocatorPackage/{FNAME}.html',
+ 157 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/SendingContext/{FNAME}.html',
+ 158 => 'http://docs.oracle.com/javase/7/docs/api/org/omg/stub/java/rmi/{FNAME}.html',
+ 159 => 'http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/{FNAME}.html',
+ 160 => 'http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/bootstrap/{FNAME}.html',
+ 161 => 'http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/events/{FNAME}.html',
+ 162 => 'http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/ls/{FNAME}.html',
+ 163 => 'http://docs.oracle.com/javase/7/docs/api/org/xml/sax/{FNAME}.html',
+ 164 => 'http://docs.oracle.com/javase/7/docs/api/org/xml/sax/ext/{FNAME}.html',
+ 165 => 'http://docs.oracle.com/javase/7/docs/api/org/xml/sax/helpers/{FNAME}.html',
+ /* ambiguous class names (appear in more than one package) */
+ 166 => 'http://www.google.com/search?sitesearch=docs.oracle.com&amp;q=allinurl%3Ajavase+docs+api+{FNAME}'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ /* Java does not use '::' */
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => '(?<![a-zA-Z0-9\$_\|\#>|^&"\'])',
+ 'DISALLOWED_AFTER' => '(?![a-zA-Z0-9_\|%\\-;"\'])'
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/javascript.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/javascript.php
new file mode 100644
index 00000000..b96d1b5b
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/javascript.php
@@ -0,0 +1,174 @@
+<?php
+/*************************************************************************************
+ * javascript.php
+ * --------------
+ * Author: Ben Keen (ben.keen@gmail.com)
+ * Copyright: (c) 2004 Ben Keen (ben.keen@gmail.com), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/20
+ *
+ * JavaScript language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/06/27 (1.0.8.11)
+ * - Reordered Keyword Groups to reflect syntactical meaning of keywords
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Javascript',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Regular Expressions
+ 2 => "/(?<=[\\s^])(s|tr|y)\\/(?!\*)(?!\s)(?:\\\\.|(?!\n)[^\\/\\\\])+(?<!\s)\\/(?!\s)(?:\\\\.|(?!\n)[^\\/\\\\])*(?<!\s)\\/[msixpogcde]*(?=[\\s$\\.\\;])|(?<=[\\s^(=])(m|q[qrwx]?)?\\/(?!\*)(?!\s)(?:\\\\.|(?!\n)[^\\/\\\\])+(?<!\s)\\/[msixpogc]*(?=[\\s$\\.\\,\\;\\)])/iU"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ //reserved/keywords; also some non-reserved keywords
+ 'break','case','catch','const','continue',
+ 'default','delete','do',
+ 'else',
+ 'finally','for','function',
+ 'get','goto',
+ 'if','in','instanceof',
+ 'new',
+ 'prototype',
+ 'return',
+ 'set','static','switch',
+ 'this','throw','try','typeof',
+ 'var','void'
+ ),
+ 2 => array(
+ //reserved/non-keywords; metaconstants
+ 'false','null','true','undefined','NaN','Infinity'
+ ),
+ 3 => array(
+ //magic properties/functions
+ '__proto__','__defineGetter__','__defineSetter__','hasOwnProperty','hasProperty'
+ ),
+ 4 => array(
+ //type constructors
+ 'Object', 'Function', 'Date', 'Math', 'String', 'Number', 'Boolean', 'Array'
+ ),
+ 5 => array(
+ //reserved, but invalid in language
+ 'abstract','boolean','byte','char','class','debugger','double','enum','export','extends',
+ 'final','float','implements','import','int','interface','long','native',
+ 'short','super','synchronized','throws','transient','volatile'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}',
+ '+', '-', '*', '/', '%',
+ '!', '@', '&', '|', '^',
+ '<', '>', '=',
+ ',', ';', '?', ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000066; font-weight: bold;',
+ 2 => 'color: #003366; font-weight: bold;',
+ 3 => 'color: #000066;',
+ 5 => 'color: #FF0000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #006600; font-style: italic;',
+ 2 => 'color: #009966; font-style: italic;',
+ 'MULTI' => 'color: #006600; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #3366CC;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #CC0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #660066;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<script type="text/javascript">' => '</script>'
+ ),
+ 1 => array(
+ '<script language="javascript">' => '</script>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/jquery.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/jquery.php
new file mode 100644
index 00000000..a75320d5
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/jquery.php
@@ -0,0 +1,238 @@
+<?php
+/*************************************************************************************
+ * jquery.php
+ * --------------
+ * Author: Rob Loach (http://www.robloach.net)
+ * Copyright: (c) 2009 Rob Loach (http://www.robloach.net)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/07/20
+ *
+ * jQuery 1.3 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/07/20 (1.0.8.5)
+ * - First Release
+ *
+ * TODO (updated 2009/07/20)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'jQuery',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ //Regular Expressions
+ 'COMMENT_REGEXP' => array(2 => "/(?<=[\\s^])s\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/[gimsu]*(?=[\\s$\\.\\;])|(?<=[\\s^(=])m?\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/[gimsu]*(?=[\\s$\\.\\,\\;\\)])/iU"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'as', 'break', 'case', 'catch', 'continue', 'decodeURI', 'delete', 'do',
+ 'else', 'encodeURI', 'eval', 'finally', 'for', 'if', 'in', 'is', 'item',
+ 'instanceof', 'return', 'switch', 'this', 'throw', 'try', 'typeof', 'void',
+ 'while', 'write', 'with'
+ ),
+ 2 => array(
+ 'class', 'const', 'default', 'debugger', 'export', 'extends', 'false',
+ 'function', 'import', 'namespace', 'new', 'null', 'package', 'private',
+ 'protected', 'public', 'super', 'true', 'use', 'var'
+ ),
+ 3 => array(
+ // common functions for Window object
+ 'alert', 'back', 'close', 'confirm', 'forward', 'home',
+ 'name', 'navigate', 'onblur', 'onerror', 'onfocus', 'onload', 'onmove',
+ 'onresize', 'onunload', 'open', 'print', 'prompt', 'status',
+ //'blur', 'focus', 'scroll', // Duplicate with kw9
+ //'stop', //Duplicate with kw10
+ ),
+ 4 => array(
+ // jQuery Core Functions
+ 'jQuery', 'each', 'size', 'length', 'selector', 'context', 'eq',
+ 'index', 'data', 'removeData', 'queue', 'dequeue', 'noConflict'
+ //'get', //Duplicate with kw11
+ ),
+ 5 => array(
+ // jQuery Attribute Functions
+ 'attr', 'removeAttr', 'addClass', 'hasClass', 'removeClass', 'toggleClass',
+ 'html', 'text', 'val',
+ ),
+ 6 => array(
+ // jQuery Traversing Functions
+ 'filter', 'not', 'slice', 'add', 'children', 'closest',
+ 'contents', 'find', 'next', 'nextAll', 'parent', 'parents',
+ 'prev', 'prevAll', 'siblings', 'andSelf', 'end',
+ //'is', //Dup with kw1
+ //'offsetParent', //Duplicate with kw8
+ //'map', //Duplicate with kw12
+ ),
+ 7 => array(
+ // jQuery Manipulation Functions
+ 'append', 'appendTo', 'prepend', 'prependTo', 'after', 'before', 'insertAfter',
+ 'insertBefore', 'wrap', 'wrapAll', 'wrapInner', 'replaceWith', 'replaceAll',
+ 'empty', 'remove', 'clone',
+ ),
+ 8 => array(
+ // jQuery CSS Functions
+ 'css', 'offset', 'offsetParent', 'position', 'scrollTop', 'scrollLeft',
+ 'height', 'width', 'innerHeight', 'innerWidth', 'outerHeight', 'outerWidth',
+ ),
+ 9 => array(
+ // jQuery Events Functions
+ 'ready', 'bind', 'one', 'trigger', 'triggerHandler', 'unbind', 'live',
+ 'die', 'hover', 'blur', 'change', 'click', 'dblclick', 'error',
+ 'focus', 'keydown', 'keypress', 'keyup', 'mousedown', 'mouseenter',
+ 'mouseleave', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'resize',
+ 'scroll', 'select', 'submit', 'unload',
+ //'toggle', //Duplicate with kw10
+ //'load', //Duplicate with kw11
+ ),
+ 10 => array(
+ // jQuery Effects Functions
+ 'show', 'hide', 'toggle', 'slideDown', 'slideUp', 'slideToggle', 'fadeIn',
+ 'fadeOut', 'fadeTo', 'animate', 'stop',
+ ),
+ 11 => array(
+ // jQuery Ajax Functions
+ 'ajax', 'load', 'get', 'getJSON', 'getScript', 'post', 'ajaxComplete',
+ 'ajaxError', 'ajaxSend', 'ajaxStart', 'ajaxStop', 'ajaxSuccess', 'ajaxSetup',
+ 'serialize', 'serializeArray',
+ ),
+ 12 => array(
+ // jQuery Utility Functions
+ 'support', 'browser', 'version', 'boxModal', 'extend', 'grep', 'makeArray',
+ 'map', 'inArray', 'merge', 'unique', 'isArray', 'isFunction', 'trim',
+ 'param',
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '(', ')', '[', ']', '{', '}',
+ '+', '-', '*', '/', '%',
+ '!', '@', '&', '|', '^',
+ '<', '>', '=',
+ ',', ';', '?', ':'
+ ),
+ 1 => array(
+ '$'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ 8 => false,
+ 9 => false,
+ 10 => false,
+ 11 => false,
+ 12 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000066; font-weight: bold;',
+ 2 => 'color: #003366; font-weight: bold;',
+ 3 => 'color: #000066;',
+ 4 => 'color: #000066;',
+ 5 => 'color: #000066;',
+ 6 => 'color: #000066;',
+ 7 => 'color: #000066;',
+ 8 => 'color: #000066;',
+ 9 => 'color: #000066;',
+ 10 => 'color: #000066;',
+ 11 => 'color: #000066;',
+ 12 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #006600; font-style: italic;',
+ 2 => 'color: #009966; font-style: italic;',
+ 'MULTI' => 'color: #006600; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #3366CC;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #CC0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #660066;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;',
+ 1 => 'color: #000066;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => 'http://docs.jquery.com/Core/{FNAME}',
+ 5 => 'http://docs.jquery.com/Attributes/{FNAME}',
+ 6 => 'http://docs.jquery.com/Traversing/{FNAME}',
+ 7 => 'http://docs.jquery.com/Manipulation/{FNAME}',
+ 8 => 'http://docs.jquery.com/CSS/{FNAME}',
+ 9 => 'http://docs.jquery.com/Events/{FNAME}',
+ 10 => 'http://docs.jquery.com/Effects/{FNAME}',
+ 11 => 'http://docs.jquery.com/Ajax/{FNAME}',
+ 12 => 'http://docs.jquery.com/Utilities/{FNAME}'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<script type="text/javascript">' => '</script>'
+ ),
+ 1 => array(
+ '<script language="javascript">' => '</script>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/kixtart.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/kixtart.php
new file mode 100644
index 00000000..5b909198
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/kixtart.php
@@ -0,0 +1,329 @@
+<?php
+/*************************************************************************************
+ * kixtart.php
+ * --------
+ * Author: Riley McArdle (riley@glyff.net)
+ * Copyright: (c) 2007 Riley McArdle (http://www.glyff.net/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/08/31
+ *
+ * PHP language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2007/08/31 (1.0.7.22)
+ * - First Release
+ *
+ * TODO (updated 2007/08/31)
+ * -------------------------
+ * *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'KiXtart',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'While', 'Loop',
+ 'Use',
+ 'Small',
+ 'Sleep',
+ 'Shell',
+ 'SetTime',
+ 'SetM',
+ 'SetL',
+ 'Set',
+ 'Select', 'Case',
+ 'Run',
+ 'Return',
+ 'Redim',
+ 'RD',
+ 'Quit',
+ 'Play',
+ 'Move',
+ 'MD',
+ 'Include',
+ 'If', 'Else', 'Endif',
+ 'GoTo',
+ 'GoSub',
+ 'Go',
+ 'Global',
+ 'GetS',
+ 'Get',
+ 'Function', 'Endfunction',
+ 'For', 'Next',
+ 'Each',
+ 'FlushKb',
+ 'Exit',
+ 'Do', 'Until',
+ 'Display',
+ 'Dim',
+ 'Del',
+ 'Debug',
+ 'Copy',
+ 'Cookie1',
+ 'Color',
+ 'CLS',
+ 'CD',
+ 'Call',
+ 'Break',
+ 'Big',
+ 'Beep',
+ ),
+ 2 => array(
+ '@Address',
+ '@Build',
+ '@Color',
+ '@Comment',
+ '@CPU',
+ '@CRLF',
+ '@CSD',
+ '@CurDir',
+ '@Date',
+ '@Day',
+ '@Domain',
+ '@DOS',
+ '@Error',
+ '@FullName',
+ '@HomeDir',
+ '@HomeDrive',
+ '@HomeShr',
+ '@HostName',
+ '@InWin',
+ '@IPaddressX',
+ '@KiX',
+ '@LanRoot',
+ '@LDomain',
+ '@LDrive',
+ '@LM',
+ '@LogonMode',
+ '@LongHomeDir',
+ '@LServer',
+ '@MaxPWAge',
+ '@MDayNo',
+ '@MHz',
+ '@MonthNo',
+ '@Month',
+ '@MSecs',
+ '@OnWoW64',
+ '@PID',
+ '@PrimaryGroup',
+ '@Priv',
+ '@ProductSuite',
+ '@ProductType',
+ '@PWAge',
+ '@RAS',
+ '@Result',
+ '@RServer',
+ '@ScriptDir',
+ '@ScriptExe',
+ '@ScriptName',
+ '@SError',
+ '@SID',
+ '@Site',
+ '@StartDir',
+ '@SysLang',
+ '@Ticks',
+ '@Time',
+ '@TsSession',
+ '@UserID',
+ '@UserLang',
+ '@WDayNo',
+ '@Wksta',
+ '@WUserID',
+ '@YDayNo',
+ '@Year',
+ ),
+ 3 => array(
+ 'WriteValue',
+ 'WriteProfileString',
+ 'WriteLine',
+ 'VarTypeName',
+ 'VarType',
+ 'Val',
+ 'UnloadHive',
+ 'UCase',
+ 'Ubound',
+ 'Trim',
+ 'Substr',
+ 'SRnd',
+ 'Split',
+ 'SidToName',
+ 'ShutDown',
+ 'ShowProgramGroup',
+ 'SetWallpaper',
+ 'SetTitle',
+ 'SetSystemState',
+ 'SetOption',
+ 'SetFocus',
+ 'SetFileAttr',
+ 'SetDefaultPrinter',
+ 'SetConsole',
+ 'SetAscii',
+ 'SendMessage',
+ 'SendKeys',
+ 'SaveKey',
+ 'RTrim',
+ 'Round',
+ 'Rnd',
+ 'Right',
+ 'RedirectOutput',
+ 'ReadValue',
+ 'ReadType',
+ 'ReadProfileString',
+ 'ReadLine',
+ 'Open',
+ 'MessageBox',
+ 'MemorySize',
+ 'LTrim',
+ 'Logoff',
+ 'LogEvent',
+ 'LoadKey',
+ 'LoadHive',
+ 'Len',
+ 'Left',
+ 'LCase',
+ 'KeyExist',
+ 'KbHit',
+ 'Join',
+ 'IsDeclared',
+ 'Int',
+ 'InStrRev',
+ 'InStr',
+ 'InGroup',
+ 'IIF',
+ 'GetObject',
+ 'GetFileVersion',
+ 'GetFileTime',
+ 'GetFileSize',
+ 'GetFileAttr',
+ 'GetDiskSpace',
+ 'FreeFileHandle',
+ 'FormatNumber',
+ 'Fix',
+ 'ExpandEnvironmentVars',
+ 'Exist',
+ 'Execute',
+ 'EnumValue',
+ 'EnumLocalGroup',
+ 'EnumKey',
+ 'EnumIpInfo',
+ 'EnumGroup',
+ 'Dir',
+ 'DelValue',
+ 'DelTree',
+ 'DelProgramItem',
+ 'DelProgramGroup',
+ 'DelPrinterConnection',
+ 'DelKey',
+ 'DecToHex',
+ 'CStr',
+ 'CreateObject',
+ 'CompareFileTimes',
+ 'Close',
+ 'ClearEventLog',
+ 'CInt',
+ 'Chr',
+ 'CDbl',
+ 'Box',
+ 'BackupEventLog',
+ 'At',
+ 'AScan',
+ 'Asc',
+ 'AddProgramItem',
+ 'AddProgramGroup',
+ 'AddPrinterConnection',
+ 'AddKey',
+ 'Abs'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '?', ':', '+', '-', '*', '/', '&', '|', '^', '~', '<', '>', '='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://www.kixtart.org/manual/Commands/{FNAMEL}.htm',
+ 2 => '',
+ 3 => 'http://www.kixtart.org/manual/Functions/{FNAMEL}.htm'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/klonec.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/klonec.php
new file mode 100644
index 00000000..5f86e78d
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/klonec.php
@@ -0,0 +1,282 @@
+<?php
+/*************************************************************************************
+ * klonec.php
+ * --------
+ * Author: AUGER Mickael
+ * Copyright: Synchronic
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/04/16
+ *
+ * KLone with C language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/04/16 (1.0.8)
+ * - First Release
+ *
+ * TODO (updated 2008/04/16)
+ * -------------------------
+ * A tester et a completer si besoin
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'KLone C',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),//#pour precede les include de C
+ 'COMMENT_MULTI' => array('/*' => '*/', '<!--' => '-->' ),//comentaires C et KLone suivi de ceux pour HTML
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(//mots-cles C
+ 'if', 'return', 'while', 'case', 'class', 'continue', 'default',
+ 'do', 'else', 'for', 'switch', 'goto',
+ 'null', 'break', 'true', 'enum', 'extern', 'inline', 'false'
+ ),
+ 2 => array(//mots-cles KLone
+ 'out', 'request', 'response',
+ ),
+ 3 => array(//fonctions C usuelles
+ 'printf', 'malloc', 'fopen', 'fclose', 'free', 'fputs', 'fgets', 'feof', 'fwrite',
+ 'perror', 'ferror', 'qsort', 'stats', 'sscanf', 'scanf',
+ 'strdup', 'strcpy', 'strcmp', 'strncpy', 'strcasecmp', 'cat', 'strcat', 'strstr',
+ 'strlen', 'strtof', 'strtod', 'strtok', 'towlower', 'towupper',
+ 'cd', 'system', 'exit', 'exec', 'fork', 'vfork', 'kill', 'signal', 'syslog',
+ 'usleep', 'utime', 'wait', 'waitpid', 'waitid',
+ 'ceil', 'eval', 'round', 'floor',
+ 'atoi', 'atol', 'abs', 'cos', 'sin', 'tan', 'acos', 'asin', 'atan', 'exp',
+ 'time', 'ctime', 'localtime', 'asctime', 'gmtime', 'difftime', 'date'
+ ),
+ 4 => array(//fonctions KLone usuelles
+ 'request_get_cookies', 'request_get_cookie', 'request_get_args', 'request_get_arg',
+ 'request_io', 'request_get_uri', 'request_get_filename', 'request_get_query_string', 'request_get_path_info',
+ 'request_get_if_modified_since', 'request_get_http', 'request_get_client_request',
+ 'request_get_content_length', 'request_get_uploads', 'request_get_uploaded_file',
+ 'request_get_method', 'request_get_protocol', 'request_get_resolved_filename',
+ 'request_get_resolved_path_info', 'request_get_addr', 'request_get_peer_addr',
+ 'request_get_header', 'request_get_field', 'request_get_field_value',
+ 'response_set_content_encoding', 'response_disable_caching', 'response_enable_caching',
+ 'response_set_cookie', 'response_set_method', 'response_get_method',
+ 'response_print_header', 'response_set_field', 'response_del_field',
+ 'response_set_content_type', 'response_set_date', 'response_set_last_modified',
+ 'response_set_content_length', 'response_get_status', 'response_get_header',
+ 'response_io', 'response_redirect', 'response_set_status',
+ 'session_get_vars', 'session_get', 'session_set', 'session_age', 'session_clean', 'session_del',
+ 'io_type', 'io_pipe', 'io_dup', 'io_copy', 'io_seek', 'io_tell', 'io_close',
+ 'io_free', 'io_read', 'io_printf', 'io_flush', 'io_write', 'io_putc', 'io_getc',
+ 'io_get_until', 'io_gets', 'io_codec_add_head', 'io_codec_add_tail',
+ 'io_codecs_remove', 'io_name_set', 'io_name_get'
+ ),
+ 5 => array(//types C
+ 'auto', 'char', 'const', 'double', 'float', 'int', 'long',
+ 'register', 'short', 'signed', 'sizeof', 'static', 'string', 'struct',
+ 'typedef', 'union', 'unsigned', 'void', 'volatile',
+ 'wchar_t', 'time_t', 'FILE'
+ ),
+ 6 => array(//mots-cles HTML
+ 'a', 'abbr', 'acronym', 'address', 'applet',
+
+ 'base', 'basefont', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'b',
+
+ 'caption', 'center', 'cite', 'code', 'colgroup', 'col',
+
+ 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt',
+
+ 'em',
+
+ 'fieldset', 'font', 'form', 'frame', 'frameset',
+
+ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html',
+
+ 'iframe', 'ilayer', 'img', 'input', 'ins', 'isindex', 'i',
+
+ 'kbd',
+
+ 'label', 'legend', 'link', 'li',
+
+ 'map', 'meta',
+
+ 'noframes', 'noscript',
+
+ 'object', 'ol', 'optgroup', 'option',
+
+ 'param', 'pre', 'p',
+
+ 'q',
+
+ 'samp', 'script', 'select', 'small', 'span', 'strike', 'strong', 'style', 'sub', 'sup', 's',
+
+ 'table', 'tbody', 'td', 'textarea', 'text', 'tfoot', 'thead', 'th', 'title', 'tr', 'tt',
+
+ 'ul', 'u',
+
+ 'var',
+ ),
+ 7 => array(//autres mots-cles HTML
+ 'abbr', 'accept-charset', 'accept', 'accesskey', 'action', 'align', 'alink', 'alt', 'archive', 'axis',
+ 'background', 'bgcolor', 'border',
+ 'cellpadding', 'cellspacing', 'char', 'charoff', 'charset', 'checked', 'cite', 'class', 'classid', 'clear', 'code', 'codebase', 'codetype', 'color', 'cols', 'colspan', 'compact', 'content', 'coords',
+ 'data', 'datetime', 'declare', 'defer', 'dir', 'disabled',
+ 'enctype',
+ 'face', 'for', 'frame', 'frameborder',
+ 'headers', 'height', 'href', 'hreflang', 'hspace', 'http-equiv',
+ 'id', 'ismap',
+ 'label', 'lang', 'language', 'link', 'longdesc',
+ 'marginheight', 'marginwidth', 'maxlength', 'media', 'method', 'multiple',
+ 'name', 'nohref', 'noresize', 'noshade', 'nowrap',
+ 'object', 'onblur', 'onchange', 'onclick', 'ondblclick', 'onfocus', 'onkeydown', 'onkeypress', 'onkeyup', 'onload', 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onreset', 'onselect', 'onsubmit', 'onunload',
+ 'profile', 'prompt',
+ 'readonly', 'rel', 'rev', 'rowspan', 'rows', 'rules',
+ 'scheme', 'scope', 'scrolling', 'selected', 'shape', 'size', 'span', 'src', 'standby', 'start', 'style', 'summary',
+ 'tabindex', 'target', 'text', 'title', 'type',
+ 'usemap',
+ 'valign', 'value', 'valuetype', 'version', 'vlink', 'vspace',
+ 'width'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '<%=', '<%!', '<%', '%>'
+ ),
+ 0 => array(
+ '(', ')', '[', ']', '{', '}',
+ '!', '%', '&', '|', '/',
+ '<', '>',
+ '=', '-', '+', '*',
+ '.', ':', ',', ';', '^'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100; font-weight: bold;',//pour les mots-cles C
+ 2 => 'color: #000000; font-weight: bold;',//pour les mots-cles KLone
+ 3 => 'color: #6600FF;',//pour les fonctions C
+ 4 => 'color: #6600FF;',//pour les fonctions Klone
+ 5 => 'color: #0099FF; font-weight: bold;',//pour les types C
+ 6 => 'color: #990099; font-weight: bold;',//pour les mots-cles HTML
+ 7 => 'color: #000066;'//pour les autres mots-cles HTML
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',//commentaire sur une ligne C et KLone
+ 2 => 'color: #339933;',//pour les #... en C
+ 'MULTI' => 'color: #808080; font-style: italic;'//commentaire sur plusieurs lignes C et KLone
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;',
+ 1 => 'color: #000000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array(
+ 0 => 'background-color:#ffccff; font-weight: bold; color:#000000;',
+ 1 => '',
+ 2 => '',
+ 3 => 'color: #00bbdd; font-weight: bold;',
+ 4 => 'color: #ddbb00;',
+ 5 => 'color: #009900;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.opengroup.org/onlinepubs/009695399/functions/{FNAMEL}.html',
+ 4 => 'http://www.koanlogic.com/klone/api/html/globals.html',
+ 5 => '',
+ 6 => 'http://december.com/html/4/element/{FNAMEL}.html',
+ 7 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_ALWAYS,
+ 'SCRIPT_DELIMITERS' => array(
+ //delimiteurs pour KLone
+ 0 => array(
+ '<%=' => '%>'
+ ),
+ 1 => array(
+ '<%!' => '%>'
+ ),
+ 2 => array(
+ '<%' => '%>'
+ ),
+ //delimiteur pour HTML
+ 3 => array(
+ '<!DOCTYPE' => '>'
+ ),
+ 4 => array(
+ '&' => ';'
+ ),
+ 5 => array(
+ '<' => '>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => false,
+ 1 => true,
+ 2 => true,
+ 3 => false,
+ 4 => false,
+ 5 => true
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 6 => array(
+ 'DISALLOWED_BEFORE' => '(?<=&lt;|&lt;\/)',
+ 'DISALLOWED_AFTER' => '(?=\s|\/|&gt;)',
+ ),
+ 7 => array(
+ 'DISALLOWED_AFTER' => '(?=\s*=)',
+ )
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/klonecpp.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/klonecpp.php
new file mode 100644
index 00000000..6564c6b7
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/klonecpp.php
@@ -0,0 +1,310 @@
+<?php
+/*************************************************************************************
+ * klonecpp.php
+ * --------
+ * Author: AUGER Mickael
+ * Copyright: Synchronic
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/04/16
+ *
+ * KLone with C++ language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/04/16 (1.0.8)
+ * - First Release
+ *
+ * TODO (updated 2008/04/16)
+ * -------------------------
+ * A tester et a completer si besoin
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'KLone C++',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),//#pour precede les include de C
+ 'COMMENT_MULTI' => array('/*' => '*/', '<!--' => '-->' ),//comentaires C et KLone suivi de ceux pour HTML
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(//mots-cles C++
+ 'if', 'return', 'while', 'case', 'continue', 'default',
+ 'do', 'else', 'for', 'switch', 'goto',
+ 'break', 'true', 'enum', 'extern', 'inline', 'false',
+ 'errno', 'stdin', 'stdout', 'stderr',
+ 'virtual', 'public', 'private', 'protected', 'template', 'using', 'namespace',
+ 'try', 'catch', 'dynamic_cast', 'const_cast', 'reinterpret_cast',
+ 'static_cast', 'explicit', 'friend', 'typename', 'typeid', 'class',
+ 'EDOM', 'ERANGE', 'FLT_RADIX', 'FLT_ROUNDS', 'FLT_DIG', 'DBL_DIG', 'LDBL_DIG',
+ 'FLT_EPSILON', 'DBL_EPSILON', 'LDBL_EPSILON', 'FLT_MANT_DIG', 'DBL_MANT_DIG',
+ 'LDBL_MANT_DIG', 'FLT_MAX', 'DBL_MAX', 'LDBL_MAX', 'FLT_MAX_EXP', 'DBL_MAX_EXP',
+ 'LDBL_MAX_EXP', 'FLT_MIN', 'DBL_MIN', 'LDBL_MIN', 'FLT_MIN_EXP', 'DBL_MIN_EXP',
+ 'LDBL_MIN_EXP', 'CHAR_BIT', 'CHAR_MAX', 'CHAR_MIN', 'SCHAR_MAX', 'SCHAR_MIN',
+ 'UCHAR_MAX', 'SHRT_MAX', 'SHRT_MIN', 'USHRT_MAX', 'INT_MAX', 'INT_MIN',
+ 'UINT_MAX', 'LONG_MAX', 'LONG_MIN', 'ULONG_MAX', 'HUGE_VAL', 'SIGABRT',
+ 'SIGFPE', 'SIGILL', 'SIGINT', 'SIGSEGV', 'SIGTERM', 'SIG_DFL', 'SIG_ERR',
+ 'SIG_IGN', 'BUFSIZ', 'EOF', 'FILENAME_MAX', 'FOPEN_MAX', 'L_tmpnam', 'NULL',
+ 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX',
+ 'EXIT_FAILURE', 'EXIT_SUCCESS', 'RAND_MAX', 'CLOCKS_PER_SEC'
+ ),
+ 2 => array(//mots-cles KLone
+ 'out', 'request', 'response',
+ ),
+ 3 => array(//fonctions C++ usuelles
+ 'cin', 'cerr', 'clog', 'cout', 'delete', 'new', 'this',
+ 'printf', 'fprintf', 'snprintf', 'sprintf', 'assert',
+ 'isalnum', 'isalpha', 'isdigit', 'iscntrl', 'isgraph', 'islower', 'isprint',
+ 'ispunct', 'isspace', 'isupper', 'isxdigit', 'tolower', 'toupper',
+ 'exp', 'log', 'log10', 'pow', 'sqrt', 'ceil', 'floor', 'fabs', 'ldexp',
+ 'frexp', 'modf', 'fmod', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'atan2',
+ 'sinh', 'cosh', 'tanh', 'setjmp', 'longjmp',
+ 'va_start', 'va_arg', 'va_end', 'offsetof', 'sizeof', 'fopen', 'freopen',
+ 'fflush', 'fclose', 'remove', 'rename', 'tmpfile', 'tmpname', 'setvbuf',
+ 'setbuf', 'vfprintf', 'vprintf', 'vsprintf', 'fscanf', 'scanf', 'sscanf',
+ 'fgetc', 'fgets', 'fputc', 'fputs', 'getc', 'getchar', 'gets', 'putc',
+ 'putchar', 'puts', 'ungetc', 'fread', 'fwrite', 'fseek', 'ftell', 'rewind',
+ 'fgetpos', 'fsetpos', 'clearerr', 'feof', 'ferror', 'perror', 'abs', 'labs',
+ 'div', 'ldiv', 'atof', 'atoi', 'atol', 'strtod', 'strtol', 'strtoul', 'calloc',
+ 'malloc', 'realloc', 'free', 'abort', 'exit', 'atexit', 'system', 'getenv',
+ 'bsearch', 'qsort', 'rand', 'srand', 'strcpy', 'strncpy', 'strcat', 'strncat',
+ 'strcmp', 'strncmp', 'strcoll', 'strchr', 'strrchr', 'strspn', 'strcspn',
+ 'strpbrk', 'strstr', 'strlen', 'strerror', 'strtok', 'strxfrm', 'memcpy',
+ 'memmove', 'memcmp', 'memchr', 'memset', 'clock', 'time', 'difftime', 'mktime',
+ 'asctime', 'ctime', 'gmtime', 'localtime', 'strftime'
+ ),
+ 4 => array(//fonctions KLone usuelles
+ 'request_get_cookies', 'request_get_cookie', 'request_get_args', 'request_get_arg',
+ 'request_io', 'request_get_uri', 'request_get_filename', 'request_get_query_string', 'request_get_path_info',
+ 'request_get_if_modified_since', 'request_get_http', 'request_get_client_request',
+ 'request_get_content_length', 'request_get_uploads', 'request_get_uploaded_file',
+ 'request_get_method', 'request_get_protocol', 'request_get_resolved_filename',
+ 'request_get_resolved_path_info', 'request_get_addr', 'request_get_peer_addr',
+ 'request_get_header', 'request_get_field', 'request_get_field_value',
+ 'response_set_content_encoding', 'response_disable_caching', 'response_enable_caching',
+ 'response_set_cookie', 'response_set_method', 'response_get_method',
+ 'response_print_header', 'response_set_field', 'response_del_field',
+ 'response_set_content_type', 'response_set_date', 'response_set_last_modified',
+ 'response_set_content_length', 'response_get_status', 'response_get_header',
+ 'response_io', 'response_redirect', 'response_set_status',
+ 'session_get_vars', 'session_get', 'session_set', 'session_age', 'session_clean', 'session_del',
+ 'io_type', 'io_pipe', 'io_dup', 'io_copy', 'io_seek', 'io_tell', 'io_close',
+ 'io_free', 'io_read', 'io_printf', 'io_flush', 'io_write', 'io_putc', 'io_getc',
+ 'io_get_until', 'io_gets', 'io_codec_add_head', 'io_codec_add_tail',
+ 'io_codecs_remove', 'io_name_set', 'io_name_get'
+ ),
+ 5 => array(//types C++
+ 'auto', 'bool', 'char', 'const', 'double', 'float', 'int', 'long', 'longint',
+ 'register', 'short', 'shortint', 'signed', 'static', 'struct',
+ 'typedef', 'union', 'unsigned', 'void', 'volatile', 'jmp_buf',
+ 'signal', 'raise', 'va_list', 'ptrdiff_t', 'size_t', 'FILE', 'fpos_t',
+ 'div_t', 'ldiv_t', 'clock_t', 'time_t', 'tm',
+ 'string', 'wchar_t'
+ ),
+ 6 => array(//mots-cles HTML
+ 'a', 'abbr', 'acronym', 'address', 'applet',
+
+ 'base', 'basefont', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'b',
+
+ 'caption', 'center', 'cite', 'code', 'colgroup', 'col',
+
+ 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt',
+
+ 'em',
+
+ 'fieldset', 'font', 'form', 'frame', 'frameset',
+
+ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html',
+
+ 'iframe', 'ilayer', 'img', 'input', 'ins', 'isindex', 'i',
+
+ 'kbd',
+
+ 'label', 'legend', 'link', 'li',
+
+ 'map', 'meta',
+
+ 'noframes', 'noscript',
+
+ 'object', 'ol', 'optgroup', 'option',
+
+ 'param', 'pre', 'p',
+
+ 'q',
+
+ 'samp', 'script', 'select', 'small', 'span', 'strike', 'strong', 'style', 'sub', 'sup', 's',
+
+ 'table', 'tbody', 'td', 'textarea', 'text', 'tfoot', 'thead', 'th', 'title', 'tr', 'tt',
+
+ 'ul', 'u',
+
+ 'var',
+ ),
+ 7 => array(//autres mots-cles HTML
+ 'abbr', 'accept-charset', 'accept', 'accesskey', 'action', 'align', 'alink', 'alt', 'archive', 'axis',
+ 'background', 'bgcolor', 'border',
+ 'cellpadding', 'cellspacing', 'char', 'charoff', 'charset', 'checked', 'cite', 'class', 'classid', 'clear', 'code', 'codebase', 'codetype', 'color', 'cols', 'colspan', 'compact', 'content', 'coords',
+ 'data', 'datetime', 'declare', 'defer', 'dir', 'disabled',
+ 'enctype',
+ 'face', 'for', 'frame', 'frameborder',
+ 'headers', 'height', 'href', 'hreflang', 'hspace', 'http-equiv',
+ 'id', 'ismap',
+ 'label', 'lang', 'language', 'link', 'longdesc',
+ 'marginheight', 'marginwidth', 'maxlength', 'media', 'method', 'multiple',
+ 'name', 'nohref', 'noresize', 'noshade', 'nowrap',
+ 'object', 'onblur', 'onchange', 'onclick', 'ondblclick', 'onfocus', 'onkeydown', 'onkeypress', 'onkeyup', 'onload', 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onreset', 'onselect', 'onsubmit', 'onunload',
+ 'profile', 'prompt',
+ 'readonly', 'rel', 'rev', 'rowspan', 'rows', 'rules',
+ 'scheme', 'scope', 'scrolling', 'selected', 'shape', 'size', 'span', 'src', 'standby', 'start', 'style', 'summary',
+ 'tabindex', 'target', 'text', 'title', 'type',
+ 'usemap',
+ 'valign', 'value', 'valuetype', 'version', 'vlink', 'vspace',
+ 'width'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '<%=', '<%!', '<%', '%>'
+ ),
+ 0 => array(
+ '(', ')', '[', ']', '{', '}',
+ '!', '%', '&', '|', '/',
+ '<', '>',
+ '=', '-', '+', '*',
+ '.', ':', ',', ';', '^'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100; font-weight: bold;',//pour les mots-cles C++
+ 2 => 'color: #000000; font-weight: bold;',//pour les mots-cles KLone
+ 3 => 'color: #6600FF;',//pour les fonctions C++
+ 4 => 'color: #6600FF;',//pour les fonctions Klone
+ 5 => 'color: #0099FF; font-weight: bold;',//pour les types C++
+ 6 => 'color: #990099; font-weight: bold;',//pour les mots-cles HTML
+ 7 => 'color: #000066;'//pour les autres mots-cles HTML
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',//commentaire sur une ligne C++ et KLone
+ 2 => 'color: #339933;',//pour les #... en C++
+ 'MULTI' => 'color: #808080; font-style: italic;'//commentaire sur plusieurs lignes C++ et KLone
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;',
+ 1 => 'color: #000000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array(
+ 0 => 'background-color:#ffccff; font-weight: bold; color:#000000;',
+ 1 => '',
+ 2 => '',
+ 3 => 'color: #00bbdd; font-weight: bold;',
+ 4 => 'color: #ddbb00;',
+ 5 => 'color: #009900;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.opengroup.org/onlinepubs/009695399/functions/{FNAMEL}.html',
+ 4 => 'http://www.koanlogic.com/klone/api/html/globals.html',
+ 5 => '',
+ 6 => 'http://december.com/html/4/element/{FNAMEL}.html',
+ 7 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_ALWAYS,
+ 'SCRIPT_DELIMITERS' => array(
+ //delimiteurs pour KLone
+ 0 => array(
+ '<%=' => '%>'
+ ),
+ 1 => array(
+ '<%!' => '%>'
+ ),
+ 2 => array(
+ '<%' => '%>'
+ ),
+ //delimiteur pour HTML
+ 3 => array(
+ '<!DOCTYPE' => '>'
+ ),
+ 4 => array(
+ '&' => ';'
+ ),
+ 5 => array(
+ '<' => '>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => false,
+ 1 => true,
+ 2 => true,
+ 3 => false,
+ 4 => false,
+ 5 => true
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 6 => array(
+ 'DISALLOWED_BEFORE' => '(?<=&lt;|&lt;\/)',
+ 'DISALLOWED_AFTER' => '(?=\s|\/|&gt;)',
+ ),
+ 7 => array(
+ 'DISALLOWED_AFTER' => '(?=\s*=)',
+ )
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/latex.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/latex.php
new file mode 100644
index 00000000..386a0b98
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/latex.php
@@ -0,0 +1,223 @@
+<?php
+/*************************************************************************************
+ * latex.php
+ * -----
+ * Author: efi, Matthias Pospiech (matthias@pospiech.eu)
+ * Copyright: (c) 2006 efi, Matthias Pospiech (matthias@pospiech.eu), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/09/23
+ *
+ * LaTeX language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/08/18 (1.0.8.1)
+ * - Changes in color and some additional command recognition
+ * - No special Color for Brackets, it is only distracting
+ * if color should be reintroduced it should be less bright
+ * - Math color changed from green to violett, since green is now used for comments
+ * - Comments are now colored and the only green. The reason for coloring the comments
+ * is that often important information is in the comments und was merely unvisible before.
+ * - New Color for [Options]
+ * - color for labels not specialised anymore. It makes sence in large documents but less in
+ * small web examples.
+ * - \@keyword introduced
+ * - Fixed \& escaped ampersand
+ * 2006/09/23 (1.0.0)
+ * - First Release
+ *
+ * TODO
+ * -------------------------
+ * *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'LaTeX',
+ 'COMMENT_SINGLE' => array(
+ 1 => '%'
+ ),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'addlinespace','and','address','appendix','author','backmatter',
+ 'bfseries','bibitem','bigskip','blindtext','caption','captionabove',
+ 'captionbelow','cdot','centering','chapter','cite','color',
+ 'colorbox','date','dedication','def','definecolor','documentclass',
+ 'edef','else','email','emph','eqref','extratitle','fbox','fi',
+ 'flushleft','flushright','footnote','frac','frontmatter',
+ 'graphicspath','hfil','hfill','hfilll','hline','hspace','huge','ifx','include',
+ 'includegraphics','infty','input','int','item','itemsep',
+ 'KOMAoption','KOMAoptions','label','LaTeX','left','let','limits',
+ 'listfiles','listoffigures','listoftables','lowertitleback',
+ 'mainmatter','makeatletter','makeatother','makebox','makeindex',
+ 'maketitle','mbox','mediumskip','newcommand','newenvironment',
+ 'newpage','nocite','nonumber','pagestyle','par','paragraph',
+ 'parbox','parident','parskip','partial','publishers','raggedleft',
+ 'raggedright','raisebox','ref','renewcommand','renewenvironment',
+ 'right','rule','section','setlength','sffamily','subject',
+ 'subparagraph','subsection','subsubsection','subtitle','sum',
+ 'table','tableofcontents','textbf','textcolor','textit',
+ 'textnormal','textsuperscript','texttt','textwidth','thanks','title',
+ 'titlehead','today','ttfamily','uppertitleback','urlstyle',
+ 'usepackage','vfil','vfill','vfilll','vspace'
+ )
+ ),
+ 'SYMBOLS' => array(
+ "&", "\\", "{", "}", "[", "]"
+ ),
+ 'CASE_SENSITIVE' => array(
+ 1 => true,
+ GESHI_COMMENTS => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #800000;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #2C922C; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000000; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'NUMBERS' => array(
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #E02020; '
+ ),
+ 'REGEXPS' => array(
+ 1 => 'color: #8020E0; font-weight: normal;', // Math inner
+ 2 => 'color: #C08020; font-weight: normal;', // [Option]
+ 3 => 'color: #8020E0; font-weight: normal;', // Maths
+ 4 => 'color: #800000; font-weight: normal;', // Structure: Labels
+ 5 => 'color: #00008B; font-weight: bold;', // Structure (\section{->x<-})
+ 6 => 'color: #800000; font-weight: normal;', // Structure (\section)
+ 7 => 'color: #0000D0; font-weight: normal;', // Environment \end or \begin{->x<-} (brighter blue)
+ 8 => 'color: #C00000; font-weight: normal;', // Structure \end or \begin
+ 9 => 'color: #2020C0; font-weight: normal;', // {...}
+ 10 => 'color: #800000; font-weight: normal;', // \%, \& etc.
+ 11 => 'color: #E00000; font-weight: normal;', // \@keyword
+ 12 => 'color: #800000; font-weight: normal;', // \keyword
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://www.golatex.de/wiki/index.php?title=%5C{FNAME}',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ // Math inner
+ 1 => array(
+ GESHI_SEARCH => "(\\\\begin\\{(equation|displaymath|eqnarray|subeqnarray|math|multline|gather|align|alignat|flalign)\\})(.*)(\\\\end\\{\\2\\})",
+ GESHI_REPLACE => '\3',
+ GESHI_MODIFIERS => 'Us',
+ GESHI_BEFORE => '\1',
+ GESHI_AFTER => '\4'
+ ),
+ // [options]
+ 2 => array(
+ GESHI_SEARCH => "(?<=\[).*(?=\])",
+ GESHI_REPLACE => '\0',
+ GESHI_MODIFIERS => 'Us',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ // Math mode with $ ... $
+ 3 => array(
+ GESHI_SEARCH => "\\$.+\\$",
+ GESHI_REPLACE => '\0',
+ GESHI_MODIFIERS => 'Us',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ // Structure: Label
+ 4 => "\\\\(?:label|pageref|ref|cite)(?=[^a-zA-Z])",
+ // Structure: sections
+ 5 => array(
+ GESHI_SEARCH => "(\\\\(?:part|chapter|(?:sub){0,2}section|(?:sub)?paragraph|addpart|addchap|addsec)\*?\\{)(.*)(?=\\})",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'U',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ // Structure: sections
+ 6 => "\\\\(?:part|chapter|(?:sub){0,2}section|(?:sub)?paragraph|addpart|addchap|addsec)\*?(?=[^a-zA-Z])",
+ // environment \begin{} and \end{} (i.e. the things inside the {})
+ 7 => array(
+ GESHI_SEARCH => "(\\\\(?:begin|end)\\{)(.*)(?=\\})",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'U',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ // Structure \begin and \end
+ 8 => "\\\\(?:end|begin)(?=[^a-zA-Z])",
+ // {parameters}
+ 9 => array(
+ GESHI_SEARCH => "(?<=\\{)(?!<\|!REG3XP5!>).*?(?=\\})",
+ GESHI_REPLACE => '\0',
+ GESHI_MODIFIERS => 'Us',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ // \%, \& usw.
+ 10 => "\\\\(?:[_$%]|&amp;)",
+ // \@keywords
+ 11 => "(?<!<\|!REG3XP[8]!>)\\\\@[a-zA-Z]+\*?",
+ // \keywords
+ 12 => "(?<!<\|!REG3XP[468]!>)\\\\[a-zA-Z]+\*?",
+
+// ---------------------------------------------
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'COMMENTS' => array(
+ 'DISALLOWED_BEFORE' => '\\'
+ ),
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<=\\\\)",
+ 'DISALLOWED_AFTER' => "(?![A-Za-z0-9])"
+ ),
+ 'ENABLE_FLAGS' => array(
+ 'NUMBERS' => GESHI_NEVER,
+ 'BRACKETS' => GESHI_NEVER
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lb.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lb.php
new file mode 100644
index 00000000..6c288289
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lb.php
@@ -0,0 +1,162 @@
+<?php
+/*************************************************************************************
+ * lb.php
+ * --------
+ * Author: Chris Iverson (cj.no.one@gmail.com)
+ * Copyright: (c) 2010 Chris Iverson
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/07/18
+ *
+ * Liberty BASIC language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/22
+ * - First Release
+ *
+ * 2010/08/23
+ * - Added missing default variables
+ *
+ * TODO (updated 2010/07/20)
+ * -------------------------
+ * Prevent highlighting numbers in handle names(constants beginning with #)
+ * Allow number highlighting after a single period(e.g. .9 = 0.9, should be
+ * highlighted
+ * Prevent highlighting keywords within branch labels(within brackets)
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Liberty BASIC',
+ 'COMMENT_SINGLE' => array(1 => '\''),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'and', 'append', 'as', 'beep', 'bmpbutton', 'bmpsave', 'boolean',
+ 'button', 'byref', 'call', 'callback', 'calldll', 'callfn', 'case',
+ 'checkbox', 'close', 'cls', 'colordialog', 'combobox', 'confirm',
+ 'cursor', 'data', 'dialog', 'dim', 'dll', 'do', 'double', 'dump',
+ 'dword', 'else', 'end', 'error', 'exit', 'field', 'filedialog',
+ 'files', 'fontdialog', 'for', 'function', 'get', 'gettrim',
+ 'global', 'gosub', 'goto', 'graphicbox', 'graphics', 'groupbox',
+ 'if', 'input', 'kill', 'let', 'line', 'listbox', 'loadbmp',
+ 'locate', 'long', 'loop', 'lprint', 'mainwin', 'maphandle', 'menu',
+ 'mod', 'name', 'next', 'nomainwin', 'none', 'notice', 'on',
+ 'oncomerror', 'or', 'open', 'out', 'output', 'password', 'playmidi',
+ 'playwave', 'popupmenu', 'print', 'printerdialog', 'prompt', 'ptr',
+ 'put', 'radiobutton', 'random', 'randomize', 'read', 'readjoystick',
+ 'redim', 'rem', 'restore', 'resume', 'return', 'run', 'scan',
+ 'seek', 'select', 'short', 'sort', 'statictext', 'stop', 'stopmidi',
+ 'struct', 'stylebits', 'sub', 'text', 'textbox', 'texteditor',
+ 'then', 'timer', 'titlebar', 'to', 'trace', 'ulong', 'unloadbmp',
+ 'until', 'ushort', 'void', 'wait', 'window', 'wend', 'while',
+ 'word', 'xor'
+ ),
+ 2 => array(
+ 'abs', 'acs', 'asc', 'asn', 'atn', 'chr$', 'cos', 'date$',
+ 'dechex$', 'eof', 'eval', 'eval$', 'exp', 'hbmp', 'hexdec', 'hwnd',
+ 'inp', 'input$', 'inputto$', 'instr', 'int', 'left$', 'len', 'lof',
+ 'log', 'lower$', 'max', 'midipos', 'mid$', 'min', 'mkdir', 'not',
+ 'right$', 'rmdir', 'rnd', 'sin', 'space$', 'sqr', 'str$', 'tab',
+ 'tan', 'time$', 'trim$', 'txcount', 'upper$', 'using', 'val',
+ 'winstring', 'word$'
+ ),
+ 3 => array(
+ 'BackgroundColor$', 'Com', 'ComboboxColor$', 'ComError', 'ComErrorNumber',
+ 'CommandLine$', 'ComPortNumber', 'DefaultDir$',
+ 'DisplayHeight', 'DisplayWidth', 'Drives$', 'Err', 'Err$',
+ 'ForegroundColor$', 'Inkey$', 'Joy1x', 'Joy1y', 'Joy1z',
+ 'Joy1button1', 'Joy1button2', 'Joy2x', 'Joy2y', 'Joy2z',
+ 'Joy2button1', 'Joy2button2', 'ListboxColor$', 'MouseX', 'MouseY', 'Platform$',
+ 'PrintCollate', 'PrintCopies', 'PrinterFont$', 'PrinterName$', 'StartupDir$',
+ 'TextboxColor$', 'TexteditorColor$', 'Version$', 'WindowHeight',
+ 'WindowWidth', 'UpperLeftX', 'UpperLeftY'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(', ')', '[', ']', '+', '-', '*', '/', '%', '=', '<', '>', ':', ',', '#'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000FF;',
+ 2 => 'color: #AD0080;',
+ 3 => 'color: #008080;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF0000;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 2 => array(
+ //In LB, the second keyword list is a list of built-in functions,
+ //and their names should not be highlighted unless being used
+ //as a function name.
+ 'DISALLOWED_AFTER' => '(?=\s*\()'
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ldif.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ldif.php
new file mode 100644
index 00000000..42481838
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ldif.php
@@ -0,0 +1,116 @@
+<?php
+/*************************************************************************************
+ * ldif.php
+ * --------
+ * Author: Bruno Harbulot (Bruno.Harbulot@manchester.ac.uk)
+ * Copyright: (c) 2005 deguix, (c) 2010 Bruno Harbulot
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/03/01
+ *
+ * LDIF language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/03/01 (1.0.8.11)
+ * - First Release
+ * - Derived from ini.php (INI language), (c) 2005 deguix
+ *
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'LDIF',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => ''
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #933;'
+ ),
+ 'NUMBERS' => array(
+ 0 => ''
+ ),
+ 'METHODS' => array(
+ 0 => ''
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #000066; font-weight: bold;',
+ 1 => 'color: #FF0000;'
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => array(
+ GESHI_SEARCH => '([a-zA-Z0-9_]+):(.+)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ':\\2'
+ ),
+ 1 => array(
+ // Evil hackery to get around GeSHi bug: <>" and ; are added so <span>s can be matched
+ // Explicit match on variable names because if a comment is before the first < of the span
+ // gets chewed up...
+ GESHI_SEARCH => '([<>";a-zA-Z0-9_]+):(.+)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1:',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lisp.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lisp.php
new file mode 100644
index 00000000..be823a40
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lisp.php
@@ -0,0 +1,144 @@
+<?php
+/*************************************************************************************
+ * lisp.php
+ * --------
+ * Author: Roberto Rossi (rsoftware@altervista.org)
+ * Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/08/30
+ *
+ * Generic Lisp language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/12/9 (1.0.2)
+ * - Added support for :keywords and ::access (Denis Mashkevich)
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/08/30 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Lisp',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(';|' => '|;'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'not','defun','princ','when',
+ 'eval','apply','funcall','quote','identity','function',
+ 'complement','backquote','lambda','set','setq','setf',
+ 'defmacro','gensym','make','symbol','intern',
+ 'name','value','plist','get',
+ 'getf','putprop','remprop','hash','array','aref',
+ 'car','cdr','caar','cadr','cdar','cddr','caaar','caadr','cadar',
+ 'caddr','cdaar','cdadr','cddar','cdddr','caaaar','caaadr',
+ 'caadar','caaddr','cadaar','cadadr','caddar','cadddr',
+ 'cdaaar','cdaadr','cdadar','cdaddr','cddaar','cddadr',
+ 'cdddar','cddddr','cons','list','append','reverse','last','nth',
+ 'nthcdr','member','assoc','subst','sublis','nsubst',
+ 'nsublis','remove','length',
+ 'mapc','mapcar','mapl','maplist','mapcan','mapcon','rplaca',
+ 'rplacd','nconc','delete','atom','symbolp','numberp',
+ 'boundp','null','listp','consp','minusp','zerop','plusp',
+ 'evenp','oddp','eq','eql','equal','cond','case','and','or',
+ 'let','l','if','prog','prog1','prog2','progn','go','return',
+ 'do','dolist','dotimes','catch','throw','error','cerror','break',
+ 'continue','errset','baktrace','evalhook','truncate','float',
+ 'rem','min','max','abs','sin','cos','tan','expt','exp','sqrt',
+ 'random','logand','logior','logxor','lognot','bignums','logeqv',
+ 'lognand','lognor','logorc2','logtest','logbitp','logcount',
+ 'integer','nil','parse-integer','make-list','print','write'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']',
+ '!', '%', '^', '&',
+ ' + ',' - ',' * ',' / ',
+ '=','<','>',
+ '.',':',',',';',
+ '|'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #555;',
+ 1 => 'color: #555;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ '::', ':'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'OOLANG' => array(
+ 'MATCH_AFTER' => '[a-zA-Z][a-zA-Z0-9_\-]*'
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/llvm.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/llvm.php
new file mode 100644
index 00000000..580099b5
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/llvm.php
@@ -0,0 +1,385 @@
+<?php
+/*************************************************************************************
+ * llvm.php
+ * --------
+ * Author: Benny Baumann (BenBE@geshi.org), Azriel Fasten (azriel.fasten@gmail.com)
+ * Copyright: (c) 2010 Benny Baumann (http://qbnz.com/highlighter/), Azriel Fasten (azriel.fasten@gmail.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/10/14
+ *
+ * LLVM language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/10/14 (1.0.8.10)
+ * - First Release
+ *
+ * TODO (updated 2010/10/14)
+ * -------------------------
+ * * Check if all links aren't broken
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'LLVM Intermediate Representation',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'HARDQUOTE' => array("\"", "\""),
+ 'HARDESCAPE' => array("\"", "\\"),
+ 'HARDCHAR' => "\\",
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ // 1 => "#\\\\[nfrtv\$\"\n\\\\]#i",
+ //Hexadecimal Char Specs
+ // 2 => "#\\\\x[\da-fA-F]{1,2}#i",
+ //Octal Char Specs
+ // 3 => "#\\\\[0-7]{1,3}#",
+ //String Parsing of Variable Names
+ // 4 => "#\\$[a-z0-9_]+(?:\\[[a-z0-9_]+\\]|->[a-z0-9_]+)?|(?:\\{\\$|\\$\\{)[a-z0-9_]+(?:\\[('?)[a-z0-9_]*\\1\\]|->[a-z0-9_]+)*\\}#i",
+ //Experimental extension supporting cascaded {${$var}} syntax
+ // 5 => "#\$[a-z0-9_]+(?:\[[a-z0-9_]+\]|->[a-z0-9_]+)?|(?:\{\$|\$\{)[a-z0-9_]+(?:\[('?)[a-z0-9_]*\\1\]|->[a-z0-9_]+)*\}|\{\$(?R)\}#i",
+ //Format String support in ""-Strings
+ // 6 => "#%(?:%|(?:\d+\\\\\\\$)?\\+?(?:\x20|0|'.)?-?(?:\d+|\\*)?(?:\.\d+)?[bcdefFosuxX])#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 0 => array(
+ 'to', 'nuw', 'nsw', 'align', 'inbounds', 'entry', 'return'
+ ),
+ //Terminator Instructions
+ 1 => array(
+ 'ret', 'br', 'switch', 'indirectbr', 'invoke', 'unwind', 'unreachable'
+ ),
+ //Binary Operations
+ 2 => array(
+ 'add', 'fadd', 'sub', 'fsub', 'mul', 'fmul', 'udiv', 'sdiv', 'fdiv', 'urem', 'frem', 'srem'
+ ),
+ //Bitwise Binary Operations
+ 3 => array(
+ 'shl', 'lshr', 'ashr', 'and', 'or', 'xor'
+ ),
+ //Vector Operations
+ 4 => array(
+ 'extractelement', 'insertelement', 'shufflevector'
+ ),
+ //Aggregate Operations
+ 5 => array(
+ 'extractvalue', 'insertvalue'
+ ),
+ //Memory Access and Addressing Operations
+ 6 => array(
+ 'alloca', 'load', 'store', 'getelementptr'
+ ),
+ //Conversion Operations
+ 7 => array(
+ 'trunc', 'zext', 'sext', 'fptrunc', 'fpext', 'fptoui', 'fptosi',
+ 'uitofp', 'sitofp', 'ptrtoint', 'inttoptr', 'bitcast'
+ ),
+ //Other Operations
+ 8 => array(
+ 'icmp', 'fcmp', 'phi', 'select', 'call', 'va_arg'
+ ),
+ //Linkage Types
+ 9 => array(
+ 'private', 'linker_private', 'linker_private_weak', 'linker_private_weak_def_auto',
+ 'internal', 'available_externally', 'linkonce', 'common', 'weak', 'appending',
+ 'extern_weak', 'linkonce_odr', 'weak_odr', 'externally visible', 'dllimport', 'dllexport',
+ ),
+ //Calling Conventions
+ 10 => array(
+ 'ccc', 'fastcc', 'coldcc', 'cc 10'
+ ),
+ //Named Types
+ 11 => array(
+ 'type'
+ ),
+ //Parameter Attributes
+ 12 => array(
+ 'zeroext', 'signext', 'inreg', 'byval', 'sret', 'noalias', 'nocapture', 'nest'
+ ),
+ //Function Attributes
+ 13 => array(
+ 'alignstack', 'alwaysinline', 'inlinehint', 'naked', 'noimplicitfloat', 'noinline', 'noredzone', 'noreturn',
+ 'nounwind', 'optsize', 'readnone', 'readonly', 'ssp', 'sspreq',
+ ),
+ //Module-Level Inline Assembly
+ 14 => array(
+ 'module asm'
+ ),
+ //Data Layout
+ 15 => array(
+ 'target datalayout'
+ ),
+ //Primitive Types
+ 16 => array(
+ 'x86mmx',
+ 'void',
+ 'label',
+ 'metadata',
+ 'opaque'
+ ),
+ //Floating Point Types
+ 17 => array(
+ 'float', 'double', 'fp128', 'x86_fp80', 'ppc_fp128',
+ ),
+ //Simple Constants
+ 18 => array(
+ 'false', 'true', 'null'
+ ),
+ //Global Variable and Function Addresses
+ 19 => array(
+ 'global', 'addrspace', 'constant', 'section'
+ ),
+ //Functions
+ 20 => array(
+ 'declare', 'define'
+ ),
+ //Complex Constants
+ 21 => array(
+ 'zeroinitializer'
+ ),
+ //Undefined Values
+ 22 => array(
+ 'undef'
+ ),
+ //Addresses of Basic Blocks
+ 23 => array(
+ 'blockaddress'
+ ),
+ //Visibility Styles
+ 24 => array(
+ 'default', 'hidden', 'protected'
+ ),
+ 25 => array(
+ 'volatile'
+ ),
+ 26 => array(
+ 'tail'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '(', ')', '[', ']', '{', '}',
+ '!', '@', '%', '&', '|', '/',
+ '<', '>',
+ '=', '-', '+', '*',
+ '.', ':', ',', ';'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ 9 => true,
+ 10 => true,
+ 11 => true,
+ 12 => true,
+ 13 => true,
+ 14 => true,
+ 15 => true,
+ 16 => true,
+ 17 => true,
+ 18 => true,
+ 19 => true,
+ 20 => true,
+ 21 => true,
+ 22 => true,
+ 23 => true,
+ 24 => true,
+ 25 => true,
+ 26 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 0 => 'color: #209090;',
+ 1 => 'color: #0000F0;',
+ 2 => 'color: #00F000; font-weight: bold;',
+ 3 => 'color: #F00000;',
+ 4 => 'color: #00F0F0; font-weight: bold;',
+ 5 => 'color: #F000F0; font-weight: bold;',
+ 6 => 'color: #403020; font-weight: bold;',
+ 7 => 'color: #909090; font-weight: bold;',
+ 8 => 'color: #009090; font-weight: bold;',
+ 9 => 'color: #900090; font-weight: bold;',
+ 10 => 'color: #909000; font-weight: bold;',
+ 11 => 'color: #000090; font-weight: bold;',
+ 12 => 'color: #900000; font-weight: bold;',
+ 13 => 'color: #009000; font-weight: bold;',
+ 14 => 'color: #F0F090; font-weight: bold;',
+ 15 => 'color: #F090F0; font-weight: bold;',
+ 16 => 'color: #90F0F0; font-weight: bold;',
+ 17 => 'color: #9090F0; font-weight: bold;',
+ 18 => 'color: #90F090; font-weight: bold;',
+ 19 => 'color: #F09090; font-weight: bold;',
+ 20 => 'color: #4040F0; font-weight: bold;',
+ 21 => 'color: #40F040; font-weight: bold;',
+ 22 => 'color: #F04040; font-weight: bold;',
+ 23 => 'color: #F0F040; font-weight: bold;',
+ 24 => 'color: #F040F0; font-weight: bold;',
+ 25 => 'color: #40F0F0; font-weight: bold;',
+ 26 => 'color: #904040; font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #660099; font-weight: bold;',
+ 3 => 'color: #660099; font-weight: bold;',
+ 4 => 'color: #006699; font-weight: bold;',
+ 5 => 'color: #006699; font-weight: bold; font-style: italic;',
+ 6 => 'color: #009933; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;',
+ 'HARD' => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #004000;',
+ 2 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;',
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #007088;',
+ 1 => 'color: #007088;',
+ // 2 => 'color: #000088;',
+ 3 => 'color: #700088;',
+ 4 => 'color: #010088;',
+ // 5 => 'color: #610088;',
+ // 6 => 'color: #616088;',
+ // 7 => 'color: #616988;',
+ // 8 => 'color: #616908;',
+ 9 => 'color: #6109F8;',
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ )
+ ),
+ 'URLS' => array(
+ 0 => '',
+ 1 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 2 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 3 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 4 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 5 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 6 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 7 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 8 => 'http://llvm.org/docs/LangRef.html#i_{FNAME}',
+ 9 => 'http://llvm.org/docs/LangRef.html#linkage_{FNAME}',
+ 10 => 'http://llvm.org/docs/LangRef.html#callingconv',
+ 11 => 'http://llvm.org/docs/LangRef.html#namedtypes',
+ 12 => 'http://llvm.org/docs/LangRef.html#paramattrs',
+ 13 => 'http://llvm.org/docs/LangRef.html#fnattrs',
+ 14 => 'http://llvm.org/docs/LangRef.html#moduleasm',
+ 15 => 'http://llvm.org/docs/LangRef.html#datalayout',
+ 16 => 'http://llvm.org/docs/LangRef.html#t_{FNAME}',
+ 17 => 'http://llvm.org/docs/LangRef.html#t_floating',
+ 18 => 'http://llvm.org/docs/LangRef.html#simpleconstants',
+ 19 => 'http://llvm.org/docs/LangRef.html#globalvars',
+ 20 => 'http://llvm.org/docs/LangRef.html#functionstructure',
+ 21 => 'http://llvm.org/docs/LangRef.html#complexconstants',
+ 22 => 'http://llvm.org/docs/LangRef.html#undefvalues',
+ 23 => 'http://llvm.org/docs/LangRef.html#blockaddress',
+ 24 => 'http://llvm.org/docs/LangRef.html#visibility',
+ 25 => 'http://llvm.org/docs/LangRef.html#volatile',
+ 26 => 'http://llvm.org/docs/LangRef.html#i_call',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Variables
+ 0 => '%[-a-zA-Z$\._][-a-zA-Z$\._0-9]*',
+ //Labels
+ // 1 => '[-a-zA-Z$\._0-9]+:',
+ 1 => '(?<!\w)[\-\w\$\.]+:(?![^">]*<)',
+ //Strings
+ // 2 => '"[^"]+"',
+ //Unnamed variable slots
+ 3 => '%[-]?[0-9]+',
+ //Integer Types
+ 4 => array(
+ GESHI_SEARCH => '(?<!\w)i\d+(?!\w)',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '<a href="http://llvm.org/docs/LangRef.html#t_integer">',
+ GESHI_AFTER => '</a>'
+ ),
+ //Comments
+ // 5 => ';.*',
+ //Integer literals
+ // 6 => '\\b[-]?[0-9]+\\b',
+ //Floating point constants
+ // 7 => '\\b[-+]?[0-9]+\.[0-9]*\([eE][-+]?[0-9]+\)?\\b',
+ //Hex constants
+ // 8 => '\\b0x[0-9A-Fa-f]+\\b',
+ //Global variables
+ 9 => array(
+ GESHI_SEARCH => '@[-a-zA-Z$\._][-a-zA-Z$\._0-9]*',
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '<a href="http://llvm.org/docs/LangRef.html#globalvars">',
+ GESHI_AFTER => '</a>'
+ ),
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true
+ ),
+ 'SCRIPT_DELIMITERS' => array(),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/locobasic.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/locobasic.php
new file mode 100644
index 00000000..61c8a3c8
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/locobasic.php
@@ -0,0 +1,130 @@
+<?php
+/*************************************************************************************
+ * locobasic.php
+ * -------------
+ * Author: Nacho Cabanes
+ * Copyright: (c) 2009 Nacho Cabanes (http://www.nachocabanes.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/03/22
+ *
+ * Locomotive Basic (Amstrad CPC series) language file for GeSHi.
+ *
+ * More details at http://en.wikipedia.org/wiki/Locomotive_BASIC
+ *
+ * CHANGES
+ * -------
+ * 2009/03/22 (1.0.8.3)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Locomotive Basic',
+ 'COMMENT_SINGLE' => array(1 => "'", 2 => 'REM'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ "AFTER", "AND", "AUTO", "BORDER", "BREAK", "CALL", "CAT", "CHAIN",
+ "CLEAR", "CLG", "CLS", "CLOSEIN", "CLOSEOUT", "CONT", "CURSOR",
+ "DATA", "DEF", "DEFINT", "DEFREAL", "DEFSTR", "DEG", "DELETE",
+ "DERR", "DI", "DIM", "DRAW", "DRAWR", "EDIT", "EI", "ELSE", "END",
+ "ENV", "ENT", "EOF", "ERASE", "ERL", "ERR", "ERROR", "EVERY",
+ "FILL", "FN", "FOR", "FRAME", "GOSUB", "GOTO", "GRAPHICS", "HIMEM",
+ "IF", "INK", "INPUT", "KEY", "LET", "LINE", "LIST", "LOAD",
+ "LOCATE", "MASK", "MEMORY", "MERGE", "MODE", "MOVE", "MOVER", "NEW",
+ "NEXT", "NOT", "ON", "OPENIN", "OPENOUT", "OR", "ORIGIN", "PAPER",
+ "PEEK", "PEN", "PLOT", "PLOTR", "POKE", "PRINT", "RAD", "RANDOMIZE",
+ "READ", "RELEASE", "REMAIN", "RENUM", "RESTORE", "RESUME", "RETURN",
+ "RUN", "SAVE", "SPEED", "SOUND", "SPC", "SQ", "STEP", "STOP", "SWAP",
+ "SYMBOL", "TAB", "TAG", "TAGOFF", "TEST", "TESTR", "TIME", "TO",
+ "THEN", "TRON", "TROFF", "USING", "WAIT", "WEND", "WHILE", "WIDTH",
+ "WINDOW", "WRITE", "XOR", "ZONE"
+ ),
+ 2 => array(
+ "ABS", "ASC", "ATN", "BIN", "CHR", "CINT", "COPYCHR", "COS",
+ "CREAL", "DEC", "FIX", "FRE", "EXP", "HEX", "INKEY", "INP", "INSTR",
+ "INT", "JOY", "LEFT", "LEN", "LOG", "LOG10", "LOWER", "MAX", "MID",
+ "MIN", "MOD", "OUT", "PI", "POS", "RIGHT", "RND", "ROUND", "SGN",
+ "SIN", "SPACE", "SQR", "STR", "STRING", "TAN", "UNT", "UPPER",
+ "VAL", "VPOS", "XPOS", "YPOS"
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000088; font-weight: bold;',
+ 2 => 'color: #AA00AA; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080;',
+ 2 => 'color: #808080;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #008800;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0044ff;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/logtalk.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/logtalk.php
new file mode 100644
index 00000000..05734663
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/logtalk.php
@@ -0,0 +1,345 @@
+<?php
+/*************************************************************************************
+ * logtalk.php
+ * -----------
+ *
+ * Author: Paulo Moura (pmoura@logtalk.org)
+ * Copyright: (c) 2009-2011 Paulo Moura (http://logtalk.org/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/10/24
+ *
+ * Logtalk language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2011/01/18 (1.1.4)
+ * - Added syntax coloring of ignore/1
+ * 2010/11/28 (1.1.3)
+ * - Added syntax coloring of conforms_to_protocol/2-3
+ * 2010/09/14 (1.1.2)
+ * - Added syntax coloring of coinductive/1
+ * 2010/06/23 (1.1.1)
+ * - Added syntax coloring of e/0 and pi/0
+ * - Added syntax coloring of ground/1, numbervars/3, keysort/2, and sort/2
+ * 2010/05/15 (1.1.0)
+ * - Added syntax coloring of callable/1 and compare/3
+ * 2009/10/28 (1.0.0)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Logtalk',
+ 'COMMENT_SINGLE' => array(1 => '%'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(2 => "/0'./sim"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'"),
+ 'HARDQUOTE' => array('"', '"'),
+ 'HARDESCAPE' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[\\\\abfnrtv\'\"?\n]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]+\\\\#",
+ //Octal Char Specs
+ 3 => "#\\\\[0-7]+\\\\#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX_0O |
+ GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ // Directives (with arguments)
+ 1 => array(
+ // file directives
+ 'encoding', 'ensure_loaded',
+ // flag directives
+ 'set_logtalk_flag', 'set_prolog_flag',
+ // entity opening directives
+ 'category', 'object', 'protocol',
+ // predicate scope directives
+ 'private', 'protected', 'public',
+ // conditional compilation directives
+ 'elif', 'if',
+ // entity directives
+ 'calls', 'initialization', 'op', 'uses',
+ // predicate directives
+ 'alias', 'coinductive', 'discontiguous', 'dynamic', 'mode', 'info', 'meta_predicate', 'multifile', 'synchronized',
+ // module directives
+ 'export', 'module', 'reexport', 'use_module'
+ ),
+ // Directives (no arguments)
+ 2 => array(
+ // entity directives
+ 'dynamic',
+ // multi-threading directives
+ 'synchronized', 'threaded',
+ // entity closing directives
+ 'end_category', 'end_object', 'end_protocol',
+ // conditional compilation directives
+ 'else', 'endif'
+ ),
+ // Entity relations
+ 3 => array(
+ 'complements', 'extends', 'imports', 'implements','instantiates', 'specializes'
+ ),
+ // Built-in predicates (with arguments)
+ 4 => array(
+ // event handlers
+ 'after', 'before',
+ // execution-context methods
+ 'parameter', 'self', 'sender', 'this',
+ // predicate reflection
+ 'current_predicate', 'predicate_property',
+ // DCGs and term expansion
+ 'expand_goal', 'expand_term', 'goal_expansion', 'phrase', 'term_expansion',
+ // entity
+ 'abolish_category', 'abolish_object', 'abolish_protocol',
+ 'create_category', 'create_object', 'create_protocol',
+ 'current_category', 'current_object', 'current_protocol',
+ 'category_property', 'object_property', 'protocol_property',
+ // entity relations
+ 'complements_object', 'conforms_to_protocol',
+ 'extends_category', 'extends_object', 'extends_protocol',
+ 'implements_protocol', 'imports_category',
+ 'instantiates_class', 'specializes_class',
+ // events
+ 'abolish_events', 'current_event', 'define_events',
+ // flags
+ 'current_logtalk_flag', 'set_logtalk_flag',
+ 'current_prolog_flag', 'set_prolog_flag',
+ // compiling, loading, and library path
+ 'logtalk_compile', 'logtalk_library_path', 'logtalk_load',
+ // database
+ 'abolish', 'asserta', 'assertz', 'clause', 'retract', 'retractall',
+ // control
+ 'call', 'catch', 'ignore', 'once', 'throw',
+ // all solutions predicates
+ 'bagof', 'findall', 'forall', 'setof',
+ // multi-threading meta-predicates
+ 'threaded',
+ 'threaded_call', 'threaded_once', 'threaded_ignore', 'threaded_exit', 'threaded_peek',
+ 'threaded_wait', 'threaded_notify',
+ // term unification
+ 'unify_with_occurs_check',
+ // atomic term processing
+ 'atom_chars', 'atom_codes', 'atom_concat', 'atom_length',
+ 'number_chars', 'number_codes',
+ 'char_code',
+ // term creation and decomposition
+ 'arg', 'copy_term', 'functor', 'numbervars',
+ // term testing
+ 'atom', 'atomic', 'callable', 'compound', 'float', 'ground', 'integer', 'nonvar', 'number', 'sub_atom', 'var',
+ // term comparison
+ 'compare',
+ // stream selection and control
+ 'current_input', 'current_output', 'set_input', 'set_output',
+ 'open', 'close', 'flush_output', 'stream_property',
+ 'at_end_of_stream', 'set_stream_position',
+ // character and byte input/output predicates
+ 'get_byte', 'get_char', 'get_code',
+ 'peek_byte', 'peek_char', 'peek_code',
+ 'put_byte', 'put_char', 'put_code',
+ 'nl',
+ // term input/output predicates
+ 'current_op', 'op',
+ 'write', 'writeq', 'write_canonical', 'write_term',
+ 'read', 'read_term',
+ 'char_conversion', 'current_char_conversion',
+ // hooks
+ 'halt',
+ // sorting
+ 'keysort', 'sort'
+ ),
+ // Built-in predicates (no arguments)
+ 5 => array(
+ // control
+ 'fail', 'repeat', 'true',
+ // character and byte input/output predicates
+ 'nl',
+ // implementation defined hooks functions
+ 'halt',
+ // arithemtic evaluation
+ 'is',
+ // stream selection and control
+ 'at_end_of_stream', 'flush_output'
+ ),
+ // Evaluable functors (with arguments)
+ 6 => array(
+ 'float_integer_part', 'float_fractional_part',
+ 'rem', 'mod', 'abs', 'sign', 'floor', 'truncate', 'round', 'ceiling',
+ 'cos', 'atan', 'exp', 'log', 'sin', 'sqrt'
+ ),
+ // Evaluable functors (no arguments)
+ 7 => array(
+ 'e', 'pi', 'mod', 'rem'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ // external call
+ '{', '}'
+ ),
+ 1 => array(
+ // arithemtic comparison
+ '=:=', '=\=', '<', '=<', '>=', '>',
+ // term comparison
+ '<<', '>>', '/\\', '\\/', '\\',
+ // bitwise functors
+ '==', '\==', '@<', '@=<', '@>=', '@>',
+ // evaluable functors
+ '+', '-', '*', '/', '**',
+ // logic and control
+ '!', '\\+', ';',
+ // message sending operators
+ '::', '^^', ':',
+ // grammar rule and conditional functors
+ '-->', '->',
+ // mode operators
+ '@', '?',
+ // term to list predicate
+ '=..',
+ // unification
+ '=', '\\='
+ ),
+ 2 => array(
+ // clause and directive functors
+ ':-'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #2e4dc9;',
+ 2 => 'color: #2e4dc9;',
+ 3 => 'color: #2e4dc9;',
+ 4 => 'color: #9d4f37;',
+ 5 => 'color: #9d4f37;',
+ 6 => 'color: #9d4f37;',
+ 7 => 'color: #9d4f37;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #430000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #60a0b0; font-style: italic;',
+ 2 => 'color: #430000;',
+ 'MULTI' => 'color: #60a0b0; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #9f0000; font-weight: bold;',
+ 1 => 'color: #9f0000; font-weight: bold;',
+ 2 => 'color: #9f0000; font-weight: bold;',
+ 3 => 'color: #9f0000; font-weight: bold;',
+ 'HARD' => '',
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #666666;font-weight: bold;',
+ 1 => 'color: #666666;font-weight: bold;',
+ 2 => 'color: #000000;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #9f0000;',
+ 'HARD' => 'color: #9f0000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #848484;'
+ ),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '::'
+ ),
+ 'REGEXPS' => array(
+ // variables
+ 0 => '\b(?!(?:PIPE|SEMI|REG3XP\d*)[^a-zA-Z0-9_])[A-Z_][a-zA-Z0-9_]*(?![a-zA-Z0-9_])'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER
+ ),
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'DISALLOWED_BEFORE' => '(?<=:-\s)',
+ 'DISALLOWED_AFTER' => '(?=\()'
+ ),
+ 2 => array(
+ 'DISALLOWED_BEFORE' => '(?<=:-\s)',
+ 'DISALLOWED_AFTER' => '(?=\.)'
+ ),
+ 3 => array(
+ 'DISALLOWED_BEFORE' => '(?<![a-zA-Z0-9\$_\|\#>|^&\'"])',
+ 'DISALLOWED_AFTER' => '(?=\()'
+ ),
+ 4 => array(
+ 'DISALLOWED_BEFORE' => '(?<![a-zA-Z0-9\$_\|\#>|^&\'"])',
+ 'DISALLOWED_AFTER' => '(?=\()'
+ ),
+ 5 => array(
+ 'DISALLOWED_BEFORE' => '(?<![a-zA-Z0-9\$_\|\#>|^&\'"])',
+ 'DISALLOWED_AFTER' => '(?![a-zA-Z0-9_\|%\\-&\'"])'
+ ),
+ 6 => array(
+ 'DISALLOWED_BEFORE' => '(?<![a-zA-Z0-9\$_\|\#;>|^&\'"])',
+ 'DISALLOWED_AFTER' => '(?=\()'
+ ),
+ 7 => array(
+ 'DISALLOWED_BEFORE' => '(?<![a-zA-Z0-9\$_\|\#;>|^&\'"])',
+ 'DISALLOWED_AFTER' => '(?![a-zA-Z0-9_\|%\\-&\'"])'
+ )
+ )
+ ),
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lolcode.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lolcode.php
new file mode 100644
index 00000000..ab6088b1
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lolcode.php
@@ -0,0 +1,152 @@
+<?php
+/*************************************************************************************
+ * lolcode.php
+ * ----------
+ * Author: Benny Baumann (BenBE@geshi.org)
+ * Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/10/31
+ *
+ * LOLcode language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/10/31 (1.0.8.1)
+ * - First Release
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+$language_data = array (
+ 'LANG_NAME' => 'LOLcode',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ 1 => "/\bBTW\b.*$/im",
+ 2 => "/(^|\b)(?:OBTW\b.+?\bTLDR|LOL\b.+?\/LOL)(\b|$)/si"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ 1 => '/:[)>o":]/',
+ 2 => '/:\([\da-f]+\)/i',
+ 3 => '/:\{\w+\}/i',
+ 4 => '/:\[\w+\]/i',
+ ),
+ 'KEYWORDS' => array(
+ //Statements
+ 1 => array(
+ 'VISIBLE', 'HAI', 'KTHX', 'KTHXBYE', 'SMOOSH', 'GIMMEH', 'PLZ',
+ 'ON', 'INVISIBLE', 'R', 'ITZ', 'GTFO', 'COMPLAIN', 'GIMME',
+
+ 'OPEN', 'FILE', 'I HAS A', 'AWSUM THX', 'O NOES', 'CAN', 'HAS', 'HAZ',
+ 'HOW DOES I', 'IF U SAY SO', 'FOUND YR', 'BORROW', 'OWN', 'ALONG',
+ 'WITH', 'WIT', 'LOOK', 'AT', 'AWSUM', 'THX'
+ ),
+ //Conditionals
+ 2 => array(
+ 'IZ', 'YARLY', 'NOWAI', 'WTF?', 'MEBBE', 'OMG', 'OMGWTF',
+ 'ORLY?', 'OF', 'NOPE', 'SO', 'IM', 'MAI',
+
+ 'O RLY?', 'SUM', 'BOTH SAEM', 'DIFFRINT', 'BOTH', 'EITHER', 'WON',
+ 'DIFF', 'PRODUKT', 'QUOSHUNT', 'MOD', 'MKAY', 'OK', 'THING',
+ 'BIGNESS'
+ ),
+ //Repetition
+ 3 => array(
+ 'IN', 'OUTTA', 'LOOP', 'WHILE'
+ ),
+ //Operators \Math
+ 4 => array(
+ 'AN', 'AND', 'NOT', 'UP', 'YR', 'UPPIN', 'NERF', 'NERFIN', 'NERFZ',
+ 'SMASHING', 'UR', 'KINDA', 'LIKE', 'SAEM', 'BIG', 'SMALL',
+ 'BIGGR', 'SMALLR', 'BIGGER', 'SMALLER', 'GOOD', 'CUTE', 'THAN'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '.', ',', '?',
+ '!!'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #008000;',
+ 2 => 'color: #000080;',
+ 3 => 'color: #000080;',
+ 4 => 'color: #800000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; style: italic;',
+ 2 => 'color: #666666; style: italic;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'SPACE_AS_WHITESPACE' => true
+ )
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lotusformulas.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lotusformulas.php
new file mode 100644
index 00000000..12257d74
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lotusformulas.php
@@ -0,0 +1,318 @@
+<?php
+/*************************************************************************************
+ * lotusformulas.php
+ * ------------------------
+ * Author: Richard Civil (info@richardcivil.net)
+ * Copyright: (c) 2008 Richard Civil (info@richardcivil.net), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/04/12
+ *
+ * @Formula/@Command language file for GeSHi.
+ *
+ * @Formula/@Command source: IBM Lotus Notes/Domino 8 Designer Help
+ *
+ * CHANGES
+ * -------
+ * 2008/04/12 (1.0.7.22)
+ * - First Release
+ *
+ * TODO (updated 2008/04/12)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Lotus Notes @Formulas',
+ 'COMMENT_SINGLE' => array(1 => "'"),
+ 'COMMENT_MULTI' => array('REM' => ';'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array (
+ '[ZoomPreview]', '[WorkspaceStackReplicaIcons]',
+ '[WorkspaceProperties]', '[WindowWorkspace]',
+ '[WindowTile]', '[WindowRestore]', '[WindowNext]',
+ '[WindowMinimizeAll]', '[WindowMinimize]', '[WindowMaximizeAll]',
+ '[WindowMaximize]', '[WindowCascade]', '[ViewSwitchForm]',
+ '[ViewShowUnread]', '[ViewShowServerNames]', '[ViewShowSearchBar]',
+ '[ViewShowRuler]', '[ViewShowPageBreaks]', '[ViewShowOnlyUnread]',
+ '[ViewShowOnlySelected]', '[ViewShowOnlySearchResults]',
+ '[ViewShowOnlyCategories]', '[ViewShowObject]',
+ '[ViewShowFieldHelp]', '[ViewRenamePerson]', '[ViewRefreshUnread]',
+ '[ViewRefreshFields]', '[ViewNavigatorsNone]',
+ '[ViewNavigatorsFolders]', '[ViewMoveName]', '[ViewHorizScrollbar]',
+ '[ViewExpandWithChildren]', '[ViewExpandAll]', '[ViewExpand]',
+ '[ViewCollapseAll]', '[ViewCollapse]', '[ViewChange]',
+ '[ViewCertify]', '[ViewBesideFolders]', '[ViewBelowFolders]',
+ '[ViewArrangeIcons]', '[V3EditPrevField]', '[V3EditNextField]',
+ '[UserIDSwitch]', '[UserIDSetPassword]', '[UserIDMergeCopy]',
+ '[UserIDInfo]', '[UserIDEncryptionKeys]', '[UserIDCreateSafeCopy]',
+ '[UserIDClearPassword]', '[UserIDCertificates]',
+ '[ToolsUserLogoff]', '[ToolsSpellCheck]', '[ToolsSmartIcons]',
+ '[ToolsSetupUserSetup]', '[ToolsSetupPorts]', '[ToolsSetupMail]',
+ '[ToolsSetupLocation]', '[ToolsScanUnreadSelected]',
+ '[ToolsScanUnreadPreferred]', '[ToolsScanUnreadChoose]',
+ '[ToolsRunMacro]', '[ToolsRunBackgroundMacros]', '[ToolsReplicate]',
+ '[ToolsRefreshSelectedDocs]', '[ToolsRefreshAllDocs]',
+ '[ToolsMarkSelectedUnread]', '[ToolsMarkSelectedRead]',
+ '[ToolsMarkAllUnread]', '[ToolsMarkAllRead]', '[ToolsHangUp]',
+ '[ToolsCategorize]', '[ToolsCall]', '[TextUnderline]',
+ '[TextSpacingSingle]', '[TextSpacingOneAndaHalf]',
+ '[TextSpacingDouble]', '[TextSetFontSize]', '[TextSetFontFace]',
+ '[TextSetFontColor]', '[TextReduceFont]', '[TextPermanentPen]',
+ '[TextParagraphStyles]', '[TextParagraph]', '[TextOutdent]',
+ '[TextNumbers]', '[TextNormal]', '[TextItalic]', '[TextFont]',
+ '[TextEnlargeFont]', '[TextCycleSpacing]', '[TextBullet]',
+ '[TextBold]', '[TextAlignRight]', '[TextAlignNone]',
+ '[TextAlignLeft]', '[TextAlignFull]', '[TextAlignCenter]',
+ '[SwitchView]', '[SwitchForm]', '[StyleCycleKey]',
+ '[SmartIconsNextSet]', '[SmartIconsFloating]', '[ShowProperties]',
+ '[ShowHidePreviewPane]', '[ShowHideParentPreview]',
+ '[ShowHideLinkPreview]', '[ShowHideIMContactList]',
+ '[SetCurrentLocation]', '[SendInstantMessage]',
+ '[SectionRemoveHeader]', '[SectionProperties]',
+ '[SectionExpandAll]', '[SectionExpand]', '[SectionDefineEditors]',
+ '[SectionCollapseAll]', '[SectionCollapse]', '[RunScheduledAgents]',
+ '[RunAgent]', '[ReplicatorStop]', '[ReplicatorStart]',
+ '[ReplicatorSendReceiveMail]', '[ReplicatorSendMail]',
+ '[ReplicatorReplicateWithServer]', '[ReplicatorReplicateSelected]',
+ '[ReplicatorReplicateNext]', '[ReplicatorReplicateHigh]',
+ '[Replicator]', '[RenameDatabase]', '[RemoveFromFolder]',
+ '[RemoteDebugLotusScript]', '[ReloadWindow]', '[RefreshWindow]',
+ '[RefreshParentNote]', '[RefreshHideFormulas]', '[RefreshFrame]',
+ '[PublishDatabase]', '[PictureProperties]', '[PasteBitmapAsObject]',
+ '[PasteBitmapAsBackground]', '[OpenView]', '[OpenPage]',
+ '[OpenNavigator]', '[OpenInNewWindow]', '[OpenHelpDocument]',
+ '[OpenFrameset]', '[OpenDocument]', '[OpenCalendar]',
+ '[ObjectProperties]', '[ObjectOpen]', '[ObjectDisplayAs]',
+ '[NavPrevUnread]', '[NavPrevSelected]', '[NavPrevMain]',
+ '[NavPrev]', '[NavNextUnread]', '[NavNextSelected]',
+ '[NavNextMain]', '[NavNext]', '[NavigatorTest]',
+ '[NavigatorProperties]', '[NavigateToBacklink]',
+ '[NavigatePrevUnread]', '[NavigatePrevSelected]',
+ '[NavigatePrevMain]', '[NavigatePrevHighlight]', '[NavigatePrev]',
+ '[NavigateNextUnread]', '[NavigateNextSelected]',
+ '[NavigateNextMain]', '[NavigateNextHighlight]', '[NavigateNext]',
+ '[MoveToTrash]', '[MailSendPublicKey]', '[MailSendEncryptionKey]',
+ '[MailSendCertificateRequest]', '[MailSend]', '[MailScanUnread]',
+ '[MailRequestNewPublicKey]', '[MailRequestNewName]',
+ '[MailRequestCrossCert]', '[MailOpen]', '[MailForwardAsAttachment]',
+ '[MailForward]', '[MailComposeMemo]', '[MailAddress]',
+ '[LayoutProperties]', '[LayoutElementSendToBack]',
+ '[LayoutElementProperties]', '[LayoutElementBringToFront]',
+ '[LayoutAddText]', '[LayoutAddGraphic]', '[InsertSubform]',
+ '[HotspotProperties]', '[HotspotClear]', '[HelpUsingDatabase]',
+ '[HelpAboutNotes]', '[HelpAboutDatabase]', '[GoUpLevel]',
+ '[FormTestDocument]', '[FormActions]', '[FolderRename]',
+ '[FolderProperties]', '[FolderMove]', '[FolderExpandWithChildren]',
+ '[FolderExpandAll]', '[FolderExpand]', '[FolderDocuments]',
+ '[FolderCustomize]', '[FolderCollapse]', '[Folder]',
+ '[FindFreeTimeDialog]', '[FileSaveNewVersion]', '[FileSave]',
+ '[FilePrintSetup]', '[FilePrint]', '[FilePageSetup]',
+ '[FileOpenDBRepID]', '[FileOpenDatabase]', '[FileNewReplica]',
+ '[FileNewDatabase]', '[FileImport]', '[FileFullTextUpdate]',
+ '[FileFullTextInfo]', '[FileFullTextDelete]',
+ '[FileFullTextCreate]', '[FileExport]', '[FileExit]',
+ '[FileDatabaseUseServer]', '[FileDatabaseRemove]',
+ '[FileDatabaseInfo]', '[FileDatabaseDelete]', '[FileDatabaseCopy]',
+ '[FileDatabaseCompact]', '[FileDatabaseACL]', '[FileCloseWindow]',
+ '[ExitNotes]', '[Execute]', '[ExchangeUnreadMarks]', '[EmptyTrash]',
+ '[EditUp]', '[EditUntruncate]', '[EditUndo]', '[EditTop]',
+ '[EditTableInsertRowColumn]', '[EditTableFormat]',
+ '[EditTableDeleteRowColumn]', '[EditShowHideHiddenChars]',
+ '[EditSelectByDate]', '[EditSelectAll]', '[EditRight]',
+ '[EditRestoreDocument]', '[EditResizePicture]',
+ '[EditQuoteSelection]', '[EditProfileDocument]', '[EditProfile]',
+ '[EditPrevField]', '[EditPhoneNumbers]', '[EditPasteSpecial]',
+ '[EditPaste]', '[EditOpenLink]', '[EditNextField]',
+ '[EditMakeDocLink]', '[EditLocations]', '[EditLinks]', '[EditLeft]',
+ '[EditInsertText]', '[EditInsertTable]', '[EditInsertPopup]',
+ '[EditInsertPageBreak]', '[EditInsertObject]',
+ '[EditInsertFileAttachment]', '[EditInsertButton]',
+ '[EditIndentFirstLine]', '[EditIndent]', '[EditHorizScrollbar]',
+ '[EditHeaderFooter]', '[EditGotoField]', '[EditFindNext]',
+ '[EditFindInPreview]', '[EditFind]', '[EditEncryptionKeys]',
+ '[EditDown]', '[EditDocument]', '[EditDetach]', '[EditDeselectAll]',
+ '[EditCut]', '[EditCopy]', '[EditClear]', '[EditButton]',
+ '[EditBottom]', '[DiscoverFolders]', '[Directories]',
+ '[DialingRules]', '[DesignViewSelectFormula]', '[DesignViews]',
+ '[DesignViewNewColumn]', '[DesignViewFormFormula]',
+ '[DesignViewEditActions]', '[DesignViewColumnDef]',
+ '[DesignViewAttributes]', '[DesignViewAppendColumn]',
+ '[DesignSynopsis]', '[DesignSharedFields]', '[DesignReplace]',
+ '[DesignRefresh]', '[DesignMacros]', '[DesignIcon]',
+ '[DesignHelpUsingDocument]', '[DesignHelpAboutDocument]',
+ '[DesignFormWindowTitle]', '[DesignFormUseField]',
+ '[DesignFormShareField]', '[DesignForms]', '[DesignFormNewField]',
+ '[DesignFormFieldDef]', '[DesignFormAttributes]',
+ '[DesignDocumentInfo]', '[DebugLotusScript]',
+ '[DatabaseReplSettings]', '[DatabaseDelete]', '[CreateView]',
+ '[CreateTextbox]', '[CreateSubForm]', '[CreateSection]',
+ '[CreateRectangularHotspot]', '[CreateRectangle]',
+ '[CreatePolyline]', '[CreatePolygon]', '[CreateNavigator]',
+ '[CreateLayoutRegion]', '[CreateForm]', '[CreateFolder]',
+ '[CreateEllipse]', '[CreateControlledAccessSection]',
+ '[CreateAgent]', '[CreateAction]', '[CopySelectedAsTable]',
+ '[ComposeWithReference]', '[Compose]', '[CloseWindow]', '[Clear]',
+ '[ChooseFolders]', '[CalendarGoTo]', '[CalendarFormat]',
+ '[AttachmentView]', '[AttachmentProperties]', '[AttachmentLaunch]',
+ '[AttachmentDetachAll]', '[AgentTestRun]', '[AgentSetServerName]',
+ '[AgentRun]', '[AgentLog]', '[AgentEnableDisable]', '[AgentEdit]',
+ '[AdminTraceConnection]', '[AdminStatisticsConfig]',
+ '[AdminSendMailTrace]', '[AdminRemoteConsole]',
+ '[AdminRegisterUser]', '[AdminRegisterServer]',
+ '[AdminRegisterFromFile]', '[AdminOutgoingMail]',
+ '[AdminOpenUsersView]', '[AdminOpenStatistics]',
+ '[AdminOpenServersView]', '[AdminOpenServerLog]',
+ '[AdminOpenGroupsView]', '[AdminOpenCertLog]', '[AdminOpenCatalog]',
+ '[AdminOpenAddressBook]', '[AdminNewOrgUnit]',
+ '[AdminNewOrganization]', '[Administration]',
+ '[AdminIDFileSetPassword]', '[AdminIDFileExamine]',
+ '[AdminIDFileClearPassword]', '[AdminDatabaseQuotas]',
+ '[AdminDatabaseAnalysis]', '[AdminCrossCertifyKey]',
+ '[AdminCrossCertifyIDFile]', '[AdminCreateGroup]', '[AdminCertify]',
+ '[AddToIMContactList]', '[AddDatabaseRepID]', '[AddDatabase]',
+ '[AddBookmark]'
+ ),
+ 2 => array(
+ 'SELECT', 'FIELD', 'ENVIRONMENT', 'DEFAULT', '@Zone ', '@Yesterday',
+ '@Yes', '@Year', '@Word', '@Wide', '@While', '@Weekday',
+ '@WebDbName', '@ViewTitle', '@ViewShowThisUnread', '@Version',
+ '@VerifyPassword', '@ValidateInternetAddress', '@V4UserAccess',
+ '@V3UserName', '@V2If', '@UserRoles', '@UserPrivileges',
+ '@UserNamesList', '@UserNameLanguage', '@UserName', '@UserAccess',
+ '@UrlQueryString', '@URLOpen', '@URLHistory', '@URLGetHeader',
+ '@URLEncode', '@URLDecode', '@UpperCase', '@UpdateFormulaContext',
+ '@Unique', '@UndeleteDocument', '@Unavailable', '@True', '@Trim',
+ '@Transform', '@ToTime', '@ToNumber', '@Tomorrow', '@Today',
+ '@TimeZoneToText', '@TimeToTextInZone', '@TimeMerge', '@Time',
+ '@ThisValue', '@ThisName', '@TextToTime', '@TextToNumber', '@Text',
+ '@TemplateVersion', '@Tan', '@Sum', '@Success', '@Subset',
+ '@StatusBar', '@Sqrt', '@Soundex', '@Sort', '@Sin', '@Sign',
+ '@SetViewInfo', '@SetTargetFrame', '@SetProfileField',
+ '@SetHTTPHeader', '@SetField', '@SetEnvironment', '@SetDocField',
+ '@Set', '@ServerName', '@ServerAccess', '@Select', '@Second',
+ '@Round', '@RightBack', '@Right', '@Return', '@Responses',
+ '@ReplicaID', '@ReplaceSubstring', '@Replace', '@Repeat',
+ '@RegQueryValue', '@RefreshECL', '@Random', '@ProperCase',
+ '@Prompt', '@Power', '@PostedCommand', '@PolicyIsFieldLocked',
+ '@Platform', '@PickList', '@Pi', '@PasswordQuality', '@Password',
+ '@OrgDir', '@OptimizeMailAddress', '@OpenInNewWindow', '@Now',
+ '@Nothing', '@NoteID', '@No', '@NewLine', '@Narrow', '@NameLookup',
+ '@Name', '@Month', '@Modulo', '@Modified', '@Minute', '@Min',
+ '@MiddleBack', '@Middle', '@Member', '@Max', '@Matches',
+ '@MailSignPreference', '@MailSend', '@MailSavePreference',
+ '@MailEncryptSentPreference', '@MailEncryptSavedPreference',
+ '@MailDbName', '@LowerCase', '@Log', '@Locale', '@Ln', '@Like',
+ '@Length', '@LeftBack', '@Left', '@LDAPServer', '@LaunchApp',
+ '@LanguagePreference', '@Keywords', '@IsVirtualizedDirectory',
+ '@IsValid', '@IsUsingJavaElement', '@IsUnavailable', '@IsTime',
+ '@IsText', '@IsResponseDoc', '@IsNumber', '@IsNull', '@IsNotMember',
+ '@IsNewDoc', '@IsModalHelp', '@IsMember', '@IsExpandable',
+ '@IsError', '@IsEmbeddedInsideWCT', '@IsDocTruncated',
+ '@IsDocBeingSaved', '@IsDocBeingRecalculated', '@IsDocBeingMailed',
+ '@IsDocBeingLoaded', '@IsDocBeingEdited', '@IsDB2', '@IsCategory',
+ '@IsAvailable', '@IsAppInstalled', '@IsAgentEnabled', '@Integer',
+ '@InheritedDocumentUniqueID', '@Implode', '@IfError', '@If',
+ '@Hour', '@HashPassword', '@HardDeleteDocument', '@GetViewInfo',
+ '@GetProfileField', '@GetPortsList', '@GetIMContactListGroupNames',
+ '@GetHTTPHeader', '@GetFocusTable', '@GetField', '@GetDocField',
+ '@GetCurrentTimeZone', '@GetAddressBooks', '@FormLanguage', '@For',
+ '@FontList', '@FloatEq', '@FileDir', '@False', '@Failure',
+ '@Explode', '@Exp', '@Eval', '@Error', '@Environment', '@Ends',
+ '@EnableAlarms', '@Elements', '@EditUserECL', '@EditECL',
+ '@DoWhile', '@Domain', '@DocumentUniqueID', '@DocSiblings',
+ '@DocParentNumber', '@DocOmmittedLength', '@DocNumber', '@DocMark',
+ '@DocLock', '@DocLevel', '@DocLength', '@DocFields',
+ '@DocDescendants', '@DocChildren', '@Do', '@DialogBox',
+ '@DeleteField', '@DeleteDocument', '@DDETerminate', '@DDEPoke',
+ '@DDEInitiate', '@DDEExecute', '@DbTitle', '@DbName', '@DbManager',
+ '@DbLookup', '@DbExists', '@DbCommand', '@DbColumn', '@DB2Schema',
+ '@Day', '@Date', '@Created', '@Count', '@Cos', '@Contains',
+ '@ConfigFile', '@Compare', '@Command', '@ClientType',
+ '@CheckFormulaSyntax', '@CheckAlarms', '@Char', '@Certificate',
+ '@BusinessDays', '@BrowserInfo', '@Begins', '@Author',
+ '@Attachments', '@AttachmentNames', '@AttachmentModifiedTimes',
+ '@AttachmentLengths', '@ATan2', '@ATan', '@ASin', '@Ascii',
+ '@AllDescendants', '@AllChildren', '@All', '@AdminECLIsLocked',
+ '@Adjust', '@AddToFolder', '@ACos', '@Accessed', '@AbstractSimple',
+ '@Abstract', '@Abs'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #800000;',
+ 2 => 'color: #0000FF;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #FF00FF;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF00FF;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0000AA;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 2
+ );
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lotusscript.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lotusscript.php
new file mode 100644
index 00000000..b8b65f20
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lotusscript.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ * lotusscript.php
+ * ------------------------
+ * Author: Richard Civil (info@richardcivil.net)
+ * Copyright: (c) 2008 Richard Civil (info@richardcivil.net), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/04/12
+ *
+ * LotusScript language file for GeSHi.
+ *
+ * LotusScript source: IBM Lotus Notes/Domino 8 Designer Help
+ *
+ * CHANGES
+ * -------
+ * 2008/04/12 (1.0.7.22)
+ * - First Release
+ *
+ * TODO (2008/04/12)
+ * -----------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'LotusScript',
+ 'COMMENT_SINGLE' => array(1 => "'"),
+ 'COMMENT_MULTI' => array('%REM' => '%END REM'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"' , "|"),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array (
+ 'Yield', 'Year', 'Xor', 'Write', 'With', 'Width', 'While', 'Wend',
+ 'Weekday', 'VarType', 'Variant', 'Val', 'UString', 'UString$',
+ 'UseLSX', 'Use', 'Until', 'Unlock', 'Unicode', 'Uni', 'UChr',
+ 'UChr$', 'UCase', 'UCase$', 'UBound', 'TypeName', 'Type', 'TRUE',
+ 'Trim', 'Trim$', 'Today', 'To', 'TimeValue', 'TimeSerial', 'Timer',
+ 'TimeNumber', 'Time', 'Time$', 'Then', 'Text', 'Tan', 'Tab', 'Sub',
+ 'StrToken', 'StrToken$', 'StrRightBack', 'StrRightBack$',
+ 'StrRight', 'StrRight$', 'StrLeftBack', 'StrLeftBack$', 'StrLeft',
+ 'StrLeft$', 'String', 'String$', 'StrConv', 'StrCompare', 'StrComp',
+ 'Str', 'Str$', 'Stop', 'Step', 'Static', 'Sqr', 'Split', 'Spc',
+ 'Space', 'Space$', 'Sleep', 'Single', 'Sin', 'Shell', 'Shared',
+ 'Sgn', 'SetFileAttr', 'SetAttr', 'Set', 'SendKeys', 'Select',
+ 'Seek', 'Second', 'RTrim', 'RTrim$', 'RSet', 'Round', 'Rnd',
+ 'RmDir', 'RightC', 'RightC$', 'RightBP', 'RightBP$', 'RightB',
+ 'RightB$', 'Right', 'Right$', 'Return', 'Resume', 'Reset',
+ 'Replace', 'Remove', 'Rem', 'ReDim', 'Read', 'Randomize',
+ 'Random', 'Put', 'Public', 'Property', 'Private', 'Print',
+ 'Preserve', 'Pitch', 'PI', 'Output', 'Or', 'Option', 'Open', 'On',
+ 'Oct', 'Oct$', 'NULL', 'Now', 'NOTHING', 'Not', 'NoPitch', 'NoCase',
+ 'Next', 'New', 'Name', 'MsgBox', 'Month', 'Mod', 'MkDir', 'Minute',
+ 'MidC', 'MidC$', 'MidBP', 'MidBP$', 'MidB', 'MidB$', 'Mid', 'Mid$',
+ 'MessageBox', 'Me', 'LTrim', 'LTrim$', 'LSServer', 'LSI_Info',
+ 'LSet', 'Loop', 'Long', 'Log', 'LOF', 'Lock', 'LOC', 'LMBCS',
+ 'ListTag', 'List', 'Line', 'Like', 'Lib', 'Let', 'LenC', 'LenBP',
+ 'LenB', 'Len', 'LeftC', 'LeftC$', 'LeftBP', 'LeftBP$', 'LeftB',
+ 'LeftB$', 'Left', 'Left$', 'LCase', 'LCase$', 'LBound', 'Kill',
+ 'Join', 'IsUnknown', 'IsScalar', 'IsObject', 'IsNumeric', 'IsNull',
+ 'IsList', 'IsEmpty', 'IsElement', 'IsDate', 'IsArray', 'IsA', 'Is',
+ 'Integer', 'Int', 'InStrC', 'InStrBP', 'InStrB', 'InStr', 'InputBP',
+ 'InputBP$', 'InputBox', 'InputBox$', 'InputB', 'InputB$', 'Input',
+ 'Input$', 'In', 'IMSetMode', 'Implode', 'Implode$', 'Imp',
+ 'IMEStatus', 'If', 'Hour', 'Hex', 'Hex$', 'Goto', 'GoSub',
+ 'GetThreadInfo', 'GetFileAttr', 'GetAttr', 'Get', 'Function',
+ 'FullTrim', 'From', 'FreeFile', 'Fraction', 'Format', 'Format$',
+ 'ForAll', 'For', 'Fix', 'FileLen', 'FileDateTime', 'FileCopy',
+ 'FileAttr', 'FALSE', 'Explicit', 'Exp', 'Exit', 'Execute', 'Event',
+ 'Evaluate', 'Error', 'Error$', 'Err', 'Erl', 'Erase', 'Eqv', 'EOF',
+ 'Environ', 'Environ$', 'End', 'ElseIf', 'Else', 'Double', 'DoEvents',
+ 'Do', 'Dir', 'Dir$', 'Dim', 'DestroyLock', 'Delete', 'DefVar',
+ 'DefStr', 'DefSng', 'DefLng', 'DefInt', 'DefDbl', 'DefCur',
+ 'DefByte', 'DefBool', 'Declare', 'Day', 'DateValue', 'DateSerial',
+ 'DateNumber', 'Date', 'Date$', 'DataType', 'CVDate', 'CVar',
+ 'Currency', 'CurDrive', 'CurDrive$', 'CurDir', 'CurDir$', 'CStr',
+ 'CSng', 'CreateLock', 'Cos', 'Const', 'Compare', 'Command',
+ 'Command$', 'CodeUnlock', 'CodeLockCheck', 'CodeLock', 'Close',
+ 'CLng', 'Class', 'CInt', 'Chr', 'Chr$', 'ChDrive', 'ChDir', 'CDbl',
+ 'CDat', 'CCur', 'CByte', 'CBool', 'Case', 'Call', 'ByVal', 'Byte',
+ 'Boolean', 'Bind', 'Binary', 'Bin', 'Bin$', 'Beep', 'Base', 'Atn2',
+ 'Atn', 'ASin', 'Asc', 'As', 'ArrayUnique', 'ArrayReplace',
+ 'ArrayGetIndex', 'ArrayAppend', 'Append', 'AppActivate', 'Any',
+ 'And', 'Alias', 'ActivateApp', 'ACos', 'Access', 'Abs', '%Include',
+ '%If', '%END', '%ElseIf', '%Else'
+ ),
+ 2 => array (
+ 'NotesXSLTransformer', 'NotesXMLProcessor', 'NotesViewNavigator',
+ 'NotesViewEntryCollection', 'NotesViewEntry', 'NotesViewColumn',
+ 'NotesView', 'NotesUIWorkspace', 'NotesUIView', 'NotesUIScheduler',
+ 'NotesUIDocument', 'NotesUIDatabase', 'NotesTimer', 'NotesStream',
+ 'NotesSession', 'NotesSAXParser', 'NotesSAXException',
+ 'NotesSAXAttributeList', 'NotesRichTextTable', 'NotesRichTextTab',
+ 'NotesRichTextStyle', 'NotesRichTextSection', 'NotesRichTextRange',
+ 'NotesRichTextParagraphStyle', 'NotesRichTextNavigator',
+ 'NotesRichTextItem', 'NotesRichTextDocLink',
+ 'NotesReplicationEntry', 'NotesReplication', 'NotesRegistration',
+ 'NotesOutlineEntry', 'NotesOutline', 'NotesNoteCollection',
+ 'NotesNewsLetter', 'NotesName', 'NotesMIMEHeader',
+ 'NotesMIMEEntity', 'NotesLog', 'NotesItem', 'NotesInternational',
+ 'NotesForm', 'NotesEmbeddedObject', 'NotesDXLImporter',
+ 'NotesDXLExporter', 'NotesDOMXMLDeclNode', 'NotesDOMTextNode',
+ 'NotesDOMProcessingInstructionNode', 'NotesDOMParser',
+ 'NotesDOMNotationNode', 'NotesDOMNodeList', 'NotesDOMNode',
+ 'NotesDOMNamedNodeMap', 'NotesDOMEntityReferenceNode',
+ 'NotesDOMEntityNode', 'NotesDOMElementNode',
+ 'NotesDOMDocumentTypeNode', 'NotesDOMDocumentNode',
+ 'NotesDOMDocumentFragmentNode', 'NotesDOMCommentNode',
+ 'NotesDOMCharacterDataNote', 'NotesDOMCDATASectionNode',
+ 'NotesDOMAttributeNode', 'NotesDocumentCollection', 'NotesDocument',
+ 'NotesDbDirectory', 'NotesDateTime', 'NotesDateRange',
+ 'NotesDatabase', 'NotesColorObject', 'NotesAgent',
+ 'NotesAdministrationProcess', 'NotesACLEntry', 'NotesACL',
+ 'Navigator', 'Field', 'Button'
+ )
+ ) ,
+ 'SYMBOLS' => array(
+ '(', ')'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000FF;',
+ 2 => 'color: #0000EE;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF00FF;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0000AA;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #006600;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 2
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lscript.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lscript.php
new file mode 100644
index 00000000..298af618
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lscript.php
@@ -0,0 +1,387 @@
+<?php
+/*************************************************************************************
+ * lscript.php
+ * ---------
+ * Author: Arendedwinter (admin@arendedwinter.com)
+ * Copyright: (c) 2008 Beau McGuigan (http://www.arendedwinter.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 15/11/2008
+ *
+ * Lightwave Script language file for GeSHi.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'LScript',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ //Yes, I'm aware these are out of order,
+ //I had to rearrange and couldn't be bothered changing the numbers...
+ 7 => array(
+ '@data', '@define', '@else', '@end', '@fpdepth', '@if', '@include',
+ '@insert', '@library', '@localipc', '@name', '@save', '@script',
+ '@sequence', '@version', '@warnings'
+ ),
+ 1 => array(
+ 'break', 'case', 'continue', 'else', 'end', 'false', 'for',
+ 'foreach', 'if', 'return', 'switch', 'true', 'while',
+ ),
+ 3 => array(
+ 'active', 'alertlevel', 'alpha', 'alphaprefix', 'animfilename', 'autokeycreate',
+ 'backdroptype', 'blue', 'boxthreshold', 'button',
+ 'channelsvisible', 'childrenvisible', 'compfg', 'compbg', 'compfgalpha',
+ 'coneangles', 'cosine', 'count', 'ctl', 'curFilename', 'curFrame',
+ 'currenttime', 'curTime', 'curType',
+ 'depth', 'diffshade', 'diffuse', 'dimensions', 'displayopts', 'dynamicupdate',
+ 'end', 'eta',
+ 'filename', 'flags', 'fogtype', 'fps', 'frame', 'frameend', 'frameheight',
+ 'framestart', 'framestep', 'framewidth',
+ 'generalopts', 'genus', 'geometry', 'gNorm', 'goal', 'green',
+ 'h', 'hasAlpha', 'height',
+ 'id', 'innerlimit', 'isColor',
+ 'keyCount', 'keys',
+ 'limiteregion', 'locked', 'luminous',
+ 'maxsamplesperpixel', 'minsamplesperpixel', 'mirror', 'motionx', 'motiony',
+ 'name', 'newFilename', 'newFrame', 'newTime', 'newType', 'null', 'numthreads',
+ 'objID', 'oPos', 'outerlimit', 'oXfrm',
+ 'parent', 'pixel', 'pixelaspect', 'point', 'points', 'pointcount', 'polNum',
+ 'polycount', 'polygon', 'polygons', 'postBehavior', 'preBehavior', 'previewend',
+ 'previewstart', 'previewstep',
+ 'range', 'rawblue', 'rawgreen', 'rawred', 'rayLength', 'raySource', 'red',
+ 'reflectblue', 'reflectgreen', 'reflectred', 'recursiondepth', 'renderend',
+ 'renderopts', 'renderstart', 'renderstep', 'rendertype', 'restlength',
+ 'rgbprefix', 'roughness',
+ 'selected', 'setColor', 'setPattern', 'shading', 'shadow', 'shadows',
+ 'shadowtype', 'size', 'source', 'special', 'specshade', 'specular',
+ 'spotsize', 'start', 'sx', 'sy', 'sz',
+ 'target', 'totallayers', 'totalpoints', 'totalpolygons', 'trans', 'transparency',
+ 'type',
+ 'value', 'view', 'visible', 'visibility',
+ 'w', 'width', 'wNorm', 'wPos', 'wXfrm',
+ 'x', 'xoffset',
+ 'y', 'yoffset',
+ 'z'
+ ),
+ 4 => array(
+ 'addLayer', 'addParticle', 'alphaspot', 'ambient', 'asAsc', 'asBin',
+ 'asInt', 'asNum', 'asStr', 'asVec', 'attach', 'axislocks',
+ 'backdropColor', 'backdropRay', 'backdropSqueeze', 'bone', 'blurLength',
+ 'close', 'color', 'contains', 'copy', 'createKey',
+ 'deleteKey', 'detach', 'drawCircle', 'drawLine', 'drawPoint', 'drawText',
+ 'drawTriangle',
+ 'edit', 'eof', 'event',
+ 'firstChannel', 'firstLayer', 'firstSelect', 'focalLength', 'fogColor',
+ 'fogMaxAmount', 'fogMaxDist', 'fogMinAmount', 'fogMinDist',
+ 'fovAngles', 'fStop', 'firstChild', 'focalDistance',
+ 'get', 'getChannelGroup', 'getEnvelope', 'getForward', 'getKeyBias',
+ 'getKeyContinuity', 'getKeyCurve', 'getKeyHermite', 'getKeyTension',
+ 'getKeyTime', 'getKeyValue', 'getParticle', 'getPivot', 'getPosition',
+ 'getRight', 'getRotation', 'getSelect', 'getScaling', 'getTag', 'getTexture',
+ 'getUp', 'getValue', 'getWorldPosition', 'getWorldForward', 'getWorldRight',
+ 'getWorldRotation', 'getWorldUp', 'globalBlur', 'globalMask', 'globalResolution',
+ 'hasCCEnd', 'hasCCStart',
+ 'illuminate', 'indexOf', 'isAscii', 'isAlnum', 'isAlpha', 'isBone',
+ 'isCamera', 'isChannel', 'isChannelGroup', 'isCntrl', 'isCurve', 'isDigit',
+ 'isEnvelope', 'isImage', 'isInt', 'isLight', 'isLower', 'isMapped', 'isMesh',
+ 'isNil', 'isNum', 'IsOpen', 'isOriginal', 'isPrint', 'isPunct', 'isScene',
+ 'isSpace', 'isStr', 'isUpper', 'isValid', 'isVMap', 'isVec', 'isXDigit',
+ 'keyExists',
+ 'layer', 'layerName', 'layerVisible', 'limits', 'line', 'linecount', 'load', 'luma',
+ 'next', 'nextLayer', 'nextSelect', 'nextChannel', 'nextChild', 'nl',
+ 'offset', 'open',
+ 'pack', 'param', 'parse', 'paste', 'persist', 'polygonCount', 'position',
+ 'rayCast', 'rayTrace', 'read', 'readByte', 'readInt', 'readNumber',
+ 'readDouble', 'readShort', 'readString', 'readVector', 'reduce',
+ 'remParticle', 'renderCamera', 'reopen', 'replace', 'reset', 'restParam',
+ 'rewind', 'rgb', 'rgbambient', 'rgbcolor', 'rgbspot',
+ 'save', 'schemaPosition', 'select', 'set', 'setChannelGroup', 'setKeyBias',
+ 'setKeyContinuity', 'setKeyCurve',
+ 'setKeyHermite', 'setKeyTension', 'setKeyValue', 'setParticle', 'setPoints',
+ 'setTag', 'setValue', 'server', 'serverFlags', 'sortA', 'sortD', 'surface',
+ 'trunc',
+ 'write', 'writeln', 'writeByte', 'writeData', 'writeNumber', 'writeDouble',
+ 'writeShort', 'writeString', 'writeVector',
+ 'vertex', 'vertexCount',
+ 'zoomFactor'
+ ),
+ 2 => array(
+ 'abs', 'acos', 'angle', 'append', 'ascii', 'asin', 'atan',
+ 'binary',
+ 'ceil', 'center', 'chdir', 'clearimage', 'cloned', 'comringattach',
+ 'comringdecode', 'comringdetach', 'comringencode', 'comringmsg', 'cos',
+ 'cosh', 'cot', 'cross2d', 'cross3d', 'csc', 'ctlstring', 'ctlinteger',
+ 'ctlnumber', 'ctlvector', 'ctldistance', 'ctlchoice', 'ctltext',
+ 'ctlcolor', 'ctlsurface', 'ctlfont', 'ctlpopup', 'ctledit', 'ctlpercent',
+ 'ctlangle', 'ctlrgb', 'ctlhsv', 'ctlcheckbox', 'ctlstate', 'ctlfilename',
+ 'ctlbutton', 'ctllistbox', 'ctlslider', 'ctlminislider', 'ctlsep', 'ctlimage',
+ 'ctltab', 'ctlallitems', 'ctlmeshitems', 'ctlcameraitems', 'ctllightitems',
+ 'ctlboneitems', 'ctlimageitems', 'ctlchannel', 'ctlviewport', 'Control_Management',
+ 'ctlpage', 'ctlgroup', 'ctlposition', 'ctlactive', 'ctlvisible', 'ctlalign',
+ 'ctlrefresh', 'ctlmenu', 'ctlinfo',
+ 'date', 'debug', 'deg', 'dot2d', 'dot3d', 'drawborder', 'drawbox', 'drawcircle',
+ 'drawelipse', 'drawerase', 'drawfillcircle', 'drawfillelipse', 'drawline',
+ 'drawpixel', 'drawtext', 'drawtextwidth', 'drawtextheight', 'dump',
+ 'error', 'exp', 'expose', 'extent',
+ 'fac', 'filecrc', 'filedelete', 'fileexists', 'filefind', 'filerename',
+ 'filestat', 'floor', 'format', 'frac', 'fullpath',
+ 'gamma', 'getdir', 'getenv', 'getfile', 'getfirstitem', 'getsep', 'getvalue',
+ 'globalrecall', 'globalstore',
+ 'hash', 'hex', 'hostBuild', 'hostVersion', 'hypot',
+ 'info', 'integer',
+ 'library', 'licenseId', 'lscriptVersion', 'load', 'loadimage', 'log', 'log10',
+ 'matchdirs', 'matchfiles', 'max', 'min', 'mkdir', 'mod', 'monend', 'moninit', 'monstep',
+ 'nil', 'normalize', 'number',
+ 'octal', 'overlayglyph',
+ 'parse', 'platform', 'pow',
+ 'rad', 'random', 'randu', 'range', 'read', 'readdouble', 'readInt', 'readNumber',
+ 'readShort', 'recall', 'regexp', 'reqabort', 'reqbegin', 'reqend', 'reqisopen',
+ 'reqkeyboard', 'reqopen', 'reqposition', 'reqpost', 'reqredraw',
+ 'reqsize', 'reqresize', 'requpdate', 'rmdir', 'round', 'runningUnder',
+ 'save', 'sec', 'select', 'selector', 'setdesc', 'setvalue', 'sin', 'sinh', 'size',
+ 'sizeof', 'sleep', 'spawn', 'split', 'sqrt', 'step', 'store', 'string', 'strleft',
+ 'strlower', 'strright', 'strsub', 'strupper',
+ 'tan', 'tanh', 'targetobject', 'terminate', 'text', 'time',
+ 'wait', 'warn', 'when', 'write', 'writeDouble', 'writeInt', 'writeNumber', 'writeShort',
+ 'var', 'vector', 'visitnodes', 'vmag',
+ ),
+ 5 => array(
+ 'addcurve', 'addpoint', 'addpolygon', 'addquad', 'addtriangle', 'alignpols',
+ 'autoflex', 'axisdrill',
+ 'bend', 'bevel', 'boolean', 'boundingbox',
+ 'changepart', 'changesurface', 'close', 'closeall', 'cmdseq', 'copy', 'copysurface',
+ 'createsurface', 'cut',
+ 'deformregion', 'delete',
+ 'editbegin', 'editend', 'exit', 'extrude',
+ 'fixedflex', 'flip', 'fontclear', 'fontcount', 'fontindex', 'fontload',
+ 'fontname', 'fracsubdivide', 'freezecurves',
+ 'getdefaultsurface',
+ 'jitter',
+ 'lathe', 'layerName', 'layerVisible', 'lyrbg', 'lyrdata', 'lyrempty', 'lyremptybg',
+ 'lyremptyfg', 'lyrfg', 'lyrsetbg', 'lyrsetfg', 'lyrswap',
+ 'magnet', 'make4patch', 'makeball', 'makebox', 'makecone', 'makedisc',
+ 'maketesball', 'maketext', 'mergepoints', 'mergepols', 'meshedit', 'mirror',
+ 'morphpols', 'move',
+ 'new', 'nextsurface',
+ 'paste', 'pathclone', 'pathextrude', 'pixel', 'pointcount', 'pointinfo',
+ 'pointmove', 'pole', 'polycount', 'polyinfo', 'polynormal', 'polypointcount',
+ 'polypoints', 'polysurface',
+ 'quantize',
+ 'railclone', 'railextrude', 'redo', 'removepols', 'rempoint', 'rempoly',
+ 'renamesurface', 'revert', 'rotate',
+ 'scale', 'selhide', 'selinvert', 'selmode', 'selpoint', 'selpolygon', 'selunhide',
+ 'selectvmap', 'setlayername', 'setobject', 'setpivot', 'setsurface', 'shapebevel',
+ 'shear', 'skinpols', 'smooth', 'smoothcurves', 'smoothscale', 'smoothshift',
+ 'soliddrill', 'splitpols', 'subdivide', 'swaphidden',
+ 'taper', 'triple', 'toggleCCend', 'toggleCCstart', 'togglepatches', 'twist',
+ 'undo', 'undogroupend', 'undogroupbegin', 'unifypols', 'unweld',
+ 'vortex',
+ 'weldaverage', 'weldpoints'
+ ),
+ 6 => array(
+ 'About', 'AboutOpenGL', 'AdaptiveSampling', 'AdaptiveThreshold',
+ 'AddAreaLight', 'AddBone', 'AddButton', 'AddCamera', 'AddChildBone',
+ 'AddDistantLight', 'AddEnvelope', 'AddLinearLight', 'AddNull',
+ 'AddPartigon', 'AddPlugins', 'AddPointLight', 'AddPosition',
+ 'AddRotation', 'AddScale', 'AddSpotlight', 'AddToSelection',
+ 'AdjustRegionTool', 'AffectCaustics', 'AffectDiffuse', 'AffectOpenGL',
+ 'AffectSpecular', 'AlertLevel', 'AmbientColor', 'AmbientIntensity',
+ 'Antialiasing', 'ApertureHeight', 'ApplyServer', 'AreaLight',
+ 'AutoConfirm', 'AutoFrameAdvance', 'AutoKey',
+ 'BackdropColor', 'BackView', 'BController', 'BLimits', 'BLurLength', 'BoneActive',
+ 'BoneFalloffType', 'BoneJointComp', 'BoneJointCompAmounts', 'BoneJointCompParent',
+ 'BoneLimitedRange', 'BoneMaxRange', 'BoneMinRange', 'BoneMuscleFlex',
+ 'BoneMuscleFlexAmounts', 'BoneMuscleFlexParent', 'BoneNormalization',
+ 'BoneRestLength', 'BoneRestPosition', 'BoneRestRotation', 'BoneSource',
+ 'BoneStrength', 'BoneStrengthMultiply', 'BoneWeightMapName', 'BoneWeightMapOnly',
+ 'BoneWeightShade', 'BoneXRay', 'BottomView', 'BoundingBoxThreshold',
+ 'BStiffness',
+ 'CacheCaustics', 'CacheRadiosity', 'CacheShadowMap',
+ 'CameraMask', 'CameraView', 'CameraZoomTool', 'CastShadow', 'CausticIntensity',
+ 'CenterItem', 'CenterMouse', 'ChangeTool', 'ClearAllBones', 'ClearAllCameras',
+ 'ClearAllLights', 'ClearAllObjects', 'ClearAudio', 'ClearScene', 'ClearSelected',
+ 'Clone', 'CommandHistory', 'CommandInput', 'Compositing', 'ConeAngleTool',
+ 'ContentDirectory', 'CreateKey',
+ 'DecreaseGrid', 'DeleteKey', 'DepthBufferAA', 'DepthOfField', 'DisplayOptions',
+ 'DistantLight', 'DrawAntialiasing', 'DrawBones', 'DrawChildBones', 'DynamicUpdate',
+ 'EditBones', 'EditCameras', 'EditKeys', 'EditLights',
+ 'EditMenus', 'EditObjects', 'EditPlugins', 'EditServer', 'EnableCaustics',
+ 'EnableDeformations', 'EnableIK', 'EnableLensFlares', 'EnableRadiosity', 'EnableServer',
+ 'EnableShadowMaps', 'EnableVIPER', 'EnableVolumetricLights', 'EnableXH',
+ 'EnableYP', 'EnableZB', 'EnahancedAA', 'ExcludeLight', 'ExcludeObject',
+ 'EyeSeparation',
+ 'FasterBones', 'FirstFrame', 'FirstItem', 'FitAll', 'FitSelected',
+ 'FlareIntensity', 'FlareOptions', 'FocalDistance', 'FogColor', 'FogMaxAmount',
+ 'FogMaxDistance', 'FogMinAmount', 'FogMinDistance', 'FogType', 'FractionalFrames',
+ 'FrameSize', 'FramesPerSecond', 'FrameStep', 'FreePreview', 'FrontView', 'FullTimeIK',
+ 'GeneralOptions', 'Generics', 'GlobalApertureHeight', 'GlobalBlurLength',
+ 'GlobalFrameSize', 'GlobalIllumination', 'GlobalMaskPosition', 'GlobalMotionBlur',
+ 'GlobalParticleBlur', 'GlobalPixelAspect', 'GlobalResolutionMulitplier', 'GoalItem',
+ 'GoalStrength', 'GoToFrame', 'GradientBackdrop', 'GraphEditor', 'GridSize', 'GroundColor',
+ 'HController', 'HideToolbar', 'HideWindows', 'HLimits', 'HStiffness',
+ 'ImageEditor', 'ImageProcessing', 'IncludeLight', 'IncludeObject', 'IncreaseGrid',
+ 'IndirectBounces', 'Item_SetWindowPos', 'ItemActive', 'ItemColor', 'ItemLock',
+ 'ItemProperties', 'ItemVisibilty',
+ 'KeepGoalWithinReach',
+ 'LastFrame', 'LastItem', 'LastPluginInterface', 'Layout_SetWindowPos',
+ 'Layout_SetWindowSize', 'LeftView', 'LensFlare', 'LensFStop', 'LightColor',
+ 'LightConeAngle', 'LightEdgeAngle', 'LightFalloffType', 'LightIntensity',
+ 'LightIntensityTool', 'LightQuality', 'LightRange', 'LightView', 'LimitB',
+ 'LimitDynamicRange', 'LimitedRegion', 'LimitH', 'LimitP', 'LinearLight',
+ 'LoadAudio', 'LoadFromScene', 'LoadMotion', 'LoadObject', 'LoadObjectLayer',
+ 'LoadPreview', 'LoadScene', 'LocalCoordinateSystem',
+ 'MakePreview', 'MaskColor', 'MaskPosition', 'MasterPlugins', 'MatchGoalOrientation',
+ 'MatteColor', 'MatteObject', 'MetaballResolution', 'Model', 'MorphAmount',
+ 'MorphAmountTool', 'MorphMTSE', 'MorphSurfaces', 'MorphTarget', 'MotionBlur',
+ 'MotionBlurDOFPreview', 'MotionOptions', 'MovePathTool', 'MovePivotTool', 'MoveTool',
+ 'NadirColor', 'NetRender', 'NextFrame', 'NextItem', 'NextKey', 'NextSibling',
+ 'NextViewLayout', 'NoiseReduction', 'Numeric',
+ 'ObjectDissolve',
+ 'ParentCoordinateSystem', 'ParentInPlace', 'ParentItem',
+ 'ParticleBlur', 'PathAlignLookAhead', 'PathAlignMaxLookSteps', 'PathAlignReliableDist',
+ 'Pause', 'PController', 'PerspectiveView',
+ 'PivotPosition', 'PivotRotation', 'PixelAspect', 'PlayAudio', 'PlayBackward',
+ 'PlayForward', 'PlayPreview', 'PLimits', 'PointLight', 'PolygonEdgeColor',
+ 'PolygonEdgeFlags', 'PolygonEdgeThickness', 'PolygonEdgeZScale', 'PolygonSize',
+ 'Position', 'Presets', 'PreviewFirstFrame', 'PreviewFrameStep', 'PreviewLastFrame',
+ 'PreviewOptions', 'PreviousFrame', 'PreviousItem', 'PreviousKey', 'PreviousSibling',
+ 'PreviousViewLayout', 'PStiffness',
+ 'Quit',
+ 'RadiosityIntensity', 'RadiosityTolerance', 'RadiosityType', 'RayRecursionLimit',
+ 'RayTraceReflection', 'RayTraceShadows',
+ 'RayTraceTransparency', 'ReceiveShadow', 'RecentContentDirs', 'RecentScenes',
+ 'ReconstructionFilter', 'RecordMaxAngles', 'RecordMinAngles', 'RecordPivotRotation',
+ 'RecordRestPosition', 'Redraw', 'RedrawNow', 'Refresh', 'RefreshNow', 'RegionPosition',
+ 'RemoveEnvelope', 'RemoveFromSelection', 'RemoveServer', 'Rename', 'RenderFrame',
+ 'RenderOptions', 'RenderScene', 'RenderSelected', 'RenderThreads',
+ 'ReplaceObjectLayer', 'ReplaceWithNull', 'ReplaceWithObject', 'Reset',
+ 'ResolutionMultiplier', 'RestLengthTool', 'RightView', 'RotatePivotTool',
+ 'RotateTool', 'Rotation',
+ 'SaveAllObjects', 'SaveCommandList', 'SaveCommandMessages',
+ 'SaveEndomorph', 'SaveLight', 'SaveLWSC1', 'SaveMotion', 'SaveObject', 'SaveObjectCopy',
+ 'SavePreview', 'SaveScene', 'SaveSceneAs', 'SaveSceneCopy', 'SaveTransformed',
+ 'SaveViewLayout', 'Scale', 'Scene_SetWindowPos', 'Scene_SetWindowSize',
+ 'SceneEditor', 'SchematicPosition', 'SchematicView', 'SelectAllBones',
+ 'SelectAllCameras', 'SelectAllLights', 'SelectAllObjects', 'SelectByName',
+ 'SelectChild', 'SelectItem', 'SelectParent', 'SelfShadow', 'ShadowColor',
+ 'ShadowExclusion', 'ShadowMapAngle', 'ShadowMapFitCone', 'ShadowMapFuzziness',
+ 'ShadowMapSize', 'ShadowType', 'ShowCages', 'ShowFieldChart', 'ShowHandles',
+ 'ShowIKChains', 'ShowMotionPaths', 'ShowSafeAreas', 'ShowTargetLines',
+ 'ShrinkEdgesWithDistance', 'SingleView', 'SizeTool', 'SkelegonsToBones', 'SkyColor',
+ 'Spotlight', 'SquashTool', 'Statistics', 'StatusMsg', 'Stereoscopic', 'StretchTool',
+ 'SubdivisionOrder', 'SubPatchLevel', 'SurfaceEditor', 'Synchronize',
+ 'TargetItem', 'TopView',
+ 'UnaffectedByFog', 'UnaffectedByIK', 'Undo', 'UnseenByAlphaChannel', 'UnseenByCamera',
+ 'UnseenByRays', 'UseGlobalResolution', 'UseGlobalBlur', 'UseGlobalMask',
+ 'UseMorphedPositions',
+ 'ViewLayout', 'VIPER', 'VolumetricLighting',
+ 'VolumetricLightingOptions', 'VolumetricRadiosity', 'Volumetrics',
+ 'WorldCoordinateSystem',
+ 'XYView', 'XZView',
+ 'ZenithColor', 'ZoomFactor', 'ZoomIn', 'ZoomInX2', 'ZoomOut', 'ZoomOutX2', 'ZYView',
+ 'Camera', 'Channel', 'ChannelGroup', 'Envelope', 'File', 'Glyph', 'Icon', 'Image',
+ 'Light', 'Mesh', 'Scene', 'Surface', 'VMap'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '=', '<', '>', '+', '-', '*', '/', '!', '%', '&', '@'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #FF6820; font-weight: bold;', //LS_COMMANDS
+ 3 => 'color: #007F7F; font-weight: bold;', //LS_MEMBERS
+ 4 => 'color: #800080; font-weight: bold;', //LS_METHODS
+ 5 => 'color: #51BD95; font-weight: bold;', //LS_MODELER
+ 6 => 'color: #416F85; font-weight: bold;', //LS_GENERAL
+ 7 => 'color: #C92929; font-weight: bold;' //LS_COMMANDS (cont)
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #7F7F7F;',
+ 'MULTI' => 'color: #7F7F7F;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #0040A0;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #00C800;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #6953AC;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #0040A0;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'ESCAPE_CHAR' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 3 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\.)'
+ ),
+ 4 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\.)'
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lsl2.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lsl2.php
new file mode 100644
index 00000000..f80cf4f2
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lsl2.php
@@ -0,0 +1,898 @@
+<?php
+/*************************************************************************************
+ * lsl2.php
+ * --------
+ * Author: William Fry (william.fry@nyu.edu)
+ * Copyright: (c) 2009 William Fry
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/02/04
+ *
+ * Linden Scripting Language (LSL2) language file for GeSHi.
+ *
+ * Data derived and validated against the following:
+ * http://wiki.secondlife.com/wiki/LSL_Portal
+ * http://www.lslwiki.net/lslwiki/wakka.php?wakka=HomePage
+ * http://rpgstats.com/wiki/index.php?title=Main_Page
+ *
+ * CHANGES
+ * -------
+ * 2009/02/05 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2009/02/05)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'LSL2',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array( // flow control
+ 'do',
+ 'else',
+ 'for',
+ 'if',
+ 'jump',
+ 'return',
+ 'state',
+ 'while',
+ ),
+ 2 => array( // manifest constants
+ 'ACTIVE',
+ 'AGENT',
+ 'AGENT_ALWAYS_RUN',
+ 'AGENT_ATTACHMENTS',
+ 'AGENT_AWAY',
+ 'AGENT_BUSY',
+ 'AGENT_CROUCHING',
+ 'AGENT_FLYING',
+ 'AGENT_IN_AIR',
+ 'AGENT_MOUSELOOK',
+ 'AGENT_ON_OBJECT',
+ 'AGENT_SCRIPTED',
+ 'AGENT_SITTING',
+ 'AGENT_TYPING',
+ 'AGENT_WALKING',
+ 'ALL_SIDES',
+ 'ANIM_ON',
+ 'ATTACH_BACK',
+ 'ATTACH_BELLY',
+ 'ATTACH_CHEST',
+ 'ATTACH_CHIN',
+ 'ATTACH_HEAD',
+ 'ATTACH_HUD_BOTTOM',
+ 'ATTACH_HUD_BOTTOM_LEFT',
+ 'ATTACH_HUD_BOTTOM_RIGHT',
+ 'ATTACH_HUD_CENTER_1',
+ 'ATTACH_HUD_CENTER_2',
+ 'ATTACH_HUD_TOP_CENTER',
+ 'ATTACH_HUD_TOP_LEFT',
+ 'ATTACH_HUD_TOP_RIGHT',
+ 'ATTACH_LEAR',
+ 'ATTACH_LEYE',
+ 'ATTACH_LFOOT',
+ 'ATTACH_LHAND',
+ 'ATTACH_LHIP',
+ 'ATTACH_LLARM',
+ 'ATTACH_LLLEG',
+ 'ATTACH_LPEC',
+ 'ATTACH_LSHOULDER',
+ 'ATTACH_LUARM',
+ 'ATTACH_LULEG',
+ 'ATTACH_MOUTH',
+ 'ATTACH_NOSE',
+ 'ATTACH_PELVIS',
+ 'ATTACH_REAR',
+ 'ATTACH_REYE',
+ 'ATTACH_RFOOT',
+ 'ATTACH_RHAND',
+ 'ATTACH_RHIP',
+ 'ATTACH_RLARM',
+ 'ATTACH_RLLEG',
+ 'ATTACH_RPEC',
+ 'ATTACH_RSHOULDER',
+ 'ATTACH_RUARM',
+ 'ATTACH_RULEG',
+ 'CAMERA_ACTIVE',
+ 'CAMERA_BEHINDNESS_ANGLE',
+ 'CAMERA_BEHINDNESS_LAG',
+ 'CAMERA_DISTANCE',
+ 'CAMERA_FOCUS',
+ 'CAMERA_FOCUS_LAG',
+ 'CAMERA_FOCUS_LOCKED',
+ 'CAMERA_FOCUS_OFFSET',
+ 'CAMERA_FOCUS_THRESHOLD',
+ 'CAMERA_PITCH',
+ 'CAMERA_POSITION',
+ 'CAMERA_POSITION_LAG',
+ 'CAMERA_POSITION_LOCKED',
+ 'CAMERA_POSITION_THRESHOLD',
+ 'CHANGED_ALLOWED_DROP',
+ 'CHANGED_COLOR',
+ 'CHANGED_INVENTORY',
+ 'CHANGED_LINK',
+ 'CHANGED_OWNER',
+ 'CHANGED_REGION',
+ 'CHANGED_SCALE',
+ 'CHANGED_SHAPE',
+ 'CHANGED_TELEPORT',
+ 'CHANGED_TEXTURE',
+ 'CLICK_ACTION_NONE',
+ 'CLICK_ACTION_OPEN',
+ 'CLICK_ACTION_OPEN_MEDIA',
+ 'CLICK_ACTION_PAY',
+ 'CLICK_ACTION_SIT',
+ 'CLICK_ACTION_TOUCH',
+ 'CONTROL_BACK',
+ 'CONTROL_DOWN',
+ 'CONTROL_FWD',
+ 'CONTROL_LBUTTON',
+ 'CONTROL_LEFT',
+ 'CONTROL_ML_LBUTTON',
+ 'CONTROL_RIGHT',
+ 'CONTROL_ROT_LEFT',
+ 'CONTROL_ROT_RIGHT',
+ 'CONTROL_UP',
+ 'DATA_BORN',
+ 'DATA_NAME',
+ 'DATA_ONLINE',
+ 'DATA_PAYINFO',
+ 'DATA_RATING',
+ 'DATA_SIM_POS',
+ 'DATA_SIM_RATING',
+ 'DATA_SIM_STATUS',
+ 'DEBUG_CHANNEL',
+ 'DEG_TO_RAD',
+ 'EOF',
+ 'FALSE',
+ 'HTTP_BODY_MAXLENGTH',
+ 'HTTP_BODY_TRUNCATED',
+ 'HTTP_METHOD',
+ 'HTTP_MIMETYPE',
+ 'HTTP_VERIFY_CERT',
+ 'INVENTORY_ALL',
+ 'INVENTORY_ANIMATION',
+ 'INVENTORY_BODYPART',
+ 'INVENTORY_CLOTHING',
+ 'INVENTORY_GESTURE',
+ 'INVENTORY_LANDMARK',
+ 'INVENTORY_NONE',
+ 'INVENTORY_NOTECARD',
+ 'INVENTORY_OBJECT',
+ 'INVENTORY_SCRIPT',
+ 'INVENTORY_SOUND',
+ 'INVENTORY_TEXTURE',
+ 'LAND_LEVEL',
+ 'LAND_LOWER',
+ 'LAND_NOISE',
+ 'LAND_RAISE',
+ 'LAND_REVERT',
+ 'LAND_SMOOTH',
+ 'LINK_ALL_CHILDREN',
+ 'LINK_ALL_OTHERS',
+ 'LINK_ROOT',
+ 'LINK_SET',
+ 'LINK_THIS',
+ 'LIST_STAT_GEOMETRIC_MEAN',
+ 'LIST_STAT_MAX',
+ 'LIST_STAT_MEAN',
+ 'LIST_STAT_MEDIAN',
+ 'LIST_STAT_MIN',
+ 'LIST_STAT_NUM_COUNT',
+ 'LIST_STAT_RANGE',
+ 'LIST_STAT_STD_DEV',
+ 'LIST_STAT_SUM',
+ 'LIST_STAT_SUM_SQUARES',
+ 'LOOP',
+ 'MASK_BASE',
+ 'MASK_EVERYONE',
+ 'MASK_GROUP',
+ 'MASK_NEXT',
+ 'MASK_OWNER',
+ 'NULL_KEY',
+ 'OBJECT_CREATOR',
+ 'OBJECT_DESC',
+ 'OBJECT_GROUP',
+ 'OBJECT_NAME',
+ 'OBJECT_OWNER',
+ 'OBJECT_POS',
+ 'OBJECT_ROT',
+ 'OBJECT_UNKNOWN_DETAIL',
+ 'OBJECT_VELOCITY',
+ 'PARCEL_DETAILS_AREA',
+ 'PARCEL_DETAILS_DESC',
+ 'PARCEL_DETAILS_GROUP',
+ 'PARCEL_DETAILS_NAME',
+ 'PARCEL_DETAILS_OWNER',
+ 'PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY',
+ 'PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS',
+ 'PARCEL_FLAG_ALLOW_CREATE_OBJECTS',
+ 'PARCEL_FLAG_ALLOW_DAMAGE',
+ 'PARCEL_FLAG_ALLOW_FLY',
+ 'PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY',
+ 'PARCEL_FLAG_ALLOW_GROUP_SCRIPTS',
+ 'PARCEL_FLAG_ALLOW_LANDMARK',
+ 'PARCEL_FLAG_ALLOW_SCRIPTS',
+ 'PARCEL_FLAG_ALLOW_TERRAFORM',
+ 'PARCEL_FLAG_LOCAL_SOUND_ONLY',
+ 'PARCEL_FLAG_RESTRICT_PUSHOBJECT',
+ 'PARCEL_FLAG_USE_ACCESS_GROUP',
+ 'PARCEL_FLAG_USE_ACCESS_LIST',
+ 'PARCEL_FLAG_USE_BAN_LIST',
+ 'PARCEL_FLAG_USE_LAND_PASS_LIST',
+ 'PARCEL_MEDIA_COMMAND_AGENT',
+ 'PARCEL_MEDIA_COMMAND_AUTO_ALIGN',
+ 'PARCEL_MEDIA_COMMAND_DESC',
+ 'PARCEL_MEDIA_COMMAND_LOOP_SET',
+ 'PARCEL_MEDIA_COMMAND_PAUSE',
+ 'PARCEL_MEDIA_COMMAND_PLAY',
+ 'PARCEL_MEDIA_COMMAND_SIZE',
+ 'PARCEL_MEDIA_COMMAND_STOP',
+ 'PARCEL_MEDIA_COMMAND_TEXTURE',
+ 'PARCEL_MEDIA_COMMAND_TIME',
+ 'PARCEL_MEDIA_COMMAND_TYPE',
+ 'PARCEL_MEDIA_COMMAND_URL',
+ 'PASSIVE',
+ 'PAYMENT_INFO_ON_FILE',
+ 'PAYMENT_INFO_USED',
+ 'PAY_DEFAULT',
+ 'PAY_HIDE',
+ 'PERMISSION_ATTACH',
+ 'PERMISSION_CHANGE_LINKS',
+ 'PERMISSION_CONTROL_CAMERA',
+ 'PERMISSION_DEBIT',
+ 'PERMISSION_TAKE_CONTROLS',
+ 'PERMISSION_TRACK_CAMERA',
+ 'PERMISSION_TRIGGER_ANIMATION',
+ 'PERM_ALL',
+ 'PERM_COPY',
+ 'PERM_MODIFY',
+ 'PERM_MOVE',
+ 'PERM_TRANSFER',
+ 'PI',
+ 'PI_BY_TWO',
+ 'PRIM_BUMP_BARK',
+ 'PRIM_BUMP_BLOBS',
+ 'PRIM_BUMP_BRICKS',
+ 'PRIM_BUMP_BRIGHT',
+ 'PRIM_BUMP_CHECKER',
+ 'PRIM_BUMP_CONCRETE',
+ 'PRIM_BUMP_DARK',
+ 'PRIM_BUMP_DISKS',
+ 'PRIM_BUMP_GRAVEL',
+ 'PRIM_BUMP_LARGETILE',
+ 'PRIM_BUMP_NONE',
+ 'PRIM_BUMP_SHINY',
+ 'PRIM_BUMP_SIDING',
+ 'PRIM_BUMP_STONE',
+ 'PRIM_BUMP_STUCCO',
+ 'PRIM_BUMP_SUCTION',
+ 'PRIM_BUMP_TILE',
+ 'PRIM_BUMP_WEAVE',
+ 'PRIM_BUMP_WOOD',
+ 'PRIM_COLOR',
+ 'PRIM_FULLBRIGHT',
+ 'PRIM_HOLE_CIRCLE',
+ 'PRIM_HOLE_DEFAULT',
+ 'PRIM_HOLE_SQUARE',
+ 'PRIM_HOLE_TRIANGLE',
+ 'PRIM_MATERIAL',
+ 'PRIM_MATERIAL_FLESH',
+ 'PRIM_MATERIAL_GLASS',
+ 'PRIM_MATERIAL_LIGHT',
+ 'PRIM_MATERIAL_METAL',
+ 'PRIM_MATERIAL_PLASTIC',
+ 'PRIM_MATERIAL_RUBBER',
+ 'PRIM_MATERIAL_STONE',
+ 'PRIM_MATERIAL_WOOD',
+ 'PRIM_PHANTOM',
+ 'PRIM_PHYSICS',
+ 'PRIM_POSITION',
+ 'PRIM_ROTATION',
+ 'PRIM_SHINY_HIGH',
+ 'PRIM_SHINY_LOW',
+ 'PRIM_SHINY_MEDIUM',
+ 'PRIM_SHINY_NONE',
+ 'PRIM_SIZE',
+ 'PRIM_TEMP_ON_REZ',
+ 'PRIM_TEXTURE',
+ 'PRIM_TYPE',
+ 'PRIM_TYPE_BOX',
+ 'PRIM_TYPE_CYLINDER',
+ 'PRIM_TYPE_PRISM',
+ 'PRIM_TYPE_RING',
+ 'PRIM_TYPE_SPHERE',
+ 'PRIM_TYPE_TORUS',
+ 'PRIM_TYPE_TUBE',
+ 'PSYS_PART_BOUNCE_MASK',
+ 'PSYS_PART_EMISSIVE_MASK',
+ 'PSYS_PART_END_ALPHA',
+ 'PSYS_PART_END_COLOR',
+ 'PSYS_PART_END_SCALE',
+ 'PSYS_PART_FLAGS',
+ 'PSYS_PART_FOLLOW_SRC_MASK',
+ 'PSYS_PART_FOLLOW_VELOCITY_MASK',
+ 'PSYS_PART_INTERP_COLOR_MASK',
+ 'PSYS_PART_INTERP_SCALE_MASK',
+ 'PSYS_PART_MAX_AGE',
+ 'PSYS_PART_START_ALPHA',
+ 'PSYS_PART_START_COLOR',
+ 'PSYS_PART_START_SCALE',
+ 'PSYS_PART_TARGET_LINEAR_MASK',
+ 'PSYS_PART_TARGET_POS_MASK',
+ 'PSYS_PART_WIND_MASK',
+ 'PSYS_SRC_ACCEL',
+ 'PSYS_SRC_ANGLE_BEGIN',
+ 'PSYS_SRC_ANGLE_END',
+ 'PSYS_SRC_BURST_PART_COUNT',
+ 'PSYS_SRC_BURST_RADIUS',
+ 'PSYS_SRC_BURST_RATE',
+ 'PSYS_SRC_BURST_SPEED_MAX',
+ 'PSYS_SRC_BURST_SPEED_MIN',
+ 'PSYS_SRC_INNERANGLE',
+ 'PSYS_SRC_MAX_AGE',
+ 'PSYS_SRC_OMEGA',
+ 'PSYS_SRC_OUTERANGLE',
+ 'PSYS_SRC_PATTERN',
+ 'PSYS_SRC_PATTERN_ANGLE',
+ 'PSYS_SRC_PATTERN_ANGLE_CONE',
+ 'PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY',
+ 'PSYS_SRC_PATTERN_DROP',
+ 'PSYS_SRC_PATTERN_EXPLODE',
+ 'PSYS_SRC_TARGET_KEY',
+ 'PSYS_SRC_TEXTURE',
+ 'RAD_TO_DEG',
+ 'REMOTE_DATA_CHANNEL',
+ 'REMOTE_DATA_REQUEST',
+ 'SCRIPTED',
+ 'SQRT2',
+ 'STATUS_BLOCK_GRAB',
+ 'STATUS_DIE_AT_EDGE',
+ 'STATUS_PHANTOM',
+ 'STATUS_PHYSICS',
+ 'STATUS_RETURN_AT_EDGE',
+ 'STATUS_ROTATE_X',
+ 'STATUS_ROTATE_Y',
+ 'STATUS_ROTATE_Z',
+ 'STATUS_SANDBOX',
+ 'TRUE',
+ 'TWO_PI',
+ 'VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY',
+ 'VEHICLE_ANGULAR_DEFLECTION_TIMESCALE',
+ 'VEHICLE_ANGULAR_FRICTION_TIMESCALE',
+ 'VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE',
+ 'VEHICLE_ANGULAR_MOTOR_DIRECTION',
+ 'VEHICLE_ANGULAR_MOTOR_TIMESCALE',
+ 'VEHICLE_BANKING_EFFICIENCY',
+ 'VEHICLE_BANKING_MIX',
+ 'VEHICLE_BANKING_TIMESCALE',
+ 'VEHICLE_BUOYANCY',
+ 'VEHICLE_FLAG_CAMERA_DECOUPLED',
+ 'VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT',
+ 'VEHICLE_FLAG_HOVER_TERRAIN_ONLY',
+ 'VEHICLE_FLAG_HOVER_UP_ONLY',
+ 'VEHICLE_FLAG_HOVER_WATER_ONLY',
+ 'VEHICLE_FLAG_LIMIT_MOTOR_UP',
+ 'VEHICLE_FLAG_LIMIT_ROLL_ONLY',
+ 'VEHICLE_FLAG_MOUSELOOK_BANK',
+ 'VEHICLE_FLAG_MOUSELOOK_STEER',
+ 'VEHICLE_FLAG_NO_DEFLECTION_UP',
+ 'VEHICLE_HOVER_EFFICIENCY',
+ 'VEHICLE_HOVER_HEIGHT',
+ 'VEHICLE_HOVER_TIMESCALE',
+ 'VEHICLE_LINEAR_DEFLECTION_EFFICIENCY',
+ 'VEHICLE_LINEAR_DEFLECTION_TIMESCALE',
+ 'VEHICLE_LINEAR_FRICTION_TIMESCALE',
+ 'VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE',
+ 'VEHICLE_LINEAR_MOTOR_DIRECTION',
+ 'VEHICLE_LINEAR_MOTOR_OFFSET',
+ 'VEHICLE_LINEAR_MOTOR_TIMESCALE',
+ 'VEHICLE_REFERENCE_FRAME',
+ 'VEHICLE_TYPE_AIRPLANE',
+ 'VEHICLE_TYPE_BALLOON',
+ 'VEHICLE_TYPE_BOAT',
+ 'VEHICLE_TYPE_CAR',
+ 'VEHICLE_TYPE_NONE',
+ 'VEHICLE_TYPE_SLED',
+ 'VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY',
+ 'VEHICLE_VERTICAL_ATTRACTION_TIMESCALE',
+ 'ZERO_ROTATION',
+ 'ZERO_VECTOR',
+ ),
+ 3 => array( // handlers
+ 'at_rot_target',
+ 'at_target',
+ 'attached',
+ 'changed',
+ 'collision',
+ 'collision_end',
+ 'collision_start',
+ 'control',
+ 'dataserver',
+ 'email',
+ 'http_response',
+ 'land_collision',
+ 'land_collision_end',
+ 'land_collision_start',
+ 'link_message',
+ 'listen',
+ 'money',
+ 'moving_end',
+ 'moving_start',
+ 'no_sensor',
+ 'not_at_rot_target',
+ 'not_at_target',
+ 'object_rez',
+ 'on_rez',
+ 'remote_data',
+ 'run_time_permissions',
+ 'sensor',
+ 'state_entry',
+ 'state_exit',
+ 'timer',
+ 'touch',
+ 'touch_end',
+ 'touch_start',
+ ),
+ 4 => array( // data types
+ 'float',
+ 'integer',
+ 'key',
+ 'list',
+ 'rotation',
+ 'string',
+ 'vector',
+ ),
+ 5 => array( // library
+ 'default',
+ 'llAbs',
+ 'llAcos',
+ 'llAddToLandBanList',
+ 'llAddToLandPassList',
+ 'llAdjustSoundVolume',
+ 'llAllowInventoryDrop',
+ 'llAngleBetween',
+ 'llApplyImpulse',
+ 'llApplyRotationalImpulse',
+ 'llAsin',
+ 'llAtan2',
+ 'llAttachToAvatar',
+ 'llAvatarOnSitTarget',
+ 'llAxes2Rot',
+ 'llAxisAngle2Rot',
+ 'llBase64ToInteger',
+ 'llBase64ToString',
+ 'llBreakAllLinks',
+ 'llBreakLink',
+ 'llCeil',
+ 'llClearCameraParams',
+ 'llCloseRemoteDataChannel',
+ 'llCloud',
+ 'llCollisionFilter',
+ 'llCollisionSound',
+ 'llCollisionSprite',
+ 'llCos',
+ 'llCreateLink',
+ 'llCSV2List',
+ 'llDeleteSubList',
+ 'llDeleteSubString',
+ 'llDetachFromAvatar',
+ 'llDetectedGrab',
+ 'llDetectedGroup',
+ 'llDetectedKey',
+ 'llDetectedLinkNumber',
+ 'llDetectedName',
+ 'llDetectedOwner',
+ 'llDetectedPos',
+ 'llDetectedRot',
+ 'llDetectedTouchBinormal',
+ 'llDetectedTouchFace',
+ 'llDetectedTouchNormal',
+ 'llDetectedTouchPos',
+ 'llDetectedTouchST',
+ 'llDetectedTouchUV',
+ 'llDetectedType',
+ 'llDetectedVel',
+ 'llDialog',
+ 'llDie',
+ 'llDumpList2String',
+ 'llEdgeOfWorld',
+ 'llEjectFromLand',
+ 'llEmail',
+ 'llEscapeURL',
+ 'llEuler2Rot',
+ 'llFabs',
+ 'llFloor',
+ 'llForceMouselook',
+ 'llFrand',
+ 'llGetAccel',
+ 'llGetAgentInfo',
+ 'llGetAgentLanguage',
+ 'llGetAgentSize',
+ 'llGetAlpha',
+ 'llGetAndResetTime',
+ 'llGetAnimation',
+ 'llGetAnimationList',
+ 'llGetAttached',
+ 'llGetBoundingBox',
+ 'llGetCameraPos',
+ 'llGetCameraRot',
+ 'llGetCenterOfMass',
+ 'llGetColor',
+ 'llGetCreator',
+ 'llGetDate',
+ 'llGetEnergy',
+ 'llGetForce',
+ 'llGetFreeMemory',
+ 'llGetGeometricCenter',
+ 'llGetGMTclock',
+ 'llGetInventoryCreator',
+ 'llGetInventoryKey',
+ 'llGetInventoryName',
+ 'llGetInventoryNumber',
+ 'llGetInventoryPermMask',
+ 'llGetInventoryType',
+ 'llGetKey',
+ 'llGetLandOwnerAt',
+ 'llGetLinkKey',
+ 'llGetLinkName',
+ 'llGetLinkNumber',
+ 'llGetListEntryType',
+ 'llGetListLength',
+ 'llGetLocalPos',
+ 'llGetLocalRot',
+ 'llGetMass',
+ 'llGetNextEmail',
+ 'llGetNotecardLine',
+ 'llGetNumberOfNotecardLines',
+ 'llGetNumberOfPrims',
+ 'llGetNumberOfSides',
+ 'llGetObjectDesc',
+ 'llGetObjectDetails',
+ 'llGetObjectMass',
+ 'llGetObjectName',
+ 'llGetObjectPermMask',
+ 'llGetObjectPrimCount',
+ 'llGetOmega',
+ 'llGetOwner',
+ 'llGetOwnerKey',
+ 'llGetParcelDetails',
+ 'llGetParcelFlags',
+ 'llGetParcelMaxPrims',
+ 'llGetParcelPrimCount',
+ 'llGetParcelPrimOwners',
+ 'llGetPermissions',
+ 'llGetPermissionsKey',
+ 'llGetPos',
+ 'llGetPrimitiveParams',
+ 'llGetRegionAgentCount',
+ 'llGetRegionCorner',
+ 'llGetRegionFlags',
+ 'llGetRegionFPS',
+ 'llGetRegionName',
+ 'llGetRegionTimeDilation',
+ 'llGetRootPosition',
+ 'llGetRootRotation',
+ 'llGetRot',
+ 'llGetScale',
+ 'llGetScriptName',
+ 'llGetScriptState',
+ 'llGetSimulatorHostname',
+ 'llGetStartParameter',
+ 'llGetStatus',
+ 'llGetSubString',
+ 'llGetSunDirection',
+ 'llGetTexture',
+ 'llGetTextureOffset',
+ 'llGetTextureRot',
+ 'llGetTextureScale',
+ 'llGetTime',
+ 'llGetTimeOfDay',
+ 'llGetTimestamp',
+ 'llGetTorque',
+ 'llGetUnixTime',
+ 'llGetVel',
+ 'llGetWallclock',
+ 'llGiveInventory',
+ 'llGiveInventoryList',
+ 'llGiveMoney',
+ 'llGround',
+ 'llGroundContour',
+ 'llGroundNormal',
+ 'llGroundRepel',
+ 'llGroundSlope',
+ 'llHTTPRequest',
+ 'llInsertString',
+ 'llInstantMessage',
+ 'llIntegerToBase64',
+ 'llKey2Name',
+ 'llList2CSV',
+ 'llList2Float',
+ 'llList2Integer',
+ 'llList2Key',
+ 'llList2List',
+ 'llList2ListStrided',
+ 'llList2Rot',
+ 'llList2String',
+ 'llList2Vector',
+ 'llListen',
+ 'llListenControl',
+ 'llListenRemove',
+ 'llListFindList',
+ 'llListInsertList',
+ 'llListRandomize',
+ 'llListReplaceList',
+ 'llListSort',
+ 'llListStatistics',
+ 'llLoadURL',
+ 'llLog',
+ 'llLog10',
+ 'llLookAt',
+ 'llLoopSound',
+ 'llLoopSoundMaster',
+ 'llLoopSoundSlave',
+ 'llMapDestination',
+ 'llMD5String',
+ 'llMessageLinked',
+ 'llMinEventDelay',
+ 'llModifyLand',
+ 'llModPow',
+ 'llMoveToTarget',
+ 'llOffsetTexture',
+ 'llOpenRemoteDataChannel',
+ 'llOverMyLand',
+ 'llOwnerSay',
+ 'llParcelMediaCommandList',
+ 'llParcelMediaQuery',
+ 'llParseString2List',
+ 'llParseStringKeepNulls',
+ 'llParticleSystem',
+ 'llPassCollisions',
+ 'llPassTouches',
+ 'llPlaySound',
+ 'llPlaySoundSlave',
+ 'llPow',
+ 'llPreloadSound',
+ 'llPushObject',
+ 'llRegionSay',
+ 'llReleaseControls',
+ 'llRemoteDataReply',
+ 'llRemoteDataSetRegion',
+ 'llRemoteLoadScriptPin',
+ 'llRemoveFromLandBanList',
+ 'llRemoveFromLandPassList',
+ 'llRemoveInventory',
+ 'llRemoveVehicleFlags',
+ 'llRequestAgentData',
+ 'llRequestInventoryData',
+ 'llRequestPermissions',
+ 'llRequestSimulatorData',
+ 'llResetLandBanList',
+ 'llResetLandPassList',
+ 'llResetOtherScript',
+ 'llResetScript',
+ 'llResetTime',
+ 'llRezAtRoot',
+ 'llRezObject',
+ 'llRot2Angle',
+ 'llRot2Axis',
+ 'llRot2Euler',
+ 'llRot2Fwd',
+ 'llRot2Left',
+ 'llRot2Up',
+ 'llRotateTexture',
+ 'llRotBetween',
+ 'llRotLookAt',
+ 'llRotTarget',
+ 'llRotTargetRemove',
+ 'llRound',
+ 'llSameGroup',
+ 'llSay',
+ 'llScaleTexture',
+ 'llScriptDanger',
+ 'llSendRemoteData',
+ 'llSensor',
+ 'llSensorRemove',
+ 'llSensorRepeat',
+ 'llSetAlpha',
+ 'llSetBuoyancy',
+ 'llSetCameraAtOffset',
+ 'llSetCameraEyeOffset',
+ 'llSetCameraParams',
+ 'llSetClickAction',
+ 'llSetColor',
+ 'llSetDamage',
+ 'llSetForce',
+ 'llSetForceAndTorque',
+ 'llSetHoverHeight',
+ 'llSetLinkAlpha',
+ 'llSetLinkColor',
+ 'llSetLinkPrimitiveParams',
+ 'llSetLinkTexture',
+ 'llSetLocalRot',
+ 'llSetObjectDesc',
+ 'llSetObjectName',
+ 'llSetParcelMusicURL',
+ 'llSetPayPrice',
+ 'llSetPos',
+ 'llSetPrimitiveParams',
+ 'llSetRemoteScriptAccessPin',
+ 'llSetRot',
+ 'llSetScale',
+ 'llSetScriptState',
+ 'llSetSitText',
+ 'llSetSoundQueueing',
+ 'llSetSoundRadius',
+ 'llSetStatus',
+ 'llSetText',
+ 'llSetTexture',
+ 'llSetTextureAnim',
+ 'llSetTimerEvent',
+ 'llSetTorque',
+ 'llSetTouchText',
+ 'llSetVehicleFlags',
+ 'llSetVehicleFloatParam',
+ 'llSetVehicleRotationParam',
+ 'llSetVehicleType',
+ 'llSetVehicleVectorParam',
+ 'llSHA1String',
+ 'llShout',
+ 'llSin',
+ 'llSitTarget',
+ 'llSleep',
+ 'llSqrt',
+ 'llStartAnimation',
+ 'llStopAnimation',
+ 'llStopHover',
+ 'llStopLookAt',
+ 'llStopMoveToTarget',
+ 'llStopSound',
+ 'llStringLength',
+ 'llStringToBase64',
+ 'llStringTrim',
+ 'llSubStringIndex',
+ 'llTakeControls',
+ 'llTan',
+ 'llTarget',
+ 'llTargetOmega',
+ 'llTargetRemove',
+ 'llTeleportAgentHome',
+ 'llToLower',
+ 'llToUpper',
+ 'llTriggerSound',
+ 'llTriggerSoundLimited',
+ 'llUnescapeURL',
+ 'llUnSit',
+ 'llVecDist',
+ 'llVecMag',
+ 'llVecNorm',
+ 'llVolumeDetect',
+ 'llWater',
+ 'llWhisper',
+ 'llWind',
+ 'llXorBase64StringsCorrect',
+ ),
+ 6 => array( // deprecated
+ 'llMakeExplosion',
+ 'llMakeFire',
+ 'llMakeFountain',
+ 'llMakeSmoke',
+ 'llSound',
+ 'llSoundPreload',
+ 'llXorBase64Strings',
+ ),
+ 7 => array( // unimplemented
+ 'llPointAt',
+ 'llRefreshPrimURL',
+ 'llReleaseCamera',
+ 'llRemoteLoadScript',
+ 'llSetPrimURL',
+ 'llStopPointAt',
+ 'llTakeCamera',
+ 'llTextBox',
+ ),
+ 8 => array( // God mode
+ 'llGodLikeRezObject',
+ 'llSetInventoryPermMask',
+ 'llSetObjectPermMask',
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '{', '}', '(', ')', '[', ']',
+ '=', '+', '-', '*', '/',
+ '+=', '-=', '*=', '/=', '++', '--',
+ '!', '%', '&amp;', '|', '&amp;&amp;', '||',
+ '==', '!=', '&lt;', '&gt;', '&lt;=', '&gt;=',
+ '~', '&lt;&lt;', '&gt;&gt;', '^', ':',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #000080;',
+ 3 => 'color: #008080;',
+ 4 => 'color: #228b22;',
+ 5 => 'color: #b22222;',
+ 6 => 'color: #8b0000; background-color: #ffff00;',
+ 7 => 'color: #8b0000; background-color: #fa8072;',
+ 8 => 'color: #000000; background-color: #ba55d3;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #ff7f50; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #006400;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.lslwiki.net/lslwiki/wakka.php?wakka={FNAME}', // http://wiki.secondlife.com/wiki/{FNAME}
+ 4 => 'http://www.lslwiki.net/lslwiki/wakka.php?wakka={FNAME}', // http://wiki.secondlife.com/wiki/{FNAME}
+ 5 => 'http://www.lslwiki.net/lslwiki/wakka.php?wakka={FNAME}', // http://wiki.secondlife.com/wiki/{FNAME}
+ 6 => 'http://www.lslwiki.net/lslwiki/wakka.php?wakka={FNAME}', // http://wiki.secondlife.com/wiki/{FNAME}
+ 7 => 'http://www.lslwiki.net/lslwiki/wakka.php?wakka={FNAME}', // http://wiki.secondlife.com/wiki/{FNAME}
+ 8 => 'http://www.lslwiki.net/lslwiki/wakka.php?wakka={FNAME}', // http://wiki.secondlife.com/wiki/{FNAME}
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lua.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lua.php
new file mode 100644
index 00000000..8a09ba20
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/lua.php
@@ -0,0 +1,177 @@
+<?php
+/*************************************************************************************
+ * lua.php
+ * -------
+ * Author: Roberto Rossi (rsoftware@altervista.org)
+ * Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/07/10
+ *
+ * LUA language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/08/26 (1.0.2)
+ * - Added support for objects and methods
+ * - Removed unusable keywords
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Lua',
+ 'COMMENT_SINGLE' => array(1 => "--"),
+ 'COMMENT_MULTI' => array('--[[' => ']]'),
+ 'COMMENT_REGEXP' => array(2 => '/\[(=*)\[.*?\]\1\]/s'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[\\\\abfnrtv\'\"]#i",
+ //Octal Char Specs
+ 2 => "#\\\\\\d{1,3}#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_FLT_NONSCI | GESHI_NUMBER_FLT_NONSCI_F |
+ GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'break','do','else','elseif','end','for','function','if',
+ 'local','repeat','return','then','until','while'
+ ),
+ 2 => array(
+ 'and','in','not','or'
+ ),
+ 3 => array(
+ '_VERSION','assert','collectgarbage','dofile','error','gcinfo','loadfile','loadstring',
+ 'print','tonumber','tostring','type','unpack',
+ '_ALERT','_ERRORMESSAGE','_INPUT','_PROMPT','_OUTPUT',
+ '_STDERR','_STDIN','_STDOUT','call','dostring','foreach','foreachi','getn','globals','newtype',
+ 'rawget','rawset','require','sort','tinsert','tremove',
+ 'abs','acos','asin','atan','atan2','ceil','cos','deg','exp',
+ 'floor','format','frexp','gsub','ldexp','log','log10','max','min','mod','rad','random','randomseed',
+ 'sin','sqrt','strbyte','strchar','strfind','strlen','strlower','strrep','strsub','strupper','tan',
+ 'openfile','closefile','readfrom','writeto','appendto',
+ 'remove','rename','flush','seek','tmpfile','tmpname','read','write',
+ 'clock','date','difftime','execute','exit','getenv','setlocale','time',
+ '_G','getfenv','getmetatable','ipairs','loadlib','next','pairs','pcall',
+ 'rawegal','setfenv','setmetatable','xpcall',
+ 'string.byte','string.char','string.dump','string.find','string.len',
+ 'string.lower','string.rep','string.sub','string.upper','string.format','string.gfind','string.gsub',
+ 'table.concat','table.foreach','table.foreachi','table.getn','table.sort','table.insert','table.remove','table.setn',
+ 'math.abs','math.acos','math.asin','math.atan','math.atan2','math.ceil','math.cos','math.deg','math.exp',
+ 'math.floor','math.frexp','math.ldexp','math.log','math.log10','math.max','math.min','math.mod',
+ 'math.pi','math.rad','math.random','math.randomseed','math.sin','math.sqrt','math.tan',
+ 'coroutine.create','coroutine.resume','coroutine.status',
+ 'coroutine.wrap','coroutine.yield',
+ 'io.close','io.flush','io.input','io.lines','io.open','io.output','io.read','io.tmpfile','io.type','io.write',
+ 'io.stdin','io.stdout','io.stderr',
+ 'os.clock','os.date','os.difftime','os.execute','os.exit','os.getenv','os.remove','os.rename',
+ 'os.setlocale','os.time','os.tmpname',
+ 'string','table','math','coroutine','io','os','debug'
+ ),
+ 4 => array(
+ 'nil', 'false', 'true'
+ ),
+ 5 => array(
+ 'Nil', 'Boolean', 'Number', 'String', 'Userdata', 'Thread', 'Table'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '+', '-', '*', '/', '%', '^', '#',
+ '==', '~=', '<=', '>=', '<', '>', '=',
+ '(', ')', '{', '}', '[', ']',
+ ';', ':', ',', '.', '..', '...'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #aa9900; font-weight: bold;',
+ 2 => 'color: #aa9900; font-weight: bold;',
+ 3 => 'color: #0000aa;',
+ 4 => 'color: #aa9900;',
+ 5 => 'color: #aa9900;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #ff0000;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff6666;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #aa9900;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/m68k.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/m68k.php
new file mode 100644
index 00000000..98321577
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/m68k.php
@@ -0,0 +1,143 @@
+<?php
+/*************************************************************************************
+ * m68k.php
+ * --------
+ * Author: Benny Baumann (BenBE@omorphia.de)
+ * Copyright: (c) 2007 Benny Baumann (http://www.omorphia.de/), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/02/06
+ *
+ * Motorola 68000 Assembler language file for GeSHi.
+ *
+ * Syntax definition as commonly used by the motorola documentation for the
+ * MC68HC908GP32 Microcontroller (and maybe others).
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2007/06/02 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2007/06/02)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Motorola 68000 Assembler',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /*CPU*/
+ 1 => array(
+ 'adc','add','ais','aix','and','asl','asr','bcc','bclr','bcs','beq',
+ 'bge','bgt','bhcc','bhcs','bhi','bhs','bih','bil','bit','ble','blo',
+ 'bls','blt','bmc','bmi','bms','bne','bpl','bra','brclr','brn',
+ 'brset','bset','bsr','cbeq','clc','cli','clr','cmp','com','cphx',
+ 'cpx','daa','dbnz','dec','div','eor','inc','jmp','jsr','lda','ldhx',
+ 'ldx','lsl','lsr','mov','mul','neg','nop','nsa','ora','psha','pshh',
+ 'pshx','pula','pulh','pulx','rol','ror','rsp','rti','rts','sbc',
+ 'sec','sei','sta','sthx','stop','stx','sub','swi','tap','tax','tpa',
+ 'tst','tsx','txa','txs','wait'
+ ),
+ /*registers*/
+ 2 => array(
+ 'a','h','x',
+ 'hx','sp'
+ ),
+ /*Directive*/
+ 3 => array(
+ '#define','#endif','#else','#ifdef','#ifndef','#include','#undef',
+ '.db','.dd','.df','.dq','.dt','.dw','.end','.org','equ'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff; font-weight:bold;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #46aa03; font-weight:bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #dd22dd;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #22bbff;',
+ 1 => 'color: #22bbff;',
+ 2 => 'color: #993333;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Hex numbers
+ 0 => '#?0[0-9a-fA-F]{1,32}[hH]',
+ //Binary numbers
+ 1 => '\%[01]{1,64}[bB]',
+ //Labels
+ 2 => '^[_a-zA-Z][_a-zA-Z0-9]*?\:'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/magiksf.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/magiksf.php
new file mode 100644
index 00000000..612e1603
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/magiksf.php
@@ -0,0 +1,193 @@
+<?php
+/*************************************************************************************
+ * magiksf.php
+ * --------
+ * Author: Sjoerd van Leent (svanleent@gmail.com)
+ * Copyright: (c) 2010 Sjoerd van Leent
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/02/15
+ *
+ * MagikSF language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/02/22 (1.0.0.2)
+ * - Symbols also accept the ! and ? characters properly
+ * - Labels (identifiers starting with !) are also coloured
+ * 2010/02/17 (1.0.0.1)
+ * - Parsing out symbols better
+ * - Add package identifiers
+ * 2010/02/15 (1.0.0)
+ * - First Release
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'ESCAPE_CHAR' => null,
+ 'LANG_NAME' => 'MagikSF',
+ 'COMMENT_SINGLE' => array(1 => '##', 2 => '#%', 3 => '#'),
+ 'COMMENT_MULTI' => array("_pragma(" => ")"),
+ //Multiline-continued single-line comments
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ '_block', '_endblock', '_proc', '_endproc', '_loop', '_endloop',
+ '_method', '_endmethod',
+ '_protect', '_endprotect', '_protection', '_locking',
+ '_continue',
+ ),
+ 2 => array(
+ '_self', '_thisthread', '_pragma', '_private', '_abstract',
+ '_local', '_global', '_dynamic', '_package', '_constant',
+ '_import', '_iter', '_lock', '_optional', '_recursive', '_super'
+ ),
+ 3 => array(
+ '_if', '_endif', '_then', '_else', '_elif', '_orif', '_andif', '_for', '_over',
+ '_try', '_endtry', '_when', '_throw', '_catch', '_endcatch', '_handling',
+ '_finally', '_loopbody', '_return', '_leave', '_with'
+ ),
+ 4 => array(
+ '_false', '_true', '_maybe', '_unset', '_no_way'
+ ),
+ 5 => array(
+ '_mod', '_div', '_or', '_and', '_cf', '_is', '_isnt', '_not', '_gather', '_scatter',
+ '_allresults', '_clone', '_xor'
+ ),
+ 6 => array(
+ 'def_slotted_exemplar', 'write_string', 'write', 'condition',
+ 'record_transaction', 'gis_program_manager', 'perform', 'define_shared_constant',
+ 'property_list', 'rope', 'def_property', 'def_mixin'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']',
+ '+', '-', '*', '/', '**',
+ '=', '<', '>', '<<', '>>',
+ ',', '$',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #ff3f3f;',
+ 3 => 'color: #3f7f3f; font-weight: bold;',
+ 4 => 'color: #cc66cc;',
+ 5 => 'color: #ff3fff; font-weight: bold;',
+ 6 => 'font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #339933; font-weight: bold;',
+ 2 => 'color: #993333;',
+ 3 => 'color: #339933;',
+ 'MULTI' => 'color: #7f7f7f; font-style: italic',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #ff3f3f;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #ff3f3f;'
+ ),
+ 'REGEXPS' => array(
+ 1 => 'color: #3f3fff;',
+ 2 => 'color: #3f3fff;',
+ 3 => 'color: #cc66cc;',
+ 4 => 'color: #7f3f7f; font-style: italic;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ 1 => array(
+ GESHI_SEARCH => '\b[a-zA-Z0-9_]+:', // package identifiers
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 2 => array(
+ GESHI_SEARCH => ':(?:[a-zA-Z0-9!?_]+|(?:[<pipe>].*?[<pipe>]))*', //symbols
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 3 => array(
+ GESHI_SEARCH => '%space|%tab|%newline|%.', //characters
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 4 => array(
+ GESHI_SEARCH => '@(?:[a-zA-Z0-9!?_]+|(?:[<pipe>].*?[<pipe>]))*', //symbols
+ GESHI_REPLACE => '\\0',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/make.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/make.php
new file mode 100644
index 00000000..885fa176
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/make.php
@@ -0,0 +1,151 @@
+<?php
+/*************************************************************************************
+ * make.php
+ * --------
+ * Author: Neil Bird <phoenix@fnxweb.com>
+ * Copyright: (c) 2008 Neil Bird
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/08/26
+ *
+ * make language file for GeSHi.
+ *
+ * (GNU make specific)
+ *
+ * CHANGES
+ * -------
+ * 2008/09/05 (1.0.0)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'GNU make',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_REGEXP' => array(
+ //Escaped String Starters
+ 2 => "/\\\\['\"]/siU"
+ ),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ // core
+ 'ifeq', 'else', 'endif', 'ifneq', 'ifdef', 'ifndef',
+ 'include', 'vpath', 'export', 'unexport', 'override',
+ 'info', 'warning', 'error'
+ ),
+ 2 => array(
+ // macros, literals
+ '.SUFFIXES', '.PHONY', '.DEFAULT', '.PRECIOUS', '.IGNORE', '.SILENT', '.EXPORT_ALL_VARIABLES', '.KEEP_STATE',
+ '.LIBPATTERNS', '.NOTPARALLEL', '.DELETE_ON_ERROR', '.INTERMEDIATE', '.POSIX', '.SECONDARY'
+ ),
+ /*
+ 3 => array(
+ // funcs - see regex
+ //'subst', 'addprefix', 'addsuffix', 'basename', 'call', 'dir', 'error', 'eval', 'filter-out', 'filter',
+ //'findstring', 'firstword', 'foreach', 'if', 'join', 'notdir', 'origin', 'patsubst', 'shell', 'sort', 'strip',
+ //'suffix', 'warning', 'wildcard', 'word', 'wordlist', 'words'
+ )*/
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}',
+ '!', '@', '%', '&', '|', '/',
+ '<', '>',
+ '=', '-', '+', '*',
+ '.', ':', ',', ';',
+ '$'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ //3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #666622; font-weight: bold;',
+ 2 => 'color: #990000;',
+ //3 => 'color: #000000; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #339900; font-style: italic;',
+ 2 => 'color: #000099; font-weight: bold;',
+ 'MULTI' => ''
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array( # keep same as symbols so as to make ${} and $() equiv.
+ 0 => 'color: #004400;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #CC2200;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #CC2200;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #004400;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #000088; font-weight: bold;',
+ 1 => 'color: #0000CC; font-weight: bold;',
+ 2 => 'color: #000088;'
+ ),
+ 'SCRIPT' => array(),
+ 'METHODS' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ //3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(
+ //Simple variables
+ 0 => "\\$(?:[^{(&]|&(?:amp|lt|gt);)",
+ //Complex variables/functions [built-ins]
+ 1 => array(
+ GESHI_SEARCH => '(\\$[({])(subst|addprefix|addsuffix|basename|call|dir|error|eval|filter-out|filter,|findstring|firstword|foreach|if|join|notdir|origin|patsubst|shell|sort|strip,|suffix|warning|wildcard|word|wordlist|words)([ })])',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+ //Complex variables/functions [others]
+ 2 => array(
+ GESHI_SEARCH => '(\\$[({])([A-Za-z_][A-Za-z_0-9]*)([ })])',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'TAB_WIDTH' => 8
+// vim: set sw=4 sts=4 :
+);
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mapbasic.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mapbasic.php
new file mode 100644
index 00000000..8859c483
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mapbasic.php
@@ -0,0 +1,908 @@
+<?php
+/*************************************************************************************
+ * mapbasic.php
+ * ------
+ * Author: Tomasz Berus (t.berus@gisodkuchni.pl)
+ * Copyright: (c) 2009 Tomasz Berus (http://sourceforge.net/projects/mbsyntax/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/11/25
+ *
+ * MapBasic language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/09/17 (1.0.1)
+ * - Replaced all tabs with spaces
+ * - Fixed 'URLS' array
+ * 2008/11/25 (1.0.0)
+ * - First Release (MapBasic v9.5)
+ *
+ * TODO (updated 2008/11/25)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'MapBasic',
+ 'COMMENT_SINGLE' => array(1 => "'"),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+/*
+ 1 - Statements + Clauses + Data Types + Logical Operators, Geographical Operators + SQL
+ 2 - Special Procedures
+ 3 - Functions
+ 4 - Constants
+ 5 - Extended keywords (case sensitive)
+*/
+ 1 => array(
+ 'Add', 'Alias', 'All', 'Alter', 'And', 'Any', 'Application', 'Arc',
+ 'Area', 'As', 'AutoLabel', 'Bar', 'Beep', 'Begin', 'Bind',
+ 'Browse', 'Brush', 'BrushPicker', 'Button', 'ButtonPad',
+ 'ButtonPads', 'BY', 'Call', 'CancelButton', 'Cartographic', 'Case',
+ 'CharSet', 'Check', 'CheckBox', 'Clean', 'Close', 'Collection',
+ 'Column', 'Combine', 'Command', 'Commit', 'Connection',
+ 'ConnectionNumber', 'Contains', 'Continue', 'Control', 'CoordSys',
+ 'Create', 'Cutter', 'Date', 'Datum', 'DDEExecute', 'DDEPoke',
+ 'DDETerminate', 'DDETerminateAll', 'Declare', 'Default', 'Define',
+ 'Delete', 'Dialog', 'Digitizer', 'Dim', 'Disaggregate',
+ 'Disconnect', 'Distance', 'Do', 'Document', 'DocumentWindow',
+ 'Drag', 'Drop', 'EditText', 'Ellipse', 'Enclose', 'End', 'Entire',
+ 'Entirely', 'Erase', 'Error', 'Event', 'Exit', 'Export',
+ 'Farthest', 'Fetch', 'File', 'Find', 'Float', 'FME', 'Font',
+ 'FontPicker', 'For', 'Format', 'Frame', 'From', 'Function',
+ 'Geocode', 'Get', 'Global', 'Goto', 'Graph', 'Grid', 'GROUP',
+ 'GroupBox', 'Handler', 'If', 'Import', 'In', 'Include', 'Index',
+ 'Info', 'Input', 'Insert', 'Integer', 'Intersect', 'Intersects',
+ 'INTO', 'Isogram', 'Item', 'Kill', 'Layout', 'Legend', 'Line',
+ 'Link', 'ListBox', 'Logical', 'Loop', 'Map', 'Map3D', 'MapInfo',
+ 'MapInfoDialog', 'Menu', 'Merge', 'Metadata', 'Method', 'Mod',
+ 'Move', 'MultiListBox', 'MultiPoint', 'MWS', 'Nearest', 'Next',
+ 'NOSELECT', 'Not', 'Note', 'Object', 'Objects', 'Offset',
+ 'OKButton', 'OnError', 'Open', 'Or', 'ORDER', 'Overlay', 'Pack',
+ 'Paper', 'Part', 'Partly', 'Pen', 'PenPicker', 'Pline', 'Point',
+ 'PopupMenu', 'Preserve', 'Print', 'PrintWin', 'PrismMap',
+ 'Processing', 'Program', 'ProgressBar', 'ProgressBars', 'Put',
+ 'RadioGroup', 'Randomize', 'Ranges', 'Rect', 'ReDim',
+ 'Redistricter', 'Refresh', 'Region', 'Register', 'Relief',
+ 'Reload', 'Remove', 'Rename', 'Report', 'Reproject', 'Resolution',
+ 'Resume', 'Rollback', 'RoundRect', 'RowID', 'Run', 'Save', 'Seek',
+ 'Select', 'Selection', 'Server', 'Set', 'Shade', 'SmallInt',
+ 'Snap', 'Split', 'StaticText', 'StatusBar', 'Stop', 'String',
+ 'Style', 'Styles', 'Sub', 'Symbol', 'SymbolPicker', 'Symbols',
+ 'Table', 'Target', 'Terminate', 'Text', 'Then', 'Threshold',
+ 'Timeout', 'To', 'Transaction', 'Transform', 'Type', 'UnDim',
+ 'Units', 'Unlink', 'Update', 'Using', 'VALUES', 'Version',
+ 'Versioning', 'Wend', 'WFS', 'WHERE', 'While', 'Window', 'Within',
+ 'Workspace', 'Write'
+ ),
+ 2 => array(
+ 'EndHandler', 'ForegroundTaskSwitchHandler', 'Main',
+ 'RemoteMapGenHandler', 'RemoteMsgHandler', 'SelChangedHandler',
+ 'ToolHandler', 'WinChangedHandler', 'WinClosedHandler',
+ 'WinFocusChangedHandler'
+ ),
+ 3 => array(
+ 'Abs', 'Acos', 'ApplicationDirectory$', 'AreaOverlap', 'Asc',
+ 'Asin', 'Ask', 'Atn', 'Avg', 'Buffer', 'ButtonPadInfo',
+ 'CartesianArea', 'CartesianBuffer', 'CartesianConnectObjects',
+ 'CartesianDistance', 'CartesianObjectDistance',
+ 'CartesianObjectLen', 'CartesianOffset', 'CartesianOffsetXY',
+ 'CartesianPerimeter', 'Centroid', 'CentroidX', 'CentroidY',
+ 'ChooseProjection$', 'Chr$', 'ColumnInfo', 'CommandInfo',
+ 'ConnectObjects', 'ControlPointInfo', 'ConvertToPline',
+ 'ConvertToRegion', 'ConvexHull', 'CoordSysName$', 'Cos', 'Count',
+ 'CreateCircle', 'CreateLine', 'CreatePoint', 'CreateText',
+ 'CurDate', 'CurrentBorderPen', 'CurrentBrush', 'CurrentFont',
+ 'CurrentLinePen', 'CurrentPen', 'CurrentSymbol', 'DateWindow',
+ 'Day', 'DDEInitiate', 'DDERequest$', 'DeformatNumber$', 'EOF',
+ 'EOT', 'EPSGToCoordSysString$', 'Err', 'Error$', 'Exp',
+ 'ExtractNodes', 'FileAttr', 'FileExists', 'FileOpenDlg',
+ 'FileSaveAsDlg', 'Fix', 'Format$', 'FormatDate$', 'FormatNumber$',
+ 'FrontWindow', 'GeocodeInfo', 'GetFolderPath$', 'GetGridCellValue',
+ 'GetMetadata$', 'GetSeamlessSheet', 'GridTableInfo',
+ 'HomeDirectory$', 'InStr', 'Int', 'IntersectNodes',
+ 'IsGridCellNull', 'IsogramInfo', 'IsPenWidthPixels',
+ 'LabelFindByID', 'LabelFindFirst', 'LabelFindNext', 'LabelInfo',
+ 'LayerInfo', 'LCase$', 'Left$', 'LegendFrameInfo', 'LegendInfo',
+ 'LegendStyleInfo', 'Len', 'Like', 'LocateFile$', 'LOF', 'Log',
+ 'LTrim$', 'MakeBrush', 'MakeCustomSymbol', 'MakeFont',
+ 'MakeFontSymbol', 'MakePen', 'MakeSymbol', 'Map3DInfo',
+ 'MapperInfo', 'Max', 'Maximum', 'MBR', 'MenuItemInfoByHandler',
+ 'MenuItemInfoByID', 'MGRSToPoint', 'MICloseContent',
+ 'MICloseFtpConnection', 'MICloseFtpFileFind',
+ 'MICloseHttpConnection', 'MICloseHttpFile', 'MICloseSession',
+ 'MICreateSession', 'MICreateSessionFull', 'Mid$', 'MidByte$',
+ 'MIErrorDlg', 'MIFindFtpFile', 'MIFindNextFtpFile', 'MIGetContent',
+ 'MIGetContentBuffer', 'MIGetContentLen', 'MIGetContentString',
+ 'MIGetContentToFile', 'MIGetContentType',
+ 'MIGetCurrentFtpDirectory', 'MIGetErrorCode', 'MIGetErrorMessage',
+ 'MIGetFileURL', 'MIGetFtpConnection', 'MIGetFtpFile',
+ 'MIGetFtpFileFind', 'MIGetFtpFileName', 'MIGetHttpConnection',
+ 'MIIsFtpDirectory', 'MIIsFtpDots', 'Min', 'Minimum',
+ 'MIOpenRequest', 'MIOpenRequestFull', 'MIParseURL', 'MIPutFtpFile',
+ 'MIQueryInfo', 'MIQueryInfoStatusCode', 'MISaveContent',
+ 'MISendRequest', 'MISendSimpleRequest', 'MISetCurrentFtpDirectory',
+ 'MISetSessionTimeout', 'MIXmlAttributeListDestroy',
+ 'MIXmlDocumentCreate', 'MIXmlDocumentDestroy',
+ 'MIXmlDocumentGetNamespaces', 'MIXmlDocumentGetRootNode',
+ 'MIXmlDocumentLoad', 'MIXmlDocumentLoadXML',
+ 'MIXmlDocumentLoadXMLString', 'MIXmlDocumentSetProperty',
+ 'MIXmlGetAttributeList', 'MIXmlGetChildList',
+ 'MIXmlGetNextAttribute', 'MIXmlGetNextNode', 'MIXmlNodeDestroy',
+ 'MIXmlNodeGetAttributeValue', 'MIXmlNodeGetFirstChild',
+ 'MIXmlNodeGetName', 'MIXmlNodeGetParent', 'MIXmlNodeGetText',
+ 'MIXmlNodeGetValue', 'MIXmlNodeListDestroy', 'MIXmlSCDestroy',
+ 'MIXmlSCGetLength', 'MIXmlSCGetNamespace', 'MIXmlSelectNodes',
+ 'MIXmlSelectSingleNode', 'Month', 'NumAllWindows', 'NumberToDate',
+ 'NumCols', 'NumTables', 'NumWindows', 'ObjectDistance',
+ 'ObjectGeography', 'ObjectInfo', 'ObjectLen', 'ObjectNodeHasM',
+ 'ObjectNodeHasZ', 'ObjectNodeM', 'ObjectNodeX', 'ObjectNodeY',
+ 'ObjectNodeZ', 'OffsetXY', 'Overlap', 'OverlayNodes',
+ 'PathToDirectory$', 'PathToFileName$', 'PathToTableName$',
+ 'PenWidthToPoints', 'Perimeter', 'PointsToPenWidth',
+ 'PointToMGRS$', 'PrismMapInfo', 'ProgramDirectory$', 'Proper$',
+ 'ProportionOverlap', 'RasterTableInfo', 'ReadControlValue',
+ 'RegionInfo', 'RemoteQueryHandler', 'RGB', 'Right$', 'Rnd',
+ 'Rotate', 'RotateAtPoint', 'Round', 'RTrim$', 'SearchInfo',
+ 'SearchPoint', 'SearchRect', 'SelectionInfo', 'Server_ColumnInfo',
+ 'Server_Connect', 'Server_ConnectInfo', 'Server_DriverInfo',
+ 'Server_EOT', 'Server_Execute', 'Server_GetODBCHConn',
+ 'Server_GetODBCHStmt', 'Server_NumCols', 'Server_NumDrivers',
+ 'SessionInfo', 'Sgn', 'Sin', 'Space$', 'SphericalArea',
+ 'SphericalConnectObjects', 'SphericalDistance',
+ 'SphericalObjectDistance', 'SphericalObjectLen', 'SphericalOffset',
+ 'SphericalOffsetXY', 'SphericalPerimeter', 'Sqr', 'Str$',
+ 'String$', 'StringCompare', 'StringCompareIntl', 'StringToDate',
+ 'StyleAttr', 'Sum', 'SystemInfo', 'TableInfo', 'Tan',
+ 'TempFileName$', 'TextSize', 'Time', 'Timer', 'TriggerControl',
+ 'TrueFileName$', 'UBound', 'UCase$', 'UnitAbbr$', 'UnitName$',
+ 'Val', 'Weekday', 'WindowID', 'WindowInfo', 'WtAvg', 'Year'
+ ),
+ 4 => array(
+ 'BLACK', 'BLUE', 'BRUSH_BACKCOLOR', 'BRUSH_FORECOLOR',
+ 'BRUSH_PATTERN', 'BTNPAD_INFO_FLOATING', 'BTNPAD_INFO_NBTNS',
+ 'BTNPAD_INFO_WIDTH', 'BTNPAD_INFO_WINID', 'BTNPAD_INFO_X',
+ 'BTNPAD_INFO_Y', 'CLS', 'CMD_INFO_CTRL', 'CMD_INFO_CUSTOM_OBJ',
+ 'CMD_INFO_DLG_DBL', 'CMD_INFO_DLG_OK', 'CMD_INFO_EDIT_ASK',
+ 'CMD_INFO_EDIT_DISCARD', 'CMD_INFO_EDIT_SAVE',
+ 'CMD_INFO_EDIT_STATUS', 'CMD_INFO_EDIT_TABLE', 'CMD_INFO_FIND_RC',
+ 'CMD_INFO_FIND_ROWID', 'CMD_INFO_HL_FILE_NAME',
+ 'CMD_INFO_HL_LAYER_ID', 'CMD_INFO_HL_ROWID',
+ 'CMD_INFO_HL_TABLE_NAME', 'CMD_INFO_HL_WINDOW_ID',
+ 'CMD_INFO_INTERRUPT', 'CMD_INFO_MENUITEM', 'CMD_INFO_MSG',
+ 'CMD_INFO_ROWID', 'CMD_INFO_SELTYPE', 'CMD_INFO_SHIFT',
+ 'CMD_INFO_STATUS', 'CMD_INFO_TASK_SWITCH', 'CMD_INFO_TOOLBTN',
+ 'CMD_INFO_WIN', 'CMD_INFO_X', 'CMD_INFO_X2', 'CMD_INFO_XCMD',
+ 'CMD_INFO_Y', 'CMD_INFO_Y2', 'COL_INFO_DECPLACES',
+ 'COL_INFO_EDITABLE', 'COL_INFO_INDEXED', 'COL_INFO_NAME',
+ 'COL_INFO_NUM', 'COL_INFO_TYPE', 'COL_INFO_WIDTH', 'COL_TYPE_CHAR',
+ 'COL_TYPE_DATE', 'COL_TYPE_DATETIME', 'COL_TYPE_DECIMAL',
+ 'COL_TYPE_FLOAT', 'COL_TYPE_GRAPHIC', 'COL_TYPE_INTEGER',
+ 'COL_TYPE_LOGICAL', 'COL_TYPE_SMALLINT', 'COL_TYPE_TIME', 'CYAN',
+ 'DATE_WIN_CURPROG', 'DATE_WIN_SESSION', 'DEG_2_RAD',
+ 'DICTIONARY_ADDRESS_ONLY', 'DICTIONARY_ALL',
+ 'DICTIONARY_PREFER_ADDRESS', 'DICTIONARY_PREFER_USER',
+ 'DICTIONARY_USER_ONLY', 'DM_CUSTOM_CIRCLE', 'DM_CUSTOM_ELLIPSE',
+ 'DM_CUSTOM_LINE', 'DM_CUSTOM_POINT', 'DM_CUSTOM_POLYGON',
+ 'DM_CUSTOM_POLYLINE', 'DM_CUSTOM_RECT', 'DMPAPER_10X11',
+ 'DMPAPER_10X14', 'DMPAPER_11X17', 'DMPAPER_12X11', 'DMPAPER_15X11',
+ 'DMPAPER_9X11', 'DMPAPER_A_PLUS', 'DMPAPER_A2', 'DMPAPER_A3',
+ 'DMPAPER_A3_EXTRA', 'DMPAPER_A3_EXTRA_TRANSVERSE',
+ 'DMPAPER_A3_ROTATED', 'DMPAPER_A3_TRANSVERSE', 'DMPAPER_A4',
+ 'DMPAPER_A4_EXTRA', 'DMPAPER_A4_PLUS', 'DMPAPER_A4_ROTATED',
+ 'DMPAPER_A4_TRANSVERSE', 'DMPAPER_A4SMALL', 'DMPAPER_A5',
+ 'DMPAPER_A5_EXTRA', 'DMPAPER_A5_ROTATED', 'DMPAPER_A5_TRANSVERSE',
+ 'DMPAPER_A6', 'DMPAPER_A6_ROTATED', 'DMPAPER_B_PLUS', 'DMPAPER_B4',
+ 'DMPAPER_B4_JIS_ROTATED', 'DMPAPER_B5', 'DMPAPER_B5_EXTRA',
+ 'DMPAPER_B5_JIS_ROTATED', 'DMPAPER_B5_TRANSVERSE',
+ 'DMPAPER_B6_JIS', 'DMPAPER_B6_JIS_ROTATED', 'DMPAPER_CSHEET',
+ 'DMPAPER_DBL_JAPANESE_POSTCARD',
+ 'DMPAPER_DBL_JAPANESE_POSTCARD_ROTATED', 'DMPAPER_DSHEET',
+ 'DMPAPER_ENV_10', 'DMPAPER_ENV_11', 'DMPAPER_ENV_12',
+ 'DMPAPER_ENV_14', 'DMPAPER_ENV_9', 'DMPAPER_ENV_B4',
+ 'DMPAPER_ENV_B5', 'DMPAPER_ENV_B6', 'DMPAPER_ENV_C3',
+ 'DMPAPER_ENV_C4', 'DMPAPER_ENV_C5', 'DMPAPER_ENV_C6',
+ 'DMPAPER_ENV_C65', 'DMPAPER_ENV_DL', 'DMPAPER_ENV_INVITE',
+ 'DMPAPER_ENV_ITALY', 'DMPAPER_ENV_MONARCH', 'DMPAPER_ENV_PERSONAL',
+ 'DMPAPER_ESHEET', 'DMPAPER_EXECUTIVE',
+ 'DMPAPER_FANFOLD_LGL_GERMAN', 'DMPAPER_FANFOLD_STD_GERMAN',
+ 'DMPAPER_FANFOLD_US', 'DMPAPER_FIRST', 'DMPAPER_FOLIO',
+ 'DMPAPER_ISO_B4', 'DMPAPER_JAPANESE_POSTCARD',
+ 'DMPAPER_JAPANESE_POSTCARD_ROTATED', 'DMPAPER_JENV_CHOU3',
+ 'DMPAPER_JENV_CHOU3_ROTATED', 'DMPAPER_JENV_CHOU4',
+ 'DMPAPER_JENV_CHOU4_ROTATED', 'DMPAPER_JENV_KAKU2',
+ 'DMPAPER_JENV_KAKU2_ROTATED', 'DMPAPER_JENV_KAKU3',
+ 'DMPAPER_JENV_KAKU3_ROTATED', 'DMPAPER_JENV_YOU4',
+ 'DMPAPER_JENV_YOU4_ROTATED', 'DMPAPER_LEDGER', 'DMPAPER_LEGAL',
+ 'DMPAPER_LEGAL_EXTRA', 'DMPAPER_LETTER', 'DMPAPER_LETTER_EXTRA',
+ 'DMPAPER_LETTER_EXTRA_TRANSVERSE', 'DMPAPER_LETTER_PLUS',
+ 'DMPAPER_LETTER_ROTATED', 'DMPAPER_LETTER_TRANSVERSE',
+ 'DMPAPER_LETTERSMALL', 'DMPAPER_NOTE', 'DMPAPER_P16K',
+ 'DMPAPER_P16K_ROTATED', 'DMPAPER_P32K', 'DMPAPER_P32K_ROTATED',
+ 'DMPAPER_P32KBIG', 'DMPAPER_P32KBIG_ROTATED', 'DMPAPER_PENV_1',
+ 'DMPAPER_PENV_1_ROTATED', 'DMPAPER_PENV_10',
+ 'DMPAPER_PENV_10_ROTATED', 'DMPAPER_PENV_2',
+ 'DMPAPER_PENV_2_ROTATED', 'DMPAPER_PENV_3',
+ 'DMPAPER_PENV_3_ROTATED', 'DMPAPER_PENV_4',
+ 'DMPAPER_PENV_4_ROTATED', 'DMPAPER_PENV_5',
+ 'DMPAPER_PENV_5_ROTATED', 'DMPAPER_PENV_6',
+ 'DMPAPER_PENV_6_ROTATED', 'DMPAPER_PENV_7',
+ 'DMPAPER_PENV_7_ROTATED', 'DMPAPER_PENV_8',
+ 'DMPAPER_PENV_8_ROTATED', 'DMPAPER_PENV_9',
+ 'DMPAPER_PENV_9_ROTATED', 'DMPAPER_QUARTO', 'DMPAPER_RESERVED_48',
+ 'DMPAPER_RESERVED_49', 'DMPAPER_STATEMENT', 'DMPAPER_TABLOID',
+ 'DMPAPER_TABLOID_EXTRA', 'DMPAPER_USER', 'ERR_BAD_WINDOW',
+ 'ERR_BAD_WINDOW_NUM', 'ERR_CANT_ACCESS_FILE',
+ 'ERR_CANT_INITIATE_LINK', 'ERR_CMD_NOT_SUPPORTED',
+ 'ERR_FCN_ARG_RANGE', 'ERR_FCN_INVALID_FMT',
+ 'ERR_FCN_OBJ_FETCH_FAILED', 'ERR_FILEMGR_NOTOPEN',
+ 'ERR_FP_MATH_LIB_DOMAIN', 'ERR_FP_MATH_LIB_RANGE',
+ 'ERR_INVALID_CHANNEL', 'ERR_INVALID_READ_CONTROL',
+ 'ERR_INVALID_TRIG_CONTROL', 'ERR_NO_FIELD',
+ 'ERR_NO_RESPONSE_FROM_APP', 'ERR_NULL_SELECTION',
+ 'ERR_PROCESS_FAILED_IN_APP', 'ERR_TABLE_NOT_FOUND',
+ 'ERR_WANT_MAPPER_WIN', 'FALSE', 'FILE_ATTR_FILESIZE',
+ 'FILE_ATTR_MODE', 'FILTER_ALL_DIRECTIONS_1',
+ 'FILTER_ALL_DIRECTIONS_2', 'FILTER_DIAGONALLY',
+ 'FILTER_HORIZONTALLY', 'FILTER_VERTICALLY',
+ 'FILTER_VERTICALLY_AND_HORIZONTALLY', 'FOLDER_APPDATA',
+ 'FOLDER_COMMON_APPDATA', 'FOLDER_COMMON_DOCS',
+ 'FOLDER_LOCAL_APPDATA', 'FOLDER_MI_APPDATA',
+ 'FOLDER_MI_COMMON_APPDATA', 'FOLDER_MI_LOCAL_APPDATA',
+ 'FOLDER_MI_PREFERENCE', 'FOLDER_MYDOCS', 'FOLDER_MYPICS',
+ 'FONT_BACKCOLOR', 'FONT_FORECOLOR', 'FONT_NAME', 'FONT_POINTSIZE',
+ 'FONT_STYLE', 'FRAME_INFO_BORDER_PEN', 'FRAME_INFO_COLUMN',
+ 'FRAME_INFO_HEIGHT', 'FRAME_INFO_LABEL', 'FRAME_INFO_MAP_LAYER_ID',
+ 'FRAME_INFO_NUM_STYLES', 'FRAME_INFO_POS_X', 'FRAME_INFO_POS_Y',
+ 'FRAME_INFO_REFRESHABLE', 'FRAME_INFO_SUBTITLE',
+ 'FRAME_INFO_SUBTITLE_FONT', 'FRAME_INFO_TITLE',
+ 'FRAME_INFO_TITLE_FONT', 'FRAME_INFO_TYPE', 'FRAME_INFO_VISIBLE',
+ 'FRAME_INFO_WIDTH', 'FRAME_TYPE_STYLE', 'FRAME_TYPE_THEME',
+ 'GEO_CONTROL_POINT_X', 'GEO_CONTROL_POINT_Y', 'GEOCODE_BATCH_SIZE',
+ 'GEOCODE_COUNT_GEOCODED', 'GEOCODE_COUNT_NOTGEOCODED',
+ 'GEOCODE_COUNTRY_SUBDIVISION', 'GEOCODE_COUNTRY_SUBDIVISION2',
+ 'GEOCODE_DICTIONARY', 'GEOCODE_FALLBACK_GEOGRAPHIC',
+ 'GEOCODE_FALLBACK_POSTAL', 'GEOCODE_MAX_BATCH_SIZE',
+ 'GEOCODE_MIXED_CASE', 'GEOCODE_MUNICIPALITY',
+ 'GEOCODE_MUNICIPALITY2', 'GEOCODE_OFFSET_CENTER',
+ 'GEOCODE_OFFSET_CENTER_UNITS', 'GEOCODE_OFFSET_END',
+ 'GEOCODE_OFFSET_END_UNITS', 'GEOCODE_PASSTHROUGH',
+ 'GEOCODE_POSTAL_CODE', 'GEOCODE_RESULT_MARK_MULTIPLE',
+ 'GEOCODE_STREET_NAME', 'GEOCODE_STREET_NUMBER',
+ 'GEOCODE_UNABLE_TO_CONVERT_DATA', 'GREEN',
+ 'GRID_TAB_INFO_HAS_HILLSHADE', 'GRID_TAB_INFO_MAX_VALUE',
+ 'GRID_TAB_INFO_MIN_VALUE', 'HOTLINK_INFO_ENABLED',
+ 'HOTLINK_INFO_EXPR', 'HOTLINK_INFO_MODE', 'HOTLINK_INFO_RELATIVE',
+ 'HOTLINK_MODE_BOTH', 'HOTLINK_MODE_LABEL', 'HOTLINK_MODE_OBJ',
+ 'IMAGE_CLASS_BILEVEL', 'IMAGE_CLASS_GREYSCALE',
+ 'IMAGE_CLASS_PALETTE', 'IMAGE_CLASS_RGB', 'IMAGE_TYPE_GRID',
+ 'IMAGE_TYPE_RASTER', 'INCL_ALL', 'INCL_COMMON', 'INCL_CROSSINGS',
+ 'ISOGRAM_AMBIENT_SPEED_DIST_UNIT',
+ 'ISOGRAM_AMBIENT_SPEED_TIME_UNIT', 'ISOGRAM_BANDING',
+ 'ISOGRAM_BATCH_SIZE', 'ISOGRAM_DEFAULT_AMBIENT_SPEED',
+ 'ISOGRAM_MAJOR_POLYGON_ONLY', 'ISOGRAM_MAJOR_ROADS_ONLY',
+ 'ISOGRAM_MAX_BANDS', 'ISOGRAM_MAX_BATCH_SIZE',
+ 'ISOGRAM_MAX_DISTANCE', 'ISOGRAM_MAX_DISTANCE_UNITS',
+ 'ISOGRAM_MAX_OFFROAD_DIST', 'ISOGRAM_MAX_OFFROAD_DIST_UNITS',
+ 'ISOGRAM_MAX_TIME', 'ISOGRAM_MAX_TIME_UNITS',
+ 'ISOGRAM_POINTS_ONLY', 'ISOGRAM_PROPAGATION_FACTOR',
+ 'ISOGRAM_RECORDS_INSERTED', 'ISOGRAM_RECORDS_NOTINSERTED',
+ 'ISOGRAM_RETURN_HOLES', 'ISOGRAM_SIMPLIFICATION_FACTOR',
+ 'LABEL_INFO_ANCHORX', 'LABEL_INFO_ANCHORY', 'LABEL_INFO_DRAWN',
+ 'LABEL_INFO_EDIT', 'LABEL_INFO_EDIT_ANCHOR',
+ 'LABEL_INFO_EDIT_ANGLE', 'LABEL_INFO_EDIT_FONT',
+ 'LABEL_INFO_EDIT_OFFSET', 'LABEL_INFO_EDIT_PEN',
+ 'LABEL_INFO_EDIT_POSITION', 'LABEL_INFO_EDIT_TEXT',
+ 'LABEL_INFO_EDIT_TEXTARROW', 'LABEL_INFO_EDIT_TEXTLINE',
+ 'LABEL_INFO_EDIT_VISIBILITY', 'LABEL_INFO_OBJECT',
+ 'LABEL_INFO_OFFSET', 'LABEL_INFO_ORIENTATION',
+ 'LABEL_INFO_POSITION', 'LABEL_INFO_ROWID', 'LABEL_INFO_SELECT',
+ 'LABEL_INFO_TABLE', 'LAYER_INFO_ARROWS', 'LAYER_INFO_CENTROIDS',
+ 'LAYER_INFO_COSMETIC', 'LAYER_INFO_DISPLAY',
+ 'LAYER_INFO_DISPLAY_GLOBAL', 'LAYER_INFO_DISPLAY_GRAPHIC',
+ 'LAYER_INFO_DISPLAY_OFF', 'LAYER_INFO_DISPLAY_VALUE',
+ 'LAYER_INFO_EDITABLE', 'LAYER_INFO_HOTLINK_COUNT',
+ 'LAYER_INFO_HOTLINK_EXPR', 'LAYER_INFO_HOTLINK_MODE',
+ 'LAYER_INFO_HOTLINK_RELATIVE', 'LAYER_INFO_LABEL_ALPHA',
+ 'LAYER_INFO_LABEL_ORIENT_CURVED',
+ 'LAYER_INFO_LABEL_ORIENT_HORIZONTAL',
+ 'LAYER_INFO_LABEL_ORIENT_PARALLEL', 'LAYER_INFO_LAYER_ALPHA',
+ 'LAYER_INFO_LAYER_TRANSLUCENCY', 'LAYER_INFO_LBL_AUTODISPLAY',
+ 'LAYER_INFO_LBL_CURFONT', 'LAYER_INFO_LBL_DUPLICATES',
+ 'LAYER_INFO_LBL_EXPR', 'LAYER_INFO_LBL_FONT', 'LAYER_INFO_LBL_LT',
+ 'LAYER_INFO_LBL_LT_ARROW', 'LAYER_INFO_LBL_LT_NONE',
+ 'LAYER_INFO_LBL_LT_SIMPLE', 'LAYER_INFO_LBL_MAX',
+ 'LAYER_INFO_LBL_OFFSET', 'LAYER_INFO_LBL_ORIENTATION',
+ 'LAYER_INFO_LBL_OVERLAP', 'LAYER_INFO_LBL_PARALLEL',
+ 'LAYER_INFO_LBL_PARTIALSEGS', 'LAYER_INFO_LBL_POS',
+ 'LAYER_INFO_LBL_POS_BC', 'LAYER_INFO_LBL_POS_BL',
+ 'LAYER_INFO_LBL_POS_BR', 'LAYER_INFO_LBL_POS_CC',
+ 'LAYER_INFO_LBL_POS_CL', 'LAYER_INFO_LBL_POS_CR',
+ 'LAYER_INFO_LBL_POS_TC', 'LAYER_INFO_LBL_POS_TL',
+ 'LAYER_INFO_LBL_POS_TR', 'LAYER_INFO_LBL_VIS_OFF',
+ 'LAYER_INFO_LBL_VIS_ON', 'LAYER_INFO_LBL_VIS_ZOOM',
+ 'LAYER_INFO_LBL_VISIBILITY', 'LAYER_INFO_LBL_ZOOM_MAX',
+ 'LAYER_INFO_LBL_ZOOM_MIN', 'LAYER_INFO_NAME', 'LAYER_INFO_NODES',
+ 'LAYER_INFO_OVR_BRUSH', 'LAYER_INFO_OVR_FONT',
+ 'LAYER_INFO_OVR_LINE', 'LAYER_INFO_OVR_PEN',
+ 'LAYER_INFO_OVR_SYMBOL', 'LAYER_INFO_PATH',
+ 'LAYER_INFO_SELECTABLE', 'LAYER_INFO_TYPE',
+ 'LAYER_INFO_TYPE_COSMETIC', 'LAYER_INFO_TYPE_GRID',
+ 'LAYER_INFO_TYPE_IMAGE', 'LAYER_INFO_TYPE_NORMAL',
+ 'LAYER_INFO_TYPE_THEMATIC', 'LAYER_INFO_TYPE_WMS',
+ 'LAYER_INFO_ZOOM_LAYERED', 'LAYER_INFO_ZOOM_MAX',
+ 'LAYER_INFO_ZOOM_MIN', 'LEGEND_INFO_MAP_ID',
+ 'LEGEND_INFO_NUM_FRAMES', 'LEGEND_INFO_ORIENTATION',
+ 'LEGEND_INFO_STYLE_SAMPLE_SIZE', 'LEGEND_STYLE_INFO_FONT',
+ 'LEGEND_STYLE_INFO_OBJ', 'LEGEND_STYLE_INFO_TEXT',
+ 'LOCATE_ABB_FILE', 'LOCATE_CLR_FILE', 'LOCATE_CUSTSYMB_DIR',
+ 'LOCATE_DEF_WOR', 'LOCATE_FNT_FILE', 'LOCATE_GEOCODE_SERVERLIST',
+ 'LOCATE_GRAPH_DIR', 'LOCATE_LAYOUT_TEMPLATE_DIR',
+ 'LOCATE_MNU_FILE', 'LOCATE_PEN_FILE', 'LOCATE_PREF_FILE',
+ 'LOCATE_PRJ_FILE', 'LOCATE_ROUTING_SERVERLIST',
+ 'LOCATE_THMTMPLT_DIR', 'LOCATE_WFS_SERVERLIST',
+ 'LOCATE_WMS_SERVERLIST', 'M_3DMAP_CLONE_VIEW',
+ 'M_3DMAP_PREVIOUS_VIEW', 'M_3DMAP_PROPERTIES',
+ 'M_3DMAP_REFRESH_GRID_TEXTURE', 'M_3DMAP_VIEW_ENTIRE_GRID',
+ 'M_3DMAP_VIEWPOINT_CONTROL', 'M_3DMAP_WIREFRAME',
+ 'M_ANALYZE_CALC_STATISTICS', 'M_ANALYZE_CUSTOMIZE_LEGEND',
+ 'M_ANALYZE_FIND', 'M_ANALYZE_FIND_SELECTION',
+ 'M_ANALYZE_INVERTSELECT', 'M_ANALYZE_SELECT',
+ 'M_ANALYZE_SELECTALL', 'M_ANALYZE_SHADE', 'M_ANALYZE_SQLQUERY',
+ 'M_ANALYZE_UNSELECT', 'M_BROWSE_EDIT', 'M_BROWSE_GRID',
+ 'M_BROWSE_NEW_RECORD', 'M_BROWSE_OPTIONS', 'M_BROWSE_PICK_FIELDS',
+ 'M_DBMS_OPEN_ODBC', 'M_EDIT_CLEAR', 'M_EDIT_CLEAROBJ',
+ 'M_EDIT_COPY', 'M_EDIT_CUT', 'M_EDIT_GETINFO', 'M_EDIT_NEW_ROW',
+ 'M_EDIT_PASTE', 'M_EDIT_PREFERENCES', 'M_EDIT_PREFERENCES_COUNTRY',
+ 'M_EDIT_PREFERENCES_FILE', 'M_EDIT_PREFERENCES_IMAGE_PROC',
+ 'M_EDIT_PREFERENCES_LAYOUT', 'M_EDIT_PREFERENCES_LEGEND',
+ 'M_EDIT_PREFERENCES_MAP', 'M_EDIT_PREFERENCES_OUTPUT',
+ 'M_EDIT_PREFERENCES_PATH', 'M_EDIT_PREFERENCES_PRINTER',
+ 'M_EDIT_PREFERENCES_STYLES', 'M_EDIT_PREFERENCES_SYSTEM',
+ 'M_EDIT_PREFERENCES_WEBSERVICES', 'M_EDIT_RESHAPE', 'M_EDIT_UNDO',
+ 'M_FILE_ABOUT', 'M_FILE_ADD_WORKSPACE', 'M_FILE_CLOSE',
+ 'M_FILE_CLOSE_ALL', 'M_FILE_CLOSE_ODBC', 'M_FILE_EXIT',
+ 'M_FILE_HELP', 'M_FILE_NEW', 'M_FILE_OPEN', 'M_FILE_OPEN_ODBC',
+ 'M_FILE_OPEN_ODBC_CONN', 'M_FILE_OPEN_UNIVERSAL_DATA',
+ 'M_FILE_OPEN_WFS', 'M_FILE_OPEN_WMS', 'M_FILE_PAGE_SETUP',
+ 'M_FILE_PRINT', 'M_FILE_PRINT_SETUP', 'M_FILE_REVERT',
+ 'M_FILE_RUN', 'M_FILE_SAVE', 'M_FILE_SAVE_COPY_AS',
+ 'M_FILE_SAVE_QUERY', 'M_FILE_SAVE_WINDOW_AS',
+ 'M_FILE_SAVE_WORKSPACE', 'M_FORMAT_CUSTOM_COLORS',
+ 'M_FORMAT_PICK_FILL', 'M_FORMAT_PICK_FONT', 'M_FORMAT_PICK_LINE',
+ 'M_FORMAT_PICK_SYMBOL', 'M_GRAPH_3D_VIEWING_ANGLE',
+ 'M_GRAPH_FORMATING', 'M_GRAPH_GENERAL_OPTIONS',
+ 'M_GRAPH_GRID_SCALES', 'M_GRAPH_LABEL_AXIS',
+ 'M_GRAPH_SAVE_AS_TEMPLATE', 'M_GRAPH_SERIES',
+ 'M_GRAPH_SERIES_OPTIONS', 'M_GRAPH_TITLES', 'M_GRAPH_TYPE',
+ 'M_GRAPH_VALUE_AXIS', 'M_HELP_ABOUT', 'M_HELP_CHECK_FOR_UPDATE',
+ 'M_HELP_CONNECT_MIFORUM', 'M_HELP_CONTENTS',
+ 'M_HELP_CONTEXTSENSITIVE', 'M_HELP_HELPMODE',
+ 'M_HELP_MAPINFO_3DGRAPH_HELP', 'M_HELP_MAPINFO_CONNECT_SERVICES',
+ 'M_HELP_MAPINFO_WWW', 'M_HELP_MAPINFO_WWW_STORE',
+ 'M_HELP_MAPINFO_WWW_TUTORIAL', 'M_HELP_SEARCH',
+ 'M_HELP_TECHSUPPORT', 'M_HELP_USE_HELP', 'M_LAYOUT_ACTUAL',
+ 'M_LAYOUT_ALIGN', 'M_LAYOUT_AUTOSCROLL_ONOFF',
+ 'M_LAYOUT_BRING2FRONT', 'M_LAYOUT_CHANGE_VIEW',
+ 'M_LAYOUT_DISPLAYOPTIONS', 'M_LAYOUT_DROPSHADOWS',
+ 'M_LAYOUT_ENTIRE', 'M_LAYOUT_LAYOUT_SIZE', 'M_LAYOUT_PREVIOUS',
+ 'M_LAYOUT_SEND2BACK', 'M_LEGEND_ADD_FRAMES', 'M_LEGEND_DELETE',
+ 'M_LEGEND_PROPERTIES', 'M_LEGEND_REFRESH', 'M_MAP_AUTOLABEL',
+ 'M_MAP_AUTOSCROLL_ONOFF', 'M_MAP_CHANGE_VIEW',
+ 'M_MAP_CLEAR_COSMETIC', 'M_MAP_CLEAR_CUSTOM_LABELS',
+ 'M_MAP_CLIP_REGION_ONOFF', 'M_MAP_CLONE_MAPPER',
+ 'M_MAP_CREATE_3DMAP', 'M_MAP_CREATE_LEGEND',
+ 'M_MAP_CREATE_PRISMMAP', 'M_MAP_ENTIRE_LAYER',
+ 'M_MAP_LAYER_CONTROL', 'M_MAP_MODIFY_THEMATIC', 'M_MAP_OPTIONS',
+ 'M_MAP_PREVIOUS', 'M_MAP_PROJECTION', 'M_MAP_SAVE_COSMETIC',
+ 'M_MAP_SET_CLIP_REGION', 'M_MAP_SETUNITS', 'M_MAP_SETUPDIGITIZER',
+ 'M_MAP_THEMATIC', 'M_MAPBASIC_CLEAR', 'M_MAPBASIC_SAVECONTENTS',
+ 'M_OBJECTS_BREAKPOLY', 'M_OBJECTS_BUFFER',
+ 'M_OBJECTS_CHECK_REGIONS', 'M_OBJECTS_CLEAN',
+ 'M_OBJECTS_CLEAR_TARGET', 'M_OBJECTS_COMBINE',
+ 'M_OBJECTS_CONVEX_HULL', 'M_OBJECTS_CVT_PGON',
+ 'M_OBJECTS_CVT_PLINE', 'M_OBJECTS_DISAGG',
+ 'M_OBJECTS_DRIVE_REGION', 'M_OBJECTS_ENCLOSE', 'M_OBJECTS_ERASE',
+ 'M_OBJECTS_ERASE_OUT', 'M_OBJECTS_MERGE', 'M_OBJECTS_OFFSET',
+ 'M_OBJECTS_OVERLAY', 'M_OBJECTS_POLYLINE_SPLIT',
+ 'M_OBJECTS_POLYLINE_SPLIT_AT_NODE', 'M_OBJECTS_RESHAPE',
+ 'M_OBJECTS_ROTATE', 'M_OBJECTS_SET_TARGET', 'M_OBJECTS_SMOOTH',
+ 'M_OBJECTS_SNAP', 'M_OBJECTS_SPLIT', 'M_OBJECTS_UNSMOOTH',
+ 'M_OBJECTS_VORONOI', 'M_ORACLE_CREATE_WORKSPACE',
+ 'M_ORACLE_DELETE_WORKSPACE', 'M_ORACLE_MERGE_PARENT',
+ 'M_ORACLE_REFRESH_FROM_PARENT', 'M_ORACLE_VERSION_ENABLE_OFF',
+ 'M_ORACLE_VERSION_ENABLE_ON', 'M_QUERY_CALC_STATISTICS',
+ 'M_QUERY_FIND', 'M_QUERY_FIND_ADDRESS', 'M_QUERY_FIND_SELECTION',
+ 'M_QUERY_FIND_SELECTION_CURRENT_MAP', 'M_QUERY_INVERTSELECT',
+ 'M_QUERY_SELECT', 'M_QUERY_SELECTALL', 'M_QUERY_SQLQUERY',
+ 'M_QUERY_UNSELECT', 'M_REDISTRICT_ADD', 'M_REDISTRICT_ASSIGN',
+ 'M_REDISTRICT_DELETE', 'M_REDISTRICT_OPTIONS',
+ 'M_REDISTRICT_TARGET', 'M_SENDMAIL_CURRENTWINDOW',
+ 'M_SENDMAIL_WORKSPACE', 'M_TABLE_APPEND', 'M_TABLE_BUFFER',
+ 'M_TABLE_CHANGESYMBOL', 'M_TABLE_CREATE_POINTS', 'M_TABLE_DELETE',
+ 'M_TABLE_DRIVE_REGION', 'M_TABLE_EXPORT', 'M_TABLE_GEOCODE',
+ 'M_TABLE_IMPORT', 'M_TABLE_MAKEMAPPABLE',
+ 'M_TABLE_MERGE_USING_COLUMN', 'M_TABLE_MODIFY_STRUCTURE',
+ 'M_TABLE_PACK', 'M_TABLE_RASTER_REG', 'M_TABLE_RASTER_STYLE',
+ 'M_TABLE_REFRESH', 'M_TABLE_RENAME',
+ 'M_TABLE_UNIVERSAL_DATA_REFRESH', 'M_TABLE_UNLINK',
+ 'M_TABLE_UPDATE_COLUMN', 'M_TABLE_VORONOI', 'M_TABLE_WEB_GEOCODE',
+ 'M_TABLE_WFS_PROPS', 'M_TABLE_WFS_REFRESH', 'M_TABLE_WMS_PROPS',
+ 'M_TOOLS_ADD_NODE', 'M_TOOLS_ARC', 'M_TOOLS_CRYSTAL_REPORTS_NEW',
+ 'M_TOOLS_CRYSTAL_REPORTS_OPEN', 'M_TOOLS_DRAGWINDOW',
+ 'M_TOOLS_ELLIPSE', 'M_TOOLS_EXPAND', 'M_TOOLS_FRAME',
+ 'M_TOOLS_HOTLINK', 'M_TOOLS_LABELER', 'M_TOOLS_LINE',
+ 'M_TOOLS_MAPBASIC', 'M_TOOLS_PNT_QUERY', 'M_TOOLS_POINT',
+ 'M_TOOLS_POLYGON', 'M_TOOLS_POLYLINE', 'M_TOOLS_RASTER_REG',
+ 'M_TOOLS_RECENTER', 'M_TOOLS_RECTANGLE', 'M_TOOLS_ROUNDEDRECT',
+ 'M_TOOLS_RULER', 'M_TOOLS_RUN', 'M_TOOLS_SEARCH_BOUNDARY',
+ 'M_TOOLS_SEARCH_POLYGON', 'M_TOOLS_SEARCH_RADIUS',
+ 'M_TOOLS_SEARCH_RECT', 'M_TOOLS_SELECTOR', 'M_TOOLS_SHRINK',
+ 'M_TOOLS_TEXT', 'M_TOOLS_TOOL_MANAGER', 'M_WINDOW_ARRANGEICONS',
+ 'M_WINDOW_BROWSE', 'M_WINDOW_BUTTONPAD', 'M_WINDOW_CASCADE',
+ 'M_WINDOW_EXPORT_WINDOW', 'M_WINDOW_FIRST', 'M_WINDOW_GRAPH',
+ 'M_WINDOW_LAYOUT', 'M_WINDOW_LEGEND', 'M_WINDOW_MAP',
+ 'M_WINDOW_MAPBASIC', 'M_WINDOW_MORE', 'M_WINDOW_REDISTRICT',
+ 'M_WINDOW_REDRAW', 'M_WINDOW_STATISTICS', 'M_WINDOW_STATUSBAR',
+ 'M_WINDOW_TILE', 'M_WINDOW_TOOL_PALETTE', 'MAGENTA',
+ 'MAP3D_INFO_BACKGROUND', 'MAP3D_INFO_CAMERA_CLIP_FAR',
+ 'MAP3D_INFO_CAMERA_CLIP_NEAR', 'MAP3D_INFO_CAMERA_FOCAL_X',
+ 'MAP3D_INFO_CAMERA_FOCAL_Y', 'MAP3D_INFO_CAMERA_FOCAL_Z',
+ 'MAP3D_INFO_CAMERA_VPN_1', 'MAP3D_INFO_CAMERA_VPN_2',
+ 'MAP3D_INFO_CAMERA_VPN_3', 'MAP3D_INFO_CAMERA_VU_1',
+ 'MAP3D_INFO_CAMERA_VU_2', 'MAP3D_INFO_CAMERA_VU_3',
+ 'MAP3D_INFO_CAMERA_X', 'MAP3D_INFO_CAMERA_Y',
+ 'MAP3D_INFO_CAMERA_Z', 'MAP3D_INFO_LIGHT_COLOR',
+ 'MAP3D_INFO_LIGHT_X', 'MAP3D_INFO_LIGHT_Y', 'MAP3D_INFO_LIGHT_Z',
+ 'MAP3D_INFO_RESOLUTION_X', 'MAP3D_INFO_RESOLUTION_Y',
+ 'MAP3D_INFO_SCALE', 'MAP3D_INFO_UNITS', 'MAPPER_INFO_AREAUNITS',
+ 'MAPPER_INFO_CENTERX', 'MAPPER_INFO_CENTERY',
+ 'MAPPER_INFO_CLIP_DISPLAY_ALL', 'MAPPER_INFO_CLIP_DISPLAY_POLYOBJ',
+ 'MAPPER_INFO_CLIP_OVERLAY', 'MAPPER_INFO_CLIP_REGION',
+ 'MAPPER_INFO_CLIP_TYPE', 'MAPPER_INFO_COORDSYS_CLAUSE',
+ 'MAPPER_INFO_COORDSYS_CLAUSE_WITH_BOUNDS',
+ 'MAPPER_INFO_COORDSYS_NAME', 'MAPPER_INFO_DISPLAY',
+ 'MAPPER_INFO_DISPLAY_DECIMAL', 'MAPPER_INFO_DISPLAY_DEGMINSEC',
+ 'MAPPER_INFO_DISPLAY_DMS', 'MAPPER_INFO_DISPLAY_MGRS',
+ 'MAPPER_INFO_DISPLAY_POSITION', 'MAPPER_INFO_DISPLAY_SCALE',
+ 'MAPPER_INFO_DISPLAY_ZOOM', 'MAPPER_INFO_DIST_CALC_TYPE',
+ 'MAPPER_INFO_DIST_CARTESIAN', 'MAPPER_INFO_DIST_SPHERICAL',
+ 'MAPPER_INFO_DISTUNITS', 'MAPPER_INFO_EDIT_LAYER',
+ 'MAPPER_INFO_LAYERS', 'MAPPER_INFO_MAXX', 'MAPPER_INFO_MAXY',
+ 'MAPPER_INFO_MERGE_MAP', 'MAPPER_INFO_MINX', 'MAPPER_INFO_MINY',
+ 'MAPPER_INFO_MOVE_DUPLICATE_NODES', 'MAPPER_INFO_NUM_THEMATIC',
+ 'MAPPER_INFO_REPROJECTION', 'MAPPER_INFO_RESAMPLING',
+ 'MAPPER_INFO_SCALE', 'MAPPER_INFO_SCROLLBARS',
+ 'MAPPER_INFO_XYUNITS', 'MAPPER_INFO_ZOOM', 'MAX_STRING_LENGTH',
+ 'MENUITEM_INFO_ACCELERATOR', 'MENUITEM_INFO_CHECKABLE',
+ 'MENUITEM_INFO_CHECKED', 'MENUITEM_INFO_ENABLED',
+ 'MENUITEM_INFO_HANDLER', 'MENUITEM_INFO_HELPMSG',
+ 'MENUITEM_INFO_ID', 'MENUITEM_INFO_SHOWHIDEABLE',
+ 'MENUITEM_INFO_TEXT', 'MI_CURSOR_ARROW', 'MI_CURSOR_CHANGE_WIDTH',
+ 'MI_CURSOR_CROSSHAIR', 'MI_CURSOR_DRAG_OBJ',
+ 'MI_CURSOR_FINGER_LEFT', 'MI_CURSOR_FINGER_UP',
+ 'MI_CURSOR_GRABBER', 'MI_CURSOR_IBEAM', 'MI_CURSOR_IBEAM_CROSS',
+ 'MI_CURSOR_ZOOM_IN', 'MI_CURSOR_ZOOM_OUT', 'MI_ICON_ADD_NODE',
+ 'MI_ICON_ARC', 'MI_ICON_ARROW', 'MI_ICON_ARROW_1',
+ 'MI_ICON_ARROW_10', 'MI_ICON_ARROW_11', 'MI_ICON_ARROW_12',
+ 'MI_ICON_ARROW_13', 'MI_ICON_ARROW_14', 'MI_ICON_ARROW_15',
+ 'MI_ICON_ARROW_16', 'MI_ICON_ARROW_17', 'MI_ICON_ARROW_18',
+ 'MI_ICON_ARROW_19', 'MI_ICON_ARROW_2', 'MI_ICON_ARROW_20',
+ 'MI_ICON_ARROW_21', 'MI_ICON_ARROW_3', 'MI_ICON_ARROW_4',
+ 'MI_ICON_ARROW_5', 'MI_ICON_ARROW_6', 'MI_ICON_ARROW_7',
+ 'MI_ICON_ARROW_8', 'MI_ICON_ARROW_9', 'MI_ICON_CLIP_MODE',
+ 'MI_ICON_CLIP_REGION', 'MI_ICON_CLOSE_ALL',
+ 'MI_ICON_COMMUNICATION_1', 'MI_ICON_COMMUNICATION_10',
+ 'MI_ICON_COMMUNICATION_11', 'MI_ICON_COMMUNICATION_12',
+ 'MI_ICON_COMMUNICATION_2', 'MI_ICON_COMMUNICATION_3',
+ 'MI_ICON_COMMUNICATION_4', 'MI_ICON_COMMUNICATION_5',
+ 'MI_ICON_COMMUNICATION_6', 'MI_ICON_COMMUNICATION_7',
+ 'MI_ICON_COMMUNICATION_8', 'MI_ICON_COMMUNICATION_9',
+ 'MI_ICON_COMPASS_CIRCLE_TA', 'MI_ICON_COMPASS_CONTRACT',
+ 'MI_ICON_COMPASS_EXPAND', 'MI_ICON_COMPASS_POLY_TA',
+ 'MI_ICON_COMPASS_TAG', 'MI_ICON_COMPASS_UNTAG', 'MI_ICON_COPY',
+ 'MI_ICON_CROSSHAIR', 'MI_ICON_CUT', 'MI_ICON_DISTRICT_MANY',
+ 'MI_ICON_DISTRICT_SAME', 'MI_ICON_DRAG_HANDLE', 'MI_ICON_ELLIPSE',
+ 'MI_ICON_EMERGENCY_1', 'MI_ICON_EMERGENCY_10',
+ 'MI_ICON_EMERGENCY_11', 'MI_ICON_EMERGENCY_12',
+ 'MI_ICON_EMERGENCY_13', 'MI_ICON_EMERGENCY_14',
+ 'MI_ICON_EMERGENCY_15', 'MI_ICON_EMERGENCY_16',
+ 'MI_ICON_EMERGENCY_17', 'MI_ICON_EMERGENCY_18',
+ 'MI_ICON_EMERGENCY_2', 'MI_ICON_EMERGENCY_3',
+ 'MI_ICON_EMERGENCY_4', 'MI_ICON_EMERGENCY_5',
+ 'MI_ICON_EMERGENCY_6', 'MI_ICON_EMERGENCY_7',
+ 'MI_ICON_EMERGENCY_8', 'MI_ICON_EMERGENCY_9', 'MI_ICON_GRABBER',
+ 'MI_ICON_GRAPH_SELECT', 'MI_ICON_HELP', 'MI_ICON_HOT_LINK',
+ 'MI_ICON_INFO', 'MI_ICON_INVERTSELECT', 'MI_ICON_LABEL',
+ 'MI_ICON_LAYERS', 'MI_ICON_LEGEND', 'MI_ICON_LETTERS_A',
+ 'MI_ICON_LETTERS_B', 'MI_ICON_LETTERS_C', 'MI_ICON_LETTERS_D',
+ 'MI_ICON_LETTERS_E', 'MI_ICON_LETTERS_F', 'MI_ICON_LETTERS_G',
+ 'MI_ICON_LETTERS_H', 'MI_ICON_LETTERS_I', 'MI_ICON_LETTERS_J',
+ 'MI_ICON_LETTERS_K', 'MI_ICON_LETTERS_L', 'MI_ICON_LETTERS_M',
+ 'MI_ICON_LETTERS_N', 'MI_ICON_LETTERS_O', 'MI_ICON_LETTERS_P',
+ 'MI_ICON_LETTERS_Q', 'MI_ICON_LETTERS_R', 'MI_ICON_LETTERS_S',
+ 'MI_ICON_LETTERS_T', 'MI_ICON_LETTERS_U', 'MI_ICON_LETTERS_V',
+ 'MI_ICON_LETTERS_W', 'MI_ICON_LETTERS_X', 'MI_ICON_LETTERS_Y',
+ 'MI_ICON_LETTERS_Z', 'MI_ICON_LINE', 'MI_ICON_LINE_STYLE',
+ 'MI_ICON_MAPSYMB_1', 'MI_ICON_MAPSYMB_10', 'MI_ICON_MAPSYMB_11',
+ 'MI_ICON_MAPSYMB_12', 'MI_ICON_MAPSYMB_13', 'MI_ICON_MAPSYMB_14',
+ 'MI_ICON_MAPSYMB_15', 'MI_ICON_MAPSYMB_16', 'MI_ICON_MAPSYMB_17',
+ 'MI_ICON_MAPSYMB_18', 'MI_ICON_MAPSYMB_19', 'MI_ICON_MAPSYMB_2',
+ 'MI_ICON_MAPSYMB_20', 'MI_ICON_MAPSYMB_21', 'MI_ICON_MAPSYMB_22',
+ 'MI_ICON_MAPSYMB_23', 'MI_ICON_MAPSYMB_24', 'MI_ICON_MAPSYMB_25',
+ 'MI_ICON_MAPSYMB_26', 'MI_ICON_MAPSYMB_3', 'MI_ICON_MAPSYMB_4',
+ 'MI_ICON_MAPSYMB_5', 'MI_ICON_MAPSYMB_6', 'MI_ICON_MAPSYMB_7',
+ 'MI_ICON_MAPSYMB_8', 'MI_ICON_MAPSYMB_9', 'MI_ICON_MARITIME_1',
+ 'MI_ICON_MARITIME_10', 'MI_ICON_MARITIME_2', 'MI_ICON_MARITIME_3',
+ 'MI_ICON_MARITIME_4', 'MI_ICON_MARITIME_5', 'MI_ICON_MARITIME_6',
+ 'MI_ICON_MARITIME_7', 'MI_ICON_MARITIME_8', 'MI_ICON_MARITIME_9',
+ 'MI_ICON_MB_1', 'MI_ICON_MB_10', 'MI_ICON_MB_11', 'MI_ICON_MB_12',
+ 'MI_ICON_MB_13', 'MI_ICON_MB_14', 'MI_ICON_MB_2', 'MI_ICON_MB_3',
+ 'MI_ICON_MB_4', 'MI_ICON_MB_5', 'MI_ICON_MB_6', 'MI_ICON_MB_7',
+ 'MI_ICON_MB_8', 'MI_ICON_MB_9', 'MI_ICON_MISC_1',
+ 'MI_ICON_MISC_10', 'MI_ICON_MISC_11', 'MI_ICON_MISC_12',
+ 'MI_ICON_MISC_13', 'MI_ICON_MISC_14', 'MI_ICON_MISC_15',
+ 'MI_ICON_MISC_16', 'MI_ICON_MISC_17', 'MI_ICON_MISC_18',
+ 'MI_ICON_MISC_19', 'MI_ICON_MISC_2', 'MI_ICON_MISC_20',
+ 'MI_ICON_MISC_21', 'MI_ICON_MISC_22', 'MI_ICON_MISC_23',
+ 'MI_ICON_MISC_24', 'MI_ICON_MISC_25', 'MI_ICON_MISC_26',
+ 'MI_ICON_MISC_27', 'MI_ICON_MISC_28', 'MI_ICON_MISC_29',
+ 'MI_ICON_MISC_3', 'MI_ICON_MISC_30', 'MI_ICON_MISC_31',
+ 'MI_ICON_MISC_4', 'MI_ICON_MISC_5', 'MI_ICON_MISC_6',
+ 'MI_ICON_MISC_7', 'MI_ICON_MISC_8', 'MI_ICON_MISC_9',
+ 'MI_ICON_NEW_DOC', 'MI_ICON_NUMBERS_1', 'MI_ICON_NUMBERS_10',
+ 'MI_ICON_NUMBERS_11', 'MI_ICON_NUMBERS_12', 'MI_ICON_NUMBERS_13',
+ 'MI_ICON_NUMBERS_14', 'MI_ICON_NUMBERS_15', 'MI_ICON_NUMBERS_16',
+ 'MI_ICON_NUMBERS_17', 'MI_ICON_NUMBERS_18', 'MI_ICON_NUMBERS_19',
+ 'MI_ICON_NUMBERS_2', 'MI_ICON_NUMBERS_20', 'MI_ICON_NUMBERS_21',
+ 'MI_ICON_NUMBERS_22', 'MI_ICON_NUMBERS_23', 'MI_ICON_NUMBERS_24',
+ 'MI_ICON_NUMBERS_25', 'MI_ICON_NUMBERS_26', 'MI_ICON_NUMBERS_27',
+ 'MI_ICON_NUMBERS_28', 'MI_ICON_NUMBERS_29', 'MI_ICON_NUMBERS_3',
+ 'MI_ICON_NUMBERS_30', 'MI_ICON_NUMBERS_31', 'MI_ICON_NUMBERS_32',
+ 'MI_ICON_NUMBERS_4', 'MI_ICON_NUMBERS_5', 'MI_ICON_NUMBERS_6',
+ 'MI_ICON_NUMBERS_7', 'MI_ICON_NUMBERS_8', 'MI_ICON_NUMBERS_9',
+ 'MI_ICON_ODBC_DISCONNECT', 'MI_ICON_ODBC_MAPPABLE',
+ 'MI_ICON_ODBC_OPEN', 'MI_ICON_ODBC_REFRESH', 'MI_ICON_ODBC_SYMBOL',
+ 'MI_ICON_ODBC_UNLINK', 'MI_ICON_OPEN_FILE', 'MI_ICON_OPEN_WOR',
+ 'MI_ICON_OPENWFS', 'MI_ICON_OPENWMS', 'MI_ICON_PASTE',
+ 'MI_ICON_POLYGON', 'MI_ICON_POLYLINE', 'MI_ICON_PRINT',
+ 'MI_ICON_REALESTATE_1', 'MI_ICON_REALESTATE_10',
+ 'MI_ICON_REALESTATE_11', 'MI_ICON_REALESTATE_12',
+ 'MI_ICON_REALESTATE_13', 'MI_ICON_REALESTATE_14',
+ 'MI_ICON_REALESTATE_15', 'MI_ICON_REALESTATE_16',
+ 'MI_ICON_REALESTATE_17', 'MI_ICON_REALESTATE_18',
+ 'MI_ICON_REALESTATE_19', 'MI_ICON_REALESTATE_2',
+ 'MI_ICON_REALESTATE_20', 'MI_ICON_REALESTATE_21',
+ 'MI_ICON_REALESTATE_22', 'MI_ICON_REALESTATE_23',
+ 'MI_ICON_REALESTATE_3', 'MI_ICON_REALESTATE_4',
+ 'MI_ICON_REALESTATE_5', 'MI_ICON_REALESTATE_6',
+ 'MI_ICON_REALESTATE_7', 'MI_ICON_REALESTATE_8',
+ 'MI_ICON_REALESTATE_9', 'MI_ICON_RECT', 'MI_ICON_REGION_STYLE',
+ 'MI_ICON_RESHAPE', 'MI_ICON_ROUND_RECT', 'MI_ICON_RULER',
+ 'MI_ICON_RUN', 'MI_ICON_SAVE_FILE', 'MI_ICON_SAVE_WIN',
+ 'MI_ICON_SAVE_WOR', 'MI_ICON_SEARCH_BDY', 'MI_ICON_SEARCH_POLYGON',
+ 'MI_ICON_SEARCH_RADIUS', 'MI_ICON_SEARCH_RECT', 'MI_ICON_SIGNS_1',
+ 'MI_ICON_SIGNS_10', 'MI_ICON_SIGNS_11', 'MI_ICON_SIGNS_12',
+ 'MI_ICON_SIGNS_13', 'MI_ICON_SIGNS_14', 'MI_ICON_SIGNS_15',
+ 'MI_ICON_SIGNS_16', 'MI_ICON_SIGNS_17', 'MI_ICON_SIGNS_18',
+ 'MI_ICON_SIGNS_19', 'MI_ICON_SIGNS_2', 'MI_ICON_SIGNS_3',
+ 'MI_ICON_SIGNS_4', 'MI_ICON_SIGNS_5', 'MI_ICON_SIGNS_6',
+ 'MI_ICON_SIGNS_7', 'MI_ICON_SIGNS_8', 'MI_ICON_SIGNS_9',
+ 'MI_ICON_STATISTICS', 'MI_ICON_SYMBOL', 'MI_ICON_SYMBOL_STYLE',
+ 'MI_ICON_TEXT', 'MI_ICON_TEXT_STYLE', 'MI_ICON_TRANSPORT_1',
+ 'MI_ICON_TRANSPORT_10', 'MI_ICON_TRANSPORT_11',
+ 'MI_ICON_TRANSPORT_12', 'MI_ICON_TRANSPORT_13',
+ 'MI_ICON_TRANSPORT_14', 'MI_ICON_TRANSPORT_15',
+ 'MI_ICON_TRANSPORT_16', 'MI_ICON_TRANSPORT_17',
+ 'MI_ICON_TRANSPORT_18', 'MI_ICON_TRANSPORT_19',
+ 'MI_ICON_TRANSPORT_2', 'MI_ICON_TRANSPORT_20',
+ 'MI_ICON_TRANSPORT_21', 'MI_ICON_TRANSPORT_22',
+ 'MI_ICON_TRANSPORT_23', 'MI_ICON_TRANSPORT_24',
+ 'MI_ICON_TRANSPORT_25', 'MI_ICON_TRANSPORT_26',
+ 'MI_ICON_TRANSPORT_27', 'MI_ICON_TRANSPORT_3',
+ 'MI_ICON_TRANSPORT_4', 'MI_ICON_TRANSPORT_5',
+ 'MI_ICON_TRANSPORT_6', 'MI_ICON_TRANSPORT_7',
+ 'MI_ICON_TRANSPORT_8', 'MI_ICON_TRANSPORT_9', 'MI_ICON_UNDO',
+ 'MI_ICON_UNSELECT_ALL', 'MI_ICON_WINDOW_FRAME', 'MI_ICON_WRENCH',
+ 'MI_ICON_ZOOM_IN', 'MI_ICON_ZOOM_OUT', 'MI_ICON_ZOOM_QUESTION',
+ 'MI_ICONS_MAPS_1', 'MI_ICONS_MAPS_10', 'MI_ICONS_MAPS_11',
+ 'MI_ICONS_MAPS_12', 'MI_ICONS_MAPS_13', 'MI_ICONS_MAPS_14',
+ 'MI_ICONS_MAPS_15', 'MI_ICONS_MAPS_2', 'MI_ICONS_MAPS_3',
+ 'MI_ICONS_MAPS_4', 'MI_ICONS_MAPS_5', 'MI_ICONS_MAPS_6',
+ 'MI_ICONS_MAPS_7', 'MI_ICONS_MAPS_8', 'MI_ICONS_MAPS_9',
+ 'MIPLATFORM_HP', 'MIPLATFORM_MAC68K', 'MIPLATFORM_POWERMAC',
+ 'MIPLATFORM_SPECIAL', 'MIPLATFORM_SUN', 'MIPLATFORM_WIN16',
+ 'MIPLATFORM_WIN32', 'MODE_APPEND', 'MODE_BINARY', 'MODE_INPUT',
+ 'MODE_OUTPUT', 'MODE_RANDOM', 'OBJ_ARC', 'OBJ_ELLIPSE',
+ 'OBJ_FRAME', 'OBJ_GEO_ARCBEGANGLE', 'OBJ_GEO_ARCENDANGLE',
+ 'OBJ_GEO_CENTROID', 'OBJ_GEO_LINEBEGX', 'OBJ_GEO_LINEBEGY',
+ 'OBJ_GEO_LINEENDX', 'OBJ_GEO_LINEENDY', 'OBJ_GEO_MAXX',
+ 'OBJ_GEO_MAXY', 'OBJ_GEO_MINX', 'OBJ_GEO_MINY', 'OBJ_GEO_POINTM',
+ 'OBJ_GEO_POINTX', 'OBJ_GEO_POINTY', 'OBJ_GEO_POINTZ',
+ 'OBJ_GEO_ROUNDRADIUS', 'OBJ_GEO_TEXTANGLE', 'OBJ_GEO_TEXTLINEX',
+ 'OBJ_GEO_TEXTLINEY', 'OBJ_INFO_BRUSH', 'OBJ_INFO_FILLFRAME',
+ 'OBJ_INFO_FRAMETITLE', 'OBJ_INFO_FRAMEWIN', 'OBJ_INFO_HAS_M',
+ 'OBJ_INFO_HAS_Z', 'OBJ_INFO_MPOINT', 'OBJ_INFO_NONEMPTY',
+ 'OBJ_INFO_NPNTS', 'OBJ_INFO_NPOLYGONS', 'OBJ_INFO_PEN',
+ 'OBJ_INFO_PLINE', 'OBJ_INFO_REGION', 'OBJ_INFO_SMOOTH',
+ 'OBJ_INFO_SYMBOL', 'OBJ_INFO_TEXTARROW', 'OBJ_INFO_TEXTFONT',
+ 'OBJ_INFO_TEXTJUSTIFY', 'OBJ_INFO_TEXTSPACING',
+ 'OBJ_INFO_TEXTSTRING', 'OBJ_INFO_TYPE', 'OBJ_INFO_Z_UNIT',
+ 'OBJ_INFO_Z_UNIT_SET', 'OBJ_LINE', 'OBJ_PLINE', 'OBJ_POINT',
+ 'OBJ_RECT', 'OBJ_REGION', 'OBJ_ROUNDRECT', 'OBJ_TEXT',
+ 'OBJ_TYPE_ARC', 'OBJ_TYPE_COLLECTION', 'OBJ_TYPE_ELLIPSE',
+ 'OBJ_TYPE_FRAME', 'OBJ_TYPE_LINE', 'OBJ_TYPE_MPOINT',
+ 'OBJ_TYPE_PLINE', 'OBJ_TYPE_POINT', 'OBJ_TYPE_RECT',
+ 'OBJ_TYPE_REGION', 'OBJ_TYPE_ROUNDRECT', 'OBJ_TYPE_TEXT',
+ 'ORIENTATION_CUSTOM', 'ORIENTATION_LANDSCAPE',
+ 'ORIENTATION_PORTRAIT', 'PEN_COLOR', 'PEN_INDEX',
+ 'PEN_INTERLEAVED', 'PEN_PATTERN', 'PEN_WIDTH', 'PLATFORM_MAC',
+ 'PLATFORM_MOTIF', 'PLATFORM_SPECIAL', 'PLATFORM_WIN',
+ 'PLATFORM_X11', 'PLATFORM_XOL', 'PRISMMAP_INFO_BACKGROUND',
+ 'PRISMMAP_INFO_CAMERA_CLIP_FAR', 'PRISMMAP_INFO_CAMERA_CLIP_NEAR',
+ 'PRISMMAP_INFO_CAMERA_FOCAL_X', 'PRISMMAP_INFO_CAMERA_FOCAL_Y',
+ 'PRISMMAP_INFO_CAMERA_FOCAL_Z', 'PRISMMAP_INFO_CAMERA_VPN_1',
+ 'PRISMMAP_INFO_CAMERA_VPN_2', 'PRISMMAP_INFO_CAMERA_VPN_3',
+ 'PRISMMAP_INFO_CAMERA_VU_1', 'PRISMMAP_INFO_CAMERA_VU_2',
+ 'PRISMMAP_INFO_CAMERA_VU_3', 'PRISMMAP_INFO_CAMERA_X',
+ 'PRISMMAP_INFO_CAMERA_Y', 'PRISMMAP_INFO_CAMERA_Z',
+ 'PRISMMAP_INFO_INFOTIP_EXPR', 'PRISMMAP_INFO_LIGHT_COLOR',
+ 'PRISMMAP_INFO_LIGHT_X', 'PRISMMAP_INFO_LIGHT_Y',
+ 'PRISMMAP_INFO_LIGHT_Z', 'PRISMMAP_INFO_SCALE', 'RAD_2_DEG',
+ 'RASTER_CONTROL_POINT_X', 'RASTER_CONTROL_POINT_Y',
+ 'RASTER_TAB_INFO_ALPHA', 'RASTER_TAB_INFO_BITS_PER_PIXEL',
+ 'RASTER_TAB_INFO_BRIGHTNESS', 'RASTER_TAB_INFO_CONTRAST',
+ 'RASTER_TAB_INFO_DISPLAY_TRANSPARENT', 'RASTER_TAB_INFO_GREYSCALE',
+ 'RASTER_TAB_INFO_HEIGHT', 'RASTER_TAB_INFO_IMAGE_CLASS',
+ 'RASTER_TAB_INFO_IMAGE_NAME', 'RASTER_TAB_INFO_IMAGE_TYPE',
+ 'RASTER_TAB_INFO_NUM_CONTROL_POINTS',
+ 'RASTER_TAB_INFO_TRANSPARENT_COLOR', 'RASTER_TAB_INFO_WIDTH',
+ 'RED', 'REGION_INFO_IS_CLOCKWISE', 'SEARCH_INFO_ROW',
+ 'SEARCH_INFO_TABLE', 'SECONDS_PER_DAY', 'SEL_INFO_NROWS',
+ 'SEL_INFO_SELNAME', 'SEL_INFO_TABLENAME',
+ 'SESSION_INFO_AREA_UNITS', 'SESSION_INFO_COORDSYS_CLAUSE',
+ 'SESSION_INFO_DISTANCE_UNITS', 'SESSION_INFO_PAPER_UNITS',
+ 'SRV_COL_INFO_ALIAS', 'SRV_COL_INFO_NAME',
+ 'SRV_COL_INFO_PRECISION', 'SRV_COL_INFO_SCALE',
+ 'SRV_COL_INFO_STATUS', 'SRV_COL_INFO_TYPE', 'SRV_COL_INFO_VALUE',
+ 'SRV_COL_INFO_WIDTH', 'SRV_COL_TYPE_BIN_STRING',
+ 'SRV_COL_TYPE_CHAR', 'SRV_COL_TYPE_DATE', 'SRV_COL_TYPE_DECIMAL',
+ 'SRV_COL_TYPE_FIXED_LEN_STRING', 'SRV_COL_TYPE_FLOAT',
+ 'SRV_COL_TYPE_INTEGER', 'SRV_COL_TYPE_LOGICAL',
+ 'SRV_COL_TYPE_NONE', 'SRV_COL_TYPE_SMALLINT',
+ 'SRV_CONNECT_INFO_DB_NAME', 'SRV_CONNECT_INFO_DRIVER_NAME',
+ 'SRV_CONNECT_INFO_DS_NAME', 'SRV_CONNECT_INFO_QUOTE_CHAR',
+ 'SRV_CONNECT_INFO_SQL_USER_ID', 'SRV_DRV_DATA_SOURCE',
+ 'SRV_DRV_INFO_NAME', 'SRV_DRV_INFO_NAME_LIST', 'SRV_ERROR',
+ 'SRV_FETCH_FIRST', 'SRV_FETCH_LAST', 'SRV_FETCH_NEXT',
+ 'SRV_FETCH_PREV', 'SRV_INVALID_HANDLE', 'SRV_NEED_DATA',
+ 'SRV_NO_MORE_DATA', 'SRV_NULL_DATA', 'SRV_SUCCESS',
+ 'SRV_SUCCESS_WITH_INFO', 'SRV_TRUNCATED_DATA',
+ 'SRV_WM_HIST_NO_OVERWRITE', 'SRV_WM_HIST_NONE',
+ 'SRV_WM_HIST_OVERWRITE', 'STR_EQ', 'STR_GT', 'STR_LT',
+ 'STYLE_SAMPLE_SIZE_LARGE', 'STYLE_SAMPLE_SIZE_SMALL',
+ 'SWITCHING_INTO_MAPINFO', 'SWITCHING_OUT_OF_MAPINFO',
+ 'SYMBOL_ANGLE', 'SYMBOL_CODE', 'SYMBOL_COLOR',
+ 'SYMBOL_CUSTOM_NAME', 'SYMBOL_CUSTOM_STYLE', 'SYMBOL_FONT_NAME',
+ 'SYMBOL_FONT_STYLE', 'SYMBOL_KIND', 'SYMBOL_KIND_CUSTOM',
+ 'SYMBOL_KIND_FONT', 'SYMBOL_KIND_VECTOR', 'SYMBOL_POINTSIZE',
+ 'SYS_INFO_APPIDISPATCH', 'SYS_INFO_APPLICATIONWND',
+ 'SYS_INFO_APPVERSION', 'SYS_INFO_CHARSET',
+ 'SYS_INFO_COPYPROTECTED', 'SYS_INFO_DATE_FORMAT',
+ 'SYS_INFO_DDESTATUS', 'SYS_INFO_DIG_INSTALLED',
+ 'SYS_INFO_DIG_MODE', 'SYS_INFO_MAPINFOWND',
+ 'SYS_INFO_MDICLIENTWND', 'SYS_INFO_MIBUILD_NUMBER',
+ 'SYS_INFO_MIPLATFORM', 'SYS_INFO_MIVERSION',
+ 'SYS_INFO_NUMBER_FORMAT', 'SYS_INFO_PLATFORM',
+ 'SYS_INFO_PRODUCTLEVEL', 'SYS_INFO_RUNTIME',
+ 'TAB_GEO_CONTROL_POINT_X', 'TAB_GEO_CONTROL_POINT_Y',
+ 'TAB_INFO_BROWSER_LIST', 'TAB_INFO_COORDSYS_CLAUSE',
+ 'TAB_INFO_COORDSYS_CLAUSE_WITHOUT_BOUNDS',
+ 'TAB_INFO_COORDSYS_MAXX', 'TAB_INFO_COORDSYS_MAXY',
+ 'TAB_INFO_COORDSYS_MINX', 'TAB_INFO_COORDSYS_MINY',
+ 'TAB_INFO_COORDSYS_NAME', 'TAB_INFO_EDITED', 'TAB_INFO_FASTEDIT',
+ 'TAB_INFO_MAPPABLE', 'TAB_INFO_MAPPABLE_TABLE', 'TAB_INFO_MAXX',
+ 'TAB_INFO_MAXY', 'TAB_INFO_MINX', 'TAB_INFO_MINY', 'TAB_INFO_NAME',
+ 'TAB_INFO_NCOLS', 'TAB_INFO_NREFS', 'TAB_INFO_NROWS',
+ 'TAB_INFO_NUM', 'TAB_INFO_READONLY', 'TAB_INFO_SEAMLESS',
+ 'TAB_INFO_SUPPORT_MZ', 'TAB_INFO_TABFILE', 'TAB_INFO_TEMP',
+ 'TAB_INFO_THEME_METADATA', 'TAB_INFO_TYPE', 'TAB_INFO_UNDO',
+ 'TAB_INFO_USERBROWSE', 'TAB_INFO_USERCLOSE',
+ 'TAB_INFO_USERDISPLAYMAP', 'TAB_INFO_USEREDITABLE',
+ 'TAB_INFO_USERMAP', 'TAB_INFO_USERREMOVEMAP', 'TAB_INFO_Z_UNIT',
+ 'TAB_INFO_Z_UNIT_SET', 'TAB_TYPE_BASE', 'TAB_TYPE_FME',
+ 'TAB_TYPE_IMAGE', 'TAB_TYPE_LINKED', 'TAB_TYPE_RESULT',
+ 'TAB_TYPE_VIEW', 'TAB_TYPE_WFS', 'TAB_TYPE_WMS', 'TRUE', 'WHITE',
+ 'WIN_3DMAP', 'WIN_BROWSER', 'WIN_BUTTONPAD', 'WIN_CART_LEGEND',
+ 'WIN_GRAPH', 'WIN_HELP', 'WIN_INFO', 'WIN_INFO_AUTOSCROLL',
+ 'WIN_INFO_CLONEWINDOW', 'WIN_INFO_ENHANCED_RENDERING',
+ 'WIN_INFO_EXPORT_ANTIALIASING', 'WIN_INFO_EXPORT_BORDER',
+ 'WIN_INFO_EXPORT_DITHER', 'WIN_INFO_EXPORT_FILTER',
+ 'WIN_INFO_EXPORT_MASKSIZE', 'WIN_INFO_EXPORT_THRESHOLD',
+ 'WIN_INFO_EXPORT_TRANSPRASTER', 'WIN_INFO_EXPORT_TRANSPVECTOR',
+ 'WIN_INFO_EXPORT_TRUECOLOR', 'WIN_INFO_HEIGHT',
+ 'WIN_INFO_LEGENDS_MAP', 'WIN_INFO_NAME', 'WIN_INFO_OPEN',
+ 'WIN_INFO_PRINTER_BORDER', 'WIN_INFO_PRINTER_BOTTOMMARGIN',
+ 'WIN_INFO_PRINTER_COPIES', 'WIN_INFO_PRINTER_DITHER',
+ 'WIN_INFO_PRINTER_LEFTMARGIN', 'WIN_INFO_PRINTER_METHOD',
+ 'WIN_INFO_PRINTER_NAME', 'WIN_INFO_PRINTER_ORIENT',
+ 'WIN_INFO_PRINTER_PAPERSIZE', 'WIN_INFO_PRINTER_RIGHTMARGIN',
+ 'WIN_INFO_PRINTER_SCALE_PATTERNS', 'WIN_INFO_PRINTER_TOPMARGIN',
+ 'WIN_INFO_PRINTER_TRANSPRASTER', 'WIN_INFO_PRINTER_TRANSPVECTOR',
+ 'WIN_INFO_PRINTER_TRUECOLOR', 'WIN_INFO_SMARTPAN',
+ 'WIN_INFO_SMOOTH_IMAGE', 'WIN_INFO_SMOOTH_TEXT',
+ 'WIN_INFO_SMOOTH_VECTOR', 'WIN_INFO_SNAPMODE',
+ 'WIN_INFO_SNAPTHRESHOLD', 'WIN_INFO_STATE',
+ 'WIN_INFO_SYSMENUCLOSE', 'WIN_INFO_TABLE', 'WIN_INFO_TOPMOST',
+ 'WIN_INFO_TYPE', 'WIN_INFO_WIDTH', 'WIN_INFO_WINDOWID',
+ 'WIN_INFO_WND', 'WIN_INFO_WORKSPACE', 'WIN_INFO_X', 'WIN_INFO_Y',
+ 'WIN_LAYOUT', 'WIN_LEGEND', 'WIN_MAPBASIC', 'WIN_MAPINFO',
+ 'WIN_MAPPER', 'WIN_MESSAGE', 'WIN_PENPICKER',
+ 'WIN_PRINTER_LANDSCAPE', 'WIN_PRINTER_PORTRAIT', 'WIN_RULER',
+ 'WIN_STATE_MAXIMIZED', 'WIN_STATE_MINIMIZED', 'WIN_STATE_NORMAL',
+ 'WIN_STATISTICS', 'WIN_STYLE_CHILD', 'WIN_STYLE_POPUP',
+ 'WIN_STYLE_POPUP_FULLCAPTION', 'WIN_STYLE_STANDARD',
+ 'WIN_SYMBOLPICKER', 'WIN_TOOLBAR', 'WIN_TOOLPICKER', 'YELLOW'
+ ),
+ 5 => array(
+ 'Abbrs', 'Above', 'Access', 'Active', 'Address', 'Advanced',
+ 'Affine', 'Align', 'Alpha', 'alpha_value', 'Always', 'Angle',
+ 'Animate', 'Antialiasing', 'Append', 'Apply', 'ApplyUpdates',
+ 'Arrow', 'Ascending', 'ASCII', 'At', 'AttributeData', 'Auto',
+ 'Autoflip', 'Autokey', 'Automatic', 'Autoscroll', 'Axis',
+ 'Background', 'Banding', 'Batch', 'Behind', 'Below', 'Bend',
+ 'Binary', 'Blocks', 'Border', 'BorderPen', 'Bottom', 'Bounds',
+ 'ByteOrder', 'ByVal', 'Calling', 'Camera', 'Candidates',
+ 'Cartesian', 'Cell', 'Center', 'Change', 'Char', 'Circle',
+ 'Clipping', 'CloseMatchesOnly', 'ClosestAddr', 'Color', 'Columns',
+ 'Contents', 'ControlPoints', 'Copies', 'Copyright', 'Counter',
+ 'Country', 'CountrySecondarySubdivision', 'CountrySubdivision',
+ 'Cross', 'CubicConvolution', 'Cull', 'Cursor', 'Custom', 'Data',
+ 'DBF', 'DDE', 'Decimal', 'DecimalPlaces', 'DefaultAmbientSpeed',
+ 'DefaultPropagationFactor', 'DeformatNumber', 'Delimiter',
+ 'Density', 'DenyWrite', 'Descending', 'Destroy', 'Device',
+ 'Dictionary', 'DInfo', 'Disable', 'DiscardUpdates', 'Display',
+ 'Dither', 'DrawMode', 'DropKey', 'Droplines', 'Duplicates',
+ 'Dynamic', 'Earth', 'East', 'EditLayerPopup', 'Elevation', 'Else',
+ 'ElseIf', 'Emf', 'Enable', 'Envinsa', 'ErrorDiffusion', 'Extents',
+ 'Fallback', 'FastEdit', 'FillFrame', 'Filter', 'First', 'Fit',
+ 'Fixed', 'FocalPoint', 'Footnote', 'Force', 'FromMapCatalog',
+ 'Front', 'Gap', 'Geographic', 'Geography', 'Graduated', 'Graphic',
+ 'Gutter', 'Half', 'Halftone', 'Handles', 'Height', 'Help',
+ 'HelpMsg', 'Hide', 'Hierarchical', 'HIGHLOW', 'History', 'Icon',
+ 'ID', 'Ignore', 'Image', 'Inflect', 'Inset', 'Inside',
+ 'Interactive', 'Internal', 'Interpolate', 'IntersectingStreet',
+ 'Justify', 'Key', 'Label', 'Labels', 'Landscape', 'Large', 'Last',
+ 'Layer', 'Left', 'Lib', 'Light', 'LinePen', 'Lines', 'Linestyle',
+ 'Longitude', 'LOWHIGH', 'Major', 'MajorPolygonOnly',
+ 'MajorRoadsOnly', 'MapBounds', 'MapMarker', 'MapString', 'Margins',
+ 'MarkMultiple', 'MaskSize', 'Match', 'MaxOffRoadDistance',
+ 'Message', 'MICODE', 'Minor', 'MixedCase', 'Mode', 'ModifierKeys',
+ 'Modify', 'Multiple', 'MultiPolygonRgns', 'Municipality',
+ 'MunicipalitySubdivision', 'Name', 'NATIVE', 'NearestNeighbor',
+ 'NoCollision', 'Node', 'Nodes', 'NoIndex', 'None', 'Nonearth',
+ 'NoRefresh', 'Normalized', 'North', 'Number', 'ObjectType', 'ODBC',
+ 'Off', 'OK', 'OLE', 'On', 'Options', 'Orientation', 'OtherBdy',
+ 'Output', 'Outside', 'Overlapped', 'Overwrite', 'Pagebreaks',
+ 'Pan', 'Papersize', 'Parent', 'PassThrough', 'Password',
+ 'Patterns', 'Per', 'Percent', 'Percentage', 'Permanent',
+ 'PersistentCache', 'Pie', 'Pitch', 'Placename', 'PointsOnly',
+ 'PolyObj', 'Portrait', 'Position', 'PostalCode', 'Prefer',
+ 'Preferences', 'Prev', 'Printer', 'Projection', 'PushButton',
+ 'Quantile', 'Query', 'Random', 'Range', 'Raster', 'Read',
+ 'ReadOnly', 'Rec', 'Redraw', 'Refine', 'Regionstyle', 'RemoveData',
+ 'Replace', 'Reprojection', 'Resampling', 'Restore', 'ResultCode',
+ 'ReturnHoles', 'Right', 'Roll', 'ROP', 'Rotated', 'Row', 'Ruler',
+ 'Scale', 'ScrollBars', 'Seamless', 'SecondaryPostalCode',
+ 'SelfInt', 'Separator', 'Series', 'Service', 'SetKey',
+ 'SetTraverse', 'Shades', 'Show', 'Simple', 'SimplificationFactor',
+ 'Size', 'Small', 'Smart', 'Smooth', 'South', 'Spacing',
+ 'SPATIALWARE', 'Spherical', 'Square', 'Stacked', 'Step', 'Store',
+ 'Street', 'StreetName', 'StreetNumber', 'StyleType', 'Subtitle',
+ 'SysMenuClose', 'Thin', 'Tick', 'Title', 'TitleAxisY',
+ 'TitleGroup', 'Titles', 'TitleSeries', 'ToggleButton', 'Tolerance',
+ 'ToolbarPosition', 'ToolButton', 'Toolkit', 'Top', 'Translucency',
+ 'translucency_percent', 'Transparency', 'Transparent', 'Traverse',
+ 'TrueColor', 'Uncheck', 'Undo', 'Union', 'Unit', 'Until', 'URL',
+ 'Use', 'User', 'UserBrowse', 'UserClose', 'UserDisplayMap',
+ 'UserEdit', 'UserMap', 'UserRemoveMap', 'Value', 'Variable',
+ 'Vary', 'Vector', 'Versioned', 'View', 'ViewDisplayPopup',
+ 'VisibleOnly', 'VMDefault', 'VMGrid', 'VMRaster', 'Voronoi',
+ 'Warnings', 'Wedge', 'West', 'Width', 'With', 'XY', 'XYINDEX',
+ 'Yaw', 'Zoom'
+ )
+ ),
+ 'SYMBOLS' => array(
+ //Numeric/String Operators + Comparison Operators
+ '(', ')', '[', ']', '+', '-', '*', '/', '\\', '^', '&',
+ '=', '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff;', //Statements + Clauses + Data Types + Logical Operators, Geographical Operators + SQL
+ 2 => 'color: #2391af;', //Special Procedures
+ 3 => 'color: #2391af;', //Functions
+ 4 => 'color: #c635cb;', //Constants
+ 5 => 'color: #0000ff;' //Extended keywords (case sensitive)
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000;',
+ 'MULTI' => 'color: #008000;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #a31515;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #12198b;', //Table Attributes
+ 1 => 'color: #2391af;' //Data Types
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Table Attribute
+ 0 => "[\\.]{1}[a-zA-Z0-9_]+",
+ //Data Type
+ 1 => "(?xi) \\s+ as \\s+ (Alias|Brush|Date|Float|Font|Integer|Logical|Object|Pen|SmallInt|String|Symbol)"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/matlab.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/matlab.php
new file mode 100644
index 00000000..7cdd50e5
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/matlab.php
@@ -0,0 +1,227 @@
+<?php
+/*************************************************************************************
+ * matlab.php
+ * -----------
+ * Author: Florian Knorn (floz@gmx.de)
+ * Copyright: (c) 2004 Florian Knorn (http://www.florian-knorn.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/02/09
+ *
+ * Matlab M-file language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2006-03-25 (1.0.7.22)
+ * - support for the transpose operator
+ * - many keywords added
+ * - links to the matlab documentation at mathworks
+ * by: Olivier Verdier (olivier.verdier@free.fr)
+ * 2005/05/07 (1.0.0)
+ * - First Release
+ *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Matlab M',
+ 'COMMENT_SINGLE' => array(1 => '%'),
+ 'COMMENT_MULTI' => array(),
+ //Matlab Strings
+ 'COMMENT_REGEXP' => array(
+ 2 => "/(?<![\\w\\)\\]\\}\\.])('[^\\n']*?')/"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'break', 'case', 'catch', 'continue', 'elseif', 'else', 'end', 'for',
+ 'function', 'global', 'if', 'otherwise', 'persistent', 'return',
+ 'switch', 'try', 'while'
+ ),
+ 2 => array(
+ 'all','any','exist','is','logical','mislocked',
+
+ 'abs','acos','acosh','acot','acoth','acsc','acsch','airy','angle',
+ 'ans','area','asec','asech','asin','asinh','atan','atan2','atanh',
+ 'auread','autumn','auwrite','axes','axis','balance','bar','bar3',
+ 'bar3h','barh','besselh','besseli','besselj','besselk','Bessely',
+ 'beta','betainc','betaln','bicg','bicgstab','bin2dec','bitand',
+ 'bitcmp','bitget','bitmax','bitor','bitset','bitshift','bitxor',
+ 'blkdiag','bone','box','brighten','builtin','bwcontr','calendar',
+ 'camdolly','camlight','camlookat','camorbit','campan','campos',
+ 'camproj','camroll','camtarget','camup','camva','camzoom','capture',
+ 'cart2pol','cart2sph','cat','caxis','cdf2rdf','ceil','cell',
+ 'cell2struct','celldisp','cellfun','cellplot','cellstr','cgs',
+ 'char','chol','cholinc','cholupdate','cla','clabel','class','clc',
+ 'clf','clg','clock','close','colmmd','colorbar','colorcube',
+ 'colordef','colormap','colperm','comet','comet3','compan','compass',
+ 'complex','computer','cond','condeig','condest','coneplot','conj',
+ 'contour','contourc','contourf','contourslice','contrast','conv',
+ 'conv2','convhull','cool','copper','copyobj','corrcoef','cos',
+ 'cosh','cot','coth','cov','cplxpair','cputime','cross','csc','csch',
+ 'cumprod','cumsum','cumtrapz','cylinder','daspect','date','datenum',
+ 'datestr','datetick','datevec','dbclear','dbcont','dbdown',
+ 'dblquad','dbmex','dbquit','dbstack','dbstatus','dbstep','dbstop',
+ 'dbtype','dbup','deblank','dec2bin','dec2hex','deconv','del2',
+ 'delaunay','det','diag','dialog','diff','diffuse','dlmread',
+ 'dlmwrite','dmperm','double','dragrect','drawnow','dsearch','eig',
+ 'eigs','ellipj','ellipke','eomday','eps','erf','erfc','erfcx',
+ 'erfiny','error','errorbar','errordlg','etime','eval','evalc',
+ 'evalin','exp','expint','expm','eye','ezcontour','ezcontourf',
+ 'ezmesh','ezmeshc','ezplot','ezplot3','ezpolar','ezsurf','ezsurfc',
+ 'factor','factorial','fclose','feather','feof','ferror','feval',
+ 'fft','fft2','fftshift','fgetl','fgets','fieldnames','figure',
+ 'fill','fill3','filter','filter2','find','findfigs','findobj',
+ 'findstr','fix','flag','flipdim','fliplr','flipud','floor','flops',
+ 'fmin','fmins','fopen','fplot','fprintf','fread','frewind','fscanf',
+ 'fseek','ftell','full','funm','fwrite','fzero','gallery','gamma',
+ 'gammainc','gammaln','gca','gcbo','gcd','gcf','gco','get',
+ 'getfield','ginput','gmres','gradient','gray','graymon','grid',
+ 'griddata','gsvd','gtext','hadamard','hankel','hdf','helpdlg',
+ 'hess','hex2dec','hex2num','hidden','hilb','hist','hold','hot',
+ 'hsv','hsv2rgb','i','ifft','ifft2','ifftn','ifftshift','imag',
+ 'image','imfinfo','imread','imwrite','ind2sub','Inf','inferiorto',
+ 'inline','inpolygon','input','inputdlg','inputname','int16',
+ 'int2str','int32','int8','interp1','interp2','interp3','interpft',
+ 'interpn','intersect','inv','invhilb','ipermute','isa','ishandle',
+ 'ismember','isocaps','isonormals','isosurface','j','jet','keyboard',
+ 'lcm','legend','legendre','light','lighting','lightingangle',
+ 'lin2mu','line','lines','linspace','listdlg','loadobj','log',
+ 'log10','log2','loglog','logm','logspace','lower','lscov','lu',
+ 'luinc','magic','mat2str','material','max','mean','median','menu',
+ 'menuedit','mesh','meshc','meshgrid','min','mod','msgbox','mu2lin',
+ 'NaN','nargchk','nargin','nargout','nchoosek','ndgrid','ndims',
+ 'newplot','nextpow2','nnls','nnz','nonzeros','norm','normest','now',
+ 'null','num2cell','num2str','nzmax','ode113,','ode15s,','ode23s,',
+ 'ode23t,','ode23tb','ode45,','odefile','odeget','odeset','ones',
+ 'orient','orth','pagedlg','pareto','pascal','patch','pause',
+ 'pbaspect','pcg','pcolor','peaks','perms','permute','pi','pie',
+ 'pie3','pinv','plot','plot3','plotmatrix','plotyy','pol2cart',
+ 'polar','poly','polyarea','polyder','polyeig','polyfit','polyval',
+ 'polyvalm','pow2','primes','print','printdlg','printopt','prism',
+ 'prod','propedit','qmr','qr','qrdelete','qrinsert','qrupdate',
+ 'quad','questdlg','quiver','quiver3','qz','rand','randn','randperm',
+ 'rank','rat','rats','rbbox','rcond','real','realmax','realmin',
+ 'rectangle','reducepatch','reducevolume','refresh','rem','repmat',
+ 'reset','reshape','residue','rgb2hsv','rgbplot','ribbon','rmfield',
+ 'roots','rose','rot90','rotate','rotate3d','round','rref',
+ 'rrefmovie','rsf2csf','saveobj','scatter','scatter3','schur',
+ 'script','sec','sech','selectmoveresize','semilogx','semilogy',
+ 'set','setdiff','setfield','setxor','shading','shg','shiftdim',
+ 'shrinkfaces','sign','sin','single','sinh','slice','smooth3','sort',
+ 'sortrows','sound','soundsc','spalloc','sparse','spconvert',
+ 'spdiags','specular','speye','spfun','sph2cart','sphere','spinmap',
+ 'spline','spones','spparms','sprand','sprandn','sprandsym','spring',
+ 'sprintf','sqrt','sqrtm','squeeze','sscanf','stairs','std','stem',
+ 'stem3','str2double','str2num','strcat','strcmp','strcmpi',
+ 'stream2','stream3','streamline','strings','strjust','strmatch',
+ 'strncmp','strrep','strtok','struct','struct2cell','strvcat',
+ 'sub2ind','subplot','subspace','subvolume','sum','summer',
+ 'superiorto','surf','surf2patch','surface','surfc','surfl',
+ 'surfnorm','svd','svds','symmmd','symrcm','symvar','tan','tanh',
+ 'texlabel','text Create','textread','textwrap','tic','title','toc',
+ 'toeplitz','trace','trapz','tril','trimesh','trisurf','triu',
+ 'tsearch','uicontext Create','uicontextmenu','uicontrol',
+ 'uigetfile','uimenu','uint32','uint8','uiputfile','uiresume',
+ 'uisetcolor','uisetfont','uiwait Used','union','unique','unwrap',
+ 'upper','var','varargin','varargout','vectorize','view','viewmtx',
+ 'voronoi','waitbar','waitforbuttonpress','warndlg','warning',
+ 'waterfall','wavread','wavwrite','weekday','whitebg','wilkinson',
+ 'winter','wk1read','wk1write','xlabel','xlim','ylabel','ylim',
+ 'zeros','zlabel','zlim','zoom',
+ //'[Keywords 6]',
+ 'addpath','cd','clear','copyfile','delete','diary','dir','disp',
+ 'doc','docopt','echo','edit','fileparts','format','fullfile','help',
+ 'helpdesk','helpwin','home','inmem','lasterr','lastwarn','length',
+ 'load','lookfor','ls','matlabrc','matlabroot','mkdir','mlock',
+ 'more','munlock','open','openvar','pack','partialpath','path',
+ 'pathtool','profile','profreport','pwd','quit','rmpath','save',
+ 'saveas','size','tempdir','tempname','type','ver','version','web',
+ 'what','whatsnew','which','who','whos','workspace'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '...'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ //3 => false,
+ //4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000FF;',
+ 2 => 'color: #0000FF;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #228B22;',
+ 2 => 'color:#A020F0;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'STRINGS' => array(
+ //0 => 'color: #A020F0;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #33f;'
+ ),
+ 'METHODS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #33f;'
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => 'http://www.mathworks.com/access/helpdesk/help/techdoc/ref/{FNAMEL}.html'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ //Complex numbers
+ 0 => '(?<![\\w\\/])[+-]?[\\d]*([\\d]\\.|\\.[\\d])?[\\d]*[ij](?![\\w]|\<DOT>html)'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mirc.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mirc.php
new file mode 100644
index 00000000..fa2f307e
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mirc.php
@@ -0,0 +1,171 @@
+<?php
+/*************************************************************************************
+ * mirc.php
+ * -----
+ * Author: Alberto 'Birckin' de Areba (Birckin@hotmail.com)
+ * Copyright: (c) 2006 Alberto de Areba
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/05/29
+ *
+ * mIRC Scripting language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2006/05/29 (1.0.0)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'mIRC Scripting',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'alias', 'menu', 'dialog',
+ ),
+ 2 => array(
+ 'if', 'elseif', 'else', 'while', 'return', 'goto', 'var'
+ ),
+ 3 => array(
+ 'action','ajinvite','amsg','ame','anick','aop','auser',
+ 'avoice','auto','autojoin','away','background','ban','beep',
+ 'channel','clear','clearall','clipboard','close','closemsg','color',
+ 'copy','creq','ctcp','ctcpreply','ctcps','dcc','dde','ddeserver',
+ 'debug','describe','disable','disconnect','dlevel','dll','dns',
+ 'dqwindow','ebeeps','echo','editbox','emailaddr','enable','events',
+ 'exit','filter','findtext','finger','flash','flood','flush',
+ 'flushini','font','fsend','fserve','fullname','ghide','gload',
+ 'gmove','gopts','gplay','gpoint','gqreq','groups','gshow','gsize',
+ 'gstop','gtalk','gunload','guser','help','hop','ignore','invite',
+ 'join','kick','linesep','links','list','load','loadbuf','localinfo',
+ 'log','me','mdi','mkdir','mnick','mode','msg','names','nick','noop',
+ 'notice','notify','omsg','onotice','part','partall','pdcc',
+ 'perform','ping','play','pop','protect','pvoice','qmsg','qme',
+ 'query','queryrn','quit','raw','remini','remote','remove','rename',
+ 'enwin','resetidle','rlevel','rmdir','run','ruser','save','savebuf',
+ 'saveini','say','server','showmirc','sline','sound','speak','splay',
+ 'sreq','strip','time',
+ //'timer[N/name]', //Handled as a regular expression below ...
+ 'timers','timestamp','titlebar','tnick','tokenize','topic','ulist',
+ 'unload','updatenl','url','uwho','window','winhelp','write',
+ 'writeini','who','whois','whowas'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '/'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #994444;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #990000; font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #FF0000;',
+ ),
+ 'STRINGS' => array(
+ ),
+ 'NUMBERS' => array(
+ 0 => '',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #FF0000;',
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #000099;',
+ 1 => 'color: #990000;',
+ 2 => 'color: #000099;',
+ 3 => 'color: #888800;',
+ 4 => 'color: #888800;',
+ 5 => 'color: #000099;',
+ 6 => 'color: #990000; font-weight: bold;',
+ 7 => 'color: #990000; font-weight: bold;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.mirc.com/{FNAMEL}'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array('.'),
+ 'REGEXPS' => array(
+ //Variable names
+ 0 => '\$[a-zA-Z0-9]+',
+ //Variable names
+ 1 => '(%|&amp;)[\w\x80-\xFE]+',
+ //Client to Client Protocol handling
+ 2 => '(on|ctcp) (!|@|&amp;)?(\d|\*):[a-zA-Z]+:',
+ /*4 => array(
+ GESHI_SEARCH => '((on|ctcp) (!|@|&)?(\d|\*):(Action|Active|Agent|AppActive|Ban|Chat|Close|Connect|Ctcp|CtcpReply|DccServer|DeHelp|DeOp|DeVoice|Dialog|Dns|Error|Exit|FileRcvd|FileSent|GetFail|Help|Hotlink|Input|Invite|Join|KeyDown|KeyUp|Kick|Load|Logon|MidiEnd|Mode|Mp3End|Nick|NoSound|Notice|Notify|Op|Open|Part|Ping|Pong|PlayEnd|Quit|Raw|RawMode|SendFail|Serv|ServerMode|ServerOp|Signal|Snotice|Start|Text|Topic|UnBan|Unload|Unotify|User|Mode|Voice|Wallops|WaveEnd):)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),*/
+ //Channel names
+ 3 => '(#|@)[a-zA-Z0-9]+',
+ 4 => '-[a-z\d]+',
+ //Raw protocol handling
+ 5 => 'raw (\d|\*):',
+ //Timer handling
+ 6 => '(?<!>|:|\/)\/timer(?!s\b)[0-9a-zA-Z_]+',
+ // /...
+ 7 => '(?<!>|:|\/|\w)\/[a-zA-Z][a-zA-Z0-9]*(?!>)'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'NUMBERS' => GESHI_NEVER
+ ),
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => '(?<![\w\$\|\#;<^&])'
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mmix.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mmix.php
new file mode 100644
index 00000000..60b6e28c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mmix.php
@@ -0,0 +1,193 @@
+<?php
+/*************************************************************************************
+ * mmix.php
+ * -------
+ * Author: Benny Baumann (BenBE@geshi.org)
+ * Copyright: (c) 2009 Benny Baumann (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/10/16
+ *
+ * MMIX Assembler language file for GeSHi.
+ *
+ * This is an implementation of the MMIX language as designed by Donald E. Knuth
+ *
+ * CHANGES
+ * -------
+ * 2004/08/05 (1.0.8.6)
+ * - First Release
+ *
+ * TODO (updated 2009/10/16)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'MMIX',
+ 'COMMENT_SINGLE' => array(1 => ';', 2 => '%'),
+ 'COMMENT_MULTI' => array(),
+ //Line address prefix suppression
+ 'COMMENT_REGEXP' => array(
+ 3 => "/^\s*(?!\s)[^\w].*$/m",
+ 4 => "/^\s*[0-9a-f]{12,16}+(?:\s+[0-9a-f]+(?:\.{3}[0-9a-f]{2,})?)?:/mi"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'NUMBERS' => array(
+ 1 => '(?<![\d\$#\w])[\da-fA-F]+(?!\w)',
+ 2 => '#[\da-fA-F]+',
+ 3 => '\$\d+'
+ ),
+ 'KEYWORDS' => array(
+ /*CPU*/
+ 1 => array(
+ '16ADDU','2ADDU','4ADDU','8ADDU','ADD','ADDU','AND','ANDN','ANDNH',
+ 'ANDNL','ANDNMH','ANDNML','BDIF','BEV','BN','BNN','BNP','BNZ','BOD',
+ 'BP','BZ','CMP','CMPU','CSEV','CSN','CSNN','CSNP','CSNZ','CSOD',
+ 'CSP','CSWAP','CSZ','DIV','DIVU','FADD','FCMP','FCMPE','FDIV',
+ 'FEQL','FEQLE','FINT','FIX','FIXU','FLOT','FLOTU','FMUL','FREM',
+ 'FSQRT','FSUB','FUN','FUNE','GET','GETA','GO','INCH','INCL','INCMH',
+ 'INCML','JMP','LDA','LDB','LDBU','LDHT','LDO','LDOU','LDSF','LDT',
+ 'LDTU','LDUNC','LDVTS','LDW','LDWU','MOR','MUL','MULU','MUX','MXOR',
+ 'NAND','NEG','NEGU','NOR','NXOR','ODIF','OR','ORH','ORL','ORMH',
+ 'ORML','ORN','PBEV','PBN','PBNN','PBNP','PBNZ','PBOD','PBP','PBZ',
+ 'POP','PREGO','PRELD','PREST','PUSHGO','PUSHJ','PUT','RESUME','SADD',
+ 'SAVE','SETH','SETL','SETMH','SETML','SFLOT','SFLOTU','SL','SLU',
+ 'SR','SRU','STB','STBU','STCO','STHT','STO','STOU','STSF','STT',
+ 'STTU','STUNC','STW','STWU','SUB','SUBU','SWYM','SYNC','SYNCD',
+ 'SYNCID','TDIF','TRAP','TRIP','UNSAVE','WDIF','XOR','ZSEV','ZSN',
+ 'ZSNN','ZSNP','ZSNZ','ZSOD','ZSP','ZSZ'
+ ),
+ 2 => array(
+ 'BSPEC','BYTE','ESPEC','GREG','IS','LOC','LOCAL','OCTA',
+ 'PREFIX','SET','TETRA','WYDE'
+ ),
+ /*registers*/
+ 3 => array(
+ 'rA','rB','rC','rD','rE','rF','rG','rH','rI','rJ','rK','rL','rM',
+ 'rN','rO','rP','rQ','rR','rS','rT','rU','rV','rW','rX','rY','rZ',
+ 'rBB','rTT','rWW','rXX','rYY','rZZ'
+ ),
+// /*Directive*/
+// 4 => array(
+// ),
+// /*Operands*/
+// 5 => array(
+// )
+ ),
+ 'SYMBOLS' => array(
+ '[', ']', '(', ')',
+ '+', '-', '*', '/', '%',
+ '.', ',', ';', ':',
+ '<<','>>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => false,
+ 3 => true,
+// 4 => false,
+// 5 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00007f; font-weight: bold;',
+ 2 => 'color: #0000ff; font-weight: bold;',
+ 3 => 'color: #00007f;',
+// 4 => 'color: #000000; font-weight: bold;',
+// 5 => 'color: #000000; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #666666; font-style: italic;',
+ 3 => 'color: #666666; font-style: italic;',
+ 4 => 'color: #adadad; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000ff;',
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #00007f;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+// 0 => 'color: #0000ff;',
+// 1 => 'color: #0000ff;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+// 4 => '',
+// 5 => ''
+ ),
+/*
+ 'NUMBERS' =>
+ GESHI_NUMBER_BIN_PREFIX_PERCENT |
+ GESHI_NUMBER_BIN_SUFFIX |
+ GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_HEX_SUFFIX |
+ GESHI_NUMBER_OCT_SUFFIX |
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F |
+ GESHI_NUMBER_FLT_SCI_ZERO,
+*/
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Hex numbers
+// 0 => /* */ "(?<=([\\s\\(\\)\\[\\],;.:+\\-\\/*]))(?:[0-9][0-9a-fA-F]{0,31}[hH]|0x[0-9a-fA-F]{1,32})(?=([\\s\\(\\)\\[\\],;.:+\\-\\/*]))",
+ //Binary numbers
+// 1 => "(?<=([\\s\\(\\)\\[\\],;.:+\\-\\/*]))[01]{1,64}[bB](?=([\\s\\(\\)\\[\\],;.:+\\-\\/*]))"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#>|^])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_<\|%])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/modula2.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/modula2.php
new file mode 100644
index 00000000..18508340
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/modula2.php
@@ -0,0 +1,136 @@
+<?php
+/****************************************************************************
+ * modula2.php
+ * -----------
+ * Author: Benjamin Kowarsch (benjamin@modula2.net)
+ * Copyright: (c) 2009 Benjamin Kowarsch (benjamin@modula2.net)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/11/05
+ *
+ * Modula-2 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/05/22 (1.0.8.8)
+ * - First Release
+ *
+ * TODO (updated 2010/05/22)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Modula-2',
+ 'COMMENT_MULTI' => array('(*' => '*)'),
+ 'COMMENT_SINGLE' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'HARDQUOTE' => array("'", "'"),
+ 'HARDESCAPE' => array("''"),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array( /* reserved words */
+ 'AND', 'ARRAY', 'BEGIN', 'BY', 'CASE', 'CONST', 'DEFINITION',
+ 'DIV', 'DO', 'ELSE', 'ELSIF', 'END', 'EXIT', 'EXPORT', 'FOR',
+ 'FROM', 'IF', 'IMPLEMENTATION', 'IMPORT', 'IN', 'LOOP', 'MOD',
+ 'MODULE', 'NOT', 'OF', 'OR', 'POINTER', 'PROCEDURE', 'QUALIFIED',
+ 'RECORD', 'REPEAT', 'RETURN', 'SET', 'THEN', 'TO', 'TYPE',
+ 'UNTIL', 'VAR', 'WHILE', 'WITH'
+ ),
+ 2 => array( /* pervasive constants */
+ 'NIL', 'FALSE', 'TRUE',
+ ),
+ 3 => array( /* pervasive types */
+ 'BITSET', 'CAP', 'CHR', 'DEC', 'DISPOSE', 'EXCL', 'FLOAT',
+ 'HALT', 'HIGH', 'INC', 'INCL', 'MAX', 'MIN', 'NEW', 'ODD', 'ORD',
+ 'SIZE', 'TRUNC', 'VAL'
+ ),
+ 4 => array( /* pervasive functions and macros */
+ 'ABS', 'BOOLEAN', 'CARDINAL', 'CHAR', 'INTEGER',
+ 'LONGCARD', 'LONGINT', 'LONGREAL', 'PROC', 'REAL'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ ',', ':', '=', '+', '-', '*', '/', '#', '~'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;',
+ 4 => 'color: #000066; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;',
+ 'HARD' => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0066ee;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => ''
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/modula3.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/modula3.php
new file mode 100644
index 00000000..ae08dcf9
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/modula3.php
@@ -0,0 +1,135 @@
+<?php
+/*************************************************************************************
+ * modula3.php
+ * ----------
+ * Author: mbishop (mbishop@esoteriq.org)
+ * Copyright: (c) 2009 mbishop (mbishop@esoteriq.org)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/01/21
+ *
+ * Modula-3 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ *
+ * TODO
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Modula-3',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array('(*' => '*)'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'HARDQUOTE' => array("'", "'"),
+ 'HARDESCAPE' => array("''"),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'AND', 'ANY', 'ARRAY', 'AS', 'BEGIN', 'BITS', 'BRANDED', 'BY', 'CASE',
+ 'CONST', 'DIV', 'DO', 'ELSE', 'ELSIF', 'END', 'EVAL', 'EXCEPT', 'EXCEPTION',
+ 'EXIT', 'EXPORTS', 'FINALLY', 'FOR', 'FROM', 'GENERIC', 'IF', 'IMPORT', 'IN',
+ 'INTERFACE', 'LOCK', 'LOOP', 'METHODS', 'MOD', 'MODULE', 'NOT', 'OBJECT', 'OF',
+ 'OR', 'OVERRIDES', 'PROCEDURE', 'RAISE', 'RAISES', 'READONLY', 'RECORD', 'REF',
+ 'REPEAT', 'RETURN', 'REVEAL', 'ROOT', 'SET', 'THEN', 'TO', 'TRY', 'TYPE', 'TYPECASE',
+ 'UNSAFE', 'UNTIL', 'UNTRACED', 'VALUE', 'VAR', 'WHILE', 'WITH'
+ ),
+ 2 => array(
+ 'NIL', 'NULL', 'FALSE', 'TRUE',
+ ),
+ 3 => array(
+ 'ABS','ADR','ADRSIZE','BITSIZE','BYTESIZE','CEILING','DEC','DISPOSE',
+ 'EXTENDED','FIRST','FLOAT','FLOOR','INC','ISTYPE','LAST','LOOPHOLE','MAX','MIN',
+ 'NARROW','NEW','NUMBER','ORD','ROUND','SUBARRAY','TRUNC','TYPECODE', 'VAL'
+ ),
+ 4 => array(
+ 'ADDRESS', 'BOOLEAN', 'CARDINAL', 'CHAR', 'INTEGER',
+ 'LONGREAL', 'MUTEX', 'REAL', 'REFANY', 'TEXT'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ ',', ':', '=', '+', '-', '*', '/', '#'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;',
+ 4 => 'color: #000066; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;',
+ 'HARD' => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0066ee;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mpasm.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mpasm.php
new file mode 100644
index 00000000..f724a941
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mpasm.php
@@ -0,0 +1,164 @@
+<?php
+/*************************************************************************************
+ * mpasm.php
+ * ---------
+ * Author: Bakalex (bakalex@gmail.com)
+ * Copyright: (c) 2004 Bakalex, Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/12/6
+ *
+ * Microchip Assembler language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2005/01/29 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2005/12/6)
+ * -------------------------
+ *
+ * For the moment, i've only added PIC16C6X registers. We need more (PIC16F/C7x/8x,
+ * PIC10, PIC18 and dsPIC registers).
+ * Must take a look to dsPIC instructions.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Microchip Assembler',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /*Directive Language*/
+ 4 => array(
+ 'CONSTANT', '#DEFINE', 'END', 'EQU', 'ERROR', 'ERROR-LEVEL', '#INCLUDE', 'LIST',
+ 'MESSG', 'NOLIST', 'ORG', 'PAGE', 'PROCESSOR', 'RADIX', 'SET', 'SPACE', 'SUBTITLE',
+ 'TITLE', '#UNDEFINE', 'VARIABLE', 'ELSE', 'ENDIF', 'ENDW', 'IF', 'IFDEF', 'IFNDEF',
+ 'WHILE', '__BADRAM', 'CBLOCK', '__CONFIG', 'DA', 'DATA', 'DB', 'DE', 'DT', 'DW',
+ 'ENDC', 'FILL', '__IDLOCS', '__MAXRAM', 'RES', 'ENDM', 'EXITM', 'EXPAND', 'LOCAL',
+ 'MACRO', 'NOEXPAND', 'BANKISEL', 'BANKSEL', 'CODE', 'EXTERN', 'GLOBAL', 'IDATA',
+ 'PAGESEL', 'UDATA', 'UDATA_ACS', 'UDATA_OVR', 'UDATA_SHR'
+ ),
+ /* 12&14-bit Specific Instruction Set*/
+ 1 => array(
+ 'andlw', 'call', 'clrwdt', 'goto', 'iorlw', 'movlw', 'option', 'retlw', 'sleep',
+ 'tris', 'xorlw', 'addwf', 'andwf', 'clrf', 'clrw', 'comf', 'decf', 'decfsz', 'incf',
+ 'incfsz', 'iorwf', 'movf', 'nop', 'rlf', 'rrf', 'subwf', 'swapf', 'xorwf',
+ 'bcf', 'bsf', 'btfsc', 'btfss',
+ 'addlw', 'retfie', 'return', 'sublw', 'addcf', 'adddcf', 'b', 'bc', 'bdc',
+ 'bnc', 'bndc', 'bnz', 'bz', 'clrc', 'clrdc', 'clrz', 'lcall', 'lgoto', 'movfw',
+ 'negf', 'setc', 'setdc', 'setz', 'skpc', 'skpdc', 'skpnc', 'skpndc', 'skpnz', 'skpz',
+ 'subcf', 'subdcf', 'tstf'
+ ),
+ /* 16-bit Specific Instructiob Set */
+ 2 => array (
+ 'movfp', 'movlb', 'movlp', 'movpf', 'movwf', 'tablrd', 'tablwt', 'tlrd', 'tlwt',
+ 'addwfc', 'daw', 'mullw', 'negw', 'rlcf', 'rlncf', 'rrcf', 'rrncf', 'setf', 'subwfb',
+ 'btg', 'cpfseq', 'cpfsgt', 'cpfslt', 'dcfsnz', 'infsnz', 'tstfsz', 'lfsr', 'bnn',
+ 'bnov', 'bra', 'pop', 'push', 'rcall', 'reset'
+ ),
+ /* Registers */
+ 3 => array(
+ 'INDF', 'TMR0', 'PCL', 'STATUS', 'FSR', 'PORTA', 'PORTB', 'PORTC', 'PORTD', 'PORTE',
+ 'PCLATH', 'INTCON', 'PIR1', 'PIR2', 'TMR1L', 'TMR1H', 'T1CON', 'TMR2', 'T2CON', 'TMR2L',
+ 'TMR2H', 'TMR0H', 'TMR0L', 'SSPBUF', 'SSPCON', 'CCPR1L', 'CCPR1H', 'CCP1CON', 'RCSTA',
+ 'TXREG', 'RCREG', 'CCPR2L', 'CCPR2H', 'CCP2CON', 'OPTION', 'TRISA', 'TRISB', 'TRISC',
+ 'TRISD', 'TRISE', 'PIE2', 'PIE1', 'PR2', 'SSPADD', 'SSPSTAT', 'TXSTA', 'SPBRG'
+ ),
+ /*Operands*/
+ 5 => array(
+ 'high','low'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '[', ']', '(', ')'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00007f;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #007f00;',
+ 4 => 'color: #46aa03; font-weight:bold;',
+ 5 => 'color: #7f0000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #ff0000;',
+ 1 => 'color: #ff0000;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Hex numbers
+ 0 => '[0-9a-fA-F]{1,32}[hH]',
+ //Binary numbers
+ 1 => '[01]{1,64}[bB]'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mxml.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mxml.php
new file mode 100644
index 00000000..0cc8287a
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mxml.php
@@ -0,0 +1,145 @@
+<?php
+/*************************************************************************************
+ * mxml.php
+ * -------
+ * Author: David Spurr
+ * Copyright: (c) 2007 David Spurr (http://www.defusion.org.uk/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/10/04
+ *
+ * MXML language file for GeSHi. Based on the XML file by Nigel McNie
+ *
+ * CHANGES
+ * -------
+ * 2007/10/04 (1.0.7.22)
+ * - First Release
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'MXML',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array('<!--' => '-->'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SCRIPT' => array(
+ 0 => 'color: #00bbdd;',
+ 1 => 'color: #ddbb00;',
+ 2 => 'color: #339933;',
+ 3 => 'color: #000000;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'font-weight: bold; color: black;',
+ 1 => 'color: #7400FF;',
+ 2 => 'color: #7400FF;'
+ )
+ ),
+ 'URLS' => array(
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ // xml declaration
+ 0 => array(
+ GESHI_SEARCH => '(&lt;[\/?|(\?xml)]?[a-z0-9_\-:]*(\?&gt;))',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ // opening tags
+ 1 => array(
+ GESHI_SEARCH => '(&lt;\/?[a-z]+:[a-z]+)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ // closing tags
+ 2 => array(
+ GESHI_SEARCH => '(\/?&gt;)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_ALWAYS,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<!DOCTYPE' => '>'
+ ),
+ 1 => array(
+ '&' => ';'
+ ),
+ 2 => array(
+ //'<![CDATA[' => ']]>'
+ '<mx:Script>' => '</mx:Script>'
+ ),
+ 3 => array(
+ '<' => '>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => false,
+ 1 => false,
+ 2 => false,
+ 3 => true
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mysql.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mysql.php
new file mode 100644
index 00000000..507da2d0
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/mysql.php
@@ -0,0 +1,475 @@
+<?php
+/*************************************************************************************
+ * mysql.php
+ * ---------
+ * Author: Marjolein Katsma (marjolein.is.back@gmail.com)
+ * Copyright: (c) 2008 Marjolein Katsma (http://blog.marjoleinkatsma.com/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008-12-12
+ *
+ * MySQL language file for GeSHi.
+ *
+ * Based on original MySQL language file by Carl Fürstenberg (2004); brought
+ * up-to-date for current MySQL versions, and with more classes for different
+ * types of keywords; several minor errors were corrected as well.
+ *
+ * Some "classes" have two groups here: this is to allow for the fact that some
+ * keywords in MySQL have a double function: many of those are either a function
+ * (must be immediately followed by an opening bracket) or some other keyword:
+ * so they can be distinguished by the presence (or not) of that opening bracket.
+ * (An immediately following opening bracket is a default rule for functions in
+ * MySQL, though this may be overridden; because it's only a default, we use a
+ * regex lookahead only where necessary to distinguish homonyms, not generally
+ * to match any function.)
+ * Other keywords with double usage cannot be distinguished and are classified
+ * in the "Mix" category.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'MySQL',
+ //'COMMENT_SINGLE' => array(1 =>'--', 2 => '#'), // '--' MUST be folowed by whitespace,not necessarily a space
+ 'COMMENT_SINGLE' => array(
+ 1 =>'-- ',
+ 2 => '#'
+ ),
+ 'COMMENT_REGEXP' => array(
+ 1 => "/(?:--\s).*?$/", // double dash followed by any whitespace
+ ),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE, // @@@ would be nice if this could be defined per group!
+ 'QUOTEMARKS' => array("'", '"', '`'),
+ 'ESCAPE_CHAR' => '\\', // by default only, can be specified
+ 'ESCAPE_REGEXP' => array(
+ 1 => "/[_%]/", // search wildcards
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_OCT_PREFIX |
+ GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_SCI_SHORT |
+ GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ // Mix: statement keywords and keywords that don't fit in any other
+ // category, or have multiple usage/meanings
+ 'ACTION','ADD','AFTER','ALGORITHM','ALL','ALTER','ANALYZE','ANY',
+ 'ASC','AS','BDB','BEGIN','BERKELEYDB','BINARY','BTREE','CALL',
+ 'CASCADED','CASCADE','CHAIN','CHANGE','CHECK','COLUMNS','COLUMN',
+ 'COMMENT','COMMIT','COMMITTED','CONSTRAINT','CONTAINS SQL',
+ 'CONSISTENT','CONVERT','CREATE','CROSS','DATA','DATABASES',
+ 'DECLARE','DEFINER','DELAYED','DELETE','DESCRIBE','DESC',
+ 'DETERMINISTIC','DISABLE','DISCARD','DISTINCTROW','DISTINCT','DO',
+ 'DROP','DUMPFILE','DUPLICATE KEY','ENABLE','ENCLOSED BY','ENGINE',
+ 'ERRORS','ESCAPED BY','EXISTS','EXPLAIN','EXTENDED','FIELDS',
+ 'FIRST','FOR EACH ROW','FORCE','FOREIGN KEY','FROM','FULL',
+ 'FUNCTION','GLOBAL','GRANT','GROUP BY','HANDLER','HASH','HAVING',
+ 'HELP','HIGH_PRIORITY','IF NOT EXISTS','IGNORE','IMPORT','INDEX',
+ 'INFILE','INNER','INNODB','INOUT','INTO','INVOKER',
+ 'ISOLATION LEVEL','JOIN','KEYS','KEY','KILL','LANGUAGE SQL','LAST',
+ 'LIMIT','LINES','LOAD','LOCAL','LOCK','LOW_PRIORITY',
+ 'MASTER_SERVER_ID','MATCH','MERGE','MIDDLEINT','MODIFIES SQL DATA',
+ 'MODIFY','MRG_MYISAM','NATURAL','NEXT','NO SQL','NO','ON',
+ 'OPTIMIZE','OPTIONALLY','OPTION','ORDER BY','OUTER','OUTFILE','OUT',
+ 'PARTIAL','PARTITION','PREV','PRIMARY KEY','PRIVILEGES','PROCEDURE',
+ 'PURGE','QUICK','READS SQL DATA','READ','REFERENCES','RELEASE',
+ 'RENAME','REORGANIZE','REPEATABLE','REQUIRE','RESTRICT','RETURNS',
+ 'REVOKE','ROLLBACK','ROUTINE','RTREE','SAVEPOINT','SELECT',
+ 'SERIALIZABLE','SESSION','SET','SHARE MODE','SHOW','SIMPLE',
+ 'SNAPSHOT','SOME','SONAME','SQL SECURITY','SQL_BIG_RESULT',
+ 'SQL_BUFFER_RESULT','SQL_CACHE','SQL_CALC_FOUND_ROWS',
+ 'SQL_NO_CACHE','SQL_SMALL_RESULT','SSL','START','STARTING BY',
+ 'STATUS','STRAIGHT_JOIN','STRIPED','TABLESPACE','TABLES','TABLE',
+ 'TEMPORARY','TEMPTABLE','TERMINATED BY','TO','TRANSACTIONS',
+ 'TRANSACTION','TRIGGER','TYPES','TYPE','UNCOMMITTED','UNDEFINED',
+ 'UNION','UNLOCK_TABLES','UPDATE','USAGE','USE','USER_RESOURCES',
+ 'USING','VALUES','VALUE','VIEW','WARNINGS','WHERE','WITH ROLLUP',
+ 'WITH','WORK','WRITE',
+ ),
+ 2 => array( //No ( must follow
+ // Mix: statement keywords distinguished from functions by the same name
+ "CURRENT_USER", "DATABASE", "IN", "INSERT", "DEFAULT", "REPLACE", "SCHEMA", "TRUNCATE"
+ ),
+ 3 => array(
+ // Values (Constants)
+ 'FALSE','NULL','TRUE',
+ ),
+ 4 => array(
+ // Column Data Types
+ 'BIGINT','BIT','BLOB','BOOLEAN','BOOL','CHARACTER VARYING',
+ 'CHAR VARYING','DATETIME','DECIMAL','DEC','DOUBLE PRECISION',
+ 'DOUBLE','ENUM','FIXED','FLOAT','GEOMETRYCOLLECTION','GEOMETRY',
+ 'INTEGER','INT','LINESTRING','LONGBLOB','LONGTEXT','MEDIUMBLOB',
+ 'MEDIUMINT','MEDIUMTEXT','MULTIPOINT','MULTILINESTRING',
+ 'MULTIPOLYGON','NATIONAL CHARACTER','NATIONAL CHARACTER VARYING',
+ 'NATIONAL CHAR VARYING','NATIONAL VARCHAR','NCHAR VARCHAR','NCHAR',
+ 'NUMERIC','POINT','POLYGON','REAL','SERIAL',
+ 'SMALLINT','TEXT','TIMESTAMP','TINYBLOB','TINYINT',
+ 'TINYTEXT','VARBINARY','VARCHARACTER','VARCHAR',
+ ),
+ 5 => array( //No ( must follow
+ // Column data types distinguished from functions by the same name
+ "CHAR", "DATE", "TIME"
+ ),
+ 6 => array(
+ // Table, Column & Index Attributes
+ 'AUTO_INCREMENT','AVG_ROW_LENGTH','BOTH','CHECKSUM','CONNECTION',
+ 'DATA DIRECTORY','DEFAULT NULL','DELAY_KEY_WRITE','FULLTEXT',
+ 'INDEX DIRECTORY','INSERT_METHOD','LEADING','MAX_ROWS','MIN_ROWS',
+ 'NOT NULL','PACK_KEYS','ROW_FORMAT','SERIAL DEFAULT VALUE','SIGNED',
+ 'SPATIAL','TRAILING','UNIQUE','UNSIGNED','ZEROFILL'
+ ),
+ 7 => array( //No ( must follow
+ // Column attribute distinguished from function by the same name
+ "CHARSET"
+ ),
+ 8 => array(
+ // Date and Time Unit Specifiers
+ 'DAY_HOUR','DAY_MICROSECOND','DAY_MINUTE','DAY_SECOND',
+ 'HOUR_MICROSECOND','HOUR_MINUTE','HOUR_SECOND',
+ 'MINUTE_MICROSECOND','MINUTE_SECOND',
+ 'SECOND_MICROSECOND','YEAR_MONTH'
+ ),
+ 9 => array( //No ( must follow
+ // Date-time unit specifiers distinguished from functions by the same name
+ "DAY", "HOUR", "MICROSECOND", "MINUTE", "MONTH", "QUARTER", "SECOND", "WEEK", "YEAR"
+ ),
+ 10 => array(
+ // Operators (see also Symbols)
+ 'AND','BETWEEN','CHARACTER SET','COLLATE','DIV','IS NOT NULL',
+ 'IS NOT','IS NULL','IS','LIKE','NOT','OFFSET','OR','REGEXP','RLIKE',
+ 'SOUNDS LIKE','XOR'
+ ),
+ 11 => array( //No ( must follow
+ // Operator distinghuished from function by the same name
+ "INTERVAL"
+ ),
+ 12 => array(
+ // Control Flow (functions)
+ 'CASE','ELSE','END','IFNULL','IF','NULLIF','THEN','WHEN',
+ ),
+ 13 => array(
+ // String Functions
+ 'ASCII','BIN','BIT_LENGTH','CHAR_LENGTH','CHARACTER_LENGTH',
+ 'CONCAT_WS','CONCAT','ELT','EXPORT_SET','FIELD',
+ 'FIND_IN_SET','FORMAT','HEX','INSTR','LCASE','LEFT','LENGTH',
+ 'LOAD_FILE','LOCATE','LOWER','LPAD','LTRIM','MAKE_SET','MID',
+ 'OCTET_LENGTH','ORD','POSITION','QUOTE','REPEAT','REVERSE',
+ 'RIGHT','RPAD','RTRIM','SOUNDEX','SPACE','STRCMP','SUBSTRING_INDEX',
+ 'SUBSTRING','TRIM','UCASE','UNHEX','UPPER',
+ ),
+ 14 => array( //A ( must follow
+ // String functions distinguished from other keywords by the same name
+ "INSERT", "REPLACE", "CHAR"
+ ),
+ 15 => array(
+ // Numeric Functions
+ 'ABS','ACOS','ASIN','ATAN2','ATAN','CEILING','CEIL',
+ 'CONV','COS','COT','CRC32','DEGREES','EXP','FLOOR','LN','LOG10',
+ 'LOG2','LOG','MOD','OCT','PI','POWER','POW','RADIANS','RAND',
+ 'ROUND','SIGN','SIN','SQRT','TAN',
+ ),
+ 16 => array( //A ( must follow
+ // Numeric function distinguished from other keyword by the same name
+ "TRUNCATE"
+ ),
+ 17 => array(
+ // Date and Time Functions
+ 'ADDDATE','ADDTIME','CONVERT_TZ','CURDATE','CURRENT_DATE',
+ 'CURRENT_TIME','CURRENT_TIMESTAMP','CURTIME','DATE_ADD',
+ 'DATE_FORMAT','DATE_SUB','DATEDIFF','DAYNAME','DAYOFMONTH',
+ 'DAYOFWEEK','DAYOFYEAR','EXTRACT','FROM_DAYS','FROM_UNIXTIME',
+ 'GET_FORMAT','LAST_DAY','LOCALTIME','LOCALTIMESTAMP','MAKEDATE',
+ 'MAKETIME','MONTHNAME','NOW','PERIOD_ADD',
+ 'PERIOD_DIFF','SEC_TO_TIME','STR_TO_DATE','SUBDATE','SUBTIME',
+ 'SYSDATE','TIME_FORMAT','TIME_TO_SEC',
+ 'TIMESTAMPADD','TIMESTAMPDIFF','TO_DAYS',
+ 'UNIX_TIMESTAMP','UTC_DATE','UTC_TIME','UTC_TIMESTAMP','WEEKDAY',
+ 'WEEKOFYEAR','YEARWEEK',
+ ),
+ 18 => array( //A ( must follow
+ // Date-time functions distinguished from other keywords by the same name
+ "DATE", "DAY", "HOUR", "MICROSECOND", "MINUTE", "MONTH", "QUARTER",
+ "SECOND", "TIME", "WEEK", "YEAR"
+ ),
+ 19 => array(
+ // Comparison Functions
+ 'COALESCE','GREATEST','ISNULL','LEAST',
+ ),
+ 20 => array( //A ( must follow
+ // Comparison functions distinguished from other keywords by the same name
+ "IN", "INTERVAL"
+ ),
+ 21 => array(
+ // Encryption and Compression Functions
+ 'AES_DECRYPT','AES_ENCRYPT','COMPRESS','DECODE','DES_DECRYPT',
+ 'DES_ENCRYPT','ENCODE','ENCRYPT','MD5','OLD_PASSWORD','PASSWORD',
+ 'SHA1','SHA','UNCOMPRESS','UNCOMPRESSED_LENGTH',
+ ),
+ 22 => array(
+ // GROUP BY (aggregate) Functions
+ 'AVG','BIT_AND','BIT_OR','BIT_XOR','COUNT','GROUP_CONCAT',
+ 'MAX','MIN','STDDEV_POP','STDDEV_SAMP','STDDEV','STD','SUM',
+ 'VAR_POP','VAR_SAMP','VARIANCE',
+ ),
+ 23 => array(
+ // Information Functions
+ 'BENCHMARK','COERCIBILITY','COLLATION','CONNECTION_ID',
+ 'FOUND_ROWS','LAST_INSERT_ID','ROW_COUNT',
+ 'SESSION_USER','SYSTEM_USER','USER','VERSION',
+ ),
+ 24 => array( //A ( must follow
+ // Information functions distinguished from other keywords by the same name
+ "CURRENT_USER", "DATABASE", "SCHEMA", "CHARSET"
+ ),
+ 25 => array(
+ // Miscellaneous Functions
+ 'ExtractValue','BIT_COUNT','GET_LOCK','INET_ATON','INET_NTOA',
+ 'IS_FREE_LOCK','IS_USED_LOCK','MASTER_POS_WAIT','NAME_CONST',
+ 'RELEASE_LOCK','SLEEP','UpdateXML','UUID',
+ ),
+ 26 => array( //A ( must follow
+ // Miscellaneous function distinguished from other keyword by the same name
+ "DEFAULT"
+ ),
+ 27 => array(
+ // Geometry Functions
+ 'Area','AsBinary','AsText','AsWKB','AsWKT','Boundary','Buffer',
+ 'Centroid','Contains','ConvexHull','Crosses',
+ 'Difference','Dimension','Disjoint','Distance',
+ 'EndPoint','Envelope','Equals','ExteriorRing',
+ 'GLength','GeomCollFromText','GeomCollFromWKB','GeomFromText',
+ 'GeomFromWKB','GeometryCollectionFromText',
+ 'GeometryCollectionFromWKB','GeometryFromText','GeometryFromWKB',
+ 'GeometryN','GeometryType',
+ 'InteriorRingN','Intersection','Intersects','IsClosed','IsEmpty',
+ 'IsRing','IsSimple',
+ 'LineFromText','LineFromWKB','LineStringFromText',
+ 'LineStringFromWKB',
+ 'MBRContains','MBRDisjoint','MBREqual','MBRIntersects',
+ 'MBROverlaps','MBRTouches','MBRWithin','MLineFromText',
+ 'MLineFromWKB','MPointFromText','MPointFromWKB','MPolyFromText',
+ 'MPolyFromWKB','MultiLineStringFromText','MultiLineStringFromWKB',
+ 'MultiPointFromText','MultiPointFromWKB','MultiPolygonFromText',
+ 'MultiPolygonFromWKB',
+ 'NumGeometries','NumInteriorRings','NumPoints',
+ 'Overlaps',
+ 'PointFromText','PointFromWKB','PointN','PointOnSurface',
+ 'PolyFromText','PolyFromWKB','PolygonFromText','PolygonFromWKB',
+ 'Related','SRID','StartPoint','SymDifference',
+ 'Touches',
+ 'Union',
+ 'Within',
+ 'X',
+ 'Y',
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ /* Operators */
+ '=', ':=', // assignment operators
+ '||', '&&', '!', // locical operators
+ '=', '<=>', '>=', '>', '<=', '<', '<>', '!=', // comparison operators
+ '|', '&', '^', '~', '<<', '>>', // bitwise operators
+ '-', '+', '*', '/', '%', // numerical operators
+ ),
+ 2 => array(
+ /* Other syntactical symbols */
+ '(', ')',
+ ',', ';',
+ ),
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ 8 => false,
+ 9 => false,
+ 10 => false,
+ 11 => false,
+ 12 => false,
+ 13 => false,
+ 13 => false,
+ 14 => false,
+ 15 => false,
+ 16 => false,
+ 17 => false,
+ 18 => false,
+ 19 => false,
+ 20 => false,
+ 21 => false,
+ 22 => false,
+ 23 => false,
+ 24 => false,
+ 25 => false,
+ 26 => false,
+ 27 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #990099; font-weight: bold;', // mix
+ 2 => 'color: #990099; font-weight: bold;', // mix
+ 3 => 'color: #9900FF; font-weight: bold;', // constants
+ 4 => 'color: #999900; font-weight: bold;', // column data types
+ 5 => 'color: #999900; font-weight: bold;', // column data types
+ 6 => 'color: #FF9900; font-weight: bold;', // attributes
+ 7 => 'color: #FF9900; font-weight: bold;', // attributes
+ 8 => 'color: #9900FF; font-weight: bold;', // date-time units
+ 9 => 'color: #9900FF; font-weight: bold;', // date-time units
+
+ 10 => 'color: #CC0099; font-weight: bold;', // operators
+ 11 => 'color: #CC0099; font-weight: bold;', // operators
+
+ 12 => 'color: #009900;', // control flow (functions)
+ 13 => 'color: #000099;', // string functions
+ 14 => 'color: #000099;', // string functions
+ 15 => 'color: #000099;', // numeric functions
+ 16 => 'color: #000099;', // numeric functions
+ 17 => 'color: #000099;', // date-time functions
+ 18 => 'color: #000099;', // date-time functions
+ 19 => 'color: #000099;', // comparison functions
+ 20 => 'color: #000099;', // comparison functions
+ 21 => 'color: #000099;', // encryption functions
+ 22 => 'color: #000099;', // aggregate functions
+ 23 => 'color: #000099;', // information functions
+ 24 => 'color: #000099;', // information functions
+ 25 => 'color: #000099;', // miscellaneous functions
+ 26 => 'color: #000099;', // miscellaneous functions
+ 27 => 'color: #00CC00;', // geometry functions
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'color: #808000; font-style: italic;',
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #004000; font-weight: bold;',
+ 1 => 'color: #008080; font-weight: bold;' // search wildcards
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #FF00FF;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #008080;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #CC0099;', // operators
+ 2 => 'color: #000033;', // syntax
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 2 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 3 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 4 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 5 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 6 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 7 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 8 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+ 9 => 'http://search.oracle.com/search/search?group=MySQL&amp;q={FNAME}',
+
+ 10 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/non-typed-operators.html',
+ 11 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/non-typed-operators.html',
+
+ 12 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/control-flow-functions.html',
+ 13 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/string-functions.html',
+ 14 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/string-functions.html',
+ 15 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/numeric-functions.html',
+ 16 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/numeric-functions.html',
+ 17 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/date-and-time-functions.html',
+ 18 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/date-and-time-functions.html',
+ 19 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/comparison-operators.html',
+ 20 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/comparison-operators.html',
+ 21 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/encryption-functions.html',
+ 22 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/group-by-functions-and-modifiers.html',
+ 23 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/information-functions.html',
+ 24 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/information-functions.html',
+ 25 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/func-op-summary-ref.html',
+ 26 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/func-op-summary-ref.html',
+ 27 => 'http://dev.mysql.com/doc/refman/%35%2E%31/en/analysing-spatial-information.html',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 2 => array(
+ 'DISALLOWED_AFTER' => '(?![\(\w])'
+ ),
+ 5 => array(
+ 'DISALLOWED_AFTER' => '(?![\(\w])'
+ ),
+ 7 => array(
+ 'DISALLOWED_AFTER' => '(?![\(\w])'
+ ),
+ 9 => array(
+ 'DISALLOWED_AFTER' => '(?![\(\w])'
+ ),
+ 11 => array(
+ 'DISALLOWED_AFTER' => '(?![\(\w])'
+ ),
+
+ 14 => array(
+ 'DISALLOWED_AFTER' => '(?=\()'
+ ),
+ 16 => array(
+ 'DISALLOWED_AFTER' => '(?=\()'
+ ),
+ 18 => array(
+ 'DISALLOWED_AFTER' => '(?=\()'
+ ),
+ 20 => array(
+ 'DISALLOWED_AFTER' => '(?=\()'
+ ),
+ 24 => array(
+ 'DISALLOWED_AFTER' => '(?=\()'
+ ),
+ 26 => array(
+ 'DISALLOWED_AFTER' => '(?=\()'
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/nagios.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/nagios.php
new file mode 100644
index 00000000..32cbaef9
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/nagios.php
@@ -0,0 +1,225 @@
+<?php
+/*************************************************************************************
+ * nagios.php
+ * --------
+ * Author: Albéric de Pertat <alberic@depertat.net>
+ * Copyright: (c) 2012 Albéric de Pertat (https://github.com/adepertat/geshi-nagios)
+ * Release Version: 1.0.8.11
+ * Date Started: 2012/01/19
+ *
+ * Nagios language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/01/19 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2012/01/19)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Nagios',
+ 'COMMENT_SINGLE' => array(1 => ';', 2 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'HARDQUOTE' => array("'", "'"),
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\'',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'define'
+ ),
+ 2 => array(
+ 'command', 'contact', 'contactgroup', 'host', 'hostdependency',
+ 'hostescalation', 'hostextinfo', 'hostgroup', 'service',
+ 'servicedependency', 'serviceescalation',
+ 'serviceextinfo', 'servicegroup', 'timeperiod'
+ ),
+ 3 => array(
+ 'active_checks_enabled', 'passive_checks_enabled', 'alias',
+ 'display_name', 'host_name', 'address', 'hostgroups', 'parents',
+ 'hostgroup_members', 'members', 'service_description',
+ 'servicegroups', 'is_volatile', 'servicegroup_name',
+ 'servicegroup_members', 'contact_name', 'contactgroups', 'email',
+ 'pager', 'can_submit_commands', 'contactgroup_name',
+ 'contactgroup_members', 'host_notifications_enabled',
+ 'service_notifications_enabled', 'host_notification_period',
+ 'service_notification_period', 'host_notification_options',
+ 'service_notification_options', 'host_notification_commands',
+ 'service_notification_commands', 'check_command',
+ 'check_freshness', 'check_interval', 'check_period', 'contacts',
+ 'contact_groups', 'event_handler', 'event_handler_enabled',
+ 'flap_detection_enabled', 'flap_detection_options',
+ 'freshness_threshold', 'initial_state', 'low_flap_threshold',
+ 'high_flap_threshold', 'max_check_attempts',
+ 'notification_interval', 'first_notification_delay',
+ 'notification_period', 'notification_options',
+ 'notifications_enabled', 'stalking_options', 'notes', 'notes_url',
+ 'action_url', 'icon_image', 'icon_image_alt', 'vrml_image',
+ 'statusmap_image', '2d_coords', '3d_coords', 'obsess_over_host',
+ 'obsess_over_hostver_service', 'process_perf_data',
+ 'retain_status_information', 'retain_nonstatus_information',
+ 'retry_interval', 'register', 'use', 'name', 'timeperiod_name',
+ 'exclude', 'command_name', 'command_line', 'dependent_host_name',
+ 'dependent_hostgroup_name', 'dependent_service_description',
+ 'inherits_parent', 'execution_failure_criteria',
+ 'notification_failure_criteria', 'dependency_period',
+ 'first_notification', 'last_notification', 'escalation_period',
+ 'escalation_options'
+ ),
+ 4 => array(
+ 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday',
+ 'sunday', 'january', 'february', 'march', 'april', 'may', 'june',
+ 'july', 'august', 'september', 'october', 'november', 'december',
+ 'day'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '{', '}', ',', '+'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'font-weight:bold;color:#FFDCA8;',
+ 2 => 'font-weight:bold;color #FFA858;',
+ 3 => 'font-weight:bold;color:#00C0C0;',
+ 4 => 'font-weight:bold;color:#C0C0FF;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'font-weight:bold;color:#000000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => ''
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #AAAAAA; font-style: italic;',
+ 1 => 'color: #AAAAAA; font-style: italic;',
+ 2 => 'color: #AAAAAA; font-style: italic;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #660066;',
+ 'HARD' => 'color: #660066;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'font-weight:bold;color:#808080;',
+ 1 => 'font-weight:bold;color:#000080;',
+ 2 => 'font-weight:bold;color:red;',
+ 3 => 'font-weight:bold;color:#808000;',
+ 4 => 'font-weight:bold;color:blue;',
+ 5 => 'font-weight:bold;color:#C0FFC0;',
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ )
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '\\'
+ ),
+ 'REGEXPS' => array(
+ // Custom macros
+ 0 => array(
+ GESHI_SEARCH => '(\$[a-zA-Z_]+\$)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ // Custom macro definitions
+ 1 => array(
+ GESHI_SEARCH => '(\A|\s)(_[a-zA-Z_]+)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '',
+ ),
+ // $USERxx$
+ 2 => array(
+ GESHI_SEARCH => '(\$USER[0-9]+\$)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ // $ARGxx$
+ 3 => array(
+ GESHI_SEARCH => '(\$ARG[1-9]\$)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ // register 0
+ 4 => array(
+ GESHI_SEARCH => '(\bregister[\\x20\\t]+[01])',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ // use
+ 5 => array(
+ GESHI_SEARCH => '(use[\\x20\\t]+[^\\x20\\t]+)([\\x20\\t]*[$;#])',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '',
+ ),
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => false
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'NUMBERS' => GESHI_NEVER
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/netrexx.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/netrexx.php
new file mode 100644
index 00000000..14a2d23f
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/netrexx.php
@@ -0,0 +1,163 @@
+<?php
+/*************************************************************************************
+ * netrexx.php
+ * ---------------------------------
+ * Author: Jon Wolfers (sahananda@windhorse.biz)
+ * Contributors:
+ * - Walter Pachl (pachl@chello.at)
+ * Copyright: (c) 2008 Jon Wolfers, (c) 2012 Walter Pachl
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/01/07
+ *
+ * NetRexx language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/07/29 (1.0.0)
+ * - tried to get it syntactically right
+ *
+ * TODO (updated 2012/07/29)
+ * -------------------------
+ * - Get it working on rosettacode.org
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'NetRexx',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'class', 'do', 'exit', 'if', 'import', 'iterate', 'leave',
+ 'loop', 'nop', 'numeric', 'package', 'parse', 'properties',
+ 'return', 'say', 'select', 'signal', 'trace'
+ ),
+ 2 => array(
+ 'abstract', 'adapter', 'all', 'ask', 'binary', 'case',
+ 'constant', 'dependent', 'deprecated', 'extends', 'final',
+ 'implements', 'inheritable', 'interface', 'label', 'methods',
+ 'native', 'off', 'private', 'protect', 'public', 'results',
+ 'returns', 'shared', 'signals', 'source', 'static',
+ 'transient', 'unused', 'uses', 'version', 'volatile'
+ ),
+ 3 => array(
+ 'catch', 'else', 'end', 'finally', 'otherwise', 'then', 'when'
+ ),
+ 4 => array(
+ 'rc', 'result', 'self', 'sigl', 'super'
+ ),
+ 5 => array(
+ 'placeholderforoorexxdirectives'
+ ),
+ 6 => array(
+ 'abbrev', 'abs', 'b2x', 'c2d', 'c2x', 'center', 'centre',
+ 'changestr', 'compare', 'copies', 'copyindexed', 'countstr',
+ 'd2c', 'd2x', 'datatype', 'delstr', 'delword', 'exists',
+ 'formword', 'hashcode', 'insert', 'lastpos', 'left', 'lower',
+ 'max', 'min', 'noteq', 'noteqs', 'opadd', 'opand', 'opcc',
+ 'opccblank', 'opdiv', 'opdivi', 'opeq', 'opeqs', 'opgt',
+ 'opgteq', 'opgteqs', 'opgts', 'oplt', 'oplteq', 'oplteqs',
+ 'oplts', 'opminus', 'opmult', 'opnot', 'opor', 'opplus',
+ 'oppow', 'oprem', 'opsub', 'opxor', 'overlay', 'pos position',
+ 'reverse', 'right', 'sequence', 'setdigits', 'setform',
+ 'sign', 'space', 'strip', 'substr', 'subword', 'toboolean',
+ 'tobyte', 'tochar', 'todouble', 'tofloat', 'toint', 'tolong',
+ 'toshort', 'tostring', 'translate', 'trunc', 'upper',
+ 'verify', 'word', 'wordindex', 'wordlength', 'wordpos',
+ 'words', 'x2b', 'x2c', 'x2d'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '<', '>', '[', ']', '=', '+', '-', '*', '/', '!', '%', '^', '&', ':',
+ '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #ff0000; font-weight: bold;',
+ 3 => 'color: #00ff00; font-weight: bold;',
+ 4 => 'color: #0000ff; font-weight: bold;',
+ 5 => 'color: #880088; font-weight: bold;',
+ 6 => 'color: #888800; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666;',
+ 'MULTI' => 'color: #808080;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/newlisp.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/newlisp.php
new file mode 100644
index 00000000..0dc6c161
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/newlisp.php
@@ -0,0 +1,191 @@
+<?php
+/*************************************************************************************
+ * newlisp.php
+ * ----------
+ * Author: cormullion (cormullion@mac.com) Sept 2009
+ * Copyright: (c) 2009 Cormullion (http://unbalanced-parentheses.nfshost.com/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/09/30
+ *
+ * newLISP language file for GeSHi.
+ *
+ * based on work by Lutz Mueller and Jeff Ober
+ *
+ * CHANGES
+ * -------
+ * 2009/09/30 (1.0.8.6)
+ * - First Release
+ *
+ * TODO (updated 2009/09/30)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'newlisp',
+ 'COMMENT_SINGLE' => array(1 => ';', 2 => '#'),
+ 'COMMENT_MULTI' => array('[text]' => '[/text]', '{' => '}'), // also used for strings
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'NUMBERS' => GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'TAB_WIDTH' => 2,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'NaN?','abort','abs','acos','acosh','add','address','amb','and',
+ 'append','append-file','apply','args','array','array-list','array?',
+ 'asin','asinh','assoc','atan','atan2','atanh','atom?','base64-dec',
+ 'base64-enc','bayes-query','bayes-train','begin','beta','betai',
+ 'bind','binomial','bits','callback','case','catch','ceil',
+ 'change-dir','char','chop','clean','close','command-event','cond',
+ 'cons','constant','context','context?','copy','copy-file','cos',
+ 'cosh','count','cpymem','crc32','crit-chi2','crit-z','current-line',
+ 'curry','date','date-value','debug','dec','def-new','default',
+ 'define','define-macro','delete','delete-file','delete-url',
+ 'destroy','det','device','difference','directory','directory?',
+ 'div','do-until','do-while','doargs','dolist','dostring','dotimes',
+ 'dotree','dump','dup','empty?','encrypt','ends-with','env','erf',
+ 'error-event','estack','eval','eval-string','exec','exists','exit',
+ 'exp','expand','explode','factor','fft','file-info','file?',
+ 'filter','find','find-all','first','flat','float','float?','floor',
+ 'flt','for','for-all','fork','format','fv','gammai','gammaln','gcd',
+ 'get-char','get-float','get-int','get-long','get-string','get-url',
+ 'global','global?','if','if-not','ifft','import','inc','index',
+ 'inf?','int','integer','integer?','intersect','invert','irr','join',
+ 'lambda','lambda?','last','last-error','legal?','length','let',
+ 'letex','letn','list','list?','load','local','log','lookup',
+ 'lower-case','macro?','main-args','make-dir','map','mat','match',
+ 'max','member','min','mod','mul','multiply','name','net-accept',
+ 'net-close','net-connect','net-error','net-eval','net-interface',
+ 'net-listen','net-local','net-lookup','net-peek','net-peer',
+ 'net-ping','net-receive','net-receive-from','net-receive-udp',
+ 'net-select','net-send','net-send-to','net-send-udp','net-service',
+ 'net-sessions','new','nil','nil?','normal','not','now','nper','npv',
+ 'nth','null?','number?','open','or','pack','parse','parse-date',
+ 'peek','pipe','pmt','pop','pop-assoc','post-url','pow',
+ 'pretty-print','primitive?','print','println','prob-chi2','prob-z',
+ 'process','prompt-event','protected?','push','put-url','pv','quote',
+ 'quote?','rand','random','randomize','read-buffer','read-char',
+ 'read-expr','read-file','read-key','read-line','read-utf8',
+ 'real-path','receive','ref','ref-all','regex','regex-comp',
+ 'remove-dir','rename-file','replace','reset','rest','reverse',
+ 'rotate','round','save','search','seed','seek','select','semaphore',
+ 'send','sequence','series','set','set-locale','set-ref',
+ 'set-ref-all','setf','setq','sgn','share','signal','silent','sin',
+ 'sinh','sleep','slice','sort','source','spawn','sqrt','starts-with',
+ 'string','string?','sub','swap','sym','symbol?','symbols','sync',
+ 'sys-error','sys-info','tan','tanh','throw','throw-error','time',
+ 'time-of-day','timer','title-case','trace','trace-highlight',
+ 'transpose','trim','true','true?','unicode','unify','unique',
+ 'unless','unpack','until','upper-case','utf8','utf8len','uuid',
+ 'wait-pid','when','while','write-buffer','write-char','write-file',
+ 'write-line','xfer-event','xml-error','xml-parse','xml-type-tags',
+ 'zero?'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '(', ')','\''
+ ),
+ 1 => array(
+ '!','!=','$','%','&','*','+','-','/',':',
+ '<','<<','<=','=','>','>=','>>','^','|'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000AA;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #00aa00; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #777700;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #AA0000;',
+ 1 => 'color: #0000AA;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #00aa00;',
+ 1 => 'color: #00aa00;',
+ 2 => 'color: #00aa00;',
+ 3 => 'color: #00aa00;',
+ 4 => 'color: #00aa00;',
+ 5 => 'color: #AA0000;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://www.newlisp.org/downloads/newlisp_manual.html#{FNAME}'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(':'),
+ 'REGEXPS' => array(
+ // tags in newlispdoc
+ 0 => "\s+@\S*?\s+",
+ // dollar sign symbols
+ 1 => "[\\$]\w*",
+ // curly-braced string literals
+ 2 => "{[^{}]*?}",
+ // [text] multi-line strings
+ 3 => "(?s)\[text\].*\[\/text\](?-s)",
+ // [code] multi-line blocks
+ 4 => "(?s)\[code\].*\[\/code\](?-s)",
+ // variable references
+ 5 => "'[\w\-]+"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'OOLANG' => array(
+ 'MATCH_AFTER' => '[a-zA-Z][a-zA-Z0-9_\-]*'
+ ),
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => '(?<=[^\w\-])',
+ )
+ ),
+
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/nsis.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/nsis.php
new file mode 100644
index 00000000..35df9b4b
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/nsis.php
@@ -0,0 +1,351 @@
+<?php
+/*************************************************************************************
+ * nsis.php
+ * --------
+ * Author: deguix (cevo_deguix@yahoo.com.br), Tux (http://tux.a4.cz/)
+ * Copyright: (c) 2005 deguix, 2004 Tux (http://tux.a4.cz/), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/12/03
+ *
+ * Nullsoft Scriptable Install System language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/12/03 (2.0.2)
+ * - Updated to NSIS 2.11.
+ * 2005/06/17 (2.0.1)
+ * - Updated to NSIS 2.07b0.
+ * 2005/04/05 (2.0.0)
+ * - Updated to NSIS 2.06.
+ * 2004/11/27 (1.0.2)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.1)
+ * - Added support for URLs
+ * 2004/08/05 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'NSIS',
+ 'COMMENT_SINGLE' => array(1 => ';', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'",'"','`'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ '!appendfile', '!addIncludeDir', '!addplugindir', '!cd', '!define', '!delfile', '!echo', '!else',
+ '!endif', '!error', '!execute', '!ifdef', '!ifmacrodef', '!ifmacrondef', '!ifndef', '!include',
+ '!insertmacro', '!macro', '!macroend', '!packhdr', '!tempfile', '!system', '!undef', '!verbose',
+ '!warning'
+ ),
+ 2 => array(
+ 'AddBrandingImage', 'AllowRootDirInstall', 'AutoCloseWindow', 'BGFont',
+ 'BGGradient', 'BrandingText', 'Caption', 'ChangeUI', 'CheckBitmap', 'CompletedText', 'ComponentText',
+ 'CRCCheck', 'DetailsButtonText', 'DirShow', 'DirText', 'DirVar', 'DirVerify', 'FileErrorText',
+ 'Function', 'FunctionEnd', 'Icon', 'InstallButtonText', 'InstallColors', 'InstallDir',
+ 'InstallDirRegKey', 'InstProgressFlags', 'InstType', 'LangString', 'LangStringUP', 'LicenseBkColor',
+ 'LicenseData', 'LicenseForceSelection', 'LicenseLangString', 'LicenseText', 'LoadLanguageFile',
+ 'MiscButtonText', 'Name', 'OutFile', 'Page', 'PageEx', 'PageExEnd', 'Section',
+ 'SectionEnd', 'SectionGroup', 'SectionGroupEnd', 'SetCompressor', 'SetFont', 'ShowInstDetails',
+ 'ShowUninstDetails', 'SilentInstall', 'SilentUnInstall', 'SpaceTexts', 'SubCaption', 'SubSection',
+ 'SubSectionEnd', 'UninstallButtonText', 'UninstallCaption', 'UninstallIcon', 'UninstallSubCaption',
+ 'UninstallText', 'UninstPage', 'Var', 'VIAddVersionKey', 'VIProductVersion', 'WindowIcon', 'XPStyle'
+ ),
+ 3 => array(
+ 'AddSize', 'AllowSkipFiles', 'FileBufSize', 'GetInstDirError', 'PageCallbacks',
+ 'SectionIn', 'SetCompress', 'SetCompressionLevel', 'SetCompressorDictSize',
+ 'SetDatablockOptimize', 'SetDateSave', 'SetOverwrite', 'SetPluginUnload'
+ ),
+ 4 => array(
+ 'Abort', 'BringToFront', 'Call', 'CallInstDLL', 'ClearErrors', 'CopyFiles','CreateDirectory',
+ 'CreateFont', 'CreateShortCut', 'Delete', 'DeleteINISec', 'DeleteINIStr', 'DeleteRegKey',
+ 'DeleteRegValue', 'DetailPrint', 'EnableWindow', 'EnumRegKey', 'EnumRegValue', 'Exch', 'Exec',
+ 'ExecShell', 'ExecWait', 'ExpandEnvStrings', 'File', 'FileClose', 'FileOpen', 'FileRead',
+ 'FileReadByte', 'FileSeek', 'FileWrite', 'FileWriteByte', 'FindClose', 'FindFirst', 'FindNext',
+ 'FindWindow', 'FlushINI', 'GetCurInstType', 'GetCurrentAddress', 'GetDlgItem', 'GetDLLVersion',
+ 'GetDLLVersionLocal', 'GetErrorLevel', 'GetFileTime', 'GetFileTimeLocal', 'GetFullPathName',
+ 'GetFunctionAddress', 'GetLabelAddress', 'GetTempFileName', 'GetWindowText', 'Goto', 'HideWindow',
+ 'IfAbort', 'IfErrors', 'IfFileExists', 'IfRebootFlag', 'IfSilent', 'InitPluginsDir', 'InstTypeGetText',
+ 'InstTypeSetText', 'IntCmp', 'IntCmpU', 'IntFmt', 'IntOp', 'IsWindow', 'LockWindow', 'LogSet', 'LogText',
+ 'MessageBox', 'Nop', 'Pop', 'Push', 'Quit', 'ReadEnvStr', 'ReadIniStr', 'ReadRegDWORD', 'ReadRegStr',
+ 'Reboot', 'RegDLL', 'Rename', 'ReserveFile', 'Return', 'RMDir', 'SearchPath', 'SectionGetFlags',
+ 'SectionGetInstTypes', 'SectionGetSize', 'SectionGetText', 'SectionSetFlags', 'SectionSetInstTypes',
+ 'SectionSetSize', 'SectionSetText', 'SendMessage', 'SetAutoClose', 'SetBrandingImage', 'SetCtlColors',
+ 'SetCurInstType', 'SetDetailsPrint', 'SetDetailsView', 'SetErrorLevel', 'SetErrors', 'SetFileAttributes',
+ 'SetOutPath', 'SetRebootFlag', 'SetShellVarContext', 'SetSilent', 'ShowWindow', 'Sleep', 'StrCmp',
+ 'StrCpy', 'StrLen', 'UnRegDLL', 'WriteINIStr', 'WriteRegBin', 'WriteRegDWORD', 'WriteRegExpandStr',
+ 'WriteRegStr', 'WriteUninstaller'
+ ),
+ 5 => array(
+ 'all', 'alwaysoff', 'ARCHIVE', 'auto', 'both', 'bzip2', 'checkbox', 'components', 'current',
+ 'custom', 'directory', 'false', 'FILE_ATTRIBUTE_ARCHIVE', 'FILE_ATTRIBUTE_HIDDEN', 'FILE_ATTRIBUTE_NORMAL',
+ 'FILE_ATTRIBUTE_OFFLINE', 'FILE_ATTRIBUTE_READONLY', 'FILE_ATTRIBUTE_SYSTEM,TEMPORARY',
+ 'FILE_ATTRIBUTE_TEMPORARY', 'force', 'HIDDEN', 'hide', 'HKCC', 'HKCR', 'HKCU', 'HKDD', 'HKEY_CLASSES_ROOT',
+ 'HKEY_CURRENT_CONFIG', 'HKEY_CURRENT_USER', 'HKEY_DYN_DATA', 'HKEY_LOCAL_MACHINE', 'HKEY_PERFORMANCE_DATA',
+ 'HKEY_USERS', 'HKLM', 'HKPD', 'HKU', 'IDABORT', 'IDCANCEL', 'IDIGNORE', 'IDNO', 'IDOK', 'IDRETRY', 'IDYES',
+ 'ifdiff', 'ifnewer', 'instfiles', 'lastused', 'leave', 'license', 'listonly', 'lzma', 'manual',
+ 'MB_ABORTRETRYIGNORE', 'MB_DEFBUTTON1', 'MB_DEFBUTTON2', 'MB_DEFBUTTON3', 'MB_DEFBUTTON4',
+ 'MB_ICONEXCLAMATION', 'MB_ICONINFORMATION', 'MB_ICONQUESTION', 'MB_ICONSTOP', 'MB_OK', 'MB_OKCANCEL',
+ 'MB_RETRYCANCEL', 'MB_RIGHT', 'MB_SETFOREGROUND', 'MB_TOPMOST', 'MB_YESNO', 'MB_YESNOCANCEL', 'nevershow',
+ 'none', 'normal', 'off', 'OFFLINE', 'on', 'radiobuttons', 'READONLY', 'RO', 'SHCTX', 'SHELL_CONTEXT', 'show',
+ 'silent', 'silentlog', 'SW_HIDE', 'SW_SHOWMAXIMIZED', 'SW_SHOWMINIMIZED', 'SW_SHOWNORMAL', 'SYSTEM',
+ 'textonly', 'true', 'try', 'uninstConfirm', 'zlib'
+ ),
+ 6 => array(
+ '/a', '/components', '/COMPONENTSONLYONCUSTOM', '/CUSTOMSTRING', '/e', '/FILESONLY', '/FINAL', '/gray', '/GLOBAL',
+ '/ifempty', '/IMGID', '/ITALIC', '/lang', '/NOCUSTOM', '/nonfatal', '/NOUNLOAD', '/oname', '/r', '/REBOOTOK',
+ '/RESIZETOFIT', '/SOLID', '/SD', '/SHORT', '/silent', '/STRIKE', '/TIMEOUT', '/TRIMCENTER', '/TRIMLEFT',
+ '/TRIMRIGHT', '/UNDERLINE', '/windows', '/x'
+ ),
+ 7 => array(
+ '.onGUIEnd', '.onGUIInit', '.onInit', '.onInstFailed', '.onInstSuccess', '.onMouseOverSection',
+ '.onRebootFailed', '.onSelChange', '.onUserAbort', '.onVerifyInstDir', 'un.onGUIEnd', 'un.onGUIInit',
+ 'un.onInit', 'un.onRebootFailed', 'un.onUninstFailed', 'un.onUninstSuccess', 'un.onUserAbort'
+ ),
+ 8 => array(
+ 'MUI.nsh', '"${NSISDIR}\Contrib\Modern UI\System.nsh"', 'MUI_SYSVERSION', 'MUI_ICON', 'MUI_UNICON',
+ 'MUI_HEADERIMAGE', 'MUI_HEADERIMAGE_BITMAP', 'MUI_HEADERIMAGE_BITMAP_NOSTRETCH', 'MUI_HEADERIMAGE_BITMAP_RTL',
+ 'MUI_HEADERIMAGE_BITMAP_RTL_NOSTRETCH', 'MUI_HEADERIMAGE_UNBITMAP', 'MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH',
+ 'MUI_HEADERIMAGE_UNBITMAP_RTL', 'MUI_HEADERIMAGE_UNBITMAP_RTL_NOSTRETCH', 'MUI_HEADERIMAGE_RIGHT', 'MUI_BGCOLOR',
+ 'MUI_UI', 'MUI_UI_HEADERIMAGE', 'MUI_UI_HEADERIMAGE_RIGHT', 'MUI_UI_COMPONENTSPAGE_SMALLDESC',
+ 'MUI_UI_COMPONENTSPAGE_NODESC', 'MUI_WELCOMEFINISHPAGE_BITMAP', 'MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH',
+ 'MUI_WELCOMEFINISHPAGE_INI', 'MUI_UNWELCOMEFINISHPAGE_BITMAP', 'MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH',
+ 'MUI_UNWELCOMEFINISHPAGE_INI', 'MUI_LICENSEPAGE_BGCOLOR', 'MUI_COMPONENTSPAGE_CHECKBITMAP',
+ 'MUI_COMPONENTSPAGE_SMALLDESC', 'MUI_COMPONENTSPAGE_NODESC', 'MUI_INSTFILESPAGE_COLORS',
+ 'MUI_INSTFILESPAGE_PROGRESSBAR', 'MUI_FINISHPAGE_NOAUTOCLOSE', 'MUI_UNFINISHPAGE_NOAUTOCLOSE',
+ 'MUI_ABORTWARNING', 'MUI_ABORTWARNING_TEXT', 'MUI_UNABORTWARNING', 'MUI_UNABORTWARNING_TEXT',
+ 'MUI_PAGE_WELCOME', 'MUI_PAGE_LICENSE', 'MUI_PAGE_COMPONENTS', 'MUI_PAGE_DIRECTORY',
+ 'MUI_PAGE_STARTMENU', 'MUI_PAGE_INSTFILES', 'MUI_PAGE_FINISH', 'MUI_UNPAGE_WELCOME',
+ 'MUI_UNPAGE_CONFIRM', 'MUI_UNPAGE_LICENSE', 'MUI_UNPAGE_COMPONENTS', 'MUI_UNPAGE_DIRECTORY',
+ 'MUI_UNPAGE_INSTFILES', 'MUI_UNPAGE_FINISH', 'MUI_PAGE_HEADER_TEXT', 'MUI_PAGE_HEADER_SUBTEXT',
+ 'MUI_WELCOMEPAGE_TITLE', 'MUI_WELCOMEPAGE_TITLE_3LINES', 'MUI_WELCOMEPAGE_TEXT',
+ 'MUI_LICENSEPAGE_TEXT_TOP', 'MUI_LICENSEPAGE_TEXT_BOTTOM', 'MUI_LICENSEPAGE_BUTTON',
+ 'MUI_LICENSEPAGE_CHECKBOX', 'MUI_LICENSEPAGE_CHECKBOX_TEXT', 'MUI_LICENSEPAGE_RADIOBUTTONS',
+ 'MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT', 'MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE',
+ 'MUI_COMPONENTSPAGE_TEXT_TOP', 'MUI_COMPONENTSPAGE_TEXT_COMPLIST', 'MUI_COMPONENTSPAGE_TEXT_INSTTYPE',
+ 'MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE', 'MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO',
+ 'MUI_DIRECTORYPAGE_TEXT_TOP', 'MUI_DIRECTORYPAGE_TEXT_DESTINATION', 'MUI_DIRECTORYPAGE_VARIABLE',
+ 'MUI_DIRECTORYPAGE_VERIFYONLEAVE', 'MUI_STARTMENU_WRITE_BEGIN', 'MUI_STARTMENU_WRITE_END',
+ 'MUI_STARTMENUPAGE_TEXT_TOP', 'MUI_STARTMENUPAGE_TEXT_CHECKBOX', 'MUI_STARTMENUPAGE_DEFAULTFOLDER',
+ 'MUI_STARTMENUPAGE_NODISABLE', 'MUI_STARTMENUPAGE_REGISTRY_ROOT', 'MUI_STARTMENUPAGE_REGISTRY_KEY',
+ 'MUI_STARTMENUPAGE_REGISTRY_VALUENAME', 'MUI_INSTFILESPAGE_FINISHHEADER_TEXT',
+ 'MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT', 'MUI_INSTFILESPAGE_ABORTHEADER_TEXT',
+ 'MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT', 'MUI_FINISHPAGE_TITLE', 'MUI_FINISHPAGE_TITLE_3LINES',
+ 'MUI_FINISHPAGE_TEXT', 'MUI_FINISHPAGE_TEXT_LARGE', 'MUI_FINISHPAGE_BUTTON',
+ 'MUI_FINISHPAGE_TEXT_REBOOT', 'MUI_FINISHPAGE_TEXT_REBOOTNOW', 'MUI_FINISHPAGE_TEXT_REBOOTLATER',
+ 'MUI_FINISHPAGE_RUN', 'MUI_FINISHPAGE_RUN_TEXT', 'MUI_FINISHPAGE_RUN_PARAMETERS',
+ 'MUI_FINISHPAGE_RUN_NOTCHECKED', 'MUI_FINISHPAGE_RUN_FUNCTION', 'MUI_FINISHPAGE_SHOWREADME',
+ 'MUI_FINISHPAGE_SHOWREADME_TEXT', 'MUI_FINISHPAGE_SHOWREADME_NOTCHECKED',
+ 'MUI_FINISHPAGE_SHOWREADME_FUNCTION', 'MUI_FINISHPAGE_LINK', 'MUI_FINISHPAGE_LINK_LOCATION',
+ 'MUI_FINISHPAGE_LINK_COLOR', 'MUI_FINISHPAGE_NOREBOOTSUPPORT', 'MUI_UNCONFIRMPAGE_TEXT_TOP',
+ 'MUI_UNCONFIRMPAGE_TEXT_LOCATION', 'MUI_LANGUAGE', 'MUI_LANGDLL_DISPLAY',
+ 'MUI_LANGDLL_REGISTRY_ROOT', 'MUI_LANGDLL_REGISTRY_KEY', 'MUI_LANGDLL_REGISTRY_VALUENAME',
+ 'MUI_LANGDLL_WINDOWTITLE', 'MUI_LANGDLL_INFO', 'MUI_LANGDLL_ALWAYSSHOW',
+ 'MUI_RESERVEFILE_INSTALLOPTIONS', 'MUI_RESERVEFILE_LANGDLL', 'MUI_FUNCTION_DESCRIPTION_BEGIN',
+ 'MUI_DESCRIPTION_TEXT', 'MUI_FUNCTION_DESCRIPTION_END', 'MUI_INSTALLOPTIONS_EXTRACT',
+ 'MUI_INSTALLOPTIONS_EXTRACT_AS', 'MUI_HEADER_TEXT', 'MUI_INSTALLOPTIONS_DISPLAY',
+ 'MUI_INSTALLOPTIONS_INITDIALOG', 'MUI_INSTALLOPTIONS_SHOW',
+ 'MUI_INSTALLOPTIONS_DISPLAY_RETURN', 'MUI_INSTALLOPTIONS_SHOW_RETURN',
+ 'MUI_INSTALLOPTIONS_READ', 'MUI_INSTALLOPTIONS_WRITE',
+ 'MUI_CUSTOMFUNCTION_GUIINIT', 'MUI_CUSTOMFUNCTION_UNGUIINIT',
+ 'MUI_CUSTOMFUNCTION_ABORT', 'MUI_CUSTOMFUNCTION_UNABORT',
+ 'MUI_PAGE_CUSTOMFUNCTION_PRE', 'MUI_PAGE_CUSTOMFUNCTION_SHOW', 'MUI_PAGE_CUSTOMFUNCTION_LEAVE',
+ 'MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT'
+ ),
+ 9 => array(
+ 'LogicLib.nsh', '${LOGICLIB}', 'LOGICLIB_STRCMP', 'LOGICLIB_INT64CMP', 'LOGICLIB_SECTIONCMP', '${If}', '${Unless}',
+ '${ElseIf}', '${ElseUnless}', '${Else}', '${EndIf}', '${EndUnless}', '${AndIf}', '${AndUnless}',
+ '${OrIf}', '${OrUnless}', '${IfThen}', '${IfCmd}', '${Select}', '${Case2}', '${Case3}',
+ '${Case4}', '${Case5}', '${CaseElse}', '${Default}', '${EndSelect}', '${Switch}',
+ '${Case}', '${EndSwitch}', '${Do}', '${DoWhile}', '${UntilWhile}', '${Continue}', '${Break}',
+ '${Loop}', '${LoopWhile}', '${LoopUntil}', '${While}', '${ExitWhile}', '${EndWhile}', '${For}',
+ '${ForEach}', '${ExitFor}', '${Next}', '${Abort}', '${Errors}', '${RebootFlag}', '${Silent}',
+ '${FileExists}', '${Cmd}', '${SectionIsSelected}', '${SectionIsSectionGroup}',
+ '${SectionIsSectionGroupEnd}', '${SectionIsBold}', '${SectionIsReadOnly}',
+ '${SectionIsExpanded}', '${SectionIsPartiallySelected}'
+ ),
+ 10 => array(
+ 'StrFunc.nsh', '${STRFUNC}', '${StrCase}', '${StrClb}', '${StrIOToNSIS}', '${StrLoc}', '${StrNSISToIO}', '${StrRep}',
+ '${StrSort}', '${StrStr}', '${StrStrAdv}', '${StrTok}', '${StrTrimNewLines}'
+ ),
+ 11 => array(
+ 'UpgradeDLL.nsh', 'UPGRADEDLL_INCLUDED', 'UpgradeDLL'
+ ),
+ 12 => array(
+ 'Sections.nsh', 'SECTIONS_INCLUDED', '${SF_SELECTED}', '${SF_SECGRP}', '${SF_SUBSEC}', '${SF_SECGRPEND}',
+ '${SF_SUBSECEND}', '${SF_BOLD}', '${SF_RO}', '${SF_EXPAND}', '${SF_PSELECTED}', '${SF_TOGGLED}',
+ '${SF_NAMECHG}', '${SECTION_OFF}', 'SelectSection', 'UnselectSection', 'ReverseSection',
+ 'StartRadioButtons', 'RadioButton', 'EndRadioButtons', '${INSTTYPE_0}', '${INSTTYPE_1}', '${INSTTYPE_2}',
+ '${INSTTYPE_3}', '${INSTTYPE_4}', '${INSTTYPE_5}', '${INSTTYPE_6}', '${INSTTYPE_7}', '${INSTTYPE_8}',
+ '${INSTTYPE_9}', '${INSTTYPE_10}', '${INSTTYPE_11}', '${INSTTYPE_12}', '${INSTTYPE_13}', '${INSTTYPE_14}',
+ '${INSTTYPE_15}', '${INSTTYPE_16}', '${INSTTYPE_17}', '${INSTTYPE_18}', '${INSTTYPE_19}', '${INSTTYPE_20}',
+ '${INSTTYPE_21}', '${INSTTYPE_22}', '${INSTTYPE_23}', '${INSTTYPE_24}', '${INSTTYPE_25}', '${INSTTYPE_26}',
+ '${INSTTYPE_27}', '${INSTTYPE_28}', '${INSTTYPE_29}', '${INSTTYPE_30}', '${INSTTYPE_31}', '${INSTTYPE_32}',
+ 'SetSectionInInstType', 'ClearSectionInInstType', 'SetSectionFlag', 'ClearSectionFlag', 'SectionFlagIsSet'
+ ),
+ 13 => array(
+ 'Colors.nsh', 'WHITE', 'BLACK', 'YELLOW', 'RED', 'GREEN', 'BLUE', 'MAGENTA', 'CYAN', 'rgb2hex'
+ ),
+ 14 => array(
+ 'FileFunc.nsh', '${Locate}', '${GetSize}', '${DriveSpace}', '${GetDrives}', '${GetTime}', '${GetFileAttributes}', '${GetFileVersion}', '${GetExeName}', '${GetExePath}', '${GetParameters}', '${GetOptions}', '${GetRoot}', '${GetParent}', '${GetFileName}', '${GetBaseName}', '${GetFileExt}', '${BannerTrimPath}', '${DirState}', '${RefreshShellIcons}'
+ ),
+ 15 => array(
+ 'TextFunc.nsh', '${LineFind}', '${LineRead}', '${FileReadFromEnd}', '${LineSum}', '${FileJoin}', '${TextCompare}', '${ConfigRead}', '${ConfigWrite}', '${FileRecode}', '${TrimNewLines}'
+ ),
+ 16 => array(
+ 'WordFunc.nsh', '${WordFind}', '${WordFind2X}', '${WordFind3X}', '${WordReplace}', '${WordAdd}', '${WordInsert}', '${StrFilter}', '${VersionCompare}', '${VersionConvert}'
+ )
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ 8 => false,
+ 9 => false,
+ 10 => false,
+ 11 => false,
+ 12 => false,
+ 13 => false,
+ 14 => false,
+ 15 => false,
+ 16 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000066; font-weight:bold;',
+ 2 => 'color: #000066;',
+ 3 => 'color: #003366;',
+ 4 => 'color: #000099;',
+ 5 => 'color: #ff6600;',
+ 6 => 'color: #ff6600;',
+ 7 => 'color: #006600;',
+ 8 => 'color: #006600;',
+ 9 => 'color: #006600;',
+ 10 => 'color: #006600;',
+ 11 => 'color: #006600;',
+ 12 => 'color: #006600;',
+ 13 => 'color: #006600;',
+ 14 => 'color: #006600;',
+ 15 => 'color: #006600;',
+ 16 => 'color: #006600;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #660066; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => ''
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #660066;'
+ ),
+ 'NUMBERS' => array(
+ 0 => ''
+ ),
+ 'METHODS' => array(
+ 0 => ''
+ ),
+ 'SYMBOLS' => array(
+ 0 => ''
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #660000;',
+ 1 => 'color: #660000;',
+ 2 => 'color: #660000;',
+ 3 => 'color: #660000;',
+ 4 => 'color: #660000;',
+ 5 => 'color: #660000;',
+ 6 => 'color: #660000;',
+ 7 => 'color: #000099;',
+ 8 => 'color: #003399;'
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+ 9 => '',
+ 10 => '',
+ 11 => '',
+ 12 => '',
+ 13 => '',
+ 14 => '',
+ 15 => '',
+ 16 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => '\$\$',
+ 1 => '\$\\r',
+ 2 => '\$\\n',
+ 3 => '\$\\t',
+ 4 => '\$[a-zA-Z0-9_]+',
+ 5 => '\$\{.{1,256}\}',
+ 6 => '\$\\\(.{1,256}\\\)',
+ 7 => array(
+ GESHI_SEARCH => '([^:\/\\\*\?\"\<\>(?:<PIPE>)\s]*?)(::)([^:\/\\\*\?\"\<\>(?:<PIPE>)\s]*?)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '\\2\\3'
+ ),
+ 8 => array(
+ GESHI_SEARCH => '([^:\/\\\*\?\"\<\>(?:<PIPE>)\s]*?)(::)([^:\/\\\*\?\"\<\>(?:<PIPE>)]*?\s)',
+ GESHI_REPLACE => '\\3',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1\\2',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oberon2.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oberon2.php
new file mode 100644
index 00000000..b43f8140
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oberon2.php
@@ -0,0 +1,135 @@
+<?php
+/*************************************************************************************
+ * oberon2.php
+ * ----------
+ * Author: mbishop (mbishop@esoteriq.org)
+ * Copyright: (c) 2009 mbishop (mbishop@esoteriq.org)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/02/10
+ *
+ * Oberon-2 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ *
+ * TODO
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Oberon-2',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array('(*' => '*)'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'HARDQUOTE' => array("'", "'"),
+ 'HARDESCAPE' => array("''"),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'ARRAY', 'BEGIN', 'BY', 'CASE',
+ 'CONST', 'DIV', 'DO', 'ELSE', 'ELSIF', 'END',
+ 'EXIT', 'FOR', 'IF', 'IMPORT', 'IN', 'IS',
+ 'LOOP', 'MOD', 'MODULE', 'OF',
+ 'OR', 'POINTER', 'PROCEDURE', 'RECORD',
+ 'REPEAT', 'RETURN', 'THEN', 'TO',
+ 'TYPE', 'UNTIL', 'VAR', 'WHILE', 'WITH'
+ ),
+ 2 => array(
+ 'NIL', 'FALSE', 'TRUE',
+ ),
+ 3 => array(
+ 'ABS', 'ASH', 'ASSERT', 'CAP', 'CHR', 'COPY', 'DEC',
+ 'ENTIER', 'EXCL', 'HALT', 'INC', 'INCL', 'LEN',
+ 'LONG', 'MAX', 'MIN', 'NEW', 'ODD', 'ORD', 'SHORT', 'SIZE'
+ ),
+ 4 => array(
+ 'BOOLEAN', 'CHAR', 'SHORTINT', 'LONGINT',
+ 'INTEGER', 'LONGREAL', 'REAL', 'SET', 'PTR'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ ',', ':', '=', '+', '-', '*', '/', '#', '~'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;',
+ 4 => 'color: #000066; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;',
+ 'HARD' => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0066ee;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/objc.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/objc.php
new file mode 100644
index 00000000..2f5162d7
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/objc.php
@@ -0,0 +1,358 @@
+<?php
+/*************************************************************************************
+ * objc.php
+ * --------
+ * Author: M. Uli Kusterer (witness.of.teachtext@gmx.net)
+ * Contributors: Quinn Taylor (quinntaylor@mac.com)
+ * Copyright: (c) 2008 Quinn Taylor, 2004 M. Uli Kusterer, Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/04
+ *
+ * Objective-C language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/07/11 (1.0.8)
+ * - Added support for @ before strings being highlighted
+ * 2008/06/10 (1.0.7.22)
+ * - Added keywords for Objective-C 2.0 (Leopard+).
+ * - Changed colors to match Xcode 3 highlighting more closely.
+ * - Updated API for AppKit and Foundation; added CoreData classes.
+ * - Updated URLs for AppKit and Foundation; split classes and protocols.
+ * - Sorted all keyword group in reverse-alpha order for correct matching.
+ * - Changed all keyword groups to be case-sensitive.
+ * 2004/11/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Objective-C',
+ 'COMMENT_SINGLE' => array(
+ //Compiler directives
+ 1 => '#',
+ //Single line C-Comments
+ 2 => '//'
+ ),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Multiline Continuation for single-line comment
+ 2 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Pseudo-Highlighting of the @-sign before strings
+ 3 => "/@(?=\")/"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', "'"),
+ 'ESCAPE_CHAR' => '\\',
+
+ 'KEYWORDS' => array(
+ // Objective-C keywords
+ 1 => array(
+ 'while', 'switch', 'return', 'in', 'if', 'goto', 'foreach', 'for',
+ 'else', 'do', 'default', 'continue', 'case', '@try', '@throw',
+ '@synthesize', '@synchronized', '@selector', '@public', '@protocol',
+ '@protected', '@property', '@private', '@interface',
+ '@implementation', '@finally', '@end', '@encode', '@defs', '@class',
+ '@catch'
+ ),
+ // Macros and constants
+ 2 => array(
+ 'YES', 'USHRT_MAX', 'ULONG_MAX', 'UINT_MAX', 'UCHAR_MAX', 'true',
+ 'TMP_MAX', 'stdout', 'stdin', 'stderr', 'SIGTERM', 'SIGSEGV',
+ 'SIGINT', 'SIGILL', 'SIG_IGN', 'SIGFPE', 'SIG_ERR', 'SIG_DFL',
+ 'SIGABRT', 'SHRT_MIN', 'SHRT_MAX', 'SEEK_SET', 'SEEK_END',
+ 'SEEK_CUR', 'SCHAR_MIN', 'SCHAR_MAX', 'RAND_MAX', 'NULL',
+ 'NO', 'nil', 'Nil', 'L_tmpnam', 'LONG_MIN', 'LONG_MAX',
+ 'LDBL_MIN_EXP', 'LDBL_MIN', 'LDBL_MAX_EXP', 'LDBL_MAX',
+ 'LDBL_MANT_DIG', 'LDBL_EPSILON', 'LDBL_DIG', 'INT_MIN', 'INT_MAX',
+ 'HUGE_VAL', 'FOPEN_MAX', 'FLT_ROUNDS', 'FLT_RADIX', 'FLT_MIN_EXP',
+ 'FLT_MIN', 'FLT_MAX_EXP', 'FLT_MAX', 'FLT_MANT_DIG', 'FLT_EPSILON',
+ 'FLT_DIG', 'FILENAME_MAX', 'false', 'EXIT_SUCCESS', 'EXIT_FAILURE',
+ 'errno', 'ERANGE', 'EOF', 'enum', 'EDOM', 'DBL_MIN_EXP', 'DBL_MIN',
+ 'DBL_MAX_EXP', 'DBL_MAX', 'DBL_MANT_DIG', 'DBL_EPSILON', 'DBL_DIG',
+ 'CLOCKS_PER_SEC', 'CHAR_MIN', 'CHAR_MAX', 'CHAR_BIT', 'BUFSIZ',
+ 'break'
+ ),
+ // C standard library functions
+ 3 => array(
+ 'vsprintf', 'vprintf', 'vfprintf', 'va_start', 'va_end', 'va_arg',
+ 'ungetc', 'toupper', 'tolower', 'tmpname', 'tmpfile', 'time',
+ 'tanh', 'tan', 'system', 'strxfrm', 'strtoul', 'strtol', 'strtok',
+ 'strtod', 'strstr', 'strspn', 'strrchr', 'strpbrk', 'strncpy',
+ 'strncmp', 'strncat', 'strlen', 'strftime', 'strerror', 'strcspn',
+ 'strcpy', 'strcoll', 'strcmp', 'strchr', 'strcat', 'sscanf',
+ 'srand', 'sqrt', 'sprintf', 'snprintf', 'sizeof', 'sinh', 'sin',
+ 'setvbuf', 'setjmp', 'setbuf', 'scanf', 'rewind', 'rename',
+ 'remove', 'realloc', 'rand', 'qsort', 'puts', 'putchar', 'putc',
+ 'printf', 'pow', 'perror', 'offsetof', 'modf', 'mktime', 'memset',
+ 'memmove', 'memcpy', 'memcmp', 'memchr', 'malloc', 'longjmp',
+ 'log10', 'log', 'localtime', 'ldiv', 'ldexp', 'labs', 'isxdigit',
+ 'isupper', 'isspace', 'ispunct', 'isprint', 'islower',
+ 'isgraph', 'isdigit', 'iscntrl', 'isalpha', 'isalnum', 'gmtime',
+ 'gets', 'getenv', 'getchar', 'getc', 'fwrite', 'ftell', 'fsetpos',
+ 'fseek', 'fscanf', 'frexp', 'freopen', 'free', 'fread', 'fputs',
+ 'fputc', 'fprintf', 'fopen', 'fmod', 'floor', 'fgets', 'fgetpos',
+ 'fgetc', 'fflush', 'ferror', 'feof', 'fclose', 'fabs', 'exp',
+ 'exit', 'div', 'difftime', 'ctime', 'cosh', 'cos', 'clock',
+ 'clearerr', 'ceil', 'calloc', 'bsearch', 'atol', 'atoi', 'atof',
+ 'atexit', 'atan2', 'atan', 'assert', 'asin', 'asctime', 'acos',
+ 'abs', 'abort'
+ ),
+ // Data types (C, Objective-C, Cocoa)
+ 4 => array(
+ 'volatile', 'void', 'va_list', 'unsigned', 'union', 'typedef', 'tm',
+ 'time_t', 'struct', 'string', 'static', 'size_t',
+ 'signed', 'signal', 'short', 'SEL', 'register', 'raise',
+ 'ptrdiff_t', 'NSZone', 'NSRect', 'NSRange', 'NSPoint', 'long',
+ 'ldiv_t', 'jmp_buf', 'int', 'IMP', 'id', 'fpos_t', 'float', 'FILE',
+ 'extern', 'double', 'div_t', 'const', 'clock_t', 'Class', 'char',
+ 'BOOL', 'auto'
+ ),
+ // Foundation classes
+ 5 => array(
+ 'NSXMLParser', 'NSXMLNode', 'NSXMLElement', 'NSXMLDTDNode',
+ 'NSXMLDTD', 'NSXMLDocument', 'NSWhoseSpecifier',
+ 'NSValueTransformer', 'NSValue', 'NSUserDefaults', 'NSURLResponse',
+ 'NSURLRequest', 'NSURLProtocol', 'NSURLProtectionSpace',
+ 'NSURLHandle', 'NSURLDownload', 'NSURLCredentialStorage',
+ 'NSURLCredential', 'NSURLConnection', 'NSURLCache',
+ 'NSURLAuthenticationChallenge', 'NSURL', 'NSUniqueIDSpecifier',
+ 'NSUndoManager', 'NSUnarchiver', 'NSTimeZone', 'NSTimer',
+ 'NSThread', 'NSTask', 'NSString', 'NSStream', 'NSSpellServer',
+ 'NSSpecifierTest', 'NSSortDescriptor', 'NSSocketPortNameServer',
+ 'NSSocketPort', 'NSSetCommand', 'NSSet', 'NSSerializer',
+ 'NSScriptWhoseTest', 'NSScriptSuiteRegistry',
+ 'NSScriptObjectSpecifier', 'NSScriptExecutionContext',
+ 'NSScriptCommandDescription', 'NSScriptCommand',
+ 'NSScriptCoercionHandler', 'NSScriptClassDescription', 'NSScanner',
+ 'NSRunLoop', 'NSRelativeSpecifier', 'NSRecursiveLock',
+ 'NSRangeSpecifier', 'NSRandomSpecifier', 'NSQuitCommand', 'NSProxy',
+ 'NSProtocolChecker', 'NSPropertySpecifier',
+ 'NSPropertyListSerialization', 'NSProcessInfo', 'NSPredicate',
+ 'NSPositionalSpecifier', 'NSPortNameServer', 'NSPortMessage',
+ 'NSPortCoder', 'NSPort', 'NSPointerFunctions', 'NSPointerArray',
+ 'NSPipe', 'NSOutputStream', 'NSOperationQueue', 'NSOperation',
+ 'NSObject', 'NSNumberFormatter', 'NSNumber', 'NSNull',
+ 'NSNotificationQueue', 'NSNotificationCenter', 'NSNotification',
+ 'NSNetServiceBrowser', 'NSNetService', 'NSNameSpecifier',
+ 'NSMutableURLRequest', 'NSMutableString', 'NSMutableSet',
+ 'NSMutableIndexSet', 'NSMutableDictionary', 'NSMutableData',
+ 'NSMutableCharacterSet', 'NSMutableAttributedString',
+ 'NSMutableArray', 'NSMoveCommand', 'NSMiddleSpecifier',
+ 'NSMethodSignature', 'NSMetadataQueryResultGroup',
+ 'NSMetadataQueryAttributeValueTuple', 'NSMetadataQuery',
+ 'NSMetadataItem', 'NSMessagePortNameServer', 'NSMessagePort',
+ 'NSMapTable', 'NSMachPort', 'NSMachBootstrapServer',
+ 'NSLogicalTest', 'NSLock', 'NSLocale', 'NSKeyedUnarchiver',
+ 'NSKeyedArchiver', 'NSInvocationOperation', 'NSInvocation',
+ 'NSInputStream', 'NSIndexSpecifier', 'NSIndexSet', 'NSIndexPath',
+ 'NSHTTPURLResponse', 'NSHTTPCookieStorage', 'NSHTTPCookie',
+ 'NSHost', 'NSHashTable', 'NSGetCommand', 'NSGarbageCollector',
+ 'NSFormatter', 'NSFileManager', 'NSFileHandle', 'NSExpression',
+ 'NSExistsCommand', 'NSException', 'NSError', 'NSEnumerator',
+ 'NSDistributedNotificationCenter', 'NSDistributedLock',
+ 'NSDistantObjectRequest', 'NSDistantObject',
+ 'NSDirectoryEnumerator', 'NSDictionary', 'NSDeserializer',
+ 'NSDeleteCommand', 'NSDecimalNumberHandler', 'NSDecimalNumber',
+ 'NSDateFormatter', 'NSDateComponents', 'NSDate', 'NSData',
+ 'NSCreateCommand', 'NSCountedSet', 'NSCountCommand', 'NSConnection',
+ 'NSConditionLock', 'NSCondition', 'NSCompoundPredicate',
+ 'NSComparisonPredicate', 'NSCoder', 'NSCloseCommand',
+ 'NSCloneCommand', 'NSClassDescription', 'NSCharacterSet',
+ 'NSCalendarDate', 'NSCalendar', 'NSCachedURLResponse', 'NSBundle',
+ 'NSAutoreleasePool', 'NSAttributedString', 'NSAssertionHandler',
+ 'NSArray', 'NSArchiver', 'NSAppleScript', 'NSAppleEventManager',
+ 'NSAppleEventDescriptor', 'NSAffineTransform'
+ ),
+ // Foundation protocols
+ 6 => array(
+ 'NSURLProtocolClient', 'NSURLHandleClient', 'NSURLClient',
+ 'NSURLAuthenticationChallengeSender', 'NSScriptObjectSpecifiers',
+ 'NSScriptKeyValueCoding', 'NSScriptingComparisonMethods',
+ 'NSObjCTypeSerializationCallBack', 'NSMutableCopying',
+ 'NSLocking', 'NSKeyValueObserving', 'NSKeyValueCoding',
+ 'NSFastEnumeration', 'NSErrorRecoveryAttempting',
+ 'NSDecimalNumberBehaviors', 'NSCopying', 'NSComparisonMethods',
+ 'NSCoding'
+ ),
+ // AppKit classes
+ 7 => array(
+ 'NSWorkspace', 'NSWindowController', 'NSWindow', 'NSViewController',
+ 'NSViewAnimation', 'NSView', 'NSUserDefaultsController',
+ 'NSTypesetter', 'NSTreeNode', 'NSTreeController', 'NSTrackingArea',
+ 'NSToolbarItemGroup', 'NSToolbarItem', 'NSToolbar',
+ 'NSTokenFieldCell', 'NSTokenField', 'NSTextView',
+ 'NSTextTableBlock', 'NSTextTable', 'NSTextTab', 'NSTextStorage',
+ 'NSTextList', 'NSTextFieldCell', 'NSTextField', 'NSTextContainer',
+ 'NSTextBlock', 'NSTextAttachmentCell', 'NSTextAttachment', 'NSText',
+ 'NSTabViewItem', 'NSTabView', 'NSTableView', 'NSTableHeaderView',
+ 'NSTableHeaderCell', 'NSTableColumn', 'NSStepperCell', 'NSStepper',
+ 'NSStatusItem', 'NSStatusBar', 'NSSplitView', 'NSSpellChecker',
+ 'NSSpeechSynthesizer', 'NSSpeechRecognizer', 'NSSound',
+ 'NSSliderCell', 'NSSlider', 'NSSimpleHorizontalTypesetter',
+ 'NSShadow', 'NSSegmentedControl', 'NSSegmentedCell',
+ 'NSSecureTextFieldCell', 'NSSecureTextField', 'NSSearchFieldCell',
+ 'NSSearchField', 'NSScrollView', 'NSScroller', 'NSScreen',
+ 'NSSavePanel', 'NSRulerView', 'NSRulerMarker', 'NSRuleEditor',
+ 'NSResponder', 'NSQuickDrawView', 'NSProgressIndicator',
+ 'NSPrintPanel', 'NSPrintOperation', 'NSPrintInfo', 'NSPrinter',
+ 'NSPredicateEditorRowTemplate', 'NSPredicateEditor',
+ 'NSPopUpButtonCell', 'NSPopUpButton', 'NSPICTImageRep',
+ 'NSPersistentDocument', 'NSPDFImageRep', 'NSPathControl',
+ 'NSPathComponentCell', 'NSPathCell', 'NSPasteboard',
+ 'NSParagraphStyle', 'NSPanel', 'NSPageLayout', 'NSOutlineView',
+ 'NSOpenPanel', 'NSOpenGLView', 'NSOpenGLPixelFormat',
+ 'NSOpenGLPixelBuffer', 'NSOpenGLContext', 'NSObjectController',
+ 'NSNibOutletConnector', 'NSNibControlConnector', 'NSNibConnector',
+ 'NSNib', 'NSMutableParagraphStyle', 'NSMovieView', 'NSMovie',
+ 'NSMenuView', 'NSMenuItemCell', 'NSMenuItem', 'NSMenu', 'NSMatrix',
+ 'NSLevelIndicatorCell', 'NSLevelIndicator', 'NSLayoutManager',
+ 'NSInputServer', 'NSInputManager', 'NSImageView', 'NSImageRep',
+ 'NSImageCell', 'NSImage', 'NSHelpManager', 'NSGraphicsContext',
+ 'NSGradient', 'NSGlyphInfo', 'NSGlyphGenerator', 'NSFormCell',
+ 'NSForm', 'NSFontPanel', 'NSFontManager', 'NSFontDescriptor',
+ 'NSFont', 'NSFileWrapper', 'NSEvent', 'NSEPSImageRep', 'NSDrawer',
+ 'NSDocumentController', 'NSDocument', 'NSDockTile',
+ 'NSDictionaryController', 'NSDatePickerCell', 'NSDatePicker',
+ 'NSCustomImageRep', 'NSCursor', 'NSController', 'NSControl',
+ 'NSComboBoxCell', 'NSComboBox', 'NSColorWell', 'NSColorSpace',
+ 'NSColorPicker', 'NSColorPanel', 'NSColorList', 'NSColor',
+ 'NSCollectionViewItem', 'NSCollectionView', 'NSClipView',
+ 'NSCIImageRep', 'NSCell', 'NSCachedImageRep', 'NSButtonCell',
+ 'NSButton', 'NSBrowserCell', 'NSBrowser', 'NSBox',
+ 'NSBitmapImageRep', 'NSBezierPath', 'NSATSTypesetter',
+ 'NSArrayController', 'NSApplication', 'NSAnimationContext',
+ 'NSAnimation', 'NSAlert', 'NSActionCell'
+ ),
+ // AppKit protocols
+ 8 => array(
+ 'NSWindowScripting', 'NSValidatedUserInterfaceItem',
+ 'NSUserInterfaceValidations', 'NSToolTipOwner',
+ 'NSToolbarItemValidation', 'NSTextInput',
+ 'NSTableDataSource', 'NSServicesRequests',
+ 'NSPrintPanelAccessorizing', 'NSPlaceholders',
+ 'NSPathControlDelegate', 'NSPathCellDelegate',
+ 'NSOutlineViewDataSource', 'NSNibAwaking', 'NSMenuValidation',
+ 'NSKeyValueBindingCreation', 'NSInputServiceProvider',
+ 'NSInputServerMouseTracker', 'NSIgnoreMisspelledWords',
+ 'NSGlyphStorage', 'NSFontPanelValidation', 'NSEditorRegistration',
+ 'NSEditor', 'NSDraggingSource', 'NSDraggingInfo',
+ 'NSDraggingDestination', 'NSDictionaryControllerKeyValuePair',
+ 'NSComboBoxDataSource', 'NSComboBoxCellDataSource',
+ 'NSColorPickingDefault', 'NSColorPickingCustom', 'NSChangeSpelling',
+ 'NSAnimatablePropertyContainer', 'NSAccessibility'
+ ),
+ // CoreData classes
+ 9 => array(
+ 'NSRelationshipDescription', 'NSPropertyMapping',
+ 'NSPropertyDescription', 'NSPersistentStoreCoordinator',
+ 'NSPersistentStore', 'NSMigrationManager', 'NSMappingModel',
+ 'NSManagedObjectModel', 'NSManagedObjectID',
+ 'NSManagedObjectContext', 'NSManagedObject',
+ 'NSFetchRequestExpression', 'NSFetchRequest',
+ 'NSFetchedPropertyDescription', 'NSEntityMigrationPolicy',
+ 'NSEntityMapping', 'NSEntityDescription', 'NSAttributeDescription',
+ 'NSAtomicStoreCacheNode', 'NSAtomicStore'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '=', '+', '-', '*', '/', '!', '%', '^', '&', ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ 9 => true
+ ),
+ // Define the colors for the groups listed above
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #a61390;', // Objective-C keywords
+ 2 => 'color: #a61390;', // Macros and constants
+ 3 => 'color: #a61390;', // C standard library functions
+ 4 => 'color: #a61390;', // data types
+ 5 => 'color: #400080;', // Foundation classes
+ 6 => 'color: #2a6f76;', // Foundation protocols
+ 7 => 'color: #400080;', // AppKit classes
+ 8 => 'color: #2a6f76;', // AppKit protocols
+ 9 => 'color: #400080;' // CoreData classes
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #6e371a;', // Preprocessor directives
+ 2 => 'color: #11740a; font-style: italic;', // Normal C single-line comments
+ 3 => 'color: #bf1d1a;', // Q-sign in front of Strings
+ 'MULTI' => 'color: #11740a; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #2400d9;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #002200;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #bf1d1a;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #2400d9;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #002200;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.opengroup.org/onlinepubs/009695399/functions/{FNAME}.html',
+ 4 => '',
+ 5 => 'http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/{FNAME}_Class/',
+ 6 => 'http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Protocols/{FNAME}_Protocol/',
+ 7 => 'http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/{FNAME}_Class/',
+ 8 => 'http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Protocols/{FNAME}_Protocol/',
+ 9 => 'http://developer.apple.com/documentation/Cocoa/Reference/CoreDataFramework/Classes/{FNAME}_Class/'
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/objeck.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/objeck.php
new file mode 100644
index 00000000..bf9dab56
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/objeck.php
@@ -0,0 +1,116 @@
+<?php
+/*************************************************************************************
+ * objeck.php
+ * --------
+ * Author: Randy Hollines (objeck@gmail.com)
+ * Copyright: (c) 2010 Randy Hollines (http://code.google.com/p/objeck-lang/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/07/01
+ *
+ * Objeck Programming Language language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/26 (1.0.8.10)
+ * - Added new and missing keywords and symbols: 'String', 'each', '+=', '-=', '*=' and '/='.
+ * 2010/07/01 (1.0.8.9)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Objeck Programming Language',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array('#~' => '~#'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'virtual', 'if', 'else', 'do', 'while', 'use', 'bundle', 'native',
+ 'static', 'public', 'private', 'class', 'function', 'method',
+ 'select', 'other', 'enum', 'for', 'each', 'label', 'return', 'from'
+ ),
+ 2 => array(
+ 'Byte', 'Int', 'Nil', 'Float', 'Char', 'Bool', 'String'
+ ),
+ 3 => array(
+ 'true', 'false'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(', ')', '{', '}', '[', ']', '+', '-', '*', '/', '%', '=', '<', '>', '&', '|', ':', ';', ',', '+=', '-=', '*=', '/=',
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #b1b100;',
+ 3 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '-&gt;'
+ ),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ocaml-brief.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ocaml-brief.php
new file mode 100644
index 00000000..b518adf8
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ocaml-brief.php
@@ -0,0 +1,112 @@
+<?php
+/*************************************************************************************
+ * ocaml.php
+ * ----------
+ * Author: Flaie (fireflaie@gmail.com)
+ * Copyright: (c) 2005 Flaie, Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/08/27
+ *
+ * OCaml (Objective Caml) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/08/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2005/08/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'OCaml (brief)',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array('(*' => '*)'),
+ 'CASE_KEYWORDS' => 0,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => "",
+ 'KEYWORDS' => array(
+ /* main OCaml keywords */
+ 1 => array(
+ 'and', 'as', 'asr', 'begin', 'class', 'closed', 'constraint', 'do', 'done', 'downto', 'else',
+ 'end', 'exception', 'external', 'failwith', 'false', 'flush', 'for', 'fun', 'function', 'functor',
+ 'if', 'in', 'include', 'inherit', 'incr', 'land', 'let', 'load', 'los', 'lsl', 'lsr', 'lxor',
+ 'match', 'method', 'mod', 'module', 'mutable', 'new', 'not', 'of', 'open', 'option', 'or', 'parser',
+ 'private', 'ref', 'rec', 'raise', 'regexp', 'sig', 'struct', 'stdout', 'stdin', 'stderr', 'then',
+ 'to', 'true', 'try', 'type', 'val', 'virtual', 'when', 'while', 'with'
+ )
+ ),
+ /* highlighting symbols is really important in OCaml */
+ 'SYMBOLS' => array(
+ ';', '!', ':', '.', '=', '%', '^', '*', '-', '/', '+',
+ '>', '<', '(', ')', '[', ']', '&', '|', '#', "'"
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #06c; font-weight: bold;' /* nice blue */
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'color: #5d478b; font-style: italic;' /* light purple */
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #6c6;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #3cb371;' /* nice green */
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #c6c;' /* pink */
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #060;' /* dark green */
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #a52a2a;' /* maroon */
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ocaml.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ocaml.php
new file mode 100644
index 00000000..ac6c29bc
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ocaml.php
@@ -0,0 +1,187 @@
+<?php
+/*************************************************************************************
+ * ocaml.php
+ * ----------
+ * Author: Flaie (fireflaie@gmail.com)
+ * Copyright: (c) 2005 Flaie, Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/08/27
+ *
+ * OCaml (Objective Caml) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/03/29 (1.0.7.22)
+ * - Fixed warnings resulting from missing style information
+ * 2005/08/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2005/08/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'OCaml',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array('(*' => '*)'),
+ 'COMMENT_REGEXP' => array(1 => '/\(\*(?:(?R)|.)+?\*\)/s'),
+ 'CASE_KEYWORDS' => 0,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => "",
+ 'KEYWORDS' => array(
+ /* main OCaml keywords */
+ 1 => array(
+ 'and', 'as', 'asr', 'begin', 'class', 'closed', 'constraint', 'do', 'done', 'downto', 'else',
+ 'end', 'exception', 'external', 'failwith', 'false', 'for', 'fun', 'function', 'functor',
+ 'if', 'in', 'include', 'inherit', 'incr', 'land', 'let', 'load', 'los', 'lsl', 'lsr', 'lxor',
+ 'match', 'method', 'mod', 'module', 'mutable', 'new', 'not', 'of', 'open', 'option', 'or', 'parser',
+ 'private', 'ref', 'rec', 'raise', 'regexp', 'sig', 'struct', 'stdout', 'stdin', 'stderr', 'then',
+ 'to', 'true', 'try', 'type', 'val', 'virtual', 'when', 'while', 'with'
+ ),
+ /* define names of main librarys, so we can link to it */
+ 2 => array(
+ 'Arg', 'Arith_status', 'Array', //'Array1', 'Array2', 'Array3',
+ 'ArrayLabels', 'Big_int', 'Bigarray', 'Buffer', 'Callback',
+ 'CamlinternalLazy', 'CamlinternalMod', 'CamlinternalOO', 'Char',
+ 'Complex', 'Condition', 'Dbm', 'Digest', 'Dynlink', 'Event',
+ 'Filename', 'Format', 'Gc', 'Genlex', 'Graphics', 'GraphicsX11',
+ 'Hashtbl', 'Int32', 'Int64', 'Lazy', 'Lexing', 'List', 'ListLabels',
+ 'Map', 'Marshal', 'MoreLabels', 'Mutex', 'Nativeint', 'Num', 'Obj',
+ 'Oo', 'Parsing', 'Pervasives', 'Printexc', 'Printf', 'Queue',
+ 'Random', 'Scanf', 'Set', 'Sort', 'Stack', 'StdLabels', 'Str',
+ 'Stream', 'String', 'StringLabels', 'Sys', 'Thread', 'ThreadUnix',
+ 'Tk', 'Unix', 'UnixLabels', 'Weak'
+ ),
+ /* just link to the Pervasives functions library, cause it's the default opened library when starting OCaml */
+ 3 => array(
+ 'abs', 'abs_float', 'acos', 'asin', 'at_exit', 'atan', 'atan2',
+ 'bool_of_string', 'ceil', 'char_of_int', 'classify_float',
+ 'close_in', 'close_in_noerr', 'close_out', 'close_out_noerr',
+ 'compare', 'cos', 'cosh', 'decr', 'epsilon_float', 'exit', 'exp',
+ 'float', 'float_of_int', 'float_of_string', 'floor', 'flush',
+ 'flush_all', 'format_of_string', 'frexp', 'fst', 'ignore',
+ 'in_channel_length', 'infinity', 'input', 'input_binary_int',
+ 'input_byte', 'input_char', 'input_line', 'input_value',
+ 'int_of_char', 'int_of_float', 'int_of_string', 'invalid_arg',
+ 'ldexp', 'log', 'log10', 'max', 'max_float', 'max_int', 'min',
+ 'min_float', 'min_int', 'mod_float', 'modf', 'nan', 'open_in',
+ 'open_in_bin', 'open_in_gen', 'open_out', 'open_out_bin',
+ 'open_out_gen', 'out_channel_length', 'output', 'output_binary_int',
+ 'output_byte', 'output_char', 'output_string', 'output_value',
+ 'pos_in', 'pos_out', 'pred', 'prerr_char', 'prerr_endline',
+ 'prerr_float', 'prerr_int', 'prerr_newline', 'prerr_string',
+ 'print_char', 'print_endline', 'print_float', 'print_int',
+ 'print_newline', 'print_string', 'read_float', 'read_int',
+ 'read_line', 'really_input', 'seek_in', 'seek_out',
+ 'set_binary_mode_in', 'set_binary_mode_out', 'sin', 'sinh', 'snd',
+ 'sqrt', 'string_of_bool', 'string_of_float', 'string_of_format',
+ 'string_of_int', 'succ', 'tan', 'tanh', 'truncate'
+ ),
+ /* here Pervasives Types */
+ 4 => array (
+ 'array','bool','char','exn','file_descr','format','fpclass',
+ 'in_channel','int','int32','int64','list','nativeint','open_flag',
+ 'out_channel','string','Sys_error','unit'
+ ),
+ /* finally Pervasives Exceptions */
+ 5 => array (
+ 'Exit', 'Invalid_Argument', 'Failure', 'Division_by_zero'
+ )
+ ),
+ /* highlighting symbols is really important in OCaml */
+ 'SYMBOLS' => array(
+ '+.', '-.', '*.', '/.', '[<', '>]',
+ ';', '!', ':', '.', '=', '%', '^', '*', '-', '/', '+',
+ '>', '<', '(', ')', '[', ']', '&', '|', '#', "'",
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => true, /* functions name are case sensitive */
+ 3 => true, /* types name too */
+ 4 => true, /* pervasives types */
+ 5 => true /* pervasives exceptions */
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #06c; font-weight: bold;', /* nice blue */
+ 2 => 'color: #06c; font-weight: bold;', /* nice blue */
+ 3 => 'color: #06c; font-weight: bold;', /* nice blue */
+ 4 => 'color: #06c; font-weight: bold;', /* nice blue */
+ 5 => 'color: #06c; font-weight: bold;' /* nice blue */
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'color: #5d478b; font-style: italic;', /* light purple */
+ 1 => 'color: #5d478b; font-style: italic;' /* light purple */
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #a52a2a;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #3cb371;' /* nice green */
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #c6c;' /* pink */
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #060;' /* dark green */
+ ),
+ 'REGEXPS' => array(
+ 1 => 'font-weight:bold; color:#339933;',
+ 2 => 'font-weight:bold; color:#993399;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #a52a2a;' /* maroon */
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ /* some of keywords are Pervasives functions (land, lxor, asr, ...) */
+ 1 => '',
+ /* link to the wanted library */
+ 2 => 'http://caml.inria.fr/pub/docs/manual-ocaml/libref/{FNAME}.html',
+ /* link to Pervasives functions */
+ 3 => 'http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#VAL{FNAME}',
+ /* link to Pervasives type */
+ 4 => 'http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#TYPE{FNAME}',
+ /* link to Pervasives exceptions */
+ 5 => 'http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html#EXCEPTION{FNAME}'
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ 1 => '~\w+',
+ 2 => '`(?=(?-i:[a-z]))\w*',
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/octave.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/octave.php
new file mode 100644
index 00000000..ccffcd97
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/octave.php
@@ -0,0 +1,515 @@
+<?php
+/*************************************************************************************
+ * octave.php
+ * -----------
+ * Author: Carnë Draug (carandraug+dev@gmail.com)
+ * Juan Pablo Carbajal (carbajal@ifi.uzh.ch)
+ * Copyright: (c) 2012 Carnë Draug
+ * (c) 2012 Juan Pablo Carbajal
+ * Release Version: 1.0.8.11
+ * Date Started: 2012/05/22
+ *
+ * GNU Octave M-file language file for GeSHi.
+ *
+ * This file was heavily based on octave.lang from gtksourceview. If bugs are
+ * found and/or fixed on this file, please send them to the gtksourceview
+ * project or e-mail them to this file authors. Thanks in advance
+ *
+ * CHANGES
+ * -------
+ * 2012/05/22 (1.0.8.11)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'GNU Octave',
+ 'COMMENT_SINGLE' => array(1 => '#', 2 => '%'),
+ // we can't use COMMENT_MULTI since start and end of block comments need to
+ // be alone on the line (optionally, with whitespace). See COMMENT_REGEXP
+ 'COMMENT_MULTI' => array(),
+ // we can't use QUOTEMARKS, not even HARDQUOTE, see COMMENT_REGEXP
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'COMMENT_REGEXP' => array(
+ // Single quote strings: we can't use QUOTEMARKS here since new
+ // lines will break the string. Plus, single quote strings do not even
+ // allow for continuation markers, only double quote strings allow it.
+ // Also, to do not misdetect the transpose operator ' as the start of a
+ // string we assert to not follow a variable name (letters, digits and
+ // underscores) or a closing bracket (round, square or curly) or a dot
+ // (to form the array transpose operator ".'" ).
+ 3 => "/(?<![0-9a-zA-Z_\)\]}\.])'.*?'/",
+ // Double quote strings: we also can't use QUOTEMARKS here (see single
+ // line quotes). However, with double quote strings both \ and ... can
+ // be used to make multiline strings. Continuation markers can be
+ // followed by whitespace
+ 4 => '/"(.|(\.\.\.|\\\)(\s)*?\n)*?(?<!\\\)"/',
+ // Block comments: the ms modifiers treat strings as multiple lines (to
+ // be able to use ^ and $ instead of newline and thus support block
+ // comments on the first and last line of source) and make . also match
+ // a newline
+ 5 => "/^\s*?[%#]{\s*?$.*?^\s*?[%#]}\s*?$/ms",
+ // Packaging system: comes here so that pkg can also be used in the
+ // function form. The list of pkg commands is optional to the match so
+ // that at least pkg is highlighted if new commands are implemented
+ 6 => "/\bpkg(?!\s*\()\s+((un)?install|update|(un)?load|list|(global|local)_list|describe|prefix|(re)?build)?\b/",
+ // Function handles
+ 7 => "/@([a-z_][a-z1-9_]*)?/i",
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_OCT_PREFIX |
+ GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_FLT_SCI_ZERO,
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'KEYWORDS' => array(
+ // Data types
+ 1 => array(
+ 'cell', 'char', 'double', 'uint8', 'uint16', 'uint32', 'uint64',
+ 'int8','int16', 'int32', 'int64', 'logical', 'single', 'struct'
+ ),
+ // Storage type
+ 2 => array(
+ 'global', 'persistent', 'static'
+ ),
+ // Internal variable
+ 3 => array(
+ 'ans'
+ ),
+ // Reserved words
+ 4 => array(
+ 'break', 'case', 'catch', 'continue', 'do', 'else', 'elseif', 'end',
+ 'end_try_catch', 'end_unwind_protect', 'endfor', 'endfunction',
+ 'endif', 'endparfor', 'endswitch', 'endwhile', 'for', 'function',
+ 'if', 'otherwise', 'parfor', 'return',
+ 'switch', 'try', 'until', 'unwind_protect',
+ 'unwind_protect_cleanup', 'varargin', 'varargout', 'while'
+ ),
+ // Built in
+ 5 => array(
+ 'P_tmpdir', 'abs', 'acos', 'acosh',
+ 'add_input_event_hook', 'addlistener', 'addpath', 'addproperty',
+ 'all', 'allow_noninteger_range_as_index', 'and', 'angle', 'any',
+ 'arg', 'argnames', 'argv', 'asin', 'asinh', 'assignin', 'atan',
+ 'atan2', 'atanh', 'atexit', 'autoload', 'available_graphics_toolkits',
+ 'beep_on_error', 'bitand', 'bitmax', 'bitor', 'bitshift', 'bitxor',
+ 'builtin', 'canonicalize_file_name', 'cat', 'cbrt', 'cd', 'ceil',
+ 'cell2struct', 'cellstr', 'chdir', 'class', 'clc',
+ 'clear', 'columns', 'command_line_path', 'completion_append_char',
+ 'completion_matches', 'complex', 'confirm_recursive_rmdir', 'conj',
+ 'cos', 'cosh', 'cputime', 'crash_dumps_octave_core', 'ctranspose',
+ 'cumprod', 'cumsum', 'dbclear', 'dbcont', 'dbdown', 'dbnext',
+ 'dbquit', 'dbstack', 'dbstatus', 'dbstep', 'dbstop', 'dbtype', 'dbup',
+ 'dbwhere', 'debug_on_error', 'debug_on_interrupt', 'debug_on_warning',
+ 'default_save_options', 'dellistener', 'diag', 'diary', 'diff',
+ 'disp', 'do_braindead_shortcircuit_evaluation', 'do_string_escapes',
+ 'doc_cache_file', 'drawnow', 'dup2', 'echo',
+ 'echo_executing_commands', 'edit_history','eq', 'erf', 'erfc',
+ 'erfcx', 'erfinv', 'errno', 'errno_list', 'error', 'eval', 'evalin',
+ 'exec', 'exist', 'exit', 'exp', 'expm1', 'eye', 'fclear',
+ 'fclose', 'fcntl', 'fdisp', 'feof', 'ferror', 'feval', 'fflush',
+ 'fgetl', 'fgets', 'fieldnames', 'file_in_loadpath', 'file_in_path',
+ 'filemarker', 'filesep', 'find_dir_in_path', 'finite', 'fix',
+ 'fixed_point_format', 'floor', 'fmod', 'fnmatch', 'fopen', 'fork',
+ 'format', 'formula', 'fprintf', 'fputs', 'fread', 'freport',
+ 'frewind', 'fscanf', 'fseek', 'fskipl', 'ftell', 'full', 'func2str',
+ 'functions', 'fwrite', 'gamma', 'gammaln', 'ge', 'genpath', 'get',
+ 'get_help_text', 'get_help_text_from_file', 'getegid', 'getenv',
+ 'geteuid', 'getgid', 'gethostname', 'getpgrp', 'getpid', 'getppid',
+ 'getuid', 'glob', 'gt', 'history', 'history_control', 'history_file',
+ 'history_size', 'history_timestamp_format_string', 'home', 'horzcat',
+ 'hypot', 'ifelse', 'ignore_function_time_stamp', 'imag',
+ 'inferiorto', 'info_file', 'info_program', 'inline', 'input',
+ 'intmax', 'intmin', 'ipermute',
+ 'is_absolute_filename', 'is_dq_string', 'is_function_handle',
+ 'is_rooted_relative_filename', 'is_sq_string', 'isalnum', 'isalpha',
+ 'isargout', 'isascii', 'isbool', 'iscell', 'iscellstr', 'ischar',
+ 'iscntrl', 'iscomplex', 'isdebugmode', 'isdigit', 'isempty',
+ 'isfield', 'isfinite', 'isfloat', 'isglobal', 'isgraph', 'ishandle',
+ 'isieee', 'isindex', 'isinf', 'isinteger', 'iskeyword', 'islogical',
+ 'islower', 'ismatrix', 'ismethod', 'isna', 'isnan', 'isnull',
+ 'isnumeric', 'isobject', 'isprint', 'ispunct', 'isreal', 'issorted',
+ 'isspace', 'issparse', 'isstruct', 'isupper', 'isvarname', 'isxdigit',
+ 'kbhit', 'keyboard', 'kill', 'lasterr', 'lasterror', 'lastwarn',
+ 'ldivide', 'le', 'length', 'lgamma', 'link', 'linspace',
+ 'list_in_columns', 'load', 'loaded_graphics_toolkits', 'log', 'log10',
+ 'log1p', 'log2', 'lower', 'lstat', 'lt',
+ 'make_absolute_filename', 'makeinfo_program', 'max_recursion_depth',
+ 'merge', 'methods', 'mfilename', 'minus', 'mislocked',
+ 'missing_function_hook', 'mkdir', 'mkfifo', 'mkstemp', 'mldivide',
+ 'mlock', 'mod', 'more', 'mpower', 'mrdivide', 'mtimes', 'munlock',
+ 'nargin', 'nargout', 'native_float_format', 'ndims', 'ne',
+ 'nfields', 'nnz', 'norm', 'not', 'nth_element', 'numel', 'nzmax',
+ 'octave_config_info', 'octave_core_file_limit',
+ 'octave_core_file_name', 'octave_core_file_options',
+ 'octave_tmp_file_name', 'onCleanup', 'ones',
+ 'optimize_subsasgn_calls', 'or', 'output_max_field_width',
+ 'output_precision', 'page_output_immediately', 'page_screen_output',
+ 'path', 'pathsep', 'pause', 'pclose', 'permute', 'pipe', 'plus',
+ 'popen', 'popen2', 'power', 'print_empty_dimensions',
+ 'print_struct_array_contents', 'printf', 'prod',
+ 'program_invocation_name', 'program_name', 'putenv', 'puts', 'pwd',
+ 'quit', 'rats', 'rdivide', 're_read_readline_init_file',
+ 'read_readline_init_file', 'readdir', 'readlink', 'real', 'realmax',
+ 'realmin', 'register_graphics_toolkit', 'rehash', 'rem',
+ 'remove_input_event_hook', 'rename', 'repelems', 'reset', 'reshape',
+ 'resize', 'restoredefaultpath', 'rethrow', 'rmdir', 'rmfield',
+ 'rmpath', 'round', 'roundb', 'rows', 'run_history', 'save',
+ 'save_header_format_string', 'save_precision', 'saving_history',
+ 'scanf', 'set', 'setenv', 'sighup_dumps_octave_core', 'sign',
+ 'sigterm_dumps_octave_core', 'silent_functions', 'sin',
+ 'sinh', 'size', 'size_equal', 'sizemax', 'sizeof', 'sleep', 'sort',
+ 'source', 'spalloc', 'sparse', 'sparse_auto_mutate',
+ 'split_long_rows', 'sprintf', 'sqrt', 'squeeze', 'sscanf', 'stat',
+ 'stderr', 'stdin', 'stdout', 'str2func', 'strcmp', 'strcmpi',
+ 'string_fill_char', 'strncmp', 'strncmpi', 'struct2cell',
+ 'struct_levels_to_print', 'strvcat', 'subsasgn', 'subsref', 'sum',
+ 'sumsq', 'superiorto', 'suppress_verbose_help_message', 'symlink',
+ 'system', 'tan', 'tanh', 'terminal_size', 'tic', 'tilde_expand',
+ 'times', 'tmpfile', 'tmpnam', 'toascii', 'toc', 'tolower', 'toupper',
+ 'transpose', 'typeinfo',
+ 'umask', 'uminus', 'uname', 'undo_string_escapes', 'unlink',
+ 'uplus', 'upper', 'usage', 'usleep', 'vec', 'vectorize', 'vertcat',
+ 'waitfor', 'waitpid', 'warning', 'warranty', 'who', 'whos',
+ 'whos_line_format', 'yes_or_no', 'zeros'
+ ),
+ // Octave functions
+ 6 => array(
+ 'accumarray', 'accumdim', 'acosd', 'acot', 'acotd', 'acoth', 'acsc',
+ 'acscd', 'acsch', 'addpref', 'addtodate', 'allchild', 'amd',
+ 'ancestor', 'anova', 'arch_fit', 'arch_rnd', 'arch_test',
+ 'area', 'arma_rnd', 'asctime', 'asec', 'asecd', 'asech', 'asind',
+ 'assert', 'atand', 'autoreg_matrix', 'autumn',
+ 'axes', 'axis', 'balance', 'bar', 'barh', 'bartlett', 'bartlett_test',
+ 'base2dec', 'beep', 'bessel', 'besselj', 'beta', 'betacdf',
+ 'betainc', 'betainv', 'betaln', 'betapdf', 'betarnd', 'bicg',
+ 'bicgstab', 'bicubic', 'bin2dec', 'bincoeff', 'binocdf', 'binoinv',
+ 'binopdf', 'binornd', 'bitcmp', 'bitget', 'bitset', 'blackman',
+ 'blanks', 'blkdiag', 'bone', 'box', 'brighten', 'bsxfun',
+ 'bug_report', 'bunzip2', 'bzip2', 'calendar', 'cart2pol', 'cart2sph',
+ 'cast', 'cauchy_cdf', 'cauchy_inv', 'cauchy_pdf', 'cauchy_rnd',
+ 'caxis', 'ccolamd', 'cell2mat', 'celldisp', 'cellfun',
+ 'center', 'cgs', 'chi2cdf', 'chi2inv', 'chi2pdf', 'chi2rnd',
+ 'chisquare_test_homogeneity', 'chisquare_test_independence', 'chol',
+ 'chop', 'circshift', 'cla', 'clabel', 'clf', 'clock',
+ 'cloglog', 'close', 'closereq', 'colamd', 'colloc', 'colon',
+ 'colorbar', 'colormap', 'colperm', 'colstyle', 'comet', 'comet3',
+ 'comma', 'common_size', 'commutation_matrix', 'compan',
+ 'compare_versions', 'compass', 'computer', 'cond', 'condest',
+ 'contour', 'contour3', 'contourc', 'contourf', 'contrast', 'conv',
+ 'conv2', 'convhull', 'convhulln', 'cool', 'copper', 'copyfile',
+ 'cor_test', 'corr', 'cosd', 'cot', 'cotd', 'coth', 'cov',
+ 'cplxpair', 'cross', 'csc', 'cscd', 'csch', 'cstrcat',
+ 'csvread', 'csvwrite', 'ctime', 'cumtrapz', 'curl', 'cylinder',
+ 'daspect', 'daspk', 'dasrt', 'dassl', 'date', 'datenum', 'datestr',
+ 'datetick', 'datevec', 'dblquad', 'deal', 'deblank', 'debug',
+ 'dec2base', 'dec2bin', 'dec2hex', 'deconv', 'del2', 'delaunay',
+ 'delaunay3', 'delaunayn', 'delete', 'demo', 'det', 'detrend',
+ 'diffpara', 'diffuse', 'dir', 'discrete_cdf', 'discrete_inv',
+ 'discrete_pdf', 'discrete_rnd', 'display', 'divergence',
+ 'dlmread', 'dlmwrite', 'dmperm', 'doc', 'dos', 'dot', 'dsearch',
+ 'dsearchn', 'dump_prefs', 'duplication_matrix', 'durbinlevinson',
+ 'edit', 'eig', 'eigs', 'ellipsoid', 'empirical_cdf', 'empirical_inv',
+ 'empirical_pdf', 'empirical_rnd', 'eomday', 'errorbar',
+ 'etime', 'etreeplot', 'example', 'expcdf', 'expinv', 'expm', 'exppdf',
+ 'exprnd', 'ezcontour', 'ezcontourf', 'ezmesh', 'ezmeshc', 'ezplot',
+ 'ezplot3', 'ezpolar', 'ezsurf', 'ezsurfc', 'f_test_regression',
+ 'fact', 'factor', 'factorial', 'fail', 'fcdf', 'feather', 'fft',
+ 'fft2', 'fftconv', 'fftfilt', 'fftn', 'fftshift', 'fftw', 'figure',
+ 'fileattrib', 'fileparts', 'fileread', 'fill', 'filter', 'filter2',
+ 'find', 'findall', 'findobj', 'findstr', 'finv', 'flag', 'flipdim',
+ 'fliplr', 'flipud', 'fminbnd', 'fminunc', 'fpdf', 'fplot',
+ 'fractdiff', 'freqz', 'freqz_plot', 'frnd', 'fsolve',
+ 'fullfile', 'fzero', 'gamcdf', 'gaminv', 'gammainc',
+ 'gampdf', 'gamrnd', 'gca', 'gcbf', 'gcbo', 'gcd', 'gcf',
+ 'gen_doc_cache', 'genvarname', 'geocdf', 'geoinv', 'geopdf', 'geornd',
+ 'get_first_help_sentence', 'getappdata', 'getfield', 'getgrent',
+ 'getpref', 'getpwent', 'getrusage', 'ginput', 'givens', 'glpk',
+ 'gls', 'gmap40', 'gmres', 'gnuplot_binary', 'gplot',
+ 'gradient', 'graphics_toolkit', 'gray', 'gray2ind', 'grid',
+ 'griddata', 'griddata3', 'griddatan', 'gtext', 'guidata',
+ 'guihandles', 'gunzip', 'gzip', 'hadamard', 'hamming', 'hankel',
+ 'hanning', 'help', 'hess', 'hex2dec', 'hex2num', 'hggroup', 'hidden',
+ 'hilb', 'hist', 'histc', 'hold', 'hot', 'hotelling_test',
+ 'hotelling_test_2', 'housh', 'hsv', 'hsv2rgb', 'hurst', 'hygecdf',
+ 'hygeinv', 'hygepdf', 'hygernd', 'idivide', 'ifftshift', 'image',
+ 'imagesc', 'imfinfo', 'imread', 'imshow', 'imwrite', 'ind2gray',
+ 'ind2rgb', 'index', 'info', 'inpolygon', 'inputname', 'int2str',
+ 'interp1', 'interp1q', 'interp2', 'interp3', 'interpft', 'interpn',
+ 'intersect', 'inv', 'invhilb', 'iqr',
+ 'is_leap_year', 'is_valid_file_id',
+ 'isa', 'isappdata', 'iscolumn', 'isdefinite', 'isdeployed', 'isdir',
+ 'isequal', 'isequalwithequalnans', 'isfigure', 'ishermitian',
+ 'ishghandle', 'ishold', 'isletter', 'ismac', 'ismember', 'isocolors',
+ 'isonormals', 'isosurface', 'ispc', 'ispref', 'isprime', 'isprop',
+ 'isrow', 'isscalar', 'issquare', 'isstrprop', 'issymmetric',
+ 'isunix', 'isvector', 'jet', 'kendall', 'kolmogorov_smirnov_cdf',
+ 'kolmogorov_smirnov_test', 'kolmogorov_smirnov_test_2', 'kron',
+ 'kruskal_wallis_test', 'krylov', 'kurtosis', 'laplace_cdf',
+ 'laplace_inv', 'laplace_pdf', 'laplace_rnd', 'lcm', 'legend',
+ 'legendre', 'license', 'lin2mu', 'line', 'linkprop', 'list_primes',
+ 'loadaudio', 'loadobj', 'logistic_cdf', 'logistic_inv',
+ 'logistic_pdf', 'logistic_regression', 'logistic_rnd', 'logit',
+ 'loglog', 'loglogerr', 'logm', 'logncdf', 'logninv', 'lognpdf',
+ 'lognrnd', 'logspace', 'lookfor', 'lookup', 'ls', 'ls_command',
+ 'lsode', 'lsqnonneg', 'lu', 'luinc', 'magic', 'mahalanobis', 'manova',
+ 'mat2str', 'matlabroot', 'matrix_type', 'max', 'mcnemar_test',
+ 'md5sum', 'mean', 'meansq', 'median', 'menu', 'mesh', 'meshc',
+ 'meshgrid', 'meshz', 'mex', 'mexext', 'mgorth', 'mkoctfile', 'mkpp',
+ 'mode', 'moment', 'movefile', 'mpoles', 'mu2lin', 'namelengthmax',
+ 'nargchk', 'narginchk', 'nargoutchk', 'nbincdf', 'nbininv', 'nbinpdf',
+ 'nbinrnd', 'nchoosek', 'ndgrid', 'newplot', 'news', 'nextpow2',
+ 'nonzeros', 'normcdf', 'normest', 'norminv', 'normpdf', 'normrnd',
+ 'now', 'nproc', 'nthargout', 'nthroot', 'ntsc2rgb', 'null', 'num2str',
+ 'ocean', 'ols', 'onenormest', 'optimget', 'optimset', 'orderfields',
+ 'orient', 'orth', 'pack', 'paren', 'pareto', 'parseparams', 'pascal',
+ 'patch', 'pathdef', 'pbaspect', 'pcg', 'pchip', 'pcolor', 'pcr',
+ 'peaks', 'periodogram', 'perl', 'perms', 'pie', 'pie3',
+ 'pink', 'pinv', 'pkg', 'planerot', 'playaudio', 'plot', 'plot3',
+ 'plotmatrix', 'plotyy', 'poisscdf', 'poissinv', 'poisspdf',
+ 'poissrnd', 'pol2cart', 'polar', 'poly', 'polyaffine', 'polyarea',
+ 'polyder', 'polyfit', 'polygcd', 'polyint', 'polyout',
+ 'polyreduce', 'polyval', 'polyvalm', 'postpad', 'pow2', 'powerset',
+ 'ppder', 'ppint', 'ppjumps', 'ppplot', 'ppval', 'pqpnonneg',
+ 'prctile', 'prepad', 'primes', 'print', 'printAllBuiltins',
+ 'print_usage', 'prism', 'probit', 'profexplore', 'profile',
+ 'profshow', 'prop_test_2', 'python', 'qp', 'qqplot', 'qr', 'quad',
+ 'quadcc', 'quadgk', 'quadl', 'quadv', 'quantile', 'quiver', 'quiver3',
+ 'qz', 'qzhess', 'rainbow', 'rand', 'randi', 'range', 'rank', 'ranks',
+ 'rat', 'rcond', 'reallog', 'realpow', 'realsqrt', 'record',
+ 'rectangle', 'rectint', 'recycle', 'refresh', 'refreshdata', 'regexp',
+ 'regexptranslate', 'repmat', 'residue', 'rgb2hsv',
+ 'rgb2ind', 'rgb2ntsc', 'ribbon', 'rindex', 'rmappdata', 'rmpref',
+ 'roots', 'rose', 'rosser', 'rot90', 'rotdim', 'rref', 'run',
+ 'run_count', 'run_test', 'rundemos', 'runlength', 'runtests',
+ 'saveas', 'saveaudio', 'saveobj', 'savepath', 'scatter',
+ 'scatter3', 'schur', 'sec', 'secd', 'sech', 'semicolon', 'semilogx',
+ 'semilogxerr', 'semilogy', 'semilogyerr', 'setappdata', 'setaudio',
+ 'setdiff', 'setfield', 'setpref', 'setxor', 'shading',
+ 'shg', 'shift', 'shiftdim', 'sign_test', 'sinc', 'sind',
+ 'sinetone', 'sinewave', 'skewness', 'slice', 'sombrero', 'sortrows',
+ 'spaugment', 'spconvert', 'spdiags', 'spearman', 'spectral_adf',
+ 'spectral_xdf', 'specular', 'speed', 'spencer', 'speye', 'spfun',
+ 'sph2cart', 'sphere', 'spinmap', 'spline', 'spones', 'spparms',
+ 'sprand', 'sprandn', 'sprandsym', 'spring', 'spstats', 'spy', 'sqp',
+ 'sqrtm', 'stairs', 'statistics', 'std', 'stdnormal_cdf',
+ 'stdnormal_inv', 'stdnormal_pdf', 'stdnormal_rnd', 'stem', 'stem3',
+ 'stft', 'str2double', 'str2num', 'strcat', 'strchr',
+ 'strfind', 'strjust', 'strmatch', 'strread', 'strsplit', 'strtok',
+ 'strtrim', 'strtrunc', 'structfun', 'sub2ind',
+ 'subplot', 'subsindex', 'subspace', 'substr', 'substruct', 'summer',
+ 'surf', 'surface', 'surfc', 'surfl', 'surfnorm', 'svd', 'svds',
+ 'swapbytes', 'syl', 'symbfact', 'symrcm',
+ 'symvar', 'synthesis', 't_test', 't_test_2', 't_test_regression',
+ 'table', 'tand', 'tar', 'tcdf', 'tempdir', 'tempname', 'test', 'text',
+ 'textread', 'textscan', 'time', 'tinv', 'title', 'toeplitz', 'tpdf',
+ 'trace', 'trapz', 'treelayout', 'treeplot', 'tril', 'trimesh',
+ 'triplequad', 'triplot', 'trisurf', 'trnd', 'tsearch', 'tsearchn',
+ 'type', 'typecast', 'u_test', 'uicontextmenu', 'uicontrol',
+ 'uigetdir', 'uigetfile', 'uimenu', 'uipanel', 'uipushtool',
+ 'uiputfile', 'uiresume', 'uitoggletool', 'uitoolbar', 'uiwait',
+ 'unidcdf', 'unidinv', 'unidpdf', 'unidrnd', 'unifcdf', 'unifinv',
+ 'unifpdf', 'unifrnd', 'unimplemented', 'union', 'unique', 'unix',
+ 'unmkpp', 'unpack', 'untabify', 'untar', 'unwrap', 'unzip',
+ 'urlwrite', 'usejava', 'validatestring', 'vander', 'var',
+ 'var_test', 'vech', 'ver', 'version', 'view', 'voronoi', 'voronoin',
+ 'waitbar', 'waitforbuttonpress', 'warning_ids', 'wavread', 'wavwrite',
+ 'wblcdf', 'wblinv', 'wblpdf', 'wblrnd', 'weekday',
+ 'welch_test', 'what', 'which',
+ 'white', 'whitebg', 'wienrnd', 'wilcoxon_test', 'wilkinson', 'winter',
+ 'xlabel', 'xlim', 'xor', 'ylabel', 'ylim', 'yulewalker', 'z_test',
+ 'z_test_2', 'zip', 'zlabel', 'zlim', 'zscore', 'airy', 'arrayfun',
+ 'besselh', 'besseli', 'besselk', 'bessely', 'bitpack', 'bitunpack',
+ 'blkmm', 'cellindexmat', 'cellslices', 'chol2inv', 'choldelete',
+ 'cholinsert', 'cholinv', 'cholshift', 'cholupdate', 'convn',
+ 'csymamd', 'cummax', 'cummin', 'daspk_options', 'dasrt_options',
+ 'dassl_options', 'endgrent', 'endpwent', 'etree', 'getgrgid',
+ 'getgrnam', 'getpwnam', 'getpwuid', 'gmtime', 'gui_mode', 'ifft',
+ 'ifft2', 'ifftn', 'ind2sub', 'inverse', 'localtime', 'lsode_options',
+ 'luupdate', 'mat2cell', 'min', 'mktime', 'mouse_wheel_zoom',
+ 'num2cell', 'num2hex', 'qrdelete', 'qrinsert', 'qrshift', 'qrupdate',
+ 'quad_options', 'rande', 'randg', 'randn', 'randp', 'randperm',
+ 'regexpi', 'regexprep', 'rsf2csf', 'setgrent', 'setpwent', 'sprank',
+ 'strftime', 'strptime', 'strrep', 'svd_driver', 'symamd', 'triu',
+ 'urlread'
+ ),
+ // Private builtin
+ 7 => array(
+ '__accumarray_max__', '__accumarray_min__', '__accumarray_sum__',
+ '__accumdim_sum__', '__builtins__', '__calc_dimensions__',
+ '__current_scope__', '__display_tokens__', '__dump_symtab_info__',
+ '__end__', '__get__', '__go_axes__', '__go_axes_init__',
+ '__go_delete__', '__go_execute_callback__', '__go_figure__',
+ '__go_figure_handles__', '__go_handles__', '__go_hggroup__',
+ '__go_image__', '__go_line__', '__go_patch__', '__go_surface__',
+ '__go_text__', '__go_uicontextmenu__', '__go_uicontrol__',
+ '__go_uimenu__', '__go_uipanel__', '__go_uipushtool__',
+ '__go_uitoggletool__', '__go_uitoolbar__', '__gud_mode__',
+ '__image_pixel_size__', '__is_handle_visible__', '__isa_parent__',
+ '__keywords__', '__lexer_debug_flag__', '__list_functions__',
+ '__operators__', '__parent_classes__', '__parser_debug_flag__',
+ '__pathorig__', '__profiler_data__', '__profiler_enable__',
+ '__profiler_reset__', '__request_drawnow__', '__sort_rows_idx__',
+ '__token_count__', '__varval__', '__version_info__', '__which__'
+ ),
+ // Private Octave functions
+ 8 => array(
+ '__all_opts__', '__contourc__', '__delaunayn__', '__dispatch__',
+ '__dsearchn__', '__finish__', '__fltk_uigetfile__',
+ '__glpk__', '__gnuplot_drawnow__', '__init_fltk__',
+ '__init_gnuplot__', '__lin_interpn__', '__magick_read__',
+ '__makeinfo__', '__pchip_deriv__', '__plt_get_axis_arg__', '__qp__',
+ '__voronoi__', '__fltk_maxtime__', '__fltk_redraw__', '__ftp__',
+ '__ftp_ascii__', '__ftp_binary__', '__ftp_close__', '__ftp_cwd__',
+ '__ftp_delete__', '__ftp_dir__', '__ftp_mget__', '__ftp_mkdir__',
+ '__ftp_mode__', '__ftp_mput__', '__ftp_pwd__', '__ftp_rename__',
+ '__ftp_rmdir__', '__magick_finfo__', '__magick_format_list__',
+ '__magick_write__'
+ ),
+ // Builtin Global Variables
+ 9 => array(
+ 'EDITOR', 'EXEC_PATH', 'F_DUPFD', 'F_GETFD', 'F_GETFL', 'F_SETFD',
+ 'F_SETFL', 'IMAGE_PATH', 'OCTAVE_HOME',
+ 'OCTAVE_VERSION', 'O_APPEND', 'O_ASYNC', 'O_CREAT', 'O_EXCL',
+ 'O_NONBLOCK', 'O_RDONLY', 'O_RDWR', 'O_SYNC', 'O_TRUNC', 'O_WRONLY',
+ 'PAGER', 'PAGER_FLAGS', 'PS1', 'PS2', 'PS4', 'SEEK_CUR', 'SEEK_END',
+ 'SEEK_SET', 'SIG', 'S_ISBLK', 'S_ISCHR', 'S_ISDIR', 'S_ISFIFO',
+ 'S_ISLNK', 'S_ISREG', 'S_ISSOCK', 'WCONTINUE', 'WCOREDUMP',
+ 'WEXITSTATUS', 'WIFCONTINUED', 'WIFEXITED', 'WIFSIGNALED',
+ 'WIFSTOPPED', 'WNOHANG', 'WSTOPSIG', 'WTERMSIG', 'WUNTRACED'
+ ),
+ // Constant functions
+ 10 => array (
+ 'e', 'eps', 'inf', 'Inf', 'nan', 'NaN', 'NA', 'pi', 'i', 'I', 'j',
+ 'J', 'true', 'false'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ // Comparison & logical
+ 0 => array(
+ '!', '!=', '&', '&&','|', '||', '~', '~=',
+ '<', '<=', '==', '>', '>='
+ ),
+ // Aritmethical
+ 1 => array(
+ '*', '**', '+', '++', '-', '--', '/', "\\","'"
+ ),
+ // Elementwise arithmetical
+ 2 => array(
+ '.*', '.**','./', '.^', '^',".\\",".'"
+ ),
+ // Arithmetical & assignation
+ 3 => array(
+ '*=','+=','-=','/=','\=','**=','^=',
+ '.*=','.+=','.-=','./=','.\=','.**=','.^=','='
+ ),
+ // Indexer
+ 4 => array(
+ ':'
+ ),
+ // Delimiters
+ 5 => array(
+ ',', '...', ';'
+ ),
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ 9 => true,
+ 10 => true,
+ ),
+ 'URLS' => array(
+ 1 => 'http://octave.sourceforge.net/octave/function/{FNAME}.html',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => 'http://octave.sourceforge.net/octave/function/{FNAME}.html',
+ 6 => 'http://octave.sourceforge.net/octave/function/{FNAME}.html',
+ 7 => '',
+ 8 => '',
+ 9 => 'http://octave.sourceforge.net/octave/function/{FNAME}.html',
+ 10 => 'http://octave.sourceforge.net/octave/function/{FNAME}.html',
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ ),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'STYLES' => array(
+ 'COMMENTS' => array(
+ 1 => 'color: #0000FF; font-style: italic;', // single quote strings
+ 2 => 'color: #0000FF; font-style: italic;', // double quote strings
+ 3 => 'color: #FF00FF; font-style: italic;', // single quote strings
+ 4 => 'color: #FF00FF; font-style: italic;', // double quote strings
+ 5 => 'color: #0000FF; font-style: italic;', // block comments
+ 6 => 'color: #996600; font-weight:bold;', // packaging system
+ 7 => 'color: #006600; font-weight:bold;', // function handles
+ 'MULTI' => 'color: #0000FF; font-style: italic;',
+ ),
+ 'KEYWORDS' => array(
+ 1 => 'color: #2E8B57; font-weight:bold;', // Data types
+ 2 => 'color: #2E8B57;', // Storage type
+ 3 => 'color: #0000FF; font-weight:bold;', // Internal variable
+ 4 => 'color: #990000; font-weight:bold;', // Reserved words
+ 5 => 'color: #008A8C; font-weight:bold;', // Built-in
+ 6 => 'color: #008A8C;', // Octave functions
+ 9 => 'color: #000000; font-weight:bold;', // Builtin Global Variables
+ 10 => 'color: #008A8C; font-weight:bold;', // Constant functions
+ ),
+ 'ESCAPE_CHAR' => array(),
+ 'BRACKETS' => array(
+ 0 => 'color: #080;',
+ ),
+ 'STRINGS' => array(
+ // strings were specified on the COMMENT_REGEXP section
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ ),
+ 'METHODS' => array(),
+ 'SYMBOLS' => array(
+ 0 => 'color: #FF9696; font-weight:bold;', // Comparison & logical
+ 1 => 'color: #CC0000; font-weight:bold;', // Aritmethical
+ 2 => 'color: #993333; font-weight:bold;', // Elementwise arithmetical
+ 3 => 'color: #FF0000; font-weight:bold;', // Arithmetical & assignation
+ 4 => 'color: #33F;', // Indexer
+ 5 => 'color: #33F;', // Delimiters
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array(),
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oobas.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oobas.php
new file mode 100644
index 00000000..ff75af65
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oobas.php
@@ -0,0 +1,135 @@
+<?php
+/*************************************************************************************
+ * oobas.php
+ * ---------
+ * Author: Roberto Rossi (rsoftware@altervista.org)
+ * Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/08/30
+ *
+ * OpenOffice.org Basic language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'OpenOffice.org Basic',
+ 'COMMENT_SINGLE' => array(1 => "'"),
+ 'COMMENT_MULTI' => array(),
+ //Single-Line comments using REM keyword
+ 'COMMENT_REGEXP' => array(2 => '/\bREM.*?$/i'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'dim','private','public','global','as','if','redim','true','set','byval',
+ 'false','bool','double','integer','long','object','single','variant',
+ 'msgbox','print','inputbox','green','blue','red','qbcolor',
+ 'rgb','open','close','reset','freefile','get','input','line',
+ 'put','write','loc','seek','eof','lof','chdir','chdrive',
+ 'curdir','dir','fileattr','filecopy','filedatetime','fileexists',
+ 'filelen','getattr','kill','mkdir','name','rmdir','setattr',
+ 'dateserial','datevalue','day','month','weekday','year','cdatetoiso',
+ 'cdatefromiso','hour','minute','second','timeserial','timevalue',
+ 'date','now','time','timer','erl','err','error','on','goto','resume',
+ 'and','eqv','imp','not','or','xor','mod','atn','cos','sin','tan','log',
+ 'exp','rnd','randomize','sqr','fix','int','abs','sgn','hex','oct',
+ 'it','then','else','select','case','iif','do','loop','for','next','to',
+ 'while','wend','gosub','return','call','choose','declare',
+ 'end','exit','freelibrary','function','rem','stop','sub','switch','with',
+ 'cbool','cdate','cdbl','cint','clng','const','csng','cstr','defbool',
+ 'defdate','defdbl','defint','deflng','asc','chr','str','val','cbyte',
+ 'space','string','format','lcase','left','lset','ltrim','mid','right',
+ 'rset','rtrim','trim','ucase','split','join','converttourl','convertfromurl',
+ 'instr','len','strcomp','beep','shell','wait','getsystemticks','environ',
+ 'getsolarversion','getguitype','twipsperpixelx','twipsperpixely',
+ 'createunostruct','createunoservice','getprocessservicemanager',
+ 'createunodialog','createunolistener','createunovalue','thiscomponent',
+ 'globalscope'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080;',
+ 2 => 'color: #808080;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oorexx.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oorexx.php
new file mode 100644
index 00000000..62c6cc46
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oorexx.php
@@ -0,0 +1,171 @@
+<?php
+/*************************************************************************************
+ * oorexx.php
+ * ---------------------------------
+ * Author: Jon Wolfers (sahananda@windhorse.biz)
+ * Contributors:
+ * - Walter Pachl (pachl@chello.at)
+ * Copyright: (c) 2008 Jon Wolfers, (c) 2012 Walter Pachl
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/01/07
+ *
+ * ooRexx language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/07/29 (1.0.0)
+ * - tried to get it syntactically right
+ *
+ * TODO (updated 2012/07/29)
+ * -------------------------
+ * - Get it working on rosettacode.org
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ooRexx',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'address', 'arg', 'attribute', 'call', 'constant', 'do',
+ 'drop', 'exit', 'if',
+ 'interpret', 'iterate', 'leave', 'loop', 'nop', 'numeric',
+ 'parse', 'procedure', 'pull', 'push', 'queue',
+ 'raise', 'reply', 'return', 'say', 'select', 'signal',
+ 'use'
+ ),
+ 2 => array(
+ 'abstract', 'any', 'arguments', 'array', 'by',
+ 'continue', 'digits', 'engineering', 'error',
+ 'expose', 'external', 'failure', 'for', 'forever',
+ 'forward', 'get', 'guard', 'guarded', 'halt',
+ 'inherit', 'library', 'lostdigits', 'message',
+ 'metaclass', 'mixinclass', 'name', 'nomethod', 'nostring',
+ 'notready', 'novalue', 'off', 'on', 'options', 'over',
+ 'private', 'protected', 'public', 'scientific', 'set',
+ 'source', 'subclass', 'syntax', 'to', 'unguarded',
+ 'unprotected', 'until', 'user',
+ 'version', 'while', 'with'
+ ),
+ 3 => array(
+ 'else', 'end', 'otherwise', 'then', 'when'
+ ),
+ 4 => array(
+ 'rc', 'result', 'self', 'sigl', 'super'
+ ),
+ 5 => array(
+ '::attribute', '::class', '::constant', '::method',
+ '::optins', '::requires', '::routine'
+ ),
+ 6 => array(
+ 'abbrev', 'abs', 'beep', 'bitand', 'bitor',
+ 'bitxor', 'b2x', 'center', 'centre', 'changestr', 'charin',
+ 'charout', 'chars', 'compare', 'condition', 'copies',
+ 'countstr', 'c2d', 'c2x', 'datatype', 'date', 'delstr',
+ 'delword', 'directory', 'd2c', 'd2x', 'endlocal',
+ 'errortext', 'filespec', 'form', 'format', 'fuzz', 'insert',
+ 'lastpos', 'left', 'length', 'linein', 'lineout', 'lines',
+ 'lower', 'max', 'min', 'overlay', 'pos', 'qualify', 'queued',
+ 'random', 'reverse', 'right', 'rxfuncadd', 'rxfuncdrop',
+ 'rxfuncquery', 'rxqueue', 'setlocal', 'sign', 'sourceline',
+ 'space', 'stream', 'strip', 'substr', 'subword', 'symbol',
+ 'time', 'trace', 'translate', 'trunc', 'upper', 'userid',
+ 'value', 'var', 'verify', 'word', 'wordindex', 'wordlength',
+ 'wordpos', 'words', 'xrange', 'x2b', 'x2c', 'x2d'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '<', '>', '[', ']', '=', '+', '-', '*', '/', '!', '%', '^', '&', ':',
+ '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #ff0000; font-weight: bold;',
+ 3 => 'color: #00ff00; font-weight: bold;',
+ 4 => 'color: #0000ff; font-weight: bold;',
+ 5 => 'color: #880088; font-weight: bold;',
+ 6 => 'color: #888800; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666;',
+ 'MULTI' => 'color: #808080;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oracle11.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oracle11.php
new file mode 100644
index 00000000..16259e69
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oracle11.php
@@ -0,0 +1,614 @@
+<?php
+/*************************************************************************************
+ * oracle11.php
+ * -----------
+ * Author: Guy Wicks (Guy.Wicks@rbs.co.uk)
+ * Contributions:
+ * - Updated for 11i by Simon Redhead
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/04
+ *
+ * Oracle 11i language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/04/08 (1.0.8)
+ * - SR changes to oracle8.php to support Oracle 11i reserved words.
+ * 2005/01/29 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Oracle 11 SQL',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
+ 'QUOTEMARKS' => array("'", '"', '`'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+//Put your package names here - e.g. select distinct ''''|| lower(name) || ''',' from user_source;
+// 6 => array(
+// ),
+
+//Put your table names here - e.g. select distinct ''''|| lower(table_name) || ''',' from user_tables;
+// 5 => array(
+// ),
+
+//Put your view names here - e.g. select distinct ''''|| lower(view_name) || ''',' from user_views;
+// 4 => array(
+// ),
+
+//Put your table field names here - e.g. select distinct ''''|| lower(column_name) || ''',' from user_tab_columns;
+// 3 => array(
+// ),
+
+ //Put ORACLE reserved keywords here (11i). I like mine uppercase.
+ 1 => array(
+ 'ABS',
+ 'ACCESS',
+ 'ACOS',
+ 'ADD',
+ 'ADD_MONTHS',
+ 'ALL',
+ 'ALTER',
+ 'ANALYZE',
+ 'AND',
+ 'ANY',
+ 'APPENDCHILDXML',
+ 'ARRAY',
+ 'AS',
+ 'ASC',
+ 'ASCII',
+ 'ASCIISTR',
+ 'ASIN',
+ 'ASSOCIATE',
+ 'AT',
+ 'ATAN',
+ 'ATAN2',
+ 'AUDIT',
+ 'AUTHID',
+ 'AVG',
+ 'BEGIN',
+ 'BETWEEN',
+ 'BFILENAME',
+ 'BIN_TO_NUM',
+ 'BINARY_INTEGER',
+ 'BITAND',
+ 'BODY',
+ 'BOOLEAN',
+ 'BULK',
+ 'BY',
+ 'CALL',
+ 'CARDINALITY',
+ 'CASCADE',
+ 'CASE',
+ 'CAST',
+ 'CEIL',
+ 'CHAR',
+ 'CHAR_BASE',
+ 'CHARTOROWID',
+ 'CHECK',
+ 'CHR',
+ 'CLOSE',
+ 'CLUSTER',
+ 'CLUSTER_ID',
+ 'CLUSTER_PROBABILITY',
+ 'CLUSTER_SET',
+ 'COALESCE',
+ 'COLLECT',
+ 'COLUMN',
+ 'COMMENT',
+ 'COMMIT',
+ 'COMPOSE',
+ 'COMPRESS',
+ 'CONCAT',
+ 'CONNECT',
+ 'CONSTANT',
+ 'CONSTRAINT',
+ 'CONSTRAINTS',
+ 'CONTEXT',
+ 'CONTROLFILE',
+ 'CONVERT',
+ 'CORR',
+ 'CORR_K',
+ 'CORR_S',
+ 'COS',
+ 'COSH',
+ 'COST',
+ 'COUNT',
+ 'COVAR_POP',
+ 'COVAR_SAMP',
+ 'CREATE',
+ 'CUBE_TABLE',
+ 'CUME_DIST',
+ 'CURRENT',
+ 'CURRENT_DATE',
+ 'CURRENT_TIMESTAMP',
+ 'CURRVAL',
+ 'CURSOR',
+ 'CV',
+ 'DATABASE',
+ 'DATAOBJ_TO_PARTITION',
+ 'DATE',
+ 'DAY',
+ 'DBTIMEZONE',
+ 'DECIMAL',
+ 'DECLARE',
+ 'DECODE',
+ 'DECOMPOSE',
+ 'DEFAULT',
+ 'DELETE',
+ 'DELETEXML',
+ 'DENSE_RANK',
+ 'DEPTH',
+ 'DEREF',
+ 'DESC',
+ 'DIMENSION',
+ 'DIRECTORY',
+ 'DISASSOCIATE',
+ 'DISTINCT',
+ 'DO',
+ 'DROP',
+ 'DUMP',
+ 'ELSE',
+ 'ELSIF',
+ 'EMPTY_BLOB',
+ 'EMPTY_CLOB',
+ 'END',
+ 'EXCEPTION',
+ 'EXCLUSIVE',
+ 'EXEC',
+ 'EXECUTE',
+ 'EXISTS',
+ 'EXISTSNODE',
+ 'EXIT',
+ 'EXP',
+ 'EXPLAIN',
+ 'EXTENDS',
+ 'EXTRACT',
+ 'EXTRACTVALUE',
+ 'FALSE',
+ 'FEATURE_ID',
+ 'FEATURE_SET',
+ 'FEATURE_VALUE',
+ 'FETCH',
+ 'FILE',
+ 'FIRST',
+ 'FIRST_VALUE',
+ 'FLOAT',
+ 'FLOOR',
+ 'FOR',
+ 'FORALL',
+ 'FROM',
+ 'FROM_TZ',
+ 'FUNCTION',
+ 'GOTO',
+ 'GRANT',
+ 'GREATEST',
+ 'GROUP',
+ 'GROUP_ID',
+ 'GROUPING',
+ 'GROUPING_ID',
+ 'HAVING',
+ 'HEAP',
+ 'HEXTORAW',
+ 'HOUR',
+ 'IDENTIFIED',
+ 'IF',
+ 'IMMEDIATE',
+ 'IN',
+ 'INCREMENT',
+ 'INDEX',
+ 'INDEXTYPE',
+ 'INDICATOR',
+ 'INITCAP',
+ 'INITIAL',
+ 'INSERT',
+ 'INSERTCHILDXML',
+ 'INSERTXMLBEFORE',
+ 'INSTR',
+ 'INSTRB',
+ 'INTEGER',
+ 'INTERFACE',
+ 'INTERSECT',
+ 'INTERVAL',
+ 'INTO',
+ 'IS',
+ 'ISOLATION',
+ 'ITERATION_NUMBER',
+ 'JAVA',
+ 'KEY',
+ 'LAG',
+ 'LAST',
+ 'LAST_DAY',
+ 'LAST_VALUE',
+ 'LEAD',
+ 'LEAST',
+ 'LENGTH',
+ 'LENGTHB',
+ 'LEVEL',
+ 'LIBRARY',
+ 'LIKE',
+ 'LIMITED',
+ 'LINK',
+ 'LN',
+ 'LNNVL',
+ 'LOCALTIMESTAMP',
+ 'LOCK',
+ 'LOG',
+ 'LONG',
+ 'LOOP',
+ 'LOWER',
+ 'LPAD',
+ 'LTRIM',
+ 'MAKE_REF',
+ 'MATERIALIZED',
+ 'MAX',
+ 'MAXEXTENTS',
+ 'MEDIAN',
+ 'MIN',
+ 'MINUS',
+ 'MINUTE',
+ 'MLSLABEL',
+ 'MOD',
+ 'MODE',
+ 'MODIFY',
+ 'MONTH',
+ 'MONTHS_BETWEEN',
+ 'NANVL',
+ 'NATURAL',
+ 'NATURALN',
+ 'NCHR',
+ 'NEW',
+ 'NEW_TIME',
+ 'NEXT_DAY',
+ 'NEXTVAL',
+ 'NLS_CHARSET_DECL_LEN',
+ 'NLS_CHARSET_ID',
+ 'NLS_CHARSET_NAME',
+ 'NLS_INITCAP',
+ 'NLS_LOWER',
+ 'NLS_UPPER',
+ 'NLSSORT',
+ 'NOAUDIT',
+ 'NOCOMPRESS',
+ 'NOCOPY',
+ 'NOT',
+ 'NOWAIT',
+ 'NTILE',
+ 'NULL',
+ 'NULLIF',
+ 'NUMBER',
+ 'NUMBER_BASE',
+ 'NUMTODSINTERVAL',
+ 'NUMTOYMINTERVAL',
+ 'NVL',
+ 'NVL2',
+ 'OCIROWID',
+ 'OF',
+ 'OFFLINE',
+ 'ON',
+ 'ONLINE',
+ 'OPAQUE',
+ 'OPEN',
+ 'OPERATOR',
+ 'OPTION',
+ 'OR',
+ 'ORA_HASH',
+ 'ORDER',
+ 'ORGANIZATION',
+ 'OTHERS',
+ 'OUT',
+ 'OUTLINE',
+ 'PACKAGE',
+ 'PARTITION',
+ 'PATH',
+ 'PCTFREE',
+ 'PERCENT_RANK',
+ 'PERCENTILE_CONT',
+ 'PERCENTILE_DISC',
+ 'PLAN',
+ 'PLS_INTEGER',
+ 'POSITIVE',
+ 'POSITIVEN',
+ 'POWER',
+ 'POWERMULTISET',
+ 'POWERMULTISET_BY_CARDINALITY',
+ 'PRAGMA',
+ 'PREDICTION',
+ 'PREDICTION_BOUNDS',
+ 'PREDICTION_COST',
+ 'PREDICTION_DETAILS',
+ 'PREDICTION_PROBABILITY',
+ 'PREDICTION_SET',
+ 'PRESENTNNV',
+ 'PRESENTV',
+ 'PREVIOUS',
+ 'PRIMARY',
+ 'PRIOR',
+ 'PRIVATE',
+ 'PRIVILEGES',
+ 'PROCEDURE',
+ 'PROFILE',
+ 'PUBLIC',
+ 'RAISE',
+ 'RANGE',
+ 'RANK',
+ 'RATIO_TO_REPORT',
+ 'RAW',
+ 'RAWTOHEX',
+ 'RAWTONHEX',
+ 'REAL',
+ 'RECORD',
+ 'REF',
+ 'REFTOHEX',
+ 'REGEXP_COUNT',
+ 'REGEXP_INSTR',
+ 'REGEXP_REPLACE',
+ 'REGEXP_SUBSTR',
+ 'REGR_AVGX',
+ 'REGR_AVGY',
+ 'REGR_COUNT',
+ 'REGR_INTERCEPT',
+ 'REGR_R2',
+ 'REGR_SLOPE',
+ 'REGR_SXX',
+ 'REGR_SXY',
+ 'REGR_SYY',
+ 'RELEASE',
+ 'REMAINDER',
+ 'RENAME',
+ 'REPLACE',
+ 'RESOURCE',
+ 'RETURN',
+ 'RETURNING',
+ 'REVERSE',
+ 'REVOKE',
+ 'ROLE',
+ 'ROLLBACK',
+ 'ROUND',
+ 'ROW',
+ 'ROW_NUMBER',
+ 'ROWID',
+ 'ROWIDTOCHAR',
+ 'ROWIDTONCHAR',
+ 'ROWNUM',
+ 'ROWS',
+ 'ROWTYPE',
+ 'RPAD',
+ 'RTRIM',
+ 'SAVEPOINT',
+ 'SCHEMA',
+ 'SCN_TO_TIMESTAMP',
+ 'SECOND',
+ 'SEGMENT',
+ 'SELECT',
+ 'SEPERATE',
+ 'SEQUENCE',
+ 'SESSION',
+ 'SESSIONTIMEZONE',
+ 'SET',
+ 'SHARE',
+ 'SIGN',
+ 'SIN',
+ 'SINH',
+ 'SIZE',
+ 'SMALLINT',
+ 'SOUNDEX',
+ 'SPACE',
+ 'SQL',
+ 'SQLCODE',
+ 'SQLERRM',
+ 'SQRT',
+ 'START',
+ 'STATISTICS',
+ 'STATS_BINOMIAL_TEST',
+ 'STATS_CROSSTAB',
+ 'STATS_F_TEST',
+ 'STATS_KS_TEST',
+ 'STATS_MODE',
+ 'STATS_MW_TEST',
+ 'STATS_ONE_WAY_ANOVA',
+ 'STATS_T_TEST_INDEP',
+ 'STATS_T_TEST_INDEPU',
+ 'STATS_T_TEST_ONE',
+ 'STATS_T_TEST_PAIRED',
+ 'STATS_WSR_TEST',
+ 'STDDEV',
+ 'STDDEV_POP',
+ 'STDDEV_SAMP',
+ 'STOP',
+ 'SUBSTR',
+ 'SUBSTRB',
+ 'SUBTYPE',
+ 'SUCCESSFUL',
+ 'SUM',
+ 'SYNONYM',
+ 'SYS_CONNECT_BY_PATH',
+ 'SYS_CONTEXT',
+ 'SYS_DBURIGEN',
+ 'SYS_EXTRACT_UTC',
+ 'SYS_GUID',
+ 'SYS_TYPEID',
+ 'SYS_XMLAGG',
+ 'SYS_XMLGEN',
+ 'SYSDATE',
+ 'SYSTEM',
+ 'SYSTIMESTAMP',
+ 'TABLE',
+ 'TABLESPACE',
+ 'TAN',
+ 'TANH',
+ 'TEMPORARY',
+ 'THEN',
+ 'TIME',
+ 'TIMESTAMP',
+ 'TIMESTAMP_TO_SCN',
+ 'TIMEZONE_ABBR',
+ 'TIMEZONE_HOUR',
+ 'TIMEZONE_MINUTE',
+ 'TIMEZONE_REGION',
+ 'TIMING',
+ 'TO',
+ 'TO_BINARY_DOUBLE',
+ 'TO_BINARY_FLOAT',
+ 'TO_CHAR',
+ 'TO_CLOB',
+ 'TO_DATE',
+ 'TO_DSINTERVAL',
+ 'TO_LOB',
+ 'TO_MULTI_BYTE',
+ 'TO_NCHAR',
+ 'TO_NCLOB',
+ 'TO_NUMBER',
+ 'TO_SINGLE_BYTE',
+ 'TO_TIMESTAMP',
+ 'TO_TIMESTAMP_TZ',
+ 'TO_YMINTERVAL',
+ 'TRANSACTION',
+ 'TRANSLATE',
+ 'TREAT',
+ 'TRIGGER',
+ 'TRIM',
+ 'TRUE',
+ 'TRUNC',
+ 'TRUNCATE',
+ 'TYPE',
+ 'TZ_OFFSET',
+ 'UI',
+ 'UID',
+ 'UNION',
+ 'UNIQUE',
+ 'UNISTR',
+ 'UPDATE',
+ 'UPDATEXML',
+ 'UPPER',
+ 'USE',
+ 'USER',
+ 'USERENV',
+ 'USING',
+ 'VALIDATE',
+ 'VALUE',
+ 'VALUES',
+ 'VAR_POP',
+ 'VAR_SAMP',
+ 'VARCHAR',
+ 'VARCHAR2',
+ 'VARIANCE',
+ 'VIEW',
+ 'VSIZE',
+ 'WHEN',
+ 'WHENEVER',
+ 'WHERE',
+ 'WHILE',
+ 'WIDTH_BUCKET',
+ 'WITH',
+ 'WORK',
+ 'WRITE',
+ 'XMLAGG',
+ 'XMLCAST',
+ 'XMLCDATA',
+ 'XMLCOLATTVAL',
+ 'XMLCOMMENT',
+ 'XMLCONCAT',
+ 'XMLDIFF',
+ 'XMLELEMENT',
+ 'XMLEXISTS',
+ 'XMLFOREST',
+ 'XMLPARSE',
+ 'XMLPATCH',
+ 'XMLPI',
+ 'XMLQUERY',
+ 'XMLROOT',
+ 'XMLSEQUENCE',
+ 'XMLSERIALIZE',
+ 'XMLTABLE',
+ 'XMLTRANSFORM',
+ 'YEAR',
+ 'ZONE'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '=', '<', '>', '|', '+', '-', '*', '/', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+// 3 => false,
+// 4 => false,
+// 5 => false,
+// 6 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #993333; font-weight: bold; text-transform: uppercase;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #ff0000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+// 3 => '',
+// 4 => '',
+// 5 => '',
+// 6 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oracle8.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oracle8.php
new file mode 100644
index 00000000..145bda40
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oracle8.php
@@ -0,0 +1,496 @@
+<?php
+/*************************************************************************************
+ * oracle8.php
+ * -----------
+ * Author: Guy Wicks (Guy.Wicks@rbs.co.uk)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/04
+ *
+ * Oracle 8 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/01/29 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Oracle 8 SQL',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
+ 'QUOTEMARKS' => array("'", '"', '`'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+//Put your package names here - e.g. select distinct ''''|| lower(name) || ''',' from user_source;
+// 6 => array(
+// ),
+
+//Put your table names here - e.g. select distinct ''''|| lower(table_name) || ''',' from user_tables;
+// 5 => array(
+// ),
+
+//Put your view names here - e.g. select distinct ''''|| lower(view_name) || ''',' from user_views;
+// 4 => array(
+// ),
+
+//Put your table field names here - e.g. select distinct ''''|| lower(column_name) || ''',' from user_tab_columns;
+// 3 => array(
+// ),
+
+//Put ORACLE reserved keywords here (8.1.7). I like mine uppercase.
+ 1 => array(
+ 'ABS',
+ 'ACCESS',
+ 'ACOS',
+ 'ADD',
+ 'ADD_MONTHS',
+ 'ALL',
+ 'ALTER',
+ 'ANALYZE',
+ 'AND',
+ 'ANY',
+ 'ARRAY',
+ 'AS',
+ 'ASC',
+ 'ASCII',
+ 'ASIN',
+ 'ASSOCIATE',
+ 'AT',
+ 'ATAN',
+ 'ATAN2',
+ 'AUDIT',
+ 'AUTHID',
+ 'AVG',
+ 'BEGIN',
+ 'BETWEEN',
+ 'BFILENAME',
+ 'BINARY_INTEGER',
+ 'BITAND',
+ 'BODY',
+ 'BOOLEAN',
+ 'BULK',
+ 'BY',
+ 'CALL',
+ 'CASCADE',
+ 'CASE',
+ 'CEIL',
+ 'CHAR',
+ 'CHAR_BASE',
+ 'CHARTOROWID',
+ 'CHECK',
+ 'CHR',
+ 'CLOSE',
+ 'CLUSTER',
+ 'COALESCE',
+ 'COLLECT',
+ 'COLUMN',
+ 'COMMENT',
+ 'COMMIT',
+ 'COMPRESS',
+ 'CONCAT',
+ 'CONNECT',
+ 'CONSTANT',
+ 'CONSTRAINT',
+ 'CONSTRAINTS',
+ 'CONTEXT',
+ 'CONTROLFILE',
+ 'CONVERT',
+ 'CORR',
+ 'COS',
+ 'COSH',
+ 'COST',
+ 'COUNT',
+ 'COVAR_POP',
+ 'COVAR_SAMP',
+ 'CREATE',
+ 'CUME_DIST',
+ 'CURRENT',
+ 'CURRVAL',
+ 'CURSOR',
+ 'DATABASE',
+ 'DATE',
+ 'DAY',
+ 'DECIMAL',
+ 'DECLARE',
+ 'DECODE',
+ 'DEFAULT',
+ 'DELETE',
+ 'DENSE_RANK',
+ 'DEREF',
+ 'DESC',
+ 'DIMENSION',
+ 'DIRECTORY',
+ 'DISASSOCIATE',
+ 'DISTINCT',
+ 'DO',
+ 'DROP',
+ 'DUMP',
+ 'ELSE',
+ 'ELSIF',
+ 'EMPTY_BLOB',
+ 'EMPTY_CLOB',
+ 'END',
+ 'EXCEPTION',
+ 'EXCLUSIVE',
+ 'EXEC',
+ 'EXECUTE',
+ 'EXISTS',
+ 'EXIT',
+ 'EXP',
+ 'EXPLAIN',
+ 'EXTENDS',
+ 'EXTRACT',
+ 'FALSE',
+ 'FETCH',
+ 'FILE',
+ 'FIRST_VALUE',
+ 'FLOAT',
+ 'FLOOR',
+ 'FOR',
+ 'FORALL',
+ 'FROM',
+ 'FUNCTION',
+ 'GOTO',
+ 'GRANT',
+ 'GREATEST',
+ 'GROUP',
+ 'GROUPING',
+ 'HAVING',
+ 'HEAP',
+ 'HEXTORAW',
+ 'HOUR',
+ 'IDENTIFIED',
+ 'IF',
+ 'IMMEDIATE',
+ 'IN',
+ 'INCREMENT',
+ 'INDEX',
+ 'INDEXTYPE',
+ 'INDICATOR',
+ 'INITCAP',
+ 'INITIAL',
+ 'INSERT',
+ 'INSTR',
+ 'INSTRB',
+ 'INTEGER',
+ 'INTERFACE',
+ 'INTERSECT',
+ 'INTERVAL',
+ 'INTO',
+ 'IS',
+ 'ISOLATION',
+ 'JAVA',
+ 'KEY',
+ 'LAG',
+ 'LAST_DAY',
+ 'LAST_VALUE',
+ 'LEAD',
+ 'LEAST',
+ 'LENGTH',
+ 'LENGTHB',
+ 'LEVEL',
+ 'LIBRARY',
+ 'LIKE',
+ 'LIMITED',
+ 'LINK',
+ 'LN',
+ 'LOCK',
+ 'LOG',
+ 'LONG',
+ 'LOOP',
+ 'LOWER',
+ 'LPAD',
+ 'LTRIM',
+ 'MAKE_REF',
+ 'MATERIALIZED',
+ 'MAX',
+ 'MAXEXTENTS',
+ 'MIN',
+ 'MINUS',
+ 'MINUTE',
+ 'MLSLABEL',
+ 'MOD',
+ 'MODE',
+ 'MODIFY',
+ 'MONTH',
+ 'MONTHS_BETWEEN',
+ 'NATURAL',
+ 'NATURALN',
+ 'NEW',
+ 'NEW_TIME',
+ 'NEXT_DAY',
+ 'NEXTVAL',
+ 'NLS_CHARSET_DECL_LEN',
+ 'NLS_CHARSET_ID',
+ 'NLS_CHARSET_NAME',
+ 'NLS_INITCAP',
+ 'NLS_LOWER',
+ 'NLS_UPPER',
+ 'NLSSORT',
+ 'NOAUDIT',
+ 'NOCOMPRESS',
+ 'NOCOPY',
+ 'NOT',
+ 'NOWAIT',
+ 'NTILE',
+ 'NULL',
+ 'NULLIF',
+ 'NUMBER',
+ 'NUMBER_BASE',
+ 'NUMTODSINTERVAL',
+ 'NUMTOYMINTERVAL',
+ 'NVL',
+ 'NVL2',
+ 'OCIROWID',
+ 'OF',
+ 'OFFLINE',
+ 'ON',
+ 'ONLINE',
+ 'OPAQUE',
+ 'OPEN',
+ 'OPERATOR',
+ 'OPTION',
+ 'OR',
+ 'ORDER',
+ 'ORGANIZATION',
+ 'OTHERS',
+ 'OUT',
+ 'OUTLINE',
+ 'PACKAGE',
+ 'PARTITION',
+ 'PCTFREE',
+ 'PERCENT_RANK',
+ 'PLAN',
+ 'PLS_INTEGER',
+ 'POSITIVE',
+ 'POSITIVEN',
+ 'POWER',
+ 'PRAGMA',
+ 'PRIMARY',
+ 'PRIOR',
+ 'PRIVATE',
+ 'PRIVILEGES',
+ 'PROCEDURE',
+ 'PROFILE',
+ 'PUBLIC',
+ 'RAISE',
+ 'RANGE',
+ 'RANK',
+ 'RATIO_TO_REPORT',
+ 'RAW',
+ 'RAWTOHEX',
+ 'REAL',
+ 'RECORD',
+ 'REF',
+ 'REFTOHEX',
+ 'REGR_AVGX',
+ 'REGR_AVGY',
+ 'REGR_COUNT',
+ 'REGR_INTERCEPT',
+ 'REGR_R2',
+ 'REGR_SLOPE',
+ 'REGR_SXX',
+ 'REGR_SXY',
+ 'REGR_SYY',
+ 'RELEASE',
+ 'RENAME',
+ 'REPLACE',
+ 'RESOURCE',
+ 'RETURN',
+ 'RETURNING',
+ 'REVERSE',
+ 'REVOKE',
+ 'ROLE',
+ 'ROLLBACK',
+ 'ROUND',
+ 'ROW',
+ 'ROW_NUMBER',
+ 'ROWID',
+ 'ROWIDTOCHAR',
+ 'ROWNUM',
+ 'ROWS',
+ 'ROWTYPE',
+ 'RPAD',
+ 'RTRIM',
+ 'SAVEPOINT',
+ 'SCHEMA',
+ 'SECOND',
+ 'SEGMENT',
+ 'SELECT',
+ 'SEPERATE',
+ 'SEQUENCE',
+ 'SESSION',
+ 'SET',
+ 'SHARE',
+ 'SIGN',
+ 'SIN',
+ 'SINH',
+ 'SIZE',
+ 'SMALLINT',
+ 'SOUNDEX',
+ 'SPACE',
+ 'SQL',
+ 'SQLCODE',
+ 'SQLERRM',
+ 'SQRT',
+ 'START',
+ 'STATISTICS',
+ 'STDDEV',
+ 'STDDEV_POP',
+ 'STDDEV_SAMP',
+ 'STOP',
+ 'SUBSTR',
+ 'SUBSTRB',
+ 'SUBTYPE',
+ 'SUCCESSFUL',
+ 'SUM',
+ 'SYNONYM',
+ 'SYS_CONTEXT',
+ 'SYS_GUID',
+ 'SYSDATE',
+ 'SYSTEM',
+ 'TABLE',
+ 'TABLESPACE',
+ 'TAN',
+ 'TANH',
+ 'TEMPORARY',
+ 'THEN',
+ 'TIME',
+ 'TIMESTAMP',
+ 'TIMEZONE_ABBR',
+ 'TIMEZONE_HOUR',
+ 'TIMEZONE_MINUTE',
+ 'TIMEZONE_REGION',
+ 'TIMING',
+ 'TO',
+ 'TO_CHAR',
+ 'TO_DATE',
+ 'TO_LOB',
+ 'TO_MULTI_BYTE',
+ 'TO_NUMBER',
+ 'TO_SINGLE_BYTE',
+ 'TRANSACTION',
+ 'TRANSLATE',
+ 'TRIGGER',
+ 'TRIM',
+ 'TRUE',
+ 'TRUNC',
+ 'TRUNCATE',
+ 'TYPE',
+ 'UI',
+ 'UID',
+ 'UNION',
+ 'UNIQUE',
+ 'UPDATE',
+ 'UPPER',
+ 'USE',
+ 'USER',
+ 'USERENV',
+ 'USING',
+ 'VALIDATE',
+ 'VALUE',
+ 'VALUES',
+ 'VAR_POP',
+ 'VAR_SAMP',
+ 'VARCHAR',
+ 'VARCHAR2',
+ 'VARIANCE',
+ 'VIEW',
+ 'VSIZE',
+ 'WHEN',
+ 'WHENEVER',
+ 'WHERE',
+ 'WHILE',
+ 'WITH',
+ 'WORK',
+ 'WRITE',
+ 'YEAR',
+ 'ZONE'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '=', '<', '>', '|', '+', '-', '*', '/', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+// 3 => false,
+// 4 => false,
+// 5 => false,
+// 6 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #993333; font-weight: bold; text-transform: uppercase;'
+//Add the styles for groups 3-6 here when used
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #ff0000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+// 3 => '',
+// 4 => '',
+// 5 => '',
+// 6 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oxygene.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oxygene.php
new file mode 100644
index 00000000..bc2ee656
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oxygene.php
@@ -0,0 +1,154 @@
+<?php
+/*************************************************************************************
+ * oxygene.php
+ * ----------
+ * Author: Carlo Kok (ck@remobjects.com), J�rja Norbert (jnorbi@vipmail.hu), Benny Baumann (BenBE@omorphia.de)
+ * Copyright: (c) 2004 J�rja Norbert, Benny Baumann (BenBE@omorphia.de), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/01/11
+ *
+ * Delphi Prism (Oxygene) language file for GeSHi.
+ * Based on the original Delphi language file.
+ *
+ * CHANGES
+ * -------
+ * 2012/06/28 (1.0.8.11)
+ * - Added "write" keyword for properties
+ * 2010/01/11 (1.0.0)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Oxygene (Delphi Prism)',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('(*' => '*)', '{' => '}'),
+ //Compiler directives
+ 'COMMENT_REGEXP' => array(2 => '/{\\$.*?}|\\(\\*\\$.*?\\*\\)/U'),
+ 'CASE_KEYWORDS' => 0,
+ 'QUOTEMARKS' => array("'"),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'and', 'begin', 'case', 'const', 'div', 'do', 'downto', 'else',
+ 'end', 'for', 'function', 'if', 'in', 'mod', 'not', 'of', 'or',
+ 'procedure', 'repeat', 'record', 'set', 'shl', 'shr', 'then', 'to',
+ 'type', 'until', 'uses', 'var','while', 'with', 'xor', 'exit', 'break',
+ 'class', 'constructor', 'inherited', 'private', 'public', 'protected',
+ 'property', 'As', 'Is', 'Unit', 'Continue', 'Try', 'Except', 'Forward',
+ 'Interface','Implementation', 'nil', 'out', 'loop', 'namespace', 'true',
+ 'false', 'new', 'ensure', 'require', 'on', 'event', 'delegate', 'method',
+ 'raise', 'assembly', 'module', 'using','locking', 'old', 'invariants', 'operator',
+ 'self', 'async', 'finalizer', 'where', 'yield', 'nullable', 'Future',
+ 'From', 'Finally', 'dynamic'
+ ),
+ 2 => array(
+ 'override', 'virtual', 'External', 'read', 'add', 'remove','final', 'abstract',
+ 'empty', 'global', 'locked', 'sealed', 'reintroduce', 'implements', 'each',
+ 'default', 'partial', 'finalize', 'enum', 'flags', 'result', 'readonly', 'unsafe',
+ 'pinned', 'matching', 'static', 'has', 'step', 'iterator', 'inline', 'nested',
+ 'Implies', 'Select', 'Order', 'By', 'Desc', 'Asc', 'Group', 'Join', 'Take',
+ 'Skip', 'Concat', 'Union', 'Reverse', 'Distinct', 'Into', 'Equals', 'params',
+ 'sequence', 'index', 'notify', 'Parallel', 'create', 'array', 'Queryable', 'Aspect',
+ 'volatile', 'write'
+ ),
+ 3 => array(
+ 'chr', 'ord', 'inc', 'dec', 'assert', 'iff', 'assigned','futureAssigned', 'length', 'low', 'high', 'typeOf', 'sizeOf', 'disposeAndNil', 'Coalesce', 'unquote'
+ ),
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+// 4 => false,
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '[', ']'),
+ 1 => array('.', ',', ':', ';'),
+ 2 => array('@', '^'),
+ 3 => array('=', '+', '-', '*', '/')
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;',
+// 4 => 'color: #000066; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #008000; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #ff0000; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000066;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #000000;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #9ac;',
+ 1 => 'color: #ff0000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066;',
+ 1 => 'color: #000066;',
+ 2 => 'color: #000066;',
+ 3 => 'color: #000066;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+// 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ //Hex numbers
+ 0 => '\$[0-9a-fA-F]+',
+ //Characters
+ 1 => '\#\$?[0-9]{1,3}'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 2
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oz.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oz.php
new file mode 100644
index 00000000..d24561bf
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/oz.php
@@ -0,0 +1,144 @@
+<?php
+/*************************************************************************************
+ * oz.php
+ * --------
+ * Author: Wolfgang Meyer (Wolfgang.Meyer@gmx.net)
+ * Copyright: (c) 2010 Wolfgang Meyer
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/01/03
+ *
+ * Oz language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'OZ',
+ 'COMMENT_SINGLE' => array(1 => '%'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"','\''),
+ 'ESCAPE_CHAR' => '\\',
+ 'NUMBERS' => array(),
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'declare','local','in','end','proc','fun','functor','require','prepare',
+ 'import','export','define','at','case','then','else','of','elseof',
+ 'elsecase','if','elseif','class','from','prop','attr','feat','meth',
+ 'self','true','false','unit','div','mod','andthen','orelse','cond','or',
+ 'dis','choice','not','thread','try','catch','finally','raise','lock',
+ 'skip','fail','for','do'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true
+ ),
+ 'SYMBOLS' => array(
+ '@', '!', '|', '<-', ':=', '<', '>', '=<', '>=', '<=', '#', '~', '.',
+ '*', '-', '+', '/', '<:', '>:', '=:', '=<:', '>=:', '\\=', '\\=:', ',',
+ '!!', '...', '==', '::', ':::'
+ ),
+ 'STYLES' => array(
+ 'REGEXPS' => array(
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #00a030;',
+ 3 => 'color: #bc8f8f;',
+ 4 => 'color: #0000ff;',
+ 5 => 'color: #a020f0;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #bc8f8f;'
+ ),
+ 'KEYWORDS' => array(
+ 1 => 'color: #a020f0;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #B22222;',
+ 'MULTI' => 'color: #B22222;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #bc8f8f;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #a020f0;'
+ ),
+ 'BRACKETS' => array(),
+ 'NUMBERS' => array(),
+ 'METHODS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'REGEXPS' => array(
+ // function and procedure definition
+ 1 => array(
+ GESHI_SEARCH => "(proc|fun)([^{}\n\)]*)(\\{)([\$A-Z\300-\326\330-\336][A-Z\300-\326\330-\336a-z\337-\366\370-\3770-9_.]*)",
+ GESHI_REPLACE => '\4',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\1\2\3',
+ GESHI_AFTER => ''
+ ),
+ // class definition
+ 2 => array(
+ GESHI_SEARCH => "(class)([^A-Z\$]*)([\$A-Z\300-\326\330-\336][A-Z\300-\326\330-\336a-z\337-\366\370-\3770-9_.]*)",
+ GESHI_REPLACE => '\3\4',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\1\2',
+ GESHI_AFTER => ''
+ ),
+ // single character
+ 3 => array(
+ GESHI_SEARCH => "&amp;.",
+ GESHI_REPLACE => '\0',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ // method definition
+ 4 => array(
+ GESHI_SEARCH => "(meth)([^a-zA-Z]+)([a-zA-Z\300-\326\330-\336][A-Z\300-\326\330-\336a-z\337-\366\370-\3770-9]*)",
+ GESHI_REPLACE => '\3',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\1\2',
+ GESHI_AFTER => ''
+ ),
+ // highlight "[]"
+ // ([] is actually a keyword, but that causes problems in validation; putting it into symbols doesn't work.)
+ 5 => array(
+ GESHI_SEARCH => "\[\]",
+ GESHI_REPLACE => '\0',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/parasail.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/parasail.php
new file mode 100644
index 00000000..864eba1e
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/parasail.php
@@ -0,0 +1,133 @@
+<?php
+/*************************************************************************************
+ * parasail.php
+ * -------
+ * Author: T. Taft (taft@adacore.com)
+ * Copyright: (c) 2012 AdaCore (http://adacore.com/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2012/08/02
+ *
+ * ParaSail language file for GeSHi.
+ *
+ * Words are from SciTe configuration file
+ *
+ * CHANGES
+ * -------
+ * 2012/08/02 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2012/08/02)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ParaSail',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('{' => '}'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'all', 'block', 'case', 'continue', 'each',
+ 'else', 'elsif', 'exit', 'for',
+ 'forward', 'if', 'loop', 'return', 'reverse', 'some',
+ 'then', 'until', 'while', 'with'
+ ),
+ 2 => array(
+ 'abs', 'and','in', 'mod', 'not', 'null', 'or', 'rem', 'xor'
+ ),
+ 3 => array(
+ 'abstract', 'class',
+ 'concurrent', 'const',
+ 'end', 'extends', 'exports',
+ 'func', 'global', 'implements', 'import',
+ 'interface', 'is', 'lambda', 'locked',
+ 'new', 'of', 'op', 'optional',
+ 'private', 'queued', 'ref',
+ 'separate', 'type', 'var',
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00007f;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #46aa03; font-weight:bold;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/parigp.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/parigp.php
new file mode 100644
index 00000000..c9c73095
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/parigp.php
@@ -0,0 +1,277 @@
+<?php
+/*************************************************************************************
+ * parigp.php
+ * --------
+ * Author: Charles R Greathouse IV (charles@crg4.com)
+ * Copyright: 2011 Charles R Greathouse IV (http://math.crg4.com/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/05/11
+ *
+ * PARI/GP language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2011/07/09 (1.0.8.11)
+ * - First Release
+ *
+ * TODO (updated 2011/07/09)
+ * -------------------------
+ *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'PARI/GP',
+ 'COMMENT_SINGLE' => array(1 => '\\\\'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'NUMBERS' => array(
+ # Integers
+ 1 => GESHI_NUMBER_INT_BASIC,
+ # Reals
+ 2 => GESHI_NUMBER_FLT_SCI_ZERO
+ ),
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'addprimes','bestappr','bezout','bezoutres','bigomega','binomial',
+ 'chinese','content','contfrac','contfracpnqn','core','coredisc',
+ 'dirdiv','direuler','dirmul','divisors','eulerphi','factor',
+ 'factorback','factorcantor','factorff','factorial','factorint',
+ 'factormod','ffgen','ffinit','fflog','fforder','ffprimroot',
+ 'fibonacci','gcd','hilbert','isfundamental','ispower','isprime',
+ 'ispseudoprime','issquare','issquarefree','kronecker','lcm',
+ 'moebius','nextprime','numbpart','numdiv','omega','partitions',
+ 'polrootsff','precprime','prime','primepi','primes','qfbclassno',
+ 'qfbcompraw','qfbhclassno','qfbnucomp','qfbnupow','qfbpowraw',
+ 'qfbprimeform','qfbred','qfbsolve','quadclassunit','quaddisc',
+ 'quadgen','quadhilbert','quadpoly','quadray','quadregulator',
+ 'quadunit','removeprimes','sigma','sqrtint','stirling',
+ 'sumdedekind','zncoppersmith','znlog','znorder','znprimroot',
+ 'znstar','Col','List','Mat','Mod','Pol','Polrev','Qfb','Ser','Set',
+ 'Str','Strchr','Strexpand','Strtex','Vec','Vecrev','Vecsmall',
+ 'binary','bitand','bitneg','bitnegimply','bitor','bittest','bitxor',
+ 'ceil','centerlift','component','conj','conjvec','denominator',
+ 'floor','frac','imag','length','lift','norm','norml2','numerator',
+ 'numtoperm','padicprec','permtonum','precision','random','real',
+ 'round','simplify','sizebyte','sizedigit','truncate','valuation',
+ 'variable','ellL1','elladd','ellak','ellan','ellanalyticrank',
+ 'ellap','ellbil','ellchangecurve','ellchangepoint','ellconvertname',
+ 'elldivpol','elleisnum','elleta','ellgenerators','ellglobalred',
+ 'ellgroup','ellheight','ellheightmatrix','ellidentify','ellinit',
+ 'ellisoncurve','ellj','elllocalred','elllog','elllseries',
+ 'ellminimalmodel','ellmodulareqn','ellorder','ellordinate',
+ 'ellpointtoz','ellpow','ellrootno','ellsearch','ellsigma','ellsub',
+ 'elltaniyama','elltatepairing','elltors','ellweilpairing','ellwp',
+ 'ellzeta','ellztopoint','bnfcertify','bnfcompress',
+ 'bnfdecodemodule','bnfinit','bnfisintnorm','bnfisnorm',
+ 'bnfisprincipal','bnfissunit','bnfisunit','bnfnarrow','bnfsignunit',
+ 'bnfsunit','bnrL1','bnrclassno','bnrclassnolist','bnrconductor',
+ 'bnrconductorofchar','bnrdisc','bnrdisclist','bnrinit',
+ 'bnrisconductor','bnrisprincipal','bnrrootnumber','bnrstark',
+ 'dirzetak','factornf','galoisexport','galoisfixedfield',
+ 'galoisgetpol','galoisidentify','galoisinit','galoisisabelian',
+ 'galoisisnormal','galoispermtopol','galoissubcyclo',
+ 'galoissubfields','galoissubgroups','idealadd','idealaddtoone',
+ 'idealappr','idealchinese','idealcoprime','idealdiv','idealfactor',
+ 'idealfactorback','idealfrobenius','idealhnf','idealintersect',
+ 'idealinv','ideallist','ideallistarch','ideallog','idealmin',
+ 'idealmul','idealnorm','idealpow','idealprimedec','idealramgroups',
+ 'idealred','idealstar','idealtwoelt','idealval','matalgtobasis',
+ 'matbasistoalg','modreverse','newtonpoly','nfalgtobasis','nfbasis',
+ 'nfbasistoalg','nfdetint','nfdisc','nfeltadd','nfeltdiv',
+ 'nfeltdiveuc','nfeltdivmodpr','nfeltdivrem','nfeltmod','nfeltmul',
+ 'nfeltmulmodpr','nfeltnorm','nfeltpow','nfeltpowmodpr',
+ 'nfeltreduce','nfeltreducemodpr','nfelttrace','nfeltval','nffactor',
+ 'nffactorback','nffactormod','nfgaloisapply','nfgaloisconj',
+ 'nfhilbert','nfhnf','nfhnfmod','nfinit','nfisideal','nfisincl',
+ 'nfisisom','nfkermodpr','nfmodprinit','nfnewprec','nfroots',
+ 'nfrootsof1','nfsnf','nfsolvemodpr','nfsubfields','polcompositum',
+ 'polgalois','polred','polredabs','polredord','poltschirnhaus',
+ 'rnfalgtobasis','rnfbasis','rnfbasistoalg','rnfcharpoly',
+ 'rnfconductor','rnfdedekind','rnfdet','rnfdisc','rnfeltabstorel',
+ 'rnfeltdown','rnfeltreltoabs','rnfeltup','rnfequation',
+ 'rnfhnfbasis','rnfidealabstorel','rnfidealdown','rnfidealhnf',
+ 'rnfidealmul','rnfidealnormabs','rnfidealnormrel',
+ 'rnfidealreltoabs','rnfidealtwoelt','rnfidealup','rnfinit',
+ 'rnfisabelian','rnfisfree','rnfisnorm','rnfisnorminit','rnfkummer',
+ 'rnflllgram','rnfnormgroup','rnfpolred','rnfpolredabs',
+ 'rnfpseudobasis','rnfsteinitz','subgrouplist','zetak','zetakinit',
+ 'plot','plotbox','plotclip','plotcolor','plotcopy','plotcursor',
+ 'plotdraw','ploth','plothraw','plothsizes','plotinit','plotkill',
+ 'plotlines','plotlinetype','plotmove','plotpoints','plotpointsize',
+ 'plotpointtype','plotrbox','plotrecth','plotrecthraw','plotrline',
+ 'plotrmove','plotrpoint','plotscale','plotstring','psdraw',
+ 'psploth','psplothraw','O','deriv','diffop','eval','factorpadic',
+ 'intformal','padicappr','padicfields','polchebyshev','polcoeff',
+ 'polcyclo','poldegree','poldisc','poldiscreduced','polhensellift',
+ 'polhermite','polinterpolate','polisirreducible','pollead',
+ 'pollegendre','polrecip','polresultant','polroots','polrootsmod',
+ 'polrootspadic','polsturm','polsubcyclo','polsylvestermatrix',
+ 'polsym','poltchebi','polzagier','serconvol','serlaplace',
+ 'serreverse','subst','substpol','substvec','taylor','thue',
+ 'thueinit','break','for','fordiv','forell','forprime','forstep',
+ 'forsubgroup','forvec','if','next','return','until','while',
+ 'Strprintf','addhelp','alarm','alias','allocatemem','apply',
+ 'default','error','extern','externstr','getheap','getrand',
+ 'getstack','gettime','global','input','install','kill','print1',
+ 'print','printf','printtex','quit','read','readvec','select',
+ 'setrand','system','trap','type','version','warning','whatnow',
+ 'write1','write','writebin','writetex','divrem','lex','max','min',
+ 'shift','shiftmul','sign','vecmax','vecmin','derivnum','intcirc',
+ 'intfouriercos','intfourierexp','intfouriersin','intfuncinit',
+ 'intlaplaceinv','intmellininv','intmellininvshort','intnum',
+ 'intnuminit','intnuminitgen','intnumromb','intnumstep','prod',
+ 'prodeuler','prodinf','solve','sum','sumalt','sumdiv','suminf',
+ 'sumnum','sumnumalt','sumnuminit','sumpos','Euler','I','Pi','abs',
+ 'acos','acosh','agm','arg','asin','asinh','atan','atanh','bernfrac',
+ 'bernreal','bernvec','besselh1','besselh2','besseli','besselj',
+ 'besseljh','besselk','besseln','cos','cosh','cotan','dilog','eint1',
+ 'erfc','eta','exp','gamma','gammah','hyperu','incgam','incgamc',
+ 'lngamma','log','polylog','psi','sin','sinh','sqr','sqrt','sqrtn',
+ 'tan','tanh','teichmuller','theta','thetanullk','weber','zeta',
+ 'algdep','charpoly','concat','lindep','listcreate','listinsert',
+ 'listkill','listpop','listput','listsort','matadjoint',
+ 'matcompanion','matdet','matdetint','matdiagonal','mateigen',
+ 'matfrobenius','mathess','mathilbert','mathnf','mathnfmod',
+ 'mathnfmodid','matid','matimage','matimagecompl','matindexrank',
+ 'matintersect','matinverseimage','matisdiagonal','matker',
+ 'matkerint','matmuldiagonal','matmultodiagonal','matpascal',
+ 'matrank','matrix','matrixqz','matsize','matsnf','matsolve',
+ 'matsolvemod','matsupplement','mattranspose','minpoly','qfgaussred',
+ 'qfjacobi','qflll','qflllgram','qfminim','qfperfection','qfrep',
+ 'qfsign','setintersect','setisset','setminus','setsearch','cmp',
+ 'setunion','trace','vecextract','vecsort','vector','vectorsmall',
+ 'vectorv','ellheegner'
+ ),
+
+ 2 => array(
+ 'void','bool','negbool','small','int',/*'real',*/'mp','var','lg','pol',
+ 'vecsmall','vec','list','str','genstr','gen','typ'
+ ),
+
+ 3 => array(
+ 'TeXstyle','breakloop','colors','compatible','datadir','debug',
+ 'debugfiles','debugmem','echo','factor_add_primes','factor_proven',
+ 'format','graphcolormap','graphcolors','help','histfile','histsize',
+ 'lines','linewrap',/*'log',*/'logfile','new_galois_format','output',
+ 'parisize','path','prettyprinter','primelimit','prompt_cont',
+ 'prompt','psfile','readline','realprecision','recover','secure',
+ 'seriesprecision',/*'simplify',*/'strictmatch','timer'
+ ),
+
+ 4 => array(
+ 'alarmer','archer','errpile','gdiver','impl','syntaxer','invmoder',
+ 'overflower','talker','typeer','user'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(',')','{','}','[',']','+','-','*','/','%','=','<','>','!','^','&','|','?',';',':',',','\\','\''
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #e07022;',
+ 3 => 'color: #00d2d2;',
+ 4 => 'color: #00d2d2;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000;',
+ 'MULTI' => 'color: #008000;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #111111; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #002222;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #800080;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #666666;',
+ 1 => 'color: #666666;',
+ 2 => 'color: #666666;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #e07022', # Should be the same as keyword group 2
+ 1 => 'color: #555555'
+ ),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ 0 => array( # types marked on variables
+ GESHI_SEARCH => '(?<!\\\\ )"(t_(?:INT|REAL|INTMOD|FRAC|FFELT|COMPLEX|PADIC|QUAD|POLMOD|POL|SER|RFRAC|QFR|QFI|VEC|COL|MAT|LIST|STR|VECSMALL|CLOSURE))"',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '"',
+ GESHI_AFTER => '"'
+ ),
+ 1 => array( # literal variables
+ GESHI_SEARCH => '(?<!\\\\)(\'[a-zA-Z][a-zA-Z0-9_]*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ 2 => array(
+ '[a-zA-Z][a-zA-Z0-9_]*:' => ''
+ ),
+ 3 => array(
+ 'default(' => ''
+ ),
+ 4 => array(
+ 'trap(' => ''
+ ),
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pascal.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pascal.php
new file mode 100644
index 00000000..de5ca871
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pascal.php
@@ -0,0 +1,165 @@
+<?php
+/*************************************************************************************
+ * pascal.php
+ * ----------
+ * Author: Tux (tux@inamil.cz)
+ * Copyright: (c) 2004 Tux (http://tux.a4.cz/), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/07/26
+ *
+ * Pascal language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2004/11/27 (1.0.2)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.1)
+ * - Added support for URLs
+ * 2004/08/05 (1.0.0)
+ * - Added support for symbols
+ * 2004/07/27 (0.9.1)
+ * - Pascal is OO language. Some new words.
+ * 2004/07/26 (0.9.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Pascal',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('(*' => '*)', '{' => '}'),
+ //Compiler directives
+ 'COMMENT_REGEXP' => array(2 => '/\\{\\$.*?}|\\(\\*\\$.*?\\*\\)/U'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'"),
+ 'ESCAPE_CHAR' => '',
+
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'absolute','asm','assembler','begin','break','case','catch','cdecl',
+ 'const','constructor','default','destructor','div','do','downto',
+ 'else','end','except','export','exports','external','far',
+ 'finalization','finally','for','forward','function','goto','if',
+ 'implementation','in','index','inherited','initialization','inline',
+ 'interface','interrupt','label','library','mod','name','not','of',
+ 'or','overload','override','private','procedure','program',
+ 'property','protected','public','published','raise','repeat',
+ 'resourcestring','shl','shr','stdcall','stored','switch','then',
+ 'to','try','type','unit','until','uses','var','while','with','xor'
+ ),
+ 2 => array(
+ 'nil', 'false', 'true',
+ ),
+ 3 => array(
+ 'abs','and','arc','arctan','blockread','blockwrite','chr','dispose',
+ 'cos','eof','eoln','exp','get','ln','new','odd','ord','ordinal',
+ 'pred','read','readln','sin','sqrt','succ','write','writeln'
+ ),
+ 4 => array(
+ 'ansistring','array','boolean','byte','bytebool','char','file',
+ 'integer','longbool','longint','object','packed','pointer','real',
+ 'record','set','shortint','smallint','string','union','word'
+ ),
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '[', ']'),
+ 1 => array('.', ',', ':', ';'),
+ 2 => array('@', '^'),
+ 3 => array('=', '+', '-', '*', '/')
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;',
+ 4 => 'color: #000066; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #008000; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #ff0000; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;',
+ //'HARD' => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000cc;',
+ 1 => 'color: #ff0000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066;',
+ 1 => 'color: #000066;',
+ 2 => 'color: #000066;',
+ 3 => 'color: #000066;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ //Hex numbers
+ 0 => '\$[0-9a-fA-F]+',
+ //Characters
+ 1 => '\#(?:\$[0-9a-fA-F]{1,2}|\d{1,3})'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pcre.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pcre.php
new file mode 100644
index 00000000..13a2e024
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pcre.php
@@ -0,0 +1,188 @@
+<?php
+/*************************************************************************************
+ * pcre.php
+ * --------
+ * Author: Benny Baumann (BenBE@geshi.org)
+ * Copyright: (c) 2010 Benny Baumann (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/05/22
+ *
+ * PCRE language file for GeSHi.
+ *
+ * NOTE: This language file handles plain PCRE expressions without delimiters.
+ * If you want to highlight PCRE with delimiters you should use the
+ * Perl language file instead.
+ *
+ * CHANGES
+ * -------
+ * 2010/05/22 (1.0.8.8)
+ * - First Release
+ *
+ * TODO (updated 2010/05/22)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'PCRE',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(
+ ),
+ 'COMMENT_REGEXP' => array(
+ // Non-matching groups
+ 1 => "/(?<=\()\?(?::|(?=\())/",
+
+ // Modifier groups
+ 2 => "/(?<=\()\?[cdegimopsuxUX\-]+(?::|(?=\)))/",
+
+ // Look-Aheads
+ 3 => "/(?<=\()\?[!=]/",
+
+ // Look-Behinds
+ 4 => "/(?<=\()\?<[!=]/",
+
+ // Forward Matching
+ 5 => "/(?<=\()\?>/",
+
+ // Recursive Matching
+ 6 => "/(?<=\()\?R(?=\))/",
+
+ // Named Subpattern
+ 7 => "/(?<=\()\?(?:P?<\w+>|\d+(?=\))|P[=>]\w+(?=\)))/",
+
+ // Back Reference
+ 8 => "/\\\\(?:[1-9]\d?|g\d+|g\{(?:-?\d+|\w+)\}|k<\w+>|k'\w+'|k\{\w+\})/",
+
+ // Byte sequence: Octal
+ 9 => "/\\\\[0-7]{2,3}/",
+
+ // Byte sequence: Hex
+ 10 => "/\\\\x[0-9a-fA-F]{2}/",
+
+ // Byte sequence: Hex
+ 11 => "/\\\\u[0-9a-fA-F]{4}/",
+
+ // Byte sequence: Hex
+ 12 => "/\\\\U[0-9a-fA-F]{8}/",
+
+ // Byte sequence: Unicode
+ 13 => "/\\\\[pP]\{[^}\n]+\}/",
+
+ // One-Char Escapes
+ 14 => "/\\\\[abdefnrstvwzABCDGSWXZ\\\\\\.\[\]\(\)\{\}\^\\\$\?\+\*]/",
+
+ // Byte sequence: Control-X sequence
+ 15 => "/\\\\c./",
+
+ // Quantifier
+ 16 => "/\{(?:\d+,?|\d*,\d+)\}/",
+
+ // Comment Subpattern
+ 17 => "/(?<=\()\?#[^\)]*/",
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('.'),
+ 1 => array('(', ')'),
+ 2 => array('[', ']', '|'),
+ 3 => array('^', '$'),
+ 4 => array('?', '+', '*'),
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #993333; font-weight: bold;',
+ 2 => 'color: #cc3300; font-weight: bold;',
+ 3 => 'color: #cc0066; font-weight: bold;',
+ 4 => 'color: #cc0066; font-weight: bold;',
+ 5 => 'color: #cc6600; font-weight: bold;',
+ 6 => 'color: #cc00cc; font-weight: bold;',
+ 7 => 'color: #cc9900; font-weight: bold; font-style: italic;',
+ 8 => 'color: #cc9900; font-style: italic;',
+ 9 => 'color: #669933; font-style: italic;',
+ 10 => 'color: #339933; font-style: italic;',
+ 11 => 'color: #339966; font-style: italic;',
+ 12 => 'color: #339999; font-style: italic;',
+ 13 => 'color: #663399; font-style: italic;',
+ 14 => 'color: #999933; font-style: italic;',
+ 15 => 'color: #993399; font-style: italic;',
+ 16 => 'color: #333399; font-style: italic;',
+ 17 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;',
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #333399; font-weight: bold;',
+ 1 => 'color: #993333; font-weight: bold;',
+ 2 => 'color: #339933; font-weight: bold;',
+ 3 => 'color: #333399; font-weight: bold;',
+ 4 => 'color: #333399; font-style: italic;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER,
+ 'NUMBERS' => GESHI_NEVER
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/per.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/per.php
new file mode 100644
index 00000000..c42ddb58
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/per.php
@@ -0,0 +1,302 @@
+<?php
+/*************************************************************************************
+ * per.php
+ * --------
+ * Author: Lars Gersmann (lars.gersmann@gmail.com)
+ * Copyright: (c) 2007 Lars Gersmann
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/06/03
+ *
+ * Per (forms) (FOURJ's Genero 4GL) language file for GeSHi.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'per',
+ 'COMMENT_SINGLE' => array(1 => '--', 2 => '#'),
+ 'COMMENT_MULTI' => array('{' => '}'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ "ACCELERATOR",
+ "ACCELERATOR2",
+ "ACTION",
+ "ALT",
+ "AND",
+ "AUTO",
+ "AUTONEXT",
+ "AUTOSCALE",
+ "BETWEEN",
+ "BOTH",
+ "BUTTON",
+ "BUTTONEDIT",
+ "BUTTONTEXTHIDDEN",
+ "BY",
+ "BYTE",
+ "CANVAS",
+ "CENTER",
+ "CHECKBOX",
+ "CLASS",
+ "COLOR",
+ "COLUMNS",
+ "COMBOBOX",
+ "COMMAND",
+ "COMMENT",
+ "COMMENTS",
+ "COMPACT",
+ "COMPRESS",
+ "CONFIG",
+ "CONTROL",
+ "CURRENT",
+ "DATABASE",
+ "DATEEDIT",
+ "DEC",
+ "DEFAULT",
+ "DEFAULTS",
+ "DELIMITERS",
+ "DISPLAY",
+ "DISPLAYONLY",
+ "DOWNSHIFT",
+ "DYNAMIC",
+ "EDIT",
+ "FIXED",
+ "FOLDER",
+ "FONTPITCH",
+ "FORMAT",
+ "FORMONLY",
+ "GRID",
+ "GRIDCHILDRENINPARENT",
+ "GROUP",
+ "HBOX",
+ "HEIGHT",
+ "HIDDEN",
+ "HORIZONTAL",
+ "INCLUDE",
+ "INITIAL",
+ "INITIALIZER",
+ "INPUT",
+ "INSTRUCTIONS",
+ "INTERVAL",
+ "INVISIBLE",
+ "IS",
+ "ITEM",
+ "ITEMS",
+ "JUSTIFY",
+ "KEY",
+ "KEYS",
+ "LABEL",
+ "LEFT",
+ "LIKE",
+ "LINES",
+ "MATCHES",
+ "NAME",
+ "NOENTRY",
+ "NONCOMPRESS",
+ "NORMAL",
+ "NOT",
+ "NOUPDATE",
+ "OPTIONS",
+ "OR",
+ "ORIENTATION",
+ "PACKED",
+ "PAGE",
+ "PICTURE",
+ "PIXELHEIGHT",
+ "PIXELS",
+ "PIXELWIDTH",
+ "POINTS",
+ "PROGRAM",
+ "PROGRESSBAR",
+ "QUERYCLEAR",
+ "QUERYEDITABLE",
+ "RADIOGROUP",
+ "RECORD",
+ "REQUIRED",
+ "REVERSE",
+ "RIGHT",
+ "SAMPLE",
+ "SCREEN",
+ "SCROLL",
+ "SCROLLBARS",
+ "SCROLLGRID",
+ "SECOND",
+ "SEPARATOR",
+ "SHIFT",
+ "SIZE",
+ "SIZEPOLICY",
+ "SMALLFLOAT",
+ "SMALLINT",
+ "SPACING",
+ "STRETCH",
+ "STYLE",
+ "TABINDEX",
+ "TABLE",
+ "TAG",
+ "TEXT",
+ "TEXTEDIT",
+ "THROUGH",
+ "THRU",
+ "TITLE",
+ "TO",
+ "TOOLBAR",
+ "TOPMENU",
+ "TYPE",
+ "UNHIDABLE",
+ "UNHIDABLECOLUMNS",
+ "UNMOVABLE",
+ "UNMOVABLECOLUMNS",
+ "UNSIZABLE",
+ "UNSIZABLECOLUMNS",
+ "UNSORTABLE",
+ "UNSORTABLECOLUMNS",
+ "UPSHIFT",
+ "USER",
+ "VALIDATE",
+ "VALUECHECKED",
+ "VALUEMAX",
+ "VALUEMIN",
+ "VALUEUNCHECKED",
+ "VARCHAR",
+ "VARIABLE",
+ "VBOX",
+ "VERIFY",
+ "VERSION",
+ "VERTICAL",
+ "TIMESTAMP",
+ "WANTCOLUMNSANCHORED", /* to be removed! */
+ "WANTFIXEDPAGESIZE",
+ "WANTNORETURNS",
+ "WANTTABS",
+ "WHERE",
+ "WIDGET",
+ "WIDTH",
+ "WINDOWSTYLE",
+ "WITHOUT",
+ "WORDWRAP",
+ "X",
+ "Y",
+ "ZEROFILL",
+ "SCHEMA",
+ "ATTRIBUTES",
+ "TABLES",
+ "LAYOUT",
+ "END"
+ ),
+ 2 => array(
+ "YEAR",
+ "BLACK",
+ "BLINK",
+ "BLUE",
+ "YELLOW",
+ "WHITE",
+ "UNDERLINE",
+ "CENTURY",
+ "FRACTION",
+ "CHAR",
+ "CHARACTER",
+ "CHARACTERS",
+ "CYAN",
+ "DATE",
+ "DATETIME",
+ "DAY",
+ "DECIMAL",
+ "FALSE",
+ "FLOAT",
+ "GREEN",
+ "HOUR",
+ "INT",
+ "INTEGER",
+ "MAGENTA",
+ "MINUTE",
+ "MONEY",
+ "NONE",
+ "NULL",
+ "REAL",
+ "RED",
+ "TRUE",
+ "TODAY",
+ "MONTH",
+ "IMAGE"
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '+', '-', '*', '?', '=', '/', '%', '>', '<', '^', '!', '|', ':',
+ '(', ')', '[', ']'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0600FF;',
+ 2 => 'color: #0000FF; font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008080; font-style: italic;',
+ 2 => 'color: #008080;',
+ 'MULTI' => 'color: green'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #008080; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #808080;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0000FF;',
+ 2 => 'color: #0000FF;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/perl.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/perl.php
new file mode 100644
index 00000000..309ebd86
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/perl.php
@@ -0,0 +1,213 @@
+<?php
+/*************************************************************************************
+ * perl.php
+ * --------
+ * Author: Andreas Gohr (andi@splitbrain.org), Ben Keen (ben.keen@gmail.com)
+ * Copyright: (c) 2004 Andreas Gohr, Ben Keen (http://www.benjaminkeen.org/), Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/08/20
+ *
+ * Perl language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/06/22 (1.0.8)
+ * - Added support for system calls in backticks (Corley Kinnane)
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * - Added comment_regexp for predefined variables
+ * 2008/02/15 (1.003)
+ * - Fixed SF#1891630 with placebo patch
+ * 2006/01/05 (1.0.2)
+ * - Used hardescape feature for ' strings (Cliff Stanford)
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/08/20 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ * * LABEL:
+ * * string comparison operators
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Perl',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(
+ '=back' => '=cut',
+ '=head' => '=cut',
+ '=item' => '=cut',
+ '=over' => '=cut',
+ '=begin' => '=cut',
+ '=end' => '=cut',
+ '=for' => '=cut',
+ '=encoding' => '=cut',
+ '=pod' => '=cut'
+ ),
+ 'COMMENT_REGEXP' => array(
+ //Regular expressions
+ 2 => "/(?<=[\\s^])(s|tr|y)\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/(?:\\\\.|(?!\n)[^\\/\\\\])*\\/[msixpogcde]*(?=[\\s$\\.\\;])|(?<=[\\s^(=])(m|q[qrwx]?)?\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/[msixpogc]*(?=[\\s$\\.\\,\\;\\)])/iU",
+ //Regular expression match variables
+ 3 => '/\$\d+/',
+ //Heredoc
+ 4 => '/<<\s*?([\'"]?)([a-zA-Z0-9]+)\1;[^\n]*?\\n.*\\n\\2(?![a-zA-Z0-9])/siU',
+ //Predefined variables
+ 5 => '/\$(\^[a-zA-Z]?|[\*\$`\'&_\.,+\-~:;\\\\\/"\|%=\?!@#<>\(\)\[\]])(?!\w)|@[_+\-]|%[!]|\$(?=\{)/',
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"','`'),
+ 'HARDQUOTE' => array("'", "'"), // An optional 2-element array defining the beginning and end of a hard-quoted string
+ 'HARDESCAPE' => array('\\\'',),
+ // Things that must still be escaped inside a hard-quoted string
+ // If HARDQUOTE is defined, HARDESCAPE must be defined
+ // This will not work unless the first character of each element is either in the
+ // QUOTEMARKS array or is the ESCAPE_CHAR
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'case', 'do', 'else', 'elsif', 'for', 'if', 'then', 'until', 'while', 'foreach', 'my',
+ 'xor', 'or', 'and', 'unless', 'next', 'last', 'redo', 'not', 'our',
+ 'reset', 'continue', 'cmp', 'ne', 'eq', 'lt', 'gt', 'le', 'ge',
+ ),
+ 2 => array(
+ 'use', 'sub', 'new', '__END__', '__DATA__', '__DIE__', '__WARN__', 'BEGIN',
+ 'STDIN', 'STDOUT', 'STDERR', 'ARGV', 'ARGVOUT'
+ ),
+ 3 => array(
+ 'abs', 'accept', 'alarm', 'atan2', 'bind', 'binmode', 'bless',
+ 'caller', 'chdir', 'chmod', 'chomp', 'chop', 'chown', 'chr',
+ 'chroot', 'close', 'closedir', 'connect', 'cos',
+ 'crypt', 'dbmclose', 'dbmopen', 'defined', 'delete', 'die',
+ 'dump', 'each', 'endgrent', 'endhostent', 'endnetent', 'endprotoent',
+ 'endpwent', 'endservent', 'eof', 'eval', 'exec', 'exists', 'exit',
+ 'exp', 'fcntl', 'fileno', 'flock', 'fork', 'format', 'formline',
+ 'getc', 'getgrent', 'getgrgid', 'getgrnam', 'gethostbyaddr',
+ 'gethostbyname', 'gethostent', 'getlogin', 'getnetbyaddr', 'getnetbyname',
+ 'getnetent', 'getpeername', 'getpgrp', 'getppid', 'getpriority',
+ 'getprotobyname', 'getprotobynumber', 'getprotoent', 'getpwent',
+ 'getpwnam', 'getpwuid', 'getservbyname', 'getservbyport', 'getservent',
+ 'getsockname', 'getsockopt', 'glob', 'gmtime', 'goto', 'grep',
+ 'hex', 'import', 'index', 'int', 'ioctl', 'join', 'keys', 'kill',
+ 'lc', 'lcfirst', 'length', 'link', 'listen', 'local',
+ 'localtime', 'log', 'lstat', 'm', 'map', 'mkdir', 'msgctl', 'msgget',
+ 'msgrcv', 'msgsnd', 'no', 'oct', 'open', 'opendir',
+ 'ord', 'pack', 'package', 'pipe', 'pop', 'pos', 'print',
+ 'printf', 'prototype', 'push', 'qq', 'qr', 'quotemeta', 'qw',
+ 'qx', 'q', 'rand', 'read', 'readdir', 'readline', 'readlink', 'readpipe',
+ 'recv', 'ref', 'rename', 'require', 'return',
+ 'reverse', 'rewinddir', 'rindex', 'rmdir', 's', 'scalar', 'seek',
+ 'seekdir', 'select', 'semctl', 'semget', 'semop', 'send', 'setgrent',
+ 'sethostent', 'setnetent', 'setpgrp', 'setpriority', 'setprotoent',
+ 'setpwent', 'setservent', 'setsockopt', 'shift', 'shmctl', 'shmget',
+ 'shmread', 'shmwrite', 'shutdown', 'sin', 'sleep', 'socket', 'socketpair',
+ 'sort', 'splice', 'split', 'sprintf', 'sqrt', 'srand', 'stat',
+ 'study', 'substr', 'symlink', 'syscall', 'sysopen', 'sysread',
+ 'sysseek', 'system', 'syswrite', 'tell', 'telldir', 'tie', 'tied',
+ 'time', 'times', 'tr', 'truncate', 'uc', 'ucfirst', 'umask', 'undef',
+ 'unlink', 'unpack', 'unshift', 'untie', 'utime', 'values',
+ 'vec', 'wait', 'waitpid', 'wantarray', 'warn', 'write', 'y'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '<', '>', '=',
+ '!', '@', '~', '&', '|', '^',
+ '+','-', '*', '/', '%',
+ ',', ';', '?', '.', ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #009966; font-style: italic;',
+ 3 => 'color: #0000ff;',
+ 4 => 'color: #cc0000; font-style: italic;',
+ 5 => 'color: #0000ff;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;',
+ 'HARD' => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000ff;',
+ 4 => 'color: #009999;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://perldoc.perl.org/functions/{FNAMEL}.html'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '-&gt;',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ //Variable
+ 0 => '(?:\$[\$#]?|\\\\(?:[@%*]?|\\\\*\$|&amp;)|%[$]?|@[$]?|\*[$]?|&amp;[$]?)[a-zA-Z_][a-zA-Z0-9_]*',
+ //File Descriptor
+ 4 => '&lt;[a-zA-Z_][a-zA-Z0-9_]*&gt;',
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'COMMENTS' => array(
+ 'DISALLOWED_BEFORE' => '$'
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/perl6.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/perl6.php
new file mode 100644
index 00000000..706eabcb
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/perl6.php
@@ -0,0 +1,197 @@
+<?php
+/*************************************************************************************
+ * perl6.php
+ * ---------
+ * Author: Kodi Arfer (kodiarfer {at} warpmail {period} net); forked from perl.php 1.0.8 by Andreas Gohr (andi@splitbrain.org), Ben Keen (ben.keen@gmail.com)
+ * Copyright: (c) 2009 Kodi Arfer, (c) 2004 Andreas Gohr, Ben Keen (http://www.benjaminkeen.org/), Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/11/07
+ *
+ * Perl 6 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/12/25 (1.0.8.6)
+ * - First Release
+ *
+ * TODO (updated 2009/11/07)
+ * -------------------------
+ * * It's all pretty rough. Perl 6 is complicated; this'll never be more
+ * than reasonably accurate unless it's carefully written to match
+ * STD.pm.
+ * * It's largely incomplete. Lots of keywords are no doubt missing.
+ * * Recognize comments like #`( Hello! ).
+ * * Recognize qw-ing angle brackets.
+ * * ! should probably be in OBJECT_SPLITTERS too, but putting it there
+ * gives bizarre results. What to do?.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Perl 6',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array('=begin' => '=end'),
+ 'COMMENT_REGEXP' => array(
+ //Regular expressions
+ 2 => "/(?<=[\\s^])(s|tr|y)\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/(?:\\\\.|(?!\n)[^\\/\\\\])*\\/[msixpogcde]*(?=[\\s$\\.\\;])|(?<=[\\s^(=])(m|q[qrwx]?)?\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/[msixpogc]*(?=[\\s$\\.\\,\\;\\)])/iU",
+ //Regular expression match variables
+ 3 => '/\$\d+/',
+ //Heredoc
+ 4 => '/<<\s*?([\'"]?)([a-zA-Z0-9]+)\1;[^\n]*?\\n.*\\n\\2(?![a-zA-Z0-9])/siU',
+ //Beastly hack to finish highlighting each POD block
+ 5 => '((?<==end) .+)'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'HARDQUOTE' => array("'", "'"), // An optional 2-element array defining the beginning and end of a hard-quoted string
+ 'HARDESCAPE' => array('\\\''),
+ // Things that must still be escaped inside a hard-quoted string
+ // If HARDQUOTE is defined, HARDESCAPE must be defined
+ // This will not work unless the first character of each element is either in the
+ // QUOTEMARKS array or is the ESCAPE_CHAR
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'do', 'else', 'elsif', 'for', 'if', 'then', 'until',
+ 'while', 'loop', 'repeat', 'my', 'xor', 'or', 'and',
+ 'unless', 'next', 'last', 'redo', 'not', 'our', 'let',
+ 'temp', 'state', 'enum', 'constant', 'continue', 'cmp',
+ 'ne', 'eq', 'lt', 'gt', 'le', 'ge', 'leg', 'div', 'X',
+ 'Z', 'x', 'xx', 'given', 'when', 'default', 'has',
+ 'returns', 'of', 'is', 'does', 'where', 'subset', 'but',
+ 'True', 'False', 'return', 'die', 'fail'
+ ),
+ 2 => array(
+ 'use', 'sub', 'multi', 'method', 'submethod', 'proto',
+ 'class', 'role', 'grammar', 'regex', 'token', 'rule',
+ 'new', 'BEGIN', 'END', 'CHECK', 'INIT', 'START', 'FIRST',
+ 'ENTER', 'LEAVE', 'KEEP', 'UNDO', 'NEXT', 'LAST', 'PRE',
+ 'POST', 'CATCH', 'CONTROL', 'BUILD'
+ ),
+ 3 => array(
+ 'all', 'any', 'cat', 'classify', 'defined', 'grep', 'first',
+ 'keys', 'kv', 'join', 'map', 'max', 'min', 'none', 'one', 'pairs',
+ 'print', 'printf', 'roundrobin', 'pick', 'reduce', 'reverse', 'say',
+ 'shape', 'sort', 'srand', 'undefine', 'uri', 'values', 'warn', 'zip',
+
+ # Container
+ 'rotate', 'comb', 'end', 'elems', 'delete',
+ 'exists', 'pop', 'push', 'shift', 'splice',
+ 'unshift', 'invert', 'decode',
+
+ # Numeric
+ 'succ', 'pred', 'abs', 'exp', 'log',
+ 'log10', 'rand', 'roots', 'cis', 'unpolar', 'i', 'floor',
+ 'ceiling', 'round', 'truncate', 'sign', 'sqrt',
+ 'polar', 're', 'im', 'I', 'atan2', 'nude',
+ 'denominator', 'numerator',
+
+ # Str
+ 'p5chop', 'chop', 'p5chomp', 'chomp', 'lc', 'lcfirst',
+ 'uc', 'ucfirst', 'normalize', 'samecase', 'sameaccent',
+ 'capitalize', 'length', 'chars', 'graphs', 'codes',
+ 'bytes', 'encode', 'index', 'pack', 'quotemeta', 'rindex',
+ 'split', 'words', 'flip', 'sprintf', 'fmt',
+ 'substr', 'trim', 'unpack', 'match', 'subst', 'trans'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '<', '>', '=',
+ '!', '@', '~', '&', '|', '^',
+ '+','-', '*', '/', '%',
+ ',', ';', '?', '.', ':',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #009966; font-style: italic;',
+ 3 => 'color: #0000ff;',
+ 4 => 'color: #cc0000; font-style: italic;',
+ 5 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;',
+ 'HARD' => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000ff;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ //Variable
+ 0 => '(?:[$@%]|&amp;)(?:(?:[\^:*?!~]|&lt;)?[a-zA-Z_][a-zA-Z0-9_]*|(?=\.))'
+ # We treat the . twigil specially so the name can be highlighted as an
+ # object field (via OBJECT_SPLITTERS).
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'COMMENTS' => array(
+ 'DISALLOWED_BEFORE' => '$'
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pf.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pf.php
new file mode 100644
index 00000000..818e11bc
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pf.php
@@ -0,0 +1,178 @@
+<?php
+/*************************************************************************************
+ * pf.php
+ * --------
+ * Author: David Berard (david@nfrance.com)
+ * Copyright: (c) 2010 Benny Baumann (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/10/16
+ * Based on bash.php
+ *
+ * OpenBSD PACKET FILTER language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/10/16 (1.0.0)
+ * - First Release
+ *
+ * TODO
+ * -------------------------
+ * * Support ALTQ
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'OpenBSD Packet Filter',
+ 'COMMENT_SINGLE' => array('#'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ 1 => "/\\$\\{[^\\n\\}]*?\\}/i",
+ 2 => '/<<-?\s*?(\'?)([a-zA-Z0-9]+)\1\\n.*\\n\\2(?![a-zA-Z0-9])/siU',
+ 3 => "/\\\\['\"]/siU"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'HARDQUOTE' => array("'", "'"),
+ 'HARDESCAPE' => array("\'"),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ 1 => "#\\\\[nfrtv\\$\\\"\n]#i",
+ 2 => "#\\$[a-z_][a-z0-9_]*#i",
+ 3 => "/\\$\\{[^\\n\\}]*?\\}/i",
+ 4 => "/\\$\\([^\\n\\)]*?\\)/i",
+ 5 => "/`[^`]*`/"
+ ),
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'pass'
+ ),
+ 2 => array(
+ 'block'
+ ),
+ 3 => array(
+ 'quick','keep','state','antispoof','table','persist','file','scrub',
+ 'set','skip','flags','on'
+ ),
+ 4 => array(
+ 'in','out','proto'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '!', '@', '%', '&', '*', '|', '/', '<', '>', ';;', '`','='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #009900; font-weight: bold;',
+ 2 => 'color: #990000; font-weight: bold;',
+ 3 => 'color: #7a0874;',
+ 4 => 'color: #336699;'
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #666666; font-style: italic;',
+ 1 => 'color: #800000;',
+ 2 => 'color: #cc0000; font-style: italic;',
+ 3 => 'color: #000000; font-weight: bold;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #007800;',
+ 3 => 'color: #007800;',
+ 4 => 'color: #007800;',
+ 5 => 'color: #780078;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #7a0874; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #CC0000;',
+ 'HARD' => 'color: #CC0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff00cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #007800;',
+ 1 => 'color: #007800;',
+ 2 => 'color: #007800;',
+ 4 => 'color: #007800;',
+ 5 => 'color: #660033;',
+ 6 => 'color: #000099; font-weight: bold;',
+ 7 => 'color: #0000ff;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Variables (will be handled by comment_regexps)
+ 0 => "\\$\\{[a-zA-Z_][a-zA-Z0-9_]*?\\}",
+ //Variables without braces
+ 1 => "\\$[a-zA-Z_][a-zA-Z0-9_]*",
+ //Variable assignment
+ 2 => "(?<![\.a-zA-Z_\-])([a-zA-Z_][a-zA-Z0-9_]*?)(?==)",
+ //Shorthand shell variables
+ 4 => "\\$[*#\$\\-\\?!]",
+ //Parameters of commands
+ 5 => "(?<=\s)--?[0-9a-zA-Z\-]+(?=[\s=]|$)",
+ //IPs
+ 6 => "([0-9]{1,3}\.){3}[0-9]{1,3}",
+ //Tables
+ 7 => "(&lt;(.*)&gt;)"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'COMMENTS' => array(
+ 'DISALLOWED_BEFORE' => '$'
+ ),
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![\.\-a-zA-Z0-9_\$\#])",
+ 'DISALLOWED_AFTER' => "(?![\.\-a-zA-Z0-9_%\\/])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/php-brief.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/php-brief.php
new file mode 100644
index 00000000..a4804b4d
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/php-brief.php
@@ -0,0 +1,222 @@
+<?php
+/*************************************************************************************
+ * php-brief.php
+ * -------------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/02
+ *
+ * PHP (brief version) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2004/11/27 (1.0.3)
+ * - Added support for multiple object splitters
+ * - Fixed &new problem
+ * 2004/10/27 (1.0.2)
+ * - Added support for URLs
+ * 2004/08/05 (1.0.1)
+ * - Added support for symbols
+ * 2004/07/14 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/07/14)
+ * -------------------------
+ * * Remove more functions that are hardly used
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'PHP (brief)',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ //Heredoc and Nowdoc syntax
+ 'COMMENT_REGEXP' => array(3 => '/<<<\s*?(\'?)([a-zA-Z0-9]+)\1[^\n]*?\\n.*\\n\\2(?![a-zA-Z0-9])/siU'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'HARDQUOTE' => array("'", "'"),
+ 'HARDESCAPE' => array("\'"),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'include', 'require', 'include_once', 'require_once',
+ 'for', 'as', 'foreach', 'if', 'elseif', 'else', 'while', 'do', 'endwhile', 'endif', 'switch', 'case', 'endswitch',
+ 'return', 'break'
+ ),
+ 2 => array(
+ 'null', '__LINE__', '__FILE__',
+ 'false', '&lt;?php',
+ 'true', 'var', 'default',
+ 'function', 'class', 'new', '&amp;new', 'public', 'private', 'interface', 'extends',
+ 'const', 'self'
+ ),
+ 3 => array(
+ 'func_num_args', 'func_get_arg', 'func_get_args', 'strlen', 'strcmp', 'strncmp', 'strcasecmp', 'strncasecmp', 'each', 'error_reporting', 'define', 'defined',
+ 'trigger_error', 'user_error', 'set_error_handler', 'restore_error_handler', 'get_declared_classes', 'get_loaded_extensions',
+ 'extension_loaded', 'get_extension_funcs', 'debug_backtrace',
+ 'constant', 'bin2hex', 'sleep', 'usleep', 'time', 'mktime', 'gmmktime', 'strftime', 'gmstrftime', 'strtotime', 'date', 'gmdate', 'getdate', 'localtime', 'checkdate', 'flush', 'wordwrap', 'htmlspecialchars', 'htmlentities', 'html_entity_decode', 'md5', 'md5_file', 'crc32', 'getimagesize', 'image_type_to_mime_type', 'phpinfo', 'phpversion', 'phpcredits', 'strnatcmp', 'strnatcasecmp', 'substr_count', 'strspn', 'strcspn', 'strtok', 'strtoupper', 'strtolower', 'strpos', 'strrpos', 'strrev', 'hebrev', 'hebrevc', 'nl2br', 'basename', 'dirname', 'pathinfo', 'stripslashes', 'stripcslashes', 'strstr', 'stristr', 'strrchr', 'str_shuffle', 'str_word_count', 'strcoll', 'substr', 'substr_replace', 'quotemeta', 'ucfirst', 'ucwords', 'strtr', 'addslashes', 'addcslashes', 'rtrim', 'str_replace', 'str_repeat', 'count_chars', 'chunk_split', 'trim', 'ltrim', 'strip_tags', 'similar_text', 'explode', 'implode', 'setlocale', 'localeconv',
+ 'parse_str', 'str_pad', 'chop', 'strchr', 'sprintf', 'printf', 'vprintf', 'vsprintf', 'sscanf', 'fscanf', 'parse_url', 'urlencode', 'urldecode', 'rawurlencode', 'rawurldecode', 'readlink', 'linkinfo', 'link', 'unlink', 'exec', 'system', 'escapeshellcmd', 'escapeshellarg', 'passthru', 'shell_exec', 'proc_open', 'proc_close', 'rand', 'srand', 'getrandmax', 'mt_rand', 'mt_srand', 'mt_getrandmax', 'base64_decode', 'base64_encode', 'abs', 'ceil', 'floor', 'round', 'is_finite', 'is_nan', 'is_infinite', 'bindec', 'hexdec', 'octdec', 'decbin', 'decoct', 'dechex', 'base_convert', 'number_format', 'fmod', 'ip2long', 'long2ip', 'getenv', 'putenv', 'getopt', 'microtime', 'gettimeofday', 'getrusage', 'uniqid', 'quoted_printable_decode', 'set_time_limit', 'get_cfg_var', 'magic_quotes_runtime', 'set_magic_quotes_runtime', 'get_magic_quotes_gpc', 'get_magic_quotes_runtime',
+ 'import_request_variables', 'error_log', 'serialize', 'unserialize', 'memory_get_usage', 'var_dump', 'var_export', 'debug_zval_dump', 'print_r','highlight_file', 'show_source', 'highlight_string', 'ini_get', 'ini_get_all', 'ini_set', 'ini_alter', 'ini_restore', 'get_include_path', 'set_include_path', 'restore_include_path', 'setcookie', 'header', 'headers_sent', 'connection_aborted', 'connection_status', 'ignore_user_abort', 'parse_ini_file', 'is_uploaded_file', 'move_uploaded_file', 'intval', 'floatval', 'doubleval', 'strval', 'gettype', 'settype', 'is_null', 'is_resource', 'is_bool', 'is_long', 'is_float', 'is_int', 'is_integer', 'is_double', 'is_real', 'is_numeric', 'is_string', 'is_array', 'is_object', 'is_scalar',
+ 'ereg', 'ereg_replace', 'eregi', 'eregi_replace', 'split', 'spliti', 'join', 'sql_regcase', 'dl', 'pclose', 'popen', 'readfile', 'rewind', 'rmdir', 'umask', 'fclose', 'feof', 'fgetc', 'fgets', 'fgetss', 'fread', 'fopen', 'fpassthru', 'ftruncate', 'fstat', 'fseek', 'ftell', 'fflush', 'fwrite', 'fputs', 'mkdir', 'rename', 'copy', 'tempnam', 'tmpfile', 'file', 'file_get_contents', 'stream_select', 'stream_context_create', 'stream_context_set_params', 'stream_context_set_option', 'stream_context_get_options', 'stream_filter_prepend', 'stream_filter_append', 'fgetcsv', 'flock', 'get_meta_tags', 'stream_set_write_buffer', 'set_file_buffer', 'set_socket_blocking', 'stream_set_blocking', 'socket_set_blocking', 'stream_get_meta_data', 'stream_register_wrapper', 'stream_wrapper_register', 'stream_set_timeout', 'socket_set_timeout', 'socket_get_status', 'realpath', 'fnmatch', 'fsockopen', 'pfsockopen', 'pack', 'unpack', 'get_browser', 'crypt', 'opendir', 'closedir', 'chdir', 'getcwd', 'rewinddir', 'readdir', 'dir', 'glob', 'fileatime', 'filectime', 'filegroup', 'fileinode', 'filemtime', 'fileowner', 'fileperms', 'filesize', 'filetype', 'file_exists', 'is_writable', 'is_writeable', 'is_readable', 'is_executable', 'is_file', 'is_dir', 'is_link', 'stat', 'lstat', 'chown',
+ 'touch', 'clearstatcache', 'mail', 'ob_start', 'ob_flush', 'ob_clean', 'ob_end_flush', 'ob_end_clean', 'ob_get_flush', 'ob_get_clean', 'ob_get_length', 'ob_get_level', 'ob_get_status', 'ob_get_contents', 'ob_implicit_flush', 'ob_list_handlers', 'ksort', 'krsort', 'natsort', 'natcasesort', 'asort', 'arsort', 'sort', 'rsort', 'usort', 'uasort', 'uksort', 'shuffle', 'array_walk', 'count', 'end', 'prev', 'next', 'reset', 'current', 'key', 'min', 'max', 'in_array', 'array_search', 'extract', 'compact', 'array_fill', 'range', 'array_multisort', 'array_push', 'array_pop', 'array_shift', 'array_unshift', 'array_splice', 'array_slice', 'array_merge', 'array_merge_recursive', 'array_keys', 'array_values', 'array_count_values', 'array_reverse', 'array_reduce', 'array_pad', 'array_flip', 'array_change_key_case', 'array_rand', 'array_unique', 'array_intersect', 'array_intersect_assoc', 'array_diff', 'array_diff_assoc', 'array_sum', 'array_filter', 'array_map', 'array_chunk', 'array_key_exists', 'pos', 'sizeof', 'key_exists', 'assert', 'assert_options', 'version_compare', 'ftok', 'str_rot13', 'aggregate',
+ 'session_name', 'session_module_name', 'session_save_path', 'session_id', 'session_regenerate_id', 'session_decode', 'session_register', 'session_unregister', 'session_is_registered', 'session_encode',
+ 'session_start', 'session_destroy', 'session_unset', 'session_set_save_handler', 'session_cache_limiter', 'session_cache_expire', 'session_set_cookie_params', 'session_get_cookie_params', 'session_write_close', 'preg_match', 'preg_match_all', 'preg_replace', 'preg_replace_callback', 'preg_split', 'preg_quote', 'preg_grep', 'overload', 'ctype_alnum', 'ctype_alpha', 'ctype_cntrl', 'ctype_digit', 'ctype_lower', 'ctype_graph', 'ctype_print', 'ctype_punct', 'ctype_space', 'ctype_upper', 'ctype_xdigit', 'virtual', 'apache_request_headers', 'apache_note', 'apache_lookup_uri', 'apache_child_terminate', 'apache_setenv', 'apache_response_headers', 'apache_get_version', 'getallheaders', 'mysql_connect', 'mysql_pconnect', 'mysql_close', 'mysql_select_db', 'mysql_create_db', 'mysql_drop_db', 'mysql_query', 'mysql_unbuffered_query', 'mysql_db_query', 'mysql_list_dbs', 'mysql_list_tables', 'mysql_list_fields', 'mysql_list_processes', 'mysql_error', 'mysql_errno', 'mysql_affected_rows', 'mysql_insert_id', 'mysql_result', 'mysql_num_rows', 'mysql_num_fields', 'mysql_fetch_row', 'mysql_fetch_array', 'mysql_fetch_assoc', 'mysql_fetch_object', 'mysql_data_seek', 'mysql_fetch_lengths', 'mysql_fetch_field', 'mysql_field_seek', 'mysql_free_result', 'mysql_field_name', 'mysql_field_table', 'mysql_field_len', 'mysql_field_type', 'mysql_field_flags', 'mysql_escape_string', 'mysql_real_escape_string', 'mysql_stat',
+ 'mysql_thread_id', 'mysql_client_encoding', 'mysql_get_client_info', 'mysql_get_host_info', 'mysql_get_proto_info', 'mysql_get_server_info', 'mysql_info', 'mysql', 'mysql_fieldname', 'mysql_fieldtable', 'mysql_fieldlen', 'mysql_fieldtype', 'mysql_fieldflags', 'mysql_selectdb', 'mysql_createdb', 'mysql_dropdb', 'mysql_freeresult', 'mysql_numfields', 'mysql_numrows', 'mysql_listdbs', 'mysql_listtables', 'mysql_listfields', 'mysql_db_name', 'mysql_dbname', 'mysql_tablename', 'mysql_table_name', 'pg_connect', 'pg_pconnect', 'pg_close', 'pg_connection_status', 'pg_connection_busy', 'pg_connection_reset', 'pg_host', 'pg_dbname', 'pg_port', 'pg_tty', 'pg_options', 'pg_ping', 'pg_query', 'pg_send_query', 'pg_cancel_query', 'pg_fetch_result', 'pg_fetch_row', 'pg_fetch_assoc', 'pg_fetch_array', 'pg_fetch_object', 'pg_fetch_all', 'pg_affected_rows', 'pg_get_result', 'pg_result_seek', 'pg_result_status', 'pg_free_result', 'pg_last_oid', 'pg_num_rows', 'pg_num_fields', 'pg_field_name', 'pg_field_num', 'pg_field_size', 'pg_field_type', 'pg_field_prtlen', 'pg_field_is_null', 'pg_get_notify', 'pg_get_pid', 'pg_result_error', 'pg_last_error', 'pg_last_notice', 'pg_put_line', 'pg_end_copy', 'pg_copy_to', 'pg_copy_from',
+ 'pg_trace', 'pg_untrace', 'pg_lo_create', 'pg_lo_unlink', 'pg_lo_open', 'pg_lo_close', 'pg_lo_read', 'pg_lo_write', 'pg_lo_read_all', 'pg_lo_import', 'pg_lo_export', 'pg_lo_seek', 'pg_lo_tell', 'pg_escape_string', 'pg_escape_bytea', 'pg_unescape_bytea', 'pg_client_encoding', 'pg_set_client_encoding', 'pg_meta_data', 'pg_convert', 'pg_insert', 'pg_update', 'pg_delete', 'pg_select', 'pg_exec', 'pg_getlastoid', 'pg_cmdtuples', 'pg_errormessage', 'pg_numrows', 'pg_numfields', 'pg_fieldname', 'pg_fieldsize', 'pg_fieldtype', 'pg_fieldnum', 'pg_fieldprtlen', 'pg_fieldisnull', 'pg_freeresult', 'pg_result', 'pg_loreadall', 'pg_locreate', 'pg_lounlink', 'pg_loopen', 'pg_loclose', 'pg_loread', 'pg_lowrite', 'pg_loimport', 'pg_loexport',
+ 'echo', 'print', 'global', 'static', 'exit', 'array', 'empty', 'eval', 'isset', 'unset', 'die'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '<%', '<%=', '%>', '<?', '<?=', '?>'
+ ),
+ 0 => array(
+ '(', ')', '[', ']', '{', '}',
+ '!', '@', '%', '&', '|', '/',
+ '<', '>',
+ '=', '-', '+', '*',
+ '.', ':', ',', ';'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #990000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #666666; font-style: italic;',
+ 3 => 'color: #0000cc; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;',
+ 'HARD' => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #004000;',
+ 2 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;',
+ 1 => 'color: #000000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.php.net/{FNAMEL}'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '-&gt;',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ //Variables
+ 0 => "[\\$]+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<?php' => '?>'
+ ),
+ 1 => array(
+ '<?' => '?>'
+ ),
+ 2 => array(
+ '<%' => '%>'
+ ),
+ 3 => array(
+ '<script language="php">' => '</script>'
+ ),
+ 4 => "/(?P<start><\\?(?>php\b)?)(?:".
+ "(?>[^\"'?\\/<]+)|".
+ "\\?(?!>)|".
+ "(?>'(?>[^'\\\\]|\\\\'|\\\\\\\|\\\\)*')|".
+ "(?>\"(?>[^\"\\\\]|\\\\\"|\\\\\\\\|\\\\)*\")|".
+ "(?>\\/\\*(?>[^\\*]|(?!\\*\\/)\\*)*\\*\\/)|".
+ "\\/\\/(?>.*?$)|".
+ "\\/(?=[^*\\/])|".
+ "<(?!<<)|".
+ "<<<(?P<phpdoc>\w+)\s.*?\s\k<phpdoc>".
+ ")*(?P<end>\\?>|\Z)/sm",
+ 5 => "/(?P<start><%)(?:".
+ "(?>[^\"'%\\/<]+)|".
+ "%(?!>)|".
+ "(?>'(?>[^'\\\\]|\\\\'|\\\\\\\|\\\\)*')|".
+ "(?>\"(?>[^\\\"\\\\]|\\\\\"|\\\\\\\\|\\\\)*\")|".
+ "(?>\\/\\*(?>[^\\*]|(?!\\*\\/)\\*)*\\*\\/)|".
+ "\\/\\/(?>.*?$)|".
+ "\\/(?=[^*\\/])|".
+ "<(?!<<)|".
+ "<<<(?P<phpdoc>\w+)\s.*?\s\k<phpdoc>".
+ ")*(?P<end>%>)/sm"
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/php.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/php.php
new file mode 100644
index 00000000..2827457b
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/php.php
@@ -0,0 +1,1117 @@
+<?php
+/*************************************************************************************
+ * php.php
+ * --------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/20
+ *
+ * PHP language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2004/11/25 (1.0.3)
+ * - Added support for multiple object splitters
+ * - Fixed &new problem
+ * 2004/10/27 (1.0.2)
+ * - Added URL support
+ * - Added extra constants
+ * 2004/08/05 (1.0.1)
+ * - Added support for symbols
+ * 2004/07/14 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/07/14)
+ * -------------------------
+ * * Make sure the last few function I may have missed
+ * (like eval()) are included for highlighting
+ * * Split to several files - php4, php5 etc
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'PHP',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Heredoc and Nowdoc syntax
+ 3 => '/<<<\s*?(\'?)([a-zA-Z0-9]+?)\1[^\n]*?\\n.*\\n\\2(?![a-zA-Z0-9])/siU',
+ // phpdoc comments
+ 4 => '#/\*\*(?![\*\/]).*\*/#sU',
+ // Advanced # handling
+ 2 => "/#.*?(?:(?=\?\>)|^)/smi"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[nfrtv\$\"\n\\\\]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{1,2}#i",
+ //Octal Char Specs
+ 3 => "#\\\\[0-7]{1,3}#",
+ //String Parsing of Variable Names
+ 4 => "#\\$[a-z0-9_]+(?:\\[[a-z0-9_]+\\]|->[a-z0-9_]+)?|(?:\\{\\$|\\$\\{)[a-z0-9_]+(?:\\[('?)[a-z0-9_]*\\1\\]|->[a-z0-9_]+)*\\}#i",
+ //Experimental extension supporting cascaded {${$var}} syntax
+ 5 => "#\$[a-z0-9_]+(?:\[[a-z0-9_]+\]|->[a-z0-9_]+)?|(?:\{\$|\$\{)[a-z0-9_]+(?:\[('?)[a-z0-9_]*\\1\]|->[a-z0-9_]+)*\}|\{\$(?R)\}#i",
+ //Format String support in ""-Strings
+ 6 => "#%(?:%|(?:\d+\\\\\\\$)?\\+?(?:\x20|0|'.)?-?(?:\d+|\\*)?(?:\.\d+)?[bcdefFosuxX])#"
+ ),
+ 'HARDQUOTE' => array("'", "'"),
+ 'HARDESCAPE' => array("'", "\\"),
+ 'HARDCHAR' => "\\",
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'as','break','case','continue','default','do','else','elseif',
+ 'endfor','endforeach','endif','endswitch','endwhile','for',
+ 'foreach','if','include','include_once','require','require_once',
+ 'return','switch','throw','while',
+
+ 'echo','print'
+ ),
+ 2 => array(
+ '&amp;new','&lt;/script&gt;','&lt;?php','&lt;script language',
+ 'abstract','class','const','declare','extends','function','global',
+ 'interface','namespace','new','private','protected','public','self',
+ 'use','var'
+ ),
+ 3 => array(
+ 'abs','acos','acosh','addcslashes','addslashes','aggregate',
+ 'aggregate_methods','aggregate_methods_by_list',
+ 'aggregate_methods_by_regexp','aggregate_properties',
+ 'aggregate_properties_by_list','aggregate_properties_by_regexp',
+ 'aggregation_info','apache_child_terminate','apache_get_modules',
+ 'apache_get_version','apache_getenv','apache_lookup_uri',
+ 'apache_note','apache_request_headers','apache_response_headers',
+ 'apache_setenv','array','array_change_key_case','array_chunk',
+ 'array_combine','array_count_values','array_diff',
+ 'array_diff_assoc','array_diff_key','array_diff_uassoc',
+ 'array_diff_ukey','array_fill','array_fill_keys','array_filter',
+ 'array_flip','array_intersect','array_intersect_assoc',
+ 'array_intersect_key','array_intersect_uassoc',
+ 'array_intersect_ukey','array_key_exists','array_keys','array_map',
+ 'array_merge','array_merge_recursive','array_multisort','array_pad',
+ 'array_pop','array_product','array_push','array_rand',
+ 'array_reduce','array_reverse','array_search','array_shift',
+ 'array_slice','array_splice','array_sum','array_udiff',
+ 'array_udiff_assoc','array_udiff_uassoc','array_uintersect',
+ 'array_uintersect_assoc','array_uintersect_uassoc','array_unique',
+ 'array_unshift','array_values','array_walk','array_walk_recursive',
+ 'arsort','asin','asinh','asort','assert','assert_options','atan',
+ 'atan2','atanh','base_convert','base64_decode','base64_encode',
+ 'basename','bcadd','bccomp','bcdiv','bcmod','bcmul',
+ 'bcompiler_load','bcompiler_load_exe','bcompiler_parse_class',
+ 'bcompiler_read','bcompiler_write_class','bcompiler_write_constant',
+ 'bcompiler_write_exe_footer','bcompiler_write_file',
+ 'bcompiler_write_footer','bcompiler_write_function',
+ 'bcompiler_write_functions_from_file','bcompiler_write_header',
+ 'bcompiler_write_included_filename','bcpow','bcpowmod','bcscale',
+ 'bcsqrt','bcsub','bin2hex','bindec','bindtextdomain',
+ 'bind_textdomain_codeset','bitset_empty','bitset_equal',
+ 'bitset_excl','bitset_fill','bitset_from_array','bitset_from_hash',
+ 'bitset_from_string','bitset_in','bitset_incl',
+ 'bitset_intersection','bitset_invert','bitset_is_empty',
+ 'bitset_subset','bitset_to_array','bitset_to_hash',
+ 'bitset_to_string','bitset_union','blenc_encrypt','bzclose',
+ 'bzcompress','bzdecompress','bzerrno','bzerror','bzerrstr',
+ 'bzflush','bzopen','bzread','bzwrite','cal_days_in_month',
+ 'cal_from_jd','cal_info','cal_to_jd','call_user_func',
+ 'call_user_func_array','call_user_method','call_user_method_array',
+ 'ceil','chdir','checkdate','checkdnsrr','chgrp','chmod','chop',
+ 'chown','chr','chunk_split','class_exists','class_implements',
+ 'class_parents','classkit_aggregate_methods',
+ 'classkit_doc_comments','classkit_import','classkit_method_add',
+ 'classkit_method_copy','classkit_method_redefine',
+ 'classkit_method_remove','classkit_method_rename','clearstatcache',
+ 'closedir','closelog','com_create_guid','com_event_sink',
+ 'com_get_active_object','com_load_typelib','com_message_pump',
+ 'com_print_typeinfo','compact','confirm_phpdoc_compiled',
+ 'connection_aborted','connection_status','constant',
+ 'convert_cyr_string','convert_uudecode','convert_uuencode','copy',
+ 'cos','cosh','count','count_chars','cpdf_add_annotation',
+ 'cpdf_add_outline','cpdf_arc','cpdf_begin_text','cpdf_circle',
+ 'cpdf_clip','cpdf_close','cpdf_closepath',
+ 'cpdf_closepath_fill_stroke','cpdf_closepath_stroke',
+ 'cpdf_continue_text','cpdf_curveto','cpdf_end_text','cpdf_fill',
+ 'cpdf_fill_stroke','cpdf_finalize','cpdf_finalize_page',
+ 'cpdf_global_set_document_limits','cpdf_import_jpeg','cpdf_lineto',
+ 'cpdf_moveto','cpdf_newpath','cpdf_open','cpdf_output_buffer',
+ 'cpdf_page_init','cpdf_rect','cpdf_restore','cpdf_rlineto',
+ 'cpdf_rmoveto','cpdf_rotate','cpdf_rotate_text','cpdf_save',
+ 'cpdf_save_to_file','cpdf_scale','cpdf_set_action_url',
+ 'cpdf_set_char_spacing','cpdf_set_creator','cpdf_set_current_page',
+ 'cpdf_set_font','cpdf_set_font_directories',
+ 'cpdf_set_font_map_file','cpdf_set_horiz_scaling',
+ 'cpdf_set_keywords','cpdf_set_leading','cpdf_set_page_animation',
+ 'cpdf_set_subject','cpdf_set_text_matrix','cpdf_set_text_pos',
+ 'cpdf_set_text_rendering','cpdf_set_text_rise','cpdf_set_title',
+ 'cpdf_set_viewer_preferences','cpdf_set_word_spacing',
+ 'cpdf_setdash','cpdf_setflat','cpdf_setgray','cpdf_setgray_fill',
+ 'cpdf_setgray_stroke','cpdf_setlinecap','cpdf_setlinejoin',
+ 'cpdf_setlinewidth','cpdf_setmiterlimit','cpdf_setrgbcolor',
+ 'cpdf_setrgbcolor_fill','cpdf_setrgbcolor_stroke','cpdf_show',
+ 'cpdf_show_xy','cpdf_stringwidth','cpdf_stroke','cpdf_text',
+ 'cpdf_translate','crack_check','crack_closedict',
+ 'crack_getlastmessage','crack_opendict','crc32','create_function',
+ 'crypt','ctype_alnum','ctype_alpha','ctype_cntrl','ctype_digit',
+ 'ctype_graph','ctype_lower','ctype_print','ctype_punct',
+ 'ctype_space','ctype_upper','ctype_xdigit','curl_close',
+ 'curl_copy_handle','curl_errno','curl_error','curl_exec',
+ 'curl_getinfo','curl_init','curl_multi_add_handle',
+ 'curl_multi_close','curl_multi_exec','curl_multi_getcontent',
+ 'curl_multi_info_read','curl_multi_init','curl_multi_remove_handle',
+ 'curl_multi_select','curl_setopt','curl_setopt_array',
+ 'curl_version','current','cvsclient_connect','cvsclient_log',
+ 'cvsclient_login','cvsclient_retrieve','date','date_create',
+ 'date_date_set','date_default_timezone_get',
+ 'date_default_timezone_set','date_format','date_isodate_set',
+ 'date_modify','date_offset_get','date_parse','date_sun_info',
+ 'date_sunrise','date_sunset','date_time_set','date_timezone_get',
+ 'date_timezone_set','db_id_list','dba_close','dba_delete',
+ 'dba_exists','dba_fetch','dba_firstkey','dba_handlers','dba_insert',
+ 'dba_key_split','dba_list','dba_nextkey','dba_open','dba_optimize',
+ 'dba_popen','dba_replace','dba_sync','dbase_add_record',
+ 'dbase_close','dbase_create','dbase_delete_record',
+ 'dbase_get_header_info','dbase_get_record',
+ 'dbase_get_record_with_names','dbase_numfields','dbase_numrecords',
+ 'dbase_open','dbase_pack','dbase_replace_record',
+ 'dbg_get_all_contexts','dbg_get_all_module_names',
+ 'dbg_get_all_source_lines','dbg_get_context_name',
+ 'dbg_get_module_name','dbg_get_profiler_results',
+ 'dbg_get_source_context','dblist','dbmclose','dbmdelete',
+ 'dbmexists','dbmfetch','dbmfirstkey','dbminsert','dbmnextkey',
+ 'dbmopen','dbmreplace','dbx_close','dbx_compare','dbx_connect',
+ 'dbx_error','dbx_escape_string','dbx_fetch_row','dbx_query',
+ 'dbx_sort','dcgettext','dcngettext','deaggregate','debug_backtrace',
+ 'debug_zval_dump','debugbreak','decbin','dechex','decoct','define',
+ 'defined','define_syslog_variables','deg2rad','dgettext','die',
+ 'dio_close','dio_open','dio_read','dio_seek','dio_stat','dio_write',
+ 'dir','dirname','disk_free_space','disk_total_space',
+ 'diskfreespace','dl','dngettext','docblock_token_name',
+ 'docblock_tokenize','dom_import_simplexml','domxml_add_root',
+ 'domxml_attributes','domxml_children','domxml_doc_add_root',
+ 'domxml_doc_document_element','domxml_doc_get_element_by_id',
+ 'domxml_doc_get_elements_by_tagname','domxml_doc_get_root',
+ 'domxml_doc_set_root','domxml_doc_validate','domxml_doc_xinclude',
+ 'domxml_dump_mem','domxml_dump_mem_file','domxml_dump_node',
+ 'domxml_dumpmem','domxml_elem_get_attribute',
+ 'domxml_elem_set_attribute','domxml_get_attribute','domxml_getattr',
+ 'domxml_html_dump_mem','domxml_new_child','domxml_new_doc',
+ 'domxml_new_xmldoc','domxml_node','domxml_node_add_namespace',
+ 'domxml_node_attributes','domxml_node_children',
+ 'domxml_node_get_content','domxml_node_has_attributes',
+ 'domxml_node_new_child','domxml_node_set_content',
+ 'domxml_node_set_namespace','domxml_node_unlink_node',
+ 'domxml_open_file','domxml_open_mem','domxml_parser',
+ 'domxml_parser_add_chunk','domxml_parser_cdata_section',
+ 'domxml_parser_characters','domxml_parser_comment',
+ 'domxml_parser_end','domxml_parser_end_document',
+ 'domxml_parser_end_element','domxml_parser_entity_reference',
+ 'domxml_parser_get_document','domxml_parser_namespace_decl',
+ 'domxml_parser_processing_instruction',
+ 'domxml_parser_start_document','domxml_parser_start_element',
+ 'domxml_root','domxml_set_attribute','domxml_setattr',
+ 'domxml_substitute_entities_default','domxml_unlink_node',
+ 'domxml_version','domxml_xmltree','doubleval','each','easter_date',
+ 'easter_days','empty','end','ereg','ereg_replace','eregi',
+ 'eregi_replace','error_get_last','error_log','error_reporting',
+ 'escapeshellarg','escapeshellcmd','eval','event_deschedule',
+ 'event_dispatch','event_free','event_handle_signal',
+ 'event_have_events','event_init','event_new','event_pending',
+ 'event_priority_set','event_schedule','event_set','event_timeout',
+ 'exec','exif_imagetype','exif_read_data','exif_tagname',
+ 'exif_thumbnail','exit','exp','explode','expm1','extension_loaded',
+ 'extract','ezmlm_hash','fbird_add_user','fbird_affected_rows',
+ 'fbird_backup','fbird_blob_add','fbird_blob_cancel',
+ 'fbird_blob_close','fbird_blob_create','fbird_blob_echo',
+ 'fbird_blob_get','fbird_blob_import','fbird_blob_info',
+ 'fbird_blob_open','fbird_close','fbird_commit','fbird_commit_ret',
+ 'fbird_connect','fbird_db_info','fbird_delete_user','fbird_drop_db',
+ 'fbird_errcode','fbird_errmsg','fbird_execute','fbird_fetch_assoc',
+ 'fbird_fetch_object','fbird_fetch_row','fbird_field_info',
+ 'fbird_free_event_handler','fbird_free_query','fbird_free_result',
+ 'fbird_gen_id','fbird_maintain_db','fbird_modify_user',
+ 'fbird_name_result','fbird_num_fields','fbird_num_params',
+ 'fbird_param_info','fbird_pconnect','fbird_prepare','fbird_query',
+ 'fbird_restore','fbird_rollback','fbird_rollback_ret',
+ 'fbird_server_info','fbird_service_attach','fbird_service_detach',
+ 'fbird_set_event_handler','fbird_trans','fbird_wait_event','fclose',
+ 'fdf_add_doc_javascript','fdf_add_template','fdf_close',
+ 'fdf_create','fdf_enum_values','fdf_errno','fdf_error','fdf_get_ap',
+ 'fdf_get_attachment','fdf_get_encoding','fdf_get_file',
+ 'fdf_get_flags','fdf_get_opt','fdf_get_status','fdf_get_value',
+ 'fdf_get_version','fdf_header','fdf_next_field_name','fdf_open',
+ 'fdf_open_string','fdf_remove_item','fdf_save','fdf_save_string',
+ 'fdf_set_ap','fdf_set_encoding','fdf_set_file','fdf_set_flags',
+ 'fdf_set_javascript_action','fdf_set_on_import_javascript',
+ 'fdf_set_opt','fdf_set_status','fdf_set_submit_form_action',
+ 'fdf_set_target_frame','fdf_set_value','fdf_set_version','feof',
+ 'fflush','fgetc','fgetcsv','fgets','fgetss','file','file_exists',
+ 'file_get_contents','file_put_contents','fileatime','filectime',
+ 'filegroup','fileinode','filemtime','fileowner','fileperms',
+ 'filepro','filepro_fieldcount','filepro_fieldname',
+ 'filepro_fieldtype','filepro_fieldwidth','filepro_retrieve',
+ 'filepro_rowcount','filesize','filetype','filter_has_var',
+ 'filter_id','filter_input','filter_input_array','filter_list',
+ 'filter_var','filter_var_array','finfo_buffer','finfo_close',
+ 'finfo_file','finfo_open','finfo_set_flags','floatval','flock',
+ 'floor','flush','fmod','fnmatch','fopen','fpassthru','fprintf',
+ 'fputcsv','fputs','fread','frenchtojd','fribidi_charset_info',
+ 'fribidi_get_charsets','fribidi_log2vis','fscanf','fseek',
+ 'fsockopen','fstat','ftell','ftok','ftp_alloc','ftp_cdup',
+ 'ftp_chdir','ftp_chmod','ftp_close','ftp_connect','ftp_delete',
+ 'ftp_exec','ftp_fget','ftp_fput','ftp_get','ftp_get_option',
+ 'ftp_login','ftp_mdtm','ftp_mkdir','ftp_nb_continue','ftp_nb_fget',
+ 'ftp_nb_fput','ftp_nb_get','ftp_nb_put','ftp_nlist','ftp_pasv',
+ 'ftp_put','ftp_pwd','ftp_quit','ftp_raw','ftp_rawlist','ftp_rename',
+ 'ftp_rmdir','ftp_set_option','ftp_site','ftp_size',
+ 'ftp_ssl_connect','ftp_systype','ftruncate','function_exists',
+ 'func_get_arg','func_get_args','func_num_args','fwrite','gd_info',
+ 'getallheaders','getcwd','getdate','getenv','gethostbyaddr',
+ 'gethostbyname','gethostbynamel','getimagesize','getlastmod',
+ 'getmxrr','getmygid','getmyinode','getmypid','getmyuid','getopt',
+ 'getprotobyname','getprotobynumber','getrandmax','getrusage',
+ 'getservbyname','getservbyport','gettext','gettimeofday','gettype',
+ 'get_browser','get_cfg_var','get_class','get_class_methods',
+ 'get_class_vars','get_current_user','get_declared_classes',
+ 'get_defined_constants','get_defined_functions','get_defined_vars',
+ 'get_extension_funcs','get_headers','get_html_translation_table',
+ 'get_included_files','get_include_path','get_loaded_extensions',
+ 'get_magic_quotes_gpc','get_magic_quotes_runtime','get_meta_tags',
+ 'get_object_vars','get_parent_class','get_required_files',
+ 'get_resource_type','glob','gmdate','gmmktime','gmp_abs','gmp_add',
+ 'gmp_and','gmp_clrbit','gmp_cmp','gmp_com','gmp_div','gmp_div_q',
+ 'gmp_div_qr','gmp_div_r','gmp_divexact','gmp_fact','gmp_gcd',
+ 'gmp_gcdext','gmp_hamdist','gmp_init','gmp_intval','gmp_invert',
+ 'gmp_jacobi','gmp_legendre','gmp_mod','gmp_mul','gmp_neg',
+ 'gmp_nextprime','gmp_or','gmp_perfect_square','gmp_popcount',
+ 'gmp_pow','gmp_powm','gmp_prob_prime','gmp_random','gmp_scan0',
+ 'gmp_scan1','gmp_setbit','gmp_sign','gmp_sqrt','gmp_sqrtrem',
+ 'gmp_strval','gmp_sub','gmp_xor','gmstrftime','gopher_parsedir',
+ 'gregoriantojd','gzclose','gzcompress','gzdeflate','gzencode',
+ 'gzeof','gzfile','gzgetc','gzgets','gzgetss','gzinflate','gzopen',
+ 'gzpassthru','gzputs','gzread','gzrewind','gzseek','gztell',
+ 'gzuncompress','gzwrite','hash','hash_algos','hash_file',
+ 'hash_final','hash_hmac','hash_hmac_file','hash_init','hash_update',
+ 'hash_update_file','hash_update_stream','header','headers_list',
+ 'headers_sent','hebrev','hebrevc','hexdec','highlight_file',
+ 'highlight_string','html_doc','html_doc_file','html_entity_decode',
+ 'htmlentities','htmlspecialchars','htmlspecialchars_decode',
+ 'http_build_cookie','http_build_query','http_build_str',
+ 'http_build_url','http_cache_etag','http_cache_last_modified',
+ 'http_chunked_decode','http_date','http_deflate','http_get',
+ 'http_get_request_body','http_get_request_body_stream',
+ 'http_get_request_headers','http_head','http_inflate',
+ 'http_match_etag','http_match_modified','http_match_request_header',
+ 'http_negotiate_charset','http_negotiate_content_type',
+ 'http_negotiate_language','http_parse_cookie','http_parse_headers',
+ 'http_parse_message','http_parse_params',
+ 'http_persistent_handles_clean','http_persistent_handles_count',
+ 'http_persistent_handles_ident','http_post_data','http_post_fields',
+ 'http_put_data','http_put_file','http_put_stream','http_redirect',
+ 'http_request','http_request_body_encode',
+ 'http_request_method_exists','http_request_method_name',
+ 'http_request_method_register','http_request_method_unregister',
+ 'http_send_content_disposition','http_send_content_type',
+ 'http_send_data','http_send_file','http_send_last_modified',
+ 'http_send_status','http_send_stream','http_support',
+ 'http_throttle','hypot','i18n_convert','i18n_discover_encoding',
+ 'i18n_http_input','i18n_http_output','i18n_internal_encoding',
+ 'i18n_ja_jp_hantozen','i18n_mime_header_decode',
+ 'i18n_mime_header_encode','ibase_add_user','ibase_affected_rows',
+ 'ibase_backup','ibase_blob_add','ibase_blob_cancel',
+ 'ibase_blob_close','ibase_blob_create','ibase_blob_echo',
+ 'ibase_blob_get','ibase_blob_import','ibase_blob_info',
+ 'ibase_blob_open','ibase_close','ibase_commit','ibase_commit_ret',
+ 'ibase_connect','ibase_db_info','ibase_delete_user','ibase_drop_db',
+ 'ibase_errcode','ibase_errmsg','ibase_execute','ibase_fetch_assoc',
+ 'ibase_fetch_object','ibase_fetch_row','ibase_field_info',
+ 'ibase_free_event_handler','ibase_free_query','ibase_free_result',
+ 'ibase_gen_id','ibase_maintain_db','ibase_modify_user',
+ 'ibase_name_result','ibase_num_fields','ibase_num_params',
+ 'ibase_param_info','ibase_pconnect','ibase_prepare','ibase_query',
+ 'ibase_restore','ibase_rollback','ibase_rollback_ret',
+ 'ibase_server_info','ibase_service_attach','ibase_service_detach',
+ 'ibase_set_event_handler','ibase_trans','ibase_wait_event','iconv',
+ 'iconv_get_encoding','iconv_mime_decode',
+ 'iconv_mime_decode_headers','iconv_mime_encode',
+ 'iconv_set_encoding','iconv_strlen','iconv_strpos','iconv_strrpos',
+ 'iconv_substr','id3_get_frame_long_name','id3_get_frame_short_name',
+ 'id3_get_genre_id','id3_get_genre_list','id3_get_genre_name',
+ 'id3_get_tag','id3_get_version','id3_remove_tag','id3_set_tag',
+ 'idate','ignore_user_abort','image_type_to_extension',
+ 'image_type_to_mime_type','image2wbmp','imagealphablending',
+ 'imageantialias','imagearc','imagechar','imagecharup',
+ 'imagecolorallocate','imagecolorallocatealpha','imagecolorat',
+ 'imagecolorclosest','imagecolorclosestalpha','imagecolordeallocate',
+ 'imagecolorexact','imagecolorexactalpha','imagecolormatch',
+ 'imagecolorresolve','imagecolorresolvealpha','imagecolorset',
+ 'imagecolorsforindex','imagecolorstotal','imagecolortransparent',
+ 'imageconvolution','imagecopy','imagecopymerge',
+ 'imagecopymergegray','imagecopyresampled','imagecopyresized',
+ 'imagecreate','imagecreatefromgd','imagecreatefromgd2',
+ 'imagecreatefromgd2part','imagecreatefromgif','imagecreatefromjpeg',
+ 'imagecreatefrompng','imagecreatefromstring','imagecreatefromwbmp',
+ 'imagecreatefromxbm','imagecreatetruecolor','imagedashedline',
+ 'imagedestroy','imageellipse','imagefill','imagefilledarc',
+ 'imagefilledellipse','imagefilledpolygon','imagefilledrectangle',
+ 'imagefilltoborder','imagefilter','imagefontheight',
+ 'imagefontwidth','imageftbbox','imagefttext','imagegammacorrect',
+ 'imagegd','imagegd2','imagegif','imagegrabscreen','imagegrabwindow',
+ 'imageinterlace','imageistruecolor','imagejpeg','imagelayereffect',
+ 'imageline','imageloadfont','imagepalettecopy','imagepng',
+ 'imagepolygon','imagepsbbox','imagepsencodefont',
+ 'imagepsextendfont','imagepsfreefont','imagepsloadfont',
+ 'imagepsslantfont','imagepstext','imagerectangle','imagerotate',
+ 'imagesavealpha','imagesetbrush','imagesetpixel','imagesetstyle',
+ 'imagesetthickness','imagesettile','imagestring','imagestringup',
+ 'imagesx','imagesy','imagetruecolortopalette','imagettfbbox',
+ 'imagettftext','imagetypes','imagewbmp','imagexbm','imap_8bit',
+ 'imap_alerts','imap_append','imap_base64','imap_binary','imap_body',
+ 'imap_bodystruct','imap_check','imap_clearflag_full','imap_close',
+ 'imap_create','imap_createmailbox','imap_delete',
+ 'imap_deletemailbox','imap_errors','imap_expunge',
+ 'imap_fetch_overview','imap_fetchbody','imap_fetchheader',
+ 'imap_fetchstructure','imap_fetchtext','imap_get_quota',
+ 'imap_get_quotaroot','imap_getacl','imap_getmailboxes',
+ 'imap_getsubscribed','imap_header','imap_headerinfo','imap_headers',
+ 'imap_last_error','imap_list','imap_listmailbox',
+ 'imap_listsubscribed','imap_lsub','imap_mail','imap_mail_compose',
+ 'imap_mail_copy','imap_mail_move','imap_mailboxmsginfo',
+ 'imap_mime_header_decode','imap_msgno','imap_num_msg',
+ 'imap_num_recent','imap_open','imap_ping','imap_qprint',
+ 'imap_rename','imap_renamemailbox','imap_reopen',
+ 'imap_rfc822_parse_adrlist','imap_rfc822_parse_headers',
+ 'imap_rfc822_write_address','imap_savebody','imap_scan',
+ 'imap_scanmailbox','imap_search','imap_set_quota','imap_setacl',
+ 'imap_setflag_full','imap_sort','imap_status','imap_subscribe',
+ 'imap_thread','imap_timeout','imap_uid','imap_undelete',
+ 'imap_unsubscribe','imap_utf7_decode','imap_utf7_encode',
+ 'imap_utf8','implode','import_request_variables','in_array',
+ 'ini_alter','ini_get','ini_get_all','ini_restore','ini_set',
+ 'intval','ip2long','iptcembed','iptcparse','isset','is_a',
+ 'is_array','is_bool','is_callable','is_dir','is_double',
+ 'is_executable','is_file','is_finite','is_float','is_infinite',
+ 'is_int','is_integer','is_link','is_long','is_nan','is_null',
+ 'is_numeric','is_object','is_readable','is_real','is_resource',
+ 'is_scalar','is_soap_fault','is_string','is_subclass_of',
+ 'is_uploaded_file','is_writable','is_writeable','iterator_apply',
+ 'iterator_count','iterator_to_array','java_last_exception_clear',
+ 'java_last_exception_get','jddayofweek','jdmonthname','jdtofrench',
+ 'jdtogregorian','jdtojewish','jdtojulian','jdtounix','jewishtojd',
+ 'join','jpeg2wbmp','json_decode','json_encode','juliantojd','key',
+ 'key_exists','krsort','ksort','lcg_value','ldap_add','ldap_bind',
+ 'ldap_close','ldap_compare','ldap_connect','ldap_count_entries',
+ 'ldap_delete','ldap_dn2ufn','ldap_err2str','ldap_errno',
+ 'ldap_error','ldap_explode_dn','ldap_first_attribute',
+ 'ldap_first_entry','ldap_first_reference','ldap_free_result',
+ 'ldap_get_attributes','ldap_get_dn','ldap_get_entries',
+ 'ldap_get_option','ldap_get_values','ldap_get_values_len',
+ 'ldap_list','ldap_mod_add','ldap_mod_del','ldap_mod_replace',
+ 'ldap_modify','ldap_next_attribute','ldap_next_entry',
+ 'ldap_next_reference','ldap_parse_reference','ldap_parse_result',
+ 'ldap_read','ldap_rename','ldap_search','ldap_set_option',
+ 'ldap_sort','ldap_start_tls','ldap_unbind','levenshtein',
+ 'libxml_clear_errors','libxml_get_errors','libxml_get_last_error',
+ 'libxml_set_streams_context','libxml_use_internal_errors','link',
+ 'linkinfo','list','localeconv','localtime','log','log1p','log10',
+ 'long2ip','lstat','ltrim','lzf_compress','lzf_decompress',
+ 'lzf_optimized_for','magic_quotes_runtime','mail','max','mbereg',
+ 'mberegi','mberegi_replace','mbereg_match','mbereg_replace',
+ 'mbereg_search','mbereg_search_getpos','mbereg_search_getregs',
+ 'mbereg_search_init','mbereg_search_pos','mbereg_search_regs',
+ 'mbereg_search_setpos','mbregex_encoding','mbsplit','mbstrcut',
+ 'mbstrlen','mbstrpos','mbstrrpos','mbsubstr','mb_check_encoding',
+ 'mb_convert_case','mb_convert_encoding','mb_convert_kana',
+ 'mb_convert_variables','mb_decode_mimeheader',
+ 'mb_decode_numericentity','mb_detect_encoding','mb_detect_order',
+ 'mb_encode_mimeheader','mb_encode_numericentity','mb_ereg',
+ 'mb_eregi','mb_eregi_replace','mb_ereg_match','mb_ereg_replace',
+ 'mb_ereg_search','mb_ereg_search_getpos','mb_ereg_search_getregs',
+ 'mb_ereg_search_init','mb_ereg_search_pos','mb_ereg_search_regs',
+ 'mb_ereg_search_setpos','mb_get_info','mb_http_input',
+ 'mb_http_output','mb_internal_encoding','mb_language',
+ 'mb_list_encodings','mb_output_handler','mb_parse_str',
+ 'mb_preferred_mime_name','mb_regex_encoding','mb_regex_set_options',
+ 'mb_send_mail','mb_split','mb_strcut','mb_strimwidth','mb_stripos',
+ 'mb_stristr','mb_strlen','mb_strpos','mb_strrchr','mb_strrichr',
+ 'mb_strripos','mb_strrpos','mb_strstr','mb_strtolower',
+ 'mb_strtoupper','mb_strwidth','mb_substitute_character','mb_substr',
+ 'mb_substr_count','mcrypt_cbc','mcrypt_cfb','mcrypt_create_iv',
+ 'mcrypt_decrypt','mcrypt_ecb','mcrypt_enc_get_algorithms_name',
+ 'mcrypt_enc_get_block_size','mcrypt_enc_get_iv_size',
+ 'mcrypt_enc_get_key_size','mcrypt_enc_get_modes_name',
+ 'mcrypt_enc_get_supported_key_sizes',
+ 'mcrypt_enc_is_block_algorithm',
+ 'mcrypt_enc_is_block_algorithm_mode','mcrypt_enc_is_block_mode',
+ 'mcrypt_enc_self_test','mcrypt_encrypt','mcrypt_generic',
+ 'mcrypt_generic_deinit','mcrypt_generic_end','mcrypt_generic_init',
+ 'mcrypt_get_block_size','mcrypt_get_cipher_name',
+ 'mcrypt_get_iv_size','mcrypt_get_key_size','mcrypt_list_algorithms',
+ 'mcrypt_list_modes','mcrypt_module_close',
+ 'mcrypt_module_get_algo_block_size',
+ 'mcrypt_module_get_algo_key_size',
+ 'mcrypt_module_get_supported_key_sizes',
+ 'mcrypt_module_is_block_algorithm',
+ 'mcrypt_module_is_block_algorithm_mode',
+ 'mcrypt_module_is_block_mode','mcrypt_module_open',
+ 'mcrypt_module_self_test','mcrypt_ofb','md5','md5_file',
+ 'mdecrypt_generic','memcache_add','memcache_add_server',
+ 'memcache_close','memcache_connect','memcache_debug',
+ 'memcache_decrement','memcache_delete','memcache_flush',
+ 'memcache_get','memcache_get_extended_stats',
+ 'memcache_get_server_status','memcache_get_stats',
+ 'memcache_get_version','memcache_increment','memcache_pconnect',
+ 'memcache_replace','memcache_set','memcache_set_compress_threshold',
+ 'memcache_set_server_params','memory_get_peak_usage',
+ 'memory_get_usage','metaphone','mhash','mhash_count',
+ 'mhash_get_block_size','mhash_get_hash_name','mhash_keygen_s2k',
+ 'method_exists','microtime','mime_content_type','min',
+ 'ming_keypress','ming_setcubicthreshold','ming_setscale',
+ 'ming_useconstants','ming_useswfversion','mkdir','mktime',
+ 'money_format','move_uploaded_file','msql','msql_affected_rows',
+ 'msql_close','msql_connect','msql_create_db','msql_createdb',
+ 'msql_data_seek','msql_db_query','msql_dbname','msql_drop_db',
+ 'msql_dropdb','msql_error','msql_fetch_array','msql_fetch_field',
+ 'msql_fetch_object','msql_fetch_row','msql_field_flags',
+ 'msql_field_len','msql_field_name','msql_field_seek',
+ 'msql_field_table','msql_field_type','msql_fieldflags',
+ 'msql_fieldlen','msql_fieldname','msql_fieldtable','msql_fieldtype',
+ 'msql_free_result','msql_freeresult','msql_list_dbs',
+ 'msql_list_fields','msql_list_tables','msql_listdbs',
+ 'msql_listfields','msql_listtables','msql_num_fields',
+ 'msql_num_rows','msql_numfields','msql_numrows','msql_pconnect',
+ 'msql_query','msql_regcase','msql_result','msql_select_db',
+ 'msql_selectdb','msql_tablename','mssql_bind','mssql_close',
+ 'mssql_connect','mssql_data_seek','mssql_execute',
+ 'mssql_fetch_array','mssql_fetch_assoc','mssql_fetch_batch',
+ 'mssql_fetch_field','mssql_fetch_object','mssql_fetch_row',
+ 'mssql_field_length','mssql_field_name','mssql_field_seek',
+ 'mssql_field_type','mssql_free_result','mssql_free_statement',
+ 'mssql_get_last_message','mssql_guid_string','mssql_init',
+ 'mssql_min_error_severity','mssql_min_message_severity',
+ 'mssql_next_result','mssql_num_fields','mssql_num_rows',
+ 'mssql_pconnect','mssql_query','mssql_result','mssql_rows_affected',
+ 'mssql_select_db','mt_getrandmax','mt_rand','mt_srand','mysql',
+ 'mysql_affected_rows','mysql_client_encoding','mysql_close',
+ 'mysql_connect','mysql_createdb','mysql_create_db',
+ 'mysql_data_seek','mysql_dbname','mysql_db_name','mysql_db_query',
+ 'mysql_dropdb','mysql_drop_db','mysql_errno','mysql_error',
+ 'mysql_escape_string','mysql_fetch_array','mysql_fetch_assoc',
+ 'mysql_fetch_field','mysql_fetch_lengths','mysql_fetch_object',
+ 'mysql_fetch_row','mysql_fieldflags','mysql_fieldlen',
+ 'mysql_fieldname','mysql_fieldtable','mysql_fieldtype',
+ 'mysql_field_flags','mysql_field_len','mysql_field_name',
+ 'mysql_field_seek','mysql_field_table','mysql_field_type',
+ 'mysql_freeresult','mysql_free_result','mysql_get_client_info',
+ 'mysql_get_host_info','mysql_get_proto_info',
+ 'mysql_get_server_info','mysql_info','mysql_insert_id',
+ 'mysql_listdbs','mysql_listfields','mysql_listtables',
+ 'mysql_list_dbs','mysql_list_fields','mysql_list_processes',
+ 'mysql_list_tables','mysql_numfields','mysql_numrows',
+ 'mysql_num_fields','mysql_num_rows','mysql_pconnect','mysql_ping',
+ 'mysql_query','mysql_real_escape_string','mysql_result',
+ 'mysql_selectdb','mysql_select_db','mysql_set_charset','mysql_stat',
+ 'mysql_tablename','mysql_table_name','mysql_thread_id',
+ 'mysql_unbuffered_query','mysqli_affected_rows','mysqli_autocommit',
+ 'mysqli_bind_param','mysqli_bind_result','mysqli_change_user',
+ 'mysqli_character_set_name','mysqli_client_encoding','mysqli_close',
+ 'mysqli_commit','mysqli_connect','mysqli_connect_errno',
+ 'mysqli_connect_error','mysqli_data_seek','mysqli_debug',
+ 'mysqli_disable_reads_from_master','mysqli_disable_rpl_parse',
+ 'mysqli_dump_debug_info','mysqli_embedded_server_end',
+ 'mysqli_embedded_server_start','mysqli_enable_reads_from_master',
+ 'mysqli_enable_rpl_parse','mysqli_errno','mysqli_error',
+ 'mysqli_escape_string','mysqli_execute','mysqli_fetch',
+ 'mysqli_fetch_array','mysqli_fetch_assoc','mysqli_fetch_field',
+ 'mysqli_fetch_field_direct','mysqli_fetch_fields',
+ 'mysqli_fetch_lengths','mysqli_fetch_object','mysqli_fetch_row',
+ 'mysqli_field_count','mysqli_field_seek','mysqli_field_tell',
+ 'mysqli_free_result','mysqli_get_charset','mysqli_get_client_info',
+ 'mysqli_get_client_version','mysqli_get_host_info',
+ 'mysqli_get_metadata','mysqli_get_proto_info',
+ 'mysqli_get_server_info','mysqli_get_server_version',
+ 'mysqli_get_warnings','mysqli_info','mysqli_init',
+ 'mysqli_insert_id','mysqli_kill','mysqli_master_query',
+ 'mysqli_more_results','mysqli_multi_query','mysqli_next_result',
+ 'mysqli_num_fields','mysqli_num_rows','mysqli_options',
+ 'mysqli_param_count','mysqli_ping','mysqli_prepare','mysqli_query',
+ 'mysqli_real_connect','mysqli_real_escape_string',
+ 'mysqli_real_query','mysqli_report','mysqli_rollback',
+ 'mysqli_rpl_parse_enabled','mysqli_rpl_probe',
+ 'mysqli_rpl_query_type','mysqli_select_db','mysqli_send_long_data',
+ 'mysqli_send_query','mysqli_set_charset',
+ 'mysqli_set_local_infile_default','mysqli_set_local_infile_handler',
+ 'mysqli_set_opt','mysqli_slave_query','mysqli_sqlstate',
+ 'mysqli_ssl_set','mysqli_stat','mysqli_stmt_affected_rows',
+ 'mysqli_stmt_attr_get','mysqli_stmt_attr_set',
+ 'mysqli_stmt_bind_param','mysqli_stmt_bind_result',
+ 'mysqli_stmt_close','mysqli_stmt_data_seek','mysqli_stmt_errno',
+ 'mysqli_stmt_error','mysqli_stmt_execute','mysqli_stmt_fetch',
+ 'mysqli_stmt_field_count','mysqli_stmt_free_result',
+ 'mysqli_stmt_get_warnings','mysqli_stmt_init',
+ 'mysqli_stmt_insert_id','mysqli_stmt_num_rows',
+ 'mysqli_stmt_param_count','mysqli_stmt_prepare','mysqli_stmt_reset',
+ 'mysqli_stmt_result_metadata','mysqli_stmt_send_long_data',
+ 'mysqli_stmt_sqlstate','mysqli_stmt_store_result',
+ 'mysqli_store_result','mysqli_thread_id','mysqli_thread_safe',
+ 'mysqli_use_result','mysqli_warning_count','natcasesort','natsort',
+ 'new_xmldoc','next','ngettext','nl2br','nl_langinfo',
+ 'ntuser_getdomaincontroller','ntuser_getusergroups',
+ 'ntuser_getuserinfo','ntuser_getuserlist','number_format',
+ 'ob_clean','ob_deflatehandler','ob_end_clean','ob_end_flush',
+ 'ob_etaghandler','ob_flush','ob_get_clean','ob_get_contents',
+ 'ob_get_flush','ob_get_length','ob_get_level','ob_get_status',
+ 'ob_gzhandler','ob_iconv_handler','ob_implicit_flush',
+ 'ob_inflatehandler','ob_list_handlers','ob_start','ob_tidyhandler',
+ 'octdec','odbc_autocommit','odbc_binmode','odbc_close',
+ 'odbc_close_all','odbc_columnprivileges','odbc_columns',
+ 'odbc_commit','odbc_connect','odbc_cursor','odbc_data_source',
+ 'odbc_do','odbc_error','odbc_errormsg','odbc_exec','odbc_execute',
+ 'odbc_fetch_array','odbc_fetch_into','odbc_fetch_object',
+ 'odbc_fetch_row','odbc_field_len','odbc_field_name',
+ 'odbc_field_num','odbc_field_precision','odbc_field_scale',
+ 'odbc_field_type','odbc_foreignkeys','odbc_free_result',
+ 'odbc_gettypeinfo','odbc_longreadlen','odbc_next_result',
+ 'odbc_num_fields','odbc_num_rows','odbc_pconnect','odbc_prepare',
+ 'odbc_primarykeys','odbc_procedurecolumns','odbc_procedures',
+ 'odbc_result','odbc_result_all','odbc_rollback','odbc_setoption',
+ 'odbc_specialcolumns','odbc_statistics','odbc_tableprivileges',
+ 'odbc_tables','opendir','openlog','openssl_csr_export',
+ 'openssl_csr_export_to_file','openssl_csr_get_public_key',
+ 'openssl_csr_get_subject','openssl_csr_new','openssl_csr_sign',
+ 'openssl_error_string','openssl_free_key','openssl_get_privatekey',
+ 'openssl_get_publickey','openssl_open','openssl_pkcs12_export',
+ 'openssl_pkcs12_export_to_file','openssl_pkcs12_read',
+ 'openssl_pkcs7_decrypt','openssl_pkcs7_encrypt',
+ 'openssl_pkcs7_sign','openssl_pkcs7_verify','openssl_pkey_export',
+ 'openssl_pkey_export_to_file','openssl_pkey_free',
+ 'openssl_pkey_get_details','openssl_pkey_get_private',
+ 'openssl_pkey_get_public','openssl_pkey_new',
+ 'openssl_private_decrypt','openssl_private_encrypt',
+ 'openssl_public_decrypt','openssl_public_encrypt','openssl_seal',
+ 'openssl_sign','openssl_verify','openssl_x509_checkpurpose',
+ 'openssl_x509_check_private_key','openssl_x509_export',
+ 'openssl_x509_export_to_file','openssl_x509_free',
+ 'openssl_x509_parse','openssl_x509_read','ord',
+ 'output_add_rewrite_var','output_reset_rewrite_vars','overload',
+ 'outputdebugstring','pack','parse_ini_file','parse_str','parse_url',
+ 'parsekit_compile_file','parsekit_compile_string',
+ 'parsekit_func_arginfo','parsekit_opcode_flags',
+ 'parsekit_opcode_name','passthru','pathinfo','pclose',
+ 'pdf_add_bookmark','pdf_add_launchlink','pdf_add_locallink',
+ 'pdf_add_nameddest','pdf_add_note','pdf_add_pdflink',
+ 'pdf_add_thumbnail','pdf_add_weblink','pdf_arc','pdf_arcn',
+ 'pdf_attach_file','pdf_begin_font','pdf_begin_glyph',
+ 'pdf_begin_page','pdf_begin_pattern','pdf_begin_template',
+ 'pdf_circle','pdf_clip','pdf_close','pdf_close_image',
+ 'pdf_close_pdi','pdf_close_pdi_page','pdf_closepath',
+ 'pdf_closepath_fill_stroke','pdf_closepath_stroke','pdf_concat',
+ 'pdf_continue_text','pdf_create_gstate','pdf_create_pvf',
+ 'pdf_curveto','pdf_delete','pdf_delete_pvf','pdf_encoding_set_char',
+ 'pdf_end_font','pdf_end_glyph','pdf_end_page','pdf_end_pattern',
+ 'pdf_end_template','pdf_endpath','pdf_fill','pdf_fill_imageblock',
+ 'pdf_fill_pdfblock','pdf_fill_stroke','pdf_fill_textblock',
+ 'pdf_findfont','pdf_fit_image','pdf_fit_pdi_page',
+ 'pdf_fit_textline','pdf_get_apiname','pdf_get_buffer',
+ 'pdf_get_errmsg','pdf_get_errnum','pdf_get_parameter',
+ 'pdf_get_pdi_parameter','pdf_get_pdi_value','pdf_get_value',
+ 'pdf_initgraphics','pdf_lineto','pdf_load_font',
+ 'pdf_load_iccprofile','pdf_load_image','pdf_makespotcolor',
+ 'pdf_moveto','pdf_new','pdf_open_ccitt','pdf_open_file',
+ 'pdf_open_image','pdf_open_image_file','pdf_open_pdi',
+ 'pdf_open_pdi_page','pdf_place_image','pdf_place_pdi_page',
+ 'pdf_process_pdi','pdf_rect','pdf_restore','pdf_rotate','pdf_save',
+ 'pdf_scale','pdf_set_border_color','pdf_set_border_dash',
+ 'pdf_set_border_style','pdf_set_gstate','pdf_set_info',
+ 'pdf_set_parameter','pdf_set_text_pos','pdf_set_value',
+ 'pdf_setcolor','pdf_setdash','pdf_setdashpattern','pdf_setflat',
+ 'pdf_setfont','pdf_setlinecap','pdf_setlinejoin','pdf_setlinewidth',
+ 'pdf_setmatrix','pdf_setmiterlimit','pdf_setpolydash','pdf_shading',
+ 'pdf_shading_pattern','pdf_shfill','pdf_show','pdf_show_boxed',
+ 'pdf_show_xy','pdf_skew','pdf_stringwidth','pdf_stroke',
+ 'pdf_translate','pdo_drivers','pfsockopen','pg_affected_rows',
+ 'pg_cancel_query','pg_clientencoding','pg_client_encoding',
+ 'pg_close','pg_cmdtuples','pg_connect','pg_connection_busy',
+ 'pg_connection_reset','pg_connection_status','pg_convert',
+ 'pg_copy_from','pg_copy_to','pg_dbname','pg_delete','pg_end_copy',
+ 'pg_errormessage','pg_escape_bytea','pg_escape_string','pg_exec',
+ 'pg_execute','pg_fetch_all','pg_fetch_all_columns','pg_fetch_array',
+ 'pg_fetch_assoc','pg_fetch_object','pg_fetch_result','pg_fetch_row',
+ 'pg_fieldisnull','pg_fieldname','pg_fieldnum','pg_fieldprtlen',
+ 'pg_fieldsize','pg_fieldtype','pg_field_is_null','pg_field_name',
+ 'pg_field_num','pg_field_prtlen','pg_field_size','pg_field_table',
+ 'pg_field_type','pg_field_type_oid','pg_free_result',
+ 'pg_freeresult','pg_get_notify','pg_get_pid','pg_get_result',
+ 'pg_getlastoid','pg_host','pg_insert','pg_last_error',
+ 'pg_last_notice','pg_last_oid','pg_loclose','pg_locreate',
+ 'pg_loexport','pg_loimport','pg_loopen','pg_loread','pg_loreadall',
+ 'pg_lounlink','pg_lowrite','pg_lo_close','pg_lo_create',
+ 'pg_lo_export','pg_lo_import','pg_lo_open','pg_lo_read',
+ 'pg_lo_read_all','pg_lo_seek','pg_lo_tell','pg_lo_unlink',
+ 'pg_lo_write','pg_meta_data','pg_numfields','pg_numrows',
+ 'pg_num_fields','pg_num_rows','pg_options','pg_parameter_status',
+ 'pg_pconnect','pg_ping','pg_port','pg_prepare','pg_put_line',
+ 'pg_query','pg_query_params','pg_result','pg_result_error',
+ 'pg_result_error_field','pg_result_seek','pg_result_status',
+ 'pg_select','pg_send_execute','pg_send_prepare','pg_send_query',
+ 'pg_send_query_params','pg_set_client_encoding',
+ 'pg_set_error_verbosity','pg_setclientencoding','pg_trace',
+ 'pg_transaction_status','pg_tty','pg_unescape_bytea','pg_untrace',
+ 'pg_update','pg_version','php_egg_logo_guid','php_ini_loaded_file',
+ 'php_ini_scanned_files','php_logo_guid','php_real_logo_guid',
+ 'php_sapi_name','php_strip_whitespace','php_uname','phpcredits',
+ 'phpdoc_xml_from_string','phpinfo','phpversion','pi','png2wbmp',
+ 'pop3_close','pop3_delete_message','pop3_get_account_size',
+ 'pop3_get_message','pop3_get_message_count',
+ 'pop3_get_message_header','pop3_get_message_ids',
+ 'pop3_get_message_size','pop3_get_message_sizes','pop3_open',
+ 'pop3_undelete','popen','pos','posix_ctermid','posix_errno',
+ 'posix_getcwd','posix_getegid','posix_geteuid','posix_getgid',
+ 'posix_getgrgid','posix_getgrnam','posix_getgroups',
+ 'posix_getlogin','posix_getpgid','posix_getpgrp','posix_getpid',
+ 'posix_getppid','posix_getpwnam','posix_getpwuid','posix_getrlimit',
+ 'posix_getsid','posix_getuid','posix_get_last_error','posix_isatty',
+ 'posix_kill','posix_mkfifo','posix_setegid','posix_seteuid',
+ 'posix_setgid','posix_setpgid','posix_setsid','posix_setuid',
+ 'posix_strerror','posix_times','posix_ttyname','posix_uname','pow',
+ 'preg_grep','preg_last_error','preg_match','preg_match_all',
+ 'preg_quote','preg_replace','preg_replace_callback','preg_split',
+ 'prev','print_r','printf','proc_close','proc_get_status',
+ 'proc_open','proc_terminate','putenv','quoted_printable_decode',
+ 'quotemeta','rad2deg','radius_acct_open','radius_add_server',
+ 'radius_auth_open','radius_close','radius_config',
+ 'radius_create_request','radius_cvt_addr','radius_cvt_int',
+ 'radius_cvt_string','radius_demangle','radius_demangle_mppe_key',
+ 'radius_get_attr','radius_get_vendor_attr','radius_put_addr',
+ 'radius_put_attr','radius_put_int','radius_put_string',
+ 'radius_put_vendor_addr','radius_put_vendor_attr',
+ 'radius_put_vendor_int','radius_put_vendor_string',
+ 'radius_request_authenticator','radius_send_request',
+ 'radius_server_secret','radius_strerror','rand','range',
+ 'rawurldecode','rawurlencode','read_exif_data','readdir','readfile',
+ 'readgzfile','readlink','realpath','reg_close_key','reg_create_key',
+ 'reg_enum_key','reg_enum_value','reg_get_value','reg_open_key',
+ 'reg_set_value','register_shutdown_function',
+ 'register_tick_function','rename','res_close','res_get','res_list',
+ 'res_list_type','res_open','res_set','reset',
+ 'restore_error_handler','restore_include_path','rewind','rewinddir',
+ 'rmdir','round','rsort','rtrim','runkit_class_adopt',
+ 'runkit_class_emancipate','runkit_constant_add',
+ 'runkit_constant_redefine','runkit_constant_remove',
+ 'runkit_default_property_add','runkit_function_add',
+ 'runkit_function_copy','runkit_function_redefine',
+ 'runkit_function_remove','runkit_function_rename','runkit_import',
+ 'runkit_lint','runkit_lint_file','runkit_method_add',
+ 'runkit_method_copy','runkit_method_redefine',
+ 'runkit_method_remove','runkit_method_rename','runkit_object_id',
+ 'runkit_return_value_used','runkit_sandbox_output_handler',
+ 'runkit_superglobals','runkit_zval_inspect','scandir','sem_acquire',
+ 'sem_get','sem_release','sem_remove','serialize',
+ 'session_cache_expire','session_cache_limiter','session_commit',
+ 'session_decode','session_destroy','session_encode',
+ 'session_get_cookie_params','session_id','session_is_registered',
+ 'session_module_name','session_name','session_regenerate_id',
+ 'session_register','session_save_path','session_set_cookie_params',
+ 'session_set_save_handler','session_start','session_unregister',
+ 'session_unset','session_write_close','set_content',
+ 'set_error_handler','set_file_buffer','set_include_path',
+ 'set_magic_quotes_runtime','set_socket_blocking','set_time_limit',
+ 'setcookie','setlocale','setrawcookie','settype','sha1','sha1_file',
+ 'shell_exec','shmop_close','shmop_delete','shmop_open','shmop_read',
+ 'shmop_size','shmop_write','shm_attach','shm_detach','shm_get_var',
+ 'shm_put_var','shm_remove','shm_remove_var','show_source','shuffle',
+ 'similar_text','simplexml_import_dom','simplexml_load_file',
+ 'simplexml_load_string','sin','sinh','sizeof','sleep','smtp_close',
+ 'smtp_cmd_data','smtp_cmd_mail','smtp_cmd_rcpt','smtp_connect',
+ 'snmp_get_quick_print','snmp_get_valueretrieval','snmp_read_mib',
+ 'snmp_set_quick_print','snmp_set_valueretrieval','snmp2_get',
+ 'snmp2_getnext','snmp2_real_walk','snmp2_set','snmp2_walk',
+ 'snmp3_get','snmp3_getnext','snmp3_real_walk','snmp3_set',
+ 'snmp3_walk','snmpget','snmpgetnext','snmprealwalk','snmpset',
+ 'snmpwalk','snmpwalkoid','socket_accept','socket_bind',
+ 'socket_clear_error','socket_close','socket_connect',
+ 'socket_create','socket_create_listen','socket_create_pair',
+ 'socket_getopt','socket_getpeername','socket_getsockname',
+ 'socket_get_option','socket_get_status','socket_iovec_add',
+ 'socket_iovec_alloc','socket_iovec_delete','socket_iovec_fetch',
+ 'socket_iovec_free','socket_iovec_set','socket_last_error',
+ 'socket_listen','socket_read','socket_readv','socket_recv',
+ 'socket_recvfrom','socket_recvmsg','socket_select','socket_send',
+ 'socket_sendmsg','socket_sendto','socket_setopt','socket_set_block',
+ 'socket_set_blocking','socket_set_nonblock','socket_set_option',
+ 'socket_set_timeout','socket_shutdown','socket_strerror',
+ 'socket_write','socket_writev','sort','soundex','spl_autoload',
+ 'spl_autoload_call','spl_autoload_extensions',
+ 'spl_autoload_functions','spl_autoload_register',
+ 'spl_autoload_unregister','spl_classes','spl_object_hash','split',
+ 'spliti','sprintf','sql_regcase','sqlite_array_query',
+ 'sqlite_busy_timeout','sqlite_changes','sqlite_close',
+ 'sqlite_column','sqlite_create_aggregate','sqlite_create_function',
+ 'sqlite_current','sqlite_error_string','sqlite_escape_string',
+ 'sqlite_exec','sqlite_factory','sqlite_fetch_all',
+ 'sqlite_fetch_array','sqlite_fetch_column_types',
+ 'sqlite_fetch_object','sqlite_fetch_single','sqlite_fetch_string',
+ 'sqlite_field_name','sqlite_has_more','sqlite_has_prev',
+ 'sqlite_last_error','sqlite_last_insert_rowid','sqlite_libencoding',
+ 'sqlite_libversion','sqlite_next','sqlite_num_fields',
+ 'sqlite_num_rows','sqlite_open','sqlite_popen','sqlite_prev',
+ 'sqlite_query','sqlite_rewind','sqlite_seek','sqlite_single_query',
+ 'sqlite_udf_decode_binary','sqlite_udf_encode_binary',
+ 'sqlite_unbuffered_query','sqlite_valid','sqrt','srand','sscanf',
+ 'ssh2_auth_hostbased_file','ssh2_auth_none','ssh2_auth_password',
+ 'ssh2_auth_pubkey_file','ssh2_connect','ssh2_exec',
+ 'ssh2_fetch_stream','ssh2_fingerprint','ssh2_forward_accept',
+ 'ssh2_forward_listen','ssh2_methods_negotiated','ssh2_poll',
+ 'ssh2_publickey_add','ssh2_publickey_init','ssh2_publickey_list',
+ 'ssh2_publickey_remove','ssh2_scp_recv','ssh2_scp_send','ssh2_sftp',
+ 'ssh2_sftp_lstat','ssh2_sftp_mkdir','ssh2_sftp_readlink',
+ 'ssh2_sftp_realpath','ssh2_sftp_rename','ssh2_sftp_rmdir',
+ 'ssh2_sftp_stat','ssh2_sftp_symlink','ssh2_sftp_unlink',
+ 'ssh2_shell','ssh2_tunnel','stat','stats_absolute_deviation',
+ 'stats_cdf_beta','stats_cdf_binomial','stats_cdf_cauchy',
+ 'stats_cdf_chisquare','stats_cdf_exponential','stats_cdf_f',
+ 'stats_cdf_gamma','stats_cdf_laplace','stats_cdf_logistic',
+ 'stats_cdf_negative_binomial','stats_cdf_noncentral_chisquare',
+ 'stats_cdf_noncentral_f','stats_cdf_noncentral_t',
+ 'stats_cdf_normal','stats_cdf_poisson','stats_cdf_t',
+ 'stats_cdf_uniform','stats_cdf_weibull','stats_covariance',
+ 'stats_dens_beta','stats_dens_cauchy','stats_dens_chisquare',
+ 'stats_dens_exponential','stats_dens_f','stats_dens_gamma',
+ 'stats_dens_laplace','stats_dens_logistic','stats_dens_normal',
+ 'stats_dens_pmf_binomial','stats_dens_pmf_hypergeometric',
+ 'stats_dens_pmf_negative_binomial','stats_dens_pmf_poisson',
+ 'stats_dens_t','stats_dens_uniform','stats_dens_weibull',
+ 'stats_harmonic_mean','stats_kurtosis','stats_rand_gen_beta',
+ 'stats_rand_gen_chisquare','stats_rand_gen_exponential',
+ 'stats_rand_gen_f','stats_rand_gen_funiform','stats_rand_gen_gamma',
+ 'stats_rand_gen_ipoisson','stats_rand_gen_iuniform',
+ 'stats_rand_gen_noncenral_f','stats_rand_gen_noncentral_chisquare',
+ 'stats_rand_gen_noncentral_t','stats_rand_gen_normal',
+ 'stats_rand_gen_t','stats_rand_getsd','stats_rand_ibinomial',
+ 'stats_rand_ibinomial_negative','stats_rand_ignlgi',
+ 'stats_rand_phrase_to_seeds','stats_rand_ranf','stats_rand_setall',
+ 'stats_skew','stats_standard_deviation','stats_stat_binomial_coef',
+ 'stats_stat_correlation','stats_stat_factorial',
+ 'stats_stat_independent_t','stats_stat_innerproduct',
+ 'stats_stat_paired_t','stats_stat_percentile','stats_stat_powersum',
+ 'stats_variance','strcasecmp','strchr','strcmp','strcoll','strcspn',
+ 'stream_bucket_append','stream_bucket_make_writeable',
+ 'stream_bucket_new','stream_bucket_prepend','stream_context_create',
+ 'stream_context_get_default','stream_context_get_options',
+ 'stream_context_set_default','stream_context_set_option',
+ 'stream_context_set_params','stream_copy_to_stream',
+ 'stream_encoding','stream_filter_append','stream_filter_prepend',
+ 'stream_filter_register','stream_filter_remove',
+ 'stream_get_contents','stream_get_filters','stream_get_line',
+ 'stream_get_meta_data','stream_get_transports',
+ 'stream_get_wrappers','stream_is_local',
+ 'stream_notification_callback','stream_register_wrapper',
+ 'stream_resolve_include_path','stream_select','stream_set_blocking',
+ 'stream_set_timeout','stream_set_write_buffer',
+ 'stream_socket_accept','stream_socket_client',
+ 'stream_socket_enable_crypto','stream_socket_get_name',
+ 'stream_socket_pair','stream_socket_recvfrom',
+ 'stream_socket_sendto','stream_socket_server',
+ 'stream_socket_shutdown','stream_supports_lock',
+ 'stream_wrapper_register','stream_wrapper_restore',
+ 'stream_wrapper_unregister','strftime','stripcslashes','stripos',
+ 'stripslashes','strip_tags','stristr','strlen','strnatcasecmp',
+ 'strnatcmp','strpbrk','strncasecmp','strncmp','strpos','strrchr',
+ 'strrev','strripos','strrpos','strspn','strstr','strtok',
+ 'strtolower','strtotime','strtoupper','strtr','strval',
+ 'str_ireplace','str_pad','str_repeat','str_replace','str_rot13',
+ 'str_split','str_shuffle','str_word_count','substr',
+ 'substr_compare','substr_count','substr_replace','svn_add',
+ 'svn_auth_get_parameter','svn_auth_set_parameter','svn_cat',
+ 'svn_checkout','svn_cleanup','svn_client_version','svn_commit',
+ 'svn_diff','svn_export','svn_fs_abort_txn','svn_fs_apply_text',
+ 'svn_fs_begin_txn2','svn_fs_change_node_prop','svn_fs_check_path',
+ 'svn_fs_contents_changed','svn_fs_copy','svn_fs_delete',
+ 'svn_fs_dir_entries','svn_fs_file_contents','svn_fs_file_length',
+ 'svn_fs_is_dir','svn_fs_is_file','svn_fs_make_dir',
+ 'svn_fs_make_file','svn_fs_node_created_rev','svn_fs_node_prop',
+ 'svn_fs_props_changed','svn_fs_revision_prop',
+ 'svn_fs_revision_root','svn_fs_txn_root','svn_fs_youngest_rev',
+ 'svn_import','svn_info','svn_log','svn_ls','svn_repos_create',
+ 'svn_repos_fs','svn_repos_fs_begin_txn_for_commit',
+ 'svn_repos_fs_commit_txn','svn_repos_hotcopy','svn_repos_open',
+ 'svn_repos_recover','svn_status','svn_update','symlink',
+ 'sys_get_temp_dir','syslog','system','tan','tanh','tempnam',
+ 'textdomain','thread_get','thread_include','thread_lock',
+ 'thread_lock_try','thread_mutex_destroy','thread_mutex_init',
+ 'thread_set','thread_start','thread_unlock','tidy_access_count',
+ 'tidy_clean_repair','tidy_config_count','tidy_diagnose',
+ 'tidy_error_count','tidy_get_body','tidy_get_config',
+ 'tidy_get_error_buffer','tidy_get_head','tidy_get_html',
+ 'tidy_get_html_ver','tidy_get_output','tidy_get_release',
+ 'tidy_get_root','tidy_get_status','tidy_getopt','tidy_is_xhtml',
+ 'tidy_is_xml','tidy_parse_file','tidy_parse_string',
+ 'tidy_repair_file','tidy_repair_string','tidy_warning_count','time',
+ 'timezone_abbreviations_list','timezone_identifiers_list',
+ 'timezone_name_from_abbr','timezone_name_get','timezone_offset_get',
+ 'timezone_open','timezone_transitions_get','tmpfile',
+ 'token_get_all','token_name','touch','trigger_error',
+ 'transliterate','transliterate_filters_get','trim','uasort',
+ 'ucfirst','ucwords','uksort','umask','uniqid','unixtojd','unlink',
+ 'unpack','unregister_tick_function','unserialize','unset',
+ 'urldecode','urlencode','user_error','use_soap_error_handler',
+ 'usleep','usort','utf8_decode','utf8_encode','var_dump',
+ 'var_export','variant_abs','variant_add','variant_and',
+ 'variant_cast','variant_cat','variant_cmp',
+ 'variant_date_from_timestamp','variant_date_to_timestamp',
+ 'variant_div','variant_eqv','variant_fix','variant_get_type',
+ 'variant_idiv','variant_imp','variant_int','variant_mod',
+ 'variant_mul','variant_neg','variant_not','variant_or',
+ 'variant_pow','variant_round','variant_set','variant_set_type',
+ 'variant_sub','variant_xor','version_compare','virtual','vfprintf',
+ 'vprintf','vsprintf','wddx_add_vars','wddx_deserialize',
+ 'wddx_packet_end','wddx_packet_start','wddx_serialize_value',
+ 'wddx_serialize_vars','win_beep','win_browse_file',
+ 'win_browse_folder','win_create_link','win_message_box',
+ 'win_play_wav','win_shell_execute','win32_create_service',
+ 'win32_delete_service','win32_get_last_control_message',
+ 'win32_ps_list_procs','win32_ps_stat_mem','win32_ps_stat_proc',
+ 'win32_query_service_status','win32_scheduler_delete_task',
+ 'win32_scheduler_enum_tasks','win32_scheduler_get_task_info',
+ 'win32_scheduler_run','win32_scheduler_set_task_info',
+ 'win32_set_service_status','win32_start_service',
+ 'win32_start_service_ctrl_dispatcher','win32_stop_service',
+ 'wordwrap','xml_error_string','xml_get_current_byte_index',
+ 'xml_get_current_column_number','xml_get_current_line_number',
+ 'xml_get_error_code','xml_parse','xml_parser_create',
+ 'xml_parser_create_ns','xml_parser_free','xml_parser_get_option',
+ 'xml_parser_set_option','xml_parse_into_struct',
+ 'xml_set_character_data_handler','xml_set_default_handler',
+ 'xml_set_element_handler','xml_set_end_namespace_decl_handler',
+ 'xml_set_external_entity_ref_handler',
+ 'xml_set_notation_decl_handler','xml_set_object',
+ 'xml_set_processing_instruction_handler',
+ 'xml_set_start_namespace_decl_handler',
+ 'xml_set_unparsed_entity_decl_handler','xmldoc','xmldocfile',
+ 'xmlrpc_decode','xmlrpc_decode_request','xmlrpc_encode',
+ 'xmlrpc_encode_request','xmlrpc_get_type','xmlrpc_is_fault',
+ 'xmlrpc_parse_method_descriptions',
+ 'xmlrpc_server_add_introspection_data','xmlrpc_server_call_method',
+ 'xmlrpc_server_create','xmlrpc_server_destroy',
+ 'xmlrpc_server_register_introspection_callback',
+ 'xmlrpc_server_register_method','xmlrpc_set_type','xmltree',
+ 'xmlwriter_end_attribute','xmlwriter_end_cdata',
+ 'xmlwriter_end_comment','xmlwriter_end_document',
+ 'xmlwriter_end_dtd','xmlwriter_end_dtd_attlist',
+ 'xmlwriter_end_dtd_element','xmlwriter_end_dtd_entity',
+ 'xmlwriter_end_element','xmlwriter_end_pi','xmlwriter_flush',
+ 'xmlwriter_full_end_element','xmlwriter_open_memory',
+ 'xmlwriter_open_uri','xmlwriter_output_memory',
+ 'xmlwriter_set_indent','xmlwriter_set_indent_string',
+ 'xmlwriter_start_attribute','xmlwriter_start_attribute_ns',
+ 'xmlwriter_start_cdata','xmlwriter_start_comment',
+ 'xmlwriter_start_document','xmlwriter_start_dtd',
+ 'xmlwriter_start_dtd_attlist','xmlwriter_start_dtd_element',
+ 'xmlwriter_start_dtd_entity','xmlwriter_start_element',
+ 'xmlwriter_start_element_ns','xmlwriter_start_pi','xmlwriter_text',
+ 'xmlwriter_write_attribute','xmlwriter_write_attribute_ns',
+ 'xmlwriter_write_cdata','xmlwriter_write_comment',
+ 'xmlwriter_write_dtd','xmlwriter_write_dtd_attlist',
+ 'xmlwriter_write_dtd_element','xmlwriter_write_dtd_entity',
+ 'xmlwriter_write_element','xmlwriter_write_element_ns',
+ 'xmlwriter_write_pi','xmlwriter_write_raw','xpath_eval',
+ 'xpath_eval_expression','xpath_new_context','xpath_register_ns',
+ 'xpath_register_ns_auto','xptr_eval','xptr_new_context','yp_all',
+ 'yp_cat','yp_errno','yp_err_string','yp_first',
+ 'yp_get_default_domain','yp_master','yp_match','yp_next','yp_order',
+ 'zend_current_obfuscation_level','zend_get_cfg_var','zend_get_id',
+ 'zend_loader_current_file','zend_loader_enabled',
+ 'zend_loader_file_encoded','zend_loader_file_licensed',
+ 'zend_loader_install_license','zend_loader_version',
+ 'zend_logo_guid','zend_match_hostmasks','zend_obfuscate_class_name',
+ 'zend_obfuscate_function_name','zend_optimizer_version',
+ 'zend_runtime_obfuscate','zend_version','zip_close',
+ 'zip_entry_close','zip_entry_compressedsize',
+ 'zip_entry_compressionmethod','zip_entry_filesize','zip_entry_name',
+ 'zip_entry_open','zip_entry_read','zip_open','zip_read',
+ 'zlib_get_coding_type'
+ ),
+ 4 => array(
+ 'DEFAULT_INCLUDE_PATH', 'DIRECTORY_SEPARATOR', 'E_ALL',
+ 'E_COMPILE_ERROR', 'E_COMPILE_WARNING', 'E_CORE_ERROR',
+ 'E_CORE_WARNING', 'E_ERROR', 'E_NOTICE', 'E_PARSE', 'E_STRICT',
+ 'E_USER_ERROR', 'E_USER_NOTICE', 'E_USER_WARNING', 'E_WARNING',
+ 'ENT_COMPAT','ENT_QUOTES','ENT_NOQUOTES',
+ 'false', 'null', 'PEAR_EXTENSION_DIR', 'PEAR_INSTALL_DIR',
+ 'PHP_BINDIR', 'PHP_CONFIG_FILE_PATH', 'PHP_DATADIR',
+ 'PHP_EXTENSION_DIR', 'PHP_LIBDIR',
+ 'PHP_LOCALSTATEDIR', 'PHP_OS',
+ 'PHP_OUTPUT_HANDLER_CONT', 'PHP_OUTPUT_HANDLER_END',
+ 'PHP_OUTPUT_HANDLER_START', 'PHP_SYSCONFDIR',
+ 'PHP_VERSION', 'true', '__CLASS__', '__FILE__', '__FUNCTION__',
+ '__LINE__', '__METHOD__'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '<'.'%', '<'.'%=', '%'.'>', '<'.'?', '<'.'?=', '?'.'>'
+ ),
+ 0 => array(
+ '(', ')', '[', ']', '{', '}',
+ '!', '@', '%', '&', '|', '/',
+ '<', '>',
+ '=', '-', '+', '*',
+ '.', ':', ',', ';'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #990000;',
+ 4 => 'color: #009900; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #666666; font-style: italic;',
+ 3 => 'color: #0000cc; font-style: italic;',
+ 4 => 'color: #009933; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #660099; font-weight: bold;',
+ 3 => 'color: #660099; font-weight: bold;',
+ 4 => 'color: #006699; font-weight: bold;',
+ 5 => 'color: #006699; font-weight: bold; font-style: italic;',
+ 6 => 'color: #009933; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;',
+ 'HARD' => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #004000;',
+ 2 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;',
+ 1 => 'color: #000000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #000088;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.php.net/{FNAMEL}',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '-&gt;',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ //Variables
+ 0 => "[\\$]+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<'.'?php' => '?'.'>'
+ ),
+ 1 => array(
+ '<'.'?' => '?'.'>'
+ ),
+ 2 => array(
+ '<'.'%' => '%'.'>'
+ ),
+ 3 => array(
+ '<script language="php">' => '</script>'
+ ),
+ 4 => "/(?P<start><\\?(?>php\b)?)(?:".
+ "(?>[^\"'?\\/<]+)|".
+ "\\?(?!>)|".
+ "(?>'(?>[^'\\\\]|\\\\'|\\\\\\\|\\\\)*')|".
+ "(?>\"(?>[^\"\\\\]|\\\\\"|\\\\\\\\|\\\\)*\")|".
+ "(?>\\/\\*(?>[^\\*]|(?!\\*\\/)\\*)*\\*\\/)|".
+ "\\/\\/(?>.*?(?:\\?>|$))|".
+ "#(?>.*?(?:\\?>|$))|".
+ "\\/(?=[^*\\/])|".
+ "<(?!<<)|".
+ "<<<(?P<phpdoc>\w+)\s.*?\s\k<phpdoc>".
+ ")*?(?P<end>\\?>|\Z)/sm",
+ 5 => "/(?P<start><%)(?:".
+ "(?>[^\"'%\\/<]+)|".
+ "%(?!>)|".
+ "(?>'(?>[^'\\\\]|\\\\'|\\\\\\\|\\\\)*')|".
+ "(?>\"(?>[^\\\"\\\\]|\\\\\"|\\\\\\\\|\\\\)*\")|".
+ "(?>\\/\\*(?>[^\\*]|(?!\\*\\/)\\*)*\\*\\/)|".
+ "\\/\\/(?>.*?(?:%>|$))|".
+ "#(?>.*?(?:%>|$))|".
+ "\\/(?=[^*\\/])|".
+ "<(?!<<)|".
+ "<<<(?P<phpdoc>\w+)\s.*?\s\k<phpdoc>".
+ ")*?(?P<end>%>|\Z)/sm",
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pic16.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pic16.php
new file mode 100644
index 00000000..46d7ac94
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pic16.php
@@ -0,0 +1,141 @@
+<?php
+/*************************************************************************************
+ * pic16.php
+ * -------
+ * Author: Phil Mattison (mattison@ohmikron.com)
+ * Copyright: (c) 2008 Ohmikron Corp. (http://www.ohmikron.com/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/07/30
+ *
+ * PIC16 Assembler language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/07/30 (1.0.8)
+ * - First Release
+ *
+ * TODO (updated 2008/07/30)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'PIC16',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ /*Instructions*/
+ 1 => array(
+ 'addcf','adddcf','addlw','addwf','andlw','andwf','bc','bcf','bdc',
+ 'bnc','bndc','bnz','bsf','btfsc','btfss','bz','call','clrc','clrdc',
+ 'clrf','clrw','clrwdt','clrz','comf','decf','goto','incf','incfsz',
+ 'iorlw','iorwf','lcall','lgoto','movf','movfw','movlw','movwf',
+ 'option','negf','nop','retfie','retlw','return','rlf','rrf','setc',
+ 'setdc','setz','skpc','skpdc','skpnc','skpndc','skpnz','skpz',
+ 'sleep','subcf','subdcf','sublw','subwf','swapf','tris','tstf',
+ 'xorlw','xorwf'
+ ),
+ /*Registers*/
+ 2 => array(
+ 'INDF','TMR0','OPTION','PCL','STATUS','FSR','PORTA','PORTB','PORTC',
+ 'PORTD','PORTE','PORTF','TRISA','TRISB','TRISC','TRISD','TRISE',
+ 'TRISF','PCLATH','INTCON','PIR1','PIE1','PCON','CMCON','VRCON',
+ 'F','W'
+ ),
+ /*Directives*/
+ 3 => array(
+ '_BADRAM','BANKISEL','BANKSEL','CBLOCK','CODE','_CONFIG','CONSTANT',
+ 'DA','DATA','DB','DE','#DEFINE','DT','DW','ELSE','END','ENDC',
+ 'ENDIF','ENDM','ENDW','EQU','ERROR','ERRORLEVEL','EXITM','EXPAND',
+ 'EXTERN','FILL','GLOBAL','IDATA','_IDLOCS','IF','IFDEF','IFNDEF',
+ 'INCLUDE','#INCLUDE','LIST','LOCAL','MACRO','_MAXRAM','MESSG',
+ 'NOEXPAND','NOLIST','ORG','PAGE','PAGESEL','PROCESSOR','RADIX',
+ 'RES','SET','SPACE','SUBTITLE','TITLE','UDATA','UDATA_ACS',
+ 'UDATA_OVR','UDATA_SHR','#UNDEFINE','VARIABLE','WHILE',
+ 'D','H','O','B','A'
+ ),
+ ),
+ 'SYMBOLS' => array('=','.',',',':'),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000a0; font-weight: bold;',
+ 2 => 'color: #aa3300; font-weight: bold;',
+ 3 => 'color: #0000ff;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #00a000;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff7700;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff7700;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #7777ff;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC |
+ GESHI_NUMBER_BIN_SUFFIX |
+ GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_HEX_SUFFIX,
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "a-zA-Z0-9\$_\|\#>|^",
+ 'DISALLOWED_AFTER' => "a-zA-Z0-9_<\|%"
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pike.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pike.php
new file mode 100644
index 00000000..743f711b
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pike.php
@@ -0,0 +1,103 @@
+<?php
+/*************************************************************************************
+ * pike.php
+ * --------
+ * Author: Rick E. (codeblock@eighthbit.net)
+ * Copyright: (c) 2009 Rick E.
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/12/10
+ *
+ * Pike language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/12/25 (1.0.8.6)
+ * - First Release
+ *
+ * TODO (updated 2009/12/25)
+ * -------------------------
+ *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Pike',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'goto', 'break', 'continue', 'return', 'case', 'default', 'if',
+ 'else', 'switch', 'while', 'foreach', 'do', 'for', 'gauge',
+ 'destruct', 'lambda', 'inherit', 'import', 'typeof', 'catch',
+ 'inline', 'nomask', 'private', 'protected', 'public', 'static'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(', ')', '{', '}', '[', ']', '+', '-', '*', '/', '%', '=', '!', '&', '|', '?', ';'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(1 => ''),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(1 => '.'),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pixelbender.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pixelbender.php
new file mode 100644
index 00000000..7b29ee6c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pixelbender.php
@@ -0,0 +1,176 @@
+<?php
+/*************************************************************************************
+ * pixelbender.php
+ * ----------------
+ * Author: Richard Olsson (r@richardolsson.se)
+ * Copyright: (c) 2008 Richard Olsson (richardolsson.se)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/11/16
+ *
+ * Pixel Bender 1.0 language file for GeSHi.
+ *
+ *
+ * Please feel free to modify this file, although I would greatly appreciate
+ * it if you would then send some feedback on why the file needed to be
+ * changed, using the e-mail address above.
+ *
+ *
+ * The colors are inspired by those used in the Pixel Bender Toolkit, with
+ * some slight modifications.
+ *
+ * For more info on Pixel Bender, see the Adobe Labs Wiki article at
+ * http://labs.adobe.com/wiki/index.php/Pixel_Bender_Toolkit.
+ *
+ * Keyword groups are defined as follows (groups marked with an asterisk
+ * inherit their names from terminology used in the language specification
+ * included with the Pixel Bender Toolkit, see URL above.)
+ *
+ * 1. languageVersion & kernel keywords
+ * 2. Kernel Members *
+ * 3. Types *
+ * 4. Statements * & qualifiers (in, out, inout)
+ * 5. Built-in functions *
+ * 6. Meta-data names
+ * 7. Preprocessor & Pre-defined symbols *
+ *
+ *
+ * CHANGES
+ * -------
+ * 2008/11/16 (1.0.8.2)
+ * - Initial release
+ *
+ * TODO (updated 2008/11/16)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Pixel Bender 1.0',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'languageVersion', 'kernel'
+ ),
+ 2 => array(
+ 'import', 'parameter', 'dependent', 'const', 'input', 'output',
+ 'evaluatePixel', 'evaluateDependents', 'needed', 'changed', 'generated'
+ ),
+ 3 => array(
+ 'bool', 'bool2', 'bool3', 'bool4', 'int', 'int2', 'int3', 'int4',
+ 'float', 'float2', 'float3', 'float4', 'float2x2', 'float3x3', 'float4x4',
+ 'pixel2', 'pixel3', 'pixel4', 'region', 'image1', 'image2', 'image3', 'image4',
+ 'imageRef', 'void'
+ ),
+ 4 => array(
+ 'in', 'out', 'inout', 'if', 'else', 'for', 'while', 'do', 'break',
+ 'continue', 'return'
+ ),
+ 5 => array(
+ 'radians', 'degrees', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'pow',
+ 'exp', 'exp2', 'log', 'log2', 'sqrt', 'inverseSqrt', 'abs', 'sign', 'floor',
+ 'ceil', 'fract', 'mod', 'min', 'max', 'step', 'clamp', 'mix', 'smoothStep',
+ 'length', 'distance', 'dot', 'cross', 'normalize', 'matrixCompMult', 'lessThan',
+ 'lessThanEqual', 'greaterThan', 'greaterThanEqual', 'equal', 'notEqual', 'any',
+ 'all', 'not', 'nowhere', 'everywhere', 'transform', 'union', 'intersect',
+ 'outset', 'inset', 'bounds', 'isEmpty', 'sample', 'sampleLinear', 'sampleNearest',
+ 'outCoord', 'dod', 'pixelSize', 'pixelAspectRatio'
+ ),
+ 6 => array(
+ 'namespace', 'vendor', 'version', 'minValue', 'maxValue', 'defaultValue', 'description'
+ ),
+ 7 => array(
+ '#if', '#endif', '#ifdef', '#elif', 'defined', '#define',
+ 'AIF_ATI', 'AIF_NVIDIA', 'AIF_FLASH_TARGET'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '!', '%', '&', '|', '+', '-', '*', '/', '=', '<', '>', '?', ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0033ff;',
+ 2 => 'color: #0033ff; font-weight: bold;',
+ 3 => 'color: #0033ff;',
+ 4 => 'color: #9900cc; font-weight: bold;',
+ 5 => 'color: #333333;',
+ 6 => 'color: #666666;',
+ 7 => 'color: #990000;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #009900;',
+ 'MULTI' => 'color: #3f5fbf;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #990000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000000; font-weight:bold;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #000000;',
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array('.'),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pli.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pli.php
new file mode 100644
index 00000000..c2998514
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pli.php
@@ -0,0 +1,200 @@
+<?php
+/*************************************************************************************
+ * pli.php
+ * --------
+ * Author: Robert AH Prins (robert@prino.org)
+ * Copyright: (c) 2011 Robert AH Prins (http://hitchwiki.org/en/User:Prino)
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/02/09
+ *
+ * PL/I language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2011/02/09 (1.0.8.10)
+ * - First Release - machine(ish) generated by http://rosettacode.org/geshi/
+ *
+ * TODO (updated 2011/02/09)
+ * -------------------------
+ *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'PL/I',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', '\''),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'abnormal', 'abs', 'acos', 'acosf', 'add', 'addbuff', 'addr',
+ 'addrdata', 'alias', 'aligned', 'all', 'alloc', 'allocate',
+ 'allocation', 'allocn', 'allocsize', 'any', 'anycondition', 'area',
+ 'ascii', 'asin', 'asinf', 'asm', 'asmtdli', 'assembler',
+ 'assignable', 'atan', 'atand', 'atanf', 'atanh', 'attach',
+ 'attention', 'attn', 'auto', 'automatic', 'availablearea',
+ 'backwards', 'based', 'begin', 'bigendian', 'bin', 'binary',
+ 'binaryvalue', 'bind', 'binvalue', 'bit', 'bitloc', 'bitlocation',
+ 'bkwd', 'blksize', 'bool', 'buf', 'buffered', 'buffers', 'bufnd',
+ 'bufni', 'bufoff', 'bufsp', 'builtin', 'bx', 'by', 'byaddr', 'byte',
+ 'byvalue', 'b4', 'call', 'cast', 'cds', 'ceil', 'center',
+ 'centerleft', 'centerright', 'centre', 'centreleft', 'centreright',
+ 'char', 'character', 'charg', 'chargraphic', 'charval', 'check',
+ 'checkstg', 'close', 'cmpat', 'cobol', 'col', 'collate', 'column',
+ 'comment', 'compare', 'compiledate', 'compiletime', 'completion',
+ 'complex', 'cond', 'condition', 'conjg', 'conn', 'connected',
+ 'consecutive', 'controlled', 'conv', 'conversion', 'copy', 'cos',
+ 'cosd', 'cosf', 'cosh', 'count', 'counter', 'cpln', 'cplx', 'cs',
+ 'cstg', 'ctl', 'ctlasa', 'ctl360', 'currentsize', 'currentstorage',
+ 'data', 'datafield', 'date', 'datetime', 'days', 'daystodate',
+ 'daystosecs', 'db', 'dcl', 'dec', 'decimal', 'declare', 'def',
+ 'default', 'define', 'defined', 'delay', 'delete', 'descriptor',
+ 'descriptors', 'detach', 'dft', 'dim', 'dimacross', 'dimension',
+ 'direct', 'display', 'divide', 'do', 'downthru', 'edit', 'else',
+ 'empty', 'end', 'endfile', 'endpage', 'entry', 'entryaddr', 'env',
+ 'environment', 'epsilon', 'erf', 'erfc', 'error', 'event', 'excl',
+ 'exclusive', 'exit', 'exp', 'expf', 'exponent', 'exports', 'ext',
+ 'external', 'fb', 'fbs', 'fetch', 'file', 'fileddint', 'fileddtest',
+ 'fileddword', 'fileid', 'fileopen', 'fileread', 'fileseek',
+ 'filetell', 'filewrite', 'finish', 'first', 'fixed', 'fixedbin',
+ 'fixeddec', 'fixedoverflow', 'float', 'floatbin', 'floatdec',
+ 'floor', 'flush', 'fofl', 'format', 'fortran', 'free', 'from',
+ 'fromalien', 'fs', 'gamma', 'generic', 'genkey', 'get', 'getenv',
+ 'go', 'goto', 'graphic', 'gx', 'handle', 'hbound', 'hex', 'hexadec',
+ 'heximage', 'high', 'huge', 'iand', 'ieee', 'ieor', 'if', 'ignore',
+ 'imag', 'in', 'index', 'indexarea', 'indexed', 'init', 'initial',
+ 'inline', 'inonly', 'inot', 'inout', 'input', 'int', 'inter',
+ 'internal', 'into', 'invalidop', 'ior', 'irred', 'irreducible',
+ 'isfinite', 'isigned', 'isinf', 'isll', 'ismain', 'isnan',
+ 'isnormal', 'isrl', 'iszero', 'iunsigned', 'key', 'keyed',
+ 'keyfrom', 'keylength', 'keyloc', 'keyto', 'label', 'last',
+ 'lbound', 'leave', 'left', 'length', 'like', 'limited', 'line',
+ 'lineno', 'linesize', 'linkage', 'list', 'littleendian', 'loc',
+ 'locate', 'location', 'log', 'logf', 'loggamma', 'log10', 'log10f',
+ 'log2', 'low', 'lowercase', 'lower2', 'maccol', 'maclmar',
+ 'macname', 'macrmar', 'main', 'max', 'maxexp', 'maxlength',
+ 'memconvert', 'memcu12', 'memcu14', 'memcu21', 'memcu24', 'memcu41',
+ 'memcu42', 'memindex', 'memsearch', 'memsearchr', 'memverify',
+ 'memverifyr', 'min', 'minexp', 'mod', 'mpstr', 'multiply', 'name',
+ 'native', 'ncp', 'new', 'nocharg', 'nochargraphic', 'nocheck',
+ 'nocmpat', 'noconv', 'noconversion', 'nodescriptor', 'noexecops',
+ 'nofixedoverflow', 'nofofl', 'noinline', 'nolock', 'nomap',
+ 'nomapin', 'nomapout', 'nonasgn', 'nonassignable', 'nonconnected',
+ 'nonnative', 'noofl', 'nooverflow', 'norescan', 'normal', 'nosize',
+ 'nostrg', 'nostringrange', 'nostringsize', 'nostrz', 'nosubrg',
+ 'nosubscriptrange', 'noufl', 'nounderflow', 'nowrite', 'nozdiv',
+ 'nozerodivide', 'null', 'offset', 'offsetadd', 'offsetdiff',
+ 'offsetsubtract', 'offsetvalue', 'ofl', 'omitted', 'on', 'onarea',
+ 'onchar', 'oncode', 'oncondcond', 'oncondid', 'oncount', 'onfile',
+ 'ongsource', 'onkey', 'online', 'onloc', 'onoffset', 'onsource',
+ 'onsubcode', 'onwchar', 'onwsource', 'open', 'optional', 'options',
+ 'order', 'ordinal', 'ordinalname', 'ordinalpred', 'ordinalsucc',
+ 'other', 'otherwise', 'outonly', 'output', 'overflow', 'package',
+ 'packagename', 'page', 'pageno', 'pagesize', 'parameter', 'parmset',
+ 'password', 'pending', 'pic', 'picspec', 'picture', 'places',
+ 'pliascii', 'plicanc', 'plickpt', 'plidelete', 'plidump',
+ 'pliebcdic', 'plifill', 'plifree', 'plimove', 'pliover', 'plirest',
+ 'pliretc', 'pliretv', 'plisaxa', 'plisaxb', 'plisaxc', 'plisaxd',
+ 'plisrta', 'plisrtb', 'plisrtc', 'plisrtd', 'plitdli', 'plitran11',
+ 'plitran12', 'plitran21', 'plitran22', 'pointer', 'pointeradd',
+ 'pointerdiff', 'pointersubtract', 'pointervalue', 'poly', 'pos',
+ 'position', 'prec', 'precision', 'pred', 'present', 'print',
+ 'priority', 'proc', 'procedure', 'procedurename', 'procname',
+ 'prod', 'ptr', 'ptradd', 'ptrdiff', 'ptrsubtract', 'ptrvalue',
+ 'put', 'putenv', 'quote', 'radix', 'raise2', 'random', 'range',
+ 'rank', 'read', 'real', 'record', 'recsize', 'recursive', 'red',
+ 'reducible', 'reentrant', 'refer', 'regional', 'reg12', 'release',
+ 'rem', 'reorder', 'repattern', 'repeat', 'replaceby2', 'reply',
+ 'reread', 'rescan', 'reserved', 'reserves', 'resignal', 'respec',
+ 'retcode', 'return', 'returns', 'reuse', 'reverse', 'revert',
+ 'rewrite', 'right', 'round', 'rounddec', 'samekey', 'scalarvarying',
+ 'scale', 'search', 'searchr', 'secs', 'secstodate', 'secstodays',
+ 'select', 'seql', 'sequential', 'serialize4', 'set', 'sign',
+ 'signal', 'signed', 'sin', 'sind', 'sinf', 'sinh', 'sis', 'size',
+ 'skip', 'snap', 'sourcefile', 'sourceline', 'sqrt', 'sqrtf',
+ 'stackaddr', 'statement', 'static', 'status', 'stg', 'stmt', 'stop',
+ 'storage', 'stream', 'strg', 'string', 'stringrange', 'stringsize',
+ 'structure', 'strz', 'subrg', 'subscriptrange', 'substr',
+ 'subtract', 'succ', 'sum', 'suppress', 'sysin', 'sysnull',
+ 'sysparm', 'sysprint', 'system', 'sysversion', 'tally', 'tan',
+ 'tand', 'tanf', 'tanh', 'task', 'then', 'thread', 'threadid',
+ 'time', 'tiny', 'title', 'to', 'total', 'tpk', 'tpm', 'transient',
+ 'translate', 'transmit', 'trim', 'trkofl', 'trunc', 'type', 'ufl',
+ 'ulength', 'ulength16', 'ulength8', 'unal', 'unaligned',
+ 'unallocated', 'unbuf', 'unbuffered', 'undefinedfile', 'underflow',
+ 'undf', 'unlock', 'unsigned', 'unspec', 'until', 'update', 'upos',
+ 'uppercase', 'upthru', 'usubstr', 'usurrogate', 'uvalid', 'uwidth',
+ 'valid', 'validdate', 'value', 'var', 'varglist', 'vargsize',
+ 'variable', 'varying', 'varyingz', 'vb', 'vbs', 'verify', 'verifyr',
+ 'vs', 'vsam', 'wait', 'wchar', 'wcharval', 'weekday', 'when',
+ 'whigh', 'while', 'widechar', 'wlow', 'write', 'xmlchar', 'y4date',
+ 'y4julian', 'y4year', 'zdiv', 'zerodivide'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '+', '-', '*', '/', '=', '<', '>', '&', '^', '|', ':', '(', ')', ';', ','
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(1 => ''),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(1 => '.'),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/plsql.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/plsql.php
new file mode 100644
index 00000000..09f90a22
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/plsql.php
@@ -0,0 +1,256 @@
+<?php
+/*************************************************************************************
+ * plsql.php
+ * -------
+ * Author: Victor Engmark <victor.engmark@gmail.com>
+ * Copyright: (c) 2006 Victor Engmark (http://l0b0.net/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/10/26
+ *
+ * Oracle 9.2 PL/SQL language file for GeSHi.
+ * Formatting is based on the default setup of TOAD 8.6.
+ *
+ * CHANGES
+ * -------
+ * 2006/10/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2006/10/27)
+ * -------------------------
+ * * Add < and > to brackets
+ * * Remove symbols which are also comment delimiters / quote marks?
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'PL/SQL',
+ 'COMMENT_SINGLE' => array(1 =>'--'), //http://download-uk.oracle.com/docs/cd/B10501_01/appdev.920/a96624/02_funds.htm#2930
+ 'COMMENT_MULTI' => array('/*' => '*/'), //http://download-uk.oracle.com/docs/cd/B10501_01/appdev.920/a96624/02_funds.htm#2950
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
+ 'QUOTEMARKS' => array("'", '"'), //http://download-uk.oracle.com/docs/cd/B10501_01/appdev.920/a96624/02_funds.htm
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ //PL/SQL reserved keywords (http://download-uk.oracle.com/docs/cd/B10501_01/appdev.920/a96624/f_words.htm#LNPLS019)
+ 1 => array('ZONE', 'YEAR', 'WRITE', 'WORK', 'WITH', 'WHILE', 'WHERE',
+ 'WHENEVER', 'WHEN', 'VIEW', 'VARCHAR2', 'VARCHAR', 'VALUES',
+ 'VALIDATE', 'USE', 'UPDATE', 'UNIQUE', 'UNION', 'TYPE', 'TRUE',
+ 'TRIGGER', 'TO', 'TIMEZONE_REGION', 'TIMEZONE_MINUTE', 'TIMEZONE_HOUR',
+ 'TIMEZONE_ABBR', 'TIMESTAMP', 'TIME', 'THEN', 'TABLE', 'SYNONYM',
+ 'SUCCESSFUL', 'SUBTYPE', 'START', 'SQLERRM', 'SQLCODE', 'SQL', 'SPACE',
+ 'SMALLINT', 'SHARE', 'SET', 'SEPARATE', 'SELECT', 'SECOND',
+ 'SAVEPOINT', 'ROWTYPE', 'ROWNUM', 'ROWID', 'ROW', 'ROLLBACK',
+ 'REVERSE', 'RETURN', 'RELEASE', 'RECORD', 'REAL', 'RAW', 'RANGE',
+ 'RAISE', 'PUBLIC', 'PROCEDURE', 'PRIVATE', 'PRIOR', 'PRAGMA',
+ 'POSITIVEN', 'POSITIVE', 'PLS_INTEGER', 'PCTFREE', 'PARTITION',
+ 'PACKAGE', 'OUT', 'OTHERS', 'ORGANIZATION', 'ORDER', 'OR', 'OPTION',
+ 'OPERATOR', 'OPEN', 'OPAQUE', 'ON', 'OF', 'OCIROWID', 'NUMBER_BASE',
+ 'NUMBER', 'NULL', 'NOWAIT', 'NOT', 'NOCOPY', 'NEXTVAL', 'NEW',
+ 'NATURALN', 'NATURAL', 'MONTH', 'MODE', 'MLSLABEL', 'MINUTE', 'MINUS',
+ 'LOOP', 'LONG', 'LOCK', 'LIMITED', 'LIKE', 'LEVEL', 'JAVA',
+ 'ISOLATION', 'IS', 'INTO', 'INTERVAL', 'INTERSECT', 'INTERFACE',
+ 'INTEGER', 'INSERT', 'INDICATOR', 'INDEX', 'IN', 'IMMEDIATE', 'IF',
+ 'HOUR', 'HEAP', 'HAVING', 'GROUP', 'GOTO', 'FUNCTION', 'FROM',
+ 'FORALL', 'FOR', 'FLOAT', 'FETCH', 'FALSE', 'EXTENDS', 'EXIT',
+ 'EXISTS', 'EXECUTE', 'EXCLUSIVE', 'EXCEPTION', 'END', 'ELSIF', 'ELSE',
+ 'DROP', 'DO', 'DISTINCT', 'DESC', 'DELETE', 'DEFAULT', 'DECLARE',
+ 'DECIMAL', 'DAY', 'DATE', 'CURSOR', 'CURRVAL', 'CURRENT', 'CREATE',
+ 'CONSTANT', 'CONNECT', 'COMPRESS', 'COMMIT', 'COMMENT', 'COLLECT',
+ 'CLUSTER', 'CLOSE', 'CHECK', 'CHAR_BASE', 'CHAR', 'CASE', 'BY', 'BULK',
+ 'BOOLEAN', 'BODY', 'BINARY_INTEGER', 'BETWEEN', 'BEGIN', 'AUTHID',
+ 'AT', 'ASC', 'AS', 'ARRAY', 'ANY', 'AND', 'ALTER', 'ALL'),
+ //SQL functions (http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a96540/toc.htm & http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a96540/functions101a.htm#85925)
+ 2 => array('XMLTRANSFORM', 'XMLSEQUENCE', 'XMLFOREST', 'XMLELEMENT',
+ 'XMLCONCAT', 'XMLCOLATTVAL', 'XMLAGG', 'WIDTH_BUCKET', 'VSIZE',
+ 'VARIANCE', 'VAR_SAMP', 'VAR_POP', 'VALUE', 'USERENV', 'USER', 'UPPER',
+ 'UPDATEXML', 'UNISTR', 'UID', 'TZ_OFFSET', 'TRUNC', 'TRIM', 'TREAT',
+ 'TRANSLATE', 'TO_YMINTERVAL', 'TO_TIMESTAMP_TZ', 'TO_TIMESTAMP',
+ 'TO_SINGLE_BYTE', 'TO_NUMBER', 'TO_NCLOB', 'TO_NCHAR', 'TO_MULTI_BYTE',
+ 'TO_LOB', 'TO_DSINTERVAL', 'TO_DATE', 'TO_CLOB', 'TO_CHAR', 'TANH',
+ 'TAN', 'SYSTIMESTAMP', 'SYSDATE', 'SYS_XMLGEN', 'SYS_XMLAGG',
+ 'SYS_TYPEID', 'SYS_GUID', 'SYS_EXTRACT_UTC', 'SYS_DBURIGEN',
+ 'SYS_CONTEXT', 'SYS_CONNECT_BY_PATH', 'SUM', 'SUBSTR', 'STDDEV_SAMP',
+ 'STDDEV_POP', 'STDDEV', 'SQRT', 'SOUNDEX', 'SINH', 'SIN', 'SIGN',
+ 'SESSIONTIMEZONE', 'RTRIM', 'RPAD', 'ROWIDTONCHAR', 'ROWIDTOCHAR',
+ 'ROW_NUMBER', 'ROUND', 'REPLACE', 'REGR_SYY', 'REGR_SXY', 'REGR_SXX',
+ 'REGR_SLOPE', 'REGR_R2', 'REGR_INTERCEPT', 'REGR_COUNT', 'REGR_AVGY',
+ 'REGR_AVGX', 'REFTOHEX', 'REF', 'RAWTONHEX', 'RAWTOHEX',
+ 'RATIO_TO_REPORT', 'RANK', 'POWER', 'PERCENTILE_DISC',
+ 'PERCENTILE_CONT', 'PERCENT_RANK', 'PATH', 'NVL2', 'NVL',
+ 'NUMTOYMINTERVAL', 'NUMTODSINTERVAL', 'NULLIF', 'NTILE', 'NLSSORT',
+ 'NLS_UPPER', 'NLS_LOWER', 'NLS_INITCAP', 'NLS_CHARSET_NAME',
+ 'NLS_CHARSET_ID', 'NLS_CHARSET_DECL_LEN', 'NEXT_DAY', 'NEW_TIME',
+ 'NCHR', 'MONTHS_BETWEEN', 'MOD', 'MIN', 'MAX', 'MAKE_REF', 'LTRIM',
+ 'LPAD', 'LOWER', 'LOG', 'LOCALTIMESTAMP', 'LN', 'LENGTH', 'LEAST',
+ 'LEAD', 'LAST_VALUE', 'LAST_DAY', 'LAST', 'LAG', 'INSTR', 'INITCAP',
+ 'HEXTORAW', 'GROUPING_ID', 'GROUPING', 'GROUP_ID', 'GREATEST',
+ 'FROM_TZ', 'FLOOR', 'FIRST_VALUE', 'FIRST', 'EXTRACTVALUE', 'EXTRACT',
+ 'EXP', 'EXISTSNODE', 'EMPTY_CLOB', 'EMPTY_BLOB', 'DUMP', 'DEREF',
+ 'DEPTH', 'DENSE_RANK', 'DECOMPOSE', 'DECODE', 'DBTIMEZONE',
+ 'CURRENT_TIMESTAMP', 'CURRENT_DATE', 'CUME_DIST', 'COVAR_SAMP',
+ 'COVAR_POP', 'COUNT', 'COSH', 'COS', 'CORR', 'CONVERT', 'CONCAT',
+ 'COMPOSE', 'COALESCE', 'CHR', 'CHARTOROWID', 'CEIL', 'CAST', 'BITAND',
+ 'BIN_TO_NUM', 'BFILENAME', 'AVG', 'ATAN2', 'ATAN', 'ASIN', 'ASCIISTR',
+ 'ASCII', 'ADD_MONTHS', 'ACOS', 'ABS'),
+ //PL/SQL packages (http://download-uk.oracle.com/docs/cd/B10501_01/appdev.920/a96612/intro2.htm#1025672)
+ 3 => array('UTL_URL', 'UTL_TCP', 'UTL_SMTP', 'UTL_REF', 'UTL_RAW',
+ 'UTL_PG', 'UTL_INADDR', 'UTL_HTTP', 'UTL_FILE', 'UTL_ENCODE',
+ 'UTL_COLL', 'SDO_UTIL', 'SDO_TUNE', 'SDO_MIGRATE', 'SDO_LRS',
+ 'SDO_GEOM', 'SDO_CS', 'DMBS_XMLQUERY', 'DMBS_FLASHBACK',
+ 'DMBS_DEFER_SYS', 'DEBUG_EXTPROC', 'DBMS_XSLPROCESSOR', 'DBMS_XPLAN',
+ 'DBMS_XMLSCHEMA', 'DBMS_XMLSAVE', 'DBMS_XMLPARSER', 'DBMS_XMLGEN',
+ 'DBMS_XMLDOM', 'DBMS_XDBT', 'DBMS_XDB_VERSION', 'DBMS_XDB', 'DBMS_WM',
+ 'DBMS_UTILITY', 'DBMS_TYPES', 'DBMS_TTS', 'DBMS_TRANSFORM',
+ 'DBMS_TRANSACTION', 'DBMS_TRACE', 'DBMS_STRM_A', 'DBMS_STRM',
+ 'DBMS_STORAGE_MAP', 'DBMS_STATS', 'DBMS_SQL', 'DBMS_SPACE_ADMIN',
+ 'DBMS_SPACE', 'DBMS_SHARED_POOL', 'DBMS_SESSION', 'DBMS_RULE_ADM',
+ 'DBMS_RULE', 'DBMS_ROWID', 'DBMS_RLS', 'DBMS_RESUMABLE',
+ 'DBMS_RESOURCE_MANAGER_PRIVS', 'DBMS_RESOURCE_MANAGER', 'DBMS_REPUTIL',
+ 'DBMS_REPCAT_RGT', 'DBMS_REPCAT_INSTATIATE', 'DBMS_REPCAT_ADMIN',
+ 'DBMS_REPCAT', 'DBMS_REPAIR', 'DBMS_REFRESH', 'DBMS_REDEFINITION',
+ 'DBMS_RECTIFIER_DIFF', 'DBMS_RANDOM', 'DBMS_PROPAGATION_ADM',
+ 'DBMS_PROFILER', 'DBMS_PIPE', 'DBMS_PCLXUTIL', 'DBMS_OUTPUT',
+ 'DBMS_OUTLN_EDIT', 'DBMS_OUTLN', 'DBMS_ORACLE_TRACE_USER',
+ 'DBMS_ORACLE_TRACE_AGENT', 'DBMS_OLAP', 'DBMS_OFFLINE_SNAPSHOT',
+ 'DBMS_OFFLINE_OG', 'DBMS_ODCI', 'DBMS_OBFUSCATION_TOOLKIT',
+ 'DBMS_MVIEW', 'DBMS_MGWMSG', 'DBMS_MGWADM', 'DBMS_METADATA',
+ 'DBMS_LOGSTDBY', 'DBMS_LOGMNR_D', 'DBMS_LOGMNR_CDC_SUBSCRIBE',
+ 'DBMS_LOGMNR_CDC_PUBLISH', 'DBMS_LOGMNR', 'DBMS_LOCK', 'DBMS_LOB',
+ 'DBMS_LIBCACHE', 'DBMS_LDAP', 'DBMS_JOB', 'DBMS_IOT',
+ 'DBMS_HS_PASSTHROUGH', 'DBMS_FGA', 'DBMS_DISTRIBUTED_TRUST_ADMIN',
+ 'DBMS_DESCRIBE', 'DBMS_DEFER_QUERY', 'DBMS_DEFER', 'DBMS_DEBUG',
+ 'DBMS_DDL', 'DBMS_CAPTURE_ADM', 'DBMS_AW', 'DBMS_AQELM', 'DBMS_AQADM',
+ 'DBMS_AQ', 'DBMS_APPLY_ADM', 'DBMS_APPLICATION_INFO', 'DBMS_ALERT',
+ 'CWM2_OLAP_AW_ACCESS'),
+ //PL/SQL predefined exceptions (http://download-uk.oracle.com/docs/cd/B10501_01/appdev.920/a96624/07_errs.htm#784)
+ 4 => array('ZERO_DIVIDE', 'VALUE_ERROR', 'TOO_MANY_ROWS',
+ 'TIMEOUT_ON_RESOURCE', 'SYS_INVALID_ROWID', 'SUBSCRIPT_OUTSIDE_LIMIT',
+ 'SUBSCRIPT_BEYOND_COUNT', 'STORAGE_ERROR', 'SELF_IS_NULL',
+ 'ROWTYPE_MISMATCH', 'PROGRAM_ERROR', 'NOT_LOGGED_ON', 'NO_DATA_FOUND',
+ 'LOGIN_DENIED', 'INVALID_NUMBER', 'INVALID_CURSOR', 'DUP_VAL_ON_INDEX',
+ 'CURSOR_ALREADY_OPEN', 'COLLECTION_IS_NULL', 'CASE_NOT_FOUND',
+ 'ACCESS_INTO_NULL'),
+ //Static data dictionary views (http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a96536/ch2.htm)
+ 5 => array('USER_REPSITES', 'USER_REPSCHEMA',
+ 'USER_REPRESOLUTION_STATISTICS', 'USER_REPRESOLUTION_METHOD',
+ 'USER_REPRESOLUTION', 'USER_REPRESOL_STATS_CONTROL', 'USER_REPPROP',
+ 'USER_REPPRIORITY_GROUP', 'USER_REPPRIORITY',
+ 'USER_REPPARAMETER_COLUMN', 'USER_REPOBJECT', 'USER_REPKEY_COLUMNS',
+ 'USER_REPGROUPED_COLUMN', 'USER_REPGROUP_PRIVILEGES', 'USER_REPGROUP',
+ 'USER_REPGENOBJECTS', 'USER_REPGENERATED', 'USER_REPFLAVORS',
+ 'USER_REPFLAVOR_OBJECTS', 'USER_REPFLAVOR_COLUMNS', 'USER_REPDDL',
+ 'USER_REPCONFLICT', 'USER_REPCOLUMN_GROUP', 'USER_REPCOLUMN',
+ 'USER_REPCATLOG', 'USER_REPCAT_USER_PARM_VALUES',
+ 'USER_REPCAT_USER_AUTHORIZATIONS', 'USER_REPCAT_TEMPLATE_SITES',
+ 'USER_REPCAT_TEMPLATE_PARMS', 'USER_REPCAT_TEMPLATE_OBJECTS',
+ 'USER_REPCAT_REFRESH_TEMPLATES', 'USER_REPCAT', 'USER_REPAUDIT_COLUMN',
+ 'USER_REPAUDIT_ATTRIBUTE', 'DBA_REPSITES_NEW', 'DBA_REPSITES',
+ 'DBA_REPSCHEMA', 'DBA_REPRESOLUTION_STATISTICS',
+ 'DBA_REPRESOLUTION_METHOD', 'DBA_REPRESOLUTION',
+ 'DBA_REPRESOL_STATS_CONTROL', 'DBA_REPPROP', 'DBA_REPPRIORITY_GROUP',
+ 'DBA_REPPRIORITY', 'DBA_REPPARAMETER_COLUMN', 'DBA_REPOBJECT',
+ 'DBA_REPKEY_COLUMNS', 'DBA_REPGROUPED_COLUMN',
+ 'DBA_REPGROUP_PRIVILEGES', 'DBA_REPGROUP', 'DBA_REPGENOBJECTS',
+ 'DBA_REPGENERATED', 'DBA_REPFLAVORS', 'DBA_REPFLAVOR_OBJECTS',
+ 'DBA_REPFLAVOR_COLUMNS', 'DBA_REPEXTENSIONS', 'DBA_REPDDL',
+ 'DBA_REPCONFLICT', 'DBA_REPCOLUMN_GROUP', 'DBA_REPCOLUMN',
+ 'DBA_REPCATLOG', 'DBA_REPCAT_USER_PARM_VALUES',
+ 'DBA_REPCAT_USER_AUTHORIZATIONS', 'DBA_REPCAT_TEMPLATE_SITES',
+ 'DBA_REPCAT_TEMPLATE_PARMS', 'DBA_REPCAT_TEMPLATE_OBJECTS',
+ 'DBA_REPCAT_REFRESH_TEMPLATES', 'DBA_REPCAT_EXCEPTIONS', 'DBA_REPCAT',
+ 'DBA_REPAUDIT_COLUMN', 'DBA_REPAUDIT_ATTRIBUTE', 'ALL_REPSITES',
+ 'ALL_REPSCHEMA', 'ALL_REPRESOLUTION_STATISTICS',
+ 'ALL_REPRESOLUTION_METHOD', 'ALL_REPRESOLUTION',
+ 'ALL_REPRESOL_STATS_CONTROL', 'ALL_REPPROP', 'ALL_REPPRIORITY_GROUP',
+ 'ALL_REPPRIORITY', 'ALL_REPPARAMETER_COLUMN', 'ALL_REPOBJECT',
+ 'ALL_REPKEY_COLUMNS', 'ALL_REPGROUPED_COLUMN',
+ 'ALL_REPGROUP_PRIVILEGES', 'ALL_REPGROUP', 'ALL_REPGENOBJECTS',
+ 'ALL_REPGENERATED', 'ALL_REPFLAVORS', 'ALL_REPFLAVOR_OBJECTS',
+ 'ALL_REPFLAVOR_COLUMNS', 'ALL_REPDDL', 'ALL_REPCONFLICT',
+ 'ALL_REPCOLUMN_GROUP', 'ALL_REPCOLUMN', 'ALL_REPCATLOG',
+ 'ALL_REPCAT_USER_PARM_VALUES', 'ALL_REPCAT_USER_AUTHORIZATIONS',
+ 'ALL_REPCAT_TEMPLATE_SITES', 'ALL_REPCAT_TEMPLATE_PARMS',
+ 'ALL_REPCAT_TEMPLATE_OBJECTS', 'ALL_REPCAT_REFRESH_TEMPLATES',
+ 'ALL_REPCAT', 'ALL_REPAUDIT_COLUMN', 'ALL_REPAUDIT_ATTRIBUTE')
+ ),
+ 'SYMBOLS' => array(
+ //PL/SQL delimiters (http://download-uk.oracle.com/docs/cd/B10501_01/appdev.920/a96624/02_funds.htm#2732)
+ '+', '%', "'", '.', '/', '(', ')', ':', ',', '*', '"', '=', '<', '>', '@', ';', '-', ':=', '=>', '||', '**', '<<', '>>', '/*', '*/', '..', '<>', '!=', '~=', '^=', '<=', '>='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00F;',
+ 2 => 'color: #000;',
+ 3 => 'color: #00F;',
+ 4 => 'color: #F00;',
+ 5 => 'color: #800;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #080; font-style: italic;',
+ 'MULTI' => 'color: #080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #00F;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #F00;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #800;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #0F0;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #00F;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ 0 => 'color: #0F0;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://www.oracle.com/pls/db92/db92.drilldown?word={FNAMEU}',
+ 2 => 'http://www.oracle.com/pls/db92/db92.drilldown?word={FNAMEU}',
+ 3 => 'http://www.oracle.com/pls/db92/db92.drilldown?word={FNAMEU}',
+ 4 => 'http://www.oracle.com/pls/db92/db92.drilldown?word={FNAMEU}',
+ 5 => 'http://www.oracle.com/pls/db92/db92.drilldown?word={FNAMEU}'
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/postgresql.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/postgresql.php
new file mode 100644
index 00000000..662fdd76
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/postgresql.php
@@ -0,0 +1,288 @@
+<?php
+/*************************************************************************************
+ * postgresql.php
+ * -----------
+ * Author: Christophe Chauvet (christophe_at_kryskool_dot_org)
+ * Contributors: Leif Biberg Kristensen <leif_at_solumslekt_dot_org> 2010-05-03
+ * Copyright: (c) 2007 Christophe Chauvet (http://kryskool.org/), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/07/20
+ *
+ * PostgreSQL language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2007/07/20 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2007/07/20)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'PostgreSQL',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"', '`'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ //Put PostgreSQL reserved keywords here. I like mine uppercase.
+ 1 => array(
+ 'ABORT','ABSOLUTE','ACCESS','ACTION','ADD','ADMIN','AFTER',
+ 'AGGREGATE','ALL','ALSO','ALTER','ALWAYS','ANALYSE','ANALYZE','AND',
+ 'ANY','AS','ASC,','ASSERTION','ASSIGNMENT','ASYMMETRIC','AT',
+ 'AUTHORIZATION','BACKWARD','BEFORE','BEGIN','BETWEEN','BOTH','BY',
+ 'CACHE','CALLED','CASCADE','CASCADED','CASE','CAST','CATALOG',
+ 'CHAIN','CHARACTERISTICS','CHECK','CHECKPOINT','CLASS','CLOSE',
+ 'CLUSTER','COALESCE','COLLATE','COLUMN','COMMENT','COMMIT',
+ 'COMMITTED','CONCURRENTLY','CONFIGURATION','CONNECTION',
+ 'CONSTRAINT','CONSTRAINTS','CONTENT','CONTINUE','CONVERSION','COPY',
+ 'COST','CREATE','CREATEDB','CREATEROLE','CREATEUSER','CROSS','CSV',
+ 'CURRENT','CURRENT_CATALOG','CURRENT_DATE','CURRENT_ROLE',
+ 'CURRENT_SCHEMA','CURRENT_TIME','CURRENT_TIMESTAMP','CURRENT_USER',
+ 'CURSOR','CYCLE','DATA','DATABASE','DAY','DEALLOCATE','DEC',
+ 'DECLARE','DEFAULT','DEFAULTS','DEFERRABLE','DEFERRED','DEFINER',
+ 'DELETE','DELIMITER','DELIMITERS','DESC','DICTIONARY','DISABLE',
+ 'DISCARD','DISTINCT','DO','DOCUMENT','DOMAIN','DOUBLE','DROP',
+ 'EACH','ELSE','ENABLE','ENCODING','ENCRYPTED','END','ESCAPE',
+ 'EXCEPT','EXCLUDING','EXCLUSIVE','EXECUTE','EXISTS','EXPLAIN',
+ 'EXTERNAL','EXTRACT','FALSE','FAMILY','FETCH','FIRST','FOLLOWING',
+ 'FOR','FORCE','FOREIGN','FORWARD','FREEZE','FROM','FULL','FUNCTION',
+ 'GLOBAL','GRANT','GRANTED','GREATEST','GROUP','HANDLER','HAVING',
+ 'HEADER','HOLD','HOUR','IDENTITY','IF','ILIKE','IMMEDIATE',
+ 'IMMUTABLE','IMPLICIT','IN','INCLUDING','INCREMENT','INDEX',
+ 'INDEXES','INHERIT','INHERITS','INITIALLY','INNER','INOUT','INPUT',
+ 'INSENSITIVE','INSERT','INSTEAD','INTERSECT','INTO','INVOKER','IS',
+ 'ISNULL','ISOLATION','JOIN','KEY','LANCOMPILER','LANGUAGE','LARGE',
+ 'LAST','LC_COLLATE','LC_CTYPE','LEADING','LEAST','LEFT','LEVEL',
+ 'LIKE','LIMIT','LISTEN','LOAD','LOCAL','LOCALTIME','LOCALTIMESTAMP',
+ 'LOCATION','LOCK','LOGIN','LOOP','MAPPING','MATCH','MAXVALUE',
+ 'MINUTE','MINVALUE','MODE','MONTH','MOVE','NAME','NAMES','NATIONAL',
+ 'NATURAL','NEW','NEXT','NO','NOCREATEDB','NOCREATEROLE',
+ 'NOCREATEUSER','NOINHERIT','NOLOGIN','NONE','NOSUPERUSER','NOT',
+ 'NOTHING','NOTIFY','NOTNULL','NOWAIT','NULL','NULLIF','NULLS',
+ 'NUMERIC','OBJECT','OF','OFF','OFFSET','OIDS','OLD','ON','ONLY',
+ 'OPERATOR','OPTION','OPTIONS','OR','ORDER','OUT','OUTER','OVER',
+ 'OVERLAPS','OVERLAY','OWNED','OWNER','PARSER','PARTIAL','PARTITION',
+ 'PASSWORD','PLACING','PLANS','POSITION','PRECEDING','PRECISION',
+ 'PREPARE','PREPARED','PRESERVE','PRIMARY','PRIOR','PRIVILEGES',
+ 'PROCEDURAL','PROCEDURE','QUOTE','RANGE','READ','REASSIGN',
+ 'RECHECK','RECURSIVE','REFERENCES','REINDEX','RELATIVE','RELEASE',
+ 'RENAME','REPEATABLE','REPLACE','REPLICA','RESET','RESTART',
+ 'RESTRICT','RETURN','RETURNING','RETURNS','REVOKE','RIGHT','ROLE',
+ 'ROLLBACK','ROW','ROWS','RULE','SAVEPOINT','SCHEMA','SCROLL',
+ 'SEARCH','SECOND',
+ 'SECURITY','SELECT','SEQUENCE','SERIALIZABLE','SERVER','SESSION',
+ 'SESSION_USER','SET','SETOF','SHARE','SHOW','SIMILAR','SIMPLE',
+ 'SOME','STABLE','STANDALONE','START','STATEMENT','STATISTICS',
+ 'STDIN','STDOUT','STORAGE','STRICT','STRIP','SUPERUSER',
+ 'SYMMETRIC','SYSID','SYSTEM','TABLE','TABLESPACE','TEMP','TEMPLATE',
+ 'TEMPORARY','THEN','TO','TRAILING','TRANSACTION','TREAT','TRIGGER',
+ 'TRUE','TRUNCATE','TRUSTED','TYPE','UNBOUNDED','UNCOMMITTED',
+ 'UNENCRYPTED','UNION','UNIQUE','UNKNOWN','UNLISTEN','UNTIL',
+ 'UPDATE','USER','USING','VACUUM','VALID','VALIDATOR','VALUE',
+ 'VALUES','VARIADIC','VERBOSE','VERSION','VIEW','VOLATILE','WHEN',
+ 'WHERE','WHILE','WHITESPACE','WINDOW','WITH','WITHOUT','WORK','WRAPPER',
+ 'WRITE','XMLATTRIBUTES','XMLCONCAT','XMLELEMENT','XMLFOREST',
+ 'XMLPARSE','XMLPI','XMLROOT','XMLSERIALIZE','YEAR','YES','ZONE'
+ ),
+
+ //Put functions here
+ 3 => array(
+ // mathematical functions
+ 'ABS','CBRT','CEIL','CEILING','DEGREES','DIV','EXP','FLOOR','LN',
+ 'LOG','MOD','PI','POWER','RADIANS','RANDOM','ROUND','SETSEED',
+ 'SIGN','SQRT','TRUNC','WIDTH_BUCKET',
+ // trigonometric functions
+ 'ACOS','ASIN','ATAN','ATAN2','COS','COT','SIN','TAN',
+ // string functions
+ 'BIT_LENGTH','CHAR_LENGTH','CHARACTER_LENGTH','LOWER',
+ 'OCTET_LENGTH','POSITION','SUBSTRING','TRIM','UPPER',
+ // other string functions
+ 'ASCII','BTRIM','CHR','CONVERT','CONVERT_FROM','CONVERT_TO',
+ 'DECODE','ENCODE','INITCAP','LENGTH','LPAD','LTRIM','MD5',
+ 'PG_CLIENT_ENCODING','QUOTE_IDENT','QUOTE_LITERAL','QUOTE_NULLABLE',
+ 'REGEXP_MATCHES','REGEXP_REPLACE','REGEXP_SPLIT_TO_ARRAY',
+ 'REGEXP_SPLIT_TO_TABLE','REPEAT','RPAD','RTRIM','SPLIT_PART',
+ 'STRPOS','SUBSTR','TO_ASCII','TO_HEX','TRANSLATE',
+ // binary string functions
+ 'GET_BIT','GET_BYTE','SET_BIT','SET_BYTE',
+ // data type formatting functions
+ 'TO_CHAR','TO_DATE','TO_NUMBER','TO_TIMESTAMP',
+ // date/time functions
+ 'AGE','CLOCK_TIMESTAMP','DATE_PART','DATE_TRUNC','EXTRACT',
+ 'ISFINITE','JUSTIFY_DAYS','JUSTIFY_HOURS','JUSTIFY_INTERVAL','NOW',
+ 'STATEMENT_TIMESTAMP','TIMEOFDAY','TRANSACTION_TIMESTAMP',
+ // enum support functions
+ 'ENUM_FIRST','ENUM_LAST','ENUM_RANGE',
+ // geometric functions
+ 'AREA','CENTER','DIAMETER','HEIGHT','ISCLOSED','ISOPEN','NPOINTS',
+ 'PCLOSE','POPEN','RADIUS','WIDTH',
+ 'BOX','CIRCLE','LSEG','PATH','POINT','POLYGON',
+ // cidr and inet functions
+ 'ABBREV','BROADCAST','FAMILY','HOST','HOSTMASK','MASKLEN','NETMASK',
+ 'NETWORK','SET_MASKLEN',
+ // text search functions
+ 'TO_TSVECTOR','SETWEIGHT','STRIP','TO_TSQUERY','PLAINTO_TSQUERY',
+ 'NUMNODE','QUERYTREE','TS_RANK','TS_RANK_CD','TS_HEADLINE',
+ 'TS_REWRITE','GET_CURRENT_TS_CONFIG','TSVECTOR_UPDATE_TRIGGER',
+ 'TSVECTOR_UPDATE_TRIGGER_COLUMN',
+ 'TS_DEBUG','TS_LEXISE','TS_PARSE','TS_TOKEN_TYPE','TS_STAT',
+ // XML functions
+ 'XMLCOMMENT','XMLCONCAT','XMLELEMENT','XMLFOREST','XMLPI','XMLROOT',
+ 'XMLAGG','XPATH','TABLE_TO_XMLSCHEMA','QUERY_TO_XMLSCHEMA',
+ 'CURSOR_TO_XMLSCHEMA','TABLE_TO_XML_AND_XMLSCHEMA',
+ 'QUERY_TO_XML_AND_XMLSCHEMA','SCHEMA_TO_XML','SCHEMA_TO_XMLSCHEMA',
+ 'SCHEMA_TO_XML_AND_XMLSCHEMA','DATABASE_TO_XML',
+ 'DATABASE_TO_XMLSCHEMA','DATABASE_TO_XML_AND_XMLSCHEMA',
+ // sequence manipulating functions
+ 'CURRVAL','LASTVAL','NEXTVAL','SETVAL',
+ // conditional expressions
+ 'COALESCE','NULLIF','GREATEST','LEAST',
+ // array functions
+ 'ARRAY_APPEND','ARRAY_CAT','ARRAY_NDIMS','ARRAY_DIMS','ARRAY_FILL',
+ 'ARRAY_LENGTH','ARRAY_LOWER','ARRAY_PREPEND','ARRAY_TO_STRING',
+ 'ARRAY_UPPER','STRING_TO_ARRAY','UNNEST',
+ // aggregate functions
+ 'ARRAY_AGG','AVG','BIT_AND','BIT_OR','BOOL_AND','BOOL_OR','COUNT',
+ 'EVERY','MAX','MIN','STRING_AGG','SUM',
+ // statistic aggregate functions
+ 'CORR','COVAR_POP','COVAR_SAMP','REGR_AVGX','REGR_AVGY',
+ 'REGR_COUNT','REGR_INTERCEPT','REGR_R2','REGR_SLOPE','REGR_SXX',
+ 'REGR_SXY','REGR_SYY','STDDEV','STDDEV_POP','STDDEV_SAMP',
+ 'VARIANCE','VAR_POP','VAR_SAMP',
+ // window functions
+ 'ROW_NUMBER','RANK','DENSE_RANK','PERCENT_RANK','CUME_DIST','NTILE',
+ 'LAG','LEAD','FIRST_VALUE','LAST_VALUE','NTH_VALUE',
+ // set returning functions
+ 'GENERATE_SERIES','GENERATE_SUBSCRIPTS'
+ // system information functions not currently included
+ ),
+
+ //Put your postgresql var
+ 4 => array(
+ 'client_encoding',
+ 'standard_conforming_strings'
+ ),
+
+ //Put your data types here
+ 5 => array(
+ 'ARRAY','ABSTIME','BIGINT','BIGSERIAL','BINARY','BIT','BIT VARYING',
+ 'BOOLEAN','BOX','BYTEA','CHAR','CHARACTER','CHARACTER VARYING',
+ 'CIDR','CIRCLE','DATE','DECIMAL','DOUBLE PRECISION','ENUM','FLOAT',
+ 'INET','INT','INTEGER','INTERVAL','NCHAR','REAL','SMALLINT','TEXT',
+ 'TIME','TIMESTAMP','VARCHAR','XML',
+ ),
+
+ // //Put your package names here
+ // 6 => array(
+ // ),
+
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '=', '<', '>', '|'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ // regular keywords
+ 1 => 'color: #000000; font-weight: bold; text-transform: uppercase;',
+ // inbuilt functions
+ 3 => 'color: #333399; font-weight: bold; text-transform: uppercase;',
+ // postgresql var(?)
+ 4 => 'color: #993333; font-weight: bold; text-transform: uppercase;',
+ // data types
+ 5 => 'color: #993333; font-weight: bold; text-transform: uppercase;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #ff0000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 3 => '',
+ 4 => 'http://paste.postgresql.fr/wiki/desc.php?def={FNAME}',
+ 5 => '',
+ ),
+
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'DISALLOWED_AFTER' => '(?![\(\w])'
+ ),
+
+ 3 => array(
+ 'DISALLOWED_AFTER' => '(?=\()'
+ ),
+
+ 4 => array(
+ 'DISALLOWED_AFTER' => '(?![\(\w])'
+ ),
+
+ 5 => array(
+ 'DISALLOWED_AFTER' => '(?![\(\w])'
+ ),
+ )
+ )
+
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/povray.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/povray.php
new file mode 100644
index 00000000..c0ce35ca
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/povray.php
@@ -0,0 +1,199 @@
+<?php
+/*************************************************************************************
+ * povray.php
+ * --------
+ * Author: Carl Fürstenberg (azatoth@gmail.com)
+ * Copyright: © 2007 Carl Fürstenberg
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/07/11
+ *
+ * Povray language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/07/11 (1.0.8)
+ * - initial import to GeSHi SVN
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'POVRAY',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'yes', 'wrinkles', 'wood', 'width', 'waves', 'water_level', 'warp', 'vturbulence',
+ 'vstr', 'vrotate', 'vnormalize', 'vlength', 'vcross', 'vaxis_rotate', 'variance', 'v_steps',
+ 'uv_mapping', 'utf8', 'use_index', 'use_colour', 'use_color', 'use_alpha', 'up', 'undef',
+ 'ultra_wide_angle', 'u_steps', 'type', 'turbulence', 'turb_depth', 'ttf', 'true', 'triangle_wave',
+ 'translate', 'transform', 'trace', 'toroidal', 'tolerance', 'tiles', 'tile2', 'tightness',
+ 'tiff', 'threshold', 'thickness', 'tga', 'texture_map', 'target', 'sys', 'sum',
+ 'substr', 'sturm', 'strupr', 'strlwr', 'strength', 'str', 'statistics', 'sqr',
+ 'spotted', 'spotlight', 'split_union', 'spline', 'spiral2', 'spiral1', 'spherical', 'specular',
+ 'spacing', 'solid', 'smooth', 'slope', 'slice', 'sky', 'size', 'sine_wave',
+ 'shadowless', 'scattering', 'scallop_wave', 'scale', 'save_file', 'samples', 'roughness', 'rotate',
+ 'ripples', 'right', 'rgbt', 'rgbft', 'rgbf', 'rgb', 'repeat', 'render',
+ 'refraction', 'reflection_exponent', 'recursion_limit', 'reciprocal', 'ratio', 'ramp_wave', 'radius', 'radial',
+ 'quilted', 'quick_colour', 'quick_color', 'quaternion', 'quadratic_spline', 'pwr', 'projected_through', 'prod',
+ 'pretrace_start', 'pretrace_end', 'precompute', 'precision', 'ppm', 'pow', 'pot', 'poly_wave',
+ 'point_at', 'png', 'planar', 'pigment_pattern', 'pi', 'phong_size', 'phong', 'phase',
+ 'pgm', 'perspective', 'pattern', 'pass_through', 'parallel', 'panoramic', 'orthographic', 'orientation',
+ 'orient', 'open', 'onion', 'once', 'on', 'omnimax', 'omega', 'offset',
+ 'off', 'octaves', 'number_of_waves', 'noise_generator', 'no_shadow', 'no_reflection', 'no_image', 'no_bump_scale',
+ 'no', 'nearest_count', 'natural_spline', 'mortar', 'minimum_reuse', 'min_extent', 'metric', 'method',
+ 'metallic', 'media_interaction', 'media_attenuation', 'media', 'max_trace_level', 'max_trace', 'max_sample', 'max_iteration',
+ 'max_intersections', 'max_gradient', 'max_extent', 'matrix', 'material_map', 'marble', 'map_type', 'mandel',
+ 'major_radius', 'magnet', 'low_error_factor', 'look_at', 'location', 'load_file', 'linear_sweep', 'linear_spline',
+ 'leopard', 'lambda', 'julia', 'jpeg', 'jitter', 'irid_wavelength', 'ior', 'inverse',
+ 'intervals', 'interpolate', 'internal', 'inside_vector', 'inside', 'initial_frame', 'initial_clock', 'image_width',
+ 'image_pattern', 'image_height', 'iff', 'hypercomplex', 'hollow', 'hierarchy', 'hf_gray_16', 'hexagon',
+ 'gray_threshold', 'granite', 'gradient', 'global_lights', 'gif', 'gather', 'fresnel', 'frequency',
+ 'frame_number', 'form', 'fog_type', 'fog_offset', 'fog_alt', 'focal_point', 'flip', 'flatness',
+ 'fisheye', 'final_frame', 'final_clock', 'false', 'falloff_angle', 'falloff', 'fade_power', 'fade_distance',
+ 'fade_colour', 'fade_color', 'facets', 'extinction', 'exterior', 'exponent', 'expand_thresholds', 'evaluate',
+ 'error_bound', 'emission', 'eccentricity', 'double_illuminate', 'distance', 'dist_exp', 'dispersion_samples', 'dispersion',
+ 'direction', 'diffuse', 'df3', 'dents', 'density_map', 'density_file', 'density', 'cylindrical',
+ 'cutaway_textures', 'cubic_wave', 'cubic_spline', 'cube', 'crand', 'crackle', 'count', 'coords',
+ 'control1', 'control0', 'conserve_energy', 'conic_sweep', 'confidence', 'concat', 'composite', 'component',
+ 'colour_map', 'colour', 'color', 'collect', 'clock_on', 'clock_delta', 'clock', 'circular',
+ 'chr', 'checker', 'charset', 'cells', 'caustics', 'bumps', 'bump_size', 'brilliance',
+ 'brightness', 'brick_size', 'brick', 'bozo', 'boxed', 'blur_samples', 'black_hole', 'bezier_spline',
+ 'b_spline', 'average', 'autostop', 'assumed_gamma', 'ascii', 'array', 'area_light', 'arc_angle',
+ 'append', 'aperture', 'angle', 'ambient_light', 'ambient', 'always_sample', 'altitude', 'alpha',
+ 'all_intersections', 'all', 'agate_turb', 'agate', 'adc_bailout', 'adaptive', 'accuracy', 'absorption',
+ 'aa_threshold', 'aa_level', 'reflection'
+ ),
+ 2 => array(
+ 'abs', 'acos', 'acosh', 'asc', 'asin', 'asinh', 'atan', 'atanh',
+ 'atan2', 'ceil', 'cos', 'cosh', 'defined', 'degrees', 'dimensions', 'dimension_size',
+ 'div', 'exp', 'file_exists', 'floor', 'int', 'ln', 'log', 'max',
+ 'min', 'mod', 'pov', 'radians', 'rand', 'seed', 'select', 'sin',
+ 'sinh', 'sqrt', 'strcmp', 'strlen', 'tan', 'tanh', 'val', 'vdot',
+ 'vlenght',
+ ),
+ 3 => array (
+ 'x', 'y', 'z', 't', 'u', 'v', 'red', 'blue',
+ 'green', 'filter', 'transmit', 'gray', 'e',
+ ),
+ 4 => array (
+ 'camera', 'background', 'fog', 'sky_sphere', 'rainbow', 'global_settings', 'radiosity', 'photon',
+ 'object', 'blob', 'sphere', 'cylinder', 'box', 'cone', 'height_field', 'julia_fractal',
+ 'lathe', 'prism', 'sphere_sweep', 'superellipsoid', 'sor', 'text', 'torus', 'bicubic_patch',
+ 'disc', 'mesh', 'triangle', 'smooth_triangle', 'mesh2', 'vertex_vectors', 'normal_vectors', 'uv_vectors',
+ 'texture_list', 'face_indices', 'normal_indices', 'uv_indices', 'texture', 'polygon', 'plane', 'poly',
+ 'cubic', 'quartic', 'quadric', 'isosurface', 'function', 'contained_by', 'parametric', 'pigment',
+ 'union', 'intersection', 'difference', 'merge', 'light_source', 'looks_like', 'light_group', 'clipped_by',
+ 'bounded_by', 'interior', 'material', 'interior_texture', 'normal', 'finish', 'color_map', 'pigment_map',
+ 'image_map', 'bump_map', 'slope_map', 'normal_map', 'irid', 'photons',
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '!',
+ '@', '%', '&', '*', '|', '/', '<',
+ '>', '+', '-', '.', '=', '<=', '>=',
+ '!=',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #a63123;',
+ 2 => 'color: #2312bc;',
+ 3 => 'color: #cc1122; font-weight: bold;',
+ 4 => 'color: #116688; font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+// 2 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66aa;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #6666cc; font-weight: bold;',
+ 1 => 'color: #66cc66; font-weight: bold;',
+ 2 => 'color: #66cc66; font-weight: bold;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ # normal hash lines
+ 0 => '\#(?!(include|declare|local|fopen|fclose|read|write|default|version|if|else|end|ifdef|ifndef|switch|case|range|break|while|debug|error|warning|macro) )[[:word:]]*',
+ # syntax functions hash thingis
+ 1 => "\#(include|declare|local|fopen|fclose|read|write|default|version|if|else|end|ifdef|ifndef|switch|case|range|break|while|debug|error|warning|macro)",
+ 2 => array(
+ GESHI_SEARCH => "([a-zA-Z]+)(\n)(.*)(\n)(\\1;?)",
+ GESHI_REPLACE => '\3',
+ GESHI_BEFORE => '\1\2',
+ GESHI_AFTER => '\4\5',
+ GESHI_MODIFIERS => 'siU'
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ ),
+ 'TAB_WIDTH' => 4
+);
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/powerbuilder.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/powerbuilder.php
new file mode 100644
index 00000000..d3fcf615
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/powerbuilder.php
@@ -0,0 +1,418 @@
+<?php
+/*************************************************************************************
+ * powerbuilder.php
+ * ------
+ * Author: Doug Porter (powerbuilder.geshi@gmail.com)
+ * Copyright: (c) 2009 Doug Porter
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/07/13
+ *
+ * PowerBuilder (PowerScript) language file for GeSHi.
+ *
+ * Based on the TextPad Syntax file for PowerBuilder
+ * built by Rafi Avital
+ *
+ * CHANGES
+ * -------
+ * 2009/07/13 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2009/07/13)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'PowerBuilder',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '~',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'alias', 'and', 'autoinstantiate', 'call',
+ 'case', 'catch', 'choose', 'close', 'commit', 'connect',
+ 'constant', 'continue', 'create', 'cursor', 'declare',
+ 'delete', 'describe', 'descriptor', 'destroy', 'disconnect',
+ 'do', 'dynamic', 'else', 'elseif', 'end', 'enumerated',
+ 'event', 'execute', 'exit', 'external', 'false', 'fetch',
+ 'first', 'for', 'forward', 'from', 'function', 'global',
+ 'goto', 'halt', 'if', 'immediate', 'indirect', 'insert',
+ 'into', 'intrinsic', 'is', 'last', 'library', 'loop', 'next',
+ 'not', 'of', 'on', 'open', 'or', 'parent', 'post', 'prepare',
+ 'prior', 'private', 'privateread', 'privatewrite', 'procedure',
+ 'protected', 'protectedread', 'protectedwrite', 'prototypes',
+ 'public', 'readonly', 'ref', 'return', 'rollback', 'rpcfunc',
+ 'select', 'selectblob', 'shared', 'static', 'step', 'subroutine',
+ 'super', 'system', 'systemread', 'systemwrite', 'then', 'this',
+ 'to', 'trigger', 'true', 'try', 'type', 'until', 'update', 'updateblob',
+ 'using', 'variables', 'where', 'while', 'with', 'within'
+ ),
+ 2 => array (
+ 'blob', 'boolean', 'char', 'character', 'date', 'datetime',
+ 'dec', 'decimal',
+ 'double', 'int', 'integer', 'long', 'real', 'string', 'time',
+ 'uint', 'ulong', 'unsignedint', 'unsignedinteger', 'unsignedlong'
+ ),
+ 3 => array (
+ 'abortretryignore!', 'actbegin!', 'acterror!', 'actesql!',
+ 'actgarbagecollect!', 'activate!', 'activatemanually!',
+ 'activateondoubleclick!',
+ 'activateongetfocus!', 'actline!', 'actobjectcreate!', 'actobjectdestroy!',
+ 'actprofile!', 'actroutine!', 'acttrace!', 'actual!',
+ 'actuser!', 'adoresultset!', 'adtdate!', 'adtdatetime!',
+ 'adtdefault!', 'adtdouble!', 'adttext!', 'adttime!',
+ 'aix!', 'alignatbottom!', 'alignatleft!', 'alignatright!',
+ 'alignattop!', 'all!', 'allowpartialchanges!', 'alpha!',
+ 'ansi!', 'any!', 'anycase!', 'anyfont!',
+ 'append!', 'application!', 'arabiccharset!', 'area3d!',
+ 'areagraph!', 'arraybounds!', 'arrow!', 'ascending!',
+ 'asstatement!', 'atbottom!', 'atleft!', 'atright!',
+ 'attop!', 'autosize!', 'background!', 'balticcharset!',
+ 'bar3dgraph!', 'bar3dobjgraph!', 'bargraph!', 'barstack3dobjgraph!',
+ 'barstackgraph!', 'bdiagonal!', 'beam!', 'begin!',
+ 'begindrag!', 'beginlabeledit!', 'beginrightdrag!', 'behind!',
+ 'blob!', 'bold!', 'boolean!', 'bottom!',
+ 'boundedarray!', 'box!', 'byreferenceargument!', 'byvalueargument!',
+ 'cancel!', 'cascade!', 'cascaded!', 'category!',
+ 'center!', 'character!', 'charsetansi!', 'charsetansiarabic!',
+ 'charsetansihebrew!', 'charsetdbcsjapanese!', 'charsetunicode!', 'checkbox!',
+ 'child!', 'childtreeitem!', 'chinesebig5!', 'classdefinition!',
+ 'classdefinitionobject!', 'classorstructuretype!', 'clicked!', 'clip!',
+ 'clipboard!', 'clipformatbitmap!', 'clipformatdib!', 'clipformatdif!',
+ 'clipformatenhmetafile!', 'clipformathdrop!', 'clipformatlocale!',
+ 'clipformatmetafilepict!',
+ 'clipformatoemtext!', 'clipformatpalette!', 'clipformatpendata!', 'clipformatriff!',
+ 'clipformatsylk!', 'clipformattext!', 'clipformattiff!', 'clipformatunicodetext!',
+ 'clipformatwave!', 'clock!', 'close!', 'closequery!',
+ 'col3dgraph!', 'col3dobjgraph!', 'colgraph!',
+ 'colstack3dobjgraph!', 'colstackgraph!', 'columnclick!', 'commandbutton!',
+ 'connection!', 'connectioninfo!', 'connectobject!', 'connectprivilege!',
+ 'connectwithadminprivilege!', 'constructor!', 'containsany!', 'containsembeddedonly!',
+ 'containslinkedonly!', 'contextinformation!', 'contextkeyword!', 'continuous!',
+ 'corbaobject!', 'corbaunion!', 'cplusplus!', 'cross!',
+ 'csv!', 'cumulative!', 'cumulativepercent!', 'currenttreeitem!',
+ 'customvisual!', 'dash!', 'dashdot!', 'dashdotdot!',
+ 'data!', 'datachange!', 'datamodified!', 'datastore!',
+ 'datawindow!', 'datawindowchild!', 'date!', 'datemask!',
+ 'datetime!', 'datetimemask!', 'dbase2!', 'dbase3!',
+ 'dberror!', 'deactivate!', 'decimal!', 'decimalmask!',
+ 'decorative!', 'default!', 'defaultcharset!', 'delete!',
+ 'deleteallitems!', 'deleteitem!', 'descending!', 'desktop!',
+ 'destructor!', 'detail!', 'diamond!', 'dif!',
+ 'dirall!', 'dirapplication!', 'dirdatawindow!', 'directionall!',
+ 'directiondown!', 'directionleft!', 'directionright!', 'directionup!',
+ 'dirfunction!', 'dirmenu!', 'dirpipeline!', 'dirproject!',
+ 'dirquery!', 'dirstructure!', 'diruserobject!', 'dirwindow!',
+ 'displayasactivexdocument!', 'displayascontent!', 'displayasicon!', 'dot!',
+ 'double!', 'doubleclicked!', 'dragdrop!', 'dragenter!',
+ 'dragleave!', 'dragobject!', 'dragwithin!', 'drawobject!',
+ 'dropdownlistbox!', 'dropdownpicturelistbox!', 'drophighlighttreeitem!', 'dwobject!',
+ 'dynamicdescriptionarea!', 'dynamicstagingarea!', 'easteuropecharset!', 'editchanged!',
+ 'editmask!', 'editmenu!', 'end!', 'endlabeledit!',
+ 'enterprise!', 'enterpriseonlyfeature!', 'enumeratedtype!', 'enumerationdefinition!',
+ 'enumerationitemdefinition!', 'environment!', 'error!', 'errorlogging!',
+ 'eventnotexisterror!', 'eventwrongprototypeerror!', 'excel!', 'excel5!',
+ 'exceptionfail!', 'exceptionignore!', 'exceptionretry!',
+ 'exceptionsubstitutereturnvalue!',
+ 'exclamation!', 'exclude!', 'exportapplication!', 'exportdatawindow!',
+ 'exportfunction!', 'exportmenu!', 'exportpipeline!', 'exportproject!',
+ 'exportquery!', 'exportstructure!', 'exportuserobject!', 'exportwindow!',
+ 'externalvisual!', 'extobject!', 'failonanyconflict!', 'fdiagonal!',
+ 'featurenotsupportederror!', 'filealreadyopenerror!', 'filecloseerror!',
+ 'fileexists!',
+ 'fileinvalidformaterror!', 'filemenu!', 'filenotopenerror!', 'filenotseterror!',
+ 'filereaderror!', 'filetyperichtext!', 'filetypetext!', 'filewriteerror!',
+ 'filter!', 'first!', 'firstvisibletreeitem!', 'fixed!',
+ 'floating!', 'focusrect!', 'footer!', 'foreground!',
+ 'frombeginning!', 'fromcurrent!', 'fromend!', 'functionobject!',
+ 'gb231charset!', 'getfocus!', 'graph!', 'graphicobject!',
+ 'graxis!', 'grdispattr!', 'greekcharset!', 'groupbox!',
+ 'hand!', 'hangeul!', 'header!', 'hebrewcharset!',
+ 'helpmenu!', 'hide!', 'horizontal!', 'hotlinkalarm!',
+ 'hourglass!', 'hppa!', 'hprogressbar!', 'hpux!',
+ 'hscrollbar!', 'hticksonboth!', 'hticksonbottom!', 'hticksonneither!',
+ 'hticksontop!', 'htmltable!', 'htrackbar!', 'i286!',
+ 'i386!', 'i486!', 'icon!', 'icons!',
+ 'idle!', 'importdatawindow!', 'indent!', 'index!',
+ 'inet!', 'information!', 'inplace!', 'inputfieldselected!',
+ 'insertitem!', 'inside!', 'integer!', 'internetresult!',
+ 'italic!', 'itemchanged!', 'itemchanging!', 'itemcollapsed!',
+ 'itemcollapsing!', 'itemerror!', 'itemexpanded!', 'itemexpanding!',
+ 'itemfocuschanged!', 'itempopulate!', 'jaguarorb!', 'johabcharset!',
+ 'justify!', 'key!', 'key0!', 'key1!',
+ 'key2!', 'key3!', 'key4!', 'key5!',
+ 'key6!', 'key7!', 'key8!', 'key9!',
+ 'keya!', 'keyadd!', 'keyalt!', 'keyapps!',
+ 'keyb!', 'keyback!', 'keybackquote!', 'keybackslash!',
+ 'keyc!', 'keycapslock!', 'keycomma!', 'keycontrol!',
+ 'keyd!', 'keydash!', 'keydecimal!', 'keydelete!',
+ 'keydivide!', 'keydownarrow!', 'keye!', 'keyend!',
+ 'keyenter!', 'keyequal!', 'keyescape!', 'keyf!',
+ 'keyf1!', 'keyf10!', 'keyf11!', 'keyf12!',
+ 'keyf2!', 'keyf3!', 'keyf4!', 'keyf5!',
+ 'keyf6!', 'keyf7!', 'keyf8!', 'keyf9!',
+ 'keyg!', 'keyh!', 'keyhome!', 'keyi!',
+ 'keyinsert!', 'keyj!', 'keyk!', 'keyl!',
+ 'keyleftarrow!', 'keyleftbracket!', 'keyleftbutton!', 'keyleftwindows!',
+ 'keym!', 'keymiddlebutton!', 'keymultiply!', 'keyn!',
+ 'keynull!', 'keynumlock!', 'keynumpad0!', 'keynumpad1!',
+ 'keynumpad2!', 'keynumpad3!', 'keynumpad4!', 'keynumpad5!',
+ 'keynumpad6!', 'keynumpad7!', 'keynumpad8!', 'keynumpad9!',
+ 'keyo!', 'keyp!', 'keypagedown!', 'keypageup!',
+ 'keypause!', 'keyperiod!', 'keyprintscreen!', 'keyq!',
+ 'keyquote!', 'keyr!', 'keyrightarrow!', 'keyrightbracket!',
+ 'keyrightbutton!', 'keyrightwindows!', 'keys!', 'keyscrolllock!',
+ 'keysemicolon!', 'keyshift!', 'keyslash!', 'keyspacebar!',
+ 'keysubtract!', 'keyt!', 'keytab!', 'keyu!',
+ 'keyuparrow!', 'keyv!', 'keyw!', 'keyword!',
+ 'keyx!', 'keyy!', 'keyz!', 'languageafrikaans!',
+ 'languagealbanian!', 'languagearabicalgeria!', 'languagearabicbahrain!',
+ 'languagearabicegypt!',
+ 'languagearabiciraq!', 'languagearabicjordan!', 'languagearabickuwait!',
+ 'languagearabiclebanon!',
+ 'languagearabiclibya!', 'languagearabicmorocco!', 'languagearabicoman!',
+ 'languagearabicqatar!',
+ 'languagearabicsaudiarabia!', 'languagearabicsyria!', 'languagearabictunisia!',
+ 'languagearabicuae!',
+ 'languagearabicyemen!', 'languagebasque!', 'languagebulgarian!', 'languagebyelorussian!',
+ 'languagecatalan!', 'languagechinese!', 'languagechinesehongkong!', 'languagechinesesimplified!',
+ 'languagechinesesingapore!', 'languagechinesetraditional!', 'languagecroatian!', 'languageczech!',
+ 'languagedanish!', 'languagedutch!', 'languagedutchbelgian!', 'languagedutchneutral!',
+ 'languageenglish!', 'languageenglishaustralian!', 'languageenglishcanadian!',
+ 'languageenglishirish!',
+ 'languageenglishnewzealand!', 'languageenglishsouthafrica!', 'languageenglishuk!',
+ 'languageenglishus!',
+ 'languageestonian!', 'languagefaeroese!', 'languagefarsi!', 'languagefinnish!',
+ 'languagefrench!', 'languagefrenchbelgian!', 'languagefrenchcanadian!', 'languagefrenchluxembourg!',
+ 'languagefrenchneutral!', 'languagefrenchswiss!', 'languagegerman!', 'languagegermanaustrian!',
+ 'languagegermanliechtenstein!', 'languagegermanluxembourg!', 'languagegermanneutral!',
+ 'languagegermanswiss!',
+ 'languagegreek!', 'languagehebrew!', 'languagehindi!', 'languagehungarian!',
+ 'languageicelandic!', 'languageindonesian!', 'languageitalian!', 'languageitalianneutral!',
+ 'languageitalianswiss!', 'languagejapanese!', 'languagekorean!', 'languagekoreanjohab!',
+ 'languagelatvian!', 'languagelithuanian!', 'languagemacedonian!', 'languagemaltese!',
+ 'languageneutral!', 'languagenorwegian!', 'languagenorwegianbokmal!', 'languagenorwegiannynorsk!',
+ 'languagepolish!', 'languageportuguese!', 'languageportuguese_brazilian!',
+ 'languageportugueseneutral!',
+ 'languagerhaetoromanic!', 'languageromanian!', 'languageromanianmoldavia!', 'languagerussian!',
+ 'languagerussianmoldavia!', 'languagesami!', 'languageserbian!', 'languageslovak!',
+ 'languageslovenian!', 'languagesorbian!', 'languagesortnative!', 'languagesortunicode!',
+ 'languagespanish!', 'languagespanishcastilian!', 'languagespanishmexican!', 'languagespanishmodern!',
+ 'languagesutu!', 'languageswedish!', 'languagesystemdefault!', 'languagethai!',
+ 'languagetsonga!', 'languagetswana!', 'languageturkish!', 'languageukrainian!',
+ 'languageurdu!', 'languageuserdefault!', 'languagevenda!', 'languagexhosa!',
+ 'languagezulu!', 'last!', 'layer!', 'layered!',
+ 'Left!', 'leftmargin!', 'line!', 'line3d!',
+ 'linear!', 'linecolor!', 'linedown!', 'linegraph!',
+ 'lineleft!', 'linemode!', 'lineright!', 'lineup!',
+ 'linkupdateautomatic!', 'linkupdatemanual!', 'listbox!', 'listview!',
+ 'listviewitem!', 'listviewlargeicon!', 'listviewlist!', 'listviewreport!',
+ 'listviewsmallicon!', 'lockread!', 'lockreadwrite!', 'lockwrite!',
+ 'log10!', 'loge!', 'long!', 'losefocus!',
+ 'lower!', 'lowered!', 'm68000!', 'm68020!',
+ 'm68030!', 'm68040!', 'maccharset!', 'macintosh!',
+ 'mailattach!', 'mailbcc!', 'mailbodyasfile!', 'mailcc!',
+ 'maildownload!', 'mailentiremessage!', 'mailenvelopeonly!', 'mailfiledescription!',
+ 'mailmessage!', 'mailnewsession!', 'mailnewsessionwithdownload!', 'mailole!',
+ 'mailolestatic!', 'mailoriginator!', 'mailrecipient!', 'mailreturnaccessdenied!',
+ 'mailreturnattachmentnotfound!', 'mailreturnattachmentopenfailure!',
+ 'mailreturnattachmentwritefailure!', 'mailreturndiskfull!',
+ 'mailreturnfailure!', 'mailreturninsufficientmemory!', 'mailreturninvalidmessage!',
+ 'mailreturnloginfailure!',
+ 'mailreturnmessageinuse!', 'mailreturnnomessages!', 'mailreturnsuccess!', 'mailreturntexttoolarge!',
+ 'mailreturntoomanyfiles!', 'mailreturntoomanyrecipients!', 'mailreturntoomanysessions!',
+ 'mailreturnunknownrecipient!',
+ 'mailreturnuserabort!', 'mailsession!', 'mailsuppressattachments!', 'mailto!',
+ 'main!', 'maximized!', 'mdi!', 'mdiclient!',
+ 'mdihelp!', 'menu!', 'menucascade!', 'menuitemtypeabout!',
+ 'menuitemtypeexit!', 'menuitemtypehelp!', 'menuitemtypenormal!', 'merge!',
+ 'message!', 'minimized!', 'mips!', 'modelexistserror!',
+ 'modelnotexistserror!', 'modern!', 'modified!', 'mousedown!',
+ 'mousemove!', 'mouseup!', 'moved!', 'multiline!',
+ 'multilineedit!', 'mutexcreateerror!', 'new!', 'newmodified!',
+ 'next!', 'nexttreeitem!', 'nextvisibletreeitem!', 'noborder!',
+ 'noconnectprivilege!', 'nolegend!', 'none!', 'nonvisualobject!',
+ 'normal!', 'nosymbol!', 'notic!', 'notmodified!',
+ 'notopmost!', 'notype!', 'numericmask!', 'objhandle!',
+ 'oem!', 'off!', 'offsite!', 'ok!',
+ 'okcancel!', 'olecontrol!', 'olecustomcontrol!', 'oleobject!',
+ 'olestorage!', 'olestream!', 'oletxnobject!', 'omcontrol!',
+ 'omcustomcontrol!', 'omembeddedcontrol!', 'omobject!', 'omstorage!',
+ 'omstream!', 'open!', 'orb!', 'original!',
+ 'osf1!', 'other!', 'outside!', 'oval!',
+ 'pagedown!', 'pageleft!', 'pageright!', 'pageup!',
+ 'parenttreeitem!', 'pbtocppobject!', 'pentium!', 'percentage!',
+ 'picture!', 'picturebutton!', 'picturehyperlink!', 'picturelistbox!',
+ 'pictureselected!', 'pie3d!', 'piegraph!', 'pipeend!',
+ 'pipeline!', 'pipemeter!', 'pipestart!', 'popup!',
+ 'powerobject!', 'powerpc!', 'powerrs!', 'ppc601!',
+ 'ppc603!', 'ppc604!', 'previewdelete!', 'previewfunctionreselectrow!',
+ 'previewfunctionretrieve!', 'previewfunctionupdate!', 'previewinsert!', 'previewselect!',
+ 'previewupdate!', 'previoustreeitem!', 'previousvisibletreeitem!', 'primary!',
+ 'printend!', 'printfooter!', 'printheader!', 'printpage!',
+ 'printstart!', 'prior!', 'private!', 'process!',
+ 'profilecall!', 'profileclass!', 'profileline!', 'profileroutine!',
+ 'profiling!', 'protected!', 'psreport!', 'public!',
+ 'question!', 'radiobutton!', 'raised!', 'rbuttondown!',
+ 'rbuttonup!', 'read!', 'readonlyargument!', 'real!',
+ 'rectangle!', 'regbinary!', 'regexpandstring!', 'reglink!',
+ 'regmultistring!', 'regstring!', 'regulong!', 'regulongbigendian!',
+ 'remoteexec!', 'remotehotlinkstart!', 'remotehotlinkstop!', 'remoteobject!',
+ 'remoterequest!', 'remotesend!', 'rename!', 'replace!',
+ 'resize!', 'resizeborder!', 'response!', 'resultset!',
+ 'resultsets!', 'retrieveend!', 'retrieverow!', 'retrievestart!',
+ 'retrycancel!', 'richtextedit!', 'Right!', 'rightclicked!',
+ 'rightdoubleclicked!', 'rightmargin!', 'rnddays!', 'rnddefault!',
+ 'rndhours!', 'rndmicroseconds!', 'rndminutes!', 'rndmonths!',
+ 'rndnumber!', 'rndseconds!', 'rndyears!', 'roman!',
+ 'roottreeitem!', 'roundrectangle!', 'routineesql!', 'routineevent!',
+ 'routinefunction!', 'routinegarbagecollection!', 'routineobjectcreation!',
+ 'routineobjectdestruction!',
+ 'routineroot!', 'rowfocuschanged!', 'russiancharset!', 'save!',
+ 'scalartype!', 'scattergraph!', 'script!', 'scriptdefinition!',
+ 'scriptevent!', 'scriptfunction!', 'scrollhorizontal!', 'scrollvertical!',
+ 'selected!', 'selectionchanged!', 'selectionchanging!', 'series!',
+ 'service!', 'shade!', 'shadowbox!', 'shared!',
+ 'sharedobjectcreateinstanceerror!', 'sharedobjectcreatepbsessionerror!',
+ 'sharedobjectexistserror!', 'sharedobjectnotexistserror!',
+ 'shiftjis!', 'show!', 'simpletype!', 'simpletypedefinition!',
+ 'singlelineedit!', 'size!', 'sizenesw!', 'sizens!',
+ 'sizenwse!', 'sizewe!', 'sol2!', 'solid!',
+ 'sort!', 'sourcepblerror!', 'spacing1!', 'spacing15!',
+ 'spacing2!', 'sparc!', 'sqlinsert!', 'sqlpreview!',
+ 'square!', 'sslcallback!', 'sslserviceprovider!', 'statichyperlink!',
+ 'statictext!', 'stgdenynone!', 'stgdenyread!', 'stgdenywrite!',
+ 'stgexclusive!', 'stgread!', 'stgreadwrite!', 'stgwrite!',
+ 'stopsign!', 'straddle!', 'streammode!', 'stretch!',
+ 'strikeout!', 'string!', 'stringmask!', 'structure!',
+ 'stylebox!', 'stylelowered!', 'styleraised!', 'styleshadowbox!',
+ 'subscript!', 'success!', 'superscript!', 'swiss!',
+ 'sylk!', 'symbol!', 'symbolhollowbox!', 'symbolhollowcircle!',
+ 'symbolhollowdiamond!', 'symbolhollowdownarrow!', 'symbolhollowuparrow!', 'symbolplus!',
+ 'symbolsolidbox!', 'symbolsolidcircle!', 'symbolsoliddiamond!', 'symbolsoliddownarrow!',
+ 'symbolsoliduparrow!', 'symbolstar!', 'symbolx!', 'system!',
+ 'systemerror!', 'systemfunctions!', 'systemkey!', 'tab!',
+ 'tabsonbottom!', 'tabsonbottomandtop!', 'tabsonleft!', 'tabsonleftandright!',
+ 'tabsonright!', 'tabsonrightandleft!', 'tabsontop!', 'tabsontopandbottom!',
+ 'text!', 'thaicharset!', 'thread!', 'tile!',
+ 'tilehorizontal!', 'time!', 'timemask!', 'timer!',
+ 'timernone!', 'timing!', 'tobottom!', 'toolbarmoved!',
+ 'top!', 'topic!', 'topmost!', 'totop!',
+ 'traceactivitynode!', 'traceatomic!', 'tracebeginend!', 'traceerror!',
+ 'traceesql!', 'tracefile!', 'tracegarbagecollect!', 'tracegeneralerror!',
+ 'tracein!', 'traceline!', 'tracenomorenodes!', 'tracenotstartederror!',
+ 'traceobject!', 'traceout!', 'traceroutine!', 'tracestartederror!',
+ 'tracetree!', 'tracetreeerror!', 'tracetreeesql!', 'tracetreegarbagecollect!',
+ 'tracetreeline!', 'tracetreenode!', 'tracetreeobject!', 'tracetreeroutine!',
+ 'tracetreeuser!', 'traceuser!', 'transaction!', 'transactionserver!',
+ 'transparent!', 'transport!', 'treeview!', 'treeviewitem!',
+ 'turkishcharset!', 'typeboolean!', 'typecategory!', 'typecategoryaxis!',
+ 'typecategorylabel!', 'typedata!', 'typedate!', 'typedatetime!',
+ 'typedecimal!', 'typedefinition!', 'typedouble!', 'typegraph!',
+ 'typeinteger!', 'typelegend!', 'typelong!', 'typereal!',
+ 'typeseries!', 'typeseriesaxis!', 'typeserieslabel!', 'typestring!',
+ 'typetime!', 'typetitle!', 'typeuint!', 'typeulong!',
+ 'typeunknown!', 'typevalueaxis!', 'typevaluelabel!', 'ultrasparc!',
+ 'unboundedarray!', 'underline!', 'underlined!', 'unsignedinteger!',
+ 'unsignedlong!', 'unsorted!', 'uparrow!', 'updateend!',
+ 'updatestart!', 'upper!', 'userdefinedsort!', 'userobject!',
+ 'variable!', 'variableargument!', 'variablecardinalitydefinition!', 'variabledefinition!',
+ 'variableglobal!', 'variableinstance!', 'variablelocal!', 'variableshared!',
+ 'varlistargument!', 'vbxvisual!', 'vcenter!', 'vertical!',
+ 'vietnamesecharset!', 'viewchange!', 'vprogressbar!', 'vscrollbar!',
+ 'vticksonboth!', 'vticksonleft!', 'vticksonneither!', 'vticksonright!',
+ 'vtrackbar!', 'window!', 'windowmenu!', 'windowobject!',
+ 'windows!', 'windowsnt!', 'wk1!', 'wks!',
+ 'wmf!', 'write!', 'xpixelstounits!', 'xunitstopixels!',
+ 'xvalue!', 'yesno!', 'yesnocancel!', 'ypixelstounits!',
+ 'yunitstopixels!',
+ 'yvalue!',
+ 'zoom!'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '[', ']', '{', '}'),
+ 1 => array('|'),
+ 2 => array('+', '-', '*', '/'),
+ 3 => array('=', '&lt;', '>', '^')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #008000; font-weight: bold;',
+ 2 => 'color: #990099; font-weight: bold;',
+ 3 => 'color: #330099; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #0000ff; font-weight: bold;',
+ 'MULTI' => 'color: #0000ff; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #800000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #330099; font-weight: bold;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;',
+ 1 => 'color: #ffff00; background-color:#993300; font-weight: bold',
+ 2 => 'color: #000000;',
+ 3 => 'color: #000000;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #800000; font-weight: bold;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/powershell.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/powershell.php
new file mode 100644
index 00000000..bd78d739
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/powershell.php
@@ -0,0 +1,277 @@
+<?php
+/*************************************************************************************
+ * powershell.php
+ * ---------------------------------
+ * Author: Frode Aarebrot (frode@aarebrot.net)
+ * Copyright: (c) 2008 Frode Aarebrot (http://www.aarebrot.net)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/06/20
+ *
+ * PowerShell language file for GeSHi.
+ *
+ * I've tried to make this language file as true to the highlighting in PowerGUI as
+ * possible. Unfortunately it's not 100% complete, although it is pretty close.
+ *
+ * I've included some classes and their members, but there's tons and tons of these.
+ * I suggest you add the ones you need yourself. I've included a few Sharepoint ones
+ * in this language file.
+ *
+ * CHANGES
+ * -------
+ * 2008/06/20 (1.0.8)
+ * - First Release
+ *
+ * TODO (updated 2008/06/20)
+ * -------------------------
+ * - Color text between Cmdlets/Aliases and pipe/end-of-line
+ * - Try and get -- and ++ to work in the KEYWORDS array with the other operators
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'PowerShell',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array('<#' => '#>'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '`',
+ 'KEYWORDS' => array(
+ 1 => array(
+ // Cmdlets
+ 'Add-Content', 'Add-History', 'Add-Member', 'Add-PSSnapin', 'Clear-Content', 'Clear-Item',
+ 'Clear-ItemProperty', 'Clear-Variable', 'Compare-Object', 'ConvertFrom-SecureString',
+ 'Convert-Path', 'ConvertTo-Html', 'ConvertTo-SecureString', 'Copy-Item', 'Copy-ItemProperty',
+ 'Export-Alias', 'Export-Clixml', 'Export-Console', 'Export-Csv', 'ForEach-Object',
+ 'Format-Custom', 'Format-List', 'Format-Table', 'Format-Wide', 'Get-Acl', 'Get-Alias',
+ 'Get-AuthenticodeSignature', 'Get-ChildItem', 'Get-Command', 'Get-Content', 'Get-Credential',
+ 'Get-Culture', 'Get-Date', 'Get-EventLog', 'Get-ExecutionPolicy', 'Get-Help', 'Get-History',
+ 'Get-Host', 'Get-Item', 'Get-ItemProperty', 'Get-Location', 'Get-Member',
+ 'Get-PfxCertificate', 'Get-Process', 'Get-PSDrive', 'Get-PSProvider', 'Get-PSSnapin',
+ 'Get-Service', 'Get-TraceSource', 'Get-UICulture', 'Get-Unique', 'Get-Variable',
+ 'Get-WmiObject', 'Group-Object', 'Import-Alias', 'Import-Clixml', 'Import-Csv',
+ 'Invoke-Expression', 'Invoke-History', 'Invoke-Item', 'Join-Path', 'Measure-Command',
+ 'Measure-Object', 'Move-Item', 'Move-ItemProperty', 'New-Alias', 'New-Item',
+ 'New-ItemProperty', 'New-Object', 'New-PSDrive', 'New-Service', 'New-TimeSpan',
+ 'New-Variable', 'Out-Default', 'Out-File', 'Out-Host', 'Out-Null', 'Out-Printer',
+ 'Out-String', 'Pop-Location', 'Push-Location', 'Read-Host', 'Remove-Item',
+ 'Remove-ItemProperty', 'Remove-PSDrive', 'Remove-PSSnapin', 'Remove-Variable', 'Rename-Item',
+ 'Rename-ItemProperty', 'Resolve-Path', 'Restart-Service', 'Resume-Service', 'Select-Object',
+ 'Select-String', 'Set-Acl', 'Set-Alias', 'Set-AuthenticodeSignature', 'Set-Content',
+ 'Set-Date', 'Set-ExecutionPolicy', 'Set-Item', 'Set-ItemProperty', 'Set-Location',
+ 'Set-PSDebug', 'Set-Service', 'Set-TraceSource', 'Set-Variable', 'Sort-Object', 'Split-Path',
+ 'Start-Service', 'Start-Sleep', 'Start-Transcript', 'Stop-Process', 'Stop-Service',
+ 'Stop-Transcript', 'Suspend-Service', 'Tee-Object', 'Test-Path', 'Trace-Command',
+ 'Update-FormatData', 'Update-TypeData', 'Where-Object', 'Write-Debug', 'Write-Error',
+ 'Write-Host', 'Write-Output', 'Write-Progress', 'Write-Verbose', 'Write-Warning'
+ ),
+ 2 => array(
+ // Aliases
+ 'ac', 'asnp', 'clc', 'cli', 'clp', 'clv', 'cpi', 'cpp', 'cvpa', 'diff', 'epal', 'epcsv', 'fc',
+ 'fl', 'ft', 'fw', 'gal', 'gc', 'gci', 'gcm', 'gdr', 'ghy', 'gi', 'gl', 'gm',
+ 'gp', 'gps', 'group', 'gsv', 'gsnp', 'gu', 'gv', 'gwmi', 'iex', 'ihy', 'ii', 'ipal', 'ipcsv',
+ 'mi', 'mp', 'nal', 'ndr', 'ni', 'nv', 'oh', 'rdr', 'ri', 'rni', 'rnp', 'rp', 'rsnp', 'rv',
+ 'rvpa', 'sal', 'sasv', 'sc', 'select', 'si', 'sl', 'sleep', 'sort', 'sp', 'spps', 'spsv', 'sv',
+ 'tee', 'write', 'cat', 'cd', 'clear', 'cp', 'h', 'history', 'kill', 'lp', 'ls',
+ 'mount', 'mv', 'popd', 'ps', 'pushd', 'pwd', 'r', 'rm', 'rmdir', 'echo', 'cls', 'chdir',
+ 'copy', 'del', 'dir', 'erase', 'move', 'rd', 'ren', 'set', 'type'
+ ),
+ 3 => array(
+ // Reserved words
+ 'break', 'continue', 'do', 'for', 'foreach', 'while', 'if', 'switch', 'until', 'where',
+ 'function', 'filter', 'else', 'elseif', 'in', 'return', 'param', 'throw', 'trap'
+ ),
+ 4 => array(
+ // Operators
+ '-eq', '-ne', '-gt', '-ge', '-lt', '-le', '-ieq', '-ine', '-igt', '-ige', '-ilt', '-ile',
+ '-ceq', '-cne', '-cgt', '-cge', '-clt', '-cle', '-like', '-notlike', '-match', '-notmatch',
+ '-ilike', '-inotlike', '-imatch', '-inotmatch', '-clike', '-cnotlike', '-cmatch', '-cnotmatch',
+ '-contains', '-notcontains', '-icontains', '-inotcontains', '-ccontains', '-cnotcontains',
+ '-isnot', '-is', '-as', '-replace', '-ireplace', '-creplace', '-and', '-or', '-band', '-bor',
+ '-not', '-bnot', '-f', '-casesensitive', '-exact', '-file', '-regex', '-wildcard'
+ ),
+ 5 => array(
+ // Options
+ '-Year', '-Wrap', '-Word', '-Width', '-WhatIf', '-Wait', '-View', '-Verbose', '-Verb',
+ '-Variable', '-ValueOnly', '-Value', '-Unique', '-UFormat', '-TypeName', '-Trace', '-TotalCount',
+ '-Title', '-TimestampServer', '-TargetObject', '-Syntax', '-SyncWindow', '-Sum', '-String',
+ '-Strict', '-Stream', '-Step', '-Status', '-Static', '-StartupType', '-Start', '-StackName',
+ '-Stack', '-SourceId', '-SimpleMatch', '-ShowError', '-Separator', '-SecureString', '-SecureKey',
+ '-SecondValue', '-SecondsRemaining', '-Seconds', '-Second', '-Scope', '-Root', '-Role',
+ '-Resolve', '-RemoveListener', '-RemoveFileListener', '-Registered', '-ReferenceObject',
+ '-Recurse', '-RecommendedAction', '-ReadCount', '-Quiet', '-Query', '-Qualifier', '-PSSnapin',
+ '-PSProvider', '-PSHost', '-PSDrive', '-PropertyType', '-Property', '-Prompt', '-Process',
+ '-PrependPath', '-PercentComplete', '-Pattern', '-PathType', '-Path', '-PassThru', '-ParentId',
+ '-Parent', '-Parameter', '-Paging', '-OutVariable', '-OutBuffer', '-Option', '-OnType', '-Off',
+ '-Object', '-Noun', '-NoTypeInformation', '-NoQualifier', '-NoNewline', '-NoElement',
+ '-NoClobber', '-NewName', '-Newest', '-Namespace', '-Name', '-Month', '-Minutes', '-Minute',
+ '-Minimum', '-Milliseconds', '-Message', '-MemberType', '-Maximum', '-LogName', '-LiteralPath',
+ '-LiteralName', '-ListenerOption', '-List', '-Line', '-Leaf', '-Last', '-Key', '-ItemType',
+ '-IsValid', '-IsAbsolute', '-InputObject', '-IncludeEqual', '-IncludeChain', '-Include',
+ '-IgnoreWhiteSpace', '-Id', '-Hours', '-Hour', '-HideTableHeaders', '-Head', '-GroupBy',
+ '-Functionality', '-Full', '-Format', '-ForegroundColor', '-Force', '-First', '-FilterScript',
+ '-Filter', '-FilePath', '-Expression', '-ExpandProperty', '-Expand', '-ExecutionPolicy',
+ '-ExcludeProperty', '-ExcludeDifferent', '-Exclude', '-Exception', '-Examples', '-ErrorVariable',
+ '-ErrorRecord', '-ErrorId', '-ErrorAction', '-End', '-Encoding', '-DisplayName', '-DisplayHint',
+ '-DisplayError', '-DifferenceObject', '-Detailed', '-Destination', '-Description', '-Descending',
+ '-Depth', '-DependsOn', '-Delimiter', '-Debugger', '-Debug', '-Days', '-Day', '-Date',
+ '-CurrentOperation', '-Culture', '-Credential', '-Count', '-Container', '-Confirm',
+ '-ComputerName', '-Component', '-Completed', '-ComObject', '-CommandType', '-Command',
+ '-Column', '-Class', '-ChildPath', '-Character', '-Certificate', '-CategoryTargetType',
+ '-CategoryTargetName', '-CategoryReason', '-CategoryActivity', '-Category', '-CaseSensitive',
+ '-Body', '-BinaryPathName', '-Begin', '-BackgroundColor', '-Average', '-AutoSize', '-Audit',
+ '-AsString', '-AsSecureString', '-AsPlainText', '-As', '-ArgumentList', '-AppendPath', '-Append',
+ '-Adjust', '-Activity', '-AclObject'
+ ),
+ 6 => array(
+ '_','args','DebugPreference','Error','ErrorActionPreference',
+ 'foreach','Home','Host','Input','LASTEXITCODE','MaximumAliasCount',
+ 'MaximumDriveCount','MaximumFunctionCount','MaximumHistoryCount',
+ 'MaximumVariableCount','OFS','PsHome',
+ 'ReportErrorShowExceptionClass','ReportErrorShowInnerException',
+ 'ReportErrorShowSource','ReportErrorShowStackTrace',
+ 'ShouldProcessPreference','ShouldProcessReturnPreference',
+ 'StackTrace','VerbosePreference','WarningPreference','PWD'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '=', '<', '>', '@', '|', '&', ',', '?',
+ '+=', '-=', '*=', '/=', '%=', '*', '/', '%', '!', '+', '-', '++', '--'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #008080; font-weight: bold;',
+ 2 => 'color: #008080; font-weight: bold;',
+ 3 => 'color: #0000FF;',
+ 4 => 'color: #FF0000;',
+ 5 => 'color: #008080; font-style: italic;',
+ 6 => 'color: #000080;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000;',
+ 'MULTI' => 'color: #008000;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #008080; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #800000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #804000;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: pink;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: pink;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #800080;',
+ 3 => 'color: #008080;',
+ 4 => 'color: #008080;',
+ 5 => 'color: #800000;',
+ 6 => 'color: #000080;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => 'about:blank',
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ // special after pipe
+ 3 => array(
+ GESHI_SEARCH => '(\[)(int|long|string|char|bool|byte|double|decimal|float|single|regex|array|xml|scriptblock|switch|hashtable|type|ref|psobject|wmi|wmisearcher|wmiclass|object)((\[.*\])?\])',
+ GESHI_REPLACE => '\2',
+ GESHI_MODIFIERS => 'si',
+ GESHI_BEFORE => '\1',
+ GESHI_AFTER => '\3'
+ ),
+ // Classes
+ 4 => array(
+ GESHI_SEARCH => '(\[)(System\.Reflection\.Assembly|System\.Net\.CredentialCache|Microsoft\.SharePoint\.SPFileLevel|Microsoft\.SharePoint\.Publishing\.PublishingWeb|Microsoft\.SharePoint\.Publishing|Microsoft\.SharePoint\.SPWeb)(\])',
+ GESHI_REPLACE => '\2',
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '\1',
+ GESHI_AFTER => '\3'
+ ),
+ // Members
+ // There's about a hundred million of these, add the ones you need as you need them
+ 5 => array (
+ GESHI_SEARCH => '(::)(ReflectionOnlyLoadFrom|ReflectionOnlyLoad|ReferenceEquals|LoadWithPartialName|LoadFrom|LoadFile|Load|GetExecutingAssembly|GetEntryAssembly|GetCallingAssembly|GetAssembly|Equals|DefaultNetworkCredentials|DefaultCredentials|CreateQualifiedName|Checkout|Draft|Published|IsPublishingWeb)',
+ GESHI_REPLACE => '\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\1',
+ GESHI_AFTER => ''
+ ),
+ // Special variables
+ 6 => array(
+ GESHI_SEARCH => '(\$)(\$[_\^]?|\?)(?!\w)',
+ GESHI_REPLACE => '\1\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ // variables
+ //BenBE: Please note that changes here and in Keyword group 6 have to be synchronized in order to work properly.
+ //This Regexp must only match, if keyword group 6 doesn't. If this assumption fails
+ //Highlighting of the keywords will be incomplete or incorrect!
+ 0 => "(?<!\\\$|>)[\\\$](\w+)(?=[^|\w])",
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 4 => array(
+ 'DISALLOWED_AFTER' => '(?![a-zA-Z])',
+ 'DISALLOWED_BEFORE' => ''
+ ),
+ 6 => array(
+ 'DISALLOWED_BEFORE' => '(?<!\$>)\$'
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/proftpd.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/proftpd.php
new file mode 100644
index 00000000..330db4b2
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/proftpd.php
@@ -0,0 +1,374 @@
+<?php
+/*************************************************************************************
+ * proftpd.php
+ * ----------
+ * Author: Benny Baumann (BenBE@geshi.org)
+ * Copyright: (c) 2010 Benny Baumann (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/01/25
+ *
+ * ProFTPd language file for GeSHi.
+ * Words are scraped from their documentation
+ *
+ * CHANGES
+ * -------
+ * 2004/08/05 (1.0.8.10)
+ * - First Release
+ *
+ * TODO (updated 2011/01/25)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ProFTPd configuration',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ /*keywords*/
+ 1 => array(
+ //mod_auth
+ 'AccessDenyMsg', 'AccessGrantMsg', 'AnonRejectePasswords',
+ 'AnonRequirePassword', 'AuthAliasOnly', 'AuthUsingAlias',
+ 'CreateHome', 'DefaultChdir', 'DefaultRoot', 'GroupPassword',
+ 'LoginPasswordPrompt', 'MaxClients', 'MaxClientsPerClass',
+ 'MaxClientsPerHost', 'MaxClientsPerUser', 'MaxConnectionsPerHost',
+ 'MaxHostsPerUser', 'MaxLoginAttempts', 'RequireValidShell',
+ 'RootLogin', 'RootRevoke', 'TimeoutLogin', 'TimeoutSession',
+ 'UseFtpUsers', 'UserAlias', 'UserDirRoot', 'UserPassword',
+
+ //mod_auth_file
+ 'AuthGroupFile', 'AuthUserFile',
+
+ //mod_auth_pam
+ 'AuthPAM', 'AuthPAMConfig',
+
+ //mod_auth_unix
+ 'PersistentPasswd',
+
+ //mod_ban
+ 'BanControlsACLs', 'BanEngine', 'BanLog', 'BanMessage', 'BanOnEvent',
+ 'BanTable',
+
+ //mod_cap
+ 'CapabilitiesEngine', 'CapabilitiesSet',
+
+ //mod_core
+ 'Allow', 'AllowAll', 'AllowClass', 'AllowFilter',
+ 'AllowForeignAddress', 'AllowGroup', 'AllowOverride',
+ 'AllowRetrieveRestart', 'AllowStoreRestart', 'AllowUser',
+ 'AnonymousGroup', 'AuthOrder', 'Bind', 'CDPath', 'Class', 'Classes',
+ 'CommandBufferSize', 'DebugLevel', 'DefaultAddress',
+ 'DefaultServer', 'DefaultTransferMode', 'DeferWelcome', 'Define',
+ 'Deny', 'DenyAll', 'DenyClass', 'DenyFilter', 'DenyGroup',
+ 'DenyUser', 'DisplayChdir', 'DisplayConnect', 'DisplayFirstChdir',
+ 'DisplayGoAway', 'DisplayLogin', 'DisplayQuit', 'From', 'Group',
+ 'GroupOwner', 'HideFiles', 'HideGroup', 'HideNoAccess', 'HideUser',
+ 'IdentLookups', 'IgnoreHidden', 'Include', 'MasqueradeAddress',
+ 'MaxConnectionRate', 'MaxInstances', 'MultilineRFC2228', 'Order',
+ 'PassivePorts', 'PathAllowFilter', 'PathDenyFilter', 'PidFile',
+ 'Port', 'RLimitCPU', 'RLimitMemory', 'RLimitOpenFiles', 'Satisfy',
+ 'ScoreboardFile', 'ServerAdmin', 'ServerIdent', 'ServerName',
+ 'ServerType', 'SetEnv', 'SocketBindTight', 'SocketOptions',
+ 'SyslogFacility', 'SyslogLevel', 'tcpBackLog', 'tcpNoDelay',
+ 'TimeoutIdle', 'TimeoutLinger', 'TimesGMT', 'TransferLog', 'Umask',
+ 'UnsetEnv', 'UseIPv6', 'User', 'UseReverseDNS', 'UserOwner',
+ 'UseUTF8', 'WtmpLog',
+
+ //mod_ctrls_admin
+ 'AdminControlsACLs', 'AdminControlsEngine',
+
+ //mod_delay
+ 'DelayEngine', 'DelayTable',
+
+ //mod_dynmasq
+ 'DynMasqRefresh',
+
+ //mod_exec
+ 'ExecBeforeCommand', 'ExecEngine', 'ExecEnviron', 'ExecLog',
+ 'ExecOnCommand', 'ExecOnConnect', 'ExecOnError', 'ExecOnEvent',
+ 'ExecOnExit', 'ExecOnRestart', 'ExecOptions', 'ExecTimeout',
+
+ //mod_ldap
+ 'LDAPAliasDereference', 'LDAPAttr', 'LDAPAuthBinds',
+ 'LDAPDefaultAuthScheme', 'LDAPDefaultGID', 'LDAPDefaultUID',
+ 'LDAPDNInfo', 'LDAPDoAuth', 'LDAPDoGIDLookups',
+ 'LDAPDoQuotaLookups', 'LDAPDoUIDLookups',
+ 'LDAPForceGeneratedHomedir', 'LDAPForceHomedirOnDemand',
+ 'LDAPGenerateHomedir', 'LDAPGenerateHomedirPrefix',
+ 'LDAPGenerateHomedirPrefixNoUsername', 'LDAPHomedirOnDemand',
+ 'LDAPHomedirOnDemandPrefix', 'LDAPHomedirOnDemandPrefixNoUsername',
+ 'LDAPHomedirOnDemandSuffix', 'LDAPNegativeCache',
+ 'LDAPProtocolVersion', 'LDAPQueryTimeout', 'LDAPSearchScope',
+ 'LDAPServer',
+
+ //mod_load
+ 'MaxLoad',
+
+ //mod_log
+ 'AllowLogSymlinks', 'ExtendedLog', 'LogFormat', 'ServerLog',
+ 'SystemLog',
+
+ //mod_ls'
+ 'DirFakeGroup', 'DirFakeMode', 'DirFakeUser', 'ListOptions',
+ 'ShowSymlinks', 'UseGlobbing',
+
+ //mod_quotatab
+ 'QuotaDirectoryTally', 'QuotaDisplayUnits', 'QuotaEngine',
+ 'QuotaExcludeFilter', 'QuotaLimitTable', 'QuotaLock', 'QuotaLog',
+ 'QuotaOptions', 'QuotaShowQuotas', 'QuotaTallyTable',
+
+ //mod_quotatab_file
+
+ //mod_quotatab_ldap
+
+ //mod_quotatab_sql
+
+ //mod_radius
+ 'RadiusAcctServer', 'RadiusAuthServer', 'RadiusEngine',
+ 'RadiusGroupInfo', 'RadiusLog', 'RadiusNASIdentifier',
+ 'RadiusQuotaInfo', 'RadiusRealm', 'RadiusUserInfo', 'RadiusVendor',
+
+ //mod_ratio
+ 'AnonRatio', 'ByteRatioErrMsg', 'CwdRatioMsg', 'FileRatioErrMsg',
+ 'GroupRatio', 'HostRatio', 'LeechRatioMsg', 'RatioFile', 'Ratios',
+ 'RatioTempFile', 'SaveRatios', 'UserRatio',
+
+ //mod_readme
+ 'DisplayReadme',
+
+ //mod_rewrite
+ 'RewriteCondition', 'RewriteEngine', 'RewriteLock', 'RewriteLog',
+ 'RewriteMap', 'RewriteRule',
+
+ //mod_sftp
+ 'SFTPAcceptEnv', 'SFTPAuthMethods', 'SFTPAuthorizedHostKeys',
+ 'SFTPAuthorizedUserKeys', 'SFTPCiphers', 'SFTPClientMatch',
+ 'SFTPCompression', 'SFTPCryptoDevice', 'SFTPDHParamFile',
+ 'SFTPDigests', 'SFTPDisplayBanner', 'SFTPEngine', 'SFTPExtensions',
+ 'SFTPHostKey', 'SFTPKeyBlacklist', 'SFTPKeyExchanges', 'SFTPLog',
+ 'SFTPMaxChannels', 'SFTPOptions', 'SFTPPassPhraseProvider',
+ 'SFTPRekey', 'SFTPTrafficPolicy',
+
+ //mod_sftp_pam
+ 'SFTPPAMEngine', 'SFTPPAMOptions', 'SFTPPAMServiceName',
+
+ //mod_sftp_sql
+
+ //mod_shaper
+ 'ShaperAll', 'ShaperControlsACLs', 'ShaperEngine', 'ShaperLog',
+ 'ShaperSession', 'ShaperTable',
+
+ //mod_sql
+ 'SQLAuthenticate', 'SQLAuthTypes', 'SQLBackend', 'SQLConnectInfo',
+ 'SQLDefaultGID', 'SQLDefaultHomedir', 'SQLDefaultUID', 'SQLEngine',
+ 'SQLGroupInfo', 'SQLGroupWhereClause', 'SQLHomedirOnDemand',
+ 'SQLLog', 'SQLLogFile', 'SQLMinID', 'SQLMinUserGID',
+ 'SQLMinUserUID', 'SQLNamedQuery', 'SQLNegativeCache', 'SQLOptions',
+ 'SQLRatios', 'SQLRatioStats', 'SQLShowInfo', 'SQLUserInfo',
+ 'SQLUserWhereClause',
+
+ //mod_sql_passwd
+ 'SQLPasswordEncoding', 'SQLPasswordEngine', 'SQLPasswordSaltFile',
+ 'SQLPasswordUserSalt',
+
+ //mod_tls
+ 'TLSCACertificateFile', 'TLSCACertificatePath',
+ 'TLSCARevocationFile', 'TLSCARevocationPath',
+ 'TLSCertificateChainFile', 'TLSCipherSuite', 'TLSControlsACLs',
+ 'TLSCryptoDevice', 'TLSDHParamFile', 'TLSDSACertificateFile',
+ 'TLSDSACertificateKeyFile', 'TLSEngine', 'TLSLog', 'TLSOptions',
+ 'TLSPKCS12File', 'TLSPassPhraseProvider', 'TLSProtocol',
+ 'TLSRandomSeed', 'TLSRenegotiate', 'TLSRequired',
+ 'TLSRSACertificateFile', 'TLSRSACertificateKeyFile',
+ 'TLSSessionCache', 'TLSTimeoutHandshake', 'TLSVerifyClient',
+ 'TLSVerifyDepth', 'TLSVerifyOrder',
+
+ //mod_tls_shmcache
+
+ //mod_unique_id
+ 'UniqueIDEngine',
+
+ //mod_wrap
+ 'TCPAccessFiles', 'TCPAccessSyslogLevels', 'TCPGroupAccessFiles',
+ 'TCPServiceName', 'TCPUserAccessFiles',
+
+ //mod_wrap2
+ 'WrapAllowMsg', 'WrapDenyMsg', 'WrapEngine', 'WrapGroupTables',
+ 'WrapLog', 'WrapServiceName', 'WrapTables', 'WrapUserTables',
+
+ //mod_wrap2_file
+
+ //mod_wrap2_sql
+
+ //mod_xfer
+ 'AllowOverwrite', 'DeleteAbortedStores', 'DisplayFileTransfer',
+ 'HiddenStor', 'HiddenStores', 'MaxRetrieveFileSize',
+ 'MaxStoreFileSize', 'StoreUniquePrefix', 'TimeoutNoTransfer',
+ 'TimeoutStalled', 'TransferRate', 'UseSendfile',
+
+ //unknown
+ 'ScoreboardPath', 'ScoreboardScrub'
+ ),
+ /*keywords 3*/
+ 3 => array(
+ //mod_core
+ 'Anonymous',
+ 'Class',
+ 'Directory',
+ 'IfDefine',
+ 'IfModule',
+ 'Limit',
+ 'VirtualHost',
+
+ //mod_ifsession
+ 'IfClass', 'IfGroup', 'IfUser',
+
+ //mod_version
+ 'IfVersion'
+ ),
+ /*permissions*/
+ 4 => array(
+ //mod_core
+ 'ALL',
+ 'CDUP',
+ 'CMD',
+ 'CWD',
+ 'DELE',
+ 'DIRS',
+ 'LOGIN',
+ 'MKD',
+ 'READ',
+ 'RETR',
+ 'RMD',
+ 'RNFR',
+ 'RNTO',
+ 'STOR',
+ 'WRITE',
+ 'XCWD',
+ 'XMKD',
+ 'XRMD',
+
+ //mod_copy
+ 'SITE_CPFR', 'SITE_CPTO',
+
+ //mod_quotatab
+ 'SITE_QUOTA',
+
+ //mod_site
+ 'SITE_HELP', 'SITE_CHMOD', 'SITE_CHGRP',
+
+ //mod_site_misc
+ 'SITE_MKDIR', 'SITE_RMDIR', 'SITE_SYMLINK', 'SITE_UTIME',
+ ),
+ /*keywords 2*/
+ 2 => array(
+ 'all','on','off','yes','no',
+ 'standalone', 'inetd',
+ 'default', 'auth', 'write',
+ 'internet', 'local', 'limit', 'ip',
+ 'from'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '+', '-'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00007f;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #000000; font-weight:bold;',
+ 4 => 'color: #000080; font-weight:bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://www.google.com/search?hl=en&amp;q={FNAMEL}+site:www.proftpd.org+inurl:docs&amp;btnI=I%27m%20Feeling%20Lucky',
+ 2 => '',
+ 3 => 'http://www.google.com/search?hl=en&amp;q={FNAMEL}+site:www.proftpd.org+inurl:docs&amp;btnI=I%27m%20Feeling%20Lucky',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER,
+ 'SYMBOLS' => GESHI_NEVER
+ ),
+ 'KEYWORDS' => array(
+ 2 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\s)(?<!=)',
+ 'DISALLOWED_AFTER' => '(?!\+)(?!\w)',
+ ),
+ 3 => array(
+ 'DISALLOWED_BEFORE' => '(?<=&lt;|&lt;\/)',
+ 'DISALLOWED_AFTER' => '(?=\s|\/|&gt;)',
+ ),
+ 4 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\s)(?<!=)',
+ 'DISALLOWED_AFTER' => '(?!\+)(?=\/|(?:\s+\w+)*\s*&gt;)',
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/progress.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/progress.php
new file mode 100644
index 00000000..79900261
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/progress.php
@@ -0,0 +1,485 @@
+<?php
+/*************************************************************************************
+ * progress.php
+ * --------
+ * Author: Marco Aurelio de Pasqual (marcop@hdi.com.br)
+ * Copyright: (c) 2008 Marco Aurelio de Pasqual, Benny Baumann (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/07/11
+ *
+ * Progress language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/07/11 (1.0.8)
+ * - First Release
+ *
+ * TODO (updated 2008/07/11)
+ * -------------------------
+ * * Clean up the keyword list
+ * * Sort Keyword lists by Control Structures, Predefined functions and other important keywords
+ * * Complete language support
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Progress',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array (
+ 1 => array(
+ 'ACCUMULATE','APPLY','ASSIGN','BELL','QUERY',
+ 'BUFFER-COMPARE','BUFFER-COPY','CALL','CASE',
+ 'CHOOSE','CLASS','CLOSE QUERY','each','WHERE',
+ 'CLOSE STORED-PROCEDURE','COLOR','COMPILE','CONNECT',
+ 'CONSTRUCTOR','COPY-LOB','CREATE','CREATE ALIAS',
+ 'CREATE BROWSE','CREATE BUFFER','CREATE CALL','CREATE CLIENT-PRINCIPAL',
+ 'CREATE DATABASE','CREATE DATASET','CREATE DATA-SOURCE','CREATE QUERY',
+ 'CREATE SAX-attributeS','CREATE SAX-READER','CREATE SAX-WRITER','CREATE SERVER',
+ 'CREATE SERVER-SOCKET','CREATE SOAP-HEADER','CREATE SOAP-HEADER-ENTRYREF','CREATE SOCKET',
+ 'CREATE TEMP-TABLE','CREATE WIDGET','CREATE widget-POOL','CREATE X-DOCUMENT',
+ 'CREATE X-NODEREF','CURRENT-LANGUAGE','CURRENT-VALUE','DDE ADVISE',
+ 'DDE EXECUTE','DDE GET','DDE INITIATE','DDE REQUEST',
+ 'DDE SEND','DDE TERMINATE','DEFINE BROWSE','DEFINE BUFFER','DEFINE',
+ 'DEFINE BUTTON','DEFINE DATASET','DEFINE DATA-SOURCE','DEFINE FRAME','DEF','VAR',
+ 'DEFINE IMAGE','DEFINE MENU','DEFINE PARAMETER','DEFINE property','PARAM',
+ 'DEFINE QUERY','DEFINE RECTANGLE','DEFINE STREAM','DEFINE SUB-MENU',
+ 'DEFINE TEMP-TABLE','DEFINE WORKFILE','DEFINE WORK-TABLE',
+ 'DELETE','DELETE ALIAS','DELETE object','DELETE PROCEDURE',
+ 'DELETE widget','DELETE widget-POOL','DESTRUCTOR','DICTIONARY',
+ 'DISABLE','DISABLE TRIGGERS','DISCONNECT','DISPLAY',
+ 'DO','DOS','DOWN','DYNAMIC-CURRENT-VALUE',
+ 'ELSE','EMPTY TEMP-TABLE','ENABLE','END',
+ 'ENTRY','FIND','AND',
+ 'FIX-CODEPAGE','FOR','FORM','FRAME-VALUE',
+ 'GET','GET-KEY-VALUE','HIDE','IF',
+ 'IMPORT','INPUT CLEAR','INPUT CLOSE','INPUT FROM','input',
+ 'INPUT THROUGH','INPUT-OUTPUT CLOSE','INPUT-OUTPUT THROUGH',
+ 'INTERFACE','LEAVE','BREAK',
+ 'LOAD-PICTURE','MESSAGE','method','NEXT','prev',
+ 'NEXT-PROMPT','ON','OPEN QUERY','OS-APPEND',
+ 'OS-COMMAND','OS-COPY','OS-CREATE-DIR','OS-DELETE',
+ 'OS-RENAME','OUTPUT CLOSE','OUTPUT THROUGH','OUTPUT TO',
+ 'OVERLAY','PAGE','PAUSE','PROCEDURE',
+ 'PROCESS EVENTS','PROMPT-FOR','PROMSGS','PROPATH',
+ 'PUBLISH','PUT','PUT CURSOR','PUT SCREEN',
+ 'PUT-BITS','PUT-BYTE','PUT-BYTES','PUT-DOUBLE',
+ 'PUT-FLOAT','PUT-INT64','PUT-KEY-VALUE','PUT-LONG',
+ 'PUT-SHORT','PUT-STRING','PUT-UNSIGNED-LONG','PUT-UNSIGNED-SHORT',
+ 'QUIT','RAW-TRANSFER','READKEY','RELEASE',
+ 'RELEASE EXTERNAL','RELEASE object','REPEAT','REPOSITION',
+ 'RUN','RUN STORED-PROCEDURE','RUN SUPER',
+ 'SAVE CACHE','SCROLL','SEEK','SET',
+ 'SET-BYTE-ORDER','SET-POINTER-VALUE','SET-SIZE','SHOW-STATS',
+ 'STATUS','STOP','SUBSCRIBE','SUBSTRING',
+ 'system-DIALOG COLOR','system-DIALOG FONT','system-DIALOG GET-DIR','system-DIALOG GET-FILE',
+ 'system-DIALOG PRINTER-SETUP','system-HELP','THEN','THIS-object',
+ 'TRANSACTION-MODE AUTOMATIC','TRIGGER PROCEDURE','UNDERLINE','UNDO',
+ 'UNIX','UNLOAD','UNSUBSCRIBE','UP','STRING',
+ 'UPDATE','USE','USING','substr','SKIP','CLOSE',
+ 'VIEW','WAIT-FOR','MODULO','NE','AVAIL',
+ 'NOT','OR','&GLOBAL-DEFINE','&IF','UNFORMATTED','NO-PAUSE',
+ '&THEN','&ELSEIF','&ELSE','&ENDIF','OPEN','NO-WAIT',
+ '&MESSAGE','&SCOPED-DEFINE','&UNDEFINE','DEFINED',
+ 'BROWSE','BUTTON','COMBO-BOX','CONTROL-FRAME',
+ 'DIALOG-BOX','EDITOR','FIELD-GROUP','FILL-IN',
+ 'FRAME','IMAGE','LITERAL','MENU',
+ 'MENU-ITEM','RADIO-SET','RECTANGLE','SELECTION-LIST',
+ 'SLIDER','SUB-MENU','TEXT','TOGGLE-BOX',
+ 'WINDOW','WITH','AT','OF','EDITING','ON ENDKEY','output',
+ 'ON ERROR','ON QUIT','ON STOP','PRESELECT',
+ 'QUERY-TUNING','SIZE','Trigger','VIEW-AS','ALERT-BOX',
+ 'Buffer','Data-relation','ProDataSet','SAX-attributes',
+ 'SAX-reader','SAX-writer','Server socket','SOAP-fault',
+ 'SOAP-header','SOAP-header-entryref','Socket','Temp-table',
+ 'X-noderef','Height','Left','Top','TO',
+ 'Width','ACTIVE-WINDOW','AUDIT-CONTROL','FIRST','LAST',
+ 'AUDIT-POLICY','CLIPBOARD','CODEBASE-LOCATOR','COLOR-TABLE',
+ 'COMPILER','COM-SELF','DEBUGGER','DEFAULT-WINDOW',
+ 'ERROR-STATUS','FILE-INFO','FOCUS','FONT-TABLE',
+ 'LAST-EVENT','LOG-MANAGER','RCODE-INFO','SECURITY-POLICY',
+ 'SELF','SESSION','SOURCE-PROCEDURE','TARGET-PROCEDURE','NO-LOCK','NO-error',
+ 'THIS-PROCEDURE','WEB-CONTEXT','FUNCTION','RETURNS','NO-UNDO'
+ ),
+ 2 => array(
+ 'ACCEPT-CHANGES','ACCEPT-ROW-CHANGES','ADD-BUFFER','ADD-CALC-COLUMN',
+ 'ADD-COLUMNS-FROM','ADD-EVENTS-PROCEDURE','ADD-FIELDS-FROM','ADD-FIRST',
+ 'ADD-HEADER-ENTRY','ADD-INDEX-FIELD','ADD-LAST','ADD-LIKE-COLUMN',
+ 'ADD-LIKE-FIELD','ADD-LIKE-INDEX','ADD-NEW-FIELD','ADD-NEW-INDEX',
+ 'ADD-RELATION','ADD-SCHEMA-LOCATION','ADD-SOURCE-BUFFER','ADD-SUPER-PROCEDURE',
+ 'APPEND-CHILD','APPLY-CALLBACK','ATTACH-DATA-SOURCE','AUTHENTICATION-FAILED',
+ 'BEGIN-EVENT-GROUP','BUFFER-CREATE',
+ 'BUFFER-DELETE','BUFFER-RELEASE','BUFFER-VALIDATE',
+ 'CANCEL-BREAK','CANCEL-REQUESTS','CLEAR','CLEAR-APPL-CONTEXT',
+ 'CLEAR-LOG','CLEAR-SELECTION','CLEAR-SORT-ARROWS','CLONE-NODE',
+ 'CLOSE-LOG','CONNECTED','CONVERT-TO-OFFSET',
+ 'COPY-DATASET','COPY-SAX-attributeS','COPY-TEMP-TABLE','CREATE-LIKE',
+ 'CREATE-NODE','CREATE-NODE-NAMESPACE','CREATE-RESULT-LIST-ENTRY','DEBUG',
+ 'DECLARE-NAMESPACE','DELETE-CHAR','DELETE-CURRENT-ROW',
+ 'DELETE-HEADER-ENTRY','DELETE-LINE','DELETE-NODE','DELETE-RESULT-LIST-ENTRY',
+ 'DELETE-SELECTED-ROW','DELETE-SELECTED-ROWS','DESELECT-FOCUSED-ROW','DESELECT-ROWS',
+ 'DESELECT-SELECTED-ROW','DETACH-DATA-SOURCE','DISABLE-CONNECTIONS',
+ 'DISABLE-DUMP-TRIGGERS','DISABLE-LOAD-TRIGGERS','DISPLAY-MESSAGE',
+ 'DUMP-LOGGING-NOW','EDIT-CLEAR','EDIT-COPY','EDIT-CUT',
+ 'EDIT-PASTE','EDIT-UNDO','EMPTY-DATASET','EMPTY-TEMP-TABLE',
+ 'ENABLE-CONNECTIONS','ENABLE-EVENTS','ENCRYPT-AUDIT-MAC-KEY',
+ 'END-DOCUMENT','END-ELEMENT','END-EVENT-GROUP','END-FILE-DROP',
+ 'EXPORT','EXPORT-PRINCIPAL','FETCH-SELECTED-ROW',
+ 'FILL','FIND-BY-ROWID','FIND-CURRENT','FIND-FIRST',
+ 'FIND-LAST','FIND-UNIQUE','GET-attribute','GET-attribute-NODE',
+ 'GET-BINARY-DATA','GET-BLUE-VALUE','GET-BROWSE-COLUMN','GET-BUFFER-HANDLE',
+ 'GET-BYTES-AVAILABLE','GET-CALLBACK-PROC-CONTEXT','GET-CALLBACK-PROC-NAME','GET-CGI-LIST',
+ 'GET-CGI-LONG-VALUE','GET-CGI-VALUE','GET-CHANGES','GET-CHILD',
+ 'GET-CHILD-RELATION','GET-CONFIG-VALUE','GET-CURRENT','GET-DATASET-BUFFER',
+ 'GET-DOCUMENT-ELEMENT','GET-DROPPED-FILE','GET-DYNAMIC','GET-ERROR-COLUMN ',
+ 'GET-ERROR-ROW ','GET-FILE-NAME ','GET-FILE-OFFSET ','GET-FIRST',
+ 'GET-GREEN-VALUE','GET-HEADER-ENTRY','GET-INDEX-BY-NAMESPACE-NAME','GET-INDEX-BY-QNAME',
+ 'GET-ITERATION','GET-LAST','GET-LOCALNAME-BY-INDEX','GET-MESSAGE',
+ 'GET-NEXT','GET-NODE','GET-NUMBER','GET-PARENT',
+ 'GET-PREV','GET-PRINTERS','GET-property','GET-QNAME-BY-INDEX',
+ 'GET-RED-VALUE','GET-RELATION','GET-REPOSITIONED-ROW','GET-RGB-VALUE',
+ 'GET-SELECTED-widget','GET-SERIALIZED','GET-SIGNATURE','GET-SOCKET-OPTION',
+ 'GET-SOURCE-BUFFER','GET-TAB-ITEM','GET-TEXT-HEIGHT-CHARS','GET-TEXT-HEIGHT-PIXELS',
+ 'GET-TEXT-WIDTH-CHARS','GET-TEXT-WIDTH-PIXELS','GET-TOP-BUFFER','GET-TYPE-BY-INDEX',
+ 'GET-TYPE-BY-NAMESPACE-NAME','GET-TYPE-BY-QNAME','GET-URI-BY-INDEX','GET-VALUE-BY-INDEX',
+ 'GET-VALUE-BY-NAMESPACE-NAME','GET-VALUE-BY-QNAME','GET-WAIT-STATE','IMPORT-NODE',
+ 'IMPORT-PRINCIPAL','INCREMENT-EXCLUSIVE-ID','INITIALIZE-DOCUMENT-TYPE',
+ 'INITIATE','INSERT','INSERT-attribute','INSERT-BACKTAB',
+ 'INSERT-BEFORE','INSERT-FILE','INSERT-ROW','INSERT-STRING',
+ 'INSERT-TAB','INVOKE','IS-ROW-SELECTED','IS-SELECTED',
+ 'LIST-property-NAMES','LOAD','LoadControls','LOAD-DOMAINS',
+ 'LOAD-ICON','LOAD-IMAGE','LOAD-IMAGE-DOWN','LOAD-IMAGE-INSENSITIVE',
+ 'LOAD-IMAGE-UP','LOAD-MOUSE-POINTER','LOAD-SMALL-ICON','LOCK-REGISTRATION',
+ 'LOG-AUDIT-EVENT','LOGOUT','LONGCHAR-TO-NODE-VALUE','LOOKUP',
+ 'MEMPTR-TO-NODE-VALUE','MERGE-CHANGES','MERGE-ROW-CHANGES','MOVE-AFTER-TAB-ITEM',
+ 'MOVE-BEFORE-TAB-ITEM','MOVE-COLUMN','MOVE-TO-BOTTOM','MOVE-TO-EOF',
+ 'MOVE-TO-TOP','NODE-VALUE-TO-LONGCHAR','NODE-VALUE-TO-MEMPTR','NORMALIZE',
+ 'QUERY-CLOSE','QUERY-OPEN','QUERY-PREPARE',
+ 'READ','READ-FILE','READ-XML','READ-XMLSCHEMA',
+ 'REFRESH','REFRESH-AUDIT-POLICY','REGISTER-DOMAIN','REJECT-CHANGES',
+ 'REJECT-ROW-CHANGES','REMOVE-attribute','REMOVE-CHILD','REMOVE-EVENTS-PROCEDURE',
+ 'REMOVE-SUPER-PROCEDURE','REPLACE','REPLACE-CHILD','REPLACE-SELECTION-TEXT',
+ 'REPOSITION-BACKWARD','REPOSITION-FORWARD','REPOSITION-TO-ROW','REPOSITION-TO-ROWID',
+ 'RESET','SAVE','SAVE-FILE','SAVE-ROW-CHANGES',
+ 'SAX-PARSE','SAX-PARSE-FIRST','SAX-PARSE-NEXT','SCROLL-TO-CURRENT-ROW',
+ 'SCROLL-TO-ITEM','SCROLL-TO-SELECTED-ROW','SEAL','SEARCH',
+ 'SELECT-ALL','SELECT-FOCUSED-ROW','SELECT-NEXT-ROW','SELECT-PREV-ROW',
+ 'SELECT-ROW','SET-ACTOR','SET-APPL-CONTEXT','SET-attribute',
+ 'SET-attribute-NODE','SET-BLUE-VALUE','SET-BREAK','SET-BUFFERS',
+ 'SET-CALLBACK','SET-CALLBACK-PROCEDURE','SET-CLIENT','SET-COMMIT',
+ 'SET-CONNECT-PROCEDURE','SET-DYNAMIC','SET-GREEN-VALUE','SET-INPUT-SOURCE',
+ 'SET-MUST-UNDERSTAND','SET-NODE','SET-NUMERIC-FORMAT','SET-OUTPUT-DESTINATION',
+ 'SET-PARAMETER','SET-property','SET-READ-RESPONSE-PROCEDURE','SET-RED-VALUE',
+ 'SET-REPOSITIONED-ROW','SET-RGB-VALUE','SET-ROLLBACK','SET-SELECTION',
+ 'SET-SERIALIZED','SET-SOCKET-OPTION','SET-SORT-ARROW','SET-WAIT-STATE',
+ 'START-DOCUMENT','START-ELEMENT','STOP-PARSING','SYNCHRONIZE',
+ 'TEMP-TABLE-PREPARE','UPDATE-attribute','URL-DECODE','URL-ENCODE',
+ 'VALIDATE','VALIDATE-SEAL','WRITE','WRITE-CDATA','USE-INDEX',
+ 'WRITE-CHARACTERS','WRITE-COMMENT','WRITE-DATA-ELEMENT','WRITE-EMPTY-ELEMENT',
+ 'WRITE-ENTITY-REF','WRITE-EXTERNAL-DTD','WRITE-FRAGMENT','WRITE-MESSAGE',
+ 'WRITE-PROCESSING-INSTRUCTION','WRITE-XML','WRITE-XMLSCHEMA','FALSE','true'
+ ),
+ 3 => array(
+ 'ABSOLUTE','ACCUM','ADD-INTERVAL','ALIAS','mod',
+ 'AMBIGUOUS','ASC','AUDIT-ENABLED','AVAILABLE',
+ 'BASE64-DECODE','BASE64-ENCODE','CAN-DO','CAN-FIND',
+ 'CAN-QUERY','CAN-SET','CAPS','CAST','OS-DIR',
+ 'CHR','CODEPAGE-CONVERT','COMPARE',
+ 'COUNT-OF','CURRENT-CHANGED','CURRENT-RESULT-ROW','DATASERVERS',
+ 'DATA-SOURCE-MODIFIED','DATETIME','DATETIME-TZ',
+ 'DAY','DBCODEPAGE','DBCOLLATION','DBNAME',
+ 'DBPARAM','DBRESTRICTIONS','DBTASKID','DBTYPE',
+ 'DBVERSION','DECIMAL','DECRYPT','DYNAMIC-function',
+ 'DYNAMIC-NEXT-VALUE','ENCODE','ENCRYPT','ENTERED',
+ 'ERROR','ETIME','EXP','ENDKEY','END-error',
+ 'FIRST-OF','FRAME-DB','FRAME-DOWN',
+ 'FRAME-FIELD','FRAME-FILE','FRAME-INDEX','FRAME-LINE',
+ 'GATEWAYS','GENERATE-PBE-KEY','GENERATE-PBE-SALT','GENERATE-RANDOM-KEY',
+ 'GENERATE-UUID','GET-BITS','GET-BYTE','GET-BYTE-ORDER',
+ 'GET-BYTES','GET-CODEPAGE','GET-CODEPAGES','GET-COLLATION',
+ 'GET-COLLATIONS','GET-DOUBLE','GET-FLOAT','GET-INT64',
+ 'GET-LONG','GET-POINTER-VALUE','GET-SHORT','GET-SIZE',
+ 'GET-STRING','GET-UNSIGNED-LONG','GET-UNSIGNED-SHORT','GO-PENDING',
+ 'GUID','HEX-DECODE','INDEX',
+ 'INT64','INTEGER','INTERVAL','IS-ATTR-SPACE',
+ 'IS-CODEPAGE-FIXED','IS-COLUMN-CODEPAGE','IS-LEAD-BYTE','ISO-DATE',
+ 'KBLABEL','KEYCODE','KEYFUNCTION','KEYLABEL',
+ 'KEYWORD','KEYWORD-ALL','LASTKEY',
+ 'LAST-OF','LC','LDBNAME','LEFT-TRIM',
+ 'LIBRARY','LINE-COUNTER','LIST-EVENTS','LIST-QUERY-ATTRS',
+ 'LIST-SET-ATTRS','LIST-widgetS','LOCKED',
+ 'LOGICAL','MAXIMUM','MD5-DIGEST',
+ 'MEMBER','MESSAGE-LINES','MINIMUM','MONTH',
+ 'MTIME','NEW','NEXT-VALUE','SHARED',
+ 'NOT ENTERED','NOW','NUM-ALIASES','NUM-DBS',
+ 'NUM-ENTRIES','NUM-RESULTS','OPSYS','OS-DRIVES',
+ 'OS-ERROR','OS-GETENV','PAGE-NUMBER','PAGE-SIZE',
+ 'PDBNAME','PROC-HANDLE','PROC-STATUS','PROGRAM-NAME',
+ 'PROGRESS','PROVERSION','QUERY-OFF-END','QUOTER',
+ 'RANDOM','RAW','RECID','REJECTED',
+ 'RETRY','RETURN-VALUE','RGB-VALUE',
+ 'RIGHT-TRIM','R-INDEX','ROUND','ROWID','LENGTH',
+ 'SDBNAME','SET-DB-CLIENT','SETUSERID',
+ 'SHA1-DIGEST','SQRT','SUBSTITUTE','VARIABLE',
+ 'SUPER','TERMINAL','TIME','TIMEZONE','external',
+ 'TODAY','TO-ROWID','TRIM','TRUNCATE','return',
+ 'TYPE-OF','USERID','VALID-EVENT','VALID-HANDLE',
+ 'VALID-object','WEEKDAY','YEAR','BEGINS','VALUE',
+ 'EQ','GE','GT','LE','LT','MATCHES','AS','BY','LIKE'
+ ),
+ 4 => array(
+ 'ACCELERATOR','ACTIVE','ACTOR','ADM-DATA',
+ 'AFTER-BUFFER','AFTER-ROWID','AFTER-TABLE','ALLOW-COLUMN-SEARCHING',
+ 'ALWAYS-ON-TOP','APPL-ALERT-BOXES','APPL-CONTEXT-ID','APPSERVER-INFO',
+ 'APPSERVER-PASSWORD','APPSERVER-USERID','ASYNCHRONOUS','ASYNC-REQUEST-COUNT',
+ 'ASYNC-REQUEST-HANDLE','ATTACHED-PAIRLIST','attribute-NAMES','ATTR-SPACE',
+ 'AUDIT-EVENT-CONTEXT','AUTO-COMPLETION','AUTO-DELETE','AUTO-DELETE-XML',
+ 'AUTO-END-KEY','AUTO-GO','AUTO-INDENT','AUTO-RESIZE',
+ 'AUTO-RETURN','AUTO-SYNCHRONIZE','AUTO-VALIDATE','AUTO-ZAP',
+ 'AVAILABLE-FORMATS','BACKGROUND','BASE-ADE','BASIC-LOGGING',
+ 'BATCH-MODE','BATCH-SIZE','BEFORE-BUFFER','BEFORE-ROWID',
+ 'BEFORE-TABLE','BGCOLOR','BLANK','BLOCK-ITERATION-DISPLAY',
+ 'BORDER-BOTTOM-CHARS','BORDER-BOTTOM-PIXELS','BORDER-LEFT-CHARS','BORDER-LEFT-PIXELS',
+ 'BORDER-RIGHT-CHARS','BORDER-RIGHT-PIXELS','BORDER-TOP-CHARS','BORDER-TOP-PIXELS',
+ 'BOX','BOX-SELECTABLE','BUFFER-CHARS','BUFFER-FIELD',
+ 'BUFFER-HANDLE','BUFFER-LINES','BUFFER-NAME','BUFFER-VALUE',
+ 'BYTES-READ','BYTES-WRITTEN','CACHE','CALL-NAME',
+ 'CALL-TYPE','CANCEL-BUTTON','CANCELLED','CAN-CREATE',
+ 'CAN-DELETE','CAN-READ','CAN-WRITE','CAREFUL-PAINT',
+ 'CASE-SENSITIVE','CENTERED','CHARSET','CHECKED',
+ 'CHILD-BUFFER','CHILD-NUM','CLASS-TYPE','CLIENT-CONNECTION-ID',
+ 'CLIENT-TTY','CLIENT-TYPE','CLIENT-WORKSTATION','CODE',
+ 'CODEPAGE','COLUMN','COLUMN-BGCOLOR','COLUMN-DCOLOR',
+ 'COLUMN-FGCOLOR','COLUMN-FONT','COLUMN-LABEL','COLUMN-MOVABLE',
+ 'COLUMN-PFCOLOR','COLUMN-READ-ONLY','COLUMN-RESIZABLE','COLUMN-SCROLLING',
+ 'COM-HANDLE','COMPLETE','CONFIG-NAME','CONTEXT-HELP',
+ 'CONTEXT-HELP-FILE','CONTEXT-HELP-ID','CONTROL-BOX','CONVERT-3D-COLORS',
+ 'CPCASE','CPCOLL','CPINTERNAL','CPLOG',
+ 'CPPRINT','CPRCODEIN','CPRCODEOUT','CPSTREAM',
+ 'CPTERM','CRC-VALUE','CURRENT-COLUMN','CURRENT-ENVIRONMENT',
+ 'CURRENT-ITERATION','CURRENT-ROW-MODIFIED','CURRENT-WINDOW','CURSOR-CHAR',
+ 'CURSOR-LINE','CURSOR-OFFSET','DATA-ENTRY-RETURN','DATASET',
+ 'DATA-SOURCE','DATA-SOURCE-COMPLETE-MAP','DATA-TYPE','DATE-FORMAT',
+ 'DB-REFERENCES','DCOLOR','DDE-ERROR','DDE-ID',
+ 'DDE-ITEM','DDE-NAME','DDE-TOPIC','DEBLANK',
+ 'DEBUG-ALERT','DECIMALS','DEFAULT','DEFAULT-BUFFER-HANDLE',
+ 'DEFAULT-BUTTON','DEFAULT-COMMIT','DELIMITER','DISABLE-AUTO-ZAP',
+ 'DISPLAY-TIMEZONE','DISPLAY-TYPE','DOMAIN-DESCRIPTION','DOMAIN-NAME',
+ 'DOMAIN-TYPE','DRAG-ENABLED','DROP-TARGET','DYNAMIC',
+ 'EDGE-CHARS','EDGE-PIXELS','EDIT-CAN-PASTE','EDIT-CAN-UNDO',
+ 'EMPTY','ENCODING','ENCRYPTION-SALT','END-USER-PROMPT',
+ 'ENTRY-TYPES-LIST','ERROR-COLUMN','ERROR-object-DETAIL','ERROR-ROW',
+ 'ERROR-STRING','EVENT-GROUP-ID','EVENT-PROCEDURE','EVENT-PROCEDURE-CONTEXT',
+ 'EVENT-TYPE','EXCLUSIVE-ID','EXECUTION-LOG','EXPAND',
+ 'EXPANDABLE','FGCOLOR','FILE-CREATE-DATE','FILE-CREATE-TIME',
+ 'FILE-MOD-DATE','FILE-MOD-TIME','FILE-NAME','FILE-OFFSET',
+ 'FILE-SIZE','FILE-TYPE','FILLED','FILL-MODE',
+ 'FILL-WHERE-STRING','FIRST-ASYNC-REQUEST','FIRST-BUFFER','FIRST-CHILD',
+ 'FIRST-COLUMN','FIRST-DATASET','FIRST-DATA-SOURCE','FIRST-object',
+ 'FIRST-PROCEDURE','FIRST-QUERY','FIRST-SERVER','FIRST-SERVER-SOCKET',
+ 'FIRST-SOCKET','FIRST-TAB-ITEM','FIT-LAST-COLUMN','FLAT-BUTTON',
+ 'FOCUSED-ROW','FOCUSED-ROW-SELECTED','FONT','FOREGROUND',
+ 'FORMAT','FORMATTED','FORM-INPUT','FORM-LONG-INPUT',
+ 'FORWARD-ONLY','FRAGMENT','FRAME-COL','FRAME-NAME',
+ 'FRAME-ROW','FRAME-SPACING','FRAME-X','FRAME-Y',
+ 'FREQUENCY','FULL-HEIGHT-CHARS','FULL-HEIGHT-PIXELS','FULL-PATHNAME',
+ 'FULL-WIDTH-CHARS','FULL-WIDTH-PIXELS','GRAPHIC-EDGE',
+ 'GRID-FACTOR-HORIZONTAL','GRID-FACTOR-VERTICAL','GRID-SNAP','GRID-UNIT-HEIGHT-CHARS',
+ 'GRID-UNIT-HEIGHT-PIXELS','GRID-UNIT-WIDTH-CHARS','GRID-UNIT-WIDTH-PIXELS','GRID-VISIBLE',
+ 'GROUP-BOX','HANDLE','HANDLER','HAS-LOBS',
+ 'HAS-RECORDS','HEIGHT-CHARS','HEIGHT-PIXELS','HELP',
+ 'HIDDEN','HORIZONTAL','HTML-CHARSET','HTML-END-OF-LINE',
+ 'HTML-END-OF-PAGE','HTML-FRAME-BEGIN','HTML-FRAME-END','HTML-HEADER-BEGIN',
+ 'HTML-HEADER-END','HTML-TITLE-BEGIN','HTML-TITLE-END','HWND',
+ 'ICFPARAMETER','ICON','IGNORE-CURRENT-MODIFIED','IMAGE-DOWN',
+ 'IMAGE-INSENSITIVE','IMAGE-UP','IMMEDIATE-DISPLAY','INDEX-INFORMATION',
+ 'IN-HANDLE','INHERIT-BGCOLOR','INHERIT-FGCOLOR','INITIAL','INIT',
+ 'INNER-CHARS','INNER-LINES','INPUT-VALUE','INSTANTIATING-PROCEDURE',
+ 'INTERNAL-ENTRIES','IS-CLASS','IS-OPEN','IS-PARAMETER-SET',
+ 'IS-XML','ITEMS-PER-ROW','KEEP-CONNECTION-OPEN','KEEP-FRAME-Z-ORDER',
+ 'KEEP-SECURITY-CACHE','KEY','KEYS','LABEL',
+ 'LABEL-BGCOLOR','LABEL-DCOLOR','LABEL-FGCOLOR','LABEL-FONT',
+ 'LABELS','LANGUAGES','LARGE','LARGE-TO-SMALL',
+ 'LAST-ASYNC-REQUEST','LAST-BATCH','LAST-CHILD','LAST-object',
+ 'LAST-PROCEDURE','LAST-SERVER','LAST-SERVER-SOCKET','LAST-SOCKET',
+ 'LAST-TAB-ITEM','LINE','LIST-ITEM-PAIRS','LIST-ITEMS',
+ 'LITERAL-QUESTION','LOCAL-HOST','LOCAL-NAME','LOCAL-PORT',
+ 'LOCATOR-COLUMN-NUMBER','LOCATOR-LINE-NUMBER','LOCATOR-PUBLIC-ID','LOCATOR-system-ID',
+ 'LOCATOR-TYPE','LOG-ENTRY-TYPES','LOGFILE-NAME','LOGGING-LEVEL',
+ 'LOGIN-EXPIRATION-TIMESTAMP','LOGIN-HOST','LOGIN-STATE','LOG-THRESHOLD',
+ 'MANDATORY','MANUAL-HIGHLIGHT','MAX-BUTTON','MAX-CHARS',
+ 'MAX-DATA-GUESS','MAX-HEIGHT-CHARS','MAX-HEIGHT-PIXELS','MAX-VALUE',
+ 'MAX-WIDTH-CHARS','MAX-WIDTH-PIXELS','MD5-VALUE','MENU-BAR',
+ 'MENU-KEY','MENU-MOUSE','MERGE-BY-FIELD','MESSAGE-AREA',
+ 'MESSAGE-AREA-FONT','MIN-BUTTON','MIN-COLUMN-WIDTH-CHARS','MIN-COLUMN-WIDTH-PIXELS',
+ 'MIN-HEIGHT-CHARS','MIN-HEIGHT-PIXELS','MIN-SCHEMA-MARSHAL','MIN-VALUE',
+ 'MIN-WIDTH-CHARS','MIN-WIDTH-PIXELS','MODIFIED','MOUSE-POINTER',
+ 'MOVABLE','MULTI-COMPILE','MULTIPLE','MULTITASKING-INTERVAL',
+ 'MUST-UNDERSTAND','NAME','NAMESPACE-PREFIX','NAMESPACE-URI',
+ 'NEEDS-APPSERVER-PROMPT','NEEDS-PROMPT','NESTED','NEW-ROW',
+ 'NEXT-COLUMN','NEXT-ROWID','NEXT-SIBLING','NEXT-TAB-ITEM', 'NO-BOX',
+ 'NO-CURRENT-VALUE','NODE-VALUE','NO-EMPTY-SPACE','NO-FOCUS',
+ 'NONAMESPACE-SCHEMA-LOCATION','NO-SCHEMA-MARSHAL','NO-VALIDATE','NUM-BUFFERS',
+ 'NUM-BUTTONS','NUM-CHILD-RELATIONS','NUM-CHILDREN','NUM-COLUMNS',
+ 'NUM-DROPPED-FILES','NUMERIC-DECIMAL-POINT','NUMERIC-FORMAT','NUMERIC-SEPARATOR',
+ 'NUM-FIELDS','NUM-FORMATS','NUM-HEADER-ENTRIES','NUM-ITEMS',
+ 'NUM-ITERATIONS','NUM-LINES','NUM-LOCKED-COLUMNS','NUM-LOG-FILES',
+ 'NUM-MESSAGES','NUM-PARAMETERS','NUM-REFERENCES','NUM-RELATIONS',
+ 'NUM-REPLACED','NUM-SELECTED-ROWS','NUM-SELECTED-WIDGETS','NUM-SOURCE-BUFFERS',
+ 'NUM-TABS','NUM-TOP-BUFFERS','NUM-TO-RETAIN','NUM-VISIBLE-COLUMNS',
+ 'ON-FRAME-BORDER','ORIGIN-HANDLE','ORIGIN-ROWID','OWNER',
+ 'OWNER-DOCUMENT','PAGE-BOTTOM','PAGE-TOP','PARAMETER',
+ 'PARENT','PARENT-BUFFER','PARENT-RELATION','PARSE-STATUS',
+ 'PASSWORD-FIELD','PATHNAME','PBE-HASH-ALGORITHM','PBE-KEY-ROUNDS',
+ 'PERSISTENT','PERSISTENT-CACHE-DISABLED','PERSISTENT-PROCEDURE','PFCOLOR',
+ 'PIXELS-PER-COLUMN','PIXELS-PER-ROW','POPUP-MENU','POPUP-ONLY',
+ 'POSITION','PREFER-DATASET','PREPARED','PREPARE-STRING',
+ 'PREV-COLUMN','PREV-SIBLING','PREV-TAB-ITEM','PRIMARY',
+ 'PRINTER-CONTROL-HANDLE','PRINTER-HDC','PRINTER-NAME','PRINTER-PORT',
+ 'PRIVATE-DATA','PROCEDURE-NAME','PROGRESS-SOURCE','PROXY',
+ 'PROXY-PASSWORD','PROXY-USERID','PUBLIC-ID','PUBLISHED-EVENTS',
+ 'RADIO-BUTTONS','READ-ONLY','RECORD-LENGTH',
+ 'REFRESHABLE','RELATION-FIELDS','RELATIONS-ACTIVE','REMOTE',
+ 'REMOTE-HOST','REMOTE-PORT','RESIZABLE','RESIZE',
+ 'RESTART-ROWID','RETAIN-SHAPE','RETURN-INSERTED','RETURN-VALUE-DATA-TYPE',
+ 'ROLES','ROUNDED','COL','ROW','ROW-HEIGHT-CHARS',
+ 'ROW-HEIGHT-PIXELS','ROW-MARKERS','ROW-RESIZABLE','ROW-STATE',
+ 'SAVE-WHERE-STRING','SCHEMA-CHANGE','SCHEMA-LOCATION','SCHEMA-MARSHAL',
+ 'SCHEMA-PATH','SCREEN-LINES','SCREEN-VALUE','SCROLLABLE',
+ 'SCROLLBAR-HORIZONTAL','SCROLL-BARS','SCROLLBAR-VERTICAL','SEAL-TIMESTAMP',
+ 'SELECTABLE','SELECTED','SELECTION-END','SELECTION-START',
+ 'SELECTION-TEXT','SENSITIVE','SEPARATOR-FGCOLOR','SEPARATORS',
+ 'SERVER','SERVER-CONNECTION-BOUND','SERVER-CONNECTION-BOUND-REQUEST','SERVER-CONNECTION-CONTEXT',
+ 'SERVER-CONNECTION-ID','SERVER-OPERATING-MODE','SESSION-END','SESSION-ID',
+ 'SHOW-IN-TASKBAR','SIDE-LABEL-HANDLE','SIDE-LABELS','SKIP-DELETED-RECORD',
+ 'SMALL-ICON','SMALL-TITLE','SOAP-FAULT-ACTOR','SOAP-FAULT-CODE',
+ 'SOAP-FAULT-DETAIL','SOAP-FAULT-STRING','SORT','SORT-ASCENDING',
+ 'SORT-NUMBER','SSL-SERVER-NAME','STANDALONE','STARTUP-PARAMETERS',
+ 'STATE-DETAIL','STATUS-AREA','STATUS-AREA-FONT','STOPPED',
+ 'STREAM','STRETCH-TO-FIT','STRICT','STRING-VALUE',
+ 'SUBTYPE','SUPER-PROCEDURES','SUPPRESS-NAMESPACE-PROCESSING','SUPPRESS-WARNINGS',
+ 'SYMMETRIC-ENCRYPTION-ALGORITHM','SYMMETRIC-ENCRYPTION-IV','SYMMETRIC-ENCRYPTION-KEY','SYMMETRIC-SUPPORT',
+ 'system-ALERT-BOXES','system-ID','TABLE','TABLE-CRC-LIST',
+ 'TABLE-HANDLE','TABLE-LIST','TABLE-NUMBER','TAB-POSITION',
+ 'TAB-STOP','TEMP-DIRECTORY','TEXT-SELECTED','THREE-D',
+ 'TIC-MARKS','TIME-SOURCE','TITLE','TITLE-BGCOLOR','FIELD',
+ 'TITLE-DCOLOR','TITLE-FGCOLOR','TITLE-FONT','TOOLTIP',
+ 'TOOLTIPS','TOP-ONLY','TRACKING-CHANGES','TRANSACTION',
+ 'TRANS-INIT-PROCEDURE','TRANSPARENT','TYPE','UNIQUE-ID',
+ 'UNIQUE-MATCH','URL','URL-PASSWORD','URL-USERID','EXTENT',
+ 'USER-ID','V6DISPLAY','VALIDATE-EXPRESSION','VALIDATE-MESSAGE',
+ 'VALIDATE-XML','VALIDATION-ENABLED','VIEW-FIRST-COLUMN-ON-REOPEN',
+ 'VIRTUAL-HEIGHT-CHARS','VIRTUAL-HEIGHT-PIXELS','VIRTUAL-WIDTH-CHARS','VIRTUAL-WIDTH-PIXELS',
+ 'VISIBLE','WARNING','WHERE-STRING','widget-ENTER','DATE',
+ 'widget-LEAVE','WIDTH-CHARS','WIDTH-PIXELS','WINDOW-STATE',
+ 'WINDOW-system','WORD-WRAP','WORK-AREA-HEIGHT-PIXELS','WORK-AREA-WIDTH-PIXELS',
+ 'WORK-AREA-X','WORK-AREA-Y','WRITE-STATUS','X','widget-Handle',
+ 'X-DOCUMENT','XML-DATA-TYPE','XML-NODE-TYPE','XML-SCHEMA-PATH',
+ 'XML-SUPPRESS-NAMESPACE-PROCESSING','Y','YEAR-OFFSET','CHARACTER',
+ 'LONGCHAR','MEMPTR','CHAR','DEC','INT','LOG','DECI','INTE','LOGI','long'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}',
+ '<', '>', '=',
+ '+', '-', '*', '/',
+ '!', '@', '%', '|', '$',
+ ':', '.', ';', ',',
+ '?', '<=','<>','>=', '\\'
+ ),
+ 'CASE_SENSITIVE' => array (
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false
+ ),
+ 'STYLES' => array (
+ 'KEYWORDS' => array (
+ 1 => 'color: #0000ff; font-weight: bold;',
+ 2 => 'color: #1D16B2;',
+ 3 => 'color: #993333;',
+ 4 => 'color: #0000ff;'
+ ),
+ 'COMMENTS' => array (
+// 1 => 'color: #808080; font-style: italic;',
+// 2 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array (
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array (
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array (
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array (
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array (
+ 0 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array (
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array (
+ ),
+ 'SCRIPT' => array (
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 0 => ':'
+ ),
+ 'REGEXPS' => array (
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array (
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array (
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![\.\-a-zA-Z0-9_\$\#&])",
+ 'DISALLOWED_AFTER' => "(?![\-a-zA-Z0-9_%])",
+ 1 => array(
+ 'SPACE_AS_WHITESPACE' => true
+ ),
+ 2 => array(
+ 'SPACE_AS_WHITESPACE' => true
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/prolog.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/prolog.php
new file mode 100644
index 00000000..a106a4e4
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/prolog.php
@@ -0,0 +1,143 @@
+<?php
+/*************************************************************************************
+ * prolog.php
+ * --------
+ * Author: Benny Baumann (BenBE@geshi.org)
+ * Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/10/02
+ *
+ * Prolog language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/10/02 (1.0.8.1)
+ * - First Release
+ *
+ * TODO (updated 2008/10/02)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Prolog',
+ 'COMMENT_SINGLE' => array(1 => '%'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'HARDQUOTE' => array("'", "'"),
+ 'HARDESCAPE' => array("\'"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'abolish','abs','arg','asserta','assertz','at_end_of_stream','atan',
+ 'atom','atom_chars','atom_codes','atom_concat','atom_length',
+ 'atomic','bagof','call','catch','ceiling','char_code',
+ 'char_conversion','clause','close','compound','consult','copy_term',
+ 'cos','current_char_conversion','current_input','current_op',
+ 'current_output','current_predicate','current_prolog_flag',
+ 'discontiguous','dynamic','ensure_loaded','exp','fail','findall',
+ 'float','float_fractional_part','float_integer_part','floor',
+ 'flush_output','functor','get_byte','get_char','get_code','halt',
+ 'include','initialization','integer','is','listing','log','mod',
+ 'multifile','nl','nonvar','notrace','number','number_chars',
+ 'number_codes','once','op','open','peek_byte','peek_char',
+ 'peek_code','put_byte','put_char','put_code','read','read_term',
+ 'rem','repeat','retract','round','set_input','set_output',
+ 'set_prolog_flag','set_stream_position','setof','sign','sin','sqrt',
+ 'stream_property','sub_atom','throw','trace','true','truncate',
+ 'unify_with_occurs_check','univ','var','write','write_canonical',
+ 'write_term','writeq'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '[', ']', '{', '}',),
+ 1 => array('?-', ':-', '=:='),
+ 2 => array('\-', '\+', '\*', '\/'),
+ 3 => array('-', '+', '*', '/'),
+ 4 => array('.', ':', ',', ';'),
+ 5 => array('!', '@', '&', '|'),
+ 6 => array('<', '>', '=')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #990000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;',
+ 'HARD' => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #800080;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;',
+ 1 => 'color: #339933;',
+ 2 => 'color: #339933;',
+ 3 => 'color: #339933;',
+ 4 => 'color: #339933;',
+ 5 => 'color: #339933;',
+ 6 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #008080;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://pauillac.inria.fr/~deransar/prolog/bips.html'
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Variables
+ 0 => "(?<![a-zA-Z0-9_])(?!(?:PIPE|SEMI|DOT)[^a-zA-Z0-9_])[A-Z_][a-zA-Z0-9_]*(?![a-zA-Z0-9_])(?!\x7C)"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/properties.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/properties.php
new file mode 100644
index 00000000..e1317b22
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/properties.php
@@ -0,0 +1,127 @@
+<?php
+/*************************************************************************************
+ * properties.php
+ * --------
+ * Author: Edy Hinzen
+ * Copyright: (c) 2009 Edy Hinzen
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/04/03
+ *
+ * Property language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/04/03 (1.0.0)
+ * - First Release
+ *
+ * TODO
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'PROPERTIES',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* Common used variables */
+ 1 => array(
+ '${user.home}'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '[', ']', '='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => ''
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #933;'
+ ),
+ 'NUMBERS' => array(
+ 0 => ''
+ ),
+ 'METHODS' => array(
+ 0 => ''
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #000080; font-weight:bold;',
+ 1 => 'color: #008000; font-weight:bold;'
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Entry names
+ 0 => array(
+ GESHI_SEARCH => '^(\s*)([.a-zA-Z0-9_\-]+)(\s*=)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+ //Entry values
+ 1 => array(
+ // Evil hackery to get around GeSHi bug: <>" and ; are added so <span>s can be matched
+ // Explicit match on variable names because if a comment is before the first < of the span
+ // gets chewed up...
+ GESHI_SEARCH => '([<>";a-zA-Z0-9_]+\s*)=(.*)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1=',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/providex.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/providex.php
new file mode 100644
index 00000000..1e735bd0
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/providex.php
@@ -0,0 +1,299 @@
+<?php
+/******************************************************************************
+ * providex.php
+ * ----------
+ * Author: Jeff Wilder (jeff@coastallogix.com)
+ * Copyright: (c) 2008 Coastal Logix (http://www.coastallogix.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/10/18
+ *
+ * ProvideX language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/10/21 (1.0.0)
+ * - First Release
+ *
+ * TODO
+ * -------------------------
+ * 1. Create a regexp for numeric global variables (ex: %VarName = 3)
+ * 2. Add standard object control properties
+ *
+ ******************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ *****************************************************************************/
+$language_data = array (
+ 'LANG_NAME' => 'ProvideX',
+ 'COMMENT_SINGLE' => array(1 => '!'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ // Single-Line Comments using REM command
+ 2 => "/\bREM\b.*?$/i"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ // Directives
+ '*break', '*continue', '*end', '*escape', '*next', '*proceed',
+ '*retry', '*return', '*same', 'accept', 'add index', 'addr',
+ 'auto', 'begin', 'break', 'button', 'bye', 'call', 'case',
+ 'chart', 'check_box', 'class', 'clear', 'clip_board', 'close',
+ 'continue', 'control', 'create required', 'create table',
+ 'cwdir', 'data', 'day_format', 'def', 'default', 'defctl',
+ 'defprt', 'deftty', 'delete required', 'dictionary', 'dim', 'direct',
+ 'directory', 'disable', 'drop', 'drop_box', 'dump', 'edit',
+ 'else', 'enable', 'end switch', 'end', 'end_if', 'endtrace',
+ 'enter', 'erase', 'error_handler', 'escape', 'event', 'execute',
+ 'exit', 'exitto', 'extract', 'file', 'find', 'floating point',
+ 'for', 'function', 'get_file_box', 'gosub', 'goto', 'grid',
+ 'h_scrollbar', 'hide', 'if', 'index', 'indexed', 'input',
+ 'insert', 'invoke', 'iolist', 'keyed', 'let', 'like',
+ 'line_switch', 'list', 'list_box', 'load', 'local', 'lock',
+ 'long_form', 'menu_bar', 'merge', 'message_lib', 'mnemonic',
+ 'msgbox', 'multi_line', 'multi_media', 'next', 'object', 'obtain',
+ 'on', 'open', 'password', 'perform', 'pop', 'popup_menu',
+ 'precision', 'prefix', 'preinput', 'print', 'process', 'program',
+ 'property', 'purge', 'quit', 'radio_button', 'randomize',
+ 'read', 'record', 'redim', 'refile', 'release', 'rem', 'remove',
+ 'rename', 'renumber', 'repeat', 'reset', 'restore', 'retry',
+ 'return', 'round', 'run', 'save', 'select', 'serial', 'server',
+ 'set_focus', 'set_nbf', 'set_param', 'setctl', 'setday', 'setdev',
+ 'setdrive', 'seterr', 'setesc', 'setfid', 'setmouse', 'settime',
+ 'settrace', 'short_form', 'show', 'sort', 'start', 'static',
+ 'step', 'stop', 'switch', 'system_help', 'system_jrnl', 'table',
+ 'then', 'to', 'translate', 'tristate_box', 'unlock', 'until',
+ 'update', 'user_lex', 'v_scrollbar', 'vardrop_box', 'varlist_box',
+ 'via', 'video_palette', 'wait', 'wend', 'while', 'winprt_setup',
+ 'with', 'write'
+ ),
+ 2 => array(
+ // System Functions
+ '@x', '@y', 'abs', 'acs', 'and', 'arg', 'asc', 'asn', 'ath',
+ 'atn', 'bin', 'bsz', 'chg', 'chr', 'cmp', 'cos', 'cpl',
+ 'crc', 'cse', 'ctl', 'cvs', 'dec', 'dir', 'dll', 'dsk',
+ 'dte', 'env', 'ept', 'err', 'evn', 'evs', 'exp', 'ffn',
+ 'fib', 'fid', 'fin', 'fpt', 'gap', 'gbl', 'gep', 'hsa',
+ 'hsh', 'hta', 'hwn', 'i3e', 'ind', 'int', 'iol', 'ior',
+ 'jul', 'jst', 'kec', 'kef', 'kel', 'ken', 'kep', 'key',
+ 'kgn', 'lcs', 'len', 'lno', 'log', 'lrc', 'lst', 'max',
+ 'mem', 'mid', 'min', 'mnm', 'mod', 'msg', 'msk', 'mxc',
+ 'mxl', 'new', 'not', 'nul', 'num', 'obj', 'opt', 'pad',
+ 'pck', 'pfx', 'pgm', 'pos', 'prc', 'prm', 'pth', 'pub',
+ 'rcd', 'rdx', 'rec', 'ref', 'rnd', 'rno', 'sep', 'sgn',
+ 'sin', 'sqr', 'srt', 'ssz', 'stk', 'stp', 'str', 'sub',
+ 'swp', 'sys', 'tan', 'tbl', 'tcb', 'tmr', 'trx', 'tsk',
+ 'txh', 'txw', 'ucp', 'ucs', 'upk', 'vin', 'vis', 'xeq',
+ 'xfa', 'xor', '_obj'
+ ),
+ 3 => array(
+ // System Variables
+ // Vars that are duplicates of functions
+ // 'ctl', 'err', 'pfx', 'prm', 'rnd', 'sep', 'sys',
+ 'bkg', 'chn', 'day', 'dlm', 'dsz', 'eom', 'ers', 'esc',
+ 'gfn', 'gid', 'hfn', 'hlp', 'hwd', 'lfa', 'lfo', 'lip',
+ 'lpg', 'lwd', 'mse', 'msl', 'nar', 'nid', 'pgn', 'psz',
+ 'quo', 'ret', 'sid', 'ssn', 'tim', 'tme', 'tms', 'tsm',
+ 'uid', 'unt', 'who'
+
+ ),
+ 4 => array(
+ // Nomads Variables
+ '%Flmaint_Lib$', '%Flmaint_Msg$', '%Nomads_Activation_Ok',
+ '%Nomads_Auto_Qry', '%Nomads_Disable_Debug',
+ '%Nomads_Disable_Trace', '%Nomads_Fkey_Handler$',
+ '%Nomads_Fkey_Tbl$', '%Nomads_Notest', '%Nomads_Onexit$',
+ '%Nomads_Post_Display', '%Nomads_Pre_Display$',
+ '%Nomads_Process$', '%Nomads_Trace_File$',
+ '%Nomad_Actv_Folder_Colors$', '%Nomad_Automation_Enabled',
+ '%Nomad_Auto_Close', '%Nomad_Center_Wdw', '%Nomad_Concurrent_Wdw',
+ '%Nomad_Custom_Define', '%Nomad_Custom_Dir$',
+ '%Nomad_Custom_Genmtc', '%Nomad_Custom_Skip_Definition',
+ '%Nomad_Def_Sfx$', '%Nomad_Enter_Tab', '%Nomad_Esc_Sel',
+ '%Nomad_Isjavx', '%Nomad_Iswindx', '%Nomad_Iswindx$',
+ '%Nomad_Menu$', '%Nomad_Menu_Leftedge_Clr$',
+ '%Nomad_Menu_Textbackground_Clr$', '%Nomad_Mln_Sep$',
+ '%Nomad_Msgmnt$', '%Nomad_Noplusw', '%Nomad_No_Customize',
+ '%Nomad_Object_Persistence', '%Nomad_Object_Resize',
+ '%Nomad_Open_Load', '%Nomad_Override_Font$',
+ '%Nomad_Palette_Loaded', '%Nomad_Panel_Info_Force',
+ '%Nomad_Panel_Info_Prog$', '%Nomad_Pnl_Def_Colour$',
+ '%Nomad_Pnl_Def_Font$', '%Nomad_Prg_Cache', '%Nomad_Qry_Attr$',
+ '%Nomad_Qry_Btn$', '%Nomad_Qry_Clear_Start', '%Nomad_Qry_Tip$',
+ '%Nomad_Qry_Wide', '%Nomad_Query_Clear_Status', '%Nomad_Query_Kno',
+ '%Nomad_Query_No_Gray', '%Nomad_Query_Odb_Ignore',
+ '%Nomad_Query_Retkno', '%Nomad_Query_Sbar_Max',
+ '%Nomad_Relative_Wdw', '%Nomad_Save_Qry_Path', '%Nomad_Script_Fn',
+ '%Nomad_Script_Log', '%Nomad_Script_Wdw',
+ '%Nomad_Skip_Change_Logic', '%Nomad_Skip_Onselect_Logic',
+ '%Nomad_Stk$', '%Nomad_Tab_Dir', '%Nomad_Timeout',
+ '%Nomad_Turbo_Off', '%Nomad_Visual_Effect',
+ '%Nomad_Visual_Override', '%Nomad_Win_Ver', '%Nomad_Xchar',
+ '%Nomad_Xmax', '%Nomad_Ychar', '%Nomad_Ymax', '%Scr_Def_Attr$',
+ '%Scr_Def_H_Fl$', '%Scr_Def_H_Id$', '%Scr_Lib', '%Scr_Lib$',
+ '%Z__Usr_Sec$', 'Alternate_Panel$', 'Alternate_Panel_Type$',
+ 'Arg_1$', 'Arg_10$', 'Arg_11$', 'Arg_12$', 'Arg_13$', 'Arg_14$',
+ 'Arg_15$', 'Arg_16$', 'Arg_17$', 'Arg_18$', 'Arg_19$', 'Arg_2$',
+ 'Arg_20$', 'Arg_3$', 'Arg_4$', 'Arg_5$', 'Arg_6$', 'Arg_7$',
+ 'Arg_8$', 'Arg_9$', 'Change_Flg', 'Cmd_Str$', 'Default_Prog$',
+ 'Disp_Cmd$', 'Entire_Record$', 'Exit_Cmd$', 'Fldr_Default_Prog$',
+ 'Folder_Id$', 'Id', 'Id$', 'Ignore_Exit', 'Initialize_Flg',
+ 'Init_Text$', 'Init_Val$', 'Main_Scrn_K$', 'Mnu_Ln$',
+ 'Next_Folder', 'Next_Id', 'Next_Id$', 'No_Flush', 'Prime_Key$',
+ 'Prior_Val', 'Prior_Val$', 'Qry_Val$', 'Refresh_Flg',
+ 'Replacement_Folder$', 'Replacement_Lib$', 'Replacement_Scrn$',
+ 'Scrn_Id$', 'Scrn_K$', 'Scrn_Lib$', 'Tab_Table$', '_Eom$'
+ ),
+ 5 => array(
+ // Mnemonics
+ "'!w'", "'*c'", "'*h'", "'*i'", "'*o'", "'*r'", "'*x'",
+ "'+b'", "'+d'", "'+e'", "'+f'", "'+i'", "'+n'",
+ "'+p'", "'+s'", "'+t'", "'+u'", "'+v'", "'+w'", "'+x'",
+ "'+z'", "'-b'", "'-d'", "'-e'", "'-f'", "'-i'",
+ "'-n'", "'-p'", "'-s'", "'-t'", "'-u'", "'-v'", "'-w'",
+ "'-x'", "'-z'", "'2d'", "'3d'", "'4d'", "'@@'", "'ab'",
+ "'arc'", "'at'", "'backgr'", "'bb'", "'be'", "'beep'",
+ "'bg'", "'bi'", "'bj'", "'bk'", "'black'", "'blue'",
+ "'bm'", "'bo'", "'box'", "'br'", "'bs'", "'bt'", "'bu'",
+ "'bw'", "'bx'", "'caption'", "'ce'", "'cf'", "'ch'",
+ "'ci'", "'circle'", "'cl'", "'colour'", "'cp'", "'cpi'",
+ "'cr'", "'cs'", "'cursor'", "'cyan''_cyan'", "'dc'",
+ "'default'", "'df'", "'dialogue'", "'dn'", "'do'",
+ "'drop'", "'eb'", "'ee'", "'ef'", "'eg'", "'ei'", "'ej'",
+ "'el'", "'em'", "'eo'", "'ep'", "'er'", "'es'", "'et'",
+ "'eu'", "'ew'", "'ff'", "'fill'", "'fl'", "'font'",
+ "'frame'", "'gd'", "'ge'", "'gf'", "'goto'", "'green'",
+ "'gs'", "'hide'", "'ic'", "'image'", "'jc'",
+ "'jd'", "'jl'", "'jn'", "'jr'", "'js'", "'l6'", "'l8'",
+ "'lc'", "'ld'", "'lf'", "'li'", "'line'", "'lm'",
+ "'lpi'", "'lt'", "'magenta'", "'maxsize'", "'me'",
+ "'message'", "'minsize'", "'mn'", "'mode'",
+ "'move'", "'mp'", "'ms'", "'ni'", "'offset'", "'option'",
+ "'pe'", "'pen'", "'picture'", "'pie'", "'pm'", "'polygon'",
+ "'pop'", "'ps'", "'push'", "'rb'", "'rc'", "'rectangle'",
+ "'red'", "'rl'", "'rm'", "'rp'", "'rs'", "'rt'", "'sb'",
+ "'scroll'", "'sd'", "'se'", "'sf'", "'show'", "'size'",
+ "'sl'", "'sn'", "'sp'", "'sr'", "'swap'", "'sx'", "'text'",
+ "'textwdw'", "'tr'", "'tw'", "'uc'", "'up'", "'vt'", "'wa'",
+ "'wc'", "'wd'", "'wg'", "'white'", "'window'", "'wm'",
+ "'wp'", "'wr'", "'wrap'", "'ws'", "'wx'", "'xp'", "'yellow'",
+ "'zx'", "'_black'", "'_blue'", "'_colour'", "'_green'",
+ "'_magenta'", "'_red'", "'_white'", "'_yellow'"
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('+', '-', '*', '/', '^', '|'),
+ 1 => array('++', '--', '+=', '-=', '*=', '/=', '^=', '|='),
+ 2 => array('&lt;', '&gt;', '='),
+ 3 => array('(', ')', '[', ']', '{', '}'),
+ 4 => array(',', '@', ';', '\\')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: navy;', // Directives
+ 2 => 'color: blue;', // System Functions
+ 3 => 'color: blue;', // System Variables
+ 4 => 'color: #6A5ACD; font-style: italic;', // Nomads Global Variables
+ 5 => 'color: #BDB76B;', // Mnemonics
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008080; font-style: italic;',
+ 2 => 'color: #008080;',
+ 'MULTI' => 'color: #008080; font-style: italic;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000066;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: green;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #00008B;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;',
+ 1 => 'color: #000099;',
+ 2 => 'color: #000099;',
+ 3 => 'color: #0000C9;',
+ 4 => 'color: #000099;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ 1 => 'color: #006400; font-weight: bold',
+ 2 => 'color: #6A5ACD;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://www.allbasic.info./wiki/index.php/PX:Directive_{FNAME}',
+ 2 => 'http://www.allbasic.info./wiki/index.php/PX:System_function_{FNAME}',
+ 3 => 'http://www.allbasic.info./wiki/index.php/PX:System_variable_{FNAME}',
+ 4 => 'http://www.allbasic.info./wiki/index.php/PX:Nomads_{FNAME}',
+ 5 => 'http://www.allbasic.info./wiki/index.php/PX:Mnemonic_{FNAMEU}'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => "'"
+ ),
+ 'REGEXPS' => array(
+ 1 => array(
+ // Line Labels
+ GESHI_SEARCH => '([[:space:]])([a-zA-Z_][a-zA-Z0-9_]+)(:)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+ 2 => array(
+ // Global String Variables
+ GESHI_SEARCH => '(\%)([a-zA-Z_][a-zA-Z0-9_]+)(\$)',
+ GESHI_REPLACE => '\\1\\2\\3',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'NUMBERS' => GESHI_NEVER
+ )
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/purebasic.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/purebasic.php
new file mode 100644
index 00000000..d78ffe97
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/purebasic.php
@@ -0,0 +1,303 @@
+<?php
+/*************************************************************************************
+ * purebasic.php
+ * -------
+ * Author: GuShH
+ * Copyright: (c) 2009 Gustavo Julio Fiorenza
+ * Release Version: 1.0.8.11
+ * Date Started: 13/06/2009
+ *
+ * PureBasic language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 13/06/2009 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2009/06/13)
+ * -------------------------
+ * Add the remaining ASM mnemonics and the 4.3x functions/etc.
+ * Better coloring (perhaps match the default scheme of PB?)
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'PureBasic',
+ 'COMMENT_SINGLE' => array( 1 => ";" ),
+ 'COMMENT_MULTI' => array( ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ // Keywords
+ 'And', 'As', 'Break', 'CallDebugger', 'Case', 'CompilerCase', 'CompilerDefault', 'CompilerElse', 'CompilerEndIf', 'CompilerEndSelect',
+ 'CompilerError', 'CompilerIf', 'CompilerSelect', 'Continue', 'Data', 'DataSection', 'EndDataSection', 'Debug', 'DebugLevel', 'Declare',
+ 'DeclareCDLL', 'DeclareDLL', 'Default', 'Define', 'Dim', 'DisableASM', 'DisableDebugger', 'DisableExplicit', 'Else', 'ElseIf', 'EnableASM',
+ 'EnableDebugger', 'EnableExplicit', 'End', 'EndEnumeration', 'EndIf', 'EndImport', 'EndInterface', 'EndMacro', 'EndProcedure',
+ 'EndSelect', 'EndStructure', 'EndStructureUnion', 'EndWith', 'Enumeration', 'Extends', 'FakeReturn', 'For', 'Next', 'ForEach',
+ 'ForEver', 'Global', 'Gosub', 'Goto', 'If', 'Import', 'ImportC', 'IncludeBinary', 'IncludeFile', 'IncludePath', 'Interface', 'Macro',
+ 'NewList', 'Not', 'Or', 'Procedure', 'ProcedureC', 'ProcedureCDLL', 'ProcedureDLL', 'ProcedureReturn', 'Protected', 'Prototype',
+ 'PrototypeC', 'Read', 'ReDim', 'Repeat', 'Until', 'Restore', 'Return', 'Select', 'Shared', 'Static', 'Step', 'Structure', 'StructureUnion',
+ 'Swap', 'To', 'Wend', 'While', 'With', 'XIncludeFile', 'XOr'
+ ),
+ 2 => array(
+ // All Functions
+ 'Abs', 'ACos', 'Add3DArchive', 'AddBillboard', 'AddDate', 'AddElement', 'AddGadgetColumn', 'AddGadgetItem',
+ 'AddKeyboardShortcut', 'AddMaterialLayer', 'AddPackFile', 'AddPackMemory', 'AddStatusBarField', 'AddSysTrayIcon',
+ 'AllocateMemory', 'AmbientColor', 'AnimateEntity', 'Asc', 'ASin', 'ATan', 'AudioCDLength', 'AudioCDName', 'AudioCDStatus',
+ 'AudioCDTrackLength', 'AudioCDTracks', 'AudioCDTrackSeconds', 'AvailableProgramOutput', 'AvailableScreenMemory',
+ 'BackColor', 'Base64Decoder', 'Base64Encoder', 'BillboardGroupLocate', 'BillboardGroupMaterial', 'BillboardGroupX',
+ 'BillboardGroupY', 'BillboardGroupZ', 'BillboardHeight', 'BillboardLocate', 'BillboardWidth', 'BillboardX', 'BillboardY', 'BillboardZ',
+ 'Bin', 'BinQ', 'Blue', 'Box', 'ButtonGadget', 'ButtonImageGadget', 'CalendarGadget', 'CallCFunction', 'CallCFunctionFast',
+ 'CallFunction', 'CallFunctionFast', 'CameraBackColor', 'CameraFOV', 'CameraLocate', 'CameraLookAt', 'CameraProjection',
+ 'CameraRange', 'CameraRenderMode', 'CameraX', 'CameraY', 'CameraZ', 'CatchImage', 'CatchSound', 'CatchSprite',
+ 'CatchXML', 'ChangeAlphaIntensity', 'ChangeCurrentElement', 'ChangeGamma', 'ChangeListIconGadgetDisplay',
+ 'ChangeSysTrayIcon', 'CheckBoxGadget', 'CheckEntityCollision', 'CheckFilename', 'ChildXMLNode', 'Chr', 'Circle',
+ 'ClearBillboards', 'ClearClipboard', 'ClearConsole', 'ClearError', 'ClearGadgetItemList', 'ClearList', 'ClearScreen', 'ClipSprite',
+ 'CloseConsole', 'CloseDatabase', 'CloseFile', 'CloseGadgetList', 'CloseHelp', 'CloseLibrary', 'CloseNetworkConnection',
+ 'CloseNetworkServer', 'ClosePack', 'ClosePreferences', 'CloseProgram', 'CloseScreen', 'CloseSubMenu', 'CloseWindow',
+ 'ColorRequester', 'ComboBoxGadget', 'CompareMemory', 'CompareMemoryString', 'ConnectionID', 'ConsoleColor',
+ 'ConsoleCursor', 'ConsoleError', 'ConsoleLocate', 'ConsoleTitle', 'ContainerGadget', 'CopyDirectory', 'CopyEntity',
+ 'CopyFile', 'CopyImage', 'CopyLight', 'CopyMaterial', 'CopyMemory', 'CopyMemoryString', 'CopyMesh', 'CopySprite',
+ 'CopyTexture', 'CopyXMLNode', 'Cos', 'CountBillboards', 'CountGadgetItems', 'CountLibraryFunctions', 'CountList',
+ 'CountMaterialLayers', 'CountProgramParameters', 'CountRenderedTriangles', 'CountString', 'CRC32Fingerprint',
+ 'CreateBillboardGroup', 'CreateCamera', 'CreateDirectory', 'CreateEntity', 'CreateFile', 'CreateGadgetList',
+ 'CreateImage', 'CreateLight', 'CreateMaterial', 'CreateMenu', 'CreateMesh', 'CreateMutex', 'CreateNetworkServer',
+ 'CreatePack', 'CreatePalette', 'CreateParticleEmitter', 'CreatePopupMenu', 'CreatePreferences', 'CreateSprite',
+ 'CreateSprite3D', 'CreateStatusBar', 'CreateTerrain', 'CreateTexture', 'CreateThread', 'CreateToolBar', 'CreateXML',
+ 'CreateXMLNode', 'DatabaseColumnName', 'DatabaseColumns', 'DatabaseColumnType', 'DatabaseDriverDescription',
+ 'DatabaseDriverName', 'DatabaseError', 'DatabaseQuery', 'DatabaseUpdate', 'Date', 'DateGadget', 'Day', 'DayOfWeek',
+ 'DayOfYear', 'DefaultPrinter', 'Defined', 'Delay', 'DeleteDirectory', 'DeleteElement', 'DeleteFile', 'DeleteXMLNode',
+ 'DESFingerprint', 'DesktopDepth', 'DesktopFrequency', 'DesktopHeight', 'DesktopMouseX', 'DesktopMouseY', 'DesktopName',
+ 'DesktopWidth', 'DirectoryEntryAttributes', 'DirectoryEntryDate', 'DirectoryEntryName', 'DirectoryEntrySize',
+ 'DirectoryEntryType', 'DisableGadget', 'DisableMaterialLighting', 'DisableMenuItem', 'DisableToolBarButton', 'DisableWindow',
+ 'DisASMCommand', 'DisplayAlphaSprite', 'DisplayPalette', 'DisplayPopupMenu', 'DisplayRGBFilter', 'DisplayShadowSprite',
+ 'DisplaySolidSprite', 'DisplaySprite', 'DisplaySprite3D', 'DisplayTranslucentSprite', 'DisplayTransparentSprite', 'DragFiles',
+ 'DragImage', 'DragOSFormats', 'DragPrivate', 'DragText', 'DrawAlphaImage', 'DrawImage', 'DrawingBuffer',
+ 'DrawingBufferPitch', 'DrawingBufferPixelFormat', 'DrawingFont', 'DrawingMode', 'DrawText', 'EditorGadget',
+ 'egrid_AddColumn', 'egrid_AddRows', 'egrid_AppendCells', 'egrid_ClearRows', 'egrid_CopyCells',
+ 'egrid_CreateCellCallback', 'egrid_CreateGrid', 'egrid_DeleteCells', 'egrid_FastDeleteCells', 'egrid_FreeGrid',
+ 'egrid_GetCellSelection', 'egrid_GetCellText', 'egrid_GetColumnOrderArray', 'egrid_HasSelectedCellChanged', 'egrid_Height',
+ 'egrid_HideEdit', 'egrid_HideGrid', 'egrid_MakeCellVisible', 'egrid_NumberOfColumns', 'egrid_NumberOfRows',
+ 'egrid_PasteCells', 'egrid_Register', 'egrid_RemoveCellCallback', 'egrid_RemoveColumn', 'egrid_RemoveRow', 'egrid_Resize',
+ 'egrid_SelectCell', 'egrid_SelectedColumn', 'egrid_SelectedRow', 'egrid_SetCellSelection', 'egrid_SetCellText',
+ 'egrid_SetColumnOrderArray', 'egrid_SetHeaderFont', 'egrid_SetHeaderHeight', 'egrid_SetOption', 'egrid_Width', 'egrid_x',
+ 'egrid_y', 'EjectAudioCD', 'ElapsedMilliseconds', 'Ellipse', 'EnableGadgetDrop', 'EnableGraphicalConsole',
+ 'EnableWindowDrop', 'EnableWorldCollisions', 'EnableWorldPhysics', 'Engine3DFrameRate', 'EntityAngleX',
+ 'EntityAnimationLength', 'EntityLocate', 'EntityMaterial', 'EntityMesh', 'EntityPhysicBody', 'EntityRenderMode',
+ 'EntityX', 'EntityY', 'EntityZ', 'EnvironmentVariableName', 'EnvironmentVariableValue', 'Eof', 'EventClient',
+ 'EventDropAction', 'EventDropBuffer', 'EventDropFiles', 'EventDropImage', 'EventDropPrivate', 'EventDropSize',
+ 'EventDropText', 'EventDropType', 'EventDropX', 'EventDropY', 'EventGadget', 'EventlParam', 'EventMenu', 'EventServer',
+ 'EventType', 'EventWindow', 'EventwParam', 'ExamineDatabaseDrivers', 'ExamineDesktops', 'ExamineDirectory',
+ 'ExamineEnvironmentVariables', 'ExamineIPAddresses', 'ExamineJoystick', 'ExamineKeyboard', 'ExamineLibraryFunctions',
+ 'ExamineMouse', 'ExaminePreferenceGroups', 'ExaminePreferenceKeys', 'ExamineScreenModes', 'ExamineWorldCollisions',
+ 'ExamineXMLAttributes', 'ExplorerComboGadget', 'ExplorerListGadget', 'ExplorerTreeGadget', 'ExportXML',
+ 'ExportXMLSize', 'FileBuffersSize', 'FileID', 'FileSeek', 'FileSize', 'FillArea', 'FindString', 'FinishDirectory',
+ 'FirstDatabaseRow', 'FirstElement', 'FirstWorldCollisionEntity', 'FlipBuffers', 'FlushFileBuffers', 'Fog', 'FontID',
+ 'FontRequester', 'FormatDate', 'FormatXML', 'Frame3DGadget', 'FreeBillboardGroup', 'FreeCamera', 'FreeEntity',
+ 'FreeFont', 'FreeGadget', 'FreeImage', 'FreeLight', 'FreeMaterial', 'FreeMemory', 'FreeMenu', 'FreeMesh',
+ 'FreeModule', 'FreeMovie', 'FreeMutex', 'FreePalette', 'FreeParticleEmitter', 'FreeSound', 'FreeSprite',
+ 'FreeSprite3D', 'FreeStatusBar', 'FreeTexture', 'FreeToolBar', 'FreeXML', 'FrontColor', 'GadgetHeight', 'GadgetID',
+ 'GadgetItemID', 'GadgetToolTip', 'GadgetType', 'GadgetWidth', 'GadgetX', 'GadgetY', 'GetActiveGadget',
+ 'GetActiveWindow', 'GetClientIP', 'GetClientPort', 'GetClipboardImage', 'GetClipboardText', 'GetCurrentDirectory',
+ 'GetCurrentEIP', 'GetDatabaseDouble', 'GetDatabaseFloat', 'GetDatabaseLong', 'GetDatabaseQuad', 'GetDatabaseString',
+ 'GetDisASMString', 'GetEntityAnimationTime', 'GetEntityFriction', 'GetEntityMass', 'GetEnvironmentVariable',
+ 'GetErrorAddress', 'GetErrorCounter', 'GetErrorDescription', 'GetErrorDLL', 'GetErrorLineNR', 'GetErrorModuleName',
+ 'GetErrorNumber', 'GetErrorRegister', 'GetExtensionPart', 'GetFileAttributes', 'GetFileDate', 'GetFilePart', 'GetFunction',
+ 'GetFunctionEntry', 'GetGadgetAttribute', 'GetGadgetColor', 'GetGadgetData', 'GetGadgetFont',
+ 'GetGadgetItemAttribute', 'GetGadgetItemColor', 'GetGadgetItemData', 'GetGadgetItemState', 'GetGadgetItemText',
+ 'GetGadgetState', 'GetGadgetText', 'GetHomeDirectory', 'GetMenuItemState', 'GetMenuItemText', 'GetMenuTitleText',
+ 'GetModulePosition', 'GetModuleRow', 'GetPaletteColor', 'GetPathPart', 'GetTemporaryDirectory',
+ 'GetToolBarButtonState', 'GetWindowColor', 'GetWindowState', 'GetWindowTitle', 'GetXMLAttribute', 'GetXMLEncoding',
+ 'GetXMLNodeName', 'GetXMLNodeOffset', 'GetXMLNodeText', 'GetXMLStandalone', 'GoToEIP', 'GrabImage', 'GrabSprite',
+ 'Green', 'Hex', 'HexQ', 'HideBillboardGroup', 'HideEntity', 'HideGadget', 'HideLight', 'HideMenu', 'HideParticleEmitter',
+ 'HideWindow', 'Hostname', 'Hour', 'HyperLinkGadget', 'ImageDepth', 'ImageGadget', 'ImageHeight', 'ImageID',
+ 'ImageOutput', 'ImageWidth', 'InitAudioCD', 'InitEngine3D', 'InitJoystick', 'InitKeyboard', 'InitMouse', 'InitMovie',
+ 'InitNetwork', 'InitPalette', 'InitScintilla', 'InitSound', 'InitSprite', 'InitSprite3D', 'Inkey', 'Input', 'InputRequester',
+ 'InsertElement', 'Int', 'IntQ', 'IPAddressField', 'IPAddressGadget', 'IPString', 'IsBillboardGroup', 'IsCamera', 'IsDatabase',
+ 'IsDirectory', 'IsEntity', 'IsFile', 'IsFont', 'IsGadget', 'IsImage', 'IsLibrary', 'IsLight', 'IsMaterial', 'IsMenu', 'IsMesh',
+ 'IsModule', 'IsMovie', 'IsPalette', 'IsParticleEmitter', 'IsProgram', 'IsScreenActive', 'IsSound', 'IsSprite', 'IsSprite3D',
+ 'IsStatusBar', 'IsSysTrayIcon', 'IsTexture', 'IsThread', 'IsToolBar', 'IsWindow', 'IsXML', 'JoystickAxisX', 'JoystickAxisY',
+ 'JoystickButton', 'KeyboardInkey', 'KeyboardMode', 'KeyboardPushed', 'KeyboardReleased', 'KillProgram', 'KillThread',
+ 'LastElement', 'LCase', 'Left', 'Len', 'LibraryFunctionAddress', 'LibraryFunctionName', 'LibraryID', 'LightColor',
+ 'LightLocate', 'LightSpecularColor', 'Line', 'LineXY', 'ListIconGadget', 'ListIndex', 'ListViewGadget', 'LoadFont',
+ 'LoadImage', 'LoadMesh', 'LoadModule', 'LoadMovie', 'LoadPalette', 'LoadSound', 'LoadSprite', 'LoadTexture',
+ 'LoadWorld', 'LoadXML', 'Loc', 'LockMutex', 'Lof', 'Log', 'Log10', 'LSet', 'LTrim', 'MainXMLNode', 'MakeIPAddress',
+ 'MaterialAmbientColor', 'MaterialBlendingMode', 'MaterialDiffuseColor', 'MaterialFilteringMode', 'MaterialID',
+ 'MaterialShadingMode', 'MaterialSpecularColor', 'MD5FileFingerprint', 'MD5Fingerprint', 'MDIGadget', 'MemorySize',
+ 'MemoryStringLength', 'MenuBar', 'MenuHeight', 'MenuID', 'MenuItem', 'MenuTitle', 'MeshID', 'MessageRequester',
+ 'Mid', 'Minute', 'ModuleVolume', 'Month', 'MouseButton', 'MouseDeltaX', 'MouseDeltaY', 'MouseLocate', 'MouseWheel',
+ 'MouseX', 'MouseY', 'MoveBillboard', 'MoveBillboardGroup', 'MoveCamera', 'MoveEntity', 'MoveLight', 'MoveMemory',
+ 'MoveParticleEmitter', 'MoveXMLNode', 'MovieAudio', 'MovieHeight', 'MovieInfo', 'MovieLength', 'MovieSeek',
+ 'MovieStatus', 'MovieWidth', 'NetworkClientEvent', 'NetworkServerEvent', 'NewPrinterPage', 'NextDatabaseDriver',
+ 'NextDatabaseRow', 'NextDirectoryEntry', 'NextElement', 'NextEnvironmentVariable', 'NextIPAddress',
+ 'NextLibraryFunction', 'NextPackFile', 'NextPreferenceGroup', 'NextPreferenceKey', 'NextScreenMode',
+ 'NextSelectedFileName', 'NextWorldCollision', 'NextXMLAttribute', 'NextXMLNode', 'OffsetOf', 'OnErrorExit',
+ 'OnErrorGosub', 'OnErrorGoto', 'OnErrorResume', 'OpenComPort', 'OpenConsole', 'OpenDatabase',
+ 'OpenDatabaseRequester', 'OpenFile', 'OpenFileRequester', 'OpenGadgetList', 'OpenHelp', 'OpenLibrary',
+ 'OpenNetworkConnection', 'OpenPack', 'OpenPreferences', 'OpenScreen', 'OpenSubMenu', 'OpenWindow',
+ 'OpenWindowedScreen', 'OptionGadget', 'OSVersion', 'PackerCallback', 'PackFileSize', 'PackMemory', 'PanelGadget',
+ 'ParentXMLNode', 'Parse3DScripts', 'ParseDate', 'ParticleColorFader', 'ParticleColorRange', 'ParticleEmissionRate',
+ 'ParticleEmitterDirection', 'ParticleEmitterLocate', 'ParticleEmitterX', 'ParticleEmitterY', 'ParticleEmitterZ',
+ 'ParticleMaterial', 'ParticleSize', 'ParticleTimeToLive', 'ParticleVelocity', 'PathRequester', 'PauseAudioCD',
+ 'PauseMovie', 'PauseThread', 'PeekB', 'PeekC', 'PeekD', 'PeekF', 'PeekL', 'PeekQ', 'PeekS', 'PeekW', 'PlayAudioCD',
+ 'PlayModule', 'PlayMovie', 'PlaySound', 'Plot', 'Point', 'PokeB', 'PokeC', 'PokeD', 'PokeF', 'PokeL', 'PokeQ', 'PokeS',
+ 'PokeW', 'Pow', 'PreferenceComment', 'PreferenceGroup', 'PreferenceGroupName', 'PreferenceKeyName',
+ 'PreferenceKeyValue', 'PreviousDatabaseRow', 'PreviousElement', 'PreviousXMLNode', 'Print', 'PrinterOutput',
+ 'PrinterPageHeight', 'PrinterPageWidth', 'PrintN', 'PrintRequester', 'ProgramExitCode', 'ProgramFilename',
+ 'ProgramID', 'ProgramParameter', 'ProgramRunning', 'ProgressBarGadget', 'Random', 'RandomSeed', 'RawKey',
+ 'ReadByte', 'ReadCharacter', 'ReadConsoleData', 'ReadData', 'ReadDouble', 'ReadFile', 'ReadFloat', 'ReadLong',
+ 'ReadPreferenceDouble', 'ReadPreferenceFloat', 'ReadPreferenceLong', 'ReadPreferenceQuad',
+ 'ReadPreferenceString', 'ReadProgramData', 'ReadProgramError', 'ReadProgramString', 'ReadQuad', 'ReadString',
+ 'ReadStringFormat', 'ReadWord', 'ReAllocateMemory', 'ReceiveNetworkData', 'ReceiveNetworkFile', 'Red',
+ 'Reg_DeleteEmptyKey', 'Reg_DeleteKey', 'Reg_DeleteValue', 'Reg_GetErrorMsg', 'Reg_GetErrorNr',
+ 'Reg_GetValueTyp', 'Reg_ListSubKey', 'Reg_ListSubValue', 'Reg_ReadBinary', 'Reg_ReadExpandString',
+ 'Reg_ReadLong', 'Reg_ReadMultiLineString', 'Reg_ReadQuad', 'Reg_ReadString', 'Reg_WriteBinary',
+ 'Reg_WriteExpandString', 'Reg_WriteLong', 'Reg_WriteMultiLineString', 'Reg_WriteQuad', 'Reg_WriteString',
+ 'ReleaseMouse', 'RemoveBillboard', 'RemoveEnvironmentVariable', 'RemoveGadgetColumn', 'RemoveGadgetItem',
+ 'RemoveKeyboardShortcut', 'RemoveMaterialLayer', 'RemovePreferenceGroup', 'RemovePreferenceKey',
+ 'RemoveString', 'RemoveSysTrayIcon', 'RemoveXMLAttribute', 'RenameFile', 'RenderMovieFrame', 'RenderWorld',
+ 'ReplaceString', 'ResetList', 'ResizeBillboard', 'ResizeEntity', 'ResizeGadget', 'ResizeImage', 'ResizeMovie',
+ 'ResizeParticleEmitter', 'ResizeWindow', 'ResolveXMLAttributeName', 'ResolveXMLNodeName', 'ResumeAudioCD',
+ 'ResumeMovie', 'ResumeThread', 'RGB', 'Right', 'RootXMLNode', 'RotateBillboardGroup', 'RotateCamera',
+ 'RotateEntity', 'RotateMaterial', 'RotateSprite3D', 'Round', 'RSet', 'RTrim', 'RunProgram', 'SaveFileRequester',
+ 'SaveImage', 'SaveSprite', 'SaveXML', 'ScaleEntity', 'ScaleMaterial', 'ScintillaGadget', 'ScintillaSendMessage',
+ 'ScreenID', 'ScreenModeDepth', 'ScreenModeHeight', 'ScreenModeRefreshRate', 'ScreenModeWidth',
+ 'ScreenOutput', 'ScrollAreaGadget', 'ScrollBarGadget', 'ScrollMaterial', 'Second', 'SecondWorldCollisionEntity',
+ 'SelectedFilePattern', 'SelectedFontColor', 'SelectedFontName', 'SelectedFontSize', 'SelectedFontStyle',
+ 'SelectElement', 'SendNetworkData', 'SendNetworkFile', 'SendNetworkString', 'SetActiveGadget',
+ 'SetActiveWindow', 'SetClipboardImage', 'SetClipboardText', 'SetCurrentDirectory', 'SetDragCallback',
+ 'SetDropCallback', 'SetEntityAnimationTime', 'SetEntityFriction', 'SetEntityMass', 'SetEnvironmentVariable',
+ 'SetErrorNumber', 'SetFileAttributes', 'SetFileDate', 'SetFrameRate', 'SetGadgetAttribute', 'SetGadgetColor',
+ 'SetGadgetData', 'SetGadgetFont', 'SetGadgetItemAttribute', 'SetGadgetItemColor', 'SetGadgetItemData',
+ 'SetGadgetItemState', 'SetGadgetItemText', 'SetGadgetState', 'SetGadgetText', 'SetMenuItemState',
+ 'SetMenuItemText', 'SetMenuTitleText', 'SetMeshData', 'SetModulePosition', 'SetPaletteColor', 'SetRefreshRate',
+ 'SetToolBarButtonState', 'SetWindowCallback', 'SetWindowColor', 'SetWindowState', 'SetWindowTitle',
+ 'SetXMLAttribute', 'SetXMLEncoding', 'SetXMLNodeName', 'SetXMLNodeOffset', 'SetXMLNodeText',
+ 'SetXMLStandalone', 'Sin', 'SizeOf', 'SkyBox', 'SkyDome', 'SmartWindowRefresh', 'SortArray', 'SortList',
+ 'SortStructuredArray', 'SortStructuredList', 'SoundFrequency', 'SoundPan', 'SoundVolume', 'Space',
+ 'SpinGadget', 'SplitterGadget', 'Sprite3DBlendingMode', 'Sprite3DQuality', 'SpriteCollision', 'SpriteDepth',
+ 'SpriteHeight', 'SpriteID', 'SpriteOutput', 'SpritePixelCollision', 'SpriteWidth', 'Sqr', 'Start3D', 'StartDrawing',
+ 'StartPrinting', 'StartSpecialFX', 'StatusBarHeight', 'StatusBarIcon', 'StatusBarID', 'StatusBarText',
+ 'StickyWindow', 'Stop3D', 'StopAudioCD', 'StopDrawing', 'StopModule', 'StopMovie', 'StopPrinting',
+ 'StopSound', 'StopSpecialFX', 'Str', 'StrD', 'StrF', 'StringByteLength', 'StringField', 'StringGadget', 'StrQ',
+ 'StrU', 'Subsystem', 'SwapElements', 'SysTrayIconToolTip', 'Tan', 'TerrainHeight', 'TextGadget', 'TextHeight',
+ 'TextureHeight', 'TextureID', 'TextureOutput', 'TextureWidth', 'TextWidth', 'ThreadID', 'ThreadPriority',
+ 'ToolBarHeight', 'ToolBarID', 'ToolBarImageButton', 'ToolBarSeparator', 'ToolBarStandardButton',
+ 'ToolBarToolTip', 'TrackBarGadget', 'TransformSprite3D', 'TransparentSpriteColor', 'TreeGadget', 'Trim',
+ 'TruncateFile', 'TryLockMutex', 'UCase', 'UnlockMutex', 'UnpackMemory', 'UseAudioCD', 'UseBuffer',
+ 'UseGadgetList', 'UseJPEGImageDecoder', 'UseJPEGImageEncoder', 'UseODBCDatabase', 'UseOGGSoundDecoder',
+ 'UsePNGImageDecoder', 'UsePNGImageEncoder', 'UseTGAImageDecoder', 'UseTIFFImageDecoder', 'Val', 'ValD',
+ 'ValF', 'ValQ', 'WaitProgram', 'WaitThread', 'WaitWindowEvent', 'WebGadget', 'WebGadgetPath', 'WindowEvent',
+ 'WindowHeight', 'WindowID', 'WindowMouseX', 'WindowMouseY', 'WindowOutput', 'WindowWidth', 'WindowX',
+ 'WindowY', 'WorldGravity', 'WorldShadows', 'WriteByte', 'WriteCharacter', 'WriteConsoleData', 'WriteData',
+ 'WriteDouble', 'WriteFloat', 'WriteLong', 'WritePreferenceDouble', 'WritePreferenceFloat', 'WritePreferenceLong',
+ 'WritePreferenceQuad', 'WritePreferenceString', 'WriteProgramData', 'WriteProgramString', 'WriteProgramStringN',
+ 'WriteQuad', 'WriteString', 'WriteStringFormat', 'WriteStringN', 'WriteWord', 'XMLAttributeName', 'XMLAttributeValue',
+ 'XMLChildCount', 'XMLError', 'XMLErrorLine', 'XMLErrorPosition', 'XMLNodeFromID', 'XMLNodeFromPath', 'XMLNodePath',
+ 'XMLNodeType', 'XMLStatus', 'Year', 'ZoomSprite3D'
+ ),
+ 3 => array(
+ // some ASM instructions
+ 'AAA', 'AAD', 'AAM', 'AAS', 'ADC', 'ADD', 'AND', 'ARPL', 'BOUND', 'BSF', 'BSR', 'BSWAP', 'BT', 'BTC', 'BTR',
+ 'BTS', 'CALL', 'CBW', 'CDQ', 'CLC', 'CLD', 'CLI', 'CLTS', 'CMC', 'CMP', 'CMPS', 'CMPXCHG', 'CWD', 'CWDE',
+ 'DAA', 'DAS', 'DB', 'DD', 'DEC', 'DIV', 'DW', 'ENTER', 'ESC', 'F2XM1', 'FABS', 'FADD', 'FCHS', 'FCLEX',
+ 'FCOM', 'FDIV', 'FDIVR', 'FFREE', 'FINCSTP', 'FINIT', 'FLD', 'FLD1', 'FLDCW', 'FMUL', 'FNOP', 'FPATAN',
+ 'FPREM', 'FRNDINT', 'FSAVE', 'FSCALE', 'FSETPM', 'FSIN', 'FSQRT', 'FST', 'FSTENV', 'FSTSW', 'FSUB',
+ 'FSUBR', 'FTST', 'FUCOM', 'FWAIT', 'FXAM', 'FXCH', 'FXTRACT', 'FYL2X', 'FYL2XP1', 'HLT', 'IDIV', 'IMUL',
+ 'IN', 'INC', 'INS', 'INT', 'INTO', 'INVLPG', 'IRET', 'IRETD', 'JA', 'JAE', 'JB', 'JBE', 'JC', 'JCXZ', 'JE', 'JECXZ',
+ 'JG', 'JGE', 'JL', 'JLE', 'JMP', 'JNA', 'JNAE', 'JNB', 'JNBE', 'JNC', 'JNE', 'JNG', 'JNGE', 'JNL', 'JNLE', 'JNO', 'JNP',
+ 'JNS', 'JNZ', 'JO', 'JP', 'JPE', 'JPO', 'JS', 'JZ', 'LAHF', 'LAR', 'LDS', 'LEA', 'LEAVE', 'LES', 'LFS', 'LGDT', 'LGS',
+ 'LIDT', 'LLDT', 'LMSW', 'LOCK', 'LODS', 'LOOP', 'LOOPE', 'LOOPNE', 'LOOPNZ', 'LOOPZ', 'LSL', 'LSS', 'LTR',
+ 'MOV', 'MOVS', 'MOVSX', 'MOVZX', 'MUL', 'NEG', 'NOP', 'NOT', 'OR', 'OUT', 'OUTS', 'POP', 'POPA', 'POPAD',
+ 'POPF', 'POPFD', 'PUSH', 'PUSHA', 'PUSHAD', 'PUSHF', 'PUSHFD', 'RCL', 'RCR', 'REP', 'REPE', 'REPNE',
+ 'REPNZ', 'REPZ', 'RET', 'RETF', 'ROL', 'ROR', 'SAHF', 'SAL', 'SAR', 'SBB', 'SCAS', 'SETAE', 'SETB', 'SETBE',
+ 'SETC', 'SETE', 'SETG', 'SETGE', 'SETL', 'SETLE', 'SETNA', 'SETNAE', 'SETNB', 'SETNC', 'SETNE', 'SETNG',
+ 'SETNGE', 'SETNL', 'SETNLE', 'SETNO', 'SETNP', 'SETNS', 'SETNZ', 'SETO', 'SETP', 'SETPE', 'SETPO',
+ 'SETS', 'SETZ', 'SGDT', 'SHL', 'SHLD', 'SHR', 'SHRD', 'SIDT', 'SLDT', 'SMSW', 'STC', 'STD', 'STI',
+ 'STOS', 'STR', 'SUB', 'TEST', 'VERR', 'VERW', 'WAIT', 'WBINVD', 'XCHG', 'XLAT', 'XLATB', 'XOR'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '+', '-', '*', '/', '\\', '>', '<', '=', '<=', '>=', '&', '|', '!', '~', '<>', '>>', '<<', '%'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000066; font-weight: bold;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #000fff;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #ff0000; font-style: italic;',
+ 'MULTI' => 'color: #ff0000; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000066;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #CC0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '\\'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => false,
+ 1 => false
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pycon.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pycon.php
new file mode 100644
index 00000000..ac2b34d0
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pycon.php
@@ -0,0 +1,64 @@
+<?php
+/*************************************************************************************
+ * python.php
+ * ----------
+ * Author: Roberto Rossi (rsoftware@altervista.org)
+ * Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/08/30
+ *
+ * Python language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/12/18
+ * - Added missing functions and keywords. Also added two new Python 3.0 types. SF#2441839
+ * 2005/05/26
+ * - Modifications by Tim (tim@skreak.com): added more keyword categories, tweaked colors
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/08/30 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+//This
+require(dirname(__FILE__).'/python.php');
+
+$language_data['LANG_NAME'] = 'Python (console mode)';
+
+$language_data['STRICT_MODE_APPLIES'] = GESHI_ALWAYS;
+$language_data['SCRIPT_DELIMITERS'][-1] = '/^(>>>).*?$(?:\n\.\.\..*?$)*($)/m';
+$language_data['HIGHLIGHT_STRICT_BLOCK'][-1] = true;
+
+$language_data['STYLES']['SCRIPT'][-1] = 'color: #222222;';
+
+if(!isset($language_data['COMMENT_REGEXP'])) {
+ $language_data['COMMENT_REGEXP'] = array();
+}
+
+$language_data['COMMENT_REGEXP'][-1] = '/(?:^|\A\s)(?:>>>|\.\.\.)/m';
+$language_data['STYLES']['COMMENTS'][-1] = 'color: #444444;';
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pys60.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pys60.php
new file mode 100644
index 00000000..59c67fac
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/pys60.php
@@ -0,0 +1,273 @@
+<?php
+/**************************************************************************************
+ * pys60.php
+ * ----------
+ * Author: Sohan Basak (ronnie.basak96 @gmail.com)
+ * Copyright: (c) 2012 Sohan Basak (http://tothepower.tk), Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2012/05/03
+ *
+ * Python for S60 language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * No Changes Till Date
+ *
+ * The python.php file is extended to pys60.php with required modifications
+ *
+ * NOTES
+ *
+ * -I have kept the ":" in Reserved chars, so that it gets highlighted differently than brackets and/or symbols
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Python for S60',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', "'", '"""',"'''",'""','""'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+
+ /*
+ ** Set 1: reserved words
+ ** http://python.org/doc/current/ref/keywords.html
+ */
+ 1 => array(
+ 'and', 'del', 'for', 'is', 'raise', 'assert', 'elif', 'from', 'lambda', 'return', 'break',
+ 'else', 'global', 'not', 'try', 'class', 'except', 'if', 'or', 'while', 'continue', 'exec',
+ 'import', 'pass', 'yield', 'def', 'finally', 'in', 'print', "<<", ">>", "as"
+ ),
+
+ /*
+ ** Set 2: builtins
+ ** http://python.org/doc/current/lib/built-in-funcs.html
+ */
+ 2 => array(
+ '__import__', 'abs', 'basestring', 'bool', 'callable', 'chr', 'classmethod', 'cmp',
+ 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile',
+ 'file', 'filter', 'float', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help',
+ 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'list', 'locals',
+ 'long', 'map', 'max', 'min', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'range',
+ 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
+ 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode',
+ 'vars', 'xrange', 'zip',
+ // Built-in constants: http://python.org/doc/current/lib/node35.html
+ 'False', 'True', 'None', 'NotImplemented', 'Ellipsis',
+ // Built-in Exceptions: http://python.org/doc/current/lib/module-exceptions.html
+ 'Exception', 'StandardError', 'ArithmeticError', 'LookupError', 'EnvironmentError',
+ 'AssertionError', 'AttributeError', 'EOFError', 'FloatingPointError', 'IOError',
+ 'ImportError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'MemoryError', 'NameError',
+ 'NotImplementedError', 'OSError', 'OverflowError', 'ReferenceError', 'RuntimeError',
+ 'StopIteration', 'SyntaxError', 'SystemError', 'SystemExit', 'TypeError',
+ 'UnboundlocalError', 'UnicodeError', 'UnicodeEncodeError', 'UnicodeDecodeError',
+ 'UnicodeTranslateError', 'ValueError', 'WindowsError', 'ZeroDivisionError', 'Warning',
+ 'UserWarning', 'DeprecationWarning', 'PendingDeprecationWarning', 'SyntaxWarning',
+ 'RuntimeWarning', 'FutureWarning',
+ //Symbian Errors
+ "SymbianError", "KernelError",
+ // self: this is a common python convention (but not a reserved word)
+ 'self'
+ ),
+
+ /*
+ ** Set 3: standard library
+ ** http://python.org/doc/current/lib/modindex.html
+ */
+ 3 => array(
+ '__builtin__', '__future__', '__main__', '_winreg', 'aifc', 'AL', 'al', 'anydbm',
+ 'array', 'asynchat', 'asyncore', 'atexit', 'audioop', 'base64', 'BaseHTTPServer',
+ 'Bastion', 'binascii', 'binhex', 'bisect', 'bsddb', 'bz2', 'calendar', 'cd', 'cgi',
+ 'CGIHTTPServer', 'cgitb', 'chunk', 'cmath', 'cmd', 'code', 'codecs', 'codeop',
+ 'collections', 'colorsys', 'commands', 'compileall', 'compiler',
+ 'ConfigParser', 'Cookie', 'cookielib', 'copy', 'copy_reg', 'cPickle', 'crypt',
+ 'cStringIO', 'csv', 'curses', 'datetime', 'dbhash', 'dbm', 'decimal', 'DEVICE',
+ 'difflib', 'dircache', 'dis', 'distutils', 'dl', 'doctest', 'DocXMLRPCServer', 'dumbdbm',
+ 'dummy_thread', 'dummy_threading', 'email', 'encodings', 'errno', 'exceptions', 'fcntl',
+ 'filecmp', 'fileinput', 'FL', 'fl', 'flp', 'fm', 'fnmatch', 'formatter', 'fpectl',
+ 'fpformat', 'ftplib', 'gc', 'gdbm', 'getopt', 'getpass', 'gettext', 'GL', 'gl', 'glob',
+ 'gopherlib', 'grp', 'gzip', 'heapq', 'hmac', 'hotshot', 'htmlentitydefs', 'htmllib',
+ 'HTMLParser', 'httplib', 'imageop', 'imaplib', 'imgfile', 'imghdr', 'imp', 'inspect',
+ 'itertools', 'jpeg', 'keyword', 'linecache', 'locale', 'logging', 'mailbox', 'mailcap',
+ 'marshal', 'math', 'md5', 'mhlib', 'mimetools', 'mimetypes', 'MimeWriter', 'mimify',
+ 'mmap', 'msvcrt', 'multifile', 'mutex', 'netrc', 'new', 'nis', 'nntplib', 'operator',
+ 'optparse', 'os', 'ossaudiodev', 'parser', 'pdb', 'pickle', 'pickletools', 'pipes',
+ 'pkgutil', 'platform', 'popen2', 'poplib', 'posix', 'posixfile', 'pprint', 'profile',
+ 'pstats', 'pty', 'pwd', 'py_compile', 'pyclbr', 'pydoc', 'Queue', 'quopri', 'random',
+ 're', 'readline', 'resource', 'rexec', 'rgbimg', 'rlcompleter',
+ 'robotparser', 'sched', 'ScrolledText', 'select', 'sets', 'sgmllib', 'sha', 'shelve',
+ 'shlex', 'shutil', 'signal', 'SimpleHTTPServer', 'SimpleXMLRPCServer', 'site', 'smtpd',
+ 'smtplib', 'sndhdr', 'socket', 'SocketServer', 'stat', 'statcache', 'statvfs', 'string',
+ 'StringIO', 'stringprep', 'struct', 'subprocess', 'sunau', 'SUNAUDIODEV', 'sunaudiodev',
+ 'symbol', 'sys', 'syslog', 'tabnanny', 'tarfile', 'telnetlib', 'tempfile', 'termios',
+ 'test', 'textwrap', 'thread', 'threading', 'time', 'timeit', 'Tix', 'Tkinter', 'token',
+ 'tokenize', 'traceback', 'tty', 'turtle', 'types', 'unicodedata', 'unittest', 'urllib2',
+ 'urllib', 'urlparse', 'user', 'UserDict', 'UserList', 'UserString', 'uu', 'warnings',
+ 'wave', 'weakref', 'webbrowser', 'whichdb', 'whrandom', 'winsound', 'xdrlib', 'xml',
+ 'xmllib', 'xmlrpclib', 'zipfile', 'zipimport', 'zlib', "os.path", "sys.path",
+
+ //PythonS60 Standard Library
+ //http://pys60.garage.maemo.org/doc/s60/
+ //These are the standard modules in the archive
+
+ "appuifw", "globalui","e32", "telephone", "aosocket", "btsocket",
+ "sysinfo","camera","graphics","keycapture","key_codes","topwindow", "gles",
+ "glcanvas","sensor", "audio","messaging", "inbox","location","positioning",
+ "contacts", "e32calendar", "e32db","e32dbm","logs","scriptext",
+ "series60_console",
+
+ //These are external but very often usable modules
+
+ "appuifw2","ArchetypeUI","elementtree","lightblue",
+ "activaprofile","Adjustor","akntextutils","aosocketnativenew",
+ "appreciation","applicationmanager","appswitch","atextit","bt_teror","btconsole",
+ "btswitch","cElementTree","cenrep","cerealizer","cl_gui","clipboard",
+ "clipboard_CHN","debugger","decompile2",
+ "dir_iter","download","easydb","ECenrep","Edit_find","efeature","elocation","envy",
+ "EProfile","erestart","error","esyagent","Execwap","exprofile","fastcamera",
+ "feature","fgimage","filebrowser","firmware","fold","fonts","fraction","FTP",
+ "ftplibnew","fy_manager","fy_menu","gles_utils","gps_location","hack",
+ "HTML2TXT","iapconnect","icon_image","image_decoder",
+ "ini","interactive_console","inting","key_modifiers","key_tricks","keypress",
+ "landmarks","lite_fm","locationacq","locationrequestor",
+ "logo","markupbase","mbm","mbm2","minidb","miniinfo","MISC",
+ "misty","Msg","ntpath","odict","Paintbox","pathinfo","pexif","pickcolor",
+ "powlite_fm","powlite_fm2","powlite_fm3","powlite_fme","prgbar","prodb",
+ "profileengine","progressbar","progressbartw","progressnotes",
+ "ProgressBarTW2","proshivka","py_upload","pyConnection","PyFileMan",
+ "pykeylock","PyPyc","pyqq","pys60crypto","pys60usb","rfc822",
+ "RUSOS","scmk","scrollpage","SISFIELDS","SISFIELD","sisfile",
+ "SISINFO","sisreader","Sistools","smidi","smsreject","speechy","sre_compile",
+ "sre_constants","sre_parse","sre","sysagent","syslang","TextMan",
+ "textrenderer","TextWrap","topwind","tsocket","uikludge","uikludges","uitricks",
+ "walkfile","wallpaper","wfm_lite",
+ "wif_keys","wif","window","wlanmgmt","wlantools","wt_color","wt_requesters",
+ "zhkey",
+
+ //These are recent additions
+ "miffile"
+ ),
+
+ /*
+ ** Set 4: special methods
+ ** http://python.org/doc/current/ref/specialnames.html
+ */
+ 4 => array(
+ ///*
+ //// Iterator types: http://python.org/doc/current/lib/typeiter.html
+ //'__iter__', 'next',
+ //// String types: http://python.org/doc/current/lib/string-methods.html
+ //'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs',
+ //'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle',
+ //'isupper', 'join', 'ljust', 'lower', 'lstrip', 'replace', 'rfind', 'rindex', 'rjust',
+ //'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
+ //'translate', 'upper', 'zfill',
+ // */
+
+ // Basic customization: http://python.org/doc/current/ref/customization.html
+ '__new__', '__init__', '__del__', '__repr__', '__str__',
+ '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__cmp__', '__rcmp__',
+ '__hash__', '__nonzero__', '__unicode__', '__dict__',
+ // Attribute access: http://python.org/doc/current/ref/attribute-access.html
+ '__setattr__', '__delattr__', '__getattr__', '__getattribute__', '__get__', '__set__',
+ '__delete__', '__slots__',
+ // Class creation, callable objects
+ '__metaclass__', '__call__',
+ // Container types: http://python.org/doc/current/ref/sequence-types.html
+ '__len__', '__getitem__', '__setitem__', '__delitem__', '__iter__', '__contains__',
+ '__getslice__', '__setslice__', '__delslice__',
+ // Numeric types: http://python.org/doc/current/ref/numeric-types.html
+ '__abs__','__add__','__and__','__coerce__','__div__','__divmod__','__float__',
+ '__hex__','__iadd__','__isub__','__imod__','__idiv__','__ipow__','__iand__',
+ '__ior__','__ixor__', '__ilshift__','__irshift__','__invert__','__int__',
+ '__long__','__lshift__',
+ '__mod__','__mul__','__neg__','__oct__','__or__','__pos__','__pow__',
+ '__radd__','__rdiv__','__rdivmod__','__rmod__','__rpow__','__rlshift__','__rrshift__',
+ '__rshift__','__rsub__','__rmul__','__rand__','__rxor__','__ror__',
+ '__sub__','__xor__'
+ )
+
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '*', '&', '%', '!', ';', '<', '>', '?', '`'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #006000;font-weight:bold;', // Reserved
+ 2 => 'color: #800950;font-size:105%', // Built-ins + self
+ 3 => 'color: #003399;font-size:106%', // Standard lib
+ 4 => 'color: #0000cd;' // Special methods
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style:italic;font-size:92%',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #930; font-weight: bold;font-size:105%'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: maroon;font-size:102%;padding:2px'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #666;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #2356F8;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: navy;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66ccFF;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/python.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/python.php
new file mode 100644
index 00000000..ec9b17e6
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/python.php
@@ -0,0 +1,244 @@
+<?php
+/*************************************************************************************
+ * python.php
+ * ----------
+ * Author: Roberto Rossi (rsoftware@altervista.org)
+ * Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/08/30
+ *
+ * Python language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/12/18
+ * - Added missing functions and keywords. Also added two new Python 3.0 types. SF#2441839
+ * 2005/05/26
+ * - Modifications by Tim (tim@skreak.com): added more keyword categories, tweaked colors
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/08/30 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Python',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ //Longest quotemarks ALWAYS first
+ 'QUOTEMARKS' => array('"""', "'''", '"', "'"),
+ 'ESCAPE_CHAR' => '\\',
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX_0O | GESHI_NUMBER_HEX_PREFIX |
+ GESHI_NUMBER_FLT_NONSCI | GESHI_NUMBER_FLT_NONSCI_F |
+ GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+
+ /*
+ ** Set 1: reserved words
+ ** http://python.org/doc/current/ref/keywords.html
+ */
+ 1 => array(
+ 'and', 'del', 'for', 'is', 'raise', 'assert', 'elif', 'from', 'lambda', 'return', 'break',
+ 'else', 'global', 'not', 'try', 'class', 'except', 'if', 'or', 'while', 'continue', 'exec',
+ 'import', 'pass', 'yield', 'def', 'finally', 'in', 'print', 'with', 'as', 'nonlocal'
+ ),
+
+ /*
+ ** Set 2: builtins
+ ** http://python.org/doc/current/lib/built-in-funcs.html
+ */
+ 2 => array(
+ '__import__', 'abs', 'basestring', 'bool', 'callable', 'chr', 'classmethod', 'cmp',
+ 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile',
+ 'file', 'filter', 'float', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help',
+ 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'list', 'locals',
+ 'long', 'map', 'max', 'min', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'range',
+ 'raw_input', 'reduce', 'reload', 'reversed', 'round', 'set', 'setattr', 'slice',
+ 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode',
+ 'vars', 'xrange', 'zip',
+ // Built-in constants: http://python.org/doc/current/lib/node35.html
+ 'False', 'True', 'None', 'NotImplemented', 'Ellipsis',
+ // Built-in Exceptions: http://python.org/doc/current/lib/module-exceptions.html
+ 'Exception', 'StandardError', 'ArithmeticError', 'LookupError', 'EnvironmentError',
+ 'AssertionError', 'AttributeError', 'EOFError', 'FloatingPointError', 'IOError',
+ 'ImportError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'MemoryError', 'NameError',
+ 'NotImplementedError', 'OSError', 'OverflowError', 'ReferenceError', 'RuntimeError',
+ 'StopIteration', 'SyntaxError', 'SystemError', 'SystemExit', 'TypeError',
+ 'UnboundlocalError', 'UnicodeError', 'UnicodeEncodeError', 'UnicodeDecodeError',
+ 'UnicodeTranslateError', 'ValueError', 'WindowsError', 'ZeroDivisionError', 'Warning',
+ 'UserWarning', 'DeprecationWarning', 'PendingDeprecationWarning', 'SyntaxWarning',
+ 'RuntimeWarning', 'FutureWarning',
+ // self: this is a common python convention (but not a reserved word)
+ 'self',
+ // other
+ 'any', 'all'
+ ),
+
+ /*
+ ** Set 3: standard library
+ ** http://python.org/doc/current/lib/modindex.html
+ */
+ 3 => array(
+ '__builtin__', '__future__', '__main__', '_winreg', 'aifc', 'AL', 'al', 'anydbm',
+ 'array', 'asynchat', 'asyncore', 'atexit', 'audioop', 'base64', 'BaseHTTPServer',
+ 'Bastion', 'binascii', 'binhex', 'bisect', 'bsddb', 'bz2', 'calendar', 'cd', 'cgi',
+ 'CGIHTTPServer', 'cgitb', 'chunk', 'cmath', 'cmd', 'code', 'codecs', 'codeop',
+ 'collections', 'colorsys', 'commands', 'compileall', 'compiler',
+ 'ConfigParser', 'Cookie', 'cookielib', 'copy', 'copy_reg', 'cPickle', 'crypt',
+ 'cStringIO', 'csv', 'curses', 'datetime', 'dbhash', 'dbm', 'decimal', 'DEVICE',
+ 'difflib', 'dircache', 'dis', 'distutils', 'dl', 'doctest', 'DocXMLRPCServer', 'dumbdbm',
+ 'dummy_thread', 'dummy_threading', 'email', 'encodings', 'errno', 'exceptions', 'fcntl',
+ 'filecmp', 'fileinput', 'FL', 'fl', 'flp', 'fm', 'fnmatch', 'formatter', 'fpectl',
+ 'fpformat', 'ftplib', 'gc', 'gdbm', 'getopt', 'getpass', 'gettext', 'GL', 'gl', 'glob',
+ 'gopherlib', 'grp', 'gzip', 'heapq', 'hmac', 'hotshot', 'htmlentitydefs', 'htmllib',
+ 'HTMLParser', 'httplib', 'imageop', 'imaplib', 'imgfile', 'imghdr', 'imp', 'inspect',
+ 'itertools', 'jpeg', 'keyword', 'linecache', 'locale', 'logging', 'mailbox', 'mailcap',
+ 'marshal', 'math', 'md5', 'mhlib', 'mimetools', 'mimetypes', 'MimeWriter', 'mimify',
+ 'mmap', 'msvcrt', 'multifile', 'mutex', 'netrc', 'new', 'nis', 'nntplib', 'operator',
+ 'optparse', 'os', 'ossaudiodev', 'parser', 'pdb', 'pickle', 'pickletools', 'pipes',
+ 'pkgutil', 'platform', 'popen2', 'poplib', 'posix', 'posixfile', 'pprint', 'profile',
+ 'pstats', 'pty', 'pwd', 'py_compile', 'pyclbr', 'pydoc', 'Queue', 'quopri', 'random',
+ 're', 'readline', 'repr', 'resource', 'rexec', 'rfc822', 'rgbimg', 'rlcompleter',
+ 'robotparser', 'sched', 'ScrolledText', 'select', 'sets', 'sgmllib', 'sha', 'shelve',
+ 'shlex', 'shutil', 'signal', 'SimpleHTTPServer', 'SimpleXMLRPCServer', 'site', 'smtpd',
+ 'smtplib', 'sndhdr', 'socket', 'SocketServer', 'stat', 'statcache', 'statvfs', 'string',
+ 'StringIO', 'stringprep', 'struct', 'subprocess', 'sunau', 'SUNAUDIODEV', 'sunaudiodev',
+ 'symbol', 'sys', 'syslog', 'tabnanny', 'tarfile', 'telnetlib', 'tempfile', 'termios',
+ 'test', 'textwrap', 'thread', 'threading', 'time', 'timeit', 'Tix', 'Tkinter', 'token',
+ 'tokenize', 'traceback', 'tty', 'turtle', 'types', 'unicodedata', 'unittest', 'urllib2',
+ 'urllib', 'urlparse', 'user', 'UserDict', 'UserList', 'UserString', 'uu', 'warnings',
+ 'wave', 'weakref', 'webbrowser', 'whichdb', 'whrandom', 'winsound', 'xdrlib', 'xml',
+ 'xmllib', 'xmlrpclib', 'zipfile', 'zipimport', 'zlib',
+ // Python 3.0
+ 'bytes', 'bytearray'
+ ),
+
+ /*
+ ** Set 4: special methods
+ ** http://python.org/doc/current/ref/specialnames.html
+ */
+ 4 => array(
+ /*
+ // Iterator types: http://python.org/doc/current/lib/typeiter.html
+ '__iter__', 'next',
+ // String types: http://python.org/doc/current/lib/string-methods.html
+ 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs',
+ 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle',
+ 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'replace', 'rfind', 'rindex', 'rjust',
+ 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
+ 'translate', 'upper', 'zfill',
+ */
+ // Basic customization: http://python.org/doc/current/ref/customization.html
+ '__new__', '__init__', '__del__', '__repr__', '__str__',
+ '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__cmp__', '__rcmp__',
+ '__hash__', '__nonzero__', '__unicode__', '__dict__',
+ // Attribute access: http://python.org/doc/current/ref/attribute-access.html
+ '__setattr__', '__delattr__', '__getattr__', '__getattribute__', '__get__', '__set__',
+ '__delete__', '__slots__',
+ // Class creation, callable objects
+ '__metaclass__', '__call__',
+ // Container types: http://python.org/doc/current/ref/sequence-types.html
+ '__len__', '__getitem__', '__setitem__', '__delitem__', '__iter__', '__contains__',
+ '__getslice__', '__setslice__', '__delslice__',
+ // Numeric types: http://python.org/doc/current/ref/numeric-types.html
+ '__abs__','__add__','__and__','__coerce__','__div__','__divmod__','__float__',
+ '__hex__','__iadd__','__isub__','__imod__','__idiv__','__ipow__','__iand__',
+ '__ior__','__ixor__', '__ilshift__','__irshift__','__invert__','__int__',
+ '__long__','__lshift__',
+ '__mod__','__mul__','__neg__','__oct__','__or__','__pos__','__pow__',
+ '__radd__','__rdiv__','__rdivmod__','__rmod__','__rpow__','__rlshift__','__rrshift__',
+ '__rshift__','__rsub__','__rmul__','__rand__','__rxor__','__ror__',
+ '__sub__','__xor__'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '<', '>', '=', '!', '<=', '>=', //·comparison·operators
+ '~', '@', //·unary·operators
+ ';', ',' //·statement·separator
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #ff7700;font-weight:bold;', // Reserved
+ 2 => 'color: #008000;', // Built-ins + self
+ 3 => 'color: #dc143c;', // Standard lib
+ 4 => 'color: #0000cd;' // Special methods
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: black;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #483d8b;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff4500;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: black;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/q.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/q.php
new file mode 100644
index 00000000..ade9928d
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/q.php
@@ -0,0 +1,149 @@
+<?php
+/*************************************************************************************
+ * q.php
+ * -----
+ * Author: Ian Roddis (ian.roddis@proteanmind.net)
+ * Copyright: (c) 2008 Ian Roddis (http://proteanmind.net)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/01/21
+ *
+ * q/kdb+ language file for GeSHi.
+ *
+ * Based on information available from code.kx.com
+ *
+ * CHANGES
+ * -------
+ * 2010/01/21 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated <1.0.0>)
+ * -------------------------
+ * - Fix the handling of single line comments
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'q/kdb+',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ 2 => '/ \s\/.*/', # This needs to get fixed up, since it won't catch some instances
+ # Multi line comments (Moved from REGEXPS)
+ 3 => '/^\/\s*?\n.*?\n\\\s*?\n/smi'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'TAB_WIDTH' => 4,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'abs', 'acos', 'all', 'and', 'any', 'asc', 'asin', 'asof', 'atan', 'attr', 'avg', 'avgs', 'bin', 'ceiling',
+ 'cols', 'cor', 'cos', 'count', 'cov', 'cross', 'cut', 'deltas', 'desc', 'dev', 'differ', 'distinct',
+ 'div', 'each', 'enlist', 'eval', 'except', 'exec', 'exit', 'exp', 'fills', 'first', 'flip', 'floor',
+ 'fkeys', 'get', 'getenv', 'group', 'gtime', 'hclose', 'hcount', 'hdel', 'hopen', 'hsym', 'iasc', 'idesc',
+ 'in', 'insert', 'inter', 'inv', 'joins', 'key', 'keys', 'last', 'like', 'load', 'log', 'lower',
+ 'lsq', 'ltime', 'ltrim', 'mavg', 'max', 'maxs', 'mcount', 'md5', 'mdev', 'med', 'meta', 'min', 'mins',
+ 'mmax', 'mmin', 'mmu', 'mod', 'msum', 'neg', 'next', 'not', 'null', 'or', 'over', 'parse', 'peach',
+ 'plist', 'prd', 'prds', 'prev', 'rand', 'rank', 'ratios', 'raze', 'read0', 'read1', 'reciprocal',
+ 'reverse', 'rload', 'rotate', 'rsave', 'rtrim', 'save', 'scan', 'set', 'setenv', 'show', 'signum',
+ 'sin', 'sqrt', 'ss', 'ssr', 'string', 'sublist', 'sum', 'sums', 'sv', 'system', 'tables', 'tan', 'til', 'trim',
+ 'txf', 'type', 'ungroup', 'union', 'upper', 'upsert', 'value', 'var', 'view', 'views', 'vs',
+ 'wavg', 'within', 'wsum', 'xasc', 'xbar', 'xcol', 'xcols', 'xdesc', 'xexp', 'xgroup', 'xkey',
+ 'xlog', 'xprev', 'xrank'
+ ),
+ # kdb database template keywords
+ 2 => array(
+ 'aj', 'by', 'delete', 'fby', 'from', 'ij', 'lj', 'pj', 'select', 'uj', 'update', 'where', 'wj',
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '?', '#', ',', '_', '@', '.', '^', '~', '$', '!', '\\', '\\', '/:', '\:', "'", "':", '::', '+', '-', '%', '*'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #009900; font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #666666; font-style: italic;',
+ 3 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #660099; font-weight: bold;',
+ 3 => 'color: #660099; font-weight: bold;',
+ 4 => 'color: #660099; font-weight: bold;',
+ 5 => 'color: #006699; font-weight: bold;',
+ 'HARD' => '',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #990000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #208080;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color:#800080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI => 'color:#800080;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ 2 => 'color: #999900;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'REGEXPS' => array(
+ # Symbols
+ 2 => '`[^\s"]*',
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ ),
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/qbasic.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/qbasic.php
new file mode 100644
index 00000000..3345e3c6
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/qbasic.php
@@ -0,0 +1,162 @@
+<?php
+/*************************************************************************************
+ * qbasic.php
+ * ----------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/20
+ *
+ * QBasic/QuickBASIC language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2004/11/27 (1.0.3)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.2)
+ * - Added support for URLs
+ * 2004/08/05 (1.0.1)
+ * - Added support for symbols
+ * - Removed unnessecary slashes from some keywords
+ * 2004/07/14 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ * * Make sure all possible combinations of keywords with
+ * a space in them (EXIT FOR, END SELECT) are added
+ * to the first keyword group
+ * * Update colours, especially for the first keyword group
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+$language_data = array (
+ 'LANG_NAME' => 'QBasic/QuickBASIC',
+ 'COMMENT_SINGLE' => array(1 => "'"),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ //Single-Line Comments using REM command
+ 2 => "/\bREM.*?$/i",
+ //Line numbers
+ 3 => "/^\s*\d+/im"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT |
+ GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'DO', 'LOOP', 'WHILE', 'WEND', 'THEN', 'ELSE', 'ELSEIF', 'IF',
+ 'FOR', 'TO', 'NEXT', 'STEP', 'GOTO', 'GOSUB', 'CALL', 'CALLS',
+ 'SUB', 'FUNCTION', 'RETURN', 'RESUME', 'SELECT', 'CASE', 'UNTIL'
+ ),
+ 3 => array(
+ 'ABS', 'ABSOLUTE', 'ACCESS', 'ALIAS', 'AND', 'ANY', 'APPEND', 'AS', 'ASC', 'ATN',
+ 'BASE', 'BEEP', 'BINARY', 'BLOAD', 'BSAVE', 'BYVAL',
+ 'CDBL', 'CDECL', 'CHAIN', 'CHDIR', 'CHR$', 'CINT', 'CIRCLE', 'CLEAR',
+ 'CLNG', 'CLOSE', 'CLS', 'COM', 'COMMAND$', 'COMMON', 'CONST', 'COS', 'CSNG',
+ 'CSRLIN', 'CVD', 'CVDMBF', 'CVI', 'CVL', 'CVS', 'CVSMDF', 'DATA', 'DATE$',
+ 'DECLARE', 'DEF', 'FN', 'SEG', 'DEFDBL', 'DEFINT', 'DEFLNG', 'DEFSNG', 'DEFSTR',
+ 'DIM', 'DOUBLE', 'DRAW', 'END', 'ENVIRON', 'ENVIRON$', 'EOF', 'EQV', 'ERASE',
+ 'ERDEV', 'ERDEV$', 'ERL', 'ERR', 'ERROR', 'EXIT', 'EXP', 'FIELD', 'FILEATTR',
+ 'FILES', 'FIX', 'FRE', 'FREEFILE', 'GET', 'HEX$', 'IMP', 'INKEY$',
+ 'INP', 'INPUT', 'INPUT$', 'INSTR', 'INT', 'INTEGER', 'IOCTL', 'IOCTL$', 'IS',
+ 'KEY', 'KILL', 'LBOUND', 'LCASE$', 'LEFT$', 'LEN', 'LET', 'LINE', 'LIST', 'LOC',
+ 'LOCAL', 'LOCATE', 'LOCK', 'LOF', 'LOG', 'LONG', 'LPOS', 'LPRINT',
+ 'LSET', 'LTRIM$', 'MID$', 'MKD$', 'MKDIR', 'MKDMBF$', 'MKI$', 'MKL$',
+ 'MKS$', 'MKSMBF$', 'MOD', 'NAME', 'NOT', 'OCT$', 'OFF', 'ON', 'PEN', 'PLAY',
+ 'OPEN', 'OPTION', 'OR', 'OUT', 'OUTPUT',
+ 'PAINT', 'PALETTE', 'PCOPY', 'PEEK', 'PMAP', 'POINT', 'POKE', 'POS', 'PRESET',
+ 'PRINT', 'PSET', 'PUT', 'RANDOM', 'RANDOMIZE', 'READ', 'REDIM', 'RESET',
+ 'RESTORE', 'RIGHT$', 'RMDIR', 'RND', 'RSET', 'RTRIM$', 'RUN', 'SADD', 'SCREEN',
+ 'SEEK', 'SETMEM', 'SGN', 'SHARED', 'SHELL', 'SIGNAL', 'SIN', 'SINGLE', 'SLEEP',
+ 'SOUND', 'SPACE$', 'SPC', 'SQR', 'STATIC', 'STICK', 'STOP', 'STR$', 'STRIG',
+ 'STRING', 'STRING$', 'SWAP', 'SYSTEM', 'TAB', 'TAN', 'TIME$', 'TIMER',
+ 'TROFF', 'TRON', 'TYPE', 'UBOUND', 'UCASE$', 'UEVENT', 'UNLOCK', 'USING', 'VAL',
+ 'VARPTR', 'VARPTR$', 'VARSEG', 'VIEW', 'WAIT', 'WIDTH', 'WINDOW', 'WRITE', 'XOR'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', ',', '+', '-', '*', '/', '=', '<', '>', '^'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 3 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #a1a100;',
+ 3 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080;',
+ 2 => 'color: #808080;',
+ 3 => 'color: #8080C0;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ 1 => 'color: #cc66cc;',
+ 2 => 'color: #339933;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 3 => 'http://www.qbasicnews.com/qboho/qck{FNAMEL}.shtml'
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 1 => '&amp;(?:H[0-9a-fA-F]+|O[0-7]+)(?!\w)',
+ 2 => '#[0-9]+(?!\w)'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rails.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rails.php
new file mode 100644
index 00000000..65ddee88
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rails.php
@@ -0,0 +1,406 @@
+<?php
+/*************************************************************************************
+ * rails.php
+ * ---------
+ * Author: Moises Deniz
+ * Copyright: (c) 2005 Moises Deniz
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/03/21
+ *
+ * Ruby (with Ruby on Rails Framework) language file for GeSHi.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Rails',
+ 'COMMENT_SINGLE' => array(1 => "#"),
+ 'COMMENT_MULTI' => array("=begin" => "=end"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', '`','\''),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'alias', 'and', 'begin', 'break', 'case', 'class',
+ 'def', 'defined', 'do', 'else', 'elsif', 'end',
+ 'ensure', 'for', 'if', 'in', 'module', 'while',
+ 'next', 'not', 'or', 'redo', 'rescue', 'yield',
+ 'retry', 'super', 'then', 'undef', 'unless',
+ 'until', 'when', 'BEGIN', 'END', 'include'
+ ),
+ 2 => array(
+ '__FILE__', '__LINE__', 'false', 'nil', 'self', 'true',
+ 'return'
+ ),
+ 3 => array(
+ 'Array', 'Float', 'Integer', 'String', 'at_exit',
+ 'autoload', 'binding', 'caller', 'catch', 'chop', 'chop!',
+ 'chomp', 'chomp!', 'eval', 'exec', 'exit', 'exit!', 'fail',
+ 'fork', 'format', 'gets', 'global_variables', 'gsub', 'gsub!',
+ 'iterator?', 'lambda', 'load', 'local_variables', 'loop',
+ 'open', 'p', 'print', 'printf', 'proc', 'putc', 'puts',
+ 'raise', 'rand', 'readline', 'readlines', 'require', 'select',
+ 'sleep', 'split', 'sprintf', 'srand', 'sub', 'sub!', 'syscall',
+ 'system', 'trace_var', 'trap', 'untrace_var'
+ ),
+ 4 => array(
+ 'Abbrev', 'ArgumentError', 'Base64', 'Benchmark',
+ 'Benchmark::Tms', 'Bignum', 'Binding', 'CGI', 'CGI::Cookie',
+ 'CGI::HtmlExtension', 'CGI::QueryExtension',
+ 'CGI::Session', 'CGI::Session::FileStore',
+ 'CGI::Session::MemoryStore', 'Class', 'Comparable', 'Complex',
+ 'ConditionVariable', 'Continuation', 'Data',
+ 'Date', 'DateTime', 'Delegator', 'Dir', 'EOFError', 'ERB',
+ 'ERB::Util', 'Enumerable', 'Enumerable::Enumerator', 'Errno',
+ 'Exception', 'FalseClass', 'File',
+ 'File::Constants', 'File::Stat', 'FileTest', 'FileUtils',
+ 'FileUtils::DryRun', 'FileUtils::NoWrite',
+ 'FileUtils::StreamUtils_', 'FileUtils::Verbose', 'Find',
+ 'Fixnum', 'FloatDomainError', 'Forwardable', 'GC', 'Generator',
+ 'Hash', 'IO', 'IOError', 'Iconv', 'Iconv::BrokenLibrary',
+ 'Iconv::Failure', 'Iconv::IllegalSequence',
+ 'Iconv::InvalidCharacter', 'Iconv::InvalidEncoding',
+ 'Iconv::OutOfRange', 'IndexError', 'Interrupt', 'Kernel',
+ 'LoadError', 'LocalJumpError', 'Logger', 'Logger::Application',
+ 'Logger::Error', 'Logger::Formatter', 'Logger::LogDevice',
+ 'Logger::LogDevice::LogDeviceMutex', 'Logger::Severity',
+ 'Logger::ShiftingError', 'Marshal', 'MatchData',
+ 'Math', 'Matrix', 'Method', 'Module', 'Mutex', 'NameError',
+ 'NameError::message', 'NilClass', 'NoMemoryError',
+ 'NoMethodError', 'NotImplementedError', 'Numeric', 'Object',
+ 'ObjectSpace', 'Observable', 'PStore', 'PStore::Error',
+ 'Pathname', 'Precision', 'Proc', 'Process', 'Process::GID',
+ 'Process::Status', 'Process::Sys', 'Process::UID', 'Queue',
+ 'Range', 'RangeError', 'Rational', 'Regexp', 'RegexpError',
+ 'RuntimeError', 'ScriptError', 'SecurityError', 'Set',
+ 'Shellwords', 'Signal', 'SignalException', 'SimpleDelegator',
+ 'SingleForwardable', 'Singleton', 'SingletonClassMethods',
+ 'SizedQueue', 'SortedSet', 'StandardError', 'StringIO',
+ 'StringScanner', 'StringScanner::Error', 'Struct', 'Symbol',
+ 'SyncEnumerator', 'SyntaxError', 'SystemCallError',
+ 'SystemExit', 'SystemStackError', 'Tempfile',
+ 'Test::Unit::TestCase', 'Test::Unit', 'Test', 'Thread',
+ 'ThreadError', 'ThreadGroup',
+ 'ThreadsWait', 'Time', 'TrueClass', 'TypeError', 'URI',
+ 'URI::BadURIError', 'URI::Error', 'URI::Escape', 'URI::FTP',
+ 'URI::Generic', 'URI::HTTP', 'URI::HTTPS',
+ 'URI::InvalidComponentError', 'URI::InvalidURIError',
+ 'URI::LDAP', 'URI::MailTo', 'URI::REGEXP',
+ 'URI::REGEXP::PATTERN', 'UnboundMethod', 'Vector', 'YAML',
+ 'ZeroDivisionError', 'Zlib',
+ 'Zlib::BufError', 'Zlib::DataError', 'Zlib::Deflate',
+ 'Zlib::Error', 'Zlib::GzipFile', 'Zlib::GzipFile::CRCError',
+ 'Zlib::GzipFile::Error', 'Zlib::GzipFile::LengthError',
+ 'Zlib::GzipFile::NoFooter', 'Zlib::GzipReader',
+ 'Zlib::GzipWriter', 'Zlib::Inflate', 'Zlib::MemError',
+ 'Zlib::NeedDict', 'Zlib::StreamEnd', 'Zlib::StreamError',
+ 'Zlib::VersionError',
+ 'Zlib::ZStream',
+ 'ActionController::AbstractRequest',
+ 'ActionController::Assertions::DomAssertions',
+ 'ActionController::Assertions::ModelAssertions',
+ 'ActionController::Assertions::ResponseAssertions',
+ 'ActionController::Assertions::RoutingAssertions',
+ 'ActionController::Assertions::SelectorAssertions',
+ 'ActionController::Assertions::TagAssertions',
+ 'ActionController::Base',
+ 'ActionController::Benchmarking::ClassMethods',
+ 'ActionController::Caching',
+ 'ActionController::Caching::Actions',
+ 'ActionController::Caching::Actions::ActionCachePath',
+ 'ActionController::Caching::Fragments',
+ 'ActionController::Caching::Pages',
+ 'ActionController::Caching::Pages::ClassMethods',
+ 'ActionController::Caching::Sweeping',
+ 'ActionController::Components',
+ 'ActionController::Components::ClassMethods',
+ 'ActionController::Components::InstanceMethods',
+ 'ActionController::Cookies',
+ 'ActionController::Filters::ClassMethods',
+ 'ActionController::Flash',
+ 'ActionController::Flash::FlashHash',
+ 'ActionController::Helpers::ClassMethods',
+ 'ActionController::Integration::Session',
+ 'ActionController::IntegrationTest',
+ 'ActionController::Layout::ClassMethods',
+ 'ActionController::Macros',
+ 'ActionController::Macros::AutoComplete::ClassMethods',
+ 'ActionController::Macros::InPlaceEditing::ClassMethods',
+ 'ActionController::MimeResponds::InstanceMethods',
+ 'ActionController::Pagination',
+ 'ActionController::Pagination::ClassMethods',
+ 'ActionController::Pagination::Paginator',
+ 'ActionController::Pagination::Paginator::Page',
+ 'ActionController::Pagination::Paginator::Window',
+ 'ActionController::Rescue', 'ActionController::Resources',
+ 'ActionController::Routing',
+ 'ActionController::Scaffolding::ClassMethods',
+ 'ActionController::SessionManagement::ClassMethods',
+ 'ActionController::Streaming', 'ActionController::TestProcess',
+ 'ActionController::TestUploadedFile',
+ 'ActionController::UrlWriter',
+ 'ActionController::Verification::ClassMethods',
+ 'ActionMailer::Base', 'ActionView::Base',
+ 'ActionView::Helpers::ActiveRecordHelper',
+ 'ActionView::Helpers::AssetTagHelper',
+ 'ActionView::Helpers::BenchmarkHelper',
+ 'ActionView::Helpers::CacheHelper',
+ 'ActionView::Helpers::CaptureHelper',
+ 'ActionView::Helpers::DateHelper',
+ 'ActionView::Helpers::DebugHelper',
+ 'ActionView::Helpers::FormHelper',
+ 'ActionView::Helpers::FormOptionsHelper',
+ 'ActionView::Helpers::FormTagHelper',
+ 'ActionView::Helpers::JavaScriptHelper',
+ 'ActionView::Helpers::JavaScriptMacrosHelper',
+ 'ActionView::Helpers::NumberHelper',
+ 'ActionView::Helpers::PaginationHelper',
+ 'ActionView::Helpers::PrototypeHelper',
+ 'ActionView::Helpers::PrototypeHelper::JavaScriptGenerator::GeneratorMethods',
+ 'ActionView::Helpers::ScriptaculousHelper',
+ 'ActionView::Helpers::TagHelper',
+ 'ActionView::Helpers::TextHelper',
+ 'ActionView::Helpers::UrlHelper', 'ActionView::Partials',
+ 'ActionWebService::API::Method', 'ActionWebService::Base',
+ 'ActionWebService::Client::Soap',
+ 'ActionWebService::Client::XmlRpc',
+ 'ActionWebService::Container::ActionController::ClassMethods',
+ 'ActionWebService::Container::Delegated::ClassMethods',
+ 'ActionWebService::Container::Direct::ClassMethods',
+ 'ActionWebService::Invocation::ClassMethods',
+ 'ActionWebService::Scaffolding::ClassMethods',
+ 'ActionWebService::SignatureTypes', 'ActionWebService::Struct',
+ 'ActiveRecord::Acts::List::ClassMethods',
+ 'ActiveRecord::Acts::List::InstanceMethods',
+ 'ActiveRecord::Acts::NestedSet::ClassMethods',
+ 'ActiveRecord::Acts::NestedSet::InstanceMethods',
+ 'ActiveRecord::Acts::Tree::ClassMethods',
+ 'ActiveRecord::Acts::Tree::InstanceMethods',
+ 'ActiveRecord::Aggregations::ClassMethods',
+ 'ActiveRecord::Associations::ClassMethods',
+ 'ActiveRecord::AttributeMethods::ClassMethods',
+ 'ActiveRecord::Base',
+ 'ActiveRecord::Calculations::ClassMethods',
+ 'ActiveRecord::Callbacks',
+ 'ActiveRecord::ConnectionAdapters::AbstractAdapter',
+ 'ActiveRecord::ConnectionAdapters::Column',
+ 'ActiveRecord::ConnectionAdapters::DB2Adapter',
+ 'ActiveRecord::ConnectionAdapters::DatabaseStatements',
+ 'ActiveRecord::ConnectionAdapters::FirebirdAdapter',
+ 'ActiveRecord::ConnectionAdapters::FrontBaseAdapter',
+ 'ActiveRecord::ConnectionAdapters::MysqlAdapter',
+ 'ActiveRecord::ConnectionAdapters::OpenBaseAdapter',
+ 'ActiveRecord::ConnectionAdapters::OracleAdapter',
+ 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter',
+ 'ActiveRecord::ConnectionAdapters::Quoting',
+ 'ActiveRecord::ConnectionAdapters::SQLServerAdapter',
+ 'ActiveRecord::ConnectionAdapters::SQLiteAdapter',
+ 'ActiveRecord::ConnectionAdapters::SchemaStatements',
+ 'ActiveRecord::ConnectionAdapters::SybaseAdapter::ColumnWithIdentity',
+ 'ActiveRecord::ConnectionAdapters::SybaseAdapterContext',
+ 'ActiveRecord::ConnectionAdapters::TableDefinition',
+ 'ActiveRecord::Errors', 'ActiveRecord::Locking',
+ 'ActiveRecord::Locking::Optimistic',
+ 'ActiveRecord::Locking::Optimistic::ClassMethods',
+ 'ActiveRecord::Locking::Pessimistic',
+ 'ActiveRecord::Migration', 'ActiveRecord::Observer',
+ 'ActiveRecord::Observing::ClassMethods',
+ 'ActiveRecord::Reflection::ClassMethods',
+ 'ActiveRecord::Reflection::MacroReflection',
+ 'ActiveRecord::Schema', 'ActiveRecord::Timestamp',
+ 'ActiveRecord::Transactions::ClassMethods',
+ 'ActiveRecord::Validations',
+ 'ActiveRecord::Validations::ClassMethods',
+ 'ActiveRecord::XmlSerialization',
+ 'ActiveSupport::CachingTools::HashCaching',
+ 'ActiveSupport::CoreExtensions::Array::Conversions',
+ 'ActiveSupport::CoreExtensions::Array::Grouping',
+ 'ActiveSupport::CoreExtensions::Date::Conversions',
+ 'ActiveSupport::CoreExtensions::Hash::Conversions',
+ 'ActiveSupport::CoreExtensions::Hash::Conversions::ClassMethods',
+ 'ActiveSupport::CoreExtensions::Hash::Diff',
+ 'ActiveSupport::CoreExtensions::Hash::Keys',
+ 'ActiveSupport::CoreExtensions::Hash::ReverseMerge',
+ 'ActiveSupport::CoreExtensions::Integer::EvenOdd',
+ 'ActiveSupport::CoreExtensions::Integer::Inflections',
+ 'ActiveSupport::CoreExtensions::Numeric::Bytes',
+ 'ActiveSupport::CoreExtensions::Numeric::Time',
+ 'ActiveSupport::CoreExtensions::Pathname::CleanWithin',
+ 'ActiveSupport::CoreExtensions::Range::Conversions',
+ 'ActiveSupport::CoreExtensions::String::Access',
+ 'ActiveSupport::CoreExtensions::String::Conversions',
+ 'ActiveSupport::CoreExtensions::String::Inflections',
+ 'ActiveSupport::CoreExtensions::String::Iterators',
+ 'ActiveSupport::CoreExtensions::String::StartsEndsWith',
+ 'ActiveSupport::CoreExtensions::String::Unicode',
+ 'ActiveSupport::CoreExtensions::Time::Calculations',
+ 'ActiveSupport::CoreExtensions::Time::Calculations::ClassMethods',
+ 'ActiveSupport::CoreExtensions::Time::Conversions',
+ 'ActiveSupport::Multibyte::Chars',
+ 'ActiveSupport::Multibyte::Handlers::UTF8Handler',
+ 'Breakpoint', 'Builder::BlankSlate', 'Builder::XmlMarkup',
+ 'Fixtures',
+ 'HTML::Selector', 'HashWithIndifferentAccess', 'Inflector',
+ 'Inflector::Inflections', 'Mime', 'Mime::Type',
+ 'OCI8AutoRecover', 'TimeZone', 'XmlSimple'
+ ),
+ 5 => array(
+ 'image_tag', 'link_to', 'link_to_remote', 'javascript_include_tag',
+ 'assert_equal', 'assert_not_equal', 'before_filter',
+ 'after_filter', 'render', 'redirect_to', 'hide_action',
+ 'render_to_string', 'url_for', 'controller_name',
+ 'controller_class_name', 'controller_path', 'session',
+ 'render_component', 'render_component_as_string', 'cookie',
+ 'layout', 'flash', 'auto_complete_for', 'in_place_editor_for',
+ 'respond_to', 'paginate', 'current_page', 'each', 'first',
+ 'first_page', 'last_page', 'last', 'length', 'new', 'page_count',
+ 'previous', 'scaffold', 'send_data',
+ 'send_file', 'deliver', 'receive', 'error_messages_for',
+ 'error_message_on', 'form', 'input', 'stylesheet_link_tag',
+ 'stylesheet_path', 'content_for', 'select_date', 'ago',
+ 'month', 'day', 'check_box', 'fields_for', 'file_field',
+ 'form_for', 'hidden_field', 'text_area', 'password_field',
+ 'collection_select', 'options_for_select',
+ 'options_from_collection_for_select', 'file_field_tag',
+ 'form_for_tag', 'hidden_field_tag', 'text_area_tag',
+ 'password_field_tag', 'link_to_function', 'javascript_tag',
+ 'human_size', 'number_to_currency', 'pagination_links',
+ 'form_remote_tag', 'form_remote_for',
+ 'submit_to_remote', 'remote_function', 'observe_form',
+ 'observe_field', 'remote_form_for', 'options_for_ajax', 'alert',
+ 'call', 'assign', 'show', 'hide', 'insert_html', 'sortable',
+ 'toggle', 'visual_effect', 'replace', 'replace_html', 'remove',
+ 'save', 'save!', 'draggable', 'drop_receiving', 'literal',
+ 'draggable_element', 'drop_receiving_element', 'sortable_element',
+ 'content_tag', 'tag', 'link_to_image', 'link_to_if',
+ 'link_to_unless', 'mail_to', 'link_image_to', 'button_to',
+ 'current_page?', 'act_as_list', 'act_as_nested', 'act_as_tree',
+ 'has_many', 'has_one', 'belongs_to', 'has_many_and_belogns_to',
+ 'delete', 'destroy', 'destroy_all', 'clone', 'deep_clone', 'copy',
+ 'update', 'table_name', 'primary_key', 'sum', 'maximun', 'minimum',
+ 'count', 'size', 'after_save', 'after_create', 'before_save',
+ 'before_create', 'add_to_base', 'errors', 'add', 'validate',
+ 'validates_presence_of', 'validates_numericality_of',
+ 'validates_uniqueness_of', 'validates_length_of',
+ 'validates_format_of', 'validates_size_of', 'to_a', 'to_s',
+ 'to_xml', 'to_i'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '%', '&', '*', '|', '/', '<', '>',
+ '+', '-', '=>', '<<'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color:#9966CC; font-weight:bold;',
+ 2 => 'color:#0000FF; font-weight:bold;',
+ 3 => 'color:#CC0066; font-weight:bold;',
+ 4 => 'color:#CC00FF; font-weight:bold;',
+ 5 => 'color:#5A0A0A; font-weight:bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color:#008000; font-style:italic;',
+ 'MULTI' => 'color:#000080; font-style:italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color:#000099;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color:#006600; font-weight:bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color:#996600;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color:#006666;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color:#9900CC;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color:#006600; font-weight:bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color:#ff6633; font-weight:bold;',
+ 1 => 'color:#0066ff; font-weight:bold;',
+ 2 => 'color:#6666ff; font-weight:bold;',
+ 3 => 'color:#ff3333; font-weight:bold;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ 0 => array(
+ GESHI_SEARCH => "([[:space:]])(\\$[a-zA-Z_][a-zA-Z0-9_]*)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 1 => array(
+ GESHI_SEARCH => "([[:space:]])(@[a-zA-Z_][a-zA-Z0-9_]*)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 2 => "([A-Z][a-zA-Z0-9_]*::)+[A-Z][a-zA-Z0-9_]*", //Static OOP References
+ 3 => array(
+ GESHI_SEARCH => "([[:space:]]|\[|\()(:[a-zA-Z_][a-zA-Z0-9_]*)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<%' => '%>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rebol.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rebol.php
new file mode 100644
index 00000000..ea86c21c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rebol.php
@@ -0,0 +1,196 @@
+<?php
+/*************************************************************************************
+ * rebol.php
+ * --------
+ * Author: Lecanu Guillaume (Guillaume@LyA.fr)
+ * Copyright: (c) 2004-2005 Lecanu Guillaume (Guillaume@LyA.fr)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/12/22
+ *
+ * Rebol language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/01/26 (1.0.8.3)
+ * - Adapted language file to comply to GeSHi language file guidelines
+ * 2004/11/25 (1.0.3)
+ * - Added support for multiple object splitters
+ * - Fixed &new problem
+ * 2004/10/27 (1.0.2)
+ * - Added URL support
+ * - Added extra constants
+ * 2004/08/05 (1.0.1)
+ * - Added support for symbols
+ * 2004/07/14 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/07/14)
+ * -------------------------
+ * * Make sure the last few function I may have missed
+ * (like eval()) are included for highlighting
+ * * Split to several files - php4, php5 etc
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'REBOL',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array('rebol [' => ']', 'comment [' => ']'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'binary!','block!','char!','date!','decimal!','email!','file!',
+ 'hash!','integer!','issue!','list!','logic!','money!','none!',
+ 'object!','paren!','pair!','path!','string!','tag!','time!',
+ 'tuple!','url!',
+ ),
+ 2 => array(
+ 'all','any','attempt','break','catch','compose','disarm','dispatch',
+ 'do','do-events','does','either','else','exit','for','forall',
+ 'foreach','forever','forskip','func','function','halt','has','if',
+ 'launch','loop','next','quit','reduce','remove-each','repeat',
+ 'return','secure','switch','throw','try','until','wait','while',
+ ),
+ 3 => array(
+ 'about','abs','absolute','add','alert','alias','alter','and',
+ 'any-block?','any-function?','any-string?','any-type?','any-word?',
+ 'append','arccosine','arcsine','arctangent','array','as-pair',
+ 'ask','at','back','binary?','bind','bitset?','block?','brightness?',
+ 'browse','build-tag','caret-to-offset','center-face','change',
+ 'change-dir','char?','charset','checksum','choose','clean-path',
+ 'clear','clear-fields','close','comment','complement','component?',
+ 'compress','confirm','connected?','construct','context','copy',
+ 'cosine','datatype?','date?','debase','decimal?','decode-cgi',
+ 'decompress','dehex','delete','detab','difference','dir?','dirize',
+ 'divide','dump-face','dump-obj','echo','email?','empty?','enbase',
+ 'entab','equal?','error?','even?','event?','exclude','exists?',
+ 'exp','extract','fifth','file?','find','first','flash','focus',
+ 'form','found?','fourth','free','function?','get','get-modes',
+ 'get-word?','greater-or-equal?','greater?','hash?','head','head?',
+ 'help','hide','hide-popup','image?','import-email','in',
+ 'in-window?','index?','info?','inform','input','input?','insert',
+ 'integer?','intersect','issue?','join','last','layout','length?',
+ 'lesser-or-equal?','lesser?','library?','license','link?',
+ 'list-dir','list?','lit-path?','lit-word?','load','load-image',
+ 'log-10','log-2','log-e','logic?','lowercase','make','make-dir',
+ 'make-face','max','maximum','maximum-of','min','minimum',
+ 'minimum-of','modified?','mold','money?','multiply','native?',
+ 'negate','negative?','none?','not','not-equal?','now','number?',
+ 'object?','odd?','offset-to-caret','offset?','op?','open','or',
+ 'pair?','paren?','parse','parse-xml','path?','pick','poke','port?',
+ 'positive?','power','prin','print','probe','protect',
+ 'protect-system','query','random','read','read-io','recycle',
+ 'refinement?','reform','rejoin','remainder','remold','remove',
+ 'rename',
+ //'repeat',
+ 'repend','replace','request','request-color','request-date',
+ 'request-download','request-file','request-list','request-pass',
+ 'request-text','resend','reverse','routine?','same?','save',
+ 'script?','second','select','send','series?','set','set-modes',
+ 'set-net','set-path?','set-word?','show','show-popup','sign?',
+ 'sine','size-text','size?','skip','sort','source','span?',
+ 'split-path','square-root','strict-equal?','strict-not-equal?',
+ 'string?','struct?','stylize','subtract','suffix?','tag?','tail',
+ 'tail?','tangent','third','time?','to','to-binary','to-bitset',
+ 'to-block','to-char','to-date','to-decimal','to-email','to-file',
+ 'to-get-word','to-hash','to-hex','to-idate','to-image','to-integer',
+ 'to-issue','to-list','to-lit-path','to-lit-word','to-local-file',
+ 'to-logic','to-money','to-pair','to-paren','to-path',
+ 'to-rebol-file','to-refinement','to-set-path','to-set-word',
+ 'to-string','to-tag','to-time','to-tuple','to-url','to-word',
+ 'trace','trim','tuple?','type?','unfocus','union','unique',
+ 'unprotect','unset','unset?','unview','update','upgrade',
+ 'uppercase','url?','usage','use','value?','view','viewed?','what',
+ 'what-dir','within?','word?','write','write-io','xor','zero?',
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '!', '@', '%', '&', '*', '|', '/', '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+// 2 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+// 2 => 'includes/dico_rebol.php?word={FNAME}',
+// 3 => 'includes/dico_rebol.php?word={FNAME}'
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => "[\\$]{1,2}[a-zA-Z_][a-zA-Z0-9_]*",
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/reg.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/reg.php
new file mode 100644
index 00000000..157b2bd2
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/reg.php
@@ -0,0 +1,233 @@
+<?php
+/*************************************************************************************
+ * reg.php
+ * -------
+ * Author: Sean Hanna (smokingrope@gmail.com)
+ * Copyright: (c) 2006 Sean Hanna
+ * Release Version: 1.0.8.11
+ * Date Started: 03/15/2006
+ *
+ * Microsoft Registry Editor language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * - Updated and optimized most regular expressions
+ * 03/15/2006 (0.5.0)
+ * - Syntax File Created
+ * 04/27/2006 (0.9.5)
+ * - Syntax Coloring Cleaned Up
+ * - First Release
+ * 04/29/2006 (1.0.0)
+ * - Updated a few coloring settings
+ *
+ * TODO (updated 4/27/2006)
+ * -------------------------
+ * - Add a verification to the multi-line portion of the hex field regex
+ * for a '\' character on the line preceding the line of the multi-line
+ * hex field.
+ *
+ * KNOWN ISSUES (updated 4/27/2006)
+ * ---------------------------------
+ *
+ * - There are two regexes for the multiline hex value regex. The regex for
+ * all lines after the first does not verify that the previous line contains
+ * a line continuation character '\'. This regex also does not check for
+ * end of line as it should.
+ *
+ * - If number_highlighting is enabled during processing of this syntax file
+ * many of the regexps used will appear slightly incorrect.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+
+ ************************************************************************************/
+$language_data = array (
+ 'LANG_NAME' => 'Microsoft Registry',
+ 'COMMENT_SINGLE' => array(1 =>';'),
+ 'COMMENT_MULTI' => array( ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+// 1 => array(),
+// 2 => array(),
+ /* Registry Key Constants Not Used */
+ 3 => array(
+ 'HKEY_LOCAL_MACHINE',
+ 'HKEY_CLASSES_ROOT',
+ 'HKEY_CURRENT_USER',
+ 'HKEY_USERS',
+ 'HKEY_CURRENT_CONFIG',
+ 'HKEY_DYN_DATA',
+ 'HKLM', 'HKCR', 'HKCU', 'HKU', 'HKCC', 'HKDD'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '='
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+// 1 => false,
+// 2 => false,
+ 3 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+// 1 => 'color: #00CCFF;',
+// 2 => 'color: #0000FF;',
+ 3 => 'color: #800000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #009900;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'NUMBERS' => array(
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #00CCFF;',
+ 1 => 'color: #0000FF;',
+ 2 => '',
+ 3 => 'color: #0000FF;',
+ 4 => 'color: #0000FF;',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => 'color: #FF6600;',
+ )
+ ),
+ 'URLS' => array(
+// 1 => '',
+// 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ // Highlight Key Delimiters
+ 0 => array(
+ GESHI_SEARCH => '((^|\\n)\\s*)(\\\\\\[(.*)\\\\\\])(\\s*(\\n|$))',
+ GESHI_REPLACE => '\\3',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\5'
+// GESHI_CLASS => 'kw1'
+ ),
+ // Highlight File Format Header Version 5
+ 1 => array(
+ GESHI_SEARCH => '(^\s*)(Windows Registry Editor Version \d+\.\d+)(\s*$)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3',
+ GESHI_CLASS => 'geshi_registry_header'
+ ),
+ // Highlight File Format Header Version 4
+ 2 => array(
+ GESHI_SEARCH => '(^\\s*)(REGEDIT\s?\d+)(\s*$)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3',
+ GESHI_CLASS => 'geshi_registry_header'
+ ),
+ // Highlight dword: 32 bit integer values
+ 3 => array(
+ GESHI_SEARCH => '(=\s*)(dword:[0-9a-fA-F]{8})(\s*$)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+// GESHI_CLASS => 'kw2'
+ ),
+ // Highlight variable names
+ 4 => array(
+ GESHI_SEARCH => '(^\s*)(\&quot;.*?\&quot;)(\s*=)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3',
+ GESHI_CLASS => 'geshi_variable'
+ ),
+ // Highlight String Values
+ 5 => array(
+ GESHI_SEARCH => '(=\s*)(\&quot;.*?\&quot;)(\s*$)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3',
+ GESHI_CLASS => 'st0'
+ ),
+ // Highlight Hexadecimal Values (Single-Line and Multi-Line)
+ 6 => array(
+ GESHI_SEARCH => '(=\s*\n?\s*)(hex:[0-9a-fA-F]{2}(,(\\\s*\n\s*)?[0-9a-fA-F]{2})*)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '',
+ GESHI_CLASS => 'kw2'
+ ),
+ // Highlight Default Variable
+ 7 => array(
+ GESHI_SEARCH => '(^\s*)(@)(\s*=)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'm',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3',
+ GESHI_CLASS => 'geshi_variable'
+ ),
+ // Highlight GUID's found anywhere.
+ 8 => array(
+ GESHI_SEARCH => '(\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\})',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ GESHI_CLASS => 'geshi_guid'
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'NUMBERS' => GESHI_NEVER,
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rexx.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rexx.php
new file mode 100644
index 00000000..b3cb9322
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rexx.php
@@ -0,0 +1,162 @@
+<?php
+/*************************************************************************************
+ * rexx.php
+ * ---------------------------------
+ * Author: Jon Wolfers (sahananda@windhorse.biz)
+ * Contributors:
+ * - Walter Pachl (pachl@chello.at)
+ * Copyright: (c) 2008 Jon Wolfers, (c) 2012 Walter Pachl
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/01/07
+ *
+ * Rexx language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/07/29 (1.0.0)
+ * - tried to get it syntactically right
+ *
+ * TODO (updated 2012/07/29)
+ * -------------------------
+ * - Get it working on rosettacode.org
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'rexx',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'address', 'arg', 'attribute', 'call', 'constant', 'do',
+ 'drop', 'exit', 'forward', 'if',
+ 'interpret', 'iterate', 'leave', 'loop', 'nop', 'numeric',
+ 'options', 'parse', 'procedure', 'pull', 'push', 'queue',
+ 'raise', 'return', 'say', 'select', 'signal', 'trace'
+ ),
+ 2 => array(
+ 'by', 'digits', 'engineering', 'error', 'expose',
+ 'failure', 'for', 'forever', 'form', 'fuzz', 'halt',
+ 'name', 'novalue', 'off', 'on', 'over', 'scientific', 'source',
+ 'syntax', 'to', 'until', 'upper', 'version',
+ 'while', 'with'
+ ),
+ 3 => array(
+ 'else', 'end', 'otherwise', 'then', 'when'
+ ),
+ 4 => array(
+ 'rc', 'result', 'sigl'
+ ),
+ 5 => array(
+ 'placeholderforoorexxdirectives'
+ ),
+ 6 => array(
+ 'abbrev', 'abs', 'beep', 'bitand', 'bitor',
+ 'bitxor', 'b2x', 'center', 'centre', 'changestr', 'charin',
+ 'charout', 'chars', 'compare', 'condition', 'copies',
+ 'countstr', 'c2d', 'c2x', 'datatype', 'date', 'delstr',
+ 'delword', 'directory', 'd2c', 'd2x', 'endlocal',
+ 'errortext', 'filespec', 'format', 'insert',
+ 'lastpos', 'left', 'length', 'linein', 'lineout', 'lines',
+ 'lower', 'max', 'min', 'overlay', 'pos', 'queued', 'random',
+ 'reverse', 'right', 'rxfuncadd', 'rxfuncdrop', 'rxfuncquery',
+ 'rxqueue', 'setlocal', 'sign', 'sourceline', 'space',
+ 'stream', 'strip', 'substr', 'subword', 'symbol', 'time',
+ 'translate', 'trunc', 'userid', 'value',
+ 'var', 'verify', 'word', 'wordindex', 'wordlength', 'wordpos',
+ 'words', 'xrange', 'x2b', 'x2c', 'x2d'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '<', '>', '=', '+', '-', '*', '**', '/', '|', '%', '^', '&', ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #ff0000; font-weight: bold;',
+ 3 => 'color: #00ff00; font-weight: bold;',
+ 4 => 'color: #0000ff; font-weight: bold;',
+ 5 => 'color: #880088; font-weight: bold;',
+ 6 => 'color: #888800; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666;',
+ 'MULTI' => 'color: #808080;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/robots.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/robots.php
new file mode 100644
index 00000000..0b75f711
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/robots.php
@@ -0,0 +1,100 @@
+<?php
+/*************************************************************************************
+ * robots.php
+ * --------
+ * Author: Christian Lescuyer (cl@goelette.net)
+ * Copyright: (c) 2006 Christian Lescuyer http://xtian.goelette.info
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/02/17
+ *
+ * robots.txt language file for GeSHi.
+ *
+ * 2006/02/17 (1.0.0)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'robots.txt',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(1 => "/^Comment:.*?/m"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'Allow', 'Crawl-delay', 'Disallow', 'Request-rate', 'Robot-version',
+ 'Sitemap', 'User-agent', 'Visit-time'
+ )
+ ),
+ 'SYMBOLS' => array(
+ ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://www.robotstxt.org/wc/norobots.html'
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rpmspec.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rpmspec.php
new file mode 100644
index 00000000..fd6a561f
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rpmspec.php
@@ -0,0 +1,133 @@
+<?php
+/*************************************************************************************
+ * rpmspec.php
+ * ---------------------------------
+ * Author: Paul Grinberg (gri6507 TA unity-linux TOD org)
+ * Copyright: (c) 2010 Paul Grinberg
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/04/27
+ *
+ * RPM Spec language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/04/27 (0.1)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'RPM Specification File',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'QUOTEMARKS' => array('"','`'),
+ 'ESCAPE_CHAR' => '\\',
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ ),
+ 'KEYWORDS' => array(
+ ),
+ 'SYMBOLS' => array(
+ '<', '>', '=',
+ '!', '@', '~', '&', '|', '^',
+ '+','-', '*', '/', '%',
+ ',', ';', '?', '.', ':'
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;',
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #009999;',
+ 3 => 'color: #000000; font-weight: bold;',
+ 4 => 'color: #ff6600; font-style: italic;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'REGEXPS' => array(
+ 1 => array(
+ // search for generic macros
+ GESHI_SEARCH => '(%{?[a-zA-Z0-9_]+}?)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ 2 => array(
+ // search for special macros
+ GESHI_SEARCH => '(%(?:define|patch\d*|mklibname|mkrel|configure\S+|makeinstall\S+|make_session|make|defattr|config|doc|setup))',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ 3 => array (
+ // special definitions
+ GESHI_SEARCH => '((?:summary|license|buildroot|buildrequires|provides|version|release|source\d*|group|buildarch|autoreqprov|provides|obsoletes|vendor|distribution|suggests|autoreq|autoprov|conflicts|name|url|requires|patch\d*):)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ 4 => array (
+ // section delimiting words
+ GESHI_SEARCH => '(%(?:description|package|prep|build|install|clean|postun|preun|post|pre|files|changelog))',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '',
+ ),
+ ),
+ 'URLS' => array(),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rsplus.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rsplus.php
new file mode 100644
index 00000000..e8a4e722
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/rsplus.php
@@ -0,0 +1,483 @@
+<?php
+/*************************************************************************************
+ * rsplus.php
+ * ———–
+ * Author: Ron Fredericks (ronf@LectureMaker.com)
+ * Contributors:
+ * - Benilton Carvalho (beniltoncarvalho@gmail.com)
+ * - Fernando Henrique Ferraz Pereira da Rosa (mentus@gmail.com)
+ * Copyright: (c) 2009 Ron Fredericks (http://www.LectureMaker.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/03/28
+ *
+ * R language file for GeSHi.
+ *
+ * CHANGES
+ * ——-
+ * 2009/04/06
+ * - Add references to Sekhon’s R Package docs
+ * 2009/03/29 (1.0.8.5)
+ * - First Release
+ * 2009/07/16 (1.0.8.6)
+ * - Added functions from base packages (Benilton Carvalho - carvalho@bclab.org)
+ *
+ * References
+ * ———-
+ * Some online R Package documentation:
+ * http://sekhon.berkeley.edu/library/index.html 2.4 docs
+ * http://astrostatistics.psu.edu/su07/R/html 2.5 docs
+ *
+ * Another R GeSHi with no meat?
+ * http://organicdesign.co.nz/GeSHi/R.php
+ * SourceForge R discussion:
+ * http://sourceforge.net/tracker/?func=detail&aid=2276025&group_id=114997&atid=670234
+ *
+ * TODO (updated 2007/02/06)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'R / S+',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', "'"),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'else','global','in', 'otherwise','persistent',
+ ),
+ 2 => array( // base package
+ '$.package_version', '$<-', '$<-.data.frame', 'abbreviate', 'abs', 'acos', 'acosh', 'addNA', 'addTaskCallback',
+ 'agrep', 'alist', 'all', 'all.equal', 'all.equal.character', 'all.equal.default', 'all.equal.factor',
+ 'all.equal.formula', 'all.equal.language', 'all.equal.list', 'all.equal.numeric', 'all.equal.POSIXct',
+ 'all.equal.raw', 'all.names', 'all.vars', 'any', 'aperm', 'append', 'apply', 'Arg', 'args', 'array', 'as.array',
+ 'as.array.default', 'as.call', 'as.character', 'as.character.condition', 'as.character.Date', 'as.character.default',
+ 'as.character.error', 'as.character.factor', 'as.character.hexmode', 'as.character.numeric_version', 'as.character.octmode',
+ 'as.character.POSIXt', 'as.character.srcref', 'as.complex', 'as.data.frame', 'as.data.frame.array', 'as.data.frame.AsIs',
+ 'as.data.frame.character', 'as.data.frame.complex', 'as.data.frame.data.frame', 'as.data.frame.Date', 'as.data.frame.default',
+ 'as.data.frame.difftime', 'as.data.frame.factor', 'as.data.frame.integer', 'as.data.frame.list', 'as.data.frame.logical',
+ 'as.data.frame.matrix', 'as.data.frame.model.matrix', 'as.data.frame.numeric', 'as.data.frame.numeric_version',
+ 'as.data.frame.ordered', 'as.data.frame.POSIXct', 'as.data.frame.POSIXlt', 'as.data.frame.raw', 'as.data.frame.table',
+ 'as.data.frame.ts', 'as.data.frame.vector', 'as.Date', 'as.Date.character', 'as.Date.date', 'as.Date.dates',
+ 'as.Date.default', 'as.Date.factor', 'as.Date.numeric', 'as.Date.POSIXct', 'as.Date.POSIXlt', 'as.difftime', 'as.double',
+ 'as.double.difftime', 'as.double.POSIXlt', 'as.environment', 'as.expression', 'as.expression.default', 'as.factor',
+ 'as.function', 'as.function.default', 'as.hexmode', 'as.integer', 'as.list', 'as.list.data.frame', 'as.list.default',
+ 'as.list.environment', 'as.list.factor', 'as.list.function', 'as.list.numeric_version', 'as.logical', 'as.matrix',
+ 'as.matrix.data.frame', 'as.matrix.default', 'as.matrix.noquote', 'as.matrix.POSIXlt', 'as.name', 'as.null', 'as.null.default',
+ 'as.numeric', 'as.numeric_version', 'as.octmode', 'as.ordered', 'as.package_version', 'as.pairlist', 'as.POSIXct',
+ 'as.POSIXct.date', 'as.POSIXct.Date', 'as.POSIXct.dates', 'as.POSIXct.default', 'as.POSIXct.numeric', 'as.POSIXct.POSIXlt',
+ 'as.POSIXlt', 'as.POSIXlt.character', 'as.POSIXlt.date', 'as.POSIXlt.Date', 'as.POSIXlt.dates', 'as.POSIXlt.default',
+ 'as.POSIXlt.factor', 'as.POSIXlt.numeric', 'as.POSIXlt.POSIXct', 'as.qr', 'as.raw', 'as.real', 'as.single',
+ 'as.single.default', 'as.symbol', 'as.table', 'as.table.default', 'as.vector', 'as.vector.factor', 'asin', 'asinh',
+ 'asNamespace', 'asS4', 'assign', 'atan', 'atan2', 'atanh', 'attach', 'attachNamespace', 'attr', 'attr.all.equal',
+ 'attr<-', 'attributes', 'attributes<-', 'autoload', 'autoloader', 'backsolve', 'baseenv', 'basename', 'besselI',
+ 'besselJ', 'besselK', 'besselY', 'beta', 'bindingIsActive', 'bindingIsLocked', 'bindtextdomain', 'body', 'body<-',
+ 'bquote', 'break', 'browser', 'builtins', 'by', 'by.data.frame', 'by.default', 'bzfile', 'c', 'c.Date', 'c.noquote',
+ 'c.numeric_version', 'c.POSIXct', 'c.POSIXlt', 'call', 'callCC', 'capabilities', 'casefold', 'cat', 'category',
+ 'cbind', 'cbind.data.frame', 'ceiling', 'char.expand', 'character', 'charmatch', 'charToRaw', 'chartr', 'check_tzones',
+ 'chol', 'chol.default', 'chol2inv', 'choose', 'class', 'class<-', 'close', 'close.connection', 'close.srcfile',
+ 'closeAllConnections', 'codes', 'codes.factor', 'codes.ordered', 'codes<-', 'col', 'colMeans', 'colnames',
+ 'colnames<-', 'colSums', 'commandArgs', 'comment', 'comment<-', 'complex', 'computeRestarts', 'conditionCall',
+ 'conditionCall.condition', 'conditionMessage', 'conditionMessage.condition', 'conflicts', 'Conj', 'contributors',
+ 'cos', 'cosh', 'crossprod', 'Cstack_info', 'cummax', 'cummin', 'cumprod', 'cumsum', 'cut', 'cut.Date', 'cut.default',
+ 'cut.POSIXt', 'data.class', 'data.frame', 'data.matrix', 'date', 'debug', 'default.stringsAsFactors', 'delay',
+ 'delayedAssign', 'deparse', 'det', 'detach', 'determinant', 'determinant.matrix', 'dget', 'diag', 'diag<-', 'diff',
+ 'diff.Date', 'diff.default', 'diff.POSIXt', 'difftime', 'digamma', 'dim', 'dim.data.frame', 'dim<-', 'dimnames',
+ 'dimnames.data.frame', 'dimnames<-', 'dimnames<-.data.frame', 'dir', 'dir.create', 'dirname', 'do.call', 'double',
+ 'dput', 'dQuote', 'drop', 'dump', 'duplicated', 'duplicated.array', 'duplicated.data.frame', 'duplicated.default',
+ 'duplicated.matrix', 'duplicated.numeric_version', 'duplicated.POSIXlt', 'dyn.load', 'dyn.unload', 'eapply', 'eigen',
+ 'emptyenv', 'encodeString', 'Encoding', 'Encoding<-', 'env.profile', 'environment', 'environment<-', 'environmentIsLocked',
+ 'environmentName', 'eval', 'eval.parent', 'evalq', 'exists', 'exp', 'expand.grid', 'expm1', 'expression', 'F', 'factor',
+ 'factorial', 'fifo', 'file', 'file.access', 'file.append', 'file.choose', 'file.copy', 'file.create', 'file.exists',
+ 'file.info', 'file.path', 'file.remove', 'file.rename', 'file.show', 'file.symlink', 'Filter', 'Find', 'findInterval',
+ 'findPackageEnv', 'findRestart', 'floor', 'flush', 'flush.connection', 'for', 'force', 'formals', 'formals<-',
+ 'format', 'format.AsIs', 'format.char', 'format.data.frame', 'format.Date', 'format.default', 'format.difftime',
+ 'format.factor', 'format.hexmode', 'format.info', 'format.octmode', 'format.POSIXct', 'format.POSIXlt',
+ 'format.pval', 'formatC', 'formatDL', 'forwardsolve', 'function', 'gamma', 'gammaCody', 'gc', 'gc.time',
+ 'gcinfo', 'gctorture', 'get', 'getAllConnections', 'getCallingDLL', 'getCallingDLLe', 'getCConverterDescriptions',
+ 'getCConverterStatus', 'getConnection', 'getDLLRegisteredRoutines', 'getDLLRegisteredRoutines.character',
+ 'getDLLRegisteredRoutines.DLLInfo', 'getenv', 'geterrmessage', 'getExportedValue', 'getHook', 'getLoadedDLLs',
+ 'getNamespace', 'getNamespaceExports', 'getNamespaceImports', 'getNamespaceInfo', 'getNamespaceName',
+ 'getNamespaceUsers', 'getNamespaceVersion', 'getNativeSymbolInfo', 'getNumCConverters', 'getOption', 'getRversion',
+ 'getSrcLines', 'getTaskCallbackNames', 'gettext', 'gettextf', 'getwd', 'gl', 'globalenv', 'gregexpr', 'grep',
+ 'grepl', 'gsub', 'gzcon', 'gzfile', 'httpclient', 'I', 'iconv', 'iconvlist', 'icuSetCollate', 'identical', 'identity',
+ 'if', 'ifelse', 'Im', 'importIntoEnv', 'inherits', 'integer', 'interaction', 'interactive', 'intersect', 'intToBits',
+ 'intToUtf8', 'inverse.rle', 'invisible', 'invokeRestart', 'invokeRestartInteractively', 'is.array', 'is.atomic',
+ 'is.call', 'is.character', 'is.complex', 'is.data.frame', 'is.double', 'is.element', 'is.environment',
+ 'is.expression', 'is.factor', 'is.finite', 'is.function', 'is.infinite', 'is.integer', 'is.language',
+ 'is.list', 'is.loaded', 'is.logical', 'is.matrix', 'is.na', 'is.na.data.frame', 'is.na.POSIXlt', 'is.na<-',
+ 'is.na<-.default', 'is.na<-.factor', 'is.name', 'is.nan', 'is.null', 'is.numeric', 'is.numeric_version',
+ 'is.numeric.Date', 'is.numeric.POSIXt', 'is.object', 'is.ordered', 'is.package_version', 'is.pairlist', 'is.primitive',
+ 'is.qr', 'is.R', 'is.raw', 'is.real', 'is.recursive', 'is.single', 'is.symbol', 'is.table', 'is.unsorted', 'is.vector',
+ 'isBaseNamespace', 'isdebugged', 'isIncomplete', 'isNamespace', 'ISOdate', 'ISOdatetime', 'isOpen', 'isRestart', 'isS4',
+ 'isSeekable', 'isSymmetric', 'isSymmetric.matrix', 'isTRUE', 'jitter', 'julian', 'julian.Date', 'julian.POSIXt', 'kappa',
+ 'kappa.default', 'kappa.lm', 'kappa.qr', 'kappa.tri', 'kronecker', 'l10n_info', 'La.chol', 'La.chol2inv', 'La.eigen',
+ 'La.svd', 'labels', 'labels.default', 'lapply', 'lazyLoad', 'lazyLoadDBfetch', 'lbeta', 'lchoose', 'length', 'length<-',
+ 'length<-.factor', 'letters', 'LETTERS', 'levels', 'levels.default', 'levels<-', 'levels<-.factor', 'lfactorial', 'lgamma',
+ 'library', 'library.dynam', 'library.dynam.unload', 'licence', 'license', 'list', 'list.files', 'load', 'loadedNamespaces',
+ 'loadingNamespaceInfo', 'loadNamespace', 'loadURL', 'local', 'lockBinding', 'lockEnvironment', 'log', 'log10', 'log1p', 'log2',
+ 'logb', 'logical', 'lower.tri', 'ls', 'machine', 'Machine', 'make.names', 'make.unique', 'makeActiveBinding', 'manglePackageName',
+ 'Map', 'mapply', 'margin.table', 'mat.or.vec', 'match', 'match.arg', 'match.call', 'match.fun', 'Math.data.frame', 'Math.Date',
+ 'Math.difftime', 'Math.factor', 'Math.POSIXt', 'matrix', 'max', 'max.col', 'mean', 'mean.data.frame', 'mean.Date', 'mean.default',
+ 'mean.difftime', 'mean.POSIXct', 'mean.POSIXlt', 'mem.limits', 'memory.profile', 'merge', 'merge.data.frame', 'merge.default',
+ 'message', 'mget', 'min', 'missing', 'Mod', 'mode', 'mode<-', 'month.abb', 'month.name', 'months', 'months.Date',
+ 'months.POSIXt', 'mostattributes<-', 'names', 'names<-', 'namespaceExport', 'namespaceImport', 'namespaceImportClasses',
+ 'namespaceImportFrom', 'namespaceImportMethods', 'nargs', 'nchar', 'ncol', 'NCOL', 'Negate', 'new.env', 'next', 'NextMethod',
+ 'ngettext', 'nlevels', 'noquote', 'nrow', 'NROW', 'numeric', 'numeric_version', 'nzchar', 'objects', 'oldClass',
+ 'oldClass<-', 'on.exit', 'open', 'open.connection', 'open.srcfile', 'open.srcfilecopy', 'Ops.data.frame', 'Ops.Date',
+ 'Ops.difftime', 'Ops.factor', 'Ops.numeric_version', 'Ops.ordered', 'Ops.POSIXt', 'options', 'order', 'ordered',
+ 'outer', 'package_version', 'package.description', 'packageEvent', 'packageHasNamespace', 'packageStartupMessage',
+ 'packBits', 'pairlist', 'parent.env', 'parent.env<-', 'parent.frame', 'parse', 'parse.dcf', 'parseNamespaceFile',
+ 'paste', 'path.expand', 'pentagamma', 'pi', 'pipe', 'Platform', 'pmatch', 'pmax', 'pmax.int', 'pmin', 'pmin.int',
+ 'polyroot', 'pos.to.env', 'Position', 'pretty', 'prettyNum', 'print', 'print.AsIs', 'print.atomic', 'print.by',
+ 'print.condition', 'print.connection', 'print.data.frame', 'print.Date', 'print.default', 'print.difftime',
+ 'print.DLLInfo', 'print.DLLInfoList', 'print.DLLRegisteredRoutines', 'print.factor', 'print.hexmode', 'print.libraryIQR',
+ 'print.listof', 'print.NativeRoutineList', 'print.noquote', 'print.numeric_version', 'print.octmode', 'print.packageInfo',
+ 'print.POSIXct', 'print.POSIXlt', 'print.proc_time', 'print.restart', 'print.rle', 'print.simple.list',
+ 'print.srcfile', 'print.srcref', 'print.summary.table', 'print.table', 'print.warnings', 'printNoClass',
+ 'prmatrix', 'proc.time', 'prod', 'prop.table', 'provide', 'psigamma', 'pushBack', 'pushBackLength', 'q', 'qr',
+ 'qr.coef', 'qr.default', 'qr.fitted', 'qr.Q', 'qr.qty', 'qr.qy', 'qr.R', 'qr.resid', 'qr.solve', 'qr.X', 'quarters',
+ 'quarters.Date', 'quarters.POSIXt', 'quit', 'quote', 'R_system_version', 'R.home', 'R.version', 'R.Version',
+ 'R.version.string', 'range', 'range.default', 'rank', 'rapply', 'raw', 'rawConnection', 'rawConnectionValue',
+ 'rawShift', 'rawToBits', 'rawToChar', 'rbind', 'rbind.data.frame', 'rcond', 'Re', 'read.dcf', 'read.table.url',
+ 'readBin', 'readChar', 'readline', 'readLines', 'real', 'Recall', 'Reduce', 'reg.finalizer', 'regexpr',
+ 'registerS3method', 'registerS3methods', 'remove', 'removeCConverter', 'removeTaskCallback', 'rep', 'rep.Date',
+ 'rep.factor', 'rep.int', 'rep.numeric_version', 'rep.POSIXct', 'rep.POSIXlt', 'repeat', 'replace', 'replicate',
+ 'require', 'restart', 'restartDescription', 'restartFormals', 'retracemem', 'return', 'rev', 'rev.default', 'rle',
+ 'rm', 'RNGkind', 'RNGversion', 'round', 'round.Date', 'round.difftime', 'round.POSIXt', 'row', 'row.names',
+ 'row.names.data.frame', 'row.names.default', 'row.names<-', 'row.names<-.data.frame', 'row.names<-.default',
+ 'rowMeans', 'rownames', 'rownames<-', 'rowsum', 'rowsum.data.frame', 'rowsum.default', 'rowSums', 'sample',
+ 'sample.int', 'sapply', 'save', 'save.image', 'saveNamespaceImage', 'scale', 'scale.default', 'scan', 'scan.url',
+ 'search', 'searchpaths', 'seek', 'seek.connection', 'seq', 'seq_along', 'seq_len', 'seq.Date', 'seq.default',
+ 'seq.int', 'seq.POSIXt', 'sequence', 'serialize', 'set.seed', 'setCConverterStatus', 'setdiff', 'setequal',
+ 'setHook', 'setNamespaceInfo', 'setSessionTimeLimit', 'setTimeLimit', 'setwd', 'showConnections', 'shQuote',
+ 'sign', 'signalCondition', 'signif', 'simpleCondition', 'simpleError', 'simpleMessage', 'simpleWarning', 'sin',
+ 'single', 'sinh', 'sink', 'sink.number', 'slice.index', 'socketConnection', 'socketSelect', 'solve', 'solve.default',
+ 'solve.qr', 'sort', 'sort.default', 'sort.int', 'sort.list', 'sort.POSIXlt', 'source', 'source.url', 'split',
+ 'split.data.frame', 'split.Date', 'split.default', 'split.POSIXct', 'split<-', 'split<-.data.frame', 'split<-.default',
+ 'sprintf', 'sqrt', 'sQuote', 'srcfile', 'srcfilecopy', 'srcref', 'standardGeneric', 'stderr', 'stdin', 'stdout',
+ 'stop', 'stopifnot', 'storage.mode', 'storage.mode<-', 'strftime', 'strptime', 'strsplit', 'strtrim', 'structure',
+ 'strwrap', 'sub', 'subset', 'subset.data.frame', 'subset.default', 'subset.matrix', 'substitute', 'substr',
+ 'substr<-', 'substring', 'substring<-', 'sum', 'summary', 'summary.connection', 'summary.data.frame',
+ 'Summary.data.frame', 'summary.Date', 'Summary.Date', 'summary.default', 'Summary.difftime',
+ 'summary.factor', 'Summary.factor', 'summary.matrix', 'Summary.numeric_version', 'summary.POSIXct',
+ 'Summary.POSIXct', 'summary.POSIXlt', 'Summary.POSIXlt', 'summary.table', 'suppressMessages',
+ 'suppressPackageStartupMessages', 'suppressWarnings', 'svd', 'sweep', 'switch', 'symbol.C',
+ 'symbol.For', 'sys.call', 'sys.calls', 'Sys.chmod', 'Sys.Date', 'sys.frame', 'sys.frames',
+ 'sys.function', 'Sys.getenv', 'Sys.getlocale', 'Sys.getpid', 'Sys.glob', 'Sys.info', 'sys.load.image',
+ 'Sys.localeconv', 'sys.nframe', 'sys.on.exit', 'sys.parent', 'sys.parents', 'Sys.putenv',
+ 'sys.save.image', 'Sys.setenv', 'Sys.setlocale', 'Sys.sleep', 'sys.source', 'sys.status',
+ 'Sys.time', 'Sys.timezone', 'Sys.umask', 'Sys.unsetenv', 'Sys.which', 'system', 'system.file',
+ 'system.time', 't', 'T', 't.data.frame', 't.default', 'table', 'tabulate', 'tan', 'tanh', 'tapply',
+ 'taskCallbackManager', 'tcrossprod', 'tempdir', 'tempfile', 'testPlatformEquivalence', 'tetragamma',
+ 'textConnection', 'textConnectionValue', 'tolower', 'topenv', 'toString', 'toString.default', 'toupper',
+ 'trace', 'traceback', 'tracemem', 'tracingState', 'transform', 'transform.data.frame', 'transform.default',
+ 'trigamma', 'trunc', 'trunc.Date', 'trunc.POSIXt', 'truncate', 'truncate.connection', 'try', 'tryCatch',
+ 'typeof', 'unclass', 'undebug', 'union', 'unique', 'unique.array', 'unique.data.frame', 'unique.default',
+ 'unique.matrix', 'unique.numeric_version', 'unique.POSIXlt', 'units', 'units.difftime', 'units<-',
+ 'units<-.difftime', 'unix', 'unix.time', 'unlink', 'unlist', 'unloadNamespace', 'unlockBinding',
+ 'unname', 'unserialize', 'unsplit', 'untrace', 'untracemem', 'unz', 'upper.tri', 'url', 'UseMethod',
+ 'utf8ToInt', 'vector', 'Vectorize', 'version', 'Version', 'warning', 'warnings', 'weekdays',
+ 'weekdays.Date', 'weekdays.POSIXt', 'which', 'which.max', 'which.min', 'while', 'with',
+ 'with.default', 'withCallingHandlers', 'within', 'within.data.frame', 'within.list', 'withRestarts',
+ 'withVisible', 'write', 'write.dcf', 'write.table0', 'writeBin', 'writeChar', 'writeLines', 'xor',
+ 'xpdrows.data.frame', 'xtfrm', 'xtfrm.Date', 'xtfrm.default', 'xtfrm.factor', 'xtfrm.numeric_version',
+ 'xtfrm.POSIXct', 'xtfrm.POSIXlt', 'xtfrm.Surv', 'zapsmall',
+ ),
+ 3 => array( // Datasets
+ 'ability.cov', 'airmiles', 'AirPassengers', 'airquality',
+ 'anscombe', 'attenu', 'attitude', 'austres', 'beaver1',
+ 'beaver2', 'BJsales', 'BJsales.lead', 'BOD', 'cars',
+ 'ChickWeight', 'chickwts', 'co2', 'crimtab',
+ 'discoveries', 'DNase', 'esoph', 'euro', 'euro.cross',
+ 'eurodist', 'EuStockMarkets', 'faithful', 'fdeaths',
+ 'Formaldehyde', 'freeny', 'freeny.x', 'freeny.y',
+ 'HairEyeColor', 'Harman23.cor', 'Harman74.cor', 'Indometh',
+ 'infert', 'InsectSprays', 'iris', 'iris3', 'islands',
+ 'JohnsonJohnson', 'LakeHuron', 'ldeaths', 'lh', 'LifeCycleSavings',
+ 'Loblolly', 'longley', 'lynx', 'mdeaths', 'morley', 'mtcars',
+ 'nhtemp', 'Nile', 'nottem', 'occupationalStatus', 'Orange',
+ 'OrchardSprays', 'PlantGrowth', 'precip', 'presidents',
+ 'pressure', 'Puromycin', 'quakes', 'randu', 'rivers', 'rock',
+ 'Seatbelts', 'sleep', 'stack.loss', 'stack.x', 'stackloss',
+ 'state.abb', 'state.area', 'state.center', 'state.division',
+ 'state.name', 'state.region', 'state.x77', 'sunspot.month',
+ 'sunspot.year', 'sunspots', 'swiss', 'Theoph', 'Titanic', 'ToothGrowth',
+ 'treering', 'trees', 'UCBAdmissions', 'UKDriverDeaths', 'UKgas',
+ 'USAccDeaths', 'USArrests', 'USJudgeRatings', 'USPersonalExpenditure',
+ 'uspop', 'VADeaths', 'volcano', 'warpbreaks', 'women', 'WorldPhones',
+ 'WWWusage',
+ ),
+ 4 => array( // graphics package
+ 'abline', 'arrows', 'assocplot', 'axis', 'Axis', 'axis.Date', 'axis.POSIXct',
+ 'axTicks', 'barplot', 'barplot.default', 'box', 'boxplot', 'boxplot.default',
+ 'boxplot.matrix', 'bxp', 'cdplot', 'clip', 'close.screen', 'co.intervals',
+ 'contour', 'contour.default', 'coplot', 'curve', 'dotchart', 'erase.screen',
+ 'filled.contour', 'fourfoldplot', 'frame', 'grconvertX', 'grconvertY', 'grid',
+ 'hist', 'hist.default', 'identify', 'image', 'image.default', 'layout',
+ 'layout.show', 'lcm', 'legend', 'lines', 'lines.default', 'locator', 'matlines',
+ 'matplot', 'matpoints', 'mosaicplot', 'mtext', 'pairs', 'pairs.default',
+ 'panel.smooth', 'par', 'persp', 'pie', 'piechart', 'plot', 'plot.default',
+ 'plot.design', 'plot.new', 'plot.window', 'plot.xy', 'points', 'points.default',
+ 'polygon', 'rect', 'rug', 'screen', 'segments', 'smoothScatter', 'spineplot',
+ 'split.screen', 'stars', 'stem', 'strheight', 'stripchart', 'strwidth', 'sunflowerplot',
+ 'symbols', 'text', 'text.default', 'title', 'xinch', 'xspline', 'xyinch', 'yinch',
+ ),
+ 5 => array( // grDevices pkg
+ 'as.graphicsAnnot', 'bitmap', 'blues9', 'bmp', 'boxplot.stats', 'cairo_pdf', 'cairo_ps', 'check.options',
+ 'chull', 'CIDFont', 'cm', 'cm.colors', 'col2rgb', 'colorConverter', 'colorRamp', 'colorRampPalette',
+ 'colors', 'colorspaces', 'colours', 'contourLines', 'convertColor', 'densCols', 'dev.control', 'dev.copy',
+ 'dev.copy2eps', 'dev.copy2pdf', 'dev.cur', 'dev.interactive', 'dev.list', 'dev.new', 'dev.next', 'dev.off',
+ 'dev.prev', 'dev.print', 'dev.set', 'dev.size', 'dev2bitmap', 'devAskNewPage', 'deviceIsInteractive',
+ 'embedFonts', 'extendrange', 'getGraphicsEvent', 'graphics.off', 'gray', 'gray.colors', 'grey', 'grey.colors',
+ 'hcl', 'heat.colors', 'Hershey', 'hsv', 'jpeg', 'make.rgb', 'n2mfrow', 'nclass.FD', 'nclass.scott',
+ 'nclass.Sturges', 'palette', 'pdf', 'pdf.options', 'pdfFonts', 'pictex', 'png', 'postscript', 'postscriptFont',
+ 'postscriptFonts', 'ps.options', 'quartz', 'quartz.options', 'quartzFont', 'quartzFonts', 'rainbow',
+ 'recordGraphics', 'recordPlot', 'replayPlot', 'rgb', 'rgb2hsv', 'savePlot', 'setEPS', 'setPS', 'svg',
+ 'terrain.colors', 'tiff', 'topo.colors', 'trans3d', 'Type1Font', 'x11', 'X11', 'X11.options', 'X11Font',
+ 'X11Fonts', 'xfig', 'xy.coords', 'xyTable', 'xyz.coords',
+ ),
+ 6 => array( // methods package
+ 'addNextMethod', 'allGenerics', 'allNames', 'Arith', 'as', 'as<-',
+ 'asMethodDefinition', 'assignClassDef', 'assignMethodsMetaData', 'balanceMethodsList',
+ 'cacheGenericsMetaData', 'cacheMetaData', 'cacheMethod', 'callGeneric',
+ 'callNextMethod', 'canCoerce', 'cbind2', 'checkSlotAssignment', 'classesToAM',
+ 'classMetaName', 'coerce', 'coerce<-', 'Compare', 'completeClassDefinition',
+ 'completeExtends', 'completeSubclasses', 'Complex', 'conformMethod', 'defaultDumpName',
+ 'defaultPrototype', 'doPrimitiveMethod', 'dumpMethod', 'dumpMethods', 'el', 'el<-',
+ 'elNamed', 'elNamed<-', 'empty.dump', 'emptyMethodsList', 'existsFunction', 'existsMethod',
+ 'extends', 'finalDefaultMethod', 'findClass', 'findFunction', 'findMethod', 'findMethods',
+ 'findMethodSignatures', 'findUnique', 'fixPre1.8', 'formalArgs', 'functionBody',
+ 'functionBody<-', 'generic.skeleton', 'getAccess', 'getAllMethods', 'getAllSuperClasses',
+ 'getClass', 'getClassDef', 'getClasses', 'getClassName', 'getClassPackage', 'getDataPart',
+ 'getExtends', 'getFunction', 'getGeneric', 'getGenerics', 'getGroup', 'getGroupMembers',
+ 'getMethod', 'getMethods', 'getMethodsForDispatch', 'getMethodsMetaData', 'getPackageName',
+ 'getProperties', 'getPrototype', 'getSlots', 'getSubclasses', 'getValidity', 'getVirtual',
+ 'hasArg', 'hasMethod', 'hasMethods', 'implicitGeneric', 'initialize', 'insertMethod', 'is',
+ 'isClass', 'isClassDef', 'isClassUnion', 'isGeneric', 'isGrammarSymbol', 'isGroup',
+ 'isSealedClass', 'isSealedMethod', 'isVirtualClass', 'isXS3Class', 'languageEl', 'languageEl<-',
+ 'linearizeMlist', 'listFromMethods', 'listFromMlist', 'loadMethod', 'Logic',
+ 'makeClassRepresentation', 'makeExtends', 'makeGeneric', 'makeMethodsList',
+ 'makePrototypeFromClassDef', 'makeStandardGeneric', 'matchSignature', 'Math', 'Math2', 'mergeMethods',
+ 'metaNameUndo', 'method.skeleton', 'MethodAddCoerce', 'methodSignatureMatrix', 'MethodsList',
+ 'MethodsListSelect', 'methodsPackageMetaName', 'missingArg', 'mlistMetaName', 'new', 'newBasic',
+ 'newClassRepresentation', 'newEmptyObject', 'Ops', 'packageSlot', 'packageSlot<-', 'possibleExtends',
+ 'prohibitGeneric', 'promptClass', 'promptMethods', 'prototype', 'Quote', 'rbind2',
+ 'reconcilePropertiesAndPrototype', 'registerImplicitGenerics', 'rematchDefinition',
+ 'removeClass', 'removeGeneric', 'removeMethod', 'removeMethods', 'removeMethodsObject', 'representation',
+ 'requireMethods', 'resetClass', 'resetGeneric', 'S3Class', 'S3Class<-', 'S3Part', 'S3Part<-', 'sealClass',
+ 'seemsS4Object', 'selectMethod', 'selectSuperClasses', 'sessionData', 'setAs', 'setClass', 'setClassUnion',
+ 'setDataPart', 'setGeneric', 'setGenericImplicit', 'setGroupGeneric', 'setIs', 'setMethod', 'setOldClass',
+ 'setPackageName', 'setPrimitiveMethods', 'setReplaceMethod', 'setValidity', 'show', 'showClass', 'showDefault',
+ 'showExtends', 'showMethods', 'showMlist', 'signature', 'SignatureMethod', 'sigToEnv', 'slot', 'slot<-',
+ 'slotNames', 'slotsFromS3', 'substituteDirect', 'substituteFunctionArgs', 'Summary', 'superClassDepth',
+ 'testInheritedMethods', 'testVirtual', 'traceOff', 'traceOn', 'tryNew', 'trySilent', 'unRematchDefinition',
+ 'validObject', 'validSlotNames',
+ ),
+ 7 => array( // stats pkg
+ 'acf', 'acf2AR', 'add.scope', 'add1', 'addmargins', 'aggregate',
+ 'aggregate.data.frame', 'aggregate.default', 'aggregate.ts', 'AIC',
+ 'alias', 'anova', 'anova.glm', 'anova.glmlist', 'anova.lm', 'anova.lmlist',
+ 'anova.mlm', 'anovalist.lm', 'ansari.test', 'aov', 'approx', 'approxfun',
+ 'ar', 'ar.burg', 'ar.mle', 'ar.ols', 'ar.yw', 'arima', 'arima.sim',
+ 'arima0', 'arima0.diag', 'ARMAacf', 'ARMAtoMA', 'as.dendrogram', 'as.dist',
+ 'as.formula', 'as.hclust', 'as.stepfun', 'as.ts', 'asOneSidedFormula', 'ave',
+ 'bandwidth.kernel', 'bartlett.test', 'binom.test', 'binomial', 'biplot',
+ 'Box.test', 'bw.bcv', 'bw.nrd', 'bw.nrd0', 'bw.SJ', 'bw.ucv', 'C', 'cancor',
+ 'case.names', 'ccf', 'chisq.test', 'clearNames', 'cmdscale', 'coef', 'coefficients',
+ 'complete.cases', 'confint', 'confint.default', 'constrOptim', 'contr.helmert',
+ 'contr.poly', 'contr.SAS', 'contr.sum', 'contr.treatment', 'contrasts', 'contrasts<-',
+ 'convolve', 'cooks.distance', 'cophenetic', 'cor', 'cor.test', 'cov', 'cov.wt',
+ 'cov2cor', 'covratio', 'cpgram', 'cutree', 'cycle', 'D', 'dbeta', 'dbinom', 'dcauchy',
+ 'dchisq', 'decompose', 'delete.response', 'deltat', 'dendrapply', 'density', 'density.default',
+ 'deriv', 'deriv.default', 'deriv.formula', 'deriv3', 'deriv3.default', 'deriv3.formula',
+ 'deviance', 'dexp', 'df', 'df.kernel', 'df.residual', 'dfbeta', 'dfbetas', 'dffits',
+ 'dgamma', 'dgeom', 'dhyper', 'diff.ts', 'diffinv', 'dist', 'dlnorm', 'dlogis',
+ 'dmultinom', 'dnbinom', 'dnorm', 'dpois', 'drop.scope', 'drop.terms', 'drop1',
+ 'dsignrank', 'dt', 'dummy.coef', 'dunif', 'dweibull', 'dwilcox', 'ecdf', 'eff.aovlist',
+ 'effects', 'embed', 'end', 'estVar', 'expand.model.frame', 'extractAIC', 'factanal',
+ 'factor.scope', 'family', 'fft', 'filter', 'fisher.test', 'fitted', 'fitted.values',
+ 'fivenum', 'fligner.test', 'formula', 'frequency', 'friedman.test', 'ftable', 'Gamma',
+ 'gaussian', 'get_all_vars', 'getInitial', 'glm', 'glm.control', 'glm.fit', 'glm.fit.null',
+ 'hasTsp', 'hat', 'hatvalues', 'hatvalues.lm', 'hclust', 'heatmap', 'HoltWinters', 'influence',
+ 'influence.measures', 'integrate', 'interaction.plot', 'inverse.gaussian', 'IQR',
+ 'is.empty.model', 'is.leaf', 'is.mts', 'is.stepfun', 'is.ts', 'is.tskernel', 'isoreg',
+ 'KalmanForecast', 'KalmanLike', 'KalmanRun', 'KalmanSmooth', 'kernapply', 'kernel', 'kmeans',
+ 'knots', 'kruskal.test', 'ks.test', 'ksmooth', 'lag', 'lag.plot', 'line', 'lines.ts', 'lm',
+ 'lm.fit', 'lm.fit.null', 'lm.influence', 'lm.wfit', 'lm.wfit.null', 'loadings', 'loess',
+ 'loess.control', 'loess.smooth', 'logLik', 'loglin', 'lowess', 'ls.diag', 'ls.print', 'lsfit',
+ 'mad', 'mahalanobis', 'make.link', 'makeARIMA', 'makepredictcall', 'manova', 'mantelhaen.test',
+ 'mauchley.test', 'mauchly.test', 'mcnemar.test', 'median', 'median.default', 'medpolish',
+ 'model.extract', 'model.frame', 'model.frame.aovlist', 'model.frame.default', 'model.frame.glm',
+ 'model.frame.lm', 'model.matrix', 'model.matrix.default', 'model.matrix.lm', 'model.offset',
+ 'model.response', 'model.tables', 'model.weights', 'monthplot', 'mood.test', 'mvfft', 'na.action',
+ 'na.contiguous', 'na.exclude', 'na.fail', 'na.omit', 'na.pass', 'napredict', 'naprint', 'naresid',
+ 'nextn', 'nlm', 'nlminb', 'nls', 'nls.control', 'NLSstAsymptotic', 'NLSstClosestX', 'NLSstLfAsymptote',
+ 'NLSstRtAsymptote', 'numericDeriv', 'offset', 'oneway.test', 'optim', 'optimise', 'optimize',
+ 'order.dendrogram', 'p.adjust', 'p.adjust.methods', 'pacf', 'pairwise.prop.test', 'pairwise.t.test',
+ 'pairwise.table', 'pairwise.wilcox.test', 'pbeta', 'pbinom', 'pbirthday', 'pcauchy', 'pchisq', 'pexp',
+ 'pf', 'pgamma', 'pgeom', 'phyper', 'plclust', 'plnorm', 'plogis', 'plot.density', 'plot.ecdf', 'plot.lm',
+ 'plot.mlm', 'plot.spec', 'plot.spec.coherency', 'plot.spec.phase', 'plot.stepfun', 'plot.ts', 'plot.TukeyHSD',
+ 'pnbinom', 'pnorm', 'poisson', 'poisson.test', 'poly', 'polym', 'power', 'power.anova.test', 'power.prop.test',
+ 'power.t.test', 'PP.test', 'ppoints', 'ppois', 'ppr', 'prcomp', 'predict', 'predict.glm', 'predict.lm',
+ 'predict.mlm', 'predict.poly', 'preplot', 'princomp', 'print.anova', 'print.coefmat', 'print.density',
+ 'print.family', 'print.formula', 'print.ftable', 'print.glm', 'print.infl', 'print.integrate', 'print.lm',
+ 'print.logLik', 'print.terms', 'print.ts', 'printCoefmat', 'profile', 'proj', 'promax', 'prop.test',
+ 'prop.trend.test', 'psignrank', 'pt', 'ptukey', 'punif', 'pweibull', 'pwilcox', 'qbeta', 'qbinom',
+ 'qbirthday', 'qcauchy', 'qchisq', 'qexp', 'qf', 'qgamma', 'qgeom', 'qhyper', 'qlnorm', 'qlogis',
+ 'qnbinom', 'qnorm', 'qpois', 'qqline', 'qqnorm', 'qqnorm.default', 'qqplot', 'qsignrank', 'qt',
+ 'qtukey', 'quade.test', 'quantile', 'quantile.default', 'quasi', 'quasibinomial', 'quasipoisson',
+ 'qunif', 'qweibull', 'qwilcox', 'r2dtable', 'rbeta', 'rbinom', 'rcauchy', 'rchisq', 'read.ftable',
+ 'rect.hclust', 'reformulate', 'relevel', 'reorder', 'replications', 'reshape', 'reshapeLong', 'reshapeWide',
+ 'resid', 'residuals', 'residuals.default', 'residuals.glm', 'residuals.lm', 'rexp', 'rf', 'rgamma', 'rgeom',
+ 'rhyper', 'rlnorm', 'rlogis', 'rmultinom', 'rnbinom', 'rnorm', 'rpois', 'rsignrank', 'rstandard', 'rstandard.glm',
+ 'rstandard.lm', 'rstudent', 'rstudent.glm', 'rstudent.lm', 'rt', 'runif', 'runmed', 'rweibull', 'rwilcox',
+ 'scatter.smooth', 'screeplot', 'sd', 'se.contrast', 'selfStart', 'setNames', 'shapiro.test', 'simulate',
+ 'smooth', 'smooth.spline', 'smoothEnds', 'sortedXyData', 'spec.ar', 'spec.pgram', 'spec.taper', 'spectrum',
+ 'spline', 'splinefun', 'splinefunH', 'SSasymp', 'SSasympOff', 'SSasympOrig', 'SSbiexp', 'SSD', 'SSfol',
+ 'SSfpl', 'SSgompertz', 'SSlogis', 'SSmicmen', 'SSweibull', 'start', 'stat.anova', 'step', 'stepfun', 'stl',
+ 'StructTS', 'summary.aov', 'summary.aovlist', 'summary.glm', 'summary.infl', 'summary.lm', 'summary.manova',
+ 'summary.mlm', 'summary.stepfun', 'supsmu', 'symnum', 't.test', 'termplot', 'terms', 'terms.aovlist',
+ 'terms.default', 'terms.formula', 'terms.terms', 'time', 'toeplitz', 'ts', 'ts.intersect', 'ts.plot',
+ 'ts.union', 'tsdiag', 'tsp', 'tsp<-', 'tsSmooth', 'TukeyHSD', 'TukeyHSD.aov', 'uniroot', 'update',
+ 'update.default', 'update.formula', 'var', 'var.test', 'variable.names', 'varimax', 'vcov', 'weighted.mean',
+ 'weighted.residuals', 'weights', 'wilcox.test', 'window', 'window<-', 'write.ftable', 'xtabs',
+ ),
+ 8 => array( // utils pkg
+ 'alarm', 'apropos', 'argsAnywhere', 'as.person', 'as.personList', 'as.relistable', 'as.roman',
+ 'assignInNamespace', 'available.packages', 'browseEnv', 'browseURL', 'browseVignettes', 'bug.report',
+ 'capture.output', 'checkCRAN', 'chooseCRANmirror', 'citation', 'citEntry', 'citFooter', 'citHeader',
+ 'close.socket', 'combn', 'compareVersion', 'contrib.url', 'count.fields', 'CRAN.packages', 'data',
+ 'data.entry', 'dataentry', 'de', 'de.ncols', 'de.restore', 'de.setup', 'debugger', 'demo', 'download.file',
+ 'download.packages', 'dump.frames', 'edit', 'emacs', 'example', 'file_test', 'file.edit', 'find', 'fix',
+ 'fixInNamespace', 'flush.console', 'formatOL', 'formatUL', 'getAnywhere', 'getCRANmirrors', 'getFromNamespace',
+ 'getS3method', 'getTxtProgressBar', 'glob2rx', 'head', 'head.matrix', 'help', 'help.request', 'help.search',
+ 'help.start', 'history', 'index.search', 'install.packages', 'installed.packages', 'is.relistable',
+ 'limitedLabels', 'loadhistory', 'localeToCharset', 'ls.str', 'lsf.str', 'make.packages.html', 'make.socket',
+ 'makeRweaveLatexCodeRunner', 'memory.limit', 'memory.size', 'menu', 'methods', 'mirror2html', 'modifyList',
+ 'new.packages', 'normalizePath', 'nsl', 'object.size', 'old.packages', 'package.contents', 'package.skeleton',
+ 'packageDescription', 'packageStatus', 'page', 'person', 'personList', 'pico', 'prompt', 'promptData',
+ 'promptPackage', 'rc.getOption', 'rc.options', 'rc.settings', 'rc.status', 'read.csv', 'read.csv2', 'read.delim',
+ 'read.delim2', 'read.DIF', 'read.fortran', 'read.fwf', 'read.socket', 'read.table', 'readCitationFile', 'recover',
+ 'relist', 'remove.packages', 'Rprof', 'Rprofmem', 'RShowDoc', 'RSiteSearch', 'rtags', 'Rtangle', 'RtangleSetup',
+ 'RtangleWritedoc', 'RweaveChunkPrefix', 'RweaveEvalWithOpt', 'RweaveLatex', 'RweaveLatexFinish', 'RweaveLatexOptions',
+ 'RweaveLatexSetup', 'RweaveLatexWritedoc', 'RweaveTryStop', 'savehistory', 'select.list', 'sessionInfo',
+ 'setRepositories', 'setTxtProgressBar', 'stack', 'Stangle', 'str', 'strOptions', 'summaryRprof', 'Sweave',
+ 'SweaveHooks', 'SweaveSyntaxLatex', 'SweaveSyntaxNoweb', 'SweaveSyntConv', 'tail', 'tail.matrix', 'timestamp',
+ 'toBibtex', 'toLatex', 'txtProgressBar', 'type.convert', 'unstack', 'unzip', 'update.packages', 'update.packageStatus',
+ 'upgrade', 'url.show', 'URLdecode', 'URLencode', 'vi', 'View', 'vignette', 'write.csv', 'write.csv2', 'write.socket',
+ 'write.table', 'wsbrowser', 'xedit', 'xemacs', 'zip.file.extract',
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '!', '%', '^', '&', '/','+','-','*','=','<','>',';','|','<-','->',
+ '^', '-', ':', '::', ':::', '!', '!=', '*', '?',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000FF; font-weight: bold;',
+ 2 => 'color: #0000FF; font-weight: bold;',
+ 3 => 'color: #CC9900; font-weight: bold;',
+ 4 => 'color: #0000FF; font-weight: bold;',
+ 5 => 'color: #0000FF; font-weight: bold;',
+ 6 => 'color: #0000FF; font-weight: bold;',
+ 7 => 'color: #0000FF; font-weight: bold;',
+ 8 => 'color: #0000FF; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #228B22;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #080;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color:#A020F0;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '' )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => 'http://stat.ethz.ch/R-manual/R-devel/library/base/html/{FNAME}.html', // Base Package
+ 3 => 'http://stat.ethz.ch/R-manual/R-devel/library/datasets/html/{FNAME}.html', // Datasets
+ 4 => 'http://stat.ethz.ch/R-manual/R-devel/library/graphics/html/{FNAME}.html', // Graphics Package
+ 5 => 'http://stat.ethz.ch/R-manual/R-devel/library/grDevices/html/{FNAME}.html', // grDevices
+ 6 => 'http://stat.ethz.ch/R-manual/R-devel/library/methods/html/{FNAME}.html', // methods
+ 7 => 'http://stat.ethz.ch/R-manual/R-devel/library/stats/html/{FNAME}.html', // stats
+ 8 => 'http://stat.ethz.ch/R-manual/R-devel/library/utils/html/{FNAME}.html' // utils
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ 0 => array(
+ GESHI_SEARCH => "([^\w])'([^\\n\\r']*)'",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => "\\1'",
+ GESHI_AFTER => "'"
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#;>|^&\\.])(?<!\/html\/)",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_\|%\\-&;\\.])"
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ruby.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ruby.php
new file mode 100644
index 00000000..f6eb1b1e
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/ruby.php
@@ -0,0 +1,231 @@
+<?php
+/*************************************************************************************
+ * ruby.php
+ * --------
+ * Author: Moises Deniz
+ * Copyright: (c) 2007 Moises Deniz
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/03/21
+ *
+ * Ruby language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2007/03/21 (1.0.7.19)
+ * - Initial release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Ruby',
+ 'COMMENT_SINGLE' => array(1 => "#"),
+ 'COMMENT_MULTI' => array("=begin" => "=end"),
+ 'COMMENT_REGEXP' => array(
+ //Heredoc
+ 4 => '/<<\s*?(\w+)\\n.*?\\n\\1(?![a-zA-Z0-9])/si',
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', '`','\''),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'alias', 'and', 'begin', 'break', 'case', 'class',
+ 'def', 'defined', 'do', 'else', 'elsif', 'end',
+ 'ensure', 'for', 'if', 'in', 'module', 'while',
+ 'next', 'not', 'or', 'redo', 'rescue', 'yield',
+ 'retry', 'super', 'then', 'undef', 'unless',
+ 'until', 'when', 'include'
+ ),
+ 2 => array(
+ '__FILE__', '__LINE__', 'false', 'nil', 'self', 'true',
+ 'return'
+ ),
+ 3 => array(
+ 'Array', 'Float', 'Integer', 'String', 'at_exit',
+ 'autoload', 'binding', 'caller', 'catch', 'chop', 'chop!',
+ 'chomp', 'chomp!', 'eval', 'exec', 'exit', 'exit!', 'fail',
+ 'fork', 'format', 'gets', 'global_variables', 'gsub', 'gsub!',
+ 'iterator?', 'lambda', 'load', 'local_variables', 'loop',
+ 'open', 'p', 'print', 'printf', 'proc', 'putc', 'puts',
+ 'raise', 'rand', 'readline', 'readlines', 'require', 'select',
+ 'sleep', 'split', 'sprintf', 'srand', 'sub', 'sub!', 'syscall',
+ 'system', 'trace_var', 'trap', 'untrace_var'
+ ),
+ 4 => array(
+ 'Abbrev', 'ArgumentError', 'Base64', 'Benchmark',
+ 'Benchmark::Tms', 'Bignum', 'Binding', 'CGI', 'CGI::Cookie',
+ 'CGI::HtmlExtension', 'CGI::QueryExtension',
+ 'CGI::Session', 'CGI::Session::FileStore',
+ 'CGI::Session::MemoryStore', 'Class', 'Comparable', 'Complex',
+ 'ConditionVariable', 'Continuation', 'Data',
+ 'Date', 'DateTime', 'Delegator', 'Dir', 'EOFError', 'ERB',
+ 'ERB::Util', 'Enumerable', 'Enumerable::Enumerator', 'Errno',
+ 'Exception', 'FalseClass', 'File',
+ 'File::Constants', 'File::Stat', 'FileTest', 'FileUtils',
+ 'FileUtils::DryRun', 'FileUtils::NoWrite',
+ 'FileUtils::StreamUtils_', 'FileUtils::Verbose', 'Find',
+ 'Fixnum', 'FloatDomainError', 'Forwardable', 'GC', 'Generator',
+ 'Hash', 'IO', 'IOError', 'Iconv', 'Iconv::BrokenLibrary',
+ 'Iconv::Failure', 'Iconv::IllegalSequence',
+ 'Iconv::InvalidCharacter', 'Iconv::InvalidEncoding',
+ 'Iconv::OutOfRange', 'IndexError', 'Interrupt', 'Kernel',
+ 'LoadError', 'LocalJumpError', 'Logger', 'Logger::Application',
+ 'Logger::Error', 'Logger::Formatter', 'Logger::LogDevice',
+ 'Logger::LogDevice::LogDeviceMutex', 'Logger::Severity',
+ 'Logger::ShiftingError', 'Marshal', 'MatchData',
+ 'Math', 'Matrix', 'Method', 'Module', 'Mutex', 'NameError',
+ 'NameError::message', 'NilClass', 'NoMemoryError',
+ 'NoMethodError', 'NotImplementedError', 'Numeric', 'Object',
+ 'ObjectSpace', 'Observable', 'PStore', 'PStore::Error',
+ 'Pathname', 'Precision', 'Proc', 'Process', 'Process::GID',
+ 'Process::Status', 'Process::Sys', 'Process::UID', 'Queue',
+ 'Range', 'RangeError', 'Rational', 'Regexp', 'RegexpError',
+ 'RuntimeError', 'ScriptError', 'SecurityError', 'Set',
+ 'Shellwords', 'Signal', 'SignalException', 'SimpleDelegator',
+ 'SingleForwardable', 'Singleton', 'SingletonClassMethods',
+ 'SizedQueue', 'SortedSet', 'StandardError', 'StringIO',
+ 'StringScanner', 'StringScanner::Error', 'Struct', 'Symbol',
+ 'SyncEnumerator', 'SyntaxError', 'SystemCallError',
+ 'SystemExit', 'SystemStackError', 'Tempfile',
+ 'Test::Unit::TestCase', 'Test::Unit', 'Test', 'Thread',
+ 'ThreadError', 'ThreadGroup',
+ 'ThreadsWait', 'Time', 'TrueClass', 'TypeError', 'URI',
+ 'URI::BadURIError', 'URI::Error', 'URI::Escape', 'URI::FTP',
+ 'URI::Generic', 'URI::HTTP', 'URI::HTTPS',
+ 'URI::InvalidComponentError', 'URI::InvalidURIError',
+ 'URI::LDAP', 'URI::MailTo', 'URI::REGEXP',
+ 'URI::REGEXP::PATTERN', 'UnboundMethod', 'Vector', 'YAML',
+ 'ZeroDivisionError', 'Zlib',
+ 'Zlib::BufError', 'Zlib::DataError', 'Zlib::Deflate',
+ 'Zlib::Error', 'Zlib::GzipFile', 'Zlib::GzipFile::CRCError',
+ 'Zlib::GzipFile::Error', 'Zlib::GzipFile::LengthError',
+ 'Zlib::GzipFile::NoFooter', 'Zlib::GzipReader',
+ 'Zlib::GzipWriter', 'Zlib::Inflate', 'Zlib::MemError',
+ 'Zlib::NeedDict', 'Zlib::StreamEnd', 'Zlib::StreamError',
+ 'Zlib::VersionError',
+ 'Zlib::ZStream',
+ 'HTML::Selector', 'HashWithIndifferentAccess', 'Inflector',
+ 'Inflector::Inflections', 'Mime', 'Mime::Type',
+ 'OCI8AutoRecover', 'TimeZone', 'XmlSimple'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '%', '&', '*', '|', '/', '<', '>',
+ '+', '-', '=>', '<<'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color:#9966CC; font-weight:bold;',
+ 2 => 'color:#0000FF; font-weight:bold;',
+ 3 => 'color:#CC0066; font-weight:bold;',
+ 4 => 'color:#CC00FF; font-weight:bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color:#008000; font-style:italic;',
+ 4 => 'color: #cc0000; font-style: italic;',
+ 'MULTI' => 'color:#000080; font-style:italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color:#000099;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color:#006600; font-weight:bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color:#996600;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color:#006666;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color:#9900CC;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color:#006600; font-weight:bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color:#ff6633; font-weight:bold;',
+ 1 => 'color:#0066ff; font-weight:bold;',
+ 2 => 'color:#6666ff; font-weight:bold;',
+ 3 => 'color:#ff3333; font-weight:bold;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ 0 => array(//Variables
+ GESHI_SEARCH => "([[:space:]])(\\$[a-zA-Z_][a-zA-Z0-9_]*)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 1 => array(//Arrays
+ GESHI_SEARCH => "([[:space:]])(@[a-zA-Z_][a-zA-Z0-9_]*)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 2 => "([A-Z][a-zA-Z0-9_]*::)+[A-Z][a-zA-Z0-9_]*",//Static OOP symbols
+ 3 => array(
+ GESHI_SEARCH => "([[:space:]]|\[|\()(:[a-zA-Z_][a-zA-Z0-9_]*)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<%' => '%>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ ),
+ 'TAB_WIDTH' => 2
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/sas.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/sas.php
new file mode 100644
index 00000000..dbf95a14
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/sas.php
@@ -0,0 +1,290 @@
+<?php
+/*************************************************************************************
+ * sas.php
+ * -------
+ * Author: Galen Johnson (solitaryr@gmail.com)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/12/27
+ *
+ * SAS language file for GeSHi. Based on the sas vim file.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * - Cleaned up code style
+ * 2005/12/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2005/12/27)
+ * -------------------------
+ * * Check highlighting stuff works
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'SAS',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array('/*' => '*/', '*' => ';'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ '_ALL_','_CHARACTER_','_INFILE_','_N_','_NULL_','_NUMERIC_',
+ '_WEBOUT_'
+ ),
+ 2 => array(
+ '%BQUOTE','%CMPRES','%COMPSTOR','%DATATYP','%DISPLAY','%DO','%ELSE',
+ '%END','%EVAL','%GLOBAL','%GOTO','%IF','%INDEX','%INPUT','%KEYDEF',
+ '%LABEL','%LEFT','%LENGTH','%LET','%LOCAL','%LOWCASE','%MACRO',
+ '%MEND','%NRBQUOTE','%NRQUOTE','%NRSTR','%PUT','%QCMPRES','%QLEFT',
+ '%QLOWCASE','%QSCAN','%QSUBSTR','%QSYSFUNC','%QTRIM','%QUOTE',
+ '%QUPCASE','%SCAN','%STR','%SUBSTR','%SUPERQ','%SYSCALL',
+ '%SYSEVALF','%SYSEXEC','%SYSFUNC','%SYSGET','%SYSLPUT','%SYSPROD',
+ '%SYSRC','%SYSRPUT','%THEN','%TO','%TRIM','%UNQUOTE','%UNTIL',
+ '%UPCASE','%VERIFY','%WHILE','%WINDOW'
+ ),
+ 3 => array(
+ 'ABS','ADDR','AIRY','ARCOS','ARSIN','ATAN','ATTRC','ATTRN','BAND',
+ 'BETAINV','BLSHIFT','BNOT','BOR','BRSHIFT','BXOR','BYTE','CDF',
+ 'CEIL','CEXIST','CINV','CLOSE','CNONCT','COLLATE','COMPBL',
+ 'COMPOUND','COMPRESS','COSH','COS','CSS','CUROBS','CV','DACCDBSL',
+ 'DACCDB','DACCSL','DACCSYD','DACCTAB','DAIRY','DATETIME','DATEJUL',
+ 'DATEPART','DATE','DAY','DCLOSE','DEPDBSL','DEPDB','DEPSL','DEPSYD',
+ 'DEPTAB','DEQUOTE','DHMS','DIF','DIGAMMA','DIM','DINFO','DNUM',
+ 'DOPEN','DOPTNAME','DOPTNUM','DREAD','DROPNOTE','DSNAME','ERFC',
+ 'ERF','EXIST','EXP','FAPPEND','FCLOSE','FCOL','FDELETE','FETCHOBS',
+ 'FETCH','FEXIST','FGET','FILEEXIST','FILENAME','FILEREF','FINFO',
+ 'FINV','FIPNAMEL','FIPNAME','FIPSTATE','FLOOR','FNONCT','FNOTE',
+ 'FOPEN','FOPTNAME','FOPTNUM','FPOINT','FPOS','FPUT','FREAD',
+ 'FREWIND','FRLEN','FSEP','FUZZ','FWRITE','GAMINV','GAMMA',
+ 'GETOPTION','GETVARC','GETVARN','HBOUND','HMS','HOSTHELP','HOUR',
+ 'IBESSEL','INDEXW','INDEXC','INDEX','INPUTN','INPUTC','INPUT',
+ 'INTRR','INTCK','INTNX','INT','IRR','JBESSEL','JULDATE','KURTOSIS',
+ 'LAG','LBOUND','LEFT','LENGTH','LGAMMA','LIBNAME','LIBREF','LOG10',
+ 'LOG2','LOGPDF','LOGPMF','LOGSDF','LOG','LOWCASE','MAX','MDY',
+ 'MEAN','MINUTE','MIN','MOD','MONTH','MOPEN','MORT','NETPV','NMISS',
+ 'NORMAL','NPV','N','OPEN','ORDINAL','PATHNAME','PDF','PEEKC','PEEK',
+ 'PMF','POINT','POISSON','POKE','PROBBETA','PROBBNML','PROBCHI',
+ 'PROBF','PROBGAM','PROBHYPR','PROBIT','PROBNEGB','PROBNORM','PROBT',
+ 'PUTN','PUTC','PUT','QTR','QUOTE','RANBIN','RANCAU','RANEXP',
+ 'RANGAM','RANGE','RANK','RANNOR','RANPOI','RANTBL','RANTRI',
+ 'RANUNI','REPEAT','RESOLVE','REVERSE','REWIND','RIGHT','ROUND',
+ 'SAVING','SCAN','SDF','SECOND','SIGN','SINH','SIN','SKEWNESS',
+ 'SOUNDEX','SPEDIS','SQRT','STDERR','STD','STFIPS','STNAME',
+ 'STNAMEL','SUBSTR','SUM','SYMGET','SYSGET','SYSMSG','SYSPROD',
+ 'SYSRC','SYSTEM','TANH','TAN','TIMEPART','TIME','TINV','TNONCT',
+ 'TODAY','TRANSLATE','TRANWRD','TRIGAMMA','TRIMN','TRIM','TRUNC',
+ 'UNIFORM','UPCASE','USS','VARFMT','VARINFMT','VARLABEL','VARLEN',
+ 'VARNAME','VARNUM','VARRAYX','VARRAY','VARTYPE','VAR','VERIFY',
+ 'VFORMATX','VFORMATDX','VFORMATD','VFORMATNX','VFORMATN',
+ 'VFORMATWX','VFORMATW','VFORMAT','VINARRAYX','VINARRAY',
+ 'VINFORMATX','VINFORMATDX','VINFORMATD','VINFORMATNX','VINFORMATN',
+ 'VINFORMATWX','VINFORMATW','VINFORMAT','VLABELX','VLABEL',
+ 'VLENGTHX','VLENGTH','VNAMEX','VNAME','VTYPEX','VTYPE','WEEKDAY',
+ 'YEAR','YYQ','ZIPFIPS','ZIPNAME','ZIPNAMEL','ZIPSTATE'
+ ),
+ 4 => array(
+ 'ABORT','ADD','ALTER','AND','ARRAY','AS','ATTRIB','BY','CALL',
+ 'CARDS4','CASCADE','CATNAME','CHECK','CONTINUE','CREATE',
+ 'DATALINES4','DELETE','DESCRIBE','DISPLAY','DISTINCT','DM','DROP',
+ 'ENDSAS','FILE','FOOTNOTE','FOREIGN','FORMAT','FROM',
+ 'GOTO','GROUP','HAVING','IN','INFILE','INFORMAT',
+ 'INSERT','INTO','KEEP','KEY','LABEL','LEAVE',
+ 'LIKE','LINK','LIST','LOSTCARD','MERGE','MESSAGE','MISSING',
+ 'MODIFY','MSGTYPE','NOT','NULL','ON','OPTIONS','OR','ORDER',
+ 'OUTPUT','PAGE','PRIMARY','REDIRECT','REFERENCES','REMOVE',
+ 'RENAME','REPLACE','RESET','RESTRICT','RETAIN','RETURN','SELECT',
+ 'SET','SKIP','STARTSAS','STOP','SYSTASK','TABLE','TITLE','UNIQUE',
+ 'UPDATE','VALIDATE','VIEW','WAITSAS','WHERE','WINDOW','X'
+ ),
+ 5 => array(
+ 'DO','ELSE','END','IF','THEN','UNTIL','WHILE'
+ ),
+ 6 => array(
+ 'RUN','QUIT','DATA'
+ ),
+ 7 => array(
+ 'ERROR'
+ ),
+ 8 => array(
+ 'WARNING'
+ ),
+ 9 => array(
+ 'NOTE'
+ )
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ 8 => false,
+ 9 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #0000ff;',
+ 4 => 'color: #0000ff;',
+ 5 => 'color: #0000ff;',
+ 6 => 'color: #000080; font-weight: bold;',
+ 7 => 'color: #ff0000;',
+ 8 => 'color: #00ff00;',
+ 9 => 'color: #0000ff;'
+ ),
+ 'COMMENTS' => array(
+// 1 => 'color: #006400; font-style: italic;',
+ 'MULTI' => 'color: #006400; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #a020f0;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #2e8b57; font-weight: bold;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000ff; font-weight: bold;',
+ 1 => 'color: #000080; font-weight: bold;',
+ 2 => 'color: #006400; font-style: italic;',
+ 3 => 'color: #006400; font-style: italic;',
+ 4 => 'color: #006400; font-style: italic;',
+ 5 => 'color: #ff0000; font-weight: bold;',
+ 6 => 'color: #00ff00; font-style: italic;',
+ 7 => 'color: #0000ff; font-style: normal;',
+ 8 => 'color: #b218b2; font-weight: bold;',
+ 9 => 'color: #b218b2; font-weight: bold;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => '',
+ 9 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => "&amp;[a-zA-Z_][a-zA-Z0-9_]*",
+ 1 => array(//Procedures
+ GESHI_SEARCH => '(^\\s*)(PROC \\w+)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'im',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 2 => array(
+ GESHI_SEARCH => '(^\\s*)(\\*.*;)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'im',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 3 => array(
+ GESHI_SEARCH => '(.*;\\s*)(\\*.*;)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'im',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 4 => array(
+ GESHI_SEARCH => '(^\\s*)(%\\*.*;)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'im',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 5 => array(//Error messages
+ GESHI_SEARCH => '(^ERROR.*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'im',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 6 => array(//Warning messages
+ GESHI_SEARCH => '(^WARNING.*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'im',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 7 => array(//Notice messages
+ GESHI_SEARCH => '(^NOTE.*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'im',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 8 => array(
+ GESHI_SEARCH => '(^\\s*)(CARDS.*)(^\\s*;\\s*$)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'sim',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+ 9 => array(
+ GESHI_SEARCH => '(^\\s*)(DATALINES.*)(^\\s*;\\s*$)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'sim',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/scala.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/scala.php
new file mode 100644
index 00000000..405f59de
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/scala.php
@@ -0,0 +1,138 @@
+<?php
+/*************************************************************************************
+ * scala.php
+ * ----------
+ * Author: Franco Lombardo (franco@francolombardo.net)
+ * Copyright: (c) 2008 Franco Lombardo, Benny Baumann
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/02/08
+ *
+ * Scala language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/02/08 (1.0.7.22)
+ * - First Release
+ *
+ * TODO (updated 2007/04/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Scala',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(2 => "/\\'(?!\w\\'|\\\\)\w+(?=\s)/"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'",'"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[nfrtv\$\"\n\\\\]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{1,2}#i",
+ //Hexadecimal Char Specs (unicode)
+ 3 => "#\\\\u[\da-fA-F]{1,4}#",
+ //Hexadecimal Char Specs (Extended Unicode)
+ 4 => "#\\\\U[\da-fA-F]{1,8}#",
+ ),
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'abstract', 'case', 'catch', 'class', 'def',
+ 'do', 'else', 'extends', 'false', 'final',
+ 'finally', 'for', 'forSome', 'if', 'implicit',
+ 'import', 'match', 'new', 'null', 'object',
+ 'override', 'package', 'private', 'protected', 'requires',
+ 'return', 'sealed', 'super', 'this', 'throw',
+ 'trait', 'try', 'true', 'type', 'val',
+ 'var', 'while', 'with', 'yield'
+ ),
+ 2 => array(
+ 'void', 'double', 'int', 'boolean', 'byte', 'short', 'long', 'char', 'float'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '*', '&', '%', '!', ';', '<', '>', '?',
+ '_', ':', '=', '=>', '<<:',
+ '<%', '>:', '#', '@'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff; font-weight: bold;',
+ 2 => 'color: #9999cc; font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000; font-style: italic;',
+ 2 => 'color: #CC66FF;',
+ 'MULTI' => 'color: #00ff00; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #6666ff; font-weight: bold;',
+ 1 => 'color: #6666ff; font-weight: bold;',
+ 2 => 'color: #5555ff; font-weight: bold;',
+ 3 => 'color: #4444ff; font-weight: bold;',
+ 4 => 'color: #3333ff; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #F78811;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #6666FF;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #F78811;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #000000;',
+ 2 => 'color: #000000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000080;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://scala-lang.org',
+ 2 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/scheme.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/scheme.php
new file mode 100644
index 00000000..a84b9080
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/scheme.php
@@ -0,0 +1,170 @@
+<?php
+/*************************************************************************************
+ * scheme.php
+ * ----------
+ * Author: Jon Raphaelson (jonraphaelson@gmail.com)
+ * Copyright: (c) 2005 Jon Raphaelson, Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/08/30
+ *
+ * Scheme language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/09/22 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2005/09/22)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Scheme',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array('#|' => '|#'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'abs', 'acos', 'and', 'angle', 'append', 'appply', 'approximate',
+ 'asin', 'assoc', 'assq', 'assv', 'atan',
+
+ 'begin', 'boolean?', 'bound-identifier=?',
+
+ 'caar', 'caddr', 'cadr', 'call-with-current-continuation',
+ 'call-with-input-file', 'call-with-output-file', 'call/cc', 'car',
+ 'case', 'catch', 'cdddar', 'cddddr', 'cdr', 'ceiling', 'char->integer',
+ 'char-alphabetic?', 'char-ci<=?', 'char-ci<?', 'char-ci?', 'char-ci>=?',
+ 'char-ci>?', 'char-ci=?', 'char-downcase', 'char-lower-case?',
+ 'char-numeric', 'char-ready', 'char-ready?', 'char-upcase',
+ 'char-upper-case?', 'char-whitespace?', 'char<=?', 'char<?', 'char=?',
+ 'char>=?', 'char>?', 'char?', 'close-input-port', 'close-output-port',
+ 'complex?', 'cond', 'cons', 'construct-identifier', 'cos',
+ 'current-input-port', 'current-output-port',
+
+ 'd', 'define', 'define-syntax', 'delay', 'denominator', 'display', 'do',
+
+ 'e', 'eof-object?', 'eq?', 'equal?', 'eqv?', 'even?', 'exact->inexact',
+ 'exact?', 'exp', 'expt', 'else',
+
+ 'f', 'floor', 'for-each', 'force', 'free-identifer=?',
+
+ 'gcd', 'gen-counter', 'gen-loser', 'generate-identifier',
+
+ 'identifier->symbol', 'identifier', 'if', 'imag-part', 'inexact->exact',
+ 'inexact?', 'input-port?', 'integer->char', 'integer?', 'integrate-system',
+
+ 'l', 'lambda', 'last-pair', 'lcm', 'length', 'let', 'let*', 'letrec',
+ 'list', 'list->string', 'list->vector', 'list-ref', 'list-tail', 'list?',
+ 'load', 'log',
+
+ 'magnitude', 'make-polar', 'make-promise', 'make-rectangular',
+ 'make-string', 'make-vector', 'map', 'map-streams', 'max', 'member',
+ 'memq', 'memv', 'min', 'modulo',
+
+ 'negative', 'newline', 'nil', 'not', 'null?', 'number->string', 'number?',
+ 'numerator',
+
+ 'odd?', 'open-input-file', 'open-output-file', 'or', 'output-port',
+
+ 'pair?', 'peek-char', 'positive?', 'procedure?',
+
+ 'quasiquote', 'quote', 'quotient',
+
+ 'rational', 'rationalize', 'read', 'read-char', 'real-part', 'real?',
+ 'remainder', 'return', 'reverse',
+
+ 's', 'sequence', 'set!', 'set-char!', 'set-cdr!', 'sin', 'sqrt', 'string',
+ 'string->list', 'string->number', 'string->symbol', 'string-append',
+ 'string-ci<=?', 'string-ci<?', 'string-ci=?', 'string-ci>=?',
+ 'string-ci>?', 'string-copy', 'string-fill!', 'string-length',
+ 'string-ref', 'string-set!', 'string<=?', 'string<?', 'string=?',
+ 'string>=?', 'string>?', 'string?', 'substring', 'symbol->string',
+ 'symbol?', 'syntax', 'syntax-rules',
+
+ 't', 'tan', 'template', 'transcript-off', 'transcript-on', 'truncate',
+
+ 'unquote', 'unquote-splicing', 'unwrap-syntax',
+
+ 'vector', 'vector->list', 'vector-fill!', 'vector-length', 'vector-ref',
+ 'vector-set!', 'vector?',
+
+ 'with-input-from-file', 'with-output-to-file', 'write', 'write-char',
+
+ 'zero?'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '!', '%', '^', '&', '/','+','-','*','=','<','>',';','|'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/scilab.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/scilab.php
new file mode 100644
index 00000000..f011497d
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/scilab.php
@@ -0,0 +1,295 @@
+<?php
+/*************************************************************************************
+ * scilab.php
+ * --------
+ * Author: Christophe David (geshi@christophedavid.org)
+ * Copyright: (c) 2008 Christophe David (geshi@christophedavid.org)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/08/04
+ *
+ * SciLab language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/08/25 (1.0.8.1)
+ * - Corrected with the help of Benny Baumann (BenBE@geshi.org)
+ * 2008/08/04 (0.0.0.1)
+ * - First beta Release - known problem with ' used to transpose matrices considered as start of strings
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'SciLab',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ 2 => "/(?<=\)|\]|\w)'/"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'HARDQUOTE' => array("'", "'"),
+ 'HARDESCAPE' => array(),
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'if', 'else', 'elseif', 'end', 'select', 'case', 'for', 'while', 'break'
+ ),
+ 2 => array(
+ 'STDIN', 'STDOUT', 'STDERR',
+ '%i', '%pi', '%e', '%eps', '%nan', '%inf', '%s', '%t', '%f',
+ 'usual', 'polynomial', 'boolean', 'character', 'function', 'rational', 'state-space',
+ 'sparse', 'boolean sparse', 'list', 'tlist', 'library', 'endfunction'
+ ),
+ 3 => array(
+ '%asn', '%helps', '%k', '%sn', 'abcd', 'abinv', 'abort', 'about', 'About_M2SCI_tools',
+ 'abs', 'acos', 'acosh', 'acoshm', 'acosm', 'AdCommunications', 'add_demo', 'add_edge',
+ 'add_help_chapter', 'add_node', 'add_palette', 'addcolor', 'addf', 'addinter', 'addmenu',
+ 'adj_lists', 'adj2sp', 'aff2ab', 'alufunctions', 'amell', 'analpf', 'analyze', 'and',
+ 'ans', 'apropos', 'arc_graph', 'arc_number', 'arc_properties', 'argn', 'arhnk', 'arl2',
+ 'arma', 'arma2p', 'armac', 'armax', 'armax1', 'arsimul', 'artest', 'articul', 'ascii',
+ 'asciimat', 'asin', 'asinh', 'asinhm', 'asinm', 'assignation', 'atan', 'atanh', 'atanhm',
+ 'atanm', 'augment', 'auread', 'auwrite', 'axes_properties', 'axis_properties', 'backslash',
+ 'balanc', 'balreal', 'bandwr', 'banner','bar', 'barh', 'barhomogenize', 'basename', 'bdiag',
+ 'beep', 'besselh', 'besseli', 'besselj', 'besselk', 'bessely', 'best_match', 'beta','bezout',
+ 'bifish', 'bilin', 'binomial', 'black', 'bloc2exp', 'bloc2ss', 'bode', 'bool2s',
+ 'boucle', 'brackets', 'browsevar', 'bsplin3val', 'bstap', 'buttmag', 'buttondialog',
+ 'bvode', 'bvodeS', 'c_link', 'cainv', 'calendar', 'calerf', 'calfrq', 'call', 'canon', 'casc',
+ 'cat', 'catch', 'ccontrg', 'cd', 'cdfbet', 'cdfbin', 'cdfchi', 'cdfchn', 'cdff', 'cdffnc',
+ 'cdfgam', 'cdfnbn', 'cdfnor', 'cdfpoi', 'cdft', 'ceil', 'cell', 'cell2mat', 'cellstr', 'center',
+ 'cepstrum', 'chain_struct', 'chaintest', 'champ', 'champ_properties', 'champ1', 'char', 'chart',
+ 'chartooem', 'chdir', 'cheb1mag', 'cheb2mag', 'check_graph', 'chepol', 'chfact', 'chol', 'chsolve',
+ 'circuit', 'classmarkov', 'clc', 'clean', 'clear', 'clear_pixmap', 'clearfun', 'clearglobal','clf',
+ 'clipboard', 'close', 'cls2dls', 'cmb_lin', 'cmndred', 'cmoment', 'code2str', 'coeff', 'coff', 'coffg',
+ 'colcomp', 'colcompr', 'colinout', 'colon', 'color', 'color_list', 'colorbar', 'colordef', 'colormap',
+ 'colregul', 'comma', 'comments', 'comp', 'companion', 'comparison', 'Compound_properties', 'con_nodes',
+ 'cond', 'config', 'configure_msvc', 'conj', 'connex', 'console', 'cont_frm', 'cont_mat', 'Contents',
+ 'continue', 'contour', 'contour2d', 'contour2di', 'contourf', 'contr', 'contract_edge', 'contrss',
+ 'convex_hull', 'convol', 'convstr', 'copfac', 'copy', 'corr', 'correl', 'cos', 'cosh', 'coshm',
+ 'cosm', 'cotg', 'coth', 'cothm', 'covar', 'create_palette', 'cshep2d', 'csim', 'cspect', 'Cste',
+ 'ctr_gram', 'cumprod', 'cumsum', 'cycle_basis', 'czt', 'dasrt', 'dassl', 'datafit', 'date', 'datenum',
+ 'datevec', 'dbphi', 'dcf', 'ddp', 'debug', 'dec2hex', 'deff', 'definedfields', 'degree', 'delbpt',
+ 'delete', 'delete_arcs', 'delete_nodes', 'delip', 'delmenu', 'demoplay', 'denom', 'derivat', 'derivative',
+ 'des2ss', 'des2tf', 'det', 'determ', 'detr', 'detrend', 'dft', 'dhinf', 'dhnorm', 'diag', 'diary',
+ 'diff', 'diophant', 'dir', 'dirname', 'disp', 'dispbpt', 'dispfiles', 'dlgamma', 'dnaupd', 'do', 'dot',
+ 'double', 'dragrect', 'draw', 'drawaxis', 'drawlater', 'drawnow', 'driver', 'dsaupd', 'dscr',
+ 'dsearch', 'dsimul', 'dt_ility', 'dtsi', 'edge_number', 'edit', 'edit_curv', 'edit_error',
+ 'edit_graph', 'edit_graph_menus', 'editvar', 'eigenmarkov', 'ell1mag',
+ 'empty', 'emptystr', 'eqfir', 'eqiir', 'equal', 'Equal', 'equil', 'equil1',
+ 'ereduc', 'erf', 'erfc', 'erfcx', 'errbar', 'errcatch', 'errclear', 'error', 'error_table', 'etime',
+ 'eval', 'eval_cshep2d', 'eval3d', 'eval3dp', 'evans', 'evstr', 'excel2sci', 'exec', 'execstr', 'exists',
+ 'exit', 'exp', 'expm', 'external', 'extraction', 'eye', 'fac3d', 'factorial', 'factors', 'faurre', 'fchamp',
+ 'fcontour', 'fcontour2d', 'fec', 'fec_properties', 'feedback', 'feval', 'ffilt', 'fft', 'fft2', 'fftshift',
+ 'fgrayplot', 'figure', 'figure_properties', 'figure_style', 'file', 'fileinfo', 'fileparts', 'filter', 'find',
+ 'find_freq', 'find_path', 'findABCD', 'findAC', 'findBD', 'findBDK', 'findm', 'findmsvccompiler', 'findobj',
+ 'findR', 'findx0BD', 'firstnonsingleton', 'fit_dat', 'fix', 'floor', 'flts', 'foo', 'format',
+ 'formatman', 'fort', 'fourplan', 'fplot2d', 'fplot3d', 'fplot3d1', 'fprintf', 'fprintfMat', 'frep2tf',
+ 'freq', 'freson', 'frexp', 'frfit', 'frmag', 'fscanf', 'fscanfMat', 'fsfirlin', 'fsolve', 'fspecg',
+ 'fstabst', 'fstair', 'ftest', 'ftuneq', 'full', 'fullfile', 'fullrf', 'fullrfk', 'fun2string', 'Funcall',
+ 'funcprot', 'functions', 'funptr', 'fusee', 'G_make', 'g_margin', 'gainplot', 'gamitg',
+ 'gamma', 'gammaln', 'gca', 'gcare', 'gcd', 'gce', 'gcf', 'gda', 'gdf', 'gen_net', 'genfac3d', 'genlib',
+ 'genmarkov', 'geom3d', 'geomean', 'get', 'get_contents_infer', 'get_function_path', 'getcolor', 'getcwd',
+ 'getd', 'getdate', 'getenv', 'getf', 'getfield', 'getfont', 'gethistory', 'getio', 'getlinestyle',
+ 'getlongpathname', 'getmark', 'getmemory', 'getos', 'getpid', 'getscilabkeywords', 'getshell',
+ 'getshortpathname', 'getsymbol', 'getvalue', 'getversion', 'gfare', 'gfrancis', 'girth', 'givens',
+ 'glever', 'glist', 'global', 'GlobalProperty', 'glue', 'gmres', 'gpeche', 'gr_menu', 'graduate', 'grand',
+ 'graph_2_mat', 'graph_center', 'graph_complement', 'graph_diameter', 'graph_power', 'graph_simp', 'graph_sum',
+ 'graph_union', 'graphic', 'Graphics', 'graphics_entities', 'graph-list', 'graycolormap', 'grayplot',
+ 'grayplot_properties', 'graypolarplot', 'great', 'grep', 'group', 'gschur', 'gsort', 'gspec', 'gstacksize',
+ 'gtild', 'h_cl', 'h_inf', 'h_inf_st', 'h_norm', 'h2norm', 'halt', 'hamilton', 'hank', 'hankelsv', 'harmean',
+ 'hat', 'havewindow', 'head_comments', 'help', 'help_skeleton', 'hermit', 'hess', 'hex2dec', 'hilb', 'hinf',
+ 'hist3d', 'histplot', 'horner', 'host', 'hotcolormap', 'householder', 'hrmt', 'hsv2rgb', 'hsvcolormap',
+ 'htrianr', 'hypermat', 'hypermatrices', 'iconvert', 'ieee', 'ifft', 'iir', 'iirgroup', 'iirlp',
+ 'ilib_build', 'ilib_compile', 'ilib_for_link', 'ilib_gen_gateway', 'ilib_gen_loader', 'ilib_gen_Make',
+ 'im_inv', 'imag', 'impl', 'imrep2ss', 'imult', 'ind2sub', 'Infer', 'inistate', 'input', 'insertion', 'int',
+ 'int16', 'int2d', 'int32', 'int3d', 'int8', 'intc', 'intdec', 'integrate', 'interp', 'interp1', 'interp2d',
+ 'interp3d', 'interpln', 'intersci', 'intersect', 'intg', 'intl', 'intppty', 'intsplin', 'inttrap', 'inttype',
+ 'inv', 'inv_coeff', 'invr', 'invsyslin', 'iqr', 'is_connex', 'iscellstr', 'isdef', 'isdir', 'isempty',
+ 'isequal', 'isequalbitwise', 'iserror', 'isglobal', 'isinf', 'isnan', 'isoview', 'isreal', 'javasci',
+ 'jetcolormap', 'jmat', 'justify', 'kalm', 'karmarkar', 'kernel', 'keyboard', 'knapsack', 'kpure', 'krac2',
+ 'kron', 'kroneck', 'label_properties', 'labostat', 'LANGUAGE', 'lasterror', 'lattn', 'lattp', 'lcf', 'lcm',
+ 'lcmdiag', 'ldiv', 'ldivf', 'leastsq', 'left', 'legend', 'legend_properties', 'legendre', 'legends', 'length',
+ 'leqr', 'less', 'lev', 'levin', 'lex_sort', 'lft', 'lgfft', 'lib', 'lin', 'lin2mu', 'lindquist',
+ 'line_graph', 'linear_interpn', 'lines', 'LineSpec', 'linf', 'linfn', 'link', 'linmeq', 'linpro', 'linsolve',
+ 'linspace', 'listfiles', 'listvarinfile', 'lmisolver', 'lmitool', 'load', 'load_graph', 'loadhistory',
+ 'loadmatfile', 'loadplots', 'loadwave', 'locate', 'log', 'log10', 'log1p', 'log2', 'logm', 'logspace',
+ 'lotest', 'lqe', 'lqg', 'lqg_ltr', 'lqg2stan', 'lqr', 'ls', 'lsq', 'lsq_splin', 'lsqrsolve', 'lsslist',
+ 'lstcat', 'lstsize', 'ltitr', 'lu', 'ludel', 'lufact', 'luget', 'lusolve', 'lyap', 'm_circle', 'm2scideclare',
+ 'macglov', 'macr2lst', 'macr2tree', 'macro', 'macrovar', 'mad', 'make_graph', 'make_index', 'makecell', 'man',
+ 'manedit', 'mapsound', 'markp2ss', 'mat_2_graph', 'matfile2sci', 'Matlab-Scilab_character_strings', 'Matplot',
+ 'Matplot_properties', 'Matplot1', 'matrices', 'matrix', 'max', 'max_cap_path', 'max_clique', 'max_flow',
+ 'maxi', 'mcisendstring', 'mclearerr', 'mclose', 'mdelete', 'mean', 'meanf', 'median', 'menus', 'meof',
+ 'merror', 'mese', 'mesh', 'mesh2d', 'meshgrid', 'mfft', 'mfile2sci', 'mfprintf', 'mfscanf', 'mget', 'mgeti',
+ 'mgetl', 'mgetstr', 'milk_drop', 'min', 'min_lcost_cflow', 'min_lcost_flow1', 'min_lcost_flow2',
+ 'min_qcost_flow', 'min_weight_tree', 'mine', 'mini', 'minreal', 'minss', 'minus', 'mkdir', 'mlist', 'mode',
+ 'modulo', 'moment', 'mopen', 'move', 'mprintf', 'mps2linpro', 'mput', 'mputl', 'mputstr', 'mrfit', 'mscanf',
+ 'msd', 'mseek', 'msprintf', 'msscanf', 'mstr2sci', 'mtell', 'mtlb_0', 'mtlb_a', 'mtlb_all', 'mtlb_any',
+ 'mtlb_axis', 'mtlb_beta', 'mtlb_box', 'mtlb_close', 'mtlb_colordef', 'mtlb_conv', 'mtlb_cumprod', 'mtlb_cumsum',
+ 'mtlb_dec2hex', 'mtlb_delete', 'mtlb_diag', 'mtlb_diff', 'mtlb_dir', 'mtlb_double', 'mtlb_e', 'mtlb_echo',
+ 'mtlb_eig', 'mtlb_eval', 'mtlb_exist', 'mtlb_eye', 'mtlb_false', 'mtlb_fft', 'mtlb_fftshift', 'mtlb_find',
+ 'mtlb_findstr', 'mtlb_fliplr', 'mtlb_fopen', 'mtlb_format', 'mtlb_fprintf', 'mtlb_fread', 'mtlb_fscanf',
+ 'mtlb_full', 'mtlb_fwrite', 'mtlb_grid', 'mtlb_hold', 'mtlb_i', 'mtlb_ifft', 'mtlb_imp', 'mtlb_int16',
+ 'mtlb_int32', 'mtlb_int8', 'mtlb_is', 'mtlb_isa', 'mtlb_isfield', 'mtlb_isletter', 'mtlb_isspace', 'mtlb_l',
+ 'mtlb_legendre', 'mtlb_linspace', 'mtlb_load', 'mtlb_logic', 'mtlb_logical', 'mtlb_lower', 'mtlb_max',
+ 'mtlb_min', 'mtlb_mode', 'mtlb_more', 'mtlb_num2str', 'mtlb_ones', 'mtlb_plot', 'mtlb_prod', 'mtlb_rand',
+ 'mtlb_randn', 'mtlb_rcond', 'mtlb_realmax', 'mtlb_realmin', 'mtlb_repmat', 'mtlb_s', 'mtlb_save',
+ 'mtlb_setstr', 'mtlb_size', 'mtlb_sort', 'mtlb_sparse', 'mtlb_strcmp', 'mtlb_strcmpi', 'mtlb_strfind',
+ 'mtlb_strrep', 'mtlb_sum', 'mtlb_t', 'mtlb_toeplitz', 'mtlb_tril', 'mtlb_triu', 'mtlb_true', 'mtlb_uint16',
+ 'mtlb_uint32', 'mtlb_uint8', 'mtlb_upper', 'mtlb_zeros', 'mu2lin', 'mucomp', 'mulf', 'mvvacov', 'name2rgb',
+ 'names', 'nancumsum', 'nand2mean', 'nanmax', 'nanmean', 'nanmeanf', 'nanmedian', 'nanmin', 'nanstdev',
+ 'nansum', 'narsimul', 'NDcost', 'ndgrid', 'ndims', 'nearfloat', 'nehari', 'neighbors', 'netclose', 'netwindow',
+ 'netwindows', 'new', 'newaxes', 'newest', 'newfun', 'nextpow2', 'nf3d', 'nfreq', 'nlev', 'nnz', 'node_number',
+ 'nodes_2_path', 'nodes_degrees', 'noisegen', 'norm', 'not', 'null', 'number_properties', 'numdiff', 'numer',
+ 'nyquist', 'object_editor', 'obs_gram', 'obscont', 'obscont1', 'observer', 'obsv_mat', 'obsvss', 'ode',
+ 'ode_discrete', 'ode_optional_output', 'ode_root', 'odedc', 'odeoptions', 'oemtochar', 'old_style',
+ 'oldbesseli', 'oldbesselj', 'oldbesselk', 'oldbessely', 'oldload', 'oldplot', 'oldsave', 'ones',
+ 'Operation', 'optim', 'or', 'orth', 'overloading', 'p_margin', 'param3d', 'param3d_properties',
+ 'param3d1', 'paramfplot2d', 'parents', 'parrot', 'part', 'path_2_nodes', 'pathconvert', 'pause', 'pbig',
+ 'pca', 'pcg', 'pdiv', 'pen2ea', 'pencan', 'penlaur', 'percent', 'perctl', 'perfect_match', 'perl',
+ 'perms', 'permute', 'pertrans', 'pfss', 'phasemag', 'phc', 'pie', 'pinv', 'pipe_network', 'playsnd', 'plot',
+ 'plot_graph', 'plot2d', 'plot2d_old_version', 'plot2d1', 'plot2d2', 'plot2d3', 'plot2d4', 'plot3d',
+ 'plot3d_old_version', 'plot3d1', 'plot3d2', 'plot3d3', 'plotframe', 'plotprofile', 'plus', 'plzr',
+ 'pmodulo', 'pol2des', 'pol2str', 'pol2tex', 'polar', 'polarplot', 'polfact', 'poly', 'polyline_properties',
+ 'portr3d', 'portrait', 'power', 'ppol', 'prbs_a', 'predecessors', 'predef', 'print', 'printf',
+ 'printf_conversion', 'printing', 'printsetupbox', 'prod', 'profile', 'progressionbar', 'proj', 'projsl',
+ 'projspec', 'psmall', 'pspect', 'pvm', 'pvm_addhosts', 'pvm_barrier', 'pvm_bcast', 'pvm_bufinfo', 'pvm_config',
+ 'pvm_delhosts', 'pvm_error', 'pvm_exit', 'pvm_f772sci', 'pvm_get_timer', 'pvm_getinst', 'pvm_gettid',
+ 'pvm_gsize', 'pvm_halt', 'pvm_joingroup', 'pvm_kill', 'pvm_lvgroup', 'pvm_mytid', 'pvm_parent', 'pvm_probe',
+ 'pvm_recv', 'pvm_reduce', 'pvm_sci2f77', 'pvm_send', 'pvm_set_timer', 'pvm_spawn', 'pvm_spawn_independent',
+ 'pvm_start', 'pvm_tasks', 'pvm_tidtohost', 'pvmd3', 'pwd', 'qassign', 'qld', 'qmr', 'qr', 'quapro', 'quart',
+ 'quaskro', 'quit', 'quote', 'rand', 'randpencil', 'range', 'rank', 'rankqr', 'rat', 'rcond',
+ 'rdivf', 'read', 'read4b', 'readb', 'readc_', 'readmps', 'readxls', 'real', 'realtime', 'realtimeinit',
+ 'rectangle_properties', 'recur', 'reglin', 'regress', 'remez', 'remezb', 'repfreq', 'replot', 'resethistory',
+ 'residu', 'resume', 'return', 'rgb2name', 'ric_desc', 'ricc', 'riccati', 'rlist', 'rmdir', 'roots', 'rotate',
+ 'round', 'routh_t', 'rowcomp', 'rowcompr', 'rowinout', 'rowregul', 'rowshuff', 'rpem', 'rref', 'rtitr',
+ 'rubberbox', 'salesman', 'sample', 'samplef', 'samwr', 'save', 'save_format', 'save_graph', 'savehistory',
+ 'savematfile', 'savewave', 'sca', 'scaling', 'scanf', 'scanf_conversion', 'scf', 'schur', 'sci_files',
+ 'sci2exp', 'sci2for', 'sci2map', 'sciargs', 'SciComplex', 'SciComplexArray', 'SciDouble', 'SciDoubleArray',
+ 'scilab', 'Scilab', 'ScilabEval', 'scilink', 'scipad', 'SciString', 'SciStringArray', 'sd2sci', 'sda', 'sdf',
+ 'secto3d', 'segs_properties', 'semi', 'semicolon', 'semidef', 'sensi', 'set', 'set_posfig_dim',
+ 'setbpt', 'setdiff', 'setenv', 'seteventhandler', 'setfield', 'sethomedirectory', 'setlanguage', 'setmenu',
+ 'sfact', 'Sfgrayplot', 'Sgrayplot', 'sgrid', 'shortest_path', 'show_arcs', 'show_graph', 'show_nodes',
+ 'show_pixmap', 'showprofile', 'sident', 'sign', 'Signal', 'signm', 'simp', 'simp_mode', 'sin', 'sinc',
+ 'sincd', 'sinh', 'sinhm', 'sinm', 'size', 'slash', 'sleep', 'sm2des', 'sm2ss', 'smooth', 'solve',
+ 'sorder', 'sort', 'sound', 'soundsec', 'sp2adj', 'spaninter', 'spanplus', 'spantwo', 'spchol',
+ 'spcompack', 'spec', 'specfact', 'speye', 'spget', 'splin', 'splin2d', 'splin3d', 'split_edge', 'spones',
+ 'sprand', 'sprintf', 'spzeros', 'sqroot', 'sqrt', 'sqrtm', 'square', 'squarewave', 'srfaur', 'srkf', 'ss2des',
+ 'ss2ss', 'ss2tf', 'sscanf', 'sskf', 'ssprint', 'ssrand', 'st_deviation', 'st_ility', 'stabil', 'stacksize',
+ 'star', 'startup', 'stdev', 'stdevf', 'str2code', 'strange', 'strcat', 'strindex', 'string', 'stringbox',
+ 'strings', 'stripblanks', 'strong_con_nodes', 'strong_connex', 'strsplit', 'strsubst', 'struct', 'sub2ind',
+ 'subf', 'subgraph', 'subplot', 'successors', 'sum', 'supernode', 'surf', 'surface_properties', 'sva',
+ 'svd', 'svplot', 'sylm', 'sylv', 'symbols', 'sysconv', 'sysdiag', 'sysfact', 'syslin', 'syssize', 'system',
+ 'systems', 'systmat', 'tabul', 'tan', 'tangent', 'tanh', 'tanhm', 'tanm', 'TCL_CreateSlave', 'TCL_DeleteInterp',
+ 'TCL_EvalFile', 'TCL_EvalStr', 'TCL_ExistInterp', 'TCL_ExistVar', 'TCL_GetVar', 'TCL_GetVersion', 'TCL_SetVar',
+ 'TCL_UnsetVar', 'TCL_UpVar', 'tdinit', 'testmatrix', 'texprint', 'text_properties', 'tf2des', 'tf2ss', 'then',
+ 'thrownan', 'tic', 'tilda', 'time_id', 'timer', 'title', 'titlepage', 'TK_EvalFile', 'TK_EvalStr', 'tk_getdir',
+ 'tk_getfile', 'TK_GetVar', 'tk_savefile', 'TK_SetVar', 'toc', 'toeplitz', 'tohome', 'tokenpos',
+ 'tokens', 'toolbar', 'toprint', 'trace', 'trans', 'trans_closure', 'translatepaths', 'tree2code', 'trfmod',
+ 'trianfml', 'tril', 'trimmean', 'trisolve', 'triu', 'try', 'trzeros', 'twinkle', 'type', 'Type', 'typename',
+ 'typeof', 'ui_observer', 'uicontrol', 'uimenu', 'uint16', 'uint32', 'uint8', 'ulink', 'unglue', 'union',
+ 'unique', 'unix', 'unix_g', 'unix_s', 'unix_w', 'unix_x', 'unobs', 'unsetmenu', 'unzoom', 'user', 'varargin',
+ 'varargout', 'Variable', 'variance', 'variancef', 'varn', 'vectorfind', 'waitbar', 'warning', 'wavread',
+ 'wavwrite', 'wcenter', 'wfir', 'what', 'where', 'whereami', 'whereis', 'who', 'who_user', 'whos',
+ 'wiener', 'wigner', 'winclose', 'window', 'winlist', 'winopen', 'winqueryreg', 'winsid', 'with_atlas',
+ 'with_gtk', 'with_javasci', 'with_pvm', 'with_texmacs', 'with_tk', 'writb', 'write', 'write4b', 'x_choices',
+ 'x_choose', 'x_dialog', 'x_matrix', 'x_mdialog', 'x_message', 'x_message_modeless', 'xarc', 'xarcs', 'xarrows',
+ 'xaxis', 'xbasc', 'xbasimp', 'xbasr', 'xchange', 'xclea', 'xclear', 'xclick', 'xclip', 'xdel', 'xend',
+ 'xfarc', 'xfarcs', 'xfpoly', 'xfpolys', 'xfrect', 'xget', 'xgetech', 'xgetfile', 'xgetmouse', 'xgraduate',
+ 'xgrid', 'xinfo', 'xinit', 'xlfont', 'xload', 'xls_open', 'xls_read', 'xmltohtml', 'xname', 'xnumb', 'xpause',
+ 'xpoly', 'xpolys', 'xrect', 'xrects', 'xrpoly', 'xs2bmp', 'xs2emf', 'xs2eps', 'xs2fig', 'xs2gif', 'xs2ppm',
+ 'xs2ps', 'xsave', 'xsegs', 'xselect', 'xset', 'xsetech', 'xsetm', 'xstring', 'xstringb', 'xstringl', 'xtape',
+ 'xtitle', 'yulewalk', 'zeropen', 'zeros', 'zgrid', 'zoom_rect', 'zpbutt', 'zpch1', 'zpch2', 'zpell'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '<', '>', '=',
+ '!', '@', '~', '&', '|',
+ '+','-', '*', '/', '%',
+ ',', ';', '?', ':', "'"
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => '',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;',
+ 'HARD' => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;',
+ 2 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000ff;',
+ 4 => 'color: #009999;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://www.scilab.org/product/dic-mat-sci/M2SCI_doc.htm',
+ 2 => 'http://www.scilab.org/product/dic-mat-sci/M2SCI_doc.htm',
+ 3 => 'http://www.scilab.org/product/dic-mat-sci/M2SCI_doc.htm'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '-&gt;',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ //Variable
+ 0 => '[\\$%@]+[a-zA-Z_][a-zA-Z0-9_]*',
+ //File Descriptor
+ 4 => '&lt;[a-zA-Z_][a-zA-Z0-9_]*&gt;',
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/sdlbasic.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/sdlbasic.php
new file mode 100644
index 00000000..381161fd
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/sdlbasic.php
@@ -0,0 +1,165 @@
+<?php
+/*************************************************************************************
+ * sdlbasic.php
+ * ------------
+ * Author: Roberto Rossi
+ * Copyright: (c) 2005 Roberto Rossi (http://rsoftware.altervista.org)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/08/19
+ *
+ * sdlBasic (http://sdlbasic.sf.net) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2005/08/19 (1.0.0)
+ * - First Release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'sdlBasic',
+ 'COMMENT_SINGLE' => array(1 => "'", 2 => "rem", 3 => "!", 4 => "#"),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'const', 'option', 'explicit', 'qbasic', 'include', 'argc',
+ 'argv', 'command', 'command$', 'run', 'shell', 'os', 'declare',
+ 'sub', 'function', 'return', 'while', 'wend', 'exit', 'end',
+ 'continue', 'if', 'then', 'else', 'elseif',
+ 'select', 'case', 'for', 'each', 'step',
+ 'next', 'to', 'dim', 'shared', 'common', 'lbound', 'bound',
+ 'erase', 'asc', 'chr', 'chr$', 'insert', 'insert$', 'instr', 'lcase',
+ 'lcase$', 'left', 'left$', 'len', 'length', 'ltrim', 'ltrim$', 'mid',
+ 'mid$', 'replace', 'replace$', 'replacesubstr', 'replacesubstr$',
+ 'reverse', 'reverse$', 'right', 'right$', 'rinstr', 'rtrim', 'rtrim$',
+ 'space', 'space$', 'str', 'str$', 'strf', 'strf$', 'string', 'string$',
+ 'tally', 'trim', 'trim$', 'typeof', 'typeof$', 'ucase', 'ucase$', 'val',
+ 'abs', 'acos', 'andbit', 'asin', 'atan', 'bitwiseand', 'bitwiseor',
+ 'bitwisexor', 'cos', 'exp', 'fix', 'floor', 'frac', 'hex', 'hex$', 'int',
+ 'log', 'min', 'max', 'orbit', 'randomize', 'rnd', 'round', 'sgn', 'sin',
+ 'sqr', 'tan', 'xorbit', 'open', 'as', 'file', 'input', 'close', 'output',
+ 'append', 'eof', 'fileexists', 'filecopy', 'filemove', 'filerename',
+ 'freefile', 'kill', 'loc', 'lof', 'readbyte', 'rename', 'seek',
+ 'writebyte', 'chdir', 'dir', 'dir$', 'direxists', 'dirfirst', 'dirnext',
+ 'mkdir', 'rmdir', 'print', 'date', 'date$', 'time', 'time$', 'ticks',
+ 'data', 'read', 'reservebank', 'freebank', 'copybank', 'loadbank',
+ 'savebank', 'setbank', 'sizebank', 'poke', 'doke', 'loke', 'peek', 'deek',
+ 'leek', 'memcopy', 'setdisplay', 'setcaption', 'caption', 'displaywidth',
+ 'displayheight', 'displaybpp', 'screen', 'directscreen', 'screenopen',
+ 'screenclose', 'screenclone', 'screencopy', 'screenfade', 'screenfadein',
+ 'screencrossfade', 'screenalpha', 'screenlock', 'screenunlock',
+ 'screenrect', 'xscreenrect', 'yscreenrect', 'wscreenrect', 'hscreenrect',
+ 'flagscreenrect', 'screenwidth', 'screenheight', 'offset', 'xoffset',
+ 'yoffset', 'cls', 'screenswap', 'autoback', 'setautoback',
+ 'dualplayfield', 'waitvbl', 'fps', 'rgb', 'enablepalette', 'color',
+ 'palette', 'colorcycling', 'ink', 'point', 'dot', 'plot', 'line', 'box',
+ 'bar', 'circle', 'fillcircle', 'ellipse', 'fillellipse', 'paint',
+ 'loadimage', 'saveimage', 'loadsound', 'savesound', 'loadmusic',
+ 'hotspot', 'setcolorkey', 'imageexists', 'imagewidth', 'imageheight',
+ 'deleteimage', 'copyimage', 'setalpha', 'zoomimage', 'rotateimage',
+ 'rotozoomimage', 'blt', 'pastebob', 'pasteicon', 'grab', 'spriteclip',
+ 'sprite', 'deletesprite', 'xsprite', 'ysprite', 'spritewidth',
+ 'spriteheight', 'frsprite', 'livesprite', 'spritehit', 'autoupdatesprite',
+ 'updatesprite', 'setbob', 'bob', 'deletebob', 'xbob', 'ybob', 'bobwidth',
+ 'bobheight', 'frbob', 'livebob', 'bobhit', 'autoupdatebob', 'updatebob',
+ 'text', 'setfont', 'textrender', 'pen', 'paper', 'prints', 'locate',
+ 'atx', 'aty', 'curson', 'cursoff', 'inputs', 'zoneinputs',
+ 'isenabledsound', 'soundexists', 'deletesound', 'copysound',
+ 'musicexists', 'playsound', 'volumesound', 'stopsound', 'pausesound',
+ 'resumesound', 'vumetersound', 'positionsound', 'soundchannels',
+ 'playmusic', 'positionmusic', 'stopmusic', 'fademusic', 'pausemusic',
+ 'resumemusic', 'rewindmusic', 'volumemusic', 'speedmusic', 'numdrivescd',
+ 'namecd', 'getfreecd', 'opencd', 'indrivecd', 'trackscd', 'curtrackcd',
+ 'curframecd', 'playcd', 'playtrackscd',
+ 'pausecd', 'resumecd', 'stopcd', 'ejectcd', 'closecd', 'tracktypecd',
+ 'tracklengthcd', 'trackoffsetcd', 'key', 'inkey', 'waitkey', 'xmouse',
+ 'ymouse', 'xmousescreen', 'ymousescreen', 'bmouse', 'changemouse',
+ 'locatemouse', 'mouseshow', 'mousehide', 'mousezone', 'numjoysticks',
+ 'namejoystick', 'numaxesjoystick', 'numballsjoystick', 'numhatsjoystick',
+ 'numbuttonsjoystick', 'getaxisjoystick', 'gethatjoystick',
+ 'getbuttonjoystick', 'xgetballjoystick', 'ygetballjoystick', 'joy',
+ 'bjoy', 'wait', 'timer', 'isenabledsock', 'getfreesock', 'opensock',
+ 'acceptsock', 'isserverready', 'connectsock', 'connectionreadysock',
+ 'isclientready', 'losesock', 'peeksock', 'readsock', 'readbytesock',
+ 'readlinesock', 'writesock', 'writebytesock', 'writelinesock',
+ 'getremoteip', 'getremoteport', 'getlocalip'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080;',
+ 2 => 'color: #808080;',
+ 3 => 'color: #808080;',
+ 4 => 'color: #808080;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/smalltalk.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/smalltalk.php
new file mode 100644
index 00000000..5b61bada
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/smalltalk.php
@@ -0,0 +1,154 @@
+<?php
+/*************************************************************************************
+ * smalltalk.php
+ * --------
+ * Author: Bananeweizen (Bananeweizen@gmx.de)
+ * Copyright: (c) 2005 Bananeweizen (www.bananeweizen.de)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/03/27
+ *
+ * Smalltalk language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2006-05-24 (1.0.0)
+ * - First Release
+ *
+ * TODO
+ * -------------------------
+ * * recognize nested array symbols correctly
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Smalltalk',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array('"' => '"'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'"),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'self','super','true','false','nil'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '[', ']', '=' , ':=', '(', ')', '#'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #7f007f;'
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'color: #007f00; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => ''
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #7f0000;'
+ ),
+ 'METHODS' => array(
+ 0 => ''
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066; font-weight:bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000ff;',
+ 1 => 'color: #7f0000;',
+ 2 => 'color: #7f0000;',
+ 3 => 'color: #00007f;',
+ 5 => 'color: #00007f;',
+ 6 => 'color: #00007f;'
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => array(
+ GESHI_SEARCH => '([^a-zA-Z0-9_#<])([A-Z]+[a-zA-Z0-9_]*)(?!>)', //class names
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 1 => array(
+ GESHI_SEARCH => '(#+)([a-zA-Z0-9_]+)', //symbols
+ GESHI_REPLACE => '\\1\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 2 => array(
+ GESHI_SEARCH => '(#\s*\([^)]*\))', //array symbols
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 3 => array(
+ GESHI_SEARCH => '<PIPE>([a-zA-Z0-9_\s]+)<PIPE>', //temporary variables
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '|',
+ GESHI_AFTER => '|'
+ ),
+ 5 => array(
+ GESHI_SEARCH => '([:(,=[.*\/+-]\s*(?!\d+\/))([a-zA-Z0-9_]+)', //message parameters, message receivers
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 's',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 6 => array(
+ GESHI_SEARCH => '([a-zA-Z0-9_]+)(\s*:=)', //assignment targets
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '\\2'
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/smarty.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/smarty.php
new file mode 100644
index 00000000..86e9d44c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/smarty.php
@@ -0,0 +1,192 @@
+<?php
+/*************************************************************************************
+ * smarty.php
+ * ----------
+ * Author: Alan Juden (alan@judenware.org)
+ * Copyright: (c) 2004 Alan Juden, Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/07/10
+ *
+ * Smarty template language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2004/11/27 (1.0.0)
+ * - Initial Release
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Smarty',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array('{*' => '*}'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ '$smarty', 'now', 'const', 'capture', 'config', 'section', 'foreach', 'template', 'version', 'ldelim', 'rdelim',
+ 'foreachelse', 'include', 'include_php', 'insert', 'if', 'elseif', 'else', 'php',
+ 'sectionelse', 'is_cached',
+ ),
+ 2 => array(
+ 'capitalize', 'count_characters', 'cat', 'count_paragraphs', 'count_sentences', 'count_words', 'date_format',
+ 'default', 'escape', 'indent', 'lower', 'nl2br', 'regex_replace', 'replace', 'spacify', 'string_format',
+ 'strip', 'strip_tags', 'truncate', 'upper', 'wordwrap',
+ ),
+ 3 => array(
+ 'counter', 'cycle', 'debug', 'eval', 'html_checkboxes', 'html_image', 'html_options',
+ 'html_radios', 'html_select_date', 'html_select_time', 'html_table', 'math', 'mailto', 'popup_init',
+ 'popup', 'textformat'
+ ),
+ 4 => array(
+ '$template_dir', '$compile_dir', '$config_dir', '$plugins_dir', '$debugging', '$debug_tpl',
+ '$debugging_ctrl', '$autoload_filters', '$compile_check', '$force_compile', '$caching', '$cache_dir',
+ '$cache_lifetime', '$cache_handler_func', '$cache_modified_check', '$config_overwrite',
+ '$config_booleanize', '$config_read_hidden', '$config_fix_newlines', '$default_template_handler_func',
+ '$php_handling', '$security', '$secure_dir', '$security_settings', '$trusted_dir', '$left_delimiter',
+ '$right_delimiter', '$compiler_class', '$request_vars_order', '$request_use_auto_globals',
+ '$error_reporting', '$compile_id', '$use_sub_dirs', '$default_modifiers', '$default_resource_type'
+ ),
+ 5 => array(
+ 'append', 'append_by_ref', 'assign', 'assign_by_ref', 'clear_all_assign', 'clear_all_cache',
+ 'clear_assign', 'clear_cache', 'clear_compiled_tpl', 'clear_config', 'config_load', 'display',
+ 'fetch', 'get_config_vars', 'get_registered_object', 'get_template_vars',
+ 'load_filter', 'register_block', 'register_compiler_function', 'register_function',
+ 'register_modifier', 'register_object', 'register_outputfilter', 'register_postfilter',
+ 'register_prefilter', 'register_resource', 'trigger_error', 'template_exists', 'unregister_block',
+ 'unregister_compiler_function', 'unregister_function', 'unregister_modifier', 'unregister_object',
+ 'unregister_outputfilter', 'unregister_postfilter', 'unregister_prefilter', 'unregister_resource'
+ ),
+ 6 => array(
+ 'name', 'file', 'scope', 'global', 'key', 'once', 'script',
+ 'loop', 'start', 'step', 'max', 'show', 'values', 'value', 'from', 'item'
+ ),
+ 7 => array(
+ 'eq', 'neq', 'ne', 'lte', 'gte', 'ge', 'le', 'not', 'mod'
+ ),
+ 8 => array(
+ // some common php functions
+ 'isset', 'is_array', 'empty', 'count', 'sizeof'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '/', '=', '==', '!=', '>', '<', '>=', '<=', '!', '%'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ 8 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0600FF;', //Functions
+ 2 => 'color: #008000;', //Modifiers
+ 3 => 'color: #0600FF;', //Custom Functions
+ 4 => 'color: #804040;', //Variables
+ 5 => 'color: #008000;', //Methods
+ 6 => 'color: #6A0A0A;', //Attributes
+ 7 => 'color: #D36900;', //Text-based symbols
+ 8 => 'color: #0600FF;' //php functions
+ ),
+ 'COMMENTS' => array(
+ 'MULTI' => 'color: #008080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #D36900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #D36900;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #009000;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #00aaff;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://smarty.php.net/{FNAMEL}',
+ 2 => 'http://smarty.php.net/{FNAMEL}',
+ 3 => 'http://smarty.php.net/{FNAMEL}',
+ 4 => 'http://smarty.php.net/{FNAMEL}',
+ 5 => 'http://smarty.php.net/{FNAMEL}',
+ 6 => '',
+ 7 => 'http://smarty.php.net/{FNAMEL}',
+ 8 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ // variables
+ 0 => '\$[a-zA-Z][a-zA-Z0-9_]*'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_ALWAYS,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '{' => '}'
+ ),
+ 1 => array(
+ '<!--' => '-->',
+ ),
+ 2 => array(
+ '<' => '>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => false,
+ 2 => false
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#;>|^])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_<\|%\\-&])"
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/spark.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/spark.php
new file mode 100644
index 00000000..0284a1a4
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/spark.php
@@ -0,0 +1,132 @@
+<?php
+/*************************************************************************************
+ * ada.php
+ * -------
+ * Author: Phil Thornley (tux@inmail.cz)
+ * Copyright: (c) 2004 Phil Thornley (http://www.sparksure.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/08/22
+ *
+ * SPARK language file for GeSHi.
+ *
+ * Created by modifying Ada file version 1.0.2
+ * Words are from SciTe configuration file
+ *
+ * CHANGES
+ * -------
+ * 2010/08/28 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2010/08/22)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'SPARK',
+ 'COMMENT_SINGLE' => array(1 => '--', 2 => '--#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'begin', 'declare', 'do', 'else', 'elsif', 'exception', 'for', 'if',
+ 'is', 'loop', 'while', 'then', 'end', 'select', 'case', 'until',
+ 'goto', 'return'
+ ),
+ 2 => array(
+ 'abs', 'and', 'at', 'mod', 'not', 'or', 'rem', 'xor'
+ ),
+ 3 => array(
+ 'abort', 'abstract', 'accept', 'access', 'aliased', 'all', 'array',
+ 'body', 'constant', 'delay', 'delta', 'digits', 'entry', 'exit',
+ 'function', 'generic', 'in', 'interface', 'limited', 'new', 'null',
+ 'of', 'others', 'out', 'overriding', 'package', 'pragma', 'private',
+ 'procedure', 'protected', 'raise', 'range', 'record', 'renames',
+ 'requeue', 'reverse', 'separate', 'subtype', 'synchronized',
+ 'tagged', 'task', 'terminate', 'type', 'use', 'when', 'with'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00007f;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #46aa03; font-weight:bold;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ 2 => 'color: #adadad; font-style: italic; font-weight: bold;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/sparql.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/sparql.php
new file mode 100644
index 00000000..282165a0
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/sparql.php
@@ -0,0 +1,155 @@
+<?php
+/*************************************************************************************
+ * sparql.php
+ * -------
+ * Author: Karima Rafes (karima.rafes@bordercloud.com)
+ * Copyright: (c) 2011 Bourdercloud.com
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/11/05
+ *
+ * SPARQL language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2011/11/05 (1.0.0)
+ * - First Release
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'SPARQL',
+ 'COMMENT_SINGLE' => array('#'),
+ 'COMMENT_MULTI' => array('/*' => '*/' ),
+ 'COMMENT_REGEXP' => array(
+ //IRI (it's not a comment ;)
+ 1 => "/<[^> ]*>/i"
+ ),
+ 'CASE_KEYWORDS' => 1,
+ 'QUOTEMARKS' => array("'", '"', '`'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'BASE','PREFIX','SELECT','DISTINCT','REDUCED','CONSTRUCT','DESCRIBE','ASK','FROM',
+ 'NAMED','WHERE','ORDER','BY','ASC','DESC','LIMIT','OFFSET','OPTIONAL','GRAPH',
+ 'UNION','FILTER','STR','LANG','LANGMATCHES','DATATYPE','BOUND','SAMETERM',
+ 'ISIRI','ISURI','ISBLANK',
+ 'ISLITERAL','REGEX','SUBSTR','TRUE',
+ 'FALSE','LOAD','CLEAR',
+ 'DROP','ADD','MOVE','COPY',
+ 'CREATE','DELETE','INSERT',
+ 'USING','SILENT','DEFAULT','ALL',
+ 'DATA','WITH','INTO','TO',
+ 'AS','GROUP','HAVING','UNDEF',
+ 'BINDINGS','SERVICE','BIND','MINUS_KEYWORD',
+ 'IRI','URI', 'BNODE',
+ 'RAND','ABS','CEIL','FLOOR','ROUND',
+ 'CONCAT','STRLEN',
+ 'UCASE','LCASE','ENCODE_FOR_URI',
+ 'CONTAINS','STRSTARTS',
+ 'STRENDS','STRBEFORE',
+ 'STRAFTER','REPLACE',
+ 'YEAR','MONTH',
+ 'DAY','HOURS',
+ 'MINUTES','SECONDS',
+ 'TIMEZONE','TZ',
+ 'NOW','MD5',
+ 'SHA1','SHA224',
+ 'SHA256','SHA384',
+ 'SHA512','COALESCE',
+ 'IF','STRLANG','STRDT',
+ 'ISNUMERIC','COUNT',
+ 'SUM','MIN',
+ 'MAX','AVG','SAMPLE',
+ 'GROUP_CONCAT ','NOT',
+ 'IN','EXISTS','SEPARATOR'
+ )
+ ),
+ 'REGEXPS' => array(
+ //Variables without braces
+ 1 => "\\?[a-zA-Z_][a-zA-Z0-9_]*",
+ //prefix
+ 2 => "[a-zA-Z_.\\-0-9]*:",
+ //tag lang
+ 3 => "@[^ .)}]*",
+ ),
+ 'SYMBOLS' => array(
+ 0 => array(
+ '{', '}' , '.', ';'
+ ),
+ 1 => array(
+ '^^',
+ '<=','>=','!=','=','<','>','|',
+ '&&','||',
+ '(',')','[', ']',
+ '+','-','*','!','/'
+ ),
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #993333; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #808080; font-style: italic;',
+ 1 => 'color: #000078;',
+ //2 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF63C3;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #0000FF;',
+ 1 => 'color: #FF8000; font-weight: bold;'
+ ),
+ 'SCRIPT' => array(),
+ 'REGEXPS' => array(
+ 1 => 'color: #007800;',
+ 2 => 'color: #780078;',
+ 3 => 'color: #005078;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/sql.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/sql.php
new file mode 100644
index 00000000..4d08a51f
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/sql.php
@@ -0,0 +1,165 @@
+<?php
+/*************************************************************************************
+ * sql.php
+ * -------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Contributors:
+ * - Jürgen Thomas (Juergen.Thomas@vs-polis.de)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/04
+ *
+ * SQL language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/07/19 (1.0.8.9)
+ * - Added many more keywords
+ * 2008/05/23 (1.0.7.22)
+ * - Added additional symbols for highlighting
+ * 2004/11/27 (1.0.3)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.2)
+ * - Added "`" string delimiter
+ * - Added "#" single comment starter
+ * 2004/08/05 (1.0.1)
+ * - Added support for symbols
+ * - Added many more keywords (mostly MYSQL keywords)
+ * 2004/07/14 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ * * Add all keywords
+ * * Split this to several sql files - mysql-sql, ansi-sql etc
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'SQL',
+ 'COMMENT_SINGLE' => array(1 =>'--'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => 1,
+ 'QUOTEMARKS' => array("'", '"', '`'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'ADD', 'ALL', 'ALTER', 'AND', 'AS', 'ASC', 'AUTO_INCREMENT',
+ 'BEFORE', 'BEGIN', 'BETWEEN', 'BIGINT', 'BINARY', 'BLOB', 'BOOLEAN', 'BOTH', 'BY',
+ 'CALL', 'CASE', 'CAST', 'CEIL', 'CEILING', 'CHANGE', 'CHAR', 'CHAR_LENGTH', 'CHARACTER',
+ 'CHARACTER_LENGTH', 'CHECK', 'CLOB', 'COALESCE', 'COLLATE', 'COLUMN', 'COLUMNS',
+ 'CONNECT', 'CONSTRAINT', 'CONVERT', 'COUNT', 'CREATE', 'CROSS', 'CURRENT',
+ 'CURRENT_DATE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER',
+ 'DATA', 'DATABASE', 'DATABASES', 'DATE', 'DAY', 'DEC', 'DECIMAL', 'DECLARE',
+ 'DEFAULT', 'DELAYED', 'DELETE', 'DESC', 'DESCRIBE', 'DISTINCT', 'DOUBLE',
+ 'DOMAIN', 'DROP',
+ 'ELSE', 'ENCLOSED', 'END', 'ESCAPED', 'EXCEPT', 'EXEC', 'EXECUTE', 'EXISTS', 'EXP',
+ 'EXPLAIN', 'EXTRACT',
+ 'FALSE', 'FIELD', 'FIELDS', 'FILTER', 'FIRST', 'FLOAT', 'FLOOR', 'FLUSH', 'FOR',
+ 'FOREIGN', 'FROM', 'FULL', 'FUNCTION',
+ 'GET', 'GROUP', 'GROUPING', 'GO', 'GOTO', 'GRANT', 'GRANTED',
+ 'HAVING', 'HOUR',
+ 'IDENTIFIED', 'IDENTITY', 'IF', 'IGNORE', 'IN', 'INCREMENT', 'INDEX', 'INFILE', 'INNER',
+ 'INOUT', 'INPUT', 'INSERT', 'INT', 'INTEGER', 'INTERSECT', 'INTERSECTION', 'INTERVAL',
+ 'INTO', 'IS',
+ 'JOIN',
+ 'KEY', 'KEYS', 'KILL',
+ 'LANGUAGE', 'LARGE', 'LAST', 'LEADING', 'LEFT', 'LENGTH', 'LIKE', 'LIMIT', 'LINES', 'LOAD',
+ 'LOCAL', 'LOCK', 'LOW_PRIORITY', 'LOWER',
+ 'MATCH', 'MAX', 'MERGE', 'MIN', 'MINUTE', 'MOD', 'MODIFIES', 'MODIFY', 'MONTH',
+ 'NATIONAL', 'NATURAL', 'NCHAR', 'NEW', 'NEXT', 'NEXTVAL', 'NONE', 'NOT',
+ 'NULL', 'NULLABLE', 'NULLIF', 'NULLS', 'NUMBER', 'NUMERIC',
+ 'OF', 'OLD', 'ON', 'ONLY', 'OPEN', 'OPTIMIZE', 'OPTION',
+ 'OPTIONALLY', 'OR', 'ORDER', 'OUT', 'OUTER', 'OUTFILE', 'OVER',
+ 'POSITION', 'POWER', 'PRECISION', 'PREPARE', 'PRIMARY', 'PROCEDURAL', 'PROCEDURE',
+ 'READ', 'REAL', 'REF', 'REFERENCES', 'REFERENCING', 'REGEXP', 'RENAME', 'REPLACE',
+ 'RESULT', 'RETURN', 'RETURNS', 'REVOKE', 'RIGHT', 'RLIKE', 'ROLLBACK', 'ROW',
+ 'ROW_NUMBER', 'ROWS', 'RESTRICT', 'ROLE', 'ROUTINE', 'ROW_COUNT',
+ 'SAVEPOINT', 'SEARCH', 'SECOND', 'SECTION', 'SELECT', 'SELF', 'SEQUENCE',
+ 'SESSION', 'SET', 'SETVAL', 'SHOW', 'SIMILAR', 'SIZE', 'SMALLINT', 'SOME',
+ 'SONAME', 'SOURCE', 'SPACE', 'SQL', 'SQRT', 'START', 'STATUS',
+ 'STRAIGHT_JOIN', 'STRUCTURE', 'STYLE', 'SUBSTRING', 'SUM',
+ 'TABLE', 'TABLE_NAME', 'TABLES', 'TERMINATED', 'TEMPORARY', 'THEN', 'TIME',
+ 'TIMESTAMP', 'TO', 'TRAILING', 'TRANSACTION', 'TRIGGER', 'TRIM', 'TRUE', 'TRUNCATE',
+ 'TRUSTED', 'TYPE',
+ 'UNDER', 'UNION', 'UNIQUE', 'UNKNOWN', 'UNLOCK', 'UNSIGNED',
+ 'UPDATE', 'UPPER', 'USE', 'USER', 'USING',
+ 'VALUE', 'VALUES', 'VARCHAR', 'VARIABLES', 'VARYING', 'VIEW',
+ 'WHEN', 'WHERE', 'WITH', 'WITHIN', 'WITHOUT', 'WORK', 'WRITE',
+ 'XOR',
+ 'YEAR',
+ 'ZEROFILL'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '=', '<', '>', '|', ',', '.', '+', '-', '*', '/'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #993333; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ //2 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/stonescript.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/stonescript.php
new file mode 100644
index 00000000..2844e885
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/stonescript.php
@@ -0,0 +1,307 @@
+<?php
+/*************************************************************************************
+ * stonescript.php
+ * --------
+ * Author: Archimmersion ( based on ruby.php by Moises Deniz )
+ * Copyright: (c) 2011 Archimmersion ( http://www.archimmersion.com )
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/03/30
+ *
+ * StoneScript language file for GeSHi.
+ *
+ * StonesCript is a Lua based script language for the ShiVa3D game engine ( http://www.stonetrip.com )
+ *
+ * More information can be found at http://www.stonetrip.com/developer/doc/api/introduction
+ *
+ * CHANGES
+ * -------
+ * 2011/04/18 (1.0.8.11)
+ * - Initial release
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'StoneScript',
+ 'COMMENT_SINGLE' => array(1 => "--"),
+ 'COMMENT_MULTI' => array("--[[" => "]]"),
+ 'COMMENT_REGEXP' => array(
+ 4 => '/<<\s*?(\w+)\\n.*?\\n\\1(?![a-zA-Z0-9])/si',
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', '`','\''),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ // Blue - General Keywords
+ 1 => array(
+ 'and', 'begin', 'break', 'do', 'else', 'elseif', 'end',
+ 'for', 'if', 'in', 'while', 'next', 'not', 'or', 'redo',
+ 'then', 'unless', 'until', 'when', 'false', 'nil', 'self',
+ 'true', 'local', 'this', 'return',
+ ),
+ // Dark Blue - Main API names
+ 2 => array(
+ 'animation', 'application', 'cache', 'camera', 'debug',
+ 'dynamics', 'group', 'hashtable', 'hud', 'input', 'light',
+ 'log', 'math', 'mesh', 'microphone', 'music', 'navigation',
+ 'network', 'object', 'pixelmap', 'projector', 'scene',
+ 'sensor', 'server', 'session', 'sfx', 'shape', 'sound',
+ 'string', 'system', 'table', 'user', 'video', 'xml',
+ // Plugin API names
+ 'plasma', 'watersim',
+ 'winDirectories',
+ 'ActionSheet', 'Alert', 'Mail', 'Picker', 'StatusBar',
+ ),
+ // Constants
+ // Can be commented out if performance is crucial -> then these keywords will appear in a slightly lighter color
+ 3 => array(
+ //Animation
+ 'kPlaybackModeLoop', 'kPlaybackModeLoopMirrored', 'kPlaybackModeLoopReversed',
+ 'kPlaybackModeOnce', 'kPlaybackModeOnceReversed',
+ //Application - Environment
+ 'kStatusLoading', 'kStatusReady', 'kStatusSaving', // 'kStatusNone'
+ //Application - Options
+ 'kOptionAudioMasterVolume', 'kOptionAutomaticVirtualKeyboard', 'kOptionDynamicShadowsBufferCount',
+ 'kOptionDynamicShadowsBufferSize', 'kOptionDynamicShadowsConstantSampling', 'kOptionDynamicShadowsPCFSampleCount',
+ 'kOptionDynamicShadowsQuality', 'kOptionDynamicShadowsScreenSpaceBlur', 'kOptionFullscreen',
+ 'kOptionFullscreenHeight', 'kOptionFullscreenWidth', 'kOptionHardwareOcclusion',
+ 'kOptionMaxEventBouncesPerFrame', 'kOptionNetworkStreams', 'kOptionNetworkStreamsUseBrowser',
+ 'kOptionPrioritizeEventBounces', 'kOptionRenderingEnabled', 'kOptionShadersQuality',
+ 'kOptionSwapInterval', 'kOptionTerrainsQuality', 'kOptionTexturesAnisotropyLevel',
+ 'kOptionTexturesMipmapBias', 'kOptionTexturesQuality', 'kOptionViewportRotation',
+ //Application - Resource Types
+ 'kResourceTypeAnimBank', 'kResourceTypeFont', 'kResourceTypeHUD',
+ 'kResourceTypeMaterial', 'kResourceTypeMesh', 'kResourceTypeParticle',
+ 'kResourceTypePixelMap', 'kResourceTypeSoundBank', 'kResourceTypeTexture',
+ 'kResourceTypeTextureClip', 'kResourceTypeTrail',
+ //Cache
+ 'kPropertyHeight', 'kPropertySize', 'kPropertyWidth',
+ //Dynamics
+ 'kAxisX', 'kAxisY', 'kAxisZ',
+ 'kTypeBox', 'kTypeCapsule', 'kTypeSphere',
+ //HUD
+ 'kAddressingModeClamp', 'kAddressingModeRepeat', 'kAlignCenter', 'kAlignJustify','kAlignLeft', 'kAlignRight',
+ 'kAlignTop', 'kBlendModeAdd', 'kBlendModeDefault', 'kBlendModeModulate', 'kCaseFixed', 'kCaseVariable',
+ 'kCommandTypeCallAction', 'kCommandTypeCopyCheckStateToRegister', 'kCommandTypeCopyEditTextToRegister',
+ 'kCommandTypeCopyListItemTextToRegister', 'kCommandTypeCopyListLastSelectedItemToRegister',
+ 'kCommandTypeCopyProgressValueToRegister', 'kCommandTypeCopySliderValueToRegister', 'kCommandTypeCopyTagToRegister',
+ 'kCommandTypeEnterModalMode', 'kCommandTypeInterpolateBackgroundColor', 'kCommandTypeInterpolateBorderColor',
+ 'kCommandTypeInterpolateForegroundColor', 'kCommandTypeInterpolateHeight', 'kCommandTypeInterpolateOpacity',
+ 'kCommandTypeInterpolatePosition', 'kCommandTypeInterpolateProgressValue', 'kCommandTypeInterpolateRotation',
+ 'kCommandTypeInterpolateSize', 'kCommandTypeInterpolateWidth', 'kCommandTypeLeaveModalMode',
+ 'kCommandTypeMatchScreenSpaceBottomLeftCorner', 'kCommandTypeMatchScreenSpaceBottomRightCorner',
+ 'kCommandTypeMatchScreenSpaceCenter', 'kCommandTypeMatchScreenSpaceHeight', 'kCommandTypeMatchScreenSpaceTopLeftCorner',
+ 'kCommandTypeMatchScreenSpaceTopRightCorner', 'kCommandTypeMatchScreenSpaceWidth', 'kCommandTypePauseMovie',
+ 'kCommandTypePauseSound', 'kCommandTypePauseTimer', 'kCommandTypePlayMovie', 'kCommandTypePlaySound',
+ 'kCommandTypePlaySoundLoop', 'kCommandTypeResumeSound', 'kCommandTypeSendEventToUser', 'kCommandTypeSetActive',
+ 'kCommandTypeSetBackgroundColor', 'kCommandTypeSetBackgroundImage', 'kCommandTypeSetBackgroundImageUVOffset',
+ 'kCommandTypeSetBackgroundImageUVScale', 'kCommandTypeSetBorderColor', 'kCommandTypeSetButtonText',
+ 'kCommandTypeSetCheckState', 'kCommandTypeSetCheckText', 'kCommandTypeSetCursorPosition', 'kCommandTypeSetCursorVisible',
+ 'kCommandTypeSetEditText', 'kCommandTypeSetFocus', 'kCommandTypeSetForegroundColor', 'kCommandTypeSetHeight',
+ 'kCommandTypeSetLabelText', 'kCommandTypeSetOpacity', 'kCommandTypeSetPosition', 'kCommandTypeSetRotation',
+ 'kCommandTypeSetSize', 'kCommandTypeSetVisible', 'kCommandTypeSetWidth', 'kCommandTypeSleep', 'kCommandTypeStartTimer',
+ 'kCommandTypeStopAction', 'kCommandTypeStopMovie', 'kCommandTypeStopSound', 'kCommandTypeStopTimer',
+ 'kComponentTypeButton', 'kComponentTypeCheck', 'kComponentTypeContainer', 'kComponentTypeEdit', 'kComponentTypeLabel',
+ 'kComponentTypeList', 'kComponentTypeMovie', 'kComponentTypePicture', 'kComponentTypePixelMap', 'kComponentTypeProgress',
+ 'kComponentTypeRenderMap', 'kComponentTypeSlider', 'kCursorShapeCross', 'kCursorShapeDefault', 'kCursorShapeHandPointing',
+ 'kCursorShapeIBeam', 'kCursorShapeNone', 'kCursorShapeWaiting', 'kDirectionLeftToRight', 'kDirectionRightToLeft',
+ 'kEncodingASCII', 'kEncodingUTF8', 'kEventTypeGainFocus', 'kEventTypeLooseFocus', 'kEventTypeMouseEnter',
+ 'kEventTypeMouseLeave', 'kFillModeSolid', 'kInterpolatorTypeLinear', 'kInterpolatorTypePower2', 'kInterpolatorTypePower3',
+ 'kInterpolatorTypePower4', 'kInterpolatorTypeRoot2', 'kInterpolatorTypeRoot3', 'kInterpolatorTypeRoot4',
+ 'kInterpolatorTypeSpring1', 'kInterpolatorTypeSpring2', 'kInterpolatorTypeSpring3', 'kInterpolatorTypeSpring4',
+ 'kInterpolatorTypeSpring5', 'kInterpolatorTypeSpring6',
+ 'kOriginBottom', 'kOriginBottomLeft', 'kOriginBottomRight', 'kOriginCenter', 'kOriginLeft', 'kOriginRight',
+ 'kOriginTop', 'kOriginTopLeft', 'kOriginTopRight', 'kProgressTypeBottomToTop', 'kProgressTypeLeftToRight',
+ 'kProgressTypeRightToLeft', 'kProgressTypeTopToBottom', 'kRuntimeValueCallArgument0', 'kRuntimeValueCallArgument1',
+ 'kRuntimeValueCallArgument2', 'kRuntimeValueCallArgument3', 'kRuntimeValueCurrentUser', 'kRuntimeValueCurrentUserMainCamera',
+ 'kRuntimeValueRegister0', 'kRuntimeValueRegister1', 'kRuntimeValueRegister2', 'kRuntimeValueRegister3',
+ 'kShapeTypeEllipsoid', 'kShapeTypeRectangle', 'kShapeTypeRoundRectangle', 'kSliderTypeBottomToTop',
+ 'kSliderTypeLeftToRight', 'kSliderTypeRightToLeft', 'kSliderTypeTopToBottom', 'kWaveTypeConstant',
+ 'kWaveTypeSawtooth', 'kWaveTypeSawtoothInv', 'kWaveTypeSinus', 'kWaveTypeSinusNoise', 'kWaveTypeSquare', 'kWaveTypeTriangle',
+ //Input
+ 'kJoypadTypeIPhone', 'kJoypadTypeNone', 'kJoypadTypePhone', 'kJoypadTypeStandard', 'kJoypadTypeWiimote',
+ 'kKey0', 'kKey1', 'kKey2', 'kKey3', 'kKey4', 'kKey5', 'kKey6', 'kKey7', 'kKey8', 'kKey9', 'kKeyA', 'kKeyB',
+ 'kKeyBackspace', 'kKeyC', 'kKeyD', 'kKeyDelete', 'kKeyDown', 'kKeyE', 'kKeyEnd', 'kKeyEscape', 'kKeyF',
+ 'kKeyF1', 'kKeyF10', 'kKeyF11', 'kKeyF12', 'kKeyF2', 'kKeyF3', 'kKeyF4', 'kKeyF5', 'kKeyF6', 'kKeyF7',
+ 'kKeyF8', 'kKeyF9', 'kKeyG', 'kKeyH', 'kKeyHome', 'kKeyI', 'kKeyInsert', 'kKeyJ', 'kKeyK', 'kKeyL',
+ 'kKeyLAlt', 'kKeyLControl', 'kKeyLeft', 'kKeyLShift', 'kKeyM', 'kKeyN', 'kKeyO', 'kKeyP', 'kKeyPageDown',
+ 'kKeyPageUp', 'kKeyQ', 'kKeyR', 'kKeyRAlt', 'kKeyRControl', 'kKeyReturn', 'kKeyRight', 'kKeyRShift',
+ 'kKeyS', 'kKeySpace', 'kKeyT', 'kKeyTab', 'kKeyU', 'kKeyUp', 'kKeyV', 'kKeyW', 'kKeyX', 'kKeyY',
+ 'kKeyZ', 'kJoypadButtonPSPCircle', 'kJoypadButtonPSPCross', 'kJoypadButtonPSPDown', 'kJoypadButtonPSPL',
+ 'kJoypadButtonPSPLeft', 'kJoypadButtonPSPR', 'kJoypadButtonPSPRight', 'kJoypadButtonPSPSelect',
+ 'kJoypadButtonPSPSquare', 'kJoypadButtonPSPStart', 'kJoypadButtonPSPTriangle', 'kJoypadButtonPSPUp',
+ 'kJoypadTypePSP', 'kJoypadButtonWiimoteA', 'kJoypadButtonWiimoteB', 'kJoypadButtonWiimoteC',
+ 'kJoypadButtonWiimoteDown', 'kJoypadButtonWiimoteHome', 'kJoypadButtonWiimoteLeft',
+ 'kJoypadButtonWiimoteMinus', 'kJoypadButtonWiimoteOne', 'kJoypadButtonWiimotePlus',
+ 'kJoypadButtonWiimoteRight', 'kJoypadButtonWiimoteTwo', 'kJoypadButtonWiimoteUp', 'kJoypadButtonWiimoteZ',
+ //Light
+ 'kTypeDirectional', 'kTypePoint',
+ //Math
+ 'kEpsilon', 'kInfinity', 'kPi',
+ //Mesh
+ 'kLockModeRead', 'kLockModeWrite', 'kLockReadWrite',
+ //Network
+ 'kBluetoothServerPort', 'kDefaultServerPort', 'kStatusAuthenticated', 'kStatusSearchFinished', // 'kStatusNone', 'kStatusPending',
+ //Object
+ 'kControllerTypeAI', 'kControllerTypeAnimation', 'kControllerTypeAny', 'kControllerTypeDynamics',
+ 'kControllerTypeNavigation', 'kControllerTypeSound', 'kGlobalSpace', 'kLocalSpace', 'kParentSpace',
+ 'kTransformOptionInheritsParentRotation', 'kTransformOptionInheritsParentScale', 'kTransformOptionInheritsParentTranslation',
+ 'kTransformOptionTranslationAffectedByParentRotation', 'kTransformOptionTranslationAffectedByParentScale', 'kTypeCamera',
+ 'kTypeCollider', 'kTypeDummy', 'kTypeGroup', 'kTypeLight', 'kTypeOccluder', 'kTypeProjector', 'kTypeReflector',
+ 'kTypeSensor', 'kTypeSfx', 'kTypeShape',
+ //Pixelmap
+ 'kBlendModeDecal', 'kBlendModeReplace', 'kFillModeBrush', 'kFillModeNone', 'kPenModeBrush', // 'kFillModeSolid',
+ 'kPenModeNone', 'kPenModeSolid',
+ //Projector
+ 'kMapTypeMovie', 'kMapTypePixelMap', 'kMapTypeRenderMap', 'kMapTypeTexture', 'kMapTypeTextureClip',
+ //Scene
+ 'kFilteringModeBilinear', 'kFilteringModeNearest', 'kFilteringModeTrilinear', // 'kAddressingModeClamp', 'kAddressingModeRepeat',
+ 'kSkyBoxFaceBack', 'kSkyBoxFaceBottom', 'kSkyBoxFaceFront', 'kSkyBoxFaceLeft', 'kSkyBoxFaceRight', 'kSkyBoxFaceTop',
+ //Sensor
+ 'kShapeTypeBox', 'kShapeTypeSphere',
+ //Server
+ 'kStatusConnected', 'kStatusNone', 'kStatusPending',
+ //Session - duplicate keywords
+ //'kStatusConnected', 'kStatusNone', 'kStatusPending',
+ //Shape
+ 'kMapTypeUnknown', 'kCurveTypeBezier', 'kCurveTypeBSpline', 'kCurveTypeCatmullRom', 'kCurveTypePolyLine',
+ // 'kMapTypeMovie', 'kMapTypePixelMap', 'kMapTypeRenderMap', 'kMapTypeTexture', 'kMapTypeTextureClip',
+
+ //System
+ 'kOSType3DS', 'kOSTypeBada', 'kOSTypeBrew', 'kOSTypePalm', 'kOSTypePS3',
+ 'kClientTypeEditor', 'kClientTypeEmbedded', 'kClientTypeStandalone',
+ 'kGPUCapabilityBloomFilterSupport', 'kGPUCapabilityContrastFilterSupport', 'kGPUCapabilityDepthBlurFilterSupport',
+ 'kGPUCapabilityDistortionFilterSupport', 'kGPUCapabilityDynamicShadowsSupport', 'kGPUCapabilityHardwareOcclusionSupport',
+ 'kGPUCapabilityHardwareRenderingSupport', 'kGPUCapabilityMonochromeFilterSupport', 'kGPUCapabilityMotionBlurFilterSupport',
+ 'kGPUCapabilityPixelShaderSupport', 'kGPUCapabilityVelocityBlurFilterSupport', 'kGPUCapabilityVertexShaderSupport',
+ 'kLanguageAlbanian', 'kLanguageArabic', 'kLanguageBulgarian', 'kLanguageCatalan', 'kLanguageCzech', 'kLanguageDanish',
+ 'kLanguageDutch', 'kLanguageEnglish', 'kLanguageFinnish', 'kLanguageFrench', 'kLanguageGerman', 'kLanguageGreek',
+ 'kLanguageHebrew', 'kLanguageHungarian', 'kLanguageIcelandic', 'kLanguageItalian', 'kLanguageJapanese', 'kLanguageKorean',
+ 'kLanguageNorwegian', 'kLanguagePolish', 'kLanguagePortuguese', 'kLanguageRomanian', 'kLanguageRussian',
+ 'kLanguageSerboCroatian', 'kLanguageSlovak', 'kLanguageSpanish', 'kLanguageSwedish', 'kLanguageThai',
+ 'kLanguageTurkish', 'kLanguageUnknown', 'kLanguageUrdu', 'kOSTypeAndroid', 'kOSTypeAngstrom', 'kOSTypeIPhone',
+ 'kOSTypeLinux', 'kOSTypeMac', 'kOSTypePSP', 'kOSTypeSymbian', 'kOSTypeWii', 'kOSTypeWindows', 'kOSTypeWindowsCE',
+ ),
+ // Not used yet
+ 4 => array(
+ 'dummycommand',
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '%', '&', '*', '|', '/', '<', '>',
+ '+', '-', '=>', '<<'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color:#0000FF; font-weight:bold;',
+ 2 => 'color:#000088; font-weight:bold;',
+ 3 => 'color:#C088C0; font-weight:bold;',
+ 4 => 'color:#00FEFE; font-weight:bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color:#008000; font-style:italic;',
+ 4 => 'color: #cc0000; font-style: italic;',
+ 'MULTI' => 'color:#008000; font-style:italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color:#000099;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color:#000000; font-weight:bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color:#888800;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color:#AA0000;'
+ ),
+ // names after "."
+ 'METHODS' => array(
+ 1 => 'color:#FF00FF; font-weight:bold;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color:#000000; font-weight:bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color:#ff6633; font-weight:bold;',
+ 1 => 'color:#0066ff; font-weight:bold;',
+ 2 => 'color:#6666ff; font-weight:bold;',
+ 3 => 'color:#ff3333; font-weight:bold;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ 0 => array(//Variables
+ GESHI_SEARCH => "([[:space:]])(\\$[a-zA-Z_][a-zA-Z0-9_]*)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 1 => array(//Arrays
+ GESHI_SEARCH => "([[:space:]])(@[a-zA-Z_][a-zA-Z0-9_]*)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+ 2 => "([A-Z][a-zA-Z0-9_]*::)+[A-Z][a-zA-Z0-9_]*",//Static OOP symbols
+ 3 => array(
+ GESHI_SEARCH => "([[:space:]]|\[|\()(:[a-zA-Z_][a-zA-Z0-9_]*)",
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => array(
+ '<%' => '%>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ ),
+ 'TAB_WIDTH' => 2
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/systemverilog.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/systemverilog.php
new file mode 100644
index 00000000..f2ba92b1
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/systemverilog.php
@@ -0,0 +1,317 @@
+<?php
+/************************************************************************************
+ * systemverilog.php
+ * -------
+ * Author: Sean O'Boyle
+ * Copyright: (C) 2008 IntelligentDV
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/06/25
+ *
+ * SystemVerilog IEEE 1800-2009(draft8) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/06/25 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2008/06/25)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ ************************************************************************
+ * Title: SystemVerilog Language Keywords File for GeSHi
+ * Description: This file contains the SV keywords defined in the
+ * IEEE1800-2009 Draft Standard in the format expected by
+ * GeSHi.
+ *
+ * Original Author: Sean O'Boyle
+ * Contact: seanoboyle@intelligentdv.com
+ * Company: Intelligent Design Verification
+ * Company URL: http://intelligentdv.com
+ *
+ * Download the most recent version here:
+ * http://intelligentdv.com/downloads
+ *
+ * File Bugs Here: http://bugs.intelligentdv.com
+ * Project: SyntaxFiles
+ *
+ * File: systemverilog.php
+ * $LastChangedBy: benbe $
+ * $LastChangedDate: 2012-08-18 01:56:20 +0200 (Sa, 18. Aug 2012) $
+ * $LastChangedRevision: 2542 $
+ *
+ ************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'SystemVerilog',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ // system tasks
+ 1 => array(
+ 'acos','acosh','asin','asinh','assertfailoff','assertfailon',
+ 'assertkill','assertnonvacuouson','assertoff','asserton',
+ 'assertpassoff','assertpasson','assertvacuousoff','async$and$array',
+ 'async$and$plane','async$nand$array','async$nand$plane',
+ 'async$nor$array','async$nor$plane','async$or$array',
+ 'async$or$plane','atan','atan2','atanh','bits','bitstoreal',
+ 'bitstoshortreal','cast','ceil','changed','changed_gclk',
+ 'changing_gclk','clog2','cos','cosh','countones','coverage_control',
+ 'coverage_get','coverage_get_max','coverage_merge','coverage_save',
+ 'dimensions','display','displayb','displayh','displayo',
+ 'dist_chi_square','dist_erlang','dist_exponential','dist_normal',
+ 'dist_poisson','dist_t','dist_uniform','dumpall','dumpfile',
+ 'dumpflush','dumplimit','dumpoff','dumpon','dumpports',
+ 'dumpportsall','dumpportsflush','dumpportslimit','dumpportsoff',
+ 'dumpportson','dumpvars','error','exit','exp','falling_gclk',
+ 'fclose','fdisplay','fdisplayb','fdisplayh','fdisplayo','fell',
+ 'fell_gclk','feof','ferror','fflush','fgetc','fgets','finish',
+ 'floor','fmonitor','fmonitorb','fmonitorh','fmonitoro','fopen',
+ 'fread','fscanf','fseek','fstrobe','fstrobeb','fstrobeh','fstrobeo',
+ 'ftell','future_gclk','fwrite','fwriteb','fwriteh','fwriteo',
+ 'get_coverage','high','hypot','increment','info','isunbounded',
+ 'isunknown','itor','left','ln','load_coverage_db','log10','low',
+ 'monitor','monitorb','monitorh','monitoro','monitoroff','monitoron',
+ 'onehot','onehot0','past','past_gclk','pow','printtimescale',
+ 'q_add','q_exam','q_full','q_initialize','q_remove','random',
+ 'readmemb','readmemh','realtime','realtobits','rewind','right',
+ 'rising_gclk','rose','rose_gclk','rtoi','sampled',
+ 'set_coverage_db_name','sformat','sformatf','shortrealtobits',
+ 'signed','sin','sinh','size','sqrt','sscanf','stable','stable_gclk',
+ 'steady_gclk','stime','stop','strobe','strobeb','strobeh','strobeo',
+ 'swrite','swriteb','swriteh','swriteo','sync$and$array',
+ 'sync$and$plane','sync$nand$array','sync$nand$plane',
+ 'sync$nor$array','sync$nor$plane','sync$or$array','sync$or$plane',
+ 'system','tan','tanh','test$plusargs','time','timeformat',
+ 'typename','ungetc','unpacked_dimensions','unsigned',
+ 'value$plusargs','warning','write','writeb','writeh','writememb',
+ 'writememh','writeo',
+ ),
+ // compiler directives
+ 2 => array(
+ '`__FILE__', '`__LINE__', '`begin_keywords', '`case', '`celldefine',
+ '`endcelldefine', '`default_nettype', '`define', '`default', '`else',
+ '`elsif', '`end_keywords', '`endfor', '`endif',
+ '`endprotect', '`endswitch', '`endwhile', '`for', '`format',
+ '`if', '`ifdef', '`ifndef', '`include', '`let',
+ '`line', '`nounconnected_drive', '`pragma', '`protect', '`resetall',
+ '`switch', '`timescale', '`unconnected_drive', '`undef', '`undefineall',
+ '`while'
+ ),
+ // keywords
+ 3 => array(
+ 'assert', 'assume', 'cover', 'expect', 'disable',
+ 'iff', 'binsof', 'intersect', 'first_match', 'throughout',
+ 'within', 'coverpoint', 'cross', 'wildcard', 'bins',
+ 'ignore_bins', 'illegal_bins', 'genvar', 'if', 'else',
+ 'unique', 'priority', 'matches', 'default', 'forever',
+ 'repeat', 'while', 'for', 'do', 'foreach',
+ 'break', 'continue', 'return', 'pulsestyle_onevent', 'pulsestyle_ondetect',
+ 'noshowcancelled', 'showcancelled', 'ifnone', 'posedge', 'negedge',
+ 'edge', 'wait', 'wait_order', 'timeunit', 'timeprecision',
+ 's', 'ms', 'us', 'ns',
+ 'ps', 'fs', 'step', 'new', 'extends',
+ 'this', 'super', 'protected', 'local', 'rand',
+ 'randc', 'bind', 'constraint', 'solve', 'before',
+ 'dist', 'inside', 'with', 'virtual', 'extern',
+ 'pure', 'forkjoin', 'design', 'instance', 'cell',
+ 'liblist', 'use', 'library', 'incdir', 'include',
+ 'modport', 'sync_accept_on', 'reject_on', 'accept_on',
+ 'sync_reject_on', 'restrict', 'let', 'until', 'until_with',
+ 'unique0', 'eventually', 's_until', 's_always', 's_eventually',
+ 's_nexttime', 's_until_with', 'global', 'untyped', 'implies',
+ 'weak', 'strong', 'nexttime'
+ ),
+ // block keywords
+ 4 => array(
+ 'begin', 'end', 'package', 'endpackage', 'macromodule',
+ 'module', 'endmodule', 'generate', 'endgenerate', 'program',
+ 'endprogram', 'class', 'endclass', 'function', 'endfunction',
+ 'case', 'casex', 'casez', 'randcase', 'endcase',
+ 'interface', 'endinterface', 'clocking', 'endclocking', 'task',
+ 'endtask', 'primitive', 'endprimitive', 'fork', 'join',
+ 'join_any', 'join_none', 'covergroup', 'endgroup', 'checker',
+ 'endchecker', 'property', 'endproperty', 'randsequence', 'sequence',
+ 'endsequence', 'specify', 'endspecify', 'config', 'endconfig',
+ 'table', 'endtable', 'initial', 'final', 'always',
+ 'always_comb', 'always_ff', 'always_latch', 'alias', 'assign',
+ 'force', 'release'
+ ),
+
+ // types
+ 5 => array(
+ 'parameter', 'localparam', 'specparam', 'input', 'output',
+ 'inout', 'ref', 'byte', 'shortint', 'int',
+ 'integer', 'longint', 'time', 'bit', 'logic',
+ 'reg', 'supply0', 'supply1', 'tri', 'triand',
+ 'trior', 'trireg', 'tri0', 'tri1', 'wire',
+ 'uwire', 'wand', 'wor', 'signed', 'unsigned',
+ 'shortreal', 'real', 'realtime', 'type', 'void',
+ 'struct', 'union', 'tagged', 'const', 'var',
+ 'automatic', 'static', 'packed', 'vectored', 'scalared',
+ 'typedef', 'enum', 'string', 'chandle', 'event',
+ 'null', 'pullup', 'pulldown', 'cmos', 'rcmos',
+ 'nmos', 'pmos', 'rnmos', 'rpmos', 'and',
+ 'nand', 'or', 'nor', 'xor', 'xnor',
+ 'not', 'buf', 'tran', 'rtran', 'tranif0',
+ 'tranif1', 'rtranif0', 'rtranif1', 'bufif0', 'bufif1',
+ 'notif0', 'notif1', 'strong0', 'strong1', 'pull0',
+ 'pull1', 'weak0', 'weak1', 'highz0', 'highz1',
+ 'small', 'medium', 'large'
+ ),
+
+ // DPI
+ 6 => array(
+ 'DPI', 'DPI-C', 'import', 'export', 'context'
+ ),
+
+ // stdlib
+ 7 => array(
+ 'randomize', 'mailbox', 'semaphore', 'put', 'get',
+ 'try_put', 'try_get', 'peek', 'try_peek', 'process',
+ 'state', 'self', 'status', 'kill', 'await',
+ 'suspend', 'resume', 'size', 'delete', 'insert',
+ 'num', 'first', 'last', 'next', 'prev',
+ 'pop_front', 'pop_back', 'push_front', 'push_back', 'find',
+ 'find_index', 'find_first', 'find_last', 'find_last_index', 'min',
+ 'max', 'unique_index', 'reverse', 'sort', 'rsort',
+ 'shuffle', 'sum', 'product', 'List', 'List_Iterator',
+ 'neq', 'eq', 'data', 'empty', 'front',
+ 'back', 'start', 'finish', 'insert_range', 'erase',
+ 'erase_range', 'set', 'swap', 'clear', 'purge'
+ ),
+
+ // key_deprecated
+ 8 => array(
+ 'defparam', 'deassign', 'TODO'
+ ),
+
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '=', '+', '-', '*', '/', '!', '%',
+ '^', '&', '|', '~',
+ '?', ':',
+ '#', '<<', '<<<',
+ '>', '<', '>=', '<=',
+ '@', ';', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #996666; font-weight: bold;',
+ 2 => 'color: #336600; font-weight: bold;',
+ 3 => 'color: #996600; font-weight: bold;',
+ 4 => 'color: #000033; font-weight: bold;',
+ 5 => 'color: #330033; font-weight: bold;',
+ 6 => 'color: #996600; font-weight: bold;',
+ 7 => 'color: #CC9900; font-weight: bold;',
+ 8 => 'color: #990000; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #00008B; font-style: italic;',
+ 'MULTI' => 'color: #00008B; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #9F79EE'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #9F79EE;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #FF00FF;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0055;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #5D478B;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #ff0055;',
+ 1 => 'color: #ff0055;',
+ 2 => 'color: #ff0055;',
+ 3 => 'color: #ff0055;'
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => ''
+ ),
+ 'REGEXPS' => array(
+ // integer
+ 0 => "\d'[bdh][0-9_a-fA-FxXzZ]+",
+ // realtime
+ 1 => "\d*\.\d+[munpf]?s",
+ // time s, ms, us, ns, ps, of fs
+ 2 => "\d+[munpf]?s",
+ // real
+ 3 => "\d*\.\d+"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ 0 => ''
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true
+ ),
+ 'TAB_WIDTH' => 3,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'DISALLOWED_BEFORE' => '(?<=$)'
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/tcl.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/tcl.php
new file mode 100644
index 00000000..4dd7be87
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/tcl.php
@@ -0,0 +1,194 @@
+<?php
+/*************************************************************************************
+ * tcl.php
+ * ---------------------------------
+ * Author: Reid van Melle (rvanmelle@gmail.com)
+ * Copyright: (c) 2004 Reid van Melle (sorry@nowhere)
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/05/05
+ *
+ * TCL/iTCL language file for GeSHi.
+ *
+ * This was thrown together in about an hour so I don't expect
+ * really great things. However, it is a good start. I never
+ * got a change to try out the iTCL or object-based support but
+ * this is not widely used anyway.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2006/05/05 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2006/05/05)
+ * -------------------------
+ * - Get TCL built-in special variables highlighted with a new color..
+ * currently, these are listed in //special variables in the keywords
+ * section, but they get covered by the general REGEXP for symbols
+ * - General cleanup, testing, and verification
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'TCL',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ 1 => '/(?<!\\\\)#(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //2 => '/{[^}\n]+}/'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', "'"),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ /*
+ * Set 1: reserved words
+ * http://python.org/doc/current/ref/keywords.html
+ */
+ 1 => array(
+ 'proc', 'global', 'upvar', 'if', 'then', 'else', 'elseif', 'for', 'foreach',
+ 'break', 'continue', 'while', 'set', 'eval', 'case', 'in', 'switch',
+ 'default', 'exit', 'error', 'return', 'uplevel', 'loop',
+ 'for_array_keys', 'for_recursive_glob', 'for_file', 'unwind_protect',
+ 'expr', 'catch', 'namespace', 'rename', 'variable',
+ // itcl
+ 'method', 'itcl_class', 'public', 'protected'),
+
+ /*
+ * Set 2: builtins
+ * http://asps.activatestate.com/ASPN/docs/ActiveTcl/8.4/tcl/tcl_2_contents.htm
+ */
+ 2 => array(
+ // string handling
+ 'append', 'binary', 'format', 're_syntax', 'regexp', 'regsub',
+ 'scan', 'string', 'subst',
+ // list handling
+ 'concat', 'join', 'lappend', 'lindex', 'list', 'llength', 'lrange',
+ 'lreplace', 'lsearch', 'lset', 'lsort', 'split',
+ // procedures and output
+ 'incr', 'close', 'eof', 'fblocked', 'fconfigure', 'fcopy', 'file',
+ 'fileevent', 'flush', 'gets', 'open', 'puts', 'read', 'seek',
+ 'socket', 'tell',
+ // packages and source files
+ 'load', 'loadTk', 'package', 'pgk::create', 'pgk_mkIndex', 'source',
+ // interpreter routines
+ 'bgerror', 'history', 'info', 'interp', 'memory', 'unknown',
+ // library routines
+ 'enconding', 'http', 'msgcat',
+ // system related
+ 'cd', 'clock', 'exec', 'glob', 'pid', 'pwd', 'time',
+ // platform specified
+ 'dde', 'registry', 'resource',
+ // special variables
+ '$argc', '$argv', '$errorCode', '$errorInfo', '$argv0',
+ '$auto_index', '$auto_oldpath', '$auto_path', '$env',
+ '$tcl_interactive', '$tcl_libpath', '$tcl_library',
+ '$tcl_pkgPath', '$tcl_platform', '$tcl_precision', '$tcl_traceExec',
+ ),
+
+ /*
+ * Set 3: standard library
+ */
+ 3 => array(
+ 'comment', 'filename', 'library', 'packagens', 'tcltest', 'tclvars',
+ ),
+
+ /*
+ * Set 4: special methods
+ */
+// 4 => array(
+// )
+
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '$', '*', '&', '%', '!', ';', '<', '>', '?'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+// 4 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #ff7700;font-weight:bold;', // Reserved
+ 2 => 'color: #008000;', // Built-ins + self
+ 3 => 'color: #dc143c;', // Standard lib
+// 4 => 'color: #0000cd;' // Special methods
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+// 2 => 'color: #483d8b;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: black;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #483d8b;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff4500;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: black;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #ff3333;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+// 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '::'
+ ),
+ 'REGEXPS' => array(
+ //Special variables
+ 0 => '[\\$]+[a-zA-Z_][a-zA-Z0-9_]*',
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'COMMENTS' => array(
+ 'DISALLOWED_BEFORE' => '\\'
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/teraterm.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/teraterm.php
new file mode 100644
index 00000000..f125642d
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/teraterm.php
@@ -0,0 +1,354 @@
+<?php
+/*************************************************************************************
+ * teraterm.php
+ * --------
+ * Author: Boris Maisuradze (boris at logmett.com)
+ * Copyright: (c) 2008 Boris Maisuradze (http://logmett.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/09/26
+ *
+ * Tera Term Macro language file for GeSHi.
+ *
+ *
+ * This version of teraterm.php was created for Tera Term 4.62 and LogMeTT 2.9.4.
+ * Newer versions of these application can contain additional Macro commands
+ * and/or keywords that are not listed here. The latest release of teraterm.php
+ * can be downloaded from Download section of LogMeTT.com
+ *
+ * CHANGES
+ * -------
+ * 2008/09/26 (1.0.0)
+ * - First Release for Tera Term 4.60 and below.
+ * 2009/03/22 (1.1.0)
+ * - First Release for Tera Term 4.62 and below.
+ * 2009/04/25 (1.1.1)
+ * - Second Release for Tera Term 4.62 and below.
+ * 2010/09/12 (1.1.2)
+ * - Second Release for Tera Term 4.67, LogMeTT 2.97, TTLEditor 1.2.1 and below.
+ *
+ * TODO (updated 2010/09/12)
+ * -------------------------
+ * *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Tera Term Macro',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /* Commands */
+ 1 => array(
+ 'Beep',
+ 'BplusRecv',
+ 'BplusSend',
+ 'Break',
+ 'Call',
+ 'CallMenu',
+ 'ChangeDir',
+ 'ClearScreen',
+ 'Clipb2Var',
+ 'ClosesBox',
+ 'CloseTT',
+ 'Code2Str',
+ 'Connect',
+ 'CRC32',
+ 'CRC32File',
+ 'CygConnect',
+ 'DelPassword',
+ 'Disconnect',
+ 'DispStr',
+ 'Do',
+ 'Else',
+ 'ElseIf',
+ 'EnableKeyb',
+ 'End',
+ 'EndIf',
+ 'EndUntil',
+ 'EndWhile',
+ 'Exec',
+ 'ExecCmnd',
+ 'Exit',
+ 'FileClose',
+ 'FileConcat',
+ 'FileCopy',
+ 'FileCreate',
+ 'FileDelete',
+ 'FileMarkPtr',
+ 'FileNameBox',
+ 'FileOpen',
+ 'FileRead',
+ 'FileReadln',
+ 'FileRename',
+ 'FileSearch',
+ 'FileSeek',
+ 'FileSeekBack',
+ 'FileStat',
+ 'FileStrSeek',
+ 'FileStrSeek2',
+ 'FileTruncate',
+ 'FileWrite',
+ 'FileWriteLn',
+ 'FindClose',
+ 'FindFirst',
+ 'FindNext',
+ 'FlushRecv',
+ 'For',
+ 'GetDate',
+ 'GetDir',
+ 'GetEnv',
+ 'GetHostname',
+ 'GetPassword',
+ 'GetTime',
+ 'GetTitle',
+ 'GetTTDir',
+ 'Getver',
+ 'GoTo',
+ 'If',
+ 'IfDefined',
+ 'Include',
+ 'InputBox',
+ 'Int2Str',
+ 'KmtFinish',
+ 'KmtGet',
+ 'KmtRecv',
+ 'KmtSend',
+ 'LoadKeymap',
+ 'LogClose',
+ 'LogOpen',
+ 'LogPause',
+ 'LogStart',
+ 'LogWrite',
+ 'Loop',
+ 'MakePath',
+ 'MessageBox',
+ 'MPause',
+ 'Next',
+ 'PasswordBox',
+ 'Pause',
+ 'QuickVANRecv',
+ 'QuickVANSend',
+ 'Random',
+ 'RecvLn',
+ 'RestoreSetup',
+ 'Return',
+ 'RotateLeft',
+ 'RotateRight',
+ 'ScpRecv',
+ 'ScpSend',
+ 'Send',
+ 'SendBreak',
+ 'SendBroadcast',
+ 'SendFile',
+ 'SendKCode',
+ 'SendLn',
+ 'SendLnBroadcast',
+ 'SendMulticast',
+ 'SetBaud',
+ 'SetDate',
+ 'SetDebug',
+ 'SetDir',
+ 'SetDlgPos',
+ 'SetDTR',
+ 'SetEcho',
+ 'SetEnv',
+ 'SetExitCode',
+ 'SetMulticastName',
+ 'SetRTS',
+ 'SetSync',
+ 'SetTime',
+ 'SetTitle',
+ 'Show',
+ 'ShowTT',
+ 'SPrintF',
+ 'SPrintF2',
+ 'StatusBox',
+ 'Str2Code',
+ 'Str2Int',
+ 'StrCompare',
+ 'StrConcat',
+ 'StrCopy',
+ 'StrInsert',
+ 'StrJoin',
+ 'StrLen',
+ 'StrMatch',
+ 'StrRemove',
+ 'StrReplace',
+ 'StrScan',
+ 'StrSpecial',
+ 'StrSplit',
+ 'StrTrim',
+ 'TestLink',
+ 'Then',
+ 'ToLower',
+ 'ToUpper',
+ 'UnLink',
+ 'Until',
+ 'Var2Clipb',
+ 'Wait',
+ 'Wait4All',
+ 'WaitEvent',
+ 'WaitLn',
+ 'WaitN',
+ 'WaitRecv',
+ 'WaitRegEx',
+ 'While',
+ 'XmodemRecv',
+ 'XmodemSend',
+ 'YesNoBox',
+ 'YmodemRecv',
+ 'YmodemSend',
+ 'ZmodemRecv',
+ 'ZmodemSend'
+ ),
+ /* System Variables */
+ 2 => array(
+ 'groupmatchstr1',
+ 'groupmatchstr2',
+ 'groupmatchstr3',
+ 'groupmatchstr4',
+ 'groupmatchstr5',
+ 'groupmatchstr6',
+ 'groupmatchstr7',
+ 'groupmatchstr8',
+ 'groupmatchstr9',
+ 'inputstr',
+ 'matchstr',
+ 'mtimeout',
+ 'param2',
+ 'param3',
+ 'param4',
+ 'param5',
+ 'param6',
+ 'param7',
+ 'param8',
+ 'param9',
+ 'result',
+ 'timeout'
+ ),
+ /* LogMeTT Key Words */
+ 3 => array(
+ '$[1]',
+ '$[2]',
+ '$[3]',
+ '$[4]',
+ '$[5]',
+ '$[6]',
+ '$[7]',
+ '$[8]',
+ '$[9]',
+ '$branch$',
+ '$computername$',
+ '$connection$',
+ '$email$',
+ '$logdir$',
+ '$logfilename$',
+ '$lttfilename$',
+ '$mobile$',
+ '$name$',
+ '$pager$',
+ '$parent$',
+ '$phone$',
+ '$snippet$',
+ '$ttdir$',
+ '$user$',
+ '$windir$',
+ ),
+ /* Keyword Symbols */
+ 4 => array(
+ 'and',
+ 'not',
+ 'or',
+ 'xor'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}',
+ '+', '-', '*', '/', '%',
+ '!', '&', '|', '^',
+ '<', '>', '=',
+ '?', ':', ';',
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000080; font-weight: bold!important;',
+ 2 => 'color: #808000; font-weight: bold;', // System Variables
+ 3 => 'color: #ff0000; font-weight: bold;', // LogMeTT Key Words
+ 4 => 'color: #ff00ff; font-weight: bold;' // Keyword Symbols
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(),
+ 'BRACKETS' => array(
+ 0 => 'color: #ff00ff; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #800080;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #008080;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #ff00ff; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000ff; font-weight: bold;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(
+ 0 => array (
+ GESHI_SEARCH => '(\:[_a-zA-Z][_a-zA-Z0-9]+)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/text.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/text.php
new file mode 100644
index 00000000..87fb7110
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/text.php
@@ -0,0 +1,84 @@
+<?php
+/*************************************************************************************
+ * text.php
+ * --------
+ * Author: Sean Hanna (smokingrope@gmail.com)
+ * Copyright: (c) 2006 Sean Hanna
+ * Release Version: 1.0.8.11
+ * Date Started: 04/23/2006
+ *
+ * Standard Text File (No Syntax Highlighting).
+ * Plaintext language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 04/23/2006 (0.5.0)
+ * - Syntax File Created
+ *
+ * 04/27/2006 (1.0.0)
+ * - Documentation Cleaned Up
+ * - First Release
+ *
+ * TODO (updated 04/27/2006)
+ * -------------------------
+ *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Text',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(),
+ 'SYMBOLS' => array(),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(),
+ 'COMMENTS' => array(),
+ 'ESCAPE_CHAR' => array(),
+ 'BRACKETS' => array(),
+ 'STRINGS' => array(),
+ 'NUMBERS' => array(),
+ 'METHODS' => array(),
+ 'SYMBOLS' => array(),
+ 'SCRIPT' => array(),
+ 'REGEXPS' => array()
+ ),
+ 'URLS' => array(),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'ALL' => GESHI_NEVER
+ ),
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/thinbasic.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/thinbasic.php
new file mode 100644
index 00000000..f54959e1
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/thinbasic.php
@@ -0,0 +1,868 @@
+<?php
+/*************************************************************************************
+ * thinbasic.php
+ * ------
+ * Author: Eros Olmi (eros.olmi@thinbasic.com)
+ * Copyright: (c) 2006 Eros Olmi (http://www.thinbasic.com), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/05/12
+ *
+ * thinBasic language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2006/05/12 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2006/05/12)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'thinBasic',
+ 'COMMENT_SINGLE' => array(1 => "'"),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'XOR','XML_TREETOSTRING','XML_PARSEFILE','XML_PARSE','XML_PARENT','XML_NODETYPE','XML_NODETOSTRING','XML_NEXTSIBLING',
+ 'XML_LASTERROR','XML_GETTAG','XML_FREE','XML_FINDNODE','XML_DECODEPARAM','XML_CHILDDATA','XML_CHILD','XML_ATTRIBVALUE',
+ 'XML_ATTRIBNAME','XML_ATTRIBCOUNT','WORD','WITH','WIN_SHOW','WIN_SETTITLE','WIN_SETFOREGROUND','WIN_ISZOOMED',
+ 'WIN_ISVISIBLE','WIN_ISICONIC','WIN_GETTITLE','WIN_GETFOREGROUND','WIN_GETCLASS','WIN_GETACTIVE','WIN_FLASH','WIN_FINDBYTITLE',
+ 'WIN_FINDBYCLASS','WHILE','WEND','VERIFY','VARPTR','VARIANTVT$','VARIANTVT','VARIANT',
+ 'VARIABLE_GETINFO','VARIABLE_EXISTS','VARIABLE_EXIST','VALUE','VAL','USING$','USING','USES',
+ 'USER','UNTIL','UNITS','UNION','UNICODE2ASCII','UDP_SEND','UDP_RECV','UDP_OPENSERVER',
+ 'UDP_OPEN','UDP_FREEFILE','UDP_CLOSE','UCODE$','UCASE$','UBOUND','TYPE','TRIMFULL$',
+ 'TRIM$','TOOLTIP','TOKENIZER_MOVETOEOL','TOKENIZER_KEYSETUSERSTRING','TOKENIZER_KEYSETUSERNUMBER','TOKENIZER_KEYGETUSERSTRING','TOKENIZER_KEYGETUSERNUMBER','TOKENIZER_KEYGETSUBTYPE',
+ 'TOKENIZER_KEYGETNAME','TOKENIZER_KEYGETMAINTYPE','TOKENIZER_KEYFIND','TOKENIZER_KEYADD','TOKENIZER_GETNEXTTOKEN','TOKENIZER_DEFAULT_SET','TOKENIZER_DEFAULT_GET','TOKENIZER_DEFAULT_CODE',
+ 'TOKENIZER_DEFAULT_CHAR','TO','TIMER','TIME$','THEN','TEXTBOX','TEXT','TCP_SEND',
+ 'TCP_RECV','TCP_PRINT','TCP_OPEN','TCP_LINEINPUT','TCP_FREEFILE','TCP_CLOSE','TB_IMGCTX_SETIMAGEADJUSTMENT','TB_IMGCTX_LOADIMAGE',
+ 'TB_IMGCTX_GETIMAGEADJUSTMENT','TBGL_VIEWPORT','TBGL_VERTEX','TBGL_USETEXTUREFLAG','TBGL_USETEXTURE','TBGL_USELINESTIPPLEFLAG','TBGL_USELINESTIPPLE','TBGL_USELIGHTSOURCEFLAG',
+ 'TBGL_USELIGHTSOURCE','TBGL_USELIGHTINGFLAG','TBGL_USELIGHTING','TBGL_USEFOGFLAG','TBGL_USEFOG','TBGL_USEDEPTHMASK','TBGL_USEDEPTHFLAG','TBGL_USEDEPTH',
+ 'TBGL_USECLIPPLANEFLAG','TBGL_USECLIPPLANE','TBGL_USEBLENDFLAG','TBGL_USEBLEND','TBGL_USEALPHATEST','TBGL_TRANSLATE','TBGL_TORUS','TBGL_TEXCOORD2D',
+ 'TBGL_SPHERE','TBGL_SHOWWINDOW','TBGL_SHOWCURSOR','TBGL_SETWINDOWTITLE','TBGL_SETUPLIGHTSOURCE','TBGL_SETUPFOG','TBGL_SETUPCLIPPLANE','TBGL_SETPRIMITIVEQUALITY',
+ 'TBGL_SETLIGHTPARAMETER','TBGL_SETDRAWDISTANCE','TBGL_SCALE','TBGL_SAVESCREENSHOT','TBGL_ROTATEXYZ','TBGL_ROTATE','TBGL_RESETMATRIX','TBGL_RENDERTOTEXTURE',
+ 'TBGL_RENDERMATRIX3D','TBGL_RENDERMATRIX2D','TBGL_PUSHMATRIX','TBGL_PRINTFONT','TBGL_PRINTBMP','TBGL_PRINT','TBGL_POS3DTOPOS2D','TBGL_POPMATRIX',
+ 'TBGL_POLYGONLOOK','TBGL_POINTSIZE','TBGL_POINTINSIDE3D','TBGL_NORMAL','TBGL_NEWLIST','TBGL_MOUSEGETWHEELDELTA','TBGL_MOUSEGETRBUTTON','TBGL_MOUSEGETPOSY',
+ 'TBGL_MOUSEGETPOSX','TBGL_MOUSEGETMBUTTON','TBGL_MOUSEGETLBUTTON','TBGL_M15SETVERTEXZ','TBGL_M15SETVERTEXY','TBGL_M15SETVERTEXXYZ','TBGL_M15SETVERTEXX','TBGL_M15SETVERTEXTEXY',
+ 'TBGL_M15SETVERTEXTEXXY','TBGL_M15SETVERTEXTEXX','TBGL_M15SETVERTEXTEXN','TBGL_M15SETVERTEXRGB','TBGL_M15SETVERTEXR','TBGL_M15SETVERTEXPSTOP','TBGL_M15SETVERTEXPARAM','TBGL_M15SETVERTEXLAYER',
+ 'TBGL_M15SETVERTEXG','TBGL_M15SETVERTEXB','TBGL_M15SETMODELVERTEXCOUNT','TBGL_M15SETBONECHILD','TBGL_M15ROTBONEZ','TBGL_M15ROTBONEY','TBGL_M15ROTBONEX','TBGL_M15ROTBONE',
+ 'TBGL_M15RESETBONES','TBGL_M15RECALCNORMALS','TBGL_M15LOADMODEL','TBGL_M15INITMODELBUFFERS','TBGL_M15GETVERTEXZ','TBGL_M15GETVERTEXY','TBGL_M15GETVERTEXXYZ','TBGL_M15GETVERTEXX',
+ 'TBGL_M15GETVERTEXTEXY','TBGL_M15GETVERTEXTEXXY','TBGL_M15GETVERTEXTEXX','TBGL_M15GETVERTEXTEXN','TBGL_M15GETVERTEXRGB','TBGL_M15GETVERTEXR','TBGL_M15GETVERTEXPSTOP','TBGL_M15GETVERTEXPARAM',
+ 'TBGL_M15GETVERTEXLAYER','TBGL_M15GETVERTEXG','TBGL_M15GETVERTEXB','TBGL_M15GETMODELVERTEXCOUNT','TBGL_M15GETMODELPOLYCOUNT','TBGL_M15ERASECHILDBONES','TBGL_M15DRAWMODEL','TBGL_M15DEFBONERESET',
+ 'TBGL_M15DEFBONELAYER','TBGL_M15DEFBONEBOX','TBGL_M15DEFBONEANCHOR','TBGL_M15DEFBONEADDVERTEX','TBGL_M15CLEARMODEL','TBGL_M15APPLYBONES','TBGL_M15ADDBONETREEITEM','TBGL_LOADTEXTURE',
+ 'TBGL_LOADFONT','TBGL_LOADBMPFONT','TBGL_LINEWIDTH','TBGL_LINESTIPPLE','TBGL_KILLFONT','TBGL_ISWINDOW','TBGL_ISPOINTVISIBLE','TBGL_ISPOINTBEHINDVIEW',
+ 'TBGL_GETWINDOWMULTIKEYSTATE','TBGL_GETWINDOWKEYSTATE','TBGL_GETWINDOWKEYONCE','TBGL_GETWINDOWCLIENT','TBGL_GETTEXTURENAME','TBGL_GETTEXTURELIST','TBGL_GETPIXELINFO','TBGL_GETMULTIASYNCKEYSTATE',
+ 'TBGL_GETLASTGLERROR','TBGL_GETFRAMERATE','TBGL_GETDESKTOPINFO','TBGL_GETASYNCKEYSTATE','TBGL_ERRORMESSAGES','TBGL_ENDPOLY','TBGL_ENDLIST','TBGL_DRAWFRAME',
+ 'TBGL_DESTROYWINDOW','TBGL_DELETELIST','TBGL_CYLINDER','TBGL_CREATEWINDOWEX','TBGL_CREATEWINDOW','TBGL_COLORALPHA','TBGL_COLOR','TBGL_CLEARFRAME',
+ 'TBGL_CAMERA','TBGL_CALLLIST','TBGL_BUILDFONT','TBGL_BOX','TBGL_BLENDFUNC','TBGL_BINDTEXTURE','TBGL_BEGINPOLY','TBGL_BACKCOLOR',
+ 'TBGL_ALPHAFUNC','TBDI_JOYZ','TBDI_JOYY','TBDI_JOYX','TBDI_JOYSTOPEFFECT','TBDI_JOYSLIDER','TBDI_JOYSETRANGEZ','TBDI_JOYSETRANGEY',
+ 'TBDI_JOYSETRANGEXYZ','TBDI_JOYSETRANGEX','TBDI_JOYSETDEADZONEZ','TBDI_JOYSETDEADZONEY','TBDI_JOYSETDEADZONEXYZ','TBDI_JOYSETDEADZONEX','TBDI_JOYSETAUTOCENTER','TBDI_JOYRZ',
+ 'TBDI_JOYRY','TBDI_JOYRX','TBDI_JOYPOV','TBDI_JOYPLAYEFFECT','TBDI_JOYLOADEFFECT','TBDI_JOYHASFF','TBDI_JOYHASEFFECT','TBDI_JOYGETEFFECTNAME',
+ 'TBDI_JOYGETEFFECTGUID','TBDI_JOYCREATEEFFECT','TBDI_JOYCOUNTPOV','TBDI_JOYCOUNTEFFECTS','TBDI_JOYCOUNTBTN','TBDI_JOYCOUNTAXES','TBDI_JOYBUTTON','TBDI_JOYAVAIL',
+ 'TBDI_INIT','TBASS_STREAMFREE','TBASS_STREAMCREATEFILE','TBASS_SETVOLUME','TBASS_SETEAXPRESET','TBASS_SETEAXPARAMETERS','TBASS_SETCONFIG','TBASS_SET3DPOSITION',
+ 'TBASS_SET3DFACTORS','TBASS_SAMPLELOAD','TBASS_SAMPLEGETCHANNEL','TBASS_MUSICLOAD','TBASS_MUSICFREE','TBASS_INIT','TBASS_GETVOLUME','TBASS_GETVERSION',
+ 'TBASS_GETCONFIG','TBASS_FREE','TBASS_ERRORGETCODE','TBASS_CHANNELSTOP','TBASS_CHANNELSETPOSITION','TBASS_CHANNELSETATTRIBUTES','TBASS_CHANNELSET3DPOSITION','TBASS_CHANNELPLAY',
+ 'TBASS_CHANNELPAUSE','TBASS_CHANNELISACTIVE','TBASS_CHANNELGETPOSITION','TBASS_CHANNELGETLENGTH','TBASS_CHANNELGETATTRIBUTES','TBASS_APPLY3D','TANH','TANGENT',
+ 'TAN','TALLY','TABCTRL_ONNOTIFY','TABCTRL_INSERTITEM','TABCTRL_GETCURSEL','SWAP','SUB','STRZIP$',
+ 'STRUNZIP$','STRREVERSE$','STRPTRLEN','STRPTR','STRINSERT$','STRING$','STRING','STRDELETE$',
+ 'STR$','STOP','STEP','STDOUT','STDIN','STAT_SUM','STAT_STDERROR','STAT_STDDEVIATION',
+ 'STAT_RANDOM','STAT_PRODUCT','STAT_MIN','STAT_MEDIAN','STAT_MEANHARMONIC','STAT_MEANGEOMETRIC','STAT_MEANARITHMETIC','STAT_MAX',
+ 'STAT_INVERSESUM','STAT_HISTOGRAM','STAT_FILLARRAY','STAT_COUNT','STAT_COPYARRAY','STAT_CLONEARRAY','STAT_CHISQUARE','STATIC',
+ 'STATE','SQR','SPLIT','SORT','SMTP_STATISTICS','SMTP_SETOPTION','SMTP_SETLOGFILE','SMTP_SENDHTML',
+ 'SMTP_SENDEMAIL','SMTP_GETERROR','SMTP_FINISHED','SMTP_DEBUG','SMTP_CONNECT','SMTP_CLOSE','SLEEP','SIZEOF',
+ 'SIZE','SINH','SINGLE','SIN','SIGNED','SHOW','SHIFT','SHAPETOBMP',
+ 'SGN','SETAT','SET','SENDMESSAGE','SENDKEYSBULK','SENDKEYS','SEND','SELECTEXPRESSION',
+ 'SELECT','SECH','SEC','SCAN','SAPI_SPEAK','SAPI_SETVOLUME','SAPI_SETRATE','SAPI_MODULELOADED',
+ 'SAPI_GETVOLUME','SAPI_GETRATE','RTRIM$','RTF_SETTEXT','RTF_SETFONTSIZE','RTF_SETFONTNAME','RTF_SETFGCOLOR','RTF_SETEFFECT',
+ 'RTF_SETBGCOLOR','RTF_SETALIGN','RTF_SAVETOFILE','RTF_LOADFROMFILE','RTF_GETTEXT','RTF_GETFONTSIZE','RTF_GETFONTNAME','RTF_GETEFFECT',
+ 'RTF_GETCLASS','RTF_APPENDTEXT','RSET$','ROUND','RNDF','RND','RIGHT$','RIGHT',
+ 'RGB','RESOURCE','RESIZE','RESET','REPLACE$','REPEAT$','REMOVE$','REM',
+ 'REGISTRY_SETVALUE','REGISTRY_SETTXTNUM','REGISTRY_SETTXTBOOL','REGISTRY_SETDWORD','REGISTRY_GETVALUE','REGISTRY_GETTXTNUM','REGISTRY_GETTXTBOOL','REGISTRY_GETDWORD',
+ 'REGISTRY_GETALLKEYS','REGISTRY_DELVALUE','REGISTRY_DELKEY','REFERENCE','REF','REDRAW','REDIM','RAS_SETPARAMS',
+ 'RAS_OPENDIALUPDIALOG','RAS_LOADENTRIES','RAS_HANGUPALL','RAS_HANGUP','RAS_GETENTRY','RAS_BEGINDIAL','RANDOMIZE','RADTODEG',
+ 'QUERYPERFORMANCEFREQUENCY','QUERYPERFORMANCECOUNTER','QUAD','PTR','PRESERVE','POST','POPUP','POKE$',
+ 'POKE','PIXELS','PI','PERMUTATIONS','PEEKMESSAGE','PEEK$','PEEK','PC_SYSTEMUPFROM',
+ 'PC_SUSPENDSTATE','PC_SHUTDOWN','PC_SHOWCARET','PC_SETCARETBLINKTIME','PC_RESTARTDIALOG','PC_PREVENTSHUTDOWN','PC_LOCK','PC_INSERTCD',
+ 'PC_HIDECARET','PC_GETSTATEONOFF','PC_GETSCROLLLOCKKEYSTATE','PC_GETNUMLOCKKEYSTATE','PC_GETCARETBLINKTIME','PC_GETCAPSLOCKKEYSTATE','PC_EMPTYBIN','PC_EJECTCD',
+ 'PC_DECODECDERROR','PCT','PARSESET$','PARSECOUNT','PARSE$','PARSE','PARAMETERS','OUTSIDE',
+ 'OS_WINVERSIONTEXT','OS_WINGETVERSIONTIMELINE','OS_SHELLEXECUTE','OS_SHELLABOUT','OS_SHELL','OS_SETLASTCALLDLLERROR','OS_SERVICESTOP','OS_SERVICESTATUSDESCRIPTION',
+ 'OS_SERVICESTARTTYPEDESCRIPTION','OS_SERVICESTART','OS_SERVICESETSTARTTYPE','OS_SERVICEQUERY','OS_SERVICEGETSTARTTYPE','OS_SERVICEGETLIST','OS_PROCESSKILLBYNAME','OS_PROCESSKILLBYID',
+ 'OS_PROCESSISRUNNING','OS_PROCESSGETLIST','OS_PROCESSGETID','OS_PROCESSARERUNNING','OS_MESSAGEBEEP','OS_ISWOW64','OS_ISFEATUREPRESENT','OS_IEVERSION',
+ 'OS_GETWINDOWSDIR','OS_GETUSERNAME','OS_GETTEMPDIR','OS_GETSYSTEMDIR','OS_GETSPECIALFOLDER','OS_GETLASTCALLDLLSTATUS','OS_GETLASTCALLDLLERROR','OS_GETCURRENTTHREADID',
+ 'OS_GETCURRENTPROCESSID','OS_GETCOMPUTERNAME','OS_GETCOMMANDS','OS_GETCOMMAND','OS_FLASHWINDOW','OS_FATALAPPEXIT','OS_ENVIRON','OS_CALLDLL',
+ 'OR','OPTIONAL','OPTION','OPT','ONCE','ON','OFF','NUMBER',
+ 'NOT','NEXT','NEW','MSGBOX','MOUSEPTR','MODULE','MODELESS','MODAL',
+ 'MOD','MKWRD$','MKS$','MKQ$','MKL$','MKI$','MKE$','MKDWD$',
+ 'MKD$','MKCUX$','MKCUR$','MKBYT$','MIN$','MIN','MID$','MENU',
+ 'MDI_CREATE','MCASE$','MAX$','MAX','MAKWRD','MAKLNG','MAKINT','MAKDWR',
+ 'LTRIM$','LSET$','LOWRD','LOOP','LONG','LOINT','LOG_WRITE','LOGB',
+ 'LOG2','LOG10','LOG','LOCAL','LOC','LL_UPDATEBYNAME','LL_UPDATE','LL_TOSTRING',
+ 'LL_TOFILE','LL_NAME','LL_GETITEM','LL_GETBYNUMBER','LL_FROMFILE','LL_FREE','LL_FINDLAST','LL_FINDBYNAME',
+ 'LL_FINDBYDATA','LL_DELETELIKE','LL_DELETEBYNAME','LL_DELETE','LL_DATABYNAME','LL_DATA','LL_COUNT','LL_ADD',
+ 'LISTBOX','LINE','LIBRARY_EXISTS','LIB','LEN','LEFT$','LEFT','LCASE$',
+ 'LBOUND','LABEL','KILL','JOIN$','ITERATE','ISWINDOW','ISUNICODE','ISTRUE',
+ 'ISODD','ISLIKE','ISFALSE','ISEVEN','IP_TOSTRING','IP_ADDR','INTERNALINFO','INTEGER',
+ 'INT','INSTR','INSIDE','INPUTBOX$','INI_SETKEY','INI_GETSECTIONSLIST','INI_GETSECTIONKEYLIST','INI_GETKEY',
+ 'INET_URLDOWNLOAD','INET_PING','INET_OPENDIALUPDIALOG','INET_GETSTATE','INET_GETREMOTEMACADDRESS','INET_GETIP','INET_GETCONNECTIONMODE','INCR',
+ 'IN','IMAGE','IIF$','IIF','IF','ICRYPTO_TESTSHA1','ICRYPTO_TESTMD5','ICRYPTO_TESTCRC32',
+ 'ICRYPTO_TESTCRC16','ICRYPTO_STRING2ASCII','ICRYPTO_SHA1','ICRYPTO_MD5','ICRYPTO_ENCRYPTRIJNDAEL','ICRYPTO_ENCRYPTRC4','ICRYPTO_DECRYPTRIJNDAEL','ICRYPTO_DECRYPTRC4',
+ 'ICRYPTO_CRC32','ICRYPTO_CRC16','ICRYPTO_BYTEXOR','ICRYPTO_BIN2ASCII','ICRYPTO_ASCII2STRING','ICRYPTO_ASCII2BIN','HOST_ADDR','HOSTNAME_TOIP',
+ 'HOSTIP_TONAME','HIWRD','HIINT','HEX$','HASH','HANDLE','GUIDTXT$','GUID$',
+ 'GRAPHIC','GLVOID','GLUSHORT','GLUINT','GLUBYTE','GLSIZEI','GLSHORT','GLOBAL',
+ 'GLINT','GLFLOAT','GLENUM','GLDOUBLE','GLCLAMPF','GLCLAMPD','GLBYTE','GLBOOLEAN',
+ 'GLBITFIELD','GETWINDOWMULTIKEYSTATE','GETWINDOWKEYSTATE','GETTICKCOUNT','GETS','GETMULTIASYNCKEYSTATE','GETMESSAGE','GETCURRENTINSTANCE',
+ 'GETAT','GETASYNCKEYSTATE','GET','FUNCTION_NPARAMS','FUNCTION_EXISTS','FUNCTION_CPARAMS','FUNCTION','FTP_SETSTRING',
+ 'FTP_SETSERVERDIR','FTP_SETNUMBER','FTP_SETMODE','FTP_SETLOGFILE','FTP_SETLOCALDIR','FTP_QUIT','FTP_PUTFILE','FTP_GETSTRING',
+ 'FTP_GETSERVERDIR','FTP_GETNUMBER','FTP_GETLOCALDIR','FTP_GETLIST','FTP_GETFILE','FTP_GETERRORSTRING','FTP_GETERRORNUMBER','FTP_FINISHED',
+ 'FTP_EXTRACT','FTP_DELFILE','FTP_CONNECT','FTP_COMMAND','FRAME','FRAC','FORMAT$','FOR',
+ 'FONT_LIST','FONT_CREATE','FONT','FOCUS','FLUSH','FIX','FILE_SIZE','FILE_SHELLDELETE',
+ 'FILE_SHELLCOPY','FILE_SETDATETIME','FILE_SEEK','FILE_SAVE','FILE_RENAME','FILE_PUT','FILE_PATHSPLIT','FILE_OPEN',
+ 'FILE_LOF','FILE_LOAD','FILE_LINEPRINT','FILE_LINEINPUT','FILE_KILL','FILE_GETVERSIONSTRING','FILE_GETVERSION','FILE_GETTIME',
+ 'FILE_GETDATETIMESTAMP','FILE_GETDATETIME','FILE_GETDATE','FILE_GET','FILE_EXISTS','FILE_EOF','FILE_COPY','FILE_CLOSE',
+ 'FILE_CHANGED','FILE_APPEND','FACTORIAL','EXTRACT$','EXT','EXPORT','EXP2','EXP10',
+ 'EXP','EXIT','EVAL_STRING','EVAL_SETSTRING','EVAL_SETNUMBER','EVAL_MATH','EVAL_LINKEXT','EVAL_GETSTRING',
+ 'EVAL_GETNUMBER','EVAL_ERRORGETTOKEN','EVAL_ERRORDESCRIPTION','EVAL_ERRORCLEAR','EVAL','ERRCLEAR','ERR','ENGINE_GETCURRENTTOKEN',
+ 'ENDIF','END','ENABLE','ELSEIF','ELSE','ECHO','DWORD','DT_YEAR',
+ 'DT_TIMETOSEC','DT_TIMESUBSECONDS','DT_TIMEFORMAT','DT_TIMEADDSECONDS','DT_SETTIMESEPARATOR','DT_SETDATESEPARATOR','DT_SETDATECENTURY','DT_SECTOTIME',
+ 'DT_SECTODATE','DT_SECOND','DT_MONTH','DT_MINUTE','DT_LASTDAYOFMONTH','DT_ISVALIDDATE','DT_ISLEAPYEAR','DT_HOUR',
+ 'DT_GETWEEKDAYNAME','DT_GETWEEKDAY','DT_GETTIMESTAMP','DT_GETTIMESEPARATOR','DT_GETMONTHNAME','DT_GETDATESEPARATOR','DT_GETDATECENTURY','DT_DAY',
+ 'DT_DATETOSEC','DT_DATETIMESUBSECONDS','DT_DATETIMEADDSECONDS','DT_DATESUBDAYS','DT_DATEFORMAT','DT_DATEDIFF','DT_DATEADDDAYS','DT_COOKIEDATE',
+ 'DRAW','DOUBLE','DOEVENTS','DO','DISABLE','DIR_REMOVE','DIR_MAKEALL','DIR_MAKE',
+ 'DIR_LISTARRAY','DIR_LIST','DIR_ISEMPTY','DIR_ISDIR','DIR_GETCURRENT','DIR_EXISTS','DIR_CHANGEDRIVE','DIR_CHANGE',
+ 'DIM','DICTIONARY_MEMINFO','DICTIONARY_LISTKEYS','DICTIONARY_FREE','DICTIONARY_FIND','DICTIONARY_EXISTS','DICTIONARY_CREATE','DICTIONARY_COUNT',
+ 'DICTIONARY_ADD','DIALOG_STOPEVENTS','DIALOG_SAVEFILE','DIALOG_OPENFILE','DIALOG_GETCONTROL','DIALOG_CHOOSECOLOR','DIALOG_BROWSEFORFOLDER','DIALOG',
+ 'DESKTOP','DESCENDING','DESCEND','DELETEOBJECT','DELETE','DEGTORAD','DECR','DECLARE',
+ 'DATE$','CVWRD','CVS','CVQ','CVL','CVI','CVE','CVDWD',
+ 'CVD','CVCUX','CVCUR','CVBYT','CURRENCY','CUR','CSET$','CSCH',
+ 'CSC','CRYPTO_GETPROVIDERTYPESCOUNT','CRYPTO_GETPROVIDERSCOUNT','CRYPTO_GETDEFAULTPROVIDER','CRYPTO_GENRANDOMSTRING','CRYPTO_ENUMPROVIDERTYPES','CRYPTO_ENUMPROVIDERS','CRYPTO_ENCRYPT',
+ 'CRYPTO_DECRYPT','CREATEFONT','COTH','COTAN','COSH','COS','CONTROL_SETTEXT','CONTROL_GETTEXT',
+ 'CONTROL_GETNUMBER','CONTROL','CONST','CONSOLE_WRITELINE','CONSOLE_WRITE','CONSOLE_WAITKEY','CONSOLE_SHOWWINDOW','CONSOLE_SHOWCURSOR',
+ 'CONSOLE_SETTITLE','CONSOLE_SETTEXTATTRIBUTE','CONSOLE_SETSTDHANDLE','CONSOLE_SETSCREENBUFFERSIZE','CONSOLE_SETPROGRESSBARCHAR','CONSOLE_SETOUTPUTMODE','CONSOLE_SETOUTPUTCP','CONSOLE_SETINPUTMODE',
+ 'CONSOLE_SETFILEAPISTOOEM','CONSOLE_SETFILEAPISTOANSI','CONSOLE_SETCURSORSIZE','CONSOLE_SETCURSORPOSITION','CONSOLE_SETCP','CONSOLE_SETACTIVESCREENBUFFER','CONSOLE_SCROLLWINDOW','CONSOLE_SCROLLBUFFERONEROW',
+ 'CONSOLE_SCROLLBUFFER','CONSOLE_SAVESCREEN','CONSOLE_RESTORESCREEN','CONSOLE_READLINE','CONSOLE_READ','CONSOLE_PROGRESSBAR','CONSOLE_PRINTLINE','CONSOLE_PRINTAT',
+ 'CONSOLE_PRINT','CONSOLE_NORMALSCREEN','CONSOLE_LINE','CONSOLE_INKEYB','CONSOLE_INKEY','CONSOLE_HIDECURSOR','CONSOLE_GETTITLE','CONSOLE_GETTEXTATTRIBUTE',
+ 'CONSOLE_GETSTDHANDLE','CONSOLE_GETSIZEY','CONSOLE_GETSIZEX','CONSOLE_GETPROGRESSBARCHAR','CONSOLE_GETOUTPUTMODE','CONSOLE_GETOUTPUTCP','CONSOLE_GETNUMBEROFMOUSEBUTTONS','CONSOLE_GETINPUTMODE',
+ 'CONSOLE_GETCURSORY','CONSOLE_GETCURSORX','CONSOLE_GETCURSORSIZE','CONSOLE_GETCURRENTFONTINDEX','CONSOLE_GETCP','CONSOLE_GENERATECTRLEVENT','CONSOLE_FULLSCREEN','CONSOLE_FREE',
+ 'CONSOLE_FOREGROUNDRGB','CONSOLE_ENABLECTRLC','CONSOLE_DISABLECTRLC','CONSOLE_CREATESCREENBUFFER','CONSOLE_COLORAT','CONSOLE_CLS','CONSOLE_BOX','CONSOLE_BACKGROUNDRGB',
+ 'CONSOLE_ATTACH','CONSOLE_AREFILEAPISANSI','CONSOLE_ALLOC','COM_VARIANTINIT','COM_VARIANTCOPY','COM_VARIANTCLEAR','COM_SUCCEEDED','COM_STRINGFROMCLSID',
+ 'COM_RELEASE','COM_QUERYINTERFACE','COM_PROGIDFROMCLSID','COM_ISEQUALIID','COM_ISEQUALGUID','COM_ISEQUALCLSID','COM_GETOBJECT','COM_GETENGINEGUID',
+ 'COM_EXECUTE','COM_DISPLAYERROR','COM_CREATEOBJECT','COM_CLSIDFROMSTRING','COM_CLSIDFROMPROGID','COM_BUILDVARIANT','COMBOBOX','COMBINATIONS',
+ 'COLOR','CLIPBOARD_SETTEXT','CLIPBOARD_GETTEXT','CLIENT','CLEARMESSAGES','CHR$','CHOOSE$','CHOOSE',
+ 'CHECKBOX','CHECK3STATE','CHECK','CGI_WRITELOGFILE','CGI_WRITE','CGI_URLDECODESTRING','CGI_UPLOADFILESTIME','CGI_UPLOADFILESNUMBER',
+ 'CGI_UPLOADFILESIZE','CGI_STARTSESSION','CGI_SETSESSIONVARIABLE','CGI_RESETDEFAULTSETTINGS','CGI_REMOVESPECIALCHARSPREFIX','CGI_REMOVEQUOTE','CGI_READ','CGI_LOADCONFIGFILE',
+ 'CGI_HEADER','CGI_GETSESSIONVARIABLE','CGI_GETREQUESTMETHOD','CGI_GETQUERYVALUE','CGI_GETCURRENTSESSION','CGI_GETCURRENTGUID','CGI_ENVIRON','CGI_CFGSETOPTION',
+ 'CGI_CFGGETOPTION','CGI_ADDSPECIALCHARSPREFIX','CGI_ADDQUOTE','CEIL','CASE','CALL','BYVAL','BYTE',
+ 'BYREF','BYCMD','BUTTON','BUNDLE_SETSCRIPTPARAMETERS','BUNDLE_SETSCRIPTNAME','BUNDLE_SETFLAGOBFUSCATEMAINSCRIPT','BUNDLE_SETFLAGDELETEAFTERRUN','BUNDLE_SETFLAGCOMPRESSALLFILES',
+ 'BUNDLE_SETFLAGASKBEFOREEXTRACT','BUNDLE_SETEXTRACTIONFOLDER','BUNDLE_SETCREATIONFOLDER','BUNDLE_SETBUNDLENAME','BUNDLE_RESET','BUNDLE_MAKE','BUNDLE_BUILDER','BUNDLE_ADDFOLDER',
+ 'BUNDLE_ADDFILE','BOUNDCHECK','BIN$','BIFF_WRITETEXT','BIFF_WRITENUMBER','BIFF_WRITEDATE','BIFF_SETROWHEIGHT','BIFF_SETCOLWIDTH',
+ 'BIFF_SETBUFFER','BIFF_CREATEFILE','BIFF_CLOSEFILE','BETWEEN','BEEP','BAR','ATTACH','ATN',
+ 'AT','ASSIGN','ASCIZ','ASCIIZ','ASCII2UNICODE','ASCENDING','ASCEND','ASC',
+ 'AS','ARRAY','ARCTANH','ARCSINH','ARCSIN','ARCSECH','ARCSEC','ARCCSCH',
+ 'ARCCSC','ARCCOTH','ARCCOT','ARCCOSH','ARCCOS','APP_TIMER','APP_SOURCEPATH','APP_SOURCENAME',
+ 'APP_SOURCEFULLNAME','APP_PATH','APP_NAME','APP_LISTVARIABLES','APP_LISTKEYWORDS','APP_LISTFUNCTIONS','APP_LISTEQUATES','APP_INCLUDEPATH',
+ 'APP_GETMODULEFULLPATH','APP_COUNTER','APPEND','ANY','ANIMATE_STOP','ANIMATE_PLAY','ANIMATE_OPEN','AND',
+ 'ALIAS','ALERT','ADD','ACODE$','ABS','%DEF','#MINVERSION','#IF',
+ '#ENDIF','#ELSEIF','#ELSE','#DEFAULT','#DEF','SQLWRITEPRIVATEPROFILESTRING','SQLWRITEFILEDSN','SQLWRITEDSNTOINI',
+ 'SQLVALIDDSN','SQLTRANSACT','SQLTABLES','SQLTABLEPRIVILEGES','SQLSTATISTICS','SQLSPECIALCOLUMNS','SQLSETSTMTOPTION','SQLSETSTMTATTR',
+ 'SQLSETSCROLLOPTIONS','SQLSETPOS','SQLSETPARAM','SQLSETENVATTR','SQLSETDESCREC','SQLSETDESCFIELD','SQLSETCURSORNAME','SQLSETCONNECTOPTION',
+ 'SQLSETCONNECTATTR','SQLSETCONFIGMODE','SQLROWCOUNT','SQLREMOVETRANSLATOR','SQLREMOVEDSNFROMINI','SQLREMOVEDRIVERMANAGER','SQLREMOVEDRIVER','SQLREADFILEDSN',
+ 'SQLPUTDATA','SQLPROCEDURES','SQLPROCEDURECOLUMNS','SQLPRIMARYKEYS','SQLPREPARE','SQLPOSTINSTALLERERROR','SQLPARAMOPTIONS','SQLPARAMDATA',
+ 'SQLNUMRESULTCOLS','SQLNUMPARAMS','SQLNATIVESQL','SQLMORERESULTS','SQLMANAGEDATASOURCES','SQLINSTALLTRANSLATOREX','SQLINSTALLERERROR','SQLINSTALLDRIVERMANAGER',
+ 'SQLINSTALLDRIVEREX','SQLGETTYPEINFO','SQLGETTRANSLATOR','SQLGETSTMTOPTION','SQLGETSTMTATTR','SQLGETPRIVATEPROFILESTRING','SQLGETINSTALLEDDRIVERS','SQLGETINFO',
+ 'SQLGETFUNCTIONS','SQLGETENVATTR','SQLGETDIAGREC','SQLGETDIAGFIELD','SQLGETDESCREC','SQLGETDESCFIELD','SQLGETDATA','SQLGETCURSORNAME',
+ 'SQLGETCONNECTOPTION','SQLGETCONNECTATTR','SQLGETCONFIGMODE','SQLFREESTMT','SQLFREEHANDLE','SQLFREEENV','SQLFREECONNECT','SQLFOREIGNKEYS',
+ 'SQLFETCHSCROLL','SQLFETCH','SQLEXTENDEDFETCH','SQLEXECUTE','SQLEXECDIRECT','SQLERROR','SQLENDTRAN','SQLDRIVERS',
+ 'SQLDRIVERCONNECT','SQLDISCONNECT','SQLDESCRIBEPARAM','SQLDESCRIBECOL','SQLDATASOURCES','SQLCREATEDATASOURCE','SQLCOPYDESC','SQLCONNECT',
+ 'SQLCONFIGDRIVER','SQLCONFIGDATASOURCE','SQLCOLUMNS','SQLCOLUMNPRIVILEGES','SQLCOLATTRIBUTES','SQLCOLATTRIBUTE','SQLCLOSECURSOR','SQLCANCEL',
+ 'SQLBULKOPERATIONS','SQLBROWSECONNECT','SQLBINDPARAMETER','SQLBINDPARAM','SQLBINDCOL','SQLALLOCSTMT','SQLALLOCHANDLE','SQLALLOCENV',
+ 'SQLALLOCCONNECT','ODBCWRONGDRIVER','ODBCWRITEPRIVATEPROFILESTRING','ODBCWRITEFILEDSN','ODBCWRITEDSNTOINI','ODBCVALIDDSN','ODBCUPDATERECORD','ODBCUPDATEBYBOOKMARK',
+ 'ODBCUNLOCKRECORD','ODBCUNBINDCOLUMNS','ODBCUNBINDCOL','ODBCTABLESCOUNT','ODBCTABLES','ODBCTABLEPRIVILEGESCOUNT','ODBCTABLEPRIVILEGES','ODBCSUPPORTS',
+ 'ODBCSTATTABLESCHEMANAME','ODBCSTATTABLEPAGES','ODBCSTATTABLECATALOGNAME','ODBCSTATTABLECARDINALITY','ODBCSTATISTICSCOUNT','ODBCSTATISTICS','ODBCSTATINDEXSORTSEQUENCE','ODBCSTATINDEXSCHEMANAME',
+ 'ODBCSTATINDEXQUALIFIER','ODBCSTATINDEXPAGES','ODBCSTATINDEXFILTERCONDITION','ODBCSTATINDEXCOLUMNORDINALPOSITION','ODBCSTATINDEXCOLUMNNAME','ODBCSTATINDEXCATALOGNAME','ODBCSTATINDEXCARDINALITY','ODBCSTATINDEXALLOWDUPLICATES',
+ 'ODBCSPECIALCOLUMNSCOUNT','ODBCSPECIALCOLUMNS','ODBCSETTXNISOLATION','ODBCSETTRANSLATELIB','ODBCSETTRACEFILE','ODBCSETTRACE','ODBCSETSTMTUSEBOOKMARKS','ODBCSETSTMTSIMULATECURSOR',
+ 'ODBCSETSTMTROWSTATUSPTR','ODBCSETSTMTROWSFETCHEDPTR','ODBCSETSTMTROWOPERATIONPTR','ODBCSETSTMTROWBINDTYPE','ODBCSETSTMTROWBINDOFFSETPTR','ODBCSETSTMTROWARRAYSIZE','ODBCSETSTMTRETRIEVEDATA','ODBCSETSTMTQUERYTIMEOUT',
+ 'ODBCSETSTMTPARAMSTATUSPTR','ODBCSETSTMTPARAMSPROCESSEDPTR','ODBCSETSTMTPARAMSETSIZE','ODBCSETSTMTPARAMOPERATIONPTR','ODBCSETSTMTPARAMBINDTYPE','ODBCSETSTMTPARAMBINDOFFSETPTR','ODBCSETSTMTNOSCAN','ODBCSETSTMTMETADATAID',
+ 'ODBCSETSTMTMAXROWS','ODBCSETSTMTMAXLENGTH','ODBCSETSTMTKEYSETSIZE','ODBCSETSTMTFETCHBOOKMARKPTR','ODBCSETSTMTENABLEAUTOIPD','ODBCSETSTMTCURSORTYPE','ODBCSETSTMTCURSORSENSITIVITY','ODBCSETSTMTCURSORSCROLLABLE',
+ 'ODBCSETSTMTCONCURRENCY','ODBCSETSTMTATTR','ODBCSETSTMTASYNCENABLE','ODBCSETSTMTAPPROWDESC','ODBCSETSTMTAPPPARAMDESC','ODBCSETSTATICCURSOR','ODBCSETROWVERCONCURRENCY','ODBCSETRESULT',
+ 'ODBCSETRELATIVEPOSITION','ODBCSETREADONLYCONCURRENCY','ODBCSETQUIETMODE','ODBCSETPOSITION','ODBCSETPOS','ODBCSETPACKETMODE','ODBCSETOPTIMISTICCONCURRENCY','ODBCSETODBCCURSORS',
+ 'ODBCSETMULTIUSERKEYSETCURSOR','ODBCSETMETADATAID','ODBCSETLOGINTIMEOUT','ODBCSETLOCKCONCURRENCY','ODBCSETKEYSETDRIVENCURSOR','ODBCSETFORWARDONLYCURSOR','ODBCSETENVOUTPUTNTS','ODBCSETENVODBCVERSION',
+ 'ODBCSETENVCPMATCH','ODBCSETENVCONNECTIONPOOLING','ODBCSETENVATTR','ODBCSETDYNAMICCURSOR','ODBCSETDESCREC','ODBCSETDESCFIELD','ODBCSETCURSORTYPE','ODBCSETCURSORSENSITIVITY',
+ 'ODBCSETCURSORSCROLLABILITY','ODBCSETCURSORNAME','ODBCSETCURSORLOCKTYPE','ODBCSETCURSORKEYSETSIZE','ODBCSETCURSORCONCURRENCY','ODBCSETCURRENTCATALOG','ODBCSETCONNECTIONTIMEOUT','ODBCSETCONNECTATTR',
+ 'ODBCSETCONFIGMODE','ODBCSETCONCURVALUESCONCURRENCY','ODBCSETAUTOCOMMITON','ODBCSETAUTOCOMMITOFF','ODBCSETAUTOCOMMIT','ODBCSETASYNCENABLE','ODBCSETACCESSMODE','ODBCSETABSOLUTEPOSITION',
+ 'ODBCROWCOUNT','ODBCROLLBACKTRAN','ODBCROLLBACKENVTRAN','ODBCROLLBACKDBCTRAN','ODBCRESULT','ODBCRESETPARAMS','ODBCREMOVETRANSLATOR','ODBCREMOVEDSNFROMINI',
+ 'ODBCREMOVEDRIVERMANAGER','ODBCREMOVEDRIVER','ODBCREFRESHRECORD','ODBCRECORDCOUNT','ODBCREADFILEDSN','ODBCQUOTEDIDENTIFIERCASE','ODBCPUTDATA','ODBCPROCEDURESCOUNT',
+ 'ODBCPROCEDURES','ODBCPROCEDURECOLUMNSCOUNT','ODBCPROCEDURECOLUMNS','ODBCPRIMARYKEYSCOUNT','ODBCPRIMARYKEYS','ODBCPREPARE','ODBCPOSTINSTALLERERROR','ODBCPARAMDATA',
+ 'ODBCOPENSTMT','ODBCOPENCONNECTION','ODBCNUMRESULTCOLS','ODBCNUMPARAMS','ODBCNATIVESQL','ODBCMOVEPREVIOUS','ODBCMOVENEXT','ODBCMOVELAST',
+ 'ODBCMOVEFIRST','ODBCMOVE','ODBCMORERESULTS','ODBCMANAGEDATASOURCES','ODBCLOCKRECORD','ODBCINSTALLTRANSLATOREX','ODBCINSTALLERERROR','ODBCINSTALLDRIVERMANAGER',
+ 'ODBCINSTALLDRIVEREX','ODBCGETXOPENCLIYEAR','ODBCGETUSERNAME','ODBCGETUNION','ODBCGETTYPEINFOCOUNT','ODBCGETTYPEINFO','ODBCGETTXNISOLATIONOPTION','ODBCGETTXNISOLATION',
+ 'ODBCGETTXNCAPABLE','ODBCGETTRANSLATOR','ODBCGETTRANSLATELIB','ODBCGETTRACEFILE','ODBCGETTRACE','ODBCGETTIMEDATEFUNCTIONS','ODBCGETTIMEDATEDIFFINTERVALS','ODBCGETTIMEDATEADDINTERVALS',
+ 'ODBCGETTABLETERM','ODBCGETSYSTEMFUNCTIONS','ODBCGETSUBQUERIES','ODBCGETSTRINGFUNCTIONS','ODBCGETSTMTUSEBOOKMARKS','ODBCGETSTMTSQLSTATE','ODBCGETSTMTSIMULATECURSOR','ODBCGETSTMTROWSTATUSPTR',
+ 'ODBCGETSTMTROWSFETCHEDPTR','ODBCGETSTMTROWOPERATIONPTR','ODBCGETSTMTROWNUMBER','ODBCGETSTMTROWBINDTYPE','ODBCGETSTMTROWBINDOFFSETPTR','ODBCGETSTMTROWARRAYSIZE','ODBCGETSTMTRETRIEVEDATA','ODBCGETSTMTQUERYTIMEOUT',
+ 'ODBCGETSTMTPARAMSTATUSPTR','ODBCGETSTMTPARAMSPROCESSEDPTR','ODBCGETSTMTPARAMSETSIZE','ODBCGETSTMTPARAMOPERATIONPTR','ODBCGETSTMTPARAMBINDTYPE','ODBCGETSTMTPARAMBINDOFFSETPTR','ODBCGETSTMTNOSCAN','ODBCGETSTMTMETADATAID',
+ 'ODBCGETSTMTMAXROWS','ODBCGETSTMTMAXLENGTH','ODBCGETSTMTKEYSETSIZE','ODBCGETSTMTIMPROWDESC','ODBCGETSTMTIMPPARAMDESC','ODBCGETSTMTFETCHBOOKMARKPTR','ODBCGETSTMTERRORINFO','ODBCGETSTMTENABLEAUTOIPD',
+ 'ODBCGETSTMTCURSORTYPE','ODBCGETSTMTCURSORSENSITIVITY','ODBCGETSTMTCURSORSCROLLABLE','ODBCGETSTMTCONCURRENCY','ODBCGETSTMTATTR','ODBCGETSTMTASYNCENABLE','ODBCGETSTMTAPPROWDESC','ODBCGETSTMTAPPPARAMDESC',
+ 'ODBCGETSTATICCURSORATTRIBUTES2','ODBCGETSTATICCURSORATTRIBUTES1','ODBCGETSTATEMENTSQLSTATE','ODBCGETSTATEMENTERRORINFO','ODBCGETSTANDARDCLICONFORMANCE','ODBCGETSQLSTATE','ODBCGETSQLCONFORMANCE','ODBCGETSQL92VALUEEXPRESSIONS',
+ 'ODBCGETSQL92STRINGFUNCTIONS','ODBCGETSQL92ROWVALUECONSTRUCTOR','ODBCGETSQL92REVOKE','ODBCGETSQL92RELATIONALJOINOPERATORS','ODBCGETSQL92PREDICATES','ODBCGETSQL92NUMERICVALUEFUNCTIONS','ODBCGETSQL92GRANT','ODBCGETSQL92FOREIGNKEYUPDATERULE',
+ 'ODBCGETSQL92FOREIGNKEYDELETERULE','ODBCGETSQL92DATETIMEFUNCTIONS','ODBCGETSPECIALCHARACTERS','ODBCGETSERVERNAME','ODBCGETSEARCHPATTERNESCAPE','ODBCGETSCROLLOPTIONS','ODBCGETSCHEMAUSAGE','ODBCGETSCHEMATERM',
+ 'ODBCGETROWUPDATES','ODBCGETQUIETMODE','ODBCGETPROCEDURETERM','ODBCGETPROCEDURESSUPPORT','ODBCGETPRIVATEPROFILESTRING','ODBCGETPOSOPERATIONS','ODBCGETPARAMARRAYSELECTS','ODBCGETPARAMARRAYROWCOUNTS',
+ 'ODBCGETPACKETMODE','ODBCGETOUTERJOINS','ODBCGETORDERBYCOLUMNSINSELECT','ODBCGETOJCAPABILITIES','ODBCGETODBCVER','ODBCGETODBCINTERFACECONFORMANCE','ODBCGETODBCCURSORS','ODBCGETNUMERICFUNCTIONS',
+ 'ODBCGETNULLCOLLATION','ODBCGETNONNULLABLECOLUMNS','ODBCGETNEEDLONGDATALEN','ODBCGETMULTRESULTSETS','ODBCGETMULTIPLEACTIVETXN','ODBCGETMETADATAID','ODBCGETMAXUSERNAMELEN','ODBCGETMAXTABLESINSELECT',
+ 'ODBCGETMAXTABLENAMELEN','ODBCGETMAXSTATEMENTLEN','ODBCGETMAXSCHEMANAMELEN','ODBCGETMAXROWSIZEINCLUDESLONG','ODBCGETMAXROWSIZE','ODBCGETMAXPROCEDURENAMELEN','ODBCGETMAXINDEXSIZE','ODBCGETMAXIDENTIFIERLEN',
+ 'ODBCGETMAXDRIVERCONNECTIONS','ODBCGETMAXCURSORNAMELEN','ODBCGETMAXCONCURRENTACTIVITIES','ODBCGETMAXCOLUMNSINTABLE','ODBCGETMAXCOLUMNSINSELECT','ODBCGETMAXCOLUMNSINORDERBY','ODBCGETMAXCOLUMNSININDEX','ODBCGETMAXCOLUMNSINGROUPBY',
+ 'ODBCGETMAXCOLUMNNAMELEN','ODBCGETMAXCHARLITERALLEN','ODBCGETMAXCATALOGNAMELEN','ODBCGETMAXBINARYLITERALLEN','ODBCGETMAXASYNCCONCURRENTSTATEMENTS','ODBCGETLONGVARCHARDATABYCOLNAME','ODBCGETLONGVARCHARDATA','ODBCGETLOGINTIMEOUT',
+ 'ODBCGETLIKEESCAPECLAUSE','ODBCGETKEYWORDS','ODBCGETKEYSETCURSORATTRIBUTES2','ODBCGETKEYSETCURSORATTRIBUTES1','ODBCGETINTEGRITY','ODBCGETINSTALLERERRORMESSAGE','ODBCGETINSTALLERERRORCODE','ODBCGETINSTALLEDDRIVERS',
+ 'ODBCGETINSERTSTATEMENT','ODBCGETINFOSTR','ODBCGETINFOSCHEMAVIEWS','ODBCGETINFOLONG','ODBCGETINFOINT','ODBCGETINFO','ODBCGETINDEXKEYWORDS','ODBCGETIMPROWDESCREC',
+ 'ODBCGETIMPROWDESCFIELDTYPE','ODBCGETIMPROWDESCFIELDSCALE','ODBCGETIMPROWDESCFIELDPRECISION','ODBCGETIMPROWDESCFIELDOCTETLENGTH','ODBCGETIMPROWDESCFIELDNULLABLE','ODBCGETIMPROWDESCFIELDNAME','ODBCGETIMPROWDESCFIELD','ODBCGETIMPPARAMDESCREC',
+ 'ODBCGETIMPPARAMDESCFIELDTYPE','ODBCGETIMPPARAMDESCFIELDSCALE','ODBCGETIMPPARAMDESCFIELDPRECISION','ODBCGETIMPPARAMDESCFIELDOCTETLENGTH','ODBCGETIMPPARAMDESCFIELDNULLABLE','ODBCGETIMPPARAMDESCFIELDNAME','ODBCGETIMPPARAMDESCFIELD','ODBCGETIDENTIFIERQUOTECHAR',
+ 'ODBCGETIDENTIFIERCASE','ODBCGETGROUPBY','ODBCGETFUNCTIONS','ODBCGETFORWARDONLYCURSORATTRIBUTES2','ODBCGETFORWARDONLYCURSORATTRIBUTES1','ODBCGETFILEUSAGE','ODBCGETEXPRESSIONSINORDERBY','ODBCGETERRORINFO',
+ 'ODBCGETENVSQLSTATE','ODBCGETENVOUTPUTNTS','ODBCGETENVODBCVERSION','ODBCGETENVIRONMENTSQLSTATE','ODBCGETENVIRONMENTERRORINFO','ODBCGETENVERRORINFO','ODBCGETENVCPMATCH','ODBCGETENVCONNECTIONPOOLING',
+ 'ODBCGETENVATTR','ODBCGETDYNAMICCURSORATTRIBUTES2','ODBCGETDYNAMICCURSORATTRIBUTES1','ODBCGETDROPVIEW','ODBCGETDROPTRANSLATION','ODBCGETDROPTABLE','ODBCGETDROPSCHEMA','ODBCGETDROPDOMAIN',
+ 'ODBCGETDROPCOLLATION','ODBCGETDROPCHARACTERSET','ODBCGETDROPASSERTION','ODBCGETDRIVERVER','ODBCGETDRIVERODBCVER','ODBCGETDRIVERNAME','ODBCGETDRIVERMANAGERINSTALLPATH','ODBCGETDRIVERHLIB',
+ 'ODBCGETDRIVERHENV','ODBCGETDRIVERHDBC','ODBCGETDMVERMINOR','ODBCGETDMVERMAJOR','ODBCGETDMVER','ODBCGETDIAGREC','ODBCGETDIAGFIELD','ODBCGETDESCSQLSTATE',
+ 'ODBCGETDESCRIPTORSQLSTATE','ODBCGETDESCRIPTORERRORINFO','ODBCGETDESCRIBEPARAMETER','ODBCGETDESCREC','ODBCGETDESCFIELD','ODBCGETDESCERRORINFO','ODBCGETDEFAULTTXNISOLATION','ODBCGETDDLINDEX',
+ 'ODBCGETDBMSVER','ODBCGETDBMSNAME','ODBCGETDBCSQLSTATE','ODBCGETDBCERRORINFO','ODBCGETDATETIMELITERALS','ODBCGETDATASTRINGBYCOLNAME','ODBCGETDATASTRING','ODBCGETDATASOURCEREADONLY',
+ 'ODBCGETDATASOURCENAME','ODBCGETDATAEXTENSIONS','ODBCGETDATABASENAME','ODBCGETDATA','ODBCGETCURSORTYPE','ODBCGETCURSORSENSITIVITYSUPPORT','ODBCGETCURSORSENSITIVITY','ODBCGETCURSORSCROLLABILITY',
+ 'ODBCGETCURSORROLLBACKBEHAVIOR','ODBCGETCURSORNAME','ODBCGETCURSORLOCKTYPE','ODBCGETCURSORKEYSETSIZE','ODBCGETCURSORCONCURRENCY','ODBCGETCURSORCOMMITBEHAVIOR','ODBCGETCURRENTCATALOG','ODBCGETCREATEVIEW',
+ 'ODBCGETCREATETRANSLATION','ODBCGETCREATETABLE','ODBCGETCREATESCHEMA','ODBCGETCREATEDOMAIN','ODBCGETCREATECOLLATION','ODBCGETCREATECHARACTERSET','ODBCGETCREATEASSERTION','ODBCGETCORRELATIONNAME',
+ 'ODBCGETCONVERTVARCHAR','ODBCGETCONVERTVARBINARY','ODBCGETCONVERTTINYINT','ODBCGETCONVERTTIMESTAMP','ODBCGETCONVERTTIME','ODBCGETCONVERTSMALLINT','ODBCGETCONVERTREAL','ODBCGETCONVERTNUMERIC',
+ 'ODBCGETCONVERTLONGVARCHAR','ODBCGETCONVERTLONGVARBINARY','ODBCGETCONVERTINTERVALYEARMONTH','ODBCGETCONVERTINTERVALDAYTIME','ODBCGETCONVERTINTEGER','ODBCGETCONVERTFUNCTIONS','ODBCGETCONVERTFLOAT','ODBCGETCONVERTDOUBLE',
+ 'ODBCGETCONVERTDECIMAL','ODBCGETCONVERTDATE','ODBCGETCONVERTCHAR','ODBCGETCONVERTBIT','ODBCGETCONVERTBINARY','ODBCGETCONVERTBIGINT','ODBCGETCONNECTIONTIMEOUT','ODBCGETCONNECTIONSQLSTATE',
+ 'ODBCGETCONNECTIONERRORINFO','ODBCGETCONNECTIONDEAD','ODBCGETCONNECTATTR','ODBCGETCONFIGMODE','ODBCGETCONCATNULLBEHAVIOR','ODBCGETCOLUMNALIAS','ODBCGETCOLLATIONSEQ','ODBCGETCATALOGUSAGE',
+ 'ODBCGETCATALOGTERM','ODBCGETCATALOGNAMESEPARATOR','ODBCGETCATALOGNAME','ODBCGETCATALOGLOCATION','ODBCGETBOOKMARKPERSISTENCE','ODBCGETBATCHSUPPORT','ODBCGETBATCHROWCOUNT','ODBCGETAUTOIPD',
+ 'ODBCGETAUTOCOMMIT','ODBCGETASYNCMODE','ODBCGETASYNCENABLE','ODBCGETALTERTABLE','ODBCGETALTERDOMAIN','ODBCGETAGGREGATEFUNCTIONS','ODBCGETACTIVEENVIRONMENTS','ODBCGETACCESSMODE',
+ 'ODBCGETACCESSIBLETABLES','ODBCGETACCESSIBLEPROCEDURES','ODBCFREESTMT','ODBCFREEHANDLE','ODBCFREEENV','ODBCFREEDESC','ODBCFREEDBC','ODBCFREECONNECT',
+ 'ODBCFOREIGNKEYSCOUNT','ODBCFOREIGNKEYS','ODBCFETCHSCROLL','ODBCFETCHBYBOOKMARK','ODBCFETCH','ODBCEXTENDEDFETCH','ODBCEXECUTE','ODBCEXECDIRECT',
+ 'ODBCERROR','ODBCEOF','ODBCENDTRAN','ODBCDRIVERSCOUNT','ODBCDRIVERS','ODBCDRIVERCONNECT','ODBCDISCONNECT','ODBCDESCRIBEPARAM',
+ 'ODBCDESCRIBECOL','ODBCDELETERECORD','ODBCDELETEBYBOOKMARK','ODBCDATASOURCES','ODBCCREATEDATASOURCE','ODBCCOPYDESC','ODBCCONNECTIONISDEAD','ODBCCONNECTIONISALIVE',
+ 'ODBCCONNECT','ODBCCONFIGDRIVER','ODBCCONFIGDATASOURCE','ODBCCOMMITTRAN','ODBCCOMMITENVTRAN','ODBCCOMMITDBCTRAN','ODBCCOLUPDATABLE','ODBCCOLUNSIGNED',
+ 'ODBCCOLUNNAMED','ODBCCOLUMNSCOUNT','ODBCCOLUMNS','ODBCCOLUMNPRIVILEGESCOUNT','ODBCCOLUMNPRIVILEGES','ODBCCOLUMN','ODBCCOLTYPENAME','ODBCCOLTYPE',
+ 'ODBCCOLTABLENAME','ODBCCOLSEARCHABLE','ODBCCOLSCHEMANAME','ODBCCOLSCALE','ODBCCOLPRECISION','ODBCCOLOCTETLENGTH','ODBCCOLNUMPRECRADIX','ODBCCOLNULLABLE',
+ 'ODBCCOLNAME','ODBCCOLLOCALTYPENAME','ODBCCOLLITERALSUFFIX','ODBCCOLLITERALPREFIX','ODBCCOLLENGTH','ODBCCOLLABEL','ODBCCOLISNULL','ODBCCOLFIXEDPRECSCALE',
+ 'ODBCCOLDISPLAYSIZE','ODBCCOLCOUNT','ODBCCOLCONCISETYPE','ODBCCOLCATALOGNAME','ODBCCOLCASESENSITIVE','ODBCCOLBASETABLENAME','ODBCCOLBASECOLUMNNAME','ODBCCOLAUTOUNIQUEVALUE',
+ 'ODBCCOLATTRIBUTE','ODBCCLOSESTMTCURSOR','ODBCCLOSESTMT','ODBCCLOSECURSOR','ODBCCLOSECONNECTION','ODBCCLEARRESULT','ODBCCANCEL','ODBCBULKOPERATIONS',
+ 'ODBCBROWSECONNECT','ODBCBINDPARAMETER','ODBCBINDCOLTOWORD','ODBCBINDCOLTOTIMESTAMP','ODBCBINDCOLTOTIME','ODBCBINDCOLTOSTRING','ODBCBINDCOLTOSINGLE','ODBCBINDCOLTOQUAD',
+ 'ODBCBINDCOLTONUMERIC','ODBCBINDCOLTOLONG','ODBCBINDCOLTOINTEGER','ODBCBINDCOLTODWORD','ODBCBINDCOLTODOUBLE','ODBCBINDCOLTODECIMAL','ODBCBINDCOLTODATE','ODBCBINDCOLTOCURRENCY',
+ 'ODBCBINDCOLTOBYTE','ODBCBINDCOLTOBIT','ODBCBINDCOLTOBINARY','ODBCBINDCOL','ODBCALLOCSTMT','ODBCALLOCHANDLE','ODBCALLOCENV','ODBCALLOCDESC',
+ 'ODBCALLOCDBC','ODBCALLOCCONNECT','ODBCADDRECORD','GLVIEWPORT','GLVERTEXPOINTER','GLVERTEX4SV','GLVERTEX4S','GLVERTEX4IV',
+ 'GLVERTEX4I','GLVERTEX4FV','GLVERTEX4F','GLVERTEX4DV','GLVERTEX4D','GLVERTEX3SV','GLVERTEX3S','GLVERTEX3IV',
+ 'GLVERTEX3I','GLVERTEX3FV','GLVERTEX3F','GLVERTEX3DV','GLVERTEX3D','GLVERTEX2SV','GLVERTEX2S','GLVERTEX2IV',
+ 'GLVERTEX2I','GLVERTEX2FV','GLVERTEX2F','GLVERTEX2DV','GLVERTEX2D','GLUUNPROJECT','GLUTESSVERTEX','GLUTESSPROPERTY',
+ 'GLUTESSNORMAL','GLUTESSENDPOLYGON','GLUTESSENDCONTOUR','GLUTESSCALLBACK','GLUTESSBEGINPOLYGON','GLUTESSBEGINCONTOUR','GLUSPHERE','GLUSCALEIMAGE',
+ 'GLUQUADRICTEXTURE','GLUQUADRICORIENTATION','GLUQUADRICNORMALS','GLUQUADRICDRAWSTYLE','GLUQUADRICCALLBACK','GLUPWLCURVE','GLUPROJECT','GLUPICKMATRIX',
+ 'GLUPERSPECTIVE','GLUPARTIALDISK','GLUORTHO2D','GLUNURBSSURFACE','GLUNURBSPROPERTY','GLUNURBSCURVE','GLUNURBSCALLBACK','GLUNEXTCONTOUR',
+ 'GLUNEWTESS','GLUNEWQUADRIC','GLUNEWNURBSRENDERER','GLULOOKAT','GLULOADSAMPLINGMATRICES','GLUGETTESSPROPERTY','GLUGETSTRING','GLUGETNURBSPROPERTY',
+ 'GLUERRORSTRING','GLUENDTRIM','GLUENDSURFACE','GLUENDPOLYGON','GLUENDCURVE','GLUDISK','GLUDELETETESS','GLUDELETEQUADRIC',
+ 'GLUDELETENURBSRENDERER','GLUCYLINDER','GLUBUILD2DMIPMAPS','GLUBUILD1DMIPMAPS','GLUBEGINTRIM','GLUBEGINSURFACE','GLUBEGINPOLYGON','GLUBEGINCURVE',
+ 'GLTRANSLATEF','GLTRANSLATED','GLTEXSUBIMAGE2D','GLTEXSUBIMAGE1D','GLTEXPARAMETERIV','GLTEXPARAMETERI','GLTEXPARAMETERFV','GLTEXPARAMETERF',
+ 'GLTEXIMAGE2D','GLTEXIMAGE1D','GLTEXGENIV','GLTEXGENI','GLTEXGENFV','GLTEXGENF','GLTEXGENDV','GLTEXGEND',
+ 'GLTEXENVIV','GLTEXENVI','GLTEXENVFV','GLTEXENVF','GLTEXCOORDPOINTER','GLTEXCOORD4SV','GLTEXCOORD4S','GLTEXCOORD4IV',
+ 'GLTEXCOORD4I','GLTEXCOORD4FV','GLTEXCOORD4F','GLTEXCOORD4DV','GLTEXCOORD4D','GLTEXCOORD3SV','GLTEXCOORD3S','GLTEXCOORD3IV',
+ 'GLTEXCOORD3I','GLTEXCOORD3FV','GLTEXCOORD3F','GLTEXCOORD3DV','GLTEXCOORD3D','GLTEXCOORD2SV','GLTEXCOORD2S','GLTEXCOORD2IV',
+ 'GLTEXCOORD2I','GLTEXCOORD2FV','GLTEXCOORD2F','GLTEXCOORD2DV','GLTEXCOORD2D','GLTEXCOORD1SV','GLTEXCOORD1S','GLTEXCOORD1IV',
+ 'GLTEXCOORD1I','GLTEXCOORD1FV','GLTEXCOORD1F','GLTEXCOORD1DV','GLTEXCOORD1D','GLSTENCILOP','GLSTENCILMASK','GLSTENCILFUNC',
+ 'GLSHADEMODEL','GLSELECTBUFFER','GLSCISSOR','GLSCALEF','GLSCALED','GLROTATEF','GLROTATED','GLRENDERMODE',
+ 'GLRECTSV','GLRECTS','GLRECTIV','GLRECTI','GLRECTFV','GLRECTF','GLRECTDV','GLRECTD',
+ 'GLREADPIXELS','GLREADBUFFER','GLRASTERPOS4SV','GLRASTERPOS4S','GLRASTERPOS4IV','GLRASTERPOS4I','GLRASTERPOS4FV','GLRASTERPOS4F',
+ 'GLRASTERPOS4DV','GLRASTERPOS4D','GLRASTERPOS3SV','GLRASTERPOS3S','GLRASTERPOS3IV','GLRASTERPOS3I','GLRASTERPOS3FV','GLRASTERPOS3F',
+ 'GLRASTERPOS3DV','GLRASTERPOS3D','GLRASTERPOS2SV','GLRASTERPOS2S','GLRASTERPOS2IV','GLRASTERPOS2I','GLRASTERPOS2FV','GLRASTERPOS2F',
+ 'GLRASTERPOS2DV','GLRASTERPOS2D','GLPUSHNAME','GLPUSHMATRIX','GLPUSHCLIENTATTRIB','GLPUSHATTRIB','GLPRIORITIZETEXTURES','GLPOPNAME',
+ 'GLPOPMATRIX','GLPOPCLIENTATTRIB','GLPOPATTRIB','GLPOLYGONSTIPPLE','GLPOLYGONOFFSET','GLPOLYGONMODE','GLPOINTSIZE','GLPIXELZOOM',
+ 'GLPIXELTRANSFERI','GLPIXELTRANSFERF','GLPIXELSTOREI','GLPIXELSTOREF','GLPIXELMAPUSV','GLPIXELMAPUIV','GLPIXELMAPFV','GLPASSTHROUGH',
+ 'GLORTHO','GLNORMALPOINTER','GLNORMAL3SV','GLNORMAL3S','GLNORMAL3IV','GLNORMAL3I','GLNORMAL3FV','GLNORMAL3F',
+ 'GLNORMAL3DV','GLNORMAL3D','GLNORMAL3BV','GLNORMAL3B','GLNEWLIST','GLMULTMATRIXF','GLMULTMATRIXD','GLMATRIXMODE',
+ 'GLMATERIALIV','GLMATERIALI','GLMATERIALFV','GLMATERIALF','GLMAPGRID2F','GLMAPGRID2D','GLMAPGRID1F','GLMAPGRID1D',
+ 'GLMAP2F','GLMAP2D','GLMAP1F','GLMAP1D','GLLOGICOP','GLLOADNAME','GLLOADMATRIXF','GLLOADMATRIXD',
+ 'GLLOADIDENTITY','GLLISTBASE','GLLINEWIDTH','GLLINESTIPPLE','GLLIGHTMODELIV','GLLIGHTMODELI','GLLIGHTMODELFV','GLLIGHTMODELF',
+ 'GLLIGHTIV','GLLIGHTI','GLLIGHTFV','GLLIGHTF','GLISTEXTURE','GLISLIST','GLISENABLED','GLINTERLEAVEDARRAYS',
+ 'GLINITNAMES','GLINDEXUBV','GLINDEXUB','GLINDEXSV','GLINDEXS','GLINDEXPOINTER','GLINDEXMASK','GLINDEXIV',
+ 'GLINDEXI','GLINDEXFV','GLINDEXF','GLINDEXDV','GLINDEXD','GLHINT','GLGETTEXPARAMETERIV','GLGETTEXPARAMETERFV',
+ 'GLGETTEXLEVELPARAMETERIV','GLGETTEXLEVELPARAMETERFV','GLGETTEXIMAGE','GLGETTEXGENIV','GLGETTEXGENFV','GLGETTEXGENDV','GLGETTEXENVIV','GLGETTEXENVFV',
+ 'GLGETSTRING','GLGETPOLYGONSTIPPLE','GLGETPOINTERV','GLGETPIXELMAPUSV','GLGETPIXELMAPUIV','GLGETPIXELMAPFV','GLGETMATERIALIV','GLGETMATERIALFV',
+ 'GLGETMAPIV','GLGETMAPFV','GLGETMAPDV','GLGETLIGHTIV','GLGETLIGHTFV','GLGETINTEGERV','GLGETFLOATV','GLGETERROR',
+ 'GLGETDOUBLEV','GLGETCLIPPLANE','GLGETBOOLEANV','GLGENTEXTURES','GLGENLISTS','GLFRUSTUM','GLFRONTFACE','GLFOGIV',
+ 'GLFOGI','GLFOGFV','GLFOGF','GLFLUSH','GLFINISH','GLFEEDBACKBUFFER','GLEVALPOINT2','GLEVALPOINT1',
+ 'GLEVALMESH2','GLEVALMESH1','GLEVALCOORD2FV','GLEVALCOORD2F','GLEVALCOORD2DV','GLEVALCOORD2D','GLEVALCOORD1FV','GLEVALCOORD1F',
+ 'GLEVALCOORD1DV','GLEVALCOORD1D','GLENDLIST','GLEND','GLENABLECLIENTSTATE','GLENABLE','GLEDGEFLAGV','GLEDGEFLAGPOINTER',
+ 'GLEDGEFLAG','GLDRAWPIXELS','GLDRAWELEMENTS','GLDRAWBUFFER','GLDRAWARRAYS','GLDISABLECLIENTSTATE','GLDISABLE','GLDEPTHRANGE',
+ 'GLDEPTHMASK','GLDEPTHFUNC','GLDELETETEXTURES','GLDELETELISTS','GLCULLFACE','GLCOPYTEXSUBIMAGE2D','GLCOPYTEXSUBIMAGE1D','GLCOPYTEXIMAGE2D',
+ 'GLCOPYTEXIMAGE1D','GLCOPYPIXELS','GLCOLORPOINTER','GLCOLORMATERIAL','GLCOLORMASK','GLCOLOR4USV','GLCOLOR4US','GLCOLOR4UIV',
+ 'GLCOLOR4UI','GLCOLOR4UBV','GLCOLOR4UB','GLCOLOR4SV','GLCOLOR4S','GLCOLOR4IV','GLCOLOR4I','GLCOLOR4FV',
+ 'GLCOLOR4F','GLCOLOR4DV','GLCOLOR4D','GLCOLOR4BV','GLCOLOR4B','GLCOLOR3USV','GLCOLOR3US','GLCOLOR3UIV',
+ 'GLCOLOR3UI','GLCOLOR3UBV','GLCOLOR3UB','GLCOLOR3SV','GLCOLOR3S','GLCOLOR3IV','GLCOLOR3I','GLCOLOR3FV',
+ 'GLCOLOR3F','GLCOLOR3DV','GLCOLOR3D','GLCOLOR3BV','GLCOLOR3B','GLCLIPPLANE','GLCLEARSTENCIL','GLCLEARINDEX',
+ 'GLCLEARDEPTH','GLCLEARCOLOR','GLCLEARACCUM','GLCLEAR','GLCALLLISTS','GLCALLLIST','GLBLENDFUNC','GLBITMAP',
+ 'GLBINDTEXTURE','GLBEGIN','GLARRAYELEMENT','GLARETEXTURESRESIDENT','GLALPHAFUNC','GLACCUM'),
+ 2 => array(
+ '$BEL','$BS','$CR','$CRLF','$DQ','$DT_DATE_SEPARATOR','$DT_LANGUAGE','$DT_TIME_SEPARATOR',
+ '$ESC','$FF','$LF','$NUL','$PC_SD_MY_PC','$SPC','$SQL_OPT_TRACE_FILE_DEFAULT','$SQL_SPEC_STRING',
+ '$TAB','$TRACKBAR_CLASS','$VT','%ACM_OPEN','%ACM_OPENW','%ACM_PLAY','%ACM_STOP','%ACN_START',
+ '%ACN_STOP','%ACS_AUTOPLAY','%ACS_CENTER','%ACS_TIMER','%ACS_TRANSPARENT','%APP_COUNTER_FUNLOOKUP','%APP_COUNTER_KEYLOOKUP','%APP_COUNTER_LOOKUP',
+ '%APP_COUNTER_TESTALPHA','%APP_COUNTER_UDTLOOKUP','%APP_COUNTER_VARLOOKUP','%APP_TIMER_EXECTOTAL','%APP_TIMER_INIT','%APP_TIMER_LOAD','%APP_TIMER_PREPROCESSOR','%AW_ACTIVATE',
+ '%AW_BLEND','%AW_CENTER','%AW_HIDE','%AW_HOR_NEGATIVE','%AW_HOR_POSITIVE','%AW_SLIDE','%AW_VER_NEGATIVE','%AW_VER_POSITIVE',
+ '%BCM_FIRST','%BLACK','%BLUE','%BM_GETCHECK','%BM_SETCHECK','%BST_CHECKED','%BST_UNCHECKED','%BS_AUTOCHECKBOX',
+ '%BS_BOTTOM','%BS_CENTER','%BS_DEFAULT','%BS_DEFPUSHBUTTON','%BS_FLAT','%BS_LEFT','%BS_LEFTTEXT','%BS_MULTILINE',
+ '%BS_NOTIFY','%BS_OWNERDRAW','%BS_PUSHLIKE','%BS_RIGHT','%BS_TOP','%BS_VCENTER','%BUNDLE_BUILDER_CANCELLED','%CBM_FIRST',
+ '%CBN_CLOSEUP','%CBN_DBLCLK','%CBN_DROPDOWN','%CBN_EDITCHANGE','%CBN_EDITUPDATE','%CBN_ERRSPACE','%CBN_KILLFOCUS','%CBN_SELCANCEL',
+ '%CBN_SELCHANGE','%CBN_SELENDCANCEL','%CBN_SELENDOK','%CBN_SETFOCUS','%CBS_AUTOHSCROLL','%CBS_DISABLENOSCROLL','%CBS_DROPDOWN','%CBS_DROPDOWNLIST',
+ '%CBS_HASSTRINGS','%CBS_LOWERCASE','%CBS_NOINTEGRALHEIGHT','%CBS_SIMPLE','%CBS_SORT','%CBS_UPPERCASE','%CB_SELECTSTRING','%CCM_FIRST',
+ '%CC_ANYCOLOR','%CC_ENABLEHOOK','%CC_ENABLETEMPLATE','%CC_ENABLETEMPLATEHANDLE','%CC_FULLOPEN','%CC_PREVENTFULLOPEN','%CC_RGBINIT','%CC_SHOWHELP',
+ '%CC_SOLIDCOLOR','%CFE_BOLD','%CFE_ITALIC','%CFE_LINK','%CFE_PROTECTED','%CFE_STRIKEOUT','%CFE_UNDERLINE','%CFM_ANIMATION',
+ '%CFM_BACKCOLOR','%CFM_BOLD','%CFM_CHARSET','%CFM_COLOR','%CFM_FACE','%CFM_ITALIC','%CFM_KERNING','%CFM_LCID',
+ '%CFM_LINK','%CFM_OFFSET','%CFM_PROTECTED','%CFM_REVAUTHOR','%CFM_SIZE','%CFM_SPACING','%CFM_STRIKEOUT','%CFM_STYLE',
+ '%CFM_UNDERLINE','%CFM_UNDERLINETYPE','%CFM_WEIGHT','%CGI_ACCEPT_FILE_UPLOAD','%CGI_AUTO_ADD_SPECIAL_CHARS_PREFIX','%CGI_AUTO_CREATE_VARS','%CGI_BUFFERIZE_OUTPUT','%CGI_DOUBLE_QUOTE',
+ '%CGI_FILE_UPLOAD_BASEPATH','%CGI_FORCE_SESSION_VALIDATION','%CGI_MAX_BYTE_FROM_STD_IN','%CGI_REQUEST_METHOD_GET','%CGI_REQUEST_METHOD_POST','%CGI_SESSION_FILE_BASEPATH','%CGI_SINGLE_QUOTE','%CGI_SPECIAL_CHARS_PREFIX',
+ '%CGI_TEMPORARY_UPLOAD_PATH','%CGI_UPLOAD_CAN_OVERWRITE','%CGI_WRITE_LOG_FILE','%CGI_WRITE_VARS_INTO_LOG_FILE','%CONOLE_ATTACH_PARENT_PROCESS','%CONSOLE_BACKGROUND_BLUE','%CONSOLE_BACKGROUND_GREEN','%CONSOLE_BACKGROUND_INTENSITY',
+ '%CONSOLE_BACKGROUND_RED','%CONSOLE_BOX_FLAG_3DOFF','%CONSOLE_BOX_FLAG_3DON','%CONSOLE_BOX_FLAG_SHADOW','%CONSOLE_COMMON_LVB_GRID_HORIZONTAL','%CONSOLE_COMMON_LVB_GRID_LVERTICAL','%CONSOLE_COMMON_LVB_GRID_RVERTICAL','%CONSOLE_COMMON_LVB_LEADING_BYTE',
+ '%CONSOLE_COMMON_LVB_REVERSE_VIDEO','%CONSOLE_COMMON_LVB_TRAILING_BYTE','%CONSOLE_COMMON_LVB_UNDERSCORE','%CONSOLE_CTRL_BREAK_EVENT','%CONSOLE_CTRL_C_EVENT','%CONSOLE_DOUBLE_CLICK','%CONSOLE_ENABLE_AUTO_POSITION','%CONSOLE_ENABLE_ECHO_INPUT',
+ '%CONSOLE_ENABLE_EXTENDED_FLAGS','%CONSOLE_ENABLE_INSERT_MODE','%CONSOLE_ENABLE_LINE_INPUT','%CONSOLE_ENABLE_MOUSE_INPUT','%CONSOLE_ENABLE_PROCESSED_INPUT','%CONSOLE_ENABLE_PROCESSED_OUTPUT','%CONSOLE_ENABLE_QUICK_EDIT_MODE','%CONSOLE_ENABLE_WINDOW_INPUT',
+ '%CONSOLE_ENABLE_WRAP_AT_EOL_OUTPUT','%CONSOLE_FOREGROUND_BLUE','%CONSOLE_FOREGROUND_GREEN','%CONSOLE_FOREGROUND_INTENSITY','%CONSOLE_FOREGROUND_RED','%CONSOLE_LBUTTON','%CONSOLE_LINE_HORIZONTAL','%CONSOLE_LINE_VERTICAL',
+ '%CONSOLE_MBUTTON','%CONSOLE_MOUSE_MOVED','%CONSOLE_MOUSE_WHEELED','%CONSOLE_RBUTTON','%CONSOLE_SCROLLBUF_DOWN','%CONSOLE_SCROLLBUF_UP','%CONSOLE_SCROLLWND_ABSOLUTE','%CONSOLE_SCROLLWND_RELATIVE',
+ '%CONSOLE_STD_ERROR_HANDLE','%CONSOLE_STD_INPUT_HANDLE','%CONSOLE_STD_OUTPUT_HANDLE','%CONSOLE_SW_FORCEMINIMIZE','%CONSOLE_SW_HIDE','%CONSOLE_SW_MAXIMIZE','%CONSOLE_SW_MINIMIZE','%CONSOLE_SW_RESTORE',
+ '%CONSOLE_SW_SHOW','%CONSOLE_SW_SHOWDEFAULT','%CONSOLE_SW_SHOWMAXIMIZED','%CONSOLE_SW_SHOWMINIMIZED','%CONSOLE_SW_SHOWMINNOACTIVE','%CONSOLE_SW_SHOWNA','%CONSOLE_SW_SHOWNOACTIVATE','%CONSOLE_SW_SHOWNORMAL',
+ '%CONSOLE_UNAVAILABLE','%CRYPTO_CALG_DES','%CRYPTO_CALG_RC2','%CRYPTO_CALG_RC4','%CRYPTO_PROV_DH_SCHANNEL','%CRYPTO_PROV_DSS','%CRYPTO_PROV_DSS_DH','%CRYPTO_PROV_FORTEZZA',
+ '%CRYPTO_PROV_MS_EXCHANGE','%CRYPTO_PROV_RSA_FULL','%CRYPTO_PROV_RSA_SCHANNEL','%CRYPTO_PROV_RSA_SIG','%CRYPTO_PROV_SSL','%CSIDL_ADMINTOOLS','%CSIDL_ALTSTARTUP','%CSIDL_APPDATA',
+ '%CSIDL_BITBUCKET','%CSIDL_CDBURN_AREA','%CSIDL_COMMON_ADMINTOOLS','%CSIDL_COMMON_ALTSTARTUP','%CSIDL_COMMON_APPDATA','%CSIDL_COMMON_DESKTOPDIRECTORY','%CSIDL_COMMON_DOCUMENTS','%CSIDL_COMMON_FAVORITES',
+ '%CSIDL_COMMON_MUSIC','%CSIDL_COMMON_PICTURES','%CSIDL_COMMON_PROGRAMS','%CSIDL_COMMON_STARTMENU','%CSIDL_COMMON_STARTUP','%CSIDL_COMMON_TEMPLATES','%CSIDL_COMMON_VIDEO','%CSIDL_CONTROLS',
+ '%CSIDL_COOKIES','%CSIDL_DESKTOP','%CSIDL_DESKTOPDIRECTORY','%CSIDL_DRIVES','%CSIDL_FAVORITES','%CSIDL_FLAG_CREATE','%CSIDL_FONTS','%CSIDL_HISTORY',
+ '%CSIDL_INTERNET','%CSIDL_INTERNET_CACHE','%CSIDL_LOCAL_APPDATA','%CSIDL_MYDOCUMENTS','%CSIDL_MYMUSIC','%CSIDL_MYPICTURES','%CSIDL_MYVIDEO','%CSIDL_NETHOOD',
+ '%CSIDL_NETWORK','%CSIDL_PERSONAL','%CSIDL_PRINTERS','%CSIDL_PRINTHOOD','%CSIDL_PROFILE','%CSIDL_PROGRAMS','%CSIDL_PROGRAM_FILES','%CSIDL_PROGRAM_FILES_COMMON',
+ '%CSIDL_RECENT','%CSIDL_SENDTO','%CSIDL_STARTMENU','%CSIDL_STARTUP','%CSIDL_SYSTEM','%CSIDL_TEMPLATES','%CSIDL_WINDOWS','%CW_USEDEFAULT',
+ '%CYAN','%DATE_TIME_FILE_CREATION','%DATE_TIME_LAST_FILE_ACCESS','%DATE_TIME_LAST_FILE_WRITE','%DICTIONARY_MEMINFO_DATA','%DICTIONARY_MEMINFO_KEYS','%DICTIONARY_MEMINFO_TOTAL','%DICTIONARY_SORTDESCENDING',
+ '%DICTIONARY_SORTKEYS','%DSCAPS_CERTIFIED','%DSCAPS_CONTINUOUSRATE','%DSCAPS_EMULDRIVER','%DSCAPS_SECONDARY16BIT','%DSCAPS_SECONDARY8BIT','%DSCAPS_SECONDARYMONO','%DSCAPS_SECONDARYSTEREO',
+ '%DSCCAPS_CERTIFIED','%DSCCAPS_EMULDRIVER','%DS_3DLOOK','%DS_ABSALIGN','%DS_CENTER','%DS_CENTERMOUSE','%DS_CONTEXTHELP','%DS_CONTROL',
+ '%DS_MODALFRAME','%DS_NOFAILCREATE','%DS_SETFONT','%DS_SETFOREGROUND','%DS_SYSMODAL','%DTM_FIRST','%DTM_GETMCCOLOR','%DTM_GETMCFONT',
+ '%DTM_GETMONTHCAL','%DTM_GETRANGE','%DTM_GETSYSTEMTIME','%DTM_SETFORMAT','%DTM_SETFORMATW','%DTM_SETMCCOLOR','%DTM_SETMCFONT','%DTM_SETRANGE',
+ '%DTM_SETSYSTEMTIME','%DTN_CLOSEUP','%DTN_DATETIMECHANGE','%DTN_DROPDOWN','%DTN_FORMAT','%DTN_FORMATQUERY','%DTN_FORMATQUERYW','%DTN_FORMATW',
+ '%DTN_USERSTRING','%DTN_USERSTRINGW','%DTN_WMKEYDOWN','%DTN_WMKEYDOWNW','%DTS_APPCANPARSE','%DTS_LONGDATEFORMAT','%DTS_RIGHTALIGN','%DTS_SHORTDATECENTURYFORMAT',
+ '%DTS_SHORTDATEFORMAT','%DTS_SHOWNONE','%DTS_TIMEFORMAT','%DTS_UPDOWN','%DT_DATE_CENTURY','%DT_DATE_OK','%DT_DAY_IN_YEAR','%DT_DIFF_IN_DAYS',
+ '%DT_DIFF_IN_HOURS','%DT_DIFF_IN_MINUTES','%DT_DIFF_IN_SECONDS','%DT_HOURS_IN_DAY','%DT_MINUTES_IN_HOUR','%DT_SECONDS_IN_DAY','%DT_SECONDS_IN_HOUR','%DT_SECONDS_IN_MINUTE',
+ '%DT_SECONDS_IN_YEAR','%DT_USE_LONG_FORM','%DT_USE_SHORT_FORM','%DT_WRONG_DATE','%DT_WRONG_DAY','%DT_WRONG_MONTH','%ECM_FIRST','%ECOOP_AND',
+ '%ECOOP_OR','%ECOOP_SET','%ECOOP_XOR','%ECO_AUTOHSCROLL','%ECO_AUTOVSCROLL','%ECO_AUTOWORDSELECTION','%ECO_NOHIDESEL','%ECO_READONLY',
+ '%ECO_SELECTIONBAR','%ECO_WANTRETURN','%EM_AUTOURLDETECT','%EM_CANPASTE','%EM_CANREDO','%EM_CANUNDO','%EM_CHARFROMPOS','%EM_DISPLAYBAND',
+ '%EM_EMPTYUNDOBUFFER','%EM_EXGETSEL','%EM_EXLIMITTEXT','%EM_EXLINEFROMCHAR','%EM_EXSETSEL','%EM_FINDTEXT','%EM_FINDTEXTEX','%EM_FINDWORDBREAK',
+ '%EM_FMTLINES','%EM_FORMATRANGE','%EM_GETAUTOURLDETECT','%EM_GETCHARFORMAT','%EM_GETEDITSTYLE','%EM_GETEVENTMASK','%EM_GETFIRSTVISIBLELINE','%EM_GETHANDLE',
+ '%EM_GETIMESTATUS','%EM_GETLIMITTEXT','%EM_GETLINE','%EM_GETLINECOUNT','%EM_GETMARGINS','%EM_GETMODIFY','%EM_GETOLEINTERFACE','%EM_GETOPTIONS',
+ '%EM_GETPARAFORMAT','%EM_GETPASSWORDCHAR','%EM_GETRECT','%EM_GETREDONAME','%EM_GETSCROLLPOS','%EM_GETSEL','%EM_GETSELTEXT','%EM_GETTEXTMODE',
+ '%EM_GETTEXTRANGE','%EM_GETTHUMB','%EM_GETUNDONAME','%EM_GETWORDBREAKPROC','%EM_GETWORDBREAKPROCEX','%EM_HIDESELECTION','%EM_LIMITTEXT','%EM_LINEFROMCHAR',
+ '%EM_LINEINDEX','%EM_LINELENGTH','%EM_LINESCROLL','%EM_PASTESPECIAL','%EM_POSFROMCHAR','%EM_REDO','%EM_REPLACESEL','%EM_REQUESTRESIZE',
+ '%EM_SCROLL','%EM_SCROLLCARET','%EM_SELECTIONTYPE','%EM_SETBKGNDCOLOR','%EM_SETCHARFORMAT','%EM_SETEDITSTYLE','%EM_SETEVENTMASK','%EM_SETHANDLE',
+ '%EM_SETIMESTATUS','%EM_SETLIMITTEXT','%EM_SETMARGINS','%EM_SETMODIFY','%EM_SETOLECALLBACK','%EM_SETOPTIONS','%EM_SETPARAFORMAT','%EM_SETPASSWORDCHAR',
+ '%EM_SETREADONLY','%EM_SETRECT','%EM_SETRECTNP','%EM_SETSCROLLPOS','%EM_SETSEL','%EM_SETTABSTOPS','%EM_SETTARGETDEVICE','%EM_SETTEXTMODE',
+ '%EM_SETUNDOLIMIT','%EM_SETWORDBREAKPROC','%EM_SETWORDBREAKPROCEX','%EM_SETWORDWRAPMODE','%EM_SETZOOM','%EM_STOPGROUPTYPING','%EM_STREAMIN','%EM_STREAMOUT',
+ '%EM_UNDO','%ENM_CHANGE','%ENM_CORRECTTEXT','%ENM_DRAGDROPDONE','%ENM_DROPFILES','%ENM_KEYEVENTS','%ENM_MOUSEEVENTS','%ENM_NONE',
+ '%ENM_PARAGRAPHEXPANDED','%ENM_PROTECTED','%ENM_REQUESTRESIZE','%ENM_SCROLL','%ENM_SCROLLEVENTS','%ENM_SELCHANGE','%ENM_UPDATE','%EN_CHANGE',
+ '%EN_MSGFILTER','%EN_SELCHANGE','%EN_UPDATE','%ES_AUTOHSCROLL','%ES_AUTOVSCROLL','%ES_CENTER','%ES_DISABLENOSCROLL','%ES_EX_NOCALLOLEINIT',
+ '%ES_LEFT','%ES_LOWERCASE','%ES_MULTILINE','%ES_NOHIDESEL','%ES_NOOLEDRAGDROP','%ES_NUMBER','%ES_OEMCONVERT','%ES_PASSWORD',
+ '%ES_READONLY','%ES_RIGHT','%ES_SAVESEL','%ES_SELECTIONBAR','%ES_SUNKEN','%ES_UPPERCASE','%ES_WANTRETURN','%EVAL_EXEC_STRING',
+ '%FALSE','%FILE_ADDPATH','%FILE_ARCHIVE','%FILE_BUILDVERSION','%FILE_HIDDEN','%FILE_MAJORVERSION','%FILE_MINORVERSION','%FILE_NORMAL',
+ '%FILE_READONLY','%FILE_REVISIONVERSION','%FILE_SUBDIR','%FILE_SYSTEM','%FILE_VLABEL','%FTP_GET_CONNECT_STATUS','%FTP_GET_FILE_BYTES_RCVD','%FTP_GET_FILE_BYTES_SENT',
+ '%FTP_GET_LAST_RESPONSE','%FTP_GET_LOCAL_IP','%FTP_GET_SERVER_IP','%FTP_GET_TOTAL_BYTES_RCVD','%FTP_GET_TOTAL_BYTES_SENT','%FTP_LIST_FULLLIST','%FTP_LIST_FULLLISTDIR','%FTP_LIST_FULLLISTFILE',
+ '%FTP_SET_ASYNC','%FTP_SET_CONNECT_WAIT','%FTP_SET_MAX_LISTEN_WAIT','%FTP_SET_MAX_RESPONSE_WAIT','%FTP_SET_PASSIVE','%FTP_SET_SYNC','%FW_BLACK','%FW_BOLD',
+ '%FW_DEMIBOLD','%FW_DONTCARE','%FW_EXTRABOLD','%FW_EXTRALIGHT','%FW_HEAVY','%FW_LIGHT','%FW_MEDIUM','%FW_NORMAL',
+ '%FW_REGULAR','%FW_SEMIBOLD','%FW_THIN','%FW_ULTRABOLD','%FW_ULTRALIGHT','%GDTR_MAX','%GDTR_MIN','%GLU_AUTO_LOAD_MATRIX',
+ '%GLU_BEGIN','%GLU_CCW','%GLU_CULLING','%GLU_CW','%GLU_DISPLAY_MODE','%GLU_DOMAIN_DISTANCE','%GLU_EDGE_FLAG','%GLU_END',
+ '%GLU_ERROR','%GLU_EXTENSIONS','%GLU_EXTERIOR','%GLU_FALSE','%GLU_FILL','%GLU_FLAT','%GLU_INCOMPATIBLE_GL_VERSION','%GLU_INSIDE',
+ '%GLU_INTERIOR','%GLU_INVALID_ENUM','%GLU_INVALID_VALUE','%GLU_LINE','%GLU_MAP1_TRIM_2','%GLU_MAP1_TRIM_3','%GLU_NONE','%GLU_NURBS_ERROR1',
+ '%GLU_NURBS_ERROR10','%GLU_NURBS_ERROR11','%GLU_NURBS_ERROR12','%GLU_NURBS_ERROR13','%GLU_NURBS_ERROR14','%GLU_NURBS_ERROR15','%GLU_NURBS_ERROR16','%GLU_NURBS_ERROR17',
+ '%GLU_NURBS_ERROR18','%GLU_NURBS_ERROR19','%GLU_NURBS_ERROR2','%GLU_NURBS_ERROR20','%GLU_NURBS_ERROR21','%GLU_NURBS_ERROR22','%GLU_NURBS_ERROR23','%GLU_NURBS_ERROR24',
+ '%GLU_NURBS_ERROR25','%GLU_NURBS_ERROR26','%GLU_NURBS_ERROR27','%GLU_NURBS_ERROR28','%GLU_NURBS_ERROR29','%GLU_NURBS_ERROR3','%GLU_NURBS_ERROR30','%GLU_NURBS_ERROR31',
+ '%GLU_NURBS_ERROR32','%GLU_NURBS_ERROR33','%GLU_NURBS_ERROR34','%GLU_NURBS_ERROR35','%GLU_NURBS_ERROR36','%GLU_NURBS_ERROR37','%GLU_NURBS_ERROR4','%GLU_NURBS_ERROR5',
+ '%GLU_NURBS_ERROR6','%GLU_NURBS_ERROR7','%GLU_NURBS_ERROR8','%GLU_NURBS_ERROR9','%GLU_OUTLINE_PATCH','%GLU_OUTLINE_POLYGON','%GLU_OUTSIDE','%GLU_OUT_OF_MEMORY',
+ '%GLU_PARAMETRIC_ERROR','%GLU_PARAMETRIC_TOLERANCE','%GLU_PATH_LENGTH','%GLU_POINT','%GLU_SAMPLING_METHOD','%GLU_SAMPLING_TOLERANCE','%GLU_SILHOUETTE','%GLU_SMOOTH',
+ '%GLU_TESS_BEGIN','%GLU_TESS_BEGIN_DATA','%GLU_TESS_BOUNDARY_ONLY','%GLU_TESS_COMBINE','%GLU_TESS_COMBINE_DATA','%GLU_TESS_COORD_TOO_LARGE','%GLU_TESS_EDGE_FLAG','%GLU_TESS_EDGE_FLAG_DATA',
+ '%GLU_TESS_END','%GLU_TESS_END_DATA','%GLU_TESS_ERROR','%GLU_TESS_ERROR1','%GLU_TESS_ERROR2','%GLU_TESS_ERROR3','%GLU_TESS_ERROR4','%GLU_TESS_ERROR5',
+ '%GLU_TESS_ERROR6','%GLU_TESS_ERROR7','%GLU_TESS_ERROR8','%GLU_TESS_ERROR_DATA','%GLU_TESS_MISSING_BEGIN_CONTOUR','%GLU_TESS_MISSING_BEGIN_POLYGON','%GLU_TESS_MISSING_END_CONTOUR','%GLU_TESS_MISSING_END_POLYGON',
+ '%GLU_TESS_NEED_COMBINE_CALLBACK','%GLU_TESS_TOLERANCE','%GLU_TESS_VERTEX','%GLU_TESS_VERTEX_DATA','%GLU_TESS_WINDING_ABS_GEQ_TWO','%GLU_TESS_WINDING_NEGATIVE','%GLU_TESS_WINDING_NONZERO','%GLU_TESS_WINDING_ODD',
+ '%GLU_TESS_WINDING_POSITIVE','%GLU_TESS_WINDING_RULE','%GLU_TRUE','%GLU_UNKNOWN','%GLU_U_STEP','%GLU_VERSION','%GLU_VERSION_1_1','%GLU_VERSION_1_2',
+ '%GLU_VERTEX','%GLU_V_STEP','%GL_2D','%GL_2_BYTES','%GL_3D','%GL_3D_COLOR','%GL_3D_COLOR_TEXTURE','%GL_3_BYTES',
+ '%GL_4D_COLOR_TEXTURE','%GL_4_BYTES','%GL_ABGR_EXT','%GL_ACCUM','%GL_ACCUM_ALPHA_BITS','%GL_ACCUM_BLUE_BITS','%GL_ACCUM_BUFFER_BIT','%GL_ACCUM_CLEAR_VALUE',
+ '%GL_ACCUM_GREEN_BITS','%GL_ACCUM_RED_BITS','%GL_ADD','%GL_ALL_ATTRIB_BITS','%GL_ALPHA','%GL_ALPHA12','%GL_ALPHA16','%GL_ALPHA4',
+ '%GL_ALPHA8','%GL_ALPHA_BIAS','%GL_ALPHA_BITS','%GL_ALPHA_SCALE','%GL_ALPHA_TEST','%GL_ALPHA_TEST_FUNC','%GL_ALPHA_TEST_REF','%GL_ALWAYS',
+ '%GL_AMBIENT','%GL_AMBIENT_AND_DIFFUSE','%GL_AND','%GL_AND_INVERTED','%GL_AND_REVERSE','%GL_ARRAY_ELEMENT_LOCK_COUNT_EXT','%GL_ARRAY_ELEMENT_LOCK_FIRST_EXT','%GL_ATTRIB_STACK_DEPTH',
+ '%GL_AUTO_NORMAL','%GL_AUX0','%GL_AUX1','%GL_AUX2','%GL_AUX3','%GL_AUX_BUFFERS','%GL_BACK','%GL_BACK_LEFT',
+ '%GL_BACK_RIGHT','%GL_BGRA_EXT','%GL_BGR_EXT','%GL_BITMAP','%GL_BITMAP_TOKEN','%GL_BLEND','%GL_BLEND_COLOR_EXT','%GL_BLEND_DST',
+ '%GL_BLEND_EQUATION_EXT','%GL_BLEND_SRC','%GL_BLUE','%GL_BLUE_BIAS','%GL_BLUE_BITS','%GL_BLUE_SCALE','%GL_BYTE','%GL_C3F_V3F',
+ '%GL_C4F_N3F_V3F','%GL_C4UB_V2F','%GL_C4UB_V3F','%GL_CCW','%GL_CLAMP','%GL_CLEAR','%GL_CLIENT_ALL_ATTRIB_BITS','%GL_CLIENT_ATTRIB_STACK_DEPTH',
+ '%GL_CLIENT_PIXEL_STORE_BIT','%GL_CLIENT_VERTEX_ARRAY_BIT','%GL_CLIP_PLANE0','%GL_CLIP_PLANE1','%GL_CLIP_PLANE2','%GL_CLIP_PLANE3','%GL_CLIP_PLANE4','%GL_CLIP_PLANE5',
+ '%GL_CLIP_VOLUME_CLIPPING_HINT_EXT','%GL_COEFF','%GL_COLOR','%GL_COLOR_ARRAY','%GL_COLOR_ARRAY_COUNT_EXT','%GL_COLOR_ARRAY_EXT','%GL_COLOR_ARRAY_POINTER','%GL_COLOR_ARRAY_POINTER_EXT',
+ '%GL_COLOR_ARRAY_SIZE','%GL_COLOR_ARRAY_SIZE_EXT','%GL_COLOR_ARRAY_STRIDE','%GL_COLOR_ARRAY_STRIDE_EXT','%GL_COLOR_ARRAY_TYPE','%GL_COLOR_ARRAY_TYPE_EXT','%GL_COLOR_BUFFER_BIT','%GL_COLOR_CLEAR_VALUE',
+ '%GL_COLOR_INDEX','%GL_COLOR_INDEX12_EXT','%GL_COLOR_INDEX16_EXT','%GL_COLOR_INDEX1_EXT','%GL_COLOR_INDEX2_EXT','%GL_COLOR_INDEX4_EXT','%GL_COLOR_INDEX8_EXT','%GL_COLOR_INDEXES',
+ '%GL_COLOR_LOGIC_OP','%GL_COLOR_MATERIAL','%GL_COLOR_MATERIAL_FACE','%GL_COLOR_MATERIAL_PARAMETER','%GL_COLOR_SUM_EXT','%GL_COLOR_TABLE_ALPHA_SIZE_EXT','%GL_COLOR_TABLE_BIAS_EXT','%GL_COLOR_TABLE_BLUE_SIZE_EXT',
+ '%GL_COLOR_TABLE_EXT','%GL_COLOR_TABLE_FORMAT_EXT','%GL_COLOR_TABLE_GREEN_SIZE_EXT','%GL_COLOR_TABLE_INTENSITY_SIZE_EXT','%GL_COLOR_TABLE_LUMINANCE_SIZE_EXT','%GL_COLOR_TABLE_RED_SIZE_EXT','%GL_COLOR_TABLE_SCALE_EXT','%GL_COLOR_TABLE_WIDTH_EXT',
+ '%GL_COLOR_WRITEMASK','%GL_COMPILE','%GL_COMPILE_AND_EXECUTE','%GL_CONSTANT_ALPHA_EXT','%GL_CONSTANT_ATTENUATION','%GL_CONSTANT_COLOR_EXT','%GL_CONVOLUTION_1D_EXT','%GL_CONVOLUTION_2D_EXT',
+ '%GL_CONVOLUTION_BORDER_MODE_EXT','%GL_CONVOLUTION_FILTER_BIAS_EXT','%GL_CONVOLUTION_FILTER_SCALE_EXT','%GL_CONVOLUTION_FORMAT_EXT','%GL_CONVOLUTION_HEIGHT_EXT','%GL_CONVOLUTION_WIDTH_EXT','%GL_COPY','%GL_COPY_INVERTED',
+ '%GL_COPY_PIXEL_TOKEN','%GL_CULL_FACE','%GL_CULL_FACE_MODE','%GL_CULL_VERTEX_EXT','%GL_CULL_VERTEX_EYE_POSITION_EXT','%GL_CULL_VERTEX_OBJECT_POSITION_EXT','%GL_CURRENT_BIT','%GL_CURRENT_COLOR',
+ '%GL_CURRENT_INDEX','%GL_CURRENT_NORMAL','%GL_CURRENT_RASTER_COLOR','%GL_CURRENT_RASTER_DISTANCE','%GL_CURRENT_RASTER_INDEX','%GL_CURRENT_RASTER_POSITION','%GL_CURRENT_RASTER_POSITION_VALID','%GL_CURRENT_RASTER_TEXTURE_COORDS',
+ '%GL_CURRENT_SECONDARY_COLOR_EXT','%GL_CURRENT_TEXTURE_COORDS','%GL_CW','%GL_DECAL','%GL_DECR','%GL_DEPTH','%GL_DEPTH_BIAS','%GL_DEPTH_BITS',
+ '%GL_DEPTH_BUFFER_BIT','%GL_DEPTH_CLEAR_VALUE','%GL_DEPTH_COMPONENT','%GL_DEPTH_FUNC','%GL_DEPTH_RANGE','%GL_DEPTH_SCALE','%GL_DEPTH_TEST','%GL_DEPTH_WRITEMASK',
+ '%GL_DIFFUSE','%GL_DITHER','%GL_DOMAIN','%GL_DONT_CARE','%GL_DOUBLE','%GL_DOUBLEBUFFER','%GL_DOUBLE_EXT','%GL_DRAW_BUFFER',
+ '%GL_DRAW_PIXEL_TOKEN','%GL_DST_ALPHA','%GL_DST_COLOR','%GL_EDGE_FLAG','%GL_EDGE_FLAG_ARRAY','%GL_EDGE_FLAG_ARRAY_COUNT_EXT','%GL_EDGE_FLAG_ARRAY_EXT','%GL_EDGE_FLAG_ARRAY_POINTER',
+ '%GL_EDGE_FLAG_ARRAY_POINTER_EXT','%GL_EDGE_FLAG_ARRAY_STRIDE','%GL_EDGE_FLAG_ARRAY_STRIDE_EXT','%GL_EMISSION','%GL_ENABLE_BIT','%GL_EQUAL','%GL_EQUIV','%GL_EVAL_BIT',
+ '%GL_EXP','%GL_EXP2','%GL_EXTENSIONS','%GL_EXT_ABGR','%GL_EXT_BGRA','%GL_EXT_BLEND_COLOR','%GL_EXT_BLEND_MINMAX','%GL_EXT_BLEND_SUBTRACT',
+ '%GL_EXT_CLIP_VOLUME_HINT','%GL_EXT_COLOR_TABLE','%GL_EXT_COMPILED_VERTEX_ARRAY','%GL_EXT_CONVOLUTION','%GL_EXT_CULL_VERTEX','%GL_EXT_HISTOGRAM','%GL_EXT_PACKED_PIXELS','%GL_EXT_PALETTED_TEXTURE',
+ '%GL_EXT_POLYGON_OFFSET','%GL_EXT_SECONDARY_COLOR','%GL_EXT_SEPARATE_SPECULAR_COLOR','%GL_EXT_VERTEX_ARRAY','%GL_EYE_LINEAR','%GL_EYE_PLANE','%GL_FALSE','%GL_FASTEST',
+ '%GL_FEEDBACK','%GL_FEEDBACK_BUFFER_POINTER','%GL_FEEDBACK_BUFFER_SIZE','%GL_FEEDBACK_BUFFER_TYPE','%GL_FILL','%GL_FLAT','%GL_FLOAT','%GL_FOG',
+ '%GL_FOG_BIT','%GL_FOG_COLOR','%GL_FOG_DENSITY','%GL_FOG_END','%GL_FOG_HINT','%GL_FOG_INDEX','%GL_FOG_MODE','%GL_FOG_START',
+ '%GL_FRONT','%GL_FRONT_AND_BACK','%GL_FRONT_FACE','%GL_FRONT_LEFT','%GL_FRONT_RIGHT','%GL_FUNC_ADD_EXT','%GL_FUNC_REVERSE_SUBTRACT_EXT','%GL_FUNC_SUBTRACT_EXT',
+ '%GL_GEQUAL','%GL_GREATER','%GL_GREEN','%GL_GREEN_BIAS','%GL_GREEN_BITS','%GL_GREEN_SCALE','%GL_HINT_BIT','%GL_HISTOGRAM_ALPHA_SIZE_EXT',
+ '%GL_HISTOGRAM_BLUE_SIZE_EXT','%GL_HISTOGRAM_EXT','%GL_HISTOGRAM_FORMAT_EXT','%GL_HISTOGRAM_GREEN_SIZE_EXT','%GL_HISTOGRAM_LUMINANCE_SIZE_EXT','%GL_HISTOGRAM_RED_SIZE_EXT','%GL_HISTOGRAM_SINK_EXT','%GL_HISTOGRAM_WIDTH_EXT',
+ '%GL_INCR','%GL_INDEX_ARRAY','%GL_INDEX_ARRAY_COUNT_EXT','%GL_INDEX_ARRAY_EXT','%GL_INDEX_ARRAY_POINTER','%GL_INDEX_ARRAY_POINTER_EXT','%GL_INDEX_ARRAY_STRIDE','%GL_INDEX_ARRAY_STRIDE_EXT',
+ '%GL_INDEX_ARRAY_TYPE','%GL_INDEX_ARRAY_TYPE_EXT','%GL_INDEX_BITS','%GL_INDEX_CLEAR_VALUE','%GL_INDEX_LOGIC_OP','%GL_INDEX_MODE','%GL_INDEX_OFFSET','%GL_INDEX_SHIFT',
+ '%GL_INDEX_WRITEMASK','%GL_INT','%GL_INTENSITY','%GL_INTENSITY12','%GL_INTENSITY16','%GL_INTENSITY4','%GL_INTENSITY8','%GL_INVALID_ENUM',
+ '%GL_INVALID_OPERATION','%GL_INVALID_VALUE','%GL_INVERT','%GL_KEEP','%GL_LEFT','%GL_LEQUAL','%GL_LESS','%GL_LIGHT0',
+ '%GL_LIGHT1','%GL_LIGHT2','%GL_LIGHT3','%GL_LIGHT4','%GL_LIGHT5','%GL_LIGHT6','%GL_LIGHT7','%GL_LIGHTING',
+ '%GL_LIGHTING_BIT','%GL_LIGHT_MODEL_AMBIENT','%GL_LIGHT_MODEL_COLOR_CONTROL_EXT','%GL_LIGHT_MODEL_LOCAL_VIEWER','%GL_LIGHT_MODEL_TWO_SIDE','%GL_LINE','%GL_LINEAR','%GL_LINEAR_ATTENUATION',
+ '%GL_LINEAR_MIPMAP_LINEAR','%GL_LINEAR_MIPMAP_NEAREST','%GL_LINES','%GL_LINE_BIT','%GL_LINE_LOOP','%GL_LINE_RESET_TOKEN','%GL_LINE_SMOOTH','%GL_LINE_SMOOTH_HINT',
+ '%GL_LINE_STIPPLE','%GL_LINE_STIPPLE_PATTERN','%GL_LINE_STIPPLE_REPEAT','%GL_LINE_STRIP','%GL_LINE_TOKEN','%GL_LINE_WIDTH','%GL_LINE_WIDTH_GRANULARITY','%GL_LINE_WIDTH_RANGE',
+ '%GL_LIST_BASE','%GL_LIST_BIT','%GL_LIST_INDEX','%GL_LIST_MODE','%GL_LOAD','%GL_LOGIC_OP','%GL_LOGIC_OP_MODE','%GL_LUMINANCE',
+ '%GL_LUMINANCE12','%GL_LUMINANCE12_ALPHA12','%GL_LUMINANCE12_ALPHA4','%GL_LUMINANCE16','%GL_LUMINANCE16_ALPHA16','%GL_LUMINANCE4','%GL_LUMINANCE4_ALPHA4','%GL_LUMINANCE6_ALPHA2',
+ '%GL_LUMINANCE8','%GL_LUMINANCE8_ALPHA8','%GL_LUMINANCE_ALPHA','%GL_MAP1_COLOR_4','%GL_MAP1_GRID_DOMAIN','%GL_MAP1_GRID_SEGMENTS','%GL_MAP1_INDEX','%GL_MAP1_NORMAL',
+ '%GL_MAP1_TEXTURE_COORD_1','%GL_MAP1_TEXTURE_COORD_2','%GL_MAP1_TEXTURE_COORD_3','%GL_MAP1_TEXTURE_COORD_4','%GL_MAP1_VERTEX_3','%GL_MAP1_VERTEX_4','%GL_MAP2_COLOR_4','%GL_MAP2_GRID_DOMAIN',
+ '%GL_MAP2_GRID_SEGMENTS','%GL_MAP2_INDEX','%GL_MAP2_NORMAL','%GL_MAP2_TEXTURE_COORD_1','%GL_MAP2_TEXTURE_COORD_2','%GL_MAP2_TEXTURE_COORD_3','%GL_MAP2_TEXTURE_COORD_4','%GL_MAP2_VERTEX_3',
+ '%GL_MAP2_VERTEX_4','%GL_MAP_COLOR','%GL_MAP_STENCIL','%GL_MATRIX_MODE','%GL_MAX_ATTRIB_STACK_DEPTH','%GL_MAX_CLIENT_ATTRIB_STACK_DEPTH','%GL_MAX_CLIP_PLANES','%GL_MAX_CONVOLUTION_HEIGHT_EXT',
+ '%GL_MAX_CONVOLUTION_WIDTH_EXT','%GL_MAX_EVAL_ORDER','%GL_MAX_EXT','%GL_MAX_LIGHTS','%GL_MAX_LIST_NESTING','%GL_MAX_MODELVIEW_STACK_DEPTH','%GL_MAX_NAME_STACK_DEPTH','%GL_MAX_PIXEL_MAP_TABLE',
+ '%GL_MAX_PROJECTION_STACK_DEPTH','%GL_MAX_TEXTURE_SIZE','%GL_MAX_TEXTURE_STACK_DEPTH','%GL_MAX_VIEWPORT_DIMS','%GL_MINMAX_EXT','%GL_MINMAX_FORMAT_EXT','%GL_MINMAX_SINK_EXT','%GL_MIN_EXT',
+ '%GL_MODELVIEW','%GL_MODELVIEW_MATRIX','%GL_MODELVIEW_STACK_DEPTH','%GL_MODULATE','%GL_MULT','%GL_N3F_V3F','%GL_NAME_STACK_DEPTH','%GL_NAND',
+ '%GL_NEAREST','%GL_NEAREST_MIPMAP_LINEAR','%GL_NEAREST_MIPMAP_NEAREST','%GL_NEVER','%GL_NICEST','%GL_NONE','%GL_NOOP','%GL_NOR',
+ '%GL_NORMALIZE','%GL_NORMAL_ARRAY','%GL_NORMAL_ARRAY_COUNT_EXT','%GL_NORMAL_ARRAY_EXT','%GL_NORMAL_ARRAY_POINTER','%GL_NORMAL_ARRAY_POINTER_EXT','%GL_NORMAL_ARRAY_STRIDE','%GL_NORMAL_ARRAY_STRIDE_EXT',
+ '%GL_NORMAL_ARRAY_TYPE','%GL_NORMAL_ARRAY_TYPE_EXT','%GL_NOTEQUAL','%GL_NO_ERROR','%GL_OBJECT_LINEAR','%GL_OBJECT_PLANE','%GL_ONE','%GL_ONE_MINUS_CONSTANT_ALPHA_EXT',
+ '%GL_ONE_MINUS_CONSTANT_COLOR_EXT','%GL_ONE_MINUS_DST_ALPHA','%GL_ONE_MINUS_DST_COLOR','%GL_ONE_MINUS_SRC_ALPHA','%GL_ONE_MINUS_SRC_COLOR','%GL_OR','%GL_ORDER','%GL_OR_INVERTED',
+ '%GL_OR_REVERSE','%GL_OUT_OF_MEMORY','%GL_PACK_ALIGNMENT','%GL_PACK_LSB_FIRST','%GL_PACK_ROW_LENGTH','%GL_PACK_SKIP_PIXELS','%GL_PACK_SKIP_ROWS','%GL_PACK_SWAP_BYTES',
+ '%GL_PASS_THROUGH_TOKEN','%GL_PERSPECTIVE_CORRECTION_HINT','%GL_PIXEL_MAP_A_TO_A','%GL_PIXEL_MAP_A_TO_A_SIZE','%GL_PIXEL_MAP_B_TO_B','%GL_PIXEL_MAP_B_TO_B_SIZE','%GL_PIXEL_MAP_G_TO_G','%GL_PIXEL_MAP_G_TO_G_SIZE',
+ '%GL_PIXEL_MAP_I_TO_A','%GL_PIXEL_MAP_I_TO_A_SIZE','%GL_PIXEL_MAP_I_TO_B','%GL_PIXEL_MAP_I_TO_B_SIZE','%GL_PIXEL_MAP_I_TO_G','%GL_PIXEL_MAP_I_TO_G_SIZE','%GL_PIXEL_MAP_I_TO_I','%GL_PIXEL_MAP_I_TO_I_SIZE',
+ '%GL_PIXEL_MAP_I_TO_R','%GL_PIXEL_MAP_I_TO_R_SIZE','%GL_PIXEL_MAP_R_TO_R','%GL_PIXEL_MAP_R_TO_R_SIZE','%GL_PIXEL_MAP_S_TO_S','%GL_PIXEL_MAP_S_TO_S_SIZE','%GL_PIXEL_MODE_BIT','%GL_POINT',
+ '%GL_POINTS','%GL_POINT_BIT','%GL_POINT_SIZE','%GL_POINT_SIZE_GRANULARITY','%GL_POINT_SIZE_RANGE','%GL_POINT_SMOOTH','%GL_POINT_SMOOTH_HINT','%GL_POINT_TOKEN',
+ '%GL_POLYGON','%GL_POLYGON_BIT','%GL_POLYGON_MODE','%GL_POLYGON_OFFSET_BIAS_EXT','%GL_POLYGON_OFFSET_EXT','%GL_POLYGON_OFFSET_FACTOR','%GL_POLYGON_OFFSET_FACTOR_EXT','%GL_POLYGON_OFFSET_FILL',
+ '%GL_POLYGON_OFFSET_LINE','%GL_POLYGON_OFFSET_POINT','%GL_POLYGON_OFFSET_UNITS','%GL_POLYGON_SMOOTH','%GL_POLYGON_SMOOTH_HINT','%GL_POLYGON_STIPPLE','%GL_POLYGON_STIPPLE_BIT','%GL_POLYGON_TOKEN',
+ '%GL_POSITION','%GL_POST_COLOR_MATRIX_COLOR_TABLE_EXT','%GL_POST_CONVOLUTION_ALPHA_BIAS_EXT','%GL_POST_CONVOLUTION_ALPHA_SCALE_EXT','%GL_POST_CONVOLUTION_BLUE_BIAS_EXT','%GL_POST_CONVOLUTION_BLUE_SCALE_EXT','%GL_POST_CONVOLUTION_COLOR_TABLE_EXT','%GL_POST_CONVOLUTION_GREEN_BIAS_EXT',
+ '%GL_POST_CONVOLUTION_GREEN_SCALE_EXT','%GL_POST_CONVOLUTION_RED_BIAS_EXT','%GL_POST_CONVOLUTION_RED_SCALE_EXT','%GL_PROJECTION','%GL_PROJECTION_MATRIX','%GL_PROJECTION_STACK_DEPTH','%GL_PROXY_COLOR_TABLE_EXT','%GL_PROXY_HISTOGRAM_EXT',
+ '%GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_EXT','%GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_EXT','%GL_PROXY_TEXTURE_1D','%GL_PROXY_TEXTURE_2D','%GL_Q','%GL_QUADRATIC_ATTENUATION','%GL_QUADS','%GL_QUAD_STRIP',
+ '%GL_R','%GL_R3_G3_B2','%GL_READ_BUFFER','%GL_RED','%GL_REDUCE_EXT','%GL_RED_BIAS','%GL_RED_BITS','%GL_RED_SCALE',
+ '%GL_RENDER','%GL_RENDERER','%GL_RENDER_MODE','%GL_REPEAT','%GL_REPLACE','%GL_RETURN','%GL_RGB','%GL_RGB10',
+ '%GL_RGB10_A2','%GL_RGB12','%GL_RGB16','%GL_RGB4','%GL_RGB5','%GL_RGB5_A1','%GL_RGB8','%GL_RGBA',
+ '%GL_RGBA12','%GL_RGBA16','%GL_RGBA2','%GL_RGBA4','%GL_RGBA8','%GL_RGBA_MODE','%GL_RIGHT','%GL_S',
+ '%GL_SCISSOR_BIT','%GL_SCISSOR_BOX','%GL_SCISSOR_TEST','%GL_SECONDARY_COLOR_ARRAY_EXT','%GL_SECONDARY_COLOR_ARRAY_POINTER_EXT','%GL_SECONDARY_COLOR_ARRAY_SIZE_EXT','%GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT','%GL_SECONDARY_COLOR_ARRAY_TYPE_EXT',
+ '%GL_SELECT','%GL_SELECTION_BUFFER_POINTER','%GL_SELECTION_BUFFER_SIZE','%GL_SEPARABLE_2D_EXT','%GL_SEPARATE_SPECULAR_COLOR_EXT','%GL_SET','%GL_SHADE_MODEL','%GL_SHININESS',
+ '%GL_SHORT','%GL_SINGLE_COLOR_EXT','%GL_SMOOTH','%GL_SPECULAR','%GL_SPHERE_MAP','%GL_SPOT_CUTOFF','%GL_SPOT_DIRECTION','%GL_SPOT_EXPONENT',
+ '%GL_SRC_ALPHA','%GL_SRC_ALPHA_SATURATE','%GL_SRC_COLOR','%GL_STACK_OVERFLOW','%GL_STACK_UNDERFLOW','%GL_STENCIL','%GL_STENCIL_BITS','%GL_STENCIL_BUFFER_BIT',
+ '%GL_STENCIL_CLEAR_VALUE','%GL_STENCIL_FAIL','%GL_STENCIL_FUNC','%GL_STENCIL_INDEX','%GL_STENCIL_PASS_DEPTH_FAIL','%GL_STENCIL_PASS_DEPTH_PASS','%GL_STENCIL_REF','%GL_STENCIL_TEST',
+ '%GL_STENCIL_VALUE_MASK','%GL_STENCIL_WRITEMASK','%GL_STEREO','%GL_SUBPIXEL_BITS','%GL_T','%GL_T2F_C3F_V3F','%GL_T2F_C4F_N3F_V3F','%GL_T2F_C4UB_V3F',
+ '%GL_T2F_N3F_V3F','%GL_T2F_V3F','%GL_T4F_C4F_N3F_V4F','%GL_T4F_V4F','%GL_TABLE_TOO_LARGE_EXT','%GL_TEXTURE','%GL_TEXTURE_1D','%GL_TEXTURE_2D',
+ '%GL_TEXTURE_ALPHA_SIZE','%GL_TEXTURE_BINDING_1D','%GL_TEXTURE_BINDING_2D','%GL_TEXTURE_BIT','%GL_TEXTURE_BLUE_SIZE','%GL_TEXTURE_BORDER','%GL_TEXTURE_BORDER_COLOR','%GL_TEXTURE_COMPONENTS',
+ '%GL_TEXTURE_COORD_ARRAY','%GL_TEXTURE_COORD_ARRAY_COUNT_EXT','%GL_TEXTURE_COORD_ARRAY_EXT','%GL_TEXTURE_COORD_ARRAY_POINTER','%GL_TEXTURE_COORD_ARRAY_POINTER_EXT','%GL_TEXTURE_COORD_ARRAY_SIZE','%GL_TEXTURE_COORD_ARRAY_SIZE_EXT','%GL_TEXTURE_COORD_ARRAY_STRIDE',
+ '%GL_TEXTURE_COORD_ARRAY_STRIDE_EXT','%GL_TEXTURE_COORD_ARRAY_TYPE','%GL_TEXTURE_COORD_ARRAY_TYPE_EXT','%GL_TEXTURE_ENV','%GL_TEXTURE_ENV_COLOR','%GL_TEXTURE_ENV_MODE','%GL_TEXTURE_GEN_MODE','%GL_TEXTURE_GEN_Q',
+ '%GL_TEXTURE_GEN_R','%GL_TEXTURE_GEN_S','%GL_TEXTURE_GEN_T','%GL_TEXTURE_GREEN_SIZE','%GL_TEXTURE_HEIGHT','%GL_TEXTURE_INTENSITY_SIZE','%GL_TEXTURE_INTERNAL_FORMAT','%GL_TEXTURE_LUMINANCE_SIZE',
+ '%GL_TEXTURE_MAG_FILTER','%GL_TEXTURE_MATRIX','%GL_TEXTURE_MIN_FILTER','%GL_TEXTURE_PRIORITY','%GL_TEXTURE_RED_SIZE','%GL_TEXTURE_RESIDENT','%GL_TEXTURE_STACK_DEPTH','%GL_TEXTURE_WIDTH',
+ '%GL_TEXTURE_WRAP_S','%GL_TEXTURE_WRAP_T','%GL_TRANSFORM_BIT','%GL_TRIANGLES','%GL_TRIANGLE_FAN','%GL_TRIANGLE_STRIP','%GL_TRUE','%GL_UNPACK_ALIGNMENT',
+ '%GL_UNPACK_LSB_FIRST','%GL_UNPACK_ROW_LENGTH','%GL_UNPACK_SKIP_PIXELS','%GL_UNPACK_SKIP_ROWS','%GL_UNPACK_SWAP_BYTES','%GL_UNSIGNED_BYTE','%GL_UNSIGNED_BYTE_3_3_2_EXT','%GL_UNSIGNED_INT',
+ '%GL_UNSIGNED_INT_10_10_10_2_EXT','%GL_UNSIGNED_INT_8_8_8_8_EXT','%GL_UNSIGNED_SHORT','%GL_UNSIGNED_SHORT_4_4_4_4_EXT','%GL_UNSIGNED_SHORT_5_5_5_1_EXT','%GL_V2F','%GL_V3F','%GL_VENDOR',
+ '%GL_VERSION','%GL_VERSION_1_1','%GL_VERTEX_ARRAY','%GL_VERTEX_ARRAY_COUNT_EXT','%GL_VERTEX_ARRAY_EXT','%GL_VERTEX_ARRAY_POINTER','%GL_VERTEX_ARRAY_POINTER_EXT','%GL_VERTEX_ARRAY_SIZE',
+ '%GL_VERTEX_ARRAY_SIZE_EXT','%GL_VERTEX_ARRAY_STRIDE','%GL_VERTEX_ARRAY_STRIDE_EXT','%GL_VERTEX_ARRAY_TYPE','%GL_VERTEX_ARRAY_TYPE_EXT','%GL_VIEWPORT','%GL_VIEWPORT_BIT','%GL_WIN_SWAP_HINT',
+ '%GL_XOR','%GL_ZERO','%GL_ZOOM_X','%GL_ZOOM_Y','%GRAY','%GREEN','%GWLP_HINSTANCE','%GWLP_HWNDPARENT',
+ '%GWLP_ID','%GWLP_USERDATA','%GWLP_WNDPROC','%GWL_EXSTYLE','%GWL_HINSTANCE','%GWL_HWNDPARENT','%GWL_ID','%GWL_STYLE',
+ '%GWL_USERDATA','%GWL_WNDPROC','%HDM_FIRST','%HTCAPTION','%HWND_BOTTOM','%HWND_DESKTOP','%HWND_MESSAGE','%HWND_NOTOPMOST',
+ '%HWND_TOP','%HWND_TOPMOST','%ICRYPTO_XOR_DECREASE','%ICRYPTO_XOR_INCREASE','%ICRYPTO_XOR_NORMAL','%IDABORT','%IDCANCEL','%IDCONTINUE',
+ '%IDIGNORE','%IDNO','%IDOK','%IDRETRY','%IDTIMEOUT','%IDTRYAGAIN','%IDYES','%INTERNET_CONNECTION_CONFIGURED',
+ '%INTERNET_CONNECTION_LAN','%INTERNET_CONNECTION_MODEM','%INTERNET_CONNECTION_MODEM_BUSY','%INTERNET_CONNECTION_OFFLINE','%INTERNET_CONNECTION_PROXY','%INTERNET_RAS_INSTALLED','%LBN_DBLCLK','%LBN_KILLFOCUS',
+ '%LBN_SELCANCEL','%LBN_SELCHANGE','%LBN_SETFOCUS','%LBS_DISABLENOSCROLL','%LBS_EXTENDEDSEL','%LBS_MULTICOLUMN','%LBS_MULTIPLESEL','%LBS_NOINTEGRALHEIGHT',
+ '%LBS_NOSEL','%LBS_NOTIFY','%LBS_SORT','%LBS_STANDARD','%LBS_USETABSTOPS','%LB_ADDFILE','%LB_ADDSTRING','%LB_DELETESTRING',
+ '%LB_DIR','%LB_FINDSTRING','%LB_FINDSTRINGEXACT','%LB_GETANCHORINDEX','%LB_GETCARETINDEX','%LB_GETCOUNT','%LB_GETCURSEL','%LB_GETHORIZONTALEXTENT',
+ '%LB_GETITEMDATA','%LB_GETITEMHEIGHT','%LB_GETITEMRECT','%LB_GETLISTBOXINFO','%LB_GETLOCALE','%LB_GETSEL','%LB_GETSELCOUNT','%LB_GETSELITEMS',
+ '%LB_GETTEXT','%LB_GETTEXTLEN','%LB_GETTOPINDEX','%LB_INITSTORAGE','%LB_INSERTSTRING','%LB_ITEMFROMPOINT','%LB_MULTIPLEADDSTRING','%LB_RESETCONTENT',
+ '%LB_SELECTSTRING','%LB_SELITEMRANGE','%LB_SELITEMRANGEEX','%LB_SETANCHORINDEX','%LB_SETCARETINDEX','%LB_SETCOLUMNWIDTH','%LB_SETCOUNT','%LB_SETCURSEL',
+ '%LB_SETHORIZONTALEXTENT','%LB_SETITEMDATA','%LB_SETITEMHEIGHT','%LB_SETLOCALE','%LB_SETSEL','%LB_SETTABSTOPS','%LB_SETTOPINDEX','%LF_FACESIZE',
+ '%LTGRAY','%LVM_FIRST','%LWA_ALPHA','%LWA_COLORKEY','%MAGENTA','%MAXBYTE','%MAXCHAR','%MAXDWORD',
+ '%MAXSHORT','%MAXWORD','%MAX_PATH','%MB_ABORTRETRYIGNORE','%MB_APPLMODAL','%MB_CANCELTRYCONTINUE','%MB_DEFBUTTON1','%MB_DEFBUTTON2',
+ '%MB_DEFBUTTON3','%MB_HELP','%MB_ICONASTERISK','%MB_ICONERROR','%MB_ICONEXCLAMATION','%MB_ICONHAND','%MB_ICONINFORMATION','%MB_ICONQUESTION',
+ '%MB_ICONSTOP','%MB_ICONWARNING','%MB_OK','%MB_OKCANCEL','%MB_RETRYCANCEL','%MB_SIMPLE','%MB_SYSTEMMODAL','%MB_TOPMOST',
+ '%MB_YESNO','%MB_YESNOCANCEL','%MF_CHECKED','%MF_DISABLED','%MF_ENABLED','%MF_GRAYED','%MF_SEPARATOR','%MF_UNCHECKED',
+ '%MINCHAR','%MINLONG','%MINSHORT','%NULL','%ODBC352_INC','%ODBCVER','%ODBC_ADD_DSN','%ODBC_ADD_SYS_DSN',
+ '%ODBC_BOTH_DSN','%ODBC_CONFIG_DRIVER','%ODBC_CONFIG_DRIVER_MAX','%ODBC_CONFIG_DSN','%ODBC_CONFIG_SYS_DSN','%ODBC_DRIVER_VERSION','%ODBC_ERROR_COMPONENT_NOT_FOUND','%ODBC_ERROR_CREATE_DSN_FAILED',
+ '%ODBC_ERROR_GENERAL_ERR','%ODBC_ERROR_INVALID_BUFF_LEN','%ODBC_ERROR_INVALID_DSN','%ODBC_ERROR_INVALID_HWND','%ODBC_ERROR_INVALID_INF','%ODBC_ERROR_INVALID_KEYWORD_VALUE','%ODBC_ERROR_INVALID_LOG_FILE','%ODBC_ERROR_INVALID_NAME',
+ '%ODBC_ERROR_INVALID_PARAM_SEQUENCE','%ODBC_ERROR_INVALID_PATH','%ODBC_ERROR_INVALID_REQUEST_TYPE','%ODBC_ERROR_INVALID_STR','%ODBC_ERROR_LOAD_LIB_FAILED','%ODBC_ERROR_OUTPUT_STRING_TRUNCATED','%ODBC_ERROR_OUT_OF_MEM','%ODBC_ERROR_REMOVE_DSN_FAILED',
+ '%ODBC_ERROR_REQUEST_FAILED','%ODBC_ERROR_USAGE_UPDATE_FAILED','%ODBC_ERROR_USER_CANCELED','%ODBC_ERROR_WRITING_SYSINFO_FAILED','%ODBC_INSTALL_COMPLETE','%ODBC_INSTALL_DRIVER','%ODBC_INSTALL_INQUIRY','%ODBC_REMOVE_DEFAULT_DSN',
+ '%ODBC_REMOVE_DRIVER','%ODBC_REMOVE_DSN','%ODBC_REMOVE_SYS_DSN','%ODBC_SYSTEM_DSN','%ODBC_USER_DSN','%OFN_ALLOWMULTISELECT','%OFN_CREATEPROMPT','%OFN_ENABLEHOOK',
+ '%OFN_ENABLEINCLUDENOTIFY','%OFN_ENABLESIZING','%OFN_ENABLETEMPLATE','%OFN_ENABLETEMPLATEHANDLE','%OFN_EXPLORER','%OFN_EXTENSIONDIFFERENT','%OFN_FILEMUSTEXIST','%OFN_HIDEREADONLY',
+ '%OFN_LONGNAMES','%OFN_NOCHANGEDIR','%OFN_NODEREFERENCELINKS','%OFN_NOLONGNAMES','%OFN_NONETWORKBUTTON','%OFN_NOREADONLYRETURN','%OFN_NOTESTFILECREATE','%OFN_NOVALIDATE',
+ '%OFN_OVERWRITEPROMPT','%OFN_PATHMUSTEXIST','%OFN_READONLY','%OFN_SHAREAWARE','%OFN_SHOWHELP','%OS_ERROR_CALLFUNCTION','%OS_ERROR_EMPTYSTRING','%OS_ERROR_LOADLIBRARY',
+ '%OS_ERROR_SUCCESS','%OS_ERROR_WRONGPARAMETER','%OS_SHELL_ASYNC','%OS_SHELL_SYNC','%OS_WINDOWS_2K','%OS_WINDOWS_95','%OS_WINDOWS_95_OSR2','%OS_WINDOWS_98',
+ '%OS_WINDOWS_98_SE','%OS_WINDOWS_ME','%OS_WINDOWS_NT','%OS_WINDOWS_SERVER_2003','%OS_WINDOWS_SERVER_LONGHORN','%OS_WINDOWS_SERVER_LONGHORN_DC','%OS_WINDOWS_VISTA','%OS_WINDOWS_XP',
+ '%OS_WNDSTYLE_HIDE','%OS_WNDSTYLE_MAXIMIZED','%OS_WNDSTYLE_MINIMIZED','%OS_WNDSTYLE_MINIMIZEDNOFOCUS','%OS_WNDSTYLE_NORMAL','%OS_WNDSTYLE_NORMALNOFOCUS','%PATH_EXT','%PATH_FILE',
+ '%PATH_FILEEXT','%PATH_ROOT','%PATH_ROOTPATH','%PATH_ROOTPATHPROG','%PATH_ROOTPATHPROGEXT','%PBM_DELTAPOS','%PBM_GETPOS','%PBM_GETRANGE',
+ '%PBM_SETBARCOLOR','%PBM_SETBKCOLOR','%PBM_SETPOS','%PBM_SETRANGE','%PBM_SETRANGE32','%PBM_SETSTEP','%PBM_STEPIT','%PBS_SMOOTH',
+ '%PBS_VERTICAL','%PC_DISABLEWAKEEVENT_OFF','%PC_DISABLEWAKEEVENT_ON','%PC_EB_NOCONFIRMATION','%PC_EB_NOPROGRESSUI','%PC_EB_NORMAL','%PC_EB_NOSOUND','%PC_FORCECRITICAL_OFF',
+ '%PC_FORCECRITICAL_ON','%PC_HIBERNATE_OFF','%PC_HIBERNATE_ON','%PC_RD_FORCE','%PC_RD_FORCEIFHUNG','%PC_RD_LOGOFF','%PC_RD_POWEROFF','%PC_RD_REBOOT',
+ '%PC_RD_SHUTDOWN','%PC_SD_DONOT_FORCE','%PC_SD_DONOT_REBOOT','%PC_SD_FORCE','%PC_SD_REBOOT','%PFA_CENTER','%PFA_LEFT','%PFA_RIGHT',
+ '%PF_3DNOW_INSTRUCTIONS_AVAILABLE','%PF_CHANNELS_ENABLED','%PF_COMPARE64_EXCHANGE128','%PF_COMPARE_EXCHANGE128','%PF_COMPARE_EXCHANGE_DOUBLE','%PF_FLOATING_POINT_EMULATED','%PF_FLOATING_POINT_PRECISION_ERRATA','%PF_MMX_INSTRUCTIONS_AVAILABLE',
+ '%PF_NX_ENABLED','%PF_PAE_ENABLED','%PF_RDTSC_INSTRUCTION_AVAILABLE','%PF_SSE3_INSTRUCTIONS_AVAILABLE','%PF_XMMI64_INSTRUCTIONS_AVAILABLE','%PF_XMMI_INSTRUCTIONS_AVAILABLE','%PGM_FIRST','%RED',
+ '%RTF_UBB','%SAPI_SVSFDEFAULT','%SAPI_SVSFISFILENAME','%SAPI_SVSFISNOTXML','%SAPI_SVSFISXML','%SAPI_SVSFLAGSASYNC','%SAPI_SVSFNLPMASK','%SAPI_SVSFNLPSPEAKPUNC',
+ '%SAPI_SVSFPERSISTXML','%SAPI_SVSFPURGEBEFORESPEAK','%SAPI_SVSFUNUSEDFLAGS','%SAPI_SVSFVOICEMASK','%SBS_SIZEGRIP','%SB_BOTTOM','%SB_ENDSCROLL','%SB_LEFT',
+ '%SB_LINEDOWN','%SB_LINELEFT','%SB_LINERIGHT','%SB_LINEUP','%SB_PAGEDOWN','%SB_PAGELEFT','%SB_PAGERIGHT','%SB_PAGEUP',
+ '%SB_RIGHT','%SB_SETPARTS','%SB_SETTEXT','%SB_THUMBPOSITION','%SB_THUMBTRACK','%SB_TOP','%SCF_ALL','%SCF_ASSOCIATEFONT',
+ '%SCF_DEFAULT','%SCF_NOKBUPDATE','%SCF_SELECTION','%SCF_USEUIRULES','%SCF_WORD','%SC_CLOSE','%SC_CONTEXTHELP','%SC_HOTKEY',
+ '%SC_HSCROLL','%SC_KEYMENU','%SC_MAXIMIZE','%SC_MINIMIZE','%SC_MONITORPOWER','%SC_MOUSEMENU','%SC_MOVE','%SC_NEXTWINDOW',
+ '%SC_PREVWINDOW','%SC_RESTORE','%SC_SCREENSAVE','%SC_SIZE','%SC_TASKLIST','%SC_VSCROLL','%SERVICE_ACTIVE','%SERVICE_AUTO_START',
+ '%SERVICE_BOOT_START','%SERVICE_CONTINUE_PENDING','%SERVICE_DEMAND_START','%SERVICE_DISABLED','%SERVICE_DRIVER','%SERVICE_INACTIVE','%SERVICE_INFO_DISPLAY_NAME','%SERVICE_INFO_NAME',
+ '%SERVICE_PAUSED','%SERVICE_PAUSE_PENDING','%SERVICE_RUNNING','%SERVICE_START_PENDING','%SERVICE_STATE_ALL','%SERVICE_STOPPED','%SERVICE_STOP_PENDING','%SERVICE_SYSTEM_START',
+ '%SERVICE_TYPE_ALL','%SERVICE_WIN32','%SES_ALLOWBEEPS','%SES_BEEPONMAXTEXT','%SES_BIDI','%SES_EMULATE10','%SES_EMULATESYSEDIT','%SES_EXTENDBACKCOLOR',
+ '%SES_LOWERCASE','%SES_MAPCPS','%SES_NOIME','%SES_NOINPUTSEQUENCECHK','%SES_SCROLLONKILLFOCUS','%SES_UPPERCASE','%SES_USEAIMM','%SES_USECRLF',
+ '%SES_XLTCRCRLFTOCR','%SF_RTF','%SF_TEXT','%SMTP_SET_ATTACH_CONTENT_TYPE','%SMTP_SET_CONTENT_TYPE_PREFIX','%SQL_AA_FALSE','%SQL_AA_TRUE','%SQL_ACCESSIBLE_PROCEDURES',
+ '%SQL_ACCESSIBLE_TABLES','%SQL_ACCESS_MODE','%SQL_ACTIVE_CONNECTIONS','%SQL_ACTIVE_ENVIRONMENTS','%SQL_ACTIVE_STATEMENTS','%SQL_ADD','%SQL_AD_ADD_CONSTRAINT_DEFERRABLE','%SQL_AD_ADD_CONSTRAINT_INITIALLY_DEFERRED',
+ '%SQL_AD_ADD_CONSTRAINT_INITIALLY_IMMEDIATE','%SQL_AD_ADD_CONSTRAINT_NON_DEFERRABLE','%SQL_AD_ADD_DOMAIN_CONSTRAINT','%SQL_AD_ADD_DOMAIN_DEFAULT','%SQL_AD_CONSTRAINT_NAME_DEFINITION','%SQL_AD_DROP_DOMAIN_CONSTRAINT','%SQL_AD_DROP_DOMAIN_DEFAULT','%SQL_AF_ALL',
+ '%SQL_AF_AVG','%SQL_AF_COUNT','%SQL_AF_DISTINCT','%SQL_AF_MAX','%SQL_AF_MIN','%SQL_AF_SUM','%SQL_AGGREGATE_FUNCTIONS','%SQL_ALL_EXCEPT_LIKE',
+ '%SQL_ALL_TYPES','%SQL_ALTER_DOMAIN','%SQL_ALTER_TABLE','%SQL_AM_CONNECTION','%SQL_AM_NONE','%SQL_AM_STATEMENT','%SQL_API_ALL_FUNCTIONS','%SQL_API_LOADBYORDINAL',
+ '%SQL_API_ODBC3_ALL_FUNCTIONS','%SQL_API_ODBC3_ALL_FUNCTIONS_SIZE','%SQL_API_SQLALLOCCONNECT','%SQL_API_SQLALLOCENV','%SQL_API_SQLALLOCHANDLE','%SQL_API_SQLALLOCHANDLESTD','%SQL_API_SQLALLOCSTMT','%SQL_API_SQLBINDCOL',
+ '%SQL_API_SQLBINDPARAM','%SQL_API_SQLBINDPARAMETER','%SQL_API_SQLBROWSECONNECT','%SQL_API_SQLBULKOPERATIONS','%SQL_API_SQLCANCEL','%SQL_API_SQLCLOSECURSOR','%SQL_API_SQLCOLATTRIBUTE','%SQL_API_SQLCOLATTRIBUTES',
+ '%SQL_API_SQLCOLUMNPRIVILEGES','%SQL_API_SQLCOLUMNS','%SQL_API_SQLCONNECT','%SQL_API_SQLCOPYDESC','%SQL_API_SQLDATASOURCES','%SQL_API_SQLDESCRIBECOL','%SQL_API_SQLDESCRIBEPARAM','%SQL_API_SQLDISCONNECT',
+ '%SQL_API_SQLDRIVERCONNECT','%SQL_API_SQLDRIVERS','%SQL_API_SQLENDTRAN','%SQL_API_SQLERROR','%SQL_API_SQLEXECDIRECT','%SQL_API_SQLEXECUTE','%SQL_API_SQLEXTENDEDFETCH','%SQL_API_SQLFETCH',
+ '%SQL_API_SQLFETCHSCROLL','%SQL_API_SQLFOREIGNKEYS','%SQL_API_SQLFREECONNECT','%SQL_API_SQLFREEENV','%SQL_API_SQLFREEHANDLE','%SQL_API_SQLFREESTMT','%SQL_API_SQLGETCONNECTATTR','%SQL_API_SQLGETCONNECTOPTION',
+ '%SQL_API_SQLGETCURSORNAME','%SQL_API_SQLGETDATA','%SQL_API_SQLGETDESCFIELD','%SQL_API_SQLGETDESCREC','%SQL_API_SQLGETDIAGFIELD','%SQL_API_SQLGETDIAGREC','%SQL_API_SQLGETENVATTR','%SQL_API_SQLGETFUNCTIONS',
+ '%SQL_API_SQLGETINFO','%SQL_API_SQLGETSTMTATTR','%SQL_API_SQLGETSTMTOPTION','%SQL_API_SQLGETTYPEINFO','%SQL_API_SQLMORERESULTS','%SQL_API_SQLNATIVESQL','%SQL_API_SQLNUMPARAMS','%SQL_API_SQLNUMRESULTCOLS',
+ '%SQL_API_SQLPARAMDATA','%SQL_API_SQLPARAMOPTIONS','%SQL_API_SQLPREPARE','%SQL_API_SQLPRIMARYKEYS','%SQL_API_SQLPROCEDURECOLUMNS','%SQL_API_SQLPROCEDURES','%SQL_API_SQLPUTDATA','%SQL_API_SQLROWCOUNT',
+ '%SQL_API_SQLSETCONNECTATTR','%SQL_API_SQLSETCONNECTOPTION','%SQL_API_SQLSETCURSORNAME','%SQL_API_SQLSETDESCFIELD','%SQL_API_SQLSETDESCREC','%SQL_API_SQLSETENVATTR','%SQL_API_SQLSETPARAM','%SQL_API_SQLSETPOS',
+ '%SQL_API_SQLSETSCROLLOPTIONS','%SQL_API_SQLSETSTMTATTR','%SQL_API_SQLSETSTMTOPTION','%SQL_API_SQLSPECIALCOLUMNS','%SQL_API_SQLSTATISTICS','%SQL_API_SQLTABLEPRIVILEGES','%SQL_API_SQLTABLES','%SQL_API_SQLTRANSACT',
+ '%SQL_ARD_TYPE','%SQL_ASYNC_ENABLE','%SQL_ASYNC_ENABLE_DEFAULT','%SQL_ASYNC_ENABLE_OFF','%SQL_ASYNC_ENABLE_ON','%SQL_ASYNC_MODE','%SQL_ATTR_ACCESS_MODE','%SQL_ATTR_ANSI_APP',
+ '%SQL_ATTR_APP_PARAM_DESC','%SQL_ATTR_APP_ROW_DESC','%SQL_ATTR_ASYNC_ENABLE','%SQL_ATTR_AUTOCOMMIT','%SQL_ATTR_AUTO_IPD','%SQL_ATTR_CONCURRENCY','%SQL_ATTR_CONNECTION_DEAD','%SQL_ATTR_CONNECTION_POOLING',
+ '%SQL_ATTR_CONNECTION_TIMEOUT','%SQL_ATTR_CP_MATCH','%SQL_ATTR_CURRENT_CATALOG','%SQL_ATTR_CURSOR_SCROLLABLE','%SQL_ATTR_CURSOR_SENSITIVITY','%SQL_ATTR_CURSOR_TYPE','%SQL_ATTR_DISCONNECT_BEHAVIOR','%SQL_ATTR_ENABLE_AUTO_IPD',
+ '%SQL_ATTR_ENLIST_IN_DTC','%SQL_ATTR_ENLIST_IN_XA','%SQL_ATTR_FETCH_BOOKMARK_PTR','%SQL_ATTR_IMP_PARAM_DESC','%SQL_ATTR_IMP_ROW_DESC','%SQL_ATTR_KEYSET_SIZE','%SQL_ATTR_LOGIN_TIMEOUT','%SQL_ATTR_MAX_LENGTH',
+ '%SQL_ATTR_MAX_ROWS','%SQL_ATTR_METADATA_ID','%SQL_ATTR_NOSCAN','%SQL_ATTR_ODBC_CURSORS','%SQL_ATTR_ODBC_VERSION','%SQL_ATTR_OUTPUT_NTS','%SQL_ATTR_PACKET_SIZE','%SQL_ATTR_PARAMSET_SIZE',
+ '%SQL_ATTR_PARAMS_PROCESSED_PTR','%SQL_ATTR_PARAM_BIND_OFFSET_PTR','%SQL_ATTR_PARAM_BIND_TYPE','%SQL_ATTR_PARAM_OPERATION_PTR','%SQL_ATTR_PARAM_STATUS_PTR','%SQL_ATTR_QUERY_TIMEOUT','%SQL_ATTR_QUIET_MODE','%SQL_ATTR_READONLY',
+ '%SQL_ATTR_READWRITE_UNKNOWN','%SQL_ATTR_RETRIEVE_DATA','%SQL_ATTR_ROWS_FETCHED_PTR','%SQL_ATTR_ROW_ARRAY_SIZE','%SQL_ATTR_ROW_BIND_OFFSET_PTR','%SQL_ATTR_ROW_BIND_TYPE','%SQL_ATTR_ROW_NUMBER','%SQL_ATTR_ROW_OPERATION_PTR',
+ '%SQL_ATTR_ROW_STATUS_PTR','%SQL_ATTR_SIMULATE_CURSOR','%SQL_ATTR_TRACE','%SQL_ATTR_TRACEFILE','%SQL_ATTR_TRANSLATE_LIB','%SQL_ATTR_TRANSLATE_OPTION','%SQL_ATTR_TXN_ISOLATION','%SQL_ATTR_USE_BOOKMARKS',
+ '%SQL_ATTR_WRITE','%SQL_AT_ADD_COLUMN','%SQL_AT_ADD_COLUMN_COLLATION','%SQL_AT_ADD_COLUMN_DEFAULT','%SQL_AT_ADD_COLUMN_SINGLE','%SQL_AT_ADD_CONSTRAINT','%SQL_AT_ADD_TABLE_CONSTRAINT','%SQL_AT_CONSTRAINT_DEFERRABLE',
+ '%SQL_AT_CONSTRAINT_INITIALLY_DEFERRED','%SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATE','%SQL_AT_CONSTRAINT_NAME_DEFINITION','%SQL_AT_CONSTRAINT_NON_DEFERRABLE','%SQL_AT_DROP_COLUMN','%SQL_AT_DROP_COLUMN_CASCADE','%SQL_AT_DROP_COLUMN_DEFAULT','%SQL_AT_DROP_COLUMN_RESTRICT',
+ '%SQL_AT_DROP_TABLE_CONSTRAINT_CASCADE','%SQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT','%SQL_AT_SET_COLUMN_DEFAULT','%SQL_AUTOCOMMIT','%SQL_AUTOCOMMIT_DEFAULT','%SQL_AUTOCOMMIT_OFF','%SQL_AUTOCOMMIT_ON','%SQL_BATCH_ROW_COUNT',
+ '%SQL_BATCH_SUPPORT','%SQL_BEST_ROWID','%SQL_BIGINT','%SQL_BINARY','%SQL_BIND_BY_COLUMN','%SQL_BIND_TYPE','%SQL_BIND_TYPE_DEFAULT','%SQL_BIT',
+ '%SQL_BOOKMARK_PERSISTENCE','%SQL_BP_CLOSE','%SQL_BP_DELETE','%SQL_BP_DROP','%SQL_BP_OTHER_HSTMT','%SQL_BP_SCROLL','%SQL_BP_TRANSACTION','%SQL_BP_UPDATE',
+ '%SQL_BRC_EXPLICIT','%SQL_BRC_PROCEDURES','%SQL_BRC_ROLLED_UP','%SQL_BS_ROW_COUNT_EXPLICIT','%SQL_BS_ROW_COUNT_PROC','%SQL_BS_SELECT_EXPLICIT','%SQL_BS_SELECT_PROC','%SQL_CA1_ABSOLUTE',
+ '%SQL_CA1_BOOKMARK','%SQL_CA1_BULK_ADD','%SQL_CA1_BULK_DELETE_BY_BOOKMARK','%SQL_CA1_BULK_FETCH_BY_BOOKMARK','%SQL_CA1_BULK_UPDATE_BY_BOOKMARK','%SQL_CA1_LOCK_EXCLUSIVE','%SQL_CA1_LOCK_NO_CHANGE','%SQL_CA1_LOCK_UNLOCK',
+ '%SQL_CA1_NEXT','%SQL_CA1_POSITIONED_DELETE','%SQL_CA1_POSITIONED_UPDATE','%SQL_CA1_POS_DELETE','%SQL_CA1_POS_POSITION','%SQL_CA1_POS_REFRESH','%SQL_CA1_POS_UPDATE','%SQL_CA1_RELATIVE',
+ '%SQL_CA1_SELECT_FOR_UPDATE','%SQL_CA2_CRC_APPROXIMATE','%SQL_CA2_CRC_EXACT','%SQL_CA2_LOCK_CONCURRENCY','%SQL_CA2_MAX_ROWS_AFFECTS_ALL','%SQL_CA2_MAX_ROWS_CATALOG','%SQL_CA2_MAX_ROWS_DELETE','%SQL_CA2_MAX_ROWS_INSERT',
+ '%SQL_CA2_MAX_ROWS_SELECT','%SQL_CA2_MAX_ROWS_UPDATE','%SQL_CA2_OPT_ROWVER_CONCURRENCY','%SQL_CA2_OPT_VALUES_CONCURRENCY','%SQL_CA2_READ_ONLY_CONCURRENCY','%SQL_CA2_SENSITIVITY_ADDITIONS','%SQL_CA2_SENSITIVITY_DELETIONS','%SQL_CA2_SENSITIVITY_UPDATES',
+ '%SQL_CA2_SIMULATE_NON_UNIQUE','%SQL_CA2_SIMULATE_TRY_UNIQUE','%SQL_CA2_SIMULATE_UNIQUE','%SQL_CASCADE','%SQL_CATALOG_LOCATION','%SQL_CATALOG_NAME','%SQL_CATALOG_NAME_SEPARATOR','%SQL_CATALOG_TERM',
+ '%SQL_CATALOG_USAGE','%SQL_CA_CONSTRAINT_DEFERRABLE','%SQL_CA_CONSTRAINT_INITIALLY_DEFERRED','%SQL_CA_CONSTRAINT_INITIALLY_IMMEDIATE','%SQL_CA_CONSTRAINT_NON_DEFERRABLE','%SQL_CA_CREATE_ASSERTION','%SQL_CB_CLOSE','%SQL_CB_DELETE',
+ '%SQL_CB_NON_NULL','%SQL_CB_NULL','%SQL_CB_PRESERVE','%SQL_CCOL_CREATE_COLLATION','%SQL_CCS_COLLATE_CLAUSE','%SQL_CCS_CREATE_CHARACTER_SET','%SQL_CCS_LIMITED_COLLATION','%SQL_CC_CLOSE',
+ '%SQL_CC_DELETE','%SQL_CC_PRESERVE','%SQL_CDO_COLLATION','%SQL_CDO_CONSTRAINT','%SQL_CDO_CONSTRAINT_DEFERRABLE','%SQL_CDO_CONSTRAINT_INITIALLY_DEFERRED','%SQL_CDO_CONSTRAINT_INITIALLY_IMMEDIATE','%SQL_CDO_CONSTRAINT_NAME_DEFINITION',
+ '%SQL_CDO_CONSTRAINT_NON_DEFERRABLE','%SQL_CDO_CREATE_DOMAIN','%SQL_CDO_DEFAULT','%SQL_CD_FALSE','%SQL_CD_TRUE','%SQL_CHAR','%SQL_CLOSE','%SQL_CL_END',
+ '%SQL_CL_START','%SQL_CN_ANY','%SQL_CN_DIFFERENT','%SQL_CN_NONE','%SQL_CODE_DATE','%SQL_CODE_DAY','%SQL_CODE_DAY_TO_HOUR','%SQL_CODE_DAY_TO_MINUTE',
+ '%SQL_CODE_DAY_TO_SECOND','%SQL_CODE_HOUR','%SQL_CODE_HOUR_TO_MINUTE','%SQL_CODE_HOUR_TO_SECOND','%SQL_CODE_MINUTE','%SQL_CODE_MINUTE_TO_SECOND','%SQL_CODE_MONTH','%SQL_CODE_SECOND',
+ '%SQL_CODE_TIME','%SQL_CODE_TIMESTAMP','%SQL_CODE_YEAR','%SQL_CODE_YEAR_TO_MONTH','%SQL_COLATT_OPT_MAX','%SQL_COLATT_OPT_MIN','%SQL_COLLATION_SEQ','%SQL_COLUMN_ALIAS',
+ '%SQL_COLUMN_AUTO_INCREMENT','%SQL_COLUMN_CASE_SENSITIVE','%SQL_COLUMN_COUNT','%SQL_COLUMN_DISPLAY_SIZE','%SQL_COLUMN_IGNORE','%SQL_COLUMN_LABEL','%SQL_COLUMN_LENGTH','%SQL_COLUMN_MONEY',
+ '%SQL_COLUMN_NAME','%SQL_COLUMN_NULLABLE','%SQL_COLUMN_NUMBER_UNKNOWN','%SQL_COLUMN_OWNER_NAME','%SQL_COLUMN_PRECISION','%SQL_COLUMN_QUALIFIER_NAME','%SQL_COLUMN_SCALE','%SQL_COLUMN_SEARCHABLE',
+ '%SQL_COLUMN_TABLE_NAME','%SQL_COLUMN_TYPE','%SQL_COLUMN_TYPE_NAME','%SQL_COLUMN_UNSIGNED','%SQL_COLUMN_UPDATABLE','%SQL_COL_PRED_BASIC','%SQL_COL_PRED_CHAR','%SQL_COMMIT',
+ '%SQL_CONCAT_NULL_BEHAVIOR','%SQL_CONCURRENCY','%SQL_CONCUR_DEFAULT','%SQL_CONCUR_LOCK','%SQL_CONCUR_READ_ONLY','%SQL_CONCUR_ROWVER','%SQL_CONCUR_TIMESTAMP','%SQL_CONCUR_VALUES',
+ '%SQL_CONVERT_BIGINT','%SQL_CONVERT_BINARY','%SQL_CONVERT_BIT','%SQL_CONVERT_CHAR','%SQL_CONVERT_DATE','%SQL_CONVERT_DECIMAL','%SQL_CONVERT_DOUBLE','%SQL_CONVERT_FLOAT',
+ '%SQL_CONVERT_FUNCTIONS','%SQL_CONVERT_GUID','%SQL_CONVERT_INTEGER','%SQL_CONVERT_INTERVAL_DAY_TIME','%SQL_CONVERT_INTERVAL_YEAR_MONTH','%SQL_CONVERT_LONGVARBINARY','%SQL_CONVERT_LONGVARCHAR','%SQL_CONVERT_NUMERIC',
+ '%SQL_CONVERT_REAL','%SQL_CONVERT_SMALLINT','%SQL_CONVERT_TIME','%SQL_CONVERT_TIMESTAMP','%SQL_CONVERT_TINYINT','%SQL_CONVERT_VARBINARY','%SQL_CONVERT_VARCHAR','%SQL_CONVERT_WCHAR',
+ '%SQL_CONVERT_WLONGVARCHAR','%SQL_CONVERT_WVARCHAR','%SQL_CORRELATION_NAME','%SQL_CP_DEFAULT','%SQL_CP_MATCH_DEFAULT','%SQL_CP_OFF','%SQL_CP_ONE_PER_DRIVER','%SQL_CP_ONE_PER_HENV',
+ '%SQL_CP_RELAXED_MATCH','%SQL_CP_STRICT_MATCH','%SQL_CREATE_ASSERTION','%SQL_CREATE_CHARACTER_SET','%SQL_CREATE_COLLATION','%SQL_CREATE_DOMAIN','%SQL_CREATE_SCHEMA','%SQL_CREATE_TABLE',
+ '%SQL_CREATE_TRANSLATION','%SQL_CREATE_VIEW','%SQL_CR_CLOSE','%SQL_CR_DELETE','%SQL_CR_PRESERVE','%SQL_CS_AUTHORIZATION','%SQL_CS_CREATE_SCHEMA','%SQL_CS_DEFAULT_CHARACTER_SET',
+ '%SQL_CTR_CREATE_TRANSLATION','%SQL_CT_COLUMN_COLLATION','%SQL_CT_COLUMN_CONSTRAINT','%SQL_CT_COLUMN_DEFAULT','%SQL_CT_COMMIT_DELETE','%SQL_CT_COMMIT_PRESERVE','%SQL_CT_CONSTRAINT_DEFERRABLE','%SQL_CT_CONSTRAINT_INITIALLY_DEFERRED',
+ '%SQL_CT_CONSTRAINT_INITIALLY_IMMEDIATE','%SQL_CT_CONSTRAINT_NAME_DEFINITION','%SQL_CT_CONSTRAINT_NON_DEFERRABLE','%SQL_CT_CREATE_TABLE','%SQL_CT_GLOBAL_TEMPORARY','%SQL_CT_LOCAL_TEMPORARY','%SQL_CT_TABLE_CONSTRAINT','%SQL_CURRENT_QUALIFIER',
+ '%SQL_CURSOR_COMMIT_BEHAVIOR','%SQL_CURSOR_DYNAMIC','%SQL_CURSOR_FORWARD_ONLY','%SQL_CURSOR_KEYSET_DRIVEN','%SQL_CURSOR_ROLLBACK_BEHAVIOR','%SQL_CURSOR_SENSITIVITY','%SQL_CURSOR_STATIC','%SQL_CURSOR_TYPE',
+ '%SQL_CURSOR_TYPE_DEFAULT','%SQL_CUR_DEFAULT','%SQL_CUR_USE_DRIVER','%SQL_CUR_USE_IF_NEEDED','%SQL_CUR_USE_ODBC','%SQL_CU_DML_STATEMENTS','%SQL_CU_INDEX_DEFINITION','%SQL_CU_PRIVILEGE_DEFINITION',
+ '%SQL_CU_PROCEDURE_INVOCATION','%SQL_CU_TABLE_DEFINITION','%SQL_CVT_BIGINT','%SQL_CVT_BINARY','%SQL_CVT_BIT','%SQL_CVT_CHAR','%SQL_CVT_DATE','%SQL_CVT_DECIMAL',
+ '%SQL_CVT_DOUBLE','%SQL_CVT_FLOAT','%SQL_CVT_GUID','%SQL_CVT_INTEGER','%SQL_CVT_INTERVAL_DAY_TIME','%SQL_CVT_INTERVAL_YEAR_MONTH','%SQL_CVT_LONGVARBINARY','%SQL_CVT_LONGVARCHAR',
+ '%SQL_CVT_NUMERIC','%SQL_CVT_REAL','%SQL_CVT_SMALLINT','%SQL_CVT_TIME','%SQL_CVT_TIMESTAMP','%SQL_CVT_TINYINT','%SQL_CVT_VARBINARY','%SQL_CVT_VARCHAR',
+ '%SQL_CVT_WCHAR','%SQL_CVT_WLONGVARCHAR','%SQL_CVT_WVARCHAR','%SQL_CV_CASCADED','%SQL_CV_CHECK_OPTION','%SQL_CV_CREATE_VIEW','%SQL_CV_LOCAL','%SQL_C_BINARY',
+ '%SQL_C_BIT','%SQL_C_BOOKMARK','%SQL_C_CHAR','%SQL_C_DATE','%SQL_C_DEFAULT','%SQL_C_DOUBLE','%SQL_C_FLOAT','%SQL_C_GUID',
+ '%SQL_C_INTERVAL_DAY','%SQL_C_INTERVAL_DAY_TO_HOUR','%SQL_C_INTERVAL_DAY_TO_MINUTE','%SQL_C_INTERVAL_DAY_TO_SECOND','%SQL_C_INTERVAL_HOUR','%SQL_C_INTERVAL_HOUR_TO_MINUTE','%SQL_C_INTERVAL_HOUR_TO_SECOND','%SQL_C_INTERVAL_MINUTE',
+ '%SQL_C_INTERVAL_MINUTE_TO_SECOND','%SQL_C_INTERVAL_MONTH','%SQL_C_INTERVAL_SECOND','%SQL_C_INTERVAL_YEAR','%SQL_C_INTERVAL_YEAR_TO_MONTH','%SQL_C_LONG','%SQL_C_NUMERIC','%SQL_C_SBIGINT',
+ '%SQL_C_SHORT','%SQL_C_SLONG','%SQL_C_SSHORT','%SQL_C_STINYINT','%SQL_C_TIME','%SQL_C_TIMESTAMP','%SQL_C_TINYINT','%SQL_C_TYPE_DATE',
+ '%SQL_C_TYPE_TIME','%SQL_C_TYPE_TIMESTAMP','%SQL_C_UBIGINT','%SQL_C_ULONG','%SQL_C_USHORT','%SQL_C_UTINYINT','%SQL_C_VARBOOKMARK','%SQL_DATABASE_NAME',
+ '%SQL_DATA_AT_EXEC','%SQL_DATA_SOURCE_NAME','%SQL_DATA_SOURCE_READ_ONLY','%SQL_DATE','%SQL_DATETIME','%SQL_DATETIME_LITERALS','%SQL_DATE_LEN','%SQL_DAY',
+ '%SQL_DAY_TO_HOUR','%SQL_DAY_TO_MINUTE','%SQL_DAY_TO_SECOND','%SQL_DA_DROP_ASSERTION','%SQL_DBMS_NAME','%SQL_DBMS_VER','%SQL_DB_DEFAULT','%SQL_DB_DISCONNECT',
+ '%SQL_DB_RETURN_TO_POOL','%SQL_DCS_DROP_CHARACTER_SET','%SQL_DC_DROP_COLLATION','%SQL_DDL_INDEX','%SQL_DD_CASCADE','%SQL_DD_DROP_DOMAIN','%SQL_DD_RESTRICT','%SQL_DECIMAL',
+ '%SQL_DEFAULT','%SQL_DEFAULT_PARAM','%SQL_DEFAULT_TXN_ISOLATION','%SQL_DELETE','%SQL_DELETE_BY_BOOKMARK','%SQL_DESCRIBE_PARAMETER','%SQL_DESC_ALLOC_AUTO','%SQL_DESC_ALLOC_TYPE',
+ '%SQL_DESC_ALLOC_USER','%SQL_DESC_ARRAY_SIZE','%SQL_DESC_ARRAY_STATUS_PTR','%SQL_DESC_AUTO_UNIQUE_VALUE','%SQL_DESC_BASE_COLUMN_NAME','%SQL_DESC_BASE_TABLE_NAME','%SQL_DESC_BIND_OFFSET_PTR','%SQL_DESC_BIND_TYPE',
+ '%SQL_DESC_CASE_SENSITIVE','%SQL_DESC_CATALOG_NAME','%SQL_DESC_CONCISE_TYPE','%SQL_DESC_COUNT','%SQL_DESC_DATA_PTR','%SQL_DESC_DATETIME_INTERVAL_CODE','%SQL_DESC_DATETIME_INTERVAL_PRECISION','%SQL_DESC_DISPLAY_SIZE',
+ '%SQL_DESC_FIXED_PREC_SCALE','%SQL_DESC_INDICATOR_PTR','%SQL_DESC_LABEL','%SQL_DESC_LENGTH','%SQL_DESC_LITERAL_PREFIX','%SQL_DESC_LITERAL_SUFFIX','%SQL_DESC_LOCAL_TYPE_NAME','%SQL_DESC_MAXIMUM_SCALE',
+ '%SQL_DESC_MINIMUM_SCALE','%SQL_DESC_NAME','%SQL_DESC_NULLABLE','%SQL_DESC_NUM_PREC_RADIX','%SQL_DESC_OCTET_LENGTH','%SQL_DESC_OCTET_LENGTH_PTR','%SQL_DESC_PARAMETER_TYPE','%SQL_DESC_PRECISION',
+ '%SQL_DESC_ROWS_PROCESSED_PTR','%SQL_DESC_SCALE','%SQL_DESC_SCHEMA_NAME','%SQL_DESC_SEARCHABLE','%SQL_DESC_TABLE_NAME','%SQL_DESC_TYPE','%SQL_DESC_TYPE_NAME','%SQL_DESC_UNNAMED',
+ '%SQL_DESC_UNSIGNED','%SQL_DESC_UPDATABLE','%SQL_DIAG_ALTER_TABLE','%SQL_DIAG_CALL','%SQL_DIAG_CLASS_ORIGIN','%SQL_DIAG_COLUMN_NUMBER','%SQL_DIAG_CONNECTION_NAME','%SQL_DIAG_CREATE_INDEX',
+ '%SQL_DIAG_CREATE_TABLE','%SQL_DIAG_CREATE_VIEW','%SQL_DIAG_CURSOR_ROW_COUNT','%SQL_DIAG_DELETE_WHERE','%SQL_DIAG_DROP_INDEX','%SQL_DIAG_DROP_TABLE','%SQL_DIAG_DROP_VIEW','%SQL_DIAG_DYNAMIC_DELETE_CURSOR',
+ '%SQL_DIAG_DYNAMIC_FUNCTION','%SQL_DIAG_DYNAMIC_FUNCTION_CODE','%SQL_DIAG_DYNAMIC_UPDATE_CURSOR','%SQL_DIAG_GRANT','%SQL_DIAG_INSERT','%SQL_DIAG_MESSAGE_TEXT','%SQL_DIAG_NATIVE','%SQL_DIAG_NUMBER',
+ '%SQL_DIAG_RETURNCODE','%SQL_DIAG_REVOKE','%SQL_DIAG_ROW_COUNT','%SQL_DIAG_ROW_NUMBER','%SQL_DIAG_SELECT_CURSOR','%SQL_DIAG_SERVER_NAME','%SQL_DIAG_SQLSTATE','%SQL_DIAG_SUBCLASS_ORIGIN',
+ '%SQL_DIAG_UNKNOWN_STATEMENT','%SQL_DIAG_UPDATE_WHERE','%SQL_DI_CREATE_INDEX','%SQL_DI_DROP_INDEX','%SQL_DL_SQL92_DATE','%SQL_DL_SQL92_INTERVAL_DAY','%SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR','%SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE',
+ '%SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND','%SQL_DL_SQL92_INTERVAL_HOUR','%SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE','%SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND','%SQL_DL_SQL92_INTERVAL_MINUTE','%SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND','%SQL_DL_SQL92_INTERVAL_MONTH','%SQL_DL_SQL92_INTERVAL_SECOND',
+ '%SQL_DL_SQL92_INTERVAL_YEAR','%SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH','%SQL_DL_SQL92_TIME','%SQL_DL_SQL92_TIMESTAMP','%SQL_DM_VER','%SQL_DOUBLE','%SQL_DRIVER_COMPLETE','%SQL_DRIVER_COMPLETE_REQUIRED',
+ '%SQL_DRIVER_HDBC','%SQL_DRIVER_HDESC','%SQL_DRIVER_HENV','%SQL_DRIVER_HLIB','%SQL_DRIVER_HSTMT','%SQL_DRIVER_NAME','%SQL_DRIVER_NOPROMPT','%SQL_DRIVER_ODBC_VER',
+ '%SQL_DRIVER_PROMPT','%SQL_DRIVER_VER','%SQL_DROP','%SQL_DROP_ASSERTION','%SQL_DROP_CHARACTER_SET','%SQL_DROP_COLLATION','%SQL_DROP_DOMAIN','%SQL_DROP_SCHEMA',
+ '%SQL_DROP_TABLE','%SQL_DROP_TRANSLATION','%SQL_DROP_VIEW','%SQL_DS_CASCADE','%SQL_DS_DROP_SCHEMA','%SQL_DS_RESTRICT','%SQL_DTC_DONE','%SQL_DTC_ENLIST_EXPENSIVE',
+ '%SQL_DTC_TRANSITION_COST','%SQL_DTC_UNENLIST_EXPENSIVE','%SQL_DTR_DROP_TRANSLATION','%SQL_DT_CASCADE','%SQL_DT_DROP_TABLE','%SQL_DT_RESTRICT','%SQL_DV_CASCADE','%SQL_DV_DROP_VIEW',
+ '%SQL_DV_RESTRICT','%SQL_DYNAMIC_CURSOR_ATTRIBUTES1','%SQL_DYNAMIC_CURSOR_ATTRIBUTES2','%SQL_ENSURE','%SQL_ENTIRE_ROWSET','%SQL_ERROR','%SQL_EXPRESSIONS_IN_ORDERBY','%SQL_FALSE',
+ '%SQL_FD_FETCH_ABSOLUTE','%SQL_FD_FETCH_BOOKMARK','%SQL_FD_FETCH_FIRST','%SQL_FD_FETCH_LAST','%SQL_FD_FETCH_NEXT','%SQL_FD_FETCH_PREV','%SQL_FD_FETCH_PRIOR','%SQL_FD_FETCH_RELATIVE',
+ '%SQL_FETCH_ABSOLUTE','%SQL_FETCH_BOOKMARK','%SQL_FETCH_BY_BOOKMARK','%SQL_FETCH_DIRECTION','%SQL_FETCH_FIRST','%SQL_FETCH_FIRST_SYSTEM','%SQL_FETCH_FIRST_USER','%SQL_FETCH_LAST',
+ '%SQL_FETCH_NEXT','%SQL_FETCH_PREV','%SQL_FETCH_PRIOR','%SQL_FETCH_RELATIVE','%SQL_FILE_CATALOG','%SQL_FILE_NOT_SUPPORTED','%SQL_FILE_QUALIFIER','%SQL_FILE_TABLE',
+ '%SQL_FILE_USAGE','%SQL_FLOAT','%SQL_FN_CVT_CAST','%SQL_FN_CVT_CONVERT','%SQL_FN_NUM_ABS','%SQL_FN_NUM_ACOS','%SQL_FN_NUM_ASIN','%SQL_FN_NUM_ATAN',
+ '%SQL_FN_NUM_ATAN2','%SQL_FN_NUM_CEILING','%SQL_FN_NUM_COS','%SQL_FN_NUM_COT','%SQL_FN_NUM_DEGREES','%SQL_FN_NUM_EXP','%SQL_FN_NUM_FLOOR','%SQL_FN_NUM_LOG',
+ '%SQL_FN_NUM_LOG10','%SQL_FN_NUM_MOD','%SQL_FN_NUM_PI','%SQL_FN_NUM_POWER','%SQL_FN_NUM_RADIANS','%SQL_FN_NUM_RAND','%SQL_FN_NUM_ROUND','%SQL_FN_NUM_SIGN',
+ '%SQL_FN_NUM_SIN','%SQL_FN_NUM_SQRT','%SQL_FN_NUM_TAN','%SQL_FN_NUM_TRUNCATE','%SQL_FN_STR_ASCII','%SQL_FN_STR_BIT_LENGTH','%SQL_FN_STR_CHAR','%SQL_FN_STR_CHARACTER_LENGTH',
+ '%SQL_FN_STR_CHAR_LENGTH','%SQL_FN_STR_CONCAT','%SQL_FN_STR_DIFFERENCE','%SQL_FN_STR_INSERT','%SQL_FN_STR_LCASE','%SQL_FN_STR_LEFT','%SQL_FN_STR_LENGTH','%SQL_FN_STR_LOCATE',
+ '%SQL_FN_STR_LOCATE_2','%SQL_FN_STR_LTRIM','%SQL_FN_STR_OCTET_LENGTH','%SQL_FN_STR_POSITION','%SQL_FN_STR_REPEAT','%SQL_FN_STR_REPLACE','%SQL_FN_STR_RIGHT','%SQL_FN_STR_RTRIM',
+ '%SQL_FN_STR_SOUNDEX','%SQL_FN_STR_SPACE','%SQL_FN_STR_SUBSTRING','%SQL_FN_STR_UCASE','%SQL_FN_SYS_DBNAME','%SQL_FN_SYS_IFNULL','%SQL_FN_SYS_USERNAME','%SQL_FN_TD_CURDATE',
+ '%SQL_FN_TD_CURRENT_DATE','%SQL_FN_TD_CURRENT_TIME','%SQL_FN_TD_CURRENT_TIMESTAMP','%SQL_FN_TD_CURTIME','%SQL_FN_TD_DAYNAME','%SQL_FN_TD_DAYOFMONTH','%SQL_FN_TD_DAYOFWEEK','%SQL_FN_TD_DAYOFYEAR',
+ '%SQL_FN_TD_EXTRACT','%SQL_FN_TD_HOUR','%SQL_FN_TD_MINUTE','%SQL_FN_TD_MONTH','%SQL_FN_TD_MONTHNAME','%SQL_FN_TD_NOW','%SQL_FN_TD_QUARTER','%SQL_FN_TD_SECOND',
+ '%SQL_FN_TD_TIMESTAMPADD','%SQL_FN_TD_TIMESTAMPDIFF','%SQL_FN_TD_WEEK','%SQL_FN_TD_YEAR','%SQL_FN_TSI_DAY','%SQL_FN_TSI_FRAC_SECOND','%SQL_FN_TSI_HOUR','%SQL_FN_TSI_MINUTE',
+ '%SQL_FN_TSI_MONTH','%SQL_FN_TSI_QUARTER','%SQL_FN_TSI_SECOND','%SQL_FN_TSI_WEEK','%SQL_FN_TSI_YEAR','%SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1','%SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2','%SQL_GB_COLLATE',
+ '%SQL_GB_GROUP_BY_CONTAINS_SELECT','%SQL_GB_GROUP_BY_EQUALS_SELECT','%SQL_GB_NOT_SUPPORTED','%SQL_GB_NO_RELATION','%SQL_GD_ANY_COLUMN','%SQL_GD_ANY_ORDER','%SQL_GD_BLOCK','%SQL_GD_BOUND',
+ '%SQL_GETDATA_EXTENSIONS','%SQL_GET_BOOKMARK','%SQL_GROUP_BY','%SQL_GUID','%SQL_HANDLE_DBC','%SQL_HANDLE_DESC','%SQL_HANDLE_ENV','%SQL_HANDLE_SENV',
+ '%SQL_HANDLE_STMT','%SQL_HOUR','%SQL_HOUR_TO_MINUTE','%SQL_HOUR_TO_SECOND','%SQL_IC_LOWER','%SQL_IC_MIXED','%SQL_IC_SENSITIVE','%SQL_IC_UPPER',
+ '%SQL_IDENTIFIER_CASE','%SQL_IDENTIFIER_QUOTE_CHAR','%SQL_IGNORE','%SQL_IK_ALL','%SQL_IK_ASC','%SQL_IK_DESC','%SQL_IK_NONE','%SQL_INDEX_ALL',
+ '%SQL_INDEX_CLUSTERED','%SQL_INDEX_HASHED','%SQL_INDEX_KEYWORDS','%SQL_INDEX_OTHER','%SQL_INDEX_UNIQUE','%SQL_INFO_FIRST','%SQL_INFO_SCHEMA_VIEWS','%SQL_INITIALLY_DEFERRED',
+ '%SQL_INITIALLY_IMMEDIATE','%SQL_INSENSITIVE','%SQL_INSERT_STATEMENT','%SQL_INTEGER','%SQL_INTEGRITY','%SQL_INTERVAL','%SQL_INTERVAL_DAY','%SQL_INTERVAL_DAY_TO_HOUR',
+ '%SQL_INTERVAL_DAY_TO_MINUTE','%SQL_INTERVAL_DAY_TO_SECOND','%SQL_INTERVAL_HOUR','%SQL_INTERVAL_HOUR_TO_MINUTE','%SQL_INTERVAL_HOUR_TO_SECOND','%SQL_INTERVAL_MINUTE','%SQL_INTERVAL_MINUTE_TO_SECOND','%SQL_INTERVAL_MONTH',
+ '%SQL_INTERVAL_SECOND','%SQL_INTERVAL_YEAR','%SQL_INTERVAL_YEAR_TO_MONTH','%SQL_INVALID_HANDLE','%SQL_ISV_ASSERTIONS','%SQL_ISV_CHARACTER_SETS','%SQL_ISV_CHECK_CONSTRAINTS','%SQL_ISV_COLLATIONS',
+ '%SQL_ISV_COLUMNS','%SQL_ISV_COLUMN_DOMAIN_USAGE','%SQL_ISV_COLUMN_PRIVILEGES','%SQL_ISV_CONSTRAINT_COLUMN_USAGE','%SQL_ISV_CONSTRAINT_TABLE_USAGE','%SQL_ISV_DOMAINS','%SQL_ISV_DOMAIN_CONSTRAINTS','%SQL_ISV_KEY_COLUMN_USAGE',
+ '%SQL_ISV_REFERENTIAL_CONSTRAINTS','%SQL_ISV_SCHEMATA','%SQL_ISV_SQL_LANGUAGES','%SQL_ISV_TABLES','%SQL_ISV_TABLE_CONSTRAINTS','%SQL_ISV_TABLE_PRIVILEGES','%SQL_ISV_TRANSLATIONS','%SQL_ISV_USAGE_PRIVILEGES',
+ '%SQL_ISV_VIEWS','%SQL_ISV_VIEW_COLUMN_USAGE','%SQL_ISV_VIEW_TABLE_USAGE','%SQL_IS_DAY','%SQL_IS_DAY_TO_HOUR','%SQL_IS_DAY_TO_MINUTE','%SQL_IS_DAY_TO_SECOND','%SQL_IS_HOUR',
+ '%SQL_IS_HOUR_TO_MINUTE','%SQL_IS_HOUR_TO_SECOND','%SQL_IS_INSERT_LITERALS','%SQL_IS_INSERT_SEARCHED','%SQL_IS_INTEGER','%SQL_IS_MINUTE','%SQL_IS_MINUTE_TO_SECOND','%SQL_IS_MONTH',
+ '%SQL_IS_POINTER','%SQL_IS_SECOND','%SQL_IS_SELECT_INTO','%SQL_IS_SMALLINT','%SQL_IS_UINTEGER','%SQL_IS_USMALLINT','%SQL_IS_YEAR','%SQL_IS_YEAR_TO_MONTH',
+ '%SQL_KEYSET_CURSOR_ATTRIBUTES1','%SQL_KEYSET_CURSOR_ATTRIBUTES2','%SQL_KEYSET_SIZE','%SQL_KEYSET_SIZE_DEFAULT','%SQL_KEYWORDS','%SQL_LCK_EXCLUSIVE','%SQL_LCK_NO_CHANGE','%SQL_LCK_UNLOCK',
+ '%SQL_LEN_BINARY_ATTR_OFFSET','%SQL_LEN_DATA_AT_EXEC_OFFSET','%SQL_LIKE_ESCAPE_CLAUSE','%SQL_LIKE_ONLY','%SQL_LOCK_EXCLUSIVE','%SQL_LOCK_NO_CHANGE','%SQL_LOCK_TYPES','%SQL_LOCK_UNLOCK',
+ '%SQL_LOGIN_TIMEOUT','%SQL_LOGIN_TIMEOUT_DEFAULT','%SQL_LONGVARBINARY','%SQL_LONGVARCHAR','%SQL_MAXIMUM_CATALOG_NAME_LENGTH','%SQL_MAXIMUM_COLUMNS_IN_GROUP_BY','%SQL_MAXIMUM_COLUMNS_IN_INDEX','%SQL_MAXIMUM_COLUMNS_IN_ORDER_BY',
+ '%SQL_MAXIMUM_COLUMNS_IN_SELECT','%SQL_MAXIMUM_COLUMN_NAME_LENGTH','%SQL_MAXIMUM_CONCURRENT_ACTIVITIES','%SQL_MAXIMUM_CURSOR_NAME_LENGTH','%SQL_MAXIMUM_DRIVER_CONNECTIONS','%SQL_MAXIMUM_IDENTIFIER_LENGTH','%SQL_MAXIMUM_INDEX_SIZE','%SQL_MAXIMUM_ROW_SIZE',
+ '%SQL_MAXIMUM_SCHEMA_NAME_LENGTH','%SQL_MAXIMUM_STATEMENT_LENGTH','%SQL_MAXIMUM_TABLES_IN_SELECT','%SQL_MAXIMUM_USER_NAME_LENGTH','%SQL_MAX_ASYNC_CONCURRENT_STATEMENTS','%SQL_MAX_BINARY_LITERAL_LEN','%SQL_MAX_CATALOG_NAME_LEN','%SQL_MAX_CHAR_LITERAL_LEN',
+ '%SQL_MAX_COLUMNS_IN_GROUP_BY','%SQL_MAX_COLUMNS_IN_INDEX','%SQL_MAX_COLUMNS_IN_ORDER_BY','%SQL_MAX_COLUMNS_IN_SELECT','%SQL_MAX_COLUMNS_IN_TABLE','%SQL_MAX_COLUMN_NAME_LEN','%SQL_MAX_CONCURRENT_ACTIVITIES','%SQL_MAX_CURSOR_NAME_LEN',
+ '%SQL_MAX_DRIVER_CONNECTIONS','%SQL_MAX_DSN_LENGTH','%SQL_MAX_IDENTIFIER_LEN','%SQL_MAX_INDEX_SIZE','%SQL_MAX_LENGTH','%SQL_MAX_LENGTH_DEFAULT','%SQL_MAX_MESSAGE_LENGTH','%SQL_MAX_NUMERIC_LEN',
+ '%SQL_MAX_OPTION_STRING_LENGTH','%SQL_MAX_OWNER_NAME_LEN','%SQL_MAX_PROCEDURE_NAME_LEN','%SQL_MAX_QUALIFIER_NAME_LEN','%SQL_MAX_ROWS','%SQL_MAX_ROWS_DEFAULT','%SQL_MAX_ROW_SIZE','%SQL_MAX_ROW_SIZE_INCLUDES_LONG',
+ '%SQL_MAX_SCHEMA_NAME_LEN','%SQL_MAX_STATEMENT_LEN','%SQL_MAX_TABLES_IN_SELECT','%SQL_MAX_TABLE_NAME_LEN','%SQL_MAX_USER_NAME_LEN','%SQL_MINUTE','%SQL_MINUTE_TO_SECOND','%SQL_MODE_DEFAULT',
+ '%SQL_MODE_READ_ONLY','%SQL_MODE_READ_WRITE','%SQL_MONTH','%SQL_MULTIPLE_ACTIVE_TXN','%SQL_MULT_RESULT_SETS','%SQL_NAMED','%SQL_NC_END','%SQL_NC_HIGH',
+ '%SQL_NC_LOW','%SQL_NC_START','%SQL_NEED_DATA','%SQL_NEED_LONG_DATA_LEN','%SQL_NNC_NON_NULL','%SQL_NNC_NULL','%SQL_NONSCROLLABLE','%SQL_NON_NULLABLE_COLUMNS',
+ '%SQL_NOSCAN','%SQL_NOSCAN_DEFAULT','%SQL_NOSCAN_OFF','%SQL_NOSCAN_ON','%SQL_NOT_DEFERRABLE','%SQL_NO_ACTION','%SQL_NO_COLUMN_NUMBER','%SQL_NO_DATA',
+ '%SQL_NO_DATA_FOUND','%SQL_NO_NULLS','%SQL_NO_ROW_NUMBER','%SQL_NO_TOTAL','%SQL_NTS','%SQL_NTSL','%SQL_NULLABLE','%SQL_NULLABLE_UNKNOWN',
+ '%SQL_NULL_COLLATION','%SQL_NULL_DATA','%SQL_NULL_HANDLE','%SQL_NULL_HDBC','%SQL_NULL_HDESC','%SQL_NULL_HENV','%SQL_NULL_HSTMT','%SQL_NUMERIC',
+ '%SQL_NUMERIC_FUNCTIONS','%SQL_OAC_LEVEL1','%SQL_OAC_LEVEL2','%SQL_OAC_NONE','%SQL_ODBC_API_CONFORMANCE','%SQL_ODBC_CURSORS','%SQL_ODBC_INTERFACE_CONFORMANCE','%SQL_ODBC_SAG_CLI_CONFORMANCE',
+ '%SQL_ODBC_SQL_CONFORMANCE','%SQL_ODBC_SQL_OPT_IEF','%SQL_ODBC_VER','%SQL_OIC_CORE','%SQL_OIC_LEVEL1','%SQL_OIC_LEVEL2','%SQL_OJ_ALL_COMPARISON_OPS','%SQL_OJ_CAPABILITIES',
+ '%SQL_OJ_FULL','%SQL_OJ_INNER','%SQL_OJ_LEFT','%SQL_OJ_NESTED','%SQL_OJ_NOT_ORDERED','%SQL_OJ_RIGHT','%SQL_OPT_TRACE','%SQL_OPT_TRACEFILE',
+ '%SQL_OPT_TRACE_DEFAULT','%SQL_OPT_TRACE_OFF','%SQL_OPT_TRACE_ON','%SQL_ORDER_BY_COLUMNS_IN_SELECT','%SQL_OSCC_COMPLIANT','%SQL_OSCC_NOT_COMPLIANT','%SQL_OSC_CORE','%SQL_OSC_EXTENDED',
+ '%SQL_OSC_MINIMUM','%SQL_OUTER_JOINS','%SQL_OUTER_JOIN_CAPABILITIES','%SQL_OU_DML_STATEMENTS','%SQL_OU_INDEX_DEFINITION','%SQL_OU_PRIVILEGE_DEFINITION','%SQL_OU_PROCEDURE_INVOCATION','%SQL_OU_TABLE_DEFINITION',
+ '%SQL_OV_ODBC2','%SQL_OV_ODBC3','%SQL_OWNER_TERM','%SQL_OWNER_USAGE','%SQL_PACKET_SIZE','%SQL_PARAM_ARRAY_ROW_COUNTS','%SQL_PARAM_ARRAY_SELECTS','%SQL_PARAM_BIND_BY_COLUMN',
+ '%SQL_PARAM_BIND_TYPE_DEFAULT','%SQL_PARAM_DIAG_UNAVAILABLE','%SQL_PARAM_ERROR','%SQL_PARAM_IGNORE','%SQL_PARAM_INPUT','%SQL_PARAM_INPUT_OUTPUT','%SQL_PARAM_OUTPUT','%SQL_PARAM_PROCEED',
+ '%SQL_PARAM_SUCCESS','%SQL_PARAM_SUCCESS_WITH_INFO','%SQL_PARAM_TYPE_DEFAULT','%SQL_PARAM_TYPE_UNKNOWN','%SQL_PARAM_UNUSED','%SQL_PARC_BATCH','%SQL_PARC_NO_BATCH','%SQL_PAS_BATCH',
+ '%SQL_PAS_NO_BATCH','%SQL_PAS_NO_SELECT','%SQL_PC_NON_PSEUDO','%SQL_PC_NOT_PSEUDO','%SQL_PC_PSEUDO','%SQL_PC_UNKNOWN','%SQL_POSITION','%SQL_POSITIONED_STATEMENTS',
+ '%SQL_POS_ADD','%SQL_POS_DELETE','%SQL_POS_OPERATIONS','%SQL_POS_POSITION','%SQL_POS_REFRESH','%SQL_POS_UPDATE','%SQL_PRED_BASIC','%SQL_PRED_CHAR',
+ '%SQL_PRED_NONE','%SQL_PRED_SEARCHABLE','%SQL_PROCEDURES','%SQL_PROCEDURE_TERM','%SQL_PS_POSITIONED_DELETE','%SQL_PS_POSITIONED_UPDATE','%SQL_PS_SELECT_FOR_UPDATE','%SQL_PT_FUNCTION',
+ '%SQL_PT_PROCEDURE','%SQL_PT_UNKNOWN','%SQL_QL_END','%SQL_QL_START','%SQL_QUALIFIER_LOCATION','%SQL_QUALIFIER_NAME_SEPARATOR','%SQL_QUALIFIER_TERM','%SQL_QUALIFIER_USAGE',
+ '%SQL_QUERY_TIMEOUT','%SQL_QUERY_TIMEOUT_DEFAULT','%SQL_QUICK','%SQL_QUIET_MODE','%SQL_QUOTED_IDENTIFIER_CASE','%SQL_QU_DML_STATEMENTS','%SQL_QU_INDEX_DEFINITION','%SQL_QU_PRIVILEGE_DEFINITION',
+ '%SQL_QU_PROCEDURE_INVOCATION','%SQL_QU_TABLE_DEFINITION','%SQL_RD_DEFAULT','%SQL_RD_OFF','%SQL_RD_ON','%SQL_REAL','%SQL_REFRESH','%SQL_RESET_PARAMS',
+ '%SQL_RESTRICT','%SQL_RESULT_COL','%SQL_RETRIEVE_DATA','%SQL_RETURN_VALUE','%SQL_ROLLBACK','%SQL_ROWSET_SIZE','%SQL_ROWSET_SIZE_DEFAULT','%SQL_ROWVER',
+ '%SQL_ROW_ADDED','%SQL_ROW_DELETED','%SQL_ROW_ERROR','%SQL_ROW_IDENTIFIER','%SQL_ROW_IGNORE','%SQL_ROW_NOROW','%SQL_ROW_NUMBER','%SQL_ROW_NUMBER_UNKNOWN',
+ '%SQL_ROW_PROCEED','%SQL_ROW_SUCCESS','%SQL_ROW_SUCCESS_WITH_INFO','%SQL_ROW_UPDATED','%SQL_ROW_UPDATES','%SQL_SCCO_LOCK','%SQL_SCCO_OPT_ROWVER','%SQL_SCCO_OPT_TIMESTAMP',
+ '%SQL_SCCO_OPT_VALUES','%SQL_SCCO_READ_ONLY','%SQL_SCC_ISO92_CLI','%SQL_SCC_XOPEN_CLI_VERSION1','%SQL_SCHEMA_TERM','%SQL_SCHEMA_USAGE','%SQL_SCOPE_CURROW','%SQL_SCOPE_SESSION',
+ '%SQL_SCOPE_TRANSACTION','%SQL_SCROLLABLE','%SQL_SCROLL_CONCURRENCY','%SQL_SCROLL_DYNAMIC','%SQL_SCROLL_FORWARD_ONLY','%SQL_SCROLL_KEYSET_DRIVEN','%SQL_SCROLL_OPTIONS','%SQL_SCROLL_STATIC',
+ '%SQL_SC_FIPS127_2_TRANSITIONAL','%SQL_SC_NON_UNIQUE','%SQL_SC_SQL92_ENTRY','%SQL_SC_SQL92_FULL','%SQL_SC_SQL92_INTERMEDIATE','%SQL_SC_TRY_UNIQUE','%SQL_SC_UNIQUE','%SQL_SDF_CURRENT_DATE',
+ '%SQL_SDF_CURRENT_TIME','%SQL_SDF_CURRENT_TIMESTAMP','%SQL_SEARCHABLE','%SQL_SEARCH_PATTERN_ESCAPE','%SQL_SECOND','%SQL_SENSITIVE','%SQL_SERVER_NAME','%SQL_SETPARAM_VALUE_MAX',
+ '%SQL_SETPOS_MAX_LOCK_VALUE','%SQL_SETPOS_MAX_OPTION_VALUE','%SQL_SET_DEFAULT','%SQL_SET_NULL','%SQL_SFKD_CASCADE','%SQL_SFKD_NO_ACTION','%SQL_SFKD_SET_DEFAULT','%SQL_SFKD_SET_NULL',
+ '%SQL_SFKU_CASCADE','%SQL_SFKU_NO_ACTION','%SQL_SFKU_SET_DEFAULT','%SQL_SFKU_SET_NULL','%SQL_SG_DELETE_TABLE','%SQL_SG_INSERT_COLUMN','%SQL_SG_INSERT_TABLE','%SQL_SG_REFERENCES_COLUMN',
+ '%SQL_SG_REFERENCES_TABLE','%SQL_SG_SELECT_TABLE','%SQL_SG_UPDATE_COLUMN','%SQL_SG_UPDATE_TABLE','%SQL_SG_USAGE_ON_CHARACTER_SET','%SQL_SG_USAGE_ON_COLLATION','%SQL_SG_USAGE_ON_DOMAIN','%SQL_SG_USAGE_ON_TRANSLATION',
+ '%SQL_SG_WITH_GRANT_OPTION','%SQL_SIGNED_OFFSET','%SQL_SIMULATE_CURSOR','%SQL_SMALLINT','%SQL_SNVF_BIT_LENGTH','%SQL_SNVF_CHARACTER_LENGTH','%SQL_SNVF_CHAR_LENGTH','%SQL_SNVF_EXTRACT',
+ '%SQL_SNVF_OCTET_LENGTH','%SQL_SNVF_POSITION','%SQL_SO_DYNAMIC','%SQL_SO_FORWARD_ONLY','%SQL_SO_KEYSET_DRIVEN','%SQL_SO_MIXED','%SQL_SO_STATIC','%SQL_SPECIAL_CHARACTERS',
+ '%SQL_SPEC_MAJOR','%SQL_SPEC_MINOR','%SQL_SP_BETWEEN','%SQL_SP_COMPARISON','%SQL_SP_EXISTS','%SQL_SP_IN','%SQL_SP_ISNOTNULL','%SQL_SP_ISNULL',
+ '%SQL_SP_LIKE','%SQL_SP_MATCH_FULL','%SQL_SP_MATCH_PARTIAL','%SQL_SP_MATCH_UNIQUE_FULL','%SQL_SP_MATCH_UNIQUE_PARTIAL','%SQL_SP_OVERLAPS','%SQL_SP_QUANTIFIED_COMPARISON','%SQL_SP_UNIQUE',
+ '%SQL_SQL92_DATETIME_FUNCTIONS','%SQL_SQL92_FOREIGN_KEY_DELETE_RULE','%SQL_SQL92_FOREIGN_KEY_UPDATE_RULE','%SQL_SQL92_GRANT','%SQL_SQL92_NUMERIC_VALUE_FUNCTIONS','%SQL_SQL92_PREDICATES','%SQL_SQL92_RELATIONAL_JOIN_OPERATORS','%SQL_SQL92_REVOKE',
+ '%SQL_SQL92_ROW_VALUE_CONSTRUCTOR','%SQL_SQL92_STRING_FUNCTIONS','%SQL_SQL92_VALUE_EXPRESSIONS','%SQL_SQLSTATE_SIZE','%SQL_SQL_CONFORMANCE','%SQL_SQ_COMPARISON','%SQL_SQ_CORRELATED_SUBQUERIES','%SQL_SQ_EXISTS',
+ '%SQL_SQ_IN','%SQL_SQ_QUANTIFIED','%SQL_SRJO_CORRESPONDING_CLAUSE','%SQL_SRJO_CROSS_JOIN','%SQL_SRJO_EXCEPT_JOIN','%SQL_SRJO_FULL_OUTER_JOIN','%SQL_SRJO_INNER_JOIN','%SQL_SRJO_INTERSECT_JOIN',
+ '%SQL_SRJO_LEFT_OUTER_JOIN','%SQL_SRJO_NATURAL_JOIN','%SQL_SRJO_RIGHT_OUTER_JOIN','%SQL_SRJO_UNION_JOIN','%SQL_SRVC_DEFAULT','%SQL_SRVC_NULL','%SQL_SRVC_ROW_SUBQUERY','%SQL_SRVC_VALUE_EXPRESSION',
+ '%SQL_SR_CASCADE','%SQL_SR_DELETE_TABLE','%SQL_SR_GRANT_OPTION_FOR','%SQL_SR_INSERT_COLUMN','%SQL_SR_INSERT_TABLE','%SQL_SR_REFERENCES_COLUMN','%SQL_SR_REFERENCES_TABLE','%SQL_SR_RESTRICT',
+ '%SQL_SR_SELECT_TABLE','%SQL_SR_UPDATE_COLUMN','%SQL_SR_UPDATE_TABLE','%SQL_SR_USAGE_ON_CHARACTER_SET','%SQL_SR_USAGE_ON_COLLATION','%SQL_SR_USAGE_ON_DOMAIN','%SQL_SR_USAGE_ON_TRANSLATION','%SQL_SSF_CONVERT',
+ '%SQL_SSF_LOWER','%SQL_SSF_SUBSTRING','%SQL_SSF_TRANSLATE','%SQL_SSF_TRIM_BOTH','%SQL_SSF_TRIM_LEADING','%SQL_SSF_TRIM_TRAILING','%SQL_SSF_UPPER','%SQL_SS_ADDITIONS',
+ '%SQL_SS_DELETIONS','%SQL_SS_UPDATES','%SQL_STANDARD_CLI_CONFORMANCE','%SQL_STATIC_CURSOR_ATTRIBUTES1','%SQL_STATIC_CURSOR_ATTRIBUTES2','%SQL_STATIC_SENSITIVITY','%SQL_STILL_EXECUTING','%SQL_STRING_FUNCTIONS',
+ '%SQL_SUBQUERIES','%SQL_SUCCESS','%SQL_SUCCESS_WITH_INFO','%SQL_SU_DML_STATEMENTS','%SQL_SU_INDEX_DEFINITION','%SQL_SU_PRIVILEGE_DEFINITION','%SQL_SU_PROCEDURE_INVOCATION','%SQL_SU_TABLE_DEFINITION',
+ '%SQL_SVE_CASE','%SQL_SVE_CAST','%SQL_SVE_COALESCE','%SQL_SVE_NULLIF','%SQL_SYSTEM_FUNCTIONS','%SQL_TABLE_STAT','%SQL_TABLE_TERM','%SQL_TC_ALL',
+ '%SQL_TC_DDL_COMMIT','%SQL_TC_DDL_IGNORE','%SQL_TC_DML','%SQL_TC_NONE','%SQL_TIME','%SQL_TIMEDATE_ADD_INTERVALS','%SQL_TIMEDATE_DIFF_INTERVALS','%SQL_TIMEDATE_FUNCTIONS',
+ '%SQL_TIMESTAMP','%SQL_TIMESTAMP_LEN','%SQL_TIME_LEN','%SQL_TINYINT','%SQL_TRANSACTION_CAPABLE','%SQL_TRANSACTION_ISOLATION_OPTION','%SQL_TRANSACTION_READ_COMMITTED','%SQL_TRANSACTION_READ_UNCOMMITTED',
+ '%SQL_TRANSACTION_REPEATABLE_READ','%SQL_TRANSACTION_SERIALIZABLE','%SQL_TRANSLATE_DLL','%SQL_TRANSLATE_OPTION','%SQL_TRUE','%SQL_TXN_CAPABLE','%SQL_TXN_ISOLATION','%SQL_TXN_ISOLATION_OPTION',
+ '%SQL_TXN_READ_COMMITTED','%SQL_TXN_READ_UNCOMMITTED','%SQL_TXN_REPEATABLE_READ','%SQL_TXN_SERIALIZABLE','%SQL_TYPE_DATE','%SQL_TYPE_NULL','%SQL_TYPE_TIME','%SQL_TYPE_TIMESTAMP',
+ '%SQL_UB_DEFAULT','%SQL_UB_FIXED','%SQL_UB_OFF','%SQL_UB_ON','%SQL_UB_VARIABLE','%SQL_UNBIND','%SQL_UNICODE','%SQL_UNICODE_CHAR',
+ '%SQL_UNICODE_LONGVARCHAR','%SQL_UNICODE_VARCHAR','%SQL_UNION','%SQL_UNION_STATEMENT','%SQL_UNKNOWN_TYPE','%SQL_UNNAMED','%SQL_UNSEARCHABLE','%SQL_UNSIGNED_OFFSET',
+ '%SQL_UNSPECIFIED','%SQL_UPDATE','%SQL_UPDATE_BY_BOOKMARK','%SQL_USER_NAME','%SQL_USE_BOOKMARKS','%SQL_US_UNION','%SQL_US_UNION_ALL','%SQL_U_UNION',
+ '%SQL_U_UNION_ALL','%SQL_VARBINARY','%SQL_VARCHAR','%SQL_XOPEN_CLI_YEAR','%SQL_YEAR','%SQL_YEAR_TO_MONTH','%SRCCOPY','%SS_BITMAP',
+ '%SS_BLACKFRAME','%SS_BLACKRECT','%SS_CENTER','%SS_CENTERIMAGE','%SS_ENDELLIPSIS','%SS_ETCHEDFRAME','%SS_ETCHEDHORZ','%SS_ETCHEDVERT',
+ '%SS_GRAYFRAME','%SS_GRAYRECT','%SS_LEFT','%SS_NOPREFIX','%SS_NOTIFY','%SS_NOWORDWRAP','%SS_PATHELLIPSIS','%SS_RIGHT',
+ '%SS_RIGHTJUST','%SS_SIMPLE','%SS_SUNKEN','%SS_WHITEFRAME','%SS_WHITERECT','%SS_WORDELLIPSIS','%STAT_FILL_FROM_MEMORY','%STAT_FILL_NATURAL',
+ '%STAT_FILL_NATURAL_ERASTONE','%STAT_FILL_NATURAL_EVEN','%STAT_FILL_NATURAL_FIBONACCI','%STAT_FILL_NATURAL_ODD','%STAT_FILL_WITH_NUMBER','%STAT_MINMAX_INDEX','%STAT_MINMAX_VALUE','%STAT_TYPE_BYTE',
+ '%STAT_TYPE_CURRENCY','%STAT_TYPE_DOUBLE','%STAT_TYPE_DWORD','%STAT_TYPE_EXT','%STAT_TYPE_INTEGER','%STAT_TYPE_LONG','%STAT_TYPE_QUAD','%STAT_TYPE_SINGLE',
+ '%STAT_TYPE_WORD','%SWP_ASYNCWINDOWPOS','%SWP_DEFERERASE','%SWP_DRAWFRAME','%SWP_FRAMECHANGED','%SWP_HIDEWINDOW','%SWP_NOACTIVATE','%SWP_NOCOPYBITS',
+ '%SWP_NOMOVE','%SWP_NOOWNERZORDER','%SWP_NOREDRAW','%SWP_NOREPOSITION','%SWP_NOSENDCHANGING','%SWP_NOSIZE','%SWP_NOZORDER','%SWP_SHOWWINDOW',
+ '%SW_FORCEMINIMIZE','%SW_HIDE','%SW_MAXIMIZE','%SW_MINIMIZE','%SW_NORMAL','%SW_RESTORE','%SW_SHOW','%SW_SHOWDEFAULT',
+ '%SW_SHOWMAXIMIZED','%SW_SHOWMINIMIZED','%SW_SHOWMINNOACTIVE','%SW_SHOWNA','%SW_SHOWNOACTIVATE','%SW_SHOWNORMAL','%TBASS_3DALG_DEFAULT','%TBASS_3DALG_FULL',
+ '%TBASS_3DALG_LIGHT','%TBASS_3DALG_OFF','%TBASS_3DMODE_NORMAL','%TBASS_3DMODE_OFF','%TBASS_3DMODE_RELATIVE','%TBASS_ACTIVE_PAUSED','%TBASS_ACTIVE_PLAYING','%TBASS_ACTIVE_STALLED',
+ '%TBASS_ACTIVE_STOPPED','%TBASS_CONFIG_3DALGORITHM','%TBASS_CONFIG_BUFFER','%TBASS_CONFIG_CURVE_PAN','%TBASS_CONFIG_CURVE_VOL','%TBASS_CONFIG_FLOATDSP','%TBASS_CONFIG_GVOL_MUSIC','%TBASS_CONFIG_GVOL_SAMPLE',
+ '%TBASS_CONFIG_GVOL_STREAM','%TBASS_CONFIG_MAXVOL','%TBASS_CONFIG_MP3_CODEC','%TBASS_CONFIG_NET_AGENT','%TBASS_CONFIG_NET_BUFFER','%TBASS_CONFIG_NET_PASSIVE','%TBASS_CONFIG_NET_PREBUF','%TBASS_CONFIG_NET_PROXY',
+ '%TBASS_CONFIG_NET_TIMEOUT','%TBASS_CONFIG_PAUSE_NOPLAY','%TBASS_CONFIG_UPDATEPERIOD','%TBASS_CTYPE_MUSIC_IT','%TBASS_CTYPE_MUSIC_MO3','%TBASS_CTYPE_MUSIC_MOD','%TBASS_CTYPE_MUSIC_MTM','%TBASS_CTYPE_MUSIC_S3M',
+ '%TBASS_CTYPE_MUSIC_XM','%TBASS_CTYPE_RECORD','%TBASS_CTYPE_SAMPLE','%TBASS_CTYPE_STREAM','%TBASS_CTYPE_STREAM_AIFF','%TBASS_CTYPE_STREAM_MP1','%TBASS_CTYPE_STREAM_MP2','%TBASS_CTYPE_STREAM_MP3',
+ '%TBASS_CTYPE_STREAM_OGG','%TBASS_CTYPE_STREAM_WAV','%TBASS_CTYPE_STREAM_WAV_FLOAT','%TBASS_CTYPE_STREAM_WAV_PCM','%TBASS_DATA_AVAILABLE','%TBASS_DATA_FFT1024','%TBASS_DATA_FFT2048','%TBASS_DATA_FFT4096',
+ '%TBASS_DATA_FFT512','%TBASS_DATA_FFT_INDIVIDUAL','%TBASS_DATA_FFT_NOWINDOW','%TBASS_DATA_FLOAT','%TBASS_DEVICE_3D','%TBASS_DEVICE_8BITS','%TBASS_DEVICE_LATENCY','%TBASS_DEVICE_MONO',
+ '%TBASS_DEVICE_NOSPEAKER','%TBASS_DEVICE_SPEAKERS','%TBASS_EAX_ENVIRONMENT_ALLEY','%TBASS_EAX_ENVIRONMENT_ARENA','%TBASS_EAX_ENVIRONMENT_AUDITORIUM','%TBASS_EAX_ENVIRONMENT_BATHROOM','%TBASS_EAX_ENVIRONMENT_CARPETEDHALLWAY','%TBASS_EAX_ENVIRONMENT_CAVE',
+ '%TBASS_EAX_ENVIRONMENT_CITY','%TBASS_EAX_ENVIRONMENT_CONCERTHALL','%TBASS_EAX_ENVIRONMENT_COUNT','%TBASS_EAX_ENVIRONMENT_DIZZY','%TBASS_EAX_ENVIRONMENT_DRUGGED','%TBASS_EAX_ENVIRONMENT_FOREST','%TBASS_EAX_ENVIRONMENT_GENERIC','%TBASS_EAX_ENVIRONMENT_HALLWAY',
+ '%TBASS_EAX_ENVIRONMENT_HANGAR','%TBASS_EAX_ENVIRONMENT_LIVINGROOM','%TBASS_EAX_ENVIRONMENT_MOUNTAINS','%TBASS_EAX_ENVIRONMENT_PADDEDCELL','%TBASS_EAX_ENVIRONMENT_PARKINGLOT','%TBASS_EAX_ENVIRONMENT_PLAIN','%TBASS_EAX_ENVIRONMENT_PSYCHOTIC','%TBASS_EAX_ENVIRONMENT_QUARRY',
+ '%TBASS_EAX_ENVIRONMENT_ROOM','%TBASS_EAX_ENVIRONMENT_SEWERPIPE','%TBASS_EAX_ENVIRONMENT_STONECORRIDOR','%TBASS_EAX_ENVIRONMENT_STONEROOM','%TBASS_EAX_ENVIRONMENT_UNDERWATER','%TBASS_ERROR_ALREADY','%TBASS_ERROR_BUFLOST','%TBASS_ERROR_CODEC',
+ '%TBASS_ERROR_CREATE','%TBASS_ERROR_DECODE','%TBASS_ERROR_DEVICE','%TBASS_ERROR_DRIVER','%TBASS_ERROR_DX','%TBASS_ERROR_EMPTY','%TBASS_ERROR_FILEFORM','%TBASS_ERROR_FILEOPEN',
+ '%TBASS_ERROR_FORMAT','%TBASS_ERROR_FREQ','%TBASS_ERROR_HANDLE','%TBASS_ERROR_ILLPARAM','%TBASS_ERROR_ILLTYPE','%TBASS_ERROR_INIT','%TBASS_ERROR_MEM','%TBASS_ERROR_NO3D',
+ '%TBASS_ERROR_NOCHAN','%TBASS_ERROR_NOEAX','%TBASS_ERROR_NOFX','%TBASS_ERROR_NOHW','%TBASS_ERROR_NONET','%TBASS_ERROR_NOPAUSE','%TBASS_ERROR_NOPLAY','%TBASS_ERROR_NOTAVAIL',
+ '%TBASS_ERROR_NOTFILE','%TBASS_ERROR_PLAYING','%TBASS_ERROR_POSITION','%TBASS_ERROR_SPEAKER','%TBASS_ERROR_START','%TBASS_ERROR_TIMEOUT','%TBASS_ERROR_UNKNOWN','%TBASS_ERROR_VERSION',
+ '%TBASS_FALSE','%TBASS_FILEPOS_CURRENT','%TBASS_FILEPOS_DECODE','%TBASS_FILEPOS_DOWNLOAD','%TBASS_FILEPOS_END','%TBASS_FILEPOS_START','%TBASS_FILE_CLOSE','%TBASS_FILE_LEN',
+ '%TBASS_FILE_READ','%TBASS_FILE_SEEK','%TBASS_FX_CHORUS','%TBASS_FX_COMPRESSOR','%TBASS_FX_DISTORTION','%TBASS_FX_ECHO','%TBASS_FX_FLANGER','%TBASS_FX_GARGLE',
+ '%TBASS_FX_I3DL2REVERB','%TBASS_FX_PARAMEQ','%TBASS_FX_PHASE_180','%TBASS_FX_PHASE_90','%TBASS_FX_PHASE_NEG_180','%TBASS_FX_PHASE_NEG_90','%TBASS_FX_PHASE_ZERO','%TBASS_FX_REVERB',
+ '%TBASS_INPUT_LEVEL','%TBASS_INPUT_OFF','%TBASS_INPUT_ON','%TBASS_INPUT_TYPE_ANALOG','%TBASS_INPUT_TYPE_AUX','%TBASS_INPUT_TYPE_CD','%TBASS_INPUT_TYPE_DIGITAL','%TBASS_INPUT_TYPE_LINE',
+ '%TBASS_INPUT_TYPE_MASK','%TBASS_INPUT_TYPE_MIC','%TBASS_INPUT_TYPE_PHONE','%TBASS_INPUT_TYPE_SPEAKER','%TBASS_INPUT_TYPE_SYNTH','%TBASS_INPUT_TYPE_UNDEF','%TBASS_INPUT_TYPE_WAVE','%TBASS_MP3_SETPOS',
+ '%TBASS_MUSIC_3D','%TBASS_MUSIC_ATTRIB_AMPLIFY','%TBASS_MUSIC_ATTRIB_BPM','%TBASS_MUSIC_ATTRIB_PANSEP','%TBASS_MUSIC_ATTRIB_PSCALER','%TBASS_MUSIC_ATTRIB_SPEED','%TBASS_MUSIC_ATTRIB_VOL_CHAN','%TBASS_MUSIC_ATTRIB_VOL_GLOBAL',
+ '%TBASS_MUSIC_ATTRIB_VOL_INST','%TBASS_MUSIC_AUTOFREE','%TBASS_MUSIC_CALCLEN','%TBASS_MUSIC_DECODE','%TBASS_MUSIC_FLOAT','%TBASS_MUSIC_FT2MOD','%TBASS_MUSIC_FX','%TBASS_MUSIC_LOOP',
+ '%TBASS_MUSIC_MONO','%TBASS_MUSIC_NONINTER','%TBASS_MUSIC_NOSAMPLE','%TBASS_MUSIC_POSRESET','%TBASS_MUSIC_POSRESETEX','%TBASS_MUSIC_PRESCAN','%TBASS_MUSIC_PT1MOD','%TBASS_MUSIC_RAMP',
+ '%TBASS_MUSIC_RAMPS','%TBASS_MUSIC_STOPBACK','%TBASS_MUSIC_SURROUND','%TBASS_MUSIC_SURROUND2','%TBASS_OBJECT_DS','%TBASS_OBJECT_DS3DL','%TBASS_OK','%TBASS_RECORD_PAUSE',
+ '%TBASS_SAMPLE_3D','%TBASS_SAMPLE_8BITS','%TBASS_SAMPLE_FLOAT','%TBASS_SAMPLE_FX','%TBASS_SAMPLE_LOOP','%TBASS_SAMPLE_MONO','%TBASS_SAMPLE_MUTEMAX','%TBASS_SAMPLE_OVER_DIST',
+ '%TBASS_SAMPLE_OVER_POS','%TBASS_SAMPLE_OVER_VOL','%TBASS_SAMPLE_SOFTWARE','%TBASS_SAMPLE_VAM','%TBASS_SLIDE_FREQ','%TBASS_SLIDE_PAN','%TBASS_SLIDE_VOL','%TBASS_SPEAKER_CENLFE',
+ '%TBASS_SPEAKER_CENTER','%TBASS_SPEAKER_FRONT','%TBASS_SPEAKER_FRONTLEFT','%TBASS_SPEAKER_FRONTRIGHT','%TBASS_SPEAKER_LEFT','%TBASS_SPEAKER_LFE','%TBASS_SPEAKER_REAR','%TBASS_SPEAKER_REAR2',
+ '%TBASS_SPEAKER_REAR2LEFT','%TBASS_SPEAKER_REAR2RIGHT','%TBASS_SPEAKER_REARLEFT','%TBASS_SPEAKER_REARRIGHT','%TBASS_SPEAKER_RIGHT','%TBASS_STREAMPROC_END','%TBASS_STREAM_AUTOFREE','%TBASS_STREAM_BLOCK',
+ '%TBASS_STREAM_DECODE','%TBASS_STREAM_PRESCAN','%TBASS_STREAM_RESTRATE','%TBASS_STREAM_STATUS','%TBASS_SYNC_DOWNLOAD','%TBASS_SYNC_END','%TBASS_SYNC_FREE','%TBASS_SYNC_MESSAGE',
+ '%TBASS_SYNC_META','%TBASS_SYNC_MIXTIME','%TBASS_SYNC_MUSICFX','%TBASS_SYNC_MUSICINST','%TBASS_SYNC_MUSICPOS','%TBASS_SYNC_ONETIME','%TBASS_SYNC_POS','%TBASS_SYNC_SLIDE',
+ '%TBASS_SYNC_STALL','%TBASS_TAG_HTTP','%TBASS_TAG_ICY','%TBASS_TAG_ID3','%TBASS_TAG_ID3V2','%TBASS_TAG_META','%TBASS_TAG_MUSIC_INST','%TBASS_TAG_MUSIC_MESSAGE',
+ '%TBASS_TAG_MUSIC_NAME','%TBASS_TAG_MUSIC_SAMPLE','%TBASS_TAG_OGG','%TBASS_TAG_RIFF_INFO','%TBASS_TAG_VENDOR','%TBASS_TRUE','%TBASS_UNICODE','%TBASS_VAM_HARDWARE',
+ '%TBASS_VAM_SOFTWARE','%TBASS_VAM_TERM_DIST','%TBASS_VAM_TERM_PRIO','%TBASS_VAM_TERM_TIME','%TBASS_VERSION','%TBCD_CHANNEL','%TBCD_THUMB','%TBCD_TICS',
+ '%TBGL_ALIGN_CENTER','%TBGL_ALIGN_CENTER_CENTER','%TBGL_ALIGN_CENTER_DOWN','%TBGL_ALIGN_CENTER_UP','%TBGL_ALIGN_LEFT','%TBGL_ALIGN_LEFT_CENTER','%TBGL_ALIGN_LEFT_DOWN','%TBGL_ALIGN_LEFT_UP',
+ '%TBGL_ALIGN_RIGHT','%TBGL_ALIGN_RIGHT_CENTER','%TBGL_ALIGN_RIGHT_DOWN','%TBGL_ALIGN_RIGHT_UP','%TBGL_ALWAYS','%TBGL_EQUAL','%TBGL_ERROR_FILE','%TBGL_ERROR_MSGBOX',
+ '%TBGL_ERROR_NONE','%TBGL_GEQUAL','%TBGL_GREATER','%TBGL_LEQUAL','%TBGL_LESS','%TBGL_LIGHT_AMBIENT','%TBGL_LIGHT_CONSTANT_ATTENUATION','%TBGL_LIGHT_DIFFUSE',
+ '%TBGL_LIGHT_LINEAR_ATTENUATION','%TBGL_LIGHT_POSITION','%TBGL_LIGHT_QUADRATIC_ATTENUATION','%TBGL_LIGHT_SPECULAR','%TBGL_LIGHT_SPOT_CUTOFF','%TBGL_LIGHT_SPOT_DIRECTION','%TBGL_LIGHT_SPOT_EXPONENT','%TBGL_M15B',
+ '%TBGL_M15G','%TBGL_M15LAYER','%TBGL_M15PSTOP','%TBGL_M15R','%TBGL_M15TEXN','%TBGL_M15TEXX','%TBGL_M15TEXY','%TBGL_M15X',
+ '%TBGL_M15Y','%TBGL_M15Z','%TBGL_NEVER','%TBGL_NORMAL_NONE','%TBGL_NORMAL_PRECISE','%TBGL_NORMAL_SMOOTH','%TBGL_NOTEQUAL','%TBGL_OBJ_CUBE',
+ '%TBGL_OBJ_CUBE3','%TBGL_OBJ_CYLINDER','%TBGL_OBJ_SPHERE','%TBGL_PINFO_RGB','%TBGL_PINFO_XYZ','%TBGL_TEX_LINEAR','%TBGL_TEX_MIPMAP','%TBGL_TEX_NEAREST',
+ '%TBM_CLEARSEL','%TBM_CLEARTICS','%TBM_GETBUDDY','%TBM_GETCHANNELRECT','%TBM_GETLINESIZE','%TBM_GETNUMTICS','%TBM_GETPAGESIZE','%TBM_GETPOS',
+ '%TBM_GETPTICS','%TBM_GETRANGEMAX','%TBM_GETRANGEMIN','%TBM_GETSELEND','%TBM_GETSELSTART','%TBM_GETTHUMBLENGTH','%TBM_GETTHUMBRECT','%TBM_GETTIC',
+ '%TBM_GETTICPOS','%TBM_GETTOOLTIPS','%TBM_GETUNICODEFORMAT','%TBM_SETBUDDY','%TBM_SETLINESIZE','%TBM_SETPAGESIZE','%TBM_SETPOS','%TBM_SETRANGE',
+ '%TBM_SETRANGEMAX','%TBM_SETRANGEMIN','%TBM_SETSEL','%TBM_SETSELEND','%TBM_SETSELSTART','%TBM_SETTHUMBLENGTH','%TBM_SETTIC','%TBM_SETTICFREQ',
+ '%TBM_SETTIPSIDE','%TBM_SETTOOLTIPS','%TBM_SETUNICODEFORMAT','%TBS_AUTOTICKS','%TBS_BOTH','%TBS_BOTTOM','%TBS_DOWNISLEFT','%TBS_ENABLESELRANGE',
+ '%TBS_FIXEDLENGTH','%TBS_HORZ','%TBS_LEFT','%TBS_NOTHUMB','%TBS_NOTICKS','%TBS_REVERSED','%TBS_RIGHT','%TBS_TOOLTIPS',
+ '%TBS_TOP','%TBS_VERT','%TBTS_BOTTOM','%TBTS_LEFT','%TBTS_RIGHT','%TBTS_TOP','%TB_%VT_BSTR','%TB_%VT_CY',
+ '%TB_%VT_DATE','%TB_%VT_EMPTY','%TB_%VT_I2','%TB_%VT_I4','%TB_%VT_NULL','%TB_%VT_R4','%TB_%VT_R8','%TB_BOTTOM',
+ '%TB_CLASS_E_NOAGGREGATION','%TB_CO_E_CLASSSTRING','%TB_DISPATCH_METHOD','%TB_DISPATCH_PROPERTYGET','%TB_DISPATCH_PROPERTYPUT','%TB_DISPATCH_PROPERTYPUTREF','%TB_ENDTRACK','%TB_E_INVALIDARG',
+ '%TB_E_NOINTERFACE','%TB_E_OUTOFMEMORY','%TB_IMGCTX_ACTUALSIZE','%TB_IMGCTX_AUTOSIZE','%TB_IMGCTX_FITTOHEIGHT','%TB_IMGCTX_FITTOWIDTH','%TB_IMGCTX_STRETCH','%TB_LINEDOWN',
+ '%TB_LINEUP','%TB_MK_E_CONNECTMANUALLY','%TB_MK_E_EXCEEDEDDEADLINE','%TB_MK_E_INTERMEDIATEINTERFACENOTSUPPORTED','%TB_MK_E_NOOBJECT','%TB_MK_E_SYNTAX','%TB_PAGEDOWN','%TB_PAGEUP',
+ '%TB_REGDB_E_CLASSNOTREG','%TB_REGDB_E_WRITEREGDB','%TB_SIZEOF_TBVARIANT','%TB_S_FALSE','%TB_S_OK','%TB_THUMBPOSITION','%TB_THUMBTRACK','%TB_TOP',
+ '%TCM_FIRST','%TCM_GETCURSEL','%TCN_FOCUSCHANGE','%TCN_GETOBJECT','%TCN_SELCHANGE','%TCN_SELCHANGING','%TCS_BOTTOM','%TCS_BUTTONS',
+ '%TCS_EX_FLATSEPARATORS','%TCS_EX_REGISTERDROP','%TCS_FIXEDWIDTH','%TCS_FLATBUTTONS','%TCS_FOCUSNEVER','%TCS_FOCUSONBUTTONDOWN','%TCS_FORCEICONLEFT','%TCS_FORCELABELLEFT',
+ '%TCS_HOTTRACK','%TCS_MULTILINE','%TCS_MULTISELECT','%TCS_OWNERDRAWFIXED','%TCS_RAGGEDRIGHT','%TCS_RIGHT','%TCS_RIGHTJUSTIFY','%TCS_SCROLLOPPOSITE',
+ '%TCS_SINGLELINE','%TCS_TABS','%TCS_TOOLTIPS','%TCS_VERTICAL','%TM_PLAINTEXT','%TM_RICHTEXT','%TOKENIZER_DEFAULT_ALPHA','%TOKENIZER_DEFAULT_DELIM',
+ '%TOKENIZER_DEFAULT_DQUOTE','%TOKENIZER_DEFAULT_NEWLINE','%TOKENIZER_DEFAULT_NUMERIC','%TOKENIZER_DEFAULT_SPACE','%TOKENIZER_DELIMITER','%TOKENIZER_EOL','%TOKENIZER_ERROR','%TOKENIZER_FINISHED',
+ '%TOKENIZER_NUMBER','%TOKENIZER_QUOTE','%TOKENIZER_STRING','%TOKENIZER_UNDEFTOK','%TRUE','%TV_FIRST','%UDM_GETACCEL','%UDM_GETBASE',
+ '%UDM_GETBUDDY','%UDM_GETPOS','%UDM_GETPOS32','%UDM_GETRANGE','%UDM_GETRANGE32','%UDM_GETUNICODEFORMAT','%UDM_SETACCEL','%UDM_SETBASE',
+ '%UDM_SETBUDDY','%UDM_SETPOS','%UDM_SETPOS32','%UDM_SETRANGE','%UDM_SETRANGE32','%UDM_SETUNICODEFORMAT','%UDS_ALIGNLEFT','%UDS_ALIGNRIGHT',
+ '%UDS_ARROWKEYS','%UDS_AUTOBUDDY','%UDS_HORZ','%UDS_HOTTRACK','%UDS_NOTHOUSANDS','%UDS_SETBUDDYINT','%UDS_WRAP','%UD_MAXVAL',
+ '%UD_MINVAL','%VK_0','%VK_1','%VK_2','%VK_3','%VK_4','%VK_5','%VK_6',
+ '%VK_7','%VK_8','%VK_9','%VK_A','%VK_ACCEPT','%VK_ADD','%VK_APPS','%VK_B',
+ '%VK_BACK','%VK_C','%VK_CANCEL','%VK_CAPITAL','%VK_CLEAR','%VK_CONTROL','%VK_CONVERT','%VK_D',
+ '%VK_DECIMAL','%VK_DELETE','%VK_DIVIDE','%VK_DOWN','%VK_E','%VK_END','%VK_ESCAPE','%VK_EXECUTE',
+ '%VK_F','%VK_F1','%VK_F10','%VK_F11','%VK_F12','%VK_F13','%VK_F14','%VK_F15',
+ '%VK_F16','%VK_F17','%VK_F18','%VK_F19','%VK_F2','%VK_F20','%VK_F21','%VK_F22',
+ '%VK_F23','%VK_F24','%VK_F3','%VK_F4','%VK_F5','%VK_F6','%VK_F7','%VK_F8',
+ '%VK_F9','%VK_FINAL','%VK_G','%VK_H','%VK_HANGEUL','%VK_HANGUL','%VK_HANJA','%VK_HELP',
+ '%VK_HOME','%VK_I','%VK_INSERT','%VK_J','%VK_JUNJA','%VK_K','%VK_KANA','%VK_KANJI',
+ '%VK_L','%VK_LBUTTON','%VK_LEFT','%VK_LINEFEED','%VK_LWIN','%VK_M','%VK_MBUTTON','%VK_MENU',
+ '%VK_MODECHANGE','%VK_MULTIPLY','%VK_N','%VK_NEXT','%VK_NONCONVERT','%VK_NUMLOCK','%VK_NUMPAD0','%VK_NUMPAD1',
+ '%VK_NUMPAD2','%VK_NUMPAD3','%VK_NUMPAD4','%VK_NUMPAD5','%VK_NUMPAD6','%VK_NUMPAD7','%VK_NUMPAD8','%VK_NUMPAD9',
+ '%VK_O','%VK_P','%VK_PAUSE','%VK_PGDN','%VK_PGUP','%VK_PRINT','%VK_PRIOR','%VK_Q',
+ '%VK_R','%VK_RBUTTON','%VK_RETURN','%VK_RIGHT','%VK_RWIN','%VK_S','%VK_SCROLL','%VK_SELECT',
+ '%VK_SEPARATOR','%VK_SHIFT','%VK_SLEEP','%VK_SNAPSHOT','%VK_SPACE','%VK_SUBTRACT','%VK_T','%VK_TAB',
+ '%VK_U','%VK_UP','%VK_V','%VK_W','%VK_X','%VK_XBUTTON1','%VK_XBUTTON2','%VK_Y',
+ '%VK_Z','%VT_ARRAY','%VT_BLOB','%VT_BLOB_OBJECT','%VT_BOOL','%VT_BSTR','%VT_BYREF','%VT_CARRAY',
+ '%VT_CF','%VT_CLSID','%VT_CY','%VT_DATE','%VT_DISPATCH','%VT_EMPTY','%VT_ERROR','%VT_FILETIME',
+ '%VT_HRESULT','%VT_I1','%VT_I2','%VT_I4','%VT_I8','%VT_INT','%VT_LPSTR','%VT_LPWSTR',
+ '%VT_NULL','%VT_PTR','%VT_R4','%VT_R8','%VT_RECORD','%VT_RESERVED','%VT_SAFEARRAY','%VT_STORAGE',
+ '%VT_STORED_OBJECT','%VT_STREAM','%VT_STREAMED_OBJECT','%VT_UI1','%VT_UI2','%VT_UI4','%VT_UI8','%VT_UINT',
+ '%VT_UNKNOWN','%VT_USERDEFINED','%VT_VARIANT','%VT_VECTOR','%VT_VOID','%WAVE_FORMAT_1M08','%WAVE_FORMAT_1M16','%WAVE_FORMAT_1S08',
+ '%WAVE_FORMAT_1S16','%WAVE_FORMAT_2M08','%WAVE_FORMAT_2M16','%WAVE_FORMAT_2S08','%WAVE_FORMAT_2S16','%WAVE_FORMAT_4M08','%WAVE_FORMAT_4M16','%WAVE_FORMAT_4S08',
+ '%WAVE_FORMAT_4S16','%WBF_CUSTOM','%WBF_LEVEL1','%WBF_LEVEL2','%WBF_OVERFLOW','%WBF_WORDBREAK','%WBF_WORDWRAP','%WHITE',
+ '%WIN_FINDTITLECONTAIN','%WIN_FINDTITLEEND','%WIN_FINDTITLEEQUAL','%WIN_FINDTITLESTART','%WM_ACTIVATE','%WM_ACTIVATEAPP','%WM_CAPTURECHANGED','%WM_CHAR',
+ '%WM_CLOSE','%WM_COMMAND','%WM_DESTROY','%WM_DROPFILES','%WM_ERASEBKGND','%WM_GETTEXTLENGTH','%WM_HOTKEY','%WM_HSCROLL',
+ '%WM_IDLE','%WM_INITDIALOG','%WM_KEYDOWN','%WM_KEYUP','%WM_KILLFOCUS','%WM_LBUTTONDBLCLK','%WM_LBUTTONDOWN','%WM_LBUTTONUP',
+ '%WM_MBUTTONDBLCLK','%WM_MBUTTONDOWN','%WM_MBUTTONUP','%WM_MOUSEFIRST','%WM_MOUSEMOVE','%WM_MOUSEWHEEL','%WM_MOVE','%WM_MOVING',
+ '%WM_NCLBUTTONDOWN','%WM_NCRBUTTONDOWN','%WM_NEXTDLGCTL','%WM_NOTIFY','%WM_PAINT','%WM_QUIT','%WM_RBUTTONDBLCLK','%WM_RBUTTONDOWN',
+ '%WM_RBUTTONUP','%WM_SETFOCUS','%WM_SETFONT','%WM_SETTEXT','%WM_SIZE','%WM_SIZING','%WM_SYSCOMMAND','%WM_TIMER',
+ '%WM_USER','%WM_VSCROLL','%WS_BORDER','%WS_CAPTION','%WS_CHILD','%WS_CLIPCHILDREN','%WS_CLIPSIBLINGS','%WS_DISABLED',
+ '%WS_DLGFRAME','%WS_EX_ACCEPTFILES','%WS_EX_APPWINDOW','%WS_EX_CLIENTEDGE','%WS_EX_CONTEXTHELP','%WS_EX_CONTROLPARENT','%WS_EX_LAYERED','%WS_EX_LEFT',
+ '%WS_EX_LEFTSCROLLBAR','%WS_EX_LTRREADING','%WS_EX_MDICHILD','%WS_EX_NOPARENTNOTIFY','%WS_EX_OVERLAPPEDWINDOW','%WS_EX_PALETTEWINDOW','%WS_EX_RIGHT','%WS_EX_RIGHTSCROLLBAR',
+ '%WS_EX_RTLREADING','%WS_EX_STATICEDGE','%WS_EX_TOOLWINDOW','%WS_EX_TOPMOST','%WS_EX_TRANSPARENT','%WS_EX_WINDOWEDGE','%WS_GROUP','%WS_HSCROLL',
+ '%WS_ICONIC','%WS_MAXIMIZE','%WS_MAXIMIZEBOX','%WS_MINIMIZE','%WS_MINIMIZEBOX','%WS_OVERLAPPEDWINDOW','%WS_POPUP','%WS_POPUPWINDOW',
+ '%WS_SYSMENU','%WS_TABSTOP','%WS_THICKFRAME','%WS_VISIBLE','%WS_VSCROLL','%YELLOW','%ZERO','CRLF',
+ 'FALSE','M_E','M_PI','NULL','TAB','TRUE'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '=', '+', '-', '*', '/', '!', '%', '^', '&', ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000FF; font-weight: bold;',
+ 2 => 'color: #993333; font-style: italic; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #333333;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #800080;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #CC0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #66cc66;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #333333;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '_'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/tsql.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/tsql.php
new file mode 100644
index 00000000..b4bf6bda
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/tsql.php
@@ -0,0 +1,375 @@
+<?php
+/*************************************************************************************
+ * tsql.php
+ * --------
+ * Author: Duncan Lock (dunc@dflock.co.uk)
+ * Copyright: (c) 2006 Duncan Lock (http://dflock.co.uk/), Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/11/22
+ *
+ * T-SQL language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2004/01/23 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2006/01/23)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'T-SQL',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ // Datatypes
+ 'bigint', 'tinyint', 'money',
+ 'smallmoney', 'datetime', 'smalldatetime',
+ 'text', 'nvarchar', 'ntext', 'varbinary', 'image',
+ 'sql_variant', 'uniqueidentifier',
+
+ // Keywords
+ 'ABSOLUTE', 'ACTION', 'ADD', 'ADMIN', 'AFTER', 'AGGREGATE', 'ALIAS', 'ALLOCATE', 'ALTER', 'ARE', 'ARRAY', 'AS',
+ 'ASC', 'ASSERTION', 'AT', 'AUTHORIZATION', 'BACKUP', 'BEFORE', 'BEGIN', 'BINARY', 'BIT', 'BLOB', 'BOOLEAN', 'BOTH', 'BREADTH',
+ 'BREAK', 'BROWSE', 'BULK', 'BY', 'CALL', 'CASCADE', 'CASCADED', 'CASE', 'CAST', 'CATALOG', 'CATCH', 'CHAR', 'CHARACTER', 'CHECK', 'CHECKPOINT',
+ 'CLASS', 'CLOB', 'CLOSE', 'CLUSTERED', 'COALESCE', 'COLLATE', 'COLLATION', 'COLUMN', 'COMMIT', 'COMPLETION', 'COMPUTE', 'CONNECT',
+ 'CONNECTION', 'CONSTRAINT', 'CONSTRAINTS', 'CONSTRUCTOR', 'CONTAINS', 'CONTAINSTABLE', 'CONTINUE', 'CONVERT', 'CORRESPONDING', 'CREATE',
+ 'CUBE', 'CURRENT', 'CURRENT_DATE', 'CURRENT_PATH', 'CURRENT_ROLE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'CURRENT_USER',
+ 'CURSOR', 'CYCLE', 'DATA', 'DATABASE', 'DATE', 'DAY', 'DBCC', 'DEALLOCATE', 'DEC', 'DECIMAL', 'DECLARE', 'DEFAULT', 'DEFERRABLE',
+ 'DEFERRED', 'DELETE', 'DENY', 'DEPTH', 'DEREF', 'DESC', 'DESCRIBE', 'DESCRIPTOR', 'DESTROY', 'DESTRUCTOR', 'DETERMINISTIC',
+ 'DIAGNOSTICS', 'DICTIONARY', 'DISCONNECT', 'DISK', 'DISTINCT', 'DISTRIBUTED', 'DOMAIN', 'DOUBLE', 'DROP', 'DUMMY', 'DUMP', 'DYNAMIC',
+ 'EACH', 'ELSE', 'END', 'END-EXEC', 'EQUALS', 'ERRLVL', 'ESCAPE', 'EVERY', 'EXCEPT', 'EXCEPTION', 'EXEC', 'EXECUTE', 'EXIT',
+ 'EXTERNAL', 'FALSE', 'FETCH', 'FILE', 'FILLFACTOR', 'FIRST', 'FLOAT', 'FOR', 'FOREIGN', 'FOUND', 'FREE', 'FREETEXT', 'FREETEXTTABLE',
+ 'FROM', 'FULL', 'FUNCTION', 'GENERAL', 'GET', 'GLOBAL', 'GOTO', 'GRANT', 'GROUP', 'GROUPING', 'HAVING', 'HOLDLOCK', 'HOST', 'HOUR',
+ 'IDENTITY', 'IDENTITY_INSERT', 'IDENTITYCOL', 'IF', 'IGNORE', 'IMMEDIATE', 'INDEX', 'INDICATOR', 'INITIALIZE', 'INITIALLY',
+ 'INNER', 'INOUT', 'INPUT', 'INSERT', 'INT', 'INTEGER', 'INTERSECT', 'INTERVAL', 'INTO', 'IS', 'ISOLATION', 'ITERATE', 'KEY',
+ 'KILL', 'LANGUAGE', 'LARGE', 'LAST', 'LATERAL', 'LEADING', 'LEFT', 'LESS', 'LEVEL', 'LIMIT', 'LINENO', 'LOAD', 'LOCAL',
+ 'LOCALTIME', 'LOCALTIMESTAMP', 'LOCATOR', 'MAP', 'MATCH', 'MINUTE', 'MODIFIES', 'MODIFY', 'MODULE', 'MONTH', 'NAMES', 'NATIONAL',
+ 'NATURAL', 'NCHAR', 'NCLOB', 'NEW', 'NEXT', 'NO', 'NOCHECK', 'NONCLUSTERED', 'NONE', 'NULLIF', 'NUMERIC', 'OBJECT', 'OF',
+ 'OFF', 'OFFSETS', 'OLD', 'ON', 'ONLY', 'OPEN', 'OPENDATASOURCE', 'OPENQUERY', 'OPENROWSET', 'OPENXML', 'OPERATION', 'OPTION',
+ 'ORDER', 'ORDINALITY', 'OUT', 'OUTPUT', 'OVER', 'PAD', 'PARAMETER', 'PARAMETERS', 'PARTIAL', 'PATH', 'PERCENT', 'PLAN',
+ 'POSTFIX', 'PRECISION', 'PREFIX', 'PREORDER', 'PREPARE', 'PRESERVE', 'PRIMARY', 'PRINT', 'PRIOR', 'PRIVILEGES', 'PROC', 'PROCEDURE',
+ 'PUBLIC', 'RAISERROR', 'READ', 'READS', 'READTEXT', 'REAL', 'RECONFIGURE', 'RECURSIVE', 'REF', 'REFERENCES', 'REFERENCING', 'RELATIVE',
+ 'REPLICATION', 'RESTORE', 'RESTRICT', 'RESULT', 'RETURN', 'RETURNS', 'REVOKE', 'RIGHT', 'ROLE', 'ROLLBACK', 'ROLLUP', 'ROUTINE', 'ROW',
+ 'ROWGUIDCOL', 'ROWS', 'RULE', 'SAVE', 'SAVEPOINT', 'SCHEMA', 'SCOPE', 'SCROLL', 'SEARCH', 'SECOND', 'SECTION', 'SELECT',
+ 'SEQUENCE', 'SESSION', 'SESSION_USER', 'SET', 'SETS', 'SETUSER', 'SHUTDOWN', 'SIZE', 'SMALLINT', 'SPACE', 'SPECIFIC',
+ 'SPECIFICTYPE', 'SQL', 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNING', 'START', 'STATE', 'STATEMENT', 'STATIC', 'STATISTICS', 'STRUCTURE',
+ 'SYSTEM_USER', 'TABLE', 'TEMPORARY', 'TERMINATE', 'TEXTSIZE', 'THAN', 'THEN', 'TIME', 'TIMESTAMP', 'TIMEZONE_HOUR', 'TIMEZONE_MINUTE',
+ 'TO', 'TOP', 'TRAILING', 'TRAN', 'TRANSACTION', 'TRANSLATION', 'TREAT', 'TRIGGER', 'TRUE', 'TRUNCATE', 'TRY', 'TSEQUAL', 'UNDER', 'UNION',
+ 'UNIQUE', 'UNKNOWN', 'UNNEST', 'UPDATE', 'UPDATETEXT', 'USAGE', 'USE', 'USER', 'USING', 'VALUE', 'VALUES', 'VARCHAR', 'VARIABLE',
+ 'VARYING', 'VIEW', 'WAITFOR', 'WHEN', 'WHENEVER', 'WHERE', 'WHILE', 'WITH', 'WITHOUT', 'WORK', 'WRITE', 'WRITETEXT', 'YEAR', 'ZONE',
+ 'UNCOMMITTED', 'NOCOUNT',
+ ),
+ 2 => array(
+ /*
+ Built-in functions
+ Highlighted in pink.
+ */
+
+ //Configuration Functions
+ '@@DATEFIRST','@@OPTIONS','@@DBTS','@@REMSERVER','@@LANGID','@@SERVERNAME',
+ '@@LANGUAGE','@@SERVICENAME','@@LOCK_TIMEOUT','@@SPID','@@MAX_CONNECTIONS',
+ '@@TEXTSIZE','@@MAX_PRECISION','@@VERSION','@@NESTLEVEL',
+
+ //Cursor Functions
+ '@@CURSOR_ROWS','@@FETCH_STATUS',
+
+ //Date and Time Functions
+ 'DATEADD','DATEDIFF','DATENAME','DATEPART','GETDATE','GETUTCDATE',
+
+ //Mathematical Functions
+ 'ABS','DEGREES','RAND','ACOS','EXP','ROUND','ASIN','FLOOR','SIGN',
+ 'ATAN','LOG','SIN','ATN2','LOG10','SQUARE','CEILING','PI','SQRT','COS',
+ 'POWER','TAN','COT','RADIANS',
+
+ //Meta Data Functions
+ 'COL_LENGTH','COL_NAME','FULLTEXTCATALOGPROPERTY',
+ 'COLUMNPROPERTY','FULLTEXTSERVICEPROPERTY','DATABASEPROPERTY','INDEX_COL',
+ 'DATABASEPROPERTYEX','INDEXKEY_PROPERTY','DB_ID','INDEXPROPERTY','DB_NAME',
+ 'OBJECT_ID','FILE_ID','OBJECT_NAME','FILE_NAME','OBJECTPROPERTY','FILEGROUP_ID',
+ '@@PROCID','FILEGROUP_NAME','SQL_VARIANT_PROPERTY','FILEGROUPPROPERTY',
+ 'TYPEPROPERTY','FILEPROPERTY',
+
+ //Security Functions
+ 'IS_SRVROLEMEMBER','SUSER_SID','SUSER_SNAME','USER_ID',
+ 'HAS_DBACCESS','IS_MEMBER',
+
+ //String Functions
+ 'ASCII','SOUNDEX','PATINDEX','CHARINDEX','REPLACE','STR',
+ 'DIFFERENCE','QUOTENAME','STUFF','REPLICATE','SUBSTRING','LEN',
+ 'REVERSE','UNICODE','LOWER','UPPER','LTRIM','RTRIM',
+
+ //System Functions
+ 'APP_NAME','COLLATIONPROPERTY','@@ERROR','FORMATMESSAGE',
+ 'GETANSINULL','HOST_ID','HOST_NAME','IDENT_CURRENT','IDENT_INCR',
+ 'IDENT_SEED','@@IDENTITY','ISDATE','ISNUMERIC','PARSENAME','PERMISSIONS',
+ '@@ROWCOUNT','ROWCOUNT_BIG','SCOPE_IDENTITY','SERVERPROPERTY','SESSIONPROPERTY',
+ 'STATS_DATE','@@TRANCOUNT','USER_NAME',
+
+ //System Statistical Functions
+ '@@CONNECTIONS','@@PACK_RECEIVED','@@CPU_BUSY','@@PACK_SENT',
+ '@@TIMETICKS','@@IDLE','@@TOTAL_ERRORS','@@IO_BUSY',
+ '@@TOTAL_READ','@@PACKET_ERRORS','@@TOTAL_WRITE',
+
+ //Text and Image Functions
+ 'TEXTPTR','TEXTVALID',
+
+ //Aggregate functions
+ 'AVG', 'MAX', 'BINARY_CHECKSUM', 'MIN', 'CHECKSUM', 'SUM', 'CHECKSUM_AGG',
+ 'STDEV', 'COUNT', 'STDEVP', 'COUNT_BIG', 'VAR', 'VARP'
+ ),
+ 3 => array(
+ /*
+ System stored procedures
+ Higlighted dark brown
+ */
+
+ //Active Directory Procedures
+ 'sp_ActiveDirectory_Obj', 'sp_ActiveDirectory_SCP',
+
+ //Catalog Procedures
+ 'sp_column_privileges', 'sp_special_columns', 'sp_columns', 'sp_sproc_columns',
+ 'sp_databases', 'sp_statistics', 'sp_fkeys', 'sp_stored_procedures', 'sp_pkeys',
+ 'sp_table_privileges', 'sp_server_info', 'sp_tables',
+
+ //Cursor Procedures
+ 'sp_cursor_list', 'sp_describe_cursor_columns', 'sp_describe_cursor', 'sp_describe_cursor_tables',
+
+ //Database Maintenance Plan Procedures
+ 'sp_add_maintenance_plan', 'sp_delete_maintenance_plan_db', 'sp_add_maintenance_plan_db',
+ 'sp_delete_maintenance_plan_job', 'sp_add_maintenance_plan_job', 'sp_help_maintenance_plan',
+ 'sp_delete_maintenance_plan',
+
+ //Distributed Queries Procedures
+ 'sp_addlinkedserver', 'sp_indexes', 'sp_addlinkedsrvlogin', 'sp_linkedservers', 'sp_catalogs',
+ 'sp_primarykeys', 'sp_column_privileges_ex', 'sp_columns_ex',
+ 'sp_table_privileges_ex', 'sp_tables_ex', 'sp_foreignkeys',
+
+ //Full-Text Search Procedures
+ 'sp_fulltext_catalog', 'sp_help_fulltext_catalogs_cursor', 'sp_fulltext_column',
+ 'sp_help_fulltext_columns', 'sp_fulltext_database', 'sp_help_fulltext_columns_cursor',
+ 'sp_fulltext_service', 'sp_help_fulltext_tables', 'sp_fulltext_table',
+ 'sp_help_fulltext_tables_cursor', 'sp_help_fulltext_catalogs',
+
+ //Log Shipping Procedures
+ 'sp_add_log_shipping_database', 'sp_delete_log_shipping_database', 'sp_add_log_shipping_plan',
+ 'sp_delete_log_shipping_plan', 'sp_add_log_shipping_plan_database',
+ 'sp_delete_log_shipping_plan_database', 'sp_add_log_shipping_primary',
+ 'sp_delete_log_shipping_primary', 'sp_add_log_shipping_secondary',
+ 'sp_delete_log_shipping_secondary', 'sp_can_tlog_be_applied', 'sp_get_log_shipping_monitor_info',
+ 'sp_change_monitor_role', 'sp_remove_log_shipping_monitor', 'sp_change_primary_role',
+ 'sp_resolve_logins', 'sp_change_secondary_role', 'sp_update_log_shipping_monitor_info',
+ 'sp_create_log_shipping_monitor_account', 'sp_update_log_shipping_plan',
+ 'sp_define_log_shipping_monitor', 'sp_update_log_shipping_plan_database',
+
+ //OLE Automation Extended Stored Procedures
+ 'sp_OACreate', 'sp_OAMethod', 'sp_OADestroy', 'sp_OASetProperty', 'sp_OAGetErrorInfo',
+ 'sp_OAStop', 'sp_OAGetProperty',
+
+ //Replication Procedures
+ 'sp_add_agent_parameter', 'sp_enableagentoffload', 'sp_add_agent_profile',
+ 'sp_enumcustomresolvers', 'sp_addarticle', 'sp_enumdsn', 'sp_adddistpublisher',
+ 'sp_enumfullsubscribers', 'sp_adddistributiondb', 'sp_expired_subscription_cleanup',
+ 'sp_adddistributor', 'sp_generatefilters', 'sp_addmergealternatepublisher',
+ 'sp_getagentoffloadinfo', 'sp_addmergearticle', 'sp_getmergedeletetype', 'sp_addmergefilter',
+ 'sp_get_distributor', 'sp_addmergepublication', 'sp_getqueuedrows', 'sp_addmergepullsubscription',
+ 'sp_getsubscriptiondtspackagename', 'sp_addmergepullsubscription_agent', 'sp_grant_publication_access',
+ 'sp_addmergesubscription', 'sp_help_agent_default', 'sp_addpublication', 'sp_help_agent_parameter',
+ 'sp_addpublication_snapshot', 'sp_help_agent_profile', 'sp_addpublisher70', 'sp_helparticle',
+ 'sp_addpullsubscription', 'sp_helparticlecolumns', 'sp_addpullsubscription_agent', 'sp_helparticledts',
+ 'sp_addscriptexec', 'sp_helpdistpublisher', 'sp_addsubscriber', 'sp_helpdistributiondb',
+ 'sp_addsubscriber_schedule', 'sp_helpdistributor', 'sp_addsubscription', 'sp_helpmergealternatepublisher',
+ 'sp_addsynctriggers', 'sp_helpmergearticle', 'sp_addtabletocontents', 'sp_helpmergearticlecolumn',
+ 'sp_adjustpublisheridentityrange', 'sp_helpmergearticleconflicts', 'sp_article_validation',
+ 'sp_helpmergeconflictrows', 'sp_articlecolumn', 'sp_helpmergedeleteconflictrows', 'sp_articlefilter',
+ 'sp_helpmergefilter', 'sp_articlesynctranprocs', 'sp_helpmergepublication', 'sp_articleview',
+ 'sp_helpmergepullsubscription', 'sp_attachsubscription', 'sp_helpmergesubscription', 'sp_browsesnapshotfolder',
+ 'sp_helppublication', 'sp_browsemergesnapshotfolder', 'sp_help_publication_access', 'sp_browsereplcmds',
+ 'sp_helppullsubscription', 'sp_change_agent_parameter', 'sp_helpreplfailovermode', 'sp_change_agent_profile',
+ 'sp_helpreplicationdboption', 'sp_changearticle', 'sp_helpreplicationoption', 'sp_changedistpublisher',
+ 'sp_helpsubscriberinfo', 'sp_changedistributiondb', 'sp_helpsubscription', 'sp_changedistributor_password',
+ 'sp_ivindexhasnullcols', 'sp_changedistributor_property', 'sp_helpsubscription_properties', 'sp_changemergearticle',
+ 'sp_link_publication', 'sp_changemergefilter', 'sp_marksubscriptionvalidation', 'sp_changemergepublication',
+ 'sp_mergearticlecolumn', 'sp_changemergepullsubscription', 'sp_mergecleanupmetadata', 'sp_changemergesubscription',
+ 'sp_mergedummyupdate', 'sp_changepublication', 'sp_mergesubscription_cleanup', 'sp_changesubscriber',
+ 'sp_publication_validation', 'sp_changesubscriber_schedule', 'sp_refreshsubscriptions', 'sp_changesubscriptiondtsinfo',
+ 'sp_reinitmergepullsubscription', 'sp_changesubstatus', 'sp_reinitmergesubscription', 'sp_change_subscription_properties',
+ 'sp_reinitpullsubscription', 'sp_check_for_sync_trigger', 'sp_reinitsubscription', 'sp_copymergesnapshot',
+ 'sp_removedbreplication', 'sp_copysnapshot', 'sp_repladdcolumn', 'sp_copysubscription', 'sp_replcmds',
+ 'sp_deletemergeconflictrow', 'sp_replcounters', 'sp_disableagentoffload', 'sp_repldone', 'sp_drop_agent_parameter',
+ 'sp_repldropcolumn', 'sp_drop_agent_profile', 'sp_replflush', 'sp_droparticle', 'sp_replicationdboption',
+ 'sp_dropanonymouseagent', 'sp_replication_agent_checkup', 'sp_dropdistpublisher', 'sp_replqueuemonitor',
+ 'sp_dropdistributiondb', 'sp_replsetoriginator', 'sp_dropmergealternatepublisher', 'sp_replshowcmds',
+ 'sp_dropdistributor', 'sp_repltrans', 'sp_dropmergearticle', 'sp_restoredbreplication', 'sp_dropmergefilter',
+ 'sp_revoke_publication_access', 'sp_scriptsubconflicttable', 'sp_dropmergepublication', 'sp_script_synctran_commands',
+ 'sp_dropmergepullsubscription', 'sp_setreplfailovermode', 'sp_showrowreplicainfo', 'sp_dropmergesubscription',
+ 'sp_subscription_cleanup', 'sp_droppublication', 'sp_table_validation', 'sp_droppullsubscription',
+ 'sp_update_agent_profile', 'sp_dropsubscriber', 'sp_validatemergepublication', 'sp_dropsubscription',
+ 'sp_validatemergesubscription', 'sp_dsninfo', 'sp_vupgrade_replication', 'sp_dumpparamcmd',
+
+ //Security Procedures
+ 'sp_addalias', 'sp_droprolemember', 'sp_addapprole', 'sp_dropserver', 'sp_addgroup', 'sp_dropsrvrolemember',
+ 'sp_dropuser', 'sp_addlogin', 'sp_grantdbaccess', 'sp_addremotelogin',
+ 'sp_grantlogin', 'sp_addrole', 'sp_helpdbfixedrole', 'sp_addrolemember', 'sp_helpgroup',
+ 'sp_addserver', 'sp_helplinkedsrvlogin', 'sp_addsrvrolemember', 'sp_helplogins', 'sp_adduser',
+ 'sp_helpntgroup', 'sp_approlepassword', 'sp_helpremotelogin', 'sp_changedbowner', 'sp_helprole',
+ 'sp_changegroup', 'sp_helprolemember', 'sp_changeobjectowner', 'sp_helprotect', 'sp_change_users_login',
+ 'sp_helpsrvrole', 'sp_dbfixedrolepermission', 'sp_helpsrvrolemember', 'sp_defaultdb', 'sp_helpuser',
+ 'sp_defaultlanguage', 'sp_MShasdbaccess', 'sp_denylogin', 'sp_password', 'sp_dropalias', 'sp_remoteoption',
+ 'sp_dropapprole', 'sp_revokedbaccess', 'sp_dropgroup', 'sp_revokelogin', 'sp_droplinkedsrvlogin',
+ 'sp_setapprole', 'sp_droplogin', 'sp_srvrolepermission', 'sp_dropremotelogin', 'sp_validatelogins', 'sp_droprole',
+
+ //SQL Mail Procedures
+ 'sp_processmail', 'xp_sendmail', 'xp_deletemail', 'xp_startmail', 'xp_findnextmsg', 'xp_stopmail', 'xp_readmail',
+
+ //SQL Profiler Procedures
+ 'sp_trace_create', 'sp_trace_setfilter', 'sp_trace_generateevent', 'sp_trace_setstatus', 'sp_trace_setevent',
+
+ //SQL Server Agent Procedures
+ 'sp_add_alert', 'sp_help_jobhistory', 'sp_add_category', 'sp_help_jobschedule', 'sp_add_job',
+ 'sp_help_jobserver', 'sp_add_jobschedule', 'sp_help_jobstep', 'sp_add_jobserver', 'sp_help_notification',
+ 'sp_add_jobstep', 'sp_help_operator', 'sp_add_notification', 'sp_help_targetserver',
+ 'sp_add_operator', 'sp_help_targetservergroup', 'sp_add_targetservergroup', 'sp_helptask',
+ 'sp_add_targetsvrgrp_member', 'sp_manage_jobs_by_login', 'sp_addtask', 'sp_msx_defect',
+ 'sp_apply_job_to_targets', 'sp_msx_enlist', 'sp_delete_alert', 'sp_post_msx_operation',
+ 'sp_delete_category', 'sp_purgehistory', 'sp_delete_job', 'sp_purge_jobhistory', 'sp_delete_jobschedule',
+ 'sp_reassigntask', 'sp_delete_jobserver', 'sp_remove_job_from_targets', 'sp_delete_jobstep',
+ 'sp_resync_targetserver', 'sp_delete_notification', 'sp_start_job', 'sp_delete_operator',
+ 'sp_stop_job', 'sp_delete_targetserver', 'sp_update_alert', 'sp_delete_targetservergroup',
+ 'sp_update_category', 'sp_delete_targetsvrgrp_member', 'sp_update_job', 'sp_droptask',
+ 'sp_update_jobschedule', 'sp_help_alert', 'sp_update_jobstep', 'sp_help_category',
+ 'sp_update_notification', 'sp_help_downloadlist', 'sp_update_operator', 'sp_helphistory',
+ 'sp_update_targetservergroup', 'sp_help_job', 'sp_updatetask', 'xp_sqlagent_proxy_account',
+
+ //System Procedures
+ 'sp_add_data_file_recover_suspect_db', 'sp_helpconstraint', 'sp_addextendedproc',
+ 'sp_helpdb', 'sp_addextendedproperty', 'sp_helpdevice', 'sp_add_log_file_recover_suspect_db',
+ 'sp_helpextendedproc', 'sp_addmessage', 'sp_helpfile', 'sp_addtype', 'sp_helpfilegroup',
+ 'sp_addumpdevice', 'sp_helpindex', 'sp_altermessage', 'sp_helplanguage', 'sp_autostats',
+ 'sp_helpserver', 'sp_attach_db', 'sp_helpsort', 'sp_attach_single_file_db', 'sp_helpstats',
+ 'sp_bindefault', 'sp_helptext', 'sp_bindrule', 'sp_helptrigger', 'sp_bindsession',
+ 'sp_indexoption', 'sp_certify_removable', 'sp_invalidate_textptr', 'sp_configure',
+ 'sp_lock', 'sp_create_removable', 'sp_monitor', 'sp_createstats', 'sp_procoption',
+ 'sp_cycle_errorlog', 'sp_recompile', 'sp_datatype_info', 'sp_refreshview', 'sp_dbcmptlevel',
+ 'sp_releaseapplock', 'sp_dboption', 'sp_rename', 'sp_dbremove', 'sp_renamedb',
+ 'sp_delete_backuphistory', 'sp_resetstatus', 'sp_depends', 'sp_serveroption', 'sp_detach_db',
+ 'sp_setnetname', 'sp_dropdevice', 'sp_settriggerorder', 'sp_dropextendedproc', 'sp_spaceused',
+ 'sp_dropextendedproperty', 'sp_tableoption', 'sp_dropmessage', 'sp_unbindefault', 'sp_droptype',
+ 'sp_unbindrule', 'sp_executesql', 'sp_updateextendedproperty', 'sp_getapplock', 'sp_updatestats',
+ 'sp_getbindtoken', 'sp_validname', 'sp_help', 'sp_who',
+
+ //Web Assistant Procedures
+ 'sp_dropwebtask', 'sp_makewebtask', 'sp_enumcodepages', 'sp_runwebtask',
+
+ //XML Procedures
+ 'sp_xml_preparedocument', 'sp_xml_removedocument',
+
+ //General Extended Procedures
+ 'xp_cmdshellxp_logininfo', 'xp_enumgroups', 'xp_msver', 'xp_findnextmsgxp_revokelogin',
+ 'xp_grantlogin', 'xp_sprintf', 'xp_logevent', 'xp_sqlmaint', 'xp_loginconfig', 'xp_sscanf',
+
+ //API System Stored Procedures
+ 'sp_cursor', 'sp_cursorclose', 'sp_cursorexecute', 'sp_cursorfetch', 'sp_cursoropen',
+ 'sp_cursoroption', 'sp_cursorprepare', 'sp_cursorunprepare', 'sp_execute', 'sp_prepare', 'sp_unprepare',
+
+ //Misc
+ 'sp_createorphan', 'sp_droporphans', 'sp_reset_connection', 'sp_sdidebug'
+ ),
+ 4 => array(
+ //Function/sp's higlighted brown.
+ 'fn_helpcollations', 'fn_listextendedproperty ', 'fn_servershareddrives',
+ 'fn_trace_geteventinfo', 'fn_trace_getfilterinfo', 'fn_trace_getinfo',
+ 'fn_trace_gettable', 'fn_virtualfilestats','fn_listextendedproperty',
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '!', '!=', '%', '&', '&&', '(', ')', '*', '+', '-', '/', '<', '<<', '<=',
+ '<=>', '<>', '=', '>', '>=', '>>', '^', 'ALL', 'AND', 'ANY', 'BETWEEN', 'CROSS',
+ 'EXISTS', 'IN', 'JOIN', 'LIKE', 'NOT', 'NULL', 'OR', 'OUTER', 'SOME', '|', '||', '~'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000FF;',
+ 2 => 'color: #FF00FF;',
+ 3 => 'color: #AF0000;',
+ 4 => 'color: #AF0000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008080;',
+ 'MULTI' => 'color: #008080;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #808080;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #808080;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/typoscript.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/typoscript.php
new file mode 100644
index 00000000..6751aaa8
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/typoscript.php
@@ -0,0 +1,300 @@
+<?php
+/*************************************************************************************
+ * typoscript.php
+ * --------
+ * Author: Jan-Philipp Halle (typo3@jphalle.de)
+ * Copyright: (c) 2005 Jan-Philipp Halle (http://www.jphalle.de/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/07/29
+ *
+ * TypoScript language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/07/11 (1.0.8)
+ * - Michiel Roos <geshi@typofree.org> Complete rewrite
+ * 2005/07/29 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/07/14)
+ * -------------------------
+ * <things-to-do>
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'TypoScript',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(2 => '/(?<!(#|\'|"))(?:#(?!(?:[a-fA-F0-9]{6}|[a-fA-F0-9]{3}))[^\n#]+|#{2}[^\n#]+|#{7,999}[^\n]+)/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ // Conditions: http://documentation.typo3.org/documentation/tsref/conditions/
+ 1 => array(
+ 'browser', 'compatVersion', 'dayofmonth', 'dayofweek', 'device',
+ 'globalString', 'globalVars', 'hostname', 'hour',
+ 'ip', 'language', 'loginUser', 'loginuser', 'minute',
+ 'month', 'PIDinRootline', 'PIDupinRootline',
+ 'system', 'treelevel', 'useragent', 'userFunc',
+ 'usergroup', 'version'
+ ),
+
+ // Functions: http://documentation.typo3.org/documentation/tsref/functions/
+ 2 => array(
+ 'addParams', 'encapsLines', 'filelink', 'HTMLparser',
+ 'HTMLparser_tags', 'if', 'imageLinkWrap',
+ 'imgResource', 'makelinks', 'numRows', 'parseFunc',
+ 'select', 'split', 'stdWrap', 'tableStyle', 'tags',
+ 'textStyle', 'typolink'
+ ),
+
+ // Toplevel objects: http://documentation.typo3.org/documentation/tsref/tlo-objects/
+ 3 => array(
+ 'CARRAY', 'CONFIG', 'CONSTANTS', 'FE_DATA', 'FE_TABLE', 'FRAME',
+ 'FRAMESET', 'META', 'PAGE', 'plugin'
+ ),
+
+ // Content Objects (cObject) : http://documentation.typo3.org/documentation/tsref/cobjects/
+ 4 => array(
+ 'CASE', 'CLEARGIF', 'COA', 'COA_INT', 'COBJ_ARRAY', 'COLUMNS',
+ 'CONTENT', 'CTABLE', 'EDITPANEL', 'FILE', 'FORM',
+ 'HMENU', 'HRULER', 'HTML', 'IMAGE', 'IMGTEXT',
+ 'IMG_RESOURCE', 'LOAD_REGISTER', 'MULTIMEDIA',
+ 'OTABLE', 'PHP_SCRIPT', 'PHP_SCRIPT_EXT',
+ 'PHP_SCRIPT_INT', 'RECORDS', 'RESTORE_REGISTER',
+ 'SEARCHRESULT', 'TEMPLATE', 'TEXT', 'USER',
+ 'USER_INT'
+ ),
+
+ // GIFBUILDER toplevel link: http://documentation.typo3.org/documentation/tsref/gifbuilder/
+ 5 => array(
+ 'GIFBUILDER',
+ ),
+
+ // GIFBUILDER: http://documentation.typo3.org/documentation/tsref/gifbuilder/
+ // skipped fields: IMAGE, TEXT
+ // NOTE! the IMAGE and TEXT field already are linked in group 4, they
+ // cannot be linked twice . . . . unfortunately
+ 6 => array(
+ 'ADJUST', 'BOX', 'CROP', 'EFFECT', 'EMBOSS',
+ 'IMGMAP', 'OUTLINE', 'SCALE', 'SHADOW',
+ 'WORKAREA'
+ ),
+
+ // MENU Objects: http://documentation.typo3.org/documentation/tsref/menu/
+ 7 => array(
+ 'GMENU', 'GMENU_FOLDOUT', 'GMENU_LAYERS', 'IMGMENU',
+ 'IMGMENUITEM', 'JSMENU', 'JSMENUITEM', 'TMENU',
+ 'TMENUITEM', 'TMENU_LAYERS'
+ ),
+
+ // MENU common properties: http://documentation.typo3.org/documentation/tsref/menu/common-properties/
+ 8 => array(
+ 'alternativeSortingField', 'begin', 'debugItemConf',
+ 'imgNameNotRandom', 'imgNamePrefix',
+ 'itemArrayProcFunc', 'JSWindow', 'maxItems',
+ 'minItems', 'overrideId', 'sectionIndex',
+ 'showAccessRestrictedPages', 'submenuObjSuffixes'
+ ),
+
+ // MENU item states: http://documentation.typo3.org/documentation/tsref/menu/item-states/
+ 9 => array(
+ 'ACT', 'ACTIFSUB', 'ACTIFSUBRO', 'ACTRO', 'CUR', 'CURIFSUB',
+ 'CURIFSUBRO', 'CURRO', 'IFSUB', 'IFSUBRO', 'NO',
+ 'SPC', 'USERDEF1', 'USERDEF1RO', 'USERDEF2',
+ 'USERDEF2RO', 'USR', 'USRRO'
+ ),
+ ),
+
+ // Does not include '-' because of stuff like htmlTag_langKey = en-GB and
+ // lib.nav-sub
+ 'SYMBOLS' => array(
+ 0 => array(
+ '|',
+ '+', '*', '/', '%',
+ '!', '&&', '^',
+ '<', '>', '=',
+ '?', ':',
+ '.'
+ ),
+ 1 => array(
+ '(', ')', '{', '}', '[', ']'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true,
+ 9 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #ed7d14;',
+ 2 => 'font-weight: bold;',
+ 3 => 'color: #990000; font-weight: bold;',
+ 4 => 'color: #990000; font-weight: bold;',
+ 5 => 'color: #990000; font-weight: bold;',
+ 6 => 'color: #990000; font-weight: bold;',
+ 7 => 'color: #990000; font-weight: bold;',
+ 8 => 'font-weight: bold;',
+ 9 => 'color: #990000; font-weight: bold;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #aaa; font-style: italic;',
+ 2 => 'color: #aaa; font-style: italic;',
+ 'MULTI' => 'color: #aaa; font-style: italic;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ac14aa;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0000e0; font-weight: bold;',
+ 2 => 'color: #0000e0; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933; font-weight: bold;',
+ // Set this to the same value as brackets above
+ 1 => 'color: #009900; font-weight: bold;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #009900;',
+ 1 => 'color: #009900; font-weight: bold;',
+ 2 => 'color: #3366CC;',
+ 3 => 'color: #000066; font-weight: bold;',
+ 4 => 'color: #ed7d14;',
+ 5 => 'color: #000066; font-weight: bold;',
+ 6 => 'color: #009900;',
+ 7 => 'color: #3366CC;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => 'http://documentation.typo3.org/documentation/tsref/conditions/{FNAME}/',
+ 2 => 'http://documentation.typo3.org/documentation/tsref/functions/{FNAME}/',
+ 3 => 'http://documentation.typo3.org/documentation/tsref/tlo-objects/{FNAME}/',
+ 4 => 'http://documentation.typo3.org/documentation/tsref/cobjects/{FNAME}/',
+ 5 => 'http://documentation.typo3.org/documentation/tsref/gifbuilder/',
+ 6 => 'http://documentation.typo3.org/documentation/tsref/gifbuilder/{FNAME}/',
+ 7 => 'http://documentation.typo3.org/documentation/tsref/menu/{FNAME}/',
+ 8 => 'http://documentation.typo3.org/documentation/tsref/menu/common-properties/',
+ 9 => 'http://documentation.typo3.org/documentation/tsref/menu/item-states/'
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ // xhtml tag
+ 2 => array(
+ GESHI_SEARCH => '(&lt;)([a-zA-Z\\/][^\\/\\|]*?)(&gt;)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 's',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+
+ // Constant
+ 0 => array(
+ GESHI_SEARCH => '(\{)(\$[a-zA-Z_\.]+[a-zA-Z0-9_\.]*)(\})',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => '\\3'
+ ),
+
+ // Constant dollar sign
+ 1 => array(
+ GESHI_SEARCH => '(\$)([a-zA-Z_\.]+[a-zA-Z0-9_\.]*)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '\\2'
+ ),
+
+ // extension keys / tables: (static|user|ttx|tx|tt|fe)_something[_something]
+ 3 => array(
+ GESHI_SEARCH => '(plugin\.|[^\.]\b)((?:static|user|ttx|tx|tt|fe)(?:_[0-9A-Za-z_]+?)\b)',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+
+ // conditions and controls
+ 4 => array(
+ GESHI_SEARCH => '(\[)(globalVar|global|end)\b',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+
+ // lowlevel setup and constant objects
+ 5 => array(
+ GESHI_SEARCH => '([^\.\$-\{]\b)(cObj|field|config|content|file|frameset|includeLibs|lib|page|plugin|register|resources|sitemap|sitetitle|styles|temp|tt_content|tt_news|types|xmlnews)\b',
+ GESHI_REPLACE => '\\2',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '\\1',
+ GESHI_AFTER => ''
+ ),
+
+ // markers
+ 6 => array(
+ GESHI_SEARCH => '(###[^#]+###)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+
+ // hex color codes
+ 7 => array(
+ GESHI_SEARCH => '(#[a-fA-F0-9]{6}\b|#[a-fA-F0-9]{3}\b)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => '',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/unicon.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/unicon.php
new file mode 100644
index 00000000..6fe62d0f
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/unicon.php
@@ -0,0 +1,210 @@
+<?php
+/*************************************************************************************
+ * unicon.php
+ * --------
+ * Author: Matt Oates (mattoates@gmail.com)
+ * Copyright: (c) 2010 Matt Oates (http://mattoates.co.uk)
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/04/20
+ *
+ * Unicon the Unified Extended Dialect of Icon language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2010/04/24 (0.0.0.2)
+ * - Validated with Geshi langcheck.php FAILED due to preprocessor keywords looking like symbols
+ * - Hard wrapped to improve readability
+ * 2010/04/20 (0.0.0.1)
+ * - First Release
+ *
+ * TODO (updated 2010/04/20)
+ * -------------------------
+ * - Do the &amp; need replacing with &?
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Unicon (Unified Extended Dialect of Icon)',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', '\''),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'break', 'case', 'class', 'continue', 'create', 'default', 'do',
+ 'else', 'end', 'every', 'fail', 'for', 'if', 'import', 'initial', 'initially',
+ 'invocable', 'link', 'method', 'next', 'not', 'of', 'package', 'procedure', 'record',
+ 'repeat', 'return', 'switch', 'suspend', 'then', 'to', 'until', 'while'
+ ),
+ 2 => array(
+ 'global', 'local', 'static'
+ ),
+ 3 => array(
+ 'allocated', 'ascii', 'clock', 'collections',
+ 'column', 'cset', 'current', 'date', 'dateline', 'digits',
+ 'dump', 'e', 'error', 'errornumber', 'errortext',
+ 'errorvalue', 'errout', 'eventcode', 'eventsource', 'eventvalue',
+ 'fail', 'features', 'file', 'host', 'input', 'lcase',
+ 'letters', 'level', 'line', 'main', 'now', 'null',
+ 'output', 'phi', 'pi', 'pos', 'progname', 'random',
+ 'regions', 'source', 'storage', 'subject', 'syserr', 'time',
+ 'trace', 'ucase', 'version', 'col', 'control', 'interval',
+ 'ldrag', 'lpress', 'lrelease', 'mdrag', 'meta', 'mpress',
+ 'mrelease', 'rdrag', 'resize', 'row', 'rpress', 'rrelease',
+ 'shift', 'window', 'x', 'y'
+ ),
+ 4 => array(
+ 'abs', 'acos', 'any', 'args', 'asin', 'atan', 'bal', 'center', 'char',
+ 'chmod', 'close', 'cofail', 'collect', 'copy', 'cos', 'cset', 'ctime', 'dbcolumns',
+ 'dbdriver', 'dbkeys', 'dblimits', 'dbproduction', 'dbtables', 'delay', 'delete', 'detab',
+ 'display', 'dtor', 'entab', 'errorclear', 'event', 'eventmask', 'EvGet', 'exit', 'exp',
+ 'fetch', 'fieldnames', 'find', 'flock', 'flush', 'function', 'get', 'getch', 'getche',
+ 'getenv', 'gettimeofday', 'globalnames', 'gtime', 'iand', 'icom', 'image', 'insert',
+ 'integer', 'ior', 'ishift', 'ixor', 'key', 'left', 'list', 'load', 'loadfunc',
+ 'localnames', 'log', 'many', 'map', 'match', 'member', 'mkdir', 'move', 'name', 'numeric',
+ 'open', 'opmask', 'ord', 'paramnames', 'parent', 'pipe', 'pop', 'pos', 'proc', 'pull',
+ 'push', 'put', 'read', 'reads', 'real', 'receive', 'remove', 'rename', 'repl', 'reverse',
+ 'right', 'rmdir', 'rtod', 'runerr', 'seek', 'select', 'send', 'seq', 'serial', 'set',
+ 'setenv', 'sort', 'sortf', 'sql', 'sqrt', 'stat', 'staticnames', 'stop', 'string', 'system', 'tab',
+ 'table', 'tan', 'trap', 'trim', 'truncate', 'type', 'upto', 'utime', 'variable', 'where',
+ 'write', 'writes'
+ ),
+ 5 => array(
+ 'Active', 'Alert', 'Bg', 'Clip', 'Clone', 'Color', 'ColorValue',
+ 'CopyArea', 'Couple', 'DrawArc', 'DrawCircle', 'DrawCurve', 'DrawCylinder', 'DrawDisk',
+ 'DrawImage', 'DrawLine', 'DrawPoint', 'DrawPolygon', 'DrawRectangle', 'DrawSegment',
+ 'DrawSphere', 'DrawString', 'DrawTorus', 'EraseArea', 'Event', 'Fg', 'FillArc',
+ 'FillCircle', 'FillPolygon', 'FillRectangle', 'Font', 'FreeColor', 'GotoRC', 'GotoXY',
+ 'IdentifyMatrix', 'Lower', 'MatrixMode', 'NewColor', 'PaletteChars', 'PaletteColor',
+ 'PaletteKey', 'Pattern', 'Pending', 'Pixel', 'PopMatrix', 'PushMatrix', 'PushRotate',
+ 'PushScale', 'PushTranslate', 'QueryPointer', 'Raise', 'ReadImage', 'Refresh', 'Rotate',
+ 'Scale', 'Texcoord', 'TextWidth', 'Texture', 'Translate', 'Uncouple', 'WAttrib',
+ 'WDefault', 'WFlush', 'WindowContents', 'WriteImage', 'WSync'
+ ),
+ 6 => array(
+ 'define', 'include', 'ifdef', 'ifndef', 'else', 'endif', 'error',
+ 'line', 'undef'
+ ),
+ 7 => array(
+ '_V9', '_AMIGA', '_ACORN', '_CMS', '_MACINTOSH', '_MSDOS_386',
+ '_MS_WINDOWS_NT', '_MSDOS', '_MVS', '_OS2', '_POR', 'T', '_UNIX', '_POSIX', '_DBM',
+ '_VMS', '_ASCII', '_EBCDIC', '_CO_EXPRESSIONS', '_CONSOLE_WINDOW', '_DYNAMIC_LOADING',
+ '_EVENT_MONITOR', '_EXTERNAL_FUNCTIONS', '_KEYBOARD_FUNCTIONS', '_LARGE_INTEGERS',
+ '_MULTITASKING', '_PIPES', '_RECORD_IO', '_SYSTEM_FUNCTION', '_MESSAGING', '_GRAPHICS',
+ '_X_WINDOW_SYSTEM', '_MS_WINDOWS', '_WIN32', '_PRESENTATION_MGR', '_ARM_FUNCTIONS',
+ '_DOS_FUNCTIONS'
+ ),
+ 8 => array(
+ 'line')
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(', ')', '{', '}', '[', ']', '+', '-', '*', '/', '\\', '%', '=', '<', '>', '!', '^',
+ '&', '|', '?', ':', ';', ',', '.', '~', '@'
+ ),
+ 2 => array(
+ '$(', '$)', '$<', '$>'
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ 5 => true,
+ 6 => true,
+ 7 => true,
+ 8 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #b1b100;',
+ 3 => 'color: #b1b100;',
+ 4 => 'color: #b1b100;',
+ 5 => 'color: #b1b100;',
+ 6 => 'color: #b1b100;',
+ 7 => 'color: #b1b100;',
+ 8 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(1 => '.'),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 3 => array(
+ 'DISALLOWED_BEFORE' => '(?<=&amp;)'
+ ),
+ 4 => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9_\"\'])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_\"\'])"
+ ),
+ 6 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\$)'
+ ),
+ 8 => array(
+ 'DISALLOWED_BEFORE' => '(?<=#)'
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/upc.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/upc.php
new file mode 100644
index 00000000..e0530322
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/upc.php
@@ -0,0 +1,270 @@
+<?php
+/*************************************************************************************
+ * upc.php
+ * -----
+ * Author: Viraj Sinha (viraj@indent.com)
+ * Contributors:
+ * - Nigel McNie (nigel@geshi.org)
+ * - Jack Lloyd (lloyd@randombit.net)
+ * - Michael Mol (mikemol@gmail.com)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/04
+ *
+ * UPC language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2011/06/14 (1.0.8.11)
+ * - This file is a revision of c.php with UPC keywords added
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'UPC',
+ 'COMMENT_SINGLE' => array(1 => '//', 2 => '#'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Multiline-continued single-line comments
+ 1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Multiline-continued preprocessor define
+ 2 => '/#(?:\\\\\\\\|\\\\\\n|.)*$/m'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[\\\\abfnrtv\'\"?\n]#i",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{2}#",
+ //Hexadecimal Char Specs
+ 3 => "#\\\\u[\da-fA-F]{4}#",
+ //Hexadecimal Char Specs
+ 4 => "#\\\\U[\da-fA-F]{8}#",
+ //Octal Char Specs
+ 5 => "#\\\\[0-7]{1,3}#"
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'if', 'return', 'while', 'case', 'continue', 'default',
+ 'do', 'else', 'for', 'switch', 'goto',
+
+ 'upc_forall', 'upc_barrier', 'upc_notify', 'upc_wait', 'upc_fence'
+ ),
+ 2 => array(
+ 'null', 'false', 'break', 'true', 'function', 'enum', 'extern', 'inline'
+ ),
+ 3 => array(
+ // assert.h
+ 'assert',
+
+ //complex.h
+ 'cabs', 'cacos', 'cacosh', 'carg', 'casin', 'casinh', 'catan',
+ 'catanh', 'ccos', 'ccosh', 'cexp', 'cimag', 'cis', 'clog', 'conj',
+ 'cpow', 'cproj', 'creal', 'csin', 'csinh', 'csqrt', 'ctan', 'ctanh',
+
+ //ctype.h
+ 'digittoint', 'isalnum', 'isalpha', 'isascii', 'isblank', 'iscntrl',
+ 'isdigit', 'isgraph', 'islower', 'isprint', 'ispunct', 'isspace',
+ 'isupper', 'isxdigit', 'toascii', 'tolower', 'toupper',
+
+ //inttypes.h
+ 'imaxabs', 'imaxdiv', 'strtoimax', 'strtoumax', 'wcstoimax',
+ 'wcstoumax',
+
+ //locale.h
+ 'localeconv', 'setlocale',
+
+ //math.h
+ 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'exp',
+ 'fabs', 'floor', 'frexp', 'ldexp', 'log', 'log10', 'modf', 'pow',
+ 'sin', 'sinh', 'sqrt', 'tan', 'tanh',
+
+ //setjmp.h
+ 'longjmp', 'setjmp',
+
+ //signal.h
+ 'raise',
+
+ //stdarg.h
+ 'va_arg', 'va_copy', 'va_end', 'va_start',
+
+ //stddef.h
+ 'offsetof',
+
+ //stdio.h
+ 'clearerr', 'fclose', 'fdopen', 'feof', 'ferror', 'fflush', 'fgetc',
+ 'fgetpos', 'fgets', 'fopen', 'fprintf', 'fputc', 'fputchar',
+ 'fputs', 'fread', 'freopen', 'fscanf', 'fseek', 'fsetpos', 'ftell',
+ 'fwrite', 'getc', 'getch', 'getchar', 'gets', 'perror', 'printf',
+ 'putc', 'putchar', 'puts', 'remove', 'rename', 'rewind', 'scanf',
+ 'setbuf', 'setvbuf', 'snprintf', 'sprintf', 'sscanf', 'tmpfile',
+ 'tmpnam', 'ungetc', 'vfprintf', 'vfscanf', 'vprintf', 'vscanf',
+ 'vsprintf', 'vsscanf',
+
+ //stdlib.h
+ 'abort', 'abs', 'atexit', 'atof', 'atoi', 'atol', 'bsearch',
+ 'calloc', 'div', 'exit', 'free', 'getenv', 'itoa', 'labs', 'ldiv',
+ 'ltoa', 'malloc', 'qsort', 'rand', 'realloc', 'srand', 'strtod',
+ 'strtol', 'strtoul', 'system',
+
+ //string.h
+ 'memchr', 'memcmp', 'memcpy', 'memmove', 'memset', 'strcat',
+ 'strchr', 'strcmp', 'strcoll', 'strcpy', 'strcspn', 'strerror',
+ 'strlen', 'strncat', 'strncmp', 'strncpy', 'strpbrk', 'strrchr',
+ 'strspn', 'strstr', 'strtok', 'strxfrm',
+
+ //time.h
+ 'asctime', 'clock', 'ctime', 'difftime', 'gmtime', 'localtime',
+ 'mktime', 'strftime', 'time',
+
+ //wchar.h
+ 'btowc', 'fgetwc', 'fgetws', 'fputwc', 'fputws', 'fwide',
+ 'fwprintf', 'fwscanf', 'getwc', 'getwchar', 'mbrlen', 'mbrtowc',
+ 'mbsinit', 'mbsrtowcs', 'putwc', 'putwchar', 'swprintf', 'swscanf',
+ 'ungetwc', 'vfwprintf', 'vswprintf', 'vwprintf', 'wcrtomb',
+ 'wcscat', 'wcschr', 'wcscmp', 'wcscoll', 'wcscpy', 'wcscspn',
+ 'wcsftime', 'wcslen', 'wcsncat', 'wcsncmp', 'wcsncpy', 'wcspbrk',
+ 'wcsrchr', 'wcsrtombs', 'wcsspn', 'wcsstr', 'wcstod', 'wcstok',
+ 'wcstol', 'wcstoul', 'wcsxfrm', 'wctob', 'wmemchr', 'wmemcmp',
+ 'wmemcpy', 'wmemmove', 'wmemset', 'wprintf', 'wscanf',
+
+ //wctype.h
+ 'iswalnum', 'iswalpha', 'iswcntrl', 'iswctype', 'iswdigit',
+ 'iswgraph', 'iswlower', 'iswprint', 'iswpunct', 'iswspace',
+ 'iswupper', 'iswxdigit', 'towctrans', 'towlower', 'towupper',
+ 'wctrans', 'wctype'
+ ),
+ 4 => array(
+ 'auto', 'char', 'const', 'double', 'float', 'int', 'long',
+ 'register', 'short', 'signed', 'sizeof', 'static', 'struct',
+ 'typedef', 'union', 'unsigned', 'void', 'volatile', 'wchar_t',
+
+ 'int8', 'int16', 'int32', 'int64',
+ 'uint8', 'uint16', 'uint32', 'uint64',
+
+ 'int_fast8_t', 'int_fast16_t', 'int_fast32_t', 'int_fast64_t',
+ 'uint_fast8_t', 'uint_fast16_t', 'uint_fast32_t', 'uint_fast64_t',
+
+ 'int_least8_t', 'int_least16_t', 'int_least32_t', 'int_least64_t',
+ 'uint_least8_t', 'uint_least16_t', 'uint_least32_t', 'uint_least64_t',
+
+ 'int8_t', 'int16_t', 'int32_t', 'int64_t',
+ 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t',
+
+ 'intmax_t', 'uintmax_t', 'intptr_t', 'uintptr_t',
+ 'size_t', 'off_t',
+
+ 'upc_lock_t', 'shared', 'strict', 'relaxed', 'upc_blocksizeof',
+ 'upc_localsizeof', 'upc_elemsizeof'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']',
+ '+', '-', '*', '/', '%',
+ '=', '<', '>',
+ '!', '^', '&', '|',
+ '?', ':',
+ ';', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 3 => 'color: #000066;',
+ 4 => 'color: #993333;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #339933;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 1 => 'color: #000099; font-weight: bold;',
+ 2 => 'color: #660099; font-weight: bold;',
+ 3 => 'color: #660099; font-weight: bold;',
+ 4 => 'color: #660099; font-weight: bold;',
+ 5 => 'color: #006699; font-weight: bold;',
+ 'HARD' => '',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;',
+ GESHI_NUMBER_BIN_PREFIX_0B => 'color: #208080;',
+ GESHI_NUMBER_OCT_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_HEX_PREFIX => 'color: #208080;',
+ GESHI_NUMBER_FLT_SCI_SHORT => 'color:#800080;',
+ GESHI_NUMBER_FLT_SCI_ZERO => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI_F => 'color:#800080;',
+ GESHI_NUMBER_FLT_NONSCI => 'color:#800080;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.opengroup.org/onlinepubs/009695399/functions/{FNAMEL}.html',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/urbi.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/urbi.php
new file mode 100644
index 00000000..a7353ea8
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/urbi.php
@@ -0,0 +1,200 @@
+<?php
+/*************************************************************************************
+ * urbi.php
+ * -------
+ * Author: Alexandre Morgand (morgand.alexandre@gmail.com)
+ * Copyright: (c) 2011 Morgand (http://gostai.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2011/09/10
+ *
+ * Urbi language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Urbi',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Multiline-continued single-line comments
+ 1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ //Multiline-continued preprocessor define
+ 2 => '/#(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ // Urbi warning.
+ 3 => "#\[[0-9a-f]{8}:warning\].*#",
+ // Urbi message from echo.
+ 4 => '#\[[0-9a-f]{8}\] \*\*\*.*#',
+ // Urbi error message.
+ 6 => '#\[[0-9a-f]{8}:error\].*#',
+ // Urbi system message.
+ 5 => '#\[00.*\].*#',
+ // Nested comment. Max depth 4.
+ 7 => '#\/\*(.|\n)*\/\*(.|\n)*\*\/(.|\n)*\*\/#',
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(
+ 0 => '"',
+ 1 => '\'',
+ ),
+ // For Urbi, disable escape char is better.
+ 'ESCAPE_CHAR' => '\\',
+ 'ESCAPE_REGEXP' => array(
+ //Simple Single Char Escapes
+ 1 => "#\\\\[abfnrtv\\\'\"?\n]#",
+ //Hexadecimal Char Specs
+ 2 => "#\\\\x[\da-fA-F]{2}#",
+ //Hexadecimal Char Specs
+ 3 => "#\\\\u[\da-fA-F]{4}#",
+ //Hexadecimal Char Specs
+ 4 => "#\\\\U[\da-fA-F]{8}#",
+ //Octal Char Specs
+ 5 => "#\\\\[0-7]{1,3}#",
+ ),
+ 'NUMBERS' =>
+ GESHI_NUMBER_INT_BASIC | GESHI_NUMBER_INT_CSTYLE | GESHI_NUMBER_BIN_PREFIX_0B |
+ GESHI_NUMBER_OCT_PREFIX | GESHI_NUMBER_HEX_PREFIX | GESHI_NUMBER_FLT_NONSCI |
+ GESHI_NUMBER_FLT_NONSCI_F | GESHI_NUMBER_FLT_SCI_SHORT | GESHI_NUMBER_FLT_SCI_ZERO,
+ 'KEYWORDS' => array(
+ // Condition keywords.
+ 1 => array(
+ 'at', 'at;', 'at|', 'at&', 'at,', 'break', 'call', 'case', 'catch', 'continue',
+ 'do', 'else', 'every', 'every&', 'every,', 'every;', 'every|', 'for', 'for&',
+ 'for,', 'for;', 'foreach', 'for|', 'freezeif', 'goto', 'if', 'in', 'loop',
+ 'loop&', 'loop,', 'loop;', 'loop|', 'or_eq', 'stopif', 'switch', 'try',
+ 'waituntil', 'when', 'whenever', 'while', 'while&', 'while,', 'while;',
+ 'while|', 'throw', 'onleave', 'watch', 'return', 'and_eq', 'default', 'finally',
+ 'timeout', 'xor_eq'
+ ),
+ // Type.
+ 2 => array(
+ 'virtual', 'using', 'namespace', 'inline', 'protected', 'private', 'public',
+ 'typename', 'typeid', 'class', 'const_cast', 'dynamic_cast', 'friend',
+ 'template', 'enum', 'static_cast', 'reinterpret_cast', 'mutable', 'explicit'
+ ),
+ // Standard function.
+ 3 => array(
+ 'this', 'sizeof', 'delete', 'assert', 'isdef', 'compl', 'detach',
+ 'disown', '__HERE__', 'asm'
+ ),
+ // Type.
+ 4 => array(
+ 'char', 'const', 'double', 'int', 'long', 'typedef', 'union',
+ 'unsigned', 'var', 'short', 'wchar_t', 'volatile', 'signed', 'bool',
+ 'float', 'struct', 'auto', 'register', 'static', 'extern', 'function',
+ 'export', 'external', 'internal', 'closure', 'BIN'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 0 => array('(', ')', '{', '}', '[', ']'),
+ 1 => array('<', '>','=', '!=', '==', '==='),
+ 2 => array('+', '-', '*', '/', '%', 'bitand', 'bitor', 'xor'),
+ 3 => array('!', '^', '&', '|'),
+ 4 => array('?', ':', ';')
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #0000dd;',
+ 4 => 'color: #0000ff;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666;',
+ 2 => 'color: #339900;',
+ 3 => 'color: #d46b0f;',
+ 4 => 'color: #20b537;',
+ 5 => 'color: #73776f;',
+ 6 => 'color: #a71616;',
+ 7 => 'color: #666666;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #ff0000;',
+ 1 => 'color: #ff0000;',
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #7a0874; font-weight: bold;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;',
+ 1 => 'color: #007788;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000dd;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #007788;',
+ 2 => 'color: #007788;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;',
+ 1 => 'color: #0000f8;',
+ 2 => 'color: #000040;',
+ 3 => 'color: #000040; font-weight: bold;',
+ 4 => 'color: #008080;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000dd',
+ 1 => 'color: #0000dd;',
+ 2 => 'color: #0000dd;',
+ 3 => 'color: #0000dd;',
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::',
+ // FIXME: add -> splitter.
+ ),
+ 'REGEXPS' => array(
+ 0 => '0x[0-9a-fA-F]([0-9a-fA-F_]*[0-9a-fA-F])*',
+ 1 => '[0-9]([0-9_]*[0-9])*(e|E)(-|\+)?[0-9]([0-9_]*[0-9])*',
+ 2 => '[0-9]([0-9_]*[0-9])*(min|s|ms|h|d)',
+ 3 => '[0-9]+_([0-9_])*[0-9]',
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/uscript.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/uscript.php
new file mode 100644
index 00000000..58cdb8d9
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/uscript.php
@@ -0,0 +1,299 @@
+<?php
+/*************************************************************************************
+ * uscript.php
+ * ---------------------------------
+ * Author: pospi (pospi@spadgos.com)
+ * Copyright: (c) 2007 pospi (http://pospi.spadgos.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/05/21
+ *
+ * UnrealScript language file for GeSHi.
+ *
+ * Comments:
+ * * Main purpose at this time is for Unreal Engine 2 / 2.5
+ * * Mostly taken from UltraEdit unrealScript wordfile.
+ *
+ * CHANGES
+ * -------
+ * 2007/05/21 (1.0.8.10)
+ * - First Release
+ *
+ * TODO (updated 2007/05/21)
+ * -------------------------
+ * * Update to feature any UE3 classes / keywords when UT3 comes out
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Unreal Script',
+ 'COMMENT_SINGLE' => array(
+ 1 => '//',
+ 2 => '#'
+ ),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array( //declaration keywords
+ 'simulated', 'state', 'class', 'function', 'event', 'var', 'local',
+ 'ignores', 'globalconfig', 'config', 'abstract', 'nativereplication', 'native',
+ 'auto', 'coerce', 'const', 'default',
+ 'defaultproperties',
+ 'enum', 'extends', 'expands', 'final', 'guid', 'latent', 'localized',
+ 'new', 'noexport', 'operator', 'preoperator', 'optional', 'out',
+ 'private', 'public', 'protected', 'reliable', 'replication',
+ 'singular', 'static', 'struct', 'transient', 'unreliable',
+ 'hidedropdown', 'cacheexempt', 'exec', 'delegate', 'import', 'placeable', 'exportstructs'
+ ),
+ 2 => array( //control flow keywords
+ 'for', 'while', 'do', 'if', 'else', 'switch', 'case', 'return', 'break', 'continue',
+ 'begin', 'loop', 'assert',
+ 'foreach', 'AllActors', 'DynamicActors', 'ChildActors', 'BasedActors', 'TouchingActors',
+ 'TraceActors', 'RadiusActors', 'VisibleActors', 'CollidingActors', 'VisibleCollidingActors'
+ ),
+ 3 => array( //global (object) functions
+ 'log', 'warn', 'rot', 'vect', 'Rand', 'Min', 'Max', 'Clamp', 'Abs', 'Sin', 'ASin',
+ 'Cos', 'ACos', 'Tan', 'ATan', 'Exp', 'Loge', 'Sqrt', 'Square', 'FRand', 'FMin', 'FMax', 'FClamp',
+ 'Lerp', 'Smerp', 'Ceil', 'Round', 'VSize', 'Normal', 'Invert', 'VRand', 'MirrorVectorByNormal',
+ 'GetAxes', 'GetUnAxes', 'RotRand', 'OrthoRotation', 'Normalize', 'ClockwiseFrom',
+ 'Len', 'InStr', 'Mid', 'Left', 'Right', 'Caps', 'Chr', 'Asc', 'Locs',
+ 'Divide', 'Split', 'StrCmp', 'Repl', 'Eval',
+ 'InterpCurveEval', 'InterpCurveGetOutputRange', 'InterpCurveGetInputDomain',
+ 'QuatProduct', 'QuatInvert', 'QuatRotateVector', 'QuatFindBetween', 'QuatFromAxisAndAngle',
+ 'QuatFromRotator', 'QuatToRotator', 'QuatSlerp',
+ 'Localize', 'GotoState', 'IsInState', 'GetStateName',
+ 'ClassIsChildOf', 'IsA', 'Enable', 'Disable',
+ 'GetPropertyText', 'SetPropertyText', 'GetEnum', 'DynamicLoadObject', 'FindObject',
+ 'SaveConfig', 'ClearConfig', 'StaticSaveConfig', 'ResetConfig', 'StaticClearConfig',
+ 'GetPerObjectNames', 'RandRange', 'StopWatch', 'IsOnConsole', 'IsSoaking',
+ 'PlatformIsMacOS', 'PlatformIsUnix', 'PlatformIsWindows', 'PlatformIs64Bit',
+ 'BeginState', 'EndState', 'Created', 'AllObjects', 'GetReferencers', 'GetItemName',
+ 'ReplaceText', 'EatStr'
+ ),
+ 4 => array( //common almost-global (actor) functions
+ 'ClientMessage', 'ConsoleCommand', 'CopyObjectToClipboard', 'TextToSpeech',
+ 'Error', 'Sleep', 'SetCollision', 'SetCollisionSize', 'SetDrawScale', 'SetDrawScale3D',
+ 'SetStaticMesh', 'SetDrawType', 'Move', 'SetLocation', 'SetRotation',
+ 'SetRelativeLocation', 'SetRelativeRotation', 'MoveSmooth', 'AutonomousPhysics',
+ 'SetBase', 'SetOwner', 'IsJoinedTo', 'GetMeshName', 'PlayAnim', 'LoopAnim', 'TweenAnim',
+ 'IsAnimating', 'FinishAnim', 'HasAnim', 'StopAnimating', 'FreezeFrameAt', 'SetAnimFrame',
+ 'IsTweening', 'AnimStopLooping', 'AnimEnd', 'LinkSkelAnim', 'LinkMesh', 'BoneRefresh',
+ 'GetBoneCoords', 'GetBoneRotation', 'GetRootLocation', 'GetRootRotation', 'AttachToBone',
+ 'DetachFromBone', 'SetBoneScale', 'UpdateURL', 'GetURLOption', 'SetPhysics', 'KAddImpulse',
+ 'KImpact', 'KApplyForce', 'Clock', 'UnClock', 'Destroyed', 'GainedChild', 'LostChild',
+ 'Tick', 'PostNetReceive', 'ClientTrigger', 'Trigger', 'UnTrigger', 'BeginEvent', 'EndEvent',
+ 'Timer', 'HitWall', 'Falling', 'Landed', 'ZoneChange', 'PhysicsVolumeChange', 'Touch',
+ 'PostTouch', 'UnTouch', 'Bump', 'BaseChange', 'Attach', 'Detach', 'SpecialHandling',
+ 'EncroachingOn', 'EncroachedBy', 'RanInto', 'FinishedInterpolation', 'EndedRotation',
+ 'UsedBy', 'FellOutOfWorld', 'KilledBy', 'TakeDamage', 'HealDamage', 'Trace', 'FastTrace',
+ 'TraceThisActor', 'spawn', 'Destroy', 'TornOff', 'SetTimer', 'PlaySound', 'PlayOwnedSound',
+ 'GetSoundDuration', 'MakeNoise', 'BeginPlay', 'GetAllInt', 'RenderOverlays', 'RenderTexture',
+ 'PreBeginPlay', 'PostBeginPlay', 'PostNetBeginPlay', 'HurtRadius', 'Reset', 'Crash'
+ ),
+ 5 => array( //data types
+ 'none', 'null',
+ 'float', 'int', 'bool', 'byte', 'char', 'double', 'iterator', 'name', 'string', //primitive
+ 'plane', 'rotator', 'vector', 'spline', 'coords', 'Quat', 'Range', 'RangeVector', //structs
+ 'Scale', 'Color', 'Box', 'IntBox', 'FloatBox', 'BoundingVolume', 'Matrix', 'InterpCurvePoint',
+ 'InterpCurve', 'CompressedPosition', 'TMultiMap', 'PointRegion',
+ 'KRigidBodyState', 'KSimParams', 'AnimRep', 'FireProperties',
+ 'lodmesh', 'skeletalmesh', 'mesh', 'StaticMesh', 'MeshInstance', //3d resources
+ 'sound', //sound resources
+ 'material', 'texture', 'combiner', 'modifier', 'ColorModifier', 'FinalBlend', //2d resources
+ 'MaterialSequence', 'MaterialSwitch', 'OpacityModifier', 'TexModifier', 'TexEnvMap',
+ 'TexCoordSource', 'TexMatrix', 'TexOscillator', 'TexPanner', 'TexRotator', 'TexScaler',
+ 'RenderedMaterial', 'BitmapMaterial', 'ScriptedTexture', 'ShadowBitmapMaterial', 'Cubemap',
+ 'FractalTexture', 'FireTexture', 'IceTexture', 'WaterTexture', 'FluidTexture', 'WaveTexture',
+ 'WetTexture', 'ConstantMaterial', 'ConstantColor', 'FadeColor', 'ParticleMaterial',
+ 'ProjectorMaterial', 'Shader', 'TerrainMaterial', 'VertexColor'
+ ),
+ 6 => array( //misc keywords
+ 'false', 'true', 'self', 'super', 'MaxInt', 'Pi'
+ ),
+ 7 => array( //common actor enums & variables
+ 'DT_None', 'DT_Sprite', 'DT_Mesh', 'DT_Brush', 'DT_RopeSprite',
+ 'DT_VerticalSprite', 'DT_TerraForm', 'DT_SpriteAnimOnce', 'DT_StaticMesh', 'DT_DrawType',
+ 'DT_Particle', 'DT_AntiPortal', 'DT_FluidSurface',
+ 'PHYS_None', 'PHYS_Walking', 'PHYS_Falling', 'PHYS_Swimming', 'PHYS_Flying',
+ 'PHYS_Rotating', 'PHYS_Projectile', 'PHYS_Interpolating', 'PHYS_MovingBrush', 'PHYS_Spider',
+ 'PHYS_Trailer', 'PHYS_Ladder', 'PHYS_RootMotion', 'PHYS_Karma', 'PHYS_KarmaRagDoll',
+ 'PHYS_Hovering', 'PHYS_CinMotion',
+ 'ROLE_None', 'ROLE_DumbProxy', 'ROLE_SimulatedProxy',
+ 'ROLE_AutonomousProxy', 'ROLE_Authority',
+ 'STY_None', 'STY_Normal', 'STY_Masked', 'STY_Translucent', 'STY_Modulated', 'STY_Alpha',
+ 'STY_Additive', 'STY_Subtractive', 'STY_Particle', 'STY_AlphaZ',
+ 'OCCLUSION_None', 'OCCLUSION_BSP', 'OCCLUSION_Default', 'OCCLUSION_StaticMeshes',
+ 'SLOT_None', 'SLOT_Misc', 'SLOT_Pain', 'SLOT_Interact', 'SLOT_Ambient', 'SLOT_Talk',
+ 'SLOT_Interface', 'MTRAN_None', 'MTRAN_Instant', 'MTRAN_Segue', 'MTRAN_Fade',
+ 'MTRAN_FastFade', 'MTRAN_SlowFade',
+
+ 'DrawType', 'Physics', 'Owner', 'Base', 'Level', 'Game', 'Instigator', 'RemoteRole', 'Role',
+ 'LifeSpan', 'Tag', 'Event', 'Location', 'Rotation', 'Velocity', 'Acceleration',
+ 'RelativeLocation', 'RelativeRotation', 'DrawScale', 'DrawScale3D', 'Skins', 'Style',
+ 'SoundVolume', 'SoundPitch', 'SoundRadius', 'TransientSoundVolume', 'TransientSoundRadius',
+ 'CollisionRadius', 'CollisionHeight', 'Mass', 'Buoyancy', 'RotationRate', 'DesiredRotation'
+ ),
+ 8 => array( //common non-actor uscript classes
+ 'Object',
+ 'CacheManager', 'CameraEffect', 'Canvas', 'CheatManager', 'Commandlet', 'DecoText', 'GUI',
+ 'InteractionMaster', 'Interactions', 'Interaction', 'KarmaParamsCollision', 'KarmaParamsRBFull',
+ 'KarmaParamsSkel', 'KarmaParams', 'LevelSummary', 'Locale', 'Manifest', 'MaterialFactory',
+ 'MeshObject', 'ObjectPool', 'Pallete',
+ 'ParticleEmitter', 'MeshEmitter', 'BeamEmitter', 'SpriteEmitter', 'SparkEmitter', 'TrailEmitter',
+ 'Player', 'PlayerInput', 'PlayInfo', 'ReachSpec', 'Resource', 'LatentScriptedAction', 'ScriptedAction',
+ 'speciesType', 'StreamBase', 'Stream', 'EditorEngine', 'Engine', 'Time', 'WeaponFire',
+ 'WebApplication', 'WebRequest', 'WebResponse', 'WebSkin', 'xPawnGibGroup', 'xPawnSoundGroup',
+ 'xUtil'
+ ),
+ 9 => array( //common actor-based uscript classes
+ 'Actor',
+ 'Controller', 'AIController', 'ScriptedController', 'Bot', 'xBot',
+ 'PlayerController', 'UnrealPlayer', 'xPlayer',
+ 'DamageType', 'WeaponDamageType', 'Effects', 'Emitter', 'NetworkEmitter',
+ 'Gib', 'HUD', 'HudBase', 'Info', 'FluidSurfaceInfo', 'Combo',
+ 'GameInfo', 'UnrealMPGameInfo', 'DeathMatch', 'TeamGame', 'CTFGame',
+ 'xCTFGame', 'xBombingRun', 'xDoubleDom', 'xTeamGame',
+ 'ASGameInfo', 'Invasion', 'ONSOnslaughtGame', 'xDeathmatch',
+ 'Mutator', 'Inventory', 'Ammunition', 'KeyInventory', 'Powerups', 'Armor', 'Weapon',
+ 'InventoryAttachment', 'WeaponAttachment',
+ 'KActor', 'KConstraint', 'KBSJoint', 'KCarWheelJoint', 'KConeLimit', 'KHinge', 'KTire',
+ 'KVehicleFactory', 'Keypoint', 'AIScript', 'ScriptedSequence', 'ScriptedTrigger',
+ 'AmbientSound', 'Light', 'SpotLight', 'SunLight', 'TriggerLight',
+ 'MeshEffect', 'NavigationPoint', 'GameObjective', 'DestroyableObjective',
+ 'PathNode', 'FlyingPathNode', 'RoadPathNode', 'InventorySpot', 'PlayerStart',
+ 'Pawn', 'Vehicle', 'UnrealPawn', 'xPawn', 'Monster', 'ASVehicle', 'KVehicle', 'KCar',
+ 'ONSWeaponPawn', 'SVehicle', 'ONSVehicle', 'ONSChopperCraft', 'ONSHoverCraft',
+ 'ONSPlaneCraft', 'ONSTreadCraft', 'ONSWheeledCraft',
+ 'Pickup', 'Ammo', 'UTAmmoPickup', 'ArmorPickup', 'KeyPickup', 'TournamentPickup',
+ 'Projectile', 'Projector', 'DynamicProjector', 'ShadowProjector', 'xScorch',
+ 'xEmitter', 'xPickupBase', 'xProcMesh', 'xWeatherEffect', 'PhysicsVolume', 'Volume'
+ ),
+ 10 => array( //symbol-like operators
+ 'dot','cross'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '+','-','=','/','*','-','%','>','<','&','^','!','|','`','(',')','[',']','{','}',
+ '<<','>>','$','@'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false,
+ 7 => false,
+ 8 => false,
+ 9 => false,
+ 10 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000FF;',
+ 2 => 'color: #0000FF;',
+ 3 => 'color: #0066AA;',
+ 4 => 'color: #0088FF;',
+ 5 => 'color: #E000E0;',
+ 6 => 'color: #900000;',
+ 7 => 'color: #888800;',
+ 8 => 'color: #AA6600;',
+ 9 => 'color: #FF8800;',
+ 10 => 'color: #0000FF;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008080; font-style: italic;',
+ 2 => 'color: #000000; font-weight: bold;',
+ 'MULTI' => 'color: #008080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #999999;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #669966;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #E000E0;',
+ 1 => 'color: #E000E0;'
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => '',
+ 7 => '',
+ 8 => 'http://wiki.beyondunreal.com/wiki?search={FNAME}',
+ 9 => 'http://wiki.beyondunreal.com/wiki?search={FNAME}',
+ 10 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array('.'),
+ 'REGEXPS' => array( //handle template-style variable definitions
+ 0 => array(
+ GESHI_SEARCH => '(class\s*)<(\s*(\w+)\s*)>',
+ GESHI_REPLACE => "\${1}",
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => "< \${3} >"
+ ),
+ 1 => array(
+ GESHI_SEARCH => '(array\s*)<(\s*(\w+)\s*)>',
+ GESHI_REPLACE => "\${1}",
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => "< \${3} >"
+ )
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 10 => array(
+ 'DISALLOWED_BEFORE' => '(?<!<)(?=DOT>)'
+ )
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vala.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vala.php
new file mode 100644
index 00000000..acac57e2
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vala.php
@@ -0,0 +1,151 @@
+<?php
+/*************************************************************************************
+ * vala.php
+ * ----------
+ * Author: Nicolas Joseph (nicolas.joseph@valaide.org)
+ * Copyright: (c) 2009 Nicolas Joseph
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/04/29
+ *
+ * Vala language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Vala',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ //Using and Namespace directives (basic support)
+ //Please note that the alias syntax for using is not supported
+ 3 => '/(?:(?<=using[\\n\\s])|(?<=namespace[\\n\\s]))[\\n\\s]*([a-zA-Z0-9_]+\\.)*[a-zA-Z0-9_]+[\n\s]*(?=[;=])/i'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'HARDQUOTE' => array('"""'),
+ 'HARDESCAPE' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'as', 'abstract', 'base', 'break', 'case', 'catch', 'const',
+ 'construct', 'continue', 'default', 'delete', 'dynamic', 'do',
+ 'else', 'ensures', 'extern', 'false', 'finally', 'for', 'foreach',
+ 'get', 'if', 'in', 'inline', 'internal', 'lock', 'namespace',
+ 'null', 'out', 'override', 'private', 'protected', 'public', 'ref',
+ 'requires', 'return', 'set', 'static', 'switch', 'this', 'throw',
+ 'throws', 'true', 'try', 'using', 'value', 'var', 'virtual',
+ 'volatile', 'void', 'yield', 'yields', 'while'
+ ),
+ 2 => array(
+ '#elif', '#endif', '#else', '#if'
+ ),
+ 3 => array(
+ 'is', 'new', 'owned', 'sizeof', 'typeof', 'unchecked', 'unowned', 'weak'
+ ),
+ 4 => array(
+ 'bool', 'char', 'class', 'delegate', 'double', 'enum',
+ 'errordomain', 'float', 'int', 'int8', 'int16', 'int32', 'int64',
+ 'interface', 'long', 'short', 'signal', 'size_t', 'ssize_t',
+ 'string', 'struct', 'uchar', 'uint', 'uint8', 'uint16', 'uint32',
+ 'ulong', 'unichar', 'ushort'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '+', '-', '*', '?', '=', '/', '%', '&', '>', '<', '^', '!', ':', ';',
+ '(', ')', '{', '}', '[', ']', '|'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true,
+ 4 => true,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0600FF;',
+ 2 => 'color: #FF8000; font-weight: bold;',
+ 3 => 'color: #008000;',
+ 4 => 'color: #FF0000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008080; font-style: italic;',
+ 3 => 'color: #008080;',
+ 'MULTI' => 'color: #008080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #008080; font-weight: bold;',
+ 'HARD' => 'color: #008080; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #666666;',
+ 'HARD' => 'color: #666666;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #FF0000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #0000FF;',
+ 2 => 'color: #0000FF;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 'DISALLOWED_BEFORE' => "(?<![a-zA-Z0-9\$_\|\#>|^])",
+ 'DISALLOWED_AFTER' => "(?![a-zA-Z0-9_<\|%\\-])"
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vb.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vb.php
new file mode 100644
index 00000000..528e7cd4
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vb.php
@@ -0,0 +1,157 @@
+<?php
+/*************************************************************************************
+ * vb.php
+ * ------
+ * Author: Roberto Rossi (rsoftware@altervista.org)
+ * Copyright: (c) 2004 Roberto Rossi (http://rsoftware.altervista.org),
+ * Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/08/30
+ *
+ * Visual Basic language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/08/27 (1.0.8.1)
+ * - changed keyword list for better Visual Studio compliance
+ * 2008/08/26 (1.0.8.1)
+ * - Fixed multiline comments
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/08/30 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Visual Basic',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ // Comments (either single or multiline with _
+ 1 => '/\'.*(?<! _)\n/sU',
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'Binary', 'Boolean', 'Byte', 'Currency', 'Date', 'Decimal', 'Double',
+ 'String', 'Enum', 'Integer', 'Long', 'Object', 'Single', 'Variant'
+ ),
+ 2 => array(
+ 'CreateObject', 'GetObject', 'New', 'Option', 'Function',
+ 'Call', 'Private', 'Public', 'Sub', 'Explicit', 'Compare', 'Exit'
+ ),
+ 3 => array(
+ 'And', 'Case', 'Do', 'Each', 'Else', 'ElseIf', 'For',
+ 'Goto', 'If', 'Is', 'Loop', 'Next', 'Not', 'Or', 'Select', 'Step',
+ 'Then', 'To', 'Until', 'While', 'With', 'Xor', 'WithEvents',
+ 'DoEvents', 'Close', 'Like', 'In', 'End'
+ ),
+ 4 => array(
+ 'As', 'Dim', 'Get', 'Set', 'ReDim', 'Error',
+ 'Resume', 'Declare', 'Let', 'ByRef', 'ByVal',
+ 'Optional', 'Property', 'Control', 'UBound', 'Mod',
+ 'GoSub', 'Implements', 'Input', 'LBound', 'Static', 'Stop',
+ 'Type', 'TypeOf', 'On', 'Open', 'Output', 'ParamArray',
+ 'Preserve', 'Print', 'RaiseEvent', 'Random', 'Line'
+ ),
+ 5 => array(
+ 'Nothing', 'False', 'True', 'Null', 'Empty'
+ ),
+ 6 => array(
+ 'ErrorHandler','ExitProc', 'PublishReport'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 6 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #F660AB; font-weight: bold;',
+ 2 => 'color: #E56717; font-weight: bold;',
+ 3 => 'color: #8D38C9; font-weight: bold;',
+ 4 => 'color: #151B8D; font-weight: bold;',
+ 5 => 'color: #00C2FF; font-weight: bold;',
+ 6 => 'color: #3EA99F; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000;'
+ ),
+ 'BRACKETS' => array(
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #800000;'
+ ),
+ 'NUMBERS' => array(
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #800000; font-weight: bold;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => '',
+ 6 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER,
+ 'SYMBOLS' => GESHI_NEVER,
+ 'NUMBERS' => GESHI_NEVER
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vbnet.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vbnet.php
new file mode 100644
index 00000000..758df989
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vbnet.php
@@ -0,0 +1,182 @@
+<?php
+/*************************************************************************************
+ * vbnet.php
+ * ---------
+ * Author: Alan Juden (alan@judenware.org)
+ * Copyright: (c) 2004 Alan Juden, Nigel McNie (http://qbnz.com/highlighter)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/06/04
+ *
+ * VB.NET language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2004/11/27 (1.0.0)
+ * - Initial release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'vb.net',
+ 'COMMENT_SINGLE' => array(1 => "'"),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ //Keywords
+ 1 => array(
+ 'AddHandler', 'AddressOf', 'Alias', 'And', 'AndAlso', 'As', 'ByRef', 'ByVal',
+ 'Call', 'Case', 'Catch', 'Char', 'Class', 'Const', 'Continue',
+ 'Declare', 'Default',
+ 'Delegate', 'Dim', 'DirectCast', 'Do', 'Each', 'Else', 'ElseIf', 'End', 'EndIf',
+ 'Enum', 'Erase', 'Error', 'Event', 'Exit', 'False', 'Finally', 'For', 'Friend', 'Function',
+ 'Get', 'GetType', 'GetXMLNamespace', 'Global', 'GoSub', 'GoTo', 'Handles', 'If', 'Implements',
+ 'Imports', 'In', 'Inherits', 'Interface', 'Is', 'IsNot', 'Let', 'Lib', 'Like', 'Loop', 'Me',
+ 'Mod', 'Module', 'Module Statement', 'MustInherit', 'MustOverride', 'MyBase', 'MyClass', 'Namespace',
+ 'Narrowing', 'New', 'Next', 'Not', 'Nothing', 'NotInheritable', 'NotOverridable', 'Of', 'On',
+ 'Operator', 'Option', 'Optional', 'Or', 'OrElse', 'Out', 'Overloads', 'Overridable', 'Overrides',
+ 'ParamArray', 'Partial', 'Private', 'Property', 'Protected', 'Public', 'RaiseEvent', 'ReadOnly', 'ReDim',
+ 'REM', 'RemoveHandler', 'Resume', 'Return', 'Select','Set', 'Shadows', 'Shared', 'Static', 'Step',
+ 'Stop', 'Structure', 'Sub', 'SyncLock', 'Then', 'Throw', 'To', 'True', 'Try', 'TryCast', 'TypeOf',
+ 'Using', 'Wend', 'When', 'While', 'Widening', 'With', 'WithEvents', 'WriteOnly', 'Xor'
+ ),
+ //Data Types
+ 2 => array(
+ 'Boolean', 'Byte', 'Date', 'Decimal', 'Double', 'Integer', 'Long', 'Object',
+ 'SByte', 'Short', 'Single', 'String', 'UInteger', 'ULong', 'UShort'
+ ),
+ //Compiler Directives
+ 3 => array(
+ '#Const', '#Else', '#ElseIf', '#End', '#If'
+ ),
+ //Constants
+ 4 => array(
+ 'CBool', 'CByte', 'CChar', 'CChr', 'CDate', 'CDbl', 'CDec','CInt', 'CLng', 'CLng8', 'CObj', 'CSByte', 'CShort',
+ 'CSng', 'CStr', 'CType', 'CUInt', 'CULng', 'CUShort'
+ ),
+ //Linq
+ 5 => array(
+ 'By','From','Group','Where'
+ ),
+ //Built-in functions
+ 7 => array(
+ 'ABS', 'ARRAY', 'ASC', 'ASCB', 'ASCW', 'CALLBYNAME', 'CHOOSE', 'CHR', 'CHR$', 'CHRB', 'CHRB$', 'CHRW',
+ 'CLOSE', 'COMMAND', 'COMMAND$', 'CONVERSION',
+ 'COS', 'CREATEOBJECT', 'CURDIR', 'CVDATE', 'DATEADD',
+ 'DATEDIFF', 'DATEPART', 'DATESERIAL', 'DATEVALUE', 'DAY', 'DDB', 'DIR', 'DIR$',
+ 'EOF', 'ERROR$', 'EXP', 'FILEATTR', 'FILECOPY', 'FILEDATATIME', 'FILELEN', 'FILTER',
+ 'FIX', 'FORMAT', 'FORMAT$', 'FORMATCURRENCY', 'FORMATDATETIME', 'FORMATNUMBER',
+ 'FORMATPERCENT', 'FREEFILE', 'FV', 'GETALLSETTINGS', 'GETATTRGETOBJECT', 'GETSETTING',
+ 'HEX', 'HEX$', 'HOUR', 'IIF', 'IMESTATUS', 'INPUT$', 'INPUTB', 'INPUTB$', 'INPUTBOX',
+ 'INSTR', 'INSTRB', 'INSTRREV', 'INT', 'IPMT', 'IRR', 'ISARRAY', 'ISDATE', 'ISEMPTY',
+ 'ISERROR', 'ISNULL', 'ISNUMERIC', 'ISOBJECT', 'JOIN', 'LBOUND', 'LCASE', 'LCASE$',
+ 'LEFT', 'LEFT$', 'LEFTB', 'LEFTB$', 'LENB', 'LINEINPUT', 'LOC', 'LOF', 'LOG', 'LTRIM',
+ 'LTRIM$', 'MID$', 'MIDB', 'MIDB$', 'MINUTE', 'MIRR', 'MKDIR', 'MONTH', 'MONTHNAME',
+ 'MSGBOX', 'NOW', 'NPER', 'NPV', 'OCT', 'OCT$', 'PARTITION', 'PMT', 'PPMT', 'PV',
+ 'RATE', 'REPLACE', 'RIGHT', 'RIGHT$', 'RIGHTB', 'RIGHTB$', 'RMDIR', 'RND', 'RTRIM',
+ 'RTRIM$', 'SECOND', 'SIN', 'SLN', 'SPACE', 'SPACE$', 'SPC', 'SPLIT', 'SQRT', 'STR', 'STR$',
+ 'STRCOMP', 'STRCONV', 'STRING$', 'STRREVERSE', 'SYD', 'TAB', 'TAN', 'TIMEOFDAY',
+ 'TIMER', 'TIMESERIAL', 'TIMEVALUE', 'TODAY', 'TRIM', 'TRIM$', 'TYPENAME', 'UBOUND',
+ 'UCASE', 'UCASE$', 'VAL', 'WEEKDAY', 'WEEKDAYNAME', 'YEAR'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '+', '-', '*', '?', '=', '/', '%', '&', '>', '<', '^', '!',
+ '(', ')', '{', '}', '.'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false,
+ 7 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000FF; font-weight: bold;', //Keywords
+ 2 => 'color: #6a5acd;', //primitive Data Types
+ 3 => 'color: #6a5acd; font-weight: bold;', //preprocessor-commands
+ 4 => 'color: #cd6a5a;', //Constants
+ 5 => 'color: #cd6a5a; font-weight: bold;', //LinQ
+ 7 => 'color: #000066;', //Built-in functions
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000; font-style: italic;',
+ 'MULTI' => 'color: #008000; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #008080; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #a52a2a; back-color: #fffacd;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #a52a2a; back-color: #fffacd;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #000000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.google.com/search?q={FNAMEU}+site:msdn.microsoft.com',
+ 4 => '',
+ 5 => '',
+ 7 => 'http://www.google.com/search?q={FNAMEU}+site:msdn.microsoft.com'
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 =>'.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 7 => array(
+ 'DISALLOWED_AFTER' => '(?!\w)(?=\s*\()'
+ )
+ )
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vedit.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vedit.php
new file mode 100644
index 00000000..19b2bdb2
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vedit.php
@@ -0,0 +1,103 @@
+<?php
+/*************************************************************************************
+ * vedit.php
+ * --------
+ * Author: Pauli Lindgren (pauli0212@yahoo.com)
+ * Copyright: (c) 2009 Pauli Lindgren (http://koti.mbnet.fi/pkl/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/12/16
+ *
+ * Vedit macro language language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2009/12/16 (1.0.8.11)
+ * - First Release
+ *
+ * TODO (updated 2009/12/16)
+ * -------------------------
+ * - Add keyword groups 2, 3 and 4.
+ *
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Vedit macro language',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"', '\''),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'break', 'breakout', 'break_out', 'continue', 'do', 'else', 'for',
+ 'goto', 'if', 'repeat', 'return', 'while'
+ )
+ ),
+ 'SYMBOLS' => array(
+ 1 => array(
+ '(', ')', '{', '}', '[', ']', '+', '-', '*', '/', '%',
+ '=', '<', '>', '!', '^', '&', '|', '?', ':', ';', ','
+ )
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;',
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #004000;'
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: #339933;'
+ ),
+ 'REGEXPS' => array(),
+ 'SCRIPT' => array()
+ ),
+ 'URLS' => array(1 => ''),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/verilog.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/verilog.php
new file mode 100644
index 00000000..2bf66d1c
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/verilog.php
@@ -0,0 +1,173 @@
+<?php
+/**
+ * verilog.php
+ * -----------
+ * Author: G�nter Dannoritzer <dannoritzer@web.de>
+ * Copyright: (C) 2008 Guenter Dannoritzer
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/05/28
+ *
+ * Verilog language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/29
+ * - added regular expression to find numbers of the form 4'b001xz
+ * - added regular expression to find values for `timescale command
+ * - extended macro keywords
+ *
+ * TODO (updated 2008/05/29)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Verilog',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(1 => '/\/\/(?:\\\\\\\\|\\\\\\n|.)*$/m'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ // keywords
+ 1 => array('always', 'and', 'assign', 'begin', 'buf', 'bufif0', 'bufif1', 'case',
+ 'casex', 'casez', 'cmos', 'deassign', 'default', 'defparam',
+ 'disable', 'edge', 'else', 'end', 'endcase', 'endfunction',
+ 'endmodule', 'endprimitive', 'endspecify', 'endtable', 'endtask',
+ 'event', 'fork', 'for', 'force', 'forever', 'function', 'highz0',
+ 'highz1', 'if', 'ifnone', 'initial', 'inout', 'input', 'integer',
+ 'join', 'large', 'macromodule', 'medium', 'module', 'nand',
+ 'negedge', 'nmos', 'nor', 'not', 'notif0', 'notif1', 'or',
+ 'output', 'parameter', 'pmos', 'posedge', 'primitive', 'pull0',
+ 'pull1', 'pulldown', 'pullup', 'rcmos', 'real', 'realtime', 'reg',
+ 'release', 'repeat', 'rnmos', 'rpmos', 'rtran', 'rtranif0',
+ 'rtranif1', 'scalared', 'small', 'specify', 'specparam',
+ 'strong0', 'strong1', 'supply0', 'supply1', 'table', 'task',
+ 'time', 'tran', 'tranif0', 'tranif1', 'tri', 'tri0', 'tri1',
+ 'triand', 'trior', 'trireg', 'vectored', 'wait', 'wand', 'weak0',
+ 'weak1', 'while', 'wire', 'wor', 'xnor', 'xor'
+ ),
+ // system tasks
+ 2 => array(
+ '$display', '$monitor',
+ '$dumpall', '$dumpfile', '$dumpflush', '$dumplimit', '$dumpoff',
+ '$dumpon', '$dumpvars',
+ '$fclose', '$fdisplay', '$fopen',
+ '$finish', '$fmonitor', '$fstrobe', '$fwrite',
+ '$fgetc', '$ungetc', '$fgets', '$fscanf', '$fread', '$ftell',
+ '$fseek', '$frewind', '$ferror', '$fflush', '$feof',
+ '$random',
+ '$readmemb', '$readmemh', '$readmemx',
+ '$signed', '$stime', '$stop',
+ '$strobe', '$time', '$unsigned', '$write'
+ ),
+ // macros
+ 3 => array(
+ '`default-net', '`define',
+ '`celldefine', '`default_nettype', '`else', '`elsif', '`endcelldefine',
+ '`endif', '`ifdef', '`ifndef', '`include', '`line', '`nounconnected_drive',
+ '`resetall', '`timescale', '`unconnected_drive', '`undef'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '{', '}', '[', ']', '=', '+', '-', '*', '/', '!', '%',
+ '^', '&', '|', '~',
+ '?', ':',
+ '#', '<<', '<<<',
+ '>', '<', '>=', '<=',
+ '@', ';', ','
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #A52A2A; font-weight: bold;',
+ 2 => 'color: #9932CC;',
+ 3 => 'color: #008800;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #00008B; font-style: italic;',
+ 'MULTI' => 'color: #00008B; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #9F79EE'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #9F79EE;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #FF00FF;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0055;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #202020;',
+ 2 => 'color: #202020;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #5D478B;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #ff0055;',
+ 1 => 'color: #ff0055;',
+ ),
+ 'SCRIPT' => array(
+ 0 => '',
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => ''
+ ),
+ 'REGEXPS' => array(
+ // numbers
+ 0 => "\d'[bdh][0-9_a-fA-FxXzZ]+",
+ // time -> 1, 10, or 100; s, ms, us, ns, ps, of fs
+ 1 => "1[0]{0,2}[munpf]?s"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ 1 => ''
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ 0 => true,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vhdl.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vhdl.php
new file mode 100644
index 00000000..a8f37e67
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vhdl.php
@@ -0,0 +1,183 @@
+<?php
+/*************************************************************************************
+ * vhdl.php
+ * --------
+ * Author: Alexander 'E-Razor' Krause (admin@erazor-zone.de)
+ * Contributors:
+ * - Kevin Thibedeau (kevinpt@yahoo.com)
+ * Copyright: (c) 2005 Alexander Krause
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/06/15
+ *
+ * VHDL (VHSICADL, very high speed integrated circuit HDL) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2012/4/30 (1.0.8.10)
+ * - Reworked to support new features of VHDL-2008.
+ * - Changes include: multi-line comments, all new keywords, PSL keywords and metacomments,
+ * - based literals, attribute highlighting, preprocessor macros (from PSL), and other small
+ * - improvements.
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * - Optimized regexp group 0 somewhat
+ * 2006/06/15 (1.0.0)
+ * - First Release
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'VHDL',
+ 'COMMENT_SINGLE' => array(1 => '--'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'COMMENT_REGEXP' => array(
+ // PSL adds C-preprocessor support
+ 1 => '/(?<=\s)#(?:\\\\\\\\|\\\\\\n|.)*$/m',
+ // PSL metacomments (single-line only for now)
+ 2 => '/--\s*@?psl(?:.)*?;$/m',
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /*keywords*/
+ 1 => array(
+ 'access','after','alias','all','attribute','architecture','array','begin',
+ 'block','body','buffer','bus','case','case?','component','configuration','constant','context',
+ 'disconnect','downto','else','elsif','end','entity','exit','file','for','force',
+ 'function','generate','generic','group','guarded','if','impure','in',
+ 'inertial','inout','is','label','library','linkage','literal','loop',
+ 'map','new','next','null','of','on','open','others','out','package',
+ 'port','postponed','procedure','process','protected','pure','range','record','register',
+ 'reject','release','report','return','select','severity','shared','signal','subtype',
+ 'then','to','transport','type','unaffected','units','until','use','variable',
+ 'wait','when','while','with'
+ ),
+ /*types and standard libs*/
+ 2 => array(
+ 'bit','bit_vector','character','boolean','integer','real','time','delay_length','string',
+ 'severity_level','positive','natural','signed','unsigned','line','text',
+ 'std_logic','std_logic_vector','std_ulogic','std_ulogic_vector',
+ 'sfixed','ufixed','float','float32','float64','float128',
+ 'work','ieee','std_logic_1164','math_real','math_complex','textio',
+ 'numeric_std','numeric_std_signed','numeric_std_unsigned','numeric_bit'
+ ),
+ /*operators*/
+ 3 => array(
+ 'abs','and','mod','nor','not','or','rem','rol','ror','sla','sll','sra','srl','xnor','xor'
+ ),
+ /*psl*/
+ 4 => array(
+ 'assert','assume','assume_guarantee','clock','const','countones','cover','default',
+ 'endpoint','fairness','fell','forall','inf','inherit','isunknown','onehot','onehot0','property',
+ 'prev','restrict','restrict_guarantee','rose','sequence','stable','strong','union','vmode','vprop','vunit'
+ ),
+ /*psl operators*/
+ 5 => array(
+ 'abort','always','before','before!','before!_','before_','eventually!','never',
+ 'next!','next_a','next_a!','next_e','next_e!','next_event','next_event!','next_event_a','next_event_a!',
+ 'next_event_e','next_event_e!','until!','until!_','until_','within'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '[', ']', '(', ')',
+ ';',':',
+ '<','>','=','+','-','*','/','&','|','?'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000080; font-weight: bold;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #000066;',
+ 4 => 'color: #000080; font-weight: bold;',
+ 5 => 'color: #000066;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000; font-style: italic;',
+ 2 => 'color: #ff0000; font-weight: bold;',
+ 'MULTI' => 'color: #008000; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000066;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000066;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #ff0000;',
+ //1 => 'color: #ff0000;',
+ 2 => 'color: #ee82ee;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Based literals, scientific notation, and time units
+ 0 => '(\b\d+#[[:xdigit:]_]+#)|'.
+ '(\b[\d_]+(\.[\d_]+)?[eE][+\-]?[\d_]+)|'.
+ '(\b(hr|min|sec|ms|us|ns|ps|fs)\b)',
+ //Character literals
+ /* GeSHi won't match this pattern for some reason and QUOTEMARKS
+ * can't be used because it interferes with attribute parsing */
+ /*1 => "\b'.'\b",*/
+ //Attributes
+ 2 => "'\w+(?!')"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vim.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vim.php
new file mode 100644
index 00000000..fe7e5e00
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/vim.php
@@ -0,0 +1,420 @@
+<?php
+/*************************************************************************************
+ * vim.php
+ * ----------------
+ * Author: Swaroop C H (swaroop@swaroopch.com)
+ * Contributors:
+ * - Laurent Peuch (psycojoker@gmail.com)
+ * Copyright: (c) 2008 Swaroop C H (http://www.swaroopch.com)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/10/19
+ *
+ * Vim scripting language file for GeSHi.
+ *
+ * Reference: http://qbnz.com/highlighter/geshi-doc.html#language-files
+ * All keywords scraped from `:help expression-commands`.
+ * All method names scraped from `:help function-list`.
+ *
+ * CHANGES
+ * -------
+ * 2008/10/19 (1.0.8.2)
+ * - Started.
+ * 2009/07/05
+ * - Fill out list of zillion commands (maybe somes still miss).
+ * - fix a part of the regex, now works for comment that have white space before the "
+ *
+ * TODO (updated 2009/07/05)
+ * -------------------------
+ * - Make this damn string with "" work correctly. I've just remove it for my wiki.
+ * - Make the comment regex able to find comment after some code.
+ * (i.e: let rocks " unworking comment)
+ * - Make <F1> <F2> ... <Esc> <CR> ... works event if they aren't surround by space.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array(
+ 'LANG_NAME' => 'Vim Script',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_REGEXP' => array(
+ 1 => "/\s*\"[^\"]*?$/m",
+ //Regular expressions (Ported from perl.php)
+// 2 => "/(?<=[\\s^])(s|tr|y)\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/(?:\\\\.|(?!\n)[^\\/\\\\])*\\/[msixpogcde]*(?=[\\s$\\.\\;])|(?<=[\\s^(=])(m|q[qrwx]?)?\\/(?:\\\\.|(?!\n)[^\\/\\\\])+\\/[msixpogc]*(?=[\\s$\\.\\,\\;\\)])/iU",
+ ),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'au', 'augroup', 'autocmd', 'brea', 'break', 'bufadd',
+ 'bufcreate', 'bufdelete', 'bufenter', 'buffilepost',
+ 'buffilepre', 'bufleave', 'bufnew', 'bufnewfile',
+ 'bufread', 'bufreadcmd', 'bufreadpost', 'bufreadpre',
+ 'bufunload', 'bufwinenter', 'bufwinleave', 'bufwipeout',
+ 'bufwrite', 'bufwritecmd', 'bufwritepost', 'bufwritepre',
+ 'call', 'cat', 'catc', 'catch', 'cmd-event', 'cmdwinenter',
+ 'cmdwinleave', 'colorscheme', 'con', 'confirm', 'cont', 'conti',
+ 'contin', 'continu', 'continue', 'cursorhold', 'cursorholdi',
+ 'cursormoved', 'cursormovedi', 'ec', 'echo', 'echoe',
+ 'echoer', 'echoerr', 'echoh', 'echohl', 'echom', 'echoms',
+ 'echomsg', 'echon', 'el', 'els', 'else', 'elsei', 'elseif',
+ 'en', 'encodingchanged', 'end', 'endfo', 'endfor', 'endi',
+ 'endif', 'endt', 'endtr', 'endtry', 'endw', 'endwh', 'endwhi',
+ 'endwhil', 'endwhile', 'exe', 'exec', 'execu', 'execut',
+ 'execute', 'fileappendcmd', 'fileappendpost', 'fileappendpre',
+ 'filechangedro', 'filechangedshell', 'filechangedshellpost',
+ 'filereadcmd', 'filereadpost', 'filereadpre',
+ 'filetype', 'filewritecmd', 'filewritepost', 'filewritepre',
+ 'filterreadpost', 'filterreadpre', 'filterwritepost',
+ 'filterwritepre', 'fina', 'final', 'finall', 'finally',
+ 'finish', 'focusgained', 'focuslost', 'for', 'fun', 'func',
+ 'funct', 'functi', 'functio', 'function', 'funcundefined',
+ 'guienter', 'guifailed', 'hi', 'highlight', 'if', 'in',
+ 'insertchange', 'insertenter', 'insertleave', 'let', 'lockv',
+ 'lockva', 'lockvar', 'map', 'match', 'menupopup', 'nnoremap',
+ 'quickfixcmdpost', 'quickfixcmdpre', 'remotereply', 'retu',
+ 'retur', 'return', 'sessionloadpost', 'set', 'setlocal',
+ 'shellcmdpost', 'shellfilterpost', 'sourcecmd', 'sourcepre',
+ 'spellfilemissing', 'stdinreadpost', 'stdinreadpre',
+ 'swapexists', 'syntax', 'tabenter', 'tableave', 'termchanged',
+ 'termresponse', 'th', 'thr', 'thro', 'throw', 'tr', 'try', 'unl',
+ 'unle', 'unlet', 'unlo', 'unloc', 'unlock', 'unlockv',
+ 'unlockva', 'unlockvar', 'user', 'usergettingbored',
+ 'vimenter', 'vimleave', 'vimleavepre', 'vimresized', 'wh',
+ 'whi', 'whil', 'while', 'winenter', 'winleave'
+ ),
+ 2 => array(
+ '&lt;CR&gt;', '&lt;Esc&gt;', '&lt;F1&gt;', '&lt;F10&gt;',
+ '&lt;F11&gt;', '&lt;F12&gt;', '&lt;F2&gt;', '&lt;F3&gt;',
+ '&lt;F4&gt;', '&lt;F5&gt;', '&lt;F6&gt;', '&lt;F7&gt;',
+ '&lt;F8&gt;', '&lt;F9&gt;', '&lt;cr&gt;', '&lt;silent&gt;',
+ '-nargs', 'acd', 'ai', 'akm', 'al', 'aleph',
+ 'allowrevins', 'altkeymap', 'ambiwidth', 'ambw',
+ 'anti', 'antialias', 'ar', 'arab', 'arabic',
+ 'arabicshape', 'ari', 'arshape', 'autochdir',
+ 'autoindent', 'autoread', 'autowrite', 'autowriteall',
+ 'aw', 'awa', 'background', 'backspace', 'backup',
+ 'backupcopy', 'backupdir', 'backupext',
+ 'backupskip', 'balloondelay', 'ballooneval', 'balloonexpr',
+ 'bdir', 'bdlay', 'beval', 'bex', 'bexpr', 'bg',
+ 'bh', 'bin', 'binary', 'biosk', 'bioskey',
+ 'bk', 'bkc', 'bl', 'bomb', 'breakat', 'brk',
+ 'bs', 'bsdir', 'bsk', 'bt', 'bufhidden',
+ 'buftype', 'casemap', 'cb',
+ 'ccv', 'cd', 'cdpath', 'cedit', 'cf', 'cfu', 'ch',
+ 'charconvert', 'ci', 'cin', 'cink',
+ 'cinkeys', 'cino', 'cinoptions', 'cinw', 'cinwords',
+ 'clipboard', 'cmdheight', 'cmdwinheight',
+ 'cmp', 'cms', 'co', 'columns', 'com',
+ 'comc', 'comcl', 'comcle', 'comclea', 'comclear', 'comm',
+ 'comma', 'comman', 'command', 'comments', 'commentstring',
+ 'compatible', 'completefunc', 'completeopt',
+ 'consk', 'conskey', 'copyindent',
+ 'cot', 'cp', 'cpo', 'cpoptions', 'cpt',
+ 'cscopepathcomp', 'cscopeprg', 'cscopequickfix', 'cscopetag',
+ 'cscopetagorder', 'cscopeverbose',
+ 'cspc', 'csprg', 'csqf', 'cst', 'csto', 'csverb', 'cuc',
+ 'cul', 'cursorcolumn', 'cursorline', 'cwh', 'debug',
+ 'deco', 'def', 'define', 'delc', 'delco', 'delcom',
+ 'delcombine', 'delcomm', 'delcomman', 'delcommand', 'dex',
+ 'dg', 'dict', 'dictionary', 'diff', 'diffexpr',
+ 'diffopt', 'digraph', 'dip', 'dir', 'directory', 'display',
+ 'dlcomma', 'dy', 'ea', 'ead', 'eadirection',
+ 'eb', 'ed', 'edcompatible', 'ef', 'efm',
+ 'ei', 'ek', 'enc', 'encoding', 'endfun', 'endofline',
+ 'eol', 'ep', 'equalalways', 'equalprg', 'errorbells',
+ 'errorfile', 'errorformat', 'esckeys', 'et',
+ 'eventignore', 'ex', 'expandtab', 'exrc', 'fcl',
+ 'fcs', 'fdc', 'fde', 'fdi', 'fdl', 'fdls', 'fdm',
+ 'fdn', 'fdo', 'fdt', 'fen', 'fenc', 'fencs', 'fex',
+ 'ff', 'ffs', 'fileencoding', 'fileencodings', 'fileformat',
+ 'fileformats', /*'filetype',*/ 'fillchars', 'fk',
+ 'fkmap', 'flp', 'fml', 'fmr', 'fo', 'foldclose',
+ 'foldcolumn', 'foldenable', 'foldexpr', 'foldignore',
+ 'foldlevelstart', 'foldmarker', 'foldmethod', 'foldminlines',
+ 'foldnestmax', 'foldopen', 'formatexpr', 'formatlistpat',
+ 'formatoptions', 'formatprg', 'fp', 'fs', 'fsync', 'ft',
+ 'gcr', 'gd', 'gdefault', 'gfm', 'gfn', 'gfs', 'gfw',
+ 'ghr', 'go', 'gp', 'grepformat', 'grepprg', 'gtl',
+ 'gtt', 'guicursor', 'guifont', 'guifontset',
+ 'guifontwide', 'guiheadroom', 'guioptions', 'guipty',
+ 'guitablabel', 'guitabtooltip', 'helpfile',
+ 'helpheight', 'helplang', 'hf', 'hh', 'hid', 'hidden',
+ 'history', 'hk', 'hkmap', 'hkmapp', 'hkp', 'hl',
+ 'hlg', 'hls', 'hlsearch', 'ic', 'icon', 'iconstring',
+ 'ignorecase', 'im', 'imactivatekey', 'imak', 'imc',
+ 'imcmdline', 'imd', 'imdisable', 'imi', 'iminsert', 'ims',
+ 'imsearch', 'inc', 'include', 'includeexpr',
+ 'incsearch', 'inde', 'indentexpr', 'indentkeys',
+ 'indk', 'inex', 'inf', 'infercase', 'insertmode', 'is', 'isf',
+ 'isfname', 'isi', 'isident', 'isk', 'iskeyword',
+ 'isp', 'isprint', 'joinspaces', 'js', 'key',
+ 'keymap', 'keymodel', 'keywordprg', 'km', 'kmp', 'kp',
+ 'langmap', 'langmenu', 'laststatus', 'lazyredraw', 'lbr',
+ 'lcs', 'linebreak', 'lines', 'linespace', 'lisp',
+ 'lispwords', 'list', 'listchars', 'lm', 'lmap',
+ 'loadplugins', 'lpl', 'ls', 'lsp', 'lw', 'lz', 'ma',
+ 'macatsui', 'magic', 'makeef', 'makeprg', 'mat',
+ 'matchpairs', 'matchtime', 'maxcombine', 'maxfuncdepth',
+ 'maxmapdepth', 'maxmem', 'maxmempattern',
+ 'maxmemtot', 'mco', 'mef', 'menuitems', 'mfd', 'mh',
+ 'mis', 'mkspellmem', 'ml', 'mls', 'mm', 'mmd', 'mmp',
+ 'mmt', 'mod', 'modeline', 'modelines', 'modifiable',
+ 'modified', 'more', 'mouse', 'mousef', 'mousefocus',
+ 'mousehide', 'mousem', 'mousemodel', 'mouses',
+ 'mouseshape', 'mouset', 'mousetime', 'mp', 'mps', 'msm',
+ 'mzq', 'mzquantum', 'nf', 'noacd', 'noai', 'noakm',
+ 'noallowrevins', 'noaltkeymap', 'noanti', 'noantialias',
+ 'noar', 'noarab', 'noarabic', 'noarabicshape', 'noari',
+ 'noarshape', 'noautochdir', 'noautoindent', 'noautoread',
+ 'noautowrite', 'noautowriteall', 'noaw', 'noawa', 'nobackup',
+ 'noballooneval', 'nobeval', 'nobin', 'nobinary', 'nobiosk',
+ 'nobioskey', 'nobk', 'nobl', 'nobomb', 'nobuflisted', 'nocf',
+ 'noci', 'nocin', 'nocindent', 'nocompatible', 'noconfirm',
+ 'noconsk', 'noconskey', 'nocopyindent', 'nocp', 'nocscopetag',
+ 'nocscopeverbose', 'nocst', 'nocsverb', 'nocuc', 'nocul',
+ 'nocursorcolumn', 'nocursorline', 'nodeco', 'nodelcombine',
+ 'nodg', 'nodiff', 'nodigraph', 'nodisable', 'noea', 'noeb',
+ 'noed', 'noedcompatible', 'noek', 'noendofline', 'noeol',
+ 'noequalalways', 'noerrorbells', 'noesckeys', 'noet',
+ 'noex', 'noexpandtab', 'noexrc', 'nofen', 'nofk', 'nofkmap',
+ 'nofoldenable', 'nogd', 'nogdefault', 'noguipty', 'nohid',
+ 'nohidden', 'nohk', 'nohkmap', 'nohkmapp', 'nohkp', 'nohls',
+ 'nohlsearch', 'noic', 'noicon', 'noignorecase', 'noim',
+ 'noimc', 'noimcmdline', 'noimd', 'noincsearch', 'noinf',
+ 'noinfercase', 'noinsertmode', 'nois', 'nojoinspaces',
+ 'nojs', 'nolazyredraw', 'nolbr', 'nolinebreak', 'nolisp',
+ 'nolist', 'noloadplugins', 'nolpl', 'nolz', 'noma',
+ 'nomacatsui', 'nomagic', 'nomh', 'noml', 'nomod',
+ 'nomodeline', 'nomodifiable', 'nomodified', 'nomore',
+ 'nomousef', 'nomousefocus', 'nomousehide', 'nonu',
+ 'nonumber', 'noodev', 'noopendevice', 'nopaste', 'nopi',
+ 'nopreserveindent', 'nopreviewwindow', 'noprompt', 'nopvw',
+ 'noreadonly', 'noremap', 'norestorescreen', 'norevins',
+ 'nori', 'norightleft', 'norightleftcmd', 'norl', 'norlc',
+ 'noro', 'nors', 'noru', 'noruler', 'nosb', 'nosc', 'noscb',
+ 'noscrollbind', 'noscs', 'nosecure', 'nosft', 'noshellslash',
+ 'noshelltemp', 'noshiftround', 'noshortname', 'noshowcmd',
+ 'noshowfulltag', 'noshowmatch', 'noshowmode', 'nosi', 'nosm',
+ 'nosmartcase', 'nosmartindent', 'nosmarttab', 'nosmd',
+ 'nosn', 'nosol', 'nospell', 'nosplitbelow', 'nosplitright',
+ 'nospr', 'nosr', 'nossl', 'nosta', 'nostartofline',
+ 'nostmp', 'noswapfile', 'noswf', 'nota', 'notagbsearch',
+ 'notagrelative', 'notagstack', 'notbi', 'notbidi', 'notbs',
+ 'notermbidi', 'noterse', 'notextauto', 'notextmode',
+ 'notf', 'notgst', 'notildeop', 'notimeout', 'notitle',
+ 'noto', 'notop', 'notr', 'nottimeout', 'nottybuiltin',
+ 'nottyfast', 'notx', 'novb', 'novisualbell', 'nowa',
+ 'nowarn', 'nowb', 'noweirdinvert', 'nowfh', 'nowfw',
+ 'nowildmenu', 'nowinfixheight', 'nowinfixwidth', 'nowiv',
+ 'nowmnu', 'nowrap', 'nowrapscan', 'nowrite', 'nowriteany',
+ 'nowritebackup', 'nows', 'nrformats', 'nu', 'number',
+ 'numberwidth', 'nuw', 'odev', 'oft', 'ofu',
+ 'omnifunc', 'opendevice', 'operatorfunc', 'opfunc',
+ 'osfiletype', 'pa', 'para', 'paragraphs',
+ 'paste', 'pastetoggle', 'patchexpr',
+ 'patchmode', 'path', 'pdev', 'penc', 'pex', 'pexpr',
+ 'pfn', 'ph', 'pheader', 'pi', 'pm', 'pmbcs',
+ 'pmbfn', 'popt', 'preserveindent', 'previewheight',
+ 'previewwindow', 'printdevice', 'printencoding', 'printexpr',
+ 'printfont', 'printheader', 'printmbcharset',
+ 'printmbfont', 'printoptions', 'prompt', 'pt', 'pumheight',
+ 'pvh', 'pvw', 'qe', 'quoteescape', 'rdt',
+ 'readonly', 'redrawtime', 'remap', 'report',
+ 'restorescreen', 'revins', 'ri', 'rightleft', 'rightleftcmd',
+ 'rl', 'rlc', 'ro', 'rs', 'rtp', 'ru',
+ 'ruf', 'ruler', 'rulerformat', 'runtimepath', 'sb', 'sbo',
+ 'sbr', 'sc', 'scb', 'scr', 'scroll', 'scrollbind',
+ 'scrolljump', 'scrolloff', 'scrollopt',
+ 'scs', 'sect', 'sections', 'secure', 'sel',
+ 'selection', 'selectmode', 'sessionoptions', 'sft',
+ 'sh', 'shcf', 'shell', 'shellcmdflag', 'shellpipe',
+ 'shellquote', 'shellredir', 'shellslash',
+ 'shelltemp', 'shelltype', 'shellxquote', 'shiftround',
+ 'shiftwidth', 'shm', 'shortmess', 'shortname',
+ 'showbreak', 'showcmd', 'showfulltag', 'showmatch',
+ 'showmode', 'showtabline', 'shq', 'si', 'sidescroll',
+ 'sidescrolloff', 'siso', 'sj', 'slm', 'sm', 'smartcase',
+ 'smartindent', 'smarttab', 'smc', 'smd', 'sn',
+ 'so', 'softtabstop', 'sol', 'sp', 'spc', 'spell',
+ 'spellcapcheck', 'spellfile', 'spelllang',
+ 'spf', 'spl', 'splitbelow', 'splitright', 'spr',
+ 'sps', 'sr', 'srr', 'ss', 'ssl', 'ssop', 'st', 'sta',
+ 'stal', 'startofline', 'statusline', 'stl', 'stmp',
+ 'sts', 'su', 'sua', 'suffixes', 'suffixesadd', 'sw',
+ 'swapfile', 'swapsync', 'swb', 'swf', 'switchbuf',
+ 'sws', 'sxq', 'syn', 'synmaxcol', 'ta',
+ 'tabline', 'tabpagemax', 'tabstop', 'tag',
+ 'tagbsearch', 'taglength', 'tagrelative', 'tags', 'tagstack',
+ 'tal', 'tb', 'tbi', 'tbidi', 'tbis', 'tbs',
+ 'tenc', 'term', 'termbidi', 'termencoding', 'terse',
+ 'textauto', 'textmode', 'textwidth', 'tf', 'tgst',
+ 'thesaurus', 'tildeop', 'timeout', 'timeoutlen',
+ 'title', 'titlelen', 'titleold', 'titlestring',
+ 'tl', 'tm', 'to', 'toolbar', 'toolbariconsize', 'top',
+ 'tpm', 'ts', 'tsl', 'tsr', 'ttimeout',
+ 'ttimeoutlen', 'ttm', 'tty', 'ttybuiltin', 'ttyfast', 'ttym',
+ 'ttymouse', 'ttyscroll', 'ttytype', 'tw', 'tx', 'uc',
+ 'ul', 'undolevels', 'updatecount', 'updatetime', 'ut',
+ 'vb', 'vbs', 'vdir', 've', 'verbose', 'verbosefile',
+ 'vfile', 'vi', 'viewdir', 'viewoptions', 'viminfo',
+ 'virtualedit', 'visualbell', 'vop', 'wa', 'wak',
+ 'warn', 'wb', 'wc', 'wcm', 'wd', 'weirdinvert', 'wfh',
+ 'wfw', /*'wh',*/ 'whichwrap', 'wi', 'wig', 'wildchar',
+ 'wildcharm', 'wildignore', 'wildmenu',
+ 'wildmode', 'wildoptions', 'wim', 'winaltkeys', 'window',
+ 'winfixheight', 'winfixwidth', 'winheight',
+ 'winminheight', 'winminwidth', 'winwidth', 'wiv',
+ 'wiw', 'wm', 'wmh', 'wmnu', 'wmw', 'wop', 'wrap',
+ 'wrapmargin', 'wrapscan', 'write', 'writeany',
+ 'writebackup', 'writedelay', 'ws', 'ww'
+ ),
+ 3 => array(
+ 'BufAdd', 'BufCreate', 'BufDelete', 'BufEnter', 'BufFilePost',
+ 'BufFilePre', 'BufHidden', 'BufLeave', 'BufNew', 'BufNewFile',
+ 'BufRead', 'BufReadCmd', 'BufReadPost', 'BufReadPre',
+ 'BufUnload', 'BufWinEnter', 'BufWinLeave', 'BufWipeout',
+ 'BufWrite', 'BufWriteCmd', 'BufWritePost', 'BufWritePre',
+ 'Cmd-event', 'CmdwinEnter', 'CmdwinLeave', 'ColorScheme',
+ 'CursorHold', 'CursorHoldI', 'CursorMoved', 'CursorMovedI',
+ 'EncodingChanged', 'FileAppendCmd', 'FileAppendPost',
+ 'FileAppendPre', 'FileChangedRO', 'FileChangedShell',
+ 'FileChangedShellPost', 'FileEncoding', 'FileReadCmd',
+ 'FileReadPost', 'FileReadPre', 'FileType',
+ 'FileWriteCmd', 'FileWritePost', 'FileWritePre',
+ 'FilterReadPost', 'FilterReadPre', 'FilterWritePost',
+ 'FilterWritePre', 'FocusGained', 'FocusLost', 'FuncUndefined',
+ 'GUIEnter', 'GUIFailed', 'InsertChange', 'InsertEnter',
+ 'InsertLeave', 'MenuPopup', 'QuickFixCmdPost',
+ 'QuickFixCmdPre', 'RemoteReply', 'SessionLoadPost',
+ 'ShellCmdPost', 'ShellFilterPost', 'SourceCmd',
+ 'SourcePre', 'SpellFileMissing', 'StdinReadPost',
+ 'StdinReadPre', 'SwapExists', 'Syntax', 'TabEnter',
+ 'TabLeave', 'TermChanged', 'TermResponse', 'User',
+ 'UserGettingBored', 'VimEnter', 'VimLeave', 'VimLeavePre',
+ 'VimResized', 'WinEnter', 'WinLeave', 'abs', 'add', 'append',
+ 'argc', 'argidx', 'argv', 'atan', 'browse', 'browsedir',
+ 'bufexists', 'buflisted', 'bufloaded', 'bufname', 'bufnr',
+ 'bufwinnr', 'byte2line', 'byteidx', 'ceil', 'changenr',
+ 'char2nr', 'cindent', 'clearmatches', 'col', 'complete',
+ 'complete_add', 'complete_check', 'copy',
+ 'cos', 'count', 'cscope_connection', 'cursor', 'deepcopy',
+ 'delete', 'did_filetype', 'diff_filler', 'diff_hlID',
+ 'empty', 'escape', 'eval', 'eventhandler', 'executable',
+ 'exists', 'expand', 'extend', 'feedkeys', 'filereadable',
+ 'filewritable', 'filter', 'finddir', 'findfile', 'float2nr',
+ 'floor', 'fnameescape', 'fnamemodify', 'foldclosed',
+ 'foldclosedend', 'foldlevel', 'foldtext', 'foldtextresult',
+ 'foreground', 'garbagecollect', 'get', 'getbufline',
+ 'getbufvar', 'getchar', 'getcharmod', 'getcmdline',
+ 'getcmdpos', 'getcmdtype', 'getcwd', 'getfontname',
+ 'getfperm', 'getfsize', 'getftime', 'getftype', 'getline',
+ 'getloclist', 'getmatches', 'getpid', 'getpos', 'getqflist',
+ 'getreg', 'getregtype', 'gettabwinvar', 'getwinposx',
+ 'getwinposy', 'getwinvar', 'glob', 'globpath', 'has',
+ 'has_key', 'haslocaldir', 'hasmapto', 'histadd', 'histdel',
+ 'histget', 'histnr', 'hlID', 'hlexists', 'hostname', 'iconv',
+ 'indent', 'index', 'input', 'inputdialog', 'inputlist',
+ 'inputrestore', 'inputsave', 'inputsecret', 'insert',
+ 'isdirectory', 'islocked', 'items', 'join', 'keys', 'len',
+ 'libcall', 'libcallnr', 'line', 'line2byte', 'lispindent',
+ 'localtime', 'log10', 'maparg', 'mapcheck', 'matchadd',
+ 'matcharg', 'matchdelete', 'matchend', 'matchlist',
+ 'matchstr', 'max', 'min', 'mkdir', 'mode', 'nextnonblank',
+ 'nr2char', 'off', 'on', 'pathshorten', 'plugin', 'pow',
+ 'prevnonblank', 'printf', 'pumvisible', 'range', 'readfile',
+ 'reltime', 'reltimestr', 'remote_expr', 'remote_foreground',
+ 'remote_peek', 'remote_read', 'remote_send', 'remove',
+ 'rename', 'repeat', 'resolve', 'reverse', 'round', 'search',
+ 'searchdecl', 'searchpair', 'searchpairpos', 'searchpos',
+ 'server2client', 'serverlist', 'setbufvar', 'setcmdpos',
+ 'setline', 'setloclist', 'setmatches', 'setpos', 'setqflist',
+ 'setreg', 'settabwinvar', 'setwinvar', 'shellescape',
+ 'simplify', 'sin', 'sort', 'soundfold', 'spellbadword',
+ 'spellsuggest', 'split', 'sqrt', 'str2float', 'str2nr',
+ 'strftime', 'stridx', 'string', 'strlen', 'strpart',
+ 'strridx', 'strtrans', 'submatch', 'substitute',
+ 'synID', 'synIDattr', 'synIDtrans', 'synstack', 'system',
+ 'tabpagebuflist', 'tabpagenr', 'tabpagewinnr', 'tagfiles',
+ 'taglist', 'tempname', 'tolower', 'toupper', 'trunc',
+ 'type', 'values', 'virtcol', 'visualmode', 'winbufnr',
+ 'wincol', 'winline', 'winnr', 'winrestcmd',
+ 'winrestview', 'winsaveview', 'writefile'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '!', '%', '&', '*', '|', '/', '<', '>',
+ '^', '-', '+', '~', '?', ':', '$', '@', '.'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ ),
+ 'STYLES' => array(
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+// 2 => 'color: #009966; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => ''
+ ),
+ 'KEYWORDS' => array(
+ 1 => 'color: #804040;',
+ 2 => 'color: #668080;',
+ 3 => 'color: #25BB4D;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #000000;',
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000000; font-weight:bold;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #C5A22D;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;'
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false, //Save some time as OO identifiers aren't used
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(),
+ 'HIGHLIGHT_STRICT_BLOCK' => array()
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/visualfoxpro.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/visualfoxpro.php
new file mode 100644
index 00000000..123a3db4
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/visualfoxpro.php
@@ -0,0 +1,456 @@
+<?php
+/*************************************************************************************
+ * visualfoxpro.php
+ * ----------------
+ * Author: Roberto Armellin (r.armellin@tin.it)
+ * Copyright: (c) 2004 Roberto Armellin, Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/09/17
+ *
+ * Visual FoxPro language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Removed tab as a symbol char
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/10/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Visual Fox Pro',
+ 'COMMENT_SINGLE' => array(1 => "//", 2 => "\n*"),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'Case', 'Else', '#Else', 'Then',
+ 'Endcase', 'Enddefine', 'Enddo', 'Endfor', 'Endfunc', 'Endif', 'Endprintjob',
+ 'Endproc', 'Endscan', 'Endtext', 'Endwith', '#Endif',
+ '#Elif','#Define','#If','#Include',
+ '#Itsexpression','#Readclauses','#Region','#Section','#Undef','#Wname',
+ 'Define','Do',
+ 'For','Function','Hidden',
+ 'If','Local','Lparameter','Lparameters','Next','Otherwise',
+ 'Parameters','Printjob','Procedure','Protected','Public','Scan',
+ 'Text','While','With','Abs','Accept','Access','Aclass','Acopy',
+ 'Acos','Adatabases','Adbobjects','Addbs','Addrelationtoenv','Addtabletoenv',
+ 'Adel','Adir','Aelement','Aerror','Afields','Afont',
+ 'Agetclass','Agetfileversion','Ains','Ainstance','Alen','Align',
+ 'Alines','Alltrim','Alter','Amembers','Amouseobj','Anetresources',
+ 'Ansitooem','Append','Aprinters','Ascan','Aselobj','Asin',
+ 'Asort','Assert','Asserts','Assist','Asubscript','Asynchronous',
+ 'At_c','Atan','Atc','Atcc','Atcline','Atline',
+ 'Atn2','Aused','Autoform','Autoreport','Avcxclasses','Average',
+ 'BarCount','BarPrompt','BatchMode','BatchUpdateCount','Begin','BellSound',
+ 'BinToC','Bitand','Bitclear','Bitlshift','Bitnot',
+ 'Bitor','Bitrshift','Bitset','Bittest','Bitxor','Bof',
+ 'Browse','BrowseRefresh','Buffering','BuilderLock','COMArray','COMReturnError',
+ 'CToBin','Calculate','Call','Capslock','Cd','Cdow',
+ 'Ceiling','Central','Change','Char','Chdir','Chr',
+ 'Chrsaw','Chrtran','Chrtranc','Close','Cmonth','Cntbar',
+ 'Cntpad','Col','Comclassinfo','CommandTargetQuery','Compile','Completed',
+ 'Compobj','Compute','Concat','ConnectBusy','ConnectHandle','ConnectName',
+ 'ConnectString','ConnectTimeOut','ContainerReleaseType','Continue','Copy','Cos',
+ 'Cot','Count','Coverage','Cpconvert','Cpcurrent','Cpdbf',
+ 'Cpnotrans','Create','CreateBinary','Createobject','Createobjectex','Createoffline',
+ 'CrsBuffering','CrsFetchMemo','CrsFetchSize','CrsMaxRows','CrsMethodUsed','CrsNumBatch',
+ 'CrsShareConnection','CrsUseMemoSize','CrsWhereClause','Ctod','Ctot',
+ 'Curdate','Curdir','CurrLeft','CurrSymbol','CursorGetProp','CursorSetProp',
+ 'Curtime','Curval','DBGetProp','DBSetProp','DB_BufLockRow','DB_BufLockTable',
+ 'DB_BufOff','DB_BufOptRow','DB_BufOptTable','DB_Complette','DB_DeleteInsert','DB_KeyAndModified',
+ 'DB_KeyAndTimestamp','DB_KeyAndUpdatable','DB_LocalSQL','DB_NoPrompt','DB_Prompt','DB_RemoteSQL',
+ 'DB_TransAuto','DB_TransManual','DB_TransNone','DB_Update','Datetime','Day',
+ 'Dayname','Dayofmonth','Dayofweek','Dayofyear','Dbalias','Dbused',
+ 'Ddeaborttrans','Ddeadvise','Ddeenabled','Ddeexecute','Ddeinitiate','Ddelasterror',
+ 'Ddepoke','Dderequest','Ddesetoption','Ddesetservice','Ddesettopic','Ddeterminate',
+ 'Debugout','Declare','DefOLELCid','DefaultValue','Defaultext','Degrees',
+ 'DeleteTrigger','Desc','Description','Difference','Dimension','Dir',
+ 'Directory','Diskspace','DispLogin','DispWarnings','Display','Dll',
+ 'Dmy','DoDefault','DoEvents','Doc','Dow',
+ 'Drivetype','Drop','Dropoffline','Dtoc','Dtor','Dtos',
+ 'Dtot','DynamicInputMask','Each','Edit','Eject','Elif',
+ 'End','Eof','Erase','Evaluate','Event','Eventtracking',
+ 'Exclude','Exclusive','Exit','Exp','Export','External',
+ 'FDate','FTime','Fchsize','Fclose','Fcount','Fcreate',
+ 'Feof','Ferror','FetchMemo','FetchSize','Fflush','Fgets',
+ 'Filer','Filetostr','Find','Fklabel','Fkmax','Fldlist',
+ 'Flock','Floor','Flush','Fontmetric','Fopen','Forceext',
+ 'Forcepath','FormSetClass','FormSetLib','FormsClass','FormsLib','Found',
+ 'FoxPro','Foxcode','Foxdoc','Foxgen','Foxgraph','Foxview',
+ 'Fputs','Fread','French','Fseek','Fsize','Fv',
+ 'Fwrite','Gather','German','GetPem','Getbar','Getcolor',
+ 'Getcp','Getdir','Getenv','Getexpr','Getfile','Getfldstate',
+ 'Getfont','Gethost','Getnextmodified','Getobject','Getpad','Getpict',
+ 'Getprinter','Go','Gomonth','Goto','Graph','GridHorz',
+ 'GridShow','GridShowPos','GridSnap','GridVert','Help','HelpOn',
+ 'HelpTo','HighLightRow','Home','Hour','IMEStatus','IdleTimeOut',
+ 'Idxcollate','Ifdef','Ifndef','Iif','Import','Include',
+ 'Indbc','Index','Indexseek','Inkey','Inlist','Input',
+ 'Insert','InsertTrigger','Insmode','IsBlank','IsFLocked','IsLeadByte',
+ 'IsMouse','IsNull','IsRLocked','Isalpha','Iscolor','Isdigit',
+ 'IsExclusive','Ishosted','IsLower','IsReadOnly',
+ 'IsUpper','Italian','Japan','Join','Justdrive','Justext',
+ 'Justfname','Justpath','Juststem','KeyField','KeyFieldList','Keyboard'
+ ),
+ 2 => array('Keymatch','LastProject','Lastkey','Lcase','Leftc','Len',
+ 'Lenc','Length','Likec','Lineno','LoadPicture',
+ 'Locate','Locfile','Log','Log10','Logout','Lookup',
+ 'Loop','Lower','Ltrim','Lupdate','Mail','MaxRecords',
+ 'Mcol','Md','Mdown','Mdx','Mdy','Memlines',
+ 'Menu','Messagebox','Minute','Mkdir','Mline','Modify',
+ 'Month','Monthname','Mouse','Mrkbar','Mrkpad','Mrow',
+ 'Mtdll','Mton','Mwindow','Native','Ndx','Network',
+ 'NoFilter','Nodefault','Normalize','Note','Now','Ntom',
+ 'NullString','Numlock','Nvl','ODBChdbc','ODBChstmt','OLEDropTextInsertion',
+ 'OLELCid','Objnum','Objref','Objtoclient','Objvar','Occurs',
+ 'Oemtoansi','Oldval','OlePublic','Olereturnerror','On','Open',
+ 'Oracle','Order','Os','Outer','PCount','Pack',
+ 'PacketSize','Padc','Padl','Padr','Payment','Pcol',
+ 'PemStatus','Pi','Pivot','Play','Pop','Popup',
+ 'Power','PrimaryKey','Printstatus','Private','Prmbar','Prmpad',
+ 'ProjectClick','Proper','Prow','Prtinfo','Push','Putfile',
+ 'Pv','Qpr','Quater','QueryTimeOut','Quit','Radians',
+ 'Rand','Rat','Ratc','Ratline','Rd','Rdlevel',
+ 'Read','Readkey','Recall','Reccount','RecentlyUsedFiles','Recno',
+ 'Recsize','Regional','Reindex','RelatedChild','RelatedTable','RelatedTag',
+ 'Remove','Rename','Repeat','Replace','Replicate','Report',
+ 'ResHeight','ResWidth','ResourceOn','ResourceTo','Resources','Restore',
+ 'Resume','Retry','Return','Revertoffline','Rgbscheme','Rightc',
+ 'Rlock','Rmdir','Rollback','Round','Rtod','Rtrim',
+ 'RuleExpression','RuleText','Run','Runscript','Rview','SQLAsynchronous',
+ 'SQLBatchMode','SQLCancel','SQLColumns','SQLConnect','SQLConnectTimeOut','SQLDisconnect',
+ 'SQLDispLogin','SQLDispWarnings','SQLExec','SQLGetProp','SQLIdleTimeOut','SQLMoreResults',
+ 'SQLPrepare','SQLQueryTimeOut','SQLSetProp','SQLTables','SQLTransactions','SQLWaitTime',
+ 'Save','SavePicture','ScaleUnits','Scatter','Scols',
+ 'Scroll','Sec','Second','Seek','Select','SendUpdates',
+ 'Set','SetDefault','Setfldstate','Setup','ShareConnection','ShowOLEControls',
+ 'ShowOLEInsertable','ShowVCXs','Sign','Sin','Size','SizeBox',
+ 'Skpbar','Skppad','Sort','Soundex','SourceName','Sqlcommit',
+ 'Sqll','Sqlrollback','Sqlstringconnect','Sqrt','Srows','StatusBar',
+ 'Store','Str','Strconv','Strtofile','Strtran','Stuff',
+ 'Stuffc','Substr','Substrc','Substring','Sum','Suspend',
+ 'Sys','Sysmetric','TabOrdering','Table','TableRefresh','Tablerevert',
+ 'Tableupdate','TagCount','TagNo','Tan','Target','This',
+ 'Thisform','Thisformset','Timestamp','Timestampdiff','Total','Transactions',
+ 'Transform','Trim','Truncate','Ttoc','Ttod','Txnlevel',
+ 'Txtwidth','Type','Ucase','Undefine','Unlock','Unpack',
+ 'Updatable','UpdatableFieldList','Update','UpdateName','UpdateNameList','UpdateTrigger',
+ 'UpdateType','Updated','Upper','Upsizing','Usa','Use',
+ 'UseMemoSize','Used','Val','Validate','Varread','Vartype',
+ 'Version','VersionLanguage','Wait','WaitTime','Wborder','Wchild',
+ 'Wcols','Week','Wexist','Wfont','WhereType','Windcmd',
+ 'Windhelp','Windmemo','Windmenu','Windmodify','Windquery','Windscreen',
+ 'Windsnip','Windstproc','WizardPrompt','Wlast','Wlcol','Wlrow',
+ 'Wmaximum','Wminimum','Wontop','Woutput','Wparent','Wread',
+ 'Wrows','Wtitle','Wvisible','Year','Zap','_Alignment',
+ '_Asciicols','_Asciirows','_Assist','_Beautify','_Box','_Browser',
+ '_Builder','_Calcmem','_Calcvalue','_Cliptext','_Converter','_Coverage',
+ '_Curobj','_Dblclick','_Diarydate','_Dos','_Foxdoc','_Foxgraph',
+ '_Gallery','_Gengraph','_Genhtml','_Genmenu','_Genpd','_Genscrn',
+ '_Genxtab','_Getexpr','_Include','_Indent','_Lmargin','_Mac',
+ '_Mbr_appnd','_Mbr_cpart','_Mbr_delet','_Mbr_font','_Mbr_goto','_Mbr_grid',
+ '_Mbr_link','_Mbr_mode','_Mbr_mvfld','_Mbr_mvprt','_Mbr_seek','_Mbr_sp100',
+ '_Mbr_sp200','_Mbr_szfld','_Mbrowse','_Mda_appnd','_Mda_avg','_Mda_brow',
+ '_Mda_calc','_Mda_copy','_Mda_count','_Mda_label','_Mda_pack','_Mda_reprt',
+ '_Mda_rindx','_Mda_setup','_Mda_sort','_Mda_sp100','_Mda_sp200','_Mda_sp300',
+ '_Mda_sum','_Mda_total','_Mdata','_Mdiary','_Med_clear','_Med_copy',
+ '_Med_cut','_Med_cvtst','_Med_find','_Med_finda','_Med_goto','_Med_insob',
+ '_Med_link','_Med_obj','_Med_paste','_Med_pref','_Med_pstlk','_Med_redo',
+ '_Med_repl','_Med_repla','_Med_slcta','_Med_sp100','_Med_sp200','_Med_sp300',
+ '_Med_sp400','_Med_sp500','_Med_undo','_Medit','_Mfi_clall','_Mfi_close',
+ '_Mfi_export','_Mfi_import','_Mfi_new','_Mfi_open','_Mfi_pgset','_Mfi_prevu',
+ '_Mfi_print','_Mfi_quit','_Mfi_revrt','_Mfi_savas','_Mfi_save','_Mfi_send',
+ '_Mfi_setup','_Mfi_sp100','_Mfi_sp200','_Mfi_sp300','_Mfi_sp400','_Mfile',
+ '_Mfiler','_Mfirst','_Mlabel','_Mlast','_Mline','_Mmacro',
+ '_Mmbldr','_Mpr_beaut','_Mpr_cancl','_Mpr_compl','_Mpr_do','_Mpr_docum',
+ '_Mpr_formwz','_Mpr_gener','_Mpr_graph','_Mpr_resum','_Mpr_sp100','_Mpr_sp200',
+ '_Mpr_sp300','_Mpr_suspend','_Mprog','_Mproj','_Mrc_appnd','_Mrc_chnge',
+ '_Mrc_cont','_Mrc_delet','_Mrc_goto','_Mrc_locat','_Mrc_recal','_Mrc_repl',
+ '_Mrc_seek','_Mrc_sp100','_Mrc_sp200','_Mrecord','_Mreport','_Mrqbe',
+ '_Mscreen','_Msm_data','_Msm_edit','_Msm_file','_Msm_format','_Msm_prog',
+ '_Msm_recrd','_Msm_systm','_Msm_text','_Msm_tools','_Msm_view','_Msm_windo',
+ '_Mst_about','_Mst_ascii','_Mst_calcu','_Mst_captr','_Mst_dbase','_Mst_diary',
+ '_Mst_filer','_Mst_help','_Mst_hphow','_Mst_hpsch','_Mst_macro','_Mst_office',
+ '_Mst_puzzl','_Mst_sp100','_Mst_sp200','_Mst_sp300','_Mst_specl','_Msysmenu',
+ '_Msystem','_Mtable','_Mtb_appnd','_Mtb_cpart','_Mtb_delet','_Mtb_delrc',
+ '_Mtb_goto','_Mtb_link','_Mtb_mvfld','_Mtb_mvprt','_Mtb_props','_Mtb_recal',
+ '_Mtb_sp100','_Mtb_sp200','_Mtb_sp300','_Mtb_sp400','_Mtb_szfld','_Mwi_arran',
+ '_Mwi_clear','_Mwi_cmd','_Mwi_color','_Mwi_debug','_Mwi_hide','_Mwi_hidea',
+ '_Mwi_min','_Mwi_move','_Mwi_rotat','_Mwi_showa','_Mwi_size','_Mwi_sp100',
+ '_Mwi_sp200','_Mwi_toolb','_Mwi_trace','_Mwi_view','_Mwi_zoom','_Mwindow',
+ '_Mwizards','_Mwz_all','_Mwz_form','_Mwz_foxdoc','_Mwz_import','_Mwz_label',
+ '_Mwz_mail','_Mwz_pivot','_Mwz_query','_Mwz_reprt','_Mwz_setup','_Mwz_table',
+ '_Mwz_upsizing','_Netware','_Oracle','_Padvance','_Pageno','_Pbpage',
+ '_Pcolno','_Pcopies','_Pdparms','_Pdriver','_Pdsetup','_Pecode',
+ '_Peject','_Pepage','_Pform','_Plength','_Plineno','_Ploffset',
+ '_Ppitch','_Pquality','_Pretext','_Pscode','_Pspacing','_Pwait',
+ '_Rmargin','_Runactivedoc','_Samples','_Screen','_Shell','_Spellchk',
+ '_Sqlserver','_Startup','_Tabs','_Tally','_Text','_Throttle',
+ '_Transport','_Triggerlevel','_Unix','_WebDevOnly','_WebMenu','_WebMsftHomePage',
+ '_WebVFPHomePage','_WebVfpOnlineSupport','_Windows','_Wizard','_Wrap','_scctext',
+ '_vfp','Additive','After','Again','Aindent','Alignright',
+ 'All','Alt','Alternate','And','Ansi','Any',
+ 'Aplabout','App','Array','As','Asc','Ascending',
+ 'Ascii','At','Attributes','Automatic','Autosave','Avg',
+ 'Bar','Before','Bell','Between','Bitmap','Blank',
+ 'Blink','Blocksize','Border','Bottom','Brstatus','Bucket',
+ 'Buffers','By','Candidate','Carry','Cascade','Catalog',
+ 'Cdx','Center','Century','Cga','Character','Check',
+ 'Classlib','Clock','Cnt','Codepage','Collate','Color',
+ 'Com1','Com2','Command','Compact','Compatible','Compress',
+ 'Confirm','Connection','Connections','Connstring','Console','Copies',
+ 'Cpcompile','Cpdialog','Csv','Currency','Cycle','Databases',
+ 'Datasource','Date','Db4','Dbc','Dbf','Dbmemo3',
+ 'Debug','Decimals','Defaultsource','Deletetables','Delimited','Delimiters',
+ 'Descending','Design','Development','Device','Dif','Disabled',
+ 'Distinct','Dlls','Dohistory','Dos','Dosmem','Double',
+ 'Driver','Duplex','Echo','Editwork','Ega25','Ega43',
+ 'Ems','Ems64','Encrypt','Encryption','Environment','Escape',
+ 'Events','Exact','Except','Exe','Exists','Expression',
+ 'Extended','F','Fdow','Fetch','Field','Fields',
+ 'File','Files','Fill','Fixed','Float','Foldconst',
+ 'Font','Footer','Force','Foreign','Fox2x','Foxplus',
+ 'Free','Freeze','From','Fullpath','Fw2','Fweek',
+ 'Get','Gets','Global','Group','Grow','Halfheight',
+ 'Having','Heading','Headings','Helpfilter','History','Hmemory',
+ 'Hours','Id','In','Indexes','Information','Instruct',
+ 'Int','Integer','Intensity','Intersect','Into','Is',
+ 'Isometric','Key','Keycolumns','Keycomp','Keyset','Last',
+ 'Ledit','Level','Library','Like','Linked','Lock',
+ 'Logerrors','Long','Lpartition','Mac','Macdesktop','Machelp',
+ 'Mackey','Macros','Mark','Master','Max','Maxmem',
+ 'Mdi','Memlimit','Memory','Memos','Memowidth','Memvar',
+ 'Menus','Messages','Middle','Min','Minimize','Minus',
+ 'Mod','Modal','Module','Mono43','Movers','Multilocks',
+ 'Mvarsiz','Mvcount','N','Near','Negotiate','Noalias',
+ 'Noappend','Noclear','Noclose','Noconsole','Nocptrans','Nodata',
+ 'Nodebug','Nodelete','Nodup','Noedit','Noeject','Noenvironment',
+ 'Nofloat','Nofollow','Nogrow','Noinit','Nolgrid','Nolink',
+ 'Nolock','Nomargin','Nomdi','Nomenu','Nominimize','Nomodify'
+ ),
+ 3 => array('Nomouse','None','Nooptimize','Nooverwrite','Noprojecthook','Noprompt',
+ 'Noread','Norefresh','Norequery','Norgrid','Norm','Normal',
+ 'Nosave','Noshadow','Noshow','Nospace','Not','Notab',
+ 'Notify','Noupdate','Novalidate','Noverify','Nowait','Nowindow',
+ 'Nowrap','Nozoom','Npv','Null','Number','Objects',
+ 'Odometer','Of','Off','Oleobjects','Only','Optimize',
+ 'Or','Orientation','Output','Outshow','Overlay','Overwrite',
+ 'Pad','Palette','Paperlength','Papersize','Paperwidth','Password',
+ 'Path','Pattern','Pause','Pdox','Pdsetup','Pen',
+ 'Pfs','Pixels','Plain','Popups','Precision','Preference',
+ 'Preview','Primary','Printer','Printquality','Procedures','Production',
+ 'Program','Progwork','Project','Prompt','Query','Random',
+ 'Range','Readborder','Readerror','Record','Recover','Redit',
+ 'Reference','References','Relative','Remote','Reprocess','Resource',
+ 'Rest','Restrict','Rgb','Right','Row','Rowset',
+ 'Rpd','Runtime','Safety','Same','Sample','Say',
+ 'Scale','Scheme','Scoreboard','Screen','Sdf','Seconds',
+ 'Selection','Shadows','Shared','Sheet','Shell','Shift',
+ 'Shutdown','Single','Some','Sortwork','Space','Sql',
+ 'Standalone','Status','Std','Step','Sticky','String',
+ 'Structure','Subclass','Summary','Sylk','Sysformats','Sysmenus',
+ 'System','T','Tab','Tables','Talk','Tedit',
+ 'Textmerge','Time','Timeout','Titles','Tmpfiles','To',
+ 'Topic','Transaction','Trap','Trbetween','Trigger','Ttoption',
+ 'Typeahead','Udfparms','Union','Unique','Userid','Users',
+ 'Values','Var','Verb','Vga25','Vga50','Views',
+ 'Volume','Where','Windows','Wk1','Wk3','Wks',
+ 'Workarea','Wp','Wr1','Wrap','Wrk','Xcmdfile',
+ 'Xl5','Xl8','Xls','Y','Yresolution','Zoom',
+ 'Activate','ActivateCell','Add','AddColumn','AddItem','AddListItem',
+ 'AddObject','AddProperty','AddToSCC','AfterBuild','AfterCloseTables','AfterDock',
+ 'AfterRowColChange','BeforeBuild','BeforeDock','BeforeOpenTables','BeforeRowColChange','Box',
+ 'Build','CheckIn','CheckOut','Circle','Clear','ClearData',
+ 'Cleanup','Click','CloneObject','CloseEditor','CloseTables','Cls',
+ 'CommandTargetExec','CommandTargetQueryStas','ContainerRelease','DataToClip','DblClick','Deactivate',
+ 'Delete','DeleteColumn','Deleted','Destroy','DoCmd','Dock',
+ 'DoScroll','DoVerb','DownClick','Drag','DragDrop','DragOver',
+ 'DropDown','Draw','EnterFocus','Error','ErrorMessage','Eval',
+ 'ExitFocus','FormatChange','GetData','GetFormat','GetLatestVersion','GoBack',
+ 'GotFocus','GoForward','GridHitTest','Hide','HideDoc','IndexToItemId',
+ 'Init','InteractiveChange','Item','ItemIdToIndex','KeyPress','Line',
+ 'Load','LostFocus','Message','MiddleClick','MouseDown','MouseMove',
+ 'MouseUp','MouseWheel','Move','Moved','NavigateTo','Newobject',
+ 'OLECompleteDrag','OLEDrag','OLEDragDrop','OLEDragOver','OLEGiveFeedback','OLESetData',
+ 'OLEStartDrag','OpenEditor','OpenTables','Paint','Point','Print',
+ 'ProgrammaticChange','PSet','QueryAddFile','QueryModifyFile','QueryRemoveFile','QueryRunFile',
+ 'QueryUnload','RangeHigh','RangeLow','ReadActivate','ReadExpression','ReadDeactivate',
+ 'ReadMethod','ReadShow','ReadValid','ReadWhen','Refresh','Release',
+ 'RemoveFromSCC','RemoveItem','RemoveListItem','RemoveObject','Requery','RequestData',
+ 'Reset','ResetToDefault','Resize','RightClick','SaveAs','SaveAsClass',
+ 'Scrolled','SetAll','SetData','SetFocus','SetFormat','SetMain',
+ 'SetVar','SetViewPort','ShowDoc','ShowWhatsThis','TextHeight','TextWidth',
+ 'Timer','UIEnable','UnDock','UndoCheckOut','Unload','UpClick',
+ 'Valid','WhatsThisMode','When','WriteExpression','WriteMethod','ZOrder',
+ 'ATGetColors','ATListColors','Accelerate','ActiveColumn','ActiveControl','ActiveForm',
+ 'ActiveObjectId','ActivePage','ActiveProject','ActiveRow','AddLineFeeds','Alias',
+ 'Alignment','AllowAddNew','AllowHeaderSizing','AllowResize','AllowRowSizing','AllowTabs',
+ 'AlwaysOnTop','Application','AutoActivate','AutoCenter','AutoCloseTables','AutoIncrement',
+ 'AutoOpenTables','AutoRelease','AutoSize','AutoVerbMenu','AutoYield','AvailNum',
+ 'BackColor','BackStyle','BaseClass','BorderColor','BorderStyle','BorderWidth',
+ 'Bound','BoundColumn','BoundTo','BrowseAlignment','BrowseCellMarg','BrowseDestWidth',
+ 'BufferMode','BufferModeOverride','BuildDateTime','ButtonCount','ButtonIndex','Buttons',
+ 'CLSID','CanAccelerate','CanGetFocus','CanLoseFocus','Cancel','Caption',
+ 'ChildAlias','ChildOrder','Class','ClassLibrary','ClipControls','ClipRect',
+ 'Closable','ColorScheme','ColorSource','ColumnCount','ColumnHeaders','ColumnLines',
+ 'ColumnOrder','ColumnWidths','Columns','Comment','ContinuousScroll','ControlBox',
+ 'ControlCount','ControlIndex','ControlSource','Controls','CurrentControl','CurrentX',
+ 'CurrentY','CursorSource','Curvature','DataSession','DataSessionId','DataSourceObj',
+ 'DataType','Database','DateFormat','DateMark','DefButton','DefButtonOrig',
+ 'DefHeight','DefLeft','DefTop','DefWidth','Default','DefaultFilePath',
+ 'DefineWindows','DeleteMark','Desktop','Dirty','DisabledBackColor','DisabledByEOF',
+ 'DisabledForeColor','DisabledItemBackColor','DisabledItemForeColor','DisabledPicture','DispPageHeight','DispPageWidth',
+ 'DisplayCount','DisplayValue','DoCreate','DockPosition','Docked','DocumentFile',
+ 'DownPicture','DragIcon','DragMode','DragState','DrawMode','DrawStyle',
+ 'DrawWidth','DynamicAlignment','DynamicBackColor','DynamicCurrentControl','DynamicFontBold','DynamicFontItalic',
+ 'DynamicFontName','DynamicFontOutline','DynamicFontShadow','DynamicFontSize','DynamicFontStrikethru','DynamicFontUnderline',
+ 'DynamicForeColor','EditFlags','Enabled','EnabledByReadLock','Encrypted','EnvLevel',
+ 'ErasePage','FileClass','FileClassLibrary','FillColor','FillStyle','Filter',
+ 'FirstElement','FontBold','FontItalic','FontName','FontOutline','FontShadow',
+ 'FontSize','FontStrikethru','FontUnderline','ForceFocus','ForeColor','FormCount',
+ 'FormIndex','FormPageCount','FormPageIndex','Format','Forms','FoxFont',
+ 'FullName','GoFirst','GoLast','GridLineColor','GridLineWidth','GridLines'
+ ),
+ 4 => array('HPROJ','HWnd','HalfHeightCaption','HasClip','HeaderGap','HeaderHeight',
+ 'Height','HelpContextID','HideSelection','Highlight','HomeDir','HostName',
+ 'HotKey','HscrollSmallChange','IMEMode','Icon','IgnoreInsert','InResize',
+ 'Increment','IncrementalSearch','InitialSelectedAlias','InputMask','Instancing','IntegralHeight',
+ 'Interval','ItemBackColor','ItemData','ItemForeColor','ItemIDData','ItemTips',
+ 'JustReadLocked','KeyPreview','KeyboardHighValue','KeyboardLowValue','LastModified','Left',
+ 'LeftColumn','LineSlant','LinkMaster','List','ListCount','ListIndex',
+ 'ListItem','ListItemId','LockDataSource','LockScreen','MDIForm','MainClass',
+ 'MainFile','Margin','MaxButton','MaxHeight','MaxLeft','MaxLength',
+ 'MaxTop','MaxWidth','MemoWindow','MinButton','MinHeight','MinWidth',
+ 'MouseIcon','MousePointer','Movable','MoverBars','MultiSelect','Name',
+ 'NapTime','NewIndex','NewItemId','NoDataOnLoad','NoDefine','NotifyContainer',
+ 'NullDisplay','NumberOfElements','OLEDragMode','OLEDragPicture','OLEDropEffects','OLEDropHasData',
+ 'OLEDropMode','OLERequestPendingTimeOut','OLEServerBusyRaiseError','OLEServerBusyTimeOut','OLETypeAllowed','OleClass',
+ 'OleClassId','OleControlContainer','OleIDispInValue','OleIDispOutValue','OleIDispatchIncoming','OleIDispatchOutgoing',
+ 'OnResize','OneToMany','OpenViews','OpenWindow','PageCount','PageHeight',
+ 'PageOrder','PageWidth','Pages','Panel','PanelLink','Parent',
+ 'ParentAlias','ParentClass','Partition','PasswordChar','Picture','ProcessID',
+ 'ProgID','ProjectHookClass','ProjectHookLibrary','Projects','ReadColors','ReadCycle',
+ 'ReadFiller','ReadLock','ReadMouse','ReadOnly','ReadSave','ReadSize',
+ 'ReadTimeout','RecordMark','RecordSource','RecordSourceType','Rect','RelationalExpr',
+ 'RelativeColumn','RelativeRow','ReleaseErase','ReleaseType','ReleaseWindows','Resizable',
+ 'RightToLeft','RowHeight','RowSource','RowSourceType','SCCProvider','SCCStatus',
+ 'SDIForm','ScaleMode','ScrollBars','SelLength','SelStart','SelText',
+ 'SelectOnEntry','Selected','SelectedBackColor','SelectedForeColor','SelectedID','SelectedItemBackColor',
+ 'SelectedItemForeColor','SelfEdit','ServerClass','ServerClassLibrary','ServerHelpFile','ServerName',
+ 'ServerProject','ShowTips','ShowWindow','Sizable','Size<height>','Size<maxlength>',
+ 'Size<width>','Skip','SkipForm','Sorted','SourceType','Sparse',
+ 'SpecialEffect','SpinnerHighValue','SpinnerLowValue','SplitBar','StartMode','StatusBarText',
+ 'Stretch','StrictDateEntry','Style','SystemRefCount','TabIndex','TabStop',
+ 'TabStretch','TabStyle','Tabhit','Tabs','Tag','TerminateRead',
+ 'ThreadID','TitleBar','ToolTipText','Top','TopIndex','TopItemId',
+ 'TypeLibCLSID','TypeLibDesc','TypeLibName','UnlockDataSource','Value','ValueDirty',
+ 'VersionComments','VersionCompany','VersionCopyright','VersionDescription','VersionNumber','VersionProduct',
+ 'VersionTrademarks','View','ViewPortHeight','ViewPortLeft','ViewPortTop','ViewPortWidth',
+ 'Visible','VscrollSmallChange','WasActive','WasOpen','WhatsThisButton','WhatsThisHelp',
+ 'WhatsThisHelpID','Width','WindowList','WindowNTIList','WindowState','WindowType',
+ 'WordWrap','ZOrderSet','ActiveDoc','Checkbox','Column','ComboBox',
+ 'CommandButton','CommandGroup','Container','Control','Cursor','Custom',
+ 'DataEnvironment','EditBox','Empty','FontClass','Form','Formset',
+ 'General','Grid','Header','HyperLink','Image','Label',
+ 'ListBox','Memo','OleBaseControl','OleBoundControl','OleClassIDispOut','OleControl',
+ 'OptionButton','OptionGroup','Page','PageFrame','ProjectHook','RectClass',
+ 'Relation','Session','Shape','Spinner','TextBox' ,'Toolbar'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ "!", "@", "$", "%",
+ "(", ")", "{", "}", "[", "]",
+ "-", "+", "*", "/",
+ "=", "<", ">",
+ ":", ";", ",", ".", "&",
+ "?", "??", "???"
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: blue;',
+ 2 => 'color: blue;',
+ 3 => 'color: blue;',
+ 4 => 'color: blue;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: green; font-style: italic;',
+ 2 => 'color: green; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: blue;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: blue;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/visualprolog.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/visualprolog.php
new file mode 100644
index 00000000..d36f1c67
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/visualprolog.php
@@ -0,0 +1,129 @@
+<?php
+/*************************************************************************************
+ * visualprolog.php
+ * ----------
+ * Author: Thomas Linder Puls (puls@pdc.dk)
+ * Copyright: (c) 2008 Thomas Linder Puls (puls@pdc.dk)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/11/20
+ *
+ * Visual Prolog language file for GeSHi.
+ *
+ * CHANGES
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Visual Prolog',
+ 'COMMENT_SINGLE' => array(1 => '%'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'HARDQUOTE' => array('@"', '"'),
+ 'HARDESCAPE' => array('""'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'clauses','constants','constructors','delegate','domains','facts',
+ 'goal','guards','inherits','monitor','namespace','open',
+ 'predicates','properties','resolve','supports'
+ ),
+ 2 => array(
+ 'align','and','anyflow','as','bitsize','catch','determ','digits',
+ 'div','do','else','elseif','erroneous','externally','failure',
+ 'finally','from','language','mod','multi','nondeterm','or',
+ 'procedure','quot','rem','single','then','to'
+ ),
+ 3 => array(
+ '#bininclude','#else','#elseif','#endif','#error','#export',
+ '#externally','#if','#import','#include','#message','#options',
+ '#orrequires','#requires','#then','#warning'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '+', '-', '*', '?', '=', '/', '>', '<', '^', '!', ':', '(', ')', '{', '}', '[', ']'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => true,
+ 1 => true,
+ 2 => true,
+ 3 => true
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #808000;',
+ 2 => 'color: #333399;',
+ 3 => 'color: #800080;',
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #AA77BD',
+ 'MULTI' => 'color: #AA77BD'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #008080;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #00B7B7;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #0000FF;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #008000;',
+ 1 => 'color: #808000;',
+ 2 => 'color: #333399;',
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => ':',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ 0 => "(?<![a-zA-Z0-9_])(?!(?:PIPE|SEMI)>)[A-Z_]\w*(?!\w)",
+ 1 => "\\b(end\\s+)?(implement|class|interface)\\b",
+ 2 => "\\b(end\\s+)?(foreach|if|try)\\b",
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/whitespace.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/whitespace.php
new file mode 100644
index 00000000..58f39637
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/whitespace.php
@@ -0,0 +1,121 @@
+<?php
+/*************************************************************************************
+ * whitespace.php
+ * ----------
+ * Author: Benny Baumann (BenBE@geshi.org)
+ * Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2009/10/31
+ *
+ * Whitespace language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/10/31 (1.0.8.1)
+ * - First Release
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+$language_data = array (
+ 'LANG_NAME' => 'Whitespace',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ 3 => "/[^\n\x20\x09]+/s"
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ ),
+ 'COMMENTS' => array(
+ 3 => 'color: #666666; font-style: italic;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ 2 => 'background-color: #FF9999;',
+ 3 => 'background-color: #9999FF;'
+ )
+ ),
+ 'URLS' => array(
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 2 => array(
+ GESHI_SEARCH => "(?<!\\A)\x20",
+ GESHI_REPLACE => "&#32;",
+ GESHI_MODIFIERS => 's',
+ GESHI_BEFORE => "",
+ GESHI_AFTER => ""
+ ),
+ 3 => array(
+ GESHI_SEARCH => "\x09",
+ GESHI_REPLACE => "&#9;",
+ GESHI_MODIFIERS => 's',
+ GESHI_BEFORE => "",
+ GESHI_AFTER => ""
+ ),
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'KEYWORDS' => GESHI_NEVER,
+ 'SYMBOLS' => GESHI_NEVER,
+ 'STRINGS' => GESHI_NEVER,
+// 'REGEXPS' => GESHI_NEVER,
+ 'NUMBERS' => GESHI_NEVER
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/whois.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/whois.php
new file mode 100644
index 00000000..b1386944
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/whois.php
@@ -0,0 +1,180 @@
+<?php
+/*************************************************************************************
+ * whois.php
+ * --------
+ * Author: Benny Baumann (BenBE@geshi.org)
+ * Copyright: (c) 2008 Benny Baumann (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/09/14
+ *
+ * Whois response (RPSL format) language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/09/14 (1.0.0)
+ * - First Release
+ *
+ * TODO
+ * ----
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Whois (RPSL format)',
+ 'COMMENT_SINGLE' => array(1 => '% ', 2 => '%ERROR:'),
+ 'COMMENT_MULTI' => array(),
+ 'COMMENT_REGEXP' => array(
+ //Description
+ 3 => '/(?:(?<=^remarks:)|(?<=^descr:))(.|\n\s)*$/mi',
+
+ //Contact Details
+ 4 => '/(?<=^address:)(.|\n\s)*$/mi',
+ 5 => '/\+\d+(?:(?:\s\(\d+(\s\d+)*\))?(?:\s\d+)+|-\d+-\d+)/',
+ 6 => '/\b(?!-|\.)[\w\-\.]+(?!-|\.)@((?!-)[\w\-]+\.)+\w+\b/',
+
+ //IP, Networks and AS information\links
+ 7 => '/\b(?<!\.|\-)(?:[\da-f:]+(?!\.)|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?:\/1?\d\d?)?(?<!\.|\-)\b/',
+ 8 => '/\bAS\d+\b/'
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array(),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array( //Object Types
+ 'as-block','as-set','aut-num','domain','filter-set','inet-rtr',
+ 'inet6num','inetnum','irt','key-cert','limerick','mntner',
+ 'organisation','peering-set','person','poem','role','route-set',
+ 'route','route6','rtr-set'
+ ),
+ 2 => array( //Field Types
+ 'abuse-mailbox','address','admin-c','aggr-bndry','aggr-mtd','alias',
+ 'as-block','as-name','as-set','aut-num','auth','author','certif',
+ 'changed','components','country','default','descr','dom-net',
+ 'domain','ds-rdata','e-mail','encryption','export','export-comps',
+ 'fax-no','filter','filter-set','fingerpr','form','holes','ifaddr',
+ 'import','inet-rtr','inet6num','inetnum','inject','interface','irt',
+ 'irt-nfy','key-cert','limerick','local-as','mbrs-by-ref',
+ 'member-of','members','method','mnt-by','mnt-domains','mnt-irt',
+ 'mnt-lower','mnt-nfy','mnt-ref','mnt-routes','mntner','mp-default',
+ 'mp-export','mp-filter','mp-import','mp-members','mp-peer',
+ 'mp-peering','netname','nic-hdl','notify','nserver','org',
+ 'org-name','org-type','organisation','origin','owner','peer',
+ 'peering','peering-set','person','phone','poem','ref-nfy','refer',
+ 'referral-by','remarks','rev-srv','role','route','route-set',
+ 'route6','rtr-set','signature','source','status','sub-dom','tech-c',
+ 'text','upd-to','zone-c'
+ ),
+ 3 => array( //RPSL reserved
+ 'accept','action','and','announce','any','as-any','at','atomic',
+ 'except','from','inbound','into','networks','not','or','outbound',
+ 'peeras','refine','rs-any','to'
+ )
+ ),
+ 'SYMBOLS' => array(
+ ':'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000FF; font-weight: bold;',
+ 2 => 'color: #000080; font-weight: bold;',
+ 3 => 'color: #990000; font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #666666; font-style: italic;',
+ 2 => 'color: #666666; font-style: italic;',
+ 3 => 'color: #404080;',
+ 4 => 'color: #408040;',
+ 5 => 'color: #408040;',
+ 6 => 'color: #408040;',
+ 7 => 'color: #804040;',
+ 8 => 'color: #804040;',
+ 'MULTI' => 'color: #666666; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;',
+ 'HARD' => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #009900;'
+ ),
+ 'STRINGS' => array(
+ 0 => '',
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000080;',
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #0000FF;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #000088;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.irr.net/docs/rpsl.html'
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Variables
+ 0 => "[\\$]{1,2}[a-zA-Z_][a-zA-Z0-9_]*"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4,
+ 'PARSER_CONTROL' => array(
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'DISALLOWED_BEFORE' => '(?<=\A |\A \n(?m:^)|\n\n(?m:^))'
+ ),
+ 2 => array(
+ 'DISALLOWED_BEFORE' => '(?m:^)'
+ )
+ ),
+ 'ENABLE_FLAGS' => array(
+ 'BRACKETS' => GESHI_NEVER,
+ 'SYMBOLS' => GESHI_NEVER,
+ 'STRINGS' => GESHI_NEVER,
+ 'ESCAPE_CHAR' => GESHI_NEVER,
+ 'NUMBERS' => GESHI_NEVER,
+ 'METHODS' => GESHI_NEVER,
+ 'SCRIPT' => GESHI_NEVER
+ )
+ ),
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/winbatch.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/winbatch.php
new file mode 100644
index 00000000..3599a027
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/winbatch.php
@@ -0,0 +1,369 @@
+<?php
+/*************************************************************************************
+ * winbatch.php
+ * ------------
+ * Author: Craig Storey (storey.craig@gmail.com)
+ * Copyright: (c) 2004 Craig Storey (craig.xcottawa.ca)
+ * Release Version: 1.0.8.11
+ * Date Started: 2006/05/19
+ *
+ * WinBatch language file for GeSHi.
+ *
+ * WinBatch is a Windows scripting language - www.winbatch.com.
+ * The keywords were pulled from the winbatch/system/WIL.clr file for v2005G.
+ * Not all extender functions are added, but a very large set of the most common.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2006/05/05 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/07/14)
+ * -------------------------
+ * - Right now any ':Subroutine' is treated as a comment. This highlights the
+ * Subroutine's name, but it's not a perfect fix. I should use a RegEx in
+ * GeSHI_Search&Replace features..
+ * - Update the list of extender functions.
+ * - Use a regular expression to comment UDFs that start with 'udf_'.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Winbatch',
+ 'COMMENT_SINGLE' => array(1 => ';', 2 => ':'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"', '`'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'While', 'To', 'Then', 'Switch', 'Select', 'Return', 'Next', 'IntControl', 'Include', 'In', 'If',
+ 'Goto', 'GoSub', 'ForEach', 'For', 'Exit', 'Execute', 'ErrorMode', 'EndWhile', 'EndSwitch', '#EndSubRoutine',
+ 'EndSelect', 'EndIf', '#EEndFunction', 'EndFor', 'End', 'Else', 'DropWild', 'Drop', '#DefineSubRoutine',
+ '#DefineFunction', 'Debug', 'Continue', 'Case', 'CallExt', 'Call', 'By', 'BreakPoint', 'Break'
+ ),
+ 2 => array(
+ 'ZOOMED', 'YES', 'WORD4', 'WORD2', 'WORD1', 'WHOLESECTION', 'WAIT', 'UNSORTED', 'UNCHECK', 'TRUE', 'TILE',
+ 'TAB', 'STRING', 'STACK', 'SPC2NET', 'SORTED', 'SOK', 'SNET2PC', 'SINGLE', 'SHIFT', 'SERVER', 'SERRWINSOCK',
+ 'SERRVOICE', 'SERRSOCKET', 'SERRSERVICE', 'SERRSELECT', 'SERRPARAM', 'SERROUTOFMEM', 'SERRNOTFOUND', 'SERRNOCONN',
+ 'SERRNOANSWER', 'SERRMUSTWAIT', 'SERRIPADDR', 'SERRHOSTNAME', 'SERRFAILURE', 'SERRBUSY', 'SCROLLLOCK', 'SCANCEL',
+ 'SAVE', 'SALREADY', 'ROWS', 'REGUSERS', 'REGROOT', 'REGMACHINE', 'REGCURRENT', 'REGCLASSES', 'RDBLCLICK', 'RCLICK',
+ 'RBUTTON', 'RAD2DEG', 'QSUCCESSINFO', 'QSUCCESS', 'QSTILLEX', 'QROLLBACK', 'QNULL', 'QNODATA', 'QNEXT', 'QNEEDDATA',
+ 'QFIRST', 'QCOMMIT', 'QBADHANDLE', 'PRINTER', 'PLANCKJOULES', 'PLANCKERGS', 'PI', 'PARSEONLY', 'PARSEC', 'P3ERRREPLY',
+ 'OPEN', 'ON', 'OFF', 'NUMLOCK', 'NOWAIT', 'NOTIFY', 'NORMAL', 'NORESIZE', 'NONE', 'NO', 'NCSAFORMAT', 'MULTIPLE',
+ 'MSFORMAT', 'MPLAYRDBLCK', 'MPLAYRCLK', 'MPLAYRBUTTON', 'MPLAYMDBLCK', 'MPLAYMCLK', 'MPLAYMBUTTON', 'MPLAYLDBLCK',
+ 'MPLAYLCLK', 'MPLAYLBUTTON', 'MINOR', 'MDBLCLICK', 'MCLICK', 'MBYESNO', 'MBUTTON', 'MBOKCANCEL', 'MAJOR', 'MAGFIELD',
+ 'LOCALGROUP', 'LIGHTMTPS', 'LIGHTMPS', 'LF', 'LDBLCLICK', 'LCLICK', 'LBUTTON', 'LAFFDBERROR', 'ICON', 'HTTPS', 'HTTP',
+ 'HNOHEADER', 'HMETHODPOST', 'HMETHODGET', 'HIDDEN', 'HHEADERONLY', 'HHEADER', 'GRAVITATION', 'GOPHER', 'GOLDENRATIO',
+ 'GMTSEC', 'GLOBALGROUP', 'GFTSEC', 'GETPROCID', 'GETEXITCODE', 'FWDSCAN', 'FTPPASSIVE', 'FTP', 'FLOAT8', 'FARADAY',
+ 'FALSE', 'EXTENDED', 'EULERS', 'ENABLE', 'ELECTRIC', 'DRIVE', 'DISABLE', 'DESCENDING', 'DEG2RAD', 'DEFAULT', 'CTRL',
+ 'CRLF', 'CR', 'COMMONFORMAT', 'COLUMNS', 'CHECK', 'CAPSLOCK', 'CANCEL', 'BOLTZMANN', 'BACKSCAN', 'AVOGADRO', 'ATTR_X',
+ 'ATTR_T', 'ATTR_SY', 'ATTR_SH', 'ATTR_RO', 'ATTR_RI', 'ATTR_P', 'ATTR_IC', 'ATTR_H', 'ATTR_DM', 'ATTR_DI', 'ATTR_DC',
+ 'ATTR_CI', 'ATTR_A', 'ASCENDING', 'ARRANGE', 'AMC', 'ACC_WRITE', 'ACC_READ_NT', 'ACC_READ_95', 'ACC_READ', 'ACC_PRINT_NT',
+ 'ACC_PMANG_NT', 'ACC_PFULL_NT', 'ACC_LIST', 'ACC_FULL_NT', 'ACC_FULL_95', 'ACC_DELETE', 'ACC_CREATE', 'ACC_CONTROL',
+ 'ACC_CHNG_NT', 'ACC_ATTRIB', 'ABOVEICONS'
+ ),
+ 3 => array(
+ 'Yields', 'Yield', 'WinZoom', 'WinWaitExist', 'WinWaitClose', 'WinWaitChild', 'WinVersion', 'WinTitle', 'WinSysInfo',
+ 'WinState', 'WinShow', 'WinResources', 'WinPositionChild', 'WinPosition', 'WinPlaceSet', 'WinPlaceGet', 'WinPlaceChild',
+ 'WinPlace', 'WinParmSet', 'WinParmGet', 'WinName', 'WinMetrics', 'WinItemProcId', 'WinItemNameId', 'WinItemizeEx',
+ 'WinItemize', 'WinItemChild', 'WinIsDos', 'WinIdGet', 'WinIconize', 'WinHide', 'WinHelp', 'WinGetactive', 'WinExistchild',
+ 'WinExist', 'WinExename', 'WinConfig', 'WinClosenot', 'WinClose', 'WinArrange', 'WinActivechild', 'WinActivchild',
+ 'WinActivate', 'WebVerifyCard', 'WebSetTimeout', 'WebParamSize', 'WebParamNames', 'WebParamFile', 'WebParamData',
+ 'WebParamBuf', 'WebOutFile', 'WebOutBinary', 'WebOut', 'WebDumpError', 'WebDatData', 'WebCounter', 'WebConSize', 'WebConData',
+ 'WebConBuf', 'WebCmdData', 'WebBaseConv', 'Wallpaper', 'WaitForKeyEX', 'WaitForKey', 'VersionDLL', 'Version', 'VarType',
+ 'TimeYmdHms', 'TimeWait', 'TimeSubtract', 'TimeJulToYmd', 'TimeJulianDay', 'TimeDiffSecs', 'TimeDiffDays', 'TimeDiff', 'TimeDelay',
+ 'TimeDate', 'TimeAdd', 'TextSelect', 'TextBoxSort', 'TextBox', 'Terminate', 'Tanh', 'Tan', 'SysParamInfo', 'SvcWaitForCmd',
+ 'SvcSetState', 'SvcSetAccept', 'StrUpper', 'StrTrim', 'StrSubWild', 'StrSub', 'StrScan', 'StrReplace', 'StrLower', 'StrLenWild',
+ 'StrLen', 'StrIndexWild', 'StrIndexNC', 'StrIndex', 'StriCmp', 'StrFixLeft', 'StrFixCharsL', 'StrFixChars', 'StrFix', 'StrFill',
+ 'StrCnt', 'StrCmp', 'StrClean', 'StrCharCount', 'StrCat', 'StrByteCount', 'Sqrt', 'SoundVolume', 'Sounds', 'Snapshot', 'Sinh', 'Sin',
+ 'ShortCutMake', 'ShortCutInfo', 'ShortCutExtra', 'ShortCutEdit', 'ShortCutDir', 'ShellExecute', 'SendMenusToEx', 'SendMenusTo',
+ 'SendKeysTo', 'SendKeysChild', 'SendKey', 'RunZoomWait', 'RunZoom', 'RunWithLogon', 'RunWait', 'RunShell', 'RunIconWait',
+ 'RunIcon', 'RunHideWait', 'RunHide', 'RunExit', 'RunEnviron', 'Run', 'RtStatus', 'Reload', 'RegUnloadHive', 'RegSetValue',
+ 'RegSetQword', 'RegSetMulSz', 'RegSetExpSz', 'RegSetEx', 'RegSetDword', 'RegSetBin', 'RegQueryValue', 'RegQueryStr',
+ 'RegQueryQword', 'RegQueryMulSz', 'RegQueryKeys', 'RegQueryKeyLastWriteTime', 'RegQueryKey', 'RegQueryItem', 'RegQueryExpSz',
+ 'RegQueryEx', 'RegQueryDword', 'RegQueryBin', 'RegOpenKeyEx', 'RegOpenKey', 'RegOpenFlags', 'RegLoadHive', 'RegExistValue',
+ 'RegExistKey', 'RegEntryType', 'RegDelValue', 'RegDeleteKey', 'RegCreateKey', 'RegConnect', 'RegCloseKey', 'RegApp', 'Random',
+ 'PtrPersistent', 'PtrGlobalDefine', 'PtrGlobal', 'Print', 'PlayWaveform', 'PlayMidi', 'PlayMedia', 'PipeServerWrite', 'PipeServerRead',
+ 'PipeServerCreate', 'PipeServerClose', 'PipeInfo', 'PipeClientSendRecvData', 'PipeClientOpen', 'PipeClientClose', 'Pause',
+ 'ParseData', 'ObjectTypeGet', 'ObjectType', 'ObjectOpen', 'ObjectGet', 'ObjectEventRemove', 'ObjectEventAdd',
+ 'ObjectCreate', 'ObjectConstToArray', 'ObjectConstantsGet', 'ObjectCollectionOpen', 'ObjectCollectionNext',
+ 'ObjectCollectionClose', 'ObjectClose', 'ObjectAccess', 'Num2Char', 'NetInfo', 'MsgTextGet', 'MousePlay', 'MouseMove', 'MouseInfo',
+ 'MouseDrag', 'MouseCoords', 'MouseClickBtn', 'MouseClick', 'mod', 'Min', 'Message', 'Max', 'Loge', 'LogDisk', 'Log10', 'LastError',
+ 'KeyToggleSet', 'KeyToggleGet', 'ItemSortNc', 'ItemSort', 'ItemSelect', 'ItemReplace', 'ItemRemove', 'ItemLocate', 'ItemInsert',
+ 'ItemExtractCSV', 'ItemExtract', 'ItemCountCSV', 'ItemCount', 'IsNumber', 'IsLicensed', 'IsKeyDown', 'IsInt', 'IsFloat', 'IsDefined',
+ 'Int', 'InstallFile', 'IniWritePvt', 'IniWrite', 'IniReadPvt', 'IniRead', 'IniItemizePvt', 'IniItemize', 'IniDeletePvt', 'IniDelete',
+ 'IgnoreInput', 'IconReplace', 'IconInfo', 'IconExtract', 'IconArrange', 'GetTickCount', 'GetObject', 'GetExactTime', 'Floor',
+ 'FindWindow', 'FileYmdHms', 'FileWrite', 'FileVerInfo', 'FileTimeTouch', 'FileTimeSetEx', 'FileTimeSet', 'FileTimeGetEx',
+ 'FileTimeGet', 'FileTimeCode', 'FileSizeEx', 'FileSize', 'FileRoot', 'FileRename', 'FileRead', 'FilePutW', 'FilePut', 'FilePath',
+ 'FileOpen', 'FileNameShort', 'FileNameLong', 'FileNameEval2', 'FileNameEval1', 'FileMoveAttr', 'FileMove', 'FileMapName',
+ 'FileLocate', 'FileItemPath', 'FileItemize', 'FileInfoToArray', 'FileGetW', 'FileGet', 'FileFullname', 'FileExtension', 'FileExist',
+ 'FileDelete', 'FileCreateTemp', 'FileCopyAttr', 'FileCopy', 'FileCompare', 'FileClose', 'FileBaseName', 'FileAttrSetEx',
+ 'FileAttrSet', 'FileAttrGetEx', 'FileAttrGet', 'FileAppend', 'Fabs', 'ExtractAttachedFile', 'Exp', 'ExeTypeInfo', 'Exclusive',
+ 'EnvItemize', 'EnvironSet', 'Environment', 'EndSession', 'DosVersion', 'DllLoad', 'DllLastError', 'DllHwnd', 'DllHinst',
+ 'DllFree', 'DllCallCDecl', 'DllCall', 'Display', 'DiskVolinfo', 'DiskSize', 'DiskScan', 'DiskInfo', 'DiskFree', 'DiskExist',
+ 'DirWindows', 'DirSize', 'DirScript', 'DirRename', 'DirRemove', 'DirMake', 'DirItemize', 'DirInfoToArray', 'DirHome', 'DirGet',
+ 'DirExist', 'DirChange', 'DirAttrSetEx', 'DirAttrSet', 'DirAttrGetEx', 'DirAttrGet', 'DialogProcOptions', 'DialogObject',
+ 'DialogControlState', 'DialogControlSet', 'DialogControlGet', 'DialogBox', 'Dialog', 'Delay', 'Decimals', 'DebugTrace',
+ 'DebugData', 'DDETimeout', 'DDETerminate', 'DDERequest', 'DDEPoke', 'DDEInitiate', 'DDEExecute', 'DateTime', 'CurrFilepath',
+ 'CurrentPath', 'CurrentFile', 'CreateObject', 'Cosh', 'Cos', 'ClipPut', 'ClipHasFormat', 'ClipGetEx', 'ClipGet', 'ClipAppend',
+ 'ChrUnicodeToString', 'ChrUnicodeToHex', 'ChrStringToUnicode', 'ChrSetCodepage', 'ChrHexToUnicode', 'ChrGetCodepage',
+ 'Char2Num', 'Ceiling', 'ButtonNames', 'BoxUpdates', 'BoxTitle', 'BoxTextFont', 'BoxTextColor', 'BoxText', 'BoxShut', 'BoxPen',
+ 'BoxOpen', 'BoxNew', 'BoxMapmode', 'BoxesUp', 'BoxDrawText', 'BoxDrawRect', 'BoxDrawLine', 'BoxDrawCircle', 'BoxDestroy',
+ 'BoxDataTag', 'BoxDataClear', 'BoxColor', 'BoxCaption', 'BoxButtonWait', 'BoxButtonStat', 'BoxButtonKill', 'BoxButtonDraw',
+ 'BoxBitMap', 'BinaryXor', 'BinaryXlate', 'BinaryWriteEx', 'BinaryWrite', 'BinaryTagRepl', 'BinaryTagLen', 'BinaryTagInit',
+ 'BinaryTagIndex', 'BinaryTagFind', 'BinaryTagExtr', 'BinaryStrCnt', 'BinarySort', 'BinaryReplace', 'BinaryReadEx',
+ 'BinaryRead', 'BinaryPokeStrW', 'BinaryPokeStr', 'BinaryPokeHex', 'BinaryPokeFlt', 'BinaryPoke4', 'BinaryPoke2', 'BinaryPoke',
+ 'BinaryPeekStrW', 'BinaryPeekStr', 'BinaryPeekHex', 'BinaryPeekFlt', 'BinaryPeek4', 'BinaryPeek2', 'BinaryPeek', 'BinaryOr',
+ 'BinaryOleType', 'BinaryIndexNc', 'BinaryIndexEx', 'BinaryIndexBin', 'BinaryIndex', 'BinaryIncrFlt', 'BinaryIncr4',
+ 'BinaryIncr2', 'BinaryIncr', 'BinaryHashRec', 'BinaryFree', 'BinaryEodSet', 'BinaryEodGet', 'BinaryCopy', 'BinaryConvert',
+ 'BinaryCompare', 'BinaryClipPut', 'BinaryClipGet', 'BinaryChecksum', 'BinaryBufInfo', 'BinaryAnd', 'BinaryAllocArray',
+ 'BinaryAlloc', 'Beep', 'Average', 'Atan', 'AskYesNo', 'AskTextbox', 'AskPassword', 'AskLine', 'AskItemlist', 'AskFont',
+ 'AskFiletext', 'AskFilename', 'AskDirectory', 'AskColor', 'Asin', 'ArrInitialize', 'ArrInfo', 'ArrDimension',
+ 'Arrayize', 'ArrayFilePutCSV', 'ArrayFilePut', 'ArrayFileGetCSV', 'ArrayFileGet', 'AppWaitClose', 'AppExist', 'AddExtender',
+ 'Acos', 'Abs', 'About'
+ ),
+ 4 => array(
+ 'zZipFiles', 'zVersionInfo', 'zVersion', 'zUnZipFiles', 'zSetPortBit', 'zRPortShift', 'zPortOut', 'zPortIn', 'zNotPortBit',
+ 'zLPortShift', 'zGetPortBit', 'zClrPortBit', 'xVerifyCCard', 'xSendMessage', 'xMessageBox', 'xMemCompact', 'xHex', 'xGetElapsed',
+ 'xGetChildHwnd', 'xExtenderInfo', 'xEnumStreams', 'xEjectMedia', 'xDriveReady', 'xDiskLabelGet', 'xCursorSet', 'xBaseConvert',
+ 'wxPing', 'wxParmSet', 'wxParmGet', 'wxMsgSetHdr', 'wxMsgGetHdr', 'wxMsgGetBody', 'wxHost2Addr', 'wxGetLastErr', 'wxGetInfo',
+ 'wxGetErrDesc', 'wxAddr2Host', 'wtsWaitSystemEvent', 'wtsVersion', 'wtsTerminateProcess', 'wtsShutdownSystem', 'wtsSendMessage',
+ 'wtsQuerySessionInfo', 'wtsProcIdToSessId', 'wtsLogoffSession', 'wtsLastErrMsg', 'wtsIsTSEnabled', 'wtsIsCitrixEnabled',
+ 'wtsGetActiveConsoleSessId', 'wtsEnumSessions', 'wtsEnumProcesses', 'wtsDisconnectSession', 'wnWrkGroups', 'wnVersion', 'wntWtsUserSet',
+ 'wntWtsUserGet', 'wntVersion', 'wntUserSidChk', 'wntUserSetDat', 'wntUserRename', 'wntUserProps', 'wntUserList', 'wntUserInfo',
+ 'wntUserGetDat', 'wntUserFiles', 'wntUserExist', 'wntUserDel', 'wntUserAddDat', 'wntUserAdd', 'wntSvcStatus', 'wntSvcStart',
+ 'wntSvcList', 'wntSvcDelete', 'wntSvcCreate', 'wntSvcControl', 'wntSvcCfgSet', 'wntSvcCfgGet', 'wntShutdown', 'wntShareUsers',
+ 'wntShareSet', 'wntShareList', 'wntShareInfo', 'wntShareDel', 'wntShareAdd', 'wntServiceInf', 'wntServiceAt', 'wntServerType',
+ 'wntServerList', 'wntServerInfo', 'wntSecurityGet', 'wntRunAsUser', 'wntResources2', 'wntResources', 'wntRemoteTime', 'wntRasUserSet',
+ 'wntRasUserGet', 'wntProfileInfo', 'wntProfileDel', 'wntPrivUsers', 'wntPrivList', 'wntPrivGet', 'wntPrivDel', 'wntPrivAdd',
+ 'wntOwnerSet', 'wntOwnerGet', 'wntMemberSet', 'wntMemberLst2', 'wntMemberList', 'wntMemberGrps', 'wntMemberGet', 'wntMemberDel',
+ 'wntLsaPolSet', 'wntLsaPolGet', 'wntListGroups', 'wntLastErrMsg', 'wntGroupRen', 'wntGroupInfo', 'wntGroupEdit', 'wntGroupDel',
+ 'wntGroupAdd', 'wntGetUser', 'wntGetDrive', 'wntGetDc', 'wntGetCon', 'wntFileUsers', 'wntFilesOpen', 'wntFileClose', 'wntEventWrite',
+ 'wntEventLog', 'wntDomainSync', 'wntDirDialog', 'wntDfsList', 'wntDfsGetInfo', 'wntCurrUsers', 'wntChgPswd', 'wntCancelCon',
+ 'wntAuditMod', 'wntAuditList', 'wntAuditGet', 'wntAuditDel', 'wntAuditAdd2', 'wntAuditAdd', 'wntAddPrinter', 'wntAddDrive',
+ 'wntAcctPolSet', 'wntAcctPolGet', 'wntAcctList', 'wntAcctInfo', 'wntAccessMod', 'wntAccessList', 'wntAccessGet', 'wntAccessDel',
+ 'wntaccessadd2', 'wntAccessAdd', 'wnShares', 'wnSharePath', 'wnShareName', 'wnShareCnt', 'wnServers', 'wnRestore', 'wnNetNames',
+ 'wnGetUser', 'wnGetCon', 'wnGetCaps', 'wnDlgShare', 'wnDlgNoShare', 'wnDlgDiscon', 'wnDlgCon4', 'wnDlgCon3', 'wnDlgCon2', 'wnDlgCon',
+ 'wnDlgBrowse', 'wnDialog', 'wnCmptrInfo', 'wnCancelCon', 'wnAddCon', 'WaitSRQ', 'w9xVersion', 'w9xUserSetDat', 'w9xUserRename',
+ 'w9xUserprops', 'w9xUserList', 'w9xUserinfo', 'w9xUserGetDat', 'w9xUserExist', 'w9xUserDel', 'w9xUserAddDat', 'w9xUserAdd', 'w9xShareSet',
+ 'w9xShareInfo', 'w9xShareDel', 'w9xShareAdd', 'w9xServiceAt', 'w9xServerList', 'w9xRemoteTime', 'w9xOwnerGet', 'w9xMemberSet',
+ 'w9xMemberList', 'w9xMemberGrps', 'w9xMemberGet', 'w9xMemberDel', 'w9xListGroups', 'w9xGroupInfo', 'w9xGroupDel', 'w9xGroupAdd',
+ 'w9xGetDC', 'w9xFileUsers', 'w9xAccessList', 'w9xAccessGet', 'w9xAccessDel', 'w9xAccessAdd', 'w95Version', 'w95ShareUsers',
+ 'w95ShareSet', 'w95ShareList', 'w95ShareInfo', 'w95ShareDel', 'w95ShareAdd', 'w95ServiceInf', 'w95ServiceAt', 'w95ServerType',
+ 'w95ServerInfo', 'w95Resources', 'w95GetUser', 'w95GetDrive', 'w95GetCon', 'w95FileUsers', 'w95FileClose', 'w95DirDialog',
+ 'w95CancelCon', 'w95AddPrinter', 'w95AddDrive', 'w95AccessDel', 'w95AccessAdd', 'w3Version', 'w3PrtBrowse', 'w3NetGetUser',
+ 'w3NetDialog', 'w3GetCon', 'w3GetCaps', 'w3DirBrowse', 'w3CancelCon', 'w3AddCon', 'urlGetScheme', 'urlEncode', 'urlDecode',
+ 'tVersion', 'tSetPriority', 'TriggerList', 'Trigger', 'tRemoteConn', 'tOpenProc', 'tListProc', 'tListMod', 'tKillProc', 'tGetProcInfo',
+ 'tGetPriority', 'tGetModInfo', 'tGetLastError', 'tGetData', 'TestSys', 'TestSRQ', 'tCountProc', 'tCompatible', 'tCloseProc',
+ 'tBrowseCntrs', 'sSendString', 'sSendNum', 'sSendLine', 'sSendBinary', 'sRecvNum', 'sRecvLine', 'sRecvBinary', 'SrchVersion',
+ 'SrchNext', 'SrchInit', 'SrchFree', 'sOpen', 'sOK2Send', 'sOK2Recv', 'smtpSendText', 'smtpSendFile', 'sListen', 'SetRWLS',
+ 'SendSetup', 'SendLLO', 'SendList', 'SendIFC', 'SendDataBytes', 'SendCmds', 'Send', 'sConnect', 'sClose', 'SByteOrder32',
+ 'sByteOrder16', 'sAccept', 'rRegVersion', 'rRegSearch', 'ResetSys', 'ReceiveSetup', 'Receive', 'ReadStsByte', 'RcvRespMsg',
+ 'RasVersion', 'RasTypeSize', 'RasRename', 'RasNumCons', 'RasNameValid', 'RasListActCon', 'RasItemize', 'RasHangUp', 'RasGetLastErr',
+ 'RasGetConStat', 'RasEntrySet', 'RasEntryInfo', 'RasEntryExist', 'RasEntryDel', 'RasEntryAdd', 'RasDialInfo', 'RasDial',
+ 'RasCopy', 'RasConStatus', 'qVersionInfo', 'qTransact', 'qTables', 'qSpecial', 'qSetConnOpt', 'qNumRsltCol', 'qNativeSql', 'qLastCode',
+ 'qGetData', 'qFreeStmt', 'qFreeEnv', 'qFreeConnect', 'qFetch', 'qExecDirect', 'qError', 'qDriverList', 'qDriverCon', 'qDisconnect',
+ 'qDataSources', 'qConnect', 'qConfigError', 'qConfigData', 'qColumns', 'qBindCol', 'qAllocStmt', 'qAllocEnv', 'qAllocConnect',
+ 'pWaitFor', 'pVersionInfo', 'pTimeout', 'pSetPublish', 'pSetPrtInfo', 'pSetPrtAttrib', 'pSetDefPrtEx', 'pSetDefPrt', 'pSendFile',
+ 'pRecvFile', 'pPutString', 'pPutLine', 'pPutChar', 'pPutByte', 'pPutBinary', 'PPollUnconfig', 'PPollConfig', 'PPoll', 'pPeekChar',
+ 'pPeekByte', 'pPaperSizes', 'pPaperBins', 'pModemSReg', 'pModemParams', 'pModemInit', 'pModemHangUp', 'pModemDial', 'pModemControl',
+ 'pModemConnect', 'pModemCommand', 'pModemAnsRing', 'pModemAnsCall', 'pMediaTypes', 'pGetString', 'pGetPublish', 'pGetPrtList',
+ 'pGetPrtInfo', 'pGetPrtAttrib', 'pGetLine', 'pGetLastError', 'pGetErrorMsg', 'pGetErrorCode', 'pGetDefPrtInf', 'pGetChar',
+ 'pGetByte', 'pGetBinary', 'pDelPrtConn', 'pDelPrinter', 'pComOpen', 'pComModify', 'pComInfo', 'pComControl', 'pComClose',
+ 'pCheckSum', 'pCheckBinary', 'pCaptureOn', 'pCaptureOff', 'pCaptureLog', 'PassControl', 'pAddPrtConn', 'pAddPrinter', 'p3RecvText',
+ 'p3RecvFile', 'p3Peek', 'p3Open', 'p3GetReply', 'p3Delete', 'p3Count', 'p3Close', 'nwWhoAmI', 'nwVfyPassword', 'nwVersion',
+ 'nwSrvShutdown', 'nwSrvNLMMgr', 'nwSrvGenGUID', 'nwSrvExecNCF', 'nwSetVolLimit', 'nwSetSrvParam', 'nwSetSrvInfo', 'nwSetPrimServ',
+ 'nwSetPassword', 'nwSetOptions', 'nwSetFileInfo', 'nwSetDirLimit', 'nwSetDirInfo', 'nwSetContext', 'nwSetBcastMode', 'nwServerList',
+ 'nwSendBcastMsg', 'nwSearchObjects', 'nwSearchFilter', 'nwRenameObject', 'nwRemoveObject', 'nwReceiveBcastMsg', 'nwNameConvert',
+ 'nwMutateObject', 'nwMoveObject', 'nwModifyObject', 'nwMapDelete', 'nwMap', 'nwLogout', 'nwLogin', 'nwListUserGroups',
+ 'nwListObjects', 'nwListGroupMembers', 'nwLastErrMsg', 'nwIsUserInGroup', 'nwGetVolLimit', 'nwGetSrvStats', 'nwGetSrvParam',
+ 'nwGetSrvInfo', 'nwGetSrvCfg', 'nwGetOptions', 'nwGetObjValue', 'nwGetObjInfo', 'nwGetNLMInfo', 'nwGetMapped', 'nwGetFileInfo',
+ 'nwGetDirLimit', 'nwGetDirInfo', 'nwGetContext', 'nwGetConnInfo', 'nwGetCapture', 'nwGetBcastMode', 'nwGetAttrInfo',
+ 'nwDriveStatus', 'nwDrivePath', 'nwDetachFromServer', 'nwDelUserFromGroup', 'nwDelConnNum', 'nwCompareObject', 'nwClientInfo',
+ 'nwChgPassword', 'nwAttachToServer', 'nwAddUserToGroup', 'nwAddObject', 'netVersion', 'netResources', 'netGetUser', 'netGetCon',
+ 'netDirDialog', 'netCancelCon', 'netAddPrinter', 'netAddDrive', 'n4Version', 'n4UserGroups', 'n4UserGroupEx', 'n4SetPrimServ',
+ 'n4SetOptions', 'n4SetContextG', 'n4SetContext', 'n4ServerList', 'n4ServerInfo', 'n4ObjSearch', 'n4ObjRename', 'n4ObjOptions',
+ 'n4ObjMove', 'n4ObjGetVal', 'n4ObjectProps', 'n4ObjectList', 'n4ObjectInfo', 'n4ObjDelete', 'n4NameConvert', 'n4MsgsEndAll',
+ 'n4MsgsEnd', 'n4MemberSet', 'n4MemberGet', 'n4MemberDel', 'n4MapRoot', 'n4MapDir', 'n4MapDelete', 'n4Map', 'n4LogoutTree',
+ 'n4Logout', 'n4Login', 'n4GetUserName', 'n4GetUserId', 'n4GetUser', 'n4GetNetAddr', 'n4GetMapped', 'n4GetContext',
+ 'n4GetConnNum', 'n4FileUsers', 'n4FileTimeGet', 'n4FileAttrSet', 'n4FileAttrGet', 'n4DriveStatus', 'n4DrivePath', 'n4DirTimeGet',
+ 'n4DirAttrSet', 'n4DirAttrGet', 'n4Detach', 'n4ChgPassword', 'n4CapturePrt', 'n4CaptureGet', 'n4CaptureEnd', 'n4Attach',
+ 'n3Version', 'n3UserGroups', 'n3ServerList', 'n3ServerInfo', 'n3MsgsEndAll', 'n3MsgsEnd', 'n3MemberSet', 'n3MemberGet',
+ 'n3MemberDel', 'n3Maproot', 'n3Mapdir', 'n3Mapdelete', 'n3Map', 'n3Logout', 'n3GetUserId', 'n3GetUser', 'n3GetNetAddr',
+ 'n3GetMapped', 'n3GetConnNum', 'n3FileTimeGet', 'n3FileAttrSet', 'n3FileAttrGet', 'n3DriveStatus', 'n3DrivePath',
+ 'n3DirTimeGet', 'n3DirAttrSet', 'n3DirAttrGet', 'n3Detach', 'n3ChgPassword', 'n3CapturePrt', 'n3CaptureGet',
+ 'n3CaptureEnd', 'n3Attach', 'mVersion', 'mSyncMail', 'mSendMailEx', 'mSendMail', 'mrecvmail', 'mReadNextMsg', 'mLogOn',
+ 'mLogOff', 'mFindNext', 'mError', 'mCompatible', 'kVerInfo', 'kStatusInfo', 'kSendText', 'kSendFile', 'kManageImap4',
+ 'kInit', 'kGetMail', 'kExtra', 'kDest', 'kDeletePop3', 'iWriteDataBuf', 'iWriteData', 'iVersion', 'IUrlOpen', 'iUrlEncode',
+ 'iUrlDecode', 'iReadDataBuf', 'iReadData', 'ipVersion', 'ipPing', 'iPing', 'ipHost2Addr', 'ipGetLastErr', 'ipGetAddress',
+ 'iParseURL', 'ipAddr2Host', 'iOptionSet', 'iOptionGet', 'ImgWave', 'ImgVersion', 'ImgUnsharpMask', 'ImgThreshold', 'ImgSwirl',
+ 'ImgSpread', 'ImgSolarize', 'ImgShear', 'ImgSharpen', 'ImgShade', 'ImgScale', 'ImgSample', 'ImgRotate', 'ImgResize',
+ 'ImgReduceNoise', 'ImgRaise', 'ImgOilPaint', 'ImgNormalize', 'ImgNegate', 'ImgMotionBlur', 'ImgModulate', 'ImgMinify',
+ 'ImgMedianFilter', 'ImgMagnify', 'ImgLevel', 'ImgIsValid', 'ImgIsPalette', 'ImgIsMono', 'ImgIsGray', 'ImgInfo', 'ImgImplode',
+ 'ImgGetImageType', 'ImgGetColorCount', 'ImgGaussianBlur', 'ImgGamma', 'ImgFrame', 'ImgFlop', 'ImgFlip', 'ImgEqualize',
+ 'ImgEnhance', 'ImgEmboss', 'ImgCrop', 'ImgConvert', 'ImgContrast', 'ImgCompare', 'ImgColorize', 'ImgChop', 'ImgCharcoal',
+ 'ImgBorder', 'ImgBlur', 'ImgAddNoise', 'iLocFindNext', 'iLocFindInit', 'iHttpOpen', 'iHttpInit', 'iHttpHeaders', 'iHttpAccept',
+ 'iHostConnect', 'iHost2Addr', 'iGetResponse', 'iGetLastError', 'iGetIEVer', 'iGetConStatEx', 'iGetConState', 'iFtpRename',
+ 'iFtpPut', 'iFtpOpen', 'iFtpGet', 'iFtpFindNext', 'iFtpFindInit', 'iFtpDirRemove', 'iFtpDirMake', 'iFtpDirGet', 'iFtpDirChange',
+ 'iFtpDialog', 'iFtpDelete', 'iFtpCmd', 'iErrorDialog', 'iDialItemize', 'iDialHangUp', 'iDial', 'iCookieSet', 'iCookieGet',
+ 'iContentURL', 'iContentFile', 'iContentData', 'iClose', 'ibWrtf', 'ibWrt', 'ibWait', 'ibVersion', 'ibUnlock', 'ibTrg',
+ 'ibTmo', 'ibStop', 'ibStatus', 'ibSta', 'ibSre', 'ibSic', 'ibSad', 'ibRsv', 'ibRsp', 'ibRsc', 'ibRpp', 'ibRdf', 'ibRd',
+ 'ibPpc', 'ibPoke', 'ibPct', 'ibPad', 'ibOnl', 'ibMakeAddr', 'ibLock', 'ibLoc', 'ibLn', 'ibLines', 'ibIst', 'ibInit',
+ 'ibGts', 'ibGetSad', 'ibGetPad', 'ibFind', 'ibEvent', 'ibErr', 'ibEot', 'ibEos', 'iBegin', 'ibDma', 'ibDev', 'ibConfig',
+ 'ibCntl', 'ibCnt', 'ibCmda', 'ibCmd', 'ibClr', 'ibCac', 'ibBna', 'ibAsk', 'iAddr2Host', 'huge_Thousands', 'huge_Subtract',
+ 'huge_SetOptions', 'huge_Multiply', 'huge_GetLastError', 'huge_ExtenderInfo', 'huge_Divide', 'huge_Decimal', 'huge_Add',
+ 'httpStripHTML', 'httpRecvTextF', 'httpRecvText', 'httpRecvQuery', 'httpRecvQryF', 'httpRecvFile', 'httpGetServer',
+ 'httpGetQuery', 'httpGetPath', 'httpGetFile', 'httpGetDir', 'httpGetAnchor', 'httpFullPath', 'httpFirewall', 'httpAuth',
+ 'ftpRename', 'ftpQuote', 'ftpPut', 'ftpOpen', 'ftpList', 'ftpGet', 'ftpFirewall', 'ftpDelete', 'ftpClose', 'ftpChDir',
+ 'FindRQS', 'FindLstn', 'EnvSetVar', 'EnvPathDel', 'EnvPathChk', 'EnvPathAdd', 'EnvListVars', 'EnvGetVar', 'EnvGetInfo',
+ 'EnableRemote', 'EnableLocal', 'ehllapiWait', 'ehllapiVersion', 'ehllapiUninit', 'ehllapiStopKeyIntercept', 'ehllapiStopHostNotify',
+ 'ehllapiStopCloseIntercept', 'ehllapiStartKeyIntercept', 'ehllapiStartHostNotify', 'ehllapiStartCloseIntercept',
+ 'ehllapiSetWindowStatus', 'ehllapiSetSessionParams', 'ehllapiSetPSWindowName', 'ehllapiSetCursorLoc', 'ehllapiSendKey',
+ 'ehllapiSendFile', 'ehllapiSearchPS', 'ehllapiSearchField', 'ehllapiRunProfile', 'ehllapiResetSystem', 'ehllapiReserve',
+ 'ehllapiRelease', 'ehllapiReceiveFile', 'ehllapiQuerySystem', 'ehllapiQueryPSStatus', 'ehllapiQueryHostNotify',
+ 'ehllapiQueryFieldAttr', 'ehllapiQueryCursorLoc', 'ehllapiQueryCloseIntercept', 'ehllapiPostInterceptStatus',
+ 'ehllapiPause', 'ehllapiLastErrMsg', 'ehllapiInit', 'ehllapiGetWindowStatus', 'ehllapiGetPSHWND', 'ehllapiGetKey',
+ 'ehllapiFindFieldPos', 'ehllapiFindFieldLen', 'ehllapiDisconnectPS', 'ehllapiCvtRCToPos', 'ehllapiCvtPosToRC',
+ 'ehllapiCopyTextToPS', 'ehllapiCopyTextToField', 'ehllapiCopyTextFromPS', 'ehllapiCopyTextFromField', 'ehllapiCopyOIA',
+ 'ehllapiConnectPS', 'dunItemize', 'dunDisconnect', 'dunConnectEx', 'dunConnect', 'dsTestParam', 'dsSIDtoHexStr', 'dsSetSecProp',
+ 'dsSetProperty', 'dsSetPassword', 'dsSetObj', 'dsSetCredentX', 'dsSetCredent', 'dsRemFromGrp', 'dsRelSecObj', 'dsMoveObj',
+ 'dsIsObject', 'dsIsMemberGrp', 'dsIsContainer', 'dsGetUsersGrps', 'dsGetSecProp', 'dsGetPropName', 'dsGetProperty',
+ 'dsGetPrntPath', 'dsGetPrimGrp', 'dsGetMemGrp', 'dsGetInfo', 'dsGetClass', 'dsGetChldPath', 'dsFindPath', 'dsDeleteObj',
+ 'dsCreatSecObj', 'dsCreateObj', 'dsCopySecObj', 'dsAddToGrp', 'dsAclRemAce', 'dsAclOrderAce', 'dsAclGetAces', 'dsAclAddAce',
+ 'DevClearList', 'DevClear', 'dbTest', 'dbSwapColumns', 'dbSort', 'dbSetRecordField', 'dbSetOptions', 'dbSetErrorReporting',
+ 'dbSetEntireRecord', 'dbSetDelimiter', 'dbSave', 'dbOpen', 'dbNameColumn', 'dbMakeNewItem', 'dbInsertColumn', 'dbGetVersion',
+ 'dbGetSaveStatus', 'dbGetRecordField', 'dbGetRecordCount', 'dbGetNextItem', 'dbGetLastError', 'dbGetEntireRecord',
+ 'dbGetColumnType', 'dbGetColumnNumber', 'dbGetColumnName', 'dbGetColumnCount', 'dbFindRecord', 'dbExist', 'dbEasterEgg',
+ 'dbDeleteRecord', 'dbDeleteColumn', 'dbDebug', 'dbCookDatabases', 'dbClose', 'dbCloneRecord', 'dbBindCol', 'cWndState',
+ 'cWndinfo', 'cWndGetWndSpecName', 'cWndGetWndSpec', 'cWndexist', 'cWndByWndSpecName', 'cWndByWndSpec', 'cWndbyseq',
+ 'cWndbyname', 'cWndbyid', 'cWndbyclass', 'cWinIDConvert', 'cVersionInfo', 'cVendorId', 'cSetWndText', 'cSetUpDownPos',
+ 'cSetTvItem', 'cSetTrackPos', 'cSetTabItem', 'cSetLvItem', 'cSetLbItemEx', 'cSetLbItem', 'cSetIpAddr', 'cSetFocus',
+ 'cSetEditText', 'cSetDtpDate', 'cSetCbItem', 'cSetCalDate', 'cSendMessage', 'cRadioButton', 'cPostMessage', 'cPostButton',
+ 'cMemStat', 'cGetWndCursor', 'cGetUpDownPos', 'cGetUpDownMin', 'cGetUpDownMax', 'cGetTVItem', 'cGetTrackPos', 'cGetTrackMin',
+ 'cGetTrackMax', 'cGetTbText', 'cGetSbText', 'cGetLvText', 'cGetLvSelText', 'cGetLvFocText', 'cGetLvDdtText', 'cGetLvColText',
+ 'cGetLbText', 'cGetLbSelText', 'cGetLbCount', 'cGetIpAddr', 'cGetInfo', 'cGetHrText', 'cGetFocus', 'cGetEditText', 'cGetDtpDate',
+ 'cGetControlImageCRC', 'cGetCBText', 'cGetCbCount', 'cGetCalDate', 'cFindByName', 'cFindByClass', 'cEnablestate', 'cDblClickItem',
+ 'cCpuSupt', 'cCpuSpeed', 'cCpuIdExt', 'cCpuId', 'cCpuFeat', 'cCpuBenchmark', 'cCloneCheck', 'cClickToolbar', 'cClickButton',
+ 'cClearTvItem', 'cClearLvItem', 'cClearLbAll', 'cCheckbox', 'aVersion', 'aStatusbar', 'aShellFolder', 'aMsgTimeout', 'AllSPoll',
+ 'aGetLastError', 'aFileRename', 'aFileMove', 'aFileDelete', 'aFileCopy'
+ ),
+ 5 => array(
+ 'wWordRight', 'wWordLeft', 'wWinTile', 'wWinRestore', 'wWinNext', 'wWinMinimize', 'wWinMaximize', 'wWinCloseAll', 'wWinClose',
+ 'wWinCascade', 'wWinArricons', 'wViewOutput', 'wViewOptions', 'wViewHtml', 'wUpperCase', 'wUpline', 'wUndo', 'wTopOfFile', 'wToggleIns',
+ 'wTab', 'wStatusMsg', 'wStartSel', 'wSpellcheck', 'wSetProject', 'wSetPrefs', 'wSetColblk', 'wSetBookmark', 'wSelWordRight',
+ 'wSelWordLeft', 'wSelUp', 'wSelTop', 'wSelRight', 'wSelPgUp', 'wSelPgDn', 'wSelLeft', 'wSelInfo', 'wSelHome', 'wSelEnd', 'wSelectAll',
+ 'wSelDown', 'wSelBottom', 'wRunRebuild', 'wRunMake', 'wRunExecute', 'wRunDebug', 'wRunConfig', 'wRunCompile', 'wRunCommand', 'wRight',
+ 'wRepeat', 'wRedo', 'wRecord', 'wProperties', 'wPrintDirect', 'wPrinSetup', 'wPrevError', 'wPaste', 'wPageUp', 'wPageDown', 'wNextError',
+ 'wNewLine', 'wLowerCase', 'wLineCount', 'wLeft', 'wInvertCase', 'wInsString', 'wInsLine', 'wHome', 'wHelpKeyword', 'wHelpKeybrd',
+ 'wHelpIndex', 'wHelpHelp', 'wHelpCmds', 'wHelpAbout', 'wGotoLine', 'wGotoCol', 'wGetWrap', 'wGetWord', 'wGetUndo', 'wGetSelstate',
+ 'wGetRedo', 'wGetOutput', 'wGetModified', 'wGetLineNo', 'wGetIns', 'wGetFilename', 'wGetColNo', 'wGetChar', 'wFtpOpen', 'wFindNext',
+ 'wFindInFiles', 'wFind', 'wFileSaveAs', 'wFileSave', 'wFileRevert', 'wFilePrint', 'wFilePgSetup', 'wFileOpen', 'wFileNew', 'wFileMerge',
+ 'wFileList', 'wFileExit', 'wEndSel', 'wEndOfFile', 'wEnd', 'wEdWrap', 'wEdWordRight', 'wEdWordLeft', 'wEdUpLine', 'wEdUndo', 'wEdTopOfFile',
+ 'wEdToggleIns', 'wEdTab', 'wEdStartSel', 'wEdSetColBlk', 'wEdSelectAll', 'wEdRight', 'wEdRedo', 'wEdPaste', 'wEdPageUp', 'wEdPageDown',
+ 'wEdNewLine', 'wEdLeft', 'wEdInsString', 'wEdHome', 'wEdGoToLine', 'wEdGoToCol', 'wEdGetWord', 'wEdEndSel', 'wEdEndOfFile', 'wEdEnd',
+ 'wEdDownLine', 'wEdDelete', 'wEdCutLine', 'wEdCut', 'wEdCopyLine', 'wEdCopy', 'wEdClearSel', 'wEdBackTab', 'wEdBackspace', 'wDownLine',
+ 'wDelete', 'wDelButton', 'wCutMarked', 'wCutLine', 'wCutAppend', 'wCut', 'wCopyMarked', 'wCopyLine', 'wCopyAppend', 'wCopy', 'wCompile',
+ 'wClearSel', 'wChange', 'wCallMacro', 'wBackTab', 'wBackspace', 'wAutoIndent', 'wAddButton', 'edWindowTile', 'edWindowRestore',
+ 'edWindowNext', 'edWindowMinimize', 'edWindowMaximize', 'edWindowCloseall', 'edWindowClose', 'edWindowCascade', 'edWindowArrangeIcons',
+ 'edStatusMsg', 'edSearchViewOutput', 'edSearchRepeat', 'edSearchPrevError', 'edSearchNextError', 'edSearchFind', 'edSearchChange',
+ 'edRunRebuild', 'edRunMake', 'edRunExecute', 'edRunDebug', 'edRunConfigure', 'edRunCompile', 'edRunCommand', 'edRecord', 'edHelpProcedures',
+ 'edHelpKeyword', 'edHelpKeyboard', 'edHelpIndex', 'edHelpHelp', 'edHelpCommands', 'edHelpAbout', 'edGetWordWrapState', 'edGetWindowName',
+ 'edGetUndoState', 'edGetSelectionState', 'edGetRedoState', 'edGetModifiedStatus', 'edGetLineNumber', 'edGetInsertState', 'edGetColumnNumber',
+ 'edGetChar', 'edFileSetPreferences', 'edFileSaveAs', 'edFileSave', 'edFilePrinterSetup', 'edFilePrint', 'edFilePageSetup', 'edFileOpen',
+ 'edFileNew', 'edFileMerge', 'edFileList', 'edFileExit', 'edEditWrap', 'edEditWordRight', 'edEditWordLeft', 'edEditUpLine', 'edEditUndo',
+ 'edEditToggleIns', 'edEditTab', 'edEditStartSelection', 'edEditSetColumnBlock', 'edEditSetBookmark', 'edEditSelectAll', 'edEditRight',
+ 'edEditRedo', 'edEditPaste', 'edEditPageUp', 'edEditPageDown', 'edEditLeft', 'edEditInsertString', 'edEditGoToLine', 'edEditGoToColumn',
+ 'edEditGoToBookmark', 'edEditGetCurrentWord', 'edEditEndSelection', 'edEditEndOfLine', 'edEditEndOfFile', 'edEditDownline', 'edEditDelete',
+ 'edEditCutline', 'edEditCut', 'edEditCopyline', 'edEditCopy', 'edEditClearSelection', 'edEditBeginningOfLine', 'edEditBeginningOfFile',
+ 'edEditBackTab', 'edEditBackspace', 'edDeleteButton', 'edAddButton'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '{', '}', '!', '+', '-', '~', '$', '^', '?', '@', '%', '#', '&', '*', '|', '/', '<', '>'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false,
+ 5 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #800080;',
+ 2 => 'color: #0080FF; font-weight: bold;',
+ 3 => 'color: #0000FF;',
+ 4 => 'color: #FF00FF;',
+ 5 => 'color: #008000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #008000; font-style: italic;',
+ 2 => 'color: #FF1010; font-weight: bold;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #006600;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => '',
+ 5 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(),
+ 'REGEXPS' => array(//Variable names
+ 0 => "[\\$]{1,2}[a-zA-Z_][a-zA-Z0-9_]*"
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_MAYBE,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/xbasic.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/xbasic.php
new file mode 100644
index 00000000..2edede36
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/xbasic.php
@@ -0,0 +1,143 @@
+<?php
+/*************************************************************************************
+ * xbasic.php
+ * ----------
+ * Author: José Gabriel Moya Yangüela (josemoya@gmail.com)
+ * Copyright: (c) 2005 José Gabriel Moya Yangüela (http://aprenderadesaprender.6te.net)
+ * Release Version: 1.0.8.11
+ * Date Started: 2005/11/23
+ *
+ * XBasic language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * - Removed duplicate keywords
+ * - Tabs converted in spaces.
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'XBasic',
+ 'COMMENT_SINGLE' => array(1 => "'"),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'WHILE', 'UNTIL', 'TRUE', 'TO', 'THEN', 'SUB', 'STOP', 'STEP',
+ 'SELECT', 'RETURN', 'PROGRAM', 'NEXT', 'LOOP', 'IFZ',
+ 'IFT', 'IFF', 'IF', 'GOTO', 'GOSUB', 'FOR', 'FALSE', 'EXIT',
+ 'ENDIF', 'END', 'ELSE', 'DO', 'CASE', 'ALL'
+ ),
+ 2 => array(
+ 'XMAKE', 'XLONGAT', 'XLONG', 'WRITE', 'VOID', 'VERSION$', 'VERSION',
+ 'USHORTAT', 'USHORT', 'UNION', 'ULONGAT', 'ULONG', 'UCASE$',
+ 'UBYTEAT', 'UBYTE', 'UBOUND', 'TYPE','TRIM$', 'TAB', 'SWAP',
+ 'SUBADDRESS', 'SUBADDR', 'STUFF$', 'STRING', 'STRING$', 'STR$',
+ 'STATIC', 'SSHORTAT', 'SSHORT', 'SPACE$', 'SMAKE', 'SLONGAT', 'SLONG',
+ 'SIZE', 'SINGLEAT', 'SINGLE', 'SIGNED$', 'SIGN', 'SHELL', 'SHARED',
+ 'SGN', 'SFUNCTION', 'SET', 'SEEK', 'SCOMPLEX', 'SBYTEAT', 'SBYTE',
+ 'RTRIM$', 'ROTATER', 'ROTATEL', 'RJUST$', 'RINSTRI', 'RINSTR',
+ 'RINCHRI', 'RINCHR', 'RIGHT$', 'REDIM', 'READ', 'RCLIP$', 'QUIT',
+ 'PROGRAM$', 'PRINT', 'POF', 'OPEN', 'OCTO$', 'OCT$', 'NULL$', 'MIN',
+ 'MID$', 'MAX', 'MAKE', 'LTRIM$', 'LOF', 'LJUST$', 'LIBRARY', 'LEN',
+ 'LEFT$', 'LCLIP$', 'LCASE$', 'INTERNAL', 'INT', 'INSTRI', 'INSTR',
+ 'INLINE$', 'INFILE$', 'INCHRI', 'INCHR', 'INC', 'IMPORT', 'HIGH1',
+ 'HIGH0', 'HEXX$', 'HEX$', 'GOADDRESS', 'GOADDR', 'GMAKE', 'GLOW',
+ 'GIANTAT', 'GIANT', 'GHIGH', 'FUNCTION', 'FUNCADDRESS', 'FUNCADDR',
+ 'FORMAT$', 'FIX', 'EXTU', 'EXTS', 'EXTERNAL', 'ERROR', 'ERROR$',
+ 'EOF', 'DOUBLEAT', 'DOUBLE', 'DMAKE', 'DLOW', 'DIM', 'DHIGH',
+ 'DECLARE', 'DEC', 'DCOMPLEX', 'CSTRING$', 'CSIZE', 'CSIZE$', 'CLR',
+ 'CLOSE', 'CLEAR', 'CJUST$', 'CHR$', 'CFUNCTION', 'BITFIELD', 'BINB$',
+ 'BIN$', 'AUTOX', 'AUTOS', 'AUTO', 'ATTACH', 'ASC', 'ABS'
+ ),
+ 3 => array(
+ 'XOR', 'OR', 'NOT', 'MOD', 'AND'
+ ),
+ 4 => array(
+ 'TANH', 'TAN', 'SQRT', 'SINH', 'SIN', 'SECH', 'SEC', 'POWER',
+ 'LOG10', 'LOG', 'EXP10', 'EXP', 'CSCH', 'CSC', 'COTH', 'COT', 'COSH',
+ 'COS', 'ATANH', 'ATAN', 'ASINH', 'ASIN', 'ASECH', 'ASEC', 'ACSCH',
+ 'ACSC', 'ACOSH', 'ACOS'
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')', '[', ']', '!', '@', '%', '&', '*', '|', '/', '<', '>',
+ '=','+','-'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #00a1a1;font-weight: bold',
+ 2 => 'color: #000066;font-weight: bold',
+ 3 => 'color: #00a166;font-weight: bold',
+ 4 => 'color: #0066a1;font-weight: bold'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => 'http://www.xbasic.org',
+ 4 => 'http://www.xbasic.org'
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/xml.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/xml.php
new file mode 100644
index 00000000..6354e457
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/xml.php
@@ -0,0 +1,157 @@
+<?php
+/*************************************************************************************
+ * xml.php
+ * -------
+ * Author: Nigel McNie (nigel@geshi.org)
+ * Copyright: (c) 2004 Nigel McNie (http://qbnz.com/highlighter/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2004/09/01
+ *
+ * XML language file for GeSHi. Based on the idea/file by Christian Weiske
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2005/12/28 (1.0.2)
+ * - Removed escape character for strings
+ * 2004/11/27 (1.0.1)
+ * - Added support for multiple object splitters
+ * 2004/10/27 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2004/11/27)
+ * -------------------------
+ * * Check regexps work and correctly highlight XML stuff and nothing else
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'XML',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ ),
+ 'COMMENTS' => array(
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SCRIPT' => array(
+ -1 => 'color: #808080; font-style: italic;', // comments
+ 0 => 'color: #00bbdd;',
+ 1 => 'color: #ddbb00;',
+ 2 => 'color: #339933;',
+ 3 => 'color: #009900;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #000066;',
+ 1 => 'color: #000000; font-weight: bold;',
+ 2 => 'color: #000000; font-weight: bold;'
+ )
+ ),
+ 'URLS' => array(
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ 0 => array(//attribute names
+ GESHI_SEARCH => '([a-z_:][\w\-\.:]*)(=)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => '\\2'
+ ),
+ 1 => array(//Initial header line
+ GESHI_SEARCH => '(&lt;[\/?|(\?xml)]?[a-z_:][\w\-\.:]*(\??&gt;)?)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ 2 => array(//Tag end markers
+ GESHI_SEARCH => '(([\/|\?])?&gt;)',
+ GESHI_REPLACE => '\\1',
+ GESHI_MODIFIERS => 'i',
+ GESHI_BEFORE => '',
+ GESHI_AFTER => ''
+ ),
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_ALWAYS,
+ 'SCRIPT_DELIMITERS' => array(
+ -1 => array(
+ '<!--' => '-->'
+ ),
+ 0 => array(
+ '<!DOCTYPE' => '>'
+ ),
+ 1 => array(
+ '&' => ';'
+ ),
+ 2 => array(
+ '<![CDATA[' => ']]>'
+ ),
+ 3 => array(
+ '<' => '>'
+ )
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ -1 => false,
+ 0 => false,
+ 1 => false,
+ 2 => false,
+ 3 => true
+ ),
+ 'TAB_WIDTH' => 2,
+ 'PARSER_CONTROL' => array(
+ 'ENABLE_FLAGS' => array(
+ 'NUMBERS' => GESHI_NEVER
+ )
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/xorg_conf.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/xorg_conf.php
new file mode 100644
index 00000000..99edc665
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/xorg_conf.php
@@ -0,0 +1,124 @@
+<?php
+/*************************************************************************************
+ * xorg_conf.php
+ * ----------
+ * Author: Milian Wolff (mail@milianw.de)
+ * Copyright: (c) 2008 Milian Wolff (http://milianw.de)
+ * Release Version: 1.0.8.11
+ * Date Started: 2008/06/18
+ *
+ * xorg.conf language file for GeSHi.
+ *
+ * CHANGES
+ * -------
+ * 2008/06/18 (1.0.8)
+ * - Initial import
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'Xorg configuration',
+ 'COMMENT_SINGLE' => array(1 => '#'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ // sections
+ 1 => array(
+ 'Section', 'EndSection', 'SubSection', 'EndSubSection'
+ ),
+ 2 => array(
+ // see http://www.x.org/archive/X11R6.9.0/doc/html/xorg.conf.5.html
+ 'BiosBase', 'Black', 'Boardname', 'BusID', 'ChipID', 'ChipRev',
+ 'Chipset', 'ClockChip', 'Clocks', 'DacSpeed',
+ 'DefaultDepth', 'DefaultFbBpp', 'Depth', 'Device',
+ 'DisplaySize', 'Driver', 'FbBpp', 'Gamma',
+ 'HorizSync', 'IOBase', 'Identifier', 'InputDevice',
+ 'Load', 'MemBase', 'Mode', 'Modeline', 'Modelname',
+ 'Modes', 'Monitor', 'Option', 'Ramdac', 'RgbPath',
+ 'Screen', 'TextClockFreq', 'UseModes', 'VendorName',
+ 'VertRefresh', 'VideoAdaptor', 'VideoRam',
+ 'ViewPort', 'Virtual', 'Visual', 'Weight', 'White'
+ ),
+ 3 => array(
+ // some sub-keywords
+ // screen position
+ 'Above', 'Absolute', 'Below', 'LeftOf', 'Relative', 'RightOf',
+ // modes
+ 'DotClock', 'Flags', 'HSkew', 'HTimings', 'VScan', 'VTimings'
+ ),
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #b1b100;',
+ 2 => 'color: #990000;',
+ 3 => 'color: #550000;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'BRACKETS' => array(
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #0000ff;',
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #cc66cc;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 4
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/xpp.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/xpp.php
new file mode 100644
index 00000000..a06e2779
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/xpp.php
@@ -0,0 +1,436 @@
+<?php
+/*************************************************************************************
+ * xpp.php
+ * -------
+ * Author: Simon Butcher (simon@butcher.name)
+ * Copyright: (c) 2007 Simon Butcher (http://simon.butcher.name/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/02/27
+ *
+ * Axapta/Dynamics Ax X++ language file for GeSHi.
+ * For details, see <http://msdn.microsoft.com/en-us/library/aa867122.aspx>
+ *
+ * CHANGES
+ * -------
+ * 2007/02/28 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2007/02/27)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'X++',
+ 'COMMENT_SINGLE' => array(1 => '//'),
+ 'COMMENT_MULTI' => array('/*' => '*/'),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array( // Primitive types
+ 'void',
+ 'str',
+ 'real',
+ 'int64',
+ 'int',
+ 'date',
+ 'container',
+ 'boolean',
+ 'anytype'
+ ),
+ 2 => array( // Keywords
+ 'window',
+ 'while',
+ 'try',
+ 'true',
+ 'throw',
+ 'switch',
+ 'super',
+ 'static',
+ 'server',
+ 'right',
+ 'return',
+ 'retry',
+ 'public',
+ 'protected',
+ 'private',
+ 'print',
+ 'pause',
+ 'null',
+ 'new',
+ 'mod',
+ 'left',
+ 'interface',
+ 'implements',
+ 'if',
+ 'for',
+ 'final',
+ 'false',
+ 'extends',
+ 'else',
+ 'edit',
+ 'do',
+ 'div',
+ 'display',
+ 'default',
+ 'continue',
+ 'client',
+ 'class',
+ 'changeCompany',
+ 'case',
+ 'breakpoint',
+ 'break',
+ 'at',
+ 'abstract'
+ ),
+ 3 => array( // Functions within the Axapta kernel
+ 'year',
+ 'wkofyr',
+ 'webwebpartstr',
+ 'webstaticfilestr',
+ 'websitetempstr',
+ 'websitedefstr',
+ 'webreportstr',
+ 'webpagedefstr',
+ 'weboutputcontentitemstr',
+ 'webmenustr',
+ 'webletitemstr',
+ 'webformstr',
+ 'webdisplaycontentitemstr',
+ 'webactionitemstr',
+ 'varstr',
+ 'utilmoyr',
+ 'uint2str',
+ 'typeof',
+ 'typeid',
+ 'trunc',
+ 'today',
+ 'timenow',
+ 'time2str',
+ 'term',
+ 'tanh',
+ 'tan',
+ 'tablestr',
+ 'tablestaticmethodstr',
+ 'tablepname',
+ 'tablenum',
+ 'tablename2id',
+ 'tablemethodstr',
+ 'tableid2pname',
+ 'tableid2name',
+ 'tablefieldgroupstr',
+ 'tablecollectionstr',
+ 'systemdateset',
+ 'systemdateget',
+ 'syd',
+ 'substr',
+ 'strupr',
+ 'strscan',
+ 'strrtrim',
+ 'strrep',
+ 'strrem',
+ 'strprompt',
+ 'strpoke',
+ 'strnfind',
+ 'strlwr',
+ 'strltrim',
+ 'strline',
+ 'strlen',
+ 'strkeep',
+ 'strins',
+ 'strfmt',
+ 'strfind',
+ 'strdel',
+ 'strcolseq',
+ 'strcmp',
+ 'stralpha',
+ 'str2time',
+ 'str2num',
+ 'str2int64',
+ 'str2int',
+ 'str2guid',
+ 'str2enum',
+ 'str2date',
+ 'staticmethodstr',
+ 'sln',
+ 'sleep',
+ 'sinh',
+ 'sin',
+ 'setprefix',
+ 'sessionid',
+ 'securitykeystr',
+ 'securitykeynum',
+ 'runbuf',
+ 'runas',
+ 'round',
+ 'resourcestr',
+ 'reportstr',
+ 'refprintall',
+ 'rate',
+ 'querystr',
+ 'pv',
+ 'pt',
+ 'prmisdefault',
+ 'primoyr',
+ 'prevyr',
+ 'prevqtr',
+ 'prevmth',
+ 'power',
+ 'pmt',
+ 'num2str',
+ 'num2date',
+ 'num2char',
+ 'nextyr',
+ 'nextqtr',
+ 'nextmth',
+ 'newguid',
+ 'mthofyr',
+ 'mthname',
+ 'mkdate',
+ 'minint',
+ 'min',
+ 'methodstr',
+ 'menustr',
+ 'menuitemoutputstr',
+ 'menuitemdisplaystr',
+ 'menuitemactionstr',
+ 'maxint',
+ 'maxdate',
+ 'max',
+ 'match',
+ 'logn',
+ 'log10',
+ 'literalstr',
+ 'licensecodestr',
+ 'licensecodenum',
+ 'intvnorm',
+ 'intvno',
+ 'intvname',
+ 'intvmax',
+ 'int64str',
+ 'indexstr',
+ 'indexnum',
+ 'indexname2id',
+ 'indexid2name',
+ 'idg',
+ 'identifierstr',
+ 'helpfilestr',
+ 'helpdevstr',
+ 'helpapplstr',
+ 'guid2str',
+ 'getprefix',
+ 'getCurrentUTCTime',
+ 'fv',
+ 'funcname',
+ 'frac',
+ 'formstr',
+ 'fieldstr',
+ 'fieldpname',
+ 'fieldnum',
+ 'fieldname2id',
+ 'fieldid2pname',
+ 'fieldid2name',
+ 'extendedTypeStr',
+ 'extendedTypeNum',
+ 'exp10',
+ 'exp',
+ 'evalbuf',
+ 'enumstr',
+ 'enumnum',
+ 'enumcnt',
+ 'enum2str',
+ 'endmth',
+ 'dimof',
+ 'dg',
+ 'decround',
+ 'ddb',
+ 'dayofyr',
+ 'dayofwk',
+ 'dayofmth',
+ 'dayname',
+ 'date2str',
+ 'date2num',
+ 'curuserid',
+ 'curext',
+ 'cterm',
+ 'cosh',
+ 'cos',
+ 'corrflagset',
+ 'corrflagget',
+ 'convertUTCTimeToLocalTime',
+ 'convertUTCDateToLocalDate',
+ 'conpoke',
+ 'conpeek',
+ 'connull',
+ 'conlen',
+ 'conins',
+ 'confind',
+ 'configurationkeystr',
+ 'configurationkeynum',
+ 'condel',
+ 'classstr',
+ 'classnum',
+ 'classidget',
+ 'char2num',
+ 'beep',
+ 'atan',
+ 'asin',
+ 'ascii2ansi',
+ 'any2str',
+ 'any2real',
+ 'any2int64',
+ 'any2int',
+ 'any2guid',
+ 'any2enum',
+ 'any2date',
+ 'ansi2ascii',
+ 'acos',
+ 'abs'
+ ),
+ 4 => array( // X++ SQL stuff
+ 'where',
+ 'update_recordset',
+ 'ttsCommit',
+ 'ttsBegin',
+ 'ttsAbort',
+ 'sum',
+ 'setting',
+ 'select',
+ 'reverse',
+ 'pessimisticLock',
+ 'outer',
+ 'order by',
+ 'optimisticLock',
+ 'notExists',
+ 'noFetch',
+ 'next',
+ 'minof',
+ 'maxof',
+ 'like',
+ 'join',
+ 'insert_recordset',
+ 'index hint',
+ 'index',
+ 'group by',
+ 'from',
+ 'forUpdate',
+ 'forceSelectOrder',
+ 'forcePlaceholders',
+ 'forceNestedLoop',
+ 'forceLiterals',
+ 'flush',
+ 'firstOnly',
+ 'firstFast',
+ 'exists',
+ 'desc',
+ 'delete_from',
+ 'count',
+ 'avg',
+ 'asc'
+ )
+ ),
+ 'SYMBOLS' => array( // X++ symbols
+ '!',
+ '&',
+ '(',
+ ')',
+ '*',
+ '^',
+ '|',
+ '~',
+ '+',
+ ',',
+ '-',
+ '/',
+ ':',
+ '<',
+ '=',
+ '>',
+ '?',
+ '[',
+ ']',
+ '{',
+ '}'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #0000ff;',
+ 4 => 'color: #0000ff;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #007f00;',
+ 'MULTI' => 'color: #007f00; font-style: italic;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #ff0000;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #000000;'
+ ),
+ 'METHODS' => array(
+ 1 => 'color: #000000;',
+ 2 => 'color: #000000;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #00007f;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.',
+ 2 => '::'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?>
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/yaml.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/yaml.php
new file mode 100644
index 00000000..a2974eb5
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/yaml.php
@@ -0,0 +1,150 @@
+<?php
+/*************************************************************************************
+ * yaml.php
+ * --------
+ * Author: Josh Ventura (JoshV10@gmail.com)
+ * Copyright: (c) 2010 Josh Ventura
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/12/14
+ *
+ * YAML language file for GeSHi.
+ *
+ * YAML gets hairy sometimes. If anything needs fixed, drop me an email and
+ * I'll probably spit up on it. This is, in general, not a long format.
+ *
+ * CHANGES
+ * ---------
+ * 2010/12/14
+ * - Started project in rage over GML support but not YAML support. WTFH?
+ * 2010/12/15
+ * - Submitted to Ben.
+ *
+ * TODO (not updated since release)
+ * ----------------------------------
+ * - Field testing and necessary corrections: this grammar file is usable, but not
+ * completely accurate. There are, in fact, multiple cases in which it will mess
+ * up, and some of it may need moved around. It is the most temperamental parser
+ * I have ever associated my name with. Points of interest follow:
+ * * Improvised support for | and >: since PHP offers no variable-width lookbehind,
+ * these blocks will still be highlighted even when commented out. As it happens,
+ * any line ending with | or > could result in the unintentional highlighting of
+ * all remaining lines in the file, just because I couldn't check for this regex
+ * as a lookbehind: '/:(\s+)(!!(\w+)(\s+))?/'
+ * If there is a workaround for that, it needs implemented.
+ * * I may be missing some operators. I deliberately omitted inline array notation
+ * as, in general, it's ugly and tends to conflict with plain-text. Ensuring all
+ * highlighted list delimiters are not plain text would be as simple as checking
+ * that they follow a colon directly. Alas, without variable-length lookbehinds,
+ * if there is a way to do so in GeSHi I am unaware of it.
+ * * I kind of whored the comment regexp array. It seemed like a safe bet, so it's
+ * where I crammed everything. Some of it may need moved elsewhere for neatness.
+ * * The !!typename highlight needs not to interfere with ": |" and ": >": Pairing
+ * key: !!type | value is perfectly legal, but again due to lookbehind issues, I
+ * can't add a case for that. Also, it is likely that multiple spaces can be put
+ * between the colon and pipe symbol, which would also break it.
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'YAML',
+ 'COMMENT_SINGLE' => array(),
+ 'COMMENT_MULTI' => array(),
+ //Keys
+ 'COMMENT_REGEXP' => array( // ENTRY ZERO SHOULD CHECK FOR (\n(\s*)([^#%]+?):(\s+)(!!(\w+)(\s+))?) AS A LOOKBEHIND, BUT IT CAN'T.
+ 0 => '/(?<=\s[\|>]\n)(\s+)(.*)((?=[\n$])(([\n^](\1(.*)|(?=[\n$])))*)|$)/', // Pipe blocks and > blocks.
+ 1 => '/#(.*)/', // Blue # comments
+ 2 => '/%(.*)/', // Red % comments
+ 3 => '/(^|\n)([^#%^\n]+?)(?=: )/', // Key-value names
+ 4 => '/(^|\n)([^#%^\n]+?)(?=:\n)/',// Key-group names
+ 5 => '/(?<=^---)(\s*)!(\S+)/', // Comments after ---
+ 6 => '/(?<=: )(\s*)\&(\S+)/', // References
+ 7 => '/(?<=: )(\s*)\*(\S+)/', // Dereferences
+ 8 => '/!!(\w+)/', // Types
+ //9 => '/(?<=\n)(\s*)-(?!-)/', // List items: This needs to search within comments 3 and 4, but I don't know how.
+ ),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ 1 => array(
+ 'all','any','none', "yes", "no"
+ ),
+ ),
+ 'SYMBOLS' => array(
+ 1 => array('---', '...'),
+ 2 => array(': ', ">\n", "|\n", '<<:', ":\n") // It'd be nice if I could specify that the colon must
+ // follow comment 3 or 4 to be considered, and the > and |
+ // must follow such a colon.
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'font-weight: bold;'
+ ),
+ 'COMMENTS' => array(
+ 0 => 'color: #303050;background-color: #F5F5F5',
+ 1 => 'color: blue;',
+ 2 => 'font-weight: bold; color: red;',
+ 3 => 'color: green;',
+ 4 => 'color: #007F45;',
+ 5 => 'color: #7f7fFF;',
+ 6 => 'color: #FF7000;',
+ 7 => 'color: #FF45C0;',
+ 8 => 'font-weight: bold; color: #005F5F;',
+ //9 => 'font-weight: bold; color: #000000;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ ),
+ 'BRACKETS' => array(
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #CF00CF;'
+ ),
+ 'NUMBERS' => array(
+ // 0 => 'color: #33f;' // Don't highlight numbers, really...
+ ),
+ 'METHODS' => array(
+ 1 => '',
+ 2 => ''
+ ),
+ 'SYMBOLS' => array(
+ 1 => 'color: cyan;',
+ 2 => 'font-weight: bold; color: brown;'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'SCRIPT' => array(
+ 0 => ''
+ )
+ ),
+ 'URLS' => array(1 => ''),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array( ),
+ 'REGEXPS' => array( ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array( ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array( )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/z80.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/z80.php
new file mode 100644
index 00000000..47326bb2
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/z80.php
@@ -0,0 +1,144 @@
+<?php
+/*************************************************************************************
+ * z80.php
+ * -------
+ * Author: Benny Baumann (BenBE@omorphia.de)
+ * Copyright: (c) 2007-2008 Benny Baumann (http://www.omorphia.de/)
+ * Release Version: 1.0.8.11
+ * Date Started: 2007/02/06
+ *
+ * ZiLOG Z80 Assembler language file for GeSHi.
+ * Syntax definition as commonly used with table assembler TASM32
+ * This file will contain some undocumented opcodes.
+ *
+ * CHANGES
+ * -------
+ * 2008/05/23 (1.0.7.22)
+ * - Added description of extra language features (SF#1970248)
+ * 2007/06/03 (1.0.1)
+ * - Fixed two typos in the language file
+ * 2007/02/06 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2007/02/06)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ZiLOG Z80 Assembler',
+ 'COMMENT_SINGLE' => array(1 => ';'),
+ 'COMMENT_MULTI' => array(),
+ 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array("'", '"'),
+ 'ESCAPE_CHAR' => '',
+ 'KEYWORDS' => array(
+ /*CPU*/
+ 1 => array(
+ 'adc','add','and','bit','call','ccf','cp','cpd','cpdr','cpir','cpi',
+ 'cpl','daa','dec','di','djnz','ei','ex','exx','halt','im','in',
+ 'in0','inc','ind','indr','inir','ini','jp','jr','ld','ldd','lddr',
+ 'ldir','ldi','mlt','neg','nop','or','otdm','otdmr','otdr','otim',
+ 'otimr','otir','out','out0','outd','outi','pop','push','res','ret',
+ 'reti','retn','rl','rla','rlc','rlca','rld','rr','rra','rrc','rrca',
+ 'rrd','rst','sbc','scf','set','sla','sl1','sll','slp','sra','srl',
+ 'sub','tst','tstio','xor'
+ ),
+ /*registers*/
+ 2 => array(
+ 'a','b','c','d','e','h','l',
+ 'af','bc','de','hl','ix','iy','sp',
+ 'af\'','ixh','ixl','iyh','iyl'
+ ),
+ /*Directive*/
+ 3 => array(
+ '#define','#endif','#else','#ifdef','#ifndef','#include','#undef',
+ '.db','.dd','.df','.dq','.dt','.dw','.end','.org','equ'
+ ),
+ ),
+ 'SYMBOLS' => array(
+ '[', ']', '(', ')', '?', '+', '-', '*', '/', '%', '$'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #0000ff; font-weight:bold;',
+ 2 => 'color: #0000ff;',
+ 3 => 'color: #46aa03; font-weight:bold;'
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #adadad; font-style: italic;',
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099; font-weight: bold;'
+ ),
+ 'BRACKETS' => array(
+ 0 => 'color: #0000ff;'
+ ),
+ 'STRINGS' => array(
+ 0 => 'color: #7f007f;'
+ ),
+ 'NUMBERS' => array(
+ 0 => 'color: #dd22dd;'
+ ),
+ 'METHODS' => array(
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #008000;'
+ ),
+ 'REGEXPS' => array(
+ 0 => 'color: #22bbff;',
+ 1 => 'color: #22bbff;',
+ 2 => 'color: #993333;'
+ ),
+ 'SCRIPT' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => ''
+ ),
+ 'OOLANG' => false,
+ 'OBJECT_SPLITTERS' => array(
+ ),
+ 'REGEXPS' => array(
+ //Hex numbers
+ 0 => '0[0-9a-fA-F]{1,32}[hH]',
+ //Binary numbers
+ 1 => '\%[01]{1,64}|[01]{1,64}[bB]?(?![^<]*>)',
+ //Labels
+ 2 => '^[_a-zA-Z][_a-zA-Z0-9]?\:'
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ ),
+ 'TAB_WIDTH' => 8
+);
+
+?> \ No newline at end of file
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/zxbasic.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/zxbasic.php
new file mode 100644
index 00000000..b1de472b
--- /dev/null
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/zxbasic.php
@@ -0,0 +1,150 @@
+<?php
+/*************************************************************************************
+ * zxbasic.php
+ * -------------
+ * Author: Jose Rodriguez (a.k.a. Boriel)
+ * Based on Copyright: (c) 2005 Roberto Rossi (http://rsoftware.altervista.org) Freebasic template
+ * Release Version: 1.0.8.11
+ * Date Started: 2010/06/19
+ *
+ * ZXBasic language file for GeSHi.
+ *
+ * More details at http://www.zxbasic.net/
+ *
+ * CHANGES
+ * -------
+ * 2010/06/19 (1.0.0)
+ * - First Release
+ *
+ * TODO (updated 2007/02/06)
+ * -------------------------
+ *
+ *************************************************************************************
+ *
+ * This file is part of GeSHi.
+ *
+ * GeSHi 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.
+ *
+ * GeSHi 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 GeSHi; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ ************************************************************************************/
+
+$language_data = array (
+ 'LANG_NAME' => 'ZXBasic',
+ 'COMMENT_SINGLE' => array(
+ 1 => "'",
+ 2 => '#',
+ 3 => 'REM'
+ ),
+ 'COMMENT_MULTI' => array("/'" => "'/"),
+ 'CASE_KEYWORDS' => GESHI_CAPS_UPPER, //GESHI_CAPS_NO_CHANGE,
+ 'QUOTEMARKS' => array('"'),
+ 'ESCAPE_CHAR' => '\\',
+ 'KEYWORDS' => array(
+ 1 => array(
+ "ASM", "BEEP", "BOLD", "BORDER", "BRIGHT", "ByRef", "ByVal", "CAST",
+ "CIRCLE", "CLS", "CONST", "CONTINUE", "DECLARE", "DIM", "DO",
+ "DRAW", "ELSE", "ELSEIF", "END", "EXIT", "FastCall", "FLASH", "FOR",
+ "FUNCTION", "GOTO", "GOSUB", "GO", "IF", "INK", "INVERSE", "ITALIC",
+ "LET", "LOAD", "LOOP", "NEXT", "OVER", "PAPER", "PAUSE", "PI",
+ "PLOT", "POKE", "PRINT", "RANDOMIZE", "REM", "RETURN", "SAVE",
+ "StdCall", "Sub", "THEN", "TO", "UNTIL", "VERIFY", "WEND", "WHILE",
+ ),
+
+ // types
+ 2 => array(
+ 'byte', 'ubyte', 'integer', 'uinteger', 'long', 'ulong', 'fixed',
+ 'float', 'string'
+ ),
+
+ // Functions
+ 3 => array(
+ "ABS", "ACS", "ASN", "ATN", "CHR", "CODE", "COS", "CSRLIN", "EXP",
+ "HEX", "HEX16", "INKEY", "INT", "LEN", "LN", "PEEK", "POS", "RND",
+ "SCREEN$", "SGN", "SIN", "SQR", "STR", "TAN", "VAL",
+ ),
+
+ // Operators and modifiers
+ 4 => array(
+ "AT", "AS", "AND", "MOD", "NOT", "OR", "SHL", "SHR", "STEP", "XOR"
+ )
+ ),
+ 'SYMBOLS' => array(
+ '(', ')'
+ ),
+ 'CASE_SENSITIVE' => array(
+ GESHI_COMMENTS => false,
+ 1 => false,
+ 2 => false,
+ 3 => false,
+ 4 => false
+ ),
+ 'STYLES' => array(
+ 'KEYWORDS' => array(
+ 1 => 'color: #000080; font-weight: bold;', // Commands
+ 2 => 'color: #800080; font-weight: bold;', // Types
+ 3 => 'color: #006000; font-weight: bold;', // Functions
+ 4 => 'color: #801010; font-weight: bold;' // Operators and Modifiers
+ ),
+ 'COMMENTS' => array(
+ 1 => 'color: #808080; font-style: italic;',
+ 2 => 'color: #339933;',
+ 3 => 'color: #808080; font-style: italic;',
+ 'MULTI' => 'color: #808080; font-style: italic;'
+ ),
+ 'BRACKETS' => array(
+ //0 => 'color: #66cc66;'
+ 0 => 'color: #007676;'
+ ),
+ 'STRINGS' => array(
+ //0 => 'color: #ff0000;'
+ 0 => 'color: #A00000; font-style: italic;'
+ ),
+ 'NUMBERS' => array(
+ //0 => 'color: #cc66cc;'
+ 0 => 'color: #b05103;'// font-weight: bold;'
+ ),
+ 'METHODS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'SYMBOLS' => array(
+ 0 => 'color: #66cc66;'
+ ),
+ 'ESCAPE_CHAR' => array(
+ 0 => 'color: #000099;'
+ ),
+ 'SCRIPT' => array(
+ ),
+ 'REGEXPS' => array(
+ )
+ ),
+ 'URLS' => array(
+ 1 => '',
+ 2 => '',
+ 3 => '',
+ 4 => ''
+ ),
+ 'OOLANG' => true,
+ 'OBJECT_SPLITTERS' => array(
+ 1 => '.'
+ ),
+ 'REGEXPS' => array(
+ ),
+ 'STRICT_MODE_APPLIES' => GESHI_NEVER,
+ 'SCRIPT_DELIMITERS' => array(
+ ),
+ 'HIGHLIGHT_STRICT_BLOCK' => array(
+ )
+);
+
+?> \ No newline at end of file
diff --git a/extensions/TitleBlacklist/TitleBlacklist.hooks.php b/extensions/TitleBlacklist/TitleBlacklist.hooks.php
new file mode 100644
index 00000000..f0e8ce13
--- /dev/null
+++ b/extensions/TitleBlacklist/TitleBlacklist.hooks.php
@@ -0,0 +1,182 @@
+<?php
+/**
+ * Hooks for Title Blacklist
+ * @author Victor Vasiliev
+ * @copyright © 2007-2010 Victor Vasiliev et al
+ * @license GNU General Public License 2.0 or later
+ */
+
+/**
+ * Hooks for the TitleBlacklist class
+ *
+ * @ingroup Extensions
+ */
+class TitleBlacklistHooks {
+
+ /**
+ * getUserPermissionsErrorsExpensive hook
+ *
+ * @param $title Title
+ * @param $user User
+ * @param $action
+ * @param $result
+ * @return bool
+ */
+ public static function userCan( $title, $user, $action, &$result ) {
+ # Some places check createpage, while others check create.
+ # As it stands, upload does createpage, but normalize both
+ # to the same action, to stop future similar bugs.
+ if ( $action === 'createpage' || $action === 'createtalk' ) {
+ $action = 'create';
+ }
+ if ( $action == 'create' || $action == 'edit' || $action == 'upload' ) {
+ $blacklisted = TitleBlacklist::singleton()->userCannot( $title, $user, $action );
+ if ( $blacklisted instanceof TitleBlacklistEntry ) {
+ $result = array( $blacklisted->getErrorMessage( 'edit' ),
+ htmlspecialchars( $blacklisted->getRaw() ),
+ $title->getFullText() );
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * AbortMove hook
+ *
+ * @param $old Title
+ * @param $nt Title
+ * @param $user User
+ * @param $err
+ * @return bool
+ */
+ public static function abortMove( $old, $nt, $user, &$err ) {
+ $titleBlacklist = TitleBlacklist::singleton();
+ $blacklisted = $titleBlacklist->userCannot( $nt, $user, 'move' );
+ if ( !$blacklisted ) {
+ $blacklisted = $titleBlacklist->userCannot( $old, $user, 'edit' );
+ }
+ if ( $blacklisted instanceof TitleBlacklistEntry ) {
+ $err = wfMessage( $blacklisted->getErrorMessage( 'move' ),
+ $blacklisted->getRaw(),
+ $old->getFullText(),
+ $nt->getFullText() )->parse();
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Check whether a user name is acceptable,
+ * and set a message if unacceptable.
+ *
+ * Used by abortNewAccount and centralAuthAutoCreate
+ *
+ * @return bool Acceptable
+ */
+ private static function acceptNewUserName( $userName, $permissionsUser, &$err, $override = true ) {
+ $title = Title::makeTitleSafe( NS_USER, $userName );
+ $blacklisted = TitleBlacklist::singleton()->userCannot( $title, $permissionsUser,
+ 'new-account', $override );
+ if ( $blacklisted instanceof TitleBlacklistEntry ) {
+ $message = $blacklisted->getErrorMessage( 'new-account' );
+ $err = wfMessage( $message, $blacklisted->getRaw(), $userName )->parse();
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * AbortNewAccount hook
+ *
+ * @param User $user
+ */
+ public static function abortNewAccount( $user, &$message ) {
+ global $wgUser, $wgRequest;
+ $override = $wgRequest->getCheck( 'wpIgnoreTitleBlacklist' );
+ return self::acceptNewUserName( $user->getName(), $wgUser, $message, $override );
+ }
+
+ /** CentralAuthAutoCreate hook */
+ public static function centralAuthAutoCreate( $user, $userName ) {
+ $message = ''; # Will be ignored
+ $anon = new User;
+ return self::acceptNewUserName( $userName, $anon, $message );
+ }
+
+ /**
+ * EditFilter hook
+ *
+ * @param $editor EditPage
+ */
+ public static function validateBlacklist( $editor, $text, $section, &$error ) {
+ global $wgUser;
+ $title = $editor->mTitle;
+
+ if ( $title->getNamespace() == NS_MEDIAWIKI && $title->getDBkey() == 'Titleblacklist' ) {
+
+ $blackList = TitleBlacklist::singleton();
+ $bl = $blackList->parseBlacklist( $text, 'page' );
+ $ok = $blackList->validate( $bl );
+ if ( count( $ok ) == 0 ) {
+ return true;
+ }
+
+ $errmsg = wfMessage( 'titleblacklist-invalid' )->numParams( count( $ok ) )->text();
+ $errlines = '* <code>' . implode( "</code>\n* <code>", array_map( 'wfEscapeWikiText', $ok ) ) . '</code>';
+ $error = Html::openElement( 'div', array( 'class' => 'errorbox' ) ) .
+ $errmsg .
+ "\n" .
+ $errlines .
+ Html::closeElement( 'div' ) . "\n" .
+ Html::element( 'br', array( 'clear' => 'all' ) ) . "\n";
+
+ // $error will be displayed by the edit class
+ return true;
+ } elseif ( !$section ) {
+ # Block redirects to nonexistent blacklisted titles
+ $retitle = Title::newFromRedirect( $text );
+ if ( $retitle !== null && !$retitle->exists() ) {
+ $blacklisted = TitleBlacklist::singleton()->userCannot( $retitle, $wgUser, 'create' );
+ if ( $blacklisted instanceof TitleBlacklistEntry ) {
+ $error = Html::openElement( 'div', array( 'class' => 'errorbox' ) ) .
+ wfMessage( 'titleblacklist-forbidden-edit',
+ $blacklisted->getRaw(),
+ $retitle->getFullText() )->escaped() .
+ Html::closeElement( 'div' ) . "\n" .
+ Html::element( 'br', array( 'clear' => 'all' ) ) . "\n";
+ }
+ }
+
+ return true;
+ }
+ return true;
+ }
+
+ /**
+ * ArticleSaveComplete hook
+ *
+ * @param Article $article
+ */
+ public static function clearBlacklist( &$article, &$user,
+ $text, $summary, $isminor, $iswatch, $section )
+ {
+ $title = $article->getTitle();
+ if ( $title->getNamespace() == NS_MEDIAWIKI && $title->getDBkey() == 'Titleblacklist' ) {
+ TitleBlacklist::singleton()->invalidate();
+ }
+ return true;
+ }
+
+ /** UserCreateForm hook based on the one from AntiSpoof extension */
+ public static function addOverrideCheckbox( &$template ) {
+ global $wgRequest, $wgUser;
+
+ if ( TitleBlacklist::userCanOverride( $wgUser, 'new-account' ) ) {
+ $template->addInputItem( 'wpIgnoreTitleBlacklist',
+ $wgRequest->getCheck( 'wpIgnoreTitleBlacklist' ),
+ 'checkbox', 'titleblacklist-override' );
+ }
+ return true;
+ }
+}
diff --git a/extensions/TitleBlacklist/TitleBlacklist.i18n.php b/extensions/TitleBlacklist/TitleBlacklist.i18n.php
new file mode 100644
index 00000000..874a990b
--- /dev/null
+++ b/extensions/TitleBlacklist/TitleBlacklist.i18n.php
@@ -0,0 +1,2454 @@
+<?php
+/**
+ * Internationalisation file for extension TitleBlacklist.
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$messages = array();
+
+$messages['en'] = array(
+ 'titleblacklist-desc' => 'Allows administrators to forbid creation of pages and user accounts per a [[MediaWiki:Titleblacklist|blacklist]] and [[MediaWiki:Titlewhitelist|whitelist]]',
+ 'titleblacklist' => "# This is a title blacklist. Titles and users that match a regular expression here cannot be created.
+# Use \"#\" for comments.
+# This is case insensitive by default",
+ 'titlewhitelist' => "# This is a title whitelist. Use \"#\" for comments.
+# This is case insensitive by default",
+ 'titleblacklist-forbidden-edit' => 'The title "$2" has been banned from creation.
+It matches the following blacklist entry: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" cannot be moved to "$3", because the title "$3" has been banned from creation.
+It matches the following blacklist entry: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'The file name "$2" has been banned from creation.
+It matches the following blacklist entry: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'The user name "$2" has been banned from creation.
+It matches the following blacklist entry: <code>$1</code>',
+ 'titleblacklist-invalid' => 'The following {{PLURAL:$1|line|lines}} in the title blacklist {{PLURAL:$1|is|are}} invalid;
+please correct {{PLURAL:$1|it|them}} before saving:',
+ 'titleblacklist-override' => 'Ignore the blacklist',
+ 'right-tboverride' => 'Override the title or username blacklist',
+ 'right-tboverride-account' => 'Override the username blacklist',
+);
+
+/** Message documentation (Message documentation)
+ * @author Beau
+ * @author Purodha
+ * @author Shirayuki
+ * @author The Evil IP address
+ * @author Umherirrender
+ * @author Yekrats
+ */
+$messages['qqq'] = array(
+ 'titleblacklist-desc' => '{{desc|name=Title Blacklist|url=http://www.mediawiki.org/wiki/Extension:TitleBlacklist}}',
+ 'titleblacklist' => 'The [[mw:Extension:TitleBlacklist|extension Title Blacklist]] gives the ability to block certain unallowed words appearing in the title through regular expressions.
+This will be the first explanatory paragraph of the blacklist. (Characters after the #-signs are ignored.)
+To see an example list in context, see: http://www.mediawiki.org/wiki/MediaWiki:Titleblacklist',
+ 'titlewhitelist' => 'The whitelist is a feature of the [[mw:Extension:TitleBlacklist|extension Title Blacklist]], which gives the ability to block certain words (or explicitly allow them) appearing in the title through regular expressions.
+This will be the explanatory paragraph of the blacklist. (Characters after the #-signs are ignored.)
+To see an example list in context, see: http://www.mediawiki.org/wiki/MediaWiki:Titlewhitelist',
+ 'titleblacklist-forbidden-edit' => '"title" stands for "page title". Parameters:
+* $1 - blacklist entry
+* $2 - page title
+{{Related|Titleblacklist-forbidden}}',
+ 'titleblacklist-forbidden-move' => '"title" stands for "page title". Parameters:
+* $1 - blacklist entry
+* $2 - old page title
+* $3 - new page title
+{{Related|Titleblacklist-forbidden}}',
+ 'titleblacklist-forbidden-upload' => 'Unused at this time. Parameters:
+* $1 - blacklist entry
+* $2 - filename
+{{Related|Titleblacklist-forbidden}}',
+ 'titleblacklist-forbidden-new-account' => 'Parameters:
+* $1 - blacklist entry
+* $2 - username
+{{Related|Titleblacklist-forbidden}}',
+ 'titleblacklist-invalid' => 'Used as error message.
+
+This message is followed by a list of the invalid lines.
+
+Parameters:
+* $1 - number of invalid lines in the title blacklist',
+ 'titleblacklist-override' => "Check box label on \"Create account\" form if the user has the user right ''tboverride-account''. If checked, the [[MediaWiki:Titleblacklist]] is ignored during account creation.",
+ 'right-tboverride' => '{{doc-right|tboverride}}',
+ 'right-tboverride-account' => '{{doc-right|tboverride-account}}',
+);
+
+/** Afrikaans (Afrikaans)
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['af'] = array(
+ 'titleblacklist-override' => 'Ignoreer die swartlys',
+ 'right-tboverride' => 'Ignoreer die titel swartlys', # Fuzzy
+ 'right-tboverride-account' => 'Ignoreer die gebruikersnaam swartlys',
+);
+
+/** Aragonese (aragonés)
+ * @author Juanpabl
+ */
+$messages['an'] = array(
+ 'titleblacklist-desc' => "Premite a os almenistradors de vedar a creyación de pachinas y cuentas d'usuario con aduya d'una [[MediaWiki:Titleblacklist|lista negra]] y una [[MediaWiki:Titlewhitelist|lista blanca]]",
+ 'titleblacklist' => '# Ista ya una lista negra de títols. Os títols que concuerden con una d\'istas expresions regulars no se pueden creyar.
+# Use "#" ta fer comentarios.
+# Por defecto, no fa diferencia entre mayusclas y minusclas',
+ 'titlewhitelist' => '# Ista ye una lista blanca de títols. Faiga servir "#" ta escribir comentarios.
+# Por defecto, no diferencia entre mayusclas y minusclas',
+ 'titleblacklist-forbidden-edit' => 'O títol "$2" ye vedato y no se puede creyar.
+Concuerda con a siguient dentrada d\'a lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" no se puede tresladar ta "$3", porque o títol "$3" ye vedato y no se puede creyar. Concuerda con a siguient dentrada d\'a lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'O nombre de fichero "$2" ye vedato y no se puede creyar. Concuerda con a siguient dentrada d\'a lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'O nombre d\'usuario "$2" ye vedato y no se puede creyar.
+Concuerda con a dentrada <code>$1</code> d\'a lista negra.',
+ 'titleblacklist-invalid' => "{{PLURAL:$1|A siguient linia|As siguients linias}} d'a lista negra de títols {{PLURAL:$1|ye|son}} no son conformes; por favor corricha-{{PLURAL:$1|la|las}} antes d'alzar:",
+ 'titleblacklist-override' => 'Ignorar a lista negra',
+ 'right-tboverride' => 'Ignorar a lista negra de títols', # Fuzzy
+ 'right-tboverride-account' => "Ignorar a lista negra de los nombres d'usuario",
+);
+
+/** Arabic (العربية)
+ * @author Aiman titi
+ * @author Meno25
+ * @author OsamaK
+ */
+$messages['ar'] = array(
+ 'titleblacklist-desc' => 'يسمح للإداريين بمنع إنشاء الصÙحات وحسابات المستخدمين حسب [[MediaWiki:Titleblacklist|قائمة سوداء]] Ùˆ [[MediaWiki:Titlewhitelist|قائمة بيضاء]]',
+ 'titleblacklist' => '# هذه قائمة سوداء للعناوين. العناوين والمستخدمون الذين يطابقون تعبيرا منتظما هنا لا يمكن إنشاؤهم.
+# استخدم "#" للتعليقات.
+# هذه لا تتأثر بحالة الحرو٠اÙتراضيا',
+ 'titlewhitelist' => '# هذه قائمة بيضاء للعناوين. استخدم "#" للتعليقات
+# هذه لا تتأثر بحالة الحرو٠اÙتراضيا',
+ 'titleblacklist-forbidden-edit' => 'العنوان "$2" تم منعه من الإنشاء.
+هو يطابق المدخلة التالية ÙÙŠ القائمة السوداء: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'لا يمكن نقل "$2" إلى "$3"، لأن إنشاء العنوان "$3" ممنوع.
+هو يطابق المدخلة التالية ÙÙŠ القائمة السوداء: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'إنشاء اسم المل٠"$2" ممنوع.
+هو يطابق المدخلة التالية ÙÙŠ القائمة السوداء: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'إنشاء اسم المستخدم "$2" ممنوع.
+هو يطابق مدخلة القائمة السوداء التالية: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1||السطر التالي|السطران التاليان|السطور التالية}} ÙÙŠ قائمة العناوين السوداء {{PLURAL:$1||غير صحيح|غير صحيحان|غير صحيحة}}Ø› من Ùضلك {{PLURAL:$1||صححه|صححهما|صححهم}} قبل الحÙظ:',
+ 'titleblacklist-override' => 'تجاهل القائمة السوداء',
+ 'right-tboverride' => 'تجاوز قائمة العناوين السوداء', # Fuzzy
+ 'right-tboverride-account' => 'تجاوز قائمة اسم المستخدم السوداء.',
+);
+
+/** Egyptian Spoken Arabic (مصرى)
+ * @author Meno25
+ * @author Ramsis II
+ */
+$messages['arz'] = array(
+ 'titleblacklist-desc' => 'بيسمح للاداريين انهم يمنعو انشاء الصÙحات Ùˆ حسابات اليوزرز على حسب [[MediaWiki:Titleblacklist|البلاك ليست]] Ùˆ [[MediaWiki:Titlewhitelist|اللستة المسموحة]]',
+ 'titleblacklist' => '# دى بلاك ليست للعناوين. العناوين واليوزرز اللى بيطابقو نعبير عادى هنا مش ممكن إنشاؤهم.
+# استعمل "#" للتعليقات.
+# ما بتتأثرش بحاله الحروÙ',
+ 'titlewhitelist' => '# دى لستة بالعناوين المسموح بيها. استعمل "#" للتعليقات.
+# ما بتتأثرش بحاله الحروÙ',
+ 'titleblacklist-forbidden-edit' => 'العنوان "$2" ممنوع من الانشاء.
+لانه مطابق لمدخلة ÙÙ‰ البلاك ليست دي: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" ماينÙعش تتنقل لـ "$3", لان العنوان "$3" ممنوع من الانشاء.
+لانه مطابق لمدخلة ÙÙ‰ البلاك ليست دي: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'اسم المل٠"$2" ممنوع من الانشاء.
+لانه مطابق لمدخلة ÙÙ‰ البلاك ليست دي: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'اسم اليوزر "$2" ممنوع من الانشاء.
+لانه مطابق لمدخلة ÙÙ‰ البلاك ليست دي: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|السطر دا|السطور دي}} اللى ÙÙ‰ البلاك ليست بتاعة العناوين مش {{PLURAL:$1|صح|صح}} ;
+لو سمحت تصلح {{PLURAL:$1|ـه|ـهم}} قبل الحÙظ:',
+ 'right-tboverride' => 'اتجاوز البلاك ليست بتاعةالعناوين', # Fuzzy
+);
+
+/** Assamese (অসমীয়া)
+ * @author Bishnu Saikia
+ * @author Gitartha.bordoloi
+ * @author Nilamdyuti
+ */
+$messages['as'] = array(
+ 'titleblacklist-desc' => '[[MediaWiki:Titleblacklist|বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿ]] আৰৠ[[MediaWiki:Titlewhitelist|হোৱাইটলিষà§à¦Ÿ]]ৰ মতে পà§à§°à¦¶à¦¾à¦¸à¦•à¦• পৃষà§à¦ à¦¾ আৰৠসদসà§à¦¯ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿà§° সৃষà§à¦Ÿà¦¿ অৱৰোধৰ অনà§à¦®à¦¤à¦¿ দিয়ে',
+ 'titleblacklist' => '# à¦à¦‡à¦–ন à¦à¦–ন শিৰোনাম বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿà¥¤ ইয়াৰ যিকোনো নিয়মিত à¦à¦•à§à¦¸à¦ªà§à§°à§‡à¦›à¦¨à§° লগত মিলা শিৰোনাম আৰৠসদসà§à¦¯à¦¨à¦¾à¦® সৃষà§à¦Ÿà¦¿ কৰিব নোৱাৰি।
+# মনà§à¦¤à¦¬à§à¦¯à§° বাবে "#" বà§à¦¯à§±à¦¹à¦¾à§° কৰক।
+# ই বৰফলা বা সৰà§à¦«à¦²à¦¾ দà§à¦¯à¦¼à§‹à¦¬à¦¿à¦§ আখৰতে কাম কৰিব।',
+ 'titlewhitelist' => '# à¦à¦‡à¦–ন à¦à¦–ন শিৰোনাম হোৱাইটলিষà§à¦Ÿà¥¤ মনà§à¦¤à¦¬à§à¦¯à§° বাবে "#" বà§à¦¯à§±à¦¹à¦¾à§° কৰিব।
+# ই বৰফলা বা সৰà§à¦«à¦²à¦¾ দà§à¦¯à¦¼à§‹à¦¬à¦¿à¦§ আখৰতে কাম কৰিব।',
+ 'titleblacklist-forbidden-edit' => '"$2" শিৰোনামটো সৃষà§à¦Ÿà¦¿à§° পৰা বাৰণ কৰা হৈছে।
+à¦à¦‡ বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿ ভà§à¦•à§à¦¤à¦¿à§° লগত ইয়াৰ মিল আছে: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" ক "$3" লে সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰিব নোৱাৰি, কাৰণ শীৰà§à¦·à¦• "$3" ক সৃষà§à¦Ÿà¦¿à§° পৰা নিষিদà§à¦§ কৰা হৈছে।
+ই নিমà§à¦¨à¦²à¦¿à¦–িত বà§à¦²à§‡à¦•à¦²à¦¿à¦¸à§à¦Ÿ পà§à§°à§±à¦¿à¦·à§à¦Ÿà¦¿à§° সৈতে মিল খায়: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'নথিপতà§à§° নাম "$2" সৃষà§à¦Ÿà¦¿à§° পৰা নিষিদà§à¦§ কৰা হৈছে।
+ই নিমà§à¦¨à¦²à¦¿à¦–িত বà§à¦²à§‡à¦•à¦²à¦¿à¦¸à§à¦Ÿ পà§à§°à§±à¦¿à¦·à§à¦Ÿà¦¿à§° সৈতে মিল খায়: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€ নাম "$2" ক সৃষà§à¦Ÿà¦¿à§° পৰা নিষিদà§à¦§ কৰা হৈছে।
+ই নিমà§à¦¨à¦²à¦¿à¦–িত বà§à¦²à§‡à¦•à¦²à¦¿à¦¸à§à¦Ÿ পà§à§°à§±à¦¿à¦·à§à¦Ÿà¦¿à§° সৈতে মিল খায়: <code>$1</code>',
+ 'titleblacklist-invalid' => 'শীৰà§à¦·à¦• বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿà¦¤ নিমà§à¦¨à¦²à¦¿à¦–িত {{PLURAL:$1|শাৰী|শাৰীসমূহ}} অবৈধ;
+অনà§à¦—à§à§°à¦¹ কৰি সংৰকà§à¦·à¦£ কৰাৰ আগত {{PLURAL:$1|ইয়াক|à¦à¦‡à¦¬à§‹à§°}} শà§à¦¦à§à¦§ কৰক:',
+ 'titleblacklist-override' => 'বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿ উপেকà§à¦·à¦¾ কৰক',
+ 'right-tboverride' => 'শিৰোনাম বা সদসà§à¦¯à¦¨à¦¾à¦® বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿ অৱজà§à¦žà¦¾ কৰক',
+ 'right-tboverride-account' => 'সদসà§à¦¯à¦¨à¦¾à¦® বà§à¦²à§‡à¦•à¦²à¦¿à¦·à§à¦Ÿ অৱজà§à¦žà¦¾ কৰক',
+);
+
+/** Asturian (asturianu)
+ * @author Esbardu
+ * @author Xuacu
+ */
+$messages['ast'] = array(
+ 'titleblacklist-desc' => "Permite a los alministradores prohibir la creación de páxines y cuentes d'usuariu per aciu d'una [[MediaWiki:Titleblacklist|llista prieta]] y una [[MediaWiki:Titlewhitelist|llista blanca]]",
+ 'titleblacklist' => '# Esta ye una llista prieta de títulos. Los títulos y usuarios que concayen con dalguna d\'estes expresiones regulares nun se puen crear.
+# Usa "#" pa los comentarios.
+# De mou predetermináu nun ye sensible a les mayúscules.',
+ 'titlewhitelist' => '# Esta ye una llista blanca de títulos. Usa "#" pa los comentarios.
+# De mou predetermináu nun ye sensible a les mayúscules.',
+ 'titleblacklist-forbidden-edit' => 'Torgóse la creación del títulu "$2".
+Concueya cola siguiente entrada na llista prieta: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" nun pue ser treslladáu a "$3" porque\'l títulu "$3" ta prohibío crealu.
+Concueya cola siguiente entrada na llista prieta: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Torgóse la creación del nome d\'archivu "$2".
+Concueya cola siguiente entrada na llista prieta: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Torgóse la creación del nome d\'usuariu "$2".
+Concueya cola siguiente entrada na llista prieta: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|La siguiente llinia|Les siguientes llinies}} de la llista prieta de títulos {{PLURAL:$1|nun ye válida|nun son válides}};
+por favor {{PLURAL:$1|corríxila|corríxiles}} enantes de guardar:',
+ 'titleblacklist-override' => 'Inorar la llista prieta',
+ 'right-tboverride' => "Sobrescribir la llista prieta de títulos o nomes d'usuariu",
+ 'right-tboverride-account' => "Saltar la llista prieta d'usuarios",
+);
+
+/** Bashkir (башҡортÑа)
+ * @author Assele
+ */
+$messages['ba'] = array(
+ 'titleblacklist-desc' => 'Хәкимдәргә [[MediaWiki:Titleblacklist|ҡара]] һәм [[MediaWiki:Titlewhitelist|аҡ]] иÑемлек Ñрҙамында биттәрҙе һәм иҫәп Ñҙмаларын булдырыуҙы тыйырға мөмкинлек бирә.',
+ 'titleblacklist' => '# Был — тыйылған иÑемдәр иÑемлеге. Күһәтелгән регулÑÑ€ аңлатмаларға тап килгән биттәр һәм иҫәп Ñҙмалары булдырыла алмай.
+# Иҫкәрмәләр Ó©Ñөн "#" ҡулланығыҙ.
+# Ғәҙәттә ҙур/бәләкәй хәрефкә һиҙгер түгел',
+ 'titlewhitelist' => '# Был —иÑемдәрҙең аҡ иÑемлеге. Иҫкәрмәләр Ó©Ñөн "#" ҡулланығыҙ.
+# Ғәҙәттә ҙур/бәләкәй хәрефкә һиҙгер түгел',
+ 'titleblacklist-forbidden-edit' => '"$2" иÑеме булдырыла алмай.
+Ул түбәндәге ҡара иÑемлек Ñҙмаһы менән тап килә: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" "$3" тип үҙгәртелә алмай, Ñөнки "$3" иÑеме булдырыла алмай.
+Ул түбәндәге ҡара иÑемлек Ñҙмаһы менән тап килә: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '"$2" иÑемле файл булдырыла алмай.
+Ул түбәндәге ҡара иÑемлек Ñҙмаһы менән тап килә: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '"$2" иÑемле ҡатнашыуÑÑ‹ булдырыла алмай.
+Ул түбәндәге ҡара иÑемлек Ñҙмаһы менән тап килә: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Ҡара иÑемлектә түбәндәге {{PLURAL:$1|юл|юлдар}} дөрөҫ түгел;
+зинһар, һаҡлар алдынан {{PLURAL:$1|уны|уларҙы}} төҙәтегеҙ:',
+ 'titleblacklist-override' => 'Ҡара иÑемлекте иғтибарға алмаҫҡа',
+ 'right-tboverride' => 'ИÑемдәр ҡара иÑемлеген иғтибарға алмау', # Fuzzy
+ 'right-tboverride-account' => 'ҠатнашыуÑÑ‹ иÑемдәре ҡара иÑемлеген иғтибарға алмау',
+);
+
+/** Southern Balochi (بلوچی مکرانی)
+ * @author Mostafadaneshvar
+ */
+$messages['bcc'] = array(
+ 'titleblacklist-desc' => 'اجازت دن بند کتن شرکنگ صÙحاتی گون مشخصین عناوین: [[MediaWiki:Titleblacklist]] Ùˆ [[MediaWiki:Titlewhitelist]]', # Fuzzy
+ 'titleblacklist' => '# شی یک عنوان لیست سیاهی انت. عناوینی که هم داب رجکس انت ادان شرکنگ نه بیت.
+# استÙاده Ú©Ù†"#" په نظرات', # Fuzzy
+ 'titlewhitelist' => '#Ø´ÛŒ یک اسپیت لیستی عنوانیء. استÙاده Ú©Ù† Ú†Ù‡ "#" په نظر داتن', # Fuzzy
+ 'titleblacklist-forbidden-edit' => 'عنوان "$2" چه شر بیگ منع بوتت.
+ایی هم داب جهلگی لیست سیاه یک ورودی انت: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'عنوان "$2" نه تونیت په "$3" جاه په جاه بیت، په چی که ایی چه شر بیگ منع بوتت.
+ایی هم داب جهلگی لیست سیاه یک ورودی انت: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Ùایل نام "$2" Ú†Ù‡ شر بیگ منع بوتت.
+ایی هم داب جهلگی لیست سیاه یک ورودی انت: <code>$1</code>',
+ 'right-tboverride' => 'لیست سیاه عنوان لغو کن', # Fuzzy
+);
+
+/** Belarusian (TaraÅ¡kievica orthography) (беларуÑÐºÐ°Ñ (тарашкевіца)‎)
+ * @author EugeneZelenko
+ * @author Jim-by
+ * @author Red Winged Duck
+ * @author Wizardist
+ */
+$messages['be-tarask'] = array(
+ 'titleblacklist-desc' => 'ДазвалÑе адмініÑтратарам забаранÑць ÑтварÑньне Ñтаронак Ñ– рахункаў удзельнікаў з дапамогай [[MediaWiki:Titleblacklist|чорнага]] Ñ– [[MediaWiki:Titlewhitelist|белага]] ÑьпіÑаў',
+ 'titleblacklist' => '# ГÑта ÑÑŒÐ¿Ñ–Ñ Ð·Ð°Ð±Ð°Ñ€Ð¾Ð½ÐµÐ½Ñ‹Ñ… назваў. Старонкі Ñ– рахункі, назвы Ñкіх адпавÑдаюць гÑтым выразам, Ð½Ñ Ð¼Ð¾Ð³ÑƒÑ†ÑŒ быць ÑтвораныÑ.
+# ВыкарыÑтоўвайце «#» Ð´Ð»Ñ ÐºÐ°Ð¼Ñнтараў.
+# РÑгіÑтар ÑымбалÑÑž Ð½Ñ ÑžÐ»Ñ–Ñ‡Ð²Ð°ÐµÑ†Ñ†Ð° па змоўчваньні',
+ 'titlewhitelist' => '# ГÑта ÑÑŒÐ¿Ñ–Ñ Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ñ‹Ñ… назваў. ВыкарыÑтоўвайце «#» Ð´Ð»Ñ ÐºÐ°Ð¼Ñнтараў.
+# РÑгіÑтар ÑымбалÑÑž Ð½Ñ ÑžÐ»Ñ–Ñ‡Ð²Ð°ÐµÑ†Ñ†Ð° па змоўчваньні',
+ 'titleblacklist-forbidden-edit' => 'Ðазва «$2» Ð·Ð°Ð±Ð°Ñ€Ð¾Ð½ÐµÐ½Ð°Ñ Ð´Ð»Ñ ÑтварÑньнÑ.
+Яна адпавÑдае наÑтупнаму ÑлемÑнту чорнага ÑьпіÑу: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Старонка «$2» Ð½Ñ Ð¼Ð¾Ð¶Ð° быць перанеÑÐµÐ½Ð°Ñ Ñž «$3», таму што назва «$3» Ð·Ð°Ð±Ð°Ñ€Ð¾Ð½ÐµÐ½Ð°Ñ Ð´Ð»Ñ ÑтварÑньнÑ.
+Яна адпавÑдае наÑтупнаму ÑлемÑнту чорнага ÑьпіÑу: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Файл з назвай «$2» забаронены Ð´Ð»Ñ ÑтварÑньнÑ.
+Яна адпавÑдае наÑтупнаму ÑлемÑнту чорнага ÑьпіÑу: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° «$2» было забаронена Ð´Ð»Ñ ÑтварÑньнÑ.
+Яно адпавÑдае наÑтупнаму ÑлемÑнту чорнага ÑьпіÑу: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|ÐаÑтупны радок у|ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ñ€Ð°Ð´ÐºÑ– Ñž}} ÑьпіÑе забароненых назваў — {{PLURAL:$1|нÑÑлушны|нÑÑлушныÑ}};
+калі лаÑка, выпраўце {{PLURAL:$1|Ñго|Ñ–Ñ…}} перад захаваньнем:',
+ 'titleblacklist-override' => 'Ігнараваць чорны ÑьпіÑ',
+ 'right-tboverride' => 'Ігнараваньне чорнага ÑьпіÑу назваў Ñ– імёнаў удзельнікаў',
+ 'right-tboverride-account' => 'ігнараваньне чорнага ÑьпіÑу ўдзельнікаў',
+);
+
+/** Bulgarian (българÑки)
+ * @author Borislav
+ * @author DCLXVI
+ * @author Spiritia
+ */
+$messages['bg'] = array(
+ 'titleblacklist-desc' => 'ПозволÑва на админиÑтраторите да забранÑват Ñъздаването на Ñтраници и потребителÑки Ñметки чрез [[MediaWiki:Titleblacklist|черен]] и [[MediaWiki:Titlewhitelist|бÑл ÑпиÑък]].',
+ 'titleblacklist' => '# Страницата Ñъдържа черен ÑпиÑък за Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ñ Ð½Ð° Ñтраници
+# Страници и потребители, чиито имена ÑъответÑтват Ñ Ñ€ÐµÐ³ÑƒÐ»Ñрните изрази в ÑпиÑъка, не могат да бъдат Ñъздавани.
+# За коментари Ñе използва Ñимволът „#“.',
+ 'titlewhitelist' => '# Това е бÑл ÑпиÑък на заглавиÑта. Използвайте "#" за въвеждане на коментари.
+# По подразбиране ÑпиÑъкът е нечувÑтвителен на малки и главни букви',
+ 'titleblacklist-forbidden-edit' => 'Страницата "$2" не може да бъде Ñъздадена, тъй като Ñъвпада ÑÑŠÑ Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ‚ Ñ‡ÐµÑ€Ð½Ð¸Ñ ÑпиÑък: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Страницата "$2" не може да бъде премеÑтена като "$3", тъй като Ñъвпада ÑÑŠÑ Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ‚ Ñ‡ÐµÑ€Ð½Ð¸Ñ ÑпиÑък: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Файлът "$2" не може да бъде качен, тъй като Ñъвпада ÑÑŠÑ Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ‚ Ñ‡ÐµÑ€Ð½Ð¸Ñ ÑпиÑък: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Забранено е Ñъздаването на потребителÑко име „$2“.
+То Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° ÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ‚ Ñ‡ÐµÑ€Ð½Ð¸Ñ ÑпиÑък: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|СледниÑÑ‚ ред|Следните редове}} от Ñ‡ÐµÑ€Ð½Ð¸Ñ ÑпиÑък на заглавиÑта {{PLURAL:$1|е невалиден|Ñа невалидни}} и Ñ‚Ñ€Ñбва да {{PLURAL:$1|бъде коригиран|бъдат коригирани}} преди Ñъхранение:',
+ 'right-tboverride' => 'ПрезапиÑване върху Ñ‡ÐµÑ€Ð½Ð¸Ñ ÑпиÑък на заглавиÑта', # Fuzzy
+);
+
+/** Bengali (বাংলা)
+ * @author Abdullah Harun Jewel
+ * @author Bellayet
+ * @author Nasir8891
+ * @author Zaheen
+ */
+$messages['bn'] = array(
+ 'titleblacklist' => 'à¦à¦Ÿà¦¿ শিরোনামের কাল তালিকা। যেসব পাতার শিরোনাম ও বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° নাম à¦à¦–ানকার রেগà§à¦²à¦¾à¦° à¦à¦•à§à¦¸à¦ªà§à¦°à§‡à¦¶à¦¨à§‡à¦° সাথে মিলে যাবে, সেগà§à¦²à¦¿ তৈরি করা যাবে না।
+# মনà§à¦¤à¦¬à§à¦¯à§‡à¦° জনà§à¦¯ "#" বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤
+# à¦à¦Ÿà¦¿ বড় বা ছোট যেকোন হাতের অকà§à¦·à¦°à§‡ কাজ করে।',
+ 'titlewhitelist' => '# à¦à¦Ÿà¦¿ à¦à¦•à¦Ÿà¦¿ শিরোনাম সাদাতালিকা। মনà§à¦¤à¦¬à§à¦¯à§‡à¦° জনà§à¦¯ "#" বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨à¥¤
+# à¦à¦Ÿà¦¿ বড় বা ছোট যেকোন হাতের অকà§à¦·à¦°à§‡ কাজ করে।',
+ 'titleblacklist-forbidden-edit' => '"$2" শিরোনামটি সৃষà§à¦Ÿà¦¿ করা নিষিদà§à¦§ করা হয়েছে। à¦à¦Ÿà¦¿ কালোতালিকার à¦à¦‡ ভà§à¦•à§à¦¤à¦¿à¦Ÿà¦¿à¦° সাথে মিলে গেছে: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2"-কে "$3"-ঠসরানো যাবে না, কারণ "$3" শিরোনামটি নিষিদà§à¦§à¥¤ শিরোনামটি à¦à¦‡ কালোতালিকা ভà§à¦•à§à¦¤à¦¿à¦Ÿà¦¿à¦° সাথে মিলে গেছে: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '"$2" ফাইলনামটি সৃষà§à¦Ÿà¦¿ নিষিদà§à¦§à¥¤ নামটি à¦à¦‡ কালোতালিকা ভà§à¦•à§à¦¤à¦¿à¦Ÿà¦¿à¦° সাথে মিলে গেছে: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '"$2" নামে বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম তৈরী নিষিদà§à¦§à¥¤
+à¦à¦Ÿà¦¿ কালোতালিকার à¦à¦‡ ভà§à¦•à§à¦¤à¦¿à¦Ÿà¦¿à¦° সাথে মিলে গেছে: <code>$1</code>',
+ 'titleblacklist-invalid' => 'শিরোনাম কালোতালিকার à¦à¦‡ {{PLURAL:$1|টি লাইন|টি লাইন}} অবৈধ; অনà§à¦—à§à¦°à¦¹ করে সংরকà§à¦·à¦£ করার আগে {{PLURAL:$1|à¦à¦Ÿà¦¿|à¦à¦—à§à¦²à¦¿}} সংশোধন করà§à¦¨:',
+ 'titleblacklist-override' => 'কালোতালিকা উপেকà§à¦·à¦¾ করà§à¦¨',
+ 'right-tboverride' => 'শিরোনাম কালোতালিকা উপেকà§à¦·à¦¾ করà§à¦¨', # Fuzzy
+ 'right-tboverride-account' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম কালোতালিকা উপেকà§à¦·à¦¾ করà§à¦¨',
+);
+
+/** Breton (brezhoneg)
+ * @author Fulup
+ * @author Gwendal
+ * @author Gwenn-Ael
+ * @author Y-M D
+ */
+$messages['br'] = array(
+ 'titleblacklist-desc' => "a ro tro d'ar verourien da verzañ krouiñ pajennoù ha kontoù implijerien hervez [[MediaWiki:Titleblacklist|listenn zu]] hag ur [[MediaWiki:Titlewhitelist|listenn wenn]]",
+ 'titleblacklist' => "# Roll du an titloù eo. Ne c'hell ket bezañ krouet an titloù pe implijerien hag a glot gant un dro-lavar rasional.
+# Implijit \"#\" evit an evezhiadennoù.
+# N'eo ket kizigig ar monedoù d'an distruj dre ziouer.",
+ 'titlewhitelist' => '# Roll gwenn an titloù eo. Implijit "#" evit an evezhiadennoù.
+# N\'eo ket kizigig ar monedoù d\'an distruj dre ziouer.',
+ 'titleblacklist-forbidden-edit' => 'Difennet eo krouiñ an anv "$2".
+Er roll du e klot gant ar kasadenn da heul : <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Ne c\'hell ket bezañ fiñvet "$2" davet "$3", peogwir eo bet nac\'het.
+Klotañ a ran gant kasadenn da heul ar roll du : <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Skarzhet eo bet an anv restr "$2".
+Klotañ a ran gant kasadenn da heul ar roll du : <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Skarzhet eo bet an anv implijer "$2".
+Klotañ a ran gant kasadenn da heul ar roll du : <code>$1</code>',
+ 'titleblacklist-invalid' => 'Direizh eo al {{PLURAL:$1|linenn|linennoù}} da-heul a gaver war roll du an titloù;
+reizhit {{PLURAL:$1|anezhi|anezho}} a-raok enrollañ :',
+ 'titleblacklist-override' => 'Ober van eus al listenn zu',
+ 'right-tboverride' => 'Na ober van ouzh roll du an titloù',
+ 'right-tboverride-account' => 'Na ober van ouzh roll du an anvioù implijer',
+);
+
+/** Bosnian (bosanski)
+ * @author CERminator
+ */
+$messages['bs'] = array(
+ 'titleblacklist-desc' => 'Omogućuje administratorima da zabrane pravljenje stranica i korisniÄkih raÄuna putem spiskova [[MediaWiki:Titleblacklist|zabranjenih]] i [[MediaWiki:Titlewhitelist|dopuÅ¡tenih]] naslova',
+ 'titleblacklist' => '# Ovo je spisak zabranjenih naslova. Naslovi i korisnici koji se nalaze na ovom spisku neće moći biti napravljeni.
+# Koristite "#" za komentare.
+# Ovo ne razlikuje velika i mala slova po pretpostavljenom',
+ 'titlewhitelist' => '# Ovo je spisak dopuštenih naslova. Koristite "#" za komentare.
+# Ovo ne razlikuje velika i mala slova po pretpostavljenom',
+ 'titleblacklist-forbidden-edit' => 'Naslov "$2" je zabranjen za pravljenje.
+Nalazi se kao stavka na spisku zabranjenih naslova: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" ne može biti premješten na "$3", jer je naslov "$3" zabranjen za pravljenje.
+Nalazi se kao slijedeća stavka spiska nepoželjnih naslova: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Datoteka sa imenom "$2" je zabranjena za postavljanje.
+Nalazi se kao stavka na spisku zabranjenih naslova: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'KorisniÄko ime "$2" je zabranjeno za pravljenje.
+Ono se nalazi na spisku zabranjenih naslova pod stavkom: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Slijedeći red|Slijedeća $1 reda|Slijedećih $1 redova}} na spisku nepoželjnih naslova {{PLURAL:$1|je nevalidan|su nevalidna|je nevalidno}};
+molimo da {{PLURAL:$1|ga|ih}} ispravite prije spremanja:',
+ 'titleblacklist-override' => 'Zanemari crnu listu',
+ 'right-tboverride' => 'Zaobilaženje spiska zabranjenih naslova', # Fuzzy
+ 'right-tboverride-account' => 'Zaobilaženje spiska zabranjenih korisniÄkih imena',
+);
+
+/** Catalan (català)
+ * @author Aleator
+ * @author El libre
+ * @author Jordi Roqué
+ * @author Pitort
+ * @author SMP
+ * @author Vriullop
+ */
+$messages['ca'] = array(
+ 'titleblacklist-desc' => "Permet als administradors restringir la creació de pàgines i comptes d'usuari mitjançant una [[MediaWiki:Titleblacklist|llista negra]] i una [[MediaWiki:Titlewhitelist|llista blanca]]",
+ 'titleblacklist' => "# Açò és una llista negra de títols. Els títols i els usuaris que compleixin alguna expressió regular (''regex'') d'aquí no podran ser creats.
+# Feu servir \"#\" per als comentaris.
+# Per defecte, no distingeix majúscules de minúscules",
+ 'titlewhitelist' => '# Açò és una llista blanca de títols. Useu "#" pels comentaris.
+# Per defecte, no distingeix majúscules de minúscules',
+ 'titleblacklist-forbidden-edit' => 'El títol «$2» està prohibit i no es pot crear. Concorda amb la següent entrada de la llista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => "No es pot moure «$2» a «$3», perquè el títol «$3» està prohibit. Concorda amb l'entrada de la llista negra següent: <code>$1</code>",
+ 'titleblacklist-forbidden-upload' => "El nom de fitxer «$2» ha estat prohibit i se n'impedeix la creació. Concorda amb la següent línia de la llista negra: <code>$1</code>",
+ 'titleblacklist-forbidden-new-account' => "No es pot crear el nom d'usuari «$2». Coincideix amb la següent entrada de la llista negra: <code>$1</code>",
+ 'titleblacklist-invalid' => '{{PLURAL:$1|La línia següent|Les línies següents}} de la llista negra no {{PLURAL:$1|és vàlida|són vàlides}}; heu de corregir-{{PLURAL:$1|la|les}} abans de guardar:',
+ 'titleblacklist-override' => 'Ignora la llista negra',
+ 'right-tboverride' => "Sobreescriu el títol o el nom d'usuari de la llista negra",
+ 'right-tboverride-account' => "Ignorar la llista negra de noms d'usuari",
+);
+
+/** Sorani Kurdish (کوردی)
+ * @author Calak
+ */
+$messages['ckb'] = array(
+ 'titleblacklist-override' => 'پێرستی ڕەش لەبەر چاو مەگرە',
+);
+
+/** Czech (Äesky)
+ * @author Danny B.
+ * @author Li-sung
+ * @author Matěj Grabovský
+ * @author Mormegil
+ */
+$messages['cs'] = array(
+ 'titleblacklist-desc' => 'Umožňuje správcům zakázat tvorbu stránek a uživatelských úÄtů na základÄ› [[MediaWiki:Titleblacklist|Äerné listiny názvů]] a [[MediaWiki:Titlewhitelist|bílé listiny názvů]]',
+ 'titleblacklist' => '# Toto je Äerná listina názvů. Stránky a uživatelské úÄty, jejichž název odpovídá nÄ›kterému regulárnímu výrazu, nebude možné vytvoÅ™it.
+# Komentáře zaÄínají znakem „#“.
+# Na velikosti písmen nezáleží.',
+ 'titlewhitelist' => '# Toto je bílá listina názvů stránek. Řádky komentářů zaÄínají znakem „#“.
+# Na velikosti písmen nezáleží.',
+ 'titleblacklist-forbidden-edit' => 'Je zakázáno vytvoÅ™it stránku s názvem „$2“. Odpovídá následujícímu záznamu na Äerné listinÄ›: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '„$2“ nelze pÅ™esunout na název „$3“, protože název „$3“ je zakázáno vytvářet. Odpovídá následujícímu záznamu na Äerné listinÄ›: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Soubor s jménem „$2“ je zakázáno vytvářet. Název odpovídá následujícímu záznamu na Äerné listinÄ›: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Není dovoleno zaregistrovat uživatelské jméno „$2“.
+Odpovídá následující položce Äerné listiny: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Na Äerné listinÄ› názvů {{PLURAL:$1|je následující řádka neplatný regulární výraz|jsou následující řádky neplatné regulární výrazy|jsou následující řádky regulární výrazy}} a je nutné {{PLURAL:$1|ji|je|je}} pÅ™ed uložením stránky opravit :',
+ 'titleblacklist-override' => 'Ignorovat Äernou listinu',
+ 'right-tboverride' => 'Překonání zakázaných názvů stránek nebo uživatelských jmen',
+ 'right-tboverride-account' => 'PÅ™ekonání Äerné listiny uživatelských jmen',
+);
+
+/** Welsh (Cymraeg)
+ * @author Lloffiwr
+ */
+$messages['cy'] = array(
+ 'titleblacklist-override' => "Anwybyddu'r rhestr ddu",
+);
+
+/** Danish (dansk)
+ * @author HenrikKbh
+ * @author Hylle
+ * @author Sarrus
+ */
+$messages['da'] = array(
+ 'titleblacklist-desc' => 'Tillader administartorer at forhindre oprettelse af og brugerkonti gennem [[MediaWiki:Titleblacklist|blacklist]] og en [[MediaWiki:Titlewhitelist|whitelist]]',
+ 'titleblacklist' => '# Dette er en titel sortliste. Titler og brugere, der svarer til et regulært udtryk her kan ikke oprettes.
+# Brug "#" for kommentarer.
+# Denne er som standard ufølsom overfor store/små bogstaver',
+ 'titlewhitelist' => '# Dette er en titel hvidliste.
+# Brug "#" for kommentarer.
+# Denne er som standard ufølsom overfor store/små bogstaver',
+ 'titleblacklist-forbidden-edit' => 'Sidenavnet "$2" er blevet beskyttet mod oprettelse<br />
+Det svarer til følgende blacklistpost: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" kan ikke flyttes til "$3", fordi artikelnavnet "$3" er blevet beskyttet mod oprettelse. Det svarer til følgende blacklistpost: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Sidenavnet "$2" kan ikke oprettes<br />
+Det svarer til følgende sortlistepost: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Brugernavnet "$2" kan ikke oprettes<br />
+Det svarer til følgende sortlistepost: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Følgende {{PLURAL:$1|linje|linjer}} i titelsortelisten er {{PLURAL:$1|ugyldig|ugyldige}}; korriger venligst {{PLURAL:$1|den|dem}} før du gemmer:',
+ 'titleblacklist-override' => 'Ignorer sortlisten',
+ 'right-tboverride' => 'Tilsidesæt titel- eller brugernavnsortlisten',
+ 'right-tboverride-account' => 'Tilsidesæt brugernavn sortliste',
+);
+
+/** German (Deutsch)
+ * @author Geitost
+ * @author Giftpflanze
+ * @author Imre
+ * @author Kghbln
+ * @author MF-Warburg
+ * @author Metalhead64
+ * @author Raimond Spekking
+ * @author The Evil IP address
+ */
+$messages['de'] = array(
+ 'titleblacklist-desc' => 'Ermöglicht es Administratoren die Erstellung unerwünschter Seiten- und Benutzernamen zu unterbinden: [[MediaWiki:Titleblacklist]] und [[MediaWiki:Titlewhitelist]]',
+ 'titleblacklist' => '# Dies ist eine Schwarze Liste für Seiten- und Benutzernamen. Sofern auf einen solchen Namen einer der folgenden regulären Ausdrücke zutrifft, kann er nicht erstellt werden.
+# Verwende „#“ für Kommentare.
+# Standardmäßig wird nicht zwischen Groß- und Kleinschreibung unterschieden.',
+ 'titlewhitelist' => '# Dies ist die Ausnahmeliste von der Schwarzen Liste unerwünschter Seiten- und Benutzernamen. Benutze „#“ für Kommentare.
+# Standardmäßig wird nicht zwischen Groß- und Kleinschreibung unterschieden.',
+ 'titleblacklist-forbidden-edit' => "'''Eine Seite mit dem Titel „$2“ kann nicht erstellt werden.'''<br />Der Titel kollidiert mit diesem Sperrbegriff: '''''$1'''''",
+ 'titleblacklist-forbidden-move' => "'''Die Seite „$2“ kann nicht nach „$3“ verschoben werden.'''<br />Der Titel kollidiert mit diesem Sperrbegriff: '''''$1'''''",
+ 'titleblacklist-forbidden-upload' => "'''Eine Datei mit dem Namen „$2“ kann nicht hochgeladen werden.'''<br />Der Titel kollidiert mit diesem Sperrbegriff: '''''$1'''''",
+ 'titleblacklist-forbidden-new-account' => 'Die Registrierung des Benutzernames „$2“ ist nicht erwünscht.
+Folgender Eintrag aus der Liste unerwünschter Benutzernamen führte zur Ablehnung: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Die {{PLURAL:$1|folgende Zeile|folgenden Zeilen}} in der Sperrliste {{PLURAL:$1|ist|sind}} ungültig; bitte korrigiere diese vor dem Speichern:',
+ 'titleblacklist-override' => 'Schwarze Liste ignorieren',
+ 'right-tboverride' => 'Die schwarze Liste unerwünschter Seiten- oder Benutzernamen außer Kraft setzen',
+ 'right-tboverride-account' => 'Die schwarze Liste unerwünschter Benutzernamen außer Kraft setzen',
+);
+
+/** Swiss High German (Schweizer Hochdeutsch)
+ * @author Filzstift
+ * @author Geitost
+ */
+$messages['de-ch'] = array(
+ 'titleblacklist' => '# Dies ist eine Schwarze Liste für Seiten- und Benutzernamen. Wenn auf einen solchen Namen einer der folgenden regulären Ausdrücke zutrifft, kann er nicht erstellt werden.
+# Verwende «#» für Kommentare.
+# Standardgemäss wird nicht zwischen Gross- und Kleinschreibung unterschieden.',
+ 'titlewhitelist' => '# Dies ist die Ausnahmeliste von der Schwarzen Liste unerwünschter Seiten- und Benutzernamen. Benutze «#» für Kommentare.
+# Standardmässig wird nicht zwischen Gross- und Kleinschreibung unterschieden.',
+ 'right-tboverride' => 'Die schwarze Liste unerwünschter Seiten- oder Benutzernamen ausser Kraft setzen',
+ 'right-tboverride-account' => 'Die schwarze Liste unerwünschter Benutzernamen ausser Kraft setzen.',
+);
+
+/** German (formal address) (Deutsch (Sie-Form)‎)
+ * @author Imre
+ * @author Kghbln
+ */
+$messages['de-formal'] = array(
+ 'titleblacklist' => '# Dies ist eine Schwarze Liste für Seiten- und Benutzernamen. Sofern auf einen solchen Namen einer der folgenden regulären Ausdrücke zutrifft, kann er nicht erstellt werden.
+# Verwenden Sie „#“ für Kommentare.
+# Standardmäßig wird nicht zwischen Groß- und Kleinschreibung unterschieden.',
+ 'titlewhitelist' => '# Dies ist die Ausnahmeliste von der Schwarzen Liste unerwünschter Seiten- und Benutzernamen. Benutzen Sie „#“ für Kommentare.
+# Standardmäßig wird nicht zwischen Groß- und Kleinschreibung unterschieden.',
+ 'titleblacklist-invalid' => 'Die {{PLURAL:$1|folgende Zeile|folgenden Zeilen}} in der Sperrliste {{PLURAL:$1|ist|sind}} ungültig; bitte korrigieren Sie diese vor dem Speichern:',
+);
+
+/** Zazaki (Zazaki)
+ * @author Aspar
+ * @author Erdemaslancan
+ */
+$messages['diq'] = array(
+ 'titleblacklist-desc' => 'serkaran re desturê vıraştışê pel u hesabê karberan dano, qey qedexekerdışi re yew [[MediaWiki:Titleblacklist|listeya risiyayan]] u [[MediaWiki:Titlewhitelist|listeya risıpiyan]] dano.',
+ 'titleblacklist' => '# No yew sernameyê qerelisteyo.Tiya dı ifadey timarınana sernamey u karberi nêvırazênê.
+# Qan dê vatışa "#" kar kerê.
+# No farazi herfa qıc u gırdi re nêhesıbneno',
+ 'titlewhitelist' => '# no yew sernameyê listeya risıpiyan o. qey mışorekerdışi "#" bışuxulnê.
+# no farazi herfa qıc u gırdi re hessas niyo',
+ 'titleblacklist-forbidden-edit' => 'vıraştışê sernameyê "$2" i qedexe bı .
+malumatê ey na listeyasiya de zepê ya: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'no "$2", "$3" pel re nêkırışiyeno çunke vıraştışê sernameyê "$3"i qedexe biyo.
+malumatê ey na listeyasiya de zepê ya: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'vıraştışê sernameyê dosyaya"$2"i qedexe bı.
+malumatê ey na listeyasiya de zêpê ya: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'vıraştışê nameyê karberê"$2" i qedexe bı.
+malumatê ey na listeyasiya de zêpê ya: <code>$1</code>',
+ 'titleblacklist-invalid' => 'nê {{PLURAL:$1|satır o ke|satır ê ke}} listeyasiyayi de qedexe yê;
+kerem kerê verqeydkerdışi de raşt kerê:',
+ 'titleblacklist-override' => 'Tenilisti mehesebne',
+ 'right-tboverride' => 'Siya listeya sernuşti nêravêrde ke',
+ 'right-tboverride-account' => 'Tenilisteya naman dê karberan mehesebnê',
+);
+
+/** Lower Sorbian (dolnoserbski)
+ * @author Michawiki
+ */
+$messages['dsb'] = array(
+ 'titleblacklist-desc' => 'Zmóžnja administratoram napóranjeju bokow a wužywarskich kontow pó [[MediaWiki:Titleblacklist|cornej lisćinje]] a [[MediaWiki:Titlewhitelist|běłej lisćinje]] zajźowaś',
+ 'titleblacklist' => '# To jo corna lisćina titelow. Titele a wužywarje, kótarež pśitrjefiju na regularny wuraz, njedaju se napóraś.
+# Wužyj "#" za komentary.
+# Pó standarźe to njeźiwa na wjelikopisanje',
+ 'titlewhitelist' => '# To jo běła lisćina titelow. Wužyj "#" za komentary.
+# Pó standarźe to njeźiwa na wjelikopisanje.',
+ 'titleblacklist-forbidden-edit' => 'Titel "$2" jo pśeśiwo napóranjeju blokěrowany.
+Pśitrjefijo na slědujucy zapisk: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" njedajo se do "$3" pśesunuś, dokulaž titel "$3" pśeśiwo napóranjeju blokěrowany.
+Pśetrjefijo na slědujucy zapisk corneje lisćiny: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Datajowe mě "$2" je so blokěrowało pśeśiwo napóranjeju.
+Pśetrjefijo na slědujucy zapisk corneje lisćiny: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Wužywarske mě "$2" jo se blokěrowało pśeśiwo napóranjeju.
+Pśetrjefijo na slědujucy zapisk corneje lisćiny: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Slědujuca smužka|Slědujucej smužce|slědujuce smužki|Slědujuce smužki}} w cornej lisćinje titelow {{PLURAL:$1|jo njepłaśiwa|stej njepłaśiwej|su njepłaśiwe |su njepłaśiwe}}; pšosym skorigěruj {{PLURAL:$1|ju|jej|je|je}} do składowanja:',
+ 'titleblacklist-override' => 'Carnu lisćinu ignorěrowaś',
+ 'right-tboverride' => 'Płaśiwosć carneje lisćiny nastawkow abo wužywarskich mjenjow wótpóraś',
+ 'right-tboverride-account' => 'Płaśiwosć carneje lisćiny wužywarskich mjenjow wótpóraś',
+);
+
+/** Greek (Ελληνικά)
+ * @author Dead3y3
+ * @author Geraki
+ * @author Glavkos
+ */
+$messages['el'] = array(
+ 'titleblacklist-desc' => 'ΕπιτÏέπει στους διαχειÏιστές να απαγοÏέψουν την δημιουÏγία σελίδων και λογαÏιασμών χÏηστών σÏμφωνα με μία [[MediaWiki:Titleblacklist|μαÏÏη λίστα]] και μία [[MediaWiki:Titlewhitelist|άσπÏη λίστα]]',
+ 'titleblacklist' => '# Αυτή είναι μία μαÏÏη λίστα για τίτλους σελίδων. Τίτλοι και χÏήστες οι οποίοι ταιÏιάζουν με μια regular expression εδώ, δεν μποÏοÏν να δημιουÏγηθοÏν.
+# ΧÏησιμοποιήστε το σÏμβολο «#» για σχόλια.
+# Από Ï€Ïοεπιλογή είναι χωÏίς διάκÏιση πεζών/κεφαλαίων .',
+ 'titlewhitelist' => '# Αυτή είναι μία λευκή λίστα για τίτλους σελίδων. ΧÏησιμοποιήστε το σÏμβολο «#» για σχόλια.
+# Από Ï€Ïοεπιλογή είναι χωÏίς διάκÏιση πεζών/κεφαλαίων .',
+ 'titleblacklist-forbidden-edit' => 'Η δημιουÏγία του τίτλου "$2" έχει φÏαγεί.
+ΤαιÏιάζει στην ακόλουθη εγγÏαφή της μαÏÏης λίστας: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Η σελίδα «$2» δεν μποÏεί να μετακινηθεί στην «$3», επειδή η δημιουÏγία του τίτλου «$3» έχει φÏαγεί.
+ΤαιÏιάζει στην ακόλουθη εγγÏαφή της μαÏÏης λίστας: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Η δημιουÏγία του ονόματος αÏχείου «$2» έχει φÏαγεί.
+ΤαιÏιάζει στην ακόλουθη εγγÏαφή της μαÏÏης λίστας: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Η δημιουÏγία του ονόματος χÏήστη/χÏήστÏιας «$2» έχει φÏαγεί.
+ΤαιÏιάζει στην ακόλουθη εγγÏαφή της μαÏÏης λίστας: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Η ακόλουθη γÏαμμή|Οι ακόλουθες γÏαμμές}} στην μαÏÏη λίστα τίτλων είναι {{PLURAL:$1|άκυÏη|άκυÏες}}· παÏακαλώ διοÏθώστε {{PLURAL:$1|την|τις}} Ï€Ïιν την αποθήκευση:',
+ 'titleblacklist-override' => 'Αγνοήστε τη μαÏÏη λίστα',
+ 'right-tboverride' => 'ΠαÏάκαμψη της μαÏÏης λίστας τίτλων', # Fuzzy
+ 'right-tboverride-account' => 'ΠαÏακάμψετε την μαÏÏη λίστα ονομάτων χÏήστη',
+);
+
+/** Esperanto (Esperanto)
+ * @author Mihxil
+ * @author Yekrats
+ */
+$messages['eo'] = array(
+ 'titleblacklist-desc' => 'Rajtigas la adminstrantojn malpermesi kreadon de paÄoj kaj uzanto-kontoj per [[MediaWiki:Titleblacklist|nigralisto]] kaj [[MediaWiki:Titlewhitelist|blankalisto]]',
+ 'titleblacklist' => '# Jen titola nigralisto. Titoloj kaj uzantoj kiuj kongruas regulan esprimon ĉi tie ne povas esti kreitaj.
+# Uzu "#" por komentoj.
+# Ĉi tio estas usklecodistingiva defaŭlte.',
+ 'titlewhitelist' => '# Ĉi tio estas blanklisto por titoloj. Uzu "#" por komentoj.
+# Ĉi tio estas defaŭlte uskleca maldistingiva.',
+ 'titleblacklist-forbidden-edit' => 'La titolo "$2" estis malpermesita de kreado.
+Äœi similas la jenan nigralistan listeron: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" ne povas esti alinomita al "$3", ĉar la titolo "$3" estis forbarita de kreado.
+Äœi kongruas la jenan nigralistanon: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'La dosiernomo "$2" estis forbarita de kreado.
+Äœi kongruas la jenan nigralistanon: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'La uzanto-nomo "$2" estis forbarita de kreado.
+Äœi kongruas la jenan nigralistano: <code>$1</code>',
+ 'titleblacklist-invalid' => 'La {{PLURAL:$1|jena linio|jenaj linioj}} en la titola nigralisto estas {{PLURAL:$1|malvalida|malvalidaj}};
+bonvolu korekti {{PLURAL:$1|gxi|ilin}} antaÅ­ konservado:',
+ 'titleblacklist-override' => 'Ignori la nigraliston',
+ 'right-tboverride' => 'AnstataÅ­skribi la nigraliston de salutnomoj kaj titloj',
+ 'right-tboverride-account' => 'Transpasi la nigran liston pri uzantoj.',
+);
+
+/** Spanish (español)
+ * @author Armando-Martin
+ * @author Crazymadlover
+ * @author Locos epraix
+ * @author Remember the dot
+ * @author Sanbec
+ */
+$messages['es'] = array(
+ 'titleblacklist-desc' => 'Permite que los administradores prohíban la creación de páginas y cuentas de usuario mediante una [[MediaWiki:Titleblacklist|lista negra]] y una [[MediaWiki:Titlewhitelist|lista blanca]]',
+ 'titleblacklist' => '# Esta es una lista negra de títulos. No se pueden crear títulos o usuarios que coincidan con una de estas expresiones regulares.
+# Use «#» para comentarios.
+# Esta es insensible a las mayúsculas por defecto',
+ 'titlewhitelist' => '# Esta es una lista blanca de títulos. Use «#» para comentarios.
+# Esta es insensible a las mayúsculas por defecto',
+ 'titleblacklist-forbidden-edit' => 'Se ha bloqueado la creación del título «$2».
+Coincide con la siguiente entrada de lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '«$2» no puede ser trasladado a «$3», porque se ha bloqueado la creación del título «$3».
+Coincide con la siguiente entrada de lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Se ha bloqueado el nombre de archivo «$2».
+Coincide con la entrada de lista negra <code>$1</code>.',
+ 'titleblacklist-forbidden-new-account' => 'Se prohibe crear el nombre de usuario «$2».
+Coincide con la siguiente entrada de la lista negra: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|La siguiente línea|Las siguientes líneas}} de la lista negra no {{PLURAL:$1|es válida|son válidas}};
+por favor corríge{{PLURAL:$1|la|las}} antes de grabar:',
+ 'titleblacklist-override' => 'Ignorar la lista negra',
+ 'right-tboverride' => 'Ignorar la lista negra de títulos o de nombres de usuario',
+ 'right-tboverride-account' => 'Ignorar la lista negra de los nombres de usuario',
+);
+
+/** Estonian (eesti)
+ * @author Pikne
+ */
+$messages['et'] = array(
+ 'titleblacklist-desc' => 'Võimaldab administraatoritel vastavalt [[MediaWiki:Titleblacklist|mustale]] ja [[MediaWiki:Titlewhitelist|valgele nimekirjale]] keelata lehekülgede ja kasutajakontode loomise.',
+ 'titleblacklist' => '# See on pealkirjade must nimekiri. Siinsetele regulaaravaldistele vastavaid pealkirju ega kasutajaid ei saa luua.
+# Kommentaariks kasuta märki "#".
+# Vaikimisi on see tõstutundetu',
+ 'titlewhitelist' => '# See pealkiri on valges nimekirjas. Kommentaariks kasuta märki "#".
+# Vaikimisi on see tõstutundetu',
+ 'titleblacklist-forbidden-edit' => 'Lehekülje pealkirjaga "$2" loomine on keelatud.
+See vastab järgnevale musta nimekirja sissekandele: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Lehekülge "$2" ei saa teisaldada pealkirja "$3" alla, sest lehekülgede pealkirjaga "$3" loomine on keelatud.
+See vastab järgnevale musta nimekirja sissekandele: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Pealkirjaga "$2" on keelatud faili üles laadida.
+See vastab järgnevale musta nimekirja sissekandele: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Kasutaja nimega "$2" loomine on keelatud.
+See vastab järgnevale musta nimekirja sissekandele: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Järgnev|Järgnevad}} musta nimekirja {{PLURAL:$1|rida on vigane|read on vigased}}.
+Palun paranda {{PLURAL:$1|see|need}} enne salvestamist:',
+ 'titleblacklist-override' => 'Eira musta nimekirja',
+ 'right-tboverride' => 'Eirata pealkirjade või kasutajanimede musta nimekirja',
+ 'right-tboverride-account' => 'Eirata kasutajanimede musta nimekirja',
+);
+
+/** Persian (Ùارسی)
+ * @author Ebraminio
+ * @author Huji
+ * @author Ladsgroup
+ * @author Reza1615
+ * @author Wayiran
+ * @author ZxxZxxZ
+ */
+$messages['fa'] = array(
+ 'titleblacklist-desc' => 'امکان جلوگیری از ایجاد صÙحه‌هایی با عنوان‌های خاص را می‌دهد: [[MediaWiki:Titleblacklist]] Ùˆ [[MediaWiki:Titlewhitelist]]',
+ 'titleblacklist' => '# این یک Ùهرست سیاه عنوان‌ها است. عنوان‌هایی Ú©Ù‡ با یک عبارت باقاعده در این صÙحه مطابقت کنند را نمی‌توان ایجاد کرد.
+# از «#» برای توضیحات استÙاده کنید.
+# به‌طور پیش‌Ùرض به بزرگ Ùˆ Ú©ÙˆÚ†Ú©ÛŒ حرو٠حساس نیست.',
+ 'titlewhitelist' => '# این یک Ùهرست سÙید برای عنوان‌ها است. از «#» برای اÙزودن توضیحات استÙاده کنید.
+#این Ùهرست به بزرگی Ùˆ Ú©ÙˆÚ†Ú©ÛŒ به طرو پیش‌Ùرض حساس نیست',
+ 'titleblacklist-forbidden-edit' => 'ایجاد عنوان «$2» ممنوع شده‌است. این عنوان با این دستور از Ùهرست سیاه مطابقت می‌کند: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '«$2» را نمی‌توان به «$3» انتقال داد. ایجاد «$3» ممنوع است. چون با این دستور از Ùهرست سیاه مطابقت می‌کند: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'ایجاد نام «$2» برای پرونده‌ها ممنوع است، زیرا با این دستور از Ùهرست سیاه مطابقت می‌کند: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'حساب کاربری «$2» در برابر ایجاد محاÙظت شده‌است.
+این نام کاربری با این قسمت از Ùهرست سیاه مطابقت دارد: <code>$1</code>',
+ 'titleblacklist-invalid' => '
+{{PLURAL:$1|سطر|سطرهای}} زیر در Ùهرست سیاه عنوان‌ها غیرمجاز {{PLURAL:$1|است|هستند}}Ø› لطÙاً {{PLURAL:$1|آن|آن‌ها}} را قبل از ذخیره کردن اصلاح کنید:',
+ 'titleblacklist-override' => 'از Ùهرست سیاه چشم‌پوشی Ú©Ù†',
+ 'right-tboverride' => 'نادیده گرÙتن لیست سیاه عنوان یا نام کاربری',
+ 'right-tboverride-account' => 'لغو Ùهرست سیاه نام کاربری',
+);
+
+/** Finnish (suomi)
+ * @author Agony
+ * @author Cimon Avaro
+ * @author Crt
+ * @author Nike
+ * @author Str4nd
+ * @author Stryn
+ */
+$messages['fi'] = array(
+ 'titleblacklist-desc' => 'Antaa ylläpitäjille mahdollisuuden estää sivujen ja käyttäjätunnusten luonti nimen perusteella: [[MediaWiki:Titleblacklist|estolista]] ja [[MediaWiki:Titlewhitelist|poikkeuslista]].',
+ 'titleblacklist' => '# Tämä on nimien estolista. Sivuja tai käyttäjiä, jotka vastaavat täällä määritettyihin säännöllisiin lausekkeisiin, ei voi luoda.
+# Käytä #-merkkiä kommentointiin.
+# Oletusarvoisesti tämä on riippuvainen kirjainkoosta',
+ 'titlewhitelist' => '# Tämä on nimien poikkeuslista. Käytä #-merkkiä kommentointiin.
+# Oletusarvoisesti tämä on riippuvainen kirjainkoosta',
+ 'titleblacklist-forbidden-edit' => 'Sivun â€$2†luonti on estetty, koska se täsmää seuraavaan osaan estolistassa: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Sivua â€$2†ei voi siirtää nimelle â€$3â€, koska sivun â€$3†luonti on estetty. Se täsmää seuraavaan osaan estolistassa: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Tiedoston â€$2†luonti on estetty, koska se täsmää seuraavaan osaan estolistassa: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Käyttäjätunnuksen â€$2†luonti on estetty.
+Tunnus täsmää seuraavaan estolistan sääntöön: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Seuraava listan rivi ei ole kelvollinen|Seuraavat listan rivit eivät ole kelvollisia}}. Korjaa {{PLURAL:$1|se|ne}} ennen tallentamista.',
+ 'titleblacklist-override' => 'Ohita estolista',
+ 'right-tboverride' => 'Ohittaa sivunimien tai käyttäjänimien estolista',
+ 'right-tboverride-account' => 'Ohittaa käyttäjänimien estolista',
+);
+
+/** French (français)
+ * @author Crochet.david
+ * @author Elfix
+ * @author Gomoko
+ * @author Grondin
+ * @author IAlex
+ * @author Meithal
+ * @author PieRRoMaN
+ * @author Urhixidur
+ * @author Zetud
+ */
+$messages['fr'] = array(
+ 'titleblacklist-desc' => 'Permet aux administrateurs d’interdire la création de pages et de comptes utilisateur en fonction d’une [[MediaWiki:Titleblacklist|liste noire]] et d’une [[MediaWiki:Titlewhitelist|liste blanche]]',
+ 'titleblacklist' => '# Ceci est la liste noire des titres. Les titres et les utilisateurs qui correspondent à une expression rationnelle présente sur cette page ne peuvent pas être créés.
+# Utilisez « # » pour insérer des commentaires.
+# Par défaut, les entrées ne sont pas sensibles à la casse.',
+ 'titlewhitelist' => '# Ceci est la liste blanche des titres. Utilisez « # » pour insérer des commentaires.
+# Les entrées ne sont pas sensibles à la casse par défaut.',
+ 'titleblacklist-forbidden-edit' => 'Le titre « $2 » est interdit à la création.
+Dans la liste noire, il est détecté par l’entrée suivante : <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'La page intitulée « $2 » ne peut être déplacée vers « $3 » parce que cette dernière a été interdite à la création. Dans la liste noire, elle correspond à l’entrée : <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Le fichier intitulé « $2 » est interdit à la création. Dans la liste noire, il correspond à l’entrée : <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Le nom d’utilisateur « $2 » a été banni à la création.
+Il correspond à l’entrée suivante de la liste noire : <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|La ligne suivante|Les lignes suivantes}} dans la liste noire des titres {{PLURAL:$1|est invalide. Veuillez la|sont invalides. Veuillez les}} corriger avant de publier.',
+ 'titleblacklist-override' => 'Ignorer la liste noire',
+ 'right-tboverride' => "Remplacer la liste noire des titres ou des noms d'utilisateur",
+ 'right-tboverride-account' => "Ignorer la liste noire des noms d'utilisateur",
+);
+
+/** Franco-Provençal (arpetan)
+ * @author ChrisPtDe
+ */
+$messages['frp'] = array(
+ 'titleblacklist-desc' => 'Pèrmèt ux administrators de dèfendre la crèacion de pâges et de comptos usanciér d’aprés una [[MediaWiki:Titleblacklist|lista nêre]] et una [[MediaWiki:Titlewhitelist|lista blanche]].',
+ 'titleblacklist' => '# O est la lista nêre des titros. Los titros et los usanciérs que corrèspondont a una èxprèssion racionèla presenta sur ceta pâge pôvont pas étre fêts.
+# Utilisâd « # » por entrebetar des comentèros.
+# Per dèfôt, les entrâs sont pas sensibles a la câssa.',
+ 'titlewhitelist' => '# O est la lista blanche des titros. Utilisâd « # » por entrebetar des comentèros.
+# Per dèfôt, les entrâs sont pas sensibles a la câssa.',
+ 'titleblacklist-forbidden-edit' => 'Lo titro « $2 » at étâ dèfendu a la crèacion.
+Dens la lista nêre, corrèspond a ceta entrâ : <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'La pâge « $2 » pôt pas étre renomâ en « $3 », perce que lo titro « $3 » at étâ dèfendu a la crèacion.
+Dens la lista nêre, corrèspond a ceta entrâ : <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Lo nom de fichiér « $2 » at étâ dèfendu a la crèacion.
+Dens la lista nêre, corrèspond a ceta entrâ : <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Lo nom d’usanciér « $2 » at étâ dèfendu a la crèacion.
+Dens la lista nêre, corrèspond a ceta entrâ : <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Ceta legne|Cetes legnes}} dens la lista nêre des titros {{PLURAL:$1|est envalida|sont envalides}} ;
+{{PLURAL:$1|la|les}} volyéd corregiér devant qu’encartar :',
+ 'titleblacklist-override' => 'Ignorar la lista nêre',
+ 'right-tboverride' => 'Ignorar la lista nêre des titros ou ben des noms d’utilisator',
+ 'right-tboverride-account' => 'Ignorar la lista nêre des noms d’usanciér',
+);
+
+/** Irish (Gaeilge)
+ * @author Alison
+ */
+$messages['ga'] = array(
+ 'titleblacklist-desc' => 'Ceadaionn na riarthóirí coisc a chur faoi leathanaigh agus cuntais nua a chruthú, de réir [[MediaWiki:Titleblacklist|dúliosta teideail]] agus [[MediaWiki:Titlewhitelist|bánliosta teideail]]',
+ 'titleblacklist' => '# Seo é an dúliosta teideail. Ní féidir teideail ná úsáideoirí a chruthú atá meaitseáil slonn rialta anseo.
+# Usáideann "#" mar nótaí tráchta.
+# Tá an cás seo neamhíogair de réir réamhshocraithe',
+ 'titlewhitelist' => '# Seo é an bánliosta teideail. Usáideann "#" mar nótaí tráchta.
+# Tá an cás seo neamhíogair de réir réamhshocraithe',
+ 'titleblacklist-forbidden-edit' => 'Tá toirmeasc ar an teideal "$2 a chruthú.<br />
+Tá sé chomhoiriúna leis an iontráil dúliosta a leanas: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Ní féidir "$2" a athainmnigh go "$3", mar tá an teideal "$3" coiscthe faoi chruthú.
+Tá sé chomhoiriúint leis an iontráil seo a leanas sa dúliosta teideail: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Tá an ainm comhaid "$2" coiscthe faoi chruthú.
+Tá sé chomhoiriúint leis an iontráil seo a leanas sa dúliosta teideail: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Tá an ainm úsáideorá "$2" coiscthe faoi chruthú.
+Tá sé chomhoiriúint leis an iontráil seo a leanas sa dúliosta teideail: <code>$1</code>',
+ 'titleblacklist-invalid' => "Tá {{PLURAL:$1|an|na}} {{PLURAL:$1|líne|líonta}} seo a leanas neamhbhailí sa dúliosta teideail;
+ceartaigh {{PLURAL:$1|é|iad}} roimh shábháil, le d'thoil:",
+ 'right-tboverride' => 'Sáraíocht an dúliosta teideail', # Fuzzy
+);
+
+/** Galician (galego)
+ * @author Alma
+ * @author Toliño
+ * @author Xosé
+ */
+$messages['gl'] = array(
+ 'titleblacklist-desc' => 'Permítelle aos administradores prohibir a creación de páxinas e contas de usuario grazas a unha [[MediaWiki:Titleblacklist|lista negra]] e mais unha [[MediaWiki:Titlewhitelist|lista branca]] de títulos',
+ 'titleblacklist' => '# Esta é unha lista negra de títulos. Non se pode crear ningún título ou usuario que coincida cunha destas expresións regulares.
+# Use "#" para os comentarios.
+# Por defecto, diferencia entre maiúsculas e minúsculas',
+ 'titlewhitelist' => '# Este é un título da lista branca. Use "#" para os comentarios.
+# Por defecto, diferencia entre maiúsculas e minúsculas',
+ 'titleblacklist-forbidden-edit' => 'O título "$2" foi protexido fronte á súa creación. Coincide coa seguinte entrada da lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" non pode ser movido a "$3", porque o título "$3" foi protexido fronte á súa creación. Coincide coa seguinte entrada da lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'O nome do ficheiro "$2" foi protexido fronte á súa creación.
+Coincide coa seguinte entrada da lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'O nome de usuario "$2" foi protexido fronte á súa creación.
+Coincide coa seguinte entrada da lista negra: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|A seguinte liña|As seguintes liñas}} da lista negra {{PLURAL:$1|é inválida|son inválidas}}; por favor {{PLURAL:$1|corríxaa|corríxaas}} antes de gardar:',
+ 'titleblacklist-override' => 'Ignorar a lista negra',
+ 'right-tboverride' => 'Ignorar a lista negra de títulos ou nomes de usuario',
+ 'right-tboverride-account' => 'Ignorar a lista negra de nomes de usuario',
+);
+
+/** Swiss German (Alemannisch)
+ * @author Als-Holder
+ */
+$messages['gsw'] = array(
+ 'titleblacklist-desc' => 'Macht s Ammanne megli, s Aalege vu nit gwinschte Syten- un Benutzernäme z verhindere: [[MediaWiki:Titleblacklist]] un [[MediaWiki:Titlewhitelist]]',
+ 'titleblacklist' => '# Des isch e Schwarzi Lischt. Jede Syten- un Benutzername, wu die Uusdrick druf zueträffe, cha nit aagleit wäre.
+# Täxt hinter ere Raute „#“ wird as Kommentar gsähne.
+# Des isch standardmäßig nit abhängig vum Einzelfall.',
+ 'titlewhitelist' => '# Des isch d Usnahmelischt vu dr Schwarze Lischt vu nit gwinschte Sytenäme. Verwänd „#“ fir Kommentar.
+# Des isch nit abhängig vum Einzelfall',
+ 'titleblacklist-forbidden-edit' => "'''E Syte mit em Titel „$2“ cha nit aagleit wäre.'''<br />Dr Titel kollidiert mit däm gsperrte Usdruck: '''''$1'''''",
+ 'titleblacklist-forbidden-move' => "'''D Syte „$2“ cha nit no „$3“ verschobe wäre.'''<br />Dr Titel kollidiert mit däm gsperrte Usdruck: '''''$1'''''",
+ 'titleblacklist-forbidden-upload' => "'''E Datei mit em Name „$2“ cha nit uffeglade wäre.'''<br />Dr Titel kollidiert mit däm gsperrte Usdruck: '''''$1'''''",
+ 'titleblacklist-forbidden-new-account' => 'D Regischtrierig vum Benutzername „$2“ isch nit gwinscht.
+Dr Name kollidiert mit däm gsperrte Name: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Die {{PLURAL:$1|Zyylete|Zyylete}} in dr Sperrlischt {{PLURAL:$1|isch|sin}} nit giltig; bitte korrigier si vor em Spychere:',
+ 'titleblacklist-override' => 'Schwarzi Lischt ignoriere',
+ 'right-tboverride' => 'Di Schwarz Lischt vu nit gwinschte Syte- oder Benutzernäme usser Chraft setze',
+ 'right-tboverride-account' => 'Di Schwarz Lischt vu nit gwinschte Benutzernäme usser Chraft setze',
+);
+
+/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
+ * @author Ashok modhvadia
+ * @author Sushant savla
+ */
+$messages['gu'] = array(
+ 'titleblacklist-desc' => 'પà«àª°àª¬àª‚ધકોને [[MediaWiki:Titleblacklist|blacklist]] અને [[MediaWiki:Titlewhitelist|whitelist]] અનà«àª¸àª¾àª° નવા પૃષà«àª  કે ખાતા રચનાને પà«àª°àª¤à«àª¬àª‚ધીત કરવાનો અધિકાર આપે છે.',
+ 'titleblacklist' => '# આ શીરà«àª·àª• કાળી યાદી છે. સામાનà«àª¯ àªàª•à«àª¸àª°à«‡àª¶àª¨àª¨à«‡ મળતા શીરà«àª·àª•à«‹ અને સભà«àª¯à«‹ બનાવી ન શાકાય.
+# ટિપà«àªªàª£à«€ માટે "#" વાપરો.
+# આ મૂળ રીતે કેસ ઈનસેનà«àª¸à«€àªŸà«€àªµ છે.',
+ 'titlewhitelist' => '# આ શીઋષà«àª¹àª•à«‹àª¨à«€ ધલવ યાદી છે. ટિપà«àªªàª£à«€àª“ માટે "#" વાપરો.
+# મૂળ ગà«àª£àª§àª°à«àª® તરીકે આ કેસ ઈન સેનà«àª¸à«€àªŸà«€àªµ છે.',
+ 'titleblacklist-forbidden-edit' => 'શીરà«àª·àª• "$2" ની રચના પર પà«àª°àª¤àª¿àª¬àª‚ધ મૂકાયો છે.
+તે નીચેના પà«àª°àª¤àª¿àª¬àª‚ધીત શીરà«àª·àª•àª¨à«‡ મળતà«àª‚ આવે છે: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" ને "$3" પર ખસેડી નહીં શકાય, કેમકે "$3" શીરà«àª·àª• ની રચના કરવા અપà«àª° પà«àª°àª¤àª¿àª¬àª‚ધ મૂકાયો છે.
+તે નીચેની પà«àª°àª¤àª¿àª¬àª‚ધિત શીરà«àª·àª• ને મળતી આવે છે: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'ફાઈલ નામ "$2" ની રચના પર પà«àª°àª¤àª¿àª¬àª‚ધ મૂકાયો છે.
+તે નીચેના પà«àª°àª¤àª¿àª¬àª‚ધીત શીરà«àª·àª•àª¨à«‡ મળતà«àª‚ આવે છે: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'સભà«àª¯ નામ "$2" ની રચના પર પà«àª°àª¤àª¿àª¬àª‚ધ મૂકાયો છે.
+તે નીચેના પà«àª°àª¤àª¿àª¬àª‚ધીત નામને મળતà«àª‚ આવે છે: <code>$1</code>',
+ 'titleblacklist-invalid' => 'નીચેની {{PLURAL:$1|હરોળ|હરોળ}} પà«àª°àª¤àª¿àª¬àª‚ધિત યાદી {{PLURAL:$1|is|are}} અમાનà«àª¯ છે;
+મહેરબાની કરી {{PLURAL:$1|તેને|તેમને}} સાચવો:',
+ 'titleblacklist-override' => 'પà«àª°àª¤àª¿àª¬àª‚ધ સૂચી અવગણો',
+ 'right-tboverride' => 'આ શીરà«àª·àª• કે સભà«àª¯àª¨àª¾àª® પà«àª°àª¤àª¿àª¬àª‚ધ સૂચિની ઉપરવટ જાવ',
+ 'right-tboverride-account' => 'આ સભà«àª¯ નામ પà«àª°àª¤àª¿àª¬àª‚ધ સૂચિની ઉપરવટ જાવ',
+);
+
+/** Hebrew (עברית)
+ * @author Amire80
+ * @author Rotem Liss
+ */
+$messages['he'] = array(
+ 'titleblacklist-desc' => '×פשרות ×œ×ž× ×”×œ×™× ×œ×סור על יצירת ×“×¤×™× ×•×—×©×‘×•× ×•×ª משתמש לפי [[MediaWiki:Titleblacklist|רשימה שחורה]] ו[[MediaWiki:Titlewhitelist|רשימה לבנה]]',
+ 'titleblacklist' => '# זוהי רשימת הכותרות ×”×סורות. ×œ× × ×™×ª×Ÿ ליצור כותרות וחשבונות משתמש שמת××™×ž×™× ×œ×‘×™×˜×•×™ רגולרי המופיע ×›×ן.
+# השתמשו בסימן "#" להערות.
+#רשימה זו ××™× ×” תלויה ברישיות כברירת מחדל.',
+ 'titlewhitelist' => '# זוהי רשימת הכותרות המותרות. השתמשו בסימן "#" להערות.
+#רשימה זו ××™× ×” תלויה ברישיות כברירת מחדל.',
+ 'titleblacklist-forbidden-edit' => 'הכותרת "$2" ×”×™× ×›×•×ª×¨×ª ×סורה ליצירה.
+×”×™× ×ž×ª×ימה לערך ×”×‘× ×‘×¨×©×™×ž×ª הכותרות ×”×סורות: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '×œ× × ×™×ª×Ÿ להעביר ×ת "$2" ×œ×©× "$3", כיוון שהכותרת "$3" ×סורה ליצירה.
+×”×™× ×ž×ª×ימה לערך ×”×‘× ×‘×¨×©×™×ž×” השחורה: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '×©× ×”×§×•×‘×¥ "$2" × ×סר ליצירה.
+×”×•× ×ž×ª××™× ×œ×¢×¨×š ×”×‘× ×‘×¨×©×™×ž×” השחורה: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '×©× ×”×ž×©×ª×ž×© "$2" × ×סר ליצירה.
+×”×•× ×ž×ª××™× ×œ×¢×¨×š ×”×‘× ×‘×¨×©×™×ž×” השחורה: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|השורה הב××”|השורות הב×ות}} ברשימת הכותרות ×”×סורות {{PLURAL:$1|××™× ×” תקינה|××™× × ×ª×§×™× ×™×}};
+×× × ×ª×§× ×• {{PLURAL:$1|×ותה|×ותן}} לפני השמירה:',
+ 'titleblacklist-override' => '×”×ª×¢×œ× ×ž×”×¨×©×™×ž×” השחורה',
+ 'right-tboverride' => 'עקיפת רשימת שמות ×”×ž×©×ª×ž×©×™× ×”×סורי×',
+ 'right-tboverride-account' => 'לעקוף ×ת הרשימה השחורה של שמות המשתמשי×',
+);
+
+/** Hindi (हिनà¥à¤¦à¥€)
+ * @author Ansumang
+ * @author Kaustubh
+ * @author Shyam
+ * @author आलोक
+ */
+$messages['hi'] = array(
+ 'titleblacklist-desc' => 'विशिषà¥à¤  नामपदों: [[MediaWiki:Titleblacklist]] और [[MediaWiki:Titlewhitelist]] के साथ वाले पृषà¥à¤ à¥‹à¤‚ के निरà¥à¤®à¤¾à¤£ अवरोधन में सहायक है', # Fuzzy
+ 'titleblacklist' => '# यह à¤à¤• बà¥à¤²à¥ˆà¤•à¤²à¤¿à¤¸à¥à¤Ÿ नामपद है। नामपद जो बà¥à¤²à¥ˆà¤•à¤²à¤¿à¤¸à¥à¤Ÿ सूची से मेल खाता है, निरà¥à¤®à¤¿à¤¤ नहीं किठजा सकते।
+# टिपणà¥à¤£à¥€ के लिठ"#" का पà¥à¤°à¤¯à¥‹à¤— करें।', # Fuzzy
+ 'titlewhitelist' => '# यह टाईटल वà¥à¤¹à¤¾à¤ˆà¤Ÿà¤²à¤¿à¤¸à¥à¤Ÿ हैं। टिपà¥à¤ªà¤£à¥€à¤¯à¥‹à¤‚ के लिये "#" का इसà¥à¤¤à¥‡à¤®à¤¾à¤² करें।', # Fuzzy
+ 'titleblacklist-forbidden-edit' => 'नामपद "$2" निरà¥à¤®à¤¿à¤¤ करने से पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित है।
+यह निमà¥à¤¨à¤¾à¤‚कित बà¥à¤²à¥ˆà¤•à¤²à¤¿à¤¸à¥à¤Ÿ पà¥à¤°à¤µà¥‡à¤¶à¤¿à¤•à¤¾ से मेल खाता है: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" का नाम बदलकर "$3" नहीं किया जा सकता, कà¥à¤¯à¥‹à¤‚कि "$3" को निरà¥à¤®à¤¾à¤£ करने से पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित किया गया है।
+यह निमà¥à¤¨à¤¾à¤‚कित बà¥à¤²à¥ˆà¤•à¤²à¤¿à¤¸à¥à¤Ÿ पà¥à¤°à¤µà¥‡à¤¶à¤¿à¤•à¤¾ से मेल खाता है: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'संचिका नाम "$2" निरà¥à¤®à¤¿à¤¤ करने से पà¥à¤°à¤¤à¤¿à¤¬à¤‚धित है।
+यह निमà¥à¤¨à¤¾à¤‚कित कालीसूची पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿ से मेल खाता है: <code>$1</code>',
+ 'titleblacklist-invalid' => 'बà¥à¤²à¥ˆà¤•à¤²à¤¿à¤¸à¥à¤Ÿ नामपद में निमà¥à¤¨à¤¾à¤‚कित {{PLURAL:$1|पंकà¥à¤¤à¤¿|पंकà¥à¤¤à¤¿à¤¯à¤¾à¤}} अमानà¥à¤¯ {{PLURAL:$1|है|हैं}};
+कृपया {{PLURAL:$1|इसे|इनà¥à¤¹à¥‡à¤‚}} जमा करने से पहले ठीक करें:',
+ 'titleblacklist-override' => 'बà¥à¤²à¤¾à¤•à¤²à¤¿à¤¸à¥à¤Ÿ उपेकà¥à¤·à¤¾ करें',
+ 'right-tboverride' => 'शीरà¥à¤·à¤• बà¥à¤²à¥…कलिसà¥à¤Ÿ को नजर अंदाज करें', # Fuzzy
+);
+
+/** Croatian (hrvatski)
+ * @author Dalibor Bosits
+ * @author Dnik
+ * @author Ex13
+ * @author SpeedyGonsales
+ */
+$messages['hr'] = array(
+ 'titleblacklist-desc' => 'Omogućava administratorima postavljanje zabrane kreiranja stranica ili raÄuna s [[MediaWiki:Titleblacklist|crnim popisom]] i [[MediaWiki:Titlewhitelist|bijelim popisom]]',
+ 'titleblacklist' => '# Ovo je popis zabranjenih naslova. Naslovi i raÄuni koji se podudaraju s regularnim izrazom ne mogu se kreirati.
+# Koristite "#" za komentare.
+# Ovo je osjetljivo na velika slova',
+ 'titlewhitelist' => "# Ovo je tzv. ''bijela knjiga'' ili ''whitelist'' imena Älanaka. Rabite \"#\" za komentar
+# Ovo je osjetljivo na velika slova",
+ 'titleblacklist-forbidden-edit' => 'Naslov "$2" je zabranjen za kreiranje. Podudara se sa sljedećom stavkom popisa zabranjenih: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" ne može biti premješten na "$3", jer je naslov "$3" zabranjeno kreirati. Podudara se sa sljedećom stavkom popisa zabranjenih: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Ime datoteke "$2" je zabranjeno kreirati. Poklapa se sa stavkom popisa zabranjenih: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'SuradniÄki raÄun "$2" je zabranjen za kreiranje.
+Poklapa se sa sljedećim izrazom iz crnog popisa: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Sljedeći {{PLURAL:$1|redak|redci}} u popisu zabranjenih naslova {{PLURAL:$1|je|su}} nedozvoljeni; molimo ispravite {{PLURAL:$1|ga|ih}} prije spremanja:',
+ 'titleblacklist-override' => 'Zanemari crnu listu',
+ 'right-tboverride' => 'Premošćivanje naslova u crnom popisu', # Fuzzy
+ 'right-tboverride-account' => 'Zaobilaženje popisa zabranjenih suradniÄkih imena',
+);
+
+/** Upper Sorbian (hornjoserbsce)
+ * @author Michawiki
+ */
+$messages['hsb'] = array(
+ 'titleblacklist-desc' => 'Dowola administratoram wutworjenje stronow a wužiwarskich kontow z pomocu [[MediaWiki:Titleblacklist|Äorneje lisćiny]] a [[MediaWiki:Titlewhitelist|běłeje lisćiny]] zakazać',
+ 'titleblacklist' => '# To je Äorna lisćina titulow. Titule a wužiwarjo, kotrež so na regularny wuraz hodźa, njehodźa so wutworić.
+# Wužij "#" za komentary.
+# Po standardźe to na wulkopisanje njedźiwa',
+ 'titlewhitelist' => '# To je běła lisćina titulow. Wužij "#" za komentary.
+# Po standardźe to na wulkopisanje njedźiwa',
+ 'titleblacklist-forbidden-edit' => 'Strona z titulom "$2" njeda so wutworić. WotpowÄ›duje slÄ›dowacemu zapiskej Äorneje lisćiny: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Strona z titulom "$2" njeda so do "$3" přesunyć, dokelž titul "$3" njesmě so wutworjeć.
+Kryje so ze slÄ›dowacym zaspiskom Äorneje lisćiny: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Dataja z mjenom "$2" njesmÄ› so wutworjeć. Kryje so ze slÄ›dowacym zapiskom Äorneje lisćiny: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Wužiwarske mjeno "$2" bu za registrowanje zawrjene.
+WotpowÄ›duje slÄ›dowacemu zapiskej Äorneje lisćiny: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|SlÄ›dowaca linka|SlÄ›dowace linki}} w Äornej lisćinje titulow {{PLURAL:$1|je njepÅ‚aćiwa|su njepÅ‚aćiwe}}; proÅ¡u skoriguj {{PLURAL:$1|ju|je}} pÅ™ed skÅ‚adowanjom:',
+ 'titleblacklist-override' => 'Čornu lisćinu ignorować',
+ 'right-tboverride' => 'PÅ‚aćiwosć Äorneje lisćiny nastawkow abo wužiwarskich mjenow zbÄ›hnyć',
+ 'right-tboverride-account' => 'PÅ‚aćiwosć Äorneje lisćiny wužiwarskich mjenow zbÄ›hnyć',
+);
+
+/** Hungarian (magyar)
+ * @author BáthoryPéter
+ * @author Dani
+ * @author Tgr
+ */
+$messages['hu'] = array(
+ 'titleblacklist-desc' => 'Lehetővé teszi az adminisztrátorok számára, hogy letiltsák adott című lapok vagy nevű felhasználói fiókok készítését a [[MediaWiki:Titleblacklist]] és [[MediaWiki:Titlewhitelist]] alapján',
+ 'titleblacklist' => '# Ez a címek feketelistája. Azon címek, amelyek illeszkednek az itt található reguláris kifejezések valamelyikére, nem hozhatóak létre.
+# Használd a „#†karaktert megjegyzések írásához.
+# A sorok kis- és nagybetűérzékenyek alapértelmezettként',
+ 'titlewhitelist' => '# Ez egy engedélyező lista. A „#†karakterrel írhatsz megjegyzéseket.
+# A sorok kis- és nagybetűérzékenyek alapértelmezettként',
+ 'titleblacklist-forbidden-edit' => '„$2†címmel tilos lapot készíteni, mert illeszkedik a feketelista <code>$1</code> bejegyzésére.',
+ 'titleblacklist-forbidden-move' => '„$2†nem nevezhető át „$3†névre, mert „$3†névvel tilos lapot készíteni. Illeszkedik a következő feketelistás bejegyzéssel: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '„$2†nevű fájlt tilos feltölteni, mert illeszkedik a feketelista <code>$1</code> bejegyzésére.',
+ 'titleblacklist-forbidden-new-account' => 'A(z) „$2†felhasználói név nem hozható létre.
+Illeszkedik a következő feketelistás elemre: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Az alábbi {{PLURAL:$1|sor hibás|sorok hibásak}} a lapcímek feketelistájában; {{PLURAL:$1|javítsd|javítsd őket}} mentés előtt:',
+ 'titleblacklist-override' => 'Feketelista figyelmen kívül hagyása',
+ 'right-tboverride' => 'címek feketelistájának figyelmen kívül hagyása', # Fuzzy
+ 'right-tboverride-account' => 'Felhasználónév-feketelista felülbírálása',
+);
+
+/** Interlingua (interlingua)
+ * @author McDutchie
+ */
+$messages['ia'] = array(
+ 'titleblacklist-desc' => 'Permitte al administratores prohibir le creation de paginas e contos de usator per medio de un [[MediaWiki:Titleblacklist|lista nigre]] e de un [[MediaWiki:Titlewhitelist|lista blanc]]',
+ 'titleblacklist' => '# Isto es un lista nigre de titulos. Le titulos e usatores que corresponde a un
+# expression regular includite hic non pote esser create. Usa "#" pro commentos.
+# Per predefinition, le differentia inter majusculas e minusculas non es significante.',
+ 'titlewhitelist' => '# Isto es un lista blanc de titulos. Usa "#" pro commentos.
+# Per predefinition, le differentia inter majusculas e minusculas non es significante.',
+ 'titleblacklist-forbidden-edit' => 'Le creation del titulo "$2" ha essite prohibite.
+Illo corresponde al sequente entrata del lista nigre: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" non pote esser renominate a "$3", proque le creation del titulo "$3" ha essite prohibite.
+Illo corresponde al sequente entrata del lista nigre: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Le creation del nomine de file "$2" ha essite prohibite.
+Illo corresponde al sequente entrata del lista nigre: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Le creation del nomine de usator "$2" ha essite prohibite.
+Illo corresponde al sequente entrata del lista nigre: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Le sequente {{PLURAL:$1|linea|lineas}} in le lista nigre de titulos es invalide; per favor corrige {{PLURAL:$1|lo|los}} ante de publicar:',
+ 'titleblacklist-override' => 'Ignorar le lista nigre',
+ 'right-tboverride' => 'Ignorar le lista nigre de titulos o nomines de usator',
+ 'right-tboverride-account' => 'Ignorar le lista nigre de nomines de usator',
+);
+
+/** Indonesian (Bahasa Indonesia)
+ * @author IvanLanin
+ * @author Rex
+ */
+$messages['id'] = array(
+ 'titleblacklist-desc' => 'Mengizinkan pencegahan pembuatan halaman dengan judul tertentu: [[MediaWiki:Titleblacklist]] dan [[MediaWiki:Titlewhitelist]]',
+ 'titleblacklist' => '# Ini adalah daftar hitam judul. Judul dan nama pengguna yang berkesamaan dengan suatu regex berikut ini tidak dapat dibuat.
+# Gunakan "#" untuk komentar.
+# Daftar ini secara standar tidak memandang huruf besar-huruf kecil.',
+ 'titlewhitelist' => '# Ini adalah daftar putih judul. Gunakan "#" untuk komentar.
+# Daftar ini secara standar tidak memandang huruf besar-huruf kecil.',
+ 'titleblacklist-forbidden-edit' => 'Judul "$2" telah dicekal untuk dibuat. Judul tersebut cocok dengan entri daftar hitam berikut: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" tak dapat dipindahkan ke "$3" karena judul "$3" telah dicekal untuk dibuat. Judul tersebut cocok dengan entri daftar hitam berikut: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Nama berkas "$2" telah dicekal untuk dibuat. Judul tersebut cocok dengan entri daftar hitam berikut: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Nama pengguna "$2" tidak diperbolehkan.
+Nama ini sama dengan entri daftar hitam berikut: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Baris|Baris-baris}} dalam daftar hitam judul {{PLURAL:$1|berikut|berikut}} tak valid; silakan koreksi {{PLURAL:$1|item|item-item}} tersebut sebelum disimpan:',
+ 'titleblacklist-override' => 'Abaikan daftar hitam',
+ 'right-tboverride' => 'Mengabaikan daftar hitam judul', # Fuzzy
+ 'right-tboverride-account' => 'Mengabaikan daftar hitam nama pengguna',
+);
+
+/** Interlingue (Interlingue)
+ * @author Renan
+ */
+$messages['ie'] = array(
+ 'titleblacklist-desc' => 'Permisse administratores prohibir creation de págines e contos de usatores por un [[MediaWiki:Titleblacklist|liste nigri]] e [[MediaWiki:Titlewhitelist|liste blanc]]',
+ 'titleblacklist' => '#Ti es un titul de liste nigri. Titules e usatores que harmonisa un expression regulari ci ne posse es creat.
+#Usa "#" por comentaries.
+#Ti liste usa majuscules e minuscules per contumacie',
+ 'titlewhitelist' => "#Ti es un titul de liste blanc. Usa ''#'' por comentaries.
+#Ti liste usa majuscules e minuscules per contumacie",
+ 'titleblacklist-forbidden-edit' => "Li titul ''$2'' ha esset bannit de creation.
+It harmonisa in li proxim intrada de liste nigri:<code>$1</code>",
+ 'titleblacklist-forbidden-move' => "''$2'' ne posse esser movet por ''$3'', pro que li titul ''$3'' ha esset bannit de creation.
+It harmonisa li proxim intrada in li liste nigri:<code>$1</code>",
+ 'titleblacklist-forbidden-upload' => "Li nómine de file ''$2'' ha esset bannit de creation.
+It harmonisa li proxim intrada in li liste nigri:<code>$1</code>",
+ 'titleblacklist-forbidden-new-account' => "Li nómine de usator ''$2'' ha esset bannit de creation.
+It harmonisa li proxim intrada in li liste nigri:<code>$1</code>",
+ 'titleblacklist-invalid' => 'Li proxim {{PLURAL:$1|linea|lineas}} in li liste nigri es ínvalid;
+pleser corecte {{PLURAL:$1|it|les}} ante de conservar:',
+);
+
+/** Iloko (Ilokano)
+ * @author Lam-ang
+ */
+$messages['ilo'] = array(
+ 'titleblacklist-desc' => 'Palubosan na dagiti administrador ti agiparit ti agaramid kadagiti panid ken dagiti pakabilangan ti agar-aramat babaen ti [[MediaWiki:Titleblacklist|blacklist]] ken [[MediaWiki:Titlewhitelist|whitelist]]',
+ 'titleblacklist' => '# Daytoy ket titulo a blacklist. Dagiti titulo ken agar-aramat a maipada ti kadawyan a panangisa ditoy ket saan a maaramid.
+# Usaren ti "#" para iti komentario.
+# Daytoy ket kinasigud a sensetibo iti kadakkel ti letra',
+ 'titlewhitelist' => '# Daytoy ket titulo a whitelist. Usaren ti "#" para iti komentario.
+# Daytoy ket kinasigud a sensetibo iti kadakkel ti letra',
+ 'titleblacklist-forbidden-edit' => 'Ti titulo "$2" ket naiparit ti panaka-aramid.
+Naipada ti sumaganad a blacklist a naikabil: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" ket saan a maiyalis idiay "$3", ngamin ket ti titulo "$3" ket naiparit a maaramid.
+Naipada ti sumagana a blacklist a naikabil: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Ti nagan ti papeles "$2" ket naiparit a maaramid.
+Naipada ti sumaganad a blacklist a naikabil: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Ti nagan ti agar-aramat "$2" ket naiparit a maaramid.
+Naipada ti sumaganad a blacklist a naikabil: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Ti sumaganad a {{PLURAL:$1|linia|dagiti linia}} iti titulo ti blacklist {{PLURAL:$1|ket|ket}} imbalido;
+pangngaasi ta pasayaaten {{PLURAL:$1|ida|dagida}} sakbay nga idulin:',
+ 'titleblacklist-override' => 'Saan nga ikaskaso ti blacklist',
+ 'right-tboverride' => 'Ipatuon ti titulo a blacklist', # Fuzzy
+ 'right-tboverride-account' => 'Ipatuon ti nagan ti agar-aramat a blacklist',
+);
+
+/** Icelandic (íslenska)
+ * @author Snævar
+ */
+$messages['is'] = array(
+ 'titleblacklist-desc' => 'Leyfir möppudýrum að banna stofnun síðna og notenda samkvæmt [[MediaWiki:Titleblacklist|blacklist]] og [[MediaWiki:Titlewhitelist|whitelist]]',
+ 'titleblacklist' => '# Þetta er bannlisti fyrir síðutitla. Titlar og notendanöfn sem passa við reglulega segð hér er ekki hægt að búa til.
+# Notaðu "#" fyrir athugasemdir
+# Færslurnar hér eru sjálfvirkt hástafafrjálsar',
+ 'titleblacklist-forbidden-edit' => 'Búið er að banna titilinn "$2" og ekki er hægt að nota hann við stofnun síðna eða notendanafna.
+Hann passar við eftirfarandi færslu í bannlistanum: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Ekki er hægt að færa "$2" á "$3", því búið er að banna titilinn "$3". Ekki er hægt að búa til síður með þessum titli.
+Hann passar við eftirfarandi færslu í bannlistanum: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Búið er að banna skráarnafnið "$2". Ekki er hægt að stofna skrár með þessum titli.
+Hann passar við eftirfarandi færslu í bannlistanum: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Búið er að banna titilinn "$2" og ekki er hægt að nota hann við stofnun notendanafna.
+Hann passar við eftirfarandi færslu í bannlistanum: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Eftirfarandi {{PLURAL:$1|færsla|færslur}} í bannlista yfir síðutitla {{PLURAL:$1|er|eru}} ógildar og leiðrétta þarf {{PLURAL:$1|hana|þær}} áður en síðan er vistuð:',
+ 'titleblacklist-override' => 'Hunsa bannlistann',
+ 'right-tboverride' => 'Hunsa bannlista fyrir síðutitla.', # Fuzzy
+ 'right-tboverride-account' => 'Hunsa bannlista yfir notendanöfn',
+);
+
+/** Italian (italiano)
+ * @author Beta16
+ * @author BrokenArrow
+ * @author Darth Kule
+ * @author Melos
+ */
+$messages['it'] = array(
+ 'titleblacklist-desc' => 'Consente di proibire la creazione di pagine e account utente con i titoli indicati in una [[MediaWiki:Titleblacklist|blacklist]] e una [[MediaWiki:Titlewhitelist|whitelist]]',
+ 'titleblacklist' => '# Lista dei titoli non consentiti.
+# È impedita la creazione delle pagine e degli account il cui nome corrisponde a un\'espressione regolare indicata di seguito.
+# Usare "#" per le righe di commento.
+# Per default la differenza tra maiuscole e minuscole non è significativa',
+ 'titlewhitelist' => '# Questa è una whitelist dei titoli. Usare "#" per le righe di commento
+# Per default la differenza tra maiuscole e minuscole non è significativa',
+ 'titleblacklist-forbidden-edit' => 'La creazione di pagine con titolo "$2" è stata impedita. La voce corrispondente nell\'elenco dei titoli non consentiti è la seguente: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Impossibile spostare la pagina "$2" al titolo "$3" in quanto la creazione di pagine con titolo "$3" è stata impedita. La voce corrispondente nell\'elenco dei titoli non consentiti è la seguente: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'La creazione di file con titolo "$2" è stato impedito. La voce corrispondente nell\'elenco dei titoli non consentiti è la seguente: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'La creazione di utenti con nome "$2" è stata impedita. La voce corrispondente nell\'elenco dei nomi non consentiti è la seguente: <code>$1</code>',
+ 'titleblacklist-invalid' => "{{PLURAL:$1|La seguente riga|Le seguenti righe}} dell'elenco dei titoli non consentiti {{PLURAL:$1|non è valida|non sono valide}}; si prega di correggere {{PLURAL:$1|l'errore|gli errori}} prima di salvare la pagina.",
+ 'titleblacklist-override' => 'Ignora la blacklist',
+ 'right-tboverride' => 'Ignora la blacklist dei titoli o dei nome utente',
+ 'right-tboverride-account' => 'Ignora la blacklist dei nome utente',
+);
+
+/** Japanese (日本語)
+ * @author Aotake
+ * @author Fryed-peach
+ * @author Hosiryuhosi
+ * @author JtFuruhata
+ * @author Marine-Blue
+ * @author Muttley
+ * @author Shirayuki
+ * @author é’å­å®ˆæ­Œ
+ */
+$messages['ja'] = array(
+ 'titleblacklist-desc' => '管ç†è€…ãŒ[[MediaWiki:Titleblacklist|ブラックリスト]] ãŠã‚ˆã³ [[MediaWiki:Titlewhitelist|ホワイトリスト]]を使ã£ã¦ãƒšãƒ¼ã‚¸ãŠã‚ˆã³åˆ©ç”¨è€…アカウントã®æ–°è¦ä½œæˆã‚’ç¦æ­¢ã§ãるよã†ã«ã™ã‚‹',
+ 'titleblacklist' => '# ã“ã‚Œã¯ã€ãƒšãƒ¼ã‚¸åã®ãƒ–ラックリストã§ã™ã€‚æ­£è¦è¡¨ç¾ã«ä¸€è‡´ã™ã‚‹ãƒšãƒ¼ã‚¸åãŠã‚ˆã³åˆ©ç”¨è€…アカウントã®æ–°è¦ä½œæˆã‚’ç¦æ­¢ã—ã¾ã™ã€‚
+# 「#ã€ä»¥é™ã¯ã‚³ãƒ¡ãƒ³ãƒˆã§ã™ã€‚
+# 既定ã§ã¯å¤§æ–‡å­—ã¨å°æ–‡å­—を区別ã—ã¾ã›ã‚“',
+ 'titlewhitelist' => '# ã“ã‚Œã¯ã€ãƒšãƒ¼ã‚¸åã®ãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆã§ã™ã€‚「#ã€ä»¥é™ã¯ã‚³ãƒ¡ãƒ³ãƒˆã§ã™ã€‚
+# 既定ã§ã¯å¤§æ–‡å­—ã¨å°æ–‡å­—を区別ã—ã¾ã›ã‚“',
+ 'titleblacklist-forbidden-edit' => '「$2ã€ã¨ã„ã†åå‰ã®ãƒšãƒ¼ã‚¸ã®ä½œæˆã¯ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ã€‚
+ã“ã‚Œã¯ä»¥ä¸‹ã®ãƒ–ラックリスト項目ã«ä¸€è‡´ã—ã¾ã™: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '「$3ã€ã¨ã„ã†åå‰ã®ãƒšãƒ¼ã‚¸ã®ä½œæˆãŒç¦æ­¢ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ã€Œ$2ã€ã‚’「$3ã€ã«ç§»å‹•ã§ãã¾ã›ã‚“。
+ã“ã‚Œã¯ä»¥ä¸‹ã®ãƒ–ラックリスト項目ã«ä¸€è‡´ã—ã¾ã™: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '「$2ã€ã¨ã„ã†åå‰ã§ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¢ãƒƒãƒ—ロードã¯ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ã€‚
+ã“ã‚Œã¯ä»¥ä¸‹ã®ãƒ–ラックリスト項目ã«ä¸€è‡´ã—ã¾ã™: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '「$2ã€ã¨ã„ã†åå‰ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ä½œæˆã¯ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™ã€‚
+ã“ã‚Œã¯ä»¥ä¸‹ã®ãƒ–ラックリスト項目ã¨ä¸€è‡´ã—ã¾ã™: <code>$1</code>',
+ 'titleblacklist-invalid' => 'タイトルブラックリスト中ã®ä»¥ä¸‹ã®{{PLURAL:$1|è¡Œ}}ã¯æ­£ã—ã記述ã§ãã¦{{PLURAL:$1|ã„ã¾ã›ã‚“}}。ä¿å­˜ã™ã‚‹å‰ã«{{PLURAL:$1|修正ã—ã¦}}ãã ã•ã„:',
+ 'titleblacklist-override' => 'ブラックリストを無視',
+ 'right-tboverride' => 'ページå/利用者åã®ãƒ–ラックリストã«ã‚ˆã‚‹åˆ¶é™ã‚’å—ã‘ãªã„',
+ 'right-tboverride-account' => '利用者åブラックリストを無視',
+);
+
+/** Jutish (jysk)
+ * @author Huslåke
+ * @author Ælsån
+ */
+$messages['jut'] = array(
+ 'titleblacklist-desc' => 'Kan til førbæd skeppenge der pæger ve spæsifiærn titler: [[MediaWiki:Titleblacklist]] og [[MediaWiki:Titlewhitelist]]', # Fuzzy
+ 'titleblacklist' => '# Dett\'er en titel blackliste. Titler dette match en regex her ken ekke være skeppen.
+# Brug "#" før bemærkenge.', # Fuzzy
+ 'titlewhitelist' => '# Dett\'er en titel whiteliste. Brug "#" før bemærkenge', # Fuzzy
+);
+
+/** Javanese (Basa Jawa)
+ * @author Meursault2004
+ * @author NoiX180
+ * @author Pras
+ */
+$messages['jv'] = array(
+ 'titleblacklist-desc' => 'Marengaké pangurus menggak wong nggawé kaca lan akun miturut [[MediaWiki:Titleblacklist|daftar-ireng]] lan [[MediaWiki:Titlewhitelist|daftar-putih]]',
+ 'titleblacklist' => '# Iki dhaptar-ireng irah-irahan. Irah-irahan lan panganggo sing cocog karo sawijining regex ing kéné ora bisa digawé.
+# Anggonen "#" kanggo komentar.
+# Dhaptar iki sacara baku ora mbédakaké aksara gedhé-cilik.',
+ 'titlewhitelist' => '# Dhaptar iki arupa dhaptar-putih irah-irahan. Anggonen "#" kanggo komentar.
+# Dhaptar iki sacara baku ora mbédakaké aksara gedhé-cilik.',
+ 'titleblacklist-forbidden-edit' => 'Irah-irahan "$2" dilarang digawé.
+Irah-irahan iki cocog karo èntri daftar ireng iki: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" ora bisa dipindhahaké menyang "$3", amerga irah-irahan iki "$3" dilarang ora olèh digawé.
+Irah-irahan iki soalé cocog karo èntri daftar ireng iki: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Jeneng berkas "$2" wis dilarang kanggo digawé.
+Irah-irahan iku cocog karo èntri daftar ireng iki: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Jeneng panganggo "$2" wis dipenggak.
+Iki cocog karo jeneng ing dhaptar-ireng: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Baris|Baris-baris}} ing daftar ireng irah-irahan (judhul) {{PLURAL:$1|ing ngisor|ing ngisor}} iki ora absah; mangga dikorèksi {{PLURAL:$1|item|item-item}} iku sadurungé disimpen:',
+ 'titleblacklist-override' => 'Bènaké daptar ireng',
+ 'right-tboverride' => "''Override'' daftar ireng judhul", # Fuzzy
+ 'right-tboverride-account' => 'Benaké daptar ireng jeneng panganggo',
+);
+
+/** Georgian (ქáƒáƒ áƒ—ული)
+ * @author BRUTE
+ * @author David1010
+ * @author Dawid Deutschland
+ * @author გიáƒáƒ áƒ’იმელáƒ
+ */
+$messages['ka'] = array(
+ 'titleblacklist-desc' => 'áƒáƒ«áƒšáƒ”ვს áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ”ბს უფლებáƒáƒ¡ შექმნáƒáƒœ áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბი დრგვერდები [[MediaWiki:Titleblacklist|შáƒáƒ•áƒ˜]] დრ[[MediaWiki:Titlewhitelist|თეთრი]] სიების მეშვეáƒáƒ‘ით.',
+ 'titleblacklist' => '# ეს áƒáƒ áƒ˜áƒ¡ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒš სáƒáƒ®áƒ”ლთრსიáƒ. გვერდები დრáƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბი, რáƒáƒ›áƒšáƒ”ბიც ემთხვევრრეგულáƒáƒ áƒ£áƒš სáƒáƒ®áƒ”ლწáƒáƒ“ებებს ვერ შეიქმნებáƒ.
+# გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ „#“ სიმბáƒáƒšáƒ კáƒáƒ›áƒ”ნტáƒáƒ áƒ”ბისáƒáƒ—ვის
+# áƒáƒ  áƒáƒ áƒ˜áƒ¡ გრძნáƒáƒ‘áƒáƒ“ბრრეგისტრისáƒáƒ“მი',
+ 'titlewhitelist' => '# ეს áƒáƒ áƒ˜áƒ¡ სáƒáƒ®áƒ”ლწáƒáƒ“ებáƒáƒ—რ«თეთრი სიáƒÂ». კáƒáƒ›áƒ”ნტáƒáƒ áƒ”ბისთვის გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ «#»
+# áƒáƒ  áƒáƒ áƒ˜áƒ¡ გრძნáƒáƒ‘áƒáƒ“ბრრეგისტრისáƒáƒ“მი',
+ 'titleblacklist-forbidden-edit' => 'სáƒáƒ—áƒáƒ£áƒ áƒ˜ "$2" დáƒáƒ‘ლáƒáƒ™áƒ˜áƒšáƒ˜. áƒáƒ› სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ— გვერდის შექმნრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ
+იგი მსგáƒáƒ•áƒ¡áƒ˜áƒ შáƒáƒ•áƒ˜ სიიდáƒáƒœ შემდეგ ჩáƒáƒœáƒáƒ¬áƒ”რს: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'შეუძლებელირგვერდ «$2»-ის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრ«$3»-áƒáƒ“, რáƒáƒ“გáƒáƒœáƒáƒª ეს სáƒáƒ—áƒáƒ£áƒ áƒ˜ იმყáƒáƒ¤áƒ”ბრშáƒáƒ• სიáƒáƒ¨áƒ˜: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => "'''ფáƒáƒ˜áƒšáƒ˜ სáƒáƒ®áƒ”ლით \"\$2\" áƒáƒ  შეიძლებრიყáƒáƒ¡ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული''' <br />
+იგი ექვემდებáƒáƒ áƒ”ბრშემდეგ ჩáƒáƒœáƒáƒ¬áƒ”რს შáƒáƒ• სიáƒáƒ¨áƒ˜: '''''\$1'''''",
+ 'titleblacklist-forbidden-new-account' => 'áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ სიტყვრ«$2»-ის გáƒáƒ›áƒáƒ§áƒ”ნებრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლáƒáƒ“.
+ეს სáƒáƒ®áƒ”ლი ექვემდებáƒáƒ áƒ”ბრშემდეგ ჩáƒáƒœáƒáƒ¬áƒ”რს შáƒáƒ•áƒ˜ სიიდáƒáƒœ: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|შემდეგი ხáƒáƒ–იа|შემდეგი ხáƒáƒ–ები}} áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒš სáƒáƒ®áƒ”ლთრსიáƒáƒ¨áƒ˜ {{PLURAL:$1|áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ—ქმáƒ|áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ—ქმები}}. გთხáƒáƒ•áƒ— შეáƒáƒ¡áƒ¬áƒáƒ áƒáƒ— {{PLURAL:$1|ის|ისინი}} შენáƒáƒ®áƒ•áƒáƒ›áƒ“ე:',
+ 'titleblacklist-override' => 'შáƒáƒ•áƒ˜ სიის იგნáƒáƒ áƒ˜áƒ áƒ”ბáƒ',
+ 'right-tboverride' => 'შáƒáƒ•áƒ˜ სიის გვერდების áƒáƒœ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების სáƒáƒ®áƒ”ლების იგნáƒáƒ áƒ˜áƒ áƒ”ბáƒ',
+ 'right-tboverride-account' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრსáƒáƒ®áƒ”ლების შáƒáƒ•áƒ˜ სიის იგნáƒáƒ áƒ˜áƒ áƒ”ბáƒ',
+);
+
+/** Kazakh (Arabic script) (قازاقشا (تٴوتە)â€)
+ */
+$messages['kk-arab'] = array(
+ 'titleblacklist' => '# بۇل اتاۋلاردىڭ قارا ٴتىزىمى. جۇيەلى ايتىلىمدارعا (regex) سايكەس مىنداعى اتاۋلار جاراتىلمايدى.
+ماندەمەلەر ٴۇشىن «#» نىشانىن قولدانىڭىز.', # Fuzzy
+ 'titlewhitelist' => '# بۇل اتاۋلاردىڭ اق ٴتىزىمى. ماندەمەلەر ٴۇشىن «#» نىشانىن قولدانىڭىز', # Fuzzy
+ 'titleblacklist-forbidden-edit' => '«$2» دەگەن اتاۋ جاراتۋى قۇلىپتالعان. بۇل قارا ٴتىزىمنىڭ جازباسىنا سايكەس: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '«$2» دەگەن «$3» دەگەنگە جىلجىتىلمايدى, سەبەبى «$3» دەگەن اتاۋ جاراتۋى قۇلىپتالعان. بۇل قارا ٴتىزىمنىڭ جازباسىنا سايكەس: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '«$2» دەگەن Ùايل اتى جاراتۋى قۇلىپتالعان. بۇل قارا ٴتىزىمنىڭ جازباسىنا سايكەس: <code>$1</code>',
+ 'titleblacklist-invalid' => 'اتاۋلاردىڭ قارا تىزىمىندەگى كەلەسى {{PLURAL:$1|جول|جولدار}} {{PLURAL:$1||}} جارامسىز; ساقتاۋ الدىندا {{PLURAL:$1|بۇنى|بۇلاردى}} دۇرىستاپ شىعىڭىز:',
+);
+
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author AlefZet
+ */
+$messages['kk-cyrl'] = array(
+ 'titleblacklist' => '# Бұл атаулардың қара тізімі. Жүйелі айтылымдарға (regex) ÑÓ™Ð¹ÐºÐµÑ Ð¼Ñ‹Ð½Ð´Ð°Ò“Ñ‹ атаулар жаратылмайды.
+Мәндемелер үшін «#» нышанын қолданыңыз.', # Fuzzy
+ 'titlewhitelist' => '# Бұл атаулардың ақ тізімі. Мәндемелер үшін «#» нышанын қолданыңыз', # Fuzzy
+ 'titleblacklist-forbidden-edit' => '«$2» деген атау жаратуы құлыпталған. Бұл қара тізімнің жазбаÑына ÑәйкеÑ: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '«$2» деген «$3» дегенге жылжытылмайды, Ñебебі «$3» деген атау жаратуы құлыпталған. Бұл қара тізімнің жазбаÑына ÑәйкеÑ: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '«$2» деген файл аты жаратуы құлыпталған. Бұл қара тізімнің жазбаÑына ÑәйкеÑ: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Ðтаулардың қара тізіміндегі келеÑÑ– {{PLURAL:$1|жол|жолдар}} {{PLURAL:$1||}} жарамÑыз; Ñақтау алдында {{PLURAL:$1|бұны|бұларды}} дұрыÑтап шығыңыз:',
+);
+
+/** Kazakh (Latin script) (qazaqşa (latın)‎)
+ */
+$messages['kk-latn'] = array(
+ 'titleblacklist' => '# Bul atawlardıñ qara tizimi. Jüýeli aýtılımdarğa (regex) säýkes mındağı atawlar jaratılmaýdı.
+Mändemeler üşin «#» nışanın qoldanıñız.', # Fuzzy
+ 'titlewhitelist' => '# Bul atawlardıñ aq tizimi. Mändemeler üşin «#» nışanın qoldanıñız', # Fuzzy
+ 'titleblacklist-forbidden-edit' => '«$2» degen ataw jaratwı qulıptalğan. Bul qara tizimniñ jazbasına säýkes: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '«$2» degen «$3» degenge jıljıtılmaýdı, sebebi «$3» degen ataw jaratwı qulıptalğan. Bul qara tizimniñ jazbasına säýkes: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '«$2» degen faýl atı jaratwı qulıptalğan. Bul qara tizimniñ jazbasına säýkes: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Atawlardıñ qara tizimindegi kelesi {{PLURAL:$1|jol|joldar}} {{PLURAL:$1||}} jaramsız; saqtaw aldında {{PLURAL:$1|bunı|bulardı}} durıstap şığıñız:',
+);
+
+/** Korean (한국어)
+ * @author Klutzy
+ * @author Kwj2772
+ * @author ToePeu
+ * @author ì•„ë¼
+ */
+$messages['ko'] = array(
+ 'titleblacklist-desc' => '[[MediaWiki:Titleblacklist]], [[MediaWiki:Titlewhitelist]]를 통해서 특정 ì œëª©ì˜ ë¬¸ì„œ 만들기를 막는 기능',
+ 'titleblacklist' => ' # 문서 ì´ë¦„ 금지 목ë¡ì„ ì ëŠ” 곳입니다. ì •ê·œ 표현ì‹ê³¼ ì¼ì¹˜í•˜ëŠ” 문서나 ì‚¬ìš©ìž ì´ë¦„ì€ ë§Œë“¤ê¸°ê°€ 제한ë©ë‹ˆë‹¤.
+ # ê·œì¹™ì´ ì•„ë‹Œ ì£¼ì„ ë‚´ìš©ì—는 ì•žì— "#"ì„ ë¶™ì—¬ 주세요.
+ # 기본ì ìœ¼ë¡œ ê·œì¹™ì€ ëŒ€ì†Œë¬¸ìžë¥¼ 구별하지 않습니다.',
+ 'titlewhitelist' => ' # 만들기 허용 ê·œì¹™ì„ ì ëŠ” 곳입니다. 만들기 금지 ê·œì¹™ì— í¬í•¨ë˜ëŠ” ë¬¸ì„œì˜ ê²½ìš°, ì´ ê³³ì˜ ê·œì¹™ì—ë„ í¬í•¨ë  경우 만들기가 가능해집니다.
+ # ê·œì¹™ì´ ì•„ë‹Œ ì£¼ì„ ë‚´ìš©ì—는 ì•žì— "#"ì„ ë¶™ì—¬ 주세요.
+ # 기본ì ìœ¼ë¡œ ê·œì¹™ì€ ëŒ€ì†Œë¬¸ìžë¥¼ 구별하지 않습니다.',
+ 'titleblacklist-forbidden-edit' => '"$2" 문서는 만들기 금지 목ë¡ì— í¬í•¨ë˜ì–´ 있습니다.
+해당 만들기 금지 ì¡°ê±´ì€ <code>$1</code>입니다.',
+ 'titleblacklist-forbidden-move' => '"$2" 문서를 "$3" 제목으로 옮길 수 없습니다. 문서 만들기 금지 ì¡°ê±´ì´ ê±¸ë ¤ 있습니다.
+해당 금지 ì¡°ê±´ì€ <code>$1</code>입니다.',
+ 'titleblacklist-forbidden-upload' => '"$2" íŒŒì¼ ì´ë¦„ì„ ë§Œë“œëŠ” ê²ƒì´ ì œí•œë˜ì–´ 있습니다.
+íŒŒì¼ ì´ë¦„ì´ ë‹¤ìŒì˜ ê·œì¹™ì— í•´ë‹¹ë©ë‹ˆë‹¤: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '"$2" ì´ë¦„으로 ê³„ì •ì„ ë§Œë“œëŠ” ê²ƒì´ ì œí•œë˜ì–´ 있습니다.
+계정 ì´ë¦„ì´ ë‹¤ìŒì˜ ê·œì¹™ì— í•´ë‹¹ë©ë‹ˆë‹¤: <code>$1</code>',
+ 'titleblacklist-invalid' => '제목 블랙리스트 목ë¡ì— ìž˜ëª»ëœ êµ¬ë¬¸ì´ ìžˆìŠµë‹ˆë‹¤.
+저장하기 ì „ì— ì˜¬ë°”ë¥´ê²Œ 수정해주세요.',
+ 'titleblacklist-override' => '블랙리스트를 무시',
+ 'right-tboverride' => '문서 제목ì´ë‚˜ ì‚¬ìš©ìž ì´ë¦„ 블랙리스트 무시',
+ 'right-tboverride-account' => 'ì‚¬ìš©ìž ì´ë¦„ 블랙리스트를 무시',
+);
+
+/** Colognian (Ripoarisch)
+ * @author Purodha
+ */
+$messages['ksh'] = array(
+ 'titleblacklist-desc' => 'Määt et möjjelesch, bestemmpte neuje Sigge un neuje Metmaacher-Name övver en [[MediaWiki:Titleblacklist|„schwatze Leß“]] un en [[MediaWiki:Titlewhitelist|Leß met Ußnahme dofun]] ze verbeede.',
+ 'titleblacklist' => '# Dat hee eß en „schwatze Leß“ met verbodde Tittele för Sigge.
+# Dä ier Enhallt sen rejolähre Ußdrök,
+# wat do drop paß, kam_mer nit aanläje.
+# Wam_mer et nit ömschtällt, es Jruß- un Kleinschrevv_ejaal.
+# Donn „#“ aan der Aanfang fun en Reih, dann häß ene Kommentaa.',
+ 'titlewhitelist' => '# Dat hee eß en Leß met Ußnahme fun de „schwatze Leß“ met verbodde
+# Tittele för Sigge. Dä ier Enhallt sen rejolähre Ußdrök,
+# wat do drop paß, kam_mer aanläje.
+# Wam_mer et nit ömschtällt, es Jruß- un Kleinschrevv_ejaal.
+# Donn „#“ aan der Aanfang fun en Reih, dann häß ene Kommentaa.',
+ 'titleblacklist-forbidden-edit' => 'En Sigg met dämm Tittel „$2“ aanzelääje es verbodde per dämm Enndraach <code>$1</code> en de „schwazze Leß.“',
+ 'titleblacklist-forbidden-move' => 'Di Sigg met dämm Tittel „$2“ op dä Tittel „$3“ ömzenänne es verbodde per dämm Enndraach <code>$1</code> en de „schwazze Leß.“',
+ 'titleblacklist-forbidden-upload' => 'En Datei met dämm Tittel „$2“ huhzelade es verbodde per dämm Enndraach <code>$1</code> en de „schwazze Leß.“',
+ 'titleblacklist-forbidden-new-account' => 'Enne Metmaacher met dämm Name „$2“ aanzelääje es verbodde per dämm Enndraach <code>$1</code> en de „schwazze Leß.“',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|De Reih unge stemmp nit un moß|De $1 Reije unge stimme nit un möße|Dat he sull}} för em Afspeichere eets en Odenung jebraat wäde:',
+ 'titleblacklist-override' => 'De schwazze Leß övverjonn',
+ 'right-tboverride' => 'De Lėß met verbodde Naame un Titelle för Sigge övverjonn',
+ 'right-tboverride-account' => 'De Leß met verbodde Metmaacher-Name övverjonn',
+);
+
+/** Latin (Latina)
+ * @author UV
+ */
+$messages['la'] = array(
+ 'titleblacklist' => '# Hic est index titulorum prohibitorum. Tituli usoresque qui congruunt
+# cum una ex expressionibus regularis sequentibus creari non possunt.
+# Utere "#" pro commentariis.
+# Litterae maiusculae ab litteris minusculis distingui non solent.',
+ 'titlewhitelist' => '# Hic est index titulorum permissorum. Utere "#" pro commentariis.
+# Litterae maiusculae ab litteris minusculis distingui non solent.',
+ 'titleblacklist-forbidden-edit' => 'Pagina cum titulo "$2" creari non potest. Hic titulus congruit cum expressione regulari: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Pagina cum titulo "$2" non ad "$3" moveri potest, quia titulus "$3" prohibitus est ne pagina creetur. Hic titulus congruit cum expressione regulari: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Fasciculus cum titulo "$2" imponi non potest. Hic titulus congruit cum expressione regulari: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Ratio usoris "$2" creari non potest.
+Hic titulus congruit cum expressione regulari: <code>$1</code>',
+);
+
+/** Luxembourgish (Lëtzebuergesch)
+ * @author Robby
+ */
+$messages['lb'] = array(
+ 'titleblacklist-desc' => "Erlaabt den Administrateuren et d'Uleeë vu Säiten a Benotzerkonte mat spezifeschen Titelen iwwer eng [[MediaWiki:Titleblacklist|schwaarz Lëscht]] an eng [[MediaWiki:Titlewhitelist|wäiss Lëscht]] ze verbidden",
+ 'titleblacklist' => '# Dëst ass een Titel deen op enger schwaarzer Lëscht steet. Titelen a Benotzernimm op déi dës Ausdréck passe kann net ugeluecht ginn
+# Benotzt "#" fir Bemierkungen
+# Et gëtt tëschent groussen a klenge Buchstawen ënnerscheed',
+ 'titlewhitelist' => "# Dëst ass d'''Whitelist'' vun den Titelen. Benotzt \"#\" fir Bemierkungen.
+# Et gëtt een Ënnerscheed tëschent groussen a klenge Buchstawe gemaach",
+ 'titleblacklist-forbidden-edit' => 'Den Titel "$2" dàerf net ugeluecht ginn.
+En ass op der schwaarzer Lëscht wéint folgendem Begrëff: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" kann net op "$3" geréckelt ginn, well den Titel "$3" net däerf ugeluecht ginn.
+En entsprécht dëser Rubrik vun der schwaarzr Lëscht: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'De Fichiersnumm "$2" kann net benotzt ginn.
+Hien ass identesch mat dësem Numm vun der schwaarzer Lëscht (black list): <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'De Benotzermumm "$2" gouf gespaart fir benotzt ze ginn.
+En ass esou op der \'\'schwaarzer Lëscht\'\': <code>$1</code>',
+ 'titleblacklist-invalid' => 'Dës {{PLURAL:$1|Linn|Linnen}} op der schwaarzer Lëscht vun den {{PLURAL:$1|Titelen ass|Titele sinn}} net valabel;
+verbessert se virum späicheren:',
+ 'titleblacklist-override' => 'Schwaarz Lëscht ignoréieren',
+ 'right-tboverride' => "D'schwaarz Lëscht vun den Titelen a Benotzernimm ignoréieren",
+ 'right-tboverride-account' => 'Schwaarz Lëscht vun de Benotzernimm iwwergoen',
+);
+
+/** Limburgish (Limburgs)
+ * @author Matthias
+ * @author Ooswesthoesbes
+ */
+$messages['li'] = array(
+ 'titleblacklist-desc' => "Veurkömp het aanmake van pagina's èn gebroekers waenger 'ne [[MediaWiki:Titleblacklist|zwarte]] en [[MediaWiki:Titlewhitelist|witte]] lies.",
+ 'titleblacklist' => '# Dit is \'ne zjwarte lies veur paginaname. Paginaname en gebroekers die voldoon aan \'ne regex kinne neet aangemaak waere.
+# Gebroek "#" veur opmerkinge.
+# Dit is autematis huidlettergeveulig',
+ 'titlewhitelist' => '# Dit is \'ne witte lies veur paginaname. Gebroek "#" veur opmerkinge.
+# Dit is autematis huidlettergeveulig',
+ 'titleblacklist-forbidden-edit' => 'Een pagina met de naam "$2" kan niet aangemaakt worden. Deze paginanaam voldoet aan de volgende beperking op de zwarte lijst: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" kan niet hernoemd worden naar "$3", omdat pagina\'s met de naam "$3" niet aangemaakt kunnen worden. Deze paginanaam voldoet aan de volgende beperking op de zwarte lijst: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Het bestand "$2" kan niet toegevoegd worden. Deze bestandsnaam voldoet aan de volgende beperking op de zwarte lijst: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'De gebroekersnaam "$2" kan neet aangemaak waere ómdet \'t voldeit aan de volgende beperking op de zwarte lies: <code>$1</code>',
+ 'titleblacklist-invalid' => 'De volgende {{PLURAL:$1|regel|regels}} in de zwarte lijst veur paginaname {{PLURAL:$1|is|zijn}} ongeldig. Verbeter die {{PLURAL:$1|regel|regels}} asjeblieft veurdat ge de lijst opslaat:',
+ 'titleblacklist-override' => 'Negeer zwarte lies',
+ 'right-tboverride' => 'De zwarte lies veur pazjenaname negere', # Fuzzy
+ 'right-tboverride-account' => 'De zwarte lies veur gebroekersname negere',
+);
+
+/** Lithuanian (lietuvių)
+ * @author Eitvys200
+ * @author Homo
+ * @author Matasg
+ */
+$messages['lt'] = array(
+ 'titleblacklist-desc' => 'Leidžia administratoriams uždrausti kurti puslapius ir vartotojų sąskaitas pagal [[MediaWiki:Titleblacklist|juodąjį sąrašą]] ir [[MediaWiki:Titlewhitelist|baltąjį sąrašą]]',
+ 'titleblacklist' => '# Tai pavadinimų juodasis sÄ…raÅ¡as. Pavadinimai ir vartotojai, kurie atitinka įraÅ¡us Äia, negali bÅ«ti sukuriami.
+# Naudokite "#" komentarams.
+# Pagal nutylėjimą nejautrus raidžių dydžiui',
+ 'titlewhitelist' => '# Tai pavadinimų baltasis sąrašas. Naudokite "#" komentarams.
+# Pagal nutylėjimą nejautrus raidžių dydžiui',
+ 'titleblacklist-forbidden-edit' => 'Pavadinimą "$2" buvo uždrausta sukurti.
+Jis atitinką šį juodojo sąrašo įrašą: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" negali būti perkeltas į "$3", nes pavadinimą "$3" buvo uždrausta sukurti.
+Jis atitinką šį juodojo sąrašo įrašą: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Failą "$2" buvo uždrausta sukurti.
+Jis atitinką šį juodojo sąrašo įrašą: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Naudotojo vardą "$2" buvo uždrausta sukurti.
+Jis atitinką šį juodojo sąrašo įrašą: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Žemiau {{PLURAL:$1|esanti linija|esanÄios linijos}} juodajame sÄ…raÅ¡e {{PLURAL:$1|yra|yra}} netinkama;
+prašome {{PLURAL:$1|ją|jas}} pataisyti prieš išsaugant:', # Fuzzy
+ 'titleblacklist-override' => 'Ignoruoti juodąjį sąrašą',
+ 'right-tboverride' => 'Nepaisyti juodojo sąrašo', # Fuzzy
+);
+
+/** Macedonian (македонÑки)
+ * @author Bjankuloski06
+ */
+$messages['mk'] = array(
+ 'titleblacklist-desc' => 'Им овозможува на админиÑтраторите да забранат Ñоздавање на Ñтраници и кориÑнички Ñметки Ñо помош на [[MediaWiki:Titleblacklist|црн ÑпиÑок]] и [[MediaWiki:Titlewhitelist|бел ÑпиÑок]]',
+ 'titleblacklist' => '# Ова е црн ÑпиÑок на наÑлови. ÐаÑловите и кориÑниците кои Ñе Ñовпаѓаат Ñо регуларните изрази на ÑпиÑокот не можат да Ñе Ñоздадат.
+# За коментари кориÑтете го знакот „#“.
+# Ова разликува мали и големи букви по оÑновно',
+ 'titlewhitelist' => '# Ова е бел ÑпиÑок на наÑлови. За коментари кориÑтете го знакот „#“.
+# Ова разликува мали и големи букви по оÑновно',
+ 'titleblacklist-forbidden-edit' => 'ÐаÑловот „$2“ е забранет за Ñоздавање.
+Се Ñовпаѓа Ñо Ñледната Ñтавка на црниот ÑпиÑок: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '„$2“ не може да Ñе премеÑти на „$3“, бидејќи наÑловот „$3“ е забранет за Ñоздавање.
+Се Ñовпаѓа Ñо Ñледнава Ñтавка на црниот ÑпиÑок: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Податотеката по име „$2“ е забранета за Ñоздавање.
+Се Ñовпаѓа Ñо Ñледнава Ñтавка на црниот ÑпиÑок: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'КориÑничкото име „$2“ е забрането за Ñоздавање.
+Се Ñовпаѓа Ñо Ñледнава Ñтавка на црниот ÑпиÑок: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Следниов ред|Следниве редови}} во црниот ÑпиÑок на наÑлови {{PLURAL:$1|е|Ñе}} неважечки;
+поправете {{PLURAL:$1|го|ги}} пред да зачувате:',
+ 'titleblacklist-override' => 'Занемари го црниот ÑпиÑок',
+ 'right-tboverride' => 'Занемарување на црниот ÑпиÑок на наÑлови или кориÑници',
+ 'right-tboverride-account' => 'ПотиÑнување на црниот ÑпиÑок на кориÑнички имиња',
+);
+
+/** Malayalam (മലയാളം)
+ * @author Praveenp
+ * @author Shijualex
+ */
+$messages['ml'] = array(
+ 'titleblacklist-desc' => '[[MediaWiki:Titleblacklist]], [[MediaWiki:Titlewhitelist]] à´Žà´¨àµà´¨à´¿à´µà´¯à´¿àµ½ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ à´…à´‚à´—à´¤àµà´µà´™àµà´™à´³àµà´‚ താളàµà´•à´³àµà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ തടയാൻ കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´°àµ† à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+ 'titleblacklist' => '# ഇതൠതലകàµà´•àµ†à´Ÿàµà´Ÿà´¿à´¨àµà´±àµ† à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¾à´£àµâ€Œ. à´ˆ പടàµà´Ÿà´¿à´•à´¯à´¿à´²àµà´³àµà´³ ഇനവàµà´®à´¾à´¯à´¿ യോജികàµà´•àµà´¨àµà´¨ ലേഖനങàµà´™à´³àµà´‚ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´™àµà´™à´³àµà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•à´¾à´¨à´¾à´µà´¿à´²àµà´².
+# à´…à´­à´¿à´ªàµà´°à´¾à´¯à´¤àµà´¤à´¿à´¨àµ "#" ഉപയോഗികàµà´•àµà´•.
+# ഇതൠസàµà´µà´¤àµ‡ കേസൠസെൻസിറàµà´±àµ€à´µàµ ആണàµ.',
+ 'titlewhitelist' => '# ഇതൠതലകàµà´•àµ†à´Ÿàµà´Ÿà´¿à´¨àµà´±àµ† à´¶àµà´¦àµà´§à´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¾à´£àµ. à´•àµà´±à´¿à´ªàµà´ªà´¿à´Ÿà´¾à´¨à´¾à´¯à´¿ "#" ഉപയോഗികàµà´•àµà´•.
+# ഇതൠസàµà´µà´¤àµ‡ കേസൠസെൻസിറàµà´±àµ€à´µàµ ആണàµ',
+ 'titleblacklist-forbidden-edit' => '"$2" à´Žà´¨àµà´¨ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ നിരോധിചàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³à´¤à´¾à´£àµâ€Œ. à´† തലകàµà´•àµ†à´Ÿàµà´Ÿàµ താഴെ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´• ഇനവàµà´®à´¾à´¯à´¿ യോജികàµà´•àµà´¨àµà´¨àµ: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$3" à´Žà´¨àµà´¨ തലകàµà´•àµ†à´Ÿàµà´Ÿàµ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ നിരോധിചàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³à´¤à´¿à´¨à´¾àµ½, "$2" à´Žà´¨àµà´¨ താൾ "$3" à´Žà´¨àµà´¨ തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿à´²àµ‡à´•àµà´•àµ മാറàµà´±à´¾àµ» പറàµà´±à´¿à´²àµà´². à´† തലകàµà´•àµ†à´Ÿàµà´Ÿàµ താഴെ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´• ഇനവàµà´®à´¾à´¯à´¿ യോജികàµà´•àµà´¨àµà´¨àµ: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '"$2" à´Žà´¨àµà´¨ നാമം à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµ കൊടàµà´•àµà´•àµà´¨àµà´¨à´¤àµ നിരോധിചàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³à´¤à´¾à´£àµâ€Œ.
+à´† നാമം താഴെ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´• ഇനവàµà´®à´¾à´¯à´¿ യോജികàµà´•àµà´¨àµà´¨àµ: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ "$2" സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµà´‚ നിരോധികàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¤à´¾à´£àµ.
+à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿àµ½ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ ഇനിപàµà´ªà´±à´¯àµà´¨àµà´¨à´¤àµà´®à´¾à´¯à´¿ അതൠഒതàµà´¤àµà´ªàµ‹à´•àµà´¨àµà´¨àµ: <code>$1</code>',
+ 'titleblacklist-invalid' => 'à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯à´¿à´²àµ† താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ {{PLURAL:$1|വരി|വരികൾ}} അസാധàµà´µà´¾à´£àµ.
+ദയവായി {{PLURAL:$1|à´…à´¤àµ|à´…à´µ}} ശരിയാകàµà´•à´¿à´¯ ശേഷം സേവൠചെയàµà´¯àµà´•:',
+ 'titleblacklist-override' => 'à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´• അവഗണികàµà´•àµà´•',
+ 'right-tboverride' => 'തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿à´¨àµà´±àµ† à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´¤àµà´¤à´¿à´¨àµà´±àµ† à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯àµ† അതിലംഘികàµà´•àµà´•',
+ 'right-tboverride-account' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´® à´•à´°à´¿à´®àµà´ªà´Ÿàµà´Ÿà´¿à´•à´¯àµ† അതിലംഘികàµà´•àµà´•',
+);
+
+/** Marathi (मराठी)
+ * @author Kaajawa
+ * @author Kaustubh
+ * @author Mahitgar
+ * @author Rahuldeshmukh101
+ */
+$messages['mr'] = array(
+ 'titleblacklist-desc' => '[[MediaWiki:Titleblacklist|बà¥à¤²à¥…कलीसà¥à¤Ÿ]] व [[MediaWiki:Titlewhitelist|वà¥à¤¹à¤¾à¤ˆà¤Ÿ लीसà¥à¤Ÿ]] ला अनà¥à¤¸à¤°à¥‚न पाने आणि सदसà¥à¤¯ खातà¥à¤¯à¤¾à¤‚ना पà¥à¤°à¤¤à¤¿à¤¬à¤‚धतीअ करणà¥à¤¯à¤¾à¤šà¥€ पà¥à¤°à¤šà¤¾à¤²à¤•à¤¾à¤‚ना परवानगी दà¥à¤¯à¤¾',
+ 'titleblacklist' => '# ही बà¥à¤²à¥‰à¤• केलेलà¥à¤¯à¤¾ शीरà¥à¤·à¤•à¤¾à¤‚ची यादी आहे. या यादीत असलेलà¥à¤¯à¤¾ शीरà¥à¤·à¤•à¤¾à¤‚चे लेख लिहिता येणार नाहीत.
+# शेरा देणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ "#" वापरा.',
+ 'titlewhitelist' => '# ही वापरू शकत असलेलà¥à¤¯à¤¾ शीरà¥à¤·à¤•à¤¾à¤‚ची यादी आहे. शेरा देणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ "#" वापरा',
+ 'titleblacklist-forbidden-edit' => '"$2" या शीरà¥à¤·à¤•à¤¾à¤šà¤¾ लेख बनवू शकत नाही. खाली बà¥à¤²à¥‰à¤• केलेलà¥à¤¯à¤¾ शीरà¥à¤·à¤•à¤¾à¤‚चà¥à¤¯à¤¾ यादीतील नोंद आहे:
+<code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" चे "$3" ला सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरण होऊ शकत नाही, कारण "$3" हे बà¥à¤²à¥‰à¤• केलेलà¥à¤¯à¤¾ शीरà¥à¤·à¤•à¤¾à¤‚चà¥à¤¯à¤¾ यादीत आहे. खाली बà¥à¤²à¥‰à¤• केलेलà¥à¤¯à¤¾ शीरà¥à¤·à¤•à¤¾à¤‚चà¥à¤¯à¤¾ यादीतील नोंद आहे: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '"$2" या शीरà¥à¤·à¤•à¤¾à¤šà¥€ संचिका बनवू शकत नाही. खाली बà¥à¤²à¥‰à¤• केलेलà¥à¤¯à¤¾ शीरà¥à¤·à¤•à¤¾à¤‚चà¥à¤¯à¤¾ यादीतील नोंद आहे:
+<code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '"$2" सदसà¥à¤¯à¤¨à¤¾à¤µ निरà¥à¤®à¤¿à¤¤à¥€à¤ªà¤¾à¤¸à¥‚न पà¥à¤°à¤¤à¤¿à¤¬à¤‚धीत केलेले आहे.
+ते खालील वरà¥à¤œà¥à¤¯à¤¸à¥‚चीशी जà¥à¤³à¤¤à¥‡ (महाराषà¥à¤Ÿà¥à¤° राजà¥à¤¯à¤¾à¤šà¥à¤¯à¤¾ सांसà¥à¤•à¥ƒà¤¤à¤¿à¤• धोरणास अनà¥à¤¸à¤°à¥‚न वरà¥à¤£à¤­à¥‡à¤¦à¤¾à¤µà¤° आधारीत मà¥à¤³ इंगà¥à¤°à¤œà¥€à¤µà¤¾à¤•à¥à¤¯à¤¾à¤¤à¥€à¤² बà¥à¤²à¥…कलीसà¥à¤Ÿ अनà¥à¤µà¤¾à¤¦à¤•à¤°à¤¤à¤¾à¤¨à¤¾ टाळत आहोत): <code>$1</code>',
+ 'titleblacklist-invalid' => 'शीरà¥à¤·à¤• बà¥à¤²à¥‰à¤• यादीतील खालील {{PLURAL:$1|ओळ चà¥à¤•à¥€à¤šà¥€ आहे|ओळी चà¥à¤•à¥€à¤šà¥à¤¯à¤¾ आहेत}}; कृपया जतन करणà¥à¤¯à¤¾à¤ªà¥‚रà¥à¤µà¥€ {{PLURAL:$1|ती|तà¥à¤¯à¤¾}} दà¥à¤°à¥à¤¸à¥à¤¤ करा:',
+ 'titleblacklist-override' => 'काळà¥à¤¯à¤¾ यादीकडे दà¥à¤°à¥à¤²à¤•à¥à¤· करा',
+ 'right-tboverride' => 'शीरà¥à¤·à¤• बà¥à¤²à¥…कयादी कडे दà¥à¤°à¥à¤²à¤•à¥à¤· करा', # Fuzzy
+ 'right-tboverride-account' => 'खते काळà¥à¤¯à¤¾ यादीकडे दà¥à¤°à¥à¤²à¤•à¥à¤· करा',
+);
+
+/** Malay (Bahasa Melayu)
+ * @author Anakmalaysia
+ * @author Aviator
+ * @author Izzudin
+ */
+$messages['ms'] = array(
+ 'titleblacklist-desc' => 'Membolehkan pentadbir mengawal penciptaan laman dan pengguna tertentu menggunakan [[MediaWiki:Titleblacklist|senarai hitam]] dan [[MediaWiki:Titlewhitelist|senarai putih]]',
+ 'titleblacklist' => '# Ini ialah senarai hitam tajuk. Tajuk atau pengguna yang sepadan dengan mana-mana ungkapan nalar di sini tidak boleh dicipta.
+# Gunakan "#" untuk komen.
+# Secara asali, ini tidak peka huruf (mengabaikan besar kecil huruf)',
+ 'titlewhitelist' => '# Ini ialah senarai hitam tajuk. Gunakan "#" untuk komen.
+# Secara asali, ini tidak peka huruf (mengabaikan besar kecil huruf)',
+ 'titleblacklist-forbidden-edit' => 'Tajuk "$2" telah diharamkan.
+Tajuk tersebut sepadan dengan entri senarai hitam berikut: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" tidak boleh dipindahkan ke "$3" kerana tajuk "$3" telah diharamkan.
+Tajuk tersebut sepadan dengan entri senarai hitam berikut: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Nama fail "$2" telah diharamkan.
+Nama tersebut sepadan dengan entri senarai hitam berikut: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Nama pengguna "$2" telah diharamkan kerana sepadan dengan entri senarai hitam berikut: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Baris|Baris-baris}} berikut adalah tidak sah. Sila betulkannya sebelum menyimpan:',
+ 'titleblacklist-override' => 'Abaikan senarai hitam',
+ 'right-tboverride' => 'Membatalkan senarai hitam tajuk atau nama pengguna',
+ 'right-tboverride-account' => 'Mengatasi senarai hitam nama pengguna',
+);
+
+/** Maltese (Malti)
+ * @author Chrisportelli
+ */
+$messages['mt'] = array(
+ 'titleblacklist-forbidden-new-account' => 'Il-ħolqien ta\' utenti bl-isem "$2" ġie imblukkat. Dan jaqbel mad-daħla fil-lista s-sewda segwenti: <code>$1</code>',
+ 'titleblacklist-override' => 'Injora l-lista s-sewda',
+ 'right-tboverride' => 'Jinjora l-lista s-sewda tat-titli', # Fuzzy
+ 'right-tboverride-account' => 'Jinjora l-lista s-sewda tal-ismijiet tal-utent',
+);
+
+/** Nahuatl (NÄhuatl)
+ * @author Fluence
+ * @author Ricardo gs
+ */
+$messages['nah'] = array(
+ 'titleblacklist' => '#InÄ«n ahcualli tÄ“pÅhualÄmatl. Ahmo tihuelitiz ahmo ticyÅcoyaz tÅcÄitl ahnozo tlatequitiltilÄ«lli mÄ quinehuihuilia cemeh in nÄhuatÄ«llahtÅliztli.
+#Xinemītia «#» titlacaquiztilīz.
+#InÄ«n ahmo quimati in huÄ“yimachiyÅtlahtÅliztli intlÄ ahmo mopehpena',
+);
+
+/** Norwegian Bokmål (norsk (bokmål)‎)
+ * @author Danmichaelo
+ * @author Nghtwlkr
+ * @author Reedy
+ */
+$messages['nb'] = array(
+ 'titleblacklist-desc' => 'Gir muligheten til å forhindre at sider og brukerkontoer med visse titler opprettes, ved å bruke [[MediaWiki:Titleblacklist]] og [[MediaWiki:Titlewhitelist]]',
+ 'titleblacklist' => '# Dette er en svartlisting for titler. Titler og brukernavn som passer med regulære uttrykk her kan ikke opprettes.
+# Bruk «#» for kommentarer.
+# Det skilles ikke mellom store og små bokstaver som standard',
+ 'titlewhitelist' => '# Dette er en hvitelisting for titler. Bruk «#» for kommentarer.
+# Det skilles ikke mellom store og små bokstaver som standard',
+ 'titleblacklist-forbidden-edit' => 'Tittelen «$2» er stengt for oppretting. Den blokkeres av følgende svartelistingselement: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '«$2» kan ikke flyttes til «$3» fordi tittelen «$3» har blitt stengt for oppretting. Den tilsvarer følgende element i svartelistinga: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Filnavnet «$2» er blokkert for oppretting. Den tilsvarer følgende svartelisteelement: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Brukernavnet «$2» kan ikke opprettes.
+Det tilsvarer følgende svartelisteelement: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Følgende {{PLURAL:$1|linje|linjer}} i tittelsvartelista er {{PLURAL:$1|ugyldig|ugyldige}}; vennligst korriger {{PLURAL:$1|den|dem}} før du lagrer:',
+ 'titleblacklist-override' => 'Ignorer svartelista.',
+ 'right-tboverride' => 'Overkjør svarteliste for tittel eller bruker',
+ 'right-tboverride-account' => 'Overstyr svartelista for brukernavn',
+);
+
+/** Low German (Plattdüütsch)
+ * @author Slomox
+ */
+$messages['nds'] = array(
+ 'titleblacklist-desc' => 'Verlöövt Administraters, dat Opstellen vun nich wünschte Sieden- un Brukernaams över en [[MediaWiki:Titleblacklist|Swartlist]] un [[MediaWiki:Titlewhitelist|Wittlist]] to verbeden',
+ 'titleblacklist' => '# Dit is de Swartlist vun Sieden- un Brukernaams, de nich opstellt warrn schöölt. Naams, op de disse regulären Utdrück todrepen doot, köönt nich opstellt warrn.
+# Bruuk „#“ för Kommentaren.
+# De List maakt keen Ünnerscheed bi grote un lütte Bookstaven',
+ 'titlewhitelist' => '# Dit is en Wittlist mit Utnahmen vun de Swartlist vun Siedennaams, de nich opstellt warrn schöölt. Bruuk „#“ för Kommentaren
+# De List maakt keen Ünnerscheed bi grote un lütte Bookstaven',
+ 'titleblacklist-forbidden-edit' => 'De Siedennaam „$2“ is för dat nee Opstellen nich verlöövt.
+Dat liggt an dissen Indrag in de Swartlist vun nich wünschte Siedennaams: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '„$2“ kann nich na „$3“ schaven warrn, de Siedennaam „$3“ is nich verlöövt.
+Dat liggt an dissen Indrag in de Swartlist vun nich wünschte Siedennaams: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'De Dateinaam „$2“ is nich verlöövt.
+Dat liggt an dissen Indrag in de Swartlist vun nich wünschte Dateinaams: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'De Brukernaam „$2“ is för dat nee Anmellen nich verlöövt.
+Dat liggt an dissen Indrag in de Swartlist vun nich wünschte Brukernaams: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Disse {{PLURAL:$1|Reeg|Regen}} in de Sperrlist {{PLURAL:$1|is|sünd}} ungüllig; verbeter {{PLURAL:$1|ehr|jem}}, ehrdat du spiekerst:',
+ 'right-tboverride' => 'De swarte List för Siedennaams ümgahn', # Fuzzy
+);
+
+/** Dutch (Nederlands)
+ * @author SPQRobin
+ * @author Siebrand
+ */
+$messages['nl'] = array(
+ 'titleblacklist-desc' => "Voorkomt het aanmaken van pagina's en gebruikers via een [[MediaWiki:Titleblacklist|zwarte lijst]] en een [[MediaWiki:Titlewhitelist|witte lijst]]",
+ 'titleblacklist' => '# Dit is een zwarte lijst voor paginanamen. Paginanamen en gebruikers die voldoen aan een reguliere expressie op deze paina kunnen niet aangemaakt worden.
+# Gebruik "#" voor opmerkingen.
+# Regels in de zwarte lijst zijn niet hoofdlettergevoelig.',
+ 'titlewhitelist' => '# Dit is een witte lijst voor paginanamen. Gebruik "#" voor opmerkingen.
+# Regels in de witte lijst zijn niet hoofdlettergevoelig.',
+ 'titleblacklist-forbidden-edit' => 'Een pagina met de naam "$2" kan niet aangemaakt worden. Deze paginanaam voldoet aan de volgende beperking op de zwarte lijst: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" kan niet hernoemd worden naar "$3", omdat pagina\'s met de naam "$3" niet aangemaakt kunnen worden. Deze paginanaam voldoet aan de volgende beperking op de zwarte lijst: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Het bestand "$2" kan niet toegevoegd worden. Deze bestandsnaam voldoet aan de volgende beperking op de zwarte lijst: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'De gebruikersnaam "$2" kan niet aangemaakt worden omdat die voldoet aan de volgende beperking op de zwarte lijst: <code>$1</code>',
+ 'titleblacklist-invalid' => 'De volgende {{PLURAL:$1|regel|regels}} in de zwarte lijst voor paginanamen {{PLURAL:$1|is|zijn}} ongeldig.
+Verbeter die {{PLURAL:$1|regel|regels}} voordat u de lijst opslaat:',
+ 'titleblacklist-override' => 'Zwarte lijst negeren',
+ 'right-tboverride' => 'De zwarte lijst voor pagina- en gebruikersnamen omzeilen',
+ 'right-tboverride-account' => 'Zwarte lijst voor gebruikersnamen negeren',
+);
+
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
+ * @author Frokor
+ * @author Harald Khan
+ * @author Njardarlogar
+ */
+$messages['nn'] = array(
+ 'titleblacklist-desc' => 'Gjev høve til å hindre at sider og brukarkontoar med visse titlar vert oppretta, ved å nytte [[MediaWiki:Titleblacklist]] og [[MediaWiki:Titlewhitelist]]',
+ 'titleblacklist' => '# Dette er ei svartlisting for titlar. Titlar og brukernamn som passar med regulære uttrykk her kan ikkje opprettast.
+# Bruk «#» for kommentarar.
+# Det vert som standard ikkje skilt mellom små og store bokstavar',
+ 'titlewhitelist' => '# Dette er ei kvitelisting for titlar. Bruk «#» for kommentarar.
+# Det vert som standard ikkje skilt mellom små og store bokstavar',
+ 'titleblacklist-forbidden-edit' => 'Tittelen «$2» er stengd for oppretting. Han er blokkert av følgjande svartelistingselement: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '«$2» kan ikkje flyttast til «$3» fordi tittelen «$3» er stengd for oppretting. Han svarar til følgjande element i svartelistinga: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Filnamnet «$2» er blokkert for oppretting. Det svarar til følgjande svartelisteelement: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Brukarnamnet «$2» kan ikkje opprettast.
+Det svarar til følgjande svartelisteelement: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Følgjande {{PLURAL:$1|linje|linjer}} i tittelsvartelista er {{PLURAL:$1|ugyldig|ugyldige}}; ver venleg å rette {{PLURAL:$1|ho|dei}} før du lagrar:',
+ 'right-tboverride' => 'Overkøyre tittelsvartelista', # Fuzzy
+);
+
+/** Occitan (occitan)
+ * @author Cedric31
+ */
+$messages['oc'] = array(
+ 'titleblacklist-desc' => "Permet als administrators d'interdire la creacion de paginas e de comptes d'utilizaires en foncion d'una [[MediaWiki:Titleblacklist|lista negra]] e d'una [[MediaWiki:Titlewhitelist|lista blanca]]",
+ 'titleblacklist' => '# Aquò es un títol mes en lista negra. Los títols e los utilizaires que correspondon aicí a una expression regulara pòdon pas èsser creats.
+# Utilizatz "#" per escriure los comentaris.
+# Las entradas son pas sensiblas a la cassa per defaut.',
+ 'titlewhitelist' => '# Aquò es la lista blanca dels títols. Utilizatz « # » per inserir de comentaris.
+# Las entradas son pas sensiblas a la cassa per defaut.',
+ 'titleblacklist-forbidden-edit' => "La pagina intitolada « $2 » pòt pas èsser creada. Dins la lista negra, correspond a l'expression racionala : <code>$1</code>",
+ 'titleblacklist-forbidden-move' => 'La page intitolada "$2" pòt pas èsser renomenada "$3". Dins la lista negra, correspond a l\'expression racionala : <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => "'''Un fichièr nomenat \"\$2\" pòt pas èsser telecargat.''' <br /> Dins la lista negra, correspond a l'expression racionala : <code>\$1</code>",
+ 'titleblacklist-forbidden-new-account' => 'Lo nom d’utilizaire « $2 » es estat interdich a la creacion.
+Correspond a l’entrada seguenta de la lista negra : <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|La linha seguenta|Las linhas seguentas}} dins la lista negra dels títols {{PLURAL:$1|es invalida|son invalidas}} : sètz convidat a {{PLURAL:$1|la|las}} corregir abans de salvar.',
+ 'right-tboverride' => 'Ignorar la lista negra dels títols', # Fuzzy
+);
+
+/** Oriya (ଓଡ଼ିଆ)
+ * @author Jnanaranjan Sahu
+ * @author Psubhashish
+ */
+$messages['or'] = array(
+ 'titleblacklist-desc' => 'ପରିଛାମାନଙà­à¬•à­ [[MediaWiki:Titleblacklist|ବାସନà­à¬¦ ତାଲିକା]] ଓ [[MediaWiki:Titlewhitelist|ଅନà­à¬®à¬¤à¬¿ ତାଲିକା]] ଅନà­à¬¸à¬¾à¬°à­‡ ପୃଷà­à¬ à¬¾ ଓ ସଭà­à­Ÿ ଖାତା ତିଆରି ପାଇଠଅନà­à¬®à¬¤à¬¿ ଦେଇଥାà¬',
+ 'titleblacklist' => '# à¬à¬¹à¬¾ à¬à¬• ନାମ ଅଟକତାଲିକା । ନାମ ଓ ସଭà­à­Ÿà¬¸à¬¬à­ ମେଳ ନଖାଇଲେ à¬à¬ à¬¾à¬°à­‡ ତାହା ଗଢ଼ାଯାଇପାରିବ ନାହିଠ।
+# ମତାମତ ନିମନà­à¬¤à­‡ "#" ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରନà­à¬¤à­ ।
+# à¬à¬¹à¬¾ ଆପେ ଆପେ ବଡ଼ ଓ ସାନ ଅକà­à¬·à¬°à¬•à­ à¬à¬• ଭାବରେ ନେଇଥାà¬',
+ 'titlewhitelist' => '# à¬à¬¹à¬¾ à¬à¬• ଅନà­à¬®à­‹à¬¦à¬¿à¬¤ ନାମ ତାଲିକା । ମତାମତ ପାଇଠ"#" ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରନà­à¬¤à­ ।
+# à¬à¬¹à¬¾ ଆପେ ଆପେ ବଡ଼ ଓ ସାନ ଅକà­à¬·à¬°à¬•à­ ସମଭାବେ ନେଇଥାà¬',
+ 'titleblacklist-forbidden-edit' => '"$2" ନାମଟି ତିଆରି କରିବାରୠଅଟକାଯାଇଛି ।
+à¬à¬¹à¬¾ ବାସନà­à¬¦ ତାଲିକା ସହ ମେଳ ଖାଇଥାà¬: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" ରୠ"$3" ଘà­à¬žà­à¬šà¬¾à¬¯à¬¾à¬‡à¬ªà¬¾à¬°à¬¿à¬¬ ନାହିà¬, କାରଣ "$3" ତିଆରି କରିବାରୠଅଟକାଯାଇଛି ।
+à¬à¬¹à¬¾ à¬à¬¹à¬¿ ବାସନà­à¬¦à¬¤à¬¾à¬²à¬¿à¬•à¬¾ ସହ ମେଳ ଖାଉଛି: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '"$2" ନାମଟି ତିଆରି କରିବାରୠଅଟକାଯାଇଛି ।
+à¬à¬¹à¬¾ ବାସନà­à¬¦ ତାଲିକା ସହ ମେଳ ଖାଉଛି: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '"$2" ନାମଟି ତିଆରି କରିବାରୠଅଟକାଯାଇଛି ।
+à¬à¬¹à¬¾ ବାସନà­à¬¦ ତାଲିକା ସହ ମେଳ ଖାଉଛି: <code>$1</code>',
+ 'titleblacklist-invalid' => 'ବାସନà­à¬¦ ତାଲିକାରେ ଥିବା ତଳଲିଖିତ {{PLURAL:$1|ଧାଡ଼ିଟି|ଧାଡ଼ିସବà­}} ଅଚଳ {{PLURAL:$1|ଅଟେ|ଅଟନà­à¬¤à¬¿}};
+ଦୟାକରି {{PLURAL:$1|ତାହାକà­|ସେସବà­à¬•à­}} ସାଇତିବା ଆଗରୠସà­à¬§à¬¾à¬°à¬¿ ଦିଅନà­à¬¤à­:',
+ 'titleblacklist-override' => 'ଅଟକତାଲିକାକୠଅଣଦେଖା କରିବେ',
+ 'right-tboverride' => 'ଅଟକ ତାଲିକାରେ ଶୀରà­à¬·à¬• କିମà­à¬¬à¬¾ ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬¨à¬¾à¬®à¬•à­ ଅଜାଣତରେ ଅଣଦେଖା କରିବା',
+ 'right-tboverride-account' => 'ଇଉଜର ନାମ ଅଟକ ତାଲିକାକୠଅଜାଣତରେ ଅଣଦେଖା କରିବା',
+);
+
+/** Polish (polski)
+ * @author Beau
+ * @author BeginaFelicysym
+ * @author Derbeth
+ * @author Sp5uhe
+ */
+$messages['pl'] = array(
+ 'titleblacklist-desc' => 'Pozwala na blokowanie tworzenia stron i kont użytkowników o określonych nazwach wykorzystując [[MediaWiki:Titleblacklist|czarną]] oraz [[MediaWiki:Titlewhitelist|białą]] listę',
+ 'titleblacklist' => '# Lista zabronionych nazw. Strony i konta o nazwach odpowiadających poniższym wyrażeniom regularnym, nie będą mogły zostać utworzone.
+# Użyj znaku „#â€, by utworzyć komentarz.
+# Domyślnie we wpisach ma znaczenie wielkość znaków.',
+ 'titlewhitelist' => '# To jest lista dopuszczalnych nazw artykułów. Użyj znaku „#†by utworzyć komentarz.
+# Domyślnie we wpisach ma znaczenie wielkość znaków.',
+ 'titleblacklist-forbidden-edit' => 'Utworzenie strony o nazwie „$2†nie jest możliwe.
+Nazwa ta pasuje do wpisu z czarnej listy: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Zmiana nazwy z „$2†na „$3†nie jest możliwa, ponieważ nie można utworzyć strony o nazwie „$3â€.
+Nazwa ta pasuje do wpisu z czarnej listy: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Utworzenie pliku o nazwie „$2†nie jest możliwe.
+Nazwa ta pasuje do wpisu z czarnej listy: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Utworzenie konta o nazwie „$2†nie jest możliwe.
+Nazwa ta pasuje do wpisu z czarnej listy: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Następująca linia|Następujące linie}} na liście zabronionych tytułów stron {{PLURAL:$1|jest nieprawidłowa|są nieprawidłowe}}. Popraw {{PLURAL:$1|ją|je}} przed zapisaniem:',
+ 'titleblacklist-override' => 'Ignoruj czarnÄ… listÄ™',
+ 'right-tboverride' => 'Zastąp czarną listę zabronionych tytułów stron lub nazw użytkowników',
+ 'right-tboverride-account' => 'Ignorowanie czarnej listy użytkowników',
+);
+
+/** Piedmontese (Piemontèis)
+ * @author Borichèt
+ * @author Dragonòt
+ */
+$messages['pms'] = array(
+ 'titleblacklist-desc' => "A përmëtt a j'aministrador ëd vieté la creassion ëd pàgine e ëd cont për na [[MediaWiki:Titleblacklist|blacklist]] e na [[MediaWiki:Titlewhitelist|whitelist]]",
+ 'titleblacklist' => '# Costa sì a l\'é na blacklist dij tìtoj. Tìtoj e stranòm che a corispondo a n\'espression regolar sì a peulo pa esse creà.
+# Dòvra "$" për coment.
+# Cost sì a l\'é pa case sensitive për default',
+ 'titlewhitelist' => '# Costa a l\'é na whitelist ëd tìtoj. Dòvra "$" për coment.
+# Sòn sì a l\'é pa case sensitive për default',
+ 'titleblacklist-forbidden-edit' => 'Ël tìtol "$2" a l\'é stàit vietà.
+A corispond a costa intrada dla blacklist: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" a peul pa esse tramudà a "$3", përchè ël tìtol "$3" a l\'é stàit vietà.
+A corispond a costa intrada dla blacklist: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Ël nòm dël file "$2" a l\'é stàit vietà.
+A corispond a costa intrada dla blacklist: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Lë stranòm "$2" a l\'é stàit vietà.
+A corispond a costa intrada dla blacklist: <code>$1</code>',
+ 'titleblacklist-invalid' => "{{PLURAL:$1|La linia|Le linie}} sota ant la blacklist dij tìtoj {{PLURAL:$1|a l'é pa bon-a|a son pa bon-e}};
+për piasì {{PLURAL:$1|coregg-la|coregg-je}} prima ëd salvé:",
+ 'titleblacklist-override' => 'Ignoré la lista nèira',
+ 'right-tboverride' => "Rampiassé la lista nèira dij tìtoj o djë stranòm d'utent",
+ 'right-tboverride-account' => "Ignoré la lista nèira djë stranòm d'utent",
+);
+
+/** Western Punjabi (پنجابی)
+ * @author Khalid Mahmood
+ */
+$messages['pnb'] = array(
+ 'titleblacklist-desc' => 'مکھیانواں نوں اجازت دیندا اے جے Ø§ÙˆÛ ØµÙÛ’ بنن توں روکن تے ورتن کھاتے [[MediaWiki:Titleblacklist|blacklist]] تے [[MediaWiki:Titlewhitelist|whitelist]]',
+ 'titleblacklist' => '# Ø§ÛŒÛ Ø§Ú© سرخی روک لسٹ اے۔ سرناویں تے ورتن والے اکو جۓ Ù„Ú¯Ù† تے تے Ø§ÙˆÛ Ù†Ø¦ÛŒÚº بناۓ جاسکدے.
+# کومنٹ لئی ورتو "#" .
+# اے کیس سینسیٹو نئیں۔',
+ 'titlewhitelist' => '# Ø§ÛŒÛ Ø§Ú© سرناواں چٹیلسٹ اے۔
+ÚˆÛŒÙالٹ ولوں ای Ø§ÛŒÛ Ú©ÛŒØ³ سینسیٹو نئیں۔',
+ 'titleblacklist-forbidden-edit' => 'سرناواں "$2" بنن توں روک دتا گیا اے۔
+Ø§ÛŒÛ ØªÚ¾Ù„Û’ دتی Ûوئی بلیکلسٹ انٹری نال رلدا اے: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" نوں "$3" ول نئیں لیایا جاسکدا کیوں جے سرناواں "$3" بنن توں روک دتی گئی اے۔
+اے تھلے دتی گئی کالی لسٹ انٹری نال رلدی اے: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Ùائل ناں "$2" بنن توں روک دتی گئی اے۔
+Ø§ÛŒÛ ØªÚ¾Ù„Û’ دتی گئی کالی لسٹ انٹری نال رلدا اے: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'ورتن ناں "$2" بنن توں روک دتا گیا اے۔
+اے تھلے دتی گئی کالیلسٹ انٹری نال رلدی اے: <code>$1</code>',
+ 'titleblacklist-invalid' => 'تھلے دتی {{PLURAL:$1|لین|لیناں }} کالیلسٹ سرناویں {{PLURAL:$1|ÛÛ’|Ûیں}}Ú† ناں منیا جان والا؛ Ù…Ûربانی کرکے بچان توں Ù¾ÛÙ„Û’ {{PLURAL:$1|it|اوناں نون}} اینوں.',
+ 'titleblacklist-override' => 'روکنلسٹ پعل جاؤ',
+ 'right-tboverride' => 'ٹاغٹل شلیکلسٹ تے لکھو۔', # Fuzzy
+ 'right-tboverride-account' => 'ورتن ناں بلیکلسٹ تے لکھو۔',
+);
+
+/** Pashto (پښتو)
+ * @author Ahmed-Najib-Biabani-Ibrahimkhel
+ */
+$messages['ps'] = array(
+ 'titleblacklist-override' => 'تورليک بابÛزه Ú«Ú¼Ù„',
+);
+
+/** Portuguese (português)
+ * @author Hamilton Abreu
+ * @author Malafaya
+ * @author Waldir
+ * @author 555
+ */
+$messages['pt'] = array(
+ 'titleblacklist-desc' => 'Permite que os administradores proibam a criação de páginas e contas de utilizadores através de uma [[MediaWiki:Titleblacklist|lista negra]] e de uma [[MediaWiki:Titlewhitelist|lista de excepções]]',
+ 'titleblacklist' => '# Esta é uma lista negra de títulos. Títulos de páginas e nomes de utilizadores que sejam filtrados por uma expressão regular desta lista, não poderão ser criados.
+# Use "#" para comentários.
+# Por omissão, esta lista não distingue maiúsculas de minúsculas',
+ 'titlewhitelist' => '# Esta é uma lista branca de títulos. Use "#" para comentários.
+# Por omissão, esta lista não distingue maiúsculas de minúsculas',
+ 'titleblacklist-forbidden-edit' => 'Foi bloqueada a criação do título "$2".
+O título corresponde à seguinte entrada da lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" não pode ser movida para "$3" já que foi bloqueada a criação do título "$3".
+O título corresponde à seguinte entrada da lista-negra: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Foi bloqueada a criação de ficheiros com o nome "$2".
+O nome corresponde à seguinte entrada da lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Foi bloqueada a criação de utilizadores com o nome "$2".
+O nome corresponde à seguinte entrada da lista negra: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|A seguinte linha|As seguintes linhas}} da lista negra {{PLURAL:$1|é inválida|são inválidas}}. Por favor, {{PLURAL:$1|corrija-a|corrija-as}} antes de gravar:',
+ 'titleblacklist-override' => 'Ignorar a lista negra',
+ 'right-tboverride' => 'Ignorar a lista negra de títulos', # Fuzzy
+ 'right-tboverride-account' => 'Ignorar a lista negra de nomes de utilizador',
+);
+
+/** Brazilian Portuguese (português do Brasil)
+ * @author Eduardo.mps
+ * @author Giro720
+ * @author Luckas
+ */
+$messages['pt-br'] = array(
+ 'titleblacklist-desc' => 'Permite a proibição da criação de páginas e contas de utilizadores com títulos específicos através de uma [[MediaWiki:Titleblacklist|lista negra]] e uma [[MediaWiki:Titlewhitelist|lista de exceções]]',
+ 'titleblacklist' => '# Esta é uma lista negra de títulos. Títulos de páginas e nomes de usuários que sejam filtrados por uma expressão regular desta lista não poderão ser criados.
+# Utilize "#" para fazer comentários.
+# Esta lista não é sensível á capitalização por padrão',
+ 'titlewhitelist' => '# Esta é uma lista branca de títulos. Utilize "#" para fazer comentários
+# Esta lista não é sensível a capitalização por padrão',
+ 'titleblacklist-forbidden-edit' => 'O título "$2" foi impedido de ser criado. Ele se encaixa na seguinte entrada da lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" não pode ser movida para "$3" já que "$3" é um título impedido de ser criado. Se encaixa na seguinte entrada da lista-negra: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'O arquivo "$2" foi impedido de ser criado. Ele se encaixa na seguinte entrada da lista negra: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'O nome de usuário "$2" foi banido da criação de usuários.
+O nome corresponde à seguinte entrada na lista negra: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|A seguinte linha|As seguintes linhas}} da lista negra {{PLURAL:$1|é inválida|são inválidas}}. Por gentileza, {{PLURAL:$1|corrija-a|corrija-as}} antes de salvar:',
+ 'titleblacklist-override' => 'Ignorar a lista negra.',
+ 'right-tboverride' => 'Sobrepor a lista negra de títulos', # Fuzzy
+ 'right-tboverride-account' => 'Sobrepor a lista negra de nomes de usuários',
+);
+
+/** Quechua (Runa Simi)
+ * @author AlimanRuna
+ */
+$messages['qu'] = array(
+ 'titleblacklist-override' => 'Yana sutisuyuta ama qhawaychu',
+);
+
+/** Romanian (română)
+ * @author AdiJapan
+ * @author Minisarm
+ * @author Stelistcristi
+ */
+$messages['ro'] = array(
+ 'titleblacklist-desc' => 'Permite administratorilor să interzică crearea de pagini și de conturi de utilizator, folosind o [[MediaWiki:Titleblacklist|listă neagră]] și o [[MediaWiki:Titlewhitelist|listă albă]]',
+ 'titleblacklist' => '# Aceasta este lista neagră pentru titluri. Nu pot fi create titluri și conturi care corespund la una din expresiile regulate de aici.
+# Folosiți „#†pentru comentarii.
+# În mod implicit nu contează majusculele.',
+ 'titlewhitelist' => '# Aceasta este lista albă pentru titluri. Folosiți „#†pentru comentarii.
+# În mod implicit nu contează majusculele.',
+ 'titleblacklist-forbidden-edit' => 'Este interzisă crearea titlului „$2â€.
+Interdicția a fost declanșată de următorul element din lista neagră: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Titlul „$2†nu se poate redenumi în „$3†pentru că acesta din urmă este interzis.
+Interdicția a fost declanșată de următorul element din lista neagră: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Numele de fișier „$2†este interzis.
+Interdicția a fost declanșată de următorul element din lista neagră: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Nu se poate crea un cont de utilizator cu numele „$2â€.
+Interdicția a fost declanșată de următorul element din lista neagră: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Următoarea linie|Următoarele linii}} din lista neagră a titlurilor {{PLURAL:$1|este invalidă|sînt invalide}};
+corectați{{PLURAL:$1|-o|-le}} înainte de a salva pagina.',
+ 'titleblacklist-override' => 'Ignoră lista neagră',
+ 'right-tboverride' => 'Ignoră lista neagră cu titluri sau nume de utilizator',
+ 'right-tboverride-account' => 'Suprascrie lista neagră a numelor de utilizator',
+);
+
+/** tarandíne (tarandíne)
+ * @author Joetaras
+ */
+$messages['roa-tara'] = array(
+ 'titleblacklist-desc' => "Permette a l'amministrature de vietà ccrejaziune de le pàggene e le cunde utinde pe 'na [[MediaWiki:Titleblacklist|lista gnore]] e [[MediaWiki:Titlewhitelist|lista vianghe]]",
+ 'titleblacklist' => '# Stu titele jè in lista gnore. Le titele e l\'utinde ca se ponne comborndà cu le espressiune regolare aqquà non ge ponne essere ccrejate.
+# Ause "#" pe le commende.
+# Quiste jè sensibbele a le maiuscole e le minuscole de partenze',
+ 'titlewhitelist' => '# Stu titele jè in lista vianghe.
+# Ause "#" pe le commende.
+# Quiste jè sensibbele a le maiuscole e le minuscole de partenze',
+ 'titleblacklist-forbidden-edit' => '\'U titele "$2" ha state mise fore da \'a ccrejazione.<br />
+Jidde se combronde cu le seguende vosce d\'a lista gnore: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" non ge pò essere sustate sus a "$3", purcé \'u titele "$3" ha state escluse da \'a ccreiazione.<br />
+Jidde se combronde cu le seguende vosce d\'a lista gnore: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '\'U nome d\'u file "$2" ha state escluse da \'a ccreiazione.<br />
+Jidde se combronde cu le vosce d\'a lista gnore: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '\'U nome de l\'utende "$2" ha state escluse da \'a ccreiazione.<br />
+Jidde se combronde cu le vosce d\'a lista gnore: <code>$1</code>',
+ 'titleblacklist-invalid' => "{{PLURAL:$1|'A seguenda linèe|Le seguende linèe}} jndr'à lista gnore de le titele {{PLURAL:$1|jè|sonde}} invalide;
+pe piacere corregge {{PLURAL:$1|jedde|lore}} apprime de reggistrà:",
+ 'titleblacklist-override' => "No scè penzanne 'a lista gnore",
+ 'right-tboverride' => "Sovrascrive 'a lista gnore de le titole o de le utinde",
+ 'right-tboverride-account' => "Sovrasrive 'a lista gnore de le utinde",
+);
+
+/** Russian (руÑÑкий)
+ * @author AlexSm
+ * @author Ferrer
+ * @author Ignatus
+ * @author KPu3uC B Poccuu
+ * @author Kaganer
+ * @author ÐлекÑандр Сигачёв
+ */
+$messages['ru'] = array(
+ 'titleblacklist-desc' => 'ПозволÑет админиÑтраторам запретить Ñоздание Ñтраниц и учётных запиÑей Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [[MediaWiki:Titleblacklist|чёрного]] и [[MediaWiki:Titlewhitelist|белого]] ÑпиÑков.',
+ 'titleblacklist' => '# Это ÑпиÑок запрещённыx названий. Страницы и учётные запиÑи, ÑоответÑтвующие указанным регулÑрным выражениÑм, не могут быть Ñозданы.
+# ИÑпользуйте «#» Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ².
+# По умолчанию нет чувÑтвительноÑти к региÑтру.',
+ 'titlewhitelist' => '# Это «белый ÑпиÑок» названий. Ð”Ð»Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ² иÑпользуйте «#».
+# По умолчанию нет чувÑтвительноÑти к региÑтру Ñимволов.',
+ 'titleblacklist-forbidden-edit' => "
+<div align=\"center\" style=\"border: 1px solid #f88; padding: 0.5em; margin-bottom: 3px; font-size: 95%; width: auto;\">
+'''Страница Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ \"\$2\" не может быть Ñоздана''' <br />
+Она попадает под Ñледующую запиÑÑŒ ÑпиÑка запрещенных названий: '''''\$1'''''
+</div>",
+ 'titleblacklist-forbidden-move' => 'Ðевозможно переименовать Ñтраницу «$2» в «$3», так как новое название запрещено Ñледующей запиÑью в чёрном ÑпиÑке: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Файл Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ «$2» был запрещён к Ñозданию. Он попадает под Ñледующую запиÑÑŒ ÑпиÑка запрещенных названий: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Запрещено иÑпользовать Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника «$2».
+Ð˜Ð¼Ñ ÑоответÑтвует Ñледующей запиÑи из чёрного ÑпиÑка: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтрока|Следующие Ñтроки}} в ÑпиÑке запрещённых названий {{PLURAL:$1|не ÑвлÑетÑÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ‹Ð¼ регулÑрным выражением|не ÑвлÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ регулÑрными выражениÑми}}. ПожалуйÑта, иÑправьте {{PLURAL:$1|её|их}} перед Ñохранением:',
+ 'titleblacklist-override' => 'Игнорировать чёрный ÑпиÑок',
+ 'right-tboverride' => 'игнорирование чёрного ÑпиÑка имён Ñтраниц или учаÑтников',
+ 'right-tboverride-account' => 'игнорирование чёрного ÑпиÑка имён учаÑтников',
+);
+
+/** Rusyn (руÑиньÑкый)
+ * @author Gazeb
+ */
+$messages['rue'] = array(
+ 'titleblacklist-desc' => 'Уможнює адмініÑтратовам заборонити ÑÑ‚Ð²Ð¾Ñ€Ñ—Ð½Ñ Ñторінок Ñ– хоÑновательÑкых конт на базї [[MediaWiki:Titleblacklist|чорной лиÑтины назв]] Ñ– [[MediaWiki:Titlewhitelist|білой лиÑтины назв]]',
+ 'titleblacklist' => '# Тото Ñ” чорна лиÑтина назв. Сторінкы Ñ– хоÑновательÑкы конта, котрых назва одповідать дакотрому реґуларному выразу, не буде мочі Ñтворити.
+# Коментарї зачінають знаком „#“.
+# Ðа великоÑти букв не залежыть.',
+ 'titlewhitelist' => '# Тото Ñ” біла лиÑтина назв Ñторінок. РÑдкы коментарїв зачінають знаком „#“.
+# Ðа великоÑти букв не залежыть.',
+ 'titleblacklist-forbidden-edit' => 'Ðе Ñ” доволено Ñтворити Ñторінку з назвов „$2“. Одповідать наÑтупному запиÑу на чорній лиÑтинї: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '„$2“ не годен переменовати на „$3“, бо назву „$3“ Ñ” заборонене Ñтворёвати. Одповідать наÑтупному запиÑу на чорній лиÑтинї: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Ðе Ñ” доволено Ñтворити файл з назвов „$2“. Одповідать наÑтупному запиÑу на чорній лиÑтинї: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Ðе Ñ” доволено реґіÑтровати Ñ–Ð¼Ñ Ñ…Ð¾ÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ â€ž$2“. Одповідать наÑтупному запиÑу на чорній лиÑтинї: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Ðа чорній лиÑтинї назв {{PLURAL:$1|Ñ” наÑтупный Ñ€Ñдок неправилный реґуларный выраз|Ñуть наÑтупны Ñ€Ñдкы неправилны реґуларны выразы|Ñ” наÑтупный Ñ€Ñдок неправилный реґуларный выраз}} Ñ– Ñ” треба {{PLURAL:$1|го|Ñ—Ñ…|Ñ—Ñ…}} перед уложінём Ñторінкы Ñправити :',
+ 'titleblacklist-override' => 'Іґноровати чорный ÑпиÑок',
+ 'right-tboverride' => 'Ñ–Ò‘Ð½Ð¾Ñ€Ð¾Ð²Ð°Ð½Ñ Ñ‡Ð¾Ñ€Ð½Ð¾Ð¹ лиÑтины назв Ñторінок', # Fuzzy
+ 'right-tboverride-account' => 'ÐŸÐµÑ€ÐµÐºÐ¾Ð½Ð°Ð½Ñ Ñ‡Ð¾Ñ€Ð½Ð¾Ð¹ лиÑтины назв Ñторінок',
+);
+
+/** Sanskrit (संसà¥à¤•à¥ƒà¤¤à¤®à¥)
+ * @author Shubha
+ */
+$messages['sa'] = array(
+ 'titleblacklist-desc' => '[[MediaWiki:Titleblacklist|blacklist]] तथा [[MediaWiki:Titlewhitelist|whitelist]] इतà¥à¤¯à¥‡à¤¤à¤¯à¥‹à¤ƒ पà¥à¤°à¤¬à¤¨à¥à¤§à¤•à¥‡à¤¨ नूतनपृषà¥à¤ à¤¸à¥à¤¯ योजकपृषà¥à¤ à¤¸à¥à¤¯ सरà¥à¤œà¤¨à¤‚ च अवरà¥à¤¦à¥à¤§à¤®à¥ असà¥à¤¤à¤¿ ।',
+ 'titleblacklist' => '# इदं दà¥à¤°à¥à¤ªà¤¯à¥à¤•à¥à¤¤à¤¶à¥€à¤°à¥à¤·à¤•à¤®à¥ । शिरà¥à¤·à¤•à¤¾à¤£à¤¿ योजकाः ये अतà¥à¤° नियताभिवà¥à¤¯à¤•à¥à¤¤à¤¿à¤‚ पà¥à¤°à¤¾à¤ªà¥à¤¨à¥à¤µà¤¨à¥à¤¤à¤¿ ते सà¥à¤°à¤·à¥à¤Ÿà¥à¤‚ नारà¥à¤¹à¤¨à¥à¤¤à¤¿ ।
+# अभिपà¥à¤°à¤¾à¤¯à¤¾à¤¯ "#" उपयà¥à¤œà¥à¤¯à¤¤à¤¾à¤®à¥ ।
+# पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¾à¤¨à¥à¤¸à¤¾à¤°à¤®à¥ इदमॠअकà¥à¤·à¤°à¤­à¥‡à¤¦à¤¸à¥‚कà¥à¤·à¥à¤®à¤°à¤¹à¤¿à¤¤à¤®à¥ ।',
+ 'titlewhitelist' => '# इदं शीरà¥à¤·à¤•à¤¶à¥à¤µà¥‡à¤¤à¤¾à¤µà¤²à¥€ । अभिपà¥à¤°à¤¾à¤¯à¤¾à¤¯ "#" उपयà¥à¤œà¥à¤¯à¤¤à¤¾à¤®à¥ ।
+# पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¾à¤¨à¥à¤¸à¤¾à¤°à¤®à¥ इदमॠअकà¥à¤·à¤°à¤­à¥‡à¤¦à¤¸à¥‚कà¥à¤·à¥à¤®à¤°à¤¹à¤¿à¤¤à¤®à¥ ।',
+ 'titleblacklist-forbidden-edit' => 'नामपद "$2" शिरोनाम निरà¥à¤®à¤¾à¤£à¤¾à¤¯ अवरà¥à¤¦à¥à¤§à¤‚ वरà¥à¤¤à¤¤à¥‡ ।
+इदं पà¥à¤°à¤µà¥‡à¤¶à¤¦à¥à¤°à¥à¤ªà¤¯à¥à¤•à¥à¤¤à¤¾à¤µà¤²à¥à¤¯à¤¾ सह यà¥à¤œà¥à¤¯à¤¤à¥‡: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" इतà¥à¤¯à¥‡à¤¤à¤¤à¥ नाम "$3" पà¥à¤°à¤¤à¤¿ परिवरà¥à¤¤à¤¯à¤¿à¤¤à¥à¤®à¥ अशकà¥à¤¯à¤‚, यतः "$3" इतà¥à¤¯à¤¸à¥à¤¯ निरà¥à¤®à¤¾à¤£à¤®à¥ अवरà¥à¤¦à¥à¤§à¤‚ वरà¥à¤¤à¤¤à¥‡ ।
+इदमॠअधोनिरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¤¯à¤¾ पà¥à¤°à¤µà¥‡à¤¶à¤¦à¥à¤°à¥à¤ªà¤¯à¥à¤•à¥à¤¤à¤¾à¤µà¤²à¥à¤¯à¤¾ सह यà¥à¤œà¥à¤¯à¤¤à¥‡: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'सञà¥à¤šà¤¿à¤•à¤¾à¤¯à¤¾à¤ƒ "$2" शिरोनाम निरà¥à¤®à¤¾à¤£à¤¾à¤¯ अवरà¥à¤¦à¥à¤§à¤‚ वरà¥à¤¤à¤¤à¥‡ ।
+इदमॠअधोनिरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¤¯à¤¾ पà¥à¤°à¤µà¥‡à¤¶à¤¦à¥à¤°à¥à¤ªà¤¯à¥à¤•à¥à¤¤à¤¾à¤µà¤²à¥à¤¯à¤¾ सह यà¥à¤œà¥à¤¯à¤¤à¥‡: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'योजकनाम "$2" निरà¥à¤®à¤¾à¤£à¤¾à¤¯ अवरà¥à¤¦à¥à¤§à¤‚ वरà¥à¤¤à¤¤à¥‡ ।
+इदं पà¥à¤°à¤µà¥‡à¤¶à¤¦à¥à¤°à¥à¤ªà¤¯à¥à¤•à¥à¤¤à¤¾à¤µà¤²à¥à¤¯à¤¾ सह यà¥à¤œà¥à¤¯à¤¤à¥‡: <code>$1</code>',
+ 'titleblacklist-invalid' => 'दà¥à¤°à¥à¤ªà¤¯à¥à¤•à¥à¤¤à¤¶à¥€à¤°à¥à¤·à¤•à¤¾à¤µà¤²à¥à¤¯à¤¾à¤‚ विदà¥à¤¯à¤®à¤¾à¤¨à¤¾à¤ƒ अधोनिरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¤¾à¤ƒ {{PLURAL:$1|पंकà¥à¤¤à¤¿à¤ƒ|पंङà¥à¤•à¥à¤¤à¤¯à¤ƒ}} अमानà¥à¤¯à¤¾à¤ƒ {{PLURAL:$1|असà¥à¤¤à¤¿|सनà¥à¤¤à¤¿}};
+कृपया रकà¥à¤·à¤£à¤¾à¤¤à¥ पूरà¥à¤µà¤®à¥ {{PLURAL:$1|à¤à¤¤à¤¾à¤®à¥|à¤à¤¤à¤¾à¤ƒ}} परिषà¥à¤•à¥à¤°à¤¿à¤¯à¤¨à¥à¤¤à¤¾à¤®à¥ :',
+ 'titleblacklist-override' => 'दà¥à¤°à¥à¤µà¥ƒà¤¤à¥à¤¤à¤¾à¤µà¤²à¥€ उपेकà¥à¤·à¥à¤¯à¤¤à¤¾à¤®à¥',
+ 'right-tboverride' => 'शिरोनामदà¥à¤°à¥à¤µà¥ƒà¤¤à¥à¤¤à¤¾à¤µà¤²à¥€à¤®à¥ अथवा योजकनामदà¥à¤°à¥à¤µà¥ƒà¤¤à¥à¤¤à¤¾à¤µà¤²à¥€à¤®à¥ अतिवà¥à¤°à¤œà¤¤à¥',
+ 'right-tboverride-account' => 'दà¥à¤°à¥à¤µà¥ƒà¤¤à¥à¤¤à¤¯à¥‹à¤œà¤•à¤¨à¤¾à¤® अतिवà¥à¤°à¤œà¤¤à¥',
+);
+
+/** Sakha (Ñаха тыла)
+ * @author HalanTul
+ */
+$messages['sah'] = array(
+ 'titleblacklist-desc' => '[[MediaWiki:Titleblacklist|Хара]] уонна [[MediaWiki:Titlewhitelist|Үрүҥ иÑпииһÑктÑри]] туһанан ÑирÑйдÑри айары уонна Ñаҥа дьону бÑлиÑтиири боборго аналлаах',
+ 'titleblacklist' => '# Бу бобуллубут ааттар "хара" иÑпииһÑктÑÑ€Ñ. ИÑпииһÑÐºÐºÑ ÐºÐ¸Ð¸Ñ€Ð±Ð¸Ñ‚ ханнык баҕарар Ñ‹Ñтатыйа оҥоһуллар кыаҕа Ñуох.
+# Быһаарыыны Ñуруйарга "#" бÑлиÑни туһан.
+# Эбии ÑтиллибÑÑ‚ÑÒ•Ð¸Ð½Ñ Ð±ÑÐ»Ð¸Ñ ÑƒÐ»Ð°Ñ…Ð°Ð½Ð°-кырата оруолу оонньообот',
+ 'titlewhitelist' => '# Бу ааттар «үрүҥ иÑпииһÑктÑрѻ. Ырытарга «#» бÑлиÑни туһаныҥ.
+# Эбии ÑтиллибÑÑ‚ÑÒ•Ð¸Ð½Ñ Ð±ÑÐ»Ð¸Ñ ÑƒÐ»Ð°Ñ…Ð°Ð½Ð°-кырата оруолу оонньообот',
+ 'titleblacklist-forbidden-edit' => "<div align=\"center\" style=\"border: 1px solid #f88; padding: 0.5em; margin-bottom: 3px; font-size: 95%; width: auto;\">
+'''Маннык ааттаах ÑирÑй \"\$2\" кыайан оҥоһуллубат''' <br />
+Бобуллубут ааттар иÑпииһÑктÑригÑÑ€ киирÑÑ€: '''''\$1'''''
+</div>",
+ 'titleblacklist-forbidden-move' => "<span class=\"error\">
+'''Маннык ааттаах ÑирÑй \"\$2\" маннык ааттанар \"\$3\" кыаҕа Ñуох, тоҕо диÑÑ‚ÑÑ…Ñ…Ñ \"\$3\" оҥоһуллара бобуллубут''' <br />
+Бобуллубут ааттар иÑпииһÑктÑригÑÑ€ киирÑÑ€: '''''\$1'''''
+</span>",
+ 'titleblacklist-forbidden-upload' => "'''Маннык ааттаах Ð±Ð¸Ð»Ñ \"\$2\" кыÑтанар (киллÑриллÑÑ€) кыаҕа Ñуох''' <br />
+Бобуллубут ааттар иÑпииһÑктÑригÑÑ€ киирÑÑ€: '''''\$1'''''",
+ 'titleblacklist-forbidden-new-account' => '«$2» ааты туттар Ñатаммат. Ðат хара тиһик бу Ñуругар Ñөп түбÑÒ»ÑÑ€: $1',
+ 'titleblacklist-invalid' => 'Бобуллубут ааттар тиһиктÑрин бу {{PLURAL:$1|Ñтроката|Ñтрокаалара}} {{PLURAL:$1|Ñыыһалаах|Ñыыһалаахтар}}. Бука диÑн ону көннөр:',
+ 'titleblacklist-override' => 'Хара тиһиги көрүмÑ',
+ 'right-tboverride' => 'СирÑйдÑÑ€ ааттарын "хара тиһигин" туттума', # Fuzzy
+ 'right-tboverride-account' => 'кыттааччылар ааттарын "хара тиһигин" туттума',
+);
+
+/** Sinhala (සිංහල)
+ * @author Budhajeewa
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['si'] = array(
+ 'titleblacklist-desc' => '[[MediaWiki:Titleblacklist|කළුලයිස්තුව]]කට à·„à· [[MediaWiki:Titlewhitelist|සුදු ලයිස්තුව]]කට අනුව පිටු හ෠පරිà·à·“ලක නිමà·à·€à·”ම් à·€à·à¶½à·à¶šà·Šà·€à·”මට පරිපà·à¶½à¶šà¶ºà¶±à·Šà¶§ ඉඩ දෙයි.',
+ 'titleblacklist' => '# This is a title blacklist. Titles and users that match a regular expression here cannot be created.
+# Use "#" for comments.
+# This is case insensitive by default',
+ 'titlewhitelist' => '# This is a title whitelist. Use "#" for comments.
+# This is case insensitive by default',
+ 'titleblacklist-forbidden-edit' => '"$2" මà·à¶­à·˜à¶šà·à·€ නිර්මà·à¶«à¶º වලක්ව෠ඇත.
+එය පහත සඳහන් කළුලයිස්තු අංගයට ගà·à·…පේ: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$3" යන්න නිර්මà·à¶«à¶º වලක෠ඇති නිස෠"$2" යන්න "$3" වෙත ගෙනය෠නොහà·à¶š.
+එය පහත කළුලයිස්තු අංගයට ගà·à·…පේ: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '"$2" ගොනු නà·à¶¸à¶º නිර්මà·à¶«à¶º වලක්ව෠ඇත.
+එය පහත සඳහන් කළුලයිස්තු අංගයට ගà·à·…පේ: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '"$2" පරිà·à·“ලක නà·à¶¸à¶º නිර්මà·à¶«à¶º වලක්ව෠ඇත.
+එය පහත සඳහන් කළුලයිස්තු අංගයට ගà·à·…පේ: <code>$1</code>',
+ 'titleblacklist-invalid' => 'මà·à¶­à·˜à¶šà· කළුලයිස්තුවේ පහත {{PLURAL:$1|පේලිය|පේලි}} à·€à·à¶»à¶¯à·’ය;
+සුරà·à¶šà·”මට පෙර ඒව෠නිවà·à¶»à¶¯à·’ කරන්න:',
+ 'titleblacklist-override' => 'කළුලයිස්තුව නොසලක෠හරින්න',
+ 'right-tboverride' => 'මà·à¶­à·˜à¶šà· හ෠පරිà·à·“ලක නà·à¶¸ කළුලයිස්තුව ඉක්මව෠යන්න',
+ 'right-tboverride-account' => 'පරිà·à·“ලක නà·à¶¸ කළුලයිස්තුව ඉක්මවà·à¶ºà¶±à·Šà¶±',
+);
+
+/** Slovak (slovenÄina)
+ * @author Helix84
+ */
+$messages['sk'] = array(
+ 'titleblacklist-desc' => 'Umožňuje zakázaÅ¥ tvorbu stránok a používateľských úÄtov s urÄenými názvami na základe [[MediaWiki:Titleblacklist|Äiernej listiny názvov]] a [[MediaWiki:Titlewhitelist|bielej listiny názvov]]',
+ 'titleblacklist' => '# Toto je Äierna listina názvov stránok. Názvy stránok a úÄtov, ktoré zodpovedajú tu uvedenému regulárnemu výrazu nebude možné vytvoriÅ¥.
+# Komentáre zaÄínajú znakom „#“.
+# Štandardne nezáleží na veľkosti písmen',
+ 'titlewhitelist' => '# Toto je biela listina názvov stránok. Riadky komentárov zaÄínajú znakom „#“
+# Štandardne nezáleží na veľkosti písmen',
+ 'titleblacklist-forbidden-edit' => 'Vytvorenie stránky z názovom „$2“ bolo zakázané. Zodpovedá tejto položke Äiernej listiny: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '„$2“ nie je možné presunúť na „$3“, pretože vytvorenie stránky z názovom „$3“ bolo zakázané. Zodpovedá tejto položke Äiernej listiny: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Bolo zakázané vytvorenie súboru s názvom „$2“. Zodpovedá tejto položke Äiernej listiny: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Bolo zakázané vytvorenie používateľského mena „$2â€.
+Zodpovedá nasledovnej položke Äiernej listiny: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Nasledovný riadok|Nasledovné riadky}} Äiernej listiny názvov stránok {{PLURAL:$1|je neplatný|sú neplatné}} a je potrebné {{PLURAL:$1|ho|ich}} opraviÅ¥ pred uložením stránky:',
+ 'titleblacklist-override' => 'IgnorovaÅ¥ Äiernu listinu',
+ 'right-tboverride' => 'PrekonaÅ¥ Äiernu listinu názvov', # Fuzzy
+ 'right-tboverride-account' => 'PrekonaÅ¥ Äiernu listinu používateľských mien',
+);
+
+/** Slovenian (slovenÅ¡Äina)
+ * @author Dbc334
+ */
+$messages['sl'] = array(
+ 'titleblacklist-desc' => 'OmogoÄa administratorjem prepreÄiti ustvarjanje strani in uporabniÅ¡kih raÄunov glede na [[MediaWiki:Titleblacklist|Ärni seznam]] in [[MediaWiki:Titlewhitelist|beli seznam]]',
+ 'titleblacklist' => '# To je Ärni seznam naslovov. Naslovov in uporabnikov, ki ustrezajo regularnim izrazom tukaj, ni mogoÄe ustvariti.
+# Uporabite »#« za pripombe.
+# Po privzetem seznam ni obÄutljiv na velikost Ärk',
+ 'titlewhitelist' => '# To je beli seznam naslovov. Uporabite »#« za pripombe.
+# Po privzetem seznam ni obÄutljiv na velikost Ärk',
+ 'titleblacklist-forbidden-edit' => 'Naslov »$2« je bil prepreÄen pred ustvarjanjem.
+Ustreza naslednjemu vnosu na Ärnem seznamu: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '»$2« ni mogoÄe prestaviti na »$3«, ker je bil naslov »$3« prepreÄen pred ustvarjanjem.
+Ustreza naslednjemu vnosu na Ärnem seznamu: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Ime datoteke »$2« je bilo prepreÄeno pred ustvarjanjem.
+Ustreza naslednjemu vnosu na Ärnem seznamu: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'UporabniÅ¡ko ime »$2« je bilo prepreÄeno pred ustvarjanjem.
+Ustreza naslednjemu vnosu na Ärnem seznamu: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Naslednja vrstica|Naslednji vrstici|Naslednje vrstice}} v Ärnem seznamu naslovov {{PLURAL:$1|je neveljavna|sta neveljavni|so neveljavne}};
+prosimo, popravite {{PLURAL:$1|jo|ju|jih}} pred shranjevanjem:',
+ 'titleblacklist-override' => 'Prezri Ärni seznam',
+ 'right-tboverride' => 'Prepisovanje Ärnega seznama naslovov ali uporabniÅ¡kih imen',
+ 'right-tboverride-account' => 'Prepis Ärnega seznama uporabniÅ¡kih imen',
+);
+
+/** Albanian (shqip)
+ * @author Olsi
+ */
+$messages['sq'] = array(
+ 'titleblacklist-desc' => 'Lejon administruesit të ndalojnë krijimin e faqeve dhe llogarive të përdoruesve për një [[MediaWiki:Titleblacklist|listë të zezë]] dhe [[MediaWiki:Titlewhitelist|listë të bardhë]]',
+ 'titleblacklist' => '# Ky është një titull i listës së zezë. Titujt dhe përdoruesit që përputhin një shprehje të rregullt këtu nuk mund të krijohen.
+# Përdorni "#" për komente.
+# Ky nuk është një rast i ndjeshëm',
+ 'titlewhitelist' => '# Ky është në titull i listës së bardhë. Përdorni "#" për komente.
+# Ky nuk është një rast i ndjeshëm',
+ 'titleblacklist-forbidden-edit' => 'Titulli "$2"është ndaluar nga krijimi.
+Ai përputhet me hyrjen e mëposhtem të listës së zezë: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" nuk mund të zhvendoset tek "$3", sepse titulli "$3" është ndaluar nga krijimi.
+Ai përputhet me hyrjen e mëposhtme të listës së zezë: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Emri i skedës "$2"është ndaluar nga krijimi.
+Ai përputhet me hyrjen e mëposhtme të listës së zezë: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Emri i përdoruesit "$2"është ndaluar nga krijimi.
+Ai përputhet me hyrjen e mëposhtme të listës së zezë: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Rreshti i mëposhtëm|Rreshtat e mëposhtëm}} në titullin e listës së zezë {{PLURAL:$1|është i pavlefshëm|janë të pavlefshëm}};
+ju lutemi {{PLURAL:$1|korrigjojeni|korrigjojini}} përpara ruajtjes:',
+ 'titleblacklist-override' => 'Shpërfillni listën e zezë',
+ 'right-tboverride' => 'Refuzoni titullin e listës së zezë', # Fuzzy
+ 'right-tboverride-account' => 'Refuzoni emrin e përdoruesit të listës së zezë',
+);
+
+/** Serbian (Cyrillic script) (ÑрпÑки (ћирилица)‎)
+ * @author Millosh
+ * @author Rancher
+ * @author Sasa Stefanovic
+ * @author Жељко Тодоровић
+ * @author Михајло Ðнђелковић
+ */
+$messages['sr-ec'] = array(
+ 'titleblacklist-desc' => 'Допушта забрану Ñтварања Ñтраница Ñ Ð¾Ð´Ñ€ÐµÑ’ÐµÐ½Ð¸Ð¼ наÑловима: [[MediaWiki:Titleblacklist|црна лиÑта]] и [[MediaWiki:Titlewhitelist|бела лиÑта]].',
+ 'titleblacklist' => '# Ово је наÑлов црног ÑпиÑка. ÐаÑлови који Ñадрже регуларни израз из овог ÑпиÑка не могу бити направљени.
+# КориÑти "#" за коментаре.
+# Подразумевано је неоÑетљив на величину Ñлова',
+ 'titlewhitelist' => '# Ово је бели ÑпиÑак наÑлова. КориÑти "#" за коментаре.
+# Подразумевано је неоÑетљив на величину Ñлова',
+ 'titleblacklist-override' => 'Занемари црну лиÑту',
+ 'right-tboverride' => 'ПрепиÑује црни ÑпиÑак наÑлова.', # Fuzzy
+ 'right-tboverride-account' => 'заобилажење црне лиÑте кориÑничких имена',
+);
+
+/** Serbian (Latin script) (srpski (latinica)‎)
+ * @author Michaello
+ */
+$messages['sr-el'] = array(
+ 'titleblacklist-desc' => 'Dopušta zabranu stvaranja strana s određenim naslovima: [[MediaWiki:Titleblacklist|crna lista]] i [[MediaWiki:Titlewhitelist|bela lista]].',
+ 'titleblacklist' => '# Ovo je naslov crnog spiska. Naslovi koji sadrže regularni izraz iz ovog spiska ne mogu biti napravljeni.
+# Koristi "#" za komentare.
+# Podrazumevano je neosetljiv na veliÄinu slova',
+ 'titlewhitelist' => '# Ovo je beli spisak naslova. Koristi "#" za komentare.
+# Podrazumevano je neosetljiv na veliÄinu slova',
+ 'titleblacklist-override' => 'Zanemari crnu listu',
+ 'right-tboverride' => 'Prepisuje crni spisak naslova.', # Fuzzy
+ 'right-tboverride-account' => 'zaobilaženje crne liste korisniÄkih imena',
+);
+
+/** Seeltersk (Seeltersk)
+ * @author Pyt
+ */
+$messages['stq'] = array(
+ 'titleblacklist-desc' => 'Moaket dät Administratore muugelk, dät Moakjen fon nit wonskede Sieden- un Benutsernoomen tou ferhinnerjen: [[MediaWiki:Titleblacklist]] un [[MediaWiki:Titlewhitelist]]',
+ 'titleblacklist' => '# Dit is ne Swotte Lieste.
+# Älke Siede- un Benutsernoome, ap dän do foulgjende reguläre Uutdrukke touträffe, kon nit moaked wäide.
+# Text bääte ne Ruute „#“ wäd as Kommentoar betrachted.
+# Standoardmäitich wäd nit twiske Groot- un Littikskrieuwenge unnerskat.',
+ 'titlewhitelist' => '# Dit is ju Uutnoamelieste fon ju Swotte Lieste fon nit wonskede Siedennoomen. Benuts „#“ foar Kommentoare', # Fuzzy
+ 'titleblacklist-forbidden-edit' => "'''Ne Siede mäd dän Tittel „$2“ kon nit moaked wäide.''' <br />
+Die Tittel kollidiert mäd dissen Speerbegriep: '''''$1'''''",
+ 'titleblacklist-forbidden-move' => "'''Ju Siede „$2“ kon nit ätter „$3“ ferskäuwen wäide.''' <br />
+Die Tittel kollidiert mäd dissen Speerbegriep: '''''$1'''''",
+ 'titleblacklist-forbidden-upload' => "'''Ne Doatäi mäd dän Noome „$2“ kon nit hoochleeden wäide.''' <br />
+Die Tittel kollidiert mäd dissen Speerbegriep: <code>$1</code>",
+ 'titleblacklist-forbidden-new-account' => 'Ju Registrierenge fon dän Benutsernoome „$2“ is nit wonsked.
+Ju foulgjende Iendraach uut ju Lieste fon nit wonskede Benutsernoomen fierde tou Oulienenge: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Ju foulgjende Riege|Do foulgjende Riegen}} in ju Speerlieste {{PLURAL:$1|is|sunt}} uungultich; korrigier do foar dät Spiekerjen:',
+ 'right-tboverride' => 'Buute Kraft sätten fon ju swotte Lieste fon nit wonskede Siedennoomen', # Fuzzy
+);
+
+/** Sundanese (Basa Sunda)
+ * @author Kandar
+ */
+$messages['su'] = array(
+ 'titleblacklist-forbidden-edit' => 'Judul “$2†dicaram dijieun, luyu jeung éntri daptar hideung: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '“$2†teu bisa dipindahkeun ka “$3â€, sababa judul “$3†dicaram dijieun, luyu jeung éntri daptar hideung: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Ngaran koropak “$2†dicaram dijieun, luyu jeung éntri daptar hideung: <code>$1</code>',
+);
+
+/** Swedish (svenska)
+ * @author Ainali
+ * @author Boivie
+ * @author Lejonel
+ * @author M.M.S.
+ */
+$messages['sv'] = array(
+ 'titleblacklist-desc' => 'Låter administratörer förbjuda skapande av sidor och användarkonton genom en [[MediaWiki:Titleblacklist|svartlista]] och en [[MediaWiki:Titlewhitelist|vitlista]].',
+ 'titleblacklist' => '# Det här är en svartlista för titlar. Titlar och användarnamn som matchar ett reguljärt uttryck här kan inte skapas.
+# Använd "#" för kommentarer.
+# Detta är okänsligt för skiftläge som förval',
+ 'titlewhitelist' => '# Det är en lista över tillåtna sidtitlar. Använd "#" för att skriva kommentarer.
+# Detta är okänsligt för skiftläge som förval',
+ 'titleblacklist-forbidden-edit' => 'Sidtiteln "$2" har stoppats från att skapas. Den matchar följande rad i svarta listan för sidtitlar: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Sidan "$2" kan inte flyttas till "$3", eftersom titeln "$3" har förbjudits att skapas. Titeln matchar följande rad i svarta listan för sidtitlar: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Filnamnet "$2" har stoppats från att skapas. Namnet matchar följande rad i svarta listan för sidtitlar: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Användarnamnet "$2" kan inte skapas.
+Det matchar följande element i svartlistan: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Följande {{PLURAL:$1|rad|rader}} i listan är {{PLURAL:$1|felaktig|felaktiga}}; {{PLURAL:$1|den|de}} måste rättas innan du kan spara:',
+ 'titleblacklist-override' => 'Ignorera svartlistan',
+ 'right-tboverride' => 'Överrid svartlistan med titlar och användarnamn',
+ 'right-tboverride-account' => 'Kör över svartlistan för användarnamn',
+);
+
+/** Tamil (தமிழà¯)
+ * @author Shanmugamp7
+ * @author மதனாஹரனà¯
+ */
+$messages['ta'] = array(
+ 'titleblacklist-forbidden-edit' => 'தலைபà¯à®ªà¯ "$2" உரà¯à®µà®¾à®•à¯à®•à®¤à¯à®¤à®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ தடை செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.
+அத௠பினà¯à®µà®°à¯à®®à¯ கறà¯à®ªà¯à®ªà¯à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à¯ பதிவை ஒதà¯à®¤à¯à®³à¯à®³à®¤à¯: <code>$1</code>',
+ 'titleblacklist-override' => 'கரà¯à®ªà¯à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®¯à®²à¯ˆ பà¯à®±à®•à¯à®•à®£à®¿à®•à¯à®•à®µà¯à®®à¯',
+);
+
+/** Telugu (తెలà±à°—à±)
+ * @author Kiranmayee
+ * @author Veeven
+ */
+$messages['te'] = array(
+ 'titleblacklist-desc' => '[[MediaWiki:Titleblacklist|నిరోధపà±à°œà°¾à°¬à°¿à°¤à°¾]] మరియౠ[[MediaWiki:Titlewhitelist|à°¶à±à°µà±‡à°¤à°œà°¾à°¬à°¿à°¤à°¾]]à°² à°ªà±à°°à°•à°¾à°°à°‚ à°ªà±à°°à°¤à±à°¯à±‡à°•à°¿à°¤ శీరà±à°·à°¿à°•à°²à°¤à±‹ పేజీలనౠమరియౠవాడà±à°•à°°à°¿ ఖాతాలనౠసృషà±à°Ÿà°¿à°‚చడానà±à°¨à°¿ నిరà±à°µà°¾à°¹à°•à±à°²à± నిరోధించే వీలà±à°•à°²à±à°ªà°¿à°¸à±à°¤à±à°‚ది.',
+ 'titleblacklist' => '# ఇది శీరà±à°·à°¿à°•à°² నిరోధపౠజాబితా. ఇకà±à°•à°¡ ఉనà±à°¨ రెగà±à°¯à±à°²à°°à± à°Žà°•à±à°¸à±â€Œà°ªà±à°°à±†à°·à°¨à±à°²à°•à°¿ సరిపోలే శీరà±à°·à°¿à°•à°²à± à°—à°² పేజీలనౠమరియౠవాడà±à°•à°°à±à°²à°¨à± సృషà±à°Ÿà°¿à°‚చలేరà±.
+# à°µà±à°¯à°¾à°–à±à°¯à°¾à°¨à°¿à°‚చడానికి "#"ని వాడండి.
+# ఇది à°¸à±à°µà°¤à°¹à°¾à°—à°¾ పెదà±à°¦ మరియౠచినà±à°¨ à°…à°•à±à°·à°°à°¾à°²à°¨à± ఒకలాగానే చూసà±à°¤à±à°‚ది',
+ 'titlewhitelist' => '# ఇది à°…à°¨à±à°®à°¤à°¿à°‚చే శీరà±à°·à°¿à°•à°² జాబితా. à°µà±à°¯à°¾à°–à±à°¯à°¾à°¨à°¿à°‚చడానికి "#"ని వాడండి.
+# ఇది à°¸à±à°µà°¤à°¹à°¾à°—à°¾ పెదà±à°¦ మరియౠచినà±à°¨ à°…à°•à±à°·à°°à°¾à°²à°¨à± ఒకలాగానే చూసà±à°¤à±à°‚ది',
+ 'titleblacklist-forbidden-edit' => '"$2" అనే శీరà±à°·à°¿à°• à°—à°² పేజీలనౠసృషà±à°Ÿà°¿à°‚చడంపై నిషేధం విధించారà±. ఇది నిరోధపౠజాబితాలోని à°ˆ పదà±à°¦à±à°•à°¿ సరిపోలింది: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2"ని "$3"à°•à°¿ తరలించలేమà±, à°Žà°‚à°¦à±à°•à°‚టే "$3" à°…à°¨à±à°¨ శీరà±à°·à°¿à°•à°¨à°¿ సృషà±à°Ÿà°¿à°‚చడంపై నిషేధం ఉంది. ఇది నిరోధపౠజాబితాలోని à°ˆ పదà±à°¦à±à°•à°¿ సరిపోలà±à°¤à±à°‚ది: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '"$2" à°…à°¨à±à°¨ పేరౠగల ఫైలà±à°¨à°¿ సృషà±à°Ÿà°¿à°‚చడానà±à°¨à°¿ నిషేధించారà±. ఇది నిషేధపౠజాబితాలోని à°ˆ పదà±à°¦à±à°•à°¿ సరిపోలà±à°¤à±à°‚ది: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '"$2" à°…à°¨à±à°¨ పేరౠగల వాడà±à°•à°°à°¿à°¨à°¿ సృషà±à°Ÿà°¿à°‚చడానà±à°¨à°¿ నిషేధించారà±.
+ఇది నిషేధపౠజాబితాలోని à°ˆ పదà±à°¦à±à°•à°¿ సరిపోలà±à°¤à±à°‚ది: <code>$1</code>',
+ 'titleblacklist-invalid' => 'శీరà±à°·à°¿à°•à°² నిరోధపౠజాబితాలోని à°ˆ à°•à±à°°à°¿à°‚à°¦ పేరà±à°•à±Šà°¨à±à°¨ {{PLURAL:$1|లైనà±|లైనà±à°²à±}} తపà±à°ªà±à°—à°¾ {{PLURAL:$1|ఉంది|ఉనà±à°¨à°¾à°¯à°¿}}; à°­à°¦à±à°°à°ªà°°à°¿à°šà±‡à°®à±à°‚దౠ{{PLURAL:$1|దానà±à°¨à°¿|వాటిని}} సరిదిదà±à°¦à°‚à°¡à°¿:',
+ 'right-tboverride' => 'శీరà±à°·à°¿à°•à°² నిరోధపౠజాబితాని అధిగమించగలగడం', # Fuzzy
+);
+
+/** Tajik (Cyrillic script) (тоҷикӣ)
+ * @author Ibrahim
+ */
+$messages['tg-cyrl'] = array(
+ 'titleblacklist-desc' => 'Имкони пешгирӣ аз Ñҷоди Ñаҳифахое бо унвонҳои хоÑро медиҳад: [[MediaWiki:Titleblacklist]] ва [[MediaWiki:Titlewhitelist]]', # Fuzzy
+ 'titleblacklist' => '# Ин Ñк феҳриÑти Ñиёҳ барои унвонҳо аÑÑ‚. Унвонҳое, ки бо Ñк regex дар ин Ñаҳифа мутобиқаткунандаро наметавон Ñчод кард.
+# Барои илова кардани тавзеҳот аз "#" иÑтифода кунед.', # Fuzzy
+ 'titlewhitelist' => '# Ин Ñк феҳриÑти Ñафед барои унвонҳо аÑÑ‚. Барои илова кардани тавзеҳот аз "#" иÑтифода кунед', # Fuzzy
+ 'titleblacklist-forbidden-edit' => 'Эҷоди унвони "$2" манъ шудааÑÑ‚. Ин унвон бо ин даÑтур аз феҳриÑти Ñиёҳ мутобиқат мекунад: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" наметавонад ба "$3" кӯчонида шавад, зеро Ñҷоди унвони "$3" манъ шудааÑÑ‚. Чун бо ин даÑтур аз феҳриÑти Ñиёҳ мутобиқат мекунад: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Эҷоди номи "$2" барои парвандаҳо манъ аÑÑ‚. Он бо ин даÑтур аз фехриÑти Ñиёҳи зерин мутобиқат мекунад: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Сатри|Сатрҳои}} зерин дар феҳриÑти Ñиёҳи унвонҳо ғайримиҷоз {{PLURAL:$1|аÑÑ‚|ҳаÑтанд}}; лутфан {{PLURAL:$1|он|онҳо}}ро қабл аз захира кардан, иÑлоҳ кунед:',
+);
+
+/** Tajik (Latin script) (tojikī)
+ * @author Liangent
+ */
+$messages['tg-latn'] = array(
+ 'titleblacklist-forbidden-edit' => 'Eçodi unvoni "$2" man\' şudaast. In unvon bo in dastur az fehristi sijoh mutobiqat mekunad: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" nametavonad ba "$3" kūconida şavad, zero eçodi unvoni "$3" man\' şudaast. Cun bo in dastur az fehristi sijoh mutobiqat mekunad: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Eçodi nomi "$2" baroi parvandaho man\' ast. On bo in dastur az fexristi sijohi zerin mutobiqat mekunad: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Satri|Satrhoi}} zerin dar fehristi sijohi unvonho ƣajrimiçoz {{PLURAL:$1|ast|hastand}}; lutfan {{PLURAL:$1|on|onho}}ro qabl az zaxira kardan, isloh kuned:',
+);
+
+/** Thai (ไทย)
+ * @author Horus
+ * @author Manop
+ */
+$messages['th'] = array(
+ 'titleblacklist-forbidden-edit' => 'ชื่อบทความ "$2" ถูà¸à¸«à¹‰à¸²à¸¡à¸ªà¸£à¹‰à¸²à¸‡à¹ƒà¸™à¸£à¸°à¸šà¸šà¸™à¸µà¹‰
+
+ชื่อหัวข้อนี้ตรงà¸à¸±à¸šà¸šà¸±à¸à¸Šà¸µà¸”ำในส่วนของ: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'ไฟล์ชื่อ "$2" ถูà¸à¸«à¹‰à¸²à¸¡à¸ˆà¸²à¸à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡
+เนื่องจาà¸à¸•à¸£à¸‡à¸à¸±à¸šà¸Šà¸·à¹ˆà¸­à¸—ี่ปราà¸à¸Žà¹ƒà¸™à¸šà¸±à¸à¸Šà¸µà¸”ำดังต่อไปนี้: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'ชื่อผู้ใช้ "$2" ถูà¸à¸«à¹‰à¸²à¸¡à¸ˆà¸²à¸à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡
+เนื่องจาà¸à¸•à¸£à¸‡à¸à¸±à¸šà¸Šà¸·à¹ˆà¸­à¸—ี่ปราà¸à¸Žà¹ƒà¸™à¸šà¸±à¸à¸Šà¸µà¸”ำดังต่อไปนี้: <code>$1</code>',
+);
+
+/** Turkmen (Türkmençe)
+ * @author Hanberke
+ */
+$messages['tk'] = array(
+ 'titleblacklist-desc' => 'Administratorlara sahypalaryň we ulanyjy hasaplarynyň döredilmegini gadagan etmeklerine [[MediaWiki:Titleblacklist|gara sanaw]] ve [[MediaWiki:Titlewhitelist|ak sanaw]] arkaly rugsat berýär.',
+ 'titlewhitelist' => '# Bu bir atlaryň ak sanawydyr. Teswirler üçin "#" ulanyň.
+# Bu gaýybana baş-setir harpa duýgur däldir.',
+ 'titleblacklist-forbidden-edit' => '"$2" adynyň döredilmegi gadagan edildi.
+Şu gara sanaw girişina gabat gelýär: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '"$2" faýl adynyň döredilmegi gadagan edildi.
+Şu gara sanaw girişina gabat gelýär: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '"$2" ulanyjy adynyň döredilmegi gadagan edildi.
+Şu gara sanaw girişina gabat gelýär: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Gara sanawdaky şu {{PLURAL:$1|setir|setirler}} nädogry;
+ýazdyrmankaňyz düzediň:',
+ 'right-tboverride' => 'At gara sanawyna pisint etme', # Fuzzy
+);
+
+/** Tagalog (Tagalog)
+ * @author AnakngAraw
+ */
+$messages['tl'] = array(
+ 'titleblacklist-desc' => 'Nagpapahintulot sa mga tagapangasiwa na magbawal ng paglikha ng mga pahina at mga kuwenta ng tagagamit sa bawat isang [[MediaWiki:Titleblacklist|talaan ng pinagbabawal ("itim na talaan")]] at [[MediaWiki:Titlewhitelist|talaan ng mga pinapayagan ("puting talaan")]]',
+ 'titleblacklist' => '# Isa itong itim na talaan ng pamagat. Hindi maaaring likhain ang mga pamagat at mga tagagamit na tumutugma sa isang pangkaraniwang pagsasaad na naririto.
+# Gamitin ang "#" para sa mga puna.
+# Likas na nakatakdang hindi ito maselan sa pagmamakinilya ng titik',
+ 'titlewhitelist' => '# Isa itong puting talaan ng pamagat. Gamitin ang "#" para sa mga puna.
+# Likas na nakatakdang hindi ito maselan sa pagmamakinilya ng titik',
+ 'titleblacklist-forbidden-edit' => 'Pinagbawalan sa paglikha ang pamagat na "$2".
+Tumutugma ito sa sumusunod na entradang/ipinasok na nasa talaan ng mga pinagbabawal ("itim na talaan"): <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Hindi maililipat ang "$2" patungo sa "$3", dahil pinagbawal ang paglikha sa pamagat na "$3".
+Tumutugma ito sa sumusunod na ipinasok/entradang nasa talaan ng mga pinagbabawal ("itim na talaan"): <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Pinagbawal ang paglikha sa pangalan ng talaksang "$2".
+Tumutugma ito sa sumusunod na ipinasok/entradang nasa talaan ng mga pinagbabawalan ("itim na talaan"): <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Ipinagbawalan ang paglikha ng pangalan ng tagagamit na "$2".
+Tumutugma ito sa sumusunod na entrada/ipinasok sa talaan ng mga pinagbabawalan ("itim na talaan"): <code>$1</code>',
+ 'titleblacklist-invalid' => 'Ang sumusunod na {{PLURAL:$1|hanay|mga hanay}} (guhit) na nasa loob ng talaan ng pinagbabawal na pamagat {{PLURAL:$1|ay|ay}} hindi tanggap;
+pakitama lamang {{PLURAL:$1|ito|ang mga ito}} bago sagipin:',
+ 'titleblacklist-override' => 'Huwag pansinin ang talaang-itim',
+ 'right-tboverride' => 'Daigin ang talaan ng ipinagbabawal na pamagat o pangalan ng tagagamit',
+ 'right-tboverride-account' => 'Daigin ang talaang-itim ng mga pangalan ng tagagamit',
+);
+
+/** Turkish (Türkçe)
+ * @author Joseph
+ * @author Vito Genovese
+ */
+$messages['tr'] = array(
+ 'titleblacklist-desc' => 'Yöneticilere, sayfaların ve kullanıcı hesaplarının oluşturulmasını yasaklamalarına bir [[MediaWiki:Titleblacklist|karaliste]] ve [[MediaWiki:Titlewhitelist|beyazliste]] ile izin verir.',
+ 'titleblacklist' => '# Bu bir başlık karalistesi. Buradaki düzenli ifadelerle eşleşen başlıklar ve kullanıcılar oluşturulamaz.
+# Yorumlar için "#" kullanın.
+# Bu varsayılan olarak büyük-küçük harf duyarsızdır',
+ 'titlewhitelist' => '# Bu bir başlık beyaz listesidir. Yorumlar için "#" kullanın.
+# Varsayılan olarak büyük-küçük harfe duyarsızdır',
+ 'titleblacklist-forbidden-edit' => '"$2" başlığının oluşturulması engellendi.
+Åžu karaliste girdisiyle eÅŸleÅŸiyor: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2", "$3" sayfasına taşınamaz, çünkü "$3" başlığının oluşturulması yasaklanmış.
+Åžu karaliste girdisiyle eÅŸleÅŸiyor: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '"$2" dosya adının oluşturulması engellendi.
+Åžu karaliste girdisiyle eÅŸleÅŸiyor: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '"$2" kullanıcı adının oluşturulması engellendi.
+Åžu karaliste girdisiyle eÅŸleÅŸiyor: <code>$1</code>',
+ 'titleblacklist-invalid' => 'Karalistedeki şu {{PLURAL:$1|satır|satırlar}} geçersiz;
+lütfen kaydetmeden önce düzeltin:',
+ 'titleblacklist-override' => 'Karalisteyi yoksay',
+ 'right-tboverride' => 'Başlık karalistesini geçersiz kıl', # Fuzzy
+ 'right-tboverride-account' => 'Kullanıcı adı karalistesini geçersiz kıl',
+);
+
+/** Ukrainian (українÑька)
+ * @author AS
+ * @author Ahonc
+ * @author Base
+ * @author JenVan
+ * @author Prima klasy4na
+ */
+$messages['uk'] = array(
+ 'titleblacklist-desc' => 'Дає змогу адмініÑтраторам заборонити ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿ÐµÐ²Ð½Ð¸Ñ… Ñторінок та облікових запиÑів за допомогою [[MediaWiki:Titleblacklist|чорного]] та [[MediaWiki:Titlewhitelist|білого]] ÑпиÑків.',
+ 'titleblacklist' => '# Це ÑпиÑок заборонених назв. Сторінки Ñ– кориÑтувачі, назви Ñких підпадають під регулÑрні вирази з цього ÑпиÑку, не можуть бути Ñтворені.
+# ВикориÑтовуйте "#" Ð´Ð»Ñ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ñ–Ð².
+# СпиÑок за умовчаннÑм нечутливий до регіÑтру',
+ 'titlewhitelist' => '# Це «білий ÑпиÑок» назв. ВикориÑтовуйте «#» Ð´Ð»Ñ ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ñ–Ð².
+# СпиÑок за умовчаннÑм нечутливий до регіÑтру',
+ 'titleblacklist-forbidden-edit' => 'Сторінку з назвою "$2" заборонено Ñтворювати. Вона підпадає під наÑтупний Ð·Ð°Ð¿Ð¸Ñ Ñ–Ð· ÑпиÑку заборонених назв: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Ðе можна перейменувати "$2" на "$3", бо назва "$3" Ñ” забороненою.
+Вона підпадає під наÑтупний Ð·Ð°Ð¿Ð¸Ñ Ñ–Ð· ÑпиÑку заборонених назв: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Ðазва файлу "$2" Ñ” забороненою Ð´Ð»Ñ ÑтвореннÑ.
+Вона підпадає під наÑтупний Ð·Ð°Ð¿Ð¸Ñ Ñ–Ð· ÑпиÑку заборонених назв: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => "Заборонено викориÑтовувати ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача «$2».
+Ім'Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð°Ñ” наÑтупному запиÑу з чорного ÑпиÑку: <code>$1</code>",
+ 'titleblacklist-invalid' => '{{PLURAL:$1|ÐаÑтупнинй Ñ€Ñдок|ÐаÑтупні Ñ€Ñдки}} ÑпиÑку заборонених назв Ñ” {{PLURAL:$1|помилковим|помилковими}};
+будь лаÑка, виправіть {{PLURAL:$1|його|Ñ—Ñ…}} перед збереженнÑм:',
+ 'titleblacklist-override' => 'Ігнорувати чорний ÑпиÑок',
+ 'right-tboverride' => 'Ñ–Ð³Ð½Ð¾Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡Ð¾Ñ€Ð½Ð¾Ð³Ð¾ ÑпиÑку назв Ñторінок або кориÑтувачів',
+ 'right-tboverride-account' => 'Ñ–Ð³Ð½Ð¾Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡Ð¾Ñ€Ð½Ð¾Ð³Ð¾ ÑпиÑку імен кориÑтувачів',
+);
+
+/** Urdu (اردو)
+ * @author පසිඳු කà·à·€à·’න්ද
+ */
+$messages['ur'] = array(
+ 'titleblacklist-override' => 'نظر انداز کی بلیک لسٹ',
+ 'right-tboverride' => 'اس عنوان Ú©Û’ بلیک لسٹ Ú©ÛŒ Ø¬Ú¯Û Ù„Û’ Ù„Û’', # Fuzzy
+ 'right-tboverride-account' => 'Ú©Û’ صار٠کا نام بلیک لسٹ Ú©ÛŒ Ø¬Ú¯Û Ù„Û’ Ù„Û’',
+);
+
+/** vèneto (vèneto)
+ * @author Candalua
+ * @author GatoSelvadego
+ */
+$messages['vec'] = array(
+ 'titleblacklist-desc' => 'Consente ai aministradori de proibir la creazion de pagine con i titoli indicà su la [[MediaWiki:Titleblacklist|lista nera]] e su la [[MediaWiki:Titlewhitelist|lista bianca]]',
+ 'titleblacklist' => '# Lista dei titoli mìa consentìi. Xe inpedìa la creazion de le pagine el cui titolo el corisponde a na espression regolar indicà de seguito.
+# Dòpara "#" par le righe de comento.
+# De default no se tien conto del majuscolo/minuscolo',
+ 'titlewhitelist' => '# Sta qua la xe na lista bianca dei titoli. Dòpara "#" par le righe de comento.
+# De default no se tien conto del majuscolo/minuscolo',
+ 'titleblacklist-forbidden-edit' => 'La creazion de pagine con titolo "$2" la xe stà inpedìa. La voçe corispondente ne l\'elenco dei titoli mìa consentìi la xe sta chì: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'No se pode spostar la pagina "$2" al titolo "$3" in quanto la creazion de pagine con titolo "$3" la xe stà inpedìa. La voçe corispondente ne l\'elenco dei titoli mìa consentìi la xe sta chì: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'La creazion de file con titolo "$2" la xe stà inpedìa. La voçe corispondente ne l\'elenco dei titoli mìa consentìi la xe sta chì: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'La creassion de utenti co\' nome "$2" la xe stà proibìa. La voçe corispondente in tel\'elenco dei nomi mìa consentìi la xe la seguente: <code>$1</code>',
+ 'titleblacklist-invalid' => "{{PLURAL:$1|La seguente riga|Le seguenti righe}} de l'elenco dei titoli mìa consentìi {{PLURAL:$1|no la xe valida|no le xe valide}}; se prega de corègiar {{PLURAL:$1|l'eror|i erori}} prima de salvar la pagina.",
+ 'titleblacklist-override' => 'Ignora Å‚a lista nera',
+ 'right-tboverride' => 'Ignora ła lista nera de i titołi o de i nome utente',
+ 'right-tboverride-account' => 'Ignora Å‚a lista nera de i nome utente',
+);
+
+/** Vietnamese (Tiếng Việt)
+ * @author Minh Nguyen
+ * @author Vinhtantran
+ */
+$messages['vi'] = array(
+ 'titleblacklist-desc' => 'Cho phép các bảo quản viên cấm không được tạo ra trang có các tên, theo [[MediaWiki:Titleblacklist|danh sách đen]] và [[MediaWiki:Titlewhitelist|danh sách trắng]]',
+ 'titleblacklist' => '# Äây là danh sách Ä‘en vá» tá»±a Ä‘á». Tá»±a bài và tên thành viên trùng vá»›i biểu thức chính quy tại đây sẽ không thể tạo được.
+# Hãy dùng “#†để ghi chú.
+# Ná»™i dung mặc định là không phân biệt chữ hoa chữ thÆ°á»ng',
+ 'titlewhitelist' => '# Äây là danh sách trắng vá» tá»±a Ä‘á». Hãy sá»­ dụng "#" cho lá»i chú thích.
+# Ná»™i dung theo mặc định không phân biệt chữ hoa chữ thÆ°á»ng',
+ 'titleblacklist-forbidden-edit' => 'Không được tạo ra trang dÆ°á»›i tên “$2â€.
+Tên này trùng với mục sau trong danh sách đen: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Không được di chuyển “$2†đến “$3â€, vì tá»±a đỠ“$3†bị cấm khởi tạo.
+Nó trùng với mục sau trong danh sách đen: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Không được tải lên tập tin dÆ°á»›i tên “$2â€.
+Tên này trùng với khoản sau trong danh sách đen: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Không được tạo ra tài khoản “$2â€.
+Nó trùng tên với một khoản mục trong danh sách đen: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Dòng|Những dòng}} sau đây trong danh sách đen vỠtên trang không hợp lệ; xin hãy sửa chữa {{PLURAL:$1|nó|chúng}} để tuân theo cú pháp biểu thức chính quy trước khi lưu trang:',
+ 'titleblacklist-override' => 'BỠqua danh sách đen',
+ 'right-tboverride' => 'Bá» qua các danh sách tá»±a trang và tên ngÆ°á»i dùng bị cấm',
+ 'right-tboverride-account' => 'Ghi đè lên danh sách Ä‘en tên ngÆ°á»i dùng',
+);
+
+/** Volapük (Volapük)
+ * @author Smeira
+ */
+$messages['vo'] = array(
+ 'titleblacklist-desc' => 'Dälon guvanes ad proibön padi- e kalijafi medü [[MediaWiki:Titleblacklist|blägalised]] e [[MediaWiki:Titlewhitelist|vietalised]].',
+ 'titlewhitelist' => '# Atos binon vietalised tiädas. Gebolös el „#“ pro küpets.', # Fuzzy
+ 'titleblacklist-forbidden-edit' => 'Tiäd: „$2“ no dalon pajafön.
+Tiäd at binon in blägalised as: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => 'Pad: „$2“ no kanon topätükön sui pad: „$3“, bi tiäd: „$3“ no dalon pajafön. Tiäd at binon in blägalised as: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => 'Ragivanem: „$2“ no dalon pajafön. Ragivanem at binon in blägalised as: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => 'Gebananem: „$2“ no dalon pajafön.
+Gebananem at binon in blägalised as: <code>$1</code>',
+ 'titleblacklist-invalid' => '{{PLURAL:$1|Lien|Liens}} sököl in tiädablägalised no {{PLURAL:$1|lonöfon|lonöfons}}; gudükumolös {{PLURAL:$1|oni|onis}} bü dakip:',
+ 'right-tboverride' => 'Nedemön blägalisedi tiädas', # Fuzzy
+);
+
+/** Yiddish (ייִדיש)
+ * @author פוילישער
+ */
+$messages['yi'] = array(
+ 'titlewhitelist' => '# ד×ס ××™×– × ×§×¢×¤×œ ווײַסליסטע. ניצט "#" פֿ×ַר ב×ַמערקונגען.
+# ס\'××™×– נישט קיין ×ונטערשיד צווישן גרויסע ×ון קליינע בוכשט×ַבן',
+);
+
+/** Cantonese (粵語)
+ * @author Shinjiman
+ */
+$messages['yue'] = array(
+ 'titleblacklist-desc' => '容許ç¦æ­¢é–‹æŒ‡å®šæ¨™é¡Œå˜…版: [[MediaWiki:Titleblacklist]] åŒ [[MediaWiki:Titlewhitelist]]',
+ 'titleblacklist' => '# 呢個係一個標題黑å單。åŒå‘¢åº¦é…åˆæ­£è¦è¡¨é”å¼å˜…標題係唔å¯ä»¥æ–°é–‹å˜…。
+# 用 "#" 去åšè¨»è§£ã€‚', # Fuzzy
+ 'titlewhitelist' => '# 呢個係一個標題白å單。 用 "#" 去åšè¨»è§£', # Fuzzy
+ 'titleblacklist-forbidden-edit' => '個標題 "$2" 已經ç¦æ­¢å’—去開版。佢åŒä¸‹é¢é»‘å單嘅項目é…åˆ: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" å””å¯ä»¥æ¬åˆ°åŽ» "$3",由於個標題 "$3" 已經ç¦æ­¢å’—去開。佢åŒä¸‹é¢é»‘å單嘅項目é…åˆ: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '個檔å "$2" 已經ç¦æ­¢å’—去開版。佢åŒä¸‹é¢é»‘å單嘅項目é…åˆ: <code>$1</code>',
+ 'titleblacklist-invalid' => '下é¢éŸ¿æ¨™é¡Œé»‘å單嘅{{PLURAL:$1|一行|幾行}}無效;請響ä¿å­˜ä¹‹å‰æ”¹æ­£{{PLURAL:$1|ä½¢|佢哋}}:',
+ 'right-tboverride' => '覆蓋標題黑åå–®', # Fuzzy
+);
+
+/** Simplified Chinese (中文(简体)‎)
+ * @author Bencmq
+ * @author Fdcn
+ * @author Hydra
+ * @author Liangent
+ * @author PhiLiP
+ * @author Shinjiman
+ * @author Xiaomingyan
+ */
+$messages['zh-hans'] = array(
+ 'titleblacklist-desc' => 'å…许管ç†å‘˜é€šè¿‡[[MediaWiki:Titleblacklist|黑åå•]]å’Œ[[MediaWiki:Titlewhitelist|白åå•]]ç¦æ­¢é¡µé¢å’Œç”¨æˆ·å¸æˆ·çš„创建',
+ 'titleblacklist' => '# 本页é¢ä¸ºâ€œæ ‡é¢˜é»‘åå•â€ã€‚任何匹é…本åå•æ­£åˆ™è¡¨è¾¾å¼çš„标题会被阻止建立和编辑。
+# 请使用"#"æ¥æ·»åŠ æ³¨é‡Šã€‚
+# 默认忽略大å°å†™',
+ 'titlewhitelist' => '# 本页é¢ä¸ºâ€œæ ‡é¢˜ç™½åå•â€ã€‚ 请使用"#"æ¥æ·»åŠ æ³¨é‡Šã€‚
+# 本页默认ä¸åŒºåˆ†å¤§å°å†™',
+ 'titleblacklist-forbidden-edit' => '标题 "$2" å·²ç»è¢«ç¦æ­¢åˆ›å»ºã€‚它跟以下黑åå•çš„项目é…åˆ: <code>$1</code>',
+ 'titleblacklist-forbidden-move' => '"$2" ä¸å¯ä»¥ç§»åŠ¨åˆ° "$3",由于该标题 "$3" å·²ç»è¢«ç¦æ­¢åˆ›å»ºã€‚它跟以下黑åå•çš„项目é…åˆ: <code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '文件å称 "$2" å·²ç»è¢«ç¦æ­¢åˆ›å»ºã€‚它跟以下黑åå•çš„项目é…åˆ: <code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '用户å“$2â€å·²è¢«é˜»æ­¢åˆ›å»ºã€‚
+它匹é…以下黑åå•é¡¹ç›®ï¼š<code>$1</code>',
+ 'titleblacklist-invalid' => '以下在标题黑åå•ä¸Šçš„{{PLURAL:$1|一行|多行}}无效;请在ä¿å­˜å‰æ”¹æ­£{{PLURAL:$1|它|它们}}:',
+ 'titleblacklist-override' => '忽略黑åå•',
+ 'right-tboverride' => '覆盖标题或用户å黑åå•',
+ 'right-tboverride-account' => '覆盖用户å黑åå•',
+);
+
+/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Fdcn
+ * @author Gaoxuewei
+ * @author Mark85296341
+ * @author Shinjiman
+ * @author Simon Shek
+ * @author Waihorace
+ */
+$messages['zh-hant'] = array(
+ 'titleblacklist-desc' => '容許ç¦æ­¢å»ºç«‹æŒ‡å®šæ¨™é¡Œçš„é é¢ï¼š[[MediaWiki:Titleblacklist]] 與 [[MediaWiki:Titlewhitelist]]',
+ 'titleblacklist' => '# 本é é¢ç‚ºã€Œæ¨™é¡Œé»‘åå–®ã€ã€‚任何符åˆæœ¬å單正è¦è¡¨é”å¼çš„標題會被阻止建立和編輯。
+# 請使用「#ã€ä¾†æ–°å¢žè¨»é‡‹ã€‚
+# é è¨­å¿½ç•¥å¤§å°å¯«',
+ 'titlewhitelist' => '# 本é é¢ç‚ºã€Œæ¨™é¡Œç™½åå–®ã€ã€‚ 請使用「#ã€ä¾†æ–°å¢žè¨»é‡‹ã€‚
+# 本é é è¨­ä¸å€åˆ†å¤§å°å¯«',
+ 'titleblacklist-forbidden-edit' => '標題「$2ã€å·²ç¶“被ç¦æ­¢å»ºç«‹ã€‚它跟以下黑å單的項目é…åˆï¼š<code>$1</code>',
+ 'titleblacklist-forbidden-move' => '「$2ã€ä¸å¯ä»¥ç§»å‹•åˆ°ã€Œ$3ã€ï¼Œç”±æ–¼è©²æ¨™é¡Œã€Œ$3ã€å·²ç¶“被ç¦æ­¢å»ºç«‹ã€‚它跟以下黑å單的項目é…åˆï¼š<code>$1</code>',
+ 'titleblacklist-forbidden-upload' => '檔案å稱「$2ã€å·²ç¶“被ç¦æ­¢å»ºç«‹ã€‚它跟以下黑å單的項目é…åˆï¼š<code>$1</code>',
+ 'titleblacklist-forbidden-new-account' => '用戶å「$2ã€å·²è¢«é˜»æ­¢å»ºç«‹ã€‚
+它符åˆä»¥ä¸‹é»‘å單項目:<code>$1</code>',
+ 'titleblacklist-invalid' => '以下在標題黑å單上的{{PLURAL:$1|一行|多行}}無效;請在儲存å‰æ”¹æ­£{{PLURAL:$1|它|它們}}:',
+ 'titleblacklist-override' => '忽略黑åå–®',
+ 'right-tboverride' => '覆蓋標題或用戶å黑åå–®',
+ 'right-tboverride-account' => '覆蓋用戶å黑åå–®',
+);
diff --git a/extensions/TitleBlacklist/TitleBlacklist.list.php b/extensions/TitleBlacklist/TitleBlacklist.list.php
new file mode 100644
index 00000000..d197a9c5
--- /dev/null
+++ b/extensions/TitleBlacklist/TitleBlacklist.list.php
@@ -0,0 +1,510 @@
+<?php
+/**
+ * Title Blacklist class
+ * @author Victor Vasiliev
+ * @copyright © 2007-2010 Victor Vasiliev et al
+ * @license GNU General Public License 2.0 or later
+ * @file
+ */
+
+//@{
+/**
+ * @ingroup Extensions
+ */
+
+/**
+ * Implements a title blacklist for MediaWiki
+ */
+class TitleBlacklist {
+ private $mBlacklist = null, $mWhitelist = null;
+ const VERSION = 3; // Blacklist format
+
+ /**
+ * Get an instance of this class
+ *
+ * @return TitleBlacklist
+ */
+ public static function singleton() {
+ static $instance = null;
+
+ if ( $instance === null ) {
+ $instance = new self;
+ }
+ return $instance;
+ }
+
+ /**
+ * Load all configured blacklist sources
+ */
+ public function load() {
+ global $wgTitleBlacklistSources, $wgMemc, $wgTitleBlacklistCaching;
+ wfProfileIn( __METHOD__ );
+ // Try to find something in the cache
+ $cachedBlacklist = $wgMemc->get( wfMemcKey( "title_blacklist_entries" ) );
+ if ( is_array( $cachedBlacklist ) && count( $cachedBlacklist ) > 0 && ( $cachedBlacklist[0]->getFormatVersion() == self::VERSION ) ) {
+ $this->mBlacklist = $cachedBlacklist;
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
+ $sources = $wgTitleBlacklistSources;
+ $sources['local'] = array( 'type' => TBLSRC_MSG );
+ $this->mBlacklist = array();
+ foreach( $sources as $sourceName => $source ) {
+ $this->mBlacklist = array_merge( $this->mBlacklist, $this->parseBlacklist( $this->getBlacklistText( $source ), $sourceName ) );
+ }
+ $wgMemc->set( wfMemcKey( "title_blacklist_entries" ), $this->mBlacklist, $wgTitleBlacklistCaching['expiry'] );
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Load local whitelist
+ */
+ public function loadWhitelist() {
+ global $wgMemc, $wgTitleBlacklistCaching;
+ wfProfileIn( __METHOD__ );
+ $cachedWhitelist = $wgMemc->get( wfMemcKey( "title_whitelist_entries" ) );
+ if ( is_array( $cachedWhitelist ) && count( $cachedWhitelist ) > 0 && ( $cachedWhitelist[0]->getFormatVersion() != self::VERSION ) ) {
+ $this->mWhitelist = $cachedWhitelist;
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+ $this->mWhitelist = $this->parseBlacklist( wfMessage( 'titlewhitelist' )
+ ->inContentLanguage()->text(), 'whitelist' );
+ $wgMemc->set( wfMemcKey( "title_whitelist_entries" ), $this->mWhitelist, $wgTitleBlacklistCaching['expiry'] );
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Get the text of a blacklist from a specified source
+ *
+ * @param $source A blacklist source from $wgTitleBlacklistSources
+ * @return The content of the blacklist source as a string
+ */
+ private static function getBlacklistText( $source ) {
+ if ( !is_array( $source ) || count( $source ) <= 0 ) {
+ return ''; // Return empty string in error case
+ }
+
+ if ( $source['type'] == TBLSRC_MSG ) {
+ return wfMessage( 'titleblacklist' )->inContentLanguage()->text();
+ } elseif ( $source['type'] == TBLSRC_LOCALPAGE && count( $source ) >= 2 ) {
+ $title = Title::newFromText( $source['src'] );
+ if ( is_null( $title ) ) {
+ return '';
+ }
+ if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+ $msg = wfMessage( $title->getText() )->inContentLanguage()->text();
+ if ( !wfMessage( 'titleblacklist', $msg )->isDisabled() ) {
+ return $msg;
+ } else {
+ return '';
+ }
+ } else {
+ $article = new Article( $title );
+ if ( $article->exists() ) {
+ $article->followRedirect();
+ return $article->getContent();
+ }
+ }
+ } elseif ( $source['type'] == TBLSRC_URL && count( $source ) >= 2 ) {
+ return self::getHttp( $source['src'] );
+ } elseif ( $source['type'] == TBLSRC_FILE && count( $source ) >= 2 ) {
+ if ( file_exists( $source['src'] ) ) {
+ return file_get_contents( $source['src'] );
+ } else {
+ return '';
+ }
+ }
+
+ return '';
+ }
+
+ /**
+ * Parse blacklist from a string
+ *
+ * @param $list string Text of a blacklist source
+ * @return array of TitleBlacklistEntry entries
+ */
+ public static function parseBlacklist( $list, $sourceName ) {
+ wfProfileIn( __METHOD__ );
+ $lines = preg_split( "/\r?\n/", $list );
+ $result = array();
+ foreach ( $lines as $line ) {
+ $line = TitleBlacklistEntry :: newFromString( $line, $sourceName );
+ if ( $line ) {
+ $result[] = $line;
+ }
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $result;
+ }
+
+ /**
+ * Check whether the blacklist restricts giver nuser
+ * performing a specific action on the given Title
+ *
+ * @param $title Title to check
+ * @param $user User to check
+ * @param $action string Action to check; 'edit' if unspecified
+ * @param $override bool If set to true, overrides work
+ * @return TitleBlacklistEntry|bool The corresponding TitleBlacklistEntry if
+ * blacklisted; otherwise false
+ */
+ public function userCannot( $title, $user, $action = 'edit', $override = true ) {
+ if ( $override && self::userCanOverride( $user, $action ) ) {
+ return false;
+ } else {
+ return $this->isBlacklisted( $title, $action );
+ }
+ }
+
+ /**
+ * Check whether the blacklist restricts
+ * performing a specific action on the given Title
+ *
+ * @param $title Title to check
+ * @param $action string Action to check; 'edit' if unspecified
+ * @return TitleBlacklistEntry|bool The corresponding TitleBlacklistEntry if blacklisted;
+ * otherwise FALSE
+ */
+ public function isBlacklisted( $title, $action = 'edit' ) {
+ if ( !( $title instanceof Title ) ) {
+ $title = Title::newFromText( $title );
+ }
+ $blacklist = $this->getBlacklist();
+ foreach ( $blacklist as $item ) {
+ if ( $item->matches( $title, $action ) ) {
+ if ( $this->isWhitelisted( $title, $action ) ) {
+ return false;
+ }
+ return $item; // "returning true"
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Check whether it has been explicitly whitelisted that the
+ * current User may perform a specific action on the given Title
+ *
+ * @param $title Title to check
+ * @param $action string Action to check; 'edit' if unspecified
+ * @return bool True if whitelisted; otherwise false
+ */
+ public function isWhitelisted( $title, $action = 'edit' ) {
+ if ( !( $title instanceof Title ) ) {
+ $title = Title::newFromText( $title );
+ }
+ $whitelist = $this->getWhitelist();
+ foreach ( $whitelist as $item ) {
+ if ( $item->matches( $title, $action ) ) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Get the current blacklist
+ *
+ * @return Array of TitleBlacklistEntry items
+ */
+ public function getBlacklist() {
+ if ( is_null( $this->mBlacklist ) ) {
+ $this->load();
+ }
+ return $this->mBlacklist;
+ }
+
+ /**
+ * Get the current whitelist
+ *
+ * @return Array of TitleBlacklistEntry items
+ */
+ public function getWhitelist() {
+ if ( is_null( $this->mWhitelist ) ) {
+ $this->loadWhitelist();
+ }
+ return $this->mWhitelist;
+ }
+
+ /**
+ * Get the text of a blacklist source via HTTP
+ *
+ * @param $url string URL of the blacklist source
+ * @return string The content of the blacklist source as a string
+ */
+ private static function getHttp( $url ) {
+ global $messageMemc, $wgTitleBlacklistCaching;
+ $key = "title_blacklist_source:" . md5( $url ); // Global shared
+ $warnkey = wfMemcKey( "titleblacklistwarning", md5( $url ) );
+ $result = $messageMemc->get( $key );
+ $warn = $messageMemc->get( $warnkey );
+ if ( !is_string( $result ) || ( !$warn && !mt_rand( 0, $wgTitleBlacklistCaching['warningchance'] ) ) ) {
+ $result = Http::get( $url );
+ $messageMemc->set( $warnkey, 1, $wgTitleBlacklistCaching['warningexpiry'] );
+ $messageMemc->set( $key, $result, $wgTitleBlacklistCaching['expiry'] );
+ }
+ return $result;
+ }
+
+ /**
+ * Invalidate the blacklist cache
+ */
+ public function invalidate() {
+ global $wgMemc;
+ $wgMemc->delete( wfMemcKey( "title_blacklist_entries" ) );
+ }
+
+ /**
+ * Validate a new blacklist
+ *
+ * @param $blacklist array
+ * @return Array of bad entries; empty array means blacklist is valid
+ */
+ public function validate( $blacklist ) {
+ $badEntries = array();
+ foreach ( $blacklist as $e ) {
+ wfSuppressWarnings();
+ $regex = $e->getRegex();
+ if ( preg_match( "/{$regex}/u", '' ) === false ) {
+ $badEntries[] = $e->getRaw();
+ }
+ wfRestoreWarnings();
+ }
+ return $badEntries;
+ }
+
+ /**
+ * Inidcates whether user can override blacklist on certain action.
+ *
+ * @param $action Action
+ *
+ * @return bool
+ */
+ public static function userCanOverride( $user, $action ) {
+ return $user->isAllowed( 'tboverride' ) ||
+ ( $action == 'new-account' && $user->isAllowed( 'tboverride-account' ) );
+ }
+}
+
+
+/**
+ * Represents a title blacklist entry
+ */
+class TitleBlacklistEntry {
+ private
+ $mRaw, ///< Raw line
+ $mRegex, ///< Regular expression to match
+ $mParams, ///< Parameters for this entry
+ $mFormatVersion, ///< Entry format version
+ $mSource; ///< Source of this entry
+
+ /**
+ * Construct a new TitleBlacklistEntry.
+ *
+ * @param $regex string Regular expression to match
+ * @param $params array Parameters for this entry
+ * @param $raw string Raw contents of this line
+ */
+ private function __construct( $regex, $params, $raw, $source ) {
+ $this->mRaw = $raw;
+ $this->mRegex = $regex;
+ $this->mParams = $params;
+ $this->mFormatVersion = TitleBlacklist::VERSION;
+ $this->mSource = $source;
+ }
+
+ /**
+ * Returns whether this entry is capable of filtering new accounts.
+ */
+ private function filtersNewAccounts() {
+ global $wgTitleBlacklistUsernameSources;
+
+ if( $wgTitleBlacklistUsernameSources === '*' ) {
+ return true;
+ }
+
+ if( !$wgTitleBlacklistUsernameSources ) {
+ return false;
+ }
+
+ if( !is_array( $wgTitleBlacklistUsernameSources ) ) {
+ throw new MWException(
+ '$wgTitleBlacklistUsernameSources must be "*", false or an array' );
+ }
+
+ return in_array( $this->mSource, $wgTitleBlacklistUsernameSources, true );
+ }
+
+ /**
+ * Check whether a user can perform the specified action
+ * on the specified Title
+ *
+ * @param $title Title to check
+ * @param $action %Action to check
+ * @return bool TRUE if the the regex matches the title, and is not overridden
+ * else false if it doesn't match (or was overridden)
+ */
+ public function matches( $title, $action ) {
+ if ( !$title ) {
+ return false;
+ }
+
+ if( $action == 'new-account' && !$this->filtersNewAccounts() ) {
+ return false;
+ }
+
+ wfSuppressWarnings();
+ $match = preg_match( "/^(?:{$this->mRegex})$/us" . ( isset( $this->mParams['casesensitive'] ) ? '' : 'i' ), $title->getFullText() );
+ wfRestoreWarnings();
+
+ global $wgUser;
+ if ( $match ) {
+ if ( isset( $this->mParams['autoconfirmed'] ) && $wgUser->isAllowed( 'autoconfirmed' ) ) {
+ return false;
+ }
+ if ( isset( $this->mParams['moveonly'] ) && $action != 'move' ) {
+ return false;
+ }
+ if ( isset( $this->mParams['newaccountonly'] ) && $action != 'new-account' ) {
+ return false;
+ }
+ if ( !isset( $this->mParams['noedit'] ) && $action == 'edit' ) {
+ return false;
+ }
+ if ( isset( $this->mParams['reupload'] ) && $action == 'upload' ) {
+ // Special:Upload also checks 'create' permissions when not reuploading
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Create a new TitleBlacklistEntry from a line of text
+ *
+ * @param $line String containing a line of blacklist text
+ * @return TitleBlacklistEntry
+ */
+ public static function newFromString( $line, $source ) {
+ $raw = $line; // Keep line for raw data
+ $options = array();
+ // Strip comments
+ $line = preg_replace( "/^\\s*([^#]*)\\s*((.*)?)$/", "\\1", $line );
+ $line = trim( $line );
+ // Parse the rest of message
+ preg_match( '/^(.*?)(\s*<([^<>]*)>)?$/', $line, $pockets );
+ @list( $full, $regex, $null, $opts_str ) = $pockets;
+ $regex = trim( $regex );
+ $regex = str_replace( '_', ' ', $regex ); // We'll be matching against text form
+ $opts_str = trim( $opts_str );
+ // Parse opts
+ $opts = preg_split( '/\s*\|\s*/', $opts_str );
+ foreach ( $opts as $opt ) {
+ $opt2 = strtolower( $opt );
+ if ( $opt2 == 'autoconfirmed' ) {
+ $options['autoconfirmed'] = true;
+ }
+ if ( $opt2 == 'moveonly' ) {
+ $options['moveonly'] = true;
+ }
+ if ( $opt2 == 'newaccountonly' ) {
+ $options['newaccountonly'] = true;
+ }
+ if ( $opt2 == 'noedit' ) {
+ $options['noedit'] = true;
+ }
+ if ( $opt2 == 'casesensitive' ) {
+ $options['casesensitive'] = true;
+ }
+ if ( $opt2 == 'reupload' ) {
+ $options['reupload'] = true;
+ }
+ if ( preg_match( '/errmsg\s*=\s*(.+)/i', $opt, $matches ) ) {
+ $options['errmsg'] = $matches[1];
+ }
+ }
+ // Process magic words
+ preg_match_all( '/{{\s*([a-z]+)\s*:\s*(.+?)\s*}}/', $regex, $magicwords, PREG_SET_ORDER );
+ foreach ( $magicwords as $mword ) {
+ global $wgParser; // Functions we're calling don't need, nevertheless let's use it
+ switch( strtolower( $mword[1] ) ) {
+ case 'ns':
+ $cpf_result = CoreParserFunctions::ns( $wgParser, $mword[2] );
+ if ( is_string( $cpf_result ) ) {
+ $regex = str_replace( $mword[0], $cpf_result, $regex ); // All result will have the same value, so we can just use str_seplace()
+ }
+ break;
+ case 'int':
+ $cpf_result = wfMessage( $mword[2] )->inContentLanguage()->text();
+ if ( is_string( $cpf_result ) ) {
+ $regex = str_replace( $mword[0], $cpf_result, $regex );
+ }
+ }
+ }
+ // Return result
+ if( $regex ) {
+ return new TitleBlacklistEntry( $regex, $options, $raw, $source );
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @return string This entry's regular expression
+ */
+ public function getRegex() {
+ return $this->mRegex;
+ }
+
+ /**
+ * @return string This entry's raw line
+ */
+ public function getRaw() {
+ return $this->mRaw;
+ }
+
+ /**
+ * @return array This entry's options
+ */
+ public function getOptions() {
+ return $this->mOptions;
+ }
+
+ /**
+ * @return string Custom message for this entry
+ */
+ public function getCustomMessage() {
+ return isset( $this->mParams['errmsg'] ) ? $this->mParams['errmsg'] : null;
+ }
+
+ /**
+ * @return string The format version
+ */
+ public function getFormatVersion() { return $this->mFormatVersion; }
+
+ /**
+ * Set the format version
+ *
+ * @param $v string New version to set
+ */
+ public function setFormatVersion( $v ) { $this->mFormatVersion = $v; }
+
+ /**
+ * Return the error message name for the blacklist entry.
+ *
+ * @param $operation string Operation name (as in titleblacklist-forbidden message name)
+ *
+ * @return string The error message name
+ */
+ public function getErrorMessage( $operation ) {
+ $message = $this->getCustomMessage();
+ return $message ? $message : "titleblacklist-forbidden-{$operation}";
+ }
+}
+
+//@}
diff --git a/extensions/TitleBlacklist/TitleBlacklist.php b/extensions/TitleBlacklist/TitleBlacklist.php
new file mode 100644
index 00000000..68fb6778
--- /dev/null
+++ b/extensions/TitleBlacklist/TitleBlacklist.php
@@ -0,0 +1,86 @@
+<?php
+if ( !defined( 'MEDIAWIKI' ) ) {
+ exit( 1 );
+}
+
+// @{
+/**
+ * @file
+ * @ingroup Extensions
+ */
+
+$wgExtensionCredits['antispam'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'Title Blacklist',
+ 'author' => array( 'Victor Vasiliev', 'Fran Rogers' ),
+ 'version' => '1.4.2',
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:Title_Blacklist',
+ 'descriptionmsg' => 'titleblacklist-desc',
+);
+
+$dir = __DIR__;
+$wgExtensionMessagesFiles['TitleBlacklist'] = $dir . '/TitleBlacklist.i18n.php';
+$wgAutoloadClasses['TitleBlacklist'] = $dir . '/TitleBlacklist.list.php';
+$wgAutoloadClasses['TitleBlacklistHooks'] = $dir . '/TitleBlacklist.hooks.php';
+
+/** @defgroup Title blacklist source types
+ * @{
+ */
+define( 'TBLSRC_MSG', 0 ); ///< For internal usage
+define( 'TBLSRC_LOCALPAGE', 1 ); ///< Local wiki page
+define( 'TBLSRC_URL', 2 ); ///< Load blacklist from URL
+define( 'TBLSRC_FILE', 3 ); ///< Load from file
+/** @} */
+
+/**
+ * Array of title blacklist sources.
+ *
+ * Should be in array( name => source description ) format.
+ * See extension documentation for details of source description.
+ */
+$wgTitleBlacklistSources = array();
+
+/**
+ * Sets the sources which may work as a username filter.
+ *
+ * '*' is for all; false disables all.
+ *
+ * If you want to limit it to particular sources, use
+ * array( source name 1, source name 2 ).
+ * This may be useful when you have shared account creation system
+ * in order to avoid blacklist fragmentation.
+ */
+$wgTitleBlacklistUsernameSources = '*';
+
+$wgTitleBlacklistCaching = array(
+ 'warningchance' => 100,
+ 'expiry' => 900,
+ 'warningexpiry' => 600,
+);
+
+$dir = dirname( __FILE__ );
+
+// Register the API method
+$wgAutoloadClasses['ApiQueryTitleBlacklist'] = "$dir/api/ApiQueryTitleBlacklist.php";
+$wgAPIModules['titleblacklist'] = 'ApiQueryTitleBlacklist';
+
+$wgAvailableRights[] = 'tboverride'; // Implies tboverride-account
+$wgAvailableRights[] = 'tboverride-account'; // For account creation
+$wgGroupPermissions['sysop']['tboverride'] = true;
+
+$wgHooks['getUserPermissionsErrorsExpensive'][] = 'TitleBlacklistHooks::userCan';
+$wgHooks['AbortMove'][] = 'TitleBlacklistHooks::abortMove';
+$wgHooks['AbortNewAccount'][] = 'TitleBlacklistHooks::abortNewAccount';
+$wgHooks['AbortAutoAccount'][] = 'TitleBlacklistHooks::abortNewAccount';
+$wgHooks['CentralAuthAutoCreate'][] = 'TitleBlacklistHooks::centralAuthAutoCreate';
+$wgHooks['EditFilter'][] = 'TitleBlacklistHooks::validateBlacklist';
+$wgHooks['ArticleSaveComplete'][] = 'TitleBlacklistHooks::clearBlacklist';
+$wgHooks['UserCreateForm'][] = 'TitleBlacklistHooks::addOverrideCheckbox';
+
+$wgResourceModules['mediawiki.api.titleblacklist'] = array(
+ 'scripts' => 'mediawiki.api.titleblacklist.js',
+ 'localBasePath' => $dir . '/modules',
+ 'remoteExtPath' => 'TitleBlacklist/modules',
+ 'dependencies' => array( 'mediawiki.api' ),
+);
+// @}
diff --git a/extensions/TitleBlacklist/api/ApiQueryTitleBlacklist.php b/extensions/TitleBlacklist/api/ApiQueryTitleBlacklist.php
new file mode 100644
index 00000000..1da70d2a
--- /dev/null
+++ b/extensions/TitleBlacklist/api/ApiQueryTitleBlacklist.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * TitleBlacklist extension API
+ *
+ * Copyright © 2011 Wikimedia Foundation and Ian Baker <ian@wikimedia.org>
+ * Based on code by Victor Vasiliev, Bryan Tong Minh, Roan Kattouw, and Alex Z.
+ *
+ * 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
+ */
+
+/**
+ * Query module check a title against the blacklist
+ *
+ * @ingroup API
+ * @ingroup Extensions
+ */
+class ApiQueryTitleBlacklist extends ApiBase {
+
+ public function __construct( $query, $moduleName ) {
+ parent::__construct( $query, $moduleName, 'tb' );
+ }
+
+ public function execute() {
+ $params = $this->extractRequestParams();
+ $action = $params['action'];
+ $override = true;
+ if( isset( $params['nooverride'] ) ) {
+ $override = false;
+ }
+
+ // createtalk and createpage are useless as they're treated exactly like create
+ if ( $action === 'createpage' || $action === 'createtalk' ) {
+ $action = 'create';
+ }
+
+ $title = Title::newFromText( $params['title'] );
+ if ( !$title ) {
+ $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+ }
+
+ $blacklisted = TitleBlacklist::singleton()->userCannot( $title, $this->getUser(), $action, $override );
+ if ( $blacklisted instanceof TitleBlacklistEntry ) {
+ // this title is blacklisted.
+ $result = array(
+ htmlspecialchars( $blacklisted->getRaw() ),
+ htmlspecialchars( $params['title'] ),
+ );
+
+ $res = $this->getResult();
+ $res->addValue( 'titleblacklist', 'result', 'blacklisted' );
+ // there aren't any messages for create(talk|page), using edit for those instead
+ $message = $blacklisted->getErrorMessage( $action !== 'create' ? $action : 'edit' );
+ $res->addValue( 'titleblacklist', 'reason', wfMessage( $message, $result )->text() );
+ $res->addValue( 'titleblacklist', 'message', $message );
+ $res->addValue( 'titleblacklist', 'line', htmlspecialchars( $blacklisted->getRaw() ) );
+ } else {
+ // not blacklisted
+ $this->getResult()->addValue( 'titleblacklist', 'result', 'ok' );
+ }
+ }
+
+ public function getAllowedParams() {
+ return array(
+ 'title' => array(
+ ApiBase::PARAM_REQUIRED => true,
+ ),
+ 'action' => array(
+ ApiBase::PARAM_DFLT => 'edit',
+ ApiBase::PARAM_ISMULTI => false,
+ ApiBase::PARAM_TYPE => array(
+ // createtalk and createpage are useless as they're treated exactly like create
+ 'create', 'edit', 'upload', 'createtalk', 'createpage', 'move', 'new-account'
+ ),
+ ),
+ 'nooverride' => array(
+ )
+ );
+ }
+
+ public function getParamDescription() {
+ return array(
+ 'title' => 'The string to validate against the blacklist',
+ 'nooverride' => 'Don\'t try to override the titleblacklist',
+ 'action' => 'The thing you\'re trying to do',
+ );
+ }
+
+ public function getDescription() {
+ return 'Validate an article title, filename, or username against the TitleBlacklist.';
+ }
+
+ public function getExamples() {
+ return array(
+ 'api.php?action=titleblacklist&tbtitle=Foo',
+ 'api.php?action=titleblacklist&tbtitle=Bar&tbaction=edit',
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id$';
+ }
+}
diff --git a/extensions/TitleBlacklist/modules/mediawiki.api.titleblacklist.js b/extensions/TitleBlacklist/modules/mediawiki.api.titleblacklist.js
new file mode 100644
index 00000000..63d12294
--- /dev/null
+++ b/extensions/TitleBlacklist/modules/mediawiki.api.titleblacklist.js
@@ -0,0 +1,67 @@
+/**
+ * @class mw.Api.plugin.titleblacklist
+ */
+( function ( mw, $ ) {
+
+ $.extend( mw.Api.prototype, {
+ /**
+ * Convinience method for `action=titleblacklist`.
+ *
+ * @param {mw.Title|string} title
+ * @param {Function} [ok] Success callback (deprecated)
+ * @param {Function} [err] Error callback (deprecated)
+ * @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {Object|boolean} return.done.result False if title wasn't blacklisted, an object with 'reason', 'line'
+ * and 'message' properties if title was blacklisted.
+ */
+ isBlacklisted: function ( title, ok, err ) {
+ var d = $.Deferred();
+ // Backwards compatibility (< MW 1.20)
+ d.done( ok );
+ d.fail( err );
+
+ this.get( {
+ action: 'titleblacklist',
+ tbaction: 'create',
+ tbtitle: title.toString()
+ } )
+ .done( function ( data ) {
+ var result;
+
+ // this fails open (if nothing valid is returned by the api, allows the title)
+ // also fails open when the API is not present, which will be most of the time
+ // as this API module is part of the TitleBlacklist extension.
+ if ( data.titleblacklist && data.titleblacklist.result && data.titleblacklist.result === 'blacklisted' ) {
+ if ( data.titleblacklist.reason ) {
+ result = {
+ reason: data.titleblacklist.reason,
+ line: data.titleblacklist.line,
+ message: data.titleblacklist.message
+ };
+ } else {
+ mw.log( 'mw.Api.titleblacklist::isBlacklisted> no reason data for blacklisted title', 'debug' );
+ result = {
+ reason: 'Blacklisted, but no reason supplied',
+ line: 'Unknown',
+ message: null
+ };
+ }
+ d.resolve( result );
+ } else {
+ d.resolve( false );
+ }
+ } )
+ .fail( d.reject );
+
+ return d.promise();
+ }
+
+ } );
+
+ /**
+ * @class mw.Api
+ * @mixins mw.Api.plugin.titleblacklist
+ */
+
+}( mediaWiki, jQuery ) );
diff --git a/extensions/Vector/.gitreview b/extensions/Vector/.gitreview
deleted file mode 100644
index 8d06d24a..00000000
--- a/extensions/Vector/.gitreview
+++ /dev/null
@@ -1,5 +0,0 @@
-[gerrit]
-host=gerrit.wikimedia.org
-port=29418
-project=mediawiki/extensions/Vector.git
-defaultbranch=master
diff --git a/extensions/Vector/Vector.hooks.php b/extensions/Vector/Vector.hooks.php
index 8d28f614..50cec461 100644
--- a/extensions/Vector/Vector.hooks.php
+++ b/extensions/Vector/Vector.hooks.php
@@ -31,20 +31,6 @@ class VectorHooks {
'collapsibletabs' => array(
'modules' => array( 'ext.vector.collapsibleTabs' ),
),
- 'editwarning' => array(
- 'preferences' => array(
- // Ideally this would be 'vector-editwarning'
- 'useeditwarning' => array(
- 'type' => 'toggle',
- 'label-message' => 'vector-editwarning-preference',
- 'section' => 'editing/advancedediting',
- ),
- ),
- 'requirements' => array(
- 'useeditwarning' => true,
- ),
- 'modules' => array( 'ext.vector.editWarning' ),
- ),
'expandablesearch' => array(
'requirements' => array( 'vector-simplesearch' => true ),
'modules' => array( 'ext.vector.expandableSearch' ),
diff --git a/extensions/Vector/Vector.i18n.php b/extensions/Vector/Vector.i18n.php
index 3b142a90..2c4e4b41 100644
--- a/extensions/Vector/Vector.i18n.php
+++ b/extensions/Vector/Vector.i18n.php
@@ -16,9 +16,6 @@ $messages['en'] = array(
'vector-desc' => 'Enhances the user interface when using the Vector skin',
'vector-collapsiblenav-preference' => 'Enable collapsing of items in the sidebar in Vector skin',
'vector-collapsiblenav-more' => 'More languages',
- 'vector-editwarning-warning' => 'Leaving this page may cause you to lose any changes you have made.
-If you are logged in, you can disable this warning in the "Editing" section of your preferences.',
- 'vector-editwarning-preference' => 'Warn me when I leave an edit page with unsaved changes',
'vector-simplesearch-search' => 'Search',
'vector-simplesearch-containing' => 'containing...',
'vector-noexperiments-preference' => 'Exclude me from feature experiments',
@@ -31,12 +28,13 @@ If you are logged in, you can disable this warning in the "Editing" section of y
* @author Fryed-peach
* @author Lloffiwr
* @author Nemo bis
+ * @author Shirayuki
* @author Srtxg
* @author Umherirrender
*/
$messages['qqq'] = array(
'vector' => 'UI means User Interface. Vector is the name of an interface skin.',
- 'vector-desc' => '{{desc}}',
+ 'vector-desc' => '{{desc|name=Vector|url=http://www.mediawiki.org/wiki/Extension:Vector}}',
'vector-collapsiblenav-preference' => 'The message refers to the sidebar, whose sections are collapsible in Vector skin (some of them collapsed by default and some no); the preference disables collapsing entirely and is among "Advanced options" in the "Appearence" section.',
'vector-editwarning-warning' => "{{doc-important|Do ''not'' use <nowiki>{{int:prefs-editing}}</nowiki> for \"Editing\". It is forbidden in this message, see [[mwr:68405]].}}
@@ -115,11 +113,12 @@ $messages['an'] = array(
* @author Alexknight12
* @author DRIHEM
* @author Meno25
+ * @author Mido
* @author OsamaK
*/
$messages['ar'] = array(
'vector' => 'تحسينات واجهة المستخدم Ù„Ùكتور',
- 'vector-desc' => 'تحسينات ÙÙŠ عناصر واجهة المستخدم لواجهة Ùكتور.', # Fuzzy
+ 'vector-desc' => 'تحسينات ÙÙŠ عناصر واجهة المستخدم لواجهة Ùكتور.',
'vector-collapsiblenav-preference' => 'مكّن طي العناصر ÙÙŠ قائمة التصÙØ­ ÙÙŠ واجهة Ùكتور',
'vector-collapsiblenav-more' => 'لغات أخرى',
'vector-editwarning-warning' => 'قد تتسبب مغادرة هذه الصÙحة بخسارتك لأي تغييرات قمت بها.
@@ -129,14 +128,15 @@ $messages['ar'] = array(
'vector-simplesearch-containing' => 'يحتوي...',
'vector-noexperiments-preference' => 'استبعدني من تجارب الخاصية',
'vector-footercleanup-transclusion' => 'هذه الصÙحة تحتوي على {{PLURAL:$1تضمين|تضمينات}} لـ {{PLURAL:$1|صÙحة واحدة أخرى|$1 صÙحات أخرى}}.',
+ 'vector-footercleanup-templates' => 'عرض القوالب ÙÙŠ هذه الصÙحة',
);
/** Aramaic (ÜܪܡÜÜ)
* @author Basharh
*/
$messages['arc'] = array(
- 'vector-editwarning-warning' => 'ÜÜ¢ Ü«Ü’Ü© Üܢܬ ܦÜÜ¬Ü Ü—Ü•Ü Ü¡Ü¬Ü¡Ü¨ÜÜ¢Ü¬Ü ÜÜܬÜÜ— ܕܚܣܪ Üܢܬ ÜŸÜ  Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü•Ü¥Ü’ÜÜ• Üܢܬ ܗܪܟÜ.
-Ü¡Ü¨Ü Üܢܬ ܕܬܒܛܠ Ü™Ü˜Ü—ÜªÜ Ü—Ü¢Ü ÜÜ¢ ܥܠÜÜ Ü ÜÜܬÜÜŸ Ü’Ü¡Ü¢Ü¬Ü Ü•"ܫܚܠܦܬÜ" ܒܨܒÜÜ¢Üܘܬ̈Ü.',
+ 'vector-editwarning-warning' => 'ÜÜ¢ ܫܒܩܬ ܦÜÜ¬Ü Ü—Ü•Ü Ü¡Ü¬Ü¡Ü¨ÜÜ¢Ü¬Ü ÜÜܬÜÜ— ܕܚܣܪܬ ÜŸÜ  Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü•Ü¥Ü’Üܕܬ ܗܪܟÜ.
+ܡܨܬ ܕܬܒܛܠ Ü™Ü˜Ü—ÜªÜ Ü—Ü¢Ü ÜÜ¢ ܥܠÜÜ Ü ÜÜܬÜÜŸ Ü’Ü¡Ü¢Ü¬Ü Ü•"ܫܚܠܦܬÜ" ܒܨܒÜÜ¢Üܘܬ̈Ü.',
'vector-editwarning-preference' => 'ܙܗܪ Ü Ü ÜÜ¡Ü¬Ü Ü«Ü’Ü© ÜÜ¢Ü Ü¦ÜÜ¬Ü Ü•Ü«Ü˜ÜšÜ Ü¦Ü Ü•ÜÜܬ Ü’Ü— Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü Ü Ü Ü’Üܟ̈Ü',
'vector-simplesearch-search' => 'ܒܨÜ',
'vector-simplesearch-containing' => 'ܬܚܒܘܫ...',
@@ -166,7 +166,7 @@ $messages['arz'] = array(
*/
$messages['as'] = array(
'vector' => 'ভেকà§à¦Ÿà§°à§° বাবে বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€ যোগাযোগৰ উনà§à¦¨à¦¤à¦¿ সাধন',
- 'vector-desc' => "ভেকà§à¦Ÿà§° আৱৰণৰ বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€ ইণà§à¦Ÿà¦¾à§°à¦«à§‡'চ উপাদানৰ উনà§à¦¨à¦¤à¦¿ সাধন।", # Fuzzy
+ 'vector-desc' => "ভেকà§à¦Ÿà§° আৱৰণৰ বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€à§° ইণà§à¦Ÿà¦¾à§°à¦«à§‡'চ উপাদানৰ উনà§à¦¨à¦¤à¦¿ সাধন কৰে।",
'vector-collapsiblenav-preference' => 'ভেকà§à¦Ÿà§° আৱৰণত ভাà¦à¦œà¦¯à§à¦•à§à¦¤ নেভিগছন মেনৠসকà§à§°à¦¿à¦¯à¦¼ কৰক',
'vector-collapsiblenav-more' => 'অধিক ভাষা',
'vector-editwarning-warning' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹ à¦à§°à¦¿à¦²à§‡ আপà§à¦¨à¦¿ কৰা পৰিবৰà§à¦¤à¦¨à¦¸à¦®à§‚হ হেৰাব পাৰে। যদি আপà§à¦¨à¦¿ পà§à§°à§±à§‡à¦¶ কৰা অৱসà§à¦¥à¦¾à¦¤ আছে, আপà§à¦¨à¦¿ à¦à¦‡ সতৰà§à¦•à¦¬à¦¾à§°à§à¦¤à¦¾à¦• আপোনাৰ পছনà§à¦¦à¦¸à¦®à§‚হৰ "সমà§à¦ªà¦¾à¦¦à¦¨à¦¾" অংশত অসামৰà§à¦¥à¦¬à¦¾à¦¨ কৰিব পাৰিব।',
@@ -175,6 +175,8 @@ $messages['as'] = array(
'vector-simplesearch-containing' => 'যি আছে...',
'vector-noexperiments-preference' => 'ভৱিষà§à¦¯à¦¤à§° পৰীকà§à¦·à¦¾à¦¬à§‹à§°à§° পৰা মোক ৰেহাই দিয়ক',
'vector-footercleanup-transclusion' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦Ÿà§‹à§±à§‡ {{PLURAL:$1|অনà§à¦¯ à¦à¦Ÿà¦¾ পৃষà§à¦ à¦¾à§°|$1 অনà§à¦¯ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ}} {{PLURAL:$1|বেষà§à¦Ÿà¦¨|বেষà§à¦Ÿà¦¨à¦¸à¦®à§‚হ}} অনà§à¦¤à§°à§à¦­à§à¦•à§à¦¤ কৰে।',
+ 'vector-footercleanup-templates' => 'à¦à¦‡ পৃষà§à¦ à¦¾à§° সংলগà§à¦¨ সাà¦à¦š চাওক',
+ 'vector-footercleanup-categories' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦¤ সনà§à¦¨à¦¿à¦¬à¦¿à¦·à§à¦Ÿ অদৃশà§à¦¯ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ চাওক',
);
/** Asturian (asturianu)
@@ -205,6 +207,18 @@ $messages['az'] = array(
'vector-simplesearch-search' => 'Axtar',
);
+/** South Azerbaijani (تورکجه)
+ * @author Amir a57
+ * @author E THP
+ * @author Ebrahimi-amir
+ * @author Mousa
+ */
+$messages['azb'] = array(
+ 'vector-collapsiblenav-more' => 'آیری دیل‌لر',
+ 'vector-editwarning-preference' => 'دَییشدیرمه صحیÙه‌سینده چیخیش زامانی، آچیق Ùˆ قئید اولمایان دَییشدیرمه صحیÙÙ‡ وارسا منه هشدار وئریلسین',
+ 'vector-simplesearch-search' => 'آختار',
+);
+
/** Bashkir (башҡортÑа)
* @author Assele
*/
@@ -278,6 +292,7 @@ $messages['be-tarask'] = array(
/** Bulgarian (българÑки)
* @author DCLXVI
* @author Spiritia
+ * @author Stanqo
* @author Turin
*/
$messages['bg'] = array(
@@ -290,6 +305,8 @@ $messages['bg'] = array(
'vector-editwarning-preference' => 'Предупреждаване при опит за напуÑкане на Ñтраница, отворена в режим на редактиране, без да Ñа запазени промените',
'vector-simplesearch-search' => 'ТърÑене',
'vector-noexperiments-preference' => 'Ðе Ð¶ÐµÐ»Ð°Ñ Ð´Ð° учаÑтвам в бъдещи екÑперименти',
+ 'vector-footercleanup-templates' => 'Преглеждане на шаблоните в Ñтраницата',
+ 'vector-footercleanup-categories' => 'Показване на Ñкритите категории за тази Ñтраница',
);
/** Banjar (Bahasa Banjar)
@@ -371,6 +388,7 @@ Ako ste prijavljeni, možete iskljuÄiti ovo upozorenje u "VeliÄine tekstualnog
);
/** Catalan (català)
+ * @author Anskar
* @author Grondin
* @author Paucabot
* @author SMP
@@ -378,7 +396,7 @@ Ako ste prijavljeni, možete iskljuÄiti ovo upozorenje u "VeliÄine tekstualnog
*/
$messages['ca'] = array(
'vector' => 'Millores de la interfície per a Vector',
- 'vector-desc' => "Millores en els elements d'interfície d'usuari de l'aparença Vector.", # Fuzzy
+ 'vector-desc' => "Millores en els elements d'interfície d'usuari de l'aparença Vector.",
'vector-collapsiblenav-preference' => "Activa l'opció de plegar els menús de navegació en l'aparença Vector",
'vector-collapsiblenav-more' => 'Més llengües',
'vector-editwarning-warning' => "Si sortiu d'aquesta pàgina perdreu tots els canvis que hàgiu fet.
@@ -388,6 +406,8 @@ Si teniu un compte d'usuari, podeu eliminar aquest avís a la secció «Caixa d'
'vector-simplesearch-containing' => 'que conté ...',
'vector-noexperiments-preference' => 'Exclou-me dels experiments de funcionalitats',
'vector-footercleanup-transclusion' => "Aquesta pàgina conté {{PLURAL:$1|una transclusió d'una altra pàgina|unes transclusions de $1 altres pàgines}}.",
+ 'vector-footercleanup-templates' => "Mostra les plantilles d'aquesta pàgina",
+ 'vector-footercleanup-categories' => "Mostra les categories ocultes d'aquesta pàgina",
);
/** Chechen (нохчийн)
@@ -399,6 +419,7 @@ $messages['ce'] = array(
/** Sorani Kurdish (کوردی)
* @author Asoxor
+ * @author Calak
* @author Marmzok
*/
$messages['ckb'] = array(
@@ -409,6 +430,9 @@ $messages['ckb'] = array(
'vector-editwarning-preference' => 'ھۆشیارم بکەوە کاتێک لە پەڕەیەکی دەستکاری بە گۆڕانکاریی پاشەکەوت‌نەکراو دەردەچم',
'vector-simplesearch-search' => 'گەڕان',
'vector-simplesearch-containing' => 'بە لەبەرگرتنەوەی ...',
+ 'vector-noexperiments-preference' => 'من لە تایبەتمەندییەکانی تاقیکردنەوە ھەڵاوێرە',
+ 'vector-footercleanup-templates' => 'داڕێژەکانی ئەم پەڕەیە ببینە',
+ 'vector-footercleanup-categories' => 'پۆلە شاردراوەکانی ئەم پەڕەیە ببینە',
);
/** Crimean Turkish (Cyrillic script) (къырымтатарджа (Кирилл)‎)
@@ -474,16 +498,15 @@ $messages['cv'] = array(
*/
$messages['cy'] = array(
'vector' => "Gwelliannau i'r rhyngwyneb ar gyfer Vector",
- 'vector-desc' => 'Yn gwella ar y rhyngwyneb yn y wedd Vector.', # Fuzzy
+ 'vector-desc' => 'Yn gwella ar y rhyngwyneb yn y wedd Vector.',
'vector-collapsiblenav-preference' => "Galluogi crebachu'r ddewislen lywio yn y wedd Vector",
'vector-collapsiblenav-more' => 'Rhagor o ieithoedd',
- 'vector-editwarning-warning' => 'Os y gadewch y dudalen hon mae\'n bosib y collwch eich newidiadau iddi.
-Gallwch ddiddymu\'r rhybudd hwn yn yr adran "Golygu" yn eich dewisiadau.',
- 'vector-editwarning-preference' => "Tynnwch fy sylw pan wyf ar fin gadael tudalen olygu heb roi'r newidiadau ar gadw",
'vector-simplesearch-search' => 'Chwilio',
'vector-simplesearch-containing' => 'yn cynnwys...',
'vector-noexperiments-preference' => "Peidio â'm cynnwys mewn arbrofion ar y nodweddion",
'vector-footercleanup-transclusion' => "Mae'r dudalen hon yn cynnwys {{PLURAL:$1||tudalen|$1 dudalen|$1 tudalen|$1 thudalen|$1 tudalen}} sydd wedi cael {{PLURAL:$1||ei thrawsgynnwys|eu trawsgynnwys}}.",
+ 'vector-footercleanup-templates' => 'Gweld nodiadau ar y dudalen hon.',
+ 'vector-footercleanup-categories' => 'Gweld categorïau cudd ar y dudalen hon',
);
/** Danish (dansk)
@@ -528,7 +551,7 @@ Als angemeldeter Benutzer kann das Anzeigen dieser Warnung im „Bearbeiten“-B
'vector-simplesearch-containing' => 'Volltextsuche nach …',
'vector-noexperiments-preference' => 'Nicht an Funktionsexperimenten teilnehmen',
'vector-footercleanup-transclusion' => 'In diese Seite {{PLURAL:$1|wurde eine Seite|wurden $1 Seiten}} eingebunden.',
- 'vector-footercleanup-templates' => 'Vorlagen auf dieser Seite anzeigen',
+ 'vector-footercleanup-templates' => 'Auf dieser Seite eingebundene Vorlagen anzeigen',
'vector-footercleanup-categories' => 'Versteckte Kategorien auf dieser Seite anzeigen',
);
@@ -604,7 +627,7 @@ $messages['el'] = array(
*/
$messages['eo'] = array(
'vector' => 'Plibonigado de grafika interfaco por Vector',
- 'vector-desc' => 'Plibonigas la elementojn de la uzula interfaco de la Vector-etoso.', # Fuzzy
+ 'vector-desc' => 'Plibonigas la uzula interfaco kiam oni lernas Vector-etoson.',
'vector-collapsiblenav-preference' => 'Åœalti kaÅebladon de aĵoj en la dekstra navigmenuo kun etoso Vector',
'vector-collapsiblenav-more' => 'Pli lingvoj',
'vector-editwarning-warning' => 'Forlasante ĉi tiun paÄon kaÅ­zos al vi perdi iun ajn ÅanÄojn kiujn vi faris.
@@ -614,6 +637,7 @@ Se vi ensalutas, vi povas malÅalti ĉi tiun averton en la sekcio "Grandeco de r
'vector-simplesearch-containing' => 'enhavas...',
'vector-noexperiments-preference' => 'Ekskluzivu min de estontecaj testoj',
'vector-footercleanup-transclusion' => 'Ĉi tiu paÄo enhavas {{PLURAL:$1|transinkluzivaĵon|transinkluzivaĵojn}} de {{PLURAL:$1|unu alia paÄo|$1 aliaj paÄoj}}.',
+ 'vector-footercleanup-templates' => 'Rigardi Åablonojn en ĉi tiu paÄo',
);
/** Spanish (español)
@@ -703,6 +727,7 @@ $messages['fa'] = array(
* @author Nike
* @author Olli
* @author Str4nd
+ * @author VezonThunder
*/
$messages['fi'] = array(
'vector' => 'Käyttöliittymän parannukset Vectorille',
@@ -715,6 +740,7 @@ Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä as
'vector-simplesearch-search' => 'Hae',
'vector-simplesearch-containing' => 'sisältää...',
'vector-noexperiments-preference' => 'Älä ota minua mukaan ominaisuuskokeiluihin',
+ 'vector-footercleanup-transclusion' => 'Tälle sivulle on sisällytetty {{PLURAL:$1|yksi muu sivu|$1 muuta sivua}}.',
'vector-footercleanup-templates' => 'Näytä mallineet tällä sivulla',
'vector-footercleanup-categories' => 'Näytä piilotetut luokat tällä sivulla',
);
@@ -767,6 +793,25 @@ Se vos éte branchiê, vos pouede enlevar ceti avèrtissement dens la sèccion Â
'vector-noexperiments-preference' => 'M’èxcllure des èxpèriences de novèles fonccionalitâts',
);
+/** Northern Frisian (Nordfriisk)
+ * @author Murma174
+ */
+$messages['frr'] = array(
+ 'vector' => 'Ferbeedrangen för di skak „Vector“',
+ 'vector-desc' => 'Muar ferbeedrangen för di skak „Vector“ mögelk maage',
+ 'vector-collapsiblenav-preference' => "Det fersteegen faan elementen uun't nawigatsjuunsmenu bi „Vector“ aktiwiare",
+ 'vector-collapsiblenav-more' => 'Muar spriaken',
+ 'vector-editwarning-warning' => 'Wan dü detheer sidj slotst, kön feranrangen ferleesen gung.
+Üs uunmeldet brüker könst dü detheer wäärnang bi din iinstelangen oner „Bewerke“ wechknipse.',
+ 'vector-editwarning-preference' => 'Waarskaue mi, wan en sidj slööden woort, huar noch ünseekert feranrangen maaget wurden san',
+ 'vector-simplesearch-search' => 'Sjük',
+ 'vector-simplesearch-containing' => 'Uun di tekst sjük efter …',
+ 'vector-noexperiments-preference' => 'Ik wal ei bi eksperimenten tu nei funktsjuunen mämaage',
+ 'vector-footercleanup-transclusion' => 'Uun detdiar sidj {{PLURAL:$1|as ian sidj muar|san $1 sidjen muar}} iinbünjen.',
+ 'vector-footercleanup-templates' => 'Wise föörlaagen uun, diar faan detheer sidj brükt wurd',
+ 'vector-footercleanup-categories' => 'Wise ferstäächt kategoriin faan detheer sidj uun',
+);
+
/** Friulian (furlan)
* @author Klenje
*/
@@ -802,7 +847,7 @@ $messages['gan-hant'] = array(
*/
$messages['gd'] = array(
'vector' => 'Leasachaidhean an UI airson Vector',
- 'vector-desc' => 'Cuiridh seo piseach air eileamaidean eadar-aghaidh nan cleachdaichean san chraiceann Vector.', # Fuzzy
+ 'vector-desc' => 'Cuiridh seo piseach air eileamaidean eadar-aghaidh nan cleachdaichean san chraiceann Vector.',
'vector-collapsiblenav-preference' => 'Cuir an comas dùmhlachadh nan rudan san chlàr-taice seòlaidh san chraiceann Vector',
'vector-collapsiblenav-more' => 'Barrachd chànan',
'vector-editwarning-warning' => 'Ma dh\'fhàgas tu an duilleag seo, faodaidh gun caill thu mùthadh sam bith a rinn thu.
@@ -1146,7 +1191,7 @@ $messages['jv'] = array(
*/
$messages['ka'] = array(
'vector' => 'ვექტáƒáƒ áƒ£áƒšáƒ˜ თემის ინტერფეისის გáƒáƒ£áƒ›áƒ¯áƒáƒ‘ესებáƒ',
- 'vector-desc' => 'ვექტáƒáƒ áƒ£áƒšáƒ˜ თემის სáƒáƒ›áƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლრინტერფეისის გáƒáƒ£áƒ›áƒ¯áƒáƒ‘ესებáƒ', # Fuzzy
+ 'vector-desc' => 'áƒáƒ£áƒ›áƒ¯áƒáƒ‘ესებს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ინტერფეისს გáƒáƒ¤áƒáƒ áƒ›áƒ”ბის ვექტáƒáƒ áƒ£áƒšáƒ˜ თემისáƒáƒ—ვის',
'vector-collapsiblenav-preference' => 'დáƒáƒ áƒ—ეთ მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• "ვექტáƒáƒ " დიზáƒáƒ˜áƒœáƒ¨áƒ˜ ბლáƒáƒ™áƒ”ბის ჩáƒáƒ™áƒ”ცვáƒ',
'vector-collapsiblenav-more' => 'დáƒáƒ›áƒáƒ¢áƒ”ბითი ენები',
'vector-editwarning-warning' => 'სხვრგვერდზე გáƒáƒ“áƒáƒ¡áƒ•áƒšáƒ გáƒáƒ›áƒáƒ˜áƒ¬áƒ•áƒ”ვს ცვლილებების დáƒáƒ™áƒáƒ áƒ’ვáƒáƒ¡.',
@@ -1155,6 +1200,8 @@ $messages['ka'] = array(
'vector-simplesearch-containing' => 'შეიცáƒáƒ•áƒ¡...',
'vector-noexperiments-preference' => 'გáƒáƒ›áƒáƒ›áƒ áƒ˜áƒªáƒ®áƒ” შემდგáƒáƒ›áƒ˜ ექსპერიმენტებისგáƒáƒœ.',
'vector-footercleanup-transclusion' => 'ეს გვერდი შეიცáƒáƒ•áƒ¡ {{PLURAL:$1|ერთი სხვრგვერდის|$1 სხვრგვერდის}} {{PLURAL:$1|ჩáƒáƒœáƒáƒ áƒ—ს|ჩáƒáƒœáƒáƒ áƒ—ს}}.',
+ 'vector-footercleanup-templates' => 'áƒáƒ› გვერდზე გáƒáƒ›áƒáƒ§áƒ”ნებული თáƒáƒ áƒ’ების ხილვáƒ',
+ 'vector-footercleanup-categories' => 'áƒáƒ› გვერდის დáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜ კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ბის ხილვáƒ',
);
/** Kazakh (Қазақша)
@@ -1187,6 +1234,7 @@ $messages['kl'] = array(
* @author គីមស៊្រុន
*/
$messages['km'] = array(
+ 'vector-collapsiblenav-preference' => 'ប្រើមុážáž„ារលាážáž”ើកលាážáž”ិទធាážáž»áž€áŸ’នុងរបារចំហៀងសំរាប់សំបកវ៉ិចទáŸážš',
'vector-collapsiblenav-more' => 'ភាសាផ្សáŸáž„ទៀáž',
'vector-editwarning-warning' => 'ចាកចáŸáž‰áž–ីទំពáŸážšáž“áŸáŸ‡ នឹងធ្វើឲ្យអ្នកបាážáŸ‹áž”ង់កំណែប្រែដែលអ្នកបានធ្វើ។
ប្រសិនបើអ្នកបានកážáŸ‹ážˆáŸ’មោះរួចហើយ អ្នកអាច​បិទ​បម្រាម​នáŸáŸ‡â€‹áž“ៅ​ក្នុងផ្នែក​ "កំណែប្រែ" នៃ​ចំណូល​ចិážáŸ’ážâ€‹ážšáž”ស់​អ្នក​។',
@@ -1203,19 +1251,16 @@ $messages['km'] = array(
* @author ì•„ë¼
*/
$messages['ko'] = array(
- 'vector' => '벡터 ìŠ¤í‚¨ì˜ ì¸í„°íŽ˜ì´ìŠ¤ í–¥ìƒ',
- 'vector-desc' => '벡터 ìŠ¤í‚¨ì„ ì‚¬ìš©í•  ë•Œ ì‚¬ìš©ìž ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ í–¥ìƒ',
- 'vector-collapsiblenav-preference' => '벡터 스킨ì—ì„œ 왼쪽 사ì´ë“œë°” 메뉴 접기',
+ 'vector' => '벡터 ìŠ¤í‚¨ì˜ ì‚¬ìš©ìž ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ í–¥ìƒ',
+ 'vector-desc' => '벡터 ìŠ¤í‚¨ì„ ì‚¬ìš©í•  ë•Œ ì‚¬ìš©ìž ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ í–¥ìƒí•©ë‹ˆë‹¤',
+ 'vector-collapsiblenav-preference' => '벡터 스킨ì—ì„œ 사ì´ë“œë°” 항목 접기 활성화',
'vector-collapsiblenav-more' => '기타 언어',
- 'vector-editwarning-warning' => 'ì´ ì°½ì—ì„œ 벗어나면 저장하지 ì•Šì€ íŽ¸ì§‘ì´ ëª¨ë‘ ì‚¬ë¼ì§‘니다.
-로그ì¸í•œ 경우, 환경 설정 "편집 ìƒìž"란ì—ì„œ ì´ ê²½ê³ ì°½ì„ ë„우지 ì•Šë„ë¡ ì„¤ì •í•  수 있습니다.',
- 'vector-editwarning-preference' => '수정한 ë‚´ìš©ì„ ì €ìž¥í•˜ì§€ ì•Šê³  편집 ì–‘ì‹ì„ 닫거나 다른 페ì´ì§€ë¡œ ì´ë™í•  ë•Œ 알림',
'vector-simplesearch-search' => '찾기',
'vector-simplesearch-containing' => 'ë‹¤ìŒ ì–´êµ¬ê°€ 들어간 문서 찾기',
- 'vector-noexperiments-preference' => '새 기능 실험ì—ì„œ 나를 제외합니다.',
- 'vector-footercleanup-transclusion' => 'ì´ íŽ˜ì´ì§€ëŠ” 다른 $1 페ì´ì§€ì˜ 트랜스í´ë£¨ì „ì´ í¬í•¨ë˜ì–´ 있습니다.',
- 'vector-footercleanup-templates' => 'ì´ ë¬¸ì„œì—ì„œ í‹€ 보기',
- 'vector-footercleanup-categories' => 'ì´ ë¬¸ì„œì—ì„œ ìˆ¨ì€ ë¶„ë¥˜ 보기',
+ 'vector-noexperiments-preference' => '기능 실험ì—ì„œ 나를 제외',
+ 'vector-footercleanup-transclusion' => 'ì´ ë¬¸ì„œëŠ” {{PLURAL:$1|다른 문서 í•œ ê°œ|다른 문서 $1ê°œ}}ì˜ {{PLURAL:$1|í‹€}}ì„ í¬í•¨í•©ë‹ˆë‹¤.',
+ 'vector-footercleanup-templates' => 'ì´ ë¬¸ì„œì— ì‚¬ìš©ëœ í‹€ 보기',
+ 'vector-footercleanup-categories' => 'ì´ ë¬¸ì„œì˜ ìˆ¨ì€ ë¶„ë¥˜ 보기',
);
/** Karachay-Balkar (къарачай-малкъар)
@@ -1262,16 +1307,19 @@ $messages['ku-latn'] = array(
);
/** Cornish (kernowek)
+ * @author Kernoweger
* @author Kw-Moon
* @author Nrowe
*/
$messages['kw'] = array(
'vector-collapsiblenav-more' => 'Moy yethow',
- 'vector-editwarning-warning' => 'Mar tewgh hwi ha gasa an folen-ma, hwi a alsa kelli chanjyow eus gwres genowgh.
-Mars owgh hwi omgelmys, hwi a ell dialosegi an gwarnyans-ma en trogh "Chanjya" agas dowisyansow.',
+ 'vector-editwarning-warning' => 'Mar tewgh why ha gasa an folen-ma, chanjyow eus gwres genowgh a alsa bos kellys.
+Mars owgh why omgelmys, why a yll dialosegy an gwarnyans-ma yn trogh "Chanjya" agas dowisyansow.',
'vector-editwarning-preference' => 'Gwra ow gwarnya pan wrellen vy gasa folen chanjya gans chanjyow nag eus gwithys',
- 'vector-simplesearch-search' => 'Hwilas',
- 'vector-simplesearch-containing' => 'ow senji...',
+ 'vector-simplesearch-search' => 'Whilas',
+ 'vector-simplesearch-containing' => 'ynno...',
+ 'vector-footercleanup-templates' => "Gweles an scantlyns war'n folen-ma",
+ 'vector-footercleanup-categories' => "Gweles an classys cudhys war'n folen-ma",
);
/** Latin (Latina)
@@ -1288,12 +1336,10 @@ $messages['lb'] = array(
'vector-desc' => "Verbessert am Benotzer-Interface Elementer wann d'Ausgesinn ''Vector'' benotzt gëtt.",
'vector-collapsiblenav-preference' => 'Zesummeklappe vun Objeten am Navigatiounsmenü am Vector-Ausgesinn aschalten',
'vector-collapsiblenav-more' => 'Méi Sproochen',
- 'vector-editwarning-warning' => 'Wann Dir dës Säit verloosst kann dat dozou féieren datt Dir all Ännerungen, déi Dir gemaach hutt, verléiert.
-Wann Dir ageloggt sidd, kënnt Dir dës Warnung an der Sektioun "Änneren" vun Ären Astellungen ausschalten.',
- 'vector-editwarning-preference' => "Mech warne wann ech d'Ännerung vun enger Säit verloosen, ouni Ännerunge gespäichert ze hunn",
'vector-simplesearch-search' => 'Sichen',
'vector-simplesearch-containing' => 'mat ...',
'vector-noexperiments-preference' => 'Mech vun Experimenter mat neie Fonctiounen eraushuelen',
+ 'vector-footercleanup-transclusion' => 'Op dëser Säit {{PLURAL:$1|ass eng Säit|sinn $1 Säiten}} agebonn.',
'vector-footercleanup-templates' => 'Schablounen op dëser Säit weisen',
'vector-footercleanup-categories' => 'Verstoppte Kategorien op dëser Säit weisen',
);
@@ -1362,17 +1408,20 @@ Ja esi pieteicies, jÅ«s vari atspÄ“jot Å¡o brÄ«dinÄjumu savÄs izvÄ“lÄ“s sadaļ
);
/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
* @author VoteITP
*/
$messages['min'] = array(
- 'vector' => 'Membaiki UI untuak Vektor',
- 'vector-desc' => 'Membaiki elemen pado antamuka pangguno dari kulit Vektor', # Fuzzy
- 'vector-collapsiblenav-preference' => 'Aktifkan fungsi menu navigasi yang dapek ditampilkan pado kulit Vektor',
- 'vector-collapsiblenav-more' => 'Labiah banyak baso',
- 'vector-editwarning-warning' => 'Maninggakan laman ko dapek maakibatkan parubahan yang awak buek hilang. Jiko awak lah masuak log, awak dapek maabaikan maklumat ko malalui "Suntingan" pado laman preferensi awak.',
- 'vector-editwarning-preference' => 'Ingekkan denai katiko denai maninggakan laman suntiang sabalun menyimpan parubahan',
+ 'vector' => 'Maningkekan UI untuak Vector',
+ 'vector-desc' => 'Maningkekan antamuka pangguno bilo mamakai kulik Vektor',
+ 'vector-collapsiblenav-preference' => 'Aktifkan fungsi menu bukak-tutuik pado sidebar di kulik Vektor',
+ 'vector-collapsiblenav-more' => 'Labiah banyak bahaso',
'vector-simplesearch-search' => 'Cari',
- 'vector-simplesearch-containing' => 'Barisi...',
+ 'vector-simplesearch-containing' => 'barisi...',
+ 'vector-noexperiments-preference' => 'Jan ikuikan Ambo jo uji-cubo fitur',
+ 'vector-footercleanup-transclusion' => 'Laman ko barisi {{PLURAL:$1|transklusi}} {{PLURAL:$1|$1 laman}}.',
+ 'vector-footercleanup-templates' => 'Caliak templat di laman ko',
+ 'vector-footercleanup-categories' => 'Caliak kategori tasuruak pado laman ko',
);
/** Macedonian (македонÑки)
@@ -1507,7 +1556,7 @@ Denne advarselen kan slås av under Redigering i instillingene dine.',
'vector-footercleanup-categories' => 'Vis skjulte kategorier på denne siden',
);
-/** Nedersaksisch (Nedersaksisch)
+/** Nedersaksies (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
@@ -1567,7 +1616,7 @@ Om du er innlogga, kan du slå av denne åtvaringa under «Endring» i instillin
$messages['oc'] = array(
'vector' => 'Melhoraments IU per Vector',
'vector-desc' => "Melhoraments dels elements de l'interfàcia d'utilizaire de l'abilhatge Vector.", # Fuzzy
- 'vector-collapsiblenav-preference' => "Activar lo menut de navigacion d'esquèrra replegable", # Fuzzy
+ 'vector-collapsiblenav-preference' => "Activar lo menú de navigacion a esquèrra replegable amb l'abilhatge vector",
'vector-editwarning-warning' => "Quitar aquesta pagina vos farà pèrdre totas las modificacions qu'avètz fachas.
Se sètz connectat amb vòstre compte, podètz levar aqueste avertiment dins la seccion Fenèstra de modificacion de vòstras preferéncias.",
'vector-editwarning-preference' => 'M’avisar quand quiti una pagina de modificacion sens publicar los cambiaments',
@@ -1576,13 +1625,14 @@ Se sètz connectat amb vòstre compte, podètz levar aqueste avertiment dins la
);
/** Oriya (ଓଡ଼ିଆ)
+ * @author Jnanaranjan Sahu
* @author Odisha1
* @author Psubhashish
* @author Shisir 1945
*/
$messages['or'] = array(
'vector' => 'ଭେକà­à¬Ÿà¬° ପାଇଠଇଉଜର ଇଣà­à¬Ÿà¬°à¬«à­‡à¬¸ ଉନà­à¬¨à¬¤à¬¿à¬•à¬°à¬£',
- 'vector-desc' => 'ଭେକà­à¬Ÿà¬° ଆବରଣରେ ଇଉଜର ଇଣà­à¬Ÿà¬°à¬«à­‡à¬¸ ଉପାଦାନସମୂହକୠଉନà­à¬¨à¬¤ କରିବେ ।', # Fuzzy
+ 'vector-desc' => 'ଭେକà­à¬Ÿà¬° ଆବରଣରେ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରà­à¬¥à¬¿à¬¬à¬¾ ବେଳେ ଇଉଜର ଇଣà­à¬Ÿà¬°à¬«à­‡à¬¸à¬•à­ ଉନà­à¬¨à¬¤ କରିବେ ।',
'vector-collapsiblenav-preference' => 'ଭେକà­à¬Ÿà¬° ବହିରାବରଣରେ କଡ଼ରେ ଥିବା ପଟିକାର ଚିଜ ସବà­à¬•à­ ଦେଖାଇବା-ଲà­à¬šà¬¾à¬‡à¬¬à¬¾ ସଚଳ କରିବେ',
'vector-collapsiblenav-more' => 'ଅଧିକ ଭାଷା',
'vector-editwarning-warning' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬•à­ ଛାଡ଼ି ଚାଲିଗଲେ ହà­à¬ ତ ଆପଣ କରିଥିବା କିଛି ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ହରାଇ ପାରନà­à¬¤à¬¿ ।
@@ -1592,6 +1642,16 @@ $messages['or'] = array(
'vector-simplesearch-containing' => 'ଧାରଣ ହେଉଛି...',
'vector-noexperiments-preference' => 'ସà­à¬¬à¬¿à¬§à¬¾à¬° ପରଖରୠମୋତେ ବାହାର କରିବେ',
'vector-footercleanup-transclusion' => 'à¬à¬¹à¬¿ ପୃଷà­à¬Ÿà¬¾à¬°à­‡ {{PLURAL:$1|one other page|$1 other pages}} ର {{PLURAL:$1|transclusion|transclusions}} ଅଛି',
+ 'vector-footercleanup-templates' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬°à­‡ ଥିବା ଟେମà­à¬ªà¬²à­‡à¬Ÿà¬—à­à¬¡à¬¿à¬•à­ ଦେଖିବେ',
+ 'vector-footercleanup-categories' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬°à­‡ ଲà­à¬šà¬¿à¬•à¬¿ ଥିବା ବିଭାଗଗà­à¬¡à¬¿à¬•à­ ଦେଖିବେ',
+);
+
+/** Ossetic (Ирон)
+ * @author Bouron
+ */
+$messages['os'] = array(
+ 'vector-simplesearch-search' => 'Ðгурын',
+ 'vector-simplesearch-containing' => 'кæдоны иÑ...',
);
/** Punjabi (ਪੰਜਾਬੀ)
@@ -1644,7 +1704,7 @@ Jeśli jesteś zalogowany, możesz wyłączyć wyświetlanie tego ostrzeżenia w
*/
$messages['pms'] = array(
'vector' => 'Ameliorament UI për Vector',
- 'vector-desc' => "Ameliorament ëd j'element dl'antërfacia utent dla pel Vector.", # Fuzzy
+ 'vector-desc' => "A ameliora l'antërfacia utent quand as deuvra la pel Vector",
'vector-collapsiblenav-preference' => "Abilité a stërmé j'element ant la bara ëd navigassion ant ël livel Vector",
'vector-collapsiblenav-more' => "Pì 'd lenghe",
'vector-editwarning-warning' => "Lassé sta pàgina-sì a peul fé an manera che it perde tute le modìfiche ch'it l'has fàit.
@@ -1654,6 +1714,8 @@ S'it ses logà, it peule disabilité st'avis-sì ant la session \"Quàder ëd mo
'vector-simplesearch-containing' => 'contenent ...',
'vector-noexperiments-preference' => "Gav-me da j'esperiment ëd le funsion",
'vector-footercleanup-transclusion' => "Costa pàgina a conten {{PLURAL:$1|transclusion|transclusion}} ëd {{PLURAL:$1|n'àutra pàgina|$1 àutre pàgine}}.",
+ 'vector-footercleanup-templates' => 'Smon-e jë stamp dzora sta pàgina',
+ 'vector-footercleanup-categories' => 'Vëdde le categorìe stërmà dzora sta pàgina',
);
/** Western Punjabi (پنجابی)
@@ -1682,13 +1744,16 @@ $messages['pnt'] = array(
* @author Ahmed-Najib-Biabani-Ibrahimkhel
*/
$messages['ps'] = array(
+ 'vector-collapsiblenav-preference' => 'د وکټور Ù¾ÙˆÚšÛ Ù¾Ù‡ څنګپټه Ú©Û Ø¯ توکو پرÚÛدنه چارنول',
'vector-collapsiblenav-more' => 'Ù†ÙˆØ±Û Ú˜Ø¨Û',
'vector-simplesearch-search' => 'پلټل',
+ 'vector-noexperiments-preference' => 'ما په آزمÛښتي Úانګړنو Ú©Û Ù…Ù‡ شمÛرÛ.',
);
/** Portuguese (português)
* @author Hamilton Abreu
* @author Helder.wiki
+ * @author Raylton P. Sousa
*/
$messages['pt'] = array(
'vector' => 'Melhorias da interface do tema Vector',
@@ -1701,7 +1766,9 @@ Se estiver autenticado, pode desactivar este aviso na secção "Edição" das pr
'vector-simplesearch-search' => 'Pesquisa',
'vector-simplesearch-containing' => 'contendo...',
'vector-noexperiments-preference' => 'Excluir-me da experimentação de funcionalidades',
- 'vector-footercleanup-transclusion' => 'Esta página contém a transclusão de {{PLURAL:$1|uma outra página|$1 outras páginas}}.',
+ 'vector-footercleanup-transclusion' => 'Esta página contém {{PLURAL:$1|transclusão|transclusões}} de {{PLURAL:$1|uma outra página|$1 outras páginas}}.',
+ 'vector-footercleanup-templates' => 'Ver predefinições utilizadas nesta página',
+ 'vector-footercleanup-categories' => 'Ver categorias ocultas nesta página',
);
/** Brazilian Portuguese (português do Brasil)
@@ -1709,6 +1776,7 @@ Se estiver autenticado, pode desactivar este aviso na secção "Edição" das pr
* @author Everton137
* @author Giro720
* @author Helder.wiki
+ * @author Raylton P. Sousa
*/
$messages['pt-br'] = array(
'vector' => 'Melhorias da IU do Vector',
@@ -1721,6 +1789,9 @@ Se você estiver autenticado, você pode desabilitar este aviso na seção "Opç
'vector-simplesearch-search' => 'Pesquisa',
'vector-simplesearch-containing' => 'contendo...',
'vector-noexperiments-preference' => 'Excluir-me da experimentação de funcionalidades',
+ 'vector-footercleanup-transclusion' => 'Esta página contém {{PLURAL:$1|transclusão|transclusões}} de {{PLURAL:$1|uma outra página|$1 outras páginas}}.',
+ 'vector-footercleanup-templates' => 'Ver predefinições utilizadas nesta página',
+ 'vector-footercleanup-categories' => 'Ver categorias ocultas nesta página',
);
/** Quechua (Runa Simi)
@@ -1728,7 +1799,7 @@ Se você estiver autenticado, você pode desabilitar este aviso na seção "Opç
*/
$messages['qu'] = array(
'vector' => 'Ruraqpaq uyapurapi Vector nisqapaq allinchasqakuna',
- 'vector-desc' => 'Ruraqpaq uyapurapi Vector qarap qallawankunata allinchan.', # Fuzzy
+ 'vector-desc' => "Vector qarawan llamk'aptiykiqa ruraqpaq uyapuratam allinchan.",
'vector-collapsiblenav-preference' => "Vector qarap wamp'unanpi qallawa pakana llamk'anata atichiy",
'vector-collapsiblenav-more' => 'Aswan rimaykuna',
'vector-editwarning-warning' => "Kay p'anqata saqispaykiqa lliw rurarqusqayki hukchasqakunatachá chinkachiykiman.
@@ -1765,13 +1836,12 @@ $messages['roa-tara'] = array(
'vector-desc' => "Migliore l'elemende de l'inderfacce utende quanne ause 'a visualizzazzione Vector",
'vector-collapsiblenav-preference' => "Abbilete 'a chiusure de le artichele jndr'à 'u menu de navigazione sus a 'u skin Vector",
'vector-collapsiblenav-more' => 'Cchiù linguagge',
- 'vector-editwarning-warning' => 'Assenne da sta pàgene tu puè perdè tutte le date ca è cangiate.
-Ce tu è trasute, tu puè disabbilità st\'avvertimende jndr\'à sezione "Cangiaminde..." de le preferenze tune.',
- 'vector-editwarning-preference' => "Avvisave quanne jie lasse 'na pàgene cangiate senze ca agghie sarvate le cangiaminde",
'vector-simplesearch-search' => 'Cirche',
'vector-simplesearch-containing' => 'tène...',
'vector-noexperiments-preference' => 'Escludeme da le funziune sperimendale',
+ 'vector-footercleanup-transclusion' => "Sta pàgene tène {{PLURAL:$1|inglusione|inglusiune}} de {{PLURAL:$1|'n'otra pàgene|$1 otre pàggene}}.",
'vector-footercleanup-templates' => "'Ndruche le template de sta pàgene",
+ 'vector-footercleanup-categories' => 'Vide le categorije scunnute sus a sta pàgene',
);
/** Russian (руÑÑкий)
@@ -1888,6 +1958,8 @@ $messages['si'] = array(
'vector-simplesearch-search' => 'ගවේà·à¶«à¶º කරන්න',
'vector-simplesearch-containing' => 'ඇතුළත් වෙමින් පවතී...',
'vector-noexperiments-preference' => 'ඉදිරි අත්හද෠බà·à¶½à·“ම් වලින් මà·à·€ බà·à·„à·à¶» කරන්න',
+ 'vector-footercleanup-templates' => 'මෙම පිටුව මත ඇති à·ƒà·à¶šà·’ලි නරඹන්න',
+ 'vector-footercleanup-categories' => 'මෙම පිටුව මත ඇති සඟවන ලද ප්â€à¶»à·€à¶»à·Šà¶œà¶ºà¶±à·Š නරඹන්න',
);
/** Slovak (slovenÄina)
@@ -2169,6 +2241,15 @@ $messages['tzm'] = array(
'vector-simplesearch-search' => 'ⴰⵔⵣⵣⵓ',
);
+/** Uyghur (Arabic script) (ئۇيغۇرچە)
+ * @author Sahran
+ */
+$messages['ug-arab'] = array(
+ 'vector-collapsiblenav-more' => 'تÛخىمۇ ÙƒÛ†Ù¾ تىللار',
+ 'vector-simplesearch-search' => 'ئىزدە',
+ 'vector-simplesearch-containing' => 'ئىچىدە…',
+);
+
/** Ukrainian (українÑька)
* @author AS
* @author Base
@@ -2178,7 +2259,7 @@ $messages['tzm'] = array(
*/
$messages['uk'] = array(
'vector' => 'УдоÑÐºÐ¾Ð½Ð°Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу кориÑтувача за допомогою «векторного» оформленнÑ',
- 'vector-desc' => 'Покращує елементи інтерфейÑу кориÑтувача за допомогою «векторного» оформленнÑ.', # Fuzzy
+ 'vector-desc' => 'Покращує Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ Â«Ð’ÐµÐºÑ‚Ð¾Ñ€Â»',
'vector-collapsiblenav-preference' => 'Дозволити Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð±Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ меню в оформленні «Векторне»',
'vector-collapsiblenav-more' => 'Інші мови',
'vector-editwarning-warning' => 'Перехід на іншу Ñторінку призведе до втрати ваших змін.
@@ -2205,20 +2286,22 @@ $messages['ur'] = array(
/** Uzbek (oʻzbekcha)
* @author CoderSI
+ * @author Sociologist
*/
$messages['uz'] = array(
- 'vector-collapsiblenav-preference' => '"Vektor" tashqi ko\'rinishida (skinida) chap menyu unsurlarini yoyishga ruxsat berish',
+ 'vector-collapsiblenav-preference' => '«Vektor» tashqi koʻrinishida chap menyudagi boʻlimlarni yashirishga ruxsat berish',
'vector-simplesearch-search' => 'Qidiruv',
'vector-noexperiments-preference' => 'Tajribaviy imkoniyatlarni tavsiya qilmaslik',
);
/** vèneto (vèneto)
* @author Candalua
+ * @author GatoSelvadego
* @author Vajotwo
*/
$messages['vec'] = array(
'vector' => 'Mejoramenti de interfacia utente (UI) par el Vector.',
- 'vector-desc' => "Mejora l'interfacia utente del tema Vector.", # Fuzzy
+ 'vector-desc' => "Potensia l'interfacia utente có se dopara el tema Vector",
'vector-collapsiblenav-preference' => 'Abiłita menù de navigaxion nascondibiłe par ła skin Vector',
'vector-collapsiblenav-more' => 'Pì łengue',
'vector-editwarning-warning' => 'Se te vè via da sta pagina te podaressi pèrdar tute le modìfeghe che te ghè fato.
@@ -2226,6 +2309,10 @@ Se te sì loggà, te poli disabilitar sto aviso in te la sezion "Dimension de la
'vector-editwarning-preference' => 'Dime se sto lassando na pagina de modifica sensa aver salvà',
'vector-simplesearch-search' => 'Serca',
'vector-simplesearch-containing' => 'che contien...',
+ 'vector-noexperiments-preference' => 'Escludame da łe funsionałità sperimentałi',
+ 'vector-footercleanup-transclusion' => "Sta pàjina ła contien {{PLURAL:$1|n'incluxion|de łe incluxion}} de {{PLURAL:$1|n'altra pàjina|$1 altre pàjine}}.",
+ 'vector-footercleanup-templates' => 'Mostra i modełi de sta pàjina',
+ 'vector-footercleanup-categories' => 'Mostra łe categorie sconte de sta pàjina',
);
/** Veps (vepsän kel’)
@@ -2338,22 +2425,21 @@ $messages['yue'] = array(
* @author Dimension
* @author Liangent
* @author Onecountry
+ * @author Xiaomingyan
* @author Yfdyh000
* @author 阿pp
*/
$messages['zh-hans'] = array(
'vector' => 'Vector用户界é¢æ”¹è¿›',
- 'vector-desc' => '改进Vector皮肤中的用户界é¢å…ƒç´ ã€‚', # Fuzzy
+ 'vector-desc' => '改进Vector皮肤中的用户界é¢å…ƒç´ ',
'vector-collapsiblenav-preference' => '在Vector皮肤的导航èœå•ä¸­æŠ˜å é¡¹ç›®',
'vector-collapsiblenav-more' => '更多语言',
- 'vector-editwarning-warning' => '离开这个页é¢å¯èƒ½ä¼šä»¤æ‚¨å¤±åŽ»ä¹‹å‰çš„所有更改。若您已ç»ç™»å…¥ï¼Œæ‚¨å¯åœ¨æ‚¨å‚数设置的“编辑â€ä¸€æ ä¸­å…³é—­æ­¤è­¦å‘Šã€‚',
- 'vector-editwarning-preference' => '如在更改未ä¿å­˜æ—¶ç¦»å¼€é¡µé¢ï¼Œåˆ™å‘出警告',
'vector-simplesearch-search' => 'æœç´¢',
'vector-simplesearch-containing' => 'å«æœ‰...',
'vector-noexperiments-preference' => '功能实验中排除我',
'vector-footercleanup-transclusion' => '此页{{PLURAL:$1|嵌入包å«}}有{{PLURAL:$1|一个其他页é¢|$1个其他页é¢}}。',
- 'vector-footercleanup-templates' => '查看该页调用的模æ¿',
- 'vector-footercleanup-categories' => '查看该页所属的éšè—类别',
+ 'vector-footercleanup-templates' => '查看该页é¢ä½¿ç”¨çš„模æ¿',
+ 'vector-footercleanup-categories' => '查看该页é¢çš„éšè—分类',
);
/** Traditional Chinese (中文(ç¹é«”)‎)
@@ -2361,12 +2447,13 @@ $messages['zh-hans'] = array(
* @author Gaoxuewei
* @author Liangent
* @author Mark85296341
+ * @author Simon Shek
* @author Waihorace
* @author Wrightbus
*/
$messages['zh-hant'] = array(
'vector' => 'Vector 使用者介é¢æ”¹é€²',
- 'vector-desc' => '改進 Vector 外觀中的使用者介é¢å…ƒç´ ã€‚', # Fuzzy
+ 'vector-desc' => '改善 Vector 外觀的使用者介é¢å…ƒç´ ã€‚',
'vector-collapsiblenav-preference' => '在 Vector 外觀的導覽é¸å–®ä¸­æ‘ºç–Šé …ç›®',
'vector-collapsiblenav-more' => '更多語言',
'vector-editwarning-warning' => '離開這個é é¢å¯èƒ½æœƒä»¤æ‚¨å¤±åŽ»ä¹‹å‰çš„所有更改。若您已經登入,您å¯åœ¨æ‚¨å好設定的「編輯ã€ç¯€ä¸­é—œé–‰æ­¤è­¦å‘Šã€‚',
diff --git a/extensions/Vector/Vector.php b/extensions/Vector/Vector.php
index 7a6f8535..a7e24673 100644
--- a/extensions/Vector/Vector.php
+++ b/extensions/Vector/Vector.php
@@ -19,7 +19,6 @@
$wgVectorFeatures = array(
'collapsiblenav' => array( 'global' => true, 'user' => true ),
'collapsibletabs' => array( 'global' => true, 'user' => false ),
- 'editwarning' => array( 'global' => false, 'user' => true ),
// The follwing are experimental and likely unstable - use at your own risk
'expandablesearch' => array( 'global' => false, 'user' => false ),
'footercleanup' => array( 'global' => false, 'user' => false ),
@@ -67,6 +66,11 @@ $vectorResourceTemplate = array(
'group' => 'ext.vector',
);
$wgResourceModules += array(
+ // TODO this module should be merged with ext.vector.collapsibleTabs
+ 'jquery.collapsibleTabs' => $vectorResourceTemplate + array(
+ 'scripts' => 'jquery.collapsibleTabs.js',
+ 'dependencies' => 'jquery.delayedBind',
+ ),
'ext.vector.collapsibleNav' => $vectorResourceTemplate + array(
'scripts' => 'ext.vector.collapsibleNav.js',
'styles' => 'ext.vector.collapsibleNav.css',
@@ -87,12 +91,6 @@ $wgResourceModules += array(
'jquery.delayedBind',
),
),
- 'ext.vector.editWarning' => $vectorResourceTemplate + array(
- 'scripts' => 'ext.vector.editWarning.js',
- 'messages' => array(
- 'vector-editwarning-warning',
- ),
- ),
'ext.vector.expandableSearch' => $vectorResourceTemplate + array(
'scripts' => 'ext.vector.expandableSearch.js',
'styles' => 'ext.vector.expandableSearch.css',
@@ -125,7 +123,6 @@ $wgResourceModules += array(
'styles' => 'ext.vector.sectionEditLinks.css',
'dependencies' => array(
'jquery.cookie',
- 'jquery.clickTracking',
),
),
);
diff --git a/extensions/Vector/modules/ext.vector.collapsibleNav.css b/extensions/Vector/modules/ext.vector.collapsibleNav.css
index fc9246b0..b9c27355 100644
--- a/extensions/Vector/modules/ext.vector.collapsibleNav.css
+++ b/extensions/Vector/modules/ext.vector.collapsibleNav.css
@@ -1,5 +1,7 @@
/**
* Stylesheet for collapsible nav
+ * NOTE: Please remove all the h5 selectors at some point as they are only for
+ * backwards-compatibility due to html caching. --2012-11-28
*/
#mw-panel.collapsible-nav .portal {
@@ -9,6 +11,7 @@
margin: -11px 9px 10px 11px;
}
+#mw-panel.collapsible-nav .portal h3,
#mw-panel.collapsible-nav .portal h5 {
color: #4D4D4D;
font-weight: normal;
@@ -18,11 +21,13 @@
margin-bottom: 0;
}
+#mw-panel.collapsible-nav .portal h3:hover,
#mw-panel.collapsible-nav .portal h5:hover {
cursor: pointer;
text-decoration: none;
}
+#mw-panel.collapsible-nav .portal h3 a,
#mw-panel.collapsible-nav .portal h5 a {
color: #4D4D4D;
text-decoration: none;
@@ -39,7 +44,7 @@
}
/* First */
-
+#mw-panel.collapsible-nav .portal.first h3,
#mw-panel.collapsible-nav .portal.first h5 {
display: none;
}
@@ -55,6 +60,7 @@
display: block;
}
+#mw-panel.collapsible-nav .portal.persistent h3,
#mw-panel.collapsible-nav .portal.persistent h5 {
background: none !important;
padding-left: 0.7em;
@@ -67,6 +73,7 @@
/* Collapsed */
+#mw-panel.collapsible-nav .portal.collapsed h3,
#mw-panel.collapsible-nav .portal.collapsed h5 {
color: #0645AD;
/* @embed */
@@ -74,10 +81,12 @@
margin-bottom: 0;
}
+#mw-panel.collapsible-nav .portal.collapsed h3 a,
#mw-panel.collapsible-nav .portal.collapsed h5 a {
color: #0645AD;
}
+#mw-panel.collapsible-nav .portal.collapsed h3:hover,
#mw-panel.collapsible-nav .portal.collapsed h5:hover {
text-decoration: underline;
}
diff --git a/extensions/Vector/modules/ext.vector.collapsibleNav.js b/extensions/Vector/modules/ext.vector.collapsibleNav.js
index 85143014..28a85676 100644
--- a/extensions/Vector/modules/ext.vector.collapsibleNav.js
+++ b/extensions/Vector/modules/ext.vector.collapsibleNav.js
@@ -174,8 +174,8 @@
if ( $secondary.children().length === 0 ) {
$secondary.remove();
} else {
- $( '#p-lang' ).after( '<div id="p-lang-more" class="portal"><h5></h5><div class="body"></div></div>' );
- $( '#p-lang-more h5' ).text( mw.msg( 'vector-collapsiblenav-more' ) );
+ $( '#p-lang' ).after( '<div id="p-lang-more" class="portal"><h3></h3><div class="body"></div></div>' );
+ $( '#p-lang-more h3' ).text( mw.msg( 'vector-collapsiblenav-more' ) );
$secondary.appendTo( $( '#p-lang-more .body' ) );
}
// Always show the primary interwiki language portal
@@ -194,7 +194,7 @@
var id = $(this).attr( 'id' ),
state = $.cookie( 'vector-nav-' + id );
// Add anchor tag to heading for better accessibility
- $( this ).find( 'h5' ).wrapInner( $( '<a href="#"></a>' ).click( false ) );
+ $( this ).find( 'h3, h5' ).wrapInner( $( '<a href="#"></a>' ).click( false ) );
// In the case that we are not showing the new version, let's show the languages by default
if (
state === 'true' ||
@@ -220,7 +220,7 @@
/* Tab Indexing */
- $headings = $( '#mw-panel > .portal:not(.persistent) > h5' );
+ $headings = $( '#mw-panel > .portal:not(.persistent) > h3, #mw-panel > .portal:not(.persistent) > h5' );
// Get the highest tab index
tabIndex = $( document ).lastTabIndex() + 1;
@@ -235,13 +235,13 @@
// Toggle the selected menu's class and expand or collapse the menu
$( '#mw-panel' )
- .delegate( '.portal:not(.persistent) > h5', 'keydown', function ( e ) {
+ .delegate( '.portal:not(.persistent) > h3, .portal:not(.persistent) > h5', 'keydown', function ( e ) {
// Make the space and enter keys act as a click
if ( e.which === 13 /* Enter */ || e.which === 32 /* Space */ ) {
toggle( $(this) );
}
} )
- .delegate( '.portal:not(.persistent) > h5', 'mousedown', function ( e ) {
+ .delegate( '.portal:not(.persistent) > h3, .portal:not(.persistent) > h5', 'mousedown', function ( e ) {
if ( e.which !== 3 ) { // Right mouse click
toggle( $(this) );
$(this).blur();
diff --git a/extensions/Vector/modules/ext.vector.collapsibleTabs.js b/extensions/Vector/modules/ext.vector.collapsibleTabs.js
index 31f91cbb..439a1995 100644
--- a/extensions/Vector/modules/ext.vector.collapsibleTabs.js
+++ b/extensions/Vector/modules/ext.vector.collapsibleTabs.js
@@ -2,124 +2,28 @@
* Collapsible tabs for Vector
*/
jQuery( function ( $ ) {
- var rtl = $( 'body' ).is( '.rtl' );
-
- // Overloading the moveToCollapsed function to animate the transition
- $.collapsibleTabs.moveToCollapsed = function ( ele ) {
- var $moving = $( ele );
-
- //$.collapsibleTabs.getSettings( $( $.collapsibleTabs.getSettings( $moving ).expandedContainer ) ).shifting = true;
- // Do the above, except with guards for JS errors
- var data = $.collapsibleTabs.getSettings( $moving );
- if ( !data ) {
- return;
- }
- var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
- if ( !expContainerSettings ) {
- return;
- }
- expContainerSettings.shifting = true;
+ var $cactions = $( '#p-cactions' );
- // Remove the element from where it's at and put it in the dropdown menu
- var target = data.collapsedContainer;
- $moving.css( 'position', 'relative' )
- .css( ( rtl ? 'left' : 'right' ), 0 )
- .animate( { width: '1px' }, 'normal', function () {
- var data;
- $( this ).hide();
- // add the placeholder
- $( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this );
- // XXX: 'data' is undefined here, should the 'data' from the outer scope have
- // a different name?
- $( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', data );
- $( this ).attr( 'style', 'display: list-item;' );
- // $.collapsibleTabs.getSettings( $( $.collapsibleTabs.getSettings( $( ele ) ).expandedContainer ) )
- // .shifting = false;
- // Do the above, except with guards for accessing properties of undefined.
- data = $.collapsibleTabs.getSettings( $( ele ) );
- if ( data ) {
- var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
- if ( expContainerSettings ) {
- expContainerSettings.shifting = false;
- $.collapsibleTabs.handleResize();
- }
- }
- } );
- };
-
- // Overloading the moveToExpanded function to animate the transition
- $.collapsibleTabs.moveToExpanded = function ( ele ) {
- var $moving = $( ele );
- //$.collapsibleTabs.getSettings( $( $.collapsibleTabs.getSettings( $moving ).expandedContainer ) ).shifting = true;
- // Do the above, except with guards for accessing properties of undefined.
- var data = $.collapsibleTabs.getSettings( $moving );
- if ( !data ) {
- return;
- }
- var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
- if ( !expContainerSettings ) {
- return;
- }
- expContainerSettings.shifting = true;
-
- // grab the next appearing placeholder so we can use it for replacing
- var $target = $( data.expandedContainer ).find( 'span.placeholder:first' );
- var expandedWidth = data.expandedWidth;
- $moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' );
- $target.replaceWith(
- $moving
- .detach()
- .css( 'width', '1px' )
- .data( 'collapsibleTabsSettings', data )
- .animate( { width: expandedWidth + 'px' }, 'normal', function () {
- $( this ).attr( 'style', 'display: block;' );
- //$.collapsibleTabs.getSettings( $( $.collapsibleTabs.getSettings( $( ele ) ).expandedContainer ) )
- // .shifting = false;
- // Do the above, except with guards for accessing properties of undefined.
- var data = $.collapsibleTabs.getSettings( $( this ) );
- if ( data ) {
- var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
- if ( expContainerSettings ) {
- expContainerSettings.shifting = false;
- $.collapsibleTabs.handleResize();
- }
- }
- } )
- );
- };
-
// Bind callback functions to animate our drop down menu in and out
- // and then call the collapsibleTabs function on the menu
- $( '#p-views ul' ).bind( 'beforeTabCollapse', function () {
- if ( $( '#p-cactions' ).css( 'display' ) === 'none' ) {
- $( '#p-cactions' )
- .addClass( 'filledPortlet' ).removeClass( 'emptyPortlet' )
- .find( 'h5' )
- .css( 'width','1px' ).animate( { 'width':'26px' }, 390 );
- }
- } ).bind( 'beforeTabExpand', function () {
- if ( $( '#p-cactions li' ).length === 1 ) {
- $( '#p-cactions h5' ).animate( { 'width':'1px' }, 370, function () {
- $( this ).attr( 'style', '' )
- .parent().addClass( 'emptyPortlet' ).removeClass( 'filledPortlet' );
- });
- }
- } ).collapsibleTabs( {
- expandCondition: function ( eleWidth ) {
- if ( rtl ) {
- return ( $( '#right-navigation' ).position().left + $( '#right-navigation' ).width() + 1 )
- < ( $( '#left-navigation' ).position().left - eleWidth );
+ // and then call the collapsibleTabs function on the menu
+ $( '#p-views ul' )
+ .bind( 'beforeTabCollapse', function () {
+ // If the dropdown was hidden, show it
+ if ( $cactions.hasClass( 'emptyPortlet' ) ) {
+ $cactions
+ .removeClass( 'emptyPortlet' )
+ .find( 'h3, h5' )
+ .css( 'width', '1px' ).animate( { 'width': '24px' }, 390 );
}
- return ( $( '#left-navigation' ).position().left + $( '#left-navigation' ).width() + 1 )
- < ( $( '#right-navigation' ).position().left - eleWidth );
- },
- collapseCondition: function () {
- if ( rtl ) {
- return ( $( '#right-navigation' ).position().left + $( '#right-navigation' ).width() )
- > $( '#left-navigation' ).position().left;
+ } )
+ .bind( 'beforeTabExpand', function () {
+ // If we're removing the last child node right now, hide the dropdown
+ if ( $cactions.find( 'li' ).length === 1 ) {
+ $cactions.find( 'h3, h5' ).animate( { 'width': '1px' }, 390, function () {
+ $( this ).attr( 'style', '' )
+ .parent().addClass( 'emptyPortlet' );
+ });
}
- return ( $( '#left-navigation' ).position().left + $( '#left-navigation' ).width() )
- > $( '#right-navigation' ).position().left;
- }
- } );
+ } )
+ .collapsibleTabs();
} );
diff --git a/extensions/Vector/modules/ext.vector.editWarning.js b/extensions/Vector/modules/ext.vector.editWarning.js
deleted file mode 100644
index e128fd45..00000000
--- a/extensions/Vector/modules/ext.vector.editWarning.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Edit warning for Vector
- */
-( function ( mw, $ ) {
- $(document).ready( function () {
- // Check if EditWarning is enabled and if we need it
- if ( $( '#wpTextbox1' ).length === 0 ) {
- return true;
- }
- // Get the original values of some form elements
- $( '#wpTextbox1, #wpSummary' ).each( function () {
- $(this).data( 'origtext', $(this).val() );
- });
- var savedWindowOnBeforeUnload;
- $( window )
- .on( 'beforeunload.editwarning', function () {
- var retval;
-
- // Check if the current values of some form elements are the same as
- // the original values
- if (
- mw.config.get( 'wgAction' ) == 'submit' ||
- $( '#wpTextbox1' ).data( 'origtext' ) != $( '#wpTextbox1' ).val() ||
- $( '#wpSummary' ).data( 'origtext' ) != $( '#wpSummary' ).val()
- ) {
- // Return our message
- retval = mw.msg( 'vector-editwarning-warning' );
- }
-
- // Unset the onbeforeunload handler so we don't break page caching in Firefox
- savedWindowOnBeforeUnload = window.onbeforeunload;
- window.onbeforeunload = null;
- if ( retval !== undefined ) {
- // ...but if the user chooses not to leave the page, we need to rebind it
- setTimeout( function () {
- window.onbeforeunload = savedWindowOnBeforeUnload;
- }, 1 );
- return retval;
- }
- } )
- .on( 'pageshow.editwarning', function () {
- // Re-add onbeforeunload handler
- if ( window.onbeforeunload == null ) {
- window.onbeforeunload = savedWindowOnBeforeUnload;
- }
- } );
-
- // Add form submission handler
- $( '#editform' ).submit( function () {
- // Unbind our handlers
- $( window ).off( '.editwarning' );
- });
- });
-
-}( mediaWiki, jQuery ) );
diff --git a/extensions/Vector/modules/ext.vector.footerCleanup.css b/extensions/Vector/modules/ext.vector.footerCleanup.css
index b935aed6..a361346b 100644
--- a/extensions/Vector/modules/ext.vector.footerCleanup.css
+++ b/extensions/Vector/modules/ext.vector.footerCleanup.css
@@ -2,6 +2,7 @@
* Footer cleanup
*/
+/* General layout */
#wpTextbox1 {
margin: 0;
display: block;
@@ -15,15 +16,17 @@
margin-bottom: 2em;
}
+/* Styles for collapsible lists of templates used and hidden categories */
.collapsible-list {
display: inline;
cursor: pointer;
min-width: 400px;
}
-.collapsible-list > span {
+
+.collapsible-list span {
float: left;
/* @embed */
- background: url(./images/open.png);
+ background-image: url(./images/open.png);
background-repeat: no-repeat;
background-position: 50% 50%;
display: block;
@@ -31,46 +34,39 @@
width: 16px;
}
-.collapsible-list > span.collapsed {
+.collapsible-list span.collapsed {
/* @embed */
- background: url(./images/closed-ltr.png);
- background-repeat: no-repeat;
- background-position: 50% 50%;
+ background-image: url(./images/closed-ltr.png);
}
-.hiddencats > ul, .templatesUsed > ul {
- margin: 1em 2.5em;
+.hiddencats ul, .templatesUsed ul {
+ margin-bottom: 1em;
+ margin-left: 2.5em;
}
+/* Adjustments to edit form elements */
.editCheckboxes {
margin-bottom: 1em;
}
-.editCheckboxes input[type='checkbox']:first-child {
+.editCheckboxes input:first-child {
margin-left: 0;
}
.cancelLink {
- margin: 0 0.5em;
-}
-
-.cancelLinkPipeSpace {
- display: inline-block;
- width: 0.5em;
- height: 0.5em;
+ margin-left: 0.5em;
}
#editpage-copywarn {
font-size: 0.9em;
}
-input#wpSummary {
+#wpSummary {
display: block;
margin-top: 0;
margin-bottom: 0.5em;
}
-.editButtons > input[type='submit']:first-child {
+.editButtons input:first-child {
margin-left: .1em;
}
-
diff --git a/extensions/Vector/modules/ext.vector.footerCleanup.js b/extensions/Vector/modules/ext.vector.footerCleanup.js
index 7c4b6898..5881014d 100644
--- a/extensions/Vector/modules/ext.vector.footerCleanup.js
+++ b/extensions/Vector/modules/ext.vector.footerCleanup.js
@@ -3,7 +3,7 @@
*/
( function ( $ ) {
// Wait for onload to remove edit help and "|" after cancel link.
- window.onload = function () {
+ $( window ).load( function () {
// Only if advanced editor is found.
if ( 'wikiEditor' in $ ) {
$( '.editButtons' ).find( '.editHelp' ).remove();
@@ -13,17 +13,17 @@
// Adjustment for proper right side alignment with WikiEditor.
$( '.editOptions, #editpage-specialchars' ).css( 'margin-right', '-2px' );
}
- };
+ } );
// Waiting until dom ready as the module is loaded in the head.
$( document ).ready( function () {
// Make "Templates used" a collapsible list.
- $( '.templatesUsed ul' ).footerCollapsibleList( {
+ $( '.templatesUsed' ).footerCollapsibleList( {
name: 'templates-used-list',
title: mw.msg( 'vector-footercleanup-templates' )
} );
// Make "Hidden categories" a collapsible list.
- $( '.hiddencats ul' ).footerCollapsibleList( {
+ $( '.hiddencats' ).footerCollapsibleList( {
name: 'hidden-categories-list',
title: mw.msg( 'vector-footercleanup-categories' )
} );
diff --git a/extensions/Vector/modules/ext.vector.sectionEditLinks.js b/extensions/Vector/modules/ext.vector.sectionEditLinks.js
index 2a3301bf..62bde9e6 100644
--- a/extensions/Vector/modules/ext.vector.sectionEditLinks.js
+++ b/extensions/Vector/modules/ext.vector.sectionEditLinks.js
@@ -38,20 +38,6 @@ if ( bucket <= 0 ) {
}
$(document).ready( function () {
- // Transform the targets of section edit links to route through the click tracking API
- var session = $.cookie( 'clicktracking-session' );
- $( 'span.editsection a, #ca-edit a' ).each( function () {
- var event = eventBase + bucket + '@' + experiment;
- if ( $(this).is( '#ca-edit a' ) ) {
- event += '-tab';
- }
- var href = $( this ).attr( 'href' );
- var editUrl = href + ( href.indexOf( '?' ) >= 0 ? '&' : '?' ) + $.param( {
- 'clicktrackingsession': session,
- 'clicktrackingevent': event + '-save'
- } );
- $(this).attr( 'href', $.trackActionURL( editUrl, event + '-click' ) );
- } );
if ( bucket == 2 ) {
// Move the link over to be next to the heading text and style it with an icon
$( 'span.mw-headline' ).each( function () {
diff --git a/extensions/Vector/modules/jquery.collapsibleTabs.js b/extensions/Vector/modules/jquery.collapsibleTabs.js
new file mode 100644
index 00000000..1e6b7af5
--- /dev/null
+++ b/extensions/Vector/modules/jquery.collapsibleTabs.js
@@ -0,0 +1,206 @@
+/**
+ * Collapsible tabs jQuery Plugin
+ */
+( function ( $ ) {
+ var rtl = $( 'body' ).is( '.rtl' );
+ $.fn.collapsibleTabs = function ( options ) {
+ // return if the function is called on an empty jquery object
+ if ( !this.length ) {
+ return this;
+ }
+ // Merge options into the defaults
+ var $settings = $.extend( {}, $.collapsibleTabs.defaults, options );
+
+ this.each( function () {
+ var $el = $( this );
+ // add the element to our array of collapsible managers
+ $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
+ $el : $.collapsibleTabs.instances.add( $el ) );
+ // attach the settings to the elements
+ $el.data( 'collapsibleTabsSettings', $settings );
+ // attach data to our collapsible elements
+ $el.children( $settings.collapsible ).each( function () {
+ $.collapsibleTabs.addData( $( this ) );
+ } );
+ } );
+
+ // if we haven't already bound our resize hanlder, bind it now
+ if ( !$.collapsibleTabs.boundEvent ) {
+ $( window )
+ .delayedBind( '500', 'resize', function ( ) {
+ $.collapsibleTabs.handleResize();
+ } );
+ }
+ // call our resize handler to setup the page
+ $.collapsibleTabs.handleResize();
+ return this;
+ };
+ /**
+ * Returns the amount of horizontal distance between the two tabs groups
+ * (#left-navigation and #right-navigation), in pixels. If negative, this
+ * means that the tabs overlap, and the value is the width of overlapping
+ * parts.
+ *
+ * Used in default expandCondition and collapseCondition.
+ *
+ * @return {Numeric} distance/overlap in pixels
+ */
+ function calculateTabDistance() {
+ var $tabsArray, $leftTab, $rightTab, leftEnd, rightStart;
+
+ // In RTL, #right-navigation is actually on the left and vice versa.
+ // Hooray for descriptive naming.
+ if ( !rtl ) {
+ $leftTab = $( '#left-navigation' );
+ $rightTab = $( '#right-navigation' );
+ } else {
+ $leftTab = $( '#right-navigation' );
+ $rightTab = $( '#left-navigation' );
+ }
+
+ leftEnd = $leftTab.offset().left + $leftTab.width();
+ rightStart = $rightTab.offset().left;
+
+ return rightStart - leftEnd;
+ }
+ $.collapsibleTabs = {
+ instances: [],
+ boundEvent: null,
+ defaults: {
+ expandedContainer: '#p-views ul',
+ collapsedContainer: '#p-cactions ul',
+ collapsible: 'li.collapsible',
+ shifting: false,
+ expandCondition: function ( eleWidth ) {
+ // If there's at least eleWidth pixels free space, expand.
+ return calculateTabDistance() >= eleWidth;
+ },
+ collapseCondition: function () {
+ // If there's an overlap, collapse.
+ return calculateTabDistance() < 0;
+ }
+ },
+ addData: function ( $collapsible ) {
+ var $settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
+ if ( $settings !== null ) {
+ $collapsible.data( 'collapsibleTabsSettings', {
+ expandedContainer: $settings.expandedContainer,
+ collapsedContainer: $settings.collapsedContainer,
+ expandedWidth: $collapsible.width(),
+ prevElement: $collapsible.prev()
+ } );
+ }
+ },
+ getSettings: function ( $collapsible ) {
+ var $settings = $collapsible.data( 'collapsibleTabsSettings' );
+ if ( $settings === undefined ) {
+ $.collapsibleTabs.addData( $collapsible );
+ $settings = $collapsible.data( 'collapsibleTabsSettings' );
+ }
+ return $settings;
+ },
+ /**
+ * @param {jQuery.Event} e
+ */
+ handleResize: function () {
+ $.collapsibleTabs.instances.each( function () {
+ var $el = $( this ),
+ data = $.collapsibleTabs.getSettings( $el );
+
+ if ( data.shifting ) {
+ return;
+ }
+
+ // if the two navigations are colliding
+ if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
+
+ $el.trigger( 'beforeTabCollapse' );
+ // move the element to the dropdown menu
+ $.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) );
+ }
+
+ // if there are still moveable items in the dropdown menu,
+ // and there is sufficient space to place them in the tab container
+ if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0
+ && data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
+ data.collapsible + ':first' ) ).expandedWidth ) ) {
+ //move the element from the dropdown to the tab
+ $el.trigger( 'beforeTabExpand' );
+ $.collapsibleTabs
+ .moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
+ }
+ });
+ },
+ moveToCollapsed: function ( ele ) {
+ var $moving = $( ele );
+
+ var data = $.collapsibleTabs.getSettings( $moving );
+ if ( !data ) {
+ return;
+ }
+ var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ if ( !expContainerSettings ) {
+ return;
+ }
+ expContainerSettings.shifting = true;
+
+ // Remove the element from where it's at and put it in the dropdown menu
+ var target = data.collapsedContainer;
+ $moving.css( 'position', 'relative' )
+ .css( ( rtl ? 'left' : 'right' ), 0 )
+ .animate( { width: '1px' }, 'normal', function () {
+ var data;
+ $( this ).hide();
+ // add the placeholder
+ $( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this );
+ // XXX: 'data' is undefined here, should the 'data' from the outer scope have
+ // a different name?
+ $( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', data );
+ $( this ).attr( 'style', 'display: list-item;' );
+ data = $.collapsibleTabs.getSettings( $( ele ) );
+ if ( data ) {
+ var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ if ( expContainerSettings ) {
+ expContainerSettings.shifting = false;
+ $.collapsibleTabs.handleResize();
+ }
+ }
+ } );
+ },
+ moveToExpanded: function ( ele ) {
+ var $moving = $( ele );
+ var data = $.collapsibleTabs.getSettings( $moving );
+ if ( !data ) {
+ return;
+ }
+ var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ if ( !expContainerSettings ) {
+ return;
+ }
+ expContainerSettings.shifting = true;
+
+ // grab the next appearing placeholder so we can use it for replacing
+ var $target = $( data.expandedContainer ).find( 'span.placeholder:first' );
+ var expandedWidth = data.expandedWidth;
+ $moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' );
+ $target.replaceWith(
+ $moving
+ .detach()
+ .css( 'width', '1px' )
+ .data( 'collapsibleTabsSettings', data )
+ .animate( { width: expandedWidth + 'px' }, 'normal', function () {
+ $( this ).attr( 'style', 'display: block;' );
+ var data = $.collapsibleTabs.getSettings( $( this ) );
+ if ( data ) {
+ var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+ if ( expContainerSettings ) {
+ expContainerSettings.shifting = false;
+ $.collapsibleTabs.handleResize();
+ }
+ }
+ } )
+ );
+ }
+ };
+
+}( jQuery ) );
diff --git a/extensions/Vector/modules/jquery.footerCollapsibleList.js b/extensions/Vector/modules/jquery.footerCollapsibleList.js
index 2915ce29..7b9b5bcb 100644
--- a/extensions/Vector/modules/jquery.footerCollapsibleList.js
+++ b/extensions/Vector/modules/jquery.footerCollapsibleList.js
@@ -2,45 +2,43 @@
// Small jQuery plugin to handle the toggle function & cookie for state
// For collapsible items in the footer
$.fn.footerCollapsibleList = function( config ) {
- if (
- ! ( 'title' in config ) ||
- ! ( 'name' in config )
- ) {
+ if ( !( 'title' in config ) || !( 'name' in config ) ) {
return;
}
+
return this.each( function () {
- // Setup
- $( this )
- .parent()
- .prepend(
- $( '<a>' )
- .addClass( 'collapsible-list' )
- .text( config.title )
- .on( 'click', function( e ) {
- e.preventDefault();
- // Modify state cookie.
- var state = ( $.cookie( config.name ) !== 'expanded' ) ?
- 'expanded' : 'collapsed';
- $.cookie( config.name, state );
- // Modify DOM.
- $( this ).next().toggle();
- $( this ).find( 'span' ).toggleClass( 'collapsed' );
- } )
- .append( $( '<span>' ) )
- )
- .end()
- .prev()
- .remove();
- // Check cookie and collapse.
- if(
- $.cookie( config.name ) === null ||
- $.cookie( config.name ) === 'collapsed'
- ) {
- $( this )
- .slideUp()
- .prev()
- .find( 'span' ).addClass( 'collapsed' );
- }
+ var $container, $ul, $explanation, $icon;
+
+ $container = $( this );
+ $ul = $container.find( 'ul' );
+ $explanation = $container.find( '.mw-templatesUsedExplanation, .mw-hiddenCategoriesExplanation' );
+
+ $icon = $( '<span>' );
+ $ul.before(
+ $( '<a>' )
+ .addClass( 'collapsible-list' )
+ .text( config.title )
+ .append( $icon )
+ .on( 'click', function( e ) {
+ // Modify state cookie.
+ var state = ( $.cookie( config.name ) !== 'expanded' ) ? 'expanded' : 'collapsed';
+ $.cookie( config.name, state );
+
+ // Modify DOM.
+ $ul.slideToggle();
+ $icon.toggleClass( 'collapsed' );
+
+ e.preventDefault();
+ } )
+ );
+
+ $explanation.remove();
+
+ // Check cookie and collapse.
+ if( $.cookie( config.name ) === null || $.cookie( config.name ) === 'collapsed' ) {
+ $ul.hide();
+ $icon.addClass( 'collapsed' );
+ }
} );
};
}( jQuery ) );
diff --git a/extensions/WikiEditor/.gitreview b/extensions/WikiEditor/.gitreview
deleted file mode 100644
index 622413f0..00000000
--- a/extensions/WikiEditor/.gitreview
+++ /dev/null
@@ -1,6 +0,0 @@
-[gerrit]
-host=gerrit.wikimedia.org
-port=29418
-project=mediawiki/extensions/WikiEditor.git
-defaultbranch=master
-defaultrebase=0
diff --git a/extensions/WikiEditor/.jshintignore b/extensions/WikiEditor/.jshintignore
deleted file mode 100644
index 66a218b5..00000000
--- a/extensions/WikiEditor/.jshintignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# upstream lib from Google
-modules/contentCollector.js
diff --git a/extensions/WikiEditor/.jshintrc b/extensions/WikiEditor/.jshintrc
deleted file mode 100644
index 64cd5087..00000000
--- a/extensions/WikiEditor/.jshintrc
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "predef": [
- "mediaWiki",
- "jQuery"
- ],
- "browser": true,
- "smarttabs": true,
- "multistr": true
-}
diff --git a/extensions/WikiEditor/README b/extensions/WikiEditor/README
index 2851211d..6c6a77cb 100644
--- a/extensions/WikiEditor/README
+++ b/extensions/WikiEditor/README
@@ -15,3 +15,7 @@ require_once( "$IP/extensions/WikiEditor/WikiEditor.php" );
$wgDefaultUserOptions['usebetatoolbar'] = 1;
$wgDefaultUserOptions['usebetatoolbar-cgd'] = 1;
+
+# Release 1.21 removes the $wgWikiEditorToolbarClickTracking config variable
+# and with it support for tracking clicks on WikiEditor features via the
+# ClickTracking extension.
diff --git a/extensions/WikiEditor/WikiEditor.hooks.php b/extensions/WikiEditor/WikiEditor.hooks.php
index 682f7aa2..57b8ff35 100644
--- a/extensions/WikiEditor/WikiEditor.hooks.php
+++ b/extensions/WikiEditor/WikiEditor.hooks.php
@@ -29,9 +29,6 @@ class WikiEditorHooks {
'modules' => array(
'ext.wikiEditor.toolbar',
),
- 'configurations' => array(
- 'wgWikiEditorToolbarClickTracking',
- ),
),
'dialogs' => array(
'preferences' => array(
diff --git a/extensions/WikiEditor/WikiEditor.i18n.php b/extensions/WikiEditor/WikiEditor.i18n.php
index 8ef198ae..b679ab48 100644
--- a/extensions/WikiEditor/WikiEditor.i18n.php
+++ b/extensions/WikiEditor/WikiEditor.i18n.php
@@ -164,7 +164,7 @@ $1:Example.jpg|Caption2",
'wikieditor-toolbar-tool-table-insert' => 'Insert',
'wikieditor-toolbar-tool-table-cancel' => 'Cancel',
'wikieditor-toolbar-tool-table-example-text' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut nec purus diam. Sed aliquam imperdiet nunc quis lacinia. Donec rutrum consectetur placerat. Sed volutpat neque non purus faucibus id ultricies enim euismod.',
- 'wikieditor-toolbar-tool-table-toomany' => 'Inserting a table with more than $1 cells is not possible with this dialog.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Inserting a table with more than 1000 cells is not possible with this dialog.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'You have not entered a valid number of rows or columns.',
'wikieditor-toolbar-tool-table-zero' => 'You cannot insert a table with zero rows or columns.',
'wikieditor-toolbar-tool-replace' => 'Search and replace',
@@ -178,7 +178,7 @@ $1:Example.jpg|Caption2",
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Replace all',
'wikieditor-toolbar-tool-replace-close' => 'Close',
'wikieditor-toolbar-tool-replace-nomatch' => 'Your search did not match anything.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 replacement(s) made.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|replacement|replacements}} made.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'You did not enter anything to search for.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'The regular expression you entered is invalid: $1',
/* Toolbar - Special characters Section */
@@ -286,7 +286,9 @@ $1:Example.jpg|Caption2",
* @author Njardarlogar
* @author Onecountry
* @author Prima klasy4na
+ * @author Purodha
* @author Raymond
+ * @author Shirayuki
* @author Siebrand
* @author Umherirrender
* @author Yekrats
@@ -294,9 +296,8 @@ $1:Example.jpg|Caption2",
$messages['qqq'] = array(
'wikieditor' => 'An extension to allow for advanced editing features.
http://www.mediawiki.org/wiki/Extension:WikiEditor',
- 'wikieditor-desc' => "{{desc}}
-
-I guess that 'feature-providing modules' means the same as 'modules providing features'.",
+ 'wikieditor-desc' => '{{desc|name=Wiki Editor|url=http://www.mediawiki.org/wiki/Extension:WikiEditor}}
+I guess that "feature-providing modules" means the same as "modules providing features".',
'wikieditor-wikitext-tab' => 'Caption of the tab containing the edit box',
'wikieditor-loading' => "Explanatory text for the temporary cover placed over the wikieditor while it's being assembled.
{{Identical|Loading}}",
@@ -330,8 +331,7 @@ I guess that 'feature-providing modules' means the same as 'modules providing fe
'wikieditor-publish-dialog-publish' => "Button that saves the user's edit in the dialog that opens when the user clicks the Publish button
{{Identical|Publish}}",
- 'wikieditor-publish-dialog-goback' => 'Button that closes the dialog that opens when the user clicks the Publish button
-
+ 'wikieditor-publish-dialog-goback' => 'Button that closes the dialog that opens when the user clicks the Publish button.
{{Identical|Go back}}',
'wikieditor-template-editor-dialog-submit' => '{{Identical|Update}}',
'wikieditor-template-editor-dialog-cancel' => '{{Identical|Cancel}}',
@@ -356,7 +356,8 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
'wikieditor-toolbar-tool-link-cancel' => '{{Identical|Cancel}}',
'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Text shown when the title the user entered exists',
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Text shown when the title the user entered does not exist',
- 'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Text shown when the title the user entered is invalid',
+ 'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Text shown when the title the user entered is invalid.
+{{Identical|Invalid title}}',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Text shown when the link target the user entered points to an external web site
{{Identical|External link}}',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'alt text and title text for the image shown while the title the user entered is being checked for existence',
@@ -372,8 +373,10 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
'wikieditor-toolbar-file-size' => 'Label for input of size on insert file dialog',
'wikieditor-toolbar-file-float' => 'Label for image align selector on insert file dialog',
'wikieditor-toolbar-file-default' => 'Label for default option in insert file dialog selectors',
- 'wikieditor-toolbar-file-format' => 'Label for image format (thumbnail, framed, frameless, none) selector on insert file dialog',
- 'wikieditor-toolbar-file-format-none' => 'Option in file dialog for no format for the added image',
+ 'wikieditor-toolbar-file-format' => 'Label for image format (thumbnail, framed, frameless, none) selector on insert file dialog
+{{Identical|Format}}',
+ 'wikieditor-toolbar-file-format-none' => 'Option in file dialog for no format for the added image.
+{{Identical|None}}',
'wikieditor-toolbar-tool-file-insert' => '{{Identical|Insert}}',
'wikieditor-toolbar-tool-file-cancel' => '{{Identical|Cancel}}',
'wikieditor-toolbar-tool-reference' => '{{Identical|Reference}}',
@@ -394,28 +397,53 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
<nowiki>#REDIRECT [[target page name]]</nowiki>",
'wikieditor-toolbar-tool-small' => '{{Identical|Small}}',
'wikieditor-toolbar-group-insert' => '{{Identical|Insert}}',
+ 'wikieditor-toolbar-tool-gallery-example' => 'Used as example for Picture Gallery.
+
+This message follows the message {{msg-mw|wikieditor-toolbar-tool-gallery}}.
+
+Parameters:
+* $1 - namespace name "File"',
'wikieditor-toolbar-tool-table' => '{{Identical|Table}}',
'wikieditor-toolbar-tool-table-example-cell-text' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
- 'wikieditor-toolbar-tool-table-example-header' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
+ 'wikieditor-toolbar-tool-table-example-header' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.
+
+See also:
+* {{msg-mw|wikieditor-toolbar-tool-table-example-header}}
+* {{msg-mw|wikieditor-toolbar-tool-table-example}}',
'wikieditor-toolbar-tool-table-title' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
'wikieditor-toolbar-tool-table-dimensions-rows' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
- 'wikieditor-toolbar-tool-table-dimensions-columns' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
+ 'wikieditor-toolbar-tool-table-dimensions-columns' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.
+{{Identical|Column}}',
'wikieditor-toolbar-tool-table-dimensions-header' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
'wikieditor-toolbar-tool-table-wikitable' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
'wikieditor-toolbar-tool-table-sortable' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
- 'wikieditor-toolbar-tool-table-example' => '{{Identical|Example}}
- [[File:Wikieditor-toolbar-tool-table.png|thumb]]This is a noun. Important to indicate that this is not a preview of what the table will look like, but an example of what it will look similar to. See screenshot.',
- 'wikieditor-toolbar-tool-table-preview' => '{{Identical|Preview}}
-
-[[File:Wikieditor-toolbar-tool-table.png|thumb]]This is a noun. See screenshot.',
- 'wikieditor-toolbar-tool-table-insert' => '{{Identical|Insert}}
+ 'wikieditor-toolbar-tool-table-example' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]]This is a noun. Important to indicate that this is not a preview of what the table will look like, but an example of what it will look similar to. See screenshot.
-[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
+See also:
+* {{msg-mw|wikieditor-toolbar-tool-table-example-header}}
+* {{msg-mw|wikieditor-toolbar-tool-table-example}}
+{{Identical|Example}}',
+ 'wikieditor-toolbar-tool-table-preview' => 'This is a noun. See screenshot.
+[[File:Wikieditor-toolbar-tool-table.png|thumb]]
+{{Identical|Preview}}',
+ 'wikieditor-toolbar-tool-table-insert' => 'See screenshot.
+[[File:Wikieditor-toolbar-tool-table.png|thumb]]
+{{Identical|Insert}}',
'wikieditor-toolbar-tool-table-cancel' => '{{Identical|Cancel}}',
'wikieditor-toolbar-tool-table-example-text' => '{{optional}}
Placeholder text to help the table example appear to be in the context of an article. Should be lorem ipsum, or equivalent.',
- 'wikieditor-toolbar-tool-table-toomany' => '[[file:Bulbgraph.png|left|22px]]
-This message does not support PLURAL on $1.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'See also:
+* {{msg-mw|wikieditor-toolbar-tool-table-invalidnumber}}
+* {{msg-mw|wikieditor-toolbar-tool-table-zero}}
+* {{msg-mw|wikieditor-toolbar-tool-table-toomany}}',
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'See also:
+* {{msg-mw|wikieditor-toolbar-tool-table-invalidnumber}}
+* {{msg-mw|wikieditor-toolbar-tool-table-zero}}
+* {{msg-mw|wikieditor-toolbar-tool-table-toomany}}',
+ 'wikieditor-toolbar-tool-table-zero' => 'See also:
+* {{msg-mw|wikieditor-toolbar-tool-table-invalidnumber}}
+* {{msg-mw|wikieditor-toolbar-tool-table-zero}}
+* {{msg-mw|wikieditor-toolbar-tool-table-toomany}}',
'wikieditor-toolbar-tool-replace' => '{{Identical|Search and replace}}',
'wikieditor-toolbar-tool-replace-title' => '{{Identical|Search and replace}}',
'wikieditor-toolbar-tool-replace-search' => '{{Identical|Search}}',
@@ -424,18 +452,20 @@ This message does not support PLURAL on $1.',
'wikieditor-toolbar-tool-replace-regex' => 'A "regular expression" is a syntax to find strings based on patterns, for more see [[wikipedia:Regular expression|the Wikipedia article]].
More notes:
-* "Regular expression" is mostly a programmer tool, which is sometimes exposed to normal users too. It\'s almost as an programming language, but it is used to describe different kinds of strings (sometimes also called patterns and pattern matching), and is often used to change (parts of) the strings too.',
+* "Regular expression" is mostly a programmer tool, which is sometimes exposed to normal users too. It\'s almost as an programming language, but it is used to describe different kinds of strings (sometimes also called patterns and pattern matching), and is often used to change (parts of) the strings, too.',
+ 'wikieditor-toolbar-tool-replace-button-findnext' => '{{Identical|Find next}}',
'wikieditor-toolbar-tool-replace-button-replace' => '{{Identical|Replace}}',
'wikieditor-toolbar-tool-replace-close' => '{{Identical|Close}}',
- 'wikieditor-toolbar-tool-replace-success' => '[[file:Bulbgraph.png|left|22px]]
-This message does not support PLURAL on $1.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Parameter:
+* $1 - the number of replacements',
'wikieditor-toolbar-tool-replace-invalidregex' => '$1 is a browser-supplied error message, probably in English, possibly in the browser language.
A "regular expression" is a syntax to find strings based on patterns, for more see [[wikipedia:Regular expression|the Wikipedia article]].
Regular expressions are mostly a programmer tool, which is sometimes exposed to normal users too. It\'s almost as an programming language, but it is used to describe different kinds of strings (sometimes also called patterns and pattern matching), and is often used to change (parts of) the strings too.',
'wikieditor-toolbar-section-characters' => 'This will be a toolbar for special characters, like emoticons.
-For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar_customization',
+For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar_customization
+{{Identical|Special character}}',
'wikieditor-toolbar-characters-page-latin' => 'This is the name of a script, or alphabet, not a language',
'wikieditor-toolbar-characters-page-latinextended' => 'The name of the Latin Extended character set section of the toolbar.
For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar_customization',
@@ -460,7 +490,7 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
'wikieditor-toolbar-characters-minus' => 'Title tooltip for the minus sign character (−), not to be confused with a hyphen',
'wikieditor-toolbar-section-help' => '{{Identical|Help}}',
'wikieditor-toolbar-help-heading-description' => '{{Identical|Description}}',
- 'wikieditor-toolbar-help-page-link' => '{{Identical|Links}}',
+ 'wikieditor-toolbar-help-page-link' => '{{Identical|Link}}',
'wikieditor-toolbar-help-page-list' => '{{Identical|List}}',
'wikieditor-toolbar-help-page-file' => '{{Identical|File}}',
'wikieditor-toolbar-help-page-reference' => '{{Identical|Reference}}',
@@ -497,7 +527,7 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
www.example.org is not a real website, but it has been reserved to use in software documentation. If you translate the word example and try to go to that web address then you might get a message that it doesn\'t exist. But somebody may have created a commercial web page for that address, such as www.Beispiel.org, using the German word for example. It is therefore recommended that you do not translate http://www.example.org at all. If you do wish to translate it you should first check where the translated link takes you.',
'wikieditor-toolbar-help-content-rereference-syntax' => '{{Optional}}',
'wikieditor-toolbar-help-content-showreferences-syntax' => '{{Optional}}',
- 'wikieditor-toolbar-help-content-showreferences-result' => 'For the <code><nowiki><li></nowiki></code> tag’s <code>id</code> attribute, non-ASCII characters are URL-encoded as follows: a period (<code>.</code>) followed by a capital hexadecimal code. For example, <code><nowiki><ref name="thử"></nowiki></code> produces <code><nowiki><li id="cite_note-th.E1.BB.AD-0"></nowiki></code>.
+ 'wikieditor-toolbar-help-content-showreferences-result' => 'For the <code><nowiki><li></nowiki></code> tag\'s <code>id</code> attribute, non-ASCII characters are URL-encoded as follows: a period (<code>.</code>) followed by a capital hexadecimal code. For example, <code><nowiki><ref name="thá»­"></nowiki></code> produces <code><nowiki><li id="cite_note-th.E1.BB.AD-0"></nowiki></code>.
www.example.org is not a real website, but it has been reserved to use in software documentation. If you translate the word example and try to go to that web address then you might get a message that it doesn\'t exist. But somebody may have created a commercial web page for that address, such as www.Beispiel.org, using the German word for example. It is therefore recommended that you do not translate http://www.example.org at all. If you do wish to translate it you should first check where the translated link takes you.',
'wikieditor-toolbar-help-content-signaturetimestamp-description' => '{{Identical|Signature with timestamp}}',
@@ -664,7 +694,7 @@ $1:Voorbeeld2|Byskrif2',
'wikieditor-toolbar-tool-table-preview' => 'Voorskou',
'wikieditor-toolbar-tool-table-insert' => 'Invoeg',
'wikieditor-toolbar-tool-table-cancel' => 'Kanselleer',
- 'wikieditor-toolbar-tool-table-toomany' => "U kan nie 'n tabel met meer as $1 selle met die dialoog invoeg nie.",
+ 'wikieditor-toolbar-tool-table-toomany' => "U kan nie 'n tabel met meer as $1 selle met die dialoog invoeg nie.", # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => "U het 'n ongeldige aantal lyne of kolomme verskaf.",
'wikieditor-toolbar-tool-table-zero' => "U kan nie 'n tabel sonder lyne en kolomme invoeg nie.",
'wikieditor-toolbar-tool-replace' => 'Soek en vervang',
@@ -678,7 +708,7 @@ $1:Voorbeeld2|Byskrif2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Vervang alles',
'wikieditor-toolbar-tool-replace-close' => 'Sluit',
'wikieditor-toolbar-tool-replace-nomatch' => 'U soektog het geen resultate opgelewer nie.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 vervangings gemaak.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 vervangings gemaak.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'U het niks ingesleutel om na te soek nie.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Die "regular expression" wat u verskaf het is ongeldig: $1',
'wikieditor-toolbar-section-characters' => 'Spesiale karakters',
@@ -897,7 +927,7 @@ $1: Example.jpg|Caption2',
'wikieditor-toolbar-tool-table-preview' => 'Preview',
'wikieditor-toolbar-tool-table-insert' => 'Kall',
'wikieditor-toolbar-tool-table-cancel' => 'Anuloj',
- 'wikieditor-toolbar-tool-table-toomany' => 'Futur një tavolinë me shumë se qelizat e $1 nuk është e mundur me këtë dialog.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Futur një tavolinë me shumë se qelizat e $1 nuk është e mundur me këtë dialog.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ju nuk keni hyrë në një numër të vlefshme të rreshtave dhe kolonave.',
'wikieditor-toolbar-tool-table-zero' => 'Ju nuk mund të vendos një tabelë me zero rreshta ose kolona.',
'wikieditor-toolbar-tool-replace' => 'Kërkoni dhe zëvendësuar',
@@ -910,7 +940,7 @@ $1: Example.jpg|Caption2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Zëvendësojnë të gjithë',
'wikieditor-toolbar-tool-replace-close' => 'Mshele',
'wikieditor-toolbar-tool-replace-nomatch' => 'Kërkimi juaj nuk u përputh me ndonjë gjë.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 zëvendësimit (s) bëhet.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 zëvendësimit (s) bëhet.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ju nuk shkruani ndonjë gjë për të kërkuar për.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Shprehje e rregullt keni hyrë është i pavlefshëm: $1',
'wikieditor-toolbar-section-characters' => 'karaktere të veçanta',
@@ -1123,7 +1153,7 @@ $1:Eixemplo.jpg|Piet_de_foto_2',
'wikieditor-toolbar-tool-table-preview' => 'Visualización previa',
'wikieditor-toolbar-tool-table-insert' => 'Insertar',
'wikieditor-toolbar-tool-table-cancel' => 'Cancelar',
- 'wikieditor-toolbar-tool-table-toomany' => 'Con iste quadro de dialogo no ye posible insertar una tabla con más de $1 celdas.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Con iste quadro de dialogo no ye posible insertar una tabla con más de $1 celdas.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'No ha escrito un numero valido de fileras u columnas.',
'wikieditor-toolbar-tool-table-zero' => 'No se puet insertar una tabla con zero fileras u columnas.',
'wikieditor-toolbar-tool-replace' => 'Buscar y reemplazar',
@@ -1137,7 +1167,7 @@ $1:Eixemplo.jpg|Piet_de_foto_2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Substituir tot',
'wikieditor-toolbar-tool-replace-close' => 'Zarrar',
'wikieditor-toolbar-tool-replace-nomatch' => 'A suya busca no ha trobau garra resultau concordant.',
- 'wikieditor-toolbar-tool-replace-success' => "S'han feito $1 substitucions.",
+ 'wikieditor-toolbar-tool-replace-success' => "S'han feito $1 substitucions.", # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'No ha escrito garra cosa ta mirar.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'A expresión regular que ha escrito ye invalida: $1',
'wikieditor-toolbar-section-characters' => 'Carácters especials',
@@ -1222,6 +1252,7 @@ $1:Eixemplo.jpg|Piet_de_foto_2',
);
/** Old English (Ænglisc)
+ * @author Gott wisst
* @author WÅdenhelm
*/
$messages['ang'] = array(
@@ -1270,7 +1301,7 @@ $messages['ang'] = array(
'wikieditor-toolbar-help-content-bold-description' => 'Þicce',
'wikieditor-toolbar-help-content-bold-syntax' => "'''Þicce traht'''",
'wikieditor-toolbar-help-content-bold-result' => '<strong>Þicce traht</strong>',
- 'wikieditor-toolbar-help-content-ilink-description' => 'Innanƿeard hlenċe',
+ 'wikieditor-toolbar-help-content-ilink-description' => 'Inweard hlenca',
'wikieditor-toolbar-help-content-reference-description' => 'Fruma',
);
@@ -1279,6 +1310,7 @@ $messages['ang'] = array(
* @author DRIHEM
* @author McDutchie
* @author Meno25
+ * @author Mido
* @author OsamaK
* @author Samer
* @author Zack wadghiri
@@ -1359,6 +1391,7 @@ $messages['ar'] = array(
'wikieditor-toolbar-file-float' => 'ناحية:',
'wikieditor-toolbar-file-default' => '(اÙتراضي)',
'wikieditor-toolbar-file-format' => 'الصيغة:',
+ 'wikieditor-toolbar-file-format-none' => 'لا يوجد',
'wikieditor-toolbar-tool-file-insert' => 'إدراج',
'wikieditor-toolbar-tool-file-cancel' => 'إلغاء',
'wikieditor-toolbar-tool-reference' => 'مرجع',
@@ -1425,7 +1458,7 @@ $1:Example.jpg|تعليق2',
'wikieditor-toolbar-tool-table-preview' => 'عرض مسبق',
'wikieditor-toolbar-tool-table-insert' => 'أدرج',
'wikieditor-toolbar-tool-table-cancel' => 'إلغاء',
- 'wikieditor-toolbar-tool-table-toomany' => 'إدراج جدول بأكثر من $1 خلية غير ممكن عبر هذا الحوار.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'إدراج جدول بأكثر من 1000 خلية غير ممكن عبر هذا الحوار.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'لم تدخل رقما صحيحا للصÙو٠أو الأعمدة.',
'wikieditor-toolbar-tool-table-zero' => 'لا يمكن أن تدرج جدولا بلا صÙو٠أو أعمدة.',
'wikieditor-toolbar-tool-replace' => 'ابحث واستبدل',
@@ -1439,7 +1472,7 @@ $1:Example.jpg|تعليق2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'استبدل الكل',
'wikieditor-toolbar-tool-replace-close' => 'أغلق',
'wikieditor-toolbar-tool-replace-nomatch' => 'بحثك لم يطابق أي شيء.',
- 'wikieditor-toolbar-tool-replace-success' => 'أجري $1 استبدال(ات).',
+ 'wikieditor-toolbar-tool-replace-success' => 'أجري $1 استبدال(ات).', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'لم تكتب شيئًا لتبحث عنه.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'التعبير النمطي الذي أدخلته غير صالح: $1',
'wikieditor-toolbar-section-characters' => 'أحر٠خاصة',
@@ -1530,7 +1563,7 @@ $1:Example.jpg|تعليق2',
* @author Michaelovic
*/
$messages['arc'] = array(
- 'wikieditor-preview-tab' => 'ÜšÜÜªÜ¬Ü Ü©Ü•Ü¡ÜܬÜ',
+ 'wikieditor-preview-tab' => 'ÜšÜÜªÜ Ü©Ü•Ü¡ÜÜ',
'wikieditor-preview-changes-tab' => 'ܫܘܚܠܦ̈Ü',
'wikieditor-previewDialog-tab' => 'ÜšÜÜªÜ Ü©Ü•Ü¡ÜÜ',
'wikieditor-publish-button-cancel' => 'ܒܛܘܠ',
@@ -1770,7 +1803,7 @@ $1:Example.jpg|Caption2',
'wikieditor-toolbar-tool-table-preview' => 'پروڤه',
'wikieditor-toolbar-tool-table-insert' => 'حط',
'wikieditor-toolbar-tool-table-cancel' => 'كانسل',
- 'wikieditor-toolbar-tool-table-toomany' => 'مش ممكن يتعمل insert لـ table بأكتر من $1 cells بالـ dialog ده.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'مش ممكن يتعمل insert لـ table بأكتر من $1 cells بالـ dialog ده.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'انت ما دخّلتش رقم موجود للـ rows او الـ columns',
'wikieditor-toolbar-tool-table-zero' => 'ما ينÙعش تعمل insert لـ table من-غير rows او columns.',
'wikieditor-toolbar-tool-replace' => 'دوّر و بدّل',
@@ -1783,7 +1816,7 @@ $1:Example.jpg|Caption2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'بدلهم كلهم',
'wikieditor-toolbar-tool-replace-close' => 'إقÙÙ„',
'wikieditor-toolbar-tool-replace-nomatch' => 'التدوير بتاعك ما وصلش لأى حاجه.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 تبديلات اتعملت.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 تبديلات اتعملت.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'انت ما حطّيتش اى حاجه علشان تدوّر عليها.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'The regular expression you entered is invalid: $1',
'wikieditor-toolbar-section-characters' => 'Special characters',
@@ -1940,6 +1973,7 @@ $messages['as'] = array(
'wikieditor-toolbar-file-float' => 'সংৰেখিত কৰক',
'wikieditor-toolbar-file-default' => '(default)',
'wikieditor-toolbar-file-format' => 'বিনà§à¦¯à¦¾à¦¸:',
+ 'wikieditor-toolbar-file-format-none' => 'à¦à¦•à§‹ নাই',
'wikieditor-toolbar-tool-file-insert' => 'সà§à¦®à§à§±à¦¾à¦“ক',
'wikieditor-toolbar-tool-file-cancel' => 'বাতিল কৰক',
'wikieditor-toolbar-tool-reference' => 'তথà§à¦¯à¦¸à¦‚গà§à§°à¦¹',
@@ -2006,7 +2040,7 @@ $1:Example.jpg|শিৰোনাম ২',
'wikieditor-toolbar-tool-table-preview' => 'পà§à§°à¦¾à¦•à¦¦à§°à§à¦¶à¦¨',
'wikieditor-toolbar-tool-table-insert' => 'যোগ কৰক',
'wikieditor-toolbar-tool-table-cancel' => 'বাতিল',
- 'wikieditor-toolbar-tool-table-toomany' => 'à¦à¦‡ ডায়লগৰ দà§à¦¬à¦¾à§°à¦¾ $1 ঘৰতকৈ বেছি থকা টেবà§à¦² যোগ কৰা সমà§à¦­à§± নহয়।',
+ 'wikieditor-toolbar-tool-table-toomany' => 'à¦à¦‡ ডায়লগৰ দà§à¦¬à¦¾à§°à¦¾ $1 ঘৰতকৈ বেছি থকা টেবà§à¦² যোগ কৰা সমà§à¦­à§± নহয়।', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'আপà§à¦¨à¦¿ উলমà§à¦¬ আৰৠপথালী শাৰীৰ বৈধ সংখà§à¦¯à¦¾ লিখাত ভà§à¦² কৰিছে।',
'wikieditor-toolbar-tool-table-zero' => 'আপà§à¦¨à¦¿ শূনà§à¦¯ উলমà§à¦¬ বা পথালী শাৰী থকা টেবà§à¦² যোগ কৰিব নোৱাৰে।',
'wikieditor-toolbar-tool-replace' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ আৰৠপà§à§°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨',
@@ -2020,7 +2054,7 @@ $1:Example.jpg|শিৰোনাম ২',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'সকলো পà§à§°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨',
'wikieditor-toolbar-tool-replace-close' => 'বনà§à¦§',
'wikieditor-toolbar-tool-replace-nomatch' => 'আপোনাৰ অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§° কতো সামঞà§à¦œà¦šà§à¦¯ পোৱা ন’গল।',
- 'wikieditor-toolbar-tool-replace-success' => '$1 টো পà§à§°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨ সমà§à¦ªà¦¨à§à¦¨ হৈছে।',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 টো পà§à§°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨ সমà§à¦ªà¦¨à§à¦¨ হৈছে।', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'সনà§à¦§à¦¾à¦¨ কৰিবলৈ আপà§à¦¨à¦¿ à¦à¦•à§‹ টাইপ কৰা নাই।',
'wikieditor-toolbar-tool-replace-invalidregex' => 'আপà§à¦¨à¦¿ পà§à§°à¦¦à¦¾à¦¨ কৰা ৰেগà§à¦²à¦¾à§° à¦à¦•à§à¦¸à¦ªà§à¦°à§‡à¦›à¦¨à¦Ÿà§‹ অবৈধ: $1',
'wikieditor-toolbar-section-characters' => 'বিশেষ চিহà§à¦¨à¦¸à¦®à§‚হ:',
@@ -2043,6 +2077,9 @@ $1:Example.jpg|শিৰোনাম ২',
'wikieditor-toolbar-characters-page-thai' => 'থাই',
'wikieditor-toolbar-characters-page-lao' => 'লাও',
'wikieditor-toolbar-characters-page-khmer' => 'খেমাৰ',
+ 'wikieditor-toolbar-characters-endash' => 'en দেছà§â€Œ',
+ 'wikieditor-toolbar-characters-emdash' => 'em দেছ‌',
+ 'wikieditor-toolbar-characters-minus' => 'বিয়োগ চিন',
'wikieditor-toolbar-section-help' => 'সহায়',
'wikieditor-toolbar-help-heading-description' => 'বিৱৰণ',
'wikieditor-toolbar-help-heading-syntax' => 'আপনি যি টাইপ কৰিছে',
@@ -2251,7 +2288,7 @@ $1:Exemplu.jpg|Pie2',
'wikieditor-toolbar-tool-table-preview' => 'Vista previa',
'wikieditor-toolbar-tool-table-insert' => 'Inxertar',
'wikieditor-toolbar-tool-table-cancel' => 'Encaboxar',
- 'wikieditor-toolbar-tool-table-toomany' => 'Con esti diálogu nun ye posible inxertar una tabla de más de $1 caxelles.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Con esti diálogu nun ye posible inxertar una tabla de más de 1000 caxelles.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Nun escribisti un númberu válidu de fileres o columnes.',
'wikieditor-toolbar-tool-table-zero' => 'Nun pues inxertar una tabla con cero fileres o columnes.',
'wikieditor-toolbar-tool-replace' => 'Guetar y reemplazar',
@@ -2265,7 +2302,7 @@ $1:Exemplu.jpg|Pie2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Sustituir toos',
'wikieditor-toolbar-tool-replace-close' => 'Zarrar',
'wikieditor-toolbar-tool-replace-nomatch' => 'La to gueta nun alcontró coincidencies.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 reemplazos fechos',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|reemplazu fechu|reemplazos fechos}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Nun escribisti nada pa guetar.',
'wikieditor-toolbar-tool-replace-invalidregex' => "La espresión regular qu'escribisti ye inválida: $1",
'wikieditor-toolbar-section-characters' => 'Caráuteres especiales',
@@ -2355,6 +2392,7 @@ $1:Exemplu.jpg|Pie2',
);
/** Azerbaijani (azərbaycanca)
+ * @author AZISS
* @author Cekli829
* @author Koc61
* @author PPerviz
@@ -2364,10 +2402,10 @@ $1:Exemplu.jpg|Pie2',
$messages['az'] = array(
'wikieditor-wikitext-tab' => 'Vikimətn',
'wikieditor-loading' => 'Yüklə',
- 'wikieditor-preview-tab' => 'Sınaq göstərişi',
+ 'wikieditor-preview-tab' => 'Sınaq görüntüsü',
'wikieditor-preview-changes-tab' => 'Dəyişikliklər',
'wikieditor-preview-loading' => 'Yüklənir…',
- 'wikieditor-previewDialog-tab' => 'Sınaq göstərişi',
+ 'wikieditor-previewDialog-tab' => 'Sınaq görüntüsü',
'wikieditor-previewDialog-loading' => 'Yüklənir…',
'wikieditor-publish-button-publish' => 'Yeniləmə',
'wikieditor-publish-button-cancel' => 'Ləğv et',
@@ -2441,7 +2479,7 @@ $messages['az'] = array(
'wikieditor-toolbar-tool-table-dimensions-rows' => 'Sətirlər:',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'Sütunlar:',
'wikieditor-toolbar-tool-table-example' => 'Nümunə',
- 'wikieditor-toolbar-tool-table-preview' => 'Sınaq göstərişi',
+ 'wikieditor-toolbar-tool-table-preview' => 'Sınaq görüntüsü',
'wikieditor-toolbar-tool-table-insert' => 'Yerləşdirmək',
'wikieditor-toolbar-tool-table-cancel' => 'Ləğv et',
'wikieditor-toolbar-tool-replace' => 'Axtar və dəyiş',
@@ -2531,6 +2569,241 @@ $messages['az'] = array(
'wikieditor-toolbar-help-content-indent-result' => 'Normal mətn<dl><dd>Abzasla mətn<dl><dd>Abzasla mətn</dd></dl></dd></dl>',
);
+/** South Azerbaijani (تورکجه)
+ * @author Amir a57
+ * @author E THP
+ * @author Ebrahimi-amir
+ * @author Mousa
+ */
+$messages['azb'] = array(
+ 'wikieditor-wikitext-tab' => 'ویکی‌متن',
+ 'wikieditor-loading' => 'یوکلنیر...',
+ 'wikieditor-preview-tab' => 'سیناق گؤستریشی',
+ 'wikieditor-preview-changes-tab' => 'ديَیشیکلیک‌لر',
+ 'wikieditor-preview-loading' => 'یوکلنیر...',
+ 'wikieditor-previewDialog-tab' => 'سیناق گؤستریشی',
+ 'wikieditor-previewDialog-loading' => 'یوکلنیر...',
+ 'wikieditor-publish-button-publish' => 'یئنیلمه',
+ 'wikieditor-publish-button-cancel' => 'لغو ائت',
+ 'wikieditor-publish-dialog-minor' => 'کیچیک دییشیک‌لیک',
+ 'wikieditor-publish-dialog-watch' => 'بو صÙحه‌نی ایزله',
+ 'wikieditor-publish-dialog-publish' => 'یایلما',
+ 'wikieditor-publish-dialog-goback' => 'دالییا گییت',
+ 'wikieditor-template-editor-dialog-title' => 'شابلونو دییشدیر ائت',
+ 'wikieditor-template-editor-dialog-submit' => 'گونجل‌له',
+ 'wikieditor-template-editor-dialog-cancel' => 'لغو ائت',
+ 'wikieditor-toc-show' => 'مؤهتویاتا باخ',
+ 'wikieditor-toc-hide' => 'مؤهتویاتی گیزلت',
+ 'wikieditor-toolbar-loading' => 'یوکلنیر...',
+ 'wikieditor-toolbar-tool-bold' => 'قالین رنگ',
+ 'wikieditor-toolbar-tool-bold-example' => 'قالین یازی',
+ 'wikieditor-toolbar-tool-italic' => 'مورب',
+ 'wikieditor-toolbar-tool-italic-example' => 'اَیری یازی',
+ 'wikieditor-toolbar-tool-ilink' => 'ایچری باغلانتی‌سی',
+ 'wikieditor-toolbar-tool-ilink-example' => 'باغلانتی باشلیغی',
+ 'wikieditor-toolbar-tool-xlink' => 'خاریجی باغلانتی (http:// اؤن‌اکی‌نی اونوتمایین)',
+ 'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com باغلانتی باشلیغی',
+ 'wikieditor-toolbar-tool-link' => 'باغلانتی',
+ 'wikieditor-toolbar-tool-link-title' => 'کئچید یئرلش‌دیر',
+ 'wikieditor-toolbar-tool-link-int' => 'بیر ویکی صحیÙه‌سینه',
+ 'wikieditor-toolbar-tool-link-int-target' => 'هد٠صحیÙÙ‡ یا آدرسی:',
+ 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'URL اوچون صحیÙÙ‡ باش‌لیغی',
+ 'wikieditor-toolbar-tool-link-int-text' => 'گؤسترمک اوچون یازی:',
+ 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'گؤستریله‌جک یازی',
+ 'wikieditor-toolbar-tool-link-ext' => 'بیر ائشیک ÙˆÙب صحیÙه‌سینه',
+ 'wikieditor-toolbar-tool-link-ext-target' => 'URL لینکی:',
+ 'wikieditor-toolbar-tool-link-ext-text' => 'باغلانتی یازیسی:',
+ 'wikieditor-toolbar-tool-link-insert' => 'کئچید یئرلش‌دیر',
+ 'wikieditor-toolbar-tool-link-cancel' => 'لغو ائت',
+ 'wikieditor-toolbar-tool-link-int-target-status-exists' => 'صحیÙÙ‡ واردیر',
+ 'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'صحیÙÙ‡ مؤوجود دئییل',
+ 'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'گئچرسیز آد',
+ 'wikieditor-toolbar-tool-link-int-target-status-external' => 'ائشیک باغلانتی',
+ 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'صحیÙه‌نین اولدوغو یوخلانیر...',
+ 'wikieditor-toolbar-tool-link-int-invalid' => 'وئردیگینیز باشلیق گئچرسیزدیر.',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'سیز وئردیگینیز آدرس، آیری ویکی صحیÙه‌سینه باغلانان نظره گلیر.
+اونو ایچری باغلانتی‌یه چئویرمگینی ایسته‌ییرسینیز؟',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'ایچری باغلانتی‌سی',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'خاریجی باغلانتی‌سی',
+ 'wikieditor-toolbar-tool-link-empty' => 'سیز باغلانماغا بیر شئی وئرمه‌دینیز.',
+ 'wikieditor-toolbar-tool-file' => 'یئرلشدیریلمیش Ùایل',
+ 'wikieditor-toolbar-tool-file-example' => 'میثال.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'Ùایل یئرلشدیر',
+ 'wikieditor-toolbar-file-target' => 'Ùايل آدی:',
+ 'wikieditor-toolbar-file-caption' => 'باشلیق:',
+ 'wikieditor-toolbar-file-size' => 'اؤلچو',
+ 'wikieditor-toolbar-file-float' => 'دوزمک:',
+ 'wikieditor-toolbar-file-default' => '(اؤن‌دَگَر)',
+ 'wikieditor-toolbar-file-format' => 'Ùورمت:',
+ 'wikieditor-toolbar-file-format-none' => 'هئچ بیری',
+ 'wikieditor-toolbar-tool-file-insert' => 'یاراشدیرماق',
+ 'wikieditor-toolbar-tool-file-cancel' => 'لغو ائت',
+ 'wikieditor-toolbar-tool-reference' => 'قایناق',
+ 'wikieditor-toolbar-tool-reference-example' => 'بوردا دیپ‌نوت یازی‌سی آرتیرین',
+ 'wikieditor-toolbar-tool-reference-cancel' => 'لغو ائت',
+ 'wikieditor-toolbar-tool-reference-title' => 'قایناق آرتیر',
+ 'wikieditor-toolbar-tool-reference-insert' => 'یاراشدیرماق',
+ 'wikieditor-toolbar-tool-reference-text' => 'ایستیناد متن',
+ 'wikieditor-toolbar-tool-signature' => 'ایمضا و واخت قئیدی',
+ 'wikieditor-toolbar-section-advanced' => 'گئنیشمیش',
+ 'wikieditor-toolbar-tool-heading' => 'باشلیق',
+ 'wikieditor-toolbar-tool-heading-1' => 'سطح ۱',
+ 'wikieditor-toolbar-tool-heading-2' => 'سطح ۲',
+ 'wikieditor-toolbar-tool-heading-3' => 'سطح ۳',
+ 'wikieditor-toolbar-tool-heading-4' => 'سطح ۴',
+ 'wikieditor-toolbar-tool-heading-5' => 'سطح ۵',
+ 'wikieditor-toolbar-tool-heading-example' => 'باشلیق متنی',
+ 'wikieditor-toolbar-group-format' => 'Ùورمت:',
+ 'wikieditor-toolbar-tool-ulist' => 'مارکالانمیش لیست',
+ 'wikieditor-toolbar-tool-ulist-example' => 'مارلاکانمیش لیست آیتÙÙ…ÛŒ',
+ 'wikieditor-toolbar-tool-olist' => 'نومره‌لنمیش لیست',
+ 'wikieditor-toolbar-tool-olist-example' => 'نومره‌لنمیش لیست آیتÙÙ…ÛŒ',
+ 'wikieditor-toolbar-tool-indent' => 'ایچری‌آپارما',
+ 'wikieditor-toolbar-tool-indent-example' => 'ایچری‌گئتمیش خط',
+ 'wikieditor-toolbar-tool-nowiki' => 'ویکی ‌Ùورمتینده دئییل',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'Ùورمت‌لشدیریلمه‌میش یازی‌نی بورا داخیل ائدین',
+ 'wikieditor-toolbar-tool-redirect' => 'یؤنلندیرمه',
+ 'wikieditor-toolbar-tool-redirect-example' => 'صحیÙÙ‡ آدینی علاوه ائت',
+ 'wikieditor-toolbar-tool-big' => 'بویوک',
+ 'wikieditor-toolbar-tool-big-example' => 'بؤیوک متن',
+ 'wikieditor-toolbar-tool-small' => 'کیچیک',
+ 'wikieditor-toolbar-tool-small-example' => 'کیچیک متن',
+ 'wikieditor-toolbar-tool-superscript' => 'اوست‌ یازی',
+ 'wikieditor-toolbar-tool-superscript-example' => 'اوست یازی‌سی',
+ 'wikieditor-toolbar-tool-subscript' => 'آلت یازی',
+ 'wikieditor-toolbar-tool-subscript-example' => 'آلت‌ یازی‌سی',
+ 'wikieditor-toolbar-group-insert' => 'یاراشدیرماق',
+ 'wikieditor-toolbar-tool-gallery' => 'شکیل قالئرئیاسی',
+ 'wikieditor-toolbar-tool-gallery-example' => '$1:اؤرنک.jpg|باشلیق۱
+$1:اؤرنک.jpg|باشلیق۲',
+ 'wikieditor-toolbar-tool-newline' => 'یئنی خط',
+ 'wikieditor-toolbar-tool-table' => 'جدول',
+ 'wikieditor-toolbar-tool-table-example-old' => '! باش‌لیق 1
+! باش‌لیق 2
+! باش‌لیق 3
+|-
+| سیرا 1، سوتون 1
+| سیرا 1، سوتون 2
+| سیرا 1، سوتون 3
+|-
+| سیرا 2، سوتون 1
+| سیرا 2، سوتون 2
+| سیرا 2، سوتون 3',
+ 'wikieditor-toolbar-tool-table-example-cell-text' => 'ائو متنی',
+ 'wikieditor-toolbar-tool-table-example-header' => 'باشلیق متنی',
+ 'wikieditor-toolbar-tool-table-title' => 'جدول آرتیرماق',
+ 'wikieditor-toolbar-tool-table-dimensions-rows' => 'سطرلر:',
+ 'wikieditor-toolbar-tool-table-dimensions-columns' => 'سوتونلار',
+ 'wikieditor-toolbar-tool-table-dimensions-header' => 'باشلیق سطرینی آرتیر',
+ 'wikieditor-toolbar-tool-table-wikitable' => 'کنارلیگی آرتیر',
+ 'wikieditor-toolbar-tool-table-sortable' => 'جدولی سیرالانا بیلن ائت',
+ 'wikieditor-toolbar-tool-table-example' => 'میثال',
+ 'wikieditor-toolbar-tool-table-preview' => 'اؤن‌گؤستریش',
+ 'wikieditor-toolbar-tool-table-insert' => 'یاراشدیرماق',
+ 'wikieditor-toolbar-tool-table-cancel' => 'لغو ائت',
+ 'wikieditor-toolbar-tool-table-toomany' => '$1 آرتیرماق چوخ بیر جدول علاوه بو مئساژ ایله مومکون دئییل.', # Fuzzy
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'هازیرکی بیر سطر و سوتون سایی یازمامیسینیز.',
+ 'wikieditor-toolbar-tool-table-zero' => 'بیر صیÙیر سطرلی یا سوتونلو جدول یئرلیشدیره بیلنمیزسینیز.',
+ 'wikieditor-toolbar-tool-replace' => 'آختار و دییش',
+ 'wikieditor-toolbar-tool-replace-title' => 'آختار و دییش',
+ 'wikieditor-toolbar-tool-replace-search' => 'آختار:',
+ 'wikieditor-toolbar-tool-replace-replace' => 'بونونلا دییش:',
+ 'wikieditor-toolbar-tool-replace-case' => 'حرÙلرین یئکه/کیچیک اولدوقلارینی تطبیق‌له',
+ 'wikieditor-toolbar-tool-replace-regex' => 'آختاریش یازیسینی، مونظم سؤز (رÙقولار اÙکسپرÙØ´ÙÙ†) کیمی نظرده آل',
+ 'wikieditor-toolbar-tool-replace-button-findnext' => 'نؤوبتینی آختار',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'یئرینه قوی',
+ 'wikieditor-toolbar-tool-replace-button-replaceall' => 'هامی‌سینی دییش',
+ 'wikieditor-toolbar-tool-replace-close' => 'باغلا',
+ 'wikieditor-toolbar-tool-replace-nomatch' => 'سیزین آختاریشینیزا بیر شئی تطبیق اولونمادی.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 یئرینه-قویماق اولوندو.', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-emptysearch' => 'سیز آختارماغا بیر شئی وئرمه‌دینیز.',
+ 'wikieditor-toolbar-tool-replace-invalidregex' => 'سیز وئردیگینیز مونظم سؤز (رÙقولار اÙکسپرÙØ´ÙÙ†) گئچرسیزدیر: $1',
+ 'wikieditor-toolbar-section-characters' => 'خصوصی یازیلار:',
+ 'wikieditor-toolbar-characters-page-latin' => 'لاتین',
+ 'wikieditor-toolbar-characters-page-latinextended' => 'لاتین گئنیشلندیریلمیش',
+ 'wikieditor-toolbar-characters-page-ipa' => 'IPA',
+ 'wikieditor-toolbar-characters-page-symbols' => 'سیمبول لار',
+ 'wikieditor-toolbar-characters-page-greek' => 'یونانی',
+ 'wikieditor-toolbar-characters-page-cyrillic' => 'کیریل',
+ 'wikieditor-toolbar-characters-page-arabic' => 'عربجه',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'گئنیشلندیریلمیش عربجه',
+ 'wikieditor-toolbar-characters-page-persian' => 'Ùارسجا',
+ 'wikieditor-toolbar-characters-page-hebrew' => 'عبرجه',
+ 'wikieditor-toolbar-characters-page-bangla' => 'بنگالجه',
+ 'wikieditor-toolbar-characters-page-tamil' => 'تامیلجه',
+ 'wikieditor-toolbar-characters-page-telugu' => 'تالوگوجه',
+ 'wikieditor-toolbar-characters-page-sinhala' => 'سینهالجه',
+ 'wikieditor-toolbar-characters-page-gujarati' => 'گجراتجه',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'دیواناگرى',
+ 'wikieditor-toolbar-characters-page-thai' => 'تایلندجه',
+ 'wikieditor-toolbar-characters-page-lao' => 'لائو',
+ 'wikieditor-toolbar-characters-page-khmer' => 'خمر',
+ 'wikieditor-toolbar-characters-endash' => 'آرالیق خطی دی',
+ 'wikieditor-toolbar-characters-emdash' => 'آرالیق خطی چکیلیب',
+ 'wikieditor-toolbar-characters-minus' => 'منÙÛŒ علامتی',
+ 'wikieditor-toolbar-section-help' => 'یاردیم',
+ 'wikieditor-toolbar-help-heading-description' => 'شرح',
+ 'wikieditor-toolbar-help-heading-syntax' => 'یازدیگینیز',
+ 'wikieditor-toolbar-help-heading-result' => 'آلدیگینیز',
+ 'wikieditor-toolbar-help-page-format' => 'Ùورماتلاش‌دیرماق',
+ 'wikieditor-toolbar-help-page-link' => 'باغلانتیلار',
+ 'wikieditor-toolbar-help-page-heading' => 'باشلیقلار',
+ 'wikieditor-toolbar-help-page-list' => 'سییاهه‌لر',
+ 'wikieditor-toolbar-help-page-file' => 'Ùایل‌لار',
+ 'wikieditor-toolbar-help-page-reference' => 'قایناق',
+ 'wikieditor-toolbar-help-page-discussion' => 'دانیشیق',
+ 'wikieditor-toolbar-help-content-italic-description' => 'مورب',
+ 'wikieditor-toolbar-help-content-italic-syntax' => "''مورب متنی''",
+ 'wikieditor-toolbar-help-content-italic-result' => '<em>مورب متنی</em>',
+ 'wikieditor-toolbar-help-content-bold-description' => 'قالین رنگ',
+ 'wikieditor-toolbar-help-content-bold-syntax' => 'قالین متن',
+ 'wikieditor-toolbar-help-content-bold-result' => '<strong>قالین متن</strong>',
+ 'wikieditor-toolbar-help-content-bolditalic-description' => 'قالین و مورب',
+ 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''قالین و مورب متن'''''",
+ 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>قالین و مورب متن</em></strong>',
+ 'wikieditor-toolbar-help-content-ilink-description' => 'ایچری باغلانتی‌سی',
+ 'wikieditor-toolbar-help-content-ilink-syntax' => '[[صحیÙه‌نین آدی|کئچیدین آدی]]<br />[[صحیÙه‌نین آدی]]',
+ 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>کئچیدین آدی</a><br /><a href='#'>سهیÙه‌نین آدی</a>",
+ 'wikieditor-toolbar-help-content-xlink-description' => 'خاریجی باغلانتی‌سی',
+ 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org باغلانتی باشلیقی]<br />[http://www.example.org]<br />http://www.example.org',
+ 'wikieditor-toolbar-help-content-xlink-result' => "</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
+ 'wikieditor-toolbar-help-content-heading2-description' => '2-جی سویه‌لی باش‌لیق',
+ 'wikieditor-toolbar-help-content-heading2-syntax' => '== باش‌لیق متن ==',
+ 'wikieditor-toolbar-help-content-heading2-result' => '<h2>باشلیق متن</h2>',
+ 'wikieditor-toolbar-help-content-heading3-description' => '3-جو سویه‌لی باش‌لیق',
+ 'wikieditor-toolbar-help-content-heading3-syntax' => '== متن باشلیغی ==',
+ 'wikieditor-toolbar-help-content-heading3-result' => '<h3>باشلیق متن</h3>',
+ 'wikieditor-toolbar-help-content-heading4-description' => '4-جو سویه‌لی باش‌لیق',
+ 'wikieditor-toolbar-help-content-heading4-syntax' => '==== متن باشلیغی ====',
+ 'wikieditor-toolbar-help-content-heading4-result' => '<h4>باشلیق متن</h4>',
+ 'wikieditor-toolbar-help-content-heading5-description' => '5-جی سویه‌لی باش‌لیق',
+ 'wikieditor-toolbar-help-content-heading5-syntax' => '===== متن باشلیغی =====',
+ 'wikieditor-toolbar-help-content-heading5-result' => '<h5>باشلیق متن</h5>',
+ 'wikieditor-toolbar-help-content-ulist-description' => 'مارکالانمیش سیاهی',
+ 'wikieditor-toolbar-help-content-ulist-syntax' => '* سیاهی بندی<br />*سیاهی بندی',
+ 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>سیاهی بندی</li><li>سیاهی بندی</li></ul>',
+ 'wikieditor-toolbar-help-content-olist-description' => 'نومره‌لنمیش لیست',
+ 'wikieditor-toolbar-help-content-olist-syntax' => '# سیاهی بندی<br /># سیاهی بندی',
+ 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>سیاهی بندی</li><li>سیاهی بندی</li></ol>',
+ 'wikieditor-toolbar-help-content-file-description' => 'یئرلشدیریلمیش Ùایل',
+ 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:مثال.png|thumb|موضوع متنی]]',
+ 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='باشلیق متنی' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='یئکتمه' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>عنوان باشلیقی</div></div>",
+ 'wikieditor-toolbar-help-content-reference-description' => 'قایناق',
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'صحیÙه‌نین متنی.&lt;ref name="test"&gt;[http://www.example.org کئچیدین متنی]ØŒ علاوه متنت.&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-reference-result' => "صحیÙÙ‡ متنی.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-rereference-description' => 'عینی ایستیناددان ایستیÙاده‌نین علاوه‌سی',
+ 'wikieditor-toolbar-help-content-rereference-result' => "صحیÙÙ‡ متنی.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-showreferences-description' => 'قایناق لاری گؤستر',
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>م</a>، آرتیق متن.</li></ol>تن باغلانتی سی",
+ 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'واخت قئیدی ایله ایمضا',
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>ایستÙادچی آدی</a> (<a href='#' title='{{#special:mytalk}}'>دانیشیق</a>) 15:54, 10 June 2009 (UTC)",
+ 'wikieditor-toolbar-help-content-signature-description' => 'ایمضا',
+ 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>ایستÙاده Ú†ÛŒ آدی</a> (<a href='#' title='{{#special:mytalk}}'>دانیشیق</a>)",
+ 'wikieditor-toolbar-help-content-indent-description' => 'ایچری باتدیگی',
+ 'wikieditor-toolbar-help-content-indent-syntax' => 'Normal mətn<br />:ایچری باتدیگی متن<br />::ایچری باتدیگی متن',
+ 'wikieditor-toolbar-help-content-indent-result' => 'نورمال یازی<dl><dd>ایچری‌گئتمیش یازی<dl><dd>ایچری‌گئتمیش یازی</dd></dl></dd></dl>',
+);
+
/** Bashkir (башҡортÑа)
* @author Assele
* @author Haqmar
@@ -2568,6 +2841,7 @@ $messages['ba'] = array(
'wikieditor-toolbar-desc' => 'Яҡшыртылған мөхәррирләү ҡоралдары',
'wikieditor-toolbar-preference' => 'Яҡшыртылған мөхәррирләү ҡоралдарын ҡулланырға',
'wikieditor-toolbar-dialogs-preference' => 'Һылтанмалар, таблицалар һәм башҡаларҙы Ó©Ò«Ñ‚Ó™Ò¯ Ó©Ñөн диалогтар ҡулланырға',
+ 'wikieditor-toolbar-hidesig' => 'Имза ҡуйыу төймәһен төп иÑемдәр арауығындағы биттәрҙә йәшерергә',
'wikieditor-toolbar-loading' => 'Сығарыу...',
'wikieditor-toolbar-tool-bold' => 'Ҡалын',
'wikieditor-toolbar-tool-bold-example' => 'Ҡалын Ñҙылыш',
@@ -2604,10 +2878,12 @@ $messages['ba'] = array(
'wikieditor-toolbar-tool-file-example' => 'Миҫал.jpg',
'wikieditor-toolbar-tool-file-title' => 'Файл өҫтәү',
'wikieditor-toolbar-file-target' => 'Файл иÑеме:',
+ 'wikieditor-toolbar-file-caption' => 'ИÑеме:',
'wikieditor-toolbar-file-size' => 'Күләме:',
'wikieditor-toolbar-file-float' => 'Тигеҙләү:',
'wikieditor-toolbar-file-default' => '(ғәҙәттәге)',
'wikieditor-toolbar-file-format' => 'Формат:',
+ 'wikieditor-toolbar-file-format-none' => 'ÑŽÒ¡',
'wikieditor-toolbar-tool-file-insert' => 'Ó¨Ò«Ñ‚Ó™Ò¯',
'wikieditor-toolbar-tool-file-cancel' => 'Кире алырға',
'wikieditor-toolbar-tool-reference' => 'Төшөрмә',
@@ -2673,7 +2949,7 @@ $1:Миҫал.jpg|ТаÑуирлама2',
'wikieditor-toolbar-tool-table-preview' => 'Ҡарап Ñығырға',
'wikieditor-toolbar-tool-table-insert' => 'Өҫтәргә',
'wikieditor-toolbar-tool-table-cancel' => 'Кире алырға',
- 'wikieditor-toolbar-tool-table-toomany' => 'Был диалог аша $1 күҙәнәктән ашыу дәүмәл менән таблица өҫтәргә мөмкин түгел.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Был диалог аша $1 күҙәнәктән ашыу дәүмәл менән таблица өҫтәргә мөмкин түгел.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Һеҙ юлдар һәм бағаналар һанын дөрөҫ күрһәтмәгәнһегеҙ.',
'wikieditor-toolbar-tool-table-zero' => 'Юлдар һәм бағаналар һаны нуль була алмай.',
'wikieditor-toolbar-tool-replace' => 'Эҙләү һәм алмаштырыу',
@@ -2687,7 +2963,7 @@ $1:Миҫал.jpg|ТаÑуирлама2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Барыһын да алмаштырырға',
'wikieditor-toolbar-tool-replace-close' => 'Ябырға',
'wikieditor-toolbar-tool-replace-nomatch' => 'Һеҙҙең һорауығыҙ буйынÑа бер ни Ò™Ó™ табылманы.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 алмаштырыу үткәрелде.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 алмаштырыу үткәрелде.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Һеҙ нимә Ñҙләгәнегеҙҙе күрһәтмәгәнһегеҙ.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Һеҙ кереткән регулÑÑ€ аңлатма дөрөҫ түгел: $1',
'wikieditor-toolbar-section-characters' => 'МахÑÑƒÑ Ñ‚Ð°Ð¼Ò“Ð°Ð»Ð°Ñ€',
@@ -2698,6 +2974,7 @@ $1:Миҫал.jpg|ТаÑуирлама2',
'wikieditor-toolbar-characters-page-greek' => 'Грек',
'wikieditor-toolbar-characters-page-cyrillic' => 'Кириллик',
'wikieditor-toolbar-characters-page-arabic' => 'Ғәрәп',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Ғәрәп (киңәйтелгән)',
'wikieditor-toolbar-characters-page-persian' => 'ФарÑÑ‹',
'wikieditor-toolbar-characters-page-hebrew' => 'Йәһүд',
'wikieditor-toolbar-characters-page-bangla' => 'Бенгал',
@@ -2709,6 +2986,9 @@ $1:Миҫал.jpg|ТаÑуирлама2',
'wikieditor-toolbar-characters-page-thai' => 'Тай',
'wikieditor-toolbar-characters-page-lao' => 'Лао',
'wikieditor-toolbar-characters-page-khmer' => 'Кһмер',
+ 'wikieditor-toolbar-characters-endash' => 'уртаÑа һыҙыҡ',
+ 'wikieditor-toolbar-characters-emdash' => 'оҙон һыҙыҡ',
+ 'wikieditor-toolbar-characters-minus' => 'Ð¼Ð¸Ð½ÑƒÑ Ð±Ð¸Ð»Ð´Ó™Ò»Ðµ',
'wikieditor-toolbar-section-help' => 'Белешмә',
'wikieditor-toolbar-help-heading-description' => 'ТаÑуирлама',
'wikieditor-toolbar-help-heading-syntax' => 'Һеҙ керетәһегеҙ',
@@ -2915,7 +3195,7 @@ $1:Example.jpg|ÐпіÑанне2',
'wikieditor-toolbar-tool-table-preview' => 'Перадпаказ',
'wikieditor-toolbar-tool-table-insert' => 'УÑтавіць',
'wikieditor-toolbar-tool-table-cancel' => 'Закрыць',
- 'wikieditor-toolbar-tool-table-toomany' => 'УÑтаўка табліцы больш чым з $ 1 {{PLURAL:$1|ÑчÑйкай|ÑчÑйкамі|ÑчÑйкамі}} не магчыма праз гÑÑ‚Ñ‹ дыÑлог.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'УÑтаўка табліцы больш чым з $ 1 {{PLURAL:$1|ÑчÑйкай|ÑчÑйкамі|ÑчÑйкамі}} не магчыма праз гÑÑ‚Ñ‹ дыÑлог.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ð’Ñ‹ не ўвÑлі Ñлушную колькаÑць радкоў або Ñлупкоў.',
'wikieditor-toolbar-tool-table-zero' => 'Ð’Ñ‹ не можаце ÑžÑтавіць табліцу з нулÑвой колькаÑцю радкоў або Ñлупкоў.',
'wikieditor-toolbar-tool-replace' => 'ЗнайÑці Ñ– замÑніць',
@@ -2928,7 +3208,7 @@ $1:Example.jpg|ÐпіÑанне2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'ЗамÑніць уÑе',
'wikieditor-toolbar-tool-replace-close' => 'Закрыць',
'wikieditor-toolbar-tool-replace-nomatch' => 'Ваш пошук нічога не даў.',
- 'wikieditor-toolbar-tool-replace-success' => 'Зроблена $1 замен.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Зроблена $1 замен.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Вы не далі чаго шукаць.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Ð’Ñ‹ далі нÑверны Ñ€ÑгулÑрны выраз: $1',
'wikieditor-toolbar-section-characters' => 'СпецыÑÐ»ÑŒÐ½Ñ‹Ñ Ñімвалы',
@@ -3160,7 +3440,7 @@ $1:Прыклад.jpg|ПодпіÑ2',
'wikieditor-toolbar-tool-table-preview' => 'ПапÑÑ€Ñдні праглÑд',
'wikieditor-toolbar-tool-table-insert' => 'УÑтавіць',
'wikieditor-toolbar-tool-table-cancel' => 'Закрыць',
- 'wikieditor-toolbar-tool-table-toomany' => 'ГÑÑ‚Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° Ð½Ñ Ð¼Ð¾Ð¶Ð° ÑžÑтавіць табліцу, ÑÐºÐ°Ñ ÑžÑ‚Ñ€Ñ‹Ð¼Ð»Ñ–Ð²Ð°Ðµ больш за $1 {{PLURAL:$1|ÑчÑйку|ÑчÑйкі|ÑчÑек}}.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'ГÑÑ‚Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° Ð½Ñ Ð¼Ð¾Ð¶Ð° ÑžÑтавіць табліцу, ÑÐºÐ°Ñ ÑžÑ‚Ñ€Ñ‹Ð¼Ð»Ñ–Ð²Ð°Ðµ больш за 1000 ÑчÑек.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ð’Ñ‹ не ўвÑлі Ñлушную колькаÑьць радкоў ці Ñлупкоў.',
'wikieditor-toolbar-tool-table-zero' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð¾Ð¶Ð°Ñ†Ðµ ÑžÑтавіць табліцу з нулÑвой колькаÑьцю радкоў ці Ñлупкоў.',
'wikieditor-toolbar-tool-replace' => 'ЗнайÑьці Ñ– замÑніць',
@@ -3174,7 +3454,7 @@ $1:Прыклад.jpg|ПодпіÑ2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'ЗамÑніць уÑÑ‘',
'wikieditor-toolbar-tool-replace-close' => 'Закрыць',
'wikieditor-toolbar-tool-replace-nomatch' => 'Па Вашым запыце нічога Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð°.',
- 'wikieditor-toolbar-tool-replace-success' => 'Зроблена заменаў: $1.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Зроблена $1 {{PLURAL:$1|замена|замены|заменаў}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ð’Ñ‹ не ўвÑлі нічога Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Уведзены Вамі Ñ€ÑгулÑрны выраз зьÑўлÑецца нÑÑлушным: $1',
'wikieditor-toolbar-section-characters' => 'СпÑцыÑÐ»ÑŒÐ½Ñ‹Ñ Ñымбалі',
@@ -3267,6 +3547,7 @@ $1:Прыклад.jpg|ПодпіÑ2',
* @author DCLXVI
* @author McDutchie
* @author Spiritia
+ * @author Stanqo
* @author Turin
* @author Wizardist
*/
@@ -3335,6 +3616,16 @@ $messages['bg'] = array(
'wikieditor-toolbar-tool-link-empty' => 'Ðе Ñте въвели Ð°Ð´Ñ€ÐµÑ Ð½Ð° препратката.',
'wikieditor-toolbar-tool-file' => 'Вграден файл',
'wikieditor-toolbar-tool-file-example' => 'Пример.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'Вмъкване на файл',
+ 'wikieditor-toolbar-file-target' => 'Име на файл:',
+ 'wikieditor-toolbar-file-caption' => 'ÐадпиÑ:',
+ 'wikieditor-toolbar-file-size' => 'Размер:',
+ 'wikieditor-toolbar-file-float' => 'ПодравнÑване:',
+ 'wikieditor-toolbar-file-default' => '(по подразбиране)',
+ 'wikieditor-toolbar-file-format' => 'Оформление:',
+ 'wikieditor-toolbar-file-format-none' => 'нÑма',
+ 'wikieditor-toolbar-tool-file-insert' => 'Вмъкване',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Отказ',
'wikieditor-toolbar-tool-reference' => 'Източник (бележка под линиÑ)',
'wikieditor-toolbar-tool-reference-example' => 'Въведете тук текÑÑ‚ на бележка под линиÑ',
'wikieditor-toolbar-tool-reference-cancel' => 'Отказване',
@@ -3399,7 +3690,7 @@ $1:Example.jpg|ОпиÑание2',
'wikieditor-toolbar-tool-table-preview' => 'Предварителен преглед',
'wikieditor-toolbar-tool-table-insert' => 'Вмъкване',
'wikieditor-toolbar-tool-table-cancel' => 'Отказване',
- 'wikieditor-toolbar-tool-table-toomany' => 'През този диалогов режим не може да Ñе вмъкне таблица Ñ Ð¿Ð¾Ð²ÐµÑ‡Ðµ от $1 клетки.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'През този диалогов режим не може да Ñе вмъкне таблица Ñ Ð¿Ð¾Ð²ÐµÑ‡Ðµ от $1 клетки.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ðе Ñте въвели валидно чиÑло за Ð±Ñ€Ð¾Ñ Ñ€ÐµÐ´Ð¾Ð²Ðµ или Ñтълбове.',
'wikieditor-toolbar-tool-table-zero' => 'Ðе можете да вмъкнете таблица Ñ Ð½ÑƒÐ»Ð° на брой редове или Ñтълбове.',
'wikieditor-toolbar-tool-replace' => 'ТърÑене и замÑна',
@@ -3409,6 +3700,7 @@ $1:Example.jpg|ОпиÑание2',
'wikieditor-toolbar-tool-replace-case' => 'ЧувÑтвителноÑÑ‚ към региÑтъра',
'wikieditor-toolbar-tool-replace-regex' => 'Третиране на низа за Ñ‚ÑŠÑ€Ñене като регулÑрен израз',
'wikieditor-toolbar-tool-replace-button-findnext' => 'ТърÑене на Ñледващо',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'ЗамеÑтване',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'ЗамÑна на вÑички',
'wikieditor-toolbar-tool-replace-close' => 'ЗатварÑне',
'wikieditor-toolbar-tool-replace-nomatch' => 'ÐÑмаше резултати, които да отговарÑÑ‚ на вашето Ñ‚ÑŠÑ€Ñене.',
@@ -3423,14 +3715,21 @@ $1:Example.jpg|ОпиÑание2',
'wikieditor-toolbar-characters-page-greek' => 'Гръцки',
'wikieditor-toolbar-characters-page-cyrillic' => 'Кирилица',
'wikieditor-toolbar-characters-page-arabic' => 'ÐрабÑки',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Разширен арабÑки',
'wikieditor-toolbar-characters-page-persian' => 'перÑийÑки',
'wikieditor-toolbar-characters-page-hebrew' => 'Иврит',
'wikieditor-toolbar-characters-page-bangla' => 'БенгалÑки',
+ 'wikieditor-toolbar-characters-page-tamil' => 'ТамилÑки',
'wikieditor-toolbar-characters-page-telugu' => 'Телугу',
'wikieditor-toolbar-characters-page-sinhala' => 'СинхалÑки',
'wikieditor-toolbar-characters-page-gujarati' => 'Гуджарати',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'Деванагари',
'wikieditor-toolbar-characters-page-thai' => 'тайландÑки',
+ 'wikieditor-toolbar-characters-page-lao' => 'Лао',
'wikieditor-toolbar-characters-page-khmer' => 'кхмерÑки',
+ 'wikieditor-toolbar-characters-endash' => 'Ñредно тире',
+ 'wikieditor-toolbar-characters-emdash' => 'дълго тире',
+ 'wikieditor-toolbar-characters-minus' => 'знак минуÑ',
'wikieditor-toolbar-section-help' => 'Помощ',
'wikieditor-toolbar-help-heading-description' => 'ОпиÑание',
'wikieditor-toolbar-help-heading-syntax' => 'В режим на редактиране',
@@ -3700,6 +3999,7 @@ $1:Cuntuh.jpg|Judul2',
/** Bengali (বাংলা)
* @author Bellayet
+ * @author Leemon2010
* @author Nasir8891
* @author Wikitanvir
*/
@@ -3724,7 +4024,7 @@ $messages['bn'] = array(
'wikieditor-publish-dialog-publish' => 'পà§à¦°à¦•à¦¾à¦¶ করো',
'wikieditor-publish-dialog-goback' => 'ফিরে যাও',
'wikieditor-template-editor-preference' => 'উইকি টেমà§à¦ªà¦²à§‡à¦Ÿà§‡à¦° ফরম ভিতà§à¦¤à¦¿à¦• সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সকà§à¦°à¦¿à¦¯à¦¼ করো',
- 'wikieditor-template-editor-dialog-title' => 'টেমà§à¦ªà¦²à§‡à¦Ÿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
+ 'wikieditor-template-editor-dialog-title' => 'টেমপà§à¦²à§‡à¦Ÿ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'wikieditor-template-editor-dialog-submit' => 'হালনাগাদ',
'wikieditor-template-editor-dialog-cancel' => 'বাতিল',
'wikieditor-templates-preference' => 'টেমà§à¦ªà¦²à§‡à¦Ÿ ভাà¦à¦œ হওয়া সকà§à¦°à¦¿à¦¯à¦¼',
@@ -3735,6 +4035,7 @@ $messages['bn'] = array(
'wikieditor-toolbar-desc' => 'বেশি বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦¯à§‹à¦—à§à¦¯ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ পাতার টà§à¦²à¦¬à¦¾à¦°',
'wikieditor-toolbar-preference' => 'শকà§à¦¤à¦¿à¦¶à¦¾à¦²à§€ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ টà§à¦²à¦¬à¦¾à¦° সকà§à¦°à¦¿à¦¯à¦¼ করো',
'wikieditor-toolbar-dialogs-preference' => 'যোগকৃত লিংক, ছক à¦à¦¬à¦‚ আরও কিছà§à¦° জনà§à¦¯ ডায়লগ সকà§à¦°à¦¿à¦¯à¦¼ করো',
+ 'wikieditor-toolbar-hidesig' => 'পà§à¦°à¦§à¦¾à¦¨ নামসà§à¦¥à¦¾à¦¨à§‡à¦° পাতায় সà§à¦¬à¦¾à¦•à§à¦·à¦° বোতাম লà§à¦•à¦¾à¦“',
'wikieditor-toolbar-loading' => 'লোডিং...',
'wikieditor-toolbar-tool-bold' => 'গাঢ়',
'wikieditor-toolbar-tool-bold-example' => 'গাঢ় লেখা',
@@ -3772,8 +4073,10 @@ $messages['bn'] = array(
'wikieditor-toolbar-file-target' => 'ফাইলের নাম:',
'wikieditor-toolbar-file-caption' => 'কà§à¦¯à¦¾à¦ªà¦¶à¦¨:',
'wikieditor-toolbar-file-size' => 'আকার:',
+ 'wikieditor-toolbar-file-float' => 'সারিবদà§à¦§:',
'wikieditor-toolbar-file-default' => '(ডিফলà§à¦Ÿ)',
'wikieditor-toolbar-file-format' => 'ফরমà§à¦¯à¦¾à¦Ÿ:',
+ 'wikieditor-toolbar-file-format-none' => 'কিছà§à¦‡ না',
'wikieditor-toolbar-tool-file-insert' => 'যোগ করো',
'wikieditor-toolbar-tool-file-cancel' => 'বাতিল',
'wikieditor-toolbar-tool-reference' => 'তথà§à¦¯à¦¸à§‚তà§à¦°',
@@ -3840,7 +4143,7 @@ $1:Example.jpg|কà§à¦¯à¦¾à¦ªà¦¶à¦¨à§¨',
'wikieditor-toolbar-tool-table-preview' => 'পà§à¦°à¦¾à¦•à¦¦à¦°à§à¦¶à¦¨',
'wikieditor-toolbar-tool-table-insert' => 'যোগ করো',
'wikieditor-toolbar-tool-table-cancel' => 'বাতিল',
- 'wikieditor-toolbar-tool-table-toomany' => 'à¦à¦‡ ডায়লগ দà§à¦¬à¦¾à¦°à¦¾ $1 ঘরের বেশি ছক যোগ করা সমà§à¦­à¦¬ নয়।',
+ 'wikieditor-toolbar-tool-table-toomany' => 'à¦à¦‡ ডায়লগ দà§à¦¬à¦¾à¦°à¦¾ $1 ঘরের বেশি ছক যোগ করা সমà§à¦­à¦¬ নয়।', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'আপনি সারি à¦à¦¬à¦‚ কলামের জনà§à¦¯ ভà§à¦² সংখà§à¦¯à¦¾ টাইপ করেছেন।',
'wikieditor-toolbar-tool-table-zero' => 'আপনি ছকের সারি à¦à¦¬à¦‚ কলামের সংখà§à¦¯à¦¾ শূনà§à¦¯ দিতে পারবেন না।',
'wikieditor-toolbar-tool-replace' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ à¦à¦¬à¦‚ পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨',
@@ -3854,7 +4157,7 @@ $1:Example.jpg|কà§à¦¯à¦¾à¦ªà¦¶à¦¨à§¨',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'সব পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨',
'wikieditor-toolbar-tool-replace-close' => 'বনà§à¦§',
'wikieditor-toolbar-tool-replace-nomatch' => 'আপনার অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ কোনো কিছà§à¦° সাথে মিলেনি।',
- 'wikieditor-toolbar-tool-replace-success' => '$1 টি পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨ সমà§à¦ªà¦¨à§à¦¨ হয়েছে।',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 টি পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨ সমà§à¦ªà¦¨à§à¦¨ হয়েছে।', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'আপনি অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨à§‡à¦° জনà§à¦¯ কোনো কিছৠদেননি।',
'wikieditor-toolbar-tool-replace-invalidregex' => 'আপনার দেওয়া রেগà§à¦²à¦¾à¦° à¦à¦•à§à¦¸à¦ªà§à¦°à§‡à¦¶à¦¨à¦Ÿà¦¿ ঠিক নয়: $1',
'wikieditor-toolbar-section-characters' => 'বিশেষ বরà§à¦£à¦¸à¦®à§‚হ',
@@ -3872,11 +4175,12 @@ $1:Example.jpg|কà§à¦¯à¦¾à¦ªà¦¶à¦¨à§¨',
'wikieditor-toolbar-characters-page-telugu' => 'তেলেগà§',
'wikieditor-toolbar-characters-page-sinhala' => 'শিংহলী',
'wikieditor-toolbar-characters-page-gujarati' => 'গà§à¦œà¦°à¦¾à¦¤à¦¿',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'দেবনাগরী',
'wikieditor-toolbar-characters-page-thai' => 'থাই',
'wikieditor-toolbar-characters-page-lao' => 'লাও',
'wikieditor-toolbar-characters-page-khmer' => 'খেমার',
'wikieditor-toolbar-section-help' => 'সাহাযà§à¦¯',
- 'wikieditor-toolbar-help-heading-description' => 'বরà§à¦£à¦¨à¦¾',
+ 'wikieditor-toolbar-help-heading-description' => 'বিবরণ',
'wikieditor-toolbar-help-heading-syntax' => 'আপনি যা টাইপ করেছেন',
'wikieditor-toolbar-help-heading-result' => 'আপনি যা দেখতে পাচà§à¦›à§‡à¦¨',
'wikieditor-toolbar-help-page-format' => 'বিনà§à¦¯à¦¾à¦¸à¦¨',
@@ -3922,6 +4226,7 @@ $1:Example.jpg|কà§à¦¯à¦¾à¦ªà¦¶à¦¨à§¨',
'wikieditor-toolbar-help-content-file-description' => 'à¦à¦®à§à¦¬à§‡à¦¡à§‡à¦¡ ফাইল',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|কà§à¦¯à¦¾à¦ªà¦¶à¦¨ লেখ]]',
'wikieditor-toolbar-help-content-reference-description' => 'তথà§à¦¯à¦¸à§‚তà§à¦°',
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'পাতার লেখা।&lt;ref name="test"&gt;[http://www.example.org লিংকের লেখা], অতিরিকà§à¦¤ লেখা।&lt;/ref&gt;',
'wikieditor-toolbar-help-content-reference-result' => "পাতার লেখা।<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-rereference-description' => 'à¦à¦•à¦‡ তথà§à¦¯à¦¸à§‚তà§à¦°à§‡à¦° à¦à¦•à¦¾à¦§à¦¿à¦• বà§à¦¯à¦¬à¦¹à¦¾à¦°',
'wikieditor-toolbar-help-content-rereference-result' => "পাতার লেখ।<sup><a href='#'>[1]</a></sup>",
@@ -4077,7 +4382,7 @@ $1:Example.jpg|কà§à¦¯à¦¾à¦ªà¦¶à¦¨à§¨',
'wikieditor-toolbar-tool-table-preview' => 'আগচা',
'wikieditor-toolbar-tool-table-insert' => 'বরা',
'wikieditor-toolbar-tool-table-cancel' => 'বাতিল করেদে',
- 'wikieditor-toolbar-tool-table-toomany' => 'à¦à¦°à§‡ ডায়লগ à¦à¦¹à¦¾à¦¨à§à¦¨ $1 র বপ ছক বরানি নাকরব।',
+ 'wikieditor-toolbar-tool-table-toomany' => 'à¦à¦°à§‡ ডায়লগ à¦à¦¹à¦¾à¦¨à§à¦¨ $1 র বপ ছক বরানি নাকরব।', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'তা পারেঙ বারো দà§à¦°à¦°à¦•à¦¾ দিয়াসত নমà§à¦¬à¦° চà§à¦® নাইসে।',
'wikieditor-toolbar-tool-table-zero' => 'তি পারেঙ বারো দà§à¦°à¦° কা শà§à¦¨à§à¦¯ দেনা নà§à§±à¦¾à¦°à¦¬à§‡à¥¤',
'wikieditor-toolbar-tool-replace' => 'বিসারা বারো সিলকর',
@@ -4090,7 +4395,7 @@ $1:Example.jpg|কà§à¦¯à¦¾à¦ªà¦¶à¦¨à§¨',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'হাবি বদালা',
'wikieditor-toolbar-tool-replace-close' => 'à¦à¦¿à¦ªà¦¾',
'wikieditor-toolbar-tool-replace-nomatch' => 'তি যেহান বিসারার অহান কিতà§à¦¤à¦¾à¦° লগেউ না মিলের',
- 'wikieditor-toolbar-tool-replace-success' => '$1 হান সিলকরানি ইল।',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 হান সিলকরানি ইল।', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'মিলাপ কারানির কা কিতà§à¦¤à¦¾à¦‰ না ইকরলে।',
'wikieditor-toolbar-tool-replace-invalidregex' => 'তি দিয়াসত রেগà§à¦²à¦¾à¦° à¦à¦•à§à¦¸à¦ªà§à¦°à§‡à¦¶à¦¨à¦¹à¦¾à¦¨ চà§à¦® নাইসে: $1',
'wikieditor-toolbar-section-characters' => 'বিশেষ আখরগি',
@@ -4225,7 +4530,7 @@ $messages['br'] = array(
'wikieditor-toolbar-tool-link' => 'Liamm',
'wikieditor-toolbar-tool-link-title' => "Ensoc'hañ ul liamm",
'wikieditor-toolbar-tool-link-int' => 'war-du ur bajenn wiki',
- 'wikieditor-toolbar-tool-link-int-target' => 'Anv ar bajenn :',
+ 'wikieditor-toolbar-tool-link-int-target' => 'Pajenn voned pe URL :',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Titl pe URL ar bajenn',
'wikieditor-toolbar-tool-link-int-text' => 'Testenn al liamm :',
'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Ebarzhit an destenn da vezañ diskwelet',
@@ -4320,7 +4625,7 @@ $1:Skouer.jpg|Deskrivadur2',
'wikieditor-toolbar-tool-table-preview' => 'Rakwelet',
'wikieditor-toolbar-tool-table-insert' => "Ensoc'hañ",
'wikieditor-toolbar-tool-table-cancel' => 'Nullañ',
- 'wikieditor-toolbar-tool-table-toomany' => "N'haller ket ensoc'hañ un daolenn enni muioc'h eget $1 kellig gant an ostilh-mañ.",
+ 'wikieditor-toolbar-tool-table-toomany' => "N'haller ket ensoc'hañ un daolenn enni muioc'h eget $1 kellig gant an ostilh-mañ.", # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => "Merket hoc'h eus un niver a linennoù pe a vannoù direizh.",
'wikieditor-toolbar-tool-table-zero' => "N'hallit ket ensoc'hañ un daolenn hep bann na linenn.",
'wikieditor-toolbar-tool-replace' => "Klask hag erlec'hiañ",
@@ -4334,7 +4639,7 @@ $1:Skouer.jpg|Deskrivadur2',
'wikieditor-toolbar-tool-replace-button-replaceall' => "Erlec'hiañ pep tra",
'wikieditor-toolbar-tool-replace-close' => 'Serriñ',
'wikieditor-toolbar-tool-replace-nomatch' => "N'eus bet kavet netra o klotañ gant ar pezh a glaskit.",
- 'wikieditor-toolbar-tool-replace-success' => "$1 erlec'hiadenn graet",
+ 'wikieditor-toolbar-tool-replace-success' => "$1 erlec'hiadenn graet", # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => "N'hoc'h eus ebarzhet netra da glask.",
'wikieditor-toolbar-tool-replace-invalidregex' => "Direizh eo ar jedad reoliek hoc'h eus lakaet : $1",
'wikieditor-toolbar-section-characters' => 'Arouezennoù dibar',
@@ -4556,7 +4861,7 @@ $1:Example.jpg|Opis2',
'wikieditor-toolbar-tool-table-preview' => 'Pregled',
'wikieditor-toolbar-tool-table-insert' => 'Ubaci',
'wikieditor-toolbar-tool-table-cancel' => 'Odustani',
- 'wikieditor-toolbar-tool-table-toomany' => 'Ubacivanje tabele sa više od $1 ćelija nije moguće putem ovog dijaloga.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Ubacivanje tabele sa više od $1 ćelija nije moguće putem ovog dijaloga.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Niste unijeli valjan broj redova ili kolona.',
'wikieditor-toolbar-tool-table-zero' => 'Ne možete unijeti tabelu bez redova ili kolona.',
'wikieditor-toolbar-tool-replace' => 'Pronađi i zamijeni',
@@ -4569,7 +4874,7 @@ $1:Example.jpg|Opis2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Zamijeni sve',
'wikieditor-toolbar-tool-replace-close' => 'Zatvori',
'wikieditor-toolbar-tool-replace-nomatch' => 'Vaša pretraga nije dala nijedan rezultat.',
- 'wikieditor-toolbar-tool-replace-success' => 'NaÄinjeno $1 izmjena.',
+ 'wikieditor-toolbar-tool-replace-success' => 'NaÄinjeno $1 izmjena.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Niste unijeli ništa za pretragu.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Regularni izraz koji ste unijeli nije valjan: $1',
'wikieditor-toolbar-section-characters' => 'Posebni znakovi',
@@ -4737,6 +5042,7 @@ Voleu convertir-lo en un enllaç intern?",
'wikieditor-toolbar-file-float' => 'Alineació:',
'wikieditor-toolbar-file-default' => '(per defecte)',
'wikieditor-toolbar-file-format' => 'Format:',
+ 'wikieditor-toolbar-file-format-none' => 'cap',
'wikieditor-toolbar-tool-file-insert' => 'Inserta',
'wikieditor-toolbar-tool-file-cancel' => 'Cancel·la',
'wikieditor-toolbar-tool-reference' => 'Referència',
@@ -4803,7 +5109,7 @@ $1:Example.jpg|Peu2',
'wikieditor-toolbar-tool-table-preview' => 'Previsualització',
'wikieditor-toolbar-tool-table-insert' => 'Insereix',
'wikieditor-toolbar-tool-table-cancel' => 'Anuŀla',
- 'wikieditor-toolbar-tool-table-toomany' => 'Amb aquesta caixa de diàleg no és possible inserir una taula amb més de $1 ceŀles.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Inserir una taula amb més de 1000 cel·les no és possible amb aquest quadre de diàleg.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'No heu introduït un nombre vàlid de files o columnes.',
'wikieditor-toolbar-tool-table-zero' => 'No podeu inserir una taula amb zero files o columnes.',
'wikieditor-toolbar-tool-replace' => 'Cerca i reemplaça',
@@ -4817,7 +5123,7 @@ $1:Example.jpg|Peu2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Substitueix-ho tot',
'wikieditor-toolbar-tool-replace-close' => 'Tanca',
'wikieditor-toolbar-tool-replace-nomatch' => 'La vostra cerca no ha trobat cap coincidència.',
- 'wikieditor-toolbar-tool-replace-success' => "S'han fet $1 substitucions.",
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|reemplaçament| reemplaçaments}} fets.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'No heu introduït res per a cercar.',
'wikieditor-toolbar-tool-replace-invalidregex' => "L'expressió regular que heu introduït no és vàlida: $1",
'wikieditor-toolbar-section-characters' => 'Caràcters especials',
@@ -4840,6 +5146,9 @@ $1:Example.jpg|Peu2',
'wikieditor-toolbar-characters-page-thai' => 'Tailandès',
'wikieditor-toolbar-characters-page-lao' => 'Laosià',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-characters-endash' => 'guió curt',
+ 'wikieditor-toolbar-characters-emdash' => 'guió llarg',
+ 'wikieditor-toolbar-characters-minus' => 'signe menys',
'wikieditor-toolbar-section-help' => 'Ajuda',
'wikieditor-toolbar-help-heading-description' => 'Descripció',
'wikieditor-toolbar-help-heading-syntax' => 'El que teclegeu',
@@ -4905,6 +5214,7 @@ $1:Example.jpg|Peu2',
/** Chechen (нохчийн)
* @author Sasan700
+ * @author Умар
*/
$messages['ce'] = array(
'wikieditor' => 'Викийозан рéдоккхучечохь аллÑам чулоцург',
@@ -4928,16 +5238,16 @@ $messages['ce'] = array(
'wikieditor-publish-dialog-publish' => 'Ðахангайта',
'wikieditor-publish-dialog-goback' => 'Юхьа',
'wikieditor-template-editor-preference' => 'Латайé куцкепа рéдаккхар бáраман гlонца',
- 'wikieditor-template-editor-dialog-title' => 'Куцкеп хийцам',
+ 'wikieditor-template-editor-dialog-title' => 'Кеп хийцам',
'wikieditor-template-editor-dialog-submit' => 'КарлаÑккха',
'wikieditor-template-editor-dialog-cancel' => 'Цаоьшу',
- 'wikieditor-templates-preference' => 'Латедé куцкеп хьарчар',
+ 'wikieditor-templates-preference' => 'Латедé кеп хьарчар',
'wikieditor-toc-preference' => 'Латедé коьрта дерг шавигарна аттонца',
'wikieditor-toc-show' => 'Гайта коьртехь дерг',
'wikieditor-toc-hide' => 'Къайлахьо коьртехь дерг',
'wikieditor-toolbar' => 'Рéдоккху меттиг',
'wikieditor-toolbar-desc' => 'Рéдоккху меттиг гlоле лелорца',
- 'wikieditor-toolbar-preference' => 'Латайé гlоле йолу рéдоккхург',
+ 'wikieditor-toolbar-preference' => 'Латайé гlоле йолу тадар',
'wikieditor-toolbar-dialogs-preference' => 'Латайé йозан хьажориг йуьллург, таблийцан аъ кхин хlумнашна',
'wikieditor-toolbar-loading' => 'Чуйолуш…',
'wikieditor-toolbar-tool-bold' => 'ДерÑтино',
@@ -4970,7 +5280,7 @@ $messages['ce'] = array(
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Чоьхьа хьажориг',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Ðрахьа хьажориг',
'wikieditor-toolbar-tool-link-empty' => 'Ðхьа ца гайтин мичхьа хьажойеза хьажориг.',
- 'wikieditor-toolbar-tool-file' => 'Чохь йолу хlум',
+ 'wikieditor-toolbar-tool-file' => 'Чохь йолу файл',
'wikieditor-toolbar-tool-file-example' => 'Example.jpg',
'wikieditor-toolbar-tool-reference' => 'Такхо',
'wikieditor-toolbar-tool-reference-example' => 'Чудилла кхузе такхо деза йоза',
@@ -4989,9 +5299,9 @@ $messages['ce'] = array(
'wikieditor-toolbar-tool-heading-example' => 'Коьрта йоза',
'wikieditor-toolbar-group-format' => 'Бáрам',
'wikieditor-toolbar-tool-ulist' => 'КъаÑтам бина могlам',
- 'wikieditor-toolbar-tool-ulist-example' => 'КъаÑтам бина могlаман Ñ…lум',
+ 'wikieditor-toolbar-tool-ulist-example' => 'КъаÑтам бина могlаман файл',
'wikieditor-toolbar-tool-olist' => 'Терахьца болу могlам',
- 'wikieditor-toolbar-tool-olist-example' => 'Терахьца болу могlаман хlум',
+ 'wikieditor-toolbar-tool-olist-example' => 'Терахьца болу могlаман файл',
'wikieditor-toolbar-tool-indent' => 'Дlахило',
'wikieditor-toolbar-tool-indent-example' => 'Могlа дlахилабо',
'wikieditor-toolbar-tool-nowiki' => 'Тергал ца бо вики-бáрамхlоттор',
@@ -5027,7 +5337,7 @@ $1:Example.jpg|Цуьнах лаце2',
'wikieditor-toolbar-tool-table-example-cell-text' => 'Чоьнан йоза',
'wikieditor-toolbar-tool-table-example-header' => 'Коьрта йоза',
'wikieditor-toolbar-tool-table-title' => 'Чуйилла таблийца',
- 'wikieditor-toolbar-tool-table-dimensions-rows' => 'Могlнаш',
+ 'wikieditor-toolbar-tool-table-dimensions-rows' => 'МогӀанаш',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'Бlогlамаш',
'wikieditor-toolbar-tool-table-dimensions-header' => 'Тlетоха коьрта могlан могlа',
'wikieditor-toolbar-tool-table-wikitable' => 'Кечйеш дозанашца',
@@ -5036,7 +5346,7 @@ $1:Example.jpg|Цуьнах лаце2',
'wikieditor-toolbar-tool-table-preview' => 'Хьалха муха ю хьажа',
'wikieditor-toolbar-tool-table-insert' => 'Чуйилла',
'wikieditor-toolbar-tool-table-cancel' => 'Цаоьшу',
- 'wikieditor-toolbar-tool-table-toomany' => 'Оцул чоьнаш йа аьтту ца болу, таблийцан чоьнашна бáрам $1 хоттало.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Оцул чоьнаш йа аьтту ца болу, таблийцан чоьнашна бáрам $1 хоттало.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ðхьа нийÑа ца хоттийн цхьатерра могlанаш ле бlогlамаш.',
'wikieditor-toolbar-tool-table-zero' => 'Хьога йиллалур Ñц таблийца йоцургца могlанаш ле бlогlамаш долуш.',
'wikieditor-toolbar-tool-replace' => 'Лаха хийца аъ хуьйцуш',
@@ -5049,7 +5359,7 @@ $1:Example.jpg|Цуьнах лаце2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Деригге хийца',
'wikieditor-toolbar-tool-replace-close' => 'Дlачlагlа',
'wikieditor-toolbar-tool-replace-nomatch' => 'Хьан дехарца хlумма ца карийна.',
- 'wikieditor-toolbar-tool-replace-success' => 'Балийна хийцам: $1.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Балийна хийцам: $1.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ðхьа ца гайтна Ñ…lу лаха деза.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Ðхьа Ñзйина цlе ÑŽÑ…-юха нийÑа Ñц: $1',
'wikieditor-toolbar-section-characters' => 'Саболу куьцаш',
@@ -5077,7 +5387,7 @@ $1:Example.jpg|Цуьнах лаце2',
'wikieditor-toolbar-help-page-link' => 'Хьажоригаш',
'wikieditor-toolbar-help-page-heading' => 'Коьрта могlнаш',
'wikieditor-toolbar-help-page-list' => 'Могlамаш',
- 'wikieditor-toolbar-help-page-file' => 'Хlумнаш',
+ 'wikieditor-toolbar-help-page-file' => 'Файлаш',
'wikieditor-toolbar-help-page-reference' => 'Билгалдаккхар',
'wikieditor-toolbar-help-page-discussion' => 'Дийцаре',
'wikieditor-toolbar-help-content-italic-description' => 'КурÑетта',
@@ -5108,12 +5418,12 @@ $1:Example.jpg|Цуьнах лаце2',
'wikieditor-toolbar-help-content-heading5-syntax' => '===== Коьрта могlан йоза =====',
'wikieditor-toolbar-help-content-heading5-result' => '<h5>Коьрта могlан йоза</h5>',
'wikieditor-toolbar-help-content-ulist-description' => 'КъаÑтам бина могlам',
- 'wikieditor-toolbar-help-content-ulist-syntax' => '* Могlаман хlум<br />* Могlаман хlум',
- 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Могlаман хlум</li><li>Могlаман хlум</li></ul>',
+ 'wikieditor-toolbar-help-content-ulist-syntax' => '* Могlаман файл<br />* Могlаман файл',
+ 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Могlаман файл</li><li>Могlаман файл</li></ul>',
'wikieditor-toolbar-help-content-olist-description' => 'Терахьца болу могlам',
- 'wikieditor-toolbar-help-content-olist-syntax' => '# Могlаман хlум<br /># Могlаман хlум',
- 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Могlаман хlум</li><li>Могlаман хlум</li></ol>',
- 'wikieditor-toolbar-help-content-file-description' => 'Чохь йолу хlум',
+ 'wikieditor-toolbar-help-content-olist-syntax' => '# Могlаман файл<br /># Могlаман файл',
+ 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Могlаман файл</li><li>Могlаман файл</li></ol>',
+ 'wikieditor-toolbar-help-content-file-description' => 'Чохь йолу файл',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Оцуьнах лаьцна йоза]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='
Оцуьнах лаьцна йоза' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Доккха дан' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>
@@ -5136,6 +5446,7 @@ $1:Example.jpg|Цуьнах лаце2',
/** Sorani Kurdish (کوردی)
* @author Asoxor
+ * @author BMRG14
* @author Calak
* @author Marmzok
* @author McDutchie
@@ -5207,7 +5518,9 @@ $messages['ckb'] = array(
'wikieditor-toolbar-tool-file' => 'پەڕگەی نێودەق',
'wikieditor-toolbar-tool-file-example' => 'نموونە.jpg',
'wikieditor-toolbar-file-target' => 'ناوی پەرگە:',
+ 'wikieditor-toolbar-file-size' => 'قەبارە:',
'wikieditor-toolbar-file-format' => 'داڕشتن:',
+ 'wikieditor-toolbar-file-format-none' => 'ھیچ',
'wikieditor-toolbar-tool-file-insert' => 'تێخستن',
'wikieditor-toolbar-tool-file-cancel' => 'ھەڵوەشاندنەوە',
'wikieditor-toolbar-tool-reference' => 'سەرچاوە',
@@ -5216,8 +5529,8 @@ $messages['ckb'] = array(
'wikieditor-toolbar-tool-reference-title' => 'زۆرکردنی سەرچاوە',
'wikieditor-toolbar-tool-reference-insert' => 'تێخستن',
'wikieditor-toolbar-tool-reference-text' => 'دەقی سەرچاوە',
- 'wikieditor-toolbar-tool-signature' => 'واژۆ و ڕێکەوت',
- 'wikieditor-toolbar-section-advanced' => 'پەرەسەندوو',
+ 'wikieditor-toolbar-tool-signature' => 'واژوو و ڕێکەوت',
+ 'wikieditor-toolbar-section-advanced' => 'پێشکەوتوو',
'wikieditor-toolbar-tool-heading' => 'سەردێڕ',
'wikieditor-toolbar-tool-heading-1' => 'ئاستی ١',
'wikieditor-toolbar-tool-heading-2' => 'ئاستی ٢',
@@ -5274,7 +5587,7 @@ $1:نموونە.jpg|شرۆڤەی ٢',
'wikieditor-toolbar-tool-table-preview' => 'پێشبینین',
'wikieditor-toolbar-tool-table-insert' => 'تێخستن',
'wikieditor-toolbar-tool-table-cancel' => 'ھەڵوەشاندنەوە',
- 'wikieditor-toolbar-tool-table-toomany' => 'تێخستنی خشتەیەک بە زۆرتر لە $1 خانەوە بەم ئامرازەوە ناکرێ.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'تێخستنی خشتەیەک بە زۆرتر لە $1 خانەوە بەم ئامرازەوە ناکرێ.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'ژمارەیەکی دروستت بۆ ڕیزەکان یان ستوونەکان نەداوە.',
'wikieditor-toolbar-tool-table-zero' => 'ناتوانی خشتەیەک بێ ھیچ ڕیز یان ستوونێک تێبخەی',
'wikieditor-toolbar-tool-replace' => 'دۆزینەوە و لەجێدانان',
@@ -5287,7 +5600,7 @@ $1:نموونە.jpg|شرۆڤەی ٢',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'ھەموویان جێگیر بکە',
'wikieditor-toolbar-tool-replace-close' => 'دایخە',
'wikieditor-toolbar-tool-replace-nomatch' => 'گەڕانەکەت لەگەڵ ھیچ شتێک نەگونجا.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 جێگرتنەوە ئەنجامدرا.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 جێگرتنەوە ئەنجامدرا.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'ھیچ شتێکت بۆ گەڕان ڕەچاو نەکردوو.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'ئەو regular expression کە نووسیوتە گونجاو نییە: $1',
'wikieditor-toolbar-section-characters' => 'نووسە تایبەتەکان',
@@ -5299,7 +5612,7 @@ $1:نموونە.jpg|شرۆڤەی ٢',
'wikieditor-toolbar-characters-page-cyrillic' => 'کیریلی',
'wikieditor-toolbar-characters-page-arabic' => 'عەرەبی',
'wikieditor-toolbar-characters-page-arabicextended' => 'عەرەبیی پەرەپێدراو',
- 'wikieditor-toolbar-characters-page-persian' => 'Ùارسی',
+ 'wikieditor-toolbar-characters-page-persian' => 'پارسی',
'wikieditor-toolbar-characters-page-hebrew' => 'عیبری',
'wikieditor-toolbar-characters-page-bangla' => 'بەنگالی',
'wikieditor-toolbar-characters-page-telugu' => 'تێلوگو',
@@ -5361,9 +5674,9 @@ $1:نموونە.jpg|شرۆڤەی ٢',
'wikieditor-toolbar-help-content-rereference-result' => "دەقی پەڕە.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-showreferences-description' => 'نیشان‌دانی سەرچاوەکان',
'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>دەقی بەستەر</a>, دەقی زیادی.</li></ol>",
- 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'واژۆ لەگەڵ ڕێکەوتدا',
+ 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'واژوو و ڕێکەوت',
'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>ناوی بەکارھێنەر</a> (<a href='#' title='{{#special:mytalk}}'>لێدوان</a>) 15:54, 10 June 2009 (UTC)",
- 'wikieditor-toolbar-help-content-signature-description' => 'واژۆ',
+ 'wikieditor-toolbar-help-content-signature-description' => 'واژوو',
'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>ناوی بەکارھێنەر</a> (<a href='#' title='{{#special:mytalk}}'>لێدوان</a>)",
'wikieditor-toolbar-help-content-indent-description' => 'پێشبردن',
'wikieditor-toolbar-help-content-indent-syntax' => 'دەقی ئاسایی<br />:دەقی پێشچوو<br />::دەقی پێشچوو',
@@ -5445,7 +5758,7 @@ $messages['cs'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Neplatný název',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Externí odkaz',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Zjišťování existence stránky…',
- 'wikieditor-toolbar-tool-link-int-invalid' => 'Vámi zadaný název je neplatný.',
+ 'wikieditor-toolbar-tool-link-int-invalid' => 'Zadaný název je neplatný.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Uvedené URL vypadá jako odkaz na jinou stránku této wiki.
Chcete z něj tedy udělat vnitřní odkaz?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Vnitřní odkaz',
@@ -5527,7 +5840,7 @@ $1:Příklad.jpg|Titulek 2',
'wikieditor-toolbar-tool-table-preview' => 'Náhled',
'wikieditor-toolbar-tool-table-insert' => 'Vložit',
'wikieditor-toolbar-tool-table-cancel' => 'Storno',
- 'wikieditor-toolbar-tool-table-toomany' => 'Pomocí tohoto dialogu nelze vložit tabulku s více než $1 buňkami.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Pomocí tohoto dialogu nelze vložit tabulku s více než 1000 buňkami.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Musíte zadat platný poÄet řádků nebo sloupců.',
'wikieditor-toolbar-tool-table-zero' => 'Nemůžete vložit tabulku s nulovým poÄet řádků nebo sloupců.',
'wikieditor-toolbar-tool-replace' => 'Najít a nahradit',
@@ -5541,7 +5854,7 @@ $1:Příklad.jpg|Titulek 2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Nahradit vše',
'wikieditor-toolbar-tool-replace-close' => 'Zavřít',
'wikieditor-toolbar-tool-replace-nomatch' => 'Zadanému hledání nic neodpovídá.',
- 'wikieditor-toolbar-tool-replace-success' => 'Nahrazeno $1krát.',
+ 'wikieditor-toolbar-tool-replace-success' => '{{PLURAL:$1|Provedeno|Provedena|Provedeno}} $1 nahrazení.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Musíte uvést, co se má hledat.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Zadaný regulární výraz je neplatný: $1',
'wikieditor-toolbar-section-characters' => 'Zvláštní znaky',
@@ -5564,6 +5877,9 @@ $1:Příklad.jpg|Titulek 2',
'wikieditor-toolbar-characters-page-thai' => 'Thajština',
'wikieditor-toolbar-characters-page-lao' => 'Laoština',
'wikieditor-toolbar-characters-page-khmer' => 'Khmerština',
+ 'wikieditor-toolbar-characters-endash' => 'krátká pomlÄka',
+ 'wikieditor-toolbar-characters-emdash' => 'dlouhá pomlÄka',
+ 'wikieditor-toolbar-characters-minus' => 'znaménko minus',
'wikieditor-toolbar-section-help' => 'Nápověda',
'wikieditor-toolbar-help-heading-description' => 'Popis',
'wikieditor-toolbar-help-heading-syntax' => 'Napíšete',
@@ -5866,7 +6182,7 @@ $1:Enghraifft.jpg|Disgrifiad2',
'wikieditor-toolbar-tool-table-preview' => 'Rhagolwg',
'wikieditor-toolbar-tool-table-insert' => 'Mewnosod',
'wikieditor-toolbar-tool-table-cancel' => 'Diddymu',
- 'wikieditor-toolbar-tool-table-toomany' => "Nid yw'n bosib gosod tabl ag iddo mwy na $1 o gelloedd trwy ddefnyddio'r deialog hwn.",
+ 'wikieditor-toolbar-tool-table-toomany' => "Nid yw'n bosib gosod tabl ag iddo mwy na $1 o gelloedd trwy ddefnyddio'r deialog hwn.", # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Nid ydych wedi gosod nifer (dilys) o resi neu o golofnau.',
'wikieditor-toolbar-tool-table-zero' => 'Ni allwch osod tabl heb unrhyw resi neu golofnau iddo.',
'wikieditor-toolbar-tool-replace' => 'Canfod a disodli',
@@ -5880,7 +6196,7 @@ $1:Enghraifft.jpg|Disgrifiad2',
'wikieditor-toolbar-tool-replace-button-replaceall' => "Disodli'r cwbwl",
'wikieditor-toolbar-tool-replace-close' => 'Cau',
'wikieditor-toolbar-tool-replace-nomatch' => 'Ni chanfyddwyd yr hyn a chwiliwyd amdano.',
- 'wikieditor-toolbar-tool-replace-success' => 'Gwnaethpwyd $1 amnewidiad.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Gwnaethpwyd $1 amnewidiad.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ni osodwyd unrhywbeth yn y blwch chwilio.',
'wikieditor-toolbar-tool-replace-invalidregex' => "Nid yw'r ymadrodd rheolaidd a ysgrifennwyd gennych yn ddilys: $1",
'wikieditor-toolbar-section-characters' => 'Nodau arbennig',
@@ -6050,6 +6366,7 @@ $messages['da'] = array(
'wikieditor-toolbar-file-float' => 'Justering:',
'wikieditor-toolbar-file-default' => '(standard)',
'wikieditor-toolbar-file-format' => 'Format:',
+ 'wikieditor-toolbar-file-format-none' => 'ingen',
'wikieditor-toolbar-tool-file-insert' => 'Indsæt',
'wikieditor-toolbar-tool-file-cancel' => 'Annuller',
'wikieditor-toolbar-tool-reference' => 'Fodnote',
@@ -6116,7 +6433,7 @@ $1:Eksempel.jpg|Billedtekst2',
'wikieditor-toolbar-tool-table-preview' => 'Forhåndsvisning',
'wikieditor-toolbar-tool-table-insert' => 'Indsæt',
'wikieditor-toolbar-tool-table-cancel' => 'Annullér',
- 'wikieditor-toolbar-tool-table-toomany' => 'Det er ikke muligt at indsætte en tabel med mere end $1 celler med denne dialogboks',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Det er ikke muligt at indsætte en tabel med mere end 1000 celler med denne dialogboks',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Du har ikke angivet et gyldigt antal rækker eller kolonner.',
'wikieditor-toolbar-tool-table-zero' => 'Du kan ikke indsætte en tabel med nul rækker eller kolonner',
'wikieditor-toolbar-tool-replace' => 'Søg og erstat',
@@ -6130,7 +6447,7 @@ $1:Eksempel.jpg|Billedtekst2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Erstat alle',
'wikieditor-toolbar-tool-replace-close' => 'Luk',
'wikieditor-toolbar-tool-replace-nomatch' => 'Din søgning gav ingen resultater',
- 'wikieditor-toolbar-tool-replace-success' => '$1 udskiftning(er) foretaget.',
+ 'wikieditor-toolbar-tool-replace-success' => '{{PLURAL:$1|En udskiftning|$1 udskiftninger}} foretaget.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Du skrev ikke noget at søge efter',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Det regulære udtryk du skrev er ugyldigt: $1',
'wikieditor-toolbar-section-characters' => 'Specialtegn',
@@ -6153,6 +6470,9 @@ $1:Eksempel.jpg|Billedtekst2',
'wikieditor-toolbar-characters-page-thai' => 'Thai',
'wikieditor-toolbar-characters-page-lao' => 'Laotisk',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-characters-endash' => 'tankestreg',
+ 'wikieditor-toolbar-characters-emdash' => 'lang tankestreg',
+ 'wikieditor-toolbar-characters-minus' => 'minustegn',
'wikieditor-toolbar-section-help' => 'Hjælp',
'wikieditor-toolbar-help-heading-description' => 'Beskrivelse',
'wikieditor-toolbar-help-heading-syntax' => 'Hvad du skriver',
@@ -6225,6 +6545,7 @@ $1:Eksempel.jpg|Billedtekst2',
* @author Metalhead64
* @author Mikullovci11
* @author Ojay
+ * @author TMg
* @author Umherirrender
* @author Ziko
* @author ✓
@@ -6259,9 +6580,9 @@ $messages['de'] = array(
'wikieditor-toc-show' => 'Inhaltsverzeichnis einblenden',
'wikieditor-toc-hide' => 'Inhaltsverzeichnis ausblenden',
'wikieditor-toolbar' => 'Bearbeiten-Werkzeugleiste',
- 'wikieditor-toolbar-desc' => 'Bearbeiten-Werkzeugleiste mit erweiterter Benutzerfreundlichkeit',
+ 'wikieditor-toolbar-desc' => 'Bearbeiten-Werkzeugleiste mit verbesserter Benutzerfreundlichkeit',
'wikieditor-toolbar-preference' => 'Erweiterte Bearbeiten-Werkzeugleiste aktivieren',
- 'wikieditor-toolbar-dialogs-preference' => 'Dialoge für das Einfügen von Links, Tabellen usw. aktivieren',
+ 'wikieditor-toolbar-dialogs-preference' => 'Assistenten zum Einfügen von Links und Tabellen sowie die Funktion „Suchen und Ersetzen“ aktivieren',
'wikieditor-toolbar-hidesig' => 'Die Schaltfläche für die Signatur bei Seiten im Artikelnamensraum ausblenden',
'wikieditor-toolbar-loading' => 'Lade …',
'wikieditor-toolbar-tool-bold' => 'Fett',
@@ -6371,7 +6692,7 @@ $1:Beispiel.jpg|Beschreibung2',
'wikieditor-toolbar-tool-table-preview' => 'Vorschau',
'wikieditor-toolbar-tool-table-insert' => 'Einfügen',
'wikieditor-toolbar-tool-table-cancel' => 'Abbrechen',
- 'wikieditor-toolbar-tool-table-toomany' => 'Das Einfügen einer Tabelle mit mehr als $1 Zellen ist mit diesem Dialog nicht möglich.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Das Einfügen einer Tabelle mit mehr als 1000 Zellen ist mit diesem Dialog nicht möglich.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Du hast keine gültige Anzahl von Zeilen oder Spalten angegeben.',
'wikieditor-toolbar-tool-table-zero' => 'Du kannst keine Tabelle einfügen, die weder Zeilen noch Spalten hat.',
'wikieditor-toolbar-tool-replace' => 'Suchen und Ersetzen',
@@ -6385,7 +6706,7 @@ $1:Beispiel.jpg|Beschreibung2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Alle ersetzen',
'wikieditor-toolbar-tool-replace-close' => 'Schließen',
'wikieditor-toolbar-tool-replace-nomatch' => 'Deine Suche hat keine Ergebnisse erbracht.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 Ersetzung(en) durchgeführt.',
+ 'wikieditor-toolbar-tool-replace-success' => '{{PLURAL:$1|Eine Ersetzung|$1 Ersetzungen}} durchgeführt.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Du hast nichts zum Suchen eingegeben.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Der eingegebene reguläre Ausdruck ist ungültig: $1',
'wikieditor-toolbar-section-characters' => 'Sonderzeichen',
@@ -6509,11 +6830,11 @@ Möchten Sie daraus einen internen Link machen?',
* @author Xoser
*/
$messages['diq'] = array(
- 'wikieditor' => 'Interfaceye wikitext ke raver siyayo',
- 'wikieditor-desc' => 'Yew pedê nuştişiyê girdi u moduleyanê binan dano',
- 'wikieditor-wikitext-tab' => 'Wikimetin',
- 'wikieditor-loading' => 'Bar keno',
- 'wikieditor-preview-preference' => 'verqeyde miqeyese a bike',
+ 'wikieditor' => 'Miyanriyê wikitekstio ke raverşiyayo',
+ 'wikieditor-desc' => 'Yew miyanriyê wikitekstio ke raverşiyayo u xeylê feature-providing modules temin keno',
+ 'wikieditor-wikitext-tab' => 'Wikimetın',
+ 'wikieditor-loading' => 'Bar beno...',
+ 'wikieditor-preview-preference' => 'Pê heta verasayışi ake',
'wikieditor-preview-tab' => 'Verqayt',
'wikieditor-preview-changes-tab' => 'Vurnayışi',
'wikieditor-preview-loading' => 'Ho bar keno...',
@@ -6522,17 +6843,17 @@ $messages['diq'] = array(
'wikieditor-previewDialog-loading' => 'Ho bar keno...',
'wikieditor-publish-preference' => 'Game be game çap kerdişi a bike',
'wikieditor-publish-button-publish' => 'Vıla ke',
- 'wikieditor-publish-button-cancel' => 'Iptal bike',
+ 'wikieditor-publish-button-cancel' => 'Bıterkne',
'wikieditor-publish-dialog-title' => '{{SITENAME}} rê çap ke',
'wikieditor-publish-dialog-summary' => 'Xulasayê vurnayişi (ser vurnayişê xo xulasa binuse):',
'wikieditor-publish-dialog-minor' => 'VurnayiÅŸo qickek',
- 'wikieditor-publish-dialog-watch' => 'Ena pele seyr ke',
+ 'wikieditor-publish-dialog-watch' => "<font style=\"color:Green\">'''Ena pele seyr ke'''</font>",
'wikieditor-publish-dialog-publish' => 'Vıla ke',
'wikieditor-publish-dialog-goback' => 'Reyna ÅŸi',
'wikieditor-template-editor-preference' => 'Vurnayışê form-bıngeyınê şablonanê wikiy feal ke',
'wikieditor-template-editor-dialog-title' => 'Sabloni bivurnê',
'wikieditor-template-editor-dialog-submit' => 'Noroc resn',
- 'wikieditor-template-editor-dialog-cancel' => 'Bıterkne',
+ 'wikieditor-template-editor-dialog-cancel' => 'Bıtexelne',
'wikieditor-templates-preference' => 'Qic kerdisê sabloni a bike',
'wikieditor-toc-preference' => 'Tabloyo tedeesteyi ke navigasyon keno ay a bike',
'wikieditor-toc-show' => 'Tedeesteyi bimocne',
@@ -6562,7 +6883,7 @@ $messages['diq'] = array(
'wikieditor-toolbar-tool-link-ext-target' => "Greyê URL'i:",
'wikieditor-toolbar-tool-link-ext-text' => 'Metnê gri:',
'wikieditor-toolbar-tool-link-insert' => 'Gıre bıerz',
- 'wikieditor-toolbar-tool-link-cancel' => 'ibtal',
+ 'wikieditor-toolbar-tool-link-cancel' => 'Bıterkne',
'wikieditor-toolbar-tool-link-int-target-status-exists' => 'pel esto',
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'pel çino',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Sernameyo xırab.',
@@ -6588,7 +6909,7 @@ $messages['diq'] = array(
'wikieditor-toolbar-tool-file-cancel' => 'Bıterkne',
'wikieditor-toolbar-tool-reference' => 'çıme',
'wikieditor-toolbar-tool-reference-example' => 'metnê notê bınini tiya kerê',
- 'wikieditor-toolbar-tool-reference-cancel' => 'Bıterkne',
+ 'wikieditor-toolbar-tool-reference-cancel' => 'Bıtexelne',
'wikieditor-toolbar-tool-reference-title' => 'Referance de bike',
'wikieditor-toolbar-tool-reference-insert' => 'de bike',
'wikieditor-toolbar-tool-reference-text' => 'Nusteyê Referansi',
@@ -6649,8 +6970,8 @@ $1:misal.jpg|nuşteyê resmi2',
'wikieditor-toolbar-tool-table-example' => 'metnê hucreyi',
'wikieditor-toolbar-tool-table-preview' => 'Verqayt',
'wikieditor-toolbar-tool-table-insert' => 'têare ker',
- 'wikieditor-toolbar-tool-table-cancel' => 'ibtal',
- 'wikieditor-toolbar-tool-table-toomany' => '$1 hucreyın ra ziyed tablo eştış pê no mesaj mumkin niyo',
+ 'wikieditor-toolbar-tool-table-cancel' => 'Bıterkne',
+ 'wikieditor-toolbar-tool-table-toomany' => '$1 hucreyın ra ziyed tablo eştış pê no mesaj mumkin niyo', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'şıma pê yew amaro meqbul o satır u estun cı nêkewti',
'wikieditor-toolbar-tool-table-zero' => 'tablo ya ke tede satır u estun çinibo şıma nêşkeni têare bıkeri',
'wikieditor-toolbar-tool-replace' => 'bıgêr u bıvurn',
@@ -6664,7 +6985,7 @@ $1:misal.jpg|nuşteyê resmi2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'pêroyin bıvurn',
'wikieditor-toolbar-tool-replace-close' => 'Racnê',
'wikieditor-toolbar-tool-replace-nomatch' => 'çi yo ke şıma gêrenê cı çin o.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 vurnayiş vıraziya.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 vurnayiş vıraziya.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'şıma qey cıgêrayiş taway/çiyek nênuşt',
'wikieditor-toolbar-tool-replace-invalidregex' => 'ifadeya normal a ke şıma kwene cı meqbul niya: $1',
'wikieditor-toolbar-section-characters' => 'karakterê xususiyî',
@@ -6748,7 +7069,7 @@ $1:misal.jpg|nuşteyê resmi2',
'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>nameyê karberi</a> (<a href='#' title='{{#special:mytalk}}'>mesaj</a>) 15:54, 10 Heziran 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'imza',
'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Namey karberi</a> (<a href='#' title='{{#special:mytalk}}'>mesac</a>)",
- 'wikieditor-toolbar-help-content-indent-description' => 'Indent',
+ 'wikieditor-toolbar-help-content-indent-description' => 'Kewente',
'wikieditor-toolbar-help-content-indent-syntax' => 'metno normal<br />:metno indent<br />::metno indent',
'wikieditor-toolbar-help-content-indent-result' => 'metno normal<dl><dd>metno indent<dl><dd>metno indent</dd></dl></dd></dl>',
);
@@ -6831,6 +7152,7 @@ Coš jen do internego wótkaza psétwóriś?',
'wikieditor-toolbar-file-float' => 'Wusměrjenje:',
'wikieditor-toolbar-file-default' => '(standard)',
'wikieditor-toolbar-file-format' => 'Format:',
+ 'wikieditor-toolbar-file-format-none' => 'žeden',
'wikieditor-toolbar-tool-file-insert' => 'ZasunuÅ›',
'wikieditor-toolbar-tool-file-cancel' => 'Pśetergnuś',
'wikieditor-toolbar-tool-reference' => 'Referenca',
@@ -6897,7 +7219,7 @@ $1:Pśikład.jpg|Pópisanje2',
'wikieditor-toolbar-tool-table-preview' => 'Pśeglěd',
'wikieditor-toolbar-tool-table-insert' => 'ZasunuÅ›',
'wikieditor-toolbar-tool-table-cancel' => 'Pśetergnuś',
- 'wikieditor-toolbar-tool-table-toomany' => 'Zasajźenje tabele z wěcej ako $1 {{PLURAL:$1|celu|celoma|celami|celami}} njejo móžno z toś tym dialogom.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Zasajźenje tabele z wěcej ako 1000 celami njejo móžno z toś tym dialogom.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Njejsy płaśiwu licbu smužkow abo słupow zapódał.',
'wikieditor-toolbar-tool-table-zero' => 'Njamóžoš tabelu bźez smužkow abo słupow zasunuś.',
'wikieditor-toolbar-tool-replace' => 'Pytaś a wuměniś',
@@ -6934,6 +7256,9 @@ $1:Pśikład.jpg|Pópisanje2',
'wikieditor-toolbar-characters-page-thai' => 'thailandšćina',
'wikieditor-toolbar-characters-page-lao' => 'Laošćina',
'wikieditor-toolbar-characters-page-khmer' => 'Khmeršćina',
+ 'wikieditor-toolbar-characters-endash' => 'krotka lažaca smužka',
+ 'wikieditor-toolbar-characters-emdash' => 'dłujka lažaca smužka',
+ 'wikieditor-toolbar-characters-minus' => 'minusowe znamuško',
'wikieditor-toolbar-section-help' => 'Pomoc',
'wikieditor-toolbar-help-heading-description' => 'Wopisanje',
'wikieditor-toolbar-help-heading-syntax' => 'Což zapisujoš',
@@ -7041,6 +7366,7 @@ $messages['el'] = array(
'wikieditor-toolbar-desc' => 'ΜπάÏα εÏγαλείων επεξεÏγασίας σελίδων με πεÏισσότεÏες δυνατότητες χÏήσης',
'wikieditor-toolbar-preference' => 'ΕνεÏγοποιήστε την μπάÏα εÏγαλείων με τις πεÏισσότεÏες δυνατότητες επεξεÏγασίας',
'wikieditor-toolbar-dialogs-preference' => 'ΕνεÏγοποιήστε παÏάθυÏα διαλόγων για την εισαγωγή συνδέσμων, πινάκων και άλλων',
+ 'wikieditor-toolbar-hidesig' => 'ΚÏÏψε το κουμπί υπογÏαφής από σελίδες στον κÏÏιο χώÏο ονομάτων',
'wikieditor-toolbar-loading' => 'ΦόÏτωση...',
'wikieditor-toolbar-tool-bold' => 'Έντονα',
'wikieditor-toolbar-tool-bold-example' => 'Έντονο κείμενο',
@@ -7080,6 +7406,9 @@ $messages['el'] = array(
'wikieditor-toolbar-file-caption' => 'Λεζάντα',
'wikieditor-toolbar-file-size' => 'Μέγεθος:',
'wikieditor-toolbar-file-float' => 'ΕυθυγÏάμμιση:',
+ 'wikieditor-toolbar-file-default' => '(Ï€Ïοεπιλεγμένο)',
+ 'wikieditor-toolbar-file-format' => 'ΜοÏφή αÏχείου:',
+ 'wikieditor-toolbar-file-format-none' => 'κανένα',
'wikieditor-toolbar-tool-file-insert' => 'Εισαγωγή',
'wikieditor-toolbar-tool-file-cancel' => 'ΆκυÏο',
'wikieditor-toolbar-tool-reference' => 'ΠαÏαπομπή',
@@ -7146,7 +7475,7 @@ $1:Example.jpg|Λεζάντα2',
'wikieditor-toolbar-tool-table-preview' => 'ΠÏοεπισκόπηση',
'wikieditor-toolbar-tool-table-insert' => 'Εισαγωγή',
'wikieditor-toolbar-tool-table-cancel' => 'ΆκυÏο',
- 'wikieditor-toolbar-tool-table-toomany' => 'Η εισαγωγή ενός πίνακα με πεÏισσότεÏα από $1 κελιά δεν είναι δυνατή με αυτό το πλαίσιο διαλόγου.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Η εισαγωγή ενός πίνακα με πεÏισσότεÏα από 1000 κελιά δεν είναι δυνατή με αυτό το πλαίσιο διαλόγου.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Δεν έχετε εισαγάγει έναν έγκυÏο αÏιθμό των γÏαμμών ή στηλών.',
'wikieditor-toolbar-tool-table-zero' => 'Δεν μποÏείτε να εισαγάγετε έναν πίνακα χωÏίς γÏαμμές ή στήλες.',
'wikieditor-toolbar-tool-replace' => 'Αναζήτηση και αντικατάσταση',
@@ -7160,7 +7489,7 @@ $1:Example.jpg|Λεζάντα2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Αντικατάσταση όλων',
'wikieditor-toolbar-tool-replace-close' => 'Κλείσιμο',
'wikieditor-toolbar-tool-replace-nomatch' => 'Η αναζήτηση δεν ταίÏιαξε με κάτι.',
- 'wikieditor-toolbar-tool-replace-success' => 'Έγιναν $1 αντικαταστάσεις.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Έγιναν $1 {{PLURAL:$1|αντικατάσταση|αντικαταστάσεις}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Δεν εισάγατε τίποτα Ï€Ïος αναζήτηση.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Η κανονική έκφÏαση που δώσατε είναι άκυÏη: $1',
'wikieditor-toolbar-section-characters' => 'Ειδικοί χαÏακτήÏες',
@@ -7171,6 +7500,7 @@ $1:Example.jpg|Λεζάντα2',
'wikieditor-toolbar-characters-page-greek' => 'Ελληνικό',
'wikieditor-toolbar-characters-page-cyrillic' => 'ΚυÏιλλικό',
'wikieditor-toolbar-characters-page-arabic' => 'ΑÏαβικό',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Arabic extended',
'wikieditor-toolbar-characters-page-persian' => 'ΠεÏσικό',
'wikieditor-toolbar-characters-page-hebrew' => 'ΕβÏαϊκό',
'wikieditor-toolbar-characters-page-bangla' => 'Μπενγκάλι',
@@ -7182,6 +7512,7 @@ $1:Example.jpg|Λεζάντα2',
'wikieditor-toolbar-characters-page-thai' => 'ταϊλανδικά',
'wikieditor-toolbar-characters-page-lao' => 'λαοτινά',
'wikieditor-toolbar-characters-page-khmer' => 'καμποτζιανά',
+ 'wikieditor-toolbar-characters-minus' => 'σÏμβολο πλην',
'wikieditor-toolbar-section-help' => 'Βοήθεια',
'wikieditor-toolbar-help-heading-description' => 'ΠεÏιγÏαφή',
'wikieditor-toolbar-help-heading-syntax' => 'Τι πληκτÏολογείς',
@@ -7246,6 +7577,7 @@ $1:Example.jpg|Λεζάντα2',
);
/** Esperanto (Esperanto)
+ * @author Anakmalaysia
* @author ArnoLagrange
* @author Lucas
* @author Marcos
@@ -7328,6 +7660,7 @@ $messages['eo'] = array(
'wikieditor-toolbar-file-float' => 'Äœisrandigo:',
'wikieditor-toolbar-file-default' => '(defaÅ­lto)',
'wikieditor-toolbar-file-format' => 'Formato:',
+ 'wikieditor-toolbar-file-format-none' => 'neniu',
'wikieditor-toolbar-tool-file-insert' => 'Enmeti',
'wikieditor-toolbar-tool-file-cancel' => 'Nuligi',
'wikieditor-toolbar-tool-reference' => 'Piednoto',
@@ -7394,7 +7727,7 @@ $1:Ekzemplo.jpg|Teksto2 pri dosiero',
'wikieditor-toolbar-tool-table-preview' => 'AntaÅ­vido',
'wikieditor-toolbar-tool-table-insert' => 'Enmeti',
'wikieditor-toolbar-tool-table-cancel' => 'Nuligi',
- 'wikieditor-toolbar-tool-table-toomany' => 'Enmeti tabelon kun pli ol $1 ĉeloj ne eblas per ĉi tiu dialogujo.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Enmeti tabelon kun pli ol $1 ĉeloj ne eblas per ĉi tiu dialogujo.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Vi ne enigis permesitan nombron de linioj aÅ­ kolumnoj.',
'wikieditor-toolbar-tool-table-zero' => 'Vi ne povas enigi tabelon kun nul linioj aÅ­ kolumnoj.',
'wikieditor-toolbar-tool-replace' => 'Serĉi kaj anstataŭigi',
@@ -7408,7 +7741,7 @@ $1:Ekzemplo.jpg|Teksto2 pri dosiero',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Anstataŭigi ĉiujn',
'wikieditor-toolbar-tool-replace-close' => 'Fermi',
'wikieditor-toolbar-tool-replace-nomatch' => 'Via serĉo trafis nenion.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 anstataÅ­igoj okazis.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|anstataÅ­igo|anstataÅ­igoj}} okazis.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Vi ne enigis ion ajn por serĉi.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'La regula esprimo kiun vi enigis estas nepermesita: $1',
'wikieditor-toolbar-section-characters' => 'Specialaj signoj',
@@ -7431,6 +7764,9 @@ $1:Ekzemplo.jpg|Teksto2 pri dosiero',
'wikieditor-toolbar-characters-page-thai' => 'Taja',
'wikieditor-toolbar-characters-page-lao' => 'laÅ­a',
'wikieditor-toolbar-characters-page-khmer' => 'kmera',
+ 'wikieditor-toolbar-characters-endash' => 'mallonga streketo',
+ 'wikieditor-toolbar-characters-emdash' => 'longa streketo',
+ 'wikieditor-toolbar-characters-minus' => 'minus-signo',
'wikieditor-toolbar-section-help' => 'Helpo',
'wikieditor-toolbar-help-heading-description' => 'Priskribo',
'wikieditor-toolbar-help-heading-syntax' => 'Kion vi tajpas',
@@ -7653,7 +7989,7 @@ $1:Ejemplo.jpg|Descripción2',
'wikieditor-toolbar-tool-table-preview' => 'Previsualización',
'wikieditor-toolbar-tool-table-insert' => 'Insertar',
'wikieditor-toolbar-tool-table-cancel' => 'Cancelar',
- 'wikieditor-toolbar-tool-table-toomany' => 'Insertar una tabla con más de $1 celdas no es posible con este cuadro de diálogo.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Insertar una tabla con más de $1 celdas no es posible con este cuadro de diálogo.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'No se ha introducido un número válido de filas o columnas.',
'wikieditor-toolbar-tool-table-zero' => 'No se puede insertar una tabla con cero filas o columnas.',
'wikieditor-toolbar-tool-replace' => 'Buscar y reemplazar',
@@ -7667,7 +8003,7 @@ $1:Ejemplo.jpg|Descripción2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Reemplazar todo',
'wikieditor-toolbar-tool-replace-close' => 'Cerrar',
'wikieditor-toolbar-tool-replace-nomatch' => 'Su búsqueda no halló resultados.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 reemplazos hechos',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 reemplazos hechos', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'No ingresó nada para buscar.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'La expresión regular que ha introducido es inválida: $1',
'wikieditor-toolbar-section-characters' => 'Caracteres especiales',
@@ -7704,7 +8040,7 @@ $1:Ejemplo.jpg|Descripción2',
'wikieditor-toolbar-help-page-file' => 'Archivos',
'wikieditor-toolbar-help-page-reference' => 'Referencias',
'wikieditor-toolbar-help-page-discussion' => 'Discusión',
- 'wikieditor-toolbar-help-content-italic-description' => 'Itálica',
+ 'wikieditor-toolbar-help-content-italic-description' => 'Cursiva',
'wikieditor-toolbar-help-content-italic-syntax' => "''Texto en cursiva''",
'wikieditor-toolbar-help-content-italic-result' => '<em>Texto en cursiva</em>',
'wikieditor-toolbar-help-content-bold-description' => 'Negrita',
@@ -7715,7 +8051,7 @@ $1:Ejemplo.jpg|Descripción2',
'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Texto en negrita &amp; cursiva</em></strong>',
'wikieditor-toolbar-help-content-ilink-description' => 'Enlace interno',
'wikieditor-toolbar-help-content-ilink-syntax' => '[[Título de la página|Texto del enlace]]<br />[[Título de la página]]',
- 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Etiqueta de vínculo</a><br /><a href='#'>Título de página</a>",
+ 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Texto del enlace</a><br /><a href='#'>Título de la página</a>",
'wikieditor-toolbar-help-content-xlink-description' => 'Enlace externo',
'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Etiqueta del enlace]<br />[http://www.example.org]<br />http://www.example.org',
'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Etiqueta del enlace</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
@@ -7732,11 +8068,11 @@ $1:Ejemplo.jpg|Descripción2',
'wikieditor-toolbar-help-content-heading5-syntax' => '===== Texto de encabezado =====',
'wikieditor-toolbar-help-content-heading5-result' => '<h5>Texto de encabezado</h5>',
'wikieditor-toolbar-help-content-ulist-description' => 'Lista viñeteada',
- 'wikieditor-toolbar-help-content-ulist-syntax' => '* Listar item<br />* Listar item',
- 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Listar item</li><li>Listar item</li></ul>',
+ 'wikieditor-toolbar-help-content-ulist-syntax' => '* Elemento de la lista<br />* Elemento de la lista',
+ 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Elemento de la lista</li><li>Elemento de la lista</li></ul>',
'wikieditor-toolbar-help-content-olist-description' => 'Lista numerada',
- 'wikieditor-toolbar-help-content-olist-syntax' => '# Listar item<br /># Listar item',
- 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Listar item</li><li>Listar item</li></ol>',
+ 'wikieditor-toolbar-help-content-olist-syntax' => '# Elemento de la lista<br /># Elemento de la lista',
+ 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Elemento de la lista</li><li>Elemento de la lista</li></ol>',
'wikieditor-toolbar-help-content-file-description' => 'Archivo empotrado',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Ejemplo.png|thumb|Texto de la leyenda]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Caption text' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Enlarge' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Texto leyenda</div></div>",
@@ -7788,8 +8124,8 @@ $messages['et'] = array(
'wikieditor-template-editor-dialog-cancel' => 'Loobu',
'wikieditor-templates-preference' => 'Luba mallide kokkulükkamine',
'wikieditor-toc-preference' => 'Kasuta navigeerimist võimaldavat sisukorda',
- 'wikieditor-toc-show' => 'Näita sisu',
- 'wikieditor-toc-hide' => 'Peida sisu',
+ 'wikieditor-toc-show' => 'Näita sisukorda',
+ 'wikieditor-toc-hide' => 'Peida sisukord',
'wikieditor-toolbar' => 'Toimetamise tööriistariba',
'wikieditor-toolbar-desc' => 'Täiustatud kasutushõlpsusega redigeerimislehekülje tööriistariba',
'wikieditor-toolbar-preference' => 'Kasuta laiendatud redigeerimisriba',
@@ -7836,6 +8172,7 @@ Kas soovid sellest siselingi teha?',
'wikieditor-toolbar-file-float' => 'Joondus:',
'wikieditor-toolbar-file-default' => '(vaikeväärtus)',
'wikieditor-toolbar-file-format' => 'Vormistus:',
+ 'wikieditor-toolbar-file-format-none' => 'puudub',
'wikieditor-toolbar-tool-file-insert' => 'Lisa',
'wikieditor-toolbar-tool-file-cancel' => 'Loobu',
'wikieditor-toolbar-tool-reference' => 'Viide',
@@ -7902,7 +8239,7 @@ $1:Näide.jpg|Pildiallkiri2',
'wikieditor-toolbar-tool-table-preview' => 'Eelvaade',
'wikieditor-toolbar-tool-table-insert' => 'Lisa',
'wikieditor-toolbar-tool-table-cancel' => 'Loobu',
- 'wikieditor-toolbar-tool-table-toomany' => 'Selle dialoogiaknaga ei saa lisada tabelit, millel on rohkem kui $1 lahter.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Selle dialoogiaknaga ei saa lisada tabelit, millel on üle 1000 lahtri.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Sa pole sisestanud sobivat ridade ega veergude määra.',
'wikieditor-toolbar-tool-table-zero' => 'Ãœhegi rea ega veeruta tabelit ei saa lisada',
'wikieditor-toolbar-tool-replace' => 'Otsi ja asenda',
@@ -7916,7 +8253,7 @@ $1:Näide.jpg|Pildiallkiri2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Asenda kõik',
'wikieditor-toolbar-tool-replace-close' => 'Sulge',
'wikieditor-toolbar-tool-replace-nomatch' => 'Ãœhtegi otsitavat ei leitud.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 asendus(t) tehtud.',
+ 'wikieditor-toolbar-tool-replace-success' => '{{PLURAL:$1|Ãœks asendus|$1 asendust}} tehtud.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Otsitav on sisestamata.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Sisestatud regulaaravaldis on vigane: $1',
'wikieditor-toolbar-section-characters' => 'Erimärgid',
@@ -7939,6 +8276,9 @@ $1:Näide.jpg|Pildiallkiri2',
'wikieditor-toolbar-characters-page-thai' => 'Tai',
'wikieditor-toolbar-characters-page-lao' => 'Lao',
'wikieditor-toolbar-characters-page-khmer' => 'Khmeeri',
+ 'wikieditor-toolbar-characters-endash' => 'mõttekriips',
+ 'wikieditor-toolbar-characters-emdash' => 'pikk mõttekriips',
+ 'wikieditor-toolbar-characters-minus' => 'miinusmärk',
'wikieditor-toolbar-section-help' => 'Abi',
'wikieditor-toolbar-help-heading-description' => 'Kirjeldus',
'wikieditor-toolbar-help-heading-syntax' => 'Trükitu',
@@ -8044,8 +8384,8 @@ $messages['eu'] = array(
'wikieditor-toolbar-preference' => 'Editatzeko tresna barra hobetua gaitu',
'wikieditor-toolbar-dialogs-preference' => 'Elkarrizketa kutxak gaitu loturak, taula eta bestelakoak sartzeko',
'wikieditor-toolbar-loading' => 'Kargatzen...',
- 'wikieditor-toolbar-tool-bold' => 'Beltza',
- 'wikieditor-toolbar-tool-bold-example' => 'Testu beltza',
+ 'wikieditor-toolbar-tool-bold' => 'Lodia',
+ 'wikieditor-toolbar-tool-bold-example' => 'Letra lodiko testua',
'wikieditor-toolbar-tool-italic' => 'Etzana',
'wikieditor-toolbar-tool-italic-example' => 'Testu etzana',
'wikieditor-toolbar-tool-ilink' => 'Barne lotura',
@@ -8145,7 +8485,7 @@ $1:Adibidea.jpg|Oina2',
'wikieditor-toolbar-tool-table-preview' => 'Aurreikuspena',
'wikieditor-toolbar-tool-table-insert' => 'Txertatu',
'wikieditor-toolbar-tool-table-cancel' => 'Utzi',
- 'wikieditor-toolbar-tool-table-toomany' => 'Elkarrizketa-kutxa honekin ezinezkoa da $1 zutabe baino gehiago dituen taula txertatzea',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Elkarrizketa-kutxa honekin ezinezkoa da $1 zutabe baino gehiago dituen taula txertatzea', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ez duzu idatzi errenkada edo zutabe-kopuru zuzen bat.',
'wikieditor-toolbar-tool-table-zero' => 'Ezin duzu 0 errenkada edo zutabe duen taularik txertatu.',
'wikieditor-toolbar-tool-replace' => 'Bilatu eta ordezkatu',
@@ -8159,7 +8499,7 @@ $1:Adibidea.jpg|Oina2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Denak ordezkatu',
'wikieditor-toolbar-tool-replace-close' => 'Itxi',
'wikieditor-toolbar-tool-replace-nomatch' => 'Ez dago bilaketarekin bat egiten duten emaitzarik.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 ordezkapen eginda.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 ordezkapen eginda.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ez duzu bilatu beharreko ezer adierazi.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Txertatu duzun adierazpen erregularra ez da zzuena: $1',
'wikieditor-toolbar-section-characters' => 'Karaktere bereziak',
@@ -8193,12 +8533,12 @@ $1:Adibidea.jpg|Oina2',
'wikieditor-toolbar-help-content-italic-description' => 'Etzana',
'wikieditor-toolbar-help-content-italic-syntax' => "''Testu etzana''",
'wikieditor-toolbar-help-content-italic-result' => '<em>Testu etzana</em>',
- 'wikieditor-toolbar-help-content-bold-description' => 'Beltza',
- 'wikieditor-toolbar-help-content-bold-syntax' => "'''Testu beltza'''",
- 'wikieditor-toolbar-help-content-bold-result' => '<strong>Testu beltza</strong>',
- 'wikieditor-toolbar-help-content-bolditalic-description' => 'Beltza eta etzana',
- 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Testu beltza eta etzana'''''",
- 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Testu beltza eta etzana</em></strong>',
+ 'wikieditor-toolbar-help-content-bold-description' => 'Lodia',
+ 'wikieditor-toolbar-help-content-bold-syntax' => "'''Letra lodiko testua'''",
+ 'wikieditor-toolbar-help-content-bold-result' => '<strong>Letra lodiko testua</strong>',
+ 'wikieditor-toolbar-help-content-bolditalic-description' => 'Lodia eta etzana',
+ 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Letra lodi eta etzaneko testua'''''",
+ 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Letra lodi eta etzaneko testua</em></strong>',
'wikieditor-toolbar-help-content-ilink-description' => 'Barne lotura',
'wikieditor-toolbar-help-content-ilink-syntax' => '[[Orriaren titulua|Loturaren izena]]<br />[[Orriaren titulua]]',
'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Loturaren izena</a><br /><a href='#'>Orriaren titulua</a>",
@@ -8243,6 +8583,7 @@ $1:Adibidea.jpg|Oina2',
);
/** Persian (Ùارسی)
+ * @author BMRG14
* @author Ebraminio
* @author Huji
* @author Ladsgroup
@@ -8392,7 +8733,7 @@ $1:مثال.jpg|عنوان ۲',
'wikieditor-toolbar-tool-table-preview' => 'پیش‌نمایش',
'wikieditor-toolbar-tool-table-insert' => 'اÙزودن',
'wikieditor-toolbar-tool-table-cancel' => 'لغو',
- 'wikieditor-toolbar-tool-table-toomany' => 'اضاÙÙ‡ کردن جدولی با بیش از $1 خانه توسط این ابزار ممکن نیست.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'اضاÙÙ‡ کردن جدولی با بیش از $1 خانه توسط این ابزار ممکن نیست.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'شما عدد درستی برای تعداد ردیÙ‌ها Ùˆ ستون‌ها وارد نکرده‌اید.',
'wikieditor-toolbar-tool-table-zero' => 'شما نمی‌توانید جدولی با صÙر ردی٠یا ستون اضاÙÙ‡ کنید.',
'wikieditor-toolbar-tool-replace' => 'یاÙتن Ùˆ جایگزین کردن',
@@ -8406,7 +8747,7 @@ $1:مثال.jpg|عنوان ۲',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'جایگزین کردن همه موارد',
'wikieditor-toolbar-tool-replace-close' => 'بستن',
'wikieditor-toolbar-tool-replace-nomatch' => 'جستجوی شما با هیچ موردی مطابقت نداشت.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 جایگزینی انجام شد.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 جایگزینی انجام شد.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'شما چیزی برای جستجو وارد نکردید.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'عبارت باقاعده‌ای که وارد کردید مجاز نیست: $1',
'wikieditor-toolbar-section-characters' => 'نویسه‌های ویژه',
@@ -8418,7 +8759,7 @@ $1:مثال.jpg|عنوان ۲',
'wikieditor-toolbar-characters-page-cyrillic' => 'سیریلیک',
'wikieditor-toolbar-characters-page-arabic' => 'عربی',
'wikieditor-toolbar-characters-page-arabicextended' => 'عربی گسترش‌یاÙته',
- 'wikieditor-toolbar-characters-page-persian' => 'Ùارسی',
+ 'wikieditor-toolbar-characters-page-persian' => 'پارسی',
'wikieditor-toolbar-characters-page-hebrew' => 'عبری',
'wikieditor-toolbar-characters-page-bangla' => 'بنگالی',
'wikieditor-toolbar-characters-page-tamil' => 'تامیلی',
@@ -8498,12 +8839,15 @@ $1:مثال.jpg|عنوان ۲',
/** Finnish (suomi)
* @author Beluga
* @author Crt
+ * @author Kulmalukko
* @author Linnea
* @author Nedergard
* @author Nike
* @author Olli
* @author Silvonen
* @author Str4nd
+ * @author Stryn
+ * @author VezonThunder
* @author ZeiP
*/
$messages['fi'] = array(
@@ -8648,21 +8992,21 @@ $1:Esimerkki.jpg|Kuvateksti2',
'wikieditor-toolbar-tool-table-preview' => 'Esikatselu',
'wikieditor-toolbar-tool-table-insert' => 'Lisää',
'wikieditor-toolbar-tool-table-cancel' => 'Peruuta',
- 'wikieditor-toolbar-tool-table-toomany' => 'Tällä toiminnolla ei voi tehdä taulukkoa, jossa on yli $1 solua.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Tällä toiminnolla ei voi tehdä taulukkoa, jossa on yli 1000 solua.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Et syöttänyt kelvollista rivi- tai sarakemäärää.',
'wikieditor-toolbar-tool-table-zero' => 'Et voi lisätä taulukkoa, jossa ei ole yhtään riviä tai saraketta.',
'wikieditor-toolbar-tool-replace' => 'Etsi ja korvaa',
'wikieditor-toolbar-tool-replace-title' => 'Etsi ja korvaa',
'wikieditor-toolbar-tool-replace-search' => 'Etsi seuraavaa:',
'wikieditor-toolbar-tool-replace-replace' => 'Korvaa seuraavalla:',
- 'wikieditor-toolbar-tool-replace-case' => 'Huomio kirjainkoko',
+ 'wikieditor-toolbar-tool-replace-case' => 'Huomioi kirjainkoko',
'wikieditor-toolbar-tool-replace-regex' => 'Kohtele hakuarvoa säännöllisenä lausekkeena',
'wikieditor-toolbar-tool-replace-button-findnext' => 'Etsi seuraava',
'wikieditor-toolbar-tool-replace-button-replace' => 'Korvaa',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Korvaa kaikki',
'wikieditor-toolbar-tool-replace-close' => 'Sulje',
'wikieditor-toolbar-tool-replace-nomatch' => 'Hakusi ei tuottanut osumia.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 korvausta tehty.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|korvaus|korvausta}} tehty.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Et antanut mitään haettavaa.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Syöttämäsi säännöllinen lauseke ei ole kelvollinen: $1',
'wikieditor-toolbar-section-characters' => 'Erikoismerkit',
@@ -8685,6 +9029,9 @@ $1:Esimerkki.jpg|Kuvateksti2',
'wikieditor-toolbar-characters-page-thai' => 'Thai',
'wikieditor-toolbar-characters-page-lao' => 'Lao',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-characters-endash' => 'ajatusviiva',
+ 'wikieditor-toolbar-characters-emdash' => 'pitkä ajatusviiva',
+ 'wikieditor-toolbar-characters-minus' => 'miinusmerkki',
'wikieditor-toolbar-section-help' => 'Ohje',
'wikieditor-toolbar-help-heading-description' => 'Kuvaus',
'wikieditor-toolbar-help-heading-syntax' => 'Mitä kirjoitat',
@@ -8905,7 +9252,7 @@ $1:Exemple.jpg|Description 2',
'wikieditor-toolbar-tool-table-preview' => 'Prévisualisation',
'wikieditor-toolbar-tool-table-insert' => 'Insérer',
'wikieditor-toolbar-tool-table-cancel' => 'Annuler',
- 'wikieditor-toolbar-tool-table-toomany' => 'Il n’est pas possible d’insérer un tableau de plus de $1 cellules avec cet outil.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Il n’est pas possible d’insérer un tableau de plus de 1000 cellules avec cet outil.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Vous n’avez pas entré un nombre de lignes ou de colonnes valide.',
'wikieditor-toolbar-tool-table-zero' => 'Vous ne pouvez pas insérer un tableau sans ligne ou sans colonne.',
'wikieditor-toolbar-tool-replace' => 'Rechercher et remplacer',
@@ -8919,7 +9266,7 @@ $1:Exemple.jpg|Description 2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Remplacer tout',
'wikieditor-toolbar-tool-replace-close' => 'Fermer',
'wikieditor-toolbar-tool-replace-nomatch' => 'Votre recherche n’a abouti à aucune correspondance.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 remplacements faits.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|remplacement fait|remplacements faits}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Vous n’avez pas indiqué de texte à rechercher.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'L’expression rationnelle entrée est invalide : $1',
'wikieditor-toolbar-section-characters' => 'Caractères spéciaux',
@@ -9056,22 +9403,22 @@ $messages['frp'] = array(
'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com titro du lim',
'wikieditor-toolbar-tool-link' => 'Lim',
'wikieditor-toolbar-tool-link-title' => 'Entrebetar un lim',
- 'wikieditor-toolbar-tool-link-int' => 'De vers una pâge vouiqui',
- 'wikieditor-toolbar-tool-link-int-target' => 'Titro de la pâge ou ben URL :',
- 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Titro de la pâge ou ben URL',
- 'wikieditor-toolbar-tool-link-int-text' => 'Tèxto du lim :',
- 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Buchiéd lo tèxto que devrêt étre montrâ',
- 'wikieditor-toolbar-tool-link-ext' => 'De vers una pâge vouèbe de defôr',
- 'wikieditor-toolbar-tool-link-ext-target' => 'URL ciba du lim :',
+ 'wikieditor-toolbar-tool-link-int' => 'De vers na pâge vouiqui',
+ 'wikieditor-toolbar-tool-link-int-target' => 'Pâge ou ben URL ciba :',
+ 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Titro ou ben URL de la pâge',
+ 'wikieditor-toolbar-tool-link-int-text' => 'Tèxto a fâre vêre :',
+ 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Buchiéd lo tèxto que devrêt étre fêt vêre',
+ 'wikieditor-toolbar-tool-link-ext' => 'De vers na pâge vouèbe de defôr',
+ 'wikieditor-toolbar-tool-link-ext-target' => 'URL du lim :',
'wikieditor-toolbar-tool-link-ext-text' => 'Tèxto du lim :',
- 'wikieditor-toolbar-tool-link-insert' => 'Entrebetar lo lim',
+ 'wikieditor-toolbar-tool-link-insert' => 'Entrebetar un lim',
'wikieditor-toolbar-tool-link-cancel' => 'Anular',
'wikieditor-toolbar-tool-link-int-target-status-exists' => 'La pâge ègziste',
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'La pâge ègziste pas',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Titro envalido',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Lim de defôr',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Contrôlo de l’ègzistence de la pâge...',
- 'wikieditor-toolbar-tool-link-int-invalid' => 'Lo titro que vos éd spècefiâ est fôx.',
+ 'wikieditor-toolbar-tool-link-int-invalid' => 'Lo titro que vos éd spècifiâ est envalido.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'L’URL que vos éd spècefiâ semble liyér vers una ôtra pâge du vouiqui.
Voléd-vos utilisar un lim de dedens a la place ?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Lim de dedens',
@@ -9086,6 +9433,7 @@ Voléd-vos utilisar un lim de dedens a la place ?',
'wikieditor-toolbar-file-float' => 'Alegnement :',
'wikieditor-toolbar-file-default' => '(per dèfôt)',
'wikieditor-toolbar-file-format' => 'Format :',
+ 'wikieditor-toolbar-file-format-none' => 'nion',
'wikieditor-toolbar-tool-file-insert' => 'Entrebetar',
'wikieditor-toolbar-tool-file-cancel' => 'Anular',
'wikieditor-toolbar-tool-reference' => 'Refèrence',
@@ -9127,7 +9475,7 @@ Voléd-vos utilisar un lim de dedens a la place ?',
'wikieditor-toolbar-tool-gallery-example' => '$1:Ègzemplo.jpg|Dèscripcion 1
$1:Ègzemplo.jpg|Dèscripcion 2',
'wikieditor-toolbar-tool-newline' => 'Sôt de legne',
- 'wikieditor-toolbar-tool-table' => 'Tablô',
+ 'wikieditor-toolbar-tool-table' => 'Grelye',
'wikieditor-toolbar-tool-table-example-old' => '-
! en-téta 1
! en-téta 2
@@ -9142,7 +9490,7 @@ $1:Ègzemplo.jpg|Dèscripcion 2',
| legne 2, câsa 3',
'wikieditor-toolbar-tool-table-example-cell-text' => 'Tèxto de la cèlula',
'wikieditor-toolbar-tool-table-example-header' => 'Tèxto de l’en-téta',
- 'wikieditor-toolbar-tool-table-title' => 'Entrebetar un tablô',
+ 'wikieditor-toolbar-tool-table-title' => 'Entrebetar na grelye',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'Legnes',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'Colones',
'wikieditor-toolbar-tool-table-dimensions-header' => 'Encllure la legne d’en-téta',
@@ -9152,7 +9500,7 @@ $1:Ègzemplo.jpg|Dèscripcion 2',
'wikieditor-toolbar-tool-table-preview' => 'Prèvisualisacion',
'wikieditor-toolbar-tool-table-insert' => 'Entrebetar',
'wikieditor-toolbar-tool-table-cancel' => 'Anular',
- 'wikieditor-toolbar-tool-table-toomany' => 'O est pas possiblo d’entrebetar un tablô de més de $1 cèlules avouéc cél outil.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'O est pas possiblo d’entrebetar un tablô de més de $1 cèlules avouéc cél outil.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Vos éd pas buchiê un nombro de legnes ou ben de colones valido.',
'wikieditor-toolbar-tool-table-zero' => 'Vos pouede pas entrebetar un tablô sen legne ou ben sen colona.',
'wikieditor-toolbar-tool-replace' => 'Rechèrchiér et pués remplaciér',
@@ -9166,7 +9514,7 @@ $1:Ègzemplo.jpg|Dèscripcion 2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Remplaciér tot',
'wikieditor-toolbar-tool-replace-close' => 'Cllôre',
'wikieditor-toolbar-tool-replace-nomatch' => 'Voutra rechèrche at trovâ gins de corrèspondance.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 remplacements fêts.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 remplacements fêts.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Vos éd buchiê gins de tèxto a rechèrchiér.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'L’èxprèssion racionèla buchiê est envalida : $1',
'wikieditor-toolbar-section-characters' => 'Caractèros spèciâls',
@@ -9189,6 +9537,9 @@ $1:Ègzemplo.jpg|Dèscripcion 2',
'wikieditor-toolbar-characters-page-thai' => 'Tayi',
'wikieditor-toolbar-characters-page-lao' => 'Lao',
'wikieditor-toolbar-characters-page-khmer' => 'C’mère',
+ 'wikieditor-toolbar-characters-endash' => 'terèt anglès',
+ 'wikieditor-toolbar-characters-emdash' => 'terèt èm',
+ 'wikieditor-toolbar-characters-minus' => 'segno muens',
'wikieditor-toolbar-section-help' => 'Éde',
'wikieditor-toolbar-help-heading-description' => 'Dèscripcion',
'wikieditor-toolbar-help-heading-syntax' => 'Cen que vos buchiéd',
@@ -9440,7 +9791,7 @@ $1:Ballsampaill.jpg|Mìneachadh an deilbh2',
'wikieditor-toolbar-tool-table-preview' => 'Ro-shealladh',
'wikieditor-toolbar-tool-table-insert' => 'Cuir a-steach',
'wikieditor-toolbar-tool-table-cancel' => 'Sguir dheth',
- 'wikieditor-toolbar-tool-table-toomany' => "Chan urrainn dhut clàr le barrachd air $1 ceallan a chur a-steach leis a' chòmhradh seo.",
+ 'wikieditor-toolbar-tool-table-toomany' => "Chan urrainn dhut clàr le barrachd air 1000 cealla a chur a-steach leis a' chòmhradh seo.",
'wikieditor-toolbar-tool-table-invalidnumber' => 'Cha do chuir thu a-steach àireamh cheadaichte de shreathan is de cholbhan.',
'wikieditor-toolbar-tool-table-zero' => 'Chan urrainn dhut clàr a chur a-steach aig nach eil sreath no colbh.',
'wikieditor-toolbar-tool-replace' => "Lorg is cuir 'na àite",
@@ -9453,7 +9804,7 @@ $1:Ballsampaill.jpg|Mìneachadh an deilbh2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Cuir an àite gach aon dhiubh',
'wikieditor-toolbar-tool-replace-close' => 'Dùin',
'wikieditor-toolbar-tool-replace-nomatch' => 'Cha do fhreagair an lorg agad ri rud sam bith.',
- 'wikieditor-toolbar-tool-replace-success' => 'Chaidh rud ùr a chur an àite $1 dhiubh.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Chaidh rud ùr a chur an àite $1 {{PLURAL:$1|dheth|dhiubh}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Cha do chuir thu càil a-steach as urrainnear lorg.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Tha an regular expression a chuir thu a-steach mì-dhligheach: $1',
'wikieditor-toolbar-section-characters' => 'Caractairean sònraichte',
@@ -9515,7 +9866,7 @@ $1:Ballsampaill.jpg|Mìneachadh an deilbh2',
'wikieditor-toolbar-help-content-olist-syntax' => '* Ball na liosta<br />* Ball na liosta',
'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Ball na liosta</li><li>Ball na liosta</li></ol>',
'wikieditor-toolbar-help-content-file-description' => 'Embedded file',
- 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Ballsampaill.png|thumb|Mìneachadh an deilbh]]', # Fuzzy
+ 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Caipsean]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Mìneachadh an deilbht' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Meudaich' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Mìneachadh an deilbh</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'Iomradh',
'wikieditor-toolbar-help-content-reference-syntax' => 'Teacsa na duilleige.&lt;ref name="test"&gt;[http://www.ballsampaill.org Teacsa a\' cheangail], teacsa eile.&lt;/ref&gt;',
@@ -9540,7 +9891,7 @@ $messages['gl'] = array(
'wikieditor' => 'Interface avanzada de edición de texto wiki',
'wikieditor-desc' => 'Proporciona unha interface extensible de edición de texto wiki e moitas funcionalidades de módulos',
'wikieditor-wikitext-tab' => 'Texto wiki',
- 'wikieditor-loading' => 'Cargando',
+ 'wikieditor-loading' => 'Cargando...',
'wikieditor-preview-preference' => 'Activar a vista previa comparativa',
'wikieditor-preview-tab' => 'Vista previa',
'wikieditor-preview-changes-tab' => 'Cambios',
@@ -9582,7 +9933,7 @@ $messages['gl'] = array(
'wikieditor-toolbar-tool-link' => 'Ligazón',
'wikieditor-toolbar-tool-link-title' => 'Inserir unha ligazón',
'wikieditor-toolbar-tool-link-int' => 'Cara a unha páxina wiki',
- 'wikieditor-toolbar-tool-link-int-target' => 'Título da páxina:',
+ 'wikieditor-toolbar-tool-link-int-target' => 'Título da páxina ou URL:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Título da páxina ou URL',
'wikieditor-toolbar-tool-link-int-text' => 'Texto da ligazón:',
'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Insira o texto que se mostrará',
@@ -9678,7 +10029,7 @@ $1:Example.jpg|Pé_de_foto_2',
'wikieditor-toolbar-tool-table-preview' => 'Vista previa',
'wikieditor-toolbar-tool-table-insert' => 'Inserir',
'wikieditor-toolbar-tool-table-cancel' => 'Cancelar',
- 'wikieditor-toolbar-tool-table-toomany' => 'Non é posible inserir unha táboa con máis de $1 celas con este diálogo.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Non é posible inserir unha táboa con máis de 1000 celas con este diálogo.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Non inseriu un número válido de fileiras ou columnas.',
'wikieditor-toolbar-tool-table-zero' => 'Non pode inserir unha táboa con cero fileiras ou columnas.',
'wikieditor-toolbar-tool-replace' => 'Buscar e substituír',
@@ -9692,7 +10043,7 @@ $1:Example.jpg|Pé_de_foto_2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Substituír todos',
'wikieditor-toolbar-tool-replace-close' => 'Pechar',
'wikieditor-toolbar-tool-replace-nomatch' => 'A súa busca non atopou nada.',
- 'wikieditor-toolbar-tool-replace-success' => 'Fixéronse $1 substitucións.',
+ 'wikieditor-toolbar-tool-replace-success' => '{{PLURAL:$1|Fíxose $1 substitución|Fixéronse $1 substitucións}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Non inseriu nada que procurar.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'A expresión regular que inseriu non é válida: $1',
'wikieditor-toolbar-section-characters' => 'Caracteres especiais',
@@ -10022,7 +10373,7 @@ $1:Byschpil.jpg|Bschriftig2',
'wikieditor-toolbar-tool-table-preview' => 'Vorschau',
'wikieditor-toolbar-tool-table-insert' => 'Yyfiege',
'wikieditor-toolbar-tool-table-cancel' => 'Abbräche',
- 'wikieditor-toolbar-tool-table-toomany' => 'Yyfiege vun ere Tabälle mit meh wie $1 Zälle isch nit megli in däm Dialogfänschter.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Yyfiege vun ere Tabälle mit meh wie $1 Zälle isch nit megli in däm Dialogfänschter.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Du hesch kei giltigi Zahl vu Zyyle oder Spalte yygee.',
'wikieditor-toolbar-tool-table-zero' => 'Du chasch kei Tabälle yyfiege ohni Zyyle oder Spalte.',
'wikieditor-toolbar-tool-replace' => 'Suechen un ersetze',
@@ -10036,7 +10387,7 @@ $1:Byschpil.jpg|Bschriftig2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Alli ersetze',
'wikieditor-toolbar-tool-replace-close' => 'Zuemache',
'wikieditor-toolbar-tool-replace-nomatch' => 'Zue Dyyre Suech git s kei Träffer.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 Ersetzige durgfiert.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 Ersetzige durgfiert.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Du hesch nyt yygee zum Sueche.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Dää regulär Uusdruck, wu Du yygee hesch, isch nit giltig: $1',
'wikieditor-toolbar-section-characters' => 'Sunderzeiche',
@@ -10266,7 +10617,7 @@ $1:Example.jpg|Caption2',
'wikieditor-toolbar-tool-table-preview' => 'પૂરà«àªµàª¾àªµàª²à«‹àª•àª¨',
'wikieditor-toolbar-tool-table-insert' => 'ઉમેરો',
'wikieditor-toolbar-tool-table-cancel' => 'રદ કરો',
- 'wikieditor-toolbar-tool-table-toomany' => 'આ સંભાષણ કોઠાને વાપરીને $1 થી વધારે ચોકઠાંનો કોઠો નહીં બનાવી શકાય',
+ 'wikieditor-toolbar-tool-table-toomany' => 'આ સંભાષણ કોઠાને વાપરીને ૧૦૦૦ થી વધારે ચોકઠાંનો કોઠો નહીં બનાવી શકાય',
'wikieditor-toolbar-tool-table-invalidnumber' => 'તમે હરોળ કે સà«àª¤àª‚ભની સંખà«àª¯àª¾ યોગà«àª¯ રીતે નથી મૂકી',
'wikieditor-toolbar-tool-table-zero' => 'તમે શૂનà«àª¯ હરોળ અને શૂનà«àª¯ સà«àª¤àª‚ભ ધરાવતો કોઠો ન બનાવી શકો',
'wikieditor-toolbar-tool-replace' => 'શોધો અને બદલો',
@@ -10280,7 +10631,7 @@ $1:Example.jpg|Caption2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'બધા બદલો',
'wikieditor-toolbar-tool-replace-close' => 'બંધ કરો',
'wikieditor-toolbar-tool-replace-nomatch' => 'તમારી શોધ કશાયને મળતી આવતી નથી',
- 'wikieditor-toolbar-tool-replace-success' => '$1 બદલાવ(વો) કરાયાં.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|બદલાવ|બદલાવો}} કરાયાં.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'તમે શોધવા માટે કંઈ દાખલ કરà«àª¯à«àª‚ નથી.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'તમે માહિતી મૂકી તે અમાનà«àª¯ છે : $1',
'wikieditor-toolbar-section-characters' => 'ખાસ અકà«àª·àª°à«‹ કે ચિનà«àª¹à«‹',
@@ -10496,7 +10847,7 @@ $1:Example.jpg|Fo-heidyl2',
'wikieditor-toolbar-tool-table-preview' => 'Roie-haishbynys',
'wikieditor-toolbar-tool-table-insert' => 'Cur stiagh',
'wikieditor-toolbar-tool-table-cancel' => 'Dolley magh',
- 'wikieditor-toolbar-tool-table-toomany' => 'Cha nod oo cur stiagh taabyl as ny smoo na $1 killag echey liorish y chishtey cooney shoh.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Cha nod oo cur stiagh taabyl as ny smoo na $1 killag echey liorish y chishtey cooney shoh.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Cha dug oo stiagh earroo cooie dy roaghyn ny collooghyn.',
'wikieditor-toolbar-tool-table-zero' => 'Cha nod oo cur stiagh taabyl gyn roaghyn ny collooghyn.',
'wikieditor-toolbar-tool-replace' => 'Ronsaghey as coonrey',
@@ -10509,7 +10860,7 @@ $1:Example.jpg|Fo-heidyl2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Caghlaa dagh fer',
'wikieditor-toolbar-tool-replace-close' => 'Dooney',
'wikieditor-toolbar-tool-replace-nomatch' => 'Cha row y raa ry-hirrey ayd ry-akin.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 c(h)aghlaa(ghyn) jeant.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 c(h)aghlaa(ghyn) jeant.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Cha dug oo stiagh red erbee dy hirrey.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Hug oo stiagh slonn reiltagh gyn vree: $1',
'wikieditor-toolbar-section-characters' => 'Cowraghyn er lheh',
@@ -10756,7 +11107,7 @@ $1:דוגמה.jpg|כותרת 2',
'wikieditor-toolbar-tool-table-insert' => 'הוספה',
'wikieditor-toolbar-tool-table-cancel' => 'ביטול',
'wikieditor-toolbar-tool-table-example-text' => '×žÖ·×”Ö¾× Ö¸Ö¼×¢Ö´×™× ×”Ö¸×¢Ö¶×¨Ö¶×‘ לִלְבַב כָּל־גֶּבֶר, ×Ö´× ×žÖ·×¨Ö¾× Ö¶×¤Ö¶×©× ×”×•Ö¼×, ×Ö´× ×’Ö¶Ö¼×‘Ö¶×¨ צוֹלֵחַ; לָזֶה ×¢Ö´× ×”Ö¸×¢Ö¶×¨Ö¶×‘ ×™Ö¸×‘Ö¹× ×§Öµ×¥ שֶ×בֶר וָזֶה בָּעֶרֶב פִּי שֶ×בַע שָׂמֵחַ. ×›Ö´Ö¼×™ ×¨Ö·×¢Ö·×©× ×”Ö·×™Ö¼×•Ö¹×, ×וֹר שֶ××žÖ¶×©× ×–×•Ö¹×¨Öµ×—Ö·, יַלְ×וּ ×”Ö·× Ö¶Ö¼×¤Ö¶×©× ×•Ö´×™×§Ö·×¦Ö°Ö¼×¦×•Ö¼ ×”Ö¸×ֵבֶר, וּבְדִמְמַת עֶרֶב ×ֶל × Ö¹×’Ö·×”Ö¼ יָרֵחַ ×ªÖ´Ö¼× Ö¸Ö¼×¤Ö·×©× ×Ö·×£ תַּחֲלִיף עָצְמָה וָשֵ×בֶר.',
- 'wikieditor-toolbar-tool-table-toomany' => 'הוספת טבלה בת יותר מ־$1 ת××™× ××™× ×” ×פשרית בתיבת הדו־שיח הזו.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'הוספת טבלה בת יותר מ־1000 ת××™× ××™× ×” ×פשרית בתיבת הדו־שיח ×”×–×ת.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'מספר השורות ×ו העמודות שהוזן ×ינו תקין.',
'wikieditor-toolbar-tool-table-zero' => '×œ× × ×™×ª×Ÿ להוסיף טבלה בעלת ×פס שורות ×ו עמודות.',
'wikieditor-toolbar-tool-replace' => 'חיפוש והחלפה',
@@ -10770,7 +11121,7 @@ $1:דוגמה.jpg|כותרת 2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'החלפת הכול',
'wikieditor-toolbar-tool-replace-close' => 'סגירה',
'wikieditor-toolbar-tool-replace-nomatch' => '×œ× ×”×ª×§×‘×œ×• הת×מות לחיפושכ×.',
- 'wikieditor-toolbar-tool-replace-success' => 'בוצעו $1 החלפות.',
+ 'wikieditor-toolbar-tool-replace-success' => '{{PLURAL:$1|בוצעה החלפה ×חת|בוצעו $1 החלפות}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => '×œ× ×›×ª×‘×ª× ×˜×§×¡×˜ לחיפוש.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'הביטוי הרגולרי שהוכנס ×ינו תקין: $1',
'wikieditor-toolbar-section-characters' => '×ª×•×•×™× ×ž×™×•×—×“×™×',
@@ -10872,7 +11223,7 @@ $messages['hi'] = array(
'wikieditor-loading' => 'लदान',
'wikieditor-preview-preference' => 'सकà¥à¤·à¤® पकà¥à¤· धà¥à¤µà¤¾à¤°à¤¾ पकà¥à¤· पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨',
'wikieditor-preview-tab' => 'पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨',
- 'wikieditor-preview-changes-tab' => 'बदà¥à¤²à¤¾à¤ªà¥à¤¨à¥',
+ 'wikieditor-preview-changes-tab' => 'बदलाव',
'wikieditor-preview-loading' => 'लदानà¥',
'wikieditor-previewDialog-preference' => 'सकà¥à¤¶à¥à¤®à¥',
'wikieditor-previewDialog-tab' => 'पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨',
@@ -10998,7 +11349,7 @@ $1:उदाहरण.jpg|चितà¥à¤°à¤¶à¥€à¤°à¥à¤·à¤•à¥¨',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'सभी बदलें',
'wikieditor-toolbar-tool-replace-close' => 'बंद करें',
'wikieditor-toolbar-tool-replace-nomatch' => 'आपके खोज कà¥à¤› मिला नहीं',
- 'wikieditor-toolbar-tool-replace-success' => '$1 पà¥à¤°à¤¤à¤¿à¤¸à¥à¤¥à¤¾à¤ªà¤¨ बनें ।',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 पà¥à¤°à¤¤à¤¿à¤¸à¥à¤¥à¤¾à¤ªà¤¨ बनें ।', # Fuzzy
'wikieditor-toolbar-section-characters' => 'विशेष वरà¥à¤£',
'wikieditor-toolbar-characters-page-latin' => 'लाटिन',
'wikieditor-toolbar-characters-page-latinextended' => 'लाटिन विसà¥à¤¤à¤¾à¤°à¤¿à¤¤',
@@ -11229,7 +11580,7 @@ $1:Primjer.jpg|Opis2',
'wikieditor-toolbar-tool-table-preview' => 'Pregled',
'wikieditor-toolbar-tool-table-insert' => 'Umetni',
'wikieditor-toolbar-tool-table-cancel' => 'Odustani',
- 'wikieditor-toolbar-tool-table-toomany' => 'Umetanje tablice s više od $1 polja nije moguće s ovim dijalogu.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Umetanje tablice s više od $1 polja nije moguće s ovim dijalogu.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Niste unijeli valjani broj redaka ili stupaca.',
'wikieditor-toolbar-tool-table-zero' => 'Ne možete umetnuti tablicu sa nula redaka ili stupaca.',
'wikieditor-toolbar-tool-replace' => 'Zamijeni',
@@ -11242,7 +11593,7 @@ $1:Primjer.jpg|Opis2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Zamijeni sve',
'wikieditor-toolbar-tool-replace-close' => 'Zatvori',
'wikieditor-toolbar-tool-replace-nomatch' => 'Pretraživanje nije pronašlo ništa.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 zamjena naÄinjeno.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 zamjena naÄinjeno.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Niste unijeli ništa za pretragu.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Izraz koji ste unijeli nije ispravan: $1',
'wikieditor-toolbar-section-characters' => 'Posebni znakovi',
@@ -11470,7 +11821,7 @@ $1:Example.jpg|Popis2',
'wikieditor-toolbar-tool-table-preview' => 'Přehlad',
'wikieditor-toolbar-tool-table-insert' => 'Zasunyć',
'wikieditor-toolbar-tool-table-cancel' => 'Přetorhnyć',
- 'wikieditor-toolbar-tool-table-toomany' => 'Zasuwanje tabele z přez $1 {{PLURAL:$1|celu|celomaj|celemi|celemi}} z tutym dialogom móžno njeje.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Zasuwanje tabele z přez 1000 celemi z tutym dialogom móžno njeje.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Njejsy pÅ‚aćiwu liÄbu rjadkow abo Å¡paltow zapodaÅ‚.',
'wikieditor-toolbar-tool-table-zero' => 'Njemóžeš tabelu bjez rjadkow abo špaltow zasunyć.',
'wikieditor-toolbar-tool-replace' => 'Pytać a narunać',
@@ -11723,7 +12074,7 @@ $1:Példa.jpg|képaláírás2',
'wikieditor-toolbar-tool-table-preview' => 'Előnézet',
'wikieditor-toolbar-tool-table-insert' => 'Beszúrás',
'wikieditor-toolbar-tool-table-cancel' => 'Mégse',
- 'wikieditor-toolbar-tool-table-toomany' => 'Több mint $1 cellát tartalmazó táblázat beillesztése nem lehetséges ezzel a párbeszédablakkal.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Több mint $1 cellát tartalmazó táblázat beillesztése nem lehetséges ezzel a párbeszédablakkal.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Nem megfelelő számú sort vagy oszlopot adtál meg.',
'wikieditor-toolbar-tool-table-zero' => 'Nem szúrhatsz be nulla sort vagy oszlopot tartalmazó táblázatot.',
'wikieditor-toolbar-tool-replace' => 'Keresés és csere',
@@ -11737,7 +12088,7 @@ $1:Példa.jpg|képaláírás2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Összes cseréje',
'wikieditor-toolbar-tool-replace-close' => 'Bezárás',
'wikieditor-toolbar-tool-replace-nomatch' => 'Nincs egyetlen találat sem.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 csere történt.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 csere történt.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Nem adtad meg, hogy mit akarsz keresni.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'A megadott reguláris kifejezés érvénytelen: $1',
'wikieditor-toolbar-section-characters' => 'Különleges karakterek',
@@ -11825,6 +12176,7 @@ $1:Példa.jpg|képaláírás2',
/** Armenian (Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶)
* @author Chaojoker
+ * @author Vadgt
* @author Xelgen
*/
$messages['hy'] = array(
@@ -11946,7 +12298,7 @@ $1:Example.jpg|Õ†Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶2',
'wikieditor-toolbar-tool-table-preview' => 'Õ†Õ¡Õ­Õ¡Õ¤Õ«Õ¿Õ¸Ö‚Õ´',
'wikieditor-toolbar-tool-table-insert' => 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬',
'wikieditor-toolbar-tool-table-cancel' => 'Ô²Õ¥Õ¯Õ¡Õ¶Õ¥Õ¬',
- 'wikieditor-toolbar-tool-table-toomany' => 'Ô±ÕµÕ½ Õ¥Ö€Õ¯Õ­Õ¸Õ½Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ $1 Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ«Ö Õ¡Õ¾Õ¥Õ¬ Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯ Õ¸Ö‚Õ¶Õ¥ÖÕ¸Õ² Õ¡Õ²ÕµÕ¸Ö‚Õ½Õ¡Õ¯ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬Ö‰',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Ô±ÕµÕ½ Õ¥Ö€Õ¯Õ­Õ¸Õ½Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ´Õ«Õ»Õ¸ÖÕ¸Õ¾ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ $1 Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ«Ö Õ¡Õ¾Õ¥Õ¬ Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯ Õ¸Ö‚Õ¶Õ¥ÖÕ¸Õ² Õ¡Õ²ÕµÕ¸Ö‚Õ½Õ¡Õ¯ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬Ö‰', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ô´Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ Õ¶Õ·Õ¥Õ¬ Õ¿Õ¸Õ²Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ½ÕµÕ¸Ö‚Õ¶Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬Õ« Ö„Õ¡Õ¶Õ¡Õ¯Ö‰',
'wikieditor-toolbar-tool-table-zero' => 'Ô´Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¿Õ¸Õ²Õ¥Ö€Õ« Õ¯Õ¡Õ´ Õ½ÕµÕ¸Ö‚Õ¶Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ¦Ö€Õ¸ÕµÕ¡Õ¯Õ¡Õ¶ Ö„Õ¡Õ¶Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ¡Õ²ÕµÕ¸Ö‚Õ½Õ¡Õ¯Ö‰',
'wikieditor-toolbar-tool-replace' => 'ÕˆÖ€Õ¸Õ¶Õ¸Ö‚Õ´ Ö‡ ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ¸Ö‚Õ´',
@@ -11959,7 +12311,7 @@ $1:Example.jpg|Õ†Õ¯Õ¡Ö€Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Õ“Õ¸Õ­Õ¡Ö€Õ«Õ¶Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€Õ¨',
'wikieditor-toolbar-tool-replace-close' => 'Ô²Õ¥Õ¯Õ¡Õ¶Õ¥Õ¬', # Fuzzy
'wikieditor-toolbar-tool-replace-nomatch' => 'ÕÕ¥Ö€ Õ¸Ö€Õ¸Õ¶Õ´Õ¡Õ¶Õ¨ Õ°Õ¡Õ´Õ¡ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¸Õ² Õ¡Ö€Õ¤ÕµÕ¸Ö‚Õ¶Ö„Õ¶Õ¥Ö€ Õ¹Õ¥Õ¶ Õ£Õ¿Õ¶Õ¾Õ¥Õ¬Ö‰',
- 'wikieditor-toolbar-tool-replace-success' => 'Ô¿Õ¡Õ¿Õ¡Ö€Õ¾Õ¥Õ¬ Õ§ $1 ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ¸Ö‚Õ´Ö‰',
+ 'wikieditor-toolbar-tool-replace-success' => 'Ô¿Õ¡Õ¿Õ¡Ö€Õ¾Õ¥Õ¬ Õ§ $1 ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ¸Ö‚Õ´Ö‰', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ô´Õ¸Ö‚Ö„ Õ¸Ö€Õ¸Õ¶Õ¥Õ¬Õ¸Ö‚ Õ¸Ö€Ö‡Õ§ Õ¢Õ¡Õ¶ Õ¹Õ¥Ö„ Õ¶Õ·Õ¥Õ¬Ö‰',
'wikieditor-toolbar-tool-replace-invalidregex' => 'ÕÕ¥Ö€ Õ¶Õ·Õ¡Õ® regular expression-Õ¨ Õ½Õ­Õ¡Õ¬ է․ $1',
'wikieditor-toolbar-section-characters' => 'Õ€Õ¡Õ¿Õ¸Ö‚Õ¯ Õ¶Õ·Õ¡Õ¶Õ¶Õ¥Ö€',
@@ -12183,7 +12535,7 @@ $1:Exemplo.jpg|Legenda2',
'wikieditor-toolbar-tool-table-preview' => 'Previsualisation',
'wikieditor-toolbar-tool-table-insert' => 'Inserer',
'wikieditor-toolbar-tool-table-cancel' => 'Cancellar',
- 'wikieditor-toolbar-tool-table-toomany' => 'Inserer un tabula con plus de $1 cellulas non es possibile con iste dialogo.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Inserer un tabula con plus de $1 cellulas non es possibile con iste dialogo.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Tu non ha entrate un numero valide de lineas o columnas.',
'wikieditor-toolbar-tool-table-zero' => 'Tu non pote inserer un tabula con zero lineas o columnas.',
'wikieditor-toolbar-tool-replace' => 'Cercar e reimplaciar',
@@ -12197,7 +12549,7 @@ $1:Exemplo.jpg|Legenda2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Reimplaciar toto',
'wikieditor-toolbar-tool-replace-close' => 'Clauder',
'wikieditor-toolbar-tool-replace-nomatch' => 'Tu recerca non ha producite resultatos.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 reimplaciamentos facite.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 reimplaciamentos facite.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Tu non entrava texto a cercar.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Le expression regular que tu entrava es invalide: $1',
'wikieditor-toolbar-section-characters' => 'Characteres special',
@@ -12288,6 +12640,7 @@ $1:Exemplo.jpg|Legenda2',
* @author Farras
* @author Irwangatot
* @author IvanLanin
+ * @author Iwan Novirion
* @author Kenrick95
*/
$messages['id'] = array(
@@ -12431,7 +12784,7 @@ $1:Contoh.jpg|Judul2',
'wikieditor-toolbar-tool-table-preview' => 'Pratayang',
'wikieditor-toolbar-tool-table-insert' => 'Masukkan',
'wikieditor-toolbar-tool-table-cancel' => 'Batalkan',
- 'wikieditor-toolbar-tool-table-toomany' => 'Anda tidak dapat membuat tabel dengan jumlah sel yang lebih dari $1',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Anda tidak dapat membuat tabel dengan jumlah sel yang lebih dari $1', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Anda tidak memasukkan jumlah kolom atau baris yang sah',
'wikieditor-toolbar-tool-table-zero' => 'Anda tidak dapat memasukkan tabel dengan jumlah baris atau kolom nol.',
'wikieditor-toolbar-tool-replace' => 'Cari dan gantikan',
@@ -12445,7 +12798,7 @@ $1:Contoh.jpg|Judul2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Ganti semua',
'wikieditor-toolbar-tool-replace-close' => 'Tutup',
'wikieditor-toolbar-tool-replace-nomatch' => 'Pencarian Anda tidak membuahkan hasil.',
- 'wikieditor-toolbar-tool-replace-success' => 'Terjadi $1 penggantian.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Terjadi $1 penggantian.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Anda tidak memasukan apa pun untuk di pencarian.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Kalimat biasa yang Anda masukkan tidak sah: $1',
'wikieditor-toolbar-section-characters' => 'Karakter spesial',
@@ -12468,6 +12821,9 @@ $1:Contoh.jpg|Judul2',
'wikieditor-toolbar-characters-page-thai' => 'Thai',
'wikieditor-toolbar-characters-page-lao' => 'Lao',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-characters-endash' => 'en dash',
+ 'wikieditor-toolbar-characters-emdash' => 'em dash',
+ 'wikieditor-toolbar-characters-minus' => 'tanda kurang',
'wikieditor-toolbar-section-help' => 'Bantuan',
'wikieditor-toolbar-help-heading-description' => 'Keterangan',
'wikieditor-toolbar-help-heading-syntax' => 'Yang Anda ketikkan',
@@ -12523,7 +12879,7 @@ $1:Contoh.jpg|Judul2',
'wikieditor-toolbar-help-content-showreferences-description' => 'Menampilkan referensi',
'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.contoh.org' class='external text' href='#'>Teks pranala</a>, teks tambahan.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Tanda tangan dengan waktu',
- 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Name pengguna</a> (<a href='#' title='{{#special:mytalk}}'>bicara</a>) 15:54, 10 June 2009 (UTC)",
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Nama pengguna</a> (<a href='#' title='{{#special:mytalk}}'>bicara</a>) 15:54, 10 Mei 2013 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Tanda tangan',
'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Nama pengguna</a> (<a href='#' title='{{#special:mytalk}}'>bicara</a>)",
'wikieditor-toolbar-help-content-indent-description' => 'Inden',
@@ -12581,7 +12937,7 @@ $messages['ig'] = array(
'wikieditor-toolbar-tool-table-dimensions-columns' => 'Ogìdì',
'wikieditor-toolbar-tool-table-cancel' => 'Kàchá',
'wikieditor-toolbar-tool-replace-search' => 'Chá»wa màkà:',
- 'wikieditor-toolbar-tool-replace-close' => 'Mèchié',
+ 'wikieditor-toolbar-tool-replace-close' => 'Mèchí',
'wikieditor-toolbar-characters-page-latin' => 'Latin',
'wikieditor-toolbar-characters-page-latinextended' => 'Latin dá»rá»',
'wikieditor-toolbar-characters-page-ipa' => 'IPA',
@@ -12734,9 +13090,9 @@ Kayatmo nga aramiden daytoy nga akinuneg a panilpo?',
'wikieditor-toolbar-tool-small' => 'Bassit',
'wikieditor-toolbar-tool-small-example' => 'Bassit a testo',
'wikieditor-toolbar-tool-superscript' => 'Superscript',
- 'wikieditor-toolbar-tool-superscript-example' => 'Testo ti superscript',
+ 'wikieditor-toolbar-tool-superscript-example' => 'Testo ti supereskritu',
'wikieditor-toolbar-tool-subscript' => 'Subscript',
- 'wikieditor-toolbar-tool-subscript-example' => 'Testo ti subscript',
+ 'wikieditor-toolbar-tool-subscript-example' => 'Testo ti subeskritu',
'wikieditor-toolbar-group-insert' => 'Isengngat',
'wikieditor-toolbar-tool-gallery' => 'Palko ti retrato',
'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|Naisurat1
@@ -12767,9 +13123,9 @@ $1:Example.jpg|Naisurat2',
'wikieditor-toolbar-tool-table-preview' => 'Ipadas',
'wikieditor-toolbar-tool-table-insert' => 'Isengngat',
'wikieditor-toolbar-tool-table-cancel' => 'Ukasen',
- 'wikieditor-toolbar-tool-table-toomany' => 'Ti panagisengngat ti tabla nga adda ti adadu ngem $1 a selula ket saan a mabalin iti daytoy a pagsaritaan.',
- 'wikieditor-toolbar-tool-table-invalidnumber' => 'Saan ka pay a nakaikabil ti umisu a numero iti ar-aray wenno binnatong.',
- 'wikieditor-toolbar-tool-table-zero' => 'Saan mo a mabalin ti agisengngat ti tabla nga adda ti sero nga ar-aray wenno binnatong.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Ti panagisengngat ti tabla nga adda kadagiti ad-adu ngem 1000 a selula ket saan a mabalin iti daytoy a pagsaritaan.',
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'Saanka pay a nakaikabil ti umisu a numero iti ar-aray wenno binnatong.',
+ 'wikieditor-toolbar-tool-table-zero' => 'Saanmo a mabalin ti agisengngat ti tabla nga adda ti sero nga ar-aray wenno binnatong.',
'wikieditor-toolbar-tool-replace' => 'Agbiruk ken sukatan',
'wikieditor-toolbar-tool-replace-title' => 'Agbiruk ken sukatan',
'wikieditor-toolbar-tool-replace-search' => 'Biruken iti:',
@@ -12781,7 +13137,7 @@ $1:Example.jpg|Naisurat2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Sukatan amin',
'wikieditor-toolbar-tool-replace-close' => 'Irikep',
'wikieditor-toolbar-tool-replace-nomatch' => 'Ti panagbirukmo ket awan ti napadana.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 ti naaramid a nasukatan.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|a sinukatan|a sinuksukatan}} ti naaramid.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Awan ti inkabilmo a biruken.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Ti kadawyan a panangisao nga inkabilmo ket imbalido: $1',
'wikieditor-toolbar-section-characters' => 'Dagiti naipangpangruna a karakter',
@@ -12804,6 +13160,9 @@ $1:Example.jpg|Naisurat2',
'wikieditor-toolbar-characters-page-thai' => 'Thai',
'wikieditor-toolbar-characters-page-lao' => 'Lao',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-characters-endash' => 'en dash',
+ 'wikieditor-toolbar-characters-emdash' => 'em dash',
+ 'wikieditor-toolbar-characters-minus' => 'senial a panagkissay',
'wikieditor-toolbar-section-help' => 'Tulong',
'wikieditor-toolbar-help-heading-description' => 'Panagipalpalawag',
'wikieditor-toolbar-help-heading-syntax' => 'Ti imakiniliam',
@@ -12930,7 +13289,7 @@ $messages['io'] = array(
'wikieditor-toolbar-tool-table-cancel' => 'Anular',
'wikieditor-toolbar-tool-replace-search' => 'Serchar:',
'wikieditor-toolbar-tool-replace-close' => 'Klozar',
- 'wikieditor-toolbar-tool-replace-success' => '$1 remplasigo(i) facita.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 remplasigo(i) facita.', # Fuzzy
'wikieditor-toolbar-characters-page-latin' => 'Latina',
'wikieditor-toolbar-characters-page-latinextended' => 'Latina extensita',
'wikieditor-toolbar-characters-page-symbols' => 'Simboli',
@@ -13090,7 +13449,7 @@ $1:Example.jpg|Myndlýsing2',
'wikieditor-toolbar-tool-table-preview' => 'Forskoðun',
'wikieditor-toolbar-tool-table-insert' => 'Setja inn',
'wikieditor-toolbar-tool-table-cancel' => 'Hætta við',
- 'wikieditor-toolbar-tool-table-toomany' => 'Ekki er hægt að búa til töflu með fleiri en $1 reiti með þessari valmynd.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Ekki er hægt að búa til töflu með fleiri en $1 reiti með þessari valmynd.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ógildur fjöldi raða eða reita.',
'wikieditor-toolbar-tool-table-zero' => 'Taflan getur ekki innihaldið núll raðir eða reiti.',
'wikieditor-toolbar-tool-replace' => 'Leita og skipta út',
@@ -13104,7 +13463,7 @@ $1:Example.jpg|Myndlýsing2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Skipta út öllum',
'wikieditor-toolbar-tool-replace-close' => 'Loka',
'wikieditor-toolbar-tool-replace-nomatch' => 'Engar niðurstöður fundust.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 útskiptingar gerðar.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 útskiptingar gerðar.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Þú slóst ekki inn neitt til að leita að.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Ógild regluleg segð: $1',
'wikieditor-toolbar-section-characters' => 'Sérstafir',
@@ -13245,11 +13604,11 @@ $messages['it'] = array(
'wikieditor-toolbar-tool-xlink' => 'Collegamento esterno (ricorda il prefisso http:// )',
'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com titolo del collegamento',
'wikieditor-toolbar-tool-link' => 'Collegamento',
- 'wikieditor-toolbar-tool-link-title' => 'Inserisci link',
+ 'wikieditor-toolbar-tool-link-title' => 'Inserisci collegamento',
'wikieditor-toolbar-tool-link-int' => 'A una pagina wiki',
- 'wikieditor-toolbar-tool-link-int-target' => 'Titolo della pagina:',
+ 'wikieditor-toolbar-tool-link-int-target' => 'Pagina di destinazione o URL:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Titolo della pagina o URL',
- 'wikieditor-toolbar-tool-link-int-text' => 'Testo del link:',
+ 'wikieditor-toolbar-tool-link-int-text' => 'Testo da visualizzare:',
'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Inserisci il testo da visualizzare',
'wikieditor-toolbar-tool-link-ext' => 'A una pagina di un sito web esterno',
'wikieditor-toolbar-tool-link-ext-target' => 'URL del link:',
@@ -13264,7 +13623,7 @@ $messages['it'] = array(
'wikieditor-toolbar-tool-link-int-invalid' => 'Il titolo che hai specificato non è valido.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => "La URL che hai indicato sembra un link verso un'altra pagina wiki.
Vuoi che sia un link interno?",
- 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Link interno',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Collegamento interno',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Collegamento esterno',
'wikieditor-toolbar-tool-link-empty' => 'Non hai indicato la destinazione del collegamento.',
'wikieditor-toolbar-tool-file' => 'File incorporato',
@@ -13343,7 +13702,7 @@ $1:Esempio.jpg|Didascalia2',
'wikieditor-toolbar-tool-table-preview' => 'Anteprima',
'wikieditor-toolbar-tool-table-insert' => 'Inserisci',
'wikieditor-toolbar-tool-table-cancel' => 'Annulla',
- 'wikieditor-toolbar-tool-table-toomany' => 'Con questo strumento non è possibile inserire una tabella che abbia più di $1 celle.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Con questo strumento non è possibile inserire una tabella che abbia più di 1000 celle.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Non hai indicato un numero valido di righe o di colonne.',
'wikieditor-toolbar-tool-table-zero' => 'Non puoi inserire una tabella senza righe e/o senza colonne.',
'wikieditor-toolbar-tool-replace' => 'Cerca e sostituisci',
@@ -13357,7 +13716,7 @@ $1:Esempio.jpg|Didascalia2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Sostituisci tutto',
'wikieditor-toolbar-tool-replace-close' => 'Chiudi',
'wikieditor-toolbar-tool-replace-nomatch' => 'La tua ricerca non ha prodotto risultati.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 sostituzione/i effettuata/e.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|sostituzione effettuata|sostituzioni effettuate}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Non hai indicato cosa cercare.',
'wikieditor-toolbar-tool-replace-invalidregex' => "L'espressione regolare immessa non è valida: $1",
'wikieditor-toolbar-section-characters' => 'Caratteri speciali',
@@ -13473,7 +13832,7 @@ $messages['ja'] = array(
'wikieditor-publish-button-publish' => '投稿',
'wikieditor-publish-button-cancel' => '中止',
'wikieditor-publish-dialog-title' => '{{SITENAME}} ã¸ã®æŠ•ç¨¿',
- 'wikieditor-publish-dialog-summary' => '編集内容ã®è¦ç´„(ã‚ãªãŸãŒè¡Œãªã£ãŸå¤‰æ›´ã‚’ç°¡æ½”ã«èª¬æ˜Žã—ã¦ãã ã•ã„):',
+ 'wikieditor-publish-dialog-summary' => '編集内容ã®è¦ç´„ (ã‚ãªãŸãŒè¡Œãªã£ãŸå¤‰æ›´ã‚’ç°¡æ½”ã«èª¬æ˜Žã—ã¦ãã ã•ã„):',
'wikieditor-publish-dialog-minor' => '細部ã®ç·¨é›†',
'wikieditor-publish-dialog-watch' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’ウォッãƒ',
'wikieditor-publish-dialog-publish' => '投稿',
@@ -13503,8 +13862,8 @@ $messages['ja'] = array(
'wikieditor-toolbar-tool-link' => 'リンク',
'wikieditor-toolbar-tool-link-title' => 'リンクã®æŒ¿å…¥',
'wikieditor-toolbar-tool-link-int' => 'ウィキページã¸',
- 'wikieditor-toolbar-tool-link-int-target' => 'ページå:',
- 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'ページåã‹ URL',
+ 'wikieditor-toolbar-tool-link-int-target' => 'ページã¾ãŸã¯ URL:',
+ 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'ページåã¾ãŸã¯ URL',
'wikieditor-toolbar-tool-link-int-text' => 'リンク文:',
'wikieditor-toolbar-tool-link-int-text-tooltip' => '表示ã™ã‚‹æ–‡å­—列を入力ã—ã¦ãã ã•ã„',
'wikieditor-toolbar-tool-link-ext' => '外部ã®ã‚¦ã‚§ãƒ–ページã¸',
@@ -13516,13 +13875,13 @@ $messages['ja'] = array(
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'ページã¯å­˜åœ¨ã—ã¾ã›ã‚“',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ページåã¨ã—ã¦ç„¡åŠ¹ã§ã™',
'wikieditor-toolbar-tool-link-int-target-status-external' => '外部リンク',
- 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'ページã®å­˜åœ¨ã‚’確èªä¸­â€¦',
+ 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'ページã®å­˜åœ¨ã‚’確èªä¸­...',
'wikieditor-toolbar-tool-link-int-invalid' => '指定ã—ãŸãƒšãƒ¼ã‚¸åã¯ç„¡åŠ¹ã§ã™ã€‚',
- 'wikieditor-toolbar-tool-link-lookslikeinternal' => '指定ã•ã‚ŒãŸ URL ã¯åˆ¥ã®ã‚¦ã‚£ã‚­ãƒšãƒ¼ã‚¸ã¸ã®ãƒªãƒ³ã‚¯ã®ã‚ˆã†ã§ã™ã€‚
-ã“れを内部リンクã«ã—ã¾ã™ã‹ï¼Ÿ',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => '指定ã—㟠URL ã¯åˆ¥ã®ã‚¦ã‚£ã‚­ãƒšãƒ¼ã‚¸ã¸ã®ãƒªãƒ³ã‚¯ã®ã‚ˆã†ã§ã™ã€‚
+ã“れを内部リンクã«ã—ã¾ã™ã‹?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => '内部リンク',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => '外部リンク',
- 'wikieditor-toolbar-tool-link-empty' => 'リンクã™ã¹ã入力ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã›ã‚“。',
+ 'wikieditor-toolbar-tool-link-empty' => 'リンク先ã¨ã—ã¦ä½•ã‚‚入力ã—ã¦ã„ã¾ã›ã‚“。',
'wikieditor-toolbar-tool-file' => '埋ã‚è¾¼ã¿ãƒ•ã‚¡ã‚¤ãƒ«',
'wikieditor-toolbar-tool-file-example' => '例.jpg',
'wikieditor-toolbar-tool-file-title' => 'ファイルã®æŒ¿å…¥',
@@ -13599,7 +13958,7 @@ $1:Example.jpg|キャプション2',
'wikieditor-toolbar-tool-table-preview' => 'プレビュー',
'wikieditor-toolbar-tool-table-insert' => '挿入',
'wikieditor-toolbar-tool-table-cancel' => '中止',
- 'wikieditor-toolbar-tool-table-toomany' => 'ã“ã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã§ã¯ã€$1個以上ã®ã‚»ãƒ«ãŒã‚る表ã¯æŒ¿å…¥ã§ãã¾ã›ã‚“。',
+ 'wikieditor-toolbar-tool-table-toomany' => 'ã“ã®ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã§ã¯ã€1000個以上ã®ã‚»ãƒ«ãŒã‚る表ã¯æŒ¿å…¥ã§ãã¾ã›ã‚“。',
'wikieditor-toolbar-tool-table-invalidnumber' => '入力ã—ãŸè¡Œæ•°ã¾ãŸã¯åˆ—æ•°ãŒæœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。',
'wikieditor-toolbar-tool-table-zero' => '行数ã¾ãŸã¯åˆ—æ•°ãŒ0ã®è¡¨ã¯æŒ¿å…¥ã§ãã¾ã›ã‚“。',
'wikieditor-toolbar-tool-replace' => '検索ã¨ç½®æ›',
@@ -13613,8 +13972,8 @@ $1:Example.jpg|キャプション2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'ã™ã¹ã¦ç½®æ›',
'wikieditor-toolbar-tool-replace-close' => 'é–‰ã˜ã‚‹',
'wikieditor-toolbar-tool-replace-nomatch' => '検索文字列ã«ä¸€è‡´ã™ã‚‹ã‚‚ã®ã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚',
- 'wikieditor-toolbar-tool-replace-success' => '$1回ã®ç½®æ›ãŒè¡Œã‚ã‚Œã¾ã—ãŸã€‚',
- 'wikieditor-toolbar-tool-replace-emptysearch' => '検索ã™ã‚‹ã‚‚ã®ãŒä½•ã‚‚入力ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|回置æ›}}ã•ã‚Œã¾ã—ãŸã€‚',
+ 'wikieditor-toolbar-tool-replace-emptysearch' => '検索ã™ã‚‹ã‚‚ã®ã‚’何も入力ã—ã¦ã„ã¾ã›ã‚“。',
'wikieditor-toolbar-tool-replace-invalidregex' => '入力ã•ã‚ŒãŸæ­£è¦è¡¨ç¾ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™: $1',
'wikieditor-toolbar-section-characters' => '特殊文字',
'wikieditor-toolbar-characters-page-latin' => 'ラテン文字',
@@ -13857,7 +14216,7 @@ $1:Conto.jpg|Katrangan2',
'wikieditor-toolbar-tool-table-preview' => 'Pratayang',
'wikieditor-toolbar-tool-table-insert' => 'Lebokaké',
'wikieditor-toolbar-tool-table-cancel' => 'Batal',
- 'wikieditor-toolbar-tool-table-toomany' => 'Nglebokaké tabèl mawa luwih saka $1 sèl ora dimungkinaké nganggo dialog iki.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Nglebokaké tabèl mawa luwih saka $1 sèl ora dimungkinaké nganggo dialog iki.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Sampéyan durung nglebokaké angka larik utawa kolom sing sah.',
'wikieditor-toolbar-tool-table-zero' => 'Sampéyan ora bisa nglebokaké tabèl kanthi larik utawa kolom kosong.',
'wikieditor-toolbar-tool-replace' => 'Golèk lan ganti',
@@ -13870,7 +14229,7 @@ $1:Conto.jpg|Katrangan2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Ganti kabèh',
'wikieditor-toolbar-tool-replace-close' => 'Tutup',
'wikieditor-toolbar-tool-replace-nomatch' => 'Panggolèkan Sampéyan ora cocok karo apa waé.',
- 'wikieditor-toolbar-tool-replace-success' => 'Nggawé $1 gantèn.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Nggawé $1 gantèn.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Sampéyan ora nglebokaké apa-apa kanggo digolèki.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Èkspresi biasa sing Sampéyan lebokaké ora sah: $1',
'wikieditor-toolbar-section-characters' => 'Karakter kusus',
@@ -14031,6 +14390,7 @@ $messages['ka'] = array(
'wikieditor-toolbar-file-target' => 'ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი:',
'wikieditor-toolbar-file-caption' => 'წáƒáƒ áƒ¬áƒ”რáƒ:',
'wikieditor-toolbar-file-size' => 'ზáƒáƒ›áƒ:',
+ 'wikieditor-toolbar-file-float' => 'გáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ:',
'wikieditor-toolbar-file-default' => '(სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜)',
'wikieditor-toolbar-file-format' => 'ფáƒáƒ áƒ›áƒáƒ¢áƒ˜:',
'wikieditor-toolbar-file-format-none' => 'áƒáƒ áƒ',
@@ -14075,7 +14435,7 @@ $messages['ka'] = array(
'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|áƒáƒ¦áƒ¬áƒ”რáƒ1
$1:Example.jpg|áƒáƒ¦áƒ¬áƒ”რáƒ2',
'wikieditor-toolbar-tool-newline' => 'áƒáƒ®áƒáƒšáƒ˜ ხáƒáƒ–ი',
- 'wikieditor-toolbar-tool-table' => 'ტáƒáƒ‘ულáƒ',
+ 'wikieditor-toolbar-tool-table' => 'ცხრილი',
'wikieditor-toolbar-tool-table-example-old' => '-
! სáƒáƒ®áƒ”ლი 1
! სáƒáƒ®áƒ”ლი 2
@@ -14100,7 +14460,7 @@ $1:Example.jpg|áƒáƒ¦áƒ¬áƒ”რáƒ2',
'wikieditor-toolbar-tool-table-preview' => 'წინáƒáƒ¡áƒ¬áƒáƒ ',
'wikieditor-toolbar-tool-table-insert' => 'ჩáƒáƒ¡áƒ›áƒ',
'wikieditor-toolbar-tool-table-cancel' => 'გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
- 'wikieditor-toolbar-tool-table-toomany' => 'ეს დიáƒáƒšáƒáƒ’ი ვერ შექმნის $1 უჯრედზე მეტი უჯრედის შემცვლელ ტáƒáƒ‘ულáƒáƒ¡',
+ 'wikieditor-toolbar-tool-table-toomany' => 'áƒáƒ› დიáƒáƒšáƒáƒ’ით 1000-ზე მეტი უჯრედის შემცვლელი ცხრილის ჩáƒáƒ¡áƒ›áƒ შეუძლებელიáƒ.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'თქვენ áƒáƒ  მიგითითებიáƒáƒ— ხáƒáƒ–ების áƒáƒœ სვეტების რáƒáƒáƒ“ენáƒáƒ‘áƒ',
'wikieditor-toolbar-tool-table-zero' => 'თქვენ ვერ ჩáƒáƒ¡áƒ•áƒáƒ•áƒ— ხáƒáƒ–ების áƒáƒœ სვეტების ნულáƒáƒ•áƒáƒœ რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ¡',
'wikieditor-toolbar-tool-replace' => 'ძებნრდრშეცვლáƒ',
@@ -14114,7 +14474,7 @@ $1:Example.jpg|áƒáƒ¦áƒ¬áƒ”რáƒ2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'შეცვáƒáƒšáƒ”თ ყველáƒáƒ¤áƒ”რი',
'wikieditor-toolbar-tool-replace-close' => 'დáƒáƒ®áƒ£áƒ áƒ•áƒ',
'wikieditor-toolbar-tool-replace-nomatch' => 'თქვენი მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ áƒáƒ áƒáƒ¤áƒ”რირნáƒáƒžáƒáƒ•áƒœáƒ˜',
- 'wikieditor-toolbar-tool-replace-success' => '$1 შეცვლრგáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდáƒ.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდრ{{PLURAL:$1|შეცვლáƒ|შეცვლáƒ}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'თქვენ áƒáƒ  მიუთითეთ სáƒáƒ«áƒ˜áƒ”ბელი.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'თქვენს მიერ შეტáƒáƒœáƒ˜áƒšáƒ˜ რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: $1',
'wikieditor-toolbar-section-characters' => 'სპეციáƒáƒšáƒ£áƒ áƒ˜ სიმბáƒáƒšáƒáƒ”ბი',
@@ -14137,6 +14497,9 @@ $1:Example.jpg|áƒáƒ¦áƒ¬áƒ”რáƒ2',
'wikieditor-toolbar-characters-page-thai' => 'ტáƒáƒ˜áƒšáƒáƒœáƒ“ური',
'wikieditor-toolbar-characters-page-lao' => 'ლáƒáƒáƒ¡áƒ£áƒ áƒ˜',
'wikieditor-toolbar-characters-page-khmer' => 'ქჰმერული',
+ 'wikieditor-toolbar-characters-endash' => 'ტირე',
+ 'wikieditor-toolbar-characters-emdash' => 'გრძელი ტირე',
+ 'wikieditor-toolbar-characters-minus' => 'მინუსის ნიშáƒáƒœáƒ˜',
'wikieditor-toolbar-section-help' => 'დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ',
'wikieditor-toolbar-help-heading-description' => 'áƒáƒ¦áƒ¬áƒ”რáƒ',
'wikieditor-toolbar-help-heading-syntax' => 'რáƒáƒ¡ ბეჭდáƒáƒ•áƒ—',
@@ -14333,7 +14696,7 @@ $1:Example.jpg|СипаттамаÑÑ‹2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Барлығын алмаÑтыру',
'wikieditor-toolbar-tool-replace-close' => 'Жабу',
'wikieditor-toolbar-tool-replace-nomatch' => 'Сіздің Ñұрауыңыз бойынша еш нәрÑе табылмады.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 алмаÑтыру жаÑалды.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 алмаÑтыру жаÑалды.', # Fuzzy
'wikieditor-toolbar-section-characters' => 'Ðрнайы таңбалар',
'wikieditor-toolbar-characters-page-latin' => 'Латын',
'wikieditor-toolbar-characters-page-symbols' => 'Белгілер',
@@ -14513,7 +14876,7 @@ $1:ឧទាហរណáŸ.jpg|ចំនងជើងក្រោមរូបភា
'wikieditor-toolbar-tool-replace-button-replaceall' => 'ជំនួសទាំងអស់',
'wikieditor-toolbar-tool-replace-close' => 'បិទ',
'wikieditor-toolbar-tool-replace-nomatch' => 'រកមិនឃើញអ្វីដែលអ្នកចង់រកទáŸáŸ”',
- 'wikieditor-toolbar-tool-replace-success' => 'បានធ្វើការជំនួសចំនួន $1។',
+ 'wikieditor-toolbar-tool-replace-success' => 'បានធ្វើការជំនួសចំនួន $1។', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'អ្នកមិនបានវាយបញ្ចូលពាក្យសំរាប់ស្វែងរកទáŸáŸ”',
'wikieditor-toolbar-section-characters' => 'ážáž½áž¢áž€áŸ’សរពិសáŸážŸáŸ—',
'wikieditor-toolbar-characters-page-latin' => 'អក្សរឡាážáž¶áŸ†áž„',
@@ -14630,13 +14993,14 @@ $messages['kn'] = array(
* @author IRTC1015
* @author Klutzy
* @author Kwj2772
+ * @author LFM
* @author Mintz0223
* @author ê´€ì¸ìƒëžµ
* @author ì•„ë¼
*/
$messages['ko'] = array(
'wikieditor' => 'í™•ìž¥ëœ ìœ„í‚¤í…스트 편집 ì¸í„°íŽ˜ì´ìŠ¤',
- 'wikieditor-desc' => 'í™•ìž¥ëœ ìœ„í‚¤ 문법 편집 ì¸í„°íŽ˜ì´ìŠ¤ì™€ 다양한 ê¸°ëŠ¥ì„ ì œê³µí•˜ëŠ” ëª¨ë“ˆì„ ì œê³µ',
+ 'wikieditor-desc' => 'í™•ìž¥ëœ ìœ„í‚¤ 문법 편집 ì¸í„°íŽ˜ì´ìŠ¤ì™€ 다양한 ê¸°ëŠ¥ì„ ì œê³µí•˜ëŠ” ëª¨ë“ˆì„ ì œê³µí•©ë‹ˆë‹¤',
'wikieditor-wikitext-tab' => '위키í…스트',
'wikieditor-loading' => '불러오는 중...',
'wikieditor-preview-preference' => '미리 보기 ë¹„êµ í™œì„±í™”',
@@ -14668,23 +15032,23 @@ $messages['ko'] = array(
'wikieditor-toolbar-preference' => 'ê¸°ëŠ¥ì´ í–¥ìƒëœ 편집 툴바 사용하기',
'wikieditor-toolbar-dialogs-preference' => 'ë§í¬ì™€ í‘œ ë“±ì„ ì‚½ìž…í•  ë•Œ 대화 ìƒìž 사용하기',
'wikieditor-toolbar-hidesig' => 'ì¼ë°˜ 문서 ì´ë¦„공간ì—ì„œ 서명 단추를 숨기기',
- 'wikieditor-toolbar-loading' => '불러오는 중…',
+ 'wikieditor-toolbar-loading' => '불러오는 중...',
'wikieditor-toolbar-tool-bold' => 'êµµì€ ê¸€ì”¨',
'wikieditor-toolbar-tool-bold-example' => 'êµµì€ ê¸€ì”¨',
'wikieditor-toolbar-tool-italic' => 'ê¸°ìš¸ì¸ ê¸€ì”¨',
'wikieditor-toolbar-tool-italic-example' => 'ê¸°ìš¸ì¸ ê¸€ì”¨',
- 'wikieditor-toolbar-tool-ilink' => '내부 ë§í¬',
+ 'wikieditor-toolbar-tool-ilink' => '안쪽 ë§í¬',
'wikieditor-toolbar-tool-ilink-example' => '문서 제목',
- 'wikieditor-toolbar-tool-xlink' => '바깥 ë§í¬ (주소 ì•žì— http://ê°€ 있어야 합니다.)',
+ 'wikieditor-toolbar-tool-xlink' => '바깥 ë§í¬ (주소 ì•žì— http://ê°€ 있어야 합니다)',
'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com ë§í¬ ì´ë¦„',
'wikieditor-toolbar-tool-link' => 'ë§í¬',
'wikieditor-toolbar-tool-link-title' => 'ë§í¬ 추가',
'wikieditor-toolbar-tool-link-int' => '위키 문서로 연결',
'wikieditor-toolbar-tool-link-int-target' => 'ëŒ€ìƒ ë¬¸ì„œ ë˜ëŠ” URL:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => '문서 제목 ë˜ëŠ” URL',
- 'wikieditor-toolbar-tool-link-int-text' => 'ë§í¬ í…스트:',
- 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'ë¬¸ì„œì— ë³´ì—¬ì§€ëŠ” 문장',
- 'wikieditor-toolbar-tool-link-ext' => '외부 웹 페ì´ì§€ë¡œ ì—°ê²°',
+ 'wikieditor-toolbar-tool-link-int-text' => 'ë§í¬ì— 보여지는 글:',
+ 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'ë¬¸ì„œì— ë³´ì—¬ì§€ëŠ” 글',
+ 'wikieditor-toolbar-tool-link-ext' => '바깥 웹 페ì´ì§€ë¡œ ì—°ê²°',
'wikieditor-toolbar-tool-link-ext-target' => 'ë§í¬ URL:',
'wikieditor-toolbar-tool-link-ext-text' => 'ë§í¬ í…스트:',
'wikieditor-toolbar-tool-link-insert' => 'ë§í¬ 추가하기',
@@ -14695,9 +15059,9 @@ $messages['ko'] = array(
'wikieditor-toolbar-tool-link-int-target-status-external' => '바깥 ë§í¬',
'wikieditor-toolbar-tool-link-int-target-status-loading' => '문서가 존재하는 지 í™•ì¸ ì¤‘...',
'wikieditor-toolbar-tool-link-int-invalid' => '입력한 ì œëª©ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤.',
- 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'ë‹¹ì‹ ì´ ìž…ë ¥í•œ URLì€ ë‹¤ë¥¸ 내부 ë¬¸ì„œì¼ ìˆ˜ 있습니다.
-내부 ë§í¬ë¡œ 바꾸겠습니까?',
- 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => '내부 ë§í¬',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => '입력한 URLì€ ë‹¤ë¥¸ 내부 ë¬¸ì„œì¼ ìˆ˜ 있습니다.
+안쪽 ë§í¬ë¡œ 바꾸겠습니까?',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => '안쪽 ë§í¬',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => '바깥 ë§í¬',
'wikieditor-toolbar-tool-link-empty' => 'ë§í¬í•  대ìƒì„ 입력하지 않았습니다.',
'wikieditor-toolbar-tool-file' => 'íŒŒì¼ ë„£ê¸°',
@@ -14712,7 +15076,7 @@ $messages['ko'] = array(
'wikieditor-toolbar-file-format-none' => 'ì—†ìŒ',
'wikieditor-toolbar-tool-file-insert' => '추가',
'wikieditor-toolbar-tool-file-cancel' => '취소',
- 'wikieditor-toolbar-tool-reference' => '출처',
+ 'wikieditor-toolbar-tool-reference' => '주ì„',
'wikieditor-toolbar-tool-reference-example' => 'ì—¬ê¸°ì— ì¶œì²˜ ë‚´ìš©ì„ ì ì–´ 주세요',
'wikieditor-toolbar-tool-reference-cancel' => '취소',
'wikieditor-toolbar-tool-reference-title' => 'ì£¼ì„ ì¶”ê°€',
@@ -14776,8 +15140,8 @@ $1:Example.jpg|설명2',
'wikieditor-toolbar-tool-table-preview' => '미리 보기',
'wikieditor-toolbar-tool-table-insert' => '추가',
'wikieditor-toolbar-tool-table-cancel' => '취소',
- 'wikieditor-toolbar-tool-table-toomany' => 'ì´ ê¸°ëŠ¥ì„ í†µí•´ì„œëŠ” $1ê°œ ì´ìƒì˜ ì…€ì„ ê°€ì§„ í‹€ì„ ì¶”ê°€í•  수 없습니다.',
- 'wikieditor-toolbar-tool-table-invalidnumber' => 'ë‹¹ì‹ ì€ í–‰ì´ë‚˜ ì—´ì˜ ê°œìˆ˜ë¥¼ 잘못 입력하였습니다.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'ì´ ê¸°ëŠ¥ì„ í†µí•´ì„œëŠ” 1000ê°œ ì´ìƒì˜ ì…€ì„ ê°€ì§„ í‹€ì„ ì¶”ê°€í•  수 없습니다.',
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'í–‰ì´ë‚˜ ì—´ì˜ ê°œìˆ˜ë¥¼ 잘못 입력하였습니다.',
'wikieditor-toolbar-tool-table-zero' => 'í–‰ì´ë‚˜ ì—´ì˜ ê°œìˆ˜ê°€ 0ì¸ í‘œë¥¼ 추가할 수 없습니다.',
'wikieditor-toolbar-tool-replace' => '찾아 바꾸기',
'wikieditor-toolbar-tool-replace-title' => '찾아 바꾸기',
@@ -14790,9 +15154,9 @@ $1:Example.jpg|설명2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'ëª¨ë‘ ë°”ê¾¸ê¸°',
'wikieditor-toolbar-tool-replace-close' => '닫기',
'wikieditor-toolbar-tool-replace-nomatch' => 'ì¼ì¹˜í•˜ëŠ” 문ìžì—´ì„ 찾지 못했습니다.',
- 'wikieditor-toolbar-tool-replace-success' => '문ìžì—´ì„ $1회 치환하였습니다.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1회 {{PLURAL:$1|바꿨습니다}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'ì°¾ì„ ë¬¸ìžì—´ì„ 입력하지 않았습니다.',
- 'wikieditor-toolbar-tool-replace-invalidregex' => 'ë‹¹ì‹ ì´ ìž…ë ¥í•œ ì •ê·œ 표현ì‹ì´ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤: $1',
+ 'wikieditor-toolbar-tool-replace-invalidregex' => '입력한 ì •ê·œ 표현ì‹ì´ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤: $1',
'wikieditor-toolbar-section-characters' => '특수 문ìž',
'wikieditor-toolbar-characters-page-latin' => 'ë¼í‹´ 문ìž',
'wikieditor-toolbar-characters-page-latinextended' => '확장 ë¼í‹´ 문ìž',
@@ -14825,7 +15189,7 @@ $1:Example.jpg|설명2',
'wikieditor-toolbar-help-page-heading' => '문단 제목',
'wikieditor-toolbar-help-page-list' => '목ë¡',
'wikieditor-toolbar-help-page-file' => '파ì¼',
- 'wikieditor-toolbar-help-page-reference' => '출처',
+ 'wikieditor-toolbar-help-page-reference' => '주ì„',
'wikieditor-toolbar-help-page-discussion' => '토론',
'wikieditor-toolbar-help-content-italic-description' => 'ê¸°ìš¸ì¸ ê¸€ì”¨',
'wikieditor-toolbar-help-content-italic-syntax' => "''ê¸°ìš¸ì¸ ê¸€ì”¨''",
@@ -14836,7 +15200,7 @@ $1:Example.jpg|설명2',
'wikieditor-toolbar-help-content-bolditalic-description' => '굵고 ê¸°ìš¸ì¸ ê¸€ì”¨',
'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''굵고 ê¸°ìš¸ì¸ ê¸€ì”¨'''''",
'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>굵고 ê¸°ìš¸ì¸ ê¸€ì”¨</em></strong>',
- 'wikieditor-toolbar-help-content-ilink-description' => '내부 ë§í¬',
+ 'wikieditor-toolbar-help-content-ilink-description' => '안쪽 ë§í¬',
'wikieditor-toolbar-help-content-ilink-syntax' => '[[문서 ì´ë¦„|다른 ì´ë¦„]]<br />[[문서 ì´ë¦„]]',
'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>다른 ì´ë¦„</a><br /><a href='#'>문서 ì´ë¦„</a>",
'wikieditor-toolbar-help-content-xlink-description' => '바깥 ë§í¬',
@@ -14863,7 +15227,7 @@ $1:Example.jpg|설명2',
'wikieditor-toolbar-help-content-file-description' => 'íŒŒì¼ ë„£ê¸°',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|그림 설명]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Caption text' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='실제 í¬ê¸°ë¡œ' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>그림 설명</div></div>",
- 'wikieditor-toolbar-help-content-reference-description' => '출처',
+ 'wikieditor-toolbar-help-content-reference-description' => '주ì„',
'wikieditor-toolbar-help-content-reference-syntax' => '문서 ë‚´ìš©.&lt;ref name="test"&gt;[http://www.example.org ë§í¬ 제목], 기타 설명.&lt;/ref&gt;',
'wikieditor-toolbar-help-content-reference-result' => "문서 내용.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-rereference-description' => 'ê¸°ì¡´ì— ë¶™ì¸ ì¶œì²˜ 재사용하기',
@@ -15010,7 +15374,7 @@ $1:Юлгю.jpg|Ðнгылатыу2',
'wikieditor-toolbar-tool-table-preview' => 'Ðл къарау',
'wikieditor-toolbar-tool-table-insert' => 'Сал',
'wikieditor-toolbar-tool-table-cancel' => 'Ызына алыу',
- 'wikieditor-toolbar-tool-table-toomany' => 'Бу диалог $1 кюбюрден кёб таблица Ñалыргъа къоймайды.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Бу диалог $1 кюбюрден кёб таблица Ñалыргъа къоймайды.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Тизгинлеем неда ёре тизгинлени Ñанларын тюз джазмагъанÑыз.',
'wikieditor-toolbar-tool-table-zero' => 'Тизгинлерини неда ёре тизгинлерини Ñаны нуль болгъан таблица Ñалынмайды.',
'wikieditor-toolbar-tool-replace' => 'Излеу бла алмашдырыу',
@@ -15023,7 +15387,7 @@ $1:Юлгю.jpg|Ðнгылатыу2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Барын да ауушдур',
'wikieditor-toolbar-tool-replace-close' => 'Джаб',
'wikieditor-toolbar-tool-replace-nomatch' => 'Сорууугъуз бла келишген ÑÑеб джокъду.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 ауушдуруу Ñтилгенди.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 ауушдуруу Ñтилгенди.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ðени излерге керек болгъанын белгилемегенÑиз.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Сиз джазгъан регулÑÑ€ выражение терÑди: $1',
'wikieditor-toolbar-section-characters' => 'Энчи Ñимволла',
@@ -15112,13 +15476,13 @@ $1:Юлгю.jpg|Ðнгылатыу2',
* @author Purodha
*/
$messages['ksh'] = array(
- 'wikieditor' => 'Fottjeschredde Eddiror för de WikiTäx',
- 'wikieditor-desc' => 'Brängk en Müjjeleschkeit för Wikitäx enzejävve un ze ändere en et Wiki, di mer ußboue kann, un noch allerhand Kröhmsches met dobei hät.',
+ 'wikieditor' => 'Fottjeschredde Eddiror för der WikiTäx',
+ 'wikieditor-desc' => 'Brängk en Möjjeleschkeit för Wikitäx enzejävve un ze ändere en et Wiki, di mer ußboue kann, un di noch allerhand Kröhmsches met dobei hät.',
'wikieditor-wikitext-tab' => 'Wikitäx',
- 'wikieditor-loading' => 'Am Lade',
+ 'wikieditor-loading' => 'Ben aam Laade&nbsp;&hellip;',
'wikieditor-preview-preference' => 'Donn de {{int:preview}} nevvedraan zohlohße',
'wikieditor-preview-tab' => '{{int:preview}}',
- 'wikieditor-preview-changes-tab' => 'Änderunge',
+ 'wikieditor-preview-changes-tab' => 'Änderonge',
'wikieditor-preview-loading' => 'Ben aam Laade{{int:ellipsis}}',
'wikieditor-previewDialog-preference' => 'Donn de Frooch noh ene Aansish vöraf aanschallde',
'wikieditor-previewDialog-tab' => '{{int:preview}}',
@@ -15145,7 +15509,7 @@ $messages['ksh'] = array(
'wikieditor-toolbar-preference' => 'Donn et ußföerlesh Werkzüsh för et Ändere aanzeije (bruch Java_Skripp)',
'wikieditor-toolbar-dialogs-preference' => 'Donn de Lengks aanzeije för Lengks, Tabälle, un mieh en Sigge em Wiki ennzefööje',
'wikieditor-toolbar-hidesig' => 'Donn dä Knopp för de „Ongerschreff“ nit aanzeije för nomaale Sigge vum Wiki singem Enhalld.',
- 'wikieditor-toolbar-loading' => 'Aam Laade{{int:ellipsis}}',
+ 'wikieditor-toolbar-loading' => 'Ben aam Laade{{int:ellipsis}}',
'wikieditor-toolbar-tool-bold' => 'Fätte Schreff',
'wikieditor-toolbar-tool-bold-example' => 'Fätte Schreff',
'wikieditor-toolbar-tool-italic' => 'Scheive Schreff',
@@ -15253,7 +15617,7 @@ $1:Beishpell.jpg|zweijte Beld-Täx',
'wikieditor-toolbar-tool-table-insert' => 'Lohß Jonn!',
'wikieditor-toolbar-tool-table-cancel' => 'Schloß! Ophüüre!',
'wikieditor-toolbar-tool-table-example-text' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut nec purus diam. Sed aliquam imperdiet nunc quis lacinia. Donec rutrum consectetur placerat. Sed volutpat neque non purus faucibus id ultricies enim euismod. Un der Öhl läuf küßde Postölling Ähzebülle wann Ühle de Sohd beije.',
- 'wikieditor-toolbar-tool-table-toomany' => 'En Tabäll met mieh wi $1 Pläz kann heh dat Projramm nit en dä Täx enboue.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'En Tabäll met mieh wi $1 Pläz kann heh dat Projramm nit en dä Täx enboue.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Do häs kein jöltije Zahl för de Reije udder de Schpallde enjejovve.',
'wikieditor-toolbar-tool-table-zero' => 'Do kanns kein Tabäll ennfööje, woh kein Schpallde udder kein Reije dren sin.',
'wikieditor-toolbar-tool-replace' => 'Söhke un Tuusche',
@@ -15261,15 +15625,15 @@ $1:Beishpell.jpg|zweijte Beld-Täx',
'wikieditor-toolbar-tool-replace-search' => 'Söhk noh:',
'wikieditor-toolbar-tool-replace-replace' => 'Tuusch dat uß jähje:',
'wikieditor-toolbar-tool-replace-case' => 'Jruß un klein Boochstaave ongerscheide',
- 'wikieditor-toolbar-tool-replace-regex' => '„{{int:Edittoolbar-tool-replace-search}}“ es en <i lang="en">regular expression</i>',
+ 'wikieditor-toolbar-tool-replace-regex' => 'Söhk noh enem rejolähre Ußdrok',
'wikieditor-toolbar-tool-replace-button-findnext' => 'Dä näxte fenge',
'wikieditor-toolbar-tool-replace-button-replace' => 'Ußtuusche',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Alle ußtuusche',
'wikieditor-toolbar-tool-replace-close' => 'Zohmaache',
'wikieditor-toolbar-tool-replace-nomatch' => 'Doh ham_mer nix jefonge.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 Mohl jet <!--{{PLURAL:$1|Eijmol|$1 Mohl jet|Nix}}--> jetuusch.',
+ 'wikieditor-toolbar-tool-replace-success' => '{{PLURAL:$1|Eijmol|$1 Mohl jät|Nix}} jetuusch.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Do häs nix aanjejovve, för donoh ze söhke.',
- 'wikieditor-toolbar-tool-replace-invalidregex' => 'Do häs en onjöltijje <i lang="en">regular expression</i> aanjejovve: $1',
+ 'wikieditor-toolbar-tool-replace-invalidregex' => 'Do häs ene onjöltijje rejolähre Ußdrok aanjejovve: $1',
'wikieditor-toolbar-section-characters' => 'Sönderzeijsche',
'wikieditor-toolbar-characters-page-latin' => 'Lateinesch',
'wikieditor-toolbar-characters-page-latinextended' => 'Lateinesch met Extras',
@@ -15469,33 +15833,34 @@ $messages['ku-latn'] = array(
);
/** Cornish (kernowek)
+ * @author Kernoweger
* @author Kw-Moon
* @author Nrowe
*/
$messages['kw'] = array(
'wikieditor-wikitext-tab' => 'Wikitext',
- 'wikieditor-loading' => 'Ow karga...',
+ 'wikieditor-loading' => 'Ow carga...',
'wikieditor-preview-tab' => 'Ragweles',
'wikieditor-preview-changes-tab' => 'Chanjyow',
- 'wikieditor-preview-loading' => 'Ow karga...',
+ 'wikieditor-preview-loading' => 'Ow carga...',
'wikieditor-previewDialog-tab' => 'Ragwel',
- 'wikieditor-previewDialog-loading' => 'Ow karga...',
+ 'wikieditor-previewDialog-loading' => 'Ow carga...',
'wikieditor-publish-button-publish' => 'Dyllo',
- 'wikieditor-publish-button-cancel' => 'Hedhi',
+ 'wikieditor-publish-button-cancel' => 'Hedhy',
'wikieditor-publish-dialog-title' => 'Dyllo war {{SITENAME}}',
'wikieditor-publish-dialog-minor' => 'Chanj bian',
'wikieditor-publish-dialog-watch' => 'Golyas an folen-ma',
'wikieditor-publish-dialog-publish' => 'Dyllo',
- 'wikieditor-template-editor-dialog-submit' => 'Nowedha',
- 'wikieditor-template-editor-dialog-cancel' => 'Hedhi',
+ 'wikieditor-template-editor-dialog-submit' => 'Nowedhy',
+ 'wikieditor-template-editor-dialog-cancel' => 'Hedhy',
'wikieditor-toolbar' => 'Toulvar chanjya',
'wikieditor-toolbar-desc' => 'Toulvar folen chanjya gans devnydh gwellhes',
- 'wikieditor-toolbar-preference' => 'Galosegi an toulvar chanjya gwellhes',
- 'wikieditor-toolbar-loading' => 'Ow karga...',
+ 'wikieditor-toolbar-preference' => 'Galosegy an toulvar chanjya gwellhes',
+ 'wikieditor-toolbar-loading' => 'Ow carga...',
'wikieditor-toolbar-tool-bold' => 'Tew',
- 'wikieditor-toolbar-tool-bold-example' => 'Tekst tew',
+ 'wikieditor-toolbar-tool-bold-example' => 'Text tew',
'wikieditor-toolbar-tool-italic' => 'Italek',
- 'wikieditor-toolbar-tool-italic-example' => 'Tekst italek',
+ 'wikieditor-toolbar-tool-italic-example' => 'Text italek',
'wikieditor-toolbar-tool-ilink' => 'Kevren bervedhel',
'wikieditor-toolbar-tool-ilink-example' => 'Titel an gevren',
'wikieditor-toolbar-tool-xlink' => 'Kevren a-ves (na ankevowgh an rager http://)',
@@ -15505,67 +15870,71 @@ $messages['kw'] = array(
'wikieditor-toolbar-tool-link-int' => 'War-tu folen wiki',
'wikieditor-toolbar-tool-link-int-target' => 'Folen po URL kosten:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Titel po URL an folen:',
- 'wikieditor-toolbar-tool-link-int-text' => 'Tekst rag diskwedhes:',
- 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Tekst dhe vos diskwedhys',
+ 'wikieditor-toolbar-tool-link-int-text' => 'Text rag disqwedhes:',
+ 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Text dhe vos disqwedhys',
'wikieditor-toolbar-tool-link-ext' => 'War-tu folen wias a-ves',
'wikieditor-toolbar-tool-link-ext-target' => 'URL an gevren:',
'wikieditor-toolbar-tool-link-ext-text' => 'Text an gevren:',
'wikieditor-toolbar-tool-link-insert' => 'Keworra kevren',
- 'wikieditor-toolbar-tool-link-cancel' => 'Hedhi',
+ 'wikieditor-toolbar-tool-link-cancel' => 'Hedhy',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Titel drog',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Kevren a-ves',
'wikieditor-toolbar-tool-link-int-invalid' => 'Drog yw an titel res genowgh.',
- 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Yth hevel uji an URL res genowgh ow kevredna dhe folen wiki aral.
-Eus hwans dhewgh y dreylya dhe gevren bervedhel?',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Yth hevel bos an URL res genowgh ow kevrenna dhe folen wiki aral.
+Eus whans dhywgh y dreylya dhe gevren bervedhel?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Kevren bervedhel',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Kevren a-ves',
- 'wikieditor-toolbar-tool-link-empty' => 'Ny wrussowgh hwi entra tra vedh dhe gevredna dhodho.',
+ 'wikieditor-toolbar-tool-link-empty' => 'Ny wrussowgh why entra tra vedh dhe gevrenna dhodho.',
'wikieditor-toolbar-tool-file' => 'Restren neythys',
'wikieditor-toolbar-tool-file-example' => 'Ensampel.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'Keworra restren',
+ 'wikieditor-toolbar-file-target' => 'Hanow an restren:',
+ 'wikieditor-toolbar-file-size' => 'Mens:',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Hedhy',
'wikieditor-toolbar-tool-reference' => 'Devyn',
- 'wikieditor-toolbar-tool-reference-example' => 'Entrowgh tekst an drosnoten obma',
- 'wikieditor-toolbar-tool-reference-cancel' => 'Hedhi',
+ 'wikieditor-toolbar-tool-reference-example' => 'Entrowgh text an drosnoten omma',
+ 'wikieditor-toolbar-tool-reference-cancel' => 'Hedhy',
'wikieditor-toolbar-tool-reference-title' => 'Keworra devyn',
'wikieditor-toolbar-tool-reference-insert' => 'Keworra',
- 'wikieditor-toolbar-tool-reference-text' => 'Tekst an devyn',
+ 'wikieditor-toolbar-tool-reference-text' => 'Text an devyn',
'wikieditor-toolbar-tool-signature' => 'Sinans ha dedhyans',
- 'wikieditor-toolbar-section-advanced' => 'Avoncys',
+ 'wikieditor-toolbar-section-advanced' => 'Avonsys',
'wikieditor-toolbar-tool-heading' => 'Titel',
'wikieditor-toolbar-tool-heading-1' => 'Nivel 1',
'wikieditor-toolbar-tool-heading-2' => 'Nivel 2',
'wikieditor-toolbar-tool-heading-3' => 'Nivel 3',
'wikieditor-toolbar-tool-heading-4' => 'Nivel 4',
'wikieditor-toolbar-tool-heading-5' => 'Nivel 5',
- 'wikieditor-toolbar-tool-heading-example' => 'Tekst an titel',
+ 'wikieditor-toolbar-tool-heading-example' => 'Text an titel',
'wikieditor-toolbar-group-format' => 'Furvyans',
'wikieditor-toolbar-tool-ulist' => 'Rol bulettys',
'wikieditor-toolbar-tool-ulist-example' => "Elven a'n rol bulettys",
'wikieditor-toolbar-tool-olist' => 'Rol niverys',
'wikieditor-toolbar-tool-olist-example' => "Elven a'n rol niverys",
- 'wikieditor-toolbar-tool-indent' => 'Krybans',
+ 'wikieditor-toolbar-tool-indent' => 'Crybans',
'wikieditor-toolbar-tool-indent-example' => 'Linen grybys',
'wikieditor-toolbar-tool-nowiki' => 'Heb furvyans wiki',
- 'wikieditor-toolbar-tool-nowiki-example' => 'Keworrowgh tekst heb furvyans obma',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'Keworrowgh text heb furvyans omma',
'wikieditor-toolbar-tool-redirect' => 'Daswedyans',
'wikieditor-toolbar-tool-redirect-example' => 'Hanow an folen gosten',
'wikieditor-toolbar-tool-big' => 'Bras',
- 'wikieditor-toolbar-tool-big-example' => 'Tekst bras',
+ 'wikieditor-toolbar-tool-big-example' => 'Text bras',
'wikieditor-toolbar-tool-small' => 'Bian',
- 'wikieditor-toolbar-tool-small-example' => 'Tekst bian',
- 'wikieditor-toolbar-tool-superscript' => 'Gorskrif',
- 'wikieditor-toolbar-tool-superscript-example' => 'Tekst gorskrif',
- 'wikieditor-toolbar-tool-subscript' => 'Isskrif',
- 'wikieditor-toolbar-tool-subscript-example' => 'Tekst isskrif',
+ 'wikieditor-toolbar-tool-small-example' => 'Text bian',
+ 'wikieditor-toolbar-tool-superscript' => 'Gorscrif',
+ 'wikieditor-toolbar-tool-superscript-example' => 'Tekst gorscrif',
+ 'wikieditor-toolbar-tool-subscript' => 'Isscrif',
+ 'wikieditor-toolbar-tool-subscript-example' => 'Text isscrif',
'wikieditor-toolbar-group-insert' => 'Keworra',
'wikieditor-toolbar-tool-gallery' => 'Mirva imajys',
- 'wikieditor-toolbar-tool-gallery-example' => '$1:Ensampel.jpg|Deskrifans1
-$1:Ensampel.jpg|Deskrifans2',
- 'wikieditor-toolbar-tool-newline' => 'Linen nowyth',
+ 'wikieditor-toolbar-tool-gallery-example' => '$1:Ensampel.jpg|Descrifans1
+$1:Ensampel.jpg|Descrifans2',
+ 'wikieditor-toolbar-tool-newline' => 'Linen noweth',
'wikieditor-toolbar-tool-table' => 'Tabel',
'wikieditor-toolbar-tool-table-example-old' => '-
-! pednlinen 1
-! pednlinen 2
-! pednlinen 3
+! pennlinen 1
+! pennlinen 2
+! pennlinen 3
|-
| rew 1, kellik 1
| rew 1, kellik 2
@@ -15575,35 +15944,36 @@ $1:Ensampel.jpg|Deskrifans2',
| rew 2, kellik 2
| rew 2, kellik 3',
'wikieditor-toolbar-tool-table-example-cell-text' => 'Text an kellik',
- 'wikieditor-toolbar-tool-table-example-header' => 'Text an bednlinen',
+ 'wikieditor-toolbar-tool-table-example-header' => 'Text an bennlinen',
'wikieditor-toolbar-tool-table-title' => 'Gorra tabel a-bervedh',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'Rewyow',
- 'wikieditor-toolbar-tool-table-dimensions-columns' => 'Kolovednow',
- 'wikieditor-toolbar-tool-table-dimensions-header' => 'Keworra rew pednlinen',
+ 'wikieditor-toolbar-tool-table-dimensions-columns' => 'Colovennow',
+ 'wikieditor-toolbar-tool-table-dimensions-header' => 'Keworra rew pennlinen',
'wikieditor-toolbar-tool-table-wikitable' => 'Keworra emlow',
'wikieditor-toolbar-tool-table-sortable' => 'Gwul sortyadow an tabel',
'wikieditor-toolbar-tool-table-example' => 'Ensampel',
'wikieditor-toolbar-tool-table-preview' => 'Ragwel',
'wikieditor-toolbar-tool-table-insert' => 'Keworra',
- 'wikieditor-toolbar-tool-table-cancel' => 'Hedhi',
- 'wikieditor-toolbar-tool-table-invalidnumber' => 'Nyns eus entrys genowgh niver da a rewyow po kolovednow.',
- 'wikieditor-toolbar-tool-table-zero' => 'Ny ellowgh hwi gorra a-bervedh tabel heb rew po koloven.',
- 'wikieditor-toolbar-tool-replace' => 'Hwilas ha kemeres le',
- 'wikieditor-toolbar-tool-replace-title' => 'Hwilas ha kemeres le',
- 'wikieditor-toolbar-tool-replace-search' => 'Hwilas:',
+ 'wikieditor-toolbar-tool-table-cancel' => 'Hedhy',
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'Nyns eus entrys genowgh niver da a rewyow po colovennow.',
+ 'wikieditor-toolbar-tool-table-zero' => 'Ny yllowgh why gorra a-bervedh tabel heb rew po coloven.',
+ 'wikieditor-toolbar-tool-replace' => 'Whilas ha kemeres le',
+ 'wikieditor-toolbar-tool-replace-title' => 'Whilas ha kemeres le',
+ 'wikieditor-toolbar-tool-replace-search' => 'Whilas:',
'wikieditor-toolbar-tool-replace-replace' => 'Kemeres le gans:',
- 'wikieditor-toolbar-tool-replace-button-findnext' => 'Kavos an nessa',
+ 'wikieditor-toolbar-tool-replace-button-findnext' => 'Cavos an nessa',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Kemeres le pub tra',
'wikieditor-toolbar-tool-replace-close' => 'Degea',
- 'wikieditor-toolbar-tool-replace-nomatch' => 'Ny wrug agas hwilans machya tra veth.',
- 'wikieditor-toolbar-tool-replace-emptysearch' => 'Ny wrussowgh hwi entra tra veth dhe hwilas.',
- 'wikieditor-toolbar-section-characters' => 'Nosow arbednek',
+ 'wikieditor-toolbar-tool-replace-nomatch' => 'Ny wrug agas whilans machya tra veth.',
+ 'wikieditor-toolbar-tool-replace-emptysearch' => 'Ny wrussowgh why entra tra veth dhe whilas.',
+ 'wikieditor-toolbar-section-characters' => 'Lytherennow arbennek',
'wikieditor-toolbar-characters-page-latin' => 'Latin',
- 'wikieditor-toolbar-characters-page-latinextended' => 'Latin ystydnys',
+ 'wikieditor-toolbar-characters-page-latinextended' => 'Latin ystynnys',
'wikieditor-toolbar-characters-page-ipa' => 'LFK (IPA)',
'wikieditor-toolbar-characters-page-symbols' => 'Arwodhyow',
- 'wikieditor-toolbar-characters-page-greek' => 'Greka',
+ 'wikieditor-toolbar-characters-page-greek' => 'Greca',
'wikieditor-toolbar-characters-page-arabic' => 'Arabek',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Arabek ystynnys',
'wikieditor-toolbar-characters-page-persian' => 'Persek',
'wikieditor-toolbar-characters-page-hebrew' => 'Ebrow',
'wikieditor-toolbar-characters-page-bangla' => 'Bengalek',
@@ -15614,42 +15984,42 @@ $1:Ensampel.jpg|Deskrifans2',
'wikieditor-toolbar-characters-page-lao' => 'Laosek',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
'wikieditor-toolbar-section-help' => 'Gweres',
- 'wikieditor-toolbar-help-heading-description' => 'Deskrifans',
- 'wikieditor-toolbar-help-heading-syntax' => 'An peth a skrifowgh',
+ 'wikieditor-toolbar-help-heading-description' => 'Descrifans',
+ 'wikieditor-toolbar-help-heading-syntax' => 'An peth yw scrifys',
'wikieditor-toolbar-help-heading-result' => 'An sewyans',
'wikieditor-toolbar-help-page-format' => 'Furvyans',
- 'wikieditor-toolbar-help-page-link' => 'Kevrednow',
+ 'wikieditor-toolbar-help-page-link' => 'Kevrennow',
'wikieditor-toolbar-help-page-heading' => 'Titlys',
'wikieditor-toolbar-help-page-list' => 'Rolyow',
- 'wikieditor-toolbar-help-page-file' => 'Restrednow',
- 'wikieditor-toolbar-help-page-reference' => 'Devydnow',
- 'wikieditor-toolbar-help-page-discussion' => 'Keskows',
+ 'wikieditor-toolbar-help-page-file' => 'Restrennow',
+ 'wikieditor-toolbar-help-page-reference' => 'Devynnow',
+ 'wikieditor-toolbar-help-page-discussion' => 'Kescows',
'wikieditor-toolbar-help-content-italic-description' => 'Italek',
- 'wikieditor-toolbar-help-content-italic-syntax' => "''Tekst italek''",
- 'wikieditor-toolbar-help-content-italic-result' => '<em>Tekst italek</em>',
+ 'wikieditor-toolbar-help-content-italic-syntax' => "''Text italek''",
+ 'wikieditor-toolbar-help-content-italic-result' => '<em>Text italek</em>',
'wikieditor-toolbar-help-content-bold-description' => 'Tew',
- 'wikieditor-toolbar-help-content-bold-syntax' => "'''Tekst tew'''",
- 'wikieditor-toolbar-help-content-bold-result' => '<strong>Tekst tew</strong>',
+ 'wikieditor-toolbar-help-content-bold-syntax' => "'''Text tew'''",
+ 'wikieditor-toolbar-help-content-bold-result' => '<strong>Text tew</strong>',
'wikieditor-toolbar-help-content-bolditalic-description' => 'Tew &amp; italek',
- 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Tekst tew &amp; italek'''''",
- 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Tekst tew &amp; italek</em></strong>',
+ 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Text tew &amp; italek'''''",
+ 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Text tew &amp; italek</em></strong>',
'wikieditor-toolbar-help-content-ilink-description' => 'Kevren bervedhel',
'wikieditor-toolbar-help-content-ilink-syntax' => '[[Titel an folen|Text an gevren]]<br />[[Titel an folen]]',
- 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Tekst an gevren</a><br /><a href='#'>Titel an folen</a>",
+ 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Text an gevren</a><br /><a href='#'>Titel an folen</a>",
'wikieditor-toolbar-help-content-xlink-description' => 'Kevren bervedhel',
- 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.ensampel.org Tekst an gevren]<br />[http://www.ensampel.org]<br />http://www.ensampel.org',
- 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Tekst an gevren</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.ensampel.org</a>",
+ 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.ensampel.org Text an gevren]<br />[http://www.ensampel.org]<br />http://www.ensampel.org',
+ 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Text an gevren</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.ensampel.org</a>",
'wikieditor-toolbar-help-content-heading2-description' => 'Titel nivel 2',
- 'wikieditor-toolbar-help-content-heading2-syntax' => '== Tekst an titel ==',
+ 'wikieditor-toolbar-help-content-heading2-syntax' => '== Text an titel ==',
'wikieditor-toolbar-help-content-heading2-result' => '<h2>Text an titel</h2>',
'wikieditor-toolbar-help-content-heading3-description' => 'Titel nivel 3',
- 'wikieditor-toolbar-help-content-heading3-syntax' => '=== Tekst an titel ===',
- 'wikieditor-toolbar-help-content-heading3-result' => '<h3>Tekst an titel</h3>',
+ 'wikieditor-toolbar-help-content-heading3-syntax' => '=== Text an titel ===',
+ 'wikieditor-toolbar-help-content-heading3-result' => '<h3>Text an titel</h3>',
'wikieditor-toolbar-help-content-heading4-description' => 'Titel nivel 4',
- 'wikieditor-toolbar-help-content-heading4-syntax' => '==== Tekst an titel ====',
+ 'wikieditor-toolbar-help-content-heading4-syntax' => '==== Text an titel ====',
'wikieditor-toolbar-help-content-heading4-result' => '<h4>Text an titel</h4>',
'wikieditor-toolbar-help-content-heading5-description' => 'Titel nivel 5',
- 'wikieditor-toolbar-help-content-heading5-syntax' => '===== Tekst an titel =====',
+ 'wikieditor-toolbar-help-content-heading5-syntax' => '===== Text an titel =====',
'wikieditor-toolbar-help-content-heading5-result' => '<h5>Text an titel</h5>',
'wikieditor-toolbar-help-content-ulist-description' => 'Rol bulettys',
'wikieditor-toolbar-help-content-ulist-syntax' => "* Elven a'n rol<br />* Elven a'n rol",
@@ -15658,22 +16028,22 @@ $1:Ensampel.jpg|Deskrifans2',
'wikieditor-toolbar-help-content-olist-syntax' => "# Elven a'n rol<br /># Elven a'n rol",
'wikieditor-toolbar-help-content-olist-result' => "<ol><li>Elven a'n rol</li><li>Elven a'n rol</li></ol>",
'wikieditor-toolbar-help-content-file-description' => 'Restren neythys',
- 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Ensampel.png|thumb|Tekst an deskrifans]]',
- 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Tekst an deskrifans' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Brashe' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Tekst an deskrifans</div></div>",
+ 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Ensampel.png|thumb|Text an descrifans]]',
+ 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Text an descrifans' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Brashe' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Text an descrifans</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'Devyn',
- 'wikieditor-toolbar-help-content-reference-syntax' => 'Tekst an folen.&lt;ref name="test"&gt;[http://www.ensampel.org Tekst an gevren], tekst keworansel.&lt;/ref&gt;',
- 'wikieditor-toolbar-help-content-reference-result' => "Tekst an folen.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'Text an folen.&lt;ref name="test"&gt;[http://www.ensampel.org Text an gevren], text keworansel.&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-reference-result' => "Text an folen.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-rereference-description' => "Devnydh keworansel a'n keth devyn",
- 'wikieditor-toolbar-help-content-rereference-result' => "Tekst an folen.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-showreferences-description' => 'Diskwedhes devydnow',
- 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.ensampel.org' class='external text' href='#'>Tekst an gevren</a>, tekst keworansel.</li></ol>",
+ 'wikieditor-toolbar-help-content-rereference-result' => "Text an folen.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-showreferences-description' => 'Disqwedhes devynnow',
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.ensampel.org' class='external text' href='#'>Text an gevren</a>, text keworansel.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Sinans gans an dedhyans',
- 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Hanow usyer</a> (<a href='#' title='{{#special:mytalk}}'>keskows</a>) 15:54, 10 Metheven 2009 (UTC)",
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Hanow usyer</a> (<a href='#' title='{{#special:mytalk}}'>kescows</a>) 15:54, 10 Metheven 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Sinans',
- 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Hanow usyer</a> (<a href='#' title='{{#special:mytalk}}'>keskows</a>)",
- 'wikieditor-toolbar-help-content-indent-description' => 'Kryba',
- 'wikieditor-toolbar-help-content-indent-syntax' => 'Tekst usadow<br />:Text krybys<br />::Text krybys',
- 'wikieditor-toolbar-help-content-indent-result' => 'Tekst usadow<dl><dd>Tekst krybys<dl><dd>Tekst krybys</dd></dl></dd></dl>',
+ 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Hanow usyer</a> (<a href='#' title='{{#special:mytalk}}'>kescows</a>)",
+ 'wikieditor-toolbar-help-content-indent-description' => 'Cryba',
+ 'wikieditor-toolbar-help-content-indent-syntax' => 'Text usadow<br />:Text crybys<br />::Text crybys',
+ 'wikieditor-toolbar-help-content-indent-result' => 'Text usadow<dl><dd>Text crybys<dl><dd>Text crybys</dd></dl></dd></dl>',
);
/** Kirghiz (Кыргызча)
@@ -15737,7 +16107,7 @@ $1:Example.jpg|БаÑндама2',
'wikieditor-toolbar-tool-table-preview' => 'Ðлдын ала көргөз',
'wikieditor-toolbar-tool-table-insert' => 'Киргиз',
'wikieditor-toolbar-tool-table-cancel' => 'Жокко чыгар',
- 'wikieditor-toolbar-tool-table-toomany' => 'Бул баарлашууда $1 ашык көзөнөгү бар жадыбал койгонго мүмкүн ÑмеÑ.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Бул баарлашууда $1 ашык көзөнөгү бар жадыбал койгонго мүмкүн ÑмеÑ.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Сиз Ñаптардын же тилкелердин туура ÑÐ¼ÐµÑ Ñанын көргөздүңүз',
'wikieditor-toolbar-tool-table-zero' => 'Сиз бир дагы Ñабы же тилкеÑи жок жадыбал киргизе албайÑыз',
'wikieditor-toolbar-tool-replace' => 'Таап алмаштыр',
@@ -15751,7 +16121,7 @@ $1:Example.jpg|БаÑндама2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Баарын алмаштыр',
'wikieditor-toolbar-tool-replace-close' => 'Жап',
'wikieditor-toolbar-tool-replace-nomatch' => 'Сиздин талап боюнча Ñчтеке табылган жок',
- 'wikieditor-toolbar-tool-replace-success' => '$1 алмаштыруу болду.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 алмаштыруу болду.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Сиз издегенге Ñч нерÑе көргөзгөн жокÑуз.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Сиз киргизген регулÑрдуу айтылыш туура ÑмеÑ: $1',
'wikieditor-toolbar-section-characters' => 'Ðтайын белгилер',
@@ -16001,6 +16371,7 @@ $messages['lb'] = array(
'wikieditor-toolbar-tool-file-title' => 'Fichier drasetzen',
'wikieditor-toolbar-file-target' => 'Numm vum Fichier:',
'wikieditor-toolbar-file-size' => 'Gréisst:',
+ 'wikieditor-toolbar-file-float' => 'Ausriichtung:',
'wikieditor-toolbar-file-default' => '(Standard)',
'wikieditor-toolbar-file-format' => 'Format:',
'wikieditor-toolbar-file-format-none' => 'keen',
@@ -16070,7 +16441,7 @@ $1:Example.jpg|Beschreiwung2',
'wikieditor-toolbar-tool-table-preview' => 'Kucken ouni ze späicheren',
'wikieditor-toolbar-tool-table-insert' => 'Drasetzen',
'wikieditor-toolbar-tool-table-cancel' => 'Ofbriechen',
- 'wikieditor-toolbar-tool-table-toomany' => 'Et ass net méiglech méi wéi $1 Zelle mat dësem Dialog dranzesetzen',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Et ass net méiglech eng Tabell mat méi wéi 1000 Zelle mat dësem Dialog dranzesetzen.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Dir hutt keng valabel Zuel vu Reien oder Kolonnen aginn.',
'wikieditor-toolbar-tool-table-zero' => 'Dir kënnt Tabell mat null Reien a Kolonnen drasetzen.',
'wikieditor-toolbar-tool-replace' => 'Sichen an ersetzen',
@@ -16084,7 +16455,7 @@ $1:Example.jpg|Beschreiwung2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Alles ersetzen',
'wikieditor-toolbar-tool-replace-close' => 'Zoumaachen',
'wikieditor-toolbar-tool-replace-nomatch' => 'Beim Siche gouf näischt fonnt.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 mol ersat.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|mol}} ersat.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Dir hutt näisch aginn nodeem Dir siche wëllt.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'De regulären Ausdrock deen Dir aginn hutt ass net valabel: $1',
'wikieditor-toolbar-section-characters' => 'Spezialzeechen',
@@ -16107,6 +16478,7 @@ $1:Example.jpg|Beschreiwung2',
'wikieditor-toolbar-characters-page-thai' => 'Thai',
'wikieditor-toolbar-characters-page-lao' => 'Lao',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-characters-minus' => 'Minus-Zeechen',
'wikieditor-toolbar-section-help' => 'Hëllef',
'wikieditor-toolbar-help-heading-description' => 'Beschreiwung',
'wikieditor-toolbar-help-heading-syntax' => 'Wat Dir antippt',
@@ -16325,7 +16697,7 @@ $1:Veurbeildj2|Biesjrif2',
'wikieditor-toolbar-tool-table-preview' => 'Betrach',
'wikieditor-toolbar-tool-table-insert' => 'Voog in',
'wikieditor-toolbar-tool-table-cancel' => 'Braek aaf',
- 'wikieditor-toolbar-tool-table-toomany' => "'t Invoge van 'n tabel mit mieër es $1 celle kèn neet via dit venster.",
+ 'wikieditor-toolbar-tool-table-toomany' => "'t Invoge van 'n tabel mit mieër es $1 celle kèn neet via dit venster.", # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => "Doe höbs 'n óngeljig aantal regels of kolomme ópgegaeve.",
'wikieditor-toolbar-tool-table-zero' => 'Doe kins gein tabel invoge zónger regels of kolomme.',
'wikieditor-toolbar-tool-replace' => 'Zeuk en vervang',
@@ -16339,7 +16711,7 @@ $1:Veurbeildj2|Biesjrif2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Vervang alles',
'wikieditor-toolbar-tool-replace-close' => 'Sloet',
'wikieditor-toolbar-tool-replace-nomatch' => 'Dien zeukopdrach haet gein rizzeltaote gegaeve.',
- 'wikieditor-toolbar-tool-replace-success' => "d'r Zeen $1 deil vervange.",
+ 'wikieditor-toolbar-tool-replace-success' => "d'r Zeen $1 deil vervange.", # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Doe höbs gein zeukterme opgegaeve.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'De door dich ingegaeve regulier oetdrokkig is valsj: $1',
'wikieditor-toolbar-section-characters' => 'Speciaal teikes',
@@ -16571,7 +16943,7 @@ $1:Pavyzdys.jpg|Aprašymas2',
'wikieditor-toolbar-tool-table-preview' => 'Peržiūra',
'wikieditor-toolbar-tool-table-insert' => 'Įterpti',
'wikieditor-toolbar-tool-table-cancel' => 'Atšaukti',
- 'wikieditor-toolbar-tool-table-toomany' => 'Įterpti lentelę su daugiau nei $1 langelių šiame lange negalima.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Įterpti lentelę su daugiau nei $1 langelių šiame lange negalima.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'JÅ«s neįvedÄ—te leistino skaiÄiaus eiluÄių ar stulpelių.',
'wikieditor-toolbar-tool-table-zero' => 'JÅ«s negalite įterpti lentelÄ—s su nuliu eiluÄių ar stulpelių.',
'wikieditor-toolbar-tool-replace' => 'Ieškoti ir pakeisti',
@@ -16585,7 +16957,7 @@ $1:Pavyzdys.jpg|Aprašymas2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Pakeisti visus',
'wikieditor-toolbar-tool-replace-close' => 'Uždaryti',
'wikieditor-toolbar-tool-replace-nomatch' => 'Jūsų paieška nieko nerado.',
- 'wikieditor-toolbar-tool-replace-success' => 'Atlikta $1 pakeitimas (-ų).',
+ 'wikieditor-toolbar-tool-replace-success' => 'Atlikta $1 pakeitimas (-ų).', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Jūs neįvedėte nieko ieškoti.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Reguliarioji išraiška, kurią įvedėte, yra neleistina: $1',
'wikieditor-toolbar-section-characters' => 'Specialieji simboliai',
@@ -16794,7 +17166,7 @@ $1:Entirna.jpg|Sawifiahna2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'A vaiin thlâk rawh',
'wikieditor-toolbar-tool-replace-close' => 'Kharna',
'wikieditor-toolbar-tool-replace-nomatch' => 'I thil zawnin milpui a nei lo',
- 'wikieditor-toolbar-tool-replace-success' => 'Vawi $1 thlâk a ni.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Vawi $1 thlâk a ni.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Zawn tùr i ziak miah lo.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'I thu ziah a dik lo: $1',
'wikieditor-toolbar-section-characters' => 'Hawrawp bîkte',
@@ -17006,7 +17378,7 @@ $1:Example.jpg|Apraksts2',
'wikieditor-toolbar-tool-table-preview' => 'Pirmskats',
'wikieditor-toolbar-tool-table-insert' => 'Ievietot',
'wikieditor-toolbar-tool-table-cancel' => 'Atcelt',
- 'wikieditor-toolbar-tool-table-toomany' => 'Ar Å¡Ä« dialoga loga palÄ«dzÄ«bu nav iespÄ“jams ievietot tabulu, kas satur vairÄk nekÄ $1 Å¡Å«nas.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Ar Å¡Ä« dialoga loga palÄ«dzÄ«bu nav iespÄ“jams ievietot tabulu, kas satur vairÄk nekÄ $1 Å¡Å«nas.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ievadītais rindu vai kolonnu skaits nav korekts.',
'wikieditor-toolbar-tool-table-zero' => 'Nav iespējams ievietot tabulu, kas nesatur nevienu rindu vai kolonnu.',
'wikieditor-toolbar-tool-replace' => 'MeklÄ“t un aizstÄt',
@@ -17020,7 +17392,7 @@ $1:Example.jpg|Apraksts2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Aizvietot visus',
'wikieditor-toolbar-tool-replace-close' => 'Aizvērt',
'wikieditor-toolbar-tool-replace-nomatch' => 'Nekas netika atrasts.',
- 'wikieditor-toolbar-tool-replace-success' => 'Aizvietots $1 vietÄ(s).',
+ 'wikieditor-toolbar-tool-replace-success' => 'Aizvietots $1 vietÄ(s).', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Nav norÄdÄ«ta meklÄ“jamÄ simbolu virkne.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Å Ä« ievadÄ«tÄ regulÄrÄ izteiksme nav korekta: $1',
'wikieditor-toolbar-section-characters' => 'Īpašie simboli',
@@ -17111,108 +17483,175 @@ $messages['lzz'] = array(
'wikieditor-toolbar-characters-page-arabic' => 'Arabuli',
);
+/** Malagasy (Malagasy)
+ * @author Jagwar
+ */
+$messages['mg'] = array(
+ 'wikieditor-toolbar-tool-table-example-cell-text' => 'Lahatsoratra anaty sela',
+ 'wikieditor-toolbar-tool-table-title' => 'Hampiditra tabilao',
+ 'wikieditor-toolbar-tool-table-dimensions-rows' => 'Andalana',
+ 'wikieditor-toolbar-tool-table-dimensions-columns' => 'Tsanganana',
+ 'wikieditor-toolbar-tool-table-dimensions-header' => 'Hanampy ny lohandalana',
+ 'wikieditor-toolbar-tool-table-sortable' => 'Atao azo fantinina',
+ 'wikieditor-toolbar-tool-table-example' => 'Ohatra',
+ 'wikieditor-toolbar-tool-table-preview' => 'Topi-maso',
+ 'wikieditor-toolbar-tool-table-insert' => 'Hampiditra',
+ 'wikieditor-toolbar-tool-table-cancel' => 'Aoka ihany',
+ 'wikieditor-toolbar-tool-table-toomany' => "Tsy afaka ataon'ity fitaovana ity ny mampiditra tabilao manana sela mahery ny 1000.",
+ 'wikieditor-toolbar-section-characters' => 'Tarehintsoratra manokana',
+ 'wikieditor-toolbar-characters-page-latin' => 'latina',
+ 'wikieditor-toolbar-characters-page-latinextended' => 'latina nitarina',
+ 'wikieditor-toolbar-characters-page-ipa' => 'AAI',
+ 'wikieditor-toolbar-characters-page-symbols' => 'eva',
+ 'wikieditor-toolbar-characters-page-greek' => 'grika',
+ 'wikieditor-toolbar-characters-page-cyrillic' => 'sirilika',
+ 'wikieditor-toolbar-characters-page-arabic' => 'arabo',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'arabo nitarina',
+ 'wikieditor-toolbar-characters-page-persian' => 'persàna',
+ 'wikieditor-toolbar-characters-page-hebrew' => 'ebreo',
+ 'wikieditor-toolbar-characters-page-bangla' => 'bengali',
+ 'wikieditor-toolbar-characters-page-tamil' => 'tamily',
+ 'wikieditor-toolbar-characters-page-telugu' => 'telogo',
+ 'wikieditor-toolbar-characters-page-sinhala' => 'singalesa',
+ 'wikieditor-toolbar-characters-page-gujarati' => 'gojaraty',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'devanagari',
+ 'wikieditor-toolbar-characters-page-thai' => 'tailandey',
+ 'wikieditor-toolbar-characters-page-lao' => 'laôsianina',
+ 'wikieditor-toolbar-characters-page-khmer' => 'kimera',
+ 'wikieditor-toolbar-characters-endash' => 'tsipika anglisy',
+ 'wikieditor-toolbar-characters-emdash' => 'tsipika em',
+ 'wikieditor-toolbar-characters-minus' => 'marika mainosy',
+ 'wikieditor-toolbar-section-help' => 'Fanoroana',
+ 'wikieditor-toolbar-help-heading-description' => 'Famisavisana',
+ 'wikieditor-toolbar-help-heading-syntax' => 'Ny soratanao',
+ 'wikieditor-toolbar-help-heading-result' => 'Ny azonao',
+ 'wikieditor-toolbar-help-page-link' => 'Rohy',
+ 'wikieditor-toolbar-help-page-heading' => 'Lohateny',
+ 'wikieditor-toolbar-help-page-list' => 'Lisitra',
+ 'wikieditor-toolbar-help-page-file' => 'Rakitra',
+ 'wikieditor-toolbar-help-page-reference' => 'Tsiahy',
+ 'wikieditor-toolbar-help-page-discussion' => 'Resaka',
+ 'wikieditor-toolbar-help-content-signature-description' => 'Sonia',
+);
+
/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ * @author Naval Scene
* @author VoteITP
*/
$messages['min'] = array(
- 'wikieditor' => 'Suntingan antarmuka teks wiki lanjut',
- 'wikieditor-desc' => 'Menyediakan suntingan antarmuka teks wiki dan babarapo ruang penyedia corak',
+ 'wikieditor' => 'Antarmuko panyuntiangan teks wiki tingkek lanjuik',
+ 'wikieditor-desc' => 'Manyadiokan suntiangan antarmuko teks wiki nan banyak fitua',
'wikieditor-wikitext-tab' => 'Teks wiki',
- 'wikieditor-loading' => 'Maunggah',
+ 'wikieditor-loading' => 'Loading...',
'wikieditor-preview-preference' => 'Aktifkan pratonton basisian',
'wikieditor-preview-tab' => 'Pratonton',
'wikieditor-preview-changes-tab' => 'Parubahan',
- 'wikieditor-preview-loading' => 'Maunggah...',
- 'wikieditor-publish-preference' => 'Aktifkan penerbitan batahap',
- 'wikieditor-publish-button-publish' => 'Terbitkan',
- 'wikieditor-publish-button-cancel' => 'Batalkan',
- 'wikieditor-publish-dialog-title' => 'Mencetak {{SITENAME}}',
- 'wikieditor-publish-dialog-summary' => 'Ringkasan suntingan (jelaskan dengan ringkas parubahan yang awak buek):',
- 'wikieditor-publish-dialog-minor' => 'Suntingan ketek',
+ 'wikieditor-preview-loading' => 'Loading...',
+ 'wikieditor-previewDialog-preference' => 'Aktifkan dialog pratonton',
+ 'wikieditor-previewDialog-tab' => 'Pratonton',
+ 'wikieditor-previewDialog-loading' => 'Loading...',
+ 'wikieditor-publish-preference' => 'Aktifkan panarbitan batahap',
+ 'wikieditor-publish-button-publish' => 'Tabikan',
+ 'wikieditor-publish-button-cancel' => 'Batal',
+ 'wikieditor-publish-dialog-title' => 'Tabikan ka {{SITENAME}}',
+ 'wikieditor-publish-dialog-summary' => 'Ikhtisar suntiangan (jalehan sacaro ringkeh parubahan nan Sanak buek):',
+ 'wikieditor-publish-dialog-minor' => 'Suntiangan ketek',
'wikieditor-publish-dialog-watch' => 'Pantau laman ko',
- 'wikieditor-publish-dialog-publish' => 'Terbitkan',
+ 'wikieditor-publish-dialog-publish' => 'Tabikan',
'wikieditor-publish-dialog-goback' => 'Baliak',
- 'wikieditor-template-editor-preference' => 'Aktifkan formulir suntingan templat wiki',
+ 'wikieditor-template-editor-preference' => 'Aktifkan formulir suntiangan templat wiki',
'wikieditor-template-editor-dialog-title' => 'Suntiang templat',
- 'wikieditor-template-editor-dialog-submit' => 'Perbarui',
- 'wikieditor-template-editor-dialog-cancel' => 'Batalkan',
- 'wikieditor-templates-preference' => 'Aktifkan fungsi tutup templat',
- 'wikieditor-toc-preference' => 'Senarai kandungan dapek dilayari',
- 'wikieditor-toc-show' => 'Tampilkan kandungan',
- 'wikieditor-toc-hide' => 'Suruakkan kandungan',
+ 'wikieditor-template-editor-dialog-submit' => 'Pabarui',
+ 'wikieditor-template-editor-dialog-cancel' => 'Batal',
+ 'wikieditor-templates-preference' => 'Aktifkan fungsi templat tatutuik',
+ 'wikieditor-toc-preference' => 'Aktifkan navigasi isi tabel',
+ 'wikieditor-toc-show' => 'Tampilkan isi',
+ 'wikieditor-toc-hide' => 'Suruakkan isi',
'wikieditor-toolbar' => 'Bilah suntiang',
- 'wikieditor-toolbar-desc' => 'Laman bilah suntiang jo kagunoan lanjut',
- 'wikieditor-toolbar-preference' => 'Bilah suntiang lanjut lah aktif',
- 'wikieditor-toolbar-dialogs-preference' => 'Aktifkan bantuan untuak manambah tautan, tabel dan lainnyo',
- 'wikieditor-toolbar-loading' => 'Maunggah...',
+ 'wikieditor-toolbar-desc' => 'Laman bilah suntiang jo kagunoan lanjuik',
+ 'wikieditor-toolbar-preference' => 'Aktipan bilah panyuntiangan tingkek lanjuik',
+ 'wikieditor-toolbar-dialogs-preference' => 'Aktipan bantuan untuak manambah pautan, tabel dan lainnyo',
+ 'wikieditor-toolbar-hidesig' => 'Suruakan tombol tando tangan dari laman pado ruang namo utama',
+ 'wikieditor-toolbar-loading' => 'Loading...',
'wikieditor-toolbar-tool-bold' => 'Taba',
- 'wikieditor-toolbar-tool-bold-example' => 'Teks dicetak taba',
+ 'wikieditor-toolbar-tool-bold-example' => 'Teks taba',
'wikieditor-toolbar-tool-italic' => 'Miriang',
- 'wikieditor-toolbar-tool-italic-example' => 'Teks dicetak miriang',
- 'wikieditor-toolbar-tool-ilink' => 'Pranala dalam',
- 'wikieditor-toolbar-tool-ilink-example' => 'Judul pranala',
- 'wikieditor-toolbar-tool-xlink' => 'Pranala lua (ingek awalannyo http://)',
- 'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com judul pranala',
- 'wikieditor-toolbar-tool-link' => 'Tautan',
- 'wikieditor-toolbar-tool-link-title' => 'Masuakkan tautan',
+ 'wikieditor-toolbar-tool-italic-example' => 'Teks miriang',
+ 'wikieditor-toolbar-tool-ilink' => 'Pautan dalam',
+ 'wikieditor-toolbar-tool-ilink-example' => 'Judul pautan',
+ 'wikieditor-toolbar-tool-xlink' => 'Pautan lua (ingek awalannyo http://)',
+ 'wikieditor-toolbar-tool-xlink-example' => 'http://www.hanyo-contoh.com judul pautan',
+ 'wikieditor-toolbar-tool-link' => 'Pautan',
+ 'wikieditor-toolbar-tool-link-title' => 'Masuakkan pautan',
'wikieditor-toolbar-tool-link-int' => 'Ka laman wiki',
'wikieditor-toolbar-tool-link-int-target' => 'Laman sasaran atau URL:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Judul laman atau URL',
'wikieditor-toolbar-tool-link-int-text' => 'Tampilan teks:',
- 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Teks yang ka ditampilkan',
+ 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Teks nan ka ditampilkan',
'wikieditor-toolbar-tool-link-ext' => 'Ka laman web lua',
- 'wikieditor-toolbar-tool-link-ext-target' => 'Tautan URL:',
- 'wikieditor-toolbar-tool-link-ext-text' => 'Tautan teks:',
- 'wikieditor-toolbar-tool-link-insert' => 'Masuakkan tautan',
- 'wikieditor-toolbar-tool-link-cancel' => 'Batalkan',
- 'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Laman yang lah ado',
- 'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Laman alun tasadio',
+ 'wikieditor-toolbar-tool-link-ext-target' => 'Pautan URL:',
+ 'wikieditor-toolbar-tool-link-ext-text' => 'Pautan teks:',
+ 'wikieditor-toolbar-tool-link-insert' => 'Masuakan pautan',
+ 'wikieditor-toolbar-tool-link-cancel' => 'Batalan',
+ 'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Laman alah ado',
+ 'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Laman alun ado',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Judul indak sah',
- 'wikieditor-toolbar-tool-link-int-target-status-external' => 'Pranala lua',
- 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Memeriksa keadaan laman...',
- 'wikieditor-toolbar-tool-link-int-invalid' => 'Judul yang awak berikan indak sah',
- 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URL yang awak berikan tampaknyo marupokan tautan ka laman wiki lain.
-Apo awak ingin mambueknyo jadi pranala dalam?',
- 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Pranala dalam',
- 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Pranala lua',
- 'wikieditor-toolbar-tool-link-empty' => 'Awak indak mamasuakkan apo pun untuak ditautkan',
- 'wikieditor-toolbar-tool-file' => 'Cantumkan berkas',
+ 'wikieditor-toolbar-tool-link-int-target-status-external' => 'Pautan lua',
+ 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Mamariso kaadaan laman...',
+ 'wikieditor-toolbar-tool-link-int-invalid' => 'Judul nan Sanak agiah indak sah',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URL nan Sanak agiah tampaknyo marupoan pautan ka laman wiki lain.
+Apo nio dijadian pautan dalam?',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Pautan dalam',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Pautan lua',
+ 'wikieditor-toolbar-tool-link-empty' => 'Sanak indak mamasuakkan apo-apo untuak dipauikan',
+ 'wikieditor-toolbar-tool-file' => 'Berkas',
'wikieditor-toolbar-tool-file-example' => 'Contoh.jpg',
- 'wikieditor-toolbar-tool-reference' => 'Rujukan',
+ 'wikieditor-toolbar-tool-file-title' => 'Cantumkan berkas',
+ 'wikieditor-toolbar-file-target' => 'Namo berkas:',
+ 'wikieditor-toolbar-file-caption' => 'Katarangan:',
+ 'wikieditor-toolbar-file-size' => 'Ukuran:',
+ 'wikieditor-toolbar-file-float' => 'Rato:',
+ 'wikieditor-toolbar-file-default' => '(bawaan)',
+ 'wikieditor-toolbar-file-format' => 'Format:',
+ 'wikieditor-toolbar-file-format-none' => 'dak ado',
+ 'wikieditor-toolbar-tool-file-insert' => 'Masuakkan',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Batal',
+ 'wikieditor-toolbar-tool-reference' => 'Rujuakan',
'wikieditor-toolbar-tool-reference-example' => 'Sisipkan teks catatan kaki di siko',
- 'wikieditor-toolbar-tool-reference-cancel' => 'Batalkan',
- 'wikieditor-toolbar-tool-reference-title' => 'Masuakkan rujukan',
- 'wikieditor-toolbar-tool-reference-insert' => 'Masuakkan',
- 'wikieditor-toolbar-tool-reference-text' => 'Teks rujukan',
- 'wikieditor-toolbar-tool-signature' => 'Tandotangan dan tandomaso',
- 'wikieditor-toolbar-section-advanced' => 'Lanjutan',
+ 'wikieditor-toolbar-tool-reference-cancel' => 'Batal',
+ 'wikieditor-toolbar-tool-reference-title' => 'Masuakan rujuakan',
+ 'wikieditor-toolbar-tool-reference-insert' => 'Masuakan',
+ 'wikieditor-toolbar-tool-reference-text' => 'Teks rujuakan',
+ 'wikieditor-toolbar-tool-signature' => 'Tandotangan jo wakatu',
+ 'wikieditor-toolbar-section-advanced' => 'Tingkek lanjuik',
'wikieditor-toolbar-tool-heading' => 'Judul',
'wikieditor-toolbar-tool-heading-1' => 'Tingkek 1',
'wikieditor-toolbar-tool-heading-2' => 'Tingkek 2',
'wikieditor-toolbar-tool-heading-3' => 'Tingkek 3',
'wikieditor-toolbar-tool-heading-4' => 'Tingkek 4',
'wikieditor-toolbar-tool-heading-5' => 'Tingkek 5',
- 'wikieditor-toolbar-tool-heading-example' => 'Teks tajuk',
+ 'wikieditor-toolbar-tool-heading-example' => 'Teks judul',
'wikieditor-toolbar-group-format' => 'Format',
- 'wikieditor-toolbar-tool-ulist' => 'Senarai babantuak peluru',
- 'wikieditor-toolbar-tool-ulist-example' => 'Hal senarai babantuak peluru',
- 'wikieditor-toolbar-tool-olist' => 'Senarai babantuak nomor',
- 'wikieditor-toolbar-tool-olist-example' => 'Hal senarai babantuak nomor',
- 'wikieditor-toolbar-tool-indent' => 'Lekukan',
- 'wikieditor-toolbar-tool-indent-example' => 'Barih lekuk',
- 'wikieditor-toolbar-tool-nowiki' => 'Indak ado pemformatan wiki',
- 'wikieditor-toolbar-tool-nowiki-example' => 'Masuakkan disiko teks yang indak diformat',
- 'wikieditor-toolbar-tool-redirect' => 'Pengalihan',
+ 'wikieditor-toolbar-tool-ulist' => 'Daftar poin',
+ 'wikieditor-toolbar-tool-ulist-example' => 'Barih isi',
+ 'wikieditor-toolbar-tool-olist' => 'Daftar banomor',
+ 'wikieditor-toolbar-tool-olist-example' => 'Barih isi',
+ 'wikieditor-toolbar-tool-indent' => 'Inden',
+ 'wikieditor-toolbar-tool-indent-example' => 'Barih inden',
+ 'wikieditor-toolbar-tool-nowiki' => 'Indak ado format wiki',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'Masuakan disiko teks nan indak diformat',
+ 'wikieditor-toolbar-tool-redirect' => 'Pangaliahan',
'wikieditor-toolbar-tool-redirect-example' => 'Namo laman sasaran',
'wikieditor-toolbar-tool-big' => 'Gadang',
'wikieditor-toolbar-tool-big-example' => 'Teks gadang',
'wikieditor-toolbar-tool-small' => 'Ketek',
'wikieditor-toolbar-tool-small-example' => 'Teks ketek',
- 'wikieditor-toolbar-tool-superscript' => 'Ditulis di atas',
- 'wikieditor-toolbar-tool-superscript-example' => 'Teks ditulis di atas',
- 'wikieditor-toolbar-tool-subscript' => 'Ditulis di bawah',
- 'wikieditor-toolbar-tool-subscript-example' => 'Teks ditulis di bawah',
- 'wikieditor-toolbar-group-insert' => 'Masuakkan',
+ 'wikieditor-toolbar-tool-superscript' => 'Ketek di ateh',
+ 'wikieditor-toolbar-tool-superscript-example' => 'Teks ketek di ateh',
+ 'wikieditor-toolbar-tool-subscript' => 'Ketek di bawah',
+ 'wikieditor-toolbar-tool-subscript-example' => 'Teks ketek di bawah',
+ 'wikieditor-toolbar-group-insert' => 'Masuakan',
'wikieditor-toolbar-tool-gallery' => 'Galeri gambar',
'wikieditor-toolbar-tool-gallery-example' => '$1:Contoh.jpg|Judul1
$1:Contoh.jpg|Judul2',
@@ -17231,61 +17670,69 @@ $1:Contoh.jpg|Judul2',
| barih 2, sel 2
| barih 2, sel 3',
'wikieditor-toolbar-tool-table-example-cell-text' => 'Teks sel',
- 'wikieditor-toolbar-tool-table-example-header' => 'Teks tajuk',
- 'wikieditor-toolbar-tool-table-title' => 'Masuakkan tabel',
+ 'wikieditor-toolbar-tool-table-example-header' => 'Teks judul',
+ 'wikieditor-toolbar-tool-table-title' => 'Masuakan tabel',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'Barih',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'Kolom',
'wikieditor-toolbar-tool-table-dimensions-header' => 'Tambahkan kapalo barih',
- 'wikieditor-toolbar-tool-table-wikitable' => 'Gaya pakai bingkai',
- 'wikieditor-toolbar-tool-table-sortable' => 'Buek tabel yang baurutan',
+ 'wikieditor-toolbar-tool-table-wikitable' => 'Model jo bingkai',
+ 'wikieditor-toolbar-tool-table-sortable' => 'Buek tabel nan baurutan',
'wikieditor-toolbar-tool-table-example' => 'Contoh',
'wikieditor-toolbar-tool-table-preview' => 'Pratonton',
- 'wikieditor-toolbar-tool-table-insert' => 'Masuakkan',
- 'wikieditor-toolbar-tool-table-cancel' => 'Batalkan',
- 'wikieditor-toolbar-tool-table-toomany' => 'Disiko indak mungkin mambuek tabel dengan jumlah selnyo malebihi $1.',
- 'wikieditor-toolbar-tool-table-invalidnumber' => 'Awak indak mamasuakkan jumlah sah dari barih atau kolom.',
- 'wikieditor-toolbar-tool-table-zero' => 'Awak indak boleh mamasuakkan tabel dengan jumlah kosong pado barih atau kolom',
- 'wikieditor-toolbar-tool-replace' => 'Cari dan ganti',
- 'wikieditor-toolbar-tool-replace-title' => 'Cari dan ganti',
+ 'wikieditor-toolbar-tool-table-insert' => 'Masuakan',
+ 'wikieditor-toolbar-tool-table-cancel' => 'Batalan',
+ 'wikieditor-toolbar-tool-table-example-text' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut nec purus diam. Sed aliquam imperdiet nunc quis lacinia. Donec rutrum consectetur placerat. Sed volutpat neque non purus faucibus id ultricies enim euismod.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Mambuek tabel nan labiah dari 1000 sel indak mungkin doh.',
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'Sanak indak mamasuakan jumlah barih jo kolom nan sabananyo.',
+ 'wikieditor-toolbar-tool-table-zero' => 'Sanak indak dapek mambuaek tabel nan babarih atau bakolom kosong',
+ 'wikieditor-toolbar-tool-replace' => 'Cari sarato ganti',
+ 'wikieditor-toolbar-tool-replace-title' => 'Cari sarato ganti',
'wikieditor-toolbar-tool-replace-search' => 'Cari:',
'wikieditor-toolbar-tool-replace-replace' => 'Ganti jo:',
- 'wikieditor-toolbar-tool-replace-case' => 'Keadaan cocok',
- 'wikieditor-toolbar-tool-replace-regex' => 'Perlakukan string cari sebagai "regular expression"',
- 'wikieditor-toolbar-tool-replace-button-findnext' => 'Cari berikutnyo',
- 'wikieditor-toolbar-tool-replace-button-replaceall' => 'Ganti semua',
- 'wikieditor-toolbar-tool-replace-close' => 'Tutup',
- 'wikieditor-toolbar-tool-replace-nomatch' => 'Pencarian awak indak berhasil',
- 'wikieditor-toolbar-tool-replace-success' => 'Tajadi $1 penggantian',
- 'wikieditor-toolbar-tool-replace-emptysearch' => 'Awak indak mamasuakkan apo pun untuak dicari.',
- 'wikieditor-toolbar-tool-replace-invalidregex' => 'Ekspresi biaso yang awak masuakkan indak sah: $1',
+ 'wikieditor-toolbar-tool-replace-case' => 'Cocokan gadang/ketek huruf',
+ 'wikieditor-toolbar-tool-replace-regex' => 'Palakuan string cari sabagai regex (regular expression)',
+ 'wikieditor-toolbar-tool-replace-button-findnext' => 'Cari barikuiknyo',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'Ganti',
+ 'wikieditor-toolbar-tool-replace-button-replaceall' => 'Ganti sadonyo',
+ 'wikieditor-toolbar-tool-replace-close' => 'Tutuik',
+ 'wikieditor-toolbar-tool-replace-nomatch' => 'Pancarian Sanak indak barhasil',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|panggantian}} tajadi.',
+ 'wikieditor-toolbar-tool-replace-emptysearch' => 'Sanak indak mamasuakan apopun untuak dicari.',
+ 'wikieditor-toolbar-tool-replace-invalidregex' => 'Regex (regular expression) nan Sanak masuakan indak sah: $1',
'wikieditor-toolbar-section-characters' => 'Karakter istimewa',
'wikieditor-toolbar-characters-page-latin' => 'Latin',
- 'wikieditor-toolbar-characters-page-latinextended' => 'Latin diperluas',
+ 'wikieditor-toolbar-characters-page-latinextended' => 'Latin tambahan',
'wikieditor-toolbar-characters-page-ipa' => 'IPA',
'wikieditor-toolbar-characters-page-symbols' => 'Simbol',
'wikieditor-toolbar-characters-page-greek' => 'Yunani',
'wikieditor-toolbar-characters-page-cyrillic' => 'Sirilik',
'wikieditor-toolbar-characters-page-arabic' => 'Arab',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Arab tambahan',
'wikieditor-toolbar-characters-page-persian' => 'Persia',
'wikieditor-toolbar-characters-page-hebrew' => 'Ibrani',
'wikieditor-toolbar-characters-page-bangla' => 'Bangla',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamil',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarat',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'India kuno',
'wikieditor-toolbar-characters-page-thai' => 'Siam',
'wikieditor-toolbar-characters-page-lao' => 'Lao',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-characters-endash' => 'en dash',
+ 'wikieditor-toolbar-characters-emdash' => 'em dash',
+ 'wikieditor-toolbar-characters-minus' => 'tando kurang',
'wikieditor-toolbar-section-help' => 'Bantuan',
- 'wikieditor-toolbar-help-heading-description' => 'Keterangan',
- 'wikieditor-toolbar-help-heading-syntax' => 'Apo yang awak ketik',
- 'wikieditor-toolbar-help-heading-result' => 'Apo yang awak dapek',
- 'wikieditor-toolbar-help-page-format' => 'Pemformatan',
- 'wikieditor-toolbar-help-page-link' => 'Tautan',
+ 'wikieditor-toolbar-help-heading-description' => 'Katarangan',
+ 'wikieditor-toolbar-help-heading-syntax' => 'Apo nan Sanak ketik',
+ 'wikieditor-toolbar-help-heading-result' => 'Apo nan Sanak dapek',
+ 'wikieditor-toolbar-help-page-format' => 'Pamformatan',
+ 'wikieditor-toolbar-help-page-link' => 'Pautan',
'wikieditor-toolbar-help-page-heading' => 'Judul',
- 'wikieditor-toolbar-help-page-list' => 'Senarai',
+ 'wikieditor-toolbar-help-page-list' => 'Daftar',
'wikieditor-toolbar-help-page-file' => 'Berkas',
- 'wikieditor-toolbar-help-page-reference' => 'Rujukan',
- 'wikieditor-toolbar-help-page-discussion' => 'Pembicaraan',
+ 'wikieditor-toolbar-help-page-reference' => 'Rujuakan',
+ 'wikieditor-toolbar-help-page-discussion' => 'Rundiang',
'wikieditor-toolbar-help-content-italic-description' => 'Miriang',
'wikieditor-toolbar-help-content-italic-syntax' => "''Teks miriang''",
'wikieditor-toolbar-help-content-italic-result' => '<em>Teks miriang</em>',
@@ -17295,12 +17742,12 @@ $1:Contoh.jpg|Judul2',
'wikieditor-toolbar-help-content-bolditalic-description' => 'Taba &amp; miriang',
'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Teks taba &amp; teks miriang'''''",
'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Teks taba &amp; teks miriang</em></strong>',
- 'wikieditor-toolbar-help-content-ilink-description' => 'Pranala dalam',
- 'wikieditor-toolbar-help-content-ilink-syntax' => '[[Judul laman|Label tautan]]<br />[[Judul laman]]',
- 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Label tautan</a><br /><a href='#'>Judul laman</a>",
- 'wikieditor-toolbar-help-content-xlink-description' => 'Pranala lua',
- 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Label tautan]<br />[http://www.example.org]<br />http://www.example.org',
- 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Label tautan</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
+ 'wikieditor-toolbar-help-content-ilink-description' => 'Pautan dalam',
+ 'wikieditor-toolbar-help-content-ilink-syntax' => '[[Judul laman|Label pautan]]<br />[[Judul laman]]',
+ 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Label pautan</a><br /><a href='#'>Judul laman</a>",
+ 'wikieditor-toolbar-help-content-xlink-description' => 'Pautan lua',
+ 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Label pautan]<br />[http://www.contoh_sajo.org]<br />http://www.contoh_sajo.org',
+ 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Label pautan</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.contoh_sajo.org</a>",
'wikieditor-toolbar-help-content-heading2-description' => 'Judul tingkek 2',
'wikieditor-toolbar-help-content-heading2-syntax' => '== Teks judul ==',
'wikieditor-toolbar-help-content-heading2-result' => '<h2>Teks judul</h2>',
@@ -17313,29 +17760,31 @@ $1:Contoh.jpg|Judul2',
'wikieditor-toolbar-help-content-heading5-description' => 'Judul tingkek 5',
'wikieditor-toolbar-help-content-heading5-syntax' => '===== Teks judul =====',
'wikieditor-toolbar-help-content-heading5-result' => '<h5>Teks judul</h5>',
- 'wikieditor-toolbar-help-content-ulist-description' => 'Senarai babantuak peluru',
- 'wikieditor-toolbar-help-content-ulist-syntax' => '* Senarai hal<br />* Senarai hal',
- 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Senarai hal</li><li>Senarai hal</li></ul>',
- 'wikieditor-toolbar-help-content-olist-description' => 'Senarai babantuak nomor',
- 'wikieditor-toolbar-help-content-olist-syntax' => '# Senarai hal<br /># Senarai hal',
- 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Senarai hal</li><li>Senarai hal</li></ol>',
+ 'wikieditor-toolbar-help-content-ulist-description' => 'Daftar poin',
+ 'wikieditor-toolbar-help-content-ulist-syntax' => '* Isi daftar<br />* Isi daftar',
+ 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Isi daftar</li><li>Isi daftar</li></ul>',
+ 'wikieditor-toolbar-help-content-olist-description' => 'Daftar banomor',
+ 'wikieditor-toolbar-help-content-olist-syntax' => '# Isi daftar<br /># Isi daftar',
+ 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Isi daftar</li><li>Isi daftar</li></ol>',
'wikieditor-toolbar-help-content-file-description' => 'Cantumkan berkas',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Contoh.png|thumb|Teks gambar]]', # Fuzzy
- 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Teks gambar' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Pagadang' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Teks gambar</div></div>",
- 'wikieditor-toolbar-help-content-reference-description' => 'Rujukan',
- 'wikieditor-toolbar-help-content-reference-syntax' => 'Teks laman.&lt;ref name="test"&gt;[http://www.example.org Teks tautan], teks tambahan.&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Teks katarangan' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Pagadang' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Teks katarangan</div></div>",
+ 'wikieditor-toolbar-help-content-reference-description' => 'Rujuakan',
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'Teks laman.&lt;ref name="test"&gt;[http://www.contoh_sajo.org Teks pautan], teks tambahan.&lt;/ref&gt;',
'wikieditor-toolbar-help-content-reference-result' => "Teks laman.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-rereference-description' => 'Rujukan samo digunoan ulang',
+ 'wikieditor-toolbar-help-content-rereference-description' => 'Rujuakan nan digunoan ulang',
+ 'wikieditor-toolbar-help-content-rereference-syntax' => '&lt;ref name="test" /&gt;',
'wikieditor-toolbar-help-content-rereference-result' => "Teks laman.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-showreferences-description' => 'Tampilkan rujukan',
- 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Link text</a>, Teks tambahan.</li></ol>",
- 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Tandotangan dan tandomaso',
- 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Namo pangguno</a> (<a href='#' title='{{#special:mytalk}}'>bincang</a>) 15:54, 10 Juni 2009 (UTC)",
+ 'wikieditor-toolbar-help-content-showreferences-description' => 'Tampilkan rujuakan',
+ 'wikieditor-toolbar-help-content-showreferences-syntax' => '&lt;references /&gt;',
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.contoh_sajo.org' class='external text' href='#'>Teks pautan</a>, teks tambahan.</li></ol>",
+ 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Tando tangan jo wakatu',
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Namo pangguno</a> (<a href='#' title='{{#special:mytalk}}'>maota</a>) 15:54, 10 Juni 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Tandotangan',
- 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Namo pangguno</a> (<a href='#' title='{{#special:mytalk}}'>bincang</a>)",
- 'wikieditor-toolbar-help-content-indent-description' => 'Melekuk',
- 'wikieditor-toolbar-help-content-indent-syntax' => 'Teks normal<br />:Teks lekuk<br />::Teks lekuk',
- 'wikieditor-toolbar-help-content-indent-result' => 'Teks normal<dl><dd>Teks lekuk<dl><dd>Teks lekuk</dd></dl></dd></dl>',
+ 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Namo pangguno</a> (<a href='#' title='{{#special:mytalk}}'>maota</a>)",
+ 'wikieditor-toolbar-help-content-indent-description' => 'Inden',
+ 'wikieditor-toolbar-help-content-indent-syntax' => 'Teks normal<br />:Teks inden<br />::Teks inden',
+ 'wikieditor-toolbar-help-content-indent-result' => 'Teks normal<dl><dd>Teks inden<dl><dd>Teks inden</dd></dl></dd></dl>',
);
/** Macedonian (македонÑки)
@@ -17387,7 +17836,7 @@ $messages['mk'] = array(
'wikieditor-toolbar-tool-xlink-example' => 'http://www.пример.com наÑлов на врÑката',
'wikieditor-toolbar-tool-link' => 'Ð’Ñ€Ñка',
'wikieditor-toolbar-tool-link-title' => 'Вметни врÑка',
- 'wikieditor-toolbar-tool-link-int' => 'Кон вики-Ñтраница',
+ 'wikieditor-toolbar-tool-link-int' => 'Кон викиÑтраница',
'wikieditor-toolbar-tool-link-int-target' => 'ÐаÑлов на Ñтраницата:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'ÐаÑлов на Ñтраницата или URL',
'wikieditor-toolbar-tool-link-int-text' => 'ТекÑÑ‚ на врÑката:',
@@ -17483,7 +17932,7 @@ $1:Пример.jpg|ОпиÑ2',
'wikieditor-toolbar-tool-table-preview' => 'Преглед',
'wikieditor-toolbar-tool-table-insert' => 'Вметни',
'wikieditor-toolbar-tool-table-cancel' => 'Откажи',
- 'wikieditor-toolbar-tool-table-toomany' => 'Ðе можете да вметнувате табела Ñо повеќе од $1 ќелии Ñо овој дијалог.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Ðе можете да вметнувате табела Ñо повеќе од 1000 ќелии Ñо овој дијалог.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ðе внеÑовте важечки број на редови или колони.',
'wikieditor-toolbar-tool-table-zero' => 'Ðе можете да вметнувате табела Ñо нула редови или колони.',
'wikieditor-toolbar-tool-replace' => 'Ðајди и замени',
@@ -17497,7 +17946,7 @@ $1:Пример.jpg|ОпиÑ2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Замени Ñè',
'wikieditor-toolbar-tool-replace-close' => 'Затвори',
'wikieditor-toolbar-tool-replace-nomatch' => 'Ðишто не Ñе Ñовпадна Ñо бараното.',
- 'wikieditor-toolbar-tool-replace-success' => 'Ðаправени Ñе $1 замени.',
+ 'wikieditor-toolbar-tool-replace-success' => '{{PLURAL:$1|Ðаправена е $1 замена.|Ðаправени Ñе $1 замени.}}',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ðе внеÑовте зборови за пребарување.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Регуларниот израз кој го внеÑовте е неважечки: $1',
'wikieditor-toolbar-section-characters' => 'Специјални знаци',
@@ -17588,6 +18037,7 @@ $1:Пример.jpg|ОпиÑ2',
);
/** Malayalam (മലയാളം)
+ * @author Akhilan
* @author McDutchie
* @author Praveenp
*/
@@ -17732,7 +18182,7 @@ $1:Example.jpg|à´•àµà´±à´¿à´ªàµà´ªàµ2',
'wikieditor-toolbar-tool-table-preview' => 'à´Žà´™àµà´™à´¨àµ†à´¯àµà´£àµà´Ÿàµ†à´¨àµà´¨àµ കാണàµà´•',
'wikieditor-toolbar-tool-table-insert' => 'ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
'wikieditor-toolbar-tool-table-cancel' => 'റദàµà´¦à´¾à´•àµà´•àµà´•',
- 'wikieditor-toolbar-tool-table-toomany' => 'ഇതàµà´ªà´¯àµ‹à´—à´¿à´šàµà´šàµ $1 കളങàµà´™à´³à´¿àµ½ അധികമàµà´³àµà´³ പടàµà´Ÿà´¿à´• ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´• സാദàµà´§àµà´¯à´®à´²àµà´².',
+ 'wikieditor-toolbar-tool-table-toomany' => 'ഇതàµà´ªà´¯àµ‹à´—à´¿à´šàµà´šàµ 1000 കളങàµà´™à´³à´¿àµ½ അധികമàµà´³àµà´³ പടàµà´Ÿà´¿à´• ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´• സാദàµà´§àµà´¯à´®à´²àµà´².',
'wikieditor-toolbar-tool-table-invalidnumber' => 'വരികൾകàµà´•àµà´‚ നിരകൾകàµà´•àµà´‚ സാധàµà´µà´¾à´¯ à´Žà´£àµà´£à´‚ താങàµà´•àµ¾ നൽകിയിടàµà´Ÿà´¿à´²àµà´².',
'wikieditor-toolbar-tool-table-zero' => 'പൂജàµà´¯à´‚ വരികളോ നിരകളോ ഉളàµà´³ പടàµà´Ÿà´¿à´• ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¾àµ» താങàµà´•àµ¾à´•àµà´•àµ കഴിയിലàµà´².',
'wikieditor-toolbar-tool-replace' => 'à´•à´£àµà´Ÿàµ†à´¤àµà´¤àµà´• മാറàµà´±àµà´•',
@@ -17746,7 +18196,7 @@ $1:Example.jpg|à´•àµà´±à´¿à´ªàµà´ªàµ2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'à´Žà´²àµà´²à´¾à´‚ മാറàµà´±à´¿à´šàµà´šàµ‡àµ¼à´•àµà´•àµà´•',
'wikieditor-toolbar-tool-replace-close' => 'à´…à´Ÿà´¯àµà´•àµà´•àµà´•',
'wikieditor-toolbar-tool-replace-nomatch' => 'താങàµà´•à´³àµà´Ÿàµ† തിരചàµà´šà´¿à´²àµà´®à´¾à´¯à´¿ à´’à´¨àµà´¨àµà´‚ à´’à´¤àµà´¤àµà´ªàµ‹à´•àµà´¨àµà´¨à´¿à´²àµà´².',
- 'wikieditor-toolbar-tool-replace-success' => '$1 മാറàµà´±à´¿à´µàµ†à´¯àµà´•àµà´•àµ½(കൾ) നടതàµà´¤à´¿.',
+ 'wikieditor-toolbar-tool-replace-success' => '{{PLURAL:$1|ഒരൠമാറàµà´±à´¿à´šàµà´šàµ‡àµ¼à´•àµà´•àµ½|$1 മാറàµà´±à´¿à´šàµà´šàµ‡àµ¼à´•àµà´•à´²àµà´•àµ¾}} നടതàµà´¤à´¿.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'തിരയാനായി താങàµà´•àµ¾ à´’à´¨àµà´¨àµà´‚ നൽകിയിടàµà´Ÿà´¿à´²àµà´².',
'wikieditor-toolbar-tool-replace-invalidregex' => 'താങàµà´•àµ¾ നൽകിയ റെഗàµà´²àµ¼ à´Žà´•àµà´¸àµà´ªàµà´°à´·àµ» അസാധàµà´µà´¾à´£àµâ€Œ: $1',
'wikieditor-toolbar-section-characters' => 'à´ªàµà´°à´¤àµà´¯àµ‡à´• ലിപികൾ',
@@ -17769,6 +18219,7 @@ $1:Example.jpg|à´•àµà´±à´¿à´ªàµà´ªàµ2',
'wikieditor-toolbar-characters-page-thai' => 'തായàµ',
'wikieditor-toolbar-characters-page-lao' => 'ലാവോ',
'wikieditor-toolbar-characters-page-khmer' => 'ഖെമർ',
+ 'wikieditor-toolbar-characters-endash' => 'ഇം ഡാഷàµ',
'wikieditor-toolbar-characters-minus' => 'à´µàµà´¯à´µà´•à´²à´¨ à´šà´¿à´¹àµà´¨à´‚',
'wikieditor-toolbar-section-help' => 'സഹായം',
'wikieditor-toolbar-help-heading-description' => 'വിവരണം',
@@ -17853,6 +18304,7 @@ $messages['mn'] = array(
* @author Shantanoo
* @author V.narsikar
* @author अभय नातू
+ * @author संतोष दहिवळ
*/
$messages['mr'] = array(
'wikieditor' => 'विकिमजकूर संपादनाची विकसित सà¥à¤µà¤¿à¤§à¤¾',
@@ -17915,14 +18367,23 @@ $messages['mr'] = array(
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'पान असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ नाही',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'अगà¥à¤°à¤¾à¤¹à¥à¤¯ शीरà¥à¤·à¤•',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'बाहà¥à¤¯ दà¥à¤µà¤¾',
- 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'पानाचे असà¥à¤¤à¥€à¤¤à¥à¤µ तपासत आहे...',
- 'wikieditor-toolbar-tool-link-int-invalid' => 'तà¥à¤®à¥à¤¹à¥€ नमà¥à¤¦ केलेले शीरà¥à¤·à¤• अगà¥à¤°à¤¾à¤¹à¥à¤¯ आहे.',
- 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'तà¥à¤®à¥à¤¹à¥€ नमà¥à¤¦ केलेली यूआरà¤à¤² इतर विकिपानास जोडावयाची आहे असे दिसते. तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ अंतरà¥à¤—त दà¥à¤µà¤¾ बनवायचा आहे काय ?',
+ 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'पानाचे असà¥à¤¤à¤¿à¤¤à¥à¤µ तपासत आहे...',
+ 'wikieditor-toolbar-tool-link-int-invalid' => 'तà¥à¤®à¥à¤¹à¥€ नमूद केलेले शीरà¥à¤·à¤• अगà¥à¤°à¤¾à¤¹à¥à¤¯ आहे.',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'तà¥à¤®à¥à¤¹à¥€ नमूद केलेली यूआरà¤à¤² इतर विकिपानास जोडावयाची आहे असे दिसते. तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ अंतरà¥à¤—त दà¥à¤µà¤¾ बनवायचा आहे काय ?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'अंतरà¥à¤—त दà¥à¤µà¤¾',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'बाहà¥à¤¯ दà¥à¤µà¤¾',
'wikieditor-toolbar-tool-link-empty' => 'तà¥à¤®à¥à¤¹à¥€ दà¥à¤µà¤¾ देणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ काही भरलेले नाही.',
'wikieditor-toolbar-tool-file' => 'संलगà¥à¤¨ संचिका',
'wikieditor-toolbar-tool-file-example' => 'उदाहरण.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'चितà¥à¤° टाका',
+ 'wikieditor-toolbar-file-target' => 'संचिकेचे नाव:',
+ 'wikieditor-toolbar-file-caption' => 'वरà¥à¤£à¤¨:',
+ 'wikieditor-toolbar-file-size' => 'आकार:',
+ 'wikieditor-toolbar-file-float' => 'समास:',
+ 'wikieditor-toolbar-file-format' => 'पà¥à¤°à¤•à¤¾à¤°',
+ 'wikieditor-toolbar-file-format-none' => 'काहीही नाही',
+ 'wikieditor-toolbar-tool-file-insert' => 'समाविषà¥à¤Ÿ करा',
+ 'wikieditor-toolbar-tool-file-cancel' => 'रदà¥à¤¦',
'wikieditor-toolbar-tool-reference' => 'संदरà¥à¤­',
'wikieditor-toolbar-tool-reference-example' => 'तळटीप मजकूर येथे भरा',
'wikieditor-toolbar-tool-reference-cancel' => 'रदà¥à¤¦ करा',
@@ -17986,7 +18447,7 @@ $1:Example.jpg|चितà¥à¤°à¤ªà¤°à¤¿à¤šà¤¯ २',
'wikieditor-toolbar-tool-table-preview' => 'à¤à¤²à¤•',
'wikieditor-toolbar-tool-table-insert' => 'समाविषà¥à¤Ÿà¤•à¤°à¤¾',
'wikieditor-toolbar-tool-table-cancel' => 'रदà¥à¤¦ करा',
- 'wikieditor-toolbar-tool-table-toomany' => '$1 कपà¥à¤¯à¤¾à¤ªà¥‡à¤•à¥à¤·à¤¾ जासà¥à¤¤ कपà¥à¤ªà¥‡ असलेली सारणी (टेबल) या संवादगवाकà¥à¤·à¤¾à¤¤à¥‚न शकà¥à¤¯ नाही.',
+ 'wikieditor-toolbar-tool-table-toomany' => '$1 कपà¥à¤¯à¤¾à¤ªà¥‡à¤•à¥à¤·à¤¾ जासà¥à¤¤ कपà¥à¤ªà¥‡ असलेली सारणी (टेबल) या संवादगवाकà¥à¤·à¤¾à¤¤à¥‚न शकà¥à¤¯ नाही.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'आपण रकाने(कॉलम) किंवा ओळींचा (रो) गà¥à¤°à¤¾à¤¹à¥à¤¯ आकडा टाकला नाही.',
'wikieditor-toolbar-tool-table-zero' => 'आपण शूनà¥à¤¯ रकाने किंवा ओळींची सारणी टाकू शकत नाही.',
'wikieditor-toolbar-tool-replace' => 'शोधा व तà¥à¤¯à¤¾à¤œà¤¾à¤—ी बदला.',
@@ -17994,13 +18455,13 @@ $1:Example.jpg|चितà¥à¤°à¤ªà¤°à¤¿à¤šà¤¯ २',
'wikieditor-toolbar-tool-replace-search' => 'यासाठी शोधा:',
'wikieditor-toolbar-tool-replace-replace' => 'टाकà¥à¤¨ बदला:',
'wikieditor-toolbar-tool-replace-case' => '’केस’जà¥à¤³à¤µà¤¾',
- 'wikieditor-toolbar-tool-replace-regex' => 'शोध सूतà¥à¤°à¤¾à¤¸(सà¥à¤Ÿà¥à¤°à¤¿à¤‚ग) नियमीत पदावली(à¤à¤•à¥à¤¸à¤ªà¥à¤°à¥‡à¤¶à¤¨) पà¥à¤°à¤®à¤¾à¤£à¥‡ गृहीत धरा.',
+ 'wikieditor-toolbar-tool-replace-regex' => 'शोध सूतà¥à¤°à¤¾à¤¸(सà¥à¤Ÿà¥à¤°à¤¿à¤‚ग) नियमित पदावली(à¤à¤•à¥à¤¸à¤ªà¥à¤°à¥‡à¤¶à¤¨) पà¥à¤°à¤®à¤¾à¤£à¥‡ गृहीत धरा.',
'wikieditor-toolbar-tool-replace-button-findnext' => 'पà¥à¤¢à¥€à¤² शोधा:',
'wikieditor-toolbar-tool-replace-button-replace' => 'पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करा',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'सरà¥à¤µ बदली करा.',
'wikieditor-toolbar-tool-replace-close' => 'बंद करा.',
'wikieditor-toolbar-tool-replace-nomatch' => 'आपला शोध कशाशीच जà¥à¤³à¤¤ नाही.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 बदलविलेत.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 बदलविलेत.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'आपण शोधणà¥à¤¯à¤¾à¤¸à¤¾à¤ à¥€ काहीही भरले नाही.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'या तà¥à¤®à¥à¤¹à¥€ टाकलेलेली नेहमीची पदावली अगà¥à¤°à¤¾à¤¹à¥à¤¯ आहे:$1',
'wikieditor-toolbar-section-characters' => 'विशेष वरà¥à¤£',
@@ -18015,12 +18476,15 @@ $1:Example.jpg|चितà¥à¤°à¤ªà¤°à¤¿à¤šà¤¯ २',
'wikieditor-toolbar-characters-page-persian' => 'फारà¥à¤¸à¥€',
'wikieditor-toolbar-characters-page-hebrew' => 'हिबà¥à¤°à¥‚ भाषा',
'wikieditor-toolbar-characters-page-bangla' => 'बंगाली भाषा',
+ 'wikieditor-toolbar-characters-page-tamil' => 'तमिळ',
'wikieditor-toolbar-characters-page-telugu' => 'तेलगॠभाषा',
'wikieditor-toolbar-characters-page-sinhala' => 'सिंहला',
'wikieditor-toolbar-characters-page-gujarati' => 'गà¥à¤œà¤°à¤¾à¤¤à¥€ भाषा',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'देवनागरी',
'wikieditor-toolbar-characters-page-thai' => 'थाई भाषा',
'wikieditor-toolbar-characters-page-lao' => 'लाऒ भाषा',
'wikieditor-toolbar-characters-page-khmer' => 'खमेर',
+ 'wikieditor-toolbar-characters-minus' => 'ॠण चिनà¥à¤¹',
'wikieditor-toolbar-section-help' => 'साहायà¥à¤¯',
'wikieditor-toolbar-help-heading-description' => 'वरà¥à¤£à¤¨',
'wikieditor-toolbar-help-heading-syntax' => 'जे तà¥à¤®à¥à¤¹à¥€ टंकीत(टाईप) कराल',
@@ -18039,8 +18503,8 @@ $1:Example.jpg|चितà¥à¤°à¤ªà¤°à¤¿à¤šà¤¯ २',
'wikieditor-toolbar-help-content-bold-syntax' => '’’’ठळक मजकूर’’’',
'wikieditor-toolbar-help-content-bold-result' => '<strong>ठळक मजकूर</strong>',
'wikieditor-toolbar-help-content-bolditalic-description' => 'ठळक &amp; तीरकी',
- 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''ठळक &amp; तीरका मजकूर'''''",
- 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>ठळक आणि तीरका मजकूर</em></strong>',
+ 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''ठळक &amp; तिरका मजकूर'''''",
+ 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>ठळक आणि तिरका मजकूर</em></strong>',
'wikieditor-toolbar-help-content-ilink-description' => 'अंतरà¥à¤—त दà¥à¤µà¤¾',
'wikieditor-toolbar-help-content-ilink-syntax' => '[[लेख शीरà¥à¤·à¤•|दृशà¥à¤¯ शबà¥à¤¦à¤²à¥‡à¤–न]]<br />[[लेख शीरà¥à¤·à¤•]]',
'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>दृशà¥à¤¯ शबà¥à¤¦à¤²à¥‡à¤–न</a><br /><a href='#'>पानाचे नाव</a>",
@@ -18072,7 +18536,7 @@ $1:Example.jpg|चितà¥à¤°à¤ªà¤°à¤¿à¤šà¤¯ २',
'wikieditor-toolbar-help-content-reference-description' => 'संदरà¥à¤­',
'wikieditor-toolbar-help-content-reference-syntax' => 'Page text.&lt;ref name="test"&gt;[http://www.example.org Link text], additional text.&lt;/ref&gt;',
'wikieditor-toolbar-help-content-reference-result' => "Page text.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-rereference-description' => 'याच संदरà¥à¤­à¤¾à¤šà¤¾ अतिरीकà¥à¤¤ वापर',
+ 'wikieditor-toolbar-help-content-rereference-description' => 'याच संदरà¥à¤­à¤¾à¤šà¤¾ अतिरिकà¥à¤¤ वापर',
'wikieditor-toolbar-help-content-rereference-result' => "पान मजकूर.<sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-showreferences-description' => 'संदरà¥à¤­ दरà¥à¤¶à¤µà¤¾',
'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Link text</a>, additional text.</li></ol>",
@@ -18236,7 +18700,7 @@ $1:Contoh.jpg|Sari kata 2',
'wikieditor-toolbar-tool-table-insert' => 'Sisip',
'wikieditor-toolbar-tool-table-cancel' => 'Batalkan',
'wikieditor-toolbar-tool-table-example-text' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut nec purus diam. Sed aliquam imperdiet nunc quis lacinia. Donec rutrum consectetur placerat. Sed volutpat neque non purus faucibus id ultricies enim euismod.',
- 'wikieditor-toolbar-tool-table-toomany' => 'Memasukkan jadual dengan lebih $1 sel tidak dibenarkan dengan dialog ini.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Memasukkan jadual dengan lebih 1000 sel tidak dibenarkan dengan dialog ini.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Anda tidak menyertakan nombor yang sah untuk bilangan baris dan lajur.',
'wikieditor-toolbar-tool-table-zero' => 'Anda tidak boleh menyisipkan jadual dengan baris atau lajur sifar.',
'wikieditor-toolbar-tool-replace' => 'Ganti',
@@ -18250,7 +18714,7 @@ $1:Contoh.jpg|Sari kata 2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Tukar semua',
'wikieditor-toolbar-tool-replace-close' => 'Tutup',
'wikieditor-toolbar-tool-replace-nomatch' => 'Tiada padanan ditemui untuk carian anda.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 gantian dilakukan.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|penggantian}} telah dilakukan.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Anda tidak memasukkan apa-apa untuk dicari.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Ungkapan yang anda masukkan tidak sah: $1',
'wikieditor-toolbar-section-characters' => 'Aksara khas',
@@ -18483,7 +18947,7 @@ $1:Eżempju.jpg|Deskrizzjoni2',
'wikieditor-toolbar-tool-table-preview' => 'Dehra proviżorja',
'wikieditor-toolbar-tool-table-insert' => 'Daħħal',
'wikieditor-toolbar-tool-table-cancel' => 'Annulla',
- 'wikieditor-toolbar-tool-table-toomany' => "B'dan l-istrument mhuwiex possibbli li ddaħħal tabella li għandha aktar minn $1 ċellola",
+ 'wikieditor-toolbar-tool-table-toomany' => "B'dan l-istrument mhuwiex possibbli li ddaħħal tabella li għandha aktar minn $1 ċellola", # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => "Ma daħħaltx numru validu ta' fillieri jew kolonni.",
'wikieditor-toolbar-tool-table-zero' => "Ma tistax iddaħħal tabella b'ebda filliera jew kolonna.",
'wikieditor-toolbar-tool-replace' => 'Fittex u biddel',
@@ -18497,7 +18961,7 @@ $1:Eżempju.jpg|Deskrizzjoni2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Biddel kollox',
'wikieditor-toolbar-tool-replace-close' => 'Agħlaq',
'wikieditor-toolbar-tool-replace-nomatch' => 'It-tfittxija ma tat l-ebda riżultat.',
- 'wikieditor-toolbar-tool-replace-success' => 'Saret/u $1 tibdila/iet.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Saret/u $1 tibdila/iet.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ma indikajt xejn xi trid tfittex.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'L-espressjonali regolari li daħħalt hi invalida: $1',
'wikieditor-toolbar-section-characters' => 'Karattri speċjali',
@@ -18941,7 +19405,7 @@ $1:Example.jpg|Bildetekst2',
'wikieditor-toolbar-tool-table-preview' => 'Forhåndsvisning',
'wikieditor-toolbar-tool-table-insert' => 'Sett inn',
'wikieditor-toolbar-tool-table-cancel' => 'Avbryt',
- 'wikieditor-toolbar-tool-table-toomany' => 'Det er ikke mulig å sette inn mer enn $1 celler med denne boksen.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Det er ikke mulig å sette inn mer enn $1 celler med denne boksen.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Du har ikke skrevet inn et gyldig antall rader eller kolonner.',
'wikieditor-toolbar-tool-table-zero' => 'De kan ikke sette inn en tabell med null rader eller kolonner.',
'wikieditor-toolbar-tool-replace' => 'Søk og erstatt',
@@ -18955,7 +19419,7 @@ $1:Example.jpg|Bildetekst2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Erstatt alle',
'wikieditor-toolbar-tool-replace-close' => 'Lukk',
'wikieditor-toolbar-tool-replace-nomatch' => 'Søket ga ingen resultater.',
- 'wikieditor-toolbar-tool-replace-success' => 'Gjorde $1 erstating(er).',
+ 'wikieditor-toolbar-tool-replace-success' => 'Gjorde $1 erstating(er).', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Du skrev ikke inn noe å søke etter.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Det regulære uttrykket du skrev inn er ugyldig: $1',
'wikieditor-toolbar-section-characters' => 'Spesialtegn',
@@ -18978,6 +19442,9 @@ $1:Example.jpg|Bildetekst2',
'wikieditor-toolbar-characters-page-thai' => 'Thai',
'wikieditor-toolbar-characters-page-lao' => 'Laotisk',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-characters-endash' => 'tankestrek',
+ 'wikieditor-toolbar-characters-emdash' => 'lang tankestrek',
+ 'wikieditor-toolbar-characters-minus' => 'minustegn',
'wikieditor-toolbar-section-help' => 'Hjelp',
'wikieditor-toolbar-help-heading-description' => 'Beskrivelse',
'wikieditor-toolbar-help-heading-syntax' => 'Hva du skriver',
@@ -19043,7 +19510,7 @@ $1:Example.jpg|Bildetekst2',
'wikieditor-toolbar-help-content-indent-result' => 'Normal tekst<dl><dd>Innrykket tekst<dl><dd>Innrykket tekst</dd></dl></dd></dl>',
);
-/** Nedersaksisch (Nedersaksisch)
+/** Nedersaksies (Nedersaksies)
* @author Servien
*/
$messages['nds-nl'] = array(
@@ -19174,7 +19641,7 @@ $1:Veurbeeld2|Bieschrift2',
'wikieditor-toolbar-tool-table-preview' => 'Naokieken',
'wikieditor-toolbar-tool-table-insert' => 'Invoegen',
'wikieditor-toolbar-tool-table-cancel' => 'Aofbreken',
- 'wikieditor-toolbar-tool-table-toomany' => 'Je kunnen via dit dialoogvienster gien tabel derbie doon mit meer as $1 sellen.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Je kunnen via dit dialoogvienster gien tabel derbie doon mit meer as $1 sellen.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Je hebben nog gien geldig antal regels of kolommen op-egeven.',
'wikieditor-toolbar-tool-table-zero' => 'Je kunnen gien tabel derbie doon zonder regels of kolommen.',
'wikieditor-toolbar-tool-replace' => 'Zeuken en vervangen',
@@ -19187,7 +19654,7 @@ $1:Veurbeeld2|Bieschrift2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Alles vervangen',
'wikieditor-toolbar-tool-replace-close' => 'Sluten',
'wikieditor-toolbar-tool-replace-nomatch' => 'Joew zeukopdrach hef niks op-eleverd.',
- 'wikieditor-toolbar-tool-replace-success' => 'Der bin $1 vervangingen edaon.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Der bin $1 vervangingen edaon.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Je hebben gien zeukterm op-egeven.',
'wikieditor-toolbar-tool-replace-invalidregex' => "De reguliere die'j op-egeven hebben is ongeldig: $1",
'wikieditor-toolbar-section-characters' => 'Spesiale tekens',
@@ -19320,19 +19787,19 @@ $messages['nl'] = array(
'wikieditor-toolbar' => 'Bewerkingswerkbalk',
'wikieditor-toolbar-desc' => 'Bewerkingsbalk die eenvoudiger te gebruiken is',
'wikieditor-toolbar-preference' => 'Uitgebreide bewerkingsbalk inschakelen',
- 'wikieditor-toolbar-dialogs-preference' => 'Dialogen voor het toevoegen van verwijzingen, tabellen en meer inschakelen',
+ 'wikieditor-toolbar-dialogs-preference' => 'Dialogen voor het toevoegen van koppelingen, tabellen en meer inschakelen',
'wikieditor-toolbar-hidesig' => 'De knop voor ondertekenen in deze naamruimte verbergen',
'wikieditor-toolbar-loading' => 'Bezig met laden…',
'wikieditor-toolbar-tool-bold' => 'Vet',
'wikieditor-toolbar-tool-bold-example' => 'Vetgedrukte tekst',
'wikieditor-toolbar-tool-italic' => 'Cursief',
'wikieditor-toolbar-tool-italic-example' => 'Cursief gedrukte tekst',
- 'wikieditor-toolbar-tool-ilink' => 'Interne verwijzing',
- 'wikieditor-toolbar-tool-ilink-example' => 'Verwijzingsbeschrijving',
- 'wikieditor-toolbar-tool-xlink' => 'Externe verwijzing (vergeet het voorvoegsel http:// niet)',
- 'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com verwijzingsbeschrijving',
- 'wikieditor-toolbar-tool-link' => 'Verwijzing',
- 'wikieditor-toolbar-tool-link-title' => 'Verwijzing invoegen',
+ 'wikieditor-toolbar-tool-ilink' => 'Interne koppeling',
+ 'wikieditor-toolbar-tool-ilink-example' => 'Koppelingsbeschrijving',
+ 'wikieditor-toolbar-tool-xlink' => 'Externe koppeling (vergeet het voorvoegsel http:// niet)',
+ 'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com koppelingsbeschrijving',
+ 'wikieditor-toolbar-tool-link' => 'Koppeling',
+ 'wikieditor-toolbar-tool-link-title' => 'Koppeling invoegen',
'wikieditor-toolbar-tool-link-int' => 'Naar een wikipagina',
'wikieditor-toolbar-tool-link-int-target' => 'Doelpagina of URL:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Paginanaam of URL',
@@ -19340,19 +19807,19 @@ $messages['nl'] = array(
'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Weer te geven tekst',
'wikieditor-toolbar-tool-link-ext' => 'Naar een externe webpagina',
'wikieditor-toolbar-tool-link-ext-target' => 'URL:',
- 'wikieditor-toolbar-tool-link-ext-text' => 'Verwijzingstekst:',
- 'wikieditor-toolbar-tool-link-insert' => 'Verwijzing invoegen',
+ 'wikieditor-toolbar-tool-link-ext-text' => 'Koppelingstekst:',
+ 'wikieditor-toolbar-tool-link-insert' => 'Koppeling invoegen',
'wikieditor-toolbar-tool-link-cancel' => 'Annuleren',
'wikieditor-toolbar-tool-link-int-target-status-exists' => 'De pagina bestaat al',
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'De pagina bestaat niet',
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ongeldige paginanaam',
- 'wikieditor-toolbar-tool-link-int-target-status-external' => 'Externe verwijzing',
+ 'wikieditor-toolbar-tool-link-int-target-status-external' => 'Externe koppeling',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Bezig met controleren of de pagina al bestaat...',
'wikieditor-toolbar-tool-link-int-invalid' => 'De opgegeven pagina is ongeldig.',
- 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'De URL die u hebt opgegeven lijkt bedoeld te zijn als verwijzing naar een andere wikipagina.
-Wilt u er een interne verwijzing van maken?',
- 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Interne verwijzing',
- 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Externe verwijzing',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'De URL die u hebt opgegeven lijkt bedoeld te zijn als koppeling naar een andere wikipagina.
+Wilt u er een interne koppeling van maken?',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Interne koppeling',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Externe koppeling',
'wikieditor-toolbar-tool-link-empty' => 'U hebt niets opgegeven om naar te verwijzen.',
'wikieditor-toolbar-tool-file' => 'Ingebed bestand',
'wikieditor-toolbar-tool-file-example' => 'Voorbeeld.jpg',
@@ -19430,7 +19897,7 @@ $1:Voorbeeld.jpg|Bijschrift2',
'wikieditor-toolbar-tool-table-preview' => 'Voorvertoning',
'wikieditor-toolbar-tool-table-insert' => 'Invoegen',
'wikieditor-toolbar-tool-table-cancel' => 'Annuleren',
- 'wikieditor-toolbar-tool-table-toomany' => 'Het invoegen van een tabel met meer dan $1 cellen is niet mogelijk via dit dialoogvenster.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Het invoegen van een tabel met meer dan 1000 cellen is niet mogelijk via dit dialoogvenster.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'U hebt een ongeldig aantal regels of kolommen opgegeven.',
'wikieditor-toolbar-tool-table-zero' => 'U kunt geen tabel invoegen zonder regels of kolommen.',
'wikieditor-toolbar-tool-replace' => 'Zoeken en vervangen',
@@ -19444,9 +19911,9 @@ $1:Voorbeeld.jpg|Bijschrift2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Alles vervangen',
'wikieditor-toolbar-tool-replace-close' => 'Sluiten',
'wikieditor-toolbar-tool-replace-nomatch' => 'Uw zoekopdracht heeft geen resultaten opgeleverd.',
- 'wikieditor-toolbar-tool-replace-success' => 'Er zijn $1 items vervangen.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Er {{PLURAL:$1|is één item|zijn $1 items}} vervangen.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'U hebt geen zoekterm opgegeven.',
- 'wikieditor-toolbar-tool-replace-invalidregex' => 'De door u ingegeven reguliere expressie is ongeldig: $1',
+ 'wikieditor-toolbar-tool-replace-invalidregex' => 'De door u opgegeven reguliere expressie is ongeldig: $1',
'wikieditor-toolbar-section-characters' => 'Speciale tekens',
'wikieditor-toolbar-characters-page-latin' => 'Latijn',
'wikieditor-toolbar-characters-page-latinextended' => 'Latijn uitgebreid',
@@ -19475,7 +19942,7 @@ $1:Voorbeeld.jpg|Bijschrift2',
'wikieditor-toolbar-help-heading-syntax' => 'Wat u typt',
'wikieditor-toolbar-help-heading-result' => 'Wat u te zien krijgt',
'wikieditor-toolbar-help-page-format' => 'Opmaak',
- 'wikieditor-toolbar-help-page-link' => 'Verwijzingen',
+ 'wikieditor-toolbar-help-page-link' => 'Koppelingen',
'wikieditor-toolbar-help-page-heading' => 'Kopjes',
'wikieditor-toolbar-help-page-list' => 'Lijsten',
'wikieditor-toolbar-help-page-file' => 'Bestanden',
@@ -19490,12 +19957,12 @@ $1:Voorbeeld.jpg|Bijschrift2',
'wikieditor-toolbar-help-content-bolditalic-description' => 'Vet en cursief',
'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Vet- en cursief gedrukte tekst'''''",
'wikieditor-toolbar-help-content-bolditalic-result' => '<em><strong>Vet- en cursief gedrukte tekst</strong></em>',
- 'wikieditor-toolbar-help-content-ilink-description' => 'Interne verwijzing',
- 'wikieditor-toolbar-help-content-ilink-syntax' => '[[Paginanaam|Verwijzingslabel]]<br />[[Paginanaam]]',
- 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Verwijzingslabel</a><br /><a href='#'>Paginanaam</a>",
- 'wikieditor-toolbar-help-content-xlink-description' => 'Externe verwijzing',
- 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Verwijzingslabel]<br />[http://www.example.org]<br />http://www.example.org',
- 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Verwijzingslabel</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
+ 'wikieditor-toolbar-help-content-ilink-description' => 'Interne koppeling',
+ 'wikieditor-toolbar-help-content-ilink-syntax' => '[[Paginanaam|Koppelingslabel]]<br />[[Paginanaam]]',
+ 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Koppelingslabel</a><br /><a href='#'>Paginanaam</a>",
+ 'wikieditor-toolbar-help-content-xlink-description' => 'Externe koppeling',
+ 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Koppelingslabel]<br />[http://www.example.org]<br />http://www.example.org',
+ 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Koppelingslabel</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
'wikieditor-toolbar-help-content-heading2-description' => 'Kopje tweede niveau',
'wikieditor-toolbar-help-content-heading2-syntax' => '==Koptekst==',
'wikieditor-toolbar-help-content-heading2-result' => '<h2>Koptekst</h2>',
@@ -19518,12 +19985,12 @@ $1:Voorbeeld.jpg|Bijschrift2',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Voorbeeld.png|thumb|Bijschrift]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Bijschrift' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Vergroten' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Bijschrift</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'Referentie',
- 'wikieditor-toolbar-help-content-reference-syntax' => 'Paginatekst.&lt;ref name="test"&gt;[http://www.example.org Verwijzingstekst], extra tekst.&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'Paginatekst.&lt;ref name="test"&gt;[http://www.example.org Koppelingstekst], extra tekst.&lt;/ref&gt;',
'wikieditor-toolbar-help-content-reference-result' => "Paginatekst. <sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-rereference-description' => 'Extra gebruik van dezelfde referentie',
'wikieditor-toolbar-help-content-rereference-result' => "Paginatekst. <sup><a href='#'>[1]</a></sup>",
'wikieditor-toolbar-help-content-showreferences-description' => 'Referenties weergeven',
- 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Verwijzingstekst</a>, extra tekst.</li></ol>",
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Koppelingstekst</a>, extra tekst.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Ondertekening met tijdstempel',
'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Gebruikersnaam</a> (<a href='#' title='{{#special:mytalk}}'>overleg</a>) 15:54, 10 June 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Ondertekening',
@@ -19539,8 +20006,8 @@ $1:Voorbeeld.jpg|Bijschrift2',
$messages['nl-informal'] = array(
'wikieditor-publish-dialog-summary' => 'Bewerkingssamenvatting (beschrijf kort de door jou gemaakte wijzingen):',
'wikieditor-toolbar-tool-link-int-invalid' => 'De pagina die je hebt opgegeven is ongeldig.',
- 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'De URL die je hebt opgegeven lijkt bedoeld te zijn als verwijzing naar een andere wikipagina.
-Wil je er een interne verwijzing van maken?',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'De URL die je hebt opgegeven lijkt bedoeld te zijn als koppeling naar een andere wikipagina.
+Wil je er een interne koppeling van maken?',
'wikieditor-toolbar-tool-link-empty' => 'Je hebt niets opgegeven om naar te verwijzen.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Je hebt een ongeldig aantal regels of kolommen opgegeven.',
'wikieditor-toolbar-tool-table-zero' => 'Je kunt geen tabel invoegen zonder regels of kolommen.',
@@ -19596,7 +20063,7 @@ $messages['nn'] = array(
'wikieditor-toolbar-tool-italic-example' => 'Kursiv tekst',
'wikieditor-toolbar-tool-ilink' => 'Intern lenkje',
'wikieditor-toolbar-tool-ilink-example' => 'Lenkjetittel',
- 'wikieditor-toolbar-tool-xlink' => 'Ekstern lenkje (hugsa http://-førefestet)',
+ 'wikieditor-toolbar-tool-xlink' => 'Ekstern lenkje (hugs http:// -førefestet)',
'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com lenkjetittel',
'wikieditor-toolbar-tool-link' => 'Lenkje',
'wikieditor-toolbar-tool-link-title' => 'Set inn lenkje',
@@ -19695,7 +20162,7 @@ $1:Døme.jpg|Bilettekst2',
'wikieditor-toolbar-tool-table-preview' => 'Førehandsvising',
'wikieditor-toolbar-tool-table-insert' => 'Set inn',
'wikieditor-toolbar-tool-table-cancel' => 'Avbryt',
- 'wikieditor-toolbar-tool-table-toomany' => 'Det er ikkje mogleg å setja inn meir enn $1 seller med denne dialogen.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Det er ikkje mogleg å setja inn meir enn $1 seller med denne dialogen.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Du har ikkje skrive inn eit gyldig tal på rader eller kolonner.',
'wikieditor-toolbar-tool-table-zero' => 'Ein kan ikkje setja inn ein tabell med null rader eller kolonner.',
'wikieditor-toolbar-tool-replace' => 'Søk og byt ut',
@@ -19709,7 +20176,7 @@ $1:Døme.jpg|Bilettekst2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Byt ut alle',
'wikieditor-toolbar-tool-replace-close' => 'Lukk',
'wikieditor-toolbar-tool-replace-nomatch' => 'Søket gav ingen resultat.',
- 'wikieditor-toolbar-tool-replace-success' => 'Gjorde $1 tekstbyte.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Gjorde $1 tekstbyte.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Du skreiv ikkje inn noko å søkja etter.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Regulæruttrykket du skreiv inn er ugyldig: $1',
'wikieditor-toolbar-section-characters' => 'Spesialteikn',
@@ -19837,6 +20304,7 @@ $messages['oc'] = array(
'wikieditor-preview-tab' => 'Previsualizacion',
'wikieditor-preview-changes-tab' => 'Cambiaments',
'wikieditor-preview-loading' => 'Cargament...',
+ 'wikieditor-previewDialog-preference' => 'Activar la bóstia de dialòg d’apercebut',
'wikieditor-previewDialog-tab' => 'Previsualizacion',
'wikieditor-previewDialog-loading' => 'Cargament...',
'wikieditor-publish-preference' => 'Activar la publicacion etapa per etapa',
@@ -19860,6 +20328,7 @@ $messages['oc'] = array(
'wikieditor-toolbar-desc' => "Modificacion de la barra d'espleches amb l'utilizabilitat melhorada",
'wikieditor-toolbar-preference' => "Activar la barra d'espleches melhorada",
'wikieditor-toolbar-dialogs-preference' => 'Activar las bóstias de dialòg per apondre de ligams, de tablèus e mai encara',
+ 'wikieditor-toolbar-hidesig' => "Amagar lo boton de signatura dins las paginas de l'espaci de noms principal",
'wikieditor-toolbar-loading' => 'Cargament ...',
'wikieditor-toolbar-tool-bold' => 'Gras',
'wikieditor-toolbar-tool-bold-example' => 'Tèxte en gras',
@@ -19893,10 +20362,22 @@ $messages['oc'] = array(
'wikieditor-toolbar-tool-link-empty' => 'Avètz pas entrat res que pòsca èsser ligat.',
'wikieditor-toolbar-tool-file' => 'Fichièr inserit',
'wikieditor-toolbar-tool-file-example' => 'Exemple.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'Importar un fichièr',
+ 'wikieditor-toolbar-file-target' => 'Nom de fichièr :',
+ 'wikieditor-toolbar-file-caption' => 'Legenda :',
+ 'wikieditor-toolbar-file-size' => 'Talha :',
+ 'wikieditor-toolbar-file-float' => 'Alinhament :',
+ 'wikieditor-toolbar-file-default' => '(per defaut)',
+ 'wikieditor-toolbar-file-format' => 'Format :',
+ 'wikieditor-toolbar-file-format-none' => 'pas cap',
+ 'wikieditor-toolbar-tool-file-insert' => 'Inserir',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Anullar',
'wikieditor-toolbar-tool-reference' => 'Referéncia',
'wikieditor-toolbar-tool-reference-example' => 'Inserir lo tèxte de la nòta en bas de pagina aicí',
'wikieditor-toolbar-tool-reference-cancel' => 'Anullar',
+ 'wikieditor-toolbar-tool-reference-title' => 'Inserir una referéncia',
'wikieditor-toolbar-tool-reference-insert' => 'Inserir',
+ 'wikieditor-toolbar-tool-reference-text' => 'Tèxte de la referéncia',
'wikieditor-toolbar-tool-signature' => 'Signatura e data',
'wikieditor-toolbar-section-advanced' => 'Avançat',
'wikieditor-toolbar-tool-heading' => 'Títol',
@@ -19906,13 +20387,17 @@ $messages['oc'] = array(
'wikieditor-toolbar-tool-heading-4' => 'Nivèl 4',
'wikieditor-toolbar-tool-heading-5' => 'Nivèl 5',
'wikieditor-toolbar-tool-heading-example' => 'Tèxte del títol',
- 'wikieditor-toolbar-group-format' => 'Lista', # Fuzzy
+ 'wikieditor-toolbar-group-format' => 'Format',
'wikieditor-toolbar-tool-ulist' => 'Lista amb de piuses',
'wikieditor-toolbar-tool-ulist-example' => 'Element de la lista amb de piuses',
'wikieditor-toolbar-tool-olist' => 'Lista numerotada',
'wikieditor-toolbar-tool-olist-example' => 'Element de la lista numerotada',
'wikieditor-toolbar-tool-indent' => 'Indentacion',
'wikieditor-toolbar-tool-indent-example' => 'Linha indentada',
+ 'wikieditor-toolbar-tool-nowiki' => 'Pas de formatatge wiki',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'Inserir aicí un tèxte pas formatat',
+ 'wikieditor-toolbar-tool-redirect' => 'Redireccions',
+ 'wikieditor-toolbar-tool-redirect-example' => 'Nom de la pagina de destinacion',
'wikieditor-toolbar-tool-big' => 'Grand',
'wikieditor-toolbar-tool-big-example' => 'Tèxte grand',
'wikieditor-toolbar-tool-small' => 'Pichon',
@@ -19951,7 +20436,7 @@ $1:Exemple.jpg|Descripcion 2',
'wikieditor-toolbar-tool-table-preview' => 'Previsualizacion',
'wikieditor-toolbar-tool-table-insert' => 'Inserir',
'wikieditor-toolbar-tool-table-cancel' => 'Anullar',
- 'wikieditor-toolbar-tool-table-toomany' => "Es pas possible d'inserir un tablèu de mai de $1 cellulas amb aquesta aisina.",
+ 'wikieditor-toolbar-tool-table-toomany' => "Es pas possible d'inserir un tablèu de mai de 1000 cellulas amb aquesta aisina.",
'wikieditor-toolbar-tool-table-invalidnumber' => 'Avètz pas entrat un nombre de linhas o de colomnas valid.',
'wikieditor-toolbar-tool-table-zero' => 'Podètz pas inserir un tablèu sens linha o sens colomna.',
'wikieditor-toolbar-tool-replace' => 'Recercar & remplaçar',
@@ -19961,10 +20446,11 @@ $1:Exemple.jpg|Descripcion 2',
'wikieditor-toolbar-tool-replace-case' => 'Far correspondre la cassa',
'wikieditor-toolbar-tool-replace-regex' => 'Tractar la cadena de recèrca coma una expression regulara',
'wikieditor-toolbar-tool-replace-button-findnext' => 'Recercar lo seguent',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'Remplaçar',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Remplaçar tot',
'wikieditor-toolbar-tool-replace-close' => 'Tampar',
'wikieditor-toolbar-tool-replace-nomatch' => 'Vòstra recèrca a pas trobat cap de correspondéncia.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 remplaçaments faches.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|remplaçament fach|remplaçaments faches}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Avètz pas indicat de tèxte de recercar.',
'wikieditor-toolbar-tool-replace-invalidregex' => "L'expression racionala entrada es invalida : $1",
'wikieditor-toolbar-section-characters' => 'Caractèrs especials',
@@ -19975,10 +20461,21 @@ $1:Exemple.jpg|Descripcion 2',
'wikieditor-toolbar-characters-page-greek' => 'Grèc',
'wikieditor-toolbar-characters-page-cyrillic' => 'Cirillic',
'wikieditor-toolbar-characters-page-arabic' => 'Arabi',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'arabi espandit',
+ 'wikieditor-toolbar-characters-page-persian' => 'Pèrse',
'wikieditor-toolbar-characters-page-hebrew' => 'Ebrieu',
+ 'wikieditor-toolbar-characters-page-bangla' => 'Bengali',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamol',
'wikieditor-toolbar-characters-page-telugu' => 'Telogó',
'wikieditor-toolbar-characters-page-sinhala' => 'Cingalés',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'Devanagari',
+ 'wikieditor-toolbar-characters-page-thai' => 'Tai',
+ 'wikieditor-toolbar-characters-page-lao' => 'Laocian',
+ 'wikieditor-toolbar-characters-page-khmer' => 'Cmèr',
+ 'wikieditor-toolbar-characters-endash' => 'jonhent anglés',
+ 'wikieditor-toolbar-characters-emdash' => 'jonhent em',
+ 'wikieditor-toolbar-characters-minus' => 'signe mens',
'wikieditor-toolbar-section-help' => 'Ajuda',
'wikieditor-toolbar-help-heading-description' => 'Descripcion',
'wikieditor-toolbar-help-heading-syntax' => 'Çò que picatz',
@@ -20044,6 +20541,7 @@ $1:Exemple.jpg|Descripcion 2',
/** Oriya (ଓଡ଼ିଆ)
* @author Ansumang
+ * @author Jnanaranjan Sahu
* @author Odisha1
* @author Psubhashish
* @author Shisir 1945
@@ -20190,7 +20688,7 @@ $1:ଉଦାହରଣ.jpg|ଶିରୋନାମା୨',
'wikieditor-toolbar-tool-table-preview' => 'ସାଇତା ଆଗରୠଦେଖଣା',
'wikieditor-toolbar-tool-table-insert' => 'ଭରିବେ',
'wikieditor-toolbar-tool-table-cancel' => 'ନାକଚ',
- 'wikieditor-toolbar-tool-table-toomany' => 'à¬à¬¹à¬¿ ଆଦେଶରେ $1 ରୠଅଧିକ କୋଷ ଥିବା ସାରଣୀ ପà­à¬°à¬¾à¬‡à¬¬à¬¾ ସମà­à¬­à¬¬à¬ªà¬° ନà­à¬¹à­‡à¬ ।',
+ 'wikieditor-toolbar-tool-table-toomany' => 'à¬à¬¹à¬¿ ଆଦେଶରେ 1000 ରୠଅଧିକ କୋଷ ଥିବା ସାରଣୀ ପà­à¬°à¬¾à¬‡à¬¬à¬¾ ସମà­à¬­à¬¬à¬ªà¬° ନà­à¬¹à­‡à¬ ।',
'wikieditor-toolbar-tool-table-invalidnumber' => 'ଆପଣ à¬à¬• ସଠିକ ଧାଡ଼ି ଓ ସà­à¬¤à¬®à­à¬­ ସଂଖà­à­Ÿà¬¾ ଦେଇ ନାହାନà­à¬¤à¬¿ ।',
'wikieditor-toolbar-tool-table-zero' => 'ଆପଣ କିଛି ଧାଡ଼ି ବ ସà­à¬¤à¬®à­à¬­ ନଥାଇ ସାରଣୀଟିଠପà­à¬°à¬¾à¬‡à¬ªà¬¾à¬°à¬¿à¬¬à­‡ ନାହିଠ।',
'wikieditor-toolbar-tool-replace' => 'ଖୋଜି ବଦଳାଇବେ',
@@ -20204,7 +20702,7 @@ $1:ଉଦାହରଣ.jpg|ଶିରୋନାମା୨',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'ସବୠବଦଳାଇବେ',
'wikieditor-toolbar-tool-replace-close' => 'ବନà­à¬¦ କରିବେ',
'wikieditor-toolbar-tool-replace-nomatch' => 'ଆପଣଙà­à¬• ଖୋଜା କାହା ସଙà­à¬—à­‡ ମେଳ ଖାଇଲା ନାହିà¬',
- 'wikieditor-toolbar-tool-replace-success' => '$1 ଟି ଜାଗାରେ ପà­à¬°à¬¤à¬¿à¬¬à¬¦à¬³ କରାଗଲା ।',
+ 'wikieditor-toolbar-tool-replace-success' => '!$1 {{PLURAL:$1|ପà­à¬°à¬¤à¬¿à¬¬à¬¦à¬³|ପà­à¬°à¬¤à¬¿à¬¬à¬¦à¬³à¬—à­à¬¡à¬¿à¬•}} କରାଗଲା ।',
'wikieditor-toolbar-tool-replace-emptysearch' => 'ଆପଣ କିଛି ଖୋଜିବା ପାଇଠଦେଇନାହାନà­à¬¤à¬¿ ।',
'wikieditor-toolbar-tool-replace-invalidregex' => 'ଆପଣ ଦେଇଥିବା ନିୟମିତ ଅଭିବà­à­Ÿà¬•à­à¬¤à¬¿ ଅବୈଧ ଅଟେ : $1',
'wikieditor-toolbar-section-characters' => 'ବିଶେଷ ସଙà­à¬•à­‡à¬¤',
@@ -20227,6 +20725,9 @@ $1:ଉଦାହରଣ.jpg|ଶିରୋନାମା୨',
'wikieditor-toolbar-characters-page-thai' => 'ଥାଇ',
'wikieditor-toolbar-characters-page-lao' => 'ଲାଓ',
'wikieditor-toolbar-characters-page-khmer' => 'କମେର ଭାଷା',
+ 'wikieditor-toolbar-characters-endash' => 'en ଡà­à­Ÿà¬¾à¬¸',
+ 'wikieditor-toolbar-characters-emdash' => 'em ଡà­à­Ÿà¬¾à¬¸',
+ 'wikieditor-toolbar-characters-minus' => 'ମିନà­à¬—à­à¬¡à¬¿à¬•à¬° ଚିହà­à¬¨',
'wikieditor-toolbar-section-help' => 'ସହଯୋଗ',
'wikieditor-toolbar-help-heading-description' => 'ବିବରଣୀ',
'wikieditor-toolbar-help-heading-syntax' => 'ଆପଣ କଣ ଟାଇପ କରିବେ',
@@ -20290,6 +20791,254 @@ $1:ଉଦାହରଣ.jpg|ଶିରୋନାମା୨',
'wikieditor-toolbar-help-content-indent-result' => 'ସାଧାରଣ ଲେଖା<dl><dd>ମାରà­à¬œà¬¿à¬¨ ଦିଆ ଲେଖା<dl><dd>ମାରà­à¬œà¬¿à¬¨ ଦିଆ ଲେଖା</dd></dl></dd></dl>',
);
+/** Ossetic (Ирон)
+ * @author Bouron
+ */
+$messages['os'] = array(
+ 'wikieditor' => 'Размæцыд викитекÑÑ‚ ивыны интерфейÑ',
+ 'wikieditor-desc' => 'Дæтты уæрæхгæнаг викитекÑÑ‚ ивыны Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ã¦Ð¼Ã¦ бирæ фадатдæттаг модулы',
+ 'wikieditor-wikitext-tab' => 'ВикитекÑÑ‚',
+ 'wikieditor-loading' => 'Æвгæд цæуы...',
+ 'wikieditor-preview-preference' => 'ФарÑæй-фарÑмæ разбакаÑÑ‚ баиу кæнын',
+ 'wikieditor-preview-tab' => 'РазæркаÑÑ‚',
+ 'wikieditor-preview-changes-tab' => 'Ивдтытæ',
+ 'wikieditor-preview-loading' => 'Æвгæд цæуы...',
+ 'wikieditor-previewDialog-preference' => 'РазбакаÑÑ‚Ñ‹ диалог баиу кæнын',
+ 'wikieditor-previewDialog-tab' => 'РазæркаÑÑ‚',
+ 'wikieditor-previewDialog-loading' => 'Æвгæд цæуы...',
+ 'wikieditor-publish-preference' => 'Радгай рауагъд баиу кæнын',
+ 'wikieditor-publish-button-publish' => 'Рауадзын',
+ 'wikieditor-publish-button-cancel' => 'Ðыууадзын',
+ 'wikieditor-publish-dialog-title' => '{{grammar:genitive|{{SITENAME}}}} рауадзын',
+ 'wikieditor-publish-dialog-summary' => 'Ивды бындур (цыбырæй бамбарын кæн цы ивдтытæ бахаÑтай):',
+ 'wikieditor-publish-dialog-minor' => 'ЧыÑыл ивд',
+ 'wikieditor-publish-dialog-watch' => 'Ðцы фарÑмæ цæÑÑ‚ æрдарын',
+ 'wikieditor-publish-dialog-publish' => 'Рауадзын',
+ 'wikieditor-publish-dialog-goback' => 'ФæÑтæмæ',
+ 'wikieditor-template-editor-preference' => 'Формæйыл арæзт хуызæгты ивын баиу кæнын',
+ 'wikieditor-template-editor-dialog-title' => 'Хуызæг ивын',
+ 'wikieditor-template-editor-dialog-submit' => 'Сног кæнын',
+ 'wikieditor-template-editor-dialog-cancel' => 'Ðыууадзын',
+ 'wikieditor-templates-preference' => 'Хуызæгты тухын баиу кæнын',
+ 'wikieditor-toc-preference' => 'Ðавигациимæ Ñæртæ баиу кæнын',
+ 'wikieditor-toc-show' => 'Сæртæ равдиÑын',
+ 'wikieditor-toc-hide' => 'Сæртæ бамбæхÑын',
+ 'wikieditor-toolbar' => 'Ивыны панель',
+ 'wikieditor-toolbar-desc' => 'Æнцонгонд архайдимæ ивыны панель',
+ 'wikieditor-toolbar-preference' => 'Хуыздæргонд ивыны панель баиу кæнын',
+ 'wikieditor-toolbar-dialogs-preference' => 'Æрвитæн Ñ‚Ñ‹ÑÑын, таблицæ æмæ æндæрты диалогтæ баиу кæнын',
+ 'wikieditor-toolbar-hidesig' => 'КъухæрфыÑÑ‚ равзарæн Ñæйраг номдоны фæрÑтæй айÑын',
+ 'wikieditor-toolbar-loading' => 'Æвгæд цæуы...',
+ 'wikieditor-toolbar-tool-bold' => 'Бæзджын',
+ 'wikieditor-toolbar-tool-bold-example' => 'Бæзджын текÑÑ‚',
+ 'wikieditor-toolbar-tool-italic' => 'Къæдз',
+ 'wikieditor-toolbar-tool-italic-example' => 'Къæдз текÑÑ‚',
+ 'wikieditor-toolbar-tool-ilink' => 'Мидæггаг æрвитæн',
+ 'wikieditor-toolbar-tool-ilink-example' => 'Æрвитæны текÑÑ‚',
+ 'wikieditor-toolbar-tool-xlink' => 'Æддаг æрвитæн (Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ http:// ма рох кæн)',
+ 'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com æрвитæны текÑÑ‚',
+ 'wikieditor-toolbar-tool-link' => 'Æрвитæнтæ',
+ 'wikieditor-toolbar-tool-link-title' => 'Æрвитæн бавæрын',
+ 'wikieditor-toolbar-tool-link-int' => 'Вики фарÑмæ',
+ 'wikieditor-toolbar-tool-link-int-target' => 'ÐÑ‹Ñангонд Ñ„Ð°Ñ€Ñ ÐºÃ¦Ð½Ã¦ URL:',
+ 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'ФарÑÑ‹ ном кæнæ URL',
+ 'wikieditor-toolbar-tool-link-int-text' => 'ÆвдиÑынæн текÑÑ‚:',
+ 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'ТекÑÑ‚, кæцы æдыÑÑ‚ æрцæудзæн',
+ 'wikieditor-toolbar-tool-link-ext' => 'Æддаг веб фарÑмæ',
+ 'wikieditor-toolbar-tool-link-ext-target' => 'Æрвитæны URL:',
+ 'wikieditor-toolbar-tool-link-ext-text' => 'Æрвитæны текÑÑ‚:',
+ 'wikieditor-toolbar-tool-link-insert' => 'Æрвитæн бавæрын',
+ 'wikieditor-toolbar-tool-link-cancel' => 'Ðыууадзын',
+ 'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Ð¤Ð°Ñ€Ñ Ð¸Ñ',
+ 'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Ð¤Ð°Ñ€Ñ Ð½Ã¦Ð¹',
+ 'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ÆнæраÑÑ‚ ном',
+ 'wikieditor-toolbar-tool-link-int-target-status-external' => 'Æддаг æрвитæн',
+ 'wikieditor-toolbar-tool-link-int-target-status-loading' => 'ФарÑÑ‹ уæвынад бæрæг цæуы...',
+ 'wikieditor-toolbar-tool-link-int-invalid' => 'Ды цы ном бацамыдтай, уый раÑÑ‚ нæу.',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Ды цы URL бацамыдтай, уый афтæ зыны æмæ æндæр вики фарÑмæ у.
+Фæнды дæ мидæрвитæн Ñуа?',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Мидæггаг æрвитæн',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Æддаг æрвитæн',
+ 'wikieditor-toolbar-tool-link-empty' => 'Ды ницы бафыÑтай цæмæ хъæуы æрвитын, уымæн.',
+ 'wikieditor-toolbar-tool-file' => 'Æфтыд файл',
+ 'wikieditor-toolbar-tool-file-example' => 'Example.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'Файл бавæрын',
+ 'wikieditor-toolbar-file-target' => 'Файлы ном:',
+ 'wikieditor-toolbar-file-caption' => 'ÐÑ„Ñ‹ÑÑ‚:',
+ 'wikieditor-toolbar-file-size' => 'ÐÑ:',
+ 'wikieditor-toolbar-file-float' => 'РаÑÑ‚:',
+ 'wikieditor-toolbar-file-default' => '(разæвæрд)',
+ 'wikieditor-toolbar-file-format' => 'Формат:',
+ 'wikieditor-toolbar-file-format-none' => 'никæцы',
+ 'wikieditor-toolbar-tool-file-insert' => 'БатыÑÑын',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Ðыууадзын',
+ 'wikieditor-toolbar-tool-reference' => 'Фиппаинаг',
+ 'wikieditor-toolbar-tool-reference-example' => 'Фиппаинагы текÑÑ‚ ам бафыÑÑ',
+ 'wikieditor-toolbar-tool-reference-cancel' => 'Ðыууадзын',
+ 'wikieditor-toolbar-tool-reference-title' => 'Фиппаинаг батыÑÑын',
+ 'wikieditor-toolbar-tool-reference-insert' => 'БатыÑÑын',
+ 'wikieditor-toolbar-tool-reference-text' => 'Фиппаинагы текÑÑ‚',
+ 'wikieditor-toolbar-tool-signature' => 'РæÑтæгимæ къухæрфыÑÑ‚',
+ 'wikieditor-toolbar-section-advanced' => 'Фылдæр',
+ 'wikieditor-toolbar-tool-heading' => 'Сæр',
+ 'wikieditor-toolbar-tool-heading-1' => '1-аг бæрц',
+ 'wikieditor-toolbar-tool-heading-2' => '2-аг бæрц',
+ 'wikieditor-toolbar-tool-heading-3' => '3-аг бæрц',
+ 'wikieditor-toolbar-tool-heading-4' => '4-æм бæрц',
+ 'wikieditor-toolbar-tool-heading-5' => '5-æм бæрц',
+ 'wikieditor-toolbar-tool-heading-example' => 'Сæры текÑÑ‚',
+ 'wikieditor-toolbar-group-format' => 'Формат',
+ 'wikieditor-toolbar-tool-ulist' => 'ÐÑ‹Ñангонд номхыгъд',
+ 'wikieditor-toolbar-tool-ulist-example' => 'ÐÑ‹Ñангонд номхыгъды иуæг',
+ 'wikieditor-toolbar-tool-olist' => 'Ðымад номхыгъд',
+ 'wikieditor-toolbar-tool-olist-example' => 'Ðымад номхыгъды иуæг',
+ 'wikieditor-toolbar-tool-indent' => 'ХаÑÑ‚',
+ 'wikieditor-toolbar-tool-indent-example' => 'ХаÑÑ‚ рæнхъ',
+ 'wikieditor-toolbar-tool-nowiki' => 'Æнæ викиформаткæнынæй',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'Æнæформатгонд текÑÑ‚ ам батыÑÑын',
+ 'wikieditor-toolbar-tool-redirect' => 'ÆрвыÑÑ‚',
+ 'wikieditor-toolbar-tool-redirect-example' => 'ныÑангонд фарÑÑ‹ ном',
+ 'wikieditor-toolbar-tool-big' => 'Стыр',
+ 'wikieditor-toolbar-tool-big-example' => 'Стыр текÑÑ‚',
+ 'wikieditor-toolbar-tool-small' => 'Гыццыл',
+ 'wikieditor-toolbar-tool-small-example' => 'Гыццыл текÑÑ‚',
+ 'wikieditor-toolbar-tool-superscript' => 'Уæлрæнхъон',
+ 'wikieditor-toolbar-tool-superscript-example' => 'Уæлрæнхъон текÑÑ‚',
+ 'wikieditor-toolbar-tool-subscript' => 'Дæлрæнхъон',
+ 'wikieditor-toolbar-tool-subscript-example' => 'Дæлрæнхъон текÑÑ‚',
+ 'wikieditor-toolbar-group-insert' => 'БатыÑÑын',
+ 'wikieditor-toolbar-tool-gallery' => 'Ðывты галери',
+ 'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|ФыÑÑ‚1
+$1:Example.jpg|ФыÑÑ‚2',
+ 'wikieditor-toolbar-tool-newline' => 'Ðог рæнхъ',
+ 'wikieditor-toolbar-tool-table' => 'Таблицæ',
+ 'wikieditor-toolbar-tool-table-example-old' => '-
+! Ñæр 1
+! Ñæр 2
+! Ñæр 3
+|-
+| рæнхъ 1, чырæг 1
+| рæнхъ 1, чырæг 2
+| рæнхъ 1, чырæг 3
+|-
+| рæнхъ 2, чырæг 1
+| рæнхъ 2, чырæг 2
+| рæнхъ 2, чырæг 3',
+ 'wikieditor-toolbar-tool-table-example-cell-text' => 'Чырæгы текÑÑ‚',
+ 'wikieditor-toolbar-tool-table-example-header' => 'Сæры текÑÑ‚',
+ 'wikieditor-toolbar-tool-table-title' => 'Рæнхъ батыÑÑын',
+ 'wikieditor-toolbar-tool-table-dimensions-rows' => 'Рæнхъытæ',
+ 'wikieditor-toolbar-tool-table-dimensions-columns' => 'Рæгътæ',
+ 'wikieditor-toolbar-tool-table-dimensions-header' => 'Бафтауын Ñæргонд рæнхъ',
+ 'wikieditor-toolbar-tool-table-wikitable' => 'Ðрæнтимæ Ñфæлындын',
+ 'wikieditor-toolbar-tool-table-sortable' => 'Таблицæ Ñортгæнаг Ñкæнын',
+ 'wikieditor-toolbar-tool-table-example' => 'Цæвиттон',
+ 'wikieditor-toolbar-tool-table-preview' => 'РазæркаÑÑ‚',
+ 'wikieditor-toolbar-tool-table-insert' => 'БатыÑÑын',
+ 'wikieditor-toolbar-tool-table-cancel' => 'Ðыууадзын',
+ 'wikieditor-toolbar-tool-table-toomany' => '$1-æй фылдæр чырæнимæ таблицæтæ ацы диалогы уылты нæй Ñ‚Ñ‹ÑÑæн.', # Fuzzy
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'Рæнхъытæн кæнæ рæгътæн раÑÑ‚ нымæц нæ бацамыдтай.',
+ 'wikieditor-toolbar-tool-table-zero' => 'Дæ бон нæу æнæрæнхъ кæнæ æнæрагъ таблицæ батыÑÑын.',
+ 'wikieditor-toolbar-tool-replace' => 'Ðгурын æмæ баивын',
+ 'wikieditor-toolbar-tool-replace-title' => 'Ðгурын æмæ баивын',
+ 'wikieditor-toolbar-tool-replace-search' => 'Ðгурын:',
+ 'wikieditor-toolbar-tool-replace-replace' => 'Баивын ауыл:',
+ 'wikieditor-toolbar-tool-replace-case' => 'Стыр æмæ гыццыл дамгъæтæ æвзарын',
+ 'wikieditor-toolbar-tool-replace-regex' => 'Рæнхъ регулÑрон ныхаÑыл нымайын',
+ 'wikieditor-toolbar-tool-replace-button-findnext' => 'Иннæ ÑÑарын',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'Баивын',
+ 'wikieditor-toolbar-tool-replace-button-replaceall' => 'Иууылдæр баивын',
+ 'wikieditor-toolbar-tool-replace-close' => 'Сæхгæнын',
+ 'wikieditor-toolbar-tool-replace-nomatch' => 'Ды цы агурыÑ, уымæн ницы фембæлд иÑ.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 ивд(ы) арæзт æрцыд.', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-emptysearch' => 'Ды ницы бацамыдтай агурынæн',
+ 'wikieditor-toolbar-tool-replace-invalidregex' => 'Ды цы реулÑрон Ð½Ñ‹Ñ…Ð°Ñ Ð±Ð°Ñ†Ð°Ð¼Ñ‹Ð´Ñ‚Ð°Ð¹, уый раÑÑ‚ нæу: $1',
+ 'wikieditor-toolbar-section-characters' => 'Сæрмагонд дамгъæтæ',
+ 'wikieditor-toolbar-characters-page-latin' => 'Латинаг',
+ 'wikieditor-toolbar-characters-page-latinextended' => 'Латинаг, уæрæхгонд',
+ 'wikieditor-toolbar-characters-page-ipa' => 'IPA',
+ 'wikieditor-toolbar-characters-page-symbols' => 'Символтæ',
+ 'wikieditor-toolbar-characters-page-greek' => 'Грекъаг',
+ 'wikieditor-toolbar-characters-page-cyrillic' => 'Кириллон',
+ 'wikieditor-toolbar-characters-page-arabic' => 'Ðраббаг',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Ðраббаг, уæрæхгонд',
+ 'wikieditor-toolbar-characters-page-persian' => 'ПерÑайнаг',
+ 'wikieditor-toolbar-characters-page-hebrew' => 'Иврит',
+ 'wikieditor-toolbar-characters-page-bangla' => 'Бенгалаг',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Тамилаг',
+ 'wikieditor-toolbar-characters-page-telugu' => 'Телугуйаг',
+ 'wikieditor-toolbar-characters-page-sinhala' => 'Сингалаг',
+ 'wikieditor-toolbar-characters-page-gujarati' => 'Гуджараттаг',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'Девангариаг',
+ 'wikieditor-toolbar-characters-page-thai' => 'Тайаг',
+ 'wikieditor-toolbar-characters-page-lao' => 'Лаойаг',
+ 'wikieditor-toolbar-characters-page-khmer' => 'Кхмераг',
+ 'wikieditor-toolbar-characters-endash' => 'ен дæш',
+ 'wikieditor-toolbar-characters-emdash' => 'ем дæш',
+ 'wikieditor-toolbar-characters-minus' => 'минуÑÑ‹ ныÑан',
+ 'wikieditor-toolbar-section-help' => 'ÆххуыÑ',
+ 'wikieditor-toolbar-help-heading-description' => 'Ðмынд',
+ 'wikieditor-toolbar-help-heading-syntax' => 'Цы Ñ„Ñ‹ÑÑÑ‹Ñ',
+ 'wikieditor-toolbar-help-heading-result' => 'Цы иÑÑ‹Ñ',
+ 'wikieditor-toolbar-help-page-format' => 'Фæлындын',
+ 'wikieditor-toolbar-help-page-link' => 'Æрвитæнтæ',
+ 'wikieditor-toolbar-help-page-heading' => 'Сæртæ',
+ 'wikieditor-toolbar-help-page-list' => 'Ðомхыгъдтæ',
+ 'wikieditor-toolbar-help-page-file' => 'Файлтæ',
+ 'wikieditor-toolbar-help-page-reference' => 'Фиппаинæгтæ',
+ 'wikieditor-toolbar-help-page-discussion' => 'Тæрхон',
+ 'wikieditor-toolbar-help-content-italic-description' => 'Къæдз',
+ 'wikieditor-toolbar-help-content-italic-syntax' => "''Къæдз текÑÑ‚''",
+ 'wikieditor-toolbar-help-content-italic-result' => '<em>Къæдз текÑÑ‚</em>',
+ 'wikieditor-toolbar-help-content-bold-description' => 'Бæзджын',
+ 'wikieditor-toolbar-help-content-bold-syntax' => "'''Бæзджын текÑÑ‚'''",
+ 'wikieditor-toolbar-help-content-bold-result' => '<strong>Бæзджын текÑÑ‚</strong>',
+ 'wikieditor-toolbar-help-content-bolditalic-description' => 'Бæзджын æмæ къæдз',
+ 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Бæзджын æмæ къæдз текÑÑ‚'''''",
+ 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Бæзджын æмæ къдз текÑÑ‚</em></strong>',
+ 'wikieditor-toolbar-help-content-ilink-description' => 'Мидæггаг æрвитæн',
+ 'wikieditor-toolbar-help-content-ilink-syntax' => '[[ФарÑÑ‹ ном|æрвитæны Ñ„Ñ‹ÑÑ‚]]<br />[[ФарÑÑ‹ ном]]',
+ 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Æрвитæны Ñ„Ñ‹ÑÑ‚</a><br /><a href='#'>ФарÑÑ‹ ном</a>",
+ 'wikieditor-toolbar-help-content-xlink-description' => 'Æддаг æрвитæн',
+ 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Æрвитæны Ñ„Ñ‹ÑÑ‚]<br />[http://www.example.org]<br />http://www.example.org',
+ 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Æрвитæны Ñ„Ñ‹ÑÑ‚</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
+ 'wikieditor-toolbar-help-content-heading2-description' => '2-аг бæрцы Ñæр',
+ 'wikieditor-toolbar-help-content-heading2-syntax' => '== Сæргонд текÑÑ‚ ==',
+ 'wikieditor-toolbar-help-content-heading2-result' => '<h2>Сæргонд текÑÑ‚</h2>',
+ 'wikieditor-toolbar-help-content-heading3-description' => '3-аг бæрцы Ñæр',
+ 'wikieditor-toolbar-help-content-heading3-syntax' => '=== Сæргонд текÑÑ‚ ===',
+ 'wikieditor-toolbar-help-content-heading3-result' => '<h3>Сæргонд текÑÑ‚</h3>',
+ 'wikieditor-toolbar-help-content-heading4-description' => '4-æм бæрцы Ñæр',
+ 'wikieditor-toolbar-help-content-heading4-syntax' => '==== Сæргонд текÑÑ‚ ====',
+ 'wikieditor-toolbar-help-content-heading4-result' => '<h4>Сæргонд текÑÑ‚</h4>',
+ 'wikieditor-toolbar-help-content-heading5-description' => '5-æм бæрцы Ñæр',
+ 'wikieditor-toolbar-help-content-heading5-syntax' => '===== Сæргонд текÑÑ‚ =====',
+ 'wikieditor-toolbar-help-content-heading5-result' => '<h5>Сæргонд текÑÑ‚</h5>',
+ 'wikieditor-toolbar-help-content-ulist-description' => 'ÐÑ‹Ñангонд номхыгъд',
+ 'wikieditor-toolbar-help-content-ulist-syntax' => '* Ðомхыгъды иуæг<br />* Ðомхыгъды иуæг',
+ 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Ðомхыгъды иуæг</li><li>Ðомхыгъды иуæг</li></ul>',
+ 'wikieditor-toolbar-help-content-olist-description' => 'Ðымад номхыгъд',
+ 'wikieditor-toolbar-help-content-olist-syntax' => '# Ðомхыгъды иуæг<br /># Ðомхыгъды иуæг',
+ 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Ðомхыгъды иуæг</li><li>Ðомхыгъды иуæг</li></ol>',
+ 'wikieditor-toolbar-help-content-file-description' => 'Æфтыд файл',
+ 'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Æмбарынггæнæн текÑÑ‚]]',
+ 'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Æмбарынгæнæн текÑÑ‚' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Ð‘Ð°Ð²Ð²Ð°Ñ…Ñ ÐºÃ¦Ð½Ñ‹Ð½' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Æмбарынгæнæн текÑÑ‚</div></div>",
+ 'wikieditor-toolbar-help-content-reference-description' => 'Фиппаинаг',
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'ФарÑÑ‹ текÑÑ‚.&lt;ref name="test"&gt;[http://www.example.org Æрвитæны текÑÑ‚], уæлæмхаÑæн текÑÑ‚.&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-reference-result' => "ФарÑÑ‹ текÑÑ‚.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-rereference-description' => 'ФæÑтæмæ уыцы фиппайнагæй нодзы иу архайд',
+ 'wikieditor-toolbar-help-content-rereference-result' => "ФарÑÑ‹ текÑÑ‚.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-showreferences-description' => 'Фиппаинæгтæ æвдиÑын',
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Æрвитæны текÑÑ‚</a>, уæлæмхаÑæн текÑÑ‚.</li></ol>",
+ 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'РæÑтæгимæ къухæрфыÑÑ‚',
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>ФæÑномыг</a> (<a href='#' title='{{#special:mytalk}}'>ныхаÑ</a>) 15:54, 10 June 2009 (UTC)",
+ 'wikieditor-toolbar-help-content-signature-description' => 'КъухæрфыÑÑ‚',
+ 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>ФæÑномыг</a> (<a href='#' title='{{#special:mytalk}}'>talk</a>)",
+ 'wikieditor-toolbar-help-content-indent-description' => 'ХаÑÑ‚',
+ 'wikieditor-toolbar-help-content-indent-syntax' => 'Ðæуи текÑÑ‚<br />:ХаÑÑ‚ текÑÑ‚<br />::ХаÑÑ‚ текÑÑ‚',
+ 'wikieditor-toolbar-help-content-indent-result' => 'Ðæуи текÑÑ‚<dl><dd>ХаÑÑ‚ текÑÑ‚<dl><dd>ХаÑÑ‚ текÑÑ‚</dd></dl></dd></dl>',
+);
+
/** Deitsch (Deitsch)
* @author Xqt
*/
@@ -20390,8 +21139,10 @@ $messages['pfl'] = array(
* @author Nux
* @author Olgak85
* @author Przemub
+ * @author Rezonansowy
* @author Sp5uhe
* @author ToSter
+ * @author WTM
* @author Wpedzich
*/
$messages['pl'] = array(
@@ -20468,6 +21219,7 @@ $messages['pl'] = array(
'wikieditor-toolbar-file-float' => 'Wyrównywanie:',
'wikieditor-toolbar-file-default' => '(domyślnie)',
'wikieditor-toolbar-file-format' => 'Format:',
+ 'wikieditor-toolbar-file-format-none' => 'brak',
'wikieditor-toolbar-tool-file-insert' => 'Wstaw',
'wikieditor-toolbar-tool-file-cancel' => 'Anuluj',
'wikieditor-toolbar-tool-reference' => 'Przypis',
@@ -20534,7 +21286,7 @@ $1:Example.jpg|Podpis2',
'wikieditor-toolbar-tool-table-preview' => 'PodglÄ…d',
'wikieditor-toolbar-tool-table-insert' => 'Wstaw',
'wikieditor-toolbar-tool-table-cancel' => 'Anuluj',
- 'wikieditor-toolbar-tool-table-toomany' => 'Wstawianie tabeli o większej liczbie kolumn niż $1 nie jest możliwe z użyciem tego okna.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Wstawianie tabeli o większej liczbie komórek niż 1000 nie jest możliwe z użyciem tego okna.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Nie wprowadziłeś poprawnej liczby wierszy i kolumn.',
'wikieditor-toolbar-tool-table-zero' => 'Nie można wstawić tabeli z zerową liczbą wierszy lub kolumn.',
'wikieditor-toolbar-tool-replace' => 'Wyszukaj i zastÄ…p',
@@ -20548,7 +21300,7 @@ $1:Example.jpg|Podpis2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'ZastÄ…p wszystkie',
'wikieditor-toolbar-tool-replace-close' => 'Zamknij',
'wikieditor-toolbar-tool-replace-nomatch' => 'Wyszukiwanego wzorca nie odnaleziono.',
- 'wikieditor-toolbar-tool-replace-success' => 'Wykonano $1 zamian.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Wykonano $1 {{PLURAL:$1|zamianÄ™|zamiany|zamian}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Nie określiłeś niczego do wyszukania.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Nieprawidłowe wyrażenie regularne – $1',
'wikieditor-toolbar-section-characters' => 'Znaki specjalne',
@@ -20571,6 +21323,9 @@ $1:Example.jpg|Podpis2',
'wikieditor-toolbar-characters-page-thai' => 'Tajskie',
'wikieditor-toolbar-characters-page-lao' => 'Laotańskie',
'wikieditor-toolbar-characters-page-khmer' => 'Khmerskie',
+ 'wikieditor-toolbar-characters-endash' => 'krótka kreska',
+ 'wikieditor-toolbar-characters-emdash' => 'długa kreska',
+ 'wikieditor-toolbar-characters-minus' => 'minus',
'wikieditor-toolbar-section-help' => 'Pomoc',
'wikieditor-toolbar-help-heading-description' => 'Opis',
'wikieditor-toolbar-help-heading-syntax' => 'Należy wpisać',
@@ -20637,6 +21392,7 @@ $1:Example.jpg|Podpis2',
/** Piedmontese (Piemontèis)
* @author Borichèt
* @author Dragonòt
+ * @author පසිඳු කà·à·€à·’න්ද
*/
$messages['pms'] = array(
'wikieditor' => 'Antërfacia ëd modìfica avansà ëd wikitext',
@@ -20712,6 +21468,7 @@ $messages['pms'] = array(
'wikieditor-toolbar-file-float' => 'Alineament:',
'wikieditor-toolbar-file-default' => '(stàndard)',
'wikieditor-toolbar-file-format' => 'Formà:',
+ 'wikieditor-toolbar-file-format-none' => 'gnun',
'wikieditor-toolbar-tool-file-insert' => 'Anserì',
'wikieditor-toolbar-tool-file-cancel' => 'Scancela',
'wikieditor-toolbar-tool-reference' => 'Arferiment',
@@ -20778,7 +21535,7 @@ $1:Esempi.jpg|Descrission2',
'wikieditor-toolbar-tool-table-preview' => 'Previsualisassion',
'wikieditor-toolbar-tool-table-insert' => 'Anserì',
'wikieditor-toolbar-tool-table-cancel' => 'Scancelé',
- 'wikieditor-toolbar-tool-table-toomany' => "Anserì na tàula con pì che $1 casele a l'é nen possìbil con cost utiss.",
+ 'wikieditor-toolbar-tool-table-toomany' => "Anserì na tàula con pì che 1000 casele a l'é nen possìbil con costa fnestra.",
'wikieditor-toolbar-tool-table-invalidnumber' => "A l'ha butà un nùmer ëd linie o colòne nen bon.",
'wikieditor-toolbar-tool-table-zero' => 'A peul pa anserì na tàula sensa gnun-a linia o colòna',
'wikieditor-toolbar-tool-replace' => 'Sërché e rampiassé',
@@ -20792,7 +21549,7 @@ $1:Esempi.jpg|Descrission2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Rampiassé tut',
'wikieditor-toolbar-tool-replace-close' => 'Sara',
'wikieditor-toolbar-tool-replace-nomatch' => "Soa arserca a l'ha nen trovà 'd corëspondense.",
- 'wikieditor-toolbar-tool-replace-success' => '$1 sostitussion fàite.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|sostitussion}} fàite.',
'wikieditor-toolbar-tool-replace-emptysearch' => "A l'ha butà gnun test da arserché.",
'wikieditor-toolbar-tool-replace-invalidregex' => "L'espression regolar ch'a l'ha anserì a l'é nen bon-a: $1",
'wikieditor-toolbar-section-characters' => 'Caràter speciaj',
@@ -20815,6 +21572,9 @@ $1:Esempi.jpg|Descrission2',
'wikieditor-toolbar-characters-page-thai' => 'Thai',
'wikieditor-toolbar-characters-page-lao' => 'Lao',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-characters-endash' => 'tratin en',
+ 'wikieditor-toolbar-characters-emdash' => 'tratin em',
+ 'wikieditor-toolbar-characters-minus' => 'segn meno',
'wikieditor-toolbar-section-help' => 'Agiut',
'wikieditor-toolbar-help-heading-description' => 'Descrission',
'wikieditor-toolbar-help-heading-syntax' => "Lòn ch'a bat",
@@ -20879,6 +21639,7 @@ $1:Esempi.jpg|Descrission2',
);
/** Western Punjabi (پنجابی)
+ * @author BMRG14
* @author Khalid Mahmood
*/
$messages['pnb'] = array(
@@ -21012,7 +21773,7 @@ $1:ادھارن.جےپیجی|سرخی2',
'wikieditor-toolbar-tool-table-preview' => 'کچا کم',
'wikieditor-toolbar-tool-table-insert' => 'رلاؤ',
'wikieditor-toolbar-tool-table-cancel' => 'واپس',
- 'wikieditor-toolbar-tool-table-toomany' => '$1 توں Ø²ÛŒØ§Ø¯Û ÚˆØ¨ÛŒØ§Úº ایس ٹیبل Ú† پانا ایس Ú©Ù… Ú† نئیں Ûوسکدا۔',
+ 'wikieditor-toolbar-tool-table-toomany' => '$1 توں Ø²ÛŒØ§Ø¯Û ÚˆØ¨ÛŒØ§Úº ایس ٹیبل Ú† پانا ایس Ú©Ù… Ú† نئیں Ûوسکدا۔', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'تساں نیں کوئی ٹھیک کالم یا لیکاں نئیں پایاں۔',
'wikieditor-toolbar-tool-table-zero' => 'صÙر قطار یا کالم نئیں پاا جاسکدا۔',
'wikieditor-toolbar-tool-replace' => 'لبو تے بدلو۔',
@@ -21025,7 +21786,7 @@ $1:ادھارن.جےپیجی|سرخی2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'سارے بدلو',
'wikieditor-toolbar-tool-replace-close' => 'بند کرو',
'wikieditor-toolbar-tool-replace-nomatch' => 'تھاڈی کھوج کسے نال نئیں رلدی',
- 'wikieditor-toolbar-tool-replace-success' => '$1 بدلیا.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 بدلیا.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'جوڑ لئی تساں کوئی شے نئیں لکھی۔',
'wikieditor-toolbar-tool-replace-invalidregex' => 'ایکسپریشن جیÛÚ‘ÛŒ تساں پائی اے ٹھیک نغیں:$1',
'wikieditor-toolbar-section-characters' => 'خاص کیریکٹرز',
@@ -21037,7 +21798,7 @@ $1:ادھارن.جےپیجی|سرخی2',
'wikieditor-toolbar-characters-page-cyrillic' => 'سریلیک',
'wikieditor-toolbar-characters-page-arabic' => 'عربی',
'wikieditor-toolbar-characters-page-arabicextended' => 'عربی ودویں',
- 'wikieditor-toolbar-characters-page-persian' => 'Ùارسی',
+ 'wikieditor-toolbar-characters-page-persian' => 'پارسی',
'wikieditor-toolbar-characters-page-hebrew' => 'عبرانی',
'wikieditor-toolbar-characters-page-bangla' => 'بنگالی',
'wikieditor-toolbar-characters-page-telugu' => 'تلیگو',
@@ -21331,24 +22092,26 @@ $messages['ps'] = array(
* @author Hamilton Abreu
* @author Helder.wiki
* @author João Sousa
+ * @author Luckas
* @author Luckas Blade
* @author Malafaya
* @author MetalBrasil
* @author SandroHc
+ * @author Waldir
* @author 555
*/
$messages['pt'] = array(
'wikieditor' => 'Interface avançada de edição de texto wiki',
'wikieditor-desc' => 'Fornece uma interface extensível de edição de texto wiki e vários módulos funcionais',
'wikieditor-wikitext-tab' => 'Texto Wiki',
- 'wikieditor-loading' => 'A carregar',
+ 'wikieditor-loading' => 'A carregar…',
'wikieditor-preview-preference' => 'Possibilitar antevisão lado a lado',
'wikieditor-preview-tab' => 'Antevisão',
'wikieditor-preview-changes-tab' => 'Alterações',
- 'wikieditor-preview-loading' => 'A carregar...',
+ 'wikieditor-preview-loading' => 'A carregar…',
'wikieditor-previewDialog-preference' => 'Activar o diálogo de antevisão',
'wikieditor-previewDialog-tab' => 'Antevisão',
- 'wikieditor-previewDialog-loading' => 'A carregar...',
+ 'wikieditor-previewDialog-loading' => 'A carregar…',
'wikieditor-publish-preference' => 'Possibilitar publicação passo a passo',
'wikieditor-publish-button-publish' => 'Publicar',
'wikieditor-publish-button-cancel' => 'Cancelar',
@@ -21360,7 +22123,7 @@ $messages['pt'] = array(
'wikieditor-publish-dialog-goback' => 'Voltar',
'wikieditor-template-editor-preference' => 'Possibilitar edição de predefinições com base em formulários',
'wikieditor-template-editor-dialog-title' => 'Editar predefinição',
- 'wikieditor-template-editor-dialog-submit' => 'Actualizar',
+ 'wikieditor-template-editor-dialog-submit' => 'Atualizar',
'wikieditor-template-editor-dialog-cancel' => 'Cancelar',
'wikieditor-templates-preference' => 'Possibilitar a recolha e expansão de predefinições',
'wikieditor-toc-preference' => 'Possibilitar tabela de conteúdo navegável',
@@ -21371,7 +22134,7 @@ $messages['pt'] = array(
'wikieditor-toolbar-preference' => 'Activar a barra de ferramentas de edição melhorada',
'wikieditor-toolbar-dialogs-preference' => 'Possibilitar diálogos de inserção de links, tabelas e outros',
'wikieditor-toolbar-hidesig' => 'Esconder o botão da assinatura nas páginas do espaço nominal principal',
- 'wikieditor-toolbar-loading' => 'A carregar...',
+ 'wikieditor-toolbar-loading' => 'A carregar…',
'wikieditor-toolbar-tool-bold' => 'Negrito',
'wikieditor-toolbar-tool-bold-example' => 'Texto a negrito',
'wikieditor-toolbar-tool-italic' => 'Itálico',
@@ -21477,7 +22240,7 @@ $1:Exemplo2.jpg|Legenda2',
'wikieditor-toolbar-tool-table-preview' => 'Antevisão',
'wikieditor-toolbar-tool-table-insert' => 'Inserir',
'wikieditor-toolbar-tool-table-cancel' => 'Cancelar',
- 'wikieditor-toolbar-tool-table-toomany' => 'Neste diálogo não é possível inserir uma tabela com mais de $1 colunas.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Neste diálogo não é possível inserir uma tabela com mais de $1 colunas.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Não introduziu um número válido de linhas ou colunas.',
'wikieditor-toolbar-tool-table-zero' => 'Não pode inserir uma tabela com zero linhas ou colunas',
'wikieditor-toolbar-tool-replace' => 'Pesquisar e substituir',
@@ -21491,7 +22254,7 @@ $1:Exemplo2.jpg|Legenda2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Substituir todos',
'wikieditor-toolbar-tool-replace-close' => 'Fechar',
'wikieditor-toolbar-tool-replace-nomatch' => 'A sua pesquisa não produziu resultados.',
- 'wikieditor-toolbar-tool-replace-success' => 'Substituições realizadas: $1.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Substituições realizadas: $1.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Não introduziu nada para pesquisar.',
'wikieditor-toolbar-tool-replace-invalidregex' => "A expressão regular ''(regex)'' que introduziu é inválida: $1",
'wikieditor-toolbar-section-characters' => 'Caracteres especiais',
@@ -21520,7 +22283,7 @@ $1:Exemplo2.jpg|Legenda2',
'wikieditor-toolbar-help-heading-result' => 'Resultado',
'wikieditor-toolbar-help-page-format' => 'Formatação',
'wikieditor-toolbar-help-page-link' => 'Links',
- 'wikieditor-toolbar-help-page-heading' => 'Títulos de secções',
+ 'wikieditor-toolbar-help-page-heading' => 'Cabeçalhos',
'wikieditor-toolbar-help-page-list' => 'Listas',
'wikieditor-toolbar-help-page-file' => 'Ficheiros',
'wikieditor-toolbar-help-page-reference' => 'Referências',
@@ -21730,7 +22493,7 @@ $1:Exemplo.jpg|Legenda2',
'wikieditor-toolbar-tool-table-preview' => 'Pré-visualização',
'wikieditor-toolbar-tool-table-insert' => 'Inserir',
'wikieditor-toolbar-tool-table-cancel' => 'Cancelar',
- 'wikieditor-toolbar-tool-table-toomany' => 'Não é possível inserir uma tabela com mais de $1 colunas com esta interface.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Não é possível inserir uma tabela com mais de $1 colunas com esta interface.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Você não introduziu um número válido de linhas ou colunas.',
'wikieditor-toolbar-tool-table-zero' => 'Você não pode inserir uma tabela com zero linhas ou colunas.',
'wikieditor-toolbar-tool-replace' => 'Localizar e substituir',
@@ -21744,7 +22507,7 @@ $1:Exemplo.jpg|Legenda2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Substituir todos',
'wikieditor-toolbar-tool-replace-close' => 'Fechar',
'wikieditor-toolbar-tool-replace-nomatch' => 'Não houve coincidências para a sua pesquisa.',
- 'wikieditor-toolbar-tool-replace-success' => 'Substituições realizadas: $1.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Substituições realizadas: $1.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Você não introduziu nada para buscar.',
'wikieditor-toolbar-tool-replace-invalidregex' => "A expressão regular ''(regex)'' que você introduziu é inválida: $1",
'wikieditor-toolbar-section-characters' => 'Caracteres especiais',
@@ -21904,6 +22667,12 @@ $messages['qu'] = array(
'wikieditor-toolbar-file-target' => 'Willañiqip sutin:',
'wikieditor-toolbar-file-caption' => "Ch'uyanchaku:",
'wikieditor-toolbar-file-size' => 'Hatun kaynin:',
+ 'wikieditor-toolbar-file-float' => 'Sinruchay:',
+ 'wikieditor-toolbar-file-default' => '(kikinmanta)',
+ 'wikieditor-toolbar-file-format' => "Rikch'akuy:",
+ 'wikieditor-toolbar-file-format-none' => 'mana imapas',
+ 'wikieditor-toolbar-tool-file-insert' => "Sat'iy",
+ 'wikieditor-toolbar-tool-file-cancel' => 'Ama niy',
'wikieditor-toolbar-tool-reference' => 'Pukyumanta willay',
'wikieditor-toolbar-tool-reference-example' => "Kayman siki willapuy qillqata sat'iy",
'wikieditor-toolbar-tool-reference-cancel' => 'Ama niy',
@@ -21968,7 +22737,7 @@ $1:Qhawarichiy.jpg|Ch'uyanchay2",
'wikieditor-toolbar-tool-table-preview' => 'Ñawpaqta qhawallay',
'wikieditor-toolbar-tool-table-insert' => "Sat'iy",
'wikieditor-toolbar-tool-table-cancel' => 'Ama niy',
- 'wikieditor-toolbar-tool-table-toomany' => "Kay willanakuypiqa manam $1-manta aswan wachu ukhukunata sat'iyta atinkichu.",
+ 'wikieditor-toolbar-tool-table-toomany' => "Kay willanakuypiqa manam waranqamanta aswan wachu ukhukunata sat'iyta atinkichu.",
'wikieditor-toolbar-tool-table-invalidnumber' => 'Sinrukunapaq icha wachukunapaq allin yupayta manam yaykuchirqunkichu.',
'wikieditor-toolbar-tool-table-zero' => "Sinrunnaq (0 sinruyuq) icha wachunnaq (0 wachuyuq) wachuchasqata manam sat'iyta atinkichu.",
'wikieditor-toolbar-tool-replace' => 'Maskaspa huknachay',
@@ -21978,10 +22747,11 @@ $1:Qhawarichiy.jpg|Ch'uyanchay2",
'wikieditor-toolbar-tool-replace-case' => 'Hatunpas uchuypas sanampata qhawaykuy',
'wikieditor-toolbar-tool-replace-regex' => "Taripana qillqata allinlla nisqata hina hat'alliy",
'wikieditor-toolbar-tool-replace-button-findnext' => 'Qatiqta maskay',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'Huknachay',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Tukuykunata huknachay',
'wikieditor-toolbar-tool-replace-close' => "Wichq'ay",
'wikieditor-toolbar-tool-replace-nomatch' => 'Maskayniykiwan manam imatapas taripankichu.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 kuti huknachasqam.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|kuti}} huknachasqam.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Manam ima maskanatapas yaykuchirqunkichu.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Qusqayki patanchay qillqananchaqa manam allinchu: $1',
'wikieditor-toolbar-section-characters' => 'Sapaq sanampakuna',
@@ -21992,15 +22762,21 @@ $1:Qhawarichiy.jpg|Ch'uyanchay2",
'wikieditor-toolbar-characters-page-greek' => 'Grigu',
'wikieditor-toolbar-characters-page-cyrillic' => 'Kirilitsa',
'wikieditor-toolbar-characters-page-arabic' => 'Arabya',
+ 'wikieditor-toolbar-characters-page-arabicextended' => "Arabya mast'arisqa",
'wikieditor-toolbar-characters-page-persian' => 'Pharsi',
'wikieditor-toolbar-characters-page-hebrew' => 'Iwriyu',
'wikieditor-toolbar-characters-page-bangla' => 'Banla',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamil',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
'wikieditor-toolbar-characters-page-gujarati' => 'Guyarati',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'Devanagari',
'wikieditor-toolbar-characters-page-thai' => 'Thay',
'wikieditor-toolbar-characters-page-lao' => 'Lao',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-characters-endash' => 'kuru aspi',
+ 'wikieditor-toolbar-characters-emdash' => 'suni aspi',
+ 'wikieditor-toolbar-characters-minus' => 'qichuy sanancha',
'wikieditor-toolbar-section-help' => 'Yanapa',
'wikieditor-toolbar-help-heading-description' => "T'iktuna",
'wikieditor-toolbar-help-heading-syntax' => 'Qillqasqayki kaq',
@@ -22145,6 +22921,7 @@ $messages['ro'] = array(
'wikieditor-toolbar-file-float' => 'Aliniere:',
'wikieditor-toolbar-file-default' => '(implicit)',
'wikieditor-toolbar-file-format' => 'Format:',
+ 'wikieditor-toolbar-file-format-none' => 'niciunul',
'wikieditor-toolbar-tool-file-insert' => 'Inserează',
'wikieditor-toolbar-tool-file-cancel' => 'Revocare',
'wikieditor-toolbar-tool-reference' => 'Referință',
@@ -22211,7 +22988,7 @@ $1:Exemplu.jpg|Descriere 2',
'wikieditor-toolbar-tool-table-preview' => 'Previzualizare',
'wikieditor-toolbar-tool-table-insert' => 'Inserează',
'wikieditor-toolbar-tool-table-cancel' => 'Revocare',
- 'wikieditor-toolbar-tool-table-toomany' => 'Inserarea unui tabel cu mai mult de $1 celule nu este posibilă cu această unealtă.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Inserarea unui tabel cu mai mult de 1000 de celule nu este posibilă cu această unealtă.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Nu ați introdus un număr valabil de rânduri sau coloane.',
'wikieditor-toolbar-tool-table-zero' => 'Nu puteți introduce un tabel cu zero rânduri sau coloane.',
'wikieditor-toolbar-tool-replace' => 'Căutare și înlocuire',
@@ -22225,7 +23002,7 @@ $1:Exemplu.jpg|Descriere 2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Înlocuiește toate',
'wikieditor-toolbar-tool-replace-close' => 'ÃŽnchide',
'wikieditor-toolbar-tool-replace-nomatch' => 'Căutarea dumneavoastră nu a generat niciun rezultat.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 înlocuire(i) efectuată(e).',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|înlocuire efectuată|înlocuiri efectuate|de înlocuiri efectuate}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Nu ați introdus niciun cuvânt după care să căutați',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Expresia regulată introdusă nu este corectă: $1',
'wikieditor-toolbar-section-characters' => 'Caractere speciale',
@@ -22248,6 +23025,9 @@ $1:Exemplu.jpg|Descriere 2',
'wikieditor-toolbar-characters-page-thai' => 'Thailandeză',
'wikieditor-toolbar-characters-page-lao' => 'Laoțiană',
'wikieditor-toolbar-characters-page-khmer' => 'Khmeră',
+ 'wikieditor-toolbar-characters-endash' => 'linie de pauză (en dash)',
+ 'wikieditor-toolbar-characters-emdash' => 'linie de pauză (em dash)',
+ 'wikieditor-toolbar-characters-minus' => 'semnul minus',
'wikieditor-toolbar-section-help' => 'Ajutor',
'wikieditor-toolbar-help-heading-description' => 'Descriere',
'wikieditor-toolbar-help-heading-syntax' => 'Ceea ce scrieți',
@@ -22389,6 +23169,7 @@ $messages['roa-tara'] = array(
'wikieditor-toolbar-file-float' => 'Allineamende:',
'wikieditor-toolbar-file-default' => '(de base)',
'wikieditor-toolbar-file-format' => 'Formate:',
+ 'wikieditor-toolbar-file-format-none' => 'ninde',
'wikieditor-toolbar-tool-file-insert' => "'Nzerisce",
'wikieditor-toolbar-tool-file-cancel' => 'Annulle',
'wikieditor-toolbar-tool-reference' => 'Riferimende',
@@ -22455,7 +23236,7 @@ $1:Example.jpg|Titele2',
'wikieditor-toolbar-tool-table-preview' => 'Andeprime',
'wikieditor-toolbar-tool-table-insert' => 'Inzerisce',
'wikieditor-toolbar-tool-table-cancel' => 'Annulle',
- 'wikieditor-toolbar-tool-table-toomany' => "Inzerimende de 'na tabbelle cu cchiù de $1 celle non g'è possibbele cu stu dialoghe",
+ 'wikieditor-toolbar-tool-table-toomany' => "'U 'nzerimende de 'na tabbelle cu cchiù de 1000 celle non g'è possibbele cu stu dialoghe.",
'wikieditor-toolbar-tool-table-invalidnumber' => "Tu non g'è mise 'nu numere valide de righe o culonne.",
'wikieditor-toolbar-tool-table-zero' => "Tu non ge puè inzerì 'na tabbelle cù zero righe o culonne.",
'wikieditor-toolbar-tool-replace' => 'Cirche e sostituisce',
@@ -22469,7 +23250,7 @@ $1:Example.jpg|Titele2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Sostituisce tutte',
'wikieditor-toolbar-tool-replace-close' => 'Chiude',
'wikieditor-toolbar-tool-replace-nomatch' => "'A ricerca toje non g'à acchiate ninde.",
- 'wikieditor-toolbar-tool-replace-success' => '$1 sostituzione (sostituziune) fatte.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|sostituzione|sostituziune}} fatte.',
'wikieditor-toolbar-tool-replace-emptysearch' => "Tu non g'è mise ninde pe fà 'a ricerche.",
'wikieditor-toolbar-tool-replace-invalidregex' => "L'espressione regolare ca tu è 'nzerite jè invalide: $1",
'wikieditor-toolbar-section-characters' => 'Carattere speciale',
@@ -22492,6 +23273,9 @@ $1:Example.jpg|Titele2',
'wikieditor-toolbar-characters-page-thai' => 'Thai',
'wikieditor-toolbar-characters-page-lao' => 'Lao',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-characters-endash' => 'trattine en',
+ 'wikieditor-toolbar-characters-emdash' => 'trattine em',
+ 'wikieditor-toolbar-characters-minus' => 'segne mene',
'wikieditor-toolbar-section-help' => 'Ajiute',
'wikieditor-toolbar-help-heading-description' => 'Descrizione',
'wikieditor-toolbar-help-heading-syntax' => 'Cè è scritte',
@@ -22558,6 +23342,7 @@ $1:Example.jpg|Titele2',
/** Russian (руÑÑкий)
* @author Alexandr Efremov
* @author Claymore
+ * @author DCamer
* @author David1010
* @author Dim Grits
* @author Eleferen
@@ -22642,6 +23427,7 @@ $messages['ru'] = array(
'wikieditor-toolbar-file-float' => 'Выравнивание:',
'wikieditor-toolbar-file-default' => '(по умолчанию)',
'wikieditor-toolbar-file-format' => 'Формат:',
+ 'wikieditor-toolbar-file-format-none' => 'никакой',
'wikieditor-toolbar-tool-file-insert' => 'Ð’Ñтавка',
'wikieditor-toolbar-tool-file-cancel' => 'Отмена',
'wikieditor-toolbar-tool-reference' => 'СноÑка',
@@ -22709,7 +23495,7 @@ $1:Example.jpg|ОпиÑание2',
'wikieditor-toolbar-tool-table-insert' => 'Ð’Ñтавить',
'wikieditor-toolbar-tool-table-cancel' => 'Отмена',
'wikieditor-toolbar-tool-table-example-text' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut nec purus diam. Sed aliquam imperdiet nunc quis lacinia. Donec rutrum consectetur placerat. Sed volutpat neque non purus faucibus id ultricies enim euismod.',
- 'wikieditor-toolbar-tool-table-toomany' => 'Этот диалог не позволÑет вÑтавить таблицу размером более $1 Ñчеек.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Этот диалог не позволÑет вÑтавить таблицу размером более 1000 Ñчеек.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ð’Ñ‹ не указали корректное количеÑтво Ñтрок или Ñтолбцов.',
'wikieditor-toolbar-tool-table-zero' => 'Ð’Ñ‹ не можете вÑтавить таблицу Ñ Ð½ÑƒÐ»ÐµÐ²Ñ‹Ð¼ количеÑтвом Ñтрок или Ñтолбцов.',
'wikieditor-toolbar-tool-replace' => 'ПоиÑк и замена',
@@ -22723,7 +23509,7 @@ $1:Example.jpg|ОпиÑание2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Заменить вÑе',
'wikieditor-toolbar-tool-replace-close' => 'Закрыть',
'wikieditor-toolbar-tool-replace-nomatch' => 'По вашему запроÑу ничего не найдено.',
- 'wikieditor-toolbar-tool-replace-success' => 'Произведено замен: $1.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Произведено замен: $1.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ð’Ñ‹ не указали что Ñледует иÑкать.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Введённое вами регулÑрное выражение ошибочно: $1',
'wikieditor-toolbar-section-characters' => 'СпецÑимволы',
@@ -22746,6 +23532,8 @@ $1:Example.jpg|ОпиÑание2',
'wikieditor-toolbar-characters-page-thai' => 'ТайÑкие',
'wikieditor-toolbar-characters-page-lao' => 'ЛаоÑÑкие',
'wikieditor-toolbar-characters-page-khmer' => 'КхмерÑкие',
+ 'wikieditor-toolbar-characters-emdash' => 'длинное тире',
+ 'wikieditor-toolbar-characters-minus' => 'знак минуÑ',
'wikieditor-toolbar-section-help' => 'Справка',
'wikieditor-toolbar-help-heading-description' => 'ОпиÑание',
'wikieditor-toolbar-help-heading-syntax' => 'Что вы вводите',
@@ -22952,7 +23740,7 @@ $1:Example.jpg|ОпиÑ2',
'wikieditor-toolbar-tool-table-preview' => 'ÐаглÑд',
'wikieditor-toolbar-tool-table-insert' => 'Вложыти',
'wikieditor-toolbar-tool-table-cancel' => 'Сторно',
- 'wikieditor-toolbar-tool-table-toomany' => 'Тот діалоґ не доволює вложыти таблицю з веце Ñк $1 коморками.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Тот діалоґ не доволює вложыти таблицю з веце Ñк $1 коморками.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'МуÑите задати платне чіÑло Ñ€Ñдків або Ñтовпців.',
'wikieditor-toolbar-tool-table-zero' => 'Ðе можете вложыти таблицю з нуловым почтом Ñ€Ñдків або Ñтовпців.',
'wikieditor-toolbar-tool-replace' => 'Ðайти Ñ– нагородити',
@@ -22965,7 +23753,7 @@ $1:Example.jpg|ОпиÑ2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Замінити вшытко',
'wikieditor-toolbar-tool-replace-close' => 'Заперти',
'wikieditor-toolbar-tool-replace-nomatch' => 'Заданому глÑданю ніч не одповідать.',
- 'wikieditor-toolbar-tool-replace-success' => 'Зроблено замін: $1.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Зроблено замін: $1.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'МуÑите увеÑти што ÑÑ Ð¼Ð°Ñ” глÑдати.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Заданый реґуларный выраз не є платный: $1',
'wikieditor-toolbar-section-characters' => 'Шпеціалны Ñімболы',
@@ -23195,7 +23983,7 @@ $1:उदाहरणमà¥.jpg|चितà¥à¤°à¤¶à¥€à¤°à¥à¤·à¤•à¤®à¥à¥¨',
'wikieditor-toolbar-tool-table-preview' => 'पà¥à¤°à¤¾à¤—à¥à¤¦à¥ƒà¤¶à¥à¤¯à¤®à¥',
'wikieditor-toolbar-tool-table-insert' => 'योजà¥à¤¯à¤¤à¤¾à¤®à¥',
'wikieditor-toolbar-tool-table-cancel' => 'निरसà¥à¤¯à¤¤à¤¾à¤®à¥',
- 'wikieditor-toolbar-tool-table-toomany' => '$1 अपेकà¥à¤·à¤¯à¤¾ अधिकांशयà¥à¤•à¥à¤¤à¤‚ कोषà¥à¤Ÿà¤•à¤®à¥ असà¥à¤®à¤¿à¤¨à¥ योजयितà¥à¤‚ न शकà¥à¤¯à¤¤à¥‡ ।',
+ 'wikieditor-toolbar-tool-table-toomany' => '$1 अपेकà¥à¤·à¤¯à¤¾ अधिकांशयà¥à¤•à¥à¤¤à¤‚ कोषà¥à¤Ÿà¤•à¤®à¥ असà¥à¤®à¤¿à¤¨à¥ योजयितà¥à¤‚ न शकà¥à¤¯à¤¤à¥‡ ।', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'सà¥à¤¤à¤®à¥à¤­à¤¾à¤¨à¤¾à¤‚ पङà¥à¤•à¥à¤¤à¥€à¤¨à¤¾à¤‚ वा योगà¥à¤¯à¤¸à¤™à¥à¤–à¥à¤¯à¤¾ भवता न योजिता ।',
'wikieditor-toolbar-tool-table-zero' => 'शूनà¥à¤¯à¤¸à¤™à¥à¤–à¥à¤¯à¤¾à¤¯à¥à¤•à¥à¤¤à¤¾ पङà¥à¤•à¥à¤¤à¤¿à¤ƒ सà¥à¤¤à¤®à¥à¤­à¥‹ वा योजयितà¥à¤‚ न शकà¥à¤¯à¤¤à¥‡ ।',
'wikieditor-toolbar-tool-replace' => 'अनà¥à¤µà¤¿à¤·à¥à¤¯à¤¤à¤¾à¤‚ परिवरà¥à¤¤à¥à¤¯à¤¤à¤¾à¤žà¥à¤š',
@@ -23209,7 +23997,7 @@ $1:उदाहरणमà¥.jpg|चितà¥à¤°à¤¶à¥€à¤°à¥à¤·à¤•à¤®à¥à¥¨',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'सरà¥à¤µà¤‚ परिवरà¥à¤¤à¥à¤¯à¤¤à¤¾à¤®à¥',
'wikieditor-toolbar-tool-replace-close' => 'पिदधातà¥',
'wikieditor-toolbar-tool-replace-nomatch' => 'भवतः अनà¥à¤µà¥‡à¤·à¤£à¤¸à¥à¤¯ फलं न पà¥à¤°à¤¾à¤ªà¥à¤¤à¤®à¥ ।',
- 'wikieditor-toolbar-tool-replace-success' => '$1 पà¥à¤°à¤¤à¤¿à¤¸à¥à¤¥à¤¾à¤ªà¤¨à¤‚ जातमॠ।',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 पà¥à¤°à¤¤à¤¿à¤¸à¥à¤¥à¤¾à¤ªà¤¨à¤‚ जातमॠ।', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'अनà¥à¤µà¥‡à¤·à¤£à¤¾à¤¯ न किञà¥à¤šà¤¿à¤¤à¥ सूचितमॠ।',
'wikieditor-toolbar-tool-replace-invalidregex' => 'भवता योजिता नियताभिवà¥à¤¯à¤•à¥à¤¤à¤¿à¤ƒ अमानà¥à¤¯à¤¾ विदà¥à¤¯à¤¤à¥‡ : $1',
'wikieditor-toolbar-section-characters' => 'विशेष-वरà¥à¤£à¤¾à¤¨à¤¿',
@@ -23428,7 +24216,7 @@ $1:Example.jpg|Сурук2',
'wikieditor-toolbar-tool-table-preview' => 'Ð­Ñ€Ð´Ñ ÐºÓ©Ñ€Ò¯Ò¯',
'wikieditor-toolbar-tool-table-insert' => 'КиллÑÑ€ÑргÑ',
'wikieditor-toolbar-tool-table-cancel' => 'БигÑргÑтимÑ',
- 'wikieditor-toolbar-tool-table-toomany' => 'Бу диалог $1 килиÑккÑÑ‚Ñ‚Ñн ордугу угары көҥүллÑÑбÑÑ‚.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Бу диалог $1 килиÑккÑÑ‚Ñ‚Ñн ордугу угары көҥүллÑÑбÑÑ‚.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'УÑтуруока уонна холуоҥка көҥүллÑнÑÑ€ ахÑаанын туруорбатаххын.',
'wikieditor-toolbar-tool-table-zero' => 'УÑтуруоката ÑбÑÑ‚ÑÑ€ холуоҥката нуулга Ñ‚ÑҥнÑÒ»ÑÑ€ таабылы угар кыаҕын Ñуох.',
'wikieditor-toolbar-tool-replace' => 'Көрдөөһүн уонна уларытыы',
@@ -23441,7 +24229,7 @@ $1:Example.jpg|Сурук2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Барытын уларыт',
'wikieditor-toolbar-tool-replace-close' => 'Сап',
'wikieditor-toolbar-tool-replace-nomatch' => 'Эн көрдөбүлгүнÑн туох да көÑтүбÑÑ‚Ñ.',
- 'wikieditor-toolbar-tool-replace-success' => 'Бачча уларытыы оҥоһулунна: $1.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Бачча уларытыы оҥоһулунна: $1.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Тугу көрдүүргүн ÑппÑÑ‚Ñххин.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Суруйбут Ñтииҥ Ñыыһалаах: $1',
'wikieditor-toolbar-section-characters' => 'Ðнал бÑлиÑлÑÑ€',
@@ -23641,7 +24429,7 @@ $1:Esèmpiu.jpg|Didascalia2',
'wikieditor-toolbar-tool-table-preview' => 'Antiprima',
'wikieditor-toolbar-tool-table-insert' => 'Inserta',
'wikieditor-toolbar-tool-table-cancel' => 'Annudda',
- 'wikieditor-toolbar-tool-table-toomany' => 'Cun custu cuadru de allega no est possìbile insertare una tabella cun prus de $1 tzellas.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Cun custu cuadru de allega no est possìbile insertare una tabella cun prus de $1 tzellas.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'No as insertadu unu nùmeru vàlidu de lìnias o colunnas.',
'wikieditor-toolbar-tool-table-zero' => 'Non podes insertare una tabella cun zeru lìnias o colunnas.',
'wikieditor-toolbar-tool-replace' => 'Chirca e rimpiatza',
@@ -23654,7 +24442,7 @@ $1:Esèmpiu.jpg|Didascalia2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Rimpiatza totu',
'wikieditor-toolbar-tool-replace-close' => 'Serra',
'wikieditor-toolbar-tool-replace-nomatch' => 'Sa chirca tua no at agatadu cointzidèntzias.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 rimpiatzadu/os.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 rimpiatzadu/os.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'No as indicadu ite chircare.',
'wikieditor-toolbar-tool-replace-invalidregex' => "S'espressione regulare insertada no est vàlida: $1",
'wikieditor-toolbar-section-characters' => 'Caràteres spetziales',
@@ -23877,7 +24665,7 @@ $1:Example.jpg|Didascalia2',
'wikieditor-toolbar-tool-table-preview' => 'Antiprima',
'wikieditor-toolbar-tool-table-insert' => 'Nsirìsci',
'wikieditor-toolbar-tool-table-cancel' => 'Annulla',
- 'wikieditor-toolbar-tool-table-toomany' => 'Cu stu strummentu nun è pussìbbili nsirìri na tabbella cu cchiossai di $1 celli',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Cu stu strummentu nun è pussìbbili nsirìri na tabbella cu cchiossai di $1 celli', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Nun andicasti nu nùmmuru vâliddu di ligni o di culonni',
'wikieditor-toolbar-tool-table-zero' => 'Nun puoi nsiriri na tabbella senza ligni e/o senza culonni',
'wikieditor-toolbar-tool-replace' => 'Cerca e sustituisci',
@@ -23891,7 +24679,7 @@ $1:Example.jpg|Didascalia2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Sustituisci tutticosi',
'wikieditor-toolbar-tool-replace-close' => 'Chiudi',
'wikieditor-toolbar-tool-replace-nomatch' => 'La tò ricerca nun prudicìu risurtati',
- 'wikieditor-toolbar-tool-replace-success' => '$1 sustituzzioni fatta/fatti',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 sustituzzioni fatta/fatti', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => "Nun annicasti chidda ca s'havi a circari",
'wikieditor-toolbar-tool-replace-invalidregex' => "L'esprissioni rigulari misa nun è vàlidda: $1",
'wikieditor-toolbar-section-characters' => 'Carattiri spiciali',
@@ -24066,6 +24854,7 @@ $messages['si'] = array(
'wikieditor-toolbar-file-float' => 'පෙළගà·à·ƒà·Šà¶¸:',
'wikieditor-toolbar-file-default' => '(à·ƒà·à¶¸à·à¶±à·Šâ€à¶º)',
'wikieditor-toolbar-file-format' => 'ආකෘතිය:',
+ 'wikieditor-toolbar-file-format-none' => 'කිසිවක් නොමà·à¶­',
'wikieditor-toolbar-tool-file-insert' => 'ඇතුල් කරන්න',
'wikieditor-toolbar-tool-file-cancel' => 'අවලංගු කරන්න',
'wikieditor-toolbar-tool-reference' => 'යොමුව',
@@ -24132,7 +24921,7 @@ $1:උදà·à·„රණ.jpg| 2 යටි ලියමන',
'wikieditor-toolbar-tool-table-preview' => 'පූර්ව දර්à·à¶±à¶º',
'wikieditor-toolbar-tool-table-insert' => 'ඇතුල් කරන්න',
'wikieditor-toolbar-tool-table-cancel' => 'අත් හරින්න',
- 'wikieditor-toolbar-tool-table-toomany' => 'මෙහිදී $1 කොටුවකට වඩ෠ඇති වගුවක් ඇතුල් කිරීම කළ නොහà·à¶šà·’ය.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'මෙහිදී $1 කොටුවකට වඩ෠ඇති වගුවක් ඇතුල් කිරීම කළ නොහà·à¶šà·’ය.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'ඔබ පේළි හ෠තීරු ගණන සඳහ෠වලංගු අගයක් ඇතුළත් කර නà·à¶­.',
'wikieditor-toolbar-tool-table-zero' => 'ඔබට පේළි හ෠තීරු à·à·”න්â€à¶º වන වගුවක් ඇතුල් කළ නොහà·à¶š.',
'wikieditor-toolbar-tool-replace' => 'සෙවීම හ෠ප්â€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶º',
@@ -24146,7 +24935,7 @@ $1:උදà·à·„රණ.jpg| 2 යටි ලියමන',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'සියල්ලම ප්â€à¶»à¶­à·’ස්ථà·à¶´à¶±à¶º කරන්න',
'wikieditor-toolbar-tool-replace-close' => 'වසන්න',
'wikieditor-toolbar-tool-replace-nomatch' => 'ඔබේ සෙවීම කිසිදු පදයක් හ෠නොගà·à·…පේ.',
- 'wikieditor-toolbar-tool-replace-success' => ' ප්â€à¶»à¶­à·’ස්ථà·à¶´à¶± $1ක් සිදු කරන ලදී.',
+ 'wikieditor-toolbar-tool-replace-success' => ' ප්â€à¶»à¶­à·’ස්ථà·à¶´à¶± $1ක් සිදු කරන ලදී.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'ඔබ සෙවීම සඳහ෠කිසිවක් ඇතුල් කර නà·à¶­.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'ඔබ ඇතුළත් කළ නිත්â€à¶º ප්â€à¶»à¶šà·à·à¶±à¶º වලංගු නොවේ:$1',
'wikieditor-toolbar-section-characters' => 'විà·à·šà·‚ අනු ලකුණු',
@@ -24169,6 +24958,9 @@ $1:උදà·à·„රණ.jpg| 2 යටි ලියමන',
'wikieditor-toolbar-characters-page-thai' => 'තà·à¶ºà·’',
'wikieditor-toolbar-characters-page-lao' => 'ලà·à¶•',
'wikieditor-toolbar-characters-page-khmer' => 'ඛෙමර්',
+ 'wikieditor-toolbar-characters-endash' => 'en තේජස',
+ 'wikieditor-toolbar-characters-emdash' => 'em තේජස',
+ 'wikieditor-toolbar-characters-minus' => 'à¶à¶« ලකුණ',
'wikieditor-toolbar-section-help' => 'උදව්',
'wikieditor-toolbar-help-heading-description' => 'විස්තරය',
'wikieditor-toolbar-help-heading-syntax' => 'ඔබ යතුරු ලියනය කරන දෙය',
@@ -24369,7 +25161,7 @@ $1:Príklad.jpg|Popis2',
'wikieditor-toolbar-tool-table-preview' => 'Náhľad',
'wikieditor-toolbar-tool-table-insert' => 'Vložiť',
'wikieditor-toolbar-tool-table-cancel' => 'Zrušiť',
- 'wikieditor-toolbar-tool-table-toomany' => 'Vloženie tabuľky s viac ako $1 bunkami nie je možné pomocou tohto dialógu.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Vloženie tabuľky s viac ako $1 bunkami nie je možné pomocou tohto dialógu.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Nezadali ste platný poÄet riadkov alebo stĺpcov.',
'wikieditor-toolbar-tool-table-zero' => 'Nemôžete vložiÅ¥ tabuľku s nulovým poÄtom riadkov Äi stĺpcov.',
'wikieditor-toolbar-tool-replace' => 'Hľadať a nahradiť',
@@ -24383,7 +25175,7 @@ $1:Príklad.jpg|Popis2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Nahradiť všetky',
'wikieditor-toolbar-tool-replace-close' => 'Zatvoriť',
'wikieditor-toolbar-tool-replace-nomatch' => 'Vyhľadávanie nenašlo vyhovujúce položky.',
- 'wikieditor-toolbar-tool-replace-success' => 'Nahradilo sa $1 výskytov.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Nahradilo sa $1 výskytov.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Nezadali ste, Äo sa má hľadaÅ¥.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Regulárny výraz, ktorý ste zadali je neplatný: $1',
'wikieditor-toolbar-section-characters' => 'Špeciálne znaky',
@@ -24612,7 +25404,7 @@ $1:Primer 2.jpg|Napis 2',
'wikieditor-toolbar-tool-table-preview' => 'Predogled',
'wikieditor-toolbar-tool-table-insert' => 'Vstavi',
'wikieditor-toolbar-tool-table-cancel' => 'PrekliÄi',
- 'wikieditor-toolbar-tool-table-toomany' => 'Vstavljanje tabele z veÄ kot $1 celicami s tem obrazcem ni mogoÄe.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Vstavljanje tabele z veÄ kot 1000 celicami s tem obrazcem ni mogoÄe.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Niste vnesli veljavnega Å¡tevila vrstic ali stolpcev.',
'wikieditor-toolbar-tool-table-zero' => 'Ne morete vstaviti tabele z niÄ vrsticami ali stolpci.',
'wikieditor-toolbar-tool-replace' => 'Zamenjaj',
@@ -24626,7 +25418,7 @@ $1:Primer 2.jpg|Napis 2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Zamenjaj vse',
'wikieditor-toolbar-tool-replace-close' => 'Zapri',
'wikieditor-toolbar-tool-replace-nomatch' => 'VaÅ¡e iskanje s ne ujema z niÄemur.',
- 'wikieditor-toolbar-tool-replace-success' => 'Narejenih $1 zamenjav.',
+ 'wikieditor-toolbar-tool-replace-success' => '{{PLURAL:$1|Narejena $1 zamenjava|Narejeni $1 zamenjavi|Narejene $1 zamenjave|Narejenih $1 zamenjav}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Niste vnesli niÄesar za iskanje.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'ObiÄajni izraz, ki ste ga vnesli, je neveljaven: $1',
'wikieditor-toolbar-section-characters' => 'Posebni znaki',
@@ -24849,7 +25641,7 @@ $messages['sq'] = array(
'wikieditor-toolbar-tool-table-preview' => 'Parapamje',
'wikieditor-toolbar-tool-table-insert' => 'Shto',
'wikieditor-toolbar-tool-table-cancel' => 'Anulo',
- 'wikieditor-toolbar-tool-table-toomany' => 'Futja e një tabelë më shumë se $1 qeliza nuk është, në këtë dialog, e mundur.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Futja e një tabelë më shumë se $1 qeliza nuk është, në këtë dialog, e mundur.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ju nuk keni dhënë numër të vlefshme e rreshtave apo kollonave.',
'wikieditor-toolbar-tool-table-zero' => 'Ju nuk mund të fusni një tabelë me zero rreshta apo kollona.',
'wikieditor-toolbar-tool-replace' => 'Kërkoni dhe zhvendosni',
@@ -24862,7 +25654,7 @@ $messages['sq'] = array(
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Zëvendësojnë të gjitha',
'wikieditor-toolbar-tool-replace-close' => 'Mbylle',
'wikieditor-toolbar-tool-replace-nomatch' => 'Nuk ka rezultate që përputhen me kërkesën.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 Zëvendësimi(et) duke u zbatuar.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 Zëvendësimi(et) duke u zbatuar.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ju nuk keni futur asgjë për të kërkuar.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Shprehja që e keni futur është i pavlefshëm: $1',
'wikieditor-toolbar-section-characters' => 'Karaktere të veçanta',
@@ -24949,13 +25741,14 @@ $messages['sq'] = array(
* @author Charmed94
* @author Helios13
* @author McDutchie
+ * @author Milicevic01
* @author Rancher
* @author Sasa Stefanovic
* @author Жељко Тодоровић
* @author Михајло Ðнђелковић
*/
$messages['sr-ec'] = array(
- 'wikieditor' => 'Ðапредно Ñучеље уређивања викитекÑта',
+ 'wikieditor' => 'Ðапредно окружење за уређивање вики-текÑта',
'wikieditor-desc' => 'Пружа прошириво кориÑничко окружење за уређивање викитекÑта и много модула Ñа бројним могућноÑтима',
'wikieditor-wikitext-tab' => 'ВикитекÑÑ‚',
'wikieditor-loading' => 'Учитавање',
@@ -25095,7 +25888,7 @@ $1:пример2.jpg|ÐаÑлов2',
'wikieditor-toolbar-tool-table-insert' => 'Убаци',
'wikieditor-toolbar-tool-table-cancel' => 'Откажи',
'wikieditor-toolbar-tool-table-example-text' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut nec purus diam. Sed aliquam imperdiet nunc quis lacinia. Donec rutrum consectetur placerat. Sed volutpat neque non purus faucibus id ultricies enim euismod.',
- 'wikieditor-toolbar-tool-table-toomany' => 'Ðе можете да убацујете табеле Ñ Ð²Ð¸ÑˆÐµ од $1 ћелија Ñ Ð¾Ð²Ð¸Ð¼ прозорчетом.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Ðе можете да убацујете табеле Ñ Ð²Ð¸ÑˆÐµ од $1 ћелија Ñ Ð¾Ð²Ð¸Ð¼ прозорчетом.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'ÐиÑте унели валидан број редова и колона',
'wikieditor-toolbar-tool-table-zero' => 'Ðе можете да унеÑете табелу Ñа 0 редова или колона.',
'wikieditor-toolbar-tool-replace' => 'Тражи и замени',
@@ -25109,7 +25902,7 @@ $1:пример2.jpg|ÐаÑлов2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Замени Ñве',
'wikieditor-toolbar-tool-replace-close' => 'Затвори',
'wikieditor-toolbar-tool-replace-nomatch' => 'Претрага није пронашла резултате.',
- 'wikieditor-toolbar-tool-replace-success' => 'Ðаправљених замена: $1.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Ðаправљених замена: $1.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'ÐиÑте унели ништа за претрагу.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Израз који Ñте унели није иÑправан: $1',
'wikieditor-toolbar-section-characters' => 'ПоÑебни знакови',
@@ -25342,7 +26135,7 @@ $1:primer2.jpg|Naslov2',
'wikieditor-toolbar-tool-table-insert' => 'Ubaci',
'wikieditor-toolbar-tool-table-cancel' => 'Otkaži',
'wikieditor-toolbar-tool-table-example-text' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut nec purus diam. Sed aliquam imperdiet nunc quis lacinia. Donec rutrum consectetur placerat. Sed volutpat neque non purus faucibus id ultricies enim euismod.',
- 'wikieditor-toolbar-tool-table-toomany' => 'Ne možete da ubacujete tabele s viÅ¡e od $1 ćelija s ovim prozorÄetom.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Ne možete da ubacujete tabele s viÅ¡e od $1 ćelija s ovim prozorÄetom.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Niste uneli validan broj redova i kolona',
'wikieditor-toolbar-tool-table-zero' => 'Ne možete da unesete tabelu sa 0 redova ili kolona.',
'wikieditor-toolbar-tool-replace' => 'Traži i zameni',
@@ -25356,7 +26149,7 @@ $1:primer2.jpg|Naslov2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Zameni sve',
'wikieditor-toolbar-tool-replace-close' => 'Zatvori',
'wikieditor-toolbar-tool-replace-nomatch' => 'Pretraga nije pronašla rezultate.',
- 'wikieditor-toolbar-tool-replace-success' => 'Napravljenih zamena: $1.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Napravljenih zamena: $1.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Niste uneli ništa za pretragu.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Izraz koji ste uneli nije ispravan: $1',
'wikieditor-toolbar-section-characters' => 'Posebni znakovi',
@@ -25566,7 +26359,7 @@ $1:Conto.jpg|Pedaran2',
'wikieditor-toolbar-tool-table-preview' => 'Pramidang',
'wikieditor-toolbar-tool-table-insert' => 'Asupkeun',
'wikieditor-toolbar-tool-table-cancel' => 'Bolay',
- 'wikieditor-toolbar-tool-table-toomany' => 'Dialog ieu teu bisa dipaké pikeun nyieun tabél anu sélna leuwih ti $1.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Dialog ieu teu bisa dipaké pikeun nyieun tabél anu sélna leuwih ti $1.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Jumlah baris atawa kolom nu diasupkeun teu bener.',
'wikieditor-toolbar-tool-table-zero' => 'Anjeun teu bisa nyieun tabél nu baris jeung kolomna enol.',
'wikieditor-toolbar-tool-replace' => 'Téang jeung ganti',
@@ -25578,7 +26371,7 @@ $1:Conto.jpg|Pedaran2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Ganti sadayana',
'wikieditor-toolbar-tool-replace-close' => 'Tutup',
'wikieditor-toolbar-tool-replace-nomatch' => 'Taya nu cocog jeung nu ditéang.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 geus diganti.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 geus diganti.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Anjeun teu ngasupkeun naon anu kudu disungsi.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Éksprési régulér anu diasupkeun teu bener: $1',
'wikieditor-toolbar-section-characters' => 'Karakter husus',
@@ -25808,7 +26601,7 @@ $1:Exempel.jpg|Bildtext2',
'wikieditor-toolbar-tool-table-preview' => 'Förhandsgranska',
'wikieditor-toolbar-tool-table-insert' => 'Sätt in',
'wikieditor-toolbar-tool-table-cancel' => 'Avbryt',
- 'wikieditor-toolbar-tool-table-toomany' => 'Att sätta in en tabell med fler än $1 celler är inte möjligt med denna dialog.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Att sätta in en tabell med fler än $1 celler är inte möjligt med denna dialog.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Du har inte angett ett giltigt antal rader eller kolumner.',
'wikieditor-toolbar-tool-table-zero' => 'Du kan inte sätta in en tabell med noll rader eller kolumner.',
'wikieditor-toolbar-tool-replace' => 'Sök och ersätt',
@@ -25822,7 +26615,7 @@ $1:Exempel.jpg|Bildtext2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Ersätt alla',
'wikieditor-toolbar-tool-replace-close' => 'Stäng',
'wikieditor-toolbar-tool-replace-nomatch' => 'Sökningen gav inget resultat.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 ersättning(ar) gjorda.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|ersättning|ersättningar}} gjordes.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Du matade inte in något att söka efter.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Det reguljära uttryck du angav är ogiltigt: $1',
'wikieditor-toolbar-section-characters' => 'Specialtecken',
@@ -26050,7 +26843,7 @@ $1:Example.jpg|Maelezo mafupi 2',
'wikieditor-toolbar-tool-table-preview' => 'Hakiki',
'wikieditor-toolbar-tool-table-insert' => 'Weka',
'wikieditor-toolbar-tool-table-cancel' => 'Batilisha',
- 'wikieditor-toolbar-tool-table-toomany' => 'Huwezi kutengeneza jedwali yenye visanduku zaidi na $1 kwa kutumia zana hii.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Huwezi kutengeneza jedwali yenye visanduku zaidi na $1 kwa kutumia zana hii.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'You have not entered a valid number of rows or columns.
Idadi ya mistari au ya safu si halali.',
'wikieditor-toolbar-tool-table-zero' => 'Huwezi kuweka jedwali ambalo halina mistari wala safu zozote.',
@@ -26065,7 +26858,7 @@ Idadi ya mistari au ya safu si halali.',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Badilisha yote',
'wikieditor-toolbar-tool-replace-close' => 'Funga',
'wikieditor-toolbar-tool-replace-nomatch' => 'Maandishi ulioyatafuta hayakupatikana.',
- 'wikieditor-toolbar-tool-replace-success' => 'Yalifanyiwa (ma)badiliko $1.',
+ 'wikieditor-toolbar-tool-replace-success' => 'Yalifanyiwa (ma)badiliko $1.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Hukuweka maandishi ya kutafutwa.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Uonyesho wa kawaida ulichoingiza ni batili: $1',
'wikieditor-toolbar-section-characters' => 'Herufi maalum',
@@ -26228,6 +27021,7 @@ $messages['ta'] = array(
'wikieditor-toolbar-file-target' => 'கோபà¯à®ªà®¿à®©à¯ பெயரà¯:',
'wikieditor-toolbar-file-caption' => 'தலைபà¯à®ªà¯:',
'wikieditor-toolbar-file-size' => 'அளவà¯:',
+ 'wikieditor-toolbar-file-float' => 'நேரà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯:',
'wikieditor-toolbar-file-default' => '(இயலà¯à®ªà®¿à®°à¯à®ªà¯à®ªà¯)',
'wikieditor-toolbar-file-format' => 'வடிவமைபà¯à®ªà¯:',
'wikieditor-toolbar-file-format-none' => 'à®à®¤à¯à®®à®¿à®²à¯à®²à¯ˆ',
@@ -26304,7 +27098,7 @@ $1:எடà¯à®¤à¯à®¤à¯à®•à¯à®•à®¾à®Ÿà¯à®Ÿà¯.jpg|படவிளகà¯à®•à®®
'wikieditor-toolbar-tool-table-preview' => 'à®®à¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯',
'wikieditor-toolbar-tool-table-insert' => 'உளà¯à®³à®¿à®Ÿà¯',
'wikieditor-toolbar-tool-table-cancel' => 'விடà¯à®Ÿà¯à®µà®¿à®Ÿà¯',
- 'wikieditor-toolbar-tool-table-toomany' => 'இவà¯à®µà¯à®°à¯ˆà®¯à®¾à®Ÿà®²à¯ பெடà¯à®Ÿà®¿à®¯à¯à®Ÿà®©à¯ $1 -஠விட மேறà¯à®ªà®Ÿà¯à®Ÿ நà¯à®£à¯à®£à®±à¯ˆà®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿ ஓர௠அடà¯à®Ÿà®µà®£à¯ˆà®¯à¯ˆ நà¯à®´à¯ˆà®•à¯à®• இயலாதà¯.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'இவà¯à®µà¯à®°à¯ˆà®¯à®¾à®Ÿà®²à¯ பெடà¯à®Ÿà®¿à®¯à¯à®Ÿà®©à¯ $1 -஠விட மேறà¯à®ªà®Ÿà¯à®Ÿ நà¯à®£à¯à®£à®±à¯ˆà®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿ ஓர௠அடà¯à®Ÿà®µà®£à¯ˆà®¯à¯ˆ நà¯à®´à¯ˆà®•à¯à®• இயலாதà¯.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'தாஙà¯à®•à®³à¯, கிடைவரிசை (அலà¯à®²à®¤à¯) செஙà¯à®•à¯à®¤à¯à®¤à¯ வரிசைகà¯à®•à®¾à®© சரியான எணà¯à®£à¯ˆà®•à¯ கொடà¯à®•à¯à®•à®µà®¿à®²à¯à®²à¯ˆ',
'wikieditor-toolbar-tool-table-zero' => 'தாஙà¯à®•à®³à¯, கிடைவரிசை (அலà¯à®²à®¤à¯) செஙà¯à®•à¯à®¤à¯à®¤à¯ வரிசைகà¯à®•à®¾à®© எணà¯à®£à¯ˆ பூசà¯à®šà®¿à®¯à®®à¯ ( 0 ) எனà¯à®±à¯ கொடà¯à®¤à¯à®¤à¯ படà¯à®Ÿà®¿à®¯à®²à¯ˆ உரà¯à®µà®¾à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯',
'wikieditor-toolbar-tool-replace' => 'தேடிகà¯à®•à®£à¯à®Ÿà¯à®ªà®¿à®Ÿà®¿à®¤à¯à®¤à¯ மாறà¯à®±à®µà¯à®®à¯',
@@ -26318,7 +27112,7 @@ $1:எடà¯à®¤à¯à®¤à¯à®•à¯à®•à®¾à®Ÿà¯à®Ÿà¯.jpg|படவிளகà¯à®•à®®
'wikieditor-toolbar-tool-replace-button-replaceall' => 'எலà¯à®²à®¾à®µà®±à¯à®±à¯ˆà®¯à¯à®®à¯ மாறà¯à®±à®µà¯à®®à¯',
'wikieditor-toolbar-tool-replace-close' => 'மூடà¯à®•',
'wikieditor-toolbar-tool-replace-nomatch' => 'தஙà¯à®•à®³à®¤à¯ தேடலà¯à®•à¯à®•à®¾à®© à®®à¯à®Ÿà®¿à®µà¯ எஙà¯à®•à¯à®®à¯ ஒதà¯à®¤à¯à®µà®°à®µà®¿à®²à¯à®²à¯ˆ.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 மாறà¯à®±à®®à¯(களà¯) மேறà¯à®•à¯Šà®³à¯à®³à®ªà¯à®ªà®Ÿà¯à®Ÿà®©.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 மாறà¯à®±à®®à¯(களà¯) மேறà¯à®•à¯Šà®³à¯à®³à®ªà¯à®ªà®Ÿà¯à®Ÿà®©.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'எதனைதà¯à®¤à¯‡à®Ÿà¯à®µà®¤à¯ எனà¯à®±à¯ தாஙà¯à®•à®³à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'நீஙà¯à®•à®³à¯ உளà¯à®³à®¿à®Ÿà¯à®Ÿ வழகà¯à®•à®®à®¾à®© தொடர௠செலà¯à®²à®¾à®¤à¯: $1',
'wikieditor-toolbar-section-characters' => 'சிறபà¯à®ªà¯ எழà¯à®¤à¯à®¤à¯à®°à¯à®•à¯à®•à®³à¯',
@@ -26528,13 +27322,13 @@ $1:Example.jpg|ఉపశీరà±à°·à°¿à°•2',
'wikieditor-toolbar-tool-table-preview' => 'à°®à±à°¨à±à°œà±‚à°ªà±',
'wikieditor-toolbar-tool-table-insert' => 'చేరà±à°šà±',
'wikieditor-toolbar-tool-table-cancel' => 'à°°à°¦à±à°¦à±',
- 'wikieditor-toolbar-tool-table-toomany' => '$1 కంటే à°Žà°•à±à°•à±à°µ à°—à°³à±à°³à±à°¨à±à°¨ పటà±à°Ÿà°¿à°•à°¨à°¨à°¿ చేరà±à°šà°¡à°‚ à°ˆ సంవాదపేటిక à°¦à±à°µà°¾à°°à°¾ సాధà±à°¯à°‚ కాదà±.',
+ 'wikieditor-toolbar-tool-table-toomany' => '$1 కంటే à°Žà°•à±à°•à±à°µ à°—à°³à±à°³à±à°¨à±à°¨ పటà±à°Ÿà°¿à°•à°¨à°¨à°¿ చేరà±à°šà°¡à°‚ à°ˆ సంవాదపేటిక à°¦à±à°µà°¾à°°à°¾ సాధà±à°¯à°‚ కాదà±.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'మీరౠసరైన à°…à°¡à±à°¡à± లేదా నిలà±à°µà± వరà±à°¸à°² సంఖà±à°¯à°¨à°¿ ఇవà±à°µà°²à±‡à°¦à±.',
'wikieditor-toolbar-tool-table-zero' => 'à°¸à±à°¨à±à°¨à°¾ à°…à°¡à±à°¡à± లేదా నిలà±à°µà± వరà±à°¸à°²à°¤à±‹ మీరౠపటà±à°Ÿà°¿à°•à°¨à°¿ చేరà±à°šà°²à±‡à°°à±.',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'à°…à°¨à±à°¨à°¿à°‚టినీ మారà±à°šà±',
'wikieditor-toolbar-tool-replace-close' => 'మూసివేయి',
'wikieditor-toolbar-tool-replace-nomatch' => 'మీ à°…à°¨à±à°µà±‡à°·à°£ దేనికీ సరిపోలలేదà±.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 మారà±à°ªà°¿à°¡à°¿(à°²à±) చేసాం.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 మారà±à°ªà°¿à°¡à°¿(à°²à±) చేసాం.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'వెతకడానికి à°à°®à±€ ఇవà±à°µà°²à±‡à°¦à±.',
'wikieditor-toolbar-section-characters' => 'à°ªà±à°°à°¤à±à°¯à±‡à°• à°…à°•à±à°·à°°à°¾à°²à±',
'wikieditor-toolbar-characters-page-latin' => 'లాటినà±',
@@ -26759,7 +27553,7 @@ $1:Example.jpg|คำอธิบายภาพ2',
'wikieditor-toolbar-tool-table-preview' => 'ภาพตัวอย่างตาราง',
'wikieditor-toolbar-tool-table-insert' => 'à¹à¸—รà¸',
'wikieditor-toolbar-tool-table-cancel' => 'ยà¸à¹€à¸¥à¸´à¸',
- 'wikieditor-toolbar-tool-table-toomany' => 'ไม่สามารถใส่ตารางที่มีคอลัมน์มาà¸à¸à¸§à¹ˆà¸² $1 คอลัมน์ได้ในที่นี้',
+ 'wikieditor-toolbar-tool-table-toomany' => 'ไม่สามารถใส่ตารางที่มีคอลัมน์มาà¸à¸à¸§à¹ˆà¸² $1 คอลัมน์ได้ในที่นี้', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'คุณไม่ได้ใส่ค่าจำนวนของà¹à¸–วหรือคอลัมน์ที่ถูà¸à¸•à¹‰à¸­à¸‡',
'wikieditor-toolbar-tool-table-zero' => 'ไม่สามารถใส่ตารางที่มีจำนวนà¹à¸–วหรือคอลัมน์เท่าà¸à¸±à¸šà¸¨à¸¹à¸™à¸¢à¹Œ',
'wikieditor-toolbar-tool-replace' => 'ค้นหาà¹à¸¥à¸°à¹à¸—นที่',
@@ -26772,7 +27566,7 @@ $1:Example.jpg|คำอธิบายภาพ2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'à¹à¸—นที่ทั้งหมด',
'wikieditor-toolbar-tool-replace-close' => 'ปิด',
'wikieditor-toolbar-tool-replace-nomatch' => 'สิ่งที่คุณค้นหาไม่ตรงà¸à¸±à¸šà¸ªà¸´à¹ˆà¸‡à¹ƒà¸”เลย',
- 'wikieditor-toolbar-tool-replace-success' => 'มีเปลี่ยนà¹à¸›à¸¥à¸‡ $1 สิ่ง',
+ 'wikieditor-toolbar-tool-replace-success' => 'มีเปลี่ยนà¹à¸›à¸¥à¸‡ $1 สิ่ง', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'คุณไม่ได้ใส่คำที่จะค้นหา',
'wikieditor-toolbar-tool-replace-invalidregex' => 'นิพจน์ปรà¸à¸•à¸´à¸—ี่คุณป้อนไม่ถูà¸à¸•à¹‰à¸­à¸‡: $1',
'wikieditor-toolbar-section-characters' => 'ตัวอัà¸à¸©à¸£à¸žà¸´à¹€à¸¨à¸©',
@@ -26983,7 +27777,7 @@ $1:Example.jpg|Titr2',
'wikieditor-toolbar-tool-table-preview' => 'Deslapky syn',
'wikieditor-toolbar-tool-table-insert' => 'Giriz',
'wikieditor-toolbar-tool-table-cancel' => 'Goýbolsun et',
- 'wikieditor-toolbar-tool-table-toomany' => '$1 öýjükden artykmaç öýjükli tablisa girizmek bu dialog bilen mümkin däl.',
+ 'wikieditor-toolbar-tool-table-toomany' => '$1 öýjükden artykmaç öýjükli tablisa girizmek bu dialog bilen mümkin däl.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Dogry bir hatar ýa-da sütün sanyny ýazmansyňyz.',
'wikieditor-toolbar-tool-table-zero' => 'Hiç hili hatarsyz ýa-da sütünsiz tablisa girizip bilmeýärsiňiz.',
'wikieditor-toolbar-tool-replace' => 'Gözle we çalşyr',
@@ -26996,7 +27790,7 @@ $1:Example.jpg|Titr2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Ählisini çalşyr',
'wikieditor-toolbar-tool-replace-close' => 'Ãap',
'wikieditor-toolbar-tool-replace-nomatch' => 'Gözlegiňiz hiçbir zada duşmady.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 sany çalşyrma geçirildi.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 sany çalşyrma geçirildi.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Gözlär ýaly hiçbir zat ýazmadyňyz.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Ãazan adaty aňlatmaňyz nädogry: $1',
'wikieditor-toolbar-section-characters' => 'Ãörite simwollar',
@@ -27224,7 +28018,7 @@ $1:Halimbawa.jpg|Kapsyon2',
'wikieditor-toolbar-tool-table-insert' => 'Isingit',
'wikieditor-toolbar-tool-table-cancel' => 'Huwag ituloy',
'wikieditor-toolbar-tool-table-example-text' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut nec purus diam. Sed aliquam imperdiet nunc quis lacinia. Donec rutrum consectetur placerat. Sed volutpat neque non purus faucibus id ultricies enim euismod.',
- 'wikieditor-toolbar-tool-table-toomany' => 'Hindi maaari sa salitaang ganito ang pagsisingit ng isang talahanayang may mahigit sa $1 na mga sihay.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Hindi maaari sa salitaang ganito ang pagsisingit ng isang talahanayang may mahigit sa $1 na mga sihay.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Hindi ka nagpasok ng isang tanggap na bilang ng mga hanay na pahalang o pababa.',
'wikieditor-toolbar-tool-table-zero' => 'Hindi ka makapagsisingit ng isang talahanayang walang mga hanay na pahalang o pababa.',
'wikieditor-toolbar-tool-replace' => 'Maghanap at palitan',
@@ -27238,7 +28032,7 @@ $1:Halimbawa.jpg|Kapsyon2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Palitang lahat',
'wikieditor-toolbar-tool-replace-close' => 'Isara',
'wikieditor-toolbar-tool-replace-nomatch' => 'Hindi tumugma sa anuman ang paghahanap mo.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 nagawang (mga) pagpapalit.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 nagawang (mga) pagpapalit.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Hindi ka naglagay ng anumang hahanapin.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Hindi tanggap ang inilagay mong pangkaraniwang pananalita: $1',
'wikieditor-toolbar-section-characters' => 'Natatanging mga panitik',
@@ -27482,7 +28276,7 @@ $1:Örnek.jpg|Altyazı 2',
'wikieditor-toolbar-tool-table-preview' => 'Ön izleme',
'wikieditor-toolbar-tool-table-insert' => 'Ekle',
'wikieditor-toolbar-tool-table-cancel' => 'Ä°ptal',
- 'wikieditor-toolbar-tool-table-toomany' => '$1 hücreliden fazla bir tablo eklemek bu ileti ile mümkün değildir.',
+ 'wikieditor-toolbar-tool-table-toomany' => '$1 hücreliden fazla bir tablo eklemek bu ileti ile mümkün değildir.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Geçerli bir satır ve sütun sayısı girmediniz.',
'wikieditor-toolbar-tool-table-zero' => 'Sıfır satır veya sütuna sahip bir tablo ekleyemezsiniz.',
'wikieditor-toolbar-tool-replace' => 'Ara ve deÄŸiÅŸtir',
@@ -27496,7 +28290,7 @@ $1:Örnek.jpg|Altyazı 2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Tümünü değiştir',
'wikieditor-toolbar-tool-replace-close' => 'Kapat',
'wikieditor-toolbar-tool-replace-nomatch' => 'Aramanız hiçbir şeyle uyuşmuyor.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 değiştirme yapıldı.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 değiştirme yapıldı.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Aramak için herhangi birşey girmediniz.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Girdiğiniz düzenli ifade geçersiz: $1',
'wikieditor-toolbar-section-characters' => 'Özel karakterler',
@@ -27717,7 +28511,7 @@ $1:МиÑал.jpg|ТаÑвирлама2',
'wikieditor-toolbar-tool-table-preview' => 'Ðлдан карау',
'wikieditor-toolbar-tool-table-insert' => 'Ó¨ÑÑ‚Ó™Ò¯',
'wikieditor-toolbar-tool-table-cancel' => 'Кире кагу',
- 'wikieditor-toolbar-tool-table-toomany' => 'Бу диалог табынга $1 күзәнәктән дә артык Ó©Ñтәүне чикли',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Бу диалог табынга $1 күзәнәктән дә артык Ó©Ñтәүне чикли', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Сез Ð´Ó©Ñ€ÐµÑ ÐºÒ¯Ð»Ó™Ð¼Ð´Ó™ баганаларны һәм юлларны күрÑәтмәгәнÑез.',
'wikieditor-toolbar-tool-table-zero' => 'Сез буш табын ÐºÑƒÑ Ð°Ð»Ð¼Ñ‹Ð¹Ñыз.',
'wikieditor-toolbar-tool-replace' => 'Эзләү һәм алмаштыру',
@@ -27730,7 +28524,7 @@ $1:МиÑал.jpg|ТаÑвирлама2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'БарыÑында алмаштыру',
'wikieditor-toolbar-tool-replace-close' => 'Ябу',
'wikieditor-toolbar-tool-replace-nomatch' => 'Сезнең Ñоравыгыз буенча берни дә табылмады.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 алмаштыру үткәрелде.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 алмаштыру үткәрелде.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Сез нәрÑÓ™ Ñзләргә икәнлеген күрÑәтмәдегез.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Сезнең тарафтан кертелгән $1 аңлатмаÑÑ‹ Ð´Ó©Ñ€ÐµÑ Ñ‚Ò¯Ð³ÐµÐ».',
'wikieditor-toolbar-section-characters' => 'МахÑÑƒÑ Ñ‚Ð°Ð¼Ð³Ð°Ð»Ð°Ñ€',
@@ -27819,8 +28613,22 @@ $1:МиÑал.jpg|ТаÑвирлама2',
* @author Tifinaghes
*/
$messages['tzm'] = array(
+ 'wikieditor-wikitext-tab' => 'ⵡⵉⴽⵉⴰⴹⵔⵉⵙ',
+ 'wikieditor-publish-button-publish' => 'ⴼⵙⴻⵔ',
+ 'wikieditor-toolbar-tool-bold' => 'Bold',
+ 'wikieditor-toolbar-tool-link' => 'ⴰⵣⴷⴰⵢ',
+ 'wikieditor-toolbar-tool-link-int' => 'âµ–âµ” ⵜⴰⵙâµâ´° ⵠⵡⵉⴽⵉ',
+ 'wikieditor-toolbar-file-target' => 'ⴰⵙⵙⴰⵖ ⵓⵙⴷⴰⵡ:',
'wikieditor-toolbar-file-size' => 'ⵜⵉⵖⵣⵉ:',
+ 'wikieditor-toolbar-tool-heading-1' => 'ⴰⵙⵡⵉⵔ 1',
+ 'wikieditor-toolbar-tool-heading-4' => 'ⴰⵙⵡⵉⵔ 4',
+ 'wikieditor-toolbar-tool-big' => 'ⴰⵎⵇⵇⵔⴰâµ',
+ 'wikieditor-toolbar-tool-big-example' => 'ⴰⴹⵔⵉⵙ ⴰⵎⵇⵇⵔⴰâµ',
+ 'wikieditor-toolbar-tool-small' => 'ⴰⵎⵥⵢⴰâµ',
+ 'wikieditor-toolbar-tool-small-example' => 'ⴰⴹⵔⵉⵙ ⴰⵎⵥⵢⴰâµ',
+ 'wikieditor-toolbar-tool-replace-search' => 'ⴰⵔⵣⵣⵓ ⵅⴼ:',
'wikieditor-toolbar-characters-page-latin' => 'ⵜⴰâµâ´°âµœâµ‰âµâµ‰âµœ',
+ 'wikieditor-toolbar-characters-page-ipa' => 'IPA',
'wikieditor-toolbar-characters-page-greek' => 'ⵜⴰⵢⵓâµâ´°âµâµ‰âµœ',
'wikieditor-toolbar-characters-page-arabic' => 'ⵜⴰⵄⵔⴰⴱⵜ',
'wikieditor-toolbar-characters-page-persian' => 'ⵜⴰⴼⴰⵔⵉⵙⵉⵜ',
@@ -27837,9 +28645,118 @@ $messages['tzm'] = array(
'wikieditor-toolbar-help-page-file' => 'ⵉⵙⴷⴰⵡâµ',
);
+/** Uyghur (Arabic script) (ئۇيغۇرچە)
+ * @author Sahran
+ */
+$messages['ug-arab'] = array(
+ 'wikieditor-loading' => 'يۈكلەۋاتىدۇ…',
+ 'wikieditor-preview-tab' => 'ئالدىن كۆزەت',
+ 'wikieditor-preview-changes-tab' => 'ئۆزگىرىشلەر',
+ 'wikieditor-preview-loading' => 'يۈكلەۋاتىدۇ…',
+ 'wikieditor-previewDialog-tab' => 'ئالدىن كۆزەت',
+ 'wikieditor-previewDialog-loading' => 'يۈكلەۋاتىدۇ…',
+ 'wikieditor-publish-button-publish' => 'ئÛلان قىلىش',
+ 'wikieditor-publish-button-cancel' => 'ۋاز كەچ',
+ 'wikieditor-publish-dialog-watch' => 'بۇ بەتنى كۆزەت',
+ 'wikieditor-publish-dialog-publish' => 'ئÛلان قىلىش',
+ 'wikieditor-publish-dialog-goback' => 'كەينىگە',
+ 'wikieditor-template-editor-dialog-submit' => 'ÙŠÛڭىلا',
+ 'wikieditor-template-editor-dialog-cancel' => 'ۋاز كەچ',
+ 'wikieditor-toolbar-loading' => 'يۈكلەۋاتىدۇ…',
+ 'wikieditor-toolbar-tool-bold' => 'توم',
+ 'wikieditor-toolbar-tool-bold-example' => 'توم خەت',
+ 'wikieditor-toolbar-tool-italic' => 'يانتۇ',
+ 'wikieditor-toolbar-tool-italic-example' => 'يانتۇ خەت',
+ 'wikieditor-toolbar-tool-ilink' => 'ئىچكى ئۇلانما',
+ 'wikieditor-toolbar-tool-ilink-example' => 'ئۇلانما ماۋزۇ',
+ 'wikieditor-toolbar-tool-xlink' => 'سىرتقى ئۇلانما (http:// ئالدى قوشۇلغۇچى قوشۇڭ)',
+ 'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com ئۇلانما ماۋزۇسى',
+ 'wikieditor-toolbar-tool-link' => 'ئۇلانما',
+ 'wikieditor-toolbar-tool-link-int-text' => 'كۆرسىتىدىغان تÛكىست',
+ 'wikieditor-toolbar-tool-link-ext-target' => 'ئۇلانما URL:',
+ 'wikieditor-toolbar-tool-link-cancel' => 'ۋاز كەچ',
+ 'wikieditor-toolbar-tool-link-int-invalid' => 'سىز بەلگىلىگەن تÛما ئىناۋەتسىز.',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'ئىچكى ئۇلانما',
+ 'wikieditor-toolbar-tool-file' => 'سىڭدۈرمە ھۆججەت',
+ 'wikieditor-toolbar-tool-file-example' => 'Example.jpg',
+ 'wikieditor-toolbar-file-target' => ':ھۆججەت ئاتى',
+ 'wikieditor-toolbar-file-size' => 'چوڭلۇقى:',
+ 'wikieditor-toolbar-file-float' => 'توغرىلا:',
+ 'wikieditor-toolbar-file-default' => '(كۆڭۈلدىكى)',
+ 'wikieditor-toolbar-file-format' => 'پىچىم:',
+ 'wikieditor-toolbar-file-format-none' => 'يوق',
+ 'wikieditor-toolbar-tool-file-insert' => 'قىستۇر',
+ 'wikieditor-toolbar-tool-file-cancel' => 'ۋاز كەچ',
+ 'wikieditor-toolbar-tool-reference' => 'نەقىل',
+ 'wikieditor-toolbar-tool-reference-cancel' => 'ۋاز كەچ',
+ 'wikieditor-toolbar-tool-reference-insert' => 'قىستۇر',
+ 'wikieditor-toolbar-section-advanced' => 'ئالىي',
+ 'wikieditor-toolbar-tool-heading' => 'ماۋزۇ',
+ 'wikieditor-toolbar-tool-heading-1' => 'دەرىجە 1',
+ 'wikieditor-toolbar-tool-heading-2' => 'دەرىجە 2',
+ 'wikieditor-toolbar-tool-heading-3' => 'دەرىجە 3',
+ 'wikieditor-toolbar-tool-heading-4' => 'دەرىجە 4',
+ 'wikieditor-toolbar-group-format' => 'پىچىم',
+ 'wikieditor-toolbar-tool-indent' => 'تارتىلىش',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'Ùورماتى يوق تÛكست قىستۇر',
+ 'wikieditor-toolbar-tool-big' => 'Ú†ÙˆÚ­',
+ 'wikieditor-toolbar-tool-small' => 'كىچىك',
+ 'wikieditor-toolbar-tool-superscript' => 'يۇقىرى ئىندÛكس',
+ 'wikieditor-toolbar-tool-subscript' => 'تۆۋەنكى ئىندÛكس',
+ 'wikieditor-toolbar-group-insert' => 'قىستۇر',
+ 'wikieditor-toolbar-tool-table' => 'جەدۋەل',
+ 'wikieditor-toolbar-tool-table-dimensions-rows' => 'قۇرلار',
+ 'wikieditor-toolbar-tool-table-dimensions-columns' => 'ئىستونلار',
+ 'wikieditor-toolbar-tool-table-example' => 'مىسال',
+ 'wikieditor-toolbar-tool-table-preview' => 'ئالدىن كۆزەت',
+ 'wikieditor-toolbar-tool-table-insert' => 'قىستۇر',
+ 'wikieditor-toolbar-tool-table-cancel' => 'ۋاز كەچ',
+ 'wikieditor-toolbar-tool-replace' => 'ئىزدەپ ۋە ئالماشتۇرۇش',
+ 'wikieditor-toolbar-tool-replace-title' => 'ئىزدەپ ۋە ئالماشتۇرۇش',
+ 'wikieditor-toolbar-tool-replace-search' => 'ئىزدە:',
+ 'wikieditor-toolbar-tool-replace-replace' => 'ئالماشتۇر:',
+ 'wikieditor-toolbar-tool-replace-case' => 'دەل ماسلاش',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'ئالماشتۇر',
+ 'wikieditor-toolbar-tool-replace-button-replaceall' => 'ھەممىنى ئالماشتۇر',
+ 'wikieditor-toolbar-tool-replace-close' => 'ياپ',
+ 'wikieditor-toolbar-characters-page-latin' => 'لاتىنچە',
+ 'wikieditor-toolbar-characters-page-ipa' => 'IPA',
+ 'wikieditor-toolbar-characters-page-symbols' => 'بەلگىلەر',
+ 'wikieditor-toolbar-characters-page-greek' => 'گىرÛÙƒÚ†Û•',
+ 'wikieditor-toolbar-characters-page-cyrillic' => 'سلاۋيانچە',
+ 'wikieditor-toolbar-characters-page-arabic' => 'ئەرەبچە',
+ 'wikieditor-toolbar-characters-page-persian' => 'پارىسچە',
+ 'wikieditor-toolbar-characters-page-hebrew' => 'ئىبرانىچە',
+ 'wikieditor-toolbar-characters-page-tamil' => 'تامىلچە',
+ 'wikieditor-toolbar-characters-page-telugu' => 'تÛÙ„Û‡Ú¯Û‡Ú†Û•',
+ 'wikieditor-toolbar-characters-page-sinhala' => 'سىنگالچە',
+ 'wikieditor-toolbar-characters-page-gujarati' => 'گۇجاراتچە',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'سانسكرىتچە',
+ 'wikieditor-toolbar-characters-page-thai' => 'تايلاندچە',
+ 'wikieditor-toolbar-characters-page-lao' => 'لائوسچە',
+ 'wikieditor-toolbar-characters-page-khmer' => 'ÙƒÛخمÛرچە',
+ 'wikieditor-toolbar-section-help' => 'ياردەم',
+ 'wikieditor-toolbar-help-heading-description' => 'چۈشەندۈرۈش',
+ 'wikieditor-toolbar-help-page-format' => 'Ùورمات',
+ 'wikieditor-toolbar-help-page-link' => 'ئۇلانما',
+ 'wikieditor-toolbar-help-page-list' => 'تىزىملار',
+ 'wikieditor-toolbar-help-page-file' => 'ھۆججەتلەر',
+ 'wikieditor-toolbar-help-page-reference' => 'نەقىل',
+ 'wikieditor-toolbar-help-page-discussion' => 'مۇنازىرە',
+ 'wikieditor-toolbar-help-content-italic-description' => 'يانتۇ',
+ 'wikieditor-toolbar-help-content-bold-description' => 'توم',
+ 'wikieditor-toolbar-help-content-ilink-description' => 'ئىچكى ئۇلانما',
+ 'wikieditor-toolbar-help-content-file-description' => 'سىڭدۈرمە ھۆججەت',
+ 'wikieditor-toolbar-help-content-reference-description' => 'نەقىل',
+ 'wikieditor-toolbar-help-content-signature-description' => 'ئىمزا',
+ 'wikieditor-toolbar-help-content-indent-description' => 'تارتىلىش',
+);
+
/** Ukrainian (українÑька)
* @author AS
* @author Ahonc
+ * @author AtUkr
+ * @author Base
* @author Dim Grits
* @author Microcell
* @author NickK
@@ -27851,14 +28768,14 @@ $messages['uk'] = array(
'wikieditor' => 'Розширений Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÑ–Ñ‚ÐµÐºÑту',
'wikieditor-desc' => 'Забезпечує розширюваний Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÑ–Ñ‚ÐµÐºÑту Ñ– багато функціональних модулів',
'wikieditor-wikitext-tab' => 'ВікітекÑÑ‚',
- 'wikieditor-loading' => 'ЗавантаженнÑ',
+ 'wikieditor-loading' => 'ЗавантаженнÑ…',
'wikieditor-preview-preference' => 'Увімкнути додаткову панель швидкого перемиканнÑ: "Редагувати" — "Попередній переглÑд"',
'wikieditor-preview-tab' => 'Попередній переглÑд',
'wikieditor-preview-changes-tab' => 'Зміни',
- 'wikieditor-preview-loading' => 'ЗавантаженнÑ...',
+ 'wikieditor-preview-loading' => 'ЗавантаженнÑ…',
'wikieditor-previewDialog-preference' => 'Увімкнути діалог попереднього переглÑду',
'wikieditor-previewDialog-tab' => 'Попередній переглÑд',
- 'wikieditor-previewDialog-loading' => 'ЗавантаженнÑ...',
+ 'wikieditor-previewDialog-loading' => 'ЗавантаженнÑ…',
'wikieditor-publish-preference' => 'Увімкнути публікацію крок за кроком',
'wikieditor-publish-button-publish' => 'Опублікувати',
'wikieditor-publish-button-cancel' => 'СкаÑувати',
@@ -27921,6 +28838,7 @@ $messages['uk'] = array(
'wikieditor-toolbar-file-float' => 'ВирівнюваннÑ:',
'wikieditor-toolbar-file-default' => '(Ñтандартно)',
'wikieditor-toolbar-file-format' => 'Формат:',
+ 'wikieditor-toolbar-file-format-none' => 'нема',
'wikieditor-toolbar-tool-file-insert' => 'Ð’Ñтавити',
'wikieditor-toolbar-tool-file-cancel' => 'СкаÑувати',
'wikieditor-toolbar-tool-reference' => 'ВиноÑка',
@@ -27988,7 +28906,7 @@ $1:Example.jpg|ОпиÑ2',
'wikieditor-toolbar-tool-table-insert' => 'Ð’Ñтавити',
'wikieditor-toolbar-tool-table-cancel' => 'СкаÑувати',
'wikieditor-toolbar-tool-table-example-text' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut nec purus diam. Sed aliquam imperdiet nunc quis lacinia. Donec rutrum consectetur placerat. Sed volutpat neque non purus faucibus id ultricies enim euismod.',
- 'wikieditor-toolbar-tool-table-toomany' => 'Цей діалог не дозволÑÑ” вÑтавити таблицю з більш ніж $1 комірок.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Цей діалог не дозволÑÑ” вÑтавити таблицю розміром більше 1000 клітинок.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ви не вказали необхідного чиÑла Ñ€Ñдків Ñ– Ñтовпців.',
'wikieditor-toolbar-tool-table-zero' => 'Ви не можете вÑтавити таблицю з нульовою кількіÑÑ‚ÑŽ Ñ€Ñдків або Ñтовпців.',
'wikieditor-toolbar-tool-replace' => 'Пошук і заміна',
@@ -28002,7 +28920,7 @@ $1:Example.jpg|ОпиÑ2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Замінити вÑÑ–',
'wikieditor-toolbar-tool-replace-close' => 'Закрити',
'wikieditor-toolbar-tool-replace-nomatch' => 'За Вашим запитом нічого не знайдено.',
- 'wikieditor-toolbar-tool-replace-success' => 'Зроблено замін: $1.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|заміну|замін}} зроблено.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ви не зазначили, що треба шукати.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'Введений вами регулÑрний вираз помилковий: $1',
'wikieditor-toolbar-section-characters' => 'Спеціальні Ñимволи',
@@ -28025,6 +28943,9 @@ $1:Example.jpg|ОпиÑ2',
'wikieditor-toolbar-characters-page-thai' => 'ТайÑькі',
'wikieditor-toolbar-characters-page-lao' => 'ЛаоÑькі',
'wikieditor-toolbar-characters-page-khmer' => 'КхмерÑькі',
+ 'wikieditor-toolbar-characters-endash' => 'коротке тире',
+ 'wikieditor-toolbar-characters-emdash' => 'довге тире',
+ 'wikieditor-toolbar-characters-minus' => 'мінуÑ',
'wikieditor-toolbar-section-help' => 'Довідка',
'wikieditor-toolbar-help-heading-description' => 'ОпиÑ',
'wikieditor-toolbar-help-heading-syntax' => 'Що ви вводите',
@@ -28091,6 +29012,7 @@ $1:Example.jpg|ОпиÑ2',
);
/** Urdu (اردو)
+ * @author BMRG14
* @author محبوب عالم
* @author පසිඳු කà·à·€à·’න්ද
*/
@@ -28230,7 +29152,7 @@ $1:مثال.jpg|تعقیب2',
'wikieditor-toolbar-tool-table-preview' => 'نمائش',
'wikieditor-toolbar-tool-table-insert' => 'داخل',
'wikieditor-toolbar-tool-table-cancel' => 'منسوخ',
- 'wikieditor-toolbar-tool-table-toomany' => 'اÙس Ù…Ú©Ø§Ù„Ù…Û Ú©Û’ ذریعے $1 سے Ø²ÛŒØ§Ø¯Û Ø®Ø§Ù†ÙˆÚº والے جدول کا ادخال ممکن Ù†Ûیں۔',
+ 'wikieditor-toolbar-tool-table-toomany' => 'اÙس Ù…Ú©Ø§Ù„Ù…Û Ú©Û’ ذریعے $1 سے Ø²ÛŒØ§Ø¯Û Ø®Ø§Ù†ÙˆÚº والے جدول کا ادخال ممکن Ù†Ûیں۔', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'آپ Ù†Û’ قطاروں یا صÙÙˆÚº کا صحیح شمار داخل Ù†Ûیں کیا۔',
'wikieditor-toolbar-tool-table-zero' => 'آپ صÙر قطاروں یا صÙÙˆÚº کا جدول داخل Ù†Ûیں کرسکتے۔',
'wikieditor-toolbar-tool-replace' => 'تلاش و تبدیلئ متن',
@@ -28244,7 +29166,7 @@ $1:مثال.jpg|تعقیب2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'سب بدل دو',
'wikieditor-toolbar-tool-replace-close' => 'بند کرو',
'wikieditor-toolbar-tool-replace-nomatch' => 'آپ Ú©ÛŒ تلاش سے Ú©Ú†Ú¾ ملا Ù†Ûیں۔',
- 'wikieditor-toolbar-tool-replace-success' => '$1 تبدیلیاں کی گئیں۔',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 تبدیلیاں کی گئیں۔', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'آپ Ù†Û’ تلاش کیلئے Ú©Ú†Ú¾ دیا Ù†Ûیں۔',
'wikieditor-toolbar-section-characters' => 'خاص محارÙ',
'wikieditor-toolbar-characters-page-latin' => 'لاطینی محارÙ',
@@ -28253,7 +29175,7 @@ $1:مثال.jpg|تعقیب2',
'wikieditor-toolbar-characters-page-greek' => 'یونانی',
'wikieditor-toolbar-characters-page-arabic' => 'عربی',
'wikieditor-toolbar-characters-page-arabicextended' => 'عربی توسیع شدÛ',
- 'wikieditor-toolbar-characters-page-persian' => 'Ùارسی',
+ 'wikieditor-toolbar-characters-page-persian' => 'پارسی',
'wikieditor-toolbar-characters-page-hebrew' => 'عبرانی',
'wikieditor-toolbar-characters-page-bangla' => 'بنگالی',
'wikieditor-toolbar-characters-page-tamil' => 'تامل',
@@ -28313,40 +29235,41 @@ $1:مثال.jpg|تعقیب2',
/** Uzbek (oʻzbekcha)
* @author CoderSI
+ * @author Sociologist
*/
$messages['uz'] = array(
'wikieditor' => 'Vikimatnni tahrirlashning kengaytirilgan interfeysi',
- 'wikieditor-desc' => "Vikimatnni tahrirlashning kengaytirilgan interfeysi va modullar tomonidan taqdim qilinadigan ko'pchilik amallar bilan ta'minlaydi",
+ 'wikieditor-desc' => 'Vikimatnni tahrirlashning kengaytirilgan interfeysi va modullar tomonidan taqdim qilinadigan koʻpchilik amallar bilan taʼminlaydi',
'wikieditor-wikitext-tab' => 'Vikimatn',
'wikieditor-loading' => 'Yuklash...',
- 'wikieditor-preview-preference' => "Yonma-yon batafsil ko'rsatishni yoqish",
- 'wikieditor-preview-tab' => "Batafsil ko'rsatish",
- 'wikieditor-preview-changes-tab' => "O'zgarishlar",
+ 'wikieditor-preview-preference' => '«Yonma-yon» koʻrib chiqish funksiyasini yoqish',
+ 'wikieditor-preview-tab' => 'Batafsil koʻrsatish',
+ 'wikieditor-preview-changes-tab' => 'Oʻzgarishlar',
'wikieditor-preview-loading' => 'Yuklash...',
- 'wikieditor-previewDialog-preference' => "Batafsil ko'rsatish dialogini yoqish",
- 'wikieditor-previewDialog-tab' => "Batafsil ko'rsatish",
+ 'wikieditor-previewDialog-preference' => 'Batafsil koʻrsatish dialogini yoqish',
+ 'wikieditor-previewDialog-tab' => 'Batafsil koʻrsatish',
'wikieditor-previewDialog-loading' => 'Yuklash...',
'wikieditor-publish-preference' => 'Qadamba-qadam nashr qilishni yoqish',
'wikieditor-publish-button-publish' => 'Nashr qilish',
- 'wikieditor-publish-button-cancel' => 'Bekor',
+ 'wikieditor-publish-button-cancel' => 'Bekor qilish',
'wikieditor-publish-dialog-title' => '{{SITENAME}} loyihasida nashr qilish',
- 'wikieditor-publish-dialog-summary' => "O'zgarishlar tavsifi (qanday o'zgarishlar sodir bo'lganini qisqacha ko'rsating):",
- 'wikieditor-publish-dialog-minor' => "Kichik o'zgarish",
+ 'wikieditor-publish-dialog-summary' => 'Oʻzgarishlar tavsifi (qanday oʻzgarishlar sodir boʻlganini qisqacha koʻrsating):',
+ 'wikieditor-publish-dialog-minor' => 'Kichik oʻzgarish',
'wikieditor-publish-dialog-watch' => 'Bu sahifani kuzatish',
'wikieditor-publish-dialog-publish' => 'Nashr qilish',
'wikieditor-publish-dialog-goback' => 'Orqaga',
- 'wikieditor-template-editor-preference' => 'Shakllar yodamida andozalarni tahrirlashni yoqish',
- 'wikieditor-template-editor-dialog-title' => "Andozani o'zgartirish",
+ 'wikieditor-template-editor-preference' => 'Shakllar yordamida andozalarni tahrirlashni yoqish',
+ 'wikieditor-template-editor-dialog-title' => 'Andozani oʻzgartirish',
'wikieditor-template-editor-dialog-submit' => 'Yangilash',
- 'wikieditor-template-editor-dialog-cancel' => 'Bekor',
- 'wikieditor-templates-preference' => "Andozalarni yig'ishni yoqish",
- 'wikieditor-toc-preference' => "O'tish imkonini beruvchi mundarijani yoqish",
- 'wikieditor-toc-show' => "Mundarijani ko'rsatish",
+ 'wikieditor-template-editor-dialog-cancel' => 'Bekor qilish',
+ 'wikieditor-templates-preference' => 'Andozalarni yigʻishni yoqish',
+ 'wikieditor-toc-preference' => 'Oʻtish imkonini beruvchi mundarijani yoqish',
+ 'wikieditor-toc-show' => 'Mundarijani koʻrsatish',
'wikieditor-toc-hide' => 'Mundarijani yashirish',
'wikieditor-toolbar' => 'Tahrirlash darchasi',
- 'wikieditor-toolbar-desc' => "Foydalanishga qulayroq bo'lgan tahrirlash darchasi",
+ 'wikieditor-toolbar-desc' => 'Foydalanishga qulayroq boʻlgan tahrirlash darchasi',
'wikieditor-toolbar-preference' => 'Yaxshilangan tahrirlash darchasini yoqish',
- 'wikieditor-toolbar-dialogs-preference' => "Havolalar, jadvallar va boshqa obyektlarni qo'yish uchun dialoglarni yoqish",
+ 'wikieditor-toolbar-dialogs-preference' => 'Havolalar, jadvallar va boshqa obyektlarni qoʻyish uchun dialoglarni yoqish',
'wikieditor-toolbar-hidesig' => 'Asosiy nomfazodagi sahifalarda imzo tugmasini yashirish',
'wikieditor-toolbar-loading' => 'Yuklash...',
'wikieditor-toolbar-tool-bold' => 'Qalin',
@@ -28358,47 +29281,47 @@ $messages['uz'] = array(
'wikieditor-toolbar-tool-xlink' => 'Tashqi ishorat (http:// prefiksini unutmang)',
'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com ishorat nomi',
'wikieditor-toolbar-tool-link' => 'Havola',
- 'wikieditor-toolbar-tool-link-title' => "Havola qo'yish",
+ 'wikieditor-toolbar-tool-link-title' => 'Havola qoʻyish',
'wikieditor-toolbar-tool-link-int' => 'Viki-sahifaga',
- 'wikieditor-toolbar-tool-link-int-target' => "Mo'ljal sahifa yoki URL:",
+ 'wikieditor-toolbar-tool-link-int-target' => 'Moʻljal sahifa yoki URL:',
'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Sahifa nomi yoki URL',
- 'wikieditor-toolbar-tool-link-int-text' => "Ko'rsatiladigan matn:",
- 'wikieditor-toolbar-tool-link-int-text-tooltip' => "Ko'rsatiladigan matnni kiriting",
+ 'wikieditor-toolbar-tool-link-int-text' => 'Koʻrsatiladigan matn:',
+ 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Koʻrsatiladigan matnni kiriting',
'wikieditor-toolbar-tool-link-ext' => 'Tashqi veb-sahifaga',
'wikieditor-toolbar-tool-link-ext-target' => 'URL havolalar:',
'wikieditor-toolbar-tool-link-ext-text' => 'Havola matni:',
- 'wikieditor-toolbar-tool-link-insert' => "Havola qo'yish",
- 'wikieditor-toolbar-tool-link-cancel' => 'Bekor',
+ 'wikieditor-toolbar-tool-link-insert' => 'Havola qoʻyish',
+ 'wikieditor-toolbar-tool-link-cancel' => 'Bekor qilish',
'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Sahifa mavjud',
'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Sahifa mavjud emas',
- 'wikieditor-toolbar-tool-link-int-target-status-invalid' => "Mumkin bo'lmagan nom",
+ 'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Mumkin boʻlmagan nom',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Tashqi havola',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Sahifa mavjudligiga tekshirish',
- 'wikieditor-toolbar-tool-link-int-invalid' => "Ko'rsatilgan nom mumkin emas.",
- 'wikieditor-toolbar-tool-link-lookslikeinternal' => "Siz tomondan ko'rsatilgan URL boshqa viki-sahifaga havolaga o'xshash. Siz mazkur havolani ichki qilishni xohlaysizmi?",
+ 'wikieditor-toolbar-tool-link-int-invalid' => 'Koʻrsatilgan nom mumkin emas.',
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Siz tomondan koʻrsatilgan URL boshqa viki-sahifaga havolaga oʻxshash. Siz mazkur havolani ichki qilishni xohlaysizmi?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Ichki havola',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Tashqi havola',
- 'wikieditor-toolbar-tool-link-empty' => "Nimaga ishorat qilishni ko'rsatmadingiz",
- 'wikieditor-toolbar-tool-file' => "O'rnatilgan fayl",
+ 'wikieditor-toolbar-tool-link-empty' => 'Nimaga ishorat qilishni koʻrsatmadingiz',
+ 'wikieditor-toolbar-tool-file' => 'Oʻrnatilgan fayl',
'wikieditor-toolbar-tool-file-example' => 'Example.jpg',
- 'wikieditor-toolbar-tool-file-title' => "Fayl qo'yish",
+ 'wikieditor-toolbar-tool-file-title' => 'Fayl qoʻyish',
'wikieditor-toolbar-file-target' => 'Fayl nomi:',
'wikieditor-toolbar-file-caption' => 'Yozuv:',
'wikieditor-toolbar-file-size' => 'Oʻlchami',
'wikieditor-toolbar-file-float' => 'Tekislash:',
- 'wikieditor-toolbar-file-default' => "(boshlang'ich)",
+ 'wikieditor-toolbar-file-default' => '(boshlangʻich)',
'wikieditor-toolbar-file-format' => 'Formati:',
- 'wikieditor-toolbar-file-format-none' => "yo'q",
- 'wikieditor-toolbar-tool-file-insert' => "Qo'yish",
- 'wikieditor-toolbar-tool-file-cancel' => 'Bekor',
+ 'wikieditor-toolbar-file-format-none' => 'yoʻq',
+ 'wikieditor-toolbar-tool-file-insert' => 'Qoʻyish',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Bekor qilish',
'wikieditor-toolbar-tool-reference' => 'Havola',
- 'wikieditor-toolbar-tool-reference-example' => "Havola matnini bu yerga qo'ying",
- 'wikieditor-toolbar-tool-reference-cancel' => 'Bekor',
- 'wikieditor-toolbar-tool-reference-title' => "Havola qo'yish",
- 'wikieditor-toolbar-tool-reference-insert' => "Qo'yish",
+ 'wikieditor-toolbar-tool-reference-example' => 'Havola matnini bu yerga qoʻying',
+ 'wikieditor-toolbar-tool-reference-cancel' => 'Bekor qilish',
+ 'wikieditor-toolbar-tool-reference-title' => 'Havola qoʻyish',
+ 'wikieditor-toolbar-tool-reference-insert' => 'Qoʻyish',
'wikieditor-toolbar-tool-reference-text' => 'Havola matni',
'wikieditor-toolbar-tool-signature' => 'Imzo va vaqt',
- 'wikieditor-toolbar-section-advanced' => "Qo'shimcha",
+ 'wikieditor-toolbar-section-advanced' => 'Qoʻshimcha',
'wikieditor-toolbar-tool-heading' => 'Sarlavha',
'wikieditor-toolbar-tool-heading-1' => 'Daraja 1',
'wikieditor-toolbar-tool-heading-2' => 'Daraja 2',
@@ -28407,16 +29330,16 @@ $messages['uz'] = array(
'wikieditor-toolbar-tool-heading-5' => 'Daraja 5',
'wikieditor-toolbar-tool-heading-example' => 'Sarlavha matni',
'wikieditor-toolbar-group-format' => 'Formati',
- 'wikieditor-toolbar-tool-ulist' => "Belgili ro'yxat",
- 'wikieditor-toolbar-tool-ulist-example' => "Belgili ro'yxat qismi",
- 'wikieditor-toolbar-tool-olist' => "Raqamlangan ro'yxat",
- 'wikieditor-toolbar-tool-olist-example' => "Raqamlangan ro'yxat qismi",
+ 'wikieditor-toolbar-tool-ulist' => 'Belgili roʻyxat',
+ 'wikieditor-toolbar-tool-ulist-example' => 'Belgili roʻyxat qismi',
+ 'wikieditor-toolbar-tool-olist' => 'Raqamlangan roʻyxat',
+ 'wikieditor-toolbar-tool-olist-example' => 'Raqamlangan roʻyxat qismi',
'wikieditor-toolbar-tool-indent' => 'Xat boshi',
'wikieditor-toolbar-tool-indent-example' => 'Satr xat boshi bilan',
- 'wikieditor-toolbar-tool-nowiki' => "Viki-formatlashga e'tibor qilmaslik",
- 'wikieditor-toolbar-tool-nowiki-example' => "Bu yerga formatlash zarur bo'lmagan matnni qo'ying",
- 'wikieditor-toolbar-tool-redirect' => "Qaytayo'naltirish",
- 'wikieditor-toolbar-tool-redirect-example' => "Mo'ljal sahifa nomi",
+ 'wikieditor-toolbar-tool-nowiki' => 'Viki-formatlashga eʼtibor qilmaslik',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'Bu yerga formatlash zarur boʻlmagan matnni qoʻying',
+ 'wikieditor-toolbar-tool-redirect' => 'Qayta yoʻnaltirish',
+ 'wikieditor-toolbar-tool-redirect-example' => 'Moʻljal sahifa nomi',
'wikieditor-toolbar-tool-big' => 'Yirik',
'wikieditor-toolbar-tool-big-example' => 'Yirik matn',
'wikieditor-toolbar-tool-small' => 'Kichik',
@@ -28425,7 +29348,7 @@ $messages['uz'] = array(
'wikieditor-toolbar-tool-superscript-example' => 'Satrusti matn',
'wikieditor-toolbar-tool-subscript' => 'Satrosti',
'wikieditor-toolbar-tool-subscript-example' => 'Satrosti matn',
- 'wikieditor-toolbar-group-insert' => "Qo'yish",
+ 'wikieditor-toolbar-group-insert' => 'Qoʻyish',
'wikieditor-toolbar-tool-gallery' => 'Rasmlar galereyasi',
'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|Izoh1
$1:Example.jpg|Izoh2',
@@ -28445,33 +29368,33 @@ $1:Example.jpg|Izoh2',
| qator 2, katak 3',
'wikieditor-toolbar-tool-table-example-cell-text' => 'Katak matni',
'wikieditor-toolbar-tool-table-example-header' => 'Sarlavha matni',
- 'wikieditor-toolbar-tool-table-title' => "Jadval qo'yish",
+ 'wikieditor-toolbar-tool-table-title' => 'Jadval qoʻyish',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'Qatorlar',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'Ustunlar',
- 'wikieditor-toolbar-tool-table-dimensions-header' => "Sarlavha qatori qo'shish",
+ 'wikieditor-toolbar-tool-table-dimensions-header' => 'Sarlavha qatori qoʻshish',
'wikieditor-toolbar-tool-table-wikitable' => 'Chegaralar bilan bezash',
'wikieditor-toolbar-tool-table-sortable' => 'Jadvalni saralanadigan qilish',
'wikieditor-toolbar-tool-table-example' => 'Misol',
- 'wikieditor-toolbar-tool-table-preview' => "Batafsil ko'rinishi",
- 'wikieditor-toolbar-tool-table-insert' => "Qo'yish",
+ 'wikieditor-toolbar-tool-table-preview' => 'Batafsil koʻrinishi',
+ 'wikieditor-toolbar-tool-table-insert' => 'Qoʻyish',
'wikieditor-toolbar-tool-table-cancel' => 'Bekor',
- 'wikieditor-toolbar-tool-table-toomany' => "Ushbu dialog $1 ta katakdan katta hajmdagi jadvalni qo'yish imkonini bermaydi.",
- 'wikieditor-toolbar-tool-table-invalidnumber' => "To'g'ri qator yoki ustun miqdorini ko'rsatmadingiz.",
- 'wikieditor-toolbar-tool-table-zero' => "Siz nol miqdordagi qatorli yoki ustunli jadval qo'ya olmaysiz.",
- 'wikieditor-toolbar-tool-replace' => 'Qidiruv va almashtirish',
- 'wikieditor-toolbar-tool-replace-title' => 'Qidiruv va almashtirish',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Ushbu dialog 1000 ta katakdan katta hajmdagi jadvalni qoʻyish imkonini bermaydi.',
+ 'wikieditor-toolbar-tool-table-invalidnumber' => 'Toʻgʻri qator yoki ustun miqdorini koʻrsatmadingiz.',
+ 'wikieditor-toolbar-tool-table-zero' => 'Siz nol miqdordagi qatorli yoki ustunli jadval qoʻya olmaysiz.',
+ 'wikieditor-toolbar-tool-replace' => 'Qidirish va almashtirish',
+ 'wikieditor-toolbar-tool-replace-title' => 'Qidirish va almashtirish',
'wikieditor-toolbar-tool-replace-search' => 'Qidirish:',
'wikieditor-toolbar-tool-replace-replace' => 'Quyidagiga almashtirish:',
'wikieditor-toolbar-tool-replace-case' => 'Registrni hisobga olish',
- 'wikieditor-toolbar-tool-replace-regex' => 'Qidiruv satrini regulyar ifoda sifatida qarash',
+ 'wikieditor-toolbar-tool-replace-regex' => 'Qidiruv satrini muntazam ifoda deb hisoblash',
'wikieditor-toolbar-tool-replace-button-findnext' => 'Keyingisini qidirish',
'wikieditor-toolbar-tool-replace-button-replace' => 'Almashtirish',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Hammasini almashtirish',
'wikieditor-toolbar-tool-replace-close' => 'Yopish',
- 'wikieditor-toolbar-tool-replace-nomatch' => "Sizning so'rovingiz bo'yicha hech nima topilmadi.",
- 'wikieditor-toolbar-tool-replace-success' => '$1 ta almashtirish amalga oshirildi.',
- 'wikieditor-toolbar-tool-replace-emptysearch' => "Nimani qidirishni ko'rsatmadingiz.",
- 'wikieditor-toolbar-tool-replace-invalidregex' => 'Siz tomondan kiritilgan regulyar ifoda xato: $1',
+ 'wikieditor-toolbar-tool-replace-nomatch' => 'Sizning soʻrovingiz boʻyicha hech nima topilmadi.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 ta almashtirish amalga oshirildi.', # Fuzzy
+ 'wikieditor-toolbar-tool-replace-emptysearch' => 'Nimani qidirishni koʻrsatmadingiz.',
+ 'wikieditor-toolbar-tool-replace-invalidregex' => 'Siz kiritgan muntazam ifodada xatolik: $1',
'wikieditor-toolbar-section-characters' => 'Maxsus belgilar',
'wikieditor-toolbar-characters-page-latin' => 'Lotin',
'wikieditor-toolbar-characters-page-latinextended' => 'Lotin kengaytirilgan',
@@ -28492,14 +29415,16 @@ $1:Example.jpg|Izoh2',
'wikieditor-toolbar-characters-page-thai' => 'Tay',
'wikieditor-toolbar-characters-page-lao' => 'Laos',
'wikieditor-toolbar-characters-page-khmer' => 'Kxmer',
+ 'wikieditor-toolbar-characters-emdash' => 'uzun tire',
+ 'wikieditor-toolbar-characters-minus' => 'minus belgisi',
'wikieditor-toolbar-section-help' => 'Yordam',
- 'wikieditor-toolbar-help-heading-description' => 'Taʻrif',
+ 'wikieditor-toolbar-help-heading-description' => 'Taʼrif',
'wikieditor-toolbar-help-heading-syntax' => 'Nima kirityapsiz',
'wikieditor-toolbar-help-heading-result' => 'Nima olyapsiz',
'wikieditor-toolbar-help-page-format' => 'Formatlash',
'wikieditor-toolbar-help-page-link' => 'Havolalar',
'wikieditor-toolbar-help-page-heading' => 'Sarlavhalar',
- 'wikieditor-toolbar-help-page-list' => "Ro'yxatlar",
+ 'wikieditor-toolbar-help-page-list' => 'Roʻyxatlar',
'wikieditor-toolbar-help-page-file' => 'Fayllar',
'wikieditor-toolbar-help-page-reference' => 'Izohlar',
'wikieditor-toolbar-help-page-discussion' => 'Munozara',
@@ -28530,28 +29455,28 @@ $1:Example.jpg|Izoh2',
'wikieditor-toolbar-help-content-heading5-description' => '5-darajadagi sarlavha',
'wikieditor-toolbar-help-content-heading5-syntax' => '===== Sarlavha matni =====',
'wikieditor-toolbar-help-content-heading5-result' => '<h5>Sarlavha matni</h5>',
- 'wikieditor-toolbar-help-content-ulist-description' => "Belgili ro'yxat",
- 'wikieditor-toolbar-help-content-ulist-syntax' => "* Ro'yxat qismi<br />* Ro'yxat qismi",
- 'wikieditor-toolbar-help-content-ulist-result' => "<ul><li>Ro'yxat qismi</li><li>Ro'yxat qismi</li></ul>",
- 'wikieditor-toolbar-help-content-olist-description' => "Raqamlangan ro'yxat",
- 'wikieditor-toolbar-help-content-olist-syntax' => "# Ro'yxat qismi<br /># Ro'yxat qismi",
- 'wikieditor-toolbar-help-content-olist-result' => "<ol><li>Ro'yxat qismi</li><li>Ro'yxat qismi</li></ol>",
- 'wikieditor-toolbar-help-content-file-description' => "O'rnatilgan fayl",
+ 'wikieditor-toolbar-help-content-ulist-description' => 'Belgili roʻyxat',
+ 'wikieditor-toolbar-help-content-ulist-syntax' => '* Roʻyxat qismi<br />* Roʻyxat qismi',
+ 'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Roʻyxat qismi</li><li>Roʻyxat qismi</li></ul>',
+ 'wikieditor-toolbar-help-content-olist-description' => 'Raqamlangan roʻyxat',
+ 'wikieditor-toolbar-help-content-olist-syntax' => '# Roʻyxat qismi<br /># Roʻyxat qismi',
+ 'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Roʻyxat qismi</li><li>Roʻyxat qismi</li></ol>',
+ 'wikieditor-toolbar-help-content-file-description' => 'Oʻrnatilgan fayl',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Izohlovchi matn]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='
Izohlovchi matn' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Kattalashtirish' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>
Izohlovchi matn</div></div>",
'wikieditor-toolbar-help-content-reference-description' => 'Izoh',
- 'wikieditor-toolbar-help-content-reference-syntax' => 'Sahifa matni.&lt;ref name="test"&gt;[http://www.example.org Havola matni], qo\'shimcha matn.&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'Sahifa matni.&lt;ref name="test"&gt;[http://www.example.org Havola matni], qoʻshimcha matn.&lt;/ref&gt;',
'wikieditor-toolbar-help-content-reference-result' => "Sahifa matni.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-rereference-description' => "O'sha havoladan qo'shimcha foydalanish",
+ 'wikieditor-toolbar-help-content-rereference-description' => 'Oʻsha havoladan qoʻshimcha foydalanish',
'wikieditor-toolbar-help-content-rereference-result' => "Sahifa matni.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-showreferences-description' => "Izohlarni ko'rsatish",
- 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Havola matni</a>, qo'shimcha matn.</li></ol>",
+ 'wikieditor-toolbar-help-content-showreferences-description' => 'Izohlarni koʻrsatish',
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Havola matni</a>, qoʻshimcha matn.</li></ol>",
'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Imzo vaqt bilan birga',
- 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Ishtirokchi ismi</a> (<a href='#' title='{{#special:mytalk}}'>munozara</a>) 15:54, 10 iyun 2009 (UTC)",
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Foydalanuvchi nomi</a> (<a href='#' title='{{#special:mytalk}}'>munozara</a>) 15:54, 10 iyun 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Imzo',
- 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Ishtirokchi ismi</a> (<a href='#' title='{{#special:mytalk}}'>munozara</a>)",
+ 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Foydalanuvchi nomi</a> (<a href='#' title='{{#special:mytalk}}'>munozara</a>)",
'wikieditor-toolbar-help-content-indent-description' => 'Xat boshi',
'wikieditor-toolbar-help-content-indent-syntax' => 'Odatiy matn<br />:Matn xat boshi bilan<br />::Matn xat boshi bilan',
'wikieditor-toolbar-help-content-indent-result' => 'Odatiy matn<dl><dd>Matn xat boshi bilan<dl><dd>Matn xat boshi bilan</dd></dl></dd></dl>',
@@ -28559,11 +29484,12 @@ Izohlovchi matn</div></div>",
/** vèneto (vèneto)
* @author Candalua
+ * @author GatoSelvadego
* @author Vajotwo
*/
$messages['vec'] = array(
'wikieditor' => 'Interfacia avansada de modifica testo wiki',
- 'wikieditor-desc' => 'Fornisse na interfacia avansada de modifica testo wiki e vari moduli funsionali',
+ 'wikieditor-desc' => 'Fornise na interfacia avansada de modifica testo wiki e vari moduli funsionali',
'wikieditor-wikitext-tab' => 'Testo wiki',
'wikieditor-loading' => 'Drio cargar...',
'wikieditor-preview-preference' => "Ativa l'anteprima parte par parte",
@@ -28573,75 +29499,86 @@ $messages['vec'] = array(
'wikieditor-previewDialog-preference' => 'Abilita la finestra de dialogo de anteprima',
'wikieditor-previewDialog-tab' => 'Anteprima',
'wikieditor-previewDialog-loading' => "So' drio cargar...",
- 'wikieditor-publish-preference' => 'Intaca la publicassion un toco a la olta',
+ 'wikieditor-publish-preference' => 'Intaca la publicasion un toco a la olta',
'wikieditor-publish-button-publish' => 'Pùblica',
'wikieditor-publish-button-cancel' => 'Anula',
'wikieditor-publish-dialog-title' => 'Pùblica su {{SITENAME}}',
'wikieditor-publish-dialog-summary' => 'Somario de la modifica (descrivi brevemente i canbiamenti che te ghè fato):',
'wikieditor-publish-dialog-minor' => 'Modifica picenina',
- 'wikieditor-publish-dialog-watch' => "Tien d'ocio sta pagina",
+ 'wikieditor-publish-dialog-watch' => "Tien d'ocio sta pàgina",
'wikieditor-publish-dialog-publish' => 'Pùblica',
'wikieditor-publish-dialog-goback' => 'Torna indrìo',
'wikieditor-template-editor-preference' => 'Intaca par i modèi wiki la modifica basà sui mòduli',
- 'wikieditor-template-editor-dialog-title' => 'Modifega modeło',
- 'wikieditor-template-editor-dialog-submit' => 'Ajorna',
+ 'wikieditor-template-editor-dialog-title' => 'Modifega modèl',
+ 'wikieditor-template-editor-dialog-submit' => 'Axorna',
'wikieditor-template-editor-dialog-cancel' => 'Anuła',
- 'wikieditor-templates-preference' => 'Abiłita ła funsion par nascondere i modełi',
- 'wikieditor-toc-preference' => "Ativa l'indice navigabile",
- 'wikieditor-toc-show' => 'Fà védar el contenuto',
- 'wikieditor-toc-hide' => 'Scondi el contenuto',
+ 'wikieditor-templates-preference' => 'Abiłita ła funsion par scondare i modèłi',
+ 'wikieditor-toc-preference' => "Ativa l'indice navegabile",
+ 'wikieditor-toc-show' => 'Fà védar el contegnùo',
+ 'wikieditor-toc-hide' => 'Scondi el contegnùo',
'wikieditor-toolbar' => 'Bara dei strumenti de modifica',
- 'wikieditor-toolbar-desc' => 'Modifica bara dei strumenti de la pagina co na magiore usabilità',
+ 'wikieditor-toolbar-desc' => 'Modifica bara dei strumenti de la pàgina co na magiore uxabilità',
'wikieditor-toolbar-preference' => 'Abilita bara dei strumenti de modifica avansada',
- 'wikieditor-toolbar-dialogs-preference' => 'Intacar i ajuti par zontar colegamenti, tabèle e altro',
+ 'wikieditor-toolbar-dialogs-preference' => 'Intacar i ajuti par xontar colegamenti, tabèle e altro',
+ 'wikieditor-toolbar-hidesig' => "Sconde el boton de ła firma da łe pàjine inte'l namespace prinsipałe",
'wikieditor-toolbar-loading' => "So' drio cargar...",
- 'wikieditor-toolbar-tool-bold' => 'Grasseto',
- 'wikieditor-toolbar-tool-bold-example' => 'Testo in grasseto',
+ 'wikieditor-toolbar-tool-bold' => 'Graseto',
+ 'wikieditor-toolbar-tool-bold-example' => 'Testo in graseto',
'wikieditor-toolbar-tool-italic' => 'Corsivo',
'wikieditor-toolbar-tool-italic-example' => 'Testo in corsivo',
'wikieditor-toolbar-tool-ilink' => 'Colegamento interno',
- 'wikieditor-toolbar-tool-ilink-example' => 'Titolo del colegamento',
- 'wikieditor-toolbar-tool-xlink' => 'Colegamento esterno (ricòrdete el prefisso http:// )',
+ 'wikieditor-toolbar-tool-ilink-example' => 'Tìtolo del colegamento',
+ 'wikieditor-toolbar-tool-xlink' => 'Colegamento esterno (ricòrdete el prefiso http:// )',
'wikieditor-toolbar-tool-xlink-example' => 'http://www.esenpio.com titolo del colegamento',
'wikieditor-toolbar-tool-link' => 'Colegamento',
- 'wikieditor-toolbar-tool-link-title' => 'Inserissi colegamento',
- 'wikieditor-toolbar-tool-link-int' => 'a na pagina wiki',
- 'wikieditor-toolbar-tool-link-int-target' => 'titolo de la pagina:',
- 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Titolo de la pagina o URL',
+ 'wikieditor-toolbar-tool-link-title' => 'Inserisi colegamento',
+ 'wikieditor-toolbar-tool-link-int' => 'a na pàgina wiki',
+ 'wikieditor-toolbar-tool-link-int-target' => 'titolo de la pàgina:',
+ 'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Tìtolo de la pàgina o URL',
'wikieditor-toolbar-tool-link-int-text' => 'Testo del colegamento:',
- 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Inserissi el testo che te vol che se veda',
- 'wikieditor-toolbar-tool-link-ext' => 'a na pagina web esterna',
- 'wikieditor-toolbar-tool-link-ext-target' => 'Indirisso del colegamento:',
+ 'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Inserisi el testo che te vol che se veda',
+ 'wikieditor-toolbar-tool-link-ext' => 'a na pàgina web esterna',
+ 'wikieditor-toolbar-tool-link-ext-target' => 'Indiriso del colegamento:',
'wikieditor-toolbar-tool-link-ext-text' => 'Testo del colegamento:',
- 'wikieditor-toolbar-tool-link-insert' => 'Inserissi colegamento',
+ 'wikieditor-toolbar-tool-link-insert' => 'Inserisi colegamento',
'wikieditor-toolbar-tool-link-cancel' => 'Anula',
- 'wikieditor-toolbar-tool-link-int-target-status-exists' => 'La pagina la esiste zà',
- 'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'La pagina no la esiste',
- 'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Titolo mia valido',
+ 'wikieditor-toolbar-tool-link-int-target-status-exists' => 'La pàgina la esiste xà',
+ 'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'La pàgina no la existe',
+ 'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Tìtolo mia valido',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Colegamento par fora',
- 'wikieditor-toolbar-tool-link-int-target-status-loading' => "So' drio controlar se la pagina la esiste o no...",
- 'wikieditor-toolbar-tool-link-int-invalid' => "El titolo che te ghè indicà no'l xe mia valido.",
- 'wikieditor-toolbar-tool-link-lookslikeinternal' => "L'URL che te ghè inserìo pararìa che el ponta verso de na pagina wiki difarente. Vuto farlo deventar un colegamento interno?",
+ 'wikieditor-toolbar-tool-link-int-target-status-loading' => "So' drio controlar se la pàgina la existe o no...",
+ 'wikieditor-toolbar-tool-link-int-invalid' => "El tìtolo che te ghè indicà no'l xe mia valido.",
+ 'wikieditor-toolbar-tool-link-lookslikeinternal' => "L'URL che te ghè inserìo pararìa che el ponta verso de na pàgina wiki difarente. Vuto farlo deventar un colegamento interno?",
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Colegamento interno',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Colegamento esterno',
- 'wikieditor-toolbar-tool-link-empty' => 'No te ghè messo gnente a cui pontar.',
+ 'wikieditor-toolbar-tool-link-empty' => 'No te ghè meso gnente a cui pontar.',
'wikieditor-toolbar-tool-file' => 'File incorporado',
- 'wikieditor-toolbar-tool-file-example' => 'Esenpio.jpg',
- 'wikieditor-toolbar-tool-reference' => 'Nota',
- 'wikieditor-toolbar-tool-reference-example' => 'Inserissi qua el testo de la nota',
+ 'wikieditor-toolbar-tool-file-example' => 'Exenpio.jpg',
+ 'wikieditor-toolbar-tool-file-title' => 'Inserisi file',
+ 'wikieditor-toolbar-file-target' => 'Nòme del file:',
+ 'wikieditor-toolbar-file-caption' => 'Didascałia:',
+ 'wikieditor-toolbar-file-size' => 'Dimension:',
+ 'wikieditor-toolbar-file-float' => 'Alineamento:',
+ 'wikieditor-toolbar-file-default' => '(predefinìo)',
+ 'wikieditor-toolbar-file-format' => 'Formato:',
+ 'wikieditor-toolbar-file-format-none' => 'nisun',
+ 'wikieditor-toolbar-tool-file-insert' => 'Inserisi',
+ 'wikieditor-toolbar-tool-file-cancel' => 'Anuła',
+ 'wikieditor-toolbar-tool-reference' => 'Nòda',
+ 'wikieditor-toolbar-tool-reference-example' => 'Inserisi cuà el testo de la nòda',
'wikieditor-toolbar-tool-reference-cancel' => 'Anuła',
- 'wikieditor-toolbar-tool-reference-title' => 'Inserissi nota',
- 'wikieditor-toolbar-tool-reference-insert' => 'Inserissi',
- 'wikieditor-toolbar-tool-reference-text' => 'Testo de Å‚a nota',
+ 'wikieditor-toolbar-tool-reference-title' => 'Inserisi nòda',
+ 'wikieditor-toolbar-tool-reference-insert' => 'Inserisi',
+ 'wikieditor-toolbar-tool-reference-text' => 'Testo de ła nòda',
'wikieditor-toolbar-tool-signature' => 'Firma e data',
'wikieditor-toolbar-section-advanced' => 'Avansada',
- 'wikieditor-toolbar-tool-heading' => 'Intestassion',
+ 'wikieditor-toolbar-tool-heading' => 'Intestasion',
'wikieditor-toolbar-tool-heading-1' => 'Livèl 1',
'wikieditor-toolbar-tool-heading-2' => 'Livèl 2',
'wikieditor-toolbar-tool-heading-3' => 'Livèl 3',
'wikieditor-toolbar-tool-heading-4' => 'Livèl 4',
'wikieditor-toolbar-tool-heading-5' => 'Livèl 5',
- 'wikieditor-toolbar-tool-heading-example' => 'Titolo sezion',
+ 'wikieditor-toolbar-tool-heading-example' => 'Tìtolo sesion',
'wikieditor-toolbar-group-format' => 'Formato',
'wikieditor-toolbar-tool-ulist' => 'Elenco puntà',
'wikieditor-toolbar-tool-ulist-example' => "Elemento de l'elenco puntà",
@@ -28649,10 +29586,10 @@ $messages['vec'] = array(
'wikieditor-toolbar-tool-olist-example' => "Elemento de l'elenco numarà",
'wikieditor-toolbar-tool-indent' => 'Rientro',
'wikieditor-toolbar-tool-indent-example' => 'Riga rientrà',
- 'wikieditor-toolbar-tool-nowiki' => 'Ignora formataxion wiki',
- 'wikieditor-toolbar-tool-nowiki-example' => 'Inserissi el testo da no formatare',
- 'wikieditor-toolbar-tool-redirect' => "Rinvia a n'altra pajina",
- 'wikieditor-toolbar-tool-redirect-example' => 'Nome de Å‚a pajina de destinaxion',
+ 'wikieditor-toolbar-tool-nowiki' => 'Ignora formatasion wiki',
+ 'wikieditor-toolbar-tool-nowiki-example' => 'Inserisi el testo da no formatare',
+ 'wikieditor-toolbar-tool-redirect' => "Rinvia a n'altra pàjina",
+ 'wikieditor-toolbar-tool-redirect-example' => 'Nome de ła pàjina de destinasion',
'wikieditor-toolbar-tool-big' => 'Grando',
'wikieditor-toolbar-tool-big-example' => 'Testo grando',
'wikieditor-toolbar-tool-small' => 'Picenin',
@@ -28661,107 +29598,114 @@ $messages['vec'] = array(
'wikieditor-toolbar-tool-superscript-example' => 'Testo in àpice',
'wikieditor-toolbar-tool-subscript' => 'Pèdice',
'wikieditor-toolbar-tool-subscript-example' => 'Testo in pèdice',
- 'wikieditor-toolbar-group-insert' => 'Inserissi',
+ 'wikieditor-toolbar-group-insert' => 'Inserisi',
'wikieditor-toolbar-tool-gallery' => 'Galerìa fotografica',
- 'wikieditor-toolbar-tool-gallery-example' => '$1:Esenpio.jpg|Didascalia1
-$1:Esenpio.jpg|Didascalia2',
+ 'wikieditor-toolbar-tool-gallery-example' => '$1:Exenpio.jpg|Didascalia1
+$1:Exenpio.jpg|Didascalia2',
'wikieditor-toolbar-tool-newline' => 'Riga nova',
'wikieditor-toolbar-tool-table' => 'Tabèla',
'wikieditor-toolbar-tool-table-example-old' => '-
-! intestassion 1
-! intestassion 2
-! intestassion 3
+! intestasion 1
+! intestasion 2
+! intestasion 3
|-
-| riga 1, casèla 1
-| riga 1, casèla 2
-| riga 1, casèla 3
+| riga 1, caxèla 1
+| riga 1, caxèla 2
+| riga 1, caxèla 3
|-
-| riga 2, casèla 1
-| riga 2, casèla 2
-| riga 2, casèla 3',
- 'wikieditor-toolbar-tool-table-example-cell-text' => 'Testo de la casèla',
- 'wikieditor-toolbar-tool-table-example-header' => "Testo de l'intestassion",
- 'wikieditor-toolbar-tool-table-title' => 'Inserissi na tabèla',
+| riga 2, caxèla 1
+| riga 2, caxèla 2
+| riga 2, caxèla 3',
+ 'wikieditor-toolbar-tool-table-example-cell-text' => 'Testo de la caxèla',
+ 'wikieditor-toolbar-tool-table-example-header' => "Testo de l'intestasion",
+ 'wikieditor-toolbar-tool-table-title' => 'Inserisi na tabèla',
'wikieditor-toolbar-tool-table-dimensions-rows' => 'Lìnie',
'wikieditor-toolbar-tool-table-dimensions-columns' => 'Colone',
- 'wikieditor-toolbar-tool-table-dimensions-header' => 'Includi la riga de intestassion',
+ 'wikieditor-toolbar-tool-table-dimensions-header' => 'Includi la riga de intestasion',
'wikieditor-toolbar-tool-table-wikitable' => 'Stile coi bordi',
'wikieditor-toolbar-tool-table-sortable' => 'Tabèla ordinabile',
- 'wikieditor-toolbar-tool-table-example' => 'Testo de la casèla',
+ 'wikieditor-toolbar-tool-table-example' => 'Testo de la caxèla',
'wikieditor-toolbar-tool-table-preview' => 'Anteprima',
- 'wikieditor-toolbar-tool-table-insert' => 'Inserissi',
+ 'wikieditor-toolbar-tool-table-insert' => 'Inserisi',
'wikieditor-toolbar-tool-table-cancel' => 'Anùla',
- 'wikieditor-toolbar-tool-table-toomany' => 'Co sto comando no se pole inserir na tabèla con piassè de $1 casèle.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Có sto comando nó se pol inserir na tabèla có piasè de 1000 caxèłe.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'No te ghè inserìo un nùmaro valido de righe o colòne.',
- 'wikieditor-toolbar-tool-table-zero' => 'No te poli inserir na tabèla con zero righe o colòne.',
- 'wikieditor-toolbar-tool-replace' => 'Serca e sostituìssi',
- 'wikieditor-toolbar-tool-replace-title' => 'Serca e sostituìssi',
+ 'wikieditor-toolbar-tool-table-zero' => 'No te poi inserir na tabèla co xero righe o colòne.',
+ 'wikieditor-toolbar-tool-replace' => 'Serca e sostituìsi',
+ 'wikieditor-toolbar-tool-replace-title' => 'Serca e sostituìsi',
'wikieditor-toolbar-tool-replace-search' => 'Serca:',
- 'wikieditor-toolbar-tool-replace-replace' => 'Sostituìssi con:',
+ 'wikieditor-toolbar-tool-replace-replace' => 'Sostituìsi co:',
'wikieditor-toolbar-tool-replace-case' => 'Corispondensa maiuscolo/minuscolo',
- 'wikieditor-toolbar-tool-replace-regex' => 'Testo de la riserca come espression regolare',
- 'wikieditor-toolbar-tool-replace-button-findnext' => 'Cata el pròssimo',
- 'wikieditor-toolbar-tool-replace-button-replaceall' => 'Sostituìssi tuto',
+ 'wikieditor-toolbar-tool-replace-regex' => 'Testo de la riserca come espresion regolare',
+ 'wikieditor-toolbar-tool-replace-button-findnext' => 'Cata el pròsimo',
+ 'wikieditor-toolbar-tool-replace-button-replace' => 'Sostituisi',
+ 'wikieditor-toolbar-tool-replace-button-replaceall' => 'Sostituìsi tuto',
'wikieditor-toolbar-tool-replace-close' => 'Sara',
- 'wikieditor-toolbar-tool-replace-nomatch' => 'No gavemo catà gnente che corisponde a quel che te serchi.',
- 'wikieditor-toolbar-tool-replace-success' => '$1 sostitussion fate.',
+ 'wikieditor-toolbar-tool-replace-nomatch' => 'No gavemo catà gnente che corisponde a cuel che te serchi.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|sostitusion efetuà|sostitusion efetuae}}.',
'wikieditor-toolbar-tool-replace-emptysearch' => 'No te ghè inserìo gnente da sercar.',
- 'wikieditor-toolbar-tool-replace-invalidregex' => "L'espression regolare che te ghè inserìo no la xe mia valida: $1",
+ 'wikieditor-toolbar-tool-replace-invalidregex' => "L'espresion regolare che te ghè inserìo no la xe mia valida: $1",
'wikieditor-toolbar-section-characters' => 'Caràteri speciali',
'wikieditor-toolbar-characters-page-latin' => 'Latìn',
- 'wikieditor-toolbar-characters-page-latinextended' => 'Latìn esteso',
+ 'wikieditor-toolbar-characters-page-latinextended' => 'Latìn estexo',
'wikieditor-toolbar-characters-page-ipa' => 'IPA',
'wikieditor-toolbar-characters-page-symbols' => 'Sìnboli',
'wikieditor-toolbar-characters-page-greek' => 'Grego',
'wikieditor-toolbar-characters-page-cyrillic' => 'Cirìlico',
'wikieditor-toolbar-characters-page-arabic' => 'Àrabo',
+ 'wikieditor-toolbar-characters-page-arabicextended' => 'Arabo estexo',
'wikieditor-toolbar-characters-page-persian' => 'Persian',
- 'wikieditor-toolbar-characters-page-hebrew' => 'Ebràico',
+ 'wikieditor-toolbar-characters-page-hebrew' => 'Abràego',
'wikieditor-toolbar-characters-page-bangla' => 'Bengałexe',
+ 'wikieditor-toolbar-characters-page-tamil' => 'Tamil',
'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
'wikieditor-toolbar-characters-page-sinhala' => 'Singalese',
'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
+ 'wikieditor-toolbar-characters-page-devanagari' => 'Devanagari',
'wikieditor-toolbar-characters-page-thai' => 'Thaiłandexe',
'wikieditor-toolbar-characters-page-lao' => 'Lao',
'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+ 'wikieditor-toolbar-characters-endash' => 'lineeta ene',
+ 'wikieditor-toolbar-characters-emdash' => 'lineeta eme',
+ 'wikieditor-toolbar-characters-minus' => 'segno meno',
'wikieditor-toolbar-section-help' => 'Ajuto',
- 'wikieditor-toolbar-help-heading-description' => 'Descrission',
- 'wikieditor-toolbar-help-heading-syntax' => 'Quel che te scrivi',
- 'wikieditor-toolbar-help-heading-result' => 'Quel che te otien',
- 'wikieditor-toolbar-help-page-format' => 'Formatassion',
+ 'wikieditor-toolbar-help-heading-description' => 'Descrision',
+ 'wikieditor-toolbar-help-heading-syntax' => 'Cuel che te scrivi',
+ 'wikieditor-toolbar-help-heading-result' => 'Cuel che te otien',
+ 'wikieditor-toolbar-help-page-format' => 'Formatasion',
'wikieditor-toolbar-help-page-link' => 'Colegamenti',
- 'wikieditor-toolbar-help-page-heading' => 'Intestassion',
+ 'wikieditor-toolbar-help-page-heading' => 'Intestasion',
'wikieditor-toolbar-help-page-list' => 'Liste',
'wikieditor-toolbar-help-page-file' => 'File',
- 'wikieditor-toolbar-help-page-reference' => 'Note',
- 'wikieditor-toolbar-help-page-discussion' => 'Discussion',
+ 'wikieditor-toolbar-help-page-reference' => 'Nòde',
+ 'wikieditor-toolbar-help-page-discussion' => 'Discusion',
'wikieditor-toolbar-help-content-italic-description' => 'Corsivo',
'wikieditor-toolbar-help-content-italic-syntax' => "''Testo in corsivo''",
'wikieditor-toolbar-help-content-italic-result' => '<em>Testo in corsivo</em>',
- 'wikieditor-toolbar-help-content-bold-description' => 'Grasseto',
- 'wikieditor-toolbar-help-content-bold-syntax' => "'''Testo in grasseto'''",
- 'wikieditor-toolbar-help-content-bold-result' => '<strong>Testo in grasseto</strong>',
- 'wikieditor-toolbar-help-content-bolditalic-description' => 'Grasseto e corsivo',
- 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Testo in grasseto e corsivo'''''",
- 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Testo in grasseto e corsivo</em></strong>',
+ 'wikieditor-toolbar-help-content-bold-description' => 'Graseto',
+ 'wikieditor-toolbar-help-content-bold-syntax' => "'''Testo in graseto'''",
+ 'wikieditor-toolbar-help-content-bold-result' => '<strong>Testo in graseto</strong>',
+ 'wikieditor-toolbar-help-content-bolditalic-description' => 'Graseto e corsivo',
+ 'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Testo in graseto e corsivo'''''",
+ 'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Testo in graseto e corsivo</em></strong>',
'wikieditor-toolbar-help-content-ilink-description' => 'Colegamento interno',
'wikieditor-toolbar-help-content-ilink-syntax' => '[[Page title|Eticheta colegamento]]<br />[[Page title]]',
- 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Eticheta colegamento</a><br /><a href='#'>Titolo pagina</a>",
+ 'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Eticheta colegamento</a><br /><a href='#'>Tìtolo pàgina</a>",
'wikieditor-toolbar-help-content-xlink-description' => 'Colegamento esterno',
- 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.esenpio.org Eticheta colegamento]<br />[http://www.esenpio.org]<br />http://www.esenpio.org',
- 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Eticheta colegamento</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.esenpio.org</a>",
- 'wikieditor-toolbar-help-content-heading2-description' => 'Intestassion de secondo livèl',
- 'wikieditor-toolbar-help-content-heading2-syntax' => '== Titolo de la sezion ==',
- 'wikieditor-toolbar-help-content-heading2-result' => '<h2>Titolo de la sezion</h2>',
- 'wikieditor-toolbar-help-content-heading3-description' => 'Intestassion de terso livèl',
- 'wikieditor-toolbar-help-content-heading3-syntax' => '=== Titolo de la sezion ===',
- 'wikieditor-toolbar-help-content-heading3-result' => '<h3>Titolo de la sezion</h3>',
- 'wikieditor-toolbar-help-content-heading4-description' => 'Intestassion de quarto livèl',
- 'wikieditor-toolbar-help-content-heading4-syntax' => '==== Titolo de la sezion ====',
- 'wikieditor-toolbar-help-content-heading4-result' => '<h4>Titolo de la sezion</h4>',
- 'wikieditor-toolbar-help-content-heading5-description' => 'Intestassion de quinto livèl',
- 'wikieditor-toolbar-help-content-heading5-syntax' => '===== Titolo de la sezion =====',
- 'wikieditor-toolbar-help-content-heading5-result' => '<h5>Titolo de la sezion</h5>',
+ 'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.exenpio.org Eticheta colegamento]<br />[http://www.exenpio.org]<br />http://www.exenpio.org',
+ 'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Eticheta colegamento</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.exenpio.org</a>",
+ 'wikieditor-toolbar-help-content-heading2-description' => 'Intestasion de secondo livèl',
+ 'wikieditor-toolbar-help-content-heading2-syntax' => '== Tìtolo de la sesion ==',
+ 'wikieditor-toolbar-help-content-heading2-result' => '<h2>Tìtolo de la sesion</h2>',
+ 'wikieditor-toolbar-help-content-heading3-description' => 'Intestasion de terso livèl',
+ 'wikieditor-toolbar-help-content-heading3-syntax' => '=== Tìtolo de la sesion ===',
+ 'wikieditor-toolbar-help-content-heading3-result' => '<h3>Tìtolo de la sesion</h3>',
+ 'wikieditor-toolbar-help-content-heading4-description' => 'Intestasion de cuarto livèl',
+ 'wikieditor-toolbar-help-content-heading4-syntax' => '==== Tìtolo de la sesion ====',
+ 'wikieditor-toolbar-help-content-heading4-result' => '<h4>Tìtolo de la sesion</h4>',
+ 'wikieditor-toolbar-help-content-heading5-description' => 'Intestasion de cuinto livèl',
+ 'wikieditor-toolbar-help-content-heading5-syntax' => '===== Tìtolo de la sesion =====',
+ 'wikieditor-toolbar-help-content-heading5-result' => '<h5>Tìtolo de la sesion</h5>',
'wikieditor-toolbar-help-content-ulist-description' => 'Elenco pontà',
'wikieditor-toolbar-help-content-ulist-syntax' => "* Elemento de l'elenco<br />* Elemento de l'elenco",
'wikieditor-toolbar-help-content-ulist-result' => "<ul><li>Elemento de l'elenco</li><li>Elemento de l'elenco</li></ul>",
@@ -28771,17 +29715,17 @@ $1:Esenpio.jpg|Didascalia2',
'wikieditor-toolbar-help-content-file-description' => 'File incorporado',
'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Testo de la didascalia]]',
'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Caption text' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Enlarge' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Testo de la didascalia</div></div>",
- 'wikieditor-toolbar-help-content-reference-description' => 'Nota',
- 'wikieditor-toolbar-help-content-reference-syntax' => 'Testo de la pagina.&lt;ref name="test"&gt;[http://www.esenpio.org Testo del colegamento], altro testo in più.&lt;/ref&gt;',
- 'wikieditor-toolbar-help-content-reference-result' => "Testo de la pagina.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-rereference-description' => 'Doparar ancora la stessa nota',
- 'wikieditor-toolbar-help-content-rereference-result' => "Testo de la pagina.<sup><a href='#'>[1]</a></sup>",
- 'wikieditor-toolbar-help-content-showreferences-description' => 'Mostra le note',
- 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.esenpio.org' class='external text' href='#'>Testo del colegamento</a>, altro testo in più.</li></ol>",
- 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Firma con data e ora',
- 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Nome utente</a> (<a href='#' title='{{#special:mytalk}}'>discussion</a>) 15:54, 10 giu 2009 (UTC)",
+ 'wikieditor-toolbar-help-content-reference-description' => 'Nòda',
+ 'wikieditor-toolbar-help-content-reference-syntax' => 'Testo de la pàgina.&lt;ref name="test"&gt;[http://www.exenpio.org Testo del colegamento], altro testo in pì.&lt;/ref&gt;',
+ 'wikieditor-toolbar-help-content-reference-result' => "Testo de la pàgina.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-rereference-description' => 'Doparar ancora la stesa nòda',
+ 'wikieditor-toolbar-help-content-rereference-result' => "Testo de la pàgina.<sup><a href='#'>[1]</a></sup>",
+ 'wikieditor-toolbar-help-content-showreferences-description' => 'Mostra le nòde',
+ 'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.exenpio.org' class='external text' href='#'>Testo del colegamento</a>, altro testo in pì.</li></ol>",
+ 'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Firma co data e ora',
+ 'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Nome utente</a> (<a href='#' title='{{#special:mytalk}}'>discusion</a>) 15:54, 10 giu 2009 (UTC)",
'wikieditor-toolbar-help-content-signature-description' => 'Firma',
- 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Nome utente</a> (<a href='#' title='{{#special:mytalk}}'>discussion</a>)",
+ 'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Nome utente</a> (<a href='#' title='{{#special:mytalk}}'>discusion</a>)",
'wikieditor-toolbar-help-content-indent-description' => 'Rientro',
'wikieditor-toolbar-help-content-indent-syntax' => 'Testo normal<br />:Testo rientrà<br />::Testo rientra',
'wikieditor-toolbar-help-content-indent-result' => 'Testo normal<dl><dd>Testo rientrà<dl><dd>Testo rientrà</dd></dl></dd></dl>',
@@ -28938,7 +29882,7 @@ $messages['vi'] = array(
'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Tá»±a sai',
'wikieditor-toolbar-tool-link-int-target-status-external' => 'Liên kết ngoài',
'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Kiểm tra trang đã tồn tại chưa...',
- 'wikieditor-toolbar-tool-link-int-invalid' => 'Tựa trang chỉ định không hợp lệ.',
+ 'wikieditor-toolbar-tool-link-int-invalid' => 'Tên trang chỉ định không hợp lệ.',
'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Hình nhÆ° bạn đã chá»n URL chỉ đến trang wiki khác. Bạn có muốn biến nó thành liên kết ná»™i bá»™ không?',
'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Liên kết nội bộ',
'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Liên kết ngoài',
@@ -29019,7 +29963,7 @@ $1:Ví dụ.jpg|Chú thích 2',
'wikieditor-toolbar-tool-table-preview' => 'Xem trÆ°á»›c',
'wikieditor-toolbar-tool-table-insert' => 'Chèn',
'wikieditor-toolbar-tool-table-cancel' => 'Hủy bá»',
- 'wikieditor-toolbar-tool-table-toomany' => 'Không thể dùng hộp thoại này để chèn bảng có hơn $1 ô.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Không thể dùng hộp thoại này để chèn bảng có hơn 1.000 ô.',
'wikieditor-toolbar-tool-table-invalidnumber' => 'Bạn đã nhập số hàng hay cột không hợp lệ.',
'wikieditor-toolbar-tool-table-zero' => 'Không thể chèn bảng không có hàng hay cột nào.',
'wikieditor-toolbar-tool-replace' => 'Tìm và thay thế',
@@ -29062,7 +30006,7 @@ $1:Ví dụ.jpg|Chú thích 2',
'wikieditor-toolbar-section-help' => 'Trợ giúp',
'wikieditor-toolbar-help-heading-description' => 'Miêu tả',
'wikieditor-toolbar-help-heading-syntax' => 'Bạn nhập',
- 'wikieditor-toolbar-help-heading-result' => 'Nhận được',
+ 'wikieditor-toolbar-help-heading-result' => 'Kết quả',
'wikieditor-toolbar-help-page-format' => 'Äịnh dạng',
'wikieditor-toolbar-help-page-link' => 'Liên kết',
'wikieditor-toolbar-help-page-heading' => 'Äá» mục',
@@ -29242,7 +30186,7 @@ $1:Misaal.jpg|Faramfacce2',
'wikieditor-toolbar-tool-table-preview' => 'Wonendi',
'wikieditor-toolbar-tool-table-insert' => 'Roof',
'wikieditor-toolbar-tool-table-cancel' => 'Neenal',
- 'wikieditor-toolbar-tool-table-toomany' => 'Maneesula roofub xaatim bu weesu $1 kër ak bii jumtukaay.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'Maneesula roofub xaatim bu weesu $1 kër ak bii jumtukaay.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Duggaloo limub rëdd walla keno bu baax.',
'wikieditor-toolbar-tool-table-zero' => 'Manoo roofub xaatim bu amul rëdd walla keno',
'wikieditor-toolbar-tool-replace' => 'Seet te wuutu',
@@ -29254,7 +30198,7 @@ $1:Misaal.jpg|Faramfacce2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'Wuutal yépp',
'wikieditor-toolbar-tool-replace-close' => 'Neenal', # Fuzzy
'wikieditor-toolbar-tool-replace-nomatch' => 'Sa ceet gi jurul dara',
- 'wikieditor-toolbar-tool-replace-success' => '$1 wuutu lees def',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 wuutu lees def', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Waxoo looy seet.',
);
@@ -29413,7 +30357,7 @@ $1:בײַשפיל.jpg|קעפל2',
'wikieditor-toolbar-tool-table-preview' => 'פֿ×ר×ויסשטעלונג',
'wikieditor-toolbar-tool-table-insert' => 'צולייגן',
'wikieditor-toolbar-tool-table-cancel' => '×נולירן',
- 'wikieditor-toolbar-tool-table-toomany' => 'מיט ×“×¢× ×“×™×ַל××’ ××™×– נישט מעגלעך ×ַרײַנשטעלן × ×˜×ַבעלע מיט מער ווי $1 צעלן',
+ 'wikieditor-toolbar-tool-table-toomany' => 'מיט ×“×¢× ×“×™×ַל××’ ××™×– נישט מעגלעך ×ַרײַנשטעלן × ×˜×ַבעלע מיט מער ווי 1000 צעלן',
'wikieditor-toolbar-tool-table-invalidnumber' => '×יר ×”×ָט נישט ×רײַנגעגעבן ×Ö· גילטיקן נומער פון שורות ×ָדער זיילן.',
'wikieditor-toolbar-tool-table-zero' => '×יר קענט נישט ×ַרײַנשטעלן × ×˜×ַבעלע מיט נול שורות ×דער זיילן.',
'wikieditor-toolbar-tool-replace' => 'זוכן ×ון בײַטן',
@@ -29427,7 +30371,7 @@ $1:בײַשפיל.jpg|קעפל2',
'wikieditor-toolbar-tool-replace-button-replaceall' => '×ויסבײַטן ×לץ',
'wikieditor-toolbar-tool-replace-close' => 'שליסן',
'wikieditor-toolbar-tool-replace-nomatch' => '×ײַער זוך ×”×ט ×’×ָרנישט צוגעפ×ַסט',
- 'wikieditor-toolbar-tool-replace-success' => '$1 ×ויסבײַט(ן) ×ַדורכגעפֿירט.',
+ 'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|×ויסבײַט|×ויסבײַטן}} ×ויסבײַטן ×ַדורכגעפֿירט.',
'wikieditor-toolbar-tool-replace-emptysearch' => '×יר ×”×ט ×’×ָרנישט ×רײַנגעגעבן ×¦×•× ×–×•×›×Ÿ.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'דער רעגולערער ×ויסדרוק וו×ָס ×יר ×”×ט ×ַרײַנגעגעבן ××™×– ×ומגילטיק: $1',
'wikieditor-toolbar-section-characters' => 'ספעציעלע צייכנס',
@@ -29450,6 +30394,9 @@ $1:בײַשפיל.jpg|קעפל2',
'wikieditor-toolbar-characters-page-thai' => 'טה××™',
'wikieditor-toolbar-characters-page-lao' => 'ל×Ö·×טיש',
'wikieditor-toolbar-characters-page-khmer' => 'כמער',
+ 'wikieditor-toolbar-characters-endash' => 'ען טירע',
+ 'wikieditor-toolbar-characters-emdash' => '×¢× ×˜×™×¨×¢',
+ 'wikieditor-toolbar-characters-minus' => 'מינוס',
'wikieditor-toolbar-section-help' => 'הילף',
'wikieditor-toolbar-help-heading-description' => 'ב×ַשרײַבונג',
'wikieditor-toolbar-help-heading-syntax' => 'וו×ָס ×יר קל×ַפט ×ַרײַן',
@@ -29644,7 +30591,7 @@ $1:Example.jpg|Àká»lé2',
'wikieditor-toolbar-tool-table-preview' => 'Àyẹ̀wò',
'wikieditor-toolbar-tool-table-insert' => 'ÃŒkìbá»Ì€',
'wikieditor-toolbar-tool-table-cancel' => 'Fagilé',
- 'wikieditor-toolbar-tool-table-toomany' => 'ÃŒkìbá»Ì€ tábìlì pẹ̀lú ìhámá»Ì tóju $1 lá» kò ṣẹ é á¹£e pẹ̀lú pátákó àkíyèsí yìí.',
+ 'wikieditor-toolbar-tool-table-toomany' => 'ÃŒkìbá»Ì€ tábìlì pẹ̀lú ìhámá»Ì tóju $1 lá» kò ṣẹ é á¹£e pẹ̀lú pátákó àkíyèsí yìí.', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => 'Ẹ kò ì tíì ki iye àwá»n orí ìlà àti orí òpó tó yẹ bá»lé.',
'wikieditor-toolbar-tool-table-zero' => 'Ẹ kò le á¹£e ìkìbá»Ì€ tábìlì tó ní òdo orí ìlà àti òdo orí òpó.',
'wikieditor-toolbar-tool-replace' => 'Àwárí láti rá»Ìpò',
@@ -29657,7 +30604,7 @@ $1:Example.jpg|Àká»lé2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'ÃŒrá»Ìpò gbogbo wá»n',
'wikieditor-toolbar-tool-replace-close' => 'Padé',
'wikieditor-toolbar-tool-replace-nomatch' => 'Àwárí yín kò bá ohun kankan mu.',
- 'wikieditor-toolbar-tool-replace-success' => 'ÃŒrá»Ìpò $1 wáyé.',
+ 'wikieditor-toolbar-tool-replace-success' => 'ÃŒrá»Ìpò $1 wáyé.', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => 'Ẹ kò kỠohun kankan láti wárí.',
'wikieditor-toolbar-tool-replace-invalidregex' => 'ÃŒgbékalẹ̀á»Ì€rá»Ì€ dédé tí ẹ ká» kò yẹ: $1',
'wikieditor-toolbar-section-characters' => 'Àwá»n lẹÌtà pàtàkì',
@@ -29740,6 +30687,7 @@ $1:Example.jpg|Àká»lé2',
/** Cantonese (粵語)
* @author Horacewai2
+ * @author Simon Shek
* @author Waihorace
*/
$messages['yue'] = array(
@@ -29873,7 +30821,7 @@ $1:Example.jpg|標題2',
| 行 2, 格 3',
'wikieditor-toolbar-tool-table-example-header' => '標題',
'wikieditor-toolbar-tool-table-title' => 'æ’入表格',
- 'wikieditor-toolbar-tool-table-dimensions-rows' => '列',
+ 'wikieditor-toolbar-tool-table-dimensions-rows' => '行',
'wikieditor-toolbar-tool-table-dimensions-columns' => '行',
'wikieditor-toolbar-tool-table-dimensions-header' => '新增標題行',
'wikieditor-toolbar-tool-table-wikitable' => '連埋外框åŒæ ¼å¼',
@@ -29893,7 +30841,7 @@ $1:Example.jpg|標題2',
'wikieditor-toolbar-tool-table-preview' => 'é è¦½',
'wikieditor-toolbar-tool-table-insert' => 'æ’å…¥',
'wikieditor-toolbar-tool-table-cancel' => 'å–消',
- 'wikieditor-toolbar-tool-table-toomany' => 'æ’入一個多個$1格嘅表格用呢個信æ¯æ¡†ä¿‚å””å¯èƒ½å˜…',
+ 'wikieditor-toolbar-tool-table-toomany' => 'æ’入一個多個$1格嘅表格用呢個信æ¯æ¡†ä¿‚å””å¯èƒ½å˜…', # Fuzzy
'wikieditor-toolbar-tool-table-invalidnumber' => '你係行或者列輸入左一個唔正確嘅數字',
'wikieditor-toolbar-tool-table-zero' => 'ä½ å””å¯ä»¥æ’入一個有0行或者列嘅表格',
'wikieditor-toolbar-tool-replace' => 'æœç´¢åŒé‡æ–°æ”¾ä½',
@@ -29906,7 +30854,7 @@ $1:Example.jpg|標題2',
'wikieditor-toolbar-tool-replace-button-replaceall' => 'å–代全部',
'wikieditor-toolbar-tool-replace-close' => '關閉',
'wikieditor-toolbar-tool-replace-nomatch' => '你嘅æœå°‹å””é…åˆä»»ä½•é‡Žã€‚',
- 'wikieditor-toolbar-tool-replace-success' => 'å·²å–代$1個。',
+ 'wikieditor-toolbar-tool-replace-success' => 'å·²å–代$1個。', # Fuzzy
'wikieditor-toolbar-tool-replace-emptysearch' => '你無打è¦æµå•²å’©ã€‚',
'wikieditor-toolbar-tool-replace-invalidregex' => '你打入嘅é‹ç®—係錯嘅:$1',
'wikieditor-toolbar-section-characters' => '特別字元',
@@ -30074,6 +31022,7 @@ $messages['zh-hans'] = array(
'wikieditor-toolbar-file-float' => '对é½ï¼š',
'wikieditor-toolbar-file-default' => '(默认)',
'wikieditor-toolbar-file-format' => 'æ ¼å¼ï¼š',
+ 'wikieditor-toolbar-file-format-none' => 'æ— ',
'wikieditor-toolbar-tool-file-insert' => 'æ’å…¥',
'wikieditor-toolbar-tool-file-cancel' => 'å–消',
'wikieditor-toolbar-tool-reference' => 'å‚考',
@@ -30140,7 +31089,7 @@ $1:Example.jpg|标题2',
'wikieditor-toolbar-tool-table-preview' => '预览',
'wikieditor-toolbar-tool-table-insert' => 'æ’å…¥',
'wikieditor-toolbar-tool-table-cancel' => 'å–消',
- 'wikieditor-toolbar-tool-table-toomany' => '在这个对è¯æ¡†ä¸­æ— æ³•æ’入超过$1个å•å…ƒæ ¼çš„表格。',
+ 'wikieditor-toolbar-tool-table-toomany' => '在这个对è¯æ¡†ä¸­æ— æ³•æ’入超过1000个å•å…ƒæ ¼çš„表格。',
'wikieditor-toolbar-tool-table-invalidnumber' => '您输入的行数或列数无效。',
'wikieditor-toolbar-tool-table-zero' => '您ä¸èƒ½æ’入一个零行或零列的表格。',
'wikieditor-toolbar-tool-replace' => '查找和替æ¢',
@@ -30154,7 +31103,7 @@ $1:Example.jpg|标题2',
'wikieditor-toolbar-tool-replace-button-replaceall' => '替æ¢æ‰€æœ‰',
'wikieditor-toolbar-tool-replace-close' => '关闭',
'wikieditor-toolbar-tool-replace-nomatch' => '没有找到任何匹é…项。',
- 'wikieditor-toolbar-tool-replace-success' => '完æˆ$1次替æ¢ã€‚',
+ 'wikieditor-toolbar-tool-replace-success' => '完æˆäº†$1次{{PLURAL:$1|替æ¢|替æ¢}}。',
'wikieditor-toolbar-tool-replace-emptysearch' => '您没有输入查找内容。',
'wikieditor-toolbar-tool-replace-invalidregex' => '您输入的正则表达å¼æ— æ•ˆï¼š$1',
'wikieditor-toolbar-section-characters' => '特殊文字',
@@ -30177,6 +31126,9 @@ $1:Example.jpg|标题2',
'wikieditor-toolbar-characters-page-thai' => '泰语',
'wikieditor-toolbar-characters-page-lao' => 'è€æŒè¯­',
'wikieditor-toolbar-characters-page-khmer' => '高棉语',
+ 'wikieditor-toolbar-characters-endash' => '短划线',
+ 'wikieditor-toolbar-characters-emdash' => '长划线',
+ 'wikieditor-toolbar-characters-minus' => 'å‡å·',
'wikieditor-toolbar-section-help' => '帮助',
'wikieditor-toolbar-help-heading-description' => '说明',
'wikieditor-toolbar-help-heading-syntax' => '输入内容',
@@ -30251,6 +31203,7 @@ $1:Example.jpg|标题2',
* @author Mark85296341
* @author Oapbtommy
* @author PhiLiP
+ * @author Shirayuki
* @author Simon Shek
* @author Waihorace
* @author Wong128hk
@@ -30330,6 +31283,7 @@ $messages['zh-hant'] = array(
'wikieditor-toolbar-file-float' => 'å°é½Šï¼š',
'wikieditor-toolbar-file-default' => '(é è¨­ï¼‰',
'wikieditor-toolbar-file-format' => 'æ ¼å¼ï¼š',
+ 'wikieditor-toolbar-file-format-none' => 'ç„¡',
'wikieditor-toolbar-tool-file-insert' => 'æ’å…¥',
'wikieditor-toolbar-tool-file-cancel' => 'å–消',
'wikieditor-toolbar-tool-reference' => 'åƒè€ƒ',
@@ -30403,22 +31357,11 @@ $1:Example.jpg|標題2',
'wikieditor-toolbar-tool-table-dimensions-header' => '新增標題行',
'wikieditor-toolbar-tool-table-wikitable' => '設定邊框格å¼',
'wikieditor-toolbar-tool-table-sortable' => '使表格內容å¯æŽ’åº',
- 'wikieditor-toolbar-tool-table-example' => '-
-! 表頭 1
-! 表頭 2
-! 表頭 3
-|-
-| 行 1, 格 1
-| 行 1, 格 2
-| 行 1, 格 3
-|-
-| 行 2, 格 1
-| 行 2, 格 2
-| 行 2, 格 3',
+ 'wikieditor-toolbar-tool-table-example' => '例å­',
'wikieditor-toolbar-tool-table-preview' => 'é è¦½',
'wikieditor-toolbar-tool-table-insert' => 'æ’å…¥',
'wikieditor-toolbar-tool-table-cancel' => 'å–消',
- 'wikieditor-toolbar-tool-table-toomany' => '在這個å°è©±æ¡†ä¸­ç„¡æ³•æ’å…¥è¶…éŽ $1 個單元格的表格。',
+ 'wikieditor-toolbar-tool-table-toomany' => '在這個å°è©±æ¡†ä¸­ç„¡æ³•æ’入超éŽ1000個單元格的表格。',
'wikieditor-toolbar-tool-table-invalidnumber' => '您輸入的行數或列數無效。',
'wikieditor-toolbar-tool-table-zero' => '您ä¸èƒ½æ’入一個零行或零列的表格。',
'wikieditor-toolbar-tool-replace' => '尋找和替æ›',
@@ -30432,7 +31375,7 @@ $1:Example.jpg|標題2',
'wikieditor-toolbar-tool-replace-button-replaceall' => '替æ›æ‰€æœ‰',
'wikieditor-toolbar-tool-replace-close' => '關閉',
'wikieditor-toolbar-tool-replace-nomatch' => '沒有找到任何符åˆé …目。',
- 'wikieditor-toolbar-tool-replace-success' => 'å®Œæˆ $1 次替æ›ã€‚',
+ 'wikieditor-toolbar-tool-replace-success' => '完æˆ$1次替æ›ã€‚',
'wikieditor-toolbar-tool-replace-emptysearch' => '您沒有輸入尋找內容。',
'wikieditor-toolbar-tool-replace-invalidregex' => '您輸入的正則表é”å¼ç„¡æ•ˆï¼š$1',
'wikieditor-toolbar-section-characters' => '特殊文字',
@@ -30455,6 +31398,9 @@ $1:Example.jpg|標題2',
'wikieditor-toolbar-characters-page-thai' => '泰語',
'wikieditor-toolbar-characters-page-lao' => '寮語',
'wikieditor-toolbar-characters-page-khmer' => '高棉語',
+ 'wikieditor-toolbar-characters-endash' => 'en dash',
+ 'wikieditor-toolbar-characters-emdash' => 'em dash',
+ 'wikieditor-toolbar-characters-minus' => '減號',
'wikieditor-toolbar-section-help' => '說明',
'wikieditor-toolbar-help-heading-description' => 'æè¿°',
'wikieditor-toolbar-help-heading-syntax' => '您輸入什麼',
diff --git a/extensions/WikiEditor/WikiEditor.php b/extensions/WikiEditor/WikiEditor.php
index 0e54a1b5..dc6df0a6 100644
--- a/extensions/WikiEditor/WikiEditor.php
+++ b/extensions/WikiEditor/WikiEditor.php
@@ -46,10 +46,6 @@ $wgWikiEditorFeatures = array(
);
-// If set to true and the ClickTracking extension is installed, track clicks
-// on the toolbar buttons
-$wgWikiEditorToolbarClickTracking = false;
-
/* Setup */
$wgExtensionCredits['other'][] = array(
@@ -125,6 +121,7 @@ $wgResourceModules += array(
'jquery.wikiEditor.toolbar.i18n',
'jquery.suggestions',
'mediawiki.Title',
+ 'mediawiki.jqueryMsg',
),
'messages' => array(
'wikieditor-toolbar-tool-file-title',
diff --git a/extensions/WikiEditor/composer.json b/extensions/WikiEditor/composer.json
new file mode 100644
index 00000000..38f13e72
--- /dev/null
+++ b/extensions/WikiEditor/composer.json
@@ -0,0 +1,11 @@
+{
+ "name": "mediawiki/wiki-editor",
+ "type": "mediawiki-extension",
+ "description": "WikiEditor is an extendable framework with a set of feature-based modules that improve the user experience of editing.",
+ "homepage": "http://www.mediawiki.org/wiki/Extension:WikiEditor",
+ "license" : "GPL-2.0",
+
+ "require": {
+ "composer/installers" : "*"
+ }
+}
diff --git a/extensions/WikiEditor/modules/images/dialogs/insert-link-exists.png b/extensions/WikiEditor/modules/images/dialogs/insert-link-exists.png
index 1935267d..6c65e1ba 100644
--- a/extensions/WikiEditor/modules/images/dialogs/insert-link-exists.png
+++ b/extensions/WikiEditor/modules/images/dialogs/insert-link-exists.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/dialogs/insert-link-external-rtl.png b/extensions/WikiEditor/modules/images/dialogs/insert-link-external-rtl.png
index eb327531..7901e2bc 100644
--- a/extensions/WikiEditor/modules/images/dialogs/insert-link-external-rtl.png
+++ b/extensions/WikiEditor/modules/images/dialogs/insert-link-external-rtl.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/dialogs/insert-link-external.png b/extensions/WikiEditor/modules/images/dialogs/insert-link-external.png
index c0645999..53d2f732 100644
--- a/extensions/WikiEditor/modules/images/dialogs/insert-link-external.png
+++ b/extensions/WikiEditor/modules/images/dialogs/insert-link-external.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/templateEditor/dialog-collapsed.png b/extensions/WikiEditor/modules/images/templateEditor/dialog-collapsed.png
index 93c5c794..0cb83821 100644
--- a/extensions/WikiEditor/modules/images/templateEditor/dialog-collapsed.png
+++ b/extensions/WikiEditor/modules/images/templateEditor/dialog-collapsed.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/templateEditor/dialog-expanded.png b/extensions/WikiEditor/modules/images/templateEditor/dialog-expanded.png
index 5c278cea..8cd3a8b3 100644
--- a/extensions/WikiEditor/modules/images/templateEditor/dialog-expanded.png
+++ b/extensions/WikiEditor/modules/images/templateEditor/dialog-expanded.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/templateEditor/expand.png b/extensions/WikiEditor/modules/images/templateEditor/expand.png
index a92c4e4e..1db80410 100644
--- a/extensions/WikiEditor/modules/images/templateEditor/expand.png
+++ b/extensions/WikiEditor/modules/images/templateEditor/expand.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/templateEditor/name-base.png b/extensions/WikiEditor/modules/images/templateEditor/name-base.png
index ae3d62d6..0d1cce71 100644
--- a/extensions/WikiEditor/modules/images/templateEditor/name-base.png
+++ b/extensions/WikiEditor/modules/images/templateEditor/name-base.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/templateEditor/text-base.png b/extensions/WikiEditor/modules/images/templateEditor/text-base.png
index d16aa18e..8fda004a 100644
--- a/extensions/WikiEditor/modules/images/templateEditor/text-base.png
+++ b/extensions/WikiEditor/modules/images/templateEditor/text-base.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/templateEditor/wiki-text.png b/extensions/WikiEditor/modules/images/templateEditor/wiki-text.png
index ce8cef80..44afb4df 100644
--- a/extensions/WikiEditor/modules/images/templateEditor/wiki-text.png
+++ b/extensions/WikiEditor/modules/images/templateEditor/wiki-text.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toc/close.png b/extensions/WikiEditor/modules/images/toc/close.png
index 9078c4bf..a540856f 100644
--- a/extensions/WikiEditor/modules/images/toc/close.png
+++ b/extensions/WikiEditor/modules/images/toc/close.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toc/grab.png b/extensions/WikiEditor/modules/images/toc/grab.png
index 144f0d67..6291ec86 100644
--- a/extensions/WikiEditor/modules/images/toc/grab.png
+++ b/extensions/WikiEditor/modules/images/toc/grab.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toc/grip.png b/extensions/WikiEditor/modules/images/toc/grip.png
index ad0855ab..07898519 100644
--- a/extensions/WikiEditor/modules/images/toc/grip.png
+++ b/extensions/WikiEditor/modules/images/toc/grip.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toc/open.png b/extensions/WikiEditor/modules/images/toc/open.png
index 2f26a3fd..c782beb7 100644
--- a/extensions/WikiEditor/modules/images/toc/open.png
+++ b/extensions/WikiEditor/modules/images/toc/open.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/arrow-down.png b/extensions/WikiEditor/modules/images/toolbar/arrow-down.png
index 0221028e..41ecb8ba 100644
--- a/extensions/WikiEditor/modules/images/toolbar/arrow-down.png
+++ b/extensions/WikiEditor/modules/images/toolbar/arrow-down.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/arrow-ltr.png b/extensions/WikiEditor/modules/images/toolbar/arrow-ltr.png
index 063ac6f7..d401bf0a 100644
--- a/extensions/WikiEditor/modules/images/toolbar/arrow-ltr.png
+++ b/extensions/WikiEditor/modules/images/toolbar/arrow-ltr.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/arrow-rtl.png b/extensions/WikiEditor/modules/images/toolbar/arrow-rtl.png
index 9e61e2f3..b9598a30 100644
--- a/extensions/WikiEditor/modules/images/toolbar/arrow-rtl.png
+++ b/extensions/WikiEditor/modules/images/toolbar/arrow-rtl.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/base.png b/extensions/WikiEditor/modules/images/toolbar/base.png
index 5c5fb2c9..ebd432e6 100644
--- a/extensions/WikiEditor/modules/images/toolbar/base.png
+++ b/extensions/WikiEditor/modules/images/toolbar/base.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/button-sprite.png b/extensions/WikiEditor/modules/images/toolbar/button-sprite.png
index de825702..a51432dc 100644
--- a/extensions/WikiEditor/modules/images/toolbar/button-sprite.png
+++ b/extensions/WikiEditor/modules/images/toolbar/button-sprite.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/example-image.png b/extensions/WikiEditor/modules/images/toolbar/example-image.png
index 80a21c6a..a0862f40 100644
--- a/extensions/WikiEditor/modules/images/toolbar/example-image.png
+++ b/extensions/WikiEditor/modules/images/toolbar/example-image.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-big.png b/extensions/WikiEditor/modules/images/toolbar/format-big.png
index 11e6f3f7..fe28ab30 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-big.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-big.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-bold-L.png b/extensions/WikiEditor/modules/images/toolbar/format-bold-L.png
new file mode 100644
index 00000000..4819e670
--- /dev/null
+++ b/extensions/WikiEditor/modules/images/toolbar/format-bold-L.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-bold-ka.png b/extensions/WikiEditor/modules/images/toolbar/format-bold-ka.png
index de20bd49..29bcdd36 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-bold-ka.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-bold-ka.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-bold-os.png b/extensions/WikiEditor/modules/images/toolbar/format-bold-os.png
new file mode 100644
index 00000000..e54f9d02
--- /dev/null
+++ b/extensions/WikiEditor/modules/images/toolbar/format-bold-os.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-bold-ru.png b/extensions/WikiEditor/modules/images/toolbar/format-bold-ru.png
index a21dc787..6a69c036 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-bold-ru.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-bold-ru.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-bold.png b/extensions/WikiEditor/modules/images/toolbar/format-bold.png
index cc51e326..22cdc546 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-bold.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-bold.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-indent-rtl.png b/extensions/WikiEditor/modules/images/toolbar/format-indent-rtl.png
index e94d2007..6dbad6d4 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-indent-rtl.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-indent-rtl.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-indent.png b/extensions/WikiEditor/modules/images/toolbar/format-indent.png
index 14a5e22f..ec1ba450 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-indent.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-indent.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-italic-E.png b/extensions/WikiEditor/modules/images/toolbar/format-italic-E.png
new file mode 100644
index 00000000..181a09b2
--- /dev/null
+++ b/extensions/WikiEditor/modules/images/toolbar/format-italic-E.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-italic.png b/extensions/WikiEditor/modules/images/toolbar/format-italic.png
index eb21ab4e..f51e7a93 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-italic.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-italic.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-ulist-rtl.png b/extensions/WikiEditor/modules/images/toolbar/format-ulist-rtl.png
index 5e0fc6e4..8781f744 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-ulist-rtl.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-ulist-rtl.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/format-ulist.png b/extensions/WikiEditor/modules/images/toolbar/format-ulist.png
index dabd0183..ac4438d7 100644
--- a/extensions/WikiEditor/modules/images/toolbar/format-ulist.png
+++ b/extensions/WikiEditor/modules/images/toolbar/format-ulist.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-file.png b/extensions/WikiEditor/modules/images/toolbar/insert-file.png
index 4b0d246e..44de584f 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-file.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-file.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-gallery.png b/extensions/WikiEditor/modules/images/toolbar/insert-gallery.png
index d5402094..5ceeb567 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-gallery.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-gallery.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-ilink.png b/extensions/WikiEditor/modules/images/toolbar/insert-ilink.png
index c5a286e5..acee281f 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-ilink.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-ilink.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-nowiki.png b/extensions/WikiEditor/modules/images/toolbar/insert-nowiki.png
index 2f607bfd..92f56d88 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-nowiki.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-nowiki.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-redirect-rtl.png b/extensions/WikiEditor/modules/images/toolbar/insert-redirect-rtl.png
index 6230d9ec..c6c62c1e 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-redirect-rtl.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-redirect-rtl.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-redirect.png b/extensions/WikiEditor/modules/images/toolbar/insert-redirect.png
index 31137dc9..5115ad79 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-redirect.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-redirect.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-reference.png b/extensions/WikiEditor/modules/images/toolbar/insert-reference.png
index cc144ccf..8573d032 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-reference.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-reference.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-signature.png b/extensions/WikiEditor/modules/images/toolbar/insert-signature.png
index 23ad7da7..d42cf37f 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-signature.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-signature.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/insert-xlink.png b/extensions/WikiEditor/modules/images/toolbar/insert-xlink.png
index fd28a57d..db049b6a 100644
--- a/extensions/WikiEditor/modules/images/toolbar/insert-xlink.png
+++ b/extensions/WikiEditor/modules/images/toolbar/insert-xlink.png
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/arrow-down.png b/extensions/WikiEditor/modules/images/toolbar/png24/arrow-down.png
deleted file mode 100644
index 623795f6..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/arrow-down.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/arrow-left.png b/extensions/WikiEditor/modules/images/toolbar/png24/arrow-left.png
deleted file mode 100644
index 91d5f1de..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/arrow-left.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/arrow-right.png b/extensions/WikiEditor/modules/images/toolbar/png24/arrow-right.png
deleted file mode 100644
index e8e95bc7..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/arrow-right.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-big.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-big.png
deleted file mode 100644
index dee5b106..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-big.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-A.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-A.png
deleted file mode 100644
index 5970b4d4..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-A.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-B.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-B.png
deleted file mode 100644
index d785a20b..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-B.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-F.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-F.png
deleted file mode 100644
index eea5b71e..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-F.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-G.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-G.png
deleted file mode 100644
index 5781fae0..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-G.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-N.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-N.png
deleted file mode 100644
index b3e38798..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-N.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-P.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-P.png
deleted file mode 100644
index 3c9e8496..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-P.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-V.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-V.png
deleted file mode 100644
index b5a96621..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold-V.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-bold.png
deleted file mode 100644
index 5970b4d4..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-bold.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-A.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-A.png
deleted file mode 100644
index 47881e1f..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-A.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-C.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-C.png
deleted file mode 100644
index 3752f8cc..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-C.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-I.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-I.png
deleted file mode 100644
index b47d2b2c..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-I.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-K.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-K.png
deleted file mode 100644
index 8e8c55a9..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic-K.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-italic.png
deleted file mode 100644
index 47881e1f..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-italic.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-olist.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-olist.png
deleted file mode 100644
index 893b187f..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-olist.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-small.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-small.png
deleted file mode 100644
index 9a8b8656..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-small.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-subscript.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-subscript.png
deleted file mode 100644
index 1e3d778b..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-subscript.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-superscript.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-superscript.png
deleted file mode 100644
index 6f9a73b8..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-superscript.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/format-ulist.png b/extensions/WikiEditor/modules/images/toolbar/png24/format-ulist.png
deleted file mode 100644
index 33c8f84c..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/format-ulist.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/generate.sh b/extensions/WikiEditor/modules/images/toolbar/png24/generate.sh
deleted file mode 100644
index ca14ee68..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/generate.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#! /bin/bash
-
-# Compresses all PNGs in the current directory and puts the compressed
-# version in the parent directory
-#
-# Requires pngcrush
-
-for f in *.png
-do
- pngcrush $f ../$f
-done
-
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-file.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-file.png
deleted file mode 100644
index cabc613a..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-file.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-gallery.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-gallery.png
deleted file mode 100644
index 661689ae..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-gallery.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-link.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-link.png
deleted file mode 100644
index b16eeaba..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-link.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-newline.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-newline.png
deleted file mode 100644
index d5ec80b6..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-newline.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-nowiki.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-nowiki.png
deleted file mode 100644
index ab9a3752..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-nowiki.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-redirect.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-redirect.png
deleted file mode 100644
index 22faf0ee..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-redirect.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-reference.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-reference.png
deleted file mode 100644
index aaaf642f..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-reference.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-signature.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-signature.png
deleted file mode 100644
index 476a4236..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-signature.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/insert-table.png b/extensions/WikiEditor/modules/images/toolbar/png24/insert-table.png
deleted file mode 100644
index 070a3e3c..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/insert-table.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/images/toolbar/png24/search-replace.png b/extensions/WikiEditor/modules/images/toolbar/png24/search-replace.png
deleted file mode 100644
index 6c2c6617..00000000
--- a/extensions/WikiEditor/modules/images/toolbar/png24/search-replace.png
+++ /dev/null
Binary files differ
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.css b/extensions/WikiEditor/modules/jquery.wikiEditor.css
index 6df44565..d8e331cc 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.css
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.css
@@ -9,6 +9,12 @@
width: 100%;
background-color: #E0EEf7;
border: solid silver 1px;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.wikiEditor-ui textarea {
+ width: 100%;
}
.wikiEditor-ui textarea:focus {
outline: none;
@@ -109,4 +115,4 @@
background: url(images/toolbar/loading.gif) 0 0 no-repeat;
text-indent: -9999px;
margin: 0 auto;
-} \ No newline at end of file
+}
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js
index ca8af558..146de0f9 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js
@@ -1000,6 +1000,7 @@ $.wikiEditor.modules.dialogs.config = {
return;
}
if ( ( rows * cols ) > 1000 ) {
+ // 1000 is in the English message. The parameter replacement is kept for BC.
alert( mw.msg( 'wikieditor-toolbar-tool-table-toomany', 1000 ) );
return;
}
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.publish.js b/extensions/WikiEditor/modules/jquery.wikiEditor.publish.js
index bb631cf2..b61140dc 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.publish.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.publish.js
@@ -105,6 +105,7 @@ fn: {
e.preventDefault();
});
},
+ immediateCreate: true,
dialog: {
buttons: {
'wikieditor-publish-dialog-publish': function () {
@@ -144,7 +145,10 @@ fn: {
context.fn.addButton( {
'captionMsg': 'wikieditor-publish-button-cancel',
- 'action': function () { }
+ 'action': function () {
+ window.location.href = $( '#mw-editform-cancel' ).attr( 'href' );
+ return false;
+ }
} );
}
}
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.toc.js b/extensions/WikiEditor/modules/jquery.wikiEditor.toc.js
index 5cfa900c..54b8a863 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.toc.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.toc.js
@@ -478,8 +478,6 @@ fn: {
//$( this ).removeClass( 'current' );
setTimeout( function() { $.wikiEditor.modules.toc.fn.unhighlight( context ); }, 1000 );
- if ( typeof $.trackAction != 'undefined' )
- $.trackAction( 'ntoc.heading' );
event.preventDefault();
} )
.text( structure[i].text );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js
index 1477a332..c9d0f797 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js
@@ -21,6 +21,7 @@ getDefaultConfig: function() {
'cs': [2, -142],
'de': [2, -214],
'fr': [2, -286],
+ 'gl': [2, -358],
'es': [2, -358],
'he': [2, -142],
'hu': [2, -214],
@@ -37,12 +38,15 @@ getDefaultConfig: function() {
'cs': 'format-bold-B.png',
'de': 'format-bold-F.png',
'fr': 'format-bold-G.png',
+ 'gl': 'format-bold-N.png',
'es': 'format-bold-N.png',
+ 'eu': 'format-bold-L.png',
'he': 'format-bold-B.png',
'hu': 'format-bold-F.png',
'it': 'format-bold-G.png',
'ka': 'format-bold-ka.png',
'nl': 'format-bold-V.png',
+ 'os': 'format-bold-os.png',
'pt': 'format-bold-N.png',
'pt-br': 'format-bold-N.png',
'pl': 'format-bold-B.png',
@@ -70,6 +74,7 @@ getDefaultConfig: function() {
'cs': [2, -862],
'de': [2, -934],
'fr': [2, -862],
+ 'gl': [2, -790],
'es': [2, -790],
'he': [2, -862],
'it': [2, -790],
@@ -86,12 +91,15 @@ getDefaultConfig: function() {
'cs': 'format-italic-I.png',
'de': 'format-italic-K.png',
'fr': 'format-italic-I.png',
+ 'gl': 'format-italic-C.png',
'es': 'format-italic-C.png',
+ 'eu': 'format-italic-E.png',
'he': 'format-italic-I.png',
'hu': 'format-italic-D.png',
'it': 'format-italic-C.png',
'ka': 'format-italic-ka.png',
'nl': 'format-italic-C.png',
+ 'os': 'format-italic-K.png',
'pt': 'format-italic-I.png',
'pt-br': 'format-italic-I.png',
'pl': 'format-italic-I.png',
@@ -670,67 +678,141 @@ getDefaultConfig: function() {
'layout': 'characters',
'characters': [
"\u0410", "\u0430", // A
- "\u04d8", "\u04d9", // Schwa
+ "\u04d0", "\u04d1", // A with breve (Chuvash)
+ "\u04d2", "\u04d3", // A with diaeresis (Mari, Gargauz, etc.)
+ "\u04d8", "\u04d9", // Schwa (Abkhaz, etc)
+ "\u04da", "\u04db", // Schwa with diaeresis (Khanty)
"\u0411", "\u0431", // B
"\u0412", "\u0432", // V
"\u0413", "\u0433", // G
- "\u0490", "\u0491", // G with upturn
+ "\u0490", "\u0491", // G with upturn (Ukranian, etc)
+ "\u04f6", "\u04f7", // Ge with descender (Abkhaz, etc)
"\u0403", "\u0453", // G with acute (Macedonian)
+ "\u04fa", "\u04fb", // Ge with stroke and hook (Nivkh)
"\u0492", "\u0493", // G with stroke (Kazakh etc.)
"\u0494", "\u0495", // G with hook (Sakha etc.)
"\u0414", "\u0434", // D
- "\u0402", "\u0452", // Dj
+ "\u0500", "\u0501", // De (Komi)
+ "\u0502", "\u0503", // Dje (Komi)
+ "\u0402", "\u0452", // Dj (Serbian, Montenegrin)
"\u0415", "\u0435", "\u0400", "\u0450", // IE
"\u0404", "\u0454", // Ukrainian IE
"\u0401", "\u0451", // IO
+ "\u04d6", "\u04d7", // Ye with breve (Chuvash)
+ "\u04bc", "\u04bd", // Che (Abkhazian)
+ "\u04be", "\u04bf", // Che with descender (Abkhazian)
"\u0416", "\u0436", // Zh
+ "\u0496", "\u0497", // Zhe with descender (Kalmyk, Tatar, etc)
+ "\u04c1", "\u04c2", // Zhe with breve (Moldovan, Gagauz)
+ "\u04dc", "\u04dd", // Zhe with diaeresis (Udmurt)
"\u0417", "\u0437", // Z
- "\u0405", "\u0455", // Dz
+ "\u0498", "\u0499", // Ze with descender (Bashkir)
+ "\u04de", "\u04df", // Ze with diaeresis (Udmurt)
+ "\u0510", "\u0511", // Reversed Ze (Enets, Khanty)
+ "\u04e0", "\u04e1", // Dze (Abkhazian)
+ "\u0405", "\u0455", // Dz (Macedonian, Montenegrin)
+ "\u0504", "\u0505", // Zje (Komi)
+ "\u0506", "\u0507", // Dzje (Komi)
"\u0418", "\u0438", // I
- "\u0406", "\u0456", // Dotted I
- "\u0407", "\u0457", // I with dieresis
+ "\u0406", "\u0456", // Dotted I (Ukranian, etc)
+ "\u0407", "\u0457", // I with dieresis (Rusyn, Ukranian)
[ "\u25cc\u04c0", "\u04c0" ], // Palochka. Dotted circle to differentiate from I
+ [ "\u25cc\u04cf", "\u04cf" ], // Palochka. Dotted circle to differentiate from I
"\u0419", "\u0439", // Short I
- "\u04e2", "\u04e3", // I with macron
- "\u040D", "\u045D", // I with grave (Macedonian)
- "\u0408", "\u0458", // J
+ "\u04e2", "\u04e3", // I with macron (Tajik)
+ "\u040d", "\u045d", // I with grave (Macedonian)
+ "\u048a", "\u048b", // Short I with tail (Kildin Sami)
+ "\u04e4", "\u04e5", // I with diaeresis (Udmurt)
+ "\u0408", "\u0458", // Je (Altai, Azerbaijani, etc)
"\u041a", "\u043a", // K
"\u040c", "\u045c", // K with acute (Macedonian)
"\u049a", "\u049b", // K with descender (Kazakh etc.)
+ "\u049c", "\u049d", // Ka with vertical stroke (Azerbaijani)
+ "\u049e", "\u049f", // Ka with stroke (Abkhaz)
+ "\u04a0", "\u04a1", // Ka (Bashkir)
+ "\u04c3", "\u04c4", // Ka with hook (Chukchi, etc)
+ "\u051a", "\u051b", // Qa (Kurdish, old Abkhaz)
"\u041b", "\u043b", // L
- "\u0409", "\u0459", // Lj
+ "\u0409", "\u0459", // Lj (Serbian, Macedonian)
+ "\u0508", "\u0509", // Lje (Komi)
+ "\u0512", "\u0513", // El with hook (Chukchi, Itelmen, Khanty)
+ "\u04c5", "\u04c6", // El with tail (Itelmen, Kildin Sami)
"\u041c", "\u043c", // M
+ "\u04cd", "\u04ce", // Em with tail (Kildin Sami)
"\u041d", "\u043d", // N
- "\u040a", "\u045a", // Nj
+ "\u040a", "\u045a", // Nj (Macedonian, Serbian)
"\u04a2", "\u04a3", // N with descender (Kazakh etc.)
+ "\u04a4", "\u04a5", // Ligature En Ghe (Aleut, Altai, etc)
+ "\u04c7", "\u04c8", // En with hook (Even, etc)
+ "\u050a", "\u050b", // Nje (Komi)
+ "\u04c9", "\u04ca", // En with tail (Kilidn Sami)
"\u041e", "\u043e", // O
- "\u04e8", "\u04e9", // O with bar
+ "\u04a8", "\u04a9", // Ha (Abkhazian)
+ "\u04e6", "\u04e7", // O with diaeresis (Altay, Komi, etc)
+ "\u04e8", "\u04e9", // O with bar (Bashkir, etc)
+ "\u04ea", "\u04eb", // Barred O with diaeresis (Even, Khanty)
"\u041f", "\u043f", // P
+ "\u0524", "\u0525", // Pe with descender (Abkhaz)
+ "\u04a6", "\u04a7", // Pe with middle hook (Abkhaz)
"\u0420", "\u0440", // R
+ "\u048e", "\u048f", // Er with tick (Kildin Sami)
"\u0421", "\u0441", // S
+ "\u04aa", "\u04ab", // Es with descender (Bashkir, Chuvash)
"\u0422", "\u0442", // T
- "\u040b", "\u045b", // Tsh
+ "\u040b", "\u045b", // Tsh (Serbian, Bosnian, etc)
+ "\u050c", "\u050d", // Sje (Komi)
+ "\u04ac", "\u04ad", // Te with descender (Abkhaz)
+ "\u050e", "\u050f", // The (Komi)
"\u0423", "\u0443", // U
- "\u040e", "\u045e", // Short U
+ "\u040e", "\u045e", // Short U (Belarusian, Dungan, etc)
"\u04ee", "\u04ef", // U with macron (Tajik)
- "\u04b0", "\u04b1", // Straight U with stroke
- "\u04ae", "\u04af", // Straight U
+ "\u04f0", "\u04f1", // U with diaeresis (Altai, etc)
+ "\u04f2", "\u04f3", // U with double acute (Chuvash)
+ "\u04ae", "\u04af", // Straight U Bashkir, Buryat, etc)
+ "\u04b0", "\u04b1", // Straight U with stroke (Kazakh)
"\u0424", "\u0444", // F
"\u0425", "\u0445", // Kha
- "\u04b2", "\u04b3", // Kha with descender
- "\u04ba", "\u04bb", // Shha
+ "\u04b2", "\u04b3", // Kha with descender (Abkhaz, etc)
+ "\u04fc", "\u04fd", // Ha with hook (Itelmen, Nivkh)
+ "\u04fe", "\u04ff", // Ha with stroke (Nivkh)
+ "\u04ba", "\u04bb", // Shha (Azerbaijani, etc)
"\u0426", "\u0446", // Ts
"\u0427", "\u0447", // Ch
- "\u04b6", "\u04b7", // Ch with descender
- "\u040f", "\u045f", // Dzh
+ "\u04b4", "\u04b5", // Ligature Te Tse (Abkhaz)
+ "\u04b6", "\u04b7", // Ch with descender (Abkhaz, Tajik)
+ "\u04b8", "\u04b9", // Che with vertical stroke (Azeri)
+ "\u04cb", "\u04cc", // Che (Khakassian)
+ "\u04f4", "\u04f5", // Che with diaeresis (Udmurt)
+ "\u040f", "\u045f", // Dzh (Serbian, Macedonian, etc)
"\u0428", "\u0448", // Sh
"\u0429", "\u0449", // Sch
"\u042a", "\u044a", // Hard sign
"\u042b", "\u044b", // Yeru
+ "\u04f8", "\u04f9", // Yeru with diaeresis (mari)
"\u042c", "\u044c", // Soft sign
+ "\u048c", "\u048d", // Semisoft Sign (kildin)
"\u042d", "\u044d", // E
+ "\u04ec", "\u04ed", // E with diaeresis (kildin)
"\u042e", "\u044e", // Yu
- "\u042f", "\u044f" // Ya
+ "\u042f", "\u044f", // Ya
+ "\u051c", "\u051d", // We (Kurdish)
+ "\u0460", "\u0461", // Omega
+ "\u0462", "\u0463", // Yat (old cyrillic)
+ "\u0464", "\u0465", // Iotified E (old cyrillic)
+ "\u0466", "\u0467", // Little Yus (old cyrillic)
+ "\u0468", "\u0469", // Iotified Little Yus (old cyrillic)
+ "\u046A", "\u046B", // Big Yus (old cyrillic)
+ "\u046C", "\u046D", // Iotified Big Yus (old cyrillic)
+ "\u046E", "\u046F", // Ksi (old cyrillic)
+ "\u0470", "\u0471", // Psi (old cyrillic)
+ "\u0472", "\u0473", // Fita (old cyrillic)
+ "\u0474", "\u0475", // Izhitsa (old cyrillic)
+ "\u0476", "\u0477", // Izhitsa with double grave accent (old cyrillic)
+ "\u0478", "\u0479", // Uk (old cyrillic)
+ "\u047A", "\u047B", // Round Omega (old cyrillic)
+ "\u047c", "\u047d", // Cyr Omega with Titlo (old cyrillic)
+ "\u047e", "\u047f", // Cyr Ot (old cyrillic)
+ "\u0480", "\u0481", // Cyr Koppa (old cyrillic)
]
},
// The core 28-letter alphabet, special letters for the Arabic language,
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js
index 9024ba1d..b43dff47 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js
@@ -236,28 +236,6 @@ fn: {
* @param {Object} source
*/
doAction : function( context, action, source ) {
- // Verify that this has been called from a source that's within the toolbar
- // 'trackAction' defined in click tracking
- if ( mw.config.get( 'wgWikiEditorToolbarClickTracking' ) && $.trackAction !== undefined && source.closest( '.wikiEditor-ui-toolbar' ).size() ) {
- // Build a unique id for this action by tracking the parent rel attributes up to the toolbar level
- var rels = [];
- var step = source;
- var i = 0;
- while ( !step.hasClass( 'wikiEditor-ui-toolbar' ) ) {
- if ( i > 25 ) {
- break;
- }
- i++;
- var rel = step.attr( 'rel' );
- if ( rel ) {
- rels.push( step.attr( 'rel' ) );
- }
- step = step.parent();
- }
- rels.reverse();
- var id = rels.join( '.' );
- $.trackAction( id );
- }
switch ( action.type ) {
case 'replace':
case 'encapsulate':
@@ -300,7 +278,7 @@ fn: {
var $group = $( '<div/>' ).attr( { 'class' : 'group group-' + id, 'rel' : id } );
var label = $.wikiEditor.autoMsg( group, 'label' );
if ( label ) {
- $group.append( '<div class="label">' + label + '</div>' );
+ $group.append( '<span class="label">' + label + '</div>' );
}
var empty = true;
if ( 'tools' in group ) {
@@ -461,10 +439,6 @@ fn: {
$(this).attr( 'rel' ),
{ expires: 30, path: '/' }
);
- // Click tracking
- if ( mw.config.get( 'wgWikiEditorToolbarClickTracking' ) && $.trackAction !== undefined ) {
- $.trackAction(section + '.' + $(this).attr('rel'));
- }
context.fn.restoreCursorAndScrollTop();
// No dragging!
event.preventDefault();
@@ -655,10 +629,6 @@ fn: {
context.fn.trigger( 'resize' );
} );
}
- // Click tracking
- if ( mw.config.get( 'wgWikiEditorToolbarClickTracking' ) && $.trackAction !== undefined ) {
- $.trackAction( $section.attr('rel') + '.' + ( show ? 'show': 'hide' ) );
- }
// Save the currently visible section
$.cookie(
'wikiEditor-' + $(this).data( 'context' ).instance + '-toolbar-section',
@@ -776,6 +746,8 @@ fn: {
var oldValue = $( 'body' ).css( 'position' );
$( 'body' ).css( 'position', 'static' );
$( 'body' ).css( 'position', oldValue );
+
+ context.$textarea.trigger( 'wikiEditor-toolbar-doneInitialSections' );
},
'loop' : function( i, s ) {
s.$sections.append( $.wikiEditor.modules.toolbar.fn.buildSection( s.context, s.id, s.config ) );
diff --git a/extensions/WikiEditor/tests/selenium/WikiDialogs_Links.php b/extensions/WikiEditor/tests/selenium/WikiDialogs_Links.php
deleted file mode 100644
index 7153f49f..00000000
--- a/extensions/WikiEditor/tests/selenium/WikiDialogs_Links.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-require_once 'WikiDialogs_Links_Setup.php';
-/**
- * Description of WikiNewPageDialogs
- *
- * @author bhagyag, pdhanda
- *
- * This test case is part of the WikiEditorTestSuite.
- * Configuration for these tests are dosumented as part of extensions/WikiEditor/tests/selenium/WikiEditorTestSuite.php
- *
- */
-class WikiDialogs_Links extends WikiDialogs_Links_Setup {
- // Set up the testing environment
- function setup() {
- parent::setUp();
- parent::doCreateInternalTestPageIfMissing();
- }
-
- function tearDown() {
- parent::doLogout();
- parent::tearDown();
- }
-
- // Create a new page temporary
- function createNewPage() {
- parent::doOpenLink();
- parent::login();
- parent::doCreateNewPageTemporary();
- }
-
- // Add a internal link and verify
- function testInternalLink() {
- $this->createNewPage();
- parent::verifyInternalLink();
- }
-
- // Add a internal link with different display text and verify
- function testInternalLinkWithDisplayText() {
- $this->createNewPage();
- parent::verifyInternalLinkWithDisplayText();
- }
-
- // Add a internal link with blank display text and verify
- function testInternalLinkWithBlankDisplayText() {
- $this->createNewPage();
- parent::verifyInternalLinkWithBlankDisplayText();
- }
-
- // Add external link and verify
- function testExternalLink() {
- $this->createNewPage();
- parent::verifyExternalLink();
- }
-
- // Add external link with different display text and verify
- function testExternalLinkWithDisplayText( ) {
- $this->createNewPage();
- parent::verifyExternalLinkWithDisplayText();
- }
-
- // Add external link with Blank display text and verify
- function testExternalLinkWithBlankDisplayText() {
- $this->createNewPage();
- parent::verifyExternalLinkWithBlankDisplayText();
- }
-
-}
diff --git a/extensions/WikiEditor/tests/selenium/WikiDialogs_Links_Setup.php b/extensions/WikiEditor/tests/selenium/WikiDialogs_Links_Setup.php
deleted file mode 100644
index 352ebec0..00000000
--- a/extensions/WikiEditor/tests/selenium/WikiDialogs_Links_Setup.php
+++ /dev/null
@@ -1,295 +0,0 @@
-<?php
-include( "WikiEditorConstants.php" );
-/**
- * This test case will be handling the Wiki Tool bar Dialog functions
- * Date : Apr - 2010
- * @author : BhagyaG - Calcey
- */
-class WikiDialogs_Links_Setup extends SeleniumTestCase {
-
- // Open the page.
- function doOpenLink() {
- $this->open( $this->getUrl() . '/index.php' );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- }
-
- // Expand advance tool bar section if its not
- function doExpandAdvanceSection() {
- if ( !$this->isTextPresent( TEXT_HEADING ) ) {
- $this->click( LINK_ADVANCED );
- }
- }
-
- // Log out from the application
- function doLogout() {
- $this->open( $this->getUrl() . '/index.php' );
- if ( $this->isTextPresent( TEXT_LOGOUT ) ) {
- $this->click( LINK_LOGOUT );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertEquals( TEXT_LOGOUT_CONFIRM, $this->getText( LINK_LOGIN ) );
- $this->open( $this->getUrl() . '/index.php' );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- }
- }
-
- // Create a temporary fixture page
- function doCreateInternalTestPageIfMissing() {
- $this->type( INPUT_SEARCH_BOX, WIKI_INTERNAL_LINK );
- $this->click( BUTTON_SEARCH );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->click( LINK_START . WIKI_INTERNAL_LINK );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $location = $this->getLocation() . "\n";
- if ( strpos( $location, '&redlink=1' ) !== false ) {
- $this->type( TEXT_EDITOR, "Test fixture page. No real content here" );
- $this->click( BUTTON_SAVE_WATCH );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertTrue( $this->isTextPresent( WIKI_INTERNAL_LINK ),
- $this->getText( TEXT_PAGE_HEADING ) );
- }
- }
-
- // Create a temporary new page
- function doCreateNewPageTemporary() {
- $this->type( INPUT_SEARCH_BOX, WIKI_TEMP_NEWPAGE );
- $this->click( BUTTON_SEARCH );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->click( LINK_START . WIKI_TEMP_NEWPAGE );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- }
-
- // Add a internal link and verify
- function verifyInternalLink() {
- $this->type( TEXT_EDITOR, "" );
- $this->click( LINK_ADDLINK );
- $this->waitForPopup( 'addLink', WIKI_TEST_WAIT_TIME );
- $this->type( TEXT_LINKNAME, ( WIKI_INTERNAL_LINK ) );
- $this->assertTrue( $this->isElementPresent( ICON_PAGEEXISTS ), 'Element ' . ICON_PAGEEXISTS . 'Not found' );
- $this->assertEquals( "on", $this->getValue( OPT_INTERNAL ) );
- $this->click( BUTTON_INSERTLINK );
- $this->click( LINK_PREVIEW );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertEquals( ( WIKI_INTERNAL_LINK ), $this->getText( LINK_START . WIKI_INTERNAL_LINK ) );
- $this->click( LINK_START . WIKI_INTERNAL_LINK );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertTrue( $this->isTextPresent( WIKI_INTERNAL_LINK ), $this->getText( TEXT_PAGE_HEADING ) );
- }
-
- // Add a internal link with different display text and verify
- function verifyInternalLinkWithDisplayText() {
- $this->type( TEXT_EDITOR, "" );
- $this->click( LINK_ADDLINK );
- $this->waitForPopup( 'addLink', WIKI_TEST_WAIT_TIME );
- $this->type( TEXT_LINKNAME, WIKI_INTERNAL_LINK );
- $this->type ( TEXT_LINKDISPLAYNAME, WIKI_INTERNAL_LINK . TEXT_LINKDISPLAYNAME_APPENDTEXT );
- $this->assertTrue( $this->isElementPresent( ICON_PAGEEXISTS ) );
- $this->assertEquals( "on", $this->getValue( OPT_INTERNAL ) );
- $this->click( BUTTON_INSERTLINK );
- $this->click( LINK_PREVIEW );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertEquals( WIKI_INTERNAL_LINK . TEXT_LINKDISPLAYNAME_APPENDTEXT,
- $this->getText( LINK_START . WIKI_INTERNAL_LINK . TEXT_LINKDISPLAYNAME_APPENDTEXT ) );
- $this->click( LINK_START . WIKI_INTERNAL_LINK . TEXT_LINKDISPLAYNAME_APPENDTEXT );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertTrue( $this->isTextPresent( WIKI_INTERNAL_LINK ), $this->getText( TEXT_PAGE_HEADING ) );
-
- }
-
- // Add a internal link with blank display text and verify
- function verifyInternalLinkWithBlankDisplayText() {
- $this->type( TEXT_EDITOR, "" );
- $this->click( LINK_ADDLINK );
- $this->waitForPopup( 'addLink', WIKI_TEST_WAIT_TIME );
- $this->type( TEXT_LINKNAME, WIKI_INTERNAL_LINK );
- $this->type( TEXT_LINKDISPLAYNAME, "" );
- $this->assertTrue( $this->isElementPresent( ICON_PAGEEXISTS ) );
- $this->assertEquals( "on", $this->getValue( OPT_INTERNAL ) );
- $this->click( BUTTON_INSERTLINK );
- $this->click( LINK_PREVIEW );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertEquals( WIKI_INTERNAL_LINK, $this->getText( LINK_START . WIKI_INTERNAL_LINK ) );
- $this->click( LINK_START . WIKI_INTERNAL_LINK );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertEquals( WIKI_INTERNAL_LINK, $this->getText( TEXT_PAGE_HEADING ) );
-
- }
-
- // Add external link and verify
- function verifyExternalLink() {
- $this->type( LINK_PREVIEW, "" );
- $this->click( LINK_ADDLINK );
- $this->type( TEXT_LINKNAME, WIKI_EXTERNAL_LINK );
- $this->assertTrue( $this->isElementPresent( ICON_PAGEEXTERNAL ) );
- $this->assertEquals( "on", $this->getValue( OPT_EXTERNAL ) );
- $this->click( BUTTON_INSERTLINK );
- $this->click( LINK_PREVIEW );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertEquals( WIKI_EXTERNAL_LINK, $this->getText( LINK_START . WIKI_EXTERNAL_LINK ) );
-
- $this->click( LINK_START . WIKI_EXTERNAL_LINK );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertEquals( WIKI_EXTERNAL_LINK_TITLE, $this->getTitle() );
- }
-
- // Add external link with different display text and verify
- function verifyExternalLinkWithDisplayText() {
- $this->type( TEXT_EDITOR, "" );
- $this->click( LINK_ADDLINK );
- $this->type( TEXT_LINKNAME, WIKI_EXTERNAL_LINK );
- $this->type( TEXT_LINKDISPLAYNAME, WIKI_EXTERNAL_LINK_TITLE );
- $this->assertTrue( $this->isElementPresent( ICON_PAGEEXTERNAL ) );
- $this->assertEquals( "on", $this->getValue( OPT_EXTERNAL ) );
- $this->click( BUTTON_INSERTLINK );
- $this->click( LINK_PREVIEW );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertEquals( WIKI_EXTERNAL_LINK_TITLE, $this->getText( LINK_START . WIKI_EXTERNAL_LINK_TITLE ) );
- $this->click( LINK_START . ( WIKI_EXTERNAL_LINK_TITLE ) );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertEquals( WIKI_EXTERNAL_LINK_TITLE , $this->getTitle() );
- }
-
- // Add external link with Blank display text and verify
- function verifyExternalLinkWithBlankDisplayText() {
- $this->type( TEXT_EDITOR, "" );
- $this->click( LINK_ADDLINK );
- $this->type( TEXT_LINKNAME, WIKI_EXTERNAL_LINK );
- $this->type( TEXT_LINKDISPLAYNAME, "" );
- $this->assertTrue( $this->isElementPresent( ICON_PAGEEXTERNAL ) );
- $this->assertEquals( "on", $this->getValue( OPT_EXTERNAL ) );
- $this->click( BUTTON_INSERTLINK );
- $this->click( LINK_PREVIEW );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertEquals( "[1]", $this->getText( LINK_START . "[1]" ) );
- $this->click( LINK_START . "[1]" );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertEquals( WIKI_EXTERNAL_LINK_TITLE, $this->getTitle() );
- }
-
- // Add a table and verify
- function verifyCreateTable() {
- $WIKI_TABLE_ROW = 2;
- $WIKI_TABLE_COL = "5";
- $this->doExpandAdvanceSection();
- $this->type( TEXT_EDITOR, "" );
- $this->click( LINK_ADDTABLE );
- $this->click( CHK_SORT );
- $this->type( TEXT_ROW, $WIKI_TABLE_ROW );
- $this->type( TEXT_COL, $WIKI_TABLE_COL );
- $this->click( BUTTON_INSERTABLE );
- $this->click( CHK_SORT );
- $this->click( LINK_PREVIEW );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $WIKI_TABLE_ROW = $WIKI_TABLE_ROW + 1;
- $this->assertTrue( $this->isElementPresent( TEXT_TABLEID_OTHER .
- TEXT_VALIDATE_TABLE_PART1 . $WIKI_TABLE_ROW .
- TEXT_VALIDATE_TABLE_PART2 . $WIKI_TABLE_COL .
- TEXT_VALIDATE_TABLE_PART3 ) );
- }
-
- // Add a table and verify only with head row
- function verifyCreateTableWithHeadRow() {
- $WIKI_TABLE_ROW = 3;
- $WIKI_TABLE_COL = "4";
- $this->doExpandAdvanceSection();
- $this->type( TEXT_EDITOR, "" );
- $this->click( LINK_ADDTABLE );
- $this->click( CHK_BOARDER );
- $this->type( TEXT_ROW, $WIKI_TABLE_ROW );
- $this->type( TEXT_COL, $WIKI_TABLE_COL );
- $this->click( BUTTON_INSERTABLE );
- $this->click( LINK_PREVIEW );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $WIKI_TABLE_ROW = $WIKI_TABLE_ROW + 1;
- $this->assertTrue( $this->isElementPresent( TEXT_TABLEID_OTHER .
- TEXT_VALIDATE_TABLE_PART1 . $WIKI_TABLE_ROW .
- TEXT_VALIDATE_TABLE_PART2 . $WIKI_TABLE_COL .
- TEXT_VALIDATE_TABLE_PART3 ) );
- }
-
- // Add a table and verify only with borders
- function verifyCreateTableWithBorders() {
- $WIKI_TABLE_ROW = "4";
- $WIKI_TABLE_COL = "6";
- $this->type( TEXT_EDITOR, "" );
- $this->click( LINK_ADDTABLE );
- $this->click( CHK_HEADER );
- $this->type( TEXT_ROW, $WIKI_TABLE_ROW );
- $this->type( TEXT_COL, $WIKI_TABLE_COL );
- $this->click( BUTTON_INSERTABLE );
- $this->click( CHK_HEADER );
- $this->click( LINK_PREVIEW );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertTrue( $this->isElementPresent( TEXT_TABLEID_OTHER .
- TEXT_VALIDATE_TABLE_PART1 . $WIKI_TABLE_ROW .
- TEXT_VALIDATE_TABLE_PART2 . $WIKI_TABLE_COL .
- TEXT_VALIDATE_TABLE_PART3 ) );
- }
-
- // Add a table and verify only with sort row
- function verifyCreateTableWithSortRow() {
- $WIKI_TABLE_ROW = "2";
- $WIKI_TABLE_COL = "5";
- $this->type( TEXT_EDITOR, "" );
- $this->click( LINK_ADDTABLE );
- $this->click( CHK_HEADER );
- $this->click( CHK_BOARDER );
- $this->click( CHK_SORT );
- $this->type( TEXT_ROW, $WIKI_TABLE_ROW );
- $this->type( TEXT_COL, $WIKI_TABLE_COL );
- $this->click( BUTTON_INSERTABLE );
- $this->click( CHK_HEADER );
- $this->click( CHK_BOARDER );
- $this->click( CHK_SORT );
- $this->click( LINK_PREVIEW );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertTrue( $this->isElementPresent( TEXT_TABLEID_WITHALLFEATURES .
- TEXT_VALIDATE_TABLE_PART1 . $WIKI_TABLE_ROW .
- TEXT_VALIDATE_TABLE_PART2 . $WIKI_TABLE_COL .
- TEXT_VALIDATE_TABLE_PART3 ) );
- }
-
- // Add a table without headers,borders and sort rows
- function verifyCreateTableWithNoSpecialEffects() {
- $WIKI_TABLE_ROW = "6";
- $WIKI_TABLE_COL = "2";
- $this->
- $this->doExpandAdvanceSection();
- $this->type( TEXT_EDITOR, "" );
- $this->click( LINK_ADDTABLE );
- $this->click( CHK_BOARDER );
- $this->click( CHK_HEADER );
- $this->type( TEXT_ROW, $WIKI_TABLE_ROW );
- $this->type( TEXT_COL, $WIKI_TABLE_COL );
- $this->click( BUTTON_INSERTABLE );
- $this->click( CHK_BOARDER );
- $this->click( CHK_HEADER );
- $this->click( INK_PREVIEW );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $this->assertTrue( $this->isElementPresent( TEXT_TABLEID_OTHER .
- TEXT_VALIDATE_TABLE_PART1 . $WIKI_TABLE_ROW .
- TEXT_VALIDATE_TABLE_PART2 . $WIKI_TABLE_COL .
- TEXT_VALIDATE_TABLE_PART3 ) );
- }
-
- // Add a table with headers,borders and sort rows
- function verifyCreateTableWithAllSpecialEffects() {
- $WIKI_TABLE_ROW = 6;
- $WIKI_TABLE_COL = "2";
- $this->doExpandAdvanceSection();
- $this->type( TEXT_EDITOR, "" );
- $this->click( LINK_ADDTABLE );
- $this->click( CHK_SORT );
- $this->type( TEXT_ROW, $WIKI_TABLE_ROW );
- $this->type( TEXT_COL, $WIKI_TABLE_COL );
- $this->click( BUTTON_INSERTABLE );
- $this->click( CHK_SORT );
- $this->click( LINK_PREVIEW );
- $this->waitForPageToLoad( WIKI_TEST_WAIT_TIME );
- $WIKI_TABLE_ROW = $WIKI_TABLE_ROW + 1;
- $this->assertTrue( $this->isElementPresent( TEXT_TABLEID_WITHALLFEATURES .
- TEXT_VALIDATE_TABLE_PART1 . $WIKI_TABLE_ROW .
- TEXT_VALIDATE_TABLE_PART2 . $WIKI_TABLE_COL .
- TEXT_VALIDATE_TABLE_PART3 ) );
- }
-
-}
diff --git a/extensions/WikiEditor/tests/selenium/WikiEditorConstants.php b/extensions/WikiEditor/tests/selenium/WikiEditorConstants.php
deleted file mode 100644
index 090f96bf..00000000
--- a/extensions/WikiEditor/tests/selenium/WikiEditorConstants.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-define ( 'WIKI_TEST_WAIT_TIME', "3000" ); // Waiting time
-
-// tool bar, buttons , links
-// commonly using links
-define ( 'LINK_MAIN_PAGE', "link=Main page" );
-define ( 'LINK_RANDOM_PAGE', "link=Random article" );
-define ( 'TEXT_PAGE_HEADING', "firstHeading" );
-define ( 'LINK_START', "link=" );
-define ( 'LINK_EDITPAGE', "//li[@id='ca-edit']/a/span" );
-define ( 'TEXT_EDITOR', "wpTextbox1" );
-define ( 'LINK_PREVIEW', "wpPreview" );
-
-define ( 'WIKI_SEARCH_PAGE', "Hair (musical)" ); // Page name to search
-define ( 'WIKI_TEXT_SEARCH', "TV" ); // Text to search
-define ( 'WIKI_INTERNAL_LINK', "Wikieditor-Fixture-Page" ); // Exisiting page name to add as an internal tag
-define ( 'WIKI_EXTERNAL_LINK', "www.google.com" ); // External web site name
-define ( 'WIKI_EXTERNAL_LINK_TITLE', "Google" ); // Page title of the external web site name
-define ( 'WIKI_CODE_PATH', getcwd() ); // get the current path of the program
-define ( 'WIKI_SCREENSHOTS_PATH', "screenshots" ); // the folder the error screen shots will be saved
-define ( 'WIKI_SCREENSHOTS_TYPE', "png" ); // screen print type
-define ( 'WIKI_TEMP_NEWPAGE', "TestWikiPage" ); // temporary creating new page name
-// for WikiCommonFunction_TC
-
-// for WikiSearch_TC
-define ( 'INPUT_SEARCH_BOX', "searchInput" );
-define ( 'BUTTON_SEARCH', "mw-searchButton" );
-define ( 'TEXT_SEARCH_RESULT_HEADING', " - Search results - Wikipedia, the free encyclopedia" );
-
-// for WikiWatchUnWatch_TC
-define ( 'LINK_WATCH_PAGE', "link=Watch" );
-define ( 'LINK_WATCH_LIST', "link=My watchlist" );
-define ( 'LINK_WATCH_EDIT', "link=View and edit watchlist" );
-define ( 'LINK_UNWATCH', "link=Unwatch" );
-define ( 'BUTTON_WATCH', "wpWatchthis" );
-define ( 'BUTTON_SAVE_WATCH', "wpSave" );
-define ( 'TEXT_WATCH', "Watch" );
-define ( 'TEXT_UNWATCH', "Unwatch" );
-
-// for WikiCommonFunction_TC
-define ( 'TEXT_LOGOUT', "Log out" );
-define ( 'LINK_LOGOUT', "link=Log out" );
-define ( 'LINK_LOGIN', "link=Log in / create account" );
-define ( 'TEXT_LOGOUT_CONFIRM', "Log in / create account" );
-define ( 'INPUT_USER_NAME', "wpName1" );
-define ( 'INPUT_PASSWD', "wpPassword1" );
-define ( 'BUTTON_LOGIN', "wpLoginAttempt" );
-define ( 'TEXT_HEADING', "Heading" );
-define ( 'LINK_ADVANCED', "link=Advanced" );
-
-// for WikiDialogs_TC
-define ( 'LINK_ADDLINK', "//div[@id='wikiEditor-ui-toolbar']/div[1]/div[2]/span[2 ]" );
-define ( 'TEXT_LINKNAME', "wikieditor-toolbar-link-int-target" );
-define ( 'TEXT_LINKDISPLAYNAME', "wikieditor-toolbar-link-int-text" );
-define ( 'TEXT_LINKDISPLAYNAME_APPENDTEXT', " Test" );
-define ( 'ICON_PAGEEXISTS', "wikieditor-toolbar-link-int-target-status-exists" );
-define ( 'ICON_PAGEEXTERNAL', "wikieditor-toolbar-link-int-target-status-external" );
-define ( 'OPT_INTERNAL', "wikieditor-toolbar-link-type-int" );
-define ( 'OPT_EXTERNAL', "wikieditor-toolbar-link-type-ext" );
-define ( 'BUTTON_INSERTLINK', "//div[10]/div[11]/button[1]" );
-define ( 'LINK_ADDTABLE', "//div[@id='wikiEditor-ui-toolbar']/div[3]/div[1]/div[4]/span[2]" );
-define ( 'CHK_HEADER', "wikieditor-toolbar-table-dimensions-header" );
-define ( 'CHK_BOARDER', "wikieditor-toolbar-table-wikitable" );
-define ( 'CHK_SORT', "wikieditor-toolbar-table-sortable" );
-define ( 'TEXT_ROW', "wikieditor-toolbar-table-dimensions-rows" );
-define ( 'TEXT_COL', "wikieditor-toolbar-table-dimensions-columns" );
-define ( 'BUTTON_INSERTABLE', "//div[3]/button[1]" );
-define ( 'TEXT_HEADTABLE_TEXT', "Header text" );
-define ( 'TEXT_TABLEID_WITHALLFEATURES', "//table[@id='sortable_table_id_0']/tbody/" );
-define ( 'TEXT_TABLEID_OTHER', "//div[@id='wikiPreview']/table/tbody/" );
-define ( 'TEXT_VALIDATE_TABLE_PART1', "tr[" );
-define ( 'TEXT_VALIDATE_TABLE_PART2', "]/td[" );
-define ( 'TEXT_VALIDATE_TABLE_PART3', "]" );
-define ( 'LINK_SEARCH', "//div[@id='wikiEditor-ui-toolbar']/div[3]/div[1]/div[5]/span" );
-define ( 'INPUT_SEARCH', "wikieditor-toolbar-replace-search" );
-define ( 'INPUT_REPLACE', "wikieditor-toolbar-replace-replace" );
-define ( 'BUTTON_REPLACEALL', "//button[3]" );
-define ( 'BUTTON_REPLACENEXT', "//button[2]" );
-define ( 'BUTTON_CANCEL', "//button[4]" );
-define ( 'TEXT_PREVIEW_TEXT1', "//div[@id='wikiPreview']/p[1]" );
-define ( 'TEXT_PREVIEW_TEXT2', "//div[@id='wikiPreview']/p[2]" );
-define ( 'TEXT_PREVIEW_TEXT3', "//div[@id='wikiPreview']/p[3]" );
-
-
diff --git a/extensions/WikiEditor/tests/selenium/WikiEditorSeleniumConfig.php b/extensions/WikiEditor/tests/selenium/WikiEditorSeleniumConfig.php
deleted file mode 100644
index ad4be489..00000000
--- a/extensions/WikiEditor/tests/selenium/WikiEditorSeleniumConfig.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-class WikiEditorSeleniumConfig {
-
- public static function getSettings( &$includeFiles, &$globalConfigs ) {
- $includes = array(
- 'extensions/Vector/Vector.php',
- 'extensions/WikiEditor/WikiEditor.php'
- );
- $configs = array(
- 'wgDefaultSkin' => 'vector',
- 'wgWikiEditorFeatures' => array(
- 'toolbar' => array( 'global' => true, 'user' => true ),
- 'toc' => array( 'global' => false, 'user' => false ),
- 'highlight' => array( 'global' => false, 'user' => false ),
- 'templateEditor' => array( 'global' => false, 'user' => false ),
- 'dialogs' => array( 'global' => true, 'user' => true )
- ),
- 'wgVectorFeatures' => array(
- 'editwarning' => array( 'global' => false, 'user' => false )
- )
- );
- $includeFiles = array_merge( $includeFiles, $includes );
- $globalConfigs = array_merge( $globalConfigs, $configs );
- return true;
- }
-} \ No newline at end of file
diff --git a/extensions/WikiEditor/tests/selenium/WikiEditorTestSuite.php b/extensions/WikiEditor/tests/selenium/WikiEditorTestSuite.php
deleted file mode 100644
index b4029d3a..00000000
--- a/extensions/WikiEditor/tests/selenium/WikiEditorTestSuite.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-/**
- * To configure MW for these tests
- * 1) If you are running multiple test suites, add the following in LocalSettings.php
- * require_once("extensions/WikiEditor/tests/selenium/WikiEditorSeleniumConfig.php");
- * $wgSeleniumTestConfigs['WikiEditorTestSuite'] = 'WikiEditorSeleniumConfig::getSettings';
- * OR
- * 2) Add the following to your Localsettings.php
- * require_once( "$IP/extensions/Vector/Vector.php" );
- * require_once( "$IP/extensions/WikiEditor/WikiEditor.php" );
- * $wgDefaultSkin = 'vector';
- * $wgVectorFeatures['editwarning'] = array( 'global' => false, 'user' => false );
- * $wgWikiEditorFeatures['templateEditor'] = array( 'global' => false, 'user' => false );
- * $wgWikiEditorFeatures['toolbar'] = array( 'global' => true, 'user' => true );
- * $wgWikiEditorFeatures['toc'] = array( 'global' => false, 'user' => false );
- * $wgWikiEditorFeatures['highlight'] = array( 'global' => false, 'user' => false );
- * $wgWikiEditorFeatures['dialogs'] = array( 'global' => true, 'user' => true );
- *
- */
-class WikiEditorTestSuite extends SeleniumTestSuite
-{
- public function setUp() {
- $this->setLoginBeforeTests( false );
- parent::setUp();
- }
- public function addTests() {
- $testFiles = array(
- 'extensions/WikiEditor/tests/selenium/WikiDialogs_Links.php'
- );
- parent::addTestFiles( $testFiles );
- }
-
-
-}
diff --git a/img_auth.php b/img_auth.php
index b3a34955..ccaa8af0 100644
--- a/img_auth.php
+++ b/img_auth.php
@@ -48,7 +48,7 @@ if ( isset( $_SERVER['MW_COMPILED'] ) ) {
wfProfileIn( 'img_auth.php' );
# Set action base paths so that WebRequest::getPathInfo()
-# recognizes the "X" as the 'title' in ../image_auth/X urls.
+# recognizes the "X" as the 'title' in ../img_auth.php/X urls.
$wgArticlePath = false; # Don't let a "/*" article path clober our action path
$wgActionPaths = array( "$wgUploadPath/" );
@@ -60,8 +60,8 @@ function wfImageAuthMain() {
// See if this is a public Wiki (no protections).
if ( $wgImgAuthPublicTest
- && in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) )
- {
+ && in_array( 'read', User::getGroupPermissions( array( '*' ) ), true )
+ ) {
// This is a public wiki, so disable this script (for private wikis only)
wfForbidden( 'img-auth-accessdenied', 'img-auth-public' );
return;
@@ -106,7 +106,7 @@ function wfImageAuthMain() {
// Check to see if the file exists
if ( !$repo->fileExists( $filename ) ) {
- wfForbidden( 'img-auth-accessdenied','img-auth-nofile', $filename );
+ wfForbidden( 'img-auth-accessdenied', 'img-auth-nofile', $filename );
return;
}
@@ -130,7 +130,7 @@ function wfImageAuthMain() {
}
// Stream the requested file
- wfDebugLog( 'img_auth', "Streaming `".$filename."`." );
+ wfDebugLog( 'img_auth', "Streaming `" . $filename . "`." );
$repo->streamFile( $filename, array( 'Cache-Control: private', 'Vary: Cookie' ) );
}
@@ -153,8 +153,8 @@ function wfForbidden( $msg1, $msg2 ) {
$detailMsg = wfMessage( $detailMsgKey, $args )->escaped();
wfDebugLog( 'img_auth',
- "wfForbidden Hdr:" . wfMessage( $msg1 )->inLanguage( 'en' )->text() . " Msg: ".
- wfMessage( $msg2, $args )->inLanguage( 'en' )->text()
+ "wfForbidden Hdr: " . wfMessage( $msg1 )->inLanguage( 'en' )->text() . " Msg: " .
+ wfMessage( $msg2, $args )->inLanguage( 'en' )->text()
);
header( 'HTTP/1.0 403 Forbidden' );
diff --git a/img_auth.php5 b/img_auth.php5
index b3eb4501..a86d7c0b 100644
--- a/img_auth.php5
+++ b/img_auth.php5
@@ -1,7 +1,7 @@
<?php
/**
* Version of img_auth.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
*
* 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
diff --git a/includes/Action.php b/includes/Action.php
index 51922251..2e0c88ba 100644
--- a/includes/Action.php
+++ b/includes/Action.php
@@ -32,13 +32,13 @@
*
* Actions generally fall into two groups: the show-a-form-then-do-something-with-the-input
* format (protect, delete, move, etc), and the just-do-something format (watch, rollback,
- * patrol, etc). The FormAction and FormlessAction classes respresent these two groups.
+ * patrol, etc). The FormAction and FormlessAction classes represent these two groups.
*/
abstract class Action {
/**
* Page on which we're performing the action
- * @var Page $page
+ * @var WikiPage|Article|ImagePage|CategoryPage|Page $page
*/
protected $page;
@@ -61,7 +61,7 @@ abstract class Action {
* @param $overrides Array
* @return bool|null|string
*/
- private final static function getClass( $action, array $overrides ) {
+ final private static function getClass( $action, array $overrides ) {
global $wgActions;
$action = strtolower( $action );
@@ -88,7 +88,7 @@ abstract class Action {
* @return Action|bool|null false if the action is disabled, null
* if it is not recognised
*/
- public final static function factory( $action, Page $page, IContextSource $context = null ) {
+ final public static function factory( $action, Page $page, IContextSource $context = null ) {
$class = self::getClass( $action, $page->getActionOverrides() );
if ( $class ) {
$obj = new $class( $page, $context );
@@ -106,7 +106,7 @@ abstract class Action {
* @param $context IContextSource
* @return string: action name
*/
- public final static function getActionName( IContextSource $context ) {
+ final public static function getActionName( IContextSource $context ) {
global $wgActions;
$request = $context->getRequest();
@@ -147,10 +147,10 @@ abstract class Action {
/**
* Check if a given action is recognised, even if it's disabled
*
- * @param $name String: name of an action
+ * @param string $name name of an action
* @return Bool
*/
- public final static function exists( $name ) {
+ final public static function exists( $name ) {
return self::getClass( $name, array() ) !== null;
}
@@ -158,7 +158,7 @@ abstract class Action {
* Get the IContextSource in use here
* @return IContextSource
*/
- public final function getContext() {
+ final public function getContext() {
if ( $this->context instanceof IContextSource ) {
return $this->context;
}
@@ -170,7 +170,7 @@ abstract class Action {
*
* @return WebRequest
*/
- public final function getRequest() {
+ final public function getRequest() {
return $this->getContext()->getRequest();
}
@@ -179,7 +179,7 @@ abstract class Action {
*
* @return OutputPage
*/
- public final function getOutput() {
+ final public function getOutput() {
return $this->getContext()->getOutput();
}
@@ -188,7 +188,7 @@ abstract class Action {
*
* @return User
*/
- public final function getUser() {
+ final public function getUser() {
return $this->getContext()->getUser();
}
@@ -197,7 +197,7 @@ abstract class Action {
*
* @return Skin
*/
- public final function getSkin() {
+ final public function getSkin() {
return $this->getContext()->getSkin();
}
@@ -206,7 +206,7 @@ abstract class Action {
*
* @return Language
*/
- public final function getLanguage() {
+ final public function getLanguage() {
return $this->getContext()->getLanguage();
}
@@ -216,7 +216,7 @@ abstract class Action {
* @deprecated 1.19 Use getLanguage instead
* @return Language
*/
- public final function getLang() {
+ final public function getLang() {
wfDeprecated( __METHOD__, '1.19' );
return $this->getLanguage();
}
@@ -225,7 +225,7 @@ abstract class Action {
* Shortcut to get the Title object from the page
* @return Title
*/
- public final function getTitle() {
+ final public function getTitle() {
return $this->page->getTitle();
}
@@ -235,7 +235,7 @@ abstract class Action {
*
* @return Message object
*/
- public final function msg() {
+ final public function msg() {
$params = func_get_args();
return call_user_func_array( array( $this->getContext(), 'msg' ), $params );
}
@@ -255,7 +255,7 @@ abstract class Action {
* Return the name of the action this object responds to
* @return String lowercase
*/
- public abstract function getName();
+ abstract public function getName();
/**
* Get the permission required to perform this action. Often, but not always,
@@ -272,7 +272,7 @@ abstract class Action {
* must throw subclasses of ErrorPageError
*
* @param $user User: the user to check, or null to use the context user
- * @throws ErrorPageError
+ * @throws UserBlockedError|ReadOnlyError|PermissionsError
* @return bool True on success
*/
protected function checkCanExecute( User $user ) {
@@ -350,13 +350,13 @@ abstract class Action {
* $this->getOutput(), etc.
* @throws ErrorPageError
*/
- public abstract function show();
+ abstract public function show();
/**
* Execute the action in a silent fashion: do not display anything or release any errors.
* @return Bool whether execution was successful
*/
- public abstract function execute();
+ abstract public function execute();
}
/**
@@ -368,7 +368,7 @@ abstract class FormAction extends Action {
* Get an HTMLForm descriptor array
* @return Array
*/
- protected abstract function getFormFields();
+ abstract protected function getFormFields();
/**
* Add pre- or post-text to the form
@@ -388,7 +388,7 @@ abstract class FormAction extends Action {
protected function alterForm( HTMLForm $form ) {}
/**
- * Get the HTMLForm to control behaviour
+ * Get the HTMLForm to control behavior
* @return HTMLForm|null
*/
protected function getForm() {
@@ -406,7 +406,7 @@ abstract class FormAction extends Action {
$this->getRequest()->getQueryValues(),
array( 'action' => null, 'title' => null )
);
- $form->addHiddenField( 'redirectparams', wfArrayToCGI( $params ) );
+ $form->addHiddenField( 'redirectparams', wfArrayToCgi( $params ) );
$form->addPreText( $this->preText() );
$form->addPostText( $this->postText() );
@@ -425,21 +425,21 @@ abstract class FormAction extends Action {
* @param $data Array
* @return Bool|Array true for success, false for didn't-try, array of errors on failure
*/
- public abstract function onSubmit( $data );
+ abstract public function onSubmit( $data );
/**
* Do something exciting on successful processing of the form. This might be to show
* a confirmation message (watch, rollback, etc) or to redirect somewhere else (edit,
* protect, etc).
*/
- public abstract function onSuccess();
+ abstract public function onSuccess();
/**
* The basic pattern for actions is to display some sort of HTMLForm UI, maybe with
* some stuff underneath (history etc); to do some processing on submission of that
* form (delete, protect, etc) and to do something exciting on 'success', be that
* display something new or redirect to somewhere. Some actions have more exotic
- * behaviour, but that's what subclassing is for :D
+ * behavior, but that's what subclassing is for :D
*/
public function show() {
$this->setHeaders();
@@ -455,9 +455,10 @@ abstract class FormAction extends Action {
/**
* @see Action::execute()
- * @throws ErrorPageError
+ *
* @param $data array|null
* @param $captureErrors bool
+ * @throws ErrorPageError|Exception
* @return bool
*/
public function execute( array $data = null, $captureErrors = true ) {
@@ -507,7 +508,7 @@ abstract class FormlessAction extends Action {
* @return String|null will be added to the HTMLForm if present, or just added to the
* output if not. Return null to not add anything
*/
- public abstract function onView();
+ abstract public function onView();
/**
* We don't want an HTMLForm
@@ -544,8 +545,9 @@ abstract class FormlessAction extends Action {
/**
* Execute the action silently, not giving any output. Since these actions don't have
* forms, they probably won't have any data, but some (eg rollback) may do
- * @param $data Array values that would normally be in the GET request
- * @param $captureErrors Bool whether to catch exceptions and just return false
+ * @param array $data values that would normally be in the GET request
+ * @param bool $captureErrors whether to catch exceptions and just return false
+ * @throws ErrorPageError|Exception
* @return Bool whether execution was successful
*/
public function execute( array $data = null, $captureErrors = true ) {
diff --git a/includes/AjaxResponse.php b/includes/AjaxResponse.php
index 6bf94ccb..138f808a 100644
--- a/includes/AjaxResponse.php
+++ b/includes/AjaxResponse.php
@@ -172,7 +172,7 @@ class AjaxResponse {
# tell the client to use a cached copy, without a way to purge it.
if ( $wgUseSquid ) {
- # Expect explicite purge of the proxy cache, but require end user agents
+ # Expect explicit purge of the proxy cache, but require end user agents
# to revalidate against the proxy on each visit.
# Surrogate-Control controls our Squid, Cache-Control downstream caches
@@ -204,7 +204,7 @@ class AjaxResponse {
/**
* checkLastModified tells the client to use the client-cached response if
- * possible. If sucessful, the AjaxResponse is disabled so that
+ * possible. If successful, the AjaxResponse is disabled so that
* any future call to AjaxResponse::printText() have no effect.
*
* @param $timestamp string
diff --git a/includes/ArrayUtils.php b/includes/ArrayUtils.php
new file mode 100644
index 00000000..0b74f06a
--- /dev/null
+++ b/includes/ArrayUtils.php
@@ -0,0 +1,69 @@
+<?php
+
+class ArrayUtils {
+ /**
+ * Sort the given array in a pseudo-random order which depends only on the
+ * given key and each element value. This is typically used for load
+ * balancing between servers each with a local cache.
+ *
+ * Keys are preserved. The input array is modified in place.
+ *
+ * Note: Benchmarking on PHP 5.3 and 5.4 indicates that for small
+ * strings, md5() is only 10% slower than hash('joaat',...) etc.,
+ * since the function call overhead dominates. So there's not much
+ * justification for breaking compatibility with installations
+ * compiled with ./configure --disable-hash.
+ *
+ * @param $array The array to sort
+ * @param $key The string key
+ * @param $separator A separator used to delimit the array elements and the
+ * key. This can be chosen to provide backwards compatibility with
+ * various consistent hash implementations that existed before this
+ * function was introduced.
+ */
+ public static function consistentHashSort( &$array, $key, $separator = "\000" ) {
+ $hashes = array();
+ foreach ( $array as $elt ) {
+ $hashes[$elt] = md5( $elt . $separator . $key );
+ }
+ uasort( $array, function ( $a, $b ) use ( $hashes ) {
+ return strcmp( $hashes[$a], $hashes[$b] );
+ } );
+ }
+
+ /**
+ * Given an array of non-normalised probabilities, this function will select
+ * an element and return the appropriate key
+ *
+ * @param $weights array
+ *
+ * @return bool|int|string
+ */
+ public static function pickRandom( $weights ){
+ if ( !is_array( $weights ) || count( $weights ) == 0 ) {
+ return false;
+ }
+
+ $sum = array_sum( $weights );
+ if ( $sum == 0 ) {
+ # No loads on any of them
+ # In previous versions, this triggered an unweighted random selection,
+ # but this feature has been removed as of April 2006 to allow for strict
+ # separation of query groups.
+ return false;
+ }
+ $max = mt_getrandmax();
+ $rand = mt_rand( 0, $max ) / $max * $sum;
+
+ $sum = 0;
+ foreach ( $weights as $i => $w ) {
+ $sum += $w;
+ # Do not return keys if they have 0 weight.
+ # Note that the "all 0 weight" case is handed above
+ if ( $w > 0 && $sum >= $rand ) {
+ break;
+ }
+ }
+ return $i;
+ }
+}
diff --git a/includes/Article.php b/includes/Article.php
index 9ab4b6ba..9b4afe44 100644
--- a/includes/Article.php
+++ b/includes/Article.php
@@ -33,7 +33,7 @@
*
* @internal documentation reviewed 15 Mar 2010
*/
-class Article extends Page {
+class Article implements Page {
/**@{{
* @private
*/
@@ -57,10 +57,17 @@ class Article extends Page {
public $mParserOptions;
/**
- * Content of the revision we are working on
+ * Text of the revision we are working on
* @var string $mContent
*/
- var $mContent; // !<
+ var $mContent; // !< #BC cruft
+
+ /**
+ * Content of the revision we are working on
+ * @var Content
+ * @since 1.21
+ */
+ var $mContentObject; // !<
/**
* Is the content ($mContent) already loaded?
@@ -127,7 +134,7 @@ class Article extends Page {
/**
* Constructor from a page id
- * @param $id Int article ID to load
+ * @param int $id article ID to load
* @return Article|null
*/
public static function newFromID( $id ) {
@@ -231,9 +238,32 @@ class Article extends Page {
* This function has side effects! Do not use this function if you
* only want the real revision text if any.
*
+ * @deprecated in 1.21; use WikiPage::getContent() instead
+ *
* @return string Return the text of this revision
*/
public function getContent() {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+ $content = $this->getContentObject();
+ return ContentHandler::getContentText( $content );
+ }
+
+ /**
+ * Returns a Content object representing the pages effective display content,
+ * not necessarily the revision's content!
+ *
+ * Note that getContent/loadContent do not follow redirects anymore.
+ * If you need to fetch redirectable content easily, try
+ * the shortcut in WikiPage::getRedirectTarget()
+ *
+ * This function has side effects! Do not use this function if you
+ * only want the real revision text if any.
+ *
+ * @return Content Return the content of this revision
+ *
+ * @since 1.21
+ */
+ protected function getContentObject() {
wfProfileIn( __METHOD__ );
if ( $this->mPage->getID() === 0 ) {
@@ -244,19 +274,19 @@ class Article extends Page {
if ( $text === false ) {
$text = '';
}
+
+ $content = ContentHandler::makeContent( $text, $this->getTitle() );
} else {
$message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
- $text = wfMessage( $message )->text();
+ $content = new MessageContent( $message, null, 'parsemag' );
}
- wfProfileOut( __METHOD__ );
-
- return $text;
} else {
- $this->fetchContent();
- wfProfileOut( __METHOD__ );
-
- return $this->mContent;
+ $this->fetchContentObject();
+ $content = $this->mContentObject;
}
+
+ wfProfileOut( __METHOD__ );
+ return $content;
}
/**
@@ -336,22 +366,60 @@ class Article extends Page {
* Get text of an article from database
* Does *NOT* follow redirects.
*
+ * @protected
+ * @note this is really internal functionality that should really NOT be used by other functions. For accessing
+ * article content, use the WikiPage class, especially WikiBase::getContent(). However, a lot of legacy code
+ * uses this method to retrieve page text from the database, so the function has to remain public for now.
+ *
* @return mixed string containing article contents, or false if null
+ * @deprecated in 1.21, use WikiPage::getContent() instead
*/
- function fetchContent() {
- if ( $this->mContentLoaded ) {
+ function fetchContent() { #BC cruft!
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ if ( $this->mContentLoaded && $this->mContent ) {
return $this->mContent;
}
wfProfileIn( __METHOD__ );
+ $content = $this->fetchContentObject();
+
+ $this->mContent = ContentHandler::getContentText( $content ); #@todo: get rid of mContent everywhere!
+ ContentHandler::runLegacyHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
+
+ wfProfileOut( __METHOD__ );
+
+ return $this->mContent;
+ }
+
+ /**
+ * Get text content object
+ * Does *NOT* follow redirects.
+ * TODO: when is this null?
+ *
+ * @note code that wants to retrieve page content from the database should use WikiPage::getContent().
+ *
+ * @return Content|null|boolean false
+ *
+ * @since 1.21
+ */
+ protected function fetchContentObject() {
+ if ( $this->mContentLoaded ) {
+ return $this->mContentObject;
+ }
+
+ wfProfileIn( __METHOD__ );
+
$this->mContentLoaded = true;
+ $this->mContent = null;
$oldid = $this->getOldID();
# Pre-fill content with error message so that if something
# fails we'll have something telling us what we intended.
- $this->mContent = wfMessage( 'missing-revision', $oldid )->plain();
+ //XXX: this isn't page content but a UI message. horrible.
+ $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ), array() );
if ( $oldid ) {
# $this->mRevision might already be fetched by getOldIDFromRequest()
@@ -371,6 +439,7 @@ class Article extends Page {
}
$this->mRevision = $this->mPage->getRevision();
+
if ( !$this->mRevision ) {
wfDebug( __METHOD__ . " failed to retrieve current page, rev_id " . $this->mPage->getLatest() . "\n" );
wfProfileOut( __METHOD__ );
@@ -380,14 +449,14 @@ class Article extends Page {
// @todo FIXME: Horrible, horrible! This content-loading interface just plain sucks.
// We should instead work with the Revision object when we need it...
- $this->mContent = $this->mRevision->getText( Revision::FOR_THIS_USER ); // Loads if user is allowed
+ $this->mContentObject = $this->mRevision->getContent( Revision::FOR_THIS_USER, $this->getContext()->getUser() ); // Loads if user is allowed
$this->mRevIdFetched = $this->mRevision->getId();
- wfRunHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
+ wfRunHooks( 'ArticleAfterFetchContentObject', array( &$this, &$this->mContentObject ) );
wfProfileOut( __METHOD__ );
- return $this->mContent;
+ return $this->mContentObject;
}
/**
@@ -420,7 +489,7 @@ class Article extends Page {
* @return Revision|null
*/
public function getRevisionFetched() {
- $this->fetchContent();
+ $this->fetchContentObject();
return $this->mRevision;
}
@@ -443,7 +512,7 @@ class Article extends Page {
* page of the given title.
*/
public function view() {
- global $wgParser, $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
+ global $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
wfProfileIn( __METHOD__ );
@@ -580,7 +649,7 @@ class Article extends Page {
break;
case 3:
# This will set $this->mRevision if needed
- $this->fetchContent();
+ $this->fetchContentObject();
# Are we looking at an old revision
if ( $oldid && $this->mRevision ) {
@@ -604,18 +673,25 @@ class Article extends Page {
wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
$this->showCssOrJsPage();
$outputDone = true;
- } elseif( !wfRunHooks( 'ArticleViewCustom', array( $this->mContent, $this->getTitle(), $outputPage ) ) ) {
+ } elseif( !wfRunHooks( 'ArticleContentViewCustom',
+ array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
+
+ # Allow extensions do their own custom view for certain pages
+ $outputDone = true;
+ } elseif( !ContentHandler::runLegacyHooks( 'ArticleViewCustom',
+ array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
+
# Allow extensions do their own custom view for certain pages
$outputDone = true;
} else {
- $text = $this->getContent();
- $rt = Title::newFromRedirectArray( $text );
+ $content = $this->getContentObject();
+ $rt = $content ? $content->getRedirectChain() : null;
if ( $rt ) {
wfDebug( __METHOD__ . ": showing redirect=no page\n" );
# Viewing a redirect page (e.g. with parameter redirect=no)
$outputPage->addHTML( $this->viewRedirect( $rt ) );
# Parse just to get categories, displaytitle, etc.
- $this->mParserOutput = $wgParser->parse( $text, $this->getTitle(), $parserOptions );
+ $this->mParserOutput = $content->getParserOutput( $this->getTitle(), $oldid, $parserOptions, false );
$outputPage->addParserOutputNoText( $this->mParserOutput );
$outputDone = true;
}
@@ -625,8 +701,8 @@ class Article extends Page {
# Run the parse, protected by a pool counter
wfDebug( __METHOD__ . ": doing uncached parse\n" );
- $poolArticleView = new PoolWorkArticleView( $this, $parserOptions,
- $this->getRevIdFetched(), $useParserCache, $this->getContent() );
+ $poolArticleView = new PoolWorkArticleView( $this->getPage(), $parserOptions,
+ $this->getRevIdFetched(), $useParserCache, $this->getContentObject() );
if ( !$poolArticleView->execute() ) {
$error = $poolArticleView->getError();
@@ -690,6 +766,8 @@ class Article extends Page {
$this->showViewFooter();
$this->mPage->doViewUpdates( $user );
+ $outputPage->addModules( 'mediawiki.action.view.postEdit' );
+
wfProfileOut( __METHOD__ );
}
@@ -708,6 +786,8 @@ class Article extends Page {
/**
* Show a diff page according to current request variables. For use within
* Article::view() only, other callers should use the DifferenceEngine class.
+ *
+ * @todo: make protected
*/
public function showDiffPage() {
$request = $this->getContext()->getRequest();
@@ -719,7 +799,17 @@ class Article extends Page {
$unhide = $request->getInt( 'unhide' ) == 1;
$oldid = $this->getOldID();
- $de = new DifferenceEngine( $this->getContext(), $oldid, $diff, $rcid, $purge, $unhide );
+ $rev = $this->getRevisionFetched();
+
+ if ( !$rev ) {
+ $this->getContext()->getOutput()->setPageTitle( wfMessage( 'errorpagetitle' ) );
+ $this->getContext()->getOutput()->addWikiMsg( 'difference-missing-revision', $oldid, 1 );
+ return;
+ }
+
+ $contentHandler = $rev->getContentHandler();
+ $de = $contentHandler->createDifferenceEngine( $this->getContext(), $oldid, $diff, $rcid, $purge, $unhide );
+
// DifferenceEngine directly fetched the revision:
$this->mRevIdFetched = $de->mNewid;
$de->showDiffPage( $diffOnly );
@@ -736,29 +826,34 @@ class Article extends Page {
*
* This is hooked by SyntaxHighlight_GeSHi to do syntax highlighting of these
* page views.
+ *
+ * @param bool $showCacheHint whether to show a message telling the user to clear the browser cache (default: true).
*/
- protected function showCssOrJsPage() {
- $dir = $this->getContext()->getLanguage()->getDir();
- $lang = $this->getContext()->getLanguage()->getCode();
-
+ protected function showCssOrJsPage( $showCacheHint = true ) {
$outputPage = $this->getContext()->getOutput();
- $outputPage->wrapWikiMsg( "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
- 'clearyourcache' );
- // Give hooks a chance to customise the output
- if ( wfRunHooks( 'ShowRawCssJs', array( $this->mContent, $this->getTitle(), $outputPage ) ) ) {
- // Wrap the whole lot in a <pre> and don't parse
- $m = array();
- preg_match( '!\.(css|js)$!u', $this->getTitle()->getText(), $m );
- $outputPage->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
- $outputPage->addHTML( htmlspecialchars( $this->mContent ) );
- $outputPage->addHTML( "\n</pre>\n" );
+ if ( $showCacheHint ) {
+ $dir = $this->getContext()->getLanguage()->getDir();
+ $lang = $this->getContext()->getLanguage()->getCode();
+
+ $outputPage->wrapWikiMsg( "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
+ 'clearyourcache' );
+ }
+
+ $this->fetchContentObject();
+
+ if ( $this->mContentObject ) {
+ // Give hooks a chance to customise the output
+ if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->mContentObject, $this->getTitle(), $outputPage ) ) ) {
+ $po = $this->mContentObject->getParserOutput( $this->getTitle() );
+ $outputPage->addHTML( $po->getText() );
+ }
}
}
/**
* Get the robot policy to be used for the current view
- * @param $action String the action= GET parameter
+ * @param string $action the action= GET parameter
* @param $pOutput ParserOutput
* @return Array the policy that should be set
* TODO: actions other than 'view'
@@ -768,15 +863,21 @@ class Article extends Page {
$ns = $this->getTitle()->getNamespace();
- if ( $ns == NS_USER || $ns == NS_USER_TALK ) {
- # Don't index user and user talk pages for blocked users (bug 11443)
- if ( !$this->getTitle()->isSubpage() ) {
- if ( Block::newFromTarget( null, $this->getTitle()->getText() ) instanceof Block ) {
- return array(
- 'index' => 'noindex',
- 'follow' => 'nofollow'
- );
- }
+ # Don't index user and user talk pages for blocked users (bug 11443)
+ if ( ( $ns == NS_USER || $ns == NS_USER_TALK ) && !$this->getTitle()->isSubpage() ) {
+ $specificTarget = null;
+ $vagueTarget = null;
+ $titleText = $this->getTitle()->getText();
+ if ( IP::isValid( $titleText ) ) {
+ $vagueTarget = $titleText;
+ } else {
+ $specificTarget = $titleText;
+ }
+ if ( Block::newFromTarget( $specificTarget, $vagueTarget ) instanceof Block ) {
+ return array(
+ 'index' => 'noindex',
+ 'follow' => 'nofollow'
+ );
}
}
@@ -892,9 +993,7 @@ class Article extends Page {
}
// Add a <link rel="canonical"> tag
- $outputPage->addLink( array( 'rel' => 'canonical',
- 'href' => $this->getTitle()->getLocalURL() )
- );
+ $outputPage->setCanonicalUrl( $this->getTitle()->getLocalURL() );
// Tell the output object that the user arrived at this article through a redirect
$outputPage->setRedirectedFrom( $this->mRedirectedFrom );
@@ -948,6 +1047,8 @@ class Article extends Page {
* If patrol is possible, output a patrol UI box. This is called from the
* footer section of ordinary page views. If patrol is not possible or not
* desired, does nothing.
+ * Side effect: When the patrol link is build, this method will call
+ * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
*/
public function showPatrolFooter() {
$request = $this->getContext()->getRequest();
@@ -960,7 +1061,9 @@ class Article extends Page {
}
$token = $user->getEditToken( $rcid );
+
$outputPage->preventClickjacking();
+ $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
$link = Linker::linkKnown(
$this->getTitle(),
@@ -987,6 +1090,7 @@ class Article extends Page {
public function showMissingArticle() {
global $wgSend404Code;
$outputPage = $this->getContext()->getOutput();
+ $validUserPage = false;
# Show info in user (talk) namespace. Does the user exist? Is he blocked?
if ( $this->getTitle()->getNamespace() == NS_USER || $this->getTitle()->getNamespace() == NS_USER_TALK ) {
@@ -1013,6 +1117,9 @@ class Article extends Page {
)
)
);
+ $validUserPage = true;
+ } else {
+ $validUserPage = true;
}
}
@@ -1020,13 +1127,13 @@ class Article extends Page {
# Show delete and move logs
LogEventsList::showLogExtract( $outputPage, array( 'delete', 'move' ), $this->getTitle(), '',
- array( 'lim' => 10,
+ array( 'lim' => 10,
'conds' => array( "log_action != 'revision'" ),
'showIfEmpty' => false,
'msgKey' => array( 'moveddeleted-notice' ) )
);
- if ( !$this->mPage->hasViewableContent() && $wgSend404Code ) {
+ if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
// If there's no backing content, send a 404 Not Found
// for better machine handling of broken links.
$this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
@@ -1104,7 +1211,7 @@ class Article extends Page {
* Revision as of \<date\>; view current revision
* \<- Previous version | Next Version -\>
*
- * @param $oldid int: revision ID of this article revision
+ * @param int $oldid revision ID of this article revision
*/
public function setOldSubtitle( $oldid = 0 ) {
if ( !wfRunHooks( 'DisplayOldSubtitle', array( &$this, &$oldid ) ) ) {
@@ -1166,7 +1273,7 @@ class Article extends Page {
'oldid' => $oldid
) + $extraParams
);
- $prev = $this->getTitle()->getPreviousRevisionID( $oldid ) ;
+ $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
$prevlink = $prev
? Linker::linkKnown(
$this->getTitle(),
@@ -1377,7 +1484,13 @@ class Article extends Page {
// Generate deletion reason
$hasHistory = false;
if ( !$reason ) {
- $reason = $this->generateReason( $hasHistory );
+ try {
+ $reason = $this->generateReason( $hasHistory );
+ } catch ( MWException $e ) {
+ # if a page is horribly broken, we still want to be able to delete it. so be lenient about errors here.
+ wfDebug( "Error while building auto delete summary: $e" );
+ $reason = '';
+ }
}
// If the page has a history, insert a warning
@@ -1406,7 +1519,7 @@ class Article extends Page {
/**
* Output deletion confirmation dialog
* @todo FIXME: Move to another file?
- * @param $reason String: prefilled reason
+ * @param string $reason prefilled reason
*/
public function confirmDelete( $reason ) {
wfDebug( "Article::confirmDelete\n" );
@@ -1614,9 +1727,11 @@ class Article extends Page {
*
* @param $oldid mixed integer Revision ID or null
* @param $user User The relevant user
- * @return ParserOutput or false if the given revsion ID is not found
+ * @return ParserOutput or false if the given revision ID is not found
*/
public function getParserOutput( $oldid = null, User $user = null ) {
+ //XXX: bypasses mParserOptions and thus setParserOptions()
+
if ( $user === null ) {
$parserOptions = $this->getParserOptions();
} else {
@@ -1627,6 +1742,21 @@ class Article extends Page {
}
/**
+ * Override the ParserOptions used to render the primary article wikitext.
+ *
+ * @param ParserOptions $options
+ * @throws MWException if the parser options where already initialized.
+ */
+ public function setParserOptions( ParserOptions $options ) {
+ if ( $this->mParserOptions ) {
+ throw new MWException( "can't change parser options after they have already been set" );
+ }
+
+ // clone, so if $options is modified later, it doesn't confuse the parser cache.
+ $this->mParserOptions = clone $options;
+ }
+
+ /**
* Get parser options suitable for rendering the primary article wikitext
* @return ParserOptions
*/
@@ -1757,15 +1887,16 @@ class Article extends Page {
*
* @deprecated in 1.18; call OutputPage::redirect() directly
* @param $noRedir Boolean: add redirect=no
- * @param $sectionAnchor String: section to redirect to, including "#"
- * @param $extraQuery String: extra query params
+ * @param string $sectionAnchor section to redirect to, including "#"
+ * @param string $extraQuery extra query params
*/
public function doRedirect( $noRedir = false, $sectionAnchor = '', $extraQuery = '' ) {
wfDeprecated( __METHOD__, '1.18' );
if ( $noRedir ) {
$query = 'redirect=no';
- if ( $extraQuery )
+ if ( $extraQuery ) {
$query .= "&$extraQuery";
+ }
} else {
$query = $extraQuery;
}
@@ -1777,7 +1908,7 @@ class Article extends Page {
* Use PHP's magic __get handler to handle accessing of
* raw WikiPage fields for backwards compatibility.
*
- * @param $fname String Field name
+ * @param string $fname Field name
*/
public function __get( $fname ) {
if ( property_exists( $this->mPage, $fname ) ) {
@@ -1791,7 +1922,7 @@ class Article extends Page {
* Use PHP's magic __set handler to handle setting of
* raw WikiPage fields for backwards compatibility.
*
- * @param $fname String Field name
+ * @param string $fname Field name
* @param $fvalue mixed New value
*/
public function __set( $fname, $fvalue ) {
@@ -1810,8 +1941,8 @@ class Article extends Page {
* Use PHP's magic __call handler to transform instance calls to
* WikiPage functions for backwards compatibility.
*
- * @param $fname String Name of called method
- * @param $args Array Arguments to the method
+ * @param string $fname Name of called method
+ * @param array $args Arguments to the method
* @return mixed
*/
public function __call( $fname, $args ) {
@@ -1844,7 +1975,13 @@ class Article extends Page {
* @return bool
*/
public function updateRestrictions( $limit = array(), $reason = '', &$cascade = 0, $expiry = array() ) {
- return $this->mPage->updateRestrictions( $limit, $reason, $cascade, $expiry );
+ return $this->mPage->doUpdateRestrictions(
+ $limit,
+ $expiry,
+ $cascade,
+ $reason,
+ $this->getContext()->getUser()
+ );
}
/**
@@ -1891,7 +2028,9 @@ class Article extends Page {
* @return mixed
*/
public function generateReason( &$hasHistory ) {
- return $this->mPage->getAutoDeleteReason( $hasHistory );
+ $title = $this->mPage->getTitle();
+ $handler = ContentHandler::getForTitle( $title );
+ return $handler->getAutoDeleteReason( $title, $hasHistory );
}
// ****** B/C functions for static methods ( __callStatic is PHP>=5.3 ) ****** //
@@ -1929,6 +2068,7 @@ class Article extends Page {
* @param $newtext
* @param $flags
* @return string
+ * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
*/
public static function getAutosummary( $oldtext, $newtext, $flags ) {
return WikiPage::getAutosummary( $oldtext, $newtext, $flags );
diff --git a/includes/AuthPlugin.php b/includes/AuthPlugin.php
index 2e42439c..a4658176 100644
--- a/includes/AuthPlugin.php
+++ b/includes/AuthPlugin.php
@@ -46,7 +46,7 @@ class AuthPlugin {
* you might need to munge it (for instance, for lowercase initial
* letters).
*
- * @param $username String: username.
+ * @param string $username username.
* @return bool
*/
public function userExists( $username ) {
@@ -60,8 +60,8 @@ class AuthPlugin {
* you might need to munge it (for instance, for lowercase initial
* letters).
*
- * @param $username String: username.
- * @param $password String: user password.
+ * @param string $username username.
+ * @param string $password user password.
* @return bool
*/
public function authenticate( $username, $password ) {
@@ -73,7 +73,7 @@ class AuthPlugin {
* Modify options in the login template.
*
* @param $template UserLoginTemplate object.
- * @param $type String 'signup' or 'login'. Added in 1.16.
+ * @param string $type 'signup' or 'login'. Added in 1.16.
*/
public function modifyUITemplate( &$template, &$type ) {
# Override this!
@@ -83,7 +83,7 @@ class AuthPlugin {
/**
* Set the domain this plugin is supposed to use when authenticating.
*
- * @param $domain String: authentication domain.
+ * @param string $domain authentication domain.
*/
public function setDomain( $domain ) {
$this->domain = $domain;
@@ -105,7 +105,7 @@ class AuthPlugin {
/**
* Check to see if the specific domain is a valid domain.
*
- * @param $domain String: authentication domain.
+ * @param string $domain authentication domain.
* @return bool
*/
public function validDomain( $domain ) {
@@ -194,7 +194,7 @@ class AuthPlugin {
* Return true if successful.
*
* @param $user User object.
- * @param $password String: password.
+ * @param string $password password.
* @return bool
*/
public function setPassword( $user, $password ) {
@@ -251,7 +251,7 @@ class AuthPlugin {
* Check if a user should authenticate locally if the global authentication fails.
* If either this or strict() returns true, local authentication is not used.
*
- * @param $username String: username.
+ * @param string $username username.
* @return Boolean
*/
public function strictUserAuth( $username ) {
diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php
index a8b22027..3555e2c3 100644
--- a/includes/AutoLoader.php
+++ b/includes/AutoLoader.php
@@ -33,12 +33,12 @@ $wgAutoloadLocalClasses = array(
'AjaxDispatcher' => 'includes/AjaxDispatcher.php',
'AjaxResponse' => 'includes/AjaxResponse.php',
'AlphabeticPager' => 'includes/Pager.php',
+ 'ArrayUtils' => 'includes/ArrayUtils.php',
'Article' => 'includes/Article.php',
'AtomFeed' => 'includes/Feed.php',
'AuthPlugin' => 'includes/AuthPlugin.php',
'AuthPluginUser' => 'includes/AuthPlugin.php',
'Autopromote' => 'includes/Autopromote.php',
- 'BacklinkCache' => 'includes/BacklinkCache.php',
'BadTitleError' => 'includes/Exception.php',
'BaseTemplate' => 'includes/SkinTemplate.php',
'Block' => 'includes/Block.php',
@@ -71,8 +71,6 @@ $wgAutoloadLocalClasses = array(
'DeferredUpdates' => 'includes/DeferredUpdates.php',
'DeprecatedGlobal' => 'includes/DeprecatedGlobal.php',
'DerivativeRequest' => 'includes/WebRequest.php',
- 'DeviceDetection' => 'includes/mobile/DeviceDetection.php',
- 'DeviceProperties' => 'includes/mobile/DeviceDetection.php',
'DiffHistoryBlob' => 'includes/HistoryBlob.php',
'DoubleReplacer' => 'includes/StringUtils.php',
'DummyLinker' => 'includes/Linker.php',
@@ -93,9 +91,11 @@ $wgAutoloadLocalClasses = array(
'ErrorPageError' => 'includes/Exception.php',
'ExplodeIterator' => 'includes/StringUtils.php',
'ExternalEdit' => 'includes/ExternalEdit.php',
- 'ExternalStore' => 'includes/ExternalStore.php',
- 'ExternalStoreDB' => 'includes/ExternalStoreDB.php',
- 'ExternalStoreHttp' => 'includes/ExternalStoreHttp.php',
+ 'ExternalStore' => 'includes/externalstore/ExternalStore.php',
+ 'ExternalStoreDB' => 'includes/externalstore/ExternalStoreDB.php',
+ 'ExternalStoreHttp' => 'includes/externalstore/ExternalStoreHttp.php',
+ 'ExternalStoreMedium' => 'includes/externalstore/ExternalStoreMedium.php',
+ 'ExternalStoreMwstore' => 'includes/externalstore/ExternalStoreMwstore.php',
'ExternalUser' => 'includes/ExternalUser.php',
'FakeTitle' => 'includes/FakeTitle.php',
'Fallback' => 'includes/Fallback.php',
@@ -119,6 +119,7 @@ $wgAutoloadLocalClasses = array(
'Html' => 'includes/Html.php',
'HTMLApiField' => 'includes/HTMLForm.php',
'HTMLCheckField' => 'includes/HTMLForm.php',
+ 'HTMLCheckMatrix' => 'includes/HTMLForm.php',
'HTMLEditTools' => 'includes/HTMLForm.php',
'HTMLFloatField' => 'includes/HTMLForm.php',
'HTMLForm' => 'includes/HTMLForm.php',
@@ -136,11 +137,8 @@ $wgAutoloadLocalClasses = array(
'HTMLTextField' => 'includes/HTMLForm.php',
'Http' => 'includes/HttpFunctions.php',
'HttpError' => 'includes/Exception.php',
- 'HttpRequest' => 'includes/HttpFunctions.old.php',
'ICacheHelper' => 'includes/CacheHelper.php',
'IcuCollation' => 'includes/Collation.php',
- 'IDeviceProperties' => 'includes/mobile/DeviceDetection.php',
- 'IDeviceDetector' => 'includes/mobile/DeviceDetection.php',
'IdentityCollation' => 'includes/Collation.php',
'ImageGallery' => 'includes/ImageGallery.php',
'ImageHistoryList' => 'includes/ImagePage.php',
@@ -153,10 +151,11 @@ $wgAutoloadLocalClasses = array(
'IndexPager' => 'includes/Pager.php',
'Interwiki' => 'includes/interwiki/Interwiki.php',
'IP' => 'includes/IP.php',
- 'LCStore_Accel' => 'includes/LocalisationCache.php',
- 'LCStore_CDB' => 'includes/LocalisationCache.php',
- 'LCStore_DB' => 'includes/LocalisationCache.php',
- 'LCStore_Null' => 'includes/LocalisationCache.php',
+ 'LCStore' => 'includes/cache/LocalisationCache.php',
+ 'LCStore_Accel' => 'includes/cache/LocalisationCache.php',
+ 'LCStore_CDB' => 'includes/cache/LocalisationCache.php',
+ 'LCStore_DB' => 'includes/cache/LocalisationCache.php',
+ 'LCStore_Null' => 'includes/cache/LocalisationCache.php',
'LegacyTemplate' => 'includes/SkinLegacy.php',
'License' => 'includes/Licenses.php',
'Licenses' => 'includes/Licenses.php',
@@ -164,11 +163,12 @@ $wgAutoloadLocalClasses = array(
'LinkFilter' => 'includes/LinkFilter.php',
'LinksUpdate' => 'includes/LinksUpdate.php',
'LinksDeletionUpdate' => 'includes/LinksUpdate.php',
- 'LocalisationCache' => 'includes/LocalisationCache.php',
- 'LocalisationCache_BulkLoad' => 'includes/LocalisationCache.php',
+ 'LocalisationCache' => 'includes/cache/LocalisationCache.php',
+ 'LocalisationCache_BulkLoad' => 'includes/cache/LocalisationCache.php',
'MagicWord' => 'includes/MagicWord.php',
'MagicWordArray' => 'includes/MagicWord.php',
'MailAddress' => 'includes/UserMailer.php',
+ 'MappedIterator' => 'includes/MappedIterator.php',
'MediaWiki' => 'includes/Wiki.php',
'MediaWiki_I18N' => 'includes/SkinTemplate.php',
'Message' => 'includes/Message.php',
@@ -183,7 +183,7 @@ $wgAutoloadLocalClasses = array(
'MWNamespace' => 'includes/Namespace.php',
'OldChangesList' => 'includes/ChangesList.php',
'OutputPage' => 'includes/OutputPage.php',
- 'Page' => 'includes/WikiPage.php',
+ 'Page' => 'includes/WikiPage.php',
'PageQueryPage' => 'includes/PageQueryPage.php',
'Pager' => 'includes/Pager.php',
'PasswordError' => 'includes/User.php',
@@ -201,10 +201,12 @@ $wgAutoloadLocalClasses = array(
'ProtectionForm' => 'includes/ProtectionForm.php',
'QueryPage' => 'includes/QueryPage.php',
'QuickTemplate' => 'includes/SkinTemplate.php',
+ 'RawMessage' => 'includes/Message.php',
'RCCacheEntry' => 'includes/ChangesList.php',
'RdfMetaData' => 'includes/Metadata.php',
'ReadOnlyError' => 'includes/Exception.php',
'RecentChange' => 'includes/RecentChange.php',
+ 'RedirectSpecialArticle' => 'includes/SpecialPage.php',
'RedirectSpecialPage' => 'includes/SpecialPage.php',
'RegexlikeReplacer' => 'includes/StringUtils.php',
'ReplacementArray' => 'includes/StringUtils.php',
@@ -219,6 +221,7 @@ $wgAutoloadLocalClasses = array(
'Sanitizer' => 'includes/Sanitizer.php',
'DataUpdate' => 'includes/DataUpdate.php',
'SqlDataUpdate' => 'includes/SqlDataUpdate.php',
+ 'ScopedCallback' => 'includes/ScopedCallback.php',
'ScopedPHPTimeout' => 'includes/ScopedPHPTimeout.php',
'SiteConfiguration' => 'includes/SiteConfiguration.php',
'SiteStats' => 'includes/SiteStats.php',
@@ -247,10 +250,12 @@ $wgAutoloadLocalClasses = array(
'StubUserLang' => 'includes/StubObject.php',
'TablePager' => 'includes/Pager.php',
'MWTimestamp' => 'includes/Timestamp.php',
+ 'TimestampException' => 'includes/Timestamp.php',
'Title' => 'includes/Title.php',
'TitleArray' => 'includes/TitleArray.php',
'TitleArrayFromResult' => 'includes/TitleArray.php',
'ThrottledError' => 'includes/Exception.php',
+ 'UIDGenerator' => 'includes/UIDGenerator.php',
'UnlistedSpecialPage' => 'includes/SpecialPage.php',
'UploadSourceAdapter' => 'includes/Import.php',
'UppercaseCollation' => 'includes/Collation.php',
@@ -272,9 +277,9 @@ $wgAutoloadLocalClasses = array(
'WikiError' => 'includes/WikiError.php',
'WikiErrorMsg' => 'includes/WikiError.php',
'WikiExporter' => 'includes/Export.php',
- 'WikiFilePage' => 'includes/WikiFilePage.php',
+ 'WikiFilePage' => 'includes/WikiFilePage.php',
'WikiImporter' => 'includes/Import.php',
- 'WikiPage' => 'includes/WikiPage.php',
+ 'WikiPage' => 'includes/WikiPage.php',
'WikiRevision' => 'includes/Import.php',
'WikiMap' => 'includes/WikiMap.php',
'WikiReference' => 'includes/WikiMap.php',
@@ -289,6 +294,21 @@ $wgAutoloadLocalClasses = array(
'ZipDirectoryReader' => 'includes/ZipDirectoryReader.php',
'ZipDirectoryReaderError' => 'includes/ZipDirectoryReader.php',
+ # content handler
+ 'AbstractContent' => 'includes/content/AbstractContent.php',
+ 'ContentHandler' => 'includes/content/ContentHandler.php',
+ 'Content' => 'includes/content/Content.php',
+ 'CssContentHandler' => 'includes/content/CssContentHandler.php',
+ 'CssContent' => 'includes/content/CssContent.php',
+ 'JavaScriptContentHandler' => 'includes/content/JavaScriptContentHandler.php',
+ 'JavaScriptContent' => 'includes/content/JavaScriptContent.php',
+ 'MessageContent' => 'includes/content/MessageContent.php',
+ 'MWContentSerializationException' => 'includes/content/ContentHandler.php',
+ 'TextContentHandler' => 'includes/content/TextContentHandler.php',
+ 'TextContent' => 'includes/content/TextContent.php',
+ 'WikitextContentHandler' => 'includes/content/WikitextContentHandler.php',
+ 'WikitextContent' => 'includes/content/WikitextContent.php',
+
# includes/actions
'CachedAction' => 'includes/actions/CachedAction.php',
'CreditsAction' => 'includes/actions/CreditsAction.php',
@@ -318,6 +338,7 @@ $wgAutoloadLocalClasses = array(
'ApiBase' => 'includes/api/ApiBase.php',
'ApiBlock' => 'includes/api/ApiBlock.php',
'ApiComparePages' => 'includes/api/ApiComparePages.php',
+ 'ApiCreateAccount' => 'includes/api/ApiCreateAccount.php',
'ApiDelete' => 'includes/api/ApiDelete.php',
'ApiDisabled' => 'includes/api/ApiDisabled.php',
'ApiEditPage' => 'includes/api/ApiEditPage.php',
@@ -331,6 +352,7 @@ $wgAutoloadLocalClasses = array(
'ApiFormatDump' => 'includes/api/ApiFormatDump.php',
'ApiFormatFeedWrapper' => 'includes/api/ApiFormatBase.php',
'ApiFormatJson' => 'includes/api/ApiFormatJson.php',
+ 'ApiFormatNone' => 'includes/api/ApiFormatNone.php',
'ApiFormatPhp' => 'includes/api/ApiFormatPhp.php',
'ApiFormatRaw' => 'includes/api/ApiFormatRaw.php',
'ApiFormatTxt' => 'includes/api/ApiFormatTxt.php',
@@ -339,11 +361,13 @@ $wgAutoloadLocalClasses = array(
'ApiFormatXmlRsd' => 'includes/api/ApiRsd.php',
'ApiFormatYaml' => 'includes/api/ApiFormatYaml.php',
'ApiHelp' => 'includes/api/ApiHelp.php',
+ 'ApiImageRotate' => 'includes/api/ApiImageRotate.php',
'ApiImport' => 'includes/api/ApiImport.php',
'ApiImportReporter' => 'includes/api/ApiImport.php',
'ApiLogin' => 'includes/api/ApiLogin.php',
'ApiLogout' => 'includes/api/ApiLogout.php',
'ApiMain' => 'includes/api/ApiMain.php',
+ 'ApiModuleManager' => 'includes/api/ApiModuleManager.php',
'ApiMove' => 'includes/api/ApiMove.php',
'ApiOpenSearch' => 'includes/api/ApiOpenSearch.php',
'ApiOptions' => 'includes/api/ApiOptions.php',
@@ -383,7 +407,10 @@ $wgAutoloadLocalClasses = array(
'ApiQueryLangLinks' => 'includes/api/ApiQueryLangLinks.php',
'ApiQueryLinks' => 'includes/api/ApiQueryLinks.php',
'ApiQueryLogEvents' => 'includes/api/ApiQueryLogEvents.php',
+ 'ApiQueryORM' => 'includes/api/ApiQueryORM.php',
'ApiQueryPageProps' => 'includes/api/ApiQueryPageProps.php',
+ 'ApiQueryPagesWithProp' => 'includes/api/ApiQueryPagesWithProp.php',
+ 'ApiQueryPagePropNames' => 'includes/api/ApiQueryPagePropNames.php',
'ApiQueryProtectedTitles' => 'includes/api/ApiQueryProtectedTitles.php',
'ApiQueryQueryPage' => 'includes/api/ApiQueryQueryPage.php',
'ApiQueryRandom' => 'includes/api/ApiQueryRandom.php',
@@ -410,6 +437,7 @@ $wgAutoloadLocalClasses = array(
'UsageException' => 'includes/api/ApiMain.php',
# includes/cache
+ 'BacklinkCache' => 'includes/cache/BacklinkCache.php',
'CacheDependency' => 'includes/cache/CacheDependency.php',
'ConstantDependency' => 'includes/cache/CacheDependency.php',
'DependencyWrapper' => 'includes/cache/CacheDependency.php',
@@ -418,7 +446,6 @@ $wgAutoloadLocalClasses = array(
'GenderCache' => 'includes/cache/GenderCache.php',
'GlobalDependency' => 'includes/cache/CacheDependency.php',
'HTMLCacheUpdate' => 'includes/cache/HTMLCacheUpdate.php',
- 'HTMLCacheUpdateJob' => 'includes/cache/HTMLCacheUpdate.php',
'HTMLFileCache' => 'includes/cache/HTMLFileCache.php',
'LinkBatch' => 'includes/cache/LinkBatch.php',
'LinkCache' => 'includes/cache/LinkCache.php',
@@ -430,6 +457,10 @@ $wgAutoloadLocalClasses = array(
'TitleDependency' => 'includes/cache/CacheDependency.php',
'TitleListDependency' => 'includes/cache/CacheDependency.php',
+ # includes/clientpool
+ 'RedisConnectionPool' => 'includes/clientpool/RedisConnectionPool.php',
+ 'RedisConnRef' => 'includes/clientpool/RedisConnectionPool.php',
+
# includes/context
'ContextSource' => 'includes/context/ContextSource.php',
'DerivativeContext' => 'includes/context/DerivativeContext.php',
@@ -438,14 +469,13 @@ $wgAutoloadLocalClasses = array(
# includes/dao
'IDBAccessObject' => 'includes/dao/IDBAccessObject.php',
+ 'DBAccessBase' => 'includes/dao/DBAccessBase.php',
# includes/db
'Blob' => 'includes/db/DatabaseUtility.php',
'ChronologyProtector' => 'includes/db/LBFactory.php',
'CloneDatabase' => 'includes/db/CloneDatabase.php',
- 'Database' => 'includes/db/DatabaseMysql.php',
'DatabaseBase' => 'includes/db/Database.php',
- 'DatabaseIbm_db2' => 'includes/db/DatabaseIbm_db2.php',
'DatabaseMssql' => 'includes/db/DatabaseMssql.php',
'DatabaseMysql' => 'includes/db/DatabaseMysql.php',
'DatabaseOracle' => 'includes/db/DatabaseOracle.php',
@@ -464,10 +494,6 @@ $wgAutoloadLocalClasses = array(
'DBUnexpectedError' => 'includes/db/DatabaseError.php',
'FakeResultWrapper' => 'includes/db/DatabaseUtility.php',
'Field' => 'includes/db/DatabaseUtility.php',
- 'IBM_DB2Blob' => 'includes/db/DatabaseIbm_db2.php',
- 'IBM_DB2Field' => 'includes/db/DatabaseIbm_db2.php',
- 'IBM_DB2Helper' => 'includes/db/DatabaseIbm_db2.php',
- 'IBM_DB2Result' => 'includes/db/DatabaseIbm_db2.php',
'LBFactory' => 'includes/db/LBFactory.php',
'LBFactory_Fake' => 'includes/db/LBFactory.php',
'LBFactory_Multi' => 'includes/db/LBFactory_Multi.php',
@@ -548,13 +574,14 @@ $wgAutoloadLocalClasses = array(
'NullFileJournal' => 'includes/filebackend/filejournal/FileJournal.php',
'LockManagerGroup' => 'includes/filebackend/lockmanager/LockManagerGroup.php',
'LockManager' => 'includes/filebackend/lockmanager/LockManager.php',
- 'ScopedLock' => 'includes/filebackend/lockmanager/LockManager.php',
+ 'ScopedLock' => 'includes/filebackend/lockmanager/ScopedLock.php',
'FSLockManager' => 'includes/filebackend/lockmanager/FSLockManager.php',
'DBLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
'LSLockManager' => 'includes/filebackend/lockmanager/LSLockManager.php',
'MemcLockManager' => 'includes/filebackend/lockmanager/MemcLockManager.php',
- 'QuorumLockManager' => 'includes/filebackend/lockmanager/LockManager.php',
- 'MySqlLockManager'=> 'includes/filebackend/lockmanager/DBLockManager.php',
+ 'QuorumLockManager' => 'includes/filebackend/lockmanager/QuorumLockManager.php',
+ 'MySqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
+ 'PostgreSqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
'NullLockManager' => 'includes/filebackend/lockmanager/LockManager.php',
'FileOp' => 'includes/filebackend/FileOp.php',
'FileOpBatch' => 'includes/filebackend/FileOpBatch.php',
@@ -562,8 +589,8 @@ $wgAutoloadLocalClasses = array(
'CopyFileOp' => 'includes/filebackend/FileOp.php',
'MoveFileOp' => 'includes/filebackend/FileOp.php',
'DeleteFileOp' => 'includes/filebackend/FileOp.php',
- 'ConcatenateFileOp' => 'includes/filebackend/FileOp.php',
'CreateFileOp' => 'includes/filebackend/FileOp.php',
+ 'DescribeFileOp' => 'includes/filebackend/FileOp.php',
'NullFileOp' => 'includes/filebackend/FileOp.php',
# includes/filerepo
@@ -594,11 +621,8 @@ $wgAutoloadLocalClasses = array(
'CliInstaller' => 'includes/installer/CliInstaller.php',
'DatabaseInstaller' => 'includes/installer/DatabaseInstaller.php',
'DatabaseUpdater' => 'includes/installer/DatabaseUpdater.php',
- 'Ibm_db2Installer' => 'includes/installer/Ibm_db2Installer.php',
- 'Ibm_db2Updater' => 'includes/installer/Ibm_db2Updater.php',
'InstallDocFormatter' => 'includes/installer/InstallDocFormatter.php',
'Installer' => 'includes/installer/Installer.php',
- 'LBFactory_InstallerFake' => 'includes/installer/Installer.php',
'LocalSettingsGenerator' => 'includes/installer/LocalSettingsGenerator.php',
'MysqlInstaller' => 'includes/installer/MysqlInstaller.php',
'MysqlUpdater' => 'includes/installer/MysqlUpdater.php',
@@ -631,13 +655,26 @@ $wgAutoloadLocalClasses = array(
'WebInstallerPage' => 'includes/installer/WebInstallerPage.php',
# includes/job
- 'DoubleRedirectJob' => 'includes/job/DoubleRedirectJob.php',
- 'EmaillingJob' => 'includes/job/EmaillingJob.php',
- 'EnotifNotifyJob' => 'includes/job/EnotifNotifyJob.php',
'Job' => 'includes/job/Job.php',
- 'RefreshLinksJob' => 'includes/job/RefreshLinksJob.php',
- 'RefreshLinksJob2' => 'includes/job/RefreshLinksJob.php',
- 'UploadFromUrlJob' => 'includes/job/UploadFromUrlJob.php',
+ 'JobQueue' => 'includes/job/JobQueue.php',
+ 'JobQueueAggregator' => 'includes/job/JobQueueAggregator.php',
+ 'JobQueueAggregatorMemc' => 'includes/job/JobQueueAggregatorMemc.php',
+ 'JobQueueAggregatorRedis' => 'includes/job/JobQueueAggregatorRedis.php',
+ 'JobQueueDB' => 'includes/job/JobQueueDB.php',
+ 'JobQueueGroup' => 'includes/job/JobQueueGroup.php',
+
+ # includes/job/jobs
+ 'DoubleRedirectJob' => 'includes/job/jobs/DoubleRedirectJob.php',
+ 'DuplicateJob' => 'includes/job/jobs/DuplicateJob.php',
+ 'EmaillingJob' => 'includes/job/jobs/EmaillingJob.php',
+ 'EnotifNotifyJob' => 'includes/job/jobs/EnotifNotifyJob.php',
+ 'HTMLCacheUpdateJob' => 'includes/job/jobs/HTMLCacheUpdateJob.php',
+ 'NullJob' => 'includes/job/jobs/NullJob.php',
+ 'RefreshLinksJob' => 'includes/job/jobs/RefreshLinksJob.php',
+ 'RefreshLinksJob2' => 'includes/job/jobs/RefreshLinksJob.php',
+ 'UploadFromUrlJob' => 'includes/job/jobs/UploadFromUrlJob.php',
+ 'AssembleUploadChunksJob' => 'includes/job/jobs/AssembleUploadChunksJob.php',
+ 'PublishStashedFileJob' => 'includes/job/jobs/PublishStashedFileJob.php',
# includes/json
'FormatJson' => 'includes/json/FormatJson.php',
@@ -676,6 +713,7 @@ $wgAutoloadLocalClasses = array(
'PatrolLog' => 'includes/logging/PatrolLog.php',
'PatrolLogFormatter' => 'includes/logging/LogFormatter.php',
'RCDatabaseLogEntry' => 'includes/logging/LogEntry.php',
+ 'RightsLogFormatter' => 'includes/logging/LogFormatter.php',
# includes/media
'BitmapHandler' => 'includes/media/Bitmap.php',
@@ -747,35 +785,24 @@ $wgAutoloadLocalClasses = array(
'MWTidyWrapper' => 'includes/parser/Tidy.php',
'PPCustomFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
'PPCustomFrame_Hash' => 'includes/parser/Preprocessor_Hash.php',
- 'PPCustomFrame_HipHop' => 'includes/parser/Preprocessor_HipHop.hphp',
'PPDAccum_Hash' => 'includes/parser/Preprocessor_Hash.php',
- 'PPDAccum_HipHop' => 'includes/parser/Preprocessor_HipHop.hphp',
'PPDPart' => 'includes/parser/Preprocessor_DOM.php',
'PPDPart_Hash' => 'includes/parser/Preprocessor_Hash.php',
- 'PPDPart_HipHop' => 'includes/parser/Preprocessor_HipHop.hphp',
'PPDStack' => 'includes/parser/Preprocessor_DOM.php',
'PPDStackElement' => 'includes/parser/Preprocessor_DOM.php',
'PPDStackElement_Hash' => 'includes/parser/Preprocessor_Hash.php',
- 'PPDStackElement_HipHop' => 'includes/parser/Preprocessor_HipHop.hphp',
'PPDStack_Hash' => 'includes/parser/Preprocessor_Hash.php',
- 'PPDStack_HipHop' => 'includes/parser/Preprocessor_HipHop.hphp',
'PPFrame' => 'includes/parser/Preprocessor.php',
'PPFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
'PPFrame_Hash' => 'includes/parser/Preprocessor_Hash.php',
- 'PPFrame_HipHop' => 'includes/parser/Preprocessor_HipHop.hphp',
'PPNode' => 'includes/parser/Preprocessor.php',
'PPNode_DOM' => 'includes/parser/Preprocessor_DOM.php',
'PPNode_Hash_Array' => 'includes/parser/Preprocessor_Hash.php',
'PPNode_Hash_Attr' => 'includes/parser/Preprocessor_Hash.php',
'PPNode_Hash_Text' => 'includes/parser/Preprocessor_Hash.php',
'PPNode_Hash_Tree' => 'includes/parser/Preprocessor_Hash.php',
- 'PPNode_HipHop_Array' => 'includes/parser/Preprocessor_HipHop.hphp',
- 'PPNode_HipHop_Attr' => 'includes/parser/Preprocessor_HipHop.hphp',
- 'PPNode_HipHop_Text' => 'includes/parser/Preprocessor_HipHop.hphp',
- 'PPNode_HipHop_Tree' => 'includes/parser/Preprocessor_HipHop.hphp',
'PPTemplateFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
'PPTemplateFrame_Hash' => 'includes/parser/Preprocessor_Hash.php',
- 'PPTemplateFrame_HipHop' => 'includes/parser/Preprocessor_HipHop.hphp',
'Parser' => 'includes/parser/Parser.php',
'ParserCache' => 'includes/parser/ParserCache.php',
'ParserOptions' => 'includes/parser/ParserOptions.php',
@@ -785,7 +812,6 @@ $wgAutoloadLocalClasses = array(
'Preprocessor' => 'includes/parser/Preprocessor.php',
'Preprocessor_DOM' => 'includes/parser/Preprocessor_DOM.php',
'Preprocessor_Hash' => 'includes/parser/Preprocessor_Hash.php',
- 'Preprocessor_HipHop' => 'includes/parser/Preprocessor_HipHop.hphp',
'StripState' => 'includes/parser/StripState.php',
# includes/profiler
@@ -827,7 +853,6 @@ $wgAutoloadLocalClasses = array(
'RevDel_LogList' => 'includes/revisiondelete/RevisionDelete.php',
'RevDel_RevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
'RevDel_RevisionList' => 'includes/revisiondelete/RevisionDelete.php',
- 'RevisionDelete' => 'includes/revisiondelete/RevisionDelete.php',
'RevisionDeleter' => 'includes/revisiondelete/RevisionDeleter.php',
'RevisionDeleteUser' => 'includes/revisiondelete/RevisionDeleteUser.php',
@@ -839,7 +864,6 @@ $wgAutoloadLocalClasses = array(
'SearchEngine' => 'includes/search/SearchEngine.php',
'SearchEngineDummy' => 'includes/search/SearchEngine.php',
'SearchHighlighter' => 'includes/search/SearchEngine.php',
- 'SearchIBM_DB2' => 'includes/search/SearchIBM_DB2.php',
'SearchMssql' => 'includes/search/SearchMssql.php',
'SearchMySQL' => 'includes/search/SearchMySQL.php',
'SearchNearMatchResultSet' => 'includes/search/SearchEngine.php',
@@ -854,6 +878,16 @@ $wgAutoloadLocalClasses = array(
'SqliteSearchResultSet' => 'includes/search/SearchSqlite.php',
'SqlSearchResultSet' => 'includes/search/SearchEngine.php',
+ # includes/site
+ 'MediaWikiSite' => 'includes/site/MediaWikiSite.php',
+ 'Site' => 'includes/site/Site.php',
+ 'SiteObject' => 'includes/site/Site.php',
+ 'SiteArray' => 'includes/site/SiteList.php',
+ 'SiteList' => 'includes/site/SiteList.php',
+ 'SiteSQLStore' => 'includes/site/SiteSQLStore.php',
+ 'Sites' => 'includes/site/SiteSQLStore.php',
+ 'SiteStore' => 'includes/site/SiteStore.php',
+
# includes/specials
'ActiveUsersPager' => 'includes/specials/SpecialActiveusers.php',
'AllmessagesTablePager' => 'includes/specials/SpecialAllmessages.php',
@@ -862,8 +896,6 @@ $wgAutoloadLocalClasses = array(
'BrokenRedirectsPage' => 'includes/specials/SpecialBrokenRedirects.php',
'CategoryPager' => 'includes/specials/SpecialCategories.php',
'ContribsPager' => 'includes/specials/SpecialContributions.php',
- 'DBLockForm' => 'includes/specials/SpecialLockdb.php',
- 'DBUnlockForm' => 'includes/specials/SpecialUnlockdb.php',
'DeadendPagesPage' => 'includes/specials/SpecialDeadendpages.php',
'DeletedContribsPager' => 'includes/specials/SpecialDeletedContributions.php',
'DeletedContributionsPage' => 'includes/specials/SpecialDeletedContributions.php',
@@ -928,10 +960,10 @@ $wgAutoloadLocalClasses = array(
'SpecialLockdb' => 'includes/specials/SpecialLockdb.php',
'SpecialLog' => 'includes/specials/SpecialLog.php',
'SpecialMergeHistory' => 'includes/specials/SpecialMergeHistory.php',
- 'SpecialMostlinkedtemplates' => 'includes/specials/SpecialMostlinkedtemplates.php',
'SpecialNewFiles' => 'includes/specials/SpecialNewimages.php',
'SpecialNewpages' => 'includes/specials/SpecialNewpages.php',
'SpecialPasswordReset' => 'includes/specials/SpecialPasswordReset.php',
+ 'SpecialPagesWithProp' => 'includes/specials/SpecialPagesWithProp.php',
'SpecialPermanentLink' => 'includes/SpecialPage.php',
'SpecialPreferences' => 'includes/specials/SpecialPreferences.php',
'SpecialPrefixindex' => 'includes/specials/SpecialPrefixindex.php',
@@ -989,7 +1021,6 @@ $wgAutoloadLocalClasses = array(
'UploadFromUrl' => 'includes/upload/UploadFromUrl.php',
'UploadStash' => 'includes/upload/UploadStash.php',
'UploadStashBadPathException' => 'includes/upload/UploadStash.php',
- 'UploadStashBadVersionException' => 'includes/upload/UploadStash.php',
'UploadStashFile' => 'includes/upload/UploadStash.php',
'UploadStashFileException' => 'includes/upload/UploadStash.php',
'UploadStashFileNotFoundException' => 'includes/upload/UploadStash.php',
@@ -1004,20 +1035,29 @@ $wgAutoloadLocalClasses = array(
'FakeConverter' => 'languages/Language.php',
'Language' => 'languages/Language.php',
'LanguageConverter' => 'languages/LanguageConverter.php',
+ 'CLDRPluralRuleConverter' => 'languages/utils/CLDRPluralRuleEvaluator.php',
+ 'CLDRPluralRuleConverter_Expression' => 'languages/utils/CLDRPluralRuleEvaluator.php',
+ 'CLDRPluralRuleConverter_Fragment' => 'languages/utils/CLDRPluralRuleEvaluator.php',
+ 'CLDRPluralRuleConverter_Operator' => 'languages/utils/CLDRPluralRuleEvaluator.php',
'CLDRPluralRuleEvaluator' => 'languages/utils/CLDRPluralRuleEvaluator.php',
+ 'CLDRPluralRuleEvaluator_Range' => 'languages/utils/CLDRPluralRuleEvaluator.php',
'CLDRPluralRuleError' => 'languages/utils/CLDRPluralRuleEvaluator.php',
# maintenance
+ 'BackupDumper' => 'maintenance/backup.inc',
'ConvertLinks' => 'maintenance/convertLinks.php',
'DeleteArchivedFilesImplementation' => 'maintenance/deleteArchivedFiles.inc',
'DeleteArchivedRevisionsImplementation' => 'maintenance/deleteArchivedRevisions.inc',
'DeleteDefaultMessages' => 'maintenance/deleteDefaultMessages.php',
+ 'DumpDBZip2Output' => 'maintenance/backup.inc',
+ 'ExportProgressFilter' => 'maintenance/backup.inc',
'FakeMaintenance' => 'maintenance/Maintenance.php',
+ 'FixExtLinksProtocolRelative' => 'maintenance/fixExtLinksProtocolRelative.php',
'LoggedUpdateMaintenance' => 'maintenance/Maintenance.php',
'Maintenance' => 'maintenance/Maintenance.php',
- 'FixExtLinksProtocolRelative' => 'maintenance/fixExtLinksProtocolRelative.php',
'PopulateCategory' => 'maintenance/populateCategory.php',
'PopulateImageSha1' => 'maintenance/populateImageSha1.php',
+ 'PopulateFilearchiveSha1' => 'maintenance/populateFilearchiveSha1.php',
'PopulateLogSearch' => 'maintenance/populateLogSearch.php',
'PopulateLogUsertext' => 'maintenance/populateLogUsertext.php',
'PopulateParentId' => 'maintenance/populateParentId.php',
@@ -1040,40 +1080,13 @@ $wgAutoloadLocalClasses = array(
'wikiStatsOutput' => 'maintenance/language/StatOutputs.php',
# maintenance/term
- 'AnsiTermColorer' => 'maintenance/term/MWTerm.php',
+ 'AnsiTermColorer' => 'maintenance/term/MWTerm.php',
'DummyTermColorer' => 'maintenance/term/MWTerm.php',
# mw-config
'InstallerOverrides' => 'mw-config/overrides.php',
'MyLocalSettingsGenerator' => 'mw-config/overrides.php',
- # tests
- 'DbTestPreviewer' => 'tests/testHelpers.inc',
- 'DbTestRecorder' => 'tests/testHelpers.inc',
- 'DelayedParserTest' => 'tests/testHelpers.inc',
- 'TestFileIterator' => 'tests/testHelpers.inc',
- 'TestRecorder' => 'tests/testHelpers.inc',
-
- # tests/phpunit/includes
- 'GenericArrayObjectTest' => 'tests/phpunit/includes/libs/GenericArrayObjectTest.php',
-
- # tests/phpunit/includes/db
- 'ORMRowTest' => 'tests/phpunit/includes/db/ORMRowTest.php',
-
- # tests/parser
- 'ParserTest' => 'tests/parser/parserTest.inc',
- 'ParserTestParserHook' => 'tests/parser/parserTestsParserHook.php',
-
- # tests/selenium
- 'Selenium' => 'tests/selenium/Selenium.php',
- 'SeleniumLoader' => 'tests/selenium/SeleniumLoader.php',
- 'SeleniumTestCase' => 'tests/selenium/SeleniumTestCase.php',
- 'SeleniumTestConsoleLogger' => 'tests/selenium/SeleniumTestConsoleLogger.php',
- 'SeleniumTestHTMLLogger' => 'tests/selenium/SeleniumTestHTMLLogger.php',
- 'SeleniumTestListener' => 'tests/selenium/SeleniumTestListener.php',
- 'SeleniumTestSuite' => 'tests/selenium/SeleniumTestSuite.php',
- 'SeleniumConfig' => 'tests/selenium/SeleniumConfig.php',
-
# skins
'CologneBlueTemplate' => 'skins/CologneBlue.php',
'ModernTemplate' => 'skins/Modern.php',
@@ -1096,7 +1109,7 @@ class AutoLoader {
/**
* autoload - take a class name and attempt to load it
*
- * @param $className String: name of class we're looking for.
+ * @param string $className name of class we're looking for.
* @return bool Returning false is important on failure as
* it allows Zend to try and look in other registered autoloaders
* as well.
diff --git a/includes/Autopromote.php b/includes/Autopromote.php
index 9c77855d..604b9248 100644
--- a/includes/Autopromote.php
+++ b/includes/Autopromote.php
@@ -54,7 +54,7 @@ class Autopromote {
* Does not return groups the user already belongs to or has once belonged.
*
* @param $user User The user to get the groups for
- * @param $event String key in $wgAutopromoteOnce (each one has groups/criteria)
+ * @param string $event key in $wgAutopromoteOnce (each one has groups/criteria)
*
* @return array Groups the user should be promoted to.
*
@@ -140,8 +140,8 @@ class Autopromote {
return true;
}
}
- # If we got here, the array presumably does not contain other condi-
- # tions; it's not recursive. Pass it off to self::checkCondition.
+ // If we got here, the array presumably does not contain other conditions;
+ // it's not recursive. Pass it off to self::checkCondition.
if ( !is_array( $cond ) ) {
$cond = array( $cond );
}
@@ -152,11 +152,11 @@ class Autopromote {
/**
* As recCheckCondition, but *not* recursive. The only valid conditions
* are those whose first element is APCOND_EMAILCONFIRMED/APCOND_EDITCOUNT/
- * APCOND_AGE. Other types will throw an exception if no extension evalu-
- * ates them.
+ * APCOND_AGE. Other types will throw an exception if no extension evaluates them.
*
- * @param $cond Array: A condition, which must not contain other conditions
+ * @param array $cond A condition, which must not contain other conditions
* @param $user User The user to check the condition against
+ * @throws MWException
* @return bool Whether the condition is true for the user
*/
private static function checkCondition( $cond, User $user ) {
diff --git a/includes/BacklinkCache.php b/includes/BacklinkCache.php
deleted file mode 100644
index 05bf3186..00000000
--- a/includes/BacklinkCache.php
+++ /dev/null
@@ -1,419 +0,0 @@
-<?php
-/**
- * Class for fetching backlink lists, approximate backlink counts and
- * partitions.
- *
- * 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 Tim Starling
- * @copyright © 2009, Tim Starling, Domas Mituzas
- * @copyright © 2010, Max Sem
- * @copyright © 2011, Antoine Musso
- */
-
-/**
- * Class for fetching backlink lists, approximate backlink counts and
- * partitions. This is a shared cache.
- *
- * Instances of this class should typically be fetched with the method
- * $title->getBacklinkCache().
- *
- * Ideally you should only get your backlinks from here when you think
- * there is some advantage in caching them. Otherwise it's just a waste
- * of memory.
- *
- * Introduced by r47317
- *
- * @internal documentation reviewed on 18 Mar 2011 by hashar
- */
-class BacklinkCache {
- /** @var ProcessCacheLRU */
- protected static $cache;
-
- /**
- * Multi dimensions array representing batches. Keys are:
- * > (string) links table name
- * > 'numRows' : Number of rows for this link table
- * > 'batches' : array( $start, $end )
- *
- * @see BacklinkCache::partitionResult()
- *
- * Cleared with BacklinkCache::clear()
- */
- protected $partitionCache = array();
-
- /**
- * Contains the whole links from a database result.
- * This is raw data that will be partitioned in $partitionCache
- *
- * Initialized with BacklinkCache::getLinks()
- * Cleared with BacklinkCache::clear()
- */
- protected $fullResultCache = array();
-
- /**
- * Local copy of a database object.
- *
- * Accessor: BacklinkCache::getDB()
- * Mutator : BacklinkCache::setDB()
- * Cleared with BacklinkCache::clear()
- */
- protected $db;
-
- /**
- * Local copy of a Title object
- */
- protected $title;
-
- const CACHE_EXPIRY = 3600;
-
- /**
- * Create a new BacklinkCache
- *
- * @param Title $title : Title object to create a backlink cache for
- */
- public function __construct( Title $title ) {
- $this->title = $title;
- }
-
- /**
- * Create a new BacklinkCache or reuse any existing one.
- * Currently, only one cache instance can exist; callers that
- * need multiple backlink cache objects should keep them in scope.
- *
- * @param Title $title : Title object to get a backlink cache for
- * @return BacklinkCache
- */
- public static function get( Title $title ) {
- if ( !self::$cache ) { // init cache
- self::$cache = new ProcessCacheLRU( 1 );
- }
- $dbKey = $title->getPrefixedDBkey();
- if ( !self::$cache->has( $dbKey, 'obj' ) ) {
- self::$cache->set( $dbKey, 'obj', new self( $title ) );
- }
- return self::$cache->get( $dbKey, 'obj' );
- }
-
- /**
- * Serialization handler, diasallows to serialize the database to prevent
- * failures after this class is deserialized from cache with dead DB
- * connection.
- *
- * @return array
- */
- function __sleep() {
- return array( 'partitionCache', 'fullResultCache', 'title' );
- }
-
- /**
- * Clear locally stored data and database object.
- */
- public function clear() {
- $this->partitionCache = array();
- $this->fullResultCache = array();
- unset( $this->db );
- }
-
- /**
- * Set the Database object to use
- *
- * @param $db DatabaseBase
- */
- public function setDB( $db ) {
- $this->db = $db;
- }
-
- /**
- * Get the slave connection to the database
- * When non existing, will initialize the connection.
- * @return DatabaseBase object
- */
- protected function getDB() {
- if ( !isset( $this->db ) ) {
- $this->db = wfGetDB( DB_SLAVE );
- }
-
- return $this->db;
- }
-
- /**
- * Get the backlinks for a given table. Cached in process memory only.
- * @param $table String
- * @param $startId Integer or false
- * @param $endId Integer or false
- * @return TitleArrayFromResult
- */
- public function getLinks( $table, $startId = false, $endId = false ) {
- wfProfileIn( __METHOD__ );
-
- $fromField = $this->getPrefix( $table ) . '_from';
-
- if ( $startId || $endId ) {
- // Partial range, not cached
- wfDebug( __METHOD__ . ": from DB (uncacheable range)\n" );
- $conds = $this->getConditions( $table );
-
- // Use the from field in the condition rather than the joined page_id,
- // because databases are stupid and don't necessarily propagate indexes.
- if ( $startId ) {
- $conds[] = "$fromField >= " . intval( $startId );
- }
-
- if ( $endId ) {
- $conds[] = "$fromField <= " . intval( $endId );
- }
-
- $res = $this->getDB()->select(
- array( $table, 'page' ),
- array( 'page_namespace', 'page_title', 'page_id' ),
- $conds,
- __METHOD__,
- array(
- 'STRAIGHT_JOIN',
- 'ORDER BY' => $fromField
- ) );
- $ta = TitleArray::newFromResult( $res );
-
- wfProfileOut( __METHOD__ );
- return $ta;
- }
-
- // @todo FIXME: Make this a function?
- if ( !isset( $this->fullResultCache[$table] ) ) {
- wfDebug( __METHOD__ . ": from DB\n" );
- $res = $this->getDB()->select(
- array( $table, 'page' ),
- array( 'page_namespace', 'page_title', 'page_id' ),
- $this->getConditions( $table ),
- __METHOD__,
- array(
- 'STRAIGHT_JOIN',
- 'ORDER BY' => $fromField,
- ) );
- $this->fullResultCache[$table] = $res;
- }
-
- $ta = TitleArray::newFromResult( $this->fullResultCache[$table] );
-
- wfProfileOut( __METHOD__ );
- return $ta;
- }
-
- /**
- * Get the field name prefix for a given table
- * @param $table String
- * @return null|string
- */
- protected function getPrefix( $table ) {
- static $prefixes = array(
- 'pagelinks' => 'pl',
- 'imagelinks' => 'il',
- 'categorylinks' => 'cl',
- 'templatelinks' => 'tl',
- 'redirect' => 'rd',
- );
-
- if ( isset( $prefixes[$table] ) ) {
- return $prefixes[$table];
- } else {
- $prefix = null;
- wfRunHooks( 'BacklinkCacheGetPrefix', array( $table, &$prefix ) );
- if( $prefix ) {
- return $prefix;
- } else {
- throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
- }
- }
- }
-
- /**
- * Get the SQL condition array for selecting backlinks, with a join
- * on the page table.
- * @param $table String
- * @return array|null
- */
- protected function getConditions( $table ) {
- $prefix = $this->getPrefix( $table );
-
- // @todo FIXME: imagelinks and categorylinks do not rely on getNamespace,
- // they could be moved up for nicer case statements
- switch ( $table ) {
- case 'pagelinks':
- case 'templatelinks':
- $conds = array(
- "{$prefix}_namespace" => $this->title->getNamespace(),
- "{$prefix}_title" => $this->title->getDBkey(),
- "page_id={$prefix}_from"
- );
- break;
- case 'redirect':
- $conds = array(
- "{$prefix}_namespace" => $this->title->getNamespace(),
- "{$prefix}_title" => $this->title->getDBkey(),
- $this->getDb()->makeList( array(
- "{$prefix}_interwiki = ''",
- "{$prefix}_interwiki is null",
- ), LIST_OR ),
- "page_id={$prefix}_from"
- );
- break;
- case 'imagelinks':
- $conds = array(
- 'il_to' => $this->title->getDBkey(),
- 'page_id=il_from'
- );
- break;
- case 'categorylinks':
- $conds = array(
- 'cl_to' => $this->title->getDBkey(),
- 'page_id=cl_from',
- );
- break;
- default:
- $conds = null;
- wfRunHooks( 'BacklinkCacheGetConditions', array( $table, $this->title, &$conds ) );
- if( !$conds )
- throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
- }
-
- return $conds;
- }
-
- /**
- * Get the approximate number of backlinks
- * @param $table String
- * @return integer
- */
- public function getNumLinks( $table ) {
- if ( isset( $this->fullResultCache[$table] ) ) {
- return $this->fullResultCache[$table]->numRows();
- }
-
- if ( isset( $this->partitionCache[$table] ) ) {
- $entry = reset( $this->partitionCache[$table] );
- return $entry['numRows'];
- }
-
- $titleArray = $this->getLinks( $table );
-
- return $titleArray->count();
- }
-
- /**
- * Partition the backlinks into batches.
- * Returns an array giving the start and end of each range. The first
- * batch has a start of false, and the last batch has an end of false.
- *
- * @param $table String: the links table name
- * @param $batchSize Integer
- * @return Array
- */
- public function partition( $table, $batchSize ) {
-
- // 1) try partition cache ...
-
- if ( isset( $this->partitionCache[$table][$batchSize] ) ) {
- wfDebug( __METHOD__ . ": got from partition cache\n" );
- return $this->partitionCache[$table][$batchSize]['batches'];
- }
-
- $this->partitionCache[$table][$batchSize] = false;
- $cacheEntry =& $this->partitionCache[$table][$batchSize];
-
- // 2) ... then try full result cache ...
-
- if ( isset( $this->fullResultCache[$table] ) ) {
- $cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
- wfDebug( __METHOD__ . ": got from full result cache\n" );
-
- return $cacheEntry['batches'];
- }
-
- // 3) ... fallback to memcached ...
-
- global $wgMemc;
-
- $memcKey = wfMemcKey(
- 'backlinks',
- md5( $this->title->getPrefixedDBkey() ),
- $table,
- $batchSize
- );
-
- $memcValue = $wgMemc->get( $memcKey );
-
- if ( is_array( $memcValue ) ) {
- $cacheEntry = $memcValue;
- wfDebug( __METHOD__ . ": got from memcached $memcKey\n" );
-
- return $cacheEntry['batches'];
- }
-
-
- // 4) ... finally fetch from the slow database :(
-
- $this->getLinks( $table );
- $cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
- // Save to memcached
- $wgMemc->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY );
-
- wfDebug( __METHOD__ . ": got from database\n" );
- return $cacheEntry['batches'];
- }
-
- /**
- * Partition a DB result with backlinks in it into batches
- * @param $res ResultWrapper database result
- * @param $batchSize integer
- * @return array @see
- */
- protected function partitionResult( $res, $batchSize ) {
- $batches = array();
- $numRows = $res->numRows();
- $numBatches = ceil( $numRows / $batchSize );
-
- for ( $i = 0; $i < $numBatches; $i++ ) {
- if ( $i == 0 ) {
- $start = false;
- } else {
- $rowNum = intval( $numRows * $i / $numBatches );
- $res->seek( $rowNum );
- $row = $res->fetchObject();
- $start = $row->page_id;
- }
-
- if ( $i == $numBatches - 1 ) {
- $end = false;
- } else {
- $rowNum = intval( $numRows * ( $i + 1 ) / $numBatches );
- $res->seek( $rowNum );
- $row = $res->fetchObject();
- $end = $row->page_id - 1;
- }
-
- # Sanity check order
- if ( $start && $end && $start > $end ) {
- throw new MWException( __METHOD__ . ': Internal error: query result out of order' );
- }
-
- $batches[] = array( $start, $end );
- }
-
- return array( 'numRows' => $numRows, 'batches' => $batches );
- }
-}
diff --git a/includes/Block.php b/includes/Block.php
index 732699dc..7ee36ce9 100644
--- a/includes/Block.php
+++ b/includes/Block.php
@@ -65,11 +65,11 @@ class Block {
$timestamp = 0, $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0, $enableAutoblock = 0,
$hideName = 0, $blockEmail = 0, $allowUsertalk = 0, $byText = '' )
{
- if( $timestamp === 0 ){
+ if( $timestamp === 0 ) {
$timestamp = wfTimestampNow();
}
- if( count( func_get_args() ) > 0 ){
+ if( count( func_get_args() ) > 0 ) {
# Soon... :D
# wfDeprecated( __METHOD__ . " with arguments" );
}
@@ -106,7 +106,7 @@ class Block {
* user ID. Tries the user ID first, and if that doesn't work, tries
* the address.
*
- * @param $address String: IP address of user/anon
+ * @param string $address IP address of user/anon
* @param $user Integer: user id of user
* @return Block Object
* @deprecated since 1.18
@@ -164,7 +164,7 @@ class Block {
/**
* Check if two blocks are effectively equal. Doesn't check irrelevant things like
- * the blocking user or the block timestamp, only things which affect the blocked user *
+ * the blocking user or the block timestamp, only things which affect the blocked user
*
* @param $block Block
*
@@ -199,23 +199,23 @@ class Block {
/**
* Get a block from the DB, with either the given address or the given username
*
- * @param $address string The IP address of the user, or blank to skip IP blocks
- * @param $user int The user ID, or zero for anonymous users
+ * @param string $address The IP address of the user, or blank to skip IP blocks
+ * @param int $user The user ID, or zero for anonymous users
* @return Boolean: the user is blocked from editing
* @deprecated since 1.18
*/
public function load( $address = '', $user = 0 ) {
wfDeprecated( __METHOD__, '1.18' );
- if( $user ){
+ if( $user ) {
$username = User::whoIs( $user );
$block = self::newFromTarget( $username, $address );
} else {
$block = self::newFromTarget( null, $address );
}
- if( $block instanceof Block ){
+ if( $block instanceof Block ) {
# This is mildly evil, but hey, it's B/C :D
- foreach( $block as $variable => $value ){
+ foreach( $block as $variable => $value ) {
$this->$variable = $value;
}
return true;
@@ -227,16 +227,17 @@ class Block {
/**
* Load a block from the database which affects the already-set $this->target:
* 1) A block directly on the given user or IP
- * 2) A rangeblock encompasing the given IP (smallest first)
+ * 2) A rangeblock encompassing the given IP (smallest first)
* 3) An autoblock on the given IP
* @param $vagueTarget User|String also search for blocks affecting this target. Doesn't
* make any sense to use TYPE_AUTO / TYPE_ID here. Leave blank to skip IP lookups.
+ * @throws MWException
* @return Bool whether a relevant block was found
*/
protected function newLoad( $vagueTarget = null ) {
$db = wfGetDB( $this->mFromMaster ? DB_MASTER : DB_SLAVE );
- if( $this->type !== null ){
+ if( $this->type !== null ) {
$conds = array(
'ipb_address' => array( (string)$this->target ),
);
@@ -246,11 +247,11 @@ class Block {
# Be aware that the != '' check is explicit, since empty values will be
# passed by some callers (bug 29116)
- if( $vagueTarget != ''){
+ if( $vagueTarget != '' ) {
list( $target, $type ) = self::parseTarget( $vagueTarget );
switch( $type ) {
case self::TYPE_USER:
- # Slightly wierd, but who are we to argue?
+ # Slightly weird, but who are we to argue?
$conds['ipb_address'][] = (string)$target;
break;
@@ -284,20 +285,20 @@ class Block {
# This is begging for $this = $bestBlock, but that's not allowed in PHP :(
$bestBlockPreventsEdit = null;
- foreach( $res as $row ){
+ foreach( $res as $row ) {
$block = self::newFromRow( $row );
# Don't use expired blocks
- if( $block->deleteIfExpired() ){
+ if( $block->deleteIfExpired() ) {
continue;
}
# Don't use anon only blocks on users
- if( $this->type == self::TYPE_USER && !$block->isHardblock() ){
+ if( $this->type == self::TYPE_USER && !$block->isHardblock() ) {
continue;
}
- if( $block->getType() == self::TYPE_RANGE ){
+ if( $block->getType() == self::TYPE_RANGE ) {
# This is the number of bits that are allowed to vary in the block, give
# or take some floating point errors
$end = wfBaseconvert( $block->getRangeEnd(), 16, 10 );
@@ -306,20 +307,20 @@ class Block {
# This has the nice property that a /32 block is ranked equally with a
# single-IP block, which is exactly what it is...
- $score = self::TYPE_RANGE - 1 + ( $size / 128 );
+ $score = self::TYPE_RANGE - 1 + ( $size / 128 );
} else {
$score = $block->getType();
}
- if( $score < $bestBlockScore ){
+ if( $score < $bestBlockScore ) {
$bestBlockScore = $score;
$bestRow = $row;
$bestBlockPreventsEdit = $block->prevents( 'edit' );
}
}
- if( $bestRow !== null ){
+ if( $bestRow !== null ) {
$this->initFromRow( $bestRow );
$this->prevents( 'edit', $bestBlockPreventsEdit );
return true;
@@ -329,9 +330,9 @@ class Block {
}
/**
- * Get a set of SQL conditions which will select rangeblocks encompasing a given range
- * @param $start String Hexadecimal IP representation
- * @param $end String Hexadecimal IP represenation, or null to use $start = $end
+ * Get a set of SQL conditions which will select rangeblocks encompassing a given range
+ * @param string $start Hexadecimal IP representation
+ * @param string $end Hexadecimal IP representation, or null to use $start = $end
* @return String
*/
public static function getRangeCond( $start, $end = null ) {
@@ -370,9 +371,9 @@ class Block {
protected static function getIpFragment( $hex ) {
global $wgBlockCIDRLimit;
if ( substr( $hex, 0, 3 ) == 'v6-' ) {
- return 'v6-' . substr( substr( $hex, 3 ), 0, floor( $wgBlockCIDRLimit['IPv6'] / 4 ) );
+ return 'v6-' . substr( substr( $hex, 3 ), 0, floor( $wgBlockCIDRLimit['IPv6'] / 4 ) );
} else {
- return substr( $hex, 0, floor( $wgBlockCIDRLimit['IPv4'] / 4 ) );
+ return substr( $hex, 0, floor( $wgBlockCIDRLimit['IPv4'] / 4 ) );
}
}
@@ -417,7 +418,7 @@ class Block {
* @param $row ResultWrapper row from the ipblocks table
* @return Block
*/
- public static function newFromRow( $row ){
+ public static function newFromRow( $row ) {
$block = new Block;
$block->initFromRow( $row );
return $block;
@@ -426,6 +427,7 @@ class Block {
/**
* Delete the row from the IP blocks table.
*
+ * @throws MWException
* @return Boolean
*/
public function delete() {
@@ -463,7 +465,7 @@ class Block {
Block::purgeExpired();
$row = $this->getDatabaseArray();
- $row['ipb_id'] = $dbw->nextSequenceValue("ipblocks_ipb_id_seq");
+ $row['ipb_id'] = $dbw->nextSequenceValue( "ipblocks_ipb_id_seq" );
$dbw->insert(
'ipblocks',
@@ -486,7 +488,7 @@ class Block {
* Update a block in the DB with new parameters.
* The ID field needs to be loaded first.
*
- * @return Int number of affected rows, which should probably be 1 or something's
+ * @return Int number of affected rows, which should probably be 1 or something has
* gone slightly awry
*/
public function update() {
@@ -508,8 +510,8 @@ class Block {
* @param $db DatabaseBase
* @return Array
*/
- protected function getDatabaseArray( $db = null ){
- if( !$db ){
+ protected function getDatabaseArray( $db = null ) {
+ if( !$db ) {
$db = wfGetDB( DB_SLAVE );
}
$expiry = $db->encodeExpiry( $this->mExpiry );
@@ -534,10 +536,10 @@ class Block {
'ipb_expiry' => $expiry,
'ipb_range_start' => $this->getRangeStart(),
'ipb_range_end' => $this->getRangeEnd(),
- 'ipb_deleted' => intval( $this->mHideName ), // typecast required for SQLite
+ 'ipb_deleted' => intval( $this->mHideName ), // typecast required for SQLite
'ipb_block_email' => $this->prevents( 'sendemail' ),
'ipb_allow_usertalk' => !$this->prevents( 'editownusertalk' ),
- 'ipb_parent_block_id' => $this->mParentBlockId
+ 'ipb_parent_block_id' => $this->mParentBlockId
);
return $a;
@@ -570,10 +572,17 @@ class Block {
* blocked by this Block. This will use the recentchanges table.
*
* @param Block $block
- * @param Array &$blockIds
+ * @param array &$blockIds
* @return Array: block IDs of retroactive autoblocks made
*/
protected static function defaultRetroactiveAutoblock( Block $block, array &$blockIds ) {
+ global $wgPutIPinRC;
+
+ // No IPs are in recentchanges table, so nothing to select
+ if( !$wgPutIPinRC ) {
+ return;
+ }
+
$dbr = wfGetDB( DB_SLAVE );
$options = array( 'ORDER BY' => 'rc_timestamp DESC' );
@@ -583,9 +592,9 @@ class Block {
$options['LIMIT'] = 1;
$res = $dbr->select( 'recentchanges', array( 'rc_ip' ), $conds,
- __METHOD__ , $options );
+ __METHOD__, $options );
- if ( !$dbr->numRows( $res ) ) {
+ if ( !$res->numRows() ) {
# No results, don't autoblock anything
wfDebug( "No IP found to retroactively autoblock\n" );
} else {
@@ -602,7 +611,7 @@ class Block {
* Checks whether a given IP is on the autoblock whitelist.
* TODO: this probably belongs somewhere else, but not sure where...
*
- * @param $ip String: The IP to check
+ * @param string $ip The IP to check
* @return Boolean
*/
public static function isWhitelistedFromAutoblocks( $ip ) {
@@ -645,7 +654,7 @@ class Block {
/**
* Autoblocks the given IP, referring to this Block.
*
- * @param $autoblockIP String: the IP to autoblock.
+ * @param string $autoblockIP the IP to autoblock.
* @return mixed: block ID if an autoblock was inserted, false if not.
*/
public function doAutoblock( $autoblockIP ) {
@@ -687,7 +696,7 @@ class Block {
wfDebug( "Autoblocking {$this->getTarget()}@" . $autoblockIP . "\n" );
$autoblock->setTarget( $autoblockIP );
$autoblock->setBlocker( $this->getBlocker() );
- $autoblock->mReason = wfMessage( 'autoblocker', $this->getTarget(), $this->mReason )->inContentLanguage()->text();
+ $autoblock->mReason = wfMessage( 'autoblocker', $this->getTarget(), $this->mReason )->inContentLanguage()->plain();
$timestamp = wfTimestampNow();
$autoblock->mTimestamp = $timestamp;
$autoblock->mAuto = 1;
@@ -780,6 +789,7 @@ class Block {
/**
* Get the IP address at the start of the range in Hex form
+ * @throws MWException
* @return String IP in Hex form
*/
public function getRangeStart() {
@@ -797,6 +807,7 @@ class Block {
/**
* Get the IP address at the start of the range in Hex form
+ * @throws MWException
* @return String IP in Hex form
*/
public function getRangeEnd() {
@@ -934,7 +945,7 @@ class Block {
/**
* Encode expiry for DB
*
- * @param $expiry String: timestamp for expiry, or
+ * @param string $expiry timestamp for expiry, or
* @param $db DatabaseBase object
* @return String
* @deprecated since 1.18; use $dbw->encodeExpiry() instead
@@ -947,8 +958,8 @@ class Block {
/**
* Decode expiry which has come from the DB
*
- * @param $expiry String: Database expiry format
- * @param $timestampType Int Requested timestamp format
+ * @param string $expiry Database expiry format
+ * @param int $timestampType Requested timestamp format
* @return String
* @deprecated since 1.18; use $wgLang->formatExpiry() instead
*/
@@ -971,9 +982,9 @@ class Block {
}
/**
- * Gets rid of uneeded numbers in quad-dotted/octet IP strings
+ * Gets rid of unneeded numbers in quad-dotted/octet IP strings
* For example, 127.111.113.151/24 -> 127.111.113.0/24
- * @param $range String: IP address to normalize
+ * @param string $range IP address to normalize
* @return string
* @deprecated since 1.18, call IP::sanitizeRange() directly
*/
@@ -986,9 +997,11 @@ class Block {
* Purge expired blocks from the ipblocks table
*/
public static function purgeExpired() {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->delete( 'ipblocks',
- array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), __METHOD__ );
+ if ( !wfReadOnly() ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->delete( 'ipblocks',
+ array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), __METHOD__ );
+ }
}
/**
@@ -1005,7 +1018,7 @@ class Block {
/**
* Convert a submitted expiry time, which may be relative ("2 weeks", etc) or absolute
* ("24 May 2034"), into an absolute timestamp we can put into the database.
- * @param $expiry String: whatever was typed into the form
+ * @param string $expiry whatever was typed into the form
* @return String: timestamp or "infinity" string for th DB implementation
* @deprecated since 1.18 moved to SpecialBlock::parseExpiryInput()
*/
@@ -1029,7 +1042,7 @@ class Block {
* @param $vagueTarget String|User|Int as above, but we will search for *any* block which
* affects that target (so for an IP address, get ranges containing that IP; and also
* get any relevant autoblocks). Leave empty or blank to skip IP-based lookups.
- * @param $fromMaster Bool whether to use the DB_MASTER database
+ * @param bool $fromMaster whether to use the DB_MASTER database
* @return Block|null (null if no relevant block could be found). The target and type
* of the returned Block will refer to the actual block which was found, which might
* not be the same as the target you gave if you used $vagueTarget!
@@ -1037,24 +1050,24 @@ class Block {
public static function newFromTarget( $specificTarget, $vagueTarget = null, $fromMaster = false ) {
list( $target, $type ) = self::parseTarget( $specificTarget );
- if( $type == Block::TYPE_ID || $type == Block::TYPE_AUTO ){
+ if( $type == Block::TYPE_ID || $type == Block::TYPE_AUTO ) {
return Block::newFromID( $target );
- } elseif( $target === null && $vagueTarget == '' ){
+ } elseif( $target === null && $vagueTarget == '' ) {
# We're not going to find anything useful here
# Be aware that the == '' check is explicit, since empty values will be
# passed by some callers (bug 29116)
return null;
- } elseif( in_array( $type, array( Block::TYPE_USER, Block::TYPE_IP, Block::TYPE_RANGE ) ) ) {
+ } elseif( in_array( $type, array( Block::TYPE_USER, Block::TYPE_IP, Block::TYPE_RANGE, null ) ) ) {
$block = new Block();
$block->fromMaster( $fromMaster );
- if( $type !== null ){
+ if( $type !== null ) {
$block->setTarget( $target );
}
- if( $block->newLoad( $vagueTarget ) ){
+ if( $block->newLoad( $vagueTarget ) ) {
return $block;
}
}
@@ -1062,22 +1075,23 @@ class Block {
}
/**
- * From an existing Block, get the target and the type of target. Note that it is
- * always safe to treat the target as a string; for User objects this will return
- * User::__toString() which in turn gives User::getName().
+ * From an existing Block, get the target and the type of target.
+ * Note that, except for null, it is always safe to treat the target
+ * as a string; for User objects this will return User::__toString()
+ * which in turn gives User::getName().
*
- * @param $target String|Int|User
- * @return array( User|String, Block::TYPE_ constant )
+ * @param $target String|Int|User|null
+ * @return array( User|String|null, Block::TYPE_ constant|null )
*/
public static function parseTarget( $target ) {
# We may have been through this before
- if( $target instanceof User ){
- if( IP::isValid( $target->getName() ) ){
+ if( $target instanceof User ) {
+ if( IP::isValid( $target->getName() ) ) {
return array( $target, self::TYPE_IP );
} else {
return array( $target, self::TYPE_USER );
}
- } elseif( $target === null ){
+ } elseif( $target === null ) {
return array( null, null );
}
@@ -1098,7 +1112,7 @@ class Block {
# Consider the possibility that this is not a username at all
# but actually an old subpage (bug #29797)
- if( strpos( $target, '/' ) !== false ){
+ if( strpos( $target, '/' ) !== false ) {
# An old subpage, drill down to the user behind it
$parts = explode( '/', $target );
$target = $parts[0];
@@ -1165,7 +1179,7 @@ class Block {
* Set the target for this block, and update $this->type accordingly
* @param $target Mixed
*/
- public function setTarget( $target ){
+ public function setTarget( $target ) {
list( $this->target, $this->type ) = self::parseTarget( $target );
}
@@ -1173,15 +1187,15 @@ class Block {
* Get the user who implemented this block
* @return User|string Local User object or string for a foreign user
*/
- public function getBlocker(){
+ public function getBlocker() {
return $this->blocker;
}
/**
* Set the user who implemented (or will implement) this block
- * @param $user User|string Local User object or username string for foriegn users
+ * @param $user User|string Local User object or username string for foreign users
*/
- public function setBlocker( $user ){
+ public function setBlocker( $user ) {
$this->blocker = $user;
}
}
diff --git a/includes/CacheHelper.php b/includes/CacheHelper.php
index ac46fc42..f0ae5a31 100644
--- a/includes/CacheHelper.php
+++ b/includes/CacheHelper.php
@@ -18,7 +18,7 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
diff --git a/includes/Category.php b/includes/Category.php
index b7b12e8a..868d6c46 100644
--- a/includes/Category.php
+++ b/includes/Category.php
@@ -44,6 +44,7 @@ class Category {
/**
* Set up all member variables using a database query.
+ * @throws MWException
* @return bool True on success, false on failure.
*/
protected function initialize() {
@@ -57,6 +58,9 @@ class Category {
# Already initialized
return true;
}
+
+ wfProfileIn( __METHOD__ );
+
$dbr = wfGetDB( DB_SLAVE );
$row = $dbr->selectRow(
'category',
@@ -65,15 +69,17 @@ class Category {
__METHOD__
);
+ wfProfileOut( __METHOD__ );
+
if ( !$row ) {
# Okay, there were no contents. Nothing to initialize.
if ( $this->mTitle ) {
# If there is a title object but no record in the category table, treat this as an empty category
- $this->mID = false;
- $this->mName = $this->mTitle->getDBkey();
- $this->mPages = 0;
+ $this->mID = false;
+ $this->mName = $this->mTitle->getDBkey();
+ $this->mPages = 0;
$this->mSubcats = 0;
- $this->mFiles = 0;
+ $this->mFiles = 0;
return true;
} else {
@@ -81,11 +87,11 @@ class Category {
}
}
- $this->mID = $row->cat_id;
- $this->mName = $row->cat_title;
- $this->mPages = $row->cat_pages;
+ $this->mID = $row->cat_id;
+ $this->mName = $row->cat_title;
+ $this->mPages = $row->cat_pages;
$this->mSubcats = $row->cat_subcats;
- $this->mFiles = $row->cat_files;
+ $this->mFiles = $row->cat_files;
# (bug 13683) If the count is negative, then 1) it's obviously wrong
# and should not be kept, and 2) we *probably* don't have to scan many
@@ -100,7 +106,7 @@ class Category {
/**
* Factory function.
*
- * @param $name Array: A category name (no "Category:" prefix). It need
+ * @param array $name A category name (no "Category:" prefix). It need
* not be normalized, with spaces replaced by underscores.
* @return mixed Category, or false on a totally invalid name
*/
@@ -161,7 +167,7 @@ class Category {
# NOTE: the row often results from a LEFT JOIN on categorylinks. This may result in
# all the cat_xxx fields being null, if the category page exists, but nothing
- # was ever added to the category. This case should be treated linke an empty
+ # was ever added to the category. This case should be treated link an empty
# category, if possible.
if ( $row->cat_title === null ) {
@@ -173,41 +179,53 @@ class Category {
$cat->mName = $title->getDBkey(); # if we have a title object, fetch the category name from there
}
- $cat->mID = false;
+ $cat->mID = false;
$cat->mSubcats = 0;
- $cat->mPages = 0;
- $cat->mFiles = 0;
+ $cat->mPages = 0;
+ $cat->mFiles = 0;
} else {
- $cat->mName = $row->cat_title;
- $cat->mID = $row->cat_id;
+ $cat->mName = $row->cat_title;
+ $cat->mID = $row->cat_id;
$cat->mSubcats = $row->cat_subcats;
- $cat->mPages = $row->cat_pages;
- $cat->mFiles = $row->cat_files;
+ $cat->mPages = $row->cat_pages;
+ $cat->mFiles = $row->cat_files;
}
return $cat;
}
/** @return mixed DB key name, or false on failure */
- public function getName() { return $this->getX( 'mName' ); }
+ public function getName() {
+ return $this->getX( 'mName' );
+ }
/** @return mixed Category ID, or false on failure */
- public function getID() { return $this->getX( 'mID' ); }
+ public function getID() {
+ return $this->getX( 'mID' );
+ }
/** @return mixed Total number of member pages, or false on failure */
- public function getPageCount() { return $this->getX( 'mPages' ); }
+ public function getPageCount() {
+ return $this->getX( 'mPages' );
+ }
/** @return mixed Number of subcategories, or false on failure */
- public function getSubcatCount() { return $this->getX( 'mSubcats' ); }
+ public function getSubcatCount() {
+ return $this->getX( 'mSubcats' );
+ }
/** @return mixed Number of member files, or false on failure */
- public function getFileCount() { return $this->getX( 'mFiles' ); }
+ public function getFileCount() {
+ return $this->getX( 'mFiles' );
+ }
/**
* @return Title|bool Title for this category, or false on failure.
*/
public function getTitle() {
- if ( $this->mTitle ) return $this->mTitle;
+ if ( $this->mTitle ) {
+ return $this->mTitle;
+ }
if ( !$this->initialize() ) {
return false;
@@ -225,20 +243,22 @@ class Category {
* @return TitleArray object for category members.
*/
public function getMembers( $limit = false, $offset = '' ) {
+ wfProfileIn( __METHOD__ );
+
$dbr = wfGetDB( DB_SLAVE );
$conds = array( 'cl_to' => $this->getName(), 'cl_from = page_id' );
$options = array( 'ORDER BY' => 'cl_sortkey' );
if ( $limit ) {
- $options[ 'LIMIT' ] = $limit;
+ $options['LIMIT'] = $limit;
}
if ( $offset !== '' ) {
$conds[] = 'cl_sortkey > ' . $dbr->addQuotes( $offset );
}
- return TitleArray::newFromResult(
+ $result = TitleArray::newFromResult(
$dbr->select(
array( 'page', 'categorylinks' ),
array( 'page_id', 'page_namespace', 'page_title', 'page_len',
@@ -248,6 +268,10 @@ class Category {
$options
)
);
+
+ wfProfileOut( __METHOD__ );
+
+ return $result;
}
/**
@@ -258,7 +282,7 @@ class Category {
if ( !$this->initialize() ) {
return false;
}
- return $this-> { $key } ;
+ return $this->{$key};
}
/**
@@ -278,8 +302,10 @@ class Category {
}
}
+ wfProfileIn( __METHOD__ );
+
$dbw = wfGetDB( DB_MASTER );
- $dbw->begin( __METHOD__ );
+ $dbw->begin( __METHOD__ );
# Insert the row if it doesn't exist yet (e.g., this is being run via
# update.php from a pre-1.16 schema). TODO: This will cause lots and
@@ -302,12 +328,12 @@ class Category {
$result = $dbw->selectRow(
array( 'categorylinks', 'page' ),
array( 'pages' => 'COUNT(*)',
- 'subcats' => "COUNT($cond1)",
- 'files' => "COUNT($cond2)"
+ 'subcats' => "COUNT($cond1)",
+ 'files' => "COUNT($cond2)"
),
array( 'cl_to' => $this->mName, 'page_id = cl_from' ),
__METHOD__,
- 'LOCK IN SHARE MODE'
+ array( 'LOCK IN SHARE MODE' )
);
$ret = $dbw->update(
'category',
@@ -321,10 +347,12 @@ class Category {
);
$dbw->commit( __METHOD__ );
+ wfProfileOut( __METHOD__ );
+
# Now we should update our local counts.
- $this->mPages = $result->pages;
+ $this->mPages = $result->pages;
$this->mSubcats = $result->subcats;
- $this->mFiles = $result->files;
+ $this->mFiles = $result->files;
return $ret;
}
diff --git a/includes/CategoryPage.php b/includes/CategoryPage.php
index 32e270e8..43ab4dbd 100644
--- a/includes/CategoryPage.php
+++ b/includes/CategoryPage.php
@@ -40,7 +40,7 @@ class CategoryPage extends Article {
/**
* Constructor from a page id
- * @param $id Int article ID to load
+ * @param int $id article ID to load
* @return CategoryPage|null
*/
public static function newFromID( $id ) {
@@ -56,7 +56,7 @@ class CategoryPage extends Article {
$diffOnly = $request->getBool( 'diffonly',
$this->getContext()->getUser()->getOption( 'diffonly' ) );
- if ( isset( $diff ) && $diffOnly ) {
+ if ( $diff !== null && $diffOnly ) {
parent::view();
return;
}
diff --git a/includes/CategoryViewer.php b/includes/CategoryViewer.php
index 3bb2bc9b..970adb53 100644
--- a/includes/CategoryViewer.php
+++ b/includes/CategoryViewer.php
@@ -71,11 +71,12 @@ class CategoryViewer extends ContextSource {
* @since 1.19 $context is a second, required parameter
* @param $title Title
* @param $context IContextSource
- * @param $from String
- * @param $until String
+ * @param array $from An array with keys page, subcat,
+ * and file for offset of results of each section (since 1.17)
+ * @param array $until An array with 3 keys for until of each section (since 1.17)
* @param $query Array
*/
- function __construct( $title, IContextSource $context, $from = '', $until = '', $query = array() ) {
+ function __construct( $title, IContextSource $context, $from = array(), $until = array(), $query = array() ) {
global $wgCategoryPagingLimit;
$this->title = $title;
$this->setContext( $context );
@@ -173,7 +174,7 @@ class CategoryViewer extends ContextSource {
/**
* Add a subcategory to the internal lists, using a title object
- * @deprecated since 1.17 kept for compatibility, please use addSubcategoryObject instead
+ * @deprecated since 1.17 kept for compatibility, use addSubcategoryObject instead
*/
function addSubcategory( Title $title, $sortkey, $pageLength ) {
wfDeprecated( __METHOD__, '1.17' );
@@ -181,14 +182,14 @@ class CategoryViewer extends ContextSource {
}
/**
- * Get the character to be used for sorting subcategories.
- * If there's a link from Category:A to Category:B, the sortkey of the resulting
- * entry in the categorylinks table is Category:A, not A, which it SHOULD be.
- * Workaround: If sortkey == "Category:".$title, than use $title for sorting,
- * else use sortkey...
- *
- * @param Title $title
- * @param string $sortkey The human-readable sortkey (before transforming to icu or whatever).
+ * Get the character to be used for sorting subcategories.
+ * If there's a link from Category:A to Category:B, the sortkey of the resulting
+ * entry in the categorylinks table is Category:A, not A, which it SHOULD be.
+ * Workaround: If sortkey == "Category:".$title, than use $title for sorting,
+ * else use sortkey...
+ *
+ * @param Title $title
+ * @param string $sortkey The human-readable sortkey (before transforming to icu or whatever).
* @return string
*/
function getSubcategorySortChar( $title, $sortkey ) {
@@ -248,7 +249,7 @@ class CategoryViewer extends ContextSource {
$link = Linker::link( $title );
if ( $isRedirect ) {
// This seems kind of pointless given 'mw-redirect' class,
- // but keeping for back-compatiability with user css.
+ // but keeping for back-compatibility with user css.
$link = '<span class="redirect-in-category">' . $link . '</span>';
}
$this->articles[] = $link;
@@ -259,15 +260,15 @@ class CategoryViewer extends ContextSource {
function finaliseCategoryState() {
if ( $this->flip['subcat'] ) {
- $this->children = array_reverse( $this->children );
+ $this->children = array_reverse( $this->children );
$this->children_start_char = array_reverse( $this->children_start_char );
}
if ( $this->flip['page'] ) {
- $this->articles = array_reverse( $this->articles );
+ $this->articles = array_reverse( $this->articles );
$this->articles_start_char = array_reverse( $this->articles_start_char );
}
if ( !$this->showGallery && $this->flip['file'] ) {
- $this->imgsNoGallery = array_reverse( $this->imgsNoGallery );
+ $this->imgsNoGallery = array_reverse( $this->imgsNoGallery );
$this->imgsNoGallery_start_char = array_reverse( $this->imgsNoGallery_start_char );
}
}
@@ -287,10 +288,10 @@ class CategoryViewer extends ContextSource {
# the collation in the database differs from the one
# set in $wgCategoryCollation, pagination might go totally haywire.
$extraConds = array( 'cl_type' => $type );
- if ( $this->from[$type] !== null ) {
+ if ( isset( $this->from[$type] ) && $this->from[$type] !== null ) {
$extraConds[] = 'cl_sortkey >= '
. $dbr->addQuotes( $this->collation->getSortKey( $this->from[$type] ) );
- } elseif ( $this->until[$type] !== null ) {
+ } elseif ( isset( $this->until[$type] ) && $this->until[$type] !== null ) {
$extraConds[] = 'cl_sortkey < '
. $dbr->addQuotes( $this->collation->getSortKey( $this->until[$type] ) );
$this->flip[$type] = true;
@@ -302,7 +303,7 @@ class CategoryViewer extends ContextSource {
'page_is_redirect', 'cl_sortkey', 'cat_id', 'cat_title',
'cat_subcats', 'cat_pages', 'cat_files',
'cl_sortkey_prefix', 'cl_collation' ),
- array_merge( array( 'cl_to' => $this->title->getDBkey() ), $extraConds ),
+ array_merge( array( 'cl_to' => $this->title->getDBkey() ), $extraConds ),
__METHOD__,
array(
'USE INDEX' => array( 'categorylinks' => 'cl_sortkey' ),
@@ -310,8 +311,11 @@ class CategoryViewer extends ContextSource {
'ORDER BY' => $this->flip[$type] ? 'cl_sortkey DESC' : 'cl_sortkey',
),
array(
- 'categorylinks' => array( 'INNER JOIN', 'cl_from = page_id' ),
- 'category' => array( 'LEFT JOIN', 'cat_title = page_title AND page_namespace = ' . NS_CATEGORY )
+ 'categorylinks' => array( 'INNER JOIN', 'cl_from = page_id' ),
+ 'category' => array( 'LEFT JOIN', array(
+ 'cat_title = page_title',
+ 'page_namespace' => NS_CATEGORY
+ ))
)
);
@@ -388,7 +392,7 @@ class CategoryViewer extends ContextSource {
$r = '';
# @todo FIXME: Here and in the other two sections: we don't need to bother
- # with this rigamarole if the entire category contents fit on one page
+ # with this rigmarole if the entire category contents fit on one page
# and have already been retrieved. We can just use $rescnt in that
# case and save a query and some logic.
$dbcnt = $this->cat->getPageCount() - $this->cat->getSubcatCount()
@@ -437,13 +441,13 @@ class CategoryViewer extends ContextSource {
* Get the paging links for a section (subcats/pages/files), to go at the top and bottom
* of the output.
*
- * @param $type String: 'page', 'subcat', or 'file'
+ * @param string $type 'page', 'subcat', or 'file'
* @return String: HTML output, possibly empty if there are no other pages
*/
private function getSectionPagingLinks( $type ) {
- if ( $this->until[$type] !== null ) {
+ if ( isset( $this->until[$type] ) && $this->until[$type] !== null ) {
return $this->pagingLinks( $this->nextPage[$type], $this->until[$type], $type );
- } elseif ( $this->nextPage[$type] !== null || $this->from[$type] !== null ) {
+ } elseif ( $this->nextPage[$type] !== null || ( isset( $this->from[$type] ) && $this->from[$type] !== null ) ) {
return $this->pagingLinks( $this->from[$type], $this->nextPage[$type], $type );
} else {
return '';
@@ -469,7 +473,7 @@ class CategoryViewer extends ContextSource {
*/
function formatList( $articles, $articles_start_char, $cutoff = 6 ) {
$list = '';
- if ( count ( $articles ) > $cutoff ) {
+ if ( count( $articles ) > $cutoff ) {
$list = self::columnList( $articles, $articles_start_char );
} elseif ( count( $articles ) > 0 ) {
// for short lists of articles in categories.
@@ -478,7 +482,7 @@ class CategoryViewer extends ContextSource {
$pageLang = $this->title->getPageLanguage();
$attribs = array( 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(),
- 'class' => 'mw-content-'.$pageLang->getDir() );
+ 'class' => 'mw-content-' . $pageLang->getDir() );
$list = Html::rawElement( 'div', $attribs, $list );
return $list;
@@ -569,9 +573,9 @@ class CategoryViewer extends ContextSource {
/**
* Create paging links, as a helper method to getSectionPagingLinks().
*
- * @param $first String The 'until' parameter for the generated URL
- * @param $last String The 'from' parameter for the genererated URL
- * @param $type String A prefix for parameters, 'page' or 'subcat' or
+ * @param string $first The 'until' parameter for the generated URL
+ * @param string $last The 'from' parameter for the generated URL
+ * @param string $type A prefix for parameters, 'page' or 'subcat' or
* 'file'
* @return String HTML
*/
@@ -604,7 +608,7 @@ class CategoryViewer extends ContextSource {
);
}
- return $this->msg('categoryviewer-pagedlinks')->rawParams($prevLink, $nextLink)->escaped();
+ return $this->msg( 'categoryviewer-pagedlinks' )->rawParams( $prevLink, $nextLink )->escaped();
}
/**
@@ -612,7 +616,8 @@ class CategoryViewer extends ContextSource {
* corresponds to the correct segment of the category.
*
* @param Title $title: The title (usually $this->title)
- * @param String $section: Which section
+ * @param string $section: Which section
+ * @throws MWException
* @return Title
*/
private function addFragmentToTitle( $title, $section ) {
@@ -634,6 +639,7 @@ class CategoryViewer extends ContextSource {
return Title::makeTitle( $title->getNamespace(),
$title->getDBkey(), $fragment );
}
+
/**
* What to do if the category table conflicts with the number of results
* returned? This function says what. Each type is considered independently
@@ -644,9 +650,9 @@ class CategoryViewer extends ContextSource {
* category-subcat-count-limited, category-file-count,
* category-file-count-limited.
*
- * @param $rescnt Int: The number of items returned by our database query.
- * @param $dbcnt Int: The number of items according to the category table.
- * @param $type String: 'subcat', 'article', or 'file'
+ * @param int $rescnt The number of items returned by our database query.
+ * @param int $dbcnt The number of items according to the category table.
+ * @param string $type 'subcat', 'article', or 'file'
* @return String: A message giving the number of items, to output to HTML.
*/
private function getCountMessage( $rescnt, $dbcnt, $type ) {
@@ -671,12 +677,15 @@ class CategoryViewer extends ContextSource {
}
$fromOrUntil = false;
- if ( $this->from[$pagingType] !== null || $this->until[$pagingType] !== null ) {
+ if ( ( isset( $this->from[$pagingType] ) && $this->from[$pagingType] !== null ) ||
+ ( isset( $this->until[$pagingType] ) && $this->until[$pagingType] !== null )
+ ) {
$fromOrUntil = true;
}
- if ( $dbcnt == $rescnt || ( ( $rescnt == $this->limit || $fromOrUntil )
- && $dbcnt > $rescnt ) ) {
+ if ( $dbcnt == $rescnt ||
+ ( ( $rescnt == $this->limit || $fromOrUntil ) && $dbcnt > $rescnt )
+ ) {
# Case 1: seems sane.
$totalcnt = $dbcnt;
} elseif ( $rescnt < $this->limit && !$fromOrUntil ) {
diff --git a/includes/Categoryfinder.php b/includes/Categoryfinder.php
index e2b6a0ca..6ef224b6 100644
--- a/includes/Categoryfinder.php
+++ b/includes/Categoryfinder.php
@@ -28,17 +28,17 @@
*
* Example use :
* <code>
- * # Determines whether the article with the page_id 12345 is in both
- * # "Category 1" and "Category 2" or their subcategories, respectively
+ * # Determines whether the article with the page_id 12345 is in both
+ * # "Category 1" and "Category 2" or their subcategories, respectively
*
- * $cf = new Categoryfinder;
- * $cf->seed(
- * array( 12345 ),
- * array( 'Category 1', 'Category 2' ),
- * 'AND'
- * );
- * $a = $cf->run();
- * print implode( ',' , $a );
+ * $cf = new Categoryfinder;
+ * $cf->seed(
+ * array( 12345 ),
+ * array( 'Category 1', 'Category 2' ),
+ * 'AND'
+ * );
+ * $a = $cf->run();
+ * print implode( ',' , $a );
* </code>
*
*/
@@ -66,7 +66,7 @@ class Categoryfinder {
* Initializes the instance. Do this prior to calling run().
* @param $article_ids Array of article IDs
* @param $categories FIXME
- * @param $mode String: FIXME, default 'AND'.
+ * @param string $mode FIXME, default 'AND'.
* @todo FIXME: $categories/$mode
*/
function seed( $article_ids, $categories, $mode = 'AND' ) {
@@ -111,9 +111,9 @@ class Categoryfinder {
/**
* This functions recurses through the parent representation, trying to match the conditions
- * @param $id int The article/category to check
- * @param $conds array The array of categories to match
- * @param $path array used to check for recursion loops
+ * @param int $id The article/category to check
+ * @param array $conds The array of categories to match
+ * @param array $path used to check for recursion loops
* @return bool Does this match the conditions?
*/
function check( $id, &$conds, $path = array() ) {
@@ -124,7 +124,7 @@ class Categoryfinder {
$path[] = $id;
- # Shortcut (runtime paranoia): No contitions=all matched
+ # Shortcut (runtime paranoia): No conditions=all matched
if ( count( $conds ) == 0 ) {
return true;
}
@@ -135,7 +135,7 @@ class Categoryfinder {
# iterate through the parents
foreach ( $this->parents[$id] as $p ) {
- $pname = $p->cl_to ;
+ $pname = $p->cl_to;
# Is this a condition?
if ( isset( $conds[$pname] ) ) {
@@ -172,6 +172,8 @@ class Categoryfinder {
* Scans a "parent layer" of the articles/categories in $this->next
*/
function scan_next_layer() {
+ wfProfileIn( __METHOD__ );
+
# Find all parents of the article currently in $this->next
$layer = array();
$res = $this->dbr->select(
@@ -209,7 +211,7 @@ class Categoryfinder {
$res = $this->dbr->select(
/* FROM */ 'page',
/* SELECT */ array( 'page_id', 'page_title' ),
- /* WHERE */ array( 'page_namespace' => NS_CATEGORY , 'page_title' => $layer ),
+ /* WHERE */ array( 'page_namespace' => NS_CATEGORY, 'page_title' => $layer ),
__METHOD__ . '-2'
);
foreach ( $res as $o ) {
@@ -225,6 +227,7 @@ class Categoryfinder {
foreach ( $layer as $v ) {
$this->deadend[$v] = $v;
}
- }
+ wfProfileOut( __METHOD__ );
+ }
}
diff --git a/includes/Cdb.php b/includes/Cdb.php
index ae2e5b18..a142c7cb 100644
--- a/includes/Cdb.php
+++ b/includes/Cdb.php
@@ -133,8 +133,9 @@ class CdbReader_DBA {
}
function close() {
- if( isset($this->handle) )
+ if( isset( $this->handle ) ) {
dba_close( $this->handle );
+ }
unset( $this->handle );
}
@@ -143,7 +144,6 @@ class CdbReader_DBA {
}
}
-
/**
* Writer class which uses the DBA extension
*/
@@ -164,8 +164,9 @@ class CdbWriter_DBA {
}
function close() {
- if( isset($this->handle) )
+ if( isset( $this->handle ) ) {
dba_close( $this->handle );
+ }
if ( wfIsWindows() ) {
unlink( $this->realFileName );
}
@@ -181,4 +182,3 @@ class CdbWriter_DBA {
}
}
}
-
diff --git a/includes/Cdb_PHP.php b/includes/Cdb_PHP.php
index 02be65f3..71b55f87 100644
--- a/includes/Cdb_PHP.php
+++ b/includes/Cdb_PHP.php
@@ -126,6 +126,7 @@ class CdbReader_PHP extends CdbReader {
/**
* @param $fileName string
+ * @throws MWException
*/
function __construct( $fileName ) {
$this->fileName = $fileName;
@@ -179,7 +180,7 @@ class CdbReader_PHP extends CdbReader {
protected function read( $length, $pos ) {
if ( fseek( $this->handle, $pos ) == -1 ) {
// This can easily happen if the internal pointers are incorrect
- throw new MWException(
+ throw new MWException(
'Seek failed, file "' . $this->fileName . '" may be corrupted.' );
}
@@ -198,12 +199,13 @@ class CdbReader_PHP extends CdbReader {
/**
* Unpack an unsigned integer and throw an exception if it needs more than 31 bits
* @param $s
- * @return
+ * @throws MWException
+ * @return mixed
*/
protected function unpack31( $s ) {
$data = unpack( 'V', $s );
if ( $data[1] > 0x7fffffff ) {
- throw new MWException(
+ throw new MWException(
'Error in CDB file "' . $this->fileName . '", integer too big.' );
}
return $data[1];
@@ -330,10 +332,10 @@ class CdbWriter_PHP extends CdbWriter {
*/
public function close() {
$this->finish();
- if( isset($this->handle) ) {
+ if( isset( $this->handle ) ) {
fclose( $this->handle );
}
- if ( wfIsWindows() && file_exists($this->realFileName) ) {
+ if ( wfIsWindows() && file_exists( $this->realFileName ) ) {
unlink( $this->realFileName );
}
if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
@@ -349,7 +351,7 @@ class CdbWriter_PHP extends CdbWriter {
protected function write( $buf ) {
$len = fwrite( $this->handle, $buf );
if ( $len !== strlen( $buf ) ) {
- $this->throwException( 'Error writing to CDB file "'.$this->tmpFileName.'".' );
+ $this->throwException( 'Error writing to CDB file "' . $this->tmpFileName . '".' );
}
}
@@ -361,7 +363,7 @@ class CdbWriter_PHP extends CdbWriter {
$newpos = $this->pos + $len;
if ( $newpos > 0x7fffffff ) {
$this->throwException(
- 'A value in the CDB file "'.$this->tmpFileName.'" is too large.' );
+ 'A value in the CDB file "' . $this->tmpFileName . '" is too large.' );
}
$this->pos = $newpos;
}
@@ -390,10 +392,10 @@ class CdbWriter_PHP extends CdbWriter {
*/
protected function addbegin( $keylen, $datalen ) {
if ( $keylen > 0x7fffffff ) {
- $this->throwException( 'Key length too long in file "'.$this->tmpFileName.'".' );
+ $this->throwException( 'Key length too long in file "' . $this->tmpFileName . '".' );
}
if ( $datalen > 0x7fffffff ) {
- $this->throwException( 'Data length too long in file "'.$this->tmpFileName.'".' );
+ $this->throwException( 'Data length too long in file "' . $this->tmpFileName . '".' );
}
$buf = pack( 'VV', $keylen, $datalen );
$this->write( $buf );
@@ -468,14 +470,14 @@ class CdbWriter_PHP extends CdbWriter {
// Write the pointer array at the start of the file
rewind( $this->handle );
if ( ftell( $this->handle ) != 0 ) {
- $this->throwException( 'Error rewinding to start of file "'.$this->tmpFileName.'".' );
+ $this->throwException( 'Error rewinding to start of file "' . $this->tmpFileName . '".' );
}
$this->write( $final );
}
/**
* Clean up the temp file and throw an exception
- *
+ *
* @param $msg string
* @throws MWException
*/
diff --git a/includes/ChangeTags.php b/includes/ChangeTags.php
index 0ebc926f..3adf58f8 100644
--- a/includes/ChangeTags.php
+++ b/includes/ChangeTags.php
@@ -25,8 +25,8 @@ class ChangeTags {
/**
* Creates HTML for the given tags
*
- * @param $tags String: Comma-separated list of tags
- * @param $page String: A label for the type of action which is being displayed,
+ * @param string $tags Comma-separated list of tags
+ * @param string $page A label for the type of action which is being displayed,
* for example: 'history', 'contributions' or 'newpages'
*
* @return Array with two items: (html, classes)
@@ -62,7 +62,7 @@ class ChangeTags {
/**
* Get a short description for a tag
*
- * @param $tag String: tag
+ * @param string $tag tag
*
* @return String: Short description of the tag from "mediawiki:tag-$tag" if this message exists,
* html-escaped version of $tag otherwise
@@ -75,12 +75,13 @@ class ChangeTags {
/**
* Add tags to a change given its rc_id, rev_id and/or log_id
*
- * @param $tags String|Array: Tags to add to the change
+ * @param string|array $tags Tags to add to the change
* @param $rc_id int: rc_id of the change to add the tags to
* @param $rev_id int: rev_id of the change to add the tags to
* @param $log_id int: log_id of the change to add the tags to
- * @param $params String: params to put in the ct_params field of tabel 'change_tag'
+ * @param string $params params to put in the ct_params field of table 'change_tag'
*
+ * @throws MWException
* @return bool: false if no changes are made, otherwise true
*
* @exception MWException when $rc_id, $rev_id and $log_id are all null
@@ -159,17 +160,16 @@ class ChangeTags {
* Handles selecting tags, and filtering.
* Needs $tables to be set up properly, so we can figure out which join conditions to use.
*
- * @param $tables String|Array: Tabel names, see DatabaseBase::select
- * @param $fields String|Array: Fields used in query, see DatabaseBase::select
- * @param $conds String|Array: conditions used in query, see DatabaseBase::select
+ * @param string|array $tables Table names, see DatabaseBase::select
+ * @param string|array $fields Fields used in query, see DatabaseBase::select
+ * @param string|array $conds conditions used in query, see DatabaseBase::select
* @param $join_conds Array: join conditions, see DatabaseBase::select
- * @param $options Array: options, see Database::select
- * @param $filter_tag String: tag to select on
- *
- * @exception MWException when unable to determine appropriate JOIN condition for tagging
+ * @param array $options options, see Database::select
+ * @param bool|string $filter_tag Tag to select on
*
+ * @throws MWException When unable to determine appropriate JOIN condition for tagging
*/
- static function modifyDisplayQuery( &$tables, &$fields, &$conds,
+ static function modifyDisplayQuery( &$tables, &$fields, &$conds,
&$join_conds, &$options, $filter_tag = false ) {
global $wgRequest, $wgUseTagFilter;
@@ -211,7 +211,7 @@ class ChangeTags {
/**
* Build a text box to select a change tag
*
- * @param $selected String: tag to select by default
+ * @param string $selected tag to select by default
* @param $fullForm Boolean:
* - if false, then it returns an array of (label, form).
* - if true, it returns an entire form around the selector.
@@ -221,11 +221,12 @@ class ChangeTags {
* - if $fullForm is false: Array with
* - if $fullForm is true: String, html fragment
*/
- public static function buildTagFilterSelector( $selected='', $fullForm = false, Title $title = null ) {
+ public static function buildTagFilterSelector( $selected = '', $fullForm = false, Title $title = null ) {
global $wgUseTagFilter;
- if ( !$wgUseTagFilter || !count( self::listDefinedTags() ) )
+ if ( !$wgUseTagFilter || !count( self::listDefinedTags() ) ) {
return $fullForm ? '' : array();
+ }
$data = array( Html::rawElement( 'label', array( 'for' => 'tagfilter' ), wfMessage( 'tag-filter' )->parse() ),
Xml::input( 'tagfilter', 20, $selected, array( 'class' => 'mw-tagfilter-input' ) ) );
diff --git a/includes/ChangesFeed.php b/includes/ChangesFeed.php
index ee4c2d64..476de5bd 100644
--- a/includes/ChangesFeed.php
+++ b/includes/ChangesFeed.php
@@ -31,8 +31,8 @@ class ChangesFeed {
/**
* Constructor
*
- * @param $format String: feed's format (either 'rss' or 'atom')
- * @param $type String: type of feed (for cache keys)
+ * @param string $format feed's format (either 'rss' or 'atom')
+ * @param string $type type of feed (for cache keys)
*/
public function __construct( $format, $type ) {
$this->format = $format;
@@ -42,9 +42,9 @@ class ChangesFeed {
/**
* Get a ChannelFeed subclass object to use
*
- * @param $title String: feed's title
- * @param $description String: feed's description
- * @param $url String: url of origin page
+ * @param string $title feed's title
+ * @param string $description feed's description
+ * @param string $url url of origin page
* @return ChannelFeed subclass or false on failure
*/
public function getFeedObject( $title, $description, $url ) {
@@ -110,9 +110,9 @@ class ChangesFeed {
/**
* Save to feed result to $messageMemc
*
- * @param $feed String: feed's content
- * @param $timekey String: memcached key of the last modification
- * @param $key String: memcached key of the content
+ * @param string $feed feed's content
+ * @param string $timekey memcached key of the last modification
+ * @param string $key memcached key of the content
*/
public function saveToCache( $feed, $timekey, $key ) {
global $messageMemc;
@@ -125,8 +125,8 @@ class ChangesFeed {
* Try to load the feed result from $messageMemc
*
* @param $lastmod Integer: timestamp of the last item in the recentchanges table
- * @param $timekey String: memcached key of the last modification
- * @param $key String: memcached key of the content
+ * @param string $timekey memcached key of the last modification
+ * @param string $key memcached key of the content
* @return string|bool feed's content on cache hit or false on cache miss
*/
public function loadFromCache( $lastmod, $timekey, $key ) {
@@ -135,7 +135,7 @@ class ChangesFeed {
$feedLastmod = $messageMemc->get( $timekey );
if( ( $wgFeedCacheTimeout > 0 ) && $feedLastmod ) {
- /**
+ /**
* If the cached feed was rendered very recently, we may
* go ahead and use it even if there have been edits made
* since it was rendered. This keeps a swarm of requests
diff --git a/includes/ChangesList.php b/includes/ChangesList.php
index 84677124..8461001e 100644
--- a/includes/ChangesList.php
+++ b/includes/ChangesList.php
@@ -30,7 +30,7 @@
*/
class RCCacheEntry extends RecentChange {
var $secureName, $link;
- var $curlink , $difflink, $lastlink, $usertalklink, $versionlink;
+ var $curlink, $difflink, $lastlink, $usertalklink, $versionlink;
var $userlink, $timestamp, $watched;
/**
@@ -60,7 +60,7 @@ class ChangesList extends ContextSource {
protected $message;
/**
- * Changeslist contructor
+ * Changeslist constructor
*
* @param $obj Skin or IContextSource
*/
@@ -80,7 +80,7 @@ class ChangesList extends ContextSource {
* This first argument used to be an User object.
*
* @deprecated in 1.18; use newFromContext() instead
- * @param $unused string|User Unused
+ * @param string|User $unused Unused
* @return ChangesList|EnhancedChangesList|OldChangesList derivative
*/
public static function newFromUser( $unused ) {
@@ -130,13 +130,13 @@ class ChangesList extends ContextSource {
/**
* Returns the appropriate flags for new page, minor change and patrolling
- * @param $flags Array Associative array of 'flag' => Bool
- * @param $nothing String to use for empty space
+ * @param array $flags Associative array of 'flag' => Bool
+ * @param string $nothing to use for empty space
* @return String
*/
protected function recentChangesFlags( $flags, $nothing = '&#160;' ) {
$f = '';
- foreach( array( 'newpage', 'minor', 'bot', 'unpatrolled' ) as $flag ){
+ foreach( array( 'newpage', 'minor', 'bot', 'unpatrolled' ) as $flag ) {
$f .= isset( $flags[$flag] ) && $flags[$flag]
? self::flag( $flag )
: $nothing;
@@ -150,7 +150,7 @@ class ChangesList extends ContextSource {
* unpatrolled edit. By default in English it will contain "N", "m", "b",
* "!" respectively, plus it will have an appropriate title and class.
*
- * @param $flag String: 'newpage', 'unpatrolled', 'minor', or 'bot'
+ * @param string $flag 'newpage', 'unpatrolled', 'minor', or 'bot'
* @return String: Raw HTML
*/
public static function flag( $flag ) {
@@ -217,7 +217,7 @@ class ChangesList extends ContextSource {
$lang = $context->getLanguage();
$code = $lang->getCode();
static $fastCharDiff = array();
- if ( !isset($fastCharDiff[$code]) ) {
+ if ( !isset( $fastCharDiff[$code] ) ) {
$fastCharDiff[$code] = $wgMiserMode || $context->msg( 'rc-change-size' )->plain() === '$1';
}
@@ -286,6 +286,10 @@ class ChangesList extends ContextSource {
}
}
+ /**
+ * @param string $s HTML to update
+ * @param $rc_timestamp mixed
+ */
public function insertDateHeader( &$s, $rc_timestamp ) {
# Make date header if necessary
$date = $this->getLanguage()->userDate( $rc_timestamp, $this->getUser() );
@@ -299,6 +303,11 @@ class ChangesList extends ContextSource {
}
}
+ /**
+ * @param string $s HTML to update
+ * @param $title Title
+ * @param $logtype string
+ */
public function insertLog( &$s, $title, $logtype ) {
$page = new LogPage( $logtype );
$logname = $page->getName()->escaped();
@@ -306,7 +315,7 @@ class ChangesList extends ContextSource {
}
/**
- * @param $s
+ * @param string $s HTML to update
* @param $rc RecentChange
* @param $unpatrolled
*/
@@ -319,7 +328,7 @@ class ChangesList extends ContextSource {
} else {
$query = array(
'curid' => $rc->mAttribs['rc_cur_id'],
- 'diff' => $rc->mAttribs['rc_this_oldid'],
+ 'diff' => $rc->mAttribs['rc_this_oldid'],
'oldid' => $rc->mAttribs['rc_last_oldid']
);
@@ -349,7 +358,7 @@ class ChangesList extends ContextSource {
}
/**
- * @param $s
+ * @param string $s HTML to update
* @param $rc RecentChange
* @param $unpatrolled
* @param $watched
@@ -369,7 +378,7 @@ class ChangesList extends ContextSource {
array( 'class' => 'mw-changeslist-title' ),
$params
);
- if( $this->isDeleted($rc,Revision::DELETED_TEXT) ) {
+ if( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) {
$articlelink = '<span class="history-deleted">' . $articlelink . '</span>';
}
# To allow for boldening pages watched by this user
@@ -378,21 +387,34 @@ class ChangesList extends ContextSource {
$articlelink .= $this->getLanguage()->getDirMark();
wfRunHooks( 'ChangesListInsertArticleLink',
- array(&$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched) );
+ array( &$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched ) );
$s .= " $articlelink";
}
/**
- * @param $s
+ * Get the timestamp from $rc formatted with current user's settings
+ * and a separator
+ *
* @param $rc RecentChange
+ * @return string HTML fragment
*/
- public function insertTimestamp( &$s, $rc ) {
- $s .= $this->message['semicolon-separator'] . '<span class="mw-changeslist-date">' .
+ public function getTimestamp( $rc ) {
+ return $this->message['semicolon-separator'] . '<span class="mw-changeslist-date">' .
$this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . '</span> <span class="mw-changeslist-separator">. .</span> ';
}
/**
+ * Insert time timestamp string from $rc into $s
+ *
+ * @param string $s HTML to update
+ * @param $rc RecentChange
+ */
+ public function insertTimestamp( &$s, $rc ) {
+ $s .= $this->getTimestamp( $rc );
+ }
+
+ /**
* Insert links to user page, user talk page and eventually a blocking link
*
* @param &$s String HTML to update
@@ -435,6 +457,7 @@ class ChangesList extends ContextSource {
return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
}
}
+ return '';
}
/**
@@ -511,15 +534,15 @@ class ChangesList extends ContextSource {
$page = $rc->getTitle();
/** Check for rollback and edit permissions, disallow special pages, and only
* show a link on the top-most revision */
- if ( $this->getUser()->isAllowed('rollback') && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid'] )
+ if ( $this->getUser()->isAllowed( 'rollback' ) && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid'] )
{
$rev = new Revision( array(
- 'id' => $rc->mAttribs['rc_this_oldid'],
- 'user' => $rc->mAttribs['rc_user'],
+ 'title' => $page,
+ 'id' => $rc->mAttribs['rc_this_oldid'],
+ 'user' => $rc->mAttribs['rc_user'],
'user_text' => $rc->mAttribs['rc_user_text'],
- 'deleted' => $rc->mAttribs['rc_deleted']
+ 'deleted' => $rc->mAttribs['rc_deleted']
) );
- $rev->setTitle( $page );
$s .= ' '.Linker::generateRollback( $rev, $this->getContext() );
}
}
@@ -531,16 +554,16 @@ class ChangesList extends ContextSource {
* @param $classes
*/
public function insertTags( &$s, &$rc, &$classes ) {
- if ( empty($rc->mAttribs['ts_tags']) )
+ if ( empty( $rc->mAttribs['ts_tags'] ) )
return;
- list($tagSummary, $newClasses) = ChangeTags::formatSummaryRow( $rc->mAttribs['ts_tags'], 'changeslist' );
+ list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $rc->mAttribs['ts_tags'], 'changeslist' );
$classes = array_merge( $classes, $newClasses );
$s .= ' ' . $tagSummary;
}
public function insertExtra( &$s, &$rc, &$classes ) {
- ## Empty, used for subclassers to add anything special.
+ // Empty, used for subclasses to add anything special.
}
protected function showAsUnpatrolled( RecentChange $rc ) {
@@ -556,7 +579,6 @@ class ChangesList extends ContextSource {
}
}
-
/**
* Generate a list of changes using the good old system (no javascript)
*/
@@ -565,9 +587,10 @@ class OldChangesList extends ChangesList {
* Format a line using the old system (aka without any javascript).
*
* @param $rc RecentChange, passed by reference
- * @param $watched Bool (default false)
- * @param $linenumber Int (default null)
- * @return string
+ * @param bool $watched (default false)
+ * @param int $linenumber (default null)
+ *
+ * @return string|bool
*/
public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
global $wgRCShowChangedSize;
@@ -655,17 +678,19 @@ class OldChangesList extends ChangesList {
}
if( $this->watchlist ) {
- $classes[] = Sanitizer::escapeClass( 'watchlist-'.$rc->mAttribs['rc_namespace'].'-'.$rc->mAttribs['rc_title'] );
+ $classes[] = Sanitizer::escapeClass( 'watchlist-' . $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
}
- wfRunHooks( 'OldChangesListRecentChangesLine', array(&$this, &$s, $rc) );
+ if ( !wfRunHooks( 'OldChangesListRecentChangesLine', array( &$this, &$s, $rc, &$classes ) ) ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
wfProfileOut( __METHOD__ );
- return "$dateheader<li class=\"".implode( ' ', $classes )."\">".$s."</li>\n";
+ return "$dateheader<li class=\"" . implode( ' ', $classes ) . "\">" . $s . "</li>\n";
}
}
-
/**
* Generate a list of changes using an Enhanced system (uses javascript).
*/
@@ -795,7 +820,7 @@ class EnhancedChangesList extends ChangesList {
$lastLink = $this->message['last'];
} else {
$lastLink = Linker::linkKnown( $rc->getTitle(), $this->message['last'],
- array(), $curIdEq + array('diff' => $thisOldid, 'oldid' => $lastOldid) + $rcIdQuery );
+ array(), $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ) + $rcIdQuery );
}
# Make user links
@@ -807,7 +832,7 @@ class EnhancedChangesList extends ChangesList {
}
$rc->lastlink = $lastLink;
- $rc->curlink = $curLink;
+ $rc->curlink = $curLink;
$rc->difflink = $diffLink;
# Put accumulated information into the cache, for later display
@@ -816,10 +841,10 @@ class EnhancedChangesList extends ChangesList {
$secureName = $title->getPrefixedDBkey();
if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
# Use an @ character to prevent collision with page names
- $this->rc_cache['@@' . ($this->rcMoveIndex++)] = array($rc);
+ $this->rc_cache['@@' . ($this->rcMoveIndex++)] = array( $rc );
} else {
# Logs are grouped by type
- if( $type == RC_LOG ){
+ if( $type == RC_LOG ) {
$secureName = SpecialPage::getTitleFor( 'Log', $logType )->getPrefixedDBkey();
}
if( !isset( $this->rc_cache[$secureName] ) ) {
@@ -862,6 +887,8 @@ class EnhancedChangesList extends ChangesList {
# Other properties
$unpatrolled = false;
$isnew = false;
+ $allBots = true;
+ $allMinors = true;
$curId = $currentRevision = 0;
# Some catalyst variables...
$namehidden = true;
@@ -895,7 +922,13 @@ class EnhancedChangesList extends ChangesList {
$currentRevision = $rcObj->mAttribs['rc_this_oldid'];
}
- $bot = $rcObj->mAttribs['rc_bot'];
+ if( !$rcObj->mAttribs['rc_bot'] ) {
+ $allBots = false;
+ }
+ if( !$rcObj->mAttribs['rc_minor'] ) {
+ $allMinors = false;
+ }
+
$userlinks[$u]++;
}
@@ -917,19 +950,19 @@ class EnhancedChangesList extends ChangesList {
implode( $this->message['semicolon-separator'], $users )
)->escaped() . '</span>';
- $tl = '<span class="mw-collapsible-toggle mw-enhancedchanges-arrow"></span>';
+ $tl = '<span class="mw-collapsible-toggle mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>';
$r .= "<td>$tl</td>";
# Main line
$r .= '<td class="mw-enhanced-rc">' . $this->recentChangesFlags( array(
- 'newpage' => $isnew,
- 'minor' => false,
- 'unpatrolled' => $unpatrolled,
- 'bot' => $bot ,
+ 'newpage' => $isnew, # show, when one have this flag
+ 'minor' => $allMinors, # show only, when all have this flag
+ 'unpatrolled' => $unpatrolled, # show, when one have this flag
+ 'bot' => $allBots, # show only, when all have this flag
) );
# Timestamp
- $r .= '&#160;'.$block[0]->timestamp.'&#160;</td><td>';
+ $r .= '&#160;' . $block[0]->timestamp . '&#160;</td><td>';
# Article link
if( $namehidden ) {
@@ -944,7 +977,7 @@ class EnhancedChangesList extends ChangesList {
$queryParams['curid'] = $curId;
# Changes message
- $n = count($block);
+ $n = count( $block );
static $nchanges = array();
if ( !isset( $nchanges[$n] ) ) {
$nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped();
@@ -999,7 +1032,7 @@ class EnhancedChangesList extends ChangesList {
# Character difference (does not apply if only log items)
if( $wgRCShowChangedSize && !$allLogs ) {
$last = 0;
- $first = count($block) - 1;
+ $first = count( $block ) - 1;
# Some events (like logs) have an "empty" size, so we need to skip those...
while( $last < $first && $block[$last]->mAttribs['rc_new_len'] === null ) {
$last++;
@@ -1018,7 +1051,7 @@ class EnhancedChangesList extends ChangesList {
}
$r .= $users;
- $r .= $this->numberofWatchingusers($block[0]->numberofWatchingusers);
+ $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
# Sub-entries
foreach( $block as $rcObj ) {
@@ -1046,7 +1079,7 @@ class EnhancedChangesList extends ChangesList {
$link = $rcObj->timestamp;
# Revision link
} elseif( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
- $link = '<span class="history-deleted">'.$rcObj->timestamp.'</span> ';
+ $link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
} else {
if ( $rcObj->unpatrolled && $type == RC_NEW) {
$params['rcid'] = $rcObj->mAttribs['rc_id'];
@@ -1058,8 +1091,9 @@ class EnhancedChangesList extends ChangesList {
array(),
$params
);
- if( $this->isDeleted($rcObj,Revision::DELETED_TEXT) )
- $link = '<span class="history-deleted">'.$link.'</span> ';
+ if( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
+ $link = '<span class="history-deleted">' . $link . '</span> ';
+ }
}
$r .= $link . '</span>';
@@ -1103,12 +1137,12 @@ class EnhancedChangesList extends ChangesList {
/**
* Generate HTML for an arrow or placeholder graphic
- * @param $dir String: one of '', 'd', 'l', 'r'
- * @param $alt String: text
- * @param $title String: text
+ * @param string $dir one of '', 'd', 'l', 'r'
+ * @param string $alt text
+ * @param string $title text
* @return String: HTML "<img>" tag
*/
- protected function arrow( $dir, $alt='', $title='' ) {
+ protected function arrow( $dir, $alt = '', $title = '' ) {
global $wgStylePath;
$encUrl = htmlspecialchars( $wgStylePath . '/common/images/Arr_' . $dir . '.png' );
$encAlt = htmlspecialchars( $alt );
@@ -1170,7 +1204,7 @@ class EnhancedChangesList extends ChangesList {
$r = Html::openElement( 'table', array( 'class' => $classes ) ) .
Html::openElement( 'tr' );
- $r .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>';
+ $r .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
# Flag and Timestamp
if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
$r .= '&#160;&#160;&#160;&#160;'; // 4 flags -> 4 spaces
@@ -1182,7 +1216,7 @@ class EnhancedChangesList extends ChangesList {
'bot' => $rcObj->mAttribs['rc_bot'],
) );
}
- $r .= '&#160;'.$rcObj->timestamp.'&#160;</td><td>';
+ $r .= '&#160;' . $rcObj->timestamp . '&#160;</td><td>';
# Article or log link
if( $logType ) {
$logPage = new LogPage( $logType );
@@ -1214,7 +1248,7 @@ class EnhancedChangesList extends ChangesList {
if ( $type == RC_LOG ) {
$r .= $this->insertLogEntry( $rcObj );
} else {
- $r .= ' '.$rcObj->userlink . $rcObj->usertalklink;
+ $r .= ' ' . $rcObj->userlink . $rcObj->usertalklink;
$r .= $this->insertComment( $rcObj );
$this->insertRollback( $r, $rcObj );
}
@@ -1222,7 +1256,7 @@ class EnhancedChangesList extends ChangesList {
# Tags
$this->insertTags( $r, $rcObj, $classes );
# Show how many people are watching this if enabled
- $r .= $this->numberofWatchingusers($rcObj->numberofWatchingusers);
+ $r .= $this->numberofWatchingusers( $rcObj->numberofWatchingusers );
$r .= "</td></tr></table>\n";
@@ -1255,7 +1289,7 @@ class EnhancedChangesList extends ChangesList {
wfProfileOut( __METHOD__ );
- return '<div>'.$blockOut.'</div>';
+ return '<div>' . $blockOut . '</div>';
}
/**
diff --git a/includes/Collation.php b/includes/Collation.php
index ad2b94b1..6bba019b 100644
--- a/includes/Collation.php
+++ b/includes/Collation.php
@@ -48,8 +48,12 @@ abstract class Collation {
case 'uca-default':
return new IcuCollation( 'root' );
default:
- # Provide a mechanism for extensions to hook in.
+ $match = array();
+ if ( preg_match( '/^uca-([a-z-]+)$/', $collationName, $match ) ) {
+ return new IcuCollation( $match[1] );
+ }
+ # Provide a mechanism for extensions to hook in.
$collationObject = null;
wfRunHooks( 'Collation::factory', array( $collationName, &$collationObject ) );
@@ -144,18 +148,19 @@ class IdentityCollation extends Collation {
}
}
-
class IcuCollation extends Collation {
+ const FIRST_LETTER_VERSION = 1;
+
var $primaryCollator, $mainCollator, $locale;
var $firstLetterData;
/**
* Unified CJK blocks.
*
- * The same definition of a CJK block must be used for both Collation and
- * generateCollationData.php. These blocks are omitted from the first
- * letter data, as an optimisation measure and because the default UCA table
- * is pretty useless for sorting Chinese text anyway. Japanese and Korean
+ * The same definition of a CJK block must be used for both Collation and
+ * generateCollationData.php. These blocks are omitted from the first
+ * letter data, as an optimisation measure and because the default UCA table
+ * is pretty useless for sorting Chinese text anyway. Japanese and Korean
* blocks are not included here, because they are smaller and more useful.
*/
static $cjkBlocks = array(
@@ -176,11 +181,105 @@ class IcuCollation extends Collation {
array( 0x2F800, 0x2FA1F ), // CJK Compatibility Ideographs Supplement
);
+ /**
+ * Additional characters (or character groups) to be considered separate
+ * letters for given languages, or to be removed from the list of such
+ * letters (denoted by keys starting with '-').
+ *
+ * These are additions to (or subtractions from) the data stored in the
+ * first-letters-root.ser file (which among others includes full basic latin,
+ * cyrillic and greek alphabets).
+ *
+ * "Separate letter" is a letter that would have a separate heading/section
+ * for it in a dictionary or a phone book in this language. This data isn't
+ * used for sorting (the ICU library handles that), only for deciding which
+ * characters (or character groups) to use as headings.
+ *
+ * Initially generated based on the primary level of Unicode collation
+ * tailorings available at http://developer.mimer.com/charts/tailorings.htm ,
+ * later modified.
+ *
+ * Empty arrays are intended; this signifies that the data for the language is
+ * available and that there are, in fact, no additional letters to consider.
+ */
+ static $tailoringFirstLetters = array(
+ // Verified by native speakers
+ 'be' => array( "Ð" ),
+ 'be-tarask' => array( "Ð" ),
+ 'en' => array(),
+ 'fi' => array( "Å", "Ä", "Ö" ),
+ 'hu' => array( "Cs", "Dz", "Dzs", "Gy", "Ly", "Ny", "Ö", "Sz", "Ty", "Ü", "Zs" ),
+ 'it' => array(),
+ 'pl' => array( "Ä„", "Ć", "Ę", "Å", "Ń", "Ó", "Åš", "Ź", "Å»" ),
+ 'pt' => array(),
+ 'ru' => array(),
+ 'sv' => array( "Å", "Ä", "Ö" ),
+ 'uk' => array( "Ò", "Ь" ),
+ 'vi' => array( "Ä‚", "Â", "Ä", "Ê", "Ô", "Æ ", "Ư" ),
+ // Not verified, but likely correct
+ 'af' => array(),
+ 'ast' => array( "Ch", "Ll", "Ñ" ),
+ 'az' => array( "Ç", "Æ", "Äž", "Ä°", "Ö", "Åž", "Ãœ" ),
+ 'bg' => array(),
+ 'br' => array( "Ch", "C'h" ),
+ 'bs' => array( "ÄŒ", "Ć", "Dž", "Ä", "Lj", "Nj", "Å ", "Ž" ),
+ 'ca' => array(),
+ 'co' => array(),
+ 'cs' => array( "Č", "Ch", "Ř", "Š", "Ž" ),
+ 'cy' => array( "Ch", "Dd", "Ff", "Ng", "Ll", "Ph", "Rh", "Th" ),
+ 'da' => array( "Æ", "Ø", "Å" ),
+ 'de' => array(),
+ 'dsb' => array( "ÄŒ", "Ć", "Dź", "Äš", "Ch", "Å", "Ń", "Å”", "Å ", "Åš", "Ž", "Ź" ),
+ 'el' => array(),
+ 'eo' => array( "Ĉ", "Ĝ", "Ĥ", "Ĵ", "Ŝ", "Ŭ" ),
+ 'es' => array( "Ñ" ),
+ 'et' => array( "Š", "Ž", "Õ", "Ä", "Ö", "Ü" ),
+ 'eu' => array( "Ñ" ),
+ 'fo' => array( "Ã", "Ã", "Ã", "Ó", "Ú", "Ã", "Æ", "Ø", "Ã…" ),
+ 'fr' => array(),
+ 'fur' => array( "À", "Ã", "Â", "È", "ÃŒ", "Ã’", "Ù" ),
+ 'fy' => array(),
+ 'ga' => array(),
+ 'gd' => array(),
+ 'gl' => array( "Ch", "Ll", "Ñ" ),
+ 'hr' => array( "ÄŒ", "Ć", "Dž", "Ä", "Lj", "Nj", "Å ", "Ž" ),
+ 'hsb' => array( "ÄŒ", "Dź", "Äš", "Ch", "Å", "Ń", "Ř", "Å ", "Ć", "Ž" ),
+ 'is' => array( "Ã", "Ã", "É", "Ã", "Ó", "Ú", "Ã", "Þ", "Æ", "Ö", "Ã…" ),
+ 'kk' => array( "Ү", "І" ),
+ 'kl' => array( "Æ", "Ø", "Å" ),
+ 'ku' => array( "Ç", "Ê", "Î", "Ş", "Û" ),
+ 'ky' => array( "Ð" ),
+ 'la' => array(),
+ 'lb' => array(),
+ 'lt' => array( "Č", "Š", "Ž" ),
+ 'lv' => array( "Č", "Ģ", "Ķ", "Ļ", "Ņ", "Š", "Ž" ),
+ 'mk' => array(),
+ 'mo' => array( "Ă", "Â", "Î", "Ş", "Ţ" ),
+ 'mt' => array( "Ċ", "Ġ", "Għ", "Ħ", "Ż" ),
+ 'nl' => array(),
+ 'no' => array( "Æ", "Ø", "Å" ),
+ 'oc' => array(),
+ 'rm' => array(),
+ 'ro' => array( "Ă", "Â", "Î", "Ş", "Ţ" ),
+ 'rup' => array( "Ă", "Â", "Î", "Ľ", "Ń", "Ş", "Ţ" ),
+ 'sco' => array(),
+ 'sk' => array( "Ä", "Č", "Ch", "Ô", "Š", "Ž" ),
+ 'sl' => array( "Č", "Š", "Ž" ),
+ 'smn' => array( "Ã", "ÄŒ", "Ä", "ÅŠ", "Å ", "Ŧ", "Ž", "Æ", "Ø", "Ã…", "Ä", "Ö" ),
+ 'sq' => array( "Ç", "Dh", "Ë", "Gj", "Ll", "Nj", "Rr", "Sh", "Th", "Xh", "Zh" ),
+ 'sr' => array(),
+ 'tk' => array( "Ç", "Ä", "Ž", "Ň", "Ö", "Åž", "Ãœ", "Ã" ),
+ 'tl' => array( "Ñ", "Ng" ),
+ 'tr' => array( "Ç", "Ğ", "İ", "Ö", "Ş", "Ü" ),
+ 'tt' => array( "Ó˜", "Ó¨", "Ò®", "Ò–", "Ò¢", "Òº" ),
+ 'uz' => array( "Ch", "G'", "Ng", "O'", "Sh" ),
+ );
+
const RECORD_LENGTH = 14;
function __construct( $locale ) {
if ( !extension_loaded( 'intl' ) ) {
- throw new MWException( 'An ICU collation was requested, ' .
+ throw new MWException( 'An ICU collation was requested, ' .
'but the intl extension is not available.' );
}
$this->locale = $locale;
@@ -218,8 +317,8 @@ class IcuCollation extends Collation {
// Check for CJK
$firstChar = mb_substr( $string, 0, 1, 'UTF-8' );
- if ( ord( $firstChar ) > 0x7f
- && self::isCjk( utf8ToCodepoint( $firstChar ) ) )
+ if ( ord( $firstChar ) > 0x7f
+ && self::isCjk( utf8ToCodepoint( $firstChar ) ) )
{
return $firstChar;
}
@@ -249,25 +348,37 @@ class IcuCollation extends Collation {
$cacheKey = wfMemcKey( 'first-letters', $this->locale );
$cacheEntry = $cache->get( $cacheKey );
- if ( $cacheEntry ) {
+ if ( $cacheEntry && isset( $cacheEntry['version'] )
+ && $cacheEntry['version'] == self::FIRST_LETTER_VERSION )
+ {
$this->firstLetterData = $cacheEntry;
return $this->firstLetterData;
}
// Generate data from serialized data file
- $letters = wfGetPrecompiledData( "first-letters-{$this->locale}.ser" );
- if ( $letters === false ) {
- throw new MWException( "MediaWiki does not support ICU locale " .
- "\"{$this->locale}\"" );
+ if ( isset ( self::$tailoringFirstLetters[$this->locale] ) ) {
+ $letters = wfGetPrecompiledData( "first-letters-root.ser" );
+ // Append additional characters
+ $letters = array_merge( $letters, self::$tailoringFirstLetters[$this->locale] );
+ // Remove unnecessary ones, if any
+ if ( isset( self::$tailoringFirstLetters[ '-' . $this->locale ] ) ) {
+ $letters = array_diff( $letters, self::$tailoringFirstLetters[ '-' . $this->locale ] );
+ }
+ } else {
+ $letters = wfGetPrecompiledData( "first-letters-{$this->locale}.ser" );
+ if ( $letters === false ) {
+ throw new MWException( "MediaWiki does not support ICU locale " .
+ "\"{$this->locale}\"" );
+ }
}
// Sort the letters.
//
// It's impossible to have the precompiled data file properly sorted,
- // because the sort order changes depending on ICU version. If the
- // array is not properly sorted, the binary search will return random
- // results.
+ // because the sort order changes depending on ICU version. If the
+ // array is not properly sorted, the binary search will return random
+ // results.
//
// We also take this opportunity to remove primary collisions.
$letterMap = array();
@@ -284,9 +395,76 @@ class IcuCollation extends Collation {
}
}
ksort( $letterMap, SORT_STRING );
+ // Remove duplicate prefixes. Basically if something has a sortkey
+ // which is a prefix of some other sortkey, then it is an
+ // expansion and probably should not be considered a section
+ // header.
+ //
+ // For example 'þ' is sometimes sorted as if it is the letters
+ // 'th'. Other times it is its own primary element. Another
+ // example is '₨'. Sometimes its a currency symbol. Sometimes it
+ // is an 'R' followed by an 's'.
+ //
+ // Additionally an expanded element should always sort directly
+ // after its first element due to they way sortkeys work.
+ //
+ // UCA sortkey elements are of variable length but no collation
+ // element should be a prefix of some other element, so I think
+ // this is safe. See:
+ // * https://ssl.icu-project.org/repos/icu/icuhtml/trunk/design/collation/ICU_collation_design.htm
+ // * http://site.icu-project.org/design/collation/uca-weight-allocation
+ //
+ // Additionally, there is something called primary compression to
+ // worry about. Basically, if you have two primary elements that
+ // are more than one byte and both start with the same byte then
+ // the first byte is dropped on the second primary. Additionally
+ // either \x03 or \xFF may be added to mean that the next primary
+ // does not start with the first byte of the first primary.
+ //
+ // This shouldn't matter much, as the first primary is not
+ // changed, and that is what we are comparing against.
+ //
+ // tl;dr: This makes some assumptions about how icu implements
+ // collations. It seems incredibly unlikely these assumptions
+ // will change, but nonetheless they are assumptions.
+
+ $prev = false;
+ $duplicatePrefixes = array();
+ foreach( $letterMap as $key => $value ) {
+ // Remove terminator byte. Otherwise the prefix
+ // comparison will get hung up on that.
+ $trimmedKey = rtrim( $key, "\0" );
+ if ( $prev === false || $prev === '' ) {
+ $prev = $trimmedKey;
+ // We don't yet have a collation element
+ // to compare against, so continue.
+ continue;
+ }
+
+ // Due to the fact the array is sorted, we only have
+ // to compare with the element directly previous
+ // to the current element (skipping expansions).
+ // An element "X" will always sort directly
+ // before "XZ" (Unless we have "XY", but we
+ // do not update $prev in that case).
+ if ( substr( $trimmedKey, 0, strlen( $prev ) ) === $prev ) {
+ $duplicatePrefixes[] = $key;
+ // If this is an expansion, we don't want to
+ // compare the next element to this element,
+ // but to what is currently $prev
+ continue;
+ }
+ $prev = $trimmedKey;
+ }
+ foreach( $duplicatePrefixes as $badKey ) {
+ wfDebug( "Removing '{$letterMap[$badKey]}' from first letters." );
+ unset( $letterMap[$badKey] );
+ // This code assumes that unsetting does not change sort order.
+ }
$data = array(
'chars' => array_values( $letterMap ),
- 'keys' => array_keys( $letterMap )
+ 'keys' => array_keys( $letterMap ),
+ 'version' => self::FIRST_LETTER_VERSION,
);
// Reduce memory usage before caching
@@ -320,23 +498,27 @@ class IcuCollation extends Collation {
}
/**
- * Do a binary search, and return the index of the largest item that sorts
+ * Do a binary search, and return the index of the largest item that sorts
* less than or equal to the target value.
*
- * @param $valueCallback array A function to call to get the value with
+ * @param array $valueCallback A function to call to get the value with
* a given array index.
- * @param $valueCount int The number of items accessible via $valueCallback,
+ * @param int $valueCount The number of items accessible via $valueCallback,
* indexed from 0 to $valueCount - 1
- * @param $comparisonCallback array A callback to compare two values, returning
+ * @param array $comparisonCallback A callback to compare two values, returning
* -1, 0 or 1 in the style of strcmp().
- * @param $target string The target value to find.
+ * @param string $target The target value to find.
*
* @return int|bool The item index of the lower bound, or false if the target value
* sorts before all items.
*/
function findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target ) {
+ if ( $valueCount === 0 ) {
+ return false;
+ }
+
$min = 0;
- $max = $valueCount - 1;
+ $max = $valueCount;
do {
$mid = $min + ( ( $max - $min ) >> 1 );
$item = call_user_func( $valueCallback, $mid );
@@ -351,12 +533,15 @@ class IcuCollation extends Collation {
}
} while ( $min < $max - 1 );
- if ( $min == 0 && $max == 0 && $comparison > 0 ) {
- // Before the first item
- return false;
- } else {
- return $min;
+ if ( $min == 0 ) {
+ $item = call_user_func( $valueCallback, $min );
+ $comparison = call_user_func( $comparisonCallback, $target, $item );
+ if ( $comparison < 0 ) {
+ // Before the first item
+ return false;
+ }
}
+ return $min;
}
static function isCjk( $codepoint ) {
@@ -367,5 +552,55 @@ class IcuCollation extends Collation {
}
return false;
}
-}
+ /**
+ * Return the version of ICU library used by PHP's intl extension,
+ * or false when the extension is not installed of the version
+ * can't be determined.
+ *
+ * The constant INTL_ICU_VERSION this function refers to isn't really
+ * documented. It is available since PHP 5.3.7 (see PHP bug 54561).
+ * This function will return false on older PHPs.
+ *
+ * @since 1.21
+ * @return string|false
+ */
+ static function getICUVersion() {
+ return defined( 'INTL_ICU_VERSION' ) ? INTL_ICU_VERSION : false;
+ }
+
+ /**
+ * Return the version of Unicode appropriate for the version of ICU library
+ * currently in use, or false when it can't be determined.
+ *
+ * @since 1.21
+ * @return string|false
+ */
+ static function getUnicodeVersionForICU() {
+ $icuVersion = IcuCollation::getICUVersion();
+ if ( !$icuVersion ) {
+ return false;
+ }
+
+ $versionPrefix = substr( $icuVersion, 0, 3 );
+ // Source: http://site.icu-project.org/download
+ $map = array(
+ '50.' => '6.2',
+ '49.' => '6.1',
+ '4.8' => '6.0',
+ '4.6' => '6.0',
+ '4.4' => '5.2',
+ '4.2' => '5.1',
+ '4.0' => '5.1',
+ '3.8' => '5.0',
+ '3.6' => '5.0',
+ '3.4' => '4.1',
+ );
+
+ if ( isset( $map[$versionPrefix] ) ) {
+ return $map[$versionPrefix];
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/includes/ConfEditor.php b/includes/ConfEditor.php
index b68fc762..1d9ca921 100644
--- a/includes/ConfEditor.php
+++ b/includes/ConfEditor.php
@@ -66,7 +66,6 @@ class ConfEditor {
*/
var $stateStack;
-
/**
* The path stack is a stack of associative arrays with the following elements:
* name The name of top level of the path
@@ -128,7 +127,7 @@ class ConfEditor {
/**
* Edit the text. Returns the edited text.
- * @param $ops Array of operations.
+ * @param array $ops of operations.
*
* Operations are given as an associative array, with members:
* type: One of delete, set, append or insert (required)
@@ -159,6 +158,7 @@ class ConfEditor {
* insert
* Insert a new element at the start of the array.
*
+ * @throws MWException
* @return string
*/
public function edit( $ops ) {
@@ -306,7 +306,7 @@ class ConfEditor {
* setVar( $arr, 'foo/bar', 'baz', 3 ); will set
* $arr['foo']['bar']['baz'] = 3;
* @param $array array
- * @param $path string slash-delimited path
+ * @param string $path slash-delimited path
* @param $key mixed Key
* @param $value mixed Value
*/
@@ -392,6 +392,8 @@ class ConfEditor {
* Finds the source byte region which you would want to delete, if $pathName
* was to be deleted. Includes the leading spaces and tabs, the trailing line
* break, and any comments in between.
+ * @param $pathName
+ * @throws MWException
* @return array
*/
function findDeletionRegion( $pathName ) {
@@ -450,6 +452,8 @@ class ConfEditor {
* or semicolon.
*
* The end position is the past-the-end (end + 1) value as per convention.
+ * @param $pathName
+ * @throws MWException
* @return array
*/
function findValueRegion( $pathName ) {
@@ -1055,6 +1059,7 @@ class ConfEditorParseError extends MWException {
return "$line\n" .str_repeat( ' ', $this->colNum - 1 ) . "^\n";
}
}
+ return '';
}
}
@@ -1089,4 +1094,3 @@ class ConfEditorToken {
return $this->type == 'END';
}
}
-
diff --git a/includes/Cookie.php b/includes/Cookie.php
index 7984d63e..27a85072 100644
--- a/includes/Cookie.php
+++ b/includes/Cookie.php
@@ -40,14 +40,15 @@ class Cookie {
/**
* Sets a cookie. Used before a request to set up any individual
- * cookies. Used internally after a request to parse the
+ * cookies. Used internally after a request to parse the
* Set-Cookie headers.
*
- * @param $value String: the value of the cookie
- * @param $attr Array: possible key/values:
- * expires A date string
- * path The path this cookie is used on
- * domain Domain this cookie is used on
+ * @param string $value the value of the cookie
+ * @param array $attr possible key/values:
+ * expires A date string
+ * path The path this cookie is used on
+ * domain Domain this cookie is used on
+ * @throws MWException
*/
public function set( $value, $attr ) {
$this->value = $value;
@@ -83,8 +84,8 @@ class Cookie {
* @todo fixme fails to detect 3-letter top-level domains
* @todo fixme fails to detect 2-letter top-level domains for single-domain use (probably not a big problem in practice, but there are test cases)
*
- * @param $domain String: the domain to validate
- * @param $originDomain String: (optional) the domain the cookie originates from
+ * @param string $domain the domain to validate
+ * @param string $originDomain (optional) the domain the cookie originates from
* @return Boolean
*/
public static function validateCookieDomain( $domain, $originDomain = null ) {
@@ -112,7 +113,7 @@ class Cookie {
}
// Don't allow cookies for "co.uk" or "gov.uk", etc, but allow "supermarket.uk"
- if ( strrpos( $domain, "." ) - strlen( $domain ) == -3 ) {
+ if ( strrpos( $domain, "." ) - strlen( $domain ) == -3 ) {
if ( ( count( $dc ) == 2 && strlen( $dc[0] ) <= 2 )
|| ( count( $dc ) == 3 && strlen( $dc[0] ) == "" && strlen( $dc[1] ) <= 2 ) ) {
return false;
@@ -141,8 +142,8 @@ class Cookie {
/**
* Serialize the cookie jar into a format useful for HTTP Request headers.
*
- * @param $path String: the path that will be used. Required.
- * @param $domain String: the domain that will be used. Required.
+ * @param string $path the path that will be used. Required.
+ * @param string $domain the domain that will be used. Required.
* @return String
*/
public function serializeToHttpRequest( $path, $domain ) {
@@ -164,8 +165,8 @@ class Cookie {
protected function canServeDomain( $domain ) {
if ( $domain == $this->domain
|| ( strlen( $domain ) > strlen( $this->domain )
- && substr( $this->domain, 0, 1 ) == '.'
- && substr_compare( $domain, $this->domain, -strlen( $this->domain ),
+ && substr( $this->domain, 0, 1 ) == '.'
+ && substr_compare( $domain, $this->domain, -strlen( $this->domain ),
strlen( $this->domain ), true ) == 0 ) ) {
return true;
}
@@ -193,7 +194,7 @@ class CookieJar {
private $cookie = array();
/**
- * Set a cookie in the cookie jar. Make sure only one cookie per-name exists.
+ * Set a cookie in the cookie jar. Make sure only one cookie per-name exists.
* @see Cookie::set()
*/
public function setCookie ( $name, $value, $attr ) {
@@ -231,7 +232,7 @@ class CookieJar {
* Parse the content of an Set-Cookie HTTP Response header.
*
* @param $cookie String
- * @param $domain String: cookie's domain
+ * @param string $domain cookie's domain
* @return null
*/
public function parseCookieResponseHeader ( $cookie, $domain ) {
diff --git a/includes/CryptRand.php b/includes/CryptRand.php
index 858eebf2..d0305d8b 100644
--- a/includes/CryptRand.php
+++ b/includes/CryptRand.php
@@ -79,7 +79,7 @@ class MWCryptRand {
// Include some information about the filesystem's current state in the random state
$files = array();
- // We know this file is here so grab some info about ourself
+ // We know this file is here so grab some info about ourselves
$files[] = __FILE__;
// We must also have a parent folder, and with the usual file structure, a grandparent
@@ -106,7 +106,11 @@ class MWCryptRand {
}
}
// The absolute filename itself will differ from install to install so don't leave it out
- $state .= realpath( $file );
+ if( ( $path = realpath( $file ) ) !== false ) {
+ $state .= $path;
+ } else {
+ $state .= $file;
+ }
$state .= implode( '', $stat );
} else {
// The fact that the file isn't there is worth at least a
@@ -144,7 +148,7 @@ class MWCryptRand {
/**
* Randomly hash data while mixing in clock drift data for randomness
*
- * @param $data string The data to randomly hash.
+ * @param string $data The data to randomly hash.
* @return String The hashed bytes
* @author Tim Starling
*/
@@ -158,7 +162,7 @@ class MWCryptRand {
$buffer = str_repeat( ' ', $bufLength );
$bufPos = 0;
- // Iterate for $duration seconds or at least $minIerations number of iterations
+ // Iterate for $duration seconds or at least $minIterations number of iterations
$iterations = 0;
$startTime = microtime( true );
$currentTime = $startTime;
@@ -391,7 +395,7 @@ class MWCryptRand {
// We hash the random state with more salt to avoid the state from leaking
// out and being used to predict the /randomness/ that follows.
if ( strlen( $buffer ) < $bytes ) {
- wfDebug( __METHOD__ . ": Falling back to using a pseudo random state to generate randomness.\n" );
+ wfDebug( __METHOD__ . ": Falling back to using a pseudo random state to generate randomness.\n" );
}
while ( strlen( $buffer ) < $bytes ) {
wfProfileIn( __METHOD__ . '-fallback' );
@@ -464,8 +468,8 @@ class MWCryptRand {
* You can use MWCryptRand::wasStrong() if you wish to know if the source used
* was cryptographically strong.
*
- * @param $bytes int the number of bytes of random data to generate
- * @param $forceStrong bool Pass true if you want generate to prefer cryptographically
+ * @param int $bytes the number of bytes of random data to generate
+ * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
* strong sources of entropy even if reading from them may steal
* more entropy from the system than optimal.
* @return String Raw binary random data
@@ -480,8 +484,8 @@ class MWCryptRand {
* You can use MWCryptRand::wasStrong() if you wish to know if the source used
* was cryptographically strong.
*
- * @param $chars int the number of hex chars of random data to generate
- * @param $forceStrong bool Pass true if you want generate to prefer cryptographically
+ * @param int $chars the number of hex chars of random data to generate
+ * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
* strong sources of entropy even if reading from them may steal
* more entropy from the system than optimal.
* @return String Hexadecimal random data
diff --git a/includes/DataUpdate.php b/includes/DataUpdate.php
index 377b64c0..c1076b23 100644
--- a/includes/DataUpdate.php
+++ b/includes/DataUpdate.php
@@ -34,7 +34,7 @@ abstract class DataUpdate implements DeferrableUpdate {
/**
* Constructor
*/
- public function __construct( ) {
+ public function __construct() {
# noop
}
@@ -67,15 +67,15 @@ abstract class DataUpdate implements DeferrableUpdate {
*
* This methods supports transactions logic by first calling beginTransaction()
* on all updates in the array, then calling doUpdate() on each, and, if all goes well,
- * then calling commitTransaction() on each update. If an error occurrs,
- * rollbackTransaction() will be called on any update object that had beginTranscation()
+ * then calling commitTransaction() on each update. If an error occurs,
+ * rollbackTransaction() will be called on any update object that had beginTransaction()
* called but not yet commitTransaction().
*
* This allows for limited transactional logic across multiple backends for storing
* secondary data.
*
- * @static
- * @param $updates array a list of DataUpdate instances
+ * @param array $updates a list of DataUpdate instances
+ * @throws Exception|null
*/
public static function runUpdates( $updates ) {
if ( empty( $updates ) ) return; # nothing to do
diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php
index 710605ad..9d024c86 100644
--- a/includes/DefaultSettings.php
+++ b/includes/DefaultSettings.php
@@ -47,7 +47,7 @@
* This is not a valid entry point, perform no further processing unless
* MEDIAWIKI is defined
*/
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
echo "This file is part of MediaWiki and is not a valid entry point\n";
die( 1 );
}
@@ -55,13 +55,19 @@ if( !defined( 'MEDIAWIKI' ) ) {
/**
* wgConf hold the site configuration.
* Not used for much in a default install.
+ * @since 1.5
*/
$wgConf = new SiteConfiguration;
-/** MediaWiki version number */
-$wgVersion = '1.20.6';
+/**
+ * MediaWiki version number
+ * @since 1.2
+ */
+$wgVersion = '1.21.1';
-/** Name of the site. It must be changed in LocalSettings.php */
+/**
+ * Name of the site. It must be changed in LocalSettings.php
+ */
$wgSitename = 'MediaWiki';
/**
@@ -87,6 +93,7 @@ $wgServer = WebRequest::detectServer();
* Must be fully qualified, even if $wgServer is protocol-relative.
*
* Defaults to $wgServer, expanded to a fully qualified http:// URL if needed.
+ * @since 1.18
*/
$wgCanonicalServer = false;
@@ -104,7 +111,7 @@ $wgCanonicalServer = false;
* Other paths will be set to defaults based on it unless they are directly
* set in LocalSettings.php
*/
-$wgScriptPath = '/wiki';
+$wgScriptPath = '/wiki';
/**
* Whether to support URLs like index.php/Page_title These often break when PHP
@@ -121,11 +128,11 @@ $wgScriptPath = '/wiki';
* The default $wgArticlePath will be set based on this value at runtime, but if
* you have customized it, having this incorrectly set to true can cause
* redirect loops when "pretty URLs" are used.
+ * @since 1.2.1
*/
-$wgUsePathInfo =
- ( strpos( php_sapi_name(), 'cgi' ) === false ) &&
- ( strpos( php_sapi_name(), 'apache2filter' ) === false ) &&
- ( strpos( php_sapi_name(), 'isapi' ) === false );
+$wgUsePathInfo = ( strpos( PHP_SAPI, 'cgi' ) === false ) &&
+ ( strpos( PHP_SAPI, 'apache2filter' ) === false ) &&
+ ( strpos( PHP_SAPI, 'isapi' ) === false );
/**
* The extension to append to script names by default. This can either be .php
@@ -133,9 +140,9 @@ $wgUsePathInfo =
*
* Some hosting providers use PHP 4 for *.php files, and PHP 5 for *.php5. This
* variable is provided to support those providers.
+ * @since 1.11
*/
-$wgScriptExtension = '.php';
-
+$wgScriptExtension = '.php';
/**@}*/
@@ -176,12 +183,14 @@ $wgRedirectScript = false;
* The URL path to load.php.
*
* Defaults to "{$wgScriptPath}/load{$wgScriptExtension}".
+ * @since 1.17
*/
$wgLoadScript = false;
/**
* The URL path of the skins directory.
* Defaults to "{$wgScriptPath}/skins".
+ * @since 1.3
*/
$wgStylePath = false;
$wgStyleSheetPath = &$wgStylePath;
@@ -189,6 +198,7 @@ $wgStyleSheetPath = &$wgStylePath;
/**
* The URL path of the skins directory. Should not point to an external domain.
* Defaults to "{$wgScriptPath}/skins".
+ * @since 1.17
*/
$wgLocalStylePath = false;
@@ -202,6 +212,7 @@ $wgExtensionAssetsPath = false;
/**
* Filesystem stylesheets directory.
* Defaults to "{$IP}/skins".
+ * @since 1.3
*/
$wgStyleDirectory = false;
@@ -239,12 +250,14 @@ $wgLogo = false;
/**
* The URL path of the shortcut icon.
+ * @since 1.6
*/
$wgFavicon = '/favicon.ico';
/**
* The URL path of the icon for iPhone and iPod Touch web app bookmarks.
* Defaults to no icon.
+ * @since 1.12
*/
$wgAppleTouchIcon = false;
@@ -268,6 +281,7 @@ $wgTmpDirectory = false;
/**
* If set, this URL is added to the start of $wgUploadPath to form a complete
* upload URL.
+ * @since 1.4
*/
$wgUploadBaseUrl = '';
@@ -276,6 +290,7 @@ $wgUploadBaseUrl = '';
* Full thumbnail URL will be like $wgUploadStashScalerBaseUrl/e/e6/Foo.jpg/123px-Foo.jpg
* where 'e6' are the first two characters of the MD5 hash of the file name.
* If $wgUploadStashScalerBaseUrl is set to false, thumbs are rendered locally as needed.
+ * @since 1.17
*/
$wgUploadStashScalerBaseUrl = false;
@@ -291,6 +306,7 @@ $wgUploadStashScalerBaseUrl = false;
*
* There must be an appropriate script or rewrite rule in place to handle these
* URLs.
+ * @since 1.5
*/
$wgActionPaths = array();
@@ -313,6 +329,20 @@ $wgUploadStashMaxAge = 6 * 3600; // 6 hours
$wgAllowImageMoving = true;
/**
+ * Enable deferred upload tasks that use the job queue.
+ * Only enable this if job runners are set up for both the
+ * 'AssembleUploadChunks' and 'PublishStashedFile' job types.
+ */
+$wgEnableAsyncUploads = false;
+
+/**
+ * Allow chunked uploads. This should only really be needed if you
+ * use the UploadWizard extension or allow huge file uploads.
+ * https://www.mediawiki.org/wiki/API:Upload#Chunked_uploading
+ */
+$wgAllowChunkedUploads = false;
+
+/**
* These are additional characters that should be replaced with '-' in filenames
*/
$wgIllegalFileChars = ":";
@@ -353,7 +383,7 @@ $wgImgAuthPublicTest = true;
* FSRepo is also supported for backwards compatibility.
*
* - name A unique name for the repository (but $wgLocalFileRepo should be 'local').
- * The name should consist of alpha-numberic characters.
+ * The name should consist of alpha-numeric characters.
* - backend A file backend name (see $wgFileBackends).
*
* For most core repos:
@@ -361,7 +391,9 @@ $wgImgAuthPublicTest = true;
* container : backend container name the zone is in
* directory : root path within container for the zone
* url : base URL to the root of the zone
- * handlerUrl : base script handled URL to the root of the zone
+ * urlsByExt : map of file extension types to base URLs
+ * (useful for using a different cache for videos)
+ * handlerUrl : base script-handled URL to the root of the zone
* (see FileRepo::getZoneHandlerUrl() function)
* Zones default to using "<repo name>-<zone name>" as the container name
* and default to using the container root as the zone's root directory.
@@ -405,7 +437,7 @@ $wgImgAuthPublicTest = true;
*
* ForeignDBRepo:
* - dbType, dbServer, dbUser, dbPassword, dbName, dbFlags
- * equivalent to the corresponding member of $wgDBservers
+ * equivalent to the corresponding member of $wgDBservers
* - tablePrefix Table prefix, the foreign wiki's $wgDBprefix
* - hasSharedCache True if the wiki's shared cache is accessible via the local $wgMemc
*
@@ -416,7 +448,7 @@ $wgImgAuthPublicTest = true;
* If you leave $wgLocalFileRepo set to false, Setup will fill in appropriate values.
* Otherwise, set $wgLocalFileRepo to a repository structure as described above.
* If you set $wgUseInstantCommons to true, it will add an entry for Commons.
- * If you set $wgForeignFileRepos to an array of repostory structures, those will
+ * If you set $wgForeignFileRepos to an array of repository structures, those will
* be searched after the local file repo.
* Otherwise, you will only have access to local media files.
*
@@ -436,14 +468,34 @@ $wgUseInstantCommons = false;
/**
* File backend structure configuration.
+ *
* This is an array of file backend configuration arrays.
* Each backend configuration has the following parameters:
- * - 'name' : A unique name for the backend
- * - 'class' : The file backend class to use
- * - 'wikiId' : A unique string that identifies the wiki (container prefix)
- * - 'lockManager' : The name of a lock manager (see $wgLockManagers)
- *
- * Additional parameters are specific to the class used.
+ * - 'name' : A unique name for the backend
+ * - 'class' : The file backend class to use
+ * - 'wikiId' : A unique string that identifies the wiki (container prefix)
+ * - 'lockManager' : The name of a lock manager (see $wgLockManagers)
+ *
+ * See FileBackend::__construct() for more details.
+ * Additional parameters are specific to the file backend class used.
+ * These settings should be global to all wikis when possible.
+ *
+ * There are two particularly important aspects about each backend:
+ * - a) Whether it is fully qualified or wiki-relative.
+ * By default, the paths of files are relative to the current wiki,
+ * which works via prefixing them with the current wiki ID when accessed.
+ * Setting 'wikiId' forces the backend to be fully qualified by prefixing
+ * all paths with the specified value instead. This can be useful if
+ * multiple wikis need to share the same data. Note that 'name' is *not*
+ * part of any prefix and thus should not be relied upon for namespacing.
+ * - b) Whether it is only defined for some wikis or is defined on all
+ * wikis in the wiki farm. Defining a backend globally is useful
+ * if multiple wikis need to share the same data.
+ * One should be aware of these aspects when configuring a backend for use with
+ * any basic feature or plugin. For example, suppose an extension stores data for
+ * different wikis in different directories and sometimes needs to access data from
+ * a foreign wiki's directory in order to render a page on given wiki. The extension
+ * would need a fully qualified backend that is defined on all wikis in the wiki farm.
*/
$wgFileBackends = array();
@@ -452,7 +504,10 @@ $wgFileBackends = array();
* Each backend configuration has the following parameters:
* - 'name' : A unique name for the lock manager
* - 'class' : The lock manger class to use
- * Additional parameters are specific to the class used.
+ *
+ * See LockManager::__construct() for more details.
+ * Additional parameters are specific to the lock manager class used.
+ * These settings should be global to all wikis.
*/
$wgLockManagers = array();
@@ -531,6 +586,13 @@ $wgAllowAsyncCopyUploads = false;
$wgCopyUploadsDomains = array();
/**
+ * Enable copy uploads from Special:Upload. $wgAllowCopyUploads must also be
+ * true. If $wgAllowCopyUploads is true, but this is false, you will only be
+ * able to perform copy uploads from the API or extensions (e.g. UploadWizard).
+ */
+$wgCopyUploadsFromSpecialUpload = false;
+
+/**
* Proxy to use for copy upload requests.
* @since 1.20
*/
@@ -553,7 +615,7 @@ $wgCopyUploadProxy = false;
* will have a maximum of 500 kB.
*
*/
-$wgMaxUploadSize = 1024*1024*100; # 100MB
+$wgMaxUploadSize = 1024 * 1024 * 100; # 100MB
/**
* Point the upload navigation link to an external URL
@@ -654,7 +716,7 @@ $wgFileBlacklist = array(
*/
$wgMimeTypeBlacklist = array(
# HTML may contain cookie-stealing JavaScript and web bugs
- 'text/html', 'text/javascript', 'text/x-javascript', 'application/x-shellscript',
+ 'text/html', 'text/javascript', 'text/x-javascript', 'application/x-shellscript',
# PHP scripts may execute arbitrary code on the server
'application/x-php', 'text/x-php',
# Other types that may be interpreted by some servers
@@ -712,10 +774,10 @@ $wgUploadSizeWarning = false;
*/
$wgTrustedMediaFormats = array(
MEDIATYPE_BITMAP, //all bitmap formats
- MEDIATYPE_AUDIO, //all audio formats
- MEDIATYPE_VIDEO, //all plain video formats
- "image/svg+xml", //svg (only needed if inline rendering of svg is not supported)
- "application/pdf", //PDF files
+ MEDIATYPE_AUDIO, //all audio formats
+ MEDIATYPE_VIDEO, //all plain video formats
+ "image/svg+xml", //svg (only needed if inline rendering of svg is not supported)
+ "application/pdf", //PDF files
#"application/x-shockwave-flash", //flash/shockwave movie
);
@@ -724,18 +786,35 @@ $wgTrustedMediaFormats = array(
* Each entry in the array maps a MIME type to a class name
*/
$wgMediaHandlers = array(
- 'image/jpeg' => 'JpegHandler',
- 'image/png' => 'PNGHandler',
- 'image/gif' => 'GIFHandler',
- 'image/tiff' => 'TiffHandler',
+ 'image/jpeg' => 'JpegHandler',
+ 'image/png' => 'PNGHandler',
+ 'image/gif' => 'GIFHandler',
+ 'image/tiff' => 'TiffHandler',
'image/x-ms-bmp' => 'BmpHandler',
- 'image/x-bmp' => 'BmpHandler',
- 'image/x-xcf' => 'XCFHandler',
- 'image/svg+xml' => 'SvgHandler', // official
- 'image/svg' => 'SvgHandler', // compat
+ 'image/x-bmp' => 'BmpHandler',
+ 'image/x-xcf' => 'XCFHandler',
+ 'image/svg+xml' => 'SvgHandler', // official
+ 'image/svg' => 'SvgHandler', // compat
'image/vnd.djvu' => 'DjVuHandler', // official
- 'image/x.djvu' => 'DjVuHandler', // compat
- 'image/x-djvu' => 'DjVuHandler', // compat
+ 'image/x.djvu' => 'DjVuHandler', // compat
+ 'image/x-djvu' => 'DjVuHandler', // compat
+);
+
+/**
+ * Plugins for page content model handling.
+ * Each entry in the array maps a model id to a class name.
+ *
+ * @since 1.21
+ */
+$wgContentHandlers = array(
+ // the usual case
+ CONTENT_MODEL_WIKITEXT => 'WikitextContentHandler',
+ // dumb version, no syntax highlighting
+ CONTENT_MODEL_JAVASCRIPT => 'JavaScriptContentHandler',
+ // dumb version, no syntax highlighting
+ CONTENT_MODEL_CSS => 'CssContentHandler',
+ // plain text, for use by extensions etc
+ CONTENT_MODEL_TEXT => 'TextContentHandler',
);
/**
@@ -778,6 +857,13 @@ $wgImageMagickTempDir = false;
*/
$wgCustomConvertCommand = false;
+/** used for lossless jpeg rotation
+ *
+ * @since 1.21
+ * **/
+$wgJpegTran = '/usr/bin/jpegtran';
+
+
/**
* Some tests and extensions use exiv2 to manipulate the EXIF metadata in some
* image formats.
@@ -798,10 +884,10 @@ $wgSVGConverters = array(
'sodipodi' => '$path/sodipodi -z -w $width -f $input -e $output',
'inkscape' => '$path/inkscape -z -w $width -f $input -e $output',
'batik' => 'java -Djava.awt.headless=true -jar $path/batik-rasterizer.jar -w $width -d $output $input',
- 'rsvg' => '$path/rsvg -w$width -h$height $input $output',
+ 'rsvg' => '$path/rsvg -w $width -h $height $input $output',
'imgserv' => '$path/imgserv-wrapper -i svg -o png -w$width $input $output',
'ImagickExt' => array( 'SvgHandler::rasterizeImagickExt' ),
- );
+);
/** Pick a converter defined in $wgSVGConverters */
$wgSVGConverter = 'ImageMagick';
@@ -864,7 +950,7 @@ $wgMaxAnimatedGifArea = 1.25e7;
* $wgTiffThumbnailType = array( 'jpg', 'image/jpeg' );
* @endcode
*/
- $wgTiffThumbnailType = false;
+$wgTiffThumbnailType = false;
/**
* If rendered thumbnail files are older than this timestamp, they
@@ -897,8 +983,8 @@ $wgIgnoreImageErrors = false;
$wgGenerateThumbnailOnParse = true;
/**
-* Show thumbnails for old images on the image description page
-*/
+ * Show thumbnails for old images on the image description page
+ */
$wgShowArchiveThumbnails = true;
/** Obsolete, always true, kept for compatibility with extensions */
@@ -912,7 +998,7 @@ $wgUseImageResize = true;
$wgEnableAutoRotation = null;
/**
- * Internal name of virus scanner. This servers as a key to the
+ * Internal name of virus scanner. This serves as a key to the
* $wgAntivirusSetup array. Set this to NULL to disable virus scanning. If not
* null, every file uploaded will be scanned for viruses.
*/
@@ -930,7 +1016,7 @@ $wgAntivirus = null;
* "command" is the full command to call the virus scanner - %f will be
* replaced with the name of the file to scan. If not present, the filename
* will be appended to the command. Note that this must be overwritten if the
- * scanner is not in the system path; in that case, plase set
+ * scanner is not in the system path; in that case, please set
* $wgAntivirusSetup[$wgAntivirus]['command'] to the desired command with full
* path.
*
@@ -940,8 +1026,8 @@ $wgAntivirus = null;
* the scan to be failed. This will pass the file if $wgAntivirusRequired
* is not set.
* - An exit code mapped to AV_SCAN_ABORTED causes the function to consider
- * the file to have an usupported format, which is probably imune to
- * virusses. This causes the file to pass.
+ * the file to have an unsupported format, which is probably immune to
+ * viruses. This causes the file to pass.
* - An exit code mapped to AV_NO_VIRUS will cause the file to pass, meaning
* no virus was found.
* - All other codes (like AV_VIRUS_FOUND) will cause the function to report
@@ -955,21 +1041,18 @@ $wgAntivirus = null;
$wgAntivirusSetup = array(
#setup for clamav
- 'clamav' => array (
- 'command' => "clamscan --no-summary ",
-
- 'codemap' => array (
- "0" => AV_NO_VIRUS, # no virus
- "1" => AV_VIRUS_FOUND, # virus found
- "52" => AV_SCAN_ABORTED, # unsupported file format (probably imune)
- "*" => AV_SCAN_FAILED, # else scan failed
+ 'clamav' => array(
+ 'command' => 'clamscan --no-summary ',
+ 'codemap' => array(
+ "0" => AV_NO_VIRUS, # no virus
+ "1" => AV_VIRUS_FOUND, # virus found
+ "52" => AV_SCAN_ABORTED, # unsupported file format (probably immune)
+ "*" => AV_SCAN_FAILED, # else scan failed
),
-
'messagepattern' => '/.*?:(.*)/sim',
),
);
-
/** Determines if a failed virus scan (AV_SCAN_FAILED) will cause the file to be rejected. */
$wgAntivirusRequired = true;
@@ -977,13 +1060,13 @@ $wgAntivirusRequired = true;
$wgVerifyMimeType = true;
/** Sets the mime type definition file to use by MimeMagic.php. */
-$wgMimeTypeFile = "includes/mime.types";
-#$wgMimeTypeFile= "/etc/mime.types";
-#$wgMimeTypeFile= null; #use built-in defaults only.
+$wgMimeTypeFile = 'includes/mime.types';
+#$wgMimeTypeFile = '/etc/mime.types';
+#$wgMimeTypeFile = null; #use built-in defaults only.
/** Sets the mime type info file to use by MimeMagic.php. */
-$wgMimeInfoFile= "includes/mime.info";
-#$wgMimeInfoFile= null; #use built-in defaults only.
+$wgMimeInfoFile = 'includes/mime.info';
+#$wgMimeInfoFile = null; #use built-in defaults only.
/**
* Switch for loading the FileInfo extension by PECL at runtime.
@@ -1016,11 +1099,11 @@ $wgTrivialMimeDetection = false;
* array = ( 'rootElement' => 'associatedMimeType' )
*/
$wgXMLMimeTypes = array(
- 'http://www.w3.org/2000/svg:svg' => 'image/svg+xml',
- 'svg' => 'image/svg+xml',
+ 'http://www.w3.org/2000/svg:svg' => 'image/svg+xml',
+ 'svg' => 'image/svg+xml',
'http://www.lysator.liu.se/~alla/dia/:diagram' => 'application/x-dia-diagram',
- 'http://www.w3.org/1999/xhtml:html' => 'text/html', // application/xhtml+xml?
- 'html' => 'text/html', // application/xhtml+xml?
+ 'http://www.w3.org/1999/xhtml:html' => 'text/html', // application/xhtml+xml?
+ 'html' => 'text/html', // application/xhtml+xml?
);
/**
@@ -1056,7 +1139,7 @@ $wgThumbLimits = array(
/**
* Default parameters for the "<gallery>" tag
*/
-$wgGalleryOptions = array (
+$wgGalleryOptions = array(
'imagesPerRow' => 0, // Default number of images per-row in the gallery. 0 -> Adapt to screensize
'imageWidth' => 120, // Width of the cells containing images in galleries (in "px")
'imageHeight' => 120, // Height of the cells containing images in galleries (in "px")
@@ -1077,6 +1160,16 @@ $wgThumbUpright = 0.75;
$wgDirectoryMode = 0777;
/**
+ * Generate and use thumbnails suitable for screens with 1.5 and 2.0 pixel densities.
+ *
+ * This means a 320x240 use of an image on the wiki will also generate 480x360 and 640x480
+ * thumbnails, output via data-src-1-5 and data-src-2-0. Runtime JavaScript switches the
+ * images in after loading the original low-resolution versions depending on the reported
+ * window.devicePixelRatio.
+ */
+$wgResponsiveImages = true;
+
+/**
* @name DJVU settings
* @{
*/
@@ -1182,7 +1275,7 @@ $wgEnableUserEmail = true;
* instead of From. ($wgEmergencyContact will be used as From.)
*
* Some mailers (eg sSMTP) set the SMTP envelope sender to the From value,
- * which can cause problems with SPF validation and leak recipient addressses
+ * which can cause problems with SPF validation and leak recipient addresses
* when bounces are sent to the sender.
*/
$wgUserEmailUseReplyTo = false;
@@ -1211,12 +1304,12 @@ $wgUserEmailConfirmationTokenExpiry = 7 * 24 * 60 * 60;
*
* @code
* $wgSMTP = array(
- * 'host' => 'SMTP domain',
- * 'IDHost' => 'domain for MessageID',
- * 'port' => '25',
- * 'auth' => [true|false],
- * 'username' => [SMTP username],
- * 'password' => [SMTP password],
+ * 'host' => 'SMTP domain',
+ * 'IDHost' => 'domain for MessageID',
+ * 'port' => '25',
+ * 'auth' => [true|false],
+ * 'username' => [SMTP username],
+ * 'password' => [SMTP password],
* );
* @endcode
*/
@@ -1229,6 +1322,12 @@ $wgSMTP = false;
$wgAdditionalMailParams = null;
/**
+ * For parts of the system that have been updated to provide HTML email content, send
+ * both text and HTML parts as the body of the email
+ */
+$wgAllowHTMLEmail = false;
+
+/**
* True: from page editor if s/he opted-in. False: Enotif mails appear to come
* from $wgEmergencyContact
*/
@@ -1375,12 +1474,16 @@ $wgAllDBsAreLocalhost = false;
* preferences shared (preferences were stored in the user table prior to 1.16)
*
* $wgSharedTables may be customized with a list of tables to share in the shared
- * datbase. However it is advised to limit what tables you do share as many of
+ * database. However it is advised to limit what tables you do share as many of
* MediaWiki's tables may have side effects if you try to share them.
- * EXPERIMENTAL
*
* $wgSharedPrefix is the table prefix for the shared database. It defaults to
* $wgDBprefix.
+ *
+ * @deprecated In new code, use the $wiki parameter to wfGetLB() to access
+ * remote databases. Using wfGetLB() allows the shared database to reside on
+ * separate servers to the wiki's own database, with suitable configuration
+ * of $wgLBFactoryConf.
*/
$wgSharedDB = null;
@@ -1459,7 +1562,7 @@ $wgDBerrorLog = false;
* Timezone to use in the error log.
* Defaults to the wiki timezone ($wgLocaltimezone).
*
- * A list of useable timezones can found at:
+ * A list of usable timezones can found at:
* http://php.net/manual/en/timezones.php
*
* @par Examples:
@@ -1526,7 +1629,6 @@ $wgOldChangeTagsIndex = false;
/**@}*/ # End of DB settings }
-
/************************************************************************//**
* @name Text storage
* @{
@@ -1560,7 +1662,7 @@ $wgExternalStores = false;
* Create a cluster named 'cluster1' containing three servers:
* @code
* $wgExternalServers = array(
- * 'cluster1' => array( 'srv28', 'srv29', 'srv30' )
+ * 'cluster1' => array( 'srv28', 'srv29', 'srv30' )
* );
* @endcode
*
@@ -1758,13 +1860,13 @@ $wgDBAhandler = 'db3';
/**
* Deprecated alias for $wgSessionsInObjectCache.
*
- * @deprecated Use $wgSessionsInObjectCache
+ * @deprecated since 1.20; Use $wgSessionsInObjectCache
*/
$wgSessionsInMemcached = false;
/**
* Store sessions in an object cache, configured by $wgSessionCacheType. This
- * can be useful to improve performance, or to avoid the locking behaviour of
+ * can be useful to improve performance, or to avoid the locking behavior of
* PHP's default session handler, which tends to prevent multiple requests for
* the same user from acting concurrently.
*/
@@ -1815,9 +1917,10 @@ $wgUseLocalMessageCache = false;
$wgLocalMessageCacheSerialized = true;
/**
- * Instead of caching everything, keep track which messages are requested and
- * load only most used messages. This only makes sense if there is lots of
- * interface messages customised in the wiki (like hundreds in many languages).
+ * Instead of caching everything, only cache those messages which have
+ * been customised in the site content language. This means that
+ * MediaWiki:Foo/ja is ignored if MediaWiki:Foo doesn't exist.
+ * This option is probably only useful for translatewiki.net.
*/
$wgAdaptiveMessageCache = false;
@@ -2032,6 +2135,27 @@ $wgSquidServersNoPurge = array();
$wgMaxSquidPurgeTitles = 400;
/**
+ * Whether to use a Host header in purge requests sent to the proxy servers
+ * configured in $wgSquidServers. Set this to false to support Squid
+ * configured in forward-proxy mode.
+ *
+ * If this is set to true, a Host header will be sent, and only the path
+ * component of the URL will appear on the request line, as if the request
+ * were a non-proxy HTTP 1.1 request. Varnish only supports this style of
+ * request. Squid supports this style of request only if reverse-proxy mode
+ * (http_port ... accel) is enabled.
+ *
+ * If this is set to false, no Host header will be sent, and the absolute URL
+ * will be sent in the request line, as is the standard for an HTTP proxy
+ * request in both HTTP 1.0 and 1.1. This style of request is not supported
+ * by Varnish, but is supported by Squid in either configuration (forward or
+ * reverse).
+ *
+ * @since 1.21
+ */
+$wgSquidPurgeUseHostHeader = true;
+
+/**
* Routing configuration for HTCP multicast purging. Add elements here to
* enable HTCP and determine which purges are sent where. If set to an empty
* array, HTCP is disabled.
@@ -2073,13 +2197,13 @@ $wgHTCPMulticastRouting = array();
* setting is ignored. If $wgHTCPMulticastRouting is not set and this setting
* is, it is used to populate $wgHTCPMulticastRouting.
*
- * @deprecated in favor of $wgHTCPMulticastRouting
+ * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting
*/
$wgHTCPMulticastAddress = false;
/**
* HTCP multicast port.
- * @deprecated in favor of $wgHTCPMulticastRouting
+ * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting
* @see $wgHTCPMulticastAddress
*/
$wgHTCPPort = 4827;
@@ -2100,10 +2224,30 @@ $wgUsePrivateIPs = false;
* @{
*/
-/** Site language code, should be one of ./languages/Language(.*).php */
+/**
+ * Site language code. See languages/Names.php for languages supported by
+ * MediaWiki out of the box. Not all languages listed there have translations,
+ * see languages/messages/ for the list of languages with some localisation.
+ *
+ * Warning: Don't use language codes listed in $wgDummyLanguageCodes like "no"
+ * for Norwegian (use "nb" instead), or things will break unexpectedly.
+ *
+ * This defines the default interface language for all users, but users can
+ * change it in their preferences.
+ *
+ * This also defines the language of pages in the wiki. The content is wrapped
+ * in a html element with lang=XX attribute. This behavior can be overridden
+ * via hooks, see Title::getPageLanguage.
+ */
$wgLanguageCode = 'en';
/**
+ * Language cache size, or really how many languages can we handle
+ * simultaneously without degrading to crawl speed.
+ */
+$wgLangObjCacheSize = 10;
+
+/**
* Some languages need different word forms, usually for different cases.
* Used in Language::convertGrammar().
*
@@ -2125,7 +2269,7 @@ $wgExtraLanguageNames = array();
/**
* List of language codes that don't correspond to an actual language.
- * These codes are mostly leftoffs from renames, or other legacy things.
+ * These codes are mostly left-offs from renames, or other legacy things.
* This array makes them not appear as a selectable language on the installer,
* and excludes them when running the transstat.php script.
*/
@@ -2249,24 +2393,16 @@ $wgBrowserBlackList = array(
* requires that the cur table be kept around for those revisions
* to remain viewable.
*
- * maintenance/migrateCurStubs.php can be used to complete the
- * migration in the background once the wiki is back online.
- *
* This option affects the updaters *only*. Any present cur stub
* revisions will be readable at runtime regardless of this setting.
*/
$wgLegacySchemaConversion = false;
/**
- * Enable to allow rewriting dates in page text.
- * DOES NOT FORMAT CORRECTLY FOR MOST LANGUAGES.
- */
-$wgUseDynamicDates = false;
-/**
* Enable dates like 'May 12' instead of '12 May', this only takes effect if
* the interface is set to English.
*/
-$wgAmericanDates = false;
+$wgAmericanDates = false;
/**
* For Hindi and Arabic use local numerals instead of Western style (0-9)
* numerals in interface.
@@ -2295,7 +2431,7 @@ $wgDisableLangConversion = false;
/** Whether to enable language variant conversion for links. */
$wgDisableTitleConversion = false;
-/** Whether to enable cononical language links in meta data. */
+/** Whether to enable canonical language links in meta data. */
$wgCanonicalLanguageLinks = true;
/** Default variant code, if false, the default will be the language code */
@@ -2319,9 +2455,9 @@ $wgDisabledVariants = array();
*
* @par Example:
* @code
- * $wgLanguageCode = 'sr';
- * $wgVariantArticlePath = '/$2/$1';
- * $wgArticlePath = '/wiki/$1';
+ * $wgLanguageCode = 'sr';
+ * $wgVariantArticlePath = '/$2/$1';
+ * $wgArticlePath = '/wiki/$1';
* @endcode
*
* A link to /wiki/ would be redirected to /sr/Главна_Ñтрана
@@ -2354,7 +2490,7 @@ $wgLoginLanguageSelector = false;
* To allow language-specific main page and community
* portal:
* @code
- * $wgForceUIMsgAsContentMsg = array( 'mainpage', 'portal-url' );
+ * $wgForceUIMsgAsContentMsg = array( 'mainpage', 'portal-url' );
* @endcode
*/
$wgForceUIMsgAsContentMsg = array();
@@ -2370,7 +2506,7 @@ $wgForceUIMsgAsContentMsg = array();
* Timezones can be translated by editing MediaWiki messages of type
* timezone-nameinlowercase like timezone-utc.
*
- * A list of useable timezones can found at:
+ * A list of usable timezones can found at:
* http://php.net/manual/en/timezones.php
*
* @par Examples:
@@ -2389,23 +2525,12 @@ $wgLocaltimezone = null;
* for anonymous users and new user accounts.
*
* This setting is used for most date/time displays in the software, and is
- * overrideable in user preferences. It is *not* used for signature timestamps.
+ * overridable in user preferences. It is *not* used for signature timestamps.
*
* By default, this will be set to match $wgLocaltimezone.
*/
$wgLocalTZoffset = null;
-/**
- * If set to true, this will roll back a few bug fixes introduced in 1.19,
- * emulating the 1.18 behaviour, to avoid introducing bug 34832. In 1.19,
- * language variant conversion is disabled in interface messages. Setting this
- * to true re-enables it.
- *
- * @todo This variable should be removed (implicitly false) in 1.20 or earlier.
- */
-$wgBug34832TransitionalRollback = true;
-
-
/** @} */ # End of language/charset settings
/*************************************************************************//**
@@ -2499,7 +2624,7 @@ $wgWellFormedXml = true;
* @par Example:
* @code
* $wgXhtmlNamespaces['svg'] = 'http://www.w3.org/2000/svg';
- * @endCode
+ * @endcode
* Normally we wouldn't have to define this in the root "<html>"
* element, but IE needs it there in some circumstances.
*
@@ -2527,12 +2652,12 @@ $wgSiteNotice = '';
/**
* A subtitle to add to the tagline, for skins that have it/
*/
-$wgExtraSubtitle = '';
+$wgExtraSubtitle = '';
/**
* If this is set, a "donate" link will appear in the sidebar. Set it to a URL.
*/
-$wgSiteSupportPage = '';
+$wgSiteSupportPage = '';
/**
* Validate the overall output using tidy and refuse
@@ -2684,7 +2809,7 @@ $wgExperimentalHtmlIds = false;
* for the icon, the following keys are used:
* - src: An absolute url to the image to use for the icon, this is recommended
* but not required, however some skins will ignore icons without an image
- * - url: The url to use in the a element arround the text or icon, if not set an a element will not be outputted
+ * - url: The url to use in the a element around the text or icon, if not set an a element will not be outputted
* - alt: This is the text form of the icon, it will be displayed without an image in
* skins like Modern or if src is not set, and will otherwise be used as
* the alt="" for the image. This key is required.
@@ -2719,7 +2844,7 @@ $wgUseCombinedLoginLink = false;
* - true = use an icon search button
* - false = use Go & Search buttons
*/
-$wgVectorUseSimpleSearch = false;
+$wgVectorUseSimpleSearch = true;
/**
* Watch and unwatch as an icon rather than a link for Vector skin only.
@@ -2754,16 +2879,24 @@ $wgBetterDirectionality = true;
*/
$wgSend404Code = true;
-
/**
* The $wgShowRollbackEditCount variable is used to show how many edits will be
- * rollback. The numeric value of the varible are the limit up to are counted.
- * If the value is false or 0, the edits are not counted.
+ * rollback. The numeric value of the variable are the limit up to are counted.
+ * If the value is false or 0, the edits are not counted. Disabling this will
+ * furthermore prevent MediaWiki from hiding some useless rollback links.
*
* @since 1.20
*/
$wgShowRollbackEditCount = 10;
+/**
+ * Output a <link rel="canonical"> tag on every page indicating the canonical
+ * server which should be used, i.e. $wgServer or $wgCanonicalServer. Since
+ * detection of the current server is unreliable, the link is sent
+ * unconditionally.
+ */
+$wgEnableCanonicalServerLink = false;
+
/** @} */ # End of output format settings }
/*************************************************************************//**
@@ -2890,21 +3023,21 @@ $wgPreloadJavaScriptMwUtil = false;
*
* @par Example of legacy code:
* @code{,js}
- * if ( window.wgRestrictionEdit ) { ... }
+ * if ( window.wgRestrictionEdit ) { ... }
* @endcode
* or:
* @code{,js}
- * if ( wgIsArticle ) { ... }
+ * if ( wgIsArticle ) { ... }
* @endcode
*
* Instead, one needs to use mw.config.
* @par Example using mw.config global configuration:
* @code{,js}
- * if ( mw.config.exists('wgRestrictionEdit') ) { ... }
+ * if ( mw.config.exists('wgRestrictionEdit') ) { ... }
* @endcode
* or:
* @code{,js}
- * if ( mw.config.get('wgIsArticle') ) { ... }
+ * if ( mw.config.get('wgIsArticle') ) { ... }
* @endcode
*/
$wgLegacyJavaScriptGlobals = true;
@@ -2950,7 +3083,6 @@ $wgResourceLoaderExperimentalAsyncLoading = false;
/** @} */ # End of resource loader settings }
-
/*************************************************************************//**
* @name Page title and interwiki link settings
* @{
@@ -3085,13 +3217,13 @@ $wgInterwikiExpiry = 10800;
$wgInterwikiCache = false;
/**
* Specify number of domains to check for messages.
- * - 1: Just wiki(db)-level
- * - 2: wiki and global levels
- * - 3: site levels
+ * - 1: Just wiki(db)-level
+ * - 2: wiki and global levels
+ * - 3: site levels
*/
$wgInterwikiScopes = 3;
/**
- * $wgInterwikiFallbackSite - if unable to resolve from cache
+ * $wgInterwikiFallbackSite - if unable to resolve from cache
*/
$wgInterwikiFallbackSite = 'wiki';
/** @} */ # end of Interwiki caching settings.
@@ -3133,7 +3265,7 @@ $wgCapitalLinks = true;
*
* @par Example:
* @code
- * $wgCapitalLinkOverrides[ NS_FILE ] = false;
+ * $wgCapitalLinkOverrides[ NS_FILE ] = false;
* @endcode
*/
$wgCapitalLinkOverrides = array();
@@ -3142,16 +3274,18 @@ $wgCapitalLinkOverrides = array();
* See Language.php for a list of namespaces.
*/
$wgNamespacesWithSubpages = array(
- NS_TALK => true,
- NS_USER => true,
- NS_USER_TALK => true,
- NS_PROJECT_TALK => true,
- NS_FILE_TALK => true,
- NS_MEDIAWIKI => true,
+ NS_TALK => true,
+ NS_USER => true,
+ NS_USER_TALK => true,
+ NS_PROJECT => true,
+ NS_PROJECT_TALK => true,
+ NS_FILE_TALK => true,
+ NS_MEDIAWIKI => true,
NS_MEDIAWIKI_TALK => true,
- NS_TEMPLATE_TALK => true,
- NS_HELP_TALK => true,
- NS_CATEGORY_TALK => true
+ NS_TEMPLATE_TALK => true,
+ NS_HELP => true,
+ NS_HELP_TALK => true,
+ NS_CATEGORY_TALK => true
);
/**
@@ -3195,7 +3329,7 @@ $wgInvalidRedirectTargets = array( 'Filepath', 'Mypage', 'Mytalk' );
* class The class name
*
* preprocessorClass The preprocessor class. Two classes are currently available:
- * Preprocessor_Hash, which uses plain PHP arrays for tempoarary
+ * Preprocessor_Hash, which uses plain PHP arrays for temporary
* storage, and Preprocessor_DOM, which uses the DOM module for
* temporary storage. Preprocessor_DOM generally uses less memory;
* the speed of the two is roughly the same.
@@ -3225,12 +3359,16 @@ $wgMaxTocLevel = 999;
$wgMaxPPNodeCount = 1000000;
/**
- * A complexity limit on template expansion: the maximum number of nodes
- * generated by Preprocessor::preprocessToObj()
+ * A complexity limit on template expansion: the maximum number of elements
+ * generated by Preprocessor::preprocessToObj(). This allows you to limit the
+ * amount of memory used by the Preprocessor_DOM node cache: testing indicates
+ * that each element uses about 160 bytes of memory on a 64-bit processor, so
+ * this default corresponds to about 155 MB.
+ *
+ * When the limit is exceeded, an exception is thrown.
*/
$wgMaxGeneratedPPNodeCount = 1000000;
-
/**
* Maximum recursion depth for templates within templates.
* The current parser adds two levels to the PHP call stack for each template,
@@ -3248,7 +3386,7 @@ $wgUrlProtocols = array(
'https://',
'ftp://',
'irc://',
- 'ircs://', // @bug 28503
+ 'ircs://', // @bug 28503
'gopher://',
'telnet://', // Well if we're going to support the above.. -ævar
'nntp://', // @bug 3808 RFC 1738
@@ -3324,7 +3462,7 @@ $wgAlwaysUseTidy = false;
/** @see $wgUseTidy */
$wgTidyBin = 'tidy';
/** @see $wgUseTidy */
-$wgTidyConf = $IP.'/includes/tidy.conf';
+$wgTidyConf = $IP . '/includes/tidy.conf';
/** @see $wgUseTidy */
$wgTidyOpts = '';
/** @see $wgUseTidy */
@@ -3520,77 +3658,70 @@ $wgReservedUsernames = array(
*
*/
$wgDefaultUserOptions = array(
- 'ccmeonemails' => 0,
- 'cols' => 80,
- 'date' => 'default',
- 'diffonly' => 0,
- 'disablemail' => 0,
- 'disablesuggest' => 0,
- 'editfont' => 'default',
- 'editondblclick' => 0,
- 'editsection' => 1,
+ 'ccmeonemails' => 0,
+ 'cols' => 80,
+ 'date' => 'default',
+ 'diffonly' => 0,
+ 'disablemail' => 0,
+ 'disablesuggest' => 0,
+ 'editfont' => 'default',
+ 'editondblclick' => 0,
+ 'editsection' => 1,
'editsectiononrightclick' => 0,
- 'enotifminoredits' => 0,
- 'enotifrevealaddr' => 0,
- 'enotifusertalkpages' => 1,
- 'enotifwatchlistpages' => 0,
- 'extendwatchlist' => 0,
- 'externaldiff' => 0,
- 'externaleditor' => 0,
- 'fancysig' => 0,
- 'forceeditsummary' => 0,
- 'gender' => 'unknown',
- 'hideminor' => 0,
- 'hidepatrolled' => 0,
- 'imagesize' => 2,
- 'justify' => 0,
- 'math' => 1,
- 'minordefault' => 0,
- 'newpageshidepatrolled' => 0,
- 'nocache' => 0,
- 'noconvertlink' => 0,
- 'norollbackdiff' => 0,
- 'numberheadings' => 0,
- 'previewonfirst' => 0,
- 'previewontop' => 1,
- 'quickbar' => 5,
- 'rcdays' => 7,
- 'rclimit' => 50,
- 'rememberpassword' => 0,
- 'rows' => 25,
- 'searchlimit' => 20,
- 'showhiddencats' => 0,
- 'showjumplinks' => 1,
- 'shownumberswatching' => 1,
- 'showtoc' => 1,
- 'showtoolbar' => 1,
- 'skin' => false,
- 'stubthreshold' => 0,
- 'thumbsize' => 2,
- 'underline' => 2,
- 'uselivepreview' => 0,
- 'usenewrc' => 0,
- 'watchcreations' => 0,
- 'watchdefault' => 0,
- 'watchdeletion' => 0,
- 'watchlistdays' => 3.0,
- 'watchlisthideanons' => 0,
- 'watchlisthidebots' => 0,
- 'watchlisthideliu' => 0,
- 'watchlisthideminor' => 0,
- 'watchlisthideown' => 0,
- 'watchlisthidepatrolled' => 0,
- 'watchmoves' => 0,
- 'wllimit' => 250,
+ 'enotifminoredits' => 0,
+ 'enotifrevealaddr' => 0,
+ 'enotifusertalkpages' => 1,
+ 'enotifwatchlistpages' => 0,
+ 'extendwatchlist' => 0,
+ 'externaldiff' => 0,
+ 'externaleditor' => 0,
+ 'fancysig' => 0,
+ 'forceeditsummary' => 0,
+ 'gender' => 'unknown',
+ 'hideminor' => 0,
+ 'hidepatrolled' => 0,
+ 'imagesize' => 2,
+ 'justify' => 0,
+ 'math' => 1,
+ 'minordefault' => 0,
+ 'newpageshidepatrolled' => 0,
+ 'nocache' => 0,
+ 'noconvertlink' => 0,
+ 'norollbackdiff' => 0,
+ 'numberheadings' => 0,
+ 'previewonfirst' => 0,
+ 'previewontop' => 1,
+ 'quickbar' => 5,
+ 'rcdays' => 7,
+ 'rclimit' => 50,
+ 'rememberpassword' => 0,
+ 'rows' => 25,
+ 'searchlimit' => 20,
+ 'showhiddencats' => 0,
+ 'showjumplinks' => 1,
+ 'shownumberswatching' => 1,
+ 'showtoc' => 1,
+ 'showtoolbar' => 1,
+ 'skin' => false,
+ 'stubthreshold' => 0,
+ 'thumbsize' => 2,
+ 'underline' => 2,
+ 'uselivepreview' => 0,
+ 'usenewrc' => 0,
+ 'watchcreations' => 0,
+ 'watchdefault' => 0,
+ 'watchdeletion' => 0,
+ 'watchlistdays' => 3.0,
+ 'watchlisthideanons' => 0,
+ 'watchlisthidebots' => 0,
+ 'watchlisthideliu' => 0,
+ 'watchlisthideminor' => 0,
+ 'watchlisthideown' => 0,
+ 'watchlisthidepatrolled' => 0,
+ 'watchmoves' => 0,
+ 'wllimit' => 250,
);
-/**
- * Whether or not to allow and use real name fields.
- * @deprecated since 1.16, use $wgHiddenPrefs[] = 'realname' below to disable real
- * names
- */
-$wgAllowRealName = true;
-
/** An array of preferences to not show for the user */
$wgHiddenPrefs = array();
@@ -3672,11 +3803,18 @@ $wgAllowPrefChange = array();
/**
* This is to let user authenticate using https when they come from http.
* Based on an idea by George Herbert on wikitech-l:
- * http://lists.wikimedia.org/pipermail/wikitech-l/2010-October/050065.html
+ * http://lists.wikimedia.org/pipermail/wikitech-l/2010-October/050039.html
* @since 1.17
*/
$wgSecureLogin = false;
+/**
+ * By default, keep users logged in via HTTPS when $wgSecureLogin is also
+ * true. Users opt-out of HTTPS when they login by de-selecting the checkbox.
+ * @since 1.21
+ */
+$wgSecureLoginDefaultHTTPS = true;
+
/** @} */ # end user accounts }
/************************************************************************//**
@@ -3745,6 +3883,34 @@ $wgBlockDisablesLogin = false;
$wgWhitelistRead = false;
/**
+ * Pages anonymous user may see, set as an array of regular expressions.
+ *
+ * This function will match the regexp against the title name, which
+ * is without underscore.
+ *
+ * @par Example:
+ * To whitelist [[Main Page]]:
+ * @code
+ * $wgWhitelistReadRegexp = array( "/Main Page/" );
+ * @endcode
+ *
+ * @note Unless ^ and/or $ is specified, a regular expression might match
+ * pages not intended to be whitelisted. The above example will also
+ * whitelist a page named 'Security Main Page'.
+ *
+ * @par Example:
+ * To allow reading any page starting with 'User' regardless of the case:
+ * @code
+ * $wgWhitelistReadRegexp = array( "@^UsEr.*@i" );
+ * @endcode
+ * Will allow both [[User is banned]] and [[User:JohnDoe]]
+ *
+ * @note This will only work if $wgGroupPermissions['*']['read'] is false --
+ * see below. Otherwise, ALL pages are accessible, regardless of this setting.
+ */
+$wgWhitelistReadRegexp = false;
+
+/**
* Should editors be required to have a validated e-mail
* address before being allowed to edit?
*/
@@ -3778,93 +3944,93 @@ $wgGroupPermissions = array();
/** @cond file_level_code */
// Implicit group for all visitors
-$wgGroupPermissions['*']['createaccount'] = true;
-$wgGroupPermissions['*']['read'] = true;
-$wgGroupPermissions['*']['edit'] = true;
-$wgGroupPermissions['*']['createpage'] = true;
-$wgGroupPermissions['*']['createtalk'] = true;
-$wgGroupPermissions['*']['writeapi'] = true;
-//$wgGroupPermissions['*']['patrolmarks'] = false; // let anons see what was patrolled
+$wgGroupPermissions['*']['createaccount'] = true;
+$wgGroupPermissions['*']['read'] = true;
+$wgGroupPermissions['*']['edit'] = true;
+$wgGroupPermissions['*']['createpage'] = true;
+$wgGroupPermissions['*']['createtalk'] = true;
+$wgGroupPermissions['*']['writeapi'] = true;
+#$wgGroupPermissions['*']['patrolmarks'] = false; // let anons see what was patrolled
// Implicit group for all logged-in accounts
-$wgGroupPermissions['user']['move'] = true;
-$wgGroupPermissions['user']['move-subpages'] = true;
+$wgGroupPermissions['user']['move'] = true;
+$wgGroupPermissions['user']['move-subpages'] = true;
$wgGroupPermissions['user']['move-rootuserpages'] = true; // can move root userpages
-$wgGroupPermissions['user']['movefile'] = true;
-$wgGroupPermissions['user']['read'] = true;
-$wgGroupPermissions['user']['edit'] = true;
-$wgGroupPermissions['user']['createpage'] = true;
-$wgGroupPermissions['user']['createtalk'] = true;
-$wgGroupPermissions['user']['writeapi'] = true;
-$wgGroupPermissions['user']['upload'] = true;
-$wgGroupPermissions['user']['reupload'] = true;
-$wgGroupPermissions['user']['reupload-shared'] = true;
-$wgGroupPermissions['user']['minoredit'] = true;
-$wgGroupPermissions['user']['purge'] = true; // can use ?action=purge without clicking "ok"
-$wgGroupPermissions['user']['sendemail'] = true;
+$wgGroupPermissions['user']['movefile'] = true;
+$wgGroupPermissions['user']['read'] = true;
+$wgGroupPermissions['user']['edit'] = true;
+$wgGroupPermissions['user']['createpage'] = true;
+$wgGroupPermissions['user']['createtalk'] = true;
+$wgGroupPermissions['user']['writeapi'] = true;
+$wgGroupPermissions['user']['upload'] = true;
+$wgGroupPermissions['user']['reupload'] = true;
+$wgGroupPermissions['user']['reupload-shared'] = true;
+$wgGroupPermissions['user']['minoredit'] = true;
+$wgGroupPermissions['user']['purge'] = true; // can use ?action=purge without clicking "ok"
+$wgGroupPermissions['user']['sendemail'] = true;
// Implicit group for accounts that pass $wgAutoConfirmAge
$wgGroupPermissions['autoconfirmed']['autoconfirmed'] = true;
// Users with bot privilege can have their edits hidden
// from various log pages by default
-$wgGroupPermissions['bot']['bot'] = true;
-$wgGroupPermissions['bot']['autoconfirmed'] = true;
-$wgGroupPermissions['bot']['nominornewtalk'] = true;
-$wgGroupPermissions['bot']['autopatrol'] = true;
+$wgGroupPermissions['bot']['bot'] = true;
+$wgGroupPermissions['bot']['autoconfirmed'] = true;
+$wgGroupPermissions['bot']['nominornewtalk'] = true;
+$wgGroupPermissions['bot']['autopatrol'] = true;
$wgGroupPermissions['bot']['suppressredirect'] = true;
-$wgGroupPermissions['bot']['apihighlimits'] = true;
-$wgGroupPermissions['bot']['writeapi'] = true;
-#$wgGroupPermissions['bot']['editprotected'] = true; // can edit all protected pages without cascade protection enabled
+$wgGroupPermissions['bot']['apihighlimits'] = true;
+$wgGroupPermissions['bot']['writeapi'] = true;
+#$wgGroupPermissions['bot']['editprotected'] = true; // can edit all protected pages without cascade protection enabled
// Most extra permission abilities go to this group
-$wgGroupPermissions['sysop']['block'] = true;
-$wgGroupPermissions['sysop']['createaccount'] = true;
-$wgGroupPermissions['sysop']['delete'] = true;
-$wgGroupPermissions['sysop']['bigdelete'] = true; // can be separately configured for pages with > $wgDeleteRevisionsLimit revs
-$wgGroupPermissions['sysop']['deletedhistory'] = true; // can view deleted history entries, but not see or restore the text
-$wgGroupPermissions['sysop']['deletedtext'] = true; // can view deleted revision text
-$wgGroupPermissions['sysop']['undelete'] = true;
-$wgGroupPermissions['sysop']['editinterface'] = true;
-$wgGroupPermissions['sysop']['editusercss'] = true;
-$wgGroupPermissions['sysop']['edituserjs'] = true;
-$wgGroupPermissions['sysop']['import'] = true;
-$wgGroupPermissions['sysop']['importupload'] = true;
-$wgGroupPermissions['sysop']['move'] = true;
-$wgGroupPermissions['sysop']['move-subpages'] = true;
+$wgGroupPermissions['sysop']['block'] = true;
+$wgGroupPermissions['sysop']['createaccount'] = true;
+$wgGroupPermissions['sysop']['delete'] = true;
+$wgGroupPermissions['sysop']['bigdelete'] = true; // can be separately configured for pages with > $wgDeleteRevisionsLimit revs
+$wgGroupPermissions['sysop']['deletedhistory'] = true; // can view deleted history entries, but not see or restore the text
+$wgGroupPermissions['sysop']['deletedtext'] = true; // can view deleted revision text
+$wgGroupPermissions['sysop']['undelete'] = true;
+$wgGroupPermissions['sysop']['editinterface'] = true;
+$wgGroupPermissions['sysop']['editusercss'] = true;
+$wgGroupPermissions['sysop']['edituserjs'] = true;
+$wgGroupPermissions['sysop']['import'] = true;
+$wgGroupPermissions['sysop']['importupload'] = true;
+$wgGroupPermissions['sysop']['move'] = true;
+$wgGroupPermissions['sysop']['move-subpages'] = true;
$wgGroupPermissions['sysop']['move-rootuserpages'] = true;
-$wgGroupPermissions['sysop']['patrol'] = true;
-$wgGroupPermissions['sysop']['autopatrol'] = true;
-$wgGroupPermissions['sysop']['protect'] = true;
-$wgGroupPermissions['sysop']['proxyunbannable'] = true;
-$wgGroupPermissions['sysop']['rollback'] = true;
-$wgGroupPermissions['sysop']['upload'] = true;
-$wgGroupPermissions['sysop']['reupload'] = true;
-$wgGroupPermissions['sysop']['reupload-shared'] = true;
-$wgGroupPermissions['sysop']['unwatchedpages'] = true;
-$wgGroupPermissions['sysop']['autoconfirmed'] = true;
-$wgGroupPermissions['sysop']['ipblock-exempt'] = true;
-$wgGroupPermissions['sysop']['blockemail'] = true;
-$wgGroupPermissions['sysop']['markbotedits'] = true;
-$wgGroupPermissions['sysop']['apihighlimits'] = true;
-$wgGroupPermissions['sysop']['browsearchive'] = true;
-$wgGroupPermissions['sysop']['noratelimit'] = true;
-$wgGroupPermissions['sysop']['movefile'] = true;
-$wgGroupPermissions['sysop']['unblockself'] = true;
+$wgGroupPermissions['sysop']['patrol'] = true;
+$wgGroupPermissions['sysop']['autopatrol'] = true;
+$wgGroupPermissions['sysop']['protect'] = true;
+$wgGroupPermissions['sysop']['proxyunbannable'] = true;
+$wgGroupPermissions['sysop']['rollback'] = true;
+$wgGroupPermissions['sysop']['upload'] = true;
+$wgGroupPermissions['sysop']['reupload'] = true;
+$wgGroupPermissions['sysop']['reupload-shared'] = true;
+$wgGroupPermissions['sysop']['unwatchedpages'] = true;
+$wgGroupPermissions['sysop']['autoconfirmed'] = true;
+$wgGroupPermissions['sysop']['ipblock-exempt'] = true;
+$wgGroupPermissions['sysop']['blockemail'] = true;
+$wgGroupPermissions['sysop']['markbotedits'] = true;
+$wgGroupPermissions['sysop']['apihighlimits'] = true;
+$wgGroupPermissions['sysop']['browsearchive'] = true;
+$wgGroupPermissions['sysop']['noratelimit'] = true;
+$wgGroupPermissions['sysop']['movefile'] = true;
+$wgGroupPermissions['sysop']['unblockself'] = true;
$wgGroupPermissions['sysop']['suppressredirect'] = true;
-#$wgGroupPermissions['sysop']['upload_by_url'] = true;
-#$wgGroupPermissions['sysop']['mergehistory'] = true;
+#$wgGroupPermissions['sysop']['upload_by_url'] = true;
+#$wgGroupPermissions['sysop']['mergehistory'] = true;
// Permission to change users' group assignments
-$wgGroupPermissions['bureaucrat']['userrights'] = true;
+$wgGroupPermissions['bureaucrat']['userrights'] = true;
$wgGroupPermissions['bureaucrat']['noratelimit'] = true;
// Permission to change users' groups assignments across wikis
#$wgGroupPermissions['bureaucrat']['userrights-interwiki'] = true;
// Permission to export pages including linked pages regardless of $wgExportMaxLinkDepth
#$wgGroupPermissions['bureaucrat']['override-export-depth'] = true;
-#$wgGroupPermissions['sysop']['deletelogentry'] = true;
-#$wgGroupPermissions['sysop']['deleterevision'] = true;
+#$wgGroupPermissions['sysop']['deletelogentry'] = true;
+#$wgGroupPermissions['sysop']['deleterevision'] = true;
// To hide usernames from users and Sysops
#$wgGroupPermissions['suppress']['hideuser'] = true;
// To hide revisions/log items from users and Sysops
@@ -3962,7 +4128,7 @@ $wgNamespaceProtection = array();
* namespaces constants (NS_USER, NS_MAIN...).
*
* Among other things, this may be useful to enforce read-restrictions
- * which may otherwise be bypassed by using the template machanism.
+ * which may otherwise be bypassed by using the template mechanism.
*/
$wgNonincludableNamespaces = array();
@@ -4037,11 +4203,11 @@ $wgAutopromote = array(
*
* The format is:
* @code
- * array( event => criteria, ... )
+ * array( event => criteria, ... )
* @endcode
* Where event is either:
- * - 'onEdit' (when user edits)
- * - 'onView' (when user views the wiki)
+ * - 'onEdit' (when user edits)
+ * - 'onView' (when user views the wiki)
*
* Criteria has the same format as $wgAutopromote
*
@@ -4100,7 +4266,8 @@ $wgDeleteRevisionsLimit = 0;
/**
* Number of accounts each IP address may create, 0 to disable.
*
- * @warning Requires memcached */
+ * @warning Requires memcached
+ */
$wgAccountCreationThrottle = 0;
/**
@@ -4191,25 +4358,25 @@ $wgProxyWhitelist = array();
*/
$wgRateLimits = array(
'edit' => array(
- 'anon' => null, // for any and all anonymous edits (aggregate)
- 'user' => null, // for each logged-in user
+ 'anon' => null, // for any and all anonymous edits (aggregate)
+ 'user' => null, // for each logged-in user
'newbie' => null, // for each recent (autoconfirmed) account; overrides 'user'
- 'ip' => null, // for each anon and recent account
+ 'ip' => null, // for each anon and recent account
'subnet' => null, // ... with final octet removed
- ),
+ ),
'move' => array(
- 'user' => null,
+ 'user' => null,
'newbie' => null,
- 'ip' => null,
+ 'ip' => null,
'subnet' => null,
- ),
+ ),
'mailpassword' => array(
'anon' => null,
- ),
+ ),
'emailuser' => array(
'user' => null,
- ),
- );
+ ),
+);
/**
* Set to a filename to log rate limiter hits.
@@ -4225,6 +4392,7 @@ $wgRateLimitsExcludedIPs = array();
/**
* Log IP addresses in the recentchanges table; can be accessed only by
* extensions (e.g. CheckUser) or a DB admin
+ * Used for retroactive autoblocks
*/
$wgPutIPinRC = true;
@@ -4261,14 +4429,26 @@ $wgBlockOpenProxies = false;
/** Port we want to scan for a proxy */
$wgProxyPorts = array( 80, 81, 1080, 3128, 6588, 8000, 8080, 8888, 65506 );
/** Script used to scan */
-$wgProxyScriptPath = "$IP/maintenance/proxy_check.php";
+$wgProxyScriptPath = "$IP/maintenance/proxyCheck.php";
/** */
$wgProxyMemcExpiry = 86400;
/** This should always be customised in LocalSettings.php */
$wgSecretKey = false;
-/** big list of banned IP addresses, in the keys not the values */
+
+/**
+ * Big list of banned IP addresses.
+ *
+ * This can have the following formats:
+ * - An array of addresses, either in the values
+ * or the keys (for backward compatibility)
+ * - A string, in that case this is the path to a file
+ * containing the list of IP addresses, one per line
+ */
$wgProxyList = array();
-/** deprecated */
+
+/**
+ * @deprecated since 1.14
+ */
$wgProxyKey = false;
/** @} */ # end of proxy scanner settings
@@ -4281,7 +4461,7 @@ $wgProxyKey = false;
/**
* Default cookie expiration time. Setting to 0 makes all cookies session-only.
*/
-$wgCookieExpiration = 180*86400;
+$wgCookieExpiration = 180 * 86400;
/**
* Set to set an explicit domain on the login cookies eg, "justthis.domain.org"
@@ -4289,7 +4469,6 @@ $wgCookieExpiration = 180*86400;
*/
$wgCookieDomain = '';
-
/**
* Set this variable if you want to restrict cookies to a certain path within
* the domain specified by $wgCookieDomain.
@@ -4343,7 +4522,7 @@ $wgCacheVaryCookies = array();
/** Override to customise the session name */
$wgSessionName = false;
-/** @} */ # end of cookie settings }
+/** @} */ # end of cookie settings }
/************************************************************************//**
* @name LaTeX (mathematical formulas)
@@ -4507,7 +4686,9 @@ $wgProfileOnly = false;
* Log sums from profiling into "profiling" table in db.
*
* You have to create a 'profiling' table in your database before using
- * this feature, see maintenance/archives/patch-profiling.sql
+ * this feature. Run set $wgProfileToDatabase to true in
+ * LocalSettings.php and run maintenance/update.php or otherwise
+ * manually add patch-profiling.sql to your database.
*
* To enable profiling, edit StartProfiler.php
*/
@@ -4561,6 +4742,13 @@ $wgAggregateStatsID = false;
$wgDisableCounters = false;
/**
+ * InfoAction retrieves a list of transclusion links (both to and from).
+ * This number puts a limit on that query in the case of highly transcluded
+ * templates.
+ */
+$wgPageInfoTransclusionLimit = 50;
+
+/**
* Set this to an integer to only do synchronous site_stats updates
* one every *this many* updates. The other requests go into pending
* delta values in $wgMemc. Make sure that $wgMemc is a global cache.
@@ -4621,7 +4809,6 @@ $wgJavaScriptTestConfig = array(
),
);
-
/**
* Overwrite the caching key prefix with custom value.
* @since 1.19
@@ -4650,7 +4837,7 @@ $wgDebugToolbar = false;
$wgDisableTextSearch = false;
/**
- * Set to true to have nicer highligted text in search results,
+ * Set to true to have nicer highlighted text in search results,
* by default off due to execution overhead
*/
$wgAdvancedSearchHighlighting = false;
@@ -4676,7 +4863,7 @@ $wgCountTotalSearchHits = false;
/**
* Template for OpenSearch suggestions, defaults to API action=opensearch
*
- * Sites with heavy load would tipically have these point to a custom
+ * Sites with heavy load would typically have these point to a custom
* PHP wrapper to avoid firing up mediawiki for every keystroke
*
* Placeholders: {searchTerms}
@@ -4724,7 +4911,7 @@ $wgNamespacesToBeSearchedDefault = array(
*/
$wgNamespacesToBeSearchedHelp = array(
NS_PROJECT => true,
- NS_HELP => true,
+ NS_HELP => true,
);
/**
@@ -4751,10 +4938,10 @@ $wgDisableInternalSearch = false;
* To forward to Google you'd have something like:
* @code
* $wgSearchForwardUrl =
- * 'http://www.google.com/search?q=$1' .
- * '&domains=http://example.com' .
- * '&sitesearch=http://example.com' .
- * '&ie=utf-8&oe=utf-8';
+ * 'http://www.google.com/search?q=$1' .
+ * '&domains=http://example.com' .
+ * '&sitesearch=http://example.com' .
+ * '&ie=utf-8&oe=utf-8';
* @endcode
*/
$wgSearchForwardUrl = null;
@@ -4768,14 +4955,14 @@ $wgUseTwoButtonsSearchForm = true;
/**
* Array of namespaces to generate a Google sitemap for when the
- * maintenance/generateSitemap.php script is run, or false if one is to be ge-
- * nerated for all namespaces.
+ * maintenance/generateSitemap.php script is run, or false if one is to be
+ * generated for all namespaces.
*/
$wgSitemapNamespaces = false;
/**
* Custom namespace priorities for sitemaps. Setting this will allow you to
- * set custom priorities to namsepaces when sitemaps are generated using the
+ * set custom priorities to namespaces when sitemaps are generated using the
* maintenance/generateSitemap.php script.
*
* This should be a map of namespace IDs to priority
@@ -4805,7 +4992,7 @@ $wgEnableSearchContributorsByIP = true;
/**
* Path to the GNU diff3 utility. If the file doesn't exist, edit conflicts will
- * fall back to the old behaviour (no merging).
+ * fall back to the old behavior (no merging).
*/
$wgDiff3 = '/usr/bin/diff3';
@@ -4816,7 +5003,7 @@ $wgDiff = '/usr/bin/diff';
/**
* Which namespaces have special treatment where they should be preview-on-open
- * Internaly only Category: pages apply, but using this extensions (e.g. Semantic MediaWiki)
+ * Internally only Category: pages apply, but using this extensions (e.g. Semantic MediaWiki)
* can specify namespaces of pages they have special treatment for
*/
$wgPreviewOnOpenNamespaces = array(
@@ -4858,7 +5045,7 @@ $wgUseAutomaticEditSummaries = true;
* @cond file_level_code
* Set $wgCommandLineMode if it's not set already, to avoid notices
*/
-if( !isset( $wgCommandLineMode ) ) {
+if ( !isset( $wgCommandLineMode ) ) {
$wgCommandLineMode = false;
}
/** @endcond */
@@ -5032,7 +5219,7 @@ $wgOverrideSiteFeed = array();
* $wgOut->isSyndicated() is true.
*/
$wgFeedClasses = array(
- 'rss' => 'RSSFeed',
+ 'rss' => 'RSSFeed',
'atom' => 'AtomFeed',
);
@@ -5078,6 +5265,15 @@ $wgAllowCategorizedRecentChanges = false;
*/
$wgUseTagFilter = true;
+/**
+ * If set to an integer, pages that are watched by this many users or more
+ * will not require the unwatchedpages permission to view the number of
+ * watchers.
+ *
+ * @since 1.21
+ */
+$wgUnwatchedPageThreshold = false;
+
/** @} */ # end RC/watchlist }
/************************************************************************//**
@@ -5180,8 +5376,8 @@ $wgExportAllowHistory = true;
$wgExportMaxHistory = 0;
/**
-* Return distinct author list (when not returning full history)
-*/
+ * Return distinct author list (when not returning full history)
+ */
$wgExportAllowListContributors = false;
/**
@@ -5198,13 +5394,13 @@ $wgExportAllowListContributors = false;
$wgExportMaxLinkDepth = 0;
/**
-* Whether to allow the "export all pages in namespace" option
-*/
+ * Whether to allow the "export all pages in namespace" option
+ */
$wgExportFromNamespaces = false;
/**
-* Whether to allow exporting the entire wiki into a single file
-*/
+ * Whether to allow exporting the entire wiki into a single file
+ */
$wgExportAllowAll = false;
/** @} */ # end of import/export }
@@ -5287,7 +5483,7 @@ $wgAutoloadClasses = array();
* 'version' => 1.9,
* 'path' => __FILE__,
* 'author' => 'Foo Barstein',
- * 'url' => 'http://wwww.example.com/Example%20Extension/',
+ * 'url' => 'http://www.example.com/Example%20Extension/',
* 'description' => 'An example extension',
* 'descriptionmsg' => 'exampleextension-desc',
* );
@@ -5296,6 +5492,11 @@ $wgAutoloadClasses = array();
* Where $type is 'specialpage', 'parserhook', 'variable', 'media' or 'other'.
* Where 'descriptionmsg' can be an array with message key and parameters:
* 'descriptionmsg' => array( 'exampleextension-desc', param1, param2, ... ),
+ *
+ * author can be a string or an array of strings. Authors can be linked using
+ * the regular wikitext link syntax. To have an internationalized version of
+ * "and others" show, add an element "...". This element can also be linked,
+ * for instance "[http://example ...]".
*/
$wgExtensionCredits = array();
@@ -5347,11 +5548,14 @@ $wgJobClasses = array(
'enotifNotify' => 'EnotifNotifyJob',
'fixDoubleRedirect' => 'DoubleRedirectJob',
'uploadFromUrl' => 'UploadFromUrlJob',
+ 'AssembleUploadChunks' => 'AssembleUploadChunksJob',
+ 'PublishStashedFile' => 'PublishStashedFileJob',
+ 'null' => 'NullJob'
);
/**
-
- * Jobs that must be explicitly requested, i.e. aren't run by job runners unless special flags are set.
+ * Jobs that must be explicitly requested, i.e. aren't run by job runners unless
+ * special flags are set. The values here are keys of $wgJobClasses.
*
* These can be:
* - Very long-running jobs.
@@ -5359,7 +5563,25 @@ $wgJobClasses = array(
* - Jobs that you want to run on specialized machines ( like transcoding, or a particular
* machine on your cluster has 'outside' web access you could restrict uploadFromUrl )
*/
-$wgJobTypesExcludedFromDefaultQueue = array();
+$wgJobTypesExcludedFromDefaultQueue = array( 'AssembleUploadChunks', 'PublishStashedFile' );
+
+/**
+ * Map of job types to configuration arrays.
+ * This determines which queue class and storage system is used for each job type.
+ * Job types that do not have explicit configuration will use the 'default' config.
+ * These settings should be global to all wikis.
+ */
+$wgJobTypeConf = array(
+ 'default' => array( 'class' => 'JobQueueDB', 'order' => 'random' ),
+);
+
+/**
+ * Which aggregator to use for tracking which queues have jobs.
+ * These settings should be global to all wikis.
+ */
+$wgJobQueueAggregator = array(
+ 'class' => 'JobQueueAggregatorMemc'
+);
/**
* Additional functions to be performed with updateSpecialPages.
@@ -5486,7 +5708,7 @@ $wgLogRestrictions = array(
*
* @par Example:
* @code
- * $wgFilterLogTypes => array(
+ * $wgFilterLogTypes = array(
* 'move' => true,
* 'import' => false,
* );
@@ -5513,16 +5735,16 @@ $wgFilterLogTypes = array(
* where TYPE is your log type, yoy don't need to use this array.
*/
$wgLogNames = array(
- '' => 'all-logs-page',
- 'block' => 'blocklogpage',
+ '' => 'all-logs-page',
+ 'block' => 'blocklogpage',
'protect' => 'protectlogpage',
- 'rights' => 'rightslog',
- 'delete' => 'dellogpage',
- 'upload' => 'uploadlogpage',
- 'move' => 'movelogpage',
- 'import' => 'importlogpage',
- 'patrol' => 'patrol-log-page',
- 'merge' => 'mergelog',
+ 'rights' => 'rightslog',
+ 'delete' => 'dellogpage',
+ 'upload' => 'uploadlogpage',
+ 'move' => 'movelogpage',
+ 'import' => 'importlogpage',
+ 'patrol' => 'patrol-log-page',
+ 'merge' => 'mergelog',
'suppress' => 'suppressionlog',
);
@@ -5536,16 +5758,16 @@ $wgLogNames = array(
* where TYPE is your log type, yoy don't need to use this array.
*/
$wgLogHeaders = array(
- '' => 'alllogstext',
- 'block' => 'blocklogtext',
+ '' => 'alllogstext',
+ 'block' => 'blocklogtext',
'protect' => 'protectlogtext',
- 'rights' => 'rightslogtext',
- 'delete' => 'dellogpagetext',
- 'upload' => 'uploadlogpagetext',
- 'move' => 'movelogpagetext',
- 'import' => 'importlogpagetext',
- 'patrol' => 'patrol-log-header',
- 'merge' => 'mergelogpagetext',
+ 'rights' => 'rightslogtext',
+ 'delete' => 'dellogpagetext',
+ 'upload' => 'uploadlogpagetext',
+ 'move' => 'movelogpagetext',
+ 'import' => 'importlogpagetext',
+ 'patrol' => 'patrol-log-header',
+ 'merge' => 'mergelogpagetext',
'suppress' => 'suppressionlogtext',
);
@@ -5556,23 +5778,21 @@ $wgLogHeaders = array(
* Extensions with custom log types may add to this array.
*/
$wgLogActions = array(
- 'block/block' => 'blocklogentry',
- 'block/unblock' => 'unblocklogentry',
- 'block/reblock' => 'reblock-logentry',
- 'protect/protect' => 'protectedarticle',
- 'protect/modify' => 'modifiedarticleprotection',
- 'protect/unprotect' => 'unprotectedarticle',
- 'protect/move_prot' => 'movedarticleprotection',
- 'rights/rights' => 'rightslogentry',
- 'rights/autopromote' => 'rightslogentry-autopromote',
- 'upload/upload' => 'uploadedimage',
- 'upload/overwrite' => 'overwroteimage',
- 'upload/revert' => 'uploadedimage',
- 'import/upload' => 'import-logentry-upload',
- 'import/interwiki' => 'import-logentry-interwiki',
- 'merge/merge' => 'pagemerge-logentry',
- 'suppress/block' => 'blocklogentry',
- 'suppress/reblock' => 'reblock-logentry',
+ 'block/block' => 'blocklogentry',
+ 'block/unblock' => 'unblocklogentry',
+ 'block/reblock' => 'reblock-logentry',
+ 'protect/protect' => 'protectedarticle',
+ 'protect/modify' => 'modifiedarticleprotection',
+ 'protect/unprotect' => 'unprotectedarticle',
+ 'protect/move_prot' => 'movedarticleprotection',
+ 'upload/upload' => 'uploadedimage',
+ 'upload/overwrite' => 'overwroteimage',
+ 'upload/revert' => 'uploadedimage',
+ 'import/upload' => 'import-logentry-upload',
+ 'import/interwiki' => 'import-logentry-interwiki',
+ 'merge/merge' => 'pagemerge-logentry',
+ 'suppress/block' => 'blocklogentry',
+ 'suppress/reblock' => 'reblock-logentry',
);
/**
@@ -5582,16 +5802,18 @@ $wgLogActions = array(
* @see LogFormatter
*/
$wgLogActionsHandlers = array(
- 'move/move' => 'MoveLogFormatter',
- 'move/move_redir' => 'MoveLogFormatter',
- 'delete/delete' => 'DeleteLogFormatter',
- 'delete/restore' => 'DeleteLogFormatter',
- 'delete/revision' => 'DeleteLogFormatter',
- 'delete/event' => 'DeleteLogFormatter',
+ 'move/move' => 'MoveLogFormatter',
+ 'move/move_redir' => 'MoveLogFormatter',
+ 'delete/delete' => 'DeleteLogFormatter',
+ 'delete/restore' => 'DeleteLogFormatter',
+ 'delete/revision' => 'DeleteLogFormatter',
+ 'delete/event' => 'DeleteLogFormatter',
'suppress/revision' => 'DeleteLogFormatter',
- 'suppress/event' => 'DeleteLogFormatter',
- 'suppress/delete' => 'DeleteLogFormatter',
- 'patrol/patrol' => 'PatrolLogFormatter',
+ 'suppress/event' => 'DeleteLogFormatter',
+ 'suppress/delete' => 'DeleteLogFormatter',
+ 'patrol/patrol' => 'PatrolLogFormatter',
+ 'rights/rights' => 'RightsLogFormatter',
+ 'rights/autopromote' => 'RightsLogFormatter',
);
/**
@@ -5620,110 +5842,10 @@ $wgDisableQueryPageUpdate = false;
/**
* List of special pages, followed by what subtitle they should go under
* at Special:SpecialPages
+ *
+ * @deprecated 1.21 Override SpecialPage::getGroupName instead
*/
-$wgSpecialPageGroups = array(
- 'DoubleRedirects' => 'maintenance',
- 'BrokenRedirects' => 'maintenance',
- 'Lonelypages' => 'maintenance',
- 'Uncategorizedpages' => 'maintenance',
- 'Uncategorizedcategories' => 'maintenance',
- 'Uncategorizedimages' => 'maintenance',
- 'Uncategorizedtemplates' => 'maintenance',
- 'Unusedcategories' => 'maintenance',
- 'Unusedimages' => 'maintenance',
- 'Protectedpages' => 'maintenance',
- 'Protectedtitles' => 'maintenance',
- 'Unusedtemplates' => 'maintenance',
- 'Withoutinterwiki' => 'maintenance',
- 'Longpages' => 'maintenance',
- 'Shortpages' => 'maintenance',
- 'Ancientpages' => 'maintenance',
- 'Deadendpages' => 'maintenance',
- 'Wantedpages' => 'maintenance',
- 'Wantedcategories' => 'maintenance',
- 'Wantedfiles' => 'maintenance',
- 'Wantedtemplates' => 'maintenance',
- 'Unwatchedpages' => 'maintenance',
- 'Fewestrevisions' => 'maintenance',
-
- 'Userlogin' => 'login',
- 'Userlogout' => 'login',
- 'CreateAccount' => 'login',
-
- 'Recentchanges' => 'changes',
- 'Recentchangeslinked' => 'changes',
- 'Watchlist' => 'changes',
- 'Newimages' => 'changes',
- 'Newpages' => 'changes',
- 'Log' => 'changes',
- 'Tags' => 'changes',
-
- 'Upload' => 'media',
- 'Listfiles' => 'media',
- 'MIMEsearch' => 'media',
- 'FileDuplicateSearch' => 'media',
- 'Filepath' => 'media',
-
- 'Listusers' => 'users',
- 'Activeusers' => 'users',
- 'Listgrouprights' => 'users',
- 'BlockList' => 'users',
- 'Contributions' => 'users',
- 'Emailuser' => 'users',
- 'Listadmins' => 'users',
- 'Listbots' => 'users',
- 'Userrights' => 'users',
- 'Block' => 'users',
- 'Unblock' => 'users',
- 'Preferences' => 'users',
- 'ChangeEmail' => 'users',
- 'ChangePassword' => 'users',
- 'DeletedContributions' => 'users',
- 'PasswordReset' => 'users',
-
- 'Mostlinked' => 'highuse',
- 'Mostlinkedcategories' => 'highuse',
- 'Mostlinkedtemplates' => 'highuse',
- 'Mostcategories' => 'highuse',
- 'Mostimages' => 'highuse',
- 'Mostinterwikis' => 'highuse',
- 'Mostrevisions' => 'highuse',
-
- 'Allpages' => 'pages',
- 'Prefixindex' => 'pages',
- 'Listredirects' => 'pages',
- 'Categories' => 'pages',
- 'Disambiguations' => 'pages',
-
- 'Randompage' => 'redirects',
- 'Randomredirect' => 'redirects',
- 'Mypage' => 'redirects',
- 'Mytalk' => 'redirects',
- 'Mycontributions' => 'redirects',
- 'Search' => 'redirects',
- 'LinkSearch' => 'redirects',
-
- 'ComparePages' => 'pagetools',
- 'Movepage' => 'pagetools',
- 'MergeHistory' => 'pagetools',
- 'Revisiondelete' => 'pagetools',
- 'Undelete' => 'pagetools',
- 'Export' => 'pagetools',
- 'Import' => 'pagetools',
- 'Whatlinkshere' => 'pagetools',
-
- 'Statistics' => 'wiki',
- 'Version' => 'wiki',
- 'Lockdb' => 'wiki',
- 'Unlockdb' => 'wiki',
- 'Allmessages' => 'wiki',
- 'Popularpages' => 'wiki',
-
- 'Specialpages' => 'other',
- 'Blockme' => 'other',
- 'Booksources' => 'other',
- 'JavaScriptTest' => 'other',
-);
+$wgSpecialPageGroups = array();
/** Whether or not to sort special pages in Special:Specialpages */
@@ -5759,24 +5881,24 @@ $wgMaxRedirectLinksRetrieved = 500;
* Unsetting core actions will probably cause things to complain loudly.
*/
$wgActions = array(
- 'credits' => true,
- 'delete' => true,
- 'edit' => true,
- 'history' => true,
- 'info' => true,
- 'markpatrolled' => true,
- 'protect' => true,
- 'purge' => true,
- 'raw' => true,
- 'render' => true,
- 'revert' => true,
+ 'credits' => true,
+ 'delete' => true,
+ 'edit' => true,
+ 'history' => true,
+ 'info' => true,
+ 'markpatrolled' => true,
+ 'protect' => true,
+ 'purge' => true,
+ 'raw' => true,
+ 'render' => true,
+ 'revert' => true,
'revisiondelete' => true,
- 'rollback' => true,
- 'submit' => true,
- 'unprotect' => true,
- 'unwatch' => true,
- 'view' => true,
- 'watch' => true,
+ 'rollback' => true,
+ 'submit' => true,
+ 'unprotect' => true,
+ 'unwatch' => true,
+ 'view' => true,
+ 'watch' => true,
);
/**
@@ -5818,14 +5940,14 @@ $wgNamespaceRobotPolicies = array();
/**
* Robot policies per article. These override the per-namespace robot policies.
- * Must be in the form of an array where the key part is a properly canonical-
- * ised text form title and the value is a robot policy.
+ * Must be in the form of an array where the key part is a properly canonicalised
+ * text form title and the value is a robot policy.
*
* @par Example:
* @code
* $wgArticleRobotPolicies = array(
- * 'Main Page' => 'noindex,follow',
- * 'User:Bob' => 'index,follow',
+ * 'Main Page' => 'noindex,follow',
+ * 'User:Bob' => 'index,follow',
* );
* @endcode
*
@@ -5882,6 +6004,22 @@ $wgEnableAPI = true;
$wgEnableWriteAPI = true;
/**
+ *
+ * WARNING: SECURITY THREAT - debug use only
+ *
+ * Disables many security checks in the API for debugging purposes.
+ * This flag should never be used on the production servers, as it introduces
+ * a number of potential security holes. Even when enabled, the validation
+ * will still be performed, but instead of failing, API will return a warning.
+ * Also, there will always be a warning notifying that this flag is set.
+ * At this point, the flag allows GET requests to go through for modules
+ * requiring POST.
+ *
+ * @since 1.21
+ */
+$wgDebugAPI = false;
+
+/**
* API module extensions.
* Associative array mapping module name to class name.
* Extension modules may override the core modules.
@@ -5893,6 +6031,12 @@ $wgAPIPropModules = array();
$wgAPIListModules = array();
/**
+ * This variable is ignored. To add your module to the API, please add it to $wgAPI*Modules
+ * @deprecated since 1.21
+ */
+$wgAPIGeneratorModules = array();
+
+/**
* Maximum amount of rows to scan in a DB query in the API
* The default value is generally fine
*/
@@ -5919,7 +6063,7 @@ $wgAPIRequestLog = false;
/**
* Set the timeout for the API help text cache. If set to 0, caching disabled
*/
-$wgAPICacheHelpTimeout = 60*60;
+$wgAPICacheHelpTimeout = 60 * 60;
/**
* Enable AJAX framework
@@ -5961,10 +6105,10 @@ $wgAjaxLicensePreview = true;
* @par Example:
* @code
* $wgCrossSiteAJAXdomains = array(
- * 'www.mediawiki.org',
- * '*.wikipedia.org',
- * '*.wikimedia.org',
- * '*.wiktionary.org',
+ * 'www.mediawiki.org',
+ * '*.wikipedia.org',
+ * '*.wikimedia.org',
+ * '*.wiktionary.org',
* );
* @endcode
*/
@@ -5997,11 +6141,42 @@ $wgMaxShellMemory = 102400;
$wgMaxShellFileSize = 102400;
/**
- * Maximum CPU time in seconds for shell processes under linux
+ * Maximum CPU time in seconds for shell processes under Linux
*/
$wgMaxShellTime = 180;
/**
+ * Maximum wall clock time (i.e. real time, of the kind the clock on the wall
+ * would measure) in seconds for shell processes under Linux
+ */
+$wgMaxShellWallClockTime = 180;
+
+/**
+ * Under Linux: a cgroup directory used to constrain memory usage of shell
+ * commands. The directory must be writable by the user which runs MediaWiki.
+ *
+ * If specified, this is used instead of ulimit, which is inaccurate, and
+ * causes malloc() to return NULL, which exposes bugs in C applications, making
+ * them segfault or deadlock.
+ *
+ * A wrapper script will create a cgroup for each shell command that runs, as
+ * a subgroup of the specified cgroup. If the memory limit is exceeded, the
+ * kernel will send a SIGKILL signal to a process in the subgroup.
+ *
+ * @par Example:
+ * @code
+ * mkdir -p /sys/fs/cgroup/memory/mediawiki
+ * mkdir -m 0777 /sys/fs/cgroup/memory/mediawiki/job
+ * echo '$wgShellCgroup = "/sys/fs/cgroup/memory/mediawiki/job";' >> LocalSettings.php
+ * @endcode
+ *
+ * The reliability of cgroup cleanup can be improved by installing a
+ * notify_on_release script in the root cgroup, see e.g.
+ * https://gerrit.wikimedia.org/r/#/c/40784
+ */
+$wgShellCgroup = false;
+
+/**
* Executable path of the PHP cli binary (php/php5). Should be set up on install.
*/
$wgPhpCli = '/usr/bin/php';
@@ -6061,6 +6236,15 @@ $wgUpdateRowsPerJob = 500;
*/
$wgUpdateRowsPerQuery = 100;
+/**
+ * Do not purge all the pages that use a page when it is edited
+ * if there are more than this many such pages. This is used to
+ * avoid invalidating a large portion of the squid/parser cache.
+ *
+ * This setting should factor in any squid/parser cache expiry settings.
+ */
+$wgMaxBacklinksInvalidate = false;
+
/** @} */ # End job queue }
/************************************************************************//**
@@ -6113,20 +6297,6 @@ $wgCompiledFiles = array();
/** @} */ # End of HipHop compilation }
-
-/************************************************************************//**
- * @name Mobile support
- * @{
- */
-
-/**
- * Name of the class used for mobile device detection, must be inherited from
- * IDeviceDetector.
- */
-$wgDeviceDetectionClass = 'DeviceDetection';
-
-/** @} */ # End of Mobile support }
-
/************************************************************************//**
* @name Miscellaneous
* @{
@@ -6211,6 +6381,57 @@ $wgDBtestuser = ''; //db user that has permission to create and drop the test da
$wgDBtestpassword = '';
/**
+ * Associative array mapping namespace IDs to the name of the content model pages in that namespace should have by
+ * default (use the CONTENT_MODEL_XXX constants). If no special content type is defined for a given namespace,
+ * pages in that namespace will use the CONTENT_MODEL_WIKITEXT (except for the special case of JS and CS pages).
+ *
+ * @since 1.21
+ */
+$wgNamespaceContentModels = array();
+
+/**
+ * How to react if a plain text version of a non-text Content object is requested using ContentHandler::getContentText():
+ *
+ * * 'ignore': return null
+ * * 'fail': throw an MWException
+ * * 'serialize': serialize to default format
+ *
+ * @since 1.21
+ */
+$wgContentHandlerTextFallback = 'ignore';
+
+/**
+ * Set to false to disable use of the database fields introduced by the ContentHandler facility.
+ * This way, the ContentHandler facility can be used without any additional information in the database.
+ * A page's content model is then derived solely from the page's title. This however means that changing
+ * a page's default model (e.g. using $wgNamespaceContentModels) will break the page and/or make the content
+ * inaccessible. This also means that pages can not be moved to a title that would default to a different
+ * content model.
+ *
+ * Overall, with $wgContentHandlerUseDB = false, no database updates are needed, but content handling
+ * is less robust and less flexible.
+ *
+ * @since 1.21
+ */
+$wgContentHandlerUseDB = true;
+
+/**
+ * Determines which types of text are parsed as wikitext. This does not imply that these kinds
+ * of texts are also rendered as wikitext, it only means that links, magic words, etc will have
+ * the effect on the database they would have on a wikitext page.
+ *
+ * @todo: On the long run, it would be nice to put categories etc into a separate structure,
+ * or at least parse only the contents of comments in the scripts.
+ *
+ * @since 1.21
+ */
+$wgTextModelsToParse = array(
+ CONTENT_MODEL_WIKITEXT, // Just for completeness, wikitext will always be parsed.
+ CONTENT_MODEL_JAVASCRIPT, // Make categories etc work, people put them into comments.
+ CONTENT_MODEL_CSS, // Make categories etc work, people put them into comments.
+);
+
+/**
* Whether the user must enter their password to change their e-mail address
*
* @since 1.20
@@ -6218,6 +6439,15 @@ $wgDBtestpassword = '';
$wgRequirePasswordforEmailChange = true;
/**
+ * Register handlers for specific types of sites.
+ *
+ * @since 1.20
+ */
+$wgSiteTypes = array(
+ 'mediawiki' => 'MediaWikiSite',
+);
+
+/**
* For really cool vim folding this needs to be at the end:
* vim: foldmarker=@{,@} foldmethod=marker
* @}
diff --git a/includes/DeferredUpdates.php b/includes/DeferredUpdates.php
index b4989a69..89c4df68 100644
--- a/includes/DeferredUpdates.php
+++ b/includes/DeferredUpdates.php
@@ -34,7 +34,7 @@ interface DeferrableUpdate {
}
/**
- * Class for mananging the deferred updates.
+ * Class for managing the deferred updates.
*
* @since 1.19
*/
@@ -66,7 +66,7 @@ class DeferredUpdates {
/**
* Do any deferred updates and clear the list
*
- * @param $commit String: set to 'commit' to commit after every update to
+ * @param string $commit set to 'commit' to commit after every update to
* prevent lock contention
*/
public static function doUpdates( $commit = '' ) {
@@ -92,7 +92,7 @@ class DeferredUpdates {
$update->doUpdate();
if ( $doCommit && $dbw->trxLevel() ) {
- $dbw->commit( __METHOD__ );
+ $dbw->commit( __METHOD__, 'flush' );
}
} catch ( MWException $e ) {
// We don't want exceptions thrown during deferred updates to
diff --git a/includes/Defines.php b/includes/Defines.php
index be9f9816..c4a86335 100644
--- a/includes/Defines.php
+++ b/includes/Defines.php
@@ -39,7 +39,7 @@ define( 'MW_SPECIALPAGE_VERSION', 2 );
define( 'DBO_DEBUG', 1 );
define( 'DBO_NOBUFFER', 2 );
define( 'DBO_IGNORE', 4 );
-define( 'DBO_TRX', 8 );
+define( 'DBO_TRX', 8 ); // automatically start transaction on first query
define( 'DBO_DEFAULT', 16 );
define( 'DBO_PERSISTENT', 32 );
define( 'DBO_SYSDBA', 64 ); //for oracle maintenance
@@ -54,13 +54,12 @@ define( 'DBO_COMPRESS', 512 );
*/
define( 'DB_SLAVE', -1 ); # Read from the slave (or only server)
define( 'DB_MASTER', -2 ); # Write to master (or only server)
-define( 'DB_LAST', -3 ); # Whatever database was used last
/**@}*/
# Obsolete aliases
define( 'DB_READ', -1 );
define( 'DB_WRITE', -2 );
-
+define( 'DB_LAST', -3 ); # deprecated since 2008, usage throws exception
/**@{
* Virtual namespaces; don't appear in the page database
@@ -138,7 +137,7 @@ define( 'MEDIATYPE_ARCHIVE', 'ARCHIVE' ); // archive file (zip, tar, etc)
*/
define( 'AV_NO_VIRUS', 0 ); #scan ok, no virus found
define( 'AV_VIRUS_FOUND', 1 ); #virus found!
-define( 'AV_SCAN_ABORTED', -1 ); #scan aborted, the file is probably imune
+define( 'AV_SCAN_ABORTED', -1 ); #scan aborted, the file is probably immune
define( 'AV_SCAN_FAILED', false ); #scan failed (scanner not found or error in scanner)
/**@}*/
@@ -171,11 +170,12 @@ define( 'MW_DATE_ISO', 'ISO 8601' );
/**@{
* RecentChange type identifiers
*/
-define( 'RC_EDIT', 0);
-define( 'RC_NEW', 1);
-define( 'RC_MOVE', 2); // obsolete
-define( 'RC_LOG', 3);
-define( 'RC_MOVE_OVER_REDIRECT', 4); // obsolete
+define( 'RC_EDIT', 0 );
+define( 'RC_NEW', 1 );
+define( 'RC_MOVE', 2 ); // obsolete
+define( 'RC_LOG', 3 );
+define( 'RC_MOVE_OVER_REDIRECT', 4 ); // obsolete
+define( 'RC_EXTERNAL', 5 );
/**@}*/
/**@{
@@ -199,7 +199,6 @@ define( 'LIST_AND', 1 );
define( 'LIST_SET', 2 );
define( 'LIST_NAMES', 3);
define( 'LIST_OR', 4);
-define( 'LIST_SET_PREPARED', 8); // List of (?, ?, ?) for DatabaseIbm_db2
/**@}*/
/**
@@ -213,6 +212,7 @@ require_once __DIR__.'/normal/UtfNormalDefines.php';
define( 'MW_SUPPORTS_EDITFILTERMERGED', 1 );
define( 'MW_SUPPORTS_PARSERFIRSTCALLINIT', 1 );
define( 'MW_SUPPORTS_LOCALISATIONCACHE', 1 );
+define( 'MW_SUPPORTS_CONTENTHANDLER', 1 );
/**@}*/
/** Support for $wgResourceModules */
@@ -225,7 +225,7 @@ define( 'MW_SUPPORTS_RESOURCE_MODULES', 1 );
define( 'OT_HTML', 1 );
define( 'OT_WIKI', 2 );
define( 'OT_PREPROCESS', 3 );
-define( 'OT_MSG' , 3 ); // b/c alias for OT_PREPROCESS
+define( 'OT_MSG', 3 ); // b/c alias for OT_PREPROCESS
define( 'OT_PLAIN', 4 );
/**@}*/
@@ -261,7 +261,7 @@ define( 'APCOND_BLOCKED', 8 );
define( 'APCOND_ISBOT', 9 );
/**@}*/
-/**
+/** @{
* Protocol constants for wfExpandUrl()
*/
define( 'PROTO_HTTP', 'http://' );
@@ -270,3 +270,35 @@ define( 'PROTO_RELATIVE', '//' );
define( 'PROTO_CURRENT', null );
define( 'PROTO_CANONICAL', 1 );
define( 'PROTO_INTERNAL', 2 );
+/**@}*/
+
+/**@{
+ * Content model ids, used by Content and ContentHandler.
+ * These IDs will be exposed in the API and XML dumps.
+ *
+ * Extensions that define their own content model IDs should take
+ * care to avoid conflicts. Using the extension name as a prefix is recommended,
+ * for example 'myextension-somecontent'.
+ */
+define( 'CONTENT_MODEL_WIKITEXT', 'wikitext' );
+define( 'CONTENT_MODEL_JAVASCRIPT', 'javascript' );
+define( 'CONTENT_MODEL_CSS', 'css' );
+define( 'CONTENT_MODEL_TEXT', 'text' );
+/**@}*/
+
+/**@{
+ * Content formats, used by Content and ContentHandler.
+ * These should be MIME types, and will be exposed in the API and XML dumps.
+ *
+ * Extensions are free to use the below formats, or define their own.
+ * It is recommended to stick with the conventions for MIME types.
+ */
+define( 'CONTENT_FORMAT_WIKITEXT', 'text/x-wiki' ); // wikitext
+define( 'CONTENT_FORMAT_JAVASCRIPT', 'text/javascript' ); // for js pages
+define( 'CONTENT_FORMAT_CSS', 'text/css' ); // for css pages
+define( 'CONTENT_FORMAT_TEXT', 'text/plain' ); // for future use, e.g. with some plain-html messages.
+define( 'CONTENT_FORMAT_HTML', 'text/html' ); // for future use, e.g. with some plain-html messages.
+define( 'CONTENT_FORMAT_SERIALIZED', 'application/vnd.php.serialized' ); // for future use with the api and for extensions
+define( 'CONTENT_FORMAT_JSON', 'application/json' ); // for future use with the api, and for use by extensions
+define( 'CONTENT_FORMAT_XML', 'application/xml' ); // for future use with the api, and for use by extensions
+/**@}*/
diff --git a/includes/DeprecatedGlobal.php b/includes/DeprecatedGlobal.php
index 4d7b9689..d48bd0b0 100644
--- a/includes/DeprecatedGlobal.php
+++ b/includes/DeprecatedGlobal.php
@@ -27,7 +27,7 @@
*/
class DeprecatedGlobal extends StubObject {
- // The m's are to stay consistent with parent class.
+ // The m's are to stay consistent with parent class.
protected $mRealValue, $mVersion;
function __construct( $name, $realValue, $version = false ) {
diff --git a/includes/EditPage.php b/includes/EditPage.php
index b762cad1..8b2dbb5f 100644
--- a/includes/EditPage.php
+++ b/includes/EditPage.php
@@ -40,90 +40,90 @@ class EditPage {
/**
* Status: Article successfully updated
*/
- const AS_SUCCESS_UPDATE = 200;
+ const AS_SUCCESS_UPDATE = 200;
/**
* Status: Article successfully created
*/
- const AS_SUCCESS_NEW_ARTICLE = 201;
+ const AS_SUCCESS_NEW_ARTICLE = 201;
/**
* Status: Article update aborted by a hook function
*/
- const AS_HOOK_ERROR = 210;
+ const AS_HOOK_ERROR = 210;
/**
* Status: A hook function returned an error
*/
- const AS_HOOK_ERROR_EXPECTED = 212;
+ const AS_HOOK_ERROR_EXPECTED = 212;
/**
- * Status: User is blocked from editting this page
+ * Status: User is blocked from editing this page
*/
- const AS_BLOCKED_PAGE_FOR_USER = 215;
+ const AS_BLOCKED_PAGE_FOR_USER = 215;
/**
* Status: Content too big (> $wgMaxArticleSize)
*/
- const AS_CONTENT_TOO_BIG = 216;
+ const AS_CONTENT_TOO_BIG = 216;
/**
* Status: User cannot edit? (not used)
*/
- const AS_USER_CANNOT_EDIT = 217;
+ const AS_USER_CANNOT_EDIT = 217;
/**
* Status: this anonymous user is not allowed to edit this page
*/
- const AS_READ_ONLY_PAGE_ANON = 218;
+ const AS_READ_ONLY_PAGE_ANON = 218;
/**
* Status: this logged in user is not allowed to edit this page
*/
- const AS_READ_ONLY_PAGE_LOGGED = 219;
+ const AS_READ_ONLY_PAGE_LOGGED = 219;
/**
* Status: wiki is in readonly mode (wfReadOnly() == true)
*/
- const AS_READ_ONLY_PAGE = 220;
+ const AS_READ_ONLY_PAGE = 220;
/**
* Status: rate limiter for action 'edit' was tripped
*/
- const AS_RATE_LIMITED = 221;
+ const AS_RATE_LIMITED = 221;
/**
- * Status: article was deleted while editting and param wpRecreate == false or form
+ * Status: article was deleted while editing and param wpRecreate == false or form
* was not posted
*/
- const AS_ARTICLE_WAS_DELETED = 222;
+ const AS_ARTICLE_WAS_DELETED = 222;
/**
* Status: user tried to create this page, but is not allowed to do that
* ( Title->usercan('create') == false )
*/
- const AS_NO_CREATE_PERMISSION = 223;
+ const AS_NO_CREATE_PERMISSION = 223;
/**
* Status: user tried to create a blank page
*/
- const AS_BLANK_ARTICLE = 224;
+ const AS_BLANK_ARTICLE = 224;
/**
* Status: (non-resolvable) edit conflict
*/
- const AS_CONFLICT_DETECTED = 225;
+ const AS_CONFLICT_DETECTED = 225;
/**
* Status: no edit summary given and the user has forceeditsummary set and the user is not
- * editting in his own userspace or talkspace and wpIgnoreBlankSummary == false
+ * editing in his own userspace or talkspace and wpIgnoreBlankSummary == false
*/
- const AS_SUMMARY_NEEDED = 226;
+ const AS_SUMMARY_NEEDED = 226;
/**
* Status: user tried to create a new section without content
*/
- const AS_TEXTBOX_EMPTY = 228;
+ const AS_TEXTBOX_EMPTY = 228;
/**
* Status: article is too big (> $wgMaxArticleSize), after merging in the new section
@@ -133,32 +133,57 @@ class EditPage {
/**
* not used
*/
- const AS_OK = 230;
+ const AS_OK = 230;
/**
- * Status: WikiPage::doEdit() was unsuccessfull
+ * Status: WikiPage::doEdit() was unsuccessful
*/
- const AS_END = 231;
+ const AS_END = 231;
/**
* Status: summary contained spam according to one of the regexes in $wgSummarySpamRegex
*/
- const AS_SPAM_ERROR = 232;
+ const AS_SPAM_ERROR = 232;
/**
* Status: anonymous user is not allowed to upload (User::isAllowed('upload') == false)
*/
- const AS_IMAGE_REDIRECT_ANON = 233;
+ const AS_IMAGE_REDIRECT_ANON = 233;
/**
* Status: logged in user is not allowed to upload (User::isAllowed('upload') == false)
*/
- const AS_IMAGE_REDIRECT_LOGGED = 234;
+ const AS_IMAGE_REDIRECT_LOGGED = 234;
+
+ /**
+ * Status: can't parse content
+ */
+ const AS_PARSE_ERROR = 240;
/**
* HTML id and name for the beginning of the edit form.
*/
- const EDITFORM_ID = 'editform';
+ const EDITFORM_ID = 'editform';
+
+ /**
+ * Prefix of key for cookie used to pass post-edit state.
+ * The revision id edited is added after this
+ */
+ const POST_EDIT_COOKIE_KEY_PREFIX = 'PostEditRevision';
+
+ /**
+ * Duration of PostEdit cookie, in seconds.
+ * The cookie will be removed instantly if the JavaScript runs.
+ *
+ * Otherwise, though, we don't want the cookies to accumulate.
+ * RFC 2109 ( https://www.ietf.org/rfc/rfc2109.txt ) specifies a possible limit of only 20 cookies per domain.
+ * This still applies at least to some versions of IE without full updates:
+ * https://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx
+ *
+ * A value of 20 minutes should be enough to take into account slow loads and minor
+ * clock skew while still avoiding cookie accumulation when JavaScript is turned off.
+ */
+ const POST_EDIT_COOKIE_DURATION = 1200;
/**
* @var Article
@@ -214,6 +239,7 @@ class EditPage {
var $textbox1 = '', $textbox2 = '', $summary = '', $nosummary = false;
var $edittime = '', $section = '', $sectiontitle = '', $starttime = '';
var $oldid = 0, $editintro = '', $scrolltop = null, $bot = true;
+ var $contentModel = null, $contentFormat = null;
# Placeholders for text injection by hooks (must be HTML)
# extensions should take care to _append_ to the present value
@@ -225,20 +251,32 @@ class EditPage {
public $editFormTextBottom = '';
public $editFormTextAfterContent = '';
public $previewTextAfterContent = '';
- public $mPreloadText = '';
+ public $mPreloadContent = null;
- /* $didSave should be set to true whenever an article was succesfully altered. */
+ /* $didSave should be set to true whenever an article was successfully altered. */
public $didSave = false;
public $undidRev = 0;
public $suppressIntro = false;
/**
+ * Set to true to allow editing of non-text content types.
+ *
+ * @var bool
+ */
+ public $allowNonTextContent = false;
+
+ /**
* @param $article Article
*/
public function __construct( Article $article ) {
$this->mArticle = $article;
$this->mTitle = $article->getTitle();
+
+ $this->contentModel = $this->mTitle->getContentModel();
+
+ $handler = ContentHandler::getForModelID( $this->contentModel );
+ $this->contentFormat = $handler->getDefaultFormat();
}
/**
@@ -267,7 +305,7 @@ class EditPage {
/**
* Get the context title object.
- * If not set, $wgTitle will be returned. This behavior might changed in
+ * If not set, $wgTitle will be returned. This behavior might change in
* the future to return $this->mTitle instead.
*
* @return Title object
@@ -359,11 +397,10 @@ class EditPage {
$this->isConflict = false;
// css / js subpages of user pages get a special treatment
- $this->isCssJsSubpage = $this->mTitle->isCssJsSubpage();
- $this->isCssSubpage = $this->mTitle->isCssSubpage();
- $this->isJsSubpage = $this->mTitle->isJsSubpage();
+ $this->isCssJsSubpage = $this->mTitle->isCssJsSubpage();
+ $this->isCssSubpage = $this->mTitle->isCssSubpage();
+ $this->isJsSubpage = $this->mTitle->isJsSubpage();
$this->isWrongCaseCssJsPage = $this->isWrongCaseCssJsPage();
- $this->isNew = !$this->mTitle->exists() || $this->section == 'new';
# Show applicable editing introductions
if ( $this->formtype == 'initial' || $this->firsttime ) {
@@ -392,10 +429,13 @@ class EditPage {
wfProfileOut( __METHOD__ );
return;
}
- if ( !$this->mTitle->getArticleID() )
+
+ if ( !$this->mTitle->getArticleID() ) {
wfRunHooks( 'EditFormPreloadText', array( &$this->textbox1, &$this->mTitle ) );
- else
+ } else {
wfRunHooks( 'EditFormInitialText', array( $this ) );
+ }
+
}
$this->showEditForm();
@@ -436,8 +476,9 @@ class EditPage {
* "View source for ..." page displaying the source code after the error message.
*
* @since 1.19
- * @param $permErrors Array of permissions errors, as returned by
+ * @param array $permErrors of permissions errors, as returned by
* Title::getUserPermissionsErrors().
+ * @throws PermissionsError
*/
protected function displayPermissionsError( array $permErrors ) {
global $wgRequest, $wgOut;
@@ -450,15 +491,16 @@ class EditPage {
return;
}
- $content = $this->getContent();
+ $content = $this->getContentObject();
# Use the normal message if there's nothing to display
- if ( $this->firsttime && $content === '' ) {
+ if ( $this->firsttime && ( !$content || $content->isEmpty() ) ) {
$action = $this->mTitle->exists() ? 'edit' :
( $this->mTitle->isTalkPage() ? 'createtalk' : 'createpage' );
throw new PermissionsError( $action, $permErrors );
}
+ $wgOut->setRobotPolicy( 'noindex,nofollow' );
$wgOut->setPageTitle( wfMessage( 'viewsource-title', $this->getContextTitle()->getPrefixedText() ) );
$wgOut->addBacklinkSubtitle( $this->getContextTitle() );
$wgOut->addWikiText( $wgOut->formatPermissionsErrorMessage( $permErrors, 'edit' ) );
@@ -467,13 +509,14 @@ class EditPage {
# If the user made changes, preserve them when showing the markup
# (This happens when a user is blocked during edit, for instance)
if ( !$this->firsttime ) {
- $content = $this->textbox1;
+ $text = $this->textbox1;
$wgOut->addWikiMsg( 'viewyourtext' );
} else {
+ $text = $this->toEditText( $content );
$wgOut->addWikiMsg( 'viewsourcetext' );
}
- $this->showTextbox( $content, 'wpTextbox1', array( 'readonly' ) );
+ $this->showTextbox( $text, 'wpTextbox1', array( 'readonly' ) );
$wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'templatesUsed' ),
Linker::formatTemplates( $this->getTemplates() ) ) );
@@ -520,11 +563,11 @@ class EditPage {
// Nothing *to* preview for new sections
return false;
} elseif ( ( $wgRequest->getVal( 'preload' ) !== null || $this->mTitle->exists() ) && $wgUser->getOption( 'previewonfirst' ) ) {
- // Standard preference behaviour
+ // Standard preference behavior
return true;
} elseif ( !$this->mTitle->exists() &&
- isset( $wgPreviewOnOpenNamespaces[$this->mTitle->getNamespace()] ) &&
- $wgPreviewOnOpenNamespaces[$this->mTitle->getNamespace()] )
+ isset( $wgPreviewOnOpenNamespaces[$this->mTitle->getNamespace()] ) &&
+ $wgPreviewOnOpenNamespaces[$this->mTitle->getNamespace()] )
{
// Categories are special
return true;
@@ -554,13 +597,15 @@ class EditPage {
}
/**
- * Does this EditPage class support section editing?
- * This is used by EditPage subclasses to indicate their ui cannot handle section edits
+ * Returns whether section editing is supported for the current page.
+ * Subclasses may override this to replace the default behavior, which is
+ * to check ContentHandler::supportsSections.
*
- * @return bool
+ * @return bool true if this edit page supports sections, false otherwise.
*/
protected function isSectionEditSupported() {
- return true;
+ $contentHandler = ContentHandler::getForTitle( $this->mTitle );
+ return $contentHandler->supportsSections();
}
/**
@@ -568,13 +613,19 @@ class EditPage {
* @param $request WebRequest
*/
function importFormData( &$request ) {
- global $wgLang, $wgUser;
+ global $wgContLang, $wgUser;
wfProfileIn( __METHOD__ );
# Section edit can come from either the form or a link
$this->section = $request->getVal( 'wpSection', $request->getVal( 'section' ) );
+ if ( $this->section !== null && $this->section !== '' && !$this->isSectionEditSupported() ) {
+ throw new ErrorPageError( 'sectioneditnotsupported-title', 'sectioneditnotsupported-text' );
+ }
+
+ $this->isNew = !$this->mTitle->exists() || $this->section == 'new';
+
if ( $request->wasPosted() ) {
# These fields need to be checked for encoding.
# Also remove trailing whitespace, but don't remove _initial_
@@ -586,13 +637,15 @@ class EditPage {
// modified by subclasses
wfProfileIn( get_class( $this ) . "::importContentFormData" );
$textbox1 = $this->importContentFormData( $request );
- if ( isset( $textbox1 ) )
+ if ( $textbox1 !== null ) {
$this->textbox1 = $textbox1;
+ }
+
wfProfileOut( get_class( $this ) . "::importContentFormData" );
}
# Truncate for whole multibyte characters
- $this->summary = $wgLang->truncate( $request->getText( 'wpSummary' ), 255 );
+ $this->summary = $wgContLang->truncate( $request->getText( 'wpSummary' ), 255 );
# If the summary consists of a heading, e.g. '==Foobar==', extract the title from the
# header syntax, e.g. 'Foobar'. This is mainly an issue when we are using wpSummary for
@@ -604,7 +657,7 @@ class EditPage {
# currently doing double duty as both edit summary and section title. Right now this
# is just to allow API edits to work around this limitation, but this should be
# incorporated into the actual edit form when EditPage is rewritten (Bugs 18654, 26312).
- $this->sectiontitle = $wgLang->truncate( $request->getText( 'wpSectionTitle' ), 255 );
+ $this->sectiontitle = $wgContLang->truncate( $request->getText( 'wpSectionTitle' ), 255 );
$this->sectiontitle = preg_replace( '/^\s*=+\s*(.*?)\s*=+\s*$/', '$1', $this->sectiontitle );
$this->edittime = $request->getVal( 'wpEdittime' );
@@ -661,7 +714,7 @@ class EditPage {
$this->starttime = null;
}
- $this->recreate = $request->getCheck( 'wpRecreate' );
+ $this->recreate = $request->getCheck( 'wpRecreate' );
$this->minoredit = $request->getCheck( 'wpMinoredit' );
$this->watchthis = $request->getCheck( 'wpWatchthis' );
@@ -679,18 +732,18 @@ class EditPage {
} else {
# Not a posted form? Start with nothing.
wfDebug( __METHOD__ . ": Not a posted form.\n" );
- $this->textbox1 = '';
- $this->summary = '';
+ $this->textbox1 = '';
+ $this->summary = '';
$this->sectiontitle = '';
- $this->edittime = '';
- $this->starttime = wfTimestampNow();
- $this->edit = false;
- $this->preview = false;
- $this->save = false;
- $this->diff = false;
- $this->minoredit = false;
- $this->watchthis = $request->getBool( 'watchthis', false ); // Watch may be overriden by request parameters
- $this->recreate = false;
+ $this->edittime = '';
+ $this->starttime = wfTimestampNow();
+ $this->edit = false;
+ $this->preview = false;
+ $this->save = false;
+ $this->diff = false;
+ $this->minoredit = false;
+ $this->watchthis = $request->getBool( 'watchthis', false ); // Watch may be overridden by request parameters
+ $this->recreate = false;
// When creating a new section, we can preload a section title by passing it as the
// preloadtitle parameter in the URL (Bug 13100)
@@ -711,10 +764,17 @@ class EditPage {
}
}
+ $this->oldid = $request->getInt( 'oldid' );
+
$this->bot = $request->getBool( 'bot', true );
$this->nosummary = $request->getBool( 'nosummary' );
- $this->oldid = $request->getInt( 'oldid' );
+ $content_handler = ContentHandler::getForTitle( $this->mTitle );
+ $this->contentModel = $request->getText( 'model', $content_handler->getModelID() ); #may be overridden by revision
+ $this->contentFormat = $request->getText( 'format', $content_handler->getDefaultFormat() ); #may be overridden by revision
+
+ #TODO: check if the desired model is allowed in this namespace, and if a transition from the page's current model to the new model is allowed
+ #TODO: check if the desired content model supports the given content format!
$this->live = $request->getCheck( 'live' );
$this->editintro = $request->getText( 'editintro',
@@ -730,7 +790,7 @@ class EditPage {
/**
* Subpage overridable method for extracting the page content data from the
* posted form to be placed in $this->textbox1, if using customized input
- * this method should be overrided and return the page text that will be used
+ * this method should be overridden and return the page text that will be used
* for saving, preview parsing and so on...
*
* @param $request WebRequest
@@ -747,7 +807,13 @@ class EditPage {
function initialiseForm() {
global $wgUser;
$this->edittime = $this->mArticle->getTimestamp();
- $this->textbox1 = $this->getContent( false );
+
+ $content = $this->getContentObject( false ); #TODO: track content object?!
+ if ( $content === false ) {
+ return false;
+ }
+ $this->textbox1 = $this->toEditText( $content );
+
// activate checkboxes if user wants them to be always active
# Sort out the "watch" checkbox
if ( $wgUser->getOption( 'watchdefault' ) ) {
@@ -773,36 +839,65 @@ class EditPage {
/**
* Fetch initial editing page content.
*
- * @param $def_text string
+ * @param $def_text string|bool
* @return mixed string on success, $def_text for invalid sections
* @private
+ * @deprecated since 1.21, get WikiPage::getContent() instead.
*/
- function getContent( $def_text = '' ) {
- global $wgOut, $wgRequest, $wgParser;
+ function getContent( $def_text = false ) {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ if ( $def_text !== null && $def_text !== false && $def_text !== '' ) {
+ $def_content = $this->toEditContent( $def_text );
+ } else {
+ $def_content = false;
+ }
+
+ $content = $this->getContentObject( $def_content );
+
+ // Note: EditPage should only be used with text based content anyway.
+ return $this->toEditText( $content );
+ }
+
+ /**
+ * @param Content|null $def_content The default value to return
+ *
+ * @return mixed Content on success, $def_content for invalid sections
+ *
+ * @since 1.21
+ */
+ protected function getContentObject( $def_content = null ) {
+ global $wgOut, $wgRequest;
wfProfileIn( __METHOD__ );
- $text = false;
+ $content = false;
// For message page not locally set, use the i18n message.
// For other non-existent articles, use preload text if any.
if ( !$this->mTitle->exists() || $this->section == 'new' ) {
if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI && $this->section != 'new' ) {
# If this is a system message, get the default text.
- $text = $this->mTitle->getDefaultMessageText();
+ $msg = $this->mTitle->getDefaultMessageText();
+
+ $content = $this->toEditContent( $msg );
}
- if ( $text === false ) {
+ if ( $content === false ) {
# If requested, preload some text.
$preload = $wgRequest->getVal( 'preload',
// Custom preload text for new sections
$this->section === 'new' ? 'MediaWiki:addsection-preload' : '' );
- $text = $this->getPreloadedText( $preload );
+
+ $content = $this->getPreloadedContent( $preload );
}
// For existing pages, get text based on "undo" or section parameters.
} else {
if ( $this->section != '' ) {
// Get section edit text (returns $def_text for invalid sections)
- $text = $wgParser->getSection( $this->getOriginalContent(), $this->section, $def_text );
+ $orig = $this->getOriginalContent();
+ $content = $orig ? $orig->getSection( $this->section ) : null;
+
+ if ( !$content ) $content = $def_content;
} else {
$undoafter = $wgRequest->getInt( 'undoafter' );
$undo = $wgRequest->getInt( 'undo' );
@@ -818,15 +913,16 @@ class EditPage {
# Sanity check, make sure it's the right page,
# the revisions exist and they were not deleted.
- # Otherwise, $text will be left as-is.
+ # Otherwise, $content will be left as-is.
if ( !is_null( $undorev ) && !is_null( $oldrev ) &&
$undorev->getPage() == $oldrev->getPage() &&
$undorev->getPage() == $this->mTitle->getArticleID() &&
!$undorev->isDeleted( Revision::DELETED_TEXT ) &&
!$oldrev->isDeleted( Revision::DELETED_TEXT ) ) {
- $text = $this->mArticle->getUndoText( $undorev, $oldrev );
- if ( $text === false ) {
+ $content = $this->mArticle->getUndoContent( $undorev, $oldrev );
+
+ if ( $content === false ) {
# Warn the user that something went wrong
$undoMsg = 'failure';
} else {
@@ -859,14 +955,14 @@ class EditPage {
wfMessage( 'undo-' . $undoMsg )->plain() . '</div>', true, /* interface */true );
}
- if ( $text === false ) {
- $text = $this->getOriginalContent();
+ if ( $content === false ) {
+ $content = $this->getOriginalContent();
}
}
}
wfProfileOut( __METHOD__ );
- return $text;
+ return $content;
}
/**
@@ -876,38 +972,51 @@ class EditPage {
* section replaced in its context (using WikiPage::replaceSection())
* to the original text of the edit.
*
- * This difers from Article::getContent() that when a missing revision is
- * encountered the result will be an empty string and not the
+ * This differs from Article::getContent() that when a missing revision is
+ * encountered the result will be null and not the
* 'missing-revision' message.
*
* @since 1.19
- * @return string
+ * @return Content|null
*/
private function getOriginalContent() {
if ( $this->section == 'new' ) {
- return $this->getCurrentText();
+ return $this->getCurrentContent();
}
$revision = $this->mArticle->getRevisionFetched();
if ( $revision === null ) {
- return '';
+ if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
+ $handler = ContentHandler::getForModelID( $this->contentModel );
+
+ return $handler->makeEmptyContent();
}
- return $this->mArticle->getContent();
+ $content = $revision->getContent();
+ return $content;
}
/**
- * Get the actual text of the page. This is basically similar to
- * WikiPage::getRawText() except that when the page doesn't exist an empty
- * string is returned instead of false.
+ * Get the current content of the page. This is basically similar to
+ * WikiPage::getContent( Revision::RAW ) except that when the page doesn't exist an empty
+ * content object is returned instead of null.
*
- * @since 1.19
- * @return string
+ * @since 1.21
+ * @return Content
*/
- private function getCurrentText() {
- $text = $this->mArticle->getRawText();
- if ( $text === false ) {
- return '';
+ protected function getCurrentContent() {
+ $rev = $this->mArticle->getRevision();
+ $content = $rev ? $rev->getContent( Revision::RAW ) : null;
+
+ if ( $content === false || $content === null ) {
+ if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
+ $handler = ContentHandler::getForModelID( $this->contentModel );
+
+ return $handler->makeEmptyContent();
} else {
- return $text;
+ # nasty side-effect, but needed for consistency
+ $this->contentModel = $rev->getContentModel();
+ $this->contentFormat = $rev->getContentFormat();
+
+ return $content;
}
}
@@ -915,47 +1024,111 @@ class EditPage {
* Use this method before edit() to preload some text into the edit box
*
* @param $text string
+ * @deprecated since 1.21, use setPreloadedContent() instead.
*/
public function setPreloadedText( $text ) {
- $this->mPreloadText = $text;
+ ContentHandler::deprecated( __METHOD__, "1.21" );
+
+ $content = $this->toEditContent( $text );
+
+ $this->setPreloadedContent( $content );
+ }
+
+ /**
+ * Use this method before edit() to preload some content into the edit box
+ *
+ * @param $content Content
+ *
+ * @since 1.21
+ */
+ public function setPreloadedContent( Content $content ) {
+ $this->mPreloadContent = $content;
}
/**
* Get the contents to be preloaded into the box, either set by
* an earlier setPreloadText() or by loading the given page.
*
- * @param $preload String: representing the title to preload from.
+ * @param string $preload representing the title to preload from.
+ *
* @return String
+ *
+ * @deprecated since 1.21, use getPreloadedContent() instead
*/
protected function getPreloadedText( $preload ) {
- global $wgUser, $wgParser;
+ ContentHandler::deprecated( __METHOD__, "1.21" );
+
+ $content = $this->getPreloadedContent( $preload );
+ $text = $this->toEditText( $content );
- if ( !empty( $this->mPreloadText ) ) {
- return $this->mPreloadText;
+ return $text;
+ }
+
+ /**
+ * Get the contents to be preloaded into the box, either set by
+ * an earlier setPreloadText() or by loading the given page.
+ *
+ * @param string $preload representing the title to preload from.
+ *
+ * @return Content
+ *
+ * @since 1.21
+ */
+ protected function getPreloadedContent( $preload ) {
+ global $wgUser;
+
+ if ( !empty( $this->mPreloadContent ) ) {
+ return $this->mPreloadContent;
}
+ $handler = ContentHandler::getForTitle( $this->getTitle() );
+
if ( $preload === '' ) {
- return '';
+ return $handler->makeEmptyContent();
}
$title = Title::newFromText( $preload );
# Check for existence to avoid getting MediaWiki:Noarticletext
- if ( $title === null || !$title->exists() || !$title->userCan( 'read' ) ) {
- return '';
+ if ( $title === null || !$title->exists() || !$title->userCan( 'read', $wgUser ) ) {
+ //TODO: somehow show a warning to the user!
+ return $handler->makeEmptyContent();
}
$page = WikiPage::factory( $title );
if ( $page->isRedirect() ) {
$title = $page->getRedirectTarget();
# Same as before
- if ( $title === null || !$title->exists() || !$title->userCan( 'read' ) ) {
- return '';
+ if ( $title === null || !$title->exists() || !$title->userCan( 'read', $wgUser ) ) {
+ //TODO: somehow show a warning to the user!
+ return $handler->makeEmptyContent();
}
$page = WikiPage::factory( $title );
}
$parserOptions = ParserOptions::newFromUser( $wgUser );
- return $wgParser->getPreloadText( $page->getRawText(), $title, $parserOptions );
+ $content = $page->getContent( Revision::RAW );
+
+ if ( !$content ) {
+ //TODO: somehow show a warning to the user!
+ return $handler->makeEmptyContent();
+ }
+
+ if ( $content->getModel() !== $handler->getModelID() ) {
+ $converted = $content->convert( $handler->getModelID() );
+
+ if ( !$converted ) {
+ //TODO: somehow show a warning to the user!
+ wfDebug( "Attempt to preload incompatible content: "
+ . "can't convert " . $content->getModel()
+ . " to " . $handler->getModelID() );
+
+ return $handler->makeEmptyContent();
+ }
+
+ $content = $converted;
+ }
+
+ return $content->preloadTransform( $title, $parserOptions );
}
/**
@@ -974,7 +1147,35 @@ class EditPage {
}
/**
+ * Sets post-edit cookie indicating the user just saved a particular revision.
+ *
+ * This uses a temporary cookie for each revision ID so separate saves will never
+ * interfere with each other.
+ *
+ * The cookie is deleted in the mediawiki.action.view.postEdit JS module after
+ * the redirect. It must be clearable by JavaScript code, so it must not be
+ * marked HttpOnly. The JavaScript code converts the cookie to a wgPostEdit config
+ * variable.
+ *
+ * Since WebResponse::setcookie does not allow forcing HttpOnly for a single
+ * cookie, we have to use PHP's setcookie() directly.
+ *
+ * We use a path of '/' since wgCookiePath is not exposed to JS
+ *
+ * If the variable were set on the server, it would be cached, which is unwanted
+ * since the post-edit state should only apply to the load right after the save.
+ */
+ protected function setPostEditCookie() {
+ global $wgCookiePrefix, $wgCookieDomain;
+ $revisionId = $this->mArticle->getLatest();
+ $postEditKey = self::POST_EDIT_COOKIE_KEY_PREFIX . $revisionId;
+
+ setcookie( $wgCookiePrefix . $postEditKey, '1', time() + self::POST_EDIT_COOKIE_DURATION, '/', $wgCookieDomain );
+ }
+
+ /**
* Attempt submission
+ * @throws UserBlockedError|ReadOnlyError|ThrottledError|PermissionsError
* @return bool false if output is done, true if the rest of the form should be displayed
*/
function attemptSave() {
@@ -987,6 +1188,9 @@ class EditPage {
// FIXME: once the interface for internalAttemptSave() is made nicer, this should use the message in $status
if ( $status->value == self::AS_SUCCESS_UPDATE || $status->value == self::AS_SUCCESS_NEW_ARTICLE ) {
$this->didSave = true;
+ if ( !$resultDetails['nullEdit'] ) {
+ $this->setPostEditCookie();
+ }
}
switch ( $status->value ) {
@@ -1003,6 +1207,10 @@ class EditPage {
case self::AS_HOOK_ERROR:
return false;
+ case self::AS_PARSE_ERROR:
+ $wgOut->addWikiText( '<div class="error">' . $status->getWikiText() . '</div>' );
+ return true;
+
case self::AS_SUCCESS_NEW_ARTICLE:
$query = $resultDetails['redirect'] ? 'redirect=no' : '';
$anchor = isset ( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
@@ -1067,10 +1275,62 @@ class EditPage {
}
/**
+ * Run hooks that can filter edits just before they get saved.
+ *
+ * @param Content $content the Content to filter.
+ * @param Status $status for reporting the outcome to the caller
+ * @param User $user the user performing the edit
+ *
+ * @return bool
+ */
+ protected function runPostMergeFilters( Content $content, Status $status, User $user ) {
+ // Run old style post-section-merge edit filter
+ if ( !ContentHandler::runLegacyHooks( 'EditFilterMerged',
+ array( $this, $content, &$this->hookError, $this->summary ) ) ) {
+
+ # Error messages etc. could be handled within the hook...
+ $status->fatal( 'hookaborted' );
+ $status->value = self::AS_HOOK_ERROR;
+ return false;
+ } elseif ( $this->hookError != '' ) {
+ # ...or the hook could be expecting us to produce an error
+ $status->fatal( 'hookaborted' );
+ $status->value = self::AS_HOOK_ERROR_EXPECTED;
+ return false;
+ }
+
+ // Run new style post-section-merge edit filter
+ if ( !wfRunHooks( 'EditFilterMergedContent',
+ array( $this->mArticle->getContext(), $content, $status, $this->summary,
+ $user, $this->minoredit ) ) ) {
+
+ # Error messages etc. could be handled within the hook...
+ // XXX: $status->value may already be something informative...
+ $this->hookError = $status->getWikiText();
+ $status->fatal( 'hookaborted' );
+ $status->value = self::AS_HOOK_ERROR;
+ return false;
+ } elseif ( !$status->isOK() ) {
+ # ...or the hook could be expecting us to produce an error
+ // FIXME this sucks, we should just use the Status object throughout
+ $this->hookError = $status->getWikiText();
+ $status->fatal( 'hookaborted' );
+ $status->value = self::AS_HOOK_ERROR_EXPECTED;
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
* Attempt submission (no UI)
*
- * @param $result
- * @param $bot bool
+ * @param array $result array to add statuses to, currently with the possible keys:
+ * spam - string - Spam string from content if any spam is detected by matchSpamRegex
+ * sectionanchor - string - Section anchor for a section save
+ * nullEdit - boolean - Set if doEditContent is OK. True if null edit, false otherwise.
+ * redirect - boolean - Set if doEditContent is OK. True if resulting revision is a redirect
+ * @param bool $bot True if edit is being made under the bot right.
*
* @return Status object, possibly with a message, but always with one of the AS_* constants in $status->value,
*
@@ -1083,7 +1343,7 @@ class EditPage {
$status = Status::newGood();
- wfProfileIn( __METHOD__ );
+ wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__ . '-checks' );
if ( !wfRunHooks( 'EditPage::attemptSave', array( $this ) ) ) {
@@ -1091,19 +1351,30 @@ class EditPage {
$status->fatal( 'hookaborted' );
$status->value = self::AS_HOOK_ERROR;
wfProfileOut( __METHOD__ . '-checks' );
- wfProfileOut( __METHOD__ );
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ try {
+ # Construct Content object
+ $textbox_content = $this->toEditContent( $this->textbox1 );
+ } catch ( MWContentSerializationException $ex ) {
+ $status->fatal( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
+ $status->value = self::AS_PARSE_ERROR;
+ wfProfileOut( __METHOD__ . '-checks' );
+ wfProfileOut( __METHOD__ );
return $status;
}
# Check image redirect
if ( $this->mTitle->getNamespace() == NS_FILE &&
- Title::newFromRedirect( $this->textbox1 ) instanceof Title &&
+ $textbox_content->isRedirect() &&
!$wgUser->isAllowed( 'upload' ) ) {
$code = $wgUser->isAnon() ? self::AS_IMAGE_REDIRECT_ANON : self::AS_IMAGE_REDIRECT_LOGGED;
$status->setResult( false, $code );
wfProfileOut( __METHOD__ . '-checks' );
- wfProfileOut( __METHOD__ );
+ wfProfileOut( __METHOD__ );
return $status;
}
@@ -1209,7 +1480,7 @@ class EditPage {
if ( $new ) {
// Late check for create permission, just in case *PARANOIA*
- if ( !$this->mTitle->userCan( 'create' ) ) {
+ if ( !$this->mTitle->userCan( 'create', $wgUser ) ) {
$status->fatal( 'nocreatetext' );
$status->value = self::AS_NO_CREATE_PERMISSION;
wfDebug( __METHOD__ . ": no create permission\n" );
@@ -1224,28 +1495,18 @@ class EditPage {
return $status;
}
- // Run post-section-merge edit filter
- if ( !wfRunHooks( 'EditFilterMerged', array( $this, $this->textbox1, &$this->hookError, $this->summary ) ) ) {
- # Error messages etc. could be handled within the hook...
- $status->fatal( 'hookaborted' );
- $status->value = self::AS_HOOK_ERROR;
- wfProfileOut( __METHOD__ );
- return $status;
- } elseif ( $this->hookError != '' ) {
- # ...or the hook could be expecting us to produce an error
- $status->fatal( 'hookaborted' );
- $status->value = self::AS_HOOK_ERROR_EXPECTED;
+ if ( !$this->runPostMergeFilters( $textbox_content, $status, $wgUser ) ) {
wfProfileOut( __METHOD__ );
return $status;
}
- $text = $this->textbox1;
+ $content = $textbox_content;
+
$result['sectionanchor'] = '';
if ( $this->section == 'new' ) {
if ( $this->sectiontitle !== '' ) {
// Insert the section title above the content.
- $text = wfMessage( 'newsectionheaderdefaultlevel', $this->sectiontitle )
- ->inContentLanguage()->text() . "\n\n" . $text;
+ $content = $content->addSectionHeader( $this->sectiontitle );
// Jump to the new section
$result['sectionanchor'] = $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle );
@@ -1260,8 +1521,7 @@ class EditPage {
}
} elseif ( $this->summary !== '' ) {
// Insert the section title above the content.
- $text = wfMessage( 'newsectionheaderdefaultlevel', $this->summary )
- ->inContentLanguage()->text() . "\n\n" . $text;
+ $content = $content->addSectionHeader( $this->summary );
// Jump to the new section
$result['sectionanchor'] = $wgParser->guessLegacySectionNameFromWikiText( $this->summary );
@@ -1275,10 +1535,13 @@ class EditPage {
$status->value = self::AS_SUCCESS_NEW_ARTICLE;
- } else {
+ } else { # not $new
# Article exists. Check for edit conflict.
+
+ $this->mArticle->clear(); # Force reload of dates, etc.
$timestamp = $this->mArticle->getTimestamp();
+
wfDebug( "timestamp: {$timestamp}, edittime: {$this->edittime}\n" );
if ( $timestamp != $this->edittime ) {
@@ -1295,7 +1558,8 @@ class EditPage {
$this->isConflict = false;
wfDebug( __METHOD__ . ": conflict suppressed; new section\n" );
}
- } elseif ( $this->section == '' && Revision::userWasLastToEdit( DB_MASTER, $this->mTitle->getArticleID(), $wgUser->getId(), $this->edittime ) ) {
+ } elseif ( $this->section == '' && Revision::userWasLastToEdit( DB_MASTER, $this->mTitle->getArticleID(),
+ $wgUser->getId(), $this->edittime ) ) {
# Suppress edit conflict with self, except for section edits where merging is required.
wfDebug( __METHOD__ . ": Suppressing edit conflict, same user.\n" );
$this->isConflict = false;
@@ -1310,26 +1574,31 @@ class EditPage {
$sectionTitle = $this->summary;
}
+ $content = null;
+
if ( $this->isConflict ) {
- wfDebug( __METHOD__ . ": conflict! getting section '$this->section' for time '$this->edittime' (article time '{$timestamp}')\n" );
- $text = $this->mArticle->replaceSection( $this->section, $this->textbox1, $sectionTitle, $this->edittime );
+ wfDebug( __METHOD__ . ": conflict! getting section '{$this->section}' for time '{$this->edittime}'"
+ . " (article time '{$timestamp}')\n" );
+
+ $content = $this->mArticle->replaceSectionContent( $this->section, $textbox_content, $sectionTitle, $this->edittime );
} else {
- wfDebug( __METHOD__ . ": getting section '$this->section'\n" );
- $text = $this->mArticle->replaceSection( $this->section, $this->textbox1, $sectionTitle );
+ wfDebug( __METHOD__ . ": getting section '{$this->section}'\n" );
+ $content = $this->mArticle->replaceSectionContent( $this->section, $textbox_content, $sectionTitle );
}
- if ( is_null( $text ) ) {
+
+ if ( is_null( $content ) ) {
wfDebug( __METHOD__ . ": activating conflict; section replace failed.\n" );
$this->isConflict = true;
- $text = $this->textbox1; // do not try to merge here!
+ $content = $textbox_content; // do not try to merge here!
} elseif ( $this->isConflict ) {
# Attempt merge
- if ( $this->mergeChangesInto( $text ) ) {
+ if ( $this->mergeChangesIntoContent( $content ) ) {
// Successful merge! Maybe we should tell the user the good news?
$this->isConflict = false;
wfDebug( __METHOD__ . ": Suppressing edit conflict, successful merge.\n" );
} else {
$this->section = '';
- $this->textbox1 = $text;
+ $this->textbox1 = ContentHandler::getContentText( $content );
wfDebug( __METHOD__ . ": Keeping edit conflict, failed merge.\n" );
}
}
@@ -1340,58 +1609,45 @@ class EditPage {
return $status;
}
- // Run post-section-merge edit filter
- if ( !wfRunHooks( 'EditFilterMerged', array( $this, $text, &$this->hookError, $this->summary ) ) ) {
- # Error messages etc. could be handled within the hook...
- $status->fatal( 'hookaborted' );
- $status->value = self::AS_HOOK_ERROR;
- wfProfileOut( __METHOD__ );
- return $status;
- } elseif ( $this->hookError != '' ) {
- # ...or the hook could be expecting us to produce an error
- $status->fatal( 'hookaborted' );
- $status->value = self::AS_HOOK_ERROR_EXPECTED;
+ if ( !$this->runPostMergeFilters( $content, $status, $wgUser ) ) {
wfProfileOut( __METHOD__ );
return $status;
}
- # Handle the user preference to force summaries here, but not for null edits
- if ( $this->section != 'new' && !$this->allowBlankSummary
- && $this->getOriginalContent() != $text
- && !Title::newFromRedirect( $text ) ) # check if it's not a redirect
- {
- if ( md5( $this->summary ) == $this->autoSumm ) {
+ if ( $this->section == 'new' ) {
+ // Handle the user preference to force summaries here
+ if ( !$this->allowBlankSummary && trim( $this->summary ) == '' ) {
$this->missingSummary = true;
- $status->fatal( 'missingsummary' );
+ $status->fatal( 'missingsummary' ); // or 'missingcommentheader' if $section == 'new'. Blegh
$status->value = self::AS_SUMMARY_NEEDED;
wfProfileOut( __METHOD__ );
return $status;
}
- }
- # And a similar thing for new sections
- if ( $this->section == 'new' && !$this->allowBlankSummary ) {
- if ( trim( $this->summary ) == '' ) {
- $this->missingSummary = true;
- $status->fatal( 'missingsummary' ); // or 'missingcommentheader' if $section == 'new'. Blegh
- $status->value = self::AS_SUMMARY_NEEDED;
+ // Do not allow the user to post an empty comment
+ if ( $this->textbox1 == '' ) {
+ $this->missingComment = true;
+ $status->fatal( 'missingcommenttext' );
+ $status->value = self::AS_TEXTBOX_EMPTY;
wfProfileOut( __METHOD__ );
return $status;
}
+ } elseif ( !$this->allowBlankSummary
+ && !$content->equals( $this->getOriginalContent() )
+ && !$content->isRedirect()
+ && md5( $this->summary ) == $this->autoSumm
+ ) {
+ $this->missingSummary = true;
+ $status->fatal( 'missingsummary' );
+ $status->value = self::AS_SUMMARY_NEEDED;
+ wfProfileOut( __METHOD__ );
+ return $status;
}
# All's well
wfProfileIn( __METHOD__ . '-sectionanchor' );
$sectionanchor = '';
if ( $this->section == 'new' ) {
- if ( $this->textbox1 == '' ) {
- $this->missingComment = true;
- $status->fatal( 'missingcommenttext' );
- $status->value = self::AS_TEXTBOX_EMPTY;
- wfProfileOut( __METHOD__ . '-sectionanchor' );
- wfProfileOut( __METHOD__ );
- return $status;
- }
if ( $this->sectiontitle !== '' ) {
$sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle );
// If no edit summary was specified, create one automatically from the section
@@ -1428,14 +1684,14 @@ class EditPage {
// merged the section into full text. Clear the section field
// so that later submission of conflict forms won't try to
// replace that into a duplicated mess.
- $this->textbox1 = $text;
+ $this->textbox1 = $this->toEditText( $content );
$this->section = '';
$status->value = self::AS_SUCCESS_UPDATE;
}
// Check for length errors again now that the section is merged in
- $this->kblength = (int)( strlen( $text ) / 1024 );
+ $this->kblength = (int)( strlen( $this->toEditText( $content ) ) / 1024 );
if ( $this->kblength > $wgMaxArticleSize ) {
$this->tooBig = true;
$status->setResult( false, self::AS_MAX_ARTICLE_SIZE_EXCEEDED );
@@ -1448,14 +1704,10 @@ class EditPage {
( ( $this->minoredit && !$this->isNew ) ? EDIT_MINOR : 0 ) |
( $bot ? EDIT_FORCE_BOT : 0 );
- $doEditStatus = $this->mArticle->doEdit( $text, $this->summary, $flags );
+ $doEditStatus = $this->mArticle->doEditContent( $content, $this->summary, $flags,
+ false, null, $this->contentFormat );
- if ( $doEditStatus->isOK() ) {
- $result['redirect'] = Title::newFromRedirect( $text ) !== null;
- $this->commitWatch();
- wfProfileOut( __METHOD__ );
- return $status;
- } else {
+ if ( !$doEditStatus->isOK() ) {
// Failure from doEdit()
// Show the edit conflict page for certain recognized errors from doEdit(),
// but don't show it for errors from extension hooks
@@ -1470,63 +1722,107 @@ class EditPage {
wfProfileOut( __METHOD__ );
return $doEditStatus;
}
+
+ $result['nullEdit'] = $doEditStatus->hasMessage( 'edit-no-change' );
+ $result['redirect'] = $content->isRedirect();
+ $this->updateWatchlist();
+ wfProfileOut( __METHOD__ );
+ return $status;
}
/**
- * Commit the change of watch status
+ * Register the change of watch status
*/
- protected function commitWatch() {
+ protected function updateWatchlist() {
global $wgUser;
+
if ( $wgUser->isLoggedIn() && $this->watchthis != $wgUser->isWatched( $this->mTitle ) ) {
+ $fname = __METHOD__;
+ $title = $this->mTitle;
+ $watch = $this->watchthis;
+
+ // Do this in its own transaction to reduce contention...
$dbw = wfGetDB( DB_MASTER );
- $dbw->begin( __METHOD__ );
- if ( $this->watchthis ) {
- WatchAction::doWatch( $this->mTitle, $wgUser );
- } else {
- WatchAction::doUnwatch( $this->mTitle, $wgUser );
- }
- $dbw->commit( __METHOD__ );
+ $dbw->onTransactionIdle( function() use ( $dbw, $title, $watch, $wgUser, $fname ) {
+ $dbw->begin( $fname );
+ if ( $watch ) {
+ WatchAction::doWatch( $title, $wgUser );
+ } else {
+ WatchAction::doUnwatch( $title, $wgUser );
+ }
+ $dbw->commit( $fname );
+ } );
}
}
/**
- * @private
- * @todo document
+ * Attempts to merge text content with base and current revisions
*
* @param $editText string
*
* @return bool
+ * @deprecated since 1.21, use mergeChangesIntoContent() instead
*/
function mergeChangesInto( &$editText ) {
+ ContentHandler::deprecated( __METHOD__, "1.21" );
+
+ $editContent = $this->toEditContent( $editText );
+
+ $ok = $this->mergeChangesIntoContent( $editContent );
+
+ if ( $ok ) {
+ $editText = $this->toEditText( $editContent );
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Attempts to do 3-way merge of edit content with a base revision
+ * and current content, in case of edit conflict, in whichever way appropriate
+ * for the content type.
+ *
+ * @since 1.21
+ *
+ * @param $editContent
+ *
+ * @return bool
+ */
+ private function mergeChangesIntoContent( &$editContent ) {
wfProfileIn( __METHOD__ );
$db = wfGetDB( DB_MASTER );
// This is the revision the editor started from
$baseRevision = $this->getBaseRevision();
- if ( is_null( $baseRevision ) ) {
+ $baseContent = $baseRevision ? $baseRevision->getContent() : null;
+
+ if ( is_null( $baseContent ) ) {
wfProfileOut( __METHOD__ );
return false;
}
- $baseText = $baseRevision->getText();
// The current state, we want to merge updates into it
$currentRevision = Revision::loadFromTitle( $db, $this->mTitle );
- if ( is_null( $currentRevision ) ) {
+ $currentContent = $currentRevision ? $currentRevision->getContent() : null;
+
+ if ( is_null( $currentContent ) ) {
wfProfileOut( __METHOD__ );
return false;
}
- $currentText = $currentRevision->getText();
- $result = '';
- if ( wfMerge( $baseText, $editText, $currentText, $result ) ) {
- $editText = $result;
+ $handler = ContentHandler::getForModelID( $baseContent->getModel() );
+
+ $result = $handler->merge3( $baseContent, $editContent, $currentContent );
+
+ if ( $result ) {
+ $editContent = $result;
wfProfileOut( __METHOD__ );
return true;
- } else {
- wfProfileOut( __METHOD__ );
- return false;
}
+
+ wfProfileOut( __METHOD__ );
+ return false;
}
/**
@@ -1690,10 +1986,13 @@ class EditPage {
# Give a notice if the user is editing a deleted/moved page...
if ( !$this->mTitle->exists() ) {
LogEventsList::showLogExtract( $wgOut, array( 'delete', 'move' ), $this->mTitle,
- '', array( 'lim' => 10,
- 'conds' => array( "log_action != 'revision'" ),
- 'showIfEmpty' => false,
- 'msgKey' => array( 'recreate-moveddeleted-warn' ) )
+ '',
+ array(
+ 'lim' => 10,
+ 'conds' => array( "log_action != 'revision'" ),
+ 'showIfEmpty' => false,
+ 'msgKey' => array( 'recreate-moveddeleted-warn' )
+ )
);
}
}
@@ -1711,17 +2010,77 @@ class EditPage {
// Added using template syntax, to take <noinclude>'s into account.
$wgOut->addWikiTextTitleTidy( '{{:' . $title->getFullText() . '}}', $this->mTitle );
return true;
- } else {
- return false;
}
- } else {
- return false;
}
+ return false;
+ }
+
+ /**
+ * Gets an editable textual representation of $content.
+ * The textual representation can be turned by into a Content object by the
+ * toEditContent() method.
+ *
+ * If $content is null or false or a string, $content is returned unchanged.
+ *
+ * If the given Content object is not of a type that can be edited using the text base EditPage,
+ * an exception will be raised. Set $this->allowNonTextContent to true to allow editing of non-textual
+ * content.
+ *
+ * @param Content|null|bool|string $content
+ * @return String the editable text form of the content.
+ *
+ * @throws MWException if $content is not an instance of TextContent and $this->allowNonTextContent is not true.
+ */
+ protected function toEditText( $content ) {
+ if ( $content === null || $content === false ) {
+ return $content;
+ }
+
+ if ( is_string( $content ) ) {
+ return $content;
+ }
+
+ if ( !$this->allowNonTextContent && !( $content instanceof TextContent ) ) {
+ throw new MWException( "This content model can not be edited as text: "
+ . ContentHandler::getLocalizedName( $content->getModel() ) );
+ }
+
+ return $content->serialize( $this->contentFormat );
+ }
+
+ /**
+ * Turns the given text into a Content object by unserializing it.
+ *
+ * If the resulting Content object is not of a type that can be edited using the text base EditPage,
+ * an exception will be raised. Set $this->allowNonTextContent to true to allow editing of non-textual
+ * content.
+ *
+ * @param string|null|bool $text Text to unserialize
+ * @return Content The content object created from $text. If $text was false or null, false resp. null will be
+ * returned instead.
+ *
+ * @throws MWException if unserializing the text results in a Content object that is not an instance of TextContent
+ * and $this->allowNonTextContent is not true.
+ */
+ protected function toEditContent( $text ) {
+ if ( $text === false || $text === null ) {
+ return $text;
+ }
+
+ $content = ContentHandler::makeContent( $text, $this->getTitle(),
+ $this->contentModel, $this->contentFormat );
+
+ if ( !$this->allowNonTextContent && !( $content instanceof TextContent ) ) {
+ throw new MWException( "This content model can not be edited as text: "
+ . ContentHandler::getLocalizedName( $content->getModel() ) );
+ }
+
+ return $content;
}
/**
* Send the edit form and related headers to $wgOut
- * @param $formCallback Callback that takes an OutputPage parameter; will be called
+ * @param $formCallback Callback|null that takes an OutputPage parameter; will be called
* during form output near the top, for captchas and the like.
*/
function showEditForm( $formCallback = null ) {
@@ -1767,6 +2126,8 @@ class EditPage {
}
}
+ //@todo: add EditForm plugin interface and use it here!
+ // search for textarea1 and textares2, and allow EditForm to override all uses.
$wgOut->addHTML( Html::openElement( 'form', array( 'id' => self::EDITFORM_ID, 'name' => self::EDITFORM_ID,
'method' => 'post', 'action' => $this->getActionURL( $this->getContextTitle() ),
'enctype' => 'multipart/form-data' ) ) );
@@ -1820,7 +2181,7 @@ class EditPage {
}
if ( $this->hasPresetSummary ) {
- // If a summary has been preset using &summary= we dont want to prompt for
+ // If a summary has been preset using &summary= we don't want to prompt for
// a different summary. Only prompt for a summary if the summary is blanked.
// (Bug 17416)
$this->autoSumm = md5( '' );
@@ -1831,6 +2192,9 @@ class EditPage {
$wgOut->addHTML( Html::hidden( 'oldid', $this->oldid ) );
+ $wgOut->addHTML( Html::hidden( 'format', $this->contentFormat ) );
+ $wgOut->addHTML( Html::hidden( 'model', $this->contentModel ) );
+
if ( $this->section == 'new' ) {
$this->showSummaryInput( true, $this->summary );
$wgOut->addHTML( $this->getSummaryPreview( true, $this->summary ) );
@@ -1843,12 +2207,14 @@ class EditPage {
}
if ( $this->isConflict ) {
- // In an edit conflict bypass the overrideable content form method
+ // In an edit conflict bypass the overridable content form method
// and fallback to the raw wpTextbox1 since editconflicts can't be
// resolved between page source edits and custom ui edits using the
// custom edit ui.
$this->textbox2 = $this->textbox1;
- $this->textbox1 = $this->getCurrentText();
+
+ $content = $this->getCurrentContent();
+ $this->textbox1 = $this->toEditText( $content );
$this->showTextbox1();
} else {
@@ -1874,7 +2240,13 @@ class EditPage {
Linker::formatHiddenCategories( $this->mArticle->getHiddenCategories() ) ) );
if ( $this->isConflict ) {
- $this->showConflict();
+ try {
+ $this->showConflict();
+ } catch ( MWContentSerializationException $ex ) {
+ // this can't really happen, but be nice if it does.
+ $msg = wfMessage( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
+ $wgOut->addWikiText( '<div class="error">' . $msg->text() . '</div>' );
+ }
}
$wgOut->addHTML( $this->editFormTextBottom . "\n</form>\n" );
@@ -1909,30 +2281,8 @@ class EditPage {
$wgOut->addWikiMsg( 'talkpagetext' );
}
- # Optional notices on a per-namespace and per-page basis
- $editnotice_ns = 'editnotice-' . $this->mTitle->getNamespace();
- $editnotice_ns_message = wfMessage( $editnotice_ns );
- if ( $editnotice_ns_message->exists() ) {
- $wgOut->addWikiText( $editnotice_ns_message->plain() );
- }
- if ( MWNamespace::hasSubpages( $this->mTitle->getNamespace() ) ) {
- $parts = explode( '/', $this->mTitle->getDBkey() );
- $editnotice_base = $editnotice_ns;
- while ( count( $parts ) > 0 ) {
- $editnotice_base .= '-' . array_shift( $parts );
- $editnotice_base_msg = wfMessage( $editnotice_base );
- if ( $editnotice_base_msg->exists() ) {
- $wgOut->addWikiText( $editnotice_base_msg->plain() );
- }
- }
- } else {
- # Even if there are no subpages in namespace, we still don't want / in MW ns.
- $editnoticeText = $editnotice_ns . '-' . str_replace( '/', '-', $this->mTitle->getDBkey() );
- $editnoticeMsg = wfMessage( $editnoticeText );
- if ( $editnoticeMsg->exists() ) {
- $wgOut->addWikiText( $editnoticeMsg->plain() );
- }
- }
+ // Add edit notices
+ $wgOut->addHTML( implode( "\n", $this->mTitle->getEditNotices() ) );
if ( $this->isConflict ) {
$wgOut->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1\n</div>", 'explainconflict' );
@@ -1948,7 +2298,7 @@ class EditPage {
if ( $this->section != '' && $this->section != 'new' ) {
if ( !$this->summary && !$this->preview && !$this->diff ) {
- $sectionTitle = self::extractSectionTitle( $this->textbox1 );
+ $sectionTitle = self::extractSectionTitle( $this->textbox1 ); //FIXME: use Content object
if ( $sectionTitle !== false ) {
$this->summary = "/* $sectionTitle */ ";
}
@@ -1980,7 +2330,7 @@ class EditPage {
if ( $revision ) {
// Let sysop know that this will make private content public if saved
- if ( !$revision->userCan( Revision::DELETED_TEXT ) ) {
+ if ( !$revision->userCan( Revision::DELETED_TEXT, $wgUser ) ) {
$wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-permission' );
} elseif ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
$wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-view' );
@@ -2014,10 +2364,13 @@ class EditPage {
$wgOut->wrapWikiMsg( "<div class='error' id='mw-userinvalidcssjstitle'>\n$1\n</div>", array( 'userinvalidcssjstitle', $this->mTitle->getSkinFromCssJsSubpage() ) );
}
if ( $this->formtype !== 'preview' ) {
- if ( $this->isCssSubpage )
+ if ( $this->isCssSubpage ) {
$wgOut->wrapWikiMsg( "<div id='mw-usercssyoucanpreview'>\n$1\n</div>", array( 'usercssyoucanpreview' ) );
- if ( $this->isJsSubpage )
+ }
+
+ if ( $this->isJsSubpage ) {
$wgOut->wrapWikiMsg( "<div id='mw-userjsyoucanpreview'>\n$1\n</div>", array( 'userjsyoucanpreview' ) );
+ }
}
}
}
@@ -2073,7 +2426,6 @@ class EditPage {
$this->showHeaderCopyrightWarning();
}
-
/**
* Standard summary input and label (wgSummary), abstracted so EditPage
* subclasses may reorganize the form.
@@ -2081,15 +2433,15 @@ class EditPage {
* inferred by the id given to the input. You can remove them both by
* passing array( 'id' => false ) to $userInputAttrs.
*
- * @param $summary string The value of the summary input
- * @param $labelText string The html to place inside the label
- * @param $inputAttrs array of attrs to use on the input
- * @param $spanLabelAttrs array of attrs to use on the span inside the label
+ * @param string $summary The value of the summary input
+ * @param string $labelText The html to place inside the label
+ * @param array $inputAttrs of attrs to use on the input
+ * @param array $spanLabelAttrs of attrs to use on the span inside the label
*
* @return array An array in the format array( $label, $input )
*/
function getSummaryInput( $summary = "", $labelText = null, $inputAttrs = null, $spanLabelAttrs = null ) {
- // Note: the maxlength is overriden in JS to 255 and to make it use UTF-8 bytes, not characters.
+ // Note: the maxlength is overridden in JS to 255 and to make it use UTF-8 bytes, not characters.
$inputAttrs = ( is_array( $inputAttrs ) ? $inputAttrs : array() ) + array(
'id' => 'wpSummary',
'maxlength' => '200',
@@ -2118,7 +2470,7 @@ class EditPage {
* @param $isSubjectPreview Boolean: true if this is the section subject/title
* up top, or false if this is the comment summary
* down below the textarea
- * @param $summary String: The text of the summary to display
+ * @param string $summary The text of the summary to display
* @return String
*/
protected function showSummaryInput( $isSubjectPreview, $summary = "" ) {
@@ -2144,18 +2496,22 @@ class EditPage {
* @param $isSubjectPreview Boolean: true if this is the section subject/title
* up top, or false if this is the comment summary
* down below the textarea
- * @param $summary String: the text of the summary to display
+ * @param string $summary the text of the summary to display
* @return String
*/
protected function getSummaryPreview( $isSubjectPreview, $summary = "" ) {
- if ( !$summary || ( !$this->preview && !$this->diff ) )
+ // avoid spaces in preview, gets always trimmed on save
+ $summary = trim( $summary );
+ if ( !$summary || ( !$this->preview && !$this->diff ) ) {
return "";
+ }
global $wgParser;
- if ( $isSubjectPreview )
+ if ( $isSubjectPreview ) {
$summary = wfMessage( 'newsectionsummary', $wgParser->stripSectionName( $summary ) )
->inContentLanguage()->text();
+ }
$message = $isSubjectPreview ? 'subject-preview' : 'summary-preview';
@@ -2174,8 +2530,9 @@ class EditPage {
HTML
);
- if ( !$this->checkUnicodeCompliantBrowser() )
+ if ( !$this->checkUnicodeCompliantBrowser() ) {
$wgOut->addHTML( Html::hidden( 'safemode', '1' ) );
+ }
}
protected function showFormAfterText() {
@@ -2212,8 +2569,8 @@ HTML
* The $textoverride method can be used by subclasses overriding showContentForm
* to pass back to this method.
*
- * @param $customAttribs array of html attributes to use in the textarea
- * @param $textoverride String: optional text to override $this->textarea1 with
+ * @param array $customAttribs of html attributes to use in the textarea
+ * @param string $textoverride optional text to override $this->textarea1 with
*/
protected function showTextbox1( $customAttribs = null, $textoverride = null ) {
if ( $this->wasDeletedSinceLastEdit() && $this->formtype == 'save' ) {
@@ -2255,10 +2612,10 @@ HTML
$this->showTextbox( $this->textbox2, 'wpTextbox2', array( 'tabindex' => 6, 'readonly' ) );
}
- protected function showTextbox( $content, $name, $customAttribs = array() ) {
+ protected function showTextbox( $text, $name, $customAttribs = array() ) {
global $wgOut, $wgUser;
- $wikitext = $this->safeUnicodeOutput( $content );
+ $wikitext = $this->safeUnicodeOutput( $text );
if ( strval( $wikitext ) !== '' ) {
// Ensure there's a newline at the end, otherwise adding lines
// is awkward.
@@ -2285,13 +2642,15 @@ HTML
protected function displayPreviewArea( $previewOutput, $isOnTop = false ) {
global $wgOut;
$classes = array();
- if ( $isOnTop )
+ if ( $isOnTop ) {
$classes[] = 'ontop';
+ }
$attribs = array( 'id' => 'wikiPreview', 'class' => implode( ' ', $classes ) );
- if ( $this->formtype != 'preview' )
+ if ( $this->formtype != 'preview' ) {
$attribs['style'] = 'display: none;';
+ }
$wgOut->addHTML( Xml::openElement( 'div', $attribs ) );
@@ -2302,7 +2661,12 @@ HTML
$wgOut->addHTML( '</div>' );
if ( $this->formtype == 'diff' ) {
- $this->showDiff();
+ try {
+ $this->showDiff();
+ } catch ( MWContentSerializationException $ex ) {
+ $msg = wfMessage( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
+ $wgOut->addWikiText( '<div class="error">' . $msg->text() . '</div>' );
+ }
}
}
@@ -2310,7 +2674,7 @@ HTML
* Append preview output to $wgOut.
* Includes category rendering if this is a category page.
*
- * @param $text String: the HTML to be output for the preview.
+ * @param string $text the HTML to be output for the preview.
*/
protected function showPreview( $text ) {
global $wgOut;
@@ -2334,7 +2698,7 @@ HTML
* save and then make a comparison.
*/
function showDiff() {
- global $wgUser, $wgContLang, $wgParser, $wgOut;
+ global $wgUser, $wgContLang, $wgOut;
$oldtitlemsg = 'currentrev';
# if message does not exist, show diff against the preloaded default
@@ -2342,24 +2706,43 @@ HTML
$oldtext = $this->mTitle->getDefaultMessageText();
if( $oldtext !== false ) {
$oldtitlemsg = 'defaultmessagetext';
+ $oldContent = $this->toEditContent( $oldtext );
+ } else {
+ $oldContent = null;
}
} else {
- $oldtext = $this->mArticle->getRawText();
+ $oldContent = $this->getCurrentContent();
}
- $newtext = $this->mArticle->replaceSection(
- $this->section, $this->textbox1, $this->summary, $this->edittime );
- wfRunHooks( 'EditPageGetDiffText', array( $this, &$newtext ) );
+ $textboxContent = $this->toEditContent( $this->textbox1 );
+
+ $newContent = $this->mArticle->replaceSectionContent(
+ $this->section, $textboxContent,
+ $this->summary, $this->edittime );
- $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
- $newtext = $wgParser->preSaveTransform( $newtext, $this->mTitle, $wgUser, $popts );
+ if ( $newContent ) {
+ ContentHandler::runLegacyHooks( 'EditPageGetDiffText', array( $this, &$newContent ) );
+ wfRunHooks( 'EditPageGetDiffContent', array( $this, &$newContent ) );
+
+ $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
+ $newContent = $newContent->preSaveTransform( $this->mTitle, $wgUser, $popts );
+ }
- if ( $oldtext !== false || $newtext != '' ) {
+ if ( ( $oldContent && !$oldContent->isEmpty() ) || ( $newContent && !$newContent->isEmpty() ) ) {
$oldtitle = wfMessage( $oldtitlemsg )->parse();
$newtitle = wfMessage( 'yourtext' )->parse();
- $de = new DifferenceEngine( $this->mArticle->getContext() );
- $de->setText( $oldtext, $newtext );
+ if ( !$oldContent ) {
+ $oldContent = $newContent->getContentHandler()->makeEmptyContent();
+ }
+
+ if ( !$newContent ) {
+ $newContent = $oldContent->getContentHandler()->makeEmptyContent();
+ }
+
+ $de = $oldContent->getContentHandler()->createDifferenceEngine( $this->mArticle->getContext() );
+ $de->setContent( $oldContent, $newContent );
+
$difftext = $de->getDiff( $oldtitle, $newtitle );
$de->showDiffStyle();
} else {
@@ -2463,7 +2846,9 @@ HTML
wfMessage( 'newwindow' )->parse();
$wgOut->addHTML( " <span class='cancelLink'>{$cancel}</span>\n" );
$wgOut->addHTML( " <span class='editHelp'>{$edithelp}</span>\n" );
- $wgOut->addHTML( "</div><!-- editButtons -->\n</div><!-- editOptions -->\n" );
+ $wgOut->addHTML( "</div><!-- editButtons -->\n" );
+ wfRunHooks( 'EditPage::showStandardInputs:options', array( $this, $wgOut, &$tabindex ) );
+ $wgOut->addHTML( "</div><!-- editOptions -->\n" );
}
/**
@@ -2476,8 +2861,12 @@ HTML
if ( wfRunHooks( 'EditPageBeforeConflictDiff', array( &$this, &$wgOut ) ) ) {
$wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
- $de = new DifferenceEngine( $this->mArticle->getContext() );
- $de->setText( $this->textbox2, $this->textbox1 );
+ $content1 = $this->toEditContent( $this->textbox1 );
+ $content2 = $this->toEditContent( $this->textbox2 );
+
+ $handler = ContentHandler::getForModelID( $this->contentModel );
+ $de = $handler->createDifferenceEngine( $this->mArticle->getContext() );
+ $de->setContent( $content2, $content1 );
$de->showDiff(
wfMessage( 'yourtext' )->parse(),
wfMessage( 'storedversion' )->text()
@@ -2548,40 +2937,47 @@ HTML
$dbr = wfGetDB( DB_SLAVE );
$data = $dbr->selectRow(
array( 'logging', 'user' ),
- array( 'log_type',
- 'log_action',
- 'log_timestamp',
- 'log_user',
- 'log_namespace',
- 'log_title',
- 'log_comment',
- 'log_params',
- 'log_deleted',
- 'user_name' ),
- array( 'log_namespace' => $this->mTitle->getNamespace(),
- 'log_title' => $this->mTitle->getDBkey(),
- 'log_type' => 'delete',
- 'log_action' => 'delete',
- 'user_id=log_user' ),
+ array(
+ 'log_type',
+ 'log_action',
+ 'log_timestamp',
+ 'log_user',
+ 'log_namespace',
+ 'log_title',
+ 'log_comment',
+ 'log_params',
+ 'log_deleted',
+ 'user_name'
+ ), array(
+ 'log_namespace' => $this->mTitle->getNamespace(),
+ 'log_title' => $this->mTitle->getDBkey(),
+ 'log_type' => 'delete',
+ 'log_action' => 'delete',
+ 'user_id=log_user'
+ ),
__METHOD__,
array( 'LIMIT' => 1, 'ORDER BY' => 'log_timestamp DESC' )
);
// Quick paranoid permission checks...
if ( is_object( $data ) ) {
- if ( $data->log_deleted & LogPage::DELETED_USER )
+ if ( $data->log_deleted & LogPage::DELETED_USER ) {
$data->user_name = wfMessage( 'rev-deleted-user' )->escaped();
- if ( $data->log_deleted & LogPage::DELETED_COMMENT )
+ }
+
+ if ( $data->log_deleted & LogPage::DELETED_COMMENT ) {
$data->log_comment = wfMessage( 'rev-deleted-comment' )->escaped();
+ }
}
return $data;
}
/**
* Get the rendered text for previewing.
+ * @throws MWException
* @return string
*/
function getPreviewText() {
- global $wgOut, $wgUser, $wgParser, $wgRawHtml, $wgLang;
+ global $wgOut, $wgUser, $wgRawHtml, $wgLang;
wfProfileIn( __METHOD__ );
@@ -2600,82 +2996,96 @@ HTML
return $parsedNote;
}
- if ( $this->mTriedSave && !$this->mTokenOk ) {
- if ( $this->mTokenOkExceptSuffix ) {
- $note = wfMessage( 'token_suffix_mismatch' )->plain();
- } else {
- $note = wfMessage( 'session_fail_preview' )->plain();
- }
- } elseif ( $this->incompleteForm ) {
- $note = wfMessage( 'edit_form_incomplete' )->plain();
- } else {
- $note = wfMessage( 'previewnote' )->plain() .
- ' [[#' . self::EDITFORM_ID . '|' . $wgLang->getArrow() . ' ' . wfMessage( 'continue-editing' )->text() . ']]';
- }
+ $note = '';
- $parserOptions = $this->mArticle->makeParserOptions( $this->mArticle->getContext() );
+ try {
+ $content = $this->toEditContent( $this->textbox1 );
- $parserOptions->setEditSection( false );
- $parserOptions->setIsPreview( true );
- $parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' );
+ $previewHTML = '';
+ if ( !wfRunHooks( 'AlternateEditPreview', array( $this, &$content, &$previewHTML, &$this->mParserOutput ) ) ) {
+ wfProfileOut( __METHOD__ );
+ return $previewHTML;
+ }
+
+ if ( $this->mTriedSave && !$this->mTokenOk ) {
+ if ( $this->mTokenOkExceptSuffix ) {
+ $note = wfMessage( 'token_suffix_mismatch' )->plain();
- # don't parse non-wikitext pages, show message about preview
- if ( $this->mTitle->isCssJsSubpage() || !$this->mTitle->isWikitextPage() ) {
- if ( $this->mTitle->isCssJsSubpage() ) {
- $level = 'user';
- } elseif ( $this->mTitle->isCssOrJsPage() ) {
- $level = 'site';
- } else {
- $level = false;
- }
-
- # Used messages to make sure grep find them:
- # Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
- $class = 'mw-code';
- if ( $level ) {
- if ( preg_match( "/\\.css$/", $this->mTitle->getText() ) ) {
- $previewtext = "<div id='mw-{$level}csspreview'>\n" . wfMessage( "{$level}csspreview" )->text() . "\n</div>";
- $class .= " mw-css";
- } elseif ( preg_match( "/\\.js$/", $this->mTitle->getText() ) ) {
- $previewtext = "<div id='mw-{$level}jspreview'>\n" . wfMessage( "{$level}jspreview" )->text() . "\n</div>";
- $class .= " mw-js";
} else {
- throw new MWException( 'A CSS/JS (sub)page but which is not css nor js!' );
+ $note = wfMessage( 'session_fail_preview' )->plain();
}
- $parserOutput = $wgParser->parse( $previewtext, $this->mTitle, $parserOptions );
- $previewHTML = $parserOutput->getText();
+ } elseif ( $this->incompleteForm ) {
+ $note = wfMessage( 'edit_form_incomplete' )->plain();
} else {
- $previewHTML = '';
+ $note = wfMessage( 'previewnote' )->plain() .
+ ' [[#' . self::EDITFORM_ID . '|' . $wgLang->getArrow() . ' ' . wfMessage( 'continue-editing' )->text() . ']]';
}
- $previewHTML .= "<pre class=\"$class\" dir=\"ltr\">\n" . htmlspecialchars( $this->textbox1 ) . "\n</pre>\n";
- } else {
- $toparse = $this->textbox1;
+ $parserOptions = $this->mArticle->makeParserOptions( $this->mArticle->getContext() );
+ $parserOptions->setEditSection( false );
+ $parserOptions->setIsPreview( true );
+ $parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' );
- # If we're adding a comment, we need to show the
- # summary as the headline
- if ( $this->section == "new" && $this->summary != "" ) {
- $toparse = wfMessage( 'newsectionheaderdefaultlevel', $this->summary )->inContentLanguage()->text() . "\n\n" . $toparse;
- }
+ # don't parse non-wikitext pages, show message about preview
+ if ( $this->mTitle->isCssJsSubpage() || $this->mTitle->isCssOrJsPage() ) {
+ if( $this->mTitle->isCssJsSubpage() ) {
+ $level = 'user';
+ } elseif( $this->mTitle->isCssOrJsPage() ) {
+ $level = 'site';
+ } else {
+ $level = false;
+ }
- wfRunHooks( 'EditPageGetPreviewText', array( $this, &$toparse ) );
+ if ( $content->getModel() == CONTENT_MODEL_CSS ) {
+ $format = 'css';
+ } elseif ( $content->getModel() == CONTENT_MODEL_JAVASCRIPT ) {
+ $format = 'js';
+ } else {
+ $format = false;
+ }
- $toparse = $wgParser->preSaveTransform( $toparse, $this->mTitle, $wgUser, $parserOptions );
- $parserOutput = $wgParser->parse( $toparse, $this->mTitle, $parserOptions );
+ # Used messages to make sure grep find them:
+ # Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
+ if( $level && $format ) {
+ $note = "<div id='mw-{$level}{$format}preview'>" . wfMessage( "{$level}{$format}preview" )->text() . "</div>";
+ }
+ }
- $rt = Title::newFromRedirectArray( $this->textbox1 );
+ $rt = $content->getRedirectChain();
if ( $rt ) {
$previewHTML = $this->mArticle->viewRedirect( $rt, false );
} else {
- $previewHTML = $parserOutput->getText();
- }
- $this->mParserOutput = $parserOutput;
- $wgOut->addParserOutputNoText( $parserOutput );
+ # If we're adding a comment, we need to show the
+ # summary as the headline
+ if ( $this->section === "new" && $this->summary !== "" ) {
+ $content = $content->addSectionHeader( $this->summary );
+ }
+
+ $hook_args = array( $this, &$content );
+ ContentHandler::runLegacyHooks( 'EditPageGetPreviewText', $hook_args );
+ wfRunHooks( 'EditPageGetPreviewContent', $hook_args );
+
+ $parserOptions->enableLimitReport();
+
+ # For CSS/JS pages, we should have called the ShowRawCssJs hook here.
+ # But it's now deprecated, so never mind
- if ( count( $parserOutput->getWarnings() ) ) {
- $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
+ $content = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions );
+ $parserOutput = $content->getParserOutput( $this->getArticle()->getTitle(), null, $parserOptions );
+
+ $previewHTML = $parserOutput->getText();
+ $this->mParserOutput = $parserOutput;
+ $wgOut->addParserOutputNoText( $parserOutput );
+
+ if ( count( $parserOutput->getWarnings() ) ) {
+ $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
+ }
}
+ } catch ( MWContentSerializationException $ex ) {
+ $m = wfMessage( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
+ $note .= "\n\n" . $m->parse();
+ $previewHTML = '';
}
if ( $this->isConflict ) {
@@ -2887,8 +3297,8 @@ HTML
* Returns an array of html code of the following checkboxes:
* minor and watch
*
- * @param $tabindex int Current tabindex
- * @param $checked Array of checkbox => bool, where bool indicates the checked
+ * @param int $tabindex Current tabindex
+ * @param array $checked of checkbox => bool, where bool indicates the checked
* status of the checkbox
*
* @return array
@@ -2938,7 +3348,7 @@ HTML
* Returns an array of html code of the following buttons:
* save, diff, preview and live
*
- * @param $tabindex int Current tabindex
+ * @param int $tabindex Current tabindex
*
* @return array
*/
@@ -3067,7 +3477,7 @@ HTML
/**
* Produce the stock "your edit contains spam" page
*
- * @param $match string Text which triggered one or more filters
+ * @param string|bool $match Text which triggered one or more filters
* @deprecated since 1.17 Use method spamPageWithContent() instead
*/
static function spamPage( $match = false ) {
@@ -3096,7 +3506,7 @@ HTML
global $wgOut, $wgLang;
$this->textbox2 = $this->textbox1;
- if( is_array( $match ) ){
+ if( is_array( $match ) ) {
$match = $wgLang->listToText( $match );
}
$wgOut->prepareErrorPage( wfMessage( 'spamprotectiontitle' ) );
@@ -3210,7 +3620,7 @@ HTML
* @private
*/
function makesafe( $invalue ) {
- // Armor existing references for reversability.
+ // Armor existing references for reversibility.
$invalue = strtr( $invalue, array( "&#x" => "&#x0" ) );
$bytesleft = 0;
@@ -3262,7 +3672,7 @@ HTML
$i++;
} while ( ctype_xdigit( $invalue[$i] ) && ( $i < strlen( $invalue ) ) );
- // Do some sanity checks. These aren't needed for reversability,
+ // Do some sanity checks. These aren't needed for reversibility,
// but should help keep the breakage down if the editor
// breaks one of the entities whilst editing.
if ( ( substr( $invalue, $i, 1 ) == ";" ) and ( strlen( $hexstring ) <= 6 ) ) {
@@ -3275,7 +3685,7 @@ HTML
$result .= substr( $invalue, $i, 1 );
}
}
- // reverse the transform that we made for reversability reasons.
+ // reverse the transform that we made for reversibility reasons.
return strtr( $result, array( "&#x0" => "&#x" ) );
}
}
diff --git a/includes/Exception.php b/includes/Exception.php
index 714f73e8..0bd7a2a7 100644
--- a/includes/Exception.php
+++ b/includes/Exception.php
@@ -64,8 +64,8 @@ class MWException extends Exception {
/**
* Run hook to allow extensions to modify the text of the exception
*
- * @param $name string: class name of the exception
- * @param $args array: arguments to pass to the callback functions
+ * @param string $name class name of the exception
+ * @param array $args arguments to pass to the callback functions
* @return string|null string to output or null if any hook has been called
*/
function runHooks( $name, $args = array() ) {
@@ -83,7 +83,7 @@ class MWException extends Exception {
$callargs = array_merge( array( $this ), $args );
foreach ( $hooks as $hook ) {
- if ( is_string( $hook ) || ( is_array( $hook ) && count( $hook ) >= 2 && is_string( $hook[0] ) ) ) { // 'function' or array( 'class', hook' )
+ if ( is_string( $hook ) || ( is_array( $hook ) && count( $hook ) >= 2 && is_string( $hook[0] ) ) ) { // 'function' or array( 'class', hook' )
$result = call_user_func_array( $hook, $callargs );
} else {
$result = null;
@@ -99,8 +99,8 @@ class MWException extends Exception {
/**
* Get a message from i18n
*
- * @param $key string: message name
- * @param $fallback string: default message if the message cache can't be
+ * @param string $key message name
+ * @param string $fallback default message if the message cache can't be
* called by the exception
* The function also has other parameters that are arguments for the message
* @return string message with arguments replaced
@@ -171,7 +171,7 @@ class MWException extends Exception {
/**
* Get a random ID for this error.
- * This allows to link the exception to its correspoding log entry when
+ * This allows to link the exception to its corresponding log entry when
* $wgShowExceptionDetails is set to false.
*
* @return string
@@ -262,7 +262,7 @@ class MWException extends Exception {
if ( defined( 'MW_API' ) ) {
// Unhandled API exception, we can't be sure that format printer is alive
header( 'MediaWiki-API-Error: internal_api_error_' . get_class( $this ) );
- wfHttpError(500, 'Internal Server Error', $this->getText() );
+ wfHttpError( 500, 'Internal Server Error', $this->getText() );
} elseif ( self::isCommandLine() ) {
MWExceptionHandler::printError( $this->getText() );
} else {
@@ -320,16 +320,16 @@ class ErrorPageError extends MWException {
/**
* Note: these arguments are keys into wfMessage(), not text!
*
- * @param $title string|Message Message key (string) for page title, or a Message object
- * @param $msg string|Message Message key (string) for error text, or a Message object
- * @param $params array with parameters to wfMessage()
+ * @param string|Message $title Message key (string) for page title, or a Message object
+ * @param string|Message $msg Message key (string) for error text, or a Message object
+ * @param array $params with parameters to wfMessage()
*/
function __construct( $title, $msg, $params = null ) {
$this->title = $title;
$this->msg = $msg;
$this->params = $params;
- if( $msg instanceof Message ){
+ if( $msg instanceof Message ) {
parent::__construct( $msg );
} else {
parent::__construct( wfMessage( $msg )->text() );
@@ -354,8 +354,8 @@ class ErrorPageError extends MWException {
*/
class BadTitleError extends ErrorPageError {
/**
- * @param $msg string|Message A message key (default: 'badtitletext')
- * @param $params Array parameter to wfMessage()
+ * @param string|Message $msg A message key (default: 'badtitletext')
+ * @param array $params parameter to wfMessage()
*/
function __construct( $msg = 'badtitletext', $params = null ) {
parent::__construct( 'badtitle', $msg, $params );
@@ -423,7 +423,7 @@ class PermissionsError extends ErrorPageError {
* @ingroup Exception
*/
class ReadOnlyError extends ErrorPageError {
- public function __construct(){
+ public function __construct() {
parent::__construct(
'readonly',
'readonlytext',
@@ -439,14 +439,14 @@ class ReadOnlyError extends ErrorPageError {
* @ingroup Exception
*/
class ThrottledError extends ErrorPageError {
- public function __construct(){
+ public function __construct() {
parent::__construct(
'actionthrottled',
'actionthrottledtext'
);
}
- public function report(){
+ public function report() {
global $wgOut;
$wgOut->setStatusCode( 503 );
parent::report();
@@ -460,7 +460,7 @@ class ThrottledError extends ErrorPageError {
* @ingroup Exception
*/
class UserBlockedError extends ErrorPageError {
- public function __construct( Block $block ){
+ public function __construct( Block $block ) {
global $wgLang, $wgRequest;
$blocker = $block->getBlocker();
@@ -500,25 +500,24 @@ class UserBlockedError extends ErrorPageError {
/**
* Shows a generic "user is not logged in" error page.
*
- * This is essentially an ErrorPageError exception which by default use the
+ * This is essentially an ErrorPageError exception which by default uses the
* 'exception-nologin' as a title and 'exception-nologin-text' for the message.
* @see bug 37627
* @since 1.20
*
* @par Example:
* @code
- * if( $user->isAnon ) {
+ * if( $user->isAnon() ) {
* throw new UserNotLoggedIn();
* }
* @endcode
*
- * Please note the parameters are mixed up compared to ErrorPageError, this
- * is done to be able to simply specify a reason whitout overriding the default
- * title.
+ * Note the parameter order differs from ErrorPageError, this allows you to
+ * simply specify a reason without overriding the default title.
*
* @par Example:
* @code
- * if( $user->isAnon ) {
+ * if( $user->isAnon() ) {
* throw new UserNotLoggedIn( 'action-require-loggedin' );
* }
* @endcode
@@ -533,11 +532,11 @@ class UserNotLoggedIn extends ErrorPageError {
* @param $titleMsg A message key to set the page title.
* Optional, default: 'exception-nologin'
* @param $params Parameters to wfMessage().
- * Optiona, default: null
+ * Optional, default: null
*/
public function __construct(
$reasonMsg = 'exception-nologin-text',
- $titleMsg = 'exception-nologin',
+ $titleMsg = 'exception-nologin',
$params = null
) {
parent::__construct( $titleMsg, $reasonMsg, $params );
@@ -558,24 +557,48 @@ class HttpError extends MWException {
* Constructor
*
* @param $httpCode Integer: HTTP status code to send to the client
- * @param $content String|Message: content of the message
- * @param $header String|Message: content of the header (\<title\> and \<h1\>)
+ * @param string|Message $content content of the message
+ * @param string|Message $header content of the header (\<title\> and \<h1\>)
*/
- public function __construct( $httpCode, $content, $header = null ){
+ public function __construct( $httpCode, $content, $header = null ) {
parent::__construct( $content );
$this->httpCode = (int)$httpCode;
$this->header = $header;
$this->content = $content;
}
+ /**
+ * Returns the HTTP status code supplied to the constructor.
+ *
+ * @return int
+ */
+ public function getStatusCode() {
+ return $this->httpCode;
+ }
+
+ /**
+ * Report the HTTP error.
+ * Sends the appropriate HTTP status code and outputs an
+ * HTML page with an error message.
+ */
public function report() {
$httpMessage = HttpStatus::getMessage( $this->httpCode );
- header( "Status: {$this->httpCode} {$httpMessage}" );
+ header( "Status: {$this->httpCode} {$httpMessage}", true, $this->httpCode );
header( 'Content-type: text/html; charset=utf-8' );
+ print $this->getHTML();
+ }
+
+ /**
+ * Returns HTML for reporting the HTTP error.
+ * This will be a minimal but complete HTML document.
+ *
+ * @return string HTML
+ */
+ public function getHTML() {
if ( $this->header === null ) {
- $header = $httpMessage;
+ $header = HttpStatus::getMessage( $this->httpCode );
} elseif ( $this->header instanceof Message ) {
$header = $this->header->escaped();
} else {
@@ -588,7 +611,7 @@ class HttpError extends MWException {
$content = htmlspecialchars( $this->content );
}
- print "<!DOCTYPE html>\n".
+ return "<!DOCTYPE html>\n".
"<html><head><title>$header</title></head>\n" .
"<body><h1>$header</h1><p>$content</p></body></html>\n";
}
@@ -661,7 +684,7 @@ class MWExceptionHandler {
* Print a message, if possible to STDERR.
* Use this in command line mode only (see isCommandLine)
*
- * @param $message string Failure text
+ * @param string $message Failure text
*/
public static function printError( $message ) {
# NOTE: STDERR may not be available, especially if php-cgi is used from the command line (bug #15602).
diff --git a/includes/Export.php b/includes/Export.php
index f01fb237..d8cc0242 100644
--- a/includes/Export.php
+++ b/includes/Export.php
@@ -31,8 +31,8 @@
* @ingroup SpecialPage Dump
*/
class WikiExporter {
- var $list_authors = false ; # Return distinct author list (when not returning full history)
- var $author_list = "" ;
+ var $list_authors = false; # Return distinct author list (when not returning full history)
+ var $author_list = "";
var $dumpUploads = false;
var $dumpUploadFileContents = false;
@@ -63,7 +63,7 @@ class WikiExporter {
* @return string
*/
public static function schemaVersion() {
- return "0.7";
+ return "0.8";
}
/**
@@ -80,17 +80,17 @@ class WikiExporter {
* offset: non-inclusive offset at which to start the query
* limit: maximum number of rows to return
* dir: "asc" or "desc" timestamp order
- * @param $buffer Int: one of WikiExporter::BUFFER or WikiExporter::STREAM
- * @param $text Int: one of WikiExporter::TEXT or WikiExporter::STUB
+ * @param int $buffer one of WikiExporter::BUFFER or WikiExporter::STREAM
+ * @param int $text one of WikiExporter::TEXT or WikiExporter::STUB
*/
- function __construct( &$db, $history = WikiExporter::CURRENT,
+ function __construct( $db, $history = WikiExporter::CURRENT,
$buffer = WikiExporter::BUFFER, $text = WikiExporter::TEXT ) {
- $this->db =& $db;
+ $this->db = $db;
$this->history = $history;
- $this->buffer = $buffer;
- $this->writer = new XmlDumpWriter();
- $this->sink = new DumpOutput();
- $this->text = $text;
+ $this->buffer = $buffer;
+ $this->writer = new XmlDumpWriter();
+ $this->sink = new DumpOutput();
+ $this->text = $text;
}
/**
@@ -126,7 +126,7 @@ class WikiExporter {
/**
* Dumps a series of page and revision records for those pages
* in the database falling within the page_id range given.
- * @param $start Int: inclusive lower limit (this id is included)
+ * @param int $start inclusive lower limit (this id is included)
* @param $end Int: Exclusive upper limit (this id is not included)
* If 0, no upper limit.
*/
@@ -141,7 +141,7 @@ class WikiExporter {
/**
* Dumps a series of page and revision records for those pages
* in the database with revisions falling within the rev_id range given.
- * @param $start Int: inclusive lower limit (this id is included)
+ * @param int $start inclusive lower limit (this id is included)
* @param $end Int: Exclusive upper limit (this id is not included)
* If 0, no upper limit.
*/
@@ -226,7 +226,7 @@ class WikiExporter {
foreach ( $res as $row ) {
$this->author_list .= "<contributor>" .
"<username>" .
- htmlentities( $row->rev_user_text ) .
+ htmlentities( $row->rev_user_text ) .
"</username>" .
"<id>" .
$row->rev_user .
@@ -330,7 +330,7 @@ class WikiExporter {
$join['revision'] = array( 'INNER JOIN', 'page_id=rev_page' );
} elseif ( $this->history & WikiExporter::CURRENT ) {
# Latest revision dumps...
- if ( $this->list_authors && $cond != '' ) { // List authors, if so desired
+ if ( $this->list_authors && $cond != '' ) { // List authors, if so desired
$this->do_list_authors( $cond );
}
$join['revision'] = array( 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' );
@@ -348,7 +348,7 @@ class WikiExporter {
$join['revision'] = array( 'INNER JOIN', 'page_id=rev_page' );
$opts['ORDER BY'] = array( 'rev_page ASC', 'rev_id ASC' );
} else {
- # Uknown history specification parameter?
+ # Unknown history specification parameter?
wfProfileOut( __METHOD__ );
throw new MWException( __METHOD__ . " given invalid history dump type." );
}
@@ -427,10 +427,10 @@ class WikiExporter {
protected function outputPageStream( $resultset ) {
$last = null;
foreach ( $resultset as $row ) {
- if ( is_null( $last ) ||
+ if ( $last === null ||
$last->page_namespace != $row->page_namespace ||
- $last->page_title != $row->page_title ) {
- if ( isset( $last ) ) {
+ $last->page_title != $row->page_title ) {
+ if ( $last !== null ) {
$output = '';
if ( $this->dumpUploads ) {
$output .= $this->writer->writeUploads( $last, $this->dumpUploadFileContents );
@@ -445,7 +445,7 @@ class WikiExporter {
$output = $this->writer->writeRevision( $row );
$this->sink->writeRevision( $row, $output );
}
- if ( isset( $last ) ) {
+ if ( $last !== null ) {
$output = '';
if ( $this->dumpUploads ) {
$output .= $this->writer->writeUploads( $last, $this->dumpUploadFileContents );
@@ -498,7 +498,7 @@ class XmlDumpWriter {
'xmlns' => "http://www.mediawiki.org/xml/export-$ver/",
'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance",
'xsi:schemaLocation' => "http://www.mediawiki.org/xml/export-$ver/ " .
- "http://www.mediawiki.org/xml/export-$ver.xsd",
+ "http://www.mediawiki.org/xml/export-$ver.xsd", #TODO: how do we get a new version up there?
'version' => $ver,
'xml:lang' => $wgLanguageCode ),
null ) .
@@ -634,37 +634,31 @@ class XmlDumpWriter {
function writeRevision( $row ) {
wfProfileIn( __METHOD__ );
- $out = " <revision>\n";
+ $out = " <revision>\n";
$out .= " " . Xml::element( 'id', null, strval( $row->rev_id ) ) . "\n";
- if( $row->rev_parent_id ) {
+ if( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
$out .= " " . Xml::element( 'parentid', null, strval( $row->rev_parent_id ) ) . "\n";
}
$out .= $this->writeTimestamp( $row->rev_timestamp );
- if ( $row->rev_deleted & Revision::DELETED_USER ) {
+ if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_USER ) ) {
$out .= " " . Xml::element( 'contributor', array( 'deleted' => 'deleted' ) ) . "\n";
} else {
$out .= $this->writeContributor( $row->rev_user, $row->rev_user_text );
}
- if ( $row->rev_minor_edit ) {
- $out .= " <minor/>\n";
+ if ( isset( $row->rev_minor_edit ) && $row->rev_minor_edit ) {
+ $out .= " <minor/>\n";
}
- if ( $row->rev_deleted & Revision::DELETED_COMMENT ) {
+ if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_COMMENT ) ) {
$out .= " " . Xml::element( 'comment', array( 'deleted' => 'deleted' ) ) . "\n";
} elseif ( $row->rev_comment != '' ) {
$out .= " " . Xml::elementClean( 'comment', array(), strval( $row->rev_comment ) ) . "\n";
}
- if ( $row->rev_sha1 && !( $row->rev_deleted & Revision::DELETED_TEXT ) ) {
- $out .= " " . Xml::element('sha1', null, strval( $row->rev_sha1 ) ) . "\n";
- } else {
- $out .= " <sha1/>\n";
- }
-
$text = '';
- if ( $row->rev_deleted & Revision::DELETED_TEXT ) {
+ if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_TEXT ) ) {
$out .= " " . Xml::element( 'text', array( 'deleted' => 'deleted' ) ) . "\n";
} elseif ( isset( $row->old_text ) ) {
// Raw text from the database may have invalid chars
@@ -679,6 +673,34 @@ class XmlDumpWriter {
"" ) . "\n";
}
+ if ( isset( $row->rev_sha1 ) && $row->rev_sha1 && !( $row->rev_deleted & Revision::DELETED_TEXT ) ) {
+ $out .= " " . Xml::element( 'sha1', null, strval( $row->rev_sha1 ) ) . "\n";
+ } else {
+ $out .= " <sha1/>\n";
+ }
+
+ if ( isset( $row->rev_content_model ) && !is_null( $row->rev_content_model ) ) {
+ $content_model = strval( $row->rev_content_model );
+ } else {
+ // probably using $wgContentHandlerUseDB = false;
+ // @todo: test!
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+ $content_model = ContentHandler::getDefaultModelFor( $title );
+ }
+
+ $out .= " " . Xml::element( 'model', null, strval( $content_model ) ) . "\n";
+
+ if ( isset( $row->rev_content_format ) && !is_null( $row->rev_content_format ) ) {
+ $content_format = strval( $row->rev_content_format );
+ } else {
+ // probably using $wgContentHandlerUseDB = false;
+ // @todo: test!
+ $content_handler = ContentHandler::getForModelID( $content_model );
+ $content_format = $content_handler->getDefaultFormat();
+ }
+
+ $out .= " " . Xml::element( 'format', null, strval( $content_format ) ) . "\n";
+
wfRunHooks( 'XmlDumpWriterWriteRevision', array( &$this, &$out, $row, $text ) );
$out .= " </revision>\n";
@@ -698,7 +720,7 @@ class XmlDumpWriter {
function writeLogItem( $row ) {
wfProfileIn( __METHOD__ );
- $out = " <logitem>\n";
+ $out = " <logitem>\n";
$out .= " " . Xml::element( 'id', null, strval( $row->log_id ) ) . "\n";
$out .= $this->writeTimestamp( $row->log_timestamp, " " );
@@ -736,7 +758,7 @@ class XmlDumpWriter {
/**
* @param $timestamp string
- * @param $indent string Default to six spaces
+ * @param string $indent Default to six spaces
* @return string
*/
function writeTimestamp( $timestamp, $indent = " " ) {
@@ -747,7 +769,7 @@ class XmlDumpWriter {
/**
* @param $id
* @param $text string
- * @param $indent string Default to six spaces
+ * @param string $indent Default to six spaces
* @return string
*/
function writeContributor( $id, $text, $indent = " " ) {
@@ -849,9 +871,8 @@ class XmlDumpWriter {
}
}
-
/**
- * Base class for output stream; prints to stdout or buffer or whereever.
+ * Base class for output stream; prints to stdout or buffer or wherever.
* @ingroup Dump
*/
class DumpOutput {
@@ -918,7 +939,6 @@ class DumpOutput {
* @param $newname mixed File name. May be a string or an array with one element
*/
function closeRenameAndReopen( $newname ) {
- return;
}
/**
@@ -926,10 +946,9 @@ class DumpOutput {
* Use this for the last piece of a file written out
* at specified checkpoints (e.g. every n hours).
* @param $newname mixed File name. May be a string or an array with one element
- * @param $open bool If true, a new file with the old filename will be opened again for writing (default: false)
+ * @param bool $open If true, a new file with the old filename will be opened again for writing (default: false)
*/
function closeAndRename( $newname, $open = false ) {
- return;
}
/**
@@ -938,7 +957,7 @@ class DumpOutput {
* @return null
*/
function getFilenames() {
- return NULL;
+ return null;
}
}
@@ -987,7 +1006,7 @@ class DumpFileOutput extends DumpOutput {
* @throws MWException
*/
function renameOrException( $newname ) {
- if (! rename( $this->filename, $newname ) ) {
+ if ( !rename( $this->filename, $newname ) ) {
throw new MWException( __METHOD__ . ": rename of file {$this->filename} to $newname failed\n" );
}
}
@@ -1050,7 +1069,7 @@ class DumpPipeOutput extends DumpFileOutput {
*/
function __construct( $command, $file = null ) {
if ( !is_null( $file ) ) {
- $command .= " > " . wfEscapeShellArg( $file );
+ $command .= " > " . wfEscapeShellArg( $file );
}
$this->startCommand( $command );
@@ -1106,7 +1125,7 @@ class DumpPipeOutput extends DumpFileOutput {
$this->renameOrException( $newname );
if ( $open ) {
$command = $this->command;
- $command .= " > " . wfEscapeShellArg( $this->filename );
+ $command .= " > " . wfEscapeShellArg( $this->filename );
$this->startCommand( $command );
}
}
@@ -1325,6 +1344,7 @@ class DumpNamespaceFilter extends DumpFilter {
/**
* @param $sink DumpOutput
* @param $param
+ * @throws MWException
*/
function __construct( &$sink, $param ) {
parent::__construct( $sink );
@@ -1338,7 +1358,7 @@ class DumpNamespaceFilter extends DumpFilter {
"NS_PROJECT_TALK" => NS_PROJECT_TALK,
"NS_FILE" => NS_FILE,
"NS_FILE_TALK" => NS_FILE_TALK,
- "NS_IMAGE" => NS_IMAGE, // NS_IMAGE is an alias for NS_FILE
+ "NS_IMAGE" => NS_IMAGE, // NS_IMAGE is an alias for NS_FILE
"NS_IMAGE_TALK" => NS_IMAGE_TALK,
"NS_MEDIAWIKI" => NS_MEDIAWIKI,
"NS_MEDIAWIKI_TALK" => NS_MEDIAWIKI_TALK,
@@ -1378,7 +1398,6 @@ class DumpNamespaceFilter extends DumpFilter {
}
}
-
/**
* Dump output filter to include only the last revision in each page sequence.
* @ingroup Dump
@@ -1423,7 +1442,7 @@ class DumpLatestFilter extends DumpFilter {
}
/**
- * Base class for output stream; prints to stdout or buffer or whereever.
+ * Base class for output stream; prints to stdout or buffer or wherever.
* @ingroup Dump
*/
class DumpMultiWriter {
@@ -1506,7 +1525,7 @@ class DumpMultiWriter {
function getFilenames() {
$filenames = array();
for ( $i = 0; $i < $this->count; $i++ ) {
- $filenames[] = $this->sinks[$i]->getFilenames();
+ $filenames[] = $this->sinks[$i]->getFilenames();
}
return $filenames;
}
diff --git a/includes/ExternalEdit.php b/includes/ExternalEdit.php
index 34683253..11e94230 100644
--- a/includes/ExternalEdit.php
+++ b/includes/ExternalEdit.php
@@ -40,7 +40,7 @@ class ExternalEdit extends ContextSource {
* Check whether external edit or diff should be used.
*
* @param $context IContextSource context to use
- * @param $type String can be either 'edit' or 'diff'
+ * @param string $type can be either 'edit' or 'diff'
* @return Bool
*/
public static function useExternalEngine( IContextSource $context, $type ) {
@@ -87,7 +87,7 @@ class ExternalEdit extends ContextSource {
'URL' => $image->getCanonicalURL()
)
);
- } else{
+ } else {
$urls = array();
}
} else {
diff --git a/includes/ExternalStore.php b/includes/ExternalStore.php
deleted file mode 100644
index 61d4ef7c..00000000
--- a/includes/ExternalStore.php
+++ /dev/null
@@ -1,172 +0,0 @@
-<?php
-/**
- * Data storage in external repositories.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * @defgroup ExternalStorage ExternalStorage
- */
-
-/**
- * Constructor class for data kept in external repositories
- *
- * External repositories might be populated by maintenance/async
- * scripts, thus partial moving of data may be possible, as well
- * as possibility to have any storage format (i.e. for archives)
- *
- * @ingroup ExternalStorage
- */
-class ExternalStore {
- var $mParams;
-
- function __construct( $params = array() ) {
- $this->mParams = $params;
- }
-
- /**
- * Fetch data from given URL
- *
- * @param $url String: The URL of the text to get
- * @param $params Array: associative array of parameters for the ExternalStore object.
- * @return string|bool The text stored or false on error
- */
- static function fetchFromURL( $url, $params = array() ) {
- global $wgExternalStores;
-
- if( !$wgExternalStores )
- return false;
-
- $parts = explode( '://', $url, 2 );
-
- if ( count( $parts ) != 2 ) {
- return false;
- }
-
- list( $proto, $path ) = $parts;
-
- if ( $path == '' ) { // Bad URL
- return false;
- }
-
- $store = self::getStoreObject( $proto, $params );
- if ( $store === false )
- return false;
- return $store->fetchFromURL( $url );
- }
-
- /**
- * Get an external store object of the given type, with the given parameters
- *
- * @param $proto String: type of external storage, should be a value in $wgExternalStores
- * @param $params Array: associative array of parameters for the ExternalStore object.
- * @return ExternalStore subclass or false on error
- */
- static function getStoreObject( $proto, $params = array() ) {
- global $wgExternalStores;
- if( !$wgExternalStores )
- return false;
- /* Protocol not enabled */
- if( !in_array( $proto, $wgExternalStores ) )
- return false;
-
- $class = 'ExternalStore' . ucfirst( $proto );
- /* Any custom modules should be added to $wgAutoLoadClasses for on-demand loading */
- if( !MWInit::classExists( $class ) ) {
- return false;
- }
-
- return new $class($params);
- }
-
- /**
- * Store a data item to an external store, identified by a partial URL
- * The protocol part is used to identify the class, the rest is passed to the
- * class itself as a parameter.
- * @param $url
- * @param $data
- * @param $params array
- * @return string|bool The URL of the stored data item, or false on error
- */
- static function insert( $url, $data, $params = array() ) {
- list( $proto, $params ) = explode( '://', $url, 2 );
- $store = self::getStoreObject( $proto, $params );
- if ( $store === false ) {
- return false;
- } else {
- return $store->store( $params, $data );
- }
- }
-
- /**
- * Like insert() above, but does more of the work for us.
- * This function does not need a url param, it builds it by
- * itself. It also fails-over to the next possible clusters.
- *
- * @param $data String
- * @param $storageParams Array: associative array of parameters for the ExternalStore object.
- * @return string The URL of the stored data item, or false on error
- */
- public static function insertToDefault( $data, $storageParams = array() ) {
- global $wgDefaultExternalStore;
- $tryStores = (array)$wgDefaultExternalStore;
- $error = false;
- while ( count( $tryStores ) > 0 ) {
- $index = mt_rand(0, count( $tryStores ) - 1);
- $storeUrl = $tryStores[$index];
- wfDebug( __METHOD__.": trying $storeUrl\n" );
- list( $proto, $params ) = explode( '://', $storeUrl, 2 );
- $store = self::getStoreObject( $proto, $storageParams );
- if ( $store === false ) {
- throw new MWException( "Invalid external storage protocol - $storeUrl" );
- }
- try {
- $url = $store->store( $params, $data ); // Try to save the object
- } catch ( DBConnectionError $error ) {
- $url = false;
- } catch( DBQueryError $error ) {
- $url = false;
- }
- if ( $url ) {
- return $url; // Done!
- } else {
- unset( $tryStores[$index] ); // Don't try this one again!
- $tryStores = array_values( $tryStores ); // Must have consecutive keys
- wfDebugLog( 'ExternalStorage', "Unable to store text to external storage $storeUrl" );
- }
- }
- // All stores failed
- if ( $error ) {
- // Rethrow the last connection error
- throw $error;
- } else {
- throw new MWException( "Unable to store text to external storage" );
- }
- }
-
- /**
- * @param $data
- * @param $wiki
- *
- * @return string
- */
- public static function insertToForeignDefault( $data, $wiki ) {
- return self::insertToDefault( $data, array( 'wiki' => $wiki ) );
- }
-}
diff --git a/includes/ExternalStoreDB.php b/includes/ExternalStoreDB.php
deleted file mode 100644
index 6f2b33e1..00000000
--- a/includes/ExternalStoreDB.php
+++ /dev/null
@@ -1,185 +0,0 @@
-<?php
-/**
- * External storage in SQL database.
- *
- * 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
- */
-
-/**
- * DB accessable external objects
- * @ingroup ExternalStorage
- */
-class ExternalStoreDB {
-
- function __construct( $params = array() ) {
- $this->mParams = $params;
- }
-
- /**
- * Get a LoadBalancer for the specified cluster
- *
- * @param $cluster String: cluster name
- * @return LoadBalancer object
- */
- function &getLoadBalancer( $cluster ) {
- $wiki = isset($this->mParams['wiki']) ? $this->mParams['wiki'] : false;
-
- return wfGetLBFactory()->getExternalLB( $cluster, $wiki );
- }
-
- /**
- * Get a slave database connection for the specified cluster
- *
- * @param $cluster String: cluster name
- * @return DatabaseBase object
- */
- function &getSlave( $cluster ) {
- global $wgDefaultExternalStore;
-
- $wiki = isset($this->mParams['wiki']) ? $this->mParams['wiki'] : false;
- $lb =& $this->getLoadBalancer( $cluster );
-
- if ( !in_array( "DB://" . $cluster, (array)$wgDefaultExternalStore ) ) {
- wfDebug( "read only external store" );
- $lb->allowLagged(true);
- } else {
- wfDebug( "writable external store" );
- }
-
- return $lb->getConnection( DB_SLAVE, array(), $wiki );
- }
-
- /**
- * Get a master database connection for the specified cluster
- *
- * @param $cluster String: cluster name
- * @return DatabaseBase object
- */
- function &getMaster( $cluster ) {
- $wiki = isset($this->mParams['wiki']) ? $this->mParams['wiki'] : false;
- $lb =& $this->getLoadBalancer( $cluster );
- return $lb->getConnection( DB_MASTER, array(), $wiki );
- }
-
- /**
- * Get the 'blobs' table name for this database
- *
- * @param $db DatabaseBase
- * @return String: table name ('blobs' by default)
- */
- function getTable( &$db ) {
- $table = $db->getLBInfo( 'blobs table' );
- if ( is_null( $table ) ) {
- $table = 'blobs';
- }
- return $table;
- }
-
- /**
- * Fetch data from given URL
- * @param $url String: an url of the form DB://cluster/id or DB://cluster/id/itemid for concatened storage.
- * @return mixed
- */
- function fetchFromURL( $url ) {
- $path = explode( '/', $url );
- $cluster = $path[2];
- $id = $path[3];
- if ( isset( $path[4] ) ) {
- $itemID = $path[4];
- } else {
- $itemID = false;
- }
-
- $ret =& $this->fetchBlob( $cluster, $id, $itemID );
-
- if ( $itemID !== false && $ret !== false ) {
- return $ret->getItem( $itemID );
- }
- return $ret;
- }
-
- /**
- * Fetch a blob item out of the database; a cache of the last-loaded
- * blob will be kept so that multiple loads out of a multi-item blob
- * can avoid redundant database access and decompression.
- * @param $cluster
- * @param $id
- * @param $itemID
- * @return mixed
- * @private
- */
- function &fetchBlob( $cluster, $id, $itemID ) {
- /**
- * One-step cache variable to hold base blobs; operations that
- * pull multiple revisions may often pull multiple times from
- * the same blob. By keeping the last-used one open, we avoid
- * redundant unserialization and decompression overhead.
- */
- static $externalBlobCache = array();
-
- $cacheID = ( $itemID === false ) ? "$cluster/$id" : "$cluster/$id/";
- if( isset( $externalBlobCache[$cacheID] ) ) {
- wfDebug( "ExternalStoreDB::fetchBlob cache hit on $cacheID\n" );
- return $externalBlobCache[$cacheID];
- }
-
- wfDebug( "ExternalStoreDB::fetchBlob cache miss on $cacheID\n" );
-
- $dbr =& $this->getSlave( $cluster );
- $ret = $dbr->selectField( $this->getTable( $dbr ), 'blob_text', array( 'blob_id' => $id ), __METHOD__ );
- if ( $ret === false ) {
- wfDebugLog( 'ExternalStoreDB', "ExternalStoreDB::fetchBlob master fallback on $cacheID\n" );
- // Try the master
- $dbw =& $this->getMaster( $cluster );
- $ret = $dbw->selectField( $this->getTable( $dbw ), 'blob_text', array( 'blob_id' => $id ), __METHOD__ );
- if( $ret === false) {
- wfDebugLog( 'ExternalStoreDB', "ExternalStoreDB::fetchBlob master failed to find $cacheID\n" );
- }
- }
- if( $itemID !== false && $ret !== false ) {
- // Unserialise object; caller extracts item
- $ret = unserialize( $ret );
- }
-
- $externalBlobCache = array( $cacheID => &$ret );
- return $ret;
- }
-
- /**
- * Insert a data item into a given cluster
- *
- * @param $cluster String: the cluster name
- * @param $data String: the data item
- * @return string URL
- */
- function store( $cluster, $data ) {
- $dbw = $this->getMaster( $cluster );
- $id = $dbw->nextSequenceValue( 'blob_blob_id_seq' );
- $dbw->insert( $this->getTable( $dbw ),
- array( 'blob_id' => $id, 'blob_text' => $data ),
- __METHOD__ );
- $id = $dbw->insertId();
- if ( !$id ) {
- throw new MWException( __METHOD__.': no insert ID' );
- }
- if ( $dbw->getFlag( DBO_TRX ) ) {
- $dbw->commit( __METHOD__ );
- }
- return "DB://$cluster/$id";
- }
-}
diff --git a/includes/ExternalStoreHttp.php b/includes/ExternalStoreHttp.php
deleted file mode 100644
index 311e32b3..00000000
--- a/includes/ExternalStoreHttp.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * External storage using HTTP requests.
- *
- * 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 class for HTTP accessable external objects.
- * Only supports reading, not storing.
- *
- * @ingroup ExternalStorage
- */
-class ExternalStoreHttp {
-
- /**
- * Fetch data from given URL
- *
- * @param $url String: the URL
- * @return String: the content at $url
- */
- function fetchFromURL( $url ) {
- $ret = Http::get( $url );
- return $ret;
- }
-
- /* XXX: may require other methods, for store, delete,
- * whatever, for initial ext storage
- */
-}
diff --git a/includes/ExternalUser.php b/includes/ExternalUser.php
index 9a01deb7..580b9896 100644
--- a/includes/ExternalUser.php
+++ b/includes/ExternalUser.php
@@ -128,7 +128,7 @@ abstract class ExternalUser {
* @param $name string
* @return bool Success?
*/
- protected abstract function initFromName( $name );
+ abstract protected function initFromName( $name );
/**
* Given an id, which was at some previous point in history returned by
@@ -138,7 +138,7 @@ abstract class ExternalUser {
* @param $id string
* @return bool Success?
*/
- protected abstract function initFromId( $id );
+ abstract protected function initFromId( $id );
/**
* Try to magically initialize the user from cookies or similar information
@@ -278,23 +278,23 @@ abstract class ExternalUser {
* This is part of the core code and is not overridable by specific
* plugins. It's in this class only for convenience.
*
- * @param $id int user_id
+ * @param int $id user_id
*/
- public final function linkToLocal( $id ) {
+ final public function linkToLocal( $id ) {
$dbw = wfGetDB( DB_MASTER );
$dbw->replace( 'external_user',
array( 'eu_local_id', 'eu_external_id' ),
array( 'eu_local_id' => $id,
- 'eu_external_id' => $this->getId() ),
+ 'eu_external_id' => $this->getId() ),
__METHOD__ );
}
-
+
/**
* Check whether this external user id is already linked with
* a local user.
* @return Mixed User if the account is linked, Null otherwise.
*/
- public final function getLocalUser(){
+ final public function getLocalUser() {
$dbr = wfGetDB( DB_SLAVE );
$row = $dbr->selectRow(
'external_user',
@@ -305,5 +305,5 @@ abstract class ExternalUser {
? User::newFromId( $row->eu_local_id )
: null;
}
-
+
}
diff --git a/includes/FakeTitle.php b/includes/FakeTitle.php
index 60f7600d..efa213fb 100644
--- a/includes/FakeTitle.php
+++ b/includes/FakeTitle.php
@@ -114,9 +114,9 @@ class FakeTitle extends Title {
function getParentCategories() { $this->error(); }
function getParentCategoryTree( $children = array() ) { $this->error(); }
function pageCond() { $this->error(); }
- function getPreviousRevisionID( $revId, $flags=0 ) { $this->error(); }
- function getNextRevisionID( $revId, $flags=0 ) { $this->error(); }
- function getFirstRevision( $flags=0 ) { $this->error(); }
+ function getPreviousRevisionID( $revId, $flags = 0 ) { $this->error(); }
+ function getNextRevisionID( $revId, $flags = 0 ) { $this->error(); }
+ function getFirstRevision( $flags = 0 ) { $this->error(); }
function isNewPage() { $this->error(); }
function getEarliestRevTime( $flags = 0 ) { $this->error(); }
function countRevisionsBetween( $old, $new ) { $this->error(); }
diff --git a/includes/Fallback.php b/includes/Fallback.php
index 4b138c11..2e19a095 100644
--- a/includes/Fallback.php
+++ b/includes/Fallback.php
@@ -149,13 +149,12 @@ class Fallback {
return $total;
}
-
/**
* Fallback implementation of mb_strpos, hardcoded to UTF-8.
* @param $haystack String
* @param $needle String
- * @param $offset String: optional start position
- * @param $encoding String: optional encoding; ignored
+ * @param string $offset optional start position
+ * @param string $encoding optional encoding; ignored
* @return int
*/
public static function mb_strpos( $haystack, $needle, $offset = 0, $encoding = '' ) {
@@ -175,8 +174,8 @@ class Fallback {
* Fallback implementation of mb_strrpos, hardcoded to UTF-8.
* @param $haystack String
* @param $needle String
- * @param $offset String: optional start position
- * @param $encoding String: optional encoding; ignored
+ * @param string $offset optional start position
+ * @param string $encoding optional encoding; ignored
* @return int
*/
public static function mb_strrpos( $haystack, $needle, $offset = 0, $encoding = '' ) {
@@ -192,22 +191,4 @@ class Fallback {
return false;
}
}
-
- /**
- * Fallback implementation of stream_resolve_include_path()
- * Native stream_resolve_include_path is available for PHP 5 >= 5.3.2
- * @param $filename String
- * @return String
- */
- public static function stream_resolve_include_path( $filename ) {
- $pathArray = explode( PATH_SEPARATOR, get_include_path() );
- foreach ( $pathArray as $path ) {
- $fullFilename = $path . DIRECTORY_SEPARATOR . $filename;
- if ( file_exists( $fullFilename ) ) {
- return $fullFilename;
- }
- }
- return false;
- }
-
}
diff --git a/includes/Feed.php b/includes/Feed.php
index f9dbf5ba..caf2e571 100644
--- a/includes/Feed.php
+++ b/includes/Feed.php
@@ -52,11 +52,11 @@ class FeedItem {
/**
* Constructor
*
- * @param $title String|Title Item's title
+ * @param string|Title $title Item's title
* @param $description String
- * @param $url String: URL uniquely designating the item.
- * @param $date String: Item's date
- * @param $author String: Author's user name
+ * @param string $url URL uniquely designating the item.
+ * @param string $date Item's date
+ * @param string $author Author's user name
* @param $comments String
*/
function __construct( $title, $description, $url, $date = '', $author = '', $comments = '' ) {
@@ -72,7 +72,7 @@ class FeedItem {
/**
* Encode $string so that it can be safely embedded in a XML document
*
- * @param $string String: string to encode
+ * @param string $string string to encode
* @return String
*/
public function xmlEncode( $string ) {
@@ -95,7 +95,7 @@ class FeedItem {
/**
* set the unique id of an item
*
- * @param $uniqueId String: unique id for the item
+ * @param string $uniqueId unique id for the item
* @param $rssIsPermalink Boolean: set to true if the guid (unique id) is a permalink (RSS feeds only)
*/
public function setUniqueId( $uniqueId, $rssIsPermalink = false ) {
@@ -170,7 +170,7 @@ class FeedItem {
/**
* Quickie hack... strip out wikilinks to more legible form from the comment.
*
- * @param $text String: wikitext
+ * @param string $text wikitext
* @return String
*/
public static function stripComment( $text ) {
@@ -243,9 +243,9 @@ abstract class ChannelFeed extends FeedItem {
*/
function contentType() {
global $wgRequest;
- $ctype = $wgRequest->getVal('ctype','application/xml');
- $allowedctypes = array('application/xml','text/xml','application/rss+xml','application/atom+xml');
- return (in_array($ctype, $allowedctypes) ? $ctype : 'application/xml');
+ $ctype = $wgRequest->getVal( 'ctype', 'application/xml' );
+ $allowedctypes = array( 'application/xml', 'text/xml', 'application/rss+xml', 'application/atom+xml' );
+ return (in_array( $ctype, $allowedctypes ) ? $ctype : 'application/xml');
}
/**
@@ -282,7 +282,7 @@ class RSSFeed extends ChannelFeed {
}
/**
- * Ouput an RSS 2.0 header
+ * Output an RSS 2.0 header
*/
function outHeader() {
global $wgVersion;
@@ -318,7 +318,7 @@ class RSSFeed extends ChannelFeed {
}
/**
- * Ouput an RSS 2.0 footer
+ * Output an RSS 2.0 footer
*/
function outFooter() {
?>
@@ -362,7 +362,7 @@ class AtomFeed extends ChannelFeed {
}
/**
- * Atom 1.0 requires a unique, opaque IRI as a unique indentifier
+ * Atom 1.0 requires a unique, opaque IRI as a unique identifier
* for every feed we create. For now just use the URL, but who
* can tell if that's right? If we put options on the feed, do we
* have to change the id? Maybe? Maybe not.
@@ -409,7 +409,7 @@ class AtomFeed extends ChannelFeed {
}
/**
- * Outputs the footer for Atom 1.0 feed (basicly '\</feed\>').
+ * Outputs the footer for Atom 1.0 feed (basically '\</feed\>').
*/
function outFooter() {?>
</feed><?php
diff --git a/includes/FeedUtils.php b/includes/FeedUtils.php
index 11b2675d..adc1f781 100644
--- a/includes/FeedUtils.php
+++ b/includes/FeedUtils.php
@@ -33,13 +33,13 @@ class FeedUtils {
* If the feed should be purged; $timekey and $key will be removed from
* $messageMemc
*
- * @param $timekey String: cache key of the timestamp of the last item
- * @param $key String: cache key of feed's content
+ * @param string $timekey cache key of the timestamp of the last item
+ * @param string $key cache key of feed's content
*/
public static function checkPurge( $timekey, $key ) {
global $wgRequest, $wgUser, $messageMemc;
$purge = $wgRequest->getVal( 'action' ) === 'purge';
- if ( $purge && $wgUser->isAllowed('purge') ) {
+ if ( $purge && $wgUser->isAllowed( 'purge' ) ) {
$messageMemc->delete( $timekey );
$messageMemc->delete( $key );
}
@@ -48,7 +48,7 @@ class FeedUtils {
/**
* Check whether feeds can be used and that $type is a valid feed type
*
- * @param $type String: feed type, as requested by the user
+ * @param string $type feed type, as requested by the user
* @return Boolean
*/
public static function checkFeedOutput( $type ) {
@@ -85,9 +85,9 @@ class FeedUtils {
$row->rc_last_oldid, $row->rc_this_oldid,
$timestamp,
($row->rc_deleted & Revision::DELETED_COMMENT)
- ? wfMessage('rev-deleted-comment')->escaped()
+ ? wfMessage( 'rev-deleted-comment' )->escaped()
: $row->rc_comment,
- $actiontext
+ $actiontext
);
}
@@ -98,15 +98,15 @@ class FeedUtils {
* @param $oldid Integer: old revision's id
* @param $newid Integer: new revision's id
* @param $timestamp Integer: new revision's timestamp
- * @param $comment String: new revision's comment
- * @param $actiontext String: text of the action; in case of log event
+ * @param string $comment new revision's comment
+ * @param string $actiontext text of the action; in case of log event
* @return String
*/
- public static function formatDiffRow( $title, $oldid, $newid, $timestamp, $comment, $actiontext='' ) {
+ public static function formatDiffRow( $title, $oldid, $newid, $timestamp, $comment, $actiontext = '' ) {
global $wgFeedDiffCutoff, $wgLang;
wfProfileIn( __METHOD__ );
- # log enties
+ // log entries
$completeText = '<p>' . implode( ' ',
array_filter(
array(
@@ -115,7 +115,7 @@ class FeedUtils {
// NOTE: Check permissions for anonymous users, not current user.
// No "privileged" version should end up in the cache.
- // Most feed readers will not log in anway.
+ // Most feed readers will not log in anyway.
$anon = new User();
$accErrors = $title->getUserPermissionsErrors( 'read', $anon, true );
@@ -138,13 +138,23 @@ class FeedUtils {
$diffText = '';
// Don't bother generating the diff if we won't be able to show it
if ( $wgFeedDiffCutoff > 0 ) {
- $de = new DifferenceEngine( $title, $oldid, $newid );
- $diffText = $de->getDiff(
- wfMessage( 'previousrevision' )->text(), // hack
- wfMessage( 'revisionasof',
- $wgLang->timeanddate( $timestamp ),
- $wgLang->date( $timestamp ),
- $wgLang->time( $timestamp ) )->text() );
+ $rev = Revision::newFromId( $oldid );
+
+ if ( !$rev ) {
+ $diffText = false;
+ } else {
+ $context = clone RequestContext::getMain();
+ $context->setTitle( $title );
+
+ $contentHandler = $rev->getContentHandler();
+ $de = $contentHandler->createDifferenceEngine( $context, $oldid, $newid );
+ $diffText = $de->getDiff(
+ wfMessage( 'previousrevision' )->text(), // hack
+ wfMessage( 'revisionasof',
+ $wgLang->timeanddate( $timestamp ),
+ $wgLang->date( $timestamp ),
+ $wgLang->time( $timestamp ) )->text() );
+ }
}
if ( $wgFeedDiffCutoff <= 0 || ( strlen( $diffText ) > $wgFeedDiffCutoff ) ) {
@@ -162,16 +172,36 @@ class FeedUtils {
} else {
$rev = Revision::newFromId( $newid );
if( $wgFeedDiffCutoff <= 0 || is_null( $rev ) ) {
- $newtext = '';
+ $newContent = ContentHandler::getForTitle( $title )->makeEmptyContent();
+ } else {
+ $newContent = $rev->getContent();
+ }
+
+ if ( $newContent instanceof TextContent ) {
+ // only textual content has a "source view".
+ $text = $newContent->getNativeData();
+
+ if ( $wgFeedDiffCutoff <= 0 || strlen( $text ) > $wgFeedDiffCutoff ) {
+ $html = null;
+ } else {
+ $html = nl2br( htmlspecialchars( $text ) );
+ }
} else {
- $newtext = $rev->getText();
+ //XXX: we could get an HTML representation of the content via getParserOutput, but that may
+ // contain JS magic and generally may not be suitable for inclusion in a feed.
+ // Perhaps Content should have a getDescriptiveHtml method and/or a getSourceText method.
+ //Compare also ApiFeedContributions::feedItemDesc
+ $html = null;
}
- if ( $wgFeedDiffCutoff <= 0 || strlen( $newtext ) > $wgFeedDiffCutoff ) {
+
+ if ( $html === null ) {
+
// Omit large new page diffs, bug 29110
+ // Also use diff link for non-textual content
$diffText = self::getDiffLink( $title, $newid );
} else {
$diffText = '<p><b>' . wfMessage( 'newpage' )->text() . '</b></p>' .
- '<div>' . nl2br( htmlspecialchars( $newtext ) ) . '</div>';
+ '<div>' . $html . '</div>';
}
}
$completeText .= $diffText;
@@ -192,7 +222,7 @@ class FeedUtils {
protected static function getDiffLink( Title $title, $newid, $oldid = null ) {
$queryParameters = ($oldid == null)
? "diff={$newid}"
- : "diff={$newid}&oldid={$oldid}" ;
+ : "diff={$newid}&oldid={$oldid}";
$diffUrl = $title->getFullUrl( $queryParameters );
$diffLink = Html::element( 'a', array( 'href' => $diffUrl ),
@@ -206,18 +236,18 @@ class FeedUtils {
* Might be 'cleaner' to use DOM or XSLT or something,
* but *gack* it's a pain in the ass.
*
- * @param $text String: diff's HTML output
+ * @param string $text diff's HTML output
* @return String: modified HTML
*/
public static function applyDiffStyle( $text ) {
$styles = array(
'diff' => 'background-color: white; color:black;',
- 'diff-otitle' => 'background-color: white; color:black;',
- 'diff-ntitle' => 'background-color: white; color:black;',
- 'diff-addedline' => 'background: #cfc; color:black; font-size: smaller;',
- 'diff-deletedline' => 'background: #ffa; color:black; font-size: smaller;',
- 'diff-context' => 'background: #eee; color:black; font-size: smaller;',
- 'diffchange' => 'color: red; font-weight: bold; text-decoration: none;',
+ 'diff-otitle' => 'background-color: white; color:black; text-align: center;',
+ 'diff-ntitle' => 'background-color: white; color:black; text-align: center;',
+ 'diff-addedline' => 'color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;',
+ 'diff-deletedline' => 'color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;',
+ 'diff-context' => 'background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;',
+ 'diffchange' => 'font-weight: bold; text-decoration: none;',
);
foreach( $styles as $class => $style ) {
diff --git a/includes/FileDeleteForm.php b/includes/FileDeleteForm.php
index e75ad729..28403cca 100644
--- a/includes/FileDeleteForm.php
+++ b/includes/FileDeleteForm.php
@@ -80,13 +80,13 @@ class FileDeleteForm {
$this->oldimage = $wgRequest->getText( 'oldimage', false );
$token = $wgRequest->getText( 'wpEditToken' );
# Flag to hide all contents of the archived revisions
- $suppress = $wgRequest->getVal( 'wpSuppress' ) && $wgUser->isAllowed('suppressrevision');
+ $suppress = $wgRequest->getVal( 'wpSuppress' ) && $wgUser->isAllowed( 'suppressrevision' );
if( $this->oldimage ) {
$this->oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $this->title, $this->oldimage );
}
- if( !self::haveDeletableFile($this->file, $this->oldfile, $this->oldimage) ) {
+ if( !self::haveDeletableFile( $this->file, $this->oldfile, $this->oldimage ) ) {
$wgOut->addHTML( $this->prepareMessage( 'filedelete-nofile' ) );
$wgOut->addReturnTo( $this->title );
return;
@@ -140,10 +140,11 @@ class FileDeleteForm {
*
* @param $title Title object
* @param File $file: file object
- * @param $oldimage String: archive name
- * @param $reason String: reason of the deletion
+ * @param string $oldimage archive name
+ * @param string $reason reason of the deletion
* @param $suppress Boolean: whether to mark all deleted versions as restricted
* @param $user User object performing the request
+ * @throws MWException
* @return bool|Status
*/
public static function doDelete( &$title, &$file, &$oldimage, $reason, $suppress, User $user = null ) {
@@ -308,7 +309,7 @@ class FileDeleteForm {
* showing an appropriate message depending upon whether
* it's a current file or an old version
*
- * @param $message String: message base
+ * @param string $message message base
* @return String
*/
private function prepareMessage( $message ) {
@@ -343,7 +344,7 @@ class FileDeleteForm {
*
* @return bool
*/
- public static function isValidOldSpec($oldimage) {
+ public static function isValidOldSpec( $oldimage ) {
return strlen( $oldimage ) >= 16
&& strpos( $oldimage, '/' ) === false
&& strpos( $oldimage, '\\' ) === false;
@@ -359,7 +360,7 @@ class FileDeleteForm {
* @param $oldimage File
* @return bool
*/
- public static function haveDeletableFile(&$file, &$oldfile, $oldimage) {
+ public static function haveDeletableFile( &$file, &$oldfile, $oldimage ) {
return $oldimage
? $oldfile && $oldfile->exists() && $oldfile->isLocal()
: $file && $file->exists() && $file->isLocal();
@@ -374,8 +375,9 @@ class FileDeleteForm {
$q = array();
$q['action'] = 'delete';
- if( $this->oldimage )
+ if( $this->oldimage ) {
$q['oldimage'] = $this->oldimage;
+ }
return $this->title->getLocalUrl( $q );
}
diff --git a/includes/ForkController.php b/includes/ForkController.php
index 448bc03b..89ad9553 100644
--- a/includes/ForkController.php
+++ b/includes/ForkController.php
@@ -53,7 +53,7 @@ class ForkController {
const RESTART_ON_ERROR = 1;
public function __construct( $numProcs, $flags = 0 ) {
- if ( php_sapi_name() != 'cli' ) {
+ if ( PHP_SAPI != 'cli' ) {
throw new MWException( "ForkController cannot be used from the web." );
}
$this->procsToStart = $numProcs;
@@ -140,7 +140,7 @@ class ForkController {
// Don't share DB, storage, or memcached connections
wfGetLBFactory()->destroyInstance();
FileBackendGroup::destroySingleton();
- LockManagerGroup::destroySingleton();
+ LockManagerGroup::destroySingletons();
ObjectCache::clear();
$wgMemc = null;
}
diff --git a/includes/FormOptions.php b/includes/FormOptions.php
index 33bbd86a..8477ed98 100644
--- a/includes/FormOptions.php
+++ b/includes/FormOptions.php
@@ -2,7 +2,7 @@
/**
* Helper class to keep track of options when mixing links and form elements.
*
- * Copyright © 2008, Niklas Laxstiröm
+ * Copyright © 2008, Niklas Laxström
* Copyright © 2011, Antoine Musso
*
* This program is free software; you can redistribute it and/or modify
@@ -22,7 +22,7 @@
*
* @file
* @author Niklas Laxström
- * @author Antoine Musso
+ * @author Antoine Musso
*/
/**
@@ -83,6 +83,7 @@ class FormOptions implements ArrayAccess {
* which will be assumed as INT if the data is an integer.
*
* @param $data Mixed: value to guess type for
+ * @throws MWException
* @exception MWException Unsupported datatype
* @return int Type constant
*/
@@ -103,8 +104,9 @@ class FormOptions implements ArrayAccess {
/**
* Verify the given option name exist.
*
- * @param $name String: option name
+ * @param string $name option name
* @param $strict Boolean: throw an exception when the option does not exist (default false)
+ * @throws MWException
* @return Boolean: true if option exist, false otherwise
*/
public function validateName( $name, $strict = false ) {
@@ -121,7 +123,7 @@ class FormOptions implements ArrayAccess {
/**
* Use to set the value of an option.
*
- * @param $name String: option name
+ * @param string $name option name
* @param $value Mixed: value for the option
* @param $force Boolean: whether to set the value when it is equivalent to the default value for this option (default false).
* @return null
@@ -141,7 +143,7 @@ class FormOptions implements ArrayAccess {
* Get the value for the given option name.
* Internally use getValueReal()
*
- * @param $name String: option name
+ * @param string $name option name
* @return Mixed
*/
public function getValue( $name ) {
@@ -152,7 +154,7 @@ class FormOptions implements ArrayAccess {
/**
* @todo Document
- * @param $option Array: array structure describing the option
+ * @param array $option array structure describing the option
* @return Mixed. Value or the default value if it is null
*/
protected function getValueReal( $option ) {
@@ -166,7 +168,7 @@ class FormOptions implements ArrayAccess {
/**
* Delete the option value.
* This will make future calls to getValue() return the default value.
- * @param $name String: option name
+ * @param string $name option name
* @return null
*/
public function reset( $name ) {
@@ -176,8 +178,9 @@ class FormOptions implements ArrayAccess {
/**
* @todo Document
- * @param $name String: option name
- * @return null
+ * @param string $name Option name
+ * @throws MWException If option does not exist.
+ * @return mixed Value or the default value if it is null.
*/
public function consumeValue( $name ) {
$this->validateName( $name, true );
@@ -188,7 +191,7 @@ class FormOptions implements ArrayAccess {
/**
* @todo Document
- * @param $names Array: array of option names
+ * @param array $names array of option names
* @return null
*/
public function consumeValues( /*Array*/ $names ) {
@@ -205,11 +208,12 @@ class FormOptions implements ArrayAccess {
/**
* Validate and set an option integer value
- * The value will be altered to fit in the range.
+ * The value will be altered to fit in the range.
*
- * @param $name String: option name
- * @param $min Int: minimum value
- * @param $max Int: maximum value
+ * @param string $name option name
+ * @param int $min minimum value
+ * @param int $max maximum value
+ * @throws MWException
* @exception MWException Option is not of type int
* @return null
*/
diff --git a/includes/GitInfo.php b/includes/GitInfo.php
index c3c30733..6f7f8020 100644
--- a/includes/GitInfo.php
+++ b/includes/GitInfo.php
@@ -41,10 +41,18 @@ class GitInfo {
private static $viewers = false;
/**
- * @param $dir string The root directory of the repo where the .git dir can be found
+ * @param string $dir The root directory of the repo where the .git dir can be found
*/
public function __construct( $dir ) {
- $this->basedir = "{$dir}/.git/";
+ $this->basedir = "{$dir}/.git";
+ if ( is_readable( $this->basedir ) && !is_dir( $this->basedir ) ) {
+ $GITfile = file_get_contents( $this->basedir );
+ if ( strlen( $GITfile ) > 8 && substr( $GITfile, 0, 8 ) === 'gitdir: ' ) {
+ $path = rtrim( substr( $GITfile, 8 ), "\r\n" );
+ $isAbsolute = $path[0] === '/' || substr( $path, 1, 1 ) === ':';
+ $this->basedir = $isAbsolute ? $path : "{$dir}/{$path}";
+ }
+ }
}
/**
@@ -62,7 +70,7 @@ class GitInfo {
/**
* Check if a string looks like a hex encoded SHA1 hash
*
- * @param $str string The string to check
+ * @param string $str The string to check
* @return bool Whether or not the string looks like a SHA1
*/
public static function isSHA1( $str ) {
@@ -102,7 +110,7 @@ class GitInfo {
}
// If not a SHA1 it may be a ref:
- $REFfile = "{$this->basedir}{$HEAD}";
+ $REFfile = "{$this->basedir}/{$HEAD}";
if ( !is_readable( $REFfile ) ) {
return false;
}
diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php
index 50758c89..016736f4 100644
--- a/includes/GlobalFunctions.php
+++ b/includes/GlobalFunctions.php
@@ -50,7 +50,7 @@ if ( !function_exists( 'mb_substr' ) ) {
* @codeCoverageIgnore
* @return string
*/
- function mb_substr( $str, $start, $count='end' ) {
+ function mb_substr( $str, $start, $count = 'end' ) {
return Fallback::mb_substr( $str, $start, $count );
}
@@ -94,7 +94,6 @@ if( !function_exists( 'mb_strrpos' ) ) {
}
}
-
// Support for Wietse Venema's taint feature
if ( !function_exists( 'istainted' ) ) {
/**
@@ -168,7 +167,8 @@ function wfArrayLookup( $a, $b ) {
* @param $key String|Int
* @param $value Mixed
* @param $default Mixed
- * @param $changed Array to alter
+ * @param array $changed to alter
+ * @throws MWException
*/
function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) {
if ( is_null( $changed ) ) {
@@ -232,8 +232,8 @@ function wfMergeErrorArrays( /*...*/ ) {
/**
* Insert array into another array after the specified *KEY*
*
- * @param $array Array: The array.
- * @param $insert Array: The array to insert.
+ * @param array $array The array.
+ * @param array $insert The array to insert.
* @param $after Mixed: The key to insert after
* @return Array
*/
@@ -311,12 +311,12 @@ function wfRandom() {
}
/**
- * Get a random string containing a number of pesudo-random hex
+ * Get a random string containing a number of pseudo-random hex
* characters.
* @note This is not secure, if you are trying to generate some sort
* of token please use MWCryptRand instead.
*
- * @param $length int The length of the string to generate
+ * @param int $length The length of the string to generate
* @return String
* @since 1.20
*/
@@ -349,7 +349,7 @@ function wfRandomString( $length = 32 ) {
*
* @param $s String:
* @return string
-*/
+ */
function wfUrlencode( $s ) {
static $needle;
if ( is_null( $s ) ) {
@@ -379,8 +379,8 @@ function wfUrlencode( $s ) {
* "days=7&limit=100". Options in the first array override options in the second.
* Options set to null or false will not be output.
*
- * @param $array1 Array ( String|Array )
- * @param $array2 Array ( String|Array )
+ * @param array $array1 ( String|Array )
+ * @param array $array2 ( String|Array )
* @param $prefix String
* @return String
*/
@@ -391,7 +391,7 @@ function wfArrayToCgi( $array1, $array2 = null, $prefix = '' ) {
$cgi = '';
foreach ( $array1 as $key => $value ) {
- if ( !is_null($value) && $value !== false ) {
+ if ( !is_null( $value ) && $value !== false ) {
if ( $cgi != '' ) {
$cgi .= '&';
}
@@ -422,11 +422,11 @@ function wfArrayToCgi( $array1, $array2 = null, $prefix = '' ) {
/**
* This is the logical opposite of wfArrayToCgi(): it accepts a query string as
- * its argument and returns the same string in array form. This allows compa-
- * tibility with legacy functions that accept raw query strings instead of nice
+ * its argument and returns the same string in array form. This allows compatibility
+ * with legacy functions that accept raw query strings instead of nice
* arrays. Of course, keys and values are urldecode()d.
*
- * @param $query String: query string
+ * @param string $query query string
* @return array Array version of input
*/
function wfCgiToArray( $query ) {
@@ -506,7 +506,7 @@ function wfAppendQuery( $url, $query ) {
* @todo this won't work with current-path-relative URLs
* like "subdir/foo.html", etc.
*
- * @param $url String: either fully-qualified or a local path + query
+ * @param string $url either fully-qualified or a local path + query
* @param $defaultProto Mixed: one of the PROTO_* constants. Determines the
* protocol to use if $url or $wgServer is
* protocol-relative
@@ -576,7 +576,7 @@ function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
* @todo Need to integrate this into wfExpandUrl (bug 32168)
*
* @since 1.19
- * @param $urlParts Array URL parts, as output from wfParseUrl
+ * @param array $urlParts URL parts, as output from wfParseUrl
* @return string URL assembled from its component parts
*/
function wfAssembleUrl( $urlParts ) {
@@ -628,7 +628,7 @@ function wfAssembleUrl( $urlParts ) {
*
* @todo Need to integrate this into wfExpandUrl (bug 32168)
*
- * @param $urlPath String URL path, potentially containing dot-segments
+ * @param string $urlPath URL path, potentially containing dot-segments
* @return string URL path with all dot-segments removed
*/
function wfRemoveDotSegments( $urlPath ) {
@@ -705,7 +705,7 @@ function wfRemoveDotSegments( $urlPath ) {
/**
* Returns a regular expression of url protocols
*
- * @param $includeProtocolRelative bool If false, remove '//' from the returned protocol list.
+ * @param bool $includeProtocolRelative If false, remove '//' from the returned protocol list.
* DO NOT USE this directly, use wfUrlProtocolsWithoutProtRel() instead
* @return String
*/
@@ -765,7 +765,7 @@ function wfUrlProtocolsWithoutProtRel() {
* 2) Handles protocols that don't use :// (e.g., mailto: and news: , as well as protocol-relative URLs) correctly
* 3) Adds a "delimiter" element to the array, either '://', ':' or '//' (see (2))
*
- * @param $url String: a URL to parse
+ * @param string $url a URL to parse
* @return Array: bits of the URL in an associative array, per PHP docs
*/
function wfParseUrl( $url ) {
@@ -808,9 +808,14 @@ function wfParseUrl( $url ) {
if ( !isset( $bits['host'] ) ) {
$bits['host'] = '';
- /* parse_url loses the third / for file:///c:/ urls (but not on variants) */
- if ( substr( $bits['path'], 0, 1 ) !== '/' ) {
- $bits['path'] = '/' . $bits['path'];
+ // bug 45069
+ if ( isset( $bits['path'] ) ) {
+ /* parse_url loses the third / for file:///c:/ urls (but not on variants) */
+ if ( substr( $bits['path'], 0, 1 ) !== '/' ) {
+ $bits['path'] = '/' . $bits['path'];
+ }
+ } else {
+ $bits['path'] = '';
}
}
@@ -845,8 +850,6 @@ function wfExpandIRI_callback( $matches ) {
return urldecode( $matches[1] );
}
-
-
/**
* Make URL indexes, appropriate for the el_index field of externallinks.
*
@@ -903,8 +906,8 @@ function wfMakeUrlIndexes( $url ) {
/**
* Check whether a given URL has a domain that occurs in a given set of domains
- * @param $url string URL
- * @param $domains array Array of domains (strings)
+ * @param string $url URL
+ * @param array $domains Array of domains (strings)
* @return bool True if the host part of $url ends in one of the strings in $domains
*/
function wfMatchesDomainList( $url, $domains ) {
@@ -932,7 +935,7 @@ function wfMatchesDomainList( $url, $domains ) {
* $wgDebugComments - if on, some debug items may appear in comments in the HTML output.
*
* @param $text String
- * @param $logonly Bool: set true to avoid appearing in HTML when $wgDebugComments is set
+ * @param bool $logonly set true to avoid appearing in HTML when $wgDebugComments is set
*/
function wfDebug( $text, $logonly = false ) {
global $wgDebugLogFile, $wgProfileOnly, $wgDebugRawPage, $wgDebugLogPrefix;
@@ -1004,7 +1007,7 @@ function wfDebugTimer() {
/**
* Send a line giving PHP memory usage.
*
- * @param $exact Bool: print exact values instead of kilobytes (default: false)
+ * @param bool $exact print exact values instead of kilobytes (default: false)
*/
function wfDebugMem( $exact = false ) {
$mem = memory_get_usage();
@@ -1022,7 +1025,7 @@ function wfDebugMem( $exact = false ) {
*
* @param $logGroup String
* @param $text String
- * @param $public Bool: whether to log the event in the public log if no private
+ * @param bool $public whether to log the event in the public log if no private
* log file is specified, (default true)
*/
function wfDebugLog( $logGroup, $text, $public = true ) {
@@ -1036,14 +1039,14 @@ function wfDebugLog( $logGroup, $text, $public = true ) {
wfErrorLog( "$time $host $wiki: $text", $wgDebugLogGroups[$logGroup] );
}
} elseif ( $public === true ) {
- wfDebug( $text, true );
+ wfDebug( "[$logGroup] $text", true );
}
}
/**
* Log for database errors
*
- * @param $text String: database error message.
+ * @param string $text database error message.
*/
function wfLogDBError( $text ) {
global $wgDBerrorLog, $wgDBerrorLogTZ;
@@ -1076,9 +1079,9 @@ function wfLogDBError( $text ) {
* Throws a warning that $function is deprecated
*
* @param $function String
- * @param $version String|bool: Version of MediaWiki that the function was deprecated in (Added in 1.19).
- * @param $component String|bool: Added in 1.19.
- * @param $callerOffset integer: How far up the callstack is the original
+ * @param string|bool $version Version of MediaWiki that the function was deprecated in (Added in 1.19).
+ * @param string|bool $component Added in 1.19.
+ * @param $callerOffset integer: How far up the call stack is the original
* caller. 2 = function that called the function that called
* wfDeprecated (Added in 1.20)
*
@@ -1092,7 +1095,7 @@ function wfDeprecated( $function, $version = false, $component = false, $callerO
* Send a warning either to the debug log or in a PHP error depending on
* $wgDevelopmentWarnings
*
- * @param $msg String: message to send
+ * @param string $msg message to send
* @param $callerOffset Integer: number of items to go back in the backtrace to
* find the correct caller (1 = function calling wfWarn, ...)
* @param $level Integer: PHP error level; only used when $wgDevelopmentWarnings
@@ -1109,7 +1112,8 @@ function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
* send lines to the specified port, prefixed by the specified prefix and a space.
*
* @param $text String
- * @param $file String filename
+ * @param string $file filename
+ * @throws MWException
*/
function wfErrorLog( $text, $file ) {
if ( substr( $file, 0, 4 ) == 'udp:' ) {
@@ -1212,9 +1216,18 @@ function wfLogProfilingData() {
if ( $wgUser->isItemLoaded( 'id' ) && $wgUser->isAnon() ) {
$forward .= ' anon';
}
+
+ // Command line script uses a FauxRequest object which does not have
+ // any knowledge about an URL and throw an exception instead.
+ try {
+ $requestUrl = $wgRequest->getRequestURL();
+ } catch ( MWException $e ) {
+ $requestUrl = 'n/a';
+ }
+
$log = sprintf( "%s\t%04.3f\t%s\n",
gmdate( 'YmdHis' ), $elapsed,
- urldecode( $wgRequest->getRequestURL() . $forward ) );
+ urldecode( $requestUrl . $forward ) );
wfErrorLog( $log . $profiler->getOutput(), $wgDebugLogFile );
}
@@ -1224,17 +1237,21 @@ function wfLogProfilingData() {
*
* @param $key String
* @param $count Int
+ * @return void
*/
function wfIncrStats( $key, $count = 1 ) {
global $wgStatsMethod;
$count = intval( $count );
+ if ( $count == 0 ) {
+ return;
+ }
if( $wgStatsMethod == 'udp' ) {
- global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgDBname, $wgAggregateStatsID;
+ global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID;
static $socket;
- $id = $wgAggregateStatsID !== false ? $wgAggregateStatsID : $wgDBname;
+ $id = $wgAggregateStatsID !== false ? $wgAggregateStatsID : wfWikiID();
if ( !$socket ) {
$socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
@@ -1366,9 +1383,13 @@ function wfUILang() {
}
/**
- * This is the new function for getting translated interface messages.
- * See the Message class for documentation how to use them.
- * The intention is that this function replaces all old wfMsg* functions.
+ * This is the function for getting translated interface messages.
+ *
+ * @see Message class for documentation how to use them.
+ * @see https://www.mediawiki.org/wiki/Manual:Messages_API
+ *
+ * This function replaces all old wfMsg* functions.
+ *
* @param $key \string Message key.
* Varargs: normal message parameters.
* @return Message
@@ -1404,7 +1425,7 @@ function wfMessageFallback( /*...*/ ) {
*
* @deprecated since 1.18
*
- * @param $key String: lookup key for the message, usually
+ * @param string $key lookup key for the message, usually
* defined in languages/Language.php
*
* Parameters to the message, which can be used to insert variable text into
@@ -1416,6 +1437,8 @@ function wfMessageFallback( /*...*/ ) {
* @return String
*/
function wfMsg( $key ) {
+ wfDeprecated( __METHOD__, '1.21' );
+
$args = func_get_args();
array_shift( $args );
return wfMsgReal( $key, $args );
@@ -1430,6 +1453,8 @@ function wfMsg( $key ) {
* @return String
*/
function wfMsgNoTrans( $key ) {
+ wfDeprecated( __METHOD__, '1.21' );
+
$args = func_get_args();
array_shift( $args );
return wfMsgReal( $key, $args, true, false, false );
@@ -1456,11 +1481,13 @@ function wfMsgNoTrans( $key ) {
*
* @deprecated since 1.18
*
- * @param $key String: lookup key for the message, usually
+ * @param string $key lookup key for the message, usually
* defined in languages/Language.php
* @return String
*/
function wfMsgForContent( $key ) {
+ wfDeprecated( __METHOD__, '1.21' );
+
global $wgForceUIMsgAsContentMsg;
$args = func_get_args();
array_shift( $args );
@@ -1482,6 +1509,8 @@ function wfMsgForContent( $key ) {
* @return String
*/
function wfMsgForContentNoTrans( $key ) {
+ wfDeprecated( __METHOD__, '1.21' );
+
global $wgForceUIMsgAsContentMsg;
$args = func_get_args();
array_shift( $args );
@@ -1499,7 +1528,7 @@ function wfMsgForContentNoTrans( $key ) {
*
* @deprecated since 1.18
*
- * @param $key String: key to get.
+ * @param string $key key to get.
* @param $args
* @param $useDB Boolean
* @param $forContent Mixed: Language code, or false for user lang, true for content lang.
@@ -1507,6 +1536,8 @@ function wfMsgForContentNoTrans( $key ) {
* @return String: the requested message.
*/
function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform = true ) {
+ wfDeprecated( __METHOD__, '1.21' );
+
wfProfileIn( __METHOD__ );
$message = wfMsgGetKey( $key, $useDB, $forContent, $transform );
$message = wfMsgReplaceArgs( $message, $args );
@@ -1521,12 +1552,14 @@ function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform
*
* @param $key String
* @param $useDB Bool
- * @param $langCode String: Code of the language to get the message for, or
+ * @param string $langCode Code of the language to get the message for, or
* behaves as a content language switch if it is a boolean.
* @param $transform Boolean: whether to parse magic words, etc.
* @return string
*/
function wfMsgGetKey( $key, $useDB = true, $langCode = false, $transform = true ) {
+ wfDeprecated( __METHOD__, '1.21' );
+
wfRunHooks( 'NormalizeMessageKey', array( &$key, &$useDB, &$langCode, &$transform ) );
$cache = MessageCache::singleton();
@@ -1581,6 +1614,8 @@ function wfMsgReplaceArgs( $message, $args ) {
* @return string
*/
function wfMsgHtml( $key ) {
+ wfDeprecated( __METHOD__, '1.21' );
+
$args = func_get_args();
array_shift( $args );
return wfMsgReplaceArgs( htmlspecialchars( wfMsgGetKey( $key ) ), $args );
@@ -1600,6 +1635,8 @@ function wfMsgHtml( $key ) {
* @return string
*/
function wfMsgWikiHtml( $key ) {
+ wfDeprecated( __METHOD__, '1.21' );
+
$args = func_get_args();
array_shift( $args );
return wfMsgReplaceArgs(
@@ -1613,8 +1650,8 @@ function wfMsgWikiHtml( $key ) {
*
* @deprecated since 1.18
*
- * @param $key String: key of the message
- * @param $options Array: processing rules. Can take the following options:
+ * @param string $key key of the message
+ * @param array $options processing rules. Can take the following options:
* <i>parse</i>: parses wikitext to HTML
* <i>parseinline</i>: parses wikitext to HTML and removes the surrounding
* p's added by parser or tidy
@@ -1625,12 +1662,14 @@ function wfMsgWikiHtml( $key ) {
* <i>content</i>: fetch message for content language instead of interface
* Also can accept a single associative argument, of the form 'language' => 'xx':
* <i>language</i>: Language object or language code to fetch message for
- * (overriden by <i>content</i>).
+ * (overridden by <i>content</i>).
* Behavior for conflicting options (e.g., parse+parseinline) is undefined.
*
* @return String
*/
function wfMsgExt( $key, $options ) {
+ wfDeprecated( __METHOD__, '1.21' );
+
$args = func_get_args();
array_shift( $args );
array_shift( $args );
@@ -1703,7 +1742,7 @@ function wfMsgExt( $key, $options ) {
/**
* Since wfMsg() and co suck, they don't return false if the message key they
* looked up didn't exist but a XHTML string, this function checks for the
- * nonexistance of messages by checking the MessageCache::get() result directly.
+ * nonexistence of messages by checking the MessageCache::get() result directly.
*
* @deprecated since 1.18. Use Message::isDisabled().
*
@@ -1711,6 +1750,8 @@ function wfMsgExt( $key, $options ) {
* @return Boolean True if the message *doesn't* exist.
*/
function wfEmptyMsg( $key ) {
+ wfDeprecated( __METHOD__, '1.21' );
+
return MessageCache::singleton()->get( $key, /*useDB*/true, /*content*/false ) === false;
}
@@ -1718,7 +1759,8 @@ function wfEmptyMsg( $key ) {
* Throw a debugging exception. This function previously once exited the process,
* but now throws an exception instead, with similar results.
*
- * @param $msg String: message shown when dying.
+ * @param string $msg message shown when dying.
+ * @throws MWException
*/
function wfDebugDieBacktrace( $msg = '' ) {
throw new MWException( $msg );
@@ -1783,13 +1825,13 @@ function wfReportTime() {
*
* With Zend Optimizer 3.2.0 loaded, this causes segfaults under somewhat
* murky circumstances, which may be triggered in part by stub objects
- * or other fancy talkin'.
+ * or other fancy talking'.
*
* Will return an empty array if Zend Optimizer is detected or if
* debug_backtrace is disabled, otherwise the output from
* debug_backtrace() (trimmed).
*
- * @param $limit int This parameter can be used to limit the number of stack frames returned
+ * @param int $limit This parameter can be used to limit the number of stack frames returned
*
* @return array of backtrace information
*/
@@ -1895,7 +1937,7 @@ function wfGetCaller( $level = 2 ) {
* Return a string consisting of callers in the stack. Useful sometimes
* for profiling specific points.
*
- * @param $limit int The maximum depth of the stack frame to return, or false for
+ * @param int $limit The maximum depth of the stack frame to return, or false for
* the entire stack.
* @return String
*/
@@ -1920,10 +1962,8 @@ function wfFormatStackFrame( $frame ) {
$frame['function'];
}
-
/* Some generic result counters, pulled out of SearchEngine */
-
/**
* @todo document
*
@@ -1941,8 +1981,8 @@ function wfShowingResults( $offset, $limit ) {
* @param $offset String
* @param $limit Integer
* @param $link String
- * @param $query String: optional URL query parameter string
- * @param $atend Bool: optional param for specified if this is the last page
+ * @param string $query optional URL query parameter string
+ * @param bool $atend optional param for specified if this is the last page
* @return String
* @deprecated in 1.19; use Language::viewPrevNext() instead
*/
@@ -1968,8 +2008,8 @@ function wfViewPrevNext( $offset, $limit, $link, $query = '', $atend = false ) {
/**
* Make a list item, used by various special pages
*
- * @param $page String Page link
- * @param $details String Text between brackets
+ * @param string $page Page link
+ * @param string $details Text between brackets
* @param $oppositedm Boolean Add the direction mark opposite to your
* language, to display text properly
* @return String
@@ -2018,8 +2058,8 @@ function wfClientAcceptsGzip( $force = false ) {
* Obtain the offset and limit values from the request string;
* used in special pages
*
- * @param $deflimit Int default limit if none supplied
- * @param $optionname String Name of a user preference to check against
+ * @param int $deflimit default limit if none supplied
+ * @param string $optionname Name of a user preference to check against
* @return array
*
*/
@@ -2034,7 +2074,7 @@ function wfCheckLimits( $deflimit = 50, $optionname = 'rclimit' ) {
* is achieved by substituting certain characters with HTML entities.
* As required by the callers, "<nowiki>" is not used.
*
- * @param $text String: text to be escaped
+ * @param string $text text to be escaped
* @return String
*/
function wfEscapeWikiText( $text ) {
@@ -2050,7 +2090,7 @@ function wfEscapeWikiText( $text ) {
}
/**
- * Get the current unix timetstamp with microseconds. Useful for profiling
+ * Get the current unix timestamp with microseconds. Useful for profiling
* @return Float
*/
function wfTime() {
@@ -2207,7 +2247,7 @@ function wfClearOutputBuffers() {
* factors
*
* @param $accept String
- * @param $def String default
+ * @param string $def default
* @return Array
*/
function wfAcceptToPrefs( $accept, $def = '*/*' ) {
@@ -2267,8 +2307,8 @@ function mimeTypeMatch( $type, $avail ) {
* array of type to preference (preference is a float between 0.0 and 1.0).
* Wildcards in the types are acceptable.
*
- * @param $cprefs Array: client's acceptable type list
- * @param $sprefs Array: server's offered types
+ * @param array $cprefs client's acceptable type list
+ * @param array $sprefs server's offered types
* @return string
*
* @todo FIXME: Doesn't handle params like 'text/plain; charset=UTF-8'
@@ -2390,11 +2430,6 @@ define( 'TS_ORACLE', 6 );
define( 'TS_POSTGRES', 7 );
/**
- * DB2 format time
- */
-define( 'TS_DB2', 8 );
-
-/**
* ISO 8601 basic format with no timezone: 19860209T200000Z. This is used by ResourceLoader
*/
define( 'TS_ISO_8601_BASIC', 9 );
@@ -2405,7 +2440,7 @@ define( 'TS_ISO_8601_BASIC', 9 );
* @param $outputtype Mixed: A timestamp in one of the supported formats, the
* function will autodetect which format is supplied and act
* accordingly.
- * @param $ts Mixed: the timestamp to convert or 0 for the current timestamp
+ * @param $ts Mixed: optional timestamp to convert, default 0 for the current time
* @return Mixed: String / false The same date in the format specified in $outputtype or false
*/
function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
@@ -2413,7 +2448,7 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
$timestamp = new MWTimestamp( $ts );
return $timestamp->getTimestamp( $outputtype );
} catch( TimestampException $e ) {
- wfDebug("wfTimestamp() fed bogus time value: TYPE=$outputtype; VALUE=$ts\n");
+ wfDebug( "wfTimestamp() fed bogus time value: TYPE=$outputtype; VALUE=$ts\n" );
return false;
}
}
@@ -2509,9 +2544,10 @@ function wfTempDir() {
/**
* Make directory, and make all parent directories if they don't exist
*
- * @param $dir String: full path to directory to create
+ * @param string $dir full path to directory to create
* @param $mode Integer: chmod value to use, default is $wgDirectoryMode
- * @param $caller String: optional caller param for debugging.
+ * @param string $caller optional caller param for debugging.
+ * @throws MWException
* @return bool
*/
function wfMkdirParents( $dir, $mode = null, $caller = null ) {
@@ -2585,12 +2621,14 @@ function wfPercent( $nr, $acc = 2, $round = true ) {
/**
* Find out whether or not a mixed variable exists in a string
*
+ * @deprecated Just use str(i)pos
* @param $needle String
* @param $str String
* @param $insensitive Boolean
* @return Boolean
*/
function in_string( $needle, $str, $insensitive = false ) {
+ wfDeprecated( __METHOD__, '1.21' );
$func = 'strpos';
if( $insensitive ) $func = 'stripos';
@@ -2633,9 +2671,9 @@ function wfIniGetBool( $setting ) {
* Wrapper function for PHP's dl(). This doesn't work in most situations from
* PHP 5.3 onward, and is usually disabled in shared environments anyway.
*
- * @param $extension String A PHP extension. The file suffix (.so or .dll)
+ * @param string $extension A PHP extension. The file suffix (.so or .dll)
* should be omitted
- * @param $fileName String Name of the library, if not $extension.suffix
+ * @param string $fileName Name of the library, if not $extension.suffix
* @return Bool - Whether or not the extension is loaded
*/
function wfDl( $extension, $fileName = null ) {
@@ -2644,8 +2682,7 @@ function wfDl( $extension, $fileName = null ) {
}
$canDl = false;
- $sapi = php_sapi_name();
- if( $sapi == 'cli' || $sapi == 'cgi' || $sapi == 'embed' ) {
+ if( PHP_SAPI == 'cli' || PHP_SAPI == 'cgi' || PHP_SAPI == 'embed' ) {
$canDl = ( function_exists( 'dl' ) && is_callable( 'dl' )
&& wfIniGetBool( 'enable_dl' ) && !wfIniGetBool( 'safe_mode' ) );
}
@@ -2673,7 +2710,7 @@ function wfDl( $extension, $fileName = null ) {
* @param varargs
* @return String
*/
-function wfEscapeShellArg( ) {
+function wfEscapeShellArg() {
wfInitShellLocale();
$args = func_get_args();
@@ -2729,17 +2766,18 @@ function wfEscapeShellArg( ) {
/**
* Execute a shell command, with time and memory limits mirrored from the PHP
* configuration if supported.
- * @param $cmd String Command line, properly escaped for shell.
+ * @param string $cmd Command line, properly escaped for shell.
* @param &$retval null|Mixed optional, will receive the program's exit code.
* (non-zero is usually failure)
- * @param $environ Array optional environment variables which should be
+ * @param array $environ optional environment variables which should be
* added to the executed command environment.
- * @param $limits Array optional array with limits(filesize, memory, time)
+ * @param array $limits optional array with limits(filesize, memory, time, walltime)
* this overwrites the global wgShellMax* limits.
* @return string collected stdout as a string (trailing newlines stripped)
*/
function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array() ) {
- global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime;
+ global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime,
+ $wgMaxShellWallClockTime, $wgShellCgroup;
static $disabled;
if ( is_null( $disabled ) ) {
@@ -2786,15 +2824,27 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
$cmd = $envcmd . $cmd;
if ( php_uname( 's' ) == 'Linux' ) {
- $time = intval ( isset($limits['time']) ? $limits['time'] : $wgMaxShellTime );
- $mem = intval ( isset($limits['memory']) ? $limits['memory'] : $wgMaxShellMemory );
- $filesize = intval ( isset($limits['filesize']) ? $limits['filesize'] : $wgMaxShellFileSize );
-
- if ( $time > 0 && $mem > 0 ) {
- $script = "$IP/bin/ulimit4.sh";
- if ( is_executable( $script ) ) {
- $cmd = '/bin/bash ' . escapeshellarg( $script ) . " $time $mem $filesize " . escapeshellarg( $cmd );
- }
+ $time = intval ( isset( $limits['time'] ) ? $limits['time'] : $wgMaxShellTime );
+ if ( isset( $limits['walltime'] ) ) {
+ $wallTime = intval( $limits['walltime'] );
+ } elseif ( isset( $limits['time'] ) ) {
+ $wallTime = $time;
+ } else {
+ $wallTime = intval( $wgMaxShellWallClockTime );
+ }
+ $mem = intval ( isset( $limits['memory'] ) ? $limits['memory'] : $wgMaxShellMemory );
+ $filesize = intval ( isset( $limits['filesize'] ) ? $limits['filesize'] : $wgMaxShellFileSize );
+
+ if ( $time > 0 || $mem > 0 || $filesize > 0 || $wallTime > 0 ) {
+ $cmd = '/bin/bash ' . escapeshellarg( "$IP/includes/limit.sh" ) . ' ' .
+ escapeshellarg( $cmd ) . ' ' .
+ escapeshellarg(
+ "MW_CPU_LIMIT=$time; " .
+ 'MW_CGROUP=' . escapeshellarg( $wgShellCgroup ) . '; ' .
+ "MW_MEM_LIMIT=$mem; " .
+ "MW_FILE_SIZE_LIMIT=$filesize; " .
+ "MW_WALL_CLOCK_LIMIT=$wallTime"
+ );
}
}
wfDebug( "wfShellExec: $cmd\n" );
@@ -2840,9 +2890,9 @@ function wfShellMaintenanceCmd( $script, array $parameters = array(), array $opt
* Generate a shell-escaped command line string to run a MediaWiki cli script.
* Note that $parameters should be a flat array and an option with an argument
* should consist of two consecutive items in the array (do not use "--option value").
- * @param $script string MediaWiki cli script path
- * @param $parameters Array Arguments and options to the script
- * @param $options Array Associative array of options:
+ * @param string $script MediaWiki cli script path
+ * @param array $parameters Arguments and options to the script
+ * @param array $options Associative array of options:
* 'php': The path to the php executable
* 'wrapper': Path to a PHP wrapper to handle the maintenance script
* @return Array
@@ -2891,15 +2941,19 @@ function wfMerge( $old, $mine, $yours, &$result ) {
$mytextFile = fopen( $mytextName = tempnam( $td, 'merge-mine-' ), 'w' );
$yourtextFile = fopen( $yourtextName = tempnam( $td, 'merge-your-' ), 'w' );
- fwrite( $oldtextFile, $old );
+ # NOTE: diff3 issues a warning to stderr if any of the files does not end with
+ # a newline character. To avoid this, we normalize the trailing whitespace before
+ # creating the diff.
+
+ fwrite( $oldtextFile, rtrim( $old ) . "\n" );
fclose( $oldtextFile );
- fwrite( $mytextFile, $mine );
+ fwrite( $mytextFile, rtrim( $mine ) . "\n" );
fclose( $mytextFile );
- fwrite( $yourtextFile, $yours );
+ fwrite( $yourtextFile, rtrim( $yours ) . "\n" );
fclose( $yourtextFile );
# Check for a conflict
- $cmd = $wgDiff3 . ' -a --overlap-only ' .
+ $cmd = wfEscapeShellArg( $wgDiff3 ) . ' -a --overlap-only ' .
wfEscapeShellArg( $mytextName ) . ' ' .
wfEscapeShellArg( $oldtextName ) . ' ' .
wfEscapeShellArg( $yourtextName );
@@ -2913,7 +2967,7 @@ function wfMerge( $old, $mine, $yours, &$result ) {
pclose( $handle );
# Merge differences
- $cmd = $wgDiff3 . ' -a -e --merge ' .
+ $cmd = wfEscapeShellArg( $wgDiff3 ) . ' -a -e --merge ' .
wfEscapeShellArg( $mytextName, $oldtextName, $yourtextName );
$handle = popen( $cmd, 'r' );
$result = '';
@@ -2940,9 +2994,9 @@ function wfMerge( $old, $mine, $yours, &$result ) {
* Returns unified plain-text diff of two texts.
* Useful for machine processing of diffs.
*
- * @param $before String: the text before the changes.
- * @param $after String: the text after the changes.
- * @param $params String: command-line options for the diff command.
+ * @param string $before the text before the changes.
+ * @param string $after the text after the changes.
+ * @param string $params command-line options for the diff command.
* @return String: unified diff of $before and $after
*/
function wfDiff( $before, $after, $params = '-u' ) {
@@ -3022,6 +3076,7 @@ function wfDiff( $before, $after, $params = '-u' ) {
*
* @param $req_ver Mixed: the version to check, can be a string, an integer, or
* a float
+ * @throws MWException
*/
function wfUsePHP( $req_ver ) {
$php_ver = PHP_VERSION;
@@ -3043,6 +3098,7 @@ function wfUsePHP( $req_ver ) {
*
* @param $req_ver Mixed: the version to check, can be a string, an integer, or
* a float
+ * @throws MWException
*/
function wfUseMW( $req_ver ) {
global $wgVersion;
@@ -3061,7 +3117,7 @@ function wfUseMW( $req_ver ) {
* We'll consider it so always, as we don't want '\s' in our Unix paths either.
*
* @param $path String
- * @param $suffix String: to remove if present
+ * @param string $suffix to remove if present
* @return String
*/
function wfBaseName( $path, $suffix = '' ) {
@@ -3081,8 +3137,8 @@ function wfBaseName( $path, $suffix = '' ) {
* May explode on non-matching case-insensitive paths,
* funky symlinks, etc.
*
- * @param $path String: absolute destination path including target filename
- * @param $from String: Absolute source path, directory only
+ * @param string $path absolute destination path including target filename
+ * @param string $from Absolute source path, directory only
* @return String
*/
function wfRelativePath( $path, $from ) {
@@ -3140,91 +3196,105 @@ function wfDoUpdates( $commit = '' ) {
* Supports base 2 through 36; digit values 10-36 are represented
* as lowercase letters a-z. Input is case-insensitive.
*
- * @param $input String: of digits
- * @param $sourceBase Integer: 2-36
- * @param $destBase Integer: 2-36
- * @param $pad Integer: 1 or greater
- * @param $lowercase Boolean
- * @return String or false on invalid input
- */
-function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = true ) {
- $input = strval( $input );
- if( $sourceBase < 2 ||
+ * @param string $input Input number
+ * @param int $sourceBase Base of the input number
+ * @param int $destBase Desired base of the output
+ * @param int $pad Minimum number of digits in the output (pad with zeroes)
+ * @param bool $lowercase Whether to output in lowercase or uppercase
+ * @param string $engine Either "gmp", "bcmath", or "php"
+ * @return string|bool The output number as a string, or false on error
+ */
+function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = true, $engine = 'auto' ) {
+ $input = (string)$input;
+ if(
+ $sourceBase < 2 ||
$sourceBase > 36 ||
$destBase < 2 ||
$destBase > 36 ||
- $pad < 1 ||
- $sourceBase != intval( $sourceBase ) ||
- $destBase != intval( $destBase ) ||
- $pad != intval( $pad ) ||
- !is_string( $input ) ||
- $input == '' ) {
+ $sourceBase != (int) $sourceBase ||
+ $destBase != (int) $destBase ||
+ $pad != (int) $pad ||
+ !preg_match( "/^[" . substr( '0123456789abcdefghijklmnopqrstuvwxyz', 0, $sourceBase ) . "]+$/i", $input )
+ ) {
return false;
}
- $digitChars = ( $lowercase ) ? '0123456789abcdefghijklmnopqrstuvwxyz' : '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
- $inDigits = array();
- $outChars = '';
- // Decode and validate input string
- $input = strtolower( $input );
- for( $i = 0; $i < strlen( $input ); $i++ ) {
- $n = strpos( $digitChars, $input[$i] );
- if( $n === false || $n > $sourceBase ) {
- return false;
+ static $baseChars = array (
+ 10 => 'a', 11 => 'b', 12 => 'c', 13 => 'd', 14 => 'e', 15 => 'f',
+ 16 => 'g', 17 => 'h', 18 => 'i', 19 => 'j', 20 => 'k', 21 => 'l',
+ 22 => 'm', 23 => 'n', 24 => 'o', 25 => 'p', 26 => 'q', 27 => 'r',
+ 28 => 's', 29 => 't', 30 => 'u', 31 => 'v', 32 => 'w', 33 => 'x',
+ 34 => 'y', 35 => 'z',
+
+ '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5,
+ '6' => 6, '7' => 7, '8' => 8, '9' => 9, 'a' => 10, 'b' => 11,
+ 'c' => 12, 'd' => 13, 'e' => 14, 'f' => 15, 'g' => 16, 'h' => 17,
+ 'i' => 18, 'j' => 19, 'k' => 20, 'l' => 21, 'm' => 22, 'n' => 23,
+ 'o' => 24, 'p' => 25, 'q' => 26, 'r' => 27, 's' => 28, 't' => 29,
+ 'u' => 30, 'v' => 31, 'w' => 32, 'x' => 33, 'y' => 34, 'z' => 35
+ );
+
+ if( extension_loaded( 'gmp' ) && ( $engine == 'auto' || $engine == 'gmp' ) ) {
+ $result = gmp_strval( gmp_init( $input, $sourceBase ), $destBase );
+ } elseif( extension_loaded( 'bcmath' ) && ( $engine == 'auto' || $engine == 'bcmath' ) ) {
+ $decimal = '0';
+ foreach( str_split( strtolower( $input ) ) as $char ) {
+ $decimal = bcmul( $decimal, $sourceBase );
+ $decimal = bcadd( $decimal, $baseChars[$char] );
}
- $inDigits[] = $n;
- }
- // Iterate over the input, modulo-ing out an output digit
- // at a time until input is gone.
- while( count( $inDigits ) ) {
- $work = 0;
- $workDigits = array();
+ for( $result = ''; bccomp( $decimal, 0 ); $decimal = bcdiv( $decimal, $destBase, 0 ) ) {
+ $result .= $baseChars[bcmod( $decimal, $destBase )];
+ }
- // Long division...
- foreach( $inDigits as $digit ) {
- $work *= $sourceBase;
- $work += $digit;
+ $result = strrev( $result );
+ } else {
+ $inDigits = array();
+ foreach( str_split( strtolower( $input ) ) as $char ) {
+ $inDigits[] = $baseChars[$char];
+ }
- if( $work < $destBase ) {
- // Gonna need to pull another digit.
- if( count( $workDigits ) ) {
- // Avoid zero-padding; this lets us find
- // the end of the input very easily when
- // length drops to zero.
- $workDigits[] = 0;
- }
- } else {
- // Finally! Actual division!
- $workDigits[] = intval( $work / $destBase );
+ // Iterate over the input, modulo-ing out an output digit
+ // at a time until input is gone.
+ $result = '';
+ while( $inDigits ) {
+ $work = 0;
+ $workDigits = array();
+
+ // Long division...
+ foreach( $inDigits as $digit ) {
+ $work *= $sourceBase;
+ $work += $digit;
- // Isn't it annoying that most programming languages
- // don't have a single divide-and-remainder operator,
- // even though the CPU implements it that way?
- $work = $work % $destBase;
+ if( $workDigits || $work >= $destBase ) {
+ $workDigits[] = (int) ( $work / $destBase );
+ }
+ $work %= $destBase;
}
- }
- // All that division leaves us with a remainder,
- // which is conveniently our next output digit.
- $outChars .= $digitChars[$work];
+ // All that division leaves us with a remainder,
+ // which is conveniently our next output digit.
+ $result .= $baseChars[$work];
+
+ // And we continue!
+ $inDigits = $workDigits;
+ }
- // And we continue!
- $inDigits = $workDigits;
+ $result = strrev( $result );
}
- while( strlen( $outChars ) < $pad ) {
- $outChars .= '0';
+ if( !$lowercase ) {
+ $result = strtoupper( $result );
}
- return strrev( $outChars );
+ return str_pad( $result, $pad, '0', STR_PAD_LEFT );
}
/**
* Create an object with a given name and an array of construct parameters
*
* @param $name String
- * @param $p Array: parameters
+ * @param array $p parameters
* @return object
* @deprecated since 1.18, warnings in 1.18, removal in 1.20
*/
@@ -3251,7 +3321,7 @@ function wfHttpOnlySafe() {
}
/**
- * Check if there is sufficent entropy in php's built-in session generation
+ * Check if there is sufficient entropy in php's built-in session generation
* @return bool true = there is sufficient entropy
*/
function wfCheckEntropy() {
@@ -3414,7 +3484,7 @@ function wfSplitWikiID( $wiki ) {
* belongs to. May contain a single string if the query is only
* in one group.
*
- * @param $wiki String: the wiki ID, or false for the current wiki
+ * @param string $wiki the wiki ID, or false for the current wiki
*
* Note: multiple calls to wfGetDB(DB_SLAVE) during the course of one request
* will always return the same object, unless the underlying connection or load
@@ -3432,7 +3502,7 @@ function &wfGetDB( $db, $groups = array(), $wiki = false ) {
/**
* Get a load balancer object.
*
- * @param $wiki String: wiki ID, or false for the current wiki
+ * @param string $wiki wiki ID, or false for the current wiki
* @return LoadBalancer
*/
function wfGetLB( $wiki = false ) {
@@ -3452,8 +3522,8 @@ function &wfGetLBFactory() {
* Find a file.
* Shortcut for RepoGroup::singleton()->findFile()
*
- * @param $title String or Title object
- * @param $options array Associative array of options:
+ * @param string $title or Title object
+ * @param array $options Associative array of options:
* time: requested time for an archived image, or false for the
* current version. An image object will be returned which was
* created at the specified time.
@@ -3511,7 +3581,7 @@ function wfQueriesMustScale() {
* extensions; this is a wrapper around $wgScriptExtension etc.
* except for 'index' and 'load' which use $wgScript/$wgLoadScript
*
- * @param $script String: script filename, sans extension
+ * @param string $script script filename, sans extension
* @return String
*/
function wfScript( $script = 'index' ) {
@@ -3560,16 +3630,6 @@ function wfBoolToStr( $value ) {
}
/**
- * Load an extension messages file
- *
- * @deprecated since 1.16, warnings in 1.18, remove in 1.20
- * @codeCoverageIgnore
- */
-function wfLoadExtensionMessages() {
- wfDeprecated( __FUNCTION__, '1.16' );
-}
-
-/**
* Get a platform-independent path to the null file, e.g. /dev/null
*
* @return string
@@ -3642,8 +3702,8 @@ function wfCountDown( $n ) {
* characters before hashing.
* @return string
* @codeCoverageIgnore
- * @deprecated since 1.20; Please use MWCryptRand for security purposes and wfRandomString for pesudo-random strings
- * @warning This method is NOT secure. Additionally it has many callers that use it for pesudo-random purposes.
+ * @deprecated since 1.20; Please use MWCryptRand for security purposes and wfRandomString for pseudo-random strings
+ * @warning This method is NOT secure. Additionally it has many callers that use it for pseudo-random purposes.
*/
function wfGenerateToken( $salt = '' ) {
wfDeprecated( __METHOD__, '1.20' );
@@ -3732,7 +3792,7 @@ function wfShorthandToInteger( $string = '' ) {
* Get the normalised IETF language tag
* See unit test for examples.
*
- * @param $code String: The language code.
+ * @param string $code The language code.
* @return String: The language code which complying with BCP 47 standards.
*/
function wfBCP47( $code ) {
@@ -3815,8 +3875,8 @@ function wfGetLangConverterCacheStorage() {
/**
* Call hook functions defined in $wgHooks
*
- * @param $event String: event name
- * @param $args Array: parameters passed to hook functions
+ * @param string $event event name
+ * @param array $args parameters passed to hook functions
* @return Boolean True if no handler aborted the hook
*/
function wfRunHooks( $event, $args = array() ) {
@@ -3826,9 +3886,9 @@ function wfRunHooks( $event, $args = array() ) {
/**
* Wrapper around php's unpack.
*
- * @param $format String: The format string (See php's docs)
+ * @param string $format The format string (See php's docs)
* @param $data: A binary string of binary data
- * @param $length integer or false: The minimun length of $data. This is to
+ * @param $length integer or false: The minimum length of $data. This is to
* prevent reading beyond the end of $data. false to disable the check.
*
* Also be careful when using this function to read unsigned 32 bit integer
@@ -3868,9 +3928,9 @@ function wfUnpack( $format, $data, $length=false ) {
* * Any subsequent links on the same line are considered to be exceptions,
* i.e. articles where the image may occur inline.
*
- * @param $name string the image name to check
+ * @param string $name the image name to check
* @param $contextTitle Title|bool the page on which the image occurs, if known
- * @param $blacklist string wikitext of a file blacklist
+ * @param string $blacklist wikitext of a file blacklist
* @return bool
*/
function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
diff --git a/includes/HTMLForm.php b/includes/HTMLForm.php
index 6f89d5b8..68639739 100644
--- a/includes/HTMLForm.php
+++ b/includes/HTMLForm.php
@@ -112,6 +112,7 @@ class HTMLForm extends ContextSource {
'submit' => 'HTMLSubmitField',
'hidden' => 'HTMLHiddenField',
'edittools' => 'HTMLEditTools',
+ 'checkmatrix' => 'HTMLCheckMatrix',
// HTMLTextField will output the correct type="" attribute automagically.
// There are about four zillion other HTML5 input types, like url, but
@@ -189,10 +190,10 @@ class HTMLForm extends ContextSource {
/**
* Build a new HTMLForm from an array of field attributes
- * @param $descriptor Array of Field constructs, as described above
+ * @param array $descriptor of Field constructs, as described above
* @param $context IContextSource available since 1.18, will become compulsory in 1.18.
* Obviates the need to call $form->setTitle()
- * @param $messagePrefix String a prefix to go in front of default messages
+ * @param string $messagePrefix a prefix to go in front of default messages
*/
public function __construct( $descriptor, /*IContextSource*/ $context = null, $messagePrefix = '' ) {
if ( $context instanceof IContextSource ) {
@@ -247,8 +248,9 @@ class HTMLForm extends ContextSource {
/**
* Set format in which to display the form
- * @param $format String the name of the format to use, must be one of
+ * @param string $format the name of the format to use, must be one of
* $this->availableDisplayFormats
+ * @throws MWException
* @since 1.20
* @return HTMLForm $this for chaining calls (since 1.20)
*/
@@ -279,7 +281,8 @@ class HTMLForm extends ContextSource {
/**
* Initialise a new Object for the field
* @param $fieldname string
- * @param $descriptor string input Descriptor, as described above
+ * @param string $descriptor input Descriptor, as described above
+ * @throws MWException
* @return HTMLFormField subclass
*/
static function loadInputFromParameters( $fieldname, $descriptor ) {
@@ -313,6 +316,7 @@ class HTMLForm extends ContextSource {
* @attention When doing method chaining, that should be the very last
* method call before displayForm().
*
+ * @throws MWException
* @return HTMLForm $this for chaining calls (since 1.20)
*/
function prepareForm() {
@@ -374,11 +378,12 @@ class HTMLForm extends ContextSource {
}
/**
- * Validate all the fields, and call the submision callback
+ * Validate all the fields, and call the submission callback
* function if everything is kosher.
+ * @throws MWException
* @return Mixed Bool true == Successful submission, Bool false
- * == No submission attempted, anything else == Error to
- * display.
+ * == No submission attempted, anything else == Error to
+ * display.
*/
function trySubmit() {
# Check for validation
@@ -412,7 +417,7 @@ class HTMLForm extends ContextSource {
/**
* Set a callback to a function to do something with the form
* once it's been successfully validated.
- * @param $cb String function name. The function will be passed
+ * @param string $cb function name. The function will be passed
* the output from HTMLForm::filterDataForSubmit, and must
* return Bool true on success, Bool false if no submission
* was attempted, or String HTML output to display on error.
@@ -436,7 +441,7 @@ class HTMLForm extends ContextSource {
/**
* Set the introductory message, overwriting any existing message.
- * @param $msg String complete text of message to display
+ * @param string $msg complete text of message to display
* @return HTMLForm $this for chaining calls (since 1.20)
*/
function setIntro( $msg ) {
@@ -447,7 +452,7 @@ class HTMLForm extends ContextSource {
/**
* Set the introductory message, overwriting any existing message.
* @since 1.19
- * @param $msg String complete text of message to display
+ * @param string $msg complete text of message to display
* @return HTMLForm $this for chaining calls (since 1.20)
*/
function setPreText( $msg ) {
@@ -457,7 +462,7 @@ class HTMLForm extends ContextSource {
/**
* Add introductory text.
- * @param $msg String complete text of message to display
+ * @param string $msg complete text of message to display
* @return HTMLForm $this for chaining calls (since 1.20)
*/
function addPreText( $msg ) {
@@ -467,8 +472,8 @@ class HTMLForm extends ContextSource {
/**
* Add header text, inside the form.
- * @param $msg String complete text of message to display
- * @param $section string The section to add the header to
+ * @param string $msg complete text of message to display
+ * @param string $section The section to add the header to
* @return HTMLForm $this for chaining calls (since 1.20)
*/
function addHeaderText( $msg, $section = null ) {
@@ -486,7 +491,7 @@ class HTMLForm extends ContextSource {
/**
* Set header text, inside the form.
* @since 1.19
- * @param $msg String complete text of message to display
+ * @param string $msg complete text of message to display
* @param $section The section to add the header to
* @return HTMLForm $this for chaining calls (since 1.20)
*/
@@ -501,8 +506,8 @@ class HTMLForm extends ContextSource {
/**
* Add footer text, inside the form.
- * @param $msg String complete text of message to display
- * @param $section string The section to add the footer text to
+ * @param string $msg complete text of message to display
+ * @param string $section The section to add the footer text to
* @return HTMLForm $this for chaining calls (since 1.20)
*/
function addFooterText( $msg, $section = null ) {
@@ -520,8 +525,8 @@ class HTMLForm extends ContextSource {
/**
* Set footer text, inside the form.
* @since 1.19
- * @param $msg String complete text of message to display
- * @param $section string The section to add the footer text to
+ * @param string $msg complete text of message to display
+ * @param string $section The section to add the footer text to
* @return HTMLForm $this for chaining calls (since 1.20)
*/
function setFooterText( $msg, $section = null ) {
@@ -535,7 +540,7 @@ class HTMLForm extends ContextSource {
/**
* Add text to the end of the display.
- * @param $msg String complete text of message to display
+ * @param string $msg complete text of message to display
* @return HTMLForm $this for chaining calls (since 1.20)
*/
function addPostText( $msg ) {
@@ -545,7 +550,7 @@ class HTMLForm extends ContextSource {
/**
* Set text at the end of the display.
- * @param $msg String complete text of message to display
+ * @param string $msg complete text of message to display
* @return HTMLForm $this for chaining calls (since 1.20)
*/
function setPostText( $msg ) {
@@ -555,8 +560,8 @@ class HTMLForm extends ContextSource {
/**
* Add a hidden field to the output
- * @param $name String field name. This will be used exactly as entered
- * @param $value String field value
+ * @param string $name field name. This will be used exactly as entered
+ * @param string $value field value
* @param $attribs Array
* @return HTMLForm $this for chaining calls (since 1.20)
*/
@@ -568,9 +573,9 @@ class HTMLForm extends ContextSource {
/**
* Add a button to the form
- * @param $name String field name.
- * @param $value String field value
- * @param $id String DOM id for the button (default: null)
+ * @param string $name field name.
+ * @param string $value field value
+ * @param string $id DOM id for the button (default: null)
* @param $attribs Array
* @return HTMLForm $this for chaining calls (since 1.20)
*/
@@ -620,7 +625,7 @@ class HTMLForm extends ContextSource {
/**
* Wrap the form innards in an actual "<form>" element
- * @param $html String HTML contents to wrap.
+ * @param string $html HTML contents to wrap.
* @return String wrapped HTML.
*/
function wrapForm( $html ) {
@@ -635,9 +640,9 @@ class HTMLForm extends ContextSource {
: 'application/x-www-form-urlencoded';
# Attributes
$attribs = array(
- 'action' => $this->mAction === false ? $this->getTitle()->getFullURL() : $this->mAction,
- 'method' => $this->mMethod,
- 'class' => 'visualClear',
+ 'action' => $this->mAction === false ? $this->getTitle()->getFullURL() : $this->mAction,
+ 'method' => $this->mMethod,
+ 'class' => 'visualClear',
'enctype' => $encType,
);
if ( !empty( $this->mId ) ) {
@@ -708,8 +713,8 @@ class HTMLForm extends ContextSource {
foreach ( $this->mButtons as $button ) {
$attrs = array(
- 'type' => 'submit',
- 'name' => $button['name'],
+ 'type' => 'submit',
+ 'name' => $button['name'],
'value' => $button['value']
);
@@ -760,7 +765,7 @@ class HTMLForm extends ContextSource {
/**
* Format a stack of error messages into a single HTML string
- * @param $errors Array of message keys/values
+ * @param array $errors of message keys/values
* @return String HTML, a "<ul>" list of errors
*/
public static function formatErrors( $errors ) {
@@ -788,7 +793,7 @@ class HTMLForm extends ContextSource {
/**
* Set the text for the submit button
- * @param $t String plaintext.
+ * @param string $t plaintext.
* @return HTMLForm $this for chaining calls (since 1.20)
*/
function setSubmitText( $t ) {
@@ -799,7 +804,7 @@ class HTMLForm extends ContextSource {
/**
* Set the text for the submit button to a message
* @since 1.19
- * @param $msg String message key
+ * @param string $msg message key
* @return HTMLForm $this for chaining calls (since 1.20)
*/
public function setSubmitTextMsg( $msg ) {
@@ -818,7 +823,7 @@ class HTMLForm extends ContextSource {
}
/**
- * @param $name String Submit button name
+ * @param string $name Submit button name
* @return HTMLForm $this for chaining calls (since 1.20)
*/
public function setSubmitName( $name ) {
@@ -827,7 +832,7 @@ class HTMLForm extends ContextSource {
}
/**
- * @param $name String Tooltip for the submit button
+ * @param string $name Tooltip for the submit button
* @return HTMLForm $this for chaining calls (since 1.20)
*/
public function setSubmitTooltip( $name ) {
@@ -847,7 +852,7 @@ class HTMLForm extends ContextSource {
}
/**
- * @param $id String DOM id for the form
+ * @param string $id DOM id for the form
* @return HTMLForm $this for chaining calls (since 1.20)
*/
public function setId( $id ) {
@@ -857,7 +862,7 @@ class HTMLForm extends ContextSource {
/**
* Prompt the whole form to be wrapped in a "<fieldset>", with
* this text as its "<legend>" element.
- * @param $legend String HTML to go inside the "<legend>" element.
+ * @param string $legend HTML to go inside the "<legend>" element.
* Will be escaped
* @return HTMLForm $this for chaining calls (since 1.20)
*/
@@ -870,7 +875,7 @@ class HTMLForm extends ContextSource {
* Prompt the whole form to be wrapped in a "<fieldset>", with
* this message as its "<legend>" element.
* @since 1.19
- * @param $msg String message key
+ * @param string $msg message key
* @return HTMLForm $this for chaining calls (since 1.20)
*/
public function setWrapperLegendMsg( $msg ) {
@@ -881,7 +886,7 @@ class HTMLForm extends ContextSource {
/**
* Set the prefix for various default messages
* @todo currently only used for the "<fieldset>" legend on forms
- * with multiple sections; should be used elsewhre?
+ * with multiple sections; should be used elsewhere?
* @param $p String
* @return HTMLForm $this for chaining calls (since 1.20)
*/
@@ -927,8 +932,8 @@ class HTMLForm extends ContextSource {
/**
* @todo Document
* @param $fields array[]|HTMLFormField[] array of fields (either arrays or objects)
- * @param $sectionName string ID attribute of the "<table>" tag for this section, ignored if empty
- * @param $fieldsetIDPrefix string ID prefix for the "<fieldset>" tag of each subsection, ignored if empty
+ * @param string $sectionName ID attribute of the "<table>" tag for this section, ignored if empty
+ * @param string $fieldsetIDPrefix ID prefix for the "<fieldset>" tag of each subsection, ignored if empty
* @return String
*/
public function displaySection( $fields, $sectionName = '', $fieldsetIDPrefix = '' ) {
@@ -952,7 +957,7 @@ class HTMLForm extends ContextSource {
$hasLabel = true;
}
} elseif ( is_array( $value ) ) {
- $section = $this->displaySection( $value, $key );
+ $section = $this->displaySection( $value, $key, "$fieldsetIDPrefix$key-" );
$legend = $this->getLegend( $key );
if ( isset( $this->mSectionHeaders[$key] ) ) {
$section = $this->mSectionHeaders[$key] . $section;
@@ -1025,7 +1030,7 @@ class HTMLForm extends ContextSource {
/**
* Stop a reset button being shown for this form
- * @param $suppressReset Bool set to false to re-enable the
+ * @param bool $suppressReset set to false to re-enable the
* button again
* @return HTMLForm $this for chaining calls (since 1.20)
*/
@@ -1095,7 +1100,7 @@ abstract class HTMLFormField {
* This function must be implemented to return the HTML to generate
* the input object itself. It should not implement the surrounding
* table cells/rows, or labels/help messages.
- * @param $value String the value to set the input to; eg a default
+ * @param string $value the value to set the input to; eg a default
* text for a text input.
* @return String valid HTML.
*/
@@ -1104,7 +1109,7 @@ abstract class HTMLFormField {
/**
* Get a translated interface message
*
- * This is a wrapper arround $this->mParent->msg() if $this->mParent is set
+ * This is a wrapper around $this->mParent->msg() if $this->mParent is set
* and wfMessage() otherwise.
*
* Parameters are the same as wfMessage().
@@ -1127,8 +1132,8 @@ abstract class HTMLFormField {
* Override this function to add specific validation checks on the
* field input. Don't forget to call parent::validate() to ensure
* that the user-defined callback mValidationCallback is still run
- * @param $value String the value the field was submitted with
- * @param $alldata Array the data collected from the form
+ * @param string $value the value the field was submitted with
+ * @param array $alldata the data collected from the form
* @return Mixed Bool true on success, or String error to display.
*/
function validate( $value, $alldata ) {
@@ -1177,7 +1182,8 @@ abstract class HTMLFormField {
/**
* Initialise the object
- * @param $params array Associative Array. See HTMLForm doc for syntax.
+ * @param array $params Associative Array. See HTMLForm doc for syntax.
+ * @throws MWException
*/
function __construct( $params ) {
$this->mParams = $params;
@@ -1245,7 +1251,7 @@ abstract class HTMLFormField {
/**
* Get the complete table row for the input, including help text,
* labels, and whatever.
- * @param $value String the value to set the input to.
+ * @param string $value the value to set the input to.
* @return String complete HTML table row.
*/
function getTableRow( $value ) {
@@ -1289,7 +1295,7 @@ abstract class HTMLFormField {
* Get the complete div for the input, including help text,
* labels, and whatever.
* @since 1.20
- * @param $value String the value to set the input to.
+ * @param string $value the value to set the input to.
* @return String complete HTML table row.
*/
public function getDiv( $value ) {
@@ -1316,13 +1322,12 @@ abstract class HTMLFormField {
* Get the complete raw fields for the input, including help text,
* labels, and whatever.
* @since 1.20
- * @param $value String the value to set the input to.
+ * @param string $value the value to set the input to.
* @return String complete HTML table row.
*/
public function getRaw( $value ) {
- list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
+ list( $errors, ) = $this->getErrorsAndErrorClass( $value );
$inputHtml = $this->getInputHTML( $value );
- $fieldType = get_class( $this );
$helptext = $this->getHelpTextHtmlRaw( $this->getHelpText() );
$cellAttributes = array();
$label = $this->getLabelHtml( $cellAttributes );
@@ -1415,7 +1420,7 @@ abstract class HTMLFormField {
/**
* Determine form errors to display and their classes
* @since 1.20
- * @param $value String the value of the input
+ * @param string $value the value of the input
* @return Array
*/
public function getErrorsAndErrorClass( $value ) {
@@ -1483,7 +1488,7 @@ abstract class HTMLFormField {
/**
* flatten an array of options to a single array, for instance,
* a set of "<options>" inside "<optgroups>".
- * @param $options array Associative Array with values either Strings
+ * @param array $options Associative Array with values either Strings
* or Arrays
* @return Array flattened input
*/
@@ -1778,6 +1783,170 @@ class HTMLCheckField extends HTMLFormField {
}
/**
+ * A checkbox matrix
+ * Operates similarly to HTMLMultiSelectField, but instead of using an array of
+ * options, uses an array of rows and an array of columns to dynamically
+ * construct a matrix of options.
+ */
+class HTMLCheckMatrix extends HTMLFormField {
+
+ function validate( $value, $alldata ) {
+ $rows = $this->mParams['rows'];
+ $columns = $this->mParams['columns'];
+
+ // Make sure user-defined validation callback is run
+ $p = parent::validate( $value, $alldata );
+ if ( $p !== true ) {
+ return $p;
+ }
+
+ // Make sure submitted value is an array
+ if ( !is_array( $value ) ) {
+ return false;
+ }
+
+ // If all options are valid, array_intersect of the valid options
+ // and the provided options will return the provided options.
+ $validOptions = array();
+ foreach ( $rows as $rowTag ) {
+ foreach ( $columns as $columnTag ) {
+ $validOptions[] = $columnTag . '-' . $rowTag;
+ }
+ }
+ $validValues = array_intersect( $value, $validOptions );
+ if ( count( $validValues ) == count( $value ) ) {
+ return true;
+ } else {
+ return $this->msg( 'htmlform-select-badoption' )->parse();
+ }
+ }
+
+ /**
+ * Build a table containing a matrix of checkbox options.
+ * The value of each option is a combination of the row tag and column tag.
+ * mParams['rows'] is an array with row labels as keys and row tags as values.
+ * mParams['columns'] is an array with column labels as keys and column tags as values.
+ * @param array $value of the options that should be checked
+ * @return String
+ */
+ function getInputHTML( $value ) {
+ $html = '';
+ $tableContents = '';
+ $attribs = array();
+ $rows = $this->mParams['rows'];
+ $columns = $this->mParams['columns'];
+
+ // If the disabled param is set, disable all the options
+ if ( !empty( $this->mParams['disabled'] ) ) {
+ $attribs['disabled'] = 'disabled';
+ }
+
+ // Build the column headers
+ $headerContents = Html::rawElement( 'td', array(), '&#160;' );
+ foreach ( $columns as $columnLabel => $columnTag ) {
+ $headerContents .= Html::rawElement( 'td', array(), $columnLabel );
+ }
+ $tableContents .= Html::rawElement( 'tr', array(), "\n$headerContents\n" );
+
+ // Build the options matrix
+ foreach ( $rows as $rowLabel => $rowTag ) {
+ $rowContents = Html::rawElement( 'td', array(), $rowLabel );
+ foreach ( $columns as $columnTag ) {
+ // Knock out any options that are not wanted
+ if ( isset( $this->mParams['remove-options'] )
+ && in_array( "$columnTag-$rowTag", $this->mParams['remove-options'] ) )
+ {
+ $rowContents .= Html::rawElement( 'td', array(), '&#160;' );
+ } else {
+ // Construct the checkbox
+ $thisAttribs = array(
+ 'id' => "{$this->mID}-$columnTag-$rowTag",
+ 'value' => $columnTag . '-' . $rowTag
+ );
+ $checkbox = Xml::check(
+ $this->mName . '[]',
+ in_array( $columnTag . '-' . $rowTag, (array)$value, true ),
+ $attribs + $thisAttribs );
+ $rowContents .= Html::rawElement( 'td', array(), $checkbox );
+ }
+ }
+ $tableContents .= Html::rawElement( 'tr', array(), "\n$rowContents\n" );
+ }
+
+ // Put it all in a table
+ $html .= Html::rawElement( 'table', array( 'class' => 'mw-htmlform-matrix' ),
+ Html::rawElement( 'tbody', array(), "\n$tableContents\n" ) ) . "\n";
+
+ return $html;
+ }
+
+ /**
+ * Get the complete table row for the input, including help text,
+ * labels, and whatever.
+ * We override this function since the label should always be on a separate
+ * line above the options in the case of a checkbox matrix, i.e. it's always
+ * a "vertical-label".
+ * @param string $value the value to set the input to
+ * @return String complete HTML table row
+ */
+ function getTableRow( $value ) {
+ list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
+ $inputHtml = $this->getInputHTML( $value );
+ $fieldType = get_class( $this );
+ $helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
+ $cellAttributes = array( 'colspan' => 2 );
+
+ $label = $this->getLabelHtml( $cellAttributes );
+
+ $field = Html::rawElement(
+ 'td',
+ array( 'class' => 'mw-input' ) + $cellAttributes,
+ $inputHtml . "\n$errors"
+ );
+
+ $html = Html::rawElement( 'tr',
+ array( 'class' => 'mw-htmlform-vertical-label' ), $label );
+ $html .= Html::rawElement( 'tr',
+ array( 'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass" ),
+ $field );
+
+ return $html . $helptext;
+ }
+
+ /**
+ * @param $request WebRequest
+ * @return Array
+ */
+ function loadDataFromRequest( $request ) {
+ if ( $this->mParent->getMethod() == 'post' ) {
+ if ( $request->wasPosted() ) {
+ // Checkboxes are not added to the request arrays if they're not checked,
+ // so it's perfectly possible for there not to be an entry at all
+ return $request->getArray( $this->mName, array() );
+ } else {
+ // That's ok, the user has not yet submitted the form, so show the defaults
+ return $this->getDefault();
+ }
+ } else {
+ // This is the impossible case: if we look at $_GET and see no data for our
+ // field, is it because the user has not yet submitted the form, or that they
+ // have submitted it with all the options unchecked. We will have to assume the
+ // latter, which basically means that you can't specify 'positive' defaults
+ // for GET forms.
+ return $request->getArray( $this->mName, array() );
+ }
+ }
+
+ function getDefault() {
+ if ( isset( $this->mDefault ) ) {
+ return $this->mDefault;
+ } else {
+ return array();
+ }
+ }
+}
+
+/**
* A select dropdown field. Basically a wrapper for Xmlselect class
*/
class HTMLSelectField extends HTMLFormField {
@@ -2053,8 +2222,8 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
/**
* Build a drop-down box from a textual list.
- * @param $string String message text
- * @param $otherName String name of "other reason" option
+ * @param string $string message text
+ * @param string $otherName name of "other reason" option
* @return Array
* TODO: this is copied from Xml::listDropDown(), deprecate/avoid duplication?
*/
@@ -2188,7 +2357,6 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
*/
class HTMLRadioField extends HTMLFormField {
-
function validate( $value, $alldata ) {
$p = parent::validate( $value, $alldata );
diff --git a/includes/HistoryBlob.php b/includes/HistoryBlob.php
index bb8ec5e3..1af733a2 100644
--- a/includes/HistoryBlob.php
+++ b/includes/HistoryBlob.php
@@ -19,10 +19,10 @@
*
* @file
*/
-
+
/**
- * Base class for general text storage via the "object" flag in old_flags, or
- * two-part external storage URLs. Used for represent efficient concatenated
+ * Base class for general text storage via the "object" flag in old_flags, or
+ * two-part external storage URLs. Used for represent efficient concatenated
* storage, and migration-related pointer objects.
*/
interface HistoryBlob
@@ -178,12 +178,11 @@ class ConcatenatedGzipHistoryBlob implements HistoryBlob
* @return bool
*/
public function isHappy() {
- return $this->mSize < $this->mMaxSize
+ return $this->mSize < $this->mMaxSize
&& count( $this->mItems ) < $this->mMaxCount;
}
}
-
/**
* Pointer object for an item within a CGZ blob stored in the text table.
*/
@@ -199,7 +198,7 @@ class HistoryBlobStub {
var $mOldId, $mHash, $mRef;
/**
- * @param $hash string the content hash of the text
+ * @param string $hash the content hash of the text
* @param $oldid Integer the old_id for the CGZ object
*/
function __construct( $hash = '', $oldid = 0 ) {
@@ -232,8 +231,6 @@ class HistoryBlobStub {
* @return string
*/
function getText() {
- $fname = 'HistoryBlobStub::getText';
-
if( isset( self::$blobCache[$this->mOldId] ) ) {
$obj = self::$blobCache[$this->mOldId];
} else {
@@ -244,13 +241,12 @@ class HistoryBlobStub {
}
$flags = explode( ',', $row->old_flags );
if( in_array( 'external', $flags ) ) {
- $url=$row->old_text;
+ $url = $row->old_text;
$parts = explode( '://', $url, 2 );
if ( !isset( $parts[1] ) || $parts[1] == '' ) {
- wfProfileOut( $fname );
return false;
}
- $row->old_text = ExternalStore::fetchFromUrl($url);
+ $row->old_text = ExternalStore::fetchFromUrl( $url );
}
if( !in_array( 'object', $flags ) ) {
@@ -288,7 +284,6 @@ class HistoryBlobStub {
}
}
-
/**
* To speed up conversion from 1.4 to 1.5 schema, text rows can refer to the
* leftover cur table as the backend. This avoids expensively copying hundreds
@@ -341,12 +336,12 @@ class DiffHistoryBlob implements HistoryBlob {
/** Total uncompressed size */
var $mSize = 0;
- /**
- * Array of diffs. If a diff D from A to B is notated D = B - A, and Z is
+ /**
+ * Array of diffs. If a diff D from A to B is notated D = B - A, and Z is
* an empty string:
*
* { item[map[i]] - item[map[i-1]] where i > 0
- * diff[i] = {
+ * diff[i] = {
* { item[map[i]] - Z where i = 0
*/
var $mDiffs;
@@ -379,7 +374,7 @@ class DiffHistoryBlob implements HistoryBlob {
* The maximum number of text items before the object becomes sad
*/
var $mMaxCount = 100;
-
+
/** Constants from xdiff.h */
const XDL_BDOP_INS = 1;
const XDL_BDOP_CPY = 2;
@@ -398,7 +393,7 @@ class DiffHistoryBlob implements HistoryBlob {
*/
function addItem( $text ) {
if ( $this->mFrozen ) {
- throw new MWException( __METHOD__.": Cannot add more items after sleep/wakeup" );
+ throw new MWException( __METHOD__ . ": Cannot add more items after sleep/wakeup" );
}
$this->mItems[] = $text;
@@ -433,7 +428,7 @@ class DiffHistoryBlob implements HistoryBlob {
* @throws MWException
*/
function compress() {
- if ( !function_exists( 'xdiff_string_rabdiff' ) ){
+ if ( !function_exists( 'xdiff_string_rabdiff' ) ) {
throw new MWException( "Need xdiff 1.5+ support to write DiffHistoryBlob\n" );
}
if ( isset( $this->mDiffs ) ) {
@@ -534,18 +529,18 @@ class DiffHistoryBlob implements HistoryBlob {
# Pure PHP implementation
$header = unpack( 'Vofp/Vcsize', substr( $diff, 0, 8 ) );
-
+
# Check the checksum if hash/mhash is available
$ofp = $this->xdiffAdler32( $base );
if ( $ofp !== false && $ofp !== substr( $diff, 0, 4 ) ) {
- wfDebug( __METHOD__. ": incorrect base checksum\n" );
+ wfDebug( __METHOD__ . ": incorrect base checksum\n" );
return false;
}
if ( $header['csize'] != strlen( $base ) ) {
- wfDebug( __METHOD__. ": incorrect base length\n" );
+ wfDebug( __METHOD__ . ": incorrect base length\n" );
return false;
}
-
+
$p = 8;
$out = '';
while ( $p < strlen( $diff ) ) {
@@ -571,7 +566,7 @@ class DiffHistoryBlob implements HistoryBlob {
$out .= substr( $base, $x['off'], $x['csize'] );
break;
default:
- wfDebug( __METHOD__.": invalid op\n" );
+ wfDebug( __METHOD__ . ": invalid op\n" );
return false;
}
}
@@ -579,7 +574,7 @@ class DiffHistoryBlob implements HistoryBlob {
}
/**
- * Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with
+ * Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with
* the bytes backwards and initialised with 0 instead of 1. See bug 34428.
*
* Returns false if no hashing library is available
@@ -589,8 +584,8 @@ class DiffHistoryBlob implements HistoryBlob {
if ( $init === null ) {
$init = str_repeat( "\xf0", 205 ) . "\xee" . str_repeat( "\xf0", 67 ) . "\x02";
}
- // The real Adler-32 checksum of $init is zero, so it initialises the
- // state to zero, as it is at the start of LibXDiff's checksum
+ // The real Adler-32 checksum of $init is zero, so it initialises the
+ // state to zero, as it is at the start of LibXDiff's checksum
// algorithm. Appending the subject string then simulates LibXDiff.
if ( function_exists( 'hash' ) ) {
$hash = hash( 'adler32', $init . $s, true );
@@ -664,7 +659,7 @@ class DiffHistoryBlob implements HistoryBlob {
if ( isset( $info['base'] ) ) {
// Old format
$this->mDiffMap = range( 0, count( $this->mDiffs ) - 1 );
- array_unshift( $this->mDiffs,
+ array_unshift( $this->mDiffs,
pack( 'VVCV', 0, 0, self::XDL_BDOP_INSB, strlen( $info['base'] ) ) .
$info['base'] );
} else {
@@ -687,7 +682,7 @@ class DiffHistoryBlob implements HistoryBlob {
* @return bool
*/
function isHappy() {
- return $this->mSize < $this->mMaxSize
+ return $this->mSize < $this->mMaxSize
&& count( $this->mItems ) < $this->mMaxCount;
}
diff --git a/includes/Hooks.php b/includes/Hooks.php
index bc39f2fc..8cc7acea 100644
--- a/includes/Hooks.php
+++ b/includes/Hooks.php
@@ -23,23 +23,47 @@
* @file
*/
+/**
+ * @since 1.18
+ */
class MWHookException extends MWException {}
/**
* Hooks class.
*
* Used to supersede $wgHooks, because globals are EVIL.
+ *
+ * @since 1.18
*/
class Hooks {
protected static $handlers = array();
/**
+ * Clears hooks registered via Hooks::register(). Does not touch $wgHooks.
+ * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
+ *
+ * @since 1.21
+ *
+ * @param string $name the name of the hook to clear.
+ *
+ * @throws MWException if not in testing mode.
+ */
+ public static function clear( $name ) {
+ if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+ throw new MWException( 'can not reset hooks in operation.' );
+ }
+
+ unset( self::$handlers[$name] );
+ }
+
+ /**
* Attach an event handler to a given hook
*
- * @param $name Mixed: name of hook
+ * @since 1.18
+ *
+ * @param string $name name of hook
* @param $callback Mixed: callback function to attach
- * @return void
*/
public static function register( $name, $callback ) {
if( !isset( self::$handlers[$name] ) ) {
@@ -51,69 +75,84 @@ class Hooks {
/**
* Returns true if a hook has a function registered to it.
+ * The function may have been registered either via Hooks::register or in $wgHooks.
+ *
+ * @since 1.18
*
- * @param $name Mixed: name of hook
- * @return Boolean: true if a hook has a function registered to it
+ * @param string $name name of hook
+ * @return Boolean: true if the hook has a function registered to it
*/
public static function isRegistered( $name ) {
- if( !isset( self::$handlers[$name] ) ) {
- self::$handlers[$name] = array();
- }
+ global $wgHooks;
- return ( count( self::$handlers[$name] ) != 0 );
+ return !empty( $wgHooks[$name] ) || !empty( self::$handlers[$name] );
}
/**
* Returns an array of all the event functions attached to a hook
+ * This combines functions registered via Hooks::register and with $wgHooks.
+ * @since 1.18
+ *
+ * @throws MWException
+ * @throws FatalError
+ * @param string $name name of the hook
*
- * @param $name Mixed: name of the hook
* @return array
*/
public static function getHandlers( $name ) {
- if( !isset( self::$handlers[$name] ) ) {
+ global $wgHooks;
+
+ // Return quickly in the most common case
+ if ( empty( self::$handlers[$name] ) && empty( $wgHooks[$name] ) ) {
return array();
}
- return self::$handlers[$name];
+ if ( !is_array( self::$handlers ) ) {
+ throw new MWException( "Local hooks array is not an array!\n" );
+ }
+
+ if ( !is_array( $wgHooks ) ) {
+ throw new MWException( "Global hooks array is not an array!\n" );
+ }
+
+ if ( empty( Hooks::$handlers[$name] ) ) {
+ $hooks = $wgHooks[$name];
+ } elseif ( empty( $wgHooks[$name] ) ) {
+ $hooks = Hooks::$handlers[$name];
+ } else {
+ // so they are both not empty...
+ $hooks = array_merge( Hooks::$handlers[$name], $wgHooks[$name] );
+ }
+
+ if ( !is_array( $hooks ) ) {
+ throw new MWException( "Hooks array for event '$name' is not an array!\n" );
+ }
+
+ return $hooks;
}
/**
* Call hook functions defined in Hooks::register
*
- * Because programmers assign to $wgHooks, we need to be very
- * careful about its contents. So, there's a lot more error-checking
- * in here than would normally be necessary.
+ * @param string $event event name
+ * @param $args Array: parameters passed to hook functions
*
- * @param $event String: event name
- * @param $args Array: parameters passed to hook functions
+ * @throws MWException
+ * @throws FatalError
* @return Boolean True if no handler aborted the hook
*/
public static function run( $event, $args = array() ) {
global $wgHooks;
// Return quickly in the most common case
- if ( !isset( self::$handlers[$event] ) && !isset( $wgHooks[$event] ) ) {
+ if ( empty( self::$handlers[$event] ) && empty( $wgHooks[$event] ) ) {
return true;
}
- if ( !is_array( self::$handlers ) ) {
- throw new MWException( "Local hooks array is not an array!\n" );
- }
-
- if ( !is_array( $wgHooks ) ) {
- throw new MWException( "Global hooks array is not an array!\n" );
- }
+ wfProfileIn( 'hook: ' . $event );
+ $hooks = self::getHandlers( $event );
- $new_handlers = (array) self::$handlers;
- $old_handlers = (array) $wgHooks;
-
- $hook_array = array_merge( $new_handlers, $old_handlers );
-
- if ( !is_array( $hook_array[$event] ) ) {
- throw new MWException( "Hooks array for event '$event' is not an array!\n" );
- }
-
- foreach ( $hook_array[$event] as $index => $hook ) {
+ foreach ( $hooks as $hook ) {
$object = null;
$method = null;
$func = null;
@@ -131,7 +170,7 @@ class Hooks {
if ( count( $hook ) < 1 ) {
throw new MWException( 'Empty array in hooks for ' . $event . "\n" );
} elseif ( is_object( $hook[0] ) ) {
- $object = $hook_array[$event][$index][0];
+ $object = $hook[0];
if ( $object instanceof Closure ) {
$closure = true;
if ( count( $hook ) > 1 ) {
@@ -161,7 +200,7 @@ class Hooks {
} elseif ( is_string( $hook ) ) { # functions look like strings, too
$func = $hook;
} elseif ( is_object( $hook ) ) {
- $object = $hook_array[$event][$index];
+ $object = $hook;
if ( $object instanceof Closure ) {
$closure = true;
} else {
@@ -249,18 +288,23 @@ class Hooks {
);
}
} elseif ( !$retval ) {
+ wfProfileOut( 'hook: ' . $event );
return false;
}
}
+ wfProfileOut( 'hook: ' . $event );
return true;
}
/**
* This REALLY should be protected... but it's public for compatibility
*
- * @param $errno int Unused
- * @param $errstr String: error message
+ * @since 1.18
+ *
+ * @param int $errno Unused
+ * @param string $errstr error message
+ * @throws MWHookException
* @return Boolean: false
*/
public static function hookErrorHandler( $errno, $errstr ) {
diff --git a/includes/Html.php b/includes/Html.php
index b33d6fbb..af4b4bbf 100644
--- a/includes/Html.php
+++ b/includes/Html.php
@@ -48,7 +48,7 @@
* @since 1.16
*/
class Html {
- # List of void elements from HTML5, section 8.1.2 as of 2011-08-12
+ // List of void elements from HTML5, section 8.1.2 as of 2011-08-12
private static $voidElements = array(
'area',
'base',
@@ -68,8 +68,8 @@ class Html {
'wbr',
);
- # Boolean attributes, which may have the value omitted entirely. Manually
- # collected from the HTML5 spec as of 2011-08-12.
+ // Boolean attributes, which may have the value omitted entirely. Manually
+ // collected from the HTML5 spec as of 2011-08-12.
private static $boolAttribs = array(
'async',
'autofocus',
@@ -97,7 +97,7 @@ class Html {
'selected',
'truespeed',
'typemustmatch',
- # HTML5 Microdata
+ // HTML5 Microdata
'itemscope',
);
@@ -126,11 +126,11 @@ class Html {
* content model. If $wgWellFormedXml is false, then a few bytes will be
* shaved off the HTML output as well.
*
- * @param $element string The element's name, e.g., 'a'
- * @param $attribs array Associative array of attributes, e.g., array(
+ * @param string $element The element's name, e.g., 'a'
+ * @param array $attribs Associative array of attributes, e.g., array(
* 'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
* further documentation.
- * @param $contents string The raw HTML contents of the element: *not*
+ * @param string $contents The raw HTML contents of the element: *not*
* escaped!
* @return string Raw HTML
*/
@@ -139,7 +139,7 @@ class Html {
$start = self::openElement( $element, $attribs );
if ( in_array( $element, self::$voidElements ) ) {
if ( $wgWellFormedXml ) {
- # Silly XML.
+ // Silly XML.
return substr( $start, 0, -1 ) . ' />';
}
return $start;
@@ -160,8 +160,8 @@ class Html {
*/
public static function element( $element, $attribs = array(), $contents = '' ) {
return self::rawElement( $element, $attribs, strtr( $contents, array(
- # There's no point in escaping quotes, >, etc. in the contents of
- # elements.
+ // There's no point in escaping quotes, >, etc. in the contents of
+ // elements.
'&' => '&amp;',
'<' => '&lt;'
) ) );
@@ -179,24 +179,20 @@ class Html {
public static function openElement( $element, $attribs = array() ) {
global $wgHtml5, $wgWellFormedXml;
$attribs = (array)$attribs;
- # This is not required in HTML5, but let's do it anyway, for
- # consistency and better compression.
+ // This is not required in HTML5, but let's do it anyway, for
+ // consistency and better compression.
$element = strtolower( $element );
- # In text/html, initial <html> and <head> tags can be omitted under
- # pretty much any sane circumstances, if they have no attributes. See:
- # <http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags>
+ // In text/html, initial <html> and <head> tags can be omitted under
+ // pretty much any sane circumstances, if they have no attributes. See:
+ // <http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags>
if ( !$wgWellFormedXml && !$attribs
&& in_array( $element, array( 'html', 'head' ) ) ) {
return '';
}
- # Remove HTML5-only attributes if we aren't doing HTML5, and disable
- # form validation regardless (see bug 23769 and the more detailed
- # comment in expandAttributes())
+ // Remove invalid input types
if ( $element == 'input' ) {
- # Whitelist of types that don't cause validation. All except
- # 'search' are valid in XHTML1.
$validTypes = array(
'hidden',
'text',
@@ -208,9 +204,9 @@ class Html {
'image',
'reset',
'button',
- 'search',
);
+ // Allow more input types in HTML5 mode
if( $wgHtml5 ) {
$validTypes = array_merge( $validTypes, array(
'datetime',
@@ -232,17 +228,19 @@ class Html {
&& !in_array( $attribs['type'], $validTypes ) ) {
unset( $attribs['type'] );
}
-
- if ( isset( $attribs['type'] ) && $attribs['type'] == 'search'
- && !$wgHtml5 ) {
- unset( $attribs['type'] );
- }
}
if ( !$wgHtml5 && $element == 'textarea' && isset( $attribs['maxlength'] ) ) {
unset( $attribs['maxlength'] );
}
+ // According to standard the default type for <button> elements is "submit".
+ // Depending on compatibility mode IE might use "button", instead.
+ // We enforce the standard "submit".
+ if ( $element == 'button' && !isset( $attribs['type'] ) ) {
+ $attribs['type'] = 'submit';
+ }
+
return "<$element" . self::expandAttributes(
self::dropDefaults( $element, $attribs ) ) . '>';
}
@@ -252,7 +250,7 @@ class Html {
* it returns the empty string when that's guaranteed to be safe.
*
* @since 1.17
- * @param $element string Name of the element, e.g., 'a'
+ * @param string $element Name of the element, e.g., 'a'
* @return string A closing tag, if required
*/
public static function closeElement( $element ) {
@@ -260,8 +258,8 @@ class Html {
$element = strtolower( $element );
- # Reference:
- # http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags
+ // Reference:
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags
if ( !$wgWellFormedXml && in_array( $element, array(
'html',
'head',
@@ -289,28 +287,27 @@ class Html {
* only guarantees that the output array should be functionally identical
* to the input array (currently per the HTML 5 draft as of 2009-09-06).
*
- * @param $element string Name of the element, e.g., 'a'
- * @param $attribs array Associative array of attributes, e.g., array(
+ * @param string $element Name of the element, e.g., 'a'
+ * @param array $attribs Associative array of attributes, e.g., array(
* 'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
* further documentation.
* @return array An array of attributes functionally identical to $attribs
*/
private static function dropDefaults( $element, $attribs ) {
- # Don't bother doing anything if we aren't outputting HTML5; it's too
- # much of a pain to maintain two sets of defaults.
+ // Don't bother doing anything if we aren't outputting HTML5; it's too
+ // much of a pain to maintain two sets of defaults.
global $wgHtml5;
if ( !$wgHtml5 ) {
return $attribs;
}
- # Whenever altering this array, please provide a covering test case
- # in HtmlTest::provideElementsWithAttributesHavingDefaultValues
+ // Whenever altering this array, please provide a covering test case
+ // in HtmlTest::provideElementsWithAttributesHavingDefaultValues
static $attribDefaults = array(
'area' => array( 'shape' => 'rect' ),
'button' => array(
'formaction' => 'GET',
'formenctype' => 'application/x-www-form-urlencoded',
- 'type' => 'submit',
),
'canvas' => array(
'height' => '150',
@@ -329,8 +326,8 @@ class Html {
'keygen' => array( 'keytype' => 'rsa' ),
'link' => array( 'media' => 'all' ),
'menu' => array( 'type' => 'list' ),
- # Note: the use of text/javascript here instead of other JavaScript
- # MIME types follows the HTML5 spec.
+ // Note: the use of text/javascript here instead of other JavaScript
+ // MIME types follows the HTML5 spec.
'script' => array( 'type' => 'text/javascript' ),
'style' => array(
'media' => 'all',
@@ -349,7 +346,7 @@ class Html {
$value = strval( $value );
}
- # Simple checks using $attribDefaults
+ // Simple checks using $attribDefaults
if ( isset( $attribDefaults[$element][$lcattrib] ) &&
$attribDefaults[$element][$lcattrib] == $value ) {
unset( $attribs[$attrib] );
@@ -360,7 +357,7 @@ class Html {
}
}
- # More subtle checks
+ // More subtle checks
if ( $element === 'link' && isset( $attribs['type'] )
&& strval( $attribs['type'] ) == 'text/css' ) {
unset( $attribs['type'] );
@@ -392,12 +389,12 @@ class Html {
if ( in_array( 'multiple', $attribs )
|| ( isset( $attribs['multiple'] ) && $attribs['multiple'] !== false )
) {
- # A multi-select
+ // A multi-select
if ( strval( $attribs['size'] ) == '4' ) {
unset( $attribs['size'] );
}
} else {
- # Single select
+ // Single select
if ( strval( $attribs['size'] ) == '1' ) {
unset( $attribs['size'] );
}
@@ -438,7 +435,7 @@ class Html {
* // gives '<em class="bar quux"></em>'
* @endcode
*
- * @param $attribs array Associative array of attributes, e.g., array(
+ * @param array $attribs Associative array of attributes, e.g., array(
* 'href' => 'http://www.mediawiki.org/' ). Values will be HTML-escaped.
* A value of false means to omit the attribute. For boolean attributes,
* you can omit the key, e.g., array( 'checked' ) instead of
@@ -456,33 +453,32 @@ class Html {
continue;
}
- # For boolean attributes, support array( 'foo' ) instead of
- # requiring array( 'foo' => 'meaningless' ).
+ // For boolean attributes, support array( 'foo' ) instead of
+ // requiring array( 'foo' => 'meaningless' ).
if ( is_int( $key )
&& in_array( strtolower( $value ), self::$boolAttribs ) ) {
$key = $value;
}
- # Not technically required in HTML5, but required in XHTML 1.0,
- # and we'd like consistency and better compression anyway.
+ // Not technically required in HTML5, but required in XHTML 1.0,
+ // and we'd like consistency and better compression anyway.
$key = strtolower( $key );
- # Here we're blacklisting some HTML5-only attributes...
- if ( !$wgHtml5 && in_array( $key, self::$HTMLFiveOnlyAttribs )
- ) {
+ // Here we're blacklisting some HTML5-only attributes...
+ if ( !$wgHtml5 && in_array( $key, self::$HTMLFiveOnlyAttribs ) ) {
continue;
}
- # Bug 23769: Blacklist all form validation attributes for now. Current
- # (June 2010) WebKit has no UI, so the form just refuses to submit
- # without telling the user why, which is much worse than failing
- # server-side validation. Opera is the only other implementation at
- # this time, and has ugly UI, so just kill the feature entirely until
- # we have at least one good implementation.
+ // Bug 23769: Blacklist all form validation attributes for now. Current
+ // (June 2010) WebKit has no UI, so the form just refuses to submit
+ // without telling the user why, which is much worse than failing
+ // server-side validation. Opera is the only other implementation at
+ // this time, and has ugly UI, so just kill the feature entirely until
+ // we have at least one good implementation.
- # As the default value of "1" for "step" rejects decimal
- # numbers to be entered in 'type="number"' fields, allow
- # the special case 'step="any"'.
+ // As the default value of "1" for "step" rejects decimal
+ // numbers to be entered in 'type="number"' fields, allow
+ // the special case 'step="any"'.
if ( in_array( $key, array( 'max', 'min', 'pattern', 'required' ) ) ||
$key === 'step' && $value !== 'any' ) {
@@ -495,20 +491,19 @@ class Html {
'class', // html4, html5
'accesskey', // as of html5, multiple space-separated values allowed
// html4-spec doesn't document rel= as space-separated
- // but has been used like that and is now documented as such
+ // but has been used like that and is now documented as such
// in the html5-spec.
'rel',
);
- # Specific features for attributes that allow a list of space-separated values
+ // Specific features for attributes that allow a list of space-separated values
if ( in_array( $key, $spaceSeparatedListAttributes ) ) {
// Apply some normalization and remove duplicates
- // Convert into correct array. Array can contain space-seperated
+ // Convert into correct array. Array can contain space-separated
// values. Implode/explode to get those into the main array as well.
if ( is_array( $value ) ) {
// If input wasn't an array, we can skip this step
-
$newValue = array();
foreach ( $value as $k => $v ) {
if ( is_string( $v ) ) {
@@ -517,7 +512,7 @@ class Html {
if ( !isset( $value[$v] ) ) {
// As a special case don't set 'foo' if a
// separate 'foo' => true/false exists in the array
- // keys should be authoritive
+ // keys should be authoritative
$newValue[] = $v;
}
} elseif ( $v ) {
@@ -538,14 +533,14 @@ class Html {
$value = implode( ' ', array_unique( $value ) );
}
- # See the "Attributes" section in the HTML syntax part of HTML5,
- # 9.1.2.3 as of 2009-08-10. Most attributes can have quotation
- # marks omitted, but not all. (Although a literal " is not
- # permitted, we don't check for that, since it will be escaped
- # anyway.)
+ // See the "Attributes" section in the HTML syntax part of HTML5,
+ // 9.1.2.3 as of 2009-08-10. Most attributes can have quotation
+ // marks omitted, but not all. (Although a literal " is not
+ // permitted, we don't check for that, since it will be escaped
+ // anyway.)
#
- # See also research done on further characters that need to be
- # escaped: http://code.google.com/p/html5lib/issues/detail?id=93
+ // See also research done on further characters that need to be
+ // escaped: http://code.google.com/p/html5lib/issues/detail?id=93
$badChars = "\\x00- '=<>`/\x{00a0}\x{1680}\x{180e}\x{180F}\x{2000}\x{2001}"
. "\x{2002}\x{2003}\x{2004}\x{2005}\x{2006}\x{2007}\x{2008}\x{2009}"
. "\x{200A}\x{2028}\x{2029}\x{202F}\x{205F}\x{3000}";
@@ -557,9 +552,9 @@ class Html {
}
if ( in_array( $key, self::$boolAttribs ) ) {
- # In XHTML 1.0 Transitional, the value needs to be equal to the
- # key. In HTML5, we can leave the value empty instead. If we
- # don't need well-formed XML, we can omit the = entirely.
+ // In XHTML 1.0 Transitional, the value needs to be equal to the
+ // key. In HTML5, we can leave the value empty instead. If we
+ // don't need well-formed XML, we can omit the = entirely.
if ( !$wgWellFormedXml ) {
$ret .= " $key";
} elseif ( $wgHtml5 ) {
@@ -568,16 +563,16 @@ class Html {
$ret .= " $key=\"$key\"";
}
} else {
- # Apparently we need to entity-encode \n, \r, \t, although the
- # spec doesn't mention that. Since we're doing strtr() anyway,
- # and we don't need <> escaped here, we may as well not call
- # htmlspecialchars().
- # @todo FIXME: Verify that we actually need to
- # escape \n\r\t here, and explain why, exactly.
+ // Apparently we need to entity-encode \n, \r, \t, although the
+ // spec doesn't mention that. Since we're doing strtr() anyway,
+ // and we don't need <> escaped here, we may as well not call
+ // htmlspecialchars().
+ // @todo FIXME: Verify that we actually need to
+ // escape \n\r\t here, and explain why, exactly.
#
- # We could call Sanitizer::encodeAttribute() for this, but we
- # don't because we're stubborn and like our marginal savings on
- # byte size from not having to encode unnecessary quotes.
+ // We could call Sanitizer::encodeAttribute() for this, but we
+ // don't because we're stubborn and like our marginal savings on
+ // byte size from not having to encode unnecessary quotes.
$map = array(
'&' => '&amp;',
'"' => '&quot;',
@@ -586,12 +581,11 @@ class Html {
"\t" => '&#9;'
);
if ( $wgWellFormedXml ) {
- # This is allowed per spec: <http://www.w3.org/TR/xml/#NT-AttValue>
- # But reportedly it breaks some XML tools?
- # @todo FIXME: Is this really true?
+ // This is allowed per spec: <http://www.w3.org/TR/xml/#NT-AttValue>
+ // But reportedly it breaks some XML tools?
+ // @todo FIXME: Is this really true?
$map['<'] = '&lt;';
}
-
$ret .= " $key=$quote" . strtr( $value, $map ) . $quote;
}
}
@@ -604,7 +598,7 @@ class Html {
* @todo do some useful escaping as well, like if $contents contains
* literal "</script>" or (for XML) literal "]]>".
*
- * @param $contents string JavaScript
+ * @param string $contents JavaScript
* @return string Raw HTML
*/
public static function inlineScript( $contents ) {
@@ -647,7 +641,7 @@ class Html {
* (if any). TODO: do some useful escaping as well, like if $contents
* contains literal "</style>" (admittedly unlikely).
*
- * @param $contents string CSS
+ * @param string $contents CSS
* @param $media mixed A media type string, like 'screen'
* @return string Raw HTML
*/
@@ -689,7 +683,7 @@ class Html {
* @param $name string name attribute
* @param $value mixed value attribute
* @param $type string type attribute
- * @param $attribs array Associative array of miscellaneous extra
+ * @param array $attribs Associative array of miscellaneous extra
* attributes, passed to Html::element()
* @return string Raw HTML
*/
@@ -706,7 +700,7 @@ class Html {
*
* @param $name string name attribute
* @param $value string value attribute
- * @param $attribs array Associative array of miscellaneous extra
+ * @param array $attribs Associative array of miscellaneous extra
* attributes, passed to Html::element()
* @return string Raw HTML
*/
@@ -724,7 +718,7 @@ class Html {
*
* @param $name string name attribute
* @param $value string value attribute
- * @param $attribs array Associative array of miscellaneous extra
+ * @param array $attribs Associative array of miscellaneous extra
* attributes, passed to Html::element()
* @return string Raw HTML
*/
@@ -743,7 +737,7 @@ class Html {
}
}
- if (substr($value, 0, 1) == "\n") {
+ if ( substr( $value, 0, 1 ) == "\n" ) {
// Workaround for bug 12130: browsers eat the initial newline
// assuming that it's just for show, but they do keep the later
// newlines, which we may want to preserve during editing.
@@ -763,12 +757,12 @@ class Html {
* - label: text for label to add before the field
* - exclude: [optional] Array of namespace ids to exclude
* - disable: [optional] Array of namespace ids for which the option should be disabled in the selector
- * @param $selectAttribs array HTML attributes for the generated select element.
+ * @param array $selectAttribs HTML attributes for the generated select element.
* - id: [optional], default: 'namespace'
* - name: [optional], default: 'namespace'
* @return string HTML code to select a namespace.
*/
- public static function namespaceSelector( Array $params = array(), Array $selectAttribs = array() ) {
+ public static function namespaceSelector( array $params = array(), array $selectAttribs = array() ) {
global $wgContLang;
ksort( $selectAttribs );
@@ -802,7 +796,7 @@ class Html {
// Value is provided by user, the name shown is localized for the user.
$options[$params['all']] = wfMessage( 'namespacesall' )->text();
}
- // Add all namespaces as options (in the content langauge)
+ // Add all namespaces as options (in the content language)
$options += $wgContLang->getFormattedNamespaces();
// Convert $options to HTML and filter out namespaces below 0
@@ -811,10 +805,12 @@ class Html {
if ( $nsId < NS_MAIN || in_array( $nsId, $params['exclude'] ) ) {
continue;
}
- if ( $nsId === 0 ) {
+ if ( $nsId === NS_MAIN ) {
// For other namespaces use use the namespace prefix as label, but for
- // main we don't use "" but the user message descripting it (e.g. "(Main)" or "(Article)")
+ // main we don't use "" but the user message describing it (e.g. "(Main)" or "(Article)")
$nsName = wfMessage( 'blanknamespace' )->text();
+ } elseif ( is_int( $nsId ) ) {
+ $nsName = $wgContLang->convertNamespace( $nsId );
}
$optionsHtml[] = Html::element(
'option', array(
@@ -825,6 +821,14 @@ class Html {
);
}
+ if ( !array_key_exists( 'id', $selectAttribs ) ) {
+ $selectAttribs['id'] = 'namespace';
+ }
+
+ if ( !array_key_exists( 'name', $selectAttribs ) ) {
+ $selectAttribs['name'] = 'namespace';
+ }
+
$ret = '';
if ( isset( $params['label'] ) ) {
$ret .= Html::element(
@@ -848,7 +852,7 @@ class Html {
* Constructs the opening html-tag with necessary doctypes depending on
* global variables.
*
- * @param $attribs array Associative array of miscellaneous extra
+ * @param array $attribs Associative array of miscellaneous extra
* attributes, passed to Html::element() of html tag.
* @return string Raw HTML
*/
@@ -910,10 +914,10 @@ class Html {
/**
* Get HTML for an info box with an icon.
*
- * @param $text String: wikitext, get this with wfMessage()->plain()
- * @param $icon String: icon name, file in skins/common/images
- * @param $alt String: alternate text for the icon
- * @param $class String: additional class name to add to the wrapper div
+ * @param string $text wikitext, get this with wfMessage()->plain()
+ * @param string $icon icon name, file in skins/common/images
+ * @param string $alt alternate text for the icon
+ * @param string $class additional class name to add to the wrapper div
* @param $useStylePath
*
* @return string
@@ -925,7 +929,7 @@ class Html {
$icon = $wgStylePath.'/common/images/'.$icon;
}
- $s = Html::openElement( 'div', array( 'class' => "mw-infobox $class") );
+ $s = Html::openElement( 'div', array( 'class' => "mw-infobox $class" ) );
$s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-left' ) ).
Html::element( 'img',
@@ -947,4 +951,22 @@ class Html {
return $s;
}
+
+ /**
+ * Generate a srcset attribute value from an array mapping pixel densities
+ * to URLs. Note that srcset supports width and height values as well, which
+ * are not used here.
+ *
+ * @param array $urls
+ * @return string
+ */
+ static function srcSet( $urls ) {
+ $candidates = array();
+ foreach( $urls as $density => $url ) {
+ // Image candidate syntax per current whatwg live spec, 2012-09-23:
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-content-1.html#attr-img-srcset
+ $candidates[] = "{$url} {$density}x";
+ }
+ return implode( ", ", $candidates );
+ }
}
diff --git a/includes/HttpFunctions.old.php b/includes/HttpFunctions.old.php
deleted file mode 100644
index feb9b93c..00000000
--- a/includes/HttpFunctions.old.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * Class alias kept for backward compatibility.
- *
- * 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 HTTP
- */
-
-/**
- * HttpRequest was renamed to MWHttpRequest in order
- * to prevent conflicts with PHP's HTTP extension
- * which also defines an HttpRequest class.
- * http://www.php.net/manual/en/class.httprequest.php
- *
- * This is for backwards compatibility.
- * @since 1.17
- */
-class HttpRequest extends MWHttpRequest { }
diff --git a/includes/HttpFunctions.php b/includes/HttpFunctions.php
index 8e48da46..dc65c67e 100644
--- a/includes/HttpFunctions.php
+++ b/includes/HttpFunctions.php
@@ -35,9 +35,9 @@ class Http {
/**
* Perform an HTTP request
*
- * @param $method String: HTTP method. Usually GET/POST
- * @param $url String: full URL to act on. If protocol-relative, will be expanded to an http:// URL
- * @param $options Array: options to pass to MWHttpRequest object.
+ * @param string $method HTTP method. Usually GET/POST
+ * @param string $url full URL to act on. If protocol-relative, will be expanded to an http:// URL
+ * @param array $options options to pass to MWHttpRequest object.
* Possible keys for the array:
* - timeout Timeout length in seconds
* - postData An array of key-value pairs or a url-encoded form data
@@ -103,7 +103,7 @@ class Http {
/**
* Check if the URL can be served by localhost
*
- * @param $url String: full url to check
+ * @param string $url full url to check
* @return Boolean
*/
public static function isLocalURL( $url ) {
@@ -209,8 +209,8 @@ class MWHttpRequest {
public $status;
/**
- * @param $url String: url to use. If protocol-relative, will be expanded to an http:// URL
- * @param $options Array: (optional) extra params to pass (see Http::request())
+ * @param string $url url to use. If protocol-relative, will be expanded to an http:// URL
+ * @param array $options (optional) extra params to pass (see Http::request())
*/
protected function __construct( $url, $options = array() ) {
global $wgHTTPTimeout;
@@ -234,7 +234,7 @@ class MWHttpRequest {
}
$members = array( "postData", "proxy", "noProxy", "sslVerifyHost", "caInfo",
- "method", "followRedirects", "maxRedirects", "sslVerifyCert", "callback" );
+ "method", "followRedirects", "maxRedirects", "sslVerifyCert", "callback" );
foreach ( $members as $o ) {
if ( isset( $options[$o] ) ) {
@@ -263,8 +263,9 @@ class MWHttpRequest {
/**
* Generate a new request object
- * @param $url String: url to use
- * @param $options Array: (optional) extra params to pass (see Http::request())
+ * @param string $url url to use
+ * @param array $options (optional) extra params to pass (see Http::request())
+ * @throws MWException
* @return CurlHttpRequest|PhpHttpRequest
* @see MWHttpRequest::__construct
*/
@@ -273,7 +274,7 @@ class MWHttpRequest {
Http::$httpEngine = function_exists( 'curl_init' ) ? 'curl' : 'php';
} elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
throw new MWException( __METHOD__ . ': curl (http://php.net/curl) is not installed, but' .
- ' Http::$httpEngine is set to "curl"' );
+ ' Http::$httpEngine is set to "curl"' );
}
switch( Http::$httpEngine ) {
@@ -317,21 +318,24 @@ class MWHttpRequest {
public function proxySetup() {
global $wgHTTPProxy;
- if ( $this->proxy || !$this->noProxy ) {
+ // If there is an explicit proxy set and proxies are not disabled, then use it
+ if ( $this->proxy && !$this->noProxy ) {
return;
}
+ // Otherwise, fallback to $wgHTTPProxy/http_proxy (when set) if this is not a machine
+ // local URL and proxies are not disabled
if ( Http::isLocalURL( $this->url ) || $this->noProxy ) {
$this->proxy = '';
} elseif ( $wgHTTPProxy ) {
- $this->proxy = $wgHTTPProxy ;
+ $this->proxy = $wgHTTPProxy;
} elseif ( getenv( "http_proxy" ) ) {
$this->proxy = getenv( "http_proxy" );
}
}
/**
- * Set the refererer header
+ * Set the referrer header
*/
public function setReferer( $url ) {
$this->setHeader( 'Referer', $url );
@@ -393,6 +397,7 @@ class MWHttpRequest {
* will be aborted.
*
* @param $callback Callback
+ * @throws MWException
*/
public function setCallback( $callback ) {
if ( !is_callable( $callback ) ) {
@@ -445,7 +450,7 @@ class MWHttpRequest {
/**
* Parses the headers, including the HTTP status code and any
- * Set-Cookie headers. This function expectes the headers to be
+ * Set-Cookie headers. This function expects the headers to be
* found in an array in the member variable headerList.
*/
protected function parseHeader() {
@@ -501,7 +506,6 @@ class MWHttpRequest {
return (int)$this->respStatus;
}
-
/**
* Returns true if the last status code was a redirect.
*
@@ -579,8 +583,8 @@ class MWHttpRequest {
}
/**
- * Sets a cookie. Used before a request to set up any individual
- * cookies. Used internally after a request to parse the
+ * Sets a cookie. Used before a request to set up any individual
+ * cookies. Used internally after a request to parse the
* Set-Cookie headers.
* @see Cookie::set
* @param $name
@@ -631,14 +635,14 @@ class MWHttpRequest {
$locations = $headers[ 'location' ];
$domain = '';
$foundRelativeURI = false;
- $countLocations = count($locations);
+ $countLocations = count( $locations );
for ( $i = $countLocations - 1; $i >= 0; $i-- ) {
$url = parse_url( $locations[ $i ] );
- if ( isset($url[ 'host' ]) ) {
+ if ( isset( $url['host'] ) ) {
$domain = $url[ 'scheme' ] . '://' . $url[ 'host' ];
- break; //found correct URI (with host)
+ break; //found correct URI (with host)
} else {
$foundRelativeURI = true;
}
@@ -810,7 +814,7 @@ class PhpHttpRequest extends MWHttpRequest {
parent::execute();
if ( is_array( $this->postData ) ) {
- $this->postData = wfArrayToCGI( $this->postData );
+ $this->postData = wfArrayToCgi( $this->postData );
}
if ( $this->parsedUrl['scheme'] != 'http' &&
diff --git a/includes/IP.php b/includes/IP.php
index 10c707e7..72b9a52c 100644
--- a/includes/IP.php
+++ b/includes/IP.php
@@ -18,7 +18,7 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @author Antoine Musso <hashar at free dot fr>, Aaron Schulz
+ * @author Antoine Musso "<hashar at free dot fr>", Aaron Schulz
*/
// Some regex definition to "play" with IP address and IP address blocks
@@ -77,7 +77,7 @@ class IP {
* SIIT IPv4-translated addresses are rejected.
* Note: canonicalize() tries to convert translated addresses to IPv4.
*
- * @param $ip String: possible IP address
+ * @param string $ip possible IP address
* @return Boolean
*/
public static function isIPAddress( $ip ) {
@@ -88,7 +88,7 @@ class IP {
* Given a string, determine if it as valid IP in IPv6 only.
* Note: Unlike isValid(), this looks for networks too.
*
- * @param $ip String: possible IP address
+ * @param string $ip possible IP address
* @return Boolean
*/
public static function isIPv6( $ip ) {
@@ -99,7 +99,7 @@ class IP {
* Given a string, determine if it as valid IP in IPv4 only.
* Note: Unlike isValid(), this looks for networks too.
*
- * @param $ip String: possible IP address
+ * @param string $ip possible IP address
* @return Boolean
*/
public static function isIPv4( $ip ) {
@@ -137,7 +137,7 @@ class IP {
* IPv6 addresses in octet notation are expanded to 8 words.
* IPv4 addresses are just trimmed.
*
- * @param $ip String: IP address in quad or octet form (CIDR or not).
+ * @param string $ip IP address in quad or octet form (CIDR or not).
* @return String
*/
public static function sanitizeIP( $ip ) {
@@ -180,7 +180,7 @@ class IP {
$ip
);
}
- // Remove leading zereos from each bloc as needed
+ // Remove leading zeros from each bloc as needed
$ip = preg_replace( '/(^|:)0+(' . RE_IPV6_WORD . ')/', '$1$2', $ip );
return $ip;
}
@@ -241,7 +241,7 @@ class IP {
*
* A bare IPv6 address is accepted despite the lack of square brackets.
*
- * @param $both string The string with the host and port
+ * @param string $both The string with the host and port
* @return array
*/
public static function splitHostAndPort( $both ) {
@@ -316,7 +316,7 @@ class IP {
/**
* Convert an IPv4 or IPv6 hexadecimal representation back to readable format
*
- * @param $hex String: number, with "v6-" prefix if it is IPv6
+ * @param string $hex number, with "v6-" prefix if it is IPv6
* @return String: quad-dotted (IPv4) or octet notation (IPv6)
*/
public static function formatHex( $hex ) {
@@ -444,7 +444,7 @@ class IP {
* function for an IPv6 address will be prefixed with "v6-", a non-
* hexadecimal string which sorts after the IPv4 addresses.
*
- * @param $ip String: quad dotted/octet IP address.
+ * @param string $ip quad dotted/octet IP address.
* @return String
*/
public static function toHex( $ip ) {
@@ -462,7 +462,7 @@ class IP {
/**
* Given an IPv6 address in octet notation, returns a pure hex string.
*
- * @param $ip String: octet ipv6 IP address.
+ * @param string $ip octet ipv6 IP address.
* @return String: pure hex (uppercase)
*/
private static function IPv6ToRawHex( $ip ) {
@@ -482,7 +482,7 @@ class IP {
* Like ip2long() except that it actually works and has a consistent error return value.
* Comes from ProxyTools.php
*
- * @param $ip String: quad dotted IP address.
+ * @param string $ip quad dotted IP address.
* @return Mixed: string/int/false
*/
public static function toUnsigned( $ip ) {
@@ -509,7 +509,7 @@ class IP {
* Convert a network specification in CIDR notation
* to an integer network and a number of bits
*
- * @param $range String: IP with CIDR prefix
+ * @param string $range IP with CIDR prefix
* @return array(int or string, int)
*/
public static function parseCIDR( $range ) {
@@ -551,7 +551,7 @@ class IP {
* 2001:0db8:85a3::7344/96 CIDR
* 2001:0db8:85a3::7344 - 2001:0db8:85a3::7344 Explicit range
* 2001:0db8:85a3::7344 Single IP
- * @param $range String: IP range
+ * @param string $range IP range
* @return array(string, string)
*/
public static function parseRange( $range ) {
@@ -692,8 +692,8 @@ class IP {
/**
* Determine if a given IPv4/IPv6 address is in a given CIDR network
*
- * @param $addr String: the address to check against the given range.
- * @param $range String: the range to check the given address against.
+ * @param string $addr the address to check against the given range.
+ * @param string $range the range to check the given address against.
* @return Boolean: whether or not the given address is in the given range.
*/
public static function isInRange( $addr, $range ) {
@@ -710,11 +710,13 @@ class IP {
* This currently only checks a few IPV4-to-IPv6 related cases. More
* unusual representations may be added later.
*
- * @param $addr String: something that might be an IP address
+ * @param string $addr something that might be an IP address
* @return String: valid dotted quad IPv4 address or null
*/
public static function canonicalize( $addr ) {
- $addr = preg_replace( '/\%.*/','', $addr ); // remove zone info (bug 35738)
+ // remove zone info (bug 35738)
+ $addr = preg_replace( '/\%.*/', '', $addr );
+
if ( self::isValid( $addr ) ) {
return $addr;
}
@@ -740,13 +742,13 @@ class IP {
return long2ip( ( hexdec( $m[1] ) << 16 ) + hexdec( $m[2] ) );
}
- return null; // give up
+ return null; // give up
}
/**
- * Gets rid of uneeded numbers in quad-dotted/octet IP strings
+ * Gets rid of unneeded numbers in quad-dotted/octet IP strings
* For example, 127.111.113.151/24 -> 127.111.113.0/24
- * @param $range String: IP address to normalize
+ * @param string $range IP address to normalize
* @return string
*/
public static function sanitizeRange( $range ) {
diff --git a/includes/ImageGallery.php b/includes/ImageGallery.php
index 91c3190f..1556ad94 100644
--- a/includes/ImageGallery.php
+++ b/includes/ImageGallery.php
@@ -93,7 +93,7 @@ class ImageGallery {
/**
* Set the caption (as plain text)
*
- * @param $caption string Caption
+ * @param string $caption Caption
*/
function setCaption( $caption ) {
$this->mCaption = htmlspecialchars( $caption );
@@ -102,7 +102,7 @@ class ImageGallery {
/**
* Set the caption (as HTML)
*
- * @param $caption String: Caption
+ * @param string $caption Caption
*/
public function setCaptionHtml( $caption ) {
$this->mCaption = $caption;
@@ -161,7 +161,7 @@ class ImageGallery {
* @param $alt String: Alt text for the image
* @param $link String: Override image link (optional)
*/
- function add( $title, $html = '', $alt = '', $link = '') {
+ function add( $title, $html = '', $alt = '', $link = '' ) {
if ( $title instanceof File ) {
// Old calling convention
$title = $title->getTitle();
@@ -220,7 +220,7 @@ class ImageGallery {
* Note -- if taking from user input, you should probably run through
* Sanitizer::validateAttributes() first.
*
- * @param $attribs Array of HTML attribute pairs
+ * @param array $attribs of HTML attribute pairs
*/
function setAttributes( $attribs ) {
$this->mAttribs = $attribs;
@@ -238,8 +238,6 @@ class ImageGallery {
* @return string
*/
function toHTML() {
- global $wgLang;
-
if ( $this->mPerRow > 0 ) {
$maxwidth = $this->mPerRow * ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING + self::GB_BORDERS );
$oldStyle = isset( $this->mAttribs['style'] ) ? $this->mAttribs['style'] : '';
@@ -255,6 +253,7 @@ class ImageGallery {
$output .= "\n\t<li class='gallerycaption'>{$this->mCaption}</li>";
}
+ $lang = $this->getLang();
$params = array(
'width' => $this->mWidths,
'height' => $this->mHeights
@@ -337,7 +336,7 @@ class ImageGallery {
if( $this->mShowBytes ) {
if( $img ) {
- $fileSize = htmlspecialchars( $wgLang->formatSize( $img->getSize() ) );
+ $fileSize = htmlspecialchars( $lang->formatSize( $img->getSize() ) );
} else {
$fileSize = wfMessage( 'filemissing' )->escaped();
}
@@ -349,19 +348,19 @@ class ImageGallery {
$textlink = $this->mShowFilename ?
Linker::link(
$nt,
- htmlspecialchars( $wgLang->truncate( $nt->getText(), $this->mCaptionLength ) ),
+ htmlspecialchars( $lang->truncate( $nt->getText(), $this->mCaptionLength ) ),
array(),
array(),
array( 'known', 'noclasses' )
) . "<br />\n" :
- '' ;
+ '';
# ATTENTION: The newline after <div class="gallerytext"> is needed to accommodate htmltidy which
# in version 4.8.6 generated crackpot html in its absence, see:
# http://bugzilla.wikimedia.org/show_bug.cgi?id=1765 -Ævar
# Weird double wrapping (the extra div inside the li) needed due to FF2 bug
- # Can be safely removed if FF2 falls completely out of existance
+ # Can be safely removed if FF2 falls completely out of existence
$output .=
"\n\t\t" . '<li class="gallerybox" style="width: ' . ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING ) . 'px">'
. '<div style="width: ' . ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING ) . 'px">'
@@ -403,4 +402,15 @@ class ImageGallery {
: false;
}
+ /**
+ * Determines the correct language to be used for this image gallery
+ * @return Language object
+ */
+ private function getLang() {
+ global $wgLang;
+ return $this->mParser
+ ? $this->mParser->getTargetLanguage()
+ : $wgLang;
+ }
+
} //class
diff --git a/includes/ImagePage.php b/includes/ImagePage.php
index 6f1b1a15..b3a485aa 100644
--- a/includes/ImagePage.php
+++ b/includes/ImagePage.php
@@ -50,7 +50,7 @@ class ImagePage extends Article {
/**
* Constructor from a page id
- * @param $id Int article ID to load
+ * @param int $id article ID to load
* @return ImagePage|null
*/
public static function newFromID( $id ) {
@@ -108,7 +108,7 @@ class ImagePage extends Article {
$diff = $request->getVal( 'diff' );
$diffOnly = $request->getBool( 'diffonly', $this->getContext()->getUser()->getOption( 'diffonly' ) );
- if ( $this->getTitle()->getNamespace() != NS_FILE || ( isset( $diff ) && $diffOnly ) ) {
+ if ( $this->getTitle()->getNamespace() != NS_FILE || ( $diff !== null && $diffOnly ) ) {
parent::view();
return;
}
@@ -116,7 +116,7 @@ class ImagePage extends Article {
$this->loadFile();
if ( $this->getTitle()->getNamespace() == NS_FILE && $this->mPage->getFile()->getRedirected() ) {
- if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || isset( $diff ) ) {
+ if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || $diff !== null ) {
// mTitle is the same as the redirect target so ask Article
// to perform the redirect for us.
$request->setVal( 'diffonly', 'true' );
@@ -156,8 +156,10 @@ class ImagePage extends Article {
$pageLang = $this->getTitle()->getPageViewLanguage();
$out->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
'lang' => $pageLang->getHtmlCode(), 'dir' => $pageLang->getDir(),
- 'class' => 'mw-content-'.$pageLang->getDir() ) ) );
+ 'class' => 'mw-content-' . $pageLang->getDir() ) ) );
+
parent::view();
+
$out->addHTML( Xml::closeElement( 'div' ) );
} else {
# Just need to set the right headers
@@ -248,7 +250,7 @@ class ImagePage extends Article {
*
* @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
*
- * @param $metadata Array: the array containing the EXIF data
+ * @param array $metadata the array containing the EXIF data
* @return String The metadata table. This is treated as Wikitext (!)
*/
protected function makeMetadataTable( $metadata ) {
@@ -260,7 +262,7 @@ class ImagePage extends Article {
# @todo FIXME: Why is this using escapeId for a class?!
$class = Sanitizer::escapeId( $v['id'] );
if ( $type == 'collapsed' ) {
- $class .= ' collapsable';
+ $class .= ' collapsable'; // sic
}
$r .= "<tr class=\"$class\">\n";
$r .= "<th>{$v['name']}</th>\n";
@@ -272,18 +274,18 @@ class ImagePage extends Article {
}
/**
- * Overloading Article's getContent method.
+ * Overloading Article's getContentObject method.
*
* Omit noarticletext if sharedupload; text will be fetched from the
* shared upload server if possible.
* @return string
*/
- public function getContent() {
+ public function getContentObject() {
$this->loadFile();
if ( $this->mPage->getFile() && !$this->mPage->getFile()->isLocal() && 0 == $this->getID() ) {
- return '';
+ return null;
}
- return parent::getContent();
+ return parent::getContentObject();
}
protected function openShowImage() {
@@ -296,18 +298,7 @@ class ImagePage extends Article {
$dirmark = $lang->getDirMarkEntity();
$request = $this->getContext()->getRequest();
- $sizeSel = intval( $user->getOption( 'imagesize' ) );
- if ( !isset( $wgImageLimits[$sizeSel] ) ) {
- $sizeSel = User::getDefaultOption( 'imagesize' );
-
- // The user offset might still be incorrect, specially if
- // $wgImageLimits got changed (see bug #8858).
- if ( !isset( $wgImageLimits[$sizeSel] ) ) {
- // Default to the first offset in $wgImageLimits
- $sizeSel = 0;
- }
- }
- $max = $wgImageLimits[$sizeSel];
+ $max = $this->getImageLimitsFromOption( $user, 'imagesize' );
$maxWidth = $max[0];
$maxHeight = $max[1];
@@ -325,7 +316,8 @@ class ImagePage extends Article {
$height_orig = $this->displayImg->getHeight( $page );
$height = $height_orig;
- $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
+ $filename = wfEscapeWikiText( $this->displayImg->getName() );
+ $linktext = $filename;
wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
@@ -338,27 +330,24 @@ class ImagePage extends Article {
if ( $width > $maxWidth || $height > $maxHeight ) {
# Calculate the thumbnail size.
# First case, the limiting factor is the width, not the height.
- if ( $width / $height >= $maxWidth / $maxHeight ) {
- $height = round( $height * $maxWidth / $width );
+ if ( $width / $height >= $maxWidth / $maxHeight ) { // FIXME: Possible division by 0. bug 36911
+ $height = round( $height * $maxWidth / $width ); // FIXME: Possible division by 0. bug 36911
$width = $maxWidth;
# Note that $height <= $maxHeight now.
} else {
- $newwidth = floor( $width * $maxHeight / $height );
- $height = round( $height * $newwidth / $width );
+ $newwidth = floor( $width * $maxHeight / $height ); // FIXME: Possible division by 0. bug 36911
+ $height = round( $height * $newwidth / $width ); // FIXME: Possible division by 0. bug 36911
$width = $newwidth;
# Note that $height <= $maxHeight now, but might not be identical
# because of rounding.
}
- $msgbig = wfMessage( 'show-big-image' )->escaped();
+ $linktext = wfMessage( 'show-big-image' )->escaped();
if ( $this->displayImg->getRepo()->canTransformVia404() ) {
$thumbSizes = $wgImageLimits;
} else {
# Creating thumb links triggers thumbnail generation.
# Just generate the thumb for the current users prefs.
- $thumbOption = $user->getOption( 'thumbsize' );
- $thumbSizes = array( isset( $wgImageLimits[$thumbOption] )
- ? $wgImageLimits[$thumbOption]
- : $wgImageLimits[User::getDefaultOption( 'thumbsize' )] );
+ $thumbSizes = array( $this->getImageLimitsFromOption( $user, 'thumbsize' ) );
}
# Generate thumbnails or thumbnail links as needed...
$otherSizes = array();
@@ -366,12 +355,19 @@ class ImagePage extends Article {
if ( $size[0] < $width_orig && $size[1] < $height_orig
&& $size[0] != $width && $size[1] != $height )
{
- $otherSizes[] = $this->makeSizeLink( $params, $size[0], $size[1] );
+ $sizeLink = $this->makeSizeLink( $params, $size[0], $size[1] );
+ if ( $sizeLink ) {
+ $otherSizes[] = $sizeLink;
+ }
}
}
- $msgsmall = wfMessage( 'show-big-image-preview' )->
- rawParams( $this->makeSizeLink( $params, $width, $height ) )->
- parse();
+ $msgsmall = '';
+ $sizeLinkBigImagePreview = $this->makeSizeLink( $params, $width, $height );
+ if ( $sizeLinkBigImagePreview ) {
+ $msgsmall .= wfMessage( 'show-big-image-preview' )->
+ rawParams( $sizeLinkBigImagePreview )->
+ parse();
+ }
if ( count( $otherSizes ) ) {
$msgsmall .= ' ' .
Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
@@ -379,7 +375,7 @@ class ImagePage extends Article {
params( count( $otherSizes ) )->parse()
);
}
- } elseif ( $width == 0 && $height == 0 ){
+ } elseif ( $width == 0 && $height == 0 ) {
# Some sort of audio file that doesn't have dimensions
# Don't output a no hi res message for such a file
$msgsmall = '';
@@ -395,7 +391,6 @@ class ImagePage extends Article {
$params['height'] = $height;
$thumbnail = $this->displayImg->transform( $params );
- $showLink = true;
$anchorclose = Html::rawElement( 'div', array( 'class' => 'mw-filepage-resolutioninfo' ), $msgsmall );
$isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
@@ -469,48 +464,39 @@ class ImagePage extends Article {
"<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
);
}
- } else {
+ } elseif ( $this->displayImg->isSafeFile() ) {
# if direct link is allowed but it's not a renderable image, show an icon.
- if ( $this->displayImg->isSafeFile() ) {
- $icon = $this->displayImg->iconThumb();
+ $icon = $this->displayImg->iconThumb();
- $out->addHTML( '<div class="fullImageLink" id="file">' .
- $icon->toHtml( array( 'file-link' => true ) ) .
- "</div>\n" );
- }
-
- $showLink = true;
+ $out->addHTML( '<div class="fullImageLink" id="file">' .
+ $icon->toHtml( array( 'file-link' => true ) ) .
+ "</div>\n" );
}
- if ( $showLink ) {
- $filename = wfEscapeWikiText( $this->displayImg->getName() );
- $linktext = $filename;
- if ( isset( $msgbig ) ) {
- $linktext = wfEscapeWikiText( $msgbig );
- }
- $medialink = "[[Media:$filename|$linktext]]";
-
- if ( !$this->displayImg->isSafeFile() ) {
- $warning = wfMessage( 'mediawarning' )->plain();
- // dirmark is needed here to separate the file name, which
- // most likely ends in Latin characters, from the description,
- // which may begin with the file type. In RTL environment
- // this will get messy.
- // The dirmark, however, must not be immediately adjacent
- // to the filename, because it can get copied with it.
- // See bug 25277.
- $out->addWikiText( <<<EOT
+ $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
+
+ $medialink = "[[Media:$filename|$linktext]]";
+
+ if ( !$this->displayImg->isSafeFile() ) {
+ $warning = wfMessage( 'mediawarning' )->plain();
+ // dirmark is needed here to separate the file name, which
+ // most likely ends in Latin characters, from the description,
+ // which may begin with the file type. In RTL environment
+ // this will get messy.
+ // The dirmark, however, must not be immediately adjacent
+ // to the filename, because it can get copied with it.
+ // See bug 25277.
+ $out->addWikiText( <<<EOT
<div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
<div class="mediaWarning">$warning</div>
EOT
- );
- } else {
- $out->addWikiText( <<<EOT
+ );
+ } else {
+ $out->addWikiText( <<<EOT
<div class="fullMedia">{$medialink} {$dirmark}<span class="fileInfo">$longDesc</span>
</div>
EOT
- );
- }
+ );
}
// Add cannot animate thumbnail warning
@@ -545,7 +531,7 @@ EOT
array( 'delete', 'move' ),
$this->getTitle()->getPrefixedText(),
'',
- array( 'lim' => 10,
+ array( 'lim' => 10,
'conds' => array( "log_action != 'revision'" ),
'showIfEmpty' => false,
'msgKey' => array( 'moveddeleted-notice' )
@@ -564,7 +550,7 @@ EOT
$nofile = 'filepage-nofile';
}
// Note, if there is an image description page, but
- // no image, then this setRobotPolicy is overriden
+ // no image, then this setRobotPolicy is overridden
// by Article::View().
$out->setRobotPolicy( 'noindex,nofollow' );
$out->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
@@ -579,7 +565,7 @@ EOT
/**
* Creates an thumbnail of specified size and returns an HTML link to it
- * @param $params array Scaler parameters
+ * @param array $params Scaler parameters
* @param $width int
* @param $height int
* @return string
@@ -612,13 +598,13 @@ EOT
/* Add canonical to head if there is no local page for this shared file */
if( $descUrl && $this->mPage->getID() == 0 ) {
- $out->addLink( array( 'rel' => 'canonical', 'href' => $descUrl ) );
+ $out->setCanonicalUrl( $descUrl );
}
$wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
$repo = $this->mPage->getFile()->getRepo()->getDisplayName();
- if ( $descUrl && $descText && wfMessage( 'sharedupload-desc-here' )->plain() !== '-' ) {
+ if ( $descUrl && $descText && wfMessage( 'sharedupload-desc-here' )->plain() !== '-' ) {
$out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
} elseif ( $descUrl && wfMessage( 'sharedupload-desc-there' )->plain() !== '-' ) {
$out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
@@ -637,7 +623,7 @@ EOT
return $uploadTitle->getFullURL( array(
'wpDestFile' => $this->mPage->getFile()->getName(),
'wpForReUpload' => 1
- ) );
+ ) );
}
/**
@@ -794,9 +780,14 @@ EOT
$link = Linker::linkKnown( Title::makeTitle( $element->page_namespace, $element->page_title ) );
if ( !isset( $redirects[$element->page_title] ) ) {
+ # No redirects
$liContents = $link;
+ } elseif ( count( $redirects[$element->page_title] ) === 0 ) {
+ # Redirect without usages
+ $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams( $link, '' )->parse();
} else {
- $ul = "<ul class='mw-imagepage-redirectstofile'>\n";
+ # Redirect with usages
+ $li = '';
foreach ( $redirects[$element->page_title] as $row ) {
$currentCount++;
if ( $currentCount > $limit ) {
@@ -804,13 +795,18 @@ EOT
}
$link2 = Linker::linkKnown( Title::makeTitle( $row->page_namespace, $row->page_title ) );
- $ul .= Html::rawElement(
+ $li .= Html::rawElement(
'li',
array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
$link2
) . "\n";
}
- $ul .= '</ul>';
+
+ $ul = Html::rawElement(
+ 'ul',
+ array( 'class' => 'mw-imagepage-redirectstofile' ),
+ $li
+ ) . "\n";
$liContents = wfMessage( 'linkstoimage-redirect' )->rawParams(
$link, $ul )->parse();
}
@@ -908,6 +904,34 @@ EOT
return $a->page_namespace - $b->page_namespace;
}
}
+
+ /**
+ * Returns the corresponding $wgImageLimits entry for the selected user option
+ *
+ * @param $user User
+ * @param string $optionName Name of a option to check, typically imagesize or thumbsize
+ * @return array
+ * @since 1.21
+ */
+ public function getImageLimitsFromOption( $user, $optionName ) {
+ global $wgImageLimits;
+
+ $option = $user->getIntOption( $optionName );
+ if ( !isset( $wgImageLimits[$option] ) ) {
+ $option = User::getDefaultOption( $optionName );
+ }
+
+ // The user offset might still be incorrect, specially if
+ // $wgImageLimits got changed (see bug #8858).
+ if ( !isset( $wgImageLimits[$option] ) ) {
+ // Default to the first offset in $wgImageLimits
+ $option = 0;
+ }
+
+ return isset( $wgImageLimits[$option] )
+ ? $wgImageLimits[$option]
+ : array( 800, 600 ); // if nothing is set, fallback to a hardcoded default
+ }
}
/**
@@ -1041,9 +1065,9 @@ class ImageHistoryList extends ContextSource {
} else {
list( $ts, ) = explode( '!', $img, 2 );
$query = array(
- 'type' => 'oldimage',
+ 'type' => 'oldimage',
'target' => $this->title->getPrefixedText(),
- 'ids' => $ts,
+ 'ids' => $ts,
);
$del = Linker::revDeleteLink( $query,
$file->isDeleted( File::DELETED_RESTRICTED ), $canHide );
@@ -1163,7 +1187,7 @@ class ImageHistoryList extends ContextSource {
protected function getThumbForLine( $file ) {
$lang = $this->getLanguage();
$user = $this->getUser();
- if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE,$user )
+ if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE, $user )
&& !$file->isDeleted( File::DELETED_FILE ) )
{
$params = array(
@@ -1223,7 +1247,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
* @param ImagePage $imagePage
*/
function __construct( $imagePage ) {
- parent::__construct();
+ parent::__construct( $imagePage->getContext() );
$this->mImagePage = $imagePage;
$this->mTitle = clone ( $imagePage->getTitle() );
$this->mTitle->setFragment( '#filehistory' );
diff --git a/includes/Import.php b/includes/Import.php
index 480239fe..bb5d6349 100644
--- a/includes/Import.php
+++ b/includes/Import.php
@@ -225,7 +225,7 @@ class WikiImporter {
} else {
// set namespace to 'all', so the namespace check in processTitle() can passed
$this->setTargetNamespace( null );
- $this->mTargetRootPage = $title->getPrefixedDBKey();
+ $this->mTargetRootPage = $title->getPrefixedDBkey();
}
}
}
@@ -252,8 +252,16 @@ class WikiImporter {
* @return bool
*/
public function importRevision( $revision ) {
- $dbw = wfGetDB( DB_MASTER );
- return $dbw->deadlockLoop( array( $revision, 'importOldRevision' ) );
+ try {
+ $dbw = wfGetDB( DB_MASTER );
+ return $dbw->deadlockLoop( array( $revision, 'importOldRevision' ) );
+ } catch ( MWContentSerializationException $ex ) {
+ $this->notice( 'import-error-unserialize',
+ $revision->getTitle()->getPrefixedText(),
+ $revision->getID(),
+ $revision->getModel(),
+ $revision->getFormat() );
+ }
}
/**
@@ -322,8 +330,8 @@ class WikiImporter {
* @param $title Title
* @param $origTitle Title
* @param $revCount Integer
- * @param $sucCount Int: number of revisions for which callback returned true
- * @param $pageInfo Array: associative array of page information
+ * @param int $sucCount number of revisions for which callback returned true
+ * @param array $pageInfo associative array of page information
*/
private function pageOutCallback( $title, $origTitle, $revCount, $sucCount, $pageInfo ) {
if( isset( $this->mPageOutCallback ) ) {
@@ -392,7 +400,7 @@ class WikiImporter {
/** Left in for debugging */
private function dumpElement() {
static $lookup = null;
- if (!$lookup) {
+ if ( !$lookup ) {
$xmlReaderConstants = array(
"NONE",
"ELEMENT",
@@ -429,6 +437,7 @@ class WikiImporter {
/**
* Primary entry point
+ * @throws MWException
* @return bool
*/
public function doImport() {
@@ -441,7 +450,7 @@ class WikiImporter {
if ( $this->reader->name != 'mediawiki' ) {
libxml_disable_entity_loader( $oldDisable );
- throw new MWException( "Expected <mediawiki> tag, got " .
+ throw new MWException( "Expected <mediawiki> tag, got ".
$this->reader->name );
}
$this->debug( "<mediawiki> tag is correct." );
@@ -470,7 +479,7 @@ class WikiImporter {
$skip = true;
}
- if ($skip) {
+ if ( $skip ) {
$keepReading = $this->reader->next();
$skip = false;
$this->debug( "Skip" );
@@ -507,7 +516,7 @@ class WikiImporter {
while ( $this->reader->read() ) {
if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
- $this->reader->name == 'logitem') {
+ $this->reader->name == 'logitem' ) {
break;
}
@@ -570,7 +579,7 @@ class WikiImporter {
while ( $skip ? $this->reader->next() : $this->reader->read() ) {
if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
- $this->reader->name == 'page') {
+ $this->reader->name == 'page' ) {
break;
}
@@ -618,13 +627,13 @@ class WikiImporter {
$this->debug( "Enter revision handler" );
$revisionInfo = array();
- $normalFields = array( 'id', 'timestamp', 'comment', 'minor', 'text' );
+ $normalFields = array( 'id', 'timestamp', 'comment', 'minor', 'model', 'format', 'text' );
$skip = false;
while ( $skip ? $this->reader->next() : $this->reader->read() ) {
if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
- $this->reader->name == 'revision') {
+ $this->reader->name == 'revision' ) {
break;
}
@@ -663,6 +672,12 @@ class WikiImporter {
if ( isset( $revisionInfo['text'] ) ) {
$revision->setText( $revisionInfo['text'] );
}
+ if ( isset( $revisionInfo['model'] ) ) {
+ $revision->setModel( $revisionInfo['model'] );
+ }
+ if ( isset( $revisionInfo['format'] ) ) {
+ $revision->setFormat( $revisionInfo['format'] );
+ }
$revision->setTitle( $pageInfo['_title'] );
if ( isset( $revisionInfo['timestamp'] ) ) {
@@ -704,7 +719,7 @@ class WikiImporter {
while ( $skip ? $this->reader->next() : $this->reader->read() ) {
if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
- $this->reader->name == 'upload') {
+ $this->reader->name == 'upload' ) {
break;
}
@@ -801,7 +816,7 @@ class WikiImporter {
while ( $this->reader->read() ) {
if ( $this->reader->nodeType == XmlReader::END_ELEMENT &&
- $this->reader->name == 'contributor') {
+ $this->reader->name == 'contributor' ) {
break;
}
@@ -889,7 +904,7 @@ class UploadSourceAdapter {
* @return bool
*/
function stream_open( $path, $mode, $options, &$opened_path ) {
- $url = parse_url($path);
+ $url = parse_url( $path );
$id = $url['host'];
if ( !isset( self::$sourceRegistrations[$id] ) ) {
@@ -910,22 +925,22 @@ class UploadSourceAdapter {
$leave = false;
while ( !$leave && !$this->mSource->atEnd() &&
- strlen($this->mBuffer) < $count ) {
+ strlen( $this->mBuffer ) < $count ) {
$read = $this->mSource->readChunk();
- if ( !strlen($read) ) {
+ if ( !strlen( $read ) ) {
$leave = true;
}
$this->mBuffer .= $read;
}
- if ( strlen($this->mBuffer) ) {
+ if ( strlen( $this->mBuffer ) ) {
$return = substr( $this->mBuffer, 0, $count );
$this->mBuffer = substr( $this->mBuffer, $count );
}
- $this->mPosition += strlen($return);
+ $this->mPosition += strlen( $return );
return $return;
}
@@ -1015,7 +1030,10 @@ class WikiRevision {
var $timestamp = "20010115000000";
var $user = 0;
var $user_text = "";
+ var $model = null;
+ var $format = null;
var $text = "";
+ var $content = null;
var $comment = "";
var $minor = false;
var $type = "";
@@ -1072,6 +1090,20 @@ class WikiRevision {
}
/**
+ * @param $model
+ */
+ function setModel( $model ) {
+ $this->model = $model;
+ }
+
+ /**
+ * @param $format
+ */
+ function setFormat( $format ) {
+ $this->format = $format;
+ }
+
+ /**
* @param $text
*/
function setText( $text ) {
@@ -1194,12 +1226,55 @@ class WikiRevision {
/**
* @return string
+ *
+ * @deprecated Since 1.21, use getContent() instead.
*/
function getText() {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
return $this->text;
}
/**
+ * @return Content
+ */
+ function getContent() {
+ if ( is_null( $this->content ) ) {
+ $this->content =
+ ContentHandler::makeContent(
+ $this->text,
+ $this->getTitle(),
+ $this->getModel(),
+ $this->getFormat()
+ );
+ }
+
+ return $this->content;
+ }
+
+ /**
+ * @return String
+ */
+ function getModel() {
+ if ( is_null( $this->model ) ) {
+ $this->model = $this->getTitle()->getContentModel();
+ }
+
+ return $this->model;
+ }
+
+ /**
+ * @return String
+ */
+ function getFormat() {
+ if ( is_null( $this->model ) ) {
+ $this->format = ContentHandler::getForTitle( $this->getTitle() )->getDefaultFormat();
+ }
+
+ return $this->format;
+ }
+
+ /**
* @return string
*/
function getComment() {
@@ -1322,7 +1397,7 @@ class WikiRevision {
array( 'rev_page' => $pageId,
'rev_timestamp' => $dbw->timestamp( $this->timestamp ),
'rev_user_text' => $userText,
- 'rev_comment' => $this->getComment() ),
+ 'rev_comment' => $this->getComment() ),
__METHOD__
);
if( $prior ) {
@@ -1337,12 +1412,15 @@ class WikiRevision {
# @todo FIXME: Use original rev_id optionally (better for backups)
# Insert the row
$revision = new Revision( array(
- 'page' => $pageId,
- 'text' => $this->getText(),
- 'comment' => $this->getComment(),
- 'user' => $userId,
- 'user_text' => $userText,
- 'timestamp' => $this->timestamp,
+ 'title' => $this->title,
+ 'page' => $pageId,
+ 'content_model' => $this->getModel(),
+ 'content_format' => $this->getFormat(),
+ 'text' => $this->getContent()->serialize( $this->getFormat() ), //XXX: just set 'content' => $this->getContent()?
+ 'comment' => $this->getComment(),
+ 'user' => $userId,
+ 'user_text' => $userText,
+ 'timestamp' => $this->timestamp,
'minor_edit' => $this->minor,
) );
$revision->insertOn( $dbw );
@@ -1371,13 +1449,13 @@ class WikiRevision {
// @todo FIXME: Use original log ID (better for backups)
$prior = $dbw->selectField( 'logging', '1',
array( 'log_type' => $this->getType(),
- 'log_action' => $this->getAction(),
+ 'log_action' => $this->getAction(),
'log_timestamp' => $dbw->timestamp( $this->timestamp ),
'log_namespace' => $this->getTitle()->getNamespace(),
- 'log_title' => $this->getTitle()->getDBkey(),
- 'log_comment' => $this->getComment(),
+ 'log_title' => $this->getTitle()->getDBkey(),
+ 'log_comment' => $this->getComment(),
#'log_user_text' => $this->user_text,
- 'log_params' => $this->params ),
+ 'log_params' => $this->params ),
__METHOD__
);
// @todo FIXME: This could fail slightly for multiple matches :P
@@ -1460,7 +1538,7 @@ class WikiRevision {
}
if ( $status->isGood() ) {
- wfDebug( __METHOD__ . ": Succesful\n" );
+ wfDebug( __METHOD__ . ": Successful\n" );
return true;
} else {
wfDebug( __METHOD__ . ': failed: ' . $status->getXml() . "\n" );
@@ -1575,11 +1653,11 @@ class ImportStreamSource {
static function newFromUpload( $fieldname = "xmlimport" ) {
$upload =& $_FILES[$fieldname];
- if( !isset( $upload ) || !$upload['name'] ) {
+ if( $upload === null || !$upload['name'] ) {
return Status::newFatal( 'importnofile' );
}
if( !empty( $upload['error'] ) ) {
- switch($upload['error']){
+ switch( $upload['error'] ) {
case 1: # The uploaded file exceeds the upload_max_filesize directive in php.ini.
return Status::newFatal( 'importuploaderrorsize' );
case 2: # The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.
diff --git a/includes/Init.php b/includes/Init.php
index a8540f2c..66f9544d 100644
--- a/includes/Init.php
+++ b/includes/Init.php
@@ -120,7 +120,7 @@ class MWInit {
*
* require( MWInit::extSetupPath( 'ParserFunctions/ParserFunctions.php' ) );
*
- * @param $extRel string The path relative to the extensions directory, as defined by
+ * @param string $extRel The path relative to the extensions directory, as defined by
* $wgExtensionsDirectory.
*
* @return string
@@ -173,7 +173,7 @@ class MWInit {
}
/**
- * Determine wether a method exists within a class, using a method which works
+ * Determine whether a method exists within a class, using a method which works
* under HipHop.
*
* Note that under HipHop when method_exists is given a string for it's class
diff --git a/includes/Licenses.php b/includes/Licenses.php
index ba504a99..e8aee0b5 100644
--- a/includes/Licenses.php
+++ b/includes/Licenses.php
@@ -117,7 +117,7 @@ class Licenses extends HTMLFormField {
* @param $depth int
*/
protected function makeHtml( $tagset, $depth = 0 ) {
- foreach ( $tagset as $key => $val )
+ foreach ( $tagset as $key => $val ) {
if ( is_array( $val ) ) {
$this->html .= $this->outputOption(
$key, '',
@@ -135,6 +135,7 @@ class Licenses extends HTMLFormField {
$depth
);
}
+ }
}
/**
@@ -148,8 +149,10 @@ class Licenses extends HTMLFormField {
$msgObj = $this->msg( $message );
$text = $msgObj->exists() ? $msgObj->text() : $message;
$attribs['value'] = $value;
- if ( $value === $this->selected )
+ if ( $value === $this->selected ) {
$attribs['selected'] = 'selected';
+ }
+
$val = str_repeat( /* &nbsp */ "\xc2\xa0", $depth * 2 ) . $text;
return str_repeat( "\t", $depth ) . Xml::element( 'option', $attribs, $val ) . "\n";
}
@@ -208,7 +211,7 @@ class License {
/**
* Constructor
*
- * @param $str String: license name??
+ * @param string $str license name??
*/
function __construct( $str ) {
list( $text, $template ) = explode( '|', strrev( $str ), 2 );
diff --git a/includes/LinkFilter.php b/includes/LinkFilter.php
index 214f4959..11b65595 100644
--- a/includes/LinkFilter.php
+++ b/includes/LinkFilter.php
@@ -20,10 +20,9 @@
* @file
*/
-
/**
* Some functions to help implement an external link filter for spam control.
- *
+ *
* @todo implement the filter. Currently these are just some functions to help
* maintenance/cleanupSpam.php remove links to a single specified domain. The
* next thing is to implement functions for checking a given page against a big
@@ -34,13 +33,22 @@
class LinkFilter {
/**
- * Check whether $text contains a link to $filterEntry
+ * Check whether $content contains a link to $filterEntry
*
- * @param $text String: text to check
- * @param $filterEntry String: domainparts, see makeRegex() for more details
+ * @param $content Content: content to check
+ * @param string $filterEntry domainparts, see makeRegex() for more details
* @return Integer: 0 if no match or 1 if there's at least one match
*/
- static function matchEntry( $text, $filterEntry ) {
+ static function matchEntry( Content $content, $filterEntry ) {
+ if ( !( $content instanceof TextContent ) ) {
+ //TODO: handle other types of content too.
+ // Maybe create ContentHandler::matchFilter( LinkFilter ).
+ // Think about a common base class for LinkFilter and MagicWord.
+ return 0;
+ }
+
+ $text = $content->getNativeData();
+
$regex = LinkFilter::makeRegex( $filterEntry );
return preg_match( $regex, $text );
}
@@ -48,7 +56,7 @@ class LinkFilter {
/**
* Builds a regex pattern for $filterEntry.
*
- * @param $filterEntry String: URL, if it begins with "*.", it'll be
+ * @param string $filterEntry URL, if it begins with "*.", it'll be
* replaced to match any subdomain
* @return String: regex pattern, for preg_match()
*/
@@ -76,11 +84,11 @@ class LinkFilter {
*
* Asterisks in any other location are considered invalid.
*
- * @param $filterEntry String: domainparts
+ * @param string $filterEntry domainparts
* @param $prot String: protocol
* @return Array to be passed to DatabaseBase::buildLike() or false on error
*/
- public static function makeLikeArray( $filterEntry , $prot = 'http://' ) {
+ public static function makeLikeArray( $filterEntry, $prot = 'http://' ) {
$db = wfGetDB( DB_MASTER );
if ( substr( $filterEntry, 0, 2 ) == '*.' ) {
$subdomains = true;
@@ -109,18 +117,18 @@ class LinkFilter {
}
// Reverse the labels in the hostname, convert to lower case
// For emails reverse domainpart only
- if ( $prot == 'mailto:' && strpos($host, '@') ) {
- // complete email adress
+ if ( $prot == 'mailto:' && strpos( $host, '@' ) ) {
+ // complete email address
$mailparts = explode( '@', $host );
$domainpart = strtolower( implode( '.', array_reverse( explode( '.', $mailparts[1] ) ) ) );
$host = $domainpart . '@' . $mailparts[0];
$like = array( "$prot$host", $db->anyString() );
} elseif ( $prot == 'mailto:' ) {
- // domainpart of email adress only. do not add '.'
- $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
- $like = array( "$prot$host", $db->anyString() );
+ // domainpart of email address only. do not add '.'
+ $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
+ $like = array( "$prot$host", $db->anyString() );
} else {
- $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
+ $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
if ( substr( $host, -1, 1 ) !== '.' ) {
$host .= '.';
}
@@ -140,7 +148,7 @@ class LinkFilter {
/**
* Filters an array returned by makeLikeArray(), removing everything past first pattern placeholder.
*
- * @param $arr array: array to filter
+ * @param array $arr array to filter
* @return array filtered array
*/
public static function keepOneWildcard( $arr ) {
diff --git a/includes/Linker.php b/includes/Linker.php
index 56626bd7..972adfce 100644
--- a/includes/Linker.php
+++ b/includes/Linker.php
@@ -33,13 +33,13 @@ class Linker {
* Flags for userToolLinks()
*/
const TOOL_LINKS_NOBLOCK = 1;
- const TOOL_LINKS_EMAIL = 2;
+ const TOOL_LINKS_EMAIL = 2;
/**
- * Get the appropriate HTML attributes to add to the "a" element of an ex-
- * ternal link, as created by [wikisyntax].
+ * Get the appropriate HTML attributes to add to the "a" element of an
+ * external link, as created by [wikisyntax].
*
- * @param $class String: the contents of the class attribute; if an empty
+ * @param string $class the contents of the class attribute; if an empty
* string is passed, which is the default value, defaults to 'external'.
* @return string
* @deprecated since 1.18 Just pass the external class directly to something using Html::expandAttributes
@@ -50,13 +50,12 @@ class Linker {
}
/**
- * Get the appropriate HTML attributes to add to the "a" element of an in-
- * terwiki link.
+ * Get the appropriate HTML attributes to add to the "a" element of an interwiki link.
*
- * @param $title String: the title text for the link, URL-encoded (???) but
+ * @param string $title the title text for the link, URL-encoded (???) but
* not HTML-escaped
- * @param $unused String: unused
- * @param $class String: the contents of the class attribute; if an empty
+ * @param string $unused unused
+ * @param string $class the contents of the class attribute; if an empty
* string is passed, which is the default value, defaults to 'external'.
* @return string
*/
@@ -73,13 +72,12 @@ class Linker {
}
/**
- * Get the appropriate HTML attributes to add to the "a" element of an in-
- * ternal link.
+ * Get the appropriate HTML attributes to add to the "a" element of an internal link.
*
- * @param $title String: the title text for the link, URL-encoded (???) but
+ * @param string $title the title text for the link, URL-encoded (???) but
* not HTML-escaped
- * @param $unused String: unused
- * @param $class String: the contents of the class attribute, default none
+ * @param string $unused unused
+ * @param string $class the contents of the class attribute, default none
* @return string
*/
static function getInternalLinkAttributes( $title, $unused = null, $class = '' ) {
@@ -89,12 +87,12 @@ class Linker {
}
/**
- * Get the appropriate HTML attributes to add to the "a" element of an in-
- * ternal link, given the Title object for the page we want to link to.
+ * Get the appropriate HTML attributes to add to the "a" element of an internal
+ * link, given the Title object for the page we want to link to.
*
* @param $nt Title
- * @param $unused String: unused
- * @param $class String: the contents of the class attribute, default none
+ * @param string $unused unused
+ * @param string $class the contents of the class attribute, default none
* @param $title Mixed: optional (unescaped) string to use in the title
* attribute; if false, default to the name of the page we're linking to
* @return string
@@ -171,15 +169,15 @@ class Linker {
* the link text. This is raw HTML and will not be escaped. If null,
* defaults to the prefixed text of the Title; or if the Title is just a
* fragment, the contents of the fragment.
- * @param $customAttribs array A key => value array of extra HTML attri-
- * butes, such as title and class. (href is ignored.) Classes will be
+ * @param array $customAttribs A key => value array of extra HTML attributes,
+ * such as title and class. (href is ignored.) Classes will be
* merged with the default classes, while other attributes will replace
* default attributes. All passed attribute values will be HTML-escaped.
* A false attribute value means to suppress that attribute.
* @param $query array The query string to append to the URL
* you're linking to, in key => value array form. Query keys and values
* will be URL-encoded.
- * @param $options string|array String or array of strings:
+ * @param string|array $options String or array of strings:
* 'known': Page is known to exist, so don't check if it does.
* 'broken': Page is known not to exist, so don't check if it does.
* 'noclasses': Don't add any classes automatically (includes "new",
@@ -188,6 +186,8 @@ class Linker {
* cons.
* 'forcearticlepath': Use the article path always, even with a querystring.
* Has compatibility issues on some setups, so avoid wherever possible.
+ * 'http': Force a full URL with http:// as the scheme.
+ * 'https': Force a full URL with https:// as the scheme.
* @return string HTML <a> attribute
*/
public static function link(
@@ -273,7 +273,7 @@ class Linker {
* Returns the Url used to link to a Title
*
* @param $target Title
- * @param $query Array: query parameters
+ * @param array $query query parameters
* @param $options Array
* @return String
*/
@@ -294,7 +294,16 @@ class Linker {
$query['action'] = 'edit';
$query['redlink'] = '1';
}
- $ret = $target->getLinkURL( $query );
+
+ if ( in_array( 'http', $options ) ) {
+ $proto = PROTO_HTTP;
+ } elseif ( in_array( 'https', $options ) ) {
+ $proto = PROTO_HTTPS;
+ } else {
+ $proto = PROTO_RELATIVE;
+ }
+
+ $ret = $target->getLinkURL( $query, false, $proto );
wfProfileOut( __METHOD__ );
return $ret;
}
@@ -371,13 +380,13 @@ class Linker {
* @return string
*/
private static function linkText( $target ) {
- # We might be passed a non-Title by make*LinkObj(). Fail gracefully.
+ // We might be passed a non-Title by make*LinkObj(). Fail gracefully.
if ( !$target instanceof Title ) {
return '';
}
- # If the target is just a fragment, with no title, we return the frag-
- # ment text. Otherwise, we return the title text itself.
+ // If the target is just a fragment, with no title, we return the fragment
+ // text. Otherwise, we return the title text itself.
if ( $target->getPrefixedText() === '' && $target->getFragment() !== '' ) {
return htmlspecialchars( $target->getFragment() );
}
@@ -413,10 +422,10 @@ class Linker {
* despite $query not being used.
*
* @param $nt Title
- * @param $html String [optional]
- * @param $query String [optional]
- * @param $trail String [optional]
- * @param $prefix String [optional]
+ * @param string $html [optional]
+ * @param string $query [optional]
+ * @param string $trail [optional]
+ * @param string $prefix [optional]
*
*
* @return string
@@ -435,8 +444,9 @@ class Linker {
* a value indicating that the title object is invalid.
*
* @param $context IContextSource context to use to get the messages
- * @param $namespace int Namespace number
- * @param $title string Text of the title, without the namespace part
+ * @param int $namespace Namespace number
+ * @param string $title Text of the title, without the namespace part
+ * @return string
*/
public static function getInvalidTitleDescription( IContextSource $context, $namespace, $title ) {
global $wgContLang;
@@ -522,7 +532,7 @@ class Linker {
* @param $parser Parser object
* @param $title Title object of the file (not the currently viewed page)
* @param $file File object, or false if it doesn't exist
- * @param $frameParams Array: associative array of parameters external to the media handler.
+ * @param array $frameParams associative array of parameters external to the media handler.
* Boolean parameters are indicated by presence or absence, the value is arbitrary and
* will often be false.
* thumbnail If present, downscale and frame
@@ -540,13 +550,13 @@ class Linker {
* caption HTML for image caption.
* link-url URL to link to
* link-title Title object to link to
- * link-target Value for the target attribue, only with link-url
+ * link-target Value for the target attribute, only with link-url
* no-link Boolean, suppress description link
*
- * @param $handlerParams Array: associative array of media handler parameters, to be passed
+ * @param array $handlerParams associative array of media handler parameters, to be passed
* to transform(). Typical keys are "width" and "page".
- * @param $time String: timestamp of the file, set as false for current
- * @param $query String: query params for desc url
+ * @param string $time timestamp of the file, set as false for current
+ * @param string $query query params for desc url
* @param $widthOption: Used by the parser to remember the user preference thumbnailsize
* @since 1.20
* @return String: HTML for an image, with links, wrappers, etc.
@@ -588,9 +598,9 @@ class Linker {
$prefix = $postfix = '';
if ( 'center' == $fp['align'] ) {
- $prefix = '<div class="center">';
+ $prefix = '<div class="center">';
$postfix = '</div>';
- $fp['align'] = 'none';
+ $fp['align'] = 'none';
}
if ( $file && !isset( $hp['width'] ) ) {
if ( isset( $hp['height'] ) && $file->isVectorized() ) {
@@ -604,7 +614,7 @@ class Linker {
if ( isset( $fp['thumbnail'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
global $wgThumbLimits, $wgThumbUpright;
- if ( !isset( $widthOption ) || !isset( $wgThumbLimits[$widthOption] ) ) {
+ if ( $widthOption === null || !isset( $wgThumbLimits[$widthOption] ) ) {
$widthOption = User::getDefaultOption( 'thumbsize' );
}
@@ -648,7 +658,7 @@ class Linker {
if ( $file && isset( $fp['frameless'] ) ) {
$srcWidth = $file->getWidth( $page );
# For "frameless" option: do not present an image bigger than the source (for bitmap-style images)
- # This is the same behaviour as the "thumb" option does it already.
+ # This is the same behavior as the "thumb" option does it already.
if ( $srcWidth && !$file->mustRender() && $hp['width'] > $srcWidth ) {
$hp['width'] = $srcWidth;
}
@@ -664,12 +674,14 @@ class Linker {
if ( !$thumb ) {
$s = self::makeBrokenImageLinkObj( $title, $fp['title'], '', '', '', $time == true );
} else {
+ self::processResponsiveImages( $file, $thumb, $hp );
$params = array(
'alt' => $fp['alt'],
'title' => $fp['title'],
'valign' => isset( $fp['valign'] ) ? $fp['valign'] : false,
'img-class' => $fp['class'] );
if ( isset( $fp['border'] ) ) {
+ // TODO: BUG? Both values are identical
$params['img-class'] .= ( $params['img-class'] !== '' ) ? ' thumbborder' : 'thumbborder';
}
$params = self::getImageLinkMTOParams( $fp, $query, $parser ) + $params;
@@ -696,8 +708,8 @@ class Linker {
/**
* Get the link parameters for MediaTransformOutput::toHtml() from given
* frame parameters supplied by the Parser.
- * @param $frameParams array The frame parameters
- * @param $query string An optional query string to add to description page links
+ * @param array $frameParams The frame parameters
+ * @param string $query An optional query string to add to description page links
* @return array
*/
private static function getImageLinkMTOParams( $frameParams, $query = '', $parser = null ) {
@@ -711,7 +723,7 @@ class Linker {
$extLinkAttrs = $parser->getExternalLinkAttribs( $frameParams['link-url'] );
foreach ( $extLinkAttrs as $name => $val ) {
// Currently could include 'rel' and 'target'
- $mtoParams['parser-extlink-'.$name] = $val;
+ $mtoParams['parser-extlink-' . $name] = $val;
}
}
} elseif ( isset( $frameParams['link-title'] ) && $frameParams['link-title'] !== '' ) {
@@ -738,7 +750,7 @@ class Linker {
* @return mixed
*/
public static function makeThumbLinkObj( Title $title, $file, $label = '', $alt,
- $align = 'right', $params = array(), $framed = false , $manualthumb = "" )
+ $align = 'right', $params = array(), $framed = false, $manualthumb = "" )
{
$frameParams = array(
'alt' => $alt,
@@ -784,6 +796,7 @@ class Linker {
$hp['width'] = isset( $fp['upright'] ) ? 130 : 180;
}
$thumb = false;
+ $noscale = false;
if ( !$exists ) {
$outerWidth = $hp['width'] + 2;
@@ -802,9 +815,10 @@ class Linker {
} elseif ( isset( $fp['framed'] ) ) {
// Use image dimensions, don't scale
$thumb = $file->getUnscaledThumb( $hp );
+ $noscale = true;
} else {
# Do not present an image bigger than the source, for bitmap-style images
- # This is a hack to maintain compatibility with arbitrary pre-1.10 behaviour
+ # This is a hack to maintain compatibility with arbitrary pre-1.10 behavior
$srcWidth = $file->getWidth( $page );
if ( $srcWidth && !$file->mustRender() && $hp['width'] > $srcWidth ) {
$hp['width'] = $srcWidth;
@@ -835,6 +849,9 @@ class Linker {
$s .= wfMessage( 'thumbnail_error', '' )->escaped();
$zoomIcon = '';
} else {
+ if ( !$noscale ) {
+ self::processResponsiveImages( $file, $thumb, $hp );
+ }
$params = array(
'alt' => $fp['alt'],
'title' => $fp['title'],
@@ -862,11 +879,42 @@ class Linker {
}
/**
+ * Process responsive images: add 1.5x and 2x subimages to the thumbnail, where
+ * applicable.
+ *
+ * @param File $file
+ * @param MediaOutput $thumb
+ * @param array $hp image parameters
+ */
+ protected static function processResponsiveImages( $file, $thumb, $hp ) {
+ global $wgResponsiveImages;
+ if ( $wgResponsiveImages ) {
+ $hp15 = $hp;
+ $hp15['width'] = round( $hp['width'] * 1.5 );
+ $hp20 = $hp;
+ $hp20['width'] = $hp['width'] * 2;
+ if ( isset( $hp['height'] ) ) {
+ $hp15['height'] = round( $hp['height'] * 1.5 );
+ $hp20['height'] = $hp['height'] * 2;
+ }
+
+ $thumb15 = $file->transform( $hp15 );
+ $thumb20 = $file->transform( $hp20 );
+ if ( $thumb15->url !== $thumb->url ) {
+ $thumb->responsiveUrls['1.5'] = $thumb15->url;
+ }
+ if ( $thumb20->url !== $thumb->url ) {
+ $thumb->responsiveUrls['2'] = $thumb20->url;
+ }
+ }
+ }
+
+ /**
* Make a "broken" link to an image
*
* @param $title Title object
- * @param $label String: link label (plain text)
- * @param $query String: query string
+ * @param string $label link label (plain text)
+ * @param string $query query string
* @param $unused1 Unused parameter kept for b/c
* @param $unused2 Unused parameter kept for b/c
* @param $time Boolean: a file of a certain timestamp was requested
@@ -898,17 +946,17 @@ class Linker {
return '<a href="' . htmlspecialchars( $href ) . '" class="new" title="' .
htmlspecialchars( $title->getPrefixedText(), ENT_QUOTES ) . '">' .
$encLabel . '</a>';
- } else {
- wfProfileOut( __METHOD__ );
- return self::linkKnown( $title, $encLabel, array(), wfCgiToArray( $query ) );
}
+
+ wfProfileOut( __METHOD__ );
+ return self::linkKnown( $title, $encLabel, array(), wfCgiToArray( $query ) );
}
/**
* Get the URL to upload a certain file
*
* @param $destFile Title object of the file to upload
- * @param $query String: urlencoded query string to prepend
+ * @param string $query urlencoded query string to prepend
* @return String: urlencoded URL
*/
protected static function getUploadUrl( $destFile, $query = '' ) {
@@ -931,8 +979,8 @@ class Linker {
* Create a direct link to a given uploaded file.
*
* @param $title Title object.
- * @param $html String: pre-sanitized HTML
- * @param $time string: MW timestamp of file creation time
+ * @param string $html pre-sanitized HTML
+ * @param string $time MW timestamp of file creation time
* @return String: HTML
*/
public static function makeMediaLinkObj( $title, $html = '', $time = false ) {
@@ -946,7 +994,7 @@ class Linker {
*
* @param $title Title object.
* @param $file File|bool mixed File object or false
- * @param $html String: pre-sanitized HTML
+ * @param string $html pre-sanitized HTML
* @return String: HTML
*
* @todo Handle invalid or missing images better.
@@ -979,19 +1027,21 @@ class Linker {
$key = strtolower( $name );
}
- return self::linkKnown( SpecialPage::getTitleFor( $name ) , wfMessage( $key )->text() );
+ return self::linkKnown( SpecialPage::getTitleFor( $name ), wfMessage( $key )->text() );
}
/**
* Make an external link
- * @param $url String: URL to link to
- * @param $text String: text of link
+ * @param string $url URL to link to
+ * @param string $text text of link
* @param $escape Boolean: do we escape the link text?
- * @param $linktype String: type of external link. Gets added to the classes
- * @param $attribs Array of extra attributes to <a>
+ * @param string $linktype type of external link. Gets added to the classes
+ * @param array $attribs of extra attributes to <a>
+ * @param $title Title|null Title object used for title specific link attributes
* @return string
*/
- public static function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array() ) {
+ public static function makeExternalLink( $url, $text, $escape = true, $linktype = '', $attribs = array(), $title = null ) {
+ global $wgTitle;
$class = "external";
if ( $linktype ) {
$class .= " $linktype";
@@ -1004,6 +1054,11 @@ class Linker {
if ( $escape ) {
$text = htmlspecialchars( $text );
}
+
+ if ( !$title ) {
+ $title = $wgTitle;
+ }
+ $attribs['rel'] = Parser::getExternalLinkRel( $url, $title );
$link = '';
$success = wfRunHooks( 'LinkerMakeExternalLink',
array( &$url, &$text, &$link, &$attribs, $linktype ) );
@@ -1018,14 +1073,17 @@ class Linker {
/**
* Make user link (or user contributions for unregistered users)
* @param $userId Integer: user id in database.
- * @param $userName String: user name in database.
- * @param $altUserName String: text to display instead of the user name (optional)
+ * @param string $userName user name in database.
+ * @param string $altUserName text to display instead of the user name (optional)
* @return String: HTML fragment
* @since 1.19 Method exists for a long time. $altUserName was added in 1.19.
*/
public static function userLink( $userId, $userName, $altUserName = false ) {
if ( $userId == 0 ) {
$page = SpecialPage::getTitleFor( 'Contributions', $userName );
+ if ( $altUserName === false ) {
+ $altUserName = IP::prettifyIP( $userName );
+ }
} else {
$page = Title::makeTitle( NS_USER, $userName );
}
@@ -1041,7 +1099,7 @@ class Linker {
* Generate standard user tool links (talk, contributions, block link, etc.)
*
* @param $userId Integer: user identifier
- * @param $userText String: user name or IP address
+ * @param string $userText user name or IP address
* @param $redContribsWhenNoEdits Boolean: should the contributions link be
* red if the user has no edits?
* @param $flags Integer: customisation flags (e.g. Linker::TOOL_LINKS_NOBLOCK and Linker::TOOL_LINKS_EMAIL)
@@ -1064,8 +1122,11 @@ class Linker {
// check if the user has an edit
$attribs = array();
if ( $redContribsWhenNoEdits ) {
- $count = !is_null( $edits ) ? $edits : User::edits( $userId );
- if ( $count == 0 ) {
+ if ( intval( $edits ) === 0 && $edits !== 0 ) {
+ $user = User::newFromId( $userId );
+ $edits = $user->getEditCount();
+ }
+ if ( $edits === 0 ) {
$attribs['class'] = 'new';
}
}
@@ -1096,7 +1157,7 @@ class Linker {
/**
* Alias for userToolLinks( $userId, $userText, true );
* @param $userId Integer: user identifier
- * @param $userText String: user name or IP address
+ * @param string $userText user name or IP address
* @param $edits Integer: user edit count (optional, for performance)
* @return String
*/
@@ -1104,10 +1165,9 @@ class Linker {
return self::userToolLinks( $userId, $userText, true, 0, $edits );
}
-
/**
* @param $userId Integer: user id in database.
- * @param $userText String: user name in database.
+ * @param string $userText user name in database.
* @return String: HTML fragment with user talk link
*/
public static function userTalkLink( $userId, $userText ) {
@@ -1118,7 +1178,7 @@ class Linker {
/**
* @param $userId Integer: userid
- * @param $userText String: user name in database.
+ * @param string $userText user name in database.
* @return String: HTML fragment with block link
*/
public static function blockLink( $userId, $userText ) {
@@ -1129,7 +1189,7 @@ class Linker {
/**
* @param $userId Integer: userid
- * @param $userText String: user name in database.
+ * @param string $userText user name in database.
* @return String: HTML fragment with e-mail user link
*/
public static function emailLink( $userId, $userText ) {
@@ -1186,7 +1246,7 @@ class Linker {
/**
* This function is called by all recent changes variants, by the page history,
* and by the user contributions list. It is responsible for formatting edit
- * comments. It escapes any HTML in the comment, but adds some CSS to format
+ * summaries. It escapes any HTML in the summary, but adds some CSS to format
* auto-generated comments (from section editing) and formats [[wikilinks]].
*
* @author Erik Moeller <moeller@scireview.de>
@@ -1223,13 +1283,14 @@ class Linker {
static $autocommentLocal;
/**
+ * Converts autogenerated comments in edit summaries into section links.
* The pattern for autogen comments is / * foo * /, which makes for
* some nasty regex.
* We look for all comments, match any text before and after the comment,
* add a separator where needed and format the comment itself with CSS
* Called by Linker::formatComment.
*
- * @param $comment String: comment text
+ * @param string $comment comment text
* @param $title Title|null An optional title object used to links to sections
* @param $local Boolean: whether section links should refer to local page
* @return String: formatted comment
@@ -1248,6 +1309,7 @@ class Linker {
}
/**
+ * Helper function for Linker::formatAutocomments
* @param $match
* @return string
*/
@@ -1312,7 +1374,7 @@ class Linker {
* is ignored
*
* @todo FIXME: Doesn't handle sub-links as in image thumb texts like the main parser
- * @param $comment String: text to format links in
+ * @param string $comment text to format links in
* @param $title Title|null An optional title object used to links to sections
* @param $local Boolean: whether section links should refer to local page
* @return String
@@ -1502,7 +1564,7 @@ class Linker {
public static function commentBlock( $comment, $title = null, $local = false ) {
// '*' used to be the comment inserted by the software way back
// in antiquity in case none was provided, here for backwards
- // compatability, acc. to brion -ævar
+ // compatibility, acc. to brion -ævar
if ( $comment == '' || $comment == '*' ) {
return '';
} else {
@@ -1600,7 +1662,7 @@ class Linker {
/**
* Wraps the TOC in a table and provides the hide/collapse javascript.
*
- * @param $toc String: html of the Table Of Contents
+ * @param string $toc html of the Table Of Contents
* @param $lang String|Language|false: Language for the toc title, defaults to user language
* @return String: full html of the TOC
*/
@@ -1608,18 +1670,17 @@ class Linker {
$lang = wfGetLangObj( $lang );
$title = wfMessage( 'toc' )->inLanguage( $lang )->escaped();
- return
- '<table id="toc" class="toc"><tr><td>'
- . '<div id="toctitle"><h2>' . $title . "</h2></div>\n"
- . $toc
- . "</ul>\n</td></tr></table>\n";
+ return '<table id="toc" class="toc"><tr><td>'
+ . '<div id="toctitle"><h2>' . $title . "</h2></div>\n"
+ . $toc
+ . "</ul>\n</td></tr></table>\n";
}
/**
* Generate a table of contents from a section tree
* Currently unused.
*
- * @param $tree array Return value of ParserOutput::getSections()
+ * @param array $tree Return value of ParserOutput::getSections()
* @return String: HTML fragment
*/
public static function generateTOC( $tree ) {
@@ -1647,12 +1708,12 @@ class Linker {
* Create a headline for content
*
* @param $level Integer: the level of the headline (1-6)
- * @param $attribs String: any attributes for the headline, starting with
+ * @param string $attribs any attributes for the headline, starting with
* a space and ending with '>'
* This *must* be at least '>' for no attribs
- * @param $anchor String: the anchor to give the headline (the bit after the #)
- * @param $html String: html for the text of the header
- * @param $link String: HTML to add for the section edit link
+ * @param string $anchor the anchor to give the headline (the bit after the #)
+ * @param string $html html for the text of the header
+ * @param string $link HTML to add for the section edit link
* @param $legacyAnchor Mixed: a second, optional anchor to give for
* backward compatibility (false to omit)
*
@@ -1699,19 +1760,101 @@ class Linker {
* changes, so this allows sysops to combat a busy vandal without bothering
* other users.
*
+ * If the option verify is set this function will return the link only in case the
+ * revision can be reverted. Please note that due to performance limitations
+ * it might be assumed that a user isn't the only contributor of a page while
+ * (s)he is, which will lead to useless rollback links. Furthermore this wont
+ * work if $wgShowRollbackEditCount is disabled, so this can only function
+ * as an additional check.
+ *
+ * If the option noBrackets is set the rollback link wont be enclosed in []
+ *
* @param $rev Revision object
* @param $context IContextSource context to use or null for the main context.
+ * @param $options array
* @return string
*/
- public static function generateRollback( $rev, IContextSource $context = null ) {
+ public static function generateRollback( $rev, IContextSource $context = null, $options = array( 'verify' ) ) {
if ( $context === null ) {
$context = RequestContext::getMain();
}
+ $editCount = false;
+ if ( in_array( 'verify', $options ) ) {
+ $editCount = self::getRollbackEditCount( $rev, true );
+ if ( $editCount === false ) {
+ return '';
+ }
+ }
+
+ $inner = self::buildRollbackLink( $rev, $context, $editCount );
+
+ if ( !in_array( 'noBrackets', $options ) ) {
+ $inner = $context->msg( 'brackets' )->rawParams( $inner )->plain();
+ }
- return '<span class="mw-rollback-link">'
- . $context->msg( 'brackets' )->rawParams(
- self::buildRollbackLink( $rev, $context ) )->plain()
- . '</span>';
+ return '<span class="mw-rollback-link">' . $inner . '</span>';
+ }
+
+ /**
+ * This function will return the number of revisions which a rollback
+ * would revert and, if $verify is set it will verify that a revision
+ * can be reverted (that the user isn't the only contributor and the
+ * revision we might rollback to isn't deleted). These checks can only
+ * function as an additional check as this function only checks against
+ * the last $wgShowRollbackEditCount edits.
+ *
+ * Returns null if $wgShowRollbackEditCount is disabled or false if $verify
+ * is set and the user is the only contributor of the page.
+ *
+ * @param $rev Revision object
+ * @param bool $verify Try to verify that this revision can really be rolled back
+ * @return integer|bool|null
+ */
+ public static function getRollbackEditCount( $rev, $verify ) {
+ global $wgShowRollbackEditCount;
+ if ( !is_int( $wgShowRollbackEditCount ) || !$wgShowRollbackEditCount > 0 ) {
+ // Nothing has happened, indicate this by returning 'null'
+ return null;
+ }
+
+ $dbr = wfGetDB( DB_SLAVE );
+
+ // Up to the value of $wgShowRollbackEditCount revisions are counted
+ $res = $dbr->select(
+ 'revision',
+ array( 'rev_user_text', 'rev_deleted' ),
+ // $rev->getPage() returns null sometimes
+ array( 'rev_page' => $rev->getTitle()->getArticleID() ),
+ __METHOD__,
+ array(
+ 'USE INDEX' => array( 'revision' => 'page_timestamp' ),
+ 'ORDER BY' => 'rev_timestamp DESC',
+ 'LIMIT' => $wgShowRollbackEditCount + 1
+ )
+ );
+
+ $editCount = 0;
+ $moreRevs = false;
+ foreach ( $res as $row ) {
+ if ( $rev->getRawUserText() != $row->rev_user_text ) {
+ if ( $verify && ( $row->rev_deleted & Revision::DELETED_TEXT || $row->rev_deleted & Revision::DELETED_USER ) ) {
+ // If the user or the text of the revision we might rollback to is deleted in some way we can't rollback
+ // Similar to the sanity checks in WikiPage::commitRollback
+ return false;
+ }
+ $moreRevs = true;
+ break;
+ }
+ $editCount++;
+ }
+
+ if ( $verify && $editCount <= $wgShowRollbackEditCount && !$moreRevs ) {
+ // We didn't find at least $wgShowRollbackEditCount revisions made by the current user
+ // and there weren't any other revisions. That means that the current user is the only
+ // editor, so we can't rollback
+ return false;
+ }
+ return $editCount;
}
/**
@@ -1719,11 +1862,12 @@ class Linker {
*
* @param $rev Revision object
* @param $context IContextSource context to use or null for the main context.
+ * @param $editCount integer Number of edits that would be reverted
* @return String: HTML fragment
*/
- public static function buildRollbackLink( $rev, IContextSource $context = null ) {
+ public static function buildRollbackLink( $rev, IContextSource $context = null, $editCount = false ) {
global $wgShowRollbackEditCount, $wgMiserMode;
-
+
// To config which pages are effected by miser mode
$disableRollbackEditCountSpecialPage = array( 'Recentchanges', 'Watchlist' );
@@ -1753,25 +1897,8 @@ class Linker {
}
if( !$disableRollbackEditCount && is_int( $wgShowRollbackEditCount ) && $wgShowRollbackEditCount > 0 ) {
- $dbr = wfGetDB( DB_SLAVE );
-
- // Up to the value of $wgShowRollbackEditCount revisions are counted
- $res = $dbr->select( 'revision',
- array( 'rev_id', 'rev_user_text' ),
- // $rev->getPage() returns null sometimes
- array( 'rev_page' => $rev->getTitle()->getArticleID() ),
- __METHOD__,
- array( 'USE INDEX' => 'page_timestamp',
- 'ORDER BY' => 'rev_timestamp DESC',
- 'LIMIT' => $wgShowRollbackEditCount + 1 )
- );
-
- $editCount = 0;
- while( $row = $dbr->fetchObject( $res ) ) {
- if( $rev->getUserText() != $row->rev_user_text ) {
- break;
- }
- $editCount++;
+ if ( !is_numeric( $editCount ) ) {
+ $editCount = self::getRollbackEditCount( $rev, false );
}
if( $editCount > $wgShowRollbackEditCount ) {
@@ -1801,13 +1928,19 @@ class Linker {
/**
* Returns HTML for the "templates used on this page" list.
*
- * @param $templates Array of templates from Article::getUsedTemplate
- * or similar
- * @param $preview Boolean: whether this is for a preview
- * @param $section Boolean: whether this is for a section edit
+ * Make an HTML list of templates, and then add a "More..." link at
+ * the bottom. If $more is null, do not add a "More..." link. If $more
+ * is a Title, make a link to that title and use it. If $more is a string,
+ * directly paste it in as the link (escaping needs to be done manually).
+ * Finally, if $more is a Message, call toString().
+ *
+ * @param array $templates Array of templates from Article::getUsedTemplate or similar
+ * @param bool $preview Whether this is for a preview
+ * @param bool $section Whether this is for a section edit
+ * @param Title|Message|string|null $more An escaped link for "More..." of the templates
* @return String: HTML output
*/
- public static function formatTemplates( $templates, $preview = false, $section = false ) {
+ public static function formatTemplates( $templates, $preview = false, $section = false, $more = null ) {
wfProfileIn( __METHOD__ );
$outText = '';
@@ -1858,18 +1991,29 @@ class Linker {
array( 'action' => 'edit' )
);
}
- $outText .= '<li>' . self::link( $titleObj ) . ' (' . $editLink . ') ' . $protected . '</li>';
+ $outText .= '<li>' . self::link( $titleObj )
+ . wfMessage( 'word-separator' )->escaped()
+ . wfMessage( 'parentheses' )->rawParams( $editLink )->escaped()
+ . wfMessage( 'word-separator' )->escaped()
+ . $protected . '</li>';
}
+
+ if ( $more instanceof Title ) {
+ $outText .= '<li>' . self::link( $more, wfMessage( 'moredotdotdot' ) ) . '</li>';
+ } elseif ( $more ) {
+ $outText .= "<li>$more</li>";
+ }
+
$outText .= '</ul>';
}
- wfProfileOut( __METHOD__ );
+ wfProfileOut( __METHOD__ );
return $outText;
}
/**
* Returns HTML for the "hidden categories on this page" list.
*
- * @param $hiddencats Array of hidden categories from Article::getHiddenCategories
+ * @param array $hiddencats of hidden categories from Article::getHiddenCategories
* or similar
* @return String: HTML output
*/
@@ -1888,7 +2032,7 @@ class Linker {
}
$outText .= '</ul>';
}
- wfProfileOut( __METHOD__ );
+ wfProfileOut( __METHOD__ );
return $outText;
}
@@ -1896,7 +2040,7 @@ class Linker {
* Format a size in bytes for output, using an appropriate
* unit (B, KB, MB or GB) according to the magnitude in question
*
- * @param $size int Size to format
+ * @param int $size Size to format
* @return String
*/
public static function formatSize( $size ) {
@@ -1910,7 +2054,7 @@ class Linker {
* isn't always, because sometimes the accesskey needs to go on a different
* element than the id, for reverse-compatibility, etc.)
*
- * @param $name String: id of the element, minus prefixes.
+ * @param string $name id of the element, minus prefixes.
* @param $options Mixed: null or the string 'withaccess' to add an access-
* key hint
* @return String: contents of the title attribute (which you must HTML-
@@ -1928,7 +2072,7 @@ class Linker {
# Compatibility: formerly some tooltips had [alt-.] hardcoded
$tooltip = preg_replace( "/ ?\[alt-.\]$/", '', $tooltip );
# Message equal to '-' means suppress it.
- if ( $tooltip == '-' ) {
+ if ( $tooltip == '-' ) {
$tooltip = false;
}
}
@@ -1956,7 +2100,7 @@ class Linker {
* the id but isn't always, because sometimes the accesskey needs to go on
* a different element than the id, for reverse-compatibility, etc.)
*
- * @param $name String: id of the element, minus prefixes.
+ * @param string $name id of the element, minus prefixes.
* @return String: contents of the accesskey attribute (which you must HTML-
* escape), or false for no accesskey attribute
*/
@@ -2010,17 +2154,17 @@ class Linker {
// RevDelete links using revision ID are stable across
// page deletion and undeletion; use when possible.
$query = array(
- 'type' => 'revision',
+ 'type' => 'revision',
'target' => $title->getPrefixedDBkey(),
- 'ids' => $rev->getId()
+ 'ids' => $rev->getId()
);
} else {
// Older deleted entries didn't save a revision ID.
// We have to refer to these by timestamp, ick!
$query = array(
- 'type' => 'archive',
+ 'type' => 'archive',
'target' => $title->getPrefixedDBkey(),
- 'ids' => $rev->getTimestamp()
+ 'ids' => $rev->getTimestamp()
);
}
return Linker::revDeleteLink( $query,
@@ -2031,7 +2175,7 @@ class Linker {
/**
* Creates a (show/hide) link for deleting revisions/log entries
*
- * @param $query Array: query parameters to be passed to link()
+ * @param array $query query parameters to be passed to link()
* @param $restricted Boolean: set to true to use a "<strong>" instead of a "<span>"
* @param $delete Boolean: set to true to use (show/hide) rather than (show)
*
@@ -2070,17 +2214,17 @@ class Linker {
* This function is a shortcut to makeBrokenLinkObj(Title::newFromText($title),...). Do not call
* it if you already have a title object handy. See makeBrokenLinkObj for further documentation.
*
- * @param $title String: The text of the title
- * @param $text String: Link text
- * @param $query String: Optional query part
- * @param $trail String: Optional trail. Alphabetic characters at the start of this string will
+ * @param string $title The text of the title
+ * @param string $text Link text
+ * @param string $query Optional query part
+ * @param string $trail Optional trail. Alphabetic characters at the start of this string will
* be included in the link text. Other characters will be appended after
* the end of the link.
* @return string
*/
static function makeBrokenLink( $title, $text = '', $query = '', $trail = '' ) {
wfDeprecated( __METHOD__, '1.16' );
-
+
$nt = Title::newFromText( $title );
if ( $nt instanceof Title ) {
return self::makeBrokenLinkObj( $nt, $text, $query, $trail );
@@ -2091,7 +2235,7 @@ class Linker {
}
/**
- * @deprecated since 1.16 Use link()
+ * @deprecated since 1.16 Use link(); warnings since 1.21
*
* Make a link for a title which may or may not be in the database. If you need to
* call this lots of times, pre-fill the link cache with a LinkBatch, otherwise each
@@ -2100,16 +2244,16 @@ class Linker {
* @param $nt Title: the title object to make the link from, e.g. from
* Title::newFromText.
* @param $text String: link text
- * @param $query String: optional query part
- * @param $trail String: optional trail. Alphabetic characters at the start of this string will
+ * @param string $query optional query part
+ * @param string $trail optional trail. Alphabetic characters at the start of this string will
* be included in the link text. Other characters will be appended after
* the end of the link.
- * @param $prefix String: optional prefix. As trail, only before instead of after.
+ * @param string $prefix optional prefix. As trail, only before instead of after.
* @return string
*/
static function makeLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
- # wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
-
+ wfDeprecated( __METHOD__, '1.21' );
+
wfProfileIn( __METHOD__ );
$query = wfCgiToArray( $query );
list( $inside, $trail ) = self::splitTrail( $trail );
@@ -2124,7 +2268,7 @@ class Linker {
}
/**
- * @deprecated since 1.16 Use link()
+ * @deprecated since 1.16 Use link(); warnings since 1.21
*
* Make a link for a title which definitely exists. This is faster than makeLinkObj because
* it doesn't have to do a database query. It's also valid for interwiki titles and special
@@ -2134,16 +2278,16 @@ class Linker {
* @param $text String: text to replace the title
* @param $query String: link target
* @param $trail String: text after link
- * @param $prefix String: text before link text
- * @param $aprops String: extra attributes to the a-element
+ * @param string $prefix text before link text
+ * @param string $aprops extra attributes to the a-element
* @param $style String: style to apply - if empty, use getInternalLinkAttributesObj instead
* @return string the a-element
*/
static function makeKnownLinkObj(
- $title, $text = '', $query = '', $trail = '', $prefix = '' , $aprops = '', $style = ''
+ $title, $text = '', $query = '', $trail = '', $prefix = '', $aprops = '', $style = ''
) {
- # wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
-
+ wfDeprecated( __METHOD__, '1.21' );
+
wfProfileIn( __METHOD__ );
if ( $text == '' ) {
@@ -2170,16 +2314,16 @@ class Linker {
*
* @param $title Title object of the target page
* @param $text String: Link text
- * @param $query String: Optional query part
- * @param $trail String: Optional trail. Alphabetic characters at the start of this string will
+ * @param string $query Optional query part
+ * @param string $trail Optional trail. Alphabetic characters at the start of this string will
* be included in the link text. Other characters will be appended after
* the end of the link.
- * @param $prefix String: Optional prefix
+ * @param string $prefix Optional prefix
* @return string
*/
static function makeBrokenLinkObj( $title, $text = '', $query = '', $trail = '', $prefix = '' ) {
wfDeprecated( __METHOD__, '1.16' );
-
+
wfProfileIn( __METHOD__ );
list( $inside, $trail ) = self::splitTrail( $trail );
@@ -2206,12 +2350,12 @@ class Linker {
* @param $trail String: optional trail. Alphabetic characters at the start of this string will
* be included in the link text. Other characters will be appended after
* the end of the link.
- * @param $prefix String: Optional prefix
+ * @param string $prefix Optional prefix
* @return string
*/
static function makeColouredLinkObj( $nt, $colour, $text = '', $query = '', $trail = '', $prefix = '' ) {
wfDeprecated( __METHOD__, '1.16' );
-
+
if ( $colour != '' ) {
$style = self::getInternalLinkAttributesObj( $nt, $text, $colour );
} else {
@@ -2268,8 +2412,8 @@ class DummyLinker {
* Use PHP's magic __call handler to transform instance calls to a dummy instance
* into static calls to the new Linker for backwards compatibility.
*
- * @param $fname String Name of called method
- * @param $args Array Arguments to the method
+ * @param string $fname Name of called method
+ * @param array $args Arguments to the method
* @return mixed
*/
public function __call( $fname, $args ) {
diff --git a/includes/LinksUpdate.php b/includes/LinksUpdate.php
index 87db4d60..d99ae22d 100644
--- a/includes/LinksUpdate.php
+++ b/includes/LinksUpdate.php
@@ -49,6 +49,7 @@ class LinksUpdate extends SqlDataUpdate {
* @param $title Title of the page we're updating
* @param $parserOutput ParserOutput: output from a full parse of this page
* @param $recursive Boolean: queue jobs for recursive updates?
+ * @throws MWException
*/
function __construct( $title, $parserOutput, $recursive = true ) {
parent::__construct( false ); // no implicit transaction
@@ -71,6 +72,7 @@ class LinksUpdate extends SqlDataUpdate {
}
$this->mParserOutput = $parserOutput;
+
$this->mLinks = $parserOutput->getLinks();
$this->mImages = $parserOutput->getImages();
$this->mTemplates = $parserOutput->getTemplates();
@@ -211,14 +213,14 @@ class LinksUpdate extends SqlDataUpdate {
$existing = $this->getExistingImages();
$imageUpdates = array_diff_key( $existing, $this->mImages ) + array_diff_key( $this->mImages, $existing );
- $this->dumbTableUpdate( 'pagelinks', $this->getLinkInsertions(), 'pl_from' );
- $this->dumbTableUpdate( 'imagelinks', $this->getImageInsertions(), 'il_from' );
+ $this->dumbTableUpdate( 'pagelinks', $this->getLinkInsertions(), 'pl_from' );
+ $this->dumbTableUpdate( 'imagelinks', $this->getImageInsertions(), 'il_from' );
$this->dumbTableUpdate( 'categorylinks', $this->getCategoryInsertions(), 'cl_from' );
$this->dumbTableUpdate( 'templatelinks', $this->getTemplateInsertions(), 'tl_from' );
$this->dumbTableUpdate( 'externallinks', $this->getExternalInsertions(), 'el_from' );
- $this->dumbTableUpdate( 'langlinks', $this->getInterlangInsertions(),'ll_from' );
- $this->dumbTableUpdate( 'iwlinks', $this->getInterwikiInsertions(),'iwl_from' );
- $this->dumbTableUpdate( 'page_props', $this->getPropertyInsertions(), 'pp_page' );
+ $this->dumbTableUpdate( 'langlinks', $this->getInterlangInsertions(), 'll_from' );
+ $this->dumbTableUpdate( 'iwlinks', $this->getInterwikiInsertions(), 'iwl_from' );
+ $this->dumbTableUpdate( 'page_props', $this->getPropertyInsertions(), 'pp_page' );
# Update the cache of all the category pages and image description
# pages which were changed, and fix the category table count
@@ -236,26 +238,20 @@ class LinksUpdate extends SqlDataUpdate {
}
function queueRecursiveJobs() {
- global $wgUpdateRowsPerJob;
wfProfileIn( __METHOD__ );
- $cache = $this->mTitle->getBacklinkCache();
- $batches = $cache->partition( 'templatelinks', $wgUpdateRowsPerJob );
- if ( !$batches ) {
- wfProfileOut( __METHOD__ );
- return;
- }
- $jobs = array();
- foreach ( $batches as $batch ) {
- list( $start, $end ) = $batch;
- $params = array(
- 'table' => 'templatelinks',
- 'start' => $start,
- 'end' => $end,
+ if ( $this->mTitle->getBacklinkCache()->hasLinks( 'templatelinks' ) ) {
+ $job = new RefreshLinksJob2(
+ $this->mTitle,
+ array(
+ 'table' => 'templatelinks',
+ ) + Job::newRootJobParams( // "overall" refresh links job info
+ "refreshlinks:templatelinks:{$this->mTitle->getPrefixedText()}"
+ )
);
- $jobs[] = new RefreshLinksJob2( $this->mTitle, $params );
+ JobQueueGroup::singleton()->push( $job );
+ JobQueueGroup::singleton()->deduplicateRootJob( $job );
}
- Job::batchInsert( $jobs );
wfProfileOut( __METHOD__ );
}
@@ -269,8 +265,8 @@ class LinksUpdate extends SqlDataUpdate {
/**
* Update all the appropriate counts in the category table.
- * @param $added array associative array of category name => sort key
- * @param $deleted array associative array of category name => sort key
+ * @param array $added associative array of category name => sort key
+ * @param array $deleted associative array of category name => sort key
*/
function updateCategoryCounts( $added, $deleted ) {
$a = WikiPage::factory( $this->mTitle );
@@ -295,7 +291,7 @@ class LinksUpdate extends SqlDataUpdate {
$this->mDb->delete( $table, array( $fromField => $this->mId ), __METHOD__ );
if ( count( $insertions ) ) {
# The link array was constructed without FOR UPDATE, so there may
- # be collisions. This may cause minor link table inconsistencies,
+ # be collisions. This may cause minor link table inconsistencies,
# which is better than crippling the site with lock contention.
$this->mDb->insert( $table, $insertions, __METHOD__, array( 'IGNORE' ) );
}
@@ -346,6 +342,7 @@ class LinksUpdate extends SqlDataUpdate {
}
if ( count( $insertions ) ) {
$this->mDb->insert( $table, $insertions, __METHOD__, 'IGNORE' );
+ wfRunHooks( 'LinksUpdateAfterInsert', array( $this, $table, $insertions ) );
}
}
@@ -363,9 +360,9 @@ class LinksUpdate extends SqlDataUpdate {
: $dbkeys;
foreach ( $diffs as $dbk => $id ) {
$arr[] = array(
- 'pl_from' => $this->mId,
+ 'pl_from' => $this->mId,
'pl_namespace' => $ns,
- 'pl_title' => $dbk
+ 'pl_title' => $dbk
);
}
}
@@ -383,9 +380,9 @@ class LinksUpdate extends SqlDataUpdate {
$diffs = isset( $existing[$ns] ) ? array_diff_key( $dbkeys, $existing[$ns] ) : $dbkeys;
foreach ( $diffs as $dbk => $id ) {
$arr[] = array(
- 'tl_from' => $this->mId,
+ 'tl_from' => $this->mId,
'tl_namespace' => $ns,
- 'tl_title' => $dbk
+ 'tl_title' => $dbk
);
}
}
@@ -404,7 +401,7 @@ class LinksUpdate extends SqlDataUpdate {
foreach( $diffs as $iname => $dummy ) {
$arr[] = array(
'il_from' => $this->mId,
- 'il_to' => $iname
+ 'il_to' => $iname
);
}
return $arr;
@@ -421,9 +418,9 @@ class LinksUpdate extends SqlDataUpdate {
foreach( $diffs as $url => $dummy ) {
foreach( wfMakeUrlIndexes( $url ) as $index ) {
$arr[] = array(
- 'el_from' => $this->mId,
- 'el_to' => $url,
- 'el_index' => $index,
+ 'el_from' => $this->mId,
+ 'el_to' => $url,
+ 'el_index' => $index,
);
}
}
@@ -433,7 +430,7 @@ class LinksUpdate extends SqlDataUpdate {
/**
* Get an array of category insertions
*
- * @param $existing array mapping existing category names to sort keys. If both
+ * @param array $existing mapping existing category names to sort keys. If both
* match a link in $this, the link will be omitted from the output
*
* @return array
@@ -462,8 +459,8 @@ class LinksUpdate extends SqlDataUpdate {
$this->mTitle->getCategorySortkey( $prefix ) );
$arr[] = array(
- 'cl_from' => $this->mId,
- 'cl_to' => $name,
+ 'cl_from' => $this->mId,
+ 'cl_to' => $name,
'cl_sortkey' => $sortkey,
'cl_timestamp' => $this->mDb->timestamp(),
'cl_sortkey_prefix' => $prefix,
@@ -477,7 +474,7 @@ class LinksUpdate extends SqlDataUpdate {
/**
* Get an array of interlanguage link insertions
*
- * @param $existing Array mapping existing language codes to titles
+ * @param array $existing mapping existing language codes to titles
*
* @return array
*/
@@ -486,8 +483,8 @@ class LinksUpdate extends SqlDataUpdate {
$arr = array();
foreach( $diffs as $lang => $title ) {
$arr[] = array(
- 'll_from' => $this->mId,
- 'll_lang' => $lang,
+ 'll_from' => $this->mId,
+ 'll_lang' => $lang,
'll_title' => $title
);
}
@@ -504,9 +501,9 @@ class LinksUpdate extends SqlDataUpdate {
$arr = array();
foreach ( $diffs as $name => $value ) {
$arr[] = array(
- 'pp_page' => $this->mId,
- 'pp_propname' => $name,
- 'pp_value' => $value,
+ 'pp_page' => $this->mId,
+ 'pp_propname' => $name,
+ 'pp_value' => $value,
);
}
return $arr;
@@ -524,9 +521,9 @@ class LinksUpdate extends SqlDataUpdate {
$diffs = isset( $existing[$prefix] ) ? array_diff_key( $dbkeys, $existing[$prefix] ) : $dbkeys;
foreach ( $diffs as $dbk => $id ) {
$arr[] = array(
- 'iwl_from' => $this->mId,
+ 'iwl_from' => $this->mId,
'iwl_prefix' => $prefix,
- 'iwl_title' => $dbk
+ 'iwl_title' => $dbk
);
}
}
@@ -823,11 +820,16 @@ class LinksDeletionUpdate extends SqlDataUpdate {
* Constructor
*
* @param $page WikiPage Page we are updating
+ * @throws MWException
*/
function __construct( WikiPage $page ) {
parent::__construct( false ); // no implicit transaction
$this->mPage = $page;
+
+ if ( !$page->exists() ) {
+ throw new MWException( "Page ID not known, perhaps the page doesn't exist?" );
+ }
}
/**
@@ -879,4 +881,16 @@ class LinksDeletionUpdate extends SqlDataUpdate {
__METHOD__ );
}
}
+
+ /**
+ * Update all the appropriate counts in the category table.
+ * @param array $added associative array of category name => sort key
+ * @param array $deleted associative array of category name => sort key
+ */
+ function updateCategoryCounts( $added, $deleted ) {
+ $a = WikiPage::factory( $this->mTitle );
+ $a->updateCategoryCounts(
+ array_keys( $added ), array_keys( $deleted )
+ );
+ }
}
diff --git a/includes/LocalisationCache.php b/includes/LocalisationCache.php
deleted file mode 100644
index d8e5d3a3..00000000
--- a/includes/LocalisationCache.php
+++ /dev/null
@@ -1,1281 +0,0 @@
-<?php
-/**
- * Cache of the contents of localisation files.
- *
- * 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
- */
-
-define( 'MW_LC_VERSION', 2 );
-
-/**
- * Class for caching the contents of localisation files, Messages*.php
- * and *.i18n.php.
- *
- * An instance of this class is available using Language::getLocalisationCache().
- *
- * The values retrieved from here are merged, containing items from extension
- * files, core messages files and the language fallback sequence (e.g. zh-cn ->
- * zh-hans -> en ). Some common errors are corrected, for example namespace
- * names with spaces instead of underscores, but heavyweight processing, such
- * as grammatical transformation, is done by the caller.
- */
-class LocalisationCache {
- /** Configuration associative array */
- var $conf;
-
- /**
- * True if recaching should only be done on an explicit call to recache().
- * Setting this reduces the overhead of cache freshness checking, which
- * requires doing a stat() for every extension i18n file.
- */
- var $manualRecache = false;
-
- /**
- * True to treat all files as expired until they are regenerated by this object.
- */
- var $forceRecache = false;
-
- /**
- * The cache data. 3-d array, where the first key is the language code,
- * the second key is the item key e.g. 'messages', and the third key is
- * an item specific subkey index. Some items are not arrays and so for those
- * items, there are no subkeys.
- */
- var $data = array();
-
- /**
- * The persistent store object. An instance of LCStore.
- *
- * @var LCStore
- */
- var $store;
-
- /**
- * A 2-d associative array, code/key, where presence indicates that the item
- * is loaded. Value arbitrary.
- *
- * For split items, if set, this indicates that all of the subitems have been
- * loaded.
- */
- var $loadedItems = array();
-
- /**
- * A 3-d associative array, code/key/subkey, where presence indicates that
- * the subitem is loaded. Only used for the split items, i.e. messages.
- */
- var $loadedSubitems = array();
-
- /**
- * An array where presence of a key indicates that that language has been
- * initialised. Initialisation includes checking for cache expiry and doing
- * any necessary updates.
- */
- var $initialisedLangs = array();
-
- /**
- * An array mapping non-existent pseudo-languages to fallback languages. This
- * is filled by initShallowFallback() when data is requested from a language
- * that lacks a Messages*.php file.
- */
- var $shallowFallbacks = array();
-
- /**
- * An array where the keys are codes that have been recached by this instance.
- */
- var $recachedLangs = array();
-
- /**
- * All item keys
- */
- static public $allKeys = array(
- 'fallback', 'namespaceNames', 'bookstoreList',
- 'magicWords', 'messages', 'rtl', 'capitalizeAllNouns', 'digitTransformTable',
- 'separatorTransformTable', 'fallback8bitEncoding', 'linkPrefixExtension',
- 'linkTrail', 'namespaceAliases',
- 'dateFormats', 'datePreferences', 'datePreferenceMigrationMap',
- 'defaultDateFormat', 'extraUserToggles', 'specialPageAliases',
- 'imageFiles', 'preloadedMessages', 'namespaceGenderAliases',
- 'digitGroupingPattern', 'pluralRules', 'compiledPluralRules',
- );
-
- /**
- * Keys for items which consist of associative arrays, which may be merged
- * by a fallback sequence.
- */
- static public $mergeableMapKeys = array( 'messages', 'namespaceNames',
- 'dateFormats', 'imageFiles', 'preloadedMessages'
- );
-
- /**
- * Keys for items which are a numbered array.
- */
- static public $mergeableListKeys = array( 'extraUserToggles' );
-
- /**
- * Keys for items which contain an array of arrays of equivalent aliases
- * for each subitem. The aliases may be merged by a fallback sequence.
- */
- static public $mergeableAliasListKeys = array( 'specialPageAliases' );
-
- /**
- * Keys for items which contain an associative array, and may be merged if
- * the primary value contains the special array key "inherit". That array
- * key is removed after the first merge.
- */
- static public $optionalMergeKeys = array( 'bookstoreList' );
-
- /**
- * Keys for items that are formatted like $magicWords
- */
- static public $magicWordKeys = array( 'magicWords' );
-
- /**
- * Keys for items where the subitems are stored in the backend separately.
- */
- static public $splitKeys = array( 'messages' );
-
- /**
- * Keys which are loaded automatically by initLanguage()
- */
- static public $preloadedKeys = array( 'dateFormats', 'namespaceNames' );
-
- /**
- * Associative array of cached plural rules. The key is the language code,
- * the value is an array of plural rules for that language.
- */
- var $pluralRules = null;
-
- var $mergeableKeys = null;
-
- /**
- * Constructor.
- * For constructor parameters, see the documentation in DefaultSettings.php
- * for $wgLocalisationCacheConf.
- *
- * @param $conf Array
- */
- function __construct( $conf ) {
- global $wgCacheDirectory;
-
- $this->conf = $conf;
- $storeConf = array();
- if ( !empty( $conf['storeClass'] ) ) {
- $storeClass = $conf['storeClass'];
- } else {
- switch ( $conf['store'] ) {
- case 'files':
- case 'file':
- $storeClass = 'LCStore_CDB';
- break;
- case 'db':
- $storeClass = 'LCStore_DB';
- break;
- case 'accel':
- $storeClass = 'LCStore_Accel';
- break;
- case 'detect':
- $storeClass = $wgCacheDirectory ? 'LCStore_CDB' : 'LCStore_DB';
- break;
- default:
- throw new MWException(
- 'Please set $wgLocalisationCacheConf[\'store\'] to something sensible.' );
- }
- }
-
- wfDebug( get_class( $this ) . ": using store $storeClass\n" );
- if ( !empty( $conf['storeDirectory'] ) ) {
- $storeConf['directory'] = $conf['storeDirectory'];
- }
-
- $this->store = new $storeClass( $storeConf );
- foreach ( array( 'manualRecache', 'forceRecache' ) as $var ) {
- if ( isset( $conf[$var] ) ) {
- $this->$var = $conf[$var];
- }
- }
- }
-
- /**
- * Returns true if the given key is mergeable, that is, if it is an associative
- * array which can be merged through a fallback sequence.
- * @param $key
- * @return bool
- */
- public function isMergeableKey( $key ) {
- if ( $this->mergeableKeys === null ) {
- $this->mergeableKeys = array_flip( array_merge(
- self::$mergeableMapKeys,
- self::$mergeableListKeys,
- self::$mergeableAliasListKeys,
- self::$optionalMergeKeys,
- self::$magicWordKeys
- ) );
- }
- return isset( $this->mergeableKeys[$key] );
- }
-
- /**
- * Get a cache item.
- *
- * Warning: this may be slow for split items (messages), since it will
- * need to fetch all of the subitems from the cache individually.
- * @param $code
- * @param $key
- * @return mixed
- */
- public function getItem( $code, $key ) {
- if ( !isset( $this->loadedItems[$code][$key] ) ) {
- wfProfileIn( __METHOD__ . '-load' );
- $this->loadItem( $code, $key );
- wfProfileOut( __METHOD__ . '-load' );
- }
-
- if ( $key === 'fallback' && isset( $this->shallowFallbacks[$code] ) ) {
- return $this->shallowFallbacks[$code];
- }
-
- return $this->data[$code][$key];
- }
-
- /**
- * Get a subitem, for instance a single message for a given language.
- * @param $code
- * @param $key
- * @param $subkey
- * @return null
- */
- public function getSubitem( $code, $key, $subkey ) {
- if ( !isset( $this->loadedSubitems[$code][$key][$subkey] ) &&
- !isset( $this->loadedItems[$code][$key] ) ) {
- wfProfileIn( __METHOD__ . '-load' );
- $this->loadSubitem( $code, $key, $subkey );
- wfProfileOut( __METHOD__ . '-load' );
- }
-
- if ( isset( $this->data[$code][$key][$subkey] ) ) {
- return $this->data[$code][$key][$subkey];
- } else {
- return null;
- }
- }
-
- /**
- * Get the list of subitem keys for a given item.
- *
- * This is faster than array_keys($lc->getItem(...)) for the items listed in
- * self::$splitKeys.
- *
- * Will return null if the item is not found, or false if the item is not an
- * array.
- * @param $code
- * @param $key
- * @return bool|null|string
- */
- public function getSubitemList( $code, $key ) {
- if ( in_array( $key, self::$splitKeys ) ) {
- return $this->getSubitem( $code, 'list', $key );
- } else {
- $item = $this->getItem( $code, $key );
- if ( is_array( $item ) ) {
- return array_keys( $item );
- } else {
- return false;
- }
- }
- }
-
- /**
- * Load an item into the cache.
- * @param $code
- * @param $key
- */
- protected function loadItem( $code, $key ) {
- if ( !isset( $this->initialisedLangs[$code] ) ) {
- $this->initLanguage( $code );
- }
-
- // Check to see if initLanguage() loaded it for us
- if ( isset( $this->loadedItems[$code][$key] ) ) {
- return;
- }
-
- if ( isset( $this->shallowFallbacks[$code] ) ) {
- $this->loadItem( $this->shallowFallbacks[$code], $key );
- return;
- }
-
- if ( in_array( $key, self::$splitKeys ) ) {
- $subkeyList = $this->getSubitem( $code, 'list', $key );
- foreach ( $subkeyList as $subkey ) {
- if ( isset( $this->data[$code][$key][$subkey] ) ) {
- continue;
- }
- $this->data[$code][$key][$subkey] = $this->getSubitem( $code, $key, $subkey );
- }
- } else {
- $this->data[$code][$key] = $this->store->get( $code, $key );
- }
-
- $this->loadedItems[$code][$key] = true;
- }
-
- /**
- * Load a subitem into the cache
- * @param $code
- * @param $key
- * @param $subkey
- * @return
- */
- protected function loadSubitem( $code, $key, $subkey ) {
- if ( !in_array( $key, self::$splitKeys ) ) {
- $this->loadItem( $code, $key );
- return;
- }
-
- if ( !isset( $this->initialisedLangs[$code] ) ) {
- $this->initLanguage( $code );
- }
-
- // Check to see if initLanguage() loaded it for us
- if ( isset( $this->loadedItems[$code][$key] ) ||
- isset( $this->loadedSubitems[$code][$key][$subkey] ) ) {
- return;
- }
-
- if ( isset( $this->shallowFallbacks[$code] ) ) {
- $this->loadSubitem( $this->shallowFallbacks[$code], $key, $subkey );
- return;
- }
-
- $value = $this->store->get( $code, "$key:$subkey" );
- $this->data[$code][$key][$subkey] = $value;
- $this->loadedSubitems[$code][$key][$subkey] = true;
- }
-
- /**
- * Returns true if the cache identified by $code is missing or expired.
- * @return bool
- */
- public function isExpired( $code ) {
- if ( $this->forceRecache && !isset( $this->recachedLangs[$code] ) ) {
- wfDebug( __METHOD__ . "($code): forced reload\n" );
- return true;
- }
-
- $deps = $this->store->get( $code, 'deps' );
- $keys = $this->store->get( $code, 'list', 'messages' );
- $preload = $this->store->get( $code, 'preload' );
- // Different keys may expire separately, at least in LCStore_Accel
- if ( $deps === null || $keys === null || $preload === null ) {
- wfDebug( __METHOD__ . "($code): cache missing, need to make one\n" );
- return true;
- }
-
- foreach ( $deps as $dep ) {
- // Because we're unserializing stuff from cache, we
- // could receive objects of classes that don't exist
- // anymore (e.g. uninstalled extensions)
- // When this happens, always expire the cache
- if ( !$dep instanceof CacheDependency || $dep->isExpired() ) {
- wfDebug( __METHOD__ . "($code): cache for $code expired due to " .
- get_class( $dep ) . "\n" );
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Initialise a language in this object. Rebuild the cache if necessary.
- * @param $code
- */
- protected function initLanguage( $code ) {
- if ( isset( $this->initialisedLangs[$code] ) ) {
- return;
- }
-
- $this->initialisedLangs[$code] = true;
-
- # If the code is of the wrong form for a Messages*.php file, do a shallow fallback
- if ( !Language::isValidBuiltInCode( $code ) ) {
- $this->initShallowFallback( $code, 'en' );
- return;
- }
-
- # Recache the data if necessary
- if ( !$this->manualRecache && $this->isExpired( $code ) ) {
- if ( file_exists( Language::getMessagesFileName( $code ) ) ) {
- $this->recache( $code );
- } elseif ( $code === 'en' ) {
- throw new MWException( 'MessagesEn.php is missing.' );
- } else {
- $this->initShallowFallback( $code, 'en' );
- }
- return;
- }
-
- # Preload some stuff
- $preload = $this->getItem( $code, 'preload' );
- if ( $preload === null ) {
- if ( $this->manualRecache ) {
- // No Messages*.php file. Do shallow fallback to en.
- if ( $code === 'en' ) {
- throw new MWException( 'No localisation cache found for English. ' .
- 'Please run maintenance/rebuildLocalisationCache.php.' );
- }
- $this->initShallowFallback( $code, 'en' );
- return;
- } else {
- throw new MWException( 'Invalid or missing localisation cache.' );
- }
- }
- $this->data[$code] = $preload;
- foreach ( $preload as $key => $item ) {
- if ( in_array( $key, self::$splitKeys ) ) {
- foreach ( $item as $subkey => $subitem ) {
- $this->loadedSubitems[$code][$key][$subkey] = true;
- }
- } else {
- $this->loadedItems[$code][$key] = true;
- }
- }
- }
-
- /**
- * Create a fallback from one language to another, without creating a
- * complete persistent cache.
- * @param $primaryCode
- * @param $fallbackCode
- */
- public function initShallowFallback( $primaryCode, $fallbackCode ) {
- $this->data[$primaryCode] =& $this->data[$fallbackCode];
- $this->loadedItems[$primaryCode] =& $this->loadedItems[$fallbackCode];
- $this->loadedSubitems[$primaryCode] =& $this->loadedSubitems[$fallbackCode];
- $this->shallowFallbacks[$primaryCode] = $fallbackCode;
- }
-
- /**
- * Read a PHP file containing localisation data.
- * @param $_fileName
- * @param $_fileType
- * @return array
- */
- protected function readPHPFile( $_fileName, $_fileType ) {
- // Disable APC caching
- $_apcEnabled = ini_set( 'apc.cache_by_default', '0' );
- include( $_fileName );
- ini_set( 'apc.cache_by_default', $_apcEnabled );
-
- if ( $_fileType == 'core' || $_fileType == 'extension' ) {
- $data = compact( self::$allKeys );
- } elseif ( $_fileType == 'aliases' ) {
- $data = compact( 'aliases' );
- } else {
- throw new MWException( __METHOD__ . ": Invalid file type: $_fileType" );
- }
- return $data;
- }
-
- /**
- * Get the compiled plural rules for a given language from the XML files.
- * @since 1.20
- */
- public function getCompiledPluralRules( $code ) {
- $rules = $this->getPluralRules( $code );
- if ( $rules === null ) {
- return null;
- }
- try {
- $compiledRules = CLDRPluralRuleEvaluator::compile( $rules );
- } catch( CLDRPluralRuleError $e ) {
- wfDebugLog( 'l10n', $e->getMessage() . "\n" );
- return array();
- }
- return $compiledRules;
- }
-
- /**
- * Get the plural rules for a given language from the XML files.
- * Cached.
- * @since 1.20
- */
- public function getPluralRules( $code ) {
- if ( $this->pluralRules === null ) {
- $cldrPlural = __DIR__ . "/../languages/data/plurals.xml";
- $mwPlural = __DIR__ . "/../languages/data/plurals-mediawiki.xml";
- // Load CLDR plural rules
- $this->loadPluralFile( $cldrPlural );
- if ( file_exists( $mwPlural ) ) {
- // Override or extend
- $this->loadPluralFile( $mwPlural );
- }
- }
- if ( !isset( $this->pluralRules[$code] ) ) {
- return null;
- } else {
- return $this->pluralRules[$code];
- }
- }
-
-
- /**
- * Load a plural XML file with the given filename, compile the relevant
- * rules, and save the compiled rules in a process-local cache.
- */
- protected function loadPluralFile( $fileName ) {
- $doc = new DOMDocument;
- $doc->load( $fileName );
- $rulesets = $doc->getElementsByTagName( "pluralRules" );
- foreach ( $rulesets as $ruleset ) {
- $codes = $ruleset->getAttribute( 'locales' );
- $rules = array();
- $ruleElements = $ruleset->getElementsByTagName( "pluralRule" );
- foreach ( $ruleElements as $elt ) {
- $rules[] = $elt->nodeValue;
- }
- foreach ( explode( ' ', $codes ) as $code ) {
- $this->pluralRules[$code] = $rules;
- }
- }
- }
-
- /**
- * Read the data from the source files for a given language, and register
- * the relevant dependencies in the $deps array. If the localisation
- * exists, the data array is returned, otherwise false is returned.
- */
- protected function readSourceFilesAndRegisterDeps( $code, &$deps ) {
- $fileName = Language::getMessagesFileName( $code );
- if ( !file_exists( $fileName ) ) {
- return false;
- }
-
- $deps[] = new FileDependency( $fileName );
- $data = $this->readPHPFile( $fileName, 'core' );
-
- # Load CLDR plural rules for JavaScript
- $data['pluralRules'] = $this->getPluralRules( $code );
- # And for PHP
- $data['compiledPluralRules'] = $this->getCompiledPluralRules( $code );
-
- $deps['plurals'] = new FileDependency( __DIR__ . "/../languages/data/plurals.xml" );
- $deps['plurals-mw'] = new FileDependency( __DIR__ . "/../languages/data/plurals-mediawiki.xml" );
- return $data;
- }
-
- /**
- * Merge two localisation values, a primary and a fallback, overwriting the
- * primary value in place.
- * @param $key
- * @param $value
- * @param $fallbackValue
- */
- protected function mergeItem( $key, &$value, $fallbackValue ) {
- if ( !is_null( $value ) ) {
- if ( !is_null( $fallbackValue ) ) {
- if ( in_array( $key, self::$mergeableMapKeys ) ) {
- $value = $value + $fallbackValue;
- } elseif ( in_array( $key, self::$mergeableListKeys ) ) {
- $value = array_unique( array_merge( $fallbackValue, $value ) );
- } elseif ( in_array( $key, self::$mergeableAliasListKeys ) ) {
- $value = array_merge_recursive( $value, $fallbackValue );
- } elseif ( in_array( $key, self::$optionalMergeKeys ) ) {
- if ( !empty( $value['inherit'] ) ) {
- $value = array_merge( $fallbackValue, $value );
- }
-
- if ( isset( $value['inherit'] ) ) {
- unset( $value['inherit'] );
- }
- } elseif ( in_array( $key, self::$magicWordKeys ) ) {
- $this->mergeMagicWords( $value, $fallbackValue );
- }
- }
- } else {
- $value = $fallbackValue;
- }
- }
-
- /**
- * @param $value
- * @param $fallbackValue
- */
- protected function mergeMagicWords( &$value, $fallbackValue ) {
- foreach ( $fallbackValue as $magicName => $fallbackInfo ) {
- if ( !isset( $value[$magicName] ) ) {
- $value[$magicName] = $fallbackInfo;
- } else {
- $oldSynonyms = array_slice( $fallbackInfo, 1 );
- $newSynonyms = array_slice( $value[$magicName], 1 );
- $synonyms = array_values( array_unique( array_merge(
- $newSynonyms, $oldSynonyms ) ) );
- $value[$magicName] = array_merge( array( $fallbackInfo[0] ), $synonyms );
- }
- }
- }
-
- /**
- * Given an array mapping language code to localisation value, such as is
- * found in extension *.i18n.php files, iterate through a fallback sequence
- * to merge the given data with an existing primary value.
- *
- * Returns true if any data from the extension array was used, false
- * otherwise.
- * @param $codeSequence
- * @param $key
- * @param $value
- * @param $fallbackValue
- * @return bool
- */
- protected function mergeExtensionItem( $codeSequence, $key, &$value, $fallbackValue ) {
- $used = false;
- foreach ( $codeSequence as $code ) {
- if ( isset( $fallbackValue[$code] ) ) {
- $this->mergeItem( $key, $value, $fallbackValue[$code] );
- $used = true;
- }
- }
-
- return $used;
- }
-
- /**
- * Load localisation data for a given language for both core and extensions
- * and save it to the persistent cache store and the process cache
- * @param $code
- */
- public function recache( $code ) {
- global $wgExtensionMessagesFiles;
- wfProfileIn( __METHOD__ );
-
- if ( !$code ) {
- throw new MWException( "Invalid language code requested" );
- }
- $this->recachedLangs[$code] = true;
-
- # Initial values
- $initialData = array_combine(
- self::$allKeys,
- array_fill( 0, count( self::$allKeys ), null ) );
- $coreData = $initialData;
- $deps = array();
-
- # Load the primary localisation from the source file
- $data = $this->readSourceFilesAndRegisterDeps( $code, $deps );
- if ( $data === false ) {
- wfDebug( __METHOD__ . ": no localisation file for $code, using fallback to en\n" );
- $coreData['fallback'] = 'en';
- } else {
- wfDebug( __METHOD__ . ": got localisation for $code from source\n" );
-
- # Merge primary localisation
- foreach ( $data as $key => $value ) {
- $this->mergeItem( $key, $coreData[$key], $value );
- }
-
- }
-
- # Fill in the fallback if it's not there already
- if ( is_null( $coreData['fallback'] ) ) {
- $coreData['fallback'] = $code === 'en' ? false : 'en';
- }
- if ( $coreData['fallback'] === false ) {
- $coreData['fallbackSequence'] = array();
- } else {
- $coreData['fallbackSequence'] = array_map( 'trim', explode( ',', $coreData['fallback'] ) );
- $len = count( $coreData['fallbackSequence'] );
-
- # Ensure that the sequence ends at en
- if ( $coreData['fallbackSequence'][$len - 1] !== 'en' ) {
- $coreData['fallbackSequence'][] = 'en';
- }
-
- # Load the fallback localisation item by item and merge it
- foreach ( $coreData['fallbackSequence'] as $fbCode ) {
- # Load the secondary localisation from the source file to
- # avoid infinite cycles on cyclic fallbacks
- $fbData = $this->readSourceFilesAndRegisterDeps( $fbCode, $deps );
- if ( $fbData === false ) {
- continue;
- }
-
- foreach ( self::$allKeys as $key ) {
- if ( !isset( $fbData[$key] ) ) {
- continue;
- }
-
- if ( is_null( $coreData[$key] ) || $this->isMergeableKey( $key ) ) {
- $this->mergeItem( $key, $coreData[$key], $fbData[$key] );
- }
- }
- }
- }
-
- $codeSequence = array_merge( array( $code ), $coreData['fallbackSequence'] );
-
- # Load the extension localisations
- # This is done after the core because we know the fallback sequence now.
- # But it has a higher precedence for merging so that we can support things
- # like site-specific message overrides.
- $allData = $initialData;
- foreach ( $wgExtensionMessagesFiles as $fileName ) {
- $data = $this->readPHPFile( $fileName, 'extension' );
- $used = false;
-
- foreach ( $data as $key => $item ) {
- if ( $this->mergeExtensionItem( $codeSequence, $key, $allData[$key], $item ) ) {
- $used = true;
- }
- }
-
- if ( $used ) {
- $deps[] = new FileDependency( $fileName );
- }
- }
-
- # Merge core data into extension data
- foreach ( $coreData as $key => $item ) {
- $this->mergeItem( $key, $allData[$key], $item );
- }
-
- # Add cache dependencies for any referenced globals
- $deps['wgExtensionMessagesFiles'] = new GlobalDependency( 'wgExtensionMessagesFiles' );
- $deps['version'] = new ConstantDependency( 'MW_LC_VERSION' );
-
- # Add dependencies to the cache entry
- $allData['deps'] = $deps;
-
- # Replace spaces with underscores in namespace names
- $allData['namespaceNames'] = str_replace( ' ', '_', $allData['namespaceNames'] );
-
- # And do the same for special page aliases. $page is an array.
- foreach ( $allData['specialPageAliases'] as &$page ) {
- $page = str_replace( ' ', '_', $page );
- }
- # Decouple the reference to prevent accidental damage
- unset( $page );
-
- # If there were no plural rules, return an empty array
- if ( $allData['pluralRules'] === null ) {
- $allData['pluralRules'] = array();
- }
- if ( $allData['compiledPluralRules'] === null ) {
- $allData['compiledPluralRules'] = array();
- }
-
- # Set the list keys
- $allData['list'] = array();
- foreach ( self::$splitKeys as $key ) {
- $allData['list'][$key] = array_keys( $allData[$key] );
- }
- # Run hooks
- wfRunHooks( 'LocalisationCacheRecache', array( $this, $code, &$allData ) );
-
- if ( is_null( $allData['namespaceNames'] ) ) {
- throw new MWException( __METHOD__ . ': Localisation data failed sanity check! ' .
- 'Check that your languages/messages/MessagesEn.php file is intact.' );
- }
-
- # Set the preload key
- $allData['preload'] = $this->buildPreload( $allData );
-
- # Save to the process cache and register the items loaded
- $this->data[$code] = $allData;
- foreach ( $allData as $key => $item ) {
- $this->loadedItems[$code][$key] = true;
- }
-
- # Save to the persistent cache
- $this->store->startWrite( $code );
- foreach ( $allData as $key => $value ) {
- if ( in_array( $key, self::$splitKeys ) ) {
- foreach ( $value as $subkey => $subvalue ) {
- $this->store->set( "$key:$subkey", $subvalue );
- }
- } else {
- $this->store->set( $key, $value );
- }
- }
- $this->store->finishWrite();
-
- # Clear out the MessageBlobStore
- # HACK: If using a null (i.e. disabled) storage backend, we
- # can't write to the MessageBlobStore either
- if ( !$this->store instanceof LCStore_Null ) {
- MessageBlobStore::clear();
- }
-
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * Build the preload item from the given pre-cache data.
- *
- * The preload item will be loaded automatically, improving performance
- * for the commonly-requested items it contains.
- * @param $data
- * @return array
- */
- protected function buildPreload( $data ) {
- $preload = array( 'messages' => array() );
- foreach ( self::$preloadedKeys as $key ) {
- $preload[$key] = $data[$key];
- }
-
- foreach ( $data['preloadedMessages'] as $subkey ) {
- if ( isset( $data['messages'][$subkey] ) ) {
- $subitem = $data['messages'][$subkey];
- } else {
- $subitem = null;
- }
- $preload['messages'][$subkey] = $subitem;
- }
-
- return $preload;
- }
-
- /**
- * Unload the data for a given language from the object cache.
- * Reduces memory usage.
- * @param $code
- */
- public function unload( $code ) {
- unset( $this->data[$code] );
- unset( $this->loadedItems[$code] );
- unset( $this->loadedSubitems[$code] );
- unset( $this->initialisedLangs[$code] );
-
- foreach ( $this->shallowFallbacks as $shallowCode => $fbCode ) {
- if ( $fbCode === $code ) {
- $this->unload( $shallowCode );
- }
- }
- }
-
- /**
- * Unload all data
- */
- public function unloadAll() {
- foreach ( $this->initialisedLangs as $lang => $unused ) {
- $this->unload( $lang );
- }
- }
-
- /**
- * Disable the storage backend
- */
- public function disableBackend() {
- $this->store = new LCStore_Null;
- $this->manualRecache = false;
- }
-}
-
-/**
- * Interface for the persistence layer of LocalisationCache.
- *
- * The persistence layer is two-level hierarchical cache. The first level
- * is the language, the second level is the item or subitem.
- *
- * Since the data for a whole language is rebuilt in one operation, it needs
- * to have a fast and atomic method for deleting or replacing all of the
- * current data for a given language. The interface reflects this bulk update
- * operation. Callers writing to the cache must first call startWrite(), then
- * will call set() a couple of thousand times, then will call finishWrite()
- * to commit the operation. When finishWrite() is called, the cache is
- * expected to delete all data previously stored for that language.
- *
- * The values stored are PHP variables suitable for serialize(). Implementations
- * of LCStore are responsible for serializing and unserializing.
- */
-interface LCStore {
- /**
- * Get a value.
- * @param $code string Language code
- * @param $key string Cache key
- */
- function get( $code, $key );
-
- /**
- * Start a write transaction.
- * @param $code Language code
- */
- function startWrite( $code );
-
- /**
- * Finish a write transaction.
- */
- function finishWrite();
-
- /**
- * Set a key to a given value. startWrite() must be called before this
- * is called, and finishWrite() must be called afterwards.
- * @param $key
- * @param $value
- */
- function set( $key, $value );
-}
-
-/**
- * LCStore implementation which uses PHP accelerator to store data.
- * This will work if one of XCache, WinCache or APC cacher is configured.
- * (See ObjectCache.php)
- */
-class LCStore_Accel implements LCStore {
- var $currentLang;
- var $keys;
-
- public function __construct() {
- $this->cache = wfGetCache( CACHE_ACCEL );
- }
-
- public function get( $code, $key ) {
- $k = wfMemcKey( 'l10n', $code, 'k', $key );
- $r = $this->cache->get( $k );
- return $r === false ? null : $r;
- }
-
- public function startWrite( $code ) {
- $k = wfMemcKey( 'l10n', $code, 'l' );
- $keys = $this->cache->get( $k );
- if ( $keys ) {
- foreach ( $keys as $k ) {
- $this->cache->delete( $k );
- }
- }
- $this->currentLang = $code;
- $this->keys = array();
- }
-
- public function finishWrite() {
- if ( $this->currentLang ) {
- $k = wfMemcKey( 'l10n', $this->currentLang, 'l' );
- $this->cache->set( $k, array_keys( $this->keys ) );
- }
- $this->currentLang = null;
- $this->keys = array();
- }
-
- public function set( $key, $value ) {
- if ( $this->currentLang ) {
- $k = wfMemcKey( 'l10n', $this->currentLang, 'k', $key );
- $this->keys[$k] = true;
- $this->cache->set( $k, $value );
- }
- }
-}
-
-/**
- * LCStore implementation which uses the standard DB functions to store data.
- * This will work on any MediaWiki installation.
- */
-class LCStore_DB implements LCStore {
- var $currentLang;
- var $writesDone = false;
-
- /**
- * @var DatabaseBase
- */
- var $dbw;
- var $batch;
- var $readOnly = false;
-
- public function get( $code, $key ) {
- if ( $this->writesDone ) {
- $db = wfGetDB( DB_MASTER );
- } else {
- $db = wfGetDB( DB_SLAVE );
- }
- $row = $db->selectRow( 'l10n_cache', array( 'lc_value' ),
- array( 'lc_lang' => $code, 'lc_key' => $key ), __METHOD__ );
- if ( $row ) {
- return unserialize( $row->lc_value );
- } else {
- return null;
- }
- }
-
- public function startWrite( $code ) {
- if ( $this->readOnly ) {
- return;
- }
-
- if ( !$code ) {
- throw new MWException( __METHOD__ . ": Invalid language \"$code\"" );
- }
-
- $this->dbw = wfGetDB( DB_MASTER );
- try {
- $this->dbw->begin( __METHOD__ );
- $this->dbw->delete( 'l10n_cache', array( 'lc_lang' => $code ), __METHOD__ );
- } catch ( DBQueryError $e ) {
- if ( $this->dbw->wasReadOnlyError() ) {
- $this->readOnly = true;
- $this->dbw->rollback( __METHOD__ );
- $this->dbw->ignoreErrors( false );
- return;
- } else {
- throw $e;
- }
- }
-
- $this->currentLang = $code;
- $this->batch = array();
- }
-
- public function finishWrite() {
- if ( $this->readOnly ) {
- return;
- }
-
- if ( $this->batch ) {
- $this->dbw->insert( 'l10n_cache', $this->batch, __METHOD__ );
- }
-
- $this->dbw->commit( __METHOD__ );
- $this->currentLang = null;
- $this->dbw = null;
- $this->batch = array();
- $this->writesDone = true;
- }
-
- public function set( $key, $value ) {
- if ( $this->readOnly ) {
- return;
- }
-
- if ( is_null( $this->currentLang ) ) {
- throw new MWException( __CLASS__ . ': must call startWrite() before calling set()' );
- }
-
- $this->batch[] = array(
- 'lc_lang' => $this->currentLang,
- 'lc_key' => $key,
- 'lc_value' => serialize( $value ) );
-
- if ( count( $this->batch ) >= 100 ) {
- $this->dbw->insert( 'l10n_cache', $this->batch, __METHOD__ );
- $this->batch = array();
- }
- }
-}
-
-/**
- * LCStore implementation which stores data as a collection of CDB files in the
- * directory given by $wgCacheDirectory. If $wgCacheDirectory is not set, this
- * will throw an exception.
- *
- * Profiling indicates that on Linux, this implementation outperforms MySQL if
- * the directory is on a local filesystem and there is ample kernel cache
- * space. The performance advantage is greater when the DBA extension is
- * available than it is with the PHP port.
- *
- * See Cdb.php and http://cr.yp.to/cdb.html
- */
-class LCStore_CDB implements LCStore {
- var $readers, $writer, $currentLang, $directory;
-
- function __construct( $conf = array() ) {
- global $wgCacheDirectory;
-
- if ( isset( $conf['directory'] ) ) {
- $this->directory = $conf['directory'];
- } else {
- $this->directory = $wgCacheDirectory;
- }
- }
-
- public function get( $code, $key ) {
- if ( !isset( $this->readers[$code] ) ) {
- $fileName = $this->getFileName( $code );
-
- if ( !file_exists( $fileName ) ) {
- $this->readers[$code] = false;
- } else {
- $this->readers[$code] = CdbReader::open( $fileName );
- }
- }
-
- if ( !$this->readers[$code] ) {
- return null;
- } else {
- $value = $this->readers[$code]->get( $key );
-
- if ( $value === false ) {
- return null;
- }
- return unserialize( $value );
- }
- }
-
- public function startWrite( $code ) {
- if ( !file_exists( $this->directory ) ) {
- if ( !wfMkdirParents( $this->directory, null, __METHOD__ ) ) {
- throw new MWException( "Unable to create the localisation store " .
- "directory \"{$this->directory}\"" );
- }
- }
-
- // Close reader to stop permission errors on write
- if ( !empty( $this->readers[$code] ) ) {
- $this->readers[$code]->close();
- }
-
- $this->writer = CdbWriter::open( $this->getFileName( $code ) );
- $this->currentLang = $code;
- }
-
- public function finishWrite() {
- // Close the writer
- $this->writer->close();
- $this->writer = null;
- unset( $this->readers[$this->currentLang] );
- $this->currentLang = null;
- }
-
- public function set( $key, $value ) {
- if ( is_null( $this->writer ) ) {
- throw new MWException( __CLASS__ . ': must call startWrite() before calling set()' );
- }
- $this->writer->set( $key, serialize( $value ) );
- }
-
- protected function getFileName( $code ) {
- if ( !$code || strpos( $code, '/' ) !== false ) {
- throw new MWException( __METHOD__ . ": Invalid language \"$code\"" );
- }
- return "{$this->directory}/l10n_cache-$code.cdb";
- }
-}
-
-/**
- * Null store backend, used to avoid DB errors during install
- */
-class LCStore_Null implements LCStore {
- public function get( $code, $key ) {
- return null;
- }
-
- public function startWrite( $code ) {}
- public function finishWrite() {}
- public function set( $key, $value ) {}
-}
-
-/**
- * A localisation cache optimised for loading large amounts of data for many
- * languages. Used by rebuildLocalisationCache.php.
- */
-class LocalisationCache_BulkLoad extends LocalisationCache {
- /**
- * A cache of the contents of data files.
- * Core files are serialized to avoid using ~1GB of RAM during a recache.
- */
- var $fileCache = array();
-
- /**
- * Most recently used languages. Uses the linked-list aspect of PHP hashtables
- * to keep the most recently used language codes at the end of the array, and
- * the language codes that are ready to be deleted at the beginning.
- */
- var $mruLangs = array();
-
- /**
- * Maximum number of languages that may be loaded into $this->data
- */
- var $maxLoadedLangs = 10;
-
- /**
- * @param $fileName
- * @param $fileType
- * @return array|mixed
- */
- protected function readPHPFile( $fileName, $fileType ) {
- $serialize = $fileType === 'core';
- if ( !isset( $this->fileCache[$fileName][$fileType] ) ) {
- $data = parent::readPHPFile( $fileName, $fileType );
-
- if ( $serialize ) {
- $encData = serialize( $data );
- } else {
- $encData = $data;
- }
-
- $this->fileCache[$fileName][$fileType] = $encData;
-
- return $data;
- } elseif ( $serialize ) {
- return unserialize( $this->fileCache[$fileName][$fileType] );
- } else {
- return $this->fileCache[$fileName][$fileType];
- }
- }
-
- /**
- * @param $code
- * @param $key
- * @return mixed
- */
- public function getItem( $code, $key ) {
- unset( $this->mruLangs[$code] );
- $this->mruLangs[$code] = true;
- return parent::getItem( $code, $key );
- }
-
- /**
- * @param $code
- * @param $key
- * @param $subkey
- * @return
- */
- public function getSubitem( $code, $key, $subkey ) {
- unset( $this->mruLangs[$code] );
- $this->mruLangs[$code] = true;
- return parent::getSubitem( $code, $key, $subkey );
- }
-
- /**
- * @param $code
- */
- public function recache( $code ) {
- parent::recache( $code );
- unset( $this->mruLangs[$code] );
- $this->mruLangs[$code] = true;
- $this->trimCache();
- }
-
- /**
- * @param $code
- */
- public function unload( $code ) {
- unset( $this->mruLangs[$code] );
- parent::unload( $code );
- }
-
- /**
- * Unload cached languages until there are less than $this->maxLoadedLangs
- */
- protected function trimCache() {
- while ( count( $this->data ) > $this->maxLoadedLangs && count( $this->mruLangs ) ) {
- reset( $this->mruLangs );
- $code = key( $this->mruLangs );
- wfDebug( __METHOD__ . ": unloading $code\n" );
- $this->unload( $code );
- }
- }
-
-}
diff --git a/includes/MagicWord.php b/includes/MagicWord.php
index 42791f57..7b669249 100644
--- a/includes/MagicWord.php
+++ b/includes/MagicWord.php
@@ -217,7 +217,7 @@ class MagicWord {
/**#@-*/
- function __construct($id = 0, $syn = array(), $cs = false) {
+ function __construct( $id = 0, $syn = array(), $cs = false ) {
$this->mId = $id;
$this->mSynonyms = (array)$syn;
$this->mCaseSensitive = $cs;
@@ -282,6 +282,7 @@ class MagicWord {
*/
static function getDoubleUnderscoreArray() {
if ( is_null( self::$mDoubleUnderscoreArray ) ) {
+ wfRunHooks( 'GetDoubleUnderscoreIDs', array( &self::$mDoubleUnderscoreIDs ) );
self::$mDoubleUnderscoreArray = new MagicWordArray( self::$mDoubleUnderscoreIDs );
}
return self::$mDoubleUnderscoreArray;
@@ -366,7 +367,7 @@ class MagicWord {
* @return string
*/
function getRegex() {
- if ($this->mRegex == '' ) {
+ if ( $this->mRegex == '' ) {
$this->initRegex();
}
return $this->mRegex;
@@ -392,7 +393,7 @@ class MagicWord {
* @return string
*/
function getRegexStart() {
- if ($this->mRegex == '' ) {
+ if ( $this->mRegex == '' ) {
$this->initRegex();
}
return $this->mRegexStart;
@@ -404,7 +405,7 @@ class MagicWord {
* @return string
*/
function getBaseRegex() {
- if ($this->mRegex == '') {
+ if ( $this->mRegex == '' ) {
$this->initRegex();
}
return $this->mBaseRegex;
@@ -453,9 +454,9 @@ class MagicWord {
# blank elements and re-sort the indices.
# See also bug 6526
- $matches = array_values(array_filter($matches));
+ $matches = array_values( array_filter( $matches ) );
- if ( count($matches) == 1 ) {
+ if ( count( $matches ) == 1 ) {
return $matches[0];
} else {
return $matches[1];
@@ -463,7 +464,6 @@ class MagicWord {
}
}
-
/**
* Returns true if the text matches the word, and alters the
* input string, removing all instances of the word
@@ -534,7 +534,7 @@ class MagicWord {
*
* @return string
*/
- function getVariableRegex() {
+ function getVariableRegex() {
if ( $this->mVariableRegex == '' ) {
$this->initRegex();
}
@@ -577,7 +577,7 @@ class MagicWord {
*
* @return bool
*/
- function getWasModified(){
+ function getWasModified() {
return $this->mModified;
}
@@ -594,10 +594,10 @@ class MagicWord {
*
* @return bool
*/
- function replaceMultiple( $magicarr, $subject, &$result ){
+ function replaceMultiple( $magicarr, $subject, &$result ) {
$search = array();
$replace = array();
- foreach( $magicarr as $id => $replacement ){
+ foreach( $magicarr as $id => $replacement ) {
$mw = MagicWord::get( $id );
$search[] = $mw->getRegex();
$replace[] = $replacement;
@@ -617,7 +617,7 @@ class MagicWord {
function addToArray( &$array, $value ) {
global $wgContLang;
foreach ( $this->mSynonyms as $syn ) {
- $array[$wgContLang->lc($syn)] = $value;
+ $array[$wgContLang->lc( $syn )] = $value;
}
}
@@ -811,7 +811,7 @@ class MagicWordArray {
return array( $magicName, $paramValue );
}
// This shouldn't happen either
- throw new MWException( __METHOD__.': parameter not found' );
+ throw new MWException( __METHOD__ . ': parameter not found' );
}
/**
diff --git a/includes/MappedIterator.php b/includes/MappedIterator.php
new file mode 100644
index 00000000..b4376f44
--- /dev/null
+++ b/includes/MappedIterator.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Convenience class for generating iterators from iterators.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Convenience class for generating iterators from iterators.
+ *
+ * @since 1.21
+ */
+class MappedIterator implements Iterator {
+ /** @var Iterator */
+ protected $baseIterator;
+ /** @var Closure */
+ protected $vCallback;
+
+ /**
+ * Build an new iterator from a base iterator by having the former wrap the
+ * later, returning the result of "value" callback for each current() invocation.
+ * The callback takes the result of current() on the base iterator as an argument.
+ * The keys of the base iterator are reused verbatim.
+ *
+ * @param Iterator|Array $iter
+ * @param Closure $vCallback
+ * @throws MWException
+ */
+ public function __construct( $iter, Closure $vCallback ) {
+ if ( is_array( $iter ) ) {
+ $this->baseIterator = new ArrayIterator( $iter );
+ } elseif ( $iter instanceof Iterator ) {
+ $this->baseIterator = $iter;
+ } else {
+ throw new MWException( "Invalid base iterator provided." );
+ }
+ $this->vCallback = $vCallback;
+ }
+
+ /**
+ * @return void
+ */
+ public function rewind() {
+ $this->baseIterator->rewind();
+ }
+
+ /**
+ * @return Mixed|null Returns null if out of range
+ */
+ public function current() {
+ if ( !$this->baseIterator->valid() ) {
+ return null; // out of range
+ }
+ return call_user_func_array( $this->vCallback, array( $this->baseIterator->current() ) );
+ }
+
+ /**
+ * @return Mixed|null Returns null if out of range
+ */
+ public function key() {
+ if ( !$this->baseIterator->valid() ) {
+ return null; // out of range
+ }
+ return $this->baseIterator->key();
+ }
+
+ /**
+ * @return void
+ */
+ public function next() {
+ $this->baseIterator->next();
+ }
+
+ /**
+ * @return bool
+ */
+ public function valid() {
+ return $this->baseIterator->valid();
+ }
+}
diff --git a/includes/Message.php b/includes/Message.php
index b0147b9a..5719f830 100644
--- a/includes/Message.php
+++ b/includes/Message.php
@@ -22,11 +22,11 @@
*/
/**
- * The Message class provides methods which fullfil two basic services:
+ * The Message class provides methods which fulfil two basic services:
* - fetching interface messages
* - processing messages into a variety of formats
*
- * First implemented with MediaWiki 1.17, the Message class is intented to
+ * First implemented with MediaWiki 1.17, the Message class is intended to
* replace the old wfMsg* functions that over time grew unusable.
* @see https://www.mediawiki.org/wiki/Manual:Messages_API for equivalences
* between old and new functions.
@@ -203,6 +203,11 @@ class Message {
protected $title = null;
/**
+ * Content object representing the message
+ */
+ protected $content = null;
+
+ /**
* @var string
*/
protected $message;
@@ -211,7 +216,7 @@ class Message {
* Constructor.
* @since 1.17
* @param $key: message key, or array of message keys to try and use the first non-empty message for
- * @param $params Array message parameters
+ * @param array $params message parameters
* @return Message: $this
*/
public function __construct( $key, $params = array() ) {
@@ -222,11 +227,44 @@ class Message {
}
/**
+ * Returns the message key
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function getKey() {
+ return $this->key;
+ }
+
+ /**
+ * Returns the message parameters
+ *
+ * @since 1.21
+ *
+ * @return string[]
+ */
+ public function getParams() {
+ return $this->parameters;
+ }
+
+ /**
+ * Returns the message format
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function getFormat() {
+ return $this->format;
+ }
+
+ /**
* Factory function that is just wrapper for the real constructor. It is
- * intented to be used instead of the real constructor, because it allows
+ * intended to be used instead of the real constructor, because it allows
* chaining method calls, while new objects don't.
* @since 1.17
- * @param $key String: message key
+ * @param string $key message key
* @param Varargs: parameters as Strings
* @return Message: $this
*/
@@ -247,9 +285,9 @@ class Message {
public static function newFallbackSequence( /*...*/ ) {
$keys = func_get_args();
if ( func_num_args() == 1 ) {
- if ( is_array($keys[0]) ) {
+ if ( is_array( $keys[0] ) ) {
// Allow an array to be passed as the first argument instead
- $keys = array_values($keys[0]);
+ $keys = array_values( $keys[0] );
} else {
// Optimize a single string to not need special fallback handling
$keys = $keys[0];
@@ -332,6 +370,7 @@ class Message {
* turned off.
* @since 1.17
* @param $lang Mixed: language code or Language object.
+ * @throws MWException
* @return Message: $this
*/
public function inLanguage( $lang ) {
@@ -405,6 +444,18 @@ class Message {
}
/**
+ * Returns the message as a Content object.
+ * @return Content
+ */
+ public function content() {
+ if ( !$this->content ) {
+ $this->content = new MessageContent( $this );
+ }
+
+ return $this->content;
+ }
+
+ /**
* Returns the message parsed from wikitext to HTML.
* @since 1.17
* @return String: HTML
@@ -413,13 +464,22 @@ class Message {
$string = $this->fetchMessage();
if ( $string === false ) {
- $key = htmlspecialchars( is_array( $this->key ) ? $this->key[0] : $this->key );
+ $key = htmlspecialchars( is_array( $this->key ) ? $this->key[0] : $this->key );
if ( $this->format === 'plain' ) {
return '<' . $key . '>';
}
return '&lt;' . $key . '&gt;';
}
+ # Replace $* with a list of parameters for &uselang=qqx.
+ if ( strpos( $string, '$*' ) !== false ) {
+ $paramlist = '';
+ if ( $this->parameters !== array() ) {
+ $paramlist = ': $' . implode( ', $', range( 1, count( $this->parameters ) ) );
+ }
+ $string = str_replace( '$*', $paramlist, $string );
+ }
+
# Replace parameters before text parsing
$string = $this->replaceParameters( $string, 'before' );
@@ -430,11 +490,11 @@ class Message {
if( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
$string = $m[1];
}
- } elseif( $this->format === 'block-parse' ){
+ } elseif( $this->format === 'block-parse' ) {
$string = $this->parseText( $string );
- } elseif( $this->format === 'text' ){
+ } elseif( $this->format === 'text' ) {
$string = $this->transformText( $string );
- } elseif( $this->format === 'escaped' ){
+ } elseif( $this->format === 'escaped' ) {
$string = $this->transformText( $string );
$string = htmlspecialchars( $string, ENT_QUOTES, 'UTF-8', false );
}
@@ -447,13 +507,30 @@ class Message {
/**
* Magic method implementation of the above (for PHP >= 5.2.0), so we can do, eg:
- * $foo = Message::get($key);
+ * $foo = Message::get( $key );
* $string = "<abbr>$foo</abbr>";
* @since 1.18
* @return String
*/
public function __toString() {
- return $this->toString();
+ // PHP doesn't allow __toString to throw exceptions and will
+ // trigger a fatal error if it does. So, catch any exceptions.
+
+ try {
+ return $this->toString();
+ } catch ( Exception $ex ) {
+ try {
+ trigger_error( "Exception caught in " . __METHOD__ . " (message " . $this->key . "): "
+ . $ex, E_USER_WARNING );
+ } catch ( Exception $ex ) {
+ // Doh! Cause a fatal error after all?
+ }
+
+ if ( $this->format === 'plain' ) {
+ return '<' . $this->key . '>';
+ }
+ return '&lt;' . $this->key . '&gt;';
+ }
}
/**
@@ -477,7 +554,7 @@ class Message {
}
/**
- * Returns the message text as-is, only parameters are subsituted.
+ * Returns the message text as-is, only parameters are substituted.
* @since 1.17
* @return String: Unescaped untransformed message text.
*/
@@ -530,7 +607,7 @@ class Message {
/**
* Check whether a message does not exist, is an empty string, or is "-"
* @since 1.18
- * @return Bool: true if is is and false if not
+ * @return Bool: true if it is and false if not
*/
public function isDisabled() {
$message = $this->fetchMessage();
@@ -556,10 +633,10 @@ class Message {
}
/**
- * Substitutes any paramaters into the message text.
+ * Substitutes any parameters into the message text.
* @since 1.17
- * @param $message String: the message text
- * @param $type String: either before or after
+ * @param string $message the message text
+ * @param string $type either before or after
* @return String
*/
protected function replaceParameters( $message, $type = 'before' ) {
@@ -577,7 +654,7 @@ class Message {
/**
* Extracts the parameter type and preprocessed the value if needed.
* @since 1.18
- * @param $param String|Array: Parameter as defined in this class.
+ * @param string|array $param Parameter as defined in this class.
* @return Tuple(type, value)
*/
protected function extractParam( $param ) {
@@ -601,17 +678,18 @@ class Message {
/**
* Wrapper for what ever method we use to parse wikitext.
* @since 1.17
- * @param $string String: Wikitext message contents
+ * @param string $string Wikitext message contents
* @return string Wikitext parsed into HTML
*/
protected function parseText( $string ) {
- return MessageCache::singleton()->parse( $string, $this->title, /*linestart*/true, $this->interface, $this->language )->getText();
+ $out = MessageCache::singleton()->parse( $string, $this->title, /*linestart*/true, $this->interface, $this->language );
+ return is_object( $out ) ? $out->getText() : $out;
}
/**
* Wrapper for what ever method we use to {{-transform wikitext.
* @since 1.17
- * @param $string String: Wikitext message contents
+ * @param string $string Wikitext message contents
* @return string Wikitext with {{-constructs replaced with their values.
*/
protected function transformText( $string ) {
@@ -621,6 +699,7 @@ class Message {
/**
* Wrapper for what ever method we use to get message contents
* @since 1.17
+ * @throws MWException
* @return string
*/
protected function fetchMessage() {
@@ -645,3 +724,45 @@ class Message {
}
}
+
+/**
+ * Variant of the Message class.
+ *
+ * Rather than treating the message key as a lookup
+ * value (which is passed to the MessageCache and
+ * translated as necessary), a RawMessage key is
+ * treated as the actual message.
+ *
+ * All other functionality (parsing, escaping, etc.)
+ * is preserved.
+ *
+ * @since 1.21
+ */
+class RawMessage extends Message {
+ /**
+ * Call the parent constructor, then store the key as
+ * the message.
+ *
+ * @param string $key Message to use
+ * @param array $params Parameters for the message
+ * @see Message::__construct
+ */
+ public function __construct( $key, $params = array() ) {
+ parent::__construct( $key, $params );
+ // The key is the message.
+ $this->message = $key;
+ }
+
+ /**
+ * Fetch the message (in this case, the key).
+ *
+ * @return string
+ */
+ public function fetchMessage() {
+ // Just in case the message is unset somewhere.
+ if( !isset( $this->message ) ) {
+ $this->message = $this->key;
+ }
+ return $this->message;
+ }
+}
diff --git a/includes/MessageBlobStore.php b/includes/MessageBlobStore.php
index c96ea56e..8a8142b7 100644
--- a/includes/MessageBlobStore.php
+++ b/includes/MessageBlobStore.php
@@ -29,7 +29,7 @@
* A message blob is a JSON object containing the interface messages for a
* certain resource in a certain language. These message blobs are cached
* in the msg_resource table and automatically invalidated when one of their
- * consistuent messages or the resource itself is changed.
+ * constituent messages or the resource itself is changed.
*/
class MessageBlobStore {
@@ -37,8 +37,8 @@ class MessageBlobStore {
* Get the message blobs for a set of modules
*
* @param $resourceLoader ResourceLoader object
- * @param $modules array Array of module objects keyed by module name
- * @param $lang string Language code
+ * @param array $modules Array of module objects keyed by module name
+ * @param string $lang Language code
* @return array An array mapping module names to message blobs
*/
public static function get( ResourceLoader $resourceLoader, $modules, $lang ) {
@@ -68,9 +68,9 @@ class MessageBlobStore {
* present, it is not regenerated; instead, the preexisting blob
* is fetched and returned.
*
- * @param $name String: module name
+ * @param string $name module name
* @param $module ResourceLoaderModule object
- * @param $lang String: language code
+ * @param string $lang language code
* @return mixed Message blob or false if the module has no messages
*/
public static function insertMessageBlob( $name, ResourceLoaderModule $module, $lang ) {
@@ -125,9 +125,9 @@ class MessageBlobStore {
/**
* Update the message blob for a given module in a given language
*
- * @param $name String: module name
+ * @param string $name module name
* @param $module ResourceLoaderModule object
- * @param $lang String: language code
+ * @param string $lang language code
* @return String Regenerated message blob, or null if there was no blob for the given module/language pair
*/
public static function updateModule( $name, ResourceLoaderModule $module, $lang ) {
@@ -195,7 +195,7 @@ class MessageBlobStore {
/**
* Update a single message in all message blobs it occurs in.
*
- * @param $key String: message key
+ * @param string $key message key
*/
public static function updateMessage( $key ) {
try {
@@ -255,8 +255,8 @@ class MessageBlobStore {
/**
* Create an update queue for updateMessage()
*
- * @param $key String: message key
- * @param $prevUpdates Array: updates queue to refresh or null to build a fresh update queue
+ * @param string $key message key
+ * @param array $prevUpdates updates queue to refresh or null to build a fresh update queue
* @return Array: updates queue
*/
private static function getUpdatesForMessage( $key, $prevUpdates = null ) {
@@ -306,9 +306,9 @@ class MessageBlobStore {
/**
* Reencode a message blob with the updated value for a message
*
- * @param $blob String: message blob (JSON object)
- * @param $key String: message key
- * @param $lang String: language code
+ * @param string $blob message blob (JSON object)
+ * @param string $key message key
+ * @param string $lang language code
* @return Message blob with $key replaced with its new value
*/
private static function reencodeBlob( $blob, $key, $lang ) {
@@ -323,8 +323,9 @@ class MessageBlobStore {
* Modules whose blobs are not in the database are silently dropped.
*
* @param $resourceLoader ResourceLoader object
- * @param $modules Array of module names
- * @param $lang String: language code
+ * @param array $modules of module names
+ * @param string $lang language code
+ * @throws MWException
* @return array Array mapping module names to blobs
*/
private static function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) {
@@ -360,7 +361,7 @@ class MessageBlobStore {
* Generate the message blob for a given module in a given language.
*
* @param $module ResourceLoaderModule object
- * @param $lang String: language code
+ * @param string $lang language code
* @return String: JSON object
*/
private static function generateMessageBlob( ResourceLoaderModule $module, $lang ) {
diff --git a/includes/Metadata.php b/includes/Metadata.php
index 0ca15393..0b8014a7 100644
--- a/includes/Metadata.php
+++ b/includes/Metadata.php
@@ -34,7 +34,7 @@ abstract class RdfMetaData {
$this->mArticle = $article;
}
- public abstract function show();
+ abstract public function show();
protected function setup() {
global $wgOut, $wgRequest;
@@ -42,7 +42,7 @@ abstract class RdfMetaData {
$httpaccept = isset( $_SERVER['HTTP_ACCEPT'] ) ? $_SERVER['HTTP_ACCEPT'] : null;
$rdftype = wfNegotiateType( wfAcceptToPrefs( $httpaccept ), wfAcceptToPrefs( self::RDF_TYPE_PREFS ) );
- if( !$rdftype ){
+ if( !$rdftype ) {
throw new HttpError( 406, wfMessage( 'notacceptable' ) );
}
@@ -70,7 +70,7 @@ abstract class RdfMetaData {
$lastEditor = User::newFromId( $this->mArticle->getUser() );
$this->person( 'creator', $lastEditor );
- foreach( $this->mArticle->getContributors() as $user ){
+ foreach( $this->mArticle->getContributors() as $user ) {
$this->person( 'contributor', $user );
}
@@ -82,10 +82,10 @@ abstract class RdfMetaData {
print "\t\t<dc:{$name}>{$value}</dc:{$name}>\n";
}
- protected function date($timestamp) {
- return substr($timestamp, 0, 4) . '-'
- . substr($timestamp, 4, 2) . '-'
- . substr($timestamp, 6, 2);
+ protected function date( $timestamp ) {
+ return substr( $timestamp, 0, 4 ) . '-'
+ . substr( $timestamp, 4, 2 ) . '-'
+ . substr( $timestamp, 6, 2 );
}
protected function pageOrString( $name, $page, $str ) {
@@ -95,7 +95,7 @@ abstract class RdfMetaData {
$nt = Title::newFromText( $page );
}
- if( !$nt || $nt->getArticleID() == 0 ){
+ if( !$nt || $nt->getArticleID() == 0 ) {
$this->element( $name, $str );
} else {
$this->page( $name, $nt );
@@ -110,13 +110,13 @@ abstract class RdfMetaData {
$this->url( $name, $title->getFullUrl() );
}
- protected function url($name, $url) {
+ protected function url( $name, $url ) {
$url = htmlspecialchars( $url );
print "\t\t<dc:{$name} rdf:resource=\"{$url}\" />\n";
}
protected function person( $name, User $user ) {
- if( $user->isAnon() ){
+ if( $user->isAnon() ) {
$this->element( $name, wfMessage( 'anonymous' )->numParams( 1 )->text() );
} else {
$real = $user->getRealName();
@@ -141,19 +141,19 @@ abstract class RdfMetaData {
global $wgRightsPage, $wgRightsUrl, $wgRightsText;
if( $wgRightsPage && ( $nt = Title::newFromText( $wgRightsPage ) )
- && ($nt->getArticleID() != 0)) {
- $this->page('rights', $nt);
- } elseif( $wgRightsUrl ){
- $this->url('rights', $wgRightsUrl);
- } elseif( $wgRightsText ){
+ && ( $nt->getArticleID() != 0 ) ) {
+ $this->page( 'rights', $nt );
+ } elseif( $wgRightsUrl ) {
+ $this->url( 'rights', $wgRightsUrl );
+ } elseif( $wgRightsText ) {
$this->element( 'rights', $wgRightsText );
}
}
- protected function getTerms( $url ){
+ protected function getTerms( $url ) {
global $wgLicenseTerms;
- if( $wgLicenseTerms ){
+ if( $wgLicenseTerms ) {
return $wgLicenseTerms;
} else {
$known = $this->getKnownLicenses();
@@ -166,23 +166,23 @@ abstract class RdfMetaData {
}
protected function getKnownLicenses() {
- $ccLicenses = array('by', 'by-nd', 'by-nd-nc', 'by-nc',
- 'by-nc-sa', 'by-sa');
- $ccVersions = array('1.0', '2.0');
+ $ccLicenses = array( 'by', 'by-nd', 'by-nd-nc', 'by-nc',
+ 'by-nc-sa', 'by-sa' );
+ $ccVersions = array( '1.0', '2.0' );
$knownLicenses = array();
- foreach ($ccVersions as $version) {
- foreach ($ccLicenses as $license) {
- if( $version == '2.0' && substr( $license, 0, 2) != 'by' ) {
+ foreach ( $ccVersions as $version ) {
+ foreach ( $ccLicenses as $license ) {
+ if( $version == '2.0' && substr( $license, 0, 2 ) != 'by' ) {
# 2.0 dropped the non-attribs licenses
continue;
}
$lurl = "http://creativecommons.org/licenses/{$license}/{$version}/";
- $knownLicenses[$lurl] = explode('-', $license);
+ $knownLicenses[$lurl] = explode( '-', $license );
$knownLicenses[$lurl][] = 're';
$knownLicenses[$lurl][] = 'di';
$knownLicenses[$lurl][] = 'no';
- if (!in_array('nd', $knownLicenses[$lurl])) {
+ if ( !in_array( 'nd', $knownLicenses[$lurl] ) ) {
$knownLicenses[$lurl][] = 'de';
}
}
@@ -191,13 +191,12 @@ abstract class RdfMetaData {
/* Handle the GPL and LGPL, too. */
$knownLicenses['http://creativecommons.org/licenses/GPL/2.0/'] =
- array('de', 're', 'di', 'no', 'sa', 'sc');
+ array( 'de', 're', 'di', 'no', 'sa', 'sc' );
$knownLicenses['http://creativecommons.org/licenses/LGPL/2.1/'] =
- array('de', 're', 'di', 'no', 'sa', 'sc');
+ array( 'de', 're', 'di', 'no', 'sa', 'sc' );
$knownLicenses['http://www.gnu.org/copyleft/fdl.html'] =
- array('de', 're', 'di', 'no', 'sa', 'sc');
+ array( 'de', 're', 'di', 'no', 'sa', 'sc' );
return $knownLicenses;
}
}
-
diff --git a/includes/MimeMagic.php b/includes/MimeMagic.php
index 1873e7bf..edabd54c 100644
--- a/includes/MimeMagic.php
+++ b/includes/MimeMagic.php
@@ -25,21 +25,21 @@
* This is used as a fallback to mime.types files.
* An extensive list of well known mime types is provided by
* the file mime.types in the includes directory.
- *
+ *
* This list concatenated with mime.types is used to create a mime <-> ext
* map. Each line contains a mime type followed by a space separated list of
- * extensions. If multiple extensions for a single mime type exist or if
+ * extensions. If multiple extensions for a single mime type exist or if
* multiple mime types exist for a single extension then in most cases
* MediaWiki assumes that the first extension following the mime type is the
* canonical extension, and the first time a mime type appears for a certain
* extension is considered the canonical mime type.
- *
+ *
* (Note that appending $wgMimeTypeFile to the end of MM_WELL_KNOWN_MIME_TYPES
- * sucks because you can't redefine canonical types. This could be fixed by
+ * sucks because you can't redefine canonical types. This could be fixed by
* appending MM_WELL_KNOWN_MIME_TYPES behind $wgMimeTypeFile, but who knows
* what will break? In practice this probably isn't a problem anyway -- Bryan)
*/
-define('MM_WELL_KNOWN_MIME_TYPES',<<<END_STRING
+define('MM_WELL_KNOWN_MIME_TYPES', <<<END_STRING
application/ogg ogx ogg ogm ogv oga spx
application/pdf pdf
application/vnd.oasis.opendocument.chart odc
@@ -70,7 +70,7 @@ image/x-bmp bmp
image/gif gif
image/jpeg jpeg jpg jpe
image/png png
-image/svg+xml svg
+image/svg+xml svg
image/svg svg
image/tiff tiff tif
image/vnd.djvu djvu
@@ -144,21 +144,21 @@ END_STRING
class MimeMagic {
/**
- * Mapping of media types to arrays of mime types.
- * This is used by findMediaType and getMediaType, respectively
- */
+ * Mapping of media types to arrays of mime types.
+ * This is used by findMediaType and getMediaType, respectively
+ */
var $mMediaTypes = null;
/** Map of mime type aliases
- */
+ */
var $mMimeTypeAliases = null;
- /** map of mime types to file extensions (as a space seprarated list)
- */
+ /** map of mime types to file extensions (as a space separated list)
+ */
var $mMimeToExt = null;
- /** map of file extensions types to mime types (as a space seprarated list)
- */
+ /** map of file extensions types to mime types (as a space separated list)
+ */
var $mExtToMime = null;
/** IEContentAnalyzer instance
@@ -179,8 +179,8 @@ class MimeMagic {
*/
function __construct() {
/**
- * --- load mime.types ---
- */
+ * --- load mime.types ---
+ */
global $wgMimeTypeFile, $IP, $wgLoadFileinfoExtension;
@@ -197,14 +197,14 @@ class MimeMagic {
if ( $wgMimeTypeFile ) {
if ( is_file( $wgMimeTypeFile ) and is_readable( $wgMimeTypeFile ) ) {
- wfDebug( __METHOD__.": loading mime types from $wgMimeTypeFile\n" );
+ wfDebug( __METHOD__ . ": loading mime types from $wgMimeTypeFile\n" );
$types .= "\n";
$types .= file_get_contents( $wgMimeTypeFile );
} else {
- wfDebug( __METHOD__.": can't load mime types from $wgMimeTypeFile\n" );
+ wfDebug( __METHOD__ . ": can't load mime types from $wgMimeTypeFile\n" );
}
} else {
- wfDebug( __METHOD__.": no mime types file defined, using build-ins only.\n" );
+ wfDebug( __METHOD__ . ": no mime types file defined, using build-ins only.\n" );
}
$types = str_replace( array( "\r\n", "\n\r", "\n\n", "\r\r", "\r" ), "\n", $types );
@@ -213,7 +213,7 @@ class MimeMagic {
$this->mMimeToExt = array();
$this->mToMime = array();
- $lines = explode( "\n",$types );
+ $lines = explode( "\n", $types );
foreach ( $lines as $s ) {
$s = trim( $s );
if ( empty( $s ) ) {
@@ -231,7 +231,7 @@ class MimeMagic {
}
$mime = substr( $s, 0, $i );
- $ext = trim( substr($s, $i+1 ) );
+ $ext = trim( substr( $s, $i+1 ) );
if ( empty( $ext ) ) {
continue;
@@ -272,17 +272,17 @@ class MimeMagic {
if ( $wgMimeInfoFile ) {
if ( is_file( $wgMimeInfoFile ) and is_readable( $wgMimeInfoFile ) ) {
- wfDebug( __METHOD__.": loading mime info from $wgMimeInfoFile\n" );
+ wfDebug( __METHOD__ . ": loading mime info from $wgMimeInfoFile\n" );
$info .= "\n";
$info .= file_get_contents( $wgMimeInfoFile );
} else {
- wfDebug(__METHOD__.": can't load mime info from $wgMimeInfoFile\n");
+ wfDebug( __METHOD__ . ": can't load mime info from $wgMimeInfoFile\n" );
}
} else {
- wfDebug(__METHOD__.": no mime info file defined, using build-ins only.\n");
+ wfDebug( __METHOD__ . ": no mime info file defined, using build-ins only.\n" );
}
- $info = str_replace( array( "\r\n", "\n\r", "\n\n", "\r\r", "\r" ), "\n", $info);
+ $info = str_replace( array( "\r\n", "\n\r", "\n\n", "\r\r", "\r" ), "\n", $info );
$info = str_replace( "\t", " ", $info );
$this->mMimeTypeAliases = array();
@@ -330,9 +330,9 @@ class MimeMagic {
$this->mMediaTypes[$mtype][] = $mime;
}
- if ( sizeof( $m ) > 1 ) {
+ if ( count( $m ) > 1 ) {
$main = $m[0];
- for ( $i=1; $i<sizeof($m); $i += 1 ) {
+ for ( $i = 1; $i < count( $m ); $i += 1 ) {
$mime = $m[$i];
$this->mMimeTypeAliases[$mime] = $main;
}
@@ -346,17 +346,17 @@ class MimeMagic {
* @return MimeMagic
*/
public static function &singleton() {
- if ( !isset( self::$instance ) ) {
+ if ( self::$instance === null ) {
self::$instance = new MimeMagic;
}
return self::$instance;
}
- /**
- * Returns a list of file extensions for a given mime type as a space
+ /**
+ * Returns a list of file extensions for a given mime type as a space
* separated string or null if the mime type was unrecognized. Resolves
* mime type aliases.
- *
+ *
* @param $mime string
* @return string|null
*/
@@ -379,10 +379,10 @@ class MimeMagic {
return null;
}
- /**
- * Returns a list of mime types for a given file extension as a space
+ /**
+ * Returns a list of mime types for a given file extension as a space
* separated string or null if the extension was unrecognized.
- *
+ *
* @param $ext string
* @return string|null
*/
@@ -393,10 +393,10 @@ class MimeMagic {
return $r;
}
- /**
+ /**
* Returns a single mime type for a given file extension or null if unknown.
* This is always the first type from the list returned by getTypesForExtension($ext).
- *
+ *
* @param $ext string
* @return string|null
*/
@@ -413,12 +413,11 @@ class MimeMagic {
return $m;
}
-
- /**
- * Tests if the extension matches the given mime type. Returns true if a
- * match was found, null if the mime type is unknown, and false if the
+ /**
+ * Tests if the extension matches the given mime type. Returns true if a
+ * match was found, null if the mime type is unknown, and false if the
* mime type is known but no matches where found.
- *
+ *
* @param $extension string
* @param $mime string
* @return bool|null
@@ -427,21 +426,21 @@ class MimeMagic {
$ext = $this->getExtensionsForType( $mime );
if ( !$ext ) {
- return null; // Unknown mime type
+ return null; // Unknown mime type
}
$ext = explode( ' ', $ext );
$extension = strtolower( $extension );
- return in_array( $extension, $ext );
+ return in_array( $extension, $ext );
}
- /**
- * Returns true if the mime type is known to represent an image format
+ /**
+ * Returns true if the mime type is known to represent an image format
* supported by the PHP GD library.
*
* @param $mime string
- *
+ *
* @return bool
*/
public function isPHPImageType( $mime ) {
@@ -489,32 +488,32 @@ class MimeMagic {
return in_array( strtolower( $extension ), $types );
}
- /**
+ /**
* Improves a mime type using the file extension. Some file formats are very generic,
- * so their mime type is not very meaningful. A more useful mime type can be derived
- * by looking at the file extension. Typically, this method would be called on the
+ * so their mime type is not very meaningful. A more useful mime type can be derived
+ * by looking at the file extension. Typically, this method would be called on the
* result of guessMimeType().
- *
+ *
* Currently, this method does the following:
*
* If $mime is "unknown/unknown" and isRecognizableExtension( $ext ) returns false,
- * return the result of guessTypesForExtension($ext).
+ * return the result of guessTypesForExtension($ext).
*
* If $mime is "application/x-opc+zip" and isMatchingExtension( $ext, $mime )
- * gives true, return the result of guessTypesForExtension($ext).
+ * gives true, return the result of guessTypesForExtension($ext).
*
- * @param $mime String: the mime type, typically guessed from a file's content.
- * @param $ext String: the file extension, as taken from the file name
+ * @param string $mime the mime type, typically guessed from a file's content.
+ * @param string $ext the file extension, as taken from the file name
*
* @return string the mime type
*/
public function improveTypeFromExtension( $mime, $ext ) {
if ( $mime === 'unknown/unknown' ) {
if ( $this->isRecognizableExtension( $ext ) ) {
- wfDebug( __METHOD__. ': refusing to guess mime type for .' .
+ wfDebug( __METHOD__ . ': refusing to guess mime type for .' .
"$ext file, we should have recognized it\n" );
} else {
- // Not something we can detect, so simply
+ // Not something we can detect, so simply
// trust the file extension
$mime = $this->guessTypesForExtension( $ext );
}
@@ -525,7 +524,7 @@ class MimeMagic {
// find the proper mime type for that file extension
$mime = $this->guessTypesForExtension( $ext );
} else {
- wfDebug( __METHOD__. ": refusing to guess better type for $mime file, " .
+ wfDebug( __METHOD__ . ": refusing to guess better type for $mime file, " .
".$ext is not a known OPC extension.\n" );
$mime = 'application/zip';
}
@@ -535,34 +534,34 @@ class MimeMagic {
$mime = $this->mMimeTypeAliases[$mime];
}
- wfDebug(__METHOD__.": improved mime type for .$ext: $mime\n");
+ wfDebug( __METHOD__ . ": improved mime type for .$ext: $mime\n" );
return $mime;
}
- /**
- * Mime type detection. This uses detectMimeType to detect the mime type
- * of the file, but applies additional checks to determine some well known
- * file formats that may be missed or misinterpreter by the default mime
- * detection (namely XML based formats like XHTML or SVG, as well as ZIP
+ /**
+ * Mime type detection. This uses detectMimeType to detect the mime type
+ * of the file, but applies additional checks to determine some well known
+ * file formats that may be missed or misinterpreted by the default mime
+ * detection (namely XML based formats like XHTML or SVG, as well as ZIP
* based formats like OPC/ODF files).
*
- * @param $file String: the file to check
+ * @param string $file the file to check
* @param $ext Mixed: the file extension, or true (default) to extract it from the filename.
- * Set it to false to ignore the extension. DEPRECATED! Set to false, use
+ * Set it to false to ignore the extension. DEPRECATED! Set to false, use
* improveTypeFromExtension($mime, $ext) later to improve mime type.
*
* @return string the mime type of $file
*/
public function guessMimeType( $file, $ext = true ) {
if ( $ext ) { // TODO: make $ext default to false. Or better, remove it.
- wfDebug( __METHOD__.": WARNING: use of the \$ext parameter is deprecated. " .
+ wfDebug( __METHOD__ . ": WARNING: use of the \$ext parameter is deprecated. " .
"Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
}
$mime = $this->doGuessMimeType( $file, $ext );
if( !$mime ) {
- wfDebug( __METHOD__.": internal type detection failed for $file (.$ext)...\n" );
+ wfDebug( __METHOD__ . ": internal type detection failed for $file (.$ext)...\n" );
$mime = $this->detectMimeType( $file, $ext );
}
@@ -570,7 +569,7 @@ class MimeMagic {
$mime = $this->mMimeTypeAliases[$mime];
}
- wfDebug(__METHOD__.": guessed mime type of $file: $mime\n");
+ wfDebug( __METHOD__ . ": guessed mime type of $file: $mime\n" );
return $mime;
}
@@ -587,7 +586,7 @@ class MimeMagic {
// @todo FIXME: Shouldn't this be rb?
$f = fopen( $file, 'rt' );
wfRestoreWarnings();
-
+
if( !$f ) {
return 'unknown/unknown';
}
@@ -629,7 +628,7 @@ class MimeMagic {
$doctype = strpos( $head, "\x42\x82" );
if ( $doctype ) {
// Next byte is datasize, then data (sizes larger than 1 byte are very stupid muxers)
- $data = substr($head, $doctype+3, 8);
+ $data = substr( $head, $doctype+3, 8 );
if ( strncmp( $data, "matroska", 8 ) == 0 ) {
wfDebug( __METHOD__ . ": recognized file as video/x-matroska\n" );
return "video/x-matroska";
@@ -661,12 +660,11 @@ class MimeMagic {
* strings like "<? ", but should it be axed completely?
*/
if ( ( strpos( $head, '<?php' ) !== false ) ||
-
- ( strpos( $head, "<\x00?\x00p\x00h\x00p" ) !== false ) ||
- ( strpos( $head, "<\x00?\x00 " ) !== false ) ||
- ( strpos( $head, "<\x00?\x00\n" ) !== false ) ||
- ( strpos( $head, "<\x00?\x00\t" ) !== false ) ||
- ( strpos( $head, "<\x00?\x00=" ) !== false ) ) {
+ ( strpos( $head, "<\x00?\x00p\x00h\x00p" ) !== false ) ||
+ ( strpos( $head, "<\x00?\x00 " ) !== false ) ||
+ ( strpos( $head, "<\x00?\x00\n" ) !== false ) ||
+ ( strpos( $head, "<\x00?\x00\t" ) !== false ) ||
+ ( strpos( $head, "<\x00?\x00=" ) !== false ) ) {
wfDebug( __METHOD__ . ": recognized $file as application/x-php\n" );
return 'application/x-php';
@@ -698,11 +696,11 @@ class MimeMagic {
} elseif ( substr( $head, 0, 7) == "\xfe\xff\x00#\x00!" ) {
$script_type = "UTF-16BE";
} elseif ( substr( $head, 0, 7 ) == "\xff\xfe#\x00!" ) {
- $script_type= "UTF-16LE";
+ $script_type = "UTF-16LE";
}
if ( $script_type ) {
- if ( $script_type !== "UTF-8" && $script_type !== "ASCII") {
+ if ( $script_type !== "UTF-8" && $script_type !== "ASCII" ) {
// Quick and dirty fold down to ASCII!
$pack = array( 'UTF-16BE' => 'n*', 'UTF-16LE' => 'v*' );
$chars = unpack( $pack[$script_type], substr( $head, 2 ) );
@@ -720,14 +718,14 @@ class MimeMagic {
if ( preg_match( '%/?([^\s]+/)(\w+)%', $head, $match ) ) {
$mime = "application/x-{$match[2]}";
- wfDebug( __METHOD__.": shell script recognized as $mime\n" );
+ wfDebug( __METHOD__ . ": shell script recognized as $mime\n" );
return $mime;
}
}
// Check for ZIP variants (before getimagesize)
if ( strpos( $tail, "PK\x05\x06" ) !== false ) {
- wfDebug( __METHOD__.": ZIP header present in $file\n" );
+ wfDebug( __METHOD__ . ": ZIP header present in $file\n" );
return $this->detectZipType( $head, $tail, $ext );
}
@@ -737,36 +735,36 @@ class MimeMagic {
if( $gis && isset( $gis['mime'] ) ) {
$mime = $gis['mime'];
- wfDebug( __METHOD__.": getimagesize detected $file as $mime\n" );
+ wfDebug( __METHOD__ . ": getimagesize detected $file as $mime\n" );
return $mime;
}
// Also test DjVu
$deja = new DjVuImage( $file );
if( $deja->isValid() ) {
- wfDebug( __METHOD__.": detected $file as image/vnd.djvu\n" );
+ wfDebug( __METHOD__ . ": detected $file as image/vnd.djvu\n" );
return 'image/vnd.djvu';
}
return false;
}
-
+
/**
* Detect application-specific file type of a given ZIP file from its
* header data. Currently works for OpenDocument and OpenXML types...
* If can't tell, returns 'application/zip'.
*
- * @param $header String: some reasonably-sized chunk of file header
+ * @param string $header some reasonably-sized chunk of file header
* @param $tail String: the tail of the file
* @param $ext Mixed: the file extension, or true to extract it from the filename.
- * Set it to false (default) to ignore the extension. DEPRECATED! Set to false,
+ * Set it to false (default) to ignore the extension. DEPRECATED! Set to false,
* use improveTypeFromExtension($mime, $ext) later to improve mime type.
*
* @return string
*/
function detectZipType( $header, $tail = null, $ext = false ) {
if( $ext ) { # TODO: remove $ext param
- wfDebug( __METHOD__.": WARNING: use of the \$ext parameter is deprecated. " .
+ wfDebug( __METHOD__ . ": WARNING: use of the \$ext parameter is deprecated. " .
"Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
}
@@ -797,30 +795,31 @@ class MimeMagic {
if ( preg_match( $opendocRegex, substr( $header, 30 ), $matches ) ) {
$mime = $matches[1];
- wfDebug( __METHOD__.": detected $mime from ZIP archive\n" );
+ wfDebug( __METHOD__ . ": detected $mime from ZIP archive\n" );
} elseif ( preg_match( $openxmlRegex, substr( $header, 30 ) ) ) {
$mime = "application/x-opc+zip";
- # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere
- if ( $ext !== true && $ext !== false ) {
+ # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere
+ if ( $ext !== true && $ext !== false ) {
/** This is the mode used by getPropsFromPath
- * These mime's are stored in the database, where we don't really want
- * x-opc+zip, because we use it only for internal purposes
- */
+ * These mime's are stored in the database, where we don't really want
+ * x-opc+zip, because we use it only for internal purposes
+ */
if ( $this->isMatchingExtension( $ext, $mime) ) {
/* A known file extension for an OPC file,
- * find the proper mime type for that file extension */
+ * find the proper mime type for that file extension
+ */
$mime = $this->guessTypesForExtension( $ext );
} else {
$mime = "application/zip";
}
}
- wfDebug( __METHOD__.": detected an Open Packaging Conventions archive: $mime\n" );
- } elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
+ wfDebug( __METHOD__ . ": detected an Open Packaging Conventions archive: $mime\n" );
+ } elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
($headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
preg_match( $openxmlRegex, substr( $tail, $headerpos + 30 ) ) ) {
if ( substr( $header, 512, 4) == "\xEC\xA5\xC1\x00" ) {
$mime = "application/msword";
- }
+ }
switch( substr( $header, 512, 6) ) {
case "\xEC\xA5\xC1\x00\x0E\x00":
case "\xEC\xA5\xC1\x00\x1C\x00":
@@ -843,27 +842,27 @@ class MimeMagic {
break;
}
- wfDebug( __METHOD__.": detected a MS Office document with OPC trailer\n");
+ wfDebug( __METHOD__ . ": detected a MS Office document with OPC trailer\n" );
} else {
- wfDebug( __METHOD__.": unable to identify type of ZIP archive\n" );
+ wfDebug( __METHOD__ . ": unable to identify type of ZIP archive\n" );
}
return $mime;
}
- /**
- * Internal mime type detection. Detection is done using an external
- * program, if $wgMimeDetectorCommand is set. Otherwise, the fileinfo
- * extension and mime_content_type are tried (in this order), if they
- * are available. If the dections fails and $ext is not false, the mime
+ /**
+ * Internal mime type detection. Detection is done using an external
+ * program, if $wgMimeDetectorCommand is set. Otherwise, the fileinfo
+ * extension and mime_content_type are tried (in this order), if they
+ * are available. If the detections fails and $ext is not false, the mime
* type is guessed from the file extension, using guessTypesForExtension.
- *
- * If the mime type is still unknown, getimagesize is used to detect the
- * mime type if the file is an image. If no mime type can be determined,
+ *
+ * If the mime type is still unknown, getimagesize is used to detect the
+ * mime type if the file is an image. If no mime type can be determined,
* this function returns 'unknown/unknown'.
*
- * @param $file String: the file to check
+ * @param string $file the file to check
* @param $ext Mixed: the file extension, or true (default) to extract it from the filename.
- * Set it to false to ignore the extension. DEPRECATED! Set to false, use
+ * Set it to false to ignore the extension. DEPRECATED! Set to false, use
* improveTypeFromExtension($mime, $ext) later to improve mime type.
*
* @return string the mime type of $file
@@ -872,7 +871,7 @@ class MimeMagic {
global $wgMimeDetectorCommand;
if ( $ext ) { # TODO: make $ext default to false. Or better, remove it.
- wfDebug( __METHOD__.": WARNING: use of the \$ext parameter is deprecated. Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
+ wfDebug( __METHOD__ . ": WARNING: use of the \$ext parameter is deprecated. Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
}
$m = null;
@@ -898,22 +897,22 @@ class MimeMagic {
$m = finfo_file( $mime_magic_resource, $file );
finfo_close( $mime_magic_resource );
} else {
- wfDebug( __METHOD__.": finfo_open failed on ".FILEINFO_MIME."!\n" );
+ wfDebug( __METHOD__ . ": finfo_open failed on ".FILEINFO_MIME."!\n" );
}
} elseif ( function_exists( "mime_content_type" ) ) {
# NOTE: this function is available since PHP 4.3.0, but only if
# PHP was compiled with --with-mime-magic or, before 4.3.2, with --enable-mime-magic.
#
- # On Windows, you must set mime_magic.magicfile in php.ini to point to the mime.magic file bundeled with PHP;
+ # On Windows, you must set mime_magic.magicfile in php.ini to point to the mime.magic file bundled with PHP;
# sometimes, this may even be needed under linus/unix.
#
# Also note that this has been DEPRECATED in favor of the fileinfo extension by PECL, see above.
# see http://www.php.net/manual/en/ref.mime-magic.php for details.
- $m = mime_content_type($file);
+ $m = mime_content_type( $file );
} else {
- wfDebug( __METHOD__.": no magic mime detector found!\n" );
+ wfDebug( __METHOD__ . ": no magic mime detector found!\n" );
}
if ( $m ) {
@@ -925,7 +924,7 @@ class MimeMagic {
if ( strpos( $m, 'unknown' ) !== false ) {
$m = null;
} else {
- wfDebug( __METHOD__.": magic mime type of $file: $m\n" );
+ wfDebug( __METHOD__ . ": magic mime type of $file: $m\n" );
return $m;
}
}
@@ -937,11 +936,11 @@ class MimeMagic {
}
if ( $ext ) {
if( $this->isRecognizableExtension( $ext ) ) {
- wfDebug( __METHOD__. ": refusing to guess mime type for .$ext file, we should have recognized it\n" );
+ wfDebug( __METHOD__ . ": refusing to guess mime type for .$ext file, we should have recognized it\n" );
} else {
$m = $this->guessTypesForExtension( $ext );
if ( $m ) {
- wfDebug( __METHOD__.": extension mime type of $file: $m\n" );
+ wfDebug( __METHOD__ . ": extension mime type of $file: $m\n" );
return $m;
}
}
@@ -962,9 +961,9 @@ class MimeMagic {
* @todo analyse file if need be
* @todo look at multiple extension, separately and together.
*
- * @param $path String: full path to the image file, in case we have to look at the contents
+ * @param string $path full path to the image file, in case we have to look at the contents
* (if null, only the mime type is used to determine the media type code).
- * @param $mime String: mime type. If null it will be guessed using guessMimeType.
+ * @param string $mime mime type. If null it will be guessed using guessMimeType.
*
* @return (int?string?) a value to be used with the MEDIATYPE_xxx constants.
*/
@@ -1037,17 +1036,17 @@ class MimeMagic {
return $type;
}
- /**
+ /**
* Returns a media code matching the given mime type or file extension.
* File extensions are represented by a string starting with a dot (.) to
* distinguish them from mime types.
*
- * This funktion relies on the mapping defined by $this->mMediaTypes
+ * This function relies on the mapping defined by $this->mMediaTypes
* @access private
* @return int|string
*/
function findMediaType( $extMime ) {
- if ( strpos( $extMime, '.' ) === 0 ) {
+ if ( strpos( $extMime, '.' ) === 0 ) {
// If it's an extension, look up the mime types
$m = $this->getTypesForExtension( substr( $extMime, 1 ) );
if ( !$m ) {
@@ -1066,7 +1065,7 @@ class MimeMagic {
foreach ( $m as $mime ) {
foreach ( $this->mMediaTypes as $type => $codes ) {
- if ( in_array($mime, $codes, true ) ) {
+ if ( in_array( $mime, $codes, true ) ) {
return $type;
}
}
@@ -1076,12 +1075,12 @@ class MimeMagic {
}
/**
- * Get the MIME types that various versions of Internet Explorer would
+ * Get the MIME types that various versions of Internet Explorer would
* detect from a chunk of the content.
*
- * @param $fileName String: the file name (unused at present)
- * @param $chunk String: the first 256 bytes of the file
- * @param $proposed String: the MIME type proposed by the server
+ * @param string $fileName the file name (unused at present)
+ * @param string $chunk the first 256 bytes of the file
+ * @param string $proposed the MIME type proposed by the server
* @return Array
*/
public function getIEMimeTypes( $fileName, $chunk, $proposed ) {
diff --git a/includes/Namespace.php b/includes/Namespace.php
index 2e2b8d61..fccfbedb 100644
--- a/includes/Namespace.php
+++ b/includes/Namespace.php
@@ -48,6 +48,7 @@ class MWNamespace {
* @param $index
* @param $method
*
+ * @throws MWException
* @return bool
*/
private static function isMethodValidFor( $index, $method ) {
@@ -60,13 +61,13 @@ class MWNamespace {
/**
* Can pages in the given namespace be moved?
*
- * @param $index Int: namespace index
+ * @param int $index namespace index
* @return bool
*/
public static function isMovable( $index ) {
global $wgAllowImageMoving;
- $result = !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving ) || $index == NS_CATEGORY );
+ $result = !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving ) || $index == NS_CATEGORY );
/**
* @since 1.20
@@ -79,7 +80,7 @@ class MWNamespace {
/**
* Is the given namespace is a subject (non-talk) namespace?
*
- * @param $index Int: namespace index
+ * @param int $index namespace index
* @return bool
* @since 1.19
*/
@@ -100,7 +101,7 @@ class MWNamespace {
/**
* Is the given namespace a talk namespace?
*
- * @param $index Int: namespace index
+ * @param int $index namespace index
* @return bool
*/
public static function isTalk( $index ) {
@@ -111,7 +112,7 @@ class MWNamespace {
/**
* Get the talk namespace index for a given namespace
*
- * @param $index Int: namespace index
+ * @param int $index namespace index
* @return int
*/
public static function getTalk( $index ) {
@@ -125,7 +126,7 @@ class MWNamespace {
* Get the subject namespace index for a given namespace
* Special namespaces (NS_MEDIA, NS_SPECIAL) are always the subject.
*
- * @param $index Int: Namespace index
+ * @param int $index Namespace index
* @return int
*/
public static function getSubject( $index ) {
@@ -144,7 +145,7 @@ class MWNamespace {
* For talk namespaces, returns the subject (non-talk) namespace
* For subject (non-talk) namespaces, returns the talk namespace
*
- * @param $index Int: namespace index
+ * @param int $index namespace index
* @return int or null if no associated namespace could be found
*/
public static function getAssociated( $index ) {
@@ -180,8 +181,8 @@ class MWNamespace {
* of this function rather than directly doing comparison will make
* sure that code will not potentially break.
*
- * @param $ns1 int The first namespace index
- * @param $ns2 int The second namespae index
+ * @param int $ns1 The first namespace index
+ * @param int $ns2 The second namespace index
*
* @return bool
* @since 1.19
@@ -195,8 +196,8 @@ class MWNamespace {
* eg: NS_USER and NS_USER wil return true, as well
* NS_USER and NS_USER_TALK will return true.
*
- * @param $ns1 int The first namespace index
- * @param $ns2 int The second namespae index
+ * @param int $ns1 The first namespace index
+ * @param int $ns2 The second namespace index
*
* @return bool
* @since 1.19
@@ -209,12 +210,14 @@ class MWNamespace {
* Returns array of all defined namespaces with their canonical
* (English) names.
*
+ * @param bool $rebuild rebuild namespace list (default = false). Used for testing.
+ *
* @return array
* @since 1.17
*/
- public static function getCanonicalNamespaces() {
+ public static function getCanonicalNamespaces( $rebuild = false ) {
static $namespaces = null;
- if ( $namespaces === null ) {
+ if ( $namespaces === null || $rebuild ) {
global $wgExtraNamespaces, $wgCanonicalNamespaceNames;
$namespaces = array( NS_MAIN => '' ) + $wgCanonicalNamespaceNames;
if ( is_array( $wgExtraNamespaces ) ) {
@@ -228,7 +231,7 @@ class MWNamespace {
/**
* Returns the canonical (English) name for a given index
*
- * @param $index Int: namespace index
+ * @param int $index namespace index
* @return string or false if no canonical definition.
*/
public static function getCanonicalName( $index ) {
@@ -244,7 +247,7 @@ class MWNamespace {
* Returns the index for a given canonical name, or NULL
* The input *must* be converted to lower case first
*
- * @param $name String: namespace name
+ * @param string $name namespace name
* @return int
*/
public static function getCanonicalIndex( $name ) {
@@ -284,18 +287,18 @@ class MWNamespace {
/**
* Can this namespace ever have a talk namespace?
*
- * @param $index Int: namespace index
+ * @param int $index namespace index
* @return bool
*/
- public static function canTalk( $index ) {
+ public static function canTalk( $index ) {
return $index >= NS_MAIN;
- }
+ }
/**
* Does this namespace contain content, for the purposes of calculating
* statistics, etc?
*
- * @param $index Int: index to check
+ * @param int $index index to check
* @return bool
*/
public static function isContent( $index ) {
@@ -316,7 +319,7 @@ class MWNamespace {
/**
* Does the namespace allow subpages?
*
- * @param $index int Index to check
+ * @param int $index Index to check
* @return bool
*/
public static function hasSubpages( $index ) {
@@ -369,7 +372,7 @@ class MWNamespace {
/**
* Is the namespace first-letter capitalized?
*
- * @param $index int Index to check
+ * @param int $index Index to check
* @return bool
*/
public static function isCapitalized( $index ) {
@@ -397,7 +400,7 @@ class MWNamespace {
* genders. Not all languages make a distinction here.
*
* @since 1.18
- * @param $index int Index to check
+ * @param int $index Index to check
* @return bool
*/
public static function hasGenderDistinction( $index ) {
@@ -408,7 +411,7 @@ class MWNamespace {
* It is not possible to use pages from this namespace as template?
*
* @since 1.20
- * @param $index int Index to check
+ * @param int $index Index to check
* @return bool
*/
public static function isNonincludable( $index ) {
@@ -416,4 +419,18 @@ class MWNamespace {
return $wgNonincludableNamespaces && in_array( $index, $wgNonincludableNamespaces );
}
+ /**
+ * Get the default content model for a namespace
+ * This does not mean that all pages in that namespace have the model
+ *
+ * @since 1.21
+ * @param int $index Index to check
+ * @return null|string default model name for the given namespace, if set
+ */
+ public static function getNamespaceContentModel( $index ) {
+ global $wgNamespaceContentModels;
+ return isset( $wgNamespaceContentModels[$index] )
+ ? $wgNamespaceContentModels[$index]
+ : null;
+ }
}
diff --git a/includes/OutputHandler.php b/includes/OutputHandler.php
index 46a43f63..6b40c307 100644
--- a/includes/OutputHandler.php
+++ b/includes/OutputHandler.php
@@ -22,9 +22,9 @@
/**
* Standard output handler for use with ob_start
- *
+ *
* @param $s string
- *
+ *
* @return string
*/
function wfOutputHandler( $s ) {
@@ -85,14 +85,14 @@ function wfRequestExtension() {
/**
* Handler that compresses data with gzip if allowed by the Accept header.
* Unlike ob_gzhandler, it works for HEAD requests too.
- *
+ *
* @param $s string
*
* @return string
*/
function wfGzipHandler( $s ) {
if( !function_exists( 'gzencode' ) ) {
- wfDebug( __FUNCTION__ . "() skipping compression (gzencode unavaible)\n" );
+ wfDebug( __FUNCTION__ . "() skipping compression (gzencode unavailable)\n" );
return $s;
}
if( headers_sent() ) {
@@ -156,7 +156,7 @@ function wfMangleFlashPolicy( $s ) {
* @param $length int
*/
function wfDoContentLength( $length ) {
- if ( !headers_sent() && $_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.0' ) {
+ if ( !headers_sent() && isset( $_SERVER['SERVER_PROTOCOL'] ) && $_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.0' ) {
header( "Content-Length: $length" );
}
}
diff --git a/includes/OutputPage.php b/includes/OutputPage.php
index b4a81bb1..1e0c396a 100644
--- a/includes/OutputPage.php
+++ b/includes/OutputPage.php
@@ -43,6 +43,7 @@ class OutputPage extends ContextSource {
var $mKeywords = array();
var $mLinktags = array();
+ var $mCanonicalUrl = false;
/// Additional stylesheets. Looks like this is for extensions. Might be replaced by resource loader.
var $mExtStyles = array();
@@ -122,7 +123,7 @@ class OutputPage extends ContextSource {
var $mScripts = '';
/**
- * Inline CSS styles. Use addInlineStyle() sparsingly
+ * Inline CSS styles. Use addInlineStyle() sparingly
*/
var $mInlineStyles = '';
@@ -248,6 +249,11 @@ class OutputPage extends ContextSource {
private $mRedirectedFrom = null;
/**
+ * Additional key => value data
+ */
+ private $mProperties = array();
+
+ /**
* Constructor for OutputPage. This should not be called directly.
* Instead a new RequestContext should be created and it will implicitly create
* a OutputPage tied to that context.
@@ -255,7 +261,7 @@ class OutputPage extends ContextSource {
function __construct( IContextSource $context = null ) {
if ( $context === null ) {
# Extensions should use `new RequestContext` instead of `new OutputPage` now.
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.18' );
} else {
$this->setContext( $context );
}
@@ -264,8 +270,8 @@ class OutputPage extends ContextSource {
/**
* Redirect to $url rather than displaying the normal page
*
- * @param $url String: URL
- * @param $responsecode String: HTTP status code
+ * @param string $url URL
+ * @param string $responsecode HTTP status code
*/
public function redirect( $url, $responsecode = '302' ) {
# Strip newlines as a paranoia check for header injection in PHP<5.1.2
@@ -295,8 +301,8 @@ class OutputPage extends ContextSource {
* Add a new "<meta>" tag
* To add an http-equiv meta tag, precede the name with "http:"
*
- * @param $name String tag name
- * @param $val String tag value
+ * @param string $name tag name
+ * @param string $val tag value
*/
function addMeta( $name, $val ) {
array_push( $this->mMetatags, array( $name, $val ) );
@@ -305,7 +311,7 @@ class OutputPage extends ContextSource {
/**
* Add a keyword or a list of keywords in the page header
*
- * @param $text String or array of strings
+ * @param string $text or array of strings
*/
function addKeyword( $text ) {
if( is_array( $text ) ) {
@@ -316,9 +322,11 @@ class OutputPage extends ContextSource {
}
/**
- * Add a new \<link\> tag to the page header
+ * Add a new \<link\> tag to the page header.
+ *
+ * Note: use setCanonicalUrl() for rel=canonical.
*
- * @param $linkarr Array: associative array of attributes.
+ * @param array $linkarr associative array of attributes.
*/
function addLink( $linkarr ) {
array_push( $this->mLinktags, $linkarr );
@@ -327,7 +335,7 @@ class OutputPage extends ContextSource {
/**
* Add a new \<link\> with "rel" attribute set to "meta"
*
- * @param $linkarr Array: associative array mapping attribute names to their
+ * @param array $linkarr associative array mapping attribute names to their
* values, both keys and values will be escaped, and the
* "rel" attribute will be automatically added
*/
@@ -337,6 +345,14 @@ class OutputPage extends ContextSource {
}
/**
+ * Set the URL to be used for the <link rel=canonical>. This should be used
+ * in preference to addLink(), to avoid duplicate link tags.
+ */
+ function setCanonicalUrl( $url ) {
+ $this->mCanonicalUrl = $url;
+ }
+
+ /**
* Get the value of the "rel" attribute for metadata links
*
* @return String
@@ -355,7 +371,7 @@ class OutputPage extends ContextSource {
/**
* Add raw HTML to the list of scripts (including \<script\> tag, etc.)
*
- * @param $script String: raw HTML
+ * @param string $script raw HTML
*/
function addScript( $script ) {
$this->mScripts .= $script . "\n";
@@ -364,7 +380,7 @@ class OutputPage extends ContextSource {
/**
* Register and add a stylesheet from an extension directory.
*
- * @param $url String path to sheet. Provide either a full url (beginning
+ * @param string $url path to sheet. Provide either a full url (beginning
* with 'http', etc) or a relative path from the document root
* (beginning with '/'). Otherwise it behaves identically to
* addStyle() and draws from the /skins folder.
@@ -385,9 +401,9 @@ class OutputPage extends ContextSource {
/**
* Add a JavaScript file out of skins/common, or a given relative path.
*
- * @param $file String: filename in skins/common or complete on-server path
+ * @param string $file filename in skins/common or complete on-server path
* (/foo/bar.js)
- * @param $version String: style version of the file. Defaults to $wgStyleVersion
+ * @param string $version style version of the file. Defaults to $wgStyleVersion
*/
public function addScriptFile( $file, $version = null ) {
global $wgStylePath, $wgStyleVersion;
@@ -405,7 +421,7 @@ class OutputPage extends ContextSource {
/**
* Add a self-contained script tag with the given contents
*
- * @param $script String: JavaScript text, no "<script>" tags
+ * @param string $script JavaScript text, no "<script>" tags
*/
public function addInlineScript( $script ) {
$this->mScripts .= Html::inlineScript( "\n$script\n" ) . "\n";
@@ -424,14 +440,14 @@ class OutputPage extends ContextSource {
* Filter an array of modules to remove insufficiently trustworthy members, and modules
* which are no longer registered (eg a page is cached before an extension is disabled)
* @param $modules Array
- * @param $position String if not null, only return modules with this position
+ * @param string $position if not null, only return modules with this position
* @param $type string
* @return Array
*/
- protected function filterModules( $modules, $position = null, $type = ResourceLoaderModule::TYPE_COMBINED ){
+ protected function filterModules( $modules, $position = null, $type = ResourceLoaderModule::TYPE_COMBINED ) {
$resourceLoader = $this->getResourceLoader();
$filteredModules = array();
- foreach( $modules as $val ){
+ foreach( $modules as $val ) {
$module = $resourceLoader->getModule( $val );
if( $module instanceof ResourceLoaderModule
&& $module->getOrigin() <= $this->getAllowedModules( $type )
@@ -446,8 +462,8 @@ class OutputPage extends ContextSource {
/**
* Get the list of modules to include on this page
*
- * @param $filter Bool whether to filter out insufficiently trustworthy modules
- * @param $position String if not null, only return modules with this position
+ * @param bool $filter whether to filter out insufficiently trustworthy modules
+ * @param string $position if not null, only return modules with this position
* @param $param string
* @return Array of module names
*/
@@ -501,13 +517,15 @@ class OutputPage extends ContextSource {
* @return Array of module names
*/
public function getModuleStyles( $filter = false, $position = null ) {
- return $this->getModules( $filter, $position, 'mModuleStyles' );
+ return $this->getModules( $filter, $position, 'mModuleStyles' );
}
/**
- * Add only CSS of one or more modules recognized by the resource loader. Module
- * styles added through this function will be loaded by the resource loader when
- * the page loads.
+ * Add only CSS of one or more modules recognized by the resource loader.
+ *
+ * Module styles added through this function will be added using standard link CSS
+ * tags, rather than as a combined Javascript and CSS package. Thus, they will
+ * load when JavaScript is disabled (unless CSS also happens to be disabled).
*
* @param $modules Mixed: module name (string) or array of module names
*/
@@ -563,8 +581,8 @@ class OutputPage extends ContextSource {
/**
* Add or replace an header item to the output
*
- * @param $name String: item name
- * @param $value String: raw HTML
+ * @param string $name item name
+ * @param string $value raw HTML
*/
public function addHeadItem( $name, $value ) {
$this->mHeadItems[$name] = $value;
@@ -573,7 +591,7 @@ class OutputPage extends ContextSource {
/**
* Check if the header item $name is already set
*
- * @param $name String: item name
+ * @param string $name item name
* @return Boolean
*/
public function hasHeadItem( $name ) {
@@ -583,7 +601,7 @@ class OutputPage extends ContextSource {
/**
* Set the value of the ETag HTTP header, only used if $wgUseETag is true
*
- * @param $tag String: value of "ETag" header
+ * @param string $tag value of "ETag" header
*/
function setETag( $tag ) {
$this->mETag = $tag;
@@ -610,8 +628,34 @@ class OutputPage extends ContextSource {
}
/**
+ * Set an additional output property
+ * @since 1.21
+ *
+ * @param string $name
+ * @param mixed $value
+ */
+ public function setProperty( $name, $value ) {
+ $this->mProperties[$name] = $value;
+ }
+
+ /**
+ * Get an additional output property
+ * @since 1.21
+ *
+ * @param $name
+ * @return mixed: Property value or null if not found
+ */
+ public function getProperty( $name ) {
+ if ( isset( $this->mProperties[$name] ) ) {
+ return $this->mProperties[$name];
+ } else {
+ return null;
+ }
+ }
+
+ /**
* checkLastModified tells the client to use the client-cached page if
- * possible. If sucessful, the OutputPage is disabled so that
+ * possible. If successful, the OutputPage is disabled so that
* any future call to OutputPage->output() have no effect.
*
* Side effect: sets mLastModified for Last-Modified header
@@ -704,7 +748,7 @@ class OutputPage extends ContextSource {
/**
* Override the last modified timestamp
*
- * @param $timestamp String: new timestamp, in a format readable by
+ * @param string $timestamp new timestamp, in a format readable by
* wfTimestamp()
*/
public function setLastModified( $timestamp ) {
@@ -714,7 +758,7 @@ class OutputPage extends ContextSource {
/**
* Set the robot policy for the page: <http://www.robotstxt.org/meta.html>
*
- * @param $policy String: the literal string to output as the contents of
+ * @param string $policy the literal string to output as the contents of
* the meta tag. Will be parsed according to the spec and output in
* standardized form.
* @return null
@@ -734,7 +778,7 @@ class OutputPage extends ContextSource {
* Set the index policy for the page, but leave the follow policy un-
* touched.
*
- * @param $policy string Either 'index' or 'noindex'.
+ * @param string $policy Either 'index' or 'noindex'.
* @return null
*/
public function setIndexPolicy( $policy ) {
@@ -748,7 +792,7 @@ class OutputPage extends ContextSource {
* Set the follow policy for the page, but leave the index policy un-
* touched.
*
- * @param $policy String: either 'follow' or 'nofollow'.
+ * @param string $policy either 'follow' or 'nofollow'.
* @return null
*/
public function setFollowPolicy( $policy ) {
@@ -762,7 +806,7 @@ class OutputPage extends ContextSource {
* Set the new value of the "action text", this will be added to the
* "HTML title", separated from it with " - ".
*
- * @param $text String: new value of the "action text"
+ * @param string $text new value of the "action text"
*/
public function setPageTitleActionText( $text ) {
$this->mPageTitleActionText = $text;
@@ -777,6 +821,7 @@ class OutputPage extends ContextSource {
if ( isset( $this->mPageTitleActionText ) ) {
return $this->mPageTitleActionText;
}
+ return '';
}
/**
@@ -851,11 +896,10 @@ class OutputPage extends ContextSource {
$this->getContext()->setTitle( $t );
}
-
/**
- * Replace the subtile with $str
+ * Replace the subtitle with $str
*
- * @param $str String|Message: new value of the subtitle
+ * @param string|Message $str new value of the subtitle. String should be safe HTML.
*/
public function setSubtitle( $str ) {
$this->clearSubtitle();
@@ -866,7 +910,7 @@ class OutputPage extends ContextSource {
* Add $str to the subtitle
*
* @deprecated in 1.19; use addSubtitle() instead
- * @param $str String|Message to add to the subtitle
+ * @param string|Message $str to add to the subtitle
*/
public function appendSubtitle( $str ) {
$this->addSubtitle( $str );
@@ -875,7 +919,7 @@ class OutputPage extends ContextSource {
/**
* Add $str to the subtitle
*
- * @param $str String|Message to add to the subtitle
+ * @param string|Message $str to add to the subtitle. String should be safe HTML.
*/
public function addSubtitle( $str ) {
if ( $str instanceof Message ) {
@@ -987,7 +1031,7 @@ class OutputPage extends ContextSource {
* for the new version
* @see addFeedLink()
*
- * @param $val String: query to append to feed links or false to output
+ * @param string $val query to append to feed links or false to output
* default links
*/
public function setFeedAppendQuery( $val ) {
@@ -1007,8 +1051,8 @@ class OutputPage extends ContextSource {
/**
* Add a feed link to the page header
*
- * @param $format String: feed type, should be a key of $wgFeedClasses
- * @param $href String: URL
+ * @param string $format feed type, should be a key of $wgFeedClasses
+ * @param string $href URL
*/
public function addFeedLink( $format, $href ) {
global $wgAdvertisedFeedTypes;
@@ -1092,7 +1136,7 @@ class OutputPage extends ContextSource {
/**
* Add new language links
*
- * @param $newLinkArray array Associative array mapping language code to the page
+ * @param array $newLinkArray Associative array mapping language code to the page
* name
*/
public function addLanguageLinks( $newLinkArray ) {
@@ -1102,7 +1146,7 @@ class OutputPage extends ContextSource {
/**
* Reset the language links and add new language links
*
- * @param $newLinkArray array Associative array mapping language code to the page
+ * @param array $newLinkArray Associative array mapping language code to the page
* name
*/
public function setLanguageLinks( $newLinkArray ) {
@@ -1121,7 +1165,7 @@ class OutputPage extends ContextSource {
/**
* Add an array of categories, with names in the keys
*
- * @param $categories Array mapping category name => sort key
+ * @param array $categories mapping category name => sort key
*/
public function addCategoryLinks( $categories ) {
global $wgContLang;
@@ -1182,7 +1226,7 @@ class OutputPage extends ContextSource {
/**
* Reset the category links (but not the category list) and add $categories
*
- * @param $categories Array mapping category name => sort key
+ * @param array $categories mapping category name => sort key
*/
public function setCategoryLinks( $categories ) {
$this->mCategoryLinks = array();
@@ -1236,11 +1280,11 @@ class OutputPage extends ContextSource {
/**
* Show what level of JavaScript / CSS untrustworthiness is allowed on this page
* @see ResourceLoaderModule::$origin
- * @param $type String ResourceLoaderModule TYPE_ constant
+ * @param string $type ResourceLoaderModule TYPE_ constant
* @return Int ResourceLoaderModule ORIGIN_ class constant
*/
- public function getAllowedModules( $type ){
- if( $type == ResourceLoaderModule::TYPE_COMBINED ){
+ public function getAllowedModules( $type ) {
+ if( $type == ResourceLoaderModule::TYPE_COMBINED ) {
return min( array_values( $this->mAllowedModules ) );
} else {
return isset( $this->mAllowedModules[$type] )
@@ -1254,23 +1298,23 @@ class OutputPage extends ContextSource {
* @param $type String ResourceLoaderModule TYPE_ constant
* @param $level Int ResourceLoaderModule class constant
*/
- public function setAllowedModules( $type, $level ){
+ public function setAllowedModules( $type, $level ) {
$this->mAllowedModules[$type] = $level;
}
/**
- * As for setAllowedModules(), but don't inadvertantly make the page more accessible
+ * As for setAllowedModules(), but don't inadvertently make the page more accessible
* @param $type String
* @param $level Int ResourceLoaderModule class constant
*/
- public function reduceAllowedModules( $type, $level ){
- $this->mAllowedModules[$type] = min( $this->getAllowedModules($type), $level );
+ public function reduceAllowedModules( $type, $level ) {
+ $this->mAllowedModules[$type] = min( $this->getAllowedModules( $type ), $level );
}
/**
* Prepend $text to the body HTML
*
- * @param $text String: HTML
+ * @param string $text HTML
*/
public function prependHTML( $text ) {
$this->mBodytext = $text . $this->mBodytext;
@@ -1279,7 +1323,7 @@ class OutputPage extends ContextSource {
/**
* Append $text to the body HTML
*
- * @param $text String: HTML
+ * @param string $text HTML
*/
public function addHTML( $text ) {
$this->mBodytext .= $text;
@@ -1423,14 +1467,17 @@ class OutputPage extends ContextSource {
* @param $interface Boolean: is this text in the user interface language?
*/
public function addWikiText( $text, $linestart = true, $interface = true ) {
- $title = $this->getTitle(); // Work arround E_STRICT
+ $title = $this->getTitle(); // Work around E_STRICT
+ if ( !$title ) {
+ throw new MWException( 'Title is null' );
+ }
$this->addWikiTextTitle( $text, $title, $linestart, /*tidy*/false, $interface );
}
/**
* Add wikitext with a custom Title object
*
- * @param $text String: wikitext
+ * @param string $text wikitext
* @param $title Title object
* @param $linestart Boolean: is this the start of a line?
*/
@@ -1441,7 +1488,7 @@ class OutputPage extends ContextSource {
/**
* Add wikitext with a custom Title object and tidy enabled.
*
- * @param $text String: wikitext
+ * @param string $text wikitext
* @param $title Title object
* @param $linestart Boolean: is this the start of a line?
*/
@@ -1452,7 +1499,7 @@ class OutputPage extends ContextSource {
/**
* Add wikitext with tidy enabled
*
- * @param $text String: wikitext
+ * @param string $text wikitext
* @param $linestart Boolean: is this the start of a line?
*/
public function addWikiTextTidy( $text, $linestart = true ) {
@@ -1463,14 +1510,14 @@ class OutputPage extends ContextSource {
/**
* Add wikitext with a custom Title object
*
- * @param $text String: wikitext
+ * @param string $text wikitext
* @param $title Title object
* @param $linestart Boolean: is this the start of a line?
* @param $tidy Boolean: whether to use tidy
* @param $interface Boolean: whether it is an interface message
* (for example disables conversion)
*/
- public function addWikiTextTitle( $text, &$title, $linestart, $tidy = false, $interface = false ) {
+ public function addWikiTextTitle( $text, Title $title, $linestart, $tidy = false, $interface = false ) {
global $wgParser;
wfProfileIn( __METHOD__ );
@@ -1550,7 +1597,6 @@ class OutputPage extends ContextSource {
$this->addHTML( $text );
}
-
/**
* Add the output of a QuickTemplate to the output buffer
*
@@ -1571,9 +1617,10 @@ class OutputPage extends ContextSource {
* @param $interface Boolean: use interface language ($wgLang instead of
* $wgContLang) while parsing language sensitive magic
* words like GRAMMAR and PLURAL. This also disables
- * LanguageConverter.
+ * LanguageConverter.
* @param $language Language object: target language object, will override
* $interface
+ * @throws MWException
* @return String: HTML
*/
public function parse( $text, $linestart = true, $interface = false, $language = null ) {
@@ -1695,7 +1742,7 @@ class OutputPage extends ContextSource {
/**
* Add an HTTP header that will influence on the cache
*
- * @param $header String: header name
+ * @param string $header header name
* @param $option Array|null
* @todo FIXME: Document the $option parameter; it appears to be for
* X-Vary-Options but what format is acceptable?
@@ -1769,14 +1816,12 @@ class OutputPage extends ContextSource {
} else {
$aloption[] = 'string-contains=' . $variant;
- // IE and some other browsers use another form of language code
- // in their Accept-Language header, like "zh-CN" or "zh-TW".
+ // IE and some other browsers use BCP 47 standards in
+ // their Accept-Language header, like "zh-CN" or "zh-Hant".
// We should handle these too.
- $ievariant = explode( '-', $variant );
- if ( count( $ievariant ) == 2 ) {
- $ievariant[1] = strtoupper( $ievariant[1] );
- $ievariant = implode( '-', $ievariant );
- $aloption[] = 'string-contains=' . $ievariant;
+ $variantBCP47 = wfBCP47( $variant );
+ if ( $variantBCP47 !== $variant ) {
+ $aloption[] = 'string-contains=' . $variantBCP47;
}
}
}
@@ -1860,7 +1905,7 @@ class OutputPage extends ContextSource {
wfDebug( __METHOD__ . ": proxy caching with ESI; {$this->mLastModified} **\n", false );
# start with a shorter timeout for initial testing
# header( 'Surrogate-Control: max-age=2678400+2678400, content="ESI/1.0"');
- $response->header( 'Surrogate-Control: max-age='.$wgSquidMaxage.'+'.$this->mSquidMaxage.', content="ESI/1.0"');
+ $response->header( 'Surrogate-Control: max-age=' . $wgSquidMaxage . '+' . $this->mSquidMaxage . ', content="ESI/1.0"' );
$response->header( 'Cache-Control: s-maxage=0, must-revalidate, max-age=0' );
} else {
# We'll purge the proxy cache for anons explicitly, but require end user agents
@@ -1870,7 +1915,7 @@ class OutputPage extends ContextSource {
wfDebug( __METHOD__ . ": local proxy caching; {$this->mLastModified} **\n", false );
# start with a shorter timeout for initial testing
# header( "Cache-Control: s-maxage=2678400, must-revalidate, max-age=0" );
- $response->header( 'Cache-Control: s-maxage='.$this->mSquidMaxage.', must-revalidate, max-age=0' );
+ $response->header( 'Cache-Control: s-maxage=' . $this->mSquidMaxage . ', must-revalidate, max-age=0' );
}
} else {
# We do want clients to cache if they can, but they *must* check for updates
@@ -1879,7 +1924,7 @@ class OutputPage extends ContextSource {
$response->header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', 0 ) . ' GMT' );
$response->header( "Cache-Control: private, must-revalidate, max-age=0" );
}
- if($this->mLastModified) {
+ if( $this->mLastModified ) {
$response->header( "Last-Modified: {$this->mLastModified}" );
}
} else {
@@ -1894,7 +1939,7 @@ class OutputPage extends ContextSource {
}
/**
- * Get the message associed with the HTTP response code $code
+ * Get the message associated with the HTTP response code $code
*
* @param $code Integer: status code
* @return String or null: message or null if $code is not in the list of
@@ -1903,7 +1948,7 @@ class OutputPage extends ContextSource {
* @deprecated since 1.18 Use HttpStatus::getMessage() instead.
*/
public static function getStatusMessage( $code ) {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.18' );
return HttpStatus::getMessage( $code );
}
@@ -1994,14 +2039,16 @@ class OutputPage extends ContextSource {
wfRunHooks( 'AfterFinalPageOutput', array( $this ) );
$this->sendCacheControl();
+
ob_end_flush();
+
wfProfileOut( __METHOD__ );
}
/**
* Actually output something with print().
*
- * @param $ins String: the string to output
+ * @param string $ins the string to output
*/
public function out( $ins ) {
print $ins;
@@ -2020,8 +2067,8 @@ class OutputPage extends ContextSource {
* indexing, clear the current text and redirect, set the page's title
* and optionally an custom HTML title (content of the "<title>" tag).
*
- * @param $pageTitle String|Message will be passed directly to setPageTitle()
- * @param $htmlTitle String|Message will be passed directly to setHTMLTitle();
+ * @param string|Message $pageTitle will be passed directly to setPageTitle()
+ * @param string|Message $htmlTitle will be passed directly to setHTMLTitle();
* optional, if not passed the "<title>" attribute will be
* based on $pageTitle
*/
@@ -2047,7 +2094,7 @@ class OutputPage extends ContextSource {
*
* @param $title Mixed: message key (string) for page title, or a Message object
* @param $msg Mixed: message key (string) for page text, or a Message object
- * @param $params Array: message parameters; ignored if $msg is a Message object
+ * @param array $params message parameters; ignored if $msg is a Message object
*/
public function showErrorPage( $title, $msg, $params = array() ) {
if( !$title instanceof Message ) {
@@ -2056,8 +2103,8 @@ class OutputPage extends ContextSource {
$this->prepareErrorPage( $title );
- if ( $msg instanceof Message ){
- $this->addHTML( $msg->parse() );
+ if ( $msg instanceof Message ) {
+ $this->addHTML( $msg->parseAsBlock() );
} else {
$this->addWikiMsgArray( $msg, $params );
}
@@ -2068,12 +2115,10 @@ class OutputPage extends ContextSource {
/**
* Output a standard permission error page
*
- * @param $errors Array: error message keys
- * @param $action String: action that was denied or null if unknown
+ * @param array $errors error message keys
+ * @param string $action action that was denied or null if unknown
*/
public function showPermissionsErrorPage( $errors, $action = null ) {
- global $wgGroupPermissions;
-
// For some action (read, edit, create and upload), display a "login to do this action"
// error if all of the following conditions are met:
// 1. the user is not logged in
@@ -2082,8 +2127,8 @@ class OutputPage extends ContextSource {
if ( in_array( $action, array( 'read', 'edit', 'createpage', 'createtalk', 'upload' ) )
&& $this->getUser()->isAnon() && count( $errors ) == 1 && isset( $errors[0][0] )
&& ( $errors[0][0] == 'badaccess-groups' || $errors[0][0] == 'badaccess-group0' )
- && ( ( isset( $wgGroupPermissions['user'][$action] ) && $wgGroupPermissions['user'][$action] )
- || ( isset( $wgGroupPermissions['autoconfirmed'][$action] ) && $wgGroupPermissions['autoconfirmed'][$action] ) )
+ && ( User::groupHasPermission( 'user', $action )
+ || User::groupHasPermission( 'autoconfirmed', $action ) )
) {
$displayReturnto = null;
@@ -2115,7 +2160,7 @@ class OutputPage extends ContextSource {
unset( $returntoquery['title'] );
unset( $returntoquery['returnto'] );
unset( $returntoquery['returntoquery'] );
- $query['returntoquery'] = wfArrayToCGI( $returntoquery );
+ $query['returntoquery'] = wfArrayToCgi( $returntoquery );
}
}
$loginLink = Linker::linkKnown(
@@ -2155,7 +2200,8 @@ class OutputPage extends ContextSource {
/**
* Display an error page noting that a given permission bit is required.
* @deprecated since 1.18, just throw the exception directly
- * @param $permission String: key required
+ * @param string $permission key required
+ * @throws PermissionsError
*/
public function permissionRequired( $permission ) {
throw new PermissionsError( $permission );
@@ -2173,8 +2219,8 @@ class OutputPage extends ContextSource {
/**
* Format a list of error messages
*
- * @param $errors Array of arrays returned by Title::getUserPermissionsErrors
- * @param $action String: action that was denied or null if unknown
+ * @param array $errors of arrays returned by Title::getUserPermissionsErrors
+ * @param string $action action that was denied or null if unknown
* @return String: the wikitext error-messages, formatted into a list.
*/
public function formatPermissionsErrorMessage( $errors, $action = null ) {
@@ -2226,6 +2272,7 @@ class OutputPage extends ContextSource {
* @param $protected Boolean: is this a permissions error?
* @param $reasons Array: list of reasons for this error, as returned by Title::getUserPermissionsErrors().
* @param $action String: action that was denied or null if unknown
+ * @throws ReadOnlyError
*/
public function readOnlyPage( $source = null, $protected = false, $reasons = array(), $action = null ) {
$this->setRobotPolicy( 'noindex,nofollow' );
@@ -2257,7 +2304,7 @@ class OutputPage extends ContextSource {
$pageLang = $this->getTitle()->getPageLanguage();
$params = array(
- 'id' => 'wpTextbox1',
+ 'id' => 'wpTextbox1',
'name' => 'wpTextbox1',
'cols' => $this->getUser()->getOption( 'cols' ),
'rows' => $this->getUser()->getOption( 'rows' ),
@@ -2284,7 +2331,7 @@ $templates
}
/**
- * Turn off regular page output and return an error reponse
+ * Turn off regular page output and return an error response
* for when rate limiting has triggered.
*/
public function rateLimited() {
@@ -2341,13 +2388,22 @@ $templates
* Add a "return to" link pointing to a specified title
*
* @param $title Title to link
- * @param $query Array query string parameters
- * @param $text String text of the link (input is not escaped)
- */
- public function addReturnTo( $title, $query = array(), $text = null ) {
- $this->addLink( array( 'rel' => 'next', 'href' => $title->getFullURL() ) );
+ * @param array $query query string parameters
+ * @param string $text text of the link (input is not escaped)
+ * @param $options Options array to pass to Linker
+ */
+ public function addReturnTo( $title, $query = array(), $text = null, $options = array() ) {
+ if( in_array( 'http', $options ) ) {
+ $proto = PROTO_HTTP;
+ } elseif( in_array( 'https', $options ) ) {
+ $proto = PROTO_HTTPS;
+ } else {
+ $proto = PROTO_RELATIVE;
+ }
+
+ $this->addLink( array( 'rel' => 'next', 'href' => $title->getFullURL( '', false, $proto ) ) );
$link = $this->msg( 'returnto' )->rawParams(
- Linker::link( $title, $text, array(), $query ) )->escaped();
+ Linker::link( $title, $text, array(), $query, $options ) )->escaped();
$this->addHTML( "<p id=\"mw-returnto\">{$link}</p>\n" );
}
@@ -2357,7 +2413,7 @@ $templates
*
* @param $unused
* @param $returnto Title or String to return to
- * @param $returntoquery String: query string for the return to link
+ * @param string $returntoquery query string for the return to link
*/
public function returnToMain( $unused = null, $returnto = null, $returntoquery = null ) {
if ( $returnto == null ) {
@@ -2451,7 +2507,7 @@ $templates
*/
private function addDefaultModules() {
global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax,
- $wgAjaxWatch;
+ $wgAjaxWatch, $wgResponsiveImages;
// Add base resources
$this->addModules( array(
@@ -2459,7 +2515,7 @@ $templates
'mediawiki.page.startup',
'mediawiki.page.ready',
) );
- if ( $wgIncludeLegacyJavaScript ){
+ if ( $wgIncludeLegacyJavaScript ) {
$this->addModules( 'mediawiki.legacy.wikibits' );
}
@@ -2492,6 +2548,11 @@ $templates
if ( $this->isArticle() && $this->getUser()->getOption( 'editondblclick' ) ) {
$this->addModules( 'mediawiki.action.view.dblClickEdit' );
}
+
+ // Support for high-density display images
+ if ( $wgResponsiveImages ) {
+ $this->addModules( 'mediawiki.hidpi' );
+ }
}
/**
@@ -2509,9 +2570,9 @@ $templates
/**
* TODO: Document
* @param $modules Array/string with the module name(s)
- * @param $only String ResourceLoaderModule TYPE_ class constant
+ * @param string $only ResourceLoaderModule TYPE_ class constant
* @param $useESI boolean
- * @param $extraQuery Array with extra query parameters to add to each request. array( param => value )
+ * @param array $extraQuery with extra query parameters to add to each request. array( param => value )
* @param $loadCall boolean If true, output an (asynchronous) mw.loader.load() call rather than a "<script src='...'>" tag
* @return string html "<script>" and "<style>" tags
*/
@@ -2634,7 +2695,7 @@ $templates
}
// Special handling for the user group; because users might change their stuff
// on-wiki like user pages, or user preferences; we need to find the highest
- // timestamp of these user-changable modules so we can ensure cache misses on change
+ // timestamp of these user-changeable modules so we can ensure cache misses on change
// This should NOT be done for the site group (bug 27564) because anons get that too
// and we shouldn't be putting timestamps in Squid-cached HTML
$version = null;
@@ -2682,7 +2743,7 @@ $templates
}
}
- if( $group == 'noscript' ){
+ if( $group == 'noscript' ) {
$links .= Html::rawElement( 'noscript', array(), $link ) . "\n";
} else {
$links .= $link . "\n";
@@ -2890,21 +2951,20 @@ $templates
$this->mJsConfigVars[$keys] = $value;
}
-
/**
* Get an array containing the variables to be set in mw.config in JavaScript.
*
* DO NOT CALL THIS FROM OUTSIDE OF THIS CLASS OR Skin::makeGlobalVariablesScript().
* This is only public until that function is removed. You have been warned.
*
- * Do not add things here which can be evaluated in ResourceLoaderStartupScript
+ * Do not add things here which can be evaluated in ResourceLoaderStartUpModule
* - in other words, page-independent/site-wide variables (without state).
* You will only be adding bloat to the html page and causing page caches to
* have to be purged on configuration changes.
* @return array
*/
public function getJSVars() {
- global $wgUseAjax, $wgContLang;
+ global $wgContLang;
$latestRevID = 0;
$pageID = 0;
@@ -2942,18 +3002,20 @@ $templates
implode( "\t", $digitTransTable ),
);
+ $user = $this->getUser();
+
$vars = array(
'wgCanonicalNamespace' => $nsname,
'wgCanonicalSpecialPageName' => $canonicalName,
'wgNamespaceNumber' => $title->getNamespace(),
- 'wgPageName' => $title->getPrefixedDBKey(),
+ 'wgPageName' => $title->getPrefixedDBkey(),
'wgTitle' => $title->getText(),
'wgCurRevisionId' => $latestRevID,
'wgArticleId' => $pageID,
'wgIsArticle' => $this->isArticle(),
'wgAction' => Action::getActionName( $this->getContext() ),
- 'wgUserName' => $this->getUser()->isAnon() ? null : $this->getUser()->getName(),
- 'wgUserGroups' => $this->getUser()->getEffectiveGroups(),
+ 'wgUserName' => $user->isAnon() ? null : $user->getName(),
+ 'wgUserGroups' => $user->getEffectiveGroups(),
'wgCategories' => $this->getCategories(),
'wgBreakFrames' => $this->getFrameOptions() == 'DENY',
'wgPageContentLanguage' => $lang->getCode(),
@@ -2962,11 +3024,17 @@ $templates
'wgDefaultDateFormat' => $lang->getDefaultDateFormat(),
'wgMonthNames' => $lang->getMonthNamesArray(),
'wgMonthNamesShort' => $lang->getMonthAbbreviationsArray(),
- 'wgRelevantPageName' => $relevantTitle->getPrefixedDBKey(),
+ 'wgRelevantPageName' => $relevantTitle->getPrefixedDBkey(),
);
+ if ( $user->isLoggedIn() ) {
+ $vars['wgUserId'] = $user->getId();
+ $vars['wgUserEditCount'] = $user->getEditCount();
+ $userReg = wfTimestampOrNull( TS_UNIX, $user->getRegistration() );
+ $vars['wgUserRegistration'] = $userReg !== null ? ( $userReg * 1000 ) : null;
+ }
if ( $wgContLang->hasVariants() ) {
$vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
- }
+ }
foreach ( $title->getRestrictionTypes() as $type ) {
$vars['wgRestriction' . ucfirst( $type )] = $title->getRestrictions( $type );
}
@@ -2974,7 +3042,7 @@ $templates
$vars['wgIsMainPage'] = true;
}
if ( $this->mRedirectedFrom ) {
- $vars['wgRedirectedFrom'] = $this->mRedirectedFrom->getPrefixedDBKey();
+ $vars['wgRedirectedFrom'] = $this->mRedirectedFrom->getPrefixedDBkey();
}
// Allow extensions to add their custom variables to the mw.config map.
@@ -3012,7 +3080,7 @@ $templates
}
/**
- * @param $addContentType bool: Whether "<meta>" specifying content type should be returned
+ * @param bool $addContentType Whether "<meta>" specifying content type should be returned
*
* @return array in format "link name or number => 'link html'".
*/
@@ -3025,6 +3093,8 @@ $templates
$tags = array();
+ $canonicalUrl = $this->mCanonicalUrl;
+
if ( $addContentType ) {
if ( $wgHtml5 ) {
# More succinct than <meta http-equiv=Content-Type>, has the
@@ -3035,7 +3105,7 @@ $templates
'http-equiv' => 'Content-Type',
'content' => "$wgMimeType; charset=UTF-8"
) );
- $tags['meta-content-style-type'] = Html::element( 'meta', array( // bug 15835
+ $tags['meta-content-style-type'] = Html::element( 'meta', array( // bug 15835
'http-equiv' => 'Content-Style-Type',
'content' => 'text/css'
) );
@@ -3064,7 +3134,7 @@ $templates
);
$tags['meta-keywords'] = Html::element( 'meta', array(
'name' => 'keywords',
- 'content' => preg_replace(
+ 'content' => preg_replace(
array_keys( $strip ),
array_values( $strip ),
implode( ',', $this->mKeywords )
@@ -3151,7 +3221,6 @@ $templates
) );
}
-
# Language variants
if ( !$wgDisableLangConversion && $wgCanonicalLanguageLinks ) {
$lang = $this->getTitle()->getPageLanguage();
@@ -3169,10 +3238,7 @@ $templates
);
}
} else {
- $tags['canonical'] = Html::element( 'link', array(
- 'rel' => 'canonical',
- 'href' => $this->getTitle()->getCanonicalUrl()
- ) );
+ $canonicalUrl = $this->getTitle()->getLocalURL();
}
}
}
@@ -3241,12 +3307,30 @@ $templates
}
}
}
+
+ # Canonical URL
+ global $wgEnableCanonicalServerLink;
+ if ( $wgEnableCanonicalServerLink ) {
+ if ( $canonicalUrl !== false ) {
+ $canonicalUrl = wfExpandUrl( $canonicalUrl, PROTO_CANONICAL );
+ } else {
+ $reqUrl = $this->getRequest()->getRequestURL();
+ $canonicalUrl = wfExpandUrl( $reqUrl, PROTO_CANONICAL );
+ }
+ }
+ if ( $canonicalUrl !== false ) {
+ $tags[] = Html::element( 'link', array(
+ 'rel' => 'canonical',
+ 'href' => $canonicalUrl
+ ) );
+ }
+
return $tags;
}
/**
* @param $unused
- * @param $addContentType bool: Whether "<meta>" specifying content type should be returned
+ * @param bool $addContentType Whether "<meta>" specifying content type should be returned
*
* @return string HTML tag links to be put in the header.
*/
@@ -3257,9 +3341,9 @@ $templates
/**
* Generate a "<link rel/>" for a feed.
*
- * @param $type String: feed type
- * @param $url String: URL to the feed
- * @param $text String: value of the "title" attribute
+ * @param string $type feed type
+ * @param string $url URL to the feed
+ * @param string $text value of the "title" attribute
* @return String: HTML fragment
*/
private function feedLink( $type, $url, $text ) {
@@ -3275,10 +3359,10 @@ $templates
* Add a local or specified stylesheet, with the given media options.
* Meant primarily for internal use...
*
- * @param $style String: URL to the file
- * @param $media String: to specify a media type, 'screen', 'printable', 'handheld' or any.
- * @param $condition String: for IE conditional comments, specifying an IE version
- * @param $dir String: set to 'rtl' or 'ltr' for direction-specific sheets
+ * @param string $style URL to the file
+ * @param string $media to specify a media type, 'screen', 'printable', 'handheld' or any.
+ * @param string $condition for IE conditional comments, specifying an IE version
+ * @param string $dir set to 'rtl' or 'ltr' for direction-specific sheets
*/
public function addStyle( $style, $media = '', $condition = '', $dir = '' ) {
$options = array();
@@ -3299,7 +3383,7 @@ $templates
/**
* Adds inline CSS styles
* @param $style_css Mixed: inline CSS
- * @param $flip String: Set to 'flip' to flip the CSS if needed
+ * @param string $flip Set to 'flip' to flip the CSS if needed
*/
public function addInlineStyle( $style_css, $flip = 'noflip' ) {
if( $flip === 'flip' && $this->getLanguage()->isRTL() ) {
@@ -3316,8 +3400,7 @@ $templates
* @return string
*/
public function buildCssLinks() {
- global $wgUseSiteCss, $wgAllowUserCss, $wgAllowUserCssPrefs,
- $wgLang, $wgContLang;
+ global $wgUseSiteCss, $wgAllowUserCss, $wgAllowUserCssPrefs, $wgContLang;
$this->getSkin()->setupSkinUserCss( $this );
@@ -3333,7 +3416,7 @@ $templates
if ( $wgUseSiteCss ) {
$moduleStyles[] = 'site';
$moduleStyles[] = 'noscript';
- if( $this->getUser()->isLoggedIn() ){
+ if( $this->getUser()->isLoggedIn() ) {
$moduleStyles[] = 'user.groups';
}
}
@@ -3351,7 +3434,7 @@ $templates
// If needed, Janus it first. This is user-supplied CSS, so it's
// assumed to be right for the content language directionality.
$previewedCSS = $this->getRequest()->getText( 'wpTextbox1' );
- if ( $wgLang->getDir() !== $wgContLang->getDir() ) {
+ if ( $this->getLanguage()->getDir() !== $wgContLang->getDir() ) {
$previewedCSS = CSSJanus::transform( $previewedCSS, true, false );
}
$otherTags .= Html::inlineStyle( $previewedCSS );
@@ -3426,8 +3509,8 @@ $templates
/**
* Generate \<link\> tags for stylesheets
*
- * @param $style String: URL to the file
- * @param $options Array: option, can contain 'condition', 'dir', 'media'
+ * @param string $style URL to the file
+ * @param array $options option, can contain 'condition', 'dir', 'media'
* keys
* @return String: HTML fragment
*/
@@ -3468,12 +3551,16 @@ $templates
/**
* Transform "media" attribute based on request parameters
*
- * @param $media String: current value of the "media" attribute
- * @return String: modified value of the "media" attribute
+ * @param string $media current value of the "media" attribute
+ * @return String: modified value of the "media" attribute, or null to skip
+ * this stylesheet
*/
public static function transformCssMedia( $media ) {
global $wgRequest, $wgHandheldForIPhone;
+ // http://www.w3.org/TR/css3-mediaqueries/#syntax
+ $screenMediaQueryRegex = '/^(?:only\s+)?screen\b/i';
+
// Switch in on-screen display for media testing
$switches = array(
'printable' => 'print',
@@ -3483,8 +3570,20 @@ $templates
if( $wgRequest->getBool( $switch ) ) {
if( $media == $targetMedia ) {
$media = '';
- } elseif( $media == 'screen' ) {
- return null;
+ } elseif( preg_match( $screenMediaQueryRegex, $media ) === 1 ) {
+ // This regex will not attempt to understand a comma-separated media_query_list
+ //
+ // Example supported values for $media: 'screen', 'only screen', 'screen and (min-width: 982px)' ),
+ // Example NOT supported value for $media: '3d-glasses, screen, print and resolution > 90dpi'
+ //
+ // If it's a print request, we never want any kind of screen stylesheets
+ // If it's a handheld request (currently the only other choice with a switch),
+ // we don't want simple 'screen' but we might want screen queries that
+ // have a max-width or something, so we'll pass all others on and let the
+ // client do the query.
+ if( $targetMedia == 'print' || $media == 'screen' ) {
+ return null;
+ }
}
}
}
@@ -3557,7 +3656,6 @@ $templates
$msgSpecs = array_values( $msgSpecs );
$s = $wrap;
foreach ( $msgSpecs as $n => $spec ) {
- $options = array();
if ( is_array( $spec ) ) {
$args = $spec;
$name = array_shift( $args );
@@ -3568,7 +3666,7 @@ $templates
'1.20'
);
}
- } else {
+ } else {
$args = array();
$name = $spec;
}
@@ -3581,7 +3679,7 @@ $templates
* Include jQuery core. Use this to avoid loading it multiple times
* before we get a usable script loader.
*
- * @param $modules Array: list of jQuery modules which should be loaded
+ * @param array $modules list of jQuery modules which should be loaded
* @return Array: the list of modules which were not loaded.
* @since 1.16
* @deprecated since 1.17
diff --git a/includes/PHPVersionError.php b/includes/PHPVersionError.php
index dad71f82..7749bf1f 100644
--- a/includes/PHPVersionError.php
+++ b/includes/PHPVersionError.php
@@ -22,13 +22,13 @@
/**
* Display something vaguely comprehensible in the event of a totally unrecoverable error.
- * Does not assume access to *anything*; no globals, no autloader, no database, no localisation.
+ * Does not assume access to *anything*; no globals, no autoloader, no database, no localisation.
* Safe for PHP4 (and putting this here means that WebStart.php and GlobalSettings.php
* no longer need to be).
*
* Calling this function kills execution immediately.
*
- * @param $type String Which entry point we are protecting. One of:
+ * @param string $type Which entry point we are protecting. One of:
* - index.php
* - load.php
* - api.php
@@ -37,21 +37,28 @@
* @note Since we can't rely on anything, the minimum PHP versions and MW current
* version are hardcoded here
*/
-function wfPHPVersionError( $type ){
- $mwVersion = '1.20';
- $phpVersion = PHP_VERSION;
- $message = "MediaWiki $mwVersion requires at least PHP version 5.3.2, you are using PHP $phpVersion.";
- if( $type == 'index.php' ) {
+function wfPHPVersionError( $type ) {
+ $mwVersion = '1.21';
+ $minimumVersionPHP = '5.3.2';
+
+ $phpVersion = phpversion();
+ $protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
+ $message = "MediaWiki $mwVersion requires at least PHP version $minimumVersionPHP, you are using PHP $phpVersion.";
+ if ( $type == 'cli' ) {
+ $finalOutput = "You are using PHP version $phpVersion but MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher. ABORTING.\n" .
+ "Check if you have a newer php executable with a different name, such as php5.\n";
+ } elseif ( $type == 'index.php' ) {
+ $pathinfo = pathinfo( $_SERVER['SCRIPT_NAME'] );
$encLogo = htmlspecialchars(
- str_replace( '//', '/', pathinfo( $_SERVER['SCRIPT_NAME'], PATHINFO_DIRNAME ) . '/'
- ) . 'skins/common/images/mediawiki.png'
+ str_replace( '//', '/', $pathinfo['dirname'] . '/' ) .
+ 'skins/common/images/mediawiki.png'
);
- header( $_SERVER['SERVER_PROTOCOL'] . ' 500 MediaWiki configuration Error', true, 500 );
+ header( "$protocol 500 MediaWiki configuration Error" );
header( 'Content-type: text/html; charset=UTF-8' );
// Don't cache error pages! They cause no end of trouble...
header( 'Cache-control: none' );
- header( 'Pragma: nocache' );
+ header( 'Pragma: no-cache' );
$finalOutput = <<<HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
@@ -103,9 +110,7 @@ HTML;
} else {
// So nothing thinks this is JS or CSS
$finalOutput = ( $type == 'load.php' ) ? "/* $message */" : $message;
- if( $type != 'cli' ) {
- header( $_SERVER['SERVER_PROTOCOL'] . ' 500 MediaWiki configuration Error', true, 500 );
- }
+ header( "$protocol 500 MediaWiki configuration Error" );
}
echo( "$finalOutput\n" );
die( 1 );
diff --git a/includes/Pager.php b/includes/Pager.php
index 96ba446e..9c514927 100644
--- a/includes/Pager.php
+++ b/includes/Pager.php
@@ -143,7 +143,7 @@ abstract class IndexPager extends ContextSource implements Pager {
$this->mOffset = $this->mRequest->getText( 'offset' );
# Use consistent behavior for the limit options
- $this->mDefaultLimit = intval( $this->getUser()->getOption( 'rclimit' ) );
+ $this->mDefaultLimit = $this->getUser()->getIntOption( 'rclimit' );
if ( !$this->mLimit ) {
// Don't override if a subclass calls $this->setLimit() in its constructor.
list( $this->mLimit, /* $offset */ ) = $this->mRequest->getLimitOffset();
@@ -206,13 +206,25 @@ abstract class IndexPager extends ContextSource implements Pager {
# Plus an extra row so that we can tell the "next" link should be shown
$queryLimit = $this->mLimit + 1;
+ if ( $this->mOffset == '' ) {
+ $isFirst = true;
+ } else {
+ // If there's an offset, we may or may not be at the first entry.
+ // The only way to tell is to run the query in the opposite
+ // direction see if we get a row.
+ $oldIncludeOffset = $this->mIncludeOffset;
+ $this->mIncludeOffset = !$this->mIncludeOffset;
+ $isFirst = !$this->reallyDoQuery( $this->mOffset, 1, !$descending )->numRows();
+ $this->mIncludeOffset = $oldIncludeOffset;
+ }
+
$this->mResult = $this->reallyDoQuery(
$this->mOffset,
$queryLimit,
$descending
);
- $this->extractResultInfo( $this->mOffset, $queryLimit, $this->mResult );
+ $this->extractResultInfo( $isFirst, $queryLimit, $this->mResult );
$this->mQueryDone = true;
$this->preprocessResults( $this->mResult );
@@ -269,11 +281,12 @@ abstract class IndexPager extends ContextSource implements Pager {
* Extract some useful data from the result object for use by
* the navigation bar, put it into $this
*
- * @param $offset String: index offset, inclusive
+ * @param $isFirst bool: False if there are rows before those fetched (i.e.
+ * if a "previous" link would make sense)
* @param $limit Integer: exact query limit
* @param $res ResultWrapper
*/
- function extractResultInfo( $offset, $limit, ResultWrapper $res ) {
+ function extractResultInfo( $isFirst, $limit, ResultWrapper $res ) {
$numRows = $res->numRows();
if ( $numRows ) {
# Remove any table prefix from index field
@@ -287,8 +300,7 @@ abstract class IndexPager extends ContextSource implements Pager {
if ( $numRows > $this->mLimit && $numRows > 1 ) {
$res->seek( $numRows - 1 );
$this->mPastTheEndRow = $res->fetchObject();
- $indexField = $this->mIndexField;
- $this->mPastTheEndIndex = $this->mPastTheEndRow->$indexField;
+ $this->mPastTheEndIndex = $this->mPastTheEndRow->$indexColumn;
$res->seek( $numRows - 2 );
$row = $res->fetchRow();
$lastIndex = $row[$indexColumn];
@@ -312,11 +324,11 @@ abstract class IndexPager extends ContextSource implements Pager {
if ( $this->mIsBackwards ) {
$this->mIsFirst = ( $numRows < $limit );
- $this->mIsLast = ( $offset == '' );
+ $this->mIsLast = $isFirst;
$this->mLastShown = $firstIndex;
$this->mFirstShown = $lastIndex;
} else {
- $this->mIsFirst = ( $offset == '' );
+ $this->mIsFirst = $isFirst;
$this->mIsLast = ( $numRows < $limit );
$this->mLastShown = $lastIndex;
$this->mFirstShown = $firstIndex;
@@ -336,7 +348,7 @@ abstract class IndexPager extends ContextSource implements Pager {
* Do a query with specified parameters, rather than using the object
* context
*
- * @param $offset String: index offset, inclusive
+ * @param string $offset index offset, inclusive
* @param $limit Integer: exact query limit
* @param $descending Boolean: query direction, false for ascending, true for descending
* @return ResultWrapper
@@ -349,7 +361,7 @@ abstract class IndexPager extends ContextSource implements Pager {
/**
* Build variables to use by the database wrapper.
*
- * @param $offset String: index offset, inclusive
+ * @param string $offset index offset, inclusive
* @param $limit Integer: exact query limit
* @param $descending Boolean: query direction, false for ascending, true for descending
* @return array
@@ -432,9 +444,9 @@ abstract class IndexPager extends ContextSource implements Pager {
/**
* Make a self-link
*
- * @param $text String: text displayed on the link
- * @param $query Array: associative array of paramter to be in the query string
- * @param $type String: value of the "rel" attribute
+ * @param string $text text displayed on the link
+ * @param array $query associative array of parameter to be in the query string
+ * @param string $type value of the "rel" attribute
*
* @return String: HTML fragment
*/
@@ -689,8 +701,8 @@ abstract class IndexPager extends ContextSource implements Pager {
protected function getExtraSortFields() { return array(); }
/**
- * Return the default sorting direction: false for ascending, true for de-
- * scending. You can also have an associative array of ordertype => dir,
+ * Return the default sorting direction: false for ascending, true for
+ * descending. You can also have an associative array of ordertype => dir,
* if multiple order types are supported. In this case getIndexField()
* must return an array, and the keys of that must exactly match the keys
* of this.
@@ -710,7 +722,6 @@ abstract class IndexPager extends ContextSource implements Pager {
protected function getDefaultDirections() { return false; }
}
-
/**
* IndexPager with an alphabetic list and a formatted navigation bar
* @ingroup Pager
@@ -786,8 +797,8 @@ abstract class AlphabeticPager extends IndexPager {
/**
* If this supports multiple order type messages, give the message key for
- * enabling each one in getNavigationBar. The return type is an associa-
- * tive array whose keys must exactly match the keys of the array returned
+ * enabling each one in getNavigationBar. The return type is an associative
+ * array whose keys must exactly match the keys of the array returned
* by getIndexField(), and whose values are message keys.
*
* @return Array
@@ -867,7 +878,7 @@ abstract class ReverseChronologicalPager extends IndexPager {
if ( $this->mMonth ) {
$month = $this->mMonth + 1;
// For December, we want January 1 of the next year
- if ($month > 12) {
+ if ( $month > 12 ) {
$month = 1;
$year++;
}
@@ -1049,8 +1060,8 @@ abstract class TablePager extends IndexPager {
*
* @protected
*
- * @param $field String The column
- * @param $value String The cell contents
+ * @param string $field The column
+ * @param string $value The cell contents
* @return Array of attr => value
*/
function getCellAttrs( $field, $value ) {
@@ -1161,7 +1172,7 @@ abstract class TablePager extends IndexPager {
# The pair is either $index => $limit, in which case the $value
# will be numeric, or $limit => $text, in which case the $value
# will be a string.
- if( is_int( $value ) ){
+ if( is_int( $value ) ) {
$limit = $value;
$text = $this->getLanguage()->formatNum( $limit );
} else {
@@ -1179,7 +1190,7 @@ abstract class TablePager extends IndexPager {
* Resubmits all defined elements of the query string, except for a
* blacklist, passed in the $blacklist parameter.
*
- * @param $blacklist Array parameters from the request query which should not be resubmitted
+ * @param array $blacklist parameters from the request query which should not be resubmitted
* @return String: HTML fragment
*/
function getHiddenFields( $blacklist = array() ) {
@@ -1245,8 +1256,8 @@ abstract class TablePager extends IndexPager {
*
* @protected
*
- * @param $name String: the database field name
- * @param $value String: the value retrieved from the database
+ * @param string $name the database field name
+ * @param string $value the value retrieved from the database
*/
abstract function formatValue( $name, $value );
diff --git a/includes/PathRouter.php b/includes/PathRouter.php
index 2dbc7ec0..fc891bb3 100644
--- a/includes/PathRouter.php
+++ b/includes/PathRouter.php
@@ -153,9 +153,9 @@ class PathRouter {
/**
* Add a new path pattern to the path router
*
- * @param $path string|array The path pattern to add
- * @param $params array The params for this path pattern
- * @param $options array The options for this path pattern
+ * @param string|array $path The path pattern to add
+ * @param array $params The params for this path pattern
+ * @param array $options The options for this path pattern
*/
public function add( $path, $params = array(), $options = array() ) {
if ( is_array( $path ) ) {
@@ -232,7 +232,7 @@ class PathRouter {
/**
* Parse a path and return the query matches for the path
*
- * @param $path string The path to parse
+ * @param string $path The path to parse
* @return Array The array of matches for the path
*/
public function parse( $path ) {
@@ -293,7 +293,7 @@ class PathRouter {
foreach ( $m as $matchKey => $matchValue ) {
if ( preg_match( '/^par\d+$/u', $matchKey ) ) {
$n = intval( substr( $matchKey, 3 ) );
- $data['$'.$n] = rawurldecode( $matchValue );
+ $data['$' . $n] = rawurldecode( $matchValue );
}
}
// If present give our $data array a $key as well
diff --git a/includes/PoolCounter.php b/includes/PoolCounter.php
index 452dbc54..2ebef04e 100644
--- a/includes/PoolCounter.php
+++ b/includes/PoolCounter.php
@@ -42,15 +42,15 @@
abstract class PoolCounter {
/* Return codes */
- const LOCKED = 1; /* Lock acquired */
+ const LOCKED = 1; /* Lock acquired */
const RELEASED = 2; /* Lock released */
- const DONE = 3; /* Another worker did the work for you */
+ const DONE = 3; /* Another worker did the work for you */
- const ERROR = -1; /* Indeterminate error */
+ const ERROR = -1; /* Indeterminate error */
const NOT_LOCKED = -2; /* Called release() with no lock held */
const QUEUE_FULL = -3; /* There are already maxqueue workers on this lock */
- const TIMEOUT = -4; /* Timeout exceeded */
- const LOCK_HELD = -5; /* Cannot acquire another lock while you have one lock held */
+ const TIMEOUT = -4; /* Timeout exceeded */
+ const LOCK_HELD = -5; /* Cannot acquire another lock while you have one lock held */
/**
* I want to do this task and I need to do it myself.
@@ -107,9 +107,9 @@ abstract class PoolCounter {
protected function __construct( $conf, $type, $key ) {
$this->key = $key;
- $this->workers = $conf['workers'];
+ $this->workers = $conf['workers'];
$this->maxqueue = $conf['maxqueue'];
- $this->timeout = $conf['timeout'];
+ $this->timeout = $conf['timeout'];
}
}
diff --git a/includes/Preferences.php b/includes/Preferences.php
index db231573..56dba05e 100644
--- a/includes/Preferences.php
+++ b/includes/Preferences.php
@@ -1,6 +1,6 @@
<?php
/**
- * Form to edit user perferences.
+ * Form to edit user preferences.
*
* 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
@@ -129,7 +129,7 @@ class Preferences {
static function getOptionFromUser( $name, $info, $user ) {
$val = $user->getOption( $name );
- // Handling for array-type preferences
+ // Handling for multiselect preferences
if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
( isset( $info['class'] ) && $info['class'] == 'HTMLMultiSelectField' ) ) {
$options = HTMLFormField::flattenOptions( $info['options'] );
@@ -143,6 +143,23 @@ class Preferences {
}
}
+ // Handling for checkmatrix preferences
+ if ( ( isset( $info['type'] ) && $info['type'] == 'checkmatrix' ) ||
+ ( isset( $info['class'] ) && $info['class'] == 'HTMLCheckMatrix' ) ) {
+ $columns = HTMLFormField::flattenOptions( $info['columns'] );
+ $rows = HTMLFormField::flattenOptions( $info['rows'] );
+ $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+ $val = array();
+
+ foreach ( $columns as $column ) {
+ foreach ( $rows as $row ) {
+ if ( $user->getOption( "$prefix-$column-$row" ) ) {
+ $val[] = "$column-$row";
+ }
+ }
+ }
+ }
+
return $val;
}
@@ -158,18 +175,21 @@ class Preferences {
$wgEnableEmail, $wgEmailConfirmToEdit, $wgEnableUserEmail, $wgEmailAuthentication,
$wgEnotifWatchlist, $wgEnotifUserTalk, $wgEnotifRevealEditorAddress;
+ // retrieving user name for GENDER and misc.
+ $userName = $user->getName();
+
## User info #####################################
// Information panel
$defaultPreferences['username'] = array(
'type' => 'info',
- 'label-message' => 'username',
- 'default' => $user->getName(),
+ 'label-message' => array( 'username', $userName ),
+ 'default' => $userName,
'section' => 'personal/info',
);
$defaultPreferences['userid'] = array(
'type' => 'info',
- 'label-message' => 'uid',
+ 'label-message' => array( 'uid', $userName ),
'default' => $user->getId(),
'section' => 'personal/info',
);
@@ -182,10 +202,10 @@ class Preferences {
// Skip the default * group, seems useless here
continue;
}
- $groupName = User::getGroupName( $ueg );
+ $groupName = User::getGroupName( $ueg );
$userGroups[] = User::makeGroupLinkHTML( $ueg, $groupName );
- $memberName = User::getGroupMember( $ueg, $user->getName() );
+ $memberName = User::getGroupMember( $ueg, $userName );
$userMembers[] = User::makeGroupLinkHTML( $ueg, $memberName );
}
asort( $userGroups );
@@ -196,7 +216,7 @@ class Preferences {
$defaultPreferences['usergroups'] = array(
'type' => 'info',
'label' => $context->msg( 'prefs-memberingroups' )->numParams(
- count( $userGroups ) )->parse(),
+ count( $userGroups ) )->params( $userName )->parse(),
'default' => $context->msg( 'prefs-memberingroups-type',
$lang->commaList( $userGroups ),
$lang->commaList( $userMembers )
@@ -252,7 +272,7 @@ class Preferences {
if ( $wgAuth->allowPasswordChange() ) {
$link = Linker::link( SpecialPage::getTitleFor( 'ChangePassword' ),
$context->msg( 'prefs-resetpass' )->escaped(), array(),
- array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' ) ) );
+ array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ) );
$defaultPreferences['password'] = array(
'type' => 'info',
@@ -356,7 +376,7 @@ class Preferences {
if ( $wgEnableEmail ) {
$helpMessages[] = $wgEmailConfirmToEdit
? 'prefs-help-email-required'
- : 'prefs-help-email' ;
+ : 'prefs-help-email';
if( $wgEnableUserEmail ) {
// additional messages when users can send email to each other
@@ -367,7 +387,7 @@ class Preferences {
SpecialPage::getTitleFor( 'ChangeEmail' ),
$context->msg( $user->getEmail() ? 'prefs-changeemail' : 'prefs-setemail' )->escaped(),
array(),
- array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' ) ) );
+ array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ) );
$emailAddress = $user->getEmail() ? htmlspecialchars( $user->getEmail() ) : '';
if ( $wgAuth->allowPropChange( 'emailaddress' ) ) {
@@ -377,7 +397,6 @@ class Preferences {
);
}
-
$defaultPreferences['emailaddress'] = array(
'type' => 'info',
'raw' => true,
@@ -507,14 +526,15 @@ class Preferences {
# be nice to somehow merge this back in there to avoid redundancy.
if ( $wgAllowUserCss || $wgAllowUserJs ) {
$linkTools = array();
+ $userName = $user->getName();
if ( $wgAllowUserCss ) {
- $cssPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/common.css' );
+ $cssPage = Title::makeTitleSafe( NS_USER, $userName . '/common.css' );
$linkTools[] = Linker::link( $cssPage, $context->msg( 'prefs-custom-css' )->escaped() );
}
if ( $wgAllowUserJs ) {
- $jsPage = Title::makeTitleSafe( NS_USER, $user->getName() . '/common.js' );
+ $jsPage = Title::makeTitleSafe( NS_USER, $userName . '/common.js' );
$linkTools[] = Linker::link( $jsPage, $context->msg( 'prefs-custom-js' )->escaped() );
}
@@ -805,7 +825,6 @@ class Preferences {
'label-message' => 'tog-forceeditsummary',
);
-
$defaultPreferences['uselivepreview'] = array(
'type' => 'toggle',
'section' => 'editing/advancedediting',
@@ -879,7 +898,7 @@ class Preferences {
global $wgUseRCPatrol, $wgEnableAPI, $wgRCMaxAge;
$watchlistdaysMax = ceil( $wgRCMaxAge / ( 3600 * 24 ) );
-
+
## Watchlist #####################################
$defaultPreferences['watchlistdays'] = array(
'type' => 'float',
@@ -887,7 +906,7 @@ class Preferences {
'max' => $watchlistdaysMax,
'section' => 'watchlist/displaywatchlist',
'help' => $context->msg( 'prefs-watchlist-days-max' )->numParams(
- $watchlistdaysMax )->text(),
+ $watchlistdaysMax )->text(),
'label-message' => 'prefs-watchlist-days',
);
$defaultPreferences['wllimit'] = array(
@@ -988,7 +1007,6 @@ class Preferences {
'min' => 0,
);
-
if ( $wgVectorUseSimpleSearch ) {
$defaultPreferences['vector-simplesearch'] = array(
'type' => 'toggle',
@@ -1009,27 +1027,17 @@ class Preferences {
'section' => 'searchoptions/advancedsearchoptions',
);
- $nsOptions = array();
-
- foreach ( $wgContLang->getNamespaces() as $ns => $name ) {
- if ( $ns < 0 ) {
- continue;
- }
-
- $displayNs = str_replace( '_', ' ', $name );
-
- if ( !$displayNs ) {
- $displayNs = $context->msg( 'blanknamespace' )->text();
- }
-
- $displayNs = htmlspecialchars( $displayNs );
- $nsOptions[$displayNs] = $ns;
+ $nsOptions = $wgContLang->getFormattedNamespaces();
+ $nsOptions[0] = $context->msg( 'blanknamespace' )->text();
+ foreach ( $nsOptions as $ns => $name ) {
+ if ( $ns < 0 )
+ unset( $nsOptions[$ns] );
}
$defaultPreferences['searchnamespaces'] = array(
'type' => 'multiselect',
'label-message' => 'defaultns',
- 'options' => $nsOptions,
+ 'options' => array_flip( $nsOptions ),
'section' => 'searchoptions/advancedsearchoptions',
'prefix' => 'searchNs',
);
@@ -1236,7 +1244,7 @@ class Preferences {
* @param $user User
* @param $context IContextSource
* @param $formClass string
- * @param $remove Array: array of items to remove
+ * @param array $remove array of items to remove
* @return HtmlForm
*/
static function getFormObject( $user, IContextSource $context, $formClass = 'PreferencesForm', array $remove = array() ) {
@@ -1339,7 +1347,7 @@ class Preferences {
* @param $alldata
* @return int
*/
- static function filterIntval( $value, $alldata ){
+ static function filterIntval( $value, $alldata ) {
return intval( $value );
}
@@ -1380,7 +1388,7 @@ class Preferences {
* @return bool|Status|string
*/
static function tryFormSubmit( $formData, $form, $entryPoint = 'internal' ) {
- global $wgHiddenPrefs;
+ global $wgHiddenPrefs, $wgAuth;
$user = $form->getModifiedUser();
$result = true;
@@ -1413,15 +1421,14 @@ class Preferences {
# via $wgHiddenPrefs, we don't want to destroy that setting in case the preference
# is subsequently re-enabled
# TODO: maintenance script to actually delete these
- foreach( $wgHiddenPrefs as $pref ){
+ foreach( $wgHiddenPrefs as $pref ) {
# If the user has not set a non-default value here, the default will be returned
# and subsequently discarded
$formData[$pref] = $user->getOption( $pref, null, true );
}
- // Keeps old preferences from interfering due to back-compat
- // code, etc.
- $user->resetOptions();
+ // Keep old preferences from interfering due to back-compat code, etc.
+ $user->resetOptions( 'unused', $form->getContext() );
foreach ( $formData as $key => $value ) {
$user->setOption( $key, $value );
@@ -1429,6 +1436,8 @@ class Preferences {
$user->saveSettings();
+ $wgAuth->updateExternalDB( $user );
+
return $result;
}
@@ -1464,7 +1473,7 @@ class Preferences {
*
* @deprecated in 1.20; use User::setEmailWithConfirmation() instead.
* @param $user User
- * @param $newaddr string New email address
+ * @param string $newaddr New email address
* @return Array (true on success or Status on failure, info string)
*/
public static function trySetUserEmail( User $user, $newaddr ) {
@@ -1565,10 +1574,11 @@ class PreferencesForm extends HTMLForm {
* @return array
*/
function filterDataForSubmit( $data ) {
- // Support for separating MultiSelect preferences into multiple preferences
+ // Support for separating multi-option preferences into multiple preferences
// Due to lack of array support.
foreach ( $this->mFlatFields as $fieldname => $field ) {
$info = $field->mParams;
+
if ( $field instanceof HTMLMultiSelectField ) {
$options = HTMLFormField::flattenOptions( $info['options'] );
$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
@@ -1578,6 +1588,23 @@ class PreferencesForm extends HTMLForm {
}
unset( $data[$fieldname] );
+
+ } elseif ( $field instanceof HTMLCheckMatrix ) {
+ $columns = HTMLFormField::flattenOptions( $info['columns'] );
+ $rows = HTMLFormField::flattenOptions( $info['rows'] );
+ $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
+ foreach ( $columns as $column ) {
+ foreach ( $rows as $row ) {
+ // Make sure option hasn't been removed
+ if ( !isset( $info['remove-options'] )
+ || !in_array( "$column-$row", $info['remove-options'] ) )
+ {
+ $data["$prefix-$column-$row"] = in_array( "$column-$row", $data[$fieldname] );
+ }
+ }
+ }
+
+ unset( $data[$fieldname] );
}
}
diff --git a/includes/PrefixSearch.php b/includes/PrefixSearch.php
index 5d4b35c1..d37d9e80 100644
--- a/includes/PrefixSearch.php
+++ b/includes/PrefixSearch.php
@@ -32,7 +32,7 @@ class PrefixSearch {
*
* @param $search String
* @param $limit Integer
- * @param $namespaces Array: used if query is not explicitely prefixed
+ * @param array $namespaces used if query is not explicitly prefixed
* @return Array of strings
*/
public static function titleSearch( $search, $limit, $namespaces = array() ) {
@@ -45,7 +45,7 @@ class PrefixSearch {
// Find a Title which is not an interwiki and is in NS_MAIN
$title = Title::newFromText( $search );
if( $title && $title->getInterwiki() == '' ) {
- $ns = array($title->getNamespace());
+ $ns = array( $title->getNamespace() );
if( $ns[0] == NS_MAIN ) {
$ns = $namespaces; // no explicit prefix, use default namespaces
}
@@ -91,7 +91,7 @@ class PrefixSearch {
/**
* Prefix search special-case for Special: namespace.
*
- * @param $search String: term
+ * @param string $search term
* @param $limit Integer: max number of items to return
* @return Array
*/
@@ -147,8 +147,8 @@ class PrefixSearch {
* be automatically capitalized by Title::secureAndSpit()
* later on depending on $wgCapitalLinks)
*
- * @param $namespaces Array: namespaces to search in
- * @param $search String: term
+ * @param array $namespaces namespaces to search in
+ * @param string $search term
* @param $limit Integer: max number of items to return
* @return Array of title strings
*/
diff --git a/includes/ProtectionForm.php b/includes/ProtectionForm.php
index ce0e36b0..d7b88400 100644
--- a/includes/ProtectionForm.php
+++ b/includes/ProtectionForm.php
@@ -63,7 +63,7 @@ class ProtectionForm {
$this->mArticle = $article;
$this->mTitle = $article->getTitle();
$this->mApplicableTypes = $this->mTitle->getRestrictionTypes();
-
+
// Check if the form should be disabled.
// If it is, the form will be available in read-only to show levels.
$this->mPermErrors = $this->mTitle->getUserPermissionsErrors( 'protect', $wgUser );
@@ -139,7 +139,7 @@ class ProtectionForm {
if( !$wgUser->isAllowedAny( 'protect', 'editprotected' ) )
continue;
} else {
- if( !$wgUser->isAllowed($val) )
+ if( !$wgUser->isAllowed( $val ) )
continue;
}
$this->mRestrictions[$action] = $val;
@@ -201,12 +201,13 @@ class ProtectionForm {
/**
* Show the input form with optional error message
*
- * @param $err String: error message or null if there's no error
+ * @param string $err error message or null if there's no error
*/
function show( $err = null ) {
global $wgOut;
$wgOut->setRobotPolicy( 'noindex,nofollow' );
+ $wgOut->addBacklinkSubtitle( $this->mTitle );
if ( is_array( $err ) ) {
$wgOut->wrapWikiMsg( "<p class='error'>\n$1\n</p>\n", $err );
@@ -214,15 +215,27 @@ class ProtectionForm {
$wgOut->addHTML( "<p class='error'>{$err}</p>\n" );
}
+ if ( $this->mTitle->getRestrictionTypes() === array() ) {
+ // No restriction types available for the current title
+ // this might happen if an extension alters the available types
+ $wgOut->setPageTitle( wfMessage( 'protect-norestrictiontypes-title', $this->mTitle->getPrefixedText() ) );
+ $wgOut->addWikiText( wfMessage( 'protect-norestrictiontypes-text' )->text() );
+
+ // Show the log in case protection was possible once
+ $this->showLogExtract( $wgOut );
+ // return as there isn't anything else we can do
+ return;
+ }
+
list( $cascadeSources, /* $restrictions */ ) = $this->mTitle->getCascadeProtectionSources();
- if ( $cascadeSources && count($cascadeSources) > 0 ) {
+ if ( $cascadeSources && count( $cascadeSources ) > 0 ) {
$titles = '';
foreach ( $cascadeSources as $title ) {
$titles .= '* [[:' . $title->getPrefixedText() . "]]\n";
}
- $wgOut->wrapWikiMsg( "<div id=\"mw-protect-cascadeon\">\n$1\n" . $titles . "</div>", array( 'protect-cascadeon', count($cascadeSources) ) );
+ $wgOut->wrapWikiMsg( "<div id=\"mw-protect-cascadeon\">\n$1\n" . $titles . "</div>", array( 'protect-cascadeon', count( $cascadeSources ) ) );
}
# Show an appropriate message if the user isn't allowed or able to change
@@ -236,7 +249,6 @@ class ProtectionForm {
wfEscapeWikiText( $this->mTitle->getPrefixedText() ) );
}
- $wgOut->addBacklinkSubtitle( $this->mTitle );
$wgOut->addHTML( $this->buildForm() );
$this->showLogExtract( $wgOut );
}
@@ -272,7 +284,7 @@ class ProtectionForm {
$expiry = array();
foreach( $this->mApplicableTypes as $action ) {
$expiry[$action] = $this->getExpiry( $action );
- if( empty($this->mRestrictions[$action]) )
+ if( empty( $this->mRestrictions[$action] ) )
continue; // unprotected
if ( !$expiry[$action] ) {
$this->show( array( 'protect_expiry_invalid' ) );
@@ -286,12 +298,10 @@ class ProtectionForm {
# They shouldn't be able to do this anyway, but just to make sure, ensure that cascading restrictions aren't being applied
# to a semi-protected page.
- global $wgGroupPermissions;
-
$edit_restriction = isset( $this->mRestrictions['edit'] ) ? $this->mRestrictions['edit'] : '';
$this->mCascade = $wgRequest->getBool( 'mwProtect-cascade' );
- if ($this->mCascade && ($edit_restriction != 'protect') &&
- !(isset($wgGroupPermissions[$edit_restriction]['protect']) && $wgGroupPermissions[$edit_restriction]['protect'] ) )
+ if ( $this->mCascade && ($edit_restriction != 'protect') &&
+ !User::groupHasPermission( $edit_restriction, 'protect' ) )
$this->mCascade = false;
$status = $this->mArticle->doUpdateRestrictions( $this->mRestrictions, $expiry, $this->mCascade, $reasonstr, $wgUser );
@@ -402,14 +412,14 @@ class ProtectionForm {
wfMessage( 'protect-othertime-op' )->text(),
"othertime"
) . "\n";
- foreach( explode(',', $scExpiryOptions) as $option ) {
- if ( strpos($option, ":") === false ) {
+ foreach( explode( ',', $scExpiryOptions ) as $option ) {
+ if ( strpos( $option, ":" ) === false ) {
$show = $value = $option;
} else {
- list($show, $value) = explode(":", $option);
+ list( $show, $value ) = explode( ":", $option );
}
- $show = htmlspecialchars($show);
- $value = htmlspecialchars($value);
+ $show = htmlspecialchars( $show );
+ $value = htmlspecialchars( $value );
$expiryFormOptions .= Xml::option( $show, $value, $this->mExpirySelection[$action] === $value ) . "\n";
}
# Add expiry dropdown
@@ -448,7 +458,7 @@ class ProtectionForm {
"</td></tr>";
}
# Give extensions a chance to add items to the form
- wfRunHooks( 'ProtectionForm::buildForm', array($this->mArticle,&$out) );
+ wfRunHooks( 'ProtectionForm::buildForm', array( $this->mArticle, &$out ) );
$out .= Xml::closeElement( 'tbody' ) . Xml::closeElement( 'table' );
@@ -472,7 +482,7 @@ class ProtectionForm {
# Add manual and custom reason field/selects as well as submit
if( !$this->disabled ) {
- $out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table3' ) ) .
+ $out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table3' ) ) .
Xml::openElement( 'tbody' );
$out .= "
<tr>
@@ -503,7 +513,7 @@ class ProtectionForm {
<td class='mw-input'>" .
Xml::checkLabel( wfMessage( 'watchthis' )->text(),
'mwProtectWatch', 'mwProtectWatch',
- $this->mTitle->userIsWatching() || $wgUser->getOption( 'watchdefault' ) ) .
+ $wgUser->isWatched( $this->mTitle ) || $wgUser->getOption( 'watchdefault' ) ) .
"</td>
</tr>";
}
@@ -544,8 +554,8 @@ class ProtectionForm {
/**
* Build protection level selector
*
- * @param $action String: action to protect
- * @param $selected String: current protection level
+ * @param string $action action to protect
+ * @param string $selected current protection level
* @return String: HTML fragment
*/
function buildSelector( $action, $selected ) {
@@ -559,7 +569,7 @@ class ProtectionForm {
if( !$wgUser->isAllowedAny( 'protect', 'editprotected' ) && !$this->disabled )
continue;
} else {
- if( !$wgUser->isAllowed($key) && !$this->disabled )
+ if( !$wgUser->isAllowed( $key ) && !$this->disabled )
continue;
}
$levels[] = $key;
@@ -584,7 +594,7 @@ class ProtectionForm {
/**
* Prepare the label for a protection selector option
*
- * @param $permission String: permission required
+ * @param string $permission permission required
* @return String
*/
private function getOptionLabel( $permission ) {
@@ -600,11 +610,11 @@ class ProtectionForm {
}
function buildCleanupScript() {
- global $wgRestrictionLevels, $wgGroupPermissions, $wgOut;
+ global $wgRestrictionLevels, $wgOut;
$cascadeableLevels = array();
foreach( $wgRestrictionLevels as $key ) {
- if ( ( isset( $wgGroupPermissions[$key]['protect'] ) && $wgGroupPermissions[$key]['protect'] )
+ if ( User::groupHasPermission( $key, 'protect' )
|| $key == 'protect'
) {
$cascadeableLevels[] = $key;
@@ -634,6 +644,6 @@ class ProtectionForm {
$out->addHTML( Xml::element( 'h2', null, $protectLogPage->getName()->text() ) );
LogEventsList::showLogExtract( $out, 'protect', $this->mTitle );
# Let extensions add other relevant log extracts
- wfRunHooks( 'ProtectionForm::showLogExtract', array($this->mArticle,$out) );
+ wfRunHooks( 'ProtectionForm::showLogExtract', array( $this->mArticle, $out ) );
}
}
diff --git a/includes/ProxyTools.php b/includes/ProxyTools.php
index 349789fe..b54a9a35 100644
--- a/includes/ProxyTools.php
+++ b/includes/ProxyTools.php
@@ -60,8 +60,8 @@ function wfGetIP() {
}
/**
- * Checks if an IP is a trusted proxy providor.
- * Useful to tell if X-Fowarded-For data is possibly bogus.
+ * Checks if an IP is a trusted proxy provider.
+ * Useful to tell if X-Forwarded-For data is possibly bogus.
* Squid cache servers for the site are whitelisted.
*
* @param $ip String
@@ -109,7 +109,7 @@ function wfProxyCheck() {
if ( !$skip ) {
$title = SpecialPage::getTitleFor( 'Blockme' );
$iphash = md5( $ip . $wgProxyKey );
- $url = wfExpandUrl( $title->getFullURL( 'ip='.$iphash ), PROTO_HTTP );
+ $url = wfExpandUrl( $title->getFullURL( 'ip=' . $iphash ), PROTO_HTTP );
foreach ( $wgProxyPorts as $port ) {
$params = implode( ' ', array(
diff --git a/includes/QueryPage.php b/includes/QueryPage.php
index ac559dc5..e1f24fa9 100644
--- a/includes/QueryPage.php
+++ b/includes/QueryPage.php
@@ -72,7 +72,6 @@ global $wgDisableCounters;
if ( !$wgDisableCounters )
$wgQueryPages[] = array( 'PopularPagesPage', 'Popularpages' );
-
/**
* This is a class for doing query pages; since they're almost all the same,
* we factor out some of the functionality into a superclass, and let
@@ -150,7 +149,8 @@ abstract class QueryPage extends SpecialPage {
/**
* For back-compat, subclasses may return a raw SQL query here, as a string.
- * This is stronly deprecated; getQueryInfo() should be overridden instead.
+ * This is strongly deprecated; getQueryInfo() should be overridden instead.
+ * @throws MWException
* @return string
*/
function getSQL() {
@@ -228,7 +228,7 @@ abstract class QueryPage extends SpecialPage {
}
/**
- * Sometime we dont want to build rss / atom feeds.
+ * Sometime we don't want to build rss / atom feeds.
*
* @return Boolean
*/
@@ -301,55 +301,51 @@ abstract class QueryPage extends SpecialPage {
return false;
}
- if ( $ignoreErrors ) {
- $ignoreW = $dbw->ignoreErrors( true );
- $ignoreR = $dbr->ignoreErrors( true );
- }
-
- # Clear out any old cached data
- $dbw->delete( 'querycache', array( 'qc_type' => $this->getName() ), $fname );
- # Do query
- $res = $this->reallyDoQuery( $limit, false );
- $num = false;
- if ( $res ) {
- $num = $res->numRows();
- # Fetch results
- $vals = array();
- while ( $res && $row = $dbr->fetchObject( $res ) ) {
- if ( isset( $row->value ) ) {
- if ( $this->usesTimestamps() ) {
- $value = wfTimestamp( TS_UNIX,
- $row->value );
+ try {
+ # Clear out any old cached data
+ $dbw->delete( 'querycache', array( 'qc_type' => $this->getName() ), $fname );
+ # Do query
+ $res = $this->reallyDoQuery( $limit, false );
+ $num = false;
+ if ( $res ) {
+ $num = $res->numRows();
+ # Fetch results
+ $vals = array();
+ while ( $res && $row = $dbr->fetchObject( $res ) ) {
+ if ( isset( $row->value ) ) {
+ if ( $this->usesTimestamps() ) {
+ $value = wfTimestamp( TS_UNIX,
+ $row->value );
+ } else {
+ $value = intval( $row->value ); // @bug 14414
+ }
} else {
- $value = intval( $row->value ); // @bug 14414
+ $value = 0;
}
- } else {
- $value = 0;
- }
- $vals[] = array( 'qc_type' => $this->getName(),
- 'qc_namespace' => $row->namespace,
- 'qc_title' => $row->title,
- 'qc_value' => $value );
- }
+ $vals[] = array( 'qc_type' => $this->getName(),
+ 'qc_namespace' => $row->namespace,
+ 'qc_title' => $row->title,
+ 'qc_value' => $value );
+ }
- # Save results into the querycache table on the master
- if ( count( $vals ) ) {
- if ( !$dbw->insert( 'querycache', $vals, __METHOD__ ) ) {
- // Set result to false to indicate error
- $num = false;
+ # Save results into the querycache table on the master
+ if ( count( $vals ) ) {
+ $dbw->insert( 'querycache', $vals, __METHOD__ );
}
+ # Update the querycache_info record for the page
+ $dbw->delete( 'querycache_info', array( 'qci_type' => $this->getName() ), $fname );
+ $dbw->insert( 'querycache_info',
+ array( 'qci_type' => $this->getName(), 'qci_timestamp' => $dbw->timestamp() ),
+ $fname );
}
- if ( $ignoreErrors ) {
- $dbw->ignoreErrors( $ignoreW );
- $dbr->ignoreErrors( $ignoreR );
+ } catch ( DBError $e ) {
+ if ( !$ignoreErrors ) {
+ throw $e; // report query error
}
-
- # Update the querycache_info record for the page
- $dbw->delete( 'querycache_info', array( 'qci_type' => $this->getName() ), $fname );
- $dbw->insert( 'querycache_info', array( 'qci_type' => $this->getName(), 'qci_timestamp' => $dbw->timestamp() ), $fname );
-
+ $num = false; // set result to false to indicate error
}
+
return $num;
}
@@ -651,7 +647,7 @@ abstract class QueryPage extends SpecialPage {
if ( !$wgFeed ) {
$this->getOutput()->addWikiMsg( 'feed-unavailable' );
- return;
+ return false;
}
global $wgFeedLimit;
diff --git a/includes/RecentChange.php b/includes/RecentChange.php
index 332d0390..d7cf995c 100644
--- a/includes/RecentChange.php
+++ b/includes/RecentChange.php
@@ -55,6 +55,7 @@
* lang the interwiki prefix, automatically set in save()
* oldSize text size before the change
* newSize text size after the change
+ * pageStatus status of the page: created, deleted, moved, restored, changed
*
* temporary: not stored in the database
* notificationtimestamp
@@ -79,7 +80,7 @@ class RecentChange {
* @var Title
*/
var $mMovedToTitle = false;
- var $numberofWatchingusers = 0 ; # Dummy to prevent error message in SpecialRecentchangeslinked
+ var $numberofWatchingusers = 0; # Dummy to prevent error message in SpecialRecentchangeslinked
var $notificationtimestamp;
# Factory methods
@@ -109,7 +110,7 @@ class RecentChange {
/**
* Obtain the recent change with a given rc_id value
*
- * @param $rcid Int rc_id value to retrieve
+ * @param int $rcid rc_id value to retrieve
* @return RecentChange
*/
public static function newFromId( $rcid ) {
@@ -119,13 +120,13 @@ class RecentChange {
/**
* Find the first recent change matching some specific conditions
*
- * @param $conds Array of conditions
+ * @param array $conds of conditions
* @param $fname Mixed: override the method name in profiling/logs
* @return RecentChange
*/
public static function newFromConds( $conds, $fname = __METHOD__ ) {
$dbr = wfGetDB( DB_SLAVE );
- $row = $dbr->selectRow( 'recentchanges', '*', $conds, $fname );
+ $row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname );
if ( $row !== false ) {
return self::newFromRow( $row );
} else {
@@ -133,6 +134,40 @@ class RecentChange {
}
}
+ /**
+ * Return the list of recentchanges fields that should be selected to create
+ * a new recentchanges object.
+ * @return array
+ */
+ public static function selectFields() {
+ return array(
+ 'rc_id',
+ 'rc_timestamp',
+ 'rc_cur_time',
+ 'rc_user',
+ 'rc_user_text',
+ 'rc_namespace',
+ 'rc_title',
+ 'rc_comment',
+ 'rc_minor',
+ 'rc_bot',
+ 'rc_new',
+ 'rc_cur_id',
+ 'rc_this_oldid',
+ 'rc_last_oldid',
+ 'rc_type',
+ 'rc_patrolled',
+ 'rc_ip',
+ 'rc_old_len',
+ 'rc_new_len',
+ 'rc_deleted',
+ 'rc_logid',
+ 'rc_log_type',
+ 'rc_log_action',
+ 'rc_params',
+ );
+ }
+
# Accessors
/**
@@ -154,26 +189,13 @@ class RecentChange {
* @return Title
*/
public function &getTitle() {
- if( $this->mTitle === false ) {
+ if ( $this->mTitle === false ) {
$this->mTitle = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] );
- # Make sure the correct page ID is process cached
- $this->mTitle->resetArticleID( $this->mAttribs['rc_cur_id'] );
}
return $this->mTitle;
}
/**
- * @return bool|Title
- */
- public function getMovedToTitle() {
- if( $this->mMovedToTitle === false ) {
- $this->mMovedToTitle = Title::makeTitle( $this->mAttribs['rc_moved_to_ns'],
- $this->mAttribs['rc_moved_to_title'] );
- }
- return $this->mMovedToTitle;
- }
-
- /**
* Get the User object of the person who performed this change.
*
* @return User
@@ -197,30 +219,33 @@ class RecentChange {
global $wgLocalInterwiki, $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang;
$dbw = wfGetDB( DB_MASTER );
- if( !is_array($this->mExtra) ) {
+ if ( !is_array( $this->mExtra ) ) {
$this->mExtra = array();
}
$this->mExtra['lang'] = $wgLocalInterwiki;
- if( !$wgPutIPinRC ) {
+ if ( !$wgPutIPinRC ) {
$this->mAttribs['rc_ip'] = '';
}
# If our database is strict about IP addresses, use NULL instead of an empty string
- if( $dbw->strictIPs() and $this->mAttribs['rc_ip'] == '' ) {
+ if ( $dbw->strictIPs() and $this->mAttribs['rc_ip'] == '' ) {
unset( $this->mAttribs['rc_ip'] );
}
+ # Trim spaces on user supplied text
+ $this->mAttribs['rc_comment'] = trim( $this->mAttribs['rc_comment'] );
+
# Make sure summary is truncated (whole multibyte characters)
$this->mAttribs['rc_comment'] = $wgContLang->truncate( $this->mAttribs['rc_comment'], 255 );
# Fixup database timestamps
- $this->mAttribs['rc_timestamp'] = $dbw->timestamp($this->mAttribs['rc_timestamp']);
- $this->mAttribs['rc_cur_time'] = $dbw->timestamp($this->mAttribs['rc_cur_time']);
+ $this->mAttribs['rc_timestamp'] = $dbw->timestamp( $this->mAttribs['rc_timestamp'] );
+ $this->mAttribs['rc_cur_time'] = $dbw->timestamp( $this->mAttribs['rc_cur_time'] );
$this->mAttribs['rc_id'] = $dbw->nextSequenceValue( 'recentchanges_rc_id_seq' );
## If we are using foreign keys, an entry of 0 for the page_id will fail, so use NULL
- if( $dbw->cascadingDeletes() and $this->mAttribs['rc_cur_id']==0 ) {
+ if ( $dbw->cascadingDeletes() and $this->mAttribs['rc_cur_id'] == 0 ) {
unset( $this->mAttribs['rc_cur_id'] );
}
@@ -239,18 +264,19 @@ class RecentChange {
}
# E-mail notifications
- if( $wgUseEnotif || $wgShowUpdatedMarker ) {
+ if ( $wgUseEnotif || $wgShowUpdatedMarker ) {
$editor = $this->getPerformer();
$title = $this->getTitle();
- if ( wfRunHooks( 'AbortEmailNotification', array($editor, $title) ) ) {
+ if ( wfRunHooks( 'AbortEmailNotification', array( $editor, $title ) ) ) {
# @todo FIXME: This would be better as an extension hook
$enotif = new EmailNotification();
$enotif->notifyOnPageChange( $editor, $title,
$this->mAttribs['rc_timestamp'],
$this->mAttribs['rc_comment'],
$this->mAttribs['rc_minor'],
- $this->mAttribs['rc_last_oldid'] );
+ $this->mAttribs['rc_last_oldid'],
+ $this->mExtra['pageStatus'] );
}
}
}
@@ -258,7 +284,7 @@ class RecentChange {
public function notifyRC2UDP() {
global $wgRC2UDPAddress, $wgRC2UDPOmitBots;
# Notify external application via UDP
- if( $wgRC2UDPAddress && ( !$this->mAttribs['rc_bot'] || !$wgRC2UDPOmitBots ) ) {
+ if ( $wgRC2UDPAddress && ( !$this->mAttribs['rc_bot'] || !$wgRC2UDPOmitBots ) ) {
self::sendToUDP( $this->getIRCLine() );
}
}
@@ -266,10 +292,10 @@ class RecentChange {
/**
* Send some text to UDP.
* @see RecentChange::cleanupForIRC
- * @param $line String: text to send
- * @param $address String: defaults to $wgRC2UDPAddress.
- * @param $prefix String: defaults to $wgRC2UDPPrefix.
- * @param $port Int: defaults to $wgRC2UDPPort. (Since 1.17)
+ * @param string $line text to send
+ * @param string $address defaults to $wgRC2UDPAddress.
+ * @param string $prefix defaults to $wgRC2UDPPrefix.
+ * @param int $port defaults to $wgRC2UDPPort. (Since 1.17)
* @return Boolean: success
*/
public static function sendToUDP( $line, $address = '', $prefix = '', $port = '' ) {
@@ -279,12 +305,12 @@ class RecentChange {
$prefix = $prefix ? $prefix : $wgRC2UDPPrefix;
$port = $port ? $port : $wgRC2UDPPort;
# Notify external application via UDP
- if( $address ) {
+ if ( $address ) {
$conn = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
- if( $conn ) {
+ if ( $conn ) {
$line = $prefix . $line;
wfDebug( __METHOD__ . ": sending UDP line: $line\n" );
- socket_sendto( $conn, $line, strlen($line), 0, $address, $port );
+ socket_sendto( $conn, $line, strlen( $line ), 0, $address, $port );
socket_close( $conn );
return true;
} else {
@@ -295,7 +321,7 @@ class RecentChange {
}
/**
- * Remove newlines, carriage returns and decode html entites
+ * Remove newlines, carriage returns and decode html entities
* @param $text String
* @return String
*/
@@ -315,9 +341,9 @@ class RecentChange {
$change = $change instanceof RecentChange
? $change
- : RecentChange::newFromId($change);
+ : RecentChange::newFromId( $change );
- if( !$change instanceof RecentChange ) {
+ if ( !$change instanceof RecentChange ) {
return null;
}
return $change->doMarkPatrolled( $wgUser, $auto );
@@ -336,32 +362,32 @@ class RecentChange {
$errors = array();
// If recentchanges patrol is disabled, only new pages
// can be patrolled
- if( !$wgUseRCPatrol && ( !$wgUseNPPatrol || $this->getAttribute('rc_type') != RC_NEW ) ) {
- $errors[] = array('rcpatroldisabled');
+ if ( !$wgUseRCPatrol && ( !$wgUseNPPatrol || $this->getAttribute( 'rc_type' ) != RC_NEW ) ) {
+ $errors[] = array( 'rcpatroldisabled' );
}
// Automatic patrol needs "autopatrol", ordinary patrol needs "patrol"
$right = $auto ? 'autopatrol' : 'patrol';
$errors = array_merge( $errors, $this->getTitle()->getUserPermissionsErrors( $right, $user ) );
- if( !wfRunHooks('MarkPatrolled', array($this->getAttribute('rc_id'), &$user, false)) ) {
- $errors[] = array('hookaborted');
+ if ( !wfRunHooks( 'MarkPatrolled', array( $this->getAttribute( 'rc_id' ), &$user, false ) ) ) {
+ $errors[] = array( 'hookaborted' );
}
// Users without the 'autopatrol' right can't patrol their
// own revisions
- if( $user->getName() == $this->getAttribute('rc_user_text') && !$user->isAllowed('autopatrol') ) {
- $errors[] = array('markedaspatrollederror-noautopatrol');
+ if ( $user->getName() == $this->getAttribute( 'rc_user_text' ) && !$user->isAllowed( 'autopatrol' ) ) {
+ $errors[] = array( 'markedaspatrollederror-noautopatrol' );
}
- if( $errors ) {
+ if ( $errors ) {
return $errors;
}
// If the change was patrolled already, do nothing
- if( $this->getAttribute('rc_patrolled') ) {
+ if ( $this->getAttribute( 'rc_patrolled' ) ) {
return array();
}
// Actually set the 'patrolled' flag in RC
$this->reallyMarkPatrolled();
// Log this patrol event
PatrolLog::record( $this, $auto, $user );
- wfRunHooks( 'MarkPatrolledComplete', array($this->getAttribute('rc_id'), &$user, false) );
+ wfRunHooks( 'MarkPatrolledComplete', array( $this->getAttribute( 'rc_id' ), &$user, false ) );
return array();
}
@@ -377,7 +403,7 @@ class RecentChange {
'rc_patrolled' => 1
),
array(
- 'rc_id' => $this->getAttribute('rc_id')
+ 'rc_id' => $this->getAttribute( 'rc_id' )
),
__METHOD__
);
@@ -403,7 +429,7 @@ class RecentChange {
* @return RecentChange
*/
public static function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, $oldId,
- $lastTimestamp, $bot, $ip='', $oldSize=0, $newSize=0, $newId=0, $patrol=0 ) {
+ $lastTimestamp, $bot, $ip = '', $oldSize = 0, $newSize = 0, $newId = 0, $patrol = 0 ) {
$rc = new RecentChange;
$rc->mTitle = $title;
$rc->mPerformer = $user;
@@ -421,10 +447,8 @@ class RecentChange {
'rc_this_oldid' => $newId,
'rc_last_oldid' => $oldId,
'rc_bot' => $bot ? 1 : 0,
- 'rc_moved_to_ns' => 0,
- 'rc_moved_to_title' => '',
'rc_ip' => self::checkIPAddress( $ip ),
- 'rc_patrolled' => intval($patrol),
+ 'rc_patrolled' => intval( $patrol ),
'rc_new' => 0, # obsolete
'rc_old_len' => $oldSize,
'rc_new_len' => $newSize,
@@ -435,11 +459,12 @@ class RecentChange {
'rc_params' => ''
);
- $rc->mExtra = array(
+ $rc->mExtra = array(
'prefixedDBkey' => $title->getPrefixedDBkey(),
'lastTimestamp' => $lastTimestamp,
'oldSize' => $oldSize,
'newSize' => $newSize,
+ 'pageStatus' => 'changed'
);
$rc->save();
return $rc;
@@ -463,7 +488,7 @@ class RecentChange {
* @return RecentChange
*/
public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot,
- $ip='', $size=0, $newId=0, $patrol=0 ) {
+ $ip = '', $size = 0, $newId = 0, $patrol = 0 ) {
$rc = new RecentChange;
$rc->mTitle = $title;
$rc->mPerformer = $user;
@@ -481,10 +506,8 @@ class RecentChange {
'rc_this_oldid' => $newId,
'rc_last_oldid' => 0,
'rc_bot' => $bot ? 1 : 0,
- 'rc_moved_to_ns' => 0,
- 'rc_moved_to_title' => '',
'rc_ip' => self::checkIPAddress( $ip ),
- 'rc_patrolled' => intval($patrol),
+ 'rc_patrolled' => intval( $patrol ),
'rc_new' => 1, # obsolete
'rc_old_len' => 0,
'rc_new_len' => $size,
@@ -495,11 +518,12 @@ class RecentChange {
'rc_params' => ''
);
- $rc->mExtra = array(
+ $rc->mExtra = array(
'prefixedDBkey' => $title->getPrefixedDBkey(),
'lastTimestamp' => 0,
'oldSize' => 0,
- 'newSize' => $size
+ 'newSize' => $size,
+ 'pageStatus' => 'created'
);
$rc->save();
return $rc;
@@ -521,11 +545,11 @@ class RecentChange {
* @return bool
*/
public static function notifyLog( $timestamp, &$title, &$user, $actionComment, $ip, $type,
- $action, $target, $logComment, $params, $newId=0, $actionCommentIRC='' )
+ $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' )
{
global $wgLogRestrictions;
# Don't add private logs to RC!
- if( isset($wgLogRestrictions[$type]) && $wgLogRestrictions[$type] != '*' ) {
+ if ( isset( $wgLogRestrictions[$type] ) && $wgLogRestrictions[$type] != '*' ) {
return false;
}
$rc = self::newLogEntry( $timestamp, $title, $user, $actionComment, $ip, $type, $action,
@@ -550,9 +574,30 @@ class RecentChange {
* @return RecentChange
*/
public static function newLogEntry( $timestamp, &$title, &$user, $actionComment, $ip,
- $type, $action, $target, $logComment, $params, $newId=0, $actionCommentIRC='' ) {
+ $type, $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' ) {
global $wgRequest;
+ ## Get pageStatus for email notification
+ switch ( $type . '-' . $action ) {
+ case 'delete-delete':
+ $pageStatus = 'deleted';
+ break;
+ case 'move-move':
+ case 'move-move_redir':
+ $pageStatus = 'moved';
+ break;
+ case 'delete-restore':
+ $pageStatus = 'restored';
+ break;
+ case 'upload-upload':
+ $pageStatus = 'created';
+ break;
+ case 'upload-overwrite':
+ default:
+ $pageStatus = 'changed';
+ break;
+ }
+
$rc = new RecentChange;
$rc->mTitle = $target;
$rc->mPerformer = $user;
@@ -570,8 +615,6 @@ class RecentChange {
'rc_this_oldid' => 0,
'rc_last_oldid' => 0,
'rc_bot' => $user->isAllowed( 'bot' ) ? $wgRequest->getBool( 'bot', true ) : 0,
- 'rc_moved_to_ns' => 0,
- 'rc_moved_to_title' => '',
'rc_ip' => self::checkIPAddress( $ip ),
'rc_patrolled' => 1,
'rc_new' => 0, # obsolete
@@ -584,10 +627,11 @@ class RecentChange {
'rc_params' => $params
);
- $rc->mExtra = array(
+ $rc->mExtra = array(
'prefixedDBkey' => $title->getPrefixedDBkey(),
'lastTimestamp' => 0,
'actionComment' => $actionComment, // the comment appended to the action, passed from LogPage
+ 'pageStatus' => $pageStatus,
'actionCommentIRC' => $actionCommentIRC
);
return $rc;
@@ -600,7 +644,7 @@ class RecentChange {
*/
public function loadFromRow( $row ) {
$this->mAttribs = get_object_vars( $row );
- $this->mAttribs['rc_timestamp'] = wfTimestamp(TS_MW, $this->mAttribs['rc_timestamp']);
+ $this->mAttribs['rc_timestamp'] = wfTimestamp( TS_MW, $this->mAttribs['rc_timestamp'] );
$this->mAttribs['rc_deleted'] = $row->rc_deleted; // MUST be set
}
@@ -611,7 +655,7 @@ class RecentChange {
*/
public function loadFromCurRow( $row ) {
$this->mAttribs = array(
- 'rc_timestamp' => wfTimestamp(TS_MW, $row->rev_timestamp),
+ 'rc_timestamp' => wfTimestamp( TS_MW, $row->rev_timestamp ),
'rc_cur_time' => $row->rev_timestamp,
'rc_user' => $row->rev_user,
'rc_user_text' => $row->rev_user_text,
@@ -621,21 +665,19 @@ class RecentChange {
'rc_minor' => $row->rev_minor_edit ? 1 : 0,
'rc_type' => $row->page_is_new ? RC_NEW : RC_EDIT,
'rc_cur_id' => $row->page_id,
- 'rc_this_oldid' => $row->rev_id,
- 'rc_last_oldid' => isset($row->rc_last_oldid) ? $row->rc_last_oldid : 0,
- 'rc_bot' => 0,
- 'rc_moved_to_ns' => 0,
- 'rc_moved_to_title' => '',
+ 'rc_this_oldid' => $row->rev_id,
+ 'rc_last_oldid' => isset( $row->rc_last_oldid ) ? $row->rc_last_oldid : 0,
+ 'rc_bot' => 0,
'rc_ip' => '',
'rc_id' => $row->rc_id,
'rc_patrolled' => $row->rc_patrolled,
'rc_new' => $row->page_is_new, # obsolete
'rc_old_len' => $row->rc_old_len,
'rc_new_len' => $row->rc_new_len,
- 'rc_params' => isset($row->rc_params) ? $row->rc_params : '',
- 'rc_log_type' => isset($row->rc_log_type) ? $row->rc_log_type : null,
- 'rc_log_action' => isset($row->rc_log_action) ? $row->rc_log_action : null,
- 'rc_log_id' => isset($row->rc_log_id) ? $row->rc_log_id: 0,
+ 'rc_params' => isset( $row->rc_params ) ? $row->rc_params : '',
+ 'rc_log_type' => isset( $row->rc_log_type ) ? $row->rc_log_type : null,
+ 'rc_log_action' => isset( $row->rc_log_action ) ? $row->rc_log_action : null,
+ 'rc_logid' => isset( $row->rc_logid ) ? $row->rc_logid : 0,
'rc_deleted' => $row->rc_deleted // MUST be set
);
}
@@ -643,7 +685,7 @@ class RecentChange {
/**
* Get an attribute value
*
- * @param $name String Attribute name
+ * @param string $name Attribute name
* @return mixed
*/
public function getAttribute( $name ) {
@@ -664,13 +706,13 @@ class RecentChange {
* @return string
*/
public function diffLinkTrail( $forceCur ) {
- if( $this->mAttribs['rc_type'] == RC_EDIT ) {
- $trail = "curid=" . (int)($this->mAttribs['rc_cur_id']) .
- "&oldid=" . (int)($this->mAttribs['rc_last_oldid']);
- if( $forceCur ) {
- $trail .= '&diff=0' ;
+ if ( $this->mAttribs['rc_type'] == RC_EDIT ) {
+ $trail = "curid=" . (int)( $this->mAttribs['rc_cur_id'] ) .
+ "&oldid=" . (int)( $this->mAttribs['rc_last_oldid'] );
+ if ( $forceCur ) {
+ $trail .= '&diff=0';
} else {
- $trail .= '&diff=' . (int)($this->mAttribs['rc_this_oldid']);
+ $trail .= '&diff=' . (int)( $this->mAttribs['rc_this_oldid'] );
}
} else {
$trail = '';
@@ -685,7 +727,7 @@ class RecentChange {
global $wgUseRCPatrol, $wgUseNPPatrol, $wgRC2UDPInterwikiPrefix, $wgLocalInterwiki,
$wgCanonicalServer, $wgScript;
- if( $this->mAttribs['rc_type'] == RC_LOG ) {
+ if ( $this->mAttribs['rc_type'] == RC_LOG ) {
// Don't use SpecialPage::getTitleFor, backwards compatibility with
// IRC API which expects "Log".
$titleObj = Title::newFromText( 'Log/' . $this->mAttribs['rc_log_type'], NS_SPECIAL );
@@ -695,11 +737,11 @@ class RecentChange {
$title = $titleObj->getPrefixedText();
$title = self::cleanupForIRC( $title );
- if( $this->mAttribs['rc_type'] == RC_LOG ) {
+ if ( $this->mAttribs['rc_type'] == RC_LOG ) {
$url = '';
} else {
$url = $wgCanonicalServer . $wgScript;
- if( $this->mAttribs['rc_type'] == RC_NEW ) {
+ if ( $this->mAttribs['rc_type'] == RC_NEW ) {
$query = '?oldid=' . $this->mAttribs['rc_this_oldid'];
} else {
$query = '?diff=' . $this->mAttribs['rc_this_oldid'] . '&oldid=' . $this->mAttribs['rc_last_oldid'];
@@ -712,15 +754,15 @@ class RecentChange {
$url .= $query;
}
- if( $this->mAttribs['rc_old_len'] !== null && $this->mAttribs['rc_new_len'] !== null ) {
+ if ( $this->mAttribs['rc_old_len'] !== null && $this->mAttribs['rc_new_len'] !== null ) {
$szdiff = $this->mAttribs['rc_new_len'] - $this->mAttribs['rc_old_len'];
- if($szdiff < -500) {
+ if ( $szdiff < -500 ) {
$szdiff = "\002$szdiff\002";
- } elseif($szdiff >= 0) {
- $szdiff = '+' . $szdiff ;
+ } elseif ( $szdiff >= 0 ) {
+ $szdiff = '+' . $szdiff;
}
// @todo i18n with parentheses in content language?
- $szdiff = '(' . $szdiff . ')' ;
+ $szdiff = '(' . $szdiff . ')';
} else {
$szdiff = '';
}
@@ -756,7 +798,7 @@ class RecentChange {
# see http://www.irssi.org/documentation/formats for some colour codes. prefix is \003,
# no colour (\003) switches back to the term default
$fullString = "$titleString\0034 $flag\00310 " .
- "\00302$url\003 \0035*\003 \00303$user\003 \0035*\003 $szdiff \00310$comment\003\n";
+ "\00302$url\003 \0035*\003 \00303$user\003 \0035*\003 $szdiff \00310$comment\003\n";
return $fullString;
}
@@ -769,13 +811,13 @@ class RecentChange {
* @return string
*/
public function getCharacterDifference( $old = 0, $new = 0 ) {
- if( $old === 0 ) {
+ if ( $old === 0 ) {
$old = $this->mAttribs['rc_old_len'];
}
- if( $new === 0 ) {
+ if ( $new === 0 ) {
$new = $this->mAttribs['rc_new_len'];
}
- if( $old === null || $new === null ) {
+ if ( $old === null || $new === null ) {
return '';
}
return ChangesList::showCharacterDifference( $old, $new );
@@ -789,8 +831,9 @@ class RecentChange {
}
} else {
$ip = $wgRequest->getIP();
- if( !$ip )
+ if ( !$ip ) {
$ip = '';
+ }
}
return $ip;
}
diff --git a/includes/Revision.php b/includes/Revision.php
index 20cc8f58..2b34984b 100644
--- a/includes/Revision.php
+++ b/includes/Revision.php
@@ -25,6 +25,10 @@
*/
class Revision implements IDBAccessObject {
protected $mId;
+
+ /**
+ * @var int|null
+ */
protected $mPage;
protected $mUserText;
protected $mOrigUserText;
@@ -38,8 +42,24 @@ class Revision implements IDBAccessObject {
protected $mComment;
protected $mText;
protected $mTextRow;
+
+ /**
+ * @var null|Title
+ */
protected $mTitle;
protected $mCurrent;
+ protected $mContentModel;
+ protected $mContentFormat;
+
+ /**
+ * @var Content|null|bool
+ */
+ protected $mContent;
+
+ /**
+ * @var null|ContentHandler
+ */
+ protected $mContentHandler;
// Revision deletion constants
const DELETED_TEXT = 1;
@@ -83,7 +103,7 @@ class Revision implements IDBAccessObject {
* @param $flags Integer Bitfield (optional)
* @return Revision or null
*/
- public static function newFromTitle( $title, $id = 0, $flags = null ) {
+ public static function newFromTitle( $title, $id = 0, $flags = 0 ) {
$conds = array(
'page_namespace' => $title->getNamespace(),
'page_title' => $title->getDBkey()
@@ -94,8 +114,6 @@ class Revision implements IDBAccessObject {
} else {
// Use a join to get the latest revision
$conds[] = 'rev_id=page_latest';
- // Callers assume this will be up-to-date
- $flags = is_int( $flags ) ? $flags : self::READ_LATEST; // b/c
}
return self::newFromConds( $conds, (int)$flags );
}
@@ -106,7 +124,7 @@ class Revision implements IDBAccessObject {
* Returns null if no such revision can be found.
*
* $flags include:
- * Revision::READ_LATEST : Select the data from the master
+ * Revision::READ_LATEST : Select the data from the master (since 1.20)
* Revision::READ_LOCKING : Select & lock the data from the master
*
* @param $revId Integer
@@ -114,15 +132,13 @@ class Revision implements IDBAccessObject {
* @param $flags Integer Bitfield (optional)
* @return Revision or null
*/
- public static function newFromPageId( $pageId, $revId = 0, $flags = null ) {
+ public static function newFromPageId( $pageId, $revId = 0, $flags = 0 ) {
$conds = array( 'page_id' => $pageId );
if ( $revId ) {
$conds['rev_id'] = $revId;
} else {
// Use a join to get the latest revision
$conds[] = 'rev_id = page_latest';
- // Callers assume this will be up-to-date
- $flags = is_int( $flags ) ? $flags : self::READ_LATEST; // b/c
}
return self::newFromConds( $conds, (int)$flags );
}
@@ -135,9 +151,12 @@ class Revision implements IDBAccessObject {
* @param $row
* @param $overrides array
*
+ * @throws MWException
* @return Revision
*/
public static function newFromArchiveRow( $row, $overrides = array() ) {
+ global $wgContentHandlerUseDB;
+
$attribs = $overrides + array(
'page' => isset( $row->ar_page_id ) ? $row->ar_page_id : null,
'id' => isset( $row->ar_rev_id ) ? $row->ar_rev_id : null,
@@ -150,7 +169,22 @@ class Revision implements IDBAccessObject {
'deleted' => $row->ar_deleted,
'len' => $row->ar_len,
'sha1' => isset( $row->ar_sha1 ) ? $row->ar_sha1 : null,
+ 'content_model' => isset( $row->ar_content_model ) ? $row->ar_content_model : null,
+ 'content_format' => isset( $row->ar_content_format ) ? $row->ar_content_format : null,
);
+
+ if ( !$wgContentHandlerUseDB ) {
+ unset( $attribs['content_model'] );
+ unset( $attribs['content_format'] );
+ }
+
+ if ( !isset( $attribs['title'] )
+ && isset( $row->ar_namespace )
+ && isset( $row->ar_title ) ) {
+
+ $attribs['title'] = Title::makeTitle( $row->ar_namespace, $row->ar_title );
+ }
+
if ( isset( $row->ar_text ) && !$row->ar_text_id ) {
// Pre-1.5 ar_text row
$attribs['text'] = self::getRevisionText( $row, 'ar_' );
@@ -220,9 +254,11 @@ class Revision implements IDBAccessObject {
$matchId = 'page_latest';
}
return self::loadFromConds( $db,
- array( "rev_id=$matchId",
- 'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey() )
+ array(
+ "rev_id=$matchId",
+ 'page_namespace' => $title->getNamespace(),
+ 'page_title' => $title->getDBkey()
+ )
);
}
@@ -238,9 +274,11 @@ class Revision implements IDBAccessObject {
*/
public static function loadFromTimestamp( $db, $title, $timestamp ) {
return self::loadFromConds( $db,
- array( 'rev_timestamp' => $db->timestamp( $timestamp ),
- 'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey() )
+ array(
+ 'rev_timestamp' => $db->timestamp( $timestamp ),
+ 'page_namespace' => $title->getNamespace(),
+ 'page_title' => $title->getDBkey()
+ )
);
}
@@ -296,9 +334,11 @@ class Revision implements IDBAccessObject {
public static function fetchRevision( $title ) {
return self::fetchFromConds(
wfGetDB( DB_SLAVE ),
- array( 'rev_id=page_latest',
- 'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey() )
+ array(
+ 'rev_id=page_latest',
+ 'page_namespace' => $title->getNamespace(),
+ 'page_title' => $title->getDBkey()
+ )
);
}
@@ -343,7 +383,7 @@ class Revision implements IDBAccessObject {
}
/**
- * Return the value of a select() page conds array for the paeg table.
+ * Return the value of a select() page conds array for the page table.
* This will assure that the revision(s) are not orphaned from live pages.
* @since 1.19
* @return Array
@@ -358,7 +398,9 @@ class Revision implements IDBAccessObject {
* @return array
*/
public static function selectFields() {
- return array(
+ global $wgContentHandlerUseDB;
+
+ $fields = array(
'rev_id',
'rev_page',
'rev_text_id',
@@ -370,8 +412,15 @@ class Revision implements IDBAccessObject {
'rev_deleted',
'rev_len',
'rev_parent_id',
- 'rev_sha1'
+ 'rev_sha1',
);
+
+ if ( $wgContentHandlerUseDB ) {
+ $fields[] = 'rev_content_format';
+ $fields[] = 'rev_content_model';
+ }
+
+ return $fields;
}
/**
@@ -436,6 +485,7 @@ class Revision implements IDBAccessObject {
* Constructor
*
* @param $row Mixed: either a database row or an array
+ * @throws MWException
* @access private
*/
function __construct( $row ) {
@@ -449,13 +499,13 @@ class Revision implements IDBAccessObject {
$this->mTimestamp = $row->rev_timestamp;
$this->mDeleted = intval( $row->rev_deleted );
- if( !isset( $row->rev_parent_id ) ) {
- $this->mParentId = is_null( $row->rev_parent_id ) ? null : 0;
+ if ( !isset( $row->rev_parent_id ) ) {
+ $this->mParentId = null;
} else {
- $this->mParentId = intval( $row->rev_parent_id );
+ $this->mParentId = intval( $row->rev_parent_id );
}
- if( !isset( $row->rev_len ) || is_null( $row->rev_len ) ) {
+ if ( !isset( $row->rev_len ) ) {
$this->mSize = null;
} else {
$this->mSize = intval( $row->rev_len );
@@ -475,8 +525,20 @@ class Revision implements IDBAccessObject {
$this->mTitle = null;
}
+ if( !isset( $row->rev_content_model ) || is_null( $row->rev_content_model ) ) {
+ $this->mContentModel = null; # determine on demand if needed
+ } else {
+ $this->mContentModel = strval( $row->rev_content_model );
+ }
+
+ if( !isset( $row->rev_content_format ) || is_null( $row->rev_content_format ) ) {
+ $this->mContentFormat = null; # determine on demand if needed
+ } else {
+ $this->mContentFormat = strval( $row->rev_content_format );
+ }
+
// Lazy extraction...
- $this->mText = null;
+ $this->mText = null;
if( isset( $row->old_text ) ) {
$this->mTextRow = $row;
} else {
@@ -496,6 +558,20 @@ class Revision implements IDBAccessObject {
// Build a new revision to be saved...
global $wgUser; // ugh
+ # if we have a content object, use it to set the model and type
+ if ( !empty( $row['content'] ) ) {
+ //@todo: when is that set? test with external store setup! check out insertOn() [dk]
+ if ( !empty( $row['text_id'] ) ) {
+ throw new MWException( "Text already stored in external store (id {$row['text_id']}), " .
+ "can't serialize content object" );
+ }
+
+ $row['content_model'] = $row['content']->getModel();
+ # note: mContentFormat is initializes later accordingly
+ # note: content is serialized later in this method!
+ # also set text to null?
+ }
+
$this->mId = isset( $row['id'] ) ? intval( $row['id'] ) : null;
$this->mPage = isset( $row['page'] ) ? intval( $row['page'] ) : null;
$this->mTextId = isset( $row['text_id'] ) ? intval( $row['text_id'] ) : null;
@@ -508,21 +584,67 @@ class Revision implements IDBAccessObject {
$this->mParentId = isset( $row['parent_id'] ) ? intval( $row['parent_id'] ) : null;
$this->mSha1 = isset( $row['sha1'] ) ? strval( $row['sha1'] ) : null;
+ $this->mContentModel = isset( $row['content_model'] ) ? strval( $row['content_model'] ) : null;
+ $this->mContentFormat = isset( $row['content_format'] ) ? strval( $row['content_format'] ) : null;
+
// Enforce spacing trimming on supplied text
$this->mComment = isset( $row['comment'] ) ? trim( strval( $row['comment'] ) ) : null;
$this->mText = isset( $row['text'] ) ? rtrim( strval( $row['text'] ) ) : null;
$this->mTextRow = null;
- $this->mTitle = null; # Load on demand if needed
- $this->mCurrent = false;
- # If we still have no length, see it we have the text to figure it out
+ $this->mTitle = isset( $row['title'] ) ? $row['title'] : null;
+
+ // if we have a Content object, override mText and mContentModel
+ if ( !empty( $row['content'] ) ) {
+ if ( !( $row['content'] instanceof Content ) ) {
+ throw new MWException( '`content` field must contain a Content object.' );
+ }
+
+ $handler = $this->getContentHandler();
+ $this->mContent = $row['content'];
+
+ $this->mContentModel = $this->mContent->getModel();
+ $this->mContentHandler = null;
+
+ $this->mText = $handler->serializeContent( $row['content'], $this->getContentFormat() );
+ } elseif ( !is_null( $this->mText ) ) {
+ $handler = $this->getContentHandler();
+ $this->mContent = $handler->unserializeContent( $this->mText );
+ }
+
+ // If we have a Title object, make sure it is consistent with mPage.
+ if ( $this->mTitle && $this->mTitle->exists() ) {
+ if ( $this->mPage === null ) {
+ // if the page ID wasn't known, set it now
+ $this->mPage = $this->mTitle->getArticleID();
+ } elseif ( $this->mTitle->getArticleID() !== $this->mPage ) {
+ // Got different page IDs. This may be legit (e.g. during undeletion),
+ // but it seems worth mentioning it in the log.
+ wfDebug( "Page ID " . $this->mPage . " mismatches the ID " .
+ $this->mTitle->getArticleID() . " provided by the Title object." );
+ }
+ }
+
+ $this->mCurrent = false;
+
+ // If we still have no length, see it we have the text to figure it out
if ( !$this->mSize ) {
- $this->mSize = is_null( $this->mText ) ? null : strlen( $this->mText );
+ if ( !is_null( $this->mContent ) ) {
+ $this->mSize = $this->mContent->getSize();
+ } else {
+ #NOTE: this should never happen if we have either text or content object!
+ $this->mSize = null;
+ }
}
- # Same for sha1
+
+ // Same for sha1
if ( $this->mSha1 === null ) {
$this->mSha1 = is_null( $this->mText ) ? null : self::base36Sha1( $this->mText );
}
+
+ // force lazy init
+ $this->getContentModel();
+ $this->getContentFormat();
} else {
throw new MWException( 'Revision constructor passed invalid row format.' );
}
@@ -595,18 +717,23 @@ class Revision implements IDBAccessObject {
if( isset( $this->mTitle ) ) {
return $this->mTitle;
}
- if( !is_null( $this->mId ) ) { //rev_id is defined as NOT NULL
+ if( !is_null( $this->mId ) ) { //rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
$dbr = wfGetDB( DB_SLAVE );
$row = $dbr->selectRow(
array( 'page', 'revision' ),
self::selectPageFields(),
array( 'page_id=rev_page',
- 'rev_id' => $this->mId ),
+ 'rev_id' => $this->mId ),
__METHOD__ );
if ( $row ) {
$this->mTitle = Title::newFromRow( $row );
}
}
+
+ if ( !$this->mTitle && !is_null( $this->mPage ) && $this->mPage > 0 ) {
+ $this->mTitle = Title::newFromID( $this->mPage );
+ }
+
return $this->mTitle;
}
@@ -761,7 +888,7 @@ class Revision implements IDBAccessObject {
}
/**
- * @param $field int one of DELETED_* bitfield constants
+ * @param int $field one of DELETED_* bitfield constants
*
* @return Boolean
*/
@@ -789,15 +916,39 @@ class Revision implements IDBAccessObject {
* Revision::RAW get the text regardless of permissions
* @param $user User object to check for, only if FOR_THIS_USER is passed
* to the $audience parameter
+ *
+ * @deprecated in 1.21, use getContent() instead
+ * @todo: replace usage in core
* @return String
*/
public function getText( $audience = self::FOR_PUBLIC, User $user = null ) {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ $content = $this->getContent( $audience, $user );
+ return ContentHandler::getContentText( $content ); # returns the raw content text, if applicable
+ }
+
+ /**
+ * Fetch revision content if it's available to the specified audience.
+ * If the specified audience does not have the ability to view this
+ * revision, null will be returned.
+ *
+ * @param $audience Integer: one of:
+ * Revision::FOR_PUBLIC to be displayed to all users
+ * Revision::FOR_THIS_USER to be displayed to $wgUser
+ * Revision::RAW get the text regardless of permissions
+ * @param $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
+ * @since 1.21
+ * @return Content|null
+ */
+ public function getContent( $audience = self::FOR_PUBLIC, User $user = null ) {
if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
- return '';
+ return null;
} elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT, $user ) ) {
- return '';
+ return null;
} else {
- return $this->getRawText();
+ return $this->getContentInternal();
}
}
@@ -816,16 +967,117 @@ class Revision implements IDBAccessObject {
* Fetch revision text without regard for view restrictions
*
* @return String
+ *
+ * @deprecated since 1.21. Instead, use Revision::getContent( Revision::RAW )
+ * or Revision::getSerializedData() as appropriate.
*/
public function getRawText() {
- if( is_null( $this->mText ) ) {
- // Revision text is immutable. Load on demand:
- $this->mText = $this->loadText();
- }
+ ContentHandler::deprecated( __METHOD__, "1.21" );
+ return $this->getText( self::RAW );
+ }
+
+ /**
+ * Fetch original serialized data without regard for view restrictions
+ *
+ * @since 1.21
+ * @return String
+ */
+ public function getSerializedData() {
return $this->mText;
}
/**
+ * Gets the content object for the revision (or null on failure).
+ *
+ * Note that for mutable Content objects, each call to this method will return a
+ * fresh clone.
+ *
+ * @since 1.21
+ * @return Content|null the Revision's content, or null on failure.
+ */
+ protected function getContentInternal() {
+ if( is_null( $this->mContent ) ) {
+ // Revision is immutable. Load on demand:
+ if( is_null( $this->mText ) ) {
+ $this->mText = $this->loadText();
+ }
+
+ if ( $this->mText !== null && $this->mText !== false ) {
+ // Unserialize content
+ $handler = $this->getContentHandler();
+ $format = $this->getContentFormat();
+
+ $this->mContent = $handler->unserializeContent( $this->mText, $format );
+ } else {
+ $this->mContent = false; // negative caching!
+ }
+ }
+
+ // NOTE: copy() will return $this for immutable content objects
+ return $this->mContent ? $this->mContent->copy() : null;
+ }
+
+ /**
+ * Returns the content model for this revision.
+ *
+ * If no content model was stored in the database, $this->getTitle()->getContentModel() is
+ * used to determine the content model to use. If no title is know, CONTENT_MODEL_WIKITEXT
+ * is used as a last resort.
+ *
+ * @return String the content model id associated with this revision, see the CONTENT_MODEL_XXX constants.
+ **/
+ public function getContentModel() {
+ if ( !$this->mContentModel ) {
+ $title = $this->getTitle();
+ $this->mContentModel = ( $title ? $title->getContentModel() : CONTENT_MODEL_WIKITEXT );
+
+ assert( !empty( $this->mContentModel ) );
+ }
+
+ return $this->mContentModel;
+ }
+
+ /**
+ * Returns the content format for this revision.
+ *
+ * If no content format was stored in the database, the default format for this
+ * revision's content model is returned.
+ *
+ * @return String the content format id associated with this revision, see the CONTENT_FORMAT_XXX constants.
+ **/
+ public function getContentFormat() {
+ if ( !$this->mContentFormat ) {
+ $handler = $this->getContentHandler();
+ $this->mContentFormat = $handler->getDefaultFormat();
+
+ assert( !empty( $this->mContentFormat ) );
+ }
+
+ return $this->mContentFormat;
+ }
+
+ /**
+ * Returns the content handler appropriate for this revision's content model.
+ *
+ * @throws MWException
+ * @return ContentHandler
+ */
+ public function getContentHandler() {
+ if ( !$this->mContentHandler ) {
+ $model = $this->getContentModel();
+ $this->mContentHandler = ContentHandler::getForModelID( $model );
+
+ $format = $this->getContentFormat();
+
+ if ( !$this->mContentHandler->isSupportedFormat( $format ) ) {
+ throw new MWException( "Oops, the content format $format is not supported for this content model, $model" );
+ }
+ }
+
+ return $this->mContentHandler;
+ }
+
+ /**
* @return String
*/
public function getTimestamp() {
@@ -842,7 +1094,7 @@ class Revision implements IDBAccessObject {
/**
* Get previous revision for this title
*
- * @return Revision or null
+ * @return Revision|null
*/
public function getPrevious() {
if( $this->getTitle() ) {
@@ -900,10 +1152,14 @@ class Revision implements IDBAccessObject {
* field must be included
*
* @param $row Object: the text data
- * @param $prefix String: table prefix (default 'old_')
+ * @param string $prefix table prefix (default 'old_')
+ * @param string|false $wiki the name of the wiki to load the revision text from
+ * (same as the the wiki $row was loaded from) or false to indicate the local
+ * wiki (this is the default). Otherwise, it must be a symbolic wiki database
+ * identifier as understood by the LoadBalancer class.
* @return String: text the text requested or false on failure
*/
- public static function getRevisionText( $row, $prefix = 'old_' ) {
+ public static function getRevisionText( $row, $prefix = 'old_', $wiki = false ) {
wfProfileIn( __METHOD__ );
# Get data
@@ -931,7 +1187,7 @@ class Revision implements IDBAccessObject {
wfProfileOut( __METHOD__ );
return false;
}
- $text = ExternalStore::fetchFromURL( $url );
+ $text = ExternalStore::fetchFromURL( $url, array( 'wiki' => $wiki ) );
}
// If the text was fetched without an error, convert it
@@ -1004,13 +1260,16 @@ class Revision implements IDBAccessObject {
* number on success and dies horribly on failure.
*
* @param $dbw DatabaseBase: (master connection)
+ * @throws MWException
* @return Integer
*/
public function insertOn( $dbw ) {
- global $wgDefaultExternalStore;
+ global $wgDefaultExternalStore, $wgContentHandlerUseDB;
wfProfileIn( __METHOD__ );
+ $this->checkContentModel();
+
$data = $this->mText;
$flags = self::compressRevisionText( $data );
@@ -1046,27 +1305,47 @@ class Revision implements IDBAccessObject {
$rev_id = isset( $this->mId )
? $this->mId
: $dbw->nextSequenceValue( 'revision_rev_id_seq' );
- $dbw->insert( 'revision',
- array(
- 'rev_id' => $rev_id,
- 'rev_page' => $this->mPage,
- 'rev_text_id' => $this->mTextId,
- 'rev_comment' => $this->mComment,
- 'rev_minor_edit' => $this->mMinorEdit ? 1 : 0,
- 'rev_user' => $this->mUser,
- 'rev_user_text' => $this->mUserText,
- 'rev_timestamp' => $dbw->timestamp( $this->mTimestamp ),
- 'rev_deleted' => $this->mDeleted,
- 'rev_len' => $this->mSize,
- 'rev_parent_id' => is_null( $this->mParentId )
- ? $this->getPreviousRevisionId( $dbw )
- : $this->mParentId,
- 'rev_sha1' => is_null( $this->mSha1 )
- ? self::base36Sha1( $this->mText )
- : $this->mSha1
- ), __METHOD__
+ $row = array(
+ 'rev_id' => $rev_id,
+ 'rev_page' => $this->mPage,
+ 'rev_text_id' => $this->mTextId,
+ 'rev_comment' => $this->mComment,
+ 'rev_minor_edit' => $this->mMinorEdit ? 1 : 0,
+ 'rev_user' => $this->mUser,
+ 'rev_user_text' => $this->mUserText,
+ 'rev_timestamp' => $dbw->timestamp( $this->mTimestamp ),
+ 'rev_deleted' => $this->mDeleted,
+ 'rev_len' => $this->mSize,
+ 'rev_parent_id' => is_null( $this->mParentId )
+ ? $this->getPreviousRevisionId( $dbw )
+ : $this->mParentId,
+ 'rev_sha1' => is_null( $this->mSha1 )
+ ? Revision::base36Sha1( $this->mText )
+ : $this->mSha1,
);
+ if ( $wgContentHandlerUseDB ) {
+ //NOTE: Store null for the default model and format, to save space.
+ //XXX: Makes the DB sensitive to changed defaults. Make this behavior optional? Only in miser mode?
+
+ $model = $this->getContentModel();
+ $format = $this->getContentFormat();
+
+ $title = $this->getTitle();
+
+ if ( $title === null ) {
+ throw new MWException( "Insufficient information to determine the title of the revision's page!" );
+ }
+
+ $defaultModel = ContentHandler::getDefaultModelFor( $title );
+ $defaultFormat = ContentHandler::getForModelID( $defaultModel )->getDefaultFormat();
+
+ $row[ 'rev_content_model' ] = ( $model === $defaultModel ) ? null : $model;
+ $row[ 'rev_content_format' ] = ( $format === $defaultFormat ) ? null : $format;
+ }
+
+ $dbw->insert( 'revision', $row, __METHOD__ );
+
$this->mId = !is_null( $rev_id ) ? $rev_id : $dbw->insertId();
wfRunHooks( 'RevisionInsertComplete', array( &$this, $data, $flags ) );
@@ -1075,6 +1354,52 @@ class Revision implements IDBAccessObject {
return $this->mId;
}
+ protected function checkContentModel() {
+ global $wgContentHandlerUseDB;
+
+ $title = $this->getTitle(); //note: may return null for revisions that have not yet been inserted.
+
+ $model = $this->getContentModel();
+ $format = $this->getContentFormat();
+ $handler = $this->getContentHandler();
+
+ if ( !$handler->isSupportedFormat( $format ) ) {
+ $t = $title->getPrefixedDBkey();
+
+ throw new MWException( "Can't use format $format with content model $model on $t" );
+ }
+
+ if ( !$wgContentHandlerUseDB && $title ) {
+ // if $wgContentHandlerUseDB is not set, all revisions must use the default content model and format.
+
+ $defaultModel = ContentHandler::getDefaultModelFor( $title );
+ $defaultHandler = ContentHandler::getForModelID( $defaultModel );
+ $defaultFormat = $defaultHandler->getDefaultFormat();
+
+ if ( $this->getContentModel() != $defaultModel ) {
+ $t = $title->getPrefixedDBkey();
+
+ throw new MWException( "Can't save non-default content model with \$wgContentHandlerUseDB disabled: "
+ . "model is $model , default for $t is $defaultModel" );
+ }
+
+ if ( $this->getContentFormat() != $defaultFormat ) {
+ $t = $title->getPrefixedDBkey();
+
+ throw new MWException( "Can't use non-default content format with \$wgContentHandlerUseDB disabled: "
+ . "format is $format, default for $t is $defaultFormat" );
+ }
+ }
+
+ $content = $this->getContent( Revision::RAW );
+
+ if ( !$content || !$content->isValid() ) {
+ $t = $title->getPrefixedDBkey();
+
+ throw new MWException( "Content of $t is not valid! Content model is $model" );
+ }
+ }
+
/**
* Get the base 36 SHA-1 value for a string of text
* @param $text String
@@ -1088,7 +1413,7 @@ class Revision implements IDBAccessObject {
* Lazy-load the revision's text.
* Currently hardcoded to the 'text' table storage engine.
*
- * @return String
+ * @return String|bool the revision's text, or false on failure
*/
protected function loadText() {
wfProfileIn( __METHOD__ );
@@ -1154,17 +1479,26 @@ class Revision implements IDBAccessObject {
*
* @param $dbw DatabaseBase
* @param $pageId Integer: ID number of the page to read from
- * @param $summary String: revision's summary
+ * @param string $summary revision's summary
* @param $minor Boolean: whether the revision should be considered as minor
* @return Revision|null on error
*/
public static function newNullRevision( $dbw, $pageId, $summary, $minor ) {
+ global $wgContentHandlerUseDB;
+
wfProfileIn( __METHOD__ );
+ $fields = array( 'page_latest', 'page_namespace', 'page_title',
+ 'rev_text_id', 'rev_len', 'rev_sha1' );
+
+ if ( $wgContentHandlerUseDB ) {
+ $fields[] = 'rev_content_model';
+ $fields[] = 'rev_content_format';
+ }
+
$current = $dbw->selectRow(
array( 'page', 'revision' ),
- array( 'page_latest', 'page_namespace', 'page_title',
- 'rev_text_id', 'rev_len', 'rev_sha1' ),
+ $fields,
array(
'page_id' => $pageId,
'page_latest=rev_id',
@@ -1172,7 +1506,7 @@ class Revision implements IDBAccessObject {
__METHOD__ );
if( $current ) {
- $revision = new Revision( array(
+ $row = array(
'page' => $pageId,
'comment' => $summary,
'minor_edit' => $minor,
@@ -1180,7 +1514,14 @@ class Revision implements IDBAccessObject {
'parent_id' => $current->page_latest,
'len' => $current->rev_len,
'sha1' => $current->rev_sha1
- ) );
+ );
+
+ if ( $wgContentHandlerUseDB ) {
+ $row[ 'content_model' ] = $current->rev_content_model;
+ $row[ 'content_format' ] = $current->rev_content_format;
+ }
+
+ $revision = new Revision( $row );
$revision->setTitle( Title::makeTitle( $current->page_namespace, $current->page_title ) );
} else {
$revision = null;
@@ -1245,7 +1586,7 @@ class Revision implements IDBAccessObject {
*/
static function getTimestampFromId( $title, $id ) {
$dbr = wfGetDB( DB_SLAVE );
- // Casting fix for DB2
+ // Casting fix for databases that can't take '' for rev_id
if ( $id == '' ) {
$id = 0;
}
@@ -1328,4 +1669,4 @@ class Revision implements IDBAccessObject {
}
return true;
}
-} \ No newline at end of file
+}
diff --git a/includes/RevisionList.php b/includes/RevisionList.php
index 3c5cfa8e..d87c540f 100644
--- a/includes/RevisionList.php
+++ b/includes/RevisionList.php
@@ -190,7 +190,7 @@ abstract class RevisionItemBase {
}
/**
- * Get the date, formatted in user's languae
+ * Get the date, formatted in user's language
* @return String
*/
public function formatDate() {
@@ -199,7 +199,7 @@ abstract class RevisionItemBase {
}
/**
- * Get the time, formatted in user's languae
+ * Get the time, formatted in user's language
* @return String
*/
public function formatTime() {
diff --git a/includes/Sanitizer.php b/includes/Sanitizer.php
index b443ce14..2dff081d 100644
--- a/includes/Sanitizer.php
+++ b/includes/Sanitizer.php
@@ -358,38 +358,48 @@ class Sanitizer {
* @private
* @param $text String
* @param $processCallback Callback to do any variable or parameter replacements in HTML attribute values
- * @param $args Array for the processing callback
- * @param $extratags Array for any extra tags to include
- * @param $removetags Array for any tags (default or extra) to exclude
+ * @param array $args for the processing callback
+ * @param array $extratags for any extra tags to include
+ * @param array $removetags for any tags (default or extra) to exclude
* @return string
*/
static function removeHTMLtags( $text, $processCallback = null, $args = array(), $extratags = array(), $removetags = array() ) {
- global $wgUseTidy;
+ global $wgUseTidy, $wgHtml5, $wgAllowMicrodataAttributes, $wgAllowImageTag;
static $htmlpairsStatic, $htmlsingle, $htmlsingleonly, $htmlnest, $tabletags,
$htmllist, $listtags, $htmlsingleallowed, $htmlelementsStatic, $staticInitialised;
wfProfileIn( __METHOD__ );
- if ( !$staticInitialised ) {
+ // Base our staticInitialised variable off of the global config state so that if the globals
+ // are changed (like in the screwed up test system) we will re-initialise the settings.
+ $globalContext = implode( '-', compact( 'wgHtml5', 'wgAllowMicrodataAttributes', 'wgAllowImageTag' ) );
+ if ( !$staticInitialised || $staticInitialised != $globalContext ) {
$htmlpairsStatic = array( # Tags that must be closed
'b', 'bdi', 'del', 'i', 'ins', 'u', 'font', 'big', 'small', 'sub', 'sup', 'h1',
'h2', 'h3', 'h4', 'h5', 'h6', 'cite', 'code', 'em', 's',
'strike', 'strong', 'tt', 'var', 'div', 'center',
'blockquote', 'ol', 'ul', 'dl', 'table', 'caption', 'pre',
- 'ruby', 'rt' , 'rb' , 'rp', 'p', 'span', 'abbr', 'dfn',
+ 'ruby', 'rt', 'rb', 'rp', 'p', 'span', 'abbr', 'dfn',
'kbd', 'samp'
);
+ if ( $wgHtml5 ) {
+ $htmlpairsStatic = array_merge( $htmlpairsStatic, array( 'data', 'time', 'mark' ) );
+ }
$htmlsingle = array(
'br', 'hr', 'li', 'dt', 'dd'
);
$htmlsingleonly = array( # Elements that cannot have close tags
'br', 'hr'
);
+ if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
+ $htmlsingle[] = $htmlsingleonly[] = 'meta';
+ $htmlsingle[] = $htmlsingleonly[] = 'link';
+ }
$htmlnest = array( # Tags that can be nested--??
'table', 'tr', 'td', 'th', 'div', 'blockquote', 'ol', 'ul',
- 'dl', 'font', 'big', 'small', 'sub', 'sup', 'span'
+ 'li', 'dl', 'dt', 'dd', 'font', 'big', 'small', 'sub', 'sup', 'span'
);
$tabletags = array( # Can only appear inside table, we will close them
'td', 'th', 'tr',
@@ -401,7 +411,6 @@ class Sanitizer {
'li',
);
- global $wgAllowImageTag;
if ( $wgAllowImageTag ) {
$htmlsingle[] = 'img';
$htmlsingleonly[] = 'img';
@@ -416,13 +425,13 @@ class Sanitizer {
foreach ( $vars as $var ) {
$$var = array_flip( $$var );
}
- $staticInitialised = true;
+ $staticInitialised = $globalContext;
}
# Populate $htmlpairs and $htmlelements with the $extratags and $removetags arrays
$extratags = array_flip( $extratags );
$removetags = array_flip( $removetags );
$htmlpairs = array_merge( $extratags, $htmlpairsStatic );
- $htmlelements = array_diff_key( array_merge( $extratags, $htmlelementsStatic ) , $removetags );
+ $htmlelements = array_diff_key( array_merge( $extratags, $htmlelementsStatic ), $removetags );
# Remove HTML comments
$text = Sanitizer::removeHTMLcomments( $text );
@@ -505,11 +514,15 @@ class Sanitizer {
isset( $htmlpairs[$t] ) ) {
$badtag = true;
} elseif ( isset( $htmlsingleonly[$t] ) ) {
- # Hack to force empty tag for uncloseable elements
+ # Hack to force empty tag for unclosable elements
$brace = '/>';
} elseif ( isset( $htmlsingle[$t] ) ) {
# Hack to not close $htmlsingle tags
$brace = null;
+ # Still need to push this optionally-closed tag to
+ # the tag stack so that we can match end tags
+ # instead of marking them as bad.
+ array_push( $tagstack, $t );
} elseif ( isset( $tabletags[$t] )
&& in_array( $t, $tagstack ) ) {
// New table tag but forgot to close the previous one
@@ -528,6 +541,10 @@ class Sanitizer {
call_user_func_array( $processCallback, array( &$params, $args ) );
}
+ if ( !Sanitizer::validateTag( $params, $t ) ) {
+ $badtag = true;
+ }
+
# Strip non-approved attributes from the tag
$newparams = Sanitizer::fixTagAttributes( $params, $t );
}
@@ -551,16 +568,24 @@ class Sanitizer {
preg_match( '/^(\\/?)(\\w+)([^>]*?)(\\/{0,1}>)([^<]*)$/',
$x, $regs );
@list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
+ $badtag = false;
if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
if( is_callable( $processCallback ) ) {
call_user_func_array( $processCallback, array( &$params, $args ) );
}
+
+ if ( !Sanitizer::validateTag( $params, $t ) ) {
+ $badtag = true;
+ }
+
$newparams = Sanitizer::fixTagAttributes( $params, $t );
- $rest = str_replace( '>', '&gt;', $rest );
- $text .= "<$slash$t$newparams$brace$rest";
- } else {
- $text .= '&lt;' . str_replace( '>', '&gt;', $x);
+ if ( !$badtag ) {
+ $rest = str_replace( '>', '&gt;', $rest );
+ $text .= "<$slash$t$newparams$brace$rest";
+ continue;
+ }
}
+ $text .= '&lt;' . str_replace( '>', '&gt;', $x);
}
}
wfProfileOut( __METHOD__ );
@@ -579,9 +604,9 @@ class Sanitizer {
*/
static function removeHTMLcomments( $text ) {
wfProfileIn( __METHOD__ );
- while (($start = strpos($text, '<!--')) !== false) {
- $end = strpos($text, '-->', $start + 4);
- if ($end === false) {
+ while ( ($start = strpos( $text, '<!--' ) ) !== false ) {
+ $end = strpos( $text, '-->', $start + 4 );
+ if ( $end === false ) {
# Unterminated comment; bail out
break;
}
@@ -590,22 +615,22 @@ class Sanitizer {
# Trim space and newline if the comment is both
# preceded and followed by a newline
- $spaceStart = max($start - 1, 0);
+ $spaceStart = max( $start - 1, 0 );
$spaceLen = $end - $spaceStart;
- while (substr($text, $spaceStart, 1) === ' ' && $spaceStart > 0) {
+ while ( substr( $text, $spaceStart, 1 ) === ' ' && $spaceStart > 0 ) {
$spaceStart--;
$spaceLen++;
}
- while (substr($text, $spaceStart + $spaceLen, 1) === ' ')
+ while ( substr( $text, $spaceStart + $spaceLen, 1 ) === ' ' )
$spaceLen++;
- if (substr($text, $spaceStart, 1) === "\n" and substr($text, $spaceStart + $spaceLen, 1) === "\n") {
+ if ( substr( $text, $spaceStart, 1 ) === "\n" and substr( $text, $spaceStart + $spaceLen, 1 ) === "\n" ) {
# Remove the comment, leading and trailing
# spaces, and leave only one newline.
- $text = substr_replace($text, "\n", $spaceStart, $spaceLen + 1);
+ $text = substr_replace( $text, "\n", $spaceStart, $spaceLen + 1 );
}
else {
# Remove just the comment.
- $text = substr_replace($text, '', $start, $end - $start);
+ $text = substr_replace( $text, '', $start, $end - $start );
}
}
wfProfileOut( __METHOD__ );
@@ -613,12 +638,45 @@ class Sanitizer {
}
/**
+ * Takes attribute names and values for a tag and the tag name and
+ * validates that the tag is allowed to be present.
+ * This DOES NOT validate the attributes, nor does it validate the
+ * tags themselves. This method only handles the special circumstances
+ * where we may want to allow a tag within content but ONLY when it has
+ * specific attributes set.
+ *
+ * @param $params
+ * @param $element
+ * @return bool
+ */
+ static function validateTag( $params, $element ) {
+ $params = Sanitizer::decodeTagAttributes( $params );
+
+ if ( $element == 'meta' || $element == 'link' ) {
+ if ( !isset( $params['itemprop'] ) ) {
+ // <meta> and <link> must have an itemprop="" otherwise they are not valid or safe in content
+ return false;
+ }
+ if ( $element == 'meta' && !isset( $params['content'] ) ) {
+ // <meta> must have a content="" for the itemprop
+ return false;
+ }
+ if ( $element == 'link' && !isset( $params['href'] ) ) {
+ // <link> must have an associated href=""
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
* Take an array of attribute names and values and normalize or discard
* illegal values for the given element type.
*
* - Discards attributes not on a whitelist for the given element
* - Unsafe style attributes are discarded
- * - Invalid id attributes are reencoded
+ * - Invalid id attributes are re-encoded
*
* @param $attribs Array
* @param $element String
@@ -638,10 +696,10 @@ class Sanitizer {
*
* - Discards attributes not the given whitelist
* - Unsafe style attributes are discarded
- * - Invalid id attributes are reencoded
+ * - Invalid id attributes are re-encoded
*
* @param $attribs Array
- * @param $whitelist Array: list of allowed attribute names
+ * @param array $whitelist list of allowed attribute names
* @return Array
*
* @todo Check for legal values where the DTD limits things.
@@ -679,6 +737,16 @@ class Sanitizer {
$value = Sanitizer::escapeId( $value, 'noninitial' );
}
+ # WAI-ARIA
+ # http://www.w3.org/TR/wai-aria/
+ # http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#wai-aria
+ # For now we only support role="presentation" until we work out what roles should be
+ # usable by content and we ensure that our code explicitly rejects patterns that
+ # violate HTML5's ARIA restrictions.
+ if ( $attribute === 'role' && $value !== 'presentation' ) {
+ continue;
+ }
+
//RDFa and microdata properties allow URLs, URIs and/or CURIs. check them for sanity
if ( $attribute === 'rel' || $attribute === 'rev' ||
$attribute === 'about' || $attribute === 'property' || $attribute === 'resource' || #RDFa
@@ -713,7 +781,7 @@ class Sanitizer {
unset( $out['itemid'] );
unset( $out['itemref'] );
}
- # TODO: Strip itemprop if we aren't descendants of an itemscope.
+ # TODO: Strip itemprop if we aren't descendants of an itemscope or pointed to by an itemref.
}
return $out;
}
@@ -804,7 +872,7 @@ class Sanitizer {
// Reject problematic keywords and control characters
if ( preg_match( '/[\000-\010\016-\037\177]/', $value ) ) {
return '/* invalid control char */';
- } elseif ( preg_match( '! expression | filter\s*: | accelerator\s*: | url\s*\( !ix', $value ) ) {
+ } elseif ( preg_match( '! expression | filter\s*: | accelerator\s*: | url\s*\( | image\s*\( | image-set\s*\( !ix', $value ) ) {
return '/* insecure input */';
}
return $value;
@@ -945,7 +1013,7 @@ class Sanitizer {
* @see http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-id-attribute
* HTML5 definition of id attribute
*
- * @param $id String: id to escape
+ * @param string $id id to escape
* @param $options Mixed: string or array of strings (default is array()):
* 'noninitial': This is a non-initial fragment of an id, not a full id,
* so don't pay attention if the first character isn't valid at the
@@ -982,7 +1050,7 @@ class Sanitizer {
$id = str_replace( array_keys( $replace ), array_values( $replace ), $id );
if ( !preg_match( '/^[a-zA-Z]/', $id )
- && !in_array( 'noninitial', $options ) ) {
+ && !in_array( 'noninitial', $options ) ) {
// Initial character must be a letter!
$id = "x$id";
}
@@ -1002,17 +1070,17 @@ class Sanitizer {
*/
static function escapeClass( $class ) {
// Convert ugly stuff to underscores and kill underscores in ugly places
- return rtrim(preg_replace(
- array('/(^[0-9\\-])|[\\x00-\\x20!"#$%&\'()*+,.\\/:;<=>?@[\\]^`{|}~]|\\xC2\\xA0/','/_+/'),
+ return rtrim( preg_replace(
+ array( '/(^[0-9\\-])|[\\x00-\\x20!"#$%&\'()*+,.\\/:;<=>?@[\\]^`{|}~]|\\xC2\\xA0/', '/_+/' ),
'_',
- $class ), '_');
+ $class ), '_' );
}
/**
- * Given HTML input, escape with htmlspecialchars but un-escape entites.
+ * Given HTML input, escape with htmlspecialchars but un-escape entities.
* This allows (generally harmless) entities like &#160; to survive.
*
- * @param $html String to escape
+ * @param string $html to escape
* @return String: escaped input
*/
static function escapeHtmlAllowEntities( $html ) {
@@ -1074,6 +1142,7 @@ class Sanitizer {
* attribs regex matches.
*
* @param $set Array
+ * @throws MWException
* @return String
*/
private static function getTagAttributeCallback( $set ) {
@@ -1169,7 +1238,7 @@ class Sanitizer {
$ret = Sanitizer::normalizeEntity( $matches[1] );
} elseif( $matches[2] != '' ) {
$ret = Sanitizer::decCharReference( $matches[2] );
- } elseif( $matches[3] != '' ) {
+ } elseif( $matches[3] != '' ) {
$ret = Sanitizer::hexCharReference( $matches[3] );
}
if( is_null( $ret ) ) {
@@ -1263,7 +1332,7 @@ class Sanitizer {
* This is useful for page titles, not for text to be displayed,
* MediaWiki allows HTML entities to escape normalization as a feature.
*
- * @param $text String (already normalized, containing entities)
+ * @param string $text (already normalized, containing entities)
* @return String (still normalized, without entities)
*/
public static function decodeCharReferencesAndNormalize( $text ) {
@@ -1289,7 +1358,7 @@ class Sanitizer {
return Sanitizer::decodeEntity( $matches[1] );
} elseif( $matches[2] != '' ) {
return Sanitizer::decodeChar( intval( $matches[2] ) );
- } elseif( $matches[3] != '' ) {
+ } elseif( $matches[3] != '' ) {
return Sanitizer::decodeChar( hexdec( $matches[3] ) );
}
# Last case should be an ampersand by itself
@@ -1337,10 +1406,7 @@ class Sanitizer {
* @return Array
*/
static function attributeWhitelist( $element ) {
- static $list;
- if( !isset( $list ) ) {
- $list = Sanitizer::setupAttributeWhitelist();
- }
+ $list = Sanitizer::setupAttributeWhitelist();
return isset( $list[$element] )
? $list[$element]
: array();
@@ -1354,7 +1420,25 @@ class Sanitizer {
static function setupAttributeWhitelist() {
global $wgAllowRdfaAttributes, $wgHtml5, $wgAllowMicrodataAttributes;
- $common = array( 'id', 'class', 'lang', 'dir', 'title', 'style' );
+ static $whitelist, $staticInitialised;
+ $globalContext = implode( '-', compact( 'wgAllowRdfaAttributes', 'wgHtml5', 'wgAllowMicrodataAttributes' ) );
+
+ if ( isset( $whitelist ) && $staticInitialised == $globalContext ) {
+ return $whitelist;
+ }
+
+ $common = array(
+ # HTML
+ 'id',
+ 'class',
+ 'style',
+ 'lang',
+ 'dir',
+ 'title',
+
+ # WAI-ARIA
+ 'role',
+ );
if ( $wgAllowRdfaAttributes ) {
#RDFa attributes as specified in section 9 of http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014
@@ -1364,7 +1448,7 @@ class Sanitizer {
}
if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
- # add HTML5 microdata tages as pecified by http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html#the-microdata-model
+ # add HTML5 microdata tags as specified by http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html#the-microdata-model
$common = array_merge( $common, array(
'itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype'
) );
@@ -1386,7 +1470,7 @@ class Sanitizer {
# Numbers refer to sections in HTML 4.01 standard describing the element.
# See: http://www.w3.org/TR/html4/
- $whitelist = array (
+ $whitelist = array(
# 7.5.4
'div' => $block,
'center' => $common, # deprecated
@@ -1518,7 +1602,28 @@ class Sanitizer {
# HTML 5 section 4.6
'bdi' => $common,
+ );
+
+ if ( $wgHtml5 ) {
+ # HTML5 elements, defined by:
+ # http://www.whatwg.org/specs/web-apps/current-work/multipage/
+ $whitelist += array(
+ 'data' => array_merge( $common, array( 'value' ) ),
+ 'time' => array_merge( $common, array( 'datetime' ) ),
+ 'mark' => $common,
+
+ // meta and link are only permitted by removeHTMLtags when Microdata
+ // is enabled so we don't bother adding a conditional to hide these
+ // Also meta and link are only valid in WikiText as Microdata elements
+ // (ie: validateTag rejects tags missing the attributes needed for Microdata)
+ // So we don't bother including $common attributes that have no purpose.
+ 'meta' => array( 'itemprop', 'content' ),
+ 'link' => array( 'itemprop', 'href' ),
);
+ }
+
+ $staticInitialised = $globalContext;
+
return $whitelist;
}
@@ -1529,7 +1634,7 @@ class Sanitizer {
* Warning: this return value must be further escaped for literal
* inclusion in HTML output as of 1.10!
*
- * @param $text String: HTML fragment
+ * @param string $text HTML fragment
* @return String
*/
static function stripAllTags( $text ) {
@@ -1641,7 +1746,7 @@ class Sanitizer {
*
* @since 1.18
*
- * @param $addr String E-mail address
+ * @param string $addr E-mail address
* @return Bool
*/
public static function validateEmail( $addr ) {
@@ -1653,8 +1758,8 @@ class Sanitizer {
// Please note strings below are enclosed in brackets [], this make the
// hyphen "-" a range indicator. Hence it is double backslashed below.
// See bug 26948
- $rfc5322_atext = "a-z0-9!#$%&'*+\\-\/=?^_`{|}~" ;
- $rfc1034_ldh_str = "a-z0-9\\-" ;
+ $rfc5322_atext = "a-z0-9!#$%&'*+\\-\/=?^_`{|}~";
+ $rfc1034_ldh_str = "a-z0-9\\-";
$HTML5_email_regexp = "/
^ # start of string
@@ -1663,7 +1768,7 @@ class Sanitizer {
[$rfc1034_ldh_str]+ # First domain part
(\\.[$rfc1034_ldh_str]+)* # Following part prefixed with a dot
$ # End of string
- /ix" ; // case Insensitive, eXtended
+ /ix"; // case Insensitive, eXtended
return (bool) preg_match( $HTML5_email_regexp, $addr );
}
diff --git a/includes/ScopedCallback.php b/includes/ScopedCallback.php
new file mode 100644
index 00000000..1d5b26bf
--- /dev/null
+++ b/includes/ScopedCallback.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * This file deals with RAII style scoped callbacks.
+ *
+ * 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
+ */
+
+/**
+ * Class for asserting that a callback happens when an dummy object leaves scope
+ */
+class ScopedCallback {
+ /** @var Closure */
+ protected $callback;
+
+ /**
+ * @param $callback Closure
+ */
+ public function __construct( Closure $callback ) {
+ $this->callback = $callback;
+ }
+
+ function __destruct() {
+ call_user_func( $this->callback );
+ }
+}
diff --git a/includes/SeleniumWebSettings.php b/includes/SeleniumWebSettings.php
index 7b98568d..7715484e 100644
--- a/includes/SeleniumWebSettings.php
+++ b/includes/SeleniumWebSettings.php
@@ -38,7 +38,7 @@ $cookieName = $cookiePrefix . 'Selenium';
// this is a fallback SQL file
$testSqlFile = false;
$testImageZip = false;
-
+
// if we find a request parameter containing the test name, set a cookie with the test name
if ( isset( $_GET['setupTestSuite'] ) ) {
$setupTestSuiteName = $_GET['setupTestSuite'];
@@ -62,9 +62,9 @@ if ( isset( $_GET['setupTestSuite'] ) ) {
true
);
}
-
+
$testIncludes = array(); // array containing all the includes needed for this test
- $testGlobalConfigs = array(); // an array containg all the global configs needed for this test
+ $testGlobalConfigs = array(); // an array containing all the global configs needed for this test
$testResourceFiles = array(); // an array containing all the resource files needed for this test
$callback = $wgSeleniumTestConfigs[$setupTestSuiteName];
call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
@@ -72,11 +72,11 @@ if ( isset( $_GET['setupTestSuite'] ) ) {
if ( isset( $testResourceFiles['images'] ) ) {
$testImageZip = $testResourceFiles['images'];
}
-
+
if ( isset( $testResourceFiles['db'] ) ) {
$testSqlFile = $testResourceFiles['db'];
$testResourceName = getTestResourceNameFromTestSuiteName( $setupTestSuiteName );
-
+
switchToTestResources( $testResourceName, false ); // false means do not switch database yet
setupTestResources( $testResourceName, $testSqlFile, $testImageZip );
}
@@ -86,7 +86,7 @@ if ( isset( $_GET['setupTestSuite'] ) ) {
if ( isset( $_GET['clearTestSuite'] ) ) {
$testSuiteName = getTestSuiteNameFromCookie( $cookieName );
- $expire = time() - 600;
+ $expire = time() - 600;
setcookie(
$cookieName,
'',
@@ -96,22 +96,22 @@ if ( isset( $_GET['clearTestSuite'] ) ) {
$wgCookieSecure,
true
);
-
+
$testResourceName = getTestResourceNameFromTestSuiteName( $testSuiteName );
teardownTestResources( $testResourceName );
}
// if a cookie is found, run the appropriate callback to get the config params.
-if ( isset( $_COOKIE[$cookieName] ) ) {
+if ( isset( $_COOKIE[$cookieName] ) ) {
$testSuiteName = getTestSuiteNameFromCookie( $cookieName );
if ( !isset( $wgSeleniumTestConfigs[$testSuiteName] ) ) {
return;
}
-
+
$testIncludes = array(); // array containing all the includes needed for this test
- $testGlobalConfigs = array(); // an array containg all the global configs needed for this test
+ $testGlobalConfigs = array(); // an array containing all the global configs needed for this test
$testResourceFiles = array(); // an array containing all the resource files needed for this test
- $callback = $wgSeleniumTestConfigs[$testSuiteName];
+ $callback = $wgSeleniumTestConfigs[$testSuiteName];
call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
if ( isset( $testResourceFiles['db'] ) ) {
@@ -123,9 +123,8 @@ if ( isset( $_COOKIE[$cookieName] ) ) {
require_once( $file );
}
foreach ( $testGlobalConfigs as $key => $value ) {
- if ( is_array( $value ) ) {
+ if ( is_array( $value ) ) {
$GLOBALS[$key] = array_merge( $GLOBALS[$key], $value );
-
} else {
$GLOBALS[$key] = $value;
}
@@ -166,7 +165,7 @@ function setupTestResources( $testResourceName, $testSqlFile, $testImageZip ) {
if ( $testResourceName == '' ) {
die( 'Cannot identify a test the resources should be installed for.' );
}
-
+
// create tables
$dbw = wfGetDB( DB_MASTER );
$dbw->query( 'DROP DATABASE IF EXISTS ' . $testResourceName );
diff --git a/includes/Setup.php b/includes/Setup.php
index 924c3c07..e87b200f 100644
--- a/includes/Setup.php
+++ b/includes/Setup.php
@@ -50,27 +50,27 @@ if ( $wgLoadScript === false ) $wgLoadScript = "$wgScriptPath/load$wgScriptExten
if ( $wgArticlePath === false ) {
if ( $wgUsePathInfo ) {
- $wgArticlePath = "$wgScript/$1";
+ $wgArticlePath = "$wgScript/$1";
} else {
- $wgArticlePath = "$wgScript?title=$1";
+ $wgArticlePath = "$wgScript?title=$1";
}
}
-if ( !empty($wgActionPaths) && !isset($wgActionPaths['view']) ) {
+if ( !empty( $wgActionPaths ) && !isset( $wgActionPaths['view'] ) ) {
# 'view' is assumed the default action path everywhere in the code
# but is rarely filled in $wgActionPaths
$wgActionPaths['view'] = $wgArticlePath;
}
-if ( !empty($wgActionPaths) && !isset($wgActionPaths['view']) ) {
+if ( !empty( $wgActionPaths ) && !isset( $wgActionPaths['view'] ) ) {
# 'view' is assumed the default action path everywhere in the code
# but is rarely filled in $wgActionPaths
- $wgActionPaths['view'] = $wgArticlePath ;
+ $wgActionPaths['view'] = $wgArticlePath;
}
if ( $wgStylePath === false ) $wgStylePath = "$wgScriptPath/skins";
if ( $wgLocalStylePath === false ) $wgLocalStylePath = "$wgScriptPath/skins";
-if ( $wgStyleDirectory === false ) $wgStyleDirectory = "$IP/skins";
+if ( $wgStyleDirectory === false ) $wgStyleDirectory = "$IP/skins";
if ( $wgExtensionAssetsPath === false ) $wgExtensionAssetsPath = "$wgScriptPath/extensions";
if ( $wgLogo === false ) $wgLogo = "$wgStylePath/common/images/wiki.png";
@@ -317,19 +317,13 @@ if ( $wgUseFileCache || $wgUseSquid ) {
$wgDebugToolbar = false;
}
-# $wgAllowRealName and $wgAllowUserSkin were removed in 1.16
-# in favor of $wgHiddenPrefs, handle b/c here
-if ( !$wgAllowRealName ) {
- $wgHiddenPrefs[] = 'realname';
-}
-
# Doesn't make sense to have if disabled.
if ( !$wgEnotifMinorEdits ) {
$wgHiddenPrefs[] = 'enotifminoredits';
}
# $wgDisabledActions is deprecated as of 1.18
-foreach( $wgDisabledActions as $action ){
+foreach( $wgDisabledActions as $action ) {
$wgActions[$action] = false;
}
@@ -343,7 +337,7 @@ if ( !$wgHtml5Version && $wgHtml5 && $wgAllowRdfaAttributes ) {
}
# Blacklisted file extensions shouldn't appear on the "allowed" list
-$wgFileExtensions = array_diff ( $wgFileExtensions, $wgFileBlacklist );
+$wgFileExtensions = array_values( array_diff ( $wgFileExtensions, $wgFileBlacklist ) );
if ( $wgArticleCountMethod === null ) {
$wgArticleCountMethod = $wgUseCommaCount ? 'comma' : 'link';
@@ -359,17 +353,18 @@ if ( $wgAjaxUploadDestCheck ) {
if ( $wgNewUserLog ) {
# Add a new log type
- $wgLogTypes[] = 'newusers';
- $wgLogNames['newusers'] = 'newuserlogpage';
- $wgLogHeaders['newusers'] = 'newuserlogpagetext';
+ $wgLogTypes[] = 'newusers';
+ $wgLogNames['newusers'] = 'newuserlogpage';
+ $wgLogHeaders['newusers'] = 'newuserlogpagetext';
$wgLogActionsHandlers['newusers/newusers'] = 'NewUsersLogFormatter';
$wgLogActionsHandlers['newusers/create'] = 'NewUsersLogFormatter';
$wgLogActionsHandlers['newusers/create2'] = 'NewUsersLogFormatter';
+ $wgLogActionsHandlers['newusers/byemail'] = 'NewUsersLogFormatter';
$wgLogActionsHandlers['newusers/autocreate'] = 'NewUsersLogFormatter';
}
if ( $wgCookieSecure === 'detect' ) {
- $wgCookieSecure = ( WebRequest::detectProtocol() === 'https:' );
+ $wgCookieSecure = ( WebRequest::detectProtocol() === 'https' );
}
// Disable MWDebug for command line mode, this prevents MWDebug from eating up
@@ -396,6 +391,11 @@ if ( !defined( 'MW_COMPILED' ) ) {
wfProfileOut( $fname . '-includes' );
}
+if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
+ $wgSecureLogin = false;
+ wfWarn( 'Secure login was enabled on a server that only supports HTTP or HTTPS. Disabling secure login.' );
+}
+
# Now that GlobalFunctions is loaded, set defaults that depend
# on it.
if ( $wgTmpDirectory === false ) {
diff --git a/includes/SiteConfiguration.php b/includes/SiteConfiguration.php
index 6a861d8e..bbc14a12 100644
--- a/includes/SiteConfiguration.php
+++ b/includes/SiteConfiguration.php
@@ -83,7 +83,7 @@
* $conf->settings = array(
* 'wgMergeSetting' = array(
* # Value that will be shared among all wikis:
- * 'default' => array( NS_USER => true ),
+ * 'default' => array( NS_USER => true ),
*
* # Leading '+' means merging the array of value with the defaults
* '+beta' => array( NS_HELP => true ),
@@ -162,12 +162,18 @@ class SiteConfiguration {
public $siteParamsCallback = null;
/**
+ * Configuration cache for getConfig()
+ * @var array
+ */
+ protected $cfgCache = array();
+
+ /**
* Retrieves a configuration setting for a given wiki.
- * @param $settingName String ID of the setting name to retrieve
- * @param $wiki String Wiki ID of the wiki in question.
- * @param $suffix String The suffix of the wiki in question.
- * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
- * @param $wikiTags Array The tags assigned to the wiki.
+ * @param string $settingName ID of the setting name to retrieve
+ * @param string $wiki Wiki ID of the wiki in question.
+ * @param string $suffix The suffix of the wiki in question.
+ * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
+ * @param array $wikiTags The tags assigned to the wiki.
* @return Mixed the value of the setting requested.
*/
public function get( $settingName, $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
@@ -178,12 +184,12 @@ class SiteConfiguration {
/**
* Really retrieves a configuration setting for a given wiki.
*
- * @param $settingName String ID of the setting name to retrieve.
- * @param $wiki String Wiki ID of the wiki in question.
- * @param $params Array: array of parameters.
+ * @param string $settingName ID of the setting name to retrieve.
+ * @param string $wiki Wiki ID of the wiki in question.
+ * @param array $params array of parameters.
* @return Mixed the value of the setting requested.
*/
- protected function getSetting( $settingName, $wiki, /*array*/ $params ){
+ protected function getSetting( $settingName, $wiki, /*array*/ $params ) {
$retval = null;
if( array_key_exists( $settingName, $this->settings ) ) {
$thisSetting =& $this->settings[$settingName];
@@ -205,7 +211,7 @@ class SiteConfiguration {
$retval = $thisSetting[$tag];
}
break 2;
- } elseif( array_key_exists( "+$tag", $thisSetting ) && is_array($thisSetting["+$tag"]) ) {
+ } elseif( array_key_exists( "+$tag", $thisSetting ) && is_array( $thisSetting["+$tag"] ) ) {
if( !isset( $retval ) ) {
$retval = array();
}
@@ -216,7 +222,7 @@ class SiteConfiguration {
$suffix = $params['suffix'];
if( !is_null( $suffix ) ) {
if( array_key_exists( $suffix, $thisSetting ) ) {
- if ( isset($retval) && is_array($retval) && is_array($thisSetting[$suffix]) ) {
+ if ( isset( $retval ) && is_array( $retval ) && is_array( $thisSetting[$suffix] ) ) {
$retval = self::arrayMerge( $retval, $thisSetting[$suffix] );
} else {
$retval = $thisSetting[$suffix];
@@ -274,10 +280,10 @@ class SiteConfiguration {
/**
* Gets all settings for a wiki
- * @param $wiki String Wiki ID of the wiki in question.
- * @param $suffix String The suffix of the wiki in question.
- * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
- * @param $wikiTags Array The tags assigned to the wiki.
+ * @param string $wiki Wiki ID of the wiki in question.
+ * @param string $suffix The suffix of the wiki in question.
+ * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
+ * @param array $wikiTags The tags assigned to the wiki.
* @return Array Array of settings requested.
*/
public function getAll( $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
@@ -304,10 +310,10 @@ class SiteConfiguration {
/**
* Retrieves a configuration setting for a given wiki, forced to a boolean.
- * @param $setting String ID of the setting name to retrieve
- * @param $wiki String Wiki ID of the wiki in question.
- * @param $suffix String The suffix of the wiki in question.
- * @param $wikiTags Array The tags assigned to the wiki.
+ * @param string $setting ID of the setting name to retrieve
+ * @param string $wiki Wiki ID of the wiki in question.
+ * @param string $suffix The suffix of the wiki in question.
+ * @param array $wikiTags The tags assigned to the wiki.
* @return bool The value of the setting requested.
*/
public function getBool( $setting, $wiki, $suffix = null, $wikiTags = array() ) {
@@ -325,12 +331,12 @@ class SiteConfiguration {
/**
* Retrieves the value of a given setting, and places it in a variable passed by reference.
- * @param $setting String ID of the setting name to retrieve
- * @param $wiki String Wiki ID of the wiki in question.
- * @param $suffix String The suffix of the wiki in question.
- * @param $var array Reference The variable to insert the value into.
- * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
- * @param $wikiTags Array The tags assigned to the wiki.
+ * @param string $setting ID of the setting name to retrieve
+ * @param string $wiki Wiki ID of the wiki in question.
+ * @param string $suffix The suffix of the wiki in question.
+ * @param array $var Reference The variable to insert the value into.
+ * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
+ * @param array $wikiTags The tags assigned to the wiki.
*/
public function extractVar( $setting, $wiki, $suffix, &$var, $params = array(), $wikiTags = array() ) {
$value = $this->get( $setting, $wiki, $suffix, $params, $wikiTags );
@@ -341,11 +347,11 @@ class SiteConfiguration {
/**
* Retrieves the value of a given setting, and places it in its corresponding global variable.
- * @param $setting String ID of the setting name to retrieve
- * @param $wiki String Wiki ID of the wiki in question.
- * @param $suffix String The suffix of the wiki in question.
- * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
- * @param $wikiTags Array The tags assigned to the wiki.
+ * @param string $setting ID of the setting name to retrieve
+ * @param string $wiki Wiki ID of the wiki in question.
+ * @param string $suffix The suffix of the wiki in question.
+ * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
+ * @param array $wikiTags The tags assigned to the wiki.
*/
public function extractGlobal( $setting, $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
$params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
@@ -360,9 +366,9 @@ class SiteConfiguration {
public function extractGlobalSetting( $setting, $wiki, $params ) {
$value = $this->getSetting( $setting, $wiki, $params );
if ( !is_null( $value ) ) {
- if (substr($setting,0,1) == '+' && is_array($value)) {
- $setting = substr($setting,1);
- if ( is_array($GLOBALS[$setting]) ) {
+ if ( substr( $setting, 0, 1 ) == '+' && is_array( $value ) ) {
+ $setting = substr( $setting, 1 );
+ if ( is_array( $GLOBALS[$setting] ) ) {
$GLOBALS[$setting] = self::arrayMerge( $GLOBALS[$setting], $value );
} else {
$GLOBALS[$setting] = $value;
@@ -375,10 +381,10 @@ class SiteConfiguration {
/**
* Retrieves the values of all settings, and places them in their corresponding global variables.
- * @param $wiki String Wiki ID of the wiki in question.
- * @param $suffix String The suffix of the wiki in question.
- * @param $params Array List of parameters. $.'key' is replaced by $value in all returned data.
- * @param $wikiTags Array The tags assigned to the wiki.
+ * @param string $wiki Wiki ID of the wiki in question.
+ * @param string $suffix The suffix of the wiki in question.
+ * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
+ * @param array $wikiTags The tags assigned to the wiki.
*/
public function extractAllGlobals( $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
$params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
@@ -395,7 +401,7 @@ class SiteConfiguration {
* @param $wiki String
* @return array
*/
- protected function getWikiParams( $wiki ){
+ protected function getWikiParams( $wiki ) {
static $default = array(
'suffix' => null,
'lang' => null,
@@ -413,7 +419,7 @@ class SiteConfiguration {
return $default;
}
- foreach( $default as $name => $def ){
+ foreach( $default as $name => $def ) {
if( !isset( $ret[$name] ) || ( is_array( $default[$name] ) && !is_array( $ret[$name] ) ) ) {
$ret[$name] = $default[$name];
}
@@ -427,14 +433,14 @@ class SiteConfiguration {
* by self::$siteParamsCallback for backward compatibility
* Values returned by self::getWikiParams() have the priority.
*
- * @param $wiki String Wiki ID of the wiki in question.
- * @param $suffix String The suffix of the wiki in question.
- * @param $params Array List of parameters. $.'key' is replaced by $value in
+ * @param string $wiki Wiki ID of the wiki in question.
+ * @param string $suffix The suffix of the wiki in question.
+ * @param array $params List of parameters. $.'key' is replaced by $value in
* all returned data.
- * @param $wikiTags Array The tags assigned to the wiki.
+ * @param array $wikiTags The tags assigned to the wiki.
* @return array
*/
- protected function mergeParams( $wiki, $suffix, /*array*/ $params, /*array*/ $wikiTags ){
+ protected function mergeParams( $wiki, $suffix, /*array*/ $params, /*array*/ $wikiTags ) {
$ret = $this->getWikiParams( $wiki );
if( is_null( $ret['suffix'] ) ) {
@@ -446,7 +452,7 @@ class SiteConfiguration {
$ret['params'] += $params;
// Automatically fill that ones if needed
- if( !isset( $ret['params']['lang'] ) && !is_null( $ret['lang'] ) ){
+ if( !isset( $ret['params']['lang'] ) && !is_null( $ret['lang'] ) ) {
$ret['params']['lang'] = $ret['lang'];
}
if( !isset( $ret['params']['site'] ) && !is_null( $ret['suffix'] ) ) {
@@ -487,6 +493,67 @@ class SiteConfiguration {
}
/**
+ * Get the resolved (post-setup) configuration of a potentially foreign wiki.
+ * For foreign wikis, this is expensive, and only works if maintenance
+ * scripts are setup to handle the --wiki parameter such as in wiki farms.
+ *
+ * @param string $wiki
+ * @param array|string $settings A setting name or array of setting names
+ * @return Array|mixed Array if $settings is an array, otherwise the value
+ * @throws MWException
+ * @since 1.21
+ */
+ public function getConfig( $wiki, $settings ) {
+ global $IP;
+
+ $multi = is_array( $settings );
+ $settings = (array)$settings;
+ if ( $wiki === wfWikiID() ) { // $wiki is this wiki
+ $res = array();
+ foreach ( $settings as $name ) {
+ if ( !preg_match( '/^wg[A-Z]/', $name ) ) {
+ throw new MWException( "Variable '$name' does start with 'wg'." );
+ } elseif ( !isset( $GLOBALS[$name] ) ) {
+ throw new MWException( "Variable '$name' is not set." );
+ }
+ $res[$name] = $GLOBALS[$name];
+ }
+ } else { // $wiki is a foreign wiki
+ if ( isset( $this->cfgCache[$wiki] ) ) {
+ $res = array_intersect_key( $this->cfgCache[$wiki], array_flip( $settings ) );
+ if ( count( $res ) == count( $settings ) ) {
+ return $res; // cache hit
+ }
+ } elseif ( !in_array( $wiki, $this->wikis ) ) {
+ throw new MWException( "No such wiki '$wiki'." );
+ } else {
+ $this->cfgCache[$wiki] = array();
+ }
+ $retVal = 1;
+ $cmd = wfShellWikiCmd(
+ "$IP/maintenance/getConfiguration.php",
+ array(
+ '--wiki', $wiki,
+ '--settings', implode( ' ', $settings ),
+ '--format', 'PHP'
+ )
+ );
+ // ulimit5.sh breaks this call
+ $data = trim( wfShellExec( $cmd, $retVal, array(), array( 'memory' => 0 ) ) );
+ if ( $retVal != 0 || !strlen( $data ) ) {
+ throw new MWException( "Failed to run getConfiguration.php." );
+ }
+ $res = unserialize( $data );
+ if ( !is_array( $res ) ) {
+ throw new MWException( "Failed to unserialize configuration array." );
+ }
+ $this->cfgCache[$wiki] = $this->cfgCache[$wiki] + $res;
+ }
+
+ return $multi ? $res : current( $res );
+ }
+
+ /**
* Returns true if the given vhost is handled locally.
* @param $vhost String
* @return bool
@@ -509,9 +576,9 @@ class SiteConfiguration {
$out = $array1;
for( $i = 1; $i < func_num_args(); $i++ ) {
foreach( func_get_arg( $i ) as $key => $value ) {
- if ( isset($out[$key]) && is_array($out[$key]) && is_array($value) ) {
+ if ( isset( $out[$key] ) && is_array( $out[$key] ) && is_array( $value ) ) {
$out[$key] = self::arrayMerge( $out[$key], $value );
- } elseif ( !isset($out[$key]) || !$out[$key] && !is_numeric($key) ) {
+ } elseif ( !isset( $out[$key] ) || !$out[$key] && !is_numeric( $key ) ) {
// Values that evaluate to true given precedence, for the primary purpose of merging permissions arrays.
$out[$key] = $value;
} elseif ( is_numeric( $key ) ) {
diff --git a/includes/SiteStats.php b/includes/SiteStats.php
index 1c2c454d..b7be29d6 100644
--- a/includes/SiteStats.php
+++ b/includes/SiteStats.php
@@ -48,8 +48,7 @@ class SiteStats {
# Update schema
$u = new SiteStatsUpdate( 0, 0, 0 );
$u->doUpdate();
- $dbr = wfGetDB( DB_SLAVE );
- self::$row = $dbr->selectRow( 'site_stats', '*', false, __METHOD__ );
+ self::$row = self::doLoad( wfGetDB( DB_SLAVE ) );
}
self::$loaded = true;
@@ -91,7 +90,16 @@ class SiteStats {
* @return Bool|ResultWrapper
*/
static function doLoad( $db ) {
- return $db->selectRow( 'site_stats', '*', false, __METHOD__ );
+ return $db->selectRow( 'site_stats', array(
+ 'ss_row_id',
+ 'ss_total_views',
+ 'ss_total_edits',
+ 'ss_good_articles',
+ 'ss_total_pages',
+ 'ss_users',
+ 'ss_active_users',
+ 'ss_images',
+ ), false, __METHOD__ );
}
/**
@@ -152,7 +160,7 @@ class SiteStats {
/**
* Find the number of users in a given user group.
- * @param $group String: name of group
+ * @param string $group name of group
* @return Integer
*/
static function numberingroup( $group ) {
@@ -390,7 +398,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
/**
* @param $type string
- * @param $sign string ('+' or '-')
+ * @param string $sign ('+' or '-')
* @return string
*/
private function getTypeCacheKey( $type, $sign ) {
@@ -443,7 +451,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
/**
* Reduce pending delta counters after updates have been applied
- * @param Array $pd Result of getPendingDeltas(), used for DB update
+ * @param array $pd Result of getPendingDeltas(), used for DB update
* @return void
*/
protected function removePendingDeltas( array $pd ) {
@@ -566,7 +574,7 @@ class SiteStatsInit {
* @param $database DatabaseBase|bool
* - Boolean: whether to use the master DB
* - DatabaseBase: database connection to use
- * @param $options Array of options, may contain the following values
+ * @param array $options of options, may contain the following values
* - update Boolean: whether to update the current stats (true) or write fresh (false) (default: false)
* - views Boolean: when true, do not update the number of page views (default: true)
* - activeUsers Boolean: whether to update the number of active users (default: false)
diff --git a/includes/Skin.php b/includes/Skin.php
index 968f215e..0cc1086c 100644
--- a/includes/Skin.php
+++ b/includes/Skin.php
@@ -73,7 +73,7 @@ abstract class Skin extends ContextSource {
return $wgValidSkinNames;
}
- /**
+ /**
* Fetch the skinname messages for available skins.
* @return array of strings
*/
@@ -107,7 +107,7 @@ abstract class Skin extends ContextSource {
* Normalize a skin preference value to a form that can be loaded.
* If a skin can't be found, it will fall back to the configured
* default (or the old 'Classic' skin if that's broken).
- * @param $key String: 'monobook', 'standard', etc.
+ * @param string $key 'monobook', 'standard', etc.
* @return string
*/
static function normalizeKey( $key ) {
@@ -148,7 +148,7 @@ abstract class Skin extends ContextSource {
/**
* Factory method for loading a skin of a given type
- * @param $key String: 'monobook', 'standard', etc.
+ * @param string $key 'monobook', 'standard', etc.
* @return Skin
*/
static function &newFromKey( $key ) {
@@ -167,7 +167,7 @@ abstract class Skin extends ContextSource {
require_once( "{$wgStyleDirectory}/{$skinName}.php" );
}
- # Check if we got if not failback to default skin
+ # Check if we got if not fallback to default skin
if ( !MWInit::classExists( $className ) ) {
# DO NOT die if the class isn't found. This breaks maintenance
# scripts and can cause a user account to be unrecoverable
@@ -262,7 +262,7 @@ abstract class Skin extends ContextSource {
* @return Title
*/
public function getRelevantTitle() {
- if ( isset($this->mRelevantTitle) ) {
+ if ( isset( $this->mRelevantTitle ) ) {
return $this->mRelevantTitle;
}
return $this->getTitle();
@@ -286,12 +286,12 @@ abstract class Skin extends ContextSource {
* @return User
*/
public function getRelevantUser() {
- if ( isset($this->mRelevantUser) ) {
+ if ( isset( $this->mRelevantUser ) ) {
return $this->mRelevantUser;
}
$title = $this->getRelevantTitle();
- if( $title->getNamespace() == NS_USER || $title->getNamespace() == NS_USER_TALK ) {
- $rootUser = strtok( $title->getText(), '/' );
+ if( $title->hasSubjectNamespace( NS_USER ) ) {
+ $rootUser = $title->getRootText();
if ( User::isIP( $rootUser ) ) {
$this->mRelevantUser = User::newFromName( $rootUser, false );
} else {
@@ -435,7 +435,7 @@ abstract class Skin extends ContextSource {
$colon = $this->msg( 'colon-separator' )->escaped();
if ( !empty( $allCats['normal'] ) ) {
- $t = $embed . implode( "{$pop}{$embed}" , $allCats['normal'] ) . $pop;
+ $t = $embed . implode( "{$pop}{$embed}", $allCats['normal'] ) . $pop;
$msg = $this->msg( 'pagecategories' )->numParams( count( $allCats['normal'] ) )->escaped();
$linkPage = wfMessage( 'pagecategorieslink' )->inContentLanguage()->text();
@@ -456,7 +456,7 @@ abstract class Skin extends ContextSource {
$s .= "<div id=\"mw-hidden-catlinks\" class=\"mw-hidden-catlinks$class\">" .
$this->msg( 'hidden-categories' )->numParams( count( $allCats['hidden'] ) )->escaped() .
- $colon . '<ul>' . $embed . implode( "{$pop}{$embed}" , $allCats['hidden'] ) . $pop . '</ul>' .
+ $colon . '<ul>' . $embed . implode( "{$pop}{$embed}", $allCats['hidden'] ) . $pop . '</ul>' .
'</div>';
}
@@ -481,8 +481,8 @@ abstract class Skin extends ContextSource {
}
/**
- * Render the array as a serie of links.
- * @param $tree Array: categories tree returned by Title::getParentCategoryTree
+ * Render the array as a series of links.
+ * @param array $tree categories tree returned by Title::getParentCategoryTree
* @return String separated by &gt;, terminate with "\n"
*/
function drawCategoryBrowser( $tree ) {
@@ -499,7 +499,7 @@ abstract class Skin extends ContextSource {
# add our current element to the list
$eltitle = Title::newFromText( $element );
- $return .= Linker::link( $eltitle, htmlspecialchars( $eltitle->getText() ) );
+ $return .= Linker::link( $eltitle, htmlspecialchars( $eltitle->getText() ) );
}
return $return;
@@ -613,7 +613,6 @@ abstract class Skin extends ContextSource {
( $this->getTitle()->getArticleID() == 0 || $action == 'history' ) ) {
$n = $this->getTitle()->isDeleted();
-
if ( $n ) {
if ( $this->getUser()->isAllowed( 'undelete' ) ) {
$msg = 'thisisdeleted';
@@ -851,16 +850,16 @@ abstract class Skin extends ContextSource {
}
/**
- * Renders a $wgFooterIcons icon acording to the method's arguments
- * @param $icon Array: The icon to build the html for, see $wgFooterIcons for the format of this array
- * @param $withImage Bool|String: Whether to use the icon's image or output a text-only footericon
+ * Renders a $wgFooterIcons icon according to the method's arguments
+ * @param array $icon The icon to build the html for, see $wgFooterIcons for the format of this array
+ * @param bool|String $withImage Whether to use the icon's image or output a text-only footericon
* @return String HTML
*/
function makeFooterIcon( $icon, $withImage = 'withImage' ) {
if ( is_string( $icon ) ) {
$html = $icon;
} else { // Assuming array
- $url = isset($icon["url"]) ? $icon["url"] : null;
+ $url = isset( $icon["url"] ) ? $icon["url"] : null;
unset( $icon["url"] );
if ( isset( $icon["src"] ) && $withImage === 'withImage' ) {
$html = Html::element( 'img', $icon ); // do this the lazy way, just pass icon data as an attribute array
@@ -969,7 +968,7 @@ abstract class Skin extends ContextSource {
* Return a fully resolved style path url to images or styles stored in the common folder.
* This method returns a url resolved using the configured skin style path
* and includes the style version inside of the url.
- * @param $name String: The name or path of a skin resource file
+ * @param string $name The name or path of a skin resource file
* @return String The fully resolved style path url including styleversion
*/
function getCommonStylePath( $name ) {
@@ -978,10 +977,10 @@ abstract class Skin extends ContextSource {
}
/**
- * Return a fully resolved style path url to images or styles stored in the curent skins's folder.
+ * Return a fully resolved style path url to images or styles stored in the current skins's folder.
* This method returns a url resolved using the configured skin style path
* and includes the style version inside of the url.
- * @param $name String: The name or path of a skin resource file
+ * @param string $name The name or path of a skin resource file
* @return String The fully resolved style path url including styleversion
*/
function getSkinStylePath( $name ) {
@@ -1008,8 +1007,8 @@ abstract class Skin extends ContextSource {
* If $proto is set to null, make a local URL. Otherwise, make a full
* URL with the protocol specified.
*
- * @param $name string Name of the Special page
- * @param $urlaction string Query to append
+ * @param string $name Name of the Special page
+ * @param string $urlaction Query to append
* @param $proto Protocol to use or null for a local URL
* @return String
*/
@@ -1102,7 +1101,7 @@ abstract class Skin extends ContextSource {
/**
* Make URL details where the article exists (or at least it's convenient to think so)
- * @param $name String Article name
+ * @param string $name Article name
* @param $urlaction String
* @return Array
*/
@@ -1132,7 +1131,23 @@ abstract class Skin extends ContextSource {
}
/**
- * Build an array that represents the sidebar(s), the navigation bar among them
+ * Build an array that represents the sidebar(s), the navigation bar among them.
+ *
+ * BaseTemplate::getSidebar can be used to simplify the format and id generation in new skins.
+ *
+ * The format of the returned array is array( heading => content, ... ), where:
+ * - heading is the heading of a navigation portlet. It is either:
+ * - magic string to be handled by the skins ('SEARCH' / 'LANGUAGES' / 'TOOLBOX' / ...)
+ * - a message name (e.g. 'navigation'), the message should be HTML-escaped by the skin
+ * - plain text, which should be HTML-escaped by the skin
+ * - content is the contents of the portlet. It is either:
+ * - HTML text (<ul><li>...</li>...</ul>)
+ * - array of link data in a format accepted by BaseTemplate::makeListItem()
+ * - (for a magic string as a key, any value)
+ *
+ * Note that extensions can control the sidebar contents using the SkinBuildSidebar hook
+ * and can technically insert anything in here; skin creators are expected to handle
+ * values described above.
*
* @return array
*/
@@ -1366,7 +1381,7 @@ abstract class Skin extends ContextSource {
/**
* Get a cached notice
*
- * @param $name String: message name, or 'default' for $wgSiteNotice
+ * @param string $name message name, or 'default' for $wgSiteNotice
* @return String: HTML fragment
*/
private function getCachedNotice( $name ) {
@@ -1474,9 +1489,9 @@ abstract class Skin extends ContextSource {
*
* @param $nt Title The title being linked to (may not be the same as
* $wgTitle, if the section is included from a template)
- * @param $section string The designation of the section being pointed to,
+ * @param string $section The designation of the section being pointed to,
* to be included in the link, like "&section=$section"
- * @param $tooltip string The tooltip to use for the link: will be escaped
+ * @param string $tooltip The tooltip to use for the link: will be escaped
* and wrapped in the 'editsectionhint' message
* @param $lang string Language code
* @return string HTML to use for edit link
@@ -1534,8 +1549,9 @@ abstract class Skin extends ContextSource {
* Use PHP's magic __call handler to intercept legacy calls to the linker
* for backwards compatibility.
*
- * @param $fname String Name of called method
- * @param $args Array Arguments to the method
+ * @param string $fname Name of called method
+ * @param array $args Arguments to the method
+ * @throws MWException
* @return mixed
*/
function __call( $fname, $args ) {
diff --git a/includes/SkinLegacy.php b/includes/SkinLegacy.php
index e695ba6c..b9766a9f 100644
--- a/includes/SkinLegacy.php
+++ b/includes/SkinLegacy.php
@@ -120,7 +120,7 @@ class LegacyTemplate extends BaseTemplate {
}
$s .= "\n<div id='content'>\n<div id='topbar'>\n" .
- "<table cellspacing='0' width='100%'>\n<tr>\n";
+ "<table cellspacing='0' style='width: 100%;'>\n<tr>\n";
if ( $this->getSkin()->qbSetting() == 0 ) {
$s .= "<td class='top' style='text-align: left; vertical-align: top;' rowspan='{$rows}'>\n" .
@@ -179,10 +179,10 @@ class LegacyTemplate extends BaseTemplate {
$search = $wgRequest->getText( 'search' );
$s = '<form id="searchform' . $this->searchboxes . '" name="search" class="inline" method="post" action="'
- . $this->getSkin()->escapeSearchLink() . "\">\n"
- . '<input type="text" id="searchInput' . $this->searchboxes . '" name="search" size="19" value="'
- . htmlspecialchars( substr( $search, 0, 256 ) ) . "\" />\n"
- . '<input type="submit" name="go" value="' . wfMessage( 'searcharticle' )->text() . '" />';
+ . $this->getSkin()->escapeSearchLink() . "\">\n"
+ . '<input type="text" id="searchInput' . $this->searchboxes . '" name="search" size="19" value="'
+ . htmlspecialchars( substr( $search, 0, 256 ) ) . "\" />\n"
+ . '<input type="submit" name="go" value="' . wfMessage( 'searcharticle' )->text() . '" />';
if ( $wgUseTwoButtonsSearchForm ) {
$s .= '&#160;<input type="submit" name="fulltext" value="' . wfMessage( 'searchbutton' )->text() . "\" />\n";
@@ -253,7 +253,7 @@ class LegacyTemplate extends BaseTemplate {
$lang = $title->getPageLanguage();
$variants = $lang->getVariants();
- if ( !$wgDisableLangConversion && sizeof( $variants ) > 1
+ if ( !$wgDisableLangConversion && count( $variants ) > 1
&& !$title->isSpecialPage() ) {
foreach ( $variants as $code ) {
$varname = $lang->getVariantname( $code );
@@ -263,7 +263,7 @@ class LegacyTemplate extends BaseTemplate {
}
$s = $wgLang->pipeList( array(
$s,
- '<a href="' . htmlspecialchars( $title->getLocalURL( 'variant=' . $code ) ) . '" lang="' . $code . '" hreflang="' . $code . '">' . htmlspecialchars( $varname ) . '</a>'
+ '<a href="' . htmlspecialchars( $title->getLocalURL( 'variant=' . $code ) ) . '" lang="' . $code . '" hreflang="' . $code . '">' . htmlspecialchars( $varname ) . '</a>'
) );
}
}
@@ -345,7 +345,7 @@ class LegacyTemplate extends BaseTemplate {
$s .= $this->deleteThisPage();
}
- if ( $wgUser->isAllowed( 'protect' ) ) {
+ if ( $wgUser->isAllowed( 'protect' ) && $title->getRestrictionTypes() ) {
$s .= $sep . $this->protectThisPage();
}
@@ -553,7 +553,7 @@ class LegacyTemplate extends BaseTemplate {
*/
function getQuickbarCompensator( $rows = 1 ) {
wfDeprecated( __METHOD__, '1.19' );
- return "<td width='152' rowspan='{$rows}'>&#160;</td>";
+ return "<td style='width: 152px;' rowspan='{$rows}'>&#160;</td>";
}
function editThisPage() {
@@ -610,7 +610,7 @@ class LegacyTemplate extends BaseTemplate {
$diff = $wgRequest->getVal( 'diff' );
$title = $this->getSkin()->getTitle();
- if ( $title->getArticleID() && ( ! $diff ) && $wgUser->isAllowed( 'protect' ) ) {
+ if ( $title->getArticleID() && ( ! $diff ) && $wgUser->isAllowed( 'protect' ) && $title->getRestrictionTypes() ) {
if ( $title->isProtected() ) {
$text = wfMessage( 'unprotectthispage' )->text();
$query = array( 'action' => 'unprotect' );
@@ -786,7 +786,7 @@ class LegacyTemplate extends BaseTemplate {
return '';
}
- # __NEWSECTIONLINK___ changes behaviour here
+ # __NEWSECTIONLINK___ changes behavior here
# If it is present, the link points to this page, otherwise
# it points to the talk page
if ( !$title->isTalkPage() && !$wgOut->showNewSectionLink() ) {
diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php
index bda43957..59e1ccff 100644
--- a/includes/SkinTemplate.php
+++ b/includes/SkinTemplate.php
@@ -113,7 +113,7 @@ class SkinTemplate extends Skin {
* roughly equivalent to PHPTAL 0.7.
*
* @param $classname String
- * @param $repository string: subdirectory where we keep template files
+ * @param string $repository subdirectory where we keep template files
* @param $cache_dir string
* @return QuickTemplate
* @private
@@ -169,7 +169,7 @@ class SkinTemplate extends Skin {
unset( $query['returnto'] );
unset( $query['returntoquery'] );
}
- $this->thisquery = wfArrayToCGI( $query );
+ $this->thisquery = wfArrayToCgi( $query );
$this->loggedin = $user->isLoggedIn();
$this->username = $user->getName();
@@ -219,7 +219,7 @@ class SkinTemplate extends Skin {
if ( $subpagestr !== '' ) {
$subpagestr = '<span class="subpages">' . $subpagestr . '</span>';
}
- $tpl->set( 'subtitle', $subpagestr . $out->getSubtitle() );
+ $tpl->set( 'subtitle', $subpagestr . $out->getSubtitle() );
$undelete = $this->getUndeleteLink();
if ( $undelete === '' ) {
@@ -262,7 +262,7 @@ class SkinTemplate extends Skin {
$tpl->set( 'helppage', $this->msg( 'helppage' )->text() );
*/
$tpl->set( 'searchaction', $this->escapeSearchLink() );
- $tpl->set( 'searchtitle', SpecialPage::getTitleFor( 'Search' )->getPrefixedDBKey() );
+ $tpl->set( 'searchtitle', SpecialPage::getTitleFor( 'Search' )->getPrefixedDBkey() );
$tpl->set( 'search', trim( $request->getVal( 'search' ) ) );
$tpl->setRef( 'stylepath', $wgStylePath );
$tpl->setRef( 'articlepath', $wgArticlePath );
@@ -273,7 +273,7 @@ class SkinTemplate extends Skin {
$userLang = $this->getLanguage();
$userLangCode = $userLang->getHtmlCode();
- $userLangDir = $userLang->getDir();
+ $userLangDir = $userLang->getDir();
$tpl->set( 'lang', $userLangCode );
$tpl->set( 'dir', $userLangDir );
@@ -398,12 +398,12 @@ class SkinTemplate extends Skin {
# not for special pages or file pages AND only when viewing AND if the page exists
# (or is in MW namespace, because that has default content)
if ( !in_array( $title->getNamespace(), array( NS_SPECIAL, NS_FILE ) ) &&
- in_array( $request->getVal( 'action', 'view' ), array( 'view', 'historysubmit' ) ) &&
+ Action::getActionName( $this ) === 'view' &&
( $title->exists() || $title->getNamespace() == NS_MEDIAWIKI ) ) {
$pageLang = $title->getPageViewLanguage();
$realBodyAttribs['lang'] = $pageLang->getHtmlCode();
$realBodyAttribs['dir'] = $pageLang->getDir();
- $realBodyAttribs['class'] = 'mw-content-'.$pageLang->getDir();
+ $realBodyAttribs['class'] = 'mw-content-' . $pageLang->getDir();
}
$out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext );
@@ -413,25 +413,28 @@ class SkinTemplate extends Skin {
$language_urls = array();
if ( !$wgHideInterlanguageLinks ) {
- foreach( $out->getLanguageLinks() as $l ) {
- $tmp = explode( ':', $l, 2 );
- $class = 'interwiki-' . $tmp[0];
- unset( $tmp );
- $nt = Title::newFromText( $l );
- if ( $nt ) {
- $ilLangName = Language::fetchLanguageName( $nt->getInterwiki() );
+ foreach( $out->getLanguageLinks() as $languageLinkText ) {
+ $languageLinkParts = explode( ':', $languageLinkText, 2 );
+ $class = 'interwiki-' . $languageLinkParts[0];
+ unset( $languageLinkParts );
+ $languageLinkTitle = Title::newFromText( $languageLinkText );
+ if ( $languageLinkTitle ) {
+ $ilInterwikiCode = $languageLinkTitle->getInterwiki();
+ $ilLangName = Language::fetchLanguageName( $ilInterwikiCode );
+
if ( strval( $ilLangName ) === '' ) {
- $ilLangName = $l;
+ $ilLangName = $languageLinkText;
} else {
- $ilLangName = $this->getLanguage()->ucfirst( $ilLangName );
+ $ilLangName = $this->formatLanguageName( $ilLangName );
}
+
$language_urls[] = array(
- 'href' => $nt->getFullURL(),
+ 'href' => $languageLinkTitle->getFullURL(),
'text' => $ilLangName,
- 'title' => $nt->getText(),
+ 'title' => $languageLinkTitle->getText(),
'class' => $class,
- 'lang' => $nt->getInterwiki(),
- 'hreflang' => $nt->getInterwiki(),
+ 'lang' => $ilInterwikiCode,
+ 'hreflang' => $ilInterwikiCode
);
}
}
@@ -499,6 +502,18 @@ class SkinTemplate extends Skin {
}
/**
+ * Format language name for use in sidebar interlanguage links list.
+ * By default it is capitalized.
+ *
+ * @param string $name Language name, e.g. "English" or "español"
+ * @return string
+ * @private
+ */
+ function formatLanguageName( $name ) {
+ return $this->getLanguage()->ucfirst( $name );
+ }
+
+ /**
* Output the string, or print error message if it's
* an error object of the appropriate type.
* For the base class, assume strings all around.
@@ -511,7 +526,7 @@ class SkinTemplate extends Skin {
}
/**
- * Output a boolean indiciating if buildPersonalUrls should output separate
+ * Output a boolean indicating if buildPersonalUrls should output separate
* login and create account links or output a combined link
* By default we simply return a global config setting that affects most skins
* This is setup as a method so that like with $wgLogo and getLogo() a skin
@@ -529,6 +544,8 @@ class SkinTemplate extends Skin {
* @return array
*/
protected function buildPersonalUrls() {
+ global $wgSecureLogin;
+
$title = $this->getTitle();
$request = $this->getRequest();
$pageurl = $title->getLocalURL();
@@ -541,7 +558,11 @@ class SkinTemplate extends Skin {
# $this->getTitle() will just give Special:Badtitle, which is
# not especially useful as a returnto parameter. Use the title
# from the request instead, if there was one.
- $page = Title::newFromURL( $request->getVal( 'title', '' ) );
+ if ( $this->getUser()->isAllowed( 'read' ) ) {
+ $page = $this->getTitle();
+ } else {
+ $page = Title::newFromText( $request->getVal( 'title', '' ) );
+ }
$page = $request->getVal( 'returnto', $page );
$a = array();
if ( strval( $page ) !== '' ) {
@@ -551,7 +572,12 @@ class SkinTemplate extends Skin {
$a['returntoquery'] = $query;
}
}
- $returnto = wfArrayToCGI( $a );
+
+ if ( $wgSecureLogin && $request->detectProtocol() === 'https' ) {
+ $a['wpStickHTTPS'] = true;
+ }
+
+ $returnto = wfArrayToCgi( $a );
if( $this->loggedin ) {
$personal_urls['userpage'] = array(
'text' => $this->username,
@@ -620,7 +646,6 @@ class SkinTemplate extends Skin {
$is_signup = $request->getText( 'type' ) == 'signup';
# anonlogin & login are the same
- global $wgSecureLogin;
$proto = $wgSecureLogin ? PROTO_HTTPS : null;
$login_id = $this->showIPinHeader() ? 'anonlogin' : 'login';
@@ -668,12 +693,14 @@ class SkinTemplate extends Skin {
}
/**
- * TODO document
- * @param $title Title
- * @param $message String message key
- * @param $selected Bool
- * @param $query String
- * @param $checkEdit Bool
+ * Builds an array with tab definition
+ *
+ * @param Title $title page where the tab links to
+ * @param string|array $message message key or an array of message keys (will fall back)
+ * @param boolean $selected display the tab as selected
+ * @param string $query query string attached to tab URL
+ * @param boolean $checkEdit check if $title exists and mark with .new if one doesn't
+ *
* @return array
*/
function tabAction( $title, $message, $selected, $query = '', $checkEdit = false ) {
@@ -683,7 +710,11 @@ class SkinTemplate extends Skin {
}
if( $checkEdit && !$title->isKnown() ) {
$classes[] = 'new';
- $query = 'action=edit&redlink=1';
+ if ( $query !== '' ) {
+ $query = 'action=edit&redlink=1&' . $query;
+ } else {
+ $query = 'action=edit&redlink=1';
+ }
}
// wfMessageFallback will nicely accept $message as an array of fallbacks
@@ -748,7 +779,7 @@ class SkinTemplate extends Skin {
* variants: Used to list the language variants for the page
*
* Each section's value is a key/value array of links for that section.
- * The links themseves have these common keys:
+ * The links themselves have these common keys:
* - class: The css classes to apply to the tab
* - text: The text to display on the tab
* - href: The href for the tab to point to
@@ -935,7 +966,7 @@ class SkinTemplate extends Skin {
}
}
- if ( $title->getNamespace() !== NS_MEDIAWIKI && $title->quickUserCan( 'protect', $user ) ) {
+ if ( $title->getNamespace() !== NS_MEDIAWIKI && $title->quickUserCan( 'protect', $user ) && $title->getRestrictionTypes() ) {
$mode = $title->isProtected() ? 'unprotect' : 'protect';
$content_navigation['actions'][$mode] = array(
'class' => ( $onPage && $action == $mode ) ? 'selected' : false,
@@ -980,6 +1011,12 @@ class SkinTemplate extends Skin {
// Gets preferred variant (note that user preference is
// only possible for wiki content language variant)
$preferred = $pageLang->getPreferredVariant();
+ if ( Action::getActionName( $this ) === 'view' ) {
+ $params = $request->getQueryValues();
+ unset( $params['title'] );
+ } else {
+ $params = array();
+ }
// Loops over each variant
foreach( $variants as $code ) {
// Gets variant name from language code
@@ -993,7 +1030,7 @@ class SkinTemplate extends Skin {
$content_navigation['variants'][] = array(
'class' => ( $code == $preferred ) ? 'selected' : false,
'text' => $varname,
- 'href' => $title->getLocalURL( array( 'variant' => $code ) ),
+ 'href' => $title->getLocalURL( array( 'variant' => $code ) + $params ),
'lang' => $code,
'hreflang' => $code
);
@@ -1014,7 +1051,7 @@ class SkinTemplate extends Skin {
}
// Equiv to SkinTemplateContentActions
- wfRunHooks( 'SkinTemplateNavigation::Universal', array( &$this, &$content_navigation ) );
+ wfRunHooks( 'SkinTemplateNavigation::Universal', array( &$this, &$content_navigation ) );
// Setup xml ids and tooltip info
foreach ( $content_navigation as $section => &$links ) {
@@ -1036,8 +1073,8 @@ class SkinTemplate extends Skin {
# We don't want to give the watch tab an accesskey if the
# page is being edited, because that conflicts with the
# accesskey on the watch checkbox. We also don't want to
- # give the edit tab an accesskey, because that's fairly su-
- # perfluous and conflicts with an accesskey (Ctrl-E) often
+ # give the edit tab an accesskey, because that's fairly
+ # superfluous and conflicts with an accesskey (Ctrl-E) often
# used for editing in Safari.
if ( in_array( $action, array( 'edit', 'submit' ) ) ) {
if ( isset( $content_navigation['views']['edit'] ) ) {
@@ -1130,12 +1167,14 @@ class SkinTemplate extends Skin {
$nav_urls['print'] = false;
$nav_urls['permalink'] = false;
+ $nav_urls['info'] = false;
$nav_urls['whatlinkshere'] = false;
$nav_urls['recentchangeslinked'] = false;
$nav_urls['contributions'] = false;
$nav_urls['log'] = false;
$nav_urls['blockip'] = false;
$nav_urls['emailuser'] = false;
+ $nav_urls['userrights'] = false;
// A print stylesheet is attached to all pages, but nobody ever
// figures that out. :) Add a link...
@@ -1166,6 +1205,12 @@ class SkinTemplate extends Skin {
$nav_urls['whatlinkshere'] = array(
'href' => SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage )->getLocalUrl()
);
+
+ $nav_urls['info'] = array(
+ 'text' => $this->msg( 'pageinfo-toolboxlink' )->text(),
+ 'href' => $this->getTitle()->getLocalURL( "action=info" )
+ );
+
if ( $this->getTitle()->getArticleID() ) {
$nav_urls['recentchangeslinked'] = array(
'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalUrl()
@@ -1178,6 +1223,7 @@ class SkinTemplate extends Skin {
$rootUser = $user->getName();
$nav_urls['contributions'] = array(
+ 'text' => $this->msg( 'contributions', $rootUser )->text(),
'href' => self::makeSpecialUrlSubpage( 'Contributions', $rootUser )
);
@@ -1196,6 +1242,13 @@ class SkinTemplate extends Skin {
'href' => self::makeSpecialUrlSubpage( 'Emailuser', $rootUser )
);
}
+
+ $sur = new UserrightsPage;
+ if ( $sur->userCanExecute( $this->getUser() ) ) {
+ $nav_urls['userrights'] = array(
+ 'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
+ );
+ }
}
wfProfileOut( __METHOD__ );
@@ -1225,7 +1278,7 @@ abstract class QuickTemplate {
/**
* Constructor
*/
- public function QuickTemplate() {
+ function __construct() {
$this->data = array();
$this->translator = new MediaWiki_I18N();
}
@@ -1344,7 +1397,7 @@ abstract class BaseTemplate extends QuickTemplate {
/**
* Get a Message object with its context set
*
- * @param $name string message name
+ * @param string $name message name
* @return Message
*/
public function getMsg( $name ) {
@@ -1366,7 +1419,7 @@ abstract class BaseTemplate extends QuickTemplate {
/**
* Create an array of common toolbox items from the data in the quicktemplate
* stored by SkinTemplate.
- * The resulting array is built acording to a format intended to be passed
+ * The resulting array is built according to a format intended to be passed
* through makeListItem to generate the html.
* @return array
*/
@@ -1394,7 +1447,7 @@ abstract class BaseTemplate extends QuickTemplate {
$toolbox['feeds']['links'][$key]['class'] = 'feedlink';
}
}
- foreach ( array( 'contributions', 'log', 'blockip', 'emailuser', 'upload', 'specialpages' ) as $special ) {
+ foreach ( array( 'contributions', 'log', 'blockip', 'emailuser', 'userrights', 'upload', 'specialpages' ) as $special ) {
if ( isset( $this->data['nav_urls'][$special] ) && $this->data['nav_urls'][$special] ) {
$toolbox[$special] = $this->data['nav_urls'][$special];
$toolbox[$special]['id'] = "t-$special";
@@ -1417,6 +1470,11 @@ abstract class BaseTemplate extends QuickTemplate {
$toolbox['permalink']['id'] = 't-permalink';
}
}
+ if ( isset( $this->data['nav_urls']['info'] ) && $this->data['nav_urls']['info'] ) {
+ $toolbox['info'] = $this->data['nav_urls']['info'];
+ $toolbox['info']['id'] = 't-info';
+ }
+
wfRunHooks( 'BaseTemplateToolbox', array( &$this, &$toolbox ) );
wfProfileOut( __METHOD__ );
return $toolbox;
@@ -1425,7 +1483,7 @@ abstract class BaseTemplate extends QuickTemplate {
/**
* Create an array of personal tools items from the data in the quicktemplate
* stored by SkinTemplate.
- * The resulting array is built acording to a format intended to be passed
+ * The resulting array is built according to a format intended to be passed
* through makeListItem to generate the html.
* This is in reality the same list as already stored in personal_urls
* however it is reformatted so that you can just pass the individual items
@@ -1588,9 +1646,9 @@ abstract class BaseTemplate extends QuickTemplate {
* Makes a link, usually used by makeListItem to generate a link for an item
* in a list used in navigation lists, portlets, portals, sidebars, etc...
*
- * @param $key string usually a key from the list you are generating this
+ * @param string $key usually a key from the list you are generating this
* link from.
- * @param $item array contains some of a specific set of keys.
+ * @param array $item contains some of a specific set of keys.
*
* The text of the link will be generated either from the contents of the
* "text" key in the $item array, if a "msg" key is present a message by
@@ -1607,7 +1665,7 @@ abstract class BaseTemplate extends QuickTemplate {
*
* If you don't want an accesskey, set $item['tooltiponly'] = true;
*
- * @param $options array can be used to affect the output of a link.
+ * @param array $options can be used to affect the output of a link.
* Possible options are:
* - 'text-wrapper' key to specify a list of elements to wrap the text of
* a link in. This should be an array of arrays containing a 'tag' and
@@ -1720,7 +1778,7 @@ abstract class BaseTemplate extends QuickTemplate {
foreach ( array( 'id', 'class', 'active', 'tag' ) as $k ) {
unset( $link[$k] );
}
- if ( isset( $item['id'] ) ) {
+ if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) {
// The id goes on the <li> not on the <a> for single links
// but makeSidebarLink still needs to know what id to use when
// generating tooltips and accesskeys.
@@ -1783,11 +1841,15 @@ abstract class BaseTemplate extends QuickTemplate {
);
unset( $buttonAttrs['src'] );
unset( $buttonAttrs['alt'] );
+ unset( $buttonAttrs['width'] );
+ unset( $buttonAttrs['height'] );
$imgAttrs = array(
'src' => $attrs['src'],
'alt' => isset( $attrs['alt'] )
? $attrs['alt']
: $this->translator->translate( 'searchbutton' ),
+ 'width' => isset( $attrs['width'] ) ? $attrs['width'] : null,
+ 'height' => isset( $attrs['height'] ) ? $attrs['height'] : null,
);
return Html::rawElement( 'button', $buttonAttrs, Html::element( 'img', $imgAttrs ) );
default:
diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php
index 2e5e02b0..c32738f8 100644
--- a/includes/SpecialPage.php
+++ b/includes/SpecialPage.php
@@ -106,19 +106,6 @@ class SpecialPage {
}
/**
- * Add a page to the list of valid special pages. This used to be the preferred
- * method for adding special pages in extensions. It's now suggested that you add
- * an associative record to $wgSpecialPages. This avoids autoloading SpecialPage.
- *
- * @param $page SpecialPage
- * @deprecated since 1.7, warnings in 1.17, might be removed in 1.20
- */
- static function addPage( &$page ) {
- wfDeprecated( __METHOD__, '1.7' );
- SpecialPageFactory::getList()->{$page->mName} = $page;
- }
-
- /**
* Add a page to a certain display group for Special:SpecialPages
*
* @param $page Mixed: SpecialPage or string
@@ -148,7 +135,7 @@ class SpecialPage {
* preferred method is now to add a SpecialPage_initList hook.
* @deprecated since 1.18
*
- * @param $name String the page to remove
+ * @param string $name the page to remove
*/
static function removePage( $name ) {
wfDeprecated( __METHOD__, '1.18' );
@@ -158,7 +145,7 @@ class SpecialPage {
/**
* Check if a given name exist as a special page or as a special page alias
*
- * @param $name String: name of a special page
+ * @param string $name name of a special page
* @return Boolean: true if a special page exists with this name
* @deprecated since 1.18 call SpecialPageFactory method directly
*/
@@ -266,13 +253,15 @@ class SpecialPage {
* Get a localised Title object for a specified special page name
*
* @param $name String
- * @param $subpage String|Bool subpage string, or false to not use a subpage
+ * @param string|Bool $subpage subpage string, or false to not use a subpage
+ * @param string $fragment the link fragment (after the "#")
+ * @throws MWException
* @return Title object
*/
- public static function getTitleFor( $name, $subpage = false ) {
+ public static function getTitleFor( $name, $subpage = false, $fragment = '' ) {
$name = SpecialPageFactory::getLocalNameFor( $name, $subpage );
if ( $name ) {
- return Title::makeTitle( NS_SPECIAL, $name );
+ return Title::makeTitle( NS_SPECIAL, $name, $fragment );
} else {
throw new MWException( "Invalid special page name \"$name\"" );
}
@@ -282,7 +271,7 @@ class SpecialPage {
* Get a localised Title object for a page name with a possibly unvalidated subpage
*
* @param $name String
- * @param $subpage String|Bool subpage string, or false to not use a subpage
+ * @param string|Bool $subpage subpage string, or false to not use a subpage
* @return Title object or null if the page doesn't exist
*/
public static function getSafeTitleFor( $name, $subpage = false ) {
@@ -313,15 +302,15 @@ class SpecialPage {
* be displayed by the default execute() method, without the global function ever
* being called.
*
- * If you override execute(), you can recover the default behaviour with userCanExecute()
+ * If you override execute(), you can recover the default behavior with userCanExecute()
* and displayRestrictionError()
*
- * @param $name String: name of the special page, as seen in links and URLs
- * @param $restriction String: user right required, e.g. "block" or "delete"
- * @param $listed Bool: whether the page is listed in Special:Specialpages
+ * @param string $name name of the special page, as seen in links and URLs
+ * @param string $restriction user right required, e.g. "block" or "delete"
+ * @param bool $listed whether the page is listed in Special:Specialpages
* @param $function Callback|Bool: function called by execute(). By default it is constructed from $name
- * @param $file String: file which is included by execute(). It is also constructed from $name by default
- * @param $includable Bool: whether the page can be included in normal pages
+ * @param string $file file which is included by execute(). It is also constructed from $name by default
+ * @param bool $includable whether the page can be included in normal pages
*/
public function __construct(
$name = '', $restriction = '', $listed = true,
@@ -333,12 +322,12 @@ class SpecialPage {
/**
* Do the real work for the constructor, mainly so __call() can intercept
* calls to SpecialPage()
- * @param $name String: name of the special page, as seen in links and URLs
- * @param $restriction String: user right required, e.g. "block" or "delete"
- * @param $listed Bool: whether the page is listed in Special:Specialpages
+ * @param string $name name of the special page, as seen in links and URLs
+ * @param string $restriction user right required, e.g. "block" or "delete"
+ * @param bool $listed whether the page is listed in Special:Specialpages
* @param $function Callback|Bool: function called by execute(). By default it is constructed from $name
- * @param $file String: file which is included by execute(). It is also constructed from $name by default
- * @param $includable Bool: whether the page can be included in normal pages
+ * @param string $file file which is included by execute(). It is also constructed from $name by default
+ * @param bool $includable whether the page can be included in normal pages
*/
private function init( $name, $restriction, $listed, $function, $file, $includable ) {
$this->mName = $name;
@@ -361,8 +350,9 @@ class SpecialPage {
* Use PHP's magic __call handler to get calls to the old PHP4 constructor
* because PHP E_STRICT yells at you for having __construct() and SpecialPage()
*
- * @param $fName String Name of called method
- * @param $a Array Arguments to the method
+ * @param string $fName Name of called method
+ * @param array $a Arguments to the method
+ * @throws MWException
* @deprecated since 1.17, call parent::__construct()
*/
public function __call( $fName, $a ) {
@@ -525,6 +515,19 @@ class SpecialPage {
}
/**
+ * Is this page cached?
+ * Expensive pages are cached or disabled in miser mode.
+ * Used by QueryPage and subclasses, moved here so that
+ * Special:SpecialPages can safely call it for all special pages.
+ *
+ * @return Boolean
+ * @since 1.21
+ */
+ public function isCached() {
+ return false;
+ }
+
+ /**
* Can be overridden by subclasses with more complicated permissions
* schemes.
*
@@ -532,9 +535,8 @@ class SpecialPage {
* pages?
*/
public function isRestricted() {
- global $wgGroupPermissions;
// DWIM: If all anons can do something, then it is not restricted
- return $this->mRestriction != '' && empty( $wgGroupPermissions['*'][$this->mRestriction] );
+ return $this->mRestriction != '' && !User::groupHasPermission( '*', $this->mRestriction );
}
/**
@@ -596,7 +598,7 @@ class SpecialPage {
*
* @param $subPage string|null
*/
- public final function run( $subPage ) {
+ final public function run( $subPage ) {
/**
* Gets called before @see SpecialPage::execute.
*
@@ -668,10 +670,10 @@ class SpecialPage {
/**
* Outputs a summary message on top of special pages
* Per default the message key is the canonical name of the special page
- * May be overriden, i.e. by extensions to stick with the naming conventions
+ * May be overridden, i.e. by extensions to stick with the naming conventions
* for message keys: 'extensionname-xxx'
*
- * @param $summaryMessageKey String: message key of the summary
+ * @param string $summaryMessageKey message key of the summary
*/
function outputHeader( $summaryMessageKey = '' ) {
global $wgContLang;
@@ -693,7 +695,7 @@ class SpecialPage {
* also the name that will be listed in Special:Specialpages
*
* Derived classes can override this, but usually it is easier to keep the
- * default behaviour. Messages can be added at run-time, see
+ * default behavior. Messages can be added at run-time, see
* MessageCache.php.
*
* @return String
@@ -825,7 +827,7 @@ class SpecialPage {
// RequestContext passes context to wfMessage, and the language is set from
// the context, but setting the language for Message class removes the
// interface message status, which breaks for example usernameless gender
- // invokations. Restore the flag when not including special page in content.
+ // invocations. Restore the flag when not including special page in content.
if ( $this->including() ) {
$message->setInterfaceMessageFlag( false );
}
@@ -844,10 +846,61 @@ class SpecialPage {
foreach ( $wgFeedClasses as $format => $class ) {
$theseParams = $params + array( 'feedformat' => $format );
- $url = $feedTemplate . wfArrayToCGI( $theseParams );
+ $url = $feedTemplate . wfArrayToCgi( $theseParams );
$this->getOutput()->addFeedLink( $format, $url );
}
}
+
+ /**
+ * Get the group that the special page belongs in on Special:SpecialPage
+ * Use this method, instead of getGroupName to allow customization
+ * of the group name from the wiki side
+ *
+ * @return string Group of this special page
+ * @since 1.21
+ */
+ public function getFinalGroupName() {
+ global $wgSpecialPageGroups;
+ $name = $this->getName();
+ $group = '-';
+
+ // Allow overbidding the group from the wiki side
+ $msg = $this->msg( 'specialpages-specialpagegroup-' . strtolower( $name ) )->inContentLanguage();
+ if ( !$msg->isBlank() ) {
+ $group = $msg->text();
+ } else {
+ // Than use the group from this object
+ $group = $this->getGroupName();
+
+ // Group '-' is used as default to have the chance to determine,
+ // if the special pages overrides this method,
+ // if not overridden, $wgSpecialPageGroups is checked for b/c
+ if ( $group === '-' && isset( $wgSpecialPageGroups[$name] ) ) {
+ $group = $wgSpecialPageGroups[$name];
+ }
+ }
+
+ // never give '-' back, change to 'other'
+ if ( $group === '-' ) {
+ $group = 'other';
+ }
+
+ return $group;
+ }
+
+ /**
+ * Under which header this special page is listed in Special:SpecialPages
+ * See messages 'specialpages-group-*' for valid names
+ * This method defaults to group 'other'
+ *
+ * @return string
+ * @since 1.21
+ */
+ protected function getGroupName() {
+ // '-' used here to determine, if this group is overridden or has a hardcoded 'other'
+ // Needed for b/c in getFinalGroupName
+ return '-';
+ }
}
/**
@@ -861,7 +914,7 @@ abstract class FormSpecialPage extends SpecialPage {
* Get an HTMLForm descriptor array
* @return Array
*/
- protected abstract function getFormFields();
+ abstract protected function getFormFields();
/**
* Add pre- or post-text to the form
@@ -877,22 +930,32 @@ abstract class FormSpecialPage extends SpecialPage {
protected function alterForm( HTMLForm $form ) {}
/**
- * Get the HTMLForm to control behaviour
+ * Get message prefix for HTMLForm
+ *
+ * @since 1.21
+ * @return string
+ */
+ protected function getMessagePrefix() {
+ return strtolower( $this->getName() );
+ }
+
+ /**
+ * Get the HTMLForm to control behavior
* @return HTMLForm|null
*/
protected function getForm() {
$this->fields = $this->getFormFields();
- $form = new HTMLForm( $this->fields, $this->getContext() );
+ $form = new HTMLForm( $this->fields, $this->getContext(), $this->getMessagePrefix() );
$form->setSubmitCallback( array( $this, 'onSubmit' ) );
- $form->setWrapperLegend( $this->msg( strtolower( $this->getName() ) . '-legend' ) );
+ $form->setWrapperLegend( $this->msg( $this->getMessagePrefix() . '-legend' ) );
$form->addHeaderText(
- $this->msg( strtolower( $this->getName() ) . '-text' )->parseAsBlock() );
+ $this->msg( $this->getMessagePrefix() . '-text' )->parseAsBlock() );
// Retain query parameters (uselang etc)
$params = array_diff_key(
$this->getRequest()->getQueryValues(), array( 'title' => null ) );
- $form->addHiddenField( 'redirectparams', wfArrayToCGI( $params ) );
+ $form->addHiddenField( 'redirectparams', wfArrayToCgi( $params ) );
$form->addPreText( $this->preText() );
$form->addPostText( $this->postText() );
@@ -909,18 +972,18 @@ abstract class FormSpecialPage extends SpecialPage {
* @param $data Array
* @return Bool|Array true for success, false for didn't-try, array of errors on failure
*/
- public abstract function onSubmit( array $data );
+ abstract public function onSubmit( array $data );
/**
* Do something exciting on successful processing of the form, most likely to show a
* confirmation message
*/
- public abstract function onSuccess();
+ abstract public function onSuccess();
/**
* Basic SpecialPage workflow: get a form, send it to the user; get some data back,
*
- * @param $par String Subpage string if one was specified
+ * @param string $par Subpage string if one was specified
*/
public function execute( $par ) {
$this->setParameter( $par );
@@ -945,8 +1008,8 @@ abstract class FormSpecialPage extends SpecialPage {
* Called from execute() to check if the given user can perform this action.
* Failures here must throw subclasses of ErrorPageError.
* @param $user User
+ * @throws UserBlockedError
* @return Bool true
- * @throws ErrorPageError
*/
protected function checkExecutePermissions( User $user ) {
$this->checkPermissions();
@@ -1019,7 +1082,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
// Query parameters that can be passed through redirects
protected $mAllowedRedirectParams = array();
- // Query parameteres added by redirects
+ // Query parameters added by redirects
protected $mAddedRedirectParams = array();
public function execute( $par ) {
@@ -1029,14 +1092,12 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
if ( $redirect instanceof Title ) {
$url = $redirect->getFullUrl( $query );
$this->getOutput()->redirect( $url );
- wfProfileOut( __METHOD__ );
return $redirect;
// Redirect to index.php with query parameters
} elseif ( $redirect === true ) {
global $wgScript;
- $url = $wgScript . '?' . wfArrayToCGI( $query );
+ $url = $wgScript . '?' . wfArrayToCgi( $query );
$this->getOutput()->redirect( $url );
- wfProfileOut( __METHOD__ );
return $redirect;
} else {
$class = __CLASS__;
@@ -1048,7 +1109,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
* If the special page is a redirect, then get the Title object it redirects to.
* False otherwise.
*
- * @param $par String Subpage string
+ * @param string $par Subpage string
* @return Title|bool
*/
abstract public function getRedirect( $par );
@@ -1130,7 +1191,7 @@ class SpecialCreateAccount extends SpecialRedirectToSpecial {
}
/**
* SpecialMypage, SpecialMytalk and SpecialMycontributions special pages
- * are used to get user independant links pointing to the user page, talk
+ * are used to get user independent links pointing to the user page, talk
* page and list of contributions.
* This can let us cache a single copy of any generated content for all
* users.
@@ -1221,7 +1282,7 @@ abstract class RedirectSpecialArticle extends RedirectSpecialPage {
'ctype', 'maxage', 'smaxage',
);
- wfRunHooks( "RedirectSpecialArticleRedirectParams", array(&$redirectParams) );
+ wfRunHooks( "RedirectSpecialArticleRedirectParams", array( &$redirectParams ) );
$this->mAllowedRedirectParams = $redirectParams;
}
}
@@ -1268,7 +1329,7 @@ class SpecialMytalk extends RedirectSpecialArticle {
*/
class SpecialMycontributions extends RedirectSpecialPage {
function __construct() {
- parent::__construct( 'Mycontributions' );
+ parent::__construct( 'Mycontributions' );
$this->mAllowedRedirectParams = array( 'limit', 'namespace', 'tagfilter',
'offset', 'dir', 'year', 'month', 'feed' );
}
diff --git a/includes/SpecialPageFactory.php b/includes/SpecialPageFactory.php
index 95f75a8e..7368ab77 100644
--- a/includes/SpecialPageFactory.php
+++ b/includes/SpecialPageFactory.php
@@ -80,6 +80,7 @@ class SpecialPageFactory {
'Categories' => 'SpecialCategories',
'Disambiguations' => 'DisambiguationsPage',
'Listredirects' => 'ListredirectsPage',
+ 'PagesWithProp' => 'SpecialPagesWithProp',
// Login/create account
'Userlogin' => 'LoginForm',
@@ -95,7 +96,7 @@ class SpecialPageFactory {
'Preferences' => 'SpecialPreferences',
'Contributions' => 'SpecialContributions',
'Listgrouprights' => 'SpecialListGroupRights',
- 'Listusers' => 'SpecialListUsers' ,
+ 'Listusers' => 'SpecialListUsers',
'Listadmins' => 'SpecialListAdmins',
'Listbots' => 'SpecialListBots',
'Activeusers' => 'SpecialActiveUsers',
@@ -119,7 +120,7 @@ class SpecialPageFactory {
'Upload' => 'SpecialUpload',
'UploadStash' => 'SpecialUploadStash',
- // Wiki data and tools
+ // Data and tools
'Statistics' => 'SpecialStatistics',
'Allmessages' => 'SpecialAllmessages',
'Version' => 'SpecialVersion',
@@ -155,7 +156,6 @@ class SpecialPageFactory {
'Blankpage' => 'SpecialBlankpage',
'Blockme' => 'SpecialBlockme',
'Emailuser' => 'SpecialEmailUser',
- 'JavaScriptTest' => 'SpecialJavaScriptTest',
'Movepage' => 'MovePageForm',
'Mycontributions' => 'SpecialMycontributions',
'Mypage' => 'SpecialMypage',
@@ -178,7 +178,7 @@ class SpecialPageFactory {
static function getList() {
global $wgSpecialPages;
global $wgDisableCounters, $wgDisableInternalSearch, $wgEmailAuthentication;
- global $wgEnableEmail;
+ global $wgEnableEmail, $wgEnableJavaScriptTest;
if ( !is_object( self::$mList ) ) {
wfProfileIn( __METHOD__ );
@@ -200,6 +200,10 @@ class SpecialPageFactory {
self::$mList['ChangeEmail'] = 'SpecialChangeEmail';
}
+ if( $wgEnableJavaScriptTest ) {
+ self::$mList['JavaScriptTest'] = 'SpecialJavaScriptTest';
+ }
+
// Add extension special pages
self::$mList = array_merge( self::$mList, $wgSpecialPages );
@@ -218,7 +222,7 @@ class SpecialPageFactory {
/**
* Initialise and return the list of special page aliases. Returns an object with
* properties which can be accessed $obj->pagename - each property is an array of
- * aliases; the first in the array is the cannonical alias. All registered special
+ * aliases; the first in the array is the canonical alias. All registered special
* pages are guaranteed to have a property entry, and for that property array to
* contain at least one entry (English fallbacks will be added if necessary).
* @return Object
@@ -282,8 +286,11 @@ class SpecialPageFactory {
*
* @param $page Mixed: SpecialPage or string
* @param $group String
+ * @deprecated 1.21 Override SpecialPage::getGroupName
*/
public static function setGroup( $page, $group ) {
+ wfDeprecated( __METHOD__, '1.21' );
+
global $wgSpecialPageGroups;
$name = is_object( $page ) ? $page->getName() : $page;
$wgSpecialPageGroups[$name] = $group;
@@ -294,34 +301,18 @@ class SpecialPageFactory {
*
* @param $page SpecialPage
* @return String
+ * @deprecated 1.21 Use SpecialPage::getFinalGroupName
*/
public static function getGroup( &$page ) {
- $name = $page->getName();
+ wfDeprecated( __METHOD__, '1.21' );
- global $wgSpecialPageGroups;
- static $specialPageGroupsCache = array();
- if ( isset( $specialPageGroupsCache[$name] ) ) {
- return $specialPageGroupsCache[$name];
- }
- $msg = wfMessage( 'specialpages-specialpagegroup-' . strtolower( $name ) );
- if ( !$msg->isBlank() ) {
- $group = $msg->text();
- } else {
- $group = isset( $wgSpecialPageGroups[$name] )
- ? $wgSpecialPageGroups[$name]
- : '-';
- }
- if ( $group == '-' ) {
- $group = 'other';
- }
- $specialPageGroupsCache[$name] = $group;
- return $group;
+ return $page->getFinalGroupName();
}
/**
* Check if a given name exist as a special page or as a special page alias
*
- * @param $name String: name of a special page
+ * @param string $name name of a special page
* @return Boolean: true if a special page exists with this name
*/
public static function exists( $name ) {
@@ -332,8 +323,8 @@ class SpecialPageFactory {
/**
* Find the object with a given name and return it (or NULL)
*
- * @param $name String Special page name, may be localised and/or an alias
- * @return SpecialPage object or null if the page doesn't exist
+ * @param string $name Special page name, may be localised and/or an alias
+ * @return SpecialPage|null SpecialPage object or null if the page doesn't exist
*/
public static function getPage( $name ) {
list( $realName, /*...*/ ) = self::resolveAlias( $name );
@@ -370,11 +361,13 @@ class SpecialPageFactory {
}
foreach ( self::getList() as $name => $rec ) {
$page = self::getPage( $name );
- if ( $page // not null
- && $page->isListed()
- && ( !$page->isRestricted() || $page->userCanExecute( $user ) )
- ) {
- $pages[$name] = $page;
+ if ( $page ) { // not null
+ $page->setContext( RequestContext::getMain() );
+ if ( $page->isListed()
+ && ( !$page->isRestricted() || $page->userCanExecute( $user ) )
+ ) {
+ $pages[$name] = $page;
+ }
}
}
return $pages;
@@ -471,7 +464,7 @@ class SpecialPageFactory {
if ( $name != $page->getLocalName() && !$context->getRequest()->wasPosted() ) {
$query = $context->getRequest()->getQueryValues();
unset( $query['title'] );
- $query = wfArrayToCGI( $query );
+ $query = wfArrayToCgi( $query );
$title = $page->getTitle( $par );
$url = $title->getFullUrl( $query );
$context->getOutput()->redirect( $url );
diff --git a/includes/SqlDataUpdate.php b/includes/SqlDataUpdate.php
index 52c9be00..79dcdc59 100644
--- a/includes/SqlDataUpdate.php
+++ b/includes/SqlDataUpdate.php
@@ -48,7 +48,7 @@ abstract class SqlDataUpdate extends DataUpdate {
public function __construct( $withTransaction = true ) {
global $wgAntiLockFlags;
- parent::__construct( );
+ parent::__construct();
if ( $wgAntiLockFlags & ALF_NO_LINK_LOCK ) {
$this->mOptions = array();
@@ -76,7 +76,7 @@ abstract class SqlDataUpdate extends DataUpdate {
// NOTE: nested transactions are not supported, only start a transaction if none is open
if ( $this->mDb->trxLevel() === 0 ) {
- $this->mDb->begin( get_class( $this ) . '::beginTransaction' );
+ $this->mDb->begin( get_class( $this ) . '::beginTransaction' );
$this->mHasTransaction = true;
}
}
@@ -95,7 +95,7 @@ abstract class SqlDataUpdate extends DataUpdate {
* Abort the database transaction started via beginTransaction (if any).
*/
public function abortTransaction() {
- if ( $this->mHasTransaction ) {
+ if ( $this->mHasTransaction ) { //XXX: actually... maybe always?
$this->mDb->rollback( get_class( $this ) . '::abortTransaction' );
$this->mHasTransaction = false;
}
@@ -108,8 +108,8 @@ abstract class SqlDataUpdate extends DataUpdate {
* @param $namespace Integer
* @param $dbkeys Array
*/
- protected function invalidatePages( $namespace, Array $dbkeys ) {
- if ( !count( $dbkeys ) ) {
+ protected function invalidatePages( $namespace, array $dbkeys ) {
+ if ( $dbkeys === array() ) {
return;
}
@@ -127,10 +127,12 @@ abstract class SqlDataUpdate extends DataUpdate {
'page_touched < ' . $this->mDb->addQuotes( $now )
), __METHOD__
);
+
foreach ( $res as $row ) {
$ids[] = $row->page_id;
}
- if ( !count( $ids ) ) {
+
+ if ( $ids === array() ) {
return;
}
diff --git a/includes/SquidPurgeClient.php b/includes/SquidPurgeClient.php
index 8eb0f6bf..f5fd1950 100644
--- a/includes/SquidPurgeClient.php
+++ b/includes/SquidPurgeClient.php
@@ -21,9 +21,9 @@
*/
/**
- * An HTTP 1.0 client built for the purposes of purging Squid and Varnish.
- * Uses asynchronous I/O, allowing purges to be done in a highly parallel
- * manner.
+ * An HTTP 1.0 client built for the purposes of purging Squid and Varnish.
+ * Uses asynchronous I/O, allowing purges to be done in a highly parallel
+ * manner.
*
* Could be replaced by curl_multi_exec() or some such.
*/
@@ -123,7 +123,7 @@ class SquidPurgeClient {
return array( $socket );
}
- /**
+ /**
* Get the host's IP address.
* Does not support IPv6 at present due to the lack of a convenient interface in PHP.
*/
@@ -176,11 +176,32 @@ class SquidPurgeClient {
* @param $url string
*/
public function queuePurge( $url ) {
+ global $wgSquidPurgeUseHostHeader;
$url = SquidUpdate::expand( str_replace( "\n", '', $url ) );
- $this->requests[] = "PURGE $url HTTP/1.0\r\n" .
- "Connection: Keep-Alive\r\n" .
- "Proxy-Connection: Keep-Alive\r\n" .
- "User-Agent: " . Http::userAgent() . ' ' . __CLASS__ . "\r\n\r\n";
+ $request = array();
+ if ( $wgSquidPurgeUseHostHeader ) {
+ $url = wfParseUrl( $url );
+ $host = $url['host'];
+ if ( isset( $url['port'] ) && strlen( $url['port'] ) > 0 ) {
+ $host .= ":" . $url['port'];
+ }
+ $path = $url['path'];
+ if ( isset( $url['query'] ) && is_string( $url['query'] ) ) {
+ $path = wfAppendQuery( $path, $url['query'] );
+ }
+ $request[] = "PURGE $path HTTP/1.1";
+ $request[] = "Host: $host";
+ } else {
+ $request[] = "PURGE $url HTTP/1.0";
+ }
+ $request[] = "Connection: Keep-Alive";
+ $request[] = "Proxy-Connection: Keep-Alive";
+ $request[] = "User-Agent: " . Http::userAgent() . ' ' . __CLASS__;
+ // Two ''s to create \r\n\r\n
+ $request[] = '';
+ $request[] = '';
+
+ $this->requests[] = implode( "\r\n", $request );
if ( $this->currentRequestIndex === null ) {
$this->nextRequest();
}
@@ -272,7 +293,7 @@ class SquidPurgeClient {
if ( count( $lines ) < 2 ) {
return 'done';
}
- if ( $this->readState == 'status' ) {
+ if ( $this->readState == 'status' ) {
$this->processStatusLine( $lines[0] );
} else { // header
$this->processHeaderLine( $lines[0] );
@@ -297,7 +318,7 @@ class SquidPurgeClient {
return 'done';
}
default:
- throw new MWException( __METHOD__.': unexpected state' );
+ throw new MWException( __METHOD__ . ': unexpected state' );
}
}
@@ -352,7 +373,7 @@ class SquidPurgeClient {
* @param $msg string
*/
protected function log( $msg ) {
- wfDebugLog( 'squid', __CLASS__." ($this->host): $msg\n" );
+ wfDebugLog( 'squid', __CLASS__ . " ($this->host): $msg\n" );
}
}
@@ -408,14 +429,14 @@ class SquidPurgeClientPool {
$numReady = socket_select( $readSockets, $writeSockets, $exceptSockets, $timeout );
wfRestoreWarnings();
if ( $numReady === false ) {
- wfDebugLog( 'squid', __METHOD__.': Error in stream_select: ' .
+ wfDebugLog( 'squid', __METHOD__ . ': Error in stream_select: ' .
socket_strerror( socket_last_error() ) . "\n" );
break;
}
// Check for timeout, use 1% tolerance since we aimed at having socket_select()
// exit at precisely the overall timeout
if ( microtime( true ) - $startTime > $this->timeout * 0.99 ) {
- wfDebugLog( 'squid', __CLASS__.": timeout ({$this->timeout}s)\n" );
+ wfDebugLog( 'squid', __CLASS__ . ": timeout ({$this->timeout}s)\n" );
break;
} elseif ( !$numReady ) {
continue;
diff --git a/includes/Status.php b/includes/Status.php
index 10dfb516..5d6236f7 100644
--- a/includes/Status.php
+++ b/includes/Status.php
@@ -47,7 +47,7 @@ class Status {
/**
* Factory function for fatal errors
*
- * @param $message String: message name
+ * @param string|Message $message message name or object
* @return Status
*/
static function newFatal( $message /*, parameters...*/ ) {
@@ -103,7 +103,7 @@ class Status {
/**
* Add a new warning
*
- * @param $message String: message name
+ * @param string|Message $message message name or object
*/
function warning( $message /*, parameters... */ ) {
$params = array_slice( func_get_args(), 1 );
@@ -117,7 +117,7 @@ class Status {
* Add an error, do not set fatal flag
* This can be used for non-fatal errors
*
- * @param $message String: message name
+ * @param string|Message $message message name or object
*/
function error( $message /*, parameters... */ ) {
$params = array_slice( func_get_args(), 1 );
@@ -131,7 +131,7 @@ class Status {
* Add an error and set OK to false, indicating that the operation
* as a whole was fatal
*
- * @param $message String: message name
+ * @param string|Message $message message name or object
*/
function fatal( $message /*, parameters... */ ) {
$params = array_slice( func_get_args(), 1 );
@@ -167,31 +167,31 @@ class Status {
/**
* Get the error list as a wikitext formatted list
*
- * @param $shortContext String: a short enclosing context message name, to
+ * @param string $shortContext a short enclosing context message name, to
* be used when there is a single error
- * @param $longContext String: a long enclosing context message name, for a list
+ * @param string $longContext a long enclosing context message name, for a list
* @return String
*/
function getWikiText( $shortContext = false, $longContext = false ) {
if ( count( $this->errors ) == 0 ) {
if ( $this->ok ) {
$this->fatal( 'internalerror_info',
- __METHOD__." called for a good result, this is incorrect\n" );
+ __METHOD__ . " called for a good result, this is incorrect\n" );
} else {
$this->fatal( 'internalerror_info',
- __METHOD__.": Invalid result object: no error text but not OK\n" );
+ __METHOD__ . ": Invalid result object: no error text but not OK\n" );
}
}
if ( count( $this->errors ) == 1 ) {
- $s = $this->getWikiTextForError( $this->errors[0], $this->errors[0] );
+ $s = $this->getErrorMessage( $this->errors[0] );
if ( $shortContext ) {
$s = wfMessage( $shortContext, $s )->plain();
} elseif ( $longContext ) {
$s = wfMessage( $longContext, "* $s\n" )->plain();
}
} else {
- $s = '* '. implode("\n* ",
- $this->getWikiTextArray( $this->errors ) ) . "\n";
+ $s = '* '. implode( "\n* ",
+ $this->getErrorMessageArray( $this->errors ) ) . "\n";
if ( $longContext ) {
$s = wfMessage( $longContext, $s )->plain();
} elseif ( $shortContext ) {
@@ -202,7 +202,7 @@ class Status {
}
/**
- * Return the wiki text for a single error.
+ * Return the message for a single error.
* @param $error Mixed With an array & two values keyed by
* 'message' and 'params', use those keys-value pairs.
* Otherwise, if its an array, just use the first value as the
@@ -210,19 +210,35 @@ class Status {
*
* @return String
*/
- protected function getWikiTextForError( $error ) {
+ protected function getErrorMessage( $error ) {
if ( is_array( $error ) ) {
- if ( isset( $error['message'] ) && isset( $error['params'] ) ) {
- return wfMessage( $error['message'],
- array_map( 'wfEscapeWikiText', $this->cleanParams( $error['params'] ) ) )->plain();
+ if( isset( $error['message'] ) && $error['message'] instanceof Message ) {
+ $msg = $error['message'];
+ } elseif ( isset( $error['message'] ) && isset( $error['params'] ) ) {
+ $msg = wfMessage( $error['message'],
+ array_map( 'wfEscapeWikiText', $this->cleanParams( $error['params'] ) ) );
} else {
- $message = array_shift($error);
- return wfMessage( $message,
- array_map( 'wfEscapeWikiText', $this->cleanParams( $error ) ) )->plain();
+ $msgName = array_shift( $error );
+ $msg = wfMessage( $msgName,
+ array_map( 'wfEscapeWikiText', $this->cleanParams( $error ) ) );
}
} else {
- return wfMessage( $error )->plain();
+ $msg = wfMessage( $error );
}
+ return $msg->plain();
+ }
+
+ /**
+ * Get the error message as HTML. This is done by parsing the wikitext error
+ * message.
+ *
+ * @note: this does not perform a full wikitext to HTML conversion, it merely applies
+ * a message transformation.
+ * @todo: figure out whether that is actually The Right Thing.
+ */
+ public function getHTML( $shortContext = false, $longContext = false ) {
+ $text = $this->getWikiText( $shortContext, $longContext );
+ return MessageCache::singleton()->transform( $text, true );
}
/**
@@ -230,8 +246,8 @@ class Status {
* @param $errors Array
* @return Array
*/
- function getWikiTextArray( $errors ) {
- return array_map( array( $this, 'getWikiTextForError' ), $errors );
+ protected function getErrorMessageArray( $errors ) {
+ return array_map( array( $this, 'getErrorMessage' ), $errors );
}
/**
@@ -278,7 +294,9 @@ class Status {
$result = array();
foreach ( $this->errors as $error ) {
if ( $error['type'] === $type ) {
- if( $error['params'] ) {
+ if( $error['message'] instanceof Message ) {
+ $result[] = $error['message'];
+ } elseif( $error['params'] ) {
$result[] = array_merge( array( $error['message'] ), $error['params'] );
} else {
$result[] = array( $error['message'] );
@@ -309,7 +327,10 @@ class Status {
/**
* Returns true if the specified message is present as a warning or error
*
- * @param $msg String: message name
+ * Note, due to the lack of tools for comparing Message objects, this
+ * function will not work when using a Message object as a parameter.
+ *
+ * @param string $msg message name
* @return Boolean
*/
function hasMessage( $msg ) {
@@ -325,9 +346,12 @@ class Status {
* If the specified source message exists, replace it with the specified
* destination message, but keep the same parameters as in the original error.
*
- * Return true if the replacement was done, false otherwise.
+ * Note, due to the lack of tools for comparing Message objects, this
+ * function will not work when using a Message object as the search parameter.
*
- * @return bool
+ * @param $source Message|String: Message key or object to search for
+ * @param $dest Message|String: Replacement message key or object
+ * @return bool Return true if the replacement was done, false otherwise.
*/
function replaceMessage( $source, $dest ) {
$replaced = false;
diff --git a/includes/StreamFile.php b/includes/StreamFile.php
index 95c69a20..f5e4acff 100644
--- a/includes/StreamFile.php
+++ b/includes/StreamFile.php
@@ -32,9 +32,10 @@ class StreamFile {
* Headers sent include: Content-type, Content-Length, Last-Modified,
* and Content-Disposition.
*
- * @param $fname string Full name and path of the file to stream
- * @param $headers array Any additional headers to send
- * @param $sendErrors bool Send error messages if errors occur (like 404)
+ * @param string $fname Full name and path of the file to stream
+ * @param array $headers Any additional headers to send
+ * @param bool $sendErrors Send error messages if errors occur (like 404)
+ * @throws MWException
* @return bool Success
*/
public static function stream( $fname, $headers = array(), $sendErrors = true ) {
@@ -70,10 +71,10 @@ class StreamFile {
* (b) cancels any PHP output buffering and automatic gzipping of output
* (c) sends Content-Length header based on HTTP_IF_MODIFIED_SINCE check
*
- * @param $path string Storage path or file system path
- * @param $info Array|bool File stat info with 'mtime' and 'size' fields
- * @param $headers Array Additional headers to send
- * @param $sendErrors bool Send error messages if errors occur (like 404)
+ * @param string $path Storage path or file system path
+ * @param array|bool $info File stat info with 'mtime' and 'size' fields
+ * @param array $headers Additional headers to send
+ * @param bool $sendErrors Send error messages if errors occur (like 404)
* @return int|bool READY_STREAM, NOT_MODIFIED, or false on failure
*/
public static function prepareForStream(
@@ -142,8 +143,8 @@ class StreamFile {
/**
* Determine the file type of a file based on the path
*
- * @param $filename string Storage path or file system path
- * @param $safe bool Whether to do retroactive upload blacklist checks
+ * @param string $filename Storage path or file system path
+ * @param bool $safe Whether to do retroactive upload blacklist checks
* @return null|string
*/
public static function contentTypeFromPath( $filename, $safe = true ) {
diff --git a/includes/StringUtils.php b/includes/StringUtils.php
index 43275a66..f4c98f1d 100644
--- a/includes/StringUtils.php
+++ b/includes/StringUtils.php
@@ -24,6 +24,51 @@
* A collection of static methods to play with strings.
*/
class StringUtils {
+
+ /**
+ * Test whether a string is valid UTF-8.
+ *
+ * The function check for invalid byte sequences, overlong encoding but
+ * not for different normalisations.
+ *
+ * This relies internally on the mbstring function mb_check_encoding()
+ * hardcoded to check against UTF-8. Whenever the function is not available
+ * we fallback to a pure PHP implementation. Setting $disableMbstring to
+ * true will skip the use of mb_check_encoding, this is mostly intended for
+ * unit testing our internal implementation.
+ *
+ * @since 1.21
+ *
+ * @param string $value String to check
+ * @param boolean $disableMbstring Whether to use the pure PHP
+ * implementation instead of trying mb_check_encoding. Intended for unit
+ * testing. Default: false
+ *
+ * @return boolean Whether the given $value is a valid UTF-8 encoded string
+ */
+ static function isUtf8( $value, $disableMbstring = false ) {
+
+ if ( preg_match( '/[\x80-\xff]/', $value ) === 0 ) {
+ # no high bit set, this is pure ASCII which is de facto
+ # valid UTF-8
+ return true;
+ }
+
+ if ( !$disableMbstring && function_exists( 'mb_check_encoding' ) ) {
+ return mb_check_encoding( $value, 'UTF-8' );
+ } else {
+ $hasUtf8 = preg_match( '/^(?>
+ [\x00-\x7f]
+ | [\xc0-\xdf][\x80-\xbf]
+ | [\xe0-\xef][\x80-\xbf]{2}
+ | [\xf0-\xf7][\x80-\xbf]{3}
+ | [\xf8-\xfb][\x80-\xbf]{4}
+ | \xfc[\x84-\xbf][\x80-\xbf]{4}
+ )+$/x', $value );
+ return ($hasUtf8 > 0 );
+ }
+ }
+
/**
* Perform an operation equivalent to
*
@@ -65,16 +110,16 @@ class StringUtils {
* memory. The delimiters are literal strings, not regular expressions.
*
* If the start delimiter ends with an initial substring of the end delimiter,
- * e.g. in the case of C-style comments, the behaviour differs from the model
+ * e.g. in the case of C-style comments, the behavior differs from the model
* regex. In this implementation, the end must share no characters with the
* start, so e.g. /*\/ is not considered to be both the start and end of a
* comment. /*\/xy/*\/ is considered to be a single comment with contents /xy/.
*
- * @param $startDelim String: start delimiter
- * @param $endDelim String: end delimiter
+ * @param string $startDelim start delimiter
+ * @param string $endDelim end delimiter
* @param $callback Callback: function to call on each match
* @param $subject String
- * @param $flags String: regular expression flags
+ * @param string $flags regular expression flags
* @throws MWException
* @return string
*/
@@ -90,12 +135,12 @@ class StringUtils {
$m = array();
while ( $inputPos < strlen( $subject ) &&
- preg_match( "!($encStart)|($encEnd)!S$flags", $subject, $m, PREG_OFFSET_CAPTURE, $inputPos ) )
+ preg_match( "!($encStart)|($encEnd)!S$flags", $subject, $m, PREG_OFFSET_CAPTURE, $inputPos ) )
{
$tokenOffset = $m[0][1];
if ( $m[1][0] != '' ) {
if ( $foundStart &&
- $strcmp( $endDelim, substr( $subject, $tokenOffset, $endLength ) ) == 0 )
+ $strcmp( $endDelim, substr( $subject, $tokenOffset, $endLength ) ) == 0 )
{
# An end match is present at the same location
$tokenType = 'end';
@@ -155,12 +200,12 @@ class StringUtils {
*
* preg_replace( "!$startDelim(.*)$endDelim!$flags", $replace, $subject )
*
- * @param $startDelim String: start delimiter regular expression
- * @param $endDelim String: end delimiter regular expression
- * @param $replace String: replacement string. May contain $1, which will be
+ * @param string $startDelim start delimiter regular expression
+ * @param string $endDelim end delimiter regular expression
+ * @param string $replace replacement string. May contain $1, which will be
* replaced by the text between the delimiters
- * @param $subject String to search
- * @param $flags String: regular expression flags
+ * @param string $subject to search
+ * @param string $flags regular expression flags
* @return String: The string with the matches replaced
*/
static function delimiterReplace( $startDelim, $endDelim, $replace, $subject, $flags = '' ) {
@@ -360,7 +405,7 @@ class ReplacementArray {
/**
* Set an element of the replacement array
* @param $from string
- * @param $to stromg
+ * @param $to string
*/
function setPair( $from, $to ) {
$this->data[$from] = $to;
@@ -387,7 +432,7 @@ class ReplacementArray {
* @param $from string
*/
function removePair( $from ) {
- unset($this->data[$from]);
+ unset( $this->data[$from] );
$this->fss = false;
}
@@ -424,7 +469,7 @@ class ReplacementArray {
/**
* An iterator which works exactly like:
- *
+ *
* foreach ( explode( $delim, $s ) as $element ) {
* ...
* }
diff --git a/includes/StubObject.php b/includes/StubObject.php
index 615bcb5f..f0a35740 100644
--- a/includes/StubObject.php
+++ b/includes/StubObject.php
@@ -41,9 +41,9 @@ class StubObject {
/**
* Constructor.
*
- * @param $global String: name of the global variable.
- * @param $class String: name of the class of the real object.
- * @param $params Array: parameters to pass to contructor of the real
+ * @param string $global name of the global variable.
+ * @param string $class name of the class of the real object.
+ * @param array $params parameters to pass to constructor of the real
* object.
*/
function __construct( $global = null, $class = null, $params = array() ) {
@@ -53,7 +53,7 @@ class StubObject {
}
/**
- * Returns a bool value whetever $obj is a stub object. Can be used to break
+ * Returns a bool value whenever $obj is a stub object. Can be used to break
* a infinite loop when unstubbing an object.
*
* @param $obj Object to check.
@@ -70,8 +70,8 @@ class StubObject {
* This function will also call the function with the same name in the real
* object.
*
- * @param $name String: name of the function called
- * @param $args Array: arguments
+ * @param string $name name of the function called
+ * @param array $args arguments
* @return mixed
*/
function _call( $name, $args ) {
@@ -91,8 +91,8 @@ class StubObject {
* Function called by PHP if no function with that name exists in this
* object.
*
- * @param $name String: name of the function called
- * @param $args Array: arguments
+ * @param string $name name of the function called
+ * @param array $args arguments
* @return mixed
*/
function __call( $name, $args ) {
@@ -105,9 +105,10 @@ class StubObject {
* This is public, for the convenience of external callers wishing to access
* properties, e.g. eval.php
*
- * @param $name String: name of the method called in this object.
- * @param $level Integer: level to go in the stact trace to get the function
+ * @param string $name name of the method called in this object.
+ * @param $level Integer: level to go in the stack trace to get the function
* who called this function.
+ * @throws MWException
*/
function _unstub( $name = '_unstub', $level = 2 ) {
static $recursionLevel = 0;
@@ -117,7 +118,7 @@ class StubObject {
}
if ( get_class( $GLOBALS[$this->mGlobal] ) != $this->mClass ) {
- $fname = __METHOD__.'-'.$this->mGlobal;
+ $fname = __METHOD__ . '-' . $this->mGlobal;
wfProfileIn( $fname );
$caller = wfGetCaller( $level );
if ( ++$recursionLevel > 2 ) {
diff --git a/includes/Timestamp.php b/includes/Timestamp.php
index c9ba8d91..1cf99a79 100644
--- a/includes/Timestamp.php
+++ b/includes/Timestamp.php
@@ -42,7 +42,6 @@ class MWTimestamp {
TS_RFC2822 => 'D, d M Y H:i:s',
TS_ORACLE => 'd-m-Y H:i:s.000000', // Was 'd-M-y h.i.s A' . ' +00:00' before r51500
TS_POSTGRES => 'Y-m-d H:i:s',
- TS_DB2 => 'Y-m-d H:i:s',
);
/**
@@ -54,7 +53,9 @@ class MWTimestamp {
"seconds" => 1000, // 1000 milliseconds per second
"minutes" => 60, // 60 seconds per minute
"hours" => 60, // 60 minutes per hour
- "days" => 24 // 24 hours per day
+ "days" => 24, // 24 hours per day
+ "months" => 30, // approximately 30 days per month
+ "years" => 12, // 12 months per year
);
/**
@@ -69,7 +70,9 @@ class MWTimestamp {
* Make a new timestamp and set it to the specified time,
* or the current time if unspecified.
*
- * @param $timestamp bool|string Timestamp to set, or false for current time
+ * @since 1.20
+ *
+ * @param bool|string $timestamp Timestamp to set, or false for current time
*/
public function __construct( $timestamp = false ) {
$this->setTimestamp( $timestamp );
@@ -81,7 +84,9 @@ class MWTimestamp {
* Parse the given timestamp into either a DateTime object or a Unix timestamp,
* and then store it.
*
- * @param $ts string|bool Timestamp to store, or false for now
+ * @since 1.20
+ *
+ * @param string|bool $ts Timestamp to store, or false for now
* @throws TimestampException
*/
public function setTimestamp( $ts = false ) {
@@ -112,8 +117,6 @@ class MWTimestamp {
# TS_POSTGRES
} elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/', $ts, $da ) ) {
# TS_POSTGRES
- } elseif (preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.\d\d\d$/', $ts, $da ) ) {
- # TS_DB2
} elseif ( preg_match( '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' . # Day of week
'\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' . # dd Mon yyyy
'[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S', $ts ) ) { # hh:mm:ss
@@ -136,14 +139,10 @@ class MWTimestamp {
$strtime = call_user_func_array( "sprintf", $da );
}
- if( function_exists( "date_create" ) ) {
- try {
- $final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
- } catch(Exception $e) {
- throw new TimestampException( __METHOD__ . ' Invalid timestamp format.' );
- }
- } else {
- $final = strtotime( $strtime );
+ try {
+ $final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
+ } catch(Exception $e) {
+ throw new TimestampException( __METHOD__ . ' Invalid timestamp format.' );
}
if( $final === false ) {
@@ -158,7 +157,9 @@ class MWTimestamp {
* Convert the internal timestamp to the specified format and then
* return it.
*
- * @param $style int Constant Output format for timestamp
+ * @since 1.20
+ *
+ * @param int $style Constant Output format for timestamp
* @throws TimestampException
* @return string The formatted timestamp
*/
@@ -192,7 +193,9 @@ class MWTimestamp {
* generate a readable timestamp by returning "<N> <units> ago", where the
* largest possible unit is used.
*
- * @return string Formatted timestamp
+ * @since 1.20
+ *
+ * @return Message Formatted timestamp
*/
public function getHumanTimestamp() {
$then = $this->getTimestamp( TS_UNIX );
@@ -212,13 +215,15 @@ class MWTimestamp {
if( $message ) {
$initial = call_user_func_array( 'wfMessage', $message );
- return wfMessage( 'ago', $initial );
+ return wfMessage( 'ago', $initial->parse() );
} else {
return wfMessage( 'just-now' );
}
}
/**
+ * @since 1.20
+ *
* @return string
*/
public function __toString() {
@@ -226,4 +231,7 @@ class MWTimestamp {
}
}
+/**
+ * @since 1.20
+ */
class TimestampException extends MWException {}
diff --git a/includes/Title.php b/includes/Title.php
index 1b5e21d2..ca66aaec 100644
--- a/includes/Title.php
+++ b/includes/Title.php
@@ -65,6 +65,7 @@ class Title {
var $mFragment; // /< Title fragment (i.e. the bit after the #)
var $mArticleID = -1; // /< Article ID, fetched from the link cache on demand
var $mLatestID = false; // /< ID of most recent revision
+ var $mContentModel = false; // /< ID of the page's content model, i.e. one of the CONTENT_MODEL_XXX constants
private $mEstimateRevisions; // /< Estimated number of revisions; null of not loaded
var $mRestrictions = array(); // /< Array of groups allowed to edit this article
var $mOldRestrictions = false;
@@ -87,7 +88,6 @@ class Title {
var $mHasSubpage; // /< Whether a page has any subpages
// @}
-
/**
* Constructor
*/
@@ -96,7 +96,7 @@ class Title {
/**
* Create a new Title from a prefixed DB key
*
- * @param $key String the database key, which has underscores
+ * @param string $key the database key, which has underscores
* instead of spaces, possibly including namespace and
* interwiki prefixes
* @return Title, or NULL on an error
@@ -115,10 +115,10 @@ class Title {
* Create a new Title from text, such as what one would find in a link. De-
* codes any HTML entities in the text.
*
- * @param $text String the link text; spaces, prefixes, and an
+ * @param string $text the link text; spaces, prefixes, and an
* initial ':' indicating the main namespace are accepted.
- * @param $defaultNamespace Int the namespace to use if none is speci-
- * fied by a prefix. If you want to force a specific namespace even if
+ * @param int $defaultNamespace the namespace to use if none is specified
+ * by a prefix. If you want to force a specific namespace even if
* $text might begin with a namespace prefix, use makeTitle() or
* makeTitleSafe().
* @throws MWException
@@ -148,7 +148,7 @@ class Title {
$t->mDbkeyform = str_replace( ' ', '_', $filteredText );
$t->mDefaultNamespace = $defaultNamespace;
- static $cachedcount = 0 ;
+ static $cachedcount = 0;
if ( $t->secureAndSplit() ) {
if ( $defaultNamespace == NS_MAIN ) {
if ( $cachedcount >= self::CACHE_MAX ) {
@@ -178,7 +178,7 @@ class Title {
* Create a new Title from URL-encoded text. Ensures that
* the given title's length does not exceed the maximum.
*
- * @param $url String the title, as might be taken from a URL
+ * @param string $url the title, as might be taken from a URL
* @return Title the new object, or NULL on an error
*/
public static function newFromURL( $url ) {
@@ -200,20 +200,38 @@ class Title {
}
/**
+ * Returns a list of fields that are to be selected for initializing Title objects or LinkCache entries.
+ * Uses $wgContentHandlerUseDB to determine whether to include page_content_model.
+ *
+ * @return array
+ */
+ protected static function getSelectFields() {
+ global $wgContentHandlerUseDB;
+
+ $fields = array(
+ 'page_namespace', 'page_title', 'page_id',
+ 'page_len', 'page_is_redirect', 'page_latest',
+ );
+
+ if ( $wgContentHandlerUseDB ) {
+ $fields[] = 'page_content_model';
+ }
+
+ return $fields;
+ }
+
+ /**
* Create a new Title from an article ID
*
- * @param $id Int the page_id corresponding to the Title to create
- * @param $flags Int use Title::GAID_FOR_UPDATE to use master
+ * @param int $id the page_id corresponding to the Title to create
+ * @param int $flags use Title::GAID_FOR_UPDATE to use master
* @return Title the new object, or NULL on an error
*/
public static function newFromID( $id, $flags = 0 ) {
$db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
$row = $db->selectRow(
'page',
- array(
- 'page_namespace', 'page_title', 'page_id',
- 'page_len', 'page_is_redirect', 'page_latest',
- ),
+ self::getSelectFields(),
array( 'page_id' => $id ),
__METHOD__
);
@@ -228,7 +246,7 @@ class Title {
/**
* Make an array of titles from an array of IDs
*
- * @param $ids Array of Int Array of IDs
+ * @param array $ids of Int Array of IDs
* @return Array of Titles
*/
public static function newFromIDs( $ids ) {
@@ -239,10 +257,7 @@ class Title {
$res = $dbr->select(
'page',
- array(
- 'page_namespace', 'page_title', 'page_id',
- 'page_len', 'page_is_redirect', 'page_latest',
- ),
+ self::getSelectFields(),
array( 'page_id' => $ids ),
__METHOD__
);
@@ -282,11 +297,16 @@ class Title {
$this->mRedirect = (bool)$row->page_is_redirect;
if ( isset( $row->page_latest ) )
$this->mLatestID = (int)$row->page_latest;
+ if ( isset( $row->page_content_model ) )
+ $this->mContentModel = strval( $row->page_content_model );
+ else
+ $this->mContentModel = false; # initialized lazily in getContentModel()
} else { // page not found
$this->mArticleID = 0;
$this->mLength = 0;
$this->mRedirect = false;
$this->mLatestID = 0;
+ $this->mContentModel = false; # initialized lazily in getContentModel()
}
}
@@ -297,10 +317,10 @@ class Title {
* For convenience, spaces are converted to underscores so that
* eg user_text fields can be used directly.
*
- * @param $ns Int the namespace of the article
- * @param $title String the unprefixed database key form
- * @param $fragment String the link fragment (after the "#")
- * @param $interwiki String the interwiki prefix
+ * @param int $ns the namespace of the article
+ * @param string $title the unprefixed database key form
+ * @param string $fragment the link fragment (after the "#")
+ * @param string $interwiki the interwiki prefix
* @return Title the new object
*/
public static function &makeTitle( $ns, $title, $fragment = '', $interwiki = '' ) {
@@ -312,6 +332,7 @@ class Title {
$t->mArticleID = ( $ns >= 0 ) ? -1 : 0;
$t->mUrlform = wfUrlencode( $t->mDbkeyform );
$t->mTextform = str_replace( '_', ' ', $title );
+ $t->mContentModel = false; # initialized lazily in getContentModel()
return $t;
}
@@ -320,10 +341,10 @@ class Title {
* The parameters will be checked for validity, which is a bit slower
* than makeTitle() but safer for user-provided data.
*
- * @param $ns Int the namespace of the article
- * @param $title String database key form
- * @param $fragment String the link fragment (after the "#")
- * @param $interwiki String interwiki prefix
+ * @param int $ns the namespace of the article
+ * @param string $title database key form
+ * @param string $fragment the link fragment (after the "#")
+ * @param string $interwiki interwiki prefix
* @return Title the new object, or NULL on an error
*/
public static function makeTitleSafe( $ns, $title, $fragment = '', $interwiki = '' ) {
@@ -360,11 +381,15 @@ class Title {
* This will only return the very next target, useful for
* the redirect table and other checks that don't need full recursion
*
- * @param $text String: Text with possible redirect
+ * @param string $text Text with possible redirect
* @return Title: The corresponding Title
+ * @deprecated since 1.21, use Content::getRedirectTarget instead.
*/
public static function newFromRedirect( $text ) {
- return self::newFromRedirectInternal( $text );
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ $content = ContentHandler::makeContent( $text, null, CONTENT_MODEL_WIKITEXT );
+ return $content->getRedirectTarget();
}
/**
@@ -373,12 +398,15 @@ class Title {
* This will recurse down $wgMaxRedirects times or until a non-redirect target is hit
* in order to provide (hopefully) the Title of the final destination instead of another redirect
*
- * @param $text String Text with possible redirect
+ * @param string $text Text with possible redirect
* @return Title
+ * @deprecated since 1.21, use Content::getUltimateRedirectTarget instead.
*/
public static function newFromRedirectRecurse( $text ) {
- $titles = self::newFromRedirectArray( $text );
- return $titles ? array_pop( $titles ) : null;
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ $content = ContentHandler::makeContent( $text, null, CONTENT_MODEL_WIKITEXT );
+ return $content->getUltimateRedirectTarget();
}
/**
@@ -387,79 +415,21 @@ class Title {
* The last element in the array is the final destination after all redirects
* have been resolved (up to $wgMaxRedirects times)
*
- * @param $text String Text with possible redirect
+ * @param string $text Text with possible redirect
* @return Array of Titles, with the destination last
+ * @deprecated since 1.21, use Content::getRedirectChain instead.
*/
public static function newFromRedirectArray( $text ) {
- global $wgMaxRedirects;
- $title = self::newFromRedirectInternal( $text );
- if ( is_null( $title ) ) {
- return null;
- }
- // recursive check to follow double redirects
- $recurse = $wgMaxRedirects;
- $titles = array( $title );
- while ( --$recurse > 0 ) {
- if ( $title->isRedirect() ) {
- $page = WikiPage::factory( $title );
- $newtitle = $page->getRedirectTarget();
- } else {
- break;
- }
- // Redirects to some special pages are not permitted
- if ( $newtitle instanceOf Title && $newtitle->isValidRedirectTarget() ) {
- // the new title passes the checks, so make that our current title so that further recursion can be checked
- $title = $newtitle;
- $titles[] = $newtitle;
- } else {
- break;
- }
- }
- return $titles;
- }
+ ContentHandler::deprecated( __METHOD__, '1.21' );
- /**
- * Really extract the redirect destination
- * Do not call this function directly, use one of the newFromRedirect* functions above
- *
- * @param $text String Text with possible redirect
- * @return Title
- */
- protected static function newFromRedirectInternal( $text ) {
- global $wgMaxRedirects;
- if ( $wgMaxRedirects < 1 ) {
- //redirects are disabled, so quit early
- return null;
- }
- $redir = MagicWord::get( 'redirect' );
- $text = trim( $text );
- if ( $redir->matchStartAndRemove( $text ) ) {
- // Extract the first link and see if it's usable
- // Ensure that it really does come directly after #REDIRECT
- // Some older redirects included a colon, so don't freak about that!
- $m = array();
- if ( preg_match( '!^\s*:?\s*\[{2}(.*?)(?:\|.*?)?\]{2}!', $text, $m ) ) {
- // Strip preceding colon used to "escape" categories, etc.
- // and URL-decode links
- if ( strpos( $m[1], '%' ) !== false ) {
- // Match behavior of inline link parsing here;
- $m[1] = rawurldecode( ltrim( $m[1], ':' ) );
- }
- $title = Title::newFromText( $m[1] );
- // If the title is a redirect to bad special pages or is invalid, return null
- if ( !$title instanceof Title || !$title->isValidRedirectTarget() ) {
- return null;
- }
- return $title;
- }
- }
- return null;
+ $content = ContentHandler::makeContent( $text, null, CONTENT_MODEL_WIKITEXT );
+ return $content->getRedirectChain();
}
/**
* Get the prefixed DB key associated with an ID
*
- * @param $id Int the page_id of the article
+ * @param int $id the page_id of the article
* @return Title an object representing the article, or NULL if no such article was found
*/
public static function nameOf( $id ) {
@@ -520,8 +490,8 @@ class Title {
* Get a string representation of a title suitable for
* including in a search index
*
- * @param $ns Int a namespace index
- * @param $title String text-form main part
+ * @param int $ns a namespace index
+ * @param string $title text-form main part
* @return String a stripped-down title string ready for the search index
*/
public static function indexTitle( $ns, $title ) {
@@ -547,10 +517,10 @@ class Title {
/**
* Make a prefixed DB key from a DB key and a namespace index
*
- * @param $ns Int numerical representation of the namespace
- * @param $title String the DB key form the title
- * @param $fragment String The link fragment (after the "#")
- * @param $interwiki String The interwiki prefix
+ * @param int $ns numerical representation of the namespace
+ * @param string $title the DB key form the title
+ * @param string $fragment The link fragment (after the "#")
+ * @param string $interwiki The interwiki prefix
* @return String the prefixed form of the title
*/
public static function makeName( $ns, $title, $fragment = '', $interwiki = '' ) {
@@ -570,7 +540,7 @@ class Title {
/**
* Escape a text fragment, say from a link, for a URL
*
- * @param $fragment string containing a URL or link fragment (after the "#")
+ * @param string $fragment containing a URL or link fragment (after the "#")
* @return String: escaped string
*/
static function escapeFragmentForURL( $fragment ) {
@@ -605,10 +575,12 @@ class Title {
*/
public function isLocal() {
if ( $this->mInterwiki != '' ) {
- return Interwiki::fetch( $this->mInterwiki )->isLocal();
- } else {
- return true;
+ $iw = Interwiki::fetch( $this->mInterwiki );
+ if ( $iw ) {
+ return $iw->isLocal();
+ }
}
+ return true;
}
/**
@@ -702,6 +674,39 @@ class Title {
}
/**
+ * Get the page's content model id, see the CONTENT_MODEL_XXX constants.
+ *
+ * @throws MWException
+ * @return String: Content model id
+ */
+ public function getContentModel() {
+ if ( !$this->mContentModel ) {
+ $linkCache = LinkCache::singleton();
+ $this->mContentModel = $linkCache->getGoodLinkFieldObj( $this, 'model' );
+ }
+
+ if ( !$this->mContentModel ) {
+ $this->mContentModel = ContentHandler::getDefaultModelFor( $this );
+ }
+
+ if( !$this->mContentModel ) {
+ throw new MWException( 'Failed to determine content model!' );
+ }
+
+ return $this->mContentModel;
+ }
+
+ /**
+ * Convenience method for checking a title's content model name
+ *
+ * @param string $id The content model ID (use the CONTENT_MODEL_XXX constants).
+ * @return Boolean true if $this->getContentModel() == $id
+ */
+ public function hasContentModel( $id ) {
+ return $this->getContentModel() == $id;
+ }
+
+ /**
* Get the namespace text
*
* @return String: Namespace text
@@ -790,7 +795,7 @@ class Title {
/**
* Returns true if this title resolves to the named special page
*
- * @param $name String The special page name
+ * @param string $name The special page name
* @return boolean
*/
public function isSpecial( $name ) {
@@ -828,7 +833,7 @@ class Title {
* Please make use of this instead of comparing to getNamespace()
* This function is much more resistant to changes we may make
* to namespaces than code that makes direct comparisons.
- * @param $ns int The namespace
+ * @param int $ns The namespace
* @return bool
* @since 1.19
*/
@@ -865,7 +870,7 @@ class Title {
* is either NS_USER or NS_USER_TALK since both of them have NS_USER
* as their subject namespace.
*
- * This is MUCH simpler than individually testing for equivilance
+ * This is MUCH simpler than individually testing for equivalence
* against both NS_USER and NS_USER_TALK, and is also forward compatible.
* @since 1.19
* @param $ns int
@@ -905,9 +910,9 @@ class Title {
/**
* Is this the mainpage?
- * @note Title::newFromText seams to be sufficiently optimized by the title
+ * @note Title::newFromText seems to be sufficiently optimized by the title
* cache that we don't need to over-optimize by doing direct comparisons and
- * acidentally creating new bugs where $title->equals( Title::newFromText() )
+ * accidentally creating new bugs where $title->equals( Title::newFromText() )
* ends up reporting something differently than $title->isMainPage();
*
* @since 1.18
@@ -934,6 +939,8 @@ class Title {
* @return Bool
*/
public function isConversionTable() {
+ //@todo: ConversionTable should become a separate content model.
+
return $this->getNamespace() == NS_MEDIAWIKI &&
strpos( $this->getText(), 'Conversiontable/' ) === 0;
}
@@ -944,22 +951,31 @@ class Title {
* @return Bool
*/
public function isWikitextPage() {
- $retval = !$this->isCssOrJsPage() && !$this->isCssJsSubpage();
- wfRunHooks( 'TitleIsWikitextPage', array( $this, &$retval ) );
- return $retval;
+ return $this->hasContentModel( CONTENT_MODEL_WIKITEXT );
}
/**
- * Could this page contain custom CSS or JavaScript, based
- * on the title?
+ * Could this page contain custom CSS or JavaScript for the global UI.
+ * This is generally true for pages in the MediaWiki namespace having CONTENT_MODEL_CSS
+ * or CONTENT_MODEL_JAVASCRIPT.
+ *
+ * This method does *not* return true for per-user JS/CSS. Use isCssJsSubpage() for that!
+ *
+ * Note that this method should not return true for pages that contain and show "inactive" CSS or JS.
*
* @return Bool
*/
public function isCssOrJsPage() {
- $retval = $this->mNamespace == NS_MEDIAWIKI
- && preg_match( '!\.(?:css|js)$!u', $this->mTextform ) > 0;
- wfRunHooks( 'TitleIsCssOrJsPage', array( $this, &$retval ) );
- return $retval;
+ $isCssOrJsPage = NS_MEDIAWIKI == $this->mNamespace
+ && ( $this->hasContentModel( CONTENT_MODEL_CSS )
+ || $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) );
+
+ #NOTE: this hook is also called in ContentHandler::getDefaultModel. It's called here again to make sure
+ # hook functions can force this method to return true even outside the mediawiki namespace.
+
+ wfRunHooks( 'TitleIsCssOrJsPage', array( $this, &$isCssOrJsPage ) );
+
+ return $isCssOrJsPage;
}
/**
@@ -967,7 +983,9 @@ class Title {
* @return Bool
*/
public function isCssJsSubpage() {
- return ( NS_USER == $this->mNamespace and preg_match( "/\\/.*\\.(?:css|js)$/", $this->mTextform ) );
+ return ( NS_USER == $this->mNamespace && $this->isSubpage()
+ && ( $this->hasContentModel( CONTENT_MODEL_CSS )
+ || $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) ) );
}
/**
@@ -990,7 +1008,8 @@ class Title {
* @return Bool
*/
public function isCssSubpage() {
- return ( NS_USER == $this->mNamespace && preg_match( "/\\/.*\\.css$/", $this->mTextform ) );
+ return ( NS_USER == $this->mNamespace && $this->isSubpage()
+ && $this->hasContentModel( CONTENT_MODEL_CSS ) );
}
/**
@@ -999,7 +1018,8 @@ class Title {
* @return Bool
*/
public function isJsSubpage() {
- return ( NS_USER == $this->mNamespace && preg_match( "/\\/.*\\.js$/", $this->mTextform ) );
+ return ( NS_USER == $this->mNamespace && $this->isSubpage()
+ && $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) );
}
/**
@@ -1083,7 +1103,7 @@ class Title {
* Deprecated for public use, use Title::makeTitle() with fragment parameter.
* Still in active use privately.
*
- * @param $fragment String text
+ * @param string $fragment text
*/
public function setFragment( $fragment ) {
$this->mFragment = str_replace( '_', ' ', substr( $fragment, 1 ) );
@@ -1093,7 +1113,7 @@ class Title {
* Prefix some arbitrary text with the namespace or interwiki prefix
* of this object
*
- * @param $name String the text
+ * @param string $name the text
* @return String the prefixed text
* @private
*/
@@ -1161,7 +1181,49 @@ class Title {
}
/**
- * Get the base page name, i.e. the leftmost part before any slashes
+ * Get the root page name text without a namespace, i.e. the leftmost part before any slashes
+ *
+ * @par Example:
+ * @code
+ * Title::newFromText('User:Foo/Bar/Baz')->getRootText();
+ * # returns: 'Foo'
+ * @endcode
+ *
+ * @return String Root name
+ * @since 1.20
+ */
+ public function getRootText() {
+ if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
+ return $this->getText();
+ }
+
+ return strtok( $this->getText(), '/' );
+ }
+
+ /**
+ * Get the root page name title, i.e. the leftmost part before any slashes
+ *
+ * @par Example:
+ * @code
+ * Title::newFromText('User:Foo/Bar/Baz')->getRootTitle();
+ * # returns: Title{User:Foo}
+ * @endcode
+ *
+ * @return Title Root title
+ * @since 1.20
+ */
+ public function getRootTitle() {
+ return Title::makeTitle( $this->getNamespace(), $this->getRootText() );
+ }
+
+ /**
+ * Get the base page name without a namespace, i.e. the part before the subpage name
+ *
+ * @par Example:
+ * @code
+ * Title::newFromText('User:Foo/Bar/Baz')->getBaseText();
+ * # returns: 'Foo/Bar'
+ * @endcode
*
* @return String Base name
*/
@@ -1179,8 +1241,30 @@ class Title {
}
/**
+ * Get the base page name title, i.e. the part before the subpage name
+ *
+ * @par Example:
+ * @code
+ * Title::newFromText('User:Foo/Bar/Baz')->getBaseTitle();
+ * # returns: Title{User:Foo/Bar}
+ * @endcode
+ *
+ * @return Title Base title
+ * @since 1.20
+ */
+ public function getBaseTitle() {
+ return Title::makeTitle( $this->getNamespace(), $this->getBaseText() );
+ }
+
+ /**
* Get the lowest-level subpage name, i.e. the rightmost part after any slashes
*
+ * @par Example:
+ * @code
+ * Title::newFromText('User:Foo/Bar/Baz')->getSubpageText();
+ * # returns: "Baz"
+ * @endcode
+ *
* @return String Subpage name
*/
public function getSubpageText() {
@@ -1192,10 +1276,28 @@ class Title {
}
/**
+ * Get the title for a subpage of the current page
+ *
+ * @par Example:
+ * @code
+ * Title::newFromText('User:Foo/Bar/Baz')->getSubpage("Asdf");
+ * # returns: Title{User:Foo/Bar/Baz/Asdf}
+ * @endcode
+ *
+ * @param string $text The subpage name to add to the title
+ * @return Title Subpage title
+ * @since 1.20
+ */
+ public function getSubpage( $text ) {
+ return Title::makeTitleSafe( $this->getNamespace(), $this->getText() . '/' . $text );
+ }
+
+ /**
* Get the HTML-escaped displayable text form.
* Used for the title field in <a> tags.
*
* @return String the text, including any prefixes
+ * @deprecated since 1.19
*/
public function getEscapedText() {
wfDeprecated( __METHOD__, '1.19' );
@@ -1230,7 +1332,7 @@ class Title {
* second argument named variant. This was deprecated in favor
* of passing an array of option with a "variant" key
* Once $query2 is removed for good, this helper can be dropped
- * andthe wfArrayToCGI moved to getLocalURL();
+ * and the wfArrayToCgi moved to getLocalURL();
*
* @since 1.19 (r105919)
* @param $query
@@ -1242,15 +1344,15 @@ class Title {
wfDeprecated( "Title::get{Canonical,Full,Link,Local} method called with a second parameter is deprecated. Add your parameter to an array passed as the first parameter.", "1.19" );
}
if ( is_array( $query ) ) {
- $query = wfArrayToCGI( $query );
+ $query = wfArrayToCgi( $query );
}
if ( $query2 ) {
if ( is_string( $query2 ) ) {
// $query2 is a string, we will consider this to be
// a deprecated $variant argument and add it to the query
- $query2 = wfArrayToCGI( array( 'variant' => $query2 ) );
+ $query2 = wfArrayToCgi( array( 'variant' => $query2 ) );
} else {
- $query2 = wfArrayToCGI( $query2 );
+ $query2 = wfArrayToCgi( $query2 );
}
// If we have $query content add a & to it first
if ( $query ) {
@@ -1270,6 +1372,8 @@ class Title {
*
* @see self::getLocalURL
* @see wfExpandUrl
+ * @param $query
+ * @param $query2 bool
* @param $proto Protocol type to use in URL
* @return String the URL
*/
@@ -1296,8 +1400,8 @@ class Title {
* with action=render, $wgServer is prepended.
*
- * @param $query string|array an optional query string,
- * not used for interwiki links. Can be specified as an associative array as well,
+ * @param string|array $query an optional query string,
+ * not used for interwiki links. Can be specified as an associative array as well,
* e.g., array( 'action' => 'edit' ) (keys and values will be URL-escaped).
* Some query patterns will trigger various shorturl path replacements.
* @param $query2 Mixed: An optional secondary query array. This one MUST
@@ -1396,13 +1500,16 @@ class Title {
*
* See getLocalURL for the arguments.
*
+ * @param $query
+ * @param $query2 bool
+ * @param $proto Protocol to use; setting this will cause a full URL to be used
* @see self::getLocalURL
* @return String the URL
*/
- public function getLinkURL( $query = '', $query2 = false ) {
+ public function getLinkURL( $query = '', $query2 = false, $proto = PROTO_RELATIVE ) {
wfProfileIn( __METHOD__ );
- if ( $this->isExternal() ) {
- $ret = $this->getFullURL( $query, $query2 );
+ if ( $this->isExternal() || $proto !== PROTO_RELATIVE ) {
+ $ret = $this->getFullURL( $query, $query2, $proto );
} elseif ( $this->getPrefixedText() === '' && $this->getFragment() !== '' ) {
$ret = $this->getFragmentForURL();
} else {
@@ -1422,6 +1529,7 @@ class Title {
* @param $query string
* @param $query2 bool|string
* @return String the URL
+ * @deprecated since 1.19
*/
public function escapeLocalURL( $query = '', $query2 = false ) {
wfDeprecated( __METHOD__, '1.19' );
@@ -1436,6 +1544,7 @@ class Title {
*
* @see self::getLocalURL
* @return String the URL
+ * @deprecated since 1.19
*/
public function escapeFullURL( $query = '', $query2 = false ) {
wfDeprecated( __METHOD__, '1.19' );
@@ -1493,6 +1602,7 @@ class Title {
* @see self::getLocalURL
* @since 1.18
* @return string
+ * @deprecated since 1.19
*/
public function escapeCanonicalURL( $query = '', $query2 = false ) {
wfDeprecated( __METHOD__, '1.19' );
@@ -1555,7 +1665,7 @@ class Title {
*
* May provide false positives, but should never provide a false negative.
*
- * @param $action String action that permission needs to be checked for
+ * @param string $action action that permission needs to be checked for
* @param $user User to check (since 1.19); $wgUser will be used if not
* provided.
* @return Bool
@@ -1567,10 +1677,10 @@ class Title {
/**
* Can $user perform $action on this page?
*
- * @param $action String action that permission needs to be checked for
+ * @param string $action action that permission needs to be checked for
* @param $user User to check (since 1.19); $wgUser will be used if not
* provided.
- * @param $doExpensiveQueries Bool Set this to false to avoid doing
+ * @param bool $doExpensiveQueries Set this to false to avoid doing
* unnecessary queries.
* @return Bool
*/
@@ -1587,11 +1697,11 @@ class Title {
*
* @todo FIXME: This *does not* check throttles (User::pingLimiter()).
*
- * @param $action String action that permission needs to be checked for
+ * @param string $action action that permission needs to be checked for
* @param $user User to check
- * @param $doExpensiveQueries Bool Set this to false to avoid doing unnecessary
+ * @param bool $doExpensiveQueries Set this to false to avoid doing unnecessary
* queries by skipping checks for cascading protections and user blocks.
- * @param $ignoreErrors Array of Strings Set this to a list of message keys
+ * @param array $ignoreErrors of Strings Set this to a list of message keys
* whose corresponding errors may be ignored.
* @return Array of arguments to wfMessage to explain permissions problems.
*/
@@ -1613,9 +1723,9 @@ class Title {
/**
* Permissions checks that fail most often, and which are easiest to test.
*
- * @param $action String the action to check
+ * @param string $action the action to check
* @param $user User user to check
- * @param $errors Array list of current errors
+ * @param array $errors list of current errors
* @param $doExpensiveQueries Boolean whether or not to perform expensive queries
* @param $short Boolean short circuit on first error
*
@@ -1623,8 +1733,10 @@ class Title {
*/
private function checkQuickPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
if ( $action == 'create' ) {
- if ( ( $this->isTalkPage() && !$user->isAllowed( 'createtalk' ) ) ||
- ( !$this->isTalkPage() && !$user->isAllowed( 'createpage' ) ) ) {
+ if (
+ ( $this->isTalkPage() && !$user->isAllowed( 'createtalk' ) ) ||
+ ( !$this->isTalkPage() && !$user->isAllowed( 'createpage' ) )
+ ) {
$errors[] = $user->isAnon() ? array( 'nocreatetext' ) : array( 'nocreate-loggedin' );
}
} elseif ( $action == 'move' ) {
@@ -1641,15 +1753,8 @@ class Title {
if ( !$user->isAllowed( 'move' ) ) {
// User can't move anything
- global $wgGroupPermissions;
- $userCanMove = false;
- if ( isset( $wgGroupPermissions['user']['move'] ) ) {
- $userCanMove = $wgGroupPermissions['user']['move'];
- }
- $autoconfirmedCanMove = false;
- if ( isset( $wgGroupPermissions['autoconfirmed']['move'] ) ) {
- $autoconfirmedCanMove = $wgGroupPermissions['autoconfirmed']['move'];
- }
+ $userCanMove = User::groupHasPermission( 'user', 'move' );
+ $autoconfirmedCanMove = User::groupHasPermission( 'autoconfirmed', 'move' );
if ( $user->isAnon() && ( $userCanMove || $autoconfirmedCanMove ) ) {
// custom message if logged-in users without any special rights can move
$errors[] = array( 'movenologintext' );
@@ -1676,7 +1781,7 @@ class Title {
/**
* Add the resulting error code to the errors array
*
- * @param $errors Array list of current errors
+ * @param array $errors list of current errors
* @param $result Mixed result of errors
*
* @return Array list of errors
@@ -1701,9 +1806,9 @@ class Title {
/**
* Check various permission hooks
*
- * @param $action String the action to check
+ * @param string $action the action to check
* @param $user User user to check
- * @param $errors Array list of current errors
+ * @param array $errors list of current errors
* @param $doExpensiveQueries Boolean whether or not to perform expensive queries
* @param $short Boolean short circuit on first error
*
@@ -1720,8 +1825,11 @@ class Title {
$errors = $this->resultToError( $errors, $result );
}
// Check getUserPermissionsErrorsExpensive hook
- if ( $doExpensiveQueries && !( $short && count( $errors ) > 0 ) &&
- !wfRunHooks( 'getUserPermissionsErrorsExpensive', array( &$this, &$user, $action, &$result ) ) ) {
+ if (
+ $doExpensiveQueries
+ && !( $short && count( $errors ) > 0 )
+ && !wfRunHooks( 'getUserPermissionsErrorsExpensive', array( &$this, &$user, $action, &$result ) )
+ ) {
$errors = $this->resultToError( $errors, $result );
}
@@ -1731,19 +1839,18 @@ class Title {
/**
* Check permissions on special pages & namespaces
*
- * @param $action String the action to check
+ * @param string $action the action to check
* @param $user User user to check
- * @param $errors Array list of current errors
+ * @param array $errors list of current errors
* @param $doExpensiveQueries Boolean whether or not to perform expensive queries
* @param $short Boolean short circuit on first error
*
* @return Array list of errors
*/
private function checkSpecialsAndNSPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
- # Only 'createaccount' and 'execute' can be performed on
- # special pages, which don't actually exist in the DB.
- $specialOKActions = array( 'createaccount', 'execute', 'read' );
- if ( NS_SPECIAL == $this->mNamespace && !in_array( $action, $specialOKActions ) ) {
+ # Only 'createaccount' can be performed on special pages,
+ # which don't actually exist in the DB.
+ if ( NS_SPECIAL == $this->mNamespace && $action !== 'createaccount' ) {
$errors[] = array( 'ns-specialprotected' );
}
@@ -1752,7 +1859,7 @@ class Title {
$ns = $this->mNamespace == NS_MAIN ?
wfMessage( 'nstab-main' )->text() : $this->getNsText();
$errors[] = $this->mNamespace == NS_MEDIAWIKI ?
- array( 'protectedinterface' ) : array( 'namespaceprotected', $ns );
+ array( 'protectedinterface' ) : array( 'namespaceprotected', $ns );
}
return $errors;
@@ -1761,9 +1868,9 @@ class Title {
/**
* Check CSS/JS sub-page permissions
*
- * @param $action String the action to check
+ * @param string $action the action to check
* @param $user User user to check
- * @param $errors Array list of current errors
+ * @param array $errors list of current errors
* @param $doExpensiveQueries Boolean whether or not to perform expensive queries
* @param $short Boolean short circuit on first error
*
@@ -1790,9 +1897,9 @@ class Title {
* page. The user must possess all required rights for this
* action.
*
- * @param $action String the action to check
+ * @param string $action the action to check
* @param $user User user to check
- * @param $errors Array list of current errors
+ * @param array $errors list of current errors
* @param $doExpensiveQueries Boolean whether or not to perform expensive queries
* @param $short Boolean short circuit on first error
*
@@ -1821,9 +1928,9 @@ class Title {
/**
* Check restrictions on cascading pages.
*
- * @param $action String the action to check
+ * @param string $action the action to check
* @param $user User to check
- * @param $errors Array list of current errors
+ * @param array $errors list of current errors
* @param $doExpensiveQueries Boolean whether or not to perform expensive queries
* @param $short Boolean short circuit on first error
*
@@ -1860,9 +1967,9 @@ class Title {
/**
* Check action permissions not already checked in checkQuickPermissions
*
- * @param $action String the action to check
+ * @param string $action the action to check
* @param $user User to check
- * @param $errors Array list of current errors
+ * @param array $errors list of current errors
* @param $doExpensiveQueries Boolean whether or not to perform expensive queries
* @param $short Boolean short circuit on first error
*
@@ -1914,11 +2021,11 @@ class Title {
}
/**
- * Check that the user isn't blocked from editting.
+ * Check that the user isn't blocked from editing.
*
- * @param $action String the action to check
+ * @param string $action the action to check
* @param $user User to check
- * @param $errors Array list of current errors
+ * @param array $errors list of current errors
* @param $doExpensiveQueries Boolean whether or not to perform expensive queries
* @param $short Boolean short circuit on first error
*
@@ -1981,22 +2088,22 @@ class Title {
/**
* Check that the user is allowed to read this page.
*
- * @param $action String the action to check
+ * @param string $action the action to check
* @param $user User to check
- * @param $errors Array list of current errors
+ * @param array $errors list of current errors
* @param $doExpensiveQueries Boolean whether or not to perform expensive queries
* @param $short Boolean short circuit on first error
*
* @return Array list of errors
*/
private function checkReadPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
- global $wgWhitelistRead, $wgGroupPermissions, $wgRevokePermissions;
+ global $wgWhitelistRead, $wgWhitelistReadRegexp, $wgRevokePermissions;
static $useShortcut = null;
# Initialize the $useShortcut boolean, to determine if we can skip quite a bit of code below
if ( is_null( $useShortcut ) ) {
$useShortcut = true;
- if ( empty( $wgGroupPermissions['*']['read'] ) ) {
+ if ( !User::groupHasPermission( '*', 'read' ) ) {
# Not a public wiki, so no shortcut
$useShortcut = false;
} elseif ( !empty( $wgRevokePermissions ) ) {
@@ -2034,7 +2141,7 @@ class Title {
# Time to check the whitelist
# Only do these checks is there's something to check against
$name = $this->getPrefixedText();
- $dbName = $this->getPrefixedDBKey();
+ $dbName = $this->getPrefixedDBkey();
// Check for explicit whitelisting with and without underscores
if ( in_array( $name, $wgWhitelistRead, true ) || in_array( $dbName, $wgWhitelistRead, true ) ) {
@@ -2049,7 +2156,7 @@ class Title {
# If it's a special page, ditch the subpage bit and check again
$name = $this->getDBkey();
list( $name, /* $subpage */ ) = SpecialPageFactory::resolveAlias( $name );
- if ( $name !== false ) {
+ if ( $name ) {
$pure = SpecialPage::getTitleFor( $name )->getPrefixedText();
if ( in_array( $pure, $wgWhitelistRead, true ) ) {
$whitelisted = true;
@@ -2058,6 +2165,17 @@ class Title {
}
}
+ if( !$whitelisted && is_array( $wgWhitelistReadRegexp ) && !empty( $wgWhitelistReadRegexp ) ) {
+ $name = $this->getPrefixedText();
+ // Check for regex whitelisting
+ foreach ( $wgWhitelistReadRegexp as $listItem ) {
+ if ( preg_match( $listItem, $name ) ) {
+ $whitelisted = true;
+ break;
+ }
+ }
+ }
+
if ( !$whitelisted ) {
# If the title is not whitelisted, give extensions a chance to do so...
wfRunHooks( 'TitleReadWhitelist', array( $this, $user, &$whitelisted ) );
@@ -2073,7 +2191,7 @@ class Title {
* Get a description array when the user doesn't have the right to perform
* $action (i.e. when User::isAllowed() returns false)
*
- * @param $action String the action to check
+ * @param string $action the action to check
* @param $short Boolean short circuit on first error
* @return Array list of errors
*/
@@ -2103,10 +2221,10 @@ class Title {
* which checks ONLY that previously checked by userCan (i.e. it leaves out
* checks on wfReadOnly() and blocks)
*
- * @param $action String action that permission needs to be checked for
+ * @param string $action action that permission needs to be checked for
* @param $user User to check
- * @param $doExpensiveQueries Bool Set this to false to avoid doing unnecessary queries.
- * @param $short Bool Set this to true to stop after the first permission error.
+ * @param bool $doExpensiveQueries Set this to false to avoid doing unnecessary queries.
+ * @param bool $short Set this to true to stop after the first permission error.
* @return Array of arrays of the arguments to wfMessage to explain permissions problems.
*/
protected function getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries = true, $short = false ) {
@@ -2166,8 +2284,10 @@ class Title {
public function userCanEditJsSubpage() {
global $wgUser;
wfDeprecated( __METHOD__, '1.19' );
- return ( ( $wgUser->isAllowedAll( 'editusercssjs', 'edituserjs' ) )
- || preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform ) );
+ return (
+ ( $wgUser->isAllowedAll( 'editusercssjs', 'edituserjs' ) )
+ || preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform )
+ );
}
/**
@@ -2235,9 +2355,12 @@ class Title {
if ( !isset( $this->mTitleProtection ) ) {
$dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'protected_titles', '*',
+ $res = $dbr->select(
+ 'protected_titles',
+ array( 'pt_user', 'pt_reason', 'pt_expiry', 'pt_create_perm' ),
array( 'pt_namespace' => $this->getNamespace(), 'pt_title' => $this->getDBkey() ),
- __METHOD__ );
+ __METHOD__
+ );
// fetchRow returns false if there are no rows.
$this->mTitleProtection = $dbr->fetchRow( $res );
@@ -2250,8 +2373,8 @@ class Title {
*
* @deprecated in 1.19; will be removed in 1.20. Use WikiPage::doUpdateRestrictions() instead.
* @param $create_perm String Permission required for creation
- * @param $reason String Reason for protection
- * @param $expiry String Expiry timestamp
+ * @param string $reason Reason for protection
+ * @param string $expiry Expiry timestamp
* @return boolean true
*/
public function updateTitleProtection( $create_perm, $reason, $expiry ) {
@@ -2263,7 +2386,8 @@ class Title {
$expiry = array( 'create' => $expiry );
$page = WikiPage::factory( $this );
- $status = $page->doUpdateRestrictions( $limit, $expiry, false, $reason, $wgUser );
+ $cascade = false;
+ $status = $page->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $wgUser );
return $status->isOK();
}
@@ -2285,7 +2409,7 @@ class Title {
/**
* Is this page "semi-protected" - the *only* protection is autoconfirm?
*
- * @param $action String Action to check (default: edit)
+ * @param string $action Action to check (default: edit)
* @return Bool
*/
public function isSemiProtected( $action = 'edit' ) {
@@ -2311,7 +2435,7 @@ class Title {
/**
* Does the title correspond to a protected article?
*
- * @param $action String the action the page is protected from,
+ * @param string $action the action the page is protected from,
* by default checks all actions.
* @return Bool
*/
@@ -2373,7 +2497,7 @@ class Title {
/**
* Cascading protection: Get the source of any cascading restrictions on this page.
*
- * @param $getPages Bool Whether or not to retrieve the actual pages
+ * @param bool $getPages Whether or not to retrieve the actual pages
* that the restrictions have come from.
* @return Mixed Array of Title objects of the pages from which cascading restrictions
* have come, false for none, or true if such restrictions exist, but $getPages
@@ -2413,7 +2537,7 @@ class Title {
if ( $getPages ) {
$cols = array( 'pr_page', 'page_namespace', 'page_title',
- 'pr_expiry', 'pr_type', 'pr_level' );
+ 'pr_expiry', 'pr_type', 'pr_level' );
$where_clauses[] = 'page_id=pr_page';
$tables[] = 'page';
} else {
@@ -2441,8 +2565,10 @@ class Title {
$pagerestrictions[$row->pr_type] = array();
}
- if ( isset( $pagerestrictions[$row->pr_type] ) &&
- !in_array( $row->pr_level, $pagerestrictions[$row->pr_type] ) ) {
+ if (
+ isset( $pagerestrictions[$row->pr_type] )
+ && !in_array( $row->pr_level, $pagerestrictions[$row->pr_type] )
+ ) {
$pagerestrictions[$row->pr_type][] = $row->pr_level;
}
} else {
@@ -2471,7 +2597,7 @@ class Title {
/**
* Accessor/initialisation for mRestrictions
*
- * @param $action String action that permission needs to be checked for
+ * @param string $action action that permission needs to be checked for
* @return Array of Strings the array of groups allowed to edit this article
*/
public function getRestrictions( $action ) {
@@ -2514,7 +2640,7 @@ class Title {
* Loads a string into mRestrictions array
*
* @param $res Resource restrictions as an SQL result.
- * @param $oldFashionedRestrictions String comma-separated list of page
+ * @param string $oldFashionedRestrictions comma-separated list of page
* restrictions from page table (pre 1.10)
*/
private function loadRestrictionsFromResultWrapper( $res, $oldFashionedRestrictions = null ) {
@@ -2532,8 +2658,8 @@ class Title {
* and page_restrictions table for this existing page.
* Public for usage by LiquidThreads.
*
- * @param $rows array of db result objects
- * @param $oldFashionedRestrictions string comma-separated list of page
+ * @param array $rows of db result objects
+ * @param string $oldFashionedRestrictions comma-separated list of page
* restrictions from page table (pre 1.10)
*/
public function loadRestrictionsFromRows( $rows, $oldFashionedRestrictions = null ) {
@@ -2615,7 +2741,7 @@ class Title {
/**
* Load restrictions from the page_restrictions table
*
- * @param $oldFashionedRestrictions String comma-separated list of page
+ * @param string $oldFashionedRestrictions comma-separated list of page
* restrictions from page table (pre 1.10)
*/
public function loadRestrictions( $oldFashionedRestrictions = null ) {
@@ -2626,7 +2752,7 @@ class Title {
$res = $dbr->select(
'page_restrictions',
- '*',
+ array( 'pr_type', 'pr_expiry', 'pr_level', 'pr_cascade' ),
array( 'pr_page' => $this->getArticleID() ),
__METHOD__
);
@@ -2668,6 +2794,10 @@ class Title {
* Purge expired restrictions from the page_restrictions table
*/
static function purgeExpiredRestrictions() {
+ if ( wfReadOnly() ) {
+ return;
+ }
+
$dbw = wfGetDB( DB_MASTER );
$dbw->delete(
'page_restrictions',
@@ -2711,7 +2841,7 @@ class Title {
/**
* Get all subpages of this page.
*
- * @param $limit Int maximum number of subpages to fetch; -1 for no limit
+ * @param int $limit maximum number of subpages to fetch; -1 for no limit
* @return mixed TitleArray, or empty array if this page's namespace
* doesn't allow subpages
*/
@@ -2789,7 +2919,7 @@ class Title {
* Get the article ID for this Title from the link cache,
* adding it if necessary
*
- * @param $flags Int a bit field; may be Title::GAID_FOR_UPDATE to select
+ * @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select
* for update
* @return Int the ID
*/
@@ -2815,7 +2945,7 @@ class Title {
* Is this an article that is a redirect page?
* Uses link cache, adding it if necessary
*
- * @param $flags Int a bit field; may be Title::GAID_FOR_UPDATE to select for update
+ * @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select for update
* @return Bool
*/
public function isRedirect( $flags = 0 ) {
@@ -2826,8 +2956,18 @@ class Title {
if ( !$this->getArticleID( $flags ) ) {
return $this->mRedirect = false;
}
+
$linkCache = LinkCache::singleton();
- $this->mRedirect = (bool)$linkCache->getGoodLinkFieldObj( $this, 'redirect' );
+ $cached = $linkCache->getGoodLinkFieldObj( $this, 'redirect' );
+ if ( $cached === null ) {
+ // TODO: check the assumption that the cache actually knows about this title
+ // and handle this, such as get the title from the database.
+ // See https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
+ wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
+ wfDebug( wfBacktrace() );
+ }
+
+ $this->mRedirect = (bool)$cached;
return $this->mRedirect;
}
@@ -2836,7 +2976,7 @@ class Title {
* What is the length of this page?
* Uses link cache, adding it if necessary
*
- * @param $flags Int a bit field; may be Title::GAID_FOR_UPDATE to select for update
+ * @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select for update
* @return Int
*/
public function getLength( $flags = 0 ) {
@@ -2848,7 +2988,15 @@ class Title {
return $this->mLength = 0;
}
$linkCache = LinkCache::singleton();
- $this->mLength = intval( $linkCache->getGoodLinkFieldObj( $this, 'length' ) );
+ $cached = $linkCache->getGoodLinkFieldObj( $this, 'length' );
+ if ( $cached === null ) { # check the assumption that the cache actually knows about this title
+ # XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
+ # as a stop gap, perhaps log this, but don't throw an exception?
+ wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
+ wfDebug( wfBacktrace() );
+ }
+
+ $this->mLength = intval( $cached );
return $this->mLength;
}
@@ -2856,7 +3004,8 @@ class Title {
/**
* What is the page_latest field for this page?
*
- * @param $flags Int a bit field; may be Title::GAID_FOR_UPDATE to select for update
+ * @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select for update
+ * @throws MWException
* @return Int or 0 if the page doesn't exist
*/
public function getLatestRevID( $flags = 0 ) {
@@ -2868,7 +3017,15 @@ class Title {
return $this->mLatestID = 0;
}
$linkCache = LinkCache::singleton();
- $this->mLatestID = intval( $linkCache->getGoodLinkFieldObj( $this, 'revision' ) );
+ $linkCache->addLinkObj( $this );
+ $cached = $linkCache->getGoodLinkFieldObj( $this, 'revision' );
+ if ( $cached === null ) { # check the assumption that the cache actually knows about this title
+ # XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
+ # as a stop gap, perhaps log this, but don't throw an exception?
+ throw new MWException( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
+ }
+
+ $this->mLatestID = intval( $cached );
return $this->mLatestID;
}
@@ -2881,7 +3038,7 @@ class Title {
* loading of the new page_id. It's also called from
* WikiPage::doDeleteArticleReal()
*
- * @param $newid Int the new Article ID
+ * @param int $newid the new Article ID
*/
public function resetArticleID( $newid ) {
$linkCache = LinkCache::singleton();
@@ -2897,14 +3054,15 @@ class Title {
$this->mRedirect = null;
$this->mLength = -1;
$this->mLatestID = false;
+ $this->mContentModel = false;
$this->mEstimateRevisions = null;
}
/**
* Capitalize a text string for a title if it belongs to a namespace that capitalizes
*
- * @param $text String containing title to capitalize
- * @param $ns int namespace index, defaults to NS_MAIN
+ * @param string $text containing title to capitalize
+ * @param int $ns namespace index, defaults to NS_MAIN
* @return String containing capitalized title
*/
public static function capitalize( $text, $ns = NS_MAIN ) {
@@ -3049,15 +3207,18 @@ class Title {
# Pages with "/./" or "/../" appearing in the URLs will often be un-
# reachable due to the way web browsers deal with 'relative' URLs.
# Also, they conflict with subpage syntax. Forbid them explicitly.
- if ( strpos( $dbkey, '.' ) !== false &&
- ( $dbkey === '.' || $dbkey === '..' ||
- strpos( $dbkey, './' ) === 0 ||
- strpos( $dbkey, '../' ) === 0 ||
- strpos( $dbkey, '/./' ) !== false ||
- strpos( $dbkey, '/../' ) !== false ||
- substr( $dbkey, -2 ) == '/.' ||
- substr( $dbkey, -3 ) == '/..' ) )
- {
+ if (
+ strpos( $dbkey, '.' ) !== false &&
+ (
+ $dbkey === '.' || $dbkey === '..' ||
+ strpos( $dbkey, './' ) === 0 ||
+ strpos( $dbkey, '../' ) === 0 ||
+ strpos( $dbkey, '/./' ) !== false ||
+ strpos( $dbkey, '/../' ) !== false ||
+ substr( $dbkey, -2 ) == '/.' ||
+ substr( $dbkey, -3 ) == '/..'
+ )
+ ) {
return false;
}
@@ -3070,9 +3231,10 @@ class Title {
# underlying database field. We make an exception for special pages, which
# don't need to be stored in the database, and may edge over 255 bytes due
# to subpage syntax for long titles, e.g. [[Special:Block/Long name]]
- if ( ( $this->mNamespace != NS_SPECIAL && strlen( $dbkey ) > 255 ) ||
- strlen( $dbkey ) > 512 )
- {
+ if (
+ ( $this->mNamespace != NS_SPECIAL && strlen( $dbkey ) > 255 )
+ || strlen( $dbkey ) > 512
+ ) {
return false;
}
@@ -3121,9 +3283,9 @@ class Title {
* WARNING: do not use this function on arbitrary user-supplied titles!
* On heavily-used templates it will max out the memory.
*
- * @param $options Array: may be FOR UPDATE
- * @param $table String: table name
- * @param $prefix String: fields prefix
+ * @param array $options may be FOR UPDATE
+ * @param string $table table name
+ * @param string $prefix fields prefix
* @return Array of Title objects linking here
*/
public function getLinksTo( $options = array(), $table = 'pagelinks', $prefix = 'pl' ) {
@@ -3135,7 +3297,7 @@ class Title {
$res = $db->select(
array( 'page', $table ),
- array( 'page_namespace', 'page_title', 'page_id', 'page_len', 'page_is_redirect', 'page_latest' ),
+ self::getSelectFields(),
array(
"{$prefix}_from=page_id",
"{$prefix}_namespace" => $this->getNamespace(),
@@ -3165,7 +3327,7 @@ class Title {
* WARNING: do not use this function on arbitrary user-supplied titles!
* On heavily-used templates it will max out the memory.
*
- * @param $options Array: may be FOR UPDATE
+ * @param array $options may be FOR UPDATE
* @return Array of Title the Title objects linking here
*/
public function getTemplateLinksTo( $options = array() ) {
@@ -3179,12 +3341,14 @@ class Title {
* WARNING: do not use this function on arbitrary user-supplied titles!
* On heavily-used templates it will max out the memory.
*
- * @param $options Array: may be FOR UPDATE
- * @param $table String: table name
- * @param $prefix String: fields prefix
+ * @param array $options may be FOR UPDATE
+ * @param string $table table name
+ * @param string $prefix fields prefix
* @return Array of Title objects linking here
*/
public function getLinksFrom( $options = array(), $table = 'pagelinks', $prefix = 'pl' ) {
+ global $wgContentHandlerUseDB;
+
$id = $this->getArticleID();
# If the page doesn't exist; there can't be any link from this page
@@ -3201,9 +3365,12 @@ class Title {
$namespaceFiled = "{$prefix}_namespace";
$titleField = "{$prefix}_title";
+ $fields = array( $namespaceFiled, $titleField, 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
+ if ( $wgContentHandlerUseDB ) $fields[] = 'page_content_model';
+
$res = $db->select(
array( $table, 'page' ),
- array( $namespaceFiled, $titleField, 'page_id', 'page_len', 'page_is_redirect', 'page_latest' ),
+ $fields,
array( "{$prefix}_from" => $id ),
__METHOD__,
$options,
@@ -3235,7 +3402,7 @@ class Title {
* WARNING: do not use this function on arbitrary user-supplied titles!
* On heavily-used templates it will max out the memory.
*
- * @param $options Array: may be FOR UPDATE
+ * @param array $options may be FOR UPDATE
* @return Array of Title the Title objects used here
*/
public function getTemplateLinksFrom( $options = array() ) {
@@ -3278,7 +3445,6 @@ class Title {
return $retVal;
}
-
/**
* Get a list of URLs to purge from the Squid cache when this
* page changes
@@ -3329,13 +3495,13 @@ class Title {
* Returns true if ok, or a getUserPermissionsErrors()-like array otherwise
*
* @param $nt Title the new title
- * @param $auth Bool indicates whether $wgUser's permissions
+ * @param bool $auth indicates whether $wgUser's permissions
* should be checked
- * @param $reason String is the log summary of the move, used for spam checking
+ * @param string $reason is the log summary of the move, used for spam checking
* @return Mixed True on success, getUserPermissionsErrors()-like array on failure
*/
public function isValidMoveOperation( &$nt, $auth = true, $reason = '' ) {
- global $wgUser;
+ global $wgUser, $wgContentHandlerUseDB;
$errors = array();
if ( !$nt ) {
@@ -3362,12 +3528,25 @@ class Title {
if ( strlen( $nt->getDBkey() ) < 1 ) {
$errors[] = array( 'articleexists' );
}
- if ( ( $this->getDBkey() == '' ) ||
- ( !$oldid ) ||
- ( $nt->getDBkey() == '' ) ) {
+ if (
+ ( $this->getDBkey() == '' ) ||
+ ( !$oldid ) ||
+ ( $nt->getDBkey() == '' )
+ ) {
$errors[] = array( 'badarticleerror' );
}
+ // Content model checks
+ if ( !$wgContentHandlerUseDB &&
+ $this->getContentModel() !== $nt->getContentModel() ) {
+ // can't move a page if that would change the page's content model
+ $errors[] = array(
+ 'bad-target-model',
+ ContentHandler::getLocalizedName( $this->getContentModel() ),
+ ContentHandler::getLocalizedName( $nt->getContentModel() )
+ );
+ }
+
// Image-specific checks
if ( $this->getNamespace() == NS_FILE ) {
$errors = array_merge( $errors, $this->validateFileMoveOperation( $nt ) );
@@ -3460,10 +3639,10 @@ class Title {
* Move a title to a new location
*
* @param $nt Title the new title
- * @param $auth Bool indicates whether $wgUser's permissions
+ * @param bool $auth indicates whether $wgUser's permissions
* should be checked
- * @param $reason String the reason for the move
- * @param $createRedirect Bool Whether to create a redirect from the old title to the new title.
+ * @param string $reason the reason for the move
+ * @param bool $createRedirect Whether to create a redirect from the old title to the new title.
* Ignored if the user doesn't have the suppressredirect right.
* @return Mixed true on success, getUserPermissionsErrors()-like array on failure
*/
@@ -3558,8 +3737,8 @@ class Title {
}
# Update watchlists
- $oldnamespace = $this->getNamespace() & ~1;
- $newnamespace = $nt->getNamespace() & ~1;
+ $oldnamespace = MWNamespace::getSubject( $this->getNamespace() );
+ $newnamespace = MWNamespace::getSubject( $nt->getNamespace() );
$oldtitle = $this->getDBkey();
$newtitle = $nt->getDBkey();
@@ -3578,8 +3757,8 @@ class Title {
* source page or nonexistent
*
* @param $nt Title the page to move to, which should be a redirect or nonexistent
- * @param $reason String The reason for the move
- * @param $createRedirect Bool Whether to leave a redirect at the old title. Does not check
+ * @param string $reason The reason for the move
+ * @param bool $createRedirect Whether to leave a redirect at the old title. Does not check
* if the user has the suppressredirect right
* @throws MWException
*/
@@ -3594,7 +3773,14 @@ class Title {
$logType = 'move';
}
- $redirectSuppressed = !$createRedirect;
+ if ( $createRedirect ) {
+ $contentHandler = ContentHandler::getForTitle( $this );
+ $redirectContent = $contentHandler->makeRedirectContent( $nt );
+
+ // NOTE: If this page's content model does not support redirects, $redirectContent will be null.
+ } else {
+ $redirectContent = null;
+ }
$logEntry = new ManualLogEntry( 'move', $logType );
$logEntry->setPerformer( $wgUser );
@@ -3602,7 +3788,7 @@ class Title {
$logEntry->setComment( $reason );
$logEntry->setParameters( array(
'4::target' => $nt->getPrefixedText(),
- '5::noredir' => $redirectSuppressed ? '1': '0',
+ '5::noredir' => $redirectContent ? '0': '1',
) );
$formatter = LogFormatter::newFromEntry( $logEntry );
@@ -3637,7 +3823,8 @@ class Title {
if ( !is_object( $nullRevision ) ) {
throw new MWException( 'No valid null revision produced in ' . __METHOD__ );
}
- $nullRevId = $nullRevision->insertOn( $dbw );
+
+ $nullRevision->insertOn( $dbw );
# Change the name of the target page:
$dbw->update( 'page',
@@ -3664,18 +3851,17 @@ class Title {
}
# Recreate the redirect, this time in the other direction.
- if ( $redirectSuppressed ) {
+ if ( !$redirectContent ) {
WikiPage::onArticleDelete( $this );
} else {
- $mwRedir = MagicWord::get( 'redirect' );
- $redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $nt->getPrefixedText() . "]]\n";
$redirectArticle = WikiPage::factory( $this );
$newid = $redirectArticle->insertOn( $dbw );
if ( $newid ) { // sanity
$redirectRevision = new Revision( array(
+ 'title' => $this, // for determining the default content model
'page' => $newid,
'comment' => $comment,
- 'text' => $redirectText ) );
+ 'content' => $redirectContent ) );
$redirectRevision->insertOn( $dbw );
$redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
@@ -3695,9 +3881,9 @@ class Title {
* Move this page's subpages to be subpages of $nt
*
* @param $nt Title Move target
- * @param $auth bool Whether $wgUser's permissions should be checked
- * @param $reason string The reason for the move
- * @param $createRedirect bool Whether to create redirects from the old subpages to
+ * @param bool $auth Whether $wgUser's permissions should be checked
+ * @param string $reason The reason for the move
+ * @param bool $createRedirect Whether to create redirects from the old subpages to
* the new ones Ignored if the user doesn't have the 'suppressredirect' right
* @return mixed array with old page titles as keys, and strings (new page titles) or
* arrays (errors) as values, or an error array with numeric indices if no pages
@@ -3771,10 +3957,16 @@ class Title {
* @return Bool
*/
public function isSingleRevRedirect() {
+ global $wgContentHandlerUseDB;
+
$dbw = wfGetDB( DB_MASTER );
+
# Is it a redirect?
+ $fields = array( 'page_is_redirect', 'page_latest', 'page_id' );
+ if ( $wgContentHandlerUseDB ) $fields[] = 'page_content_model';
+
$row = $dbw->selectRow( 'page',
- array( 'page_is_redirect', 'page_latest', 'page_id' ),
+ $fields,
$this->pageCond(),
__METHOD__,
array( 'FOR UPDATE' )
@@ -3783,6 +3975,7 @@ class Title {
$this->mArticleID = $row ? intval( $row->page_id ) : 0;
$this->mRedirect = $row ? (bool)$row->page_is_redirect : false;
$this->mLatestID = $row ? intval( $row->page_latest ) : false;
+ $this->mContentModel = $row && isset( $row->page_content_model ) ? strval( $row->page_content_model ) : false;
if ( !$this->mRedirect ) {
return false;
}
@@ -3824,27 +4017,28 @@ class Title {
}
# Get the article text
$rev = Revision::newFromTitle( $nt, false, Revision::READ_LATEST );
- if( !is_object( $rev ) ){
+ if( !is_object( $rev ) ) {
return false;
}
- $text = $rev->getText();
+ $content = $rev->getContent();
# Does the redirect point to the source?
# Or is it a broken self-redirect, usually caused by namespace collisions?
- $m = array();
- if ( preg_match( "/\\[\\[\\s*([^\\]\\|]*)]]/", $text, $m ) ) {
- $redirTitle = Title::newFromText( $m[1] );
- if ( !is_object( $redirTitle ) ||
- ( $redirTitle->getPrefixedDBkey() != $this->getPrefixedDBkey() &&
- $redirTitle->getPrefixedDBkey() != $nt->getPrefixedDBkey() ) ) {
+ $redirTitle = $content ? $content->getRedirectTarget() : null;
+
+ if ( $redirTitle ) {
+ if ( $redirTitle->getPrefixedDBkey() != $this->getPrefixedDBkey() &&
+ $redirTitle->getPrefixedDBkey() != $nt->getPrefixedDBkey() ) {
wfDebug( __METHOD__ . ": redirect points to other page\n" );
return false;
+ } else {
+ return true;
}
} else {
- # Fail safe
- wfDebug( __METHOD__ . ": failsafe\n" );
+ # Fail safe (not a redirect after all. strange.)
+ wfDebug( __METHOD__ . ": failsafe: database sais " . $nt->getPrefixedDBkey() .
+ " is a redirect, but it doesn't contain a valid redirect.\n" );
return false;
}
- return true;
}
/**
@@ -3867,15 +4061,14 @@ class Title {
$dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'categorylinks', '*',
- array(
- 'cl_from' => $titleKey,
- ),
- __METHOD__,
- array()
+ $res = $dbr->select(
+ 'categorylinks',
+ 'cl_to',
+ array( 'cl_from' => $titleKey ),
+ __METHOD__
);
- if ( $dbr->numRows( $res ) > 0 ) {
+ if ( $res->numRows() > 0 ) {
foreach ( $res as $row ) {
// $data[] = Title::newFromText($wgContLang->getNSText ( NS_CATEGORY ).':'.$row->cl_to);
$data[$wgContLang->getNSText( NS_CATEGORY ) . ':' . $row->cl_to] = $this->getFullText();
@@ -3887,7 +4080,7 @@ class Title {
/**
* Get a tree of parent categories
*
- * @param $children Array with the children in the keys, to check for circular refs
+ * @param array $children with the children in the keys, to check for circular refs
* @return Array Tree of parent categories
*/
public function getParentCategoryTree( $children = array() ) {
@@ -3929,8 +4122,8 @@ class Title {
/**
* Get the revision ID of the previous revision
*
- * @param $revId Int Revision ID. Get the revision that was before this one.
- * @param $flags Int Title::GAID_FOR_UPDATE
+ * @param int $revId Revision ID. Get the revision that was before this one.
+ * @param int $flags Title::GAID_FOR_UPDATE
* @return Int|Bool Old revision ID, or FALSE if none exists
*/
public function getPreviousRevisionID( $revId, $flags = 0 ) {
@@ -3954,8 +4147,8 @@ class Title {
/**
* Get the revision ID of the next revision
*
- * @param $revId Int Revision ID. Get the revision that was after this one.
- * @param $flags Int Title::GAID_FOR_UPDATE
+ * @param int $revId Revision ID. Get the revision that was after this one.
+ * @param int $flags Title::GAID_FOR_UPDATE
* @return Int|Bool Next revision ID, or FALSE if none exists
*/
public function getNextRevisionID( $revId, $flags = 0 ) {
@@ -3979,7 +4172,7 @@ class Title {
/**
* Get the first revision of the page
*
- * @param $flags Int Title::GAID_FOR_UPDATE
+ * @param int $flags Title::GAID_FOR_UPDATE
* @return Revision|Null if page doesn't exist
*/
public function getFirstRevision( $flags = 0 ) {
@@ -4001,7 +4194,7 @@ class Title {
/**
* Get the oldest revision timestamp of this page
*
- * @param $flags Int Title::GAID_FOR_UPDATE
+ * @param int $flags Title::GAID_FOR_UPDATE
* @return String: MW timestamp
*/
public function getEarliestRevTime( $flags = 0 ) {
@@ -4058,8 +4251,8 @@ class Title {
* Get the number of revisions between the given revision.
* Used for diffs and other things that really need it.
*
- * @param $old int|Revision Old revision or rev ID (first before range)
- * @param $new int|Revision New revision or rev ID (first after range)
+ * @param int|Revision $old Old revision or rev ID (first before range)
+ * @param int|Revision $new New revision or rev ID (first after range)
* @return Int Number of revisions between these revisions.
*/
public function countRevisionsBetween( $old, $new ) {
@@ -4087,10 +4280,10 @@ class Title {
* Get the number of authors between the given revisions or revision IDs.
* Used for diffs and other things that really need it.
*
- * @param $old int|Revision Old revision or rev ID (first before range by default)
- * @param $new int|Revision New revision or rev ID (first after range by default)
- * @param $limit int Maximum number of authors
- * @param $options string|array (Optional): Single option, or an array of options:
+ * @param int|Revision $old Old revision or rev ID (first before range by default)
+ * @param int|Revision $new New revision or rev ID (first after range by default)
+ * @param int $limit Maximum number of authors
+ * @param string|array $options (Optional): Single option, or an array of options:
* 'include_old' Include $old in the range; $new is excluded.
* 'include_new' Include $new in the range; $old is excluded.
* 'include_both' Include both $old and $new in the range.
@@ -4112,7 +4305,7 @@ class Title {
}
$old_cmp = '>';
$new_cmp = '<';
- $options = (array) $options;
+ $options = (array)$options;
if ( in_array( 'include_old', $options ) ) {
$old_cmp = '>=';
}
@@ -4202,7 +4395,7 @@ class Title {
$isKnown = null;
/**
- * Allows overriding default behaviour for determining if a page exists.
+ * Allows overriding default behavior for determining if a page exists.
* If $isKnown is kept as null, regular checks happen. If it's
* a boolean, this value is returned by the isKnown method.
*
@@ -4271,7 +4464,7 @@ class Title {
// Use always content language to avoid loading hundreds of languages
// to get the link color.
global $wgContLang;
- list( $name, $lang ) = MessageCache::singleton()->figureMessage( $wgContLang->lcfirst( $this->getText() ) );
+ list( $name, ) = MessageCache::singleton()->figureMessage( $wgContLang->lcfirst( $this->getText() ) );
$message = wfMessage( $name )->inLanguage( $wgContLang )->useDatabase( false );
return $message->exists();
}
@@ -4304,9 +4497,10 @@ class Title {
/**
* Updates page_touched for this page; called from LinksUpdate.php
*
- * @return Bool true if the update succeded
+ * @return Bool true if the update succeeded
*/
public function invalidateCache() {
+ global $wgMemc;
if ( wfReadOnly() ) {
return false;
}
@@ -4318,12 +4512,20 @@ class Title {
__METHOD__
);
HTMLFileCache::clearFileCache( $this );
+
+ // Clear page info.
+ $revision = WikiPage::factory( $this )->getRevision();
+ if( $revision !== null ) {
+ $memcKey = wfMemcKey( 'infoaction', $this->getPrefixedText(), $revision->getId() );
+ $success = $success && $wgMemc->delete( $memcKey );
+ }
+
return $success;
}
/**
* Update page_touched timestamps and send squid purge messages for
- * pages linking to this title. May be sent to the job queue depending
+ * pages linking to this title. May be sent to the job queue depending
* on the number of links. Typically called on create and delete.
*/
public function touchLinks() {
@@ -4389,14 +4591,14 @@ class Title {
/**
* Generate strings used for xml 'id' names in monobook tabs
*
- * @param $prepend string defaults to 'nstab-'
+ * @param string $prepend defaults to 'nstab-'
* @return String XML 'id' name
*/
public function getNamespaceKey( $prepend = 'nstab-' ) {
global $wgContLang;
// Gets the subject namespace if this title
$namespace = MWNamespace::getSubject( $this->getNamespace() );
- // Checks if cononical namespace name exists for namespace
+ // Checks if canonical namespace name exists for namespace
if ( MWNamespace::exists( $this->getNamespace() ) ) {
// Uses canonical namespace name
$namespaceKey = MWNamespace::getCanonicalName( $namespace );
@@ -4420,7 +4622,7 @@ class Title {
/**
* Get all extant redirects to this Title
*
- * @param $ns Int|Null Single namespace to consider; NULL to consider all namespaces
+ * @param int|Null $ns Single namespace to consider; NULL to consider all namespaces
* @return Array of Title redirects to this title
*/
public function getRedirectsHere( $ns = null ) {
@@ -4462,7 +4664,7 @@ class Title {
public function isValidRedirectTarget() {
global $wgInvalidRedirectTargets;
- // invalid redirect targets are stored in a global array, but explicity disallow Userlogout here
+ // invalid redirect targets are stored in a global array, but explicitly disallow Userlogout here
if ( $this->isSpecial( 'Userlogout' ) ) {
return false;
}
@@ -4506,7 +4708,7 @@ class Title {
* prefix. This will be fed to Collation::getSortKey() to get a
* binary sortkey that can be used for actual sorting.
*
- * @param $prefix string The prefix to be used, specified using
+ * @param string $prefix The prefix to be used, specified using
* {{defaultsort:}} or like [[Category:Foo|prefix]]. Empty for no
* prefix.
* @return string
@@ -4543,19 +4745,13 @@ class Title {
if ( $this->isSpecialPage() ) {
// special pages are in the user language
return $wgLang;
- } elseif ( $this->isCssOrJsPage() || $this->isCssJsSubpage() ) {
- // css/js should always be LTR and is, in fact, English
- return wfGetLangObj( 'en' );
- } elseif ( $this->getNamespace() == NS_MEDIAWIKI ) {
- // Parse mediawiki messages with correct target language
- list( /* $unused */, $lang ) = MessageCache::singleton()->figureMessage( $this->getText() );
- return wfGetLangObj( $lang );
}
- global $wgContLang;
- // If nothing special, it should be in the wiki content language
- $pageLang = $wgContLang;
- // Hook at the end because we don't want to override the above stuff
- wfRunHooks( 'PageContentLanguage', array( $this, &$pageLang, $wgLang ) );
+
+ //TODO: use the LinkCache to cache this! Note that this may depend on user settings, so the cache should be only per-request.
+ //NOTE: ContentHandler::getPageLanguage() may need to load the content to determine the page language!
+ $contentHandler = ContentHandler::getForTitle( $this );
+ $pageLang = $contentHandler->getPageLanguage( $this );
+
return wfGetLangObj( $pageLang );
}
@@ -4568,19 +4764,62 @@ class Title {
* @return Language
*/
public function getPageViewLanguage() {
- $pageLang = $this->getPageLanguage();
- // If this is nothing special (so the content is converted when viewed)
- if ( !$this->isSpecialPage()
- && !$this->isCssOrJsPage() && !$this->isCssJsSubpage()
- && $this->getNamespace() !== NS_MEDIAWIKI
- ) {
+ global $wgLang;
+
+ if ( $this->isSpecialPage() ) {
// If the user chooses a variant, the content is actually
// in a language whose code is the variant code.
- $variant = $pageLang->getPreferredVariant();
- if ( $pageLang->getCode() !== $variant ) {
- $pageLang = Language::factory( $variant );
+ $variant = $wgLang->getPreferredVariant();
+ if ( $wgLang->getCode() !== $variant ) {
+ return Language::factory( $variant );
}
+
+ return $wgLang;
}
+
+ //NOTE: can't be cached persistently, depends on user settings
+ //NOTE: ContentHandler::getPageViewLanguage() may need to load the content to determine the page language!
+ $contentHandler = ContentHandler::getForTitle( $this );
+ $pageLang = $contentHandler->getPageViewLanguage( $this );
return $pageLang;
}
+
+ /**
+ * Get a list of rendered edit notices for this page.
+ *
+ * Array is keyed by the original message key, and values are rendered using parseAsBlock, so
+ * they will already be wrapped in paragraphs.
+ *
+ * @since 1.21
+ * @return Array
+ */
+ public function getEditNotices() {
+ $notices = array();
+
+ # Optional notices on a per-namespace and per-page basis
+ $editnotice_ns = 'editnotice-' . $this->getNamespace();
+ $editnotice_ns_message = wfMessage( $editnotice_ns );
+ if ( $editnotice_ns_message->exists() ) {
+ $notices[$editnotice_ns] = $editnotice_ns_message->parseAsBlock();
+ }
+ if ( MWNamespace::hasSubpages( $this->getNamespace() ) ) {
+ $parts = explode( '/', $this->getDBkey() );
+ $editnotice_base = $editnotice_ns;
+ while ( count( $parts ) > 0 ) {
+ $editnotice_base .= '-' . array_shift( $parts );
+ $editnotice_base_msg = wfMessage( $editnotice_base );
+ if ( $editnotice_base_msg->exists() ) {
+ $notices[$editnotice_base] = $editnotice_base_msg->parseAsBlock();
+ }
+ }
+ } else {
+ # Even if there are no subpages in namespace, we still don't want / in MW ns.
+ $editnoticeText = $editnotice_ns . '-' . str_replace( '/', '-', $this->getDBkey() );
+ $editnoticeMsg = wfMessage( $editnoticeText );
+ if ( $editnoticeMsg->exists() ) {
+ $notices[$editnoticeText] = $editnoticeMsg->parseAsBlock();
+ }
+ }
+ return $notices;
+ }
}
diff --git a/includes/TitleArray.php b/includes/TitleArray.php
index 5cdec16d..90fb861a 100644
--- a/includes/TitleArray.php
+++ b/includes/TitleArray.php
@@ -3,8 +3,8 @@
* Classes to walk into a list of Title objects.
*
* Note: this entire file is a byte-for-byte copy of UserArray.php with
- * s/User/Title/. If anyone can figure out how to do this nicely with inheri-
- * tance or something, please do so.
+ * s/User/Title/. If anyone can figure out how to do this nicely with
+ * inheritance or something, please do so.
*
* 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
diff --git a/includes/UIDGenerator.php b/includes/UIDGenerator.php
new file mode 100644
index 00000000..b042d8c7
--- /dev/null
+++ b/includes/UIDGenerator.php
@@ -0,0 +1,350 @@
+<?php
+/**
+ * This file deals with UID generation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class for getting statistically unique IDs
+ *
+ * @since 1.21
+ */
+class UIDGenerator {
+ /** @var UIDGenerator */
+ protected static $instance = null;
+
+ protected $nodeId32; // string; node ID in binary (32 bits)
+ protected $nodeId48; // string; node ID in binary (48 bits)
+
+ protected $lockFile88; // string; local file path
+ protected $lockFile128; // string; local file path
+
+ /** @var Array */
+ protected $fileHandles = array(); // cache file handles
+
+ const QUICK_RAND = 1; // get randomness from fast and insecure sources
+
+ protected function __construct() {
+ $idFile = wfTempDir() . '/mw-' . __CLASS__ . '-UID-nodeid';
+ $nodeId = is_file( $idFile ) ? file_get_contents( $idFile ) : '';
+ // Try to get some ID that uniquely identifies this machine (RFC 4122)...
+ if ( !preg_match( '/^[0-9a-f]{12}$/i', $nodeId ) ) {
+ wfSuppressWarnings();
+ if ( wfIsWindows() ) {
+ // http://technet.microsoft.com/en-us/library/bb490913.aspx
+ $csv = trim( wfShellExec( 'getmac /NH /FO CSV' ) );
+ $line = substr( $csv, 0, strcspn( $csv, "\n" ) );
+ $info = str_getcsv( $line );
+ $nodeId = isset( $info[0] ) ? str_replace( '-', '', $info[0] ) : '';
+ } elseif ( is_executable( '/sbin/ifconfig' ) ) { // Linux/BSD/Solaris/OS X
+ // See http://linux.die.net/man/8/ifconfig
+ $m = array();
+ preg_match( '/\s([0-9a-f]{2}(:[0-9a-f]{2}){5})\s/',
+ wfShellExec( '/sbin/ifconfig -a' ), $m );
+ $nodeId = isset( $m[1] ) ? str_replace( ':', '', $m[1] ) : '';
+ }
+ wfRestoreWarnings();
+ if ( !preg_match( '/^[0-9a-f]{12}$/i', $nodeId ) ) {
+ $nodeId = MWCryptRand::generateHex( 12, true );
+ $nodeId[1] = dechex( hexdec( $nodeId[1] ) | 0x1 ); // set multicast bit
+ }
+ file_put_contents( $idFile, $nodeId ); // cache
+ }
+ $this->nodeId32 = wfBaseConvert( substr( sha1( $nodeId ), 0, 8 ), 16, 2, 32 );
+ $this->nodeId48 = wfBaseConvert( $nodeId, 16, 2, 48 );
+ // If different processes run as different users, they may have different temp dirs.
+ // This is dealt with by initializing the clock sequence number and counters randomly.
+ $this->lockFile88 = wfTempDir() . '/mw-' . __CLASS__ . '-UID-88';
+ $this->lockFile128 = wfTempDir() . '/mw-' . __CLASS__ . '-UID-128';
+ }
+
+ /**
+ * @return UIDGenerator
+ */
+ protected static function singleton() {
+ if ( self::$instance === null ) {
+ self::$instance = new self();
+ }
+ return self::$instance;
+ }
+
+ /**
+ * Get a statistically unique 88-bit unsigned integer ID string.
+ * The bits of the UID are prefixed with the time (down to the millisecond).
+ *
+ * These IDs are suitable as values for the shard key of distributed data.
+ * If a column uses these as values, it should be declared UNIQUE to handle collisions.
+ * New rows almost always have higher UIDs, which makes B-TREE updates on INSERT fast.
+ * They can also be stored "DECIMAL(27) UNSIGNED" or BINARY(11) in MySQL.
+ *
+ * UID generation is serialized on each server (as the node ID is for the whole machine).
+ *
+ * @param $base integer Specifies a base other than 10
+ * @return string Number
+ * @throws MWException
+ */
+ public static function newTimestampedUID88( $base = 10 ) {
+ if ( !is_integer( $base ) || $base > 36 || $base < 2 ) {
+ throw new MWException( "Base must an integer be between 2 and 36" );
+ }
+ $gen = self::singleton();
+ $time = $gen->getTimestampAndDelay( 'lockFile88', 1, 1024 );
+ return wfBaseConvert( $gen->getTimestampedID88( $time ), 2, $base );
+ }
+
+ /**
+ * @param array $time (UIDGenerator::millitime(), clock sequence)
+ * @return string 88 bits
+ */
+ protected function getTimestampedID88( array $info ) {
+ list( $time, $counter ) = $info;
+ // Take the 46 MSBs of "milliseconds since epoch"
+ $id_bin = $this->millisecondsSinceEpochBinary( $time );
+ // Add a 10 bit counter resulting in 56 bits total
+ $id_bin .= str_pad( decbin( $counter ), 10, '0', STR_PAD_LEFT );
+ // Add the 32 bit node ID resulting in 88 bits total
+ $id_bin .= $this->nodeId32;
+ // Convert to a 1-27 digit integer string
+ if ( strlen( $id_bin ) !== 88 ) {
+ throw new MWException( "Detected overflow for millisecond timestamp." );
+ }
+ return $id_bin;
+ }
+
+ /**
+ * Get a statistically unique 128-bit unsigned integer ID string.
+ * The bits of the UID are prefixed with the time (down to the millisecond).
+ *
+ * These IDs are suitable as globally unique IDs, without any enforced uniqueness.
+ * New rows almost always have higher UIDs, which makes B-TREE updates on INSERT fast.
+ * They can also be stored as "DECIMAL(39) UNSIGNED" or BINARY(16) in MySQL.
+ *
+ * UID generation is serialized on each server (as the node ID is for the whole machine).
+ *
+ * @param $base integer Specifies a base other than 10
+ * @return string Number
+ * @throws MWException
+ */
+ public static function newTimestampedUID128( $base = 10 ) {
+ if ( !is_integer( $base ) || $base > 36 || $base < 2 ) {
+ throw new MWException( "Base must be an integer between 2 and 36" );
+ }
+ $gen = self::singleton();
+ $time = $gen->getTimestampAndDelay( 'lockFile128', 16384, 1048576 );
+ return wfBaseConvert( $gen->getTimestampedID128( $time ), 2, $base );
+ }
+
+ /**
+ * @param array $info (UIDGenerator::millitime(), counter, clock sequence)
+ * @return string 128 bits
+ */
+ protected function getTimestampedID128( array $info ) {
+ list( $time, $counter, $clkSeq ) = $info;
+ // Take the 46 MSBs of "milliseconds since epoch"
+ $id_bin = $this->millisecondsSinceEpochBinary( $time );
+ // Add a 20 bit counter resulting in 66 bits total
+ $id_bin .= str_pad( decbin( $counter ), 20, '0', STR_PAD_LEFT );
+ // Add a 14 bit clock sequence number resulting in 80 bits total
+ $id_bin .= str_pad( decbin( $clkSeq ), 14, '0', STR_PAD_LEFT );
+ // Add the 48 bit node ID resulting in 128 bits total
+ $id_bin .= $this->nodeId48;
+ // Convert to a 1-39 digit integer string
+ if ( strlen( $id_bin ) !== 128 ) {
+ throw new MWException( "Detected overflow for millisecond timestamp." );
+ }
+ return $id_bin;
+ }
+
+ /**
+ * Return an RFC4122 compliant v4 UUID
+ *
+ * @param $flags integer Bitfield (supports UIDGenerator::QUICK_RAND)
+ * @return string
+ * @throws MWException
+ */
+ public static function newUUIDv4( $flags = 0 ) {
+ $hex = ( $flags & self::QUICK_RAND )
+ ? wfRandomString( 31 )
+ : MWCryptRand::generateHex( 31 );
+
+ return sprintf( '%s-%s-%s-%s-%s',
+ // "time_low" (32 bits)
+ substr( $hex, 0, 8 ),
+ // "time_mid" (16 bits)
+ substr( $hex, 8, 4 ),
+ // "time_hi_and_version" (16 bits)
+ '4' . substr( $hex, 12, 3 ),
+ // "clk_seq_hi_res (8 bits, variant is binary 10x) and "clk_seq_low" (8 bits)
+ dechex( 0x8 | ( hexdec( $hex[15] ) & 0x3 ) ) . $hex[16] . substr( $hex, 17, 2 ),
+ // "node" (48 bits)
+ substr( $hex, 19, 12 )
+ );
+ }
+
+ /**
+ * Return an RFC4122 compliant v4 UUID
+ *
+ * @param $flags integer Bitfield (supports UIDGenerator::QUICK_RAND)
+ * @return string 32 hex characters with no hyphens
+ * @throws MWException
+ */
+ public static function newRawUUIDv4( $flags = 0 ) {
+ return str_replace( '-', '', self::newUUIDv4( $flags ) );
+ }
+
+ /**
+ * Get a (time,counter,clock sequence) where (time,counter) is higher
+ * than any previous (time,counter) value for the given clock sequence.
+ * This is useful for making UIDs sequential on a per-node bases.
+ *
+ * @param string $lockFile Name of a local lock file
+ * @param $clockSeqSize integer The number of possible clock sequence values
+ * @param $counterSize integer The number of possible counter values
+ * @return Array (result of UIDGenerator::millitime(), counter, clock sequence)
+ * @throws MWException
+ */
+ protected function getTimestampAndDelay( $lockFile, $clockSeqSize, $counterSize ) {
+ // Get the UID lock file handle
+ if ( isset( $this->fileHandles[$lockFile] ) ) {
+ $handle = $this->fileHandles[$lockFile];
+ } else {
+ $handle = fopen( $this->$lockFile, 'cb+' );
+ $this->fileHandles[$lockFile] = $handle ?: null; // cache
+ }
+ // Acquire the UID lock file
+ if ( $handle === false ) {
+ throw new MWException( "Could not open '{$this->$lockFile}'." );
+ } elseif ( !flock( $handle, LOCK_EX ) ) {
+ throw new MWException( "Could not acquire '{$this->$lockFile}'." );
+ }
+ // Get the current timestamp, clock sequence number, last time, and counter
+ rewind( $handle );
+ $data = explode( ' ', fgets( $handle ) ); // "<clk seq> <sec> <msec> <counter> <offset>"
+ $clockChanged = false; // clock set back significantly?
+ if ( count( $data ) == 5 ) { // last UID info already initialized
+ $clkSeq = (int) $data[0] % $clockSeqSize;
+ $prevTime = array( (int) $data[1], (int) $data[2] );
+ $offset = (int) $data[4] % $counterSize; // random counter offset
+ $counter = 0; // counter for UIDs with the same timestamp
+ // Delay until the clock reaches the time of the last ID.
+ // This detects any microtime() drift among processes.
+ $time = $this->timeWaitUntil( $prevTime );
+ if ( !$time ) { // too long to delay?
+ $clockChanged = true; // bump clock sequence number
+ $time = self::millitime();
+ } elseif ( $time == $prevTime ) {
+ // Bump the counter if there are timestamp collisions
+ $counter = (int) $data[3] % $counterSize;
+ if ( ++$counter >= $counterSize ) { // sanity (starts at 0)
+ flock( $handle, LOCK_UN ); // abort
+ throw new MWException( "Counter overflow for timestamp value." );
+ }
+ }
+ } else { // last UID info not initialized
+ $clkSeq = mt_rand( 0, $clockSeqSize - 1 );
+ $counter = 0;
+ $offset = mt_rand( 0, $counterSize - 1 );
+ $time = self::millitime();
+ }
+ // microtime() and gettimeofday() can drift from time() at least on Windows.
+ // The drift is immediate for processes running while the system clock changes.
+ // time() does not have this problem. See https://bugs.php.net/bug.php?id=42659.
+ if ( abs( time() - $time[0] ) >= 2 ) {
+ // We don't want processes using too high or low timestamps to avoid duplicate
+ // UIDs and clock sequence number churn. This process should just be restarted.
+ flock( $handle, LOCK_UN ); // abort
+ throw new MWException( "Process clock is outdated or drifted." );
+ }
+ // If microtime() is synced and a clock change was detected, then the clock went back
+ if ( $clockChanged ) {
+ // Bump the clock sequence number and also randomize the counter offset,
+ // which is useful for UIDs that do not include the clock sequence number.
+ $clkSeq = ( $clkSeq + 1 ) % $clockSeqSize;
+ $offset = mt_rand( 0, $counterSize - 1 );
+ trigger_error( "Clock was set back; sequence number incremented." );
+ }
+ // Update the (clock sequence number, timestamp, counter)
+ ftruncate( $handle, 0 );
+ rewind( $handle );
+ fwrite( $handle, "{$clkSeq} {$time[0]} {$time[1]} {$counter} {$offset}" );
+ fflush( $handle );
+ // Release the UID lock file
+ flock( $handle, LOCK_UN );
+
+ return array( $time, ( $counter + $offset ) % $counterSize, $clkSeq );
+ }
+
+ /**
+ * Wait till the current timestamp reaches $time and return the current
+ * timestamp. This returns false if it would have to wait more than 10ms.
+ *
+ * @param array $time Result of UIDGenerator::millitime()
+ * @return Array|bool UIDGenerator::millitime() result or false
+ */
+ protected function timeWaitUntil( array $time ) {
+ do {
+ $ct = self::millitime();
+ if ( $ct >= $time ) { // http://php.net/manual/en/language.operators.comparison.php
+ return $ct; // current timestamp is higher than $time
+ }
+ } while ( ( ( $time[0] - $ct[0] )*1000 + ( $time[1] - $ct[1] ) ) <= 10 );
+
+ return false;
+ }
+
+ /**
+ * @param array $time Result of UIDGenerator::millitime()
+ * @return string 46 MSBs of "milliseconds since epoch" in binary (rolls over in 4201)
+ */
+ protected function millisecondsSinceEpochBinary( array $time ) {
+ list( $sec, $msec ) = $time;
+ if ( PHP_INT_SIZE >= 8 ) { // 64 bit integers
+ $ts = ( 1000 * $sec + $msec );
+ $id_bin = str_pad( decbin( $ts % pow( 2, 46 ) ), 46, '0', STR_PAD_LEFT );
+ } elseif ( extension_loaded( 'gmp' ) ) {
+ $ts = gmp_mod( // wrap around
+ gmp_add( gmp_mul( (string) $sec, (string) 1000 ), (string) $msec ),
+ gmp_pow( '2', '46' )
+ );
+ $id_bin = str_pad( gmp_strval( $ts, 2 ), 46, '0', STR_PAD_LEFT );
+ } elseif ( extension_loaded( 'bcmath' ) ) {
+ $ts = bcmod( // wrap around
+ bcadd( bcmul( $sec, 1000 ), $msec ),
+ bcpow( 2, 46 )
+ );
+ $id_bin = wfBaseConvert( $ts, 10, 2, 46 );
+ } else {
+ throw new MWException( 'bcmath or gmp extension required for 32 bit machines.' );
+ }
+ return $id_bin;
+ }
+
+ /**
+ * @return Array (current time in seconds, milliseconds since then)
+ */
+ protected static function millitime() {
+ list( $msec, $sec ) = explode( ' ', microtime() );
+ return array( (int) $sec, (int) ( $msec * 1000 ) );
+ }
+
+ function __destruct() {
+ array_map( 'fclose', $this->fileHandles );
+ }
+}
diff --git a/includes/User.php b/includes/User.php
index 0a3db4c0..6b7348a8 100644
--- a/includes/User.php
+++ b/includes/User.php
@@ -253,7 +253,7 @@ class User {
/**
* @return String
*/
- function __toString(){
+ function __toString() {
return $this->getName();
}
@@ -286,10 +286,14 @@ class User {
$this->loadFromId();
break;
case 'session':
- $this->loadFromSession();
+ if( !$this->loadFromSession() ) {
+ // Loading from session failed. Load defaults.
+ $this->loadDefaults();
+ }
wfRunHooks( 'UserLoadAfterLoadFromSession', array( $this ) );
break;
default:
+ wfProfileOut( __METHOD__ );
throw new MWException( "Unrecognised value for User->mFrom: \"{$this->mFrom}\"" );
}
wfProfileOut( __METHOD__ );
@@ -329,6 +333,9 @@ class User {
$this->$name = $data[$name];
}
}
+
+ $this->mLoadedItems = true;
+
return true;
}
@@ -362,12 +369,12 @@ class User {
* This is slightly less efficient than newFromId(), so use newFromId() if
* you have both an ID and a name handy.
*
- * @param $name String Username, validated by Title::newFromText()
- * @param $validate String|Bool Validate username. Takes the same parameters as
+ * @param string $name Username, validated by Title::newFromText()
+ * @param string|Bool $validate Validate username. Takes the same parameters as
* User::getCanonicalName(), except that true is accepted as an alias
* for 'valid', for BC.
*
- * @return User object, or false if the username is invalid
+ * @return User|bool User object, or false if the username is invalid
* (e.g. if it contains illegal characters or is an IP address). If the
* username is not present in the database, the result will be a user object
* with a name, zero user ID and default settings.
@@ -392,7 +399,7 @@ class User {
/**
* Static factory method for creation from a given user ID.
*
- * @param $id Int Valid user ID
+ * @param int $id Valid user ID
* @return User The corresponding User object
*/
public static function newFromId( $id ) {
@@ -410,7 +417,7 @@ class User {
*
* If the code is invalid or has expired, returns NULL.
*
- * @param $code String Confirmation code
+ * @param string $code Confirmation code
* @return User object, or null
*/
public static function newFromConfirmationCode( $code ) {
@@ -430,8 +437,7 @@ class User {
* Create a new user object using data from session or cookies. If the
* login credentials are invalid, the result is an anonymous user.
*
- * @param $request WebRequest object to use; $wgRequest will be used if
- * ommited.
+ * @param $request WebRequest object to use; $wgRequest will be used if omitted.
* @return User object
*/
public static function newFromSession( WebRequest $request = null ) {
@@ -451,12 +457,13 @@ class User {
* user_name and user_real_name are not provided because the whole row
* will be loaded once more from the database when accessing them.
*
- * @param $row Array A row from the user table
+ * @param array $row A row from the user table
+ * @param array $data Further data to load into the object (see User::loadFromRow for valid keys)
* @return User
*/
- public static function newFromRow( $row ) {
+ public static function newFromRow( $row, $data = null ) {
$user = new User;
- $user->loadFromRow( $row );
+ $user->loadFromRow( $row, $data );
return $user;
}
@@ -464,7 +471,7 @@ class User {
/**
* Get the username corresponding to a given user ID
- * @param $id Int User ID
+ * @param int $id User ID
* @return String|bool The corresponding username
*/
public static function whoIs( $id ) {
@@ -474,7 +481,7 @@ class User {
/**
* Get the real name of a user given their user ID
*
- * @param $id Int User ID
+ * @param int $id User ID
* @return String|bool The corresponding user's real name
*/
public static function whoIsReal( $id ) {
@@ -483,7 +490,7 @@ class User {
/**
* Get database id given a user name
- * @param $name String Username
+ * @param string $name Username
* @return Int|Null The corresponding user's ID, or null if user is nonexistent
*/
public static function idFromName( $name ) {
@@ -535,22 +542,22 @@ class User {
* addresses like this, if we allowed accounts like this to be created
* new users could get the old edits of these anonymous users.
*
- * @param $name String to match
+ * @param string $name to match
* @return Bool
*/
public static function isIP( $name ) {
- return preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/',$name) || IP::isIPv6($name);
+ return preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/', $name ) || IP::isIPv6( $name );
}
/**
* Is the input a valid username?
*
* Checks if the input is a valid username, we don't want an empty string,
- * an IP address, anything that containins slashes (would mess up subpages),
+ * an IP address, anything that contains slashes (would mess up subpages),
* is longer than the maximum allowed username size or doesn't begin with
* a capital letter.
*
- * @param $name String to match
+ * @param string $name to match
* @return Bool
*/
public static function isValidUserName( $name ) {
@@ -566,7 +573,6 @@ class User {
return false;
}
-
// Ensure that the name can't be misresolved as a different title,
// such as with extra namespace keys at the start.
$parsed = Title::newFromText( $name );
@@ -605,7 +611,7 @@ class User {
* If an account already exists in this form, login will be blocked
* by a failure to pass this function.
*
- * @param $name String to match
+ * @param string $name to match
* @return Bool
*/
public static function isUsableName( $name ) {
@@ -642,7 +648,7 @@ class User {
* Additional blacklisting may be added here rather than in
* isValidUserName() to avoid disrupting existing accounts.
*
- * @param $name String to match
+ * @param string $name to match
* @return Bool
*/
public static function isCreatableName( $name ) {
@@ -672,7 +678,7 @@ class User {
/**
* Is the input a valid password for this user?
*
- * @param $password String Desired password
+ * @param string $password Desired password
* @return Bool
*/
public function isValidPassword( $password ) {
@@ -683,7 +689,7 @@ class User {
/**
* Given unvalidated password input, return error message on failure.
*
- * @param $password String Desired password
+ * @param string $password Desired password
* @return mixed: true on success, string or array of error message on failure
*/
public function getPasswordValidity( $password ) {
@@ -743,7 +749,7 @@ class User {
* to be liberal enough for wide use. Some invalid addresses will still
* pass validation here.
*
- * @param $addr String E-mail address
+ * @param string $addr E-mail address
* @return Bool
* @deprecated since 1.18 call Sanitizer::isValidEmail() directly
*/
@@ -755,13 +761,14 @@ class User {
/**
* Given unvalidated user input, return a canonical username, or false if
* the username is invalid.
- * @param $name String User input
- * @param $validate String|Bool type of validation to use:
+ * @param string $name User input
+ * @param string|Bool $validate type of validation to use:
* - false No validation
* - 'valid' Valid for batch processes
* - 'usable' Valid for batch processes and login
* - 'creatable' Valid for batch processes, login and account creation
*
+ * @throws MWException
* @return bool|string
*/
public static function getCanonicalName( $name, $validate = 'valid' ) {
@@ -813,39 +820,16 @@ class User {
/**
* Count the number of edits of a user
- * @todo It should not be static and some day should be merged as proper member function / deprecated -- domas
*
- * @param $uid Int User ID to check
+ * @param int $uid User ID to check
* @return Int the user's edit count
+ *
+ * @deprecated since 1.21 in favour of User::getEditCount
*/
public static function edits( $uid ) {
- wfProfileIn( __METHOD__ );
- $dbr = wfGetDB( DB_SLAVE );
- // check if the user_editcount field has been initialized
- $field = $dbr->selectField(
- 'user', 'user_editcount',
- array( 'user_id' => $uid ),
- __METHOD__
- );
-
- if( $field === null ) { // it has not been initialized. do so.
- $dbw = wfGetDB( DB_MASTER );
- $count = $dbr->selectField(
- 'revision', 'count(*)',
- array( 'rev_user' => $uid ),
- __METHOD__
- );
- $dbw->update(
- 'user',
- array( 'user_editcount' => $count ),
- array( 'user_id' => $uid ),
- __METHOD__
- );
- } else {
- $count = $field;
- }
- wfProfileOut( __METHOD__ );
- return $count;
+ wfDeprecated( __METHOD__, '1.21' );
+ $user = self::newFromId( $uid );
+ return $user->getEditCount();
}
/**
@@ -871,7 +855,7 @@ class User {
* @note This no longer clears uncached lazy-initialised properties;
* the constructor does that instead.
*
- * @param $name string
+ * @param $name string|bool
*/
public function loadDefaults( $name = false ) {
wfProfileIn( __METHOD__ );
@@ -889,7 +873,7 @@ class User {
if( $loggedOut !== null ) {
$this->mTouched = wfTimestamp( TS_MW, $loggedOut );
} else {
- $this->mTouched = '0'; # Allow any pages to be cached
+ $this->mTouched = '1'; # Allow any pages to be cached
}
$this->mToken = null; // Don't run cryptographic functions till we need a token
@@ -907,11 +891,11 @@ class User {
/**
* Return whether an item has been loaded.
*
- * @param $item String: item to check. Current possibilities:
+ * @param string $item item to check. Current possibilities:
* - id
* - name
* - realname
- * @param $all String: 'all' to check if the whole object has been loaded
+ * @param string $all 'all' to check if the whole object has been loaded
* or any other string to check if only the item is available (e.g.
* for optimisation)
* @return Boolean
@@ -933,8 +917,7 @@ class User {
}
/**
- * Load user data from the session or login cookie. If there are no valid
- * credentials, initialises the user as an anonymous user.
+ * Load user data from the session or login cookie.
* @return Bool True if the user is logged in, false otherwise.
*/
private function loadFromSession() {
@@ -962,7 +945,6 @@ class User {
if ( $cookieId !== null ) {
$sId = intval( $cookieId );
if( $sessId !== null && $cookieId != $sessId ) {
- $this->loadDefaults(); // Possible collision!
wfDebugLog( 'loginSessions', "Session user ID ($sessId) and
cookie user ID ($sId) don't match!" );
return false;
@@ -971,7 +953,6 @@ class User {
} elseif ( $sessId !== null && $sessId != 0 ) {
$sId = $sessId;
} else {
- $this->loadDefaults();
return false;
}
@@ -981,33 +962,32 @@ class User {
$sName = $request->getCookie( 'UserName' );
$request->setSessionData( 'wsUserName', $sName );
} else {
- $this->loadDefaults();
return false;
}
$proposedUser = User::newFromId( $sId );
if ( !$proposedUser->isLoggedIn() ) {
# Not a valid ID
- $this->loadDefaults();
return false;
}
global $wgBlockDisablesLogin;
if( $wgBlockDisablesLogin && $proposedUser->isBlocked() ) {
# User blocked and we've disabled blocked user logins
- $this->loadDefaults();
return false;
}
if ( $request->getSessionData( 'wsToken' ) ) {
- $passwordCorrect = $proposedUser->getToken( false ) === $request->getSessionData( 'wsToken' );
+ $passwordCorrect = ( $proposedUser->getToken( false ) === $request->getSessionData( 'wsToken' ) );
$from = 'session';
} elseif ( $request->getCookie( 'Token' ) ) {
- $passwordCorrect = $proposedUser->getToken( false ) === $request->getCookie( 'Token' );
+ # Get the token from DB/cache and clean it up to remove garbage padding.
+ # This deals with historical problems with bugs and the default column value.
+ $token = rtrim( $proposedUser->getToken( false ) ); // correct token
+ $passwordCorrect = ( strlen( $token ) && $token === $request->getCookie( 'Token' ) );
$from = 'cookie';
} else {
# No session or persistent login cookie
- $this->loadDefaults();
return false;
}
@@ -1019,7 +999,6 @@ class User {
} else {
# Invalid credentials
wfDebug( "User: can't log in from $from, invalid credentials\n" );
- $this->loadDefaults();
return false;
}
}
@@ -1062,9 +1041,13 @@ class User {
/**
* Initialize this object from a row from the user table.
*
- * @param $row Array Row from the user table to load.
+ * @param array $row Row from the user table to load.
+ * @param array $data Further user data to load into the object
+ *
+ * user_groups Array with groups out of the user_groups table
+ * user_properties Array with properties out of the user_properties table
*/
- public function loadFromRow( $row ) {
+ public function loadFromRow( $row, $data = null ) {
$all = true;
$this->mGroups = null; // deferred
@@ -1122,6 +1105,15 @@ class User {
if ( $all ) {
$this->mLoadedItems = true;
}
+
+ if ( is_array( $data ) ) {
+ if ( isset( $data['user_groups'] ) && is_array( $data['user_groups'] ) ) {
+ $this->mGroups = $data['user_groups'];
+ }
+ if ( isset( $data['user_properties'] ) && is_array( $data['user_properties'] ) ) {
+ $this->loadOptions( $data['user_properties'] );
+ }
+ }
}
/**
@@ -1163,7 +1155,7 @@ class User {
* will not be re-added automatically. The user will also not lose the
* group if they no longer meet the criteria.
*
- * @param $event String key in $wgAutopromoteOnce (each one has groups/criteria)
+ * @param string $event key in $wgAutopromoteOnce (each one has groups/criteria)
*
* @return array Array of groups the user has been promoted to.
*
@@ -1182,21 +1174,27 @@ class User {
}
$newGroups = array_merge( $oldGroups, $toPromote ); // all groups
- $log = new LogPage( 'rights', $wgAutopromoteOnceLogInRC /* in RC? */ );
- $log->addEntry( 'autopromote',
- $this->getUserPage(),
- '', // no comment
- // These group names are "list to texted"-ed in class LogPage.
- array( implode( ', ', $oldGroups ), implode( ', ', $newGroups ) )
- );
+ $logEntry = new ManualLogEntry( 'rights', 'autopromote' );
+ $logEntry->setPerformer( $this );
+ $logEntry->setTarget( $this->getUserPage() );
+ $logEntry->setParameters( array(
+ '4::oldgroups' => $oldGroups,
+ '5::newgroups' => $newGroups,
+ ) );
+ $logid = $logEntry->insert();
+ if ( $wgAutopromoteOnceLogInRC ) {
+ $logEntry->publish( $logid );
+ }
}
}
return $toPromote;
}
/**
- * Clear various cached data stored in this object.
- * @param $reloadFrom bool|String Reload user and user_groups table data from a
+ * Clear various cached data stored in this object. The cache of the user table
+ * data (i.e. self::$mCacheVars) is not cleared unless $reloadFrom is given.
+ *
+ * @param bool|String $reloadFrom Reload user and user_groups table data from a
* given source. May be "name", "id", "defaults", "session", or false for
* no reload.
*/
@@ -1208,7 +1206,10 @@ class User {
$this->mRights = null;
$this->mEffectiveGroups = null;
$this->mImplicitGroups = null;
+ $this->mGroups = null;
$this->mOptions = null;
+ $this->mOptionsLoaded = false;
+ $this->mEditCount = null;
if ( $reloadFrom ) {
$this->mLoadedItems = array();
@@ -1225,22 +1226,23 @@ class User {
public static function getDefaultOptions() {
global $wgNamespacesToBeSearchedDefault, $wgDefaultUserOptions, $wgContLang, $wgDefaultSkin;
+ static $defOpt = null;
+ if ( !defined( 'MW_PHPUNIT_TEST' ) && $defOpt !== null ) {
+ // Disabling this for the unit tests, as they rely on being able to change $wgContLang
+ // mid-request and see that change reflected in the return value of this function.
+ // Which is insane and would never happen during normal MW operation
+ return $defOpt;
+ }
+
$defOpt = $wgDefaultUserOptions;
# default language setting
- $variant = $wgContLang->getDefaultVariant();
- $defOpt['variant'] = $variant;
- $defOpt['language'] = $variant;
+ $defOpt['variant'] = $wgContLang->getCode();
+ $defOpt['language'] = $wgContLang->getCode();
foreach( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
$defOpt['searchNs'.$nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] );
}
$defOpt['skin'] = $wgDefaultSkin;
- // FIXME: Ideally we'd cache the results of this function so the hook is only run once,
- // but that breaks the parser tests because they rely on being able to change $wgContLang
- // mid-request and see that change reflected in the return value of this function.
- // Which is insane and would never happen during normal MW operation, but is also not
- // likely to get fixed unless and until we context-ify everything.
- // See also https://www.mediawiki.org/wiki/Special:Code/MediaWiki/101488#c25275
wfRunHooks( 'UserGetDefaultOptions', array( &$defOpt ) );
return $defOpt;
@@ -1249,7 +1251,7 @@ class User {
/**
* Get a given default option value.
*
- * @param $opt String Name of option to retrieve
+ * @param string $opt Name of option to retrieve
* @return String Default option value
*/
public static function getDefaultOption( $opt ) {
@@ -1261,10 +1263,9 @@ class User {
}
}
-
/**
* Get blocking information
- * @param $bFromSlave Bool Whether to check the slave database first. To
+ * @param bool $bFromSlave Whether to check the slave database first. To
* improve performance, non-critical checks are done
* against slaves. Check when actually saving should be
* done against master.
@@ -1338,8 +1339,8 @@ class User {
/**
* Whether the given IP is in a DNS blacklist.
*
- * @param $ip String IP to check
- * @param $checkWhitelist Bool: whether to check the whitelist first
+ * @param string $ip IP to check
+ * @param bool $checkWhitelist whether to check the whitelist first
* @return Bool True if blacklisted.
*/
public function isDnsBlacklisted( $ip, $checkWhitelist = false ) {
@@ -1359,8 +1360,8 @@ class User {
/**
* Whether the given IP is in a given DNS blacklist.
*
- * @param $ip String IP to check
- * @param $bases String|Array of Strings: URL of the DNS blacklist
+ * @param string $ip IP to check
+ * @param string|array $bases of Strings: URL of the DNS blacklist
* @return Bool True if blacklisted.
*/
public function inDnsBlacklist( $ip, $bases ) {
@@ -1450,7 +1451,7 @@ class User {
// But this is a crappy hack and should die.
return false;
}
- return !$this->isAllowed('noratelimit');
+ return !$this->isAllowed( 'noratelimit' );
}
/**
@@ -1460,13 +1461,13 @@ class User {
* @note When using a shared cache like memcached, IP-address
* last-hit counters will be shared across wikis.
*
- * @param $action String Action to enforce; 'edit' if unspecified
+ * @param string $action Action to enforce; 'edit' if unspecified
* @return Bool True if a rate limiter was tripped
*/
public function pingLimiter( $action = 'edit' ) {
# Call the 'PingLimiter' hook
$result = false;
- if( !wfRunHooks( 'PingLimiter', array( &$this, $action, $result ) ) ) {
+ if( !wfRunHooks( 'PingLimiter', array( &$this, $action, &$result ) ) ) {
return $result;
}
@@ -1555,7 +1556,7 @@ class User {
/**
* Check if user is blocked
*
- * @param $bFromSlave Bool Whether to check the slave database instead of the master
+ * @param bool $bFromSlave Whether to check the slave database instead of the master
* @return Bool True if blocked, false otherwise
*/
public function isBlocked( $bFromSlave = true ) { // hacked from false due to horrible probs on site
@@ -1565,10 +1566,10 @@ class User {
/**
* Get the block affecting the user, or null if the user is not blocked
*
- * @param $bFromSlave Bool Whether to check the slave database instead of the master
+ * @param bool $bFromSlave Whether to check the slave database instead of the master
* @return Block|null
*/
- public function getBlock( $bFromSlave = true ){
+ public function getBlock( $bFromSlave = true ) {
$this->getBlockedStatus( $bFromSlave );
return $this->mBlock instanceof Block ? $this->mBlock : null;
}
@@ -1577,7 +1578,7 @@ class User {
* Check if user is blocked from editing a particular article
*
* @param $title Title to check
- * @param $bFromSlave Bool whether to check the slave database instead of the master
+ * @param bool $bFromSlave whether to check the slave database instead of the master
* @return Bool
*/
function isBlockedFrom( $title, $bFromSlave = false ) {
@@ -1629,9 +1630,9 @@ class User {
/**
* Check if user is blocked on all wikis.
* Do not use for actual edit permission checks!
- * This is intented for quick UI checks.
+ * This is intended for quick UI checks.
*
- * @param $ip String IP address, uses current client if none given
+ * @param string $ip IP address, uses current client if none given
* @return Bool True if blocked, false otherwise
*/
public function isBlockedGlobally( $ip = '' ) {
@@ -1701,7 +1702,7 @@ class User {
/**
* Set the user and reload all fields according to a given ID
- * @param $v Int User ID to reload
+ * @param int $v User ID to reload
*/
public function setId( $v ) {
$this->mId = $v;
@@ -1735,9 +1736,9 @@ class User {
* address for an anonymous user to something other than the current
* remote IP.
*
- * @note User::newFromName() has rougly the same function, when the named user
+ * @note User::newFromName() has roughly the same function, when the named user
* does not exist.
- * @param $str String New user name to set
+ * @param string $str New user name to set
*/
public function setName( $str ) {
$this->load();
@@ -1817,9 +1818,9 @@ class User {
* Internal uncached check for new messages
*
* @see getNewtalk()
- * @param $field String 'user_ip' for anonymous users, 'user_id' otherwise
- * @param $id String|Int User's IP address for anonymous users, User ID otherwise
- * @param $fromMaster Bool true to fetch from the master, false for a slave
+ * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
+ * @param string|Int $id User's IP address for anonymous users, User ID otherwise
+ * @param bool $fromMaster true to fetch from the master, false for a slave
* @return Bool True if the user has new messages
*/
protected function checkNewtalk( $field, $id, $fromMaster = false ) {
@@ -1835,8 +1836,8 @@ class User {
/**
* Add or update the new messages flag
- * @param $field String 'user_ip' for anonymous users, 'user_id' otherwise
- * @param $id String|Int User's IP address for anonymous users, User ID otherwise
+ * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
+ * @param string|Int $id User's IP address for anonymous users, User ID otherwise
* @param $curRev Revision new, as yet unseen revision of the user talk page. Ignored if null.
* @return Bool True if successful, false otherwise
*/
@@ -1861,8 +1862,8 @@ class User {
/**
* Clear the new messages flag for the given user
- * @param $field String 'user_ip' for anonymous users, 'user_id' otherwise
- * @param $id String|Int User's IP address for anonymous users, User ID otherwise
+ * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
+ * @param string|Int $id User's IP address for anonymous users, User ID otherwise
* @return Bool True if successful, false otherwise
*/
protected function deleteNewtalk( $field, $id ) {
@@ -1881,7 +1882,7 @@ class User {
/**
* Update the 'You have new messages!' status.
- * @param $val Bool Whether the user has new messages
+ * @param bool $val Whether the user has new messages
* @param $curRev Revision new, as yet unseen revision of the user talk page. Ignored if null or !$val.
*/
public function setNewtalk( $val, $curRev = null ) {
@@ -1977,7 +1978,7 @@ class User {
/**
* Validate the cache for this account.
- * @param $timestamp String A timestamp in TS_MW format
+ * @param string $timestamp A timestamp in TS_MW format
*
* @return bool
*/
@@ -2006,7 +2007,7 @@ class User {
* wipes it, so the account cannot be logged in until
* a new password is set, for instance via e-mail.
*
- * @param $str String New password to set
+ * @param string $str New password to set
* @throws PasswordError on failure
*
* @return bool
@@ -2045,7 +2046,9 @@ class User {
/**
* Set the password and reset the random token unconditionally.
*
- * @param $str String New password to set
+ * @param string|null $str New password to set or null to set an invalid
+ * password hash meaning that the user will not be able to log in
+ * through the web interface.
*/
public function setInternalPassword( $str ) {
$this->load();
@@ -2063,7 +2066,7 @@ class User {
/**
* Get the user's current token.
- * @param $forceCreation Force the generation of a new token if the user doesn't have one (default=true for backwards compatibility)
+ * @param bool $forceCreation Force the generation of a new token if the user doesn't have one (default=true for backwards compatibility)
* @return String Token
*/
public function getToken( $forceCreation = true ) {
@@ -2078,7 +2081,7 @@ class User {
* Set the random token (used for persistent authentication)
* Called from loadDefaults() among other places.
*
- * @param $token String|bool If specified, set the token to this value
+ * @param string|bool $token If specified, set the token to this value
*/
public function setToken( $token = false ) {
$this->load();
@@ -2092,8 +2095,8 @@ class User {
/**
* Set the password for a password reminder or new account email
*
- * @param $str String New password to set
- * @param $throttle Bool If true, reset the throttle timestamp to the present
+ * @param string $str New password to set
+ * @param bool $throttle If true, reset the throttle timestamp to the present
*/
public function setNewpassword( $str, $throttle = true ) {
$this->load();
@@ -2140,7 +2143,7 @@ class User {
/**
* Set the user's e-mail address
- * @param $str String New e-mail address
+ * @param string $str New e-mail address
*/
public function setEmail( $str ) {
$this->load();
@@ -2156,7 +2159,7 @@ class User {
* Set the user's e-mail address and a confirmation mail if needed.
*
* @since 1.20
- * @param $str String New e-mail address
+ * @param string $str New e-mail address
* @return Status
*/
public function setEmailWithConfirmation( $str ) {
@@ -2202,7 +2205,7 @@ class User {
/**
* Set the user's real name
- * @param $str String New real name
+ * @param string $str New real name
*/
public function setRealName( $str ) {
$this->load();
@@ -2212,9 +2215,9 @@ class User {
/**
* Get the user's current setting for a given option.
*
- * @param $oname String The option to check
- * @param $defaultOverride String A default value returned if the option does not exist
- * @param $ignoreHidden Bool = whether to ignore the effects of $wgHiddenPrefs
+ * @param string $oname The option to check
+ * @param string $defaultOverride A default value returned if the option does not exist
+ * @param bool $ignoreHidden = whether to ignore the effects of $wgHiddenPrefs
* @return String User's current value for the option
* @see getBoolOption()
* @see getIntOption()
@@ -2223,19 +2226,12 @@ class User {
global $wgHiddenPrefs;
$this->loadOptions();
- if ( is_null( $this->mOptions ) ) {
- if($defaultOverride != '') {
- return $defaultOverride;
- }
- $this->mOptions = User::getDefaultOptions();
- }
-
# We want 'disabled' preferences to always behave as the default value for
# users, even if they have set the option explicitly in their settings (ie they
# set it, and then it was disabled removing their ability to change it). But
# we don't want to erase the preferences in the database in case the preference
# is re-enabled again. So don't touch $mOptions, just override the returned value
- if( in_array( $oname, $wgHiddenPrefs ) && !$ignoreHidden ){
+ if( in_array( $oname, $wgHiddenPrefs ) && !$ignoreHidden ) {
return self::getDefaultOption( $oname );
}
@@ -2261,9 +2257,9 @@ class User {
# set it, and then it was disabled removing their ability to change it). But
# we don't want to erase the preferences in the database in case the preference
# is re-enabled again. So don't touch $mOptions, just override the returned value
- foreach( $wgHiddenPrefs as $pref ){
+ foreach( $wgHiddenPrefs as $pref ) {
$default = self::getDefaultOption( $pref );
- if( $default !== null ){
+ if( $default !== null ) {
$options[$pref] = $default;
}
}
@@ -2274,7 +2270,7 @@ class User {
/**
* Get the user's current setting for a given option, as a boolean value.
*
- * @param $oname String The option to check
+ * @param string $oname The option to check
* @return Bool User's current value for the option
* @see getOption()
*/
@@ -2285,12 +2281,12 @@ class User {
/**
* Get the user's current setting for a given option, as a boolean value.
*
- * @param $oname String The option to check
- * @param $defaultOverride Int A default value returned if the option does not exist
+ * @param string $oname The option to check
+ * @param int $defaultOverride A default value returned if the option does not exist
* @return Int User's current value for the option
* @see getOption()
*/
- public function getIntOption( $oname, $defaultOverride=0 ) {
+ public function getIntOption( $oname, $defaultOverride = 0 ) {
$val = $this->getOption( $oname );
if( $val == '' ) {
$val = $defaultOverride;
@@ -2301,31 +2297,173 @@ class User {
/**
* Set the given option for a user.
*
- * @param $oname String The option to set
+ * @param string $oname The option to set
* @param $val mixed New value to set
*/
public function setOption( $oname, $val ) {
- $this->load();
$this->loadOptions();
// Explicitly NULL values should refer to defaults
if( is_null( $val ) ) {
- $defaultOption = self::getDefaultOption( $oname );
- if( !is_null( $defaultOption ) ) {
- $val = $defaultOption;
- }
+ $val = self::getDefaultOption( $oname );
}
$this->mOptions[$oname] = $val;
}
/**
- * Reset all options to the site defaults
+ * Return a list of the types of user options currently returned by
+ * User::getOptionKinds().
+ *
+ * Currently, the option kinds are:
+ * - 'registered' - preferences which are registered in core MediaWiki or
+ * by extensions using the UserGetDefaultOptions hook.
+ * - 'registered-multiselect' - as above, using the 'multiselect' type.
+ * - 'registered-checkmatrix' - as above, using the 'checkmatrix' type.
+ * - 'userjs' - preferences with names starting with 'userjs-', intended to
+ * be used by user scripts.
+ * - 'unused' - preferences about which MediaWiki doesn't know anything.
+ * These are usually legacy options, removed in newer versions.
+ *
+ * The API (and possibly others) use this function to determine the possible
+ * option types for validation purposes, so make sure to update this when a
+ * new option kind is added.
+ *
+ * @see User::getOptionKinds
+ * @return array Option kinds
+ */
+ public static function listOptionKinds() {
+ return array(
+ 'registered',
+ 'registered-multiselect',
+ 'registered-checkmatrix',
+ 'userjs',
+ 'unused'
+ );
+ }
+
+ /**
+ * Return an associative array mapping preferences keys to the kind of a preference they're
+ * used for. Different kinds are handled differently when setting or reading preferences.
+ *
+ * See User::listOptionKinds for the list of valid option types that can be provided.
+ *
+ * @see User::listOptionKinds
+ * @param $context IContextSource
+ * @param array $options assoc. array with options keys to check as keys. Defaults to $this->mOptions.
+ * @return array the key => kind mapping data
*/
- public function resetOptions() {
+ public function getOptionKinds( IContextSource $context, $options = null ) {
+ $this->loadOptions();
+ if ( $options === null ) {
+ $options = $this->mOptions;
+ }
+
+ $prefs = Preferences::getPreferences( $this, $context );
+ $mapping = array();
+
+ // Multiselect and checkmatrix options are stored in the database with
+ // one key per option, each having a boolean value. Extract those keys.
+ $multiselectOptions = array();
+ foreach ( $prefs as $name => $info ) {
+ if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
+ ( isset( $info['class'] ) && $info['class'] == 'HTMLMultiSelectField' ) ) {
+ $opts = HTMLFormField::flattenOptions( $info['options'] );
+ $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+
+ foreach ( $opts as $value ) {
+ $multiselectOptions["$prefix$value"] = true;
+ }
+
+ unset( $prefs[$name] );
+ }
+ }
+ $checkmatrixOptions = array();
+ foreach ( $prefs as $name => $info ) {
+ if ( ( isset( $info['type'] ) && $info['type'] == 'checkmatrix' ) ||
+ ( isset( $info['class'] ) && $info['class'] == 'HTMLCheckMatrix' ) ) {
+ $columns = HTMLFormField::flattenOptions( $info['columns'] );
+ $rows = HTMLFormField::flattenOptions( $info['rows'] );
+ $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+
+ foreach ( $columns as $column ) {
+ foreach ( $rows as $row ) {
+ $checkmatrixOptions["$prefix-$column-$row"] = true;
+ }
+ }
+
+ unset( $prefs[$name] );
+ }
+ }
+
+ // $value is ignored
+ foreach ( $options as $key => $value ) {
+ if ( isset( $prefs[$key] ) ) {
+ $mapping[$key] = 'registered';
+ } elseif( isset( $multiselectOptions[$key] ) ) {
+ $mapping[$key] = 'registered-multiselect';
+ } elseif( isset( $checkmatrixOptions[$key] ) ) {
+ $mapping[$key] = 'registered-checkmatrix';
+ } elseif ( substr( $key, 0, 7 ) === 'userjs-' ) {
+ $mapping[$key] = 'userjs';
+ } else {
+ $mapping[$key] = 'unused';
+ }
+ }
+
+ return $mapping;
+ }
+
+ /**
+ * Reset certain (or all) options to the site defaults
+ *
+ * The optional parameter determines which kinds of preferences will be reset.
+ * Supported values are everything that can be reported by getOptionKinds()
+ * and 'all', which forces a reset of *all* preferences and overrides everything else.
+ *
+ * @param array|string $resetKinds which kinds of preferences to reset. Defaults to
+ * array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' )
+ * for backwards-compatibility.
+ * @param $context IContextSource|null context source used when $resetKinds
+ * does not contain 'all', passed to getOptionKinds().
+ * Defaults to RequestContext::getMain() when null.
+ */
+ public function resetOptions(
+ $resetKinds = array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' ),
+ IContextSource $context = null
+ ) {
$this->load();
+ $defaultOptions = self::getDefaultOptions();
- $this->mOptions = self::getDefaultOptions();
+ if ( !is_array( $resetKinds ) ) {
+ $resetKinds = array( $resetKinds );
+ }
+
+ if ( in_array( 'all', $resetKinds ) ) {
+ $newOptions = $defaultOptions;
+ } else {
+ if ( $context === null ) {
+ $context = RequestContext::getMain();
+ }
+
+ $optionKinds = $this->getOptionKinds( $context );
+ $resetKinds = array_intersect( $resetKinds, self::listOptionKinds() );
+ $newOptions = array();
+
+ // Use default values for the options that should be deleted, and
+ // copy old values for the ones that shouldn't.
+ foreach ( $this->mOptions as $key => $value ) {
+ if ( in_array( $optionKinds[$key], $resetKinds ) ) {
+ if ( array_key_exists( $key, $defaultOptions ) ) {
+ $newOptions[$key] = $defaultOptions[$key];
+ }
+ } else {
+ $newOptions[$key] = $value;
+ }
+ }
+ }
+
+ $this->mOptions = $newOptions;
$this->mOptionsLoaded = true;
}
@@ -2354,7 +2492,7 @@ class User {
*/
public function getStubThreshold() {
global $wgMaxArticleSize; # Maximum article size, in Kb
- $threshold = intval( $this->getOption( 'stubthreshold' ) );
+ $threshold = $this->getIntOption( 'stubthreshold' );
if ( $threshold > $wgMaxArticleSize * 1024 ) {
# If they have set an impossible value, disable the preference
# so we can use the parser cache again.
@@ -2372,7 +2510,7 @@ class User {
$this->mRights = self::getGroupPermissions( $this->getEffectiveGroups() );
wfRunHooks( 'UserGetRights', array( $this, &$this->mRights ) );
// Force reindexation of rights when a hook has unset one of them
- $this->mRights = array_values( $this->mRights );
+ $this->mRights = array_values( array_unique( $this->mRights ) );
}
return $this->mRights;
}
@@ -2392,7 +2530,7 @@ class User {
* Get the list of implicit group memberships this user has.
* This includes all explicit groups, plus 'user' if logged in,
* '*' for all accounts, and autopromoted groups
- * @param $recache Bool Whether to avoid the cache
+ * @param bool $recache Whether to avoid the cache
* @return Array of String internal group names
*/
public function getEffectiveGroups( $recache = false ) {
@@ -2404,6 +2542,8 @@ class User {
) );
# Hook for additional groups
wfRunHooks( 'UserEffectiveGroups', array( &$this, &$this->mEffectiveGroups ) );
+ // Force reindexation of groups when a hook has unset one of them
+ $this->mEffectiveGroups = array_values( array_unique( $this->mEffectiveGroups ) );
wfProfileOut( __METHOD__ );
}
return $this->mEffectiveGroups;
@@ -2413,7 +2553,7 @@ class User {
* Get the list of implicit group memberships this user has.
* This includes 'user' if logged in, '*' for all accounts,
* and autopromoted groups
- * @param $recache Bool Whether to avoid the cache
+ * @param bool $recache Whether to avoid the cache
* @return Array of String internal group names
*/
public function getAutomaticGroups( $recache = false ) {
@@ -2467,22 +2607,35 @@ class User {
* @return Int
*/
public function getEditCount() {
- if( $this->getId() ) {
- if ( !isset( $this->mEditCount ) ) {
- /* Populate the count, if it has not been populated yet */
- $this->mEditCount = User::edits( $this->mId );
- }
- return $this->mEditCount;
- } else {
- /* nil */
+ if ( !$this->getId() ) {
return null;
}
+
+ if ( !isset( $this->mEditCount ) ) {
+ /* Populate the count, if it has not been populated yet */
+ wfProfileIn( __METHOD__ );
+ $dbr = wfGetDB( DB_SLAVE );
+ // check if the user_editcount field has been initialized
+ $count = $dbr->selectField(
+ 'user', 'user_editcount',
+ array( 'user_id' => $this->mId ),
+ __METHOD__
+ );
+
+ if( $count === null ) {
+ // it has not been initialized. do so.
+ $count = $this->initEditCount();
+ }
+ $this->mEditCount = intval( $count );
+ wfProfileOut( __METHOD__ );
+ }
+ return $this->mEditCount;
}
/**
* Add the user to the given group.
* This takes immediate effect.
- * @param $group String Name of the group to add
+ * @param string $group Name of the group to add
*/
public function addGroup( $group ) {
if( wfRunHooks( 'UserAddGroup', array( $this, &$group ) ) ) {
@@ -2490,7 +2643,7 @@ class User {
if( $this->getId() ) {
$dbw->insert( 'user_groups',
array(
- 'ug_user' => $this->getID(),
+ 'ug_user' => $this->getID(),
'ug_group' => $group,
),
__METHOD__,
@@ -2507,7 +2660,7 @@ class User {
/**
* Remove the user from the given group.
* This takes immediate effect.
- * @param $group String Name of the group to remove
+ * @param string $group Name of the group to remove
*/
public function removeGroup( $group ) {
$this->load();
@@ -2515,13 +2668,13 @@ class User {
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'user_groups',
array(
- 'ug_user' => $this->getID(),
+ 'ug_user' => $this->getID(),
'ug_group' => $group,
), __METHOD__ );
// Remember that the user was in this group
$dbw->insert( 'user_former_groups',
array(
- 'ufg_user' => $this->getID(),
+ 'ufg_user' => $this->getID(),
'ufg_group' => $group,
),
__METHOD__,
@@ -2558,10 +2711,10 @@ class User {
*
* @return bool
*/
- public function isAllowedAny( /*...*/ ){
+ public function isAllowedAny( /*...*/ ) {
$permissions = func_get_args();
- foreach( $permissions as $permission ){
- if( $this->isAllowed( $permission ) ){
+ foreach( $permissions as $permission ) {
+ if( $this->isAllowed( $permission ) ) {
return true;
}
}
@@ -2573,10 +2726,10 @@ class User {
* @internal param $varargs string
* @return bool True if the user is allowed to perform *all* of the given actions
*/
- public function isAllowedAll( /*...*/ ){
+ public function isAllowedAll( /*...*/ ) {
$permissions = func_get_args();
- foreach( $permissions as $permission ){
- if( !$this->isAllowed( $permission ) ){
+ foreach( $permissions as $permission ) {
+ if( !$this->isAllowed( $permission ) ) {
return false;
}
}
@@ -2744,13 +2897,17 @@ class User {
* the next change of any watched page.
*/
public function clearAllNotifications() {
+ if ( wfReadOnly() ) {
+ return;
+ }
+
global $wgUseEnotif, $wgShowUpdatedMarker;
if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
$this->setNewtalk( false );
return;
}
$id = $this->getId();
- if( $id != 0 ) {
+ if( $id != 0 ) {
$dbw = wfGetDB( DB_MASTER );
$dbw->update( 'watchlist',
array( /* SET */
@@ -2766,7 +2923,7 @@ class User {
/**
* Set this user's options from an encoded string
- * @param $str String Encoded options to import
+ * @param string $str Encoded options to import
*
* @deprecated in 1.19 due to removal of user_options from the user table
*/
@@ -2794,18 +2951,22 @@ class User {
/**
* Set a cookie on the user's client. Wrapper for
* WebResponse::setCookie
- * @param $name String Name of the cookie to set
- * @param $value String Value to set
- * @param $exp Int Expiration time, as a UNIX time value;
+ * @param string $name Name of the cookie to set
+ * @param string $value Value to set
+ * @param int $exp Expiration time, as a UNIX time value;
* if 0 or not specified, use the default $wgCookieExpiration
+ * @param $secure Bool
+ * true: Force setting the secure attribute when setting the cookie
+ * false: Force NOT setting the secure attribute when setting the cookie
+ * null (default): Use the default ($wgCookieSecure) to set the secure attribute
*/
- protected function setCookie( $name, $value, $exp = 0 ) {
- $this->getRequest()->response()->setcookie( $name, $value, $exp );
+ protected function setCookie( $name, $value, $exp = 0, $secure = null ) {
+ $this->getRequest()->response()->setcookie( $name, $value, $exp, null, null, $secure );
}
/**
* Clear a cookie on the user's client
- * @param $name String Name of the cookie to clear
+ * @param string $name Name of the cookie to clear
*/
protected function clearCookie( $name ) {
$this->setCookie( $name, '', time() - 86400 );
@@ -2816,14 +2977,17 @@ class User {
*
* @param $request WebRequest object to use; $wgRequest will be used if null
* is passed.
+ * @param bool $secure Whether to force secure/insecure cookies or use default
*/
- public function setCookies( $request = null ) {
+ public function setCookies( $request = null, $secure = null ) {
if ( $request === null ) {
$request = $this->getRequest();
}
$this->load();
- if ( 0 == $this->mId ) return;
+ if ( 0 == $this->mId ) {
+ return;
+ }
if ( !$this->mToken ) {
// When token is empty or NULL generate a new one and then save it to the database
// This allows a wiki to re-secure itself after a leak of it's user table or $wgSecretKey
@@ -2856,9 +3020,18 @@ class User {
if ( $value === false ) {
$this->clearCookie( $name );
} else {
- $this->setCookie( $name, $value );
+ $this->setCookie( $name, $value, 0, $secure );
}
}
+
+ /**
+ * If wpStickHTTPS was selected, also set an insecure cookie that
+ * will cause the site to redirect the user to HTTPS, if they access
+ * it over HTTP. Bug 29898.
+ */
+ if ( $request->getCheck( 'wpStickHTTPS' ) ) {
+ $this->setCookie( 'forceHTTPS', 'true', time() + 2592000, false ); //30 days
+ }
}
/**
@@ -2881,6 +3054,7 @@ class User {
$this->clearCookie( 'UserID' );
$this->clearCookie( 'Token' );
+ $this->clearCookie( 'forceHTTPS' );
# Remember when user logged out, to prevent seeing cached pages
$this->setCookie( 'LoggedOut', wfTimestampNow(), time() + 86400 );
@@ -2947,8 +3121,8 @@ class User {
/**
* Add a user to the database, return the user object
*
- * @param $name String Username to add
- * @param $params Array of Strings Non-default parameters to save to the database as user_* fields:
+ * @param string $name Username to add
+ * @param array $params of Strings Non-default parameters to save to the database as user_* fields:
* - password The user's password hash. Password logins will be disabled if this is omitted.
* - newpassword Hash for a temporary password that has been mailed to the user
* - email The user's email address
@@ -2963,6 +3137,7 @@ class User {
public static function createNew( $name, $params = array() ) {
$user = new User;
$user->load();
+ $user->setToken(); // init token
if ( isset( $params['options'] ) ) {
$user->mOptions = $params['options'] + (array)$user->mOptions;
unset( $params['options'] );
@@ -2997,10 +3172,36 @@ class User {
}
/**
- * Add this existing user object to the database
+ * Add this existing user object to the database. If the user already
+ * exists, a fatal status object is returned, and the user object is
+ * initialised with the data from the database.
+ *
+ * Previously, this function generated a DB error due to a key conflict
+ * if the user already existed. Many extension callers use this function
+ * in code along the lines of:
+ *
+ * $user = User::newFromName( $name );
+ * if ( !$user->isLoggedIn() ) {
+ * $user->addToDatabase();
+ * }
+ * // do something with $user...
+ *
+ * However, this was vulnerable to a race condition (bug 16020). By
+ * initialising the user object if the user exists, we aim to support this
+ * calling sequence as far as possible.
+ *
+ * Note that if the user exists, this function will acquire a write lock,
+ * so it is still advisable to make the call conditional on isLoggedIn(),
+ * and to commit the transaction after calling.
+ *
+ * @throws MWException
+ * @return Status
*/
public function addToDatabase() {
$this->load();
+ if ( !$this->mToken ) {
+ $this->setToken(); // init token
+ }
$this->mTouched = self::newTouchedTimestamp();
@@ -3020,14 +3221,31 @@ class User {
'user_registration' => $dbw->timestamp( $this->mRegistration ),
'user_editcount' => 0,
'user_touched' => $dbw->timestamp( $this->mTouched ),
- ), __METHOD__
+ ), __METHOD__,
+ array( 'IGNORE' )
);
+ if ( !$dbw->affectedRows() ) {
+ $this->mId = $dbw->selectField( 'user', 'user_id',
+ array( 'user_name' => $this->mName ), __METHOD__ );
+ $loaded = false;
+ if ( $this->mId ) {
+ if ( $this->loadFromDatabase() ) {
+ $loaded = true;
+ }
+ }
+ if ( !$loaded ) {
+ throw new MWException( __METHOD__. ": hit a key conflict attempting " .
+ "to insert a user row, but then it doesn't exist when we select it!" );
+ }
+ return Status::newFatal( 'userexists' );
+ }
$this->mId = $dbw->insertId();
// Clear instance cache other than user table data, which is already accurate
$this->clearInstanceCache();
$this->saveOptions();
+ return Status::newGood();
}
/**
@@ -3079,8 +3297,8 @@ class User {
public function getPageRenderingHash() {
wfDeprecated( __METHOD__, '1.17' );
- global $wgUseDynamicDates, $wgRenderHashAppend, $wgLang, $wgContLang;
- if( $this->mHash ){
+ global $wgRenderHashAppend, $wgLang, $wgContLang;
+ if( $this->mHash ) {
return $this->mHash;
}
@@ -3088,11 +3306,8 @@ class User {
// since it disables the parser cache, its value will always
// be 0 when this function is called by parsercache.
- $confstr = $this->getOption( 'math' );
+ $confstr = $this->getOption( 'math' );
$confstr .= '!' . $this->getStubThreshold();
- if ( $wgUseDynamicDates ) { # This is wrong (bug 24714)
- $confstr .= '!' . $this->getDatePreference();
- }
$confstr .= '!' . ( $this->getOption( 'numberheadings' ) ? '1' : '' );
$confstr .= '!' . $wgLang->getCode();
$confstr .= '!' . $this->getOption( 'thumbsize' );
@@ -3121,14 +3336,14 @@ class User {
*/
public function isBlockedFromCreateAccount() {
$this->getBlockedStatus();
- if( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ){
+ if( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ) {
return $this->mBlock;
}
# bug 13611: if the IP address the user is trying to create an account from is
# blocked with createaccount disabled, prevent new account creation there even
# when the user is logged in
- if( $this->mBlockedFromCreateAccount === false ){
+ if ( $this->mBlockedFromCreateAccount === false && !$this->isAllowed( 'ipblock-exempt' ) ) {
$this->mBlockedFromCreateAccount = Block::newFromTarget( null, $this->getRequest()->getIP() );
}
return $this->mBlockedFromCreateAccount instanceof Block && $this->mBlockedFromCreateAccount->prevents( 'createaccount' )
@@ -3183,7 +3398,7 @@ class User {
/**
* Check to see if the given clear-text password is one of the accepted passwords
- * @param $password String: user password.
+ * @param string $password user password.
* @return Boolean: True if the given password is correct, otherwise False.
*/
public function checkPassword( $password ) {
@@ -3250,7 +3465,7 @@ class User {
* Alias for getEditToken.
* @deprecated since 1.19, use getEditToken instead.
*
- * @param $salt String|Array of Strings Optional function-specific data for hashing
+ * @param string|array $salt of Strings Optional function-specific data for hashing
* @param $request WebRequest object to use or null to use $wgRequest
* @return String The new edit token
*/
@@ -3267,7 +3482,7 @@ class User {
*
* @since 1.19
*
- * @param $salt String|Array of Strings Optional function-specific data for hashing
+ * @param string|array $salt of Strings Optional function-specific data for hashing
* @param $request WebRequest object to use or null to use $wgRequest
* @return String The new edit token
*/
@@ -3294,11 +3509,10 @@ class User {
/**
* Generate a looking random token for various uses.
*
- * @param $salt String Optional salt value
* @return String The new random token
- * @deprecated since 1.20; Use MWCryptRand for secure purposes or wfRandomString for pesudo-randomness
+ * @deprecated since 1.20; Use MWCryptRand for secure purposes or wfRandomString for pseudo-randomness
*/
- public static function generateToken( $salt = '' ) {
+ public static function generateToken() {
return MWCryptRand::generateHex( 32 );
}
@@ -3308,8 +3522,8 @@ class User {
* user's own login session, not a form submission from a third-party
* site.
*
- * @param $val String Input value to compare
- * @param $salt String Optional function-specific data for hashing
+ * @param string $val Input value to compare
+ * @param string $salt Optional function-specific data for hashing
* @param $request WebRequest object to use or null to use $wgRequest
* @return Boolean: Whether the token matches
*/
@@ -3325,8 +3539,8 @@ class User {
* Check given value against the token value stored in the session,
* ignoring the suffix.
*
- * @param $val String Input value to compare
- * @param $salt String Optional function-specific data for hashing
+ * @param string $val Input value to compare
+ * @param string $salt Optional function-specific data for hashing
* @param $request WebRequest object to use or null to use $wgRequest
* @return Boolean: Whether the token matches
*/
@@ -3339,7 +3553,7 @@ class User {
* Generate a new e-mail confirmation token and send a confirmation/invalidation
* mail to the user's given address.
*
- * @param $type String: message to send, either "created", "changed" or "set"
+ * @param string $type message to send, either "created", "changed" or "set"
* @return Status object
*/
public function sendConfirmationMail( $type = 'created' ) {
@@ -3373,10 +3587,10 @@ class User {
* Send an e-mail to this user's account. Does not check for
* confirmed status or validity.
*
- * @param $subject String Message subject
- * @param $body String Message body
- * @param $from String Optional From address; if unspecified, default $wgPasswordSender will be used
- * @param $replyto String Reply-To address
+ * @param string $subject Message subject
+ * @param string $body Message body
+ * @param string $from Optional From address; if unspecified, default $wgPasswordSender will be used
+ * @param string $replyto Reply-To address
* @return Status
*/
public function sendMail( $subject, $body, $from = null, $replyto = null ) {
@@ -3415,8 +3629,8 @@ class User {
}
/**
- * Return a URL the user can use to confirm their email address.
- * @param $token String Accepts the email confirmation token
+ * Return a URL the user can use to confirm their email address.
+ * @param string $token Accepts the email confirmation token
* @return String New token URL
*/
private function confirmationTokenUrl( $token ) {
@@ -3425,7 +3639,7 @@ class User {
/**
* Return a URL the user can use to invalidate their email address.
- * @param $token String Accepts the email confirmation token
+ * @param string $token Accepts the email confirmation token
* @return String New token URL
*/
private function invalidationTokenUrl( $token ) {
@@ -3442,8 +3656,8 @@ class User {
* also sometimes can get corrupted in some browsers/mailers
* (bug 6957 with Gmail and Internet Explorer).
*
- * @param $page String Special page
- * @param $token String Token
+ * @param string $page Special page
+ * @param string $token Token
* @return String Formatted URL
*/
protected function getTokenUrl( $page, $token ) {
@@ -3483,7 +3697,7 @@ class User {
/**
* Set the e-mail authentication timestamp.
- * @param $timestamp String TS_MW timestamp
+ * @param string $timestamp TS_MW timestamp
*/
function setEmailAuthenticationTimestamp( $timestamp ) {
$this->load();
@@ -3560,8 +3774,9 @@ class User {
/**
* Get the timestamp of account creation.
*
- * @return String|Bool Timestamp of account creation, or false for
- * non-existent/anonymous user accounts.
+ * @return String|Bool|Null Timestamp of account creation, false for
+ * non-existent/anonymous user accounts, or null if existing account
+ * but information is not in database.
*/
public function getRegistration() {
if ( $this->isAnon() ) {
@@ -3596,7 +3811,7 @@ class User {
/**
* Get the permissions associated with a given list of groups
*
- * @param $groups Array of Strings List of internal group names
+ * @param array $groups of Strings List of internal group names
* @return Array of Strings List of permission key names for given groups combined
*/
public static function getGroupPermissions( $groups ) {
@@ -3623,14 +3838,14 @@ class User {
/**
* Get all the groups who have a given permission
*
- * @param $role String Role to check
+ * @param string $role Role to check
* @return Array of Strings List of internal group names with the given permission
*/
public static function getGroupsWithPermission( $role ) {
global $wgGroupPermissions;
$allowedGroups = array();
- foreach ( $wgGroupPermissions as $group => $rights ) {
- if ( isset( $rights[$role] ) && $rights[$role] ) {
+ foreach ( array_keys( $wgGroupPermissions ) as $group ) {
+ if ( self::groupHasPermission( $group, $role ) ) {
$allowedGroups[] = $group;
}
}
@@ -3638,9 +3853,22 @@ class User {
}
/**
+ * Check, if the given group has the given permission
+ *
+ * @param string $group Group to check
+ * @param string $role Role to check
+ * @return bool
+ */
+ public static function groupHasPermission( $group, $role ) {
+ global $wgGroupPermissions, $wgRevokePermissions;
+ return isset( $wgGroupPermissions[$group][$role] ) && $wgGroupPermissions[$group][$role]
+ && !( isset( $wgRevokePermissions[$group][$role] ) && $wgRevokePermissions[$group][$role] );
+ }
+
+ /**
* Get the localized descriptive name for a group, if it exists
*
- * @param $group String Internal group name
+ * @param string $group Internal group name
* @return String Localized descriptive group name
*/
public static function getGroupName( $group ) {
@@ -3651,8 +3879,8 @@ class User {
/**
* Get the localized descriptive name for a member of a group, if it exists
*
- * @param $group String Internal group name
- * @param $username String Username for gender (since 1.19)
+ * @param string $group Internal group name
+ * @param string $username Username for gender (since 1.19)
* @return String Localized name for group member
*/
public static function getGroupMember( $group, $username = '#' ) {
@@ -3705,7 +3933,7 @@ class User {
/**
* Get the title of a page describing a particular group
*
- * @param $group String Internal group name
+ * @param string $group Internal group name
* @return Title|Bool Title of the page if it exists, false otherwise
*/
public static function getGroupPage( $group ) {
@@ -3722,8 +3950,8 @@ class User {
* Create a link to the group in HTML, if available;
* else return the group name.
*
- * @param $group String Internal name of the group
- * @param $text String The text of the link
+ * @param string $group Internal name of the group
+ * @param string $text The text of the link
* @return String HTML link to the group
*/
public static function makeGroupLinkHTML( $group, $text = '' ) {
@@ -3742,8 +3970,8 @@ class User {
* Create a link to the group in Wikitext, if available;
* else return the group name.
*
- * @param $group String Internal name of the group
- * @param $text String The text of the link
+ * @param string $group Internal name of the group
+ * @param string $text The text of the link
* @return String Wikilink to the group
*/
public static function makeGroupLinkWiki( $group, $text = '' ) {
@@ -3762,7 +3990,7 @@ class User {
/**
* Returns an array of the groups that a particular group can add/remove.
*
- * @param $group String: the group to check for whether it can add/remove
+ * @param string $group the group to check for whether it can add/remove
* @return Array array( 'add' => array( addablegroups ),
* 'remove' => array( removablegroups ),
* 'add-self' => array( addablegroups to self),
@@ -3860,7 +4088,7 @@ class User {
$groups = array_merge_recursive(
$groups, $this->changeableByGroup( $addergroup )
);
- $groups['add'] = array_unique( $groups['add'] );
+ $groups['add'] = array_unique( $groups['add'] );
$groups['remove'] = array_unique( $groups['remove'] );
$groups['add-self'] = array_unique( $groups['add-self'] );
$groups['remove-self'] = array_unique( $groups['remove-self'] );
@@ -3875,37 +4103,28 @@ class User {
public function incEditCount() {
if( !$this->isAnon() ) {
$dbw = wfGetDB( DB_MASTER );
- $dbw->update( 'user',
+ $dbw->update(
+ 'user',
array( 'user_editcount=user_editcount+1' ),
array( 'user_id' => $this->getId() ),
- __METHOD__ );
+ __METHOD__
+ );
// Lazy initialization check...
if( $dbw->affectedRows() == 0 ) {
- // Pull from a slave to be less cruel to servers
- // Accuracy isn't the point anyway here
- $dbr = wfGetDB( DB_SLAVE );
- $count = $dbr->selectField( 'revision',
- 'COUNT(rev_user)',
- array( 'rev_user' => $this->getId() ),
- __METHOD__ );
-
// Now here's a goddamn hack...
+ $dbr = wfGetDB( DB_SLAVE );
if( $dbr !== $dbw ) {
// If we actually have a slave server, the count is
// at least one behind because the current transaction
// has not been committed and replicated.
- $count++;
+ $this->initEditCount( 1 );
} else {
// But if DB_SLAVE is selecting the master, then the
// count we just read includes the revision that was
// just added in the working transaction.
+ $this->initEditCount();
}
-
- $dbw->update( 'user',
- array( 'user_editcount' => $count ),
- array( 'user_id' => $this->getId() ),
- __METHOD__ );
}
}
// edit count in user cache too
@@ -3913,9 +4132,38 @@ class User {
}
/**
+ * Initialize user_editcount from data out of the revision table
+ *
+ * @param $add Integer Edits to add to the count from the revision table
+ * @return Integer Number of edits
+ */
+ protected function initEditCount( $add = 0 ) {
+ // Pull from a slave to be less cruel to servers
+ // Accuracy isn't the point anyway here
+ $dbr = wfGetDB( DB_SLAVE );
+ $count = (int) $dbr->selectField(
+ 'revision',
+ 'COUNT(rev_user)',
+ array( 'rev_user' => $this->getId() ),
+ __METHOD__
+ );
+ $count = $count + $add;
+
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->update(
+ 'user',
+ array( 'user_editcount' => $count ),
+ array( 'user_id' => $this->getId() ),
+ __METHOD__
+ );
+
+ return $count;
+ }
+
+ /**
* Get the description of a given right
*
- * @param $right String Right to query
+ * @param string $right Right to query
* @return String Localized description of the right
*/
public static function getRightDescription( $right ) {
@@ -3927,8 +4175,8 @@ class User {
/**
* Make an old-style password hash
*
- * @param $password String Plain-text password
- * @param $userId String User ID
+ * @param string $password Plain-text password
+ * @param string $userId User ID
* @return String Password hash
*/
public static function oldCrypt( $password, $userId ) {
@@ -3943,7 +4191,7 @@ class User {
/**
* Make a new-style password hash
*
- * @param $password String Plain-text password
+ * @param string $password Plain-text password
* @param bool|string $salt Optional salt, may be random or the user ID.
* If unspecified or false, will generate one automatically
@@ -3971,9 +4219,9 @@ class User {
* Compare a password hash with a plain-text password. Requires the user
* ID if there's a chance that the hash is an old-style hash.
*
- * @param $hash String Password hash
- * @param $password String Plain-text password to compare
- * @param $userId String|bool User ID for old-style password salt
+ * @param string $hash Password hash
+ * @param string $password Plain-text password to compare
+ * @param string|bool $userId User ID for old-style password salt
*
* @return Boolean
*/
@@ -3999,67 +4247,104 @@ class User {
}
/**
- * Add a newuser log entry for this user. Before 1.19 the return value was always true.
+ * Add a newuser log entry for this user.
+ * Before 1.19 the return value was always true.
+ *
+ * @param string|bool $action account creation type.
+ * - String, one of the following values:
+ * - 'create' for an anonymous user creating an account for himself.
+ * This will force the action's performer to be the created user itself,
+ * no matter the value of $wgUser
+ * - 'create2' for a logged in user creating an account for someone else
+ * - 'byemail' when the created user will receive its password by e-mail
+ * - Boolean means whether the account was created by e-mail (deprecated):
+ * - true will be converted to 'byemail'
+ * - false will be converted to 'create' if this object is the same as
+ * $wgUser and to 'create2' otherwise
*
- * @param $byEmail Boolean: account made by email?
- * @param $reason String: user supplied reason
+ * @param string $reason user supplied reason
*
* @return int|bool True if not $wgNewUserLog; otherwise ID of log item or 0 on failure
*/
- public function addNewUserLogEntry( $byEmail = false, $reason = '' ) {
- global $wgUser, $wgContLang, $wgNewUserLog;
+ public function addNewUserLogEntry( $action = false, $reason = '' ) {
+ global $wgUser, $wgNewUserLog;
if( empty( $wgNewUserLog ) ) {
return true; // disabled
}
- if( $this->getName() == $wgUser->getName() ) {
- $action = 'create';
- } else {
- $action = 'create2';
- if ( $byEmail ) {
- if ( $reason === '' ) {
- $reason = wfMessage( 'newuserlog-byemail' )->inContentLanguage()->text();
- } else {
- $reason = $wgContLang->commaList( array(
- $reason, wfMessage( 'newuserlog-byemail' )->inContentLanguage()->text() ) );
- }
+ if ( $action === true ) {
+ $action = 'byemail';
+ } elseif ( $action === false ) {
+ if ( $this->getName() == $wgUser->getName() ) {
+ $action = 'create';
+ } else {
+ $action = 'create2';
}
}
- $log = new LogPage( 'newusers' );
- return (int)$log->addEntry(
- $action,
- $this->getUserPage(),
- $reason,
- array( $this->getId() )
- );
+
+ if ( $action === 'create' || $action === 'autocreate' ) {
+ $performer = $this;
+ } else {
+ $performer = $wgUser;
+ }
+
+ $logEntry = new ManualLogEntry( 'newusers', $action );
+ $logEntry->setPerformer( $performer );
+ $logEntry->setTarget( $this->getUserPage() );
+ $logEntry->setComment( $reason );
+ $logEntry->setParameters( array(
+ '4::userid' => $this->getId(),
+ ) );
+ $logid = $logEntry->insert();
+
+ if ( $action !== 'autocreate' ) {
+ $logEntry->publish( $logid );
+ }
+
+ return (int)$logid;
}
/**
* Add an autocreate newuser log entry for this user
* Used by things like CentralAuth and perhaps other authplugins.
+ * Consider calling addNewUserLogEntry() directly instead.
*
* @return bool
*/
public function addNewUserLogEntryAutoCreate() {
- global $wgNewUserLog;
- if( !$wgNewUserLog ) {
- return true; // disabled
- }
- $log = new LogPage( 'newusers', false );
- $log->addEntry( 'autocreate', $this->getUserPage(), '', array( $this->getId() ), $this );
+ $this->addNewUserLogEntry( 'autocreate' );
+
return true;
}
/**
- * @todo document
+ * Load the user options either from cache, the database or an array
+ *
+ * @param array $data Rows for the current user out of the user_properties table
*/
- protected function loadOptions() {
+ protected function loadOptions( $data = null ) {
+ global $wgContLang;
+
$this->load();
- if ( $this->mOptionsLoaded || !$this->getId() )
+
+ if ( $this->mOptionsLoaded ) {
return;
+ }
$this->mOptions = self::getDefaultOptions();
+ if ( !$this->getId() ) {
+ // For unlogged-in users, load language/variant options from request.
+ // There's no need to do it for logged-in users: they can set preferences,
+ // and handling of page content is done by $pageLang->getPreferredVariant() and such,
+ // so don't override user's choice (especially when the user chooses site default).
+ $variant = $wgContLang->getDefaultVariant();
+ $this->mOptions['variant'] = $variant;
+ $this->mOptions['language'] = $variant;
+ $this->mOptionsLoaded = true;
+ return;
+ }
+
// Maybe load from the object
if ( !is_null( $this->mOptionOverrides ) ) {
wfDebug( "User: loading options for user " . $this->getId() . " from override cache.\n" );
@@ -4067,21 +4352,27 @@ class User {
$this->mOptions[$key] = $value;
}
} else {
- wfDebug( "User: loading options for user " . $this->getId() . " from database.\n" );
- // Load from database
- $dbr = wfGetDB( DB_SLAVE );
+ if( !is_array( $data ) ) {
+ wfDebug( "User: loading options for user " . $this->getId() . " from database.\n" );
+ // Load from database
+ $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select(
- 'user_properties',
- array( 'up_property', 'up_value' ),
- array( 'up_user' => $this->getId() ),
- __METHOD__
- );
+ $res = $dbr->select(
+ 'user_properties',
+ array( 'up_property', 'up_value' ),
+ array( 'up_user' => $this->getId() ),
+ __METHOD__
+ );
- $this->mOptionOverrides = array();
- foreach ( $res as $row ) {
- $this->mOptionOverrides[$row->up_property] = $row->up_value;
- $this->mOptions[$row->up_property] = $row->up_value;
+ $this->mOptionOverrides = array();
+ $data = array();
+ foreach ( $res as $row ) {
+ $data[$row->up_property] = $row->up_value;
+ }
+ }
+ foreach ( $data as $property => $value ) {
+ $this->mOptionOverrides[$property] = $value;
+ $this->mOptions[$property] = $value;
}
}
diff --git a/includes/UserMailer.php b/includes/UserMailer.php
index 01e7132d..6eb99172 100644
--- a/includes/UserMailer.php
+++ b/includes/UserMailer.php
@@ -21,9 +21,9 @@
* @author <brion@pobox.com>
* @author <mail@tgries.de>
* @author Tim Starling
+ * @author Luke Welling lwelling@wikimedia.org
*/
-
/**
* Stores a single person's name and email address.
* These are passed in via the constructor, and will be returned in SMTP
@@ -31,9 +31,9 @@
*/
class MailAddress {
/**
- * @param $address string|User string with an email address, or a User object
- * @param $name String: human-readable name if a string address is given
- * @param $realName String: human-readable real name if a string address is given
+ * @param string|User $address string with an email address, or a User object
+ * @param string $name human-readable name if a string address is given
+ * @param string $realName human-readable real name if a string address is given
*/
function __construct( $address, $name = null, $realName = null ) {
if ( is_object( $address ) && $address instanceof User ) {
@@ -77,7 +77,6 @@ class MailAddress {
}
}
-
/**
* Collection of static functions for sending mail
*/
@@ -109,9 +108,13 @@ class UserMailer {
/**
* Creates a single string from an associative array
*
- * @param $headers array Associative Array: keys are header field names,
+ * @param array $headers Associative Array: keys are header field names,
* values are ... values.
- * @param $endl String: The end of line character. Defaults to "\n"
+ * @param string $endl The end of line character. Defaults to "\n"
+ *
+ * Note RFC2822 says newlines must be CRLF (\r\n)
+ * but php mail naively "corrects" it and requires \n for the "correction" to work
+ *
* @return String
*/
static function arrayToHeaderString( $headers, $endl = "\n" ) {
@@ -131,10 +134,10 @@ class UserMailer {
global $wgSMTP, $wgServer;
$msgid = uniqid( wfWikiID() . ".", true ); /* true required for cygwin */
- if ( is_array($wgSMTP) && isset($wgSMTP['IDHost']) && $wgSMTP['IDHost'] ) {
+ if ( is_array( $wgSMTP ) && isset( $wgSMTP['IDHost'] ) && $wgSMTP['IDHost'] ) {
$domain = $wgSMTP['IDHost'];
} else {
- $url = wfParseUrl($wgServer);
+ $url = wfParseUrl( $wgServer );
$domain = $url['host'];
}
return "<$msgid@$domain>";
@@ -148,19 +151,48 @@ class UserMailer {
*
* @param $to MailAddress: recipient's email (or an array of them)
* @param $from MailAddress: sender's email
- * @param $subject String: email's subject.
- * @param $body String: email's text.
+ * @param string $subject email's subject.
+ * @param string $body email's text or Array of two strings to be the text and html bodies
* @param $replyto MailAddress: optional reply-to email (default: null).
- * @param $contentType String: optional custom Content-Type (default: text/plain; charset=UTF-8)
+ * @param string $contentType optional custom Content-Type (default: text/plain; charset=UTF-8)
+ * @throws MWException
* @return Status object
*/
public static function send( $to, $from, $subject, $body, $replyto = null, $contentType = 'text/plain; charset=UTF-8' ) {
- global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams;
-
+ global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams, $wgAllowHTMLEmail;
+ $mime = null;
if ( !is_array( $to ) ) {
$to = array( $to );
}
+ // mail body must have some content
+ $minBodyLen = 10;
+ // arbitrary but longer than Array or Object to detect casting error
+
+ // body must either be a string or an array with text and body
+ if (
+ !(
+ !is_array( $body ) &&
+ strlen( $body ) >= $minBodyLen
+ )
+ &&
+ !(
+ is_array( $body ) &&
+ isset( $body['text'] ) &&
+ isset( $body['html'] ) &&
+ strlen( $body['text'] ) >= $minBodyLen &&
+ strlen( $body['html'] ) >= $minBodyLen
+ )
+ ) {
+ // if it is neither we have a problem
+ return Status::newFatal( 'user-mail-no-body' );
+ }
+
+ if ( !$wgAllowHTMLEmail && is_array( $body ) ) {
+ // HTML not wanted. Dump it.
+ $body = $body['text'];
+ }
+
wfDebug( __METHOD__ . ': sending mail to ' . implode( ', ', $to ) . "\n" );
# Make sure we have at least one address
@@ -194,7 +226,7 @@ class UserMailer {
# NOTE: To: is for presentation, the actual recipient is specified
# by the mailer using the Rcpt-To: header.
#
- # Subject:
+ # Subject:
# PHP mail() second argument to pass the subject, passing a Subject
# as an additional header will result in a duplicate header.
#
@@ -210,32 +242,62 @@ class UserMailer {
}
$headers['Date'] = date( 'r' );
- $headers['MIME-Version'] = '1.0';
- $headers['Content-type'] = ( is_null( $contentType ) ?
- 'text/plain; charset=UTF-8' : $contentType );
- $headers['Content-transfer-encoding'] = '8bit';
-
$headers['Message-ID'] = self::makeMsgId();
$headers['X-Mailer'] = 'MediaWiki mailer';
+ # Line endings need to be different on Unix and Windows due to
+ # the bug described at http://trac.wordpress.org/ticket/2603
+ if ( wfIsWindows() ) {
+ $endl = "\r\n";
+ } else {
+ $endl = "\n";
+ }
+
+ if ( is_array( $body ) ) {
+ // we are sending a multipart message
+ wfDebug( "Assembling multipart mime email\n" );
+ if ( !stream_resolve_include_path( 'Mail/mime.php' ) ) {
+ wfDebug( "PEAR Mail_Mime package is not installed. Falling back to text email.\n" );
+ }
+ else {
+ require_once( 'Mail/mime.php' );
+ if ( wfIsWindows() ) {
+ $body['text'] = str_replace( "\n", "\r\n", $body['text'] );
+ $body['html'] = str_replace( "\n", "\r\n", $body['html'] );
+ }
+ $mime = new Mail_mime( array( 'eol' => $endl ) );
+ $mime->setTXTBody( $body['text'] );
+ $mime->setHTMLBody( $body['html'] );
+ $body = $mime->get(); // must call get() before headers()
+ $headers = $mime->headers( $headers );
+ }
+ }
+ if ( !isset( $mime ) ) {
+ // sending text only, either deliberately or as a fallback
+ if ( wfIsWindows() ) {
+ $body = str_replace( "\n", "\r\n", $body );
+ }
+ $headers['MIME-Version'] = '1.0';
+ $headers['Content-type'] = ( is_null( $contentType ) ?
+ 'text/plain; charset=UTF-8' : $contentType );
+ $headers['Content-transfer-encoding'] = '8bit';
+ }
+
$ret = wfRunHooks( 'AlternateUserMailer', array( $headers, $to, $from, $subject, $body ) );
if ( $ret === false ) {
+ // the hook implementation will return false to skip regular mail sending
return Status::newGood();
} elseif ( $ret !== true ) {
+ // the hook implementation will return a string to pass an error message
return Status::newFatal( 'php-mail-error', $ret );
}
if ( is_array( $wgSMTP ) ) {
#
# PEAR MAILER
- #
+ #
- if ( function_exists( 'stream_resolve_include_path' ) ) {
- $found = stream_resolve_include_path( 'Mail.php' );
- } else {
- $found = Fallback::stream_resolve_include_path( 'Mail.php' );
- }
- if ( !$found ) {
+ if ( !stream_resolve_include_path( 'Mail.php' ) ) {
throw new MWException( 'PEAR mail package is not installed' );
}
require_once( 'Mail.php' );
@@ -260,7 +322,7 @@ class UserMailer {
}
# Split jobs since SMTP servers tends to limit the maximum
- # number of possible recipients.
+ # number of possible recipients.
$chunks = array_chunk( $to, $wgEnotifMaxRecips );
foreach ( $chunks as $chunk ) {
$status = self::sendWithPear( $mail_object, $chunk, $headers, $body );
@@ -272,21 +334,11 @@ class UserMailer {
}
wfRestoreWarnings();
return Status::newGood();
- } else {
- #
+ } else {
+ #
# PHP mail()
#
-
- # Line endings need to be different on Unix and Windows due to
- # the bug described at http://trac.wordpress.org/ticket/2603
- if ( wfIsWindows() ) {
- $body = str_replace( "\n", "\r\n", $body );
- $endl = "\r\n";
- } else {
- $endl = "\n";
- }
-
- if( count($to) > 1 ) {
+ if( count( $to ) > 1 ) {
$headers['To'] = 'undisclosed-recipients:;';
}
$headers = self::arrayToHeaderString( $headers, $endl );
@@ -299,6 +351,7 @@ class UserMailer {
set_error_handler( 'UserMailer::errorHandler' );
$safeMode = wfIniGetBool( 'safe_mode' );
+
foreach ( $to as $recip ) {
if ( $safeMode ) {
$sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers );
@@ -327,7 +380,7 @@ class UserMailer {
* Set the mail error message in self::$mErrorString
*
* @param $code Integer: error number
- * @param $string String: error message
+ * @param string $string error message
*/
static function errorHandler( $code, $string ) {
self::$mErrorString = preg_replace( '/^mail\(\)(\s*\[.*?\])?: /', '', $string );
@@ -346,6 +399,12 @@ class UserMailer {
/**
* Converts a string into quoted-printable format
* @since 1.17
+ *
+ * From PHP5.3 there is a built in function quoted_printable_encode()
+ * This method does not duplicate that.
+ * This method is doing Q encoding inside encoded-words as defined by RFC 2047
+ * This is for email headers.
+ * The built in quoted_printable_encode() is for email bodies
* @return string
*/
public static function quotedPrintable( $string, $charset = '' ) {
@@ -395,7 +454,7 @@ class UserMailer {
*/
class EmailNotification {
protected $subject, $body, $replyto, $from;
- protected $timestamp, $summary, $minorEdit, $oldid, $composed_common;
+ protected $timestamp, $summary, $minorEdit, $oldid, $composed_common, $pageStatus;
protected $mailTargets = array();
/**
@@ -420,8 +479,9 @@ class EmailNotification {
* @param $summary
* @param $minorEdit
* @param $oldid (default: false)
+ * @param $pageStatus (default: 'changed')
*/
- public function notifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid = false ) {
+ public function notifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid = false, $pageStatus = 'changed' ) {
global $wgEnotifUseJobQ, $wgEnotifWatchlist, $wgShowUpdatedMarker, $wgEnotifMinorEdits,
$wgUsersNotifiedOnAllChanges, $wgEnotifUserTalk;
@@ -429,7 +489,7 @@ class EmailNotification {
return;
}
- // Build a list of users to notfiy
+ // Build a list of users to notify
$watchers = array();
if ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) {
$dbw = wfGetDB( DB_MASTER );
@@ -446,19 +506,23 @@ class EmailNotification {
$watchers[] = intval( $row->wl_user );
}
if ( $watchers ) {
- // Update wl_notificationtimestamp for all watching users except
- // the editor
- $dbw->begin( __METHOD__ );
- $dbw->update( 'watchlist',
- array( /* SET */
- 'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
- ), array( /* WHERE */
- 'wl_user' => $watchers,
- 'wl_namespace' => $title->getNamespace(),
- 'wl_title' => $title->getDBkey(),
- ), __METHOD__
+ // Update wl_notificationtimestamp for all watching users except the editor
+ $fname = __METHOD__;
+ $dbw->onTransactionIdle(
+ function() use ( $dbw, $timestamp, $watchers, $title, $fname ) {
+ $dbw->begin( $fname );
+ $dbw->update( 'watchlist',
+ array( /* SET */
+ 'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
+ ), array( /* WHERE */
+ 'wl_user' => $watchers,
+ 'wl_namespace' => $title->getNamespace(),
+ 'wl_title' => $title->getDBkey(),
+ ), $fname
+ );
+ $dbw->commit( $fname );
+ }
);
- $dbw->commit( __METHOD__ );
}
}
@@ -488,12 +552,13 @@ class EmailNotification {
'summary' => $summary,
'minorEdit' => $minorEdit,
'oldid' => $oldid,
- 'watchers' => $watchers
+ 'watchers' => $watchers,
+ 'pageStatus' => $pageStatus
);
$job = new EnotifNotifyJob( $title, $params );
- $job->insert();
+ JobQueueGroup::singleton()->push( $job );
} else {
- $this->actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid, $watchers );
+ $this->actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid, $watchers, $pageStatus );
}
}
@@ -505,13 +570,16 @@ class EmailNotification {
*
* @param $editor User object
* @param $title Title object
- * @param $timestamp string Edit timestamp
- * @param $summary string Edit summary
+ * @param string $timestamp Edit timestamp
+ * @param string $summary Edit summary
* @param $minorEdit bool
- * @param $oldid int Revision ID
- * @param $watchers array of user IDs
+ * @param int $oldid Revision ID
+ * @param array $watchers of user IDs
+ * @param string $pageStatus
+ * @throws MWException
*/
- public function actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid, $watchers ) {
+ public function actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit,
+ $oldid, $watchers, $pageStatus = 'changed' ) {
# we use $wgPasswordSender as sender's address
global $wgEnotifWatchlist;
global $wgEnotifMinorEdits, $wgEnotifUserTalk;
@@ -531,6 +599,14 @@ class EmailNotification {
$this->oldid = $oldid;
$this->editor = $editor;
$this->composed_common = false;
+ $this->pageStatus = $pageStatus;
+
+ $formattedPageStatus = array( 'deleted', 'created', 'moved', 'restored', 'changed' );
+
+ wfRunHooks( 'UpdateUserMailerFormattedPageStatus', array( &$formattedPageStatus ) );
+ if ( !in_array( $this->pageStatus, $formattedPageStatus ) ) {
+ throw new MWException( 'Not a valid page status!' );
+ }
$userTalkId = false;
@@ -620,25 +696,30 @@ class EmailNotification {
$keys = array();
$postTransformKeys = array();
+ $pageTitleUrl = $this->title->getCanonicalUrl();
+ $pageTitle = $this->title->getPrefixedText();
if ( $this->oldid ) {
// Always show a link to the diff which triggered the mail. See bug 32210.
- $keys['$NEWPAGE'] = wfMessage( 'enotif_lastdiff',
+ $keys['$NEWPAGE'] = "\n\n" . wfMessage( 'enotif_lastdiff',
$this->title->getCanonicalUrl( 'diff=next&oldid=' . $this->oldid ) )
->inContentLanguage()->text();
+
if ( !$wgEnotifImpersonal ) {
// For personal mail, also show a link to the diff of all changes
// since last visited.
- $keys['$NEWPAGE'] .= " \n" . wfMessage( 'enotif_lastvisited',
+ $keys['$NEWPAGE'] .= "\n\n" . wfMessage( 'enotif_lastvisited',
$this->title->getCanonicalUrl( 'diff=0&oldid=' . $this->oldid ) )
->inContentLanguage()->text();
}
- $keys['$OLDID'] = $this->oldid;
+ $keys['$OLDID'] = $this->oldid;
+ // @deprecated Remove in MediaWiki 1.23.
$keys['$CHANGEDORCREATED'] = wfMessage( 'changed' )->inContentLanguage()->text();
} else {
- $keys['$NEWPAGE'] = wfMessage( 'enotif_newpagetext' )->inContentLanguage()->text();
# clear $OLDID placeholder in the message template
- $keys['$OLDID'] = '';
+ $keys['$OLDID'] = '';
+ $keys['$NEWPAGE'] = '';
+ // @deprecated Remove in MediaWiki 1.23.
$keys['$CHANGEDORCREATED'] = wfMessage( 'created' )->inContentLanguage()->text();
}
@@ -653,6 +734,7 @@ class EmailNotification {
$keys['$PAGEEDITOR'] = wfMessage( 'enotif_anon_editor', $this->editor->getName() )
->inContentLanguage()->text();
$keys['$PAGEEDITOR_EMAIL'] = wfMessage( 'noemailtitle' )->inContentLanguage()->text();
+
} else {
$keys['$PAGEEDITOR'] = $wgEnotifUseRealName ? $this->editor->getRealName() : $this->editor->getName();
$emailPage = SpecialPage::getSafeTitleFor( 'Emailuser', $this->editor->getName() );
@@ -665,11 +747,12 @@ class EmailNotification {
$postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
# Now build message's subject and body
+ $this->subject = wfMessage( 'enotif_subject_' . $this->pageStatus )->inContentLanguage()
+ ->params( $pageTitle, $keys['$PAGEEDITOR'] )->text();
- $subject = wfMessage( 'enotif_subject' )->inContentLanguage()->plain();
- $subject = strtr( $subject, $keys );
- $subject = MessageCache::singleton()->transform( $subject, false, null, $this->title );
- $this->subject = strtr( $subject, $postTransformKeys );
+ $keys['$PAGEINTRO'] = wfMessage( 'enotif_body_intro_' . $this->pageStatus )
+ ->inContentLanguage()->params( $pageTitle, $keys['$PAGEEDITOR'], $pageTitleUrl )
+ ->text();
$body = wfMessage( 'enotif_body' )->inContentLanguage()->plain();
$body = strtr( $body, $keys );
@@ -686,13 +769,13 @@ class EmailNotification {
{
$editorAddress = new MailAddress( $this->editor );
if ( $wgEnotifFromEditor ) {
- $this->from = $editorAddress;
+ $this->from = $editorAddress;
} else {
- $this->from = $adminAddress;
+ $this->from = $adminAddress;
$this->replyto = $editorAddress;
}
} else {
- $this->from = $adminAddress;
+ $this->from = $adminAddress;
$this->replyto = new MailAddress( $wgNoReplyAddress );
}
}
@@ -761,13 +844,15 @@ class EmailNotification {
/**
* Same as sendPersonalised but does impersonal mail suitable for bulk
* mailing. Takes an array of MailAddress objects.
- * @return Status
+ * @param $addresses array
+ * @return Status|null
*/
function sendImpersonal( $addresses ) {
global $wgContLang;
- if ( empty( $addresses ) )
- return;
+ if ( empty( $addresses ) ) {
+ return null;
+ }
$body = str_replace(
array( '$WATCHINGUSERNAME',
diff --git a/includes/UserRightsProxy.php b/includes/UserRightsProxy.php
index 26ac3dcd..cd5dff84 100644
--- a/includes/UserRightsProxy.php
+++ b/includes/UserRightsProxy.php
@@ -32,8 +32,8 @@ class UserRightsProxy {
* @see newFromId()
* @see newFromName()
* @param $db DatabaseBase: db connection
- * @param $database String: database name
- * @param $name String: user name
+ * @param string $database database name
+ * @param string $name user name
* @param $id Integer: user ID
*/
private function __construct( $db, $database, $name, $id ) {
@@ -56,7 +56,7 @@ class UserRightsProxy {
/**
* Confirm the selected database name is a valid local interwiki database name.
*
- * @param $database String: database name
+ * @param string $database database name
* @return Boolean
*/
public static function validDatabase( $database ) {
@@ -67,7 +67,7 @@ class UserRightsProxy {
/**
* Same as User::whoIs()
*
- * @param $database String: database name
+ * @param string $database database name
* @param $id Integer: user ID
* @param $ignoreInvalidDB Boolean: if true, don't check if $database is in $wgLocalDatabases
* @return String: user name or false if the user doesn't exist
@@ -84,7 +84,7 @@ class UserRightsProxy {
/**
* Factory function; get a remote user entry by ID number.
*
- * @param $database String: database name
+ * @param string $database database name
* @param $id Integer: user ID
* @param $ignoreInvalidDB Boolean: if true, don't check if $database is in $wgLocalDatabases
* @return UserRightsProxy or null if doesn't exist
@@ -96,8 +96,8 @@ class UserRightsProxy {
/**
* Factory function; get a remote user entry by name.
*
- * @param $database String: database name
- * @param $name String: user name
+ * @param string $database database name
+ * @param string $name user name
* @param $ignoreInvalidDB Boolean: if true, don't check if $database is in $wgLocalDatabases
* @return UserRightsProxy or null if doesn't exist
*/
diff --git a/includes/ViewCountUpdate.php b/includes/ViewCountUpdate.php
index 28ba3414..22a46493 100644
--- a/includes/ViewCountUpdate.php
+++ b/includes/ViewCountUpdate.php
@@ -53,16 +53,13 @@ class ViewCountUpdate implements DeferrableUpdate {
}
# Not important enough to warrant an error page in case of failure
- $oldignore = $dbw->ignoreErrors( true );
-
- $dbw->insert( 'hitcounter', array( 'hc_id' => $this->id ), __METHOD__ );
-
- $checkfreq = intval( $wgHitcounterUpdateFreq / 25 + 1 );
- if ( rand() % $checkfreq == 0 && $dbw->lastErrno() == 0 ) {
- $this->collect();
- }
-
- $dbw->ignoreErrors( $oldignore );
+ try {
+ $dbw->insert( 'hitcounter', array( 'hc_id' => $this->id ), __METHOD__ );
+ $checkfreq = intval( $wgHitcounterUpdateFreq / 25 + 1 );
+ if ( rand() % $checkfreq == 0 && $dbw->lastErrno() == 0 ) {
+ $this->collect();
+ }
+ } catch ( DBError $e ) {}
}
protected function collect() {
diff --git a/includes/WatchedItem.php b/includes/WatchedItem.php
index 932af169..5ac92f73 100644
--- a/includes/WatchedItem.php
+++ b/includes/WatchedItem.php
@@ -27,7 +27,7 @@
* @ingroup Watchlist
*/
class WatchedItem {
- var $mTitle, $mUser, $id, $ns, $ti;
+ var $mTitle, $mUser;
private $loaded = false, $watched, $timestamp;
/**
@@ -40,25 +40,44 @@ class WatchedItem {
$wl = new WatchedItem;
$wl->mUser = $user;
$wl->mTitle = $title;
- $wl->id = $user->getId();
- # Patch (also) for email notification on page changes T.Gries/M.Arndt 11.09.2004
- # TG patch: here we do not consider pages and their talk pages equivalent - why should we ?
- # The change results in talk-pages not automatically included in watchlists, when their parent page is included
- # $wl->ns = $title->getNamespace() & ~1;
- $wl->ns = $title->getNamespace();
- $wl->ti = $title->getDBkey();
return $wl;
}
/**
+ * Title being watched
+ * @return Title
+ */
+ protected function getTitle() {
+ return $this->mTitle;
+ }
+
+ /** Helper to retrieve the title namespace */
+ protected function getTitleNs() {
+ return $this->getTitle()->getNamespace();
+ }
+
+ /** Helper to retrieve the title DBkey */
+ protected function getTitleDBkey() {
+ return $this->getTitle()->getDBkey();
+ }
+ /** Helper to retrieve the user id */
+ protected function getUserId() {
+ return $this->mUser->getId();
+ }
+
+ /**
* Return an array of conditions to select or update the appropriate database
* row.
*
* @return array
*/
private function dbCond() {
- return array( 'wl_user' => $this->id, 'wl_namespace' => $this->ns, 'wl_title' => $this->ti );
+ return array(
+ 'wl_user' => $this->getUserId(),
+ 'wl_namespace' => $this->getTitleNs(),
+ 'wl_title' => $this->getTitleDBkey(),
+ );
}
/**
@@ -143,22 +162,22 @@ class WatchedItem {
// if there's already an entry for this page
$dbw = wfGetDB( DB_MASTER );
$dbw->insert( 'watchlist',
- array(
- 'wl_user' => $this->id,
- 'wl_namespace' => MWNamespace::getSubject($this->ns),
- 'wl_title' => $this->ti,
- 'wl_notificationtimestamp' => null
- ), __METHOD__, 'IGNORE' );
+ array(
+ 'wl_user' => $this->getUserId(),
+ 'wl_namespace' => MWNamespace::getSubject( $this->getTitleNs() ),
+ 'wl_title' => $this->getTitleDBkey(),
+ 'wl_notificationtimestamp' => null
+ ), __METHOD__, 'IGNORE' );
// Every single watched page needs now to be listed in watchlist;
// namespace:page and namespace_talk:page need separate entries:
$dbw->insert( 'watchlist',
- array(
- 'wl_user' => $this->id,
- 'wl_namespace' => MWNamespace::getTalk($this->ns),
- 'wl_title' => $this->ti,
- 'wl_notificationtimestamp' => null
- ), __METHOD__, 'IGNORE' );
+ array(
+ 'wl_user' => $this->getUserId(),
+ 'wl_namespace' => MWNamespace::getTalk( $this->getTitleNs() ),
+ 'wl_title' => $this->getTitleDBkey(),
+ 'wl_notificationtimestamp' => null
+ ), __METHOD__, 'IGNORE' );
$this->watched = true;
@@ -177,24 +196,24 @@ class WatchedItem {
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'watchlist',
array(
- 'wl_user' => $this->id,
- 'wl_namespace' => MWNamespace::getSubject($this->ns),
- 'wl_title' => $this->ti
+ 'wl_user' => $this->getUserId(),
+ 'wl_namespace' => MWNamespace::getSubject( $this->getTitleNs() ),
+ 'wl_title' => $this->getTitleDBkey(),
), __METHOD__
);
if ( $dbw->affectedRows() ) {
$success = true;
}
- # the following code compensates the new behaviour, introduced by the
+ # the following code compensates the new behavior, introduced by the
# enotif patch, that every single watched page needs now to be listed
# in watchlist namespace:page and namespace_talk:page had separate
# entries: clear them
$dbw->delete( 'watchlist',
array(
- 'wl_user' => $this->id,
- 'wl_namespace' => MWNamespace::getTalk($this->ns),
- 'wl_title' => $this->ti
+ 'wl_user' => $this->getUserId(),
+ 'wl_namespace' => MWNamespace::getTalk( $this->getTitleNs() ),
+ 'wl_title' => $this->getTitleDBkey(),
), __METHOD__
);
diff --git a/includes/WebRequest.php b/includes/WebRequest.php
index 96279fb2..98007ef8 100644
--- a/includes/WebRequest.php
+++ b/includes/WebRequest.php
@@ -1,6 +1,6 @@
<?php
/**
- * Deal with importing all those nasssty globals and things
+ * Deal with importing all those nasty globals and things
*
* Copyright © 2003 Brion Vibber <brion@pobox.com>
* http://www.mediawiki.org/
@@ -70,13 +70,13 @@ class WebRequest {
* If the REQUEST_URI is not provided we'll fall back on the PATH_INFO
* provided by the server if any and use that to set a 'title' parameter.
*
- * @param $want string: If this is not 'all', then the function
+ * @param string $want If this is not 'all', then the function
* will return an empty array if it determines that the URL is
* inside a rewrite path.
*
* @return Array: Any query arguments found in path matches.
*/
- static public function getPathInfo( $want = 'all' ) {
+ public static function getPathInfo( $want = 'all' ) {
global $wgUsePathInfo;
// PATH_INFO is mangled due to http://bugs.php.net/bug.php?id=31892
// And also by Apache 2.x, double slashes are converted to single slashes.
@@ -128,7 +128,7 @@ class WebRequest {
global $wgVariantArticlePath, $wgContLang;
if( $wgVariantArticlePath ) {
$router->add( $wgVariantArticlePath,
- array( 'variant' => '$2'),
+ array( 'variant' => '$2' ),
array( '$2' => $wgContLang->getVariants() )
);
}
@@ -144,7 +144,7 @@ class WebRequest {
// Also reported when ini_get('cgi.fix_pathinfo')==false
$matches['title'] = substr( $_SERVER['ORIG_PATH_INFO'], 1 );
- } elseif ( isset( $_SERVER['PATH_INFO'] ) && ($_SERVER['PATH_INFO'] != '') ) {
+ } elseif ( isset( $_SERVER['PATH_INFO'] ) && $_SERVER['PATH_INFO'] != '' ) {
// Regular old PATH_INFO yay
$matches['title'] = substr( $_SERVER['PATH_INFO'], 1 );
}
@@ -192,14 +192,21 @@ class WebRequest {
* @return array
*/
public static function detectProtocolAndStdPort() {
- return ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' ) ? array( 'https', 443 ) : array( 'http', 80 );
+ if ( ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' ) ||
+ ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) &&
+ $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) ) {
+ $arr = array( 'https', 443 );
+ } else {
+ $arr = array( 'http', 80 );
+ }
+ return $arr;
}
/**
* @return string
*/
public static function detectProtocol() {
- list( $proto, $stdPort ) = self::detectProtocolAndStdPort();
+ list( $proto, ) = self::detectProtocolAndStdPort();
return $proto;
}
@@ -226,9 +233,9 @@ class WebRequest {
* URL rewriting function; tries to extract page title and,
* optionally, one other fixed parameter value from a URL path.
*
- * @param $path string: the URL path given from the client
- * @param $bases array: one or more URLs, optionally with $1 at the end
- * @param $key string: if provided, the matching key in $bases will be
+ * @param string $path the URL path given from the client
+ * @param array $bases one or more URLs, optionally with $1 at the end
+ * @param string $key if provided, the matching key in $bases will be
* passed on as the value of this URL parameter
* @return array of URL variables to interpolate; empty if no match
*/
@@ -255,8 +262,8 @@ class WebRequest {
* Recursively strips slashes from the given array;
* used for undoing the evil that is magic_quotes_gpc.
*
- * @param $arr array: will be modified
- * @param $topLevel bool Specifies if the array passed is from the top
+ * @param array $arr will be modified
+ * @param bool $topLevel Specifies if the array passed is from the top
* level of the source. In PHP5 magic_quotes only escapes the first level
* of keys that belong to an array.
* @return array the original array
@@ -352,7 +359,7 @@ class WebRequest {
* selected by a drop-down menu). For freeform input, see getText().
*
* @param $name String
- * @param $default String: optional default (or NULL)
+ * @param string $default optional default (or NULL)
* @return String
*/
public function getVal( $name, $default = null ) {
@@ -370,7 +377,7 @@ class WebRequest {
/**
* Set an arbitrary value into our get/post data.
*
- * @param $key String: key name to use
+ * @param string $key key name to use
* @param $value Mixed: value to set
* @return Mixed: old value if one was present, null otherwise
*/
@@ -380,11 +387,10 @@ class WebRequest {
return $ret;
}
-
/**
* Unset an arbitrary value from our get/post data.
- *
- * @param $key String: key name to use
+ *
+ * @param string $key key name to use
* @return Mixed: old value if one was present, null otherwise
*/
public function unsetVal( $key ) {
@@ -403,7 +409,7 @@ class WebRequest {
* If no source and no default, returns NULL.
*
* @param $name String
- * @param $default Array: optional default (or NULL)
+ * @param array $default optional default (or NULL)
* @return Array
*/
public function getArray( $name, $default = null ) {
@@ -422,7 +428,7 @@ class WebRequest {
* If an array is returned, contents are guaranteed to be integers.
*
* @param $name String
- * @param $default Array: option default (or NULL)
+ * @param array $default option default (or NULL)
* @return Array of ints
*/
public function getIntArray( $name, $default = null ) {
@@ -497,7 +503,7 @@ class WebRequest {
*/
public function getCheck( $name ) {
# Checkboxes and buttons are only present when clicked
- # Presence connotes truth, abscense false
+ # Presence connotes truth, absence false
return $this->getVal( $name, null ) !== null;
}
@@ -510,7 +516,7 @@ class WebRequest {
* be required - e.g. Esperanto x-coding).
*
* @param $name String
- * @param $default String: optional
+ * @param string $default optional
* @return String
*/
public function getText( $name, $default = '' ) {
@@ -559,9 +565,9 @@ class WebRequest {
*
* @return Array
*/
- public function getQueryValues() {
+ public function getQueryValues() {
return $_GET;
- }
+ }
/**
* Get the HTTP method used for this request.
@@ -603,8 +609,8 @@ class WebRequest {
/**
* Get a cookie from the $_COOKIE jar
*
- * @param $key String: the name of the cookie
- * @param $prefix String: a prefix to use for the cookie name, if not $wgCookiePrefix
+ * @param string $key the name of the cookie
+ * @param string $prefix a prefix to use for the cookie name, if not $wgCookiePrefix
* @param $default Mixed: what to return if the value isn't found
* @return Mixed: cookie value or $default if the cookie not set
*/
@@ -613,13 +619,14 @@ class WebRequest {
global $wgCookiePrefix;
$prefix = $wgCookiePrefix;
}
- return $this->getGPCVal( $_COOKIE, $prefix . $key , $default );
+ return $this->getGPCVal( $_COOKIE, $prefix . $key, $default );
}
/**
* Return the path and query string portion of the request URI.
* This will be suitable for use as a relative link in HTML output.
*
+ * @throws MWException
* @return String
*/
public function getRequestURL() {
@@ -671,7 +678,7 @@ class WebRequest {
/**
* Take an arbitrary query and rewrite the present URL to include it
- * @param $query String: query string fragment; do not include initial '?'
+ * @param string $query query string fragment; do not include initial '?'
*
* @return String
*/
@@ -683,7 +690,7 @@ class WebRequest {
* HTML-safe version of appendQuery().
* @deprecated: Deprecated in 1.20, warnings in 1.21, remove in 1.22.
*
- * @param $query String: query string fragment; do not include initial '?'
+ * @param string $query query string fragment; do not include initial '?'
* @return String
*/
public function escapeAppendQuery( $query ) {
@@ -703,8 +710,8 @@ class WebRequest {
/**
* Appends or replaces value of query variables.
*
- * @param $array Array of values to replace/add to query
- * @param $onlyquery Bool: whether to only return the query string and not
+ * @param array $array of values to replace/add to query
+ * @param bool $onlyquery whether to only return the query string and not
* the complete URL
* @return String
*/
@@ -713,7 +720,7 @@ class WebRequest {
$newquery = $this->getQueryValues();
unset( $newquery['title'] );
$newquery = array_merge( $newquery, $array );
- $query = wfArrayToCGI( $newquery );
+ $query = wfArrayToCgi( $newquery );
return $onlyquery ? $query : $wgTitle->getLocalURL( $query );
}
@@ -723,7 +730,7 @@ class WebRequest {
* Offset must be positive but is not capped.
*
* @param $deflimit Integer: limit to use if no input and the user hasn't set the option.
- * @param $optionname String: to specify an option other than rclimit to pull from.
+ * @param string $optionname to specify an option other than rclimit to pull from.
* @return array first element is limit, second is offset
*/
public function getLimitOffset( $deflimit = 50, $optionname = 'rclimit' ) {
@@ -734,7 +741,7 @@ class WebRequest {
$limit = 0;
}
if( ( $limit == 0 ) && ( $optionname != '' ) ) {
- $limit = (int)$wgUser->getOption( $optionname );
+ $limit = $wgUser->getIntOption( $optionname );
}
if( $limit <= 0 ) {
$limit = $deflimit;
@@ -842,7 +849,7 @@ class WebRequest {
} else {
foreach ( $_SERVER as $name => $value ) {
if ( substr( $name, 0, 5 ) === 'HTTP_' ) {
- $name = str_replace( '_', '-', substr( $name, 5 ) );
+ $name = str_replace( '_', '-', substr( $name, 5 ) );
$this->headers[$name] = $value;
} elseif ( $name === 'CONTENT_LENGTH' ) {
$this->headers['CONTENT-LENGTH'] = $value;
@@ -863,7 +870,7 @@ class WebRequest {
/**
* Get a request header, or false if it isn't set
- * @param $name String: case-insensitive header name
+ * @param string $name case-insensitive header name
*
* @return string|bool False on failure
*/
@@ -880,7 +887,7 @@ class WebRequest {
/**
* Get data from $_SESSION
*
- * @param $key String: name of key in $_SESSION
+ * @param string $key name of key in $_SESSION
* @return Mixed
*/
public function getSessionData( $key ) {
@@ -893,7 +900,7 @@ class WebRequest {
/**
* Set session data
*
- * @param $key String: name of key in $_SESSION
+ * @param string $key name of key in $_SESSION
* @param $data Mixed
*/
public function setSessionData( $key, $data ) {
@@ -907,6 +914,7 @@ class WebRequest {
* false if an error message has been shown and the request should be aborted.
*
* @param $extWhitelist array
+ * @throws HttpError
* @return bool
*/
public function checkUrlExtension( $extWhitelist = array() ) {
@@ -1043,22 +1051,30 @@ HTML;
*
* @since 1.19
*
+ * @throws MWException
* @return String
*/
protected function getRawIP() {
- if ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
- return IP::canonicalize( $_SERVER['REMOTE_ADDR'] );
- } else {
+ if ( !isset( $_SERVER['REMOTE_ADDR'] ) ) {
return null;
}
+
+ if ( is_array( $_SERVER['REMOTE_ADDR'] ) || strpos( $_SERVER['REMOTE_ADDR'], ',' ) !== false ) {
+ throw new MWException( __METHOD__ . " : Could not determine the remote IP address due to multiple values." );
+ } else {
+ $ipchain = $_SERVER['REMOTE_ADDR'];
+ }
+
+ return IP::canonicalize( $ipchain );
}
/**
* Work out the IP address based on various globals
* For trusted proxies, use the XFF client IP (first of the chain)
- *
+ *
* @since 1.19
*
+ * @throws MWException
* @return string
*/
public function getIP() {
@@ -1108,6 +1124,15 @@ HTML;
$this->ip = $ip;
return $ip;
}
+
+ /**
+ * @param string $ip
+ * @return void
+ * @since 1.21
+ */
+ public function setIP( $ip ) {
+ $this->ip = $ip;
+ }
}
/**
@@ -1122,7 +1147,7 @@ class WebRequestUpload {
* Constructor. Should only be called by WebRequest
*
* @param $request WebRequest The associated request
- * @param $key string Key in $_FILES array (name of form field)
+ * @param string $key Key in $_FILES array (name of form field)
*/
public function __construct( $request, $key ) {
$this->request = $request;
@@ -1234,10 +1259,11 @@ class FauxRequest extends WebRequest {
private $session = array();
/**
- * @param $data Array of *non*-urlencoded key => value pairs, the
+ * @param array $data of *non*-urlencoded key => value pairs, the
* fake GET/POST values
- * @param $wasPosted Bool: whether to treat the data as POST
+ * @param bool $wasPosted whether to treat the data as POST
* @param $session Mixed: session array or null
+ * @throws MWException
*/
public function __construct( $data = array(), $wasPosted = false, $session = null ) {
if( is_array( $data ) ) {
@@ -1246,8 +1272,9 @@ class FauxRequest extends WebRequest {
throw new MWException( "FauxRequest() got bogus data" );
}
$this->wasPosted = $wasPosted;
- if( $session )
+ if( $session ) {
$this->session = $session;
+ }
}
/**
@@ -1330,8 +1357,10 @@ class FauxRequest extends WebRequest {
* @return mixed
*/
public function getSessionData( $key ) {
- if( isset( $this->session[$key] ) )
+ if( isset( $this->session[$key] ) ) {
return $this->session[$key];
+ }
+ return null;
}
/**
diff --git a/includes/WebResponse.php b/includes/WebResponse.php
index 193101b1..8e15d712 100644
--- a/includes/WebResponse.php
+++ b/includes/WebResponse.php
@@ -30,8 +30,8 @@ class WebResponse {
/**
* Output a HTTP header, wrapper for PHP's
* header()
- * @param $string String: header to output
- * @param $replace Bool: replace current similar header
+ * @param string $string header to output
+ * @param bool $replace replace current similar header
* @param $http_response_code null|int Forces the HTTP response code to the specified value.
*/
public function header( $string, $replace = true, $http_response_code = null ) {
@@ -40,15 +40,20 @@ class WebResponse {
/**
* Set the browser cookie
- * @param $name String: name of cookie
- * @param $value String: value to give cookie
- * @param $expire Int: number of seconds til cookie expires
- * @param $prefix String: Prefix to use, if not $wgCookiePrefix (use '' for no prefix)
- * @param @domain String: Cookie domain to use, if not $wgCookieDomain
+ * @param string $name name of cookie
+ * @param string $value value to give cookie
+ * @param int $expire Unix timestamp (in seconds) when the cookie should expire.
+ * 0 (the default) causes it to expire $wgCookieExpiration seconds from now.
+ * @param string $prefix Prefix to use, if not $wgCookiePrefix (use '' for no prefix)
+ * @param string $domain Cookie domain to use, if not $wgCookieDomain
+ * @param $forceSecure Bool:
+ * true: force the cookie to be set with the secure attribute
+ * false: force the cookie to be set without the secure attribute
+ * null: use the value from $wgCookieSecure
*/
- public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null ) {
+ public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null, $forceSecure = null ) {
global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain;
- global $wgCookieSecure,$wgCookieExpiration, $wgCookieHttpOnly;
+ global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly;
if ( $expire == 0 ) {
$expire = time() + $wgCookieExpiration;
}
@@ -58,7 +63,18 @@ class WebResponse {
if( $domain === null ) {
$domain = $wgCookieDomain;
}
- $httpOnlySafe = wfHttpOnlySafe() && $wgCookieHttpOnly;
+
+ if ( is_null( $forceSecure ) ) {
+ $secureCookie = $wgCookieSecure;
+ } else {
+ $secureCookie = $forceSecure;
+ }
+
+ // Mark the cookie as httpOnly if $wgCookieHttpOnly is true,
+ // unless the requesting user-agent is known to have trouble with
+ // httpOnly cookies.
+ $httpOnlySafe = $wgCookieHttpOnly && wfHttpOnlySafe();
+
wfDebugLog( 'cookie',
'setcookie: "' . implode( '", "',
array(
@@ -67,14 +83,14 @@ class WebResponse {
$expire,
$wgCookiePath,
$domain,
- $wgCookieSecure,
+ $secureCookie,
$httpOnlySafe ) ) . '"' );
setcookie( $prefix . $name,
$value,
$expire,
$wgCookiePath,
$domain,
- $wgCookieSecure,
+ $secureCookie,
$httpOnlySafe );
}
}
@@ -89,8 +105,8 @@ class FauxResponse extends WebResponse {
/**
* Stores a HTTP header
- * @param $string String: header to output
- * @param $replace Bool: replace current similar header
+ * @param string $string header to output
+ * @param bool $replace replace current similar header
* @param $http_response_code null|int Forces the HTTP response code to the specified value.
*/
public function header( $string, $replace = true, $http_response_code = null ) {
@@ -133,14 +149,14 @@ class FauxResponse extends WebResponse {
/**
* @todo document. It just ignore optional parameters.
*
- * @param $name String: name of cookie
- * @param $value String: value to give cookie
- * @param $expire Int: number of seconds til cookie expires (Default: 0)
+ * @param string $name name of cookie
+ * @param string $value value to give cookie
+ * @param int $expire number of seconds til cookie expires (Default: 0)
* @param $prefix TODO DOCUMENT (Default: null)
* @param $domain TODO DOCUMENT (Default: null)
- *
+ * @param $forceSecure TODO DOCUMENT (Default: null)
*/
- public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null ) {
+ public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null, $forceSecure = null ) {
$this->cookies[$name] = $value;
}
@@ -148,7 +164,7 @@ class FauxResponse extends WebResponse {
* @param $name string
* @return string
*/
- public function getcookie( $name ) {
+ public function getcookie( $name ) {
if ( isset( $this->cookies[$name] ) ) {
return $this->cookies[$name];
}
diff --git a/includes/WebStart.php b/includes/WebStart.php
index 01c5eea8..e6f31355 100644
--- a/includes/WebStart.php
+++ b/includes/WebStart.php
@@ -27,7 +27,7 @@
# This must be done before any globals are set by the code
if ( ini_get( 'register_globals' ) ) {
if ( isset( $_REQUEST['GLOBALS'] ) || isset( $_FILES['GLOBALS'] ) ) {
- die( '<a href="http://www.hardened-php.net/globals-problem">$GLOBALS overwrite vulnerability</a>');
+ die( '<a href="http://www.hardened-php.net/globals-problem">$GLOBALS overwrite vulnerability</a>' );
}
$verboten = array(
'GLOBALS',
@@ -57,12 +57,12 @@ if ( ini_get( 'register_globals' ) ) {
}
}
-# bug 15461: Make IE8 turn off content sniffing. Everbody else should ignore this
+# bug 15461: Make IE8 turn off content sniffing. Everybody else should ignore this
# We're adding it here so that it's *always* set, even for alternate entry
# points and when $wgOut gets disabled or overridden.
header( 'X-Content-Type-Options: nosniff' );
-$wgRequestTime = microtime(true);
+$wgRequestTime = microtime( true );
# getrusage() does not exist on the Microsoft Windows platforms, catching this
if ( function_exists ( 'getrusage' ) ) {
$wgRUstart = getrusage();
@@ -80,11 +80,15 @@ define( 'MEDIAWIKI', true );
# Full path to working directory.
# Makes it possible to for example to have effective exclude path in apc.
-# Also doesn't break installations using symlinked includes, like
-# __DIR__ would do.
+# __DIR__ breaks symlinked includes, but realpath() returns false
+# if we don't have permissions on parent directories.
$IP = getenv( 'MW_INSTALL_PATH' );
if ( $IP === false ) {
- $IP = realpath( '.' );
+ if( realpath( '.' ) ) {
+ $IP = realpath( '.' );
+ } else {
+ $IP = dirname( __DIR__ );
+ }
}
if ( isset( $_SERVER['MW_COMPILED'] ) ) {
@@ -119,7 +123,7 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
MWFunction::call( MW_CONFIG_CALLBACK );
} else {
if ( !defined( 'MW_CONFIG_FILE' ) ) {
- define('MW_CONFIG_FILE', MWInit::interpretedPath( 'LocalSettings.php' ) );
+ define( 'MW_CONFIG_FILE', MWInit::interpretedPath( 'LocalSettings.php' ) );
}
# LocalSettings.php is the per site customization file. If it does not exist
@@ -156,4 +160,3 @@ wfProfileOut( 'WebStart.php-ob_start' );
if ( !defined( 'MW_NO_SETUP' ) ) {
require_once( MWInit::compiledPath( "includes/Setup.php" ) );
}
-
diff --git a/includes/Wiki.php b/includes/Wiki.php
index a4a89032..f8f699c9 100644
--- a/includes/Wiki.php
+++ b/includes/Wiki.php
@@ -126,7 +126,7 @@ class MediaWiki {
* @return Title
*/
public function getTitle() {
- if( $this->context->getTitle() === null ){
+ if( $this->context->getTitle() === null ) {
$this->context->setTitle( $this->parseTitle() );
}
return $this->context->getTitle();
@@ -169,6 +169,7 @@ class MediaWiki {
* - special pages
* - normal pages
*
+ * @throws MWException|PermissionsError|BadTitleError|HttpError
* @return void
*/
private function performRequest() {
@@ -177,7 +178,7 @@ class MediaWiki {
wfProfileIn( __METHOD__ );
$request = $this->context->getRequest();
- $title = $this->context->getTitle();
+ $requestTitle = $title = $this->context->getTitle();
$output = $this->context->getOutput();
$user = $this->context->getUser();
@@ -246,7 +247,7 @@ class MediaWiki {
// Redirect loops, no title in URL, $wgUsePathInfo URLs, and URLs with a variant
} elseif ( $request->getVal( 'action', 'view' ) == 'view' && !$request->wasPosted()
&& ( $request->getVal( 'title' ) === null ||
- $title->getPrefixedDBKey() != $request->getVal( 'title' ) )
+ $title->getPrefixedDBkey() != $request->getVal( 'title' ) )
&& !count( $request->getValueNames( array( 'action', 'title' ) ) )
&& wfRunHooks( 'TestCanonicalRedirect', array( $request, $title, $output ) ) )
{
@@ -301,7 +302,7 @@ class MediaWiki {
global $wgArticle;
$wgArticle = new DeprecatedGlobal( 'wgArticle', $article, '1.18' );
- $this->performAction( $article );
+ $this->performAction( $article, $requestTitle );
} elseif ( is_string( $article ) ) {
$output->redirect( $article );
} else {
@@ -330,8 +331,18 @@ class MediaWiki {
wfProfileIn( __METHOD__ );
$title = $this->context->getTitle();
- $article = Article::newFromTitle( $title, $this->context );
- $this->context->setWikiPage( $article->getPage() );
+ if ( $this->context->canUseWikiPage() ) {
+ // Try to use request context wiki page, as there
+ // is already data from db saved in per process
+ // cache there from this->getAction() call.
+ $page = $this->context->getWikiPage();
+ $article = Article::newFromWikiPage( $page, $this->context );
+ } else {
+ // This case should not happen, but just in case.
+ $article = Article::newFromTitle( $title, $this->context );
+ $this->context->setWikiPage( $article->getPage() );
+ }
+
// NS_MEDIAWIKI has no redirects.
// It is also used for CSS/JS, so performance matters here...
if ( $title->getNamespace() == NS_MEDIAWIKI ) {
@@ -345,10 +356,10 @@ class MediaWiki {
// Check for redirects ...
$action = $request->getVal( 'action', 'view' );
$file = ( $title->getNamespace() == NS_FILE ) ? $article->getFile() : null;
- if ( ( $action == 'view' || $action == 'render' ) // ... for actions that show content
- && !$request->getVal( 'oldid' ) && // ... and are not old revisions
- !$request->getVal( 'diff' ) && // ... and not when showing diff
- $request->getVal( 'redirect' ) != 'no' && // ... unless explicitly told not to
+ if ( ( $action == 'view' || $action == 'render' ) // ... for actions that show content
+ && !$request->getVal( 'oldid' ) && // ... and are not old revisions
+ !$request->getVal( 'diff' ) && // ... and not when showing diff
+ $request->getVal( 'redirect' ) != 'no' && // ... unless explicitly told not to
// ... and the article is not a non-redirect image page with associated file
!( is_object( $file ) && $file->exists() && !$file->getRedirected() ) )
{
@@ -395,8 +406,9 @@ class MediaWiki {
* Perform one of the "standard" actions
*
* @param $page Page
+ * @param $requestTitle The original title, before any redirects were applied
*/
- private function performAction( Page $page ) {
+ private function performAction( Page $page, Title $requestTitle ) {
global $wgUseSquid, $wgSquidMaxage;
wfProfileIn( __METHOD__ );
@@ -419,7 +431,7 @@ class MediaWiki {
if ( $action instanceof Action ) {
# Let Squid cache things if we can purge them.
if ( $wgUseSquid &&
- in_array( $request->getFullRequestURL(), $title->getSquidURLs() )
+ in_array( $request->getFullRequestURL(), $requestTitle->getSquidURLs() )
) {
$output->setSquidMaxage( $wgSquidMaxage );
}
@@ -490,6 +502,23 @@ class MediaWiki {
$request = $this->context->getRequest();
+ if ( $request->getCookie( 'forceHTTPS' )
+ && $request->detectProtocol() == 'http'
+ && $request->getMethod() == 'GET'
+ ) {
+ $redirUrl = $request->getFullRequestURL();
+ $redirUrl = str_replace( 'http://', 'https://', $redirUrl );
+
+ // Setup dummy Title, otherwise OutputPage::redirect will fail
+ $title = Title::newFromText( NS_MAIN, 'REDIR' );
+ $this->context->setTitle( $title );
+ $output = $this->context->getOutput();
+ $output->redirect( $redirUrl );
+ $output->output();
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
// Send Ajax requests to the Ajax dispatcher.
if ( $wgUseAjax && $request->getVal( 'action', 'view' ) == 'ajax' ) {
@@ -555,9 +584,6 @@ class MediaWiki {
// Execute a job from the queue
$this->doJobs();
- // Log message usage, if $wgAdaptiveMessageCache is set to true
- MessageCache::logMessages();
-
// Log profiling data, e.g. in the database or UDP
wfLogProfilingData();
@@ -578,28 +604,34 @@ class MediaWiki {
if ( $wgJobRunRate <= 0 || wfReadOnly() ) {
return;
}
+
if ( $wgJobRunRate < 1 ) {
$max = mt_getrandmax();
if ( mt_rand( 0, $max ) > $max * $wgJobRunRate ) {
- return;
+ return; // the higher $wgJobRunRate, the less likely we return here
}
$n = 1;
} else {
$n = intval( $wgJobRunRate );
}
- while ( $n-- && false != ( $job = Job::pop() ) ) {
- $output = $job->toString() . "\n";
- $t = - microtime( true );
- $success = $job->run();
- $t += microtime( true );
- $t = round( $t * 1000 );
- if ( !$success ) {
- $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
- } else {
- $output .= "Success, Time: $t ms\n";
+ $group = JobQueueGroup::singleton();
+ do {
+ $job = $group->pop( JobQueueGroup::USE_CACHE ); // job from any queue
+ if ( $job ) {
+ $output = $job->toString() . "\n";
+ $t = - microtime( true );
+ $success = $job->run();
+ $group->ack( $job ); // done
+ $t += microtime( true );
+ $t = round( $t * 1000 );
+ if ( !$success ) {
+ $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
+ } else {
+ $output .= "Success, Time: $t ms\n";
+ }
+ wfDebugLog( 'jobqueue', $output );
}
- wfDebugLog( 'jobqueue', $output );
- }
+ } while ( --$n && $job );
}
}
diff --git a/includes/WikiError.php b/includes/WikiError.php
index 45ee20c9..62781213 100644
--- a/includes/WikiError.php
+++ b/includes/WikiError.php
@@ -82,7 +82,7 @@ class WikiError {
*/
class WikiErrorMsg extends WikiError {
/**
- * @param $message String: wiki message name
+ * @param string $message wiki message name
* @param ... parameters to pass to wfMsg()
*
* @deprecated since 1.17
diff --git a/includes/WikiFilePage.php b/includes/WikiFilePage.php
index 9fb1522d..5e603d37 100644
--- a/includes/WikiFilePage.php
+++ b/includes/WikiFilePage.php
@@ -41,7 +41,9 @@ class WikiFilePage extends WikiPage {
}
public function getActionOverrides() {
- return array( 'revert' => 'RevertFileAction' );
+ $overrides = parent::getActionOverrides();
+ $overrides['revert'] = 'RevertFileAction';
+ return $overrides;
}
/**
@@ -103,13 +105,12 @@ class WikiFilePage extends WikiPage {
}
/**
- * @param bool $text
* @return bool
*/
- public function isRedirect( $text = false ) {
+ public function isRedirect() {
$this->loadFile();
if ( $this->mFile->isLocal() ) {
- return parent::isRedirect( $text );
+ return parent::isRedirect();
}
return (bool)$this->mFile->getRedirected();
diff --git a/includes/WikiMap.php b/includes/WikiMap.php
index 4a5e2bcf..b04a7842 100644
--- a/includes/WikiMap.php
+++ b/includes/WikiMap.php
@@ -28,7 +28,7 @@ class WikiMap {
/**
* Get a WikiReference object for $wikiID
*
- * @param $wikiID String: wiki'd id (generally database name)
+ * @param string $wikiID wiki'd id (generally database name)
* @return WikiReference object or null if the wiki was not found
*/
public static function getWiki( $wikiID ) {
@@ -53,7 +53,7 @@ class WikiMap {
* Convenience to get the wiki's display name
*
* @todo We can give more info than just the wiki id!
- * @param $wikiID String: wiki'd id (generally database name)
+ * @param string $wikiID wiki'd id (generally database name)
* @return string|int Wiki's name or $wiki_id if the wiki was not found
*/
public static function getWikiName( $wikiID ) {
@@ -68,9 +68,9 @@ class WikiMap {
/**
* Convenience to get a link to a user page on a foreign wiki
*
- * @param $wikiID String: wiki'd id (generally database name)
- * @param $user String: user name (must be normalised before calling this function!)
- * @param $text String: link's text; optional, default to "User:$user"
+ * @param string $wikiID wiki'd id (generally database name)
+ * @param string $user user name (must be normalised before calling this function!)
+ * @param string $text link's text; optional, default to "User:$user"
* @return String: HTML link or false if the wiki was not found
*/
public static function foreignUserLink( $wikiID, $user, $text=null ) {
@@ -80,9 +80,9 @@ class WikiMap {
/**
* Convenience to get a link to a page on a foreign wiki
*
- * @param $wikiID String: wiki'd id (generally database name)
- * @param $page String: page name (must be normalised before calling this function!)
- * @param $text String: link's text; optional, default to $page
+ * @param string $wikiID wiki'd id (generally database name)
+ * @param string $page page name (must be normalised before calling this function!)
+ * @param string $text link's text; optional, default to $page
* @return String: HTML link or false if the wiki was not found
*/
public static function makeForeignLink( $wikiID, $page, $text=null ) {
@@ -101,8 +101,8 @@ class WikiMap {
/**
* Convenience to get a url to a page on a foreign wiki
*
- * @param $wikiID String: wiki'd id (generally database name)
- * @param $page String: page name (must be normalised before calling this function!)
+ * @param string $wikiID wiki'd id (generally database name)
+ * @param string $page page name (must be normalised before calling this function!)
* @return String: URL or false if the wiki was not found
*/
public static function getForeignURL( $wikiID, $page ) {
@@ -176,7 +176,7 @@ class WikiReference {
* Helper function for getUrl()
*
* @todo FIXME: This may be generalized...
- * @param $page String: page name (must be normalised before calling this function!)
+ * @param string $page page name (must be normalised before calling this function!)
* @return String: Url fragment
*/
private function getLocalUrl( $page ) {
@@ -186,7 +186,7 @@ class WikiReference {
/**
* Get a canonical (i.e. based on $wgCanonicalServer) URL to a page on this foreign wiki
*
- * @param $page String: page name (must be normalised before calling this function!)
+ * @param string $page page name (must be normalised before calling this function!)
* @return String: Url
*/
public function getCanonicalUrl( $page ) {
@@ -214,7 +214,7 @@ class WikiReference {
* Get a URL based on $wgServer, like Title::getFullUrl() would produce
* when called locally on the wiki.
*
- * @param $page String: page name (must be normalized before calling this function!)
+ * @param string $page page name (must be normalized before calling this function!)
* @return String: URL
*/
public function getFullUrl( $page ) {
diff --git a/includes/WikiPage.php b/includes/WikiPage.php
index bc8766de..de881ef6 100644
--- a/includes/WikiPage.php
+++ b/includes/WikiPage.php
@@ -23,7 +23,7 @@
/**
* Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
*/
-abstract class Page {}
+interface Page {}
/**
* Class representing a MediaWiki article and history.
@@ -33,7 +33,7 @@ abstract class Page {}
*
* @internal documentation reviewed 15 Mar 2010
*/
-class WikiPage extends Page implements IDBAccessObject {
+class WikiPage implements Page, IDBAccessObject {
// Constants for $mDataLoadedFrom and related
/**
@@ -121,8 +121,8 @@ class WikiPage extends Page implements IDBAccessObject {
/**
* Constructor from a page id
*
- * @param $id Int article ID to load
- * @param $from string|int one of the following values:
+ * @param int $id article ID to load
+ * @param string|int $from one of the following values:
* - "fromdb" or WikiPage::READ_NORMAL to select from a slave database
* - "fromdbmaster" or WikiPage::READ_LATEST to select from the master database
*
@@ -144,7 +144,7 @@ class WikiPage extends Page implements IDBAccessObject {
* @since 1.20
* @param $row object: database row containing at least fields returned
* by selectFields().
- * @param $from string|int: source of $data:
+ * @param string|int $from source of $data:
* - "fromdb" or WikiPage::READ_NORMAL: from a slave DB
* - "fromdbmaster" or WikiPage::READ_LATEST: from the master DB
* - "forupdate" or WikiPage::READ_LOCKING: from the master DB using SELECT FOR UPDATE
@@ -187,7 +187,21 @@ class WikiPage extends Page implements IDBAccessObject {
* @return Array
*/
public function getActionOverrides() {
- return array();
+ $content_handler = $this->getContentHandler();
+ return $content_handler->getActionOverrides();
+ }
+
+ /**
+ * Returns the ContentHandler instance to be used to deal with the content of this WikiPage.
+ *
+ * Shorthand for ContentHandler::getForModelID( $this->getContentModel() );
+ *
+ * @return ContentHandler
+ *
+ * @since 1.21
+ */
+ public function getContentHandler() {
+ return ContentHandler::getForModelID( $this->getContentModel() );
}
/**
@@ -215,8 +229,8 @@ class WikiPage extends Page implements IDBAccessObject {
*/
protected function clearCacheFields() {
$this->mCounter = null;
- $this->mRedirectTarget = null; # Title object if set
- $this->mLastRevision = null; # Latest revision
+ $this->mRedirectTarget = null; // Title object if set
+ $this->mLastRevision = null; // Latest revision
$this->mTouched = '19700101000000';
$this->mTimestamp = '';
$this->mIsRedirect = false;
@@ -231,7 +245,9 @@ class WikiPage extends Page implements IDBAccessObject {
* @return array
*/
public static function selectFields() {
- return array(
+ global $wgContentHandlerUseDB;
+
+ $fields = array(
'page_id',
'page_namespace',
'page_title',
@@ -244,6 +260,12 @@ class WikiPage extends Page implements IDBAccessObject {
'page_latest',
'page_len',
);
+
+ if ( $wgContentHandlerUseDB ) {
+ $fields[] = 'page_content_model';
+ }
+
+ return $fields;
}
/**
@@ -317,8 +339,8 @@ class WikiPage extends Page implements IDBAccessObject {
$data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
} elseif ( $from === self::READ_NORMAL ) {
$data = $this->pageDataFromTitle( wfGetDB( DB_SLAVE ), $this->mTitle );
- # Use a "last rev inserted" timestamp key to dimish the issue of slave lag.
- # Note that DB also stores the master position in the session and checks it.
+ // Use a "last rev inserted" timestamp key to diminish the issue of slave lag.
+ // Note that DB also stores the master position in the session and checks it.
$touched = $this->getCachedLastEditTime();
if ( $touched ) { // key set
if ( !$data || $touched > wfTimestamp( TS_MW, $data->page_touched ) ) {
@@ -341,7 +363,7 @@ class WikiPage extends Page implements IDBAccessObject {
* @since 1.20
* @param $data object: database row containing at least fields returned
* by selectFields()
- * @param $from string|int One of the following:
+ * @param string|int $from One of the following:
* - "fromdb" or WikiPage::READ_NORMAL if the data comes from a slave DB
* - "fromdbmaster" or WikiPage::READ_LATEST if the data comes from the master DB
* - "forupdate" or WikiPage::READ_LOCKING if the data comes from from
@@ -349,13 +371,14 @@ class WikiPage extends Page implements IDBAccessObject {
*/
public function loadFromRow( $data, $from ) {
$lc = LinkCache::singleton();
+ $lc->clearLink( $this->mTitle );
if ( $data ) {
$lc->addGoodLinkObjFromRow( $this->mTitle, $data );
$this->mTitle->loadFromRow( $data );
- # Old-fashioned restrictions
+ // Old-fashioned restrictions
$this->mTitle->loadRestrictions( $data->page_restrictions );
$this->mCounter = intval( $data->page_counter );
@@ -418,21 +441,42 @@ class WikiPage extends Page implements IDBAccessObject {
}
/**
- * Tests if the article text represents a redirect
+ * Tests if the article content represents a redirect
*
- * @param $text mixed string containing article contents, or boolean
* @return bool
*/
- public function isRedirect( $text = false ) {
- if ( $text === false ) {
- if ( !$this->mDataLoaded ) {
- $this->loadPageData();
- }
+ public function isRedirect() {
+ $content = $this->getContent();
+ if ( !$content ) return false;
- return (bool)$this->mIsRedirect;
- } else {
- return Title::newFromRedirect( $text ) !== null;
+ return $content->isRedirect();
+ }
+
+ /**
+ * Returns the page's content model id (see the CONTENT_MODEL_XXX constants).
+ *
+ * Will use the revisions actual content model if the page exists,
+ * and the page's default if the page doesn't exist yet.
+ *
+ * @return String
+ *
+ * @since 1.21
+ */
+ public function getContentModel() {
+ if ( $this->exists() ) {
+ // look at the revision's actual content model
+ $rev = $this->getRevision();
+
+ if ( $rev !== null ) {
+ return $rev->getContentModel();
+ } else {
+ $title = $this->mTitle->getPrefixedDBkey();
+ wfWarn( "Page $title exists but has no (visible) revisions!" );
+ }
}
+
+ // use the default model for this page
+ return $this->mTitle->getContentModel();
}
/**
@@ -555,36 +599,61 @@ class WikiPage extends Page implements IDBAccessObject {
}
/**
- * Get the text of the current revision. No side-effects...
+ * Get the content of the current revision. No side-effects...
*
* @param $audience Integer: one of:
* Revision::FOR_PUBLIC to be displayed to all users
* Revision::FOR_THIS_USER to be displayed to $wgUser
* Revision::RAW get the text regardless of permissions
- * @return String|bool The text of the current revision. False on failure
+ * @param $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
+ * @return Content|null The content of the current revision
+ *
+ * @since 1.21
*/
- public function getText( $audience = Revision::FOR_PUBLIC ) {
+ public function getContent( $audience = Revision::FOR_PUBLIC, User $user = null ) {
$this->loadLastEdit();
if ( $this->mLastRevision ) {
- return $this->mLastRevision->getText( $audience );
+ return $this->mLastRevision->getContent( $audience, $user );
}
- return false;
+ return null;
}
/**
* Get the text of the current revision. No side-effects...
*
- * @return String|bool The text of the current revision. False on failure
+ * @param $audience Integer: one of:
+ * Revision::FOR_PUBLIC to be displayed to all users
+ * Revision::FOR_THIS_USER to be displayed to the given user
+ * Revision::RAW get the text regardless of permissions
+ * @param $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
+ * @return String|false The text of the current revision
+ * @deprecated as of 1.21, getContent() should be used instead.
*/
- public function getRawText() {
+ public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) { // @todo: deprecated, replace usage!
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
$this->loadLastEdit();
if ( $this->mLastRevision ) {
- return $this->mLastRevision->getRawText();
+ return $this->mLastRevision->getText( $audience, $user );
}
return false;
}
/**
+ * Get the text of the current revision. No side-effects...
+ *
+ * @return String|bool The text of the current revision. False on failure
+ * @deprecated as of 1.21, getContent() should be used instead.
+ */
+ public function getRawText() {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ return $this->getText( Revision::RAW );
+ }
+
+ /**
* @return string MW timestamp of last article revision
*/
public function getTimestamp() {
@@ -598,7 +667,7 @@ class WikiPage extends Page implements IDBAccessObject {
/**
* Set the page timestamp (use only to avoid DB queries)
- * @param $ts string MW timestamp of last article revision
+ * @param string $ts MW timestamp of last article revision
* @return void
*/
public function setTimestamp( $ts ) {
@@ -608,14 +677,16 @@ class WikiPage extends Page implements IDBAccessObject {
/**
* @param $audience Integer: one of:
* Revision::FOR_PUBLIC to be displayed to all users
- * Revision::FOR_THIS_USER to be displayed to $wgUser
+ * Revision::FOR_THIS_USER to be displayed to the given user
* Revision::RAW get the text regardless of permissions
+ * @param $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
* @return int user ID for the user that made the last article revision
*/
- public function getUser( $audience = Revision::FOR_PUBLIC ) {
+ public function getUser( $audience = Revision::FOR_PUBLIC, User $user = null ) {
$this->loadLastEdit();
if ( $this->mLastRevision ) {
- return $this->mLastRevision->getUser( $audience );
+ return $this->mLastRevision->getUser( $audience, $user );
} else {
return -1;
}
@@ -625,14 +696,16 @@ class WikiPage extends Page implements IDBAccessObject {
* Get the User object of the user who created the page
* @param $audience Integer: one of:
* Revision::FOR_PUBLIC to be displayed to all users
- * Revision::FOR_THIS_USER to be displayed to $wgUser
+ * Revision::FOR_THIS_USER to be displayed to the given user
* Revision::RAW get the text regardless of permissions
+ * @param $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
* @return User|null
*/
- public function getCreator( $audience = Revision::FOR_PUBLIC ) {
+ public function getCreator( $audience = Revision::FOR_PUBLIC, User $user = null ) {
$revision = $this->getOldestRevision();
if ( $revision ) {
- $userName = $revision->getUserText( $audience );
+ $userName = $revision->getUserText( $audience, $user );
return User::newFromName( $userName, false );
} else {
return null;
@@ -642,14 +715,16 @@ class WikiPage extends Page implements IDBAccessObject {
/**
* @param $audience Integer: one of:
* Revision::FOR_PUBLIC to be displayed to all users
- * Revision::FOR_THIS_USER to be displayed to $wgUser
+ * Revision::FOR_THIS_USER to be displayed to the given user
* Revision::RAW get the text regardless of permissions
+ * @param $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
* @return string username of the user that made the last article revision
*/
- public function getUserText( $audience = Revision::FOR_PUBLIC ) {
+ public function getUserText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
$this->loadLastEdit();
if ( $this->mLastRevision ) {
- return $this->mLastRevision->getUserText( $audience );
+ return $this->mLastRevision->getUserText( $audience, $user );
} else {
return '';
}
@@ -658,14 +733,16 @@ class WikiPage extends Page implements IDBAccessObject {
/**
* @param $audience Integer: one of:
* Revision::FOR_PUBLIC to be displayed to all users
- * Revision::FOR_THIS_USER to be displayed to $wgUser
+ * Revision::FOR_THIS_USER to be displayed to the given user
* Revision::RAW get the text regardless of permissions
+ * @param $user User object to check for, only if FOR_THIS_USER is passed
+ * to the $audience parameter
* @return string Comment stored for the last article revision
*/
- public function getComment( $audience = Revision::FOR_PUBLIC ) {
+ public function getComment( $audience = Revision::FOR_PUBLIC, User $user = null ) {
$this->loadLastEdit();
if ( $this->mLastRevision ) {
- return $this->mLastRevision->getComment( $audience );
+ return $this->mLastRevision->getComment( $audience, $user );
} else {
return '';
}
@@ -723,32 +800,34 @@ class WikiPage extends Page implements IDBAccessObject {
return false;
}
- $text = $editInfo ? $editInfo->pst : false;
+ if ( $editInfo ) {
+ $content = $editInfo->pstContent;
+ } else {
+ $content = $this->getContent();
+ }
- if ( $this->isRedirect( $text ) ) {
+ if ( !$content || $content->isRedirect() ) {
return false;
}
- switch ( $wgArticleCountMethod ) {
- case 'any':
- return true;
- case 'comma':
- if ( $text === false ) {
- $text = $this->getRawText();
- }
- return strpos( $text, ',' ) !== false;
- case 'link':
+ $hasLinks = null;
+
+ if ( $wgArticleCountMethod === 'link' ) {
+ // nasty special case to avoid re-parsing to detect links
+
if ( $editInfo ) {
// ParserOutput::getLinks() is a 2D array of page links, so
// to be really correct we would need to recurse in the array
// but the main array should only have items in it if there are
// links.
- return (bool)count( $editInfo->output->getLinks() );
+ $hasLinks = (bool)count( $editInfo->output->getLinks() );
} else {
- return (bool)wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
+ $hasLinks = (bool)wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
array( 'pl_from' => $this->getId() ), __METHOD__ );
}
}
+
+ return $content->isCountable( $hasLinks );
}
/**
@@ -767,7 +846,7 @@ class WikiPage extends Page implements IDBAccessObject {
return $this->mRedirectTarget;
}
- # Query the redirect table
+ // Query the redirect table
$dbr = wfGetDB( DB_SLAVE );
$row = $dbr->selectRow( 'redirect',
array( 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ),
@@ -782,7 +861,7 @@ class WikiPage extends Page implements IDBAccessObject {
$row->rd_fragment, $row->rd_interwiki );
}
- # This page doesn't have an entry in the redirect table
+ // This page doesn't have an entry in the redirect table
return $this->mRedirectTarget = $this->insertRedirect();
}
@@ -794,7 +873,8 @@ class WikiPage extends Page implements IDBAccessObject {
*/
public function insertRedirect() {
// recurse through to only get the final target
- $retval = Title::newFromRedirectRecurse( $this->getRawText() );
+ $content = $this->getContent();
+ $retval = $content ? $content->getUltimateRedirectTarget() : null;
if ( !$retval ) {
return null;
}
@@ -879,7 +959,7 @@ class WikiPage extends Page implements IDBAccessObject {
* @return UserArrayFromResult
*/
public function getContributors() {
- # @todo FIXME: This is expensive; cache this info somewhere.
+ // @todo FIXME: This is expensive; cache this info somewhere.
$dbr = wfGetDB( DB_SLAVE );
@@ -927,7 +1007,7 @@ class WikiPage extends Page implements IDBAccessObject {
/**
* Get the last N authors
* @param $num Integer: number of revisions to get
- * @param $revLatest String: the latest rev_id, selected from the master (optional)
+ * @param string $revLatest the latest rev_id, selected from the master (optional)
* @return array Array of authors, duplicates not removed
*/
public function getLastNAuthors( $num, $revLatest = 0 ) {
@@ -990,7 +1070,7 @@ class WikiPage extends Page implements IDBAccessObject {
&& $parserOptions->getStubThreshold() == 0
&& $this->mTitle->exists()
&& ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
- && $this->mTitle->isWikitextPage();
+ && $this->getContentHandler()->isParserCacheSupported();
}
/**
@@ -1001,6 +1081,7 @@ class WikiPage extends Page implements IDBAccessObject {
* @param $parserOptions ParserOptions to use for the parse operation
* @param $oldid Revision ID to get the text from, passing null or 0 will
* get the current revision (default value)
+ *
* @return ParserOutput or false if the revision was not found
*/
public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
@@ -1042,13 +1123,13 @@ class WikiPage extends Page implements IDBAccessObject {
return;
}
- # Don't update page view counters on views from bot users (bug 14044)
+ // Don't update page view counters on views from bot users (bug 14044)
if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->mTitle->exists() ) {
DeferredUpdates::addUpdate( new ViewCountUpdate( $this->getId() ) );
DeferredUpdates::addUpdate( new SiteStatsUpdate( 1, 0, 0 ) );
}
- # Update newtalk / watchlist notification status
+ // Update newtalk / watchlist notification status
$user->clearNotification( $this->mTitle );
}
@@ -1059,7 +1140,7 @@ class WikiPage extends Page implements IDBAccessObject {
public function doPurge() {
global $wgUseSquid;
- if( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ){
+ if( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
return false;
}
@@ -1078,8 +1159,16 @@ class WikiPage extends Page implements IDBAccessObject {
}
if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
+ // @todo: move this logic to MessageCache
+
if ( $this->mTitle->exists() ) {
- $text = $this->getRawText();
+ // NOTE: use transclusion text for messages.
+ // This is consistent with MessageCache::getMsgFromNamespace()
+
+ $content = $this->getContent();
+ $text = $content === null ? null : $content->getWikitextForTransclusion();
+
+ if ( $text === null ) $text = false;
} else {
$text = false;
}
@@ -1109,12 +1198,12 @@ class WikiPage extends Page implements IDBAccessObject {
'page_title' => $this->mTitle->getDBkey(),
'page_counter' => 0,
'page_restrictions' => '',
- 'page_is_redirect' => 0, # Will set this shortly...
+ 'page_is_redirect' => 0, // Will set this shortly...
'page_is_new' => 1,
'page_random' => wfRandom(),
'page_touched' => $dbw->timestamp(),
- 'page_latest' => 0, # Fill this in shortly...
- 'page_len' => 0, # Fill this in shortly...
+ 'page_latest' => 0, // Fill this in shortly...
+ 'page_len' => 0, // Fill this in shortly...
), __METHOD__, 'IGNORE' );
$affected = $dbw->affectedRows();
@@ -1144,28 +1233,36 @@ class WikiPage extends Page implements IDBAccessObject {
* @private
*/
public function updateRevisionOn( $dbw, $revision, $lastRevision = null, $lastRevIsRedirect = null ) {
+ global $wgContentHandlerUseDB;
+
wfProfileIn( __METHOD__ );
- $text = $revision->getText();
- $len = strlen( $text );
- $rt = Title::newFromRedirectRecurse( $text );
+ $content = $revision->getContent();
+ $len = $content ? $content->getSize() : 0;
+ $rt = $content ? $content->getUltimateRedirectTarget() : null;
$conditions = array( 'page_id' => $this->getId() );
if ( !is_null( $lastRevision ) ) {
- # An extra check against threads stepping on each other
+ // An extra check against threads stepping on each other
$conditions['page_latest'] = $lastRevision;
}
$now = wfTimestampNow();
+ $row = array( /* SET */
+ 'page_latest' => $revision->getId(),
+ 'page_touched' => $dbw->timestamp( $now ),
+ 'page_is_new' => ( $lastRevision === 0 ) ? 1 : 0,
+ 'page_is_redirect' => $rt !== null ? 1 : 0,
+ 'page_len' => $len,
+ );
+
+ if ( $wgContentHandlerUseDB ) {
+ $row[ 'page_content_model' ] = $revision->getContentModel();
+ }
+
$dbw->update( 'page',
- array( /* SET */
- 'page_latest' => $revision->getId(),
- 'page_touched' => $dbw->timestamp( $now ),
- 'page_is_new' => ( $lastRevision === 0 ) ? 1 : 0,
- 'page_is_redirect' => $rt !== null ? 1 : 0,
- 'page_len' => $len,
- ),
+ $row,
$conditions,
__METHOD__ );
@@ -1176,8 +1273,9 @@ class WikiPage extends Page implements IDBAccessObject {
$this->setCachedLastEditTime( $now );
$this->mLatest = $revision->getId();
$this->mIsRedirect = (bool)$rt;
- # Update the LinkCache.
- LinkCache::singleton()->addGoodLinkObj( $this->getId(), $this->mTitle, $len, $this->mIsRedirect, $this->mLatest );
+ // Update the LinkCache.
+ LinkCache::singleton()->addGoodLinkObj( $this->getId(), $this->mTitle, $len, $this->mIsRedirect,
+ $this->mLatest, $revision->getContentModel() );
}
wfProfileOut( __METHOD__ );
@@ -1249,7 +1347,7 @@ class WikiPage extends Page implements IDBAccessObject {
$prev = $row->rev_id;
$lastRevIsRedirect = (bool)$row->page_is_redirect;
} else {
- # No or missing previous revision; mark the page as new
+ // No or missing previous revision; mark the page as new
$prev = 0;
$lastRevIsRedirect = null;
}
@@ -1261,56 +1359,119 @@ class WikiPage extends Page implements IDBAccessObject {
}
/**
+ * Get the content that needs to be saved in order to undo all revisions
+ * between $undo and $undoafter. Revisions must belong to the same page,
+ * must exist and must not be deleted
+ * @param $undo Revision
+ * @param $undoafter Revision Must be an earlier revision than $undo
+ * @return mixed string on success, false on failure
+ * @since 1.21
+ * Before we had the Content object, this was done in getUndoText
+ */
+ public function getUndoContent( Revision $undo, Revision $undoafter = null ) {
+ $handler = $undo->getContentHandler();
+ return $handler->getUndoContent( $this->getRevision(), $undo, $undoafter );
+ }
+
+ /**
* Get the text that needs to be saved in order to undo all revisions
* between $undo and $undoafter. Revisions must belong to the same page,
* must exist and must not be deleted
* @param $undo Revision
* @param $undoafter Revision Must be an earlier revision than $undo
* @return mixed string on success, false on failure
+ * @deprecated since 1.21: use ContentHandler::getUndoContent() instead.
*/
public function getUndoText( Revision $undo, Revision $undoafter = null ) {
- $cur_text = $this->getRawText();
- if ( $cur_text === false ) {
- return false; // no page
- }
- $undo_text = $undo->getText();
- $undoafter_text = $undoafter->getText();
+ ContentHandler::deprecated( __METHOD__, '1.21' );
- if ( $cur_text == $undo_text ) {
- # No use doing a merge if it's just a straight revert.
- return $undoafter_text;
- }
+ $this->loadLastEdit();
- $undone_text = '';
+ if ( $this->mLastRevision ) {
+ if ( is_null( $undoafter ) ) {
+ $undoafter = $undo->getPrevious();
+ }
- if ( !wfMerge( $undo_text, $undoafter_text, $cur_text, $undone_text ) ) {
- return false;
+ $handler = $this->getContentHandler();
+ $undone = $handler->getUndoContent( $this->mLastRevision, $undo, $undoafter );
+
+ if ( !$undone ) {
+ return false;
+ } else {
+ return ContentHandler::getContentText( $undone );
+ }
}
- return $undone_text;
+ return false;
}
/**
* @param $section null|bool|int or a section number (0, 1, 2, T1, T2...)
- * @param $text String: new text of the section
- * @param $sectionTitle String: new section's subject, only if $section is 'new'
- * @param $edittime String: revision timestamp or null to use the current revision
- * @return string Complete article text, or null if error
+ * @param string $text new text of the section
+ * @param string $sectionTitle new section's subject, only if $section is 'new'
+ * @param string $edittime revision timestamp or null to use the current revision
+ * @throws MWException
+ * @return String new complete article text, or null if error
+ *
+ * @deprecated since 1.21, use replaceSectionContent() instead
*/
public function replaceSection( $section, $text, $sectionTitle = '', $edittime = null ) {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ if ( strval( $section ) == '' ) { //NOTE: keep condition in sync with condition in replaceSectionContent!
+ // Whole-page edit; let the whole text through
+ return $text;
+ }
+
+ if ( !$this->supportsSections() ) {
+ throw new MWException( "sections not supported for content model " . $this->getContentHandler()->getModelID() );
+ }
+
+ // could even make section title, but that's not required.
+ $sectionContent = ContentHandler::makeContent( $text, $this->getTitle() );
+
+ $newContent = $this->replaceSectionContent( $section, $sectionContent, $sectionTitle, $edittime );
+
+ return ContentHandler::getContentText( $newContent );
+ }
+
+ /**
+ * Returns true iff this page's content model supports sections.
+ *
+ * @return boolean whether sections are supported.
+ *
+ * @todo: the skin should check this and not offer section functionality if sections are not supported.
+ * @todo: the EditPage should check this and not offer section functionality if sections are not supported.
+ */
+ public function supportsSections() {
+ return $this->getContentHandler()->supportsSections();
+ }
+
+ /**
+ * @param $section null|bool|int or a section number (0, 1, 2, T1, T2...)
+ * @param $sectionContent Content: new content of the section
+ * @param string $sectionTitle new section's subject, only if $section is 'new'
+ * @param string $edittime revision timestamp or null to use the current revision
+ *
+ * @throws MWException
+ * @return Content new complete article content, or null if error
+ *
+ * @since 1.21
+ */
+ public function replaceSectionContent( $section, Content $sectionContent, $sectionTitle = '', $edittime = null ) {
wfProfileIn( __METHOD__ );
if ( strval( $section ) == '' ) {
// Whole-page edit; let the whole text through
+ $newContent = $sectionContent;
} else {
+ if ( !$this->supportsSections() ) {
+ throw new MWException( "sections not supported for content model " . $this->getContentHandler()->getModelID() );
+ }
+
// Bug 30711: always use current version when adding a new section
if ( is_null( $edittime ) || $section == 'new' ) {
- $oldtext = $this->getRawText();
- if ( $oldtext === false ) {
- wfDebug( __METHOD__ . ": no page text\n" );
- wfProfileOut( __METHOD__ );
- return null;
- }
+ $oldContent = $this->getContent();
} else {
$dbw = wfGetDB( DB_MASTER );
$rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
@@ -1322,28 +1483,21 @@ class WikiPage extends Page implements IDBAccessObject {
return null;
}
- $oldtext = $rev->getText();
+ $oldContent = $rev->getContent();
}
- if ( $section == 'new' ) {
- # Inserting a new section
- $subject = $sectionTitle ? wfMessage( 'newsectionheaderdefaultlevel' )
- ->rawParams( $sectionTitle )->inContentLanguage()->text() . "\n\n" : '';
- if ( wfRunHooks( 'PlaceNewSection', array( $this, $oldtext, $subject, &$text ) ) ) {
- $text = strlen( trim( $oldtext ) ) > 0
- ? "{$oldtext}\n\n{$subject}{$text}"
- : "{$subject}{$text}";
- }
- } else {
- # Replacing an existing section; roll out the big guns
- global $wgParser;
-
- $text = $wgParser->replaceSection( $oldtext, $section, $text );
+ if ( ! $oldContent ) {
+ wfDebug( __METHOD__ . ": no page text\n" );
+ wfProfileOut( __METHOD__ );
+ return null;
}
+
+ // FIXME: $oldContent might be null?
+ $newContent = $oldContent->replaceSection( $section, $sectionContent, $sectionTitle );
}
wfProfileOut( __METHOD__ );
- return $text;
+ return $newContent;
}
/**
@@ -1367,8 +1521,8 @@ class WikiPage extends Page implements IDBAccessObject {
* Change an existing article or create a new article. Updates RC and all necessary caches,
* optionally via the deferred update array.
*
- * @param $text String: new text
- * @param $summary String: edit summary
+ * @param string $text new text
+ * @param string $summary edit summary
* @param $flags Integer bitfield:
* EDIT_NEW
* Article is known or assumed to be non-existent, create a new one
@@ -1409,17 +1563,83 @@ class WikiPage extends Page implements IDBAccessObject {
* revision: The revision object for the inserted revision, or null
*
* Compatibility note: this function previously returned a boolean value indicating success/failure
+ *
+ * @deprecated since 1.21: use doEditContent() instead.
*/
public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+
+ $content = ContentHandler::makeContent( $text, $this->getTitle() );
+
+ return $this->doEditContent( $content, $summary, $flags, $baseRevId, $user );
+ }
+
+ /**
+ * Change an existing article or create a new article. Updates RC and all necessary caches,
+ * optionally via the deferred update array.
+ *
+ * @param $content Content: new content
+ * @param string $summary edit summary
+ * @param $flags Integer bitfield:
+ * EDIT_NEW
+ * Article is known or assumed to be non-existent, create a new one
+ * EDIT_UPDATE
+ * Article is known or assumed to be pre-existing, update it
+ * EDIT_MINOR
+ * Mark this edit minor, if the user is allowed to do so
+ * EDIT_SUPPRESS_RC
+ * Do not log the change in recentchanges
+ * EDIT_FORCE_BOT
+ * Mark the edit a "bot" edit regardless of user rights
+ * EDIT_DEFER_UPDATES
+ * Defer some of the updates until the end of index.php
+ * EDIT_AUTOSUMMARY
+ * Fill in blank summaries with generated text where possible
+ *
+ * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the article will be detected.
+ * If EDIT_UPDATE is specified and the article doesn't exist, the function will return an
+ * edit-gone-missing error. If EDIT_NEW is specified and the article does exist, an
+ * edit-already-exists error will be returned. These two conditions are also possible with
+ * auto-detection due to MediaWiki's performance-optimised locking strategy.
+ *
+ * @param bool|\the $baseRevId the revision ID this edit was based off, if any
+ * @param $user User the user doing the edit
+ * @param $serialisation_format String: format for storing the content in the database
+ *
+ * @throws MWException
+ * @return Status object. Possible errors:
+ * edit-hook-aborted: The ArticleSave hook aborted the edit but didn't set the fatal flag of $status
+ * edit-gone-missing: In update mode, but the article didn't exist
+ * edit-conflict: In update mode, the article changed unexpectedly
+ * edit-no-change: Warning that the text was the same as before
+ * edit-already-exists: In creation mode, but the article already exists
+ *
+ * Extensions may define additional errors.
+ *
+ * $return->value will contain an associative array with members as follows:
+ * new: Boolean indicating if the function attempted to create a new article
+ * revision: The revision object for the inserted revision, or null
+ *
+ * @since 1.21
+ */
+ public function doEditContent( Content $content, $summary, $flags = 0, $baseRevId = false,
+ User $user = null, $serialisation_format = null ) {
global $wgUser, $wgUseAutomaticEditSummaries, $wgUseRCPatrol, $wgUseNPPatrol;
- # Low-level sanity check
+ // Low-level sanity check
if ( $this->mTitle->getText() === '' ) {
throw new MWException( 'Something is trying to edit an article with an empty title' );
}
wfProfileIn( __METHOD__ );
+ if ( !$content->getContentHandler()->canBeUsedOn( $this->getTitle() ) ) {
+ wfProfileOut( __METHOD__ );
+ return Status::newFatal( 'content-not-allowed-here',
+ ContentHandler::getLocalizedName( $content->getModel() ),
+ $this->getTitle()->getPrefixedText() );
+ }
+
$user = is_null( $user ) ? $wgUser : $user;
$status = Status::newGood( array() );
@@ -1430,10 +1650,14 @@ class WikiPage extends Page implements IDBAccessObject {
$flags = $this->checkFlags( $flags );
- if ( !wfRunHooks( 'ArticleSave', array( &$this, &$user, &$text, &$summary,
- $flags & EDIT_MINOR, null, null, &$flags, &$status ) ) )
- {
- wfDebug( __METHOD__ . ": ArticleSave hook aborted save!\n" );
+ // handle hook
+ $hook_args = array( &$this, &$user, &$content, &$summary,
+ $flags & EDIT_MINOR, null, null, &$flags, &$status );
+
+ if ( !wfRunHooks( 'PageContentSave', $hook_args )
+ || !ContentHandler::runLegacyHooks( 'ArticleSave', $hook_args ) ) {
+
+ wfDebug( __METHOD__ . ": ArticleSave or ArticleSaveContent hook aborted save!\n" );
if ( $status->isOK() ) {
$status->fatal( 'edit-hook-aborted' );
@@ -1443,77 +1667,98 @@ class WikiPage extends Page implements IDBAccessObject {
return $status;
}
- # Silently ignore EDIT_MINOR if not allowed
+ // Silently ignore EDIT_MINOR if not allowed
$isminor = ( $flags & EDIT_MINOR ) && $user->isAllowed( 'minoredit' );
$bot = $flags & EDIT_FORCE_BOT;
- $oldtext = $this->getRawText(); // current revision
- $oldsize = strlen( $oldtext );
+ $old_content = $this->getContent( Revision::RAW ); // current revision's content
+
+ $oldsize = $old_content ? $old_content->getSize() : 0;
$oldid = $this->getLatest();
$oldIsRedirect = $this->isRedirect();
$oldcountable = $this->isCountable();
- # Provide autosummaries if one is not provided and autosummaries are enabled.
+ $handler = $content->getContentHandler();
+
+ // Provide autosummaries if one is not provided and autosummaries are enabled.
if ( $wgUseAutomaticEditSummaries && $flags & EDIT_AUTOSUMMARY && $summary == '' ) {
- $summary = self::getAutosummary( $oldtext, $text, $flags );
+ if ( !$old_content ) $old_content = null;
+ $summary = $handler->getAutosummary( $old_content, $content, $flags );
}
- $editInfo = $this->prepareTextForEdit( $text, null, $user );
- $text = $editInfo->pst;
- $newsize = strlen( $text );
+ $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
+ $serialized = $editInfo->pst;
+ $content = $editInfo->pstContent;
+ $newsize = $content->getSize();
$dbw = wfGetDB( DB_MASTER );
$now = wfTimestampNow();
$this->mTimestamp = $now;
if ( $flags & EDIT_UPDATE ) {
- # Update article, but only if changed.
+ // Update article, but only if changed.
$status->value['new'] = false;
if ( !$oldid ) {
- # Article gone missing
+ // Article gone missing
wfDebug( __METHOD__ . ": EDIT_UPDATE specified but article doesn't exist\n" );
$status->fatal( 'edit-gone-missing' );
wfProfileOut( __METHOD__ );
return $status;
- } elseif ( $oldtext === false ) {
- # Sanity check for bug 37225
+ } elseif ( !$old_content ) {
+ // Sanity check for bug 37225
wfProfileOut( __METHOD__ );
throw new MWException( "Could not find text for current revision {$oldid}." );
}
$revision = new Revision( array(
'page' => $this->getId(),
+ 'title' => $this->getTitle(), // for determining the default content model
'comment' => $summary,
'minor_edit' => $isminor,
- 'text' => $text,
+ 'text' => $serialized,
+ 'len' => $newsize,
'parent_id' => $oldid,
'user' => $user->getId(),
'user_text' => $user->getName(),
- 'timestamp' => $now
- ) );
- # Bug 37225: use accessor to get the text as Revision may trim it.
- # After trimming, the text may be a duplicate of the current text.
- $text = $revision->getText(); // sanity; EditPage should trim already
+ 'timestamp' => $now,
+ 'content_model' => $content->getModel(),
+ 'content_format' => $serialisation_format,
+ ) ); // XXX: pass content object?!
- $changed = ( strcmp( $text, $oldtext ) != 0 );
+ $changed = !$content->equals( $old_content );
if ( $changed ) {
+ if ( !$content->isValid() ) {
+ throw new MWException( "New content failed validity check!" );
+ }
+
$dbw->begin( __METHOD__ );
+
+ $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
+ $status->merge( $prepStatus );
+
+ if ( !$status->isOK() ) {
+ $dbw->rollback( __METHOD__ );
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
$revisionId = $revision->insertOn( $dbw );
- # Update page
- #
- # Note that we use $this->mLatest instead of fetching a value from the master DB
- # during the course of this function. This makes sure that EditPage can detect
- # edit conflicts reliably, either by $ok here, or by $article->getTimestamp()
- # before this function is called. A previous function used a separate query, this
- # creates a window where concurrent edits can cause an ignored edit conflict.
+ // Update page
+ //
+ // Note that we use $this->mLatest instead of fetching a value from the master DB
+ // during the course of this function. This makes sure that EditPage can detect
+ // edit conflicts reliably, either by $ok here, or by $article->getTimestamp()
+ // before this function is called. A previous function used a separate query, this
+ // creates a window where concurrent edits can cause an ignored edit conflict.
$ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
if ( !$ok ) {
- # Belated edit conflict! Run away!!
+ // Belated edit conflict! Run away!!
$status->fatal( 'edit-conflict' );
$dbw->rollback( __METHOD__ );
@@ -1523,18 +1768,18 @@ class WikiPage extends Page implements IDBAccessObject {
}
wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
- # Update recentchanges
+ // Update recentchanges
if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
- # Mark as patrolled if the user can do so
+ // Mark as patrolled if the user can do so
$patrolled = $wgUseRCPatrol && !count(
$this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
- # Add RC row to the DB
+ // Add RC row to the DB
$rc = RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $user, $summary,
$oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
$revisionId, $patrolled
);
- # Log auto-patrolled edits
+ // Log auto-patrolled edits
if ( $patrolled ) {
PatrolLog::record( $rc, true, $user );
}
@@ -1547,9 +1792,15 @@ class WikiPage extends Page implements IDBAccessObject {
$revision->setId( $this->getLatest() );
}
- # Update links tables, site stats, etc.
- $this->doEditUpdates( $revision, $user, array( 'changed' => $changed,
- 'oldcountable' => $oldcountable ) );
+ // Update links tables, site stats, etc.
+ $this->doEditUpdates(
+ $revision,
+ $user,
+ array(
+ 'changed' => $changed,
+ 'oldcountable' => $oldcountable
+ )
+ );
if ( !$changed ) {
$status->warning( 'edit-no-change' );
@@ -1559,13 +1810,25 @@ class WikiPage extends Page implements IDBAccessObject {
$this->mTitle->invalidateCache();
}
} else {
- # Create new article
+ // Create new article
$status->value['new'] = true;
$dbw->begin( __METHOD__ );
- # Add the page record; stake our claim on this title!
- # This will return false if the article already exists
+ $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
+ $status->merge( $prepStatus );
+
+ if ( !$status->isOK() ) {
+ $dbw->rollback( __METHOD__ );
+
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ $status->merge( $prepStatus );
+
+ // Add the page record; stake our claim on this title!
+ // This will return false if the article already exists
$newid = $this->insertOn( $dbw );
if ( $newid === false ) {
@@ -1576,36 +1839,44 @@ class WikiPage extends Page implements IDBAccessObject {
return $status;
}
- # Save the revision text...
+ // Save the revision text...
$revision = new Revision( array(
'page' => $newid,
+ 'title' => $this->getTitle(), // for determining the default content model
'comment' => $summary,
'minor_edit' => $isminor,
- 'text' => $text,
+ 'text' => $serialized,
+ 'len' => $newsize,
'user' => $user->getId(),
'user_text' => $user->getName(),
- 'timestamp' => $now
+ 'timestamp' => $now,
+ 'content_model' => $content->getModel(),
+ 'content_format' => $serialisation_format,
) );
$revisionId = $revision->insertOn( $dbw );
- # Bug 37225: use accessor to get the text as Revision may trim it
- $text = $revision->getText(); // sanity; EditPage should trim already
+ // Bug 37225: use accessor to get the text as Revision may trim it
+ $content = $revision->getContent(); // sanity; get normalized version
- # Update the page record with revision data
+ if ( $content ) {
+ $newsize = $content->getSize();
+ }
+
+ // Update the page record with revision data
$this->updateRevisionOn( $dbw, $revision, 0 );
wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
- # Update recentchanges
+ // Update recentchanges
if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
- # Mark as patrolled if the user can do so
+ // Mark as patrolled if the user can do so
$patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && !count(
$this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
- # Add RC row to the DB
+ // Add RC row to the DB
$rc = RecentChange::notifyNew( $now, $this->mTitle, $isminor, $user, $summary, $bot,
- '', strlen( $text ), $revisionId, $patrolled );
+ '', $newsize, $revisionId, $patrolled );
- # Log auto-patrolled edits
+ // Log auto-patrolled edits
if ( $patrolled ) {
PatrolLog::record( $rc, true, $user );
}
@@ -1613,14 +1884,17 @@ class WikiPage extends Page implements IDBAccessObject {
$user->incEditCount();
$dbw->commit( __METHOD__ );
- # Update links, etc.
+ // Update links, etc.
$this->doEditUpdates( $revision, $user, array( 'created' => true ) );
- wfRunHooks( 'ArticleInsertComplete', array( &$this, &$user, $text, $summary,
- $flags & EDIT_MINOR, null, null, &$flags, $revision ) );
+ $hook_args = array( &$this, &$user, $content, $summary,
+ $flags & EDIT_MINOR, null, null, &$flags, $revision );
+
+ ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $hook_args );
+ wfRunHooks( 'PageContentInsertComplete', $hook_args );
}
- # Do updates right now unless deferral was requested
+ // Do updates right now unless deferral was requested
if ( !( $flags & EDIT_DEFER_UPDATES ) ) {
DeferredUpdates::doUpdates();
}
@@ -1628,10 +1902,13 @@ class WikiPage extends Page implements IDBAccessObject {
// Return the new revision (or null) to the caller
$status->value['revision'] = $revision;
- wfRunHooks( 'ArticleSaveComplete', array( &$this, &$user, $text, $summary,
- $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $baseRevId ) );
+ $hook_args = array( &$this, &$user, $content, $summary,
+ $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $baseRevId );
- # Promote user to any groups they meet the criteria for
+ ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $hook_args );
+ wfRunHooks( 'PageContentSaveComplete', $hook_args );
+
+ // Promote user to any groups they meet the criteria for
$user->addAutopromoteOnceGroups( 'onEdit' );
wfProfileOut( __METHOD__ );
@@ -1641,6 +1918,8 @@ class WikiPage extends Page implements IDBAccessObject {
/**
* Get parser options suitable for rendering the primary article wikitext
*
+ * @see ContentHandler::makeParserOptions
+ *
* @param IContextSource|User|string $context One of the following:
* - IContextSource: Use the User and the Language of the provided
* context
@@ -1651,38 +1930,52 @@ class WikiPage extends Page implements IDBAccessObject {
* @return ParserOptions
*/
public function makeParserOptions( $context ) {
- global $wgContLang;
-
- if ( $context instanceof IContextSource ) {
- $options = ParserOptions::newFromContext( $context );
- } elseif ( $context instanceof User ) { // settings per user (even anons)
- $options = ParserOptions::newFromUser( $context );
- } else { // canonical settings
- $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
- }
+ $options = $this->getContentHandler()->makeParserOptions( $context );
if ( $this->getTitle()->isConversionTable() ) {
+ //@todo: ConversionTable should become a separate content model, so we don't need special cases like this one.
$options->disableContentConversion();
}
- $options->enableLimitReport(); // show inclusion/loop reports
- $options->setTidy( true ); // fix bad HTML
-
return $options;
}
/**
* Prepare text which is about to be saved.
* Returns a stdclass with source, pst and output members
- * @return bool|object
+ *
+ * @deprecated in 1.21: use prepareContentForEdit instead.
*/
public function prepareTextForEdit( $text, $revid = null, User $user = null ) {
- global $wgParser, $wgContLang, $wgUser;
+ ContentHandler::deprecated( __METHOD__, '1.21' );
+ $content = ContentHandler::makeContent( $text, $this->getTitle() );
+ return $this->prepareContentForEdit( $content, $revid, $user );
+ }
+
+ /**
+ * Prepare content which is about to be saved.
+ * Returns a stdclass with source, pst and output members
+ *
+ * @param \Content $content
+ * @param null $revid
+ * @param null|\User $user
+ * @param null $serialization_format
+ *
+ * @return bool|object
+ *
+ * @since 1.21
+ */
+ public function prepareContentForEdit( Content $content, $revid = null, User $user = null, $serialization_format = null ) {
+ global $wgContLang, $wgUser;
$user = is_null( $user ) ? $wgUser : $user;
- // @TODO fixme: check $user->getId() here???
+ //XXX: check $user->getId() here???
+
if ( $this->mPreparedEdit
- && $this->mPreparedEdit->newText == $text
+ && $this->mPreparedEdit->newContent
+ && $this->mPreparedEdit->newContent->equals( $content )
&& $this->mPreparedEdit->revid == $revid
+ && $this->mPreparedEdit->format == $serialization_format
+ // XXX: also check $user here?
) {
// Already prepared
return $this->mPreparedEdit;
@@ -1693,14 +1986,22 @@ class WikiPage extends Page implements IDBAccessObject {
$edit = (object)array();
$edit->revid = $revid;
- $edit->newText = $text;
- $edit->pst = $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
+
+ $edit->pstContent = $content ? $content->preSaveTransform( $this->mTitle, $user, $popts ) : null;
+
+ $edit->format = $serialization_format;
$edit->popts = $this->makeParserOptions( 'canonical' );
- $edit->output = $wgParser->parse( $edit->pst, $this->mTitle, $edit->popts, true, true, $revid );
- $edit->oldText = $this->getRawText();
+ $edit->output = $edit->pstContent ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts ) : null;
- $this->mPreparedEdit = $edit;
+ $edit->newContent = $content;
+ $edit->oldContent = $this->getContent( Revision::RAW );
+ // NOTE: B/C for hooks! don't use these fields!
+ $edit->newText = $edit->newContent ? ContentHandler::getContentText( $edit->newContent ) : '';
+ $edit->oldText = $edit->oldContent ? ContentHandler::getContentText( $edit->oldContent ) : '';
+ $edit->pst = $edit->pstContent ? $edit->pstContent->serialize( $serialization_format ) : '';
+
+ $this->mPreparedEdit = $edit;
return $edit;
}
@@ -1710,10 +2011,9 @@ class WikiPage extends Page implements IDBAccessObject {
* Purges pages that include this page if the text was changed here.
* Every 100th edit, prune the recent changes table.
*
- * @private
* @param $revision Revision object
* @param $user User object that did the revision
- * @param $options Array of options, following indexes are used:
+ * @param array $options of options, following indexes are used:
* - changed: boolean, whether the revision changed the content (default true)
* - created: boolean, whether the revision created the page (default false)
* - oldcountable: boolean or null (default null):
@@ -1727,27 +2027,29 @@ class WikiPage extends Page implements IDBAccessObject {
wfProfileIn( __METHOD__ );
$options += array( 'changed' => true, 'created' => false, 'oldcountable' => null );
- $text = $revision->getText();
+ $content = $revision->getContent();
- # Parse the text
- # Be careful not to double-PST: $text is usually already PST-ed once
+ // Parse the text
+ // Be careful not to double-PST: $text is usually already PST-ed once
if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
- $editInfo = $this->prepareTextForEdit( $text, $revision->getId(), $user );
+ $editInfo = $this->prepareContentForEdit( $content, $revision->getId(), $user );
} else {
wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" );
$editInfo = $this->mPreparedEdit;
}
- # Save it to the parser cache
+ // Save it to the parser cache
if ( $wgEnableParserCache ) {
$parserCache = ParserCache::singleton();
$parserCache->save( $editInfo->output, $this, $editInfo->popts );
}
- # Update the links tables and other secondary data
- $updates = $editInfo->output->getSecondaryDataUpdates( $this->mTitle );
- DataUpdate::runUpdates( $updates );
+ // Update the links tables and other secondary data
+ if ( $content ) {
+ $updates = $content->getSecondaryDataUpdates( $this->getTitle(), null, true, $editInfo->output );
+ DataUpdate::runUpdates( $updates );
+ }
wfRunHooks( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
@@ -1761,7 +2063,7 @@ class WikiPage extends Page implements IDBAccessObject {
$cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
$dbw->delete(
'recentchanges',
- array( "rc_timestamp < '$cutoff'" ),
+ array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ),
__METHOD__
);
}
@@ -1791,11 +2093,12 @@ class WikiPage extends Page implements IDBAccessObject {
}
DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, $good, $total ) );
- DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $text ) );
+ DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content->getTextForSearchIndex() ) );
+ // @TODO: let the search engine decide what to do with the content object
- # If this is another user's talk page, update newtalk.
- # Don't do this if $options['changed'] = false (null-edits) nor if
- # it's a minor edit and the user doesn't want notifications for those.
+ // If this is another user's talk page, update newtalk.
+ // Don't do this if $options['changed'] = false (null-edits) nor if
+ // it's a minor edit and the user doesn't want notifications for those.
if ( $options['changed']
&& $this->mTitle->getNamespace() == NS_USER_TALK
&& $shortTitle != $user->getTitleKey()
@@ -1817,7 +2120,11 @@ class WikiPage extends Page implements IDBAccessObject {
}
if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
- MessageCache::singleton()->replace( $shortTitle, $text );
+ // XXX: could skip pseudo-messages like js/css here, based on content model.
+ $msgtext = $content ? $content->getWikitextForTransclusion() : null;
+ if ( $msgtext === false || $msgtext === null ) $msgtext = '';
+
+ MessageCache::singleton()->replace( $shortTitle, $msgtext );
}
if( $options['created'] ) {
@@ -1834,21 +2141,45 @@ class WikiPage extends Page implements IDBAccessObject {
* The article must already exist; link tables etc
* are not updated, caches are not flushed.
*
- * @param $text String: text submitted
+ * @param string $text text submitted
* @param $user User The relevant user
- * @param $comment String: comment submitted
+ * @param string $comment comment submitted
* @param $minor Boolean: whereas it's a minor modification
+ *
+ * @deprecated since 1.21, use doEditContent() instead.
*/
public function doQuickEdit( $text, User $user, $comment = '', $minor = 0 ) {
+ ContentHandler::deprecated( __METHOD__, "1.21" );
+
+ $content = ContentHandler::makeContent( $text, $this->getTitle() );
+ return $this->doQuickEditContent( $content, $user, $comment, $minor );
+ }
+
+ /**
+ * Edit an article without doing all that other stuff
+ * The article must already exist; link tables etc
+ * are not updated, caches are not flushed.
+ *
+ * @param $content Content: content submitted
+ * @param $user User The relevant user
+ * @param string $comment comment submitted
+ * @param $serialisation_format String: format for storing the content in the database
+ * @param $minor Boolean: whereas it's a minor modification
+ */
+ public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = 0, $serialisation_format = null ) {
wfProfileIn( __METHOD__ );
+ $serialized = $content->serialize( $serialisation_format );
+
$dbw = wfGetDB( DB_MASTER );
$revision = new Revision( array(
+ 'title' => $this->getTitle(), // for determining the default content model
'page' => $this->getId(),
- 'text' => $text,
+ 'text' => $serialized,
+ 'length' => $content->getSize(),
'comment' => $comment,
'minor_edit' => $minor ? 1 : 0,
- ) );
+ ) ); // XXX: set the content object?
$revision->insertOn( $dbw );
$this->updateRevisionOn( $dbw, $revision );
@@ -1861,10 +2192,10 @@ class WikiPage extends Page implements IDBAccessObject {
* Update the article's restriction field, and leave a log entry.
* This works for protection both existing and non-existing pages.
*
- * @param $limit Array: set of restriction keys
+ * @param array $limit set of restriction keys
* @param $reason String
* @param &$cascade Integer. Set to false if cascading protection isn't allowed.
- * @param $expiry Array: per restriction type expiration
+ * @param array $expiry per restriction type expiration
* @param $user User The user updating the restrictions
* @return Status
*/
@@ -1886,8 +2217,8 @@ class WikiPage extends Page implements IDBAccessObject {
// Take this opportunity to purge out expired restrictions
Title::purgeExpiredRestrictions();
- # @todo FIXME: Same limitations as described in ProtectionForm.php (line 37);
- # we expect a single selection, but the schema allows otherwise.
+ // @todo FIXME: Same limitations as described in ProtectionForm.php (line 37);
+ // we expect a single selection, but the schema allows otherwise.
$isProtected = false;
$protect = false;
$changed = false;
@@ -1904,7 +2235,7 @@ class WikiPage extends Page implements IDBAccessObject {
$protect = true;
}
- # Get current restrictions on $action
+ // Get current restrictions on $action
$current = implode( '', $this->mTitle->getRestrictions( $action ) );
if ( $current != '' ) {
$isProtected = true;
@@ -1913,9 +2244,9 @@ class WikiPage extends Page implements IDBAccessObject {
if ( $limit[$action] != $current ) {
$changed = true;
} elseif ( $limit[$action] != '' ) {
- # Only check expiry change if the action is actually being
- # protected, since expiry does nothing on an not-protected
- # action.
+ // Only check expiry change if the action is actually being
+ // protected, since expiry does nothing on an not-protected
+ // action.
if ( $this->mTitle->getRestrictionExpiry( $action ) != $expiry[$action] ) {
$changed = true;
}
@@ -1926,12 +2257,12 @@ class WikiPage extends Page implements IDBAccessObject {
$changed = true;
}
- # If nothing's changed, do nothing
+ // If nothing has changed, do nothing
if ( !$changed ) {
return Status::newGood();
}
- if ( !$protect ) { # No protection at all means unprotection
+ if ( !$protect ) { // No protection at all means unprotection
$revCommentMsg = 'unprotectedarticle';
$logAction = 'unprotect';
} elseif ( $isProtected ) {
@@ -1944,42 +2275,64 @@ class WikiPage extends Page implements IDBAccessObject {
$encodedExpiry = array();
$protectDescription = '';
+ # Some bots may parse IRC lines, which are generated from log entries which contain plain
+ # protect description text. Keep them in old format to avoid breaking compatibility.
+ # TODO: Fix protection log to store structured description and format it on-the-fly.
+ $protectDescriptionLog = '';
foreach ( $limit as $action => $restrictions ) {
$encodedExpiry[$action] = $dbw->encodeExpiry( $expiry[$action] );
if ( $restrictions != '' ) {
- $protectDescription .= $wgContLang->getDirMark() . "[$action=$restrictions] (";
+ $protectDescriptionLog .= $wgContLang->getDirMark() . "[$action=$restrictions] (";
+ # $action is one of $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' ).
+ # All possible message keys are listed here for easier grepping:
+ # * restriction-create
+ # * restriction-edit
+ # * restriction-move
+ # * restriction-upload
+ $actionText = wfMessage( 'restriction-' . $action )->inContentLanguage()->text();
+ # $restrictions is one of $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ),
+ # with '' filtered out. All possible message keys are listed below:
+ # * protect-level-autoconfirmed
+ # * protect-level-sysop
+ $restrictionsText = wfMessage( 'protect-level-' . $restrictions )->inContentLanguage()->text();
if ( $encodedExpiry[$action] != 'infinity' ) {
- $protectDescription .= wfMessage(
+ $expiryText = wfMessage(
'protect-expiring',
- $wgContLang->timeanddate( $expiry[$action], false, false ) ,
- $wgContLang->date( $expiry[$action], false, false ) ,
+ $wgContLang->timeanddate( $expiry[$action], false, false ),
+ $wgContLang->date( $expiry[$action], false, false ),
$wgContLang->time( $expiry[$action], false, false )
)->inContentLanguage()->text();
} else {
- $protectDescription .= wfMessage( 'protect-expiry-indefinite' )
+ $expiryText = wfMessage( 'protect-expiry-indefinite' )
->inContentLanguage()->text();
}
- $protectDescription .= ') ';
+ if ( $protectDescription !== '' ) {
+ $protectDescription .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+ }
+ $protectDescription .= wfMessage( 'protect-summary-desc' )
+ ->params( $actionText, $restrictionsText, $expiryText )
+ ->inContentLanguage()->text();
+ $protectDescriptionLog .= $expiryText . ') ';
}
}
- $protectDescription = trim( $protectDescription );
+ $protectDescriptionLog = trim( $protectDescriptionLog );
- if ( $id ) { # Protection of existing page
+ if ( $id ) { // Protection of existing page
if ( !wfRunHooks( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
return Status::newGood();
}
- # Only restrictions with the 'protect' right can cascade...
- # Otherwise, people who cannot normally protect can "protect" pages via transclusion
+ // Only restrictions with the 'protect' right can cascade...
+ // Otherwise, people who cannot normally protect can "protect" pages via transclusion
$editrestriction = isset( $limit['edit'] ) ? array( $limit['edit'] ) : $this->mTitle->getRestrictions( 'edit' );
- # The schema allows multiple restrictions
+ // The schema allows multiple restrictions
if ( !in_array( 'protect', $editrestriction ) && !in_array( 'sysop', $editrestriction ) ) {
$cascade = false;
}
- # Update restrictions table
+ // Update restrictions table
foreach ( $limit as $action => $restrictions ) {
if ( $restrictions != '' ) {
$dbw->replace( 'page_restrictions', array( array( 'pr_page', 'pr_type' ) ),
@@ -1997,7 +2350,7 @@ class WikiPage extends Page implements IDBAccessObject {
}
}
- # Prepare a null revision to be added to the history
+ // Prepare a null revision to be added to the history
$editComment = $wgContLang->ucfirst(
wfMessage(
$revCommentMsg,
@@ -2005,23 +2358,25 @@ class WikiPage extends Page implements IDBAccessObject {
)->inContentLanguage()->text()
);
if ( $reason ) {
- $editComment .= ": $reason";
+ $editComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
}
if ( $protectDescription ) {
- $editComment .= " ($protectDescription)";
+ $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+ $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )->inContentLanguage()->text();
}
if ( $cascade ) {
- // FIXME: Should use 'brackets' message.
- $editComment .= ' [' . wfMessage( 'protect-summary-cascade' )
- ->inContentLanguage()->text() . ']';
+ $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+ $editComment .= wfMessage( 'brackets' )->params(
+ wfMessage( 'protect-summary-cascade' )->inContentLanguage()->text()
+ )->inContentLanguage()->text();
}
- # Insert a null revision
+ // Insert a null revision
$nullRevision = Revision::newNullRevision( $dbw, $id, $editComment, true );
$nullRevId = $nullRevision->insertOn( $dbw );
$latest = $this->getLatest();
- # Update page record
+ // Update page record
$dbw->update( 'page',
array( /* SET */
'page_touched' => $dbw->timestamp(),
@@ -2034,8 +2389,8 @@ class WikiPage extends Page implements IDBAccessObject {
wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $nullRevision, $latest, $user ) );
wfRunHooks( 'ArticleProtectComplete', array( &$this, &$user, $limit, $reason ) );
- } else { # Protection of non-existing page (also known as "title protection")
- # Cascade protection is meaningless in this case
+ } else { // Protection of non-existing page (also known as "title protection")
+ // Cascade protection is meaningless in this case
$cascade = false;
if ( $limit['create'] != '' ) {
@@ -2066,10 +2421,10 @@ class WikiPage extends Page implements IDBAccessObject {
if ( $logAction == 'unprotect' ) {
$logParams = array();
} else {
- $logParams = array( $protectDescription, $cascade ? 'cascade' : '' );
+ $logParams = array( $protectDescriptionLog, $cascade ? 'cascade' : '' );
}
- # Update the protection log
+ // Update the protection log
$log = new LogPage( 'protect' );
$log->addEntry( $logAction, $this->mTitle, trim( $reason ), $logParams, $user );
@@ -2107,10 +2462,10 @@ class WikiPage extends Page implements IDBAccessObject {
*
* Deletes the article with database consistency, writes logs, purges caches
*
- * @param $reason string delete reason for deletion log
+ * @param string $reason delete reason for deletion log
* @param $suppress boolean suppress all revisions and log the deletion in
* the suppression log instead of the deletion log
- * @param $id int article ID
+ * @param int $id article ID
* @param $commit boolean defaults to true, triggers transaction end
* @param &$error Array of errors to append to
* @param $user User The deleting user
@@ -2129,9 +2484,10 @@ class WikiPage extends Page implements IDBAccessObject {
*
* @since 1.19
*
- * @param $reason string delete reason for deletion log
+ * @param string $reason delete reason for deletion log
* @param $suppress boolean suppress all revisions and log the deletion in
* the suppression log instead of the deletion log
+ * @param int $id article ID
* @param $commit boolean defaults to true, triggers transaction end
* @param &$error Array of errors to append to
* @param $user User The deleting user
@@ -2142,7 +2498,7 @@ class WikiPage extends Page implements IDBAccessObject {
public function doDeleteArticleReal(
$reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
) {
- global $wgUser;
+ global $wgUser, $wgContentHandlerUseDB;
wfDebug( __METHOD__ . "\n" );
@@ -2183,6 +2539,9 @@ class WikiPage extends Page implements IDBAccessObject {
$bitfield = 'rev_deleted';
}
+ // we need to remember the old content so we can use it to generate all deletion updates.
+ $content = $this->getContent( Revision::RAW );
+
$dbw = wfGetDB( DB_MASTER );
$dbw->begin( __METHOD__ );
// For now, shunt the revision data into the archive table.
@@ -2195,31 +2554,40 @@ class WikiPage extends Page implements IDBAccessObject {
//
// In the future, we may keep revisions and mark them with
// the rev_deleted field, which is reserved for this purpose.
+
+ $row = array(
+ 'ar_namespace' => 'page_namespace',
+ 'ar_title' => 'page_title',
+ '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_parent_id' => 'rev_parent_id',
+ 'ar_text_id' => 'rev_text_id',
+ 'ar_text' => '\'\'', // Be explicit to appease
+ 'ar_flags' => '\'\'', // MySQL's "strict mode"...
+ 'ar_len' => 'rev_len',
+ 'ar_page_id' => 'page_id',
+ 'ar_deleted' => $bitfield,
+ 'ar_sha1' => 'rev_sha1',
+ );
+
+ if ( $wgContentHandlerUseDB ) {
+ $row[ 'ar_content_model' ] = 'rev_content_model';
+ $row[ 'ar_content_format' ] = 'rev_content_format';
+ }
+
$dbw->insertSelect( 'archive', array( 'page', 'revision' ),
+ $row,
array(
- 'ar_namespace' => 'page_namespace',
- 'ar_title' => 'page_title',
- '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_parent_id' => 'rev_parent_id',
- 'ar_text_id' => 'rev_text_id',
- 'ar_text' => '\'\'', // Be explicit to appease
- 'ar_flags' => '\'\'', // MySQL's "strict mode"...
- 'ar_len' => 'rev_len',
- 'ar_page_id' => 'page_id',
- 'ar_deleted' => $bitfield,
- 'ar_sha1' => 'rev_sha1'
- ), array(
'page_id' => $id,
'page_id = rev_page'
), __METHOD__
);
- # Now that it's safely backed up, delete it
+ // Now that it's safely backed up, delete it
$dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
$ok = ( $dbw->affectedRows() > 0 ); // getArticleID() uses slave, could be laggy
@@ -2229,9 +2597,9 @@ class WikiPage extends Page implements IDBAccessObject {
return $status;
}
- $this->doDeleteUpdates( $id );
+ $this->doDeleteUpdates( $id, $content );
- # Log the deletion, if the page was suppressed, log it at Oversight instead
+ // Log the deletion, if the page was suppressed, log it at Oversight instead
$logtype = $suppress ? 'suppress' : 'delete';
$logEntry = new ManualLogEntry( $logtype, 'delete' );
@@ -2245,7 +2613,7 @@ class WikiPage extends Page implements IDBAccessObject {
$dbw->commit( __METHOD__ );
}
- wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id ) );
+ wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id, $content, $logEntry ) );
$status->value = $logid;
return $status;
}
@@ -2253,36 +2621,28 @@ class WikiPage extends Page implements IDBAccessObject {
/**
* Do some database updates after deletion
*
- * @param $id Int: page_id value of the page being deleted (B/C, currently unused)
+ * @param int $id page_id value of the page being deleted (B/C, currently unused)
+ * @param $content Content: optional page content to be used when determining the required updates.
+ * This may be needed because $this->getContent() may already return null when the page proper was deleted.
*/
- public function doDeleteUpdates( $id ) {
- # update site status
+ public function doDeleteUpdates( $id, Content $content = null ) {
+ // update site status
DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, - (int)$this->isCountable(), -1 ) );
- # remove secondary indexes, etc
- $updates = $this->getDeletionUpdates( );
+ // remove secondary indexes, etc
+ $updates = $this->getDeletionUpdates( $content );
DataUpdate::runUpdates( $updates );
- # Clear caches
+ // Clear caches
WikiPage::onArticleDelete( $this->mTitle );
- # Reset this object
+ // Reset this object
$this->clear();
- # Clear the cached article id so the interface doesn't act like we exist
+ // Clear the cached article id so the interface doesn't act like we exist
$this->mTitle->resetArticleID( 0 );
}
- public function getDeletionUpdates() {
- $updates = array(
- new LinksDeletionUpdate( $this ),
- );
-
- //@todo: make a hook to add update objects
- //NOTE: deletion updates will be determined by the ContentHandler in the future
- return $updates;
- }
-
/**
* Roll back the most recent consecutive set of edits to a page
* from the same user; fails if there are no eligible edits to
@@ -2290,14 +2650,14 @@ class WikiPage extends Page implements IDBAccessObject {
* performs permissions checks on $user, then calls commitRollback()
* to do the dirty work
*
- * @todo: seperate the business/permission stuff out from backend code
+ * @todo: separate the business/permission stuff out from backend code
*
- * @param $fromP String: Name of the user whose edits to rollback.
- * @param $summary String: Custom summary. Set to default summary if empty.
- * @param $token String: Rollback token.
+ * @param string $fromP Name of the user whose edits to rollback.
+ * @param string $summary Custom summary. Set to default summary if empty.
+ * @param string $token Rollback token.
* @param $bot Boolean: If true, mark all reverted edits as bot.
*
- * @param $resultDetails Array: contains result-specific array of additional values
+ * @param array $resultDetails contains result-specific array of additional values
* 'alreadyrolled' : 'current' (rev)
* success : 'summary' (str), 'current' (rev), 'target' (rev)
*
@@ -2312,7 +2672,7 @@ class WikiPage extends Page implements IDBAccessObject {
) {
$resultDetails = null;
- # Check permissions
+ // Check permissions
$editErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $user );
$rollbackErrors = $this->mTitle->getUserPermissionsErrors( 'rollback', $user );
$errors = array_merge( $editErrors, wfArrayDiff2( $rollbackErrors, $editErrors ) );
@@ -2325,7 +2685,7 @@ class WikiPage extends Page implements IDBAccessObject {
$errors[] = array( 'actionthrottledtext' );
}
- # If there were errors, bail out now
+ // If there were errors, bail out now
if ( !empty( $errors ) ) {
return $errors;
}
@@ -2341,11 +2701,11 @@ class WikiPage extends Page implements IDBAccessObject {
* rollback to the DB. Therefore, you should only call this function direct-
* ly if you want to use custom permissions checks. If you don't, use
* doRollback() instead.
- * @param $fromP String: Name of the user whose edits to rollback.
- * @param $summary String: Custom summary. Set to default summary if empty.
+ * @param string $fromP Name of the user whose edits to rollback.
+ * @param string $summary Custom summary. Set to default summary if empty.
* @param $bot Boolean: If true, mark all reverted edits as bot.
*
- * @param $resultDetails Array: contains result-specific array of additional values
+ * @param array $resultDetails contains result-specific array of additional values
* @param $guser User The user performing the rollback
* @return array
*/
@@ -2358,16 +2718,16 @@ class WikiPage extends Page implements IDBAccessObject {
return array( array( 'readonlytext' ) );
}
- # Get the last editor
+ // Get the last editor
$current = $this->getRevision();
if ( is_null( $current ) ) {
- # Something wrong... no page?
+ // Something wrong... no page?
return array( array( 'notanarticle' ) );
}
$from = str_replace( '_', ' ', $fromP );
- # User name given should match up with the top revision.
- # If the user was deleted then $from should be empty.
+ // User name given should match up with the top revision.
+ // If the user was deleted then $from should be empty.
if ( $from != $current->getUserText() ) {
$resultDetails = array( 'current' => $current );
return array( array( 'alreadyrolled',
@@ -2377,8 +2737,8 @@ class WikiPage extends Page implements IDBAccessObject {
) );
}
- # Get the last edit not by this guy...
- # Note: these may not be public values
+ // Get the last edit not by this guy...
+ // Note: these may not be public values
$user = intval( $current->getRawUser() );
$user_text = $dbw->addQuotes( $current->getRawUserText() );
$s = $dbw->selectRow( 'revision',
@@ -2390,21 +2750,21 @@ class WikiPage extends Page implements IDBAccessObject {
'ORDER BY' => 'rev_timestamp DESC' )
);
if ( $s === false ) {
- # No one else ever edited this page
+ // No one else ever edited this page
return array( array( 'cantrollback' ) );
} elseif ( $s->rev_deleted & Revision::DELETED_TEXT || $s->rev_deleted & Revision::DELETED_USER ) {
- # Only admins can see this text
+ // Only admins can see this text
return array( array( 'notvisiblerev' ) );
}
$set = array();
if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
- # Mark all reverted edits as bot
+ // Mark all reverted edits as bot
$set['rc_bot'] = 1;
}
if ( $wgUseRCPatrol ) {
- # Mark all reverted edits as patrolled
+ // Mark all reverted edits as patrolled
$set['rc_patrolled'] = 1;
}
@@ -2418,7 +2778,7 @@ class WikiPage extends Page implements IDBAccessObject {
);
}
- # Generate the edit summary if necessary
+ // Generate the edit summary if necessary
$target = Revision::newFromId( $s->rev_id );
if ( empty( $summary ) ) {
if ( $from == '' ) { // no public user name
@@ -2428,7 +2788,7 @@ class WikiPage extends Page implements IDBAccessObject {
}
}
- # Allow the custom summary to use the same args as the default message
+ // Allow the custom summary to use the same args as the default message
$args = array(
$target->getUserText(), $from, $s->rev_id,
$wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
@@ -2440,10 +2800,13 @@ class WikiPage extends Page implements IDBAccessObject {
$summary = wfMsgReplaceArgs( $summary, $args );
}
- # Truncate for whole multibyte characters.
+ // Trim spaces on user supplied text
+ $summary = trim( $summary );
+
+ // Truncate for whole multibyte characters.
$summary = $wgContLang->truncate( $summary, 255 );
- # Save
+ // Save
$flags = EDIT_UPDATE;
if ( $guser->isAllowed( 'minoredit' ) ) {
@@ -2454,8 +2817,13 @@ class WikiPage extends Page implements IDBAccessObject {
$flags |= EDIT_FORCE_BOT;
}
- # Actually store the edit
- $status = $this->doEdit( $target->getText(), $summary, $flags, $target->getId(), $guser );
+ // Actually store the edit
+ $status = $this->doEditContent( $target->getContent(), $summary, $flags, $target->getId(), $guser );
+
+ if ( !$status->isOK() ) {
+ return $status->getErrorsArray();
+ }
+
if ( !empty( $status->value['revision'] ) ) {
$revId = $status->value['revision']->getId();
} else {
@@ -2486,7 +2854,7 @@ class WikiPage extends Page implements IDBAccessObject {
* @param $title Title object
*/
public static function onArticleCreate( $title ) {
- # Update existence markers on article/talk tabs...
+ // Update existence markers on article/talk tabs...
if ( $title->isTalkPage() ) {
$other = $title->getSubjectPage();
} else {
@@ -2507,7 +2875,7 @@ class WikiPage extends Page implements IDBAccessObject {
* @param $title Title
*/
public static function onArticleDelete( $title ) {
- # Update existence markers on article/talk tabs...
+ // Update existence markers on article/talk tabs...
if ( $title->isTalkPage() ) {
$other = $title->getSubjectPage();
} else {
@@ -2520,21 +2888,21 @@ class WikiPage extends Page implements IDBAccessObject {
$title->touchLinks();
$title->purgeSquid();
- # File cache
+ // File cache
HTMLFileCache::clearFileCache( $title );
- # Messages
+ // Messages
if ( $title->getNamespace() == NS_MEDIAWIKI ) {
MessageCache::singleton()->replace( $title->getDBkey(), false );
}
- # Images
+ // Images
if ( $title->getNamespace() == NS_FILE ) {
$update = new HTMLCacheUpdate( $title, 'imagelinks' );
$update->doUpdate();
}
- # User talk pages
+ // User talk pages
if ( $title->getNamespace() == NS_USER_TALK ) {
$user = User::newFromName( $title->getText(), false );
if ( $user ) {
@@ -2542,7 +2910,7 @@ class WikiPage extends Page implements IDBAccessObject {
}
}
- # Image redirects
+ // Image redirects
RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $title );
}
@@ -2556,14 +2924,13 @@ class WikiPage extends Page implements IDBAccessObject {
// Invalidate caches of articles which include this page
DeferredUpdates::addHTMLCacheUpdate( $title, 'templatelinks' );
-
// Invalidate the caches of all pages which redirect here
DeferredUpdates::addHTMLCacheUpdate( $title, 'redirect' );
- # Purge squid for this page only
+ // Purge squid for this page only
$title->purgeSquid();
- # Clear file cache for this page only
+ // Clear file cache for this page only
HTMLFileCache::clearFileCache( $title );
}
@@ -2600,61 +2967,24 @@ class WikiPage extends Page implements IDBAccessObject {
}
/**
- * Return an applicable autosummary if one exists for the given edit.
- * @param $oldtext String: the previous text of the page.
- * @param $newtext String: The submitted text of the page.
- * @param $flags Int bitmask: a bitmask of flags submitted for the edit.
- * @return string An appropriate autosummary, or an empty string.
- */
+ * Return an applicable autosummary if one exists for the given edit.
+ * @param string|null $oldtext the previous text of the page.
+ * @param string|null $newtext The submitted text of the page.
+ * @param int $flags bitmask: a bitmask of flags submitted for the edit.
+ * @return string An appropriate autosummary, or an empty string.
+ *
+ * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
+ */
public static function getAutosummary( $oldtext, $newtext, $flags ) {
- global $wgContLang;
-
- # Decide what kind of autosummary is needed.
-
- # Redirect autosummaries
- $ot = Title::newFromRedirect( $oldtext );
- $rt = Title::newFromRedirect( $newtext );
-
- if ( is_object( $rt ) && ( !is_object( $ot ) || !$rt->equals( $ot ) || $ot->getFragment() != $rt->getFragment() ) ) {
- $truncatedtext = $wgContLang->truncate(
- str_replace( "\n", ' ', $newtext ),
- max( 0, 255
- - strlen( wfMessage( 'autoredircomment' )->inContentLanguage()->text() )
- - strlen( $rt->getFullText() )
- ) );
- return wfMessage( 'autoredircomment', $rt->getFullText() )
- ->rawParams( $truncatedtext )->inContentLanguage()->text();
- }
-
- # New page autosummaries
- if ( $flags & EDIT_NEW && strlen( $newtext ) ) {
- # If they're making a new article, give its text, truncated, in the summary.
-
- $truncatedtext = $wgContLang->truncate(
- str_replace( "\n", ' ', $newtext ),
- max( 0, 200 - strlen( wfMessage( 'autosumm-new' )->inContentLanguage()->text() ) ) );
-
- return wfMessage( 'autosumm-new' )->rawParams( $truncatedtext )
- ->inContentLanguage()->text();
- }
+ // NOTE: stub for backwards-compatibility. assumes the given text is wikitext. will break horribly if it isn't.
- # Blanking autosummaries
- if ( $oldtext != '' && $newtext == '' ) {
- return wfMessage( 'autosumm-blank' )->inContentLanguage()->text();
- } elseif ( strlen( $oldtext ) > 10 * strlen( $newtext ) && strlen( $newtext ) < 500 ) {
- # Removing more than 90% of the article
+ ContentHandler::deprecated( __METHOD__, '1.21' );
- $truncatedtext = $wgContLang->truncate(
- $newtext,
- max( 0, 200 - strlen( wfMessage( 'autosumm-replace' )->inContentLanguage()->text() ) ) );
+ $handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
+ $oldContent = is_null( $oldtext ) ? null : $handler->unserializeContent( $oldtext );
+ $newContent = is_null( $newtext ) ? null : $handler->unserializeContent( $newtext );
- return wfMessage( 'autosumm-replace' )->rawParams( $truncatedtext )
- ->inContentLanguage()->text();
- }
-
- # If we reach this point, there's no applicable autosummary for our case, so our
- # autosummary is empty.
- return '';
+ return $handler->getAutosummary( $oldContent, $newContent, $flags );
}
/**
@@ -2665,117 +2995,29 @@ class WikiPage extends Page implements IDBAccessObject {
* if no revision occurred
*/
public function getAutoDeleteReason( &$hasHistory ) {
- global $wgContLang;
-
- // Get the last revision
- $rev = $this->getRevision();
-
- if ( is_null( $rev ) ) {
- return false;
- }
-
- // Get the article's contents
- $contents = $rev->getText();
- $blank = false;
-
- // If the page is blank, use the text from the previous revision,
- // which can only be blank if there's a move/import/protect dummy revision involved
- if ( $contents == '' ) {
- $prev = $rev->getPrevious();
-
- if ( $prev ) {
- $contents = $prev->getText();
- $blank = true;
- }
- }
-
- $dbw = wfGetDB( DB_MASTER );
-
- // Find out if there was only one contributor
- // Only scan the last 20 revisions
- $res = $dbw->select( 'revision', 'rev_user_text',
- array( 'rev_page' => $this->getID(), $dbw->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0' ),
- __METHOD__,
- array( 'LIMIT' => 20 )
- );
-
- if ( $res === false ) {
- // This page has no revisions, which is very weird
- return false;
- }
-
- $hasHistory = ( $res->numRows() > 1 );
- $row = $dbw->fetchObject( $res );
-
- if ( $row ) { // $row is false if the only contributor is hidden
- $onlyAuthor = $row->rev_user_text;
- // Try to find a second contributor
- foreach ( $res as $row ) {
- if ( $row->rev_user_text != $onlyAuthor ) { // Bug 22999
- $onlyAuthor = false;
- break;
- }
- }
- } else {
- $onlyAuthor = false;
- }
-
- // Generate the summary with a '$1' placeholder
- if ( $blank ) {
- // The current revision is blank and the one before is also
- // blank. It's just not our lucky day
- $reason = wfMessage( 'exbeforeblank', '$1' )->inContentLanguage()->text();
- } else {
- if ( $onlyAuthor ) {
- $reason = wfMessage(
- 'excontentauthor',
- '$1',
- $onlyAuthor
- )->inContentLanguage()->text();
- } else {
- $reason = wfMessage( 'excontent', '$1' )->inContentLanguage()->text();
- }
- }
-
- if ( $reason == '-' ) {
- // Allow these UI messages to be blanked out cleanly
- return '';
- }
-
- // Replace newlines with spaces to prevent uglyness
- $contents = preg_replace( "/[\n\r]/", ' ', $contents );
- // Calculate the maximum amount of chars to get
- // Max content length = max comment length - length of the comment (excl. $1)
- $maxLength = 255 - ( strlen( $reason ) - 2 );
- $contents = $wgContLang->truncate( $contents, $maxLength );
- // Remove possible unfinished links
- $contents = preg_replace( '/\[\[([^\]]*)\]?$/', '$1', $contents );
- // Now replace the '$1' placeholder
- $reason = str_replace( '$1', $contents, $reason );
-
- return $reason;
+ return $this->getContentHandler()->getAutoDeleteReason( $this->getTitle(), $hasHistory );
}
/**
* Update all the appropriate counts in the category table, given that
* we've added the categories $added and deleted the categories $deleted.
*
- * @param $added array The names of categories that were added
- * @param $deleted array The names of categories that were deleted
+ * @param array $added The names of categories that were added
+ * @param array $deleted The names of categories that were deleted
*/
public function updateCategoryCounts( $added, $deleted ) {
$ns = $this->mTitle->getNamespace();
$dbw = wfGetDB( DB_MASTER );
- # First make sure the rows exist. If one of the "deleted" ones didn't
- # exist, we might legitimately not create it, but it's simpler to just
- # create it and then give it a negative value, since the value is bogus
- # anyway.
- #
- # Sometimes I wish we had INSERT ... ON DUPLICATE KEY UPDATE.
+ // First make sure the rows exist. If one of the "deleted" ones didn't
+ // exist, we might legitimately not create it, but it's simpler to just
+ // create it and then give it a negative value, since the value is bogus
+ // anyway.
+ //
+ // Sometimes I wish we had INSERT ... ON DUPLICATE KEY UPDATE.
$insertCats = array_merge( $added, $deleted );
if ( !$insertCats ) {
- # Okay, nothing to do
+ // Okay, nothing to do
return;
}
@@ -2789,14 +3031,14 @@ class WikiPage extends Page implements IDBAccessObject {
}
$dbw->insert( 'category', $insertRows, __METHOD__, 'IGNORE' );
- $addFields = array( 'cat_pages = cat_pages + 1' );
+ $addFields = array( 'cat_pages = cat_pages + 1' );
$removeFields = array( 'cat_pages = cat_pages - 1' );
if ( $ns == NS_CATEGORY ) {
- $addFields[] = 'cat_subcats = cat_subcats + 1';
+ $addFields[] = 'cat_subcats = cat_subcats + 1';
$removeFields[] = 'cat_subcats = cat_subcats - 1';
} elseif ( $ns == NS_FILE ) {
- $addFields[] = 'cat_files = cat_files + 1';
+ $addFields[] = 'cat_files = cat_files + 1';
$removeFields[] = 'cat_files = cat_files - 1';
}
@@ -2817,6 +3059,15 @@ class WikiPage extends Page implements IDBAccessObject {
__METHOD__
);
}
+
+ foreach( $added as $catName ) {
+ $cat = Category::newFromName( $catName );
+ wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $this ) );
+ }
+ foreach( $deleted as $catName ) {
+ $cat = Category::newFromName( $catName );
+ wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $this ) );
+ }
}
/**
@@ -2836,7 +3087,7 @@ class WikiPage extends Page implements IDBAccessObject {
// that cascaded protections apply as soon as the changes
// are visible.
- # Get templates from templatelinks
+ // Get templates from templatelinks
$id = $this->mTitle->getArticleID();
$tlTemplates = array();
@@ -2852,7 +3103,7 @@ class WikiPage extends Page implements IDBAccessObject {
$tlTemplates["{$row->tl_namespace}:{$row->tl_title}"] = true;
}
- # Get templates from parser output.
+ // Get templates from parser output.
$poTemplates = array();
foreach ( $parserOutput->getTemplates() as $ns => $templates ) {
foreach ( $templates as $dbk => $id ) {
@@ -2860,12 +3111,12 @@ class WikiPage extends Page implements IDBAccessObject {
}
}
- # Get the diff
+ // Get the diff
$templates_diff = array_diff_key( $poTemplates, $tlTemplates );
if ( count( $templates_diff ) > 0 ) {
- # Whee, link updates time.
- # Note: we are only interested in links here. We don't need to get other DataUpdate items from the parser output.
+ // Whee, link updates time.
+ // Note: we are only interested in links here. We don't need to get other DataUpdate items from the parser output.
$u = new LinksUpdate( $this->mTitle, $parserOutput, false );
$u->doUpdate();
}
@@ -2903,7 +3154,7 @@ class WikiPage extends Page implements IDBAccessObject {
* so we can do things like signatures and links-in-context.
*
* @deprecated in 1.19; use Parser::preSaveTransform() instead
- * @param $text String article contents
+ * @param string $text article contents
* @param $user User object: user doing the edit
* @param $popts ParserOptions object: parser options, default options for
* the user loaded if null given
@@ -2950,10 +3201,10 @@ class WikiPage extends Page implements IDBAccessObject {
* Update the article's restriction field, and leave a log entry.
*
* @deprecated since 1.19
- * @param $limit Array: set of restriction keys
+ * @param array $limit set of restriction keys
* @param $reason String
* @param &$cascade Integer. Set to false if cascading protection isn't allowed.
- * @param $expiry Array: per restriction type expiration
+ * @param array $expiry per restriction type expiration
* @param $user User The user updating the restrictions
* @return bool true on success
*/
@@ -2995,6 +3246,31 @@ class WikiPage extends Page implements IDBAccessObject {
global $wgUser;
return $this->isParserCacheUsed( ParserOptions::newFromUser( $wgUser ), $oldid );
}
+
+ /**
+ * Returns a list of updates to be performed when this page is deleted. The updates should remove any information
+ * about this page from secondary data stores such as links tables.
+ *
+ * @param Content|null $content optional Content object for determining the necessary updates
+ * @return Array an array of DataUpdates objects
+ */
+ public function getDeletionUpdates( Content $content = null ) {
+ if ( !$content ) {
+ // load content object, which may be used to determine the necessary updates
+ // XXX: the content may not be needed to determine the updates, then this would be overhead.
+ $content = $this->getContent( Revision::RAW );
+ }
+
+ if ( !$content ) {
+ $updates = array();
+ } else {
+ $updates = $content->getDeletionUpdates( $this );
+ }
+
+ wfRunHooks( 'WikiPageDeletionUpdates', array( $this, $content, &$updates ) );
+ return $updates;
+ }
+
}
class PoolWorkArticleView extends PoolCounterWork {
@@ -3020,9 +3296,9 @@ class PoolWorkArticleView extends PoolCounterWork {
private $parserOptions;
/**
- * @var string|null
+ * @var Content|null
*/
- private $text;
+ private $content = null;
/**
* @var ParserOutput|bool
@@ -3046,14 +3322,20 @@ class PoolWorkArticleView extends PoolCounterWork {
* @param $revid Integer: ID of the revision being parsed
* @param $useParserCache Boolean: whether to use the parser cache
* @param $parserOptions parserOptions to use for the parse operation
- * @param $text String: text to parse or null to load it
+ * @param $content Content|String: content to parse or null to load it; may also be given as a wikitext string, for BC
*/
- function __construct( Page $page, ParserOptions $parserOptions, $revid, $useParserCache, $text = null ) {
+ function __construct( Page $page, ParserOptions $parserOptions, $revid, $useParserCache, $content = null ) {
+ if ( is_string( $content ) ) { // BC: old style call
+ $modelId = $page->getRevision()->getContentModel();
+ $format = $page->getRevision()->getContentFormat();
+ $content = ContentHandler::makeContent( $content, $page->getTitle(), $modelId, $format );
+ }
+
$this->page = $page;
$this->revid = $revid;
$this->cacheable = $useParserCache;
$this->parserOptions = $parserOptions;
- $this->text = $text;
+ $this->content = $content;
$this->cacheKey = ParserCache::singleton()->getKey( $page, $parserOptions );
parent::__construct( 'ArticleView', $this->cacheKey . ':revid:' . $revid );
}
@@ -3089,28 +3371,38 @@ class PoolWorkArticleView extends PoolCounterWork {
* @return bool
*/
function doWork() {
- global $wgParser, $wgUseFileCache;
+ global $wgUseFileCache;
+
+ // @todo: several of the methods called on $this->page are not declared in Page, but present
+ // in WikiPage and delegated by Article.
$isCurrent = $this->revid === $this->page->getLatest();
- if ( $this->text !== null ) {
- $text = $this->text;
+ if ( $this->content !== null ) {
+ $content = $this->content;
} elseif ( $isCurrent ) {
- $text = $this->page->getRawText();
+ // XXX: why use RAW audience here, and PUBLIC (default) below?
+ $content = $this->page->getContent( Revision::RAW );
} else {
$rev = Revision::newFromTitle( $this->page->getTitle(), $this->revid );
+
if ( $rev === null ) {
- return false;
+ $content = null;
+ } else {
+ // XXX: why use PUBLIC audience here (default), and RAW above?
+ $content = $rev->getContent();
}
- $text = $rev->getText();
+ }
+
+ if ( $content === null ) {
+ return false;
}
$time = - microtime( true );
- $this->parserOutput = $wgParser->parse( $text, $this->page->getTitle(),
- $this->parserOptions, true, true, $this->revid );
+ $this->parserOutput = $content->getParserOutput( $this->page->getTitle(), $this->revid, $this->parserOptions );
$time += microtime( true );
- # Timing hack
+ // Timing hack
if ( $time > 3 ) {
wfDebugLog( 'slow-parse', sprintf( "%-5.2f %s", $time,
$this->page->getTitle()->getPrefixedDBkey() ) );
diff --git a/includes/Xml.php b/includes/Xml.php
index 120312dd..57a4fcf6 100644
--- a/includes/Xml.php
+++ b/includes/Xml.php
@@ -30,16 +30,16 @@ class Xml {
* Strings are assumed to not contain XML-illegal characters; special
* characters (<, >, &) are escaped but illegals are not touched.
*
- * @param $element String: element name
- * @param $attribs Array: Name=>value pairs. Values will be escaped.
- * @param $contents String: NULL to make an open tag only; '' for a contentless closed tag (default)
- * @param $allowShortTag Bool: whether '' in $contents will result in a contentless closed tag
+ * @param string $element element name
+ * @param array $attribs Name=>value pairs. Values will be escaped.
+ * @param string $contents NULL to make an open tag only; '' for a contentless closed tag (default)
+ * @param bool $allowShortTag whether '' in $contents will result in a contentless closed tag
* @return string
*/
public static function element( $element, $attribs = null, $contents = '', $allowShortTag = true ) {
$out = '<' . $element;
if( !is_null( $attribs ) ) {
- $out .= self::expandAttributes( $attribs );
+ $out .= self::expandAttributes( $attribs );
}
if( is_null( $contents ) ) {
$out .= '>';
@@ -58,7 +58,8 @@ class Xml {
* to set the XML attributes : attributename="value".
* The values are passed to Sanitizer::encodeAttribute.
* Return null if no attributes given.
- * @param $attribs Array of attributes for an XML element
+ * @param array $attribs of attributes for an XML element
+ * @throws MWException
* @return null|string
*/
public static function expandAttributes( $attribs ) {
@@ -81,11 +82,11 @@ class Xml {
* is passed.
*
* @param $element String:
- * @param $attribs Array: Name=>value pairs. Values will be escaped.
- * @param $contents String: NULL to make an open tag only; '' for a contentless closed tag (default)
+ * @param array $attribs Name=>value pairs. Values will be escaped.
+ * @param string $contents NULL to make an open tag only; '' for a contentless closed tag (default)
* @return string
*/
- public static function elementClean( $element, $attribs = array(), $contents = '') {
+ public static function elementClean( $element, $attribs = array(), $contents = '' ) {
global $wgContLang;
if( $attribs ) {
$attribs = array_map( array( 'UtfNormal', 'cleanUp' ), $attribs );
@@ -101,8 +102,8 @@ class Xml {
/**
* This opens an XML element
*
- * @param $element String name of the element
- * @param $attribs array of attributes, see Xml::expandAttributes()
+ * @param string $element name of the element
+ * @param array $attribs of attributes, see Xml::expandAttributes()
* @return string
*/
public static function openElement( $element, $attribs = null ) {
@@ -111,7 +112,7 @@ class Xml {
/**
* Shortcut to close an XML element
- * @param $element String element name
+ * @param string $element element name
* @return string
*/
public static function closeElement( $element ) { return "</$element>"; }
@@ -120,9 +121,9 @@ class Xml {
* Same as Xml::element(), but does not escape contents. Handy when the
* content you have is already valid xml.
*
- * @param $element String element name
- * @param $attribs array of attributes
- * @param $contents String content of the element
+ * @param string $element element name
+ * @param array $attribs of attributes
+ * @param string $contents content of the element
* @return string
*/
public static function tags( $element, $attribs = null, $contents ) {
@@ -135,7 +136,7 @@ class Xml {
* @param $selected Mixed: Namespace which should be pre-selected
* @param $all Mixed: Value of an item denoting all namespaces, or null to omit
* @param $element_name String: value of the "name" attribute of the select tag
- * @param $label String: optional label to add to the field
+ * @param string $label optional label to add to the field
* @return string
* @deprecated since 1.19
*/
@@ -156,8 +157,8 @@ class Xml {
* Create a date selector
*
* @param $selected Mixed: the month which should be selected, default ''
- * @param $allmonths String: value of a special item denoting all month. Null to not include (default)
- * @param $id String: Element identifier
+ * @param string $allmonths value of a special item denoting all month. Null to not include (default)
+ * @param string $id Element identifier
* @return String: Html string containing the month selector
*/
public static function monthSelector( $selected = '', $allmonths = null, $id = 'month' ) {
@@ -191,22 +192,23 @@ class Xml {
} elseif( $encMonth ) {
$thisMonth = intval( gmdate( 'n' ) );
$thisYear = intval( gmdate( 'Y' ) );
- if( intval($encMonth) > $thisMonth ) {
+ if( intval( $encMonth ) > $thisMonth ) {
$thisYear--;
}
$encYear = $thisYear;
} else {
$encYear = '';
}
- return Xml::label( wfMessage( 'year' )->text(), 'year' ) . ' '.
- Xml::input( 'year', 4, $encYear, array('id' => 'year', 'maxlength' => 4) ) . ' '.
- Xml::label( wfMessage( 'month' )->text(), 'month' ) . ' '.
- Xml::monthSelector( $encMonth, -1 );
+ $inputAttribs = array( 'id' => 'year', 'maxlength' => 4, 'size' => 7 );
+ return self::label( wfMessage( 'year' )->text(), 'year' ) . ' '.
+ Html::input( 'year', $encYear, 'number', $inputAttribs ) . ' '.
+ self::label( wfMessage( 'month' )->text(), 'month' ) . ' '.
+ self::monthSelector( $encMonth, -1 );
}
/**
* Construct a language selector appropriate for use in a form or preferences
- *
+ *
* @param string $selected The language code of the selected language
* @param boolean $customisedOnly If true only languages which have some content are listed
* @param string $inLanguage The ISO code of the language to display the select list in (optional)
@@ -254,9 +256,9 @@ class Xml {
/**
* Shortcut to make a span element
- * @param $text String content of the element, will be escaped
- * @param $class String class name of the span element
- * @param $attribs array other attributes
+ * @param string $text content of the element, will be escaped
+ * @param string $class class name of the span element
+ * @param array $attribs other attributes
* @return string
*/
public static function span( $text, $class, $attribs = array() ) {
@@ -265,10 +267,10 @@ class Xml {
/**
* Shortcut to make a specific element with a class attribute
- * @param $text string content of the element, will be escaped
- * @param $class string class name of the span element
- * @param $tag string element name
- * @param $attribs array other attributes
+ * @param string $text content of the element, will be escaped
+ * @param string $class class name of the span element
+ * @param string $tag element name
+ * @param array $attribs other attributes
* @return string
*/
public static function wrapClass( $text, $class, $tag = 'span', $attribs = array() ) {
@@ -277,10 +279,10 @@ class Xml {
/**
* Convenience function to build an HTML text input field
- * @param $name String value of the name attribute
- * @param $size int value of the size attribute
+ * @param string $name value of the name attribute
+ * @param int $size value of the size attribute
* @param $value mixed value of the value attribute
- * @param $attribs array other attributes
+ * @param array $attribs other attributes
* @return string HTML
*/
public static function input( $name, $size = false, $value = false, $attribs = array() ) {
@@ -299,10 +301,10 @@ class Xml {
/**
* Convenience function to build an HTML password input field
- * @param $name string value of the name attribute
- * @param $size int value of the size attribute
+ * @param string $name value of the name attribute
+ * @param int $size value of the size attribute
* @param $value mixed value of the value attribute
- * @param $attribs array other attributes
+ * @param array $attribs other attributes
* @return string HTML
*/
public static function password( $name, $size = false, $value = false, $attribs = array() ) {
@@ -323,9 +325,9 @@ class Xml {
/**
* Convenience function to build an HTML checkbox
- * @param $name String value of the name attribute
- * @param $checked Bool Whether the checkbox is checked or not
- * @param $attribs Array other attributes
+ * @param string $name value of the name attribute
+ * @param bool $checked Whether the checkbox is checked or not
+ * @param array $attribs other attributes
* @return string HTML
*/
public static function check( $name, $checked = false, $attribs=array() ) {
@@ -340,10 +342,10 @@ class Xml {
/**
* Convenience function to build an HTML radio button
- * @param $name String value of the name attribute
- * @param $value String value of the value attribute
- * @param $checked Bool Whether the checkbox is checked or not
- * @param $attribs Array other attributes
+ * @param string $name value of the name attribute
+ * @param string $value value of the value attribute
+ * @param bool $checked Whether the checkbox is checked or not
+ * @param array $attribs other attributes
* @return string HTML
*/
public static function radio( $name, $value, $checked = false, $attribs = array() ) {
@@ -355,9 +357,9 @@ class Xml {
/**
* Convenience function to build an HTML form label
- * @param $label String text of the label
+ * @param string $label text of the label
* @param $id
- * @param $attribs Array an attribute array. This will usuall be
+ * @param array $attribs an attribute array. This will usually be
* the same array as is passed to the corresponding input element,
* so this function will cherry-pick appropriate attributes to
* apply to the label as well; only class and title are applied.
@@ -367,10 +369,10 @@ class Xml {
$a = array( 'for' => $id );
# FIXME avoid copy pasting below:
- if( isset( $attribs['class'] ) ){
+ if( isset( $attribs['class'] ) ) {
$a['class'] = $attribs['class'];
}
- if( isset( $attribs['title'] ) ){
+ if( isset( $attribs['title'] ) ) {
$a['title'] = $attribs['title'];
}
@@ -379,12 +381,12 @@ class Xml {
/**
* Convenience function to build an HTML text input field with a label
- * @param $label String text of the label
- * @param $name String value of the name attribute
- * @param $id String id of the input
- * @param $size Int|Bool value of the size attribute
- * @param $value String|Bool value of the value attribute
- * @param $attribs array other attributes
+ * @param string $label text of the label
+ * @param string $name value of the name attribute
+ * @param string $id id of the input
+ * @param int|Bool $size value of the size attribute
+ * @param string|Bool $value value of the value attribute
+ * @param array $attribs other attributes
* @return string HTML
*/
public static function inputLabel( $label, $name, $id, $size=false, $value=false, $attribs = array() ) {
@@ -448,8 +450,8 @@ class Xml {
/**
* Convenience function to build an HTML submit button
- * @param $value String: label text for the button
- * @param $attribs Array: optional custom attributes
+ * @param string $value label text for the button
+ * @param array $attribs optional custom attributes
* @return string HTML
*/
public static function submitButton( $value, $attribs = array() ) {
@@ -458,10 +460,10 @@ class Xml {
/**
* Convenience function to build an HTML drop-down list item.
- * @param $text String: text for this item
- * @param $value String: form submission value; if empty, use text
+ * @param string $text text for this item
+ * @param string $value form submission value; if empty, use text
* @param $selected boolean: if true, will be the default selected item
- * @param $attribs array: optional additional HTML attributes
+ * @param array $attribs optional additional HTML attributes
* @return string HTML
*/
public static function option( $text, $value=null, $selected = false,
@@ -498,7 +500,7 @@ class Xml {
} elseif ( substr( $value, 0, 1) == '*' && substr( $value, 1, 1) != '*' ) {
// A new group is starting ...
$value = trim( substr( $value, 1 ) );
- if( $optgroup ) $options .= self::closeElement('optgroup');
+ if( $optgroup ) $options .= self::closeElement( 'optgroup' );
$options .= self::openElement( 'optgroup', array( 'label' => $value ) );
$optgroup = true;
} elseif ( substr( $value, 0, 2) == '**' ) {
@@ -507,13 +509,13 @@ class Xml {
$options .= self::option( $value, $value, $selected === $value );
} else {
// groupless reason list
- if( $optgroup ) $options .= self::closeElement('optgroup');
+ if( $optgroup ) $options .= self::closeElement( 'optgroup' );
$options .= self::option( $value, $value, $selected === $value );
$optgroup = false;
}
}
- if( $optgroup ) $options .= self::closeElement('optgroup');
+ if( $optgroup ) $options .= self::closeElement( 'optgroup' );
$attribs = array();
@@ -540,9 +542,9 @@ class Xml {
/**
* Shortcut for creating fieldsets.
*
- * @param $legend string|bool Legend of the fieldset. If evaluates to false, legend is not added.
- * @param $content string Pre-escaped content for the fieldset. If false, only open fieldset is returned.
- * @param $attribs array Any attributes to fieldset-element.
+ * @param string|bool $legend Legend of the fieldset. If evaluates to false, legend is not added.
+ * @param string $content Pre-escaped content for the fieldset. If false, only open fieldset is returned.
+ * @param array $attribs Any attributes to fieldset-element.
*
* @return string
*/
@@ -564,17 +566,18 @@ class Xml {
/**
* Shortcut for creating textareas.
*
- * @param $name string The 'name' for the textarea
- * @param $content string Content for the textarea
- * @param $cols int The number of columns for the textarea
- * @param $rows int The number of rows for the textarea
- * @param $attribs array Any other attributes for the textarea
+ * @param string $name The 'name' for the textarea
+ * @param string $content Content for the textarea
+ * @param int $cols The number of columns for the textarea
+ * @param int $rows The number of rows for the textarea
+ * @param array $attribs Any other attributes for the textarea
*
* @return string
*/
public static function textarea( $name, $content, $cols = 40, $rows = 5, $attribs = array() ) {
return self::element( 'textarea',
- array( 'name' => $name,
+ array(
+ 'name' => $name,
'id' => $name,
'cols' => $cols,
'rows' => $rows
@@ -587,7 +590,7 @@ class Xml {
* for JavaScript source code.
* Illegal control characters are assumed not to be present.
*
- * @param $string String to escape
+ * @param string $string to escape
* @return String
*/
public static function escapeJsString( $string ) {
@@ -633,10 +636,10 @@ class Xml {
} elseif ( is_null( $value ) ) {
$s = 'null';
} elseif ( is_int( $value ) || is_float( $value ) ) {
- $s = strval($value);
+ $s = strval( $value );
} elseif ( is_array( $value ) && // Make sure it's not associative.
- array_keys($value) === range( 0, count($value) - 1 ) ||
- count($value) == 0
+ array_keys( $value ) === range( 0, count( $value ) - 1 ) ||
+ count( $value ) == 0
) {
$s = '[';
foreach ( $value as $elt ) {
@@ -670,38 +673,27 @@ class Xml {
* Create a call to a JavaScript function. The supplied arguments will be
* encoded using Xml::encodeJsVar().
*
- * @param $name String The name of the function to call, or a JavaScript expression
+ * @param string $name The name of the function to call, or a JavaScript expression
* which evaluates to a function object which is called.
- * @param $args Array of arguments to pass to the function.
+ * @param array $args of arguments to pass to the function.
*
* @since 1.17
*
* @return string
*/
public static function encodeJsCall( $name, $args ) {
- $s = "$name(";
- $first = true;
-
- foreach ( $args as $arg ) {
- if ( $first ) {
- $first = false;
- } else {
- $s .= ', ';
- }
-
- $s .= Xml::encodeJsVar( $arg );
+ foreach ( $args as &$arg ) {
+ $arg = Xml::encodeJsVar( $arg );
}
- $s .= ");\n";
-
- return $s;
+ return "$name(" . implode( ', ', $args ) . ");\n";
}
/**
* Check if a string is well-formed XML.
* Must include the surrounding tag.
*
- * @param $text String: string to test.
+ * @param string $text string to test.
* @return bool
*
* @todo Error position reporting return
@@ -748,7 +740,7 @@ class Xml {
* Replace " > and < with their respective HTML entities ( &quot;,
* &gt;, &lt;)
*
- * @param $in String: text that might contain HTML tags.
+ * @param string $in text that might contain HTML tags.
* @return string Escaped string
*/
public static function escapeTagsOnly( $in ) {
@@ -759,12 +751,12 @@ class Xml {
}
/**
- * Generate a form (without the opening form element).
- * Output optionally includes a submit button.
- * @param $fields Array Associative array, key is message corresponding to a description for the field (colon is in the message), value is appropriate input.
- * @param $submitLabel String A message containing a label for the submit button.
- * @return string HTML form.
- */
+ * Generate a form (without the opening form element).
+ * Output optionally includes a submit button.
+ * @param array $fields Associative array, key is message corresponding to a description for the field (colon is in the message), value is appropriate input.
+ * @param string $submitLabel A message containing a label for the submit button.
+ * @return string HTML form.
+ */
public static function buildForm( $fields, $submitLabel = null ) {
$form = '';
$form .= "<table><tbody>";
@@ -772,7 +764,7 @@ class Xml {
foreach( $fields as $labelmsg => $input ) {
$id = "mw-$labelmsg";
$form .= Xml::openElement( 'tr', array( 'id' => $id ) );
- $form .= Xml::tags( 'td', array('class' => 'mw-label'), wfMessage( $labelmsg )->parse() );
+ $form .= Xml::tags( 'td', array( 'class' => 'mw-label' ), wfMessage( $labelmsg )->parse() );
$form .= Xml::openElement( 'td', array( 'class' => 'mw-input' ) ) . $input . Xml::closeElement( 'td' );
$form .= Xml::closeElement( 'tr' );
}
@@ -791,9 +783,9 @@ class Xml {
/**
* Build a table of data
- * @param $rows array An array of arrays of strings, each to be a row in a table
- * @param $attribs array An array of attributes to apply to the table tag [optional]
- * @param $headers array An array of strings to use as table headers [optional]
+ * @param array $rows An array of arrays of strings, each to be a row in a table
+ * @param array $attribs An array of attributes to apply to the table tag [optional]
+ * @param array $headers An array of strings to use as table headers [optional]
* @return string
*/
public static function buildTable( $rows, $attribs = array(), $headers = null ) {
@@ -831,8 +823,8 @@ class Xml {
/**
* Build a row for a table
- * @param $attribs array An array of attributes to apply to the tr tag
- * @param $cells array An array of strings to put in <td>
+ * @param array $attribs An array of attributes to apply to the tr tag
+ * @param array $cells An array of strings to put in <td>
* @return string
*/
public static function buildTableRow( $attribs, $cells ) {
diff --git a/includes/XmlTypeCheck.php b/includes/XmlTypeCheck.php
index b95dd6a5..2e184606 100644
--- a/includes/XmlTypeCheck.php
+++ b/includes/XmlTypeCheck.php
@@ -40,7 +40,7 @@ class XmlTypeCheck {
public $rootElement = '';
/**
- * @param $file string filename
+ * @param string $file filename
* @param $filterCallback callable (optional)
* Function to call to do additional custom validity checks from the
* SAX element handler event. This gives you access to the element
diff --git a/includes/ZhClient.php b/includes/ZhClient.php
index 4299841b..fd03ec45 100644
--- a/includes/ZhClient.php
+++ b/includes/ZhClient.php
@@ -50,7 +50,7 @@ class ZhClient {
}
/**
- * Establish conncetion
+ * Establish connection
*
* @access private
*
@@ -100,8 +100,8 @@ class ZhClient {
/**
* Convert the input to a different language variant
*
- * @param $text String: input text
- * @param $tolang String: language variant
+ * @param string $text input text
+ * @param string $tolang language variant
* @return string the converted text
*/
function convert( $text, $tolang ) {
@@ -117,7 +117,7 @@ class ZhClient {
/**
* Convert the input to all possible variants
*
- * @param $text String: input text
+ * @param string $text input text
* @return array langcode => converted_string
*/
function convertToAllVariants( $text ) {
@@ -142,7 +142,7 @@ class ZhClient {
/**
* Perform word segmentation
*
- * @param $text String: input text
+ * @param string $text input text
* @return string segmented text
*/
function segment( $text ) {
diff --git a/includes/ZhConversion.php b/includes/ZhConversion.php
index 247b1939..df98836f 100644
--- a/includes/ZhConversion.php
+++ b/includes/ZhConversion.php
@@ -9,36 +9,66 @@
*/
$zh2Hant = array(
+'ã½' => 'å‘',
+'㑇' => '㑳',
+'㑈' => '倲',
+'㑔' => '㑯',
'㑩' => '儸',
'ã“¥' => 'åŠ',
'㔉' => '劚',
'㖊' => '噚',
'ã–ž' => 'å–Ž',
+'㘎' => '㘚',
+'㚯' => '㜄',
+'㛀' => '媰',
'㛟' => '𡞵',
'㛠' => '𡢃',
+'㛣' => 'ãœ',
+'㛤' => '孋',
'㛿' => '𡠹',
'㟆' => 'ã ',
+'㟜' => '𡾱',
+'㤘' => '㥮',
+'ã§' => '掆',
+'ã§' => '㩳',
'㧑' => 'æ’',
'㧟' => '擓',
+'㧰' => '擽',
'㨫' => '㩜',
+'㭎' => '棡',
+'ã­' => '椲',
+'㭣' => '𣙎',
+'㭤' => '樢',
+'㭴' => '樫',
'㱩' => '殰',
'㱮' => '殨',
'㲿' => '瀇',
+'㳔' => '濧',
+'㳕' => 'ç¡',
'ã³ ' => 'æ¾¾',
+'㳡' => '濄',
+'㳢' => '𣾷',
+'㳽' => '瀰',
'㶉' => '鸂',
'㶶' => '燶',
'㶽' => '煱',
'ãº' => 'ç±',
+'ã»…' => 'ç’¯',
'ã»' => '𤫩',
'㻘' => '𤪺',
+'䀥' => 'ä»',
'ä–' => 'çžœ',
+'䂵' => '碽',
'ä…‰' => 'ç¨',
+'䅪' => '𥢢',
'䇲' => '筴',
+'䉤' => '籔',
'䌶' => '䊷',
'䌷' => '紬',
'䌸' => '縳',
'䌹' => '絅',
'䌺' => '䋙',
+'䌻' => '䋚',
'䌼' => 'ç¶',
'䌽' => '綵',
'䌾' => '䋻',
@@ -48,24 +78,34 @@ $zh2Hant = array(
'ä“•' => 'è–³',
'ä—–' => 'èž®',
'䘛' => 'ð§ž',
+'䘞' => '𧜗',
'䙊' => '𧜵',
+'䙌' => '䙡',
'䙓' => '襬',
'䜣' => '訢',
'䜥' => '𧩙',
-'䜧' => '譅',
+'䜧' => '䜀',
+'䜩' => '讌',
'ä™' => 'è²™',
'䞌' => '𧵳',
'äž' => 'ä¼',
+'䞎' => '𧶧',
'äž' => 'è³°',
+'䟢' => '躎',
+'䢀' => '𨊰',
+'ä¢' => '𨊸',
'䢂' => '𨋢',
'䥺' => '釾',
'䥽' => 'éº',
+'䥾' => '䥱',
'䥿' => '𨯅',
'䦀' => '𨦫',
'ä¦' => '𨧜',
+'䦂' => '䥇',
'䦃' => 'é¯',
'䦅' => 'é¥',
-'ä©„' => 'é¦',
+'䦶' => '䦛',
+'䦷' => '䦟',
'䭪' => '𩞯',
'䯃' => '𩣑',
'䯄' => '騧',
@@ -136,6 +176,7 @@ $zh2Hant = array(
'伞' => '傘',
'伟' => 'å‰',
'传' => '傳',
+'伡' => '俥',
'ä¼£' => 'ä¿”',
'伤' => '傷',
'伥' => '倀',
@@ -217,6 +258,7 @@ $zh2Hant = array(
'刭' => '剄',
'刹' => '剎',
'刽' => '劊',
+'刾' => '㓨',
'刿' => '劌',
'剀' => '剴',
'剂' => '劑',
@@ -321,6 +363,8 @@ $zh2Hant = array(
'啬' => '嗇',
'啭' => '囀',
'å•®' => 'åš™',
+'啯' => '嘓',
+'啰' => '囉',
'啴' => '嘽',
'啸' => '嘯',
'å–·' => 'å™´',
@@ -410,6 +454,7 @@ $zh2Hant = array(
'婵' => '嬋',
'婶' => '嬸',
'媪' => '媼',
+'媭' => '嬃',
'嫒' => '嬡',
'嫔' => '嬪',
'嫱' => '嬙',
@@ -513,7 +558,9 @@ $zh2Hant = array(
'å½’' => 'æ­¸',
'当' => '當',
'录' => '錄',
+'彟' => '彠',
'彦' => '彥',
+'彨' => '彲',
'å½»' => 'å¾¹',
'径' => '徑',
'徕' => '徠',
@@ -648,6 +695,7 @@ $zh2Hant = array(
'攒' => '攢',
'敌' => '敵',
'æ•›' => 'æ–‚',
+'æ•©' => 'æ–†',
'数' => '數',
'斋' => '齋',
'æ–“' => 'æ–•',
@@ -719,6 +767,7 @@ $zh2Hant = array(
'桧' => '檜',
'桨' => '槳',
'æ¡©' => 'æ¨',
+'桪' => '樳',
'梦' => '夢',
'梼' => '檮',
'梾' => '棶',
@@ -727,9 +776,12 @@ $zh2Hant = array(
'æ£' => '梲',
'棂' => '欞',
'æ¤' => '槨',
+'æ¤' => '槼',
'椟' => 'æ«',
'椠' => '槧',
+'椢' => '槶',
'椤' => 'æ¬',
+'椫' => '樿',
'椭' => '橢',
'楼' => '樓',
'榄' => '欖',
@@ -783,6 +835,7 @@ $zh2Hant = array(
'æ²¥' => 'ç€',
'沦' => '淪',
'沧' => '滄',
+'沨' => '渢',
'沩' => '溈',
'沪' => '滬',
'泞' => '濘',
@@ -813,6 +866,7 @@ $zh2Hant = array(
'浒' => '滸',
'浓' => '濃',
'浔' => '潯',
+'浕' => '濜',
'涂' => '塗',
'涛' => '濤',
'æ¶' => '澇',
@@ -820,6 +874,7 @@ $zh2Hant = array(
'涟' => '漣',
'涠' => '潿',
'涡' => '渦',
+'涢' => '溳',
'涣' => '渙',
'涤' => '滌',
'润' => '潤',
@@ -833,7 +888,6 @@ $zh2Hant = array(
'æ¸' => '漸',
'渑' => '澠',
'渔' => 'æ¼',
-'渖' => '瀋',
'渗' => '滲',
'温' => '溫',
'æ¹¾' => 'ç£',
@@ -841,6 +895,7 @@ $zh2Hant = array(
'溃' => '潰',
'溅' => '濺',
'溆' => '漵',
+'溇' => '漊',
'æ»—' => 'æ½·',
'滚' => '滾',
'滞' => '滯',
@@ -861,6 +916,7 @@ $zh2Hant = array(
'æ½' => 'æ¿°',
'潜' => '潛',
'潴' => '瀦',
+'澛' => '瀂',
'澜' => '瀾',
'濑' => '瀨',
'濒' => '瀕',
@@ -872,7 +928,6 @@ $zh2Hant = array(
'ç¿' => '燦',
'ç‚€' => 'ç…¬',
'炉' => 'çˆ',
-'炖' => '燉',
'炜' => '煒',
'ç‚' => '熗',
'点' => '點',
@@ -1014,12 +1069,13 @@ $zh2Hant = array(
'硖' => '硤',
'硗' => '磽',
'硙' => '磑',
+'硚' => '礄',
'确' => '確',
+'硵' => '磠',
'硷' => '礆',
'ç¢' => '礙',
'碛' => '磧',
'碜' => '磣',
-'碱' => '鹼',
'礼' => '禮',
'祃' => '禡',
'祎' => '禕',
@@ -1081,6 +1137,7 @@ $zh2Hant = array(
'篑' => '簣',
'篓' => 'ç°',
'篮' => '籃',
+'篯' => '籛',
'篱' => '籬',
'簖' => '籪',
'ç±' => '籟',
@@ -1256,6 +1313,8 @@ $zh2Hant = array(
'羟' => '羥',
'羡' => '羨',
'翘' => '翹',
+'翙' => '翽',
+'翚' => '翬',
'耢' => '耮',
'耧' => '耬',
'耸' => 'è³',
@@ -1295,6 +1354,7 @@ $zh2Hant = array(
'脶' => '腡',
'脸' => '臉',
'腊' => '臘',
+'腘' => '膕',
'腭' => '齶',
'腻' => '膩',
'è…¼' => 'é¦',
@@ -1337,6 +1397,7 @@ $zh2Hant = array(
'èš' => '莢',
'è›' => '蕘',
'èœ' => '蓽',
+'è' => 'è´',
'èž' => 'è•Ž',
'èŸ' => 'è–ˆ',
'è ' => 'è–º',
@@ -1405,6 +1466,7 @@ $zh2Hant = array(
'蚀' => 'è•',
'èš' => '蟻',
'èš‚' => 'èžž',
+'蚃' => 'è ',
'èš•' => 'è ¶',
'蚬' => '蜆',
'蛊' => '蠱',
@@ -1445,9 +1507,10 @@ $zh2Hant = array(
'裢' => '褳',
'裣' => 'è¥',
'裤' => '褲',
-'裥' => '襇',
+'裥' => '襉',
'褛' => '褸',
'褴' => '襤',
+'襕' => '襴',
'è§' => '見',
'观' => '觀',
'觃' => '覎',
@@ -1469,6 +1532,7 @@ $zh2Hant = array(
'触' => '觸',
'觯' => '觶',
'訚' => '誾',
+'詟' => '讋',
'誉' => '譽',
'誊' => '謄',
'è® ' => 'è¨',
@@ -2209,6 +2273,7 @@ $zh2Hant = array(
'颠' => '顛',
'颡' => '顙',
'颢' => '顥',
+'颣' => '纇',
'颤' => '顫',
'颥' => '顬',
'颦' => '顰',
@@ -2344,6 +2409,7 @@ $zh2Hant = array(
'é«‹' => 'é«–',
'髌' => '髕',
'鬓' => '鬢',
+'鬶' => '鬹',
'é­‡' => 'é­˜',
'é­‰' => 'é­Ž',
'é±¼' => 'é­š',
@@ -2404,7 +2470,6 @@ $zh2Hant = array(
'鲳' => '鯧',
'é²´' => 'é¯',
'鲵' => '鯢',
-'鲶' => '鯰',
'鲷' => '鯛',
'鲸' => '鯨',
'é²¹' => 'é°º',
@@ -2570,9 +2635,144 @@ $zh2Hant = array(
'龚' => '龔',
'龛' => '龕',
'龟' => '龜',
+'𠆲' => '儣',
+'𠆿' => '𠌥',
+'𠉂' => '㒓',
+'ð ‰—' => 'ð ¢',
+'ð š³' => 'ð  Ž',
+'𠛅' => '剾',
+'𠛆' => '𠞆',
'𠮶' => '嗰',
+'𠯟' => '哯',
+'ð ¯ ' => 'å™…',
+'ð ²¥' => 'ð¡…',
+'ð ´¢' => 'ð¡„”',
+'𠵸' => '𡄣',
+'ð µ¾' => 'ã—²',
+'ð¡‹€' => 'ð¡“¾',
+'ð¡‹—' => 'ð¡‘­',
'𡒄' => '壈',
+'ð¡ ' => '㜷',
+'𡞱' => '㜢',
+'𡭜' => '𡮉',
+'𡭬' => '𡮣',
+'𡶴' => '嵼',
+'𢋈' => 'ã¢',
+'ð¢˜' => '𢣚',
+'𢘞' => '𢣭',
+'𢙓' => '懀',
+'𢛯' => '㦎',
+'𢫊' => '𢷮',
+'𢫞' => '𢶫',
+'𢫬' => '摋',
+'𢬦' => '𢹿',
+'ð¢­' => 'æ“£',
+'𢽾' => '斅',
+'ð£†' => '曥',
+'ð£¨' => '𦢈',
+'ð£¯' => 'è…ª',
+'ð£°' => 'è„¥',
+'𣎑' => '臗',
+'ð£¤' => 'æ¬',
+'𣑶' => '𣠲',
+'𣗋' => '欓',
+'𣘓' => '𣞻',
+'𣘴' => '檭',
+'𣘷' => 'ð£•',
+'𣭤' => '𣯴',
+'𣶩' => '澅',
+'𣶫' => '𣿉',
+'𣸣' => '濆',
+'𣺼' => 'ç™',
+'𣺽' => 'ð¤£',
+'𣽷' => '瀃',
+'𤆡' => '熓',
+'𤇃' => '爄',
+'𤇄' => '熌',
+'𤈶' => '熉',
+'𤈷' => '㷿',
+'𤊀' => '𤒎',
+'ð¤‹' => '熡',
+'𤞤' => 'çŽ',
+'𤠋' => 'ãº',
+'𤦀' => '瓕',
+'𤳄' => '𤳸',
+'𤶧' => '𤸫',
+'𤽯' => '㿧',
+'𤾀' => '皟',
+'𥅘' => '𥌃',
+'𥅴' => '䀹',
+'𥆧' => '瞤',
+'𥇢' => 'äª',
+'ð¥Ÿ' => '礒',
+'ð¥¯' => '𥖅',
+'ð¥°' => '𥕥',
+'ð¥»' => '碙',
+'𥧂' => 'ð¥¨',
+'𥬀' => '䉙',
+'𥬞' => '籋',
+'𥬠' => '篘',
+'𥭉' => '𥵊',
+'𥮋' => '𥸠',
+'𥮜' => '䉲',
+'𥱔' => '𥵃',
+'𥹥' => '𥼽',
+'𥺅' => '䊭',
+'𥺇' => '𥽖',
+'𦈈' => '𥿊',
+'𦈉' => '緷',
+'𦈋' => '綇',
+'𦈌' => '綀',
+'𦈎' => '繟',
+'ð¦ˆ' => 'ç·',
+'ð¦ˆ' => '縺',
+'𦈑' => '緸',
+'𦈒' => '𦂅',
+'𦈓' => '䋿',
+'𦈔' => '縎',
+'𦈕' => '緰',
'𦈖' => '䌈',
+'𦈗' => '𦃄',
+'𦈘' => '䌋',
+'𦈙' => '䌰',
+'𦈚' => '縬',
+'𦈛' => '繓',
+'𦈜' => '䌖',
+'ð¦ˆ' => 'ç¹',
+'𦈞' => '䌟',
+'𦈟' => 'äŒ',
+'𦈠' => '䌥',
+'𦈡' => '繻',
+'𦛨' => '朥',
+'ð¦¼' => '膢',
+'𦟗' => '𦣎',
+'𦨩' => '𦪽',
+'𦰴' => '䕳',
+'𧉞' => '䗿',
+'𧒭' => '𧔥',
+'𧮪' => '詀',
+'𧳕' => '𧳟',
+'𧹑' => '䞈',
+'𧹓' => '𧶔',
+'𧹕' => 'ä»',
+'𧹖' => '賟',
+'𧹗' => '贃',
+'𧿈' => 'ð¨‡',
+'𨀱' => '𨄣',
+'ð¨´' => 'ð¨…',
+'𨂺' => '𨈊',
+'𨄄' => '𨈌',
+'𨅫' => '𨇞',
+'𨅬' => 'èº',
+'𨉗' => '軉',
+'ð¨…' => 'è»—',
+'ð¨†' => '𨊻',
+'ð¨‡' => 'ð¨ ',
+'ð¨ˆ' => '輄',
+'ð¨‰' => '𨎮',
+'ð¨Š' => 'ð¨¥',
+'𨑹' => '䢨',
+'𨤰' => '𨤻',
'𨰾' => '鎷',
'𨰿' => '釳',
'𨱀' => '𨥛',
@@ -2581,6 +2781,7 @@ $zh2Hant = array(
'𨱃' => '鈲',
'𨱄' => '鈯',
'𨱅' => 'é‰',
+'𨱆' => '龯',
'𨱇' => '銶',
'𨱈' => '鋉',
'𨱉' => 'é„',
@@ -2591,12 +2792,28 @@ $zh2Hant = array(
'𨱎' => 'é®',
'ð¨±' => 'éŽ',
'ð¨±' => '𨫒',
+'𨱑' => 'é„',
'𨱒' => 'é‰',
'𨱓' => 'éŽ',
'𨱔' => 'é',
'𨱕' => '𨮂',
+'𨱖' => '䥩',
+'𨷿' => '䦳',
+'𨸀' => '𨳕',
+'ð¨¸' => '𨳑',
'𨸂' => 'é–',
'𨸃' => 'é–',
+'𨸄' => '䦘',
+'𨸅' => '𨴗',
+'𨸆' => '𨵩',
+'𨸇' => '𨵸',
+'𨸉' => '𨶀',
+'𨸊' => 'ð¨¶',
+'𨸋' => '𨶲',
+'𨸌' => '𨶮',
+'𨸎' => '𨷲',
+'𨸘' => 'ð¨½',
+'𨸟' => '䧢',
'ð©¼' => 'äª',
'ð©½' => 'ð©ª',
'ð©¾' => 'ð©Ž¢',
@@ -2617,12 +2834,22 @@ $zh2Hant = array(
'𩙮' => '䬘',
'𩙯' => 'ä¬',
'𩙰' => '𩙈',
+'ð©Ÿ¿' => 'ð©š›',
+'𩠀' => '𩚥',
+'ð© ' => 'ð©šµ',
+'𩠂' => '𩛆',
+'ð© ƒ' => 'ð©›©',
'ð© …' => 'ð©Ÿ',
'𩠆' => '𩜦',
'ð© ‡' => 'ä­€',
'ð© ˆ' => 'ä­ƒ',
+'𩠉' => '𩜇',
+'𩠊' => '𩜵',
'ð© ‹' => 'ð©”',
'𩠌' => '餸',
+'ð© Ž' => 'ð©ž„',
+'ð© ' => '𩞦',
+'ð©  ' => 'ð© ´',
'𩧦' => '𩡺',
'𩧨' => '駎',
'𩧩' => '𩤊',
@@ -2649,14 +2876,20 @@ $zh2Hant = array(
'𩨄' => '騪',
'𩨅' => '𩤸',
'𩨆' => '𩤙',
+'𩨇' => '䮫',
'𩨈' => '騟',
'𩨉' => '𩤲',
'𩨊' => '騚',
'𩨋' => '𩥄',
'𩨌' => '𩥑',
'ð©¨' => '𩥇',
+'𩨎' => '龭',
'ð©¨' => '䮳',
'ð©¨' => '𩧆',
+'𩬣' => '𩭙',
+'𩬤' => '𩰀',
+'𩯒' => '𩯳',
+'𩲒' => '𩳤',
'𩽹' => '魥',
'𩽺' => '𩵩',
'𩽻' => '𩵹',
@@ -2666,6 +2899,7 @@ $zh2Hant = array(
'𩽿' => '𩶰',
'𩾀' => '鮕',
'ð©¾' => '鯄',
+'𩾂' => '䲖',
'𩾃' => '鮸',
'𩾄' => '𩷰',
'𩾅' => '𩸃',
@@ -2699,6 +2933,8 @@ $zh2Hant = array(
'𪎊' => '麨',
'𪎋' => '䴴',
'𪎌' => '麳',
+'ðªŽ' => '𪋿',
+'𪔭' => '𪔵',
'ðªš' => '𪘀',
'ðªš' => '𪘯',
'ðªž' => '凙',
@@ -2715,7 +2951,7 @@ $zh2Hant = array(
'𫌀' => '襀',
'𫌨' => '覼',
'ð«™' => '訑',
-'ð«Ÿ' => '𧦧',
+'ð«Ÿ' => 'è©‘',
'ð«¢' => 'è­Š',
'ð«°' => 'è«°',
'ð«²' => 'è¬',
@@ -2728,6 +2964,7 @@ $zh2Hant = array(
'𫓧' => '鈇',
'ð«“©' => 'é¦',
'𫔎' => 'é',
+'𫖸' => '願',
'𫗠' => '餦',
'𫗦' => '餔',
'𫗧' => '餗',
@@ -3993,7 +4230,6 @@ $zh2Hant = array(
'优游' => '優éŠ',
'兀术' => '兀朮',
'元凶' => '元兇',
-'充饥' => '充饑',
'兆个' => '兆個',
'兆余' => '兆餘',
'凶刀' => '兇刀',
@@ -4144,7 +4380,6 @@ $zh2Hant = array(
'出于' => '出於',
'出游' => '出éŠ',
'出丑' => '出醜',
-'出锤' => '出鎚',
'分å ' => '分佔',
'分别致' => '分别致',
'分åŠé’Ÿ' => '分åŠé˜',
@@ -4393,6 +4628,7 @@ $zh2Hant = array(
'å¤ä¹¦äº‘' => 'å¤æ›¸äº‘',
'å¤æ›¸äº‘' => 'å¤æ›¸äº‘',
'å¤æŸ¯å’¸' => 'å¤æŸ¯é¹¹',
+'å¤æŸ¯ç¢±' => 'å¤æŸ¯é¹¼',
'å¤æœ´' => 'å¤æ¨¸',
'å¤è¯­äº‘' => 'å¤èªžäº‘',
'å¤èªžäº‘' => 'å¤èªžäº‘',
@@ -4617,8 +4853,8 @@ $zh2Hant = array(
'严于' => '嚴於',
'严ä¸åˆç¼' => 'åš´çµ²åˆç¸«',
'嚼谷' => '嚼穀',
-'囉囉è‹è‹' => '囉囉囌囌',
-'囉è‹' => '囉囌',
+'å•°å•°è‹è‹' => '囉囉囌囌',
+'å•°è‹' => '囉囌',
'嘱托' => '囑託',
'四个' => '四個',
'四出刊' => '四出刊',
@@ -4815,7 +5051,6 @@ $zh2Hant = array(
'大赞' => '大讚',
'大周折' => '大週摺',
'大金å‘è‹”' => '大金髮苔',
-'大锤' => '大鎚',
'大钟' => '大é˜',
'大åª' => '大隻',
'大风åŽ' => '大風後',
@@ -4836,6 +5071,7 @@ $zh2Hant = array(
'天文钟' => '天文é˜',
'天历' => '天曆',
'天历å²' => '天歷å²',
+'天然碱' => '天然鹼',
'天翻地覆' => '天翻地覆',
'天覆地载' => '天覆地載',
'太仆' => '太僕',
@@ -4885,7 +5121,6 @@ $zh2Hant = array(
'好丑' => '好醜',
'好斗' => '好鬥',
'如果干' => '如果幹',
-'如饥似渴' => '如饑似渴',
'妖åŽ' => '妖åŽ',
'妙è¯' => '妙藥',
'始于' => '始於',
@@ -5279,6 +5514,7 @@ $zh2Hant = array(
'弘历å²' => '弘歷å²',
'弱于' => '弱於',
'弱水三åƒåªå–一瓢' => '弱水三åƒåªå–一瓢',
+'弱碱' => '弱鹼',
'张三丰' => '張三丰',
'張三丰' => '張三丰',
'张勋' => '張勳',
@@ -5288,6 +5524,7 @@ $zh2Hant = array(
'强奸' => '強姦',
'强干' => '強幹',
'强于' => '強於',
+'强碱' => '強鹼',
'别å£æ°”' => '彆å£æ°£',
'别强' => '彆強',
'别扭' => '彆扭',
@@ -5686,6 +5923,7 @@ $zh2Hant = array(
'抗癌è¯' => '抗癌藥',
'抗御' => '抗禦',
'抗è¯' => '抗藥',
+'抗碱' => '抗鹼',
'折å‘å¾€' => '折å‘å¾€',
'折å­æˆ' => '折å­æˆ²',
'折戟沈河' => '折戟沈河',
@@ -5824,7 +6062,7 @@ $zh2Hant = array(
'挂å' => '掛å',
'挂帘' => '掛帘',
'挂历' => '掛曆',
-'挂钩' => '掛鈎',
+'挂鈎' => '掛鈎',
'挂钟' => '掛é˜',
'采下' => '採下',
'采ä¼' => '採ä¼',
@@ -6528,12 +6766,14 @@ $zh2Hant = array(
'水里浊水溪' => '水里æ¿æ°´æºª',
'水里鄉' => '水里鄉',
'水里乡' => '水里鄉',
+'水碱' => '水鹼',
'永历' => '永曆',
'永历å²' => '永歷å²',
'永志ä¸å¿˜' => '永誌ä¸å¿˜',
'求知欲' => '求知慾',
'求签' => '求籤',
'求é“于盲' => '求é“於盲',
+'汗碱' => '汗鹼',
'池里' => '池裡',
'污蔑' => '污衊',
'汲于' => '汲於',
@@ -6716,6 +6956,7 @@ $zh2Hant = array(
'准è¯' => '準話',
'准谱' => '準譜',
'准货å¸' => '準貨幣',
+'准军事' => '準è»äº‹',
'准头' => '準頭',
'准点' => '準點',
'溟蒙' => '溟濛',
@@ -6725,16 +6966,8 @@ $zh2Hant = array(
'滃éƒ' => '滃鬱',
'滑借' => '滑藉',
'汇丰' => 'æ»™è±',
-'å¤å‘³' => '滷味',
-'å¤æ°´' => 'æ»·æ°´',
-'å¤æ±' => 'æ»·æ±',
-'å¤æ¹–' => 'æ»·æ¹–',
-'å¤è‚‰' => '滷肉',
-'å¤èœ' => 'æ»·èœ',
-'å¤è›‹' => '滷蛋',
-'å¤åˆ¶' => '滷製',
-'å¤é¸¡' => '滷雞',
-'å¤é¢' => '滷麵',
+'滷制' => '滷製',
+'æ»·é¢' => '滷麵',
'满拼自尽' => '滿拚自盡',
'满满当当' => '滿滿當當',
'满头洋å‘' => '滿頭洋髮',
@@ -6830,6 +7063,7 @@ $zh2Hant = array(
'ç…Žé¢' => '煎麵',
'烟å·' => 'ç…™æ²',
'烟斗ä¸' => '煙斗絲',
+'烟碱' => '煙鹼',
'ç…§å ' => '照佔',
'照入签' => '照入籤',
'照准' => '照準',
@@ -6839,9 +7073,10 @@ $zh2Hant = array(
'熊æ°' => '熊æ°',
'è§éƒ' => '熒鬱',
'熬è¯' => '熬藥',
-'ç‚–è¯' => '燉藥',
+'燉è¯' => '燉藥',
'燎å‘' => '燎髮',
'烧干' => '燒乾',
+'烧碱' => '燒鹼',
'燕几' => '燕几',
'燕巢于幕' => '燕巢於幕',
'燕燕于飞' => '燕燕于飛',
@@ -7014,7 +7249,7 @@ $zh2Hant = array(
'å‘æ¾' => '發鬆',
'å‘é¢' => '發麵',
'白干' => '白乾',
-'白兔擣è¯' => '白兔擣藥',
+'白兔ð¢­è¯' => '白兔擣藥',
'白干儿' => '白干兒',
'白术' => '白朮',
'白朴' => '白樸',
@@ -7148,6 +7383,7 @@ $zh2Hant = array(
'石英钟表' => '石英é˜éŒ¶',
'石莼' => '石蓴',
'石钟乳' => '石é˜ä¹³',
+'石碱' => '石鹼',
'矽谷' => '矽谷',
'研制' => '研製',
'砰当' => '砰噹',
@@ -7158,6 +7394,7 @@ $zh2Hant = array(
'朱红色' => '硃紅色',
'朱色' => '硃色',
'朱谕' => '硃諭',
+'硫化碱' => '硫化鹼',
'硬干' => '硬幹',
'确瘠' => '确瘠',
'碑志' => '碑誌',
@@ -7266,7 +7503,6 @@ $zh2Hant = array(
'积æžå‚加' => 'ç©æžåƒåŠ ',
'积淀' => 'ç©æ¾±',
'积谷' => 'ç©ç©€',
-'积谷防饥' => 'ç©ç©€é˜²é¥‘',
'积éƒ' => 'ç©é¬±',
'稳å ' => 'ç©©ä½”',
'稳扎' => '穩紮',
@@ -7403,6 +7639,7 @@ $zh2Hant = array(
'纡éƒ' => '紆鬱',
'纳å¾' => 'ç´å¾µ',
'纯朴' => '純樸',
+'纯碱' => '純鹼',
'纸扎' => '紙紮',
'素朴' => '素樸',
'ç´ å‘' => 'ç´ é«®',
@@ -7598,6 +7835,7 @@ $zh2Hant = array(
'考试' => '考試',
'而克制' => '而剋制',
'è€æ–—' => 'è€é¬¥',
+'è€ç¢±' => 'è€é¹¼',
'耕佣' => '耕傭',
'耕获' => '耕穫',
'耳余' => '耳餘',
@@ -7731,6 +7969,7 @@ $zh2Hant = array(
'花马åŠå˜´' => '花馬弔嘴',
'花哄' => '花鬨',
'苑里' => '苑裡',
+'苛性碱' => '苛性鹼',
'若干' => '若干',
'苦干' => '苦幹',
'苦è¯' => '苦藥',
@@ -7761,7 +8000,7 @@ $zh2Hant = array(
'è‰è¯' => 'è‰è—¥',
'èå±…' => 'èå±…',
'è臻' => 'è臻',
-'è饥' => 'è饑',
+'è饑' => 'è饑',
'è·èŠ±æ·€' => 'è·èŠ±æ¾±',
'庄上' => '莊上',
'庄主' => '莊主',
@@ -7795,6 +8034,7 @@ $zh2Hant = array(
'è èå¹²' => 'è è˜¿ä¹¾',
'åŽä¸¥é’Ÿ' => 'è¯åš´é˜',
'åŽå‘' => 'è¯é«®',
+'è¸ç¢±' => 'è¸é¹¼',
'è¬ä¸€åª' => 'è¬ä¸€åª',
'万一åª' => 'è¬ä¸€åª',
'万个' => 'è¬å€‹',
@@ -7874,7 +8114,7 @@ $zh2Hant = array(
'姜饼' => '薑餅',
'姜黄' => '薑黃',
'è–™å‘' => '薙髮',
-'è–åœ' => 'è–è””',
+'è–è””' => 'è–è””',
'苧悴' => '薴悴',
'薴烯' => '薴烯',
'苧烯' => '薴烯',
@@ -7961,8 +8201,7 @@ $zh2Hant = array(
'è•´å«ç€' => '蘊å«è‘—',
'蕴涵ç€' => '蘊涵著',
'苹果干' => '蘋果乾',
-'èåœ' => '蘿蔔',
-'èåœå¹²' => '蘿蔔乾',
+'è蔔干' => '蘿蔔乾',
'虎须' => '虎鬚',
'虎斗' => '虎鬥',
'å·å¿—' => '號誌',
@@ -7982,7 +8221,7 @@ $zh2Hant = array(
'è›å¹²' => '蟶乾',
'èšåŽ' => '蟻åŽ',
'蟻åŽ' => '蟻åŽ',
-'è å¹²' => 'è å¹¹',
+'蚃干' => 'è å¹¹',
'蛮干' => '蠻幹',
'血拼' => '血拚',
'血余' => '血餘',
@@ -8378,7 +8617,6 @@ $zh2Hant = array(
'资金å ç”¨' => '資金å ç”¨',
'è´¾åŽ' => '賈åŽ',
'賈åŽ' => '賈åŽ',
-'赈饥' => '賑饑',
'èµèµž' => '賞讚',
'è´¤åŽ' => 'è³¢åŽ',
'è³¢åŽ' => 'è³¢åŽ',
@@ -8654,6 +8892,7 @@ $zh2Hant = array(
'酒醴曲蘖' => '酒醴麴櫱',
'酒曲' => '酒麴',
'é…¥æ¾' => '酥鬆',
+'酸碱' => '酸鹼',
'醇朴' => '醇樸',
'醉于' => '醉於',
'醋å›' => '醋罈',
@@ -8728,7 +8967,6 @@ $zh2Hant = array(
'é‡å¤' => 'é‡è¤‡',
'é‡æ‰˜' => 'é‡è¨—',
'é‡æ¸¸' => 'é‡éŠ',
-'é‡é”¤' => 'é‡éŽš',
'野姜' => '野薑',
'野游' => '野éŠ',
'厘出' => 'é‡å‡º',
@@ -8755,10 +8993,10 @@ $zh2Hant = array(
'金装玉里' => '金è£çŽ‰è£¡',
'金表' => '金錶',
'金钟' => '金é˜',
+'金鸡纳碱' => '金雞ç´é¹¼',
'金马仑é“' => '金馬崙é“',
'金å‘' => '金髮',
-'钉锤' => '釘鎚',
-'钩心斗角' => '鈎心鬥角',
+'鈎心斗角' => '鈎心鬥角',
'银朱' => '銀硃',
'银å‘' => '銀髮',
'铜范' => '銅範',
@@ -8776,7 +9014,7 @@ $zh2Hant = array(
'钱谷' => '錢穀',
'钱范' => '錢範',
'钱庄' => '錢莊',
-'锦绣花园' => '錦綉花園',
+'锦綉花园' => '錦綉花園',
'锦绣' => '錦繡',
'表åœ' => '錶åœ',
'表冠' => '錶冠',
@@ -8813,9 +9051,6 @@ $zh2Hant = array(
'锻炼出' => 'é›éŠå‡º',
'锲而ä¸èˆ' => 'é¥è€Œä¸æ¨',
'镰仓' => '鎌倉',
-'锤儿' => '鎚兒',
-'锤å­' => '鎚å­',
-'锤头' => '鎚頭',
'锈病' => 'é½ç—…',
'锈èŒ' => 'é½èŒ',
'锈蚀' => 'é½è•',
@@ -8895,7 +9130,6 @@ $zh2Hant = array(
'钟鼓' => 'é˜é¼“',
'é“æ†' => 'éµæ†',
'é“æ æ†' => 'éµæ¬„æ†',
-'é“锤' => 'éµéŽš',
'é“锈' => 'éµé½',
'é“é’Ÿ' => 'éµé˜',
'铸钟' => 'é‘„é˜',
@@ -9297,13 +9531,8 @@ $zh2Hant = array(
'喂鱼' => '餵魚',
'喂鸭' => '餵鴨',
'å–‚é¹…' => '餵éµ',
-'饥寒' => '饑寒',
-'饥民' => '饑民',
-'饥渴' => '饑渴',
-'饥溺' => '饑溺',
-'饥è’' => '饑è’',
-'饥饱' => '饑飽',
-'饥馑' => '饑饉',
+'饑è’' => '饑è’',
+'饑馑' => '饑饉',
'首当其冲' => '首當其è¡',
'首å‘' => '首發',
'首åª' => '首隻',
@@ -9580,7 +9809,7 @@ $zh2Hant = array(
'鱼干' => '魚乾',
'é±¼æ¾' => '魚鬆',
'鲸须' => '鯨鬚',
-'鲇鱼' => '鯰魚',
+'鯰鱼' => '鯰魚',
'鸠å é¹Šå·¢' => '鳩佔鵲巢',
'凤凰于飞' => '鳳凰于飛',
'凤梨干' => '鳳梨乾',
@@ -9623,9 +9852,22 @@ $zh2Hant = array(
'咸鸭蛋' => '鹹鴨蛋',
'å’¸å¤' => '鹹鹵',
'咸咸' => '鹹鹹',
+'碱化' => '鹼化',
+'碱土金属' => '鹼土金屬',
+'碱地' => '鹼地',
+'碱度' => '鹼度',
+'碱性' => '鹼性',
+'碱水' => '鹼水',
+'碱液' => '鹼液',
+'碱熔' => '鹼熔',
+'碱石ç°' => '鹼石ç°',
+'碱纤维素' => '鹼纖維素',
+'碱金属' => '鹼金屬',
+'碱类' => '鹼類',
'ç›æ‰“怎么咸' => '鹽打怎麼鹹',
-'ç›å¤' => '鹽滷',
'ç›ä½™' => '鹽餘',
+'ç›ç¢±åœŸ' => '鹽鹼土',
+'ç›ç¢±æ»©' => '鹽鹼ç˜',
'丽于' => '麗於',
'曲尘' => '麴塵',
'曲蘖' => '麴櫱',
@@ -9778,18 +10020,90 @@ $zh2Hant = array(
);
$zh2Hans = array(
+'㑯' => '㑔',
+'㑳' => '㑇',
+'㒓' => '𠉂',
+'㓨' => '刾',
+'ã—²' => 'ð µ¾',
+'㘚' => '㘎',
+'㜄' => '㚯',
+'ãœ' => '㛣',
+'㜢' => '𡞱',
+'㜷' => 'ð¡ ',
'㞞' => '𪨊',
'ã ' => '㟆',
+'ã¢' => '𢋈',
+'㥮' => '㤘',
+'㦎' => '𢛯',
'㩜' => '㨫',
+'㩳' => 'ã§',
+'㷿' => '𤈷',
+'ãº' => '𤠋',
+'㿧' => '𤽯',
+'䀹' => '𥅴',
+'äª' => '𥇢',
+'ä»' => '䀥',
+'䉙' => '𥬀',
'䉬' => '𫂈',
+'䉲' => '𥮜',
+'䊭' => '𥺅',
'䊷' => '䌶',
'䋙' => '䌺',
+'䋚' => '䌻',
'䋻' => '䌾',
+'䋿' => '𦈓',
+'䌈' => '𦈖',
+'䌋' => '𦈘',
+'䌖' => '𦈜',
+'äŒ' => '𦈟',
+'䌟' => '𦈞',
+'䌥' => '𦈠',
+'䌰' => '𦈙',
+'䕳' => '𦰴',
+'䗿' => '𧉞',
+'䙡' => '䙌',
+'䜀' => '䜧',
+'ä»' => '𧹕',
'ä¼' => 'äž',
+'䞈' => '𧹑',
+'䢨' => '𨑹',
+'䥇' => '䦂',
+'䥩' => '𨱖',
+'䥱' => '䥾',
+'䦘' => '𨸄',
+'䦛' => '䦶',
+'䦟' => '䦷',
+'䦳' => '𨷿',
+'䧢' => '𨸟',
+'äª' => 'ð©¼',
+'䪗' => 'ð©€',
+'䪘' => 'ð©¿',
+'ä«´' => 'ð©–—',
+'䬘' => '𩙮',
+'ä¬' => '𩙯',
+'䬞' => '𩙧',
+'ä­€' => 'ð© ‡',
+'ä­ƒ' => 'ð© ˆ',
+'䭿' => '𩧭',
+'ä®' => '𩧰',
+'䮞' => 'ð©¨',
+'䮠' => '𩧿',
+'䮫' => '𩨇',
+'䮳' => 'ð©¨',
+'䮾' => '𩧪',
'䯀' => '䯅',
'䰾' => '鲃',
+'䱙' => '𩾈',
+'䱬' => '𩾊',
+'䱰' => '𩾋',
+'ä±·' => 'ä²£',
'ä±½' => 'ä²',
'ä²' => '鳚',
+'䲖' => '𩾂',
+'䲰' => '𪉂',
+'ä´‰' => 'é¹®',
+'䴬' => '𪎈',
+'䴴' => '𪎋',
'丟' => '丢',
'並' => '并',
'ä¹¾' => 'å¹²',
@@ -9807,6 +10121,7 @@ $zh2Hans = array(
'ä¿‚' => 'ç³»',
'ä¿”' => 'ä¼£',
'ä¿ ' => 'ä¾ ',
+'俥' => '伡',
'倀' => '伥',
'倆' => '俩',
'倈' => '俫',
@@ -9815,7 +10130,9 @@ $zh2Hans = array(
'們' => '们',
'倖' => '幸',
'倫' => '伦',
+'倲' => '㑈',
'å‰' => '伟',
+'å‘' => 'ã½',
'å´' => '侧',
'åµ' => '侦',
'å½' => '伪',
@@ -9851,6 +10168,7 @@ $zh2Hans = array(
'儕' => '侪',
'儘' => '尽',
'å„Ÿ' => 'å¿',
+'儣' => '𠆲',
'優' => '优',
'儲' => '储',
'儷' => '俪',
@@ -9884,6 +10202,7 @@ $zh2Hans = array(
'剴' => '剀',
'創' => '创',
'剷' => '铲',
+'剾' => '𠛅',
'劃' => '划',
'劇' => '剧',
'劉' => '刘',
@@ -9914,7 +10233,6 @@ $zh2Hans = array(
'å»' => 'å´',
'å½' => 'å³',
'厙' => 'åŽ',
-'厠' => '厕',
'厤' => '历',
'厭' => '厌',
'厲' => '厉',
@@ -9928,10 +10246,10 @@ $zh2Hans = array(
'å‘‚' => 'å•',
'å’¼' => 'å‘™',
'員' => '员',
+'哯' => '𠯟',
'唄' => '呗',
'唚' => 'å£',
'å•' => 'é—®',
-'å•“' => 'å¯',
'å•ž' => 'å“‘',
'å•Ÿ' => 'å¯',
'啢' => '唡',
@@ -9952,6 +10270,7 @@ $zh2Hans = array(
'å—¹' => 'ðª¡',
'嘆' => 'å¹',
'å˜' => 'å–½',
+'嘓' => '啯',
'嘔' => '呕',
'嘖' => '啧',
'嘗' => 'å°',
@@ -9964,6 +10283,7 @@ $zh2Hans = array(
'嘸' => '呒',
'嘽' => '啴',
'å™' => 'æ¶',
+'å™…' => 'ð ¯ ',
'噓' => '嘘',
'噚' => '㖊',
'å™' => 'å’',
@@ -9994,6 +10314,7 @@ $zh2Hans = array(
'囂' => '嚣',
'å›…' => 'å†',
'囈' => '呓',
+'囉' => '啰',
'囌' => 'è‹',
'囑' => '嘱',
'囪' => '囱',
@@ -10031,7 +10352,6 @@ $zh2Hans = array(
'墮' => '堕',
'墰' => 'å›',
'墳' => 'åŸ',
-'墻' => '墙',
'墾' => '垦',
'壇' => 'å›',
'壈' => '𡒄',
@@ -10058,7 +10378,6 @@ $zh2Hans = array(
'奧' => '奥',
'奩' => 'å¥',
'奪' => '夺',
-'奬' => '奖',
'奮' => '奋',
'奼' => '姹',
'å¦' => '妆',
@@ -10070,13 +10389,14 @@ $zh2Hans = array(
'婭' => '娅',
'媧' => '娲',
'媯' => '妫',
+'媰' => '㛀',
'媼' => '媪',
'媽' => '妈',
'嫗' => '妪',
'嫵' => '妩',
'嫻' => '娴',
'嫿' => '婳',
-'嬀' => '妫',
+'嬃' => '媭',
'嬈' => '娆',
'嬋' => '婵',
'嬌' => '娇',
@@ -10086,6 +10406,7 @@ $zh2Hans = array(
'嬪' => '嫔',
'嬰' => '婴',
'嬸' => '婶',
+'孋' => '㛤',
'孌' => '娈',
'å­«' => 'å­™',
'å­¸' => 'å­¦',
@@ -10127,6 +10448,7 @@ $zh2Hans = array(
'å´¬' => 'å²½',
'åµ' => '岚',
'åµ—' => 'å²',
+'嵼' => '𡶴',
'å¶' => 'åµ',
'嶄' => '崭',
'嶇' => '岖',
@@ -10188,7 +10510,9 @@ $zh2Hans = array(
'彎' => '弯',
'彙' => '汇',
'彞' => 'å½',
+'彠' => '彟',
'彥' => '彦',
+'彲' => '彨',
'後' => 'åŽ',
'徑' => '径',
'從' => '从',
@@ -10219,7 +10543,6 @@ $zh2Hans = array(
'慚' => '惭',
'æ…Ÿ' => 'æ¸',
'慣' => '惯',
-'æ…¤' => 'æ‚«',
'慪' => '怄',
'慫' => '怂',
'慮' => '虑',
@@ -10238,6 +10561,7 @@ $zh2Hans = array(
'憮' => '怃',
'憲' => '宪',
'憶' => '忆',
+'懀' => '𢙓',
'懇' => 'æ³',
'應' => '应',
'懌' => '怿',
@@ -10273,6 +10597,7 @@ $zh2Hans = array(
'æ²' => 'å·',
'掃' => '扫',
'掄' => '抡',
+'掆' => 'ã§',
'掗' => '挜',
'掙' => '挣',
'掛' => '挂',
@@ -10286,6 +10611,7 @@ $zh2Hans = array(
'æ—' => 'æ£',
'æµ' => 'æ¾',
'æ¶' => '抢',
+'摋' => '𢫬',
'摑' => '掴',
'摜' => '掼',
'æ‘Ÿ' => 'æ‚',
@@ -10317,6 +10643,7 @@ $zh2Hans = array(
'æ“”' => 'æ‹…',
'æ“š' => 'æ®',
'擠' => '挤',
+'æ“£' => 'ð¢­',
'擬' => '拟',
'擯' => '摈',
'擰' => '拧',
@@ -10327,6 +10654,7 @@ $zh2Hans = array(
'擺' => '摆',
'æ“»' => 'æ“ž',
'擼' => '撸',
+'擽' => '㧰',
'擾' => '扰',
'攄' => '摅',
'攆' => '撵',
@@ -10348,6 +10676,8 @@ $zh2Hans = array(
'數' => '数',
'æ–‚' => 'æ•›',
'斃' => '毙',
+'斅' => '𢽾',
+'æ–†' => 'æ•©',
'æ–•' => 'æ–“',
'æ–¬' => 'æ–©',
'æ–·' => 'æ–­',
@@ -10370,10 +10700,12 @@ $zh2Hans = array(
'æ›' => 'å‘',
'曖' => '暧',
'æ› ' => 'æ—·',
+'曥' => 'ð£†',
'曨' => '昽',
'曬' => '晒',
'書' => '书',
'會' => '会',
+'朥' => '𦛨',
'朧' => '胧',
'朮' => '术',
'æ±' => '东',
@@ -10390,10 +10722,12 @@ $zh2Hans = array(
'棖' => '枨',
'棗' => '枣',
'棟' => '栋',
+'棡' => '㭎',
'棧' => '栈',
'棲' => '栖',
'棶' => '梾',
'æ¤' => 'æ¡ ',
+'椲' => 'ã­',
'楊' => 'æ¨',
'楓' => '枫',
'楨' => '桢',
@@ -10411,6 +10745,8 @@ $zh2Hans = array(
'槧' => '椠',
'槨' => 'æ¤',
'槳' => '桨',
+'槶' => '椢',
+'槼' => 'æ¤',
'æ¨' => 'æ¡©',
'樂' => 'ä¹',
'樅' => '枞',
@@ -10418,10 +10754,14 @@ $zh2Hans = array(
'樓' => '楼',
'標' => '标',
'樞' => '枢',
+'樢' => '㭤',
'樣' => '样',
+'樫' => '㭴',
+'樳' => '桪',
'樸' => '朴',
'樹' => '树',
'樺' => '桦',
+'樿' => '椫',
'橈' => '桡',
'æ©‹' => 'æ¡¥',
'機' => '机',
@@ -10434,6 +10774,7 @@ $zh2Hans = array(
'檟' => '槚',
'檢' => '检',
'檣' => '樯',
+'檭' => '𣘴',
'檮' => '梼',
'檯' => 'å°',
'檳' => '槟',
@@ -10459,8 +10800,10 @@ $zh2Hans = array(
'欄' => 'æ ',
'欅' => '榉',
'權' => 'æƒ',
+'æ¬' => 'ð£¤',
'æ¬' => '椤',
'欒' => '栾',
+'欓' => '𣗋',
'欖' => '榄',
'欞' => '棂',
'欽' => '钦',
@@ -10483,7 +10826,6 @@ $zh2Hans = array(
'殰' => '㱩',
'殲' => '歼',
'殺' => 'æ€',
-'殻' => '壳',
'殼' => '壳',
'毀' => 'æ¯',
'毆' => '殴',
@@ -10517,6 +10859,7 @@ $zh2Hans = array(
'æ·º' => 'æµ…',
'渙' => '涣',
'減' => 'å‡',
+'渢' => '沨',
'渦' => '涡',
'測' => '测',
'渾' => '浑',
@@ -10528,6 +10871,7 @@ $zh2Hans = array(
'準' => '准',
'æº' => '沟',
'溫' => '温',
+'溳' => '涢',
'滄' => '沧',
'æ»…' => 'ç­',
'滌' => '涤',
@@ -10536,12 +10880,12 @@ $zh2Hans = array(
'滬' => '沪',
'滯' => '滞',
'滲' => '渗',
-'æ»·' => 'å¤',
'滸' => '浒',
'æ»»' => 'æµ',
'滾' => '滚',
'滿' => '满',
'æ¼' => '渔',
+'漊' => '溇',
'漚' => '沤',
'漢' => '汉',
'漣' => '涟',
@@ -10553,7 +10897,6 @@ $zh2Hans = array(
'æ½' => 'é¢',
'潑' => '泼',
'æ½”' => 'æ´',
-'潙' => '沩',
'潛' => '潜',
'潤' => '润',
'潯' => '浔',
@@ -10561,6 +10904,7 @@ $zh2Hans = array(
'æ½·' => 'æ»—',
'潿' => '涠',
'澀' => '涩',
+'澅' => '𣶩',
'澆' => '浇',
'澇' => 'æ¶',
'æ¾' => '沄',
@@ -10574,16 +10918,22 @@ $zh2Hans = array(
'æ¾¾' => 'ã³ ',
'æ¿' => '浊',
'濃' => '浓',
+'濄' => '㳡',
+'濆' => '𣸣',
'濕' => '湿',
'濘' => '泞',
+'濜' => '浕',
'濟' => '济',
'濤' => '涛',
+'濧' => '㳔',
'濫' => '滥',
'æ¿°' => 'æ½',
'濱' => '滨',
'濺' => '溅',
'濼' => '泺',
'濾' => '滤',
+'瀂' => '澛',
+'瀃' => '𣽷',
'瀅' => '滢',
'瀆' => '渎',
'瀇' => '㲿',
@@ -10606,8 +10956,10 @@ $zh2Hans = array(
'ç‘' => 'æ´’',
'ç•' => '漓',
'ç˜' => '滩',
+'ç™' => '𣺼',
'ç' => 'ç',
'ç ' => '漤',
+'ç¡' => '㳕',
'ç£' => 'æ¹¾',
'ç¤' => '滦',
'ç§' => '滟',
@@ -10625,14 +10977,17 @@ $zh2Hans = array(
'ç…¬' => 'ç‚€',
'煱' => '㶽',
'熅' => '煴',
+'熉' => '𤈶',
+'熌' => '𤇄',
'熒' => 'è§',
+'熓' => '𤆡',
'熗' => 'ç‚',
+'熡' => 'ð¤‹',
'熱' => '热',
'熲' => '颎',
'熾' => '炽',
'ç‡' => '烨',
'燈' => 'ç¯',
-'燉' => '炖',
'燒' => '烧',
'燙' => '烫',
'燜' => '焖',
@@ -10644,6 +10999,7 @@ $zh2Hans = array(
'燶' => '㶶',
'燼' => '烬',
'燾' => '焘',
+'爄' => '𤇃',
'çˆ' => 'çƒ',
'çˆ' => '炉',
'爛' => '烂',
@@ -10682,6 +11038,7 @@ $zh2Hans = array(
'ç»' => '献',
'ç¼' => '猕',
'玀' => '猡',
+'çŽ' => '𤞤',
'ç¾' => '现',
'çº' => 'ç',
'ç¿' => 'ç²',
@@ -10697,16 +11054,17 @@ $zh2Hans = array(
'璣' => '玑',
'ç’¦' => 'ç‘·',
'ç’«' => 'ç°',
+'ç’¯' => 'ã»…',
'環' => '环',
'璽' => '玺',
'ç“Š' => 'ç¼',
'ç“' => 'ç‘',
'ç“”' => 'ç’Ž',
+'瓕' => '𤦀',
'ç“š' => 'ç“’',
'甌' => '瓯',
'甕' => '瓮',
'產' => '产',
-'産' => '产',
'甦' => 'è‹',
'甯' => 'å®',
'ç•' => '亩',
@@ -10730,7 +11088,6 @@ $zh2Hans = array(
'瘮' => '瘆',
'瘲' => '疭',
'瘺' => '瘘',
-'瘻' => '瘘',
'療' => '疗',
'癆' => '痨',
'癇' => '痫',
@@ -10752,6 +11109,7 @@ $zh2Hans = array(
'癲' => '癫',
'發' => 'å‘',
'çšš' => 'çš‘',
+'皟' => '𤾀',
'çš°' => 'ç–±',
'皸' => '皲',
'皺' => '皱',
@@ -10773,6 +11131,7 @@ $zh2Hans = array(
'瞘' => 'çœ',
'çžœ' => 'ä–',
'çžž' => 'çž’',
+'瞤' => '𥆧',
'瞭' => '了',
'瞶' => '瞆',
'çž¼' => 'ç‘',
@@ -10786,19 +11145,24 @@ $zh2Hans = array(
'硨' => '砗',
'硯' => '砚',
'碕' => '埼',
+'碙' => 'ð¥»',
'碩' => '硕',
'碭' => '砀',
'碸' => '砜',
'確' => '确',
'碼' => 'ç ',
+'碽' => '䂵',
'磑' => '硙',
'磚' => '砖',
+'磠' => '硵',
'磣' => '碜',
'磧' => '碛',
'磯' => '矶',
'磽' => '硗',
+'礄' => '硚',
'礆' => '硷',
'礎' => '础',
+'礒' => 'ð¥Ÿ',
'礙' => 'ç¢',
'礦' => '矿',
'礪' => '砺',
@@ -10845,9 +11209,7 @@ $zh2Hans = array(
'竄' => '窜',
'ç«…' => 'çª',
'竇' => '窦',
-'竈' => 'ç¶',
'竊' => '窃',
-'竪' => '竖',
'競' => '竞',
'筆' => '笔',
'ç­' => '笋',
@@ -10861,6 +11223,7 @@ $zh2Hans = array(
'築' => '筑',
'篋' => '箧',
'篔' => '筼',
+'篘' => '𥬠',
'篤' => '笃',
'篩' => '筛',
'篳' => '筚',
@@ -10875,8 +11238,11 @@ $zh2Hans = array(
'ç°½' => 'ç­¾',
'簾' => '帘',
'籃' => '篮',
+'籋' => '𥬞',
'籌' => '筹',
+'籔' => '䉤',
'籙' => '箓',
+'籛' => '篯',
'籜' => '箨',
'籟' => 'ç±',
'籠' => '笼',
@@ -10949,14 +11315,14 @@ $zh2Hans = array(
'統' => '统',
'çµ²' => 'ä¸',
'çµ³' => 'ç»›',
-'絶' => 'ç»',
'絹' => '绢',
'絺' => '𫄨',
+'綀' => '𦈌',
'ç¶' => '绑',
'綃' => '绡',
'綆' => '绠',
+'綇' => '𦈋',
'綈' => '绨',
-'綉' => '绣',
'綌' => '绤',
'ç¶' => '绥',
'ç¶' => '䌼',
@@ -10973,7 +11339,6 @@ $zh2Hans = array(
'綰' => '绾',
'綱' => '纲',
'網' => '网',
-'綳' => '绷',
'綴' => '缀',
'綵' => '彩',
'綸' => '纶',
@@ -10987,10 +11352,9 @@ $zh2Hans = array(
'ç·‡' => 'ç¼',
'ç·Š' => 'ç´§',
'緋' => '绯',
-'緑' => '绿',
+'ç·' => 'ð¦ˆ',
'緒' => '绪',
'緓' => '绬',
-'ç·”' => 'ç»±',
'緗' => '缃',
'緘' => '缄',
'緙' => '缂',
@@ -11005,16 +11369,20 @@ $zh2Hans = array(
'緩' => '缓',
'ç·¬' => 'ç¼…',
'緯' => '纬',
+'緰' => '𦈕',
'緱' => '缑',
'緲' => '缈',
'練' => '练',
'ç·¶' => 'ç¼',
+'緷' => '𦈉',
+'緸' => '𦈑',
'緹' => '缇',
'緻' => '致',
'縈' => 'è¦',
'縉' => '缙',
'縊' => '缢',
'縋' => '缒',
+'縎' => '𦈔',
'ç¸' => '绉',
'縑' => '缣',
'縕' => '缊',
@@ -11024,8 +11392,8 @@ $zh2Hans = array(
'縞' => '缟',
'縟' => '缛',
'縣' => '县',
-'縧' => '绦',
'縫' => 'ç¼',
+'縬' => '𦈚',
'縭' => '缡',
'縮' => '缩',
'縱' => '纵',
@@ -11036,34 +11404,39 @@ $zh2Hans = array(
'縶' => '絷',
'縷' => '缕',
'縹' => '缥',
+'縺' => 'ð¦ˆ',
'總' => '总',
'績' => '绩',
'繃' => '绷',
'繅' => '缫',
'繆' => '缪',
+'ç¹' => 'ð¦ˆ',
'ç¹' => 'ç©—',
'繒' => '缯',
+'繓' => '𦈛',
'織' => '织',
'繕' => '缮',
'繚' => '缭',
'繞' => '绕',
+'繟' => '𦈎',
'繡' => '绣',
'繢' => '缋',
'繩' => '绳',
'繪' => '绘',
'繫' => '系',
'繭' => '茧',
-'ç¹®' => 'ç¼°',
'繯' => '缳',
'ç¹°' => 'ç¼²',
'ç¹³' => 'ç¼´',
'繸' => 'ä',
'繹' => '绎',
+'繻' => '𦈡',
'繼' => '继',
'繽' => '缤',
'ç¹¾' => 'ç¼±',
'繿' => 'ä€',
'çº' => '𫄸',
+'纇' => '颣',
'纈' => '缬',
'纊' => '纩',
'續' => '续',
@@ -11089,7 +11462,9 @@ $zh2Hans = array(
'羨' => '羡',
'義' => '义',
'ç¿’' => 'ä¹ ',
+'翬' => '翚',
'翹' => '翘',
+'翽' => '翙',
'耬' => '耧',
'耮' => '耢',
'è–' => '圣',
@@ -11109,18 +11484,22 @@ $zh2Hans = array(
'脈' => '脉',
'脛' => '胫',
'脣' => '唇',
+'è„¥' => 'ð£°',
'脫' => '脱',
'脹' => '胀',
'腎' => '肾',
'腖' => '胨',
'腡' => '脶',
'è…¦' => 'è„‘',
+'è…ª' => 'ð£¯',
'è…«' => 'è‚¿',
'è…³' => 'è„š',
'è…¸' => 'è‚ ',
'膃' => '腽',
+'膕' => '腘',
'膚' => '肤',
'膠' => '胶',
+'膢' => 'ð¦¼',
'膩' => '腻',
'膽' => '胆',
'膾' => 'è„',
@@ -11128,6 +11507,7 @@ $zh2Hans = array(
'臉' => '脸',
'è‡' => 'è„',
'è‡' => '膑',
+'臗' => '𣎑',
'臘' => '腊',
'臚' => '胪',
'臟' => 'è„',
@@ -11160,14 +11540,13 @@ $zh2Hans = array(
'è‡' => 'è‹Œ',
'èŠ' => '莱',
'è¬' => '万',
+'è´' => 'è',
'èµ' => '莴',
'葉' => 'å¶',
'è‘’' => 'è­',
'葤' => 'è®',
'葦' => '苇',
-'葯' => 'è¯',
'è‘·' => 'è¤',
-'蒓' => '莼',
'蒔' => '莳',
'蒞' => '莅',
'è’¼' => 'è‹',
@@ -11177,7 +11556,6 @@ $zh2Hans = array(
'蓯' => 'è‹',
'蓴' => '莼',
'蓽' => 'èœ',
-'è””' => 'åœ',
'蔘' => 'å‚',
'蔞' => '蒌',
'蔣' => '蒋',
@@ -11214,7 +11592,6 @@ $zh2Hans = array(
'è—' => '艺',
'è—¥' => 'è¯',
'è—ª' => 'è–®',
-'è—´' => 'è•´',
'藶' => '苈',
'藹' => '蔼',
'藺' => '蔺',
@@ -11258,6 +11635,7 @@ $zh2Hans = array(
'蟲' => '虫',
'蟶' => 'è›',
'蟻' => 'èš',
+'è ' => '蚃',
'è …' => 'è‡',
'蠆' => '虿',
'è ' => 'èŽ',
@@ -11269,14 +11647,12 @@ $zh2Hans = array(
'蠱' => '蛊',
'è ¶' => 'èš•',
'è »' => 'è›®',
-'衆' => '众',
'衊' => '蔑',
'術' => '术',
'è¡•' => 'åŒ',
'衚' => '胡',
'è¡›' => 'å«',
'è¡' => '冲',
-'衹' => 'åª',
'袞' => '衮',
'裊' => '袅',
'è£' => '里',
@@ -11293,7 +11669,7 @@ $zh2Hans = array(
'褻' => '亵',
'襀' => '𫌀',
'襆' => '幞',
-'襇' => '裥',
+'襉' => '裥',
'è¥' => '袯',
'襖' => '袄',
'è¥' => '裣',
@@ -11303,6 +11679,7 @@ $zh2Hans = array(
'襬' => '䙓',
'襯' => '衬',
'襲' => '袭',
+'襴' => '襕',
'見' => 'è§',
'覎' => '觃',
'è¦' => '规',
@@ -11354,10 +11731,12 @@ $zh2Hans = array(
'訶' => '诃',
'診' => '诊',
'註' => '注',
+'詀' => '𧮪',
'è©' => '诂',
'詆' => '诋',
'詎' => '讵',
'è©' => '诈',
+'è©‘' => 'ð«Ÿ',
'詒' => '诒',
'è©”' => 'è¯',
'評' => '评',
@@ -11403,7 +11782,6 @@ $zh2Hans = array(
'誦' => '诵',
'誨' => '诲',
'說' => '说',
-'説' => '说',
'誰' => 'è°',
'課' => '课',
'誶' => '谇',
@@ -11459,15 +11837,12 @@ $zh2Hans = array(
'講' => '讲',
'è¬' => 'è°¢',
'謠' => '谣',
-'謡' => '谣',
'謨' => '谟',
'謫' => '谪',
'謬' => '谬',
-'謭' => '谫',
'謳' => '讴',
'謹' => '谨',
'謾' => '谩',
-'譅' => '䜧',
'è­‰' => 'è¯',
'è­Š' => 'ð«¢',
'è­Ž' => 'è°²',
@@ -11488,6 +11863,8 @@ $zh2Hans = array(
'è­¾' => 'è°«',
'讀' => '读',
'變' => 'å˜',
+'讋' => '詟',
+'讌' => '䜩',
'讎' => '仇',
'è®’' => 'è°—',
'讓' => '让',
@@ -11546,6 +11923,7 @@ $zh2Hans = array(
'賚' => '赉',
'賜' => 'èµ',
'賞' => 'èµ',
+'賟' => '𧹖',
'è³ ' => 'èµ”',
'賡' => '赓',
'è³¢' => 'è´¤',
@@ -11554,7 +11932,6 @@ $zh2Hans = array(
'賦' => '赋',
'賧' => '赕',
'質' => '质',
-'賫' => 'èµ',
'賬' => '账',
'賭' => '赌',
'è³°' => 'äž',
@@ -11565,12 +11942,12 @@ $zh2Hans = array(
'è³¼' => 'è´­',
'è³½' => 'èµ›',
'賾' => '赜',
+'贃' => '𧹗',
'è´„' => 'è´½',
'贅' => '赘',
'贇' => '赟',
'è´ˆ' => 'èµ ',
'贊' => '赞',
-'è´‹' => 'èµ',
'è´' => '赡',
'è´' => 'èµ¢',
'è´' => '赆',
@@ -11579,7 +11956,6 @@ $zh2Hans = array(
'贖' => '赎',
'è´—' => 'èµ',
'è´›' => 'èµ£',
-'贜' => '赃',
'赬' => '赪',
'趕' => '赶',
'趙' => '赵',
@@ -11599,16 +11975,19 @@ $zh2Hans = array(
'躊' => '踌',
'躋' => '跻',
'èº' => 'è·ƒ',
+'躎' => '䟢',
'躑' => '踯',
'躒' => '跞',
'躓' => '踬',
'躕' => '蹰',
'躚' => '跹',
+'èº' => '𨅬',
'躡' => '蹑',
'躥' => '蹿',
'躦' => '躜',
'躪' => 'èº',
'軀' => '躯',
+'軉' => '𨉗',
'車' => '车',
'軋' => '轧',
'軌' => '轨',
@@ -11617,6 +11996,7 @@ $zh2Hans = array(
'軑' => '轪',
'軒' => '轩',
'軔' => '轫',
+'è»—' => 'ð¨…',
'è»›' => 'è½­',
'軟' => '软',
'軤' => '轷',
@@ -11630,6 +12010,7 @@ $zh2Hans = array(
'軼' => '轶',
'軾' => '轼',
'較' => '较',
+'輄' => 'ð¨ˆ',
'輅' => '辂',
'輇' => 'è¾',
'輈' => '辀',
@@ -11720,7 +12101,6 @@ $zh2Hans = array(
'鄺' => 'é‚',
'é…‡' => 'é…‚',
'酈' => '郦',
-'醖' => 'é…',
'醜' => '丑',
'醞' => 'é…',
'醣' => '糖',
@@ -11746,10 +12126,12 @@ $zh2Hans = array(
'釤' => 'é’',
'釧' => 'é’',
'釩' => '钒',
+'釳' => '𨰿',
'釵' => '钗',
'釷' => 'é’',
'釹' => '钕',
'釺' => '钎',
+'釾' => '䥺',
'鈀' => '钯',
'éˆ' => 'é’«',
'鈃' => '钘',
@@ -11757,20 +12139,23 @@ $zh2Hans = array(
'鈇' => '𫓧',
'鈈' => '钚',
'鈉' => '钠',
+'鈋' => '𨱂',
'éˆ' => 'é’',
-'鈎' => '钩',
'éˆ' => 'é’¤',
'鈑' => '钣',
'鈒' => '钑',
'鈔' => '钞',
'鈕' => '钮',
'鈞' => '钧',
+'鈠' => 'ð¨±',
'鈣' => '钙',
'鈥' => '钬',
'鈦' => '钛',
'鈧' => '钪',
'鈮' => '铌',
+'鈯' => '𨱄',
'鈰' => '铈',
+'鈲' => '𨱃',
'鈳' => '钶',
'鈴' => '铃',
'鈷' => '钴',
@@ -11781,6 +12166,7 @@ $zh2Hans = array(
'鈾' => '铀',
'鈿' => '钿',
'鉀' => '钾',
+'é‰' => '𨱅',
'鉅' => '钜',
'鉈' => '铊',
'鉉' => '铉',
@@ -11792,7 +12178,6 @@ $zh2Hans = array(
'鉚' => '铆',
'鉛' => '铅',
'鉞' => '钺',
-'鉢' => '钵',
'鉤' => '钩',
'鉦' => '钲',
'鉬' => '钼',
@@ -11824,14 +12209,15 @@ $zh2Hans = array(
'銬' => 'é“',
'銱' => '铞',
'銳' => 'é”',
+'銶' => '𨱇',
'銷' => '销',
-'銹' => '锈',
'銻' => '锑',
'銼' => '锉',
'é‹' => 'é“',
'鋃' => '锒',
'鋅' => '锌',
'鋇' => '钡',
+'鋉' => '𨱈',
'鋌' => '铤',
'é‹' => 'é“—',
'鋒' => '锋',
@@ -11845,7 +12231,6 @@ $zh2Hans = array(
'鋨' => '锇',
'é‹©' => 'é““',
'鋪' => '铺',
-'é‹­' => 'é”',
'é‹®' => 'é“–',
'鋯' => '锆',
'鋰' => '锂',
@@ -11854,6 +12239,7 @@ $zh2Hans = array(
'鋸' => '锯',
'鋼' => '钢',
'éŒ' => '锞',
+'錂' => '𨱋',
'錄' => '录',
'錆' => '锖',
'錇' => '锫',
@@ -11876,13 +12262,12 @@ $zh2Hans = array(
'錫' => '锡',
'錮' => '锢',
'錯' => '错',
-'録' => '录',
'錳' => '锰',
'錶' => '表',
'錸' => '铼',
'é€' => 'é”',
-'é' => '锨',
'éƒ' => '锪',
+'é„' => '𨱉',
'é†' => 'é’”',
'é‡' => 'é”´',
'éˆ' => '锳',
@@ -11898,6 +12283,7 @@ $zh2Hans = array(
'é¥' => '锲',
'é©' => '锘',
'é¬' => '锹',
+'é®' => '𨱎',
'é°' => '锾',
'éµ' => 'é”®',
'é¶' => '锶',
@@ -11911,7 +12297,6 @@ $zh2Hans = array(
'鎔' => '镕',
'鎖' => 'é”',
'鎘' => '镉',
-'鎚' => '锤',
'鎛' => '镈',
'éŽ' => 'ð¨±',
'鎡' => '镃',
@@ -11924,15 +12309,18 @@ $zh2Hans = array(
'鎬' => 'é•',
'鎭' => '鎮',
'鎮' => '镇',
+'鎯' => 'ð¨±',
'鎰' => '镒',
'鎲' => '镋',
'鎳' => 'é•',
'鎵' => '镓',
-'鎸' => '镌',
+'鎷' => '𨰾',
'鎿' => '镎',
'éƒ' => 'é•ž',
+'é†' => '𨱌',
'é‡' => 'é•Ÿ',
'éˆ' => '链',
+'é‰' => '𨱒',
'éŒ' => '镆',
'é' => 'é•™',
'é' => 'é• ',
@@ -11953,23 +12341,28 @@ $zh2Hans = array(
'éµ' => '铧',
'é·' => '镤',
'é¹' => '镪',
+'éº' => '䥽',
'é½' => '锈',
'éƒ' => 'é“™',
+'é„' => '𨱑',
'é‹' => 'é“´',
'é' => '𫔎',
+'éŽ' => '𨱓',
+'é' => '𨱔',
'é' => 'é•£',
'é’' => '铹',
'é“' => '镦',
'é”' => 'é•¡',
'é˜' => 'é’Ÿ',
'é™' => 'é•«',
-'é' => 'é•¢',
'é ' => '镨',
+'é¥' => '䦅',
'é¦' => '锎',
'é§' => 'é”',
'é¨' => 'é•„',
'é«' => 'é•Œ',
'é®' => 'é•°',
+'é¯' => '䦃',
'é²' => '镯',
'é³' => 'é•­',
'éµ' => 'é“',
@@ -12009,8 +12402,10 @@ $zh2Hans = array(
'é–‰' => 'é—­',
'é–‹' => 'å¼€',
'閌' => '闶',
+'é–' => '𨸂',
'é–Ž' => 'é—³',
'é–' => 'é—°',
+'é–' => '𨸃',
'é–‘' => 'é—²',
'é–’' => 'é—²',
'é–“' => 'é—´',
@@ -12026,7 +12421,6 @@ $zh2Hans = array(
'閬' => '阆',
'é–­' => 'é—¾',
'閱' => '阅',
-'閲' => '阅',
'閶' => '阊',
'閹' => '阉',
'閻' => '阎',
@@ -12142,7 +12536,7 @@ $zh2Hans = array(
'頸' => '颈',
'頹' => '颓',
'頻' => '频',
-'頽' => '颓',
+'顃' => '𩖖',
'顆' => '颗',
'題' => '题',
'é¡' => 'é¢',
@@ -12150,7 +12544,6 @@ $zh2Hans = array(
'é¡' => '颜',
'顒' => '颙',
'顓' => '颛',
-'顔' => '颜',
'願' => '愿',
'顙' => '颡',
'顛' => '颠',
@@ -12169,13 +12562,16 @@ $zh2Hans = array(
'颭' => 'é£',
'颮' => '飑',
'颯' => '飒',
+'颰' => '𩙥',
'颱' => 'å°',
'颳' => '刮',
'颶' => '飓',
+'颷' => '𩙪',
'颸' => '飔',
'颺' => 'é£',
'颻' => '飖',
'颼' => '飕',
+'颾' => '𩙫',
'飀' => '飗',
'飄' => '飘',
'飆' => '飙',
@@ -12226,6 +12622,7 @@ $zh2Hans = array(
'餵' => '喂',
'餶' => '馉',
'餷' => '馇',
+'餸' => '𩠌',
'餺' => '馎',
'餼' => '饩',
'餾' => 'é¦',
@@ -12238,7 +12635,6 @@ $zh2Hans = array(
'饊' => '馓',
'饋' => '馈',
'饌' => '馔',
-'饑' => '饥',
'饒' => '饶',
'饗' => '飨',
'饘' => '𫗴',
@@ -12254,6 +12650,7 @@ $zh2Hans = array(
'馹' => '驲',
'é§' => '驳',
'駃' => 'ð«˜',
+'駎' => '𩧨',
'é§' => 'é©»',
'駑' => '驽',
'駒' => '驹',
@@ -12261,14 +12658,17 @@ $zh2Hans = array(
'駕' => '驾',
'駘' => '骀',
'駙' => '驸',
+'駚' => '𩧫',
'駛' => '驶',
'é§' => '驼',
'駟' => '驷',
-'駡' => '骂',
'駢' => '骈',
+'駧' => '𩧲',
+'駩' => '𩧴',
'駭' => '骇',
'駰' => '骃',
'駱' => '骆',
+'駶' => '𩧺',
'駸' => '骎',
'駻' => '𫘣',
'駿' => 'éª',
@@ -12280,11 +12680,16 @@ $zh2Hans = array(
'é¨' => '骒',
'騎' => '骑',
'é¨' => 'éª',
+'騔' => '𩨀',
'騖' => '骛',
'騙' => '骗',
+'騚' => '𩨊',
+'é¨' => '𩨃',
+'騟' => '𩨈',
'騠' => '𫘨',
'騤' => '骙',
'騧' => '䯄',
+'騪' => '𩨄',
'騫' => '骞',
'騭' => '骘',
'騮' => 'éª',
@@ -12300,6 +12705,7 @@ $zh2Hans = array(
'驄' => '骢',
'驅' => '驱',
'驊' => '骅',
+'驋' => '𩧯',
'驌' => '骕',
'é©' => 'éª',
'é©' => '骣',
@@ -12331,12 +12737,14 @@ $zh2Hans = array(
'鬩' => '阋',
'鬮' => '阄',
'鬱' => 'éƒ',
+'鬹' => '鬶',
'é­Ž' => 'é­‰',
'é­˜' => 'é­‡',
'é­š' => 'é±¼',
'é­›' => 'é±½',
'魟' => '𫚉',
'é­¢' => 'é±¾',
+'魥' => '𩽹',
'é­¨' => 'é²€',
'é­¯' => 'é²',
'魴' => '鲂',
@@ -12348,15 +12756,15 @@ $zh2Hans = array(
'鮊' => '鲌',
'鮋' => '鲉',
'é®' => 'é²',
-'鮎' => '鲇',
'é®' => 'é²',
'鮑' => 'é²',
'鮒' => '鲋',
'鮓' => '鲊',
'鮚' => '鲒',
'鮜' => '鲘',
-'é®' => '鲞',
'鮞' => '鲕',
+'鮟' => '𩽾',
+'鮣' => '䲟',
'鮦' => '鲖',
'鮪' => '鲔',
'鮫' => '鲛',
@@ -12365,9 +12773,11 @@ $zh2Hans = array(
'é®°' => 'ð«š”',
'鮳' => '鲓',
'鮶' => '鲪',
+'鮸' => '𩾃',
'鮺' => 'é²',
'鯀' => '鲧',
'é¯' => 'é² ',
+'鯄' => 'ð©¾',
'鯆' => '𫚙',
'鯇' => '鲩',
'鯉' => '鲤',
@@ -12386,19 +12796,21 @@ $zh2Hans = array(
'鯨' => '鲸',
'鯪' => '鲮',
'鯫' => '鲰',
-'鯰' => '鲇',
+'鯱' => '𩾇',
'鯴' => '鲺',
+'鯶' => '𩽼',
'鯷' => '鳀',
'鯽' => '鲫',
'鯿' => '鳊',
'é°' => '鳈',
'é°‚' => 'é²—',
'鰃' => '鳂',
+'é°†' => 'ä² ',
'é°ˆ' => 'é²½',
'鰉' => '鳇',
+'鰌' => '䲡',
'é°' => 'é³…',
'é°' => 'é²¾',
-'é°' => '鳄',
'鰒' => '鳆',
'鰓' => '鳃',
'鰜' => '鳒',
@@ -12407,6 +12819,7 @@ $zh2Hans = array(
'é°£' => 'é²¥',
'é°¤' => 'ð«š•',
'é°¥' => 'é³',
+'é°§' => 'ä²¢',
'鰨' => '鳎',
'é°©' => 'é³',
'é°­' => 'é³',
@@ -12423,6 +12836,7 @@ $zh2Hans = array(
'é°¾' => 'é³”',
'鱂' => '鳉',
'é±…' => 'é³™',
+'鱇' => '𩾌',
'鱈' => '鳕',
'鱉' => '鳖',
'鱒' => '鳟',
@@ -12446,12 +12860,12 @@ $zh2Hans = array(
'鳥' => '鸟',
'鳧' => '凫',
'鳩' => '鸠',
-'鳬' => '凫',
'鳲' => '鸤',
'鳳' => '凤',
'鳴' => '鸣',
'鳶' => '鸢',
'é³·' => 'ð«››',
+'鳼' => '𪉃',
'é³¾' => 'ä´“',
'鴃' => '𫛞',
'鴆' => '鸩',
@@ -12461,6 +12875,7 @@ $zh2Hans = array(
'鴕' => '鸵',
'é´—' => 'ð«¡',
'鴛' => '鸳',
+'鴜' => '𪉈',
'é´' => '鸲',
'鴞' => '鸮',
'鴟' => '鸱',
@@ -12469,6 +12884,7 @@ $zh2Hans = array(
'鴨' => '鸭',
'鴯' => '鸸',
'鴰' => '鸹',
+'鴲' => '𪉆',
'鴴' => '鸻',
'é´·' => 'ä´•',
'鴻' => '鸿',
@@ -12480,6 +12896,7 @@ $zh2Hans = array(
'鵑' => '鹃',
'鵒' => '鹆',
'鵓' => 'é¹',
+'鵚' => 'ðª‰',
'鵜' => '鹈',
'éµ' => 'é¹…',
'鵠' => '鹄',
@@ -12515,19 +12932,19 @@ $zh2Hans = array(
'鶻' => '鹘',
'鶼' => '鹣',
'鶿' => '鹚',
-'鷀' => '鹚',
'é·' => 'é¹¢',
'鷂' => '鹞',
-'鷄' => '鸡',
'é·ˆ' => 'ä´˜',
'é·Š' => 'é¹',
'鷓' => '鹧',
+'鷔' => '𪉑',
'é·–' => 'é¹¥',
'鷗' => '鸥',
'鷙' => '鸷',
'鷚' => '鹨',
'鷥' => '鸶',
'鷦' => '鹪',
+'鷨' => '𪉊',
'é·«' => 'é¹”',
'鷯' => '鹩',
'鷲' => '鹫',
@@ -12555,10 +12972,12 @@ $zh2Hans = array(
'é¹½' => 'ç›',
'麗' => '丽',
'麥' => '麦',
+'麨' => '𪎊',
'麩' => '麸',
'麪' => 'é¢',
'麫' => 'é¢',
'麯' => '曲',
+'麲' => '𪎉',
'麴' => '曲',
'麵' => 'é¢',
'麼' => '么',
@@ -12604,25 +13023,167 @@ $zh2Hans = array(
'龔' => '龚',
'龕' => '龛',
'龜' => '龟',
+'龭' => '𩨎',
+'龯' => '𨱆',
+'𠌥' => '𠆿',
+'ð ¢' => 'ð ‰—',
+'𠞆' => '𠛆',
+'ð  Ž' => 'ð š³',
+'ð¡„”' => 'ð ´¢',
+'𡄣' => '𠵸',
+'ð¡…' => 'ð ²¥',
+'ð¡‘­' => 'ð¡‹—',
+'ð¡“¾' => 'ð¡‹€',
'𡞵' => '㛟',
'𡠹' => '㛿',
'𡢃' => '㛠',
+'𡮉' => '𡭜',
+'𡮣' => '𡭬',
'ð¡»•' => 'å²',
+'𡾱' => '㟜',
+'𢣚' => 'ð¢˜',
+'𢣭' => '𢘞',
+'𢶫' => '𢫞',
+'𢷮' => '𢫊',
+'𢹿' => '𢬦',
+'𣙎' => '㭣',
+'ð£•' => '𣘷',
+'𣞻' => '𣘓',
+'𣠲' => '𣑶',
+'𣯴' => '𣭤',
+'𣾷' => '㳢',
+'𣿉' => '𣶫',
+'ð¤£' => '𣺽',
+'𤒎' => '𤊀',
'𤪺' => '㻘',
'𤫩' => 'ã»',
+'𤳸' => '𤳄',
+'𤸫' => '𤶧',
+'𥌃' => '𥅘',
+'𥕥' => 'ð¥°',
+'𥖅' => 'ð¥¯',
+'𥢢' => '䅪',
+'ð¥¨' => '𥧂',
+'𥵃' => '𥱔',
+'𥵊' => '𥭉',
+'𥸠' => '𥮋',
+'𥼽' => '𥹥',
+'𥽖' => '𥺇',
+'𥿊' => '𦈈',
+'𦂅' => '𦈒',
+'𦃄' => '𦈗',
+'𦢈' => 'ð£¨',
+'𦣎' => '𦟗',
+'𦪽' => '𦨩',
+'𧔥' => '𧒭',
+'𧜗' => '䘞',
'𧜵' => '䙊',
'ð§ž' => '䘛',
-'𧦧' => 'ð«Ÿ',
'𧩙' => '䜥',
+'𧳟' => '𧳕',
'𧵳' => '䞌',
+'𧶔' => '𧹓',
+'𧶧' => '䞎',
+'𨄣' => '𨀱',
+'ð¨…' => 'ð¨´',
+'ð¨‡' => '𧿈',
+'𨇞' => '𨅫',
+'𨈊' => '𨂺',
+'𨈌' => '𨄄',
+'𨊰' => '䢀',
+'𨊸' => 'ä¢',
+'𨊻' => 'ð¨†',
'𨋢' => '䢂',
+'𨎮' => 'ð¨‰',
+'ð¨ ' => 'ð¨‡',
+'ð¨¥' => 'ð¨Š',
+'𨤻' => '𨤰',
+'𨥛' => '𨱀',
'𨦫' => '䦀',
'𨧜' => 'ä¦',
+'𨧱' => '𨱊',
+'𨫒' => 'ð¨±',
+'𨮂' => '𨱕',
'𨯅' => '䥿',
+'𨳑' => 'ð¨¸',
+'𨳕' => '𨸀',
+'𨴗' => '𨸅',
+'𨵩' => '𨸆',
+'𨵸' => '𨸇',
+'𨶀' => '𨸉',
+'ð¨¶' => '𨸊',
+'𨶮' => '𨸌',
+'𨶲' => '𨸋',
+'𨷲' => '𨸎',
+'ð¨½' => '𨸘',
+'ð©Ž¢' => 'ð©¾',
+'ð©ª' => 'ð©½',
+'ð©“£' => 'ð©–•',
+'𩗀' => '𩙦',
+'𩘀' => '𩙩',
+'ð©˜' => 'ð©™­',
+'𩘹' => '𩙨',
+'𩘺' => '𩙬',
+'𩙈' => '𩙰',
+'ð©š›' => 'ð©Ÿ¿',
+'𩚥' => '𩠀',
+'ð©šµ' => 'ð© ',
+'𩛆' => '𩠂',
+'ð©›©' => 'ð© ƒ',
+'𩜇' => '𩠉',
+'𩜦' => '𩠆',
+'𩜵' => '𩠊',
+'ð©”' => 'ð© ‹',
+'ð©ž„' => 'ð© Ž',
+'𩞦' => 'ð© ',
+'𩞯' => '䭪',
+'ð©Ÿ' => 'ð© …',
+'ð© ´' => 'ð©  ',
+'𩡺' => '𩧦',
+'𩢡' => '𩧬',
+'𩢴' => '𩧵',
+'𩢸' => '𩧳',
+'𩢾' => '𩧮',
+'ð©£' => '𩧶',
'𩣑' => '䯃',
'𩣵' => '𩧻',
+'𩣺' => '𩧼',
+'𩤊' => '𩧩',
+'𩤙' => '𩨆',
+'𩤲' => '𩨉',
+'𩤸' => '𩨅',
+'𩥄' => '𩨋',
+'𩥇' => 'ð©¨',
+'𩥉' => '𩧱',
+'𩥑' => '𩨌',
+'𩧆' => 'ð©¨',
+'𩭙' => '𩬣',
+'𩯳' => '𩯒',
+'𩰀' => '𩬤',
+'𩳤' => '𩲒',
+'𩵩' => '𩽺',
+'𩵹' => '𩽻',
'𩶘' => '䲞',
-'𫚒' => '軿',
+'𩶰' => '𩽿',
+'𩶱' => '𩽽',
+'𩷰' => '𩾄',
+'𩸃' => '𩾅',
+'𩸦' => '𩾆',
+'𩿪' => '𪉄',
+'𪀦' => '𪉅',
+'𪀾' => '𪉋',
+'ðªˆ' => '𪉉',
+'ðª–' => '𪉌',
+'𪂆' => '𪉎',
+'ðªƒ' => 'ðª‰',
+'ðªƒ' => 'ðª‰',
+'𪄆' => '𪉔',
+'𪄕' => '𪉒',
+'𪇳' => '𪉕',
+'𪋿' => 'ðªŽ',
+'𪔵' => '𪔭',
+'𪘀' => 'ðªš',
+'𪘯' => 'ðªš',
'《易乾' => '《易乾',
'ä¸è‘—ç—•è·¡' => 'ä¸ç€ç—•è¿¹',
'ä¸è‘—é‚Šéš›' => 'ä¸ç€è¾¹é™…',
@@ -12761,8 +13322,8 @@ $zh2Hans = array(
'乾曜' => '乾曜',
'乾构' => '乾构',
'乾構' => '乾构',
-'乾枢' => '乾枢',
'乾樞' => '乾枢',
+'乾枢' => '乾枢',
'乾栋' => '乾栋',
'乾棟' => '乾栋',
'乾步' => '乾步',
@@ -13472,6 +14033,7 @@ $zh2Hans = array(
'尋著稱' => '寻著称',
'尋著者' => '寻著者',
'尋著述' => '寻著述',
+'å°‡è»æŠ½ä¿¥' => '将军抽俥',
'å°‡è»æŠ½è»Š' => '将军抽車',
'尼乾陀' => '尼乾陀',
'展著' => '展ç€',
@@ -14789,6 +15351,8 @@ $zh2Hans = array(
'繞著稱' => '绕著称',
'繞著者' => '绕著者',
'繞著述' => '绕著述',
+'綳著å‹' => 'ç»·ç€åŠ²',
+'綳著臉' => 'ç»·ç€è„¸',
'編著' => '编著',
'çºè‘—' => 'ç¼ ç€',
'çºè‘—書' => '缠著书',
@@ -14917,7 +15481,9 @@ $zh2Hans = array(
'著者' => '著者',
'著身' => '著身',
'è‘—è¿°' => 'è‘—è¿°',
+'蒙汗葯' => '蒙汗è¯',
'蒙著' => 'è’™ç€',
+'蒙葯' => 'è’™è¯',
'蒙著書' => '蒙著书',
'蒙著书' => '蒙著书',
'蒙著作' => '蒙著作',
@@ -15203,6 +15769,7 @@ $zh2Hans = array(
'é”è‘—è¿°' => '达著述',
'近角èªä¿¡' => '近角èªä¿¡',
'近角è°ä¿¡' => '近角èªä¿¡',
+'这么' => '这么',
'é è‘—' => 'è¿œç€',
'é è‘—書' => '远著书',
'é è‘—作' => '远著作',
@@ -15511,7 +16078,6 @@ $zh2Hans = array(
'鬱æ°' => '鬱æ°',
'é­å¾µ' => 'é­å¾µ',
'魚乾乾' => '鱼干干',
-'鯰魚' => '鲶鱼',
'麯崇裕' => '麯崇裕',
'麴義' => '麴义',
'麴义' => '麴义',
@@ -18515,4 +19081,4 @@ $zh2SG = array(
'笨豬跳' => '绑紧跳',
'蹦æžè·³' => '绑紧跳',
'笑星' => 'è°æ˜Ÿ',
-); \ No newline at end of file
+);
diff --git a/includes/ZipDirectoryReader.php b/includes/ZipDirectoryReader.php
index 0e84583f..646180d2 100644
--- a/includes/ZipDirectoryReader.php
+++ b/includes/ZipDirectoryReader.php
@@ -34,10 +34,10 @@ class ZipDirectoryReader {
*
* Because this class is aimed at verification, an error is raised on
* suspicious or ambiguous input, instead of emulating some standard
- * behaviour.
+ * behavior.
*
- * @param $fileName string The archive file name
- * @param $callback Array The callback function. It will be called for each file
+ * @param string $fileName The archive file name
+ * @param array $callback The callback function. It will be called for each file
* with a single associative array each time, with members:
*
* - name: The file name. Directories conventionally have a trailing
@@ -47,7 +47,7 @@ class ZipDirectoryReader {
*
* - size: The uncompressed file size
*
- * @param $options Array An associative array of read options, with the option
+ * @param array $options An associative array of read options, with the option
* name in the key. This may currently contain:
*
* - zip64: If this is set to true, then we will emulate a
@@ -181,7 +181,7 @@ class ZipDirectoryReader {
* Throw an error, and log a debug message
*/
function error( $code, $debugMessage ) {
- wfDebug( __CLASS__.": Fatal error: $debugMessage\n" );
+ wfDebug( __CLASS__ . ": Fatal error: $debugMessage\n" );
throw new ZipDirectoryReaderError( $code );
}
@@ -220,7 +220,7 @@ class ZipDirectoryReader {
if ( $structSize + $this->eocdr['file comment length'] != strlen( $block ) - $sigPos ) {
$this->error( 'zip-bad', 'trailing bytes after the end of the file comment' );
}
- if ( $this->eocdr['disk'] !== 0
+ if ( $this->eocdr['disk'] !== 0
|| $this->eocdr['CD start disk'] !== 0 )
{
$this->error( 'zip-unsupported', 'more than one disk (in EOCDR)' );
@@ -262,7 +262,7 @@ class ZipDirectoryReader {
* may replace the regular "end of central directory record" in ZIP64 files.
*/
function readZip64EndOfCentralDirectoryRecord() {
- if ( $this->eocdr64Locator['eocdr64 start disk'] != 0
+ if ( $this->eocdr64Locator['eocdr64 start disk'] != 0
|| $this->eocdr64Locator['number of disks'] != 0 )
{
$this->error( 'zip-unsupported', 'more than one disk (in EOCDR64 locator)' );
@@ -286,7 +286,7 @@ class ZipDirectoryReader {
if ( $data['signature'] !== "PK\x06\x06" ) {
$this->error( 'zip-bad', 'wrong signature on Zip64 end of central directory record' );
}
- if ( $data['disk'] !== 0
+ if ( $data['disk'] !== 0
|| $data['CD start disk'] !== 0 )
{
$this->error( 'zip-unsupported', 'more than one disk (in EOCDR64)' );
@@ -327,7 +327,7 @@ class ZipDirectoryReader {
$offset = $this->eocdr['CD offset'];
$numEntries = $this->eocdr['CD entries total'];
$endPos = $this->eocdr['position'];
- if ( $size == 0xffffffff
+ if ( $size == 0xffffffff
|| $offset == 0xffffffff
|| $numEntries == 0xffff )
{
@@ -395,7 +395,7 @@ class ZipDirectoryReader {
$data += $this->unpack( $block, $variableInfo, $pos );
$pos += $this->getStructSize( $variableInfo );
- if ( $this->zip64 && (
+ if ( $this->zip64 && (
$data['compressed size'] == 0xffffffff
|| $data['uncompressed size'] == 0xffffffff
|| $data['local header offset'] == 0xffffffff ) )
@@ -494,8 +494,8 @@ class ZipDirectoryReader {
* Get the file contents from a given offset. If there are not enough bytes
* in the file to satisfy the request, an exception will be thrown.
*
- * @param $start int The byte offset of the start of the block.
- * @param $length int The number of bytes to return. If omitted, the remainder
+ * @param int $start The byte offset of the start of the block.
+ * @param int $length The number of bytes to return. If omitted, the remainder
* of the file will be returned.
*
* @return string
@@ -538,7 +538,7 @@ class ZipDirectoryReader {
* of length self::SEGSIZE. The result is cached. This is a helper function
* for getBlock().
*
- * If there are not enough bytes in the file to satsify the request, the
+ * If there are not enough bytes in the file to satisfy the request, the
* return value will be truncated. If a request is made for a segment beyond
* the end of the file, an empty string will be returned.
* @return string
@@ -570,7 +570,7 @@ class ZipDirectoryReader {
$size = 0;
foreach ( $struct as $type ) {
if ( is_array( $type ) ) {
- list( $typeName, $fieldSize ) = $type;
+ list( , $fieldSize ) = $type;
$size += $fieldSize;
} else {
$size += $type;
@@ -583,9 +583,9 @@ class ZipDirectoryReader {
* Unpack a binary structure. This is like the built-in unpack() function
* except nicer.
*
- * @param $string string The binary data input
+ * @param string $string The binary data input
*
- * @param $struct array An associative array giving structure members and their
+ * @param array $struct An associative array giving structure members and their
* types. In the key is the field name. The value may be either an
* integer, in which case the field is a little-endian unsigned integer
* encoded in the given number of bytes, or an array, in which case the
@@ -594,8 +594,9 @@ class ZipDirectoryReader {
* - "string": The second array element gives the length of string.
* Not null terminated.
*
- * @param $offset int The offset into the string at which to start unpacking.
+ * @param int $offset The offset into the string at which to start unpacking.
*
+ * @throws MWException
* @return array Unpacked associative array. Note that large integers in the input
* may be represented as floating point numbers in the return value, so
* the use of weak comparison is advised.
@@ -617,12 +618,11 @@ class ZipDirectoryReader {
$pos += $fieldSize;
break;
default:
- throw new MWException( __METHOD__.": invalid type \"$typeName\"" );
+ throw new MWException( __METHOD__ . ": invalid type \"$typeName\"" );
}
} else {
// Unsigned little-endian integer
$length = intval( $type );
- $bytes = substr( $string, $pos, $length );
// Calculate the value. Use an algorithm which automatically
// upgrades the value to floating point if necessary.
@@ -651,7 +651,7 @@ class ZipDirectoryReader {
* boolean.
*
* @param $value integer
- * @param $bitIndex int The index of the bit, where 0 is the LSB.
+ * @param int $bitIndex The index of the bit, where 0 is the LSB.
* @return bool
*/
function testBit( $value, $bitIndex ) {
diff --git a/includes/actions/CachedAction.php b/includes/actions/CachedAction.php
index d21f9aeb..bfdda7b9 100644
--- a/includes/actions/CachedAction.php
+++ b/includes/actions/CachedAction.php
@@ -1,22 +1,8 @@
<?php
-
/**
* Abstract action class with scaffolding for caching HTML and other values
* in a single blob.
*
- * Before using any of the caching functionality, call startCache.
- * After the last call to either getCachedValue or addCachedHTML, call saveCache.
- *
- * To get a cached value or compute it, use getCachedValue like this:
- * $this->getCachedValue( $callback );
- *
- * To add HTML that should be cached, use addCachedHTML like this:
- * $this->addCachedHTML( $callback );
- *
- * The callback function is only called when needed, so do all your expensive
- * computations here. This function should returns the HTML to be cached.
- * It should not add anything to the PageOutput object!
- *
* 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
@@ -33,10 +19,30 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @ingroup Action
+ * @ingroup Actions
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
* @since 1.20
*/
+
+/**
+ * Abstract action class with scaffolding for caching HTML and other values
+ * in a single blob.
+ *
+ * Before using any of the caching functionality, call startCache.
+ * After the last call to either getCachedValue or addCachedHTML, call saveCache.
+ *
+ * To get a cached value or compute it, use getCachedValue like this:
+ * $this->getCachedValue( $callback );
+ *
+ * To add HTML that should be cached, use addCachedHTML like this:
+ * $this->addCachedHTML( $callback );
+ *
+ * The callback function is only called when needed, so do all your expensive
+ * computations here. This function should returns the HTML to be cached.
+ * It should not add anything to the PageOutput object!
+ *
+ * @ingroup Actions
+ */
abstract class CachedAction extends FormlessAction implements ICacheHelper {
/**
diff --git a/includes/actions/CreditsAction.php b/includes/actions/CreditsAction.php
index f7152297..4d3c41be 100644
--- a/includes/actions/CreditsAction.php
+++ b/includes/actions/CreditsAction.php
@@ -23,6 +23,9 @@
* @author <evan@wikitravel.org>
*/
+/**
+ * @ingroup Actions
+ */
class CreditsAction extends FormlessAction {
public function getName() {
@@ -55,8 +58,8 @@ class CreditsAction extends FormlessAction {
/**
* Get a list of contributors
*
- * @param $cnt Int: maximum list of contributors to show
- * @param $showIfMax Bool: whether to contributors if there more than $cnt
+ * @param int $cnt maximum list of contributors to show
+ * @param bool $showIfMax whether to contributors if there more than $cnt
* @return String: html
*/
public function getCredits( $cnt, $showIfMax = true ) {
@@ -97,8 +100,8 @@ class CreditsAction extends FormlessAction {
/**
* Get a list of contributors of $article
- * @param $cnt Int: maximum list of contributors to show
- * @param $showIfMax Bool: whether to contributors if there more than $cnt
+ * @param int $cnt maximum list of contributors to show
+ * @param bool $showIfMax whether to contributors if there more than $cnt
* @return String: html
*/
protected function getContributors( $cnt, $showIfMax ) {
@@ -122,7 +125,7 @@ class CreditsAction extends FormlessAction {
# Sift for real versus user names
foreach ( $contributors as $user ) {
- $cnt--;
+ $cnt--;
if ( $user->isLoggedIn() ) {
$link = $this->link( $user );
if ( !in_array( 'realname', $wgHiddenPrefs ) && $user->getRealName() ) {
diff --git a/includes/actions/DeleteAction.php b/includes/actions/DeleteAction.php
index 5a5a382b..db7123db 100644
--- a/includes/actions/DeleteAction.php
+++ b/includes/actions/DeleteAction.php
@@ -23,17 +23,24 @@
* @author Timo Tijhof
*/
+/**
+ * Handle page deletion
+ *
+ * This is a wrapper that will call Article::delete().
+ *
+ * @ingroup Actions
+ */
class DeleteAction extends FormlessAction {
public function getName() {
return 'delete';
}
- public function onView(){
+ public function onView() {
return null;
}
- public function show(){
+ public function show() {
$this->page->delete();
diff --git a/includes/actions/EditAction.php b/includes/actions/EditAction.php
index 08a33f4c..dec3d841 100644
--- a/includes/actions/EditAction.php
+++ b/includes/actions/EditAction.php
@@ -23,17 +23,25 @@
* @author Timo Tijhof
*/
+/**
+ * Page edition handler
+ *
+ * This is a wrapper that will call the EditPage class, or ExternalEdit
+ * if $wgUseExternalEditor is set to true and requested by the user.
+ *
+ * @ingroup Actions
+ */
class EditAction extends FormlessAction {
public function getName() {
return 'edit';
}
- public function onView(){
+ public function onView() {
return null;
}
- public function show(){
+ public function show() {
$page = $this->page;
$request = $this->getRequest();
$user = $this->getUser();
@@ -56,13 +64,20 @@ class EditAction extends FormlessAction {
}
+/**
+ * Edit submission handler
+ *
+ * This is the same as EditAction; except that it sets the session cookie.
+ *
+ * @ingroup Actions
+ */
class SubmitAction extends EditAction {
public function getName() {
return 'submit';
}
- public function show(){
+ public function show() {
if ( session_id() == '' ) {
// Send a cookie so anons get talk message notifications
wfSetupSession();
diff --git a/includes/actions/HistoryAction.php b/includes/actions/HistoryAction.php
index dcd6fe55..245a5bdc 100644
--- a/includes/actions/HistoryAction.php
+++ b/includes/actions/HistoryAction.php
@@ -20,16 +20,18 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
+ * @ingroup Actions
*/
/**
- * This class handles printing the history page for an article. In order to
+ * This class handles printing the history page for an article. In order to
* be efficient, it uses timestamps rather than offsets for paging, to avoid
* costly LIMIT,offset queries.
*
* Construct it by passing in an Article, and call $h->history() to print the
* history.
*
+ * @ingroup Actions
*/
class HistoryAction extends FormlessAction {
const DIR_PREV = 0;
@@ -132,7 +134,7 @@ class HistoryAction extends FormlessAction {
array( 'delete', 'move' ),
$this->getTitle(),
'',
- array( 'lim' => 10,
+ array( 'lim' => 10,
'conds' => array( "log_action != 'revision'" ),
'showIfEmpty' => false,
'msgKey' => array( 'moveddeleted-notice' )
@@ -145,21 +147,25 @@ class HistoryAction extends FormlessAction {
/**
* Add date selector to quickly get to a certain time
*/
- $year = $request->getInt( 'year' );
- $month = $request->getInt( 'month' );
- $tagFilter = $request->getVal( 'tagfilter' );
+ $year = $request->getInt( 'year' );
+ $month = $request->getInt( 'month' );
+ $tagFilter = $request->getVal( 'tagfilter' );
$tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
/**
* Option to show only revisions that have been (partially) hidden via RevisionDelete
*/
if ( $request->getBool( 'deleted' ) ) {
- $conds = array( "rev_deleted != '0'" );
+ $conds = array( 'rev_deleted != 0' );
} else {
$conds = array();
}
- $checkDeleted = Xml::checkLabel( $this->msg( 'history-show-deleted' )->text(),
+ if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
+ $checkDeleted = Xml::checkLabel( $this->msg( 'history-show-deleted' )->text(),
'deleted', 'mw-show-deleted-only', $request->getBool( 'deleted' ) ) . "\n";
+ } else {
+ $checkDeleted = '';
+ }
// Add the general form
$action = htmlspecialchars( $wgScript );
@@ -170,16 +176,16 @@ class HistoryAction extends FormlessAction {
false,
array( 'id' => 'mw-history-search' )
) .
- Html::hidden( 'title', $this->getTitle()->getPrefixedDBKey() ) . "\n" .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
Html::hidden( 'action', 'history' ) . "\n" .
- Xml::dateMenu( $year, $month ) . '&#160;' .
+ Xml::dateMenu( ( $year == null ? date( "Y" ) : $year ), $month ) . '&#160;' .
( $tagSelector ? ( implode( '&#160;', $tagSelector ) . '&#160;' ) : '' ) .
$checkDeleted .
Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n" .
'</fieldset></form>'
);
- wfRunHooks( 'PageHistoryBeforeList', array( &$this->page ) );
+ wfRunHooks( 'PageHistoryBeforeList', array( &$this->page, $this->getContext() ) );
// Create and output the list.
$pager = new HistoryPager( $this, $year, $month, $tagFilter, $conds );
@@ -218,7 +224,7 @@ class HistoryAction extends FormlessAction {
}
if ( $offset ) {
- $offsets = array( "rev_timestamp $oper '$offset'" );
+ $offsets = array( "rev_timestamp $oper " . $dbr->addQuotes( $dbr->timestamp( $offset ) ) );
} else {
$offsets = array();
}
@@ -227,7 +233,7 @@ class HistoryAction extends FormlessAction {
return $dbr->select( 'revision',
Revision::selectFields(),
- array_merge( array( "rev_page=$page_id" ), $offsets ),
+ array_merge( array( 'rev_page' => $page_id ), $offsets ),
__METHOD__,
array( 'ORDER BY' => "rev_timestamp $dirs",
'USE INDEX' => 'page_timestamp', 'LIMIT' => $limit )
@@ -237,7 +243,7 @@ class HistoryAction extends FormlessAction {
/**
* Output a subscription feed listing recent edits to this page.
*
- * @param $type String: feed type
+ * @param string $type feed type
*/
function feed( $type ) {
global $wgFeedClasses, $wgFeedLimit;
@@ -327,6 +333,7 @@ class HistoryAction extends FormlessAction {
/**
* @ingroup Pager
+ * @ingroup Actions
*/
class HistoryPager extends ReverseChronologicalPager {
public $lastRow = false, $counter, $historyPage, $buttons, $conds;
@@ -436,7 +443,7 @@ class HistoryPager extends ReverseChronologicalPager {
$this->getOutput()->wrapWikiMsg( "<div class='mw-history-legend'>\n$1\n</div>", 'histlegend' );
$s = Html::openElement( 'form', array( 'action' => $wgScript,
'id' => 'mw-history-compare' ) ) . "\n";
- $s .= Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) . "\n";
+ $s .= Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n";
$s .= Html::hidden( 'action', 'historysubmit' ) . "\n";
// Button container stored in $this->buttons for re-use in getEndBody()
@@ -504,14 +511,14 @@ class HistoryPager extends ReverseChronologicalPager {
/**
* Creates a submit button
*
- * @param $message String: text of the submit button, will be escaped
- * @param $attributes Array: attributes
+ * @param string $message text of the submit button, will be escaped
+ * @param array $attributes attributes
* @return String: HTML output for the submit button
*/
function submitButton( $message, $attributes = array() ) {
# Disable submit button if history has 1 revision only
if ( $this->getNumRows() > 1 ) {
- return Xml::submitButton( $message , $attributes );
+ return Xml::submitButton( $message, $attributes );
} else {
return '';
}
@@ -572,11 +579,11 @@ class HistoryPager extends ReverseChronologicalPager {
} elseif ( $rev->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) {
// If revision was hidden from sysops, disable the link
if ( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
- $cdel = Linker::revDeleteLinkDisabled( false );
+ $del = Linker::revDeleteLinkDisabled( false );
// Otherwise, show the link...
} else {
$query = array( 'type' => 'revision',
- 'target' => $this->getTitle()->getPrefixedDbkey(), 'ids' => $rev->getId() );
+ 'target' => $this->getTitle()->getPrefixedDBkey(), 'ids' => $rev->getId() );
$del .= Linker::revDeleteLink( $query,
$rev->isDeleted( Revision::DELETED_RESTRICTED ), false );
}
@@ -598,19 +605,22 @@ class HistoryPager extends ReverseChronologicalPager {
$s .= ' ' . ChangesList::flag( 'minor' );
}
- # Size is always public data
- $prevSize = isset( $this->parentLens[$row->rev_parent_id] )
- ? $this->parentLens[$row->rev_parent_id]
- : 0;
- $sDiff = ChangesList::showCharacterDifference( $prevSize, $rev->getSize() );
- $fSize = Linker::formatRevisionSize($rev->getSize());
- $s .= ' <span class="mw-changeslist-separator">. .</span> ' . "$fSize $sDiff";
+ # Sometimes rev_len isn't populated
+ if ( $rev->getSize() !== null ) {
+ # Size is always public data
+ $prevSize = isset( $this->parentLens[$row->rev_parent_id] )
+ ? $this->parentLens[$row->rev_parent_id]
+ : 0;
+ $sDiff = ChangesList::showCharacterDifference( $prevSize, $rev->getSize() );
+ $fSize = Linker::formatRevisionSize( $rev->getSize() );
+ $s .= ' <span class="mw-changeslist-separator">. .</span> ' . "$fSize $sDiff";
+ }
# Text following the character difference is added just before running hooks
$s2 = Linker::revComment( $rev, false, true );
if ( $notificationtimestamp && ( $row->rev_timestamp >= $notificationtimestamp ) ) {
- $s2 .= ' <span class="updatedmarker">' . $this->msg( 'updatedmarker' )->escaped() . '</span>';
+ $s2 .= ' <span class="updatedmarker">' . $this->msg( 'updatedmarker' )->escaped() . '</span>';
$classes[] = 'mw-history-line-updated';
}
@@ -619,9 +629,12 @@ class HistoryPager extends ReverseChronologicalPager {
# Rollback and undo links
if ( $prevRev && $this->getTitle()->quickUserCan( 'edit', $user ) ) {
if ( $latest && $this->getTitle()->quickUserCan( 'rollback', $user ) ) {
- $this->preventClickjacking();
- $tools[] = '<span class="mw-rollback-link">' .
- Linker::buildRollbackLink( $rev, $this->getContext() ) . '</span>';
+ // Get a rollback link without the brackets
+ $rollbackLink = Linker::generateRollback( $rev, $this->getContext(), array( 'verify', 'noBrackets' ) );
+ if ( $rollbackLink ) {
+ $this->preventClickjacking();
+ $tools[] = $rollbackLink;
+ }
}
if ( !$rev->isDeleted( Revision::DELETED_TEXT )
@@ -644,6 +657,8 @@ class HistoryPager extends ReverseChronologicalPager {
$tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>";
}
}
+ // Allow extension to add their own links here
+ wfRunHooks( 'HistoryRevisionTools', array( $rev, &$tools ) );
if ( $tools ) {
$s2 .= ' '. $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
@@ -661,7 +676,7 @@ class HistoryPager extends ReverseChronologicalPager {
$s .= ' <span class="mw-changeslist-separator">. .</span> ' . $s2;
}
- wfRunHooks( 'PageHistoryLineEnding', array( $this, &$row , &$s, &$classes ) );
+ wfRunHooks( 'PageHistoryLineEnding', array( $this, &$row, &$s, &$classes ) );
$attribs = array();
if ( $classes ) {
diff --git a/includes/actions/InfoAction.php b/includes/actions/InfoAction.php
index ae550391..1e312d7a 100644
--- a/includes/actions/InfoAction.php
+++ b/includes/actions/InfoAction.php
@@ -22,6 +22,11 @@
* @ingroup Actions
*/
+/**
+ * Displays information about a page.
+ *
+ * @ingroup Actions
+ */
class InfoAction extends FormlessAction {
/**
* Returns the name of the action this object responds to.
@@ -81,11 +86,11 @@ class InfoAction extends FormlessAction {
// Hide "This page is a member of # hidden categories" explanation
$content .= Html::element( 'style', array(),
- '.mw-hiddenCategoriesExplanation { display: none; }' );
+ '.mw-hiddenCategoriesExplanation { display: none; }' ) . "\n";
// Hide "Templates used on this page" explanation
$content .= Html::element( 'style', array(),
- '.mw-templatesUsedExplanation { display: none; }' );
+ '.mw-templatesUsedExplanation { display: none; }' ) . "\n";
// Get page information
$pageInfo = $this->pageInfo();
@@ -95,14 +100,14 @@ class InfoAction extends FormlessAction {
// Render page information
foreach ( $pageInfo as $header => $infoTable ) {
- $content .= $this->makeHeader( $this->msg( "pageinfo-${header}" )->escaped() );
- $table = '';
+ $content .= $this->makeHeader( $this->msg( "pageinfo-${header}" )->escaped() ) . "\n";
+ $table = "\n";
foreach ( $infoTable as $infoRow ) {
$name = ( $infoRow[0] instanceof Message ) ? $infoRow[0]->escaped() : $infoRow[0];
$value = ( $infoRow[1] instanceof Message ) ? $infoRow[1]->escaped() : $infoRow[1];
- $table = $this->addRow( $table, $name, $value );
+ $table = $this->addRow( $table, $name, $value ) . "\n";
}
- $content = $this->addTable( $content, $table );
+ $content = $this->addTable( $content, $table ) . "\n";
}
// Page footer
@@ -125,17 +130,16 @@ class InfoAction extends FormlessAction {
* @return string The HTML.
*/
protected function makeHeader( $header ) {
- global $wgParser;
- $spanAttribs = array( 'class' => 'mw-headline', 'id' => $wgParser->guessSectionNameFromWikiText( $header ) );
+ $spanAttribs = array( 'class' => 'mw-headline', 'id' => Sanitizer::escapeId( $header ) );
return Html::rawElement( 'h2', array(), Html::element( 'span', $spanAttribs, $header ) );
}
/**
* Adds a row to a table that will be added to the content.
*
- * @param $table string The table that will be added to the content
- * @param $name string The name of the row
- * @param $value string The value of the row
+ * @param string $table The table that will be added to the content
+ * @param string $name The name of the row
+ * @param string $value The value of the row
* @return string The table with the row added
*/
protected function addRow( $table, $name, $value ) {
@@ -148,8 +152,8 @@ class InfoAction extends FormlessAction {
/**
* Adds a table to the content that will be added to the output.
*
- * @param $content string The content that will be added to the output
- * @param $table string The table
+ * @param string $content The content that will be added to the output
+ * @param string $table The table
* @return string The content with the table added
*/
protected function addTable( $content, $table ) {
@@ -161,17 +165,25 @@ class InfoAction extends FormlessAction {
* Returns page information in an easily-manipulated format. Array keys are used so extensions
* may add additional information in arbitrary positions. Array values are arrays with one
* element to be rendered as a header, arrays with two elements to be rendered as a table row.
+ *
+ * @return array
*/
protected function pageInfo() {
- global $wgContLang, $wgRCMaxAge;
+ global $wgContLang, $wgRCMaxAge, $wgMemc, $wgUnwatchedPageThreshold, $wgPageInfoTransclusionLimit;
$user = $this->getUser();
$lang = $this->getLanguage();
$title = $this->getTitle();
$id = $title->getArticleID();
- // Get page information that would be too "expensive" to retrieve by normal means
- $pageCounts = self::pageCounts( $title, $user );
+ $memcKey = wfMemcKey( 'infoaction', sha1( $title->getPrefixedText() ), $this->page->getLatest() );
+ $pageCounts = $wgMemc->get( $memcKey );
+ if ( $pageCounts === false ) {
+ // Get page information that would be too "expensive" to retrieve by normal means
+ $pageCounts = self::pageCounts( $title );
+
+ $wgMemc->set( $memcKey, $pageCounts );
+ }
// Get page properties
$dbr = wfGetDB( DB_SLAVE );
@@ -201,6 +213,21 @@ class InfoAction extends FormlessAction {
$this->msg( 'pageinfo-display-title' ), $displayTitle
);
+ // Is it a redirect? If so, where to?
+ if ( $title->isRedirect() ) {
+ $pageInfo['header-basic'][] = array(
+ $this->msg( 'pageinfo-redirectsto' ),
+ Linker::link( $this->page->getRedirectTarget() ) .
+ $this->msg( 'word-separator' )->text() .
+ $this->msg( 'parentheses', Linker::link(
+ $this->page->getRedirectTarget(),
+ $this->msg( 'pageinfo-redirectsto-info' )->escaped(),
+ array(),
+ array( 'action' => 'info' )
+ ) )->text()
+ );
+ }
+
// Default sort key
$sortKey = $title->getCategorySortKey();
if ( !empty( $pageProperties['defaultsort'] ) ) {
@@ -217,6 +244,12 @@ class InfoAction extends FormlessAction {
// Page ID (number not localised, as it's a database ID)
$pageInfo['header-basic'][] = array( $this->msg( 'pageinfo-article-id' ), $id );
+ // Language in which the page content is (supposed to be) written
+ $pageLang = $title->getPageLanguage()->getCode();
+ $pageInfo['header-basic'][] = array( $this->msg( 'pageinfo-language' ),
+ Language::fetchLanguageName( $pageLang, $lang->getCode() )
+ . ' ' . $this->msg( 'parentheses', $pageLang ) );
+
// Search engine status
$pOutput = new ParserOutput();
if ( isset( $pageProperties['noindex'] ) ) {
@@ -236,11 +269,20 @@ class InfoAction extends FormlessAction {
);
}
- if ( isset( $pageCounts['watchers'] ) ) {
+ if (
+ $user->isAllowed( 'unwatchedpages' ) ||
+ ( $wgUnwatchedPageThreshold !== false &&
+ $pageCounts['watchers'] >= $wgUnwatchedPageThreshold )
+ ) {
// Number of page watchers
$pageInfo['header-basic'][] = array(
$this->msg( 'pageinfo-watchers' ), $lang->formatNum( $pageCounts['watchers'] )
);
+ } elseif ( $wgUnwatchedPageThreshold !== false ) {
+ $pageInfo['header-basic'][] = array(
+ $this->msg( 'pageinfo-watchers' ),
+ $this->msg( 'pageinfo-few-watchers' )->numParams( $wgUnwatchedPageThreshold )
+ );
}
// Redirects to this page
@@ -256,6 +298,14 @@ class InfoAction extends FormlessAction {
->numParams( count( $title->getRedirectsHere() ) )
);
+ // Is it counted as a content page?
+ if ( $this->page->isCountable() ) {
+ $pageInfo['header-basic'][] = array(
+ $this->msg( 'pageinfo-contentpage' ),
+ $this->msg( 'pageinfo-contentpage-yes' )
+ );
+ }
+
// Subpages of this page, if subpages are enabled for the current NS
if ( MWNamespace::hasSubpages( $title->getNamespace() ) ) {
$prefixIndex = SpecialPage::getTitleFor( 'Prefixindex', $title->getPrefixedText() . '/' );
@@ -269,9 +319,51 @@ class InfoAction extends FormlessAction {
);
}
+ if ( $title->inNamespace( NS_CATEGORY ) ) {
+ $category = Category::newFromTitle( $title );
+ $pageInfo['category-info'] = array(
+ array(
+ $this->msg( 'pageinfo-category-pages' ),
+ $lang->formatNum( $category->getPageCount() )
+ ),
+ array(
+ $this->msg( 'pageinfo-category-subcats' ),
+ $lang->formatNum( $category->getSubcatCount() )
+ ),
+ array(
+ $this->msg( 'pageinfo-category-files' ),
+ $lang->formatNum( $category->getFileCount() )
+ )
+ );
+ }
+
// Page protection
$pageInfo['header-restrictions'] = array();
+ // Is this page effected by the cascading protection of something which includes it?
+ if ( $title->isCascadeProtected() ) {
+ $cascadingFrom = '';
+ $sources = $title->getCascadeProtectionSources(); // Array deferencing is in PHP 5.4 :(
+
+ foreach ( $sources[0] as $sourceTitle ) {
+ $cascadingFrom .= Html::rawElement( 'li', array(), Linker::linkKnown( $sourceTitle ) );
+ }
+
+ $cascadingFrom = Html::rawElement( 'ul', array(), $cascadingFrom );
+ $pageInfo['header-restrictions'][] = array(
+ $this->msg( 'pageinfo-protect-cascading-from' ),
+ $cascadingFrom
+ );
+ }
+
+ // Is out protection set to cascade to other pages?
+ if ( $title->areRestrictionsCascading() ) {
+ $pageInfo['header-restrictions'][] = array(
+ $this->msg( 'pageinfo-protect-cascading' ),
+ $this->msg( 'pageinfo-protect-cascading-yes' )
+ );
+ }
+
// Page protection
foreach ( $title->getRestrictionTypes() as $restrictionType ) {
$protectionLevel = implode( ', ', $title->getRestrictions( $restrictionType ) );
@@ -303,40 +395,64 @@ class InfoAction extends FormlessAction {
$pageInfo['header-edits'] = array();
$firstRev = $this->page->getOldestRevision();
+ $lastRev = $this->page->getRevision();
+ $batch = new LinkBatch;
+
+ if ( $firstRev ) {
+ $firstRevUser = $firstRev->getUserText( Revision::FOR_THIS_USER );
+ if ( $firstRevUser !== '' ) {
+ $batch->add( NS_USER, $firstRevUser );
+ $batch->add( NS_USER_TALK, $firstRevUser );
+ }
+ }
- // Page creator
- $pageInfo['header-edits'][] = array(
- $this->msg( 'pageinfo-firstuser' ),
- Linker::revUserTools( $firstRev )
- );
+ if ( $lastRev ) {
+ $lastRevUser = $lastRev->getUserText( Revision::FOR_THIS_USER );
+ if ( $lastRevUser !== '' ) {
+ $batch->add( NS_USER, $lastRevUser );
+ $batch->add( NS_USER_TALK, $lastRevUser );
+ }
+ }
- // Date of page creation
- $pageInfo['header-edits'][] = array(
- $this->msg( 'pageinfo-firsttime' ),
- Linker::linkKnown(
- $title,
- $lang->userTimeAndDate( $firstRev->getTimestamp(), $user ),
- array(),
- array( 'oldid' => $firstRev->getId() )
- )
- );
+ $batch->execute();
- // Latest editor
- $pageInfo['header-edits'][] = array(
- $this->msg( 'pageinfo-lastuser' ),
- Linker::revUserTools( $this->page->getRevision() )
- );
+ if ( $firstRev ) {
+ // Page creator
+ $pageInfo['header-edits'][] = array(
+ $this->msg( 'pageinfo-firstuser' ),
+ Linker::revUserTools( $firstRev )
+ );
- // Date of latest edit
- $pageInfo['header-edits'][] = array(
- $this->msg( 'pageinfo-lasttime' ),
- Linker::linkKnown(
- $title,
- $lang->userTimeAndDate( $this->page->getTimestamp(), $user ),
- array(),
- array( 'oldid' => $this->page->getLatest() )
- )
- );
+ // Date of page creation
+ $pageInfo['header-edits'][] = array(
+ $this->msg( 'pageinfo-firsttime' ),
+ Linker::linkKnown(
+ $title,
+ $lang->userTimeAndDate( $firstRev->getTimestamp(), $user ),
+ array(),
+ array( 'oldid' => $firstRev->getId() )
+ )
+ );
+ }
+
+ if ( $lastRev ) {
+ // Latest editor
+ $pageInfo['header-edits'][] = array(
+ $this->msg( 'pageinfo-lastuser' ),
+ Linker::revUserTools( $lastRev )
+ );
+
+ // Date of latest edit
+ $pageInfo['header-edits'][] = array(
+ $this->msg( 'pageinfo-lasttime' ),
+ Linker::linkKnown(
+ $title,
+ $lang->userTimeAndDate( $this->page->getTimestamp(), $user ),
+ array(),
+ array( 'oldid' => $this->page->getLatest() )
+ )
+ );
+ }
// Total number of edits
$pageInfo['header-edits'][] = array(
@@ -377,11 +493,17 @@ class InfoAction extends FormlessAction {
$localizedList = Html::rawElement( 'ul', array(), implode( '', $listItems ) );
$hiddenCategories = $this->page->getHiddenCategories();
- $transcludedTemplates = $title->getTemplateLinksFrom();
- if ( count( $listItems ) > 0
- || count( $hiddenCategories ) > 0
- || count( $transcludedTemplates ) > 0 ) {
+ if (
+ count( $listItems ) > 0 ||
+ count( $hiddenCategories ) > 0 ||
+ $pageCounts['transclusion']['from'] > 0 ||
+ $pageCounts['transclusion']['to'] > 0
+ ) {
+ $options = array( 'LIMIT' => $wgPageInfoTransclusionLimit );
+ $transcludedTemplates = $title->getTemplateLinksFrom( $options );
+ $transcludedTargets = $title->getTemplateLinksTo( $options );
+
// Page properties
$pageInfo['header-properties'] = array();
@@ -403,11 +525,44 @@ class InfoAction extends FormlessAction {
}
// Transcluded templates
- if ( count( $transcludedTemplates ) > 0 ) {
+ if ( $pageCounts['transclusion']['from'] > 0 ) {
+ if ( $pageCounts['transclusion']['from'] > count( $transcludedTemplates ) ) {
+ $more = $this->msg( 'morenotlisted' )->escaped();
+ } else {
+ $more = null;
+ }
+
$pageInfo['header-properties'][] = array(
$this->msg( 'pageinfo-templates' )
- ->numParams( count( $transcludedTemplates ) ),
- Linker::formatTemplates( $transcludedTemplates )
+ ->numParams( $pageCounts['transclusion']['from'] ),
+ Linker::formatTemplates(
+ $transcludedTemplates,
+ false,
+ false,
+ $more )
+ );
+ }
+
+ if ( $pageCounts['transclusion']['to'] > 0 ) {
+ if ( $pageCounts['transclusion']['to'] > count( $transcludedTargets ) ) {
+ $more = Linker::link(
+ $whatLinksHere,
+ $this->msg( 'moredotdotdot' )->escaped(),
+ array(),
+ array( 'hidelinks' => 1, 'hideredirs' => 1 )
+ );
+ } else {
+ $more = null;
+ }
+
+ $pageInfo['header-properties'][] = array(
+ $this->msg( 'pageinfo-transclusions' )
+ ->numParams( $pageCounts['transclusion']['to'] ),
+ Linker::formatTemplates(
+ $transcludedTargets,
+ false,
+ false,
+ $more )
);
}
}
@@ -418,11 +573,10 @@ class InfoAction extends FormlessAction {
/**
* Returns page counts that would be too "expensive" to retrieve by normal means.
*
- * @param $title Title object
- * @param $user User object
+ * @param Title $title Title to get counts for
* @return array
*/
- protected static function pageCounts( $title, $user ) {
+ protected static function pageCounts( Title $title ) {
global $wgRCMaxAge, $wgDisableCounters;
wfProfileIn( __METHOD__ );
@@ -442,19 +596,17 @@ class InfoAction extends FormlessAction {
$result['views'] = $views;
}
- if ( $user->isAllowed( 'unwatchedpages' ) ) {
- // Number of page watchers
- $watchers = (int) $dbr->selectField(
- 'watchlist',
- 'COUNT(*)',
- array(
- 'wl_namespace' => $title->getNamespace(),
- 'wl_title' => $title->getDBkey(),
- ),
- __METHOD__
- );
- $result['watchers'] = $watchers;
- }
+ // Number of page watchers
+ $watchers = (int) $dbr->selectField(
+ 'watchlist',
+ 'COUNT(*)',
+ array(
+ 'wl_namespace' => $title->getNamespace(),
+ 'wl_title' => $title->getDBkey(),
+ ),
+ __METHOD__
+ );
+ $result['watchers'] = $watchers;
// Total number of edits
$edits = (int) $dbr->selectField(
@@ -482,8 +634,8 @@ class InfoAction extends FormlessAction {
'revision',
'COUNT(rev_page)',
array(
- 'rev_page' => $id ,
- "rev_timestamp >= $threshold"
+ 'rev_page' => $id,
+ "rev_timestamp >= " . $dbr->addQuotes( $threshold )
),
__METHOD__
);
@@ -495,7 +647,7 @@ class InfoAction extends FormlessAction {
'COUNT(DISTINCT rev_user_text)',
array(
'rev_page' => $id,
- "rev_timestamp >= $threshold"
+ "rev_timestamp >= " . $dbr->addQuotes( $threshold )
),
__METHOD__
);
@@ -528,12 +680,30 @@ class InfoAction extends FormlessAction {
+ $result['subpages']['nonredirects'];
}
+ // Counts for the number of transclusion links (to/from)
+ $result['transclusion']['to'] = (int) $dbr->selectField(
+ 'templatelinks',
+ 'COUNT(tl_from)',
+ array(
+ 'tl_namespace' => $title->getNamespace(),
+ 'tl_title' => $title->getDBkey()
+ ),
+ __METHOD__
+ );
+
+ $result['transclusion']['from'] = (int) $dbr->selectField(
+ 'templatelinks',
+ 'COUNT(*)',
+ array( 'tl_from' => $title->getArticleID() ),
+ __METHOD__
+ );
+
wfProfileOut( __METHOD__ );
return $result;
}
/**
- * Returns the name that goes in the <h1> page title.
+ * Returns the name that goes in the "<h1>" page title.
*
* @return string
*/
@@ -604,7 +774,7 @@ class InfoAction extends FormlessAction {
}
/**
- * Returns the description that goes below the <h1> tag.
+ * Returns the description that goes below the "<h1>" tag.
*
* @return string
*/
diff --git a/includes/actions/MarkpatrolledAction.php b/includes/actions/MarkpatrolledAction.php
index ae9223f4..ff6cf13a 100644
--- a/includes/actions/MarkpatrolledAction.php
+++ b/includes/actions/MarkpatrolledAction.php
@@ -22,6 +22,11 @@
* @ingroup Actions
*/
+/**
+ * Mark a revision as patrolled on a page
+ *
+ * @ingroup Actions
+ */
class MarkpatrolledAction extends FormlessAction {
public function getName() {
diff --git a/includes/actions/ProtectAction.php b/includes/actions/ProtectAction.php
index f053ede7..ec6648e2 100644
--- a/includes/actions/ProtectAction.php
+++ b/includes/actions/ProtectAction.php
@@ -23,17 +23,24 @@
* @author Timo Tijhof
*/
+/**
+ * Handle page protection
+ *
+ * This is a wrapper that will call Article::protect().
+ *
+ * @ingroup Actions
+ */
class ProtectAction extends FormlessAction {
public function getName() {
return 'protect';
}
- public function onView(){
+ public function onView() {
return null;
}
- public function show(){
+ public function show() {
$this->page->protect();
@@ -41,13 +48,20 @@ class ProtectAction extends FormlessAction {
}
+/**
+ * Handle page unprotection
+ *
+ * This is a wrapper that will call Article::unprotect().
+ *
+ * @ingroup Actions
+ */
class UnprotectAction extends ProtectAction {
public function getName() {
return 'unprotect';
}
- public function show(){
+ public function show() {
$this->page->unprotect();
diff --git a/includes/actions/PurgeAction.php b/includes/actions/PurgeAction.php
index cd58889d..00bb961d 100644
--- a/includes/actions/PurgeAction.php
+++ b/includes/actions/PurgeAction.php
@@ -1,8 +1,6 @@
<?php
/**
- * Formats credits for articles
- *
- * Copyright 2004, Evan Prodromou <evan@wikitravel.org>.
+ * User-requested page cache purging.
*
* 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
@@ -20,9 +18,16 @@
*
* @file
* @ingroup Actions
- * @author <evan@wikitravel.org>
*/
+/**
+ * User-requested page cache purging.
+ *
+ * For users with 'purge', this will directly trigger the cache purging and
+ * for users without that right, it will show a confirmation form.
+ *
+ * @ingroup Actions
+ */
class PurgeAction extends FormAction {
private $redirectParams;
@@ -62,7 +67,7 @@ class PurgeAction extends FormAction {
$this->checkCanExecute( $this->getUser() );
if ( $this->getUser()->isAllowed( 'purge' ) ) {
- $this->redirectParams = wfArrayToCGI( array_diff_key(
+ $this->redirectParams = wfArrayToCgi( array_diff_key(
$this->getRequest()->getQueryValues(),
array( 'title' => null, 'action' => null )
) );
diff --git a/includes/actions/RawAction.php b/includes/actions/RawAction.php
index 174ca3f8..d1d457c0 100644
--- a/includes/actions/RawAction.php
+++ b/includes/actions/RawAction.php
@@ -29,6 +29,8 @@
/**
* A simple method to retrieve the plain source of an article,
* using "action=raw" in the GET request string.
+ *
+ * @ingroup Actions
*/
class RawAction extends FormlessAction {
private $mGen;
@@ -46,7 +48,7 @@ class RawAction extends FormlessAction {
}
function onView() {
- global $wgGroupPermissions, $wgSquidMaxage, $wgForcedRawSMaxage, $wgJsMimeType;
+ global $wgSquidMaxage, $wgForcedRawSMaxage, $wgJsMimeType;
$this->getOutput()->disable();
$request = $this->getRequest();
@@ -91,7 +93,7 @@ class RawAction extends FormlessAction {
$response->header( 'Content-type: ' . $contentType . '; charset=UTF-8' );
# Output may contain user-specific data;
# vary generated content for open sessions on private wikis
- $privateCache = !$wgGroupPermissions['*']['read'] && ( $smaxage == 0 || session_id() != '' );
+ $privateCache = !User::groupHasPermission( '*', 'read' ) && ( $smaxage == 0 || session_id() != '' );
# allow the client to cache this for 24 hours
$mode = $privateCache ? 'private' : 'public';
$response->header( 'Cache-Control: ' . $mode . ', s-maxage=' . $smaxage . ', max-age=' . $maxage );
@@ -148,10 +150,29 @@ class RawAction extends FormlessAction {
$request->response()->header( "Last-modified: $lastmod" );
// Public-only due to cache headers
- $text = $rev->getText();
- $section = $request->getIntOrNull( 'section' );
- if ( $section !== null ) {
- $text = $wgParser->getSection( $text, $section );
+ $content = $rev->getContent();
+
+ if ( $content === null ) {
+ // revision not found (or suppressed)
+ $text = false;
+ } elseif ( !$content instanceof TextContent ) {
+ // non-text content
+ wfHttpError( 415, "Unsupported Media Type", "The requested page uses the content model `"
+ . $content->getModel() . "` which is not supported via this interface." );
+ die();
+ } else {
+ // want a section?
+ $section = $request->getIntOrNull( 'section' );
+ if ( $section !== null ) {
+ $content = $content->getSection( $section );
+ }
+
+ if ( $content === null || $content === false ) {
+ // section not found (or section not supported, e.g. for JS and CSS)
+ $text = false;
+ } else {
+ $text = $content->getNativeData();
+ }
}
}
}
@@ -185,7 +206,7 @@ class RawAction extends FormlessAction {
$oldid = $this->page->getLatest();
}
$prev = $this->getTitle()->getPreviousRevisionId( $oldid );
- $oldid = $prev ? $prev : -1 ;
+ $oldid = $prev ? $prev : -1;
break;
case 'cur':
$oldid = 0;
diff --git a/includes/actions/RenderAction.php b/includes/actions/RenderAction.php
index 80af79cc..3d244fb3 100644
--- a/includes/actions/RenderAction.php
+++ b/includes/actions/RenderAction.php
@@ -23,17 +23,24 @@
* @author Timo Tijhof
*/
+/**
+ * Handle action=render
+ *
+ * This is a wrapper that will call Article::render().
+ *
+ * @ingroup Actions
+ */
class RenderAction extends FormlessAction {
public function getName() {
return 'render';
}
- public function onView(){
+ public function onView() {
return null;
}
- public function show(){
+ public function show() {
$this->page->render();
diff --git a/includes/actions/RevertAction.php b/includes/actions/RevertAction.php
index 77434384..a5fc4e17 100644
--- a/includes/actions/RevertAction.php
+++ b/includes/actions/RevertAction.php
@@ -115,7 +115,7 @@ class RevertFileAction extends FormAction {
$source = $this->page->getFile()->getArchiveVirtualUrl( $this->getRequest()->getText( 'oldimage' ) );
$comment = $data['comment'];
// TODO: Preserve file properties from database instead of reloading from file
- return $this->page->getFile()->upload( $source, $comment, $comment );
+ return $this->page->getFile()->upload( $source, $comment, $comment, 0, false, false, $this->getUser() );
}
public function onSuccess() {
@@ -124,7 +124,7 @@ class RevertFileAction extends FormAction {
$lang = $this->getLanguage();
$userDate = $lang->userDate( $timestamp, $user );
$userTime = $lang->userTime( $timestamp, $user );
-
+
$this->getOutput()->addWikiMsg( 'filerevert-success', $this->getTitle()->getText(),
$userDate, $userTime,
wfExpandUrl( $this->page->getFile()->getArchiveUrl( $this->getRequest()->getText( 'oldimage' ) ),
@@ -136,7 +136,7 @@ class RevertFileAction extends FormAction {
protected function getPageTitle() {
return $this->msg( 'filerevert', $this->getTitle()->getText() );
}
-
+
protected function getDescription() {
$this->getOutput()->addBacklinkSubtitle( $this->getTitle() );
return '';
diff --git a/includes/actions/RevisiondeleteAction.php b/includes/actions/RevisiondeleteAction.php
index 14da2fcf..2949fa95 100644
--- a/includes/actions/RevisiondeleteAction.php
+++ b/includes/actions/RevisiondeleteAction.php
@@ -23,6 +23,11 @@
* @author Alexandre Emsenhuber
*/
+/**
+ * An action that just pass the request to Special:RevisionDelete
+ *
+ * @ingroup Actions
+ */
class RevisiondeleteAction extends FormlessAction {
public function getName() {
diff --git a/includes/actions/RollbackAction.php b/includes/actions/RollbackAction.php
index 0d9a9027..81bad9da 100644
--- a/includes/actions/RollbackAction.php
+++ b/includes/actions/RollbackAction.php
@@ -71,45 +71,32 @@ class RollbackAction extends FormlessAction {
return;
}
- # Display permissions errors before read-only message -- there's no
- # point in misleading the user into thinking the inability to rollback
- # is only temporary.
- if ( !empty( $result ) && $result !== array( array( 'readonlytext' ) ) ) {
- # array_diff is completely broken for arrays of arrays, sigh.
- # Remove any 'readonlytext' error manually.
- $out = array();
- foreach ( $result as $error ) {
- if ( $error != array( 'readonlytext' ) ) {
- $out [] = $error;
- }
- }
- throw new PermissionsError( 'rollback', $out );
- }
+ #NOTE: Permission errors already handled by Action::checkExecute.
if ( $result == array( array( 'readonlytext' ) ) ) {
throw new ReadOnlyError;
}
+ #XXX: Would be nice if ErrorPageError could take multiple errors, and/or a status object.
+ # Right now, we only show the first error
+ foreach ( $result as $error ) {
+ throw new ErrorPageError( 'rollbackfailed', $error[0], array_slice( $error, 1 ) );
+ }
+
$current = $details['current'];
$target = $details['target'];
$newId = $details['newid'];
$this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
$this->getOutput()->setRobotPolicy( 'noindex,nofollow' );
- if ( $current->getUserText() === '' ) {
- $old = $this->msg( 'rev-deleted-user' )->escaped();
- } else {
- $old = Linker::userLink( $current->getUser(), $current->getUserText() )
- . Linker::userToolLinks( $current->getUser(), $current->getUserText() );
- }
-
- $new = Linker::userLink( $target->getUser(), $target->getUserText() )
- . Linker::userToolLinks( $target->getUser(), $target->getUserText() );
+ $old = Linker::revUserTools( $current );
+ $new = Linker::revUserTools( $target );
$this->getOutput()->addHTML( $this->msg( 'rollback-success' )->rawParams( $old, $new )->parseAsBlock() );
$this->getOutput()->returnToMain( false, $this->getTitle() );
if ( !$request->getBool( 'hidediff', false ) && !$this->getUser()->getBoolOption( 'norollbackdiff', false ) ) {
- $de = new DifferenceEngine( $this->getContext(), $current->getId(), $newId, false, true );
+ $contentHandler = $current->getContentHandler();
+ $de = $contentHandler->createDifferenceEngine( $this->getContext(), $current->getId(), $newId, false, true );
$de->showDiff( '', '' );
}
}
diff --git a/includes/actions/ViewAction.php b/includes/actions/ViewAction.php
index d57585ee..e227197d 100644
--- a/includes/actions/ViewAction.php
+++ b/includes/actions/ViewAction.php
@@ -23,17 +23,24 @@
* @author Timo Tijhof
*/
+/**
+ * An action that views article content
+ *
+ * This is a wrapper that will call Article::render().
+ *
+ * @ingroup Actions
+ */
class ViewAction extends FormlessAction {
public function getName() {
return 'view';
}
- public function onView(){
+ public function onView() {
return null;
}
- public function show(){
+ public function show() {
$this->page->view();
}
diff --git a/includes/actions/WatchAction.php b/includes/actions/WatchAction.php
index e2636452..ae5f76c6 100644
--- a/includes/actions/WatchAction.php
+++ b/includes/actions/WatchAction.php
@@ -20,6 +20,11 @@
* @ingroup Actions
*/
+/**
+ * Page addition to a user's watchlist
+ *
+ * @ingroup Actions
+ */
class WatchAction extends FormAction {
public function getName() {
@@ -148,6 +153,11 @@ class WatchAction extends FormAction {
}
}
+/**
+ * Page removal from a user's watchlist
+ *
+ * @ingroup Actions
+ */
class UnwatchAction extends WatchAction {
public function getName() {
diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php
index 875a3814..9351a8d8 100644
--- a/includes/api/ApiBase.php
+++ b/includes/api/ApiBase.php
@@ -66,14 +66,22 @@ abstract class ApiBase extends ContextSource {
const LIMIT_SML1 = 50; // Slow query, std user limit
const LIMIT_SML2 = 500; // Slow query, bot/sysop limit
+ /**
+ * getAllowedParams() flag: When set, the result could take longer to generate,
+ * but should be more thorough. E.g. get the list of generators for ApiSandBox extension
+ * @since 1.21
+ */
+ const GET_VALUES_FOR_HELP = 1;
+
private $mMainModule, $mModuleName, $mModulePrefix;
+ private $mSlaveDB = null;
private $mParamCache = array();
/**
* Constructor
* @param $mainModule ApiMain object
- * @param $moduleName string Name of this module
- * @param $modulePrefix string Prefix to use for parameter names
+ * @param string $moduleName Name of this module
+ * @param string $modulePrefix Prefix to use for parameter names
*/
public function __construct( $mainModule, $moduleName, $modulePrefix = '' ) {
$this->mMainModule = $mainModule;
@@ -105,15 +113,19 @@ abstract class ApiBase extends ContextSource {
* The result data should be stored in the ApiResult object available
* through getResult().
*/
- public abstract function execute();
+ abstract public function execute();
/**
* Returns a string that identifies the version of the extending class.
* Typically includes the class name, the svn revision, timestamp, and
* last author. Usually done with SVN's Id keyword
* @return string
+ * @deprecated since 1.21, version string is no longer supported
*/
- public abstract function getVersion();
+ public function getVersion() {
+ wfDeprecated( __METHOD__, '1.21' );
+ return '';
+ }
/**
* Get the name of the module being executed by this instance
@@ -124,6 +136,15 @@ abstract class ApiBase extends ContextSource {
}
/**
+ * Get the module manager, or null if this module has no sub-modules
+ * @since 1.21
+ * @return ApiModuleManager
+ */
+ public function getModuleManager() {
+ return null;
+ }
+
+ /**
* Get parameter prefix (usually two letters or an empty string).
* @return string
*/
@@ -168,7 +189,7 @@ abstract class ApiBase extends ContextSource {
* @return ApiResult
*/
public function getResult() {
- // Main module has getResult() method overriden
+ // Main module has getResult() method overridden
// Safety - avoid infinite loop:
if ( $this->isMain() ) {
ApiBase::dieDebug( __METHOD__, 'base method was called on main module. ' );
@@ -203,26 +224,32 @@ abstract class ApiBase extends ContextSource {
* section to notice any changes in API. Multiple calls to this
* function will result in the warning messages being separated by
* newlines
- * @param $warning string Warning message
+ * @param string $warning Warning message
*/
public function setWarning( $warning ) {
$result = $this->getResult();
$data = $result->getData();
- if ( isset( $data['warnings'][$this->getModuleName()] ) ) {
+ $moduleName = $this->getModuleName();
+ if ( isset( $data['warnings'][$moduleName] ) ) {
// Don't add duplicate warnings
- $warn_regex = preg_quote( $warning, '/' );
- if ( preg_match( "/{$warn_regex}(\\n|$)/", $data['warnings'][$this->getModuleName()]['*'] ) ) {
- return;
+ $oldWarning = $data['warnings'][$moduleName]['*'];
+ $warnPos = strpos( $oldWarning, $warning );
+ // If $warning was found in $oldWarning, check if it starts at 0 or after "\n"
+ if ( $warnPos !== false && ( $warnPos === 0 || $oldWarning[$warnPos - 1] === "\n" ) ) {
+ // Check if $warning is followed by "\n" or the end of the $oldWarning
+ $warnPos += strlen( $warning );
+ if ( strlen( $oldWarning ) <= $warnPos || $oldWarning[$warnPos] === "\n" ) {
+ return;
+ }
}
- $oldwarning = $data['warnings'][$this->getModuleName()]['*'];
// If there is a warning already, append it to the existing one
- $warning = "$oldwarning\n$warning";
- $result->unsetValue( 'warnings', $this->getModuleName() );
+ $warning = "$oldWarning\n$warning";
}
$msg = array();
ApiResult::setContent( $msg, $warning );
$result->disableSizeCheck();
- $result->addValue( 'warnings', $this->getModuleName(), $msg );
+ $result->addValue( 'warnings', $moduleName,
+ $msg, ApiResult::OVERRIDE | ApiResult::ADD_ON_TOP );
$result->enableSizeCheck();
}
@@ -254,6 +281,8 @@ abstract class ApiBase extends ContextSource {
}
$msg = $lnPrfx . implode( $lnPrfx, $msg ) . "\n";
+ $msg .= $this->makeHelpArrayToString( $lnPrfx, false, $this->getHelpUrls() );
+
if ( $this->isReadMode() ) {
$msg .= "\nThis module requires read rights";
}
@@ -297,25 +326,6 @@ abstract class ApiBase extends ContextSource {
}
}
}
-
- $msg .= $this->makeHelpArrayToString( $lnPrfx, "Help page", $this->getHelpUrls() );
-
- if ( $this->getMain()->getShowVersions() ) {
- $versions = $this->getVersion();
- $pattern = '/(\$.*) ([0-9a-z_]+\.php) (.*\$)/i';
- $callback = array( $this, 'makeHelpMsg_callback' );
-
- if ( is_array( $versions ) ) {
- foreach ( $versions as &$v ) {
- $v = preg_replace_callback( $pattern, $callback, $v );
- }
- $versions = implode( "\n ", $versions );
- } else {
- $versions = preg_replace_callback( $pattern, $callback, $versions );
- }
-
- $msg .= "Version:\n $versions\n";
- }
}
return $msg;
@@ -330,8 +340,8 @@ abstract class ApiBase extends ContextSource {
}
/**
- * @param $prefix string Text to split output items
- * @param $title string What is being output
+ * @param string $prefix Text to split output items
+ * @param string $title What is being output
* @param $input string|array
* @return string
*/
@@ -340,13 +350,15 @@ abstract class ApiBase extends ContextSource {
return '';
}
if ( !is_array( $input ) ) {
- $input = array(
- $input
- );
+ $input = array( $input );
}
if ( count( $input ) > 0 ) {
- $msg = $title . ( count( $input ) > 1 ? 's' : '' ) . ":\n ";
+ if ( $title ) {
+ $msg = $title . ( count( $input ) > 1 ? 's' : '' ) . ":\n ";
+ } else {
+ $msg = ' ';
+ }
$msg .= implode( $prefix, $input ) . "\n";
return $msg;
}
@@ -359,7 +371,7 @@ abstract class ApiBase extends ContextSource {
* @return string or false
*/
public function makeHelpMsgParameters() {
- $params = $this->getFinalParams();
+ $params = $this->getFinalParams( ApiBase::GET_VALUES_FOR_HELP );
if ( $params ) {
$paramsDescription = $this->getFinalParamDescription();
@@ -416,7 +428,7 @@ abstract class ApiBase extends ContextSource {
if ( $t === '' ) {
$nothingPrompt = 'Can be empty, or ';
} else {
- $choices[] = $t;
+ $choices[] = $t;
}
}
$desc .= $paramPrefix . $nothingPrompt . $prompt;
@@ -455,6 +467,9 @@ abstract class ApiBase extends ContextSource {
$desc .= $paramPrefix . $intRangeStr;
}
break;
+ case 'upload':
+ $desc .= $paramPrefix . "Must be posted as a file upload using multipart/form-data";
+ break;
}
}
@@ -487,44 +502,6 @@ abstract class ApiBase extends ContextSource {
}
/**
- * Callback for preg_replace_callback() call in makeHelpMsg().
- * Replaces a source file name with a link to ViewVC
- *
- * @param $matches array
- * @return string
- */
- public function makeHelpMsg_callback( $matches ) {
- global $wgAutoloadClasses, $wgAutoloadLocalClasses;
-
- $file = '';
- if ( isset( $wgAutoloadLocalClasses[get_class( $this )] ) ) {
- $file = $wgAutoloadLocalClasses[get_class( $this )];
- } elseif ( isset( $wgAutoloadClasses[get_class( $this )] ) ) {
- $file = $wgAutoloadClasses[get_class( $this )];
- }
-
- // Do some guesswork here
- $path = strstr( $file, 'includes/api/' );
- if ( $path === false ) {
- $path = strstr( $file, 'extensions/' );
- } else {
- $path = 'phase3/' . $path;
- }
-
- // Get the filename from $matches[2] instead of $file
- // If they're not the same file, they're assumed to be in the
- // same directory
- // This is necessary to make stuff like ApiMain::getVersion()
- // returning the version string for ApiBase work
- if ( $path ) {
- return "{$matches[0]}\n https://svn.wikimedia.org/" .
- "viewvc/mediawiki/trunk/" . dirname( $path ) .
- "/{$matches[2]}";
- }
- return $matches[0];
- }
-
- /**
* Returns the description string for this module
* @return mixed string or array of strings
*/
@@ -545,15 +522,22 @@ abstract class ApiBase extends ContextSource {
* value) or (parameter name) => (array with PARAM_* constants as keys)
* Don't call this function directly: use getFinalParams() to allow
* hooks to modify parameters as needed.
+ *
+ * Some derived classes may choose to handle an integer $flags parameter
+ * in the overriding methods. Callers of this method can pass zero or
+ * more OR-ed flags like GET_VALUES_FOR_HELP.
+ *
* @return array|bool
*/
- protected function getAllowedParams() {
+ protected function getAllowedParams( /* $flags = 0 */ ) {
+ // int $flags is not declared because it causes "Strict standards"
+ // warning. Most derived classes do not implement it.
return false;
}
/**
* Returns an array of parameter descriptions.
- * Don't call this functon directly: use getFinalParamDescription() to
+ * Don't call this function directly: use getFinalParamDescription() to
* allow hooks to modify descriptions as needed.
* @return array|bool False on no parameter descriptions
*/
@@ -565,11 +549,13 @@ abstract class ApiBase extends ContextSource {
* Get final list of parameters, after hooks have had a chance to
* tweak it as needed.
*
+ * @param int $flags Zero or more flags like GET_VALUES_FOR_HELP
* @return array|Bool False on no parameters
+ * @since 1.21 $flags param added
*/
- public function getFinalParams() {
- $params = $this->getAllowedParams();
- wfRunHooks( 'APIGetAllowedParams', array( &$this, &$params ) );
+ public function getFinalParams( $flags = 0 ) {
+ $params = $this->getAllowedParams( $flags );
+ wfRunHooks( 'APIGetAllowedParams', array( &$this, &$params, $flags ) );
return $params;
}
@@ -596,7 +582,7 @@ abstract class ApiBase extends ContextSource {
* The array can also contain a boolean under the key PROP_LIST,
* indicating whether the result is a list.
*
- * Don't call this functon directly: use getFinalResultProperties() to
+ * Don't call this function directly: use getFinalResultProperties() to
* allow hooks to modify descriptions as needed.
*
* @return array|bool False on no properties
@@ -645,7 +631,7 @@ abstract class ApiBase extends ContextSource {
/**
* This method mangles parameter name based on the prefix supplied to the constructor.
* Override this method to change parameter name during runtime
- * @param $paramName string Parameter name
+ * @param string $paramName Parameter name
* @return string Prefixed parameter name
*/
public function encodeParamName( $paramName ) {
@@ -680,8 +666,8 @@ abstract class ApiBase extends ContextSource {
/**
* Get a value for the given parameter
- * @param $paramName string Parameter name
- * @param $parseLimit bool see extractRequestParams()
+ * @param string $paramName Parameter name
+ * @param bool $parseLimit see extractRequestParams()
* @return mixed Parameter value
*/
protected function getParameter( $paramName, $parseLimit = true ) {
@@ -692,7 +678,7 @@ abstract class ApiBase extends ContextSource {
/**
* Die if none or more than one of a certain set of parameters is set and not false.
- * @param $params array of parameter names
+ * @param array $params of parameter names
*/
public function requireOnlyOneParameter( $params ) {
$required = func_get_args();
@@ -703,7 +689,7 @@ abstract class ApiBase extends ContextSource {
array( $this, "parameterNotEmpty" ) ) ), $required );
if ( count( $intersection ) > 1 ) {
- $this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', "{$p}invalidparammix" );
+ $this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', "{$p}invalidparammix" );
} elseif ( count( $intersection ) == 0 ) {
$this->dieUsage( "One of the parameters {$p}" . implode( ", {$p}", $required ) . ' is required', "{$p}missingparam" );
}
@@ -760,7 +746,7 @@ abstract class ApiBase extends ContextSource {
/**
* @param $params array
- * @param $load bool|string Whether load the object's state from the database:
+ * @param bool|string $load Whether load the object's state from the database:
* - false: don't load (if the pageid is given, it will still be loaded)
* - 'fromdb': load from a slave database
* - 'fromdbmaster': load from the master database
@@ -772,9 +758,12 @@ abstract class ApiBase extends ContextSource {
$pageObj = null;
if ( isset( $params['title'] ) ) {
$titleObj = Title::newFromText( $params['title'] );
- if ( !$titleObj ) {
+ if ( !$titleObj || $titleObj->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
+ if ( !$titleObj->canExist() ) {
+ $this->dieUsage( "Namespace doesn't allow actual pages", 'pagecannotexist' );
+ }
$pageObj = WikiPage::factory( $titleObj );
if ( $load !== false ) {
$pageObj->loadPageData( $load );
@@ -806,7 +795,7 @@ abstract class ApiBase extends ContextSource {
}
/**
- * Callback function used in requireOnlyOneParameter to check whether reequired parameters are set
+ * Callback function used in requireOnlyOneParameter to check whether required parameters are set
*
* @param $x object Parameter to check is not null/false
* @return bool
@@ -827,9 +816,9 @@ abstract class ApiBase extends ContextSource {
/**
* Return true if we're to watch the page, false if not, null if no change.
- * @param $watchlist String Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
+ * @param string $watchlist Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
* @param $titleObj Title the page under consideration
- * @param $userOption String The user option to consider when $watchlist=preferences.
+ * @param string $userOption The user option to consider when $watchlist=preferences.
* If not set will magically default to either watchdefault or watchcreations
* @return bool
*/
@@ -849,13 +838,13 @@ abstract class ApiBase extends ContextSource {
if ( $userWatching ) {
return true;
}
- # If no user option was passed, use watchdefault or watchcreation
+ # If no user option was passed, use watchdefault or watchcreations
if ( is_null( $userOption ) ) {
$userOption = $titleObj->exists()
? 'watchdefault' : 'watchcreations';
}
# Watch the article based on the user preference
- return (bool)$this->getUser()->getOption( $userOption );
+ return $this->getUser()->getBoolOption( $userOption );
case 'nochange':
return $userWatching;
@@ -867,9 +856,9 @@ abstract class ApiBase extends ContextSource {
/**
* Set a watch (or unwatch) based the based on a watchlist parameter.
- * @param $watch String Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
+ * @param string $watch Valid values: 'watch', 'unwatch', 'preferences', 'nochange'
* @param $titleObj Title the article's title to change
- * @param $userOption String The user option to consider when $watch=preferences
+ * @param string $userOption The user option to consider when $watch=preferences
*/
protected function setWatch( $watch, $titleObj, $userOption = null ) {
$value = $this->getWatchlistValue( $watch, $titleObj, $userOption );
@@ -888,8 +877,8 @@ abstract class ApiBase extends ContextSource {
/**
* Using the settings determine the value for the given parameter
*
- * @param $paramName String: parameter name
- * @param $paramSettings array|mixed default value or an array of settings
+ * @param string $paramName parameter name
+ * @param array|mixed $paramSettings default value or an array of settings
* using PARAM_* constants.
* @param $parseLimit Boolean: parse limit?
* @return mixed Parameter value
@@ -929,9 +918,32 @@ abstract class ApiBase extends ContextSource {
ApiBase::dieDebug( __METHOD__, "Boolean param $encParamName's default is set to '$default'. Boolean parameters must default to false." );
}
- $value = $this->getRequest()->getCheck( $encParamName );
+ $value = $this->getMain()->getCheck( $encParamName );
+ } elseif ( $type == 'upload' ) {
+ if ( isset( $default ) ) {
+ // Having a default value is not allowed
+ ApiBase::dieDebug( __METHOD__, "File upload param $encParamName's default is set to '$default'. File upload parameters may not have a default." );
+ }
+ if ( $multi ) {
+ ApiBase::dieDebug( __METHOD__, "Multi-values not supported for $encParamName" );
+ }
+ $value = $this->getMain()->getUpload( $encParamName );
+ if ( !$value->exists() ) {
+ // This will get the value without trying to normalize it
+ // (because trying to normalize a large binary file
+ // accidentally uploaded as a field fails spectacularly)
+ $value = $this->getMain()->getRequest()->unsetVal( $encParamName );
+ if ( $value !== null ) {
+ $this->dieUsage(
+ "File upload param $encParamName is not a file upload; " .
+ "be sure to use multipart/form-data for your POST and include " .
+ "a filename in the Content-Disposition header.",
+ "badupload_{$encParamName}"
+ );
+ }
+ }
} else {
- $value = $this->getRequest()->getVal( $encParamName, $default );
+ $value = $this->getMain()->getVal( $encParamName, $default );
if ( isset( $value ) && $type == 'namespace' ) {
$type = MWNamespace::getValidNamespaces();
@@ -953,7 +965,6 @@ abstract class ApiBase extends ContextSource {
if ( $required && $value === '' ) {
$this->dieUsageMsg( array( 'missingparam', $paramName ) );
}
-
break;
case 'integer': // Force everything using intval() and optionally validate limits
$min = isset ( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : null;
@@ -1010,29 +1021,23 @@ abstract class ApiBase extends ContextSource {
}
break;
case 'user':
- if ( !is_array( $value ) ) {
- $value = array( $value );
- }
-
- foreach ( $value as $key => $val ) {
- $title = Title::makeTitleSafe( NS_USER, $val );
- if ( is_null( $title ) ) {
- $this->dieUsage( "Invalid value for user parameter $encParamName", "baduser_{$encParamName}" );
+ if ( is_array( $value ) ) {
+ foreach ( $value as $key => $val ) {
+ $value[$key] = $this->validateUser( $val, $encParamName );
}
- $value[$key] = $title->getText();
- }
-
- if ( !$multi ) {
- $value = $value[0];
+ } else {
+ $value = $this->validateUser( $value, $encParamName );
}
break;
+ case 'upload': // nothing to do
+ break;
default:
ApiBase::dieDebug( __METHOD__, "Param $encParamName's type is unknown - $type" );
}
}
// Throw out duplicates if requested
- if ( is_array( $value ) && !$dupes ) {
+ if ( !$dupes && is_array( $value ) ) {
$value = array_unique( $value );
}
@@ -1051,10 +1056,10 @@ abstract class ApiBase extends ContextSource {
* Return an array of values that were given in a 'a|b|c' notation,
* after it optionally validates them against the list allowed values.
*
- * @param $valueName string The name of the parameter (for error
+ * @param string $valueName The name of the parameter (for error
* reporting)
* @param $value mixed The value being parsed
- * @param $allowMultiple bool Can $value contain more than one value
+ * @param bool $allowMultiple Can $value contain more than one value
* separated by '|'?
* @param $allowedValues mixed An array of values to check against. If
* null, all values are accepted.
@@ -1106,11 +1111,11 @@ abstract class ApiBase extends ContextSource {
/**
* Validate the value against the minimum and user/bot maximum limits.
* Prints usage info on failure.
- * @param $paramName string Parameter name
- * @param $value int Parameter value
- * @param $min int|null Minimum value
- * @param $max int|null Maximum value for users
- * @param $botMax int Maximum value for sysops/bots
+ * @param string $paramName Parameter name
+ * @param int $value Parameter value
+ * @param int|null $min Minimum value
+ * @param int|null $max Maximum value for users
+ * @param int $botMax Maximum value for sysops/bots
* @param $enforceLimits Boolean Whether to enforce (die) if value is outside limits
*/
function validateLimit( $paramName, &$value, $min, $max, $botMax = null, $enforceLimits = false ) {
@@ -1144,16 +1149,31 @@ abstract class ApiBase extends ContextSource {
}
/**
- * @param $value string
- * @param $paramName string
- * @return string
+ * Validate and normalize of parameters of type 'timestamp'
+ * @param string $value Parameter value
+ * @param string $encParamName Parameter name
+ * @return string Validated and normalized parameter
+ */
+ function validateTimestamp( $value, $encParamName ) {
+ $unixTimestamp = wfTimestamp( TS_UNIX, $value );
+ if ( $unixTimestamp === false ) {
+ $this->dieUsage( "Invalid value '$value' for timestamp parameter $encParamName", "badtimestamp_{$encParamName}" );
+ }
+ return wfTimestamp( TS_MW, $unixTimestamp );
+ }
+
+ /**
+ * Validate and normalize of parameters of type 'user'
+ * @param string $value Parameter value
+ * @param string $encParamName Parameter value
+ * @return string Validated and normalized parameter
*/
- function validateTimestamp( $value, $paramName ) {
- $value = wfTimestamp( TS_UNIX, $value );
- if ( $value === 0 ) {
- $this->dieUsage( "Invalid value '$value' for timestamp parameter $paramName", "badtimestamp_{$paramName}" );
+ private function validateUser( $value, $encParamName ) {
+ $title = Title::makeTitleSafe( NS_USER, $value );
+ if ( $title === null ) {
+ $this->dieUsage( "Invalid value '$value' for user parameter $encParamName", "baduser_{$encParamName}" );
}
- return wfTimestamp( TS_MW, $value );
+ return $title->getText();
}
/**
@@ -1172,8 +1192,8 @@ abstract class ApiBase extends ContextSource {
/**
* Truncate an array to a certain length.
- * @param $arr array Array to truncate
- * @param $limit int Maximum length
+ * @param array $arr Array to truncate
+ * @param int $limit Maximum length
* @return bool True if the array was truncated, false otherwise
*/
public static function truncateArray( &$arr, $limit ) {
@@ -1189,12 +1209,12 @@ abstract class ApiBase extends ContextSource {
* Throw a UsageException, which will (if uncaught) call the main module's
* error handler and die with an error message.
*
- * @param $description string One-line human-readable description of the
+ * @param string $description One-line human-readable description of the
* error condition, e.g., "The API requires a valid action parameter"
- * @param $errorCode string Brief, arbitrary, stable string to allow easy
+ * @param string $errorCode Brief, arbitrary, stable string to allow easy
* automated identification of the error, e.g., 'unknown_action'
- * @param $httpRespCode int HTTP response code
- * @param $extradata array Data to add to the "<error>" element; array in ApiResult format
+ * @param int $httpRespCode HTTP response code
+ * @param array $extradata Data to add to the "<error>" element; array in ApiResult format
* @throws UsageException
*/
public function dieUsage( $description, $errorCode, $httpRespCode = 0, $extradata = null ) {
@@ -1226,7 +1246,7 @@ abstract class ApiBase extends ContextSource {
'nocreatetext' => array( 'code' => 'cantcreate-anon', 'info' => "Anonymous users can't create new pages" ),
'movenologintext' => array( 'code' => 'cantmove-anon', 'info' => "Anonymous users can't move pages" ),
'movenotallowed' => array( 'code' => 'cantmove', 'info' => "You don't have permission to move pages" ),
- 'confirmedittext' => array( 'code' => 'confirmemail', 'info' => "You must confirm your e-mail address before you can edit" ),
+ 'confirmedittext' => array( 'code' => 'confirmemail', 'info' => "You must confirm your email address before you can edit" ),
'blockedtext' => array( 'code' => 'blocked', 'info' => "You have been blocked from editing" ),
'autoblockedtext' => array( 'code' => 'autoblocked', 'info' => "Your IP address has been blocked automatically, because it was used by a blocked user" ),
@@ -1254,15 +1274,15 @@ abstract class ApiBase extends ContextSource {
'badipaddress' => array( 'code' => 'invalidip', 'info' => "Invalid IP address specified" ),
'ipb_expiry_invalid' => array( 'code' => 'invalidexpiry', 'info' => "Invalid expiry time" ),
'ipb_already_blocked' => array( 'code' => 'alreadyblocked', 'info' => "The user you tried to block was already blocked" ),
- 'ipb_blocked_as_range' => array( 'code' => 'blockedasrange', 'info' => "IP address \"\$1\" was blocked as part of range \"\$2\". You can't unblock the IP invidually, but you can unblock the range as a whole." ),
+ 'ipb_blocked_as_range' => array( 'code' => 'blockedasrange', 'info' => "IP address \"\$1\" was blocked as part of range \"\$2\". You can't unblock the IP individually, but you can unblock the range as a whole." ),
'ipb_cant_unblock' => array( 'code' => 'cantunblock', 'info' => "The block you specified was not found. It may have been unblocked already" ),
- 'mailnologin' => array( 'code' => 'cantsend', 'info' => "You are not logged in, you do not have a confirmed e-mail address, or you are not allowed to send e-mail to other users, so you cannot send e-mail" ),
+ 'mailnologin' => array( 'code' => 'cantsend', 'info' => "You are not logged in, you do not have a confirmed email address, or you are not allowed to send email to other users, so you cannot send email" ),
'ipbblocked' => array( 'code' => 'ipbblocked', 'info' => 'You cannot block or unblock users while you are yourself blocked' ),
'ipbnounblockself' => array( 'code' => 'ipbnounblockself', 'info' => 'You are not allowed to unblock yourself' ),
'usermaildisabled' => array( 'code' => 'usermaildisabled', 'info' => "User email has been disabled" ),
- 'blockedemailuser' => array( 'code' => 'blockedfrommail', 'info' => "You have been blocked from sending e-mail" ),
+ 'blockedemailuser' => array( 'code' => 'blockedfrommail', 'info' => "You have been blocked from sending email" ),
'notarget' => array( 'code' => 'notarget', 'info' => "You have not specified a valid target for this action" ),
- 'noemail' => array( 'code' => 'noemail', 'info' => "The user has not specified a valid e-mail address, or has chosen not to receive e-mail from other users" ),
+ 'noemail' => array( 'code' => 'noemail', 'info' => "The user has not specified a valid email address, or has chosen not to receive email from other users" ),
'rcpatroldisabled' => array( 'code' => 'patroldisabled', 'info' => "Patrolling is disabled on this wiki" ),
'markedaspatrollederror-noautopatrol' => array( 'code' => 'noautopatrol', 'info' => "You don't have permission to patrol your own changes" ),
'delete-toobig' => array( 'code' => 'bigdelete', 'info' => "You can't delete this page because it has more than \$1 revisions" ),
@@ -1291,7 +1311,7 @@ abstract class ApiBase extends ContextSource {
'missingtitle-createonly' => array( 'code' => 'missingtitle-createonly', 'info' => "Missing titles can only be protected with 'create'" ),
'cantblock' => array( 'code' => 'cantblock', 'info' => "You don't have permission to block users" ),
'canthide' => array( 'code' => 'canthide', 'info' => "You don't have permission to hide user names from the block log" ),
- 'cantblock-email' => array( 'code' => 'cantblock-email', 'info' => "You don't have permission to block users from sending e-mail through the wiki" ),
+ 'cantblock-email' => array( 'code' => 'cantblock-email', 'info' => "You don't have permission to block users from sending email through the wiki" ),
'unblock-notarget' => array( 'code' => 'notarget', 'info' => "Either the id or the user parameter must be set" ),
'unblock-idanduser' => array( 'code' => 'idanduser', 'info' => "The id and user parameters can't be used together" ),
'cantunblock' => array( 'code' => 'permissiondenied', 'info' => "You don't have permission to unblock users" ),
@@ -1349,8 +1369,8 @@ abstract class ApiBase extends ContextSource {
// uploadMsgs
'invalid-file-key' => array( 'code' => 'invalid-file-key', 'info' => 'Not a valid file key' ),
'nouploadmodule' => array( 'code' => 'nouploadmodule', 'info' => 'No upload module set' ),
- 'uploaddisabled' => array( 'code' => 'uploaddisabled', 'info' => 'Uploads are not enabled. Make sure $wgEnableUploads is set to true in LocalSettings.php and the PHP ini setting file_uploads is true' ),
- 'copyuploaddisabled' => array( 'code' => 'copyuploaddisabled', 'info' => 'Uploads by URL is not enabled. Make sure $wgAllowCopyUploads is set to true in LocalSettings.php.' ),
+ 'uploaddisabled' => array( 'code' => 'uploaddisabled', 'info' => 'Uploads are not enabled. Make sure $wgEnableUploads is set to true in LocalSettings.php and the PHP ini setting file_uploads is true' ),
+ 'copyuploaddisabled' => array( 'code' => 'copyuploaddisabled', 'info' => 'Uploads by URL is not enabled. Make sure $wgAllowCopyUploads is set to true in LocalSettings.php.' ),
'copyuploadbaddomain' => array( 'code' => 'copyuploadbaddomain', 'info' => 'Uploads by URL are not allowed from this domain.' ),
'filename-tooshort' => array( 'code' => 'filename-tooshort', 'info' => 'The filename is too short' ),
@@ -1385,8 +1405,41 @@ abstract class ApiBase extends ContextSource {
}
/**
+ * Will only set a warning instead of failing if the global $wgDebugAPI
+ * is set to true. Otherwise behaves exactly as dieUsageMsg().
+ * @param $error (array|string) Element of a getUserPermissionsErrors()-style array
+ * @since 1.21
+ */
+ public function dieUsageMsgOrDebug( $error ) {
+ global $wgDebugAPI;
+ if( $wgDebugAPI !== true ) {
+ $this->dieUsageMsg( $error );
+ } else {
+ if( is_string( $error ) ) {
+ $error = array( $error );
+ }
+ $parsed = $this->parseMsg( $error );
+ $this->setWarning( '$wgDebugAPI: ' . $parsed['code']
+ . ' - ' . $parsed['info'] );
+ }
+ }
+
+ /**
+ * Die with the $prefix.'badcontinue' error. This call is common enough to make it into the base method.
+ * @param $condition boolean will only die if this value is true
+ * @since 1.21
+ */
+ protected function dieContinueUsageIf( $condition ) {
+ if ( $condition ) {
+ $this->dieUsage(
+ 'Invalid continue param. You should pass the original value returned by the previous query',
+ 'badcontinue' );
+ }
+ }
+
+ /**
* Return the error message related to a certain array
- * @param $error array Element of a getUserPermissionsErrors()-style array
+ * @param array $error Element of a getUserPermissionsErrors()-style array
* @return array('code' => code, 'info' => info)
*/
public function parseMsg( $error ) {
@@ -1395,7 +1448,7 @@ abstract class ApiBase extends ContextSource {
// Check whether the error array was nested
// array( array( <code>, <params> ), array( <another_code>, <params> ) )
- if( is_array( $key ) ){
+ if( is_array( $key ) ) {
$error = $key;
$key = array_shift( $error );
}
@@ -1413,8 +1466,8 @@ abstract class ApiBase extends ContextSource {
/**
* Internal code errors should be reported with this method
- * @param $method string Method or function name
- * @param $message string Error message
+ * @param string $method Method or function name
+ * @param string $message Error message
*/
protected static function dieDebug( $method, $message ) {
wfDebugDieBacktrace( "Internal error in $method: $message" );
@@ -1515,10 +1568,17 @@ abstract class ApiBase extends ContextSource {
$params = $this->getFinalParams();
if ( $params ) {
foreach ( $params as $paramName => $paramSettings ) {
- if ( isset( $paramSettings[ApiBase::PARAM_REQUIRED] ) ) {
+ if ( isset( $paramSettings[ApiBase::PARAM_REQUIRED] ) && $paramSettings[ApiBase::PARAM_REQUIRED] ) {
$ret[] = array( 'missingparam', $paramName );
}
}
+ if ( array_key_exists( 'continue', $params ) ) {
+ $ret[] = array(
+ array(
+ 'code' => 'badcontinue',
+ 'info' => 'Invalid continue param. You should pass the original value returned by the previous query'
+ ) );
+ }
}
if ( $this->mustBePosted() ) {
@@ -1544,7 +1604,7 @@ abstract class ApiBase extends ContextSource {
/**
* Parses a list of errors into a standardised format
- * @param $errors array List of errors. Items can be in the for array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... )
+ * @param array $errors List of errors. Items can be in the for array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... )
* @return array Parsed list of errors with items in the form array( 'code' => ..., 'info' => ... )
*/
public function parseErrors( $errors ) {
@@ -1666,17 +1726,23 @@ abstract class ApiBase extends ContextSource {
}
/**
+ * Gets a default slave database connection object
* @return DatabaseBase
*/
protected function getDB() {
- return wfGetDB( DB_SLAVE, 'api' );
+ if ( !isset( $this->mSlaveDB ) ) {
+ $this->profileDBIn();
+ $this->mSlaveDB = wfGetDB( DB_SLAVE, 'api' );
+ $this->profileDBOut();
+ }
+ return $this->mSlaveDB;
}
/**
* Debugging function that prints a value and an optional backtrace
* @param $value mixed Value to print
- * @param $name string Description of the printed value
- * @param $backtrace bool If true, print a backtrace
+ * @param string $name Description of the printed value
+ * @param bool $backtrace If true, print a backtrace
*/
public static function debugPrint( $value, $name = 'unknown', $backtrace = false ) {
print "\n\n<pre><b>Debugging value '$name':</b>\n\n";
@@ -1686,12 +1752,4 @@ abstract class ApiBase extends ContextSource {
}
print "\n</pre>\n";
}
-
- /**
- * Returns a string that identifies the version of this class.
- * @return string
- */
- public static function getBaseVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiBlock.php b/includes/api/ApiBlock.php
index c879b35d..90432b95 100644
--- a/includes/api/ApiBlock.php
+++ b/includes/api/ApiBlock.php
@@ -25,17 +25,13 @@
*/
/**
-* API module that facilitates the blocking of users. Requires API write mode
-* to be enabled.
-*
+ * API module that facilitates the blocking of users. Requires API write mode
+ * to be enabled.
+ *
* @ingroup API
*/
class ApiBlock extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
/**
* Blocks the user specified in the parameters for the given expiry, with the
* given reason, and with all other settings provided in the params. If the block
@@ -55,6 +51,7 @@ class ApiBlock extends ApiBase {
if ( !$user->isAllowed( 'block' ) ) {
$this->dieUsageMsg( 'cantblock' );
}
+
# bug 15810: blocked admins should have limited access here
if ( $user->isBlocked() ) {
$status = SpecialBlock::checkUnblockSelf( $params['user'], $user );
@@ -62,6 +59,13 @@ class ApiBlock extends ApiBase {
$this->dieUsageMsg( array( $status ) );
}
}
+
+ $target = User::newFromName( $params['user'] );
+ // Bug 38633 - if the target is a user (not an IP address), but it doesn't exist or is unusable, error.
+ if ( $target instanceof User && ( $target->isAnon() /* doesn't exist */ || !User::isUsableName( $target->getName() ) ) ) {
+ $this->dieUsageMsg( array( 'nosuchuser', $params['user'] ) );
+ }
+
if ( $params['hidename'] && !$user->isAllowed( 'hideuser' ) ) {
$this->dieUsageMsg( 'canthide' );
}
@@ -70,6 +74,7 @@ class ApiBlock extends ApiBase {
}
$data = array(
+ 'PreviousTarget' => $params['user'],
'Target' => $params['user'],
'Reason' => array(
$params['reason'],
@@ -83,7 +88,7 @@ class ApiBlock extends ApiBase {
'DisableEmail' => $params['noemail'],
'HideUser' => $params['hidename'],
'DisableUTEdit' => !$params['allowusertalk'],
- 'AlreadyBlocked' => $params['reblock'],
+ 'Reblock' => $params['reblock'],
'Watch' => $params['watchuser'],
'Confirm' => true,
);
@@ -99,7 +104,7 @@ class ApiBlock extends ApiBase {
$res['userID'] = $target instanceof User ? $target->getId() : 0;
$block = Block::newFromTarget( $target );
- if( $block instanceof Block ){
+ if( $block instanceof Block ) {
$res['expiry'] = $block->mExpiry == $this->getDB()->getInfinity()
? 'infinite'
: wfTimestamp( TS_ISO_8601, $block->mExpiry );
@@ -178,7 +183,7 @@ class ApiBlock extends ApiBase {
'anononly' => 'Block anonymous users only (i.e. disable anonymous edits for this IP)',
'nocreate' => 'Prevent account creation',
'autoblock' => 'Automatically block the last used IP address, and any subsequent IP addresses they try to login from',
- 'noemail' => 'Prevent user from sending e-mail through the wiki. (Requires the "blockemail" right.)',
+ 'noemail' => 'Prevent user from sending email through the wiki. (Requires the "blockemail" right.)',
'hidename' => 'Hide the username from the block log. (Requires the "hideuser" right.)',
'allowusertalk' => 'Allow the user to edit their own talk page (depends on $wgBlockAllowsUTEdit)',
'reblock' => 'If the user is already blocked, overwrite the existing block',
@@ -256,8 +261,4 @@ class ApiBlock extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Block';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiComparePages.php b/includes/api/ApiComparePages.php
index ed72b29b..79ffcb0a 100644
--- a/includes/api/ApiComparePages.php
+++ b/includes/api/ApiComparePages.php
@@ -25,17 +25,21 @@
class ApiComparePages extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
$params = $this->extractRequestParams();
$rev1 = $this->revisionOrTitleOrId( $params['fromrev'], $params['fromtitle'], $params['fromid'] );
$rev2 = $this->revisionOrTitleOrId( $params['torev'], $params['totitle'], $params['toid'] );
- $de = new DifferenceEngine( $this->getContext(),
+ $revision = Revision::newFromId( $rev1 );
+
+ if ( !$revision ) {
+ $this->dieUsage( 'The diff cannot be retrieved, ' .
+ 'one revision does not exist or you do not have permission to view it.', 'baddiff' );
+ }
+
+ $contentHandler = $revision->getContentHandler();
+ $de = $contentHandler->createDifferenceEngine( $this->getContext(),
$rev1,
$rev2,
null, // rcid
@@ -77,11 +81,11 @@ class ApiComparePages extends ApiBase {
* @return int
*/
private function revisionOrTitleOrId( $revision, $titleText, $titleId ) {
- if( $revision ){
+ if( $revision ) {
return $revision;
} elseif( $titleText ) {
$title = Title::newFromText( $titleText );
- if( !$title ){
+ if( !$title || $title->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $titleText ) );
}
return $title->getLatestRevID();
@@ -164,8 +168,4 @@ class ApiComparePages extends ApiBase {
'api.php?action=compare&fromrev=1&torev=2' => 'Create a diff between revision 1 and 2',
);
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiCreateAccount.php b/includes/api/ApiCreateAccount.php
new file mode 100644
index 00000000..55c60cce
--- /dev/null
+++ b/includes/api/ApiCreateAccount.php
@@ -0,0 +1,298 @@
+<?php
+/**
+ * Created on August 7, 2012
+ *
+ * Copyright © 2012 Tyler Romeo <tylerromeo@gmail.com>
+ *
+ * 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
+ */
+
+/**
+ * Unit to authenticate account registration attempts to the current wiki.
+ *
+ * @ingroup API
+ */
+class ApiCreateAccount extends ApiBase {
+ public function execute() {
+
+ // $loginForm->addNewaccountInternal will throw exceptions
+ // if wiki is read only (already handled by api), user is blocked or does not have rights.
+ // Use userCan in order to hit GlobalBlock checks (according to Special:userlogin)
+ $loginTitle = SpecialPage::getTitleFor( 'Userlogin' );
+ if ( !$loginTitle->userCan( 'createaccount', $this->getUser() ) ) {
+ $this->dieUsage( 'You do not have the right to create a new account', 'permdenied-createaccount' );
+ }
+ if ( $this->getUser()->isBlockedFromCreateAccount() ) {
+ $this->dieUsage( 'You cannot create a new account because you are blocked', 'blocked' );
+ }
+
+ $params = $this->extractRequestParams();
+
+ $result = array();
+
+ // Init session if necessary
+ if ( session_id() == '' ) {
+ wfSetupSession();
+ }
+
+ if( $params['mailpassword'] && !$params['email'] ) {
+ $this->dieUsageMsg( 'noemail' );
+ }
+
+ $context = new DerivativeContext( $this->getContext() );
+ $context->setRequest( new DerivativeRequest(
+ $this->getContext()->getRequest(),
+ array(
+ 'type' => 'signup',
+ 'uselang' => $params['language'],
+ 'wpName' => $params['name'],
+ 'wpPassword' => $params['password'],
+ 'wpRetype' => $params['password'],
+ 'wpDomain' => $params['domain'],
+ 'wpEmail' => $params['email'],
+ 'wpRealName' => $params['realname'],
+ 'wpCreateaccountToken' => $params['token'],
+ 'wpCreateaccount' => $params['mailpassword'] ? null : '1',
+ 'wpCreateaccountMail' => $params['mailpassword'] ? '1' : null
+ )
+ ) );
+
+ $loginForm = new LoginForm();
+ $loginForm->setContext( $context );
+ $loginForm->load();
+
+ $status = $loginForm->addNewaccountInternal();
+ $result = array();
+ if( $status->isGood() ) {
+ // Success!
+ $user = $status->getValue();
+
+ // If we showed up language selection links, and one was in use, be
+ // smart (and sensible) and save that language as the user's preference
+ global $wgLoginLanguageSelector, $wgEmailAuthentication;
+ if( $wgLoginLanguageSelector && $params['language'] ) {
+ $user->setOption( 'language', $params['language'] );
+ }
+
+ if( $params['mailpassword'] ) {
+ // If mailpassword was set, disable the password and send an email.
+ $user->setPassword( null );
+ $status->merge( $loginForm->mailPasswordInternal( $user, false, 'createaccount-title', 'createaccount-text' ) );
+ } elseif( $wgEmailAuthentication && Sanitizer::validateEmail( $user->getEmail() ) ) {
+ // Send out an email authentication message if needed
+ $status->merge( $user->sendConfirmationMail() );
+ }
+
+ // Save settings (including confirmation token)
+ $user->saveSettings();
+
+ wfRunHooks( 'AddNewAccount', array( $user, $params['mailpassword'] ) );
+
+ if ( $params['mailpassword'] ) {
+ $logAction = 'byemail';
+ } elseif ( $this->getUser()->isLoggedIn() ) {
+ $logAction = 'create2';
+ } else {
+ $logAction = 'create';
+ }
+ $user->addNewUserLogEntry( $logAction, (string)$params['reason'] );
+
+ // Add username, id, and token to result.
+ $result['username'] = $user->getName();
+ $result['userid'] = $user->getId();
+ $result['token'] = $user->getToken();
+ }
+
+ $apiResult = $this->getResult();
+
+ if( $status->hasMessage( 'sessionfailure' ) || $status->hasMessage( 'nocookiesfornew' ) ) {
+ // Token was incorrect, so add it to result, but don't throw an exception
+ // since not having the correct token is part of the normal
+ // flow of events.
+ $result['token'] = LoginForm::getCreateaccountToken();
+ $result['result'] = 'needtoken';
+ } elseif( !$status->isOK() ) {
+ // There was an error. Die now.
+ // Cannot use dieUsageMsg() directly because extensions
+ // might return custom error messages.
+ $errors = $status->getErrorsArray();
+ if( $errors[0] instanceof Message ) {
+ $code = 'aborted';
+ $desc = $errors[0];
+ } else {
+ $code = array_shift( $errors[0] );
+ $desc = wfMessage( $code, $errors[0] );
+ }
+ $this->dieUsage( $desc, $code );
+ } elseif( !$status->isGood() ) {
+ // Status is not good, but OK. This means warnings.
+ $result['result'] = 'warning';
+
+ // Add any warnings to the result
+ $warnings = $status->getErrorsByType( 'warning' );
+ if( $warnings ) {
+ foreach( $warnings as &$warning ) {
+ $apiResult->setIndexedTagName( $warning['params'], 'param' );
+ }
+ $apiResult->setIndexedTagName( $warnings, 'warning' );
+ $result['warnings'] = $warnings;
+ }
+ } else {
+ // Everything was fine.
+ $result['result'] = 'success';
+ }
+
+ $apiResult->addValue( null, 'createaccount', $result );
+ }
+
+ public function getDescription() {
+ return 'Create a new user account.';
+ }
+
+ public function mustBePosted() {
+ return true;
+ }
+
+ public function isReadMode() {
+ return false;
+ }
+
+ public function isWriteMode() {
+ return true;
+ }
+
+ public function getAllowedParams() {
+ global $wgEmailConfirmToEdit;
+ return array(
+ 'name' => array(
+ ApiBase::PARAM_TYPE => 'user',
+ ApiBase::PARAM_REQUIRED => true
+ ),
+ 'password' => null,
+ 'domain' => null,
+ 'token' => null,
+ 'email' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => $wgEmailConfirmToEdit
+ ),
+ 'realname' => null,
+ 'mailpassword' => array(
+ ApiBase::PARAM_TYPE => 'boolean',
+ ApiBase::PARAM_DFLT => false
+ ),
+ 'reason' => null,
+ 'language' => null
+ );
+ }
+
+ public function getParamDescription() {
+ $p = $this->getModulePrefix();
+ return array(
+ 'name' => 'Username',
+ 'password' => "Password (ignored if {$p}mailpassword is set)",
+ 'domain' => 'Domain for external authentication (optional)',
+ 'token' => 'Account creation token obtained in first request',
+ 'email' => 'Email address of user (optional)',
+ 'realname' => 'Real name of user (optional)',
+ 'mailpassword' => 'If set to any value, a random password will be emailed to the user',
+ 'reason' => 'Optional reason for creating the account to be put in the logs',
+ 'language' => 'Language code to set as default for the user (optional, defaults to content language)'
+ );
+ }
+
+ public function getResultProperties() {
+ return array(
+ 'createaccount' => array(
+ 'result' => array(
+ ApiBase::PROP_TYPE => array(
+ 'success',
+ 'warning',
+ 'needtoken'
+ )
+ ),
+ 'username' => array(
+ ApiBase::PROP_TYPE => 'string',
+ ApiBase::PROP_NULLABLE => true
+ ),
+ 'userid' => array(
+ ApiBase::PROP_TYPE => 'int',
+ ApiBase::PROP_NULLABLE => true
+ ),
+ 'token' => array(
+ ApiBase::PROP_TYPE => 'string',
+ ApiBase::PROP_NULLABLE => true
+ ),
+ )
+ );
+ }
+
+ public function getPossibleErrors() {
+ // Note the following errors aren't possible and don't need to be listed:
+ // sessionfailure, nocookiesfornew, badretype
+ $localErrors = array(
+ 'wrongpassword', // Actually caused by wrong domain field. Riddle me that...
+ 'sorbs_create_account_reason',
+ 'noname',
+ 'userexists',
+ 'password-name-match', // from User::getPasswordValidity
+ 'password-login-forbidden', // from User::getPasswordValidity
+ 'noemailtitle',
+ 'invalidemailaddress',
+ 'externaldberror',
+ 'acct_creation_throttle_hit',
+ );
+
+ $errors = parent::getPossibleErrors();
+ // All local errors are from LoginForm, which means they're actually message keys.
+ foreach( $localErrors as $error ) {
+ $errors[] = array( 'code' => $error, 'info' => wfMessage( $error )->parse() );
+ }
+
+ $errors[] = array(
+ 'code' => 'permdenied-createaccount',
+ 'info' => 'You do not have the right to create a new account'
+ );
+ $errors[] = array(
+ 'code' => 'blocked',
+ 'info' => 'You cannot create a new account because you are blocked'
+ );
+ $errors[] = array(
+ 'code' => 'aborted',
+ 'info' => 'Account creation aborted by hook (info may vary)'
+ );
+
+ // 'passwordtooshort' has parameters. :(
+ global $wgMinimalPasswordLength;
+ $errors[] = array(
+ 'code' => 'passwordtooshort',
+ 'info' => wfMessage( 'passwordtooshort', $wgMinimalPasswordLength )->parse()
+ );
+ return $errors;
+ }
+
+ public function getExamples() {
+ return array(
+ 'api.php?action=createaccount&name=testuser&password=test123',
+ 'api.php?action=createaccount&name=testmailuser&mailpassword=true&reason=MyReason',
+ );
+ }
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Account_creation';
+ }
+}
diff --git a/includes/api/ApiDelete.php b/includes/api/ApiDelete.php
index 2d36f19a..d1f0806e 100644
--- a/includes/api/ApiDelete.php
+++ b/includes/api/ApiDelete.php
@@ -32,10 +32,6 @@
*/
class ApiDelete extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
/**
* Extracts the title, token, and reason from the request parameters and invokes
* the local delete() function with these as arguments. It does not make use of
@@ -61,6 +57,9 @@ class ApiDelete extends ApiBase {
$status = self::delete( $pageObj, $user, $params['token'], $reason );
}
+ if ( is_array( $status ) ) {
+ $this->dieUsageMsg( $status[0] );
+ }
if ( !$status->isGood() ) {
$errors = $status->getErrorsArray();
$this->dieUsageMsg( $errors[0] ); // We don't care about multiple errors, just report one of them
@@ -98,11 +97,11 @@ class ApiDelete extends ApiBase {
/**
* We have our own delete() function, since Article.php's implementation is split in two phases
*
- * @param $page WikiPage object to work on
+ * @param $page Page|WikiPage object to work on
* @param $user User doing the action
- * @param $token String: delete token (same as edit token)
- * @param $reason String: reason for the deletion. Autogenerated if NULL
- * @return Status
+ * @param string $token delete token (same as edit token)
+ * @param string|null $reason reason for the deletion. Autogenerated if NULL
+ * @return Status|array
*/
public static function delete( Page $page, User $user, $token, &$reason = null ) {
$title = $page->getTitle();
@@ -128,13 +127,13 @@ class ApiDelete extends ApiBase {
}
/**
- * @param $page WikiPage object to work on
+ * @param $page WikiPage|Page object to work on
* @param $user User doing the action
* @param $token
* @param $oldimage
* @param $reason
* @param $suppress bool
- * @return Status
+ * @return Status|array
*/
public static function deleteFile( Page $page, User $user, $token, $oldimage, &$reason = null, $suppress = false ) {
$title = $page->getTitle();
@@ -161,7 +160,7 @@ class ApiDelete extends ApiBase {
if ( is_null( $reason ) ) { // Log and RC don't like null reasons
$reason = '';
}
- return FileDeleteForm::doDelete( $title, $file, $oldimage, $reason, $suppress );
+ return FileDeleteForm::doDelete( $title, $file, $oldimage, $reason, $suppress, $user );
}
public function mustBePosted() {
@@ -264,8 +263,4 @@ class ApiDelete extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Delete';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiDisabled.php b/includes/api/ApiDisabled.php
index 13975aec..e5ef3b7e 100644
--- a/includes/api/ApiDisabled.php
+++ b/includes/api/ApiDisabled.php
@@ -36,10 +36,6 @@
*/
class ApiDisabled extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
$this->dieUsage( "The \"{$this->getModuleName()}\" module has been disabled.", 'moduledisabled' );
}
@@ -63,8 +59,4 @@ class ApiDisabled extends ApiBase {
public function getExamples() {
return array();
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiEditPage.php b/includes/api/ApiEditPage.php
index 0963fe7c..4916145b 100644
--- a/includes/api/ApiEditPage.php
+++ b/includes/api/ApiEditPage.php
@@ -33,10 +33,6 @@
*/
class ApiEditPage extends ApiBase {
- public function __construct( $query, $moduleName ) {
- parent::__construct( $query, $moduleName );
- }
-
public function execute() {
$user = $this->getUser();
$params = $this->extractRequestParams();
@@ -50,32 +46,28 @@ class ApiEditPage extends ApiBase {
$pageObj = $this->getTitleOrPageId( $params );
$titleObj = $pageObj->getTitle();
- if ( $titleObj->isExternal() ) {
- $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
- }
-
$apiResult = $this->getResult();
if ( $params['redirect'] ) {
if ( $titleObj->isRedirect() ) {
$oldTitle = $titleObj;
- $titles = Title::newFromRedirectArray(
- Revision::newFromTitle(
- $oldTitle, false, Revision::READ_LATEST
- )->getText( Revision::FOR_THIS_USER )
- );
+ $titles = Revision::newFromTitle( $oldTitle, false, Revision::READ_LATEST )
+ ->getContent( Revision::FOR_THIS_USER, $user )
+ ->getRedirectChain();
// array_shift( $titles );
$redirValues = array();
+
+ /** @var $newTitle Title */
foreach ( $titles as $id => $newTitle ) {
- if ( !isset( $titles[ $id - 1 ] ) ) {
- $titles[ $id - 1 ] = $oldTitle;
+ if ( !isset( $titles[$id - 1] ) ) {
+ $titles[$id - 1] = $oldTitle;
}
$redirValues[] = array(
- 'from' => $titles[ $id - 1 ]->getPrefixedText(),
+ 'from' => $titles[$id - 1]->getPrefixedText(),
'to' => $newTitle->getPrefixedText()
);
@@ -84,9 +76,34 @@ class ApiEditPage extends ApiBase {
$apiResult->setIndexedTagName( $redirValues, 'r' );
$apiResult->addValue( null, 'redirects', $redirValues );
+
+ // Since the page changed, update $pageObj
+ $pageObj = WikiPage::factory( $titleObj );
}
}
+ if ( !isset( $params['contentmodel'] ) || $params['contentmodel'] == '' ) {
+ $contentHandler = $pageObj->getContentHandler();
+ } else {
+ $contentHandler = ContentHandler::getForModelID( $params['contentmodel'] );
+ }
+
+ // @todo ask handler whether direct editing is supported at all! make allowFlatEdit() method or some such
+
+ if ( !isset( $params['contentformat'] ) || $params['contentformat'] == '' ) {
+ $params['contentformat'] = $contentHandler->getDefaultFormat();
+ }
+
+ $contentFormat = $params['contentformat'];
+
+ if ( !$contentHandler->isSupportedFormat( $contentFormat ) ) {
+ $name = $titleObj->getPrefixedDBkey();
+ $model = $contentHandler->getModelID();
+
+ $this->dieUsage( "The requested format $contentFormat is not supported for content model ".
+ " $model used by $name", 'badformat' );
+ }
+
if ( $params['createonly'] && $titleObj->exists() ) {
$this->dieUsageMsg( 'createonly-exists' );
}
@@ -103,31 +120,61 @@ class ApiEditPage extends ApiBase {
$this->dieUsageMsg( $errors[0] );
}
- $articleObj = Article::newFromTitle( $titleObj, $this->getContext() );
-
$toMD5 = $params['text'];
if ( !is_null( $params['appendtext'] ) || !is_null( $params['prependtext'] ) )
{
- // For non-existent pages, Article::getContent()
- // returns an interface message rather than ''
- // We do want getContent()'s behavior for non-existent
- // MediaWiki: pages, though
- if ( $articleObj->getID() == 0 && $titleObj->getNamespace() != NS_MEDIAWIKI ) {
- $content = '';
- } else {
- $content = $articleObj->getContent();
+ $content = $pageObj->getContent();
+
+ if ( !$content ) {
+ if ( $titleObj->getNamespace() == NS_MEDIAWIKI ) {
+ # If this is a MediaWiki:x message, then load the messages
+ # and return the message value for x.
+ $text = $titleObj->getDefaultMessageText();
+ if ( $text === false ) {
+ $text = '';
+ }
+
+ try {
+ $content = ContentHandler::makeContent( $text, $this->getTitle() );
+ } catch ( MWContentSerializationException $ex ) {
+ $this->dieUsage( $ex->getMessage(), 'parseerror' );
+ return;
+ }
+ } else {
+ # Otherwise, make a new empty content.
+ $content = $contentHandler->makeEmptyContent();
+ }
+ }
+
+ // @todo: Add support for appending/prepending to the Content interface
+
+ if ( !( $content instanceof TextContent ) ) {
+ $mode = $contentHandler->getModelID();
+ $this->dieUsage( "Can't append to pages using content model $mode", 'appendnotsupported' );
}
if ( !is_null( $params['section'] ) ) {
+ if ( !$contentHandler->supportsSections() ) {
+ $modelName = $contentHandler->getModelID();
+ $this->dieUsage( "Sections are not supported for this content model: $modelName.", 'sectionsnotsupported' );
+ }
+
// Process the content for section edits
- global $wgParser;
$section = intval( $params['section'] );
- $content = $wgParser->getSection( $content, $section, false );
- if ( $content === false ) {
+ $content = $content->getSection( $section );
+
+ if ( !$content ) {
$this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
}
}
- $params['text'] = $params['prependtext'] . $content . $params['appendtext'];
+
+ if ( !$content ) {
+ $text = '';
+ } else {
+ $text = $content->serialize( $contentFormat );
+ }
+
+ $params['text'] = $params['prependtext'] . $text . $params['appendtext'];
$toMD5 = $params['prependtext'] . $params['appendtext'];
}
@@ -151,18 +198,21 @@ class ApiEditPage extends ApiBase {
$this->dieUsageMsg( array( 'nosuchrevid', $params['undoafter'] ) );
}
- if ( $undoRev->getPage() != $articleObj->getID() ) {
+ if ( $undoRev->getPage() != $pageObj->getID() ) {
$this->dieUsageMsg( array( 'revwrongpage', $undoRev->getID(), $titleObj->getPrefixedText() ) );
}
- if ( $undoafterRev->getPage() != $articleObj->getID() ) {
+ if ( $undoafterRev->getPage() != $pageObj->getID() ) {
$this->dieUsageMsg( array( 'revwrongpage', $undoafterRev->getID(), $titleObj->getPrefixedText() ) );
}
- $newtext = $articleObj->getUndoText( $undoRev, $undoafterRev );
- if ( $newtext === false ) {
+ $newContent = $contentHandler->getUndoContent( $pageObj->getRevision(), $undoRev, $undoafterRev );
+
+ if ( !$newContent ) {
$this->dieUsageMsg( 'undo-failure' );
}
- $params['text'] = $newtext;
+
+ $params['text'] = $newContent->serialize( $params['contentformat'] );
+
// If no summary was given and we only undid one rev,
// use an autosummary
if ( is_null( $params['summary'] ) && $titleObj->getNextRevisionID( $undoafterRev->getID() ) == $params['undo'] ) {
@@ -179,6 +229,8 @@ class ApiEditPage extends ApiBase {
// That interface kind of sucks, but it's workable
$requestArray = array(
'wpTextbox1' => $params['text'],
+ 'format' => $contentFormat,
+ 'model' => $contentHandler->getModelID(),
'wpEditToken' => $params['token'],
'wpIgnoreBlankSummary' => ''
);
@@ -191,18 +243,23 @@ class ApiEditPage extends ApiBase {
$requestArray['wpSectionTitle'] = $params['sectiontitle'];
}
+ // TODO: Pass along information from 'undoafter' as well
+ if ( $params['undo'] > 0 ) {
+ $requestArray['wpUndidRevision'] = $params['undo'];
+ }
+
// Watch out for basetimestamp == ''
// wfTimestamp() treats it as NOW, almost certainly causing an edit conflict
if ( !is_null( $params['basetimestamp'] ) && $params['basetimestamp'] != '' ) {
$requestArray['wpEdittime'] = wfTimestamp( TS_MW, $params['basetimestamp'] );
} else {
- $requestArray['wpEdittime'] = $articleObj->getTimestamp();
+ $requestArray['wpEdittime'] = $pageObj->getTimestamp();
}
if ( !is_null( $params['starttimestamp'] ) && $params['starttimestamp'] != '' ) {
$requestArray['wpStarttime'] = wfTimestamp( TS_MW, $params['starttimestamp'] );
} else {
- $requestArray['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
+ $requestArray['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
}
if ( $params['minor'] || ( !$params['notminor'] && $user->getOption( 'minordefault' ) ) ) {
@@ -244,7 +301,19 @@ class ApiEditPage extends ApiBase {
// TODO: Make them not or check if they still do
$wgTitle = $titleObj;
- $ep = new EditPage( $articleObj );
+ $articleContext = new RequestContext;
+ $articleContext->setRequest( $req );
+ $articleContext->setWikiPage( $pageObj );
+ $articleContext->setUser( $this->getUser() );
+
+ /** @var $articleObject Article */
+ $articleObject = Article::newFromWikiPage( $pageObj, $articleContext );
+
+ $ep = new EditPage( $articleObject );
+
+ // allow editing of non-textual content.
+ $ep->allowNonTextContent = true;
+
$ep->setContextTitle( $titleObj );
$ep->importFormData( $req );
@@ -262,7 +331,7 @@ class ApiEditPage extends ApiBase {
}
// Do the actual save
- $oldRevId = $articleObj->getRevIdFetched();
+ $oldRevId = $articleObject->getRevIdFetched();
$result = null;
// Fake $wgRequest for some hooks inside EditPage
// @todo FIXME: This interface SUCKS
@@ -278,6 +347,9 @@ class ApiEditPage extends ApiBase {
case EditPage::AS_HOOK_ERROR_EXPECTED:
$this->dieUsageMsg( 'hookaborted' );
+ case EditPage::AS_PARSE_ERROR:
+ $this->dieUsage( $status->getMessage(), 'parseerror' );
+
case EditPage::AS_IMAGE_REDIRECT_ANON:
$this->dieUsageMsg( 'noimageredirect-anon' );
@@ -324,19 +396,21 @@ class ApiEditPage extends ApiBase {
case EditPage::AS_SUCCESS_NEW_ARTICLE:
$r['new'] = '';
+ // fall-through
case EditPage::AS_SUCCESS_UPDATE:
$r['result'] = 'Success';
$r['pageid'] = intval( $titleObj->getArticleID() );
$r['title'] = $titleObj->getPrefixedText();
- $newRevId = $articleObj->getLatest();
+ $r['contentmodel'] = $titleObj->getContentModel();
+ $newRevId = $articleObject->getLatest();
if ( $newRevId == $oldRevId ) {
$r['nochange'] = '';
} else {
$r['oldrevid'] = intval( $oldRevId );
$r['newrevid'] = intval( $newRevId );
$r['newtimestamp'] = wfTimestamp( TS_ISO_8601,
- $articleObj->getTimestamp() );
+ $pageObj->getTimestamp() );
}
break;
@@ -380,6 +454,7 @@ class ApiEditPage extends ApiBase {
array( 'undo-failure' ),
array( 'hashcheckfailed' ),
array( 'hookaborted' ),
+ array( 'code' => 'parseerror', 'info' => 'Failed to parse the given text.' ),
array( 'noimageredirect-anon' ),
array( 'noimageredirect-logged' ),
array( 'spamdetected', 'spam' ),
@@ -397,6 +472,13 @@ class ApiEditPage extends ApiBase {
array( 'unknownerror', 'retval' ),
array( 'code' => 'nosuchsection', 'info' => 'There is no section section.' ),
array( 'code' => 'invalidsection', 'info' => 'The section parameter must be set to an integer or \'new\'' ),
+ array( 'code' => 'sectionsnotsupported', 'info' => 'Sections are not supported for this type of page.' ),
+ array( 'code' => 'editnotsupported', 'info' => 'Editing of this type of page is not supported using '
+ . 'the text based edit API.' ),
+ array( 'code' => 'appendnotsupported', 'info' => 'This type of page can not be edited by appending '
+ . 'or prepending text.' ),
+ array( 'code' => 'badformat', 'info' => 'The requested serialization format can not be applied to '
+ . 'the page\'s content model' ),
array( 'customcssprotected' ),
array( 'customjsprotected' ),
)
@@ -414,7 +496,6 @@ class ApiEditPage extends ApiBase {
'section' => null,
'sectiontitle' => array(
ApiBase::PARAM_TYPE => 'string',
- ApiBase::PARAM_REQUIRED => false,
),
'text' => null,
'token' => array(
@@ -460,6 +541,12 @@ class ApiEditPage extends ApiBase {
ApiBase::PARAM_TYPE => 'boolean',
ApiBase::PARAM_DFLT => false,
),
+ 'contentformat' => array(
+ ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
+ ),
+ 'contentmodel' => array(
+ ApiBase::PARAM_TYPE => ContentHandler::getContentModels(),
+ )
);
}
@@ -490,7 +577,7 @@ class ApiEditPage extends ApiBase {
'watch' => 'Add the page to your watchlist',
'unwatch' => 'Remove the page from your watchlist',
'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
- 'md5' => array( "The MD5 hash of the {$p}text parameter, or the {$p}prependtext and {$p}appendtext parameters concatenated.",
+ 'md5' => array( "The MD5 hash of the {$p}text parameter, or the {$p}prependtext and {$p}appendtext parameters concatenated.",
'If set, the edit won\'t be done unless the hash is correct' ),
'prependtext' => "Add this text to the beginning of the page. Overrides {$p}text",
'appendtext' => array( "Add this text to the end of the page. Overrides {$p}text.",
@@ -498,6 +585,8 @@ class ApiEditPage extends ApiBase {
'undo' => "Undo this revision. Overrides {$p}text, {$p}prependtext and {$p}appendtext",
'undoafter' => 'Undo all revisions from undo to this one. If not set, just undo one revision',
'redirect' => 'Automatically resolve redirects',
+ 'contentformat' => 'Content serialization format used for the input text',
+ 'contentmodel' => 'Content model of the new content',
);
}
@@ -546,10 +635,8 @@ class ApiEditPage extends ApiBase {
public function getExamples() {
return array(
-
'api.php?action=edit&title=Test&summary=test%20summary&text=article%20content&basetimestamp=20070824123454&token=%2B\\'
=> 'Edit a page (anonymous user)',
-
'api.php?action=edit&title=Test&summary=NOTOC&minor=&prependtext=__NOTOC__%0A&basetimestamp=20070824123454&token=%2B\\'
=> 'Prepend __NOTOC__ to a page (anonymous user)',
'api.php?action=edit&title=Test&undo=13585&undoafter=13579&basetimestamp=20070824123454&token=%2B\\'
@@ -560,8 +647,4 @@ class ApiEditPage extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Edit';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiEmailUser.php b/includes/api/ApiEmailUser.php
index 4fa03434..cd0d0cba 100644
--- a/includes/api/ApiEmailUser.php
+++ b/includes/api/ApiEmailUser.php
@@ -30,10 +30,6 @@
*/
class ApiEmailUser extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
$params = $this->extractRequestParams();
@@ -158,10 +154,6 @@ class ApiEmailUser extends ApiBase {
}
public function getHelpUrls() {
- return 'https://www.mediawiki.org/wiki/API:E-mail';
- }
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
+ return 'https://www.mediawiki.org/wiki/API:Email';
}
}
diff --git a/includes/api/ApiExpandTemplates.php b/includes/api/ApiExpandTemplates.php
index 160f5b91..f5898fb3 100644
--- a/includes/api/ApiExpandTemplates.php
+++ b/includes/api/ApiExpandTemplates.php
@@ -33,10 +33,6 @@
*/
class ApiExpandTemplates extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
// Cache may vary on $wgUser because ParserOptions gets data from it
$this->getMain()->setCacheMode( 'anon-public-user-private' );
@@ -46,7 +42,7 @@ class ApiExpandTemplates extends ApiBase {
// Create title for parser
$title_obj = Title::newFromText( $params['title'] );
- if ( !$title_obj ) {
+ if ( !$title_obj || $title_obj->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
@@ -130,8 +126,4 @@ class ApiExpandTemplates extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Parsing_wikitext#expandtemplates';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiFeedContributions.php b/includes/api/ApiFeedContributions.php
index 1cf760ae..015a9922 100644
--- a/includes/api/ApiFeedContributions.php
+++ b/includes/api/ApiFeedContributions.php
@@ -29,10 +29,6 @@
*/
class ApiFeedContributions extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
/**
* This module uses a custom feed wrapper printer.
*
@@ -51,7 +47,7 @@ class ApiFeedContributions extends ApiBase {
$this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
}
- if( !isset( $wgFeedClasses[ $params['feedformat'] ] ) ) {
+ if( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
$this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
}
@@ -130,10 +126,22 @@ class ApiFeedContributions extends ApiBase {
protected function feedItemDesc( $revision ) {
if( $revision ) {
$msg = wfMessage( 'colon-separator' )->inContentLanguage()->text();
+ $content = $revision->getContent();
+
+ if ( $content instanceof TextContent ) {
+ // only textual content has a "source view".
+ $html = nl2br( htmlspecialchars( $content->getNativeData() ) );
+ } else {
+ //XXX: we could get an HTML representation of the content via getParserOutput, but that may
+ // contain JS magic and generally may not be suitable for inclusion in a feed.
+ // Perhaps Content should have a getDescriptiveHtml method and/or a getSourceText method.
+ //Compare also FeedUtils::formatDiffRow.
+ $html = '';
+ }
+
return '<p>' . htmlspecialchars( $revision->getUserText() ) . $msg .
htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) .
- "</p>\n<hr />\n<div>" .
- nl2br( htmlspecialchars( $revision->getText() ) ) . "</div>";
+ "</p>\n<hr />\n<div>" . $html . "</div>";
}
return '';
}
@@ -201,8 +209,4 @@ class ApiFeedContributions extends ApiBase {
'api.php?action=feedcontributions&user=Reedy',
);
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiFeedWatchlist.php b/includes/api/ApiFeedWatchlist.php
index 6ccb02fe..6c793b36 100644
--- a/includes/api/ApiFeedWatchlist.php
+++ b/includes/api/ApiFeedWatchlist.php
@@ -33,10 +33,6 @@
*/
class ApiFeedWatchlist extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
/**
* This module uses a custom feed wrapper printer.
*
@@ -62,12 +58,9 @@ class ApiFeedWatchlist extends ApiBase {
$this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
}
- if( !isset( $wgFeedClasses[ $params['feedformat'] ] ) ) {
+ if( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
$this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
}
- if ( !is_null( $params['wlexcludeuser'] ) ) {
- $fauxReqArr['wlexcludeuser'] = $params['wlexcludeuser'];
- }
// limit to the number of hours going from now back
$endTime = wfTimestamp( TS_MW, time() - intval( $params['hours'] * 60 * 60 ) );
@@ -84,12 +77,15 @@ class ApiFeedWatchlist extends ApiBase {
'wllimit' => ( 50 > $wgFeedLimit ) ? $wgFeedLimit : 50
);
- if ( !is_null( $params['wlowner'] ) ) {
+ if ( $params['wlowner'] !== null ) {
$fauxReqArr['wlowner'] = $params['wlowner'];
}
- if ( !is_null( $params['wltoken'] ) ) {
+ if ( $params['wltoken'] !== null ) {
$fauxReqArr['wltoken'] = $params['wltoken'];
}
+ if ( $params['wlexcludeuser'] !== null ) {
+ $fauxReqArr['wlexcludeuser'] = $params['wlexcludeuser'];
+ }
// Support linking to diffs instead of article
if ( $params['linktodiffs'] ) {
@@ -233,8 +229,4 @@ class ApiFeedWatchlist extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Watchlist_feed';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiFileRevert.php b/includes/api/ApiFileRevert.php
index 83d078d2..cbb2ba6a 100644
--- a/includes/api/ApiFileRevert.php
+++ b/includes/api/ApiFileRevert.php
@@ -37,10 +37,6 @@ class ApiFileRevert extends ApiBase {
protected $params;
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
$this->params = $this->extractRequestParams();
// Extract the file and archiveName from the request parameters
@@ -50,7 +46,7 @@ class ApiFileRevert extends ApiBase {
$this->checkPermissions( $this->getUser() );
$sourceUrl = $this->file->getArchiveVirtualUrl( $this->archiveName );
- $status = $this->file->upload( $sourceUrl, $this->params['comment'], $this->params['comment'] );
+ $status = $this->file->upload( $sourceUrl, $this->params['comment'], $this->params['comment'], 0, false, false, $this->getUser() );
if ( $status->isGood() ) {
$result = array( 'result' => 'Success' );
@@ -73,8 +69,8 @@ class ApiFileRevert extends ApiBase {
protected function checkPermissions( $user ) {
$title = $this->file->getTitle();
$permissionErrors = array_merge(
- $title->getUserPermissionsErrors( 'edit' , $user ),
- $title->getUserPermissionsErrors( 'upload' , $user )
+ $title->getUserPermissionsErrors( 'edit', $user ),
+ $title->getUserPermissionsErrors( 'upload', $user )
);
if ( $permissionErrors ) {
@@ -191,12 +187,8 @@ class ApiFileRevert extends ApiBase {
public function getExamples() {
return array(
- 'api.php?action=filerevert&filename=Wiki.png&comment=Revert&archivename=20110305152740!Wiki.png&token=+\\'
+ 'api.php?action=filerevert&filename=Wiki.png&comment=Revert&archivename=20110305152740!Wiki.png&token=123ABC'
=> 'Revert Wiki.png to the version of 20110305152740',
);
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php
index 8ad9b8ca..d8aa1634 100644
--- a/includes/api/ApiFormatBase.php
+++ b/includes/api/ApiFormatBase.php
@@ -38,7 +38,7 @@ abstract class ApiFormatBase extends ApiBase {
* Constructor
* If $format ends with 'fm', pretty-print the output in HTML.
* @param $main ApiMain
- * @param $format string Format name
+ * @param string $format Format name
*/
public function __construct( $main, $format ) {
parent::__construct( $main, $format );
@@ -58,7 +58,7 @@ abstract class ApiFormatBase extends ApiBase {
* This method is not called if getIsHtml() returns true.
* @return string
*/
- public abstract function getMimeType();
+ abstract public function getMimeType();
/**
* Whether this formatter needs raw data such as _element tags
@@ -83,7 +83,7 @@ abstract class ApiFormatBase extends ApiBase {
* special-case fix that should be removed once the help has been
* reworked to use a fully HTML interface.
*
- * @param $b bool Whether or not ampersands should be escaped.
+ * @param bool $b Whether or not ampersands should be escaped.
*/
public function setUnescapeAmps ( $b ) {
$this->mUnescapeAmps = $b;
@@ -123,11 +123,13 @@ abstract class ApiFormatBase extends ApiBase {
/**
* Initialize the printer function and prepare the output headers, etc.
- * This method must be the first outputing method during execution.
- * A help screen's header is printed for the HTML-based output
- * @param $isError bool Whether an error message is printed
+ * This method must be the first outputting method during execution.
+ * A human-targeted notice about available formats is printed for the HTML-based output,
+ * except for help screens (caused by either an error in the API parameters,
+ * the calling of action=help, or requesting the root script api.php).
+ * @param bool $isHelpScreen Whether a help screen is going to be shown
*/
- function initPrinter( $isError ) {
+ function initPrinter( $isHelpScreen ) {
if ( $this->mDisabled ) {
return;
}
@@ -164,7 +166,7 @@ abstract class ApiFormatBase extends ApiBase {
<?php
- if ( !$isError ) {
+ if ( !$isHelpScreen ) {
?>
<br />
<small>
@@ -175,15 +177,18 @@ To see the non HTML representation of the <?php echo( $this->mFormat ); ?> forma
See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>, or
<a href='<?php echo( $script ); ?>'>API help</a> for more information.
</small>
+<pre style='white-space: pre-wrap;'>
<?php
- }
+ } else { // don't wrap the contents of the <pre> for help screens
+ // because these are actually formatted to rely on
+ // the monospaced font for layout purposes
?>
<pre>
<?php
-
+ }
}
}
@@ -248,7 +253,7 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
}
/**
- * Sets whether the pretty-printer should format *bold* and $italics$
+ * Sets whether the pretty-printer should format *bold*
* @param $help bool
*/
public function setHelp( $help = true ) {
@@ -264,22 +269,19 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
protected function formatHTML( $text ) {
// Escape everything first for full coverage
$text = htmlspecialchars( $text );
-
// encode all comments or tags as safe blue strings
$text = str_replace( '&lt;', '<span style="color:blue;">&lt;', $text );
$text = str_replace( '&gt;', '&gt;</span>', $text );
- // identify URLs
- $protos = wfUrlProtocolsWithoutProtRel();
- // This regex hacks around bug 13218 (&quot; included in the URL)
- $text = preg_replace( "#(((?i)$protos).*?)(&quot;)?([ \\'\"<>\n]|&lt;|&gt;|&quot;)#", '<a href="\\1">\\1</a>\\3\\4', $text );
// identify requests to api.php
$text = preg_replace( "#api\\.php\\?[^ <\n\t]+#", '<a href="\\0">\\0</a>', $text );
if ( $this->mHelp ) {
// make strings inside * bold
$text = preg_replace( "#\\*[^<>\n]+\\*#", '<b>\\0</b>', $text );
- // make strings inside $ italic
- $text = preg_replace( "#\\$[^<>\n]+\\$#", '<b><i>\\0</i></b>', $text );
}
+ // identify URLs
+ $protos = wfUrlProtocolsWithoutProtRel();
+ // This regex hacks around bug 13218 (&quot; included in the URL)
+ $text = preg_replace( "#(((?i)$protos).*?)(&quot;)?([ \\'\"<>\n]|&lt;|&gt;|&quot;)#", '<a href="\\1">\\1</a>\\3\\4', $text );
/**
* Temporary fix for bad links in help messages. As a special case,
@@ -308,10 +310,6 @@ See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>,
public function getDescription() {
return $this->getIsHtml() ? ' (pretty-print in HTML)' : '';
}
-
- public static function getBaseVersion() {
- return __CLASS__ . ': $Id$';
- }
}
/**
@@ -328,7 +326,7 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
* Call this method to initialize output data. See execute()
* @param $result ApiResult
* @param $feed object an instance of one of the $wgFeedClasses classes
- * @param $feedItems array of FeedItem objects
+ * @param array $feedItems of FeedItem objects
*/
public static function setResult( $result, $feed, $feedItems ) {
// Store output in the Result data.
@@ -381,8 +379,4 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
ApiBase::dieDebug( __METHOD__, 'Invalid feed class/item' );
}
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiFormatDbg.php b/includes/api/ApiFormatDbg.php
index 3d2a39ca..1b2e02c9 100644
--- a/includes/api/ApiFormatDbg.php
+++ b/includes/api/ApiFormatDbg.php
@@ -30,10 +30,6 @@
*/
class ApiFormatDbg extends ApiFormatBase {
- public function __construct( $main, $format ) {
- parent::__construct( $main, $format );
- }
-
public function getMimeType() {
// This looks like it should be text/plain, but IE7 is so
// brain-damaged it tries to parse text/plain as HTML if it
@@ -48,8 +44,4 @@ class ApiFormatDbg extends ApiFormatBase {
public function getDescription() {
return 'Output data in PHP\'s var_export() format' . parent::getDescription();
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiFormatDump.php b/includes/api/ApiFormatDump.php
index 0f055e13..62253e14 100644
--- a/includes/api/ApiFormatDump.php
+++ b/includes/api/ApiFormatDump.php
@@ -30,10 +30,6 @@
*/
class ApiFormatDump extends ApiFormatBase {
- public function __construct( $main, $format ) {
- parent::__construct( $main, $format );
- }
-
public function getMimeType() {
// This looks like it should be text/plain, but IE7 is so
// brain-damaged it tries to parse text/plain as HTML if it
@@ -52,8 +48,4 @@ class ApiFormatDump extends ApiFormatBase {
public function getDescription() {
return 'Output data in PHP\'s var_dump() format' . parent::getDescription();
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiFormatJson.php b/includes/api/ApiFormatJson.php
index acbc7d3b..abb63480 100644
--- a/includes/api/ApiFormatJson.php
+++ b/includes/api/ApiFormatJson.php
@@ -85,13 +85,9 @@ class ApiFormatJson extends ApiFormatBase {
public function getDescription() {
if ( $this->mIsRaw ) {
- return 'Output data with the debuging elements in JSON format' . parent::getDescription();
+ return 'Output data with the debugging elements in JSON format' . parent::getDescription();
} else {
return 'Output data in JSON format' . parent::getDescription();
}
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiFormatNone.php b/includes/api/ApiFormatNone.php
new file mode 100644
index 00000000..78023af3
--- /dev/null
+++ b/includes/api/ApiFormatNone.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ *
+ *
+ * Created on Oct 22, 2006
+ *
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ *
+ * 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
+ */
+
+/**
+ * API Serialized PHP output formatter
+ * @ingroup API
+ */
+class ApiFormatNone extends ApiFormatBase {
+
+ public function getMimeType() {
+ return 'text/plain';
+ }
+
+ public function execute() {
+ }
+
+ public function getDescription() {
+ return 'Output nothing' . parent::getDescription();
+ }
+}
diff --git a/includes/api/ApiFormatPhp.php b/includes/api/ApiFormatPhp.php
index fac2ca58..b2d1f044 100644
--- a/includes/api/ApiFormatPhp.php
+++ b/includes/api/ApiFormatPhp.php
@@ -30,10 +30,6 @@
*/
class ApiFormatPhp extends ApiFormatBase {
- public function __construct( $main, $format ) {
- parent::__construct( $main, $format );
- }
-
public function getMimeType() {
return 'application/vnd.php.serialized';
}
@@ -45,8 +41,4 @@ class ApiFormatPhp extends ApiFormatBase {
public function getDescription() {
return 'Output data in serialized PHP format' . parent::getDescription();
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiFormatRaw.php b/includes/api/ApiFormatRaw.php
index 184f0a34..d278efa0 100644
--- a/includes/api/ApiFormatRaw.php
+++ b/includes/api/ApiFormatRaw.php
@@ -66,8 +66,4 @@ class ApiFormatRaw extends ApiFormatBase {
}
$this->printText( $data['text'] );
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiFormatTxt.php b/includes/api/ApiFormatTxt.php
index 71414593..4130e70c 100644
--- a/includes/api/ApiFormatTxt.php
+++ b/includes/api/ApiFormatTxt.php
@@ -30,10 +30,6 @@
*/
class ApiFormatTxt extends ApiFormatBase {
- public function __construct( $main, $format ) {
- parent::__construct( $main, $format );
- }
-
public function getMimeType() {
// This looks like it should be text/plain, but IE7 is so
// brain-damaged it tries to parse text/plain as HTML if it
@@ -48,8 +44,4 @@ class ApiFormatTxt extends ApiFormatBase {
public function getDescription() {
return 'Output data in PHP\'s print_r() format' . parent::getDescription();
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiFormatWddx.php b/includes/api/ApiFormatWddx.php
index 65056e44..62b69bb6 100644
--- a/includes/api/ApiFormatWddx.php
+++ b/includes/api/ApiFormatWddx.php
@@ -30,10 +30,6 @@
*/
class ApiFormatWddx extends ApiFormatBase {
- public function __construct( $main, $format ) {
- parent::__construct( $main, $format );
- }
-
public function getMimeType() {
return 'text/xml';
}
@@ -112,8 +108,4 @@ class ApiFormatWddx extends ApiFormatBase {
public function getDescription() {
return 'Output data in WDDX format' . parent::getDescription();
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiFormatXml.php b/includes/api/ApiFormatXml.php
index 5ccf1859..b4e8e330 100644
--- a/includes/api/ApiFormatXml.php
+++ b/includes/api/ApiFormatXml.php
@@ -36,10 +36,6 @@ class ApiFormatXml extends ApiFormatBase {
private $mIncludeNamespace = false;
private $mXslt = null;
- public function __construct( $main, $format ) {
- parent::__construct( $main, $format );
- }
-
public function getMimeType() {
return 'text/xml';
}
@@ -92,7 +88,7 @@ class ApiFormatXml extends ApiFormatBase {
*
* @par Example:
* @verbatim
- * name='root', value = array( '_element'=>'page', 'x', 'y', 'z')
+ * name='root', value = array( '_element'=>'page', 'x', 'y', 'z')
* @endverbatim
* creates:
* @verbatim
@@ -105,7 +101,7 @@ class ApiFormatXml extends ApiFormatBase {
*
* @par Example:
* @verbatim
- * name='root', value = array( '*'=>'text', 'lang'=>'en', 'id'=>10)
+ * name='root', value = array( '*'=>'text', 'lang'=>'en', 'id'=>10)
* @endverbatim
* creates:
* @verbatim
@@ -205,7 +201,13 @@ class ApiFormatXml extends ApiFormatBase {
// ignore
break;
default:
- $retval .= $indstr . Xml::element( $elemName, null, $elemValue );
+ // to make sure null value doesn't produce unclosed element,
+ // which is what Xml::element( $elemName, null, null ) returns
+ if ( $elemValue === null ) {
+ $retval .= $indstr . Xml::element( $elemName );
+ } else {
+ $retval .= $indstr . Xml::element( $elemName, null, $elemValue );
+ }
break;
}
return $retval;
@@ -248,8 +250,4 @@ class ApiFormatXml extends ApiFormatBase {
public function getDescription() {
return 'Output data in XML format' . parent::getDescription();
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiFormatYaml.php b/includes/api/ApiFormatYaml.php
index 730ad8ea..700d4a5e 100644
--- a/includes/api/ApiFormatYaml.php
+++ b/includes/api/ApiFormatYaml.php
@@ -35,10 +35,6 @@ class ApiFormatYaml extends ApiFormatJson {
}
public function getDescription() {
- return 'Output data in YAML format' . parent::getDescription();
- }
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
+ return 'Output data in YAML format' . ApiFormatBase::getDescription();
}
}
diff --git a/includes/api/ApiHelp.php b/includes/api/ApiHelp.php
index 2b5de21a..9cafc5bb 100644
--- a/includes/api/ApiHelp.php
+++ b/includes/api/ApiHelp.php
@@ -31,10 +31,6 @@
*/
class ApiHelp extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
/**
* Module for displaying help
*/
@@ -47,43 +43,62 @@ class ApiHelp extends ApiBase {
}
$this->getMain()->setHelp();
-
$result = $this->getResult();
- $queryObj = new ApiQuery( $this->getMain(), 'query' );
- $r = array();
- if ( is_array( $params['modules'] ) ) {
- $modArr = $this->getMain()->getModules();
- foreach ( $params['modules'] as $m ) {
- if ( !isset( $modArr[$m] ) ) {
- $r[] = array( 'name' => $m, 'missing' => '' );
- continue;
- }
- $module = new $modArr[$m]( $this->getMain(), $m );
-
- $r[] = $this->buildModuleHelp( $module, 'action' );
- }
+ if ( is_array( $params['modules'] ) ) {
+ $modules = $params['modules'];
+ } else {
+ $modules = array();
}
if ( is_array( $params['querymodules'] ) ) {
- $qmodArr = $queryObj->getModules();
+ $queryModules = $params['querymodules'];
+ foreach ( $queryModules as $m ) {
+ $modules[] = 'query+' . $m;
+ }
+ } else {
+ $queryModules = array();
+ }
- foreach ( $params['querymodules'] as $qm ) {
- if ( !isset( $qmodArr[$qm] ) ) {
- $r[] = array( 'name' => $qm, 'missing' => '' );
- continue;
+ $r = array();
+ foreach ( $modules as $m ) {
+ // sub-modules could be given in the form of "name[+name[+name...]]"
+ $subNames = explode( '+', $m );
+ if ( count( $subNames ) === 1 ) {
+ // In case the '+' was typed into URL, it resolves as a space
+ $subNames = explode( ' ', $m );
+ }
+ $module = $this->getMain();
+ for ( $i = 0; $i < count( $subNames ); $i++ ) {
+ $subs = $module->getModuleManager();
+ if ( $subs === null ) {
+ $module = null;
+ } else {
+ $module = $subs->getModule( $subNames[$i] );
}
- $module = new $qmodArr[$qm]( $this, $qm );
- $type = $queryObj->getModuleType( $qm );
-
- if ( $type === null ) {
- $r[] = array( 'name' => $qm, 'missing' => '' );
- continue;
+ if ( $module === null ) {
+ if ( count( $subNames ) === 2
+ && $i === 1
+ && $subNames[0] === 'query'
+ && in_array( $subNames[1], $queryModules )
+ ) {
+ // Legacy: This is one of the renamed 'querymodule=...' parameters,
+ // do not use '+' notation in the output, use submodule's name instead.
+ $name = $subNames[1];
+ } else {
+ $name = implode( '+', array_slice( $subNames, 0, $i + 1 ) );
+ }
+ $r[] = array( 'name' => $name, 'missing' => '' );
+ break;
+ } else {
+ $type = $subs->getModuleGroup( $subNames[$i] );
}
-
+ }
+ if ( $module !== null ) {
$r[] = $this->buildModuleHelp( $module, $type );
}
}
+
$result->setIndexedTagName( $r, 'module' );
$result->addValue( null, $this->getModuleName(), $r );
}
@@ -118,15 +133,16 @@ class ApiHelp extends ApiBase {
ApiBase::PARAM_ISMULTI => true
),
'querymodules' => array(
- ApiBase::PARAM_ISMULTI => true
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_DEPRECATED => true
),
);
}
public function getParamDescription() {
return array(
- 'modules' => 'List of module names (value of the action= parameter)',
- 'querymodules' => 'List of query module names (value of prop=, meta= or list= parameter)',
+ 'modules' => 'List of module names (value of the action= parameter). Can specify submodules with a \'+\'',
+ 'querymodules' => 'Use modules=query+value instead. List of query module names (value of prop=, meta= or list= parameter)',
);
}
@@ -138,9 +154,8 @@ class ApiHelp extends ApiBase {
return array(
'api.php?action=help' => 'Whole help page',
'api.php?action=help&modules=protect' => 'Module (action) help page',
- 'api.php?action=help&querymodules=categorymembers' => 'Query (list) modules help page',
- 'api.php?action=help&querymodules=info' => 'Query (prop) modules help page',
- 'api.php?action=help&querymodules=siteinfo' => 'Query (meta) modules help page',
+ 'api.php?action=help&modules=query+categorymembers' => 'Help for the query/categorymembers module',
+ 'api.php?action=help&modules=login|query+info' => 'Help for the login and query/info modules',
);
}
@@ -151,8 +166,4 @@ class ApiHelp extends ApiBase {
'https://www.mediawiki.org/wiki/API:Quick_start_guide',
);
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiImageRotate.php b/includes/api/ApiImageRotate.php
new file mode 100644
index 00000000..b2d75825
--- /dev/null
+++ b/includes/api/ApiImageRotate.php
@@ -0,0 +1,232 @@
+<?php
+/**
+ *
+ * Created on January 3rd, 2013
+ *
+ * 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
+ */
+
+class ApiImageRotate extends ApiBase {
+
+ private $mPageSet = null;
+
+ public function __construct( $main, $action ) {
+ parent::__construct( $main, $action );
+ }
+
+ /**
+ * Add all items from $values into the result
+ * @param array $result output
+ * @param array $values values to add
+ * @param string $flag the name of the boolean flag to mark this element
+ * @param string $name if given, name of the value
+ */
+ private static function addValues( array &$result, $values, $flag = null, $name = null ) {
+ foreach ( $values as $val ) {
+ if( $val instanceof Title ) {
+ $v = array();
+ ApiQueryBase::addTitleInfo( $v, $val );
+ } elseif( $name !== null ) {
+ $v = array( $name => $val );
+ } else {
+ $v = $val;
+ }
+ if( $flag !== null ) {
+ $v[$flag] = '';
+ }
+ $result[] = $v;
+ }
+ }
+
+
+ public function execute() {
+ $params = $this->extractRequestParams();
+ $rotation = $params[ 'rotation' ];
+ $user = $this->getUser();
+
+ $pageSet = $this->getPageSet();
+ $pageSet->execute();
+
+ $result = array();
+ $result = array();
+
+ self::addValues( $result, $pageSet->getInvalidTitles(), 'invalid', 'title' );
+ self::addValues( $result, $pageSet->getSpecialTitles(), 'special', 'title' );
+ self::addValues( $result, $pageSet->getMissingPageIDs(), 'missing', 'pageid' );
+ self::addValues( $result, $pageSet->getMissingRevisionIDs(), 'missing', 'revid' );
+ self::addValues( $result, $pageSet->getInterwikiTitlesAsResult() );
+
+ foreach ( $pageSet->getTitles() as $title ) {
+ $r = array();
+ $r['id'] = $title->getArticleID();
+ ApiQueryBase::addTitleInfo( $r, $title );
+ if ( !$title->exists() ) {
+ $r['missing'] = '';
+ }
+
+ $file = wfFindFile( $title );
+ if ( !$file ) {
+ $r['result'] = 'Failure';
+ $r['errormessage'] = 'File does not exist';
+ $result[] = $r;
+ continue;
+ }
+ $handler = $file->getHandler();
+ if ( !$handler || !$handler->canRotate() ) {
+ $r['result'] = 'Failure';
+ $r['errormessage'] = 'File type cannot be rotated';
+ $result[] = $r;
+ continue;
+ }
+
+ // Check whether we're allowed to rotate this file
+ $permError = $this->checkPermissions( $this->getUser(), $file->getTitle() );
+ if ( $permError !== null ) {
+ $r['result'] = 'Failure';
+ $r['errormessage'] = $permError;
+ $result[] = $r;
+ continue;
+ }
+
+ $srcPath = $file->getLocalRefPath();
+ if ( $srcPath === false ) {
+ $r['result'] = 'Failure';
+ $r['errormessage'] = 'Cannot get local file path';
+ $result[] = $r;
+ continue;
+ }
+ $ext = strtolower( pathinfo( "$srcPath", PATHINFO_EXTENSION ) );
+ $tmpFile = TempFSFile::factory( 'rotate_', $ext);
+ $dstPath = $tmpFile->getPath();
+ $err = $handler->rotate( $file, array(
+ "srcPath" => $srcPath,
+ "dstPath" => $dstPath,
+ "rotation"=> $rotation
+ ) );
+ if ( !$err ) {
+ $comment = wfMessage( 'rotate-comment' )->numParams( $rotation )->text();
+ $status = $file->upload( $dstPath,
+ $comment, $comment, 0, false, false, $this->getUser() );
+ if ( $status->isGood() ) {
+ $r['result'] = 'Success';
+ } else {
+ $r['result'] = 'Failure';
+ $r['errormessage'] = $this->getResult()->convertStatusToArray( $status );
+ }
+ } else {
+ $r['result'] = 'Failure';
+ $r['errormessage'] = $err->toText();
+ }
+ $result[] = $r;
+ }
+ $apiResult = $this->getResult();
+ $apiResult->setIndexedTagName( $result, 'page' );
+ $apiResult->addValue( null, $this->getModuleName(), $result );
+ }
+
+ /**
+ * Get a cached instance of an ApiPageSet object
+ * @return ApiPageSet
+ */
+ private function getPageSet() {
+ if ( $this->mPageSet === null ) {
+ $this->mPageSet = new ApiPageSet( $this, 0, NS_FILE );
+ }
+ return $this->mPageSet;
+ }
+
+ /**
+ * Checks that the user has permissions to perform rotations.
+ * @param $user User The user to check.
+ * @return string|null Permission error message, or null if there is no error
+ */
+ protected function checkPermissions( $user, $title ) {
+ $permissionErrors = array_merge(
+ $title->getUserPermissionsErrors( 'edit' , $user ),
+ $title->getUserPermissionsErrors( 'upload' , $user )
+ );
+
+ if ( $permissionErrors ) {
+ // Just return the first error
+ $msg = $this->parseMsg( $permissionErrors[0] );
+ return $msg['info'];
+ }
+
+ return null;
+ }
+
+ public function mustBePosted() {
+ return true;
+ }
+
+ public function isWriteMode() {
+ return true;
+ }
+
+ public function getAllowedParams( $flags = 0 ) {
+ $pageSet = $this->getPageSet();
+ $result = array(
+ 'rotation' => array(
+ ApiBase::PARAM_TYPE => array( '90', '180', '270' ),
+ ApiBase::PARAM_REQUIRED => true
+ ),
+ 'token' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true
+ ),
+ );
+ if ( $flags ) {
+ $result += $this->getPageSet()->getFinalParams( $flags );
+ }
+ return $result;
+ }
+
+ public function getParamDescription() {
+ $pageSet = $this->getPageSet();
+ return $pageSet->getParamDescription() + array(
+ 'rotation' => 'Degrees to rotate image clockwise',
+ 'token' => 'Edit token. You can get one of these through action=tokens',
+ );
+ }
+
+ public function getDescription() {
+ return 'Rotate one or more images';
+ }
+
+ public function needsToken() {
+ return true;
+ }
+
+ public function getTokenSalt() {
+ return '';
+ }
+
+ public function getPossibleErrors() {
+ $pageSet = $this->getPageSet();
+ return array_merge(
+ parent::getPossibleErrors(),
+ $pageSet->getPossibleErrors()
+ );
+ }
+
+ public function getExamples() {
+ return array(
+ 'api.php?action=imagerotate&titles=Example.jpg&rotation=90&token=123ABC',
+ );
+ }
+}
diff --git a/includes/api/ApiImport.php b/includes/api/ApiImport.php
index 637c1fff..1f0a5fab 100644
--- a/includes/api/ApiImport.php
+++ b/includes/api/ApiImport.php
@@ -31,10 +31,6 @@
*/
class ApiImport extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
$user = $this->getUser();
$params = $this->extractRequestParams();
@@ -109,7 +105,9 @@ class ApiImport extends ApiBase {
ApiBase::PARAM_REQUIRED => true
),
'summary' => null,
- 'xml' => null,
+ 'xml' => array(
+ ApiBase::PARAM_TYPE => 'upload',
+ ),
'interwikisource' => array(
ApiBase::PARAM_TYPE => $wgImportSources
),
@@ -150,7 +148,7 @@ class ApiImport extends ApiBase {
public function getDescription() {
return array(
- 'Import a page from another wiki, or an XML file.' ,
+ 'Import a page from another wiki, or an XML file.',
'Note that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when',
'sending a file for the "xml" parameter.'
);
@@ -186,10 +184,6 @@ class ApiImport extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Import';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
/**
diff --git a/includes/api/ApiLogin.php b/includes/api/ApiLogin.php
index 1f91fe92..b936d3be 100644
--- a/includes/api/ApiLogin.php
+++ b/includes/api/ApiLogin.php
@@ -38,7 +38,7 @@ class ApiLogin extends ApiBase {
/**
* Executes the log-in attempt using the parameters passed. If
- * the log-in succeeeds, it attaches a cookie to the session
+ * the log-in succeeds, it attaches a cookie to the session
* and outputs the user id, username, and session token. If a
* log-in fails, as the result of a bad password, a nonexistent
* user, or any other reason, the host is cached with an expiry
@@ -147,7 +147,7 @@ class ApiLogin extends ApiBase {
case LoginForm::ABORTED:
$result['result'] = 'Aborted';
- $result['reason'] = $loginForm->mAbortLoginErrorMsg;
+ $result['reason'] = $loginForm->mAbortLoginErrorMsg;
break;
default:
@@ -278,8 +278,4 @@ class ApiLogin extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Login';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiLogout.php b/includes/api/ApiLogout.php
index b2f634d0..2ba92a63 100644
--- a/includes/api/ApiLogout.php
+++ b/includes/api/ApiLogout.php
@@ -32,10 +32,6 @@
*/
class ApiLogout extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
$user = $this->getUser();
$oldName = $user->getName();
@@ -75,8 +71,4 @@ class ApiLogout extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Logout';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php
index 35febd95..80bca2f6 100644
--- a/includes/api/ApiMain.php
+++ b/includes/api/ApiMain.php
@@ -51,6 +51,7 @@ class ApiMain extends ApiBase {
private static $Modules = array(
'login' => 'ApiLogin',
'logout' => 'ApiLogout',
+ 'createaccount' => 'ApiCreateAccount',
'query' => 'ApiQuery',
'expandtemplates' => 'ApiExpandTemplates',
'parse' => 'ApiParse',
@@ -82,6 +83,7 @@ class ApiMain extends ApiBase {
'import' => 'ApiImport',
'userrights' => 'ApiUserrights',
'options' => 'ApiOptions',
+ 'imagerotate' =>'ApiImageRotate',
);
/**
@@ -105,6 +107,7 @@ class ApiMain extends ApiBase {
'dbgfm' => 'ApiFormatDbg',
'dump' => 'ApiFormatDump',
'dumpfm' => 'ApiFormatDump',
+ 'none' => 'ApiFormatNone',
);
/**
@@ -118,7 +121,7 @@ class ApiMain extends ApiBase {
'msg' => 'Use of the write API',
'params' => array()
),
- 'apihighlimits' => array(
+ 'apihighlimits' => array(
'msg' => 'Use higher limits in API queries (Slow queries: $1 results; Fast queries: $2 results). The limits for slow queries also apply to multivalue parameters.',
'params' => array( ApiBase::LIMIT_SML2, ApiBase::LIMIT_BIG2 )
)
@@ -129,18 +132,20 @@ class ApiMain extends ApiBase {
*/
private $mPrinter;
- private $mModules, $mModuleNames, $mFormats, $mFormatNames;
- private $mResult, $mAction, $mShowVersions, $mEnableWrite;
+ private $mModuleMgr, $mResult;
+ private $mAction;
+ private $mEnableWrite;
private $mInternalMode, $mSquidMaxage, $mModule;
private $mCacheMode = 'private';
private $mCacheControl = array();
+ private $mParamsUsed = array();
/**
* Constructs an instance of ApiMain that utilizes the module and format specified by $request.
*
* @param $context IContextSource|WebRequest - if this is an instance of FauxRequest, errors are thrown and no printing occurs
- * @param $enableWrite bool should be set to true if the api may modify data
+ * @param bool $enableWrite should be set to true if the api may modify data
*/
public function __construct( $context = null, $enableWrite = false ) {
if ( $context === null ) {
@@ -168,7 +173,7 @@ class ApiMain extends ApiBase {
// Remove all modules other than login
global $wgUser;
- if ( $this->getRequest()->getVal( 'callback' ) !== null ) {
+ if ( $this->getVal( 'callback' ) !== null ) {
// JSON callback allows cross-site reads.
// For safety, strip user credentials.
wfDebug( "API: stripping user credentials for JSON callback\n" );
@@ -177,15 +182,13 @@ class ApiMain extends ApiBase {
}
}
- global $wgAPIModules; // extension modules
- $this->mModules = $wgAPIModules + self::$Modules;
-
- $this->mModuleNames = array_keys( $this->mModules );
- $this->mFormats = self::$Formats;
- $this->mFormatNames = array_keys( $this->mFormats );
+ global $wgAPIModules;
+ $this->mModuleMgr = new ApiModuleManager( $this );
+ $this->mModuleMgr->addModules( self::$Modules, 'action' );
+ $this->mModuleMgr->addModules( $wgAPIModules, 'action' );
+ $this->mModuleMgr->addModules( self::$Formats, 'format' );
$this->mResult = new ApiResult( $this );
- $this->mShowVersions = false;
$this->mEnableWrite = $enableWrite;
$this->mSquidMaxage = - 1; // flag for executeActionWithErrorHandling()
@@ -242,7 +245,7 @@ class ApiMain extends ApiBase {
/**
* Set the type of caching headers which will be sent.
*
- * @param $mode String One of:
+ * @param string $mode One of:
* - 'public': Cache this object in public caches, if the maxage or smaxage
* parameter is set, or if setCacheMaxAge() was called. If a maximum age is
* not provided by any of these means, the object will be private.
@@ -271,7 +274,7 @@ class ApiMain extends ApiBase {
return;
}
- if ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) ) {
+ if ( !User::groupHasPermission( '*', 'read' ) ) {
// Private wiki, only private headers
if ( $mode !== 'private' ) {
wfDebug( __METHOD__ . ": ignoring request for $mode cache mode, private wiki\n" );
@@ -330,10 +333,11 @@ class ApiMain extends ApiBase {
* @return ApiFormatBase
*/
public function createPrinterByName( $format ) {
- if ( !isset( $this->mFormats[$format] ) ) {
+ $printer = $this->mModuleMgr->getModule( $format, 'format' );
+ if ( $printer === null ) {
$this->dieUsage( "Unrecognized format: {$format}", 'unknown_format' );
}
- return new $this->mFormats[$format] ( $this, $format );
+ return $printer;
}
/**
@@ -361,10 +365,17 @@ class ApiMain extends ApiBase {
return;
}
+ // Exit here if the request method was OPTIONS
+ // (assume there will be a followup GET or POST)
+ if ( $this->getRequest()->getMethod() === 'OPTIONS' ) {
+ return;
+ }
+
// In case an error occurs during data output,
// clear the output buffer and print just the error information
ob_start();
+ $t = microtime( true );
try {
$this->executeAction();
} catch ( Exception $e ) {
@@ -372,11 +383,16 @@ class ApiMain extends ApiBase {
wfRunHooks( 'ApiMain::onException', array( $this, $e ) );
// Log it
- if ( !( $e instanceof UsageException ) ) {
- wfDebugLog( 'exception', $e->getLogMessage() );
+ if ( $e instanceof MWException && !( $e instanceof UsageException ) ) {
+ global $wgLogExceptionBacktrace;
+ if ( $wgLogExceptionBacktrace ) {
+ wfDebugLog( 'exception', $e->getLogMessage() . "\n" . $e->getTraceAsString() . "\n" );
+ } else {
+ wfDebugLog( 'exception', $e->getLogMessage() );
+ }
}
- // Handle any kind of exception by outputing properly formatted error message.
+ // Handle any kind of exception by outputting properly formatted error message.
// If this fails, an unhandled exception should be thrown so that global error
// handler will process and log it.
@@ -401,6 +417,9 @@ class ApiMain extends ApiBase {
$this->printResult( true );
}
+ // Log the request whether or not there was an error
+ $this->logRequest( microtime( true ) - $t);
+
// Send cache headers after any code which might generate an error, to
// avoid sending public cache headers for errors.
$this->sendCacheHeaders();
@@ -461,9 +480,9 @@ class ApiMain extends ApiBase {
/**
* Attempt to match an Origin header against a set of rules and a set of exceptions
- * @param $value string Origin header
- * @param $rules array Set of wildcard rules
- * @param $exceptions array Set of wildcard rules
+ * @param string $value Origin header
+ * @param array $rules Set of wildcard rules
+ * @param array $exceptions Set of wildcard rules
* @return bool True if $value matches a rule in $rules and doesn't match any rules in $exceptions, false otherwise
*/
protected static function matchOrigin( $value, $rules, $exceptions ) {
@@ -486,7 +505,7 @@ class ApiMain extends ApiBase {
* '*' => '.*?'
* '?' => '.'
*
- * @param $wildcard string String with wildcards
+ * @param string $wildcard String with wildcards
* @return string Regular expression
*/
protected static function wildcardToRegex( $wildcard ) {
@@ -593,7 +612,7 @@ class ApiMain extends ApiBase {
if ( !isset ( $this->mPrinter ) ) {
// The printer has not been created yet. Try to manually get formatter value.
$value = $this->getRequest()->getVal( 'format', self::API_DEFAULT_FORMAT );
- if ( !in_array( $value, $this->mFormatNames ) ) {
+ if ( !$this->mModuleMgr->isDefined( $value, 'format' ) ) {
$value = self::API_DEFAULT_FORMAT;
}
@@ -611,7 +630,6 @@ class ApiMain extends ApiBase {
if ( $this->mPrinter->getWantsHelp() || $this->mAction == 'help' ) {
ApiResult::setContent( $errMessage, $this->makeHelpMsg() );
}
-
} else {
global $wgShowSQLErrors, $wgShowExceptionDetails;
// Something is seriously wrong
@@ -628,6 +646,10 @@ class ApiMain extends ApiBase {
ApiResult::setContent( $errMessage, $wgShowExceptionDetails ? "\n\n{$e->getTraceAsString()}\n\n" : '' );
}
+ // Remember all the warnings to re-add them later
+ $oldResult = $result->getData();
+ $warnings = isset( $oldResult['warnings'] ) ? $oldResult['warnings'] : null;
+
$result->reset();
$result->disableSizeCheck();
// Re-add the id
@@ -635,11 +657,13 @@ class ApiMain extends ApiBase {
if ( !is_null( $requestid ) ) {
$result->addValue( null, 'requestid', $requestid );
}
-
if ( $wgShowHostnames ) {
// servedby is especially useful when debugging errors
$result->addValue( null, 'servedby', wfHostName() );
}
+ if ( $warnings !== null ) {
+ $result->addValue( null, 'warnings', $warnings );
+ }
$result->addValue( null, 'error', $errMessage );
@@ -669,7 +693,6 @@ class ApiMain extends ApiBase {
$params = $this->extractRequestParams();
- $this->mShowVersions = $params['version'];
$this->mAction = $params['action'];
if ( !is_string( $this->mAction ) ) {
@@ -685,9 +708,10 @@ class ApiMain extends ApiBase {
*/
protected function setupModule() {
// Instantiate the module requested by the user
- $module = new $this->mModules[$this->mAction] ( $this, $this->mAction );
- $this->mModule = $module;
-
+ $module = $this->mModuleMgr->getModule( $this->mAction, 'action' );
+ if ( $module === null ) {
+ $this->dieUsage( 'The API requires a valid action parameter', 'unknown_action' );
+ }
$moduleParams = $module->extractRequestParams();
// Die if token required, but not provided (unless there is a gettoken parameter)
@@ -713,7 +737,7 @@ class ApiMain extends ApiBase {
/**
* Check the max lag if necessary
* @param $module ApiBase object: Api module being used
- * @param $params Array an array containing the request parameters.
+ * @param array $params an array containing the request parameters.
* @return boolean True on success, false should exit immediately
*/
protected function checkMaxLag( $module, $params ) {
@@ -745,7 +769,7 @@ class ApiMain extends ApiBase {
*/
protected function checkExecutePermissions( $module ) {
$user = $this->getUser();
- if ( $module->isReadMode() && !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) &&
+ if ( $module->isReadMode() && !User::groupHasPermission( '*', 'read' ) &&
!$user->isAllowed( 'read' ) )
{
$this->dieUsageMsg( 'readrequired' );
@@ -772,12 +796,13 @@ class ApiMain extends ApiBase {
/**
* Check POST for external response and setup result printer
* @param $module ApiBase An Api module
- * @param $params Array an array with the request parameters
+ * @param array $params an array with the request parameters
*/
protected function setupExternalResponse( $module, $params ) {
- // Ignore mustBePosted() for internal calls
- if ( $module->mustBePosted() && !$this->getRequest()->wasPosted() ) {
- $this->dieUsageMsg( array( 'mustbeposted', $this->mAction ) );
+ if ( !$this->getRequest()->wasPosted() && $module->mustBePosted() ) {
+ // Module requires POST. GET request might still be allowed
+ // if $wgDebugApi is true, otherwise fail.
+ $this->dieUsageMsgOrDebug( array( 'mustbeposted', $this->mAction ) );
}
// See if custom printer is used
@@ -798,6 +823,7 @@ class ApiMain extends ApiBase {
protected function executeAction() {
$params = $this->setupExecuteAction();
$module = $this->setupModule();
+ $this->mModule = $module;
$this->checkExecutePermissions( $module );
@@ -815,6 +841,8 @@ class ApiMain extends ApiBase {
wfRunHooks( 'APIAfterExecute', array( &$module ) );
$module->profileOut();
+ $this->reportUnusedParams();
+
if ( !$this->mInternalMode ) {
//append Debug information
MWDebug::appendDebugInfoToApiResult( $this->getContext(), $this->getResult() );
@@ -825,11 +853,120 @@ class ApiMain extends ApiBase {
}
/**
+ * Log the preceding request
+ * @param $time Time in seconds
+ */
+ protected function logRequest( $time ) {
+ $request = $this->getRequest();
+ $milliseconds = $time === null ? '?' : round( $time * 1000 );
+ $s = 'API' .
+ ' ' . $request->getMethod() .
+ ' ' . wfUrlencode( str_replace( ' ', '_', $this->getUser()->getName() ) ) .
+ ' ' . $request->getIP() .
+ ' T=' . $milliseconds .'ms';
+ foreach ( $this->getParamsUsed() as $name ) {
+ $value = $request->getVal( $name );
+ if ( $value === null ) {
+ continue;
+ }
+ $s .= ' ' . $name . '=';
+ if ( strlen( $value ) > 256 ) {
+ $encValue = $this->encodeRequestLogValue( substr( $value, 0, 256 ) );
+ $s .= $encValue . '[...]';
+ } else {
+ $s .= $this->encodeRequestLogValue( $value );
+ }
+ }
+ $s .= "\n";
+ wfDebugLog( 'api', $s, false );
+ }
+
+ /**
+ * Encode a value in a format suitable for a space-separated log line.
+ */
+ protected function encodeRequestLogValue( $s ) {
+ static $table;
+ if ( !$table ) {
+ $chars = ';@$!*(),/:';
+ for ( $i = 0; $i < strlen( $chars ); $i++ ) {
+ $table[rawurlencode( $chars[$i] )] = $chars[$i];
+ }
+ }
+ return strtr( rawurlencode( $s ), $table );
+ }
+
+ /**
+ * Get the request parameters used in the course of the preceding execute() request
+ */
+ protected function getParamsUsed() {
+ return array_keys( $this->mParamsUsed );
+ }
+
+ /**
+ * Get a request value, and register the fact that it was used, for logging.
+ */
+ public function getVal( $name, $default = null ) {
+ $this->mParamsUsed[$name] = true;
+ return $this->getRequest()->getVal( $name, $default );
+ }
+
+ /**
+ * Get a boolean request value, and register the fact that the parameter
+ * was used, for logging.
+ */
+ public function getCheck( $name ) {
+ $this->mParamsUsed[$name] = true;
+ return $this->getRequest()->getCheck( $name );
+ }
+
+ /**
+ * Get a request upload, and register the fact that it was used, for logging.
+ *
+ * @since 1.21
+ * @param string $name Parameter name
+ * @return WebRequestUpload
+ */
+ public function getUpload( $name ) {
+ $this->mParamsUsed[$name] = true;
+ return $this->getRequest()->getUpload( $name );
+ }
+
+ /**
+ * Report unused parameters, so the client gets a hint in case it gave us parameters we don't know,
+ * for example in case of spelling mistakes or a missing 'g' prefix for generators.
+ */
+ protected function reportUnusedParams() {
+ $paramsUsed = $this->getParamsUsed();
+ $allParams = $this->getRequest()->getValueNames();
+
+ if ( !$this->mInternalMode ) {
+ // Printer has not yet executed; don't warn that its parameters are unused
+ $printerParams = array_map(
+ array( $this->mPrinter, 'encodeParamName' ),
+ array_keys( $this->mPrinter->getFinalParams() ?: array() )
+ );
+ $unusedParams = array_diff( $allParams, $paramsUsed, $printerParams );
+ } else {
+ $unusedParams = array_diff( $allParams, $paramsUsed );
+ }
+
+ if( count( $unusedParams ) ) {
+ $s = count( $unusedParams ) > 1 ? 's' : '';
+ $this->setWarning( "Unrecognized parameter$s: '" . implode( $unusedParams, "', '" ) . "'" );
+ }
+ }
+
+ /**
* Print results using the current printer
*
* @param $isError bool
*/
protected function printResult( $isError ) {
+ global $wgDebugAPI;
+ if( $wgDebugAPI !== false ) {
+ $this->setWarning( 'SECURITY WARNING: $wgDebugAPI is enabled' );
+ }
+
$this->getResult()->cleanUpUTF8();
$printer = $this->mPrinter;
$printer->profileIn();
@@ -839,10 +976,10 @@ class ApiMain extends ApiBase {
* tell the printer not to escape ampersands so that our links do
* not break.
*/
- $printer->setUnescapeAmps( ( $this->mAction == 'help' || $isError )
- && $printer->getFormat() == 'XML' && $printer->getIsHtml() );
+ $isHelp = $isError || $this->mAction == 'help';
+ $printer->setUnescapeAmps( $isHelp && $printer->getFormat() == 'XML' && $printer->getIsHtml() );
- $printer->initPrinter( $isError );
+ $printer->initPrinter( $isHelp );
$printer->execute();
$printer->closePrinter();
@@ -865,13 +1002,12 @@ class ApiMain extends ApiBase {
return array(
'format' => array(
ApiBase::PARAM_DFLT => ApiMain::API_DEFAULT_FORMAT,
- ApiBase::PARAM_TYPE => $this->mFormatNames
+ ApiBase::PARAM_TYPE => $this->mModuleMgr->getNames( 'format' )
),
'action' => array(
ApiBase::PARAM_DFLT => 'help',
- ApiBase::PARAM_TYPE => $this->mModuleNames
+ ApiBase::PARAM_TYPE => $this->mModuleMgr->getNames( 'action' )
),
- 'version' => false,
'maxlag' => array(
ApiBase::PARAM_TYPE => 'integer'
),
@@ -898,12 +1034,11 @@ class ApiMain extends ApiBase {
return array(
'format' => 'The format of the output',
'action' => 'What action you would like to perform. See below for module help',
- 'version' => 'When showing help, include version for each module',
'maxlag' => array(
'Maximum lag can be used when MediaWiki is installed on a database replicated cluster.',
'To save actions causing any more site replication lag, this parameter can make the client',
'wait until the replication lag is less than the specified value.',
- 'In case of a replag error, a HTTP 503 error is returned, with the message like',
+ 'In case of a replag error, error code "maxlag" is returned, with the message like',
'"Waiting for $host: $lag seconds lagged\n".',
'See https://www.mediawiki.org/wiki/Manual:Maxlag_parameter for more information',
),
@@ -984,11 +1119,11 @@ class ApiMain extends ApiBase {
protected function getCredits() {
return array(
'API developers:',
- ' Roan Kattouw "<Firstname>.<Lastname>@gmail.com" (lead developer Sep 2007-present)',
+ ' Roan Kattouw "<Firstname>.<Lastname>@gmail.com" (lead developer Sep 2007-2009)',
' Victor Vasiliev - vasilvv at gee mail dot com',
' Bryan Tong Minh - bryan . tongminh @ gmail . com',
' Sam Reed - sam @ reedyboy . net',
- ' Yuri Astrakhan "<Firstname><Lastname>@gmail.com" (creator, lead developer Sep 2006-Sep 2007)',
+ ' Yuri Astrakhan "<Firstname><Lastname>@gmail.com" (creator, lead developer Sep 2006-Sep 2007, 2012-present)',
'',
'Please send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org',
'or file a bug report at https://bugzilla.wikimedia.org/'
@@ -1014,8 +1149,7 @@ class ApiMain extends ApiBase {
$this->setHelp();
// Get help text from cache if present
$key = wfMemcKey( 'apihelp', $this->getModuleName(),
- SpecialVersion::getVersion( 'nodb' ) .
- $this->getShowVersions() );
+ SpecialVersion::getVersion( 'nodb' ) );
if ( $wgAPICacheHelpTimeout > 0 ) {
$cached = $wgMemc->get( $key );
if ( $cached ) {
@@ -1040,9 +1174,11 @@ class ApiMain extends ApiBase {
$astriks = str_repeat( '*** ', 14 );
$msg .= "\n\n$astriks Modules $astriks\n\n";
- foreach ( array_keys( $this->mModules ) as $moduleName ) {
- $module = new $this->mModules[$moduleName] ( $this, $moduleName );
+
+ foreach ( $this->mModuleMgr->getNames( 'action' ) as $name ) {
+ $module = $this->mModuleMgr->getModule( $name );
$msg .= self::makeHelpMsgHeader( $module, 'action' );
+
$msg2 = $module->makeHelpMsg();
if ( $msg2 !== false ) {
$msg .= $msg2;
@@ -1053,14 +1189,13 @@ class ApiMain extends ApiBase {
$msg .= "\n$astriks Permissions $astriks\n\n";
foreach ( self::$mRights as $right => $rightMsg ) {
$groups = User::getGroupsWithPermission( $right );
- $msg .= "* " . $right . " *\n " . wfMsgReplaceArgs( $rightMsg[ 'msg' ], $rightMsg[ 'params' ] ) .
+ $msg .= "* " . $right . " *\n " . wfMsgReplaceArgs( $rightMsg['msg'], $rightMsg['params'] ) .
"\nGranted to:\n " . str_replace( '*', 'all', implode( ', ', $groups ) ) . "\n\n";
-
}
$msg .= "\n$astriks Formats $astriks\n\n";
- foreach ( array_keys( $this->mFormats ) as $formatName ) {
- $module = $this->createPrinterByName( $formatName );
+ foreach ( $this->mModuleMgr->getNames( 'format' ) as $name ) {
+ $module = $this->mModuleMgr->getModule( $name );
$msg .= self::makeHelpMsgHeader( $module, 'format' );
$msg2 = $module->makeHelpMsg();
if ( $msg2 !== false ) {
@@ -1076,7 +1211,7 @@ class ApiMain extends ApiBase {
/**
* @param $module ApiBase
- * @param $paramName String What type of request is this? e.g. action, query, list, prop, meta, format
+ * @param string $paramName What type of request is this? e.g. action, query, list, prop, meta, format
* @return string
*/
public static function makeHelpMsgHeader( $module, $paramName ) {
@@ -1105,25 +1240,19 @@ class ApiMain extends ApiBase {
/**
* Check whether the user wants us to show version information in the API help
* @return bool
+ * @deprecated since 1.21, always returns false
*/
public function getShowVersions() {
- return $this->mShowVersions;
+ wfDeprecated( __METHOD__, '1.21' );
+ return false;
}
/**
- * Returns the version information of this file, plus it includes
- * the versions for all files that are not callable proper API modules
- *
- * @return array
+ * Overrides to return this instance's module manager.
+ * @return ApiModuleManager
*/
- public function getVersion() {
- $vers = array();
- $vers[] = 'MediaWiki: ' . SpecialVersion::getVersion() . "\n https://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/";
- $vers[] = __CLASS__ . ': $Id$';
- $vers[] = ApiBase::getBaseVersion();
- $vers[] = ApiFormatBase::getBaseVersion();
- $vers[] = ApiQueryBase::getBaseVersion();
- return $vers;
+ public function getModuleManager() {
+ return $this->mModuleMgr;
}
/**
@@ -1131,40 +1260,44 @@ class ApiMain extends ApiBase {
* classes who wish to add their own modules to their lexicon or override the
* behavior of inherent ones.
*
- * @param $mdlName String The identifier for this module.
- * @param $mdlClass String The class where this module is implemented.
+ * @deprecated since 1.21, Use getModuleManager()->addModule() instead.
+ * @param string $name The identifier for this module.
+ * @param $class ApiBase The class where this module is implemented.
*/
- protected function addModule( $mdlName, $mdlClass ) {
- $this->mModules[$mdlName] = $mdlClass;
+ protected function addModule( $name, $class ) {
+ $this->getModuleManager()->addModule( $name, 'action', $class );
}
/**
* Add or overwrite an output format for this ApiMain. Intended for use by extending
* classes who wish to add to or modify current formatters.
*
- * @param $fmtName string The identifier for this format.
- * @param $fmtClass ApiFormatBase The class implementing this format.
+ * @deprecated since 1.21, Use getModuleManager()->addModule() instead.
+ * @param string $name The identifier for this format.
+ * @param $class ApiFormatBase The class implementing this format.
*/
- protected function addFormat( $fmtName, $fmtClass ) {
- $this->mFormats[$fmtName] = $fmtClass;
+ protected function addFormat( $name, $class ) {
+ $this->getModuleManager()->addModule( $name, 'format', $class );
}
/**
* Get the array mapping module names to class names
+ * @deprecated since 1.21, Use getModuleManager()'s methods instead.
* @return array
*/
function getModules() {
- return $this->mModules;
+ return $this->getModuleManager()->getNamesWithClasses( 'action' );
}
/**
* Returns the list of supported formats in form ( 'format' => 'ClassName' )
*
* @since 1.18
+ * @deprecated since 1.21, Use getModuleManager()'s methods instead.
* @return array
*/
public function getFormats() {
- return $this->mFormats;
+ return $this->getModuleManager()->getNamesWithClasses( 'format' );
}
}
diff --git a/includes/api/ApiModuleManager.php b/includes/api/ApiModuleManager.php
new file mode 100644
index 00000000..100392bf
--- /dev/null
+++ b/includes/api/ApiModuleManager.php
@@ -0,0 +1,171 @@
+<?php
+/**
+ *
+ *
+ * Created on Dec 27, 2012
+ *
+ * Copyright © 2012 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ *
+ * 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
+ * @since 1.21
+ */
+
+/**
+ * This class holds a list of modules and handles instantiation
+ *
+ * @since 1.21
+ * @ingroup API
+ */
+class ApiModuleManager extends ContextSource {
+
+ private $mParent;
+ private $mInstances = array();
+ private $mGroups = array();
+ private $mModules = array();
+
+ /**
+ * Construct new module manager
+ * @param ApiBase $parentModule Parent module instance will be used during instantiation
+ */
+ public function __construct( ApiBase $parentModule ) {
+ $this->mParent = $parentModule;
+ }
+
+ /**
+ * Add a list of modules to the manager
+ * @param array $modules A map of ModuleName => ModuleClass
+ * @param string $group Which group modules belong to (action,format,...)
+ */
+ public function addModules( array $modules, $group ) {
+ foreach ( $modules as $name => $class ) {
+ $this->addModule( $name, $group, $class );
+ }
+ }
+
+ /**
+ * Add or overwrite a module in this ApiMain instance. Intended for use by extending
+ * classes who wish to add their own modules to their lexicon or override the
+ * behavior of inherent ones.
+ *
+ * @param string $group Name of the module group
+ * @param string $name The identifier for this module.
+ * @param string $class The class where this module is implemented.
+ */
+ public function addModule( $name, $group, $class ) {
+ $this->mGroups[$group] = null;
+ $this->mModules[$name] = array( $group, $class );
+ }
+
+ /**
+ * Get module instance by name, or instantiate it if it does not exist
+ * @param string $moduleName module name
+ * @param string $group optionally validate that the module is in a specific group
+ * @param bool $ignoreCache if true, force-creates a new instance and does not cache it
+ * @return mixed the new module instance, or null if failed
+ */
+ public function getModule( $moduleName, $group = null, $ignoreCache = false ) {
+ if ( !isset( $this->mModules[$moduleName] ) ) {
+ return null;
+ }
+ $grpCls = $this->mModules[$moduleName];
+ if ( $group !== null && $grpCls[0] !== $group ) {
+ return null;
+ }
+ if ( !$ignoreCache && isset( $this->mInstances[$moduleName] ) ) {
+ // already exists
+ return $this->mInstances[$moduleName];
+ } else {
+ // new instance
+ $class = $grpCls[1];
+ $instance = new $class ( $this->mParent, $moduleName );
+ if ( !$ignoreCache ) {
+ // cache this instance in case it is needed later
+ $this->mInstances[$moduleName] = $instance;
+ }
+ return $instance;
+ }
+ }
+
+ /**
+ * Get an array of modules in a specific group or all if no group is set.
+ * @param string $group optional group filter
+ * @return array list of module names
+ */
+ public function getNames( $group = null ) {
+ if ( $group === null ) {
+ return array_keys( $this->mModules );
+ }
+ $result = array();
+ foreach ( $this->mModules as $name => $grpCls ) {
+ if ( $grpCls[0] === $group ) {
+ $result[] = $name;
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * Create an array of (moduleName => moduleClass) for a specific group or for all.
+ * @param string $group name of the group to get or null for all
+ * @return array name=>class map
+ */
+ public function getNamesWithClasses( $group = null ) {
+ $result = array();
+ foreach ( $this->mModules as $name => $grpCls ) {
+ if ( $group === null || $grpCls[0] === $group ) {
+ $result[$name] = $grpCls[1];
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * Returns true if the specific module is defined at all or in a specific group.
+ * @param string $moduleName module name
+ * @param string $group group name to check against, or null to check all groups,
+ * @return boolean true if defined
+ */
+ public function isDefined( $moduleName, $group = null ) {
+ if ( isset( $this->mModules[$moduleName] ) ) {
+ return $group === null || $this->mModules[$moduleName][0] === $group;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Returns the group name for the given module
+ * @param string $moduleName
+ * @return string group name or null if missing
+ */
+ public function getModuleGroup( $moduleName ) {
+ if ( isset( $this->mModules[$moduleName] ) ) {
+ return $this->mModules[$moduleName][0];
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Get a list of groups this manager contains.
+ * @return array
+ */
+ public function getGroups() {
+ return array_keys( $this->mGroups );
+ }
+}
diff --git a/includes/api/ApiMove.php b/includes/api/ApiMove.php
index 9d73562b..3e846e3b 100644
--- a/includes/api/ApiMove.php
+++ b/includes/api/ApiMove.php
@@ -30,10 +30,6 @@
*/
class ApiMove extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
$user = $this->getUser();
$params = $this->extractRequestParams();
@@ -42,7 +38,7 @@ class ApiMove extends ApiBase {
if ( isset( $params['from'] ) ) {
$fromTitle = Title::newFromText( $params['from'] );
- if ( !$fromTitle ) {
+ if ( !$fromTitle || $fromTitle->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['from'] ) );
}
} elseif ( isset( $params['fromid'] ) ) {
@@ -58,7 +54,7 @@ class ApiMove extends ApiBase {
$fromTalk = $fromTitle->getTalkPage();
$toTitle = Title::newFromText( $params['to'] );
- if ( !$toTitle ) {
+ if ( !$toTitle || $toTitle->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['to'] ) );
}
$toTalk = $toTitle->getTalkPage();
@@ -82,9 +78,16 @@ class ApiMove extends ApiBase {
}
$r = array( 'from' => $fromTitle->getPrefixedText(), 'to' => $toTitle->getPrefixedText(), 'reason' => $params['reason'] );
- if ( !$params['noredirect'] || !$user->isAllowed( 'suppressredirect' ) ) {
+
+ if ( $fromTitle->exists() ) {
+ //NOTE: we assume that if the old title exists, it's because it was re-created as
+ // a redirect to the new title. This is not safe, but what we did before was
+ // even worse: we just determined whether a redirect should have been created,
+ // and reported that it was created if it should have, without any checks.
+ // Also note that isRedirect() is unreliable because of bug 37209.
$r['redirectcreated'] = '';
}
+
if( $toTitleExists ) {
$r['moveoverredirect'] = '';
}
@@ -122,7 +125,7 @@ class ApiMove extends ApiBase {
}
}
- $watch = "preferences";
+ $watch = 'preferences';
if ( isset( $params['watchlist'] ) ) {
$watch = $params['watchlist'];
} elseif ( $params['watch'] ) {
@@ -288,15 +291,11 @@ class ApiMove extends ApiBase {
public function getExamples() {
return array(
- 'api.php?action=move&from=Exampel&to=Example&token=123ABC&reason=Misspelled%20title&movetalk=&noredirect='
+ 'api.php?action=move&from=Badtitle&to=Goodtitle&token=123ABC&reason=Misspelled%20title&movetalk=&noredirect='
);
}
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Move';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiOpenSearch.php b/includes/api/ApiOpenSearch.php
index ef562741..caf361ac 100644
--- a/includes/api/ApiOpenSearch.php
+++ b/includes/api/ApiOpenSearch.php
@@ -29,10 +29,6 @@
*/
class ApiOpenSearch extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function getCustomPrinter() {
return $this->getMain()->createPrinterByName( 'json' );
}
@@ -123,8 +119,4 @@ class ApiOpenSearch extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Opensearch';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiOptions.php b/includes/api/ApiOptions.php
index 265c2ccb..8c996a26 100644
--- a/includes/api/ApiOptions.php
+++ b/includes/api/ApiOptions.php
@@ -25,17 +25,13 @@
*/
/**
-* API module that facilitates the changing of user's preferences.
-* Requires API write mode to be enabled.
-*
+ * API module that facilitates the changing of user's preferences.
+ * Requires API write mode to be enabled.
+ *
* @ingroup API
*/
class ApiOptions extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
/**
* Changes preferences of the current user.
*/
@@ -54,7 +50,7 @@ class ApiOptions extends ApiBase {
}
if ( $params['reset'] ) {
- $user->resetOptions();
+ $user->resetOptions( $params['resetkinds'] );
$changed = true;
}
@@ -74,13 +70,36 @@ class ApiOptions extends ApiBase {
}
$prefs = Preferences::getPreferences( $user, $this->getContext() );
+ $prefsKinds = $user->getOptionKinds( $this->getContext(), $changes );
+
foreach ( $changes as $key => $value ) {
- if ( !isset( $prefs[$key] ) ) {
- $this->setWarning( "Not a valid preference: $key" );
- continue;
+ switch ( $prefsKinds[$key] ) {
+ case 'registered':
+ // Regular option.
+ $field = HTMLForm::loadInputFromParameters( $key, $prefs[$key] );
+ $validation = $field->validate( $value, $user->getOptions() );
+ break;
+ case 'registered-multiselect':
+ case 'registered-checkmatrix':
+ // A key for a multiselect or checkmatrix option.
+ $validation = true;
+ $value = $value !== null ? (bool) $value : null;
+ break;
+ case 'userjs':
+ // Allow non-default preferences prefixed with 'userjs-', to be set by user scripts
+ if ( strlen( $key ) > 255 ) {
+ $validation = "key too long (no more than 255 bytes allowed)";
+ } elseif ( preg_match( "/[^a-zA-Z0-9_-]/", $key ) !== 0 ) {
+ $validation = "invalid key (only a-z, A-Z, 0-9, _, - allowed)";
+ } else {
+ $validation = true;
+ }
+ break;
+ case 'unused':
+ default:
+ $validation = "not a valid preference";
+ break;
}
- $field = HTMLForm::loadInputFromParameters( $key, $prefs[$key] );
- $validation = $field->validate( $value, $user->getOptions() );
if ( $validation === true ) {
$user->setOption( $key, $value );
$changed = true;
@@ -106,12 +125,20 @@ class ApiOptions extends ApiBase {
}
public function getAllowedParams() {
+ $optionKinds = User::listOptionKinds();
+ $optionKinds[] = 'all';
+
return array(
'token' => array(
ApiBase::PARAM_TYPE => 'string',
ApiBase::PARAM_REQUIRED => true
),
'reset' => false,
+ 'resetkinds' => array(
+ ApiBase::PARAM_TYPE => $optionKinds,
+ ApiBase::PARAM_DFLT => 'all',
+ ApiBase::PARAM_ISMULTI => true
+ ),
'change' => array(
ApiBase::PARAM_ISMULTI => true,
),
@@ -139,15 +166,20 @@ class ApiOptions extends ApiBase {
public function getParamDescription() {
return array(
'token' => 'An options token previously obtained through the action=tokens',
- 'reset' => 'Resets all preferences to the site defaults',
- 'change' => 'List of changes, formatted name=value (e.g. skin=vector), value cannot contain pipe characters',
+ 'reset' => 'Resets preferences to the site defaults',
+ 'resetkinds' => 'List of types of options to reset when the "reset" option is set',
+ 'change' => 'List of changes, formatted name=value (e.g. skin=vector), value cannot contain pipe characters. If no value is given (not even an equals sign), e.g., optionname|otheroption|..., the option will be reset to its default value',
'optionname' => 'A name of a option which should have an optionvalue set',
'optionvalue' => 'A value of the option specified by the optionname, can contain pipe characters',
);
}
public function getDescription() {
- return 'Change preferences of the current user';
+ return array(
+ 'Change preferences of the current user',
+ 'Only options which are registered in core or in one of installed extensions,',
+ 'or as options with keys prefixed with \'userjs-\' (intended to be used by user scripts), can be set.'
+ );
}
public function getPossibleErrors() {
@@ -176,8 +208,4 @@ class ApiOptions extends ApiBase {
'api.php?action=options&reset=&change=skin=monobook&optionname=nickname&optionvalue=[[User:Beau|Beau]]%20([[User_talk:Beau|talk]])&token=123ABC',
);
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php
index 0f5be6b2..074efe4b 100644
--- a/includes/api/ApiPageSet.php
+++ b/includes/api/ApiPageSet.php
@@ -4,7 +4,7 @@
*
* Created on Sep 24, 2006
*
- * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ * Copyright © 2006, 2013 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
*
* 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
@@ -36,52 +36,177 @@
* the second instance for all their work.
*
* @ingroup API
+ * @since 1.21 derives from ApiBase instead of ApiQueryBase
*/
-class ApiPageSet extends ApiQueryBase {
+class ApiPageSet extends ApiBase {
- private $mAllPages; // [ns][dbkey] => page_id or negative when missing
- private $mTitles, $mGoodTitles, $mMissingTitles, $mInvalidTitles;
- private $mMissingPageIDs, $mRedirectTitles, $mSpecialTitles;
- private $mNormalizedTitles, $mInterwikiTitles;
- private $mResolveRedirects, $mPendingRedirectIDs;
- private $mConvertTitles, $mConvertedTitles;
- private $mGoodRevIDs, $mMissingRevIDs;
- private $mFakePageId;
-
- private $mRequestedPageFields;
+ /**
+ * Constructor flag: The new instance of ApiPageSet will ignore the 'generator=' parameter
+ * @since 1.21
+ */
+ const DISABLE_GENERATORS = 1;
+
+ private $mDbSource;
+ private $mParams;
+ private $mResolveRedirects;
+ private $mConvertTitles;
+ private $mAllowGenerator;
+
+ private $mAllPages = array(); // [ns][dbkey] => page_id or negative when missing
+ private $mTitles = array();
+ private $mGoodTitles = array();
+ private $mMissingTitles = array();
+ private $mInvalidTitles = array();
+ private $mMissingPageIDs = array();
+ private $mRedirectTitles = array();
+ private $mSpecialTitles = array();
+ private $mNormalizedTitles = array();
+ private $mInterwikiTitles = array();
+ private $mPendingRedirectIDs = array();
+ private $mConvertedTitles = array();
+ private $mGoodRevIDs = array();
+ private $mMissingRevIDs = array();
+ private $mFakePageId = -1;
+ private $mCacheMode = 'public';
+ private $mRequestedPageFields = array();
+ private $mDefaultNamespace = NS_MAIN;
/**
* Constructor
- * @param $query ApiBase
- * @param $resolveRedirects bool Whether redirects should be resolved
- * @param $convertTitles bool
+ * @param $dbSource ApiBase Module implementing getDB().
+ * Allows PageSet to reuse existing db connection from the shared state like ApiQuery.
+ * @param int $flags Zero or more flags like DISABLE_GENERATORS
+ * @param int $defaultNamespace the namespace to use if none is specified by a prefix.
+ * @since 1.21 accepts $flags instead of two boolean values
*/
- public function __construct( $query, $resolveRedirects = false, $convertTitles = false ) {
- parent::__construct( $query, 'query' );
+ public function __construct( ApiBase $dbSource, $flags = 0, $defaultNamespace = NS_MAIN ) {
+ parent::__construct( $dbSource->getMain(), $dbSource->getModuleName() );
+ $this->mDbSource = $dbSource;
+ $this->mAllowGenerator = ( $flags & ApiPageSet::DISABLE_GENERATORS ) == 0;
+ $this->mDefaultNamespace = $defaultNamespace;
- $this->mAllPages = array();
- $this->mTitles = array();
- $this->mGoodTitles = array();
- $this->mMissingTitles = array();
- $this->mInvalidTitles = array();
- $this->mMissingPageIDs = array();
- $this->mRedirectTitles = array();
- $this->mNormalizedTitles = array();
- $this->mInterwikiTitles = array();
- $this->mGoodRevIDs = array();
- $this->mMissingRevIDs = array();
- $this->mSpecialTitles = array();
+ $this->profileIn();
+ $this->mParams = $this->extractRequestParams();
+ $this->mResolveRedirects = $this->mParams['redirects'];
+ $this->mConvertTitles = $this->mParams['converttitles'];
+ $this->profileOut();
+ }
- $this->mRequestedPageFields = array();
- $this->mResolveRedirects = $resolveRedirects;
- if ( $resolveRedirects ) {
- $this->mPendingRedirectIDs = array();
- }
+ /**
+ * In case execute() is not called, call this method to mark all relevant parameters as used
+ * This prevents unused parameters from being reported as warnings
+ */
+ public function executeDryRun() {
+ $this->executeInternal( true );
+ }
- $this->mConvertTitles = $convertTitles;
- $this->mConvertedTitles = array();
+ /**
+ * Populate the PageSet from the request parameters.
+ */
+ public function execute() {
+ $this->executeInternal( false );
+ }
+
+ /**
+ * Populate the PageSet from the request parameters.
+ * @param bool $isDryRun If true, instantiates generator, but only to mark relevant parameters as used
+ */
+ private function executeInternal( $isDryRun ) {
+ $this->profileIn();
- $this->mFakePageId = - 1;
+ $generatorName = $this->mAllowGenerator ? $this->mParams['generator'] : null;
+ if ( isset( $generatorName ) ) {
+ $dbSource = $this->mDbSource;
+ $isQuery = $dbSource instanceof ApiQuery;
+ if ( !$isQuery ) {
+ // If the parent container of this pageset is not ApiQuery, we must create it to run generator
+ $dbSource = $this->getMain()->getModuleManager()->getModule( 'query' );
+ // Enable profiling for query module because it will be used for db sql profiling
+ $dbSource->profileIn();
+ }
+ $generator = $dbSource->getModuleManager()->getModule( $generatorName, null, true );
+ if ( $generator === null ) {
+ $this->dieUsage( 'Unknown generator=' . $generatorName, 'badgenerator' );
+ }
+ if ( !$generator instanceof ApiQueryGeneratorBase ) {
+ $this->dieUsage( "Module $generatorName cannot be used as a generator", 'badgenerator' );
+ }
+ // Create a temporary pageset to store generator's output,
+ // add any additional fields generator may need, and execute pageset to populate titles/pageids
+ $tmpPageSet = new ApiPageSet( $dbSource, ApiPageSet::DISABLE_GENERATORS );
+ $generator->setGeneratorMode( $tmpPageSet );
+ $this->mCacheMode = $generator->getCacheMode( $generator->extractRequestParams() );
+
+ if ( !$isDryRun ) {
+ $generator->requestExtraData( $tmpPageSet );
+ }
+ $tmpPageSet->executeInternal( $isDryRun );
+
+ // populate this pageset with the generator output
+ $this->profileOut();
+ $generator->profileIn();
+
+ if ( !$isDryRun ) {
+ $generator->executeGenerator( $this );
+ wfRunHooks( 'APIQueryGeneratorAfterExecute', array( &$generator, &$this ) );
+ $this->resolvePendingRedirects();
+ } else {
+ // Prevent warnings from being reported on these parameters
+ $main = $this->getMain();
+ foreach ( $generator->extractRequestParams() as $paramName => $param ) {
+ $main->getVal( $generator->encodeParamName( $paramName ) );
+ }
+ }
+ $generator->profileOut();
+ $this->profileIn();
+
+ if ( !$isQuery ) {
+ // If this pageset is not part of the query, we called profileIn() above
+ $dbSource->profileOut();
+ }
+ } else {
+ // Only one of the titles/pageids/revids is allowed at the same time
+ $dataSource = null;
+ if ( isset( $this->mParams['titles'] ) ) {
+ $dataSource = 'titles';
+ }
+ if ( isset( $this->mParams['pageids'] ) ) {
+ if ( isset( $dataSource ) ) {
+ $this->dieUsage( "Cannot use 'pageids' at the same time as '$dataSource'", 'multisource' );
+ }
+ $dataSource = 'pageids';
+ }
+ if ( isset( $this->mParams['revids'] ) ) {
+ if ( isset( $dataSource ) ) {
+ $this->dieUsage( "Cannot use 'revids' at the same time as '$dataSource'", 'multisource' );
+ }
+ $dataSource = 'revids';
+ }
+
+ if ( !$isDryRun ) {
+ // Populate page information with the original user input
+ switch( $dataSource ) {
+ case 'titles':
+ $this->initFromTitles( $this->mParams['titles'] );
+ break;
+ case 'pageids':
+ $this->initFromPageIds( $this->mParams['pageids'] );
+ break;
+ case 'revids':
+ if ( $this->mResolveRedirects ) {
+ $this->setWarning( 'Redirect resolution cannot be used together with the revids= parameter. ' .
+ 'Any redirects the revids= point to have not been resolved.' );
+ }
+ $this->mResolveRedirects = false;
+ $this->initFromRevIDs( $this->mParams['revids'] );
+ break;
+ default:
+ // Do nothing - some queries do not need any of the data sources.
+ break;
+ }
+ }
+ }
+ $this->profileOut();
}
/**
@@ -93,9 +218,33 @@ class ApiPageSet extends ApiQueryBase {
}
/**
- * Request an additional field from the page table. Must be called
- * before execute()
- * @param $fieldName string Field name
+ * Return the parameter name that is the source of data for this PageSet
+ *
+ * If multiple source parameters are specified (e.g. titles and pageids),
+ * one will be named arbitrarily.
+ *
+ * @return string|null
+ */
+ public function getDataSource() {
+ if ( $this->mAllowGenerator && isset( $this->mParams['generator'] ) ) {
+ return 'generator';
+ }
+ if ( isset( $this->mParams['titles'] ) ) {
+ return 'titles';
+ }
+ if ( isset( $this->mParams['pageids'] ) ) {
+ return 'pageids';
+ }
+ if ( isset( $this->mParams['revids'] ) ) {
+ return 'revids';
+ }
+ return null;
+ }
+
+ /**
+ * Request an additional field from the page table.
+ * Must be called before execute()
+ * @param string $fieldName Field name
*/
public function requestField( $fieldName ) {
$this->mRequestedPageFields[$fieldName] = null;
@@ -104,7 +253,7 @@ class ApiPageSet extends ApiQueryBase {
/**
* Get the value of a custom field previously requested through
* requestField()
- * @param $fieldName string Field name
+ * @param string $fieldName Field name
* @return mixed Field value
*/
public function getCustomField( $fieldName ) {
@@ -207,14 +356,39 @@ class ApiPageSet extends ApiQueryBase {
/**
* Get a list of redirect resolutions - maps a title to its redirect
- * target.
- * @return array prefixed_title (string) => Title object
+ * target, as an array of output-ready arrays
+ * @return array
*/
public function getRedirectTitles() {
return $this->mRedirectTitles;
}
/**
+ * Get a list of redirect resolutions - maps a title to its redirect
+ * target.
+ * @param $result ApiResult
+ * @return array of prefixed_title (string) => Title object
+ * @since 1.21
+ */
+ public function getRedirectTitlesAsResult( $result = null ) {
+ $values = array();
+ foreach ( $this->getRedirectTitles() as $titleStrFrom => $titleTo ) {
+ $r = array(
+ 'from' => strval( $titleStrFrom ),
+ 'to' => $titleTo->getPrefixedText(),
+ );
+ if ( $titleTo->getFragment() !== '' ) {
+ $r['tofragment'] = $titleTo->getFragment();
+ }
+ $values[] = $r;
+ }
+ if ( !empty( $values ) && $result ) {
+ $result->setIndexedTagName( $values, 'r' );
+ }
+ return $values;
+ }
+
+ /**
* Get a list of title normalizations - maps a title to its normalized
* version.
* @return array raw_prefixed_title (string) => prefixed_title (string)
@@ -224,6 +398,27 @@ class ApiPageSet extends ApiQueryBase {
}
/**
+ * Get a list of title normalizations - maps a title to its normalized
+ * version in the form of result array.
+ * @param $result ApiResult
+ * @return array of raw_prefixed_title (string) => prefixed_title (string)
+ * @since 1.21
+ */
+ public function getNormalizedTitlesAsResult( $result = null ) {
+ $values = array();
+ foreach ( $this->getNormalizedTitles() as $rawTitleStr => $titleStr ) {
+ $values[] = array(
+ 'from' => $rawTitleStr,
+ 'to' => $titleStr
+ );
+ }
+ if ( !empty( $values ) && $result ) {
+ $result->setIndexedTagName( $values, 'n' );
+ }
+ return $values;
+ }
+
+ /**
* Get a list of title conversions - maps a title to its converted
* version.
* @return array raw_prefixed_title (string) => prefixed_title (string)
@@ -233,6 +428,27 @@ class ApiPageSet extends ApiQueryBase {
}
/**
+ * Get a list of title conversions - maps a title to its converted
+ * version as a result array.
+ * @param $result ApiResult
+ * @return array of (from, to) strings
+ * @since 1.21
+ */
+ public function getConvertedTitlesAsResult( $result = null ) {
+ $values = array();
+ foreach ( $this->getConvertedTitles() as $rawTitleStr => $titleStr ) {
+ $values[] = array(
+ 'from' => $rawTitleStr,
+ 'to' => $titleStr
+ );
+ }
+ if ( !empty( $values ) && $result ) {
+ $result->setIndexedTagName( $values, 'c' );
+ }
+ return $values;
+ }
+
+ /**
* Get a list of interwiki titles - maps a title to its interwiki
* prefix.
* @return array raw_prefixed_title (string) => interwiki_prefix (string)
@@ -242,6 +458,33 @@ class ApiPageSet extends ApiQueryBase {
}
/**
+ * Get a list of interwiki titles - maps a title to its interwiki
+ * prefix as result.
+ * @param $result ApiResult
+ * @param $iwUrl boolean
+ * @return array raw_prefixed_title (string) => interwiki_prefix (string)
+ * @since 1.21
+ */
+ public function getInterwikiTitlesAsResult( $result = null, $iwUrl = false ) {
+ $values = array();
+ foreach ( $this->getInterwikiTitles() as $rawTitleStr => $interwikiStr ) {
+ $item = array(
+ 'title' => $rawTitleStr,
+ 'iw' => $interwikiStr,
+ );
+ if ( $iwUrl ) {
+ $title = Title::newFromText( $rawTitleStr );
+ $item['url'] = $title->getFullURL( '', false, PROTO_CURRENT );
+ }
+ $values[] = $item;
+ }
+ if ( !empty( $values ) && $result ) {
+ $result->setIndexedTagName( $values, 'i' );
+ }
+ return $values;
+ }
+
+ /**
* Get the list of revision IDs (requested with the revids= parameter)
* @return array revID (int) => pageID (int)
*/
@@ -258,6 +501,25 @@ class ApiPageSet extends ApiQueryBase {
}
/**
+ * Revision IDs that were not found in the database as result array.
+ * @param $result ApiResult
+ * @return array of revision IDs
+ * @since 1.21
+ */
+ public function getMissingRevisionIDsAsResult( $result = null ) {
+ $values = array();
+ foreach ( $this->getMissingRevisionIDs() as $revid ) {
+ $values[$revid] = array(
+ 'revid' => $revid
+ );
+ }
+ if ( !empty( $values ) && $result ) {
+ $result->setIndexedTagName( $values, 'rev' );
+ }
+ return $values;
+ }
+
+ /**
* Get the list of titles with negative namespace
* @return array Title
*/
@@ -274,55 +536,8 @@ class ApiPageSet extends ApiQueryBase {
}
/**
- * Populate the PageSet from the request parameters.
- */
- public function execute() {
- $this->profileIn();
- $params = $this->extractRequestParams();
-
- // Only one of the titles/pageids/revids is allowed at the same time
- $dataSource = null;
- if ( isset( $params['titles'] ) ) {
- $dataSource = 'titles';
- }
- if ( isset( $params['pageids'] ) ) {
- if ( isset( $dataSource ) ) {
- $this->dieUsage( "Cannot use 'pageids' at the same time as '$dataSource'", 'multisource' );
- }
- $dataSource = 'pageids';
- }
- if ( isset( $params['revids'] ) ) {
- if ( isset( $dataSource ) ) {
- $this->dieUsage( "Cannot use 'revids' at the same time as '$dataSource'", 'multisource' );
- }
- $dataSource = 'revids';
- }
-
- switch ( $dataSource ) {
- case 'titles':
- $this->initFromTitles( $params['titles'] );
- break;
- case 'pageids':
- $this->initFromPageIds( $params['pageids'] );
- break;
- case 'revids':
- if ( $this->mResolveRedirects ) {
- $this->setWarning( 'Redirect resolution cannot be used together with the revids= parameter. ' .
- 'Any redirects the revids= point to have not been resolved.' );
- }
- $this->mResolveRedirects = false;
- $this->initFromRevIDs( $params['revids'] );
- break;
- default:
- // Do nothing - some queries do not need any of the data sources.
- break;
- }
- $this->profileOut();
- }
-
- /**
* Populate this PageSet from a list of Titles
- * @param $titles array of Title objects
+ * @param array $titles of Title objects
*/
public function populateFromTitles( $titles ) {
$this->profileIn();
@@ -332,7 +547,7 @@ class ApiPageSet extends ApiQueryBase {
/**
* Populate this PageSet from a list of page IDs
- * @param $pageIDs array of page IDs
+ * @param array $pageIDs of page IDs
*/
public function populateFromPageIDs( $pageIDs ) {
$this->profileIn();
@@ -353,7 +568,7 @@ class ApiPageSet extends ApiQueryBase {
/**
* Populate this PageSet from a list of revision IDs
- * @param $revIDs array of revision IDs
+ * @param array $revIDs of revision IDs
*/
public function populateFromRevisionIDs( $revIDs ) {
$this->profileIn();
@@ -385,12 +600,11 @@ class ApiPageSet extends ApiQueryBase {
}
/**
- * Resolve redirects, if applicable
+ * Do not use, does nothing, will be removed
+ * @deprecated 1.21
*/
public function finishPageSetGeneration() {
- $this->profileIn();
- $this->resolvePendingRedirects();
- $this->profileOut();
+ wfDeprecated( __METHOD__, '1.21' );
}
/**
@@ -407,7 +621,7 @@ class ApiPageSet extends ApiQueryBase {
* #5 Substitute the original LinkBatch object with the new list
* #6 Repeat from step #1
*
- * @param $titles array of Title objects or strings
+ * @param array $titles of Title objects or strings
*/
private function initFromTitles( $titles ) {
// Get validated and normalized title objects
@@ -434,10 +648,10 @@ class ApiPageSet extends ApiQueryBase {
/**
* Does the same as initFromTitles(), but is based on page IDs instead
- * @param $pageids array of page IDs
+ * @param array $pageids of page IDs
*/
private function initFromPageIds( $pageids ) {
- if ( !count( $pageids ) ) {
+ if ( !$pageids ) {
return;
}
@@ -447,7 +661,7 @@ class ApiPageSet extends ApiQueryBase {
$pageids = self::getPositiveIntegers( $pageids );
$res = null;
- if ( count( $pageids ) ) {
+ if ( !empty( $pageids ) ) {
$set = array(
'page_id' => $pageids
);
@@ -460,7 +674,7 @@ class ApiPageSet extends ApiQueryBase {
$this->profileDBOut();
}
- $this->initFromQueryResult( $res, $remaining, false ); // process PageIDs
+ $this->initFromQueryResult( $res, $remaining, false ); // process PageIDs
// Resolve any found redirects
$this->resolvePendingRedirects();
@@ -470,9 +684,9 @@ class ApiPageSet extends ApiQueryBase {
* Iterate through the result of the query on 'page' table,
* and for each row create and store title object and save any extra fields requested.
* @param $res ResultWrapper DB Query result
- * @param $remaining array of either pageID or ns/title elements (optional).
+ * @param array $remaining of either pageID or ns/title elements (optional).
* If given, any missing items will go to $mMissingPageIDs and $mMissingTitles
- * @param $processTitles bool Must be provided together with $remaining.
+ * @param bool $processTitles Must be provided together with $remaining.
* If true, treat $remaining as an array of [ns][title]
* If false, treat it as an array of [pageIDs]
*/
@@ -499,7 +713,7 @@ class ApiPageSet extends ApiQueryBase {
$this->processDbRow( $row );
// Need gender information
- if( MWNamespace::hasGenderDistinction( $row->page_namespace ) ) {
+ if ( MWNamespace::hasGenderDistinction( $row->page_namespace ) ) {
$usernames[] = $row->page_title;
}
}
@@ -518,7 +732,7 @@ class ApiPageSet extends ApiQueryBase {
$this->mTitles[] = $title;
// need gender information
- if( MWNamespace::hasGenderDistinction( $ns ) ) {
+ if ( MWNamespace::hasGenderDistinction( $ns ) ) {
$usernames[] = $dbkey;
}
}
@@ -541,10 +755,10 @@ class ApiPageSet extends ApiQueryBase {
/**
* Does the same as initFromTitles(), but is based on revision IDs
* instead
- * @param $revids array of revision IDs
+ * @param array $revids of revision IDs
*/
private function initFromRevIDs( $revids ) {
- if ( !count( $revids ) ) {
+ if ( !$revids ) {
return;
}
@@ -555,14 +769,14 @@ class ApiPageSet extends ApiQueryBase {
$revids = self::getPositiveIntegers( $revids );
- if ( count( $revids ) ) {
+ if ( !empty( $revids ) ) {
$tables = array( 'revision', 'page' );
$fields = array( 'rev_id', 'rev_page' );
$where = array( 'rev_id' => $revids, 'rev_page = page_id' );
// Get pageIDs data from the `page` table
$this->profileDBIn();
- $res = $db->select( $tables, $fields, $where, __METHOD__ );
+ $res = $db->select( $tables, $fields, $where, __METHOD__ );
foreach ( $res as $row ) {
$revid = intval( $row->rev_id );
$pageid = intval( $row->rev_page );
@@ -670,44 +884,63 @@ class ApiPageSet extends ApiQueryBase {
}
/**
+ * Get the cache mode for the data generated by this module.
+ * All PageSet users should take into account whether this returns a more-restrictive
+ * cache mode than the using module itself. For possible return values and other
+ * details about cache modes, see ApiMain::setCacheMode()
+ *
+ * Public caching will only be allowed if *all* the modules that supply
+ * data for a given request return a cache mode of public.
+ *
+ * @param $params
+ * @return string
+ * @since 1.21
+ */
+ public function getCacheMode( $params = null ) {
+ return $this->mCacheMode;
+ }
+
+ /**
* Given an array of title strings, convert them into Title objects.
- * Alternativelly, an array of Title objects may be given.
+ * Alternatively, an array of Title objects may be given.
* This method validates access rights for the title,
* and appends normalization values to the output.
*
- * @param $titles array of Title objects or strings
+ * @param array $titles of Title objects or strings
* @return LinkBatch
*/
private function processTitlesArray( $titles ) {
- $genderCache = GenderCache::singleton();
- $genderCache->doTitlesArray( $titles, __METHOD__ );
-
+ $usernames = array();
$linkBatch = new LinkBatch();
foreach ( $titles as $title ) {
- $titleObj = is_string( $title ) ? Title::newFromText( $title ) : $title;
+ if ( is_string( $title ) ) {
+ $titleObj = Title::newFromText( $title, $this->mDefaultNamespace );
+ } else {
+ $titleObj = $title;
+ }
if ( !$titleObj ) {
// Handle invalid titles gracefully
- $this->mAllpages[0][$title] = $this->mFakePageId;
+ $this->mAllPages[0][$title] = $this->mFakePageId;
$this->mInvalidTitles[$this->mFakePageId] = $title;
$this->mFakePageId--;
continue; // There's nothing else we can do
}
$unconvertedTitle = $titleObj->getPrefixedText();
$titleWasConverted = false;
- $iw = $titleObj->getInterwiki();
- if ( strval( $iw ) !== '' ) {
+ if ( $titleObj->isExternal() ) {
// This title is an interwiki link.
- $this->mInterwikiTitles[$titleObj->getPrefixedText()] = $iw;
+ $this->mInterwikiTitles[$unconvertedTitle] = $titleObj->getInterwiki();
} else {
// Variants checking
global $wgContLang;
if ( $this->mConvertTitles &&
- count( $wgContLang->getVariants() ) > 1 &&
+ count( $wgContLang->getVariants() ) > 1 &&
!$titleObj->exists() ) {
- // Language::findVariantLink will modify titleObj into
+ // Language::findVariantLink will modify titleText and titleObj into
// the canonical variant if possible
- $wgContLang->findVariantLink( $title, $titleObj );
+ $titleText = is_string( $title ) ? $title : $titleObj->getPrefixedText();
+ $wgContLang->findVariantLink( $titleText, $titleObj );
$titleWasConverted = $unconvertedTitle !== $titleObj->getPrefixedText();
}
@@ -728,16 +961,36 @@ class ApiPageSet extends ApiQueryBase {
// namespace is localized or the capitalization is
// different
if ( $titleWasConverted ) {
- $this->mConvertedTitles[$title] = $titleObj->getPrefixedText();
+ $this->mConvertedTitles[$unconvertedTitle] = $titleObj->getPrefixedText();
+ // In this case the page can't be Special.
+ if ( is_string( $title ) && $title !== $unconvertedTitle ) {
+ $this->mNormalizedTitles[$title] = $unconvertedTitle;
+ }
} elseif ( is_string( $title ) && $title !== $titleObj->getPrefixedText() ) {
$this->mNormalizedTitles[$title] = $titleObj->getPrefixedText();
}
+
+ // Need gender information
+ if ( MWNamespace::hasGenderDistinction( $titleObj->getNamespace() ) ) {
+ $usernames[] = $titleObj->getText();
+ }
}
+ // Get gender information
+ $genderCache = GenderCache::singleton();
+ $genderCache->doQuery( $usernames, __METHOD__ );
return $linkBatch;
}
/**
+ * Get the database connection (read-only)
+ * @return DatabaseBase
+ */
+ protected function getDB() {
+ return $this->mDbSource->getDB();
+ }
+
+ /**
* Returns the input array of integers with all values < 0 removed
*
* @param $array array
@@ -747,7 +1000,7 @@ class ApiPageSet extends ApiQueryBase {
// bug 25734 API: possible issue with revids validation
// It seems with a load of revision rows, MySQL gets upset
// Remove any < 0 integers, as they can't be valid
- foreach( $array as $i => $int ) {
+ foreach ( $array as $i => $int ) {
if ( $int < 0 ) {
unset( $array[$i] );
}
@@ -756,8 +1009,8 @@ class ApiPageSet extends ApiQueryBase {
return $array;
}
- public function getAllowedParams() {
- return array(
+ public function getAllowedParams( $flags = 0 ) {
+ $result = array(
'titles' => array(
ApiBase::PARAM_ISMULTI => true
),
@@ -768,15 +1021,59 @@ class ApiPageSet extends ApiQueryBase {
'revids' => array(
ApiBase::PARAM_TYPE => 'integer',
ApiBase::PARAM_ISMULTI => true
- )
+ ),
+ 'redirects' => false,
+ 'converttitles' => false,
);
+ if ( $this->mAllowGenerator ) {
+ if ( $flags & ApiBase::GET_VALUES_FOR_HELP ) {
+ $result['generator'] = array(
+ ApiBase::PARAM_TYPE => $this->getGenerators()
+ );
+ } else {
+ $result['generator'] = null;
+ }
+ }
+ return $result;
+ }
+
+ private static $generators = null;
+
+ /**
+ * Get an array of all available generators
+ * @return array
+ */
+ private function getGenerators() {
+ if ( self::$generators === null ) {
+ $query = $this->mDbSource;
+ if ( !( $query instanceof ApiQuery ) ) {
+ // If the parent container of this pageset is not ApiQuery,
+ // we must create it to get module manager
+ $query = $this->getMain()->getModuleManager()->getModule( 'query' );
+ }
+ $gens = array();
+ $mgr = $query->getModuleManager();
+ foreach ( $mgr->getNamesWithClasses() as $name => $class ) {
+ if ( is_subclass_of( $class, 'ApiQueryGeneratorBase' ) ) {
+ $gens[] = $name;
+ }
+ }
+ sort( $gens );
+ self::$generators = $gens;
+ }
+ return self::$generators;
}
public function getParamDescription() {
return array(
'titles' => 'A list of titles to work on',
'pageids' => 'A list of page IDs to work on',
- 'revids' => 'A list of revision IDs to work on'
+ 'revids' => 'A list of revision IDs to work on',
+ 'generator' => array( 'Get the list of pages to work on by executing the specified query module.',
+ 'NOTE: generator parameter names must be prefixed with a \'g\', see examples' ),
+ 'redirects' => 'Automatically resolve redirects',
+ 'converttitles' => array( 'Convert titles to other variants if necessary. Only works if the wiki\'s content language supports variant conversion.',
+ 'Languages that support variant conversion include ' . implode( ', ', LanguageConverter::$languagesWithVariants ) ),
);
}
@@ -784,10 +1081,7 @@ class ApiPageSet extends ApiQueryBase {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'multisource', 'info' => "Cannot use 'pageids' at the same time as 'dataSource'" ),
array( 'code' => 'multisource', 'info' => "Cannot use 'revids' at the same time as 'dataSource'" ),
+ array( 'code' => 'badgenerator', 'info' => 'Module $generatorName cannot be used as a generator' ),
) );
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiParamInfo.php b/includes/api/ApiParamInfo.php
index 343a2625..27f8cefd 100644
--- a/includes/api/ApiParamInfo.php
+++ b/includes/api/ApiParamInfo.php
@@ -42,42 +42,13 @@ class ApiParamInfo extends ApiBase {
public function execute() {
// Get parameters
$params = $this->extractRequestParams();
- $result = $this->getResult();
+ $resultObj = $this->getResult();
$res = array();
- if ( is_array( $params['modules'] ) ) {
- $modules = $this->getMain()->getModules();
- $res['modules'] = array();
- foreach ( $params['modules'] as $mod ) {
- if ( !isset( $modules[$mod] ) ) {
- $res['modules'][] = array( 'name' => $mod, 'missing' => '' );
- continue;
- }
- $obj = new $modules[$mod]( $this->getMain(), $mod );
- $item = $this->getClassInfo( $obj );
- $item['name'] = $mod;
- $res['modules'][] = $item;
- }
- $result->setIndexedTagName( $res['modules'], 'module' );
- }
+ $this->addModulesInfo( $params, 'modules', $res, $resultObj );
- if ( is_array( $params['querymodules'] ) ) {
- $queryModules = $this->queryObj->getModules();
- $res['querymodules'] = array();
- foreach ( $params['querymodules'] as $qm ) {
- if ( !isset( $queryModules[$qm] ) ) {
- $res['querymodules'][] = array( 'name' => $qm, 'missing' => '' );
- continue;
- }
- $obj = new $queryModules[$qm]( $this, $qm );
- $item = $this->getClassInfo( $obj );
- $item['name'] = $qm;
- $item['querytype'] = $this->queryObj->getModuleType( $qm );
- $res['querymodules'][] = $item;
- }
- $result->setIndexedTagName( $res['querymodules'], 'module' );
- }
+ $this->addModulesInfo( $params, 'querymodules', $res, $resultObj );
if ( $params['mainmodule'] ) {
$res['mainmodule'] = $this->getClassInfo( $this->getMain() );
@@ -88,36 +59,57 @@ class ApiParamInfo extends ApiBase {
$res['pagesetmodule'] = $this->getClassInfo( $pageSet );
}
- if ( is_array( $params['formatmodules'] ) ) {
- $formats = $this->getMain()->getFormats();
- $res['formatmodules'] = array();
- foreach ( $params['formatmodules'] as $f ) {
- if ( !isset( $formats[$f] ) ) {
- $res['formatmodules'][] = array( 'name' => $f, 'missing' => '' );
- continue;
- }
- $obj = new $formats[$f]( $this, $f );
- $item = $this->getClassInfo( $obj );
- $item['name'] = $f;
- $res['formatmodules'][] = $item;
+ $this->addModulesInfo( $params, 'formatmodules', $res, $resultObj );
+
+ $resultObj->addValue( null, $this->getModuleName(), $res );
+ }
+
+ /**
+ * If the type is requested in parameters, adds a section to res with module info.
+ * @param array $params user parameters array
+ * @param string $type parameter name
+ * @param array $res store results in this array
+ * @param ApiResult $resultObj results object to set indexed tag.
+ */
+ private function addModulesInfo( $params, $type, &$res, $resultObj ) {
+ if ( !is_array( $params[$type] ) ) {
+ return;
+ }
+ $isQuery = ( $type === 'querymodules' );
+ if ( $isQuery ) {
+ $mgr = $this->queryObj->getModuleManager();
+ } else {
+ $mgr = $this->getMain()->getModuleManager();
+ }
+ $res[$type] = array();
+ foreach ( $params[$type] as $mod ) {
+ if ( !$mgr->isDefined( $mod ) ) {
+ $res[$type][] = array( 'name' => $mod, 'missing' => '' );
+ continue;
+ }
+ $obj = $mgr->getModule( $mod );
+ $item = $this->getClassInfo( $obj );
+ $item['name'] = $mod;
+ if ( $isQuery ) {
+ $item['querytype'] = $mgr->getModuleGroup( $mod );
}
- $result->setIndexedTagName( $res['formatmodules'], 'module' );
+ $res[$type][] = $item;
}
- $result->addValue( null, $this->getModuleName(), $res );
+ $resultObj->setIndexedTagName( $res[$type], 'module' );
}
/**
* @param $obj ApiBase
* @return ApiResult
*/
- function getClassInfo( $obj ) {
+ private function getClassInfo( $obj ) {
$result = $this->getResult();
$retval['classname'] = get_class( $obj );
$retval['description'] = implode( "\n", (array)$obj->getFinalDescription() );
-
$retval['examples'] = '';
- $retval['version'] = implode( "\n", (array)$obj->getVersion() );
+ // version is deprecated since 1.21, but needs to be returned for v1
+ $retval['version'] = '';
$retval['prefix'] = $obj->getModulePrefix();
if ( $obj->isReadMode() ) {
@@ -133,7 +125,7 @@ class ApiParamInfo extends ApiBase {
$retval['generator'] = '';
}
- $allowedParams = $obj->getFinalParams();
+ $allowedParams = $obj->getFinalParams( ApiBase::GET_VALUES_FOR_HELP );
if ( !is_array( $allowedParams ) ) {
return $retval;
}
@@ -150,7 +142,7 @@ class ApiParamInfo extends ApiBase {
if ( is_string( $examples ) ) {
$examples = array( $examples );
}
- foreach( $examples as $k => $v ) {
+ foreach ( $examples as $k => $v ) {
if ( strlen( $retval['examples'] ) ) {
$retval['examples'] .= ' ';
}
@@ -181,7 +173,7 @@ class ApiParamInfo extends ApiBase {
}
//handle shorthand
- if( !is_array( $p ) ) {
+ if ( !is_array( $p ) ) {
$p = array(
ApiBase::PARAM_DFLT => $p,
);
@@ -208,11 +200,11 @@ class ApiParamInfo extends ApiBase {
if ( isset( $p[ApiBase::PARAM_DFLT] ) ) {
$type = $p[ApiBase::PARAM_TYPE];
- if( $type === 'boolean' ) {
+ if ( $type === 'boolean' ) {
$a['default'] = ( $p[ApiBase::PARAM_DFLT] ? 'true' : 'false' );
- } elseif( $type === 'string' ) {
+ } elseif ( $type === 'string' ) {
$a['default'] = strval( $p[ApiBase::PARAM_DFLT] );
- } elseif( $type === 'integer' ) {
+ } elseif ( $type === 'integer' ) {
$a['default'] = intval( $p[ApiBase::PARAM_DFLT] );
} else {
$a['default'] = $p[ApiBase::PARAM_DFLT];
@@ -299,7 +291,7 @@ class ApiParamInfo extends ApiBase {
$retval['props'][] = $propResult;
}
- // default is true for query modules, false for other modules, overriden by ApiBase::PROP_LIST
+ // default is true for query modules, false for other modules, overridden by ApiBase::PROP_LIST
if ( $listResult === true || ( $listResult !== false && $obj instanceof ApiQueryBase ) ) {
$retval['listresult'] = '';
}
@@ -319,11 +311,11 @@ class ApiParamInfo extends ApiBase {
}
public function getAllowedParams() {
- $modules = array_keys( $this->getMain()->getModules() );
+ $modules = $this->getMain()->getModuleManager()->getNames( 'action' );
sort( $modules );
- $querymodules = array_keys( $this->queryObj->getModules() );
+ $querymodules = $this->queryObj->getModuleManager()->getNames();
sort( $querymodules );
- $formatmodules = array_keys( $this->getMain()->getFormats() );
+ $formatmodules = $this->getMain()->getModuleManager()->getNames( 'format' );
sort( $formatmodules );
return array(
'modules' => array(
@@ -366,8 +358,4 @@ class ApiParamInfo extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Parameter_information';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php
index db6e2bb8..09b7a882 100644
--- a/includes/api/ApiParse.php
+++ b/includes/api/ApiParse.php
@@ -26,11 +26,15 @@
* @ingroup API
*/
class ApiParse extends ApiBase {
- private $section, $text, $pstText = null;
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
+ /** @var String $section */
+ private $section = null;
+
+ /** @var Content $content */
+ private $content = null;
+
+ /** @var Content $pstContent */
+ private $pstContent = null;
public function execute() {
// The data is hot but user-dependent, like page views, so we set vary cookies
@@ -44,6 +48,9 @@ class ApiParse extends ApiBase {
$pageid = $params['pageid'];
$oldid = $params['oldid'];
+ $model = $params['contentmodel'];
+ $format = $params['contentformat'];
+
if ( !is_null( $page ) && ( !is_null( $text ) || $title != 'API' ) ) {
$this->dieUsage( 'The page parameter cannot be used together with the text and title parameters', 'params' );
}
@@ -61,7 +68,7 @@ class ApiParse extends ApiBase {
// TODO: Does this still need $wgTitle?
global $wgParser, $wgTitle;
- // Currently unnecessary, code to act as a safeguard against any change in current behaviour of uselang breaks
+ // Currently unnecessary, code to act as a safeguard against any change in current behavior of uselang
$oldLang = null;
if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) {
$oldLang = $this->getContext()->getLanguage(); // Backup language
@@ -91,19 +98,19 @@ class ApiParse extends ApiBase {
$popts->enableLimitReport( !$params['disablepp'] );
// If for some reason the "oldid" is actually the current revision, it may be cached
- if ( $titleObj->getLatestRevID() === intval( $oldid ) ) {
+ if ( $rev->isCurrent() ) {
// May get from/save to parser cache
- $p_result = $this->getParsedSectionOrText( $pageObj, $popts, $pageid,
- isset( $prop['wikitext'] ) ) ;
+ $p_result = $this->getParsedContent( $pageObj, $popts,
+ $pageid, isset( $prop['wikitext'] ) );
} else { // This is an old revision, so get the text differently
- $this->text = $rev->getText( Revision::FOR_THIS_USER, $this->getUser() );
+ $this->content = $rev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
if ( $this->section !== false ) {
- $this->text = $this->getSectionText( $this->text, 'r' . $rev->getId() );
+ $this->content = $this->getSectionContent( $this->content, 'r' . $rev->getId() );
}
// Should we save old revision parses to the parser cache?
- $p_result = $wgParser->parse( $this->text, $titleObj, $popts );
+ $p_result = $this->content->getParserOutput( $titleObj, $rev->getId(), $popts );
}
} else { // Not $oldid, but $pageid or $page
if ( $params['redirects'] ) {
@@ -136,6 +143,9 @@ class ApiParse extends ApiBase {
$pageObj = $this->getTitleOrPageId( $pageParams, 'fromdb' );
$titleObj = $pageObj->getTitle();
+ if ( !$titleObj || !$titleObj->exists() ) {
+ $this->dieUsage( "The page you specified doesn't exist", 'missingtitle' );
+ }
$wgTitle = $titleObj;
if ( isset( $prop['revid'] ) ) {
@@ -146,46 +156,59 @@ class ApiParse extends ApiBase {
$popts->enableLimitReport( !$params['disablepp'] );
// Potentially cached
- $p_result = $this->getParsedSectionOrText( $pageObj, $popts, $pageid,
- isset( $prop['wikitext'] ) ) ;
+ $p_result = $this->getParsedContent( $pageObj, $popts, $pageid,
+ isset( $prop['wikitext'] ) );
}
} else { // Not $oldid, $pageid, $page. Hence based on $text
-
- if ( is_null( $text ) ) {
- $this->dieUsage( 'The text parameter should be passed with the title parameter. Should you be using the "page" parameter instead?', 'params' );
- }
- $this->text = $text;
$titleObj = Title::newFromText( $title );
- if ( !$titleObj ) {
+ if ( !$titleObj || $titleObj->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $title ) );
}
+ if ( !$titleObj->canExist() ) {
+ $this->dieUsage( "Namespace doesn't allow actual pages", 'pagecannotexist' );
+ }
$wgTitle = $titleObj;
$pageObj = WikiPage::factory( $titleObj );
$popts = $pageObj->makeParserOptions( $this->getContext() );
$popts->enableLimitReport( !$params['disablepp'] );
+ if ( is_null( $text ) ) {
+ $this->dieUsage( 'The text parameter should be passed with the title parameter. Should you be using the "page" parameter instead?', 'params' );
+ }
+
+ try {
+ $this->content = ContentHandler::makeContent( $text, $titleObj, $model, $format );
+ } catch ( MWContentSerializationException $ex ) {
+ $this->dieUsage( $ex->getMessage(), 'parseerror' );
+ }
+
if ( $this->section !== false ) {
- $this->text = $this->getSectionText( $this->text, $titleObj->getText() );
+ $this->content = $this->getSectionContent( $this->content, $titleObj->getText() );
}
if ( $params['pst'] || $params['onlypst'] ) {
- $this->pstText = $wgParser->preSaveTransform( $this->text, $titleObj, $this->getUser(), $popts );
+ $this->pstContent = $this->content->preSaveTransform( $titleObj, $this->getUser(), $popts );
}
if ( $params['onlypst'] ) {
// Build a result and bail out
$result_array = array();
$result_array['text'] = array();
- $result->setContent( $result_array['text'], $this->pstText );
+ $result->setContent( $result_array['text'], $this->pstContent->serialize( $format ) );
if ( isset( $prop['wikitext'] ) ) {
$result_array['wikitext'] = array();
- $result->setContent( $result_array['wikitext'], $this->text );
+ $result->setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
}
$result->addValue( null, $this->getModuleName(), $result_array );
return;
}
+
// Not cached (save or load)
- $p_result = $wgParser->parse( $params['pst'] ? $this->pstText : $this->text, $titleObj, $popts );
+ if ( $params['pst'] ) {
+ $p_result = $this->pstContent->getParserOutput( $titleObj, null, $popts );
+ } else {
+ $p_result = $this->content->getParserOutput( $titleObj, null, $popts );
+ }
}
$result_array = array();
@@ -275,10 +298,10 @@ class ApiParse extends ApiBase {
if ( isset( $prop['wikitext'] ) ) {
$result_array['wikitext'] = array();
- $result->setContent( $result_array['wikitext'], $this->text );
- if ( !is_null( $this->pstText ) ) {
+ $result->setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
+ if ( !is_null( $this->pstContent ) ) {
$result_array['psttext'] = array();
- $result->setContent( $result_array['psttext'], $this->pstText );
+ $result->setContent( $result_array['psttext'], $this->pstContent->serialize( $format ) );
}
}
if ( isset( $prop['properties'] ) ) {
@@ -286,8 +309,12 @@ class ApiParse extends ApiBase {
}
if ( $params['generatexml'] ) {
+ if ( $this->content->getModel() != CONTENT_MODEL_WIKITEXT ) {
+ $this->dieUsage( "generatexml is only supported for wikitext content", "notwikitext" );
+ }
+
$wgParser->startExternalParse( $titleObj, $popts, OT_PREPROCESS );
- $dom = $wgParser->preprocessToDom( $this->text );
+ $dom = $wgParser->preprocessToDom( $this->content->getNativeData() );
if ( is_callable( array( $dom, 'saveXML' ) ) ) {
$xml = $dom->saveXML();
} else {
@@ -325,15 +352,16 @@ class ApiParse extends ApiBase {
* @param $getWikitext Bool
* @return ParserOutput
*/
- private function getParsedSectionOrText( $page, $popts, $pageId = null, $getWikitext = false ) {
- global $wgParser;
+ private function getParsedContent( WikiPage $page, $popts, $pageId = null, $getWikitext = false ) {
+ $this->content = $page->getContent( Revision::RAW ); //XXX: really raw?
- if ( $this->section !== false ) {
- $this->text = $this->getSectionText( $page->getRawText(), !is_null( $pageId )
- ? 'page id ' . $pageId : $page->getTitle()->getPrefixedText() );
+ if ( $this->section !== false && $this->content !== null ) {
+ $this->content = $this->getSectionContent(
+ $this->content,
+ !is_null( $pageId ) ? 'page id ' . $pageId : $page->getTitle()->getText() );
// Not cached (save or load)
- return $wgParser->parse( $this->text, $page->getTitle(), $popts );
+ return $this->content->getParserOutput( $page->getTitle(), null, $popts );
} else {
// Try the parser cache first
// getParserOutput will save to Parser cache if able
@@ -342,20 +370,23 @@ class ApiParse extends ApiBase {
$this->dieUsage( "There is no revision ID {$page->getLatest()}", 'missingrev' );
}
if ( $getWikitext ) {
- $this->text = $page->getRawText();
+ $this->content = $page->getContent( Revision::RAW );
}
return $pout;
}
}
- private function getSectionText( $text, $what ) {
- global $wgParser;
+ private function getSectionContent( Content $content, $what ) {
// Not cached (save or load)
- $text = $wgParser->getSection( $text, $this->section, false );
- if ( $text === false ) {
+ $section = $content->getSection( $this->section );
+ if ( $section === false ) {
$this->dieUsage( "There is no section {$this->section} in " . $what, 'nosuchsection' );
}
- return $text;
+ if ( $section === null ) {
+ $this->dieUsage( "Sections are not supported by " . $what, 'nosuchsection' );
+ $section = false;
+ }
+ return $section;
}
private function formatLangLinks( $links ) {
@@ -415,14 +446,14 @@ class ApiParse extends ApiBase {
$text = Language::fetchLanguageName( $nt->getInterwiki() );
$langs[] = Html::element( 'a',
- array( 'href' => $nt->getFullURL(), 'title' => $nt->getText(), 'class' => "external" ),
+ array( 'href' => $nt->getFullURL(), 'title' => $nt->getText(), 'class' => 'external' ),
$text == '' ? $l : $text );
}
$s .= implode( wfMessage( 'pipe-separator' )->escaped(), $langs );
if ( $wgContLang->isRTL() ) {
- $s = Html::rawElement( 'span', array( 'dir' => "LTR" ), $s );
+ $s = Html::rawElement( 'span', array( 'dir' => 'LTR' ), $s );
}
return $s;
@@ -548,6 +579,12 @@ class ApiParse extends ApiBase {
'section' => null,
'disablepp' => false,
'generatexml' => false,
+ 'contentformat' => array(
+ ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
+ ),
+ 'contentmodel' => array(
+ ApiBase::PARAM_TYPE => ContentHandler::getContentModels(),
+ )
);
}
@@ -592,7 +629,9 @@ class ApiParse extends ApiBase {
'uselang' => 'Which language to parse the request in',
'section' => 'Only retrieve the content of this section number',
'disablepp' => 'Disable the PP Report from the parser output',
- 'generatexml' => 'Generate XML parse tree',
+ 'generatexml' => 'Generate XML parse tree (requires prop=wikitext)',
+ 'contentformat' => 'Content serialization format used for the input text',
+ 'contentmodel' => 'Content model of the new content',
);
}
@@ -613,6 +652,9 @@ class ApiParse extends ApiBase {
array( 'code' => 'nosuchsection', 'info' => 'There is no section sectionnumber in page' ),
array( 'nosuchpageid' ),
array( 'invalidtitle', 'title' ),
+ array( 'code' => 'parseerror', 'info' => 'Failed to parse the given text.' ),
+ array( 'code' => 'notwikitext', 'info' => 'The requested operation is only supported on wikitext content.' ),
+ array( 'code' => 'pagecannotexist', 'info' => "Namespace doesn't allow actual pages" ),
) );
}
@@ -625,8 +667,4 @@ class ApiParse extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Parsing_wikitext#parse';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiPatrol.php b/includes/api/ApiPatrol.php
index cb5e081a..4d4fbba9 100644
--- a/includes/api/ApiPatrol.php
+++ b/includes/api/ApiPatrol.php
@@ -30,10 +30,6 @@
*/
class ApiPatrol extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
/**
* Patrols the article or provides the reason the patrol failed.
*/
@@ -120,8 +116,4 @@ class ApiPatrol extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Patrol';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiProtect.php b/includes/api/ApiProtect.php
index b3ca67e6..503c6920 100644
--- a/includes/api/ApiProtect.php
+++ b/includes/api/ApiProtect.php
@@ -29,10 +29,6 @@
*/
class ApiProtect extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
global $wgRestrictionLevels;
$params = $this->extractRequestParams();
@@ -178,7 +174,7 @@ class ApiProtect extends ApiBase {
'token' => 'A protect token previously retrieved through prop=info',
'protections' => 'List of protection levels, formatted action=group (e.g. edit=sysop)',
'expiry' => array( 'Expiry timestamps. If only one timestamp is set, it\'ll be used for all protections.',
- 'Use \'infinite\', \'indefinite\' or \'never\', for a neverexpiring protection.' ),
+ 'Use \'infinite\', \'indefinite\' or \'never\', for a never-expiring protection.' ),
'reason' => 'Reason for (un)protecting',
'cascade' => array( 'Enable cascading protection (i.e. protect pages included in this page)',
'Ignored if not all protection levels are \'sysop\' or \'protect\'' ),
@@ -234,8 +230,4 @@ class ApiProtect extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Protect';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiPurge.php b/includes/api/ApiPurge.php
index 9fedaf1b..134f4a0d 100644
--- a/includes/api/ApiPurge.php
+++ b/includes/api/ApiPurge.php
@@ -31,69 +31,69 @@
*/
class ApiPurge extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
+ private $mPageSet;
+
+ /**
+ * Add all items from $values into the result
+ * @param array $result output
+ * @param array $values values to add
+ * @param string $flag the name of the boolean flag to mark this element
+ * @param string $name if given, name of the value
+ */
+ private static function addValues( array &$result, $values, $flag = null, $name = null ) {
+ foreach ( $values as $val ) {
+ if( $val instanceof Title ) {
+ $v = array();
+ ApiQueryBase::addTitleInfo( $v, $val );
+ } elseif( $name !== null ) {
+ $v = array( $name => $val );
+ } else {
+ $v = $val;
+ }
+ if( $flag !== null ) {
+ $v[$flag] = '';
+ }
+ $result[] = $v;
+ }
}
/**
* Purges the cache of a page
*/
public function execute() {
- $user = $this->getUser();
$params = $this->extractRequestParams();
- if ( !$user->isAllowed( 'purge' ) && !$this->getMain()->isInternalMode() &&
- !$this->getRequest()->wasPosted() ) {
- $this->dieUsageMsg( array( 'mustbeposted', $this->getModuleName() ) );
- }
$forceLinkUpdate = $params['forcelinkupdate'];
- $pageSet = new ApiPageSet( $this );
+ $pageSet = $this->getPageSet();
$pageSet->execute();
$result = array();
- foreach( $pageSet->getInvalidTitles() as $title ) {
- $r = array();
- $r['title'] = $title;
- $r['invalid'] = '';
- $result[] = $r;
- }
- foreach( $pageSet->getMissingPageIDs() as $p ) {
- $page = array();
- $page['pageid'] = $p;
- $page['missing'] = '';
- $result[] = $page;
- }
- foreach( $pageSet->getMissingRevisionIDs() as $r ) {
- $rev = array();
- $rev['revid'] = $r;
- $rev['missing'] = '';
- $result[] = $rev;
- }
-
- foreach ( $pageSet->getTitles() as $title ) {
+ self::addValues( $result, $pageSet->getInvalidTitles(), 'invalid', 'title' );
+ self::addValues( $result, $pageSet->getSpecialTitles(), 'special', 'title' );
+ self::addValues( $result, $pageSet->getMissingPageIDs(), 'missing', 'pageid' );
+ self::addValues( $result, $pageSet->getMissingRevisionIDs(), 'missing', 'revid' );
+ self::addValues( $result, $pageSet->getMissingTitles(), 'missing' );
+ self::addValues( $result, $pageSet->getInterwikiTitlesAsResult() );
+
+ foreach ( $pageSet->getGoodTitles() as $title ) {
$r = array();
-
ApiQueryBase::addTitleInfo( $r, $title );
- if ( !$title->exists() ) {
- $r['missing'] = '';
- $result[] = $r;
- continue;
- }
-
$page = WikiPage::factory( $title );
$page->doPurge(); // Directly purge and skip the UI part of purge().
$r['purged'] = '';
- if( $forceLinkUpdate ) {
- if ( !$user->pingLimiter() ) {
- global $wgParser, $wgEnableParserCache;
+ if ( $forceLinkUpdate ) {
+ if ( !$this->getUser()->pingLimiter() ) {
+ global $wgEnableParserCache;
$popts = $page->makeParserOptions( 'canonical' );
- $p_result = $wgParser->parse( $page->getRawText(), $title, $popts,
- true, true, $page->getLatest() );
+
+ # Parse content; note that HTML generation is only needed if we want to cache the result.
+ $content = $page->getContent( Revision::RAW );
+ $p_result = $content->getParserOutput( $title, $page->getLatest(), $popts, $wgEnableParserCache );
# Update the links tables
- $updates = $p_result->getSecondaryDataUpdates( $title );
+ $updates = $content->getSecondaryDataUpdates( $title, null, true, $p_result );
DataUpdate::runUpdates( $updates );
$r['linkupdate'] = '';
@@ -114,24 +114,52 @@ class ApiPurge extends ApiBase {
$apiResult = $this->getResult();
$apiResult->setIndexedTagName( $result, 'page' );
$apiResult->addValue( null, $this->getModuleName(), $result );
+
+ $values = $pageSet->getNormalizedTitlesAsResult( $apiResult );
+ if ( $values ) {
+ $apiResult->addValue( null, 'normalized', $values );
+ }
+ $values = $pageSet->getConvertedTitlesAsResult( $apiResult );
+ if ( $values ) {
+ $apiResult->addValue( null, 'converted', $values );
+ }
+ $values = $pageSet->getRedirectTitlesAsResult( $apiResult );
+ if ( $values ) {
+ $apiResult->addValue( null, 'redirects', $values );
+ }
+ }
+
+ /**
+ * Get a cached instance of an ApiPageSet object
+ * @return ApiPageSet
+ */
+ private function getPageSet() {
+ if ( !isset( $this->mPageSet ) ) {
+ $this->mPageSet = new ApiPageSet( $this );
+ }
+ return $this->mPageSet;
}
public function isWriteMode() {
return true;
}
- public function getAllowedParams() {
- $psModule = new ApiPageSet( $this );
- return $psModule->getAllowedParams() + array(
- 'forcelinkupdate' => false,
- );
+ public function mustBePosted() {
+ // Anonymous users are not allowed a non-POST request
+ return !$this->getUser()->isAllowed( 'purge' );
+ }
+
+ public function getAllowedParams( $flags = 0 ) {
+ $result = array( 'forcelinkupdate' => false );
+ if ( $flags ) {
+ $result += $this->getPageSet()->getFinalParams( $flags );
+ }
+ return $result;
}
public function getParamDescription() {
- $psModule = new ApiPageSet( $this );
- return $psModule->getParamDescription() + array(
- 'forcelinkupdate' => 'Update the links tables',
- );
+ return $this->getPageSet()->getParamDescription()
+ + array( 'forcelinkupdate' => 'Update the links tables' );
}
public function getResultProperties() {
@@ -155,9 +183,14 @@ class ApiPurge extends ApiBase {
ApiBase::PROP_NULLABLE => true
),
'invalid' => 'boolean',
+ 'special' => 'boolean',
'missing' => 'boolean',
'purged' => 'boolean',
- 'linkupdate' => 'boolean'
+ 'linkupdate' => 'boolean',
+ 'iw' => array(
+ ApiBase::PROP_TYPE => 'string',
+ ApiBase::PROP_NULLABLE => true
+ ),
)
);
}
@@ -169,10 +202,9 @@ class ApiPurge extends ApiBase {
}
public function getPossibleErrors() {
- $psModule = new ApiPageSet( $this );
return array_merge(
parent::getPossibleErrors(),
- $psModule->getPossibleErrors()
+ $this->getPageSet()->getPossibleErrors()
);
}
@@ -185,8 +217,4 @@ class ApiPurge extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Purge';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php
index 554aae5a..f69ad234 100644
--- a/includes/api/ApiQuery.php
+++ b/includes/api/ApiQuery.php
@@ -37,16 +37,11 @@
*/
class ApiQuery extends ApiBase {
- private $mPropModuleNames, $mListModuleNames, $mMetaModuleNames;
-
/**
- * @var ApiPageSet
+ * List of Api Query prop modules
+ * @var array
*/
- private $mPageSet;
-
- private $params, $redirects, $convertTitles, $iwUrl;
-
- private $mQueryPropModules = array(
+ private static $QueryPropModules = array(
'categories' => 'ApiQueryCategories',
'categoryinfo' => 'ApiQueryCategoryInfo',
'duplicatefiles' => 'ApiQueryDuplicateFiles',
@@ -63,11 +58,16 @@ class ApiQuery extends ApiBase {
'templates' => 'ApiQueryLinks',
);
- private $mQueryListModules = array(
+ /**
+ * List of Api Query list modules
+ * @var array
+ */
+ private static $QueryListModules = array(
'allcategories' => 'ApiQueryAllCategories',
'allimages' => 'ApiQueryAllImages',
'alllinks' => 'ApiQueryAllLinks',
'allpages' => 'ApiQueryAllPages',
+ 'alltransclusions' => 'ApiQueryAllLinks',
'allusers' => 'ApiQueryAllUsers',
'backlinks' => 'ApiQueryBacklinks',
'blocks' => 'ApiQueryBlocks',
@@ -80,6 +80,8 @@ class ApiQuery extends ApiBase {
'iwbacklinks' => 'ApiQueryIWBacklinks',
'langbacklinks' => 'ApiQueryLangBacklinks',
'logevents' => 'ApiQueryLogEvents',
+ 'pageswithprop' => 'ApiQueryPagesWithProp',
+ 'pagepropnames' => 'ApiQueryPagePropNames',
'protectedtitles' => 'ApiQueryProtectedTitles',
'querypage' => 'ApiQueryQueryPage',
'random' => 'ApiQueryRandom',
@@ -92,16 +94,26 @@ class ApiQuery extends ApiBase {
'watchlistraw' => 'ApiQueryWatchlistRaw',
);
- private $mQueryMetaModules = array(
+ /**
+ * List of Api Query meta modules
+ * @var array
+ */
+ private static $QueryMetaModules = array(
'allmessages' => 'ApiQueryAllMessages',
'siteinfo' => 'ApiQuerySiteinfo',
'userinfo' => 'ApiQueryUserInfo',
);
- private $mSlaveDB = null;
- private $mNamedDB = array();
+ /**
+ * @var ApiPageSet
+ */
+ private $mPageSet;
- protected $mAllowedGenerators = array();
+ private $mParams;
+ private $mNamedDB = array();
+ private $mModuleMgr;
+ private $mGeneratorContinue;
+ private $mUseLegacyContinue;
/**
* @param $main ApiMain
@@ -110,59 +122,27 @@ class ApiQuery extends ApiBase {
public function __construct( $main, $action ) {
parent::__construct( $main, $action );
- // Allow custom modules to be added in LocalSettings.php
- global $wgAPIPropModules, $wgAPIListModules, $wgAPIMetaModules,
- $wgMemc, $wgAPICacheHelpTimeout;
- self::appendUserModules( $this->mQueryPropModules, $wgAPIPropModules );
- self::appendUserModules( $this->mQueryListModules, $wgAPIListModules );
- self::appendUserModules( $this->mQueryMetaModules, $wgAPIMetaModules );
-
- $this->mPropModuleNames = array_keys( $this->mQueryPropModules );
- $this->mListModuleNames = array_keys( $this->mQueryListModules );
- $this->mMetaModuleNames = array_keys( $this->mQueryMetaModules );
-
- // Get array of query generators from cache if present
- $key = wfMemcKey( 'apiquerygenerators', SpecialVersion::getVersion( 'nodb' ) );
-
- if ( $wgAPICacheHelpTimeout > 0 ) {
- $cached = $wgMemc->get( $key );
- if ( $cached ) {
- $this->mAllowedGenerators = $cached;
- return;
- }
- }
- $this->makeGeneratorList( $this->mQueryPropModules );
- $this->makeGeneratorList( $this->mQueryListModules );
+ $this->mModuleMgr = new ApiModuleManager( $this );
- if ( $wgAPICacheHelpTimeout > 0 ) {
- $wgMemc->set( $key, $this->mAllowedGenerators, $wgAPICacheHelpTimeout );
- }
+ // Allow custom modules to be added in LocalSettings.php
+ global $wgAPIPropModules, $wgAPIListModules, $wgAPIMetaModules;
+ $this->mModuleMgr->addModules( self::$QueryPropModules, 'prop' );
+ $this->mModuleMgr->addModules( $wgAPIPropModules, 'prop' );
+ $this->mModuleMgr->addModules( self::$QueryListModules, 'list' );
+ $this->mModuleMgr->addModules( $wgAPIListModules, 'list' );
+ $this->mModuleMgr->addModules( self::$QueryMetaModules, 'meta' );
+ $this->mModuleMgr->addModules( $wgAPIMetaModules, 'meta' );
+
+ // Create PageSet that will process titles/pageids/revids/generator
+ $this->mPageSet = new ApiPageSet( $this );
}
/**
- * Helper function to append any add-in modules to the list
- * @param $modules array Module array
- * @param $newModules array Module array to add to $modules
+ * Overrides to return this instance's module manager.
+ * @return ApiModuleManager
*/
- private static function appendUserModules( &$modules, $newModules ) {
- if ( is_array( $newModules ) ) {
- foreach ( $newModules as $moduleName => $moduleClass ) {
- $modules[$moduleName] = $moduleClass;
- }
- }
- }
-
- /**
- * Gets a default slave database connection object
- * @return DatabaseBase
- */
- public function getDB() {
- if ( !isset( $this->mSlaveDB ) ) {
- $this->profileDBIn();
- $this->mSlaveDB = wfGetDB( DB_SLAVE, 'api' );
- $this->profileDBOut();
- }
- return $this->mSlaveDB;
+ public function getModuleManager() {
+ return $this->mModuleMgr;
}
/**
@@ -170,9 +150,9 @@ class ApiQuery extends ApiBase {
* If no such connection has been requested before, it will be created.
* Subsequent calls with the same $name will return the same connection
* as the first, regardless of the values of $db and $groups
- * @param $name string Name to assign to the database connection
- * @param $db int One of the DB_* constants
- * @param $groups array Query groups
+ * @param string $name Name to assign to the database connection
+ * @param int $db One of the DB_* constants
+ * @param array $groups Query groups
* @return DatabaseBase
*/
public function getNamedDB( $name, $db, $groups ) {
@@ -194,31 +174,38 @@ class ApiQuery extends ApiBase {
/**
* Get the array mapping module names to class names
+ * @deprecated since 1.21, use getModuleManager()'s methods instead
+ * @return array array(modulename => classname)
+ */
+ public function getModules() {
+ wfDeprecated( __METHOD__, '1.21' );
+ return $this->getModuleManager()->getNamesWithClasses();
+ }
+
+ /**
+ * Get the generators array mapping module names to class names
+ * @deprecated since 1.21, list of generators is maintained by ApiPageSet
* @return array array(modulename => classname)
*/
- function getModules() {
- return array_merge( $this->mQueryPropModules, $this->mQueryListModules, $this->mQueryMetaModules );
+ public function getGenerators() {
+ wfDeprecated( __METHOD__, '1.21' );
+ $gens = array();
+ foreach ( $this->mModuleMgr->getNamesWithClasses() as $name => $class ) {
+ if ( is_subclass_of( $class, 'ApiQueryGeneratorBase' ) ) {
+ $gens[$name] = $class;
+ }
+ }
+ return $gens;
}
/**
* Get whether the specified module is a prop, list or a meta query module
- * @param $moduleName string Name of the module to find type for
+ * @deprecated since 1.21, use getModuleManager()->getModuleGroup()
+ * @param string $moduleName Name of the module to find type for
* @return mixed string or null
*/
function getModuleType( $moduleName ) {
- if ( isset( $this->mQueryPropModules[$moduleName] ) ) {
- return 'prop';
- }
-
- if ( isset( $this->mQueryListModules[$moduleName] ) ) {
- return 'list';
- }
-
- if ( isset( $this->mQueryMetaModules[$moduleName] ) ) {
- return 'meta';
- }
-
- return null;
+ return $this->getModuleManager()->getModuleGroup( $moduleName );
}
/**
@@ -247,42 +234,37 @@ class ApiQuery extends ApiBase {
* #5 Execute all requested modules
*/
public function execute() {
- $this->params = $this->extractRequestParams();
- $this->redirects = $this->params['redirects'];
- $this->convertTitles = $this->params['converttitles'];
- $this->iwUrl = $this->params['iwurl'];
+ $this->mParams = $this->extractRequestParams();
- // Create PageSet
- $this->mPageSet = new ApiPageSet( $this, $this->redirects, $this->convertTitles );
+ // $pagesetParams is a array of parameter names used by the pageset generator
+ // or null if pageset has already finished and is no longer needed
+ // $completeModules is a set of complete modules with the name as key
+ $this->initContinue( $pagesetParams, $completeModules );
// Instantiate requested modules
- $modules = array();
- $this->instantiateModules( $modules, 'prop', $this->mQueryPropModules );
- $this->instantiateModules( $modules, 'list', $this->mQueryListModules );
- $this->instantiateModules( $modules, 'meta', $this->mQueryMetaModules );
-
- $cacheMode = 'public';
-
- // If given, execute generator to substitute user supplied data with generated data.
- if ( isset( $this->params['generator'] ) ) {
- $generator = $this->newGenerator( $this->params['generator'] );
- $params = $generator->extractRequestParams();
- $cacheMode = $this->mergeCacheMode( $cacheMode,
- $generator->getCacheMode( $params ) );
- $this->executeGeneratorModule( $generator, $modules );
- } else {
- // Append custom fields and populate page/revision information
- $this->addCustomFldsToPageSet( $modules, $this->mPageSet );
+ $allModules = array();
+ $this->instantiateModules( $allModules, 'prop' );
+ $propModules = $allModules; // Keep a copy
+ $this->instantiateModules( $allModules, 'list' );
+ $this->instantiateModules( $allModules, 'meta' );
+
+ // Filter modules based on continue parameter
+ $modules = $this->initModules( $allModules, $completeModules, $pagesetParams !== null );
+
+ // Execute pageset if in legacy mode or if pageset is not done
+ if ( $completeModules === null || $pagesetParams !== null ) {
+ // Populate page/revision information
$this->mPageSet->execute();
+ // Record page information (title, namespace, if exists, etc)
+ $this->outputGeneralPageInfo();
+ } else {
+ $this->mPageSet->executeDryRun();
}
- // Record page information (title, namespace, if exists, etc)
- $this->outputGeneralPageInfo();
+ $cacheMode = $this->mPageSet->getCacheMode();
- // Execute all requested modules.
- /**
- * @var $module ApiQueryBase
- */
+ // Execute all unfinished modules
+ /** @var $module ApiQueryBase */
foreach ( $modules as $module ) {
$params = $module->extractRequestParams();
$cacheMode = $this->mergeCacheMode(
@@ -295,6 +277,136 @@ class ApiQuery extends ApiBase {
// Set the cache mode
$this->getMain()->setCacheMode( $cacheMode );
+
+ if ( $completeModules === null ) {
+ return; // Legacy continue, we are done
+ }
+
+ // Reformat query-continue result section
+ $result = $this->getResult();
+ $qc = $result->getData();
+ if ( isset( $qc['query-continue'] ) ) {
+ $qc = $qc['query-continue'];
+ $result->unsetValue( null, 'query-continue' );
+ } elseif ( $this->mGeneratorContinue !== null ) {
+ $qc = array();
+ } else {
+ // no more "continue"s, we are done!
+ return;
+ }
+
+ // we are done with all the modules that do not have result in query-continue
+ $completeModules = array_merge( $completeModules, array_diff_key( $modules, $qc ) );
+ if ( $pagesetParams !== null ) {
+ // The pageset is still in use, check if all props have finished
+ $incompleteProps = array_intersect_key( $propModules, $qc );
+ if ( count( $incompleteProps ) > 0 ) {
+ // Properties are not done, continue with the same pageset state - copy current parameters
+ $main = $this->getMain();
+ $contValues = array();
+ foreach ( $pagesetParams as $param ) {
+ // The param name is already prefix-encoded
+ $contValues[$param] = $main->getVal( $param );
+ }
+ } elseif ( $this->mGeneratorContinue !== null ) {
+ // Move to the next set of pages produced by pageset, properties need to be restarted
+ $contValues = $this->mGeneratorContinue;
+ $pagesetParams = array_keys( $contValues );
+ $completeModules = array_diff_key( $completeModules, $propModules );
+ } else {
+ // Done with the pageset, finish up with the the lists and meta modules
+ $pagesetParams = null;
+ }
+ }
+
+ $continue = '||' . implode( '|', array_keys( $completeModules ) );
+ if ( $pagesetParams !== null ) {
+ // list of all pageset parameters to use in the next request
+ $continue = implode( '|', $pagesetParams ) . $continue;
+ } else {
+ // we are done with the pageset
+ $contValues = array();
+ $continue = '-' . $continue;
+ }
+ $contValues['continue'] = $continue;
+ foreach ( $qc as $qcModule ) {
+ foreach ( $qcModule as $qcKey => $qcValue ) {
+ $contValues[$qcKey] = $qcValue;
+ }
+ }
+ $this->getResult()->addValue( null, 'continue', $contValues );
+ }
+
+ /**
+ * Parse 'continue' parameter into the list of complete modules and a list of generator parameters
+ * @param array|null $pagesetParams returns list of generator params or null if pageset is done
+ * @param array|null $completeModules returns list of finished modules (as keys), or null if legacy
+ */
+ private function initContinue( &$pagesetParams, &$completeModules ) {
+ $pagesetParams = array();
+ $continue = $this->mParams['continue'];
+ if ( $continue !== null ) {
+ $this->mUseLegacyContinue = false;
+ if ( $continue !== '' ) {
+ // Format: ' pagesetParam1 | pagesetParam2 || module1 | module2 | module3 | ...
+ // If pageset is done, use '-'
+ $continue = explode( '||', $continue );
+ $this->dieContinueUsageIf( count( $continue ) !== 2 );
+ if ( $continue[0] === '-' ) {
+ $pagesetParams = null; // No need to execute pageset
+ } elseif ( $continue[0] !== '' ) {
+ // list of pageset params that might need to be repeated
+ $pagesetParams = explode( '|', $continue[0] );
+ }
+ $continue = $continue[1];
+ }
+ if ( $continue !== '' ) {
+ $completeModules = array_flip( explode( '|', $continue ) );
+ } else {
+ $completeModules = array();
+ }
+ } else {
+ $this->mUseLegacyContinue = true;
+ $completeModules = null;
+ }
+ }
+
+ /**
+ * Validate sub-modules, filter out completed ones, and do requestExtraData()
+ * @param array $allModules An dict of name=>instance of all modules requested by the client
+ * @param array|null $completeModules list of finished modules, or null if legacy continue
+ * @param bool $usePageset True if pageset will be executed
+ * @return array of modules to be processed during this execution
+ */
+ private function initModules( $allModules, $completeModules, $usePageset ) {
+ $modules = $allModules;
+ $tmp = $completeModules;
+ $wasPosted = $this->getRequest()->wasPosted();
+ $main = $this->getMain();
+
+ /** @var $module ApiQueryBase */
+ foreach ( $allModules as $moduleName => $module ) {
+ if ( !$wasPosted && $module->mustBePosted() ) {
+ $this->dieUsageMsgOrDebug( array( 'mustbeposted', $moduleName ) );
+ }
+ if ( $completeModules !== null && array_key_exists( $moduleName, $completeModules ) ) {
+ // If this module is done, mark all its params as used
+ $module->extractRequestParams();
+ // Make sure this module is not used during execution
+ unset( $modules[$moduleName] );
+ unset( $tmp[$moduleName] );
+ } elseif ( $completeModules === null || $usePageset ) {
+ // Query modules may optimize data requests through the $this->getPageSet()
+ // object by adding extra fields from the page table.
+ // This function will gather all the extra request fields from the modules.
+ $module->requestExtraData( $this->mPageSet );
+ } else {
+ // Error - this prop module must have finished before generator is done
+ $this->dieContinueUsageIf( $this->mModuleMgr->getModuleGroup( $moduleName ) === 'prop' );
+ }
+ }
+ $this->dieContinueUsageIf( $completeModules !== null && count( $tmp ) !== 0 );
+ return $modules;
}
/**
@@ -320,32 +432,21 @@ class ApiQuery extends ApiBase {
}
/**
- * Query modules may optimize data requests through the $this->getPageSet() object
- * by adding extra fields from the page table.
- * This function will gather all the extra request fields from the modules.
- * @param $modules array of module objects
- * @param $pageSet ApiPageSet
- */
- private function addCustomFldsToPageSet( $modules, $pageSet ) {
- // Query all requested modules.
- /**
- * @var $module ApiQueryBase
- */
- foreach ( $modules as $module ) {
- $module->requestExtraData( $pageSet );
- }
- }
-
- /**
* Create instances of all modules requested by the client
- * @param $modules Array to append instantiated modules to
- * @param $param string Parameter name to read modules from
- * @param $moduleList Array array(modulename => classname)
+ * @param array $modules to append instantiated modules to
+ * @param string $param Parameter name to read modules from
*/
- private function instantiateModules( &$modules, $param, $moduleList ) {
- if ( isset( $this->params[$param] ) ) {
- foreach ( $this->params[$param] as $moduleName ) {
- $modules[] = new $moduleList[$moduleName] ( $this, $moduleName );
+ private function instantiateModules( &$modules, $param ) {
+ if ( isset( $this->mParams[$param] ) ) {
+ foreach ( $this->mParams[$param] as $moduleName ) {
+ $instance = $this->mModuleMgr->getModule( $moduleName, $param );
+ if ( $instance === null ) {
+ ApiBase::dieDebug( __METHOD__, 'Error instantiating module' );
+ }
+ // Ignore duplicates. TODO 2.0: die()?
+ if ( !array_key_exists( $moduleName, $modules ) ) {
+ $modules[$moduleName] = $instance;
+ }
}
}
}
@@ -363,85 +464,25 @@ class ApiQuery extends ApiBase {
// more than 380K. The maximum revision size is in the megabyte range,
// and the maximum result size must be even higher than that.
- // Title normalizations
- $normValues = array();
- foreach ( $pageSet->getNormalizedTitles() as $rawTitleStr => $titleStr ) {
- $normValues[] = array(
- 'from' => $rawTitleStr,
- 'to' => $titleStr
- );
+ $values = $pageSet->getNormalizedTitlesAsResult( $result );
+ if ( $values ) {
+ $result->addValue( 'query', 'normalized', $values );
}
-
- if ( count( $normValues ) ) {
- $result->setIndexedTagName( $normValues, 'n' );
- $result->addValue( 'query', 'normalized', $normValues );
+ $values = $pageSet->getConvertedTitlesAsResult( $result );
+ if ( $values ) {
+ $result->addValue( 'query', 'converted', $values );
}
-
- // Title conversions
- $convValues = array();
- foreach ( $pageSet->getConvertedTitles() as $rawTitleStr => $titleStr ) {
- $convValues[] = array(
- 'from' => $rawTitleStr,
- 'to' => $titleStr
- );
+ $values = $pageSet->getInterwikiTitlesAsResult( $result, $this->mParams['iwurl'] );
+ if ( $values ) {
+ $result->addValue( 'query', 'interwiki', $values );
}
-
- if ( count( $convValues ) ) {
- $result->setIndexedTagName( $convValues, 'c' );
- $result->addValue( 'query', 'converted', $convValues );
+ $values = $pageSet->getRedirectTitlesAsResult( $result );
+ if ( $values ) {
+ $result->addValue( 'query', 'redirects', $values );
}
-
- // Interwiki titles
- $intrwValues = array();
- foreach ( $pageSet->getInterwikiTitles() as $rawTitleStr => $interwikiStr ) {
- $item = array(
- 'title' => $rawTitleStr,
- 'iw' => $interwikiStr,
- );
- if ( $this->iwUrl ) {
- $title = Title::newFromText( $rawTitleStr );
- $item['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
- }
- $intrwValues[] = $item;
- }
-
- if ( count( $intrwValues ) ) {
- $result->setIndexedTagName( $intrwValues, 'i' );
- $result->addValue( 'query', 'interwiki', $intrwValues );
- }
-
- // Show redirect information
- $redirValues = array();
- /**
- * @var $titleTo Title
- */
- foreach ( $pageSet->getRedirectTitles() as $titleStrFrom => $titleTo ) {
- $r = array(
- 'from' => strval( $titleStrFrom ),
- 'to' => $titleTo->getPrefixedText(),
- );
- if ( $titleTo->getFragment() !== '' ) {
- $r['tofragment'] = $titleTo->getFragment();
- }
- $redirValues[] = $r;
- }
-
- if ( count( $redirValues ) ) {
- $result->setIndexedTagName( $redirValues, 'r' );
- $result->addValue( 'query', 'redirects', $redirValues );
- }
-
- // Missing revision elements
- $missingRevIDs = $pageSet->getMissingRevisionIDs();
- if ( count( $missingRevIDs ) ) {
- $revids = array();
- foreach ( $missingRevIDs as $revid ) {
- $revids[$revid] = array(
- 'revid' => $revid
- );
- }
- $result->setIndexedTagName( $revids, 'rev' );
- $result->addValue( 'query', 'badrevids', $revids );
+ $values = $pageSet->getMissingRevisionIDsAsResult( $result );
+ if ( $values ) {
+ $result->addValue( 'query', 'badrevids', $values );
}
// Page elements
@@ -466,6 +507,7 @@ class ApiQuery extends ApiBase {
);
}
// Report special pages
+ /** @var $title Title */
foreach ( $pageSet->getSpecialTitles() as $fakeId => $title ) {
$vals = array();
ApiQueryBase::addTitleInfo( $vals, $title );
@@ -489,7 +531,7 @@ class ApiQuery extends ApiBase {
}
if ( count( $pages ) ) {
- if ( $this->params['indexpageids'] ) {
+ if ( $this->mParams['indexpageids'] ) {
$pageIDs = array_keys( $pages );
// json treats all map keys as strings - converting to match
$pageIDs = array_map( 'strval', $pageIDs );
@@ -500,21 +542,44 @@ class ApiQuery extends ApiBase {
$result->setIndexedTagName( $pages, 'page' );
$result->addValue( 'query', 'pages', $pages );
}
- if ( $this->params['export'] ) {
+ if ( $this->mParams['export'] ) {
$this->doExport( $pageSet, $result );
}
}
/**
- * @param $pageSet ApiPageSet Pages to be exported
- * @param $result ApiResult Result to output to
+ * This method is called by the generator base when generator in the smart-continue
+ * mode tries to set 'query-continue' value. ApiQuery stores those values separately
+ * until the post-processing when it is known if the generation should continue or repeat.
+ * @param ApiQueryGeneratorBase $module generator module
+ * @param string $paramName
+ * @param mixed $paramValue
+ * @return bool true if processed, false if this is a legacy continue
+ */
+ public function setGeneratorContinue( $module, $paramName, $paramValue ) {
+ if ( $this->mUseLegacyContinue ) {
+ return false;
+ }
+ $paramName = $module->encodeParamName( $paramName );
+ if ( $this->mGeneratorContinue === null ) {
+ $this->mGeneratorContinue = array();
+ }
+ $this->mGeneratorContinue[$paramName] = $paramValue;
+ return true;
+ }
+
+ /**
+ * @param $pageSet ApiPageSet Pages to be exported
+ * @param $result ApiResult Result to output to
*/
- private function doExport( $pageSet, $result ) {
+ private function doExport( $pageSet, $result ) {
$exportTitles = array();
$titles = $pageSet->getGoodTitles();
if ( count( $titles ) ) {
+ $user = $this->getUser();
+ /** @var $title Title */
foreach ( $titles as $title ) {
- if ( $title->userCan( 'read' ) ) {
+ if ( $title->userCan( 'read', $user ) ) {
$exportTitles[] = $title;
}
}
@@ -536,7 +601,7 @@ class ApiQuery extends ApiBase {
// It's not continuable, so it would cause more
// problems than it'd solve
$result->disableSizeCheck();
- if ( $this->params['exportnowrap'] ) {
+ if ( $this->mParams['exportnowrap'] ) {
$result->reset();
// Raw formatter will handle this
$result->addValue( null, 'text', $exportxml );
@@ -549,80 +614,30 @@ class ApiQuery extends ApiBase {
$result->enableSizeCheck();
}
- /**
- * Create a generator object of the given type and return it
- * @param $generatorName string Module name
- * @return ApiQueryGeneratorBase
- */
- public function newGenerator( $generatorName ) {
- // Find class that implements requested generator
- if ( isset( $this->mQueryListModules[$generatorName] ) ) {
- $className = $this->mQueryListModules[$generatorName];
- } elseif ( isset( $this->mQueryPropModules[$generatorName] ) ) {
- $className = $this->mQueryPropModules[$generatorName];
- } else {
- ApiBase::dieDebug( __METHOD__, "Unknown generator=$generatorName" );
- }
- $generator = new $className ( $this, $generatorName );
- if ( !$generator instanceof ApiQueryGeneratorBase ) {
- $this->dieUsage( "Module $generatorName cannot be used as a generator", 'badgenerator' );
- }
- $generator->setGeneratorMode();
- return $generator;
- }
-
- /**
- * For generator mode, execute generator, and use its output as new
- * ApiPageSet
- * @param $generator ApiQueryGeneratorBase Generator Module
- * @param $modules array of module objects
- */
- protected function executeGeneratorModule( $generator, $modules ) {
- // Generator results
- $resultPageSet = new ApiPageSet( $this, $this->redirects, $this->convertTitles );
-
- // Add any additional fields modules may need
- $generator->requestExtraData( $this->mPageSet );
- $this->addCustomFldsToPageSet( $modules, $resultPageSet );
-
- // Populate page information with the original user input
- $this->mPageSet->execute();
-
- // populate resultPageSet with the generator output
- $generator->profileIn();
- $generator->executeGenerator( $resultPageSet );
- wfRunHooks( 'APIQueryGeneratorAfterExecute', array( &$generator, &$resultPageSet ) );
- $resultPageSet->finishPageSetGeneration();
- $generator->profileOut();
-
- // Swap the resulting pageset back in
- $this->mPageSet = $resultPageSet;
- }
-
- public function getAllowedParams() {
- return array(
+ public function getAllowedParams( $flags = 0 ) {
+ $result = array(
'prop' => array(
ApiBase::PARAM_ISMULTI => true,
- ApiBase::PARAM_TYPE => $this->mPropModuleNames
+ ApiBase::PARAM_TYPE => $this->mModuleMgr->getNames( 'prop' )
),
'list' => array(
ApiBase::PARAM_ISMULTI => true,
- ApiBase::PARAM_TYPE => $this->mListModuleNames
+ ApiBase::PARAM_TYPE => $this->mModuleMgr->getNames( 'list' )
),
'meta' => array(
ApiBase::PARAM_ISMULTI => true,
- ApiBase::PARAM_TYPE => $this->mMetaModuleNames
+ ApiBase::PARAM_TYPE => $this->mModuleMgr->getNames( 'meta' )
),
- 'generator' => array(
- ApiBase::PARAM_TYPE => $this->mAllowedGenerators
- ),
- 'redirects' => false,
- 'converttitles' => false,
'indexpageids' => false,
'export' => false,
'exportnowrap' => false,
'iwurl' => false,
+ 'continue' => null,
);
+ if ( $flags ) {
+ $result += $this->getPageSet()->getFinalParams( $flags );
+ }
+ return $result;
}
/**
@@ -630,42 +645,40 @@ class ApiQuery extends ApiBase {
* @return string
*/
public function makeHelpMsg() {
- // Make sure the internal object is empty
- // (just in case a sub-module decides to optimize during instantiation)
- $this->mPageSet = null;
+
+ // Use parent to make default message for the query module
+ $msg = parent::makeHelpMsg();
$querySeparator = str_repeat( '--- ', 12 );
$moduleSeparator = str_repeat( '*** ', 14 );
- $msg = "\n$querySeparator Query: Prop $querySeparator\n\n";
- $msg .= $this->makeHelpMsgHelper( $this->mQueryPropModules, 'prop' );
+ $msg .= "\n$querySeparator Query: Prop $querySeparator\n\n";
+ $msg .= $this->makeHelpMsgHelper( 'prop' );
$msg .= "\n$querySeparator Query: List $querySeparator\n\n";
- $msg .= $this->makeHelpMsgHelper( $this->mQueryListModules, 'list' );
+ $msg .= $this->makeHelpMsgHelper( 'list' );
$msg .= "\n$querySeparator Query: Meta $querySeparator\n\n";
- $msg .= $this->makeHelpMsgHelper( $this->mQueryMetaModules, 'meta' );
+ $msg .= $this->makeHelpMsgHelper( 'meta' );
$msg .= "\n\n$moduleSeparator Modules: continuation $moduleSeparator\n\n";
- // Use parent to make default message for the query module
- $msg = parent::makeHelpMsg() . $msg;
-
return $msg;
}
/**
- * For all modules in $moduleList, generate help messages and join them together
- * @param $moduleList Array array(modulename => classname)
- * @param $paramName string Parameter name
+ * For all modules of a given group, generate help messages and join them together
+ * @param string $group Module group
* @return string
*/
- private function makeHelpMsgHelper( $moduleList, $paramName ) {
+ private function makeHelpMsgHelper( $group ) {
$moduleDescriptions = array();
- foreach ( $moduleList as $moduleName => $moduleClass ) {
+ $moduleNames = $this->mModuleMgr->getNames( $group );
+ sort( $moduleNames );
+ foreach ( $moduleNames as $name ) {
/**
* @var $module ApiQueryBase
*/
- $module = new $moduleClass( $this, $moduleName, null );
+ $module = $this->mModuleMgr->getModule( $name );
- $msg = ApiMain::makeHelpMsgHeader( $module, $paramName );
+ $msg = ApiMain::makeHelpMsgHeader( $module, $group );
$msg2 = $module->makeHelpMsg();
if ( $msg2 !== false ) {
$msg .= $msg2;
@@ -679,46 +692,23 @@ class ApiQuery extends ApiBase {
return implode( "\n", $moduleDescriptions );
}
- /**
- * Adds any classes that are a subclass of ApiQueryGeneratorBase
- * to the allowed generator list
- * @param $moduleList array()
- */
- private function makeGeneratorList( $moduleList ) {
- foreach( $moduleList as $moduleName => $moduleClass ) {
- if ( is_subclass_of( $moduleClass, 'ApiQueryGeneratorBase' ) ) {
- $this->mAllowedGenerators[] = $moduleName;
- }
- }
- }
-
- /**
- * Override to add extra parameters from PageSet
- * @return string
- */
- public function makeHelpMsgParameters() {
- $psModule = new ApiPageSet( $this );
- return $psModule->makeHelpMsgParameters() . parent::makeHelpMsgParameters();
- }
-
public function shouldCheckMaxlag() {
return true;
}
public function getParamDescription() {
- return array(
+ return $this->getPageSet()->getParamDescription() + array(
'prop' => 'Which properties to get for the titles/revisions/pageids. Module help is available below',
'list' => 'Which lists to get. Module help is available below',
'meta' => 'Which metadata to get about the site. Module help is available below',
- 'generator' => array( 'Use the output of a list as the input for other prop/list/meta items',
- 'NOTE: generator parameter names must be prefixed with a \'g\', see examples' ),
- 'redirects' => 'Automatically resolve redirects',
- 'converttitles' => array( "Convert titles to other variants if necessary. Only works if the wiki's content language supports variant conversion.",
- 'Languages that support variant conversion include ' . implode( ', ', LanguageConverter::$languagesWithVariants ) ),
'indexpageids' => 'Include an additional pageids section listing all returned page IDs',
'export' => 'Export the current revisions of all given or generated pages',
'exportnowrap' => 'Return the export XML without wrapping it in an XML result (same format as Special:Export). Can only be used with export',
'iwurl' => 'Whether to get the full URL if the title is an interwiki link',
+ 'continue' => array(
+ 'When present, formats query-continue as key-value pairs that should simply be merged into the original request.',
+ 'This parameter must be set to an empty string in the initial query.',
+ 'This parameter is recommended for all new development, and will be made default in the next API version.' ),
);
}
@@ -731,15 +721,16 @@ class ApiQuery extends ApiBase {
}
public function getPossibleErrors() {
- return array_merge( parent::getPossibleErrors(), array(
- array( 'code' => 'badgenerator', 'info' => 'Module $generatorName cannot be used as a generator' ),
- ) );
+ return array_merge(
+ parent::getPossibleErrors(),
+ $this->getPageSet()->getPossibleErrors()
+ );
}
public function getExamples() {
return array(
- 'api.php?action=query&prop=revisions&meta=siteinfo&titles=Main%20Page&rvprop=user|comment',
- 'api.php?action=query&generator=allpages&gapprefix=API/&prop=revisions',
+ 'api.php?action=query&prop=revisions&meta=siteinfo&titles=Main%20Page&rvprop=user|comment&continue=',
+ 'api.php?action=query&generator=allpages&gapprefix=API/&prop=revisions&continue=',
);
}
@@ -750,12 +741,4 @@ class ApiQuery extends ApiBase {
'https://www.mediawiki.org/wiki/API:Lists',
);
}
-
- public function getVersion() {
- $psModule = new ApiPageSet( $this );
- $vers = array();
- $vers[] = __CLASS__ . ': $Id$';
- $vers[] = $psModule->getVersion();
- return $vers;
- }
}
diff --git a/includes/api/ApiQueryAllCategories.php b/includes/api/ApiQueryAllCategories.php
index 4f4c77f0..496a0eb8 100644
--- a/includes/api/ApiQueryAllCategories.php
+++ b/includes/api/ApiQueryAllCategories.php
@@ -60,10 +60,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 1 ) {
- $this->dieUsage( "Invalid continue param. You should pass the " .
- "original value returned by the previous query", "_badcontinue" );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 1 );
$op = $params['dir'] == 'descending' ? '<' : '>';
$cont_from = $db->addQuotes( $cont[0] );
$this->addWhere( "cat_title $op= $cont_from" );
@@ -81,7 +78,6 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
} else {
$this->addWhereRange( 'cat_pages', 'older', $max, $min);
}
-
if ( isset( $params['prefix'] ) ) {
$this->addWhere( 'cat_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
@@ -225,12 +221,6 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
return 'Enumerate all categories';
}
- public function getPossibleErrors() {
- return array_merge( parent::getPossibleErrors(), array(
- array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
- ) );
- }
-
public function getExamples() {
return array(
'api.php?action=query&list=allcategories&acprop=size',
@@ -241,8 +231,4 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Allcategories';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryAllImages.php b/includes/api/ApiQueryAllImages.php
index b562da8e..e24b162c 100644
--- a/includes/api/ApiQueryAllImages.php
+++ b/includes/api/ApiQueryAllImages.php
@@ -41,8 +41,8 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
}
/**
- * Override parent method to make sure to make sure the repo's DB is used
- * which may not necesarilly be the same as the local DB.
+ * Override parent method to make sure the repo's DB is used
+ * which may not necessarily be the same as the local DB.
*
* TODO: allow querying non-local repos.
* @return DatabaseBase
@@ -93,7 +93,10 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
$prop = array_flip( $params['prop'] );
$this->addFields( LocalFile::selectFields() );
- $dir = ( in_array( $params['dir'], array( 'descending', 'older' ) ) ? 'older' : 'newer' );
+ $ascendingOrder = true;
+ if ( $params['dir'] == 'descending' || $params['dir'] == 'older' ) {
+ $ascendingOrder = false;
+ }
if ( $params['sort'] == 'name' ) {
// Check mutually exclusive params
@@ -110,19 +113,16 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
// Pagination
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 1 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the ' .
- 'original value returned by the previous query', '_badcontinue' );
- }
- $op = ( $dir == 'older' ? '<' : '>' );
- $cont_from = $db->addQuotes( $cont[0] );
- $this->addWhere( "img_name $op= $cont_from" );
+ $this->dieContinueUsageIf( count( $cont ) != 1 );
+ $op = ( $ascendingOrder ? '>' : '<' );
+ $continueFrom = $db->addQuotes( $cont[0] );
+ $this->addWhere( "img_name $op= $continueFrom" );
}
// Image filters
$from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
$to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
- $this->addWhereRange( 'img_name', $dir, $from, $to );
+ $this->addWhereRange( 'img_name', ( $ascendingOrder ? 'newer' : 'older' ), $from, $to );
if ( isset( $params['prefix'] ) ) {
$this->addWhere( 'img_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
@@ -135,13 +135,13 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
$this->dieUsage( "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=name", 'badparams' );
}
}
- if (!is_null( $params['user'] ) && $params['filterbots'] != 'all') {
+ if ( !is_null( $params['user'] ) && $params['filterbots'] != 'all' ) {
// Since filterbots checks if each user has the bot right, it doesn't make sense to use it with user
- $this->dieUsage( "Parameters 'user' and 'filterbots' cannot be used together", 'badparams' );
+ $this->dieUsage( "Parameters '{$prefix}user' and '{$prefix}filterbots' cannot be used together", 'badparams' );
}
// Pagination
- $this->addTimestampWhereRange( 'img_timestamp', $dir, $params['start'], $params['end'] );
+ $this->addTimestampWhereRange( 'img_timestamp', ( $ascendingOrder ? 'newer' : 'older' ), $params['start'], $params['end'] );
// Image filters
if ( !is_null( $params['user'] ) ) {
@@ -149,8 +149,6 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
}
if ( $params['filterbots'] != 'all' ) {
$this->addTables( 'user_groups' );
- $groupCond = ( $params['filterbots'] == 'nobots' ? 'NULL': 'NOT NULL' );
- $this->addWhere( "ug_group IS $groupCond" );
$this->addJoinConds( array( 'user_groups' => array(
'LEFT JOIN',
array(
@@ -158,6 +156,8 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
'ug_user = img_user'
)
) ) );
+ $groupCond = ( $params['filterbots'] == 'nobots' ? 'NULL': 'NOT NULL' );
+ $this->addWhere( "ug_group IS $groupCond" );
}
}
@@ -172,12 +172,13 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
$sha1 = false;
if ( isset( $params['sha1'] ) ) {
- if ( !$this->validateSha1Hash( $params['sha1'] ) ) {
+ $sha1 = strtolower( $params['sha1'] );
+ if ( !$this->validateSha1Hash( $sha1 ) ) {
$this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
}
- $sha1 = wfBaseConvert( $params['sha1'], 16, 36, 31 );
+ $sha1 = wfBaseConvert( $sha1, 16, 36, 31 );
} elseif ( isset( $params['sha1base36'] ) ) {
- $sha1 = $params['sha1base36'];
+ $sha1 = strtolower( $params['sha1base36'] );
if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
$this->dieUsage( 'The SHA1Base36 hash provided is not valid', 'invalidsha1base36hash' );
}
@@ -200,16 +201,19 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
$limit = $params['limit'];
$this->addOption( 'LIMIT', $limit + 1 );
- $sort = ( $dir == 'older' ? ' DESC' : '' );
+ $sortFlag = '';
+ if ( !$ascendingOrder ) {
+ $sortFlag = ' DESC';
+ }
if ( $params['sort'] == 'timestamp' ) {
- $this->addOption( 'ORDER BY', 'img_timestamp' . $sort );
- if ( $params['filterbots'] == 'all' ) {
- $this->addOption( 'USE INDEX', array( 'image' => 'img_timestamp' ) );
- } else {
+ $this->addOption( 'ORDER BY', 'img_timestamp' . $sortFlag );
+ if ( !is_null( $params['user'] ) ) {
$this->addOption( 'USE INDEX', array( 'image' => 'img_usertext_timestamp' ) );
+ } else {
+ $this->addOption( 'USE INDEX', array( 'image' => 'img_timestamp' ) );
}
} else {
- $this->addOption( 'ORDER BY', 'img_name' . $sort );
+ $this->addOption( 'ORDER BY', 'img_name' . $sortFlag );
}
$res = $this->select( __METHOD__ );
@@ -272,7 +276,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
'descending',
// sort=timestamp
'newer',
- 'older',
+ 'older'
)
),
'from' => null,
@@ -373,12 +377,11 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
array( 'code' => 'badparams', 'info' => "Parameter'{$p}from' can only be used with {$p}sort=name" ),
array( 'code' => 'badparams', 'info' => "Parameter'{$p}to' can only be used with {$p}sort=name" ),
array( 'code' => 'badparams', 'info' => "Parameter'{$p}prefix' can only be used with {$p}sort=name" ),
- array( 'code' => 'badparams', 'info' => "Parameters 'user' and 'filterbots' cannot be used together" ),
+ array( 'code' => 'badparams', 'info' => "Parameters '{$p}user' and '{$p}filterbots' cannot be used together" ),
array( 'code' => 'unsupportedrepo', 'info' => 'Local file repository does not support querying all images' ),
array( 'code' => 'mimesearchdisabled', 'info' => 'MIME search disabled in Miser Mode' ),
array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ),
array( 'code' => 'invalidsha1base36hash', 'info' => 'The SHA1Base36 hash provided is not valid' ),
- array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
) );
}
@@ -402,8 +405,4 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Allimages';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryAllLinks.php b/includes/api/ApiQueryAllLinks.php
index da4840f0..e355f8b0 100644
--- a/includes/api/ApiQueryAllLinks.php
+++ b/includes/api/ApiQueryAllLinks.php
@@ -32,7 +32,34 @@
class ApiQueryAllLinks extends ApiQueryGeneratorBase {
public function __construct( $query, $moduleName ) {
- parent::__construct( $query, $moduleName, 'al' );
+ switch ( $moduleName ) {
+ case 'alllinks':
+ $prefix = 'al';
+ $this->table = 'pagelinks';
+ $this->tablePrefix = 'pl_';
+ $this->dfltNamespace = NS_MAIN;
+ $this->indexTag = 'l';
+ $this->description = 'Enumerate all links that point to a given namespace';
+ $this->descriptionLink = 'link';
+ $this->descriptionLinked = 'linked';
+ $this->descriptionLinking = 'linking';
+ break;
+ case 'alltransclusions':
+ $prefix = 'at';
+ $this->table = 'templatelinks';
+ $this->tablePrefix = 'tl_';
+ $this->dfltNamespace = NS_TEMPLATE;
+ $this->indexTag = 't';
+ $this->description = 'List all transclusions (pages embedded using {{x}}), including non-existing';
+ $this->descriptionLink = 'transclusion';
+ $this->descriptionLinked = 'transcluded';
+ $this->descriptionLinking = 'transcluding';
+ break;
+ default:
+ ApiBase::dieDebug( __METHOD__, 'Unknown module name' );
+ }
+
+ parent::__construct( $query, $moduleName, $prefix );
}
public function execute() {
@@ -55,75 +82,71 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
$db = $this->getDB();
$params = $this->extractRequestParams();
+ $pfx = $this->tablePrefix;
$prop = array_flip( $params['prop'] );
$fld_ids = isset( $prop['ids'] );
$fld_title = isset( $prop['title'] );
if ( $params['unique'] ) {
- if ( !is_null( $resultPageSet ) ) {
- $this->dieUsage( $this->getModuleName() . ' cannot be used as a generator in unique links mode', 'params' );
- }
if ( $fld_ids ) {
- $this->dieUsage( $this->getModuleName() . ' cannot return corresponding page ids in unique links mode', 'params' );
+ $this->dieUsage(
+ "{$this->getModuleName()} cannot return corresponding page ids in unique {$this->descriptionLink}s mode",
+ 'params' );
}
$this->addOption( 'DISTINCT' );
}
- $this->addTables( 'pagelinks' );
- $this->addWhereFld( 'pl_namespace', $params['namespace'] );
+ $this->addTables( $this->table );
+ $this->addWhereFld( $pfx . 'namespace', $params['namespace'] );
- if ( !is_null( $params['from'] ) && !is_null( $params['continue'] ) ) {
- $this->dieUsage( 'alcontinue and alfrom cannot be used together', 'params' );
- }
- if ( !is_null( $params['continue'] ) ) {
+ $continue = !is_null( $params['continue'] );
+ if ( $continue ) {
$continueArr = explode( '|', $params['continue'] );
$op = $params['dir'] == 'descending' ? '<' : '>';
if ( $params['unique'] ) {
- if ( count( $continueArr ) != 1 ) {
- $this->dieUsage( 'Invalid continue parameter', 'badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $continueArr ) != 1 );
$continueTitle = $db->addQuotes( $continueArr[0] );
- $this->addWhere( "pl_title $op= $continueTitle" );
+ $this->addWhere( "{$pfx}title $op= $continueTitle" );
} else {
- if ( count( $continueArr ) != 2 ) {
- $this->dieUsage( 'Invalid continue parameter', 'badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $continueArr ) != 2 );
$continueTitle = $db->addQuotes( $continueArr[0] );
$continueFrom = intval( $continueArr[1] );
$this->addWhere(
- "pl_title $op $continueTitle OR " .
- "(pl_title = $continueTitle AND " .
- "pl_from $op= $continueFrom)"
+ "{$pfx}title $op $continueTitle OR " .
+ "({$pfx}title = $continueTitle AND " .
+ "{$pfx}from $op= $continueFrom)"
);
}
}
- $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
+ // 'continue' always overrides 'from'
+ $from = ( $continue || is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
$to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
- $this->addWhereRange( 'pl_title', 'newer', $from, $to );
+ $this->addWhereRange( $pfx . 'title', 'newer', $from, $to );
if ( isset( $params['prefix'] ) ) {
- $this->addWhere( 'pl_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+ $this->addWhere( $pfx . 'title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
}
- $this->addFields( 'pl_title' );
- $this->addFieldsIf( 'pl_from', !$params['unique'] );
+ $this->addFields( array( 'pl_title' => $pfx . 'title' ) );
+ $this->addFieldsIf( array( 'pl_from' => $pfx . 'from' ), !$params['unique'] );
- $this->addOption( 'USE INDEX', 'pl_namespace' );
+ $this->addOption( 'USE INDEX', $pfx . 'namespace' );
$limit = $params['limit'];
$this->addOption( 'LIMIT', $limit + 1 );
$sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
$orderBy = array();
- $orderBy[] = 'pl_title' . $sort;
+ $orderBy[] = $pfx . 'title' . $sort;
if ( !$params['unique'] ) {
- $orderBy[] = 'pl_from' . $sort;
+ $orderBy[] = $pfx . 'from' . $sort;
}
$this->addOption( 'ORDER BY', $orderBy );
$res = $this->select( __METHOD__ );
$pageids = array();
+ $titles = array();
$count = 0;
$result = $this->getResult();
foreach ( $res as $row ) {
@@ -132,7 +155,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
if ( $params['unique'] ) {
$this->setContinueEnumParameter( 'continue', $row->pl_title );
} else {
- $this->setContinueEnumParameter( 'continue', $row->pl_title . "|" . $row->pl_from );
+ $this->setContinueEnumParameter( 'continue', $row->pl_title . '|' . $row->pl_from );
}
break;
}
@@ -151,17 +174,21 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
if ( $params['unique'] ) {
$this->setContinueEnumParameter( 'continue', $row->pl_title );
} else {
- $this->setContinueEnumParameter( 'continue', $row->pl_title . "|" . $row->pl_from );
+ $this->setContinueEnumParameter( 'continue', $row->pl_title . '|' . $row->pl_from );
}
break;
}
+ } elseif ( $params['unique'] ) {
+ $titles[] = Title::makeTitle( $params['namespace'], $row->pl_title );
} else {
$pageids[] = $row->pl_from;
}
}
if ( is_null( $resultPageSet ) ) {
- $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'l' );
+ $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), $this->indexTag );
+ } elseif ( $params['unique'] ) {
+ $resultPageSet->populateFromTitles( $titles );
} else {
$resultPageSet->populateFromPageIDs( $pageids );
}
@@ -183,7 +210,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
)
),
'namespace' => array(
- ApiBase::PARAM_DFLT => 0,
+ ApiBase::PARAM_DFLT => $this->dfltNamespace,
ApiBase::PARAM_TYPE => 'namespace'
),
'limit' => array(
@@ -205,18 +232,23 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
public function getParamDescription() {
$p = $this->getModulePrefix();
+ $link = $this->descriptionLink;
+ $linking = $this->descriptionLinking;
return array(
- 'from' => 'The page title to start enumerating from',
- 'to' => 'The page title to stop enumerating at',
- 'prefix' => 'Search for all page titles that begin with this value',
- 'unique' => "Only show unique links. Cannot be used with generator or {$p}prop=ids",
+ 'from' => "The title of the $link to start enumerating from",
+ 'to' => "The title of the $link to stop enumerating at",
+ 'prefix' => "Search for all $link titles that begin with this value",
+ 'unique' => array(
+ "Only show distinct $link titles. Cannot be used with {$p}prop=ids.",
+ 'When used as a generator, yields target pages instead of source pages.',
+ ),
'prop' => array(
'What pieces of information to include',
- " ids - Adds pageid of where the link is from (Cannot be used with {$p}unique)",
- ' title - Adds the title of the link',
+ " ids - Adds the pageid of the $linking page (Cannot be used with {$p}unique)",
+ " title - Adds the title of the $link",
),
'namespace' => 'The namespace to enumerate',
- 'limit' => 'How many total links to return',
+ 'limit' => "How many total items to return",
'continue' => 'When more results are available, use this to continue',
'dir' => 'The direction in which to list',
);
@@ -235,30 +267,34 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
}
public function getDescription() {
- return 'Enumerate all links that point to a given namespace';
+ return $this->description;
}
public function getPossibleErrors() {
$m = $this->getModuleName();
+ $link = $this->descriptionLink;
return array_merge( parent::getPossibleErrors(), array(
- array( 'code' => 'params', 'info' => "{$m} cannot be used as a generator in unique links mode" ),
- array( 'code' => 'params', 'info' => "{$m} cannot return corresponding page ids in unique links mode" ),
- array( 'code' => 'params', 'info' => 'alcontinue and alfrom cannot be used together' ),
- array( 'code' => 'badcontinue', 'info' => 'Invalid continue parameter' ),
+ array( 'code' => 'params', 'info' => "{$m} cannot return corresponding page ids in unique {$link}s mode" ),
) );
}
public function getExamples() {
+ $p = $this->getModulePrefix();
+ $link = $this->descriptionLink;
+ $linked = $this->descriptionLinked;
return array(
- 'api.php?action=query&list=alllinks&alunique=&alfrom=B',
+ "api.php?action=query&list=all{$link}s&{$p}from=B&{$p}prop=ids|title"
+ => "List $linked titles with page ids they are from, including missing ones. Start at B",
+ "api.php?action=query&list=all{$link}s&{$p}unique=&{$p}from=B"
+ => "List unique $linked titles",
+ "api.php?action=query&generator=all{$link}s&g{$p}unique=&g{$p}from=B"
+ => "Gets all $link targets, marking the missing ones",
+ "api.php?action=query&generator=all{$link}s&g{$p}from=B"
+ => "Gets pages containing the {$link}s",
);
}
public function getHelpUrls() {
- return 'https://www.mediawiki.org/wiki/API:Alllinks';
- }
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
+ return "https://www.mediawiki.org/wiki/API:All{$this->descriptionLink}s";
}
}
diff --git a/includes/api/ApiQueryAllMessages.php b/includes/api/ApiQueryAllMessages.php
index f5e1146b..c9811b0d 100644
--- a/includes/api/ApiQueryAllMessages.php
+++ b/includes/api/ApiQueryAllMessages.php
@@ -39,8 +39,9 @@ class ApiQueryAllMessages extends ApiQueryBase {
$params = $this->extractRequestParams();
if ( is_null( $params['lang'] ) ) {
- global $wgLang;
- $langObj = $wgLang;
+ $langObj = $this->getLanguage();
+ } elseif ( !Language::isValidCode( $params['lang'] ) ) {
+ $this->dieUsage( 'Invalid language code for parameter lang', 'invalidlang' );
} else {
$langObj = Language::factory( $params['lang'] );
}
@@ -48,7 +49,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
if ( $params['enableparser'] ) {
if ( !is_null( $params['title'] ) ) {
$title = Title::newFromText( $params['title'] );
- if ( !$title ) {
+ if ( !$title || $title->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
} else {
@@ -116,7 +117,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
$lang = $langObj->getCode();
$customisedMessages = AllmessagesTablePager::getCustomisedStatuses(
- array_map( array( $langObj, 'ucfirst'), $messages_target ), $lang, $lang != $wgContLang->getCode() );
+ array_map( array( $langObj, 'ucfirst' ), $messages_target ), $lang, $lang != $wgContLang->getCode() );
$customised = $params['customised'] === 'modified';
}
@@ -143,7 +144,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
}
if ( $customiseFilterEnabled ) {
- $messageIsCustomised = isset( $customisedMessages['pages'][ $langObj->ucfirst( $message ) ] );
+ $messageIsCustomised = isset( $customisedMessages['pages'][$langObj->ucfirst( $message )] );
if ( $customised === $messageIsCustomised ) {
if ( $customised ) {
$a['customised'] = '';
@@ -256,6 +257,12 @@ class ApiQueryAllMessages extends ApiQueryBase {
);
}
+ public function getPossibleErrors() {
+ return array_merge( parent::getPossibleErrors(), array(
+ array( 'code' => 'invalidlang', 'info' => 'Invalid language code for parameter lang' ),
+ ) );
+ }
+
public function getResultProperties() {
return array(
'' => array(
@@ -291,8 +298,4 @@ class ApiQueryAllMessages extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Meta#allmessages_.2F_am';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryAllPages.php b/includes/api/ApiQueryAllPages.php
index 16cc31d2..d718b967 100644
--- a/includes/api/ApiQueryAllPages.php
+++ b/includes/api/ApiQueryAllPages.php
@@ -69,10 +69,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 1 ) {
- $this->dieUsage( "Invalid continue param. You should pass the " .
- "original value returned by the previous query", "_badcontinue" );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 1 );
$op = $params['dir'] == 'descending' ? '<' : '>';
$cont_from = $db->addQuotes( $cont[0] );
$this->addWhere( "page_title $op= $cont_from" );
@@ -120,7 +117,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
if ( count( $params['prtype'] ) || $params['prexpiry'] != 'all' ) {
$this->addTables( 'page_restrictions' );
$this->addWhere( 'page_id=pr_page' );
- $this->addWhere( 'pr_expiry>' . $db->addQuotes( $db->timestamp() ) );
+ $this->addWhere( "pr_expiry > {$db->addQuotes( $db->timestamp() )} OR pr_expiry IS NULL" );
if ( count( $params['prtype'] ) ) {
$this->addWhereFld( 'pr_type', $params['prtype'] );
@@ -138,8 +135,6 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
} elseif ( $params['prfiltercascade'] == 'noncascading' ) {
$this->addWhereFld( 'pr_cascade', 0 );
}
-
- $this->addOption( 'DISTINCT' );
}
$forceNameTitleIndex = false;
@@ -149,6 +144,8 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
$this->addWhere( "pr_expiry != {$db->addQuotes( $db->getInfinity() )}" );
}
+ $this->addOption( 'DISTINCT' );
+
} elseif ( isset( $params['prlevel'] ) ) {
$this->dieUsage( 'prlevel may not be used without prtype', 'params' );
}
@@ -226,7 +223,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
'to' => null,
'prefix' => null,
'namespace' => array(
- ApiBase::PARAM_DFLT => 0,
+ ApiBase::PARAM_DFLT => NS_MAIN,
ApiBase::PARAM_TYPE => 'namespace',
),
'filterredir' => array(
@@ -336,7 +333,6 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
return array_merge( parent::getPossibleErrors(), array(
array( 'code' => 'params', 'info' => 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator' ),
array( 'code' => 'params', 'info' => 'prlevel may not be used without prtype' ),
- array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
) );
}
@@ -351,7 +347,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
'Show info about 4 pages starting at the letter "T"',
),
'api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content' => array(
- 'Show content of first 2 non-redirect pages begining at "Re"',
+ 'Show content of first 2 non-redirect pages beginning at "Re"',
)
);
}
@@ -359,8 +355,4 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Allpages';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryAllUsers.php b/includes/api/ApiQueryAllUsers.php
index 7f50cbad..7283aa00 100644
--- a/includes/api/ApiQueryAllUsers.php
+++ b/includes/api/ApiQueryAllUsers.php
@@ -37,7 +37,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
/**
* This function converts the user name to a canonical form
* which is stored in the database.
- * @param String $name
+ * @param string $name
* @return String
*/
private function getCanonicalUserName( $name ) {
@@ -81,12 +81,18 @@ class ApiQueryAllUsers extends ApiQueryBase {
$db->buildLike( $this->getCanonicalUserName( $params['prefix'] ), $db->anyString() ) );
}
- if ( !is_null( $params['rights'] ) ) {
+ if ( !is_null( $params['rights'] ) && count( $params['rights'] ) ) {
$groups = array();
foreach( $params['rights'] as $r ) {
$groups = array_merge( $groups, User::getGroupsWithPermission( $r ) );
}
+ // no group with the given right(s) exists, no need for a query
+ if( !count( $groups ) ) {
+ $this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), '' );
+ return;
+ }
+
$groups = array_unique( $groups );
if ( is_null( $params['group'] ) ) {
@@ -155,7 +161,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
$this->addFields( array( 'recentedits' => 'COUNT(*)' ) );
$this->addWhere( 'rc_log_type IS NULL OR rc_log_type != ' . $db->addQuotes( 'newusers' ) );
- $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 );
+ $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays * 24 * 3600 );
$this->addWhere( 'rc_timestamp >= ' . $db->addQuotes( $timestamp ) );
$this->addOption( 'GROUP BY', $userFieldToSort );
@@ -273,7 +279,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
if ( $fld_rights ) {
if ( !isset( $lastUserData['rights'] ) ) {
if ( $lastUserObj ) {
- $lastUserData['rights'] = User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
+ $lastUserData['rights'] = User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
} else {
// This should not normally happen
$lastUserData['rights'] = array();
@@ -438,8 +444,4 @@ class ApiQueryAllUsers extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Allusers';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryBacklinks.php b/includes/api/ApiQueryBacklinks.php
index 06db87bf..3ef6b840 100644
--- a/includes/api/ApiQueryBacklinks.php
+++ b/includes/api/ApiQueryBacklinks.php
@@ -188,6 +188,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
$titleWhere = array();
$allRedirNs = array();
$allRedirDBkey = array();
+ /** @var $t Title */
foreach ( $this->redirTitles as $t ) {
$redirNs = $t->getNamespace();
$redirDBkey = $t->getDBkey();
@@ -201,6 +202,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
if ( !is_null( $this->redirID ) ) {
$op = $this->params['dir'] == 'descending' ? '<' : '>';
+ /** @var $first Title */
$first = $this->redirTitles[0];
$title = $db->addQuotes( $first->getDBkey() );
$ns = $first->getNamespace();
@@ -246,7 +248,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
$this->params = $this->extractRequestParams( false );
$this->redirect = isset( $this->params['redirect'] ) && $this->params['redirect'];
$userMax = ( $this->redirect ? ApiBase::LIMIT_BIG1 / 2 : ApiBase::LIMIT_BIG1 );
- $botMax = ( $this->redirect ? ApiBase::LIMIT_BIG2 / 2 : ApiBase::LIMIT_BIG2 );
+ $botMax = ( $this->redirect ? ApiBase::LIMIT_BIG2 / 2 : ApiBase::LIMIT_BIG2 );
$result = $this->getResult();
@@ -406,20 +408,14 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
// null stuff out now so we know what's set and what isn't
$this->rootTitle = $this->contID = $this->redirID = null;
$rootNs = intval( $continueList[0] );
- if ( $rootNs === 0 && $continueList[0] !== '0' ) {
- // Illegal continue parameter
- $this->dieUsage( 'Invalid continue param. You should pass the original value returned by the previous query', '_badcontinue' );
- }
+ $this->dieContinueUsageIf( $rootNs === 0 && $continueList[0] !== '0' );
+
$this->rootTitle = Title::makeTitleSafe( $rootNs, $continueList[1] );
+ $this->dieContinueUsageIf( !$this->rootTitle );
- if ( !$this->rootTitle ) {
- $this->dieUsage( 'Invalid continue param. You should pass the original value returned by the previous query', '_badcontinue' );
- }
$contID = intval( $continueList[2] );
+ $this->dieContinueUsageIf( $contID === 0 && $continueList[2] !== '0' );
- if ( $contID === 0 && $continueList[2] !== '0' ) {
- $this->dieUsage( 'Invalid continue param. You should pass the original value returned by the previous query', '_badcontinue' );
- }
$this->contID = $contID;
$id2 = isset( $continueList[3] ) ? $continueList[3] : null;
$redirID = intval( $id2 );
@@ -455,12 +451,12 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
ApiBase::PARAM_ISMULTI => true,
ApiBase::PARAM_TYPE => 'namespace'
),
- 'dir' => array(
- ApiBase::PARAM_DFLT => 'ascending',
- ApiBase::PARAM_TYPE => array(
- 'ascending',
- 'descending'
- )
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'ascending',
+ ApiBase::PARAM_TYPE => array(
+ 'ascending',
+ 'descending'
+ )
),
'filterredir' => array(
ApiBase::PARAM_DFLT => 'all',
@@ -535,7 +531,6 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
$this->getTitleOrPageIdErrorMessage(),
array(
array( 'code' => 'bad_image_title', 'info' => "The title for {$this->getModuleName()} query must be an image" ),
- array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
)
);
}
@@ -562,8 +557,4 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
public function getHelpUrls() {
return $this->helpUrl;
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryBase.php b/includes/api/ApiQueryBase.php
index 2c48aca0..7819ead4 100644
--- a/includes/api/ApiQueryBase.php
+++ b/includes/api/ApiQueryBase.php
@@ -112,7 +112,7 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Add a set of fields to select to the internal array
- * @param $value array|string Field name or array of field names
+ * @param array|string $value Field name or array of field names
*/
protected function addFields( $value ) {
if ( is_array( $value ) ) {
@@ -124,8 +124,8 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Same as addFields(), but add the fields only if a condition is met
- * @param $value array|string See addFields()
- * @param $condition bool If false, do nothing
+ * @param array|string $value See addFields()
+ * @param bool $condition If false, do nothing
* @return bool $condition
*/
protected function addFieldsIf( $value, $condition ) {
@@ -162,7 +162,7 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Same as addWhere(), but add the WHERE clauses only if a condition is met
* @param $value mixed See addWhere()
- * @param $condition bool If false, do nothing
+ * @param bool $condition If false, do nothing
* @return bool $condition
*/
protected function addWhereIf( $value, $condition ) {
@@ -175,8 +175,8 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Equivalent to addWhere(array($field => $value))
- * @param $field string Field name
- * @param $value string Value; ignored if null or empty array;
+ * @param string $field Field name
+ * @param string $value Value; ignored if null or empty array;
*/
protected function addWhereFld( $field, $value ) {
// Use count() to its full documented capabilities to simultaneously
@@ -189,14 +189,14 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Add a WHERE clause corresponding to a range, and an ORDER BY
* clause to sort in the right direction
- * @param $field string Field name
- * @param $dir string If 'newer', sort in ascending order, otherwise
+ * @param string $field Field name
+ * @param string $dir If 'newer', sort in ascending order, otherwise
* sort in descending order
- * @param $start string Value to start the list at. If $dir == 'newer'
+ * @param string $start Value to start the list at. If $dir == 'newer'
* this is the lower boundary, otherwise it's the upper boundary
- * @param $end string Value to end the list at. If $dir == 'newer' this
+ * @param string $end Value to end the list at. If $dir == 'newer' this
* is the upper boundary, otherwise it's the lower boundary
- * @param $sort bool If false, don't add an ORDER BY clause
+ * @param bool $sort If false, don't add an ORDER BY clause
*/
protected function addWhereRange( $field, $dir, $start, $end, $sort = true ) {
$isDirNewer = ( $dir === 'newer' );
@@ -240,8 +240,8 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Add an option such as LIMIT or USE INDEX. If an option was set
* before, the old value will be overwritten
- * @param $name string Option name
- * @param $value string Option value
+ * @param string $name Option name
+ * @param string $value Option value
*/
protected function addOption( $name, $value = null ) {
if ( is_null( $value ) ) {
@@ -253,9 +253,9 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Execute a SELECT query based on the values in the internal arrays
- * @param $method string Function the query should be attributed to.
+ * @param string $method Function the query should be attributed to.
* You should usually use __METHOD__ here
- * @param $extraQuery array Query data to add but not store in the object
+ * @param array $extraQuery Query data to add but not store in the object
* Format is array( 'tables' => ..., 'fields' => ..., 'where' => ..., 'options' => ..., 'join_conds' => ... )
* @return ResultWrapper
*/
@@ -298,9 +298,9 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Add information (title and namespace) about a Title object to a
* result array
- * @param $arr array Result array à la ApiResult
+ * @param array $arr Result array à la ApiResult
* @param $title Title
- * @param $prefix string Module prefix
+ * @param string $prefix Module prefix
*/
public static function addTitleInfo( &$arr, $title, $prefix = '' ) {
$arr[$prefix . 'ns'] = intval( $title->getNamespace() );
@@ -325,8 +325,8 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Add a sub-element under the page element with the given page ID
- * @param $pageId int Page ID
- * @param $data array Data array à la ApiResult
+ * @param int $pageId Page ID
+ * @param array $data Data array à la ApiResult
* @return bool Whether the element fit in the result
*/
protected function addPageSubItems( $pageId, $data ) {
@@ -339,9 +339,9 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Same as addPageSubItems(), but one element of $data at a time
- * @param $pageId int Page ID
- * @param $item array Data array à la ApiResult
- * @param $elemname string XML element name. If null, getModuleName()
+ * @param int $pageId Page ID
+ * @param array $item Data array à la ApiResult
+ * @param string $elemname XML element name. If null, getModuleName()
* is used
* @return bool Whether the element fit in the result
*/
@@ -351,7 +351,7 @@ abstract class ApiQueryBase extends ApiBase {
}
$result = $this->getResult();
$fit = $result->addValue( array( 'query', 'pages', $pageId,
- $this->getModuleName() ), null, $item );
+ $this->getModuleName() ), null, $item );
if ( !$fit ) {
return false;
}
@@ -362,15 +362,15 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Set a query-continue value
- * @param $paramName string Parameter name
- * @param $paramValue string Parameter value
+ * @param string $paramName Parameter name
+ * @param string $paramValue Parameter value
*/
protected function setContinueEnumParameter( $paramName, $paramValue ) {
$paramName = $this->encodeParamName( $paramName );
$msg = array( $paramName => $paramValue );
$result = $this->getResult();
$result->disableSizeCheck();
- $result->addValue( 'query-continue', $this->getModuleName(), $msg );
+ $result->addValue( 'query-continue', $this->getModuleName(), $msg, ApiResult::ADD_ON_TOP );
$result->enableSizeCheck();
}
@@ -380,8 +380,7 @@ abstract class ApiQueryBase extends ApiBase {
*/
protected function getDB() {
if ( is_null( $this->mDb ) ) {
- $apiQuery = $this->getQuery();
- $this->mDb = $apiQuery->getDB();
+ $this->mDb = $this->getQuery()->getDB();
}
return $this->mDb;
}
@@ -389,9 +388,9 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Selects the query database connection with the given name.
* See ApiQuery::getNamedDB() for more information
- * @param $name string Name to assign to the database connection
- * @param $db int One of the DB_* constants
- * @param $groups array Query groups
+ * @param string $name Name to assign to the database connection
+ * @param int $db One of the DB_* constants
+ * @param array $groups Query groups
* @return DatabaseBase
*/
public function selectNamedDB( $name, $db, $groups ) {
@@ -408,7 +407,7 @@ abstract class ApiQueryBase extends ApiBase {
/**
* Convert a title to a DB key
- * @param $title string Page title with spaces
+ * @param string $title Page title with spaces
* @return string Page title with underscores
*/
public function titleToKey( $title ) {
@@ -420,12 +419,12 @@ abstract class ApiQueryBase extends ApiBase {
if ( !$t ) {
$this->dieUsageMsg( array( 'invalidtitle', $title ) );
}
- return $t->getPrefixedDbKey();
+ return $t->getPrefixedDBkey();
}
/**
* The inverse of titleToKey()
- * @param $key string Page title with underscores
+ * @param string $key Page title with underscores
* @return string Page title with spaces
*/
public function keyToTitle( $key ) {
@@ -443,7 +442,7 @@ abstract class ApiQueryBase extends ApiBase {
/**
* An alternative to titleToKey() that doesn't trim trailing spaces
- * @param $titlePart string Title part with spaces
+ * @param string $titlePart Title part with spaces
* @return string Title part with underscores
*/
public function titlePartToKey( $titlePart ) {
@@ -452,7 +451,7 @@ abstract class ApiQueryBase extends ApiBase {
/**
* An alternative to keyToTitle() that doesn't trim trailing spaces
- * @param $keyPart string Key part with spaces
+ * @param string $keyPart Key part with spaces
* @return string Key part with underscores
*/
public function keyPartToTitle( $keyPart ) {
@@ -534,7 +533,7 @@ abstract class ApiQueryBase extends ApiBase {
* @return bool
*/
public function validateSha1Hash( $hash ) {
- return preg_match( '/[a-fA-F0-9]{40}/', $hash );
+ return preg_match( '/^[a-f0-9]{40}$/', $hash );
}
/**
@@ -542,25 +541,19 @@ abstract class ApiQueryBase extends ApiBase {
* @return bool
*/
public function validateSha1Base36Hash( $hash ) {
- return preg_match( '/[a-zA-Z0-9]{31}/', $hash );
+ return preg_match( '/^[a-z0-9]{31}$/', $hash );
}
/**
* @return array
*/
public function getPossibleErrors() {
- return array_merge( parent::getPossibleErrors(), array(
+ $errors = parent::getPossibleErrors();
+ $errors = array_merge( $errors, array(
array( 'invalidtitle', 'title' ),
array( 'invalidtitle', 'key' ),
) );
- }
-
- /**
- * Get version string for use in the API help output
- * @return string
- */
- public static function getBaseVersion() {
- return __CLASS__ . ': $Id$';
+ return $errors;
}
}
@@ -569,33 +562,41 @@ abstract class ApiQueryBase extends ApiBase {
*/
abstract class ApiQueryGeneratorBase extends ApiQueryBase {
- private $mIsGenerator;
+ private $mGeneratorPageSet = null;
/**
- * @param $query ApiBase
- * @param $moduleName string
- * @param $paramPrefix string
+ * Switch this module to generator mode. By default, generator mode is
+ * switched off and the module acts like a normal query module.
+ * @since 1.21 requires pageset parameter
+ * @param $generatorPageSet ApiPageSet object that the module will get
+ * by calling getPageSet() when in generator mode.
*/
- public function __construct( $query, $moduleName, $paramPrefix = '' ) {
- parent::__construct( $query, $moduleName, $paramPrefix );
- $this->mIsGenerator = false;
+ public function setGeneratorMode( ApiPageSet $generatorPageSet ) {
+ if ( $generatorPageSet === null ) {
+ ApiBase::dieDebug( __METHOD__, 'Required parameter missing - $generatorPageSet' );
+ }
+ $this->mGeneratorPageSet = $generatorPageSet;
}
/**
- * Switch this module to generator mode. By default, generator mode is
- * switched off and the module acts like a normal query module.
+ * Get the PageSet object to work on.
+ * If this module is generator, the pageSet object is different from other module's
+ * @return ApiPageSet
*/
- public function setGeneratorMode() {
- $this->mIsGenerator = true;
+ protected function getPageSet() {
+ if ( $this->mGeneratorPageSet !== null ) {
+ return $this->mGeneratorPageSet;
+ }
+ return parent::getPageSet();
}
/**
* Overrides base class to prepend 'g' to every generator parameter
- * @param $paramName string Parameter name
+ * @param string $paramName Parameter name
* @return string Prefixed parameter name
*/
public function encodeParamName( $paramName ) {
- if ( $this->mIsGenerator ) {
+ if ( $this->mGeneratorPageSet !== null ) {
return 'g' . parent::encodeParamName( $paramName );
} else {
return parent::encodeParamName( $paramName );
@@ -603,9 +604,24 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
}
/**
+ * Overrides base in case of generator & smart continue to
+ * notify ApiQueryMain instead of adding them to the result right away.
+ * @param string $paramName Parameter name
+ * @param string $paramValue Parameter value
+ */
+ protected function setContinueEnumParameter( $paramName, $paramValue ) {
+ // If this is a generator and query->setGeneratorContinue() returns false, treat as before
+ if ( $this->mGeneratorPageSet === null
+ || !$this->getQuery()->setGeneratorContinue( $this, $paramName, $paramValue )
+ ) {
+ parent::setContinueEnumParameter( $paramName, $paramValue );
+ }
+ }
+
+ /**
* Execute this module as a generator
* @param $resultPageSet ApiPageSet: All output should be appended to
* this object
*/
- public abstract function executeGenerator( $resultPageSet );
+ abstract public function executeGenerator( $resultPageSet );
}
diff --git a/includes/api/ApiQueryBlocks.php b/includes/api/ApiQueryBlocks.php
index 96b86962..d9be9f28 100644
--- a/includes/api/ApiQueryBlocks.php
+++ b/includes/api/ApiQueryBlocks.php
@@ -132,10 +132,10 @@ class ApiQueryBlocks extends ApiQueryBase {
$this->addWhereIf( 'ipb_user != 0', isset( $show['account'] ) );
$this->addWhereIf( 'ipb_user != 0 OR ipb_range_end > ipb_range_start', isset( $show['!ip'] ) );
$this->addWhereIf( 'ipb_user = 0 AND ipb_range_end = ipb_range_start', isset( $show['ip'] ) );
- $this->addWhereIf( 'ipb_expiry = '.$db->addQuotes($db->getInfinity()), isset( $show['!temp'] ) );
- $this->addWhereIf( 'ipb_expiry != '.$db->addQuotes($db->getInfinity()), isset( $show['temp'] ) );
- $this->addWhereIf( "ipb_range_end = ipb_range_start", isset( $show['!range'] ) );
- $this->addWhereIf( "ipb_range_end > ipb_range_start", isset( $show['range'] ) );
+ $this->addWhereIf( 'ipb_expiry = ' . $db->addQuotes( $db->getInfinity() ), isset( $show['!temp'] ) );
+ $this->addWhereIf( 'ipb_expiry != ' . $db->addQuotes( $db->getInfinity() ), isset( $show['temp'] ) );
+ $this->addWhereIf( 'ipb_range_end = ipb_range_start', isset( $show['!range'] ) );
+ $this->addWhereIf( 'ipb_range_end > ipb_range_start', isset( $show['range'] ) );
}
if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
@@ -182,8 +182,8 @@ class ApiQueryBlocks extends ApiQueryBase {
$block['reason'] = $row->ipb_reason;
}
if ( $fld_range && !$row->ipb_auto ) {
- $block['rangestart'] = IP::hexToQuad( $row->ipb_range_start );
- $block['rangeend'] = IP::hexToQuad( $row->ipb_range_end );
+ $block['rangestart'] = IP::formatHex( $row->ipb_range_start );
+ $block['rangeend'] = IP::formatHex( $row->ipb_range_end );
}
if ( $fld_flags ) {
// For clarity, these flags use the same names as their action=block counterparts
@@ -301,7 +301,7 @@ class ApiQueryBlocks extends ApiQueryBase {
'dir' => $this->getDirectionDescription( $p ),
'ids' => 'List of block IDs to list (optional)',
'users' => 'List of users to search for (optional)',
- 'ip' => array( 'Get all blocks applying to this IP or CIDR range, including range blocks.',
+ 'ip' => array( 'Get all blocks applying to this IP or CIDR range, including range blocks.',
'Cannot be used together with bkusers. CIDR ranges broader than /16 are not accepted' ),
'limit' => 'The maximum amount of blocks to list',
'prop' => array(
@@ -404,8 +404,4 @@ class ApiQueryBlocks extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Blocks';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryCategories.php b/includes/api/ApiQueryCategories.php
index 309c2ce9..69a64415 100644
--- a/includes/api/ApiQueryCategories.php
+++ b/includes/api/ApiQueryCategories.php
@@ -53,7 +53,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
*/
private function run( $resultPageSet = null ) {
if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
- return; // nothing to do
+ return; // nothing to do
}
$params = $this->extractRequestParams();
@@ -85,10 +85,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 ) {
- $this->dieUsage( "Invalid continue param. You should pass the " .
- "original value returned by the previous query", "_badcontinue" );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 2 );
$op = $params['dir'] == 'descending' ? '<' : '>';
$clfrom = intval( $cont[0] );
$clto = $this->getDB()->addQuotes( $cont[1] );
@@ -276,8 +273,4 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Properties#categories_.2F_cl';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryCategoryInfo.php b/includes/api/ApiQueryCategoryInfo.php
index 31517fab..a889272e 100644
--- a/includes/api/ApiQueryCategoryInfo.php
+++ b/includes/api/ApiQueryCategoryInfo.php
@@ -48,6 +48,7 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
$this->getPageSet()->getMissingTitles();
$cattitles = array();
foreach ( $categories as $c ) {
+ /** @var $t Title */
$t = $titles[$c];
$cattitles[$c] = $t->getDBkey();
}
@@ -146,8 +147,4 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Properties#categoryinfo_.2F_ci';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryCategoryMembers.php b/includes/api/ApiQueryCategoryMembers.php
index 55ce0234..9dbd8593 100644
--- a/includes/api/ApiQueryCategoryMembers.php
+++ b/includes/api/ApiQueryCategoryMembers.php
@@ -78,7 +78,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
$this->addFieldsIf( 'cl_timestamp', $fld_timestamp || $params['sort'] == 'timestamp' );
- $this->addTables( array( 'page', 'categorylinks' ) ); // must be in this order for 'USE INDEX'
+ $this->addTables( array( 'page', 'categorylinks' ) ); // must be in this order for 'USE INDEX'
$this->addWhereFld( 'cl_to', $categoryTitle->getDBkey() );
$queryTypes = $params['type'];
@@ -106,11 +106,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
} else {
if ( $params['continue'] ) {
$cont = explode( '|', $params['continue'], 3 );
- if ( count( $cont ) != 3 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the original value returned '.
- 'by the previous query', '_badcontinue'
- );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 3 );
// Remove the types to skip from $queryTypes
$contTypeIndex = array_search( $cont[0], $queryTypes );
@@ -118,7 +114,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
// Add a WHERE clause for sortkey and from
// pack( "H*", $foo ) is used to convert hex back to binary
- $escSortkey = $this->getDB()->addQuotes( pack( "H*", $cont[1] ) );
+ $escSortkey = $this->getDB()->addQuotes( pack( 'H*', $cont[1] ) );
$from = intval( $cont[2] );
$op = $dir == 'newer' ? '>' : '<';
// $contWhere is used further down
@@ -247,7 +243,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
if ( is_null( $resultPageSet ) ) {
$result->setIndexedTagName_internal(
- array( 'query', $this->getModuleName() ), 'cm' );
+ array( 'query', $this->getModuleName() ), 'cm' );
}
}
@@ -403,7 +399,6 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
$this->getTitleOrPageIdErrorMessage(),
array(
array( 'code' => 'invalidcategory', 'info' => 'The category name you entered is not valid' ),
- array( 'code' => 'badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
)
);
}
@@ -418,8 +413,4 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Categorymembers';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryDeletedrevs.php b/includes/api/ApiQueryDeletedrevs.php
index e69ccbd6..31ca1ef5 100644
--- a/includes/api/ApiQueryDeletedrevs.php
+++ b/includes/api/ApiQueryDeletedrevs.php
@@ -74,15 +74,15 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
if ( $mode == 'revs' || $mode == 'user' ) {
// Ignore namespace and unique due to inability to know whether they were purposely set
- foreach( array( 'from', 'to', 'prefix', /*'namespace',*/ 'continue', /*'unique'*/ ) as $p ) {
+ foreach( array( 'from', 'to', 'prefix', /*'namespace', 'unique'*/ ) as $p ) {
if ( !is_null( $params[$p] ) ) {
- $this->dieUsage( "The '{$p}' parameter cannot be used in modes 1 or 2", 'badparams');
+ $this->dieUsage( "The '{$p}' parameter cannot be used in modes 1 or 2", 'badparams' );
}
}
} else {
foreach( array( 'start', 'end' ) as $p ) {
if ( !is_null( $params[$p] ) ) {
- $this->dieUsage( "The {$p} parameter cannot be used in mode 3", 'badparams');
+ $this->dieUsage( "The {$p} parameter cannot be used in mode 3", 'badparams' );
}
}
}
@@ -116,7 +116,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
}
// Check limits
$userMax = $fld_content ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1;
- $botMax = $fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2;
+ $botMax = $fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2;
$limit = $params['limit'];
@@ -160,10 +160,9 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
if ( !is_null( $params['continue'] ) && ( $mode == 'all' || $mode == 'revs' ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 3 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the original value returned by the previous query', 'badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 3 );
$ns = intval( $cont[0] );
+ $this->dieContinueUsageIf( strval( $ns ) !== $cont[0] );
$title = $db->addQuotes( $cont[1] );
$ts = $db->addQuotes( $db->timestamp( $cont[2] ) );
$op = ( $dir == 'newer' ? '>' : '<' );
@@ -307,7 +306,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
),
'namespace' => array(
ApiBase::PARAM_TYPE => 'namespace',
- ApiBase::PARAM_DFLT => 0,
+ ApiBase::PARAM_DFLT => NS_MAIN,
),
'limit' => array(
ApiBase::PARAM_DFLT => 10,
@@ -362,7 +361,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
'namespace' => 'Only list pages in this namespace (3)',
'user' => 'Only list revisions by this user',
'excludeuser' => 'Don\'t list revisions by this user',
- 'continue' => 'When more results are available, use this to continue (3)',
+ 'continue' => 'When more results are available, use this to continue (1, 3)',
'unique' => 'List only one revision for each page (3)',
);
}
@@ -397,11 +396,9 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted revision information' ),
array( 'code' => 'badparams', 'info' => 'user and excludeuser cannot be used together' ),
array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted revision content' ),
- array( 'code' => 'badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
array( 'code' => 'badparams', 'info' => "The 'from' parameter cannot be used in modes 1 or 2" ),
array( 'code' => 'badparams', 'info' => "The 'to' parameter cannot be used in modes 1 or 2" ),
array( 'code' => 'badparams', 'info' => "The 'prefix' parameter cannot be used in modes 1 or 2" ),
- array( 'code' => 'badparams', 'info' => "The 'continue' parameter cannot be used in modes 1 or 2" ),
array( 'code' => 'badparams', 'info' => "The 'start' parameter cannot be used in mode 3" ),
array( 'code' => 'badparams', 'info' => "The 'end' parameter cannot be used in mode 3" ),
) );
@@ -423,8 +420,4 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Deletedrevs';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryDisabled.php b/includes/api/ApiQueryDisabled.php
index 6715969a..cf0d841e 100644
--- a/includes/api/ApiQueryDisabled.php
+++ b/includes/api/ApiQueryDisabled.php
@@ -36,10 +36,6 @@
*/
class ApiQueryDisabled extends ApiQueryBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
$this->setWarning( "The \"{$this->getModuleName()}\" module has been disabled." );
}
@@ -61,8 +57,4 @@ class ApiQueryDisabled extends ApiQueryBase {
public function getExamples() {
return array();
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryDuplicateFiles.php b/includes/api/ApiQueryDuplicateFiles.php
index 8f0fd3be..18dcba85 100644
--- a/includes/api/ApiQueryDuplicateFiles.php
+++ b/includes/api/ApiQueryDuplicateFiles.php
@@ -66,10 +66,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
$skipUntilThisDup = false;
if ( isset( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the ' .
- 'original value returned by the previous query', '_badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 2 );
$fromImage = $cont[0];
$skipUntilThisDup = $cont[1];
// Filter out any images before $fromImage
@@ -95,6 +92,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
$sha1s = array();
foreach ( $files as $file ) {
+ /** @var $file File */
$sha1s[$file->getName()] = $file->getSha1();
}
@@ -116,6 +114,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
if( $params['dir'] == 'descending' ) {
$dupFiles = array_reverse( $dupFiles );
}
+ /** @var $dupFile File */
foreach ( $dupFiles as $dupFile ) {
$dupName = $dupFile->getName();
if( $image == $dupName && $dupFile->isLocal() ) {
@@ -133,7 +132,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
break;
}
if ( !is_null( $resultPageSet ) ) {
- $titles[] = $file->getTitle();
+ $titles[] = $dupFile->getTitle();
} else {
$r = array(
'name' => $dupName,
@@ -204,12 +203,6 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
return 'List all files that are duplicates of the given file(s) based on hash values';
}
- public function getPossibleErrors() {
- return array_merge( parent::getPossibleErrors(), array(
- array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
- ) );
- }
-
public function getExamples() {
return array(
'api.php?action=query&titles=File:Albert_Einstein_Head.jpg&prop=duplicatefiles',
@@ -220,8 +213,4 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Properties#duplicatefiles_.2F_df';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryExtLinksUsage.php b/includes/api/ApiQueryExtLinksUsage.php
index 42b398ba..eb9cdf9e 100644
--- a/includes/api/ApiQueryExtLinksUsage.php
+++ b/includes/api/ApiQueryExtLinksUsage.php
@@ -55,7 +55,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
$query = $params['query'];
$protocol = self::getProtocolPrefix( $params['protocol'] );
- $this->addTables( array( 'page', 'externallinks' ) ); // must be in this order for 'USE INDEX'
+ $this->addTables( array( 'page', 'externallinks' ) ); // must be in this order for 'USE INDEX'
$this->addOption( 'USE INDEX', 'el_index' );
$this->addWhere( 'page_id=el_from' );
@@ -121,8 +121,12 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
ApiQueryBase::addTitleInfo( $vals, $title );
}
if ( $fld_url ) {
- // We *could* run this through wfExpandUrl() but I think it's better to output the link verbatim, even if it's protocol-relative --Roan
- $vals['url'] = $row->el_to;
+ $to = $row->el_to;
+ // expand protocol-relative urls
+ if( $params['expandurl'] ) {
+ $to = wfExpandUrl( $to, PROTO_CANONICAL );
+ }
+ $vals['url'] = $to;
}
$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
if ( !$fit ) {
@@ -169,7 +173,8 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
ApiBase::PARAM_MIN => 1,
ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
- )
+ ),
+ 'expandurl' => false,
);
}
@@ -218,7 +223,8 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
),
'query' => 'Search string without protocol. See [[Special:LinkSearch]]. Leave empty to list all external links',
'namespace' => 'The page namespace(s) to enumerate.',
- 'limit' => 'How many pages to return.'
+ 'limit' => 'How many pages to return.',
+ 'expandurl' => 'Expand protocol-relative urls with the canonical protocol',
);
if ( $wgMiserMode ) {
@@ -266,8 +272,4 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Exturlusage';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryExternalLinks.php b/includes/api/ApiQueryExternalLinks.php
index 9365a9b8..761b49ea 100644
--- a/includes/api/ApiQueryExternalLinks.php
+++ b/includes/api/ApiQueryExternalLinks.php
@@ -86,8 +86,12 @@ class ApiQueryExternalLinks extends ApiQueryBase {
break;
}
$entry = array();
- // We *could* run this through wfExpandUrl() but I think it's better to output the link verbatim, even if it's protocol-relative --Roan
- ApiResult::setContent( $entry, $row->el_to );
+ $to = $row->el_to;
+ // expand protocol-relative urls
+ if( $params['expandurl'] ) {
+ $to = wfExpandUrl( $to, PROTO_CANONICAL );
+ }
+ ApiResult::setContent( $entry, $to );
$fit = $this->addPageSubItem( $row->el_from, $entry );
if ( !$fit ) {
$this->setContinueEnumParameter( 'offset', $offset + $count - 1 );
@@ -117,6 +121,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
ApiBase::PARAM_DFLT => '',
),
'query' => null,
+ 'expandurl' => false,
);
}
@@ -130,6 +135,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
"Leave both this and {$p}query empty to list all external links"
),
'query' => 'Search string without protocol. Useful for checking whether a certain page contains a certain external url',
+ 'expandurl' => 'Expand protocol-relative urls with the canonical protocol',
);
}
@@ -142,7 +148,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
}
public function getDescription() {
- return 'Returns all external urls (not interwikies) from the given page(s)';
+ return 'Returns all external urls (not interwikis) from the given page(s)';
}
public function getPossibleErrors() {
@@ -160,8 +166,4 @@ class ApiQueryExternalLinks extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Properties#extlinks_.2F_el';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryFilearchive.php b/includes/api/ApiQueryFilearchive.php
index a5486ef4..021074a9 100644
--- a/includes/api/ApiQueryFilearchive.php
+++ b/includes/api/ApiQueryFilearchive.php
@@ -64,7 +64,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
$this->addTables( 'filearchive' );
$this->addFields( array( 'fa_name', 'fa_deleted' ) );
- $this->addFieldsIf( 'fa_storage_key', $fld_sha1 );
+ $this->addFieldsIf( 'fa_sha1', $fld_sha1 );
$this->addFieldsIf( 'fa_timestamp', $fld_timestamp );
$this->addFieldsIf( array( 'fa_user', 'fa_user_text' ), $fld_user );
$this->addFieldsIf( array( 'fa_height', 'fa_width', 'fa_size' ), $fld_dimensions || $fld_size );
@@ -77,10 +77,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 1 ) {
- $this->dieUsage( "Invalid continue param. You should pass the " .
- "original value returned by the previous query", "_badcontinue" );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 1 );
$op = $params['dir'] == 'descending' ? '<' : '>';
$cont_from = $db->addQuotes( $cont[0] );
$this->addWhere( "fa_name $op= $cont_from" );
@@ -101,25 +98,21 @@ class ApiQueryFilearchive extends ApiQueryBase {
$sha1Set = isset( $params['sha1'] );
$sha1base36Set = isset( $params['sha1base36'] );
if ( $sha1Set || $sha1base36Set ) {
- global $wgMiserMode;
- if ( $wgMiserMode ) {
- $this->dieUsage( 'Search by hash disabled in Miser Mode', 'hashsearchdisabled' );
- }
-
$sha1 = false;
if ( $sha1Set ) {
- if ( !$this->validateSha1Hash( $params['sha1'] ) ) {
+ $sha1 = strtolower( $params['sha1'] );
+ if ( !$this->validateSha1Hash( $sha1 ) ) {
$this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
}
- $sha1 = wfBaseConvert( $params['sha1'], 16, 36, 31 );
+ $sha1 = wfBaseConvert( $sha1, 16, 36, 31 );
} elseif ( $sha1base36Set ) {
- if ( !$this->validateSha1Base36Hash( $params['sha1base36'] ) ) {
+ $sha1 = strtolower( $params['sha1base36'] );
+ if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
$this->dieUsage( 'The SHA1Base36 hash provided is not valid', 'invalidsha1base36hash' );
}
- $sha1 = $params['sha1base36'];
}
if ( $sha1 ) {
- $this->addWhere( 'fa_storage_key ' . $db->buildLike( "{$sha1}.", $db->anyString() ) );
+ $this->addWhereFld( 'fa_sha1', $sha1 );
}
}
@@ -155,7 +148,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
self::addTitleInfo( $file, $title );
if ( $fld_sha1 ) {
- $file['sha1'] = wfBaseConvert( LocalRepo::getHashFromKey( $row->fa_storage_key ), 36, 16, 40 );
+ $file['sha1'] = wfBaseConvert( $row->fa_sha1, 36, 16, 40 );
}
if ( $fld_timestamp ) {
$file['timestamp'] = wfTimestamp( TS_ISO_8601, $row->fa_timestamp );
@@ -214,7 +207,6 @@ class ApiQueryFilearchive extends ApiQueryBase {
$file['suppressed'] = '';
}
-
$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $file );
if ( !$fit ) {
$this->setContinueEnumParameter( 'continue', $row->fa_name );
@@ -276,8 +268,8 @@ class ApiQueryFilearchive extends ApiQueryBase {
'prefix' => 'Search for all image titles that begin with this value',
'dir' => 'The direction in which to list',
'limit' => 'How many images to return in total',
- 'sha1' => "SHA1 hash of image. Overrides {$this->getModulePrefix()}sha1base36. Disabled in Miser Mode",
- 'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki). Disabled in Miser Mode',
+ 'sha1' => "SHA1 hash of image. Overrides {$this->getModulePrefix()}sha1base36",
+ 'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)',
'prop' => array(
'What image information to get:',
' sha1 - Adds SHA-1 hash for the image',
@@ -370,7 +362,6 @@ class ApiQueryFilearchive extends ApiQueryBase {
array( 'code' => 'hashsearchdisabled', 'info' => 'Search by hash disabled in Miser Mode' ),
array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ),
array( 'code' => 'invalidsha1base36hash', 'info' => 'The SHA1Base36 hash provided is not valid' ),
- array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
) );
}
@@ -382,8 +373,4 @@ class ApiQueryFilearchive extends ApiQueryBase {
),
);
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryIWBacklinks.php b/includes/api/ApiQueryIWBacklinks.php
index c5012f08..b47d31f2 100644
--- a/includes/api/ApiQueryIWBacklinks.php
+++ b/includes/api/ApiQueryIWBacklinks.php
@@ -56,10 +56,7 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 3 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the ' .
- 'original value returned by the previous query', '_badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 3 );
$db = $this->getDB();
$op = $params['dir'] == 'descending' ? '<' : '>';
@@ -233,7 +230,6 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'missingparam', 'prefix' ),
- array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
) );
}
@@ -243,8 +239,4 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
'api.php?action=query&generator=iwbacklinks&giwbltitle=Test&giwblprefix=wikibooks&prop=info'
);
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryIWLinks.php b/includes/api/ApiQueryIWLinks.php
index 30c7f5a8..fc77b4e6 100644
--- a/includes/api/ApiQueryIWLinks.php
+++ b/includes/api/ApiQueryIWLinks.php
@@ -58,10 +58,7 @@ class ApiQueryIWLinks extends ApiQueryBase {
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 3 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the ' .
- 'original value returned by the previous query', '_badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 3 );
$op = $params['dir'] == 'descending' ? '<' : '>';
$db = $this->getDB();
$iwlfrom = intval( $cont[0] );
@@ -187,7 +184,6 @@ class ApiQueryIWLinks extends ApiQueryBase {
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'missingparam', 'prefix' ),
- array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
) );
}
@@ -196,8 +192,4 @@ class ApiQueryIWLinks extends ApiQueryBase {
'api.php?action=query&prop=iwlinks&titles=Main%20Page' => 'Get interwiki links from the [[Main Page]]',
);
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryImageInfo.php b/includes/api/ApiQueryImageInfo.php
index d822eed5..95c2745a 100644
--- a/includes/api/ApiQueryImageInfo.php
+++ b/includes/api/ApiQueryImageInfo.php
@@ -30,6 +30,8 @@
* @ingroup API
*/
class ApiQueryImageInfo extends ApiQueryBase {
+ const TRANSFORM_LIMIT = 50;
+ private static $transformCount = 0;
public function __construct( $query, $moduleName, $prefix = 'ii' ) {
// We allow a subclass to override the prefix, to create a related API module.
@@ -52,14 +54,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
$titles = array_keys( $pageIds[NS_FILE] );
asort( $titles ); // Ensure the order is always the same
- $skip = false;
+ $fromTitle = null;
if ( !is_null( $params['continue'] ) ) {
- $skip = true;
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the original ' .
- 'value returned by the previous query', '_badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 2 );
$fromTitle = strval( $cont[0] );
$fromTimestamp = $cont[1];
// Filter out any titles before $fromTitle
@@ -79,14 +77,34 @@ class ApiQueryImageInfo extends ApiQueryBase {
} else {
$images = RepoGroup::singleton()->findFiles( $titles );
}
- foreach ( $images as $img ) {
- // Skip redirects
- if ( $img->getOriginalTitle()->isRedirect() ) {
+ foreach ( $titles as $title ) {
+ $pageId = $pageIds[NS_FILE][$title];
+ $start = $title === $fromTitle ? $fromTimestamp : $params['start'];
+
+ if ( !isset( $images[$title] ) ) {
+ $result->addValue(
+ array( 'query', 'pages', intval( $pageId ) ),
+ 'imagerepository', ''
+ );
+ // The above can't fail because it doesn't increase the result size
continue;
}
- $start = $skip ? $fromTimestamp : $params['start'];
- $pageId = $pageIds[NS_FILE][ $img->getOriginalTitle()->getDBkey() ];
+ /** @var $img File */
+ $img = $images[$title];
+
+ if ( self::getTransformCount() >= self::TRANSFORM_LIMIT ) {
+ if ( count( $pageIds[NS_FILE] ) == 1 ) {
+ // See the 'the user is screwed' comment below
+ $this->setContinueEnumParameter( 'start',
+ $start !== null ? $start : wfTimestamp( TS_ISO_8601, $img->getTimestamp() )
+ );
+ } else {
+ $this->setContinueEnumParameter( 'continue',
+ $this->getContinueStr( $img, $start ) );
+ }
+ break;
+ }
$fit = $result->addValue(
array( 'query', 'pages', intval( $pageId ) ),
@@ -100,10 +118,11 @@ class ApiQueryImageInfo extends ApiQueryBase {
// thing again. When the violating queries have been
// out-continued, the result will get through
$this->setContinueEnumParameter( 'start',
- wfTimestamp( TS_ISO_8601, $img->getTimestamp() ) );
+ $start !== null ? $start : wfTimestamp( TS_ISO_8601, $img->getTimestamp() )
+ );
} else {
$this->setContinueEnumParameter( 'continue',
- $this->getContinueStr( $img ) );
+ $this->getContinueStr( $img, $start ) );
}
break;
}
@@ -140,6 +159,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
// Get one more to facilitate query-continue functionality
$count = ( $gotOne ? 1 : 0 );
$oldies = $img->getHistory( $params['limit'] - $count + 1, $start, $params['end'] );
+ /** @var $oldie File */
foreach ( $oldies as $oldie ) {
if ( ++$count > $params['limit'] ) {
// We've reached the extra one which shows that there are additional pages to be had. Stop here...
@@ -167,25 +187,13 @@ class ApiQueryImageInfo extends ApiQueryBase {
if ( !$fit ) {
break;
}
- $skip = false;
- }
-
- $data = $this->getResultData();
- foreach ( $data['query']['pages'] as $pageid => $arr ) {
- if ( !isset( $arr['imagerepository'] ) ) {
- $result->addValue(
- array( 'query', 'pages', $pageid ),
- 'imagerepository', ''
- );
- }
- // The above can't fail because it doesn't increase the result size
}
}
}
/**
* From parameters, construct a 'scale' array
- * @param $params Array: Parameters passed to api.
+ * @param array $params Parameters passed to api.
* @return Array or Null: key-val array of 'width' and 'height', or null
*/
public function getScale( $params ) {
@@ -216,8 +224,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
* We do this later than getScale, since we need the image
* to know which handler, since handlers can make their own parameters.
* @param File $image Image that params are for.
- * @param Array $thumbParams thumbnail parameters from getScale
- * @param String $otherParams of otherParams (iiurlparam).
+ * @param array $thumbParams thumbnail parameters from getScale
+ * @param string $otherParams of otherParams (iiurlparam).
* @return Array of parameters for transform.
*/
protected function mergeThumbParams ( $image, $thumbParams, $otherParams ) {
@@ -264,10 +272,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
* Get result information for an image revision
*
* @param $file File object
- * @param $prop Array of properties to get (in the keys)
+ * @param array $prop of properties to get (in the keys)
* @param $result ApiResult object
- * @param $thumbParams Array containing 'width' and 'height' items, or null
- * @param $version string Version of image metadata (for things like jpeg which have different versions).
+ * @param array $thumbParams containing 'width' and 'height' items, or null
+ * @param string $version Version of image metadata (for things like jpeg which have different versions).
* @return Array: result array
*/
static function getInfo( $file, $prop, $result, $thumbParams = null, $version = 'latest' ) {
@@ -346,6 +354,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
if ( $url ) {
if ( !is_null( $thumbParams ) ) {
$mto = $file->transform( $thumbParams );
+ self::$transformCount++;
if ( $mto && !$mto->isError() ) {
$vals['thumburl'] = wfExpandUrl( $mto->getUrl(), PROTO_CURRENT );
@@ -360,7 +369,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
}
if ( isset( $prop['thumbmime'] ) && $file->getHandler() ) {
- list( $ext, $mime ) = $file->getHandler()->getThumbType(
+ list( , $mime ) = $file->getHandler()->getThumbType(
$mto->getExtension(), $file->getMimeType(), $thumbParams );
$vals['thumbmime'] = $mime;
}
@@ -377,8 +386,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
}
if ( $meta ) {
+ wfSuppressWarnings();
$metadata = unserialize( $file->getMetadata() );
- if ( $version !== 'latest' ) {
+ wfRestoreWarnings();
+ if ( $metadata && $version !== 'latest' ) {
$metadata = $file->convertMetadataVersion( $metadata, $version );
}
$vals['metadata'] = $metadata ? self::processMetaData( $metadata, $result ) : null;
@@ -404,6 +415,17 @@ class ApiQueryImageInfo extends ApiQueryBase {
}
/**
+ * Get the count of image transformations performed
+ *
+ * If this is >= TRANSFORM_LIMIT, you should probably stop processing images.
+ *
+ * @return integer count
+ */
+ static function getTransformCount() {
+ return self::$transformCount;
+ }
+
+ /**
*
* @param $metadata Array
* @param $result ApiResult
@@ -432,11 +454,14 @@ class ApiQueryImageInfo extends ApiQueryBase {
/**
* @param $img File
+ * @param null|string $start
* @return string
*/
- protected function getContinueStr( $img ) {
- return $img->getOriginalTitle()->getText() .
- '|' . $img->getTimestamp();
+ protected function getContinueStr( $img, $start = null ) {
+ if ( $start === null ) {
+ $start = $img->getTimestamp();
+ }
+ return $img->getOriginalTitle()->getText() . '|' . $start;
}
public function getAllowedParams() {
@@ -494,6 +519,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
/**
* Returns array key value pairs of properties and their descriptions
*
+ * @param string $modulePrefix
* @return array
*/
private static function getProperties( $modulePrefix = '' ) {
@@ -540,7 +566,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
return array(
'prop' => self::getPropertyDescriptions( array(), $p ),
'urlwidth' => array( "If {$p}prop=url is set, a URL to an image scaled to this width will be returned.",
- 'Only the current version of the image can be scaled' ),
+ 'Only the current version of the image can be scaled' ),
'urlheight' => "Similar to {$p}urlwidth. Cannot be used without {$p}urlwidth",
'urlparam' => array( "A handler specific parameter string. For example, pdf's ",
"might use 'page15-100px'. {$p}urlwidth must be used and be consistent with {$p}urlparam" ),
@@ -578,6 +604,15 @@ class ApiQueryImageInfo extends ApiQueryBase {
ApiBase::PROP_NULLABLE => true
)
),
+ 'dimensions' => array(
+ 'size' => 'integer',
+ 'width' => 'integer',
+ 'height' => 'integer',
+ 'pagecount' => array(
+ ApiBase::PROP_TYPE => 'integer',
+ ApiBase::PROP_NULLABLE => true
+ )
+ ),
'comment' => array(
'commenthidden' => 'boolean',
'comment' => array(
@@ -633,6 +668,13 @@ class ApiQueryImageInfo extends ApiQueryBase {
ApiBase::PROP_NULLABLE => true
)
),
+ 'thumbmime' => array(
+ 'filehidden' => 'boolean',
+ 'thumbmime' => array(
+ ApiBase::PROP_TYPE => 'string',
+ ApiBase::PROP_NULLABLE => true
+ )
+ ),
'mediatype' => array(
'filehidden' => 'boolean',
'mediatype' => array(
@@ -672,7 +714,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
array( 'code' => "{$p}urlwidth", 'info' => "{$p}urlheight cannot be used without {$p}urlwidth" ),
array( 'code' => 'urlparam', 'info' => "Invalid value for {$p}urlparam" ),
array( 'code' => 'urlparam_no_width', 'info' => "{$p}urlparam requires {$p}urlwidth" ),
- array( 'code' => 'urlparam_urlwidth_mismatch', 'info' => "The width set in {$p}urlparm doesnt't " .
+ array( 'code' => 'urlparam_urlwidth_mismatch', 'info' => "The width set in {$p}urlparm doesn't " .
"match the one in {$p}urlwidth" ),
) );
}
@@ -687,8 +729,4 @@ class ApiQueryImageInfo extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Properties#imageinfo_.2F_ii';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryImages.php b/includes/api/ApiQueryImages.php
index 6052a75f..f2bf0a7b 100644
--- a/includes/api/ApiQueryImages.php
+++ b/includes/api/ApiQueryImages.php
@@ -49,7 +49,7 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
*/
private function run( $resultPageSet = null ) {
if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
- return; // nothing to do
+ return; // nothing to do
}
$params = $this->extractRequestParams();
@@ -62,10 +62,7 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
$this->addWhereFld( 'il_from', array_keys( $this->getPageSet()->getGoodTitles() ) );
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the ' .
- 'original value returned by the previous query', '_badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 2 );
$op = $params['dir'] == 'descending' ? '<' : '>';
$ilfrom = intval( $cont[0] );
$ilto = $this->getDB()->addQuotes( $cont[1] );
@@ -185,12 +182,6 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
return 'Returns all images contained on the given page(s)';
}
- public function getPossibleErrors() {
- return array_merge( parent::getPossibleErrors(), array(
- array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
- ) );
- }
-
public function getExamples() {
return array(
'api.php?action=query&prop=images&titles=Main%20Page' => 'Get a list of images used in the [[Main Page]]',
@@ -201,8 +192,4 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Properties#images_.2F_im';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryInfo.php b/includes/api/ApiQueryInfo.php
index 5d4f0346..37cd9159 100644
--- a/includes/api/ApiQueryInfo.php
+++ b/includes/api/ApiQueryInfo.php
@@ -33,7 +33,8 @@ class ApiQueryInfo extends ApiQueryBase {
private $fld_protection = false, $fld_talkid = false,
$fld_subjectid = false, $fld_url = false,
- $fld_readable = false, $fld_watched = false, $fld_notificationtimestamp = false,
+ $fld_readable = false, $fld_watched = false, $fld_watchers = false,
+ $fld_notificationtimestamp = false,
$fld_preload = false, $fld_displaytitle = false;
private $params, $titles, $missing, $everything, $pageCounter;
@@ -41,7 +42,8 @@ class ApiQueryInfo extends ApiQueryBase {
private $pageRestrictions, $pageIsRedir, $pageIsNew, $pageTouched,
$pageLatest, $pageLength;
- private $protections, $watched, $notificationtimestamps, $talkids, $subjectids, $displaytitles;
+ private $protections, $watched, $watchers, $notificationtimestamps, $talkids, $subjectids, $displaytitles;
+ private $showZeroWatchers = false;
private $tokenFunctions;
@@ -96,7 +98,7 @@ class ApiQueryInfo extends ApiQueryBase {
'unblock' => array( 'ApiQueryInfo', 'getUnblockToken' ),
'email' => array( 'ApiQueryInfo', 'getEmailToken' ),
'import' => array( 'ApiQueryInfo', 'getImportToken' ),
- 'watch' => array( 'ApiQueryInfo', 'getWatchToken'),
+ 'watch' => array( 'ApiQueryInfo', 'getWatchToken' ),
);
wfRunHooks( 'APIQueryInfoTokens', array( &$this->tokenFunctions ) );
return $this->tokenFunctions;
@@ -118,11 +120,11 @@ class ApiQueryInfo extends ApiQueryBase {
}
// The token is always the same, let's exploit that
- if ( !isset( ApiQueryInfo::$cachedTokens[ 'edit' ] ) ) {
- ApiQueryInfo::$cachedTokens[ 'edit' ] = $wgUser->getEditToken();
+ if ( !isset( ApiQueryInfo::$cachedTokens['edit'] ) ) {
+ ApiQueryInfo::$cachedTokens['edit'] = $wgUser->getEditToken();
}
- return ApiQueryInfo::$cachedTokens[ 'edit' ];
+ return ApiQueryInfo::$cachedTokens['edit'];
}
public static function getDeleteToken( $pageid, $title ) {
@@ -132,11 +134,11 @@ class ApiQueryInfo extends ApiQueryBase {
}
// The token is always the same, let's exploit that
- if ( !isset( ApiQueryInfo::$cachedTokens[ 'delete' ] ) ) {
- ApiQueryInfo::$cachedTokens[ 'delete' ] = $wgUser->getEditToken();
+ if ( !isset( ApiQueryInfo::$cachedTokens['delete'] ) ) {
+ ApiQueryInfo::$cachedTokens['delete'] = $wgUser->getEditToken();
}
- return ApiQueryInfo::$cachedTokens[ 'delete' ];
+ return ApiQueryInfo::$cachedTokens['delete'];
}
public static function getProtectToken( $pageid, $title ) {
@@ -146,11 +148,11 @@ class ApiQueryInfo extends ApiQueryBase {
}
// The token is always the same, let's exploit that
- if ( !isset( ApiQueryInfo::$cachedTokens[ 'protect' ] ) ) {
- ApiQueryInfo::$cachedTokens[ 'protect' ] = $wgUser->getEditToken();
+ if ( !isset( ApiQueryInfo::$cachedTokens['protect'] ) ) {
+ ApiQueryInfo::$cachedTokens['protect'] = $wgUser->getEditToken();
}
- return ApiQueryInfo::$cachedTokens[ 'protect' ];
+ return ApiQueryInfo::$cachedTokens['protect'];
}
public static function getMoveToken( $pageid, $title ) {
@@ -160,11 +162,11 @@ class ApiQueryInfo extends ApiQueryBase {
}
// The token is always the same, let's exploit that
- if ( !isset( ApiQueryInfo::$cachedTokens[ 'move' ] ) ) {
- ApiQueryInfo::$cachedTokens[ 'move' ] = $wgUser->getEditToken();
+ if ( !isset( ApiQueryInfo::$cachedTokens['move'] ) ) {
+ ApiQueryInfo::$cachedTokens['move'] = $wgUser->getEditToken();
}
- return ApiQueryInfo::$cachedTokens[ 'move' ];
+ return ApiQueryInfo::$cachedTokens['move'];
}
public static function getBlockToken( $pageid, $title ) {
@@ -174,11 +176,11 @@ class ApiQueryInfo extends ApiQueryBase {
}
// The token is always the same, let's exploit that
- if ( !isset( ApiQueryInfo::$cachedTokens[ 'block' ] ) ) {
- ApiQueryInfo::$cachedTokens[ 'block' ] = $wgUser->getEditToken();
+ if ( !isset( ApiQueryInfo::$cachedTokens['block'] ) ) {
+ ApiQueryInfo::$cachedTokens['block'] = $wgUser->getEditToken();
}
- return ApiQueryInfo::$cachedTokens[ 'block' ];
+ return ApiQueryInfo::$cachedTokens['block'];
}
public static function getUnblockToken( $pageid, $title ) {
@@ -193,11 +195,11 @@ class ApiQueryInfo extends ApiQueryBase {
}
// The token is always the same, let's exploit that
- if ( !isset( ApiQueryInfo::$cachedTokens[ 'email' ] ) ) {
- ApiQueryInfo::$cachedTokens[ 'email' ] = $wgUser->getEditToken();
+ if ( !isset( ApiQueryInfo::$cachedTokens['email'] ) ) {
+ ApiQueryInfo::$cachedTokens['email'] = $wgUser->getEditToken();
}
- return ApiQueryInfo::$cachedTokens[ 'email' ];
+ return ApiQueryInfo::$cachedTokens['email'];
}
public static function getImportToken( $pageid, $title ) {
@@ -207,11 +209,11 @@ class ApiQueryInfo extends ApiQueryBase {
}
// The token is always the same, let's exploit that
- if ( !isset( ApiQueryInfo::$cachedTokens[ 'import' ] ) ) {
- ApiQueryInfo::$cachedTokens[ 'import' ] = $wgUser->getEditToken();
+ if ( !isset( ApiQueryInfo::$cachedTokens['import'] ) ) {
+ ApiQueryInfo::$cachedTokens['import'] = $wgUser->getEditToken();
}
- return ApiQueryInfo::$cachedTokens[ 'import' ];
+ return ApiQueryInfo::$cachedTokens['import'];
}
public static function getWatchToken( $pageid, $title ) {
@@ -221,11 +223,11 @@ class ApiQueryInfo extends ApiQueryBase {
}
// The token is always the same, let's exploit that
- if ( !isset( ApiQueryInfo::$cachedTokens[ 'watch' ] ) ) {
- ApiQueryInfo::$cachedTokens[ 'watch' ] = $wgUser->getEditToken( 'watch' );
+ if ( !isset( ApiQueryInfo::$cachedTokens['watch'] ) ) {
+ ApiQueryInfo::$cachedTokens['watch'] = $wgUser->getEditToken( 'watch' );
}
- return ApiQueryInfo::$cachedTokens[ 'watch' ];
+ return ApiQueryInfo::$cachedTokens['watch'];
}
public static function getOptionsToken( $pageid, $title ) {
@@ -235,11 +237,11 @@ class ApiQueryInfo extends ApiQueryBase {
}
// The token is always the same, let's exploit that
- if ( !isset( ApiQueryInfo::$cachedTokens[ 'options' ] ) ) {
- ApiQueryInfo::$cachedTokens[ 'options' ] = $wgUser->getEditToken();
+ if ( !isset( ApiQueryInfo::$cachedTokens['options'] ) ) {
+ ApiQueryInfo::$cachedTokens['options'] = $wgUser->getEditToken();
}
- return ApiQueryInfo::$cachedTokens[ 'options' ];
+ return ApiQueryInfo::$cachedTokens['options'];
}
public function execute() {
@@ -248,6 +250,7 @@ class ApiQueryInfo extends ApiQueryBase {
$prop = array_flip( $this->params['prop'] );
$this->fld_protection = isset( $prop['protection'] );
$this->fld_watched = isset( $prop['watched'] );
+ $this->fld_watchers = isset( $prop['watchers'] );
$this->fld_notificationtimestamp = isset( $prop['notificationtimestamp'] );
$this->fld_talkid = isset( $prop['talkid'] );
$this->fld_subjectid = isset( $prop['subjectid'] );
@@ -268,10 +271,7 @@ class ApiQueryInfo extends ApiQueryBase {
// Throw away any titles we're gonna skip so they don't
// clutter queries
$cont = explode( '|', $this->params['continue'] );
- if ( count( $cont ) != 2 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the original ' .
- 'value returned by the previous query', '_badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 2 );
$conttitle = Title::makeTitleSafe( $cont[0], $cont[1] );
foreach ( $this->everything as $pageid => $title ) {
if ( Title::compare( $title, $conttitle ) >= 0 ) {
@@ -308,6 +308,10 @@ class ApiQueryInfo extends ApiQueryBase {
$this->getWatchedInfo();
}
+ if ( $this->fld_watchers ) {
+ $this->getWatcherInfo();
+ }
+
// Run the talkid/subjectid query if requested
if ( $this->fld_talkid || $this->fld_subjectid ) {
$this->getTSIDs();
@@ -317,6 +321,7 @@ class ApiQueryInfo extends ApiQueryBase {
$this->getDisplayTitle();
}
+ /** @var $title Title */
foreach ( $this->everything as $pageid => $title ) {
$pageInfo = $this->extractPageInfo( $pageid, $title );
$fit = $result->addValue( array(
@@ -334,7 +339,7 @@ class ApiQueryInfo extends ApiQueryBase {
/**
* Get a result array with information about a title
- * @param $pageid int Page ID (negative for missing titles)
+ * @param int $pageid Page ID (negative for missing titles)
* @param $title Title object
* @return array
*/
@@ -349,7 +354,7 @@ class ApiQueryInfo extends ApiQueryBase {
$pageInfo['touched'] = wfTimestamp( TS_ISO_8601, $this->pageTouched[$pageid] );
$pageInfo['lastrevid'] = intval( $this->pageLatest[$pageid] );
$pageInfo['counter'] = $wgDisableCounters
- ? ""
+ ? ''
: intval( $this->pageCounter[$pageid] );
$pageInfo['length'] = intval( $this->pageLength[$pageid] );
@@ -387,6 +392,14 @@ class ApiQueryInfo extends ApiQueryBase {
$pageInfo['watched'] = '';
}
+ if ( $this->fld_watchers ) {
+ if ( isset( $this->watchers[$ns][$dbkey] ) ) {
+ $pageInfo['watchers'] = $this->watchers[$ns][$dbkey];
+ } elseif ( $this->showZeroWatchers ) {
+ $pageInfo['watchers'] = 0;
+ }
+ }
+
if ( $this->fld_notificationtimestamp ) {
$pageInfo['notificationtimestamp'] = '';
if ( isset( $this->notificationtimestamps[$ns][$dbkey] ) ) {
@@ -394,7 +407,7 @@ class ApiQueryInfo extends ApiQueryBase {
}
}
- if ( $this->fld_talkid && isset( $this->talkids[$ns][$dbkey] ) ) {
+ if ( $this->fld_talkid && isset( $this->talkids[$ns][$dbkey] ) ) {
$pageInfo['talkid'] = $this->talkids[$ns][$dbkey];
}
@@ -406,7 +419,7 @@ class ApiQueryInfo extends ApiQueryBase {
$pageInfo['fullurl'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
$pageInfo['editurl'] = wfExpandUrl( $title->getFullURL( 'action=edit' ), PROTO_CURRENT );
}
- if ( $this->fld_readable && $title->userCan( 'read' ) ) {
+ if ( $this->fld_readable && $title->userCan( 'read', $this->getUser() ) ) {
$pageInfo['readable'] = '';
}
@@ -450,6 +463,7 @@ class ApiQueryInfo extends ApiQueryBase {
$res = $this->select( __METHOD__ );
foreach ( $res as $row ) {
+ /** @var $title Title */
$title = $this->titles[$row->pr_page];
$a = array(
'type' => $row->pr_type,
@@ -585,6 +599,7 @@ class ApiQueryInfo extends ApiQueryBase {
private function getTSIDs() {
$getTitles = $this->talkids = $this->subjectids = array();
+ /** @var $t Title */
foreach ( $this->everything as $t ) {
if ( MWNamespace::isTalk( $t->getNamespace() ) ) {
if ( $this->fld_subjectid ) {
@@ -678,6 +693,46 @@ class ApiQueryInfo extends ApiQueryBase {
}
}
+ /**
+ * Get the count of watchers and put it in $this->watchers
+ */
+ private function getWatcherInfo() {
+ global $wgUnwatchedPageThreshold;
+
+ if ( count( $this->everything ) == 0 ) {
+ return;
+ }
+
+ $user = $this->getUser();
+ $canUnwatchedpages = $user->isAllowed( 'unwatchedpages' );
+ if ( !$canUnwatchedpages && !is_int( $wgUnwatchedPageThreshold ) ) {
+ return;
+ }
+
+ $this->watchers = array();
+ $this->showZeroWatchers = $canUnwatchedpages;
+ $db = $this->getDB();
+
+ $lb = new LinkBatch( $this->everything );
+
+ $this->resetQueryParams();
+ $this->addTables( array( 'watchlist' ) );
+ $this->addFields( array( 'wl_title', 'wl_namespace', 'count' => 'COUNT(*)' ) );
+ $this->addWhere( array(
+ $lb->constructSet( 'wl', $db )
+ ) );
+ $this->addOption( 'GROUP BY', array( 'wl_namespace', 'wl_title' ) );
+ if ( !$canUnwatchedpages ) {
+ $this->addOption( 'HAVING', "COUNT(*) >= $wgUnwatchedPageThreshold" );
+ }
+
+ $res = $this->select( __METHOD__ );
+
+ foreach ( $res as $row ) {
+ $this->watchers[$row->wl_namespace][$row->wl_title] = (int)$row->count;
+ }
+ }
+
public function getCacheMode( $params ) {
$publicProps = array(
'protection',
@@ -709,6 +764,7 @@ class ApiQueryInfo extends ApiQueryBase {
'protection',
'talkid',
'watched', # private
+ 'watchers', # private
'notificationtimestamp', # private
'subjectid',
'url',
@@ -734,6 +790,7 @@ class ApiQueryInfo extends ApiQueryBase {
' protection - List the protection level of each page',
' talkid - The page ID of the talk page for each non-talk page',
' watched - List the watched status of each page',
+ ' watchers - The number of watchers, if allowed',
' notificationtimestamp - The watchlist notification timestamp of each page',
' subjectid - The page ID of the parent page for each talk page',
' url - Gives a full URL to the page, and also an edit URL',
@@ -767,6 +824,12 @@ class ApiQueryInfo extends ApiQueryBase {
'watched' => array(
'watched' => 'boolean'
),
+ 'watchers' => array(
+ 'watchers' => array(
+ ApiBase::PROP_TYPE => 'integer',
+ ApiBase::PROP_NULLABLE => true
+ )
+ ),
'notificationtimestamp' => array(
'notificationtimestamp' => array(
ApiBase::PROP_TYPE => 'timestamp',
@@ -809,12 +872,6 @@ class ApiQueryInfo extends ApiQueryBase {
return 'Get basic page information such as namespace, title, last touched date, ...';
}
- public function getPossibleErrors() {
- return array_merge( parent::getPossibleErrors(), array(
- array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
- ) );
- }
-
public function getExamples() {
return array(
'api.php?action=query&prop=info&titles=Main%20Page',
@@ -825,8 +882,4 @@ class ApiQueryInfo extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Properties#info_.2F_in';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryLangBacklinks.php b/includes/api/ApiQueryLangBacklinks.php
index 3920407b..7a4880a4 100644
--- a/includes/api/ApiQueryLangBacklinks.php
+++ b/includes/api/ApiQueryLangBacklinks.php
@@ -56,10 +56,7 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 3 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the ' .
- 'original value returned by the previous query', '_badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 3 );
$db = $this->getDB();
$op = $params['dir'] == 'descending' ? '<' : '>';
@@ -233,7 +230,6 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'missingparam', 'lang' ),
- array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
) );
}
@@ -243,8 +239,4 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
'api.php?action=query&generator=langbacklinks&glbltitle=Test&glbllang=fr&prop=info'
);
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryLangLinks.php b/includes/api/ApiQueryLangLinks.php
index 3109a090..ac65d2d2 100644
--- a/includes/api/ApiQueryLangLinks.php
+++ b/includes/api/ApiQueryLangLinks.php
@@ -25,7 +25,7 @@
*/
/**
- * A query module to list all langlinks (links to correspanding foreign language pages).
+ * A query module to list all langlinks (links to corresponding foreign language pages).
*
* @ingroup API
*/
@@ -56,10 +56,7 @@ class ApiQueryLangLinks extends ApiQueryBase {
$this->addWhereFld( 'll_from', array_keys( $this->getPageSet()->getGoodTitles() ) );
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the ' .
- 'original value returned by the previous query', '_badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 2 );
$op = $params['dir'] == 'descending' ? '<' : '>';
$llfrom = intval( $cont[0] );
$lllang = $this->getDB()->addQuotes( $cont[1] );
@@ -179,7 +176,6 @@ class ApiQueryLangLinks extends ApiQueryBase {
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'missingparam', 'lang' ),
- array( 'code' => '_badcontinue', 'info' => 'Invalid continue param. You should pass the original value returned by the previous query' ),
) );
}
@@ -192,8 +188,4 @@ class ApiQueryLangLinks extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Properties#langlinks_.2F_ll';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryLinks.php b/includes/api/ApiQueryLinks.php
index 9e4b7ebb..937f4f13 100644
--- a/includes/api/ApiQueryLinks.php
+++ b/includes/api/ApiQueryLinks.php
@@ -79,7 +79,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
*/
private function run( $resultPageSet = null ) {
if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
- return; // nothing to do
+ return; // nothing to do
}
$params = $this->extractRequestParams();
@@ -112,10 +112,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 3 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the ' .
- 'original value returned by the previous query', '_badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 3 );
$op = $params['dir'] == 'descending' ? '<' : '>';
$plfrom = intval( $cont[0] );
$plns = intval( $cont[1] );
@@ -241,17 +238,13 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
$desc = $this->description;
$name = $this->getModuleName();
return array(
- "api.php?action=query&prop={$name}&titles=Main%20Page" => "Get {$desc}s from the [[Main Page]]:",
- "api.php?action=query&generator={$name}&titles=Main%20Page&prop=info" => "Get information about the {$desc} pages in the [[Main Page]]:",
- "api.php?action=query&prop={$name}&titles=Main%20Page&{$this->prefix}namespace=2|10" => "Get {$desc}s from the Main Page in the User and Template namespaces:",
+ "api.php?action=query&prop={$name}&titles=Main%20Page" => "Get {$desc}s from the [[Main Page]]",
+ "api.php?action=query&generator={$name}&titles=Main%20Page&prop=info" => "Get information about the {$desc} pages in the [[Main Page]]",
+ "api.php?action=query&prop={$name}&titles=Main%20Page&{$this->prefix}namespace=2|10" => "Get {$desc}s from the Main Page in the User and Template namespaces",
);
}
public function getHelpUrls() {
return $this->helpUrl;
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryLogEvents.php b/includes/api/ApiQueryLogEvents.php
index 5d85c221..73dcea49 100644
--- a/includes/api/ApiQueryLogEvents.php
+++ b/includes/api/ApiQueryLogEvents.php
@@ -58,7 +58,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
$this->fld_details = isset( $prop['details'] );
$this->fld_tags = isset( $prop['tags'] );
- $hideLogs = LogEventsList::getExcludeClause( $db );
+ $hideLogs = LogEventsList::getExcludeClause( $db, 'user', $this->getUser() );
if ( $hideLogs !== false ) {
$this->addWhere( $hideLogs );
}
@@ -70,7 +70,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
'user' => array( 'JOIN',
'user_id=log_user' ),
'page' => array( 'LEFT JOIN',
- array( 'log_namespace=page_namespace',
+ array( 'log_namespace=page_namespace',
'log_title=page_title' ) ) ) );
$index = array( 'logging' => 'times' ); // default, may change
@@ -151,7 +151,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
if ( is_null( $title ) ) {
$this->dieUsage( "Bad title value '$prefix'", 'param_prefix' );
}
- $this->addWhereFld( 'log_namespace', $title->getNamespace() );
+ $this->addWhereFld( 'log_namespace', $title->getNamespace() );
$this->addWhere( 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() ) );
}
@@ -201,7 +201,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
public static function addLogParams( $result, &$vals, $params, $type, $action, $ts, $legacy = false ) {
switch ( $type ) {
case 'move':
- if ( $legacy ){
+ if ( $legacy ) {
$targetKey = 0;
$noredirKey = 1;
} else {
@@ -209,21 +209,21 @@ class ApiQueryLogEvents extends ApiQueryBase {
$noredirKey = '5::noredir';
}
- if ( isset( $params[ $targetKey ] ) ) {
- $title = Title::newFromText( $params[ $targetKey ] );
+ if ( isset( $params[$targetKey] ) ) {
+ $title = Title::newFromText( $params[$targetKey] );
if ( $title ) {
$vals2 = array();
ApiQueryBase::addTitleInfo( $vals2, $title, 'new_' );
$vals[$type] = $vals2;
}
}
- if ( isset( $params[ $noredirKey ] ) && $params[ $noredirKey ] ) {
+ if ( isset( $params[$noredirKey] ) && $params[$noredirKey] ) {
$vals[$type]['suppressedredirect'] = '';
}
$params = null;
break;
case 'patrol':
- if ( $legacy ){
+ if ( $legacy ) {
$cur = 0;
$prev = 1;
$auto = 2;
@@ -241,7 +241,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
break;
case 'rights':
$vals2 = array();
- list( $vals2['old'], $vals2['new'] ) = $params;
+ if( $legacy ) {
+ list( $vals2['old'], $vals2['new'] ) = $params;
+ } else {
+ $vals2['new'] = implode( ', ', $params['5::newgroups'] );
+ $vals2['old'] = implode( ', ', $params['4::oldgroups'] );
+ }
$vals[$type] = $vals2;
$params = null;
break;
@@ -262,9 +267,19 @@ class ApiQueryLogEvents extends ApiQueryBase {
break;
}
if ( !is_null( $params ) ) {
- $result->setIndexedTagName( $params, 'param' );
- $result->setIndexedTagName_recursive( $params, 'param' );
- $vals = array_merge( $vals, $params );
+ $logParams = array();
+ // Keys like "4::paramname" can't be used for output so we change them to "paramname"
+ foreach ( $params as $key => $value ) {
+ if ( strpos( $key, ':' ) === false ) {
+ $logParams[$key] = $value;
+ continue;
+ }
+ $logParam = explode( ':', $key, 3 );
+ $logParams[$logParam[2]] = $value;
+ }
+ $result->setIndexedTagName( $logParams, 'param' );
+ $result->setIndexedTagName_recursive( $logParams, 'param' );
+ $vals = array_merge( $vals, $logParams );
}
return $vals;
}
@@ -362,8 +377,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) {
// formatComment() calls wfMessage() among other things
return 'anon-public-user-private';
- } else {
+ } elseif ( LogEventsList::getExcludeClause( $this->getDB(), 'user', $this->getUser() )
+ === LogEventsList::getExcludeClause( $this->getDB(), 'public' )
+ ) { // Output can only contain public data.
return 'public';
+ } else {
+ return 'anon-public-user-private';
}
}
@@ -432,7 +451,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
' timestamp - Adds the timestamp for the event',
' comment - Adds the comment of the event',
' parsedcomment - Adds the parsed comment of the event',
- ' details - Lists addtional details about the event',
+ ' details - Lists additional details about the event',
' tags - Lists tags for the event',
),
'type' => 'Filter log entries to only this type',
@@ -526,8 +545,4 @@ class ApiQueryLogEvents extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Logevents';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryORM.php b/includes/api/ApiQueryORM.php
new file mode 100644
index 00000000..41d8f11c
--- /dev/null
+++ b/includes/api/ApiQueryORM.php
@@ -0,0 +1,264 @@
+<?php
+
+/**
+ * Base query module for querying results from ORMTables.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup API
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+abstract class ApiQueryORM extends ApiQueryBase {
+
+ /**
+ * Returns an instance of the IORMTable table being queried.
+ *
+ * @since 1.21
+ *
+ * @return IORMTable
+ */
+ abstract protected function getTable();
+
+ /**
+ * Returns the name of the individual rows.
+ * For example: page, user, contest, campaign, etc.
+ * This is used to appropriately name elements in XML.
+ * Deriving classes typically override this method.
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ protected function getRowName() {
+ return 'item';
+ }
+
+ /**
+ * Returns the name of the list of rows.
+ * For example: pages, users, contests, campaigns, etc.
+ * This is used to appropriately name nodes in the output.
+ * Deriving classes typically override this method.
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ protected function getListName() {
+ return 'items';
+ }
+
+ /**
+ * Returns the path to where the items results should be added in the result.
+ *
+ * @since 1.21
+ *
+ * @return null|string|array
+ */
+ protected function getResultPath() {
+ return null;
+ }
+
+ /**
+ * Get the parameters, find out what the conditions for the query are,
+ * run it, and add the results.
+ *
+ * @since 1.21
+ */
+ public function execute() {
+ $params = $this->getParams();
+
+ if ( !in_array( 'id', $params['props'] ) ) {
+ $params['props'][] = 'id';
+ }
+
+ $results = $this->getResults( $params, $this->getConditions( $params ) );
+ $this->addResults( $params, $results );
+ }
+
+ /**
+ * Get the request parameters and remove all params set
+ * to null (ie those that are not actually provided).
+ *
+ * @since 1.21
+ *
+ * @return array
+ */
+ protected function getParams() {
+ return array_filter(
+ $this->extractRequestParams(),
+ function( $prop ) {
+ return isset( $prop );
+ }
+ );
+ }
+
+ /**
+ * Get the conditions for the query. These will be provided as
+ * regular parameters, together with limit, props, continue,
+ * and possibly others which we need to get rid off.
+ *
+ * @since 1.21
+ *
+ * @param array $params
+ *
+ * @return array
+ */
+ protected function getConditions( array $params ) {
+ $conditions = array();
+ $fields = $this->getTable()->getFields();
+
+ foreach ( $params as $name => $value ) {
+ if ( array_key_exists( $name, $fields ) ) {
+ $conditions[$name] = $value;
+ }
+ }
+
+ return $conditions;
+ }
+
+ /**
+ * Get the actual results.
+ *
+ * @since 1.21
+ *
+ * @param array $params
+ * @param array $conditions
+ *
+ * @return ORMResult
+ */
+ protected function getResults( array $params, array $conditions ) {
+ return $this->getTable()->select(
+ $params['props'],
+ $conditions,
+ array(
+ 'LIMIT' => $params['limit'] + 1,
+ 'ORDER BY' => $this->getTable()->getPrefixedField( 'id' ) . ' ASC',
+ ),
+ __METHOD__
+ );
+ }
+
+ /**
+ * Serialize the results and add them to the result object.
+ *
+ * @since 1.21
+ *
+ * @param array $params
+ * @param ORMResult $results
+ */
+ protected function addResults( array $params, ORMResult $results ) {
+ $serializedResults = array();
+ $count = 0;
+
+ foreach ( $results as /* IORMRow */ $result ) {
+ if ( ++$count > $params['limit'] ) {
+ // We've reached the one extra which shows that
+ // there are additional pages to be had. Stop here...
+ $this->setContinueEnumParameter( 'continue', $result->getId() );
+ break;
+ }
+
+ $serializedResults[] = $this->formatRow( $result, $params );
+ }
+
+ $this->setIndexedTagNames( $serializedResults );
+ $this->addSerializedResults( $serializedResults );
+ }
+
+ /**
+ * Formats a row to it's desired output format.
+ *
+ * @since 1.21
+ *
+ * @param IORMRow $result
+ * @param array $params
+ *
+ * @return mixed
+ */
+ protected function formatRow( IORMRow $result, array $params ) {
+ return $result->toArray( $params['props'] );
+ }
+
+ /**
+ * Set the tag names for formats such as XML.
+ *
+ * @since 1.21
+ *
+ * @param array $serializedResults
+ */
+ protected function setIndexedTagNames( array &$serializedResults ) {
+ $this->getResult()->setIndexedTagName( $serializedResults, $this->getRowName() );
+ }
+
+ /**
+ * Add the serialized results to the result object.
+ *
+ * @since 1.21
+ *
+ * @param array $serializedResults
+ */
+ protected function addSerializedResults( array $serializedResults ) {
+ $this->getResult()->addValue(
+ $this->getResultPath(),
+ $this->getListName(),
+ $serializedResults
+ );
+ }
+
+ /**
+ * @see ApiBase::getAllowedParams()
+ * @return array
+ */
+ public function getAllowedParams() {
+ $params = array (
+ 'props' => array(
+ ApiBase::PARAM_TYPE => $this->getTable()->getFieldNames(),
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_REQUIRED => true,
+ ),
+ 'limit' => array(
+ ApiBase::PARAM_DFLT => 20,
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+ ),
+ 'continue' => null,
+ );
+
+ return array_merge( $this->getTable()->getAPIParams(), $params );
+ }
+
+ /**
+ * @see ApiBase::getParamDescription()
+ * @return array
+ */
+ public function getParamDescription() {
+ $descriptions = array (
+ 'props' => 'Fields to query',
+ 'continue' => 'Offset number from where to continue the query',
+ 'limit' => 'Max amount of rows to return',
+ );
+
+ return array_merge( $this->getTable()->getFieldDescriptions(), $descriptions );
+ }
+
+}
diff --git a/includes/api/ApiQueryPagePropNames.php b/includes/api/ApiQueryPagePropNames.php
new file mode 100644
index 00000000..08c883d8
--- /dev/null
+++ b/includes/api/ApiQueryPagePropNames.php
@@ -0,0 +1,116 @@
+<?php
+/**
+ * Created on January 21, 2013
+ *
+ * Copyright © 2013 Brad Jorsch <bjorsch@wikimedia.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.21
+ * @author Brad Jorsch
+ */
+
+/**
+ * A query module to list used page props
+ *
+ * @ingroup API
+ * @since 1.21
+ */
+class ApiQueryPagePropNames extends ApiQueryBase {
+
+ public function __construct( $query, $moduleName ) {
+ parent::__construct( $query, $moduleName, 'ppn' );
+ }
+
+ public function getCacheMode( $params ) {
+ return 'public';
+ }
+
+ public function execute() {
+ $params = $this->extractRequestParams();
+
+ $this->addTables( 'page_props' );
+ $this->addFields( 'pp_propname' );
+ $this->addOption( 'DISTINCT' );
+ $this->addOption( 'ORDER BY', 'pp_propname' );
+
+ if ( $params['continue'] ) {
+ $cont = explode( '|', $params['continue'] );
+ $this->dieContinueUsageIf( count( $cont ) != 1 );
+
+ // Add a WHERE clause
+ $this->addWhereRange( 'pp_propname', 'newer', $cont[0], null );
+ }
+
+ $limit = $params['limit'];
+ $this->addOption( 'LIMIT', $limit + 1 );
+
+ $result = $this->getResult();
+ $count = 0;
+ foreach ( $this->select( __METHOD__ ) as $row ) {
+ if ( ++$count > $limit ) {
+ // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+ $this->setContinueEnumParameter( 'continue', $row->pp_propname );
+ break;
+ }
+
+ $vals = array();
+ $vals['propname'] = $row->pp_propname;
+ $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
+ if ( !$fit ) {
+ $this->setContinueEnumParameter( 'continue', $row->pp_propname );
+ break;
+ }
+ }
+
+ $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'p' );
+ }
+
+ public function getAllowedParams() {
+ return array(
+ 'continue' => null,
+ 'limit' => array(
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+ ),
+ );
+ }
+
+ public function getParamDescription() {
+ return array(
+ 'continue' => 'When more results are available, use this to continue',
+ 'limit' => 'The maximum number of pages to return',
+ );
+ }
+
+ public function getDescription() {
+ return 'List all page prop names in use on the wiki';
+ }
+
+ public function getExamples() {
+ return array(
+ 'api.php?action=query&list=pagepropnames' => 'Get first 10 prop names',
+ );
+ }
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Pagepropnames';
+ }
+}
diff --git a/includes/api/ApiQueryPageProps.php b/includes/api/ApiQueryPageProps.php
index 1eef67e6..2de57106 100644
--- a/includes/api/ApiQueryPageProps.php
+++ b/includes/api/ApiQueryPageProps.php
@@ -49,7 +49,7 @@ class ApiQueryPageProps extends ApiQueryBase {
$this->addTables( 'page_props' );
$this->addFields( array( 'pp_page', 'pp_propname', 'pp_value' ) );
- $this->addWhereFld( 'pp_page', array_keys( $pages ) );
+ $this->addWhereFld( 'pp_page', array_keys( $pages ) );
if ( $this->params['continue'] ) {
$this->addWhere( 'pp_page >=' . intval( $this->params['continue'] ) );
@@ -60,7 +60,10 @@ class ApiQueryPageProps extends ApiQueryBase {
}
# Force a sort order to ensure that properties are grouped by page
- $this->addOption( 'ORDER BY', 'pp_page' );
+ # But only if pp_page is not constant in the WHERE clause.
+ if ( count( $pages ) > 1 ) {
+ $this->addOption( 'ORDER BY', 'pp_page' );
+ }
$res = $this->select( __METHOD__ );
$currentPage = 0; # Id of the page currently processed
@@ -122,14 +125,16 @@ class ApiQueryPageProps extends ApiQueryBase {
public function getAllowedParams() {
return array(
'continue' => null,
- 'prop' => null,
+ 'prop' => array(
+ ApiBase::PARAM_ISMULTI => true,
+ ),
);
}
public function getParamDescription() {
return array(
'continue' => 'When more results are available, use this to continue',
- 'prop' => 'Page prop to look on the page for. Useful for checking whether a certain page uses a certain page prop.'
+ 'prop' => 'Only list these props. Useful for checking whether a certain page uses a certain page prop',
);
}
@@ -146,8 +151,4 @@ class ApiQueryPageProps extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Properties#pageprops_.2F_pp';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryPagesWithProp.php b/includes/api/ApiQueryPagesWithProp.php
new file mode 100644
index 00000000..0132fc3e
--- /dev/null
+++ b/includes/api/ApiQueryPagesWithProp.php
@@ -0,0 +1,189 @@
+<?php
+/**
+ * Created on December 31, 2012
+ *
+ * Copyright © 2012 Brad Jorsch <bjorsch@wikimedia.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.21
+ * @author Brad Jorsch
+ */
+
+/**
+ * A query module to enumerate pages that use a particular prop
+ *
+ * @ingroup API
+ * @since 1.21
+ */
+class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
+
+ public function __construct( $query, $moduleName ) {
+ parent::__construct( $query, $moduleName, 'pwp' );
+ }
+
+ public function execute() {
+ $this->run();
+ }
+
+ public function getCacheMode( $params ) {
+ return 'public';
+ }
+
+ public function executeGenerator( $resultPageSet ) {
+ $this->run( $resultPageSet );
+ }
+
+ /**
+ * @param $resultPageSet ApiPageSet
+ * @return void
+ */
+ private function run( $resultPageSet = null ) {
+ $params = $this->extractRequestParams();
+
+ $prop = array_flip( $params['prop'] );
+ $fld_ids = isset( $prop['ids'] );
+ $fld_title = isset( $prop['title'] );
+ $fld_value = isset( $prop['value'] );
+
+ if ( $resultPageSet === null ) {
+ $this->addFields( array( 'page_id' ) );
+ $this->addFieldsIf( array( 'page_title', 'page_namespace' ), $fld_title );
+ $this->addFieldsIf( 'pp_value', $fld_value );
+ } else {
+ $this->addFields( $resultPageSet->getPageTableFields() );
+ }
+ $this->addTables( array( 'page_props', 'page' ) );
+ $this->addWhere( 'pp_page=page_id' );
+ $this->addWhereFld( 'pp_propname', $params['propname'] );
+
+ $dir = ( $params['dir'] == 'ascending' ) ? 'newer' : 'older';
+
+ if ( $params['continue'] ) {
+ $cont = explode( '|', $params['continue'] );
+ $this->dieContinueUsageIf( count( $cont ) != 1 );
+
+ // Add a WHERE clause
+ $from = (int)$cont[0];
+ $this->addWhereRange( 'pp_page', $dir, $from, null );
+ }
+
+ $sort = ( $params['dir'] === 'descending' ? ' DESC' : '' );
+ $this->addOption( 'ORDER BY', 'pp_page' . $sort );
+
+ $limit = $params['limit'];
+ $this->addOption( 'LIMIT', $limit + 1 );
+
+ $result = $this->getResult();
+ $count = 0;
+ foreach ( $this->select( __METHOD__ ) as $row ) {
+ if ( ++$count > $limit ) {
+ // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+ $this->setContinueEnumParameter( 'continue', $row->page_id );
+ break;
+ }
+
+ if ( $resultPageSet === null ) {
+ $vals = array();
+ if ( $fld_ids ) {
+ $vals['pageid'] = (int)$row->page_id;
+ }
+ if ( $fld_title ) {
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+ ApiQueryBase::addTitleInfo( $vals, $title );
+ }
+ if ( $fld_value ) {
+ $vals['value'] = $row->pp_value;
+ }
+ $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
+ if ( !$fit ) {
+ $this->setContinueEnumParameter( 'continue', $row->page_id );
+ break;
+ }
+ } else {
+ $resultPageSet->processDbRow( $row );
+ }
+ }
+
+ if ( $resultPageSet === null ) {
+ $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'page' );
+ }
+ }
+
+ public function getAllowedParams() {
+ return array(
+ 'propname' => array(
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true,
+ ),
+ 'prop' => array(
+ ApiBase::PARAM_DFLT => 'ids|title',
+ ApiBase::PARAM_ISMULTI => true,
+ ApiBase::PARAM_TYPE => array (
+ 'ids',
+ 'title',
+ 'value',
+ )
+ ),
+ 'continue' => null,
+ 'limit' => array(
+ ApiBase::PARAM_TYPE => 'limit',
+ ApiBase::PARAM_DFLT => 10,
+ ApiBase::PARAM_MIN => 1,
+ ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+ ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+ ),
+ 'dir' => array(
+ ApiBase::PARAM_DFLT => 'ascending',
+ ApiBase::PARAM_TYPE => array(
+ 'ascending',
+ 'descending',
+ )
+ ),
+ );
+ }
+
+ public function getParamDescription() {
+ return array(
+ 'propname' => 'Page prop for which to enumerate pages',
+ 'prop' => array(
+ 'What pieces of information to include',
+ ' ids - Adds the page ID',
+ ' title - Adds the title and namespace ID of the page',
+ ' value - Adds the value of the page prop',
+ ),
+ 'dir' => 'In which direction to sort',
+ 'continue' => 'When more results are available, use this to continue',
+ 'limit' => 'The maximum number of pages to return',
+ );
+ }
+
+ public function getDescription() {
+ return 'List all pages using a given page prop';
+ }
+
+ public function getExamples() {
+ return array(
+ 'api.php?action=query&list=pageswithprop&pwppropname=displaytitle&pwpprop=ids|title|value' => 'Get first 10 pages using {{DISPLAYTITLE:}}',
+ 'api.php?action=query&generator=pageswithprop&gpwppropname=notoc&prop=info' => 'Get page info about first 10 pages using __NOTOC__',
+ );
+ }
+
+ public function getHelpUrls() {
+ return 'https://www.mediawiki.org/wiki/API:Pageswithprop';
+ }
+}
diff --git a/includes/api/ApiQueryProtectedTitles.php b/includes/api/ApiQueryProtectedTitles.php
index 14aed28d..4aa00007 100644
--- a/includes/api/ApiQueryProtectedTitles.php
+++ b/includes/api/ApiQueryProtectedTitles.php
@@ -98,7 +98,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
$vals['user'] = $row->user_name;
}
- if ( isset( $prop['user'] ) ) {
+ if ( isset( $prop['userid'] ) || /*B/C*/isset( $prop['user'] ) ) {
$vals['userid'] = $row->pt_user;
}
@@ -231,6 +231,9 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
),
'userid' => 'integer'
),
+ 'userid' => array(
+ 'userid' => 'integer'
+ ),
'comment' => array(
'comment' => 'string'
),
@@ -261,8 +264,4 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Protectedtitles';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryQueryPage.php b/includes/api/ApiQueryQueryPage.php
index a8be26d3..b03bdfb8 100644
--- a/includes/api/ApiQueryQueryPage.php
+++ b/includes/api/ApiQueryQueryPage.php
@@ -75,6 +75,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
$params = $this->extractRequestParams();
$result = $this->getResult();
+ /** @var $qp QueryPage */
$qp = new $this->qpMap[$params['page']]();
if ( !$qp->userCanExecute( $this->getUser() ) ) {
$this->dieUsageMsg( 'specialpage-cantexecute' );
@@ -141,6 +142,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
}
public function getCacheMode( $params ) {
+ /** @var $qp QueryPage */
$qp = new $this->qpMap[$params['page']]();
if ( $qp->getRestriction() != '' ) {
return 'private';
@@ -211,7 +213,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
- array( 'specialpage-cantexecute' )
+ array( 'specialpage-cantexecute' )
) );
}
@@ -220,8 +222,4 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
'api.php?action=query&list=querypage&qppage=Ancientpages'
);
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryRandom.php b/includes/api/ApiQueryRandom.php
index ddf5841b..ae3bb893 100644
--- a/includes/api/ApiQueryRandom.php
+++ b/includes/api/ApiQueryRandom.php
@@ -33,6 +33,8 @@
class ApiQueryRandom extends ApiQueryGeneratorBase {
+ private $pageIDs;
+
public function __construct( $query, $moduleName ) {
parent::__construct( $query, $moduleName, 'rn' );
}
@@ -183,8 +185,4 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
public function getExamples() {
return 'api.php?action=query&list=random&rnnamespace=0&rnlimit=2';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryRandom.php overlordq$';
- }
}
diff --git a/includes/api/ApiQueryRecentChanges.php b/includes/api/ApiQueryRecentChanges.php
index 7ae4f371..8aceab22 100644
--- a/includes/api/ApiQueryRecentChanges.php
+++ b/includes/api/ApiQueryRecentChanges.php
@@ -105,7 +105,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
/**
* Sets internal state to include the desired properties in the output.
- * @param $prop Array associative array of properties, only keys are used here
+ * @param array $prop associative array of properties, only keys are used here
*/
public function initProperties( $prop ) {
$this->fld_comment = isset( $prop['comment'] );
@@ -149,6 +149,31 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
$this->addTables( 'recentchanges' );
$index = array( 'recentchanges' => 'rc_timestamp' ); // May change
$this->addTimestampWhereRange( 'rc_timestamp', $params['dir'], $params['start'], $params['end'] );
+
+ if ( !is_null( $params['continue'] ) ) {
+ $cont = explode( '|', $params['continue'] );
+ if ( count( $cont ) != 2 ) {
+ $this->dieUsage( 'Invalid continue param. You should pass the ' .
+ 'original value returned by the previous query', '_badcontinue' );
+ }
+
+ $timestamp = $this->getDB()->addQuotes( wfTimestamp( TS_MW, $cont[0] ) );
+ $id = intval( $cont[1] );
+ $op = $params['dir'] === 'older' ? '<' : '>';
+
+ $this->addWhere(
+ "rc_timestamp $op $timestamp OR " .
+ "(rc_timestamp = $timestamp AND " .
+ "rc_id $op= $id)"
+ );
+ }
+
+ $order = $params['dir'] === 'older' ? 'DESC' : 'ASC';
+ $this->addOption( 'ORDER BY', array(
+ "rc_timestamp $order",
+ "rc_id $order",
+ ) );
+
$this->addWhereFld( 'rc_namespace', $params['namespace'] );
$this->addWhereFld( 'rc_deleted', 0 );
@@ -214,8 +239,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
'rc_title',
'rc_cur_id',
'rc_type',
- 'rc_moved_to_ns',
- 'rc_moved_to_title',
'rc_deleted'
) );
@@ -231,12 +254,13 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
$this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
}
+ $this->addFields( 'rc_id' );
/* Add fields to our query if they are specified as a needed parameter. */
- $this->addFieldsIf( array( 'rc_id', 'rc_this_oldid', 'rc_last_oldid' ), $this->fld_ids );
+ $this->addFieldsIf( array( 'rc_this_oldid', 'rc_last_oldid' ), $this->fld_ids );
$this->addFieldsIf( 'rc_comment', $this->fld_comment || $this->fld_parsedcomment );
$this->addFieldsIf( 'rc_user', $this->fld_user );
$this->addFieldsIf( 'rc_user_text', $this->fld_user || $this->fld_userid );
- $this->addFieldsIf( array( 'rc_minor', 'rc_type', 'rc_bot' ) , $this->fld_flags );
+ $this->addFieldsIf( array( 'rc_minor', 'rc_type', 'rc_bot' ), $this->fld_flags );
$this->addFieldsIf( array( 'rc_old_len', 'rc_new_len' ), $this->fld_sizes );
$this->addFieldsIf( 'rc_patrolled', $this->fld_patrolled );
$this->addFieldsIf( array( 'rc_logid', 'rc_log_type', 'rc_log_action', 'rc_params' ), $this->fld_loginfo );
@@ -262,7 +286,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
if ( !is_null( $params['tag'] ) ) {
$this->addTables( 'change_tag' );
$this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN', array( 'rc_id=ct_rc_id' ) ) ) );
- $this->addWhereFld( 'ct_tag' , $params['tag'] );
+ $this->addWhereFld( 'ct_tag', $params['tag'] );
global $wgOldChangeTagsIndex;
$index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
}
@@ -283,7 +307,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
foreach ( $res as $row ) {
if ( ++ $count > $params['limit'] ) {
// We've reached the one extra which shows that there are additional pages to be had. Stop here...
- $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
+ $this->setContinueEnumParameter( 'continue', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) . '|' . $row->rc_id );
break;
}
@@ -297,7 +321,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
}
$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
if ( !$fit ) {
- $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) );
+ $this->setContinueEnumParameter( 'continue', wfTimestamp( TS_ISO_8601, $row->rc_timestamp ) . '|' . $row->rc_id );
break;
}
} else {
@@ -316,17 +340,11 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
/**
* Extracts from a single sql row the data needed to describe one recent change.
*
- * @param $row The row from which to extract the data.
+ * @param mixed $row The row from which to extract the data.
* @return array An array mapping strings (descriptors) to their respective string values.
* @access public
*/
public function extractRowInfo( $row ) {
- /* If page was moved somewhere, get the title of the move target. */
- $movedToTitle = false;
- if ( isset( $row->rc_moved_to_title ) && $row->rc_moved_to_title !== '' ) {
- $movedToTitle = Title::makeTitle( $row->rc_moved_to_ns, $row->rc_moved_to_title );
- }
-
/* Determine the title of the page that has been changed. */
$title = Title::makeTitle( $row->rc_namespace, $row->rc_title );
@@ -349,6 +367,9 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
case RC_LOG:
$vals['type'] = 'log';
break;
+ case RC_EXTERNAL:
+ $vals['type'] = 'external';
+ break;
case RC_MOVE_OVER_REDIRECT:
$vals['type'] = 'move over redirect';
break;
@@ -359,9 +380,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
/* Create a new entry in the result for the title. */
if ( $this->fld_title ) {
ApiQueryBase::addTitleInfo( $vals, $title );
- if ( $movedToTitle ) {
- ApiQueryBase::addTitleInfo( $vals, $movedToTitle, 'new_' );
- }
}
/* Add ids, such as rcid, pageid, revid, and oldid to the change's info. */
@@ -488,6 +506,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
return RC_NEW;
case 'log':
return RC_LOG;
+ case 'external':
+ return RC_EXTERNAL;
}
}
@@ -584,11 +604,13 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
ApiBase::PARAM_ISMULTI => true,
ApiBase::PARAM_TYPE => array(
'edit',
+ 'external',
'new',
'log'
)
),
'toponly' => false,
+ 'continue' => null,
);
}
@@ -626,6 +648,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
'limit' => 'How many total changes to return',
'tag' => 'Only list changes tagged with this tag',
'toponly' => 'Only list changes which are the latest revision',
+ 'continue' => 'When more results are available, use this to continue',
);
}
@@ -741,8 +764,4 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Recentchanges';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php
index b89a8ea9..192fe873 100644
--- a/includes/api/ApiQueryRevisions.php
+++ b/includes/api/ApiQueryRevisions.php
@@ -34,15 +34,15 @@
class ApiQueryRevisions extends ApiQueryBase {
private $diffto, $difftotext, $expandTemplates, $generateXML, $section,
- $token, $parseContent;
+ $token, $parseContent, $contentFormat;
public function __construct( $query, $moduleName ) {
parent::__construct( $query, $moduleName, 'rv' );
}
- private $fld_ids = false, $fld_flags = false, $fld_timestamp = false, $fld_size = false,
+ private $fld_ids = false, $fld_flags = false, $fld_timestamp = false, $fld_size = false, $fld_sha1 = false,
$fld_comment = false, $fld_parsedcomment = false, $fld_user = false, $fld_userid = false,
- $fld_content = false, $fld_tags = false;
+ $fld_content = false, $fld_tags = false, $fld_contentmodel = false;
private $tokenFunctions;
@@ -95,7 +95,6 @@ class ApiQueryRevisions extends ApiQueryBase {
!is_null( $params['endid'] ) || $params['dir'] === 'newer' ||
!is_null( $params['start'] ) || !is_null( $params['end'] ) );
-
$pageSet = $this->getPageSet();
$pageCount = $pageSet->getGoodTitleCount();
$revCount = $pageSet->getRevisionCount();
@@ -155,15 +154,20 @@ class ApiQueryRevisions extends ApiQueryBase {
$this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
$this->fld_size = isset ( $prop['size'] );
$this->fld_sha1 = isset ( $prop['sha1'] );
+ $this->fld_contentmodel = isset ( $prop['contentmodel'] );
$this->fld_userid = isset( $prop['userid'] );
$this->fld_user = isset ( $prop['user'] );
$this->token = $params['token'];
+ if ( !empty( $params['contentformat'] ) ) {
+ $this->contentFormat = $params['contentformat'];
+ }
+
// Possible indexes used
$index = array();
$userMax = ( $this->fld_content ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1 );
- $botMax = ( $this->fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2 );
+ $botMax = ( $this->fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2 );
$limit = $params['limit'];
if ( $limit == 'max' ) {
$limit = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
@@ -184,15 +188,17 @@ class ApiQueryRevisions extends ApiQueryBase {
if ( !is_null( $params['tag'] ) ) {
$this->addTables( 'change_tag' );
$this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN', array( 'rev_id=ct_rev_id' ) ) ) );
- $this->addWhereFld( 'ct_tag' , $params['tag'] );
+ $this->addWhereFld( 'ct_tag', $params['tag'] );
global $wgOldChangeTagsIndex;
$index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
}
if ( isset( $prop['content'] ) || !is_null( $this->difftotext ) ) {
// For each page we will request, the user must have read rights for that page
+ $user = $this->getUser();
+ /** @var $title Title */
foreach ( $pageSet->getGoodTitles() as $title ) {
- if ( !$title->userCan( 'read' ) ) {
+ if ( !$title->userCan( 'read', $user ) ) {
$this->dieUsage(
'The current user is not allowed to read ' . $title->getPrefixedText(),
'accessdenied' );
@@ -255,7 +261,7 @@ class ApiQueryRevisions extends ApiQueryBase {
// rvstart and rvstartid when that is supplied.
if ( !is_null( $params['continue'] ) ) {
$params['startid'] = $params['continue'];
- unset( $params['start'] );
+ $params['start'] = null;
}
// This code makes an assumption that sorting by rev_id and rev_timestamp produces
@@ -332,10 +338,7 @@ class ApiQueryRevisions extends ApiQueryBase {
if ( !is_null( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the original ' .
- 'value returned by the previous query', '_badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 2 );
$pageid = intval( $cont[0] );
$revid = intval( $cont[1] );
$this->addWhere(
@@ -433,12 +436,18 @@ class ApiQueryRevisions extends ApiQueryBase {
}
}
- if ( $this->fld_sha1 ) {
+ if ( $this->fld_sha1 && !$revision->isDeleted( Revision::DELETED_TEXT ) ) {
if ( $revision->getSha1() != '' ) {
$vals['sha1'] = wfBaseConvert( $revision->getSha1(), 36, 16, 40 );
} else {
$vals['sha1'] = '';
}
+ } elseif ( $this->fld_sha1 ) {
+ $vals['sha1hidden'] = '';
+ }
+
+ if ( $this->fld_contentmodel ) {
+ $vals['contentmodel'] = $revision->getContentModel();
}
if ( $this->fld_comment || $this->fld_parsedcomment ) {
@@ -479,55 +488,121 @@ class ApiQueryRevisions extends ApiQueryBase {
}
}
- $text = null;
+ $content = null;
global $wgParser;
- if ( $this->fld_content || !is_null( $this->difftotext ) ) {
- $text = $revision->getText();
+ if ( $this->fld_content || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
+ $content = $revision->getContent();
// Expand templates after getting section content because
// template-added sections don't count and Parser::preprocess()
// will have less input
- if ( $this->section !== false ) {
- $text = $wgParser->getSection( $text, $this->section, false );
- if ( $text === false ) {
+ if ( $content && $this->section !== false ) {
+ $content = $content->getSection( $this->section, false );
+ if ( !$content ) {
$this->dieUsage( "There is no section {$this->section} in r" . $revision->getId(), 'nosuchsection' );
}
}
}
- if ( $this->fld_content && !$revision->isDeleted( Revision::DELETED_TEXT ) ) {
+ if ( $this->fld_content && $content && !$revision->isDeleted( Revision::DELETED_TEXT ) ) {
+ $text = null;
+
if ( $this->generateXML ) {
- $wgParser->startExternalParse( $title, ParserOptions::newFromContext( $this->getContext() ), OT_PREPROCESS );
- $dom = $wgParser->preprocessToDom( $text );
- if ( is_callable( array( $dom, 'saveXML' ) ) ) {
- $xml = $dom->saveXML();
+ if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
+ $t = $content->getNativeData(); # note: don't set $text
+
+ $wgParser->startExternalParse( $title, ParserOptions::newFromContext( $this->getContext() ), OT_PREPROCESS );
+ $dom = $wgParser->preprocessToDom( $t );
+ if ( is_callable( array( $dom, 'saveXML' ) ) ) {
+ $xml = $dom->saveXML();
+ } else {
+ $xml = $dom->__toString();
+ }
+ $vals['parsetree'] = $xml;
} else {
- $xml = $dom->__toString();
+ $this->setWarning( "Conversion to XML is supported for wikitext only, " .
+ $title->getPrefixedDBkey() .
+ " uses content model " . $content->getModel() . ")" );
}
- $vals['parsetree'] = $xml;
-
}
+
if ( $this->expandTemplates && !$this->parseContent ) {
- $text = $wgParser->preprocess( $text, $title, ParserOptions::newFromContext( $this->getContext() ) );
+ #XXX: implement template expansion for all content types in ContentHandler?
+ if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
+ $text = $content->getNativeData();
+
+ $text = $wgParser->preprocess( $text, $title, ParserOptions::newFromContext( $this->getContext() ) );
+ } else {
+ $this->setWarning( "Template expansion is supported for wikitext only, " .
+ $title->getPrefixedDBkey() .
+ " uses content model " . $content->getModel() . ")" );
+
+ $text = false;
+ }
}
if ( $this->parseContent ) {
- $text = $wgParser->parse( $text, $title, ParserOptions::newFromContext( $this->getContext() ) )->getText();
+ $po = $content->getParserOutput( $title, $revision->getId(), ParserOptions::newFromContext( $this->getContext() ) );
+ $text = $po->getText();
+ }
+
+ if ( $text === null ) {
+ $format = $this->contentFormat ? $this->contentFormat : $content->getDefaultFormat();
+ $model = $content->getModel();
+
+ if ( !$content->isSupportedFormat( $format ) ) {
+ $name = $title->getPrefixedDBkey();
+
+ $this->dieUsage( "The requested format {$this->contentFormat} is not supported ".
+ "for content model $model used by $name", 'badformat' );
+ }
+
+ $text = $content->serialize( $format );
+
+ // always include format and model.
+ // Format is needed to deserialize, model is needed to interpret.
+ $vals['contentformat'] = $format;
+ $vals['contentmodel'] = $model;
+ }
+
+ if ( $text !== false ) {
+ ApiResult::setContent( $vals, $text );
}
- ApiResult::setContent( $vals, $text );
} elseif ( $this->fld_content ) {
- $vals['texthidden'] = '';
+ if ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
+ $vals['texthidden'] = '';
+ } else {
+ $vals['textmissing'] = '';
+ }
}
if ( !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
global $wgAPIMaxUncachedDiffs;
static $n = 0; // Number of uncached diffs we've had
- if ( $n < $wgAPIMaxUncachedDiffs ) {
+
+ if ( is_null( $content ) ) {
+ $vals['textmissing'] = '';
+ } elseif ( $n < $wgAPIMaxUncachedDiffs ) {
$vals['diff'] = array();
$context = new DerivativeContext( $this->getContext() );
$context->setTitle( $title );
+ $handler = $revision->getContentHandler();
+
if ( !is_null( $this->difftotext ) ) {
- $engine = new DifferenceEngine( $context );
- $engine->setText( $text, $this->difftotext );
+ $model = $title->getContentModel();
+
+ if ( $this->contentFormat
+ && !ContentHandler::getForModelID( $model )->isSupportedFormat( $this->contentFormat ) ) {
+
+ $name = $title->getPrefixedDBkey();
+
+ $this->dieUsage( "The requested format {$this->contentFormat} is not supported for ".
+ "content model $model used by $name", 'badformat' );
+ }
+
+ $difftocontent = ContentHandler::makeContent( $this->difftotext, $title, $model, $this->contentFormat );
+
+ $engine = $handler->createDifferenceEngine( $context );
+ $engine->setContent( $content, $difftocontent );
} else {
- $engine = new DifferenceEngine( $context, $revision->getID(), $this->diffto );
+ $engine = $handler->createDifferenceEngine( $context, $revision->getID(), $this->diffto );
$vals['diff']['from'] = $engine->getOldid();
$vals['diff']['to'] = $engine->getNewid();
}
@@ -567,6 +642,7 @@ class ApiQueryRevisions extends ApiQueryBase {
'userid',
'size',
'sha1',
+ 'contentmodel',
'comment',
'parsedcomment',
'content',
@@ -616,6 +692,10 @@ class ApiQueryRevisions extends ApiQueryBase {
'continue' => null,
'diffto' => null,
'difftotext' => null,
+ 'contentformat' => array(
+ ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
+ ApiBase::PARAM_DFLT => null
+ ),
);
}
@@ -631,6 +711,7 @@ class ApiQueryRevisions extends ApiQueryBase {
' userid - User id of revision creator',
' size - Length (bytes) of the revision',
' sha1 - SHA-1 (base 16) of the revision',
+ ' contentmodel - Content model id',
' comment - Comment by the user for revision',
' parsedcomment - Parsed comment by the user for the revision',
' content - Text of the revision',
@@ -644,9 +725,10 @@ class ApiQueryRevisions extends ApiQueryBase {
'dir' => $this->getDirectionDescription( $p, ' (enum)' ),
'user' => 'Only include revisions made by user (enum)',
'excludeuser' => 'Exclude revisions made by user (enum)',
- 'expandtemplates' => 'Expand templates in revision content',
- 'generatexml' => 'Generate XML parse tree for revision content',
- 'parse' => 'Parse revision content. For performance reasons if this option is used, rvlimit is enforced to 1.',
+ 'expandtemplates' => "Expand templates in revision content (requires {$p}prop=content)",
+ 'generatexml' => "Generate XML parse tree for revision content (requires {$p}prop=content)",
+ 'parse' => array( "Parse revision content (requires {$p}prop=content).",
+ 'For performance reasons if this option is used, rvlimit is enforced to 1.' ),
'section' => 'Only retrieve the content of this section number',
'token' => 'Which tokens to obtain for each revision',
'continue' => 'When more results are available, use this to continue',
@@ -655,6 +737,7 @@ class ApiQueryRevisions extends ApiQueryBase {
'difftotext' => array( 'Text to diff each revision to. Only diffs a limited number of revisions.',
"Overrides {$p}diffto. If {$p}section is set, only that section will be diffed against this text" ),
'tag' => 'Only list revisions tagged with this tag',
+ 'contentformat' => 'Serialization format used for difftotext and expected for output of content',
);
}
@@ -709,8 +792,12 @@ class ApiQueryRevisions extends ApiQueryBase {
ApiBase::PROP_TYPE => 'string',
ApiBase::PROP_NULLABLE => true
),
- 'texthidden' => 'boolean'
- )
+ 'texthidden' => 'boolean',
+ 'textmissing' => 'boolean',
+ ),
+ 'contentmodel' => array(
+ 'contentmodel' => 'string'
+ ),
);
self::addTokenProperties( $props, $this->getTokenFunctions() );
@@ -732,13 +819,18 @@ class ApiQueryRevisions extends ApiQueryBase {
public function getPossibleErrors() {
return array_merge( parent::getPossibleErrors(), array(
array( 'nosuchrevid', 'diffto' ),
- array( 'code' => 'revids', 'info' => 'The revids= parameter may not be used with the list options (limit, startid, endid, dirNewer, start, end).' ),
- array( 'code' => 'multpages', 'info' => 'titles, pageids or a generator was used to supply multiple pages, but the limit, startid, endid, dirNewer, user, excludeuser, start and end parameters may only be used on a single page.' ),
+ array( 'code' => 'revids', 'info' => 'The revids= parameter may not be used with the list options '
+ . '(limit, startid, endid, dirNewer, start, end).' ),
+ array( 'code' => 'multpages', 'info' => 'titles, pageids or a generator was used to supply multiple pages, '
+ . ' but the limit, startid, endid, dirNewer, user, excludeuser, '
+ . 'start and end parameters may only be used on a single page.' ),
array( 'code' => 'diffto', 'info' => 'rvdiffto must be set to a non-negative number, "prev", "next" or "cur"' ),
array( 'code' => 'badparams', 'info' => 'start and startid cannot be used together' ),
array( 'code' => 'badparams', 'info' => 'end and endid cannot be used together' ),
array( 'code' => 'badparams', 'info' => 'user and excludeuser cannot be used together' ),
array( 'code' => 'nosuchsection', 'info' => 'There is no section section in rID' ),
+ array( 'code' => 'badformat', 'info' => 'The requested serialization format can not be applied '
+ . ' to the page\'s content model' ),
) );
}
@@ -762,8 +854,4 @@ class ApiQueryRevisions extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Properties#revisions_.2F_rv';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQuerySearch.php b/includes/api/ApiQuerySearch.php
index 364433d5..86183391 100644
--- a/includes/api/ApiQuerySearch.php
+++ b/includes/api/ApiQuerySearch.php
@@ -168,7 +168,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
}
}
if ( isset( $prop['hasrelated'] ) && $result->hasRelated() ) {
- $vals['hasrelated'] = "";
+ $vals['hasrelated'] = '';
}
// Add item to results and see whether it fits
@@ -205,7 +205,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
ApiBase::PARAM_REQUIRED => true
),
'namespace' => array(
- ApiBase::PARAM_DFLT => 0,
+ ApiBase::PARAM_DFLT => NS_MAIN,
ApiBase::PARAM_TYPE => 'namespace',
ApiBase::PARAM_ISMULTI => true,
),
@@ -359,8 +359,4 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Search';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQuerySiteinfo.php b/includes/api/ApiQuerySiteinfo.php
index ec503d64..810e1d6b 100644
--- a/includes/api/ApiQuerySiteinfo.php
+++ b/includes/api/ApiQuerySiteinfo.php
@@ -96,6 +96,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
case 'variables':
$fit = $this->appendVariables( $p );
break;
+ case 'protocols':
+ $fit = $this->appendProtocols( $p );
+ break;
default:
ApiBase::dieDebug( __METHOD__, "Unknown prop=$p" );
}
@@ -111,7 +114,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
}
protected function appendGeneralInfo( $property ) {
- global $wgContLang;
+ global $wgContLang,
+ $wgDisableLangConversion,
+ $wgDisableTitleConversion;
$data = array();
$mainPage = Title::newMainPage();
@@ -120,10 +125,31 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$data['sitename'] = $GLOBALS['wgSitename'];
$data['generator'] = "MediaWiki {$GLOBALS['wgVersion']}";
$data['phpversion'] = phpversion();
- $data['phpsapi'] = php_sapi_name();
+ $data['phpsapi'] = PHP_SAPI;
$data['dbtype'] = $GLOBALS['wgDBtype'];
$data['dbversion'] = $this->getDB()->getServerVersion();
+ if ( !$wgDisableLangConversion ) {
+ $data['langconversion'] = '';
+ }
+
+ if ( !$wgDisableTitleConversion ) {
+ $data['titleconversion'] = '';
+ }
+
+ if ( $wgContLang->linkPrefixExtension() ) {
+ $data['linkprefix'] = wfMessage( 'linkprefix' )->inContentLanguage()->text();
+ } else {
+ $data['linkprefix'] = '';
+ }
+
+ $linktrail = $wgContLang->linkTrail();
+ if ( $linktrail ) {
+ $data['linktrail'] = $linktrail;
+ } else {
+ $data['linktrail'] = '';
+ }
+
$git = SpecialVersion::getGitHeadSha1( $GLOBALS['IP'] );
if ( $git ) {
$data['git-hash'] = $git;
@@ -227,6 +253,11 @@ class ApiQuerySiteinfo extends ApiQueryBase {
if ( MWNamespace::isNonincludable( $ns ) ) {
$data[$ns]['nonincludable'] = '';
}
+
+ $contentmodel = MWNamespace::getNamespaceContentModel( $ns );
+ if ( $contentmodel ) {
+ $data[$ns]['defaultcontentmodel'] = $contentmodel;
+ }
}
$this->getResult()->setIndexedTagName( $data, 'ns' );
@@ -345,7 +376,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
);
}
} else {
- list( $host, $lag, $index ) = $lb->getMaxLag();
+ list( , $lag, $index ) = $lb->getMaxLag();
$data[] = array(
'host' => $wgShowHostnames
? $lb->getServerName( $index )
@@ -457,7 +488,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
}
if ( isset( $ext['author'] ) ) {
$ret['author'] = is_array( $ext['author'] ) ?
- implode( ', ', $ext['author' ] ) : $ext['author'];
+ implode( ', ', $ext['author'] ) : $ext['author'];
}
if ( isset( $ext['url'] ) ) {
$ret['url'] = $ext['url'];
@@ -525,7 +556,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
public function appendExtensionTags( $property ) {
global $wgParser;
$wgParser->firstCallInit();
- $tags = array_map( array( $this, 'formatParserTags'), $wgParser->getTags() );
+ $tags = array_map( array( $this, 'formatParserTags' ), $wgParser->getTags() );
$this->getResult()->setIndexedTagName( $tags, 't' );
return $this->getResult()->addValue( 'query', $property, $tags );
}
@@ -544,6 +575,14 @@ class ApiQuerySiteinfo extends ApiQueryBase {
return $this->getResult()->addValue( 'query', $property, $variables );
}
+ public function appendProtocols( $property ) {
+ global $wgUrlProtocols;
+ // Make a copy of the global so we don't try to set the _element key of it - bug 45130
+ $protocols = array_values( $wgUrlProtocols );
+ $this->getResult()->setIndexedTagName( $protocols, 'p' );
+ return $this->getResult()->addValue( 'query', $property, $protocols );
+ }
+
private function formatParserTags( $item ) {
return "<{$item}>";
}
@@ -554,7 +593,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
ksort( $myWgHooks );
$data = array();
- foreach ( $myWgHooks as $hook => $hooks ) {
+ foreach ( $myWgHooks as $hook => $hooks ) {
$arr = array(
'name' => $hook,
'subscribers' => array_map( array( 'SpecialVersion', 'arrayToString' ), $hooks ),
@@ -596,6 +635,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
'functionhooks',
'showhooks',
'variables',
+ 'protocols',
)
),
'filteriw' => array(
@@ -633,6 +673,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
' functionhooks - Returns a list of parser function hooks',
' showhooks - Returns a list of all subscribed hooks (contents of $wgHooks)',
' variables - Returns a list of variable IDs',
+ ' protocols - Returns a list of protocols that are allowed in external links.',
),
'filteriw' => 'Return only local or only nonlocal entries of the interwiki map',
'showalldb' => 'List all database servers, not just the one lagging the most',
@@ -662,8 +703,4 @@ class ApiQuerySiteinfo extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Meta#siteinfo_.2F_si';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryStashImageInfo.php b/includes/api/ApiQueryStashImageInfo.php
index a310d109..6899375a 100644
--- a/includes/api/ApiQueryStashImageInfo.php
+++ b/includes/api/ApiQueryStashImageInfo.php
@@ -42,7 +42,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
$result = $this->getResult();
if ( !$params['filekey'] && !$params['sessionkey'] ) {
- $this->dieUsage( "One of filekey or sessionkey must be supplied", 'nofilekey');
+ $this->dieUsage( "One of filekey or sessionkey must be supplied", 'nofilekey' );
}
// Alias sessionkey to filekey, but give an existing filekey precedence.
@@ -138,9 +138,4 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
);
}
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
-
}
-
diff --git a/includes/api/ApiQueryTags.php b/includes/api/ApiQueryTags.php
index f97c1b2a..e0637ff7 100644
--- a/includes/api/ApiQueryTags.php
+++ b/includes/api/ApiQueryTags.php
@@ -162,7 +162,7 @@ class ApiQueryTags extends ApiQueryBase {
'prop' => array(
'Which properties to get',
' name - Adds name of tag',
- ' displayname - Adds system messsage for the tag',
+ ' displayname - Adds system message for the tag',
' description - Adds description of the tag',
' hitcount - Adds the amount of revisions that have this tag',
),
@@ -195,8 +195,4 @@ class ApiQueryTags extends ApiQueryBase {
'api.php?action=query&list=tags&tgprop=displayname|description|hitcount'
);
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryUserContributions.php b/includes/api/ApiQueryUserContributions.php
index f30b1325..597c412d 100644
--- a/includes/api/ApiQueryUserContributions.php
+++ b/includes/api/ApiQueryUserContributions.php
@@ -160,10 +160,7 @@ class ApiQueryContributions extends ApiQueryBase {
// Handle continue parameter
if ( $this->multiUserMode && !is_null( $this->params['continue'] ) ) {
$continue = explode( '|', $this->params['continue'] );
- if ( count( $continue ) != 2 ) {
- $this->dieUsage( 'Invalid continue param. You should pass the original ' .
- 'value returned by the previous query', '_badcontinue' );
- }
+ $this->dieContinueUsageIf( count( $continue ) != 2 );
$db = $this->getDB();
$encUser = $db->addQuotes( $continue[0] );
$encTS = $db->addQuotes( $db->timestamp( $continue[1] ) );
@@ -223,7 +220,7 @@ class ApiQueryContributions extends ApiQueryBase {
) );
if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ||
- $this->fld_patrolled ) {
+ $this->fld_patrolled ) {
if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) {
$this->dieUsage( 'You need the patrol right to request the patrolled flag', 'permissiondenied' );
}
@@ -445,7 +442,7 @@ class ApiQueryContributions extends ApiQueryBase {
'end' => 'The end timestamp to return to',
'continue' => 'When more results are available, use this to continue',
'user' => 'The users to retrieve contributions for',
- 'userprefix' => "Retrieve contibutions for all users whose names begin with this value. Overrides {$p}user",
+ 'userprefix' => "Retrieve contributions for all users whose names begin with this value. Overrides {$p}user",
'dir' => $this->getDirectionDescription( $p ),
'namespace' => 'Only list contributions in these namespaces',
'prop' => array(
@@ -546,8 +543,4 @@ class ApiQueryContributions extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Usercontribs';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryUserInfo.php b/includes/api/ApiQueryUserInfo.php
index 66906659..1a491eca 100644
--- a/includes/api/ApiQueryUserInfo.php
+++ b/includes/api/ApiQueryUserInfo.php
@@ -77,18 +77,18 @@ class ApiQueryUserInfo extends ApiQueryBase {
if ( isset( $this->prop['groups'] ) ) {
$vals['groups'] = $user->getEffectiveGroups();
- $result->setIndexedTagName( $vals['groups'], 'g' ); // even if empty
+ $result->setIndexedTagName( $vals['groups'], 'g' ); // even if empty
}
if ( isset( $this->prop['implicitgroups'] ) ) {
$vals['implicitgroups'] = $user->getAutomaticGroups();
- $result->setIndexedTagName( $vals['implicitgroups'], 'g' ); // even if empty
+ $result->setIndexedTagName( $vals['implicitgroups'], 'g' ); // even if empty
}
if ( isset( $this->prop['rights'] ) ) {
// User::getRights() may return duplicate values, strip them
$vals['rights'] = array_values( array_unique( $user->getRights() ) );
- $result->setIndexedTagName( $vals['rights'], 'r' ); // even if empty
+ $result->setIndexedTagName( $vals['rights'], 'r' ); // even if empty
}
if ( isset( $this->prop['changeablegroups'] ) ) {
@@ -303,8 +303,4 @@ class ApiQueryUserInfo extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Meta#userinfo_.2F_ui';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryUsers.php b/includes/api/ApiQueryUsers.php
index bf438d1d..72ab7866 100644
--- a/includes/api/ApiQueryUsers.php
+++ b/includes/api/ApiQueryUsers.php
@@ -110,19 +110,39 @@ class ApiQueryUsers extends ApiQueryBase {
$this->addFields( User::selectFields() );
$this->addWhereFld( 'user_name', $goodNames );
- if ( isset( $this->prop['groups'] ) || isset( $this->prop['rights'] ) ) {
- $this->addTables( 'user_groups' );
- $this->addJoinConds( array( 'user_groups' => array( 'LEFT JOIN', 'ug_user=user_id' ) ) );
- $this->addFields( 'ug_group' );
- }
-
$this->showHiddenUsersAddBlockInfo( isset( $this->prop['blockinfo'] ) );
$data = array();
$res = $this->select( __METHOD__ );
+ $this->resetQueryParams();
+
+ // get user groups if needed
+ if ( isset( $this->prop['groups'] ) || isset( $this->prop['rights'] ) ) {
+ $userGroups = array();
+
+ $this->addTables( 'user' );
+ $this->addWhereFld( 'user_name', $goodNames );
+ $this->addTables( 'user_groups' );
+ $this->addJoinConds( array( 'user_groups' => array( 'INNER JOIN', 'ug_user=user_id' ) ) );
+ $this->addFields( array( 'user_name', 'ug_group' ) );
+ $userGroupsRes = $this->select( __METHOD__ );
+
+ foreach( $userGroupsRes as $row ) {
+ $userGroups[$row->user_name][] = $row->ug_group;
+ }
+ }
foreach ( $res as $row ) {
- $user = User::newFromRow( $row );
+ // create user object and pass along $userGroups if set
+ // that reduces the number of database queries needed in User dramatically
+ if ( !isset( $userGroups ) ) {
+ $user = User::newFromRow( $row );
+ } else {
+ if ( !isset( $userGroups[$row->user_name] ) || !is_array( $userGroups[$row->user_name] ) ) {
+ $userGroups[$row->user_name] = array();
+ }
+ $user = User::newFromRow( $row, array( 'user_groups' => $userGroups[$row->user_name] ) );
+ }
$name = $user->getName();
$data[$name]['userid'] = $user->getId();
@@ -137,29 +157,15 @@ class ApiQueryUsers extends ApiQueryBase {
}
if ( isset( $this->prop['groups'] ) ) {
- if ( !isset( $data[$name]['groups'] ) ) {
- $data[$name]['groups'] = $user->getAutomaticGroups();
- }
-
- if ( !is_null( $row->ug_group ) ) {
- // This row contains only one group, others will be added from other rows
- $data[$name]['groups'][] = $row->ug_group;
- }
+ $data[$name]['groups'] = $user->getEffectiveGroups();
}
- if ( isset( $this->prop['implicitgroups'] ) && !isset( $data[$name]['implicitgroups'] ) ) {
- $data[$name]['implicitgroups'] = $user->getAutomaticGroups();
+ if ( isset( $this->prop['implicitgroups'] ) ) {
+ $data[$name]['implicitgroups'] = $user->getAutomaticGroups();
}
if ( isset( $this->prop['rights'] ) ) {
- if ( !isset( $data[$name]['rights'] ) ) {
- $data[$name]['rights'] = User::getGroupPermissions( $user->getAutomaticGroups() );
- }
-
- if ( !is_null( $row->ug_group ) ) {
- $data[$name]['rights'] = array_unique( array_merge( $data[$name]['rights'],
- User::getGroupPermissions( array( $row->ug_group ) ) ) );
- }
+ $data[$name]['rights'] = $user->getRights();
}
if ( $row->ipb_deleted ) {
$data[$name]['hidden'] = '';
@@ -244,16 +250,16 @@ class ApiQueryUsers extends ApiQueryBase {
}
$done[] = $u;
}
- return $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'user' );
+ $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'user' );
}
/**
- * Gets all the groups that a user is automatically a member of (implicit groups)
- *
- * @deprecated since 1.20; call User::getAutomaticGroups() directly.
- * @param $user User
- * @return array
- */
+ * Gets all the groups that a user is automatically a member of (implicit groups)
+ *
+ * @deprecated since 1.20; call User::getAutomaticGroups() directly.
+ * @param $user User
+ * @return array
+ */
public static function getAutoGroups( $user ) {
wfDeprecated( __METHOD__, '1.20' );
@@ -304,7 +310,7 @@ class ApiQueryUsers extends ApiQueryBase {
' rights - Lists all the rights the user(s) has',
' editcount - Adds the user\'s edit count',
' registration - Adds the user\'s registration timestamp',
- ' emailable - Tags if the user can and wants to receive e-mail through [[Special:Emailuser]]',
+ ' emailable - Tags if the user can and wants to receive email through [[Special:Emailuser]]',
' gender - Tags the gender of the user. Returns "male", "female", or "unknown"',
),
'users' => 'A list of users to obtain the same information for',
@@ -390,8 +396,4 @@ class ApiQueryUsers extends ApiQueryBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Users';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryWatchlist.php b/includes/api/ApiQueryWatchlist.php
index a1a33728..90b12c14 100644
--- a/includes/api/ApiQueryWatchlist.php
+++ b/includes/api/ApiQueryWatchlist.php
@@ -116,7 +116,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
) );
$userId = $user->getId();
- $this->addJoinConds( array( 'watchlist' => array('INNER JOIN',
+ $this->addJoinConds( array( 'watchlist' => array( 'INNER JOIN',
array(
'wl_user' => $userId,
'wl_namespace=rc_namespace',
@@ -240,14 +240,16 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
if ( $this->fld_user || $this->fld_userid ) {
- if ( $this->fld_user ) {
- $vals['user'] = $row->rc_user_text;
- }
-
if ( $this->fld_userid ) {
+ $vals['userid'] = $row->rc_user;
+ // for backwards compatibility
$vals['user'] = $row->rc_user;
}
+ if ( $this->fld_user ) {
+ $vals['user'] = $row->rc_user_text;
+ }
+
if ( !$row->rc_user ) {
$vals['anon'] = '';
}
@@ -511,15 +513,11 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
'api.php?action=query&list=watchlist&wlallrev=&wlprop=ids|title|timestamp|user|comment',
'api.php?action=query&generator=watchlist&prop=info',
'api.php?action=query&generator=watchlist&gwlallrev=&prop=revisions&rvprop=timestamp|user',
- 'api.php?action=query&list=watchlist&wlowner=Bob_Smith&wltoken=d8d562e9725ea1512894cdab28e5ceebc7f20237'
+ 'api.php?action=query&list=watchlist&wlowner=Bob_Smith&wltoken=123ABC'
);
}
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Watchlist';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiQueryWatchlistRaw.php b/includes/api/ApiQueryWatchlistRaw.php
index 6b24aef3..2cb4d9eb 100644
--- a/includes/api/ApiQueryWatchlistRaw.php
+++ b/includes/api/ApiQueryWatchlistRaw.php
@@ -71,11 +71,9 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
if ( isset( $params['continue'] ) ) {
$cont = explode( '|', $params['continue'] );
- if ( count( $cont ) != 2 ) {
- $this->dieUsage( "Invalid continue param. You should pass the " .
- "original value returned by the previous query", "_badcontinue" );
- }
+ $this->dieContinueUsageIf( count( $cont ) != 2 );
$ns = intval( $cont[0] );
+ $this->dieContinueUsageIf( strval( $ns ) !== $cont[0] );
$title = $this->getDB()->addQuotes( $cont[1] );
$op = $params['dir'] == 'ascending' ? '>' : '<';
$this->addWhere(
@@ -224,8 +222,4 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
'api.php?action=query&generator=watchlistraw&gwrshow=changed&prop=revisions',
);
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiResult.php b/includes/api/ApiResult.php
index 91e20812..39c114b8 100644
--- a/includes/api/ApiResult.php
+++ b/includes/api/ApiResult.php
@@ -36,13 +36,26 @@
* There are two special key values that change how XML output is generated:
* '_element' This key sets the tag name for the rest of the elements in the current array.
* It is only inserted if the formatter returned true for getNeedsRawData()
- * '*' This key has special meaning only to the XML formatter, and is outputed as is
- * for all others. In XML it becomes the content of the current element.
+ * '*' This key has special meaning only to the XML formatter, and is outputted as is
+ * for all others. In XML it becomes the content of the current element.
*
* @ingroup API
*/
class ApiResult extends ApiBase {
+ /**
+ * override existing value in addValue() and setElement()
+ * @since 1.21
+ */
+ const OVERRIDE = 1;
+
+ /**
+ * For addValue() and setElement(), if the value does not exist, add it as the first element.
+ * In case the new value has no name (numerical index), all indexes will be renumbered.
+ * @since 1.21
+ */
+ const ADD_ON_TOP = 2;
+
private $mData, $mIsRawMode, $mSize, $mCheckingSize;
/**
@@ -134,18 +147,27 @@ class ApiResult extends ApiBase {
/**
* Add an output value to the array by name.
* Verifies that value with the same name has not been added before.
- * @param $arr array to add $value to
- * @param $name string Index of $arr to add $value at
+ * @param array $arr to add $value to
+ * @param string $name Index of $arr to add $value at
* @param $value mixed
- * @param $overwrite bool Whether overwriting an existing element is allowed
+ * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP. This parameter used to be
+ * boolean, and the value of OVERRIDE=1 was specifically chosen so that it would be backwards
+ * compatible with the new method signature.
+ *
+ * @since 1.21 int $flags replaced boolean $override
*/
- public static function setElement( &$arr, $name, $value, $overwrite = false ) {
+ public static function setElement( &$arr, $name, $value, $flags = 0 ) {
if ( $arr === null || $name === null || $value === null || !is_array( $arr ) || is_array( $name ) ) {
ApiBase::dieDebug( __METHOD__, 'Bad parameter' );
}
- if ( !isset ( $arr[$name] ) || $overwrite ) {
- $arr[$name] = $value;
+ $exists = isset( $arr[$name] );
+ if ( !$exists || ( $flags & ApiResult::OVERRIDE ) ) {
+ if ( !$exists && ( $flags & ApiResult::ADD_ON_TOP ) ) {
+ $arr = array( $name => $value ) + $arr;
+ } else {
+ $arr[$name] = $value;
+ }
} elseif ( is_array( $arr[$name] ) && is_array( $value ) ) {
$merged = array_intersect_key( $arr[$name], $value );
if ( !count( $merged ) ) {
@@ -161,9 +183,9 @@ class ApiResult extends ApiBase {
/**
* Adds a content element to an array.
* Use this function instead of hardcoding the '*' element.
- * @param $arr array to add the content element to
+ * @param array $arr to add the content element to
* @param $value Mixed
- * @param $subElemName string when present, content element is created
+ * @param string $subElemName when present, content element is created
* as a sub item of $arr. Use this parameter to create elements in
* format "<elem>text</elem>" without attributes.
*/
@@ -186,7 +208,7 @@ class ApiResult extends ApiBase {
* give all indexed values the given tag name. This function MUST be
* called on every array that has numerical indexes.
* @param $arr array
- * @param $tag string Tag name
+ * @param string $tag Tag name
*/
public function setIndexedTagName( &$arr, $tag ) {
// In raw mode, add the '_element', otherwise just ignore
@@ -203,7 +225,7 @@ class ApiResult extends ApiBase {
/**
* Calls setIndexedTagName() on each sub-array of $arr
* @param $arr array
- * @param $tag string Tag name
+ * @param string $tag Tag name
*/
public function setIndexedTagName_recursive( &$arr, $tag ) {
if ( !is_array( $arr ) ) {
@@ -222,7 +244,7 @@ class ApiResult extends ApiBase {
* Calls setIndexedTagName() on an array already in the result.
* Don't specify a path to a value that's not in the result, or
* you'll get nasty errors.
- * @param $path array Path to the array, like addValue()'s $path
+ * @param array $path Path to the array, like addValue()'s $path
* @param $tag string
*/
public function setIndexedTagName_internal( $path, $tag ) {
@@ -249,11 +271,14 @@ class ApiResult extends ApiBase {
* @param $path array|string|null
* @param $name string
* @param $value mixed
- * @param $overwrite bool
- *
+ * @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP. This parameter used to be
+ * boolean, and the value of OVERRIDE=1 was specifically chosen so that it would be backwards
+ * compatible with the new method signature.
* @return bool True if $value fits in the result, false if not
+ *
+ * @since 1.21 int $flags replaced boolean $override
*/
- public function addValue( $path, $name, $value, $overwrite = false ) {
+ public function addValue( $path, $name, $value, $flags = 0 ) {
global $wgAPIMaxResultSize;
$data = &$this->mData;
@@ -268,26 +293,34 @@ class ApiResult extends ApiBase {
$this->mSize = $newsize;
}
- if ( !is_null( $path ) ) {
- if ( is_array( $path ) ) {
- foreach ( $path as $p ) {
- if ( !isset( $data[$p] ) ) {
+ $addOnTop = $flags & ApiResult::ADD_ON_TOP;
+ if ( $path !== null ) {
+ foreach ( (array)$path as $p ) {
+ if ( !isset( $data[$p] ) ) {
+ if ( $addOnTop ) {
+ $data = array( $p => array() ) + $data;
+ $addOnTop = false;
+ } else {
$data[$p] = array();
}
- $data = &$data[$p];
- }
- } else {
- if ( !isset( $data[$path] ) ) {
- $data[$path] = array();
}
- $data = &$data[$path];
+ $data = &$data[$p];
}
}
if ( !$name ) {
- $data[] = $value; // Add list element
+ // Add list element
+ if ( $addOnTop ) {
+ // This element needs to be inserted in the beginning
+ // Numerical indexes will be renumbered
+ array_unshift( $data, $value );
+ } else {
+ // Add new value at the end
+ $data[] = $value;
+ }
} else {
- self::setElement( $data, $name, $value, $overwrite ); // Add named element
+ // Add named element
+ self::setElement( $data, $name, $value, $flags );
}
return true;
}
@@ -300,19 +333,19 @@ class ApiResult extends ApiBase {
*/
public function setParsedLimit( $moduleName, $limit ) {
// Add value, allowing overwriting
- $this->addValue( 'limits', $moduleName, $limit, true );
+ $this->addValue( 'limits', $moduleName, $limit, ApiResult::OVERRIDE );
}
/**
* Unset a value previously added to the result set.
* Fails silently if the value isn't found.
* For parameters, see addValue()
- * @param $path array
+ * @param $path array|null
* @param $name string
*/
public function unsetValue( $path, $name ) {
$data = &$this->mData;
- if ( !is_null( $path ) ) {
+ if ( $path !== null ) {
foreach ( (array)$path as $p ) {
if ( !isset( $data[$p] ) ) {
return;
@@ -367,8 +400,4 @@ class ApiResult extends ApiBase {
public function execute() {
ApiBase::dieDebug( __METHOD__, 'execute() is not supported on Result object' );
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiRollback.php b/includes/api/ApiRollback.php
index 677df16a..b9873f49 100644
--- a/includes/api/ApiRollback.php
+++ b/includes/api/ApiRollback.php
@@ -29,10 +29,6 @@
*/
class ApiRollback extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
/**
* @var Title
*/
@@ -185,7 +181,7 @@ class ApiRollback extends ApiBase {
$this->mTitleObj = Title::newFromText( $params['title'] );
- if ( !$this->mTitleObj ) {
+ if ( !$this->mTitleObj || $this->mTitleObj->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
if ( !$this->mTitleObj->exists() ) {
@@ -205,8 +201,4 @@ class ApiRollback extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Rollback';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiRsd.php b/includes/api/ApiRsd.php
index f0e1fad6..c4a1328c 100644
--- a/includes/api/ApiRsd.php
+++ b/includes/api/ApiRsd.php
@@ -31,10 +31,6 @@
*/
class ApiRsd extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
$result = $this->getResult();
@@ -155,10 +151,6 @@ class ApiRsd extends ApiBase {
}
return $outputData;
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
class ApiFormatXmlRsd extends ApiFormatXml {
@@ -170,8 +162,4 @@ class ApiFormatXmlRsd extends ApiFormatXml {
public function getMimeType() {
return 'application/rsd+xml';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiSetNotificationTimestamp.php b/includes/api/ApiSetNotificationTimestamp.php
index 098b1a66..58d5d9ab 100644
--- a/includes/api/ApiSetNotificationTimestamp.php
+++ b/includes/api/ApiSetNotificationTimestamp.php
@@ -31,9 +31,7 @@
*/
class ApiSetNotificationTimestamp extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
+ private $mPageSet;
public function execute() {
$user = $this->getUser();
@@ -45,11 +43,12 @@ class ApiSetNotificationTimestamp extends ApiBase {
$params = $this->extractRequestParams();
$this->requireMaxOneParameter( $params, 'timestamp', 'torevid', 'newerthanrevid' );
- $pageSet = new ApiPageSet( $this );
- $args = array_merge( array( $params, 'entirewatchlist' ), array_keys( $pageSet->getAllowedParams() ) );
- call_user_func_array( array( $this, 'requireOnlyOneParameter' ), $args );
+ $pageSet = $this->getPageSet();
+ if ( $params['entirewatchlist'] && $pageSet->getDataSource() !== null ) {
+ $this->dieUsage( "Cannot use 'entirewatchlist' at the same time as '{$pageSet->getDataSource()}'", 'multisource' );
+ }
- $dbw = $this->getDB( DB_MASTER );
+ $dbw = wfGetDB( DB_MASTER, 'api' );
$timestamp = null;
if ( isset( $params['timestamp'] ) ) {
@@ -96,20 +95,20 @@ class ApiSetNotificationTimestamp extends ApiBase {
$result['notificationtimestamp'] = ( is_null( $timestamp ) ? '' : wfTimestamp( TS_ISO_8601, $timestamp ) );
} else {
// First, log the invalid titles
- foreach( $pageSet->getInvalidTitles() as $title ) {
+ foreach ( $pageSet->getInvalidTitles() as $title ) {
$r = array();
$r['title'] = $title;
$r['invalid'] = '';
$result[] = $r;
}
- foreach( $pageSet->getMissingPageIDs() as $p ) {
+ foreach ( $pageSet->getMissingPageIDs() as $p ) {
$page = array();
$page['pageid'] = $p;
$page['missing'] = '';
$page['notwatched'] = '';
$result[] = $page;
}
- foreach( $pageSet->getMissingRevisionIDs() as $r ) {
+ foreach ( $pageSet->getMissingRevisionIDs() as $r ) {
$rev = array();
$rev['revid'] = $r;
$rev['missing'] = '';
@@ -135,6 +134,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
}
// Now, put the valid titles into the result
+ /** @var $title Title */
foreach ( $pageSet->getTitles() as $title ) {
$ns = $title->getNamespace();
$dbkey = $title->getDBkey();
@@ -161,6 +161,17 @@ class ApiSetNotificationTimestamp extends ApiBase {
$apiResult->addValue( null, $this->getModuleName(), $result );
}
+ /**
+ * Get a cached instance of an ApiPageSet object
+ * @return ApiPageSet
+ */
+ private function getPageSet() {
+ if ( !isset( $this->mPageSet ) ) {
+ $this->mPageSet = new ApiPageSet( $this );
+ }
+ return $this->mPageSet;
+ }
+
public function mustBePosted() {
return true;
}
@@ -177,9 +188,8 @@ class ApiSetNotificationTimestamp extends ApiBase {
return '';
}
- public function getAllowedParams() {
- $psModule = new ApiPageSet( $this );
- return $psModule->getAllowedParams() + array(
+ public function getAllowedParams( $flags = 0 ) {
+ $result = array(
'entirewatchlist' => array(
ApiBase::PARAM_TYPE => 'boolean'
),
@@ -194,11 +204,15 @@ class ApiSetNotificationTimestamp extends ApiBase {
ApiBase::PARAM_TYPE => 'integer'
),
);
+ if ( $flags ) {
+ $result += $this->getPageSet()->getFinalParams( $flags );
+ }
+ return $result;
+
}
public function getParamDescription() {
- $psModule = new ApiPageSet( $this );
- return $psModule->getParamDescription() + array(
+ return $this->getPageSet()->getParamDescription() + array(
'entirewatchlist' => 'Work on all watched pages',
'timestamp' => 'Timestamp to which to set the notification timestamp',
'torevid' => 'Revision to set the notification timestamp to (one page only)',
@@ -247,18 +261,20 @@ class ApiSetNotificationTimestamp extends ApiBase {
public function getDescription() {
return array( 'Update the notification timestamp for watched pages.',
'This affects the highlighting of changed pages in the watchlist and history,',
- 'and the sending of email when the "E-mail me when a page on my watchlist is',
+ 'and the sending of email when the "Email me when a page on my watchlist is',
'changed" preference is enabled.'
);
}
public function getPossibleErrors() {
- $psModule = new ApiPageSet( $this );
+ $ps = $this->getPageSet();
return array_merge(
parent::getPossibleErrors(),
- $psModule->getPossibleErrors(),
- $this->getRequireMaxOneParameterErrorMessages( array( 'timestamp', 'torevid', 'newerthanrevid' ) ),
- $this->getRequireOnlyOneParameterErrorMessages( array_merge( array( 'entirewatchlist' ), array_keys( $psModule->getAllowedParams() ) ) ),
+ $ps->getPossibleErrors(),
+ $this->getRequireMaxOneParameterErrorMessages(
+ array( 'timestamp', 'torevid', 'newerthanrevid' ) ),
+ $this->getRequireOnlyOneParameterErrorMessages(
+ array_merge( array( 'entirewatchlist' ), array_keys( $ps->getFinalParams() ) ) ),
array(
array( 'code' => 'notloggedin', 'info' => 'Anonymous users cannot use watchlist change notifications' ),
array( 'code' => 'multpages', 'info' => 'torevid may only be used with a single page' ),
@@ -269,17 +285,13 @@ class ApiSetNotificationTimestamp extends ApiBase {
public function getExamples() {
return array(
- 'api.php?action=setnotificationtimestamp&entirewatchlist=&token=ABC123' => 'Reset the notification status for the entire watchlist',
- 'api.php?action=setnotificationtimestamp&titles=Main_page&token=ABC123' => 'Reset the notification status for "Main page"',
- 'api.php?action=setnotificationtimestamp&titles=Main_page&timestamp=2012-01-01T00:00:00Z&token=ABC123' => 'Set the notification timestamp for "Main page" so all edits since 1 January 2012 are unviewed',
+ 'api.php?action=setnotificationtimestamp&entirewatchlist=&token=123ABC' => 'Reset the notification status for the entire watchlist',
+ 'api.php?action=setnotificationtimestamp&titles=Main_page&token=123ABC' => 'Reset the notification status for "Main page"',
+ 'api.php?action=setnotificationtimestamp&titles=Main_page&timestamp=2012-01-01T00:00:00Z&token=123ABC' => 'Set the notification timestamp for "Main page" so all edits since 1 January 2012 are unviewed',
);
}
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:SetNotificationTimestamp';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiTokens.php b/includes/api/ApiTokens.php
index 2c9b482c..7080f547 100644
--- a/includes/api/ApiTokens.php
+++ b/includes/api/ApiTokens.php
@@ -24,25 +24,17 @@
* @file
*/
-
/**
* @ingroup API
*/
class ApiTokens extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
- wfProfileIn( __METHOD__ );
$params = $this->extractRequestParams();
$res = array();
$types = $this->getTokenTypes();
foreach ( $params['type'] as $type ) {
- $type = strtolower( $type );
-
$val = call_user_func( $types[$type], null, null );
if ( $val === false ) {
@@ -53,7 +45,6 @@ class ApiTokens extends ApiBase {
}
$this->getResult()->addValue( null, $this->getModuleName(), $res );
- wfProfileOut( __METHOD__ );
}
private function getTokenTypes() {
@@ -62,11 +53,11 @@ class ApiTokens extends ApiBase {
return $types;
}
wfProfileIn( __METHOD__ );
- $types = array( 'patrol' => 'ApiQueryRecentChanges::getPatrolToken' );
+ $types = array( 'patrol' => array( 'ApiQueryRecentChanges', 'getPatrolToken' ) );
$names = array( 'edit', 'delete', 'protect', 'move', 'block', 'unblock',
'email', 'import', 'watch', 'options' );
foreach ( $names as $name ) {
- $types[$name] = 'ApiQueryInfo::get' . ucfirst( $name ) . 'Token';
+ $types[$name] = array( 'ApiQueryInfo', 'get' . ucfirst( $name ) . 'Token' );
}
wfRunHooks( 'ApiTokensGetTokenTypes', array( &$types ) );
ksort( $types );
@@ -85,54 +76,13 @@ class ApiTokens extends ApiBase {
}
public function getResultProperties() {
- return array(
- '' => array(
- 'patroltoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'edittoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'deletetoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'protecttoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'movetoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'blocktoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'unblocktoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'emailtoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'importtoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'watchtoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- ),
- 'optionstoken' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- )
- )
+ $props = array(
+ '' => array(),
);
+
+ self::addTokenProperties( $props, $this->getTokenTypes() );
+
+ return $props;
}
public function getParamDescription() {
@@ -151,8 +101,4 @@ class ApiTokens extends ApiBase {
'api.php?action=tokens&type=email|move' => 'Retrieve an email token and a move token'
);
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiUnblock.php b/includes/api/ApiUnblock.php
index ff9ac474..55e7331d 100644
--- a/includes/api/ApiUnblock.php
+++ b/includes/api/ApiUnblock.php
@@ -32,10 +32,6 @@
*/
class ApiUnblock extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
/**
* Unblocks the specified user or provides the reason the unblock failed.
*/
@@ -178,8 +174,4 @@ class ApiUnblock extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Block';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiUndelete.php b/includes/api/ApiUndelete.php
index c9962517..4bbe568d 100644
--- a/includes/api/ApiUndelete.php
+++ b/includes/api/ApiUndelete.php
@@ -29,10 +29,6 @@
*/
class ApiUndelete extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
$params = $this->extractRequestParams();
@@ -45,7 +41,7 @@ class ApiUndelete extends ApiBase {
}
$titleObj = Title::newFromText( $params['title'] );
- if ( !$titleObj ) {
+ if ( !$titleObj || $titleObj->isExternal() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
@@ -61,7 +57,13 @@ class ApiUndelete extends ApiBase {
}
$pa = new PageArchive( $titleObj );
- $retval = $pa->undelete( ( isset( $params['timestamps'] ) ? $params['timestamps'] : array() ), $params['reason'] );
+ $retval = $pa->undelete(
+ ( isset( $params['timestamps'] ) ? $params['timestamps'] : array() ),
+ $params['reason'],
+ array(),
+ false,
+ $this->getUser()
+ );
if ( !is_array( $retval ) ) {
$this->dieUsageMsg( 'cannotundelete' );
}
@@ -170,8 +172,4 @@ class ApiUndelete extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Undelete';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiUpload.php b/includes/api/ApiUpload.php
index e7a7849b..7d67aa6e 100644
--- a/includes/api/ApiUpload.php
+++ b/includes/api/ApiUpload.php
@@ -36,11 +36,9 @@ class ApiUpload extends ApiBase {
protected $mParams;
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
+ global $wgEnableAsyncUploads;
+
// Check whether upload is enabled
if ( !UploadBase::isEnabled() ) {
$this->dieUsageMsg( 'uploaddisabled' );
@@ -51,6 +49,8 @@ class ApiUpload extends ApiBase {
// Parameter handling
$this->mParams = $this->extractRequestParams();
$request = $this->getMain()->getRequest();
+ // Check if async mode is actually supported (jobs done in cli mode)
+ $this->mParams['async'] = ( $this->mParams['async'] && $wgEnableAsyncUploads );
// Add the uploaded file to the params array
$this->mParams['file'] = $request->getFileName( 'file' );
$this->mParams['chunk'] = $request->getFileName( 'chunk' );
@@ -62,17 +62,16 @@ class ApiUpload extends ApiBase {
// Select an upload module
if ( !$this->selectUploadModule() ) {
- // This is not a true upload, but a status request or similar
- return;
- }
- if ( !isset( $this->mUpload ) ) {
+ return; // not a true upload, but a status request or similar
+ } elseif ( !isset( $this->mUpload ) ) {
$this->dieUsage( 'No upload module set', 'nomodule' );
}
// First check permission to upload
$this->checkPermissions( $user );
- // Fetch the file
+ // Fetch the file (usually a no-op)
+ /** @var $status Status */
$status = $this->mUpload->fetchFile();
if ( !$status->isGood() ) {
$errors = $status->getErrorsArray();
@@ -82,26 +81,32 @@ class ApiUpload extends ApiBase {
// Check if the uploaded file is sane
if ( $this->mParams['chunk'] ) {
- $maxSize = $this->mUpload->getMaxUploadSize( );
+ $maxSize = $this->mUpload->getMaxUploadSize();
if( $this->mParams['filesize'] > $maxSize ) {
$this->dieUsage( 'The file you submitted was too large', 'file-too-large' );
}
+ if ( !$this->mUpload->getTitle() ) {
+ $this->dieUsage( 'Invalid file title supplied', 'internal-error' );
+ }
+ } elseif ( $this->mParams['async'] && $this->mParams['filekey'] ) {
+ // defer verification to background process
} else {
+ wfDebug( __METHOD__ . 'about to verify' );
$this->verifyUpload();
}
-
+
// Check if the user has the rights to modify or overwrite the requested title
// (This check is irrelevant if stashing is already requested, since the errors
// can always be fixed by changing the title)
- if ( ! $this->mParams['stash'] ) {
+ if ( !$this->mParams['stash'] ) {
$permErrors = $this->mUpload->verifyTitlePermissions( $user );
if ( $permErrors !== true ) {
$this->dieRecoverableError( $permErrors[0], 'filename' );
}
}
- // Get the result based on the current upload context:
- $result = $this->getContextResult();
+ // Get the result based on the current upload context:
+ $result = $this->getContextResult();
if ( $result['result'] === 'Success' ) {
$result['imageinfo'] = $this->mUpload->getImageInfo( $this->getResult() );
}
@@ -111,14 +116,15 @@ class ApiUpload extends ApiBase {
// Cleanup any temporary mess
$this->mUpload->cleanupTempFile();
}
+
/**
- * Get an uplaod result based on upload context
+ * Get an upload result based on upload context
* @return array
*/
- private function getContextResult(){
+ private function getContextResult() {
$warnings = $this->getApiWarnings();
if ( $warnings && !$this->mParams['ignorewarnings'] ) {
- // Get warnings formated in result array format
+ // Get warnings formatted in result array format
return $this->getWarningsResult( $warnings );
} elseif ( $this->mParams['chunk'] ) {
// Add chunk, and get result
@@ -131,12 +137,13 @@ class ApiUpload extends ApiBase {
// performUpload will return a formatted properly for the API with status
return $this->performUpload( $warnings );
}
+
/**
- * Get Stash Result, throws an expetion if the file could not be stashed.
- * @param $warnings array Array of Api upload warnings
+ * Get Stash Result, throws an exception if the file could not be stashed.
+ * @param array $warnings Array of Api upload warnings
* @return array
*/
- private function getStashResult( $warnings ){
+ private function getStashResult( $warnings ) {
$result = array ();
// Some uploads can request they be stashed, so as not to publish them immediately.
// In this case, a failure to stash ought to be fatal
@@ -152,12 +159,13 @@ class ApiUpload extends ApiBase {
}
return $result;
}
+
/**
* Get Warnings Result
- * @param $warnings array Array of Api upload warnings
+ * @param array $warnings Array of Api upload warnings
* @return array
*/
- private function getWarningsResult( $warnings ){
+ private function getWarningsResult( $warnings ) {
$result = array();
$result['result'] = 'Warning';
$result['warnings'] = $warnings;
@@ -171,12 +179,13 @@ class ApiUpload extends ApiBase {
}
return $result;
}
+
/**
* Get the result of a chunk upload.
- * @param $warnings array Array of Api upload warnings
+ * @param array $warnings Array of Api upload warnings
* @return array
*/
- private function getChunkResult( $warnings ){
+ private function getChunkResult( $warnings ) {
$result = array();
$result['result'] = 'Continue';
@@ -186,55 +195,78 @@ class ApiUpload extends ApiBase {
$request = $this->getMain()->getRequest();
$chunkPath = $request->getFileTempname( 'chunk' );
$chunkSize = $request->getUpload( 'chunk' )->getSize();
- if ($this->mParams['offset'] == 0) {
+ if ( $this->mParams['offset'] == 0 ) {
try {
- $result['filekey'] = $this->performStash();
+ $filekey = $this->performStash();
} catch ( MWException $e ) {
// FIXME: Error handling here is wrong/different from rest of this
$this->dieUsage( $e->getMessage(), 'stashfailed' );
}
} else {
- $status = $this->mUpload->addChunk($chunkPath, $chunkSize,
- $this->mParams['offset']);
+ $filekey = $this->mParams['filekey'];
+ /** @var $status Status */
+ $status = $this->mUpload->addChunk(
+ $chunkPath, $chunkSize, $this->mParams['offset'] );
if ( !$status->isGood() ) {
$this->dieUsage( $status->getWikiText(), 'stashfailed' );
return array();
}
+ }
- // Check we added the last chunk:
- if( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
+ // Check we added the last chunk:
+ if ( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
+ if ( $this->mParams['async'] ) {
+ $progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
+ if ( $progress && $progress['result'] === 'Poll' ) {
+ $this->dieUsage( "Chunk assembly already in progress.", 'stashfailed' );
+ }
+ UploadBase::setSessionStatus(
+ $this->mParams['filekey'],
+ array( 'result' => 'Poll',
+ 'stage' => 'queued', 'status' => Status::newGood() )
+ );
+ $ok = JobQueueGroup::singleton()->push( new AssembleUploadChunksJob(
+ Title::makeTitle( NS_FILE, $this->mParams['filekey'] ),
+ array(
+ 'filename' => $this->mParams['filename'],
+ 'filekey' => $this->mParams['filekey'],
+ 'session' => $this->getContext()->exportSession()
+ )
+ ) );
+ if ( $ok ) {
+ $result['result'] = 'Poll';
+ } else {
+ UploadBase::setSessionStatus( $this->mParams['filekey'], false );
+ $this->dieUsage(
+ "Failed to start AssembleUploadChunks.php", 'stashfailed' );
+ }
+ } else {
$status = $this->mUpload->concatenateChunks();
-
if ( !$status->isGood() ) {
$this->dieUsage( $status->getWikiText(), 'stashfailed' );
return array();
}
- // We have a new filekey for the fully concatenated file.
- $result['filekey'] = $this->mUpload->getLocalFile()->getFileKey();
-
- // Remove chunk from stash. (Checks against user ownership of chunks.)
- $this->mUpload->stash->removeFile( $this->mParams['filekey'] );
+ // The fully concatenated file has a new filekey. So remove
+ // the old filekey and fetch the new one.
+ $this->mUpload->stash->removeFile( $filekey );
+ $filekey = $this->mUpload->getLocalFile()->getFileKey();
$result['result'] = 'Success';
-
- } else {
-
- // Continue passing through the filekey for adding further chunks.
- $result['filekey'] = $this->mParams['filekey'];
}
}
+ $result['filekey'] = $filekey;
$result['offset'] = $this->mParams['offset'] + $chunkSize;
return $result;
}
-
+
/**
* Stash the file and return the file key
* Also re-raises exceptions with slightly more informative message strings (useful for API)
* @throws MWException
* @return String file key
*/
- function performStash() {
+ private function performStash() {
try {
$stashFile = $this->mUpload->stashFile();
@@ -244,7 +276,7 @@ class ApiUpload extends ApiBase {
$fileKey = $stashFile->getFileKey();
} catch ( MWException $e ) {
$message = 'Stashing temporary file failed: ' . get_class( $e ) . ' ' . $e->getMessage();
- wfDebug( __METHOD__ . ' ' . $message . "\n");
+ wfDebug( __METHOD__ . ' ' . $message . "\n" );
throw new MWException( $message );
}
return $fileKey;
@@ -254,12 +286,12 @@ class ApiUpload extends ApiBase {
* Throw an error that the user can recover from by providing a better
* value for $parameter
*
- * @param $error array Error array suitable for passing to dieUsageMsg()
- * @param $parameter string Parameter that needs revising
- * @param $data array Optional extra data to pass to the user
+ * @param array $error Error array suitable for passing to dieUsageMsg()
+ * @param string $parameter Parameter that needs revising
+ * @param array $data Optional extra data to pass to the user
* @throws UsageException
*/
- function dieRecoverableError( $error, $parameter, $data = array() ) {
+ private function dieRecoverableError( $error, $parameter, $data = array() ) {
try {
$data['filekey'] = $this->performStash();
$data['sessionkey'] = $data['filekey'];
@@ -283,11 +315,27 @@ class ApiUpload extends ApiBase {
$request = $this->getMain()->getRequest();
// chunk or one and only one of the following parameters is needed
- if( !$this->mParams['chunk'] ) {
+ if ( !$this->mParams['chunk'] ) {
$this->requireOnlyOneParameter( $this->mParams,
'filekey', 'file', 'url', 'statuskey' );
}
+ // Status report for "upload to stash"/"upload from stash"
+ if ( $this->mParams['filekey'] && $this->mParams['checkstatus'] ) {
+ $progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
+ if ( !$progress ) {
+ $this->dieUsage( 'No result in status data', 'missingresult' );
+ } elseif ( !$progress['status']->isGood() ) {
+ $this->dieUsage( $progress['status']->getWikiText(), 'stashfailed' );
+ }
+ if ( isset( $progress['status']->value['verification'] ) ) {
+ $this->checkVerification( $progress['status']->value['verification'] );
+ }
+ unset( $progress['status'] ); // remove Status object
+ $this->getResult()->addValue( null, $this->getModuleName(), $progress );
+ return false;
+ }
+
if ( $this->mParams['statuskey'] ) {
$this->checkAsyncDownloadEnabled();
@@ -302,7 +350,6 @@ class ApiUpload extends ApiBase {
}
$this->getResult()->addValue( null, $this->getModuleName(), $sessionData );
return false;
-
}
// The following modules all require the filename parameter to be set
@@ -311,9 +358,11 @@ class ApiUpload extends ApiBase {
}
if ( $this->mParams['chunk'] ) {
+ $this->checkChunkedEnabled();
+
// Chunk upload
$this->mUpload = new UploadFromChunks();
- if( isset( $this->mParams['filekey'] ) ){
+ if( isset( $this->mParams['filekey'] ) ) {
// handle new chunk
$this->mUpload->continueChunks(
$this->mParams['filename'],
@@ -334,8 +383,11 @@ class ApiUpload extends ApiBase {
}
$this->mUpload = new UploadFromStash( $this->getUser() );
-
- $this->mUpload->initialize( $this->mParams['filekey'], $this->mParams['filename'] );
+ // This will not download the temp file in initialize() in async mode.
+ // We still have enough information to call checkWarnings() and such.
+ $this->mUpload->initialize(
+ $this->mParams['filekey'], $this->mParams['filename'], !$this->mParams['async']
+ );
} elseif ( isset( $this->mParams['file'] ) ) {
$this->mUpload = new UploadFromFile();
$this->mUpload->initialize(
@@ -396,13 +448,20 @@ class ApiUpload extends ApiBase {
/**
* Performs file verification, dies on error.
*/
- protected function verifyUpload( ) {
- global $wgFileExtensions;
-
- $verification = $this->mUpload->verifyUpload( );
+ protected function verifyUpload() {
+ $verification = $this->mUpload->verifyUpload();
if ( $verification['status'] === UploadBase::OK ) {
return;
+ } else {
+ return $this->checkVerification( $verification );
}
+ }
+
+ /**
+ * Performs file verification, dies on error.
+ */
+ protected function checkVerification( array $verification ) {
+ global $wgFileExtensions;
// TODO: Move them to ApiBase's message map
switch( $verification['status'] ) {
@@ -460,12 +519,11 @@ class ApiUpload extends ApiBase {
break;
default:
$this->dieUsage( 'An unknown error occurred', 'unknown-error',
- 0, array( 'code' => $verification['status'] ) );
+ 0, array( 'code' => $verification['status'] ) );
break;
}
}
-
/**
* Check warnings.
* Returns a suitable array for inclusion into API results if there were warnings
@@ -503,12 +561,11 @@ class ApiUpload extends ApiBase {
return $warnings;
}
-
/**
* Perform the actual upload. Returns a suitable result array on success;
* dies on failure.
*
- * @param $warnings array Array of Api upload warnings
+ * @param array $warnings Array of Api upload warnings
* @return array
*/
protected function performUpload( $warnings ) {
@@ -517,6 +574,7 @@ class ApiUpload extends ApiBase {
$this->mParams['text'] = $this->mParams['comment'];
}
+ /** @var $file File */
$file = $this->mUpload->getLocalFile();
$watch = $this->getWatchlistValue( $this->mParams['watchlist'], $file->getTitle() );
@@ -526,29 +584,57 @@ class ApiUpload extends ApiBase {
}
// No errors, no warnings: do the upload
- $status = $this->mUpload->performUpload( $this->mParams['comment'],
- $this->mParams['text'], $watch, $this->getUser() );
-
- if ( !$status->isGood() ) {
- $error = $status->getErrorsArray();
-
- if ( count( $error ) == 1 && $error[0][0] == 'async' ) {
- // The upload can not be performed right now, because the user
- // requested so
- return array(
- 'result' => 'Queued',
- 'statuskey' => $error[0][1],
- );
+ if ( $this->mParams['async'] ) {
+ $progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
+ if ( $progress && $progress['result'] === 'Poll' ) {
+ $this->dieUsage( "Upload from stash already in progress.", 'publishfailed' );
+ }
+ UploadBase::setSessionStatus(
+ $this->mParams['filekey'],
+ array( 'result' => 'Poll', 'stage' => 'queued', 'status' => Status::newGood() )
+ );
+ $ok = JobQueueGroup::singleton()->push( new PublishStashedFileJob(
+ Title::makeTitle( NS_FILE, $this->mParams['filename'] ),
+ array(
+ 'filename' => $this->mParams['filename'],
+ 'filekey' => $this->mParams['filekey'],
+ 'comment' => $this->mParams['comment'],
+ 'text' => $this->mParams['text'],
+ 'watch' => $watch,
+ 'session' => $this->getContext()->exportSession()
+ )
+ ) );
+ if ( $ok ) {
+ $result['result'] = 'Poll';
} else {
- $this->getResult()->setIndexedTagName( $error, 'error' );
+ UploadBase::setSessionStatus( $this->mParams['filekey'], false );
+ $this->dieUsage(
+ "Failed to start PublishStashedFile.php", 'publishfailed' );
+ }
+ } else {
+ /** @var $status Status */
+ $status = $this->mUpload->performUpload( $this->mParams['comment'],
+ $this->mParams['text'], $watch, $this->getUser() );
- $this->dieUsage( 'An internal error occurred', 'internal-error', 0, $error );
+ if ( !$status->isGood() ) {
+ $error = $status->getErrorsArray();
+
+ if ( count( $error ) == 1 && $error[0][0] == 'async' ) {
+ // The upload can not be performed right now, because the user
+ // requested so
+ return array(
+ 'result' => 'Queued',
+ 'statuskey' => $error[0][1],
+ );
+ } else {
+ $this->getResult()->setIndexedTagName( $error, 'error' );
+
+ $this->dieUsage( 'An internal error occurred', 'internal-error', 0, $error );
+ }
}
+ $result['result'] = 'Success';
}
- $file = $this->mUpload->getLocalFile();
-
- $result['result'] = 'Success';
$result['filename'] = $file->getName();
if ( $warnings && count( $warnings ) > 0 ) {
$result['warnings'] = $warnings;
@@ -563,7 +649,14 @@ class ApiUpload extends ApiBase {
protected function checkAsyncDownloadEnabled() {
global $wgAllowAsyncCopyUploads;
if ( !$wgAllowAsyncCopyUploads ) {
- $this->dieUsage( 'Asynchronous copy uploads disabled', 'asynccopyuploaddisabled');
+ $this->dieUsage( 'Asynchronous copy uploads disabled', 'asynccopyuploaddisabled' );
+ }
+ }
+
+ protected function checkChunkedEnabled() {
+ global $wgAllowChunkedUploads;
+ if ( !$wgAllowChunkedUploads ) {
+ $this->dieUsage( 'Chunked uploads disabled', 'chunkeduploaddisabled' );
}
}
@@ -601,7 +694,9 @@ class ApiUpload extends ApiBase {
),
),
'ignorewarnings' => false,
- 'file' => null,
+ 'file' => array(
+ ApiBase::PARAM_TYPE => 'upload',
+ ),
'url' => null,
'filekey' => null,
'sessionkey' => array(
@@ -612,11 +707,15 @@ class ApiUpload extends ApiBase {
'filesize' => null,
'offset' => null,
- 'chunk' => null,
+ 'chunk' => array(
+ ApiBase::PARAM_TYPE => 'upload',
+ ),
+ 'async' => false,
'asyncdownload' => false,
'leavemessage' => false,
'statuskey' => null,
+ 'checkstatus' => false,
);
return $params;
@@ -641,9 +740,11 @@ class ApiUpload extends ApiBase {
'offset' => 'Offset of chunk in bytes',
'filesize' => 'Filesize of entire upload',
+ 'async' => 'Make potentially large file operations asynchronous when possible',
'asyncdownload' => 'Make fetching a URL asynchronous',
'leavemessage' => 'If asyncdownload is used, leave a message on the user talk page if finished',
- 'statuskey' => 'Fetch the upload status for this file key',
+ 'statuskey' => 'Fetch the upload status for this file key (upload by URL)',
+ 'checkstatus' => 'Only fetch the upload status for the given file key',
);
return $params;
@@ -692,7 +793,7 @@ class ApiUpload extends ApiBase {
' * Have the MediaWiki server fetch a file from a URL, using the "url" parameter',
' * Complete an earlier upload that failed due to warnings, using the "filekey" parameter',
'Note that the HTTP POST must be done as a file upload (i.e. using multipart/form-data) when',
- 'sending the "file". Also you must get and send an edit token before doing any upload stuff'
+ 'sending the "file". Also you must get and send an edit token before doing any upload stuff'
);
}
@@ -712,8 +813,10 @@ class ApiUpload extends ApiBase {
array( 'code' => 'filename-tooshort', 'info' => 'The filename is too short' ),
array( 'code' => 'overwrite', 'info' => 'Overwriting an existing file is not allowed' ),
array( 'code' => 'stashfailed', 'info' => 'Stashing temporary file failed' ),
+ array( 'code' => 'publishfailed', 'info' => 'Publishing of stashed file failed' ),
array( 'code' => 'internal-error', 'info' => 'An internal error occurred' ),
array( 'code' => 'asynccopyuploaddisabled', 'info' => 'Asynchronous copy uploads disabled' ),
+ array( 'code' => 'chunkeduploaddisabled', 'info' => 'Chunked uploads disabled' ),
array( 'fileexists-forbidden' ),
array( 'fileexists-shared-forbidden' ),
)
@@ -740,8 +843,4 @@ class ApiUpload extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Upload';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiUserrights.php b/includes/api/ApiUserrights.php
index cbb66a41..b9b1eeda 100644
--- a/includes/api/ApiUserrights.php
+++ b/includes/api/ApiUserrights.php
@@ -30,10 +30,6 @@
*/
class ApiUserrights extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
private $mUser = null;
public function execute() {
@@ -141,8 +137,4 @@ class ApiUserrights extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:User_group_membership';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/api/ApiWatch.php b/includes/api/ApiWatch.php
index 0509f1f8..3e51299f 100644
--- a/includes/api/ApiWatch.php
+++ b/includes/api/ApiWatch.php
@@ -31,10 +31,6 @@
*/
class ApiWatch extends ApiBase {
- public function __construct( $main, $action ) {
- parent::__construct( $main, $action );
- }
-
public function execute() {
$user = $this->getUser();
if ( !$user->isLoggedIn() ) {
@@ -44,12 +40,20 @@ class ApiWatch extends ApiBase {
$params = $this->extractRequestParams();
$title = Title::newFromText( $params['title'] );
- if ( !$title || $title->getNamespace() < 0 ) {
+ if ( !$title || $title->isExternal() || !$title->canExist() ) {
$this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
}
$res = array( 'title' => $title->getPrefixedText() );
+ // Currently unnecessary, code to act as a safeguard against any change in current behavior of uselang
+ // Copy from ApiParse
+ $oldLang = null;
+ if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) {
+ $oldLang = $this->getContext()->getLanguage(); // Backup language
+ $this->getContext()->setLanguage( Language::factory( $params['uselang'] ) );
+ }
+
if ( $params['unwatch'] ) {
$res['unwatched'] = '';
$res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
@@ -59,6 +63,11 @@ class ApiWatch extends ApiBase {
$res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
$success = WatchAction::doWatch( $title, $user );
}
+
+ if ( !is_null( $oldLang ) ) {
+ $this->getContext()->setLanguage( $oldLang ); // Reset language to $oldLang
+ }
+
if ( !$success ) {
$this->dieUsageMsg( 'hookaborted' );
}
@@ -88,6 +97,7 @@ class ApiWatch extends ApiBase {
ApiBase::PARAM_REQUIRED => true
),
'unwatch' => false,
+ 'uselang' => null,
'token' => array(
ApiBase::PARAM_TYPE => 'string',
ApiBase::PARAM_REQUIRED => true
@@ -99,6 +109,7 @@ class ApiWatch extends ApiBase {
return array(
'title' => 'The page to (un)watch',
'unwatch' => 'If set the page will be unwatched rather than watched',
+ 'uselang' => 'Language to show the message in',
'token' => 'A token previously acquired via prop=info',
);
}
@@ -136,8 +147,4 @@ class ApiWatch extends ApiBase {
public function getHelpUrls() {
return 'https://www.mediawiki.org/wiki/API:Watch';
}
-
- public function getVersion() {
- return __CLASS__ . ': $Id$';
- }
}
diff --git a/includes/cache/BacklinkCache.php b/includes/cache/BacklinkCache.php
new file mode 100644
index 00000000..a59cc9a2
--- /dev/null
+++ b/includes/cache/BacklinkCache.php
@@ -0,0 +1,452 @@
+<?php
+/**
+ * Class for fetching backlink lists, approximate backlink counts and
+ * partitions.
+ *
+ * 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 Tim Starling
+ * @copyright © 2009, Tim Starling, Domas Mituzas
+ * @copyright © 2010, Max Sem
+ * @copyright © 2011, Antoine Musso
+ */
+
+/**
+ * Class for fetching backlink lists, approximate backlink counts and
+ * partitions. This is a shared cache.
+ *
+ * Instances of this class should typically be fetched with the method
+ * $title->getBacklinkCache().
+ *
+ * Ideally you should only get your backlinks from here when you think
+ * there is some advantage in caching them. Otherwise it's just a waste
+ * of memory.
+ *
+ * Introduced by r47317
+ *
+ * @internal documentation reviewed on 18 Mar 2011 by hashar
+ */
+class BacklinkCache {
+ /** @var ProcessCacheLRU */
+ protected static $cache;
+
+ /**
+ * Multi dimensions array representing batches. Keys are:
+ * > (string) links table name
+ * > 'numRows' : Number of rows for this link table
+ * > 'batches' : array( $start, $end )
+ *
+ * @see BacklinkCache::partitionResult()
+ *
+ * Cleared with BacklinkCache::clear()
+ */
+ protected $partitionCache = array();
+
+ /**
+ * Contains the whole links from a database result.
+ * This is raw data that will be partitioned in $partitionCache
+ *
+ * Initialized with BacklinkCache::getLinks()
+ * Cleared with BacklinkCache::clear()
+ */
+ protected $fullResultCache = array();
+
+ /**
+ * Local copy of a database object.
+ *
+ * Accessor: BacklinkCache::getDB()
+ * Mutator : BacklinkCache::setDB()
+ * Cleared with BacklinkCache::clear()
+ */
+ protected $db;
+
+ /**
+ * Local copy of a Title object
+ */
+ protected $title;
+
+ const CACHE_EXPIRY = 3600;
+
+ /**
+ * Create a new BacklinkCache
+ *
+ * @param Title $title : Title object to create a backlink cache for
+ */
+ public function __construct( Title $title ) {
+ $this->title = $title;
+ }
+
+ /**
+ * Create a new BacklinkCache or reuse any existing one.
+ * Currently, only one cache instance can exist; callers that
+ * need multiple backlink cache objects should keep them in scope.
+ *
+ * @param Title $title : Title object to get a backlink cache for
+ * @return BacklinkCache
+ */
+ public static function get( Title $title ) {
+ if ( !self::$cache ) { // init cache
+ self::$cache = new ProcessCacheLRU( 1 );
+ }
+ $dbKey = $title->getPrefixedDBkey();
+ if ( !self::$cache->has( $dbKey, 'obj' ) ) {
+ self::$cache->set( $dbKey, 'obj', new self( $title ) );
+ }
+ return self::$cache->get( $dbKey, 'obj' );
+ }
+
+ /**
+ * Serialization handler, diasallows to serialize the database to prevent
+ * failures after this class is deserialized from cache with dead DB
+ * connection.
+ *
+ * @return array
+ */
+ function __sleep() {
+ return array( 'partitionCache', 'fullResultCache', 'title' );
+ }
+
+ /**
+ * Clear locally stored data and database object.
+ */
+ public function clear() {
+ $this->partitionCache = array();
+ $this->fullResultCache = array();
+ unset( $this->db );
+ }
+
+ /**
+ * Set the Database object to use
+ *
+ * @param $db DatabaseBase
+ */
+ public function setDB( $db ) {
+ $this->db = $db;
+ }
+
+ /**
+ * Get the slave connection to the database
+ * When non existing, will initialize the connection.
+ * @return DatabaseBase object
+ */
+ protected function getDB() {
+ if ( !isset( $this->db ) ) {
+ $this->db = wfGetDB( DB_SLAVE );
+ }
+
+ return $this->db;
+ }
+
+ /**
+ * Get the backlinks for a given table. Cached in process memory only.
+ * @param $table String
+ * @param $startId Integer or false
+ * @param $endId Integer or false
+ * @return TitleArrayFromResult
+ */
+ public function getLinks( $table, $startId = false, $endId = false ) {
+ wfProfileIn( __METHOD__ );
+
+ $fromField = $this->getPrefix( $table ) . '_from';
+
+ if ( $startId || $endId ) {
+ // Partial range, not cached
+ wfDebug( __METHOD__ . ": from DB (uncacheable range)\n" );
+ $conds = $this->getConditions( $table );
+
+ // Use the from field in the condition rather than the joined page_id,
+ // because databases are stupid and don't necessarily propagate indexes.
+ if ( $startId ) {
+ $conds[] = "$fromField >= " . intval( $startId );
+ }
+
+ if ( $endId ) {
+ $conds[] = "$fromField <= " . intval( $endId );
+ }
+
+ $res = $this->getDB()->select(
+ array( $table, 'page' ),
+ array( 'page_namespace', 'page_title', 'page_id' ),
+ $conds,
+ __METHOD__,
+ array(
+ 'STRAIGHT_JOIN',
+ 'ORDER BY' => $fromField
+ ) );
+ $ta = TitleArray::newFromResult( $res );
+
+ wfProfileOut( __METHOD__ );
+ return $ta;
+ }
+
+ // @todo FIXME: Make this a function?
+ if ( !isset( $this->fullResultCache[$table] ) ) {
+ wfDebug( __METHOD__ . ": from DB\n" );
+ $res = $this->getDB()->select(
+ array( $table, 'page' ),
+ array( 'page_namespace', 'page_title', 'page_id' ),
+ $this->getConditions( $table ),
+ __METHOD__,
+ array(
+ 'STRAIGHT_JOIN',
+ 'ORDER BY' => $fromField,
+ ) );
+ $this->fullResultCache[$table] = $res;
+ }
+
+ $ta = TitleArray::newFromResult( $this->fullResultCache[$table] );
+
+ wfProfileOut( __METHOD__ );
+ return $ta;
+ }
+
+ /**
+ * Get the field name prefix for a given table
+ * @param $table String
+ * @throws MWException
+ * @return null|string
+ */
+ protected function getPrefix( $table ) {
+ static $prefixes = array(
+ 'pagelinks' => 'pl',
+ 'imagelinks' => 'il',
+ 'categorylinks' => 'cl',
+ 'templatelinks' => 'tl',
+ 'redirect' => 'rd',
+ );
+
+ if ( isset( $prefixes[$table] ) ) {
+ return $prefixes[$table];
+ } else {
+ $prefix = null;
+ wfRunHooks( 'BacklinkCacheGetPrefix', array( $table, &$prefix ) );
+ if( $prefix ) {
+ return $prefix;
+ } else {
+ throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
+ }
+ }
+ }
+
+ /**
+ * Get the SQL condition array for selecting backlinks, with a join
+ * on the page table.
+ * @param $table String
+ * @throws MWException
+ * @return array|null
+ */
+ protected function getConditions( $table ) {
+ $prefix = $this->getPrefix( $table );
+
+ // @todo FIXME: imagelinks and categorylinks do not rely on getNamespace,
+ // they could be moved up for nicer case statements
+ switch ( $table ) {
+ case 'pagelinks':
+ case 'templatelinks':
+ $conds = array(
+ "{$prefix}_namespace" => $this->title->getNamespace(),
+ "{$prefix}_title" => $this->title->getDBkey(),
+ "page_id={$prefix}_from"
+ );
+ break;
+ case 'redirect':
+ $conds = array(
+ "{$prefix}_namespace" => $this->title->getNamespace(),
+ "{$prefix}_title" => $this->title->getDBkey(),
+ $this->getDb()->makeList( array(
+ "{$prefix}_interwiki" => '',
+ "{$prefix}_interwiki IS NULL",
+ ), LIST_OR ),
+ "page_id={$prefix}_from"
+ );
+ break;
+ case 'imagelinks':
+ $conds = array(
+ 'il_to' => $this->title->getDBkey(),
+ 'page_id=il_from'
+ );
+ break;
+ case 'categorylinks':
+ $conds = array(
+ 'cl_to' => $this->title->getDBkey(),
+ 'page_id=cl_from',
+ );
+ break;
+ default:
+ $conds = null;
+ wfRunHooks( 'BacklinkCacheGetConditions', array( $table, $this->title, &$conds ) );
+ if( !$conds ) {
+ throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
+ }
+ }
+
+ return $conds;
+ }
+
+ /**
+ * Check if there are any backlinks
+ * @param $table String
+ * @return bool
+ */
+ public function hasLinks( $table ) {
+ return ( $this->getNumLinks( $table, 1 ) > 0 );
+ }
+
+ /**
+ * Get the approximate number of backlinks
+ * @param $table String
+ * @param $max integer Only count up to this many backlinks
+ * @return integer
+ */
+ public function getNumLinks( $table, $max = INF ) {
+ global $wgMemc;
+
+ // 1) try partition cache ...
+ if ( isset( $this->partitionCache[$table] ) ) {
+ $entry = reset( $this->partitionCache[$table] );
+ return min( $max, $entry['numRows'] );
+ }
+
+ // 2) ... then try full result cache ...
+ if ( isset( $this->fullResultCache[$table] ) ) {
+ return min( $max, $this->fullResultCache[$table]->numRows() );
+ }
+
+ $memcKey = wfMemcKey( 'numbacklinks', md5( $this->title->getPrefixedDBkey() ), $table );
+
+ // 3) ... fallback to memcached ...
+ $count = $wgMemc->get( $memcKey );
+ if ( $count ) {
+ return min( $max, $count );
+ }
+
+ // 4) fetch from the database ...
+ if ( is_infinite( $max ) ) { // full count
+ $count = $this->getLinks( $table )->count();
+ $wgMemc->set( $memcKey, $count, self::CACHE_EXPIRY );
+ } else { // with limit
+ $count = $this->getDB()->select(
+ array( $table, 'page' ),
+ '1',
+ $this->getConditions( $table ),
+ __METHOD__,
+ array( 'LIMIT' => $max )
+ )->numRows();
+ }
+
+ return $count;
+ }
+
+ /**
+ * Partition the backlinks into batches.
+ * Returns an array giving the start and end of each range. The first
+ * batch has a start of false, and the last batch has an end of false.
+ *
+ * @param string $table the links table name
+ * @param $batchSize Integer
+ * @return Array
+ */
+ public function partition( $table, $batchSize ) {
+ global $wgMemc;
+
+ // 1) try partition cache ...
+ if ( isset( $this->partitionCache[$table][$batchSize] ) ) {
+ wfDebug( __METHOD__ . ": got from partition cache\n" );
+ return $this->partitionCache[$table][$batchSize]['batches'];
+ }
+
+ $this->partitionCache[$table][$batchSize] = false;
+ $cacheEntry =& $this->partitionCache[$table][$batchSize];
+
+ // 2) ... then try full result cache ...
+ if ( isset( $this->fullResultCache[$table] ) ) {
+ $cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
+ wfDebug( __METHOD__ . ": got from full result cache\n" );
+ return $cacheEntry['batches'];
+ }
+
+ $memcKey = wfMemcKey(
+ 'backlinks',
+ md5( $this->title->getPrefixedDBkey() ),
+ $table,
+ $batchSize
+ );
+
+ // 3) ... fallback to memcached ...
+ $memcValue = $wgMemc->get( $memcKey );
+ if ( is_array( $memcValue ) ) {
+ $cacheEntry = $memcValue;
+ wfDebug( __METHOD__ . ": got from memcached $memcKey\n" );
+ return $cacheEntry['batches'];
+ }
+
+ // 4) ... finally fetch from the slow database :(
+ $this->getLinks( $table );
+ $cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
+ // Save partitions to memcached
+ $wgMemc->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY );
+
+ // Save backlink count to memcached
+ $memcKey = wfMemcKey( 'numbacklinks', md5( $this->title->getPrefixedDBkey() ), $table );
+ $wgMemc->set( $memcKey, $cacheEntry['numRows'], self::CACHE_EXPIRY );
+
+ wfDebug( __METHOD__ . ": got from database\n" );
+ return $cacheEntry['batches'];
+ }
+
+ /**
+ * Partition a DB result with backlinks in it into batches
+ * @param $res ResultWrapper database result
+ * @param $batchSize integer
+ * @throws MWException
+ * @return array @see
+ */
+ protected function partitionResult( $res, $batchSize ) {
+ $batches = array();
+ $numRows = $res->numRows();
+ $numBatches = ceil( $numRows / $batchSize );
+
+ for ( $i = 0; $i < $numBatches; $i++ ) {
+ if ( $i == 0 ) {
+ $start = false;
+ } else {
+ $rowNum = intval( $numRows * $i / $numBatches );
+ $res->seek( $rowNum );
+ $row = $res->fetchObject();
+ $start = $row->page_id;
+ }
+
+ if ( $i == $numBatches - 1 ) {
+ $end = false;
+ } else {
+ $rowNum = intval( $numRows * ( $i + 1 ) / $numBatches );
+ $res->seek( $rowNum );
+ $row = $res->fetchObject();
+ $end = $row->page_id - 1;
+ }
+
+ # Sanity check order
+ if ( $start && $end && $start > $end ) {
+ throw new MWException( __METHOD__ . ': Internal error: query result out of order' );
+ }
+
+ $batches[] = array( $start, $end );
+ }
+
+ return array( 'numRows' => $numRows, 'batches' => $batches );
+ }
+}
diff --git a/includes/cache/CacheDependency.php b/includes/cache/CacheDependency.php
index a3c2b52a..0f047e80 100644
--- a/includes/cache/CacheDependency.php
+++ b/includes/cache/CacheDependency.php
@@ -74,7 +74,7 @@ class DependencyWrapper {
/**
* Get the user-defined value
- * @return bool|\Mixed
+ * @return bool|Mixed
*/
function getValue() {
return $this->value;
@@ -98,11 +98,11 @@ class DependencyWrapper {
* calculated value will be stored to the cache in a wrapper.
*
* @param $cache BagOStuff a cache object such as $wgMemc
- * @param $key String: the cache key
+ * @param string $key the cache key
* @param $expiry Integer: the expiry timestamp or interval in seconds
* @param $callback Mixed: the callback for generating the value, or false
- * @param $callbackParams Array: the function parameters for the callback
- * @param $deps Array: the dependencies to store on a cache miss. Note: these
+ * @param array $callbackParams the function parameters for the callback
+ * @param array $deps the dependencies to store on a cache miss. Note: these
* are not the dependencies used on a cache hit! Cache hits use the stored
* dependency array.
*
@@ -153,7 +153,7 @@ class FileDependency extends CacheDependency {
/**
* Create a file dependency
*
- * @param $filename String: the name of the file, preferably fully qualified
+ * @param string $filename the name of the file, preferably fully qualified
* @param $timestamp Mixed: the unix last modified timestamp, or false if the
* file does not exist. If omitted, the timestamp will be loaded from
* the file.
@@ -404,7 +404,7 @@ class GlobalDependency extends CacheDependency {
* @return bool
*/
function isExpired() {
- if( !isset($GLOBALS[$this->name]) ) {
+ if( !isset( $GLOBALS[$this->name] ) ) {
return true;
}
return $GLOBALS[$this->name] != $this->value;
diff --git a/includes/cache/FileCacheBase.php b/includes/cache/FileCacheBase.php
index c0c5609c..30a72174 100644
--- a/includes/cache/FileCacheBase.php
+++ b/includes/cache/FileCacheBase.php
@@ -107,7 +107,7 @@ abstract class FileCacheBase {
/**
* Check if up to date cache file exists
- * @param $timestamp string MW_TS timestamp
+ * @param string $timestamp MW_TS timestamp
*
* @return bool
*/
@@ -163,7 +163,7 @@ abstract class FileCacheBase {
$this->checkCacheDirs(); // build parent dir
if ( !file_put_contents( $this->cachePath(), $text, LOCK_EX ) ) {
- wfDebug( __METHOD__ . "() failed saving ". $this->cachePath() . "\n");
+ wfDebug( __METHOD__ . "() failed saving ". $this->cachePath() . "\n" );
$this->mCached = null;
return false;
}
@@ -229,7 +229,7 @@ abstract class FileCacheBase {
public function incrMissesRecent( WebRequest $request ) {
global $wgMemc;
if ( mt_rand( 0, self::MISS_FACTOR - 1 ) == 0 ) {
- # Get a large IP range that should include the user even if that
+ # Get a large IP range that should include the user even if that
# person's IP address changes
$ip = $request->getIP();
if ( !IP::isValid( $ip ) ) {
diff --git a/includes/cache/GenderCache.php b/includes/cache/GenderCache.php
index 2a169bb3..63e4226d 100644
--- a/includes/cache/GenderCache.php
+++ b/includes/cache/GenderCache.php
@@ -59,8 +59,8 @@ class GenderCache {
/**
* Returns the gender for given username.
- * @param $username String or User: username
- * @param $caller String: the calling method
+ * @param string $username or User: username
+ * @param string $caller the calling method
* @return String
*/
public function getGenderOf( $username, $caller = '' ) {
@@ -116,7 +116,7 @@ class GenderCache {
*
* @since 1.20
* @param $titles List: array of Title objects or strings
- * @param $caller String: the calling method
+ * @param string $caller the calling method
*/
public function doTitlesArray( $titles, $caller = '' ) {
$users = array();
@@ -137,7 +137,7 @@ class GenderCache {
/**
* Preloads genders for given list of users.
* @param $users List|String: usernames
- * @param $caller String: the calling method
+ * @param string $caller the calling method
*/
public function doQuery( $users, $caller = '' ) {
$default = $this->getDefault();
diff --git a/includes/cache/HTMLCacheUpdate.php b/includes/cache/HTMLCacheUpdate.php
index 0a3c0023..88e79281 100644
--- a/includes/cache/HTMLCacheUpdate.php
+++ b/includes/cache/HTMLCacheUpdate.php
@@ -23,24 +23,6 @@
/**
* Class to invalidate the HTML cache of all the pages linking to a given title.
- * Small numbers of links will be done immediately, large numbers are pushed onto
- * the job queue.
- *
- * This class is designed to work efficiently with small numbers of links, and
- * to work reasonably well with up to ~10^5 links. Above ~10^6 links, the memory
- * and time requirements of loading all backlinked IDs in doUpdate() might become
- * prohibitive. The requirements measured at Wikimedia are approximately:
- *
- * memory: 48 bytes per row
- * time: 16us per row for the query plus processing
- *
- * The reason this query is done is to support partitioning of the job
- * by backlinked ID. The memory issue could be allieviated by doing this query in
- * batches, but of course LIMIT with an offset is inefficient on the DB side.
- *
- * The class is nevertheless a vast improvement on the previous method of using
- * File::getLinksTo() and Title::touchArray(), which uses about 2KB of memory per
- * link.
*
* @ingroup Cache
*/
@@ -50,8 +32,7 @@ class HTMLCacheUpdate implements DeferrableUpdate {
*/
public $mTitle;
- public $mTable, $mPrefix, $mStart, $mEnd;
- public $mRowsPerJob, $mRowsPerQuery;
+ public $mTable;
/**
* @param $titleTo
@@ -59,202 +40,35 @@ class HTMLCacheUpdate implements DeferrableUpdate {
* @param $start bool
* @param $end bool
*/
- function __construct( $titleTo, $table, $start = false, $end = false ) {
- global $wgUpdateRowsPerJob, $wgUpdateRowsPerQuery;
-
+ function __construct( Title $titleTo, $table ) {
$this->mTitle = $titleTo;
$this->mTable = $table;
- $this->mStart = $start;
- $this->mEnd = $end;
- $this->mRowsPerJob = $wgUpdateRowsPerJob;
- $this->mRowsPerQuery = $wgUpdateRowsPerQuery;
- $this->mCache = $this->mTitle->getBacklinkCache();
}
public function doUpdate() {
- if ( $this->mStart || $this->mEnd ) {
- $this->doPartialUpdate();
- return;
- }
-
- # Get an estimate of the number of rows from the BacklinkCache
- $numRows = $this->mCache->getNumLinks( $this->mTable );
- if ( $numRows > $this->mRowsPerJob * 2 ) {
- # Do fast cached partition
- $this->insertJobs();
- } else {
- # Get the links from the DB
- $titleArray = $this->mCache->getLinks( $this->mTable );
- # Check if the row count estimate was correct
- if ( $titleArray->count() > $this->mRowsPerJob * 2 ) {
- # Not correct, do accurate partition
- wfDebug( __METHOD__.": row count estimate was incorrect, repartitioning\n" );
- $this->insertJobsFromTitles( $titleArray );
- } else {
- $this->invalidateTitles( $titleArray );
- }
- }
- }
-
- /**
- * Update some of the backlinks, defined by a page ID range
- */
- protected function doPartialUpdate() {
- $titleArray = $this->mCache->getLinks( $this->mTable, $this->mStart, $this->mEnd );
- if ( $titleArray->count() <= $this->mRowsPerJob * 2 ) {
- # This partition is small enough, do the update
- $this->invalidateTitles( $titleArray );
- } else {
- # Partitioning was excessively inaccurate. Divide the job further.
- # This can occur when a large number of links are added in a short
- # period of time, say by updating a heavily-used template.
- $this->insertJobsFromTitles( $titleArray );
- }
- }
+ global $wgMaxBacklinksInvalidate;
- /**
- * Partition the current range given by $this->mStart and $this->mEnd,
- * using a pre-calculated title array which gives the links in that range.
- * Queue the resulting jobs.
- *
- * @param $titleArray array
- */
- protected function insertJobsFromTitles( $titleArray ) {
- # We make subpartitions in the sense that the start of the first job
- # will be the start of the parent partition, and the end of the last
- # job will be the end of the parent partition.
- $jobs = array();
- $start = $this->mStart; # start of the current job
- $numTitles = 0;
- foreach ( $titleArray as $title ) {
- $id = $title->getArticleID();
- # $numTitles is now the number of titles in the current job not
- # including the current ID
- if ( $numTitles >= $this->mRowsPerJob ) {
- # Add a job up to but not including the current ID
- $params = array(
- 'table' => $this->mTable,
- 'start' => $start,
- 'end' => $id - 1
- );
- $jobs[] = new HTMLCacheUpdateJob( $this->mTitle, $params );
- $start = $id;
- $numTitles = 0;
- }
- $numTitles++;
- }
- # Last job
- $params = array(
- 'table' => $this->mTable,
- 'start' => $start,
- 'end' => $this->mEnd
- );
- $jobs[] = new HTMLCacheUpdateJob( $this->mTitle, $params );
- wfDebug( __METHOD__.": repartitioning into " . count( $jobs ) . " jobs\n" );
-
- if ( count( $jobs ) < 2 ) {
- # I don't think this is possible at present, but handling this case
- # makes the code a bit more robust against future code updates and
- # avoids a potential infinite loop of repartitioning
- wfDebug( __METHOD__.": repartitioning failed!\n" );
- $this->invalidateTitles( $titleArray );
- return;
- }
+ wfProfileIn( __METHOD__ );
- Job::batchInsert( $jobs );
- }
-
- /**
- * @return mixed
- */
- protected function insertJobs() {
- $batches = $this->mCache->partition( $this->mTable, $this->mRowsPerJob );
- if ( !$batches ) {
- return;
- }
- $jobs = array();
- foreach ( $batches as $batch ) {
- $params = array(
+ $job = new HTMLCacheUpdateJob(
+ $this->mTitle,
+ array(
'table' => $this->mTable,
- 'start' => $batch[0],
- 'end' => $batch[1],
- );
- $jobs[] = new HTMLCacheUpdateJob( $this->mTitle, $params );
- }
- Job::batchInsert( $jobs );
- }
-
- /**
- * Invalidate an array (or iterator) of Title objects, right now
- * @param $titleArray array
- */
- protected function invalidateTitles( $titleArray ) {
- global $wgUseFileCache, $wgUseSquid;
-
- $dbw = wfGetDB( DB_MASTER );
- $timestamp = $dbw->timestamp();
-
- # Get all IDs in this query into an array
- $ids = array();
- foreach ( $titleArray as $title ) {
- $ids[] = $title->getArticleID();
- }
-
- if ( !$ids ) {
- return;
- }
-
- # Update page_touched
- $batches = array_chunk( $ids, $this->mRowsPerQuery );
- foreach ( $batches as $batch ) {
- $dbw->update( 'page',
- array( 'page_touched' => $timestamp ),
- array( 'page_id' => $batch ),
- __METHOD__
- );
- }
-
- # Update squid
- if ( $wgUseSquid ) {
- $u = SquidUpdate::newFromTitles( $titleArray );
- $u->doUpdate();
- }
+ ) + Job::newRootJobParams( // "overall" refresh links job info
+ "htmlCacheUpdate:{$this->mTable}:{$this->mTitle->getPrefixedText()}"
+ )
+ );
- # Update file cache
- if ( $wgUseFileCache ) {
- foreach ( $titleArray as $title ) {
- HTMLFileCache::clearFileCache( $title );
- }
+ $count = $this->mTitle->getBacklinkCache()->getNumLinks( $this->mTable, 200 );
+ if ( $wgMaxBacklinksInvalidate !== false && $count > $wgMaxBacklinksInvalidate ) {
+ wfDebug( "Skipped HTML cache invalidation of {$this->mTitle->getPrefixedText()}." );
+ } elseif ( $count >= 200 ) { // many backlinks
+ JobQueueGroup::singleton()->push( $job );
+ JobQueueGroup::singleton()->deduplicateRootJob( $job );
+ } else { // few backlinks ($count might be off even if 0)
+ $job->run(); // just do the purge query now
}
- }
-}
-
-
-/**
- * Job wrapper for HTMLCacheUpdate. Gets run whenever a related
- * job gets called from the queue.
- *
- * @ingroup JobQueue
- */
-class HTMLCacheUpdateJob extends Job {
- var $table, $start, $end;
-
- /**
- * Construct a job
- * @param $title Title: the title linked to
- * @param $params Array: job parameters (table, start and end page_ids)
- * @param $id Integer: job id
- */
- function __construct( $title, $params, $id = 0 ) {
- parent::__construct( 'htmlCacheUpdate', $title, $params, $id );
- $this->table = $params['table'];
- $this->start = $params['start'];
- $this->end = $params['end'];
- }
- public function run() {
- $update = new HTMLCacheUpdate( $this->title, $this->table, $this->start, $this->end );
- $update->doUpdate();
- return true;
+ wfProfileOut( __METHOD__ );
}
}
diff --git a/includes/cache/HTMLFileCache.php b/includes/cache/HTMLFileCache.php
index 6bfeed32..055fd685 100644
--- a/includes/cache/HTMLFileCache.php
+++ b/includes/cache/HTMLFileCache.php
@@ -33,6 +33,7 @@ class HTMLFileCache extends FileCacheBase {
* Construct an ObjectFileCache from a Title and an action
* @param $title Title|string Title object or prefixed DB key string
* @param $action string
+ * @throws MWException
* @return HTMLFileCache
*/
public static function newFromTitle( $title, $action ) {
@@ -127,7 +128,7 @@ class HTMLFileCache extends FileCacheBase {
public function loadFromFileCache( IContextSource $context ) {
global $wgMimeType, $wgLanguageCode;
- wfDebug( __METHOD__ . "()\n");
+ wfDebug( __METHOD__ . "()\n" );
$filename = $this->cachePath();
$context->getOutput()->sendCacheControl();
@@ -167,10 +168,10 @@ class HTMLFileCache extends FileCacheBase {
$now = wfTimestampNow();
if ( $this->useGzip() ) {
$text = str_replace(
- '</html>', '<!-- Cached/compressed '.$now." -->\n</html>", $text );
+ '</html>', '<!-- Cached/compressed ' . $now . " -->\n</html>", $text );
} else {
$text = str_replace(
- '</html>', '<!-- Cached '.$now." -->\n</html>", $text );
+ '</html>', '<!-- Cached ' . $now . " -->\n</html>", $text );
}
// Store text to FS...
diff --git a/includes/cache/LinkBatch.php b/includes/cache/LinkBatch.php
index 372f983b..72a2e8e5 100644
--- a/includes/cache/LinkBatch.php
+++ b/includes/cache/LinkBatch.php
@@ -223,7 +223,7 @@ class LinkBatch {
/**
* Construct a WHERE clause which will match all the given titles.
*
- * @param $prefix String: the appropriate table's field name prefix ('page', 'pl', etc)
+ * @param string $prefix the appropriate table's field name prefix ('page', 'pl', etc)
* @param $db DatabaseBase object to use
* @return mixed string with SQL where clause fragment, or false if no items.
*/
diff --git a/includes/cache/LinkCache.php b/includes/cache/LinkCache.php
index f759c020..0e41e265 100644
--- a/includes/cache/LinkCache.php
+++ b/includes/cache/LinkCache.php
@@ -74,11 +74,11 @@ class LinkCache {
* Get a field of a title object from cache.
* If this link is not good, it will return NULL.
* @param $title Title
- * @param $field String: ('length','redirect','revision')
+ * @param string $field ('length','redirect','revision','model')
* @return mixed
*/
public function getGoodLinkFieldObj( $title, $field ) {
- $dbkey = $title->getPrefixedDbKey();
+ $dbkey = $title->getPrefixedDBkey();
if ( array_key_exists( $dbkey, $this->mGoodLinkFields ) ) {
return $this->mGoodLinkFields[$dbkey][$field];
} else {
@@ -102,14 +102,16 @@ class LinkCache {
* @param $len Integer: text's length
* @param $redir Integer: whether the page is a redirect
* @param $revision Integer: latest revision's ID
+ * @param $model Integer: latest revision's content model ID
*/
- public function addGoodLinkObj( $id, $title, $len = -1, $redir = null, $revision = false ) {
- $dbkey = $title->getPrefixedDbKey();
+ public function addGoodLinkObj( $id, $title, $len = -1, $redir = null, $revision = false, $model = false ) {
+ $dbkey = $title->getPrefixedDBkey();
$this->mGoodLinks[$dbkey] = intval( $id );
$this->mGoodLinkFields[$dbkey] = array(
'length' => intval( $len ),
'redirect' => intval( $redir ),
- 'revision' => intval( $revision ) );
+ 'revision' => intval( $revision ),
+ 'model' => intval( $model ) );
}
/**
@@ -117,15 +119,16 @@ class LinkCache {
* @since 1.19
* @param $title Title
* @param $row object which has the fields page_id, page_is_redirect,
- * page_latest
+ * page_latest and page_content_model
*/
public function addGoodLinkObjFromRow( $title, $row ) {
- $dbkey = $title->getPrefixedDbKey();
+ $dbkey = $title->getPrefixedDBkey();
$this->mGoodLinks[$dbkey] = intval( $row->page_id );
$this->mGoodLinkFields[$dbkey] = array(
'length' => intval( $row->page_len ),
'redirect' => intval( $row->page_is_redirect ),
'revision' => intval( $row->page_latest ),
+ 'model' => !empty( $row->page_content_model ) ? strval( $row->page_content_model ) : null,
);
}
@@ -133,7 +136,7 @@ class LinkCache {
* @param $title Title
*/
public function addBadLinkObj( $title ) {
- $dbkey = $title->getPrefixedDbKey();
+ $dbkey = $title->getPrefixedDBkey();
if ( !$this->isBadLink( $dbkey ) ) {
$this->mBadLinks[$dbkey] = 1;
}
@@ -147,7 +150,7 @@ class LinkCache {
* @param $title Title
*/
public function clearLink( $title ) {
- $dbkey = $title->getPrefixedDbKey();
+ $dbkey = $title->getPrefixedDBkey();
unset( $this->mBadLinks[$dbkey] );
unset( $this->mGoodLinks[$dbkey] );
unset( $this->mGoodLinkFields[$dbkey] );
@@ -159,7 +162,7 @@ class LinkCache {
/**
* Add a title to the link cache, return the page_id or zero if non-existent
*
- * @param $title String: title to add
+ * @param string $title title to add
* @return Integer
*/
public function addLink( $title ) {
@@ -178,7 +181,8 @@ class LinkCache {
* @return Integer
*/
public function addLinkObj( $nt ) {
- global $wgAntiLockFlags;
+ global $wgAntiLockFlags, $wgContentHandlerUseDB;
+
wfProfileIn( __METHOD__ );
$key = $nt->getPrefixedDBkey();
@@ -210,8 +214,10 @@ class LinkCache {
$options = array();
}
- $s = $db->selectRow( 'page',
- array( 'page_id', 'page_len', 'page_is_redirect', 'page_latest' ),
+ $f = array( 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
+ if ( $wgContentHandlerUseDB ) $f[] = 'page_content_model';
+
+ $s = $db->selectRow( 'page', $f,
array( 'page_namespace' => $nt->getNamespace(), 'page_title' => $nt->getDBkey() ),
__METHOD__, $options );
# Set fields...
diff --git a/includes/cache/LocalisationCache.php b/includes/cache/LocalisationCache.php
new file mode 100644
index 00000000..009b9507
--- /dev/null
+++ b/includes/cache/LocalisationCache.php
@@ -0,0 +1,1288 @@
+<?php
+/**
+ * Cache of the contents of localisation files.
+ *
+ * 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
+ */
+
+define( 'MW_LC_VERSION', 2 );
+
+/**
+ * Class for caching the contents of localisation files, Messages*.php
+ * and *.i18n.php.
+ *
+ * An instance of this class is available using Language::getLocalisationCache().
+ *
+ * The values retrieved from here are merged, containing items from extension
+ * files, core messages files and the language fallback sequence (e.g. zh-cn ->
+ * zh-hans -> en ). Some common errors are corrected, for example namespace
+ * names with spaces instead of underscores, but heavyweight processing, such
+ * as grammatical transformation, is done by the caller.
+ */
+class LocalisationCache {
+ /** Configuration associative array */
+ var $conf;
+
+ /**
+ * True if recaching should only be done on an explicit call to recache().
+ * Setting this reduces the overhead of cache freshness checking, which
+ * requires doing a stat() for every extension i18n file.
+ */
+ var $manualRecache = false;
+
+ /**
+ * True to treat all files as expired until they are regenerated by this object.
+ */
+ var $forceRecache = false;
+
+ /**
+ * The cache data. 3-d array, where the first key is the language code,
+ * the second key is the item key e.g. 'messages', and the third key is
+ * an item specific subkey index. Some items are not arrays and so for those
+ * items, there are no subkeys.
+ */
+ var $data = array();
+
+ /**
+ * The persistent store object. An instance of LCStore.
+ *
+ * @var LCStore
+ */
+ var $store;
+
+ /**
+ * A 2-d associative array, code/key, where presence indicates that the item
+ * is loaded. Value arbitrary.
+ *
+ * For split items, if set, this indicates that all of the subitems have been
+ * loaded.
+ */
+ var $loadedItems = array();
+
+ /**
+ * A 3-d associative array, code/key/subkey, where presence indicates that
+ * the subitem is loaded. Only used for the split items, i.e. messages.
+ */
+ var $loadedSubitems = array();
+
+ /**
+ * An array where presence of a key indicates that that language has been
+ * initialised. Initialisation includes checking for cache expiry and doing
+ * any necessary updates.
+ */
+ var $initialisedLangs = array();
+
+ /**
+ * An array mapping non-existent pseudo-languages to fallback languages. This
+ * is filled by initShallowFallback() when data is requested from a language
+ * that lacks a Messages*.php file.
+ */
+ var $shallowFallbacks = array();
+
+ /**
+ * An array where the keys are codes that have been recached by this instance.
+ */
+ var $recachedLangs = array();
+
+ /**
+ * All item keys
+ */
+ static public $allKeys = array(
+ 'fallback', 'namespaceNames', 'bookstoreList',
+ 'magicWords', 'messages', 'rtl', 'capitalizeAllNouns', 'digitTransformTable',
+ 'separatorTransformTable', 'fallback8bitEncoding', 'linkPrefixExtension',
+ 'linkTrail', 'namespaceAliases',
+ 'dateFormats', 'datePreferences', 'datePreferenceMigrationMap',
+ 'defaultDateFormat', 'extraUserToggles', 'specialPageAliases',
+ 'imageFiles', 'preloadedMessages', 'namespaceGenderAliases',
+ 'digitGroupingPattern', 'pluralRules', 'compiledPluralRules',
+ );
+
+ /**
+ * Keys for items which consist of associative arrays, which may be merged
+ * by a fallback sequence.
+ */
+ static public $mergeableMapKeys = array( 'messages', 'namespaceNames',
+ 'dateFormats', 'imageFiles', 'preloadedMessages'
+ );
+
+ /**
+ * Keys for items which are a numbered array.
+ */
+ static public $mergeableListKeys = array( 'extraUserToggles' );
+
+ /**
+ * Keys for items which contain an array of arrays of equivalent aliases
+ * for each subitem. The aliases may be merged by a fallback sequence.
+ */
+ static public $mergeableAliasListKeys = array( 'specialPageAliases' );
+
+ /**
+ * Keys for items which contain an associative array, and may be merged if
+ * the primary value contains the special array key "inherit". That array
+ * key is removed after the first merge.
+ */
+ static public $optionalMergeKeys = array( 'bookstoreList' );
+
+ /**
+ * Keys for items that are formatted like $magicWords
+ */
+ static public $magicWordKeys = array( 'magicWords' );
+
+ /**
+ * Keys for items where the subitems are stored in the backend separately.
+ */
+ static public $splitKeys = array( 'messages' );
+
+ /**
+ * Keys which are loaded automatically by initLanguage()
+ */
+ static public $preloadedKeys = array( 'dateFormats', 'namespaceNames' );
+
+ /**
+ * Associative array of cached plural rules. The key is the language code,
+ * the value is an array of plural rules for that language.
+ */
+ var $pluralRules = null;
+
+ var $mergeableKeys = null;
+
+ /**
+ * Constructor.
+ * For constructor parameters, see the documentation in DefaultSettings.php
+ * for $wgLocalisationCacheConf.
+ *
+ * @param $conf Array
+ * @throws MWException
+ */
+ function __construct( $conf ) {
+ global $wgCacheDirectory;
+
+ $this->conf = $conf;
+ $storeConf = array();
+ if ( !empty( $conf['storeClass'] ) ) {
+ $storeClass = $conf['storeClass'];
+ } else {
+ switch ( $conf['store'] ) {
+ case 'files':
+ case 'file':
+ $storeClass = 'LCStore_CDB';
+ break;
+ case 'db':
+ $storeClass = 'LCStore_DB';
+ break;
+ case 'accel':
+ $storeClass = 'LCStore_Accel';
+ break;
+ case 'detect':
+ $storeClass = $wgCacheDirectory ? 'LCStore_CDB' : 'LCStore_DB';
+ break;
+ default:
+ throw new MWException(
+ 'Please set $wgLocalisationCacheConf[\'store\'] to something sensible.' );
+ }
+ }
+
+ wfDebug( get_class( $this ) . ": using store $storeClass\n" );
+ if ( !empty( $conf['storeDirectory'] ) ) {
+ $storeConf['directory'] = $conf['storeDirectory'];
+ }
+
+ $this->store = new $storeClass( $storeConf );
+ foreach ( array( 'manualRecache', 'forceRecache' ) as $var ) {
+ if ( isset( $conf[$var] ) ) {
+ $this->$var = $conf[$var];
+ }
+ }
+ }
+
+ /**
+ * Returns true if the given key is mergeable, that is, if it is an associative
+ * array which can be merged through a fallback sequence.
+ * @param $key
+ * @return bool
+ */
+ public function isMergeableKey( $key ) {
+ if ( $this->mergeableKeys === null ) {
+ $this->mergeableKeys = array_flip( array_merge(
+ self::$mergeableMapKeys,
+ self::$mergeableListKeys,
+ self::$mergeableAliasListKeys,
+ self::$optionalMergeKeys,
+ self::$magicWordKeys
+ ) );
+ }
+ return isset( $this->mergeableKeys[$key] );
+ }
+
+ /**
+ * Get a cache item.
+ *
+ * Warning: this may be slow for split items (messages), since it will
+ * need to fetch all of the subitems from the cache individually.
+ * @param $code
+ * @param $key
+ * @return mixed
+ */
+ public function getItem( $code, $key ) {
+ if ( !isset( $this->loadedItems[$code][$key] ) ) {
+ wfProfileIn( __METHOD__ . '-load' );
+ $this->loadItem( $code, $key );
+ wfProfileOut( __METHOD__ . '-load' );
+ }
+
+ if ( $key === 'fallback' && isset( $this->shallowFallbacks[$code] ) ) {
+ return $this->shallowFallbacks[$code];
+ }
+
+ return $this->data[$code][$key];
+ }
+
+ /**
+ * Get a subitem, for instance a single message for a given language.
+ * @param $code
+ * @param $key
+ * @param $subkey
+ * @return null
+ */
+ public function getSubitem( $code, $key, $subkey ) {
+ if ( !isset( $this->loadedSubitems[$code][$key][$subkey] ) &&
+ !isset( $this->loadedItems[$code][$key] ) ) {
+ wfProfileIn( __METHOD__ . '-load' );
+ $this->loadSubitem( $code, $key, $subkey );
+ wfProfileOut( __METHOD__ . '-load' );
+ }
+
+ if ( isset( $this->data[$code][$key][$subkey] ) ) {
+ return $this->data[$code][$key][$subkey];
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Get the list of subitem keys for a given item.
+ *
+ * This is faster than array_keys($lc->getItem(...)) for the items listed in
+ * self::$splitKeys.
+ *
+ * Will return null if the item is not found, or false if the item is not an
+ * array.
+ * @param $code
+ * @param $key
+ * @return bool|null|string
+ */
+ public function getSubitemList( $code, $key ) {
+ if ( in_array( $key, self::$splitKeys ) ) {
+ return $this->getSubitem( $code, 'list', $key );
+ } else {
+ $item = $this->getItem( $code, $key );
+ if ( is_array( $item ) ) {
+ return array_keys( $item );
+ } else {
+ return false;
+ }
+ }
+ }
+
+ /**
+ * Load an item into the cache.
+ * @param $code
+ * @param $key
+ */
+ protected function loadItem( $code, $key ) {
+ if ( !isset( $this->initialisedLangs[$code] ) ) {
+ $this->initLanguage( $code );
+ }
+
+ // Check to see if initLanguage() loaded it for us
+ if ( isset( $this->loadedItems[$code][$key] ) ) {
+ return;
+ }
+
+ if ( isset( $this->shallowFallbacks[$code] ) ) {
+ $this->loadItem( $this->shallowFallbacks[$code], $key );
+ return;
+ }
+
+ if ( in_array( $key, self::$splitKeys ) ) {
+ $subkeyList = $this->getSubitem( $code, 'list', $key );
+ foreach ( $subkeyList as $subkey ) {
+ if ( isset( $this->data[$code][$key][$subkey] ) ) {
+ continue;
+ }
+ $this->data[$code][$key][$subkey] = $this->getSubitem( $code, $key, $subkey );
+ }
+ } else {
+ $this->data[$code][$key] = $this->store->get( $code, $key );
+ }
+
+ $this->loadedItems[$code][$key] = true;
+ }
+
+ /**
+ * Load a subitem into the cache
+ * @param $code
+ * @param $key
+ * @param $subkey
+ * @return
+ */
+ protected function loadSubitem( $code, $key, $subkey ) {
+ if ( !in_array( $key, self::$splitKeys ) ) {
+ $this->loadItem( $code, $key );
+ return;
+ }
+
+ if ( !isset( $this->initialisedLangs[$code] ) ) {
+ $this->initLanguage( $code );
+ }
+
+ // Check to see if initLanguage() loaded it for us
+ if ( isset( $this->loadedItems[$code][$key] ) ||
+ isset( $this->loadedSubitems[$code][$key][$subkey] ) ) {
+ return;
+ }
+
+ if ( isset( $this->shallowFallbacks[$code] ) ) {
+ $this->loadSubitem( $this->shallowFallbacks[$code], $key, $subkey );
+ return;
+ }
+
+ $value = $this->store->get( $code, "$key:$subkey" );
+ $this->data[$code][$key][$subkey] = $value;
+ $this->loadedSubitems[$code][$key][$subkey] = true;
+ }
+
+ /**
+ * Returns true if the cache identified by $code is missing or expired.
+ * @return bool
+ */
+ public function isExpired( $code ) {
+ if ( $this->forceRecache && !isset( $this->recachedLangs[$code] ) ) {
+ wfDebug( __METHOD__ . "($code): forced reload\n" );
+ return true;
+ }
+
+ $deps = $this->store->get( $code, 'deps' );
+ $keys = $this->store->get( $code, 'list' );
+ $preload = $this->store->get( $code, 'preload' );
+ // Different keys may expire separately, at least in LCStore_Accel
+ if ( $deps === null || $keys === null || $preload === null ) {
+ wfDebug( __METHOD__ . "($code): cache missing, need to make one\n" );
+ return true;
+ }
+
+ foreach ( $deps as $dep ) {
+ // Because we're unserializing stuff from cache, we
+ // could receive objects of classes that don't exist
+ // anymore (e.g. uninstalled extensions)
+ // When this happens, always expire the cache
+ if ( !$dep instanceof CacheDependency || $dep->isExpired() ) {
+ wfDebug( __METHOD__ . "($code): cache for $code expired due to " .
+ get_class( $dep ) . "\n" );
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Initialise a language in this object. Rebuild the cache if necessary.
+ * @param $code
+ * @throws MWException
+ */
+ protected function initLanguage( $code ) {
+ if ( isset( $this->initialisedLangs[$code] ) ) {
+ return;
+ }
+
+ $this->initialisedLangs[$code] = true;
+
+ # If the code is of the wrong form for a Messages*.php file, do a shallow fallback
+ if ( !Language::isValidBuiltInCode( $code ) ) {
+ $this->initShallowFallback( $code, 'en' );
+ return;
+ }
+
+ # Recache the data if necessary
+ if ( !$this->manualRecache && $this->isExpired( $code ) ) {
+ if ( file_exists( Language::getMessagesFileName( $code ) ) ) {
+ $this->recache( $code );
+ } elseif ( $code === 'en' ) {
+ throw new MWException( 'MessagesEn.php is missing.' );
+ } else {
+ $this->initShallowFallback( $code, 'en' );
+ }
+ return;
+ }
+
+ # Preload some stuff
+ $preload = $this->getItem( $code, 'preload' );
+ if ( $preload === null ) {
+ if ( $this->manualRecache ) {
+ // No Messages*.php file. Do shallow fallback to en.
+ if ( $code === 'en' ) {
+ throw new MWException( 'No localisation cache found for English. ' .
+ 'Please run maintenance/rebuildLocalisationCache.php.' );
+ }
+ $this->initShallowFallback( $code, 'en' );
+ return;
+ } else {
+ throw new MWException( 'Invalid or missing localisation cache.' );
+ }
+ }
+ $this->data[$code] = $preload;
+ foreach ( $preload as $key => $item ) {
+ if ( in_array( $key, self::$splitKeys ) ) {
+ foreach ( $item as $subkey => $subitem ) {
+ $this->loadedSubitems[$code][$key][$subkey] = true;
+ }
+ } else {
+ $this->loadedItems[$code][$key] = true;
+ }
+ }
+ }
+
+ /**
+ * Create a fallback from one language to another, without creating a
+ * complete persistent cache.
+ * @param $primaryCode
+ * @param $fallbackCode
+ */
+ public function initShallowFallback( $primaryCode, $fallbackCode ) {
+ $this->data[$primaryCode] =& $this->data[$fallbackCode];
+ $this->loadedItems[$primaryCode] =& $this->loadedItems[$fallbackCode];
+ $this->loadedSubitems[$primaryCode] =& $this->loadedSubitems[$fallbackCode];
+ $this->shallowFallbacks[$primaryCode] = $fallbackCode;
+ }
+
+ /**
+ * Read a PHP file containing localisation data.
+ * @param $_fileName
+ * @param $_fileType
+ * @throws MWException
+ * @return array
+ */
+ protected function readPHPFile( $_fileName, $_fileType ) {
+ // Disable APC caching
+ $_apcEnabled = ini_set( 'apc.cache_by_default', '0' );
+ include( $_fileName );
+ ini_set( 'apc.cache_by_default', $_apcEnabled );
+
+ if ( $_fileType == 'core' || $_fileType == 'extension' ) {
+ $data = compact( self::$allKeys );
+ } elseif ( $_fileType == 'aliases' ) {
+ $data = compact( 'aliases' );
+ } else {
+ throw new MWException( __METHOD__ . ": Invalid file type: $_fileType" );
+ }
+ return $data;
+ }
+
+ /**
+ * Get the compiled plural rules for a given language from the XML files.
+ * @since 1.20
+ */
+ public function getCompiledPluralRules( $code ) {
+ $rules = $this->getPluralRules( $code );
+ if ( $rules === null ) {
+ return null;
+ }
+ try {
+ $compiledRules = CLDRPluralRuleEvaluator::compile( $rules );
+ } catch( CLDRPluralRuleError $e ) {
+ wfDebugLog( 'l10n', $e->getMessage() . "\n" );
+ return array();
+ }
+ return $compiledRules;
+ }
+
+ /**
+ * Get the plural rules for a given language from the XML files.
+ * Cached.
+ * @since 1.20
+ */
+ public function getPluralRules( $code ) {
+ global $IP;
+
+ if ( $this->pluralRules === null ) {
+ $cldrPlural = "$IP/languages/data/plurals.xml";
+ $mwPlural = "$IP/languages/data/plurals-mediawiki.xml";
+ // Load CLDR plural rules
+ $this->loadPluralFile( $cldrPlural );
+ if ( file_exists( $mwPlural ) ) {
+ // Override or extend
+ $this->loadPluralFile( $mwPlural );
+ }
+ }
+ if ( !isset( $this->pluralRules[$code] ) ) {
+ return null;
+ } else {
+ return $this->pluralRules[$code];
+ }
+ }
+
+ /**
+ * Load a plural XML file with the given filename, compile the relevant
+ * rules, and save the compiled rules in a process-local cache.
+ */
+ protected function loadPluralFile( $fileName ) {
+ $doc = new DOMDocument;
+ $doc->load( $fileName );
+ $rulesets = $doc->getElementsByTagName( "pluralRules" );
+ foreach ( $rulesets as $ruleset ) {
+ $codes = $ruleset->getAttribute( 'locales' );
+ $rules = array();
+ $ruleElements = $ruleset->getElementsByTagName( "pluralRule" );
+ foreach ( $ruleElements as $elt ) {
+ $rules[] = $elt->nodeValue;
+ }
+ foreach ( explode( ' ', $codes ) as $code ) {
+ $this->pluralRules[$code] = $rules;
+ }
+ }
+ }
+
+ /**
+ * Read the data from the source files for a given language, and register
+ * the relevant dependencies in the $deps array. If the localisation
+ * exists, the data array is returned, otherwise false is returned.
+ */
+ protected function readSourceFilesAndRegisterDeps( $code, &$deps ) {
+ global $IP;
+
+ $fileName = Language::getMessagesFileName( $code );
+ if ( !file_exists( $fileName ) ) {
+ return false;
+ }
+
+ $deps[] = new FileDependency( $fileName );
+ $data = $this->readPHPFile( $fileName, 'core' );
+
+ # Load CLDR plural rules for JavaScript
+ $data['pluralRules'] = $this->getPluralRules( $code );
+ # And for PHP
+ $data['compiledPluralRules'] = $this->getCompiledPluralRules( $code );
+
+ $deps['plurals'] = new FileDependency( "$IP/languages/data/plurals.xml" );
+ $deps['plurals-mw'] = new FileDependency( "$IP/languages/data/plurals-mediawiki.xml" );
+
+ return $data;
+ }
+
+ /**
+ * Merge two localisation values, a primary and a fallback, overwriting the
+ * primary value in place.
+ * @param $key
+ * @param $value
+ * @param $fallbackValue
+ */
+ protected function mergeItem( $key, &$value, $fallbackValue ) {
+ if ( !is_null( $value ) ) {
+ if ( !is_null( $fallbackValue ) ) {
+ if ( in_array( $key, self::$mergeableMapKeys ) ) {
+ $value = $value + $fallbackValue;
+ } elseif ( in_array( $key, self::$mergeableListKeys ) ) {
+ $value = array_unique( array_merge( $fallbackValue, $value ) );
+ } elseif ( in_array( $key, self::$mergeableAliasListKeys ) ) {
+ $value = array_merge_recursive( $value, $fallbackValue );
+ } elseif ( in_array( $key, self::$optionalMergeKeys ) ) {
+ if ( !empty( $value['inherit'] ) ) {
+ $value = array_merge( $fallbackValue, $value );
+ }
+
+ if ( isset( $value['inherit'] ) ) {
+ unset( $value['inherit'] );
+ }
+ } elseif ( in_array( $key, self::$magicWordKeys ) ) {
+ $this->mergeMagicWords( $value, $fallbackValue );
+ }
+ }
+ } else {
+ $value = $fallbackValue;
+ }
+ }
+
+ /**
+ * @param $value
+ * @param $fallbackValue
+ */
+ protected function mergeMagicWords( &$value, $fallbackValue ) {
+ foreach ( $fallbackValue as $magicName => $fallbackInfo ) {
+ if ( !isset( $value[$magicName] ) ) {
+ $value[$magicName] = $fallbackInfo;
+ } else {
+ $oldSynonyms = array_slice( $fallbackInfo, 1 );
+ $newSynonyms = array_slice( $value[$magicName], 1 );
+ $synonyms = array_values( array_unique( array_merge(
+ $newSynonyms, $oldSynonyms ) ) );
+ $value[$magicName] = array_merge( array( $fallbackInfo[0] ), $synonyms );
+ }
+ }
+ }
+
+ /**
+ * Given an array mapping language code to localisation value, such as is
+ * found in extension *.i18n.php files, iterate through a fallback sequence
+ * to merge the given data with an existing primary value.
+ *
+ * Returns true if any data from the extension array was used, false
+ * otherwise.
+ * @param $codeSequence
+ * @param $key
+ * @param $value
+ * @param $fallbackValue
+ * @return bool
+ */
+ protected function mergeExtensionItem( $codeSequence, $key, &$value, $fallbackValue ) {
+ $used = false;
+ foreach ( $codeSequence as $code ) {
+ if ( isset( $fallbackValue[$code] ) ) {
+ $this->mergeItem( $key, $value, $fallbackValue[$code] );
+ $used = true;
+ }
+ }
+
+ return $used;
+ }
+
+ /**
+ * Load localisation data for a given language for both core and extensions
+ * and save it to the persistent cache store and the process cache
+ * @param $code
+ * @throws MWException
+ */
+ public function recache( $code ) {
+ global $wgExtensionMessagesFiles;
+ wfProfileIn( __METHOD__ );
+
+ if ( !$code ) {
+ throw new MWException( "Invalid language code requested" );
+ }
+ $this->recachedLangs[$code] = true;
+
+ # Initial values
+ $initialData = array_combine(
+ self::$allKeys,
+ array_fill( 0, count( self::$allKeys ), null ) );
+ $coreData = $initialData;
+ $deps = array();
+
+ # Load the primary localisation from the source file
+ $data = $this->readSourceFilesAndRegisterDeps( $code, $deps );
+ if ( $data === false ) {
+ wfDebug( __METHOD__ . ": no localisation file for $code, using fallback to en\n" );
+ $coreData['fallback'] = 'en';
+ } else {
+ wfDebug( __METHOD__ . ": got localisation for $code from source\n" );
+
+ # Merge primary localisation
+ foreach ( $data as $key => $value ) {
+ $this->mergeItem( $key, $coreData[$key], $value );
+ }
+
+ }
+
+ # Fill in the fallback if it's not there already
+ if ( is_null( $coreData['fallback'] ) ) {
+ $coreData['fallback'] = $code === 'en' ? false : 'en';
+ }
+ if ( $coreData['fallback'] === false ) {
+ $coreData['fallbackSequence'] = array();
+ } else {
+ $coreData['fallbackSequence'] = array_map( 'trim', explode( ',', $coreData['fallback'] ) );
+ $len = count( $coreData['fallbackSequence'] );
+
+ # Ensure that the sequence ends at en
+ if ( $coreData['fallbackSequence'][$len - 1] !== 'en' ) {
+ $coreData['fallbackSequence'][] = 'en';
+ }
+
+ # Load the fallback localisation item by item and merge it
+ foreach ( $coreData['fallbackSequence'] as $fbCode ) {
+ # Load the secondary localisation from the source file to
+ # avoid infinite cycles on cyclic fallbacks
+ $fbData = $this->readSourceFilesAndRegisterDeps( $fbCode, $deps );
+ if ( $fbData === false ) {
+ continue;
+ }
+
+ foreach ( self::$allKeys as $key ) {
+ if ( !isset( $fbData[$key] ) ) {
+ continue;
+ }
+
+ if ( is_null( $coreData[$key] ) || $this->isMergeableKey( $key ) ) {
+ $this->mergeItem( $key, $coreData[$key], $fbData[$key] );
+ }
+ }
+ }
+ }
+
+ $codeSequence = array_merge( array( $code ), $coreData['fallbackSequence'] );
+
+ # Load the extension localisations
+ # This is done after the core because we know the fallback sequence now.
+ # But it has a higher precedence for merging so that we can support things
+ # like site-specific message overrides.
+ $allData = $initialData;
+ foreach ( $wgExtensionMessagesFiles as $fileName ) {
+ $data = $this->readPHPFile( $fileName, 'extension' );
+ $used = false;
+
+ foreach ( $data as $key => $item ) {
+ if ( $this->mergeExtensionItem( $codeSequence, $key, $allData[$key], $item ) ) {
+ $used = true;
+ }
+ }
+
+ if ( $used ) {
+ $deps[] = new FileDependency( $fileName );
+ }
+ }
+
+ # Merge core data into extension data
+ foreach ( $coreData as $key => $item ) {
+ $this->mergeItem( $key, $allData[$key], $item );
+ }
+
+ # Add cache dependencies for any referenced globals
+ $deps['wgExtensionMessagesFiles'] = new GlobalDependency( 'wgExtensionMessagesFiles' );
+ $deps['version'] = new ConstantDependency( 'MW_LC_VERSION' );
+
+ # Add dependencies to the cache entry
+ $allData['deps'] = $deps;
+
+ # Replace spaces with underscores in namespace names
+ $allData['namespaceNames'] = str_replace( ' ', '_', $allData['namespaceNames'] );
+
+ # And do the same for special page aliases. $page is an array.
+ foreach ( $allData['specialPageAliases'] as &$page ) {
+ $page = str_replace( ' ', '_', $page );
+ }
+ # Decouple the reference to prevent accidental damage
+ unset( $page );
+
+ # If there were no plural rules, return an empty array
+ if ( $allData['pluralRules'] === null ) {
+ $allData['pluralRules'] = array();
+ }
+ if ( $allData['compiledPluralRules'] === null ) {
+ $allData['compiledPluralRules'] = array();
+ }
+
+ # Set the list keys
+ $allData['list'] = array();
+ foreach ( self::$splitKeys as $key ) {
+ $allData['list'][$key] = array_keys( $allData[$key] );
+ }
+ # Run hooks
+ wfRunHooks( 'LocalisationCacheRecache', array( $this, $code, &$allData ) );
+
+ if ( is_null( $allData['namespaceNames'] ) ) {
+ throw new MWException( __METHOD__ . ': Localisation data failed sanity check! ' .
+ 'Check that your languages/messages/MessagesEn.php file is intact.' );
+ }
+
+ # Set the preload key
+ $allData['preload'] = $this->buildPreload( $allData );
+
+ # Save to the process cache and register the items loaded
+ $this->data[$code] = $allData;
+ foreach ( $allData as $key => $item ) {
+ $this->loadedItems[$code][$key] = true;
+ }
+
+ # Save to the persistent cache
+ $this->store->startWrite( $code );
+ foreach ( $allData as $key => $value ) {
+ if ( in_array( $key, self::$splitKeys ) ) {
+ foreach ( $value as $subkey => $subvalue ) {
+ $this->store->set( "$key:$subkey", $subvalue );
+ }
+ } else {
+ $this->store->set( $key, $value );
+ }
+ }
+ $this->store->finishWrite();
+
+ # Clear out the MessageBlobStore
+ # HACK: If using a null (i.e. disabled) storage backend, we
+ # can't write to the MessageBlobStore either
+ if ( !$this->store instanceof LCStore_Null ) {
+ MessageBlobStore::clear();
+ }
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Build the preload item from the given pre-cache data.
+ *
+ * The preload item will be loaded automatically, improving performance
+ * for the commonly-requested items it contains.
+ * @param $data
+ * @return array
+ */
+ protected function buildPreload( $data ) {
+ $preload = array( 'messages' => array() );
+ foreach ( self::$preloadedKeys as $key ) {
+ $preload[$key] = $data[$key];
+ }
+
+ foreach ( $data['preloadedMessages'] as $subkey ) {
+ if ( isset( $data['messages'][$subkey] ) ) {
+ $subitem = $data['messages'][$subkey];
+ } else {
+ $subitem = null;
+ }
+ $preload['messages'][$subkey] = $subitem;
+ }
+
+ return $preload;
+ }
+
+ /**
+ * Unload the data for a given language from the object cache.
+ * Reduces memory usage.
+ * @param $code
+ */
+ public function unload( $code ) {
+ unset( $this->data[$code] );
+ unset( $this->loadedItems[$code] );
+ unset( $this->loadedSubitems[$code] );
+ unset( $this->initialisedLangs[$code] );
+
+ foreach ( $this->shallowFallbacks as $shallowCode => $fbCode ) {
+ if ( $fbCode === $code ) {
+ $this->unload( $shallowCode );
+ }
+ }
+ }
+
+ /**
+ * Unload all data
+ */
+ public function unloadAll() {
+ foreach ( $this->initialisedLangs as $lang => $unused ) {
+ $this->unload( $lang );
+ }
+ }
+
+ /**
+ * Disable the storage backend
+ */
+ public function disableBackend() {
+ $this->store = new LCStore_Null;
+ $this->manualRecache = false;
+ }
+}
+
+/**
+ * Interface for the persistence layer of LocalisationCache.
+ *
+ * The persistence layer is two-level hierarchical cache. The first level
+ * is the language, the second level is the item or subitem.
+ *
+ * Since the data for a whole language is rebuilt in one operation, it needs
+ * to have a fast and atomic method for deleting or replacing all of the
+ * current data for a given language. The interface reflects this bulk update
+ * operation. Callers writing to the cache must first call startWrite(), then
+ * will call set() a couple of thousand times, then will call finishWrite()
+ * to commit the operation. When finishWrite() is called, the cache is
+ * expected to delete all data previously stored for that language.
+ *
+ * The values stored are PHP variables suitable for serialize(). Implementations
+ * of LCStore are responsible for serializing and unserializing.
+ */
+interface LCStore {
+ /**
+ * Get a value.
+ * @param string $code Language code
+ * @param string $key Cache key
+ */
+ function get( $code, $key );
+
+ /**
+ * Start a write transaction.
+ * @param $code Language code
+ */
+ function startWrite( $code );
+
+ /**
+ * Finish a write transaction.
+ */
+ function finishWrite();
+
+ /**
+ * Set a key to a given value. startWrite() must be called before this
+ * is called, and finishWrite() must be called afterwards.
+ * @param $key
+ * @param $value
+ */
+ function set( $key, $value );
+}
+
+/**
+ * LCStore implementation which uses PHP accelerator to store data.
+ * This will work if one of XCache, WinCache or APC cacher is configured.
+ * (See ObjectCache.php)
+ */
+class LCStore_Accel implements LCStore {
+ var $currentLang;
+ var $keys;
+
+ public function __construct() {
+ $this->cache = wfGetCache( CACHE_ACCEL );
+ }
+
+ public function get( $code, $key ) {
+ $k = wfMemcKey( 'l10n', $code, 'k', $key );
+ $r = $this->cache->get( $k );
+ return $r === false ? null : $r;
+ }
+
+ public function startWrite( $code ) {
+ $k = wfMemcKey( 'l10n', $code, 'l' );
+ $keys = $this->cache->get( $k );
+ if ( $keys ) {
+ foreach ( $keys as $k ) {
+ $this->cache->delete( $k );
+ }
+ }
+ $this->currentLang = $code;
+ $this->keys = array();
+ }
+
+ public function finishWrite() {
+ if ( $this->currentLang ) {
+ $k = wfMemcKey( 'l10n', $this->currentLang, 'l' );
+ $this->cache->set( $k, array_keys( $this->keys ) );
+ }
+ $this->currentLang = null;
+ $this->keys = array();
+ }
+
+ public function set( $key, $value ) {
+ if ( $this->currentLang ) {
+ $k = wfMemcKey( 'l10n', $this->currentLang, 'k', $key );
+ $this->keys[$k] = true;
+ $this->cache->set( $k, $value );
+ }
+ }
+}
+
+/**
+ * LCStore implementation which uses the standard DB functions to store data.
+ * This will work on any MediaWiki installation.
+ */
+class LCStore_DB implements LCStore {
+ var $currentLang;
+ var $writesDone = false;
+
+ /**
+ * @var DatabaseBase
+ */
+ var $dbw;
+ var $batch;
+ var $readOnly = false;
+
+ public function get( $code, $key ) {
+ if ( $this->writesDone ) {
+ $db = wfGetDB( DB_MASTER );
+ } else {
+ $db = wfGetDB( DB_SLAVE );
+ }
+ $row = $db->selectRow( 'l10n_cache', array( 'lc_value' ),
+ array( 'lc_lang' => $code, 'lc_key' => $key ), __METHOD__ );
+ if ( $row ) {
+ return unserialize( $row->lc_value );
+ } else {
+ return null;
+ }
+ }
+
+ public function startWrite( $code ) {
+ if ( $this->readOnly ) {
+ return;
+ }
+
+ if ( !$code ) {
+ throw new MWException( __METHOD__ . ": Invalid language \"$code\"" );
+ }
+
+ $this->dbw = wfGetDB( DB_MASTER );
+ try {
+ $this->dbw->begin( __METHOD__ );
+ $this->dbw->delete( 'l10n_cache', array( 'lc_lang' => $code ), __METHOD__ );
+ } catch ( DBQueryError $e ) {
+ if ( $this->dbw->wasReadOnlyError() ) {
+ $this->readOnly = true;
+ $this->dbw->rollback( __METHOD__ );
+ return;
+ } else {
+ throw $e;
+ }
+ }
+
+ $this->currentLang = $code;
+ $this->batch = array();
+ }
+
+ public function finishWrite() {
+ if ( $this->readOnly ) {
+ return;
+ }
+
+ if ( $this->batch ) {
+ $this->dbw->insert( 'l10n_cache', $this->batch, __METHOD__ );
+ }
+
+ $this->dbw->commit( __METHOD__ );
+ $this->currentLang = null;
+ $this->dbw = null;
+ $this->batch = array();
+ $this->writesDone = true;
+ }
+
+ public function set( $key, $value ) {
+ if ( $this->readOnly ) {
+ return;
+ }
+
+ if ( is_null( $this->currentLang ) ) {
+ throw new MWException( __CLASS__ . ': must call startWrite() before calling set()' );
+ }
+
+ $this->batch[] = array(
+ 'lc_lang' => $this->currentLang,
+ 'lc_key' => $key,
+ 'lc_value' => serialize( $value ) );
+
+ if ( count( $this->batch ) >= 100 ) {
+ $this->dbw->insert( 'l10n_cache', $this->batch, __METHOD__ );
+ $this->batch = array();
+ }
+ }
+}
+
+/**
+ * LCStore implementation which stores data as a collection of CDB files in the
+ * directory given by $wgCacheDirectory. If $wgCacheDirectory is not set, this
+ * will throw an exception.
+ *
+ * Profiling indicates that on Linux, this implementation outperforms MySQL if
+ * the directory is on a local filesystem and there is ample kernel cache
+ * space. The performance advantage is greater when the DBA extension is
+ * available than it is with the PHP port.
+ *
+ * See Cdb.php and http://cr.yp.to/cdb.html
+ */
+class LCStore_CDB implements LCStore {
+ var $readers, $writer, $currentLang, $directory;
+
+ function __construct( $conf = array() ) {
+ global $wgCacheDirectory;
+
+ if ( isset( $conf['directory'] ) ) {
+ $this->directory = $conf['directory'];
+ } else {
+ $this->directory = $wgCacheDirectory;
+ }
+ }
+
+ public function get( $code, $key ) {
+ if ( !isset( $this->readers[$code] ) ) {
+ $fileName = $this->getFileName( $code );
+
+ if ( !file_exists( $fileName ) ) {
+ $this->readers[$code] = false;
+ } else {
+ $this->readers[$code] = CdbReader::open( $fileName );
+ }
+ }
+
+ if ( !$this->readers[$code] ) {
+ return null;
+ } else {
+ $value = $this->readers[$code]->get( $key );
+
+ if ( $value === false ) {
+ return null;
+ }
+ return unserialize( $value );
+ }
+ }
+
+ public function startWrite( $code ) {
+ if ( !file_exists( $this->directory ) ) {
+ if ( !wfMkdirParents( $this->directory, null, __METHOD__ ) ) {
+ throw new MWException( "Unable to create the localisation store " .
+ "directory \"{$this->directory}\"" );
+ }
+ }
+
+ // Close reader to stop permission errors on write
+ if ( !empty( $this->readers[$code] ) ) {
+ $this->readers[$code]->close();
+ }
+
+ $this->writer = CdbWriter::open( $this->getFileName( $code ) );
+ $this->currentLang = $code;
+ }
+
+ public function finishWrite() {
+ // Close the writer
+ $this->writer->close();
+ $this->writer = null;
+ unset( $this->readers[$this->currentLang] );
+ $this->currentLang = null;
+ }
+
+ public function set( $key, $value ) {
+ if ( is_null( $this->writer ) ) {
+ throw new MWException( __CLASS__ . ': must call startWrite() before calling set()' );
+ }
+ $this->writer->set( $key, serialize( $value ) );
+ }
+
+ protected function getFileName( $code ) {
+ if ( strval( $code ) === '' || strpos( $code, '/' ) !== false ) {
+ throw new MWException( __METHOD__ . ": Invalid language \"$code\"" );
+ }
+ return "{$this->directory}/l10n_cache-$code.cdb";
+ }
+}
+
+/**
+ * Null store backend, used to avoid DB errors during install
+ */
+class LCStore_Null implements LCStore {
+ public function get( $code, $key ) {
+ return null;
+ }
+
+ public function startWrite( $code ) {}
+ public function finishWrite() {}
+ public function set( $key, $value ) {}
+}
+
+/**
+ * A localisation cache optimised for loading large amounts of data for many
+ * languages. Used by rebuildLocalisationCache.php.
+ */
+class LocalisationCache_BulkLoad extends LocalisationCache {
+ /**
+ * A cache of the contents of data files.
+ * Core files are serialized to avoid using ~1GB of RAM during a recache.
+ */
+ var $fileCache = array();
+
+ /**
+ * Most recently used languages. Uses the linked-list aspect of PHP hashtables
+ * to keep the most recently used language codes at the end of the array, and
+ * the language codes that are ready to be deleted at the beginning.
+ */
+ var $mruLangs = array();
+
+ /**
+ * Maximum number of languages that may be loaded into $this->data
+ */
+ var $maxLoadedLangs = 10;
+
+ /**
+ * @param $fileName
+ * @param $fileType
+ * @return array|mixed
+ */
+ protected function readPHPFile( $fileName, $fileType ) {
+ $serialize = $fileType === 'core';
+ if ( !isset( $this->fileCache[$fileName][$fileType] ) ) {
+ $data = parent::readPHPFile( $fileName, $fileType );
+
+ if ( $serialize ) {
+ $encData = serialize( $data );
+ } else {
+ $encData = $data;
+ }
+
+ $this->fileCache[$fileName][$fileType] = $encData;
+
+ return $data;
+ } elseif ( $serialize ) {
+ return unserialize( $this->fileCache[$fileName][$fileType] );
+ } else {
+ return $this->fileCache[$fileName][$fileType];
+ }
+ }
+
+ /**
+ * @param $code
+ * @param $key
+ * @return mixed
+ */
+ public function getItem( $code, $key ) {
+ unset( $this->mruLangs[$code] );
+ $this->mruLangs[$code] = true;
+ return parent::getItem( $code, $key );
+ }
+
+ /**
+ * @param $code
+ * @param $key
+ * @param $subkey
+ * @return
+ */
+ public function getSubitem( $code, $key, $subkey ) {
+ unset( $this->mruLangs[$code] );
+ $this->mruLangs[$code] = true;
+ return parent::getSubitem( $code, $key, $subkey );
+ }
+
+ /**
+ * @param $code
+ */
+ public function recache( $code ) {
+ parent::recache( $code );
+ unset( $this->mruLangs[$code] );
+ $this->mruLangs[$code] = true;
+ $this->trimCache();
+ }
+
+ /**
+ * @param $code
+ */
+ public function unload( $code ) {
+ unset( $this->mruLangs[$code] );
+ parent::unload( $code );
+ }
+
+ /**
+ * Unload cached languages until there are less than $this->maxLoadedLangs
+ */
+ protected function trimCache() {
+ while ( count( $this->data ) > $this->maxLoadedLangs && count( $this->mruLangs ) ) {
+ reset( $this->mruLangs );
+ $code = key( $this->mruLangs );
+ wfDebug( __METHOD__ . ": unloading $code\n" );
+ $this->unload( $code );
+ }
+ }
+
+}
diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php
index b854a2ec..c406b5c3 100644
--- a/includes/cache/MessageCache.php
+++ b/includes/cache/MessageCache.php
@@ -60,26 +60,6 @@ class MessageCache {
protected $mLoadedLanguages = array();
/**
- * Used for automatic detection of most used messages.
- */
- protected $mRequestedMessages = array();
-
- /**
- * How long the message request counts are stored. Longer period gives
- * better sample, but also takes longer to adapt changes. The counts
- * are aggregrated per day, regardless of the value of this variable.
- */
- protected static $mAdaptiveDataAge = 604800; // Is 7*24*3600
-
- /**
- * Filter the tail of less used messages that are requested more seldom
- * than this factor times the number of request of most requested message.
- * These messages are not loaded in the default set, but are still cached
- * individually on demand with the normal cache expiry time.
- */
- protected static $mAdaptiveInclusionThreshold = 0.05;
-
- /**
* Singleton instance
*
* @var MessageCache
@@ -142,7 +122,7 @@ class MessageCache {
* Actual format of the file depends on the $wgLocalMessageCacheSerialized
* setting.
*
- * @param $hash String: the hash of contents, to check validity.
+ * @param string $hash the hash of contents, to check validity.
* @param $code Mixed: Optional language code, see documenation of load().
* @return bool on failure.
*/
@@ -277,12 +257,15 @@ class MessageCache {
* or false if populating empty cache fails. Also returns true if MessageCache
* is disabled.
*
- * @param $code String: language to which load messages
+ * @param bool|String $code String: language to which load messages
+ * @throws MWException
* @return bool
*/
function load( $code = false ) {
global $wgUseLocalMessageCache;
+ $exception = null; // deferred error
+
if( !is_string( $code ) ) {
# This isn't really nice, so at least make a note about it and try to
# fall back
@@ -344,35 +327,52 @@ class MessageCache {
$where[] = 'cache is empty';
$where[] = 'loading from database';
- $this->lock( $cacheKey );
-
+ if ( $this->lock( $cacheKey ) ) {
+ $that = $this;
+ $osc = new ScopedCallback( function() use ( $that, $cacheKey ) {
+ $that->unlock( $cacheKey );
+ } );
+ }
# Limit the concurrency of loadFromDB to a single process
# This prevents the site from going down when the cache expires
$statusKey = wfMemcKey( 'messages', $code, 'status' );
$success = $this->mMemc->add( $statusKey, 'loading', MSG_LOAD_TIMEOUT );
- if ( $success ) {
+ if ( $success ) { // acquired lock
+ $cache = $this->mMemc;
+ $isc = new ScopedCallback( function() use ( $cache, $statusKey ) {
+ $cache->delete( $statusKey );
+ } );
$cache = $this->loadFromDB( $code );
$success = $this->setCache( $cache, $code );
- }
- if ( $success ) {
- $success = $this->saveToCaches( $cache, true, $code );
- if ( $success ) {
- $this->mMemc->delete( $statusKey );
+ if ( $success ) { // messages loaded
+ $success = $this->saveToCaches( $cache, true, $code );
+ $isc = null; // unlock
+ if ( !$success ) {
+ $this->mMemc->set( $statusKey, 'error', 60 * 5 );
+ wfDebug( __METHOD__ . ": set() error: restart memcached server!\n" );
+ $exception = new MWException( "Could not save cache for '$code'." );
+ }
} else {
- $this->mMemc->set( $statusKey, 'error', 60 * 5 );
- wfDebug( "MemCached set error in MessageCache: restart memcached server!\n" );
+ $isc = null; // unlock
+ $exception = new MWException( "Could not load cache from DB for '$code'." );
}
+ } else {
+ $exception = new MWException( "Could not acquire '$statusKey' lock." );
}
- $this->unlock($cacheKey);
+ $osc = null; // unlock
}
if ( !$success ) {
- # Bad luck... this should not happen
- $where[] = 'loading FAILED - cache is disabled';
- $info = implode( ', ', $where );
- wfDebug( __METHOD__ . ": Loading $code... $info\n" );
$this->mDisable = true;
$this->mCache = false;
+ // This used to go on, but that led to lots of nasty side
+ // effects like gadgets and sidebar getting cached with their
+ // default content
+ if ( $exception instanceof Exception ) {
+ throw $exception;
+ } else {
+ throw new MWException( "MessageCache failed to load messages" );
+ }
} else {
# All good, just record the success
$info = implode( ', ', $where );
@@ -388,7 +388,7 @@ class MessageCache {
* $wgMaxMsgCacheEntrySize are assigned a special value, and are loaded
* on-demand from the database later.
*
- * @param $code String: language code.
+ * @param string $code language code.
* @return Array: loaded messages for storing in caches.
*/
function loadFromDB( $code ) {
@@ -404,19 +404,20 @@ class MessageCache {
);
$mostused = array();
- if ( $wgAdaptiveMessageCache ) {
- $mostused = $this->getMostUsedMessages();
- if ( $code !== $wgLanguageCode ) {
- foreach ( $mostused as $key => $value ) {
- $mostused[$key] = "$value/$code";
- }
+ if ( $wgAdaptiveMessageCache && $code !== $wgLanguageCode ) {
+ if ( !isset( $this->mCache[$wgLanguageCode] ) ) {
+ $this->load( $wgLanguageCode );
+ }
+ $mostused = array_keys( $this->mCache[$wgLanguageCode] );
+ foreach ( $mostused as $key => $value ) {
+ $mostused[$key] = "$value/$code";
}
}
if ( count( $mostused ) ) {
$conds['page_title'] = $mostused;
} elseif ( $code !== $wgLanguageCode ) {
- $conds[] = 'page_title' . $dbr->buildLike( $dbr->anyString(), "/$code" );
+ $conds[] = 'page_title' . $dbr->buildLike( $dbr->anyString(), '/', $code );
} else {
# Effectively disallows use of '/' character in NS_MEDIAWIKI for uses
# other than language code.
@@ -459,12 +460,6 @@ class MessageCache {
$cache[$row->page_title] = $entry;
}
- foreach ( $mostused as $key ) {
- if ( !isset( $cache[$key] ) ) {
- $cache[$key] = '!NONEXISTENT';
- }
- }
-
$cache['VERSION'] = MSG_CACHE_VERSION;
wfProfileOut( __METHOD__ );
return $cache;
@@ -473,7 +468,7 @@ class MessageCache {
/**
* Updates cache as necessary when message page is changed
*
- * @param $title String: name of the page changed.
+ * @param string $title name of the page changed.
* @param $text Mixed: new contents of the page.
*/
public function replace( $title, $text ) {
@@ -512,7 +507,7 @@ class MessageCache {
// Also delete cached sidebar... just in case it is affected
$codes = array( $code );
- if ( $code === 'en' ) {
+ if ( $code === 'en' ) {
// Delete all sidebars, like for example on action=purge on the
// sidebar messages
$codes = array_keys( Language::fetchLanguageNames() );
@@ -536,9 +531,9 @@ class MessageCache {
/**
* Shortcut to update caches.
*
- * @param $cache Array: cached messages with a version.
- * @param $memc Bool: Wether to update or not memcache.
- * @param $code String: Language code.
+ * @param array $cache cached messages with a version.
+ * @param bool $memc Wether to update or not memcache.
+ * @param string $code Language code.
* @return bool on somekind of error.
*/
protected function saveToCaches( $cache, $memc = true, $code = false ) {
@@ -558,7 +553,7 @@ class MessageCache {
$serialized = serialize( $cache );
$hash = md5( $serialized );
$this->mMemc->set( wfMemcKey( 'messages', $code, 'hash' ), $hash, $this->mExpiry );
- if ($wgLocalMessageCacheSerialized) {
+ if ( $wgLocalMessageCacheSerialized ) {
$this->saveToLocal( $serialized, $hash, $code );
} else {
$this->saveToScript( $cache, $hash, $code );
@@ -593,10 +588,10 @@ class MessageCache {
/**
* Get a message from either the content language or the user language.
*
- * @param $key String: the message cache key
+ * @param string $key the message cache key
* @param $useDB Boolean: get the message from the DB, false to use only
* the localisation
- * @param $langcode String: code of the language to get the message for, if
+ * @param bool|string $langcode Code of the language to get the message for, if
* it is a valid code create a language for that language,
* if it is a string but not a valid code then make a basic
* language object, if it is a false boolean then use the
@@ -607,6 +602,7 @@ class MessageCache {
* @param $isFullKey Boolean: specifies whether $key is a two part key
* "msg/lang".
*
+ * @throws MWException
* @return string|bool
*/
function get( $key, $useDB = true, $langcode = true, $isFullKey = false ) {
@@ -645,13 +641,6 @@ class MessageCache {
$uckey = $wgContLang->ucfirst( $lckey );
}
- /**
- * Record each message request, but only once per request.
- * This information is not used unless $wgAdaptiveMessageCache
- * is enabled.
- */
- $this->mRequestedMessages[$uckey] = true;
-
# Try the MediaWiki namespace
if( !$this->mDisable && $useDB ) {
$title = $uckey;
@@ -712,14 +701,12 @@ class MessageCache {
* Get a message from the MediaWiki namespace, with caching. The key must
* first be converted to two-part lang/msg form if necessary.
*
- * @param $title String: Message cache key with initial uppercase letter.
- * @param $code String: code denoting the language to try.
+ * @param string $title Message cache key with initial uppercase letter.
+ * @param string $code code denoting the language to try.
*
* @return string|bool False on failure
*/
function getMsgFromNamespace( $title, $code ) {
- global $wgAdaptiveMessageCache;
-
$this->load( $code );
if ( isset( $this->mCache[$code][$title] ) ) {
$entry = $this->mCache[$code][$title];
@@ -738,15 +725,7 @@ class MessageCache {
return $message;
}
- /**
- * If message cache is in normal mode, it is guaranteed
- * (except bugs) that there is always entry (or placeholder)
- * in the cache if message exists. Thus we can do minor
- * performance improvement and return false early.
- */
- if ( !$wgAdaptiveMessageCache ) {
- return false;
- }
+ return false;
}
# Try the individual message cache
@@ -770,16 +749,32 @@ class MessageCache {
Title::makeTitle( NS_MEDIAWIKI, $title ), false, Revision::READ_LATEST
);
if ( $revision ) {
- $message = $revision->getText();
- if ($message === false) {
+ $content = $revision->getContent();
+ if ( !$content ) {
// A possibly temporary loading failure.
wfDebugLog( 'MessageCache', __METHOD__ . ": failed to load message page text for {$title} ($code)" );
+ $message = null; // no negative caching
} else {
- $this->mCache[$code][$title] = ' ' . $message;
- $this->mMemc->set( $titleKey, ' ' . $message, $this->mExpiry );
+ // XXX: Is this the right way to turn a Content object into a message?
+ // NOTE: $content is typically either WikitextContent, JavaScriptContent or CssContent.
+ // MessageContent is *not* used for storing messages, it's only used for wrapping them when needed.
+ $message = $content->getWikitextForTransclusion();
+
+ if ( $message === false || $message === null ) {
+ wfDebugLog( 'MessageCache', __METHOD__ . ": message content doesn't provide wikitext "
+ . "(content model: " . $content->getContentHandler() . ")" );
+
+ $message = false; // negative caching
+ } else {
+ $this->mCache[$code][$title] = ' ' . $message;
+ $this->mMemc->set( $titleKey, ' ' . $message, $this->mExpiry );
+ }
}
} else {
- $message = false;
+ $message = false; // negative caching
+ }
+
+ if ( $message === false ) { // negative caching
$this->mCache[$code][$title] = '!NONEXISTENT';
$this->mMemc->set( $titleKey, '!NONEXISTENT', $this->mExpiry );
}
@@ -845,7 +840,7 @@ class MessageCache {
* @param $linestart bool
* @param $interface bool
* @param $language
- * @return ParserOutput
+ * @return ParserOutput|string
*/
public function parse( $text, $title = null, $linestart = true, $interface = false, $language = null ) {
if ( $this->mInParser ) {
@@ -890,7 +885,7 @@ class MessageCache {
*/
function clear() {
$langs = Language::fetchLanguageNames( null, 'mw' );
- foreach ( array_keys($langs) as $code ) {
+ foreach ( array_keys( $langs ) as $code ) {
# Global cache
$this->mMemc->delete( wfMemcKey( 'messages', $code ) );
# Invalidate all local caches
@@ -919,82 +914,6 @@ class MessageCache {
return array( $message, $lang );
}
- public static function logMessages() {
- wfProfileIn( __METHOD__ );
- global $wgAdaptiveMessageCache;
- if ( !$wgAdaptiveMessageCache || !self::$instance instanceof MessageCache ) {
- wfProfileOut( __METHOD__ );
- return;
- }
-
- $cachekey = wfMemckey( 'message-profiling' );
- $cache = wfGetCache( CACHE_DB );
- $data = $cache->get( $cachekey );
-
- if ( !$data ) {
- $data = array();
- }
-
- $age = self::$mAdaptiveDataAge;
- $filterDate = substr( wfTimestamp( TS_MW, time() - $age ), 0, 8 );
- foreach ( array_keys( $data ) as $key ) {
- if ( $key < $filterDate ) {
- unset( $data[$key] );
- }
- }
-
- $index = substr( wfTimestampNow(), 0, 8 );
- if ( !isset( $data[$index] ) ) {
- $data[$index] = array();
- }
-
- foreach ( self::$instance->mRequestedMessages as $message => $_ ) {
- if ( !isset( $data[$index][$message] ) ) {
- $data[$index][$message] = 0;
- }
- $data[$index][$message]++;
- }
-
- $cache->set( $cachekey, $data );
- wfProfileOut( __METHOD__ );
- }
-
- /**
- * @return array
- */
- public function getMostUsedMessages() {
- wfProfileIn( __METHOD__ );
- $cachekey = wfMemcKey( 'message-profiling' );
- $cache = wfGetCache( CACHE_DB );
- $data = $cache->get( $cachekey );
- if ( !$data ) {
- wfProfileOut( __METHOD__ );
- return array();
- }
-
- $list = array();
-
- foreach( $data as $messages ) {
- foreach( $messages as $message => $count ) {
- $key = $message;
- if ( !isset( $list[$key] ) ) {
- $list[$key] = 0;
- }
- $list[$key] += $count;
- }
- }
-
- $max = max( $list );
- foreach ( $list as $message => $count ) {
- if ( $count < intval( $max * self::$mAdaptiveInclusionThreshold ) ) {
- unset( $list[$message] );
- }
- }
-
- wfProfileOut( __METHOD__ );
- return array_keys( $list );
- }
-
/**
* Get all message keys stored in the message cache for a given language.
* If $code is the content language code, this will return all message keys
diff --git a/includes/cache/ProcessCacheLRU.php b/includes/cache/ProcessCacheLRU.php
index f215ebd8..76c76f37 100644
--- a/includes/cache/ProcessCacheLRU.php
+++ b/includes/cache/ProcessCacheLRU.php
@@ -28,6 +28,8 @@
class ProcessCacheLRU {
/** @var Array */
protected $cache = array(); // (key => prop => value)
+ /** @var Array */
+ protected $cacheTimes = array(); // (key => prop => UNIX timestamp)
protected $maxCacheKeys; // integer; max entries
@@ -44,7 +46,7 @@ class ProcessCacheLRU {
/**
* Set a property field for a cache entry.
- * This will prune the cache if it gets too large.
+ * This will prune the cache if it gets too large based on LRU.
* If the item is already set, it will be pushed to the top of the cache.
*
* @param $key string
@@ -57,9 +59,12 @@ class ProcessCacheLRU {
$this->ping( $key ); // push to top
} elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
reset( $this->cache );
- unset( $this->cache[key( $this->cache )] );
+ $evictKey = key( $this->cache );
+ unset( $this->cache[$evictKey] );
+ unset( $this->cacheTimes[$evictKey] );
}
$this->cache[$key][$prop] = $value;
+ $this->cacheTimes[$key][$prop] = time();
}
/**
@@ -67,10 +72,14 @@ class ProcessCacheLRU {
*
* @param $key string
* @param $prop string
+ * @param $maxAge integer Ignore items older than this many seconds (since 1.21)
* @return bool
*/
- public function has( $key, $prop ) {
- return isset( $this->cache[$key][$prop] );
+ public function has( $key, $prop, $maxAge = 0 ) {
+ if ( isset( $this->cache[$key][$prop] ) ) {
+ return ( $maxAge <= 0 || ( time() - $this->cacheTimes[$key][$prop] ) <= $maxAge );
+ }
+ return false;
}
/**
@@ -100,9 +109,11 @@ class ProcessCacheLRU {
public function clear( $keys = null ) {
if ( $keys === null ) {
$this->cache = array();
+ $this->cacheTimes = array();
} else {
foreach ( (array)$keys as $key ) {
unset( $this->cache[$key] );
+ unset( $this->cacheTimes[$key] );
}
}
}
diff --git a/includes/cache/SquidUpdate.php b/includes/cache/SquidUpdate.php
index 423e3884..39bf4c9f 100644
--- a/includes/cache/SquidUpdate.php
+++ b/includes/cache/SquidUpdate.php
@@ -61,13 +61,13 @@ class SquidUpdate {
array( 'page_namespace', 'page_title' ),
array(
'pl_namespace' => $title->getNamespace(),
- 'pl_title' => $title->getDBkey(),
+ 'pl_title' => $title->getDBkey(),
'pl_from=page_id' ),
__METHOD__ );
$blurlArr = $title->getSquidURLs();
- if ( $dbr->numRows( $res ) <= $wgMaxSquidPurgeTitles ) {
+ if ( $res->numRows() <= $wgMaxSquidPurgeTitles ) {
foreach ( $res as $BL ) {
- $tobj = Title::makeTitle( $BL->page_namespace, $BL->page_title ) ;
+ $tobj = Title::makeTitle( $BL->page_namespace, $BL->page_title );
$blurlArr[] = $tobj->getInternalURL();
}
}
@@ -129,6 +129,8 @@ class SquidUpdate {
return;
}
+ wfDebug( "Squid purge: " . implode( ' ', $urlArr ) . "\n" );
+
if ( $wgHTCPMulticastRouting ) {
SquidUpdate::HTCPPurge( $urlArr );
}
@@ -249,11 +251,11 @@ class SquidUpdate {
static function expand( $url ) {
return wfExpandUrl( $url, PROTO_INTERNAL );
}
-
+
/**
* Find the HTCP routing rule to use for a given URL.
- * @param $url string URL to match
- * @param $rules array Array of rules, see $wgHTCPMulticastRouting for format and behavior
+ * @param string $url URL to match
+ * @param array $rules Array of rules, see $wgHTCPMulticastRouting for format and behavior
* @return mixed Element of $rules that matched, or false if nothing matched
*/
static function getRuleForURL( $url, $rules ) {
@@ -264,5 +266,4 @@ class SquidUpdate {
}
return false;
}
-
}
diff --git a/includes/cache/UserCache.php b/includes/cache/UserCache.php
index 6ec23669..bfbacfaa 100644
--- a/includes/cache/UserCache.php
+++ b/includes/cache/UserCache.php
@@ -45,7 +45,7 @@ class UserCache {
* Get a property of a user based on their user ID
*
* @param $userId integer User ID
- * @param $prop string User property
+ * @param string $prop User property
* @return mixed The property or false if the user does not exist
*/
public function getProp( $userId, $prop ) {
@@ -60,9 +60,9 @@ class UserCache {
/**
* Preloads user names for given list of users.
- * @param $userIds Array List of user IDs
- * @param $options Array Option flags; include 'userpage' and 'usertalk'
- * @param $caller String: the calling method
+ * @param array $userIds List of user IDs
+ * @param array $options Option flags; include 'userpage' and 'usertalk'
+ * @param string $caller the calling method
*/
public function doQuery( array $userIds, $options = array(), $caller = '' ) {
wfProfileIn( __METHOD__ );
@@ -124,8 +124,8 @@ class UserCache {
* Check if a cache type is in $options and was not loaded for this user
*
* @param $uid integer user ID
- * @param $type string Cache type
- * @param $options Array Requested cache types
+ * @param string $type Cache type
+ * @param array $options Requested cache types
* @return bool
*/
protected function queryNeeded( $uid, $type, array $options ) {
diff --git a/includes/clientpool/RedisConnectionPool.php b/includes/clientpool/RedisConnectionPool.php
new file mode 100644
index 00000000..5c7c4f20
--- /dev/null
+++ b/includes/clientpool/RedisConnectionPool.php
@@ -0,0 +1,312 @@
+<?php
+/**
+ * PhpRedis client connection pooling manager.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @defgroup Redis Redis
+ * @author Aaron Schulz
+ */
+
+/**
+ * Helper class to manage redis connections using PhpRedis.
+ *
+ * This can be used to get handle wrappers that free the handle when the wrapper
+ * leaves scope. The maximum number of free handles (connections) is configurable.
+ * This provides an easy way to cache connection handles that may also have state,
+ * such as a handle does between multi() and exec(), and without hoarding connections.
+ * The wrappers use PHP magic methods so that calling functions on them calls the
+ * function of the actual Redis object handle.
+ *
+ * @ingroup Redis
+ * @since 1.21
+ */
+class RedisConnectionPool {
+ // Settings for all connections in this pool
+ protected $connectTimeout; // string; connection timeout
+ protected $persistent; // bool; whether connections persist
+ protected $password; // string; plaintext auth password
+ protected $serializer; // integer; the serializer to use (Redis::SERIALIZER_*)
+
+ protected $idlePoolSize = 0; // integer; current idle pool size
+
+ /** @var Array (server name => ((connection info array),...) */
+ protected $connections = array();
+ /** @var Array (server name => UNIX timestamp) */
+ protected $downServers = array();
+
+ /** @var Array */
+ protected static $instances = array(); // (pool ID => RedisConnectionPool)
+
+ const SERVER_DOWN_TTL = 30; // integer; seconds to cache servers as "down"
+
+ /**
+ * $options include:
+ * - connectTimeout : The timeout for new connections, in seconds.
+ * Optional, default is 1 second.
+ * - persistent : Set this to true to allow connections to persist across
+ * multiple web requests. False by default.
+ * - password : The authentication password, will be sent to Redis in clear text.
+ * Optional, if it is unspecified, no AUTH command will be sent.
+ * - serializer : Set to "php", "igbinary", or "none". Default is "php".
+ * @param array $options
+ */
+ protected function __construct( array $options ) {
+ if ( !extension_loaded( 'redis' ) ) {
+ throw new MWException( __CLASS__. ' requires the phpredis extension: ' .
+ 'https://github.com/nicolasff/phpredis' );
+ }
+ $this->connectTimeout = $options['connectTimeout'];
+ $this->persistent = $options['persistent'];
+ $this->password = $options['password'];
+ if ( !isset( $options['serializer'] ) || $options['serializer'] === 'php' ) {
+ $this->serializer = Redis::SERIALIZER_PHP;
+ } elseif ( $options['serializer'] === 'igbinary' ) {
+ $this->serializer = Redis::SERIALIZER_IGBINARY;
+ } elseif ( $options['serializer'] === 'none' ) {
+ $this->serializer = Redis::SERIALIZER_NONE;
+ } else {
+ throw new MWException( "Invalid serializer specified." );
+ }
+ }
+
+ /**
+ * @param $options Array
+ * @return Array
+ */
+ protected static function applyDefaultConfig( array $options ) {
+ if ( !isset( $options['connectTimeout'] ) ) {
+ $options['connectTimeout'] = 1;
+ }
+ if ( !isset( $options['persistent'] ) ) {
+ $options['persistent'] = false;
+ }
+ if ( !isset( $options['password'] ) ) {
+ $options['password'] = null;
+ }
+ return $options;
+ }
+
+ /**
+ * @param $options Array
+ * @return RedisConnectionPool
+ */
+ public static function singleton( array $options ) {
+ $options = self::applyDefaultConfig( $options );
+ // Map the options to a unique hash...
+ ksort( $options ); // normalize to avoid pool fragmentation
+ $id = sha1( serialize( $options ) );
+ // Initialize the object at the hash as needed...
+ if ( !isset( self::$instances[$id] ) ) {
+ self::$instances[$id] = new self( $options );
+ wfDebug( "Creating a new " . __CLASS__ . " instance with id $id." );
+ }
+ return self::$instances[$id];
+ }
+
+ /**
+ * Get a connection to a redis server. Based on code in RedisBagOStuff.php.
+ *
+ * @param string $server A hostname/port combination or the absolute path of a UNIX socket.
+ * If a hostname is specified but no port, port 6379 will be used.
+ * @return RedisConnRef|bool Returns false on failure
+ * @throws MWException
+ */
+ public function getConnection( $server ) {
+ // Check the listing "dead" servers which have had a connection errors.
+ // Servers are marked dead for a limited period of time, to
+ // avoid excessive overhead from repeated connection timeouts.
+ if ( isset( $this->downServers[$server] ) ) {
+ $now = time();
+ if ( $now > $this->downServers[$server] ) {
+ // Dead time expired
+ unset( $this->downServers[$server] );
+ } else {
+ // Server is dead
+ wfDebug( "server $server is marked down for another " .
+ ( $this->downServers[$server] - $now ) . " seconds, can't get connection" );
+ return false;
+ }
+ }
+
+ // Check if a connection is already free for use
+ if ( isset( $this->connections[$server] ) ) {
+ foreach ( $this->connections[$server] as &$connection ) {
+ if ( $connection['free'] ) {
+ $connection['free'] = false;
+ --$this->idlePoolSize;
+ return new RedisConnRef( $this, $server, $connection['conn'] );
+ }
+ }
+ }
+
+ if ( substr( $server, 0, 1 ) === '/' ) {
+ // UNIX domain socket
+ // These are required by the redis extension to start with a slash, but
+ // we still need to set the port to a special value to make it work.
+ $host = $server;
+ $port = 0;
+ } else {
+ // TCP connection
+ $hostPort = IP::splitHostAndPort( $server );
+ if ( !$hostPort ) {
+ throw new MWException( __CLASS__.": invalid configured server \"$server\"" );
+ }
+ list( $host, $port ) = $hostPort;
+ if ( $port === false ) {
+ $port = 6379;
+ }
+ }
+
+ $conn = new Redis();
+ try {
+ if ( $this->persistent ) {
+ $result = $conn->pconnect( $host, $port, $this->connectTimeout );
+ } else {
+ $result = $conn->connect( $host, $port, $this->connectTimeout );
+ }
+ if ( !$result ) {
+ wfDebugLog( 'redis', "Could not connect to server $server" );
+ // Mark server down for some time to avoid further timeouts
+ $this->downServers[$server] = time() + self::SERVER_DOWN_TTL;
+ return false;
+ }
+ if ( $this->password !== null ) {
+ if ( !$conn->auth( $this->password ) ) {
+ wfDebugLog( 'redis', "Authentication error connecting to $server" );
+ }
+ }
+ } catch ( RedisException $e ) {
+ $this->downServers[$server] = time() + self::SERVER_DOWN_TTL;
+ wfDebugLog( 'redis', "Redis exception: " . $e->getMessage() . "\n" );
+ return false;
+ }
+
+ if ( $conn ) {
+ $conn->setOption( Redis::OPT_SERIALIZER, $this->serializer );
+ $this->connections[$server][] = array( 'conn' => $conn, 'free' => false );
+ return new RedisConnRef( $this, $server, $conn );
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Mark a connection to a server as free to return to the pool
+ *
+ * @param $server string
+ * @param $conn Redis
+ * @return boolean
+ */
+ public function freeConnection( $server, Redis $conn ) {
+ $found = false;
+
+ foreach ( $this->connections[$server] as &$connection ) {
+ if ( $connection['conn'] === $conn && !$connection['free'] ) {
+ $connection['free'] = true;
+ ++$this->idlePoolSize;
+ break;
+ }
+ }
+
+ $this->closeExcessIdleConections();
+
+ return $found;
+ }
+
+ /**
+ * Close any extra idle connections if there are more than the limit
+ *
+ * @return void
+ */
+ protected function closeExcessIdleConections() {
+ if ( $this->idlePoolSize <= count( $this->connections ) ) {
+ return; // nothing to do (no more connections than servers)
+ }
+
+ foreach ( $this->connections as $server => &$serverConnections ) {
+ foreach ( $serverConnections as $key => &$connection ) {
+ if ( $connection['free'] ) {
+ unset( $serverConnections[$key] );
+ if ( --$this->idlePoolSize <= count( $this->connections ) ) {
+ return; // done (no more connections than servers)
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * The redis extension throws an exception in response to various read, write
+ * and protocol errors. Sometimes it also closes the connection, sometimes
+ * not. The safest response for us is to explicitly destroy the connection
+ * object and let it be reopened during the next request.
+ *
+ * @param $server string
+ * @param $cref RedisConnRef
+ * @param $e RedisException
+ * @return void
+ */
+ public function handleException( $server, RedisConnRef $cref, RedisException $e ) {
+ wfDebugLog( 'redis', "Redis exception on server $server: " . $e->getMessage() . "\n" );
+ foreach ( $this->connections[$server] as $key => $connection ) {
+ if ( $cref->isConnIdentical( $connection['conn'] ) ) {
+ $this->idlePoolSize -= $connection['free'] ? 1 : 0;
+ unset( $this->connections[$server][$key] );
+ break;
+ }
+ }
+ }
+}
+
+/**
+ * Helper class to handle automatically marking connectons as reusable (via RAII pattern)
+ *
+ * @ingroup Redis
+ * @since 1.21
+ */
+class RedisConnRef {
+ /** @var RedisConnectionPool */
+ protected $pool;
+ /** @var Redis */
+ protected $conn;
+
+ protected $server; // string
+
+ /**
+ * @param $pool RedisConnectionPool
+ * @param $server string
+ * @param $conn Redis
+ */
+ public function __construct( RedisConnectionPool $pool, $server, Redis $conn ) {
+ $this->pool = $pool;
+ $this->server = $server;
+ $this->conn = $conn;
+ }
+
+ public function __call( $name, $arguments ) {
+ return call_user_func_array( array( $this->conn, $name ), $arguments );
+ }
+
+ public function isConnIdentical( Redis $conn ) {
+ return $this->conn === $conn;
+ }
+
+ function __destruct() {
+ $this->pool->freeConnection( $this->server, $this->conn );
+ }
+}
diff --git a/includes/content/AbstractContent.php b/includes/content/AbstractContent.php
new file mode 100644
index 00000000..137efb8a
--- /dev/null
+++ b/includes/content/AbstractContent.php
@@ -0,0 +1,444 @@
+<?php
+/**
+ * A content object represents page content, e.g. the text to show on a page.
+ * Content objects have no knowledge about how they relate to Wiki pages.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+
+/**
+ * Base implementation for content objects.
+ *
+ * @ingroup Content
+ */
+abstract class AbstractContent implements Content {
+
+ /**
+ * Name of the content model this Content object represents.
+ * Use with CONTENT_MODEL_XXX constants
+ *
+ * @since 1.21
+ *
+ * @var string $model_id
+ */
+ protected $model_id;
+
+ /**
+ * @param string|null $modelId
+ *
+ * @since 1.21
+ */
+ public function __construct( $modelId = null ) {
+ $this->model_id = $modelId;
+ }
+
+ /**
+ * @see Content::getModel
+ *
+ * @since 1.21
+ */
+ public function getModel() {
+ return $this->model_id;
+ }
+
+ /**
+ * Throws an MWException if $model_id is not the id of the content model
+ * supported by this Content object.
+ *
+ * @since 1.21
+ *
+ * @param string $modelId The model to check
+ *
+ * @throws MWException
+ */
+ protected function checkModelID( $modelId ) {
+ if ( $modelId !== $this->model_id ) {
+ throw new MWException(
+ "Bad content model: " .
+ "expected {$this->model_id} " .
+ "but got $modelId."
+ );
+ }
+ }
+
+ /**
+ * @see Content::getContentHandler
+ *
+ * @since 1.21
+ */
+ public function getContentHandler() {
+ return ContentHandler::getForContent( $this );
+ }
+
+ /**
+ * @see Content::getDefaultFormat
+ *
+ * @since 1.21
+ */
+ public function getDefaultFormat() {
+ return $this->getContentHandler()->getDefaultFormat();
+ }
+
+ /**
+ * @see Content::getSupportedFormats
+ *
+ * @since 1.21
+ */
+ public function getSupportedFormats() {
+ return $this->getContentHandler()->getSupportedFormats();
+ }
+
+ /**
+ * @see Content::isSupportedFormat
+ *
+ * @param string $format
+ *
+ * @since 1.21
+ *
+ * @return boolean
+ */
+ public function isSupportedFormat( $format ) {
+ if ( !$format ) {
+ return true; // this means "use the default"
+ }
+
+ return $this->getContentHandler()->isSupportedFormat( $format );
+ }
+
+ /**
+ * Throws an MWException if $this->isSupportedFormat( $format ) does not
+ * return true.
+ *
+ * @since 1.21
+ *
+ * @param string $format
+ * @throws MWException
+ */
+ protected function checkFormat( $format ) {
+ if ( !$this->isSupportedFormat( $format ) ) {
+ throw new MWException(
+ "Format $format is not supported for content model " .
+ $this->getModel()
+ );
+ }
+ }
+
+ /**
+ * @see Content::serialize
+ *
+ * @param string|null $format
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function serialize( $format = null ) {
+ return $this->getContentHandler()->serializeContent( $this, $format );
+ }
+
+ /**
+ * @see Content::isEmpty
+ *
+ * @since 1.21
+ *
+ * @return boolean
+ */
+ public function isEmpty() {
+ return $this->getSize() === 0;
+ }
+
+ /**
+ * @see Content::isValid
+ *
+ * @since 1.21
+ *
+ * @return boolean
+ */
+ public function isValid() {
+ return true;
+ }
+
+ /**
+ * @see Content::equals
+ *
+ * @since 1.21
+ *
+ * @param Content|null $that
+ *
+ * @return boolean
+ */
+ public function equals( Content $that = null ) {
+ if ( is_null( $that ) ) {
+ return false;
+ }
+
+ if ( $that === $this ) {
+ return true;
+ }
+
+ if ( $that->getModel() !== $this->getModel() ) {
+ return false;
+ }
+
+ return $this->getNativeData() === $that->getNativeData();
+ }
+
+ /**
+ * Returns a list of DataUpdate objects for recording information about this
+ * Content in some secondary data store.
+ *
+ * This default implementation calls
+ * $this->getParserOutput( $content, $title, null, null, false ),
+ * and then calls getSecondaryDataUpdates( $title, $recursive ) on the
+ * resulting ParserOutput object.
+ *
+ * Subclasses may override this to determine the secondary data updates more
+ * efficiently, preferably without the need to generate a parser output object.
+ *
+ * @see Content::getSecondaryDataUpdates()
+ *
+ * @param $title Title The context for determining the necessary updates
+ * @param $old Content|null An optional Content object representing the
+ * previous content, i.e. the content being replaced by this Content
+ * object.
+ * @param $recursive boolean Whether to include recursive updates (default:
+ * false).
+ * @param $parserOutput ParserOutput|null Optional ParserOutput object.
+ * Provide if you have one handy, to avoid re-parsing of the content.
+ *
+ * @return Array. A list of DataUpdate objects for putting information
+ * about this content object somewhere.
+ *
+ * @since 1.21
+ */
+ public function getSecondaryDataUpdates( Title $title,
+ Content $old = null,
+ $recursive = true, ParserOutput $parserOutput = null
+ ) {
+ if ( $parserOutput === null ) {
+ $parserOutput = $this->getParserOutput( $title, null, null, false );
+ }
+
+ return $parserOutput->getSecondaryDataUpdates( $title, $recursive );
+ }
+
+ /**
+ * @see Content::getRedirectChain
+ *
+ * @since 1.21
+ */
+ public function getRedirectChain() {
+ global $wgMaxRedirects;
+ $title = $this->getRedirectTarget();
+ if ( is_null( $title ) ) {
+ return null;
+ }
+ // recursive check to follow double redirects
+ $recurse = $wgMaxRedirects;
+ $titles = array( $title );
+ while ( --$recurse > 0 ) {
+ if ( $title->isRedirect() ) {
+ $page = WikiPage::factory( $title );
+ $newtitle = $page->getRedirectTarget();
+ } else {
+ break;
+ }
+ // Redirects to some special pages are not permitted
+ if ( $newtitle instanceOf Title && $newtitle->isValidRedirectTarget() ) {
+ // The new title passes the checks, so make that our current
+ // title so that further recursion can be checked
+ $title = $newtitle;
+ $titles[] = $newtitle;
+ } else {
+ break;
+ }
+ }
+ return $titles;
+ }
+
+ /**
+ * @see Content::getRedirectTarget
+ *
+ * @since 1.21
+ */
+ public function getRedirectTarget() {
+ return null;
+ }
+
+ /**
+ * @see Content::getUltimateRedirectTarget
+ * @note: migrated here from Title::newFromRedirectRecurse
+ *
+ * @since 1.21
+ */
+ public function getUltimateRedirectTarget() {
+ $titles = $this->getRedirectChain();
+ return $titles ? array_pop( $titles ) : null;
+ }
+
+ /**
+ * @see Content::isRedirect
+ *
+ * @since 1.21
+ *
+ * @return bool
+ */
+ public function isRedirect() {
+ return $this->getRedirectTarget() !== null;
+ }
+
+ /**
+ * @see Content::updateRedirect
+ *
+ * This default implementation always returns $this.
+ *
+ * @param Title $target
+ *
+ * @since 1.21
+ *
+ * @return Content $this
+ */
+ public function updateRedirect( Title $target ) {
+ return $this;
+ }
+
+ /**
+ * @see Content::getSection
+ *
+ * @since 1.21
+ */
+ public function getSection( $sectionId ) {
+ return null;
+ }
+
+ /**
+ * @see Content::replaceSection
+ *
+ * @since 1.21
+ */
+ public function replaceSection( $section, Content $with, $sectionTitle = '' ) {
+ return null;
+ }
+
+ /**
+ * @see Content::preSaveTransform
+ *
+ * @since 1.21
+ */
+ public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+ return $this;
+ }
+
+ /**
+ * @see Content::addSectionHeader
+ *
+ * @since 1.21
+ */
+ public function addSectionHeader( $header ) {
+ return $this;
+ }
+
+ /**
+ * @see Content::preloadTransform
+ *
+ * @since 1.21
+ */
+ public function preloadTransform( Title $title, ParserOptions $popts ) {
+ return $this;
+ }
+
+ /**
+ * @see Content::prepareSave
+ *
+ * @since 1.21
+ */
+ public function prepareSave( WikiPage $page, $flags, $baseRevId, User $user ) {
+ if ( $this->isValid() ) {
+ return Status::newGood();
+ } else {
+ return Status::newFatal( "invalid-content-data" );
+ }
+ }
+
+ /**
+ * @see Content::getDeletionUpdates
+ *
+ * @since 1.21
+ *
+ * @param $page WikiPage the deleted page
+ * @param $parserOutput null|ParserOutput optional parser output object
+ * for efficient access to meta-information about the content object.
+ * Provide if you have one handy.
+ *
+ * @return array A list of DataUpdate instances that will clean up the
+ * database after deletion.
+ */
+ public function getDeletionUpdates( WikiPage $page,
+ ParserOutput $parserOutput = null )
+ {
+ return array(
+ new LinksDeletionUpdate( $page ),
+ );
+ }
+
+ /**
+ * This default implementation always returns false. Subclasses may override this to supply matching logic.
+ *
+ * @see Content::matchMagicWord
+ *
+ * @since 1.21
+ *
+ * @param MagicWord $word
+ *
+ * @return bool
+ */
+ public function matchMagicWord( MagicWord $word ) {
+ return false;
+ }
+
+ /**
+ * @see Content::convert()
+ *
+ * This base implementation calls the hook ConvertContent to enable custom conversions.
+ * Subclasses may override this to implement conversion for "their" content model.
+ *
+ * @param string $toModel the desired content model, use the CONTENT_MODEL_XXX flags.
+ * @param string $lossy flag, set to "lossy" to allow lossy conversion. If lossy conversion is
+ * not allowed, full round-trip conversion is expected to work without losing information.
+ *
+ * @return Content|bool A content object with the content model $toModel, or false if
+ * that conversion is not supported.
+ */
+ public function convert( $toModel, $lossy = '' ) {
+ if ( $this->getModel() === $toModel ) {
+ //nothing to do, shorten out.
+ return $this;
+ }
+
+ $lossy = ( $lossy === 'lossy' ); // string flag, convert to boolean for convenience
+ $result = false;
+
+ wfRunHooks( 'ConvertContent', array( $this, $toModel, $lossy, &$result ) );
+ return $result;
+ }
+}
diff --git a/includes/content/Content.php b/includes/content/Content.php
new file mode 100644
index 00000000..72729b09
--- /dev/null
+++ b/includes/content/Content.php
@@ -0,0 +1,508 @@
+<?php
+/**
+ * A content object represents page content, e.g. the text to show on a page.
+ * Content objects have no knowledge about how they relate to wiki pages.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+
+/**
+ * Base interface for content objects.
+ *
+ * @ingroup Content
+ */
+interface Content {
+
+ /**
+ * @since 1.21
+ *
+ * @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.
+ *
+ * @todo: test that this actually works
+ * @todo: make sure this also works with LuceneSearch / WikiSearch
+ */
+ public function getTextForSearchIndex();
+
+ /**
+ * @since 1.21
+ *
+ * @return string|false The wikitext to include when another page includes this
+ * content, or false if the content is not includable in a wikitext page.
+ *
+ * @todo allow native handling, bypassing wikitext representation, like
+ * for includable special pages.
+ * @todo allow transclusion into other content models than Wikitext!
+ * @todo used in WikiPage and MessageCache to get message text. Not so
+ * nice. What should we use instead?!
+ */
+ public function getWikitextForTransclusion();
+
+ /**
+ * Returns a textual representation of the content suitable for use in edit
+ * summaries and log messages.
+ *
+ * @since 1.21
+ *
+ * @param int $maxLength Maximum length of the summary text
+ * @return string The summary text
+ */
+ public function getTextForSummary( $maxLength = 250 );
+
+ /**
+ * Returns native representation of the data. Interpretation depends on
+ * the data model used, as given by getDataModel().
+ *
+ * @since 1.21
+ *
+ * @return mixed The native representation of the content. Could be a
+ * string, a nested array structure, an object, a binary blob...
+ * anything, really.
+ *
+ * @note Caller must be aware of content model!
+ */
+ public function getNativeData();
+
+ /**
+ * Returns the content's nominal size in bogo-bytes.
+ *
+ * @return int
+ */
+ public function getSize();
+
+ /**
+ * Returns the ID of the content model used by this Content object.
+ * Corresponds to the CONTENT_MODEL_XXX constants.
+ *
+ * @since 1.21
+ *
+ * @return String The model id
+ */
+ public function getModel();
+
+ /**
+ * Convenience method that returns the ContentHandler singleton for handling
+ * the content model that this Content object uses.
+ *
+ * Shorthand for ContentHandler::getForContent( $this )
+ *
+ * @since 1.21
+ *
+ * @return ContentHandler
+ */
+ public function getContentHandler();
+
+ /**
+ * Convenience method that returns the default serialization format for the
+ * content model that this Content object uses.
+ *
+ * Shorthand for $this->getContentHandler()->getDefaultFormat()
+ *
+ * @since 1.21
+ *
+ * @return String
+ */
+ public function getDefaultFormat();
+
+ /**
+ * Convenience method that returns the list of serialization formats
+ * supported for the content model that this Content object uses.
+ *
+ * Shorthand for $this->getContentHandler()->getSupportedFormats()
+ *
+ * @since 1.21
+ *
+ * @return Array of supported serialization formats
+ */
+ public function getSupportedFormats();
+
+ /**
+ * Returns true if $format is a supported serialization format for this
+ * Content object, false if it isn't.
+ *
+ * Note that this should always return true if $format is null, because null
+ * stands for the default serialization.
+ *
+ * Shorthand for $this->getContentHandler()->isSupportedFormat( $format )
+ *
+ * @since 1.21
+ *
+ * @param string $format The format to check
+ * @return bool Whether the format is supported
+ */
+ public function isSupportedFormat( $format );
+
+ /**
+ * Convenience method for serializing this Content object.
+ *
+ * Shorthand for $this->getContentHandler()->serializeContent( $this, $format )
+ *
+ * @since 1.21
+ *
+ * @param $format null|string The desired serialization format (or null for
+ * the default format).
+ * @return string Serialized form of this Content object
+ */
+ public function serialize( $format = null );
+
+ /**
+ * Returns true if this Content object represents empty content.
+ *
+ * @since 1.21
+ *
+ * @return bool Whether this Content object is empty
+ */
+ public function isEmpty();
+
+ /**
+ * Returns whether the content is valid. This is intended for local validity
+ * checks, not considering global consistency.
+ *
+ * Content needs to be valid before it can be saved.
+ *
+ * This default implementation always returns true.
+ *
+ * @since 1.21
+ *
+ * @return boolean
+ */
+ public function isValid();
+
+ /**
+ * Returns true if this Content objects is conceptually equivalent to the
+ * given Content object.
+ *
+ * Contract:
+ *
+ * - Will return false if $that is null.
+ * - Will return true if $that === $this.
+ * - Will return false if $that->getModel() != $this->getModel().
+ * - Will return false if $that->getNativeData() is not equal to $this->getNativeData(),
+ * where the meaning of "equal" depends on the actual data model.
+ *
+ * Implementations should be careful to make equals() transitive and reflexive:
+ *
+ * - $a->equals( $b ) <=> $b->equals( $a )
+ * - $a->equals( $b ) && $b->equals( $c ) ==> $a->equals( $c )
+ *
+ * @since 1.21
+ *
+ * @param $that Content The Content object to compare to
+ * @return bool True if this Content object is equal to $that, false otherwise.
+ */
+ public function equals( Content $that = null );
+
+ /**
+ * Return a copy of this Content object. The following must be true for the
+ * object returned:
+ *
+ * if $copy = $original->copy()
+ *
+ * - get_class($original) === get_class($copy)
+ * - $original->getModel() === $copy->getModel()
+ * - $original->equals( $copy )
+ *
+ * If and only if the Content object is immutable, the copy() method can and
+ * should return $this. That is, $copy === $original may be true, but only
+ * for immutable content objects.
+ *
+ * @since 1.21
+ *
+ * @return Content. A copy of this object
+ */
+ public function copy();
+
+ /**
+ * 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).
+ *
+ * @since 1.21
+ *
+ * @param bool $hasLinks If it is known whether this content contains
+ * links, provide this information here, to avoid redundant parsing to
+ * find out.
+ * @return boolean
+ */
+ public function isCountable( $hasLinks = null );
+
+ /**
+ * Parse the Content object and generate a ParserOutput from the result.
+ * $result->getText() can be used to obtain the generated HTML. If no HTML
+ * is needed, $generateHtml can be set to false; in that case,
+ * $result->getText() may return null.
+ *
+ * @param $title Title The page title to use as a context for rendering
+ * @param $revId null|int The revision being rendered (optional)
+ * @param $options null|ParserOptions Any parser options
+ * @param $generateHtml Boolean Whether to generate HTML (default: true). If false,
+ * the result of calling getText() on the ParserOutput object returned by
+ * this method is undefined.
+ *
+ * @since 1.21
+ *
+ * @return ParserOutput
+ */
+ public function getParserOutput( Title $title,
+ $revId = null,
+ ParserOptions $options = null, $generateHtml = true );
+ // TODO: make RenderOutput and RenderOptions base classes
+
+ /**
+ * Returns a list of DataUpdate objects for recording information about this
+ * Content in some secondary data store. If the optional second argument,
+ * $old, is given, the updates may model only the changes that need to be
+ * made to replace information about the old content with information about
+ * the new content.
+ *
+ * This default implementation calls
+ * $this->getParserOutput( $content, $title, null, null, false ),
+ * and then calls getSecondaryDataUpdates( $title, $recursive ) on the
+ * resulting ParserOutput object.
+ *
+ * Subclasses may implement this to determine the necessary updates more
+ * efficiently, or make use of information about the old content.
+ *
+ * @param $title Title The context for determining the necessary updates
+ * @param $old Content|null An optional Content object representing the
+ * previous content, i.e. the content being replaced by this Content
+ * object.
+ * @param $recursive boolean Whether to include recursive updates (default:
+ * false).
+ * @param $parserOutput ParserOutput|null Optional ParserOutput object.
+ * Provide if you have one handy, to avoid re-parsing of the content.
+ *
+ * @return Array. A list of DataUpdate objects for putting information
+ * about this content object somewhere.
+ *
+ * @since 1.21
+ */
+ public function getSecondaryDataUpdates( Title $title,
+ Content $old = null,
+ $recursive = true, ParserOutput $parserOutput = null
+ );
+
+ /**
+ * Construct the redirect destination from this content and return an
+ * array of Titles, or null if this content doesn't represent a redirect.
+ * The last element in the array is the final destination after all redirects
+ * have been resolved (up to $wgMaxRedirects times).
+ *
+ * @since 1.21
+ *
+ * @return Array of Titles, with the destination last
+ */
+ public function getRedirectChain();
+
+ /**
+ * Construct the redirect destination from this content and return a Title,
+ * or null if this content doesn't represent a redirect.
+ * This will only return the immediate redirect target, useful for
+ * the redirect table and other checks that don't need full recursion.
+ *
+ * @since 1.21
+ *
+ * @return Title: The corresponding Title
+ */
+ public function getRedirectTarget();
+
+ /**
+ * Construct the redirect destination from this content and return the
+ * Title, or null if this content doesn't represent a redirect.
+ *
+ * This will recurse down $wgMaxRedirects times or until a non-redirect
+ * target is hit in order to provide (hopefully) the Title of the final
+ * destination instead of another redirect.
+ *
+ * There is usually no need to override the default behavior, subclasses that
+ * want to implement redirects should override getRedirectTarget().
+ *
+ * @since 1.21
+ *
+ * @return Title
+ */
+ public function getUltimateRedirectTarget();
+
+ /**
+ * Returns whether this Content represents a redirect.
+ * Shorthand for getRedirectTarget() !== null.
+ *
+ * @since 1.21
+ *
+ * @return bool
+ */
+ public function isRedirect();
+
+ /**
+ * If this Content object is a redirect, this method updates the redirect target.
+ * Otherwise, it does nothing.
+ *
+ * @since 1.21
+ *
+ * @param Title $target the new redirect target
+ *
+ * @return Content a new Content object with the updated redirect (or $this if this Content object isn't a redirect)
+ */
+ public function updateRedirect( Title $target );
+
+ /**
+ * Returns the section with the given ID.
+ *
+ * @since 1.21
+ *
+ * @param string $sectionId The section's ID, given as a numeric string.
+ * The ID "0" retrieves the section before the first heading, "1" the
+ * text between the first heading (included) and the second heading
+ * (excluded), etc.
+ * @return Content|Boolean|null The section, or false if no such section
+ * exist, or null if sections are not supported.
+ */
+ public function getSection( $sectionId );
+
+ /**
+ * Replaces a section of the content and returns a Content object with the
+ * section replaced.
+ *
+ * @since 1.21
+ *
+ * @param $section null/false or a section number (0, 1, 2, T1, T2...), or "new"
+ * @param $with Content: new content of the section
+ * @param string $sectionTitle new section's subject, only if $section is 'new'
+ * @return string Complete article text, or null if error
+ */
+ public function replaceSection( $section, Content $with, $sectionTitle = '' );
+
+ /**
+ * Returns a Content object with pre-save transformations applied (or this
+ * object if no transformations apply).
+ *
+ * @since 1.21
+ *
+ * @param $title Title
+ * @param $user User
+ * @param $parserOptions null|ParserOptions
+ * @return Content
+ */
+ public function preSaveTransform( Title $title, User $user, ParserOptions $parserOptions );
+
+ /**
+ * Returns a new WikitextContent object with the given section heading
+ * prepended, if supported. The default implementation just returns this
+ * Content object unmodified, ignoring the section header.
+ *
+ * @since 1.21
+ *
+ * @param $header string
+ * @return Content
+ */
+ public function addSectionHeader( $header );
+
+ /**
+ * Returns a Content object with preload transformations applied (or this
+ * object if no transformations apply).
+ *
+ * @since 1.21
+ *
+ * @param $title Title
+ * @param $parserOptions null|ParserOptions
+ * @return Content
+ */
+ public function preloadTransform( Title $title, ParserOptions $parserOptions );
+
+ /**
+ * Prepare Content for saving. Called before Content is saved by WikiPage::doEditContent() and in
+ * similar places.
+ *
+ * This may be used to check the content's consistency with global state. This function should
+ * NOT write any information to the database.
+ *
+ * Note that this method will usually be called inside the same transaction bracket that will be used
+ * to save the new revision.
+ *
+ * Note that this method is called before any update to the page table is performed. This means that
+ * $page may not yet know a page ID.
+ *
+ * @since 1.21
+ *
+ * @param WikiPage $page The page to be saved.
+ * @param int $flags bitfield for use with EDIT_XXX constants, see WikiPage::doEditContent()
+ * @param int $baseRevId the ID of the current revision
+ * @param User $user
+ *
+ * @return Status A status object indicating whether the content was successfully prepared for saving.
+ * If the returned status indicates an error, a rollback will be performed and the
+ * transaction aborted.
+ *
+ * @see see WikiPage::doEditContent()
+ */
+ public function prepareSave( WikiPage $page, $flags, $baseRevId, User $user );
+
+ /**
+ * Returns a list of updates to perform when this content is deleted.
+ * The necessary updates may be taken from the Content object, or depend on
+ * the current state of the database.
+ *
+ * @since 1.21
+ *
+ * @param $page WikiPage the deleted page
+ * @param $parserOutput null|ParserOutput optional parser output object
+ * for efficient access to meta-information about the content object.
+ * Provide if you have one handy.
+ *
+ * @return array A list of DataUpdate instances that will clean up the
+ * database after deletion.
+ */
+ public function getDeletionUpdates( WikiPage $page,
+ ParserOutput $parserOutput = null );
+
+ /**
+ * Returns true if this Content object matches the given magic word.
+ *
+ * @since 1.21
+ *
+ * @param MagicWord $word the magic word to match
+ *
+ * @return bool whether this Content object matches the given magic word.
+ */
+ public function matchMagicWord( MagicWord $word );
+
+ /**
+ * Converts this content object into another content object with the given content model,
+ * if that is possible.
+ *
+ * @param string $toModel the desired content model, use the CONTENT_MODEL_XXX flags.
+ * @param string $lossy flag, set to "lossy" to allow lossy conversion. If lossy conversion is
+ * not allowed, full round-trip conversion is expected to work without losing information.
+ *
+ * @return Content|bool A content object with the content model $toModel, or false if
+ * that conversion is not supported.
+ */
+ public function convert( $toModel, $lossy = '' );
+
+ // TODO: ImagePage and CategoryPage interfere with per-content action handlers
+ // TODO: nice&sane integration of GeSHi syntax highlighting
+ // [11:59] <vvv> Hooks are ugly; make CodeHighlighter interface and a
+ // config to set the class which handles syntax highlighting
+ // [12:00] <vvv> And default it to a DummyHighlighter
+}
diff --git a/includes/content/ContentHandler.php b/includes/content/ContentHandler.php
new file mode 100644
index 00000000..9c201955
--- /dev/null
+++ b/includes/content/ContentHandler.php
@@ -0,0 +1,1114 @@
+<?php
+/**
+ * Base class for content handling.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+
+/**
+ * Exception representing a failure to serialize or unserialize a content object.
+ *
+ * @ingroup Content
+ */
+class MWContentSerializationException extends MWException {
+
+}
+
+/**
+ * A content handler knows how do deal with a specific type of content on a wiki
+ * page. Content is stored in the database in a serialized form (using a
+ * serialization format a.k.a. MIME type) and is unserialized into its native
+ * PHP representation (the content model), which is wrapped in an instance of
+ * the appropriate subclass of Content.
+ *
+ * ContentHandler instances are stateless singletons that serve, among other
+ * things, as a factory for Content objects. Generally, there is one subclass
+ * of ContentHandler and one subclass of Content for every type of content model.
+ *
+ * Some content types have a flat model, that is, their native representation
+ * is the same as their serialized form. Examples would be JavaScript and CSS
+ * code. As of now, this also applies to wikitext (MediaWiki's default content
+ * type), but wikitext content may be represented by a DOM or AST structure in
+ * the future.
+ *
+ * @ingroup Content
+ */
+abstract class ContentHandler {
+
+ /**
+ * Switch for enabling deprecation warnings. Used by ContentHandler::deprecated()
+ * and ContentHandler::runLegacyHooks().
+ *
+ * Once the ContentHandler code has settled in a bit, this should be set to true to
+ * make extensions etc. show warnings when using deprecated functions and hooks.
+ */
+ protected static $enableDeprecationWarnings = false;
+
+ /**
+ * Convenience function for getting flat text from a Content object. This
+ * should only be used in the context of backwards compatibility with code
+ * that is not yet able to handle Content objects!
+ *
+ * If $content is null, this method returns the empty string.
+ *
+ * If $content is an instance of TextContent, this method returns the flat
+ * text as returned by $content->getNativeData().
+ *
+ * If $content is not a TextContent object, the behavior of this method
+ * depends on the global $wgContentHandlerTextFallback:
+ * - If $wgContentHandlerTextFallback is 'fail' and $content is not a
+ * TextContent object, an MWException is thrown.
+ * - If $wgContentHandlerTextFallback is 'serialize' and $content is not a
+ * TextContent object, $content->serialize() is called to get a string
+ * form of the content.
+ * - If $wgContentHandlerTextFallback is 'ignore' and $content is not a
+ * TextContent object, this method returns null.
+ * - otherwise, the behavior is undefined.
+ *
+ * @since 1.21
+ *
+ * @param $content Content|null
+ * @return null|string the textual form of $content, if available
+ * @throws MWException if $content is not an instance of TextContent and
+ * $wgContentHandlerTextFallback was set to 'fail'.
+ */
+ public static function getContentText( Content $content = null ) {
+ global $wgContentHandlerTextFallback;
+
+ if ( is_null( $content ) ) {
+ return '';
+ }
+
+ if ( $content instanceof TextContent ) {
+ return $content->getNativeData();
+ }
+
+ wfDebugLog( 'ContentHandler', 'Accessing ' . $content->getModel() . ' content as text!' );
+
+ if ( $wgContentHandlerTextFallback == 'fail' ) {
+ throw new MWException(
+ "Attempt to get text from Content with model " .
+ $content->getModel()
+ );
+ }
+
+ if ( $wgContentHandlerTextFallback == 'serialize' ) {
+ return $content->serialize();
+ }
+
+ return null;
+ }
+
+ /**
+ * Convenience function for creating a Content object from a given textual
+ * representation.
+ *
+ * $text will be deserialized into a Content object of the model specified
+ * by $modelId (or, if that is not given, $title->getContentModel()) using
+ * the given format.
+ *
+ * @since 1.21
+ *
+ * @param string $text the textual representation, will be
+ * unserialized to create the Content object
+ * @param $title null|Title the title of the page this text belongs to.
+ * Required if $modelId is not provided.
+ * @param $modelId null|string the model to deserialize to. If not provided,
+ * $title->getContentModel() is used.
+ * @param $format null|string the format to use for deserialization. If not
+ * given, the model's default format is used.
+ *
+ * @throws MWException
+ * @return Content a Content object representing $text
+ *
+ * @throws MWException if $model or $format is not supported or if $text can
+ * not be unserialized using $format.
+ */
+ public static function makeContent( $text, Title $title = null,
+ $modelId = null, $format = null )
+ {
+ if ( is_null( $modelId ) ) {
+ if ( is_null( $title ) ) {
+ throw new MWException( "Must provide a Title object or a content model ID." );
+ }
+
+ $modelId = $title->getContentModel();
+ }
+
+ $handler = ContentHandler::getForModelID( $modelId );
+ return $handler->unserializeContent( $text, $format );
+ }
+
+ /**
+ * Returns the name of the default content model to be used for the page
+ * with the given title.
+ *
+ * Note: There should rarely be need to call this method directly.
+ * To determine the actual content model for a given page, use
+ * Title::getContentModel().
+ *
+ * Which model is to be used by default for the page is determined based
+ * on several factors:
+ * - The global setting $wgNamespaceContentModels specifies a content model
+ * per namespace.
+ * - The hook ContentHandlerDefaultModelFor may be used to override the page's default
+ * model.
+ * - Pages in NS_MEDIAWIKI and NS_USER default to the CSS or JavaScript
+ * model if they end in .js or .css, respectively.
+ * - Pages in NS_MEDIAWIKI default to the wikitext model otherwise.
+ * - The hook TitleIsCssOrJsPage may be used to force a page to use the CSS
+ * or JavaScript model. This is a compatibility feature. The ContentHandlerDefaultModelFor
+ * hook should be used instead if possible.
+ * - The hook TitleIsWikitextPage may be used to force a page to use the
+ * wikitext model. This is a compatibility feature. The ContentHandlerDefaultModelFor
+ * hook should be used instead if possible.
+ *
+ * If none of the above applies, the wikitext model is used.
+ *
+ * Note: this is used by, and may thus not use, Title::getContentModel()
+ *
+ * @since 1.21
+ *
+ * @param $title Title
+ * @return null|string default model name for the page given by $title
+ */
+ public static function getDefaultModelFor( Title $title ) {
+ // NOTE: this method must not rely on $title->getContentModel() directly or indirectly,
+ // because it is used to initialize the mContentModel member.
+
+ $ns = $title->getNamespace();
+
+ $ext = false;
+ $m = null;
+ $model = MWNamespace::getNamespaceContentModel( $ns );
+
+ // Hook can determine default model
+ if ( !wfRunHooks( 'ContentHandlerDefaultModelFor', array( $title, &$model ) ) ) {
+ if ( !is_null( $model ) ) {
+ return $model;
+ }
+ }
+
+ // Could this page contain custom CSS or JavaScript, based on the title?
+ $isCssOrJsPage = NS_MEDIAWIKI == $ns && preg_match( '!\.(css|js)$!u', $title->getText(), $m );
+ if ( $isCssOrJsPage ) {
+ $ext = $m[1];
+ }
+
+ // Hook can force JS/CSS
+ wfRunHooks( 'TitleIsCssOrJsPage', array( $title, &$isCssOrJsPage ) );
+
+ // Is this a .css subpage of a user page?
+ $isJsCssSubpage = NS_USER == $ns
+ && !$isCssOrJsPage
+ && preg_match( "/\\/.*\\.(js|css)$/", $title->getText(), $m );
+ if ( $isJsCssSubpage ) {
+ $ext = $m[1];
+ }
+
+ // Is this wikitext, according to $wgNamespaceContentModels or the DefaultModelFor hook?
+ $isWikitext = is_null( $model ) || $model == CONTENT_MODEL_WIKITEXT;
+ $isWikitext = $isWikitext && !$isCssOrJsPage && !$isJsCssSubpage;
+
+ // Hook can override $isWikitext
+ wfRunHooks( 'TitleIsWikitextPage', array( $title, &$isWikitext ) );
+
+ if ( !$isWikitext ) {
+ switch ( $ext ) {
+ case 'js':
+ return CONTENT_MODEL_JAVASCRIPT;
+ case 'css':
+ return CONTENT_MODEL_CSS;
+ default:
+ return is_null( $model ) ? CONTENT_MODEL_TEXT : $model;
+ }
+ }
+
+ // We established that it must be wikitext
+
+ return CONTENT_MODEL_WIKITEXT;
+ }
+
+ /**
+ * Returns the appropriate ContentHandler singleton for the given title.
+ *
+ * @since 1.21
+ *
+ * @param $title Title
+ * @return ContentHandler
+ */
+ public static function getForTitle( Title $title ) {
+ $modelId = $title->getContentModel();
+ return ContentHandler::getForModelID( $modelId );
+ }
+
+ /**
+ * Returns the appropriate ContentHandler singleton for the given Content
+ * object.
+ *
+ * @since 1.21
+ *
+ * @param $content Content
+ * @return ContentHandler
+ */
+ public static function getForContent( Content $content ) {
+ $modelId = $content->getModel();
+ return ContentHandler::getForModelID( $modelId );
+ }
+
+ /**
+ * @var Array A Cache of ContentHandler instances by model id
+ */
+ static $handlers;
+
+ /**
+ * Returns the ContentHandler singleton for the given model ID. Use the
+ * CONTENT_MODEL_XXX constants to identify the desired content model.
+ *
+ * ContentHandler singletons are taken from the global $wgContentHandlers
+ * array. Keys in that array are model names, the values are either
+ * ContentHandler singleton objects, or strings specifying the appropriate
+ * subclass of ContentHandler.
+ *
+ * If a class name is encountered when looking up the singleton for a given
+ * model name, the class is instantiated and the class name is replaced by
+ * the resulting singleton in $wgContentHandlers.
+ *
+ * If no ContentHandler is defined for the desired $modelId, the
+ * ContentHandler may be provided by the ContentHandlerForModelID hook.
+ * If no ContentHandler can be determined, an MWException is raised.
+ *
+ * @since 1.21
+ *
+ * @param string $modelId The ID of the content model for which to get a
+ * handler. Use CONTENT_MODEL_XXX constants.
+ * @return ContentHandler The ContentHandler singleton for handling the
+ * model given by $modelId
+ * @throws MWException if no handler is known for $modelId.
+ */
+ public static function getForModelID( $modelId ) {
+ global $wgContentHandlers;
+
+ if ( isset( ContentHandler::$handlers[$modelId] ) ) {
+ return ContentHandler::$handlers[$modelId];
+ }
+
+ if ( empty( $wgContentHandlers[$modelId] ) ) {
+ $handler = null;
+
+ wfRunHooks( 'ContentHandlerForModelID', array( $modelId, &$handler ) );
+
+ if ( $handler === null ) {
+ throw new MWException( "No handler for model '$modelId'' registered in \$wgContentHandlers" );
+ }
+
+ if ( !( $handler instanceof ContentHandler ) ) {
+ throw new MWException( "ContentHandlerForModelID must supply a ContentHandler instance" );
+ }
+ } else {
+ $class = $wgContentHandlers[$modelId];
+ $handler = new $class( $modelId );
+
+ if ( !( $handler instanceof ContentHandler ) ) {
+ throw new MWException( "$class from \$wgContentHandlers is not compatible with ContentHandler" );
+ }
+ }
+
+ wfDebugLog( 'ContentHandler', 'Created handler for ' . $modelId
+ . ': ' . get_class( $handler ) );
+
+ ContentHandler::$handlers[$modelId] = $handler;
+ return ContentHandler::$handlers[$modelId];
+ }
+
+ /**
+ * Returns the localized name for a given content model.
+ *
+ * Model names are localized using system messages. Message keys
+ * have the form content-model-$name, where $name is getContentModelName( $id ).
+ *
+ * @param string $name The content model ID, as given by a CONTENT_MODEL_XXX
+ * constant or returned by Revision::getContentModel().
+ *
+ * @return string The content format's localized name.
+ * @throws MWException if the model id isn't known.
+ */
+ public static function getLocalizedName( $name ) {
+ $key = "content-model-$name";
+
+ $msg = wfMessage( $key );
+
+ return $msg->exists() ? $msg->plain() : $name;
+ }
+
+ public static function getContentModels() {
+ global $wgContentHandlers;
+
+ return array_keys( $wgContentHandlers );
+ }
+
+ public static function getAllContentFormats() {
+ global $wgContentHandlers;
+
+ $formats = array();
+
+ foreach ( $wgContentHandlers as $model => $class ) {
+ $handler = ContentHandler::getForModelID( $model );
+ $formats = array_merge( $formats, $handler->getSupportedFormats() );
+ }
+
+ $formats = array_unique( $formats );
+ return $formats;
+ }
+
+ // ------------------------------------------------------------------------
+
+ protected $mModelID;
+ protected $mSupportedFormats;
+
+ /**
+ * Constructor, initializing the ContentHandler instance with its model ID
+ * and a list of supported formats. Values for the parameters are typically
+ * provided as literals by subclass's constructors.
+ *
+ * @param string $modelId (use CONTENT_MODEL_XXX constants).
+ * @param array $formats List for supported serialization formats
+ * (typically as MIME types)
+ */
+ public function __construct( $modelId, $formats ) {
+ $this->mModelID = $modelId;
+ $this->mSupportedFormats = $formats;
+
+ $this->mModelName = preg_replace( '/(Content)?Handler$/', '', get_class( $this ) );
+ $this->mModelName = preg_replace( '/[_\\\\]/', '', $this->mModelName );
+ $this->mModelName = strtolower( $this->mModelName );
+ }
+
+ /**
+ * Serializes a Content object of the type supported by this ContentHandler.
+ *
+ * @since 1.21
+ *
+ * @param $content Content The Content object to serialize
+ * @param $format null|String The desired serialization format
+ * @return string Serialized form of the content
+ */
+ abstract public function serializeContent( Content $content, $format = null );
+
+ /**
+ * Unserializes a Content object of the type supported by this ContentHandler.
+ *
+ * @since 1.21
+ *
+ * @param string $blob serialized form of the content
+ * @param $format null|String the format used for serialization
+ * @return Content the Content object created by deserializing $blob
+ */
+ abstract public function unserializeContent( $blob, $format = null );
+
+ /**
+ * Creates an empty Content object of the type supported by this
+ * ContentHandler.
+ *
+ * @since 1.21
+ *
+ * @return Content
+ */
+ abstract public function makeEmptyContent();
+
+ /**
+ * Creates a new Content object that acts as a redirect to the given page,
+ * or null of redirects are not supported by this content model.
+ *
+ * This default implementation always returns null. Subclasses supporting redirects
+ * must override this method.
+ *
+ * Note that subclasses that override this method to return a Content object
+ * should also override supportsRedirects() to return true.
+ *
+ * @since 1.21
+ *
+ * @param Title $destination the page to redirect to.
+ *
+ * @return Content
+ */
+ public function makeRedirectContent( Title $destination ) {
+ return null;
+ }
+
+ /**
+ * Returns the model id that identifies the content model this
+ * ContentHandler can handle. Use with the CONTENT_MODEL_XXX constants.
+ *
+ * @since 1.21
+ *
+ * @return String The model ID
+ */
+ public function getModelID() {
+ return $this->mModelID;
+ }
+
+ /**
+ * Throws an MWException if $model_id is not the ID of the content model
+ * supported by this ContentHandler.
+ *
+ * @since 1.21
+ *
+ * @param string $model_id The model to check
+ *
+ * @throws MWException
+ */
+ protected function checkModelID( $model_id ) {
+ if ( $model_id !== $this->mModelID ) {
+ throw new MWException( "Bad content model: " .
+ "expected {$this->mModelID} " .
+ "but got $model_id." );
+ }
+ }
+
+ /**
+ * Returns a list of serialization formats supported by the
+ * serializeContent() and unserializeContent() methods of this
+ * ContentHandler.
+ *
+ * @since 1.21
+ *
+ * @return array of serialization formats as MIME type like strings
+ */
+ public function getSupportedFormats() {
+ return $this->mSupportedFormats;
+ }
+
+ /**
+ * The format used for serialization/deserialization by default by this
+ * ContentHandler.
+ *
+ * This default implementation will return the first element of the array
+ * of formats that was passed to the constructor.
+ *
+ * @since 1.21
+ *
+ * @return string the name of the default serialization format as a MIME type
+ */
+ public function getDefaultFormat() {
+ return $this->mSupportedFormats[0];
+ }
+
+ /**
+ * Returns true if $format is a serialization format supported by this
+ * ContentHandler, and false otherwise.
+ *
+ * Note that if $format is null, this method always returns true, because
+ * null means "use the default format".
+ *
+ * @since 1.21
+ *
+ * @param string $format the serialization format to check
+ * @return bool
+ */
+ public function isSupportedFormat( $format ) {
+
+ if ( !$format ) {
+ return true; // this means "use the default"
+ }
+
+ return in_array( $format, $this->mSupportedFormats );
+ }
+
+ /**
+ * Throws an MWException if isSupportedFormat( $format ) is not true.
+ * Convenient for checking whether a format provided as a parameter is
+ * actually supported.
+ *
+ * @param string $format the serialization format to check
+ *
+ * @throws MWException
+ */
+ protected function checkFormat( $format ) {
+ if ( !$this->isSupportedFormat( $format ) ) {
+ throw new MWException(
+ "Format $format is not supported for content model "
+ . $this->getModelID()
+ );
+ }
+ }
+
+ /**
+ * Returns overrides for action handlers.
+ * Classes listed here will be used instead of the default one when
+ * (and only when) $wgActions[$action] === true. This allows subclasses
+ * to override the default action handlers.
+ *
+ * @since 1.21
+ *
+ * @return Array
+ */
+ public function getActionOverrides() {
+ return array();
+ }
+
+ /**
+ * Factory for creating an appropriate DifferenceEngine for this content model.
+ *
+ * @since 1.21
+ *
+ * @param $context IContextSource context to use, anything else will be
+ * ignored
+ * @param $old Integer Old ID we want to show and diff with.
+ * @param int|string $new String either 'prev' or 'next'.
+ * @param $rcid Integer ??? FIXME (default 0)
+ * @param $refreshCache boolean If set, refreshes the diff cache
+ * @param $unhide boolean If set, allow viewing deleted revs
+ *
+ * @return DifferenceEngine
+ */
+ public function createDifferenceEngine( IContextSource $context,
+ $old = 0, $new = 0,
+ $rcid = 0, # FIXME: use everywhere!
+ $refreshCache = false, $unhide = false
+ ) {
+ $diffEngineClass = $this->getDiffEngineClass();
+
+ return new $diffEngineClass( $context, $old, $new, $rcid, $refreshCache, $unhide );
+ }
+
+ /**
+ * Get the language in which the content of the given page is written.
+ *
+ * This default implementation just returns $wgContLang (except for pages in the MediaWiki namespace)
+ *
+ * Note that the pages language is not cacheable, since it may in some cases depend on user settings.
+ *
+ * Also note that the page language may or may not depend on the actual content of the page,
+ * that is, this method may load the content in order to determine the language.
+ *
+ * @since 1.21
+ *
+ * @param Title $title the page to determine the language for.
+ * @param Content|null $content the page's content, if you have it handy, to avoid reloading it.
+ *
+ * @return Language the page's language
+ */
+ public function getPageLanguage( Title $title, Content $content = null ) {
+ global $wgContLang, $wgLang;
+ $pageLang = $wgContLang;
+
+ if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+ // Parse mediawiki messages with correct target language
+ list( /* $unused */, $lang ) = MessageCache::singleton()->figureMessage( $title->getText() );
+ $pageLang = wfGetLangObj( $lang );
+ }
+
+ wfRunHooks( 'PageContentLanguage', array( $title, &$pageLang, $wgLang ) );
+ return wfGetLangObj( $pageLang );
+ }
+
+ /**
+ * Get the language in which the content of this page is written when
+ * viewed by user. Defaults to $this->getPageLanguage(), but if the user
+ * specified a preferred variant, the variant will be used.
+ *
+ * This default implementation just returns $this->getPageLanguage( $title, $content ) unless
+ * the user specified a preferred variant.
+ *
+ * Note that the pages view language is not cacheable, since it depends on user settings.
+ *
+ * Also note that the page language may or may not depend on the actual content of the page,
+ * that is, this method may load the content in order to determine the language.
+ *
+ * @since 1.21
+ *
+ * @param Title $title the page to determine the language for.
+ * @param Content|null $content the page's content, if you have it handy, to avoid reloading it.
+ *
+ * @return Language the page's language for viewing
+ */
+ public function getPageViewLanguage( Title $title, Content $content = null ) {
+ $pageLang = $this->getPageLanguage( $title, $content );
+
+ if ( $title->getNamespace() !== NS_MEDIAWIKI ) {
+ // If the user chooses a variant, the content is actually
+ // in a language whose code is the variant code.
+ $variant = $pageLang->getPreferredVariant();
+ if ( $pageLang->getCode() !== $variant ) {
+ $pageLang = Language::factory( $variant );
+ }
+ }
+
+ return $pageLang;
+ }
+
+ /**
+ * Determines whether the content type handled by this ContentHandler
+ * can be used on the given page.
+ *
+ * This default implementation always returns true.
+ * Subclasses may override this to restrict the use of this content model to specific locations,
+ * typically based on the namespace or some other aspect of the title, such as a special suffix
+ * (e.g. ".svg" for SVG content).
+ *
+ * @param Title $title the page's title.
+ *
+ * @return bool true if content of this kind can be used on the given page, false otherwise.
+ */
+ public function canBeUsedOn( Title $title ) {
+ return true;
+ }
+
+ /**
+ * Returns the name of the diff engine to use.
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ protected function getDiffEngineClass() {
+ return 'DifferenceEngine';
+ }
+
+ /**
+ * Attempts to merge differences between three versions.
+ * Returns a new Content object for a clean merge and false for failure or
+ * a conflict.
+ *
+ * This default implementation always returns false.
+ *
+ * @since 1.21
+ *
+ * @param $oldContent Content|string String
+ * @param $myContent Content|string String
+ * @param $yourContent Content|string String
+ *
+ * @return Content|Bool
+ */
+ public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) {
+ return false;
+ }
+
+ /**
+ * Return an applicable auto-summary if one exists for the given edit.
+ *
+ * @since 1.21
+ *
+ * @param $oldContent Content|null: the previous text of the page.
+ * @param $newContent Content|null: The submitted text of the page.
+ * @param int $flags Bit mask: a bit mask of flags submitted for the edit.
+ *
+ * @return string An appropriate auto-summary, or an empty string.
+ */
+ public function getAutosummary( Content $oldContent = null, Content $newContent = null, $flags ) {
+ // Decide what kind of auto-summary is needed.
+
+ // Redirect auto-summaries
+
+ /**
+ * @var $ot Title
+ * @var $rt Title
+ */
+
+ $ot = !is_null( $oldContent ) ? $oldContent->getRedirectTarget() : null;
+ $rt = !is_null( $newContent ) ? $newContent->getRedirectTarget() : null;
+
+ if ( is_object( $rt ) ) {
+ if ( !is_object( $ot )
+ || !$rt->equals( $ot )
+ || $ot->getFragment() != $rt->getFragment() )
+ {
+ $truncatedtext = $newContent->getTextForSummary(
+ 250
+ - strlen( wfMessage( 'autoredircomment' )->inContentLanguage()->text() )
+ - strlen( $rt->getFullText() ) );
+
+ return wfMessage( 'autoredircomment', $rt->getFullText() )
+ ->rawParams( $truncatedtext )->inContentLanguage()->text();
+ }
+ }
+
+ // New page auto-summaries
+ if ( $flags & EDIT_NEW && $newContent->getSize() > 0 ) {
+ // If they're making a new article, give its text, truncated, in
+ // the summary.
+
+ $truncatedtext = $newContent->getTextForSummary(
+ 200 - strlen( wfMessage( 'autosumm-new' )->inContentLanguage()->text() ) );
+
+ return wfMessage( 'autosumm-new' )->rawParams( $truncatedtext )
+ ->inContentLanguage()->text();
+ }
+
+ // Blanking auto-summaries
+ if ( !empty( $oldContent ) && $oldContent->getSize() > 0 && $newContent->getSize() == 0 ) {
+ return wfMessage( 'autosumm-blank' )->inContentLanguage()->text();
+ } elseif ( !empty( $oldContent )
+ && $oldContent->getSize() > 10 * $newContent->getSize()
+ && $newContent->getSize() < 500 )
+ {
+ // Removing more than 90% of the article
+
+ $truncatedtext = $newContent->getTextForSummary(
+ 200 - strlen( wfMessage( 'autosumm-replace' )->inContentLanguage()->text() ) );
+
+ return wfMessage( 'autosumm-replace' )->rawParams( $truncatedtext )
+ ->inContentLanguage()->text();
+ }
+
+ // If we reach this point, there's no applicable auto-summary for our
+ // case, so our auto-summary is empty.
+ return '';
+ }
+
+ /**
+ * Auto-generates a deletion reason
+ *
+ * @since 1.21
+ *
+ * @param $title Title: the page's title
+ * @param &$hasHistory Boolean: whether the page has a history
+ * @return mixed String containing deletion reason or empty string, or
+ * boolean false if no revision occurred
+ *
+ * @XXX &$hasHistory is extremely ugly, it's here because
+ * WikiPage::getAutoDeleteReason() and Article::generateReason()
+ * have it / want it.
+ */
+ public function getAutoDeleteReason( Title $title, &$hasHistory ) {
+ $dbw = wfGetDB( DB_MASTER );
+
+ // Get the last revision
+ $rev = Revision::newFromTitle( $title );
+
+ if ( is_null( $rev ) ) {
+ return false;
+ }
+
+ // Get the article's contents
+ $content = $rev->getContent();
+ $blank = false;
+
+ // If the page is blank, use the text from the previous revision,
+ // which can only be blank if there's a move/import/protect dummy
+ // revision involved
+ if ( !$content || $content->isEmpty() ) {
+ $prev = $rev->getPrevious();
+
+ if ( $prev ) {
+ $rev = $prev;
+ $content = $rev->getContent();
+ $blank = true;
+ }
+ }
+
+ $this->checkModelID( $rev->getContentModel() );
+
+ // Find out if there was only one contributor
+ // Only scan the last 20 revisions
+ $res = $dbw->select( 'revision', 'rev_user_text',
+ array(
+ 'rev_page' => $title->getArticleID(),
+ $dbw->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0'
+ ),
+ __METHOD__,
+ array( 'LIMIT' => 20 )
+ );
+
+ if ( $res === false ) {
+ // This page has no revisions, which is very weird
+ return false;
+ }
+
+ $hasHistory = ( $res->numRows() > 1 );
+ $row = $dbw->fetchObject( $res );
+
+ if ( $row ) { // $row is false if the only contributor is hidden
+ $onlyAuthor = $row->rev_user_text;
+ // Try to find a second contributor
+ foreach ( $res as $row ) {
+ if ( $row->rev_user_text != $onlyAuthor ) { // Bug 22999
+ $onlyAuthor = false;
+ break;
+ }
+ }
+ } else {
+ $onlyAuthor = false;
+ }
+
+ // Generate the summary with a '$1' placeholder
+ if ( $blank ) {
+ // The current revision is blank and the one before is also
+ // blank. It's just not our lucky day
+ $reason = wfMessage( 'exbeforeblank', '$1' )->inContentLanguage()->text();
+ } else {
+ if ( $onlyAuthor ) {
+ $reason = wfMessage(
+ 'excontentauthor',
+ '$1',
+ $onlyAuthor
+ )->inContentLanguage()->text();
+ } else {
+ $reason = wfMessage( 'excontent', '$1' )->inContentLanguage()->text();
+ }
+ }
+
+ if ( $reason == '-' ) {
+ // Allow these UI messages to be blanked out cleanly
+ return '';
+ }
+
+ // Max content length = max comment length - length of the comment (excl. $1)
+ $text = $content ? $content->getTextForSummary( 255 - ( strlen( $reason ) - 2 ) ) : '';
+
+ // Now replace the '$1' placeholder
+ $reason = str_replace( '$1', $text, $reason );
+
+ return $reason;
+ }
+
+ /**
+ * Get the Content object that needs to be saved in order to undo all revisions
+ * between $undo and $undoafter. Revisions must belong to the same page,
+ * must exist and must not be deleted.
+ *
+ * @since 1.21
+ *
+ * @param $current Revision The current text
+ * @param $undo Revision The revision to undo
+ * @param $undoafter Revision Must be an earlier revision than $undo
+ *
+ * @return mixed String on success, false on failure
+ */
+ public function getUndoContent( Revision $current, Revision $undo, Revision $undoafter ) {
+ $cur_content = $current->getContent();
+
+ if ( empty( $cur_content ) ) {
+ return false; // no page
+ }
+
+ $undo_content = $undo->getContent();
+ $undoafter_content = $undoafter->getContent();
+
+ $this->checkModelID( $cur_content->getModel() );
+ $this->checkModelID( $undo_content->getModel() );
+ $this->checkModelID( $undoafter_content->getModel() );
+
+ if ( $cur_content->equals( $undo_content ) ) {
+ // No use doing a merge if it's just a straight revert.
+ return $undoafter_content;
+ }
+
+ $undone_content = $this->merge3( $undo_content, $undoafter_content, $cur_content );
+
+ return $undone_content;
+ }
+
+ /**
+ * Get parser options suitable for rendering the primary article wikitext
+ *
+ * @param IContextSource|User|string $context One of the following:
+ * - IContextSource: Use the User and the Language of the provided
+ * context
+ * - User: Use the provided User object and $wgLang for the language,
+ * so use an IContextSource object if possible.
+ * - 'canonical': Canonical options (anonymous user with default
+ * preferences and content language).
+ *
+ * @param IContextSource|User|string $context
+ *
+ * @throws MWException
+ * @return ParserOptions
+ */
+ public function makeParserOptions( $context ) {
+ global $wgContLang;
+
+ if ( $context instanceof IContextSource ) {
+ $options = ParserOptions::newFromContext( $context );
+ } elseif ( $context instanceof User ) { // settings per user (even anons)
+ $options = ParserOptions::newFromUser( $context );
+ } elseif ( $context === 'canonical' ) { // canonical settings
+ $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
+ } else {
+ throw new MWException( "Bad context for parser options: $context" );
+ }
+
+ $options->enableLimitReport(); // show inclusion/loop reports
+ $options->setTidy( true ); // fix bad HTML
+
+ return $options;
+ }
+
+ /**
+ * Returns true for content models that support caching using the
+ * ParserCache mechanism. See WikiPage::isParserCacheUsed().
+ *
+ * @since 1.21
+ *
+ * @return bool
+ */
+ public function isParserCacheSupported() {
+ return false;
+ }
+
+ /**
+ * Returns true if this content model supports sections.
+ * This default implementation returns false.
+ *
+ * Content models that return true here should also implement
+ * Content::getSection, Content::replaceSection, etc. to handle sections..
+ *
+ * @return boolean whether sections are supported.
+ */
+ public function supportsSections() {
+ return false;
+ }
+
+ /**
+ * Returns true if this content model supports redirects.
+ * This default implementation returns false.
+ *
+ * Content models that return true here should also implement
+ * ContentHandler::makeRedirectContent to return a Content object.
+ *
+ * @return boolean whether redirects are supported.
+ */
+ public function supportsRedirects() {
+ return false;
+ }
+
+ /**
+ * Logs a deprecation warning, visible if $wgDevelopmentWarnings, but only if
+ * self::$enableDeprecationWarnings is set to true.
+ *
+ * @param string $func The name of the deprecated function
+ * @param string $version The version since the method is deprecated. Usually 1.21
+ * for ContentHandler related stuff.
+ * @param string|bool $component: Component to which the function belongs.
+ * If false, it is assumed the function is in MediaWiki core.
+ *
+ * @see ContentHandler::$enableDeprecationWarnings
+ * @see wfDeprecated
+ */
+ public static function deprecated( $func, $version, $component = false ) {
+ if ( self::$enableDeprecationWarnings ) {
+ wfDeprecated( $func, $version, $component, 3 );
+ }
+ }
+
+ /**
+ * Call a legacy hook that uses text instead of Content objects.
+ * Will log a warning when a matching hook function is registered.
+ * If the textual representation of the content is changed by the
+ * hook function, a new Content object is constructed from the new
+ * text.
+ *
+ * @param string $event event name
+ * @param array $args parameters passed to hook functions
+ * @param bool $warn whether to log a warning.
+ * Default to self::$enableDeprecationWarnings.
+ * May be set to false for testing.
+ *
+ * @return Boolean True if no handler aborted the hook
+ *
+ * @see ContentHandler::$enableDeprecationWarnings
+ */
+ public static function runLegacyHooks( $event, $args = array(),
+ $warn = null ) {
+
+ if ( $warn === null ) {
+ $warn = self::$enableDeprecationWarnings;
+ }
+
+ if ( !Hooks::isRegistered( $event ) ) {
+ return true; // nothing to do here
+ }
+
+ if ( $warn ) {
+ // Log information about which handlers are registered for the legacy hook,
+ // so we can find and fix them.
+
+ $handlers = Hooks::getHandlers( $event );
+ $handlerInfo = array();
+
+ wfSuppressWarnings();
+
+ foreach ( $handlers as $handler ) {
+ if ( is_array( $handler ) ) {
+ if ( is_object( $handler[0] ) ) {
+ $info = get_class( $handler[0] );
+ } else {
+ $info = $handler[0];
+ }
+
+ if ( isset( $handler[1] ) ) {
+ $info .= '::' . $handler[1];
+ }
+ } else if ( is_object( $handler ) ) {
+ $info = get_class( $handler[0] );
+ $info .= '::on' . $event;
+ } else {
+ $info = $handler;
+ }
+
+ $handlerInfo[] = $info;
+ }
+
+ wfRestoreWarnings();
+
+ wfWarn( "Using obsolete hook $event via ContentHandler::runLegacyHooks()! Handlers: " . implode( ', ', $handlerInfo ), 2 );
+ }
+
+ // convert Content objects to text
+ $contentObjects = array();
+ $contentTexts = array();
+
+ foreach ( $args as $k => $v ) {
+ if ( $v instanceof Content ) {
+ /* @var Content $v */
+
+ $contentObjects[$k] = $v;
+
+ $v = $v->serialize();
+ $contentTexts[ $k ] = $v;
+ $args[ $k ] = $v;
+ }
+ }
+
+ // call the hook functions
+ $ok = wfRunHooks( $event, $args );
+
+ // see if the hook changed the text
+ foreach ( $contentTexts as $k => $orig ) {
+ /* @var Content $content */
+
+ $modified = $args[ $k ];
+ $content = $contentObjects[$k];
+
+ if ( $modified !== $orig ) {
+ // text was changed, create updated Content object
+ $content = $content->getContentHandler()->unserializeContent( $modified );
+ }
+
+ $args[ $k ] = $content;
+ }
+
+ return $ok;
+ }
+}
diff --git a/includes/content/CssContent.php b/includes/content/CssContent.php
new file mode 100644
index 00000000..569d122d
--- /dev/null
+++ b/includes/content/CssContent.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Content object for CSS pages.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+
+/**
+ * Content object for CSS pages.
+ *
+ * @ingroup Content
+ */
+class CssContent extends TextContent {
+ public function __construct( $text ) {
+ parent::__construct( $text, CONTENT_MODEL_CSS );
+ }
+
+ /**
+ * Returns a Content object with pre-save transformations applied using
+ * Parser::preSaveTransform().
+ *
+ * @param $title Title
+ * @param $user User
+ * @param $popts ParserOptions
+ * @return Content
+ */
+ public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+ global $wgParser;
+ // @todo: make pre-save transformation optional for script pages
+
+ $text = $this->getNativeData();
+ $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
+
+ return new CssContent( $pst );
+ }
+
+ protected function getHtml() {
+ $html = "";
+ $html .= "<pre class=\"mw-code mw-css\" dir=\"ltr\">\n";
+ $html .= $this->getHighlightHtml();
+ $html .= "\n</pre>\n";
+
+ return $html;
+ }
+}
diff --git a/includes/content/CssContentHandler.php b/includes/content/CssContentHandler.php
new file mode 100644
index 00000000..cb5a349d
--- /dev/null
+++ b/includes/content/CssContentHandler.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Content handler for CSS pages.
+ *
+ * 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 Content
+ */
+
+/**
+ * Content handler for CSS pages.
+ *
+ * @since 1.21
+ * @ingroup Content
+ */
+class CssContentHandler extends TextContentHandler {
+
+ public function __construct( $modelId = CONTENT_MODEL_CSS ) {
+ parent::__construct( $modelId, array( CONTENT_FORMAT_CSS ) );
+ }
+
+ public function unserializeContent( $text, $format = null ) {
+ $this->checkFormat( $format );
+
+ return new CssContent( $text );
+ }
+
+ public function makeEmptyContent() {
+ return new CssContent( '' );
+ }
+
+ /**
+ * Returns the english language, because CSS is english, and should be handled as such.
+ *
+ * @return Language wfGetLangObj( 'en' )
+ *
+ * @see ContentHandler::getPageLanguage()
+ */
+ public function getPageLanguage( Title $title, Content $content = null ) {
+ return wfGetLangObj( 'en' );
+ }
+
+ /**
+ * Returns the english language, because CSS is english, and should be handled as such.
+ *
+ * @return Language wfGetLangObj( 'en' )
+ *
+ * @see ContentHandler::getPageViewLanguage()
+ */
+ public function getPageViewLanguage( Title $title, Content $content = null ) {
+ return wfGetLangObj( 'en' );
+ }
+}
diff --git a/includes/content/JavaScriptContent.php b/includes/content/JavaScriptContent.php
new file mode 100644
index 00000000..9cd947f9
--- /dev/null
+++ b/includes/content/JavaScriptContent.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Content for JavaScript pages.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+
+/**
+ * Content for JavaScript pages.
+ *
+ * @ingroup Content
+ */
+class JavaScriptContent extends TextContent {
+ public function __construct( $text ) {
+ parent::__construct( $text, CONTENT_MODEL_JAVASCRIPT );
+ }
+
+ /**
+ * Returns a Content object with pre-save transformations applied using
+ * Parser::preSaveTransform().
+ *
+ * @param Title $title
+ * @param User $user
+ * @param ParserOptions $popts
+ * @return Content
+ */
+ public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+ global $wgParser;
+ // @todo: make pre-save transformation optional for script pages
+ // See bug #32858
+
+ $text = $this->getNativeData();
+ $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
+
+ return new JavaScriptContent( $pst );
+ }
+
+ protected function getHtml() {
+ $html = "";
+ $html .= "<pre class=\"mw-code mw-js\" dir=\"ltr\">\n";
+ $html .= $this->getHighlightHtml();
+ $html .= "\n</pre>\n";
+
+ return $html;
+ }
+}
diff --git a/includes/content/JavaScriptContentHandler.php b/includes/content/JavaScriptContentHandler.php
new file mode 100644
index 00000000..33fa9172
--- /dev/null
+++ b/includes/content/JavaScriptContentHandler.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Content handler for JavaScript pages.
+ *
+ * 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
+ */
+
+/**
+ * Content handler for JavaScript pages.
+ *
+ * @since 1.21
+ * @ingroup Content
+ * @todo make ScriptContentHandler base class, do highlighting stuff there?
+ */
+class JavaScriptContentHandler extends TextContentHandler {
+
+ public function __construct( $modelId = CONTENT_MODEL_JAVASCRIPT ) {
+ parent::__construct( $modelId, array( CONTENT_FORMAT_JAVASCRIPT ) );
+ }
+
+ public function unserializeContent( $text, $format = null ) {
+ $this->checkFormat( $format );
+
+ return new JavaScriptContent( $text );
+ }
+
+ public function makeEmptyContent() {
+ return new JavaScriptContent( '' );
+ }
+
+ /**
+ * Returns the english language, because JS is english, and should be handled as such.
+ *
+ * @return Language wfGetLangObj( 'en' )
+ *
+ * @see ContentHandler::getPageLanguage()
+ */
+ public function getPageLanguage( Title $title, Content $content = null ) {
+ return wfGetLangObj( 'en' );
+ }
+
+ /**
+ * Returns the english language, because JS is english, and should be handled as such.
+ *
+ * @return Language wfGetLangObj( 'en' )
+ *
+ * @see ContentHandler::getPageViewLanguage()
+ */
+ public function getPageViewLanguage( Title $title, Content $content = null ) {
+ return wfGetLangObj( 'en' );
+ }
+}
diff --git a/includes/content/MessageContent.php b/includes/content/MessageContent.php
new file mode 100644
index 00000000..b36b670c
--- /dev/null
+++ b/includes/content/MessageContent.php
@@ -0,0 +1,158 @@
+<?php
+/**
+ * Wrapper content object allowing to handle a system message as a Content object.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+
+/**
+ * Wrapper allowing us to handle a system message as a Content object.
+ * Note that this is generally *not* used to represent content from the
+ * MediaWiki namespace, and that there is no MessageContentHandler.
+ * MessageContent is just intended as glue for wrapping a message programatically.
+ *
+ * @ingroup Content
+ */
+class MessageContent extends AbstractContent {
+
+ /**
+ * @var Message
+ */
+ protected $mMessage;
+
+ /**
+ * @param Message|String $msg A Message object, or a message key
+ * @param array|null $params An optional array of message parameters
+ */
+ public function __construct( $msg, $params = null ) {
+ # XXX: messages may be wikitext, html or plain text! and maybe even something else entirely.
+ parent::__construct( CONTENT_MODEL_WIKITEXT );
+
+ if ( is_string( $msg ) ) {
+ $this->mMessage = wfMessage( $msg );
+ } else {
+ $this->mMessage = clone $msg;
+ }
+
+ if ( $params ) {
+ $this->mMessage = $this->mMessage->params( $params );
+ }
+ }
+
+ /**
+ * Returns the message as rendered HTML
+ *
+ * @return string The message text, parsed into html
+ */
+ public function getHtml() {
+ return $this->mMessage->parse();
+ }
+
+ /**
+ * Returns the message as rendered HTML
+ *
+ * @return string The message text, parsed into html
+ */
+ public function getWikitext() {
+ return $this->mMessage->text();
+ }
+
+ /**
+ * Returns the message object, with any parameters already substituted.
+ *
+ * @return Message The message object.
+ */
+ public function getNativeData() {
+ //NOTE: Message objects are mutable. Cloning here makes MessageContent immutable.
+ return clone $this->mMessage;
+ }
+
+ /**
+ * @see Content::getTextForSearchIndex
+ */
+ public function getTextForSearchIndex() {
+ return $this->mMessage->plain();
+ }
+
+ /**
+ * @see Content::getWikitextForTransclusion
+ */
+ public function getWikitextForTransclusion() {
+ return $this->getWikitext();
+ }
+
+ /**
+ * @see Content::getTextForSummary
+ */
+ public function getTextForSummary( $maxlength = 250 ) {
+ return substr( $this->mMessage->plain(), 0, $maxlength );
+ }
+
+ /**
+ * @see Content::getSize
+ *
+ * @return int
+ */
+ public function getSize() {
+ return strlen( $this->mMessage->plain() );
+ }
+
+ /**
+ * @see Content::copy
+ *
+ * @return Content. A copy of this object
+ */
+ public function copy() {
+ // MessageContent is immutable (because getNativeData() returns a clone of the Message object)
+ return $this;
+ }
+
+ /**
+ * @see Content::isCountable
+ *
+ * @return bool false
+ */
+ public function isCountable( $hasLinks = null ) {
+ return false;
+ }
+
+ /**
+ * @see Content::getParserOutput
+ *
+ * @return ParserOutput
+ */
+ public function getParserOutput(
+ Title $title, $revId = null,
+ ParserOptions $options = null, $generateHtml = true
+ ) {
+
+ if ( $generateHtml ) {
+ $html = $this->getHtml();
+ } else {
+ $html = '';
+ }
+
+ $po = new ParserOutput( $html );
+ return $po;
+ }
+}
diff --git a/includes/content/TextContent.php b/includes/content/TextContent.php
new file mode 100644
index 00000000..8fafcb63
--- /dev/null
+++ b/includes/content/TextContent.php
@@ -0,0 +1,286 @@
+<?php
+/**
+ * Content object implementation for representing flat text.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+
+/**
+ * Content object implementation for representing flat text.
+ *
+ * TextContent instances are immutable
+ *
+ * @ingroup Content
+ */
+class TextContent extends AbstractContent {
+
+ public function __construct( $text, $model_id = CONTENT_MODEL_TEXT ) {
+ parent::__construct( $model_id );
+
+ if ( $text === null || $text === false ) {
+ wfWarn( "TextContent constructed with \$text = " . var_export( $text, true ) . "! "
+ . "This may indicate an error in the caller's scope." );
+
+ $text = '';
+ }
+
+ if ( !is_string( $text ) ) {
+ throw new MWException( "TextContent expects a string in the constructor." );
+ }
+
+ $this->mText = $text;
+ }
+
+ public function copy() {
+ return $this; # NOTE: this is ok since TextContent are immutable.
+ }
+
+ public function getTextForSummary( $maxlength = 250 ) {
+ global $wgContLang;
+
+ $text = $this->getNativeData();
+
+ $truncatedtext = $wgContLang->truncate(
+ preg_replace( "/[\n\r]/", ' ', $text ),
+ max( 0, $maxlength ) );
+
+ return $truncatedtext;
+ }
+
+ /**
+ * returns the text's size in bytes.
+ *
+ * @return int The size
+ */
+ public function getSize() {
+ $text = $this->getNativeData();
+ return strlen( $text );
+ }
+
+ /**
+ * Returns true if this content is not a redirect, and $wgArticleCountMethod
+ * is "any".
+ *
+ * @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 True if the content is countable
+ */
+ public function isCountable( $hasLinks = null ) {
+ global $wgArticleCountMethod;
+
+ if ( $this->isRedirect() ) {
+ return false;
+ }
+
+ if ( $wgArticleCountMethod === 'any' ) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns the text represented by this Content object, as a string.
+ *
+ * @return string: the raw text
+ */
+ public function getNativeData() {
+ $text = $this->mText;
+ return $text;
+ }
+
+ /**
+ * Returns the text represented by this Content object, as a string.
+ *
+ * @return string: the raw text
+ */
+ public function getTextForSearchIndex() {
+ return $this->getNativeData();
+ }
+
+ /**
+ * Returns attempts to convert this content object to wikitext,
+ * and then returns the text string. The conversion may be lossy.
+ *
+ * @note: this allows any text-based content to be transcluded as if it was wikitext.
+ *
+ * @return string|false: the raw text, or null if the conversion failed
+ */
+ public function getWikitextForTransclusion() {
+ $wikitext = $this->convert( CONTENT_MODEL_WIKITEXT, 'lossy' );
+
+ if ( $wikitext ) {
+ return $wikitext->getNativeData();
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Returns a Content object with pre-save transformations applied.
+ * This implementation just trims trailing whitespace.
+ *
+ * @param $title Title
+ * @param $user User
+ * @param $popts ParserOptions
+ * @return Content
+ */
+ public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+ $text = $this->getNativeData();
+ $pst = rtrim( $text );
+
+ return ( $text === $pst ) ? $this : new WikitextContent( $pst );
+ }
+
+ /**
+ * Diff this content object with another content object.
+ *
+ * @since 1.21diff
+ *
+ * @param $that Content: The other content object to compare this content
+ * object to.
+ * @param $lang Language: The language object to use for text segmentation.
+ * If not given, $wgContentLang is used.
+ *
+ * @return DiffResult: A diff representing the changes that would have to be
+ * made to this content object to make it equal to $that.
+ */
+ public function diff( Content $that, Language $lang = null ) {
+ global $wgContLang;
+
+ $this->checkModelID( $that->getModel() );
+
+ # @todo: could implement this in DifferenceEngine and just delegate here?
+
+ if ( !$lang ) {
+ $lang = $wgContLang;
+ }
+
+ $otext = $this->getNativeData();
+ $ntext = $this->getNativeData();
+
+ # Note: Use native PHP diff, external engines don't give us abstract output
+ $ota = explode( "\n", $lang->segmentForDiff( $otext ) );
+ $nta = explode( "\n", $lang->segmentForDiff( $ntext ) );
+
+ $diff = new Diff( $ota, $nta );
+ return $diff;
+ }
+
+ /**
+ * Returns a generic ParserOutput object, wrapping the HTML returned by
+ * getHtml().
+ *
+ * @param $title Title Context title for parsing
+ * @param int|null $revId Revision ID (for {{REVISIONID}})
+ * @param $options ParserOptions|null Parser options
+ * @param bool $generateHtml Whether or not to generate HTML
+ *
+ * @return ParserOutput representing the HTML form of the text
+ */
+ public function getParserOutput( Title $title,
+ $revId = null,
+ ParserOptions $options = null, $generateHtml = true
+ ) {
+ global $wgParser, $wgTextModelsToParse;
+
+ if ( !$options ) {
+ //NOTE: use canonical options per default to produce cacheable output
+ $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
+ }
+
+ if ( in_array( $this->getModel(), $wgTextModelsToParse ) ) {
+ // parse just to get links etc into the database
+ $po = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
+ } else {
+ $po = new ParserOutput();
+ }
+
+ if ( $generateHtml ) {
+ $html = $this->getHtml();
+ } else {
+ $html = '';
+ }
+
+ $po->setText( $html );
+ return $po;
+ }
+
+ /**
+ * Generates an HTML version of the content, for display. Used by
+ * getParserOutput() to construct a ParserOutput object.
+ *
+ * This default implementation just calls getHighlightHtml(). Content
+ * models that have another mapping to HTML (as is the case for markup
+ * languages like wikitext) should override this method to generate the
+ * appropriate HTML.
+ *
+ * @return string An HTML representation of the content
+ */
+ protected function getHtml() {
+ return $this->getHighlightHtml();
+ }
+
+ /**
+ * Generates a syntax-highlighted version of the content, as HTML.
+ * Used by the default implementation of getHtml().
+ *
+ * @return string an HTML representation of the content's markup
+ */
+ protected function getHighlightHtml() {
+ # TODO: make Highlighter interface, use highlighter here, if available
+ return htmlspecialchars( $this->getNativeData() );
+ }
+
+ /**
+ * @see Content::convert()
+ *
+ * This implementation provides lossless conversion between content models based
+ * on TextContent.
+ *
+ * @param string $toModel the desired content model, use the CONTENT_MODEL_XXX flags.
+ * @param string $lossy flag, set to "lossy" to allow lossy conversion. If lossy conversion is
+ * not allowed, full round-trip conversion is expected to work without losing information.
+ *
+ * @return Content|bool A content object with the content model $toModel, or false if
+ * that conversion is not supported.
+ */
+ public function convert( $toModel, $lossy = '' ) {
+ $converted = parent::convert( $toModel, $lossy );
+
+ if ( $converted !== false ) {
+ return $converted;
+ }
+
+ $toHandler = ContentHandler::getForModelID( $toModel );
+
+ if ( $toHandler instanceof TextContentHandler ) {
+ //NOTE: ignore content serialization format - it's just text anyway.
+ $text = $this->getNativeData();
+ $converted = $toHandler->unserializeContent( $text );
+ }
+
+ return $converted;
+ }
+}
diff --git a/includes/content/TextContentHandler.php b/includes/content/TextContentHandler.php
new file mode 100644
index 00000000..e7f41e18
--- /dev/null
+++ b/includes/content/TextContentHandler.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * Base content handler class for flat text contents.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ */
+
+/**
+ * Base content handler implementation for flat text contents.
+ *
+ * @ingroup Content
+ */
+class TextContentHandler extends ContentHandler {
+
+ public function __construct( $modelId = CONTENT_MODEL_TEXT, $formats = array( CONTENT_FORMAT_TEXT ) ) {
+ parent::__construct( $modelId, $formats );
+ }
+
+ /**
+ * Returns the content's text as-is.
+ *
+ * @param $content Content
+ * @param $format string|null
+ * @return mixed
+ */
+ public function serializeContent( Content $content, $format = null ) {
+ $this->checkFormat( $format );
+ return $content->getNativeData();
+ }
+
+ /**
+ * Attempts to merge differences between three versions. Returns a new
+ * Content object for a clean merge and false for failure or a conflict.
+ *
+ * All three Content objects passed as parameters must have the same
+ * content model.
+ *
+ * This text-based implementation uses wfMerge().
+ *
+ * @param $oldContent Content|string String
+ * @param $myContent Content|string String
+ * @param $yourContent Content|string String
+ *
+ * @return Content|Bool
+ */
+ public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) {
+ $this->checkModelID( $oldContent->getModel() );
+ $this->checkModelID( $myContent->getModel() );
+ $this->checkModelID( $yourContent->getModel() );
+
+ $format = $this->getDefaultFormat();
+
+ $old = $this->serializeContent( $oldContent, $format );
+ $mine = $this->serializeContent( $myContent, $format );
+ $yours = $this->serializeContent( $yourContent, $format );
+
+ $ok = wfMerge( $old, $mine, $yours, $result );
+
+ if ( !$ok ) {
+ return false;
+ }
+
+ if ( !$result ) {
+ return $this->makeEmptyContent();
+ }
+
+ $mergedContent = $this->unserializeContent( $result, $format );
+ return $mergedContent;
+ }
+
+ /**
+ * Unserializes a Content object of the type supported by this ContentHandler.
+ *
+ * @since 1.21
+ *
+ * @param $text string serialized form of the content
+ * @param $format null|String the format used for serialization
+ *
+ * @return Content the TextContent object wrapping $text
+ */
+ public function unserializeContent( $text, $format = null ) {
+ $this->checkFormat( $format );
+
+ return new TextContent( $text );
+ }
+
+ /**
+ * Creates an empty TextContent object.
+ *
+ * @since 1.21
+ *
+ * @return Content
+ */
+ public function makeEmptyContent() {
+ return new TextContent( '' );
+ }
+}
diff --git a/includes/content/WikitextContent.php b/includes/content/WikitextContent.php
new file mode 100644
index 00000000..8be4ebab
--- /dev/null
+++ b/includes/content/WikitextContent.php
@@ -0,0 +1,322 @@
+<?php
+/**
+ * Content object for wiki text pages.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+
+/**
+ * Content object for wiki text pages.
+ *
+ * @ingroup Content
+ */
+class WikitextContent extends TextContent {
+
+ public function __construct( $text ) {
+ parent::__construct( $text, CONTENT_MODEL_WIKITEXT );
+ }
+
+ /**
+ * @see Content::getSection()
+ */
+ public function getSection( $section ) {
+ global $wgParser;
+
+ $text = $this->getNativeData();
+ $sect = $wgParser->getSection( $text, $section, false );
+
+ if ( $sect === false ) {
+ return false;
+ } else {
+ return new WikitextContent( $sect );
+ }
+ }
+
+ /**
+ * @see Content::replaceSection()
+ */
+ public function replaceSection( $section, Content $with, $sectionTitle = '' ) {
+ wfProfileIn( __METHOD__ );
+
+ $myModelId = $this->getModel();
+ $sectionModelId = $with->getModel();
+
+ if ( $sectionModelId != $myModelId ) {
+ throw new MWException( "Incompatible content model for section: " .
+ "document uses $myModelId but " .
+ "section uses $sectionModelId." );
+ }
+
+ $oldtext = $this->getNativeData();
+ $text = $with->getNativeData();
+
+ if ( $section === '' ) {
+ wfProfileOut( __METHOD__ );
+ return $with; # XXX: copy first?
+ } if ( $section == 'new' ) {
+ # Inserting a new section
+ $subject = $sectionTitle ? wfMessage( 'newsectionheaderdefaultlevel' )
+ ->rawParams( $sectionTitle )->inContentLanguage()->text() . "\n\n" : '';
+ if ( wfRunHooks( 'PlaceNewSection', array( $this, $oldtext, $subject, &$text ) ) ) {
+ $text = strlen( trim( $oldtext ) ) > 0
+ ? "{$oldtext}\n\n{$subject}{$text}"
+ : "{$subject}{$text}";
+ }
+ } else {
+ # Replacing an existing section; roll out the big guns
+ global $wgParser;
+
+ $text = $wgParser->replaceSection( $oldtext, $section, $text );
+ }
+
+ $newContent = new WikitextContent( $text );
+
+ wfProfileOut( __METHOD__ );
+ return $newContent;
+ }
+
+ /**
+ * Returns a new WikitextContent object with the given section heading
+ * prepended.
+ *
+ * @param $header string
+ * @return Content
+ */
+ public function addSectionHeader( $header ) {
+ $text = wfMessage( 'newsectionheaderdefaultlevel' )
+ ->rawParams( $header )->inContentLanguage()->text();
+ $text .= "\n\n";
+ $text .= $this->getNativeData();
+
+ return new WikitextContent( $text );
+ }
+
+ /**
+ * Returns a Content object with pre-save transformations applied using
+ * Parser::preSaveTransform().
+ *
+ * @param $title Title
+ * @param $user User
+ * @param $popts ParserOptions
+ * @return Content
+ */
+ public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+ global $wgParser;
+
+ $text = $this->getNativeData();
+ $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
+ rtrim( $pst );
+
+ return ( $text === $pst ) ? $this : new WikitextContent( $pst );
+ }
+
+ /**
+ * Returns a Content object with preload transformations applied (or this
+ * object if no transformations apply).
+ *
+ * @param $title Title
+ * @param $popts ParserOptions
+ * @return Content
+ */
+ public function preloadTransform( Title $title, ParserOptions $popts ) {
+ global $wgParser;
+
+ $text = $this->getNativeData();
+ $plt = $wgParser->getPreloadText( $text, $title, $popts );
+
+ return new WikitextContent( $plt );
+ }
+
+ /**
+ * Implement redirect extraction for wikitext.
+ *
+ * @return null|Title
+ *
+ * @note: migrated here from Title::newFromRedirectInternal()
+ *
+ * @see Content::getRedirectTarget
+ * @see AbstractContent::getRedirectTarget
+ */
+ public function getRedirectTarget() {
+ global $wgMaxRedirects;
+ if ( $wgMaxRedirects < 1 ) {
+ // redirects are disabled, so quit early
+ return null;
+ }
+ $redir = MagicWord::get( 'redirect' );
+ $text = trim( $this->getNativeData() );
+ if ( $redir->matchStartAndRemove( $text ) ) {
+ // Extract the first link and see if it's usable
+ // Ensure that it really does come directly after #REDIRECT
+ // Some older redirects included a colon, so don't freak about that!
+ $m = array();
+ if ( preg_match( '!^\s*:?\s*\[{2}(.*?)(?:\|.*?)?\]{2}!', $text, $m ) ) {
+ // Strip preceding colon used to "escape" categories, etc.
+ // and URL-decode links
+ if ( strpos( $m[1], '%' ) !== false ) {
+ // Match behavior of inline link parsing here;
+ $m[1] = rawurldecode( ltrim( $m[1], ':' ) );
+ }
+ $title = Title::newFromText( $m[1] );
+ // If the title is a redirect to bad special pages or is invalid, return null
+ if ( !$title instanceof Title || !$title->isValidRedirectTarget() ) {
+ return null;
+ }
+ return $title;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @see Content::updateRedirect()
+ *
+ * This implementation replaces the first link on the page with the given new target
+ * if this Content object is a redirect. Otherwise, this method returns $this.
+ *
+ * @since 1.21
+ *
+ * @param Title $target
+ *
+ * @return Content a new Content object with the updated redirect (or $this if this Content object isn't a redirect)
+ */
+ public function updateRedirect( Title $target ) {
+ if ( !$this->isRedirect() ) {
+ return $this;
+ }
+
+ # Fix the text
+ # Remember that redirect pages can have categories, templates, etc.,
+ # so the regex has to be fairly general
+ $newText = preg_replace( '/ \[ \[ [^\]]* \] \] /x',
+ '[[' . $target->getFullText() . ']]',
+ $this->getNativeData(), 1 );
+
+ return new WikitextContent( $newText );
+ }
+
+ /**
+ * Returns true if this content is not a redirect, and this content's text
+ * is countable according to the criteria defined by $wgArticleCountMethod.
+ *
+ * @param bool $hasLinks if it is known whether this content contains
+ * links, provide this information here, to avoid redundant parsing to
+ * find out (default: null).
+ * @param $title Title: (default: null)
+ *
+ * @internal param \IContextSource $context context for parsing if necessary
+ *
+ * @return bool True if the content is countable
+ */
+ public function isCountable( $hasLinks = null, Title $title = null ) {
+ global $wgArticleCountMethod;
+
+ if ( $this->isRedirect() ) {
+ return false;
+ }
+
+ $text = $this->getNativeData();
+
+ switch ( $wgArticleCountMethod ) {
+ case 'any':
+ return true;
+ case 'comma':
+ return strpos( $text, ',' ) !== false;
+ case 'link':
+ if ( $hasLinks === null ) { # not known, find out
+ if ( !$title ) {
+ $context = RequestContext::getMain();
+ $title = $context->getTitle();
+ }
+
+ $po = $this->getParserOutput( $title, null, null, false );
+ $links = $po->getLinks();
+ $hasLinks = !empty( $links );
+ }
+
+ return $hasLinks;
+ }
+
+ return false;
+ }
+
+ public function getTextForSummary( $maxlength = 250 ) {
+ $truncatedtext = parent::getTextForSummary( $maxlength );
+
+ # clean up unfinished links
+ # XXX: make this optional? wasn't there in autosummary, but required for
+ # deletion summary.
+ $truncatedtext = preg_replace( '/\[\[([^\]]*)\]?$/', '$1', $truncatedtext );
+
+ return $truncatedtext;
+ }
+
+ /**
+ * Returns a ParserOutput object resulting from parsing the content's text
+ * using $wgParser.
+ *
+ * @since 1.21
+ *
+ * @param $title Title
+ * @param int $revId Revision to pass to the parser (default: null)
+ * @param $options ParserOptions (default: null)
+ * @param bool $generateHtml (default: false)
+ *
+ * @internal param \IContextSource|null $context
+ * @return ParserOutput representing the HTML form of the text
+ */
+ public function getParserOutput( Title $title,
+ $revId = null,
+ ParserOptions $options = null, $generateHtml = true
+ ) {
+ global $wgParser;
+
+ if ( !$options ) {
+ //NOTE: use canonical options per default to produce cacheable output
+ $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
+ }
+
+ $po = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
+ return $po;
+ }
+
+ protected function getHtml() {
+ throw new MWException(
+ "getHtml() not implemented for wikitext. "
+ . "Use getParserOutput()->getText()."
+ );
+ }
+
+ /**
+ * @see Content::matchMagicWord()
+ *
+ * This implementation calls $word->match() on the this TextContent object's text.
+ *
+ * @param MagicWord $word
+ *
+ * @return bool whether this Content object matches the given magic word.
+ */
+ public function matchMagicWord( MagicWord $word ) {
+ return $word->match( $this->getNativeData() );
+ }
+}
diff --git a/includes/content/WikitextContentHandler.php b/includes/content/WikitextContentHandler.php
new file mode 100644
index 00000000..e1dcc668
--- /dev/null
+++ b/includes/content/WikitextContentHandler.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Content handler for wiki text pages.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ */
+
+/**
+ * Content handler for wiki text pages.
+ *
+ * @ingroup Content
+ */
+class WikitextContentHandler extends TextContentHandler {
+
+ public function __construct( $modelId = CONTENT_MODEL_WIKITEXT ) {
+ parent::__construct( $modelId, array( CONTENT_FORMAT_WIKITEXT ) );
+ }
+
+ public function unserializeContent( $text, $format = null ) {
+ $this->checkFormat( $format );
+
+ return new WikitextContent( $text );
+ }
+
+ /**
+ * @see ContentHandler::makeEmptyContent
+ *
+ * @return Content
+ */
+ public function makeEmptyContent() {
+ return new WikitextContent( '' );
+ }
+
+ /**
+ * Returns a WikitextContent object representing a redirect to the given destination page.
+ *
+ * @see ContentHandler::makeRedirectContent
+ *
+ * @param Title $destination the page to redirect to.
+ *
+ * @return Content
+ */
+ public function makeRedirectContent( Title $destination ) {
+ $mwRedir = MagicWord::get( 'redirect' );
+ $redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $destination->getPrefixedText() . ']]';
+
+ return new WikitextContent( $redirectText );
+ }
+
+ /**
+ * Returns true because wikitext supports redirects.
+ *
+ * @see ContentHandler::supportsRedirects
+ *
+ * @return boolean whether redirects are supported.
+ */
+ public function supportsRedirects() {
+ return true;
+ }
+
+ /**
+ * Returns true because wikitext supports sections.
+ *
+ * @return boolean whether sections are supported.
+ */
+ public function supportsSections() {
+ return true;
+ }
+
+ /**
+ * Returns true, because wikitext supports caching using the
+ * ParserCache mechanism.
+ *
+ * @since 1.21
+ * @return bool
+ */
+ public function isParserCacheSupported() {
+ return true;
+ }
+}
diff --git a/includes/context/ContextSource.php b/includes/context/ContextSource.php
index 45bd6fff..33f51cb9 100644
--- a/includes/context/ContextSource.php
+++ b/includes/context/ContextSource.php
@@ -28,7 +28,6 @@
* member variable and provide accessors to it.
*/
abstract class ContextSource implements IContextSource {
-
/**
* @var IContextSource
*/
@@ -42,7 +41,7 @@ abstract class ContextSource implements IContextSource {
public function getContext() {
if ( $this->context === null ) {
$class = get_class( $this );
- wfDebug( __METHOD__ . " ($class): called and \$context is null. Using RequestContext::getMain() for sanity\n" );
+ wfDebug( __METHOD__ . " ($class): called and \$context is null. Using RequestContext::getMain() for sanity\n" );
$this->context = RequestContext::getMain();
}
return $this->context;
@@ -52,7 +51,7 @@ abstract class ContextSource implements IContextSource {
* Set the IContextSource object
*
* @since 1.18
- * @param $context IContextSource
+ * @param IContextSource $context
*/
public function setContext( IContextSource $context ) {
$this->context = $context;
@@ -107,7 +106,7 @@ abstract class ContextSource implements IContextSource {
* Get the OutputPage object
*
* @since 1.18
- * @return OutputPage object
+ * @return OutputPage
*/
public function getOutput() {
return $this->getContext()->getOutput();
@@ -159,12 +158,21 @@ abstract class ContextSource implements IContextSource {
* Parameters are the same as wfMessage()
*
* @since 1.18
- * @return Message object
+ * @return Message
*/
public function msg( /* $args */ ) {
$args = func_get_args();
return call_user_func_array( array( $this->getContext(), 'msg' ), $args );
}
-
-}
+ /**
+ * Export the resolved user IP, HTTP headers, user ID, and session ID.
+ * The result will be reasonably sized to allow for serialization.
+ *
+ * @return Array
+ * @since 1.21
+ */
+ public function exportSession() {
+ return $this->getContext()->exportSession();
+ }
+}
diff --git a/includes/context/DerivativeContext.php b/includes/context/DerivativeContext.php
index 5adf3621..b9a70068 100644
--- a/includes/context/DerivativeContext.php
+++ b/includes/context/DerivativeContext.php
@@ -30,7 +30,6 @@
* a different Title instance set on it.
*/
class DerivativeContext extends ContextSource {
-
/**
* @var WebRequest
*/
@@ -68,7 +67,7 @@ class DerivativeContext extends ContextSource {
/**
* Constructor
- * @param $context IContextSource Context to inherit from
+ * @param IContextSource $context Context to inherit from
*/
public function __construct( IContextSource $context ) {
$this->setContext( $context );
@@ -77,7 +76,7 @@ class DerivativeContext extends ContextSource {
/**
* Set the WebRequest object
*
- * @param $r WebRequest object
+ * @param WebRequest $r
*/
public function setRequest( WebRequest $r ) {
$this->request = $r;
@@ -99,7 +98,7 @@ class DerivativeContext extends ContextSource {
/**
* Set the Title object
*
- * @param $t Title object
+ * @param Title $t
*/
public function setTitle( Title $t ) {
$this->title = $t;
@@ -140,7 +139,7 @@ class DerivativeContext extends ContextSource {
* Set the WikiPage object
*
* @since 1.19
- * @param $p WikiPage object
+ * @param WikiPage $p
*/
public function setWikiPage( WikiPage $p ) {
$this->wikipage = $p;
@@ -166,7 +165,7 @@ class DerivativeContext extends ContextSource {
/**
* Set the OutputPage object
*
- * @param $o OutputPage
+ * @param OutputPage $o
*/
public function setOutput( OutputPage $o ) {
$this->output = $o;
@@ -175,7 +174,7 @@ class DerivativeContext extends ContextSource {
/**
* Get the OutputPage object
*
- * @return OutputPage object
+ * @return OutputPage
*/
public function getOutput() {
if ( !is_null( $this->output ) ) {
@@ -188,7 +187,7 @@ class DerivativeContext extends ContextSource {
/**
* Set the User object
*
- * @param $u User
+ * @param User $u
*/
public function setUser( User $u ) {
$this->user = $u;
@@ -211,7 +210,7 @@ class DerivativeContext extends ContextSource {
* Set the Language object
*
* @deprecated 1.19 Use setLanguage instead
- * @param $l Mixed Language instance or language code
+ * @param Language|string $l Language instance or language code
*/
public function setLang( $l ) {
wfDeprecated( __METHOD__, '1.19' );
@@ -221,7 +220,8 @@ class DerivativeContext extends ContextSource {
/**
* Set the Language object
*
- * @param $l Mixed Language instance or language code
+ * @param Language|string $l Language instance or language code
+ * @throws MWException
* @since 1.19
*/
public function setLanguage( $l ) {
@@ -262,7 +262,7 @@ class DerivativeContext extends ContextSource {
/**
* Set the Skin object
*
- * @param $s Skin
+ * @param Skin $s
*/
public function setSkin( Skin $s ) {
$this->skin = clone $s;
@@ -281,6 +281,4 @@ class DerivativeContext extends ContextSource {
return $this->getContext()->getSkin();
}
}
-
}
-
diff --git a/includes/context/IContextSource.php b/includes/context/IContextSource.php
index 476035b5..c7b221b9 100644
--- a/includes/context/IContextSource.php
+++ b/includes/context/IContextSource.php
@@ -27,7 +27,6 @@
* Interface for objects which can provide a context on request.
*/
interface IContextSource {
-
/**
* Get the WebRequest object
*
@@ -66,7 +65,7 @@ interface IContextSource {
/**
* Get the OutputPage object
*
- * @return OutputPage object
+ * @return OutputPage
*/
public function getOutput();
@@ -103,8 +102,16 @@ interface IContextSource {
/**
* Get a Message object with context set
*
- * @return Message object
+ * @return Message
*/
public function msg();
-}
+ /**
+ * Export the resolved user IP, HTTP headers, user ID, and session ID.
+ * The result will be reasonably sized to allow for serialization.
+ *
+ * @return Array
+ * @since 1.21
+ */
+ public function exportSession();
+}
diff --git a/includes/context/RequestContext.php b/includes/context/RequestContext.php
index 9e7837d9..6aefc98e 100644
--- a/includes/context/RequestContext.php
+++ b/includes/context/RequestContext.php
@@ -28,7 +28,6 @@
* Group all the pieces relevant to the context of a request into one instance
*/
class RequestContext implements IContextSource {
-
/**
* @var WebRequest
*/
@@ -67,7 +66,7 @@ class RequestContext implements IContextSource {
/**
* Set the WebRequest object
*
- * @param $r WebRequest object
+ * @param WebRequest $r
*/
public function setRequest( WebRequest $r ) {
$this->request = $r;
@@ -89,10 +88,12 @@ class RequestContext implements IContextSource {
/**
* Set the Title object
*
- * @param $t Title object
+ * @param Title $t
*/
public function setTitle( Title $t ) {
$this->title = $t;
+ // Erase the WikiPage so a new one with the new title gets created.
+ $this->wikipage = null;
}
/**
@@ -135,9 +136,15 @@ class RequestContext implements IContextSource {
* Set the WikiPage object
*
* @since 1.19
- * @param $p WikiPage object
+ * @param WikiPage $p
*/
public function setWikiPage( WikiPage $p ) {
+ $contextTitle = $this->getTitle();
+ $pageTitle = $p->getTitle();
+ if ( !$contextTitle || !$pageTitle->equals( $contextTitle ) ) {
+ $this->setTitle( $pageTitle );
+ }
+ // Defer this to the end since setTitle sets it to null.
$this->wikipage = $p;
}
@@ -148,6 +155,7 @@ class RequestContext implements IContextSource {
* canUseWikiPage() to check whether this method can be called safely.
*
* @since 1.19
+ * @throws MWException
* @return WikiPage
*/
public function getWikiPage() {
@@ -171,7 +179,7 @@ class RequestContext implements IContextSource {
/**
* Get the OutputPage object
*
- * @return OutputPage object
+ * @return OutputPage
*/
public function getOutput() {
if ( $this->output === null ) {
@@ -183,7 +191,7 @@ class RequestContext implements IContextSource {
/**
* Set the User object
*
- * @param $u User
+ * @param User $u
*/
public function setUser( User $u ) {
$this->user = $u;
@@ -204,7 +212,7 @@ class RequestContext implements IContextSource {
/**
* Accepts a language code and ensures it's sane. Outputs a cleaned up language
* code and replaces with $wgLanguageCode if not sane.
- * @param $code string
+ * @param string $code Language code
* @return string
*/
public static function sanitizeLangCode( $code ) {
@@ -214,7 +222,7 @@ class RequestContext implements IContextSource {
$code = strtolower( $code );
# Validate $code
- if( empty( $code ) || !Language::isValidCode( $code ) || ( $code === 'qqq' ) ) {
+ if ( empty( $code ) || !Language::isValidCode( $code ) || ( $code === 'qqq' ) ) {
wfDebug( "Invalid user language code\n" );
$code = $wgLanguageCode;
}
@@ -226,7 +234,7 @@ class RequestContext implements IContextSource {
* Set the Language object
*
* @deprecated 1.19 Use setLanguage instead
- * @param $l Mixed Language instance or language code
+ * @param Language|string $l Language instance or language code
*/
public function setLang( $l ) {
wfDeprecated( __METHOD__, '1.19' );
@@ -236,7 +244,8 @@ class RequestContext implements IContextSource {
/**
* Set the Language object
*
- * @param $l Mixed Language instance or language code
+ * @param Language|string $l Language instance or language code
+ * @throws MWException
* @since 1.19
*/
public function setLanguage( $l ) {
@@ -289,7 +298,7 @@ class RequestContext implements IContextSource {
wfRunHooks( 'UserGetLanguageObject', array( $user, &$code, $this ) );
- if( $code === $wgLanguageCode ) {
+ if ( $code === $wgLanguageCode ) {
$this->lang = $wgContLang;
} else {
$obj = Language::factory( $code );
@@ -305,7 +314,7 @@ class RequestContext implements IContextSource {
/**
* Set the Skin object
*
- * @param $s Skin
+ * @param Skin $s
*/
public function setSkin( Skin $s ) {
$this->skin = clone $s;
@@ -320,14 +329,14 @@ class RequestContext implements IContextSource {
public function getSkin() {
if ( $this->skin === null ) {
wfProfileIn( __METHOD__ . '-createskin' );
-
+
$skin = null;
wfRunHooks( 'RequestContextCreateSkin', array( $this, &$skin ) );
// If the hook worked try to set a skin from it
if ( $skin instanceof Skin ) {
$this->skin = $skin;
- } elseif ( is_string($skin) ) {
+ } elseif ( is_string( $skin ) ) {
$this->skin = Skin::newFromKey( $skin );
}
@@ -335,7 +344,7 @@ class RequestContext implements IContextSource {
// then go through the normal processing to load a skin
if ( $this->skin === null ) {
global $wgHiddenPrefs;
- if( !in_array( 'skin', $wgHiddenPrefs ) ) {
+ if ( !in_array( 'skin', $wgHiddenPrefs ) ) {
# get the user skin
$userSkin = $this->getUser()->getOption( 'skin' );
$userSkin = $this->getRequest()->getVal( 'useskin', $userSkin );
@@ -361,7 +370,7 @@ class RequestContext implements IContextSource {
* Get a Message object with context set
* Parameters are the same as wfMessage()
*
- * @return Message object
+ * @return Message
*/
public function msg() {
$args = func_get_args();
@@ -373,7 +382,7 @@ class RequestContext implements IContextSource {
/**
* Get the RequestContext object associated with the main request
*
- * @return RequestContext object
+ * @return RequestContext
*/
public static function getMain() {
static $instance = null;
@@ -384,6 +393,96 @@ class RequestContext implements IContextSource {
}
/**
+ * Export the resolved user IP, HTTP headers, user ID, and session ID.
+ * The result will be reasonably sized to allow for serialization.
+ *
+ * @return Array
+ * @since 1.21
+ */
+ public function exportSession() {
+ return array(
+ 'ip' => $this->getRequest()->getIP(),
+ 'headers' => $this->getRequest()->getAllHeaders(),
+ 'sessionId' => session_id(),
+ 'userId' => $this->getUser()->getId()
+ );
+ }
+
+ /**
+ * Import the resolved user IP, HTTP headers, user ID, and session ID.
+ * This sets the current session and sets $wgUser and $wgRequest.
+ * Once the return value falls out of scope, the old context is restored.
+ * This function can only be called within CLI mode scripts.
+ *
+ * This will setup the session from the given ID. This is useful when
+ * background scripts inherit context when acting on behalf of a user.
+ *
+ * $param array $params Result of RequestContext::exportSession()
+ * @return ScopedCallback
+ * @throws MWException
+ * @since 1.21
+ */
+ public static function importScopedSession( array $params ) {
+ if ( PHP_SAPI !== 'cli' ) {
+ // Don't send random private cookies or turn $wgRequest into FauxRequest
+ throw new MWException( "Sessions can only be imported in cli mode." );
+ } elseif ( !strlen( $params['sessionId'] ) ) {
+ throw new MWException( "No session ID was specified." );
+ }
+
+ if ( $params['userId'] ) { // logged-in user
+ $user = User::newFromId( $params['userId'] );
+ if ( !$user ) {
+ throw new MWException( "No user with ID '{$params['userId']}'." );
+ }
+ } elseif ( !IP::isValid( $params['ip'] ) ) {
+ throw new MWException( "Could not load user '{$params['ip']}'." );
+ } else { // anon user
+ $user = User::newFromName( $params['ip'], false );
+ }
+
+ $importSessionFunction = function( User $user, array $params ) {
+ global $wgRequest, $wgUser;
+
+ $context = RequestContext::getMain();
+ // Commit and close any current session
+ session_write_close(); // persist
+ session_id( '' ); // detach
+ $_SESSION = array(); // clear in-memory array
+ // Remove any user IP or agent information
+ $context->setRequest( new FauxRequest() );
+ $wgRequest = $context->getRequest(); // b/c
+ // Now that all private information is detached from the user, it should
+ // be safe to load the new user. If errors occur or an exception is thrown
+ // and caught (leaving the main context in a mixed state), there is no risk
+ // of the User object being attached to the wrong IP, headers, or session.
+ $context->setUser( $user );
+ $wgUser = $context->getUser(); // b/c
+ if ( strlen( $params['sessionId'] ) ) { // don't make a new random ID
+ wfSetupSession( $params['sessionId'] ); // sets $_SESSION
+ }
+ $request = new FauxRequest( array(), false, $_SESSION );
+ $request->setIP( $params['ip'] );
+ foreach ( $params['headers'] as $name => $value ) {
+ $request->setHeader( $name, $value );
+ }
+ // Set the current context to use the new WebRequest
+ $context->setRequest( $request );
+ $wgRequest = $context->getRequest(); // b/c
+ };
+
+ // Stash the old session and load in the new one
+ $oUser = self::getMain()->getUser();
+ $oParams = self::getMain()->exportSession();
+ $importSessionFunction( $user, $params );
+
+ // Set callback to save and close the new session and reload the old one
+ return new ScopedCallback( function() use ( $importSessionFunction, $oUser, $oParams ) {
+ $importSessionFunction( $oUser, $oParams );
+ } );
+ }
+
+ /**
* Create a new extraneous context. The context is filled with information
* external to the current session.
* - Title is specified by argument
@@ -397,7 +496,7 @@ class RequestContext implements IContextSource {
* @param WebRequest|array $request A WebRequest or data to use for a FauxRequest
* @return RequestContext
*/
- public static function newExtraneousContext( Title $title, $request=array() ) {
+ public static function newExtraneousContext( Title $title, $request = array() ) {
$context = new self;
$context->setTitle( $title );
if ( $request instanceof WebRequest ) {
@@ -408,6 +507,4 @@ class RequestContext implements IContextSource {
$context->user = User::newFromName( '127.0.0.1', false );
return $context;
}
-
}
-
diff --git a/includes/dao/DBAccessBase.php b/includes/dao/DBAccessBase.php
new file mode 100644
index 00000000..6c009dee
--- /dev/null
+++ b/includes/dao/DBAccessBase.php
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * Base class for objects that allow access to other wiki's databases using
+ * the foreign database access mechanism implemented by LBFactory_multi.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Database
+ *
+ * @licence GNU GPL v2+
+ * @author Daniel Kinzler
+ */
+abstract class DBAccessBase implements IDBAccessObject {
+
+ /**
+ * @var String|bool $wiki The target wiki's name. This must be an ID
+ * that LBFactory can understand.
+ */
+ protected $wiki = false;
+
+ /**
+ * @param string|bool $wiki The target wiki's name. This must be an ID
+ * that LBFactory can understand.
+ */
+ public function __construct( $wiki = false ) {
+ $this->wiki = $wiki;
+ }
+
+ /**
+ * Returns a database connection.
+ *
+ * @see wfGetDB()
+ * @see LoadBalancer::getConnection()
+ *
+ * @since 1.21
+ *
+ * @param int $id Which connection to use
+ * @param array $groups Query groups
+ *
+ * @return DatabaseBase
+ */
+ protected function getConnection( $id, $groups = array() ) {
+ $loadBalancer = wfGetLB( $this->wiki );
+ return $loadBalancer->getConnection( $id, $groups, $this->wiki );
+ }
+
+ /**
+ * Releases a database connection and makes it available for recycling.
+ *
+ * @see LoadBalancer::reuseConnection()
+ *
+ * @since 1.21
+ *
+ * @param DatabaseBase $db the database connection to release.
+ */
+ protected function releaseConnection( DatabaseBase $db ) {
+ if ( $this->wiki !== false ) {
+ $loadBalancer = $this->getLoadBalancer();
+ $loadBalancer->reuseConnection( $db );
+ }
+ }
+
+ /**
+ * Get the database type used for read operations.
+ *
+ * @see wfGetLB
+ *
+ * @since 1.21
+ *
+ * @return LoadBalancer The database load balancer object
+ */
+ public function getLoadBalancer() {
+ return wfGetLB( $this->wiki );
+ }
+}
diff --git a/includes/dao/IDBAccessObject.php b/includes/dao/IDBAccessObject.php
index e30522a5..4eb6ff3e 100644
--- a/includes/dao/IDBAccessObject.php
+++ b/includes/dao/IDBAccessObject.php
@@ -41,10 +41,12 @@
* - b) Determine the new row (expensive, so we don't want to hold locks now)
* - c) Re-read the current row with READ_LOCKING; if it changed then bail out
* - d) otherwise, do the updates
+ *
+ * @since 1.20
*/
interface IDBAccessObject {
// Constants for object loading bitfield flags (higher => higher QoS)
- const READ_LATEST = 1; // read from the master
+ const READ_LATEST = 1; // read from the master
const READ_LOCKING = 3; // READ_LATEST and "FOR UPDATE"
// Convenience constant for callers to explicitly request slave data
diff --git a/includes/db/CloneDatabase.php b/includes/db/CloneDatabase.php
index 4e43642f..4e443741 100644
--- a/includes/db/CloneDatabase.php
+++ b/includes/db/CloneDatabase.php
@@ -60,9 +60,9 @@ class CloneDatabase {
* Constructor
*
* @param $db DatabaseBase A database subclass
- * @param $tablesToClone Array An array of tables to clone, unprefixed
- * @param $newTablePrefix String Prefix to assign to the tables
- * @param $oldTablePrefix String Prefix on current tables, if not $wgDBprefix
+ * @param array $tablesToClone An array of tables to clone, unprefixed
+ * @param string $newTablePrefix Prefix to assign to the tables
+ * @param string $oldTablePrefix Prefix on current tables, if not $wgDBprefix
* @param $dropCurrentTables bool
*/
public function __construct( DatabaseBase $db, array $tablesToClone,
@@ -77,7 +77,7 @@ class CloneDatabase {
/**
* Set whether to use temporary tables or not
- * @param $u Bool Use temporary tables when cloning the structure
+ * @param bool $u Use temporary tables when cloning the structure
*/
public function useTemporaryTables( $u = true ) {
$this->useTemporaryTables = $u;
@@ -87,35 +87,32 @@ class CloneDatabase {
* Clone the table structure
*/
public function cloneTableStructure() {
-
foreach( $this->tablesToClone as $tbl ) {
# Clean up from previous aborted run. So that table escaping
# works correctly across DB engines, we need to change the pre-
# fix back and forth so tableName() works right.
-
+
self::changePrefix( $this->oldTablePrefix );
$oldTableName = $this->db->tableName( $tbl, 'raw' );
-
+
self::changePrefix( $this->newTablePrefix );
$newTableName = $this->db->tableName( $tbl, 'raw' );
-
+
if( $this->dropCurrentTables && !in_array( $this->db->getType(), array( 'postgres', 'oracle' ) ) ) {
$this->db->dropTable( $tbl, __METHOD__ );
- wfDebug( __METHOD__." dropping {$newTableName}\n", true);
+ wfDebug( __METHOD__ . " dropping {$newTableName}\n", true );
//Dropping the oldTable because the prefix was changed
}
# Create new table
- wfDebug( __METHOD__." duplicating $oldTableName to $newTableName\n", true );
+ wfDebug( __METHOD__ . " duplicating $oldTableName to $newTableName\n", true );
$this->db->duplicateTableStructure( $oldTableName, $newTableName, $this->useTemporaryTables );
-
}
-
}
/**
* Change the prefix back to the original.
- * @param $dropTables bool Optionally drop the tables we created
+ * @param bool $dropTables Optionally drop the tables we created
*/
public function destroy( $dropTables = false ) {
if( $dropTables ) {
diff --git a/includes/db/Database.php b/includes/db/Database.php
index 5f10b97d..65a74abf 100644
--- a/includes/db/Database.php
+++ b/includes/db/Database.php
@@ -49,10 +49,10 @@ interface DatabaseType {
/**
* Open a connection to the database. Usually aborts on failure
*
- * @param $server String: database server host
- * @param $user String: database user name
- * @param $password String: database user password
- * @param $dbName String: database name
+ * @param string $server database server host
+ * @param string $user database user name
+ * @param string $password database user password
+ * @param string $dbName database name
* @return bool
* @throws DBConnectionError
*/
@@ -62,9 +62,10 @@ interface DatabaseType {
* Fetch the next row from the given result object, in object form.
* Fields can be retrieved with $row->fieldname, with fields acting like
* member variables.
+ * If no more rows are available, false is returned.
*
* @param $res ResultWrapper|object as returned from DatabaseBase::query(), etc.
- * @return Row object
+ * @return object|bool
* @throws DBUnexpectedError Thrown if the database returns an error
*/
function fetchObject( $res );
@@ -72,9 +73,10 @@ interface DatabaseType {
/**
* Fetch the next row from the given result object, in associative array
* form. Fields are retrieved with $row['fieldname'].
+ * If no more rows are available, false is returned.
*
* @param $res ResultWrapper result object as returned from DatabaseBase::query(), etc.
- * @return Row object
+ * @return array|bool
* @throws DBUnexpectedError Thrown if the database returns an error
*/
function fetchRow( $res );
@@ -112,8 +114,8 @@ interface DatabaseType {
* The value inserted should be fetched from nextSequenceValue()
*
* Example:
- * $id = $dbw->nextSequenceValue('page_page_id_seq');
- * $dbw->insert('page',array('page_id' => $id));
+ * $id = $dbw->nextSequenceValue( 'page_page_id_seq' );
+ * $dbw->insert( 'page', array( 'page_id' => $id ) );
* $id = $dbw->insertId();
*
* @return int
@@ -149,8 +151,8 @@ interface DatabaseType {
* mysql_fetch_field() wrapper
* Returns false if the field doesn't exist
*
- * @param $table string: table name
- * @param $field string: field name
+ * @param string $table table name
+ * @param string $field field name
*
* @return Field
*/
@@ -158,9 +160,9 @@ interface DatabaseType {
/**
* Get information about an index into an object
- * @param $table string: Table name
- * @param $index string: Index name
- * @param $fname string: Calling function name
+ * @param string $table Table name
+ * @param string $index Index name
+ * @param string $fname Calling function name
* @return Mixed: Database-specific index description class or false if the index does not exist
*/
function indexInfo( $table, $index, $fname = 'Database::indexInfo' );
@@ -176,7 +178,7 @@ interface DatabaseType {
/**
* Wrapper for addslashes()
*
- * @param $s string: to be slashed.
+ * @param string $s to be slashed.
* @return string: slashed string.
*/
function strencode( $s );
@@ -249,6 +251,37 @@ abstract class DatabaseBase implements DatabaseType {
protected $delimiter = ';';
+ /**
+ * Remembers the function name given for starting the most recent transaction via begin().
+ * Used to provide additional context for error reporting.
+ *
+ * @var String
+ * @see DatabaseBase::mTrxLevel
+ */
+ private $mTrxFname = null;
+
+ /**
+ * Record if possible write queries were done in the last transaction started
+ *
+ * @var Bool
+ * @see DatabaseBase::mTrxLevel
+ */
+ private $mTrxDoneWrites = false;
+
+ /**
+ * Record if the current transaction was started implicitly due to DBO_TRX being set.
+ *
+ * @var Bool
+ * @see DatabaseBase::mTrxLevel
+ */
+ private $mTrxAutomatic = false;
+
+ /**
+ * @since 1.21
+ * @var file handle for upgrade
+ */
+ protected $fileHandle = null;
+
# ------------------------------------------------------------------------------
# Accessors
# ------------------------------------------------------------------------------
@@ -266,6 +299,13 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
+ * @return string: command delimiter used by this database engine
+ */
+ public function getDelimiter() {
+ return $this->delimiter;
+ }
+
+ /**
* Boolean, controls output of large amounts of debug information.
* @param $debug bool|null
* - true to enable debugging
@@ -329,7 +369,7 @@ abstract class DatabaseBase implements DatabaseType {
* Historically, transactions were allowed to be "nested". This is no
* longer supported, so this function really only returns a boolean.
*
- * @param $level int An integer (0 or 1), or omitted to leave it unchanged.
+ * @param int $level An integer (0 or 1), or omitted to leave it unchanged.
* @return int The previous value
*/
public function trxLevel( $level = null ) {
@@ -338,7 +378,7 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Get/set the number of errors logged. Only useful when errors are ignored
- * @param $count int The count to set, or omitted to leave it unchanged.
+ * @param int $count The count to set, or omitted to leave it unchanged.
* @return int The error count
*/
public function errorCount( $count = null ) {
@@ -347,7 +387,7 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Get/set the table prefix.
- * @param $prefix string The table prefix to set, or omitted to leave it unchanged.
+ * @param string $prefix The table prefix to set, or omitted to leave it unchanged.
* @return string The previous table prefix.
*/
public function tablePrefix( $prefix = null ) {
@@ -355,10 +395,19 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
+ * Set the filehandle to copy write statements to.
+ *
+ * @param $fh filehandle
+ */
+ public function setFileHandle( $fh ) {
+ $this->fileHandle = $fh;
+ }
+
+ /**
* Get properties passed down from the server info array of the load
* balancer.
*
- * @param $name string The entry of the info array to get, or null to get the
+ * @param string $name The entry of the info array to get, or null to get the
* whole array
*
* @return LoadBalancer|null
@@ -441,7 +490,7 @@ abstract class DatabaseBase implements DatabaseType {
* Returns true if this database uses timestamps rather than integers
*
* @return bool
- */
+ */
public function realTimestamps() {
return false;
}
@@ -509,7 +558,7 @@ abstract class DatabaseBase implements DatabaseType {
* @return bool
*/
public function writesOrCallbacksPending() {
- return $this->mTrxLevel && ( $this->mDoneWrites || $this->mTrxIdleCallbacks );
+ return $this->mTrxLevel && ( $this->mTrxDoneWrites || $this->mTrxIdleCallbacks );
}
/**
@@ -536,7 +585,7 @@ abstract class DatabaseBase implements DatabaseType {
global $wgDebugDBTransactions;
$this->mFlags |= $flag;
if ( ( $flag & DBO_TRX) & $wgDebugDBTransactions ) {
- wfDebug("Implicit transactions are now disabled.\n");
+ wfDebug( "Implicit transactions are now disabled.\n" );
}
}
@@ -549,7 +598,7 @@ abstract class DatabaseBase implements DatabaseType {
global $wgDebugDBTransactions;
$this->mFlags &= ~$flag;
if ( ( $flag & DBO_TRX ) && $wgDebugDBTransactions ) {
- wfDebug("Implicit transactions are now disabled.\n");
+ wfDebug( "Implicit transactions are now disabled.\n" );
}
}
@@ -605,12 +654,12 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Constructor.
- * @param $server String: database server host
- * @param $user String: database user name
- * @param $password String: database user password
- * @param $dbName String: database name
+ * @param string $server database server host
+ * @param string $user database user name
+ * @param string $password database user password
+ * @param string $dbName database name
* @param $flags
- * @param $tablePrefix String: database table prefixes. By default use the prefix gave in LocalSettings.php
+ * @param string $tablePrefix database table prefixes. By default use the prefix gave in LocalSettings.php
*/
function __construct( $server = false, $user = false, $password = false, $dbName = false,
$flags = 0, $tablePrefix = 'get from global'
@@ -623,12 +672,12 @@ abstract class DatabaseBase implements DatabaseType {
if ( $wgCommandLineMode ) {
$this->mFlags &= ~DBO_TRX;
if ( $wgDebugDBTransactions ) {
- wfDebug("Implicit transaction open disabled.\n");
+ wfDebug( "Implicit transaction open disabled.\n" );
}
} else {
$this->mFlags |= DBO_TRX;
if ( $wgDebugDBTransactions ) {
- wfDebug("Implicit transaction open enabled.\n");
+ wfDebug( "Implicit transaction open enabled.\n" );
}
}
}
@@ -671,14 +720,14 @@ abstract class DatabaseBase implements DatabaseType {
*
* @since 1.18
*
- * @param $dbType String A possible DB type
- * @param $p Array An array of options to pass to the constructor.
+ * @param string $dbType A possible DB type
+ * @param array $p An array of options to pass to the constructor.
* Valid options are: host, user, password, dbname, flags, tablePrefix
* @return DatabaseBase subclass or null
*/
- public final static function factory( $dbType, $p = array() ) {
+ final public static function factory( $dbType, $p = array() ) {
$canonicalDBTypes = array(
- 'mysql', 'postgres', 'sqlite', 'oracle', 'mssql', 'ibm_db2'
+ 'mysql', 'postgres', 'sqlite', 'oracle', 'mssql'
);
$dbType = strtolower( $dbType );
$class = 'Database' . ucfirst( $dbType );
@@ -724,7 +773,7 @@ abstract class DatabaseBase implements DatabaseType {
* @param $errno
* @param $errstr
*/
- protected function connectionErrorHandler( $errno, $errstr ) {
+ protected function connectionErrorHandler( $errno, $errstr ) {
$this->mPHPError = $errstr;
}
@@ -732,6 +781,7 @@ abstract class DatabaseBase implements DatabaseType {
* Closes a database connection.
* if it is open : commits any open transactions
*
+ * @throws MWException
* @return Bool operation success. true if already closed.
*/
public function close() {
@@ -741,8 +791,14 @@ abstract class DatabaseBase implements DatabaseType {
$this->mOpened = false;
if ( $this->mConn ) {
if ( $this->trxLevel() ) {
- $this->commit( __METHOD__ );
+ if ( !$this->mTrxAutomatic ) {
+ wfWarn( "Transaction still in progress (from {$this->mTrxFname}), " .
+ " performing implicit commit before closing connection!" );
+ }
+
+ $this->commit( __METHOD__, 'flush' );
}
+
$ret = $this->closeConnection();
$this->mConn = false;
return $ret;
@@ -756,10 +812,11 @@ abstract class DatabaseBase implements DatabaseType {
* @since 1.20
* @return bool: Whether connection was closed successfully
*/
- protected abstract function closeConnection();
+ abstract protected function closeConnection();
/**
- * @param $error String: fallback error message, used if none is given by DB
+ * @param string $error fallback error message, used if none is given by DB
+ * @throws DBConnectionError
*/
function reportConnectionError( $error = 'Unknown error' ) {
$myError = $this->lastError();
@@ -777,7 +834,7 @@ abstract class DatabaseBase implements DatabaseType {
* @param $sql String: SQL query.
* @return ResultWrapper Result object to feed to fetchObject, fetchRow, ...; or false on failure
*/
- protected abstract function doQuery( $sql );
+ abstract protected function doQuery( $sql );
/**
* Determine whether a query writes to the DB.
@@ -809,9 +866,9 @@ abstract class DatabaseBase implements DatabaseType {
* comment (you can use __METHOD__ or add some extra info)
* @param $tempIgnore Boolean: Whether to avoid throwing an exception on errors...
* maybe best to catch the exception instead?
+ * @throws MWException
* @return boolean|ResultWrapper. true for a successful write query, ResultWrapper object
* for a successful read query, or false on failure if $tempIgnore set
- * @throws DBQueryError Thrown when the database returns an error of any kind
*/
public function query( $sql, $fname = '', $tempIgnore = false ) {
$isMaster = !is_null( $this->getLBInfo( 'master' ) );
@@ -849,24 +906,34 @@ abstract class DatabaseBase implements DatabaseType {
} else {
$userName = '';
}
- $commentedSql = preg_replace( '/\s/', " /* $fname $userName */ ", $sql, 1 );
+
+ // Add trace comment to the begin of the sql string, right after the operator.
+ // Or, for one-word queries (like "BEGIN" or COMMIT") add it to the end (bug 42598)
+ $commentedSql = preg_replace( '/\s|$/', " /* $fname $userName */ ", $sql, 1 );
# If DBO_TRX is set, start a transaction
- if ( ( $this->mFlags & DBO_TRX ) && !$this->trxLevel() &&
- $sql != 'BEGIN' && $sql != 'COMMIT' && $sql != 'ROLLBACK' ) {
- # avoid establishing transactions for SHOW and SET statements too -
+ if ( ( $this->mFlags & DBO_TRX ) && !$this->mTrxLevel &&
+ $sql != 'BEGIN' && $sql != 'COMMIT' && $sql != 'ROLLBACK' )
+ {
+ # Avoid establishing transactions for SHOW and SET statements too -
# that would delay transaction initializations to once connection
# is really used by application
$sqlstart = substr( $sql, 0, 10 ); // very much worth it, benchmark certified(tm)
if ( strpos( $sqlstart, "SHOW " ) !== 0 && strpos( $sqlstart, "SET " ) !== 0 ) {
global $wgDebugDBTransactions;
if ( $wgDebugDBTransactions ) {
- wfDebug("Implicit transaction start.\n");
+ wfDebug( "Implicit transaction start.\n" );
}
$this->begin( __METHOD__ . " ($fname)" );
+ $this->mTrxAutomatic = true;
}
}
+ # Keep track of whether the transaction has write queries pending
+ if ( $this->mTrxLevel && !$this->mTrxDoneWrites && $this->isWriteQuery( $sql ) ) {
+ $this->mTrxDoneWrites = true;
+ }
+
if ( $this->debug() ) {
static $cnt = 0;
@@ -933,6 +1000,7 @@ abstract class DatabaseBase implements DatabaseType {
* @param $sql String
* @param $fname String
* @param $tempIgnore Boolean
+ * @throws DBQueryError
*/
public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
# Ignore errors during error handling to avoid infinite recursion
@@ -981,7 +1049,7 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Execute a prepared query with the various arguments
- * @param $prepared String: the prepared sql
+ * @param string $prepared the prepared sql
* @param $args Mixed: Either an array here, or put scalars as varargs
*
* @return ResultWrapper
@@ -1001,8 +1069,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* For faking prepared SQL statements on DBs that don't support it directly.
*
- * @param $preparedQuery String: a 'preparable' SQL statement
- * @param $args Array of arguments to fill it with
+ * @param string $preparedQuery a 'preparable' SQL statement
+ * @param array $args of arguments to fill it with
* @return string executable SQL
*/
public function fillPrepared( $preparedQuery, $args ) {
@@ -1019,6 +1087,7 @@ abstract class DatabaseBase implements DatabaseType {
* while we're doing this.
*
* @param $matches Array
+ * @throws DBUnexpectedError
* @return String
*/
protected function fillPreparedArg( $matches ) {
@@ -1028,7 +1097,7 @@ abstract class DatabaseBase implements DatabaseType {
case '\\&': return '&';
}
- list( /* $n */ , $arg ) = each( $this->preparedArgs );
+ list( /* $n */, $arg ) = each( $this->preparedArgs );
switch( $matches[1] ) {
case '?': return $this->addQuotes( $arg );
@@ -1058,12 +1127,12 @@ abstract class DatabaseBase implements DatabaseType {
*
* If no result rows are returned from the query, false is returned.
*
- * @param $table string|array Table name. See DatabaseBase::select() for details.
- * @param $var string The field name to select. This must be a valid SQL
+ * @param string|array $table Table name. See DatabaseBase::select() for details.
+ * @param string $var The field name to select. This must be a valid SQL
* fragment: do not use unvalidated user input.
- * @param $cond string|array The condition array. See DatabaseBase::select() for details.
- * @param $fname string The function name of the caller.
- * @param $options string|array The query options. See DatabaseBase::select() for details.
+ * @param string|array $cond The condition array. See DatabaseBase::select() for details.
+ * @param string $fname The function name of the caller.
+ * @param string|array $options The query options. See DatabaseBase::select() for details.
*
* @return bool|mixed The value from the field, or false on failure.
*/
@@ -1095,7 +1164,7 @@ abstract class DatabaseBase implements DatabaseType {
* Returns an optional USE INDEX clause to go after the table, and a
* string to go at the end of the query.
*
- * @param $options Array: associative array of options to be turned into
+ * @param array $options associative array of options to be turned into
* an SQL query, valid keys are listed in the function.
* @return Array
* @see DatabaseBase::select()
@@ -1112,26 +1181,9 @@ abstract class DatabaseBase implements DatabaseType {
}
}
- if ( isset( $options['GROUP BY'] ) ) {
- $gb = is_array( $options['GROUP BY'] )
- ? implode( ',', $options['GROUP BY'] )
- : $options['GROUP BY'];
- $preLimitTail .= " GROUP BY {$gb}";
- }
+ $preLimitTail .= $this->makeGroupByWithHaving( $options );
- if ( isset( $options['HAVING'] ) ) {
- $having = is_array( $options['HAVING'] )
- ? $this->makeList( $options['HAVING'], LIST_AND )
- : $options['HAVING'];
- $preLimitTail .= " HAVING {$having}";
- }
-
- if ( isset( $options['ORDER BY'] ) ) {
- $ob = is_array( $options['ORDER BY'] )
- ? implode( ',', $options['ORDER BY'] )
- : $options['ORDER BY'];
- $preLimitTail .= " ORDER BY {$ob}";
- }
+ $preLimitTail .= $this->makeOrderBy( $options );
// if (isset($options['LIMIT'])) {
// $tailOpts .= $this->limitResult('', $options['LIMIT'],
@@ -1194,14 +1246,57 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
+ * Returns an optional GROUP BY with an optional HAVING
+ *
+ * @param array $options associative array of options
+ * @return string
+ * @see DatabaseBase::select()
+ * @since 1.21
+ */
+ public function makeGroupByWithHaving( $options ) {
+ $sql = '';
+ if ( isset( $options['GROUP BY'] ) ) {
+ $gb = is_array( $options['GROUP BY'] )
+ ? implode( ',', $options['GROUP BY'] )
+ : $options['GROUP BY'];
+ $sql .= ' GROUP BY ' . $gb;
+ }
+ if ( isset( $options['HAVING'] ) ) {
+ $having = is_array( $options['HAVING'] )
+ ? $this->makeList( $options['HAVING'], LIST_AND )
+ : $options['HAVING'];
+ $sql .= ' HAVING ' . $having;
+ }
+ return $sql;
+ }
+
+ /**
+ * Returns an optional ORDER BY
+ *
+ * @param array $options associative array of options
+ * @return string
+ * @see DatabaseBase::select()
+ * @since 1.21
+ */
+ public function makeOrderBy( $options ) {
+ if ( isset( $options['ORDER BY'] ) ) {
+ $ob = is_array( $options['ORDER BY'] )
+ ? implode( ',', $options['ORDER BY'] )
+ : $options['ORDER BY'];
+ return ' ORDER BY ' . $ob;
+ }
+ return '';
+ }
+
+ /**
* Execute a SELECT query constructed using the various parameters provided.
* See below for full details of the parameters.
*
- * @param $table String|Array Table name
- * @param $vars String|Array Field names
- * @param $conds String|Array Conditions
- * @param $fname String Caller function name
- * @param $options Array Query options
+ * @param string|array $table Table name
+ * @param string|array $vars Field names
+ * @param string|array $conds Conditions
+ * @param string $fname Caller function name
+ * @param array $options Query options
* @param $join_conds Array Join conditions
*
* @param $table string|array
@@ -1325,7 +1420,7 @@ abstract class DatabaseBase implements DatabaseType {
* join, the second is an SQL fragment giving the join condition for that
* table. For example:
*
- * array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
+ * array( 'page' => array( 'LEFT JOIN', 'page_latest=rev_id' ) )
*
* @return ResultWrapper. If the query returned no rows, a ResultWrapper
* with no rows in it will be returned. If there was a query error, a
@@ -1345,11 +1440,11 @@ abstract class DatabaseBase implements DatabaseType {
* doing UNION queries, where the SQL text of each query is needed. In general,
* however, callers outside of Database classes should just use select().
*
- * @param $table string|array Table name
- * @param $vars string|array Field names
- * @param $conds string|array Conditions
- * @param $fname string Caller function name
- * @param $options string|array Query options
+ * @param string|array $table Table name
+ * @param string|array $vars Field names
+ * @param string|array $conds Conditions
+ * @param string $fname Caller function name
+ * @param string|array $options Query options
* @param $join_conds string|array Join conditions
*
* @return string SQL query string.
@@ -1413,11 +1508,11 @@ abstract class DatabaseBase implements DatabaseType {
* that a single row object is returned. If the query returns no rows,
* false is returned.
*
- * @param $table string|array Table name
- * @param $vars string|array Field names
- * @param $conds array Conditions
- * @param $fname string Caller function name
- * @param $options string|array Query options
+ * @param string|array $table Table name
+ * @param string|array $vars Field names
+ * @param array $conds Conditions
+ * @param string $fname Caller function name
+ * @param string|array $options Query options
* @param $join_conds array|string Join conditions
*
* @return object|bool
@@ -1455,11 +1550,11 @@ abstract class DatabaseBase implements DatabaseType {
*
* Takes the same arguments as DatabaseBase::select().
*
- * @param $table String: table name
- * @param Array|string $vars : unused
- * @param Array|string $conds : filters on the table
- * @param $fname String: function name for profiling
- * @param $options Array: options for select
+ * @param string $table table name
+ * @param array|string $vars : unused
+ * @param array|string $conds : filters on the table
+ * @param string $fname function name for profiling
+ * @param array $options options for select
* @return Integer: row count
*/
public function estimateRowCount( $table, $vars = '*', $conds = '',
@@ -1480,7 +1575,7 @@ abstract class DatabaseBase implements DatabaseType {
* Removes most variables from an SQL query and replaces them with X or N for numbers.
* It's only slightly flawed. Don't use for anything important.
*
- * @param $sql String A SQL Query
+ * @param string $sql A SQL Query
*
* @return string
*/
@@ -1507,9 +1602,9 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Determines whether a field exists in a table
*
- * @param $table String: table name
- * @param $field String: filed to check on that table
- * @param $fname String: calling function name (optional)
+ * @param string $table table name
+ * @param string $field filed to check on that table
+ * @param string $fname calling function name (optional)
* @return Boolean: whether $table has filed $field
*/
public function fieldExists( $table, $field, $fname = 'DatabaseBase::fieldExists' ) {
@@ -1530,6 +1625,10 @@ abstract class DatabaseBase implements DatabaseType {
* @return bool|null
*/
public function indexExists( $table, $index, $fname = 'DatabaseBase::indexExists' ) {
+ if( !$this->tableExists( $table ) ) {
+ return null;
+ }
+
$info = $this->indexInfo( $table, $index, $fname );
if ( is_null( $info ) ) {
return null;
@@ -1626,7 +1725,7 @@ abstract class DatabaseBase implements DatabaseType {
* DatabaseBase::tableName().
* @param $a Array of rows to insert
* @param $fname String Calling function name (use __METHOD__) for logs/profiling
- * @param $options Array of options
+ * @param array $options of options
*
* @return bool
*/
@@ -1642,6 +1741,10 @@ abstract class DatabaseBase implements DatabaseType {
$options = array( $options );
}
+ $fh = null;
+ if ( isset( $options['fileHandle'] ) ) {
+ $fh = $options['fileHandle'];
+ }
$options = $this->makeInsertOptions( $options );
if ( isset( $a[0] ) && is_array( $a[0] ) ) {
@@ -1669,13 +1772,19 @@ abstract class DatabaseBase implements DatabaseType {
$sql .= '(' . $this->makeList( $a ) . ')';
}
+ if ( $fh !== null && false === fwrite( $fh, $sql ) ) {
+ return false;
+ } elseif ( $fh !== null ) {
+ return true;
+ }
+
return (bool)$this->query( $sql, $fname );
}
/**
* Make UPDATE options for the DatabaseBase::update function
*
- * @param $options Array: The options passed to DatabaseBase::update
+ * @param array $options The options passed to DatabaseBase::update
* @return string
*/
protected function makeUpdateOptions( $options ) {
@@ -1702,7 +1811,7 @@ abstract class DatabaseBase implements DatabaseType {
* @param $table String name of the table to UPDATE. This will be passed through
* DatabaseBase::tableName().
*
- * @param $values Array: An array of values to SET. For each array element,
+ * @param array $values An array of values to SET. For each array element,
* the key gives the field name, and the value gives the data
* to set that field to. The data will be quoted by
* DatabaseBase::addQuotes().
@@ -1714,7 +1823,7 @@ abstract class DatabaseBase implements DatabaseType {
* @param $fname String: The function name of the caller (from __METHOD__),
* for logging and profiling.
*
- * @param $options Array: An array of UPDATE options, can be:
+ * @param array $options An array of UPDATE options, can be:
* - IGNORE: Ignore unique key conflicts
* - LOW_PRIORITY: MySQL-specific, see MySQL manual.
* @return Boolean
@@ -1733,8 +1842,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Makes an encoded list of strings from an array
- * @param $a Array containing the data
- * @param $mode int Constant
+ * @param array $a containing the data
+ * @param int $mode Constant
* - LIST_COMMA: comma separated, no field names
* - LIST_AND: ANDed WHERE clause (without the WHERE). See
* the documentation for $conds in DatabaseBase::select().
@@ -1742,6 +1851,7 @@ abstract class DatabaseBase implements DatabaseType {
* - LIST_SET: comma separated with field names, like a SET clause
* - LIST_NAMES: comma separated field names
*
+ * @throws MWException|DBUnexpectedError
* @return string
*/
public function makeList( $a, $mode = LIST_COMMA ) {
@@ -1771,7 +1881,7 @@ abstract class DatabaseBase implements DatabaseType {
$list .= "$value";
} elseif ( ( $mode == LIST_AND || $mode == LIST_OR ) && is_array( $value ) ) {
if ( count( $value ) == 0 ) {
- throw new MWException( __METHOD__ . ': empty input' );
+ throw new MWException( __METHOD__ . ": empty input for field $field" );
} elseif ( count( $value ) == 1 ) {
// Special-case single values, as IN isn't terribly efficient
// Don't necessarily assume the single key is 0; we don't
@@ -1803,10 +1913,10 @@ abstract class DatabaseBase implements DatabaseType {
* Build a partial where clause from a 2-d array such as used for LinkBatch.
* The keys on each level may be either integers or strings.
*
- * @param $data Array: organized as 2-d
+ * @param array $data organized as 2-d
* array(baseKeyVal => array(subKeyVal => [ignored], ...), ...)
- * @param $baseKey String: field name to match the base-level keys to (eg 'pl_namespace')
- * @param $subKey String: field name to match the sub-level keys to (eg 'pl_title')
+ * @param string $baseKey field name to match the base-level keys to (eg 'pl_namespace')
+ * @param string $subKey field name to match the sub-level keys to (eg 'pl_title')
* @return Mixed: string SQL fragment, or false if no items in array.
*/
public function makeWhereFrom2d( $data, $baseKey, $subKey ) {
@@ -1868,7 +1978,7 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Build a concatenation list to feed into a SQL query
- * @param $stringList Array: list of raw SQL expressions; caller is responsible for any quoting
+ * @param array $stringList list of raw SQL expressions; caller is responsible for any quoting
* @return String
*/
public function buildConcat( $stringList ) {
@@ -1916,8 +2026,8 @@ abstract class DatabaseBase implements DatabaseType {
* themselves. Pass the canonical name to such functions. This is only needed
* when calling query() directly.
*
- * @param $name String: database table name
- * @param $format String One of:
+ * @param string $name database table name
+ * @param string $format One of:
* quoted - Automatically pass the table name through addIdentifierQuotes()
* so that it can be used in a query.
* raw - Do not add identifier quotes to the table name
@@ -1947,47 +2057,39 @@ abstract class DatabaseBase implements DatabaseType {
# Split database and table into proper variables.
# We reverse the explode so that database.table and table both output
# the correct table.
- $dbDetails = array_reverse( explode( '.', $name, 2 ) );
- if ( isset( $dbDetails[1] ) ) {
- list( $table, $database ) = $dbDetails;
+ $dbDetails = explode( '.', $name, 2 );
+ if ( count( $dbDetails ) == 2 ) {
+ list( $database, $table ) = $dbDetails;
+ # We don't want any prefix added in this case
+ $prefix = '';
} else {
list( $table ) = $dbDetails;
- }
- $prefix = $this->mTablePrefix; # Default prefix
-
- # A database name has been specified in input. We don't want any
- # prefixes added.
- if ( isset( $database ) ) {
- $prefix = '';
+ if ( $wgSharedDB !== null # We have a shared database
+ && !$this->isQuotedIdentifier( $table ) # Paranoia check to prevent shared tables listing '`table`'
+ && in_array( $table, $wgSharedTables ) # A shared table is selected
+ ) {
+ $database = $wgSharedDB;
+ $prefix = $wgSharedPrefix === null ? $this->mTablePrefix : $wgSharedPrefix;
+ } else {
+ $database = null;
+ $prefix = $this->mTablePrefix; # Default prefix
+ }
}
- # Note that we use the long format because php will complain in in_array if
- # the input is not an array, and will complain in is_array if it is not set.
- if ( !isset( $database ) # Don't use shared database if pre selected.
- && isset( $wgSharedDB ) # We have a shared database
- && !$this->isQuotedIdentifier( $table ) # Paranoia check to prevent shared tables listing '`table`'
- && isset( $wgSharedTables )
- && is_array( $wgSharedTables )
- && in_array( $table, $wgSharedTables ) ) { # A shared table is selected
- $database = $wgSharedDB;
- $prefix = isset( $wgSharedPrefix ) ? $wgSharedPrefix : $prefix;
+ # Quote $table and apply the prefix if not quoted.
+ $tableName = "{$prefix}{$table}";
+ if ( $format == 'quoted' && !$this->isQuotedIdentifier( $tableName ) ) {
+ $tableName = $this->addIdentifierQuotes( $tableName );
}
- # Quote the $database and $table and apply the prefix if not quoted.
- if ( isset( $database ) ) {
+ # Quote $database and merge it with the table name if needed
+ if ( $database !== null ) {
if ( $format == 'quoted' && !$this->isQuotedIdentifier( $database ) ) {
$database = $this->addIdentifierQuotes( $database );
}
+ $tableName = $database . '.' . $tableName;
}
- $table = "{$prefix}{$table}";
- if ( $format == 'quoted' && !$this->isQuotedIdentifier( $table ) ) {
- $table = $this->addIdentifierQuotes( "{$table}" );
- }
-
- # Merge our database and table into our final table name.
- $tableName = ( isset( $database ) ? "{$database}.{$table}" : "{$table}" );
-
return $tableName;
}
@@ -1996,7 +2098,7 @@ abstract class DatabaseBase implements DatabaseType {
* This is handy when you need to construct SQL for joins
*
* Example:
- * extract($dbr->tableNames('user','watchlist'));
+ * extract( $dbr->tableNames( 'user', 'watchlist' ) );
* $sql = "SELECT wl_namespace,wl_title FROM $watchlist,$user
* WHERE wl_user=user_id AND wl_user=$nameWithQuotes";
*
@@ -2018,7 +2120,7 @@ abstract class DatabaseBase implements DatabaseType {
* This is handy when you need to construct SQL for joins
*
* Example:
- * list( $user, $watchlist ) = $dbr->tableNamesN('user','watchlist');
+ * list( $user, $watchlist ) = $dbr->tableNamesN( 'user', 'watchlist' );
* $sql = "SELECT wl_namespace,wl_title FROM $watchlist,$user
* WHERE wl_user=user_id AND wl_user=$nameWithQuotes";
*
@@ -2039,8 +2141,8 @@ abstract class DatabaseBase implements DatabaseType {
* Get an aliased table name
* e.g. tableName AS newTableName
*
- * @param $name string Table name, see tableName()
- * @param $alias string|bool Alias (optional)
+ * @param string $name Table name, see tableName()
+ * @param string|bool $alias Alias (optional)
* @return string SQL name for aliased table. Will not alias a table to its own name
*/
public function tableNameWithAlias( $name, $alias = false ) {
@@ -2072,8 +2174,8 @@ abstract class DatabaseBase implements DatabaseType {
* Get an aliased field name
* e.g. fieldName AS newFieldName
*
- * @param $name string Field name
- * @param $alias string|bool Alias (optional)
+ * @param string $name Field name
+ * @param string|bool $alias Alias (optional)
* @return string SQL name for aliased field. Will not alias a field to its own name
*/
public function fieldNameWithAlias( $name, $alias = false ) {
@@ -2105,7 +2207,7 @@ abstract class DatabaseBase implements DatabaseType {
* Get the aliased table name clause for a FROM clause
* which might have a JOIN and/or USE INDEX clause
*
- * @param $tables array ( [alias] => table )
+ * @param array $tables ( [alias] => table )
* @param $use_index array Same as for select()
* @param $join_conds array Same as for select()
* @return string
@@ -2336,12 +2438,12 @@ abstract class DatabaseBase implements DatabaseType {
* to collide. However if you do this, you run the risk of encountering
* errors which wouldn't have occurred in MySQL.
*
- * @param $table String: The table to replace the row(s) in.
- * @param $rows array Can be either a single row to insert, or multiple rows,
+ * @param string $table The table to replace the row(s) in.
+ * @param array $rows Can be either a single row to insert, or multiple rows,
* in the same format as for DatabaseBase::insert()
- * @param $uniqueIndexes array is an array of indexes. Each element may be either
+ * @param array $uniqueIndexes is an array of indexes. Each element may be either
* a field name or an array of field names
- * @param $fname String: Calling function name (use __METHOD__) for logs/profiling
+ * @param string $fname Calling function name (use __METHOD__) for logs/profiling
*/
public function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseBase::replace' ) {
$quotedTable = $this->tableName( $table );
@@ -2394,9 +2496,9 @@ abstract class DatabaseBase implements DatabaseType {
* REPLACE query wrapper for MySQL and SQLite, which have a native REPLACE
* statement.
*
- * @param $table string Table name
- * @param $rows array Rows to insert
- * @param $fname string Caller function name
+ * @param string $table Table name
+ * @param array $rows Rows to insert
+ * @param string $fname Caller function name
*
* @return ResultWrapper
*/
@@ -2443,6 +2545,7 @@ abstract class DatabaseBase implements DatabaseType {
* ANDed together in the WHERE clause
* @param $fname String: Calling function name (use __METHOD__) for
* logs/profiling
+ * @throws DBUnexpectedError
*/
public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
$fname = 'DatabaseBase::deleteJoin' )
@@ -2503,12 +2606,13 @@ abstract class DatabaseBase implements DatabaseType {
/**
* DELETE query wrapper.
*
- * @param $table Array Table name
- * @param $conds String|Array of conditions. See $conds in DatabaseBase::select() for
+ * @param array $table Table name
+ * @param string|array $conds of conditions. See $conds in DatabaseBase::select() for
* the format. Use $conds == "*" to delete all rows
- * @param $fname String name of the calling function
+ * @param string $fname name of the calling function
*
- * @return bool
+ * @throws DBUnexpectedError
+ * @return bool|ResultWrapper
*/
public function delete( $table, $conds, $fname = 'DatabaseBase::delete' ) {
if ( !$conds ) {
@@ -2529,24 +2633,24 @@ abstract class DatabaseBase implements DatabaseType {
* INSERT SELECT wrapper. Takes data from a SELECT query and inserts it
* into another table.
*
- * @param $destTable string The table name to insert into
- * @param $srcTable string|array May be either a table name, or an array of table names
+ * @param string $destTable The table name to insert into
+ * @param string|array $srcTable May be either a table name, or an array of table names
* to include in a join.
*
- * @param $varMap array must be an associative array of the form
+ * @param array $varMap must be an associative array of the form
* array( 'dest1' => 'source1', ...). Source items may be literals
* rather than field names, but strings should be quoted with
* DatabaseBase::addQuotes()
*
- * @param $conds array Condition array. See $conds in DatabaseBase::select() for
+ * @param array $conds Condition array. See $conds in DatabaseBase::select() for
* the details of the format of condition arrays. May be "*" to copy the
* whole table.
*
- * @param $fname string The function name of the caller, from __METHOD__
+ * @param string $fname The function name of the caller, from __METHOD__
*
- * @param $insertOptions array Options for the INSERT part of the query, see
+ * @param array $insertOptions Options for the INSERT part of the query, see
* DatabaseBase::insert() for details.
- * @param $selectOptions array Options for the SELECT part of the query, see
+ * @param array $selectOptions Options for the SELECT part of the query, see
* DatabaseBase::select() for details.
*
* @return ResultWrapper
@@ -2568,7 +2672,7 @@ abstract class DatabaseBase implements DatabaseType {
list( $startOpts, $useIndex, $tailOpts ) = $this->makeSelectOptions( $selectOptions );
if ( is_array( $srcTable ) ) {
- $srcTable = implode( ',', array_map( array( &$this, 'tableName' ), $srcTable ) );
+ $srcTable = implode( ',', array_map( array( &$this, 'tableName' ), $srcTable ) );
} else {
$srcTable = $this->tableName( $srcTable );
}
@@ -2602,10 +2706,11 @@ abstract class DatabaseBase implements DatabaseType {
* The version provided by default works in MySQL and SQLite. It will very
* likely need to be overridden for most other DBMSes.
*
- * @param $sql String SQL query we will append the limit too
+ * @param string $sql SQL query we will append the limit too
* @param $limit Integer the SQL limit
* @param $offset Integer|bool the SQL offset (default false)
*
+ * @throws DBUnexpectedError
* @return string
*/
public function limitResult( $sql, $limit, $offset = false ) {
@@ -2630,7 +2735,7 @@ abstract class DatabaseBase implements DatabaseType {
* Construct a UNION query
* This is used for providing overload point for other DB abstractions
* not compatible with the MySQL syntax.
- * @param $sqls Array: SQL statements to combine
+ * @param array $sqls SQL statements to combine
* @param $all Boolean: use UNION ALL
* @return String: SQL fragment
*/
@@ -2643,9 +2748,9 @@ abstract class DatabaseBase implements DatabaseType {
* Returns an SQL expression for a simple conditional. This doesn't need
* to be overridden unless CASE isn't supported in your DBMS.
*
- * @param $cond string|array SQL expression which will result in a boolean value
- * @param $trueVal String: SQL expression to return if true
- * @param $falseVal String: SQL expression to return if false
+ * @param string|array $cond SQL expression which will result in a boolean value
+ * @param string $trueVal SQL expression to return if true
+ * @param string $falseVal SQL expression to return if false
* @return String: SQL fragment
*/
public function conditional( $cond, $trueVal, $falseVal ) {
@@ -2659,9 +2764,9 @@ abstract class DatabaseBase implements DatabaseType {
* Returns a comand for str_replace function in SQL query.
* Uses REPLACE() in MySQL
*
- * @param $orig String: column to modify
- * @param $old String: column to seek
- * @param $new String: column to replace with
+ * @param string $orig column to modify
+ * @param string $old column to seek
+ * @param string $new column to replace with
*
* @return string
*/
@@ -2854,8 +2959,9 @@ abstract class DatabaseBase implements DatabaseType {
*
* This is useful for updates to different systems or separate transactions are needed.
*
+ * @since 1.20
+ *
* @param Closure $callback
- * @return void
*/
final public function onTransactionIdle( Closure $callback ) {
if ( $this->mTrxLevel ) {
@@ -2866,7 +2972,9 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
- * Actually run the "on transaction idle" callbacks
+ * Actually run the "on transaction idle" callbacks.
+ *
+ * @since 1.20
*/
protected function runOnTransactionIdleCallbacks() {
$autoTrx = $this->getFlag( DBO_TRX ); // automatic begin() enabled?
@@ -2890,19 +2998,50 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
- * Begin a transaction
+ * Begin a transaction. If a transaction is already in progress, that transaction will be committed before the
+ * new transaction is started.
+ *
+ * Note that when the DBO_TRX flag is set (which is usually the case for web requests, but not for maintenance scripts),
+ * any previous database query will have started a transaction automatically.
+ *
+ * Nesting of transactions is not supported. Attempts to nest transactions will cause a warning, unless the current
+ * transaction was started automatically because of the DBO_TRX flag.
*
* @param $fname string
*/
final public function begin( $fname = 'DatabaseBase::begin' ) {
+ global $wgDebugDBTransactions;
+
if ( $this->mTrxLevel ) { // implicit commit
+ if ( !$this->mTrxAutomatic ) {
+ // We want to warn about inadvertently nested begin/commit pairs, but not about
+ // auto-committing implicit transactions that were started by query() via DBO_TRX
+ $msg = "$fname: Transaction already in progress (from {$this->mTrxFname}), " .
+ " performing implicit commit!";
+ wfWarn( $msg );
+ wfLogDBError( $msg );
+ } else {
+ // if the transaction was automatic and has done write operations,
+ // log it if $wgDebugDBTransactions is enabled.
+ if ( $this->mTrxDoneWrites && $wgDebugDBTransactions ) {
+ wfDebug( "$fname: Automatic transaction with writes in progress" .
+ " (from {$this->mTrxFname}), performing implicit commit!\n" );
+ }
+ }
+
$this->doCommit( $fname );
$this->runOnTransactionIdleCallbacks();
}
+
$this->doBegin( $fname );
+ $this->mTrxFname = $fname;
+ $this->mTrxDoneWrites = false;
+ $this->mTrxAutomatic = false;
}
/**
+ * Issues the BEGIN command to the database server.
+ *
* @see DatabaseBase::begin()
* @param type $fname
*/
@@ -2912,16 +3051,39 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
- * End a transaction
+ * Commits a transaction previously started using begin().
+ * If no transaction is in progress, a warning is issued.
+ *
+ * Nesting of transactions is not supported.
*
* @param $fname string
- */
- final public function commit( $fname = 'DatabaseBase::commit' ) {
+ * @param string $flush Flush flag, set to 'flush' to disable warnings about explicitly committing implicit
+ * transactions, or calling commit when no transaction is in progress.
+ * This will silently break any ongoing explicit transaction. Only set the flush flag if you are sure
+ * that it is safe to ignore these warnings in your context.
+ */
+ final public function commit( $fname = 'DatabaseBase::commit', $flush = '' ) {
+ if ( $flush != 'flush' ) {
+ if ( !$this->mTrxLevel ) {
+ wfWarn( "$fname: No transaction to commit, something got out of sync!" );
+ } elseif( $this->mTrxAutomatic ) {
+ wfWarn( "$fname: Explicit commit of implicit transaction. Something may be out of sync!" );
+ }
+ } else {
+ if ( !$this->mTrxLevel ) {
+ return; // nothing to do
+ } elseif( !$this->mTrxAutomatic ) {
+ wfWarn( "$fname: Flushing an explicit transaction, getting out of sync!" );
+ }
+ }
+
$this->doCommit( $fname );
$this->runOnTransactionIdleCallbacks();
}
/**
+ * Issues the COMMIT command to the database server.
+ *
* @see DatabaseBase::commit()
* @param type $fname
*/
@@ -2933,17 +3095,24 @@ abstract class DatabaseBase implements DatabaseType {
}
/**
- * Rollback a transaction.
+ * Rollback a transaction previously started using begin().
+ * If no transaction is in progress, a warning is issued.
+ *
* No-op on non-transactional databases.
*
* @param $fname string
*/
final public function rollback( $fname = 'DatabaseBase::rollback' ) {
+ if ( !$this->mTrxLevel ) {
+ wfWarn( "$fname: No transaction to rollback, something got out of sync!" );
+ }
$this->doRollback( $fname );
$this->mTrxIdleCallbacks = array(); // cancel
}
/**
+ * Issues the ROLLBACK command to the database server.
+ *
* @see DatabaseBase::rollback()
* @param type $fname
*/
@@ -2962,10 +3131,11 @@ abstract class DatabaseBase implements DatabaseType {
* The table names passed to this function shall not be quoted (this
* function calls addIdentifierQuotes when needed).
*
- * @param $oldName String: name of table whose structure should be copied
- * @param $newName String: name of table to be created
+ * @param string $oldName name of table whose structure should be copied
+ * @param string $newName name of table to be created
* @param $temporary Boolean: whether the new table should be temporary
- * @param $fname String: calling function name
+ * @param string $fname calling function name
+ * @throws MWException
* @return Boolean: true if operation was successful
*/
public function duplicateTableStructure( $oldName, $newName, $temporary = false,
@@ -2978,8 +3148,9 @@ abstract class DatabaseBase implements DatabaseType {
/**
* List all tables on the database
*
- * @param $prefix string Only show tables with this prefix, e.g. mw_
- * @param $fname String: calling function name
+ * @param string $prefix Only show tables with this prefix, e.g. mw_
+ * @param string $fname calling function name
+ * @throws MWException
*/
function listTables( $prefix = null, $fname = 'DatabaseBase::listTables' ) {
throw new MWException( 'DatabaseBase::listTables is not implemented in descendant class' );
@@ -3122,15 +3293,18 @@ abstract class DatabaseBase implements DatabaseType {
* Returns true on success, error string or exception on failure (depending
* on object's error ignore settings).
*
- * @param $filename String: File name to open
- * @param $lineCallback Callback: Optional function called before reading each line
- * @param $resultCallback Callback: Optional function called for each MySQL result
- * @param $fname String: Calling function name or false if name should be
+ * @param string $filename File name to open
+ * @param bool|callable $lineCallback Optional function called before reading each line
+ * @param bool|callable $resultCallback Optional function called for each MySQL result
+ * @param bool|string $fname Calling function name or false if name should be
* generated dynamically using $filename
+ * @param bool|callable $inputCallback Callback: Optional function called for each complete line sent
+ * @throws MWException
+ * @throws Exception|MWException
* @return bool|string
*/
public function sourceFile(
- $filename, $lineCallback = false, $resultCallback = false, $fname = false
+ $filename, $lineCallback = false, $resultCallback = false, $fname = false, $inputCallback = false
) {
wfSuppressWarnings();
$fp = fopen( $filename, 'r' );
@@ -3145,7 +3319,7 @@ abstract class DatabaseBase implements DatabaseType {
}
try {
- $error = $this->sourceStream( $fp, $lineCallback, $resultCallback, $fname );
+ $error = $this->sourceStream( $fp, $lineCallback, $resultCallback, $fname, $inputCallback );
}
catch ( MWException $e ) {
fclose( $fp );
@@ -3162,7 +3336,7 @@ abstract class DatabaseBase implements DatabaseType {
* from updaters.inc. Keep in mind this always returns a patch, as
* it fails back to MySQL if no DB-specific patch can be found
*
- * @param $patch String The name of the patch, like patch-something.sql
+ * @param string $patch The name of the patch, like patch-something.sql
* @return String Full path to patch file
*/
public function patchPath( $patch ) {
@@ -3181,7 +3355,7 @@ abstract class DatabaseBase implements DatabaseType {
* ones in $GLOBALS. If an array is set here, $GLOBALS will not be used at
* all. If it's set to false, $GLOBALS will be used.
*
- * @param $vars bool|array mapping variable name to value.
+ * @param bool|array $vars mapping variable name to value.
*/
public function setSchemaVars( $vars ) {
$this->mSchemaVars = $vars;
@@ -3194,10 +3368,10 @@ abstract class DatabaseBase implements DatabaseType {
* on object's error ignore settings).
*
* @param $fp Resource: File handle
- * @param $lineCallback Callback: Optional function called before reading each line
+ * @param $lineCallback Callback: Optional function called before reading each query
* @param $resultCallback Callback: Optional function called for each MySQL result
- * @param $fname String: Calling function name
- * @param $inputCallback Callback: Optional function called for each complete line (ended with ;) sent
+ * @param string $fname Calling function name
+ * @param $inputCallback Callback: Optional function called for each complete query sent
* @return bool|string
*/
public function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
@@ -3230,20 +3404,19 @@ abstract class DatabaseBase implements DatabaseType {
if ( $done || feof( $fp ) ) {
$cmd = $this->replaceVars( $cmd );
- if ( $inputCallback ) {
- call_user_func( $inputCallback, $cmd );
- }
- $res = $this->query( $cmd, $fname );
- if ( $resultCallback ) {
- call_user_func( $resultCallback, $res, $this );
- }
+ if ( ( $inputCallback && call_user_func( $inputCallback, $cmd ) ) || !$inputCallback ) {
+ $res = $this->query( $cmd, $fname );
- if ( false === $res ) {
- $err = $this->lastError();
- return "Query \"{$cmd}\" failed with error code \"$err\".\n";
- }
+ if ( $resultCallback ) {
+ call_user_func( $resultCallback, $res, $this );
+ }
+ if ( false === $res ) {
+ $err = $this->lastError();
+ return "Query \"{$cmd}\" failed with error code \"$err\".\n";
+ }
+ }
$cmd = '';
}
}
@@ -3254,8 +3427,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Called by sourceStream() to check if we've reached a statement end
*
- * @param $sql String SQL assembled so far
- * @param $newLine String New line about to be added to $sql
+ * @param string $sql SQL assembled so far
+ * @param string $newLine New line about to be added to $sql
* @return Bool Whether $newLine contains end of the statement
*/
public function streamStatementEnd( &$sql, &$newLine ) {
@@ -3283,7 +3456,7 @@ abstract class DatabaseBase implements DatabaseType {
* - / *$var* / is just encoded, besides traditional table prefix and
* table options its use should be avoided.
*
- * @param $ins String: SQL statement to replace variables in
+ * @param string $ins SQL statement to replace variables in
* @return String The new SQL statement with variables replaced
*/
protected function replaceSchemaVars( $ins ) {
@@ -3294,7 +3467,7 @@ abstract class DatabaseBase implements DatabaseType {
// replace `{$var}`
$ins = str_replace( '`{$' . $var . '}`', $this->addIdentifierQuotes( $value ), $ins );
// replace /*$var*/
- $ins = str_replace( '/*$' . $var . '*/', $this->strencode( $value ) , $ins );
+ $ins = str_replace( '/*$' . $var . '*/', $this->strencode( $value ), $ins );
}
return $ins;
}
@@ -3371,8 +3544,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Check to see if a named lock is available. This is non-blocking.
*
- * @param $lockName String: name of lock to poll
- * @param $method String: name of method calling us
+ * @param string $lockName name of lock to poll
+ * @param string $method name of method calling us
* @return Boolean
* @since 1.20
*/
@@ -3386,8 +3559,8 @@ abstract class DatabaseBase implements DatabaseType {
* Abstracted from Filestore::lock() so child classes can implement for
* their own needs.
*
- * @param $lockName String: name of lock to aquire
- * @param $method String: name of method calling us
+ * @param string $lockName name of lock to aquire
+ * @param string $method name of method calling us
* @param $timeout Integer: timeout
* @return Boolean
*/
@@ -3398,8 +3571,8 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Release a lock.
*
- * @param $lockName String: Name of lock to release
- * @param $method String: Name of method calling us
+ * @param string $lockName Name of lock to release
+ * @param string $method Name of method calling us
*
* @return int Returns 1 if the lock was released, 0 if the lock was not established
* by this thread (in which case the lock is not released), and NULL if the named
@@ -3412,10 +3585,10 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Lock specific tables
*
- * @param $read Array of tables to lock for read access
- * @param $write Array of tables to lock for write access
- * @param $method String name of caller
- * @param $lowPriority bool Whether to indicate writes to be LOW PRIORITY
+ * @param array $read of tables to lock for read access
+ * @param array $write of tables to lock for write access
+ * @param string $method name of caller
+ * @param bool $lowPriority Whether to indicate writes to be LOW PRIORITY
*
* @return bool
*/
@@ -3426,7 +3599,7 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Unlock specific tables
*
- * @param $method String the caller
+ * @param string $method the caller
*
* @return bool
*/
@@ -3476,7 +3649,7 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Encode an expiry time into the DBMS dependent format
*
- * @param $expiry String: timestamp for expiry, or the 'infinity' string
+ * @param string $expiry timestamp for expiry, or the 'infinity' string
* @return String
*/
public function encodeExpiry( $expiry ) {
@@ -3488,7 +3661,7 @@ abstract class DatabaseBase implements DatabaseType {
/**
* Decode an expiry time into a DBMS independent format
*
- * @param $expiry String: DB timestamp field value for expiry
+ * @param string $expiry DB timestamp field value for expiry
* @param $format integer: TS_* constant, defaults to TS_MW
* @return String
*/
diff --git a/includes/db/DatabaseError.php b/includes/db/DatabaseError.php
index a53a6747..628a2afc 100644
--- a/includes/db/DatabaseError.php
+++ b/includes/db/DatabaseError.php
@@ -35,9 +35,9 @@ class DBError extends MWException {
/**
* Construct a database error
* @param $db DatabaseBase object which threw the error
- * @param $error String A simple error message to be used for debugging
+ * @param string $error A simple error message to be used for debugging
*/
- function __construct( DatabaseBase &$db, $error ) {
+ function __construct( DatabaseBase $db = null, $error ) {
$this->db = $db;
parent::__construct( $error );
}
@@ -91,7 +91,7 @@ class DBError extends MWException {
class DBConnectionError extends DBError {
public $error;
- function __construct( DatabaseBase &$db, $error = 'unknown error' ) {
+ function __construct( DatabaseBase $db = null, $error = 'unknown error' ) {
$msg = 'DB connection error';
if ( trim( $error ) != '' ) {
@@ -153,12 +153,12 @@ class DBConnectionError extends DBError {
$sorry = htmlspecialchars( $this->msg( 'dberr-problems', 'Sorry! This site is experiencing technical difficulties.' ) );
$again = htmlspecialchars( $this->msg( 'dberr-again', 'Try waiting a few minutes and reloading.' ) );
- $info = htmlspecialchars( $this->msg( 'dberr-info', '(Can\'t contact the database server: $1)' ) );
+ $info = htmlspecialchars( $this->msg( 'dberr-info', '(Can\'t contact the database server: $1)' ) );
# No database access
MessageCache::singleton()->disable();
- if ( trim( $this->error ) == '' ) {
+ if ( trim( $this->error ) == '' && $this->db ) {
$this->error = $this->db->getProperty( 'mServer' );
}
@@ -176,7 +176,7 @@ class DBConnectionError extends DBError {
return "$text<hr />$extra";
}
- public function reportHTML(){
+ public function reportHTML() {
global $wgUseFileCache;
# Check whether we can serve a file-cached copy of the page with the error underneath
@@ -288,11 +288,11 @@ class DBQueryError extends DBError {
* @param $sql string
* @param $fname string
*/
- function __construct( DatabaseBase &$db, $error, $errno, $sql, $fname ) {
- $message = "A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: https://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script\n" .
- "Query: $sql\n" .
- "Function: $fname\n" .
- "Error: $errno $error\n";
+ function __construct( DatabaseBase $db, $error, $errno, $sql, $fname ) {
+ $message = "A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: https://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script\n" .
+ "Query: $sql\n" .
+ "Function: $fname\n" .
+ "Error: $errno $error\n";
parent::__construct( $db, $message );
$this->error = $error;
diff --git a/includes/db/DatabaseIbm_db2.php b/includes/db/DatabaseIbm_db2.php
deleted file mode 100644
index f1f6dfca..00000000
--- a/includes/db/DatabaseIbm_db2.php
+++ /dev/null
@@ -1,1721 +0,0 @@
-<?php
-/**
- * This is the IBM DB2 database abstraction layer.
- * See maintenance/ibm_db2/README for development notes
- * and other specific information.
- *
- * 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 Database
- * @author leo.petr+mediawiki@gmail.com
- */
-
-/**
- * This represents a column in a DB2 database
- * @ingroup Database
- */
-class IBM_DB2Field implements Field {
- private $name = '';
- private $tablename = '';
- private $type = '';
- private $nullable = false;
- private $max_length = 0;
-
- /**
- * Builder method for the class
- * @param $db DatabaseIbm_db2: Database interface
- * @param $table String: table name
- * @param $field String: column name
- * @return IBM_DB2Field
- */
- static function fromText( $db, $table, $field ) {
- global $wgDBmwschema;
-
- $q = <<<SQL
-SELECT
-lcase( coltype ) AS typname,
-nulls AS attnotnull, length AS attlen
-FROM sysibm.syscolumns
-WHERE tbcreator=%s AND tbname=%s AND name=%s;
-SQL;
- $res = $db->query(
- sprintf( $q,
- $db->addQuotes( $wgDBmwschema ),
- $db->addQuotes( $table ),
- $db->addQuotes( $field )
- )
- );
- $row = $db->fetchObject( $res );
- if ( !$row ) {
- return null;
- }
- $n = new IBM_DB2Field;
- $n->type = $row->typname;
- $n->nullable = ( $row->attnotnull == 'N' );
- $n->name = $field;
- $n->tablename = $table;
- $n->max_length = $row->attlen;
- return $n;
- }
- /**
- * Get column name
- * @return string column name
- */
- function name() { return $this->name; }
- /**
- * Get table name
- * @return string table name
- */
- function tableName() { return $this->tablename; }
- /**
- * Get column type
- * @return string column type
- */
- function type() { return $this->type; }
- /**
- * Can column be null?
- * @return bool true or false
- */
- function isNullable() { return $this->nullable; }
- /**
- * How much can you fit in the column per row?
- * @return int length
- */
- function maxLength() { return $this->max_length; }
-}
-
-/**
- * Wrapper around binary large objects
- * @ingroup Database
- */
-class IBM_DB2Blob {
- private $mData;
-
- public function __construct( $data ) {
- $this->mData = $data;
- }
-
- public function getData() {
- return $this->mData;
- }
-
- public function __toString() {
- return $this->mData;
- }
-}
-
-/**
- * Wrapper to address lack of certain operations in the DB2 driver
- * ( seek, num_rows )
- * @ingroup Database
- * @since 1.19
- */
-class IBM_DB2Result{
- private $db;
- private $result;
- private $num_rows;
- private $current_pos;
- private $columns = array();
- private $sql;
-
- private $resultSet = array();
- private $loadedLines = 0;
-
- /**
- * Construct and initialize a wrapper for DB2 query results
- * @param $db DatabaseBase
- * @param $result Object
- * @param $num_rows Integer
- * @param $sql String
- * @param $columns Array
- */
- public function __construct( $db, $result, $num_rows, $sql, $columns ){
- $this->db = $db;
-
- if( $result instanceof ResultWrapper ){
- $this->result = $result->result;
- }
- else{
- $this->result = $result;
- }
-
- $this->num_rows = $num_rows;
- $this->current_pos = 0;
- if ( $this->num_rows > 0 ) {
- // Make a lower-case list of the column names
- // By default, DB2 column names are capitalized
- // while MySQL column names are lowercase
-
- // Is there a reasonable maximum value for $i?
- // Setting to 2048 to prevent an infinite loop
- for( $i = 0; $i < 2048; $i++ ) {
- $name = db2_field_name( $this->result, $i );
- if ( $name != false ) {
- continue;
- }
- else {
- return false;
- }
-
- $this->columns[$i] = strtolower( $name );
- }
- }
-
- $this->sql = $sql;
- }
-
- /**
- * Unwrap the DB2 query results
- * @return mixed Object on success, false on failure
- */
- public function getResult() {
- if ( $this->result ) {
- return $this->result;
- }
- else return false;
- }
-
- /**
- * Get the number of rows in the result set
- * @return integer
- */
- public function getNum_rows() {
- return $this->num_rows;
- }
-
- /**
- * Return a row from the result set in object format
- * @return mixed Object on success, false on failure.
- */
- public function fetchObject() {
- if ( $this->result
- && $this->num_rows > 0
- && $this->current_pos >= 0
- && $this->current_pos < $this->num_rows )
- {
- $row = $this->fetchRow();
- $ret = new stdClass();
-
- foreach ( $row as $k => $v ) {
- $lc = $this->columns[$k];
- $ret->$lc = $v;
- }
- return $ret;
- }
- return false;
- }
-
- /**
- * Return a row form the result set in array format
- * @return mixed Array on success, false on failure
- * @throws DBUnexpectedError
- */
- public function fetchRow(){
- if ( $this->result
- && $this->num_rows > 0
- && $this->current_pos >= 0
- && $this->current_pos < $this->num_rows )
- {
- if ( $this->loadedLines <= $this->current_pos ) {
- $row = db2_fetch_array( $this->result );
- $this->resultSet[$this->loadedLines++] = $row;
- if ( $this->db->lastErrno() ) {
- throw new DBUnexpectedError( $this->db, 'Error in fetchRow(): '
- . htmlspecialchars( $this->db->lastError() ) );
- }
- }
-
- if ( $this->loadedLines > $this->current_pos ){
- return $this->resultSet[$this->current_pos++];
- }
-
- }
- return false;
- }
-
- /**
- * Free a DB2 result object
- * @throws DBUnexpectedError
- */
- public function freeResult(){
- unset( $this->resultSet );
- if ( !@db2_free_result( $this->result ) ) {
- throw new DBUnexpectedError( $this, "Unable to free DB2 result\n" );
- }
- }
-}
-
-/**
- * Primary database interface
- * @ingroup Database
- */
-class DatabaseIbm_db2 extends DatabaseBase {
- /*
- * Inherited members
- protected $mLastQuery = '';
- protected $mPHPError = false;
-
- protected $mServer, $mUser, $mPassword, $mConn = null, $mDBname;
- protected $mOpened = false;
-
- protected $mTablePrefix;
- protected $mFlags;
- protected $mTrxLevel = 0;
- protected $mErrorCount = 0;
- protected $mLBInfo = array();
- protected $mFakeSlaveLag = null, $mFakeMaster = false;
- *
- */
-
- /** Database server port */
- protected $mPort = null;
- /** Schema for tables, stored procedures, triggers */
- protected $mSchema = null;
- /** Whether the schema has been applied in this session */
- protected $mSchemaSet = false;
- /** Result of last query */
- protected $mLastResult = null;
- /** Number of rows affected by last INSERT/UPDATE/DELETE */
- protected $mAffectedRows = null;
- /** Number of rows returned by last SELECT */
- protected $mNumRows = null;
- /** Current row number on the cursor of the last SELECT */
- protected $currentRow = 0;
-
- /** Connection config options - see constructor */
- public $mConnOptions = array();
- /** Statement config options -- see constructor */
- public $mStmtOptions = array();
-
- /** Default schema */
- const USE_GLOBAL = 'get from global';
-
- /** Option that applies to nothing */
- const NONE_OPTION = 0x00;
- /** Option that applies to connection objects */
- const CONN_OPTION = 0x01;
- /** Option that applies to statement objects */
- const STMT_OPTION = 0x02;
-
- /** Regular operation mode -- minimal debug messages */
- const REGULAR_MODE = 'regular';
- /** Installation mode -- lots of debug messages */
- const INSTALL_MODE = 'install';
-
- /** Controls the level of debug message output */
- protected $mMode = self::REGULAR_MODE;
-
- /** Last sequence value used for a primary key */
- protected $mInsertId = null;
-
- ######################################
- # Getters and Setters
- ######################################
-
- /**
- * Returns true if this database supports (and uses) cascading deletes
- * @return bool
- */
- function cascadingDeletes() {
- return true;
- }
-
- /**
- * Returns true if this database supports (and uses) triggers (e.g. on the
- * page table)
- * @return bool
- */
- function cleanupTriggers() {
- return true;
- }
-
- /**
- * Returns true if this database is strict about what can be put into an
- * IP field.
- * Specifically, it uses a NULL value instead of an empty string.
- * @return bool
- */
- function strictIPs() {
- return true;
- }
-
- /**
- * Returns true if this database uses timestamps rather than integers
- * @return bool
- */
- function realTimestamps() {
- return true;
- }
-
- /**
- * Returns true if this database does an implicit sort when doing GROUP BY
- * @return bool
- */
- function implicitGroupby() {
- return false;
- }
-
- /**
- * Returns true if this database does an implicit order by when the column
- * has an index
- * For example: SELECT page_title FROM page LIMIT 1
- * @return bool
- */
- function implicitOrderby() {
- return false;
- }
-
- /**
- * Returns true if this database can do a native search on IP columns
- * e.g. this works as expected: .. WHERE rc_ip = '127.42.12.102/32';
- * @return bool
- */
- function searchableIPs() {
- return true;
- }
-
- /**
- * Returns true if this database can use functional indexes
- * @return bool
- */
- function functionalIndexes() {
- return true;
- }
-
- /**
- * Returns a unique string representing the wiki on the server
- * @return string
- */
- public function getWikiID() {
- if( $this->mSchema ) {
- return "{$this->mDBname}-{$this->mSchema}";
- } else {
- return $this->mDBname;
- }
- }
-
- /**
- * Returns the database software identifieir
- * @return string
- */
- public function getType() {
- return 'ibm_db2';
- }
-
- /**
- * Returns the database connection object
- * @return Object
- */
- public function getDb(){
- return $this->mConn;
- }
-
- /**
- *
- * @param $server String: hostname of database server
- * @param $user String: username
- * @param $password String: password
- * @param $dbName String: database name on the server
- * @param $flags Integer: database behaviour flags (optional, unused)
- * @param $schema String
- */
- public function __construct( $server = false, $user = false,
- $password = false,
- $dbName = false, $flags = 0,
- $schema = self::USE_GLOBAL )
- {
- global $wgDBmwschema;
-
- if ( $schema == self::USE_GLOBAL ) {
- $this->mSchema = $wgDBmwschema;
- } else {
- $this->mSchema = $schema;
- }
-
- // configure the connection and statement objects
- $this->setDB2Option( 'db2_attr_case', 'DB2_CASE_LOWER',
- self::CONN_OPTION | self::STMT_OPTION );
- $this->setDB2Option( 'deferred_prepare', 'DB2_DEFERRED_PREPARE_ON',
- self::STMT_OPTION );
- $this->setDB2Option( 'rowcount', 'DB2_ROWCOUNT_PREFETCH_ON',
- self::STMT_OPTION );
- parent::__construct( $server, $user, $password, $dbName, DBO_TRX | $flags );
- }
-
- /**
- * Enables options only if the ibm_db2 extension version supports them
- * @param $name String: name of the option in the options array
- * @param $const String: name of the constant holding the right option value
- * @param $type Integer: whether this is a Connection or Statement otion
- */
- private function setDB2Option( $name, $const, $type ) {
- if ( defined( $const ) ) {
- if ( $type & self::CONN_OPTION ) {
- $this->mConnOptions[$name] = constant( $const );
- }
- if ( $type & self::STMT_OPTION ) {
- $this->mStmtOptions[$name] = constant( $const );
- }
- } else {
- $this->installPrint(
- "$const is not defined. ibm_db2 version is likely too low." );
- }
- }
-
- /**
- * Outputs debug information in the appropriate place
- * @param $string String: the relevant debug message
- */
- private function installPrint( $string ) {
- wfDebug( "$string\n" );
- if ( $this->mMode == self::INSTALL_MODE ) {
- print "<li><pre>$string</pre></li>";
- flush();
- }
- }
-
- /**
- * Opens a database connection and returns it
- * Closes any existing connection
- *
- * @param $server String: hostname
- * @param $user String
- * @param $password String
- * @param $dbName String: database name
- * @return DatabaseBase a fresh connection
- */
- public function open( $server, $user, $password, $dbName ) {
- wfProfileIn( __METHOD__ );
-
- # Load IBM DB2 driver if missing
- wfDl( 'ibm_db2' );
-
- # Test for IBM DB2 support, to avoid suppressed fatal error
- if ( !function_exists( 'db2_connect' ) ) {
- throw new DBConnectionError( $this, "DB2 functions missing, have you enabled the ibm_db2 extension for PHP?" );
- }
-
- global $wgDBport;
-
- // Close existing connection
- $this->close();
- // Cache conn info
- $this->mServer = $server;
- $this->mPort = $port = $wgDBport;
- $this->mUser = $user;
- $this->mPassword = $password;
- $this->mDBname = $dbName;
-
- $this->openUncataloged( $dbName, $user, $password, $server, $port );
-
- if ( !$this->mConn ) {
- $this->installPrint( "DB connection error\n" );
- $this->installPrint(
- "Server: $server, Database: $dbName, User: $user, Password: "
- . substr( $password, 0, 3 ) . "...\n" );
- $this->installPrint( $this->lastError() . "\n" );
- wfProfileOut( __METHOD__ );
- wfDebug( "DB connection error\n" );
- wfDebug( "Server: $server, Database: $dbName, User: $user, Password: " . substr( $password, 0, 3 ) . "...\n" );
- wfDebug( $this->lastError() . "\n" );
- throw new DBConnectionError( $this, $this->lastError() );
- }
-
- // Some MediaWiki code is still transaction-less (?).
- // The strategy is to keep AutoCommit on for that code
- // but switch it off whenever a transaction is begun.
- db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_ON );
-
- $this->mOpened = true;
- $this->applySchema();
-
- wfProfileOut( __METHOD__ );
- return $this->mConn;
- }
-
- /**
- * Opens a cataloged database connection, sets mConn
- */
- protected function openCataloged( $dbName, $user, $password ) {
- wfSuppressWarnings();
- $this->mConn = db2_pconnect( $dbName, $user, $password );
- wfRestoreWarnings();
- }
-
- /**
- * Opens an uncataloged database connection, sets mConn
- */
- protected function openUncataloged( $dbName, $user, $password, $server, $port )
- {
- $dsn = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$dbName;CHARSET=UTF-8;HOSTNAME=$server;PORT=$port;PROTOCOL=TCPIP;UID=$user;PWD=$password;";
- wfSuppressWarnings();
- $this->mConn = db2_pconnect( $dsn, "", "", array() );
- wfRestoreWarnings();
- }
-
- /**
- * Closes a database connection, if it is open
- * Returns success, true if already closed
- * @return bool
- */
- protected function closeConnection() {
- return db2_close( $this->mConn );
- }
-
- /**
- * Retrieves the most current database error
- * Forces a database rollback
- * @return bool|string
- */
- public function lastError() {
- $connerr = db2_conn_errormsg();
- if ( $connerr ) {
- //$this->rollback( __METHOD__ );
- return $connerr;
- }
- $stmterr = db2_stmt_errormsg();
- if ( $stmterr ) {
- //$this->rollback( __METHOD__ );
- return $stmterr;
- }
-
- return false;
- }
-
- /**
- * Get the last error number
- * Return 0 if no error
- * @return integer
- */
- public function lastErrno() {
- $connerr = db2_conn_error();
- if ( $connerr ) {
- return $connerr;
- }
- $stmterr = db2_stmt_error();
- if ( $stmterr ) {
- return $stmterr;
- }
- return 0;
- }
-
- /**
- * Is a database connection open?
- * @return
- */
- public function isOpen() { return $this->mOpened; }
-
- /**
- * The DBMS-dependent part of query()
- * @param $sql String: SQL query.
- * @return object Result object for fetch functions or false on failure
- */
- protected function doQuery( $sql ) {
- $this->applySchema();
-
- // Needed to handle any UTF-8 encoding issues in the raw sql
- // Note that we fully support prepared statements for DB2
- // prepare() and execute() should be used instead of doQuery() whenever possible
- $sql = utf8_decode( $sql );
-
- $ret = db2_exec( $this->mConn, $sql, $this->mStmtOptions );
- if( $ret == false ) {
- $error = db2_stmt_errormsg();
-
- $this->installPrint( "<pre>$sql</pre>" );
- $this->installPrint( $error );
- throw new DBUnexpectedError( $this, 'SQL error: '
- . htmlspecialchars( $error ) );
- }
- $this->mLastResult = $ret;
- $this->mAffectedRows = null; // Not calculated until asked for
- return $ret;
- }
-
- /**
- * @return string Version information from the database
- */
- public function getServerVersion() {
- $info = db2_server_info( $this->mConn );
- return $info->DBMS_VER;
- }
-
- /**
- * Queries whether a given table exists
- * @return boolean
- */
- public function tableExists( $table, $fname = __METHOD__ ) {
- $schema = $this->mSchema;
-
- $sql = "SELECT COUNT( * ) FROM SYSIBM.SYSTABLES ST WHERE ST.NAME = '" .
- strtoupper( $table ) .
- "' AND ST.CREATOR = '" .
- strtoupper( $schema ) . "'";
- $res = $this->query( $sql );
- if ( !$res ) {
- return false;
- }
-
- // If the table exists, there should be one of it
- $row = $this->fetchRow( $res );
- $count = $row[0];
- if ( $count == '1' || $count == 1 ) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Fetch the next row from the given result object, in object form.
- * Fields can be retrieved with $row->fieldname, with fields acting like
- * member variables.
- *
- * @param $res array|ResultWrapper SQL result object as returned from Database::query(), etc.
- * @return DB2 row object
- * @throws DBUnexpectedError Thrown if the database returns an error
- */
- public function fetchObject( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- wfSuppressWarnings();
- $row = db2_fetch_object( $res );
- wfRestoreWarnings();
- if( $this->lastErrno() ) {
- throw new DBUnexpectedError( $this, 'Error in fetchObject(): '
- . htmlspecialchars( $this->lastError() ) );
- }
- return $row;
- }
-
- /**
- * Fetch the next row from the given result object, in associative array
- * form. Fields are retrieved with $row['fieldname'].
- *
- * @param $res array|ResultWrapper SQL result object as returned from Database::query(), etc.
- * @return ResultWrapper row object
- * @throws DBUnexpectedError Thrown if the database returns an error
- */
- public function fetchRow( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- if ( db2_num_rows( $res ) > 0) {
- wfSuppressWarnings();
- $row = db2_fetch_array( $res );
- wfRestoreWarnings();
- if ( $this->lastErrno() ) {
- throw new DBUnexpectedError( $this, 'Error in fetchRow(): '
- . htmlspecialchars( $this->lastError() ) );
- }
- return $row;
- }
- return false;
- }
-
- /**
- * Escapes strings
- * Doesn't escape numbers
- *
- * @param $s String: string to escape
- * @return string escaped string
- */
- public function addQuotes( $s ) {
- //$this->installPrint( "DB2::addQuotes( $s )\n" );
- if ( is_null( $s ) ) {
- return 'NULL';
- } elseif ( $s instanceof Blob ) {
- return "'" . $s->fetch( $s ) . "'";
- } elseif ( $s instanceof IBM_DB2Blob ) {
- return "'" . $this->decodeBlob( $s ) . "'";
- }
- $s = $this->strencode( $s );
- if ( is_numeric( $s ) ) {
- return $s;
- } else {
- return "'$s'";
- }
- }
-
- /**
- * Verifies that a DB2 column/field type is numeric
- *
- * @param $type String: DB2 column type
- * @return Boolean: true if numeric
- */
- public function is_numeric_type( $type ) {
- switch ( strtoupper( $type ) ) {
- case 'SMALLINT':
- case 'INTEGER':
- case 'INT':
- case 'BIGINT':
- case 'DECIMAL':
- case 'REAL':
- case 'DOUBLE':
- case 'DECFLOAT':
- return true;
- }
- return false;
- }
-
- /**
- * Alias for addQuotes()
- * @param $s String: string to escape
- * @return string escaped string
- */
- public function strencode( $s ) {
- // Bloody useless function
- // Prepends backslashes to \x00, \n, \r, \, ', " and \x1a.
- // But also necessary
- $s = db2_escape_string( $s );
- // Wide characters are evil -- some of them look like '
- $s = utf8_encode( $s );
- // Fix its stupidity
- $from = array( "\\\\", "\\'", '\\n', '\\t', '\\"', '\\r' );
- $to = array( "\\", "''", "\n", "\t", '"', "\r" );
- $s = str_replace( $from, $to, $s ); // DB2 expects '', not \' escaping
- return $s;
- }
-
- /**
- * Switch into the database schema
- */
- protected function applySchema() {
- if ( !( $this->mSchemaSet ) ) {
- $this->mSchemaSet = true;
- $this->begin( __METHOD__ );
- $this->doQuery( "SET SCHEMA = $this->mSchema" );
- $this->commit( __METHOD__ );
- }
- }
-
- /**
- * Start a transaction (mandatory)
- */
- protected function doBegin( $fname = 'DatabaseIbm_db2::begin' ) {
- // BEGIN is implicit for DB2
- // However, it requires that AutoCommit be off.
-
- // Some MediaWiki code is still transaction-less (?).
- // The strategy is to keep AutoCommit on for that code
- // but switch it off whenever a transaction is begun.
- db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_OFF );
-
- $this->mTrxLevel = 1;
- }
-
- /**
- * End a transaction
- * Must have a preceding begin()
- */
- protected function doCommit( $fname = 'DatabaseIbm_db2::commit' ) {
- db2_commit( $this->mConn );
-
- // Some MediaWiki code is still transaction-less (?).
- // The strategy is to keep AutoCommit on for that code
- // but switch it off whenever a transaction is begun.
- db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_ON );
-
- $this->mTrxLevel = 0;
- }
-
- /**
- * Cancel a transaction
- */
- protected function doRollback( $fname = 'DatabaseIbm_db2::rollback' ) {
- db2_rollback( $this->mConn );
- // turn auto-commit back on
- // not sure if this is appropriate
- db2_autocommit( $this->mConn, DB2_AUTOCOMMIT_ON );
- $this->mTrxLevel = 0;
- }
-
- /**
- * Makes an encoded list of strings from an array
- * $mode:
- * LIST_COMMA - comma separated, no field names
- * LIST_AND - ANDed WHERE clause (without the WHERE)
- * LIST_OR - ORed WHERE clause (without the WHERE)
- * LIST_SET - comma separated with field names, like a SET clause
- * LIST_NAMES - comma separated field names
- * LIST_SET_PREPARED - like LIST_SET, except with ? tokens as values
- * @return string
- */
- function makeList( $a, $mode = LIST_COMMA ) {
- if ( !is_array( $a ) ) {
- throw new DBUnexpectedError( $this,
- 'DatabaseIbm_db2::makeList called with incorrect parameters' );
- }
-
- // if this is for a prepared UPDATE statement
- // (this should be promoted to the parent class
- // once other databases use prepared statements)
- if ( $mode == LIST_SET_PREPARED ) {
- $first = true;
- $list = '';
- foreach ( $a as $field => $value ) {
- if ( !$first ) {
- $list .= ", $field = ?";
- } else {
- $list .= "$field = ?";
- $first = false;
- }
- }
- $list .= '';
-
- return $list;
- }
-
- // otherwise, call the usual function
- return parent::makeList( $a, $mode );
- }
-
- /**
- * Construct a LIMIT query with optional offset
- * This is used for query pages
- *
- * @param $sql string SQL query we will append the limit too
- * @param $limit integer the SQL limit
- * @param $offset integer the SQL offset (default false)
- * @return string
- */
- public function limitResult( $sql, $limit, $offset=false ) {
- if( !is_numeric( $limit ) ) {
- throw new DBUnexpectedError( $this,
- "Invalid non-numeric limit passed to limitResult()\n" );
- }
- if( $offset ) {
- if ( stripos( $sql, 'where' ) === false ) {
- return "$sql AND ( ROWNUM BETWEEN $offset AND $offset+$limit )";
- } else {
- return "$sql WHERE ( ROWNUM BETWEEN $offset AND $offset+$limit )";
- }
- }
- return "$sql FETCH FIRST $limit ROWS ONLY ";
- }
-
- /**
- * Handle reserved keyword replacement in table names
- *
- * @param $name Object
- * @param $format String Ignored parameter Default 'quoted'Boolean
- * @return String
- */
- public function tableName( $name, $format = 'quoted' ) {
- // we want maximum compatibility with MySQL schema
- return $name;
- }
-
- /**
- * Generates a timestamp in an insertable format
- *
- * @param $ts string timestamp
- * @return String: timestamp value
- */
- public function timestamp( $ts = 0 ) {
- // TS_MW cannot be easily distinguished from an integer
- return wfTimestamp( TS_DB2, $ts );
- }
-
- /**
- * Return the next in a sequence, save the value for retrieval via insertId()
- * @param $seqName String: name of a defined sequence in the database
- * @return int next value in that sequence
- */
- public function nextSequenceValue( $seqName ) {
- // Not using sequences in the primary schema to allow for easier migration
- // from MySQL
- // Emulating MySQL behaviour of using NULL to signal that sequences
- // aren't used
- /*
- $safeseq = preg_replace( "/'/", "''", $seqName );
- $res = $this->query( "VALUES NEXTVAL FOR $safeseq" );
- $row = $this->fetchRow( $res );
- $this->mInsertId = $row[0];
- return $this->mInsertId;
- */
- return null;
- }
-
- /**
- * This must be called after nextSequenceVal
- * @return int Last sequence value used as a primary key
- */
- public function insertId() {
- return $this->mInsertId;
- }
-
- /**
- * Updates the mInsertId property with the value of the last insert
- * into a generated column
- *
- * @param $table String: sanitized table name
- * @param $primaryKey Mixed: string name of the primary key
- * @param $stmt Resource: prepared statement resource
- * of the SELECT primary_key FROM FINAL TABLE ( INSERT ... ) form
- */
- private function calcInsertId( $table, $primaryKey, $stmt ) {
- if ( $primaryKey ) {
- $this->mInsertId = db2_last_insert_id( $this->mConn );
- }
- }
-
- /**
- * INSERT wrapper, inserts an array into a table
- *
- * $args may be a single associative array, or an array of arrays
- * with numeric keys, for multi-row insert
- *
- * @param $table String: Name of the table to insert to.
- * @param $args Array: Items to insert into the table.
- * @param $fname String: Name of the function, for profiling
- * @param $options String or Array. Valid options: IGNORE
- *
- * @return bool Success of insert operation. IGNORE always returns true.
- */
- public function insert( $table, $args, $fname = 'DatabaseIbm_db2::insert',
- $options = array() )
- {
- if ( !count( $args ) ) {
- return true;
- }
- // get database-specific table name (not used)
- $table = $this->tableName( $table );
- // format options as an array
- $options = IBM_DB2Helper::makeArray( $options );
- // format args as an array of arrays
- if ( !( isset( $args[0] ) && is_array( $args[0] ) ) ) {
- $args = array( $args );
- }
-
- // prevent insertion of NULL into primary key columns
- list( $args, $primaryKeys ) = $this->removeNullPrimaryKeys( $table, $args );
- // if there's only one primary key
- // we'll be able to read its value after insertion
- $primaryKey = false;
- if ( count( $primaryKeys ) == 1 ) {
- $primaryKey = $primaryKeys[0];
- }
-
- // get column names
- $keys = array_keys( $args[0] );
- $key_count = count( $keys );
-
- // If IGNORE is set, we use savepoints to emulate mysql's behavior
- $ignore = in_array( 'IGNORE', $options ) ? 'mw' : '';
-
- // assume success
- $res = true;
- // If we are not in a transaction, we need to be for savepoint trickery
- if ( !$this->mTrxLevel ) {
- $this->begin( __METHOD__ );
- }
-
- $sql = "INSERT INTO $table ( " . implode( ',', $keys ) . ' ) VALUES ';
- if ( $key_count == 1 ) {
- $sql .= '( ? )';
- } else {
- $sql .= '( ?' . str_repeat( ',?', $key_count-1 ) . ' )';
- }
- $this->installPrint( "Preparing the following SQL:" );
- $this->installPrint( "$sql" );
- $this->installPrint( print_r( $args, true ));
- $stmt = $this->prepare( $sql );
-
- // start a transaction/enter transaction mode
- $this->begin( __METHOD__ );
-
- if ( !$ignore ) {
- //$first = true;
- foreach ( $args as $row ) {
- //$this->installPrint( "Inserting " . print_r( $row, true ));
- // insert each row into the database
- $res = $res & $this->execute( $stmt, $row );
- if ( !$res ) {
- $this->installPrint( 'Last error:' );
- $this->installPrint( $this->lastError() );
- }
- // get the last inserted value into a generated column
- $this->calcInsertId( $table, $primaryKey, $stmt );
- }
- } else {
- $olde = error_reporting( 0 );
- // For future use, we may want to track the number of actual inserts
- // Right now, insert (all writes) simply return true/false
- $numrowsinserted = 0;
-
- // always return true
- $res = true;
-
- foreach ( $args as $row ) {
- $overhead = "SAVEPOINT $ignore ON ROLLBACK RETAIN CURSORS";
- db2_exec( $this->mConn, $overhead, $this->mStmtOptions );
-
- $res2 = $this->execute( $stmt, $row );
-
- if ( !$res2 ) {
- $this->installPrint( 'Last error:' );
- $this->installPrint( $this->lastError() );
- }
- // get the last inserted value into a generated column
- $this->calcInsertId( $table, $primaryKey, $stmt );
-
- $errNum = $this->lastErrno();
- if ( $errNum ) {
- db2_exec( $this->mConn, "ROLLBACK TO SAVEPOINT $ignore",
- $this->mStmtOptions );
- } else {
- db2_exec( $this->mConn, "RELEASE SAVEPOINT $ignore",
- $this->mStmtOptions );
- $numrowsinserted++;
- }
- }
-
- $olde = error_reporting( $olde );
- // Set the affected row count for the whole operation
- $this->mAffectedRows = $numrowsinserted;
- }
- // commit either way
- $this->commit( __METHOD__ );
- $this->freePrepared( $stmt );
-
- return $res;
- }
-
- /**
- * Given a table name and a hash of columns with values
- * Removes primary key columns from the hash where the value is NULL
- *
- * @param $table String: name of the table
- * @param $args Array of hashes of column names with values
- * @return Array: tuple( filtered array of columns, array of primary keys )
- */
- private function removeNullPrimaryKeys( $table, $args ) {
- $schema = $this->mSchema;
-
- // find out the primary keys
- $keyres = $this->doQuery( "SELECT NAME FROM SYSIBM.SYSCOLUMNS WHERE TBNAME = '"
- . strtoupper( $table )
- . "' AND TBCREATOR = '"
- . strtoupper( $schema )
- . "' AND KEYSEQ > 0" );
-
- $keys = array();
- for (
- $row = $this->fetchRow( $keyres );
- $row != null;
- $row = $this->fetchRow( $keyres )
- )
- {
- $keys[] = strtolower( $row[0] );
- }
- // remove primary keys
- foreach ( $args as $ai => $row ) {
- foreach ( $keys as $key ) {
- if ( $row[$key] == null ) {
- unset( $row[$key] );
- }
- }
- $args[$ai] = $row;
- }
- // return modified hash
- return array( $args, $keys );
- }
-
- /**
- * UPDATE wrapper, takes a condition array and a SET array
- *
- * @param $table String: The table to UPDATE
- * @param $values array An array of values to SET
- * @param $conds array An array of conditions ( WHERE ). Use '*' to update all rows.
- * @param $fname String: The Class::Function calling this function
- * ( for the log )
- * @param $options array An array of UPDATE options, can be one or
- * more of IGNORE, LOW_PRIORITY
- * @return Boolean
- */
- public function update( $table, $values, $conds, $fname = 'DatabaseIbm_db2::update',
- $options = array() )
- {
- $table = $this->tableName( $table );
- $opts = $this->makeUpdateOptions( $options );
- $sql = "UPDATE $opts $table SET "
- . $this->makeList( $values, LIST_SET_PREPARED );
- if ( $conds != '*' ) {
- $sql .= " WHERE " . $this->makeList( $conds, LIST_AND );
- }
- $stmt = $this->prepare( $sql );
- $this->installPrint( 'UPDATE: ' . print_r( $values, true ) );
- // assuming for now that an array with string keys will work
- // if not, convert to simple array first
- $result = $this->execute( $stmt, $values );
- $this->freePrepared( $stmt );
-
- return $result;
- }
-
- /**
- * DELETE query wrapper
- *
- * Use $conds == "*" to delete all rows
- * @return bool|\ResultWrapper
- */
- public function delete( $table, $conds, $fname = 'DatabaseIbm_db2::delete' ) {
- if ( !$conds ) {
- throw new DBUnexpectedError( $this,
- 'DatabaseIbm_db2::delete() called with no conditions' );
- }
- $table = $this->tableName( $table );
- $sql = "DELETE FROM $table";
- if ( $conds != '*' ) {
- $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
- }
- $result = $this->query( $sql, $fname );
-
- return $result;
- }
-
- /**
- * Returns the number of rows affected by the last query or 0
- * @return Integer: the number of rows affected by the last query
- */
- public function affectedRows() {
- if ( !is_null( $this->mAffectedRows ) ) {
- // Forced result for simulated queries
- return $this->mAffectedRows;
- }
- if( empty( $this->mLastResult ) ) {
- return 0;
- }
- return db2_num_rows( $this->mLastResult );
- }
-
- /**
- * Returns the number of rows in the result set
- * Has to be called right after the corresponding select query
- * @param $res Object result set
- * @return Integer: number of rows
- */
- public function numRows( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
-
- if ( $this->mNumRows ) {
- return $this->mNumRows;
- } else {
- return 0;
- }
- }
-
- /**
- * Moves the row pointer of the result set
- * @param $res Object: result set
- * @param $row Integer: row number
- * @return bool success or failure
- */
- public function dataSeek( $res, $row ) {
- if ( $res instanceof ResultWrapper ) {
- return $res = $res->result;
- }
- if ( $res instanceof IBM_DB2Result ) {
- return $res->dataSeek( $row );
- }
- wfDebug( "dataSeek operation in DB2 database\n" );
- return false;
- }
-
- ###
- # Fix notices in Block.php
- ###
-
- /**
- * Frees memory associated with a statement resource
- * @param $res Object: statement resource to free
- * @return Boolean success or failure
- */
- public function freeResult( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- wfSuppressWarnings();
- $ok = db2_free_result( $res );
- wfRestoreWarnings();
- if ( !$ok ) {
- throw new DBUnexpectedError( $this, "Unable to free DB2 result\n" );
- }
- }
-
- /**
- * Returns the number of columns in a resource
- * @param $res Object: statement resource
- * @return Number of fields/columns in resource
- */
- public function numFields( $res ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- if ( $res instanceof IBM_DB2Result ) {
- $res = $res->getResult();
- }
- return db2_num_fields( $res );
- }
-
- /**
- * Returns the nth column name
- * @param $res Object: statement resource
- * @param $n Integer: Index of field or column
- * @return String name of nth column
- */
- public function fieldName( $res, $n ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- if ( $res instanceof IBM_DB2Result ) {
- $res = $res->getResult();
- }
- return db2_field_name( $res, $n );
- }
-
- /**
- * SELECT wrapper
- *
- * @param $table Array or string, table name(s) (prefix auto-added)
- * @param $vars Array or string, field name(s) to be retrieved
- * @param $conds Array or string, condition(s) for WHERE
- * @param $fname String: calling function name (use __METHOD__)
- * for logs/profiling
- * @param $options array Associative array of options
- * (e.g. array( 'GROUP BY' => 'page_title' )),
- * see Database::makeSelectOptions code for list of
- * supported stuff
- * @param $join_conds array Associative array of table join conditions (optional)
- * (e.g. array( 'page' => array('LEFT JOIN',
- * 'page_latest=rev_id') )
- * @return Mixed: database result resource for fetch functions or false
- * on failure
- */
- public function select( $table, $vars, $conds = '', $fname = 'DatabaseIbm_db2::select', $options = array(), $join_conds = array() )
- {
- $res = parent::select( $table, $vars, $conds, $fname, $options,
- $join_conds );
- $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
-
- // We must adjust for offset
- if ( isset( $options['LIMIT'] ) && isset ( $options['OFFSET'] ) ) {
- $limit = $options['LIMIT'];
- $offset = $options['OFFSET'];
- }
-
- // DB2 does not have a proper num_rows() function yet, so we must emulate
- // DB2 9.5.4 and the corresponding ibm_db2 driver will introduce
- // a working one
- // TODO: Yay!
-
- // we want the count
- $vars2 = array( 'count( * ) as num_rows' );
- // respecting just the limit option
- $options2 = array();
- if ( isset( $options['LIMIT'] ) ) {
- $options2['LIMIT'] = $options['LIMIT'];
- }
- // but don't try to emulate for GROUP BY
- if ( isset( $options['GROUP BY'] ) ) {
- return $res;
- }
-
- $res2 = parent::select( $table, $vars2, $conds, $fname, $options2,
- $join_conds );
-
- $obj = $this->fetchObject( $res2 );
- $this->mNumRows = $obj->num_rows;
-
- return new ResultWrapper( $this, new IBM_DB2Result( $this, $res, $obj->num_rows, $vars, $sql ) );
- }
-
- /**
- * Handles ordering, grouping, and having options ('GROUP BY' => colname)
- * Has limited support for per-column options (colnum => 'DISTINCT')
- *
- * @private
- *
- * @param $options array Associative array of options to be turned into
- * an SQL query, valid keys are listed in the function.
- * @return Array
- */
- function makeSelectOptions( $options ) {
- $preLimitTail = $postLimitTail = '';
- $startOpts = '';
-
- $noKeyOptions = array();
- foreach ( $options as $key => $option ) {
- if ( is_numeric( $key ) ) {
- $noKeyOptions[$option] = true;
- }
- }
-
- if ( isset( $options['GROUP BY'] ) ) {
- $preLimitTail .= " GROUP BY {$options['GROUP BY']}";
- }
- if ( isset( $options['HAVING'] ) ) {
- $preLimitTail .= " HAVING {$options['HAVING']}";
- }
- if ( isset( $options['ORDER BY'] ) ) {
- $preLimitTail .= " ORDER BY {$options['ORDER BY']}";
- }
-
- if ( isset( $noKeyOptions['DISTINCT'] )
- || isset( $noKeyOptions['DISTINCTROW'] ) )
- {
- $startOpts .= 'DISTINCT';
- }
-
- return array( $startOpts, '', $preLimitTail, $postLimitTail );
- }
-
- /**
- * Returns link to IBM DB2 free download
- * @return String: wikitext of a link to the server software's web site
- */
- public static function getSoftwareLink() {
- return '[http://www.ibm.com/db2/express/ IBM DB2]';
- }
-
- /**
- * Get search engine class. All subclasses of this
- * need to implement this if they wish to use searching.
- *
- * @return String
- */
- public function getSearchEngine() {
- return 'SearchIBM_DB2';
- }
-
- /**
- * Did the last database access fail because of deadlock?
- * @return Boolean
- */
- public function wasDeadlock() {
- // get SQLSTATE
- $err = $this->lastErrno();
- switch( $err ) {
- // This is literal port of the MySQL logic and may be wrong for DB2
- case '40001': // sql0911n, Deadlock or timeout, rollback
- case '57011': // sql0904n, Resource unavailable, no rollback
- case '57033': // sql0913n, Deadlock or timeout, no rollback
- $this->installPrint( "In a deadlock because of SQLSTATE $err" );
- return true;
- }
- return false;
- }
-
- /**
- * Ping the server and try to reconnect if it there is no connection
- * The connection may be closed and reopened while this happens
- * @return Boolean: whether the connection exists
- */
- public function ping() {
- // db2_ping() doesn't exist
- // Emulate
- $this->close();
- $this->openUncataloged( $this->mDBName, $this->mUser,
- $this->mPassword, $this->mServer, $this->mPort );
-
- return false;
- }
- ######################################
- # Unimplemented and not applicable
- ######################################
-
- /**
- * Only useful with fake prepare like in base Database class
- * @return string
- */
- public function fillPreparedArg( $matches ) {
- $this->installPrint( 'Not useful for DB2: fillPreparedArg()' );
- return '';
- }
-
- ######################################
- # Reflection
- ######################################
-
- /**
- * Returns information about an index
- * If errors are explicitly ignored, returns NULL on failure
- * @param $table String: table name
- * @param $index String: index name
- * @param $fname String: function name for logging and profiling
- * @return Object query row in object form
- */
- public function indexInfo( $table, $index,
- $fname = 'DatabaseIbm_db2::indexExists' )
- {
- $table = $this->tableName( $table );
- $sql = <<<SQL
-SELECT name as indexname
-FROM sysibm.sysindexes si
-WHERE si.name='$index' AND si.tbname='$table'
-AND sc.tbcreator='$this->mSchema'
-SQL;
- $res = $this->query( $sql, $fname );
- if ( !$res ) {
- return null;
- }
- $row = $this->fetchObject( $res );
- if ( $row != null ) {
- return $row;
- } else {
- return false;
- }
- }
-
- /**
- * Returns an information object on a table column
- * @param $table String: table name
- * @param $field String: column name
- * @return IBM_DB2Field
- */
- public function fieldInfo( $table, $field ) {
- return IBM_DB2Field::fromText( $this, $table, $field );
- }
-
- /**
- * db2_field_type() wrapper
- * @param $res Object: result of executed statement
- * @param $index Mixed: number or name of the column
- * @return String column type
- */
- public function fieldType( $res, $index ) {
- if ( $res instanceof ResultWrapper ) {
- $res = $res->result;
- }
- if ( $res instanceof IBM_DB2Result ) {
- $res = $res->getResult();
- }
- return db2_field_type( $res, $index );
- }
-
- /**
- * Verifies that an index was created as unique
- * @param $table String: table name
- * @param $index String: index name
- * @param $fname string function name for profiling
- * @return Bool
- */
- public function indexUnique ( $table, $index,
- $fname = 'DatabaseIbm_db2::indexUnique' )
- {
- $table = $this->tableName( $table );
- $sql = <<<SQL
-SELECT si.name as indexname
-FROM sysibm.sysindexes si
-WHERE si.name='$index' AND si.tbname='$table'
-AND sc.tbcreator='$this->mSchema'
-AND si.uniquerule IN ( 'U', 'P' )
-SQL;
- $res = $this->query( $sql, $fname );
- if ( !$res ) {
- return null;
- }
- if ( $this->fetchObject( $res ) ) {
- return true;
- }
- return false;
-
- }
-
- /**
- * Returns the size of a text field, or -1 for "unlimited"
- * @param $table String: table name
- * @param $field String: column name
- * @return Integer: length or -1 for unlimited
- */
- public function textFieldSize( $table, $field ) {
- $table = $this->tableName( $table );
- $sql = <<<SQL
-SELECT length as size
-FROM sysibm.syscolumns sc
-WHERE sc.name='$field' AND sc.tbname='$table'
-AND sc.tbcreator='$this->mSchema'
-SQL;
- $res = $this->query( $sql );
- $row = $this->fetchObject( $res );
- $size = $row->size;
- return $size;
- }
-
- /**
- * Description is left as an exercise for the reader
- * @param $b Mixed: data to be encoded
- * @return IBM_DB2Blob
- */
- public function encodeBlob( $b ) {
- return new IBM_DB2Blob( $b );
- }
-
- /**
- * Description is left as an exercise for the reader
- * @param $b IBM_DB2Blob: data to be decoded
- * @return mixed
- */
- public function decodeBlob( $b ) {
- return "$b";
- }
-
- /**
- * Convert into a list of string being concatenated
- * @param $stringList Array: strings that need to be joined together
- * by the SQL engine
- * @return String: joined by the concatenation operator
- */
- public function buildConcat( $stringList ) {
- // || is equivalent to CONCAT
- // Sample query: VALUES 'foo' CONCAT 'bar' CONCAT 'baz'
- return implode( ' || ', $stringList );
- }
-
- /**
- * Generates the SQL required to convert a DB2 timestamp into a Unix epoch
- * @param $column String: name of timestamp column
- * @return String: SQL code
- */
- public function extractUnixEpoch( $column ) {
- // TODO
- // see SpecialAncientpages
- }
-
- ######################################
- # Prepared statements
- ######################################
-
- /**
- * Intended to be compatible with the PEAR::DB wrapper functions.
- * http://pear.php.net/manual/en/package.database.db.intro-execute.php
- *
- * ? = scalar value, quoted as necessary
- * ! = raw SQL bit (a function for instance)
- * & = filename; reads the file and inserts as a blob
- * (we don't use this though...)
- * @param $sql String: SQL statement with appropriate markers
- * @param $func String: Name of the function, for profiling
- * @return resource a prepared DB2 SQL statement
- */
- public function prepare( $sql, $func = 'DB2::prepare' ) {
- $stmt = db2_prepare( $this->mConn, $sql, $this->mStmtOptions );
- return $stmt;
- }
-
- /**
- * Frees resources associated with a prepared statement
- * @return Boolean success or failure
- */
- public function freePrepared( $prepared ) {
- return db2_free_stmt( $prepared );
- }
-
- /**
- * Execute a prepared query with the various arguments
- * @param $prepared String: the prepared sql
- * @param $args Mixed: either an array here, or put scalars as varargs
- * @return Resource: results object
- */
- public function execute( $prepared, $args = null ) {
- if( !is_array( $args ) ) {
- # Pull the var args
- $args = func_get_args();
- array_shift( $args );
- }
- $res = db2_execute( $prepared, $args );
- if ( !$res ) {
- $this->installPrint( db2_stmt_errormsg() );
- }
- return $res;
- }
-
- /**
- * For faking prepared SQL statements on DBs that don't support
- * it directly.
- * @param $preparedQuery String: a 'preparable' SQL statement
- * @param $args Array of arguments to fill it with
- * @return String: executable statement
- */
- public function fillPrepared( $preparedQuery, $args ) {
- reset( $args );
- $this->preparedArgs =& $args;
-
- foreach ( $args as $i => $arg ) {
- db2_bind_param( $preparedQuery, $i+1, $args[$i] );
- }
-
- return $preparedQuery;
- }
-
- /**
- * Switches module between regular and install modes
- * @return string
- */
- public function setMode( $mode ) {
- $old = $this->mMode;
- $this->mMode = $mode;
- return $old;
- }
-
- /**
- * Bitwise negation of a column or value in SQL
- * Same as (~field) in C
- * @param $field String
- * @return String
- */
- function bitNot( $field ) {
- // expecting bit-fields smaller than 4bytes
- return "BITNOT( $field )";
- }
-
- /**
- * Bitwise AND of two columns or values in SQL
- * Same as (fieldLeft & fieldRight) in C
- * @param $fieldLeft String
- * @param $fieldRight String
- * @return String
- */
- function bitAnd( $fieldLeft, $fieldRight ) {
- return "BITAND( $fieldLeft, $fieldRight )";
- }
-
- /**
- * Bitwise OR of two columns or values in SQL
- * Same as (fieldLeft | fieldRight) in C
- * @param $fieldLeft String
- * @param $fieldRight String
- * @return String
- */
- function bitOr( $fieldLeft, $fieldRight ) {
- return "BITOR( $fieldLeft, $fieldRight )";
- }
-}
-
-class IBM_DB2Helper {
- public static function makeArray( $maybeArray ) {
- if ( !is_array( $maybeArray ) ) {
- return array( $maybeArray );
- }
-
- return $maybeArray;
- }
-}
diff --git a/includes/db/DatabaseMssql.php b/includes/db/DatabaseMssql.php
index 914ab408..6c45ffaf 100644
--- a/includes/db/DatabaseMssql.php
+++ b/includes/db/DatabaseMssql.php
@@ -28,9 +28,9 @@
* @ingroup Database
*/
class DatabaseMssql extends DatabaseBase {
- var $mInsertId = NULL;
- var $mLastResult = NULL;
- var $mAffectedRows = NULL;
+ var $mInsertId = null;
+ var $mLastResult = null;
+ var $mAffectedRows = null;
var $mPort;
@@ -61,6 +61,11 @@ class DatabaseMssql extends DatabaseBase {
/**
* Usually aborts on failure
+ * @param string $server
+ * @param string $user
+ * @param string $password
+ * @param string $dbName
+ * @throws DBConnectionError
* @return bool|DatabaseBase|null
*/
function open( $server, $user, $password, $dbName ) {
@@ -97,7 +102,7 @@ class DatabaseMssql extends DatabaseBase {
$ntAuthPassTest = strtolower( $password );
// Decide which auth scenerio to use
- if( $ntAuthPassTest == 'ntauth' && $ntAuthUserTest == 'ntauth' ){
+ if( $ntAuthPassTest == 'ntauth' && $ntAuthUserTest == 'ntauth' ) {
// Don't add credentials to $connectionInfo
} else {
$connectionInfo['UID'] = $user;
@@ -139,7 +144,7 @@ class DatabaseMssql extends DatabaseBase {
// $this->limitResult();
if ( preg_match( '/\bLIMIT\s*/i', $sql ) ) {
// massage LIMIT -> TopN
- $sql = $this->LimitToTopN( $sql ) ;
+ $sql = $this->LimitToTopN( $sql );
}
// MSSQL doesn't have EXTRACT(epoch FROM XXX)
@@ -151,7 +156,7 @@ class DatabaseMssql extends DatabaseBase {
// perform query
$stmt = sqlsrv_query( $this->mConn, $sql );
if ( $stmt == false ) {
- $message = "A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: http://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script\n" .
+ $message = "A database error has occurred. Did you forget to run maintenance/update.php after upgrading? See: http://www.mediawiki.org/wiki/Manual:Upgrading#Run_the_update_script\n" .
"Query: " . htmlentities( $sql ) . "\n" .
"Function: " . __METHOD__ . "\n";
// process each error (our driver will give us an array of errors unlike other providers)
@@ -279,7 +284,7 @@ class DatabaseMssql extends DatabaseBase {
* @param $vars Mixed: array or string, field name(s) to be retrieved
* @param $conds Mixed: array or string, condition(s) for WHERE
* @param $fname String: calling function name (use __METHOD__) for logs/profiling
- * @param $options Array: associative array of options (e.g. array('GROUP BY' => 'page_title')),
+ * @param array $options associative array of options (e.g. array('GROUP BY' => 'page_title')),
* see Database::makeSelectOptions code for list of supported stuff
* @param $join_conds Array: Associative array of table join conditions (optional)
* (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
@@ -304,7 +309,7 @@ class DatabaseMssql extends DatabaseBase {
* @param $vars Mixed: Array or string, field name(s) to be retrieved
* @param $conds Mixed: Array or string, condition(s) for WHERE
* @param $fname String: Calling function name (use __METHOD__) for logs/profiling
- * @param $options Array: Associative array of options (e.g. array('GROUP BY' => 'page_title')),
+ * @param array $options Associative array of options (e.g. array('GROUP BY' => 'page_title')),
* see Database::makeSelectOptions code for list of supported stuff
* @param $join_conds Array: Associative array of table join conditions (optional)
* (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
@@ -314,7 +319,7 @@ class DatabaseMssql extends DatabaseBase {
if ( isset( $options['EXPLAIN'] ) ) {
unset( $options['EXPLAIN'] );
}
- return parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
+ return parent::selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
}
/**
@@ -348,7 +353,7 @@ class DatabaseMssql extends DatabaseBase {
$sql = "sp_helpindex '" . $table . "'";
$res = $this->query( $sql, $fname );
if ( !$res ) {
- return NULL;
+ return null;
}
$result = array();
@@ -380,6 +385,11 @@ class DatabaseMssql extends DatabaseBase {
*
* Usually aborts on failure
* If errors are explicitly ignored, returns success
+ * @param string $table
+ * @param array $arrToInsert
+ * @param string $fname
+ * @param array $options
+ * @throws DBQueryError
* @return bool
*/
function insert( $table, $arrToInsert, $fname = 'DatabaseMssql::insert', $options = array() ) {
@@ -404,7 +414,7 @@ class DatabaseMssql extends DatabaseBase {
$identity = null;
$tableRaw = preg_replace( '#\[([^\]]*)\]#', '$1', $table ); // strip matching square brackets from table name
$res = $this->doQuery( "SELECT NAME AS idColumn FROM SYS.IDENTITY_COLUMNS WHERE OBJECT_NAME(OBJECT_ID)='{$tableRaw}'" );
- if( $res && $res->numrows() ){
+ if( $res && $res->numrows() ) {
// There is an identity for this table.
$identity = array_pop( $res->fetch( SQLSRV_FETCH_ASSOC ) );
}
@@ -421,9 +431,9 @@ class DatabaseMssql extends DatabaseBase {
// iterate through
foreach ($a as $k => $v ) {
if ( $k == $identity ) {
- if( !is_null($v) ){
+ if( !is_null($v) ) {
// there is a value being passed to us, we need to turn on and off inserted identity
- $sqlPre = "SET IDENTITY_INSERT $table ON;" ;
+ $sqlPre = "SET IDENTITY_INSERT $table ON;";
$sqlPost = ";SET IDENTITY_INSERT $table OFF;";
} else {
@@ -474,7 +484,7 @@ class DatabaseMssql extends DatabaseBase {
} elseif ( is_array( $value ) || is_object( $value ) ) {
if ( is_object( $value ) && strtolower( get_class( $value ) ) == 'blob' ) {
$sql .= $this->addQuotes( $value );
- } else {
+ } else {
$sql .= $this->addQuotes( serialize( $value ) );
}
} else {
@@ -488,7 +498,7 @@ class DatabaseMssql extends DatabaseBase {
if ( $ret === false ) {
throw new DBQueryError( $this, $this->getErrors(), $this->lastErrno(), $sql, $fname );
- } elseif ( $ret != NULL ) {
+ } elseif ( $ret != null ) {
// remember number of rows affected
$this->mAffectedRows = sqlsrv_rows_affected( $ret );
if ( !is_null($identity) ) {
@@ -510,7 +520,15 @@ class DatabaseMssql extends DatabaseBase {
* Source items may be literals rather than field names, but strings should be quoted with Database::addQuotes()
* $conds may be "*" to copy the whole table
* srcTable may be an array of tables.
- * @return null|\ResultWrapper
+ * @param string $destTable
+ * @param array|string $srcTable
+ * @param array $varMap
+ * @param array $conds
+ * @param string $fname
+ * @param array $insertOptions
+ * @param array $selectOptions
+ * @throws DBQueryError
+ * @return null|ResultWrapper
*/
function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabaseMssql::insertSelect',
$insertOptions = array(), $selectOptions = array() ) {
@@ -518,12 +536,12 @@ class DatabaseMssql extends DatabaseBase {
if ( $ret === false ) {
throw new DBQueryError( $this, $this->getErrors(), $this->lastErrno(), /*$sql*/ '', $fname );
- } elseif ( $ret != NULL ) {
+ } elseif ( $ret != null ) {
// remember number of rows affected
$this->mAffectedRows = sqlsrv_rows_affected( $ret );
return $ret;
}
- return NULL;
+ return null;
}
/**
@@ -590,9 +608,9 @@ class DatabaseMssql extends DatabaseBase {
} else {
$sql = '
SELECT * FROM (
- SELECT sub2.*, ROW_NUMBER() OVER(ORDER BY sub2.line2) AS line3 FROM (
- SELECT 1 AS line2, sub1.* FROM (' . $sql . ') AS sub1
- ) as sub2
+ SELECT sub2.*, ROW_NUMBER() OVER(ORDER BY sub2.line2) AS line3 FROM (
+ SELECT 1 AS line2, sub1.* FROM (' . $sql . ') AS sub1
+ ) as sub2
) AS sub3
WHERE line3 BETWEEN ' . ( $offset + 1 ) . ' AND ' . ( $offset + $limit );
return $sql;
@@ -720,6 +738,8 @@ class DatabaseMssql extends DatabaseBase {
* Escapes a identifier for use inm SQL.
* Throws an exception if it is invalid.
* Reference: http://msdn.microsoft.com/en-us/library/aa224033%28v=SQL.80%29.aspx
+ * @param $identifier
+ * @throws MWException
* @return string
*/
private function escapeIdentifier( $identifier ) {
@@ -750,17 +770,17 @@ class DatabaseMssql extends DatabaseBase {
$newUser = $this->escapeIdentifier( $newUser );
$loginPassword = $this->addQuotes( $loginPassword );
- $this->doQuery("CREATE DATABASE $dbName;");
- $this->doQuery("USE $dbName;");
- $this->doQuery("CREATE SCHEMA $dbName;");
- $this->doQuery("
+ $this->doQuery( "CREATE DATABASE $dbName;" );
+ $this->doQuery( "USE $dbName;" );
+ $this->doQuery( "CREATE SCHEMA $dbName;" );
+ $this->doQuery( "
CREATE
LOGIN $newUser
WITH
PASSWORD=$loginPassword
;
- ");
- $this->doQuery("
+ " );
+ $this->doQuery( "
CREATE
USER $newUser
FOR
@@ -768,8 +788,8 @@ class DatabaseMssql extends DatabaseBase {
WITH
DEFAULT_SCHEMA=$dbName
;
- ");
- $this->doQuery("
+ " );
+ $this->doQuery( "
GRANT
BACKUP DATABASE,
BACKUP LOG,
@@ -784,17 +804,15 @@ class DatabaseMssql extends DatabaseBase {
DATABASE::$dbName
TO $newUser
;
- ");
- $this->doQuery("
+ " );
+ $this->doQuery( "
GRANT
CONTROL
ON
SCHEMA::$dbName
TO $newUser
;
- ");
-
-
+ " );
}
function encodeBlob( $b ) {
@@ -873,7 +891,7 @@ class DatabaseMssql extends DatabaseBase {
/**
* @private
*
- * @param $options Array: an associative array of options to be turned into
+ * @param array $options an associative array of options to be turned into
* an SQL query, valid keys are listed in the function.
* @return Array
*/
@@ -888,29 +906,23 @@ class DatabaseMssql extends DatabaseBase {
}
}
- if ( isset( $options['GROUP BY'] ) ) {
- $tailOpts .= " GROUP BY {$options['GROUP BY']}";
- }
- if ( isset( $options['HAVING'] ) ) {
- $tailOpts .= " HAVING {$options['GROUP BY']}";
- }
- if ( isset( $options['ORDER BY'] ) ) {
- $tailOpts .= " ORDER BY {$options['ORDER BY']}";
- }
+ $tailOpts .= $this->makeGroupByWithHaving( $options );
+
+ $tailOpts .= $this->makeOrderBy( $options );
if ( isset( $noKeyOptions['DISTINCT'] ) && isset( $noKeyOptions['DISTINCTROW'] ) ) {
$startOpts .= 'DISTINCT';
}
// we want this to be compatible with the output of parent::makeSelectOptions()
- return array( $startOpts, '' , $tailOpts, '' );
+ return array( $startOpts, '', $tailOpts, '' );
}
/**
* Get the type of the DBMS, as it appears in $wgDBtype.
* @return string
*/
- function getType(){
+ function getType() {
return 'mssql';
}
@@ -1118,6 +1130,5 @@ class MssqlResult {
public function free() {
unset( $this->mRows );
- return;
}
}
diff --git a/includes/db/DatabaseMysql.php b/includes/db/DatabaseMysql.php
index 7f389da9..27aae188 100644
--- a/includes/db/DatabaseMysql.php
+++ b/includes/db/DatabaseMysql.php
@@ -133,7 +133,7 @@ class DatabaseMysql extends DatabaseBase {
substr( $password, 0, 3 ) . "..., error: " . $error . "\n" );
wfProfileOut( __METHOD__ );
- $this->reportConnectionError( $error );
+ return $this->reportConnectionError( $error );
}
if ( $dbName != '' ) {
@@ -146,7 +146,7 @@ class DatabaseMysql extends DatabaseBase {
"from client host " . wfHostname() . "\n" );
wfProfileOut( __METHOD__ );
- $this->reportConnectionError( "Error selecting database $dbName" );
+ return $this->reportConnectionError( "Error selecting database $dbName" );
}
}
@@ -193,7 +193,7 @@ class DatabaseMysql extends DatabaseBase {
/**
* @param $res ResultWrapper
- * @return object|stdClass
+ * @return object|bool
* @throws DBUnexpectedError
*/
function fetchObject( $res ) {
@@ -208,7 +208,7 @@ class DatabaseMysql extends DatabaseBase {
// Unfortunately, mysql_fetch_object does not reset the last errno.
// Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
// these are the only errors mysql_fetch_object can cause.
- // See http://dev.mysql.com/doc/refman/5.0/es/mysql-fetch-row.html.
+ // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
if( $errno == 2000 || $errno == 2013 ) {
throw new DBUnexpectedError( $this, 'Error in fetchObject(): ' . htmlspecialchars( $this->lastError() ) );
}
@@ -217,7 +217,7 @@ class DatabaseMysql extends DatabaseBase {
/**
* @param $res ResultWrapper
- * @return array
+ * @return array|bool
* @throws DBUnexpectedError
*/
function fetchRow( $res ) {
@@ -232,7 +232,7 @@ class DatabaseMysql extends DatabaseBase {
// Unfortunately, mysql_fetch_array does not reset the last errno.
// Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
// these are the only errors mysql_fetch_object can cause.
- // See http://dev.mysql.com/doc/refman/5.0/es/mysql-fetch-row.html.
+ // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
if( $errno == 2000 || $errno == 2013 ) {
throw new DBUnexpectedError( $this, 'Error in fetchRow(): ' . htmlspecialchars( $this->lastError() ) );
}
@@ -251,9 +251,11 @@ class DatabaseMysql extends DatabaseBase {
wfSuppressWarnings();
$n = mysql_num_rows( $res );
wfRestoreWarnings();
- if( $this->lastErrno() ) {
- throw new DBUnexpectedError( $this, 'Error in numRows(): ' . htmlspecialchars( $this->lastError() ) );
- }
+ // Unfortunately, mysql_num_rows does not reset the last errno.
+ // We are not checking for any errors here, since
+ // these are no errors mysql_num_rows can cause.
+ // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
+ // See https://bugzilla.wikimedia.org/42430
return $n;
}
@@ -361,7 +363,7 @@ class DatabaseMysql extends DatabaseBase {
* @param $options string|array
* @return int
*/
- public function estimateRowCount( $table, $vars='*', $conds='', $fname = 'DatabaseMysql::estimateRowCount', $options = array() ) {
+ public function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabaseMysql::estimateRowCount', $options = array() ) {
$options['EXPLAIN'] = true;
$res = $this->select( $table, $vars, $conds, $fname, $options );
if ( $res === false ) {
@@ -393,7 +395,7 @@ class DatabaseMysql extends DatabaseBase {
for( $i = 0; $i < $n; $i++ ) {
$meta = mysql_fetch_field( $res->result, $i );
if( $field == $meta->name ) {
- return new MySQLField($meta);
+ return new MySQLField( $meta );
}
}
return false;
@@ -414,6 +416,7 @@ class DatabaseMysql extends DatabaseBase {
# http://dev.mysql.com/doc/mysql/en/SHOW_INDEX.html
$table = $this->tableName( $table );
$index = $this->indexName( $index );
+
$sql = 'SHOW INDEX FROM ' . $table;
$res = $this->query( $sql, $fname );
@@ -428,7 +431,6 @@ class DatabaseMysql extends DatabaseBase {
$result[] = $row;
}
}
-
return empty( $result ) ? false : $result;
}
@@ -449,7 +451,7 @@ class DatabaseMysql extends DatabaseBase {
function strencode( $s ) {
$sQuoted = mysql_real_escape_string( $s, $this->mConn );
- if($sQuoted === false) {
+ if( $sQuoted === false ) {
$this->ping();
$sQuoted = mysql_real_escape_string( $s, $this->mConn );
}
@@ -597,10 +599,9 @@ class DatabaseMysql extends DatabaseBase {
if ( $res && $row = $this->fetchRow( $res ) ) {
wfProfileOut( $fname );
return $row[0];
- } else {
- wfProfileOut( $fname );
- return false;
}
+ wfProfileOut( $fname );
+ return false;
}
/**
@@ -686,7 +687,7 @@ class DatabaseMysql extends DatabaseBase {
public function streamStatementEnd( &$sql, &$newLine ) {
if ( strtoupper( substr( $newLine, 0, 9 ) ) == 'DELIMITER' ) {
- preg_match( '/^DELIMITER\s+(\S+)/' , $newLine, $m );
+ preg_match( '/^DELIMITER\s+(\S+)/', $newLine, $m );
$this->delimiter = $m[1];
$newLine = '';
}
@@ -696,8 +697,8 @@ class DatabaseMysql extends DatabaseBase {
/**
* Check to see if a named lock is available. This is non-blocking.
*
- * @param $lockName String: name of lock to poll
- * @param $method String: name of method calling us
+ * @param string $lockName name of lock to poll
+ * @param string $method name of method calling us
* @return Boolean
* @since 1.20
*/
@@ -722,7 +723,7 @@ class DatabaseMysql extends DatabaseBase {
if( $row->lockstatus == 1 ) {
return true;
} else {
- wfDebug( __METHOD__." failed to acquire lock\n" );
+ wfDebug( __METHOD__ . " failed to acquire lock\n" );
return false;
}
}
@@ -745,6 +746,7 @@ class DatabaseMysql extends DatabaseBase {
* @param $write array
* @param $method string
* @param $lowPriority bool
+ * @return bool
*/
public function lockTables( $read, $write, $method, $lowPriority = true ) {
$items = array();
@@ -760,13 +762,16 @@ class DatabaseMysql extends DatabaseBase {
}
$sql = "LOCK TABLES " . implode( ',', $items );
$this->query( $sql, $method );
+ return true;
}
/**
* @param $method string
+ * @return bool
*/
public function unlockTables( $method ) {
$this->query( "UNLOCK TABLES", $method );
+ return true;
}
/**
@@ -805,7 +810,8 @@ class DatabaseMysql extends DatabaseBase {
* @param $delVar string
* @param $joinVar string
* @param $conds array|string
- * @param $fname bool
+ * @param bool|string $fname bool
+ * @throws DBUnexpectedError
* @return bool|ResultWrapper
*/
function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = 'DatabaseBase::deleteJoin' ) {
@@ -889,8 +895,8 @@ class DatabaseMysql extends DatabaseBase {
/**
* List all tables on the database
*
- * @param $prefix string Only show tables with this prefix, e.g. mw_
- * @param $fname String: calling function name
+ * @param string $prefix Only show tables with this prefix, e.g. mw_
+ * @param string $fname calling function name
* @return array
*/
function listTables( $prefix = null, $fname = 'DatabaseMysql::listTables' ) {
@@ -899,7 +905,7 @@ class DatabaseMysql extends DatabaseBase {
$endArray = array();
foreach( $result as $table ) {
- $vars = get_object_vars($table);
+ $vars = get_object_vars( $table );
$table = array_pop( $vars );
if( !$prefix || strpos( $table, $prefix ) === 0 ) {
@@ -952,13 +958,6 @@ class DatabaseMysql extends DatabaseBase {
}
/**
- * Legacy support: Database == DatabaseMysql
- *
- * @deprecated in 1.16
- */
-class Database extends DatabaseMysql {}
-
-/**
* Utility class.
* @ingroup Database
*/
diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php
index 7d8884fb..75b3550a 100644
--- a/includes/db/DatabaseOracle.php
+++ b/includes/db/DatabaseOracle.php
@@ -23,7 +23,7 @@
/**
* The oci8 extension is fairly weak and doesn't support oci_num_rows, among
- * other things. We use a wrapper class to handle that and other
+ * other things. We use a wrapper class to handle that and other
* Oracle-specific bits, like converting column names back to lowercase.
* @ingroup Database
*/
@@ -69,7 +69,7 @@ class ORAResult {
$this->nrows = count( $this->rows );
}
- if ($this->nrows > 0) {
+ if ( $this->nrows > 0 ) {
foreach ( $this->rows[0] as $k => $v ) {
$this->columns[$k] = strtolower( oci_field_name( $stmt, $k + 1 ) );
}
@@ -80,7 +80,7 @@ class ORAResult {
}
public function free() {
- unset($this->db);
+ unset( $this->db );
}
public function seek( $row ) {
@@ -92,7 +92,7 @@ class ORAResult {
}
public function numFields() {
- return count($this->columns);
+ return count( $this->columns );
}
public function fetchObject() {
@@ -241,6 +241,11 @@ class DatabaseOracle extends DatabaseBase {
/**
* Usually aborts on failure
+ * @param string $server
+ * @param string $user
+ * @param string $password
+ * @param string $dbName
+ * @throws DBConnectionError
* @return DatabaseBase|null
*/
function open( $server, $user, $password, $dbName ) {
@@ -313,7 +318,7 @@ class DatabaseOracle extends DatabaseBase {
protected function doQuery( $sql ) {
wfDebug( "SQL: [$sql]\n" );
- if ( !mb_check_encoding( $sql ) ) {
+ if ( !StringUtils::isUtf8( $sql ) ) {
throw new MWException( "SQL encoding is invalid\n$sql" );
}
@@ -628,7 +633,7 @@ class DatabaseOracle extends DatabaseBase {
}
list( $startOpts, $useIndex, $tailOpts ) = $this->makeSelectOptions( $selectOptions );
if ( is_array( $srcTable ) ) {
- $srcTable = implode( ',', array_map( array( &$this, 'tableName' ), $srcTable ) );
+ $srcTable = implode( ',', array_map( array( &$this, 'tableName' ), $srcTable ) );
} else {
$srcTable = $this->tableName( $srcTable );
}
@@ -751,7 +756,7 @@ class DatabaseOracle extends DatabaseBase {
function unionQueries( $sqls, $all ) {
$glue = ' UNION ALL ';
- return 'SELECT * ' . ( $all ? '':'/* UNION_UNIQUE */ ' ) . 'FROM (' . implode( $glue, $sqls ) . ')' ;
+ return 'SELECT * ' . ( $all ? '':'/* UNION_UNIQUE */ ' ) . 'FROM (' . implode( $glue, $sqls ) . ')';
}
function wasDeadlock() {
@@ -773,8 +778,8 @@ class DatabaseOracle extends DatabaseBase {
function listTables( $prefix = null, $fname = 'DatabaseOracle::listTables' ) {
$listWhere = '';
- if (!empty($prefix)) {
- $listWhere = ' AND table_name LIKE \''.strtoupper($prefix).'%\'';
+ if ( !empty( $prefix ) ) {
+ $listWhere = ' AND table_name LIKE \'' . strtoupper( $prefix ) . '%\'';
}
$owner = strtoupper( $this->mDBname );
@@ -782,12 +787,12 @@ class DatabaseOracle extends DatabaseBase {
// dirty code ... i know
$endArray = array();
- $endArray[] = strtoupper($prefix.'MWUSER');
- $endArray[] = strtoupper($prefix.'PAGE');
- $endArray[] = strtoupper($prefix.'IMAGE');
+ $endArray[] = strtoupper( $prefix . 'MWUSER' );
+ $endArray[] = strtoupper( $prefix . 'PAGE' );
+ $endArray[] = strtoupper( $prefix . 'IMAGE' );
$fixedOrderTabs = $endArray;
- while (($row = $result->fetchRow()) !== false) {
- if (!in_array($row['table_name'], $fixedOrderTabs))
+ while ( ($row = $result->fetchRow()) !== false ) {
+ if ( !in_array( $row['table_name'], $fixedOrderTabs ) )
$endArray[] = $row['table_name'];
}
@@ -795,7 +800,7 @@ class DatabaseOracle extends DatabaseBase {
}
public function dropTable( $tableName, $fName = 'DatabaseOracle::dropTable' ) {
- $tableName = $this->tableName($tableName);
+ $tableName = $this->tableName( $tableName );
if( !$this->tableExists( $tableName ) ) {
return false;
}
@@ -841,7 +846,7 @@ class DatabaseOracle extends DatabaseBase {
function getServerVersion() {
//better version number, fallback on driver
$rset = $this->doQuery( 'SELECT version FROM product_component_version WHERE UPPER(product) LIKE \'ORACLE DATABASE%\'' );
- if ( !( $row = $rset->fetchRow() ) ) {
+ if ( !( $row = $rset->fetchRow() ) ) {
return oci_server_version( $this->mConn );
}
return $row['version'];
@@ -902,7 +907,7 @@ class DatabaseOracle extends DatabaseBase {
$table = array_map( array( &$this, 'tableNameInternal' ), $table );
$tableWhere = 'IN (';
foreach( $table as &$singleTable ) {
- $singleTable = $this->removeIdentifierQuotes($singleTable);
+ $singleTable = $this->removeIdentifierQuotes( $singleTable );
if ( isset( $this->mFieldInfoCache["$singleTable.$field"] ) ) {
return $this->mFieldInfoCache["$singleTable.$field"];
}
@@ -910,14 +915,14 @@ class DatabaseOracle extends DatabaseBase {
}
$tableWhere = rtrim( $tableWhere, ',' ) . ')';
} else {
- $table = $this->removeIdentifierQuotes( $this->tableNameInternal( $table ) );
+ $table = $this->removeIdentifierQuotes( $this->tableNameInternal( $table ) );
if ( isset( $this->mFieldInfoCache["$table.$field"] ) ) {
return $this->mFieldInfoCache["$table.$field"];
}
$tableWhere = '= \''.$table.'\'';
}
- $fieldInfoStmt = oci_parse( $this->mConn, 'SELECT * FROM wiki_field_info_full WHERE table_name '.$tableWhere.' and column_name = \''.$field.'\'' );
+ $fieldInfoStmt = oci_parse( $this->mConn, 'SELECT * FROM wiki_field_info_full WHERE table_name ' . $tableWhere . ' and column_name = \'' . $field . '\'' );
if ( oci_execute( $fieldInfoStmt, $this->execFlags() ) === false ) {
$e = oci_error( $fieldInfoStmt );
$this->reportQueryError( $e['message'], $e['code'], 'fieldInfo QUERY', __METHOD__ );
@@ -952,7 +957,7 @@ class DatabaseOracle extends DatabaseBase {
if ( is_array( $table ) ) {
throw new DBUnexpectedError( $this, 'DatabaseOracle::fieldInfo called with table array!' );
}
- return $this->fieldInfoMulti ($table, $field);
+ return $this->fieldInfoMulti( $table, $field );
}
protected function doBegin( $fname = 'DatabaseOracle::begin' ) {
@@ -1061,7 +1066,7 @@ class DatabaseOracle extends DatabaseBase {
if ( $db == null || $db == $this->mUser ) {
return true;
}
- $sql = 'ALTER SESSION SET CURRENT_SCHEMA=' . strtoupper($db);
+ $sql = 'ALTER SESSION SET CURRENT_SCHEMA=' . strtoupper( $db );
$stmt = oci_parse( $this->mConn, $sql );
wfSuppressWarnings();
$success = oci_execute( $stmt );
@@ -1096,11 +1101,11 @@ class DatabaseOracle extends DatabaseBase {
}
public function removeIdentifierQuotes( $s ) {
- return strpos($s, '/*Q*/') === FALSE ? $s : substr($s, 5);
+ return strpos( $s, '/*Q*/' ) === false ? $s : substr( $s, 5 );
}
public function isQuotedIdentifier( $s ) {
- return strpos($s, '/*Q*/') !== FALSE;
+ return strpos( $s, '/*Q*/' ) !== false;
}
private function wrapFieldForWhere( $table, &$col, &$val ) {
@@ -1111,7 +1116,7 @@ class DatabaseOracle extends DatabaseBase {
if ( $col_type == 'CLOB' ) {
$col = 'TO_CHAR(' . $col . ')';
$val = $wgContLang->checkTitleEncoding( $val );
- } elseif ( $col_type == 'VARCHAR2' && !mb_check_encoding( $val ) ) {
+ } elseif ( $col_type == 'VARCHAR2' ) {
$val = $wgContLang->checkTitleEncoding( $val );
}
}
@@ -1134,7 +1139,7 @@ class DatabaseOracle extends DatabaseBase {
}
function selectRow( $table, $vars, $conds, $fname = 'DatabaseOracle::selectRow', $options = array(), $join_conds = array() ) {
- if ( is_array($conds) ) {
+ if ( is_array( $conds ) ) {
$conds = $this->wrapConditionsForWhere( $table, $conds );
}
return parent::selectRow( $table, $vars, $conds, $fname, $options, $join_conds );
@@ -1146,7 +1151,7 @@ class DatabaseOracle extends DatabaseBase {
*
* @private
*
- * @param $options Array: an associative array of options to be turned into
+ * @param array $options an associative array of options to be turned into
* an SQL query, valid keys are listed in the function.
* @return array
*/
@@ -1161,15 +1166,14 @@ class DatabaseOracle extends DatabaseBase {
}
}
- if ( isset( $options['GROUP BY'] ) ) {
- $preLimitTail .= " GROUP BY {$options['GROUP BY']}";
- }
- if ( isset( $options['ORDER BY'] ) ) {
- $preLimitTail .= " ORDER BY {$options['ORDER BY']}";
+ $preLimitTail .= $this->makeGroupByWithHaving( $options );
+
+ $preLimitTail .= $this->makeOrderBy( $options );
+
+ if ( isset( $noKeyOptions['FOR UPDATE'] ) ) {
+ $postLimitTail .= ' FOR UPDATE';
}
- # if ( isset( $noKeyOptions['FOR UPDATE'] ) ) $tailOpts .= ' FOR UPDATE';
- # if ( isset( $noKeyOptions['LOCK IN SHARE MODE'] ) ) $tailOpts .= ' LOCK IN SHARE MODE';
if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) {
$startOpts .= 'DISTINCT';
}
@@ -1184,13 +1188,13 @@ class DatabaseOracle extends DatabaseBase {
}
public function delete( $table, $conds, $fname = 'DatabaseOracle::delete' ) {
- if ( is_array($conds) ) {
+ if ( is_array( $conds ) ) {
$conds = $this->wrapConditionsForWhere( $table, $conds );
}
// a hack for deleting pages, users and images (which have non-nullable FKs)
// all deletions on these tables have transactions so final failure rollbacks these updates
$table = $this->tableName( $table );
- if ( $table == $this->tableName( 'user' ) ) {
+ if ( $table == $this->tableName( 'user' ) ) {
$this->update( 'archive', array( 'ar_user' => 0 ), array( 'ar_user' => $conds['user_id'] ), $fname );
$this->update( 'ipblocks', array( 'ipb_user' => 0 ), array( 'ipb_user' => $conds['user_id'] ), $fname );
$this->update( 'image', array( 'img_user' => 0 ), array( 'img_user' => $conds['user_id'] ), $fname );
@@ -1200,7 +1204,7 @@ class DatabaseOracle extends DatabaseBase {
$this->update( 'uploadstash', array( 'us_user' => 0 ), array( 'us_user' => $conds['user_id'] ), $fname );
$this->update( 'recentchanges', array( 'rc_user' => 0 ), array( 'rc_user' => $conds['user_id'] ), $fname );
$this->update( 'logging', array( 'log_user' => 0 ), array( 'log_user' => $conds['user_id'] ), $fname );
- } elseif ( $table == $this->tableName( 'image' ) ) {
+ } elseif ( $table == $this->tableName( 'image' ) ) {
$this->update( 'oldimage', array( 'oi_name' => 0 ), array( 'oi_name' => $conds['img_name'] ), $fname );
}
return parent::delete( $table, $conds, $fname );
diff --git a/includes/db/DatabasePostgres.php b/includes/db/DatabasePostgres.php
index 457bf384..f32d7758 100644
--- a/includes/db/DatabasePostgres.php
+++ b/includes/db/DatabasePostgres.php
@@ -176,8 +176,8 @@ class PostgresTransactionState {
$old = reset( $this->mCurrentState );
$new = reset( $this->mNewState );
foreach ( self::$WATCHED as $watched ) {
- if ($old !== $new) {
- $this->log_changed($old, $new, $watched);
+ if ( $old !== $new ) {
+ $this->log_changed( $old, $new, $watched );
}
$old = next( $this->mCurrentState );
$new = next( $this->mNewState );
@@ -197,11 +197,11 @@ class PostgresTransactionState {
}
protected function log_changed( $old, $new, $watched ) {
- wfDebug(sprintf($watched["desc"],
+ wfDebug( sprintf( $watched["desc"],
$this->mConn,
$this->describe_changed( $old, $watched["states"] ),
- $this->describe_changed( $new, $watched["states"] ))
- );
+ $this->describe_changed( $new, $watched["states"] )
+ ) );
}
}
@@ -218,7 +218,7 @@ class SavepointPostgres {
protected $id;
protected $didbegin;
- public function __construct ($dbw, $id) {
+ public function __construct ( $dbw, $id ) {
$this->dbw = $dbw;
$this->id = $id;
$this->didbegin = false;
@@ -232,12 +232,14 @@ class SavepointPostgres {
public function __destruct() {
if ( $this->didbegin ) {
$this->dbw->rollback();
+ $this->didbegin = false;
}
}
public function commit() {
if ( $this->didbegin ) {
$this->dbw->commit();
+ $this->didbegin = false;
}
}
@@ -245,29 +247,29 @@ class SavepointPostgres {
global $wgDebugDBTransactions;
if ( $this->dbw->doQuery( $keyword . " " . $this->id ) !== false ) {
if ( $wgDebugDBTransactions ) {
- wfDebug( sprintf ($msg_ok, $this->id ) );
+ wfDebug( sprintf ( $msg_ok, $this->id ) );
}
} else {
- wfDebug( sprintf ($msg_failed, $this->id ) );
+ wfDebug( sprintf ( $msg_failed, $this->id ) );
}
}
public function savepoint() {
- $this->query("SAVEPOINT",
+ $this->query( "SAVEPOINT",
"Transaction state: savepoint \"%s\" established.\n",
"Transaction state: establishment of savepoint \"%s\" FAILED.\n"
);
}
public function release() {
- $this->query("RELEASE",
+ $this->query( "RELEASE",
"Transaction state: savepoint \"%s\" released.\n",
"Transaction state: release of savepoint \"%s\" FAILED.\n"
);
}
public function rollback() {
- $this->query("ROLLBACK TO",
+ $this->query( "ROLLBACK TO",
"Transaction state: savepoint \"%s\" rolled back.\n",
"Transaction state: rollback of savepoint \"%s\" FAILED.\n"
);
@@ -325,6 +327,11 @@ class DatabasePostgres extends DatabaseBase {
/**
* Usually aborts on failure
+ * @param string $server
+ * @param string $user
+ * @param string $password
+ * @param string $dbName
+ * @throws DBConnectionError
* @return DatabaseBase|null
*/
function open( $server, $user, $password, $dbName ) {
@@ -386,6 +393,9 @@ class DatabasePostgres extends DatabaseBase {
$this->query( "SET datestyle = 'ISO, YMD'", __METHOD__ );
$this->query( "SET timezone = 'GMT'", __METHOD__ );
$this->query( "SET standard_conforming_strings = on", __METHOD__ );
+ if ( $this->getServerVersion() >= 9.0 ) {
+ $this->query( "SET bytea_output = 'escape'", __METHOD__ ); // PHP bug 53127
+ }
global $wgDBmwschema;
$this->determineCoreSchema( $wgDBmwschema );
@@ -472,7 +482,6 @@ class DatabasePostgres extends DatabaseBase {
parent::reportQueryError( $error, $errno, $sql, $fname, false );
}
-
function queryIgnore( $sql, $fname = 'DatabasePostgres::queryIgnore' ) {
return $this->query( $sql, $fname, true );
}
@@ -599,7 +608,7 @@ class DatabasePostgres extends DatabaseBase {
* Takes same arguments as Database::select()
* @return int
*/
- function estimateRowCount( $table, $vars = '*', $conds='', $fname = 'DatabasePostgres::estimateRowCount', $options = array() ) {
+ function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabasePostgres::estimateRowCount', $options = array() ) {
$options['EXPLAIN'] = true;
$res = $this->select( $table, $vars, $conds, $fname, $options );
$rows = -1;
@@ -677,7 +686,7 @@ class DatabasePostgres extends DatabaseBase {
AND i.indclass[s.g] = opcls.oid
AND pg_am.oid = opcls.opcmethod
__INDEXATTR__;
- $res = $this->query($sql, __METHOD__);
+ $res = $this->query( $sql, __METHOD__ );
$a = array();
if ( $res ) {
foreach ( $res as $row ) {
@@ -685,7 +694,7 @@ __INDEXATTR__;
$row->attname,
$row->opcname,
$row->amname,
- $row->option);
+ $row->option );
}
} else {
return null;
@@ -693,7 +702,6 @@ __INDEXATTR__;
return $a;
}
-
function indexUnique( $table, $index, $fname = 'DatabasePostgres::indexUnique' ) {
$sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'".
" AND indexdef LIKE 'CREATE UNIQUE%(" .
@@ -718,7 +726,7 @@ __INDEXATTR__;
* @param $table String: Name of the table to insert to.
* @param $args Array: Items to insert into the table.
* @param $fname String: Name of the function, for profiling
- * @param $options String or Array. Valid options: IGNORE
+ * @param string $options or Array. Valid options: IGNORE
*
* @return bool Success of insert operation. IGNORE always returns true.
*/
@@ -728,7 +736,7 @@ __INDEXATTR__;
}
$table = $this->tableName( $table );
- if (! isset( $this->numeric_version ) ) {
+ if ( !isset( $this->numeric_version ) ) {
$this->getServerVersion();
}
@@ -980,7 +988,7 @@ __INDEXATTR__;
$endArray = array();
foreach( $result as $table ) {
- $vars = get_object_vars($table);
+ $vars = get_object_vars( $table );
$table = array_pop( $vars );
if( !$prefix || strpos( $table, $prefix ) === 0 ) {
$endArray[] = $table;
@@ -1052,7 +1060,6 @@ __INDEXATTR__;
return '[http://www.postgresql.org/ PostgreSQL]';
}
-
/**
* Return current schema (executes SELECT current_schema())
* Needs transaction
@@ -1061,7 +1068,7 @@ __INDEXATTR__;
* @return string return default schema for the current session
*/
function getCurrentSchema() {
- $res = $this->query( "SELECT current_schema()", __METHOD__);
+ $res = $this->query( "SELECT current_schema()", __METHOD__ );
$row = $this->fetchRow( $res );
return $row[0];
}
@@ -1071,17 +1078,17 @@ __INDEXATTR__;
* This is list does not contain magic keywords like "$user"
* Needs transaction
*
- * @seealso getSearchPath()
- * @seealso setSearchPath()
+ * @see getSearchPath()
+ * @see setSearchPath()
* @since 1.19
* @return array list of actual schemas for the current sesson
*/
function getSchemas() {
- $res = $this->query( "SELECT current_schemas(false)", __METHOD__);
+ $res = $this->query( "SELECT current_schemas(false)", __METHOD__ );
$row = $this->fetchRow( $res );
$schemas = array();
/* PHP pgsql support does not support array type, "{a,b}" string is returned */
- return $this->pg_array_parse($row[0], $schemas);
+ return $this->pg_array_parse( $row[0], $schemas );
}
/**
@@ -1094,10 +1101,10 @@ __INDEXATTR__;
* @return array how to search for table names schemas for the current user
*/
function getSearchPath() {
- $res = $this->query( "SHOW search_path", __METHOD__);
+ $res = $this->query( "SHOW search_path", __METHOD__ );
$row = $this->fetchRow( $res );
/* PostgreSQL returns SHOW values as strings */
- return explode(",", $row[0]);
+ return explode( ",", $row[0] );
}
/**
@@ -1108,7 +1115,7 @@ __INDEXATTR__;
* @param $search_path array list of schemas to be searched by default
*/
function setSearchPath( $search_path ) {
- $this->query( "SET search_path = " . implode(", ", $search_path) );
+ $this->query( "SET search_path = " . implode( ", ", $search_path ) );
}
/**
@@ -1129,7 +1136,7 @@ __INDEXATTR__;
if ( $this->schemaExists( $desired_schema ) ) {
if ( in_array( $desired_schema, $this->getSchemas() ) ) {
$this->mCoreSchema = $desired_schema;
- wfDebug("Schema \"" . $desired_schema . "\" already in the search path\n");
+ wfDebug( "Schema \"" . $desired_schema . "\" already in the search path\n" );
} else {
/**
* Prepend our schema (e.g. 'mediawiki') in front
@@ -1141,11 +1148,11 @@ __INDEXATTR__;
$this->addIdentifierQuotes( $desired_schema ));
$this->setSearchPath( $search_path );
$this->mCoreSchema = $desired_schema;
- wfDebug("Schema \"" . $desired_schema . "\" added to the search path\n");
+ wfDebug( "Schema \"" . $desired_schema . "\" added to the search path\n" );
}
} else {
$this->mCoreSchema = $this->getCurrentSchema();
- wfDebug("Schema \"" . $desired_schema . "\" not found, using current \"". $this->mCoreSchema ."\"\n");
+ wfDebug( "Schema \"" . $desired_schema . "\" not found, using current \"" . $this->mCoreSchema . "\"\n" );
}
/* Commit SET otherwise it will be rollbacked on error or IGNORE SELECT */
$this->commit( __METHOD__ );
@@ -1251,8 +1258,8 @@ SQL;
}
function constraintExists( $table, $constraint ) {
- $SQL = sprintf( "SELECT 1 FROM information_schema.table_constraints ".
- "WHERE constraint_schema = %s AND table_name = %s AND constraint_name = %s",
+ $SQL = sprintf( "SELECT 1 FROM information_schema.table_constraints " .
+ "WHERE constraint_schema = %s AND table_name = %s AND constraint_name = %s",
$this->addQuotes( $this->getCoreSchema() ),
$this->addQuotes( $table ),
$this->addQuotes( $constraint )
@@ -1340,7 +1347,7 @@ SQL;
*
* @private
*
- * @param $ins String: SQL string, read from a stream (usually tables.sql)
+ * @param string $ins SQL string, read from a stream (usually tables.sql)
*
* @return string SQL string
*/
@@ -1364,7 +1371,7 @@ SQL;
*
* @private
*
- * @param $options Array: an associative array of options to be turned into
+ * @param array $options an associative array of options to be turned into
* an SQL query, valid keys are listed in the function.
* @return array
*/
@@ -1379,23 +1386,9 @@ SQL;
}
}
- if ( isset( $options['GROUP BY'] ) ) {
- $gb = is_array( $options['GROUP BY'] )
- ? implode( ',', $options['GROUP BY'] )
- : $options['GROUP BY'];
- $preLimitTail .= " GROUP BY {$gb}";
- }
+ $preLimitTail .= $this->makeGroupByWithHaving( $options );
- if ( isset( $options['HAVING'] ) ) {
- $preLimitTail .= " HAVING {$options['HAVING']}";
- }
-
- if ( isset( $options['ORDER BY'] ) ) {
- $ob = is_array( $options['ORDER BY'] )
- ? implode( ',', $options['ORDER BY'] )
- : $options['ORDER BY'];
- $preLimitTail .= " ORDER BY {$ob}";
- }
+ $preLimitTail .= $this->makeOrderBy( $options );
//if ( isset( $options['LIMIT'] ) ) {
// $tailOpts .= $this->limitResult( '', $options['LIMIT'],
@@ -1443,4 +1436,65 @@ SQL;
}
return parent::streamStatementEnd( $sql, $newLine );
}
+
+ /**
+ * Check to see if a named lock is available. This is non-blocking.
+ * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
+ *
+ * @param string $lockName name of lock to poll
+ * @param string $method name of method calling us
+ * @return Boolean
+ * @since 1.20
+ */
+ public function lockIsFree( $lockName, $method ) {
+ $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
+ $result = $this->query( "SELECT (CASE(pg_try_advisory_lock($key))
+ WHEN 'f' THEN 'f' ELSE pg_advisory_unlock($key) END) AS lockstatus", $method );
+ $row = $this->fetchObject( $result );
+ return ( $row->lockstatus === 't' );
+ }
+
+ /**
+ * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
+ * @param $lockName string
+ * @param $method string
+ * @param $timeout int
+ * @return bool
+ */
+ public function lock( $lockName, $method, $timeout = 5 ) {
+ $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
+ for ( $attempts = 1; $attempts <= $timeout; ++$attempts ) {
+ $result = $this->query(
+ "SELECT pg_try_advisory_lock($key) AS lockstatus", $method );
+ $row = $this->fetchObject( $result );
+ if ( $row->lockstatus === 't' ) {
+ return true;
+ } else {
+ sleep( 1 );
+ }
+ }
+ wfDebug( __METHOD__." failed to acquire lock\n" );
+ return false;
+ }
+
+ /**
+ * See http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKSFROM PG DOCS: http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
+ * @param $lockName string
+ * @param $method string
+ * @return bool
+ */
+ public function unlock( $lockName, $method ) {
+ $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
+ $result = $this->query( "SELECT pg_advisory_unlock($key) as lockstatus", $method );
+ $row = $this->fetchObject( $result );
+ return ( $row->lockstatus === 't' );
+ }
+
+ /**
+ * @param string $lockName
+ * @return string Integer
+ */
+ private function bigintFromLockName( $lockName ) {
+ return wfBaseConvert( substr( sha1( $lockName ), 0, 15 ), 16, 10 );
+ }
} // end DatabasePostgres class
diff --git a/includes/db/DatabaseSqlite.php b/includes/db/DatabaseSqlite.php
index f1e553d7..0789e1b1 100644
--- a/includes/db/DatabaseSqlite.php
+++ b/includes/db/DatabaseSqlite.php
@@ -79,11 +79,12 @@ class DatabaseSqlite extends DatabaseBase {
/** Open an SQLite database and return a resource handle to it
* NOTE: only $dbName is used, the other parameters are irrelevant for SQLite databases
*
- * @param $server
- * @param $user
- * @param $pass
- * @param $dbName
+ * @param string $server
+ * @param string $user
+ * @param string $pass
+ * @param string $dbName
*
+ * @throws DBConnectionError
* @return PDO
*/
function open( $server, $user, $pass, $dbName ) {
@@ -103,6 +104,7 @@ class DatabaseSqlite extends DatabaseBase {
*
* @param $fileName string
*
+ * @throws DBConnectionError
* @return PDO|bool SQL connection or false if failed
*/
function openFile( $fileName ) {
@@ -125,6 +127,8 @@ class DatabaseSqlite extends DatabaseBase {
# set error codes only, don't raise exceptions
if ( $this->mOpened ) {
$this->mConn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
+ # Enforce LIKE to be case sensitive, just like MySQL
+ $this->query( 'PRAGMA case_sensitive_like = 1' );
return true;
}
}
@@ -140,8 +144,8 @@ class DatabaseSqlite extends DatabaseBase {
/**
* Generates a database file name. Explicitly public for installer.
- * @param $dir String: Directory where database resides
- * @param $dbName String: Database name
+ * @param string $dir Directory where database resides
+ * @param string $dbName Database name
* @return String
*/
public static function generateFileName( $dir, $dbName ) {
@@ -159,7 +163,7 @@ class DatabaseSqlite extends DatabaseBase {
$res = $this->query( "SELECT sql FROM sqlite_master WHERE tbl_name = '$table'", __METHOD__ );
if ( $res ) {
$row = $res->fetchRow();
- self::$fulltextEnabled = stristr($row['sql'], 'fts' ) !== false;
+ self::$fulltextEnabled = stristr( $row['sql'], 'fts' ) !== false;
}
}
return self::$fulltextEnabled;
@@ -190,9 +194,9 @@ class DatabaseSqlite extends DatabaseBase {
* Attaches external database to our connection, see http://sqlite.org/lang_attach.html
* for details.
*
- * @param $name String: database name to be used in queries like SELECT foo FROM dbname.table
- * @param $file String: database file name. If omitted, will be generated using $name and $wgSQLiteDataDir
- * @param $fname String: calling function name
+ * @param string $name database name to be used in queries like SELECT foo FROM dbname.table
+ * @param string $file database file name. If omitted, will be generated using $name and $wgSQLiteDataDir
+ * @param string $fname calling function name
*
* @return ResultWrapper
*/
@@ -248,7 +252,7 @@ class DatabaseSqlite extends DatabaseBase {
/**
* @param $res ResultWrapper
- * @return
+ * @return object|bool
*/
function fetchObject( $res ) {
if ( $res instanceof ResultWrapper ) {
@@ -274,7 +278,7 @@ class DatabaseSqlite extends DatabaseBase {
/**
* @param $res ResultWrapper
- * @return bool|mixed
+ * @return array|bool
*/
function fetchRow( $res ) {
if ( $res instanceof ResultWrapper ) {
@@ -467,7 +471,7 @@ class DatabaseSqlite extends DatabaseBase {
*/
function makeSelectOptions( $options ) {
foreach ( $options as $k => $v ) {
- if ( is_numeric( $k ) && $v == 'FOR UPDATE' ) {
+ if ( is_numeric( $k ) && ($v == 'FOR UPDATE' || $v == 'LOCK IN SHARE MODE') ) {
$options[$k] = '';
}
}
@@ -593,7 +597,7 @@ class DatabaseSqlite extends DatabaseBase {
* @return bool
*/
function wasErrorReissuable() {
- return $this->lastErrno() == 17; // SQLITE_SCHEMA;
+ return $this->lastErrno() == 17; // SQLITE_SCHEMA;
}
/**
@@ -703,6 +707,14 @@ class DatabaseSqlite extends DatabaseBase {
function addQuotes( $s ) {
if ( $s instanceof Blob ) {
return "x'" . bin2hex( $s->fetch() ) . "'";
+ } else if ( strpos( $s, "\0" ) !== false ) {
+ // SQLite doesn't support \0 in strings, so use the hex representation as a workaround.
+ // This is a known limitation of SQLite's mprintf function which PDO should work around,
+ // but doesn't. I have reported this to php.net as bug #63419:
+ // https://bugs.php.net/bug.php?id=63419
+ // There was already a similar report for SQLite3::escapeString, bug #62361:
+ // https://bugs.php.net/bug.php?id=62361
+ return "x'" . bin2hex( $s ) . "'";
} else {
return $this->mConn->quote( $s );
}
@@ -819,12 +831,11 @@ class DatabaseSqlite extends DatabaseBase {
return $this->query( $sql, $fname );
}
-
/**
* List all tables on the database
*
- * @param $prefix string Only show tables with this prefix, e.g. mw_
- * @param $fname String: calling function name
+ * @param string $prefix Only show tables with this prefix, e.g. mw_
+ * @param string $fname calling function name
*
* @return array
*/
@@ -838,7 +849,7 @@ class DatabaseSqlite extends DatabaseBase {
$endArray = array();
foreach( $result as $table ) {
- $vars = get_object_vars($table);
+ $vars = get_object_vars( $table );
$table = array_pop( $vars );
if( !$prefix || strpos( $table, $prefix ) === 0 ) {
diff --git a/includes/db/DatabaseUtility.php b/includes/db/DatabaseUtility.php
index c846788d..9a1c8bde 100644
--- a/includes/db/DatabaseUtility.php
+++ b/includes/db/DatabaseUtility.php
@@ -1,6 +1,6 @@
<?php
/**
- * This file contains database-related utiliy classes.
+ * This file contains database-related utility classes.
*
* 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
@@ -138,7 +138,7 @@ class ResultWrapper implements Iterator {
/**
* Fetch the next row from the given result object, in associative array
- * form. Fields are retrieved with $row['fieldname'].
+ * form. Fields are retrieved with $row['fieldname'].
*
* @return Array
* @throws DBUnexpectedError Thrown if the database returns an error
@@ -219,9 +219,9 @@ class ResultWrapper implements Iterator {
* doesn't go anywhere near an actual database.
*/
class FakeResultWrapper extends ResultWrapper {
- var $result = array();
- var $db = null; // And it's going to stay that way :D
- var $pos = 0;
+ var $result = array();
+ var $db = null; // And it's going to stay that way :D
+ var $pos = 0;
var $currentRow = null;
function __construct( $array ) {
@@ -285,7 +285,7 @@ class LikeMatch {
/**
* Store a string into a LikeMatch marker object.
*
- * @param String $s
+ * @param string $s
*/
public function __construct( $s ) {
$this->str = $s;
@@ -306,4 +306,3 @@ class LikeMatch {
*/
interface DBMasterPos {
}
-
diff --git a/includes/db/IORMRow.php b/includes/db/IORMRow.php
index e99ba6cc..6bc0cdd2 100644
--- a/includes/db/IORMRow.php
+++ b/includes/db/IORMRow.php
@@ -27,13 +27,12 @@
* @file
* @ingroup ORM
*
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
interface IORMRow {
-
/**
* Constructor.
*
@@ -272,4 +271,4 @@ interface IORMRow {
*/
public function getTable();
-} \ No newline at end of file
+}
diff --git a/includes/db/IORMTable.php b/includes/db/IORMTable.php
index 99413f99..36865655 100644
--- a/includes/db/IORMTable.php
+++ b/includes/db/IORMTable.php
@@ -23,7 +23,7 @@
* @file
* @ingroup ORM
*
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
@@ -97,6 +97,8 @@ interface IORMTable {
* Selects the the specified fields of the records matching the provided
* conditions and returns them as DBDataObject. Field names get prefixed.
*
+ * @see DatabaseBase::select()
+ *
* @since 1.20
*
* @param array|string|null $fields
@@ -104,7 +106,8 @@ interface IORMTable {
* @param array $options
* @param string|null $functionName
*
- * @return ORMResult
+ * @return ORMResult The result set
+ * @throws DBQueryError if the query failed (even if the database was in ignoreErrors mode)
*/
public function select( $fields = null, array $conditions = array(),
array $options = array(), $functionName = null );
@@ -136,6 +139,7 @@ interface IORMTable {
* @param null|string $functionName
*
* @return ResultWrapper
+ * @throws DBQueryError if the query failed (even if the database was in ignoreErrors mode)
*/
public function rawSelect( $fields = null, array $conditions = array(),
array $options = array(), $functionName = null );
@@ -230,6 +234,15 @@ interface IORMTable {
public function has( array $conditions = array() );
/**
+ * Checks if the table exists
+ *
+ * @since 1.21
+ *
+ * @return boolean
+ */
+ public function exists();
+
+ /**
* Returns the amount of matching records.
* Condition field names get prefixed.
*
@@ -299,6 +312,71 @@ interface IORMTable {
public function setReadDb( $db );
/**
+ * Get the ID of the any foreign wiki to use as a target for database operations
+ *
+ * @since 1.20
+ *
+ * @return String|bool The target wiki, in a form that LBFactory understands (or false if the local wiki is used)
+ */
+ public function getTargetWiki();
+
+ /**
+ * Set the ID of the any foreign wiki to use as a target for database operations
+ *
+ * @param string|bool $wiki The target wiki, in a form that LBFactory understands (or false if the local wiki shall be used)
+ *
+ * @since 1.20
+ */
+ public function setTargetWiki( $wiki );
+
+ /**
+ * Get the database type used for read operations.
+ * This is to be used instead of wfGetDB.
+ *
+ * @see LoadBalancer::getConnection
+ *
+ * @since 1.20
+ *
+ * @return DatabaseBase The database object
+ */
+ public function getReadDbConnection();
+
+ /**
+ * Get the database type used for read operations.
+ * This is to be used instead of wfGetDB.
+ *
+ * @see LoadBalancer::getConnection
+ *
+ * @since 1.20
+ *
+ * @return DatabaseBase The database object
+ */
+ public function getWriteDbConnection();
+
+ /**
+ * Get the database type used for read operations.
+ *
+ * @see wfGetLB
+ *
+ * @since 1.20
+ *
+ * @return LoadBalancer The database load balancer object
+ */
+ public function getLoadBalancer();
+
+ /**
+ * Releases the lease on the given database connection. This is useful mainly
+ * for connections to a foreign wiki. It does nothing for connections to the local wiki.
+ *
+ * @see LoadBalancer::reuseConnection
+ *
+ * @param DatabaseBase $db the database
+ *
+ * @since 1.20
+ */
+ public function releaseConnection( DatabaseBase $db );
+
+ /**
* Update the records matching the provided conditions by
* setting the fields that are keys in the $values param to
* their corresponding values.
@@ -381,15 +459,6 @@ interface IORMTable {
public function unprefixFieldName( $fieldName );
/**
- * Get an instance of this class.
- *
- * @since 1.20
- *
- * @return IORMTable
- */
- public static function singleton();
-
- /**
* Get an array with fields from a database result,
* that can be fed directly to the constructor or
* to setFields.
diff --git a/includes/db/LBFactory.php b/includes/db/LBFactory.php
index e82c54ba..d469e867 100644
--- a/includes/db/LBFactory.php
+++ b/includes/db/LBFactory.php
@@ -86,7 +86,7 @@ abstract class LBFactory {
* Create a new load balancer object. The resulting object will be untracked,
* not chronology-protected, and the caller is responsible for cleaning it up.
*
- * @param $wiki String: wiki ID, or false for the current wiki
+ * @param string $wiki wiki ID, or false for the current wiki
* @return LoadBalancer
*/
abstract function newMainLB( $wiki = false );
@@ -94,7 +94,7 @@ abstract class LBFactory {
/**
* Get a cached (tracked) load balancer object.
*
- * @param $wiki String: wiki ID, or false for the current wiki
+ * @param string $wiki wiki ID, or false for the current wiki
* @return LoadBalancer
*/
abstract function getMainLB( $wiki = false );
@@ -104,8 +104,8 @@ abstract class LBFactory {
* untracked, not chronology-protected, and the caller is responsible for
* cleaning it up.
*
- * @param $cluster String: external storage cluster, or false for core
- * @param $wiki String: wiki ID, or false for the current wiki
+ * @param string $cluster external storage cluster, or false for core
+ * @param string $wiki wiki ID, or false for the current wiki
*
* @return LoadBalancer
*/
@@ -114,8 +114,8 @@ abstract class LBFactory {
/**
* Get a cached (tracked) load balancer for external storage
*
- * @param $cluster String: external storage cluster, or false for core
- * @param $wiki String: wiki ID, or false for the current wiki
+ * @param string $cluster external storage cluster, or false for core
+ * @param string $wiki wiki ID, or false for the current wiki
*
* @return LoadBalancer
*/
@@ -240,7 +240,7 @@ class LBFactory_Simple extends LBFactory {
function newExternalLB( $cluster, $wiki = false ) {
global $wgExternalServers;
if ( !isset( $wgExternalServers[$cluster] ) ) {
- throw new MWException( __METHOD__.": Unknown cluster \"$cluster\"" );
+ throw new MWException( __METHOD__ . ": Unknown cluster \"$cluster\"" );
}
return new LoadBalancer( array(
'servers' => $wgExternalServers[$cluster]
@@ -345,7 +345,7 @@ class ChronologyProtector {
if ( $lb->getServerCount() > 1 && !empty( $this->startupPos[$masterName] ) ) {
$info = $lb->parentInfo();
$pos = $this->startupPos[$masterName];
- wfDebug( __METHOD__.": LB " . $info['id'] . " waiting for master pos $pos\n" );
+ wfDebug( __METHOD__ . ": LB " . $info['id'] . " waiting for master pos $pos\n" );
$lb->waitFor( $this->startupPos[$masterName] );
}
}
@@ -370,11 +370,11 @@ class ChronologyProtector {
$db = $lb->getAnyOpenConnection( 0 );
$info = $lb->parentInfo();
if ( !$db || !$db->doneWrites() ) {
- wfDebug( __METHOD__.": LB {$info['id']}, no writes done\n" );
+ wfDebug( __METHOD__ . ": LB {$info['id']}, no writes done\n" );
return;
}
$pos = $db->getMasterPos();
- wfDebug( __METHOD__.": LB {$info['id']} has master pos $pos\n" );
+ wfDebug( __METHOD__ . ": LB {$info['id']} has master pos $pos\n" );
$this->shutdownPos[$masterName] = $pos;
}
@@ -384,7 +384,7 @@ class ChronologyProtector {
*/
function shutdown() {
if ( session_id() != '' && count( $this->shutdownPos ) ) {
- wfDebug( __METHOD__.": saving master pos for " .
+ wfDebug( __METHOD__ . ": saving master pos for " .
count( $this->shutdownPos ) . " master(s)\n" );
$_SESSION[__CLASS__] = $this->shutdownPos;
}
diff --git a/includes/db/LBFactory_Multi.php b/includes/db/LBFactory_Multi.php
index 6008813b..2e4963d4 100644
--- a/includes/db/LBFactory_Multi.php
+++ b/includes/db/LBFactory_Multi.php
@@ -21,7 +21,6 @@
* @ingroup Database
*/
-
/**
* A multi-wiki, multi-master factory for Wikimedia and similar installations.
* Ignores the old configuration globals
@@ -70,6 +69,7 @@ class LBFactory_Multi extends LBFactory {
/**
* @param $conf array
+ * @throws MWException
*/
function __construct( $conf ) {
$this->chronProt = new ChronologyProtector;
@@ -82,7 +82,7 @@ class LBFactory_Multi extends LBFactory {
foreach ( $required as $key ) {
if ( !isset( $conf[$key] ) ) {
- throw new MWException( __CLASS__.": $key is required in configuration" );
+ throw new MWException( __CLASS__ . ": $key is required in configuration" );
}
$this->$key = $conf[$key];
}
@@ -153,13 +153,14 @@ class LBFactory_Multi extends LBFactory {
}
/**
- * @param $cluster
- * @param $wiki
+ * @param string $cluster
+ * @param bool $wiki
+ * @throws MWException
* @return LoadBalancer
*/
function newExternalLB( $cluster, $wiki = false ) {
if ( !isset( $this->externalLoads[$cluster] ) ) {
- throw new MWException( __METHOD__.": Unknown cluster \"$cluster\"" );
+ throw new MWException( __METHOD__ . ": Unknown cluster \"$cluster\"" );
}
$template = $this->serverTemplate;
if ( isset( $this->externalTemplateOverrides ) ) {
diff --git a/includes/db/LBFactory_Single.php b/includes/db/LBFactory_Single.php
index 4b165b2a..7dca06d7 100644
--- a/includes/db/LBFactory_Single.php
+++ b/includes/db/LBFactory_Single.php
@@ -28,7 +28,7 @@ class LBFactory_Single extends LBFactory {
protected $lb;
/**
- * @param $conf array An associative array with one member:
+ * @param array $conf An associative array with one member:
* - connection: The DatabaseBase connection object
*/
function __construct( $conf ) {
diff --git a/includes/db/LoadBalancer.php b/includes/db/LoadBalancer.php
index 0e455e0c..1e859278 100644
--- a/includes/db/LoadBalancer.php
+++ b/includes/db/LoadBalancer.php
@@ -37,14 +37,15 @@ class LoadBalancer {
private $mLoadMonitorClass, $mLoadMonitor;
/**
- * @param $params Array with keys:
+ * @param array $params with keys:
* servers Required. Array of server info structures.
* masterWaitTimeout Replication lag wait timeout
* loadMonitor Name of a class used to fetch server lag and load.
+ * @throws MWException
*/
function __construct( $params ) {
if ( !isset( $params['servers'] ) ) {
- throw new MWException( __CLASS__.': missing servers parameter' );
+ throw new MWException( __CLASS__ . ': missing servers parameter' );
}
$this->mServers = $params['servers'];
@@ -116,34 +117,14 @@ class LoadBalancer {
* Given an array of non-normalised probabilities, this function will select
* an element and return the appropriate key
*
+ * @deprecated 1.21, use ArrayUtils::pickRandom()
+ *
* @param $weights array
*
- * @return int
+ * @return bool|int|string
*/
function pickRandom( $weights ) {
- if ( !is_array( $weights ) || count( $weights ) == 0 ) {
- return false;
- }
-
- $sum = array_sum( $weights );
- if ( $sum == 0 ) {
- # No loads on any of them
- # In previous versions, this triggered an unweighted random selection,
- # but this feature has been removed as of April 2006 to allow for strict
- # separation of query groups.
- return false;
- }
- $max = mt_getrandmax();
- $rand = mt_rand( 0, $max ) / $max * $sum;
-
- $sum = 0;
- foreach ( $weights as $i => $w ) {
- $sum += $w;
- if ( $sum >= $rand ) {
- break;
- }
- }
- return $i;
+ return ArrayUtils::pickRandom( $weights );
}
/**
@@ -197,17 +178,18 @@ class LoadBalancer {
* Side effect: opens connections to databases
* @param $group bool
* @param $wiki bool
+ * @throws MWException
* @return bool|int|string
*/
function getReaderIndex( $group = false, $wiki = false ) {
global $wgReadOnly, $wgDBClusterTimeout, $wgDBAvgStatusPoll, $wgDBtype;
# @todo FIXME: For now, only go through all this for mysql databases
- if ($wgDBtype != 'mysql') {
+ if ( $wgDBtype != 'mysql' ) {
return $this->getWriterIndex();
}
- if ( count( $this->mServers ) == 1 ) {
+ if ( count( $this->mServers ) == 1 ) {
# Skip the load balancing if there's only one server
return 0;
} elseif ( $group === false and $this->mReadIndex >= 0 ) {
@@ -228,7 +210,7 @@ class LoadBalancer {
$nonErrorLoads = $this->mGroupLoads[$group];
} else {
# No loads for this group, return false and the caller can use some other group
- wfDebug( __METHOD__.": no loads for group $group\n" );
+ wfDebug( __METHOD__ . ": no loads for group $group\n" );
wfProfileOut( __METHOD__ );
return false;
}
@@ -256,7 +238,7 @@ class LoadBalancer {
$i = $this->pickRandom( $currentLoads );
} else {
$i = $this->getRandomNonLagged( $currentLoads, $wiki );
- if ( $i === false && count( $currentLoads ) != 0 ) {
+ if ( $i === false && count( $currentLoads ) != 0 ) {
# All slaves lagged. Switch to read-only mode
wfDebugLog( 'replication', "All slaves lagged. Switch to read-only mode\n" );
$wgReadOnly = 'The database has been automatically locked ' .
@@ -270,16 +252,16 @@ class LoadBalancer {
# pickRandom() returned false
# This is permanent and means the configuration or the load monitor
# wants us to return false.
- wfDebugLog( 'connect', __METHOD__.": pickRandom() returned false\n" );
+ wfDebugLog( 'connect', __METHOD__ . ": pickRandom() returned false\n" );
wfProfileOut( __METHOD__ );
return false;
}
- wfDebugLog( 'connect', __METHOD__.": Using reader #$i: {$this->mServers[$i]['host']}...\n" );
+ wfDebugLog( 'connect', __METHOD__ . ": Using reader #$i: {$this->mServers[$i]['host']}...\n" );
$conn = $this->openConnection( $i, $wiki );
if ( !$conn ) {
- wfDebugLog( 'connect', __METHOD__.": Failed connecting to $i/$wiki\n" );
+ wfDebugLog( 'connect', __METHOD__ . ": Failed connecting to $i/$wiki\n" );
unset( $nonErrorLoads[$i] );
unset( $currentLoads[$i] );
continue;
@@ -318,7 +300,7 @@ class LoadBalancer {
# Some servers must have been overloaded
if ( $overloadedServers == 0 ) {
- throw new MWException( __METHOD__.": unexpectedly found no overloaded servers" );
+ throw new MWException( __METHOD__ . ": unexpectedly found no overloaded servers" );
}
# Back off for a while
# Scale the sleep time by the number of connected threads, to produce a
@@ -341,7 +323,7 @@ class LoadBalancer {
$this->mServers[$i]['slave pos'] = $conn->getSlavePos();
}
}
- if ( $this->mReadIndex <=0 && $this->mLoads[$i]>0 && $i !== false ) {
+ if ( $this->mReadIndex <= 0 && $this->mLoads[$i] > 0 && $i !== false ) {
$this->mReadIndex = $i;
}
}
@@ -356,7 +338,7 @@ class LoadBalancer {
*/
function sleep( $t ) {
wfProfileIn( __METHOD__ );
- wfDebug( __METHOD__.": waiting $t us\n" );
+ wfDebug( __METHOD__ . ": waiting $t us\n" );
usleep( $t );
wfProfileOut( __METHOD__ );
return $t;
@@ -390,7 +372,7 @@ class LoadBalancer {
wfProfileIn( __METHOD__ );
$this->mWaitForPos = $pos;
for ( $i = 1; $i < count( $this->mServers ); $i++ ) {
- $this->doWait( $i , true );
+ $this->doWait( $i, true );
}
wfProfileOut( __METHOD__ );
}
@@ -433,15 +415,15 @@ class LoadBalancer {
}
}
- wfDebug( __METHOD__.": Waiting for slave #$index to catch up...\n" );
+ wfDebug( __METHOD__ . ": Waiting for slave #$index to catch up...\n" );
$result = $conn->masterPosWait( $this->mWaitForPos, $this->mWaitTimeout );
if ( $result == -1 || is_null( $result ) ) {
# Timed out waiting for slave, use master instead
- wfDebug( __METHOD__.": Timed out waiting for slave #$index pos {$this->mWaitForPos}\n" );
+ wfDebug( __METHOD__ . ": Timed out waiting for slave #$index pos {$this->mWaitForPos}\n" );
return false;
} else {
- wfDebug( __METHOD__.": Done\n" );
+ wfDebug( __METHOD__ . ": Done\n" );
return true;
}
}
@@ -451,9 +433,10 @@ class LoadBalancer {
* This is the main entry point for this class.
*
* @param $i Integer: server index
- * @param $groups Array: query groups
- * @param $wiki String: wiki ID
+ * @param array $groups query groups
+ * @param bool|string $wiki Wiki ID
*
+ * @throws MWException
* @return DatabaseBase
*/
public function &getConnection( $i, $groups = array(), $wiki = false ) {
@@ -476,7 +459,7 @@ class LoadBalancer {
$groupIndex = $this->getReaderIndex( $groups, $wiki );
if ( $groupIndex !== false ) {
$serverName = $this->getServerName( $groupIndex );
- wfDebug( __METHOD__.": using server $serverName for group $groups\n" );
+ wfDebug( __METHOD__ . ": using server $serverName for group $groups\n" );
$i = $groupIndex;
}
} else {
@@ -484,7 +467,7 @@ class LoadBalancer {
$groupIndex = $this->getReaderIndex( $group, $wiki );
if ( $groupIndex !== false ) {
$serverName = $this->getServerName( $groupIndex );
- wfDebug( __METHOD__.": using server $serverName for group $group\n" );
+ wfDebug( __METHOD__ . ": using server $serverName for group $group\n" );
$i = $groupIndex;
break;
}
@@ -497,16 +480,16 @@ class LoadBalancer {
# Couldn't find a working server in getReaderIndex()?
if ( $i === false ) {
$this->mLastError = 'No working slave server: ' . $this->mLastError;
- $this->reportConnectionError( $this->mErrorConnection );
wfProfileOut( __METHOD__ );
- return false;
+ return $this->reportConnectionError();
}
}
# Now we have an explicit index into the servers array
$conn = $this->openConnection( $i, $wiki );
if ( !$conn ) {
- $this->reportConnectionError( $this->mErrorConnection );
+ wfProfileOut( __METHOD__ );
+ return $this->reportConnectionError();
}
wfProfileOut( __METHOD__ );
@@ -519,10 +502,11 @@ class LoadBalancer {
* the same number of times as getConnection() to work.
*
* @param DatabaseBase $conn
+ * @throws MWException
*/
public function reuseConnection( $conn ) {
- $serverIndex = $conn->getLBInfo('serverIndex');
- $refCount = $conn->getLBInfo('foreignPoolRefCount');
+ $serverIndex = $conn->getLBInfo( 'serverIndex' );
+ $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
$dbName = $conn->getDBname();
$prefix = $conn->tablePrefix();
if ( strval( $prefix ) !== '' ) {
@@ -531,7 +515,7 @@ class LoadBalancer {
$wiki = $dbName;
}
if ( $serverIndex === null || $refCount === null ) {
- wfDebug( __METHOD__.": this connection was not opened as a foreign connection\n" );
+ wfDebug( __METHOD__ . ": this connection was not opened as a foreign connection\n" );
/**
* This can happen in code like:
* foreach ( $dbs as $db ) {
@@ -545,15 +529,15 @@ class LoadBalancer {
return;
}
if ( $this->mConns['foreignUsed'][$serverIndex][$wiki] !== $conn ) {
- throw new MWException( __METHOD__.": connection not found, has the connection been freed already?" );
+ throw new MWException( __METHOD__ . ": connection not found, has the connection been freed already?" );
}
$conn->setLBInfo( 'foreignPoolRefCount', --$refCount );
if ( $refCount <= 0 ) {
$this->mConns['foreignFree'][$serverIndex][$wiki] = $conn;
unset( $this->mConns['foreignUsed'][$serverIndex][$wiki] );
- wfDebug( __METHOD__.": freed connection $serverIndex/$wiki\n" );
+ wfDebug( __METHOD__ . ": freed connection $serverIndex/$wiki\n" );
} else {
- wfDebug( __METHOD__.": reference count for $serverIndex/$wiki reduced to $refCount\n" );
+ wfDebug( __METHOD__ . ": reference count for $serverIndex/$wiki reduced to $refCount\n" );
}
}
@@ -566,7 +550,7 @@ class LoadBalancer {
* error will be available via $this->mErrorConnection.
*
* @param $i Integer server index
- * @param $wiki String wiki ID to open
+ * @param string $wiki wiki ID to open
* @return DatabaseBase
*
* @access private
@@ -575,7 +559,7 @@ class LoadBalancer {
wfProfileIn( __METHOD__ );
if ( $wiki !== false ) {
$conn = $this->openForeignConnection( $i, $wiki );
- wfProfileOut( __METHOD__);
+ wfProfileOut( __METHOD__ );
return $conn;
}
if ( isset( $this->mConns['local'][$i][0] ) ) {
@@ -585,6 +569,7 @@ class LoadBalancer {
$server['serverIndex'] = $i;
$conn = $this->reallyOpenConnection( $server, false );
if ( $conn->isOpen() ) {
+ wfDebug( "Connected to database $i at {$this->mServers[$i]['host']}\n" );
$this->mConns['local'][$i][0] = $conn;
} else {
wfDebug( "Failed to connect to database $i at {$this->mServers[$i]['host']}\n" );
@@ -611,22 +596,22 @@ class LoadBalancer {
* error will be available via $this->mErrorConnection.
*
* @param $i Integer: server index
- * @param $wiki String: wiki ID to open
+ * @param string $wiki wiki ID to open
* @return DatabaseBase
*/
function openForeignConnection( $i, $wiki ) {
- wfProfileIn(__METHOD__);
+ wfProfileIn( __METHOD__ );
list( $dbName, $prefix ) = wfSplitWikiID( $wiki );
if ( isset( $this->mConns['foreignUsed'][$i][$wiki] ) ) {
// Reuse an already-used connection
$conn = $this->mConns['foreignUsed'][$i][$wiki];
- wfDebug( __METHOD__.": reusing connection $i/$wiki\n" );
+ wfDebug( __METHOD__ . ": reusing connection $i/$wiki\n" );
} elseif ( isset( $this->mConns['foreignFree'][$i][$wiki] ) ) {
// Reuse a free connection for the same wiki
$conn = $this->mConns['foreignFree'][$i][$wiki];
unset( $this->mConns['foreignFree'][$i][$wiki] );
$this->mConns['foreignUsed'][$i][$wiki] = $conn;
- wfDebug( __METHOD__.": reusing free connection $i/$wiki\n" );
+ wfDebug( __METHOD__ . ": reusing free connection $i/$wiki\n" );
} elseif ( !empty( $this->mConns['foreignFree'][$i] ) ) {
// Reuse a connection from another wiki
$conn = reset( $this->mConns['foreignFree'][$i] );
@@ -641,7 +626,7 @@ class LoadBalancer {
$conn->tablePrefix( $prefix );
unset( $this->mConns['foreignFree'][$i][$oldWiki] );
$this->mConns['foreignUsed'][$i][$wiki] = $conn;
- wfDebug( __METHOD__.": reusing free connection from $oldWiki for $wiki\n" );
+ wfDebug( __METHOD__ . ": reusing free connection from $oldWiki for $wiki\n" );
}
} else {
// Open a new connection
@@ -650,13 +635,13 @@ class LoadBalancer {
$server['foreignPoolRefCount'] = 0;
$conn = $this->reallyOpenConnection( $server, $dbName );
if ( !$conn->isOpen() ) {
- wfDebug( __METHOD__.": error opening connection for $i/$wiki\n" );
+ wfDebug( __METHOD__ . ": error opening connection for $i/$wiki\n" );
$this->mErrorConnection = $conn;
$conn = false;
} else {
$conn->tablePrefix( $prefix );
$this->mConns['foreignUsed'][$i][$wiki] = $conn;
- wfDebug( __METHOD__.": opened new connection for $i/$wiki\n" );
+ wfDebug( __METHOD__ . ": opened new connection for $i/$wiki\n" );
}
}
@@ -665,7 +650,7 @@ class LoadBalancer {
$refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
$conn->setLBInfo( 'foreignPoolRefCount', $refCount + 1 );
}
- wfProfileOut(__METHOD__);
+ wfProfileOut( __METHOD__ );
return $conn;
}
@@ -690,6 +675,7 @@ class LoadBalancer {
*
* @param $server
* @param $dbNameOverride bool
+ * @throws MWException
* @return DatabaseBase
*/
function reallyOpenConnection( $server, $dbNameOverride = false ) {
@@ -698,15 +684,11 @@ class LoadBalancer {
'See DefaultSettings.php entry for $wgDBservers.' );
}
- $host = $server['host'];
- $dbname = $server['dbname'];
-
if ( $dbNameOverride !== false ) {
- $server['dbname'] = $dbname = $dbNameOverride;
+ $server['dbname'] = $dbNameOverride;
}
# Create object
- wfDebug( "Connecting to $host $dbname...\n" );
try {
$db = DatabaseBase::factory( $server['type'], $server );
} catch ( DBConnectionError $e ) {
@@ -715,11 +697,6 @@ class LoadBalancer {
$db = $e->db;
}
- if ( $db->isOpen() ) {
- wfDebug( "Connected to $host $dbname.\n" );
- } else {
- wfDebug( "Connection failed to $host $dbname.\n" );
- }
$db->setLBInfo( $server );
if ( isset( $server['fakeSlaveLag'] ) ) {
$db->setFakeSlaveLag( $server['fakeSlaveLag'] );
@@ -731,24 +708,24 @@ class LoadBalancer {
}
/**
- * @param $conn
* @throws DBConnectionError
+ * @return bool
*/
- function reportConnectionError( &$conn ) {
- wfProfileIn( __METHOD__ );
+ private function reportConnectionError() {
+ $conn = $this->mErrorConnection; // The connection which caused the error
if ( !is_object( $conn ) ) {
// No last connection, probably due to all servers being too busy
wfLogDBError( "LB failure with no last connection. Connection error: {$this->mLastError}\n" );
- $conn = new Database;
+
// If all servers were busy, mLastError will contain something sensible
- throw new DBConnectionError( $conn, $this->mLastError );
+ throw new DBConnectionError( null, $this->mLastError );
} else {
$server = $conn->getProperty( 'mServer' );
wfLogDBError( "Connection error: {$this->mLastError} ({$server})\n" );
- $conn->reportConnectionError( "{$this->mLastError} ({$server})" );
+ $conn->reportConnectionError( "{$this->mLastError} ({$server})" ); // throws DBConnectionError
}
- wfProfileOut( __METHOD__ );
+ return false; /* not reached */
}
/**
@@ -909,7 +886,9 @@ class LoadBalancer {
foreach ( $this->mConns as $conns2 ) {
foreach ( $conns2 as $conns3 ) {
foreach ( $conns3 as $conn ) {
- $conn->commit( __METHOD__ );
+ if ( $conn->trxLevel() ) {
+ $conn->commit( __METHOD__, 'flush' );
+ }
}
}
}
@@ -926,8 +905,8 @@ class LoadBalancer {
continue;
}
foreach ( $conns2[$masterIndex] as $conn ) {
- if ( $conn->writesOrCallbacksPending() ) {
- $conn->commit( __METHOD__ );
+ if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
+ $conn->commit( __METHOD__, 'flush' );
}
}
}
@@ -954,10 +933,11 @@ class LoadBalancer {
* @return bool
*/
function allowLagged( $mode = null ) {
- if ( $mode === null) {
+ if ( $mode === null ) {
return $this->mAllowLagged;
}
$this->mAllowLagged = $mode;
+ return $this->mAllowLagged;
}
/**
@@ -999,7 +979,7 @@ class LoadBalancer {
* May attempt to open connections to slaves on the default DB. If there is
* no lag, the maximum lag will be reported as -1.
*
- * @param $wiki string Wiki ID, or false for the default database
+ * @param string $wiki Wiki ID, or false for the default database
*
* @return array ( host, max lag, index of max lagged host )
*/
diff --git a/includes/db/LoadMonitor.php b/includes/db/LoadMonitor.php
index 146ac61e..ad7b3b2f 100644
--- a/includes/db/LoadMonitor.php
+++ b/includes/db/LoadMonitor.php
@@ -37,7 +37,7 @@ interface LoadMonitor {
/**
* Perform pre-connection load ratio adjustment.
* @param $loads array
- * @param $group String: the selected query group
+ * @param string $group the selected query group
* @param $wiki String
*/
function scaleLoads( &$loads, $group = false, $wiki = false );
@@ -159,7 +159,7 @@ class LoadMonitor_MySQL implements LoadMonitor {
$times = array();
foreach ( $serverIndexes as $i ) {
- if ($i == 0) { # Master
+ if ( $i == 0 ) { # Master
$times[$i] = 0;
} elseif ( false !== ( $conn = $this->parent->getAnyOpenConnection( $i ) ) ) {
$times[$i] = $conn->getLag();
@@ -173,7 +173,7 @@ class LoadMonitor_MySQL implements LoadMonitor {
$wgMemc->set( $memcKey, $times, $expiry );
# But don't give the timestamp to the caller
- unset($times['timestamp']);
+ unset( $times['timestamp'] );
$lagTimes = $times;
wfProfileOut( __METHOD__ );
@@ -189,7 +189,7 @@ class LoadMonitor_MySQL implements LoadMonitor {
if ( !$threshold ) {
return 0;
}
- $status = $conn->getMysqlStatus("Thread%");
+ $status = $conn->getMysqlStatus( "Thread%" );
if ( $status['Threads_running'] > $threshold ) {
$server = $conn->getProperty( 'mServer' );
wfLogDBError( "LB backoff from $server - Threads_running = {$status['Threads_running']}\n" );
@@ -199,4 +199,3 @@ class LoadMonitor_MySQL implements LoadMonitor {
}
}
}
-
diff --git a/includes/db/ORMIterator.php b/includes/db/ORMIterator.php
index 090b8932..077eab0f 100644
--- a/includes/db/ORMIterator.php
+++ b/includes/db/ORMIterator.php
@@ -23,9 +23,9 @@
* @file
* @ingroup ORM
*
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
interface ORMIterator extends Iterator {
-} \ No newline at end of file
+}
diff --git a/includes/db/ORMResult.php b/includes/db/ORMResult.php
index 2a5837a1..160033c4 100644
--- a/includes/db/ORMResult.php
+++ b/includes/db/ORMResult.php
@@ -25,7 +25,7 @@
* @file ORMResult.php
* @ingroup ORM
*
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
diff --git a/includes/db/ORMRow.php b/includes/db/ORMRow.php
index 303f3a20..6c1f27ff 100644
--- a/includes/db/ORMRow.php
+++ b/includes/db/ORMRow.php
@@ -27,11 +27,11 @@
* @file ORMRow.php
* @ingroup ORM
*
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
-abstract class ORMRow implements IORMRow {
+class ORMRow implements IORMRow {
/**
* The fields of the object.
@@ -120,7 +120,8 @@ abstract class ORMRow implements IORMRow {
$result = $this->table->rawSelectRow(
$this->table->getPrefixedFields( $fields ),
array( $this->table->getPrefixedField( 'id' ) => $this->getId() ),
- array( 'LIMIT' => 1 )
+ array( 'LIMIT' => 1 ),
+ __METHOD__
);
if ( $result !== false ) {
@@ -138,8 +139,9 @@ abstract class ORMRow implements IORMRow {
*
* @since 1.20
*
- * @param string $name
- * @param mixed $default
+ * @param string $name Field name
+ * @param $default mixed: Default value to return when none is found
+ * (default: null)
*
* @throws MWException
* @return mixed
@@ -159,7 +161,7 @@ abstract class ORMRow implements IORMRow {
*
* @since 1.20
*
- * @param string$name
+ * @param $name string
*
* @return mixed
*/
@@ -259,11 +261,18 @@ abstract class ORMRow implements IORMRow {
if ( array_key_exists( $name, $this->fields ) ) {
$value = $this->fields[$name];
+ // Skip null id fields so that the DBMS can set the default.
+ if ( $name === 'id' && is_null ( $value ) ) {
+ continue;
+ }
+
switch ( $type ) {
case 'array':
$value = (array)$value;
+ // fall-through!
case 'blob':
$value = serialize( $value );
+ // fall-through!
}
$values[$this->table->getPrefixedField( $name )] = $value;
@@ -346,7 +355,7 @@ abstract class ORMRow implements IORMRow {
* @return boolean Success indicator
*/
protected function saveExisting( $functionName = null ) {
- $dbw = wfGetDB( DB_MASTER );
+ $dbw = $this->table->getWriteDbConnection();
$success = $dbw->update(
$this->table->getName(),
@@ -355,6 +364,8 @@ abstract class ORMRow implements IORMRow {
is_null( $functionName ) ? __METHOD__ : $functionName
);
+ $this->table->releaseConnection( $dbw );
+
// DatabaseBase::update does not always return true for success as documented...
return $success !== false;
}
@@ -382,13 +393,13 @@ abstract class ORMRow implements IORMRow {
* @return boolean Success indicator
*/
protected function insert( $functionName = null, array $options = null ) {
- $dbw = wfGetDB( DB_MASTER );
+ $dbw = $this->table->getWriteDbConnection();
$success = $dbw->insert(
$this->table->getName(),
$this->getWriteValues(),
is_null( $functionName ) ? __METHOD__ : $functionName,
- is_null( $options ) ? array( 'IGNORE' ) : $options
+ $options
);
// DatabaseBase::insert does not always return true for success as documented...
@@ -398,6 +409,8 @@ abstract class ORMRow implements IORMRow {
$this->setField( 'id', $dbw->insertId() );
}
+ $this->table->releaseConnection( $dbw );
+
return $success;
}
@@ -411,7 +424,7 @@ abstract class ORMRow implements IORMRow {
public function remove() {
$this->beforeRemove();
- $success = $this->table->delete( array( 'id' => $this->getId() ) );
+ $success = $this->table->delete( array( 'id' => $this->getId() ), __METHOD__ );
// DatabaseBase::delete does not always return true for success as documented...
$success = $success !== false;
@@ -446,8 +459,8 @@ abstract class ORMRow implements IORMRow {
}
/**
- * Gets called after successfull removal.
- * Can be overriden to get rid of linked data.
+ * Gets called after successful removal.
+ * Can be overridden to get rid of linked data.
*
* @since 1.20
*/
@@ -501,11 +514,7 @@ abstract class ORMRow implements IORMRow {
$value = (float)$value;
break;
case 'bool':
- if ( is_string( $value ) ) {
- $value = $value !== '0';
- } elseif ( is_int( $value ) ) {
- $value = $value !== 0;
- }
+ $value = (bool)$value;
break;
case 'array':
if ( is_string( $value ) ) {
@@ -557,7 +566,7 @@ abstract class ORMRow implements IORMRow {
$absoluteAmount = abs( $amount );
$isNegative = $amount < 0;
- $dbw = wfGetDB( DB_MASTER );
+ $dbw = $this->table->getWriteDbConnection();
$fullField = $this->table->getPrefixedField( $field );
@@ -572,6 +581,8 @@ abstract class ORMRow implements IORMRow {
$this->setField( $field, $this->getField( $field ) + $amount );
}
+ $this->table->releaseConnection( $dbw );
+
return $success;
}
diff --git a/includes/db/ORMTable.php b/includes/db/ORMTable.php
index a77074ff..bcbe94a3 100644
--- a/includes/db/ORMTable.php
+++ b/includes/db/ORMTable.php
@@ -19,43 +19,150 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @since 1.20
+ * Non-abstract since 1.21
*
* @file ORMTable.php
* @ingroup ORM
*
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
-abstract class ORMTable implements IORMTable {
+class ORMTable extends DBAccessBase implements IORMTable {
/**
- * Gets the db field prefix.
+ * Cache for instances, used by the singleton method.
*
* @since 1.20
+ * @deprecated since 1.21
*
- * @return string
+ * @var ORMTable[]
*/
- protected abstract function getFieldPrefix();
+ protected static $instanceCache = array();
/**
- * Cache for instances, used by the singleton method.
+ * @since 1.21
*
- * @since 1.20
- * @var array of DBTable
+ * @var string
*/
- protected static $instanceCache = array();
+ protected $tableName;
+
+ /**
+ * @since 1.21
+ *
+ * @var string[]
+ */
+ protected $fields = array();
+
+ /**
+ * @since 1.21
+ *
+ * @var string
+ */
+ protected $fieldPrefix = '';
+
+ /**
+ * @since 1.21
+ *
+ * @var string
+ */
+ protected $rowClass = 'ORMRow';
/**
- * The database connection to use for read operations.
+ * @since 1.21
+ *
+ * @var array
+ */
+ protected $defaults = array();
+
+ /**
+ * ID of the database connection to use for read operations.
* Can be changed via @see setReadDb.
*
* @since 1.20
+ *
* @var integer DB_ enum
*/
protected $readDb = DB_SLAVE;
/**
+ * Constructor.
+ *
+ * @since 1.21
+ *
+ * @param string $tableName
+ * @param string[] $fields
+ * @param array $defaults
+ * @param string|null $rowClass
+ * @param string $fieldPrefix
+ */
+ public function __construct( $tableName = '', array $fields = array(), array $defaults = array(), $rowClass = null, $fieldPrefix = '' ) {
+ $this->tableName = $tableName;
+ $this->fields = $fields;
+ $this->defaults = $defaults;
+
+ if ( is_string( $rowClass ) ) {
+ $this->rowClass = $rowClass;
+ }
+
+ $this->fieldPrefix = $fieldPrefix;
+ }
+
+ /**
+ * @see IORMTable::getName
+ *
+ * @since 1.21
+ *
+ * @return string
+ * @throws MWException
+ */
+ public function getName() {
+ if ( $this->tableName === '' ) {
+ throw new MWException( 'The table name needs to be set' );
+ }
+
+ return $this->tableName;
+ }
+
+ /**
+ * Gets the db field prefix.
+ *
+ * @since 1.20
+ *
+ * @return string
+ */
+ protected function getFieldPrefix() {
+ return $this->fieldPrefix;
+ }
+
+ /**
+ * @see IORMTable::getRowClass
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function getRowClass() {
+ return $this->rowClass;
+ }
+
+ /**
+ * @see ORMTable::getFields
+ *
+ * @since 1.21
+ *
+ * @return array
+ * @throws MWException
+ */
+ public function getFields() {
+ if ( $this->fields === array() ) {
+ throw new MWException( 'The table needs to have one or more fields' );
+ }
+
+ return $this->fields;
+ }
+
+ /**
* Returns a list of default field values.
* field name => field value
*
@@ -64,7 +171,7 @@ abstract class ORMTable implements IORMTable {
* @return array
*/
public function getDefaults() {
- return array();
+ return $this->defaults;
}
/**
@@ -94,8 +201,9 @@ abstract class ORMTable implements IORMTable {
* @return ORMResult
*/
public function select( $fields = null, array $conditions = array(),
- array $options = array(), $functionName = null ) {
- return new ORMResult( $this, $this->rawSelect( $fields, $conditions, $options, $functionName ) );
+ array $options = array(), $functionName = null ) {
+ $res = $this->rawSelect( $fields, $conditions, $options, $functionName );
+ return new ORMResult( $this, $res );
}
/**
@@ -109,10 +217,11 @@ abstract class ORMTable implements IORMTable {
* @param array $options
* @param string|null $functionName
*
- * @return array of self
+ * @return array of row objects
+ * @throws DBQueryError if the query failed (even if the database was in ignoreErrors mode).
*/
public function selectObjects( $fields = null, array $conditions = array(),
- array $options = array(), $functionName = null ) {
+ array $options = array(), $functionName = null ) {
$result = $this->selectFields( $fields, $conditions, $options, false, $functionName );
$objects = array();
@@ -130,14 +239,15 @@ abstract class ORMTable implements IORMTable {
* @since 1.20
*
* @param null|string|array $fields
- * @param array $conditions
- * @param array $options
- * @param null|string $functionName
+ * @param array $conditions
+ * @param array $options
+ * @param null|string $functionName
*
* @return ResultWrapper
+ * @throws DBQueryError if the quey failed (even if the database was in ignoreErrors mode).
*/
public function rawSelect( $fields = null, array $conditions = array(),
- array $options = array(), $functionName = null ) {
+ array $options = array(), $functionName = null ) {
if ( is_null( $fields ) ) {
$fields = array_keys( $this->getFields() );
}
@@ -145,13 +255,39 @@ abstract class ORMTable implements IORMTable {
$fields = (array)$fields;
}
- return wfGetDB( $this->getReadDb() )->select(
+ $dbr = $this->getReadDbConnection();
+ $result = $dbr->select(
$this->getName(),
$this->getPrefixedFields( $fields ),
$this->getPrefixedValues( $conditions ),
is_null( $functionName ) ? __METHOD__ : $functionName,
$options
);
+
+ /* @var Exception $error */
+ $error = null;
+
+ if ( $result === false ) {
+ // Database connection was in "ignoreErrors" mode. We don't like that.
+ // So, we emulate the DBQueryError that should have been thrown.
+ $error = new DBQueryError(
+ $dbr,
+ $dbr->lastError(),
+ $dbr->lastErrno(),
+ $dbr->lastQuery(),
+ is_null( $functionName ) ? __METHOD__ : $functionName
+ );
+ }
+
+ $this->releaseConnection( $dbr );
+
+ if ( $error ) {
+ // Note: construct the error before releasing the connection,
+ // but throw it after.
+ throw $error;
+ }
+
+ return $result;
}
/**
@@ -177,7 +313,7 @@ abstract class ORMTable implements IORMTable {
* @return array of array
*/
public function selectFields( $fields = null, array $conditions = array(),
- array $options = array(), $collapse = true, $functionName = null ) {
+ array $options = array(), $collapse = true, $functionName = null ) {
$objects = array();
$result = $this->rawSelect( $fields, $conditions, $options, $functionName );
@@ -223,7 +359,7 @@ abstract class ORMTable implements IORMTable {
$objects = $this->select( $fields, $conditions, $options, $functionName );
- return $objects->isEmpty() ? false : $objects->current();
+ return ( !$objects || $objects->isEmpty() ) ? false : $objects->current();
}
/**
@@ -241,15 +377,18 @@ abstract class ORMTable implements IORMTable {
*/
public function rawSelectRow( array $fields, array $conditions = array(),
array $options = array(), $functionName = null ) {
- $dbr = wfGetDB( $this->getReadDb() );
+ $dbr = $this->getReadDbConnection();
- return $dbr->selectRow(
+ $result = $dbr->selectRow(
$this->getName(),
$fields,
$conditions,
is_null( $functionName ) ? __METHOD__ : $functionName,
$options
);
+
+ $this->releaseConnection( $dbr );
+ return $result;
}
/**
@@ -293,6 +432,21 @@ abstract class ORMTable implements IORMTable {
}
/**
+ * Checks if the table exists
+ *
+ * @since 1.21
+ *
+ * @return boolean
+ */
+ public function exists() {
+ $dbr = $this->getReadDbConnection();
+ $exists = $dbr->tableExists( $this->getName() );
+ $this->releaseConnection( $dbr );
+
+ return $exists;
+ }
+
+ /**
* Returns the amount of matching records.
* Condition field names get prefixed.
*
@@ -310,7 +464,8 @@ abstract class ORMTable implements IORMTable {
$res = $this->rawSelectRow(
array( 'rowcount' => 'COUNT(*)' ),
$this->getPrefixedValues( $conditions ),
- $options
+ $options,
+ __METHOD__
);
return $res->rowcount;
@@ -327,13 +482,18 @@ abstract class ORMTable implements IORMTable {
* @return boolean Success indicator
*/
public function delete( array $conditions, $functionName = null ) {
- return wfGetDB( DB_MASTER )->delete(
+ $dbw = $this->getWriteDbConnection();
+
+ $result = $dbw->delete(
$this->getName(),
$conditions === array() ? '*' : $this->getPrefixedValues( $conditions ),
- $functionName
+ is_null( $functionName ) ? __METHOD__ : $functionName
) !== false; // DatabaseBase::delete does not always return true for success as documented...
+
+ $this->releaseConnection( $dbw );
+ return $result;
}
-
+
/**
* Get API parameters for the fields supported by this object.
*
@@ -397,7 +557,7 @@ abstract class ORMTable implements IORMTable {
}
/**
- * Get the database type used for read operations.
+ * Get the database ID used for read operations.
*
* @since 1.20
*
@@ -408,7 +568,7 @@ abstract class ORMTable implements IORMTable {
}
/**
- * Set the database type to use for read operations.
+ * Set the database ID to use for read operations, use DB_XXX constants or an index to the load balancer setup.
*
* @param integer $db
*
@@ -419,6 +579,70 @@ abstract class ORMTable implements IORMTable {
}
/**
+ * Get the ID of the any foreign wiki to use as a target for database operations
+ *
+ * @since 1.20
+ *
+ * @return String|bool The target wiki, in a form that LBFactory understands (or false if the local wiki is used)
+ */
+ public function getTargetWiki() {
+ return $this->wiki;
+ }
+
+ /**
+ * Set the ID of the any foreign wiki to use as a target for database operations
+ *
+ * @param string|bool $wiki The target wiki, in a form that LBFactory understands (or false if the local wiki shall be used)
+ *
+ * @since 1.20
+ */
+ public function setTargetWiki( $wiki ) {
+ $this->wiki = $wiki;
+ }
+
+ /**
+ * Get the database type used for read operations.
+ * This is to be used instead of wfGetDB.
+ *
+ * @see LoadBalancer::getConnection
+ *
+ * @since 1.20
+ *
+ * @return DatabaseBase The database object
+ */
+ public function getReadDbConnection() {
+ return $this->getConnection( $this->getReadDb(), array() );
+ }
+
+ /**
+ * Get the database type used for read operations.
+ * This is to be used instead of wfGetDB.
+ *
+ * @see LoadBalancer::getConnection
+ *
+ * @since 1.20
+ *
+ * @return DatabaseBase The database object
+ */
+ public function getWriteDbConnection() {
+ return $this->getConnection( DB_MASTER, array() );
+ }
+
+ /**
+ * Releases the lease on the given database connection. This is useful mainly
+ * for connections to a foreign wiki. It does nothing for connections to the local wiki.
+ *
+ * @see LoadBalancer::reuseConnection
+ *
+ * @param DatabaseBase $db the database
+ *
+ * @since 1.20
+ */
+ public function releaseConnection( DatabaseBase $db ) {
+ parent::releaseConnection( $db ); // just make it public
+ }
+
+ /**
* Update the records matching the provided conditions by
* setting the fields that are keys in the $values param to
* their corresponding values.
@@ -431,14 +655,17 @@ abstract class ORMTable implements IORMTable {
* @return boolean Success indicator
*/
public function update( array $values, array $conditions = array() ) {
- $dbw = wfGetDB( DB_MASTER );
+ $dbw = $this->getWriteDbConnection();
- return $dbw->update(
+ $result = $dbw->update(
$this->getName(),
$this->getPrefixedValues( $values ),
$this->getPrefixedValues( $conditions ),
__METHOD__
) !== false; // DatabaseBase::update does not always return true for success as documented...
+
+ $this->releaseConnection( $dbw );
+ return $result;
}
/**
@@ -450,6 +677,7 @@ abstract class ORMTable implements IORMTable {
* @param array $conditions
*/
public function updateSummaryFields( $summaryFields = null, array $conditions = array() ) {
+ $slave = $this->getReadDb();
$this->setReadDb( DB_MASTER );
/**
@@ -461,7 +689,7 @@ abstract class ORMTable implements IORMTable {
$item->save();
}
- $this->setReadDb( DB_SLAVE );
+ $this->setReadDb( $slave );
}
/**
@@ -559,6 +787,7 @@ abstract class ORMTable implements IORMTable {
* Get an instance of this class.
*
* @since 1.20
+ * @deprecated since 1.21
*
* @return IORMTable
*/
diff --git a/includes/debug/Debug.php b/includes/debug/Debug.php
index d02bcf53..8c39e1a1 100644
--- a/includes/debug/Debug.php
+++ b/includes/debug/Debug.php
@@ -135,6 +135,7 @@ class MWDebug {
* @since 1.19
* @param $msg string
* @param $callerOffset int
+ * @param int $level A PHP error level. See sendWarning()
* @return mixed
*/
public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
@@ -161,9 +162,9 @@ class MWDebug {
* - MediaWiki's debug log, if $wgDevelopmentWarnings is set to false.
*
* @since 1.19
- * @param $function string: Function that is deprecated.
- * @param $version string|bool: Version in which the function was deprecated.
- * @param $component string|bool: Component to which the function belongs.
+ * @param string $function Function that is deprecated.
+ * @param string|bool $version Version in which the function was deprecated.
+ * @param string|bool $component Component to which the function belongs.
* If false, it is assumbed the function is in MediaWiki core.
* @param $callerOffset integer: How far up the callstack is the original
* caller. 2 = function that called the function that called
@@ -269,8 +270,8 @@ class MWDebug {
* Send a warning either to the debug log or by triggering an user PHP
* error depending on $wgDevelopmentWarnings.
*
- * @param $msg string Message to send
- * @param $caller array caller description get from getCallerDescription()
+ * @param string $msg Message to send
+ * @param array $caller caller description get from getCallerDescription()
* @param $level error level to use if $wgDevelopmentWarnings is true
*/
private static function sendWarning( $msg, $caller, $level ) {
diff --git a/includes/diff/DairikiDiff.php b/includes/diff/DairikiDiff.php
index 72eb5d3c..94ffc066 100644
--- a/includes/diff/DairikiDiff.php
+++ b/includes/diff/DairikiDiff.php
@@ -5,6 +5,21 @@
* Copyright © 2000, 2001 Geoffrey T. Dairiki <dairiki@dairiki.org>
* You may copy this code freely under the conditions of the GPL.
*
+ * 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 DifferenceEngine
* @defgroup DifferenceEngine DifferenceEngine
@@ -28,14 +43,14 @@ class _DiffOp {
* @return int
*/
function norig() {
- return $this->orig ? sizeof( $this->orig ) : 0;
+ return $this->orig ? count( $this->orig ) : 0;
}
/**
* @return int
*/
function nclosing() {
- return $this->closing ? sizeof( $this->closing ) : 0;
+ return $this->closing ? count( $this->closing ) : 0;
}
}
@@ -152,7 +167,7 @@ class _DiffOp_Change extends _DiffOp {
*/
class _DiffEngine {
- const MAX_XREF_LENGTH = 10000;
+ const MAX_XREF_LENGTH = 10000;
protected $xchanged, $ychanged;
@@ -179,8 +194,8 @@ class _DiffEngine {
$this->_shift_boundaries( $to_lines, $this->ychanged, $this->xchanged );
// Compute the edit operations.
- $n_from = sizeof( $from_lines );
- $n_to = sizeof( $to_lines );
+ $n_from = count( $from_lines );
+ $n_to = count( $to_lines );
$edits = array();
$xi = $yi = 0;
@@ -206,7 +221,7 @@ class _DiffEngine {
}
$add = array();
- while ( $yi < $n_to && $this->ychanged[$yi] ) {
+ while ( $yi < $n_to && $this->ychanged[$yi] ) {
$add[] = $to_lines[$yi++];
}
@@ -239,8 +254,8 @@ class _DiffEngine {
unset( $wikidiff3 );
} else {
// old diff
- $n_from = sizeof( $from_lines );
- $n_to = sizeof( $to_lines );
+ $n_from = count( $from_lines );
+ $n_to = count( $to_lines );
$this->xchanged = $this->ychanged = array();
$this->xv = $this->yv = array();
$this->xind = $this->yind = array();
@@ -288,7 +303,7 @@ class _DiffEngine {
}
// Find the LCS.
- $this->_compareseq( 0, sizeof( $this->xv ), 0, sizeof( $this->yv ) );
+ $this->_compareseq( 0, count( $this->xv ), 0, count( $this->yv ) );
}
wfProfileOut( __METHOD__ );
}
@@ -311,7 +326,7 @@ class _DiffEngine {
* [XOFF, XLIM) and [YOFF, YLIM) into NCHUNKS approximately equally
* sized segments.
*
- * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an
+ * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an
* array of NCHUNKS+1 (X, Y) indexes giving the diving points between
* sub sequences. The first sub-sequence is contained in [X0, X1),
* [Y0, Y1), the second in [X1, X2), [Y1, Y2) and so on. Note
@@ -476,8 +491,7 @@ class _DiffEngine {
// $nchunks = sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5);
// $nchunks = max(2,min(8,(int)$nchunks));
$nchunks = min( 7, $xlim - $xoff, $ylim - $yoff ) + 1;
- list ( $lcs, $seps )
- = $this->_diag( $xoff, $xlim, $yoff, $ylim, $nchunks );
+ list ( $lcs, $seps ) = $this->_diag( $xoff, $xlim, $yoff, $ylim, $nchunks );
}
if ( $lcs == 0 ) {
@@ -518,9 +532,9 @@ class _DiffEngine {
$i = 0;
$j = 0;
- assert( 'sizeof($lines) == sizeof($changed)' );
- $len = sizeof( $lines );
- $other_len = sizeof( $other_changed );
+ assert( 'count($lines) == count($changed)' );
+ $len = count( $lines );
+ $other_len = count( $other_changed );
while ( 1 ) {
/*
@@ -698,7 +712,7 @@ class Diff {
$lcs = 0;
foreach ( $this->edits as $edit ) {
if ( $edit->type == 'copy' ) {
- $lcs += sizeof( $edit->orig );
+ $lcs += count( $edit->orig );
}
}
return $lcs;
@@ -717,7 +731,7 @@ class Diff {
foreach ( $this->edits as $edit ) {
if ( $edit->orig ) {
- array_splice( $lines, sizeof( $lines ), 0, $edit->orig );
+ array_splice( $lines, count( $lines ), 0, $edit->orig );
}
}
return $lines;
@@ -736,7 +750,7 @@ class Diff {
foreach ( $this->edits as $edit ) {
if ( $edit->closing ) {
- array_splice( $lines, sizeof( $lines ), 0, $edit->closing );
+ array_splice( $lines, count( $lines ), 0, $edit->closing );
}
}
return $lines;
@@ -766,7 +780,6 @@ class Diff {
trigger_error( "Reversed closing doesn't match", E_USER_ERROR );
}
-
$prevtype = 'none';
foreach ( $this->edits as $edit ) {
if ( $prevtype == $edit->type ) {
@@ -814,23 +827,23 @@ class MappedDiff extends Diff {
$mapped_from_lines, $mapped_to_lines ) {
wfProfileIn( __METHOD__ );
- assert( 'sizeof( $from_lines ) == sizeof( $mapped_from_lines )' );
- assert( 'sizeof( $to_lines ) == sizeof( $mapped_to_lines )' );
+ assert( 'count( $from_lines ) == count( $mapped_from_lines )' );
+ assert( 'count( $to_lines ) == count( $mapped_to_lines )' );
parent::__construct( $mapped_from_lines, $mapped_to_lines );
$xi = $yi = 0;
- for ( $i = 0; $i < sizeof( $this->edits ); $i++ ) {
+ for ( $i = 0; $i < count( $this->edits ); $i++ ) {
$orig = &$this->edits[$i]->orig;
if ( is_array( $orig ) ) {
- $orig = array_slice( $from_lines, $xi, sizeof( $orig ) );
- $xi += sizeof( $orig );
+ $orig = array_slice( $from_lines, $xi, count( $orig ) );
+ $xi += count( $orig );
}
$closing = &$this->edits[$i]->closing;
if ( is_array( $closing ) ) {
- $closing = array_slice( $to_lines, $yi, sizeof( $closing ) );
- $yi += sizeof( $closing );
+ $closing = array_slice( $to_lines, $yi, count( $closing ) );
+ $yi += count( $closing );
}
}
wfProfileOut( __METHOD__ );
@@ -885,7 +898,7 @@ class DiffFormatter {
foreach ( $diff->edits as $edit ) {
if ( $edit->type == 'copy' ) {
if ( is_array( $block ) ) {
- if ( sizeof( $edit->orig ) <= $nlead + $ntrail ) {
+ if ( count( $edit->orig ) <= $nlead + $ntrail ) {
$block[] = $edit;
} else {
if ( $ntrail ) {
@@ -901,9 +914,9 @@ class DiffFormatter {
$context = $edit->orig;
} else {
if ( !is_array( $block ) ) {
- $context = array_slice( $context, sizeof( $context ) - $nlead );
- $x0 = $xi - sizeof( $context );
- $y0 = $yi - sizeof( $context );
+ $context = array_slice( $context, count( $context ) - $nlead );
+ $x0 = $xi - count( $context );
+ $y0 = $yi - count( $context );
$block = array();
if ( $context ) {
$block[] = new _DiffOp_Copy( $context );
@@ -913,10 +926,10 @@ class DiffFormatter {
}
if ( $edit->orig ) {
- $xi += sizeof( $edit->orig );
+ $xi += count( $edit->orig );
}
if ( $edit->closing ) {
- $yi += sizeof( $edit->closing );
+ $yi += count( $edit->closing );
}
}
@@ -1350,7 +1363,7 @@ class TableDiffFormatter extends DiffFormatter {
*/
function _block_header( $xbeg, $xlen, $ybeg, $ylen ) {
$r = '<tr><td colspan="2" class="diff-lineno"><!--LINE ' . $xbeg . "--></td>\n" .
- '<td colspan="2" class="diff-lineno"><!--LINE ' . $ybeg . "--></td></tr>\n";
+ '<td colspan="2" class="diff-lineno"><!--LINE ' . $ybeg . "--></td></tr>\n";
return $r;
}
diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php
index c7156fb2..0f3c77ff 100644
--- a/includes/diff/DifferenceEngine.php
+++ b/includes/diff/DifferenceEngine.php
@@ -38,7 +38,10 @@ class DifferenceEngine extends ContextSource {
* @private
*/
var $mOldid, $mNewid;
- var $mOldtext, $mNewtext;
+ /**
+ * @var Content
+ */
+ var $mOldContent, $mNewContent;
protected $mDiffLang;
/**
@@ -77,7 +80,7 @@ class DifferenceEngine extends ContextSource {
* Constructor
* @param $context IContextSource context to use, anything else will be ignored
* @param $old Integer old ID we want to show and diff with.
- * @param $new String either 'prev' or 'next'.
+ * @param string $new either 'prev' or 'next'.
* @param $rcid Integer ??? FIXME (default 0)
* @param $refreshCache boolean If set, refreshes the diff cache
* @param $unhide boolean If set, allow viewing deleted revs
@@ -149,7 +152,7 @@ class DifferenceEngine extends ContextSource {
function deletedLink( $id ) {
if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
$dbr = wfGetDB( DB_SLAVE );
- $row = $dbr->selectRow('archive', '*',
+ $row = $dbr->selectRow( 'archive', '*',
array( 'ar_rev_id' => $id ),
__METHOD__ );
if ( $row ) {
@@ -224,6 +227,10 @@ class DifferenceEngine extends ContextSource {
# we'll use the application/x-external-editor interface to call
# an external diff tool like kompare, kdiff3, etc.
if ( ExternalEdit::useExternalEngine( $this->getContext(), 'diff' ) ) {
+ //TODO: come up with a good solution for non-text content here.
+ // at least, the content format needs to be passed to the client somehow.
+ // Currently, action=raw will just fail for non-text content.
+
$urls = array(
'File' => array( 'Extension' => 'wiki', 'URL' =>
# This should be mOldPage, but it may not be set, see below.
@@ -260,6 +267,8 @@ class DifferenceEngine extends ContextSource {
$deleted = $suppressed = false;
$allowed = $this->mNewRev->userCan( Revision::DELETED_TEXT, $user );
+ $revisionTools = array();
+
# mOldRev is false if the difference engine is called with a "vague" query for
# a diff between a version V and its previous version V' AND the version V
# is the first version of that article. In that case, V' does not exist.
@@ -287,12 +296,14 @@ class DifferenceEngine extends ContextSource {
if ( $samePage && $this->mNewPage->quickUserCan( 'edit', $user ) ) {
if ( $this->mNewRev->isCurrent() && $this->mNewPage->userCan( 'rollback', $user ) ) {
- $out->preventClickjacking();
- $rollback = '&#160;&#160;&#160;' . Linker::generateRollback( $this->mNewRev, $this->getContext() );
+ $rollbackLink = Linker::generateRollback( $this->mNewRev, $this->getContext() );
+ if ( $rollbackLink ) {
+ $out->preventClickjacking();
+ $rollback = '&#160;&#160;&#160;' . $rollbackLink;
+ }
}
if ( !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) && !$this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
- $undoLink = ' ' . $this->msg( 'parentheses' )->rawParams(
- Html::element( 'a', array(
+ $undoLink = Html::element( 'a', array(
'href' => $this->mNewPage->getLocalUrl( array(
'action' => 'edit',
'undoafter' => $this->mOldid,
@@ -300,7 +311,8 @@ class DifferenceEngine extends ContextSource {
'title' => Linker::titleAttrib( 'undo' )
),
$this->msg( 'editundo' )->text()
- ) )->escaped();
+ );
+ $revisionTools[] = $undoLink;
}
}
@@ -366,7 +378,15 @@ class DifferenceEngine extends ContextSource {
# Handle RevisionDelete links...
$rdel = $this->revisionDeleteLink( $this->mNewRev );
- $newRevisionHeader = $this->getRevisionHeader( $this->mNewRev, 'complete' ) . $undoLink;
+
+ # Allow extensions to define their own revision tools
+ wfRunHooks( 'DiffRevisionTools', array( $this->mNewRev, &$revisionTools ) );
+ $formattedRevisionTools = array();
+ // Put each one in parentheses (poor man's button)
+ foreach ( $revisionTools as $tool ) {
+ $formattedRevisionTools[] = $this->msg( 'parentheses' )->rawParams( $tool )->escaped();
+ }
+ $newRevisionHeader = $this->getRevisionHeader( $this->mNewRev, 'complete' ) . ' ' . implode( ' ', $formattedRevisionTools );
$newHeader = '<div id="mw-diff-ntitle1"><strong>' . $newRevisionHeader . '</strong></div>' .
'<div id="mw-diff-ntitle2">' . Linker::revUserTools( $this->mNewRev, !$this->unhide ) .
@@ -417,8 +437,8 @@ class DifferenceEngine extends ContextSource {
/**
* Get a link to mark the change as patrolled, or '' if there's either no
* revision to patrol or the user is not allowed to to it.
- * Side effect: this method will call OutputPage::preventClickjacking()
- * when a link is builded.
+ * Side effect: When the patrol link is build, this method will call
+ * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
*
* @return String
*/
@@ -459,6 +479,8 @@ class DifferenceEngine extends ContextSource {
// Build the link
if ( $rcid ) {
$this->getOutput()->preventClickjacking();
+ $this->getOutput()->addModules( 'mediawiki.page.patrol.ajax' );
+
$token = $this->getUser()->getEditToken( $rcid );
$this->mMarkPatrolledLink = ' <span class="patrollink">[' . Linker::linkKnown(
$this->mNewPage,
@@ -510,19 +532,23 @@ class DifferenceEngine extends ContextSource {
$out->setRevisionTimestamp( $this->mNewRev->getTimestamp() );
$out->setArticleFlag( true );
+ // NOTE: only needed for B/C: custom rendering of JS/CSS via hook
if ( $this->mNewPage->isCssJsSubpage() || $this->mNewPage->isCssOrJsPage() ) {
// Stolen from Article::view --AG 2007-10-11
// Give hooks a chance to customise the output
// @TODO: standardize this crap into one function
- if ( wfRunHooks( 'ShowRawCssJs', array( $this->mNewtext, $this->mNewPage, $out ) ) ) {
- // Wrap the whole lot in a <pre> and don't parse
- $m = array();
- preg_match( '!\.(css|js)$!u', $this->mNewPage->getText(), $m );
- $out->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
- $out->addHTML( htmlspecialchars( $this->mNewtext ) );
- $out->addHTML( "\n</pre>\n" );
+ if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+ // NOTE: deprecated hook, B/C only
+ // use the content object's own rendering
+ $cnt = $this->mNewRev->getContent();
+ $po = $cnt ? $cnt->getParserOutput( $this->mNewRev->getTitle(), $this->mNewRev->getId() ) : null;
+ $txt = $po ? $po->getText() : '';
+ $out->addHTML( $txt );
}
- } elseif ( !wfRunHooks( 'ArticleViewCustom', array( $this->mNewtext, $this->mNewPage, $out ) ) ) {
+ } elseif( !wfRunHooks( 'ArticleContentViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+ // Handled by extension
+ } elseif( !ContentHandler::runLegacyHooks( 'ArticleViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+ // NOTE: deprecated hook, B/C only
// Handled by extension
} else {
// Normal page
@@ -536,16 +562,21 @@ class DifferenceEngine extends ContextSource {
$wikiPage = WikiPage::factory( $this->mNewPage );
}
- $parserOptions = $wikiPage->makeParserOptions( $this->getContext() );
+ $parserOutput = $this->getParserOutput( $wikiPage, $this->mNewRev );
- if ( !$this->mNewRev->isCurrent() ) {
- $parserOptions->setEditSection( false );
- }
+ # Also try to load it as a redirect
+ $rt = $this->mNewContent ? $this->mNewContent->getRedirectTarget() : null;
- $parserOutput = $wikiPage->getParserOutput( $parserOptions, $this->mNewid );
+ if ( $rt ) {
+ $article = Article::newFromTitle( $this->mNewPage, $this->getContext() );
+ $out->addHTML( $article->viewRedirect( $rt ) );
- # WikiPage::getParserOutput() should not return false, but just in case
- if( $parserOutput ) {
+ # WikiPage::getParserOutput() should not return false, but just in case
+ if ( $parserOutput ) {
+ # Show categories etc.
+ $out->addParserOutputNoText( $parserOutput );
+ }
+ } else if ( $parserOutput ) {
$out->addParserOutput( $parserOutput );
}
}
@@ -556,6 +587,17 @@ class DifferenceEngine extends ContextSource {
wfProfileOut( __METHOD__ );
}
+ protected function getParserOutput( WikiPage $page, Revision $rev ) {
+ $parserOptions = $page->makeParserOptions( $this->getContext() );
+
+ if ( !$rev->isCurrent() || !$rev->getTitle()->quickUserCan( "edit" ) ) {
+ $parserOptions->setEditSection( false );
+ }
+
+ $parserOutput = $page->getParserOutput( $parserOptions, $rev->getId() );
+ return $parserOutput;
+ }
+
/**
* Get the diff text, send it to the OutputPage object
* Returns false if the diff could not be generated, otherwise returns true
@@ -584,9 +626,9 @@ class DifferenceEngine extends ContextSource {
/**
* Get complete diff table, including header
*
- * @param $otitle Title: old title
- * @param $ntitle Title: new title
- * @param $notice String: HTML between diff header and body
+ * @param string|bool $otitle Header for old text or false
+ * @param string|bool $ntitle Header for new text or false
+ * @param string $notice HTML between diff header and body
* @return mixed
*/
function getDiff( $otitle, $ntitle, $notice = '' ) {
@@ -652,7 +694,7 @@ class DifferenceEngine extends ContextSource {
return false;
}
- $difftext = $this->generateDiffBody( $this->mOldtext, $this->mNewtext );
+ $difftext = $this->generateContentDiffBody( $this->mOldContent, $this->mNewContent );
// Save to cache for 7 days
if ( !wfRunHooks( 'AbortDiffCache', array( &$this ) ) ) {
@@ -690,13 +732,64 @@ class DifferenceEngine extends ContextSource {
}
/**
+ * Generate a diff, no caching.
+ *
+ * This implementation uses generateTextDiffBody() to generate a diff based on the default
+ * serialization of the given Content objects. This will fail if $old or $new are not
+ * instances of TextContent.
+ *
+ * Subclasses may override this to provide a different rendering for the diff,
+ * perhaps taking advantage of the content's native form. This is required for all content
+ * models that are not text based.
+ *
+ * @param $old Content: old content
+ * @param $new Content: new content
+ *
+ * @return bool|string
+ * @since 1.21
+ * @throws MWException if $old or $new are not instances of TextContent.
+ */
+ function generateContentDiffBody( Content $old, Content $new ) {
+ if ( !( $old instanceof TextContent ) ) {
+ throw new MWException( "Diff not implemented for " . get_class( $old ) . "; "
+ . "override generateContentDiffBody to fix this." );
+ }
+
+ if ( !( $new instanceof TextContent ) ) {
+ throw new MWException( "Diff not implemented for " . get_class( $new ) . "; "
+ . "override generateContentDiffBody to fix this." );
+ }
+
+ $otext = $old->serialize();
+ $ntext = $new->serialize();
+
+ return $this->generateTextDiffBody( $otext, $ntext );
+ }
+
+ /**
* Generate a diff, no caching
*
- * @param $otext String: old text, must be already segmented
- * @param $ntext String: new text, must be already segmented
+ * @param string $otext old text, must be already segmented
+ * @param string $ntext new text, must be already segmented
* @return bool|string
+ * @deprecated since 1.21, use generateContentDiffBody() instead!
*/
function generateDiffBody( $otext, $ntext ) {
+ ContentHandler::deprecated( __METHOD__, "1.21" );
+
+ return $this->generateTextDiffBody( $otext, $ntext );
+ }
+
+ /**
+ * Generate a diff, no caching
+ *
+ * @todo move this to TextDifferenceEngine, make DifferenceEngine abstract. At some point.
+ *
+ * @param string $otext old text, must be already segmented
+ * @param string $ntext new text, must be already segmented
+ * @return bool|string
+ */
+ function generateTextDiffBody( $otext, $ntext ) {
global $wgExternalDiffEngine, $wgContLang;
wfProfileIn( __METHOD__ );
@@ -804,7 +897,6 @@ class DifferenceEngine extends ContextSource {
return $this->msg( 'lineno' )->numParams( $matches[1] )->escaped();
}
-
/**
* If there are revisions between the ones being compared, return a note saying so.
* @return string
@@ -855,11 +947,11 @@ class DifferenceEngine extends ContextSource {
* Get a header for a specified revision.
*
* @param $rev Revision
- * @param $complete String: 'complete' to get the header wrapped depending
+ * @param string $complete 'complete' to get the header wrapped depending
* the visibility of the revision and a link to edit the page.
* @return String HTML fragment
*/
- private function getRevisionHeader( Revision $rev, $complete = '' ) {
+ protected function getRevisionHeader( Revision $rev, $complete = '' ) {
$lang = $this->getLanguage();
$user = $this->getUser();
$revtimestamp = $rev->getTimestamp();
@@ -951,10 +1043,25 @@ class DifferenceEngine extends ContextSource {
/**
* Use specified text instead of loading from the database
+ * @deprecated since 1.21, use setContent() instead.
*/
function setText( $oldText, $newText ) {
- $this->mOldtext = $oldText;
- $this->mNewtext = $newText;
+ ContentHandler::deprecated( __METHOD__, "1.21" );
+
+ $oldContent = ContentHandler::makeContent( $oldText, $this->getTitle() );
+ $newContent = ContentHandler::makeContent( $newText, $this->getTitle() );
+
+ $this->setContent( $oldContent, $newContent );
+ }
+
+ /**
+ * Use specified text instead of loading from the database
+ * @since 1.21
+ */
+ function setContent( Content $oldContent, Content $newContent ) {
+ $this->mOldContent = $oldContent;
+ $this->mNewContent = $newContent;
+
$this->mTextLoaded = 2;
$this->mRevisionsLoaded = true;
}
@@ -1082,14 +1189,14 @@ class DifferenceEngine extends ContextSource {
return false;
}
if ( $this->mOldRev ) {
- $this->mOldtext = $this->mOldRev->getText( Revision::FOR_THIS_USER );
- if ( $this->mOldtext === false ) {
+ $this->mOldContent = $this->mOldRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+ if ( $this->mOldContent === null ) {
return false;
}
}
if ( $this->mNewRev ) {
- $this->mNewtext = $this->mNewRev->getText( Revision::FOR_THIS_USER );
- if ( $this->mNewtext === false ) {
+ $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+ if ( $this->mNewContent === null ) {
return false;
}
}
@@ -1110,7 +1217,7 @@ class DifferenceEngine extends ContextSource {
if ( !$this->loadRevisionData() ) {
return false;
}
- $this->mNewtext = $this->mNewRev->getText( Revision::FOR_THIS_USER );
+ $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
return true;
}
}
diff --git a/includes/diff/WikiDiff3.php b/includes/diff/WikiDiff3.php
index 66727445..ea6f6e5d 100644
--- a/includes/diff/WikiDiff3.php
+++ b/includes/diff/WikiDiff3.php
@@ -29,7 +29,7 @@
* (http://citeseer.ist.psu.edu/myers86ond.html) with range compression (see Wu et al.'s
* "An O(NP) Sequence Comparison Algorithm").
*
- * This implementation supports an upper bound on the excution time.
+ * This implementation supports an upper bound on the execution time.
*
* Complexity: O((M + N)D) worst case time, O(M + N + D^2) expected time, O(M + N) space
*
@@ -64,7 +64,7 @@ class WikiDiff3 {
public function diff( /*array*/ $from, /*array*/ $to ) {
// remember initial lengths
- $m = sizeof( $from );
+ $m = count( $from );
$n = count( $to );
$this->heuristicUsed = false;
@@ -490,7 +490,6 @@ class WikiDiff3 {
$temp = array( 0, 0, 0 );
-
$max_progress = array_fill( 0, ceil( max( $forward_end_diag - $forward_start_diag,
$backward_end_diag - $backward_start_diag ) / 2 ), $temp );
$num_progress = 0; // the 1st entry is current, it is initialized
diff --git a/includes/extauth/MediaWiki.php b/includes/extauth/MediaWiki.php
index 0a5efae6..c7f6a204 100644
--- a/includes/extauth/MediaWiki.php
+++ b/includes/extauth/MediaWiki.php
@@ -36,15 +36,15 @@
* 'DBprefix' => '',
* );
*
- * All fields must be present. These mean the same things as $wgDBtype,
- * $wgDBserver, etc. This implementation is quite crude; it could easily
- * support multiple database servers, for instance, and memcached, and it
- * probably has bugs. Kind of hard to reuse code when things might rely on who
+ * All fields must be present. These mean the same things as $wgDBtype,
+ * $wgDBserver, etc. This implementation is quite crude; it could easily
+ * support multiple database servers, for instance, and memcached, and it
+ * probably has bugs. Kind of hard to reuse code when things might rely on who
* knows what configuration globals.
*
- * If either wiki uses the UserComparePasswords hook, password authentication
- * might fail unexpectedly unless they both do the exact same validation.
- * There may be other corner cases like this where this will fail, but it
+ * If either wiki uses the UserComparePasswords hook, password authentication
+ * might fail unexpectedly unless they both do the exact same validation.
+ * There may be other corner cases like this where this will fail, but it
* should be unlikely.
*
* @ingroup ExternalUser
@@ -62,8 +62,8 @@ class ExternalUser_MediaWiki extends ExternalUser {
* @return bool
*/
protected function initFromName( $name ) {
- # We might not need the 'usable' bit, but let's be safe. Theoretically
- # this might return wrong results for old versions, but it's probably
+ # We might not need the 'usable' bit, but let's be safe. Theoretically
+ # this might return wrong results for old versions, but it's probably
# good enough.
$name = User::getCanonicalName( $name, 'usable' );
@@ -130,14 +130,14 @@ class ExternalUser_MediaWiki extends ExternalUser {
}
public function authenticate( $password ) {
- # This might be wrong if anyone actually uses the UserComparePasswords hook
+ # This might be wrong if anyone actually uses the UserComparePasswords hook
# (on either end), so don't use this if you those are incompatible.
return User::comparePasswords( $this->mRow->user_password, $password,
- $this->mRow->user_id );
+ $this->mRow->user_id );
}
public function getPref( $pref ) {
- # @todo FIXME: Return other prefs too. Lots of global-riddled code that does
+ # @todo FIXME: Return other prefs too. Lots of global-riddled code that does
# this normally.
if ( $pref === 'emailaddress'
&& $this->row->user_email_authenticated !== null ) {
diff --git a/includes/externalstore/ExternalStore.php b/includes/externalstore/ExternalStore.php
new file mode 100644
index 00000000..4ca193d4
--- /dev/null
+++ b/includes/externalstore/ExternalStore.php
@@ -0,0 +1,178 @@
+<?php
+/**
+ * @defgroup ExternalStorage ExternalStorage
+ */
+
+/**
+ * Interface for data storage in external repositories.
+ *
+ * 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
+ */
+
+/**
+ * Constructor class for key/value blob data kept in external repositories.
+ *
+ * Objects in external stores are defined by a special URL. The URL is of
+ * the form "<store protocol>://<location>/<object name>". The protocol is used
+ * to determine what ExternalStoreMedium class is used. The location identifies
+ * particular storage instances or database clusters for store class to use.
+ *
+ * When an object is inserted into a store, the calling code uses a partial URL of
+ * the form "<store protocol>://<location>" and receives the full object URL on success.
+ * This is useful since object names can be sequential IDs, UUIDs, or hashes.
+ * Callers are not responsible for unique name generation.
+ *
+ * External repositories might be populated by maintenance/async
+ * scripts, thus partial moving of data may be possible, as well
+ * as the possibility to have any storage format (i.e. for archives).
+ *
+ * @ingroup ExternalStorage
+ */
+class ExternalStore {
+ /**
+ * Get an external store object of the given type, with the given parameters
+ *
+ * @param string $proto Type of external storage, should be a value in $wgExternalStores
+ * @param array $params Associative array of ExternalStoreMedium parameters
+ * @return ExternalStoreMedium|bool The store class or false on error
+ */
+ public static function getStoreObject( $proto, array $params = array() ) {
+ global $wgExternalStores;
+
+ if ( !$wgExternalStores || !in_array( $proto, $wgExternalStores ) ) {
+ return false; // protocol not enabled
+ }
+
+ $class = 'ExternalStore' . ucfirst( $proto );
+ // Any custom modules should be added to $wgAutoLoadClasses for on-demand loading
+ return MWInit::classExists( $class ) ? new $class( $params ) : false;
+ }
+
+ /**
+ * Fetch data from given URL
+ *
+ * @param string $url The URL of the text to get
+ * @param array $params Associative array of ExternalStoreMedium parameters
+ * @return string|bool The text stored or false on error
+ * @throws MWException
+ */
+ public static function fetchFromURL( $url, array $params = array() ) {
+ $parts = explode( '://', $url, 2 );
+ if ( count( $parts ) != 2 ) {
+ return false; // invalid URL
+ }
+
+ list( $proto, $path ) = $parts;
+ if ( $path == '' ) { // bad URL
+ return false;
+ }
+
+ $store = self::getStoreObject( $proto, $params );
+ if ( $store === false ) {
+ return false;
+ }
+
+ return $store->fetchFromURL( $url );
+ }
+
+ /**
+ * Store a data item to an external store, identified by a partial URL
+ * The protocol part is used to identify the class, the rest is passed to the
+ * class itself as a parameter.
+ *
+ * @param string $url A partial external store URL ("<store type>://<location>")
+ * @param $data string
+ * @param array $params Associative array of ExternalStoreMedium parameters
+ * @return string|bool The URL of the stored data item, or false on error
+ * @throws MWException
+ */
+ public static function insert( $url, $data, array $params = array() ) {
+ $parts = explode( '://', $url, 2 );
+ if ( count( $parts ) != 2 ) {
+ return false; // invalid URL
+ }
+
+ list( $proto, $path ) = $parts;
+ if ( $path == '' ) { // bad URL
+ return false;
+ }
+
+ $store = self::getStoreObject( $proto, $params );
+ if ( $store === false ) {
+ return false;
+ } else {
+ return $store->store( $path, $data );
+ }
+ }
+
+ /**
+ * Like insert() above, but does more of the work for us.
+ * This function does not need a url param, it builds it by
+ * itself. It also fails-over to the next possible clusters.
+ *
+ * @param $data string
+ * @param array $params Associative array of ExternalStoreMedium parameters
+ * @return string|bool The URL of the stored data item, or false on error
+ * @throws MWException
+ */
+ public static function insertToDefault( $data, array $params = array() ) {
+ global $wgDefaultExternalStore;
+
+ $error = false;
+ $tryStores = (array)$wgDefaultExternalStore;
+ while ( count( $tryStores ) > 0 ) {
+ $index = mt_rand( 0, count( $tryStores ) - 1 );
+ $storeUrl = $tryStores[$index];
+ wfDebug( __METHOD__ . ": trying $storeUrl\n" );
+ list( $proto, $path ) = explode( '://', $storeUrl, 2 );
+ $store = self::getStoreObject( $proto, $params );
+ if ( $store === false ) {
+ throw new MWException( "Invalid external storage protocol - $storeUrl" );
+ }
+ try {
+ $url = $store->store( $path, $data ); // Try to save the object
+ } catch ( MWException $error ) {
+ $url = false;
+ }
+ if ( strlen( $url ) ) {
+ return $url; // Done!
+ } else {
+ unset( $tryStores[$index] ); // Don't try this one again!
+ $tryStores = array_values( $tryStores ); // Must have consecutive keys
+ wfDebugLog( 'ExternalStorage',
+ "Unable to store text to external storage $storeUrl" );
+ }
+ }
+ // All stores failed
+ if ( $error ) {
+ throw $error; // rethrow the last error
+ } else {
+ throw new MWException( "Unable to store text to external storage" );
+ }
+ }
+
+ /**
+ * @param $data string
+ * @param $wiki string
+ * @return string|bool The URL of the stored data item, or false on error
+ * @throws MWException
+ */
+ public static function insertToForeignDefault( $data, $wiki ) {
+ return self::insertToDefault( $data, array( 'wiki' => $wiki ) );
+ }
+}
diff --git a/includes/externalstore/ExternalStoreDB.php b/includes/externalstore/ExternalStoreDB.php
new file mode 100644
index 00000000..196e7f2c
--- /dev/null
+++ b/includes/externalstore/ExternalStoreDB.php
@@ -0,0 +1,181 @@
+<?php
+/**
+ * External storage in SQL database.
+ *
+ * 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
+ */
+
+/**
+ * DB accessable external objects.
+ *
+ * In this system, each store "location" maps to a database "cluster".
+ * The clusters must be defined in the normal LBFactory configuration.
+ *
+ * @ingroup ExternalStorage
+ */
+class ExternalStoreDB extends ExternalStoreMedium {
+ /**
+ * The URL returned is of the form of the form DB://cluster/id
+ * or DB://cluster/id/itemid for concatened storage.
+ *
+ * @see ExternalStoreMedium::fetchFromURL()
+ */
+ public function fetchFromURL( $url ) {
+ $path = explode( '/', $url );
+ $cluster = $path[2];
+ $id = $path[3];
+ if ( isset( $path[4] ) ) {
+ $itemID = $path[4];
+ } else {
+ $itemID = false;
+ }
+
+ $ret =& $this->fetchBlob( $cluster, $id, $itemID );
+
+ if ( $itemID !== false && $ret !== false ) {
+ return $ret->getItem( $itemID );
+ }
+ return $ret;
+ }
+
+ /**
+ * @see ExternalStoreMedium::store()
+ */
+ public function store( $cluster, $data ) {
+ $dbw = $this->getMaster( $cluster );
+ $id = $dbw->nextSequenceValue( 'blob_blob_id_seq' );
+ $dbw->insert( $this->getTable( $dbw ),
+ array( 'blob_id' => $id, 'blob_text' => $data ),
+ __METHOD__ );
+ $id = $dbw->insertId();
+ if ( !$id ) {
+ throw new MWException( __METHOD__.': no insert ID' );
+ }
+ if ( $dbw->getFlag( DBO_TRX ) ) {
+ $dbw->commit( __METHOD__ );
+ }
+ return "DB://$cluster/$id";
+ }
+
+ /**
+ * Get a LoadBalancer for the specified cluster
+ *
+ * @param string $cluster cluster name
+ * @return LoadBalancer object
+ */
+ function &getLoadBalancer( $cluster ) {
+ $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
+
+ return wfGetLBFactory()->getExternalLB( $cluster, $wiki );
+ }
+
+ /**
+ * Get a slave database connection for the specified cluster
+ *
+ * @param string $cluster cluster name
+ * @return DatabaseBase object
+ */
+ function &getSlave( $cluster ) {
+ global $wgDefaultExternalStore;
+
+ $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
+ $lb =& $this->getLoadBalancer( $cluster );
+
+ if ( !in_array( "DB://" . $cluster, (array)$wgDefaultExternalStore ) ) {
+ wfDebug( "read only external store" );
+ $lb->allowLagged( true );
+ } else {
+ wfDebug( "writable external store" );
+ }
+
+ return $lb->getConnection( DB_SLAVE, array(), $wiki );
+ }
+
+ /**
+ * Get a master database connection for the specified cluster
+ *
+ * @param string $cluster cluster name
+ * @return DatabaseBase object
+ */
+ function &getMaster( $cluster ) {
+ $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
+ $lb =& $this->getLoadBalancer( $cluster );
+ return $lb->getConnection( DB_MASTER, array(), $wiki );
+ }
+
+ /**
+ * Get the 'blobs' table name for this database
+ *
+ * @param $db DatabaseBase
+ * @return String: table name ('blobs' by default)
+ */
+ function getTable( &$db ) {
+ $table = $db->getLBInfo( 'blobs table' );
+ if ( is_null( $table ) ) {
+ $table = 'blobs';
+ }
+ return $table;
+ }
+
+ /**
+ * Fetch a blob item out of the database; a cache of the last-loaded
+ * blob will be kept so that multiple loads out of a multi-item blob
+ * can avoid redundant database access and decompression.
+ * @param $cluster
+ * @param $id
+ * @param $itemID
+ * @return mixed
+ * @private
+ */
+ function &fetchBlob( $cluster, $id, $itemID ) {
+ /**
+ * One-step cache variable to hold base blobs; operations that
+ * pull multiple revisions may often pull multiple times from
+ * the same blob. By keeping the last-used one open, we avoid
+ * redundant unserialization and decompression overhead.
+ */
+ static $externalBlobCache = array();
+
+ $cacheID = ( $itemID === false ) ? "$cluster/$id" : "$cluster/$id/";
+ if( isset( $externalBlobCache[$cacheID] ) ) {
+ wfDebugLog( 'ExternalStoreDB-cache', "ExternalStoreDB::fetchBlob cache hit on $cacheID\n" );
+ return $externalBlobCache[$cacheID];
+ }
+
+ wfDebugLog( 'ExternalStoreDB-cache', "ExternalStoreDB::fetchBlob cache miss on $cacheID\n" );
+
+ $dbr =& $this->getSlave( $cluster );
+ $ret = $dbr->selectField( $this->getTable( $dbr ), 'blob_text', array( 'blob_id' => $id ), __METHOD__ );
+ if ( $ret === false ) {
+ wfDebugLog( 'ExternalStoreDB', "ExternalStoreDB::fetchBlob master fallback on $cacheID\n" );
+ // Try the master
+ $dbw =& $this->getMaster( $cluster );
+ $ret = $dbw->selectField( $this->getTable( $dbw ), 'blob_text', array( 'blob_id' => $id ), __METHOD__ );
+ if( $ret === false) {
+ wfDebugLog( 'ExternalStoreDB', "ExternalStoreDB::fetchBlob master failed to find $cacheID\n" );
+ }
+ }
+ if( $itemID !== false && $ret !== false ) {
+ // Unserialise object; caller extracts item
+ $ret = unserialize( $ret );
+ }
+
+ $externalBlobCache = array( $cacheID => &$ret );
+ return $ret;
+ }
+}
diff --git a/includes/externalstore/ExternalStoreHttp.php b/includes/externalstore/ExternalStoreHttp.php
new file mode 100644
index 00000000..345c17be
--- /dev/null
+++ b/includes/externalstore/ExternalStoreHttp.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * External storage using HTTP requests.
+ *
+ * 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 class for HTTP accessable external objects.
+ * Only supports reading, not storing.
+ *
+ * @ingroup ExternalStorage
+ */
+class ExternalStoreHttp extends ExternalStoreMedium {
+ /**
+ * @see ExternalStoreMedium::fetchFromURL()
+ */
+ public function fetchFromURL( $url ) {
+ return Http::get( $url );
+ }
+
+ /**
+ * @see ExternalStoreMedium::store()
+ */
+ public function store( $cluster, $data ) {
+ throw new MWException( "ExternalStoreHttp is read-only and does not support store()." );
+ }
+}
diff --git a/includes/externalstore/ExternalStoreMedium.php b/includes/externalstore/ExternalStoreMedium.php
new file mode 100644
index 00000000..41af7d87
--- /dev/null
+++ b/includes/externalstore/ExternalStoreMedium.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * External storage in some particular medium.
+ *
+ * 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 ExternalStorage
+ * @author Aaron Schulz
+ */
+
+/**
+ * Accessable external objects in a particular storage medium
+ *
+ * @ingroup ExternalStorage
+ * @since 1.21
+ */
+abstract class ExternalStoreMedium {
+ /** @var Array */
+ protected $params = array();
+
+ /**
+ * @param array $params Options
+ */
+ public function __construct( array $params = array() ) {
+ $this->params = $params;
+ }
+
+ /**
+ * Fetch data from given external store URL
+ *
+ * @param string $url An external store URL
+ * @return string|bool The text stored or false on error
+ * @throws MWException
+ */
+ abstract public function fetchFromURL( $url );
+
+ /**
+ * Insert a data item into a given location
+ *
+ * @param string $location the location name
+ * @param string $data the data item
+ * @return string|bool The URL of the stored data item, or false on error
+ * @throws MWException
+ */
+ abstract public function store( $location, $data );
+}
diff --git a/includes/externalstore/ExternalStoreMwstore.php b/includes/externalstore/ExternalStoreMwstore.php
new file mode 100644
index 00000000..0911cca1
--- /dev/null
+++ b/includes/externalstore/ExternalStoreMwstore.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * External storage in a file backend.
+ *
+ * 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
+ */
+
+/**
+ * File backend accessable external objects.
+ *
+ * In this system, each store "location" maps to the name of a file backend.
+ * The file backends must be defined in $wgFileBackends and must be global
+ * and fully qualified with a global "wikiId" prefix in the configuration.
+ *
+ * @ingroup ExternalStorage
+ * @since 1.21
+ */
+class ExternalStoreMwstore extends ExternalStoreMedium {
+ /**
+ * The URL returned is of the form of the form mwstore://backend/container/wiki/id
+ *
+ * @see ExternalStoreMedium::fetchFromURL()
+ */
+ public function fetchFromURL( $url ) {
+ $be = FileBackendGroup::singleton()->backendFromPath( $url );
+ if ( $be instanceof FileBackend ) {
+ // We don't need "latest" since objects are immutable and
+ // backends should at least have "read-after-create" consistency.
+ return $be->getFileContents( array( 'src' => $url ) );
+ }
+ return false;
+ }
+
+ /**
+ * @see ExternalStoreMedium::store()
+ */
+ public function store( $backend, $data ) {
+ $be = FileBackendGroup::singleton()->get( $backend );
+ if ( $be instanceof FileBackend ) {
+ // Get three random base 36 characters to act as shard directories
+ $rand = wfBaseConvert( mt_rand( 0, 46655 ), 10, 36, 3 );
+ // Make sure ID is roughly lexicographically increasing for performance
+ $id = str_pad( UIDGenerator::newTimestampedUID128( 32 ), 26, '0', STR_PAD_LEFT );
+ // Segregate items by wiki ID for the sake of bookkeeping
+ $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : wfWikiID();
+
+ $url = $be->getContainerStoragePath( 'data' ) . '/' .
+ rawurlencode( $wiki ) . "/{$rand[0]}/{$rand[1]}/{$rand[2]}/{$id}";
+
+ $be->prepare( array( 'dir' => dirname( $url ), 'noAccess' => 1, 'noListing' => 1 ) );
+ if ( $be->create( array( 'dst' => $url, 'content' => $data ) )->isOK() ) {
+ return $url;
+ }
+ }
+ return false;
+ }
+}
diff --git a/includes/filebackend/FSFile.php b/includes/filebackend/FSFile.php
index e07c99d4..7d0dbd52 100644
--- a/includes/filebackend/FSFile.php
+++ b/includes/filebackend/FSFile.php
@@ -28,11 +28,12 @@
*/
class FSFile {
protected $path; // path to file
+ private $sha1Base36 = null; // File Sha1Base36
/**
* Sets up the file object
*
- * @param $path string Path to temporary file on local disk
+ * @param string $path Path to temporary file on local disk
* @throws MWException
*/
public function __construct( $path ) {
@@ -86,8 +87,8 @@ class FSFile {
/**
* Guess the MIME type from the file contents alone
- *
- * @return string
+ *
+ * @return string
*/
public function getMimeType() {
return MimeMagic::singleton()->guessMimeType( $this->path, false );
@@ -104,7 +105,7 @@ class FSFile {
*/
public function getProps( $ext = true ) {
wfProfileIn( __METHOD__ );
- wfDebug( __METHOD__.": Getting file info for $this->path\n" );
+ wfDebug( __METHOD__ . ": Getting file info for $this->path\n" );
$info = self::placeholderProps();
$info['fileExists'] = $this->exists();
@@ -131,7 +132,7 @@ class FSFile {
# Height, width and metadata
$handler = MediaHandler::getHandler( $info['mime'] );
if ( $handler ) {
- $tempImage = (object)array();
+ $tempImage = (object)array(); // XXX (hack for File object)
$info['metadata'] = $handler->getMetadata( $tempImage, $this->path );
$gis = $handler->getImageSize( $tempImage, $this->path, $info['metadata'] );
if ( is_array( $gis ) ) {
@@ -140,9 +141,9 @@ class FSFile {
}
$info['sha1'] = $this->getSha1Base36();
- wfDebug(__METHOD__.": $this->path loaded, {$info['size']} bytes, {$info['mime']}.\n");
+ wfDebug( __METHOD__ . ": $this->path loaded, {$info['size']} bytes, {$info['mime']}.\n" );
} else {
- wfDebug(__METHOD__.": $this->path NOT FOUND!\n");
+ wfDebug( __METHOD__ . ": $this->path NOT FOUND!\n" );
}
wfProfileOut( __METHOD__ );
@@ -193,25 +194,32 @@ class FSFile {
* 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
* fairly neatly.
*
+ * @param $recache bool
* @return bool|string False on failure
*/
- public function getSha1Base36() {
+ public function getSha1Base36( $recache = false ) {
wfProfileIn( __METHOD__ );
+ if ( $this->sha1Base36 !== null && !$recache ) {
+ wfProfileOut( __METHOD__ );
+ return $this->sha1Base36;
+ }
+
wfSuppressWarnings();
- $hash = sha1_file( $this->path );
+ $this->sha1Base36 = sha1_file( $this->path );
wfRestoreWarnings();
- if ( $hash !== false ) {
- $hash = wfBaseConvert( $hash, 16, 36, 31 );
+
+ if ( $this->sha1Base36 !== false ) {
+ $this->sha1Base36 = wfBaseConvert( $this->sha1Base36, 16, 36, 31 );
}
wfProfileOut( __METHOD__ );
- return $hash;
+ return $this->sha1Base36;
}
/**
* Get the final file extension from a file system path
- *
+ *
* @param $path string
* @return string
*/
@@ -223,7 +231,7 @@ class FSFile {
/**
* Get an associative array containing information about a file in the local filesystem.
*
- * @param $path String: absolute local filesystem path
+ * @param string $path absolute local filesystem path
* @param $ext Mixed: the file extension, or true to extract it from the filename.
* Set it to false to ignore the extension.
*
@@ -242,11 +250,18 @@ class FSFile {
* fairly neatly.
*
* @param $path string
+ * @param $recache bool
*
* @return bool|string False on failure
*/
- public static function getSha1Base36FromPath( $path ) {
- $fsFile = new self( $path );
- return $fsFile->getSha1Base36();
+ public static function getSha1Base36FromPath( $path, $recache = false ) {
+ static $sha1Base36 = array();
+
+ if ( !isset( $sha1Base36[$path] ) || $recache ) {
+ $fsFile = new self( $path );
+ $sha1Base36[$path] = $fsFile->getSha1Base36();
+ }
+
+ return $sha1Base36[$path];
}
}
diff --git a/includes/filebackend/FSFileBackend.php b/includes/filebackend/FSFileBackend.php
index 93495340..c9769989 100644
--- a/includes/filebackend/FSFileBackend.php
+++ b/includes/filebackend/FSFileBackend.php
@@ -46,6 +46,7 @@ class FSFileBackend extends FileBackendStore {
protected $fileOwner; // string; required OS username to own files
protected $currentUser; // string; OS username running this script
+ /** @var Array */
protected $hadWarningErrors = array();
/**
@@ -69,7 +70,7 @@ class FSFileBackend extends FileBackendStore {
if ( isset( $config['containerPaths'] ) ) {
$this->containerPaths = (array)$config['containerPaths'];
foreach ( $this->containerPaths as &$path ) {
- $path = rtrim( $path, '/' ); // remove trailing slash
+ $path = rtrim( $path, '/' ); // remove trailing slash
}
}
@@ -101,7 +102,7 @@ class FSFileBackend extends FileBackendStore {
/**
* Sanity check a relative file system path for validity
*
- * @param $path string Normalized relative path
+ * @param string $path Normalized relative path
* @return bool
*/
protected function isLegalRelPath( $path ) {
@@ -136,7 +137,7 @@ class FSFileBackend extends FileBackendStore {
/**
* Get the absolute file system path for a storage path
*
- * @param $storagePath string Storage path
+ * @param string $storagePath Storage path
* @return string|null
*/
protected function resolveToFSPath( $storagePath ) {
@@ -144,7 +145,7 @@ class FSFileBackend extends FileBackendStore {
if ( $relPath === null ) {
return null; // invalid
}
- list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $storagePath );
+ list( , $shortCont, ) = FileBackend::splitStoragePath( $storagePath );
$fsPath = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
if ( $relPath != '' ) {
$fsPath .= "/{$relPath}";
@@ -178,10 +179,10 @@ class FSFileBackend extends FileBackendStore {
}
/**
- * @see FileBackendStore::doStoreInternal()
+ * @see FileBackendStore::doCreateInternal()
* @return Status
*/
- protected function doStoreInternal( array $params ) {
+ protected function doCreateInternal( array $params ) {
$status = Status::newGood();
$dest = $this->resolveToFSPath( $params['dst'] );
@@ -190,27 +191,74 @@ class FSFileBackend extends FileBackendStore {
return $status;
}
- if ( file_exists( $dest ) ) {
- if ( !empty( $params['overwrite'] ) ) {
- $ok = unlink( $dest );
- if ( !$ok ) {
- $status->fatal( 'backend-fail-delete', $params['dst'] );
- return $status;
- }
- } else {
- $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+ if ( !empty( $params['async'] ) ) { // deferred
+ $tempFile = TempFSFile::factory( 'create_', 'tmp' );
+ if ( !$tempFile ) {
+ $status->fatal( 'backend-fail-create', $params['dst'] );
+ return $status;
+ }
+ $this->trapWarnings();
+ $bytes = file_put_contents( $tempFile->getPath(), $params['content'] );
+ $this->untrapWarnings();
+ if ( $bytes === false ) {
+ $status->fatal( 'backend-fail-create', $params['dst'] );
+ return $status;
+ }
+ $cmd = implode( ' ', array(
+ wfIsWindows() ? 'COPY /B /Y' : 'cp', // (binary, overwrite)
+ wfEscapeShellArg( $this->cleanPathSlashes( $tempFile->getPath() ) ),
+ wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
+ ) );
+ $status->value = new FSFileOpHandle( $this, $params, 'Create', $cmd, $dest );
+ $tempFile->bind( $status->value );
+ } else { // immediate write
+ $this->trapWarnings();
+ $bytes = file_put_contents( $dest, $params['content'] );
+ $this->untrapWarnings();
+ if ( $bytes === false ) {
+ $status->fatal( 'backend-fail-create', $params['dst'] );
return $status;
}
+ $this->chmod( $dest );
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see FSFileBackend::doExecuteOpHandlesInternal()
+ */
+ protected function _getResponseCreate( $errors, Status $status, array $params, $cmd ) {
+ if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+ $status->fatal( 'backend-fail-create', $params['dst'] );
+ trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+ }
+ }
+
+ /**
+ * @see FileBackendStore::doStoreInternal()
+ * @return Status
+ */
+ protected function doStoreInternal( array $params ) {
+ $status = Status::newGood();
+
+ $dest = $this->resolveToFSPath( $params['dst'] );
+ if ( $dest === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+ return $status;
}
if ( !empty( $params['async'] ) ) { // deferred
- $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
+ $cmd = implode( ' ', array(
+ wfIsWindows() ? 'COPY /B /Y' : 'cp', // (binary, overwrite)
wfEscapeShellArg( $this->cleanPathSlashes( $params['src'] ) ),
wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
) );
$status->value = new FSFileOpHandle( $this, $params, 'Store', $cmd, $dest );
} else { // immediate write
+ $this->trapWarnings();
$ok = copy( $params['src'], $dest );
+ $this->untrapWarnings();
// In some cases (at least over NFS), copy() returns true when it fails
if ( !$ok || ( filesize( $params['src'] ) !== filesize( $dest ) ) ) {
if ( $ok ) { // PHP bug
@@ -255,31 +303,30 @@ class FSFileBackend extends FileBackendStore {
return $status;
}
- if ( file_exists( $dest ) ) {
- if ( !empty( $params['overwrite'] ) ) {
- $ok = unlink( $dest );
- if ( !$ok ) {
- $status->fatal( 'backend-fail-delete', $params['dst'] );
- return $status;
- }
- } else {
- $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
- return $status;
+ if ( !is_file( $source ) ) {
+ if ( empty( $params['ignoreMissingSource'] ) ) {
+ $status->fatal( 'backend-fail-copy', $params['src'] );
}
+ return $status; // do nothing; either OK or bad status
}
if ( !empty( $params['async'] ) ) { // deferred
- $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
+ $cmd = implode( ' ', array(
+ wfIsWindows() ? 'COPY /B /Y' : 'cp', // (binary, overwrite)
wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
) );
$status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd, $dest );
} else { // immediate write
+ $this->trapWarnings();
$ok = copy( $source, $dest );
+ $this->untrapWarnings();
// In some cases (at least over NFS), copy() returns true when it fails
if ( !$ok || ( filesize( $source ) !== filesize( $dest ) ) ) {
if ( $ok ) { // PHP bug
+ $this->trapWarnings();
unlink( $dest ); // remove broken file
+ $this->untrapWarnings();
trigger_error( __METHOD__ . ": copy() failed but returned true." );
}
$status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
@@ -320,30 +367,24 @@ class FSFileBackend extends FileBackendStore {
return $status;
}
- if ( file_exists( $dest ) ) {
- if ( !empty( $params['overwrite'] ) ) {
- // Windows does not support moving over existing files
- if ( wfIsWindows() ) {
- $ok = unlink( $dest );
- if ( !$ok ) {
- $status->fatal( 'backend-fail-delete', $params['dst'] );
- return $status;
- }
- }
- } else {
- $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
- return $status;
+ if ( !is_file( $source ) ) {
+ if ( empty( $params['ignoreMissingSource'] ) ) {
+ $status->fatal( 'backend-fail-move', $params['src'] );
}
+ return $status; // do nothing; either OK or bad status
}
if ( !empty( $params['async'] ) ) { // deferred
- $cmd = implode( ' ', array( wfIsWindows() ? 'MOVE' : 'mv',
+ $cmd = implode( ' ', array(
+ wfIsWindows() ? 'MOVE /Y' : 'mv', // (overwrite)
wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
) );
$status->value = new FSFileOpHandle( $this, $params, 'Move', $cmd );
} else { // immediate write
+ $this->trapWarnings();
$ok = rename( $source, $dest );
+ $this->untrapWarnings();
clearstatcache(); // file no longer at source
if ( !$ok ) {
$status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
@@ -385,12 +426,15 @@ class FSFileBackend extends FileBackendStore {
}
if ( !empty( $params['async'] ) ) { // deferred
- $cmd = implode( ' ', array( wfIsWindows() ? 'DEL' : 'unlink',
+ $cmd = implode( ' ', array(
+ wfIsWindows() ? 'DEL' : 'unlink',
wfEscapeShellArg( $this->cleanPathSlashes( $source ) )
) );
$status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd );
} else { // immediate write
+ $this->trapWarnings();
$ok = unlink( $source );
+ $this->untrapWarnings();
if ( !$ok ) {
$status->fatal( 'backend-fail-delete', $params['src'] );
return $status;
@@ -411,89 +455,27 @@ class FSFileBackend extends FileBackendStore {
}
/**
- * @see FileBackendStore::doCreateInternal()
- * @return Status
- */
- protected function doCreateInternal( array $params ) {
- $status = Status::newGood();
-
- $dest = $this->resolveToFSPath( $params['dst'] );
- if ( $dest === null ) {
- $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
- return $status;
- }
-
- if ( file_exists( $dest ) ) {
- if ( !empty( $params['overwrite'] ) ) {
- $ok = unlink( $dest );
- if ( !$ok ) {
- $status->fatal( 'backend-fail-delete', $params['dst'] );
- return $status;
- }
- } else {
- $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
- return $status;
- }
- }
-
- if ( !empty( $params['async'] ) ) { // deferred
- $tempFile = TempFSFile::factory( 'create_', 'tmp' );
- if ( !$tempFile ) {
- $status->fatal( 'backend-fail-create', $params['dst'] );
- return $status;
- }
- $bytes = file_put_contents( $tempFile->getPath(), $params['content'] );
- if ( $bytes === false ) {
- $status->fatal( 'backend-fail-create', $params['dst'] );
- return $status;
- }
- $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
- wfEscapeShellArg( $this->cleanPathSlashes( $tempFile->getPath() ) ),
- wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
- ) );
- $status->value = new FSFileOpHandle( $this, $params, 'Create', $cmd, $dest );
- $tempFile->bind( $status->value );
- } else { // immediate write
- $bytes = file_put_contents( $dest, $params['content'] );
- if ( $bytes === false ) {
- $status->fatal( 'backend-fail-create', $params['dst'] );
- return $status;
- }
- $this->chmod( $dest );
- }
-
- return $status;
- }
-
- /**
- * @see FSFileBackend::doExecuteOpHandlesInternal()
- */
- protected function _getResponseCreate( $errors, Status $status, array $params, $cmd ) {
- if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
- $status->fatal( 'backend-fail-create', $params['dst'] );
- trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
- }
- }
-
- /**
* @see FileBackendStore::doPrepareInternal()
* @return Status
*/
protected function doPrepareInternal( $fullCont, $dirRel, array $params ) {
$status = Status::newGood();
- list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
$contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
$dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
$existed = is_dir( $dir ); // already there?
- if ( !wfMkdirParents( $dir ) ) { // make directory and its parents
+ // Create the directory and its parents as needed...
+ $this->trapWarnings();
+ if ( !wfMkdirParents( $dir ) ) {
$status->fatal( 'directorycreateerror', $params['dir'] ); // fails on races
} elseif ( !is_writable( $dir ) ) {
$status->fatal( 'directoryreadonlyerror', $params['dir'] );
} elseif ( !is_readable( $dir ) ) {
$status->fatal( 'directorynotreadableerror', $params['dir'] );
}
+ $this->untrapWarnings();
+ // Respect any 'noAccess' or 'noListing' flags...
if ( is_dir( $dir ) && !$existed ) {
- // Respect any 'noAccess' or 'noListing' flags...
$status->merge( $this->doSecureInternal( $fullCont, $dirRel, $params ) );
}
return $status;
@@ -505,24 +487,26 @@ class FSFileBackend extends FileBackendStore {
*/
protected function doSecureInternal( $fullCont, $dirRel, array $params ) {
$status = Status::newGood();
- list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
$contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
$dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
// Seed new directories with a blank index.html, to prevent crawling...
if ( !empty( $params['noListing'] ) && !file_exists( "{$dir}/index.html" ) ) {
+ $this->trapWarnings();
$bytes = file_put_contents( "{$dir}/index.html", $this->indexHtmlPrivate() );
+ $this->untrapWarnings();
if ( $bytes === false ) {
$status->fatal( 'backend-fail-create', $params['dir'] . '/index.html' );
- return $status;
}
}
// Add a .htaccess file to the root of the container...
if ( !empty( $params['noAccess'] ) && !file_exists( "{$contRoot}/.htaccess" ) ) {
+ $this->trapWarnings();
$bytes = file_put_contents( "{$contRoot}/.htaccess", $this->htaccessPrivate() );
+ $this->untrapWarnings();
if ( $bytes === false ) {
$storeDir = "mwstore://{$this->name}/{$shortCont}";
$status->fatal( 'backend-fail-create', "{$storeDir}/.htaccess" );
- return $status;
}
}
return $status;
@@ -534,25 +518,27 @@ class FSFileBackend extends FileBackendStore {
*/
protected function doPublishInternal( $fullCont, $dirRel, array $params ) {
$status = Status::newGood();
- list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
$contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
$dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
// Unseed new directories with a blank index.html, to allow crawling...
if ( !empty( $params['listing'] ) && is_file( "{$dir}/index.html" ) ) {
$exists = ( file_get_contents( "{$dir}/index.html" ) === $this->indexHtmlPrivate() );
+ $this->trapWarnings();
if ( $exists && !unlink( "{$dir}/index.html" ) ) { // reverse secure()
$status->fatal( 'backend-fail-delete', $params['dir'] . '/index.html' );
- return $status;
}
+ $this->untrapWarnings();
}
// Remove the .htaccess file from the root of the container...
if ( !empty( $params['access'] ) && is_file( "{$contRoot}/.htaccess" ) ) {
$exists = ( file_get_contents( "{$contRoot}/.htaccess" ) === $this->htaccessPrivate() );
+ $this->trapWarnings();
if ( $exists && !unlink( "{$contRoot}/.htaccess" ) ) { // reverse secure()
$storeDir = "mwstore://{$this->name}/{$shortCont}";
$status->fatal( 'backend-fail-delete', "{$storeDir}/.htaccess" );
- return $status;
}
+ $this->untrapWarnings();
}
return $status;
}
@@ -563,14 +549,14 @@ class FSFileBackend extends FileBackendStore {
*/
protected function doCleanInternal( $fullCont, $dirRel, array $params ) {
$status = Status::newGood();
- list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
$contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
$dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
- wfSuppressWarnings();
+ $this->trapWarnings();
if ( is_dir( $dir ) ) {
rmdir( $dir ); // remove directory if empty
}
- wfRestoreWarnings();
+ $this->untrapWarnings();
return $status;
}
@@ -612,7 +598,7 @@ class FSFileBackend extends FileBackendStore {
* @return bool|null
*/
protected function doDirectoryExists( $fullCont, $dirRel, array $params ) {
- list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
$contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
$dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
@@ -628,7 +614,7 @@ class FSFileBackend extends FileBackendStore {
* @return Array|null
*/
public function getDirectoryListInternal( $fullCont, $dirRel, array $params ) {
- list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
$contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
$dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
$exists = is_dir( $dir );
@@ -644,10 +630,10 @@ class FSFileBackend extends FileBackendStore {
/**
* @see FileBackendStore::getFileListInternal()
- * @return array|FSFileBackendFileList|null
+ * @return Array|FSFileBackendFileList|null
*/
public function getFileListInternal( $fullCont, $dirRel, array $params ) {
- list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
$contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
$dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
$exists = is_dir( $dir );
@@ -662,44 +648,58 @@ class FSFileBackend extends FileBackendStore {
}
/**
- * @see FileBackendStore::getLocalReference()
- * @return FSFile|null
+ * @see FileBackendStore::doGetLocalReferenceMulti()
+ * @return Array
*/
- public function getLocalReference( array $params ) {
- $source = $this->resolveToFSPath( $params['src'] );
- if ( $source === null ) {
- return null;
+ protected function doGetLocalReferenceMulti( array $params ) {
+ $fsFiles = array(); // (path => FSFile)
+
+ foreach ( $params['srcs'] as $src ) {
+ $source = $this->resolveToFSPath( $src );
+ if ( $source === null || !is_file( $source ) ) {
+ $fsFiles[$src] = null; // invalid path or file does not exist
+ } else {
+ $fsFiles[$src] = new FSFile( $source );
+ }
}
- return new FSFile( $source );
+
+ return $fsFiles;
}
/**
- * @see FileBackendStore::getLocalCopy()
- * @return null|TempFSFile
+ * @see FileBackendStore::doGetLocalCopyMulti()
+ * @return Array
*/
- public function getLocalCopy( array $params ) {
- $source = $this->resolveToFSPath( $params['src'] );
- if ( $source === null ) {
- return null;
- }
-
- // Create a new temporary file with the same extension...
- $ext = FileBackend::extensionFromPath( $params['src'] );
- $tmpFile = TempFSFile::factory( 'localcopy_', $ext );
- if ( !$tmpFile ) {
- return null;
- }
- $tmpPath = $tmpFile->getPath();
+ protected function doGetLocalCopyMulti( array $params ) {
+ $tmpFiles = array(); // (path => TempFSFile)
- // Copy the source file over the temp file
- $ok = copy( $source, $tmpPath );
- if ( !$ok ) {
- return null;
+ foreach ( $params['srcs'] as $src ) {
+ $source = $this->resolveToFSPath( $src );
+ if ( $source === null ) {
+ $tmpFiles[$src] = null; // invalid path
+ } else {
+ // Create a new temporary file with the same extension...
+ $ext = FileBackend::extensionFromPath( $src );
+ $tmpFile = TempFSFile::factory( 'localcopy_', $ext );
+ if ( !$tmpFile ) {
+ $tmpFiles[$src] = null;
+ } else {
+ $tmpPath = $tmpFile->getPath();
+ // Copy the source file over the temp file
+ $this->trapWarnings();
+ $ok = copy( $source, $tmpPath );
+ $this->untrapWarnings();
+ if ( !$ok ) {
+ $tmpFiles[$src] = null;
+ } else {
+ $this->chmod( $tmpPath );
+ $tmpFiles[$src] = $tmpFile;
+ }
+ }
+ }
}
- $this->chmod( $tmpPath );
-
- return $tmpFile;
+ return $tmpFiles;
}
/**
@@ -747,13 +747,13 @@ class FSFileBackend extends FileBackendStore {
/**
* Chmod a file, suppressing the warnings
*
- * @param $path string Absolute file system path
+ * @param string $path Absolute file system path
* @return bool Success
*/
protected function chmod( $path ) {
- wfSuppressWarnings();
+ $this->trapWarnings();
$ok = chmod( $path, $this->fileMode );
- wfRestoreWarnings();
+ $this->untrapWarnings();
return $ok;
}
@@ -779,7 +779,7 @@ class FSFileBackend extends FileBackendStore {
/**
* Clean up directory separators for the given OS
*
- * @param $path string FS path
+ * @param string $path FS path
* @return string
*/
protected function cleanPathSlashes( $path ) {
@@ -789,12 +789,11 @@ class FSFileBackend extends FileBackendStore {
/**
* Listen for E_WARNING errors and track whether any happen
*
- * @return bool
+ * @return void
*/
protected function trapWarnings() {
$this->hadWarningErrors[] = false; // push to stack
set_error_handler( array( $this, 'handleWarning' ), E_WARNING );
- return false; // invoke normal PHP error handler
}
/**
@@ -808,9 +807,12 @@ class FSFileBackend extends FileBackendStore {
}
/**
+ * @param $errno integer
+ * @param $errstr string
* @return bool
*/
- private function handleWarning() {
+ private function handleWarning( $errno, $errstr ) {
+ wfDebugLog( 'FSFileBackend', $errstr ); // more detailed error logging
$this->hadWarningErrors[count( $this->hadWarningErrors ) - 1] = true;
return true; // suppress from PHP handler
}
@@ -855,16 +857,19 @@ abstract class FSFileBackendList implements Iterator {
protected $params = array();
/**
- * @param $dir string file system directory
+ * @param string $dir file system directory
* @param $params array
*/
public function __construct( $dir, array $params ) {
- $dir = realpath( $dir ); // normalize
- $this->suffixStart = strlen( $dir ) + 1; // size of "path/to/dir/"
+ $path = realpath( $dir ); // normalize
+ if( $path === false ) {
+ $path = $dir;
+ }
+ $this->suffixStart = strlen( $path ) + 1; // size of "path/to/dir/"
$this->params = $params;
try {
- $this->iter = $this->initIterator( $dir );
+ $this->iter = $this->initIterator( $path );
} catch ( UnexpectedValueException $e ) {
$this->iter = null; // bad permissions? deleted?
}
@@ -873,7 +878,7 @@ abstract class FSFileBackendList implements Iterator {
/**
* Return an appropriate iterator object to wrap
*
- * @param $dir string file system directory
+ * @param string $dir file system directory
* @return Iterator
*/
protected function initIterator( $dir ) {
@@ -956,8 +961,12 @@ abstract class FSFileBackendList implements Iterator {
* @param $path string
* @return string
*/
- protected function getRelPath( $path ) {
- return strtr( substr( realpath( $path ), $this->suffixStart ), '\\', '/' );
+ protected function getRelPath( $dir ) {
+ $path = realpath( $dir );
+ if( $path === false ) {
+ $path = $dir;
+ }
+ return strtr( substr( $path, $this->suffixStart ), '\\', '/' );
}
}
diff --git a/includes/filebackend/FileBackend.php b/includes/filebackend/FileBackend.php
index 76c761b0..f40b8c16 100644
--- a/includes/filebackend/FileBackend.php
+++ b/includes/filebackend/FileBackend.php
@@ -37,14 +37,18 @@
* Outside callers can assume that all backends will have these functions.
*
* All "storage paths" are of the format "mwstore://<backend>/<container>/<path>".
- * The "<path>" portion is a relative path that uses UNIX file system (FS)
- * notation, though any particular backend may not actually be using a local
- * filesystem. Therefore, the relative paths are only virtual.
+ * The "backend" portion is unique name for MediaWiki to refer to a backend, while
+ * the "container" portion is a top-level directory of the backend. The "path" portion
+ * is a relative path that uses UNIX file system (FS) notation, though any particular
+ * backend may not actually be using a local filesystem. Therefore, the relative paths
+ * are only virtual.
*
* Backend contents are stored under wiki-specific container names by default.
- * For legacy reasons, this has no effect for the FS backend class, and per-wiki
- * segregation must be done by setting the container paths appropriately.
+ * Global (qualified) backends are achieved by configuring the "wiki ID" to a constant.
+ * For legacy reasons, the FSFileBackend class allows manually setting the paths of
+ * containers to ones that do not respect the "wiki ID".
*
+ * In key/value stores, the container is the only hierarchy (the rest is emulated).
* FS-based backends are somewhat more restrictive due to the existence of real
* directory files; a regular file cannot have the same name as a directory. Other
* backends with virtual directories may not have this limitation. Callers should
@@ -75,9 +79,13 @@ abstract class FileBackend {
* $config includes:
* - name : The unique name of this backend.
* This should consist of alphanumberic, '-', and '_' characters.
- * This name should not be changed after use.
- * - wikiId : Prefix to container names that is unique to this wiki.
+ * This name should not be changed after use (e.g. with journaling).
+ * Note that the name is *not* used in actual container names.
+ * - wikiId : Prefix to container names that is unique to this backend.
+ * If not provided, this defaults to the current wiki ID.
* It should only consist of alphanumberic, '-', and '_' characters.
+ * This ID is what avoids collisions if multiple logical backends
+ * use the same storage system, so this should be set carefully.
* - lockManager : Registered name of a file lock manager to use.
* - fileJournal : File journal configuration; see FileJournal::factory().
* Journals simply log changes to files stored in the backend.
@@ -100,7 +108,7 @@ abstract class FileBackend {
: wfWikiID(); // e.g. "my_wiki-en_"
$this->lockManager = ( $config['lockManager'] instanceof LockManager )
? $config['lockManager']
- : LockManagerGroup::singleton()->get( $config['lockManager'] );
+ : LockManagerGroup::singleton( $this->wikiId )->get( $config['lockManager'] );
$this->fileJournal = isset( $config['fileJournal'] )
? ( ( $config['fileJournal'] instanceof FileJournal )
? $config['fileJournal']
@@ -129,7 +137,8 @@ abstract class FileBackend {
}
/**
- * Get the wiki identifier used for this backend (possibly empty)
+ * Get the wiki identifier used for this backend (possibly empty).
+ * Note that this might *not* be in the same format as wfWikiID().
*
* @return string
* @since 1.20
@@ -171,6 +180,7 @@ abstract class FileBackend {
* - copy
* - move
* - delete
+ * - describe (since 1.21)
* - null
*
* a) Create a new file in storage with the contents of a string
@@ -181,7 +191,8 @@ abstract class FileBackend {
* 'content' => <string of new file contents>,
* 'overwrite' => <boolean>,
* 'overwriteSame' => <boolean>,
- * 'disposition' => <Content-Disposition header value>
+ * 'disposition' => <Content-Disposition header value>,
+ * 'headers' => <HTTP header name/value map> # since 1.21
* );
* @endcode
*
@@ -193,7 +204,8 @@ abstract class FileBackend {
* 'dst' => <storage path>,
* 'overwrite' => <boolean>,
* 'overwriteSame' => <boolean>,
- * 'disposition' => <Content-Disposition header value>
+ * 'disposition' => <Content-Disposition header value>,
+ * 'headers' => <HTTP header name/value map> # since 1.21
* )
* @endcode
*
@@ -205,6 +217,7 @@ abstract class FileBackend {
* 'dst' => <storage path>,
* 'overwrite' => <boolean>,
* 'overwriteSame' => <boolean>,
+ * 'ignoreMissingSource' => <boolean>, # since 1.21
* 'disposition' => <Content-Disposition header value>
* )
* @endcode
@@ -217,6 +230,7 @@ abstract class FileBackend {
* 'dst' => <storage path>,
* 'overwrite' => <boolean>,
* 'overwriteSame' => <boolean>,
+ * 'ignoreMissingSource' => <boolean>, # since 1.21
* 'disposition' => <Content-Disposition header value>
* )
* @endcode
@@ -230,7 +244,17 @@ abstract class FileBackend {
* )
* @endcode
*
- * f) Do nothing (no-op)
+ * f) Update metadata for a file within storage
+ * @code
+ * array(
+ * 'op' => 'describe',
+ * 'src' => <storage path>,
+ * 'disposition' => <Content-Disposition header value>,
+ * 'headers' => <HTTP header name/value map>
+ * )
+ * @endcode
+ *
+ * g) Do nothing (no-op)
* @code
* array(
* 'op' => 'null',
@@ -244,28 +268,32 @@ abstract class FileBackend {
* - overwriteSame : An error will not be given if a file already
* exists at the destination that has the same
* contents as the new contents to be written there.
- * - disposition : When supplied, the backend will add a Content-Disposition
+ * - disposition : If supplied, the backend will return a Content-Disposition
* header when GETs/HEADs of the destination file are made.
- * Backends that don't support file metadata will ignore this.
- * See http://tools.ietf.org/html/rfc6266 (since 1.20).
+ * Backends that don't support metadata ignore this.
+ * See http://tools.ietf.org/html/rfc6266. (since 1.20)
+ * - headers : If supplied, the backend will return these headers when
+ * GETs/HEADs of the destination file are made. Header values
+ * should be smaller than 256 bytes, often options or numbers.
+ * Existing headers will remain, but these will replace any
+ * conflicting previous headers, and headers will be removed
+ * if they are set to an empty string.
+ * Backends that don't support metadata ignore this. (since 1.21)
*
* $opts is an associative of boolean flags, including:
* - force : Operation precondition errors no longer trigger an abort.
* Any remaining operations are still attempted. Unexpected
- * failures may still cause remaning operations to be aborted.
+ * failures may still cause remaining operations to be aborted.
* - nonLocking : No locks are acquired for the operations.
* This can increase performance for non-critical writes.
* This has no effect unless the 'force' flag is set.
- * - allowStale : Don't require the latest available data.
- * This can increase performance for non-critical writes.
- * This has no effect unless the 'force' flag is set.
* - nonJournaled : Don't log this operation batch in the file journal.
* This limits the ability of recovery scripts.
* - parallelize : Try to do operations in parallel when possible.
- * - bypassReadOnly : Allow writes in read-only mode (since 1.20).
+ * - bypassReadOnly : Allow writes in read-only mode. (since 1.20)
* - preserveCache : Don't clear the process cache before checking files.
* This should only be used if all entries in the process
- * cache were added after the files were already locked (since 1.20).
+ * cache were added after the files were already locked. (since 1.20)
*
* @remarks Remarks on locking:
* File system paths given to operations should refer to files that are
@@ -282,8 +310,8 @@ abstract class FileBackend {
* - a) unexpected operation errors occurred (network partitions, disk full...)
* - b) significant operation errors occurred and 'force' was not set
*
- * @param $ops Array List of operations to execute in order
- * @param $opts Array Batch operation options
+ * @param array $ops List of operations to execute in order
+ * @param array $opts Batch operation options
* @return Status
*/
final public function doOperations( array $ops, array $opts = array() ) {
@@ -292,18 +320,8 @@ abstract class FileBackend {
}
if ( empty( $opts['force'] ) ) { // sanity
unset( $opts['nonLocking'] );
- unset( $opts['allowStale'] );
- }
- $opts['concurrency'] = 1; // off
- if ( $this->parallelize === 'implicit' ) {
- if ( !isset( $opts['parallelize'] ) || $opts['parallelize'] ) {
- $opts['concurrency'] = $this->concurrency;
- }
- } elseif ( $this->parallelize === 'explicit' ) {
- if ( !empty( $opts['parallelize'] ) ) {
- $opts['concurrency'] = $this->concurrency;
- }
}
+ $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
return $this->doOperationsInternal( $ops, $opts );
}
@@ -319,8 +337,8 @@ abstract class FileBackend {
*
* @see FileBackend::doOperations()
*
- * @param $op Array Operation
- * @param $opts Array Operation options
+ * @param array $op Operation
+ * @param array $opts Operation options
* @return Status
*/
final public function doOperation( array $op, array $opts = array() ) {
@@ -333,8 +351,8 @@ abstract class FileBackend {
*
* @see FileBackend::doOperation()
*
- * @param $params Array Operation parameters
- * @param $opts Array Operation options
+ * @param array $params Operation parameters
+ * @param array $opts Operation options
* @return Status
*/
final public function create( array $params, array $opts = array() ) {
@@ -347,8 +365,8 @@ abstract class FileBackend {
*
* @see FileBackend::doOperation()
*
- * @param $params Array Operation parameters
- * @param $opts Array Operation options
+ * @param array $params Operation parameters
+ * @param array $opts Operation options
* @return Status
*/
final public function store( array $params, array $opts = array() ) {
@@ -361,8 +379,8 @@ abstract class FileBackend {
*
* @see FileBackend::doOperation()
*
- * @param $params Array Operation parameters
- * @param $opts Array Operation options
+ * @param array $params Operation parameters
+ * @param array $opts Operation options
* @return Status
*/
final public function copy( array $params, array $opts = array() ) {
@@ -375,8 +393,8 @@ abstract class FileBackend {
*
* @see FileBackend::doOperation()
*
- * @param $params Array Operation parameters
- * @param $opts Array Operation options
+ * @param array $params Operation parameters
+ * @param array $opts Operation options
* @return Status
*/
final public function move( array $params, array $opts = array() ) {
@@ -389,8 +407,8 @@ abstract class FileBackend {
*
* @see FileBackend::doOperation()
*
- * @param $params Array Operation parameters
- * @param $opts Array Operation options
+ * @param array $params Operation parameters
+ * @param array $opts Operation options
* @return Status
*/
final public function delete( array $params, array $opts = array() ) {
@@ -398,6 +416,21 @@ abstract class FileBackend {
}
/**
+ * Performs a single describe operation.
+ * This sets $params['op'] to 'describe' and passes it to doOperation().
+ *
+ * @see FileBackend::doOperation()
+ *
+ * @param array $params Operation parameters
+ * @param array $opts Operation options
+ * @return Status
+ * @since 1.21
+ */
+ final public function describe( array $params, array $opts = array() ) {
+ return $this->doOperation( array( 'op' => 'describe' ) + $params, $opts );
+ }
+
+ /**
* Perform a set of independent file operations on some files.
*
* This does no locking, nor journaling, and possibly no stat calls.
@@ -410,6 +443,7 @@ abstract class FileBackend {
* - copy
* - move
* - delete
+ * - describe (since 1.21)
* - null
*
* a) Create a new file in storage with the contents of a string
@@ -418,36 +452,44 @@ abstract class FileBackend {
* 'op' => 'create',
* 'dst' => <storage path>,
* 'content' => <string of new file contents>,
- * 'disposition' => <Content-Disposition header value>
+ * 'disposition' => <Content-Disposition header value>,
+ * 'headers' => <HTTP header name/value map> # since 1.21
* )
* @endcode
+ *
* b) Copy a file system file into storage
* @code
* array(
* 'op' => 'store',
* 'src' => <file system path>,
* 'dst' => <storage path>,
- * 'disposition' => <Content-Disposition header value>
+ * 'disposition' => <Content-Disposition header value>,
+ * 'headers' => <HTTP header name/value map> # since 1.21
* )
* @endcode
+ *
* c) Copy a file within storage
* @code
* array(
* 'op' => 'copy',
* 'src' => <storage path>,
* 'dst' => <storage path>,
+ * 'ignoreMissingSource' => <boolean>, # since 1.21
* 'disposition' => <Content-Disposition header value>
* )
* @endcode
+ *
* d) Move a file within storage
* @code
* array(
* 'op' => 'move',
* 'src' => <storage path>,
* 'dst' => <storage path>,
+ * 'ignoreMissingSource' => <boolean>, # since 1.21
* 'disposition' => <Content-Disposition header value>
* )
* @endcode
+ *
* e) Delete a file within storage
* @code
* array(
@@ -456,7 +498,18 @@ abstract class FileBackend {
* 'ignoreMissingSource' => <boolean>
* )
* @endcode
- * f) Do nothing (no-op)
+ *
+ * f) Update metadata for a file within storage
+ * @code
+ * array(
+ * 'op' => 'describe',
+ * 'src' => <storage path>,
+ * 'disposition' => <Content-Disposition header value>,
+ * 'headers' => <HTTP header name/value map>
+ * )
+ * @endcode
+ *
+ * g) Do nothing (no-op)
* @code
* array(
* 'op' => 'null',
@@ -470,6 +523,13 @@ abstract class FileBackend {
* header when GETs/HEADs of the destination file are made.
* Backends that don't support file metadata will ignore this.
* See http://tools.ietf.org/html/rfc6266 (since 1.20).
+ * - headers : If supplied with a header name/value map, the backend will
+ * reply with these headers when GETs/HEADs of the destination
+ * file are made. Header values should be smaller than 256 bytes.
+ * Existing headers will remain, but these will replace any
+ * conflicting previous headers, and headers will be removed
+ * if they are set to an empty string.
+ * Backends that don't support metadata ignore this. (since 1.21)
*
* $opts is an associative of boolean flags, including:
* - bypassReadOnly : Allow writes in read-only mode (since 1.20)
@@ -480,8 +540,8 @@ abstract class FileBackend {
* will reflect each operation attempted for the given files. The status will be
* considered "OK" as long as no fatal errors occurred.
*
- * @param $ops Array Set of operations to execute
- * @param $opts Array Batch operation options
+ * @param array $ops Set of operations to execute
+ * @param array $opts Batch operation options
* @return Status
* @since 1.20
*/
@@ -492,6 +552,7 @@ abstract class FileBackend {
foreach ( $ops as &$op ) {
$op['overwrite'] = true; // avoids RTTs in key/value stores
}
+ $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
return $this->doQuickOperationsInternal( $ops );
}
@@ -507,7 +568,7 @@ abstract class FileBackend {
*
* @see FileBackend::doQuickOperations()
*
- * @param $op Array Operation
+ * @param array $op Operation
* @return Status
* @since 1.20
*/
@@ -521,7 +582,7 @@ abstract class FileBackend {
*
* @see FileBackend::doQuickOperation()
*
- * @param $params Array Operation parameters
+ * @param array $params Operation parameters
* @return Status
* @since 1.20
*/
@@ -535,7 +596,7 @@ abstract class FileBackend {
*
* @see FileBackend::doQuickOperation()
*
- * @param $params Array Operation parameters
+ * @param array $params Operation parameters
* @return Status
* @since 1.20
*/
@@ -549,7 +610,7 @@ abstract class FileBackend {
*
* @see FileBackend::doQuickOperation()
*
- * @param $params Array Operation parameters
+ * @param array $params Operation parameters
* @return Status
* @since 1.20
*/
@@ -563,7 +624,7 @@ abstract class FileBackend {
*
* @see FileBackend::doQuickOperation()
*
- * @param $params Array Operation parameters
+ * @param array $params Operation parameters
* @return Status
* @since 1.20
*/
@@ -577,7 +638,7 @@ abstract class FileBackend {
*
* @see FileBackend::doQuickOperation()
*
- * @param $params Array Operation parameters
+ * @param array $params Operation parameters
* @return Status
* @since 1.20
*/
@@ -586,15 +647,30 @@ abstract class FileBackend {
}
/**
+ * Performs a single quick describe operation.
+ * This sets $params['op'] to 'describe' and passes it to doQuickOperation().
+ *
+ * @see FileBackend::doQuickOperation()
+ *
+ * @param array $params Operation parameters
+ * @return Status
+ * @since 1.21
+ */
+ final public function quickDescribe( array $params ) {
+ return $this->doQuickOperation( array( 'op' => 'describe' ) + $params );
+ }
+
+ /**
* Concatenate a list of storage files into a single file system file.
* The target path should refer to a file that is already locked or
* otherwise safe from modification from other processes. Normally,
* the file will be a new temp file, which should be adequate.
*
- * @param $params Array Operation parameters
+ * @param array $params Operation parameters
* $params include:
- * - srcs : ordered source storage paths (e.g. chunk1, chunk2, ...)
- * - dst : file system path to 0-byte temp file
+ * - srcs : ordered source storage paths (e.g. chunk1, chunk2, ...)
+ * - dst : file system path to 0-byte temp file
+ * - parallelize : try to do operations in parallel when possible
* @return Status
*/
abstract public function concatenate( array $params );
@@ -608,7 +684,7 @@ abstract class FileBackend {
* except they are only applied *if* the directory/container had to be created.
* These flags should always be set for directories that have private files.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - dir : storage directory
* - noAccess : try to deny file access (since 1.20)
@@ -620,6 +696,7 @@ abstract class FileBackend {
if ( empty( $params['bypassReadOnly'] ) && $this->isReadOnly() ) {
return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
}
+ $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
return $this->doPrepare( $params );
}
@@ -635,7 +712,7 @@ abstract class FileBackend {
* access to the storage user representing end-users in web requests.
* This is not guaranteed to actually do anything.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - dir : storage directory
* - noAccess : try to deny file access
@@ -647,6 +724,7 @@ abstract class FileBackend {
if ( empty( $params['bypassReadOnly'] ) && $this->isReadOnly() ) {
return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
}
+ $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
return $this->doSecure( $params );
}
@@ -662,7 +740,7 @@ abstract class FileBackend {
* access to the storage user representing end-users in web requests.
* This essentially can undo the result of secure() calls.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - dir : storage directory
* - access : try to allow file access
@@ -675,6 +753,7 @@ abstract class FileBackend {
if ( empty( $params['bypassReadOnly'] ) && $this->isReadOnly() ) {
return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
}
+ $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
return $this->doPublish( $params );
}
@@ -688,7 +767,7 @@ abstract class FileBackend {
* Backends using key/value stores may do nothing unless the directory
* is that of an empty container, in which case it will be deleted.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - dir : storage directory
* - recursive : recursively delete empty subdirectories first (since 1.20)
@@ -699,6 +778,7 @@ abstract class FileBackend {
if ( empty( $params['bypassReadOnly'] ) && $this->isReadOnly() ) {
return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
}
+ $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
return $this->doClean( $params );
}
@@ -708,10 +788,25 @@ abstract class FileBackend {
abstract protected function doClean( array $params );
/**
+ * Enter file operation scope.
+ * This just makes PHP ignore user aborts/disconnects until the return
+ * value leaves scope. This returns null and does nothing in CLI mode.
+ *
+ * @return ScopedCallback|null
+ */
+ final protected function getScopedPHPBehaviorForOps() {
+ if ( php_sapi_name() != 'cli' ) { // http://bugs.php.net/bug.php?id=47540
+ $old = ignore_user_abort( true ); // avoid half-finished operations
+ return new ScopedCallback( function() use ( $old ) { ignore_user_abort( $old ); } );
+ }
+ return null;
+ }
+
+ /**
* Check if a file exists at a storage path in the backend.
* This returns false if only a directory exists at the path.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - src : source storage path
* - latest : use the latest available data
@@ -722,7 +817,7 @@ abstract class FileBackend {
/**
* Get the last-modified timestamp of the file at a storage path.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - src : source storage path
* - latest : use the latest available data
@@ -734,18 +829,40 @@ abstract class FileBackend {
* Get the contents of a file at a storage path in the backend.
* This should be avoided for potentially large files.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - src : source storage path
* - latest : use the latest available data
* @return string|bool Returns false on failure
*/
- abstract public function getFileContents( array $params );
+ final public function getFileContents( array $params ) {
+ $contents = $this->getFileContentsMulti(
+ array( 'srcs' => array( $params['src'] ) ) + $params );
+
+ return $contents[$params['src']];
+ }
+
+ /**
+ * Like getFileContents() except it takes an array of storage paths
+ * and returns a map of storage paths to strings (or null on failure).
+ * The map keys (paths) are in the same order as the provided list of paths.
+ *
+ * @see FileBackend::getFileContents()
+ *
+ * @param array $params
+ * $params include:
+ * - srcs : list of source storage paths
+ * - latest : use the latest available data
+ * - parallelize : try to do operations in parallel when possible
+ * @return Array Map of (path name => string or false on failure)
+ * @since 1.20
+ */
+ abstract public function getFileContentsMulti( array $params );
/**
* Get the size (bytes) of a file at a storage path in the backend.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - src : source storage path
* - latest : use the latest available data
@@ -761,7 +878,7 @@ abstract class FileBackend {
* - size : the file size (bytes)
* Additional values may be included for internal use only.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - src : source storage path
* - latest : use the latest available data
@@ -772,7 +889,7 @@ abstract class FileBackend {
/**
* Get a SHA-1 hash of the file at a storage path in the backend.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - src : source storage path
* - latest : use the latest available data
@@ -782,13 +899,13 @@ abstract class FileBackend {
/**
* Get the properties of the file at a storage path in the backend.
- * Returns FSFile::placeholderProps() on failure.
+ * This gives the result of FSFile::getProps() on a local copy of the file.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - src : source storage path
* - latest : use the latest available data
- * @return Array
+ * @return Array Returns FSFile::placeholderProps() on failure
*/
abstract public function getFileProps( array $params );
@@ -799,7 +916,7 @@ abstract class FileBackend {
* will be sent if streaming began, while none will be sent otherwise.
* Implementations should flush the output buffer before sending data.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - src : source storage path
* - headers : list of additional HTTP headers to send on success
@@ -821,26 +938,89 @@ abstract class FileBackend {
* In that later case, there are copies of the file that must stay in sync.
* Additionally, further calls to this function may return the same file.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - src : source storage path
* - latest : use the latest available data
* @return FSFile|null Returns null on failure
*/
- abstract public function getLocalReference( array $params );
+ final public function getLocalReference( array $params ) {
+ $fsFiles = $this->getLocalReferenceMulti(
+ array( 'srcs' => array( $params['src'] ) ) + $params );
+
+ return $fsFiles[$params['src']];
+ }
+
+ /**
+ * Like getLocalReference() except it takes an array of storage paths
+ * and returns a map of storage paths to FSFile objects (or null on failure).
+ * The map keys (paths) are in the same order as the provided list of paths.
+ *
+ * @see FileBackend::getLocalReference()
+ *
+ * @param array $params
+ * $params include:
+ * - srcs : list of source storage paths
+ * - latest : use the latest available data
+ * - parallelize : try to do operations in parallel when possible
+ * @return Array Map of (path name => FSFile or null on failure)
+ * @since 1.20
+ */
+ abstract public function getLocalReferenceMulti( array $params );
/**
* Get a local copy on disk of the file at a storage path in the backend.
* The temporary copy will have the same file extension as the source.
* Temporary files may be purged when the file object falls out of scope.
*
- * @param $params Array
+ * @param array $params
* $params include:
* - src : source storage path
* - latest : use the latest available data
* @return TempFSFile|null Returns null on failure
*/
- abstract public function getLocalCopy( array $params );
+ final public function getLocalCopy( array $params ) {
+ $tmpFiles = $this->getLocalCopyMulti(
+ array( 'srcs' => array( $params['src'] ) ) + $params );
+
+ return $tmpFiles[$params['src']];
+ }
+
+ /**
+ * Like getLocalCopy() except it takes an array of storage paths and
+ * returns a map of storage paths to TempFSFile objects (or null on failure).
+ * The map keys (paths) are in the same order as the provided list of paths.
+ *
+ * @see FileBackend::getLocalCopy()
+ *
+ * @param array $params
+ * $params include:
+ * - srcs : list of source storage paths
+ * - latest : use the latest available data
+ * - parallelize : try to do operations in parallel when possible
+ * @return Array Map of (path name => TempFSFile or null on failure)
+ * @since 1.20
+ */
+ abstract public function getLocalCopyMulti( array $params );
+
+ /**
+ * Return an HTTP URL to a given file that requires no authentication to use.
+ * The URL may be pre-authenticated (via some token in the URL) and temporary.
+ * This will return null if the backend cannot make an HTTP URL for the file.
+ *
+ * This is useful for key/value stores when using scripts that seek around
+ * large files and those scripts (and the backend) support HTTP Range headers.
+ * Otherwise, one would need to use getLocalReference(), which involves loading
+ * the entire file on to local disk.
+ *
+ * @param array $params
+ * $params include:
+ * - src : source storage path
+ * - ttl : lifetime (seconds) if pre-authenticated; default is 1 day
+ * @return string|null
+ * @since 1.21
+ */
+ abstract public function getFileHttpUrl( array $params );
/**
* Check if a directory exists at a given storage path.
@@ -930,7 +1110,7 @@ abstract class FileBackend {
* Preload persistent file stat and property cache into in-process cache.
* This should be used when stat calls will be made on a known list of a many files.
*
- * @param $paths Array Storage paths
+ * @param array $paths Storage paths
* @return void
*/
public function preloadCache( array $paths ) {}
@@ -939,7 +1119,7 @@ abstract class FileBackend {
* Invalidate any in-process file stat and property cache.
* If $paths is given, then only the cache for those files will be cleared.
*
- * @param $paths Array Storage paths (optional)
+ * @param array $paths Storage paths (optional)
* @return void
*/
public function clearCache( array $paths = null ) {}
@@ -950,7 +1130,7 @@ abstract class FileBackend {
*
* Callers should consider using getScopedFileLocks() instead.
*
- * @param $paths Array Storage paths
+ * @param array $paths Storage paths
* @param $type integer LockManager::LOCK_* constant
* @return Status
*/
@@ -961,7 +1141,7 @@ abstract class FileBackend {
/**
* Unlock the files at the given storage paths in the backend.
*
- * @param $paths Array Storage paths
+ * @param array $paths Storage paths
* @param $type integer LockManager::LOCK_* constant
* @return Status
*/
@@ -977,7 +1157,7 @@ abstract class FileBackend {
* Once the return value goes out scope, the locks will be released and
* the status updated. Unlock fatals will not change the status "OK" value.
*
- * @param $paths Array Storage paths
+ * @param array $paths Storage paths
* @param $type integer LockManager::LOCK_* constant
* @param $status Status Status to update on lock/unlock
* @return ScopedLock|null Returns null on failure
@@ -997,7 +1177,7 @@ abstract class FileBackend {
*
* @see FileBackend::doOperations()
*
- * @param $ops Array List of file operations to FileBackend::doOperations()
+ * @param array $ops List of file operations to FileBackend::doOperations()
* @param $status Status Status to update on lock/unlock
* @return Array List of ScopedFileLocks or null values
* @since 1.20
@@ -1016,6 +1196,17 @@ abstract class FileBackend {
}
/**
+ * Get the storage path for the given container for this backend
+ *
+ * @param string $container Container name
+ * @return string Storage path
+ * @since 1.21
+ */
+ final public function getContainerStoragePath( $container ) {
+ return $this->getRootStoragePath() . "/{$container}";
+ }
+
+ /**
* Get the file journal object for this backend
*
* @return FileJournal
@@ -1088,7 +1279,7 @@ abstract class FileBackend {
*/
final public static function parentStoragePath( $storagePath ) {
$storagePath = dirname( $storagePath );
- list( $b, $cont, $rel ) = self::splitStoragePath( $storagePath );
+ list( , , $rel ) = self::splitStoragePath( $storagePath );
return ( $rel === null ) ? null : $storagePath;
}
@@ -1117,8 +1308,9 @@ abstract class FileBackend {
/**
* Build a Content-Disposition header value per RFC 6266.
*
- * @param $type string One of (attachment, inline)
- * @param $filename string Suggested file name (should not contain slashes)
+ * @param string $type One of (attachment, inline)
+ * @param string $filename Suggested file name (should not contain slashes)
+ * @throws MWException
* @return string
* @since 1.20
*/
@@ -1145,7 +1337,7 @@ abstract class FileBackend {
*
* This uses the same traversal protection as Title::secureAndSplit().
*
- * @param $path string Storage path relative to a container
+ * @param string $path Storage path relative to a container
* @return string|null
*/
final protected static function normalizeContainerPath( $path ) {
diff --git a/includes/filebackend/FileBackendGroup.php b/includes/filebackend/FileBackendGroup.php
index 8bbc96d0..d790a996 100644
--- a/includes/filebackend/FileBackendGroup.php
+++ b/includes/filebackend/FileBackendGroup.php
@@ -87,6 +87,9 @@ class FileBackendGroup {
$thumbDir = isset( $info['thumbDir'] )
? $info['thumbDir']
: "{$directory}/thumb";
+ $transcodedDir = isset( $info['transcodedDir'] )
+ ? $info['transcodedDir']
+ : "{$directory}/transcoded";
$fileMode = isset( $info['fileMode'] )
? $info['fileMode']
: 0644;
@@ -98,6 +101,7 @@ class FileBackendGroup {
'containerPaths' => array(
"{$repoName}-public" => "{$directory}",
"{$repoName}-thumb" => $thumbDir,
+ "{$repoName}-transcoded" => $transcodedDir,
"{$repoName}-deleted" => $deletedDir,
"{$repoName}-temp" => "{$directory}/temp"
),
@@ -122,7 +126,9 @@ class FileBackendGroup {
throw new MWException( "Cannot register a backend with no name." );
}
$name = $config['name'];
- if ( !isset( $config['class'] ) ) {
+ if ( isset( $this->backends[$name] ) ) {
+ throw new MWException( "Backend with name `{$name}` already registered." );
+ } elseif ( !isset( $config['class'] ) ) {
throw new MWException( "Cannot register backend `{$name}` with no class." );
}
$class = $config['class'];
@@ -178,7 +184,7 @@ class FileBackendGroup {
* @return FileBackend|null Backend or null on failure
*/
public function backendFromPath( $storagePath ) {
- list( $backend, $c, $p ) = FileBackend::splitStoragePath( $storagePath );
+ list( $backend, , ) = FileBackend::splitStoragePath( $storagePath );
if ( $backend !== null && isset( $this->backends[$backend] ) ) {
return $this->get( $backend );
}
diff --git a/includes/filebackend/FileBackendMultiWrite.php b/includes/filebackend/FileBackendMultiWrite.php
index 4be03231..939315d1 100644
--- a/includes/filebackend/FileBackendMultiWrite.php
+++ b/includes/filebackend/FileBackendMultiWrite.php
@@ -62,7 +62,7 @@ class FileBackendMultiWrite extends FileBackend {
* Additional $config params include:
* - backends : Array of backend config and multi-backend settings.
* Each value is the config used in the constructor of a
- * FileBackendStore class, but with these additional settings:
+ * FileBackendStore class, but with these additional settings:
* - class : The name of the backend class
* - isMultiMaster : This must be set for one backend.
* - template: : If given a backend name, this will use
@@ -179,10 +179,11 @@ class FileBackendMultiWrite extends FileBackend {
// Actually attempt the operation batch on the master backend...
$masterStatus = $mbe->doOperations( $realOps, $opts );
$status->merge( $masterStatus );
- // Propagate the operations to the clone backends if there were no fatal errors.
- // If $ops only had one operation, this might avoid backend inconsistencies.
- // This also avoids inconsistency for expected errors (like "file already exists").
- if ( !count( $masterStatus->getErrorsArray() ) ) {
+ // Propagate the operations to the clone backends if there were no unexpected errors
+ // and if there were either no expected errors or if the 'force' option was used.
+ // However, if nothing succeeded at all, then don't replicate any of the operations.
+ // If $ops only had one operation, this might avoid backend sync inconsistencies.
+ if ( $masterStatus->isOK() && $masterStatus->successCount > 0 ) {
foreach ( $this->backends as $index => $backend ) {
if ( $index !== $this->masterIndex ) { // not done already
$realOps = $this->substOpBatchPaths( $ops, $backend );
@@ -203,7 +204,7 @@ class FileBackendMultiWrite extends FileBackend {
/**
* Check that a set of files are consistent across all internal backends
*
- * @param $paths Array List of storage paths
+ * @param array $paths List of storage paths
* @return Status
*/
public function consistencyCheck( array $paths ) {
@@ -269,7 +270,7 @@ class FileBackendMultiWrite extends FileBackend {
/**
* Check that a set of file paths are usable across all internal backends
*
- * @param $paths Array List of storage paths
+ * @param array $paths List of storage paths
* @return Status
*/
public function accessibilityCheck( array $paths ) {
@@ -294,7 +295,7 @@ class FileBackendMultiWrite extends FileBackend {
* Check that a set of files are consistent across all internal backends
* and re-synchronize those files againt the "multi master" if needed.
*
- * @param $paths Array List of storage paths
+ * @param array $paths List of storage paths
* @return Status
*/
public function resyncFiles( array $paths ) {
@@ -302,8 +303,8 @@ class FileBackendMultiWrite extends FileBackend {
$mBackend = $this->backends[$this->masterIndex];
foreach ( $paths as $path ) {
- $mPath = $this->substPaths( $path, $mBackend );
- $mSha1 = $mBackend->getFileSha1Base36( array( 'src' => $mPath ) );
+ $mPath = $this->substPaths( $path, $mBackend );
+ $mSha1 = $mBackend->getFileSha1Base36( array( 'src' => $mPath ) );
$mExist = $mBackend->fileExists( array( 'src' => $mPath ) );
// Check if the master backend is available...
if ( $mExist === null ) {
@@ -335,14 +336,20 @@ class FileBackendMultiWrite extends FileBackend {
/**
* Get a list of file storage paths to read or write for a list of operations
*
- * @param $ops Array Same format as doOperations()
+ * @param array $ops Same format as doOperations()
* @return Array List of storage paths to files (does not include directories)
*/
protected function fileStoragePathsForOps( array $ops ) {
$paths = array();
foreach ( $ops as $op ) {
if ( isset( $op['src'] ) ) {
- $paths[] = $op['src'];
+ // For things like copy/move/delete with "ignoreMissingSource" and there
+ // is no source file, nothing should happen and there should be no errors.
+ if ( empty( $op['ignoreMissingSource'] )
+ || $this->fileExists( array( 'src' => $op['src'] ) ) )
+ {
+ $paths[] = $op['src'];
+ }
}
if ( isset( $op['srcs'] ) ) {
$paths = array_merge( $paths, $op['srcs'] );
@@ -351,14 +358,14 @@ class FileBackendMultiWrite extends FileBackend {
$paths[] = $op['dst'];
}
}
- return array_unique( array_filter( $paths, 'FileBackend::isStoragePath' ) );
+ return array_values( array_unique( array_filter( $paths, 'FileBackend::isStoragePath' ) ) );
}
/**
* Substitute the backend name in storage path parameters
* for a set of operations with that of a given internal backend.
*
- * @param $ops Array List of file operation arrays
+ * @param array $ops List of file operation arrays
* @param $backend FileBackendStore
* @return Array
*/
@@ -379,7 +386,7 @@ class FileBackendMultiWrite extends FileBackend {
/**
* Same as substOpBatchPaths() but for a single operation
*
- * @param $ops array File operation array
+ * @param array $ops File operation array
* @param $backend FileBackendStore
* @return Array
*/
@@ -391,7 +398,7 @@ class FileBackendMultiWrite extends FileBackend {
/**
* Substitute the backend of storage paths with an internal backend's name
*
- * @param $paths Array|string List of paths or single string path
+ * @param array|string $paths List of paths or single string path
* @param $backend FileBackendStore
* @return Array|string
*/
@@ -406,7 +413,7 @@ class FileBackendMultiWrite extends FileBackend {
/**
* Substitute the backend of internal storage paths with the proxy backend's name
*
- * @param $paths Array|string List of paths or single string path
+ * @param array|string $paths List of paths or single string path
* @return Array|string
*/
protected function unsubstPaths( $paths ) {
@@ -446,11 +453,11 @@ class FileBackendMultiWrite extends FileBackend {
}
/**
- * @param $path string Storage path
+ * @param string $path Storage path
* @return bool Path container should have dir changes pushed to all backends
*/
protected function replicateContainerDirChanges( $path ) {
- list( $b, $shortCont, $r ) = self::splitStoragePath( $path );
+ list( , $shortCont, ) = self::splitStoragePath( $path );
return !in_array( $shortCont, $this->noPushDirConts );
}
@@ -535,6 +542,7 @@ class FileBackendMultiWrite extends FileBackend {
/**
* @see FileBackend::fileExists()
* @param $params array
+ * @return bool|null
*/
public function fileExists( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
@@ -572,13 +580,19 @@ class FileBackendMultiWrite extends FileBackend {
}
/**
- * @see FileBackend::getFileContents()
+ * @see FileBackend::getFileContentsMulti()
* @param $params array
* @return bool|string
*/
- public function getFileContents( array $params ) {
+ public function getFileContentsMulti( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
- return $this->backends[$this->masterIndex]->getFileContents( $realParams );
+ $contentsM = $this->backends[$this->masterIndex]->getFileContentsMulti( $realParams );
+
+ $contents = array(); // (path => FSFile) mapping using the proxy backend's name
+ foreach ( $contentsM as $path => $data ) {
+ $contents[$this->unsubstPaths( $path )] = $data;
+ }
+ return $contents;
}
/**
@@ -612,23 +626,44 @@ class FileBackendMultiWrite extends FileBackend {
}
/**
- * @see FileBackend::getLocalReference()
+ * @see FileBackend::getLocalReferenceMulti()
* @param $params array
* @return FSFile|null
*/
- public function getLocalReference( array $params ) {
+ public function getLocalReferenceMulti( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
- return $this->backends[$this->masterIndex]->getLocalReference( $realParams );
+ $fsFilesM = $this->backends[$this->masterIndex]->getLocalReferenceMulti( $realParams );
+
+ $fsFiles = array(); // (path => FSFile) mapping using the proxy backend's name
+ foreach ( $fsFilesM as $path => $fsFile ) {
+ $fsFiles[$this->unsubstPaths( $path )] = $fsFile;
+ }
+ return $fsFiles;
}
/**
- * @see FileBackend::getLocalCopy()
+ * @see FileBackend::getLocalCopyMulti()
* @param $params array
* @return null|TempFSFile
*/
- public function getLocalCopy( array $params ) {
+ public function getLocalCopyMulti( array $params ) {
+ $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+ $tempFilesM = $this->backends[$this->masterIndex]->getLocalCopyMulti( $realParams );
+
+ $tempFiles = array(); // (path => TempFSFile) mapping using the proxy backend's name
+ foreach ( $tempFilesM as $path => $tempFile ) {
+ $tempFiles[$this->unsubstPaths( $path )] = $tempFile;
+ }
+ return $tempFiles;
+ }
+
+ /**
+ * @see FileBackend::getFileHttpUrl()
+ * @return string|null
+ */
+ public function getFileHttpUrl( array $params ) {
$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
- return $this->backends[$this->masterIndex]->getLocalCopy( $realParams );
+ return $this->backends[$this->masterIndex]->getFileHttpUrl( $realParams );
}
/**
diff --git a/includes/filebackend/FileBackendStore.php b/includes/filebackend/FileBackendStore.php
index 083dfea9..3f1d1857 100644
--- a/includes/filebackend/FileBackendStore.php
+++ b/includes/filebackend/FileBackendStore.php
@@ -48,6 +48,8 @@ abstract class FileBackendStore extends FileBackend {
protected $maxFileSize = 4294967296; // integer bytes (4GiB)
+ const CACHE_TTL = 10; // integer; TTL in seconds for process cache entries
+
/**
* @see FileBackend::__construct()
*
@@ -55,8 +57,8 @@ abstract class FileBackendStore extends FileBackend {
*/
public function __construct( array $config ) {
parent::__construct( $config );
- $this->memCache = new EmptyBagOStuff(); // disabled by default
- $this->cheapCache = new ProcessCacheLRU( 300 );
+ $this->memCache = new EmptyBagOStuff(); // disabled by default
+ $this->cheapCache = new ProcessCacheLRU( 300 );
$this->expensiveCache = new ProcessCacheLRU( 5 );
}
@@ -72,8 +74,9 @@ abstract class FileBackendStore extends FileBackend {
}
/**
- * Check if a file can be created at a given storage path.
- * FS backends should check if the parent directory exists and the file is writable.
+ * Check if a file can be created or changed at a given storage path.
+ * FS backends should check if the parent directory exists, files can be
+ * written under it, and that any file already there is writable.
* Backends using key/value stores should check if the container exists.
*
* @param $storagePath string
@@ -83,18 +86,21 @@ abstract class FileBackendStore extends FileBackend {
/**
* Create a file in the backend with the given contents.
+ * This will overwrite any file that exists at the destination.
* Do not call this function from places outside FileBackend and FileOp.
*
* $params include:
- * - content : the raw file contents
- * - dst : destination storage path
- * - overwrite : overwrite any file that exists at the destination
- * - disposition : Content-Disposition header value for the destination
- * - async : Status will be returned immediately if supported.
- * If the status is OK, then its value field will be
- * set to a FileBackendStoreOpHandle object.
+ * - content : the raw file contents
+ * - dst : destination storage path
+ * - disposition : Content-Disposition header value for the destination
+ * - headers : HTTP header name/value map
+ * - async : Status will be returned immediately if supported.
+ * If the status is OK, then its value field will be
+ * set to a FileBackendStoreOpHandle object.
+ * - dstExists : Whether a file exists at the destination (optimization).
+ * Callers can use "false" if no existing file is being changed.
*
- * @param $params Array
+ * @param array $params
* @return Status
*/
final public function createInternal( array $params ) {
@@ -106,7 +112,7 @@ abstract class FileBackendStore extends FileBackend {
} else {
$status = $this->doCreateInternal( $params );
$this->clearCache( array( $params['dst'] ) );
- if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
+ if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
$this->deleteFileCache( $params['dst'] ); // persistent cache
}
}
@@ -117,23 +123,27 @@ abstract class FileBackendStore extends FileBackend {
/**
* @see FileBackendStore::createInternal()
+ * @return Status
*/
abstract protected function doCreateInternal( array $params );
/**
* Store a file into the backend from a file on disk.
+ * This will overwrite any file that exists at the destination.
* Do not call this function from places outside FileBackend and FileOp.
*
* $params include:
- * - src : source path on disk
- * - dst : destination storage path
- * - overwrite : overwrite any file that exists at the destination
- * - disposition : Content-Disposition header value for the destination
- * - async : Status will be returned immediately if supported.
- * If the status is OK, then its value field will be
- * set to a FileBackendStoreOpHandle object.
+ * - src : source path on disk
+ * - dst : destination storage path
+ * - disposition : Content-Disposition header value for the destination
+ * - headers : HTTP header name/value map
+ * - async : Status will be returned immediately if supported.
+ * If the status is OK, then its value field will be
+ * set to a FileBackendStoreOpHandle object.
+ * - dstExists : Whether a file exists at the destination (optimization).
+ * Callers can use "false" if no existing file is being changed.
*
- * @param $params Array
+ * @param array $params
* @return Status
*/
final public function storeInternal( array $params ) {
@@ -145,7 +155,7 @@ abstract class FileBackendStore extends FileBackend {
} else {
$status = $this->doStoreInternal( $params );
$this->clearCache( array( $params['dst'] ) );
- if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
+ if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
$this->deleteFileCache( $params['dst'] ); // persistent cache
}
}
@@ -156,23 +166,27 @@ abstract class FileBackendStore extends FileBackend {
/**
* @see FileBackendStore::storeInternal()
+ * @return Status
*/
abstract protected function doStoreInternal( array $params );
/**
* Copy a file from one storage path to another in the backend.
+ * This will overwrite any file that exists at the destination.
* Do not call this function from places outside FileBackend and FileOp.
*
* $params include:
- * - src : source storage path
- * - dst : destination storage path
- * - overwrite : overwrite any file that exists at the destination
- * - disposition : Content-Disposition header value for the destination
- * - async : Status will be returned immediately if supported.
- * If the status is OK, then its value field will be
- * set to a FileBackendStoreOpHandle object.
+ * - src : source storage path
+ * - dst : destination storage path
+ * - ignoreMissingSource : do nothing if the source file does not exist
+ * - disposition : Content-Disposition header value for the destination
+ * - async : Status will be returned immediately if supported.
+ * If the status is OK, then its value field will be
+ * set to a FileBackendStoreOpHandle object.
+ * - dstExists : Whether a file exists at the destination (optimization).
+ * Callers can use "false" if no existing file is being changed.
*
- * @param $params Array
+ * @param array $params
* @return Status
*/
final public function copyInternal( array $params ) {
@@ -180,7 +194,7 @@ abstract class FileBackendStore extends FileBackend {
wfProfileIn( __METHOD__ . '-' . $this->name );
$status = $this->doCopyInternal( $params );
$this->clearCache( array( $params['dst'] ) );
- if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
+ if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
$this->deleteFileCache( $params['dst'] ); // persistent cache
}
wfProfileOut( __METHOD__ . '-' . $this->name );
@@ -190,6 +204,7 @@ abstract class FileBackendStore extends FileBackend {
/**
* @see FileBackendStore::copyInternal()
+ * @return Status
*/
abstract protected function doCopyInternal( array $params );
@@ -204,7 +219,7 @@ abstract class FileBackendStore extends FileBackend {
* If the status is OK, then its value field will be
* set to a FileBackendStoreOpHandle object.
*
- * @param $params Array
+ * @param array $params
* @return Status
*/
final public function deleteInternal( array $params ) {
@@ -220,23 +235,27 @@ abstract class FileBackendStore extends FileBackend {
/**
* @see FileBackendStore::deleteInternal()
+ * @return Status
*/
abstract protected function doDeleteInternal( array $params );
/**
* Move a file from one storage path to another in the backend.
+ * This will overwrite any file that exists at the destination.
* Do not call this function from places outside FileBackend and FileOp.
*
* $params include:
- * - src : source storage path
- * - dst : destination storage path
- * - overwrite : overwrite any file that exists at the destination
- * - disposition : Content-Disposition header value for the destination
- * - async : Status will be returned immediately if supported.
- * If the status is OK, then its value field will be
- * set to a FileBackendStoreOpHandle object.
+ * - src : source storage path
+ * - dst : destination storage path
+ * - ignoreMissingSource : do nothing if the source file does not exist
+ * - disposition : Content-Disposition header value for the destination
+ * - async : Status will be returned immediately if supported.
+ * If the status is OK, then its value field will be
+ * set to a FileBackendStoreOpHandle object.
+ * - dstExists : Whether a file exists at the destination (optimization).
+ * Callers can use "false" if no existing file is being changed.
*
- * @param $params Array
+ * @param array $params
* @return Status
*/
final public function moveInternal( array $params ) {
@@ -245,7 +264,7 @@ abstract class FileBackendStore extends FileBackend {
$status = $this->doMoveInternal( $params );
$this->clearCache( array( $params['src'], $params['dst'] ) );
$this->deleteFileCache( $params['src'] ); // persistent cache
- if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
+ if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
$this->deleteFileCache( $params['dst'] ); // persistent cache
}
wfProfileOut( __METHOD__ . '-' . $this->name );
@@ -270,10 +289,44 @@ abstract class FileBackendStore extends FileBackend {
}
/**
+ * Alter metadata for a file at the storage path.
+ * Do not call this function from places outside FileBackend and FileOp.
+ *
+ * $params include:
+ * - src : source storage path
+ * - disposition : Content-Disposition header value for the destination
+ * - headers : HTTP header name/value map
+ * - async : Status will be returned immediately if supported.
+ * If the status is OK, then its value field will be
+ * set to a FileBackendStoreOpHandle object.
+ *
+ * @param array $params
+ * @return Status
+ */
+ final public function describeInternal( array $params ) {
+ wfProfileIn( __METHOD__ );
+ wfProfileIn( __METHOD__ . '-' . $this->name );
+ $status = $this->doDescribeInternal( $params );
+ $this->clearCache( array( $params['src'] ) );
+ $this->deleteFileCache( $params['src'] ); // persistent cache
+ wfProfileOut( __METHOD__ . '-' . $this->name );
+ wfProfileOut( __METHOD__ );
+ return $status;
+ }
+
+ /**
+ * @see FileBackendStore::describeInternal()
+ * @return Status
+ */
+ protected function doDescribeInternal( array $params ) {
+ return Status::newGood();
+ }
+
+ /**
* No-op file operation that does nothing.
* Do not call this function from places outside FileBackend and FileOp.
*
- * @param $params Array
+ * @param array $params
* @return Status
*/
final public function nullInternal( array $params ) {
@@ -314,31 +367,41 @@ abstract class FileBackendStore extends FileBackend {
protected function doConcatenate( array $params ) {
$status = Status::newGood();
$tmpPath = $params['dst']; // convenience
+ unset( $params['latest'] ); // sanity
// Check that the specified temp file is valid...
wfSuppressWarnings();
- $ok = ( is_file( $tmpPath ) && !filesize( $tmpPath ) );
+ $ok = ( is_file( $tmpPath ) && filesize( $tmpPath ) == 0 );
wfRestoreWarnings();
if ( !$ok ) { // not present or not empty
$status->fatal( 'backend-fail-opentemp', $tmpPath );
return $status;
}
- // Build up the temp file using the source chunks (in order)...
+ // Get local FS versions of the chunks needed for the concatenation...
+ $fsFiles = $this->getLocalReferenceMulti( $params );
+ foreach ( $fsFiles as $path => &$fsFile ) {
+ if ( !$fsFile ) { // chunk failed to download?
+ $fsFile = $this->getLocalReference( array( 'src' => $path ) );
+ if ( !$fsFile ) { // retry failed?
+ $status->fatal( 'backend-fail-read', $path );
+ return $status;
+ }
+ }
+ }
+ unset( $fsFile ); // unset reference so we can reuse $fsFile
+
+ // Get a handle for the destination temp file
$tmpHandle = fopen( $tmpPath, 'ab' );
if ( $tmpHandle === false ) {
$status->fatal( 'backend-fail-opentemp', $tmpPath );
return $status;
}
- foreach ( $params['srcs'] as $virtualSource ) {
- // Get a local FS version of the chunk
- $tmpFile = $this->getLocalReference( array( 'src' => $virtualSource ) );
- if ( !$tmpFile ) {
- $status->fatal( 'backend-fail-read', $virtualSource );
- return $status;
- }
+
+ // Build up the temp file using the source chunks (in order)...
+ foreach ( $fsFiles as $virtualSource => $fsFile ) {
// Get a handle to the local FS version
- $sourceHandle = fopen( $tmpFile->getPath(), 'r' );
+ $sourceHandle = fopen( $fsFile->getPath(), 'rb' );
if ( $sourceHandle === false ) {
fclose( $tmpHandle );
$status->fatal( 'backend-fail-read', $virtualSource );
@@ -384,7 +447,7 @@ abstract class FileBackendStore extends FileBackend {
$status->merge( $this->doPrepareInternal( $fullCont, $dir, $params ) );
} else { // directory is on several shards
wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
- list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
$status->merge( $this->doPrepareInternal( "{$fullCont}{$suffix}", $dir, $params ) );
}
@@ -424,7 +487,7 @@ abstract class FileBackendStore extends FileBackend {
$status->merge( $this->doSecureInternal( $fullCont, $dir, $params ) );
} else { // directory is on several shards
wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
- list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
$status->merge( $this->doSecureInternal( "{$fullCont}{$suffix}", $dir, $params ) );
}
@@ -464,7 +527,7 @@ abstract class FileBackendStore extends FileBackend {
$status->merge( $this->doPublishInternal( $fullCont, $dir, $params ) );
} else { // directory is on several shards
wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
- list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
$status->merge( $this->doPublishInternal( "{$fullCont}{$suffix}", $dir, $params ) );
}
@@ -500,6 +563,7 @@ abstract class FileBackendStore extends FileBackend {
$subDir = $params['dir'] . "/{$subDirRel}"; // full path
$status->merge( $this->doClean( array( 'dir' => $subDir ) + $params ) );
}
+ unset( $subDirsRel ); // free directory for rmdir() on Windows (for FS backends)
}
}
@@ -525,7 +589,7 @@ abstract class FileBackendStore extends FileBackend {
$this->deleteContainerCache( $fullCont ); // purge cache
} else { // directory is on several shards
wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
- list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
$status->merge( $this->doCleanInternal( "{$fullCont}{$suffix}", $dir, $params ) );
$this->deleteContainerCache( "{$fullCont}{$suffix}" ); // purge cache
@@ -596,17 +660,25 @@ abstract class FileBackendStore extends FileBackend {
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__ . '-' . $this->name );
$latest = !empty( $params['latest'] ); // use latest data?
- if ( !$this->cheapCache->has( $path, 'stat' ) ) {
+ if ( !$this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
$this->primeFileCache( array( $path ) ); // check persistent cache
}
- if ( $this->cheapCache->has( $path, 'stat' ) ) {
+ if ( $this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
$stat = $this->cheapCache->get( $path, 'stat' );
// If we want the latest data, check that this cached
// value was in fact fetched with the latest available data.
- if ( !$latest || $stat['latest'] ) {
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
- return $stat;
+ if ( is_array( $stat ) ) {
+ if ( !$latest || $stat['latest'] ) {
+ wfProfileOut( __METHOD__ . '-' . $this->name );
+ wfProfileOut( __METHOD__ );
+ return $stat;
+ }
+ } elseif ( in_array( $stat, array( 'NOT_EXIST', 'NOT_EXIST_LATEST' ) ) ) {
+ if ( !$latest || $stat === 'NOT_EXIST_LATEST' ) {
+ wfProfileOut( __METHOD__ . '-' . $this->name );
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
}
}
wfProfileIn( __METHOD__ . '-miss' );
@@ -614,7 +686,7 @@ abstract class FileBackendStore extends FileBackend {
$stat = $this->doGetFileStat( $params );
wfProfileOut( __METHOD__ . '-miss-' . $this->name );
wfProfileOut( __METHOD__ . '-miss' );
- if ( is_array( $stat ) ) { // don't cache negatives
+ if ( is_array( $stat ) ) { // file exists
$stat['latest'] = $latest;
$this->cheapCache->set( $path, 'stat', $stat );
$this->setFileCache( $path, $stat ); // update persistent cache
@@ -622,8 +694,11 @@ abstract class FileBackendStore extends FileBackend {
$this->cheapCache->set( $path, 'sha1',
array( 'hash' => $stat['sha1'], 'latest' => $latest ) );
}
- } else {
+ } elseif ( $stat === false ) { // file does not exist
+ $this->cheapCache->set( $path, 'stat', $latest ? 'NOT_EXIST_LATEST' : 'NOT_EXIST' );
wfDebug( __METHOD__ . ": File $path does not exist.\n" );
+ } else { // an error occurred
+ wfDebug( __METHOD__ . ": Could not stat file $path.\n" );
}
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
@@ -636,24 +711,33 @@ abstract class FileBackendStore extends FileBackend {
abstract protected function doGetFileStat( array $params );
/**
- * @see FileBackend::getFileContents()
- * @return bool|string
+ * @see FileBackend::getFileContentsMulti()
+ * @return Array
*/
- public function getFileContents( array $params ) {
+ public function getFileContentsMulti( array $params ) {
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__ . '-' . $this->name );
- $tmpFile = $this->getLocalReference( $params );
- if ( !$tmpFile ) {
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
- return false;
- }
- wfSuppressWarnings();
- $data = file_get_contents( $tmpFile->getPath() );
- wfRestoreWarnings();
+
+ $params = $this->setConcurrencyFlags( $params );
+ $contents = $this->doGetFileContentsMulti( $params );
+
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
- return $data;
+ return $contents;
+ }
+
+ /**
+ * @see FileBackendStore::getFileContentsMulti()
+ * @return Array
+ */
+ protected function doGetFileContentsMulti( array $params ) {
+ $contents = array();
+ foreach ( $this->doGetLocalReferenceMulti( $params ) as $path => $fsFile ) {
+ wfSuppressWarnings();
+ $contents[$path] = $fsFile ? file_get_contents( $fsFile->getPath() ) : false;
+ wfRestoreWarnings();
+ }
+ return $contents;
}
/**
@@ -668,7 +752,7 @@ abstract class FileBackendStore extends FileBackend {
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__ . '-' . $this->name );
$latest = !empty( $params['latest'] ); // use latest data?
- if ( $this->cheapCache->has( $path, 'sha1' ) ) {
+ if ( $this->cheapCache->has( $path, 'sha1', self::CACHE_TTL ) ) {
$stat = $this->cheapCache->get( $path, 'sha1' );
// If we want the latest data, check that this cached
// value was in fact fetched with the latest available data.
@@ -683,10 +767,7 @@ abstract class FileBackendStore extends FileBackend {
$hash = $this->doGetFileSha1Base36( $params );
wfProfileOut( __METHOD__ . '-miss-' . $this->name );
wfProfileOut( __METHOD__ . '-miss' );
- if ( $hash ) { // don't cache negatives
- $this->cheapCache->set( $path, 'sha1',
- array( 'hash' => $hash, 'latest' => $latest ) );
- }
+ $this->cheapCache->set( $path, 'sha1', array( 'hash' => $hash, 'latest' => $latest ) );
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
return $hash;
@@ -720,35 +801,82 @@ abstract class FileBackendStore extends FileBackend {
}
/**
- * @see FileBackend::getLocalReference()
- * @return TempFSFile|null
+ * @see FileBackend::getLocalReferenceMulti()
+ * @return Array
*/
- public function getLocalReference( array $params ) {
- $path = self::normalizeStoragePath( $params['src'] );
- if ( $path === null ) {
- return null; // invalid storage path
- }
+ final public function getLocalReferenceMulti( array $params ) {
wfProfileIn( __METHOD__ );
wfProfileIn( __METHOD__ . '-' . $this->name );
+
+ $params = $this->setConcurrencyFlags( $params );
+
+ $fsFiles = array(); // (path => FSFile)
$latest = !empty( $params['latest'] ); // use latest data?
- if ( $this->expensiveCache->has( $path, 'localRef' ) ) {
- $val = $this->expensiveCache->get( $path, 'localRef' );
- // If we want the latest data, check that this cached
- // value was in fact fetched with the latest available data.
- if ( !$latest || $val['latest'] ) {
- wfProfileOut( __METHOD__ . '-' . $this->name );
- wfProfileOut( __METHOD__ );
- return $val['object'];
+ // Reuse any files already in process cache...
+ foreach ( $params['srcs'] as $src ) {
+ $path = self::normalizeStoragePath( $src );
+ if ( $path === null ) {
+ $fsFiles[$src] = null; // invalid storage path
+ } elseif ( $this->expensiveCache->has( $path, 'localRef' ) ) {
+ $val = $this->expensiveCache->get( $path, 'localRef' );
+ // If we want the latest data, check that this cached
+ // value was in fact fetched with the latest available data.
+ if ( !$latest || $val['latest'] ) {
+ $fsFiles[$src] = $val['object'];
+ }
}
}
- $tmpFile = $this->getLocalCopy( $params );
- if ( $tmpFile ) { // don't cache negatives
- $this->expensiveCache->set( $path, 'localRef',
- array( 'object' => $tmpFile, 'latest' => $latest ) );
+ // Fetch local references of any remaning files...
+ $params['srcs'] = array_diff( $params['srcs'], array_keys( $fsFiles ) );
+ foreach ( $this->doGetLocalReferenceMulti( $params ) as $path => $fsFile ) {
+ $fsFiles[$path] = $fsFile;
+ if ( $fsFile ) { // update the process cache...
+ $this->expensiveCache->set( $path, 'localRef',
+ array( 'object' => $fsFile, 'latest' => $latest ) );
+ }
}
+
+ wfProfileOut( __METHOD__ . '-' . $this->name );
+ wfProfileOut( __METHOD__ );
+ return $fsFiles;
+ }
+
+ /**
+ * @see FileBackendStore::getLocalReferenceMulti()
+ * @return Array
+ */
+ protected function doGetLocalReferenceMulti( array $params ) {
+ return $this->doGetLocalCopyMulti( $params );
+ }
+
+ /**
+ * @see FileBackend::getLocalCopyMulti()
+ * @return Array
+ */
+ final public function getLocalCopyMulti( array $params ) {
+ wfProfileIn( __METHOD__ );
+ wfProfileIn( __METHOD__ . '-' . $this->name );
+
+ $params = $this->setConcurrencyFlags( $params );
+ $tmpFiles = $this->doGetLocalCopyMulti( $params );
+
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
- return $tmpFile;
+ return $tmpFiles;
+ }
+
+ /**
+ * @see FileBackendStore::getLocalCopyMulti()
+ * @return Array
+ */
+ abstract protected function doGetLocalCopyMulti( array $params );
+
+ /**
+ * @see FileBackend::getFileHttpUrl()
+ * @return string|null
+ */
+ public function getFileHttpUrl( array $params ) {
+ return null; // not supported
}
/**
@@ -776,6 +904,14 @@ abstract class FileBackendStore extends FileBackend {
$status = $this->doStreamFile( $params );
wfProfileOut( __METHOD__ . '-send-' . $this->name );
wfProfileOut( __METHOD__ . '-send' );
+ if ( !$status->isOK() ) {
+ // Per bug 41113, nasty things can happen if bad cache entries get
+ // stuck in cache. It's also possible that this error can come up
+ // with simple race conditions. Clear out the stat cache to be safe.
+ $this->clearCache( array( $params['src'] ) );
+ $this->deleteFileCache( $params['src'] );
+ trigger_error( "Bad stat cache or race condition for file {$params['src']}." );
+ }
} else {
$status->fatal( 'backend-fail-stream', $params['src'] );
}
@@ -815,7 +951,7 @@ abstract class FileBackendStore extends FileBackend {
return $this->doDirectoryExists( $fullCont, $dir, $params );
} else { // directory is on several shards
wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
- list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
$res = false; // response
foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
$exists = $this->doDirectoryExists( "{$fullCont}{$suffix}", $dir, $params );
@@ -833,9 +969,9 @@ abstract class FileBackendStore extends FileBackend {
/**
* @see FileBackendStore::directoryExists()
*
- * @param $container string Resolved container name
- * @param $dir string Resolved path relative to container
- * @param $params Array
+ * @param string $container Resolved container name
+ * @param string $dir Resolved path relative to container
+ * @param array $params
* @return bool|null
*/
abstract protected function doDirectoryExists( $container, $dir, array $params );
@@ -855,7 +991,7 @@ abstract class FileBackendStore extends FileBackend {
} else {
wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
// File listing spans multiple containers/shards
- list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
return new FileBackendStoreShardDirIterator( $this,
$fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
}
@@ -866,9 +1002,9 @@ abstract class FileBackendStore extends FileBackend {
*
* @see FileBackendStore::getDirectoryList()
*
- * @param $container string Resolved container name
- * @param $dir string Resolved path relative to container
- * @param $params Array
+ * @param string $container Resolved container name
+ * @param string $dir Resolved path relative to container
+ * @param array $params
* @return Traversable|Array|null Returns null on failure
*/
abstract public function getDirectoryListInternal( $container, $dir, array $params );
@@ -888,7 +1024,7 @@ abstract class FileBackendStore extends FileBackend {
} else {
wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
// File listing spans multiple containers/shards
- list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+ list( , $shortCont, ) = self::splitStoragePath( $params['dir'] );
return new FileBackendStoreShardFileIterator( $this,
$fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
}
@@ -899,9 +1035,9 @@ abstract class FileBackendStore extends FileBackend {
*
* @see FileBackendStore::getFileList()
*
- * @param $container string Resolved container name
- * @param $dir string Resolved path relative to container
- * @param $params Array
+ * @param string $container Resolved container name
+ * @param string $dir Resolved path relative to container
+ * @param array $params
* @return Traversable|Array|null Returns null on failure
*/
abstract public function getFileListInternal( $container, $dir, array $params );
@@ -913,18 +1049,19 @@ abstract class FileBackendStore extends FileBackend {
* The result must have the same number of items as the input.
* An exception is thrown if an unsupported operation is requested.
*
- * @param $ops Array Same format as doOperations()
+ * @param array $ops Same format as doOperations()
* @return Array List of FileOp objects
* @throws MWException
*/
final public function getOperationsInternal( array $ops ) {
$supportedOps = array(
- 'store' => 'StoreFileOp',
- 'copy' => 'CopyFileOp',
- 'move' => 'MoveFileOp',
- 'delete' => 'DeleteFileOp',
- 'create' => 'CreateFileOp',
- 'null' => 'NullFileOp'
+ 'store' => 'StoreFileOp',
+ 'copy' => 'CopyFileOp',
+ 'move' => 'MoveFileOp',
+ 'delete' => 'DeleteFileOp',
+ 'create' => 'CreateFileOp',
+ 'describe' => 'DescribeFileOp',
+ 'null' => 'NullFileOp'
);
$performOps = array(); // array of FileOp objects
@@ -949,8 +1086,9 @@ abstract class FileBackendStore extends FileBackend {
* Get a list of storage paths to lock for a list of operations
* Returns an array with 'sh' (shared) and 'ex' (exclusive) keys,
* each corresponding to a list of storage paths to be locked.
+ * All returned paths are normalized.
*
- * @param $performOps Array List of FileOp objects
+ * @param array $performOps List of FileOp objects
* @return Array ('sh' => list of paths, 'ex' => list of paths)
*/
final public function getPathsToLockForOpsInternal( array $performOps ) {
@@ -989,6 +1127,9 @@ abstract class FileBackendStore extends FileBackend {
wfProfileIn( __METHOD__ . '-' . $this->name );
$status = Status::newGood();
+ // Fix up custom header name/value pairs...
+ $ops = array_map( array( $this, 'stripInvalidHeadersFromOp' ), $ops );
+
// Build up a list of FileOps...
$performOps = $this->getOperationsInternal( $ops );
@@ -1016,6 +1157,7 @@ abstract class FileBackendStore extends FileBackend {
$this->primeContainerCache( $performOps );
// Actually attempt the operation batch...
+ $opts = $this->setConcurrencyFlags( $opts );
$subStatus = FileOpBatch::attempt( $performOps, $opts, $this->fileJournal );
// Merge errors into status fields
@@ -1037,6 +1179,12 @@ abstract class FileBackendStore extends FileBackend {
wfProfileIn( __METHOD__ . '-' . $this->name );
$status = Status::newGood();
+ // Fix up custom header name/value pairs...
+ $ops = array_map( array( $this, 'stripInvalidHeadersFromOp' ), $ops );
+
+ // Clear any file cache entries
+ $this->clearCache();
+
$supportedOps = array( 'create', 'store', 'copy', 'move', 'delete', 'null' );
$async = ( $this->parallelize === 'implicit' );
$maxConcurrency = $this->concurrency; // throttle
@@ -1092,7 +1240,7 @@ abstract class FileBackendStore extends FileBackend {
* The resulting Status object fields will correspond
* to the order in which the handles where given.
*
- * @param $handles Array List of FileBackendStoreOpHandle objects
+ * @param array $handles List of FileBackendStoreOpHandle objects
* @return Array Map of Status objects
* @throws MWException
*/
@@ -1117,6 +1265,8 @@ abstract class FileBackendStore extends FileBackend {
/**
* @see FileBackendStore::executeOpHandlesInternal()
+ * @param array $fileOpHandles
+ * @throws MWException
* @return Array List of corresponding Status objects
*/
protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
@@ -1127,12 +1277,32 @@ abstract class FileBackendStore extends FileBackend {
}
/**
+ * Strip long HTTP headers from a file operation
+ *
+ * @param array $op Same format as doOperation()
+ * @return Array
+ */
+ protected function stripInvalidHeadersFromOp( array $op ) {
+ if ( isset( $op['headers'] ) ) {
+ foreach ( $op['headers'] as $name => $value ) {
+ if ( strlen( $name ) > 255 || strlen( $value ) > 255 ) {
+ trigger_error( "Header '$name: $value' is too long." );
+ unset( $op['headers'][$name] );
+ } elseif ( !strlen( $value ) ) {
+ $op['headers'][$name] = ''; // null/false => ""
+ }
+ }
+ }
+ return $op;
+ }
+
+ /**
* @see FileBackend::preloadCache()
*/
final public function preloadCache( array $paths ) {
$fullConts = array(); // full container names
foreach ( $paths as $path ) {
- list( $fullCont, $r, $s ) = $this->resolveStoragePath( $path );
+ list( $fullCont, , ) = $this->resolveStoragePath( $path );
$fullConts[] = $fullCont;
}
// Load from the persistent file and container caches
@@ -1165,7 +1335,7 @@ abstract class FileBackendStore extends FileBackend {
*
* @see FileBackend::clearCache()
*
- * @param $paths Array Storage paths (optional)
+ * @param array $paths Storage paths (optional)
* @return void
*/
protected function doClearCache( array $paths = null ) {}
@@ -1254,8 +1424,8 @@ abstract class FileBackendStore extends FileBackend {
* Get the container name shard suffix for a given path.
* Any empty suffix means the container is not sharded.
*
- * @param $container string Container name
- * @param $relPath string Storage path relative to the container
+ * @param string $container Container name
+ * @param string $relPath Storage path relative to the container
* @return string|null Returns null if shard could not be determined
*/
final protected function getContainerShard( $container, $relPath ) {
@@ -1291,11 +1461,11 @@ abstract class FileBackendStore extends FileBackend {
* Container dirs like "a", where the container shards on "x/xy",
* can reside on several shards. Such paths are tricky to handle.
*
- * @param $storagePath string Storage path
+ * @param string $storagePath Storage path
* @return bool
*/
final public function isSingleShardPathInternal( $storagePath ) {
- list( $c, $r, $shard ) = $this->resolveStoragePath( $storagePath );
+ list( , , $shard ) = $this->resolveStoragePath( $storagePath );
return ( $shard !== null );
}
@@ -1371,8 +1541,8 @@ abstract class FileBackendStore extends FileBackend {
* getting absolute paths (e.g. FS based backends). Note that the relative path
* may be the empty string (e.g. the path is simply to the container).
*
- * @param $container string Container name
- * @param $relStoragePath string Storage path relative to the container
+ * @param string $container Container name
+ * @param string $relStoragePath Storage path relative to the container
* @return string|null Path or null if not valid
*/
protected function resolveContainerPath( $container, $relStoragePath ) {
@@ -1382,7 +1552,7 @@ abstract class FileBackendStore extends FileBackend {
/**
* Get the cache key for a container
*
- * @param $container string Resolved container name
+ * @param string $container Resolved container name
* @return string
*/
private function containerCacheKey( $container ) {
@@ -1392,7 +1562,7 @@ abstract class FileBackendStore extends FileBackend {
/**
* Set the cached info for a container
*
- * @param $container string Resolved container name
+ * @param string $container Resolved container name
* @param $val mixed Information to cache
*/
final protected function setContainerCache( $container, $val ) {
@@ -1403,7 +1573,7 @@ abstract class FileBackendStore extends FileBackend {
* Delete the cached info for a container.
* The cache key is salted for a while to prevent race conditions.
*
- * @param $container string Resolved container name
+ * @param string $container Resolved container name
*/
final protected function deleteContainerCache( $container ) {
if ( !$this->memCache->set( $this->containerCacheKey( $container ), 'PURGED', 300 ) ) {
@@ -1414,6 +1584,7 @@ abstract class FileBackendStore extends FileBackend {
/**
* Do a batch lookup from cache for container stats for all containers
* used in a list of container names, storage paths, or FileOp objects.
+ * This loads the persistent cache values into the process cache.
*
* @param $items Array
* @return void
@@ -1437,7 +1608,7 @@ abstract class FileBackendStore extends FileBackend {
}
// Get all the corresponding cache keys for paths...
foreach ( $paths as $path ) {
- list( $fullCont, $r, $s ) = $this->resolveStoragePath( $path );
+ list( $fullCont, , ) = $this->resolveStoragePath( $path );
if ( $fullCont !== null ) { // valid path for this backend
$contNames[$this->containerCacheKey( $fullCont )] = $fullCont;
}
@@ -1462,7 +1633,7 @@ abstract class FileBackendStore extends FileBackend {
* resolved container names and their corresponding cached info.
* Only containers that actually exist should appear in the map.
*
- * @param $containerInfo Array Map of resolved container names to cached info
+ * @param array $containerInfo Map of resolved container names to cached info
* @return void
*/
protected function doPrimeContainerCache( array $containerInfo ) {}
@@ -1470,7 +1641,7 @@ abstract class FileBackendStore extends FileBackend {
/**
* Get the cache key for a file path
*
- * @param $path string Storage path
+ * @param string $path Normalized storage path
* @return string
*/
private function fileCacheKey( $path ) {
@@ -1482,20 +1653,30 @@ abstract class FileBackendStore extends FileBackend {
* Negatives (404s) are not cached. By not caching negatives, we can skip cache
* salting for the case when a file is created at a path were there was none before.
*
- * @param $path string Storage path
+ * @param string $path Storage path
* @param $val mixed Information to cache
*/
final protected function setFileCache( $path, $val ) {
+ $path = FileBackend::normalizeStoragePath( $path );
+ if ( $path === null ) {
+ return; // invalid storage path
+ }
$this->memCache->add( $this->fileCacheKey( $path ), $val, 7*86400 );
}
/**
* Delete the cached stat info for a file path.
* The cache key is salted for a while to prevent race conditions.
+ * Since negatives (404s) are not cached, this does not need to be called when
+ * a file is created at a path were there was none before.
*
- * @param $path string Storage path
+ * @param string $path Storage path
*/
final protected function deleteFileCache( $path ) {
+ $path = FileBackend::normalizeStoragePath( $path );
+ if ( $path === null ) {
+ return; // invalid storage path
+ }
if ( !$this->memCache->set( $this->fileCacheKey( $path ), 'PURGED', 300 ) ) {
trigger_error( "Unable to delete stat cache for file $path." );
}
@@ -1504,8 +1685,9 @@ abstract class FileBackendStore extends FileBackend {
/**
* Do a batch lookup from cache for file stats for all paths
* used in a list of storage paths or FileOp objects.
+ * This loads the persistent cache values into the process cache.
*
- * @param $items Array List of storage paths or FileOps
+ * @param array $items List of storage paths or FileOps
* @return void
*/
final protected function primeFileCache( array $items ) {
@@ -1520,12 +1702,14 @@ abstract class FileBackendStore extends FileBackend {
$paths = array_merge( $paths, $item->storagePathsRead() );
$paths = array_merge( $paths, $item->storagePathsChanged() );
} elseif ( self::isStoragePath( $item ) ) {
- $paths[] = $item;
+ $paths[] = FileBackend::normalizeStoragePath( $item );
}
}
+ // Get rid of any paths that failed normalization...
+ $paths = array_filter( $paths, 'strlen' ); // remove nulls
// Get all the corresponding cache keys for paths...
foreach ( $paths as $path ) {
- list( $cont, $rel, $s ) = $this->resolveStoragePath( $path );
+ list( , $rel, ) = $this->resolveStoragePath( $path );
if ( $rel !== null ) { // valid path for this backend
$pathNames[$this->fileCacheKey( $path )] = $path;
}
@@ -1546,6 +1730,26 @@ abstract class FileBackendStore extends FileBackend {
wfProfileOut( __METHOD__ . '-' . $this->name );
wfProfileOut( __METHOD__ );
}
+
+ /**
+ * Set the 'concurrency' option from a list of operation options
+ *
+ * @param array $opts Map of operation options
+ * @return Array
+ */
+ final protected function setConcurrencyFlags( array $opts ) {
+ $opts['concurrency'] = 1; // off
+ if ( $this->parallelize === 'implicit' ) {
+ if ( !isset( $opts['parallelize'] ) || $opts['parallelize'] ) {
+ $opts['concurrency'] = $this->concurrency;
+ }
+ } elseif ( $this->parallelize === 'explicit' ) {
+ if ( !empty( $opts['parallelize'] ) ) {
+ $opts['concurrency'] = $this->concurrency;
+ }
+ }
+ return $opts;
+ }
}
/**
@@ -1602,10 +1806,10 @@ abstract class FileBackendStoreShardListIterator implements Iterator {
/**
* @param $backend FileBackendStore
- * @param $container string Full storage container name
- * @param $dir string Storage directory relative to container
- * @param $suffixes Array List of container shard suffixes
- * @param $params Array
+ * @param string $container Full storage container name
+ * @param string $dir Storage directory relative to container
+ * @param array $suffixes List of container shard suffixes
+ * @param array $params
*/
public function __construct(
FileBackendStore $backend, $container, $dir, array $suffixes, array $params
@@ -1731,9 +1935,9 @@ abstract class FileBackendStoreShardListIterator implements Iterator {
/**
* Get the list for a given container shard
*
- * @param $container string Resolved container name
- * @param $dir string Resolved path relative to container
- * @param $params Array
+ * @param string $container Resolved container name
+ * @param string $dir Resolved path relative to container
+ * @param array $params
* @return Traversable|Array|null
*/
abstract protected function listFromShard( $container, $dir, array $params );
diff --git a/includes/filebackend/FileOp.php b/includes/filebackend/FileOp.php
index 7c43c489..bb0ab578 100644
--- a/includes/filebackend/FileOp.php
+++ b/includes/filebackend/FileOp.php
@@ -42,11 +42,12 @@ abstract class FileOp {
protected $state = self::STATE_NEW; // integer
protected $failed = false; // boolean
protected $async = false; // boolean
- protected $useLatest = true; // boolean
protected $batchId; // string
+ protected $doOperation = true; // boolean; operation is not a no-op
protected $sourceSha1; // string
protected $destSameAsSource; // boolean
+ protected $destExists; // boolean
/* Object life-cycle */
const STATE_NEW = 1;
@@ -65,37 +66,61 @@ abstract class FileOp {
list( $required, $optional ) = $this->allowedParams();
foreach ( $required as $name ) {
if ( isset( $params[$name] ) ) {
- $this->params[$name] = $params[$name];
+ $this->params[$name] = self::normalizeAnyStoragePaths( $params[$name] );
} else {
throw new MWException( "File operation missing parameter '$name'." );
}
}
foreach ( $optional as $name ) {
if ( isset( $params[$name] ) ) {
- $this->params[$name] = $params[$name];
+ $this->params[$name] = self::normalizeAnyStoragePaths( $params[$name] );
}
}
$this->params = $params;
}
/**
- * Set the batch UUID this operation belongs to
+ * Normalize $item or anything in $item that is a valid storage path
*
- * @param $batchId string
- * @return void
+ * @param $item string|array
+ * @return string|Array
+ */
+ protected function normalizeAnyStoragePaths( $item ) {
+ if ( is_array( $item ) ) {
+ $res = array();
+ foreach ( $item as $k => $v ) {
+ $k = self::normalizeIfValidStoragePath( $k );
+ $v = self::normalizeIfValidStoragePath( $v );
+ $res[$k] = $v;
+ }
+ return $res;
+ } else {
+ return self::normalizeIfValidStoragePath( $item );
+ }
+ }
+
+ /**
+ * Normalize a string if it is a valid storage path
+ *
+ * @param $path string
+ * @return string
*/
- final public function setBatchId( $batchId ) {
- $this->batchId = $batchId;
+ protected static function normalizeIfValidStoragePath( $path ) {
+ if ( FileBackend::isStoragePath( $path ) ) {
+ $res = FileBackend::normalizeStoragePath( $path );
+ return ( $res !== null ) ? $res : $path;
+ }
+ return $path;
}
/**
- * Whether to allow stale data for file reads and stat checks
+ * Set the batch UUID this operation belongs to
*
- * @param $allowStale bool
+ * @param $batchId string
* @return void
*/
- final public function allowStaleReads( $allowStale ) {
- $this->useLatest = !$allowStale;
+ final public function setBatchId( $batchId ) {
+ $this->batchId = $batchId;
}
/**
@@ -138,11 +163,11 @@ abstract class FileOp {
/**
* Update a dependency tracking array to account for this operation
*
- * @param $deps Array Prior path reads/writes; format of FileOp::newPredicates()
+ * @param array $deps Prior path reads/writes; format of FileOp::newPredicates()
* @return Array
*/
final public function applyDependencies( array $deps ) {
- $deps['read'] += array_fill_keys( $this->storagePathsRead(), 1 );
+ $deps['read'] += array_fill_keys( $this->storagePathsRead(), 1 );
$deps['write'] += array_fill_keys( $this->storagePathsChanged(), 1 );
return $deps;
}
@@ -150,7 +175,7 @@ abstract class FileOp {
/**
* Check if this operation changes files listed in $paths
*
- * @param $paths Array Prior path reads/writes; format of FileOp::newPredicates()
+ * @param array $paths Prior path reads/writes; format of FileOp::newPredicates()
* @return boolean
*/
final public function dependsOn( array $deps ) {
@@ -170,16 +195,19 @@ abstract class FileOp {
/**
* Get the file journal entries for this file operation
*
- * @param $oPredicates Array Pre-op info about files (format of FileOp::newPredicates)
- * @param $nPredicates Array Post-op info about files (format of FileOp::newPredicates)
+ * @param array $oPredicates Pre-op info about files (format of FileOp::newPredicates)
+ * @param array $nPredicates Post-op info about files (format of FileOp::newPredicates)
* @return Array
*/
final public function getJournalEntries( array $oPredicates, array $nPredicates ) {
+ if ( !$this->doOperation ) {
+ return array(); // this is a no-op
+ }
$nullEntries = array();
$updateEntries = array();
$deleteEntries = array();
$pathsUsed = array_merge( $this->storagePathsRead(), $this->storagePathsChanged() );
- foreach ( $pathsUsed as $path ) {
+ foreach ( array_unique( $pathsUsed ) as $path ) {
$nullEntries[] = array( // assertion for recovery
'op' => 'null',
'path' => $path,
@@ -205,7 +233,9 @@ abstract class FileOp {
}
/**
- * Check preconditions of the operation without writing anything
+ * Check preconditions of the operation without writing anything.
+ * This must update $predicates for each path that the op can change
+ * except when a failing status object is returned.
*
* @param $predicates Array
* @return Status
@@ -241,10 +271,14 @@ abstract class FileOp {
return Status::newFatal( 'fileop-fail-attempt-precheck' );
}
$this->state = self::STATE_ATTEMPTED;
- $status = $this->doAttempt();
- if ( !$status->isOK() ) {
- $this->failed = true;
- $this->logFailure( 'attempt' );
+ if ( $this->doOperation ) {
+ $status = $this->doAttempt();
+ if ( !$status->isOK() ) {
+ $this->failed = true;
+ $this->logFailure( 'attempt' );
+ }
+ } else { // no-op
+ $status = Status::newGood();
}
return $status;
}
@@ -292,15 +326,7 @@ abstract class FileOp {
*
* @return Array
*/
- final public function storagePathsRead() {
- return array_map( 'FileBackend::normalizeStoragePath', $this->doStoragePathsRead() );
- }
-
- /**
- * @see FileOp::storagePathsRead()
- * @return Array
- */
- protected function doStoragePathsRead() {
+ public function storagePathsRead() {
return array();
}
@@ -309,21 +335,13 @@ abstract class FileOp {
*
* @return Array
*/
- final public function storagePathsChanged() {
- return array_map( 'FileBackend::normalizeStoragePath', $this->doStoragePathsChanged() );
- }
-
- /**
- * @see FileOp::storagePathsChanged()
- * @return Array
- */
- protected function doStoragePathsChanged() {
+ public function storagePathsChanged() {
return array();
}
/**
* Check for errors with regards to the destination file already existing.
- * This also updates the destSameAsSource and sourceSha1 member variables.
+ * Also set the destExists, destSameAsSource and sourceSha1 member variables.
* A bad status will be returned if there is no chance it can be overwritten.
*
* @param $predicates Array
@@ -337,7 +355,8 @@ abstract class FileOp {
$this->sourceSha1 = $this->fileSha1( $this->params['src'], $predicates );
}
$this->destSameAsSource = false;
- if ( $this->fileExists( $this->params['dst'], $predicates ) ) {
+ $this->destExists = $this->fileExists( $this->params['dst'], $predicates );
+ if ( $this->destExists ) {
if ( $this->getParam( 'overwrite' ) ) {
return $status; // OK
} elseif ( $this->getParam( 'overwriteSame' ) ) {
@@ -373,7 +392,7 @@ abstract class FileOp {
/**
* Check if a file will exist in storage when this operation is attempted
*
- * @param $source string Storage path
+ * @param string $source Storage path
* @param $predicates Array
* @return bool
*/
@@ -381,7 +400,7 @@ abstract class FileOp {
if ( isset( $predicates['exists'][$source] ) ) {
return $predicates['exists'][$source]; // previous op assures this
} else {
- $params = array( 'src' => $source, 'latest' => $this->useLatest );
+ $params = array( 'src' => $source, 'latest' => true );
return $this->backend->fileExists( $params );
}
}
@@ -389,15 +408,17 @@ abstract class FileOp {
/**
* Get the SHA-1 of a file in storage when this operation is attempted
*
- * @param $source string Storage path
+ * @param string $source Storage path
* @param $predicates Array
* @return string|bool False on failure
*/
final protected function fileSha1( $source, array $predicates ) {
if ( isset( $predicates['sha1'][$source] ) ) {
return $predicates['sha1'][$source]; // previous op assures this
+ } elseif ( isset( $predicates['exists'][$source] ) && !$predicates['exists'][$source] ) {
+ return false; // previous op assures this
} else {
- $params = array( 'src' => $source, 'latest' => $this->useLatest );
+ $params = array( 'src' => $source, 'latest' => true );
return $this->backend->getFileSha1Base36( $params );
}
}
@@ -430,42 +451,32 @@ abstract class FileOp {
}
/**
- * Store a file into the backend from a file on the file system.
+ * Create a file in the backend with the given content.
* Parameters for this operation are outlined in FileBackend::doOperations().
*/
-class StoreFileOp extends FileOp {
- /**
- * @return array
- */
+class CreateFileOp extends FileOp {
protected function allowedParams() {
- return array( array( 'src', 'dst' ),
- array( 'overwrite', 'overwriteSame', 'disposition' ) );
+ return array( array( 'content', 'dst' ),
+ array( 'overwrite', 'overwriteSame', 'disposition', 'headers' ) );
}
- /**
- * @param $predicates array
- * @return Status
- */
protected function doPrecheck( array &$predicates ) {
$status = Status::newGood();
- // Check if the source file exists on the file system
- if ( !is_file( $this->params['src'] ) ) {
- $status->fatal( 'backend-fail-notexists', $this->params['src'] );
- return $status;
- // Check if the source file is too big
- } elseif ( filesize( $this->params['src'] ) > $this->backend->maxFileSizeInternal() ) {
+ // Check if the source data is too big
+ if ( strlen( $this->getParam( 'content' ) ) > $this->backend->maxFileSizeInternal() ) {
$status->fatal( 'backend-fail-maxsize',
$this->params['dst'], $this->backend->maxFileSizeInternal() );
- $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
+ $status->fatal( 'backend-fail-create', $this->params['dst'] );
return $status;
- // Check if a file can be placed at the destination
+ // Check if a file can be placed/changed at the destination
} elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
$status->fatal( 'backend-fail-usable', $this->params['dst'] );
- $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
+ $status->fatal( 'backend-fail-create', $this->params['dst'] );
return $status;
}
// Check if destination file exists
$status->merge( $this->precheckDestExistence( $predicates ) );
+ $this->params['dstExists'] = $this->destExists; // see FileBackendStore::setFileCache()
if ( $status->isOK() ) {
// Update file existence predicates
$predicates['exists'][$this->params['dst']] = true;
@@ -478,57 +489,66 @@ class StoreFileOp extends FileOp {
* @return Status
*/
protected function doAttempt() {
- // Store the file at the destination
if ( !$this->destSameAsSource ) {
- return $this->backend->storeInternal( $this->setFlags( $this->params ) );
+ // Create the file at the destination
+ return $this->backend->createInternal( $this->setFlags( $this->params ) );
}
return Status::newGood();
}
/**
- * @return bool|string
+ * @return bool|String
*/
protected function getSourceSha1Base36() {
- wfSuppressWarnings();
- $hash = sha1_file( $this->params['src'] );
- wfRestoreWarnings();
- if ( $hash !== false ) {
- $hash = wfBaseConvert( $hash, 16, 36, 31 );
- }
- return $hash;
+ return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
}
- protected function doStoragePathsChanged() {
+ /**
+ * @return array
+ */
+ public function storagePathsChanged() {
return array( $this->params['dst'] );
}
}
/**
- * Create a file in the backend with the given content.
+ * Store a file into the backend from a file on the file system.
* Parameters for this operation are outlined in FileBackend::doOperations().
*/
-class CreateFileOp extends FileOp {
+class StoreFileOp extends FileOp {
+ /**
+ * @return array
+ */
protected function allowedParams() {
- return array( array( 'content', 'dst' ),
- array( 'overwrite', 'overwriteSame', 'disposition' ) );
+ return array( array( 'src', 'dst' ),
+ array( 'overwrite', 'overwriteSame', 'disposition', 'headers' ) );
}
+ /**
+ * @param $predicates array
+ * @return Status
+ */
protected function doPrecheck( array &$predicates ) {
$status = Status::newGood();
- // Check if the source data is too big
- if ( strlen( $this->getParam( 'content' ) ) > $this->backend->maxFileSizeInternal() ) {
+ // Check if the source file exists on the file system
+ if ( !is_file( $this->params['src'] ) ) {
+ $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+ return $status;
+ // Check if the source file is too big
+ } elseif ( filesize( $this->params['src'] ) > $this->backend->maxFileSizeInternal() ) {
$status->fatal( 'backend-fail-maxsize',
$this->params['dst'], $this->backend->maxFileSizeInternal() );
- $status->fatal( 'backend-fail-create', $this->params['dst'] );
+ $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
return $status;
- // Check if a file can be placed at the destination
+ // Check if a file can be placed/changed at the destination
} elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
$status->fatal( 'backend-fail-usable', $this->params['dst'] );
- $status->fatal( 'backend-fail-create', $this->params['dst'] );
+ $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
return $status;
}
// Check if destination file exists
$status->merge( $this->precheckDestExistence( $predicates ) );
+ $this->params['dstExists'] = $this->destExists; // see FileBackendStore::setFileCache()
if ( $status->isOK() ) {
// Update file existence predicates
$predicates['exists'][$this->params['dst']] = true;
@@ -541,24 +561,27 @@ class CreateFileOp extends FileOp {
* @return Status
*/
protected function doAttempt() {
+ // Store the file at the destination
if ( !$this->destSameAsSource ) {
- // Create the file at the destination
- return $this->backend->createInternal( $this->setFlags( $this->params ) );
+ return $this->backend->storeInternal( $this->setFlags( $this->params ) );
}
return Status::newGood();
}
/**
- * @return bool|String
+ * @return bool|string
*/
protected function getSourceSha1Base36() {
- return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
+ wfSuppressWarnings();
+ $hash = sha1_file( $this->params['src'] );
+ wfRestoreWarnings();
+ if ( $hash !== false ) {
+ $hash = wfBaseConvert( $hash, 16, 36, 31 );
+ }
+ return $hash;
}
- /**
- * @return array
- */
- protected function doStoragePathsChanged() {
+ public function storagePathsChanged() {
return array( $this->params['dst'] );
}
}
@@ -573,7 +596,7 @@ class CopyFileOp extends FileOp {
*/
protected function allowedParams() {
return array( array( 'src', 'dst' ),
- array( 'overwrite', 'overwriteSame', 'disposition' ) );
+ array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'disposition' ) );
}
/**
@@ -584,9 +607,17 @@ class CopyFileOp extends FileOp {
$status = Status::newGood();
// Check if the source file exists
if ( !$this->fileExists( $this->params['src'], $predicates ) ) {
- $status->fatal( 'backend-fail-notexists', $this->params['src'] );
- return $status;
- // Check if a file can be placed at the destination
+ if ( $this->getParam( 'ignoreMissingSource' ) ) {
+ $this->doOperation = false; // no-op
+ // Update file existence predicates (cache 404s)
+ $predicates['exists'][$this->params['src']] = false;
+ $predicates['sha1'][$this->params['src']] = false;
+ return $status; // nothing to do
+ } else {
+ $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+ return $status;
+ }
+ // Check if a file can be placed/changed at the destination
} elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
$status->fatal( 'backend-fail-usable', $this->params['dst'] );
$status->fatal( 'backend-fail-copy', $this->params['src'], $this->params['dst'] );
@@ -594,6 +625,7 @@ class CopyFileOp extends FileOp {
}
// Check if destination file exists
$status->merge( $this->precheckDestExistence( $predicates ) );
+ $this->params['dstExists'] = $this->destExists; // see FileBackendStore::setFileCache()
if ( $status->isOK() ) {
// Update file existence predicates
$predicates['exists'][$this->params['dst']] = true;
@@ -619,14 +651,14 @@ class CopyFileOp extends FileOp {
/**
* @return array
*/
- protected function doStoragePathsRead() {
+ public function storagePathsRead() {
return array( $this->params['src'] );
}
/**
* @return array
*/
- protected function doStoragePathsChanged() {
+ public function storagePathsChanged() {
return array( $this->params['dst'] );
}
}
@@ -641,7 +673,7 @@ class MoveFileOp extends FileOp {
*/
protected function allowedParams() {
return array( array( 'src', 'dst' ),
- array( 'overwrite', 'overwriteSame', 'disposition' ) );
+ array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'disposition' ) );
}
/**
@@ -652,9 +684,17 @@ class MoveFileOp extends FileOp {
$status = Status::newGood();
// Check if the source file exists
if ( !$this->fileExists( $this->params['src'], $predicates ) ) {
- $status->fatal( 'backend-fail-notexists', $this->params['src'] );
- return $status;
- // Check if a file can be placed at the destination
+ if ( $this->getParam( 'ignoreMissingSource' ) ) {
+ $this->doOperation = false; // no-op
+ // Update file existence predicates (cache 404s)
+ $predicates['exists'][$this->params['src']] = false;
+ $predicates['sha1'][$this->params['src']] = false;
+ return $status; // nothing to do
+ } else {
+ $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+ return $status;
+ }
+ // Check if a file can be placed/changed at the destination
} elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
$status->fatal( 'backend-fail-usable', $this->params['dst'] );
$status->fatal( 'backend-fail-move', $this->params['src'], $this->params['dst'] );
@@ -662,6 +702,7 @@ class MoveFileOp extends FileOp {
}
// Check if destination file exists
$status->merge( $this->precheckDestExistence( $predicates ) );
+ $this->params['dstExists'] = $this->destExists; // see FileBackendStore::setFileCache()
if ( $status->isOK() ) {
// Update file existence predicates
$predicates['exists'][$this->params['src']] = false;
@@ -693,14 +734,14 @@ class MoveFileOp extends FileOp {
/**
* @return array
*/
- protected function doStoragePathsRead() {
+ public function storagePathsRead() {
return array( $this->params['src'] );
}
/**
* @return array
*/
- protected function doStoragePathsChanged() {
+ public function storagePathsChanged() {
return array( $this->params['src'], $this->params['dst'] );
}
}
@@ -717,21 +758,29 @@ class DeleteFileOp extends FileOp {
return array( array( 'src' ), array( 'ignoreMissingSource' ) );
}
- protected $needsDelete = true;
-
/**
- * @param array $predicates
+ * @param $predicates array
* @return Status
*/
protected function doPrecheck( array &$predicates ) {
$status = Status::newGood();
// Check if the source file exists
if ( !$this->fileExists( $this->params['src'], $predicates ) ) {
- if ( !$this->getParam( 'ignoreMissingSource' ) ) {
+ if ( $this->getParam( 'ignoreMissingSource' ) ) {
+ $this->doOperation = false; // no-op
+ // Update file existence predicates (cache 404s)
+ $predicates['exists'][$this->params['src']] = false;
+ $predicates['sha1'][$this->params['src']] = false;
+ return $status; // nothing to do
+ } else {
$status->fatal( 'backend-fail-notexists', $this->params['src'] );
return $status;
}
- $this->needsDelete = false;
+ // Check if a file can be placed/changed at the source
+ } elseif ( !$this->backend->isPathUsableInternal( $this->params['src'] ) ) {
+ $status->fatal( 'backend-fail-usable', $this->params['src'] );
+ $status->fatal( 'backend-fail-delete', $this->params['src'] );
+ return $status;
}
// Update file existence predicates
$predicates['exists'][$this->params['src']] = false;
@@ -743,17 +792,66 @@ class DeleteFileOp extends FileOp {
* @return Status
*/
protected function doAttempt() {
- if ( $this->needsDelete ) {
- // Delete the source file
- return $this->backend->deleteInternal( $this->setFlags( $this->params ) );
+ // Delete the source file
+ return $this->backend->deleteInternal( $this->setFlags( $this->params ) );
+ }
+
+ /**
+ * @return array
+ */
+ public function storagePathsChanged() {
+ return array( $this->params['src'] );
+ }
+}
+
+/**
+ * Change metadata for a file at the given storage path in the backend.
+ * Parameters for this operation are outlined in FileBackend::doOperations().
+ */
+class DescribeFileOp extends FileOp {
+ /**
+ * @return array
+ */
+ protected function allowedParams() {
+ return array( array( 'src' ), array( 'disposition', 'headers' ) );
+ }
+
+ /**
+ * @param $predicates array
+ * @return Status
+ */
+ protected function doPrecheck( array &$predicates ) {
+ $status = Status::newGood();
+ // Check if the source file exists
+ if ( !$this->fileExists( $this->params['src'], $predicates ) ) {
+ $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+ return $status;
+ // Check if a file can be placed/changed at the source
+ } elseif ( !$this->backend->isPathUsableInternal( $this->params['src'] ) ) {
+ $status->fatal( 'backend-fail-usable', $this->params['src'] );
+ $status->fatal( 'backend-fail-describe', $this->params['src'] );
+ return $status;
}
- return Status::newGood();
+ // Update file existence predicates
+ $predicates['exists'][$this->params['src']] =
+ $this->fileExists( $this->params['src'], $predicates );
+ $predicates['sha1'][$this->params['src']] =
+ $this->fileSha1( $this->params['src'], $predicates );
+ return $status; // safe to call attempt()
+ }
+
+ /**
+ * @return Status
+ */
+ protected function doAttempt() {
+ // Update the source file's metadata
+ return $this->backend->describeInternal( $this->setFlags( $this->params ) );
}
/**
* @return array
*/
- protected function doStoragePathsChanged() {
+ public function storagePathsChanged() {
return array( $this->params['src'] );
}
}
diff --git a/includes/filebackend/FileOpBatch.php b/includes/filebackend/FileOpBatch.php
index 33558725..fc51d78a 100644
--- a/includes/filebackend/FileOpBatch.php
+++ b/includes/filebackend/FileOpBatch.php
@@ -42,9 +42,6 @@ class FileOpBatch {
* $opts is an array of options, including:
* - force : Errors that would normally cause a rollback do not.
* The remaining operations are still attempted if any fail.
- * - allowStale : Don't require the latest available data.
- * This can increase performance for non-critical writes.
- * This has no effect unless the 'force' flag is set.
* - nonJournaled : Don't log this operation batch in the file journal.
* - concurrency : Try to do this many operations in parallel when possible.
*
@@ -52,8 +49,8 @@ class FileOpBatch {
* - a) unexpected operation errors occurred (network partitions, disk full...)
* - b) significant operation errors occurred and 'force' was not set
*
- * @param $performOps Array List of FileOp operations
- * @param $opts Array Batch operation options
+ * @param array $performOps List of FileOp operations
+ * @param array $opts Batch operation options
* @param $journal FileJournal Journal to log operations to
* @return Status
*/
@@ -69,7 +66,6 @@ class FileOpBatch {
}
$batchId = $journal->getTimestampedUUID();
- $allowStale = !empty( $opts['allowStale'] );
$ignoreErrors = !empty( $opts['force'] );
$journaled = empty( $opts['nonJournaled'] );
$maxConcurrency = isset( $opts['concurrency'] ) ? $opts['concurrency'] : 1;
@@ -84,7 +80,6 @@ class FileOpBatch {
foreach ( $performOps as $index => $fileOp ) {
$backendName = $fileOp->getBackend()->getName();
$fileOp->setBatchId( $batchId ); // transaction ID
- $fileOp->allowStaleReads( $allowStale ); // consistency level
// Decide if this op can be done concurrently within this sub-batch
// or if a new concurrent sub-batch must be started after this one...
if ( $fileOp->dependsOn( $curBatchDeps )
@@ -136,49 +131,13 @@ class FileOpBatch {
}
// Attempt each operation (in parallel if allowed and possible)...
- if ( count( $pPerformOps ) < count( $performOps ) ) {
- self::runBatchParallel( $pPerformOps, $status );
- } else {
- self::runBatchSeries( $performOps, $status );
- }
+ self::runParallelBatches( $pPerformOps, $status );
wfProfileOut( __METHOD__ );
return $status;
}
/**
- * Attempt a list of file operations in series.
- * This will abort remaining ops on failure.
- *
- * @param $performOps Array
- * @param $status Status
- * @return bool Success
- */
- protected static function runBatchSeries( array $performOps, Status $status ) {
- foreach ( $performOps as $index => $fileOp ) {
- if ( $fileOp->failed() ) {
- continue; // nothing to do
- }
- $subStatus = $fileOp->attempt();
- $status->merge( $subStatus );
- if ( $subStatus->isOK() ) {
- $status->success[$index] = true;
- ++$status->successCount;
- } else {
- $status->success[$index] = false;
- ++$status->failCount;
- // We can't continue (even with $ignoreErrors) as $predicates is wrong.
- // Log the remaining ops as failed for recovery...
- for ( $i = ($index + 1); $i < count( $performOps ); $i++ ) {
- $performOps[$i]->logFailure( 'attempt_aborted' );
- }
- return false; // bail out
- }
- }
- return true;
- }
-
- /**
* Attempt a list of file operations sub-batches in series.
*
* The operations *in* each sub-batch will be done in parallel.
@@ -190,8 +149,8 @@ class FileOpBatch {
* @param $status Status
* @return bool Success
*/
- protected static function runBatchParallel( array $pPerformOps, Status $status ) {
- $aborted = false;
+ protected static function runParallelBatches( array $pPerformOps, Status $status ) {
+ $aborted = false; // set to true on unexpected errors
foreach ( $pPerformOps as $performOpsBatch ) {
if ( $aborted ) { // check batch op abort flag...
// We can't continue (even with $ignoreErrors) as $predicates is wrong.
@@ -205,11 +164,16 @@ class FileOpBatch {
$opHandles = array();
// Get the backend; all sub-batch ops belong to a single backend
$backend = reset( $performOpsBatch )->getBackend();
- // If attemptAsync() returns synchronously, it was either an
- // error Status or the backend just doesn't support async ops.
+ // Get the operation handles or actually do it if there is just one.
+ // If attemptAsync() returns a Status, it was either due to an error
+ // or the backend does not support async ops and did it synchronously.
foreach ( $performOpsBatch as $i => $fileOp ) {
if ( !$fileOp->failed() ) { // failed => already has Status
- $subStatus = $fileOp->attemptAsync();
+ // If the batch is just one operation, it's faster to avoid
+ // pipelining as that can involve creating new TCP connections.
+ $subStatus = ( count( $performOpsBatch ) > 1 )
+ ? $fileOp->attemptAsync()
+ : $fileOp->attempt();
if ( $subStatus->value instanceof FileBackendStoreOpHandle ) {
$opHandles[$i] = $subStatus->value; // deferred
} else {
diff --git a/includes/filebackend/README b/includes/filebackend/README
new file mode 100644
index 00000000..6ab54810
--- /dev/null
+++ b/includes/filebackend/README
@@ -0,0 +1,208 @@
+/*!
+\ingroup FileBackend
+\page file_backend_design File backend design
+
+Some notes on the FileBackend architecture.
+
+\section intro Introduction
+
+To abstract away the differences among different types of storage media,
+MediaWiki is providing an interface known as FileBackend. Any MediaWiki
+interaction with stored files should thus use a FileBackend object.
+
+Different types of backing storage media are supported (ranging from local
+file system to distributed object stores). The types include:
+
+* FSFileBackend (used for mounted file systems)
+* SwiftFileBackend (used for Swift or Ceph Rados+RGW object stores)
+* FileBackendMultiWrite (useful for transitioning from one backend to another)
+
+Configuration documentation for each type of backend is to be found in their
+__construct() inline documentation.
+
+
+\section setup Setup
+
+File backends are registered in LocalSettings.php via the global variable
+$wgFileBackends. To access one of those defined backends, one would use
+FileBackendStore::get( <name> ) which will bring back a FileBackend object
+handle. Such handles are reused for any subsequent get() call (via singleton).
+The FileBackends objects are caching request calls such as file stats,
+SHA1 requests or TCP connection handles.
+
+\par Note:
+Some backends may require additional PHP extensions to be enabled or can rely on a
+MediaWiki extension. This is often the case when a FileBackend subclass makes use of an
+upstream client API for communicating with the backing store.
+
+
+\section fileoperations File operations
+
+The MediaWiki FileBackend API supports various operations on either files or
+directories. See FileBackend.php for full documentation for each function.
+
+
+\subsection reading Reading
+
+The following basic operations are supported for reading from a backend:
+
+On files:
+* state a file for basic information (timestamp, size)
+* read a file into a string or several files into a map of path names to strings
+* download a file or set of files to a temporary file (on a mounted file system)
+* get the SHA1 hash of a file
+* get various properties of a file (stat information, content time, mime information, ...)
+
+On directories:
+* get a list of files directly under a directory
+* get a recursive list of files under a directory
+* get a list of directories directly under a directory
+* get a recursive list of directories under a directory
+
+\par Note:
+Backend handles should return directory listings as iterators, all though in some cases
+they may just be simple arrays (which can still be iterated over). Iterators allow for
+callers to traverse a large number of file listings without consuming excessive RAM in
+the process. Either the memory consumed is flatly bounded (if the iterator does paging)
+or it is proportional to the depth of the portion of the directory tree being traversed
+(if the iterator works via recursion).
+
+
+\subsection writing Writing
+
+The following basic operations are supported for writing or changing in the backend:
+
+On files:
+* store (copying a mounted file system file into storage)
+* create (creating a file within storage from a string)
+* copy (within storage)
+* move (within storage)
+* delete (within storage)
+* lock/unlock (lock or unlock a file in storage)
+
+The following operations are supported for writing directories in the backend:
+* prepare (create parent container and directories for a path)
+* secure (try to lock-down access to a container)
+* publish (try to reverse the effects of secure)
+* clean (remove empty containers or directories)
+
+
+\subsection invokingoperation Invoking an operation
+
+Generally, callers should use doOperations() or doQuickOperations() when doing
+batches of changes, rather than making a suite of single operation calls. This
+makes the system tolerate high latency much better by pipelining operations
+when possible.
+
+doOperations() should be used for working on important original data, i.e. when
+consistency is important. The former will only pipeline operations that do not
+depend on each other. It is best if the operations that do not depend on each
+other occur in consecutive groups. This function can also log file changes to
+a journal (see FileJournal), which can be used to sync two backend instances.
+One might use this function for user uploads of file for example.
+
+doQuickOperations() is more geared toward ephemeral items that can be easily
+regenerated from original data. It will always pipeline without checking for
+dependencies within the operation batch. One might use this function for
+creating and purging generated thumbnails of original files for example.
+
+
+\section consistency Consistency
+
+Not all backing stores are sequentially consistent by default. Various FileBackend
+functions offer a "latest" option that can be passed in to assure (or try to assure)
+that the latest version of the file is read. Some backing stores are consistent by
+default, but callers should always assume that without this option, stale data may
+be read. This is actually true for stores that have eventual consistency.
+
+Note that file listing functions have no "latest" flag, and thus some systems may
+return stale data. Thus callers should avoid assuming that listings contain changes
+made my the current client or any other client from a very short time ago. For example,
+creating a file under a directory and then immediately doing a file listing operation
+on that directory may result in a listing that does not include that file.
+
+
+\section locking Locking
+
+Locking is effective if and only if a proper lock manager is registered and is
+actually being used by the backend. Lock managers can be registered in LocalSettings.php
+using the $wgLockManagers global configuration variable.
+
+For object stores, locking is not generally useful for avoiding partially
+written or read objects, since most stores use Multi Version Concurrency
+Control (MVCC) to avoid this. However, locking can be important when:
+* One or more operations must be done without objects changing in the meantime.
+* It can also be useful when a file read is used to determine a file write or DB change.
+ For example, doOperations() first checks that there will be no "file already exists"
+ or "file does not exist" type errors before attempting an operation batch. This works
+ by stating the files first, and is only safe if the files are locked in the meantime.
+
+When locking, callers should use the latest available file data for reads.
+Also, one should always lock the file *before* reading it, not after. If stale data is
+used to determine a write, there will be some data corruption, even when reads of the
+original file finally start returning the updated data without needing the "latest"
+option (eventual consistency). The "scoped" lock functions are preferable since
+there is not the problem of forgetting to unlock due to early returns or exceptions.
+
+Since acquiring locks can fail, and lock managers can be non-blocking, callers should:
+* Acquire all required locks up font
+* Be prepared for the case where locks fail to be acquired
+* Possible retry acquiring certain locks
+
+MVCC is also a useful pattern to use on top of the backend interface, because operations
+are not atomic, even with doOperations(), so doing complex batch file changes or changing
+files and updating a database row can result in partially written "transactions". Thus one
+should avoid changing files once they have been stored, except perhaps with ephemeral data
+that are tolerant of some degree of inconsistency.
+
+Callers can use their own locking (e.g. SELECT FOR UPDATE) if it is more convenient, but
+note that all callers that change any of the files should then go through functions that
+acquire these locks. For example, if a caller just directly uses the file backend store()
+function, it will ignore any custom "FOR UPDATE" locks, which can cause problems.
+
+\section objectstore Object stores
+
+Support for object stores (like Amazon S3/Swift) drive much of the API and design
+decisions of FileBackend, but using any POSIX compliant file systems works fine.
+The system essentially stores "files" in "containers". For a mounted file system
+as a backing store, "files" will just be files under directories. For an object store
+as a backing store, the "files" will be objects stored in actual containers.
+
+
+\section file_obj_diffs File system and Object store differences
+
+An advantage of object stores is the reduced Round-Trip Times. This is
+achieved by avoiding the need to create each parent directory before placing a
+file somewhere. It gets worse the deeper the directory hierarchy is. Another
+advantage of object stores is that object listings tend to use databases, which
+scale better than the linked list directories that file sytems sometimes use.
+File systems like btrfs and xfs use tree structures, which scale better.
+For both object stores and file systems, using "/" in filenames will allow for the
+intuitive use of directory functions. For example, creating a file in Swift
+called "container/a/b/file1" will mean that:
+- a "directory listing" of "container/a" will contain "b",
+- and a "file listing" of "b" will contain "file1"
+
+This means that switching from an object store to a file system and vise versa
+using the FileBackend interface will generally be harmless. However, one must be
+aware of some important differences:
+
+* In a file system, you cannot have a file and a directory within the same path
+ whereas it is possible in an object stores. Calling code should avoid any layouts
+ which allow files and directories at the same path.
+* Some file systems have file name length restrictions or overall path length
+ restrictions that others do not. The same goes with object stores which might
+ have a maximum object length or a limitation regarding the number of files
+ under a container or volume.
+* Latency varies among systems, certain access patterns may not be tolerable for
+ certain backends but may hold up for others. Some backend subclasses use
+ MediaWiki's object caching for serving stat requests, which can greatly
+ reduce latency. Making sure that the backend has pipelining (see the
+ "parallelize" and "concurrency" settings) enabled can also mask latency in
+ batch operation scenarios.
+* File systems may implement directories as linked-lists or other structures
+ with poor scalability, so calling code should use layouts that shard the data.
+ Instead of storing files like "container/file.txt", one can store files like
+ "container/<x>/<y>/file.txt". It is best if "sharding" optional or configurable.
+
+*/
diff --git a/includes/filebackend/SwiftFileBackend.php b/includes/filebackend/SwiftFileBackend.php
index b6f0aa60..0f3d97a3 100644
--- a/includes/filebackend/SwiftFileBackend.php
+++ b/includes/filebackend/SwiftFileBackend.php
@@ -40,11 +40,16 @@ class SwiftFileBackend extends FileBackendStore {
/** @var CF_Authentication */
protected $auth; // Swift authentication handler
protected $authTTL; // integer seconds
+ protected $swiftTempUrlKey; // string; shared secret value for making temp urls
protected $swiftAnonUser; // string; username to handle unauthenticated requests
protected $swiftUseCDN; // boolean; whether CloudFiles CDN is enabled
protected $swiftCDNExpiry; // integer; how long to cache things in the CDN
protected $swiftCDNPurgable; // boolean; whether object CDN purging is enabled
+ // Rados Gateway specific options
+ protected $rgwS3AccessKey; // string; S3 access key
+ protected $rgwS3SecretKey; // string; S3 authentication key
+
/** @var CF_Connection */
protected $conn; // Swift connection handle
protected $sessionStarted = 0; // integer UNIX timestamp
@@ -66,6 +71,8 @@ class SwiftFileBackend extends FileBackendStore {
* - swiftUser : Swift user used by MediaWiki (account:username)
* - swiftKey : Swift authentication key for the above user
* - swiftAuthTTL : Swift authentication TTL (seconds)
+ * - swiftTempUrlKey : Swift "X-Account-Meta-Temp-URL-Key" value on the account.
+ * Do not set this until it has been set in the backend.
* - swiftAnonUser : Swift user used for end-user requests (account:username).
* If set, then views of public containers are assumed to go
* through this user. If not set, then public containers are
@@ -84,6 +91,16 @@ class SwiftFileBackend extends FileBackendStore {
* - cacheAuthInfo : Whether to cache authentication tokens in APC, XCache, ect.
* If those are not available, then the main cache will be used.
* This is probably insecure in shared hosting environments.
+ * - rgwS3AccessKey : Ragos Gateway S3 "access key" value on the account.
+ * Do not set this until it has been set in the backend.
+ * This is used for generating expiring pre-authenticated URLs.
+ * Only use this when using rgw and to work around
+ * http://tracker.newdream.net/issues/3454.
+ * - rgwS3SecretKey : Ragos Gateway S3 "secret key" value on the account.
+ * Do not set this until it has been set in the backend.
+ * This is used for generating expiring pre-authenticated URLs.
+ * Only use this when using rgw and to work around
+ * http://tracker.newdream.net/issues/3454.
*/
public function __construct( array $config ) {
parent::__construct( $config );
@@ -104,6 +121,9 @@ class SwiftFileBackend extends FileBackendStore {
$this->swiftAnonUser = isset( $config['swiftAnonUser'] )
? $config['swiftAnonUser']
: '';
+ $this->swiftTempUrlKey = isset( $config['swiftTempUrlKey'] )
+ ? $config['swiftTempUrlKey']
+ : '';
$this->shardViaHashLevels = isset( $config['shardViaHashLevels'] )
? $config['shardViaHashLevels']
: '';
@@ -116,13 +136,19 @@ class SwiftFileBackend extends FileBackendStore {
$this->swiftCDNPurgable = isset( $config['swiftCDNPurgable'] )
? $config['swiftCDNPurgable']
: true;
+ $this->rgwS3AccessKey = isset( $config['rgwS3AccessKey'] )
+ ? $config['rgwS3AccessKey']
+ : '';
+ $this->rgwS3SecretKey = isset( $config['rgwS3SecretKey'] )
+ ? $config['rgwS3SecretKey']
+ : '';
// Cache container information to mask latency
$this->memCache = wfGetMainCache();
// Process cache for container info
$this->connContainerCache = new ProcessCacheLRU( 300 );
// Cache auth token information to avoid RTTs
if ( !empty( $config['cacheAuthInfo'] ) ) {
- if ( php_sapi_name() === 'cli' ) {
+ if ( PHP_SAPI === 'cli' ) {
$this->srvCache = wfGetMainCache(); // preferrably memcached
} else {
try { // look for APC, XCache, WinCache, ect...
@@ -168,14 +194,14 @@ class SwiftFileBackend extends FileBackendStore {
}
/**
- * @param $disposition string Content-Disposition header value
+ * @param string $disposition Content-Disposition header value
* @return string Truncated Content-Disposition header value to meet Swift limits
*/
protected function truncDisp( $disposition ) {
$res = '';
foreach ( explode( ';', $disposition ) as $part ) {
$part = trim( $part );
- $new = ( $res === '' ) ? $part : "{$res};{$part}";
+ $new = ( $res === '' ) ? $part : "{$res};{$part}";
if ( strlen( $new ) <= 255 ) {
$res = $new;
} else {
@@ -201,12 +227,6 @@ class SwiftFileBackend extends FileBackendStore {
// (a) Check the destination container and object
try {
$dContObj = $this->getContainer( $dstCont );
- if ( empty( $params['overwrite'] ) &&
- $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
- {
- $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
- return $status;
- }
} catch ( NoSuchContainerException $e ) {
$status->fatal( 'backend-fail-create', $params['dst'] );
return $status;
@@ -223,8 +243,7 @@ class SwiftFileBackend extends FileBackendStore {
// Create a fresh CF_Object with no fields preloaded.
// We don't want to preserve headers, metadata, and such.
$obj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
- // Note: metadata keys stored as [Upper case char][[Lower case char]...]
- $obj->metadata = array( 'Sha1base36' => $sha1Hash );
+ $obj->setMetadataValues( array( 'Sha1base36' => $sha1Hash ) );
// Manually set the ETag (https://github.com/rackspace/php-cloudfiles/issues/59).
// The MD5 here will be checked within Swift against its own MD5.
$obj->set_etag( md5( $params['content'] ) );
@@ -237,17 +256,17 @@ class SwiftFileBackend extends FileBackendStore {
if ( isset( $params['disposition'] ) ) {
$obj->headers['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
}
+ // Set any other custom headers if requested
+ if ( isset( $params['headers'] ) ) {
+ $obj->headers += $params['headers'];
+ }
if ( !empty( $params['async'] ) ) { // deferred
$op = $obj->write_async( $params['content'] );
$status->value = new SwiftFileOpHandle( $this, $params, 'Create', $op );
- if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
- $status->value->affectedObjects[] = $obj;
- }
+ $status->value->affectedObjects[] = $obj;
} else { // actually write the object in Swift
$obj->write( $params['content'] );
- if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
- $this->purgeCDNCache( array( $obj ) );
- }
+ $this->purgeCDNCache( array( $obj ) );
}
} catch ( CDNNotEnabledException $e ) {
// CDN not enabled; nothing to see here
@@ -287,12 +306,6 @@ class SwiftFileBackend extends FileBackendStore {
// (a) Check the destination container and object
try {
$dContObj = $this->getContainer( $dstCont );
- if ( empty( $params['overwrite'] ) &&
- $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
- {
- $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
- return $status;
- }
} catch ( NoSuchContainerException $e ) {
$status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
return $status;
@@ -302,7 +315,9 @@ class SwiftFileBackend extends FileBackendStore {
}
// (b) Get a SHA-1 hash of the object
+ wfSuppressWarnings();
$sha1Hash = sha1_file( $params['src'] );
+ wfRestoreWarnings();
if ( $sha1Hash === false ) { // source doesn't exist?
$status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
return $status;
@@ -314,8 +329,7 @@ class SwiftFileBackend extends FileBackendStore {
// Create a fresh CF_Object with no fields preloaded.
// We don't want to preserve headers, metadata, and such.
$obj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
- // Note: metadata keys stored as [Upper case char][[Lower case char]...]
- $obj->metadata = array( 'Sha1base36' => $sha1Hash );
+ $obj->setMetadataValues( array( 'Sha1base36' => $sha1Hash ) );
// The MD5 here will be checked within Swift against its own MD5.
$obj->set_etag( md5_file( $params['src'] ) );
// Use the same content type as StreamFile for security
@@ -327,6 +341,10 @@ class SwiftFileBackend extends FileBackendStore {
if ( isset( $params['disposition'] ) ) {
$obj->headers['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
}
+ // Set any other custom headers if requested
+ if ( isset( $params['headers'] ) ) {
+ $obj->headers += $params['headers'];
+ }
if ( !empty( $params['async'] ) ) { // deferred
wfSuppressWarnings();
$fp = fopen( $params['src'], 'rb' );
@@ -337,15 +355,11 @@ class SwiftFileBackend extends FileBackendStore {
$op = $obj->write_async( $fp, filesize( $params['src'] ), true );
$status->value = new SwiftFileOpHandle( $this, $params, 'Store', $op );
$status->value->resourcesToClose[] = $fp;
- if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
- $status->value->affectedObjects[] = $obj;
- }
+ $status->value->affectedObjects[] = $obj;
}
} else { // actually write the object in Swift
$obj->load_from_filename( $params['src'], true ); // calls $obj->write()
- if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
- $this->purgeCDNCache( array( $obj ) );
- }
+ $this->purgeCDNCache( array( $obj ) );
}
} catch ( CDNNotEnabledException $e ) {
// CDN not enabled; nothing to see here
@@ -396,14 +410,10 @@ class SwiftFileBackend extends FileBackendStore {
try {
$sContObj = $this->getContainer( $srcCont );
$dContObj = $this->getContainer( $dstCont );
- if ( empty( $params['overwrite'] ) &&
- $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
- {
- $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
- return $status;
- }
} catch ( NoSuchContainerException $e ) {
- $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+ if ( empty( $params['ignoreMissingSource'] ) || isset( $sContObj ) ) {
+ $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+ }
return $status;
} catch ( CloudFilesException $e ) { // some other exception?
$this->handleException( $e, $status, __METHOD__, $params );
@@ -420,19 +430,17 @@ class SwiftFileBackend extends FileBackendStore {
if ( !empty( $params['async'] ) ) { // deferred
$op = $sContObj->copy_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
$status->value = new SwiftFileOpHandle( $this, $params, 'Copy', $op );
- if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
- $status->value->affectedObjects[] = $dstObj;
- }
+ $status->value->affectedObjects[] = $dstObj;
} else { // actually write the object in Swift
$sContObj->copy_object_to( $srcRel, $dContObj, $dstRel, null, $hdrs );
- if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
- $this->purgeCDNCache( array( $dstObj ) );
- }
+ $this->purgeCDNCache( array( $dstObj ) );
}
} catch ( CDNNotEnabledException $e ) {
// CDN not enabled; nothing to see here
} catch ( NoSuchObjectException $e ) { // source object does not exist
- $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+ if ( empty( $params['ignoreMissingSource'] ) ) {
+ $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+ }
} catch ( CloudFilesException $e ) { // some other exception?
$this->handleException( $e, $status, __METHOD__, $params );
}
@@ -474,14 +482,10 @@ class SwiftFileBackend extends FileBackendStore {
try {
$sContObj = $this->getContainer( $srcCont );
$dContObj = $this->getContainer( $dstCont );
- if ( empty( $params['overwrite'] ) &&
- $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
- {
- $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
- return $status;
- }
} catch ( NoSuchContainerException $e ) {
- $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+ if ( empty( $params['ignoreMissingSource'] ) || isset( $sContObj ) ) {
+ $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+ }
return $status;
} catch ( CloudFilesException $e ) { // some other exception?
$this->handleException( $e, $status, __METHOD__, $params );
@@ -500,20 +504,18 @@ class SwiftFileBackend extends FileBackendStore {
$op = $sContObj->move_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
$status->value = new SwiftFileOpHandle( $this, $params, 'Move', $op );
$status->value->affectedObjects[] = $srcObj;
- if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
- $status->value->affectedObjects[] = $dstObj;
- }
+ $status->value->affectedObjects[] = $dstObj;
} else { // actually write the object in Swift
$sContObj->move_object_to( $srcRel, $dContObj, $dstRel, null, $hdrs );
$this->purgeCDNCache( array( $srcObj ) );
- if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
- $this->purgeCDNCache( array( $dstObj ) );
- }
+ $this->purgeCDNCache( array( $dstObj ) );
}
} catch ( CDNNotEnabledException $e ) {
// CDN not enabled; nothing to see here
} catch ( NoSuchObjectException $e ) { // source object does not exist
- $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+ if ( empty( $params['ignoreMissingSource'] ) ) {
+ $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+ }
} catch ( CloudFilesException $e ) { // some other exception?
$this->handleException( $e, $status, __METHOD__, $params );
}
@@ -559,7 +561,9 @@ class SwiftFileBackend extends FileBackendStore {
} catch ( CDNNotEnabledException $e ) {
// CDN not enabled; nothing to see here
} catch ( NoSuchContainerException $e ) {
- $status->fatal( 'backend-fail-delete', $params['src'] );
+ if ( empty( $params['ignoreMissingSource'] ) ) {
+ $status->fatal( 'backend-fail-delete', $params['src'] );
+ }
} catch ( NoSuchObjectException $e ) {
if ( empty( $params['ignoreMissingSource'] ) ) {
$status->fatal( 'backend-fail-delete', $params['src'] );
@@ -587,6 +591,47 @@ class SwiftFileBackend extends FileBackendStore {
}
/**
+ * @see FileBackendStore::doDescribeInternal()
+ * @return Status
+ */
+ protected function doDescribeInternal( array $params ) {
+ $status = Status::newGood();
+
+ list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+ if ( $srcRel === null ) {
+ $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+ return $status;
+ }
+
+ $hdrs = isset( $params['headers'] ) ? $params['headers'] : array();
+ // Set the Content-Disposition header if requested
+ if ( isset( $params['disposition'] ) ) {
+ $hdrs['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
+ }
+
+ try {
+ $sContObj = $this->getContainer( $srcCont );
+ // Get the latest version of the current metadata
+ $srcObj = $sContObj->get_object( $srcRel,
+ $this->headersFromParams( array( 'latest' => true ) ) );
+ // Merge in the metadata updates...
+ $srcObj->headers = $hdrs + $srcObj->headers;
+ $srcObj->sync_metadata(); // save to Swift
+ $this->purgeCDNCache( array( $srcObj ) );
+ } catch ( CDNNotEnabledException $e ) {
+ // CDN not enabled; nothing to see here
+ } catch ( NoSuchContainerException $e ) {
+ $status->fatal( 'backend-fail-describe', $params['src'] );
+ } catch ( NoSuchObjectException $e ) {
+ $status->fatal( 'backend-fail-describe', $params['src'] );
+ } catch ( CloudFilesException $e ) { // some other exception?
+ $this->handleException( $e, $status, __METHOD__, $params );
+ }
+
+ return $status;
+ }
+
+ /**
* @see FileBackendStore::doPrepareInternal()
* @return Status
*/
@@ -595,7 +640,7 @@ class SwiftFileBackend extends FileBackendStore {
// (a) Check if container already exists
try {
- $contObj = $this->getContainer( $fullCont );
+ $this->getContainer( $fullCont );
// NoSuchContainerException not thrown: container must exist
return $status; // already exists
} catch ( NoSuchContainerException $e ) {
@@ -761,7 +806,7 @@ class SwiftFileBackend extends FileBackendStore {
// Convert dates like "Tue, 03 Jan 2012 22:01:04 GMT" to TS_MW
'mtime' => wfTimestamp( TS_MW, $srcObj->last_modified ),
'size' => (int)$srcObj->content_length,
- 'sha1' => $srcObj->metadata['Sha1base36']
+ 'sha1' => $srcObj->getMetadataValue( 'Sha1base36' )
);
} catch ( NoSuchContainerException $e ) {
} catch ( NoSuchObjectException $e ) {
@@ -777,60 +822,106 @@ class SwiftFileBackend extends FileBackendStore {
* Fill in any missing object metadata and save it to Swift
*
* @param $obj CF_Object
- * @param $path string Storage path to object
+ * @param string $path Storage path to object
* @return bool Success
* @throws Exception cloudfiles exceptions
*/
protected function addMissingMetadata( CF_Object $obj, $path ) {
- if ( isset( $obj->metadata['Sha1base36'] ) ) {
+ if ( $obj->getMetadataValue( 'Sha1base36' ) !== null ) {
return true; // nothing to do
}
wfProfileIn( __METHOD__ );
+ trigger_error( "$path was not stored with SHA-1 metadata.", E_USER_WARNING );
$status = Status::newGood();
$scopeLockS = $this->getScopedFileLocks( array( $path ), LockManager::LOCK_UW, $status );
if ( $status->isOK() ) {
- # Do not stat the file in getLocalCopy() to avoid infinite loops
- $tmpFile = $this->getLocalCopy( array( 'src' => $path, 'latest' => 1, 'nostat' => 1 ) );
+ $tmpFile = $this->getLocalCopy( array( 'src' => $path, 'latest' => 1 ) );
if ( $tmpFile ) {
$hash = $tmpFile->getSha1Base36();
if ( $hash !== false ) {
- $obj->metadata['Sha1base36'] = $hash;
+ $obj->setMetadataValues( array( 'Sha1base36' => $hash ) );
$obj->sync_metadata(); // save to Swift
wfProfileOut( __METHOD__ );
return true; // success
}
}
}
- $obj->metadata['Sha1base36'] = false;
+ trigger_error( "Unable to set SHA-1 metadata for $path", E_USER_WARNING );
+ $obj->setMetadataValues( array( 'Sha1base36' => false ) );
wfProfileOut( __METHOD__ );
return false; // failed
}
/**
- * @see FileBackend::getFileContents()
- * @return bool|null|string
+ * @see FileBackendStore::doGetFileContentsMulti()
+ * @return Array
*/
- public function getFileContents( array $params ) {
- list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
- if ( $srcRel === null ) {
- return false; // invalid storage path
- }
-
- if ( !$this->fileExists( $params ) ) {
- return null;
- }
+ protected function doGetFileContentsMulti( array $params ) {
+ $contents = array();
+
+ $ep = array_diff_key( $params, array( 'srcs' => 1 ) ); // for error logging
+ // Blindly create tmp files and stream to them, catching any exception if the file does
+ // not exist. Doing stats here is useless and will loop infinitely in addMissingMetadata().
+ foreach ( array_chunk( $params['srcs'], $params['concurrency'] ) as $pathBatch ) {
+ $cfOps = array(); // (path => CF_Async_Op)
+
+ foreach ( $pathBatch as $path ) { // each path in this concurrent batch
+ list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
+ if ( $srcRel === null ) {
+ $contents[$path] = false;
+ continue;
+ }
+ $data = false;
+ try {
+ $sContObj = $this->getContainer( $srcCont );
+ $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
+ // Create a new temporary memory file...
+ $handle = fopen( 'php://temp', 'wb' );
+ if ( $handle ) {
+ $headers = $this->headersFromParams( $params );
+ if ( count( $pathBatch ) > 1 ) {
+ $cfOps[$path] = $obj->stream_async( $handle, $headers );
+ $cfOps[$path]->_file_handle = $handle; // close this later
+ } else {
+ $obj->stream( $handle, $headers );
+ rewind( $handle ); // start from the beginning
+ $data = stream_get_contents( $handle );
+ fclose( $handle );
+ }
+ } else {
+ $data = false;
+ }
+ } catch ( NoSuchContainerException $e ) {
+ $data = false;
+ } catch ( NoSuchObjectException $e ) {
+ $data = false;
+ } catch ( CloudFilesException $e ) { // some other exception?
+ $data = false;
+ $this->handleException( $e, null, __METHOD__, array( 'src' => $path ) + $ep );
+ }
+ $contents[$path] = $data;
+ }
- $data = false;
- try {
- $sContObj = $this->getContainer( $srcCont );
- $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
- $data = $obj->read( $this->headersFromParams( $params ) );
- } catch ( NoSuchContainerException $e ) {
- } catch ( CloudFilesException $e ) { // some other exception?
- $this->handleException( $e, null, __METHOD__, $params );
+ $batch = new CF_Async_Op_Batch( $cfOps );
+ $cfOps = $batch->execute();
+ foreach ( $cfOps as $path => $cfOp ) {
+ try {
+ $cfOp->getLastResponse();
+ rewind( $cfOp->_file_handle ); // start from the beginning
+ $contents[$path] = stream_get_contents( $cfOp->_file_handle );
+ } catch ( NoSuchContainerException $e ) {
+ $contents[$path] = false;
+ } catch ( NoSuchObjectException $e ) {
+ $contents[$path] = false;
+ } catch ( CloudFilesException $e ) { // some other exception?
+ $contents[$path] = false;
+ $this->handleException( $e, null, __METHOD__, array( 'src' => $path ) + $ep );
+ }
+ fclose( $cfOp->_file_handle ); // close open handle
+ }
}
- return $data;
+ return $contents;
}
/**
@@ -871,11 +962,11 @@ class SwiftFileBackend extends FileBackendStore {
/**
* Do not call this function outside of SwiftFileBackendFileList
*
- * @param $fullCont string Resolved container name
- * @param $dir string Resolved storage directory with no trailing slash
- * @param $after string|null Storage path of file to list items after
+ * @param string $fullCont Resolved container name
+ * @param string $dir Resolved storage directory with no trailing slash
+ * @param string|null $after Storage path of file to list items after
* @param $limit integer Max number of items to list
- * @param $params Array Includes flag for 'topOnly'
+ * @param array $params Includes flag for 'topOnly'
* @return Array List of relative paths of dirs directly under $dir
*/
public function getDirListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
@@ -903,7 +994,7 @@ class SwiftFileBackend extends FileBackendStore {
$objects = $container->list_objects( $limit, $after, $prefix );
foreach ( $objects as $object ) { // files
$objectDir = $this->getParentDir( $object ); // directory of object
- if ( $objectDir !== false ) { // file has a parent dir
+ if ( $objectDir !== false && $objectDir !== $dir ) {
// Swift stores paths in UTF-8, using binary sorting.
// See function "create_container_table" in common/db.py.
// If a directory is not "greater" than the last one,
@@ -944,11 +1035,11 @@ class SwiftFileBackend extends FileBackendStore {
/**
* Do not call this function outside of SwiftFileBackendFileList
*
- * @param $fullCont string Resolved container name
- * @param $dir string Resolved storage directory with no trailing slash
- * @param $after string|null Storage path of file to list items after
+ * @param string $fullCont Resolved container name
+ * @param string $dir Resolved storage directory with no trailing slash
+ * @param string|null $after Storage path of file to list items after
* @param $limit integer Max number of items to list
- * @param $params Array Includes flag for 'topOnly'
+ * @param array $params Includes flag for 'topOnly'
* @return Array List of relative paths of files under $dir
*/
public function getFileListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
@@ -1038,44 +1129,125 @@ class SwiftFileBackend extends FileBackendStore {
}
/**
- * @see FileBackendStore::getLocalCopy()
+ * @see FileBackendStore::doGetLocalCopyMulti()
* @return null|TempFSFile
*/
- public function getLocalCopy( array $params ) {
- list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
- if ( $srcRel === null ) {
- return null;
- }
+ protected function doGetLocalCopyMulti( array $params ) {
+ $tmpFiles = array();
+
+ $ep = array_diff_key( $params, array( 'srcs' => 1 ) ); // for error logging
+ // Blindly create tmp files and stream to them, catching any exception if the file does
+ // not exist. Doing a stat here is useless causes infinite loops in addMissingMetadata().
+ foreach ( array_chunk( $params['srcs'], $params['concurrency'] ) as $pathBatch ) {
+ $cfOps = array(); // (path => CF_Async_Op)
+
+ foreach ( $pathBatch as $path ) { // each path in this concurrent batch
+ list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
+ if ( $srcRel === null ) {
+ $tmpFiles[$path] = null;
+ continue;
+ }
+ $tmpFile = null;
+ try {
+ $sContObj = $this->getContainer( $srcCont );
+ $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
+ // Get source file extension
+ $ext = FileBackend::extensionFromPath( $path );
+ // Create a new temporary file...
+ $tmpFile = TempFSFile::factory( 'localcopy_', $ext );
+ if ( $tmpFile ) {
+ $handle = fopen( $tmpFile->getPath(), 'wb' );
+ if ( $handle ) {
+ $headers = $this->headersFromParams( $params );
+ if ( count( $pathBatch ) > 1 ) {
+ $cfOps[$path] = $obj->stream_async( $handle, $headers );
+ $cfOps[$path]->_file_handle = $handle; // close this later
+ } else {
+ $obj->stream( $handle, $headers );
+ fclose( $handle );
+ }
+ } else {
+ $tmpFile = null;
+ }
+ }
+ } catch ( NoSuchContainerException $e ) {
+ $tmpFile = null;
+ } catch ( NoSuchObjectException $e ) {
+ $tmpFile = null;
+ } catch ( CloudFilesException $e ) { // some other exception?
+ $tmpFile = null;
+ $this->handleException( $e, null, __METHOD__, array( 'src' => $path ) + $ep );
+ }
+ $tmpFiles[$path] = $tmpFile;
+ }
- // Blindly create a tmp file and stream to it, catching any exception if the file does
- // not exist. Also, doing a stat here will cause infinite loops when filling metadata.
- $tmpFile = null;
- try {
- $sContObj = $this->getContainer( $srcCont );
- $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
- // Get source file extension
- $ext = FileBackend::extensionFromPath( $srcRel );
- // Create a new temporary file...
- $tmpFile = TempFSFile::factory( 'localcopy_', $ext );
- if ( $tmpFile ) {
- $handle = fopen( $tmpFile->getPath(), 'wb' );
- if ( $handle ) {
- $obj->stream( $handle, $this->headersFromParams( $params ) );
- fclose( $handle );
- } else {
- $tmpFile = null; // couldn't open temp file
+ $batch = new CF_Async_Op_Batch( $cfOps );
+ $cfOps = $batch->execute();
+ foreach ( $cfOps as $path => $cfOp ) {
+ try {
+ $cfOp->getLastResponse();
+ } catch ( NoSuchContainerException $e ) {
+ $tmpFiles[$path] = null;
+ } catch ( NoSuchObjectException $e ) {
+ $tmpFiles[$path] = null;
+ } catch ( CloudFilesException $e ) { // some other exception?
+ $tmpFiles[$path] = null;
+ $this->handleException( $e, null, __METHOD__, array( 'src' => $path ) + $ep );
}
+ fclose( $cfOp->_file_handle ); // close open handle
}
- } catch ( NoSuchContainerException $e ) {
- $tmpFile = null;
- } catch ( NoSuchObjectException $e ) {
- $tmpFile = null;
- } catch ( CloudFilesException $e ) { // some other exception?
- $tmpFile = null;
- $this->handleException( $e, null, __METHOD__, $params );
}
- return $tmpFile;
+ return $tmpFiles;
+ }
+
+ /**
+ * @see FileBackendStore::getFileHttpUrl()
+ * @return string|null
+ */
+ public function getFileHttpUrl( array $params ) {
+ if ( $this->swiftTempUrlKey != '' ||
+ ( $this->rgwS3AccessKey != '' && $this->rgwS3SecretKey != '' ) )
+ {
+ list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+ if ( $srcRel === null ) {
+ return null; // invalid path
+ }
+ try {
+ $ttl = isset( $params['ttl'] ) ? $params['ttl'] : 86400;
+ $sContObj = $this->getContainer( $srcCont );
+ $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
+ if ( $this->swiftTempUrlKey != '' ) {
+ return $obj->get_temp_url( $this->swiftTempUrlKey, $ttl, "GET" );
+ } else { // give S3 API URL for rgw
+ $expires = time() + $ttl;
+ // Path for signature starts with the bucket
+ $spath = '/' . rawurlencode( $srcCont ) . '/' .
+ str_replace( '%2F', '/', rawurlencode( $srcRel ) );
+ // Calculate the hash
+ $signature = base64_encode( hash_hmac(
+ 'sha1',
+ "GET\n\n\n{$expires}\n{$spath}",
+ $this->rgwS3SecretKey,
+ true // raw
+ ) );
+ // See http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html.
+ // Note: adding a newline for empty CanonicalizedAmzHeaders does not work.
+ return wfAppendQuery(
+ str_replace( '/swift/v1', '', // S3 API is the rgw default
+ $sContObj->cfs_http->getStorageUrl() . $spath ),
+ array(
+ 'Signature' => $signature,
+ 'Expires' => $expires,
+ 'AWSAccessKeyId' => $this->rgwS3AccessKey )
+ );
+ }
+ } catch ( NoSuchContainerException $e ) {
+ } catch ( CloudFilesException $e ) { // some other exception?
+ $this->handleException( $e, null, __METHOD__, $params );
+ }
+ }
+ return null;
}
/**
@@ -1091,7 +1263,7 @@ class SwiftFileBackend extends FileBackendStore {
* on a FileBackend params array, e.g. that of getLocalCopy().
* $params is currently only checked for a 'latest' flag.
*
- * @param $params Array
+ * @param array $params
* @return Array
*/
protected function headersFromParams( array $params ) {
@@ -1118,8 +1290,8 @@ class SwiftFileBackend extends FileBackendStore {
$cfOps = $batch->execute();
foreach ( $cfOps as $index => $cfOp ) {
$status = Status::newGood();
+ $function = '_getResponse' . $fileOpHandles[$index]->call;
try { // catch exceptions; update status
- $function = '_getResponse' . $fileOpHandles[$index]->call;
$this->$function( $cfOp, $status, $fileOpHandles[$index]->params );
$this->purgeCDNCache( $fileOpHandles[$index]->affectedObjects );
} catch ( CloudFilesException $e ) { // some other exception?
@@ -1137,12 +1309,12 @@ class SwiftFileBackend extends FileBackendStore {
*
* $readGrps is a list of the possible criteria for a request to have
* access to read a container. Each item is one of the following formats:
- * - account:user : Grants access if the request is by the given user
- * - .r:<regex> : Grants access if the request is from a referrer host that
- * matches the expression and the request is not for a listing.
- * Setting this to '*' effectively makes a container public.
- * - .rlistings:<regex> : Grants access if the request is from a referrer host that
- * matches the expression and the request for a listing.
+ * - account:user : Grants access if the request is by the given user
+ * - ".r:<regex>" : Grants access if the request is from a referrer host that
+ * matches the expression and the request is not for a listing.
+ * Setting this to '*' effectively makes a container public.
+ * -".rlistings:<regex>" : Grants access if the request is from a referrer host that
+ * matches the expression and the request for a listing.
*
* $writeGrps is a list of the possible criteria for a request to have
* access to write to a container. Each item is of the following format:
@@ -1154,8 +1326,8 @@ class SwiftFileBackend extends FileBackendStore {
* (lists are truncated to 10000 item with no way to page), and is just a performance risk.
*
* @param $contObj CF_Container Swift container
- * @param $readGrps Array List of read access routes
- * @param $writeGrps Array List of write access routes
+ * @param array $readGrps List of read access routes
+ * @param array $writeGrps List of write access routes
* @return Status
*/
protected function setContainerAccess(
@@ -1178,7 +1350,7 @@ class SwiftFileBackend extends FileBackendStore {
* Purge the CDN cache of affected objects if CDN caching is enabled.
* This is for Rackspace/Akamai CDNs.
*
- * @param $objects Array List of CF_Object items
+ * @param array $objects List of CF_Object items
* @return void
*/
public function purgeCDNCache( array $objects ) {
@@ -1199,8 +1371,9 @@ class SwiftFileBackend extends FileBackendStore {
/**
* Get an authenticated connection handle to the Swift proxy
*
- * @return CF_Connection|bool False on failure
* @throws CloudFilesException
+ * @throws CloudFilesException|Exception
+ * @return CF_Connection|bool False on failure
*/
protected function getConnection() {
if ( $this->connException instanceof CloudFilesException ) {
@@ -1251,6 +1424,7 @@ class SwiftFileBackend extends FileBackendStore {
protected function closeConnection() {
if ( $this->conn ) {
$this->conn->close(); // close active cURL handles in CF_Http object
+ $this->conn = null;
$this->sessionStarted = 0;
$this->connContainerCache->clear();
}
@@ -1267,18 +1441,11 @@ class SwiftFileBackend extends FileBackendStore {
}
/**
- * @see FileBackendStore::doClearCache()
- */
- protected function doClearCache( array $paths = null ) {
- $this->connContainerCache->clear(); // clear container object cache
- }
-
- /**
* Get a Swift container object, possibly from process cache.
* Use $reCache if the file count or byte count is needed.
*
- * @param $container string Container name
- * @param $bypassCache bool Bypass all caches and load from Swift
+ * @param string $container Container name
+ * @param bool $bypassCache Bypass all caches and load from Swift
* @return CF_Container
* @throws CloudFilesException
*/
@@ -1305,7 +1472,7 @@ class SwiftFileBackend extends FileBackendStore {
/**
* Create a Swift container
*
- * @param $container string Container name
+ * @param string $container Container name
* @return CF_Container
* @throws CloudFilesException
*/
@@ -1319,7 +1486,7 @@ class SwiftFileBackend extends FileBackendStore {
/**
* Delete a Swift container
*
- * @param $container string Container name
+ * @param string $container Container name
* @return void
* @throws CloudFilesException
*/
@@ -1353,7 +1520,7 @@ class SwiftFileBackend extends FileBackendStore {
* @param $e Exception
* @param $status Status|null
* @param $func string
- * @param $params Array
+ * @param array $params
* @return void
*/
protected function handleException( Exception $e, $status, $func, array $params ) {
@@ -1420,9 +1587,9 @@ abstract class SwiftFileBackendList implements Iterator {
/**
* @param $backend SwiftFileBackend
- * @param $fullCont string Resolved container name
- * @param $dir string Resolved directory relative to container
- * @param $params Array
+ * @param string $fullCont Resolved container name
+ * @param string $dir Resolved directory relative to container
+ * @param array $params
*/
public function __construct( SwiftFileBackend $backend, $fullCont, $dir, array $params ) {
$this->backend = $backend;
@@ -1491,11 +1658,11 @@ abstract class SwiftFileBackendList implements Iterator {
/**
* Get the given list portion (page)
*
- * @param $container string Resolved container name
- * @param $dir string Resolved path relative to container
+ * @param string $container Resolved container name
+ * @param string $dir Resolved path relative to container
* @param $after string|null
* @param $limit integer
- * @param $params Array
+ * @param array $params
* @return Traversable|Array|null Returns null on failure
*/
abstract protected function pageFromList( $container, $dir, &$after, $limit, array $params );
diff --git a/includes/filebackend/TempFSFile.php b/includes/filebackend/TempFSFile.php
index 5032bf68..11e125c1 100644
--- a/includes/filebackend/TempFSFile.php
+++ b/includes/filebackend/TempFSFile.php
@@ -82,30 +82,37 @@ class TempFSFile extends FSFile {
* Clean up the temporary file only after an object goes out of scope
*
* @param $object Object
- * @return void
+ * @return TempFSFile This object
*/
public function bind( $object ) {
if ( is_object( $object ) ) {
+ if ( !isset( $object->tempFSFileReferences ) ) {
+ // Init first since $object might use __get() and return only a copy variable
+ $object->tempFSFileReferences = array();
+ }
$object->tempFSFileReferences[] = $this;
}
+ return $this;
}
/**
* Set flag to not clean up after the temporary file
*
- * @return void
+ * @return TempFSFile This object
*/
public function preserve() {
$this->canDelete = false;
+ return $this;
}
/**
* Set flag clean up after the temporary file
*
- * @return void
+ * @return TempFSFile This object
*/
public function autocollect() {
$this->canDelete = true;
+ return $this;
}
/**
diff --git a/includes/filebackend/filejournal/DBFileJournal.php b/includes/filebackend/filejournal/DBFileJournal.php
index f6268c25..73f29a95 100644
--- a/includes/filebackend/filejournal/DBFileJournal.php
+++ b/includes/filebackend/filejournal/DBFileJournal.php
@@ -75,6 +75,9 @@ class DBFileJournal extends FileJournal {
try {
$dbw->insert( 'filejournal', $data, __METHOD__ );
+ if ( mt_rand( 0, 99 ) == 0 ) {
+ $this->purgeOldLogs(); // occasionally delete old logs
+ }
} catch ( DBError $e ) {
$status->fatal( 'filejournal-fail-dbquery', $this->backend );
return $status;
@@ -84,6 +87,35 @@ class DBFileJournal extends FileJournal {
}
/**
+ * @see FileJournal::doGetCurrentPosition()
+ * @return integer|false
+ */
+ protected function doGetCurrentPosition() {
+ $dbw = $this->getMasterDB();
+
+ return $dbw->selectField( 'filejournal', 'MAX(fj_id)',
+ array( 'fj_backend' => $this->backend ),
+ __METHOD__
+ );
+ }
+
+ /**
+ * @see FileJournal::doGetPositionAtTime()
+ * @param $time integer|string timestamp
+ * @return integer|false
+ */
+ protected function doGetPositionAtTime( $time ) {
+ $dbw = $this->getMasterDB();
+
+ $encTimestamp = $dbw->addQuotes( $dbw->timestamp( $time ) );
+ return $dbw->selectField( 'filejournal', 'fj_id',
+ array( 'fj_backend' => $this->backend, "fj_timestamp <= $encTimestamp" ),
+ __METHOD__,
+ array( 'ORDER BY' => 'fj_timestamp DESC' )
+ );
+ }
+
+ /**
* @see FileJournal::doGetChangeEntries()
* @return Array
* @throws DBError
diff --git a/includes/filebackend/filejournal/FileJournal.php b/includes/filebackend/filejournal/FileJournal.php
index ce029bbe..a1b7a459 100644
--- a/includes/filebackend/filejournal/FileJournal.php
+++ b/includes/filebackend/filejournal/FileJournal.php
@@ -54,7 +54,7 @@ abstract class FileJournal {
* Create an appropriate FileJournal object from config
*
* @param $config Array
- * @param $backend string A registered file backend name
+ * @param string $backend A registered file backend name
* @throws MWException
* @return FileJournal
*/
@@ -85,13 +85,13 @@ abstract class FileJournal {
/**
* Log changes made by a batch file operation.
* $entries is an array of log entries, each of which contains:
- * op : Basic operation name (create, store, copy, delete)
+ * op : Basic operation name (create, update, delete)
* path : The storage path of the file
* newSha1 : The final base 36 SHA-1 of the file
* Note that 'false' should be used as the SHA-1 for non-existing files.
*
- * @param $entries Array List of file operations (each an array of parameters)
- * @param $batchId string UUID string that identifies the operation batch
+ * @param array $entries List of file operations (each an array of parameters)
+ * @param string $batchId UUID string that identifies the operation batch
* @return Status
*/
final public function logChangeBatch( array $entries, $batchId ) {
@@ -104,13 +104,45 @@ abstract class FileJournal {
/**
* @see FileJournal::logChangeBatch()
*
- * @param $entries Array List of file operations (each an array of parameters)
- * @param $batchId string UUID string that identifies the operation batch
+ * @param array $entries List of file operations (each an array of parameters)
+ * @param string $batchId UUID string that identifies the operation batch
* @return Status
*/
abstract protected function doLogChangeBatch( array $entries, $batchId );
/**
+ * Get the position ID of the latest journal entry
+ *
+ * @return integer|false
+ */
+ final public function getCurrentPosition() {
+ return $this->doGetCurrentPosition();
+ }
+
+ /**
+ * @see FileJournal::getCurrentPosition()
+ * @return integer|false
+ */
+ abstract protected function doGetCurrentPosition();
+
+ /**
+ * Get the position ID of the latest journal entry at some point in time
+ *
+ * @param $time integer|string timestamp
+ * @return integer|false
+ */
+ final public function getPositionAtTime( $time ) {
+ return $this->doGetPositionAtTime( $time );
+ }
+
+ /**
+ * @see FileJournal::getPositionAtTime()
+ * @param $time integer|string timestamp
+ * @return integer|false
+ */
+ abstract protected function doGetPositionAtTime( $time );
+
+ /**
* Get an array of file change log entries.
* A starting change ID and/or limit can be specified.
*
@@ -169,7 +201,7 @@ abstract class FileJournal {
*/
class NullFileJournal extends FileJournal {
/**
- * @see FileJournal::logChangeBatch()
+ * @see FileJournal::doLogChangeBatch()
* @param $entries array
* @param $batchId string
* @return Status
@@ -179,6 +211,23 @@ class NullFileJournal extends FileJournal {
}
/**
+ * @see FileJournal::doGetCurrentPosition()
+ * @return integer|false
+ */
+ protected function doGetCurrentPosition() {
+ return false;
+ }
+
+ /**
+ * @see FileJournal::doGetPositionAtTime()
+ * @param $time integer|string timestamp
+ * @return integer|false
+ */
+ protected function doGetPositionAtTime( $time ) {
+ return false;
+ }
+
+ /**
* @see FileJournal::doGetChangeEntries()
* @return Array
*/
@@ -187,7 +236,7 @@ class NullFileJournal extends FileJournal {
}
/**
- * @see FileJournal::purgeOldLogs()
+ * @see FileJournal::doPurgeOldLogs()
* @return Status
*/
protected function doPurgeOldLogs() {
diff --git a/includes/filebackend/lockmanager/DBLockManager.php b/includes/filebackend/lockmanager/DBLockManager.php
index a8fe258b..f02387dc 100644
--- a/includes/filebackend/lockmanager/DBLockManager.php
+++ b/includes/filebackend/lockmanager/DBLockManager.php
@@ -22,10 +22,9 @@
*/
/**
- * Version of LockManager based on using DB table locks.
+ * Version of LockManager based on using named/row DB locks.
+ *
* This is meant for multi-wiki systems that may share files.
- * All locks are blocking, so it might be useful to set a small
- * lock-wait timeout via server config to curtail deadlocks.
*
* All lock requests for a resource, identified by a hash string, will map
* to one bucket. Each bucket maps to one or several peer DBs, each on their
@@ -37,7 +36,7 @@
* @ingroup LockManager
* @since 1.19
*/
-class DBLockManager extends QuorumLockManager {
+abstract class DBLockManager extends QuorumLockManager {
/** @var Array Map of DB names to server config */
protected $dbServers; // (DB name => server config array)
/** @var BagOStuff */
@@ -67,11 +66,12 @@ class DBLockManager extends QuorumLockManager {
* each having an odd-numbered list of DB names (peers) as values.
* Any DB named 'localDBMaster' will automatically use the DB master
* settings for this wiki (without the need for a dbServers entry).
+ * Only use 'localDBMaster' if the domain is a valid wiki ID.
* - lockExpiry : Lock timeout (seconds) for dropped connections. [optional]
* This tells the DB server how long to wait before assuming
* connection failure and releasing all the locks for a session.
*
- * @param Array $config
+ * @param array $config
*/
public function __construct( array $config ) {
parent::__construct( $config );
@@ -111,65 +111,6 @@ class DBLockManager extends QuorumLockManager {
}
/**
- * Get a connection to a lock DB and acquire locks on $paths.
- * This does not use GET_LOCK() per http://bugs.mysql.com/bug.php?id=1118.
- *
- * @see QuorumLockManager::getLocksOnServer()
- * @return Status
- */
- protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
- $status = Status::newGood();
-
- if ( $type == self::LOCK_EX ) { // writer locks
- try {
- $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
- # Build up values for INSERT clause
- $data = array();
- foreach ( $keys as $key ) {
- $data[] = array( 'fle_key' => $key );
- }
- # Wait on any existing writers and block new ones if we get in
- $db = $this->getConnection( $lockSrv ); // checked in isServerUp()
- $db->insert( 'filelocks_exclusive', $data, __METHOD__ );
- } catch ( DBError $e ) {
- foreach ( $paths as $path ) {
- $status->fatal( 'lockmanager-fail-acquirelock', $path );
- }
- }
- }
-
- return $status;
- }
-
- /**
- * @see QuorumLockManager::freeLocksOnServer()
- * @return Status
- */
- protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
- return Status::newGood(); // not supported
- }
-
- /**
- * @see QuorumLockManager::releaseAllLocks()
- * @return Status
- */
- protected function releaseAllLocks() {
- $status = Status::newGood();
-
- foreach ( $this->conns as $lockDb => $db ) {
- if ( $db->trxLevel() ) { // in transaction
- try {
- $db->rollback( __METHOD__ ); // finish transaction and kill any rows
- } catch ( DBError $e ) {
- $status->fatal( 'lockmanager-fail-db-release', $lockDb );
- }
- }
- }
-
- return $status;
- }
-
- /**
* @see QuorumLockManager::isServerUp()
* @return bool
*/
@@ -197,8 +138,8 @@ class DBLockManager extends QuorumLockManager {
if ( !isset( $this->conns[$lockDb] ) ) {
$db = null;
if ( $lockDb === 'localDBMaster' ) {
- $lb = wfGetLBFactory()->newMainLB();
- $db = $lb->getConnection( DB_MASTER );
+ $lb = wfGetLBFactory()->getMainLB( $this->domain );
+ $db = $lb->getConnection( DB_MASTER, array(), $this->domain );
} elseif ( isset( $this->dbServers[$lockDb] ) ) {
$config = $this->dbServers[$lockDb];
$db = DatabaseBase::factory( $config['type'], $config );
@@ -274,14 +215,8 @@ class DBLockManager extends QuorumLockManager {
* Make sure remaining locks get cleared for sanity
*/
function __destruct() {
+ $this->releaseAllLocks();
foreach ( $this->conns as $db ) {
- if ( $db->trxLevel() ) { // in transaction
- try {
- $db->rollback( __METHOD__ ); // finish transaction and kill any rows
- } catch ( DBError $e ) {
- // oh well
- }
- }
$db->close();
}
}
@@ -321,27 +256,38 @@ class MySqlLockManager extends DBLockManager {
$status = Status::newGood();
$db = $this->getConnection( $lockSrv ); // checked in isServerUp()
- $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
+
+ $keys = array(); // list of hash keys for the paths
+ $data = array(); // list of rows to insert
+ $checkEXKeys = array(); // list of hash keys that this has no EX lock on
# Build up values for INSERT clause
- $data = array();
- foreach ( $keys as $key ) {
+ foreach ( $paths as $path ) {
+ $key = $this->sha1Base36Absolute( $path );
+ $keys[] = $key;
$data[] = array( 'fls_key' => $key, 'fls_session' => $this->session );
+ if ( !isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
+ $checkEXKeys[] = $key;
+ }
}
- # Block new writers...
+
+ # Block new writers (both EX and SH locks leave entries here)...
$db->insert( 'filelocks_shared', $data, __METHOD__, array( 'IGNORE' ) );
# Actually do the locking queries...
if ( $type == self::LOCK_SH ) { // reader locks
+ $blocked = false;
# Bail if there are any existing writers...
- $blocked = $db->selectField( 'filelocks_exclusive', '1',
- array( 'fle_key' => $keys ),
- __METHOD__
- );
- # Prospective writers that haven't yet updated filelocks_exclusive
- # will recheck filelocks_shared after doing so and bail due to our entry.
+ if ( count( $checkEXKeys ) ) {
+ $blocked = $db->selectField( 'filelocks_exclusive', '1',
+ array( 'fle_key' => $checkEXKeys ),
+ __METHOD__
+ );
+ }
+ # Other prospective writers that haven't yet updated filelocks_exclusive
+ # will recheck filelocks_shared after doing so and bail due to this entry.
} else { // writer locks
$encSession = $db->addQuotes( $this->session );
# Bail if there are any existing writers...
- # The may detect readers, but the safe check for them is below.
+ # This may detect readers, but the safe check for them is below.
# Note: if two writers come at the same time, both bail :)
$blocked = $db->selectField( 'filelocks_shared', '1',
array( 'fls_key' => $keys, "fls_session != $encSession" ),
@@ -371,4 +317,117 @@ class MySqlLockManager extends DBLockManager {
return $status;
}
+
+ /**
+ * @see QuorumLockManager::freeLocksOnServer()
+ * @return Status
+ */
+ protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
+ return Status::newGood(); // not supported
+ }
+
+ /**
+ * @see QuorumLockManager::releaseAllLocks()
+ * @return Status
+ */
+ protected function releaseAllLocks() {
+ $status = Status::newGood();
+
+ foreach ( $this->conns as $lockDb => $db ) {
+ if ( $db->trxLevel() ) { // in transaction
+ try {
+ $db->rollback( __METHOD__ ); // finish transaction and kill any rows
+ } catch ( DBError $e ) {
+ $status->fatal( 'lockmanager-fail-db-release', $lockDb );
+ }
+ }
+ }
+
+ return $status;
+ }
+}
+
+/**
+ * PostgreSQL version of DBLockManager that supports shared locks.
+ * All locks are non-blocking, which avoids deadlocks.
+ *
+ * @ingroup LockManager
+ */
+class PostgreSqlLockManager extends DBLockManager {
+ /** @var Array Mapping of lock types to the type actually used */
+ protected $lockTypeMap = array(
+ self::LOCK_SH => self::LOCK_SH,
+ self::LOCK_UW => self::LOCK_SH,
+ self::LOCK_EX => self::LOCK_EX
+ );
+
+ protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+ $status = Status::newGood();
+ if ( !count( $paths ) ) {
+ return $status; // nothing to lock
+ }
+
+ $db = $this->getConnection( $lockSrv ); // checked in isServerUp()
+ $bigints = array_unique( array_map(
+ function( $key ) { return wfBaseConvert( substr( $key, 0, 15 ), 16, 10 ); },
+ array_map( array( $this, 'sha1Base16Absolute' ), $paths )
+ ) );
+
+ // Try to acquire all the locks...
+ $fields = array();
+ foreach ( $bigints as $bigint ) {
+ $fields[] = ( $type == self::LOCK_SH )
+ ? "pg_try_advisory_lock_shared({$db->addQuotes( $bigint )}) AS K$bigint"
+ : "pg_try_advisory_lock({$db->addQuotes( $bigint )}) AS K$bigint";
+ }
+ $res = $db->query( 'SELECT ' . implode( ', ', $fields ), __METHOD__ );
+ $row = (array)$res->fetchObject();
+
+ if ( in_array( 'f', $row ) ) {
+ // Release any acquired locks if some could not be acquired...
+ $fields = array();
+ foreach ( $row as $kbigint => $ok ) {
+ if ( $ok === 't' ) { // locked
+ $bigint = substr( $kbigint, 1 ); // strip off the "K"
+ $fields[] = ( $type == self::LOCK_SH )
+ ? "pg_advisory_unlock_shared({$db->addQuotes( $bigint )})"
+ : "pg_advisory_unlock({$db->addQuotes( $bigint )})";
+ }
+ }
+ if ( count( $fields ) ) {
+ $db->query( 'SELECT ' . implode( ', ', $fields ), __METHOD__ );
+ }
+ foreach ( $paths as $path ) {
+ $status->fatal( 'lockmanager-fail-acquirelock', $path );
+ }
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see QuorumLockManager::freeLocksOnServer()
+ * @return Status
+ */
+ protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
+ return Status::newGood(); // not supported
+ }
+
+ /**
+ * @see QuorumLockManager::releaseAllLocks()
+ * @return Status
+ */
+ protected function releaseAllLocks() {
+ $status = Status::newGood();
+
+ foreach ( $this->conns as $lockDb => $db ) {
+ try {
+ $db->query( "SELECT pg_advisory_unlock_all()", __METHOD__ );
+ } catch ( DBError $e ) {
+ $status->fatal( 'lockmanager-fail-db-release', $lockDb );
+ }
+ }
+
+ return $status;
+ }
}
diff --git a/includes/filebackend/lockmanager/FSLockManager.php b/includes/filebackend/lockmanager/FSLockManager.php
index 9a6206fd..eacba704 100644
--- a/includes/filebackend/lockmanager/FSLockManager.php
+++ b/includes/filebackend/lockmanager/FSLockManager.php
@@ -43,7 +43,7 @@ class FSLockManager extends LockManager {
protected $lockDir; // global dir for all servers
- /** @var Array Map of (locked key => lock type => lock file handle) */
+ /** @var Array Map of (locked key => lock file handle) */
protected $handles = array();
/**
@@ -115,12 +115,16 @@ class FSLockManager extends LockManager {
} elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
$this->locksHeld[$path][$type] = 1;
} else {
- wfSuppressWarnings();
- $handle = fopen( $this->getLockPath( $path ), 'a+' );
- wfRestoreWarnings();
- if ( !$handle ) { // lock dir missing?
- wfMkdirParents( $this->lockDir );
- $handle = fopen( $this->getLockPath( $path ), 'a+' ); // try again
+ if ( isset( $this->handles[$path] ) ) {
+ $handle = $this->handles[$path];
+ } else {
+ wfSuppressWarnings();
+ $handle = fopen( $this->getLockPath( $path ), 'a+' );
+ wfRestoreWarnings();
+ if ( !$handle ) { // lock dir missing?
+ wfMkdirParents( $this->lockDir );
+ $handle = fopen( $this->getLockPath( $path ), 'a+' ); // try again
+ }
}
if ( $handle ) {
// Either a shared or exclusive lock
@@ -128,7 +132,7 @@ class FSLockManager extends LockManager {
if ( flock( $handle, $lock | LOCK_NB ) ) {
// Record this lock as active
$this->locksHeld[$path][$type] = 1;
- $this->handles[$path][$type] = $handle;
+ $this->handles[$path] = $handle;
} else {
fclose( $handle );
$status->fatal( 'lockmanager-fail-acquirelock', $path );
@@ -160,24 +164,13 @@ class FSLockManager extends LockManager {
--$this->locksHeld[$path][$type];
if ( $this->locksHeld[$path][$type] <= 0 ) {
unset( $this->locksHeld[$path][$type] );
- // If a LOCK_SH comes in while we have a LOCK_EX, we don't
- // actually add a handler, so check for handler existence.
- if ( isset( $this->handles[$path][$type] ) ) {
- if ( $type === self::LOCK_EX
- && isset( $this->locksHeld[$path][self::LOCK_SH] )
- && !isset( $this->handles[$path][self::LOCK_SH] ) )
- {
- // EX lock came first: move this handle to the SH one
- $this->handles[$path][self::LOCK_SH] = $this->handles[$path][$type];
- } else {
- // Mark this handle to be unlocked and closed
- $handlesToClose[] = $this->handles[$path][$type];
- }
- unset( $this->handles[$path][$type] );
- }
}
if ( !count( $this->locksHeld[$path] ) ) {
unset( $this->locksHeld[$path] ); // no locks on this path
+ if ( isset( $this->handles[$path] ) ) {
+ $handlesToClose[] = $this->handles[$path];
+ unset( $this->handles[$path] );
+ }
}
// Unlock handles to release locks and delete
// any lock files that end up with no locks on them...
@@ -237,8 +230,7 @@ class FSLockManager extends LockManager {
* @return string
*/
protected function getLockPath( $path ) {
- $hash = self::sha1Base36( $path );
- return "{$this->lockDir}/{$hash}.lock";
+ return "{$this->lockDir}/{$this->sha1Base36Absolute( $path )}.lock";
}
/**
diff --git a/includes/filebackend/lockmanager/LSLockManager.php b/includes/filebackend/lockmanager/LSLockManager.php
index 89428182..97de8dca 100644
--- a/includes/filebackend/lockmanager/LSLockManager.php
+++ b/includes/filebackend/lockmanager/LSLockManager.php
@@ -66,7 +66,7 @@ class LSLockManager extends QuorumLockManager {
* each having an odd-numbered list of server names (peers) as values.
* - connTimeout : Lock server connection attempt timeout. [optional]
*
- * @param Array $config
+ * @param array $config
*/
public function __construct( array $config ) {
parent::__construct( $config );
@@ -94,7 +94,7 @@ class LSLockManager extends QuorumLockManager {
// Send out the command and get the response...
$type = ( $type == self::LOCK_SH ) ? 'SH' : 'EX';
- $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
+ $keys = array_unique( array_map( array( $this, 'sha1Base36Absolute' ), $paths ) );
$response = $this->sendCommand( $lockSrv, 'ACQUIRE', $type, $keys );
if ( $response !== 'ACQUIRED' ) {
@@ -115,7 +115,7 @@ class LSLockManager extends QuorumLockManager {
// Send out the command and get the response...
$type = ( $type == self::LOCK_SH ) ? 'SH' : 'EX';
- $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
+ $keys = array_unique( array_map( array( $this, 'sha1Base36Absolute' ), $paths ) );
$response = $this->sendCommand( $lockSrv, 'RELEASE', $type, $keys );
if ( $response !== 'RELEASED' ) {
@@ -169,7 +169,7 @@ class LSLockManager extends QuorumLockManager {
$authKey = $this->lockServers[$lockSrv]['authKey'];
// Build of the command as a flat string...
$values = implode( '|', $values );
- $key = sha1( $this->session . $action . $type . $values . $authKey );
+ $key = hash_hmac( 'sha1', "{$this->session}\n{$action}\n{$type}\n{$values}", $authKey );
// Send out the command...
if ( fwrite( $conn, "{$this->session}:$key:$action:$type:$values\n" ) === false ) {
return false;
diff --git a/includes/filebackend/lockmanager/LockManager.php b/includes/filebackend/lockmanager/LockManager.php
index 07853f87..0512a01b 100644
--- a/includes/filebackend/lockmanager/LockManager.php
+++ b/includes/filebackend/lockmanager/LockManager.php
@@ -53,6 +53,9 @@ abstract class LockManager {
/** @var Array Map of (resource path => lock type => count) */
protected $locksHeld = array();
+ protected $domain; // string; domain (usually wiki ID)
+ protected $lockTTL; // integer; maximum time locks can be held
+
/* Lock types; stronger locks have higher values */
const LOCK_SH = 1; // shared lock (for reads)
const LOCK_UW = 2; // shared lock (for reads used to write elsewhere)
@@ -61,14 +64,29 @@ abstract class LockManager {
/**
* Construct a new instance from configuration
*
+ * $config paramaters include:
+ * - domain : Domain (usually wiki ID) that all resources are relative to [optional]
+ * - lockTTL : Age (in seconds) at which resource locks should expire.
+ * This only applies if locks are not tied to a connection/process.
+ *
* @param $config Array
*/
- public function __construct( array $config ) {}
+ public function __construct( array $config ) {
+ $this->domain = isset( $config['domain'] ) ? $config['domain'] : wfWikiID();
+ if ( isset( $config['lockTTL'] ) ) {
+ $this->lockTTL = max( 1, $config['lockTTL'] );
+ } elseif ( PHP_SAPI === 'cli' ) {
+ $this->lockTTL = 2*3600;
+ } else {
+ $met = ini_get( 'max_execution_time' ); // this is 0 in CLI mode
+ $this->lockTTL = max( 5*60, 2*(int)$met );
+ }
+ }
/**
* Lock the resources at the given abstract paths
*
- * @param $paths Array List of resource names
+ * @param array $paths List of resource names
* @param $type integer LockManager::LOCK_* constant
* @return Status
*/
@@ -82,7 +100,7 @@ abstract class LockManager {
/**
* Unlock the resources at the given abstract paths
*
- * @param $paths Array List of storage paths
+ * @param array $paths List of storage paths
* @param $type integer LockManager::LOCK_* constant
* @return Status
*/
@@ -94,308 +112,46 @@ abstract class LockManager {
}
/**
- * Get the base 36 SHA-1 of a string, padded to 31 digits
+ * Get the base 36 SHA-1 of a string, padded to 31 digits.
+ * Before hashing, the path will be prefixed with the domain ID.
+ * This should be used interally for lock key or file names.
*
* @param $path string
* @return string
*/
- final protected static function sha1Base36( $path ) {
- return wfBaseConvert( sha1( $path ), 16, 36, 31 );
+ final protected function sha1Base36Absolute( $path ) {
+ return wfBaseConvert( sha1( "{$this->domain}:{$path}" ), 16, 36, 31 );
}
/**
- * Lock resources with the given keys and lock type
+ * Get the base 16 SHA-1 of a string, padded to 31 digits.
+ * Before hashing, the path will be prefixed with the domain ID.
+ * This should be used interally for lock key or file names.
*
- * @param $paths Array List of storage paths
- * @param $type integer LockManager::LOCK_* constant
+ * @param $path string
* @return string
*/
- abstract protected function doLock( array $paths, $type );
+ final protected function sha1Base16Absolute( $path ) {
+ return sha1( "{$this->domain}:{$path}" );
+ }
/**
- * Unlock resources with the given keys and lock type
+ * Lock resources with the given keys and lock type
*
- * @param $paths Array List of storage paths
+ * @param array $paths List of storage paths
* @param $type integer LockManager::LOCK_* constant
* @return string
*/
- abstract protected function doUnlock( array $paths, $type );
-}
-
-/**
- * Self-releasing locks
- *
- * LockManager helper class to handle scoped locks, which
- * release when an object is destroyed or goes out of scope.
- *
- * @ingroup LockManager
- * @since 1.19
- */
-class ScopedLock {
- /** @var LockManager */
- protected $manager;
- /** @var Status */
- protected $status;
- /** @var Array List of resource paths*/
- protected $paths;
-
- protected $type; // integer lock type
-
- /**
- * @param $manager LockManager
- * @param $paths Array List of storage paths
- * @param $type integer LockManager::LOCK_* constant
- * @param $status Status
- */
- protected function __construct(
- LockManager $manager, array $paths, $type, Status $status
- ) {
- $this->manager = $manager;
- $this->paths = $paths;
- $this->status = $status;
- $this->type = $type;
- }
+ abstract protected function doLock( array $paths, $type );
/**
- * Get a ScopedLock object representing a lock on resource paths.
- * Any locks are released once this object goes out of scope.
- * The status object is updated with any errors or warnings.
+ * Unlock resources with the given keys and lock type
*
- * @param $manager LockManager
- * @param $paths Array List of storage paths
+ * @param array $paths List of storage paths
* @param $type integer LockManager::LOCK_* constant
- * @param $status Status
- * @return ScopedLock|null Returns null on failure
- */
- public static function factory(
- LockManager $manager, array $paths, $type, Status $status
- ) {
- $lockStatus = $manager->lock( $paths, $type );
- $status->merge( $lockStatus );
- if ( $lockStatus->isOK() ) {
- return new self( $manager, $paths, $type, $status );
- }
- return null;
- }
-
- function __destruct() {
- $wasOk = $this->status->isOK();
- $this->status->merge( $this->manager->unlock( $this->paths, $this->type ) );
- if ( $wasOk ) {
- // Make sure status is OK, despite any unlockFiles() fatals
- $this->status->setResult( true, $this->status->value );
- }
- }
-}
-
-/**
- * Version of LockManager that uses a quorum from peer servers for locks.
- * The resource space can also be sharded into separate peer groups.
- *
- * @ingroup LockManager
- * @since 1.20
- */
-abstract class QuorumLockManager extends LockManager {
- /** @var Array Map of bucket indexes to peer server lists */
- protected $srvsByBucket = array(); // (bucket index => (lsrv1, lsrv2, ...))
-
- /**
- * @see LockManager::doLock()
- * @param $paths array
- * @param $type int
- * @return Status
- */
- final protected function doLock( array $paths, $type ) {
- $status = Status::newGood();
-
- $pathsToLock = array(); // (bucket => paths)
- // Get locks that need to be acquired (buckets => locks)...
- foreach ( $paths as $path ) {
- if ( isset( $this->locksHeld[$path][$type] ) ) {
- ++$this->locksHeld[$path][$type];
- } elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
- $this->locksHeld[$path][$type] = 1;
- } else {
- $bucket = $this->getBucketFromKey( $path );
- $pathsToLock[$bucket][] = $path;
- }
- }
-
- $lockedPaths = array(); // files locked in this attempt
- // Attempt to acquire these locks...
- foreach ( $pathsToLock as $bucket => $paths ) {
- // Try to acquire the locks for this bucket
- $status->merge( $this->doLockingRequestBucket( $bucket, $paths, $type ) );
- if ( !$status->isOK() ) {
- $status->merge( $this->doUnlock( $lockedPaths, $type ) );
- return $status;
- }
- // Record these locks as active
- foreach ( $paths as $path ) {
- $this->locksHeld[$path][$type] = 1; // locked
- }
- // Keep track of what locks were made in this attempt
- $lockedPaths = array_merge( $lockedPaths, $paths );
- }
-
- return $status;
- }
-
- /**
- * @see LockManager::doUnlock()
- * @param $paths array
- * @param $type int
- * @return Status
- */
- final protected function doUnlock( array $paths, $type ) {
- $status = Status::newGood();
-
- $pathsToUnlock = array();
- foreach ( $paths as $path ) {
- if ( !isset( $this->locksHeld[$path][$type] ) ) {
- $status->warning( 'lockmanager-notlocked', $path );
- } else {
- --$this->locksHeld[$path][$type];
- // Reference count the locks held and release locks when zero
- if ( $this->locksHeld[$path][$type] <= 0 ) {
- unset( $this->locksHeld[$path][$type] );
- $bucket = $this->getBucketFromKey( $path );
- $pathsToUnlock[$bucket][] = $path;
- }
- if ( !count( $this->locksHeld[$path] ) ) {
- unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
- }
- }
- }
-
- // Remove these specific locks if possible, or at least release
- // all locks once this process is currently not holding any locks.
- foreach ( $pathsToUnlock as $bucket => $paths ) {
- $status->merge( $this->doUnlockingRequestBucket( $bucket, $paths, $type ) );
- }
- if ( !count( $this->locksHeld ) ) {
- $status->merge( $this->releaseAllLocks() );
- }
-
- return $status;
- }
-
- /**
- * Attempt to acquire locks with the peers for a bucket.
- * This is all or nothing; if any key is locked then this totally fails.
- *
- * @param $bucket integer
- * @param $paths Array List of resource keys to lock
- * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
- * @return Status
- */
- final protected function doLockingRequestBucket( $bucket, array $paths, $type ) {
- $status = Status::newGood();
-
- $yesVotes = 0; // locks made on trustable servers
- $votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers
- $quorum = floor( $votesLeft/2 + 1 ); // simple majority
- // Get votes for each peer, in order, until we have enough...
- foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
- if ( !$this->isServerUp( $lockSrv ) ) {
- --$votesLeft;
- $status->warning( 'lockmanager-fail-svr-acquire', $lockSrv );
- continue; // server down?
- }
- // Attempt to acquire the lock on this peer
- $status->merge( $this->getLocksOnServer( $lockSrv, $paths, $type ) );
- if ( !$status->isOK() ) {
- return $status; // vetoed; resource locked
- }
- ++$yesVotes; // success for this peer
- if ( $yesVotes >= $quorum ) {
- return $status; // lock obtained
- }
- --$votesLeft;
- $votesNeeded = $quorum - $yesVotes;
- if ( $votesNeeded > $votesLeft ) {
- break; // short-circuit
- }
- }
- // At this point, we must not have met the quorum
- $status->setResult( false );
-
- return $status;
- }
-
- /**
- * Attempt to release locks with the peers for a bucket
- *
- * @param $bucket integer
- * @param $paths Array List of resource keys to lock
- * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
- * @return Status
- */
- final protected function doUnlockingRequestBucket( $bucket, array $paths, $type ) {
- $status = Status::newGood();
-
- foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
- if ( !$this->isServerUp( $lockSrv ) ) {
- $status->fatal( 'lockmanager-fail-svr-release', $lockSrv );
- // Attempt to release the lock on this peer
- } else {
- $status->merge( $this->freeLocksOnServer( $lockSrv, $paths, $type ) );
- }
- }
-
- return $status;
- }
-
- /**
- * Get the bucket for resource path.
- * This should avoid throwing any exceptions.
- *
- * @param $path string
- * @return integer
- */
- protected function getBucketFromKey( $path ) {
- $prefix = substr( sha1( $path ), 0, 2 ); // first 2 hex chars (8 bits)
- return (int)base_convert( $prefix, 16, 10 ) % count( $this->srvsByBucket );
- }
-
- /**
- * Check if a lock server is up
- *
- * @param $lockSrv string
- * @return bool
- */
- abstract protected function isServerUp( $lockSrv );
-
- /**
- * Get a connection to a lock server and acquire locks on $paths
- *
- * @param $lockSrv string
- * @param $paths array
- * @param $type integer
- * @return Status
- */
- abstract protected function getLocksOnServer( $lockSrv, array $paths, $type );
-
- /**
- * Get a connection to a lock server and release locks on $paths.
- *
- * Subclasses must effectively implement this or releaseAllLocks().
- *
- * @param $lockSrv string
- * @param $paths array
- * @param $type integer
- * @return Status
- */
- abstract protected function freeLocksOnServer( $lockSrv, array $paths, $type );
-
- /**
- * Release all locks that this session is holding.
- *
- * Subclasses must effectively implement this or freeLocksOnServer().
- *
- * @return Status
+ * @return string
*/
- abstract protected function releaseAllLocks();
+ abstract protected function doUnlock( array $paths, $type );
}
/**
diff --git a/includes/filebackend/lockmanager/LockManagerGroup.php b/includes/filebackend/lockmanager/LockManagerGroup.php
index 8c8c940a..ac0bd49b 100644
--- a/includes/filebackend/lockmanager/LockManagerGroup.php
+++ b/includes/filebackend/lockmanager/LockManagerGroup.php
@@ -29,33 +29,41 @@
* @since 1.19
*/
class LockManagerGroup {
- /**
- * @var LockManagerGroup
- */
- protected static $instance = null;
+ /** @var Array (domain => LockManager) */
+ protected static $instances = array();
+
+ protected $domain; // string; domain (usually wiki ID)
- /** @var Array of (name => ('class' =>, 'config' =>, 'instance' =>)) */
+ /** @var Array of (name => ('class' => ..., 'config' => ..., 'instance' => ...)) */
protected $managers = array();
- protected function __construct() {}
+ /**
+ * @param string $domain Domain (usually wiki ID)
+ */
+ protected function __construct( $domain ) {
+ $this->domain = $domain;
+ }
/**
+ * @param string $domain Domain (usually wiki ID)
* @return LockManagerGroup
*/
- public static function singleton() {
- if ( self::$instance == null ) {
- self::$instance = new self();
- self::$instance->initFromGlobals();
+ public static function singleton( $domain = false ) {
+ $domain = ( $domain === false ) ? wfWikiID() : $domain;
+ if ( !isset( self::$instances[$domain] ) ) {
+ self::$instances[$domain] = new self( $domain );
+ self::$instances[$domain]->initFromGlobals();
}
- return self::$instance;
+ return self::$instances[$domain];
}
/**
- * Destroy the singleton instance, so that a new one will be created next
- * time singleton() is called.
+ * Destroy the singleton instances
+ *
+ * @return void
*/
- public static function destroySingleton() {
- self::$instance = null;
+ public static function destroySingletons() {
+ self::$instances = array();
}
/**
@@ -78,6 +86,7 @@ class LockManagerGroup {
*/
protected function register( array $configs ) {
foreach ( $configs as $config ) {
+ $config['domain'] = $this->domain;
if ( !isset( $config['name'] ) ) {
throw new MWException( "Cannot register a lock manager with no name." );
}
@@ -116,6 +125,21 @@ class LockManagerGroup {
}
/**
+ * Get the config array for a lock manager object with a given name
+ *
+ * @param $name string
+ * @return Array
+ * @throws MWException
+ */
+ public function config( $name ) {
+ if ( !isset( $this->managers[$name] ) ) {
+ throw new MWException( "No lock manager defined with the name `$name`." );
+ }
+ $class = $this->managers[$name]['class'];
+ return array( 'class' => $class ) + $this->managers[$name]['config'];
+ }
+
+ /**
* Get the default lock manager configured for the site.
* Returns NullLockManager if no lock manager could be found.
*
diff --git a/includes/filebackend/lockmanager/MemcLockManager.php b/includes/filebackend/lockmanager/MemcLockManager.php
index 57c0463d..fafc588a 100644
--- a/includes/filebackend/lockmanager/MemcLockManager.php
+++ b/includes/filebackend/lockmanager/MemcLockManager.php
@@ -28,8 +28,8 @@
* This is meant for multi-wiki systems that may share files.
* All locks are non-blocking, which avoids deadlocks.
*
- * All lock requests for a resource, identified by a hash string, will map
- * to one bucket. Each bucket maps to one or several peer servers, each running memcached.
+ * All lock requests for a resource, identified by a hash string, will map to one
+ * bucket. Each bucket maps to one or several peer servers, each running memcached.
* A majority of peers must agree for a lock to be acquired.
*
* @ingroup LockManager
@@ -48,9 +48,7 @@ class MemcLockManager extends QuorumLockManager {
/** @var Array */
protected $serversUp = array(); // (server name => bool)
- protected $lockExpiry; // integer; maximum time locks can be held
- protected $session = ''; // string; random SHA-1 UUID
- protected $wikiId = ''; // string
+ protected $session = ''; // string; random UUID
/**
* Construct a new instance from configuration.
@@ -61,9 +59,9 @@ class MemcLockManager extends QuorumLockManager {
* each having an odd-numbered list of server names (peers) as values.
* - memcConfig : Configuration array for ObjectCache::newFromParams. [optional]
* If set, this must use one of the memcached classes.
- * - wikiId : Wiki ID string that all resources are relative to. [optional]
*
- * @param Array $config
+ * @param array $config
+ * @throws MWException
*/
public function __construct( array $config ) {
parent::__construct( $config );
@@ -87,11 +85,6 @@ class MemcLockManager extends QuorumLockManager {
}
}
- $this->wikiId = isset( $config['wikiId'] ) ? $config['wikiId'] : wfWikiID();
-
- $met = ini_get( 'max_execution_time' ); // this is 0 in CLI mode
- $this->lockExpiry = $met ? 2*(int)$met : 2*3600;
-
$this->session = wfRandomString( 32 );
}
@@ -110,7 +103,7 @@ class MemcLockManager extends QuorumLockManager {
foreach ( $paths as $path ) {
$status->fatal( 'lockmanager-fail-acquirelock', $path );
}
- return;
+ return $status;
}
// Fetch all the existing lock records...
@@ -121,8 +114,8 @@ class MemcLockManager extends QuorumLockManager {
foreach ( $paths as $path ) {
$locksKey = $this->recordKeyForPath( $path );
$locksHeld = isset( $lockRecords[$locksKey] )
- ? $lockRecords[$locksKey]
- : array( self::LOCK_SH => array(), self::LOCK_EX => array() ); // init
+ ? self::sanitizeLockArray( $lockRecords[$locksKey] )
+ : self::newLockArray(); // init
foreach ( $locksHeld[self::LOCK_EX] as $session => $expiry ) {
if ( $expiry < $now ) { // stale?
unset( $locksHeld[self::LOCK_EX][$session] );
@@ -141,7 +134,7 @@ class MemcLockManager extends QuorumLockManager {
}
if ( $status->isOK() ) {
// Register the session in the lock record array
- $locksHeld[$type][$this->session] = $now + $this->lockExpiry;
+ $locksHeld[$type][$this->session] = $now + $this->lockTTL;
// We will update this record if none of the other locks conflict
$lockRecords[$locksKey] = $locksHeld;
}
@@ -149,9 +142,15 @@ class MemcLockManager extends QuorumLockManager {
// If there were no lock conflicts, update all the lock records...
if ( $status->isOK() ) {
- foreach ( $lockRecords as $locksKey => $locksHeld ) {
- $memc->set( $locksKey, $locksHeld );
- wfDebug( __METHOD__ . ": acquired lock on key $locksKey.\n" );
+ foreach ( $paths as $path ) {
+ $locksKey = $this->recordKeyForPath( $path );
+ $locksHeld = $lockRecords[$locksKey];
+ $ok = $memc->set( $locksKey, $locksHeld, 7*86400 );
+ if ( !$ok ) {
+ $status->fatal( 'lockmanager-fail-acquirelock', $path );
+ } else {
+ wfDebug( __METHOD__ . ": acquired lock on key $locksKey.\n" );
+ }
}
}
@@ -186,17 +185,22 @@ class MemcLockManager extends QuorumLockManager {
foreach ( $paths as $path ) {
$locksKey = $this->recordKeyForPath( $path ); // lock record
if ( !isset( $lockRecords[$locksKey] ) ) {
+ $status->warning( 'lockmanager-fail-releaselock', $path );
continue; // nothing to do
}
- $locksHeld = $lockRecords[$locksKey];
- if ( is_array( $locksHeld ) && isset( $locksHeld[$type] ) ) {
- unset( $locksHeld[$type][$this->session] );
- $ok = $memc->set( $locksKey, $locksHeld );
+ $locksHeld = self::sanitizeLockArray( $lockRecords[$locksKey] );
+ if ( isset( $locksHeld[$type][$this->session] ) ) {
+ unset( $locksHeld[$type][$this->session] ); // unregister this session
+ if ( $locksHeld === self::newLockArray() ) {
+ $ok = $memc->delete( $locksKey );
+ } else {
+ $ok = $memc->set( $locksKey, $locksHeld );
+ }
+ if ( !$ok ) {
+ $status->fatal( 'lockmanager-fail-releaselock', $path );
+ }
} else {
- $ok = true;
- }
- if ( !$ok ) {
- $status->fatal( 'lockmanager-fail-releaselock', $path );
+ $status->warning( 'lockmanager-fail-releaselock', $path );
}
wfDebug( __METHOD__ . ": released lock on key $locksKey.\n" );
}
@@ -226,7 +230,7 @@ class MemcLockManager extends QuorumLockManager {
/**
* Get the MemcachedBagOStuff object for a $lockSrv
*
- * @param $lockSrv string Server name
+ * @param string $lockSrv Server name
* @return MemcachedBagOStuff|null
*/
protected function getCache( $lockSrv ) {
@@ -234,7 +238,7 @@ class MemcLockManager extends QuorumLockManager {
if ( isset( $this->bagOStuffs[$lockSrv] ) ) {
$memc = $this->bagOStuffs[$lockSrv];
if ( !isset( $this->serversUp[$lockSrv] ) ) {
- $this->serversUp[$lockSrv] = $memc->set( 'MemcLockManager:ping', 1, 1 );
+ $this->serversUp[$lockSrv] = $memc->set( __CLASS__ . ':ping', 1, 1 );
if ( !$this->serversUp[$lockSrv] ) {
trigger_error( __METHOD__ . ": Could not contact $lockSrv.", E_USER_WARNING );
}
@@ -251,14 +255,32 @@ class MemcLockManager extends QuorumLockManager {
* @return string
*/
protected function recordKeyForPath( $path ) {
- $hash = LockManager::sha1Base36( $path );
- list( $db, $prefix ) = wfSplitWikiID( $this->wikiId );
- return wfForeignMemcKey( $db, $prefix, __CLASS__, 'locks', $hash );
+ return implode( ':', array( __CLASS__, 'locks', $this->sha1Base36Absolute( $path ) ) );
+ }
+
+ /**
+ * @return Array An empty lock structure for a key
+ */
+ protected static function newLockArray() {
+ return array( self::LOCK_SH => array(), self::LOCK_EX => array() );
+ }
+
+ /**
+ * @param $a array
+ * @return Array An empty lock structure for a key
+ */
+ protected static function sanitizeLockArray( $a ) {
+ if ( is_array( $a ) && isset( $a[self::LOCK_EX] ) && isset( $a[self::LOCK_SH] ) ) {
+ return $a;
+ } else {
+ trigger_error( __METHOD__ . ": reset invalid lock array.", E_USER_WARNING );
+ return self::newLockArray();
+ }
}
/**
* @param $memc MemcachedBagOStuff
- * @param $keys Array List of keys to acquire
+ * @param array $keys List of keys to acquire
* @return bool
*/
protected function acquireMutexes( MemcachedBagOStuff $memc, array $keys ) {
@@ -284,10 +306,10 @@ class MemcLockManager extends QuorumLockManager {
continue; // acquire in order
}
}
- } while ( count( $lockedKeys ) < count( $keys ) && ( microtime( true ) - $start ) <= 6 );
+ } while ( count( $lockedKeys ) < count( $keys ) && ( microtime( true ) - $start ) <= 3 );
if ( count( $lockedKeys ) != count( $keys ) ) {
- $this->releaseMutexes( $lockedKeys ); // failed; release what was locked
+ $this->releaseMutexes( $memc, $lockedKeys ); // failed; release what was locked
return false;
}
@@ -296,7 +318,7 @@ class MemcLockManager extends QuorumLockManager {
/**
* @param $memc MemcachedBagOStuff
- * @param $keys Array List of acquired keys
+ * @param array $keys List of acquired keys
* @return void
*/
protected function releaseMutexes( MemcachedBagOStuff $memc, array $keys ) {
diff --git a/includes/filebackend/lockmanager/QuorumLockManager.php b/includes/filebackend/lockmanager/QuorumLockManager.php
new file mode 100644
index 00000000..b331b540
--- /dev/null
+++ b/includes/filebackend/lockmanager/QuorumLockManager.php
@@ -0,0 +1,230 @@
+<?php
+/**
+ * Version of LockManager that uses a quorum from peer servers for locks.
+ *
+ * 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 LockManager
+ */
+
+/**
+ * Version of LockManager that uses a quorum from peer servers for locks.
+ * The resource space can also be sharded into separate peer groups.
+ *
+ * @ingroup LockManager
+ * @since 1.20
+ */
+abstract class QuorumLockManager extends LockManager {
+ /** @var Array Map of bucket indexes to peer server lists */
+ protected $srvsByBucket = array(); // (bucket index => (lsrv1, lsrv2, ...))
+
+ /**
+ * @see LockManager::doLock()
+ * @param $paths array
+ * @param $type int
+ * @return Status
+ */
+ final protected function doLock( array $paths, $type ) {
+ $status = Status::newGood();
+
+ $pathsToLock = array(); // (bucket => paths)
+ // Get locks that need to be acquired (buckets => locks)...
+ foreach ( $paths as $path ) {
+ if ( isset( $this->locksHeld[$path][$type] ) ) {
+ ++$this->locksHeld[$path][$type];
+ } else {
+ $bucket = $this->getBucketFromPath( $path );
+ $pathsToLock[$bucket][] = $path;
+ }
+ }
+
+ $lockedPaths = array(); // files locked in this attempt
+ // Attempt to acquire these locks...
+ foreach ( $pathsToLock as $bucket => $paths ) {
+ // Try to acquire the locks for this bucket
+ $status->merge( $this->doLockingRequestBucket( $bucket, $paths, $type ) );
+ if ( !$status->isOK() ) {
+ $status->merge( $this->doUnlock( $lockedPaths, $type ) );
+ return $status;
+ }
+ // Record these locks as active
+ foreach ( $paths as $path ) {
+ $this->locksHeld[$path][$type] = 1; // locked
+ }
+ // Keep track of what locks were made in this attempt
+ $lockedPaths = array_merge( $lockedPaths, $paths );
+ }
+
+ return $status;
+ }
+
+ /**
+ * @see LockManager::doUnlock()
+ * @param $paths array
+ * @param $type int
+ * @return Status
+ */
+ final protected function doUnlock( array $paths, $type ) {
+ $status = Status::newGood();
+
+ $pathsToUnlock = array();
+ foreach ( $paths as $path ) {
+ if ( !isset( $this->locksHeld[$path][$type] ) ) {
+ $status->warning( 'lockmanager-notlocked', $path );
+ } else {
+ --$this->locksHeld[$path][$type];
+ // Reference count the locks held and release locks when zero
+ if ( $this->locksHeld[$path][$type] <= 0 ) {
+ unset( $this->locksHeld[$path][$type] );
+ $bucket = $this->getBucketFromPath( $path );
+ $pathsToUnlock[$bucket][] = $path;
+ }
+ if ( !count( $this->locksHeld[$path] ) ) {
+ unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
+ }
+ }
+ }
+
+ // Remove these specific locks if possible, or at least release
+ // all locks once this process is currently not holding any locks.
+ foreach ( $pathsToUnlock as $bucket => $paths ) {
+ $status->merge( $this->doUnlockingRequestBucket( $bucket, $paths, $type ) );
+ }
+ if ( !count( $this->locksHeld ) ) {
+ $status->merge( $this->releaseAllLocks() );
+ }
+
+ return $status;
+ }
+
+ /**
+ * Attempt to acquire locks with the peers for a bucket.
+ * This is all or nothing; if any key is locked then this totally fails.
+ *
+ * @param $bucket integer
+ * @param array $paths List of resource keys to lock
+ * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+ * @return Status
+ */
+ final protected function doLockingRequestBucket( $bucket, array $paths, $type ) {
+ $status = Status::newGood();
+
+ $yesVotes = 0; // locks made on trustable servers
+ $votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers
+ $quorum = floor( $votesLeft/2 + 1 ); // simple majority
+ // Get votes for each peer, in order, until we have enough...
+ foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
+ if ( !$this->isServerUp( $lockSrv ) ) {
+ --$votesLeft;
+ $status->warning( 'lockmanager-fail-svr-acquire', $lockSrv );
+ continue; // server down?
+ }
+ // Attempt to acquire the lock on this peer
+ $status->merge( $this->getLocksOnServer( $lockSrv, $paths, $type ) );
+ if ( !$status->isOK() ) {
+ return $status; // vetoed; resource locked
+ }
+ ++$yesVotes; // success for this peer
+ if ( $yesVotes >= $quorum ) {
+ return $status; // lock obtained
+ }
+ --$votesLeft;
+ $votesNeeded = $quorum - $yesVotes;
+ if ( $votesNeeded > $votesLeft ) {
+ break; // short-circuit
+ }
+ }
+ // At this point, we must not have met the quorum
+ $status->setResult( false );
+
+ return $status;
+ }
+
+ /**
+ * Attempt to release locks with the peers for a bucket
+ *
+ * @param $bucket integer
+ * @param array $paths List of resource keys to lock
+ * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+ * @return Status
+ */
+ final protected function doUnlockingRequestBucket( $bucket, array $paths, $type ) {
+ $status = Status::newGood();
+
+ foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
+ if ( !$this->isServerUp( $lockSrv ) ) {
+ $status->fatal( 'lockmanager-fail-svr-release', $lockSrv );
+ // Attempt to release the lock on this peer
+ } else {
+ $status->merge( $this->freeLocksOnServer( $lockSrv, $paths, $type ) );
+ }
+ }
+
+ return $status;
+ }
+
+ /**
+ * Get the bucket for resource path.
+ * This should avoid throwing any exceptions.
+ *
+ * @param $path string
+ * @return integer
+ */
+ protected function getBucketFromPath( $path ) {
+ $prefix = substr( sha1( $path ), 0, 2 ); // first 2 hex chars (8 bits)
+ return (int)base_convert( $prefix, 16, 10 ) % count( $this->srvsByBucket );
+ }
+
+ /**
+ * Check if a lock server is up
+ *
+ * @param $lockSrv string
+ * @return bool
+ */
+ abstract protected function isServerUp( $lockSrv );
+
+ /**
+ * Get a connection to a lock server and acquire locks on $paths
+ *
+ * @param $lockSrv string
+ * @param $paths array
+ * @param $type integer
+ * @return Status
+ */
+ abstract protected function getLocksOnServer( $lockSrv, array $paths, $type );
+
+ /**
+ * Get a connection to a lock server and release locks on $paths.
+ *
+ * Subclasses must effectively implement this or releaseAllLocks().
+ *
+ * @param $lockSrv string
+ * @param $paths array
+ * @param $type integer
+ * @return Status
+ */
+ abstract protected function freeLocksOnServer( $lockSrv, array $paths, $type );
+
+ /**
+ * Release all locks that this session is holding.
+ *
+ * Subclasses must effectively implement this or freeLocksOnServer().
+ *
+ * @return Status
+ */
+ abstract protected function releaseAllLocks();
+}
diff --git a/includes/filebackend/lockmanager/ScopedLock.php b/includes/filebackend/lockmanager/ScopedLock.php
new file mode 100644
index 00000000..edcb1d65
--- /dev/null
+++ b/includes/filebackend/lockmanager/ScopedLock.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Resource locking handling.
+ *
+ * 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 LockManager
+ * @author Aaron Schulz
+ */
+
+/**
+ * Self-releasing locks
+ *
+ * LockManager helper class to handle scoped locks, which
+ * release when an object is destroyed or goes out of scope.
+ *
+ * @ingroup LockManager
+ * @since 1.19
+ */
+class ScopedLock {
+ /** @var LockManager */
+ protected $manager;
+ /** @var Status */
+ protected $status;
+ /** @var Array List of resource paths*/
+ protected $paths;
+
+ protected $type; // integer lock type
+
+ /**
+ * @param $manager LockManager
+ * @param array $paths List of storage paths
+ * @param $type integer LockManager::LOCK_* constant
+ * @param $status Status
+ */
+ protected function __construct(
+ LockManager $manager, array $paths, $type, Status $status
+ ) {
+ $this->manager = $manager;
+ $this->paths = $paths;
+ $this->status = $status;
+ $this->type = $type;
+ }
+
+ /**
+ * Get a ScopedLock object representing a lock on resource paths.
+ * Any locks are released once this object goes out of scope.
+ * The status object is updated with any errors or warnings.
+ *
+ * @param $manager LockManager
+ * @param array $paths List of storage paths
+ * @param $type integer LockManager::LOCK_* constant
+ * @param $status Status
+ * @return ScopedLock|null Returns null on failure
+ */
+ public static function factory(
+ LockManager $manager, array $paths, $type, Status $status
+ ) {
+ $lockStatus = $manager->lock( $paths, $type );
+ $status->merge( $lockStatus );
+ if ( $lockStatus->isOK() ) {
+ return new self( $manager, $paths, $type, $status );
+ }
+ return null;
+ }
+
+ /**
+ * Release a scoped lock and set any errors in the attatched Status object.
+ * This is useful for early release of locks before function scope is destroyed.
+ * This is the same as setting the lock object to null.
+ *
+ * @param ScopedLock $lock
+ * @return void
+ * @since 1.21
+ */
+ public static function release( ScopedLock &$lock = null ) {
+ $lock = null;
+ }
+
+ function __destruct() {
+ $wasOk = $this->status->isOK();
+ $this->status->merge( $this->manager->unlock( $this->paths, $this->type ) );
+ if ( $wasOk ) {
+ // Make sure status is OK, despite any unlockFiles() fatals
+ $this->status->setResult( true, $this->status->value );
+ }
+ }
+}
diff --git a/includes/filerepo/FSRepo.php b/includes/filerepo/FSRepo.php
index 9c8d85dc..e49f37d2 100644
--- a/includes/filerepo/FSRepo.php
+++ b/includes/filerepo/FSRepo.php
@@ -24,9 +24,9 @@
/**
* A repository for files accessible via the local filesystem.
* Does not support database access or registration.
- *
+ *
* This is a mostly a legacy class. New uses should not be added.
- *
+ *
* @ingroup FileRepo
* @deprecated since 1.19
*/
@@ -46,6 +46,9 @@ class FSRepo extends FileRepo {
$thumbDir = isset( $info['thumbDir'] )
? $info['thumbDir']
: "{$directory}/thumb";
+ $transcodedDir = isset( $info['transcodedDir'] )
+ ? $info['transcodedDir']
+ : "{$directory}/transcoded";
$fileMode = isset( $info['fileMode'] )
? $info['fileMode']
: 0644;
@@ -59,6 +62,7 @@ class FSRepo extends FileRepo {
"{$repoName}-public" => "{$directory}",
"{$repoName}-temp" => "{$directory}/temp",
"{$repoName}-thumb" => $thumbDir,
+ "{$repoName}-transcoded" => $transcodedDir,
"{$repoName}-deleted" => $deletedDir
),
'fileMode' => $fileMode,
diff --git a/includes/filerepo/FileRepo.php b/includes/filerepo/FileRepo.php
index a31b148a..366dd8a5 100644
--- a/includes/filerepo/FileRepo.php
+++ b/includes/filerepo/FileRepo.php
@@ -120,13 +120,16 @@ class FileRepo {
$this->isPrivate = !empty( $info['isPrivate'] );
// Give defaults for the basic zones...
$this->zones = isset( $info['zones'] ) ? $info['zones'] : array();
- foreach ( array( 'public', 'thumb', 'temp', 'deleted' ) as $zone ) {
+ foreach ( array( 'public', 'thumb', 'transcoded', 'temp', 'deleted' ) as $zone ) {
if ( !isset( $this->zones[$zone]['container'] ) ) {
$this->zones[$zone]['container'] = "{$this->name}-{$zone}";
}
if ( !isset( $this->zones[$zone]['directory'] ) ) {
$this->zones[$zone]['directory'] = '';
}
+ if ( !isset( $this->zones[$zone]['urlsByExt'] ) ) {
+ $this->zones[$zone]['urlsByExt'] = array();
+ }
}
}
@@ -152,7 +155,7 @@ class FileRepo {
/**
* Check if a single zone or list of zones is defined for usage
*
- * @param $doZones Array Only do a particular zones
+ * @param array $doZones Only do a particular zones
* @throws MWException
* @return Status
*/
@@ -196,14 +199,17 @@ class FileRepo {
/**
* Get the URL corresponding to one of the four basic zones
*
- * @param $zone String: one of: public, deleted, temp, thumb
+ * @param string $zone One of: public, deleted, temp, thumb
+ * @param string|null $ext Optional file extension
* @return String or false
*/
- public function getZoneUrl( $zone ) {
- if ( isset( $this->zones[$zone]['url'] )
- && in_array( $zone, array( 'public', 'temp', 'thumb' ) ) )
- {
- return $this->zones[$zone]['url']; // custom URL
+ public function getZoneUrl( $zone, $ext = null ) {
+ if ( in_array( $zone, array( 'public', 'temp', 'thumb', 'transcoded' ) ) ) { // standard public zones
+ if ( $ext !== null && isset( $this->zones[$zone]['urlsByExt'][$ext] ) ) {
+ return $this->zones[$zone]['urlsByExt'][$ext]; // custom URL for extension/zone
+ } elseif ( isset( $this->zones[$zone]['url'] ) ) {
+ return $this->zones[$zone]['url']; // custom URL for zone
+ }
}
switch ( $zone ) {
case 'public':
@@ -214,6 +220,8 @@ class FileRepo {
return false; // no public URL
case 'thumb':
return $this->thumbUrl;
+ case 'transcoded':
+ return "{$this->url}/transcoded";
default:
return false;
}
@@ -229,12 +237,12 @@ class FileRepo {
* from the URL path, one can configure thumb_handler.php to recognize a special path on the
* same host name as the wiki that is used for viewing thumbnails.
*
- * @param $zone String: one of: public, deleted, temp, thumb
+ * @param string $zone one of: public, deleted, temp, thumb
* @return String or false
*/
public function getZoneHandlerUrl( $zone ) {
if ( isset( $this->zones[$zone]['handlerUrl'] )
- && in_array( $zone, array( 'public', 'temp', 'thumb' ) ) )
+ && in_array( $zone, array( 'public', 'temp', 'thumb', 'transcoded' ) ) )
{
return $this->zones[$zone]['handlerUrl'];
}
@@ -332,7 +340,7 @@ class FileRepo {
* version control should return false if the time is specified.
*
* @param $title Mixed: Title object or string
- * @param $options array Associative array of options:
+ * @param array $options Associative array of options:
* time: requested time for a specific file version, or false for the
* current version. An image object will be returned which was
* created at the specified time (which may be archived or current).
@@ -391,7 +399,7 @@ class FileRepo {
/**
* Find many files at once.
*
- * @param $items array An array of titles, or an array of findFile() options with
+ * @param array $items An array of titles, or an array of findFile() options with
* the "title" option giving the title. Example:
*
* $findItem = array( 'title' => $title, 'private' => true );
@@ -423,8 +431,8 @@ class FileRepo {
* Returns false if the file does not exist. Repositories not supporting
* version control should return false if the time is specified.
*
- * @param $sha1 String base 36 SHA-1 hash
- * @param $options array Option array, same as findFile().
+ * @param string $sha1 base 36 SHA-1 hash
+ * @param array $options Option array, same as findFile().
* @return File|bool False on failure
*/
public function findFileFromKey( $sha1, $options = array() ) {
@@ -468,7 +476,7 @@ class FileRepo {
* Get an array of arrays or iterators of file objects for files that
* have the given SHA-1 content hashes.
*
- * @param $hashes array An array of hashes
+ * @param array $hashes An array of hashes
* @return array An Array of arrays or iterators of file objects and the hash as key
*/
public function findBySha1s( array $hashes ) {
@@ -483,6 +491,18 @@ class FileRepo {
}
/**
+ * Return an array of files where the name starts with $prefix.
+ *
+ * STUB
+ * @param string $prefix The prefix to search for
+ * @param int $limit The maximum amount of files to return
+ * @return array
+ */
+ public function findFilesByPrefix( $prefix, $limit ) {
+ return array();
+ }
+
+ /**
* Get the public root URL of the repository
*
* @deprecated since 1.20
@@ -542,7 +562,7 @@ class FileRepo {
* Get a relative path including trailing slash, e.g. f/fa/
* If the repo is not hashed, returns an empty string
*
- * @param $name string Name of file
+ * @param string $name Name of file
* @return string
*/
public function getHashPath( $name ) {
@@ -553,7 +573,7 @@ class FileRepo {
* Get a relative path including trailing slash, e.g. f/fa/
* If the repo is not hashed, returns an empty string
*
- * @param $suffix string Basename of file from FileRepo::storeTemp()
+ * @param string $suffix Basename of file from FileRepo::storeTemp()
* @return string
*/
public function getTempHashPath( $suffix ) {
@@ -602,7 +622,7 @@ class FileRepo {
* Make an url to this repo
*
* @param $query mixed Query string to append
- * @param $entry string Entry point; defaults to index
+ * @param string $entry Entry point; defaults to index
* @return string|bool False on failure
*/
public function makeUrl( $query = '', $entry = 'index' ) {
@@ -656,8 +676,8 @@ class FileRepo {
* repository's file class, since it may return invalid results. User code
* should use File::getDescriptionText().
*
- * @param $name String: name of image to fetch
- * @param $lang String: language to fetch it in, if any.
+ * @param string $name name of image to fetch
+ * @param string $lang language to fetch it in, if any.
* @return string
*/
public function getDescriptionRenderUrl( $name, $lang = null ) {
@@ -688,7 +708,7 @@ class FileRepo {
public function getDescriptionStylesheetUrl() {
if ( isset( $this->scriptDirUrl ) ) {
return $this->makeUrl( 'title=MediaWiki:Filepage.css&' .
- wfArrayToCGI( Skin::getDynamicStylesheetQuery() ) );
+ wfArrayToCgi( Skin::getDynamicStylesheetQuery() ) );
}
return false;
}
@@ -696,9 +716,9 @@ class FileRepo {
/**
* Store a file to a given destination.
*
- * @param $srcPath String: source file system path, storage path, or virtual URL
- * @param $dstZone String: destination zone
- * @param $dstRel String: destination relative path
+ * @param string $srcPath source file system path, storage path, or virtual URL
+ * @param string $dstZone destination zone
+ * @param string $dstRel destination relative path
* @param $flags Integer: bitwise combination of the following flags:
* self::DELETE_SOURCE Delete the source file after upload
* self::OVERWRITE Overwrite an existing destination file instead of failing
@@ -721,7 +741,7 @@ class FileRepo {
/**
* Store a batch of files
*
- * @param $triplets Array: (src, dest zone, dest rel) triplets as per store()
+ * @param array $triplets (src, dest zone, dest rel) triplets as per store()
* @param $flags Integer: bitwise combination of the following flags:
* self::DELETE_SOURCE Delete the source file after upload
* self::OVERWRITE Overwrite an existing destination file instead of failing
@@ -755,7 +775,7 @@ class FileRepo {
throw new MWException( 'Validation error in $dstRel' );
}
$dstPath = "$root/$dstRel";
- $dstDir = dirname( $dstPath );
+ $dstDir = dirname( $dstPath );
// Create destination directories for this triplet
if ( !$this->initDirectory( $dstDir )->isOK() ) {
return $this->newFatal( 'directorycreateerror', $dstDir );
@@ -803,7 +823,7 @@ class FileRepo {
* Each file can be a (zone, rel) pair, virtual url, storage path.
* It will try to delete each file, but ignores any errors that may occur.
*
- * @param $files array List of files to delete
+ * @param array $files List of files to delete
* @param $flags Integer: bitwise combination of the following flags:
* self::SKIP_LOCKING Skip any file locking when doing the deletions
* @return FileRepoStatus
@@ -841,9 +861,9 @@ class FileRepo {
* This function can be used to write to otherwise read-only foreign repos.
* This is intended for copying generated thumbnails into the repo.
*
- * @param $src string Source file system path, storage path, or virtual URL
- * @param $dst string Virtual URL or storage path
- * @param $disposition string|null Content-Disposition if given and supported
+ * @param string $src Source file system path, storage path, or virtual URL
+ * @param string $dst Virtual URL or storage path
+ * @param string|null $disposition Content-Disposition if given and supported
* @return FileRepoStatus
*/
final public function quickImport( $src, $dst, $disposition = null ) {
@@ -855,7 +875,7 @@ class FileRepo {
* This function can be used to write to otherwise read-only foreign repos.
* This is intended for purging thumbnails.
*
- * @param $path string Virtual URL or storage path
+ * @param string $path Virtual URL or storage path
* @return FileRepoStatus
*/
final public function quickPurge( $path ) {
@@ -866,7 +886,7 @@ class FileRepo {
* Deletes a directory if empty.
* This function can be used to write to otherwise read-only foreign repos.
*
- * @param $dir string Virtual URL (or storage path) of directory to clean
+ * @param string $dir Virtual URL (or storage path) of directory to clean
* @return Status
*/
public function quickCleanDir( $dir ) {
@@ -886,7 +906,7 @@ class FileRepo {
* All path parameters may be a file system path, storage path, or virtual URL.
* When "dispositions" are given they are used as Content-Disposition if supported.
*
- * @param $triples Array List of (source path, destination path, disposition)
+ * @param array $triples List of (source path, destination path, disposition)
* @return FileRepoStatus
*/
public function quickImportBatch( array $triples ) {
@@ -914,7 +934,7 @@ class FileRepo {
* This function can be used to write to otherwise read-only foreign repos.
* This does no locking nor journaling and is intended for purging thumbnails.
*
- * @param $paths Array List of virtual URLs or storage paths
+ * @param array $paths List of virtual URLs or storage paths
* @return FileRepoStatus
*/
public function quickPurgeBatch( array $paths ) {
@@ -937,19 +957,18 @@ class FileRepo {
* Returns a FileRepoStatus object with the file Virtual URL in the value,
* file can later be disposed using FileRepo::freeTemp().
*
- * @param $originalName String: the base name of the file as specified
+ * @param string $originalName the base name of the file as specified
* by the user. The file extension will be maintained.
- * @param $srcPath String: the current location of the file.
+ * @param string $srcPath the current location of the file.
* @return FileRepoStatus object with the URL in the value.
*/
public function storeTemp( $originalName, $srcPath ) {
$this->assertWritableRepo(); // fail out if read-only
- $date = gmdate( "YmdHis" );
- $hashPath = $this->getHashPath( $originalName );
- $dstRel = "{$hashPath}{$date}!{$originalName}";
- $dstUrlRel = $hashPath . $date . '!' . rawurlencode( $originalName );
- $virtualUrl = $this->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
+ $date = gmdate( "YmdHis" );
+ $hashPath = $this->getHashPath( $originalName );
+ $dstUrlRel = $hashPath . $date . '!' . rawurlencode( $originalName );
+ $virtualUrl = $this->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
$result = $this->quickImport( $srcPath, $virtualUrl );
$result->value = $virtualUrl;
@@ -960,7 +979,7 @@ class FileRepo {
/**
* Remove a temporary file or mark it for garbage collection
*
- * @param $virtualUrl String: the virtual URL returned by FileRepo::storeTemp()
+ * @param string $virtualUrl the virtual URL returned by FileRepo::storeTemp()
* @return Boolean: true on success, false on failure
*/
public function freeTemp( $virtualUrl ) {
@@ -978,8 +997,8 @@ class FileRepo {
/**
* Concatenate a list of temporary files into a target file location.
*
- * @param $srcPaths Array Ordered list of source virtual URLs/storage paths
- * @param $dstPath String Target file system path
+ * @param array $srcPaths Ordered list of source virtual URLs/storage paths
+ * @param string $dstPath Target file system path
* @param $flags Integer: bitwise combination of the following flags:
* self::DELETE_SOURCE Delete the source files
* @return FileRepoStatus
@@ -1021,18 +1040,25 @@ class FileRepo {
* Returns a FileRepoStatus object. On success, the value contains "new" or
* "archived", to indicate whether the file was new with that name.
*
- * @param $srcPath String: the source file system path, storage path, or URL
- * @param $dstRel String: the destination relative path
- * @param $archiveRel String: the relative path where the existing file is to
+ * Options to $options include:
+ * - headers : name/value map of HTTP headers to use in response to GET/HEAD requests
+ *
+ * @param string $srcPath the source file system path, storage path, or URL
+ * @param string $dstRel the destination relative path
+ * @param string $archiveRel the relative path where the existing file is to
* be archived, if there is one. Relative to the public zone root.
* @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
* that the source file should be deleted if possible
+ * @param array $options Optional additional parameters
* @return FileRepoStatus
*/
- public function publish( $srcPath, $dstRel, $archiveRel, $flags = 0 ) {
+ public function publish(
+ $srcPath, $dstRel, $archiveRel, $flags = 0, array $options = array()
+ ) {
$this->assertWritableRepo(); // fail out if read-only
- $status = $this->publishBatch( array( array( $srcPath, $dstRel, $archiveRel ) ), $flags );
+ $status = $this->publishBatch(
+ array( array( $srcPath, $dstRel, $archiveRel, $options ) ), $flags );
if ( $status->successCount == 0 ) {
$status->ok = false;
}
@@ -1048,13 +1074,14 @@ class FileRepo {
/**
* Publish a batch of files
*
- * @param $triplets Array: (source, dest, archive) triplets as per publish()
+ * @param array $ntuples (source, dest, archive) triplets or
+ * (source, dest, archive, options) 4-tuples as per publish().
* @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
* that the source files should be deleted if possible
* @throws MWException
* @return FileRepoStatus
*/
- public function publishBatch( array $triplets, $flags = 0 ) {
+ public function publishBatch( array $ntuples, $flags = 0 ) {
$this->assertWritableRepo(); // fail out if read-only
$backend = $this->backend; // convenience
@@ -1069,8 +1096,9 @@ class FileRepo {
$operations = array();
$sourceFSFilesToDelete = array(); // cleanup for disk source files
// Validate each triplet and get the store operation...
- foreach ( $triplets as $i => $triplet ) {
- list( $srcPath, $dstRel, $archiveRel ) = $triplet;
+ foreach ( $ntuples as $ntuple ) {
+ list( $srcPath, $dstRel, $archiveRel ) = $ntuple;
+ $options = isset( $ntuple[3] ) ? $ntuple[3] : array();
// Resolve source to a storage path if virtual
$srcPath = $this->resolveToStoragePath( $srcPath );
if ( !$this->validateFilename( $dstRel ) ) {
@@ -1090,51 +1118,52 @@ class FileRepo {
if ( !$this->initDirectory( $dstDir )->isOK() ) {
return $this->newFatal( 'directorycreateerror', $dstDir );
}
- if ( !$this->initDirectory($archiveDir )->isOK() ) {
+ if ( !$this->initDirectory( $archiveDir )->isOK() ) {
return $this->newFatal( 'directorycreateerror', $archiveDir );
}
- // Archive destination file if it exists
- if ( $backend->fileExists( array( 'src' => $dstPath ) ) ) {
- // Check if the archive file exists
- // This is a sanity check to avoid data loss. In UNIX, the rename primitive
- // unlinks the destination file if it exists. DB-based synchronisation in
- // publishBatch's caller should prevent races. In Windows there's no
- // problem because the rename primitive fails if the destination exists.
- if ( $backend->fileExists( array( 'src' => $archivePath ) ) ) {
- $operations[] = array( 'op' => 'null' );
- continue;
- } else {
- $operations[] = array(
- 'op' => 'move',
- 'src' => $dstPath,
- 'dst' => $archivePath
- );
- }
- $status->value[$i] = 'archived';
- } else {
- $status->value[$i] = 'new';
- }
+ // Set any desired headers to be use in GET/HEAD responses
+ $headers = isset( $options['headers'] ) ? $options['headers'] : array();
+
+ // Archive destination file if it exists.
+ // This will check if the archive file also exists and fail if does.
+ // This is a sanity check to avoid data loss. On Windows and Linux,
+ // copy() will overwrite, so the existence check is vulnerable to
+ // race conditions unless an functioning LockManager is used.
+ // LocalFile also uses SELECT FOR UPDATE for synchronization.
+ $operations[] = array(
+ 'op' => 'copy',
+ 'src' => $dstPath,
+ 'dst' => $archivePath,
+ 'ignoreMissingSource' => true
+ );
+
// Copy (or move) the source file to the destination
if ( FileBackend::isStoragePath( $srcPath ) ) {
if ( $flags & self::DELETE_SOURCE ) {
$operations[] = array(
- 'op' => 'move',
- 'src' => $srcPath,
- 'dst' => $dstPath
+ 'op' => 'move',
+ 'src' => $srcPath,
+ 'dst' => $dstPath,
+ 'overwrite' => true, // replace current
+ 'headers' => $headers
);
} else {
$operations[] = array(
- 'op' => 'copy',
- 'src' => $srcPath,
- 'dst' => $dstPath
+ 'op' => 'copy',
+ 'src' => $srcPath,
+ 'dst' => $dstPath,
+ 'overwrite' => true, // replace current
+ 'headers' => $headers
);
}
} else { // FS source path
$operations[] = array(
- 'op' => 'store',
- 'src' => $srcPath,
- 'dst' => $dstPath
+ 'op' => 'store',
+ 'src' => $srcPath,
+ 'dst' => $dstPath,
+ 'overwrite' => true, // replace current
+ 'headers' => $headers
);
if ( $flags & self::DELETE_SOURCE ) {
$sourceFSFilesToDelete[] = $srcPath;
@@ -1143,8 +1172,17 @@ class FileRepo {
}
// Execute the operations for each triplet
- $opts = array( 'force' => true );
- $status->merge( $backend->doOperations( $operations, $opts ) );
+ $status->merge( $backend->doOperations( $operations ) );
+ // Find out which files were archived...
+ foreach ( $ntuples as $i => $ntuple ) {
+ list( , , $archiveRel ) = $ntuple;
+ $archivePath = $this->getZonePath( 'public' ) . "/$archiveRel";
+ if ( $this->fileExists( $archivePath ) ) {
+ $status->value[$i] = 'archived';
+ } else {
+ $status->value[$i] = 'new';
+ }
+ }
// Cleanup for disk source files...
foreach ( $sourceFSFilesToDelete as $file ) {
wfSuppressWarnings();
@@ -1159,12 +1197,12 @@ class FileRepo {
* Creates a directory with the appropriate zone permissions.
* Callers are responsible for doing read-only and "writable repo" checks.
*
- * @param $dir string Virtual URL (or storage path) of directory to clean
+ * @param string $dir Virtual URL (or storage path) of directory to clean
* @return Status
*/
protected function initDirectory( $dir ) {
$path = $this->resolveToStoragePath( $dir );
- list( $b, $container, $r ) = FileBackend::splitStoragePath( $path );
+ list( , $container, ) = FileBackend::splitStoragePath( $path );
$params = array( 'dir' => $path );
if ( $this->isPrivate || $container === $this->zones['deleted']['container'] ) {
@@ -1179,7 +1217,7 @@ class FileRepo {
/**
* Deletes a directory if empty.
*
- * @param $dir string Virtual URL (or storage path) of directory to clean
+ * @param string $dir Virtual URL (or storage path) of directory to clean
* @return Status
*/
public function cleanDir( $dir ) {
@@ -1195,7 +1233,7 @@ class FileRepo {
/**
* Checks existence of a a file
*
- * @param $file string Virtual URL (or storage path) of file to check
+ * @param string $file Virtual URL (or storage path) of file to check
* @return bool
*/
public function fileExists( $file ) {
@@ -1206,7 +1244,7 @@ class FileRepo {
/**
* Checks existence of an array of files.
*
- * @param $files Array: Virtual URLs (or storage paths) of files to check
+ * @param array $files Virtual URLs (or storage paths) of files to check
* @return array|bool Either array of files and existence flags, or false
*/
public function fileExistsBatch( array $files ) {
@@ -1244,7 +1282,7 @@ class FileRepo {
* assumes a naming scheme in the deleted zone based on content hash, as
* opposed to the public zone which is assumed to be unique.
*
- * @param $sourceDestPairs Array of source/destination pairs. Each element
+ * @param array $sourceDestPairs of source/destination pairs. Each element
* is a two-element array containing the source file path relative to the
* public root in the first element, and the archive file path relative
* to the deleted zone root in the second element.
@@ -1318,9 +1356,13 @@ class FileRepo {
* e.g. s/z/a/ for sza251lrxrc1jad41h5mgilp8nysje52.jpg
*
* @param $key string
+ * @throws MWException
* @return string
*/
public function getDeletedHashPath( $key ) {
+ if ( strlen( $key ) < 31 ) {
+ throw new MWException( "Invalid storage key '$key'." );
+ }
$path = '';
for ( $i = 0; $i < $this->deletedHashLevels; $i++ ) {
$path .= $key[$i] . '/';
@@ -1392,6 +1434,17 @@ class FileRepo {
}
/**
+ * Get the size of a file with a given virtual URL/storage path
+ *
+ * @param $virtualUrl string
+ * @return integer|bool False on failure
+ */
+ public function getFileSize( $virtualUrl ) {
+ $path = $this->resolveToStoragePath( $virtualUrl );
+ return $this->backend->getFileSize( array( 'src' => $path ) );
+ }
+
+ /**
* Get the sha1 (base 36) of a file with a given virtual URL/storage path
*
* @param $virtualUrl string
@@ -1406,7 +1459,7 @@ class FileRepo {
* Attempt to stream a file with the given virtual URL/storage path
*
* @param $virtualUrl string
- * @param $headers Array Additional HTTP headers to send on success
+ * @param array $headers Additional HTTP headers to send on success
* @return bool Success
*/
public function streamFile( $virtualUrl, $headers = array() ) {
@@ -1568,7 +1621,7 @@ class FileRepo {
*/
public function nameForThumb( $name ) {
if ( strlen( $name ) > $this->abbrvThreshold ) {
- $ext = FileBackend::extensionFromPath( $name );
+ $ext = FileBackend::extensionFromPath( $name );
$name = ( $ext == '' ) ? 'thumbnail' : "thumbnail.$ext";
}
return $name;
@@ -1630,10 +1683,17 @@ class FileRepo {
'directory' => ( $this->zones['thumb']['directory'] == '' )
? 'temp'
: $this->zones['thumb']['directory'] . '/temp'
+ ),
+ 'transcoded' => array(
+ 'container' => $this->zones['transcoded']['container'],
+ 'directory' => ( $this->zones['transcoded']['directory'] == '' )
+ ? 'temp'
+ : $this->zones['transcoded']['directory'] . '/temp'
)
),
'url' => $this->getZoneUrl( 'temp' ),
'thumbUrl' => $this->getZoneUrl( 'thumb' ) . '/temp',
+ 'transcodedUrl' => $this->getZoneUrl( 'transcoded' ) . '/temp',
'hashLevels' => $this->hashLevels // performance
) );
}
@@ -1641,10 +1701,11 @@ class FileRepo {
/**
* Get an UploadStash associated with this repo.
*
+ * @param $user User
* @return UploadStash
*/
- public function getUploadStash() {
- return new UploadStash( $this );
+ public function getUploadStash( User $user = null ) {
+ return new UploadStash( $this, $user );
}
/**
diff --git a/includes/filerepo/ForeignAPIRepo.php b/includes/filerepo/ForeignAPIRepo.php
index 13de9e6b..ba574da1 100644
--- a/includes/filerepo/ForeignAPIRepo.php
+++ b/includes/filerepo/ForeignAPIRepo.php
@@ -247,10 +247,10 @@ class ForeignAPIRepo extends FileRepo {
* If the url has been requested today, get it from cache
* Otherwise retrieve remote thumb url, check for local file.
*
- * @param $name String is a dbkey form of a title
+ * @param string $name is a dbkey form of a title
* @param $width
* @param $height
- * @param String $params Other rendering parameters (page number, etc) from handler's makeParamString.
+ * @param string $params Other rendering parameters (page number, etc) from handler's makeParamString.
* @return bool|string
*/
function getThumbUrlFromCache( $name, $width, $height, $params = "" ) {
@@ -267,14 +267,14 @@ class ForeignAPIRepo extends FileRepo {
$sizekey = "$width:$height:$params";
/* Get the array of urls that we already know */
- $knownThumbUrls = $wgMemc->get($key);
+ $knownThumbUrls = $wgMemc->get( $key );
if( !$knownThumbUrls ) {
/* No knownThumbUrls for this file */
$knownThumbUrls = array();
} else {
if( isset( $knownThumbUrls[$sizekey] ) ) {
wfDebug( __METHOD__ . ': Got thumburl from local cache: ' .
- "{$knownThumbUrls[$sizekey]} \n");
+ "{$knownThumbUrls[$sizekey]} \n" );
return $knownThumbUrls[$sizekey];
}
/* This size is not yet known */
@@ -294,9 +294,9 @@ class ForeignAPIRepo extends FileRepo {
wfDebug( __METHOD__ . " The deduced filename $fileName is not safe\n" );
return false;
}
- $localPath = $this->getZonePath( 'thumb' ) . "/" . $this->getHashPath( $name ) . $name;
+ $localPath = $this->getZonePath( 'thumb' ) . "/" . $this->getHashPath( $name ) . $name;
$localFilename = $localPath . "/" . $fileName;
- $localUrl = $this->getZoneUrl( 'thumb' ) . "/" . $this->getHashPath( $name ) . rawurlencode( $name ) . "/" . rawurlencode( $fileName );
+ $localUrl = $this->getZoneUrl( 'thumb' ) . "/" . $this->getHashPath( $name ) . rawurlencode( $name ) . "/" . rawurlencode( $fileName );
if( $backend->fileExists( array( 'src' => $localFilename ) )
&& isset( $metadata['timestamp'] ) )
@@ -320,7 +320,6 @@ class ForeignAPIRepo extends FileRepo {
return false;
}
-
# @todo FIXME: Delete old thumbs that aren't being used. Maintenance script?
$backend->prepare( array( 'dir' => dirname( $localFilename ) ) );
$params = array( 'dst' => $localFilename, 'content' => $thumb );
@@ -337,16 +336,17 @@ class ForeignAPIRepo extends FileRepo {
/**
* @see FileRepo::getZoneUrl()
* @param $zone String
+ * @param string|null $ext Optional file extension
* @return String
*/
- function getZoneUrl( $zone ) {
+ function getZoneUrl( $zone, $ext = null ) {
switch ( $zone ) {
case 'public':
return $this->url;
case 'thumb':
return $this->thumbUrl;
default:
- return parent::getZoneUrl( $zone );
+ return parent::getZoneUrl( $zone, $ext );
}
}
diff --git a/includes/filerepo/ForeignDBRepo.php b/includes/filerepo/ForeignDBRepo.php
index 4b206c3d..18659852 100644
--- a/includes/filerepo/ForeignDBRepo.php
+++ b/includes/filerepo/ForeignDBRepo.php
@@ -86,7 +86,7 @@ class ForeignDBRepo extends LocalRepo {
/**
* Get a key on the primary cache for this repository.
- * Returns false if the repository's cache is not accessible at this site.
+ * Returns false if the repository's cache is not accessible at this site.
* The parameters are the parts of the key, as for wfMemcKey().
* @return bool|mixed
*/
diff --git a/includes/filerepo/ForeignDBViaLBRepo.php b/includes/filerepo/ForeignDBViaLBRepo.php
index bd76fce7..7951fb13 100644
--- a/includes/filerepo/ForeignDBViaLBRepo.php
+++ b/includes/filerepo/ForeignDBViaLBRepo.php
@@ -61,7 +61,7 @@ class ForeignDBViaLBRepo extends LocalRepo {
/**
* Get a key on the primary cache for this repository.
- * Returns false if the repository's cache is not accessible at this site.
+ * Returns false if the repository's cache is not accessible at this site.
* The parameters are the parts of the key, as for wfMemcKey().
* @return bool|string
*/
diff --git a/includes/filerepo/LocalRepo.php b/includes/filerepo/LocalRepo.php
index 0954422d..be11b233 100644
--- a/includes/filerepo/LocalRepo.php
+++ b/includes/filerepo/LocalRepo.php
@@ -103,8 +103,8 @@ class LocalRepo extends FileRepo {
/**
* Check if a deleted (filearchive) file has this sha1 key
*
- * @param $key String File storage key (base-36 sha1 key with file extension)
- * @param $lock String|null Use "lock" to lock the row via FOR UPDATE
+ * @param string $key File storage key (base-36 sha1 key with file extension)
+ * @param string|null $lock Use "lock" to lock the row via FOR UPDATE
* @return bool File with this key is in use
*/
protected function deletedFileHasKey( $key, $lock = null ) {
@@ -120,8 +120,8 @@ class LocalRepo extends FileRepo {
/**
* Check if a hidden (revision delete) file has this sha1 key
*
- * @param $key String File storage key (base-36 sha1 key with file extension)
- * @param $lock String|null Use "lock" to lock the row via FOR UPDATE
+ * @param string $key File storage key (base-36 sha1 key with file extension)
+ * @param string|null $lock Use "lock" to lock the row via FOR UPDATE
* @return bool File with this key is in use
*/
protected function hiddenFileHasKey( $key, $lock = null ) {
@@ -168,7 +168,7 @@ class LocalRepo extends FileRepo {
$expiry = 86400; // has invalidation, 1 day
}
$cachedValue = $wgMemc->get( $memcKey );
- if ( $cachedValue === ' ' || $cachedValue === '' ) {
+ if ( $cachedValue === ' ' || $cachedValue === '' ) {
// Does not exist
return false;
} elseif ( strval( $cachedValue ) !== '' ) {
@@ -212,12 +212,12 @@ class LocalRepo extends FileRepo {
$dbr = $this->getSlaveDB();
$id = $dbr->selectField(
'page', // Table
- 'page_id', //Field
- array( //Conditions
+ 'page_id', //Field
+ array( //Conditions
'page_namespace' => $title->getNamespace(),
'page_title' => $title->getDBkey(),
),
- __METHOD__ //Function name
+ __METHOD__ //Function name
);
return $id;
}
@@ -226,7 +226,7 @@ class LocalRepo extends FileRepo {
* Get an array or iterator of file objects for files that have a given
* SHA-1 content hash.
*
- * @param $hash String a sha1 hash to look for
+ * @param string $hash a sha1 hash to look for
* @return Array
*/
function findBySha1( $hash ) {
@@ -238,7 +238,7 @@ class LocalRepo extends FileRepo {
__METHOD__,
array( 'ORDER BY' => 'img_name' )
);
-
+
$result = array();
foreach ( $res as $row ) {
$result[] = $this->newFileFromRow( $row );
@@ -254,7 +254,7 @@ class LocalRepo extends FileRepo {
*
* Overrides generic implementation in FileRepo for performance reason
*
- * @param $hashes array An array of hashes
+ * @param array $hashes An array of hashes
* @return array An Array of arrays or iterators of file objects and the hash as key
*/
function findBySha1s( array $hashes ) {
@@ -281,6 +281,34 @@ class LocalRepo extends FileRepo {
return $result;
}
+ /**
+ * Return an array of files where the name starts with $prefix.
+ *
+ * @param string $prefix The prefix to search for
+ * @param int $limit The maximum amount of files to return
+ * @return array
+ */
+ public function findFilesByPrefix( $prefix, $limit ) {
+ $selectOptions = array( 'ORDER BY' => 'img_name', 'LIMIT' => intval( $limit ) );
+
+ // Query database
+ $dbr = $this->getSlaveDB();
+ $res = $dbr->select(
+ 'image',
+ LocalFile::selectFields(),
+ 'img_name ' . $dbr->buildLike( $prefix, $dbr->anyString() ),
+ __METHOD__,
+ $selectOptions
+ );
+
+ // Build file objects
+ $files = array();
+ foreach ( $res as $row ) {
+ $files[] = $this->newFileFromRow( $row );
+ }
+ return $files;
+ }
+
/**
* Get a connection to the slave DB
* @return DatabaseBase
@@ -299,7 +327,7 @@ class LocalRepo extends FileRepo {
/**
* Get a key on the primary cache for this repository.
- * Returns false if the repository's cache is not accessible at this site.
+ * Returns false if the repository's cache is not accessible at this site.
* The parameters are the parts of the key, as for wfMemcKey().
*
* @return string
@@ -323,4 +351,3 @@ class LocalRepo extends FileRepo {
}
}
}
-
diff --git a/includes/filerepo/README b/includes/filerepo/README
index 885a1ded..1423d359 100644
--- a/includes/filerepo/README
+++ b/includes/filerepo/README
@@ -18,10 +18,10 @@ repository-specific configuration is needed, or in static members of File or
FileRepo, where no such configuration is needed.
File objects are generated by a factory function from the repository. The
-repository thus has full control over the behaviour of its subsidiary file
+repository thus has full control over the behavior of its subsidiary file
class, since it can subclass the file class and override functionality at its
whim. Thus there is no need for the File subclass to query its parent repository
-for information about repository-class-dependent behaviour -- the file subclass
+for information about repository-class-dependent behavior -- the file subclass
is generally fully aware of the static preferences of its repository. Limited
exceptions can be made to this rule to permit sharing of functions, or perhaps
even entire classes, between repositories.
@@ -39,22 +39,3 @@ LocalRepo.php. LocalRepo provides only file access, and LocalFile provides
database access and higher-level functions such as cache management.
Tim Starling, June 2007
-
-Structure:
-
-File defines an abstract class File.
- ForeignAPIFile extends File.
- LocalFile extends File.
- ForeignDBFile extends LocalFile
- Image extends LocalFile
- UnregisteredLocalFile extends File.
- UploadStashFile extends UnregisteredLocalFile.
-FileRepo defines an abstract class FileRepo.
- ForeignAPIRepo extends FileRepo
- FSRepo extends FileRepo
- LocalRepo extends FSRepo
- ForeignDBRepo extends LocalRepo
- ForeignDBViaLBRepo extends LocalRepo
- NullRepo extends FileRepo
-
-Russ Nelson, March 2011
diff --git a/includes/filerepo/RepoGroup.php b/includes/filerepo/RepoGroup.php
index f9e57599..02dfdad6 100644
--- a/includes/filerepo/RepoGroup.php
+++ b/includes/filerepo/RepoGroup.php
@@ -79,8 +79,8 @@ class RepoGroup {
/**
* Construct a group of file repositories.
*
- * @param $localInfo array Associative array for local repo's info
- * @param $foreignInfo Array of repository info arrays.
+ * @param array $localInfo Associative array for local repo's info
+ * @param array $foreignInfo of repository info arrays.
* Each info array is an associative array with the 'class' member
* giving the class name. The entire array is passed to the repository
* constructor as the first parameter.
@@ -96,7 +96,7 @@ class RepoGroup {
* You can also use wfFindFile() to do this.
*
* @param $title Title|string Title object or string
- * @param $options array Associative array of options:
+ * @param array $options Associative array of options:
* time: requested time for an archived image, or false for the
* current version. An image object will be returned which was
* created at the specified time.
@@ -131,7 +131,7 @@ class RepoGroup {
$time = isset( $options['time'] ) ? $options['time'] : '';
$dbkey = $title->getDBkey();
if ( isset( $this->cache[$dbkey][$time] ) ) {
- wfDebug( __METHOD__.": got File:$dbkey from process cache\n" );
+ wfDebug( __METHOD__ . ": got File:$dbkey from process cache\n" );
# Move it to the end of the list so that we can delete the LRU entry later
$this->pingCache( $dbkey );
# Return the entry
@@ -225,8 +225,8 @@ class RepoGroup {
* Find an instance of the file with this key, created at the specified time
* Returns false if the file does not exist.
*
- * @param $hash String base 36 SHA-1 hash
- * @param $options array Option array, same as findFile()
+ * @param string $hash base 36 SHA-1 hash
+ * @param array $options Option array, same as findFile()
* @return File object or false if it is not found
*/
function findFileFromKey( $hash, $options = array() ) {
@@ -247,7 +247,7 @@ class RepoGroup {
/**
* Find all instances of files with this key
*
- * @param $hash String base 36 SHA-1 hash
+ * @param string $hash base 36 SHA-1 hash
* @return Array of File objects
*/
function findBySha1( $hash ) {
@@ -266,7 +266,7 @@ class RepoGroup {
/**
* Find all instances of files with this keys
*
- * @param $hashes Array base 36 SHA-1 hashes
+ * @param array $hashes base 36 SHA-1 hashes
* @return Array of array of File objects
*/
function findBySha1s( array $hashes ) {
@@ -335,7 +335,7 @@ class RepoGroup {
* first parameter.
*
* @param $callback Callback: the function to call
- * @param $params Array: optional additional parameters to pass to the function
+ * @param array $params optional additional parameters to pass to the function
* @return bool
*/
function forEachForeignRepo( $callback, $params = array() ) {
@@ -388,12 +388,12 @@ class RepoGroup {
*/
function splitVirtualUrl( $url ) {
if ( substr( $url, 0, 9 ) != 'mwrepo://' ) {
- throw new MWException( __METHOD__.': unknown protocol' );
+ throw new MWException( __METHOD__ . ': unknown protocol' );
}
$bits = explode( '/', substr( $url, 9 ), 3 );
if ( count( $bits ) != 3 ) {
- throw new MWException( __METHOD__.": invalid mwrepo URL: $url" );
+ throw new MWException( __METHOD__ . ": invalid mwrepo URL: $url" );
}
return $bits;
}
@@ -433,7 +433,7 @@ class RepoGroup {
while ( count( $this->cache ) >= self::MAX_CACHE_SIZE ) {
reset( $this->cache );
$key = key( $this->cache );
- wfDebug( __METHOD__.": evicting $key\n" );
+ wfDebug( __METHOD__ . ": evicting $key\n" );
unset( $this->cache[$key] );
}
}
diff --git a/includes/filerepo/file/ArchivedFile.php b/includes/filerepo/file/ArchivedFile.php
index c5a0bd1b..3f786197 100644
--- a/includes/filerepo/file/ArchivedFile.php
+++ b/includes/filerepo/file/ArchivedFile.php
@@ -47,6 +47,7 @@ class ArchivedFile {
$timestamp, # time of upload
$dataLoaded, # Whether or not all this has been loaded from the database (loadFromXxx)
$deleted, # Bitfield akin to rev_deleted
+ $sha1, # sha1 hash of file content
$pageCount,
$archive_name;
@@ -67,7 +68,7 @@ class ArchivedFile {
* @param int $id
* @param string $key
*/
- function __construct( $title, $id=0, $key='' ) {
+ function __construct( $title, $id = 0, $key = '' ) {
$this->id = -1;
$this->title = false;
$this->name = false;
@@ -87,17 +88,18 @@ class ArchivedFile {
$this->deleted = 0;
$this->dataLoaded = false;
$this->exists = false;
+ $this->sha1 = '';
if( $title instanceof Title ) {
$this->title = File::normalizeTitle( $title, 'exception' );
$this->name = $title->getDBkey();
}
- if ($id) {
+ if ( $id ) {
$this->id = $id;
}
- if ($key) {
+ if ( $key ) {
$this->key = $key;
}
@@ -108,6 +110,7 @@ class ArchivedFile {
/**
* Loads a file object from the filearchive table
+ * @throws MWException
* @return bool|null True on success or null
*/
public function load() {
@@ -127,64 +130,30 @@ class ArchivedFile {
$conds['fa_name'] = $this->title->getDBkey();
}
- if( !count($conds)) {
+ if( !count( $conds ) ) {
throw new MWException( "No specific information for retrieving archived file" );
}
if( !$this->title || $this->title->getNamespace() == NS_FILE ) {
+ $this->dataLoaded = true; // set it here, to have also true on miss
$dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'filearchive',
- array(
- 'fa_id',
- 'fa_name',
- 'fa_archive_name',
- 'fa_storage_key',
- 'fa_storage_group',
- 'fa_size',
- 'fa_bits',
- 'fa_width',
- 'fa_height',
- 'fa_metadata',
- 'fa_media_type',
- 'fa_major_mime',
- 'fa_minor_mime',
- 'fa_description',
- 'fa_user',
- 'fa_user_text',
- 'fa_timestamp',
- 'fa_deleted' ),
+ $row = $dbr->selectRow(
+ 'filearchive',
+ self::selectFields(),
$conds,
__METHOD__,
- array( 'ORDER BY' => 'fa_timestamp DESC' ) );
- if ( $res == false || $dbr->numRows( $res ) == 0 ) {
- // this revision does not exist?
+ array( 'ORDER BY' => 'fa_timestamp DESC' )
+ );
+ if ( !$row ) {
+ // this revision does not exist?
return null;
}
- $ret = $dbr->resultObject( $res );
- $row = $ret->fetchObject();
// initialize fields for filestore image object
- $this->id = intval($row->fa_id);
- $this->name = $row->fa_name;
- $this->archive_name = $row->fa_archive_name;
- $this->group = $row->fa_storage_group;
- $this->key = $row->fa_storage_key;
- $this->size = $row->fa_size;
- $this->bits = $row->fa_bits;
- $this->width = $row->fa_width;
- $this->height = $row->fa_height;
- $this->metadata = $row->fa_metadata;
- $this->mime = "$row->fa_major_mime/$row->fa_minor_mime";
- $this->media_type = $row->fa_media_type;
- $this->description = $row->fa_description;
- $this->user = $row->fa_user;
- $this->user_text = $row->fa_user_text;
- $this->timestamp = $row->fa_timestamp;
- $this->deleted = $row->fa_deleted;
+ $this->loadFromRow( $row );
} else {
throw new MWException( 'This title does not correspond to an image page.' );
}
- $this->dataLoaded = true;
$this->exists = true;
return true;
@@ -199,26 +168,68 @@ class ArchivedFile {
*/
public static function newFromRow( $row ) {
$file = new ArchivedFile( Title::makeTitle( NS_FILE, $row->fa_name ) );
+ $file->loadFromRow( $row );
+ return $file;
+ }
- $file->id = intval($row->fa_id);
- $file->name = $row->fa_name;
- $file->archive_name = $row->fa_archive_name;
- $file->group = $row->fa_storage_group;
- $file->key = $row->fa_storage_key;
- $file->size = $row->fa_size;
- $file->bits = $row->fa_bits;
- $file->width = $row->fa_width;
- $file->height = $row->fa_height;
- $file->metadata = $row->fa_metadata;
- $file->mime = "$row->fa_major_mime/$row->fa_minor_mime";
- $file->media_type = $row->fa_media_type;
- $file->description = $row->fa_description;
- $file->user = $row->fa_user;
- $file->user_text = $row->fa_user_text;
- $file->timestamp = $row->fa_timestamp;
- $file->deleted = $row->fa_deleted;
+ /**
+ * Fields in the filearchive table
+ * @return array
+ */
+ static function selectFields() {
+ return array(
+ 'fa_id',
+ 'fa_name',
+ 'fa_archive_name',
+ 'fa_storage_key',
+ 'fa_storage_group',
+ 'fa_size',
+ 'fa_bits',
+ 'fa_width',
+ 'fa_height',
+ 'fa_metadata',
+ 'fa_media_type',
+ 'fa_major_mime',
+ 'fa_minor_mime',
+ 'fa_description',
+ 'fa_user',
+ 'fa_user_text',
+ 'fa_timestamp',
+ 'fa_deleted',
+ 'fa_sha1',
+ );
+ }
- return $file;
+ /**
+ * Load ArchivedFile object fields from a DB row.
+ *
+ * @param $row Object database row
+ * @since 1.21
+ */
+ public function loadFromRow( $row ) {
+ $this->id = intval( $row->fa_id );
+ $this->name = $row->fa_name;
+ $this->archive_name = $row->fa_archive_name;
+ $this->group = $row->fa_storage_group;
+ $this->key = $row->fa_storage_key;
+ $this->size = $row->fa_size;
+ $this->bits = $row->fa_bits;
+ $this->width = $row->fa_width;
+ $this->height = $row->fa_height;
+ $this->metadata = $row->fa_metadata;
+ $this->mime = "$row->fa_major_mime/$row->fa_minor_mime";
+ $this->media_type = $row->fa_media_type;
+ $this->description = $row->fa_description;
+ $this->user = $row->fa_user;
+ $this->user_text = $row->fa_user_text;
+ $this->timestamp = $row->fa_timestamp;
+ $this->deleted = $row->fa_deleted;
+ if( isset( $row->fa_sha1 ) ) {
+ $this->sha1 = $row->fa_sha1;
+ } else {
+ // old row, populate from key
+ $this->sha1 = LocalRepo::getHashFromKey( $this->key );
+ }
}
/**
@@ -381,6 +392,17 @@ class ArchivedFile {
}
/**
+ * Get the SHA-1 base 36 hash of the file
+ *
+ * @return string
+ * @since 1.21
+ */
+ function getSha1() {
+ $this->load();
+ return $this->sha1;
+ }
+
+ /**
* Return the user ID of the uploader.
*
* @return int
diff --git a/includes/filerepo/file/File.php b/includes/filerepo/file/File.php
index 557609d4..cecd0aee 100644
--- a/includes/filerepo/file/File.php
+++ b/includes/filerepo/file/File.php
@@ -40,7 +40,7 @@
* never name a file class explictly outside of the repo class. Instead use the
* repo's factory functions to generate file objects, for example:
*
- * RepoGroup::singleton()->getLocalRepo()->newFile($title);
+ * RepoGroup::singleton()->getLocalRepo()->newFile( $title );
*
* The convenience functions wfLocalFile() and wfFindFile() should be sufficient
* in most cases.
@@ -54,7 +54,7 @@ abstract class File {
const DELETED_RESTRICTED = 8;
/** Force rendering in the current process */
- const RENDER_NOW = 1;
+ const RENDER_NOW = 1;
/**
* Force rendering even if thumbnail already exist and using RENDER_NOW
* I.e. you have to pass both flags: File::RENDER_NOW | File::RENDER_FORCE
@@ -152,7 +152,7 @@ abstract class File {
* valid Title object with namespace NS_FILE or null
*
* @param $title Title|string
- * @param $exception string|bool Use 'exception' to throw an error on bad titles
+ * @param string|bool $exception Use 'exception' to throw an error on bad titles
* @throws MWException
* @return Title|null
*/
@@ -190,7 +190,7 @@ abstract class File {
* Normalize a file extension to the common form, and ensure it's clean.
* Extensions with non-alphanumeric characters will be discarded.
*
- * @param $ext string (without the .)
+ * @param string $ext (without the .)
* @return string
*/
static function normalizeExtension( $ext ) {
@@ -214,7 +214,7 @@ abstract class File {
* Checks if file extensions are compatible
*
* @param $old File Old file
- * @param $new string New name
+ * @param string $new New name
*
* @return bool|null
*/
@@ -316,7 +316,8 @@ abstract class File {
public function getUrl() {
if ( !isset( $this->url ) ) {
$this->assertRepoDefined();
- $this->url = $this->repo->getZoneUrl( 'public' ) . '/' . $this->getUrlRel();
+ $ext = $this->getExtension();
+ $this->url = $this->repo->getZoneUrl( 'public', $ext ) . '/' . $this->getUrlRel();
}
return $this->url;
}
@@ -347,7 +348,7 @@ abstract class File {
if ( $this->canRender() ) {
return $this->createThumb( $this->getWidth() );
} else {
- wfDebug( __METHOD__.': supposed to render ' . $this->getName() .
+ wfDebug( __METHOD__ . ': supposed to render ' . $this->getName() .
' (' . $this->getMimeType() . "), but can't!\n" );
return $this->getURL(); #hm... return NULL?
}
@@ -368,7 +369,7 @@ abstract class File {
* returns false.
*
* @return string|bool ForeignAPIFile::getPath can return false
- */
+ */
public function getPath() {
if ( !isset( $this->path ) ) {
$this->assertRepoDefined();
@@ -431,7 +432,7 @@ abstract class File {
* Returns ID or name of user who uploaded the file
* STUB
*
- * @param $type string 'text' or 'id'
+ * @param string $type 'text' or 'id'
*
* @return string|int
*/
@@ -511,12 +512,12 @@ abstract class File {
}
/**
- * get versioned metadata
- *
- * @param $metadata Mixed Array or String of (serialized) metadata
- * @param $version integer version number.
- * @return Array containing metadata, or what was passed to it on fail (unserializing if not array)
- */
+ * get versioned metadata
+ *
+ * @param $metadata Mixed Array or String of (serialized) metadata
+ * @param $version integer version number.
+ * @return Array containing metadata, or what was passed to it on fail (unserializing if not array)
+ */
public function convertMetadataVersion($metadata, $version) {
$handler = $this->getHandler();
if ( !is_array( $metadata ) ) {
@@ -662,13 +663,13 @@ abstract class File {
if ( $this->allowInlineDisplay() ) {
return true;
}
- if ($this->isTrustedFile()) {
+ if ( $this->isTrustedFile() ) {
return true;
}
$type = $this->getMediaType();
$mime = $this->getMimeType();
- #wfDebug("LocalFile::isSafeFile: type= $type, mime= $mime\n");
+ #wfDebug( "LocalFile::isSafeFile: type= $type, mime= $mime\n" );
if ( !$type || $type === MEDIATYPE_UNKNOWN ) {
return false; #unknown type, not trusted
@@ -766,7 +767,7 @@ abstract class File {
* Use File::THUMB_FULL_NAME to always get a name like "<params>-<source>".
* Otherwise, the format may be "<params>-<source>" or "<params>-thumbnail.<ext>".
*
- * @param $params Array: handler-specific parameters
+ * @param array $params handler-specific parameters
* @param $flags integer Bitfield that supports THUMB_* constants
* @return string
*/
@@ -831,8 +832,8 @@ abstract class File {
/**
* Return either a MediaTransformError or placeholder thumbnail (if $wgIgnoreImageErrors)
*
- * @param $thumbPath string Thumbnail storage path
- * @param $thumbUrl string Thumbnail URL
+ * @param string $thumbPath Thumbnail storage path
+ * @param string $thumbUrl Thumbnail URL
* @param $params Array
* @param $flags integer
* @return MediaTransformOutput
@@ -841,7 +842,7 @@ abstract class File {
global $wgIgnoreImageErrors;
if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
- return $this->handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
+ return $this->getHandler()->getTransform( $this, $thumbPath, $thumbUrl, $params );
} else {
return new MediaTransformError( 'thumbnail_error',
$params['width'], 0, wfMessage( 'thumbnail-dest-create' )->text() );
@@ -851,7 +852,7 @@ abstract class File {
/**
* Transform a media file
*
- * @param $params Array: an associative array of handler-specific parameters.
+ * @param array $params an associative array of handler-specific parameters.
* Typical keys are width, height and page.
* @param $flags Integer: a bitfield, may contain self::RENDER_NOW to force rendering
* @return MediaTransformOutput|bool False on failure
@@ -872,17 +873,18 @@ abstract class File {
$params['descriptionUrl'] = wfExpandUrl( $descriptionUrl, PROTO_CANONICAL );
}
+ $handler = $this->getHandler();
$script = $this->getTransformScript();
if ( $script && !( $flags & self::RENDER_NOW ) ) {
// Use a script to transform on client request, if possible
- $thumb = $this->handler->getScriptedTransform( $this, $script, $params );
+ $thumb = $handler->getScriptedTransform( $this, $script, $params );
if ( $thumb ) {
break;
}
}
$normalisedParams = $params;
- $this->handler->normaliseParams( $this, $normalisedParams );
+ $handler->normaliseParams( $this, $normalisedParams );
$thumbName = $this->thumbName( $normalisedParams );
$thumbUrl = $this->getThumbUrl( $thumbName );
@@ -895,20 +897,21 @@ abstract class File {
// XXX: Pass in the storage path even though we are not rendering anything
// and the path is supposed to be an FS path. This is due to getScalerType()
// getting called on the path and clobbering $thumb->getUrl() if it's false.
- $thumb = $this->handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
+ $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 ( $this->repo->fileExists( $thumbPath ) && !( $flags & self::RENDER_FORCE ) ) {
+ wfDebug( __METHOD__ . ": Doing stat for $thumbPath\n" );
+ if ( !( $flags & self::RENDER_FORCE ) && $this->repo->fileExists( $thumbPath ) ) {
$timestamp = $this->repo->getFileTimestamp( $thumbPath );
if ( $timestamp !== false && $timestamp >= $wgThumbnailEpoch ) {
// XXX: Pass in the storage path even though we are not rendering anything
// and the path is supposed to be an FS path. This is due to getScalerType()
// getting called on the path and clobbering $thumb->getUrl() if it's false.
- $thumb = $this->handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
+ $thumb = $handler->getTransform(
+ $this, $thumbPath, $thumbUrl, $params );
$thumb->setStoragePath( $thumbPath );
break;
}
@@ -935,7 +938,7 @@ abstract class File {
// Actually render the thumbnail...
wfProfileIn( __METHOD__ . '-doTransform' );
- $thumb = $this->handler->doTransform( $this, $tmpThumbPath, $thumbUrl, $params );
+ $thumb = $handler->doTransform( $this, $tmpThumbPath, $thumbUrl, $params );
wfProfileOut( __METHOD__ . '-doTransform' );
$tmpFile->bind( $thumb ); // keep alive with $thumb
@@ -945,7 +948,7 @@ abstract class File {
$this->lastError = $thumb->toText();
// Ignore errors if requested
if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
- $thumb = $this->handler->getTransform( $this, $tmpThumbPath, $thumbUrl, $params );
+ $thumb = $handler->getTransform( $this, $tmpThumbPath, $thumbUrl, $params );
}
} elseif ( $this->repo && $thumb->hasFile() && !$thumb->fileIsSource() ) {
// Copy the thumbnail from the file system into storage...
@@ -975,7 +978,7 @@ abstract class File {
}
/**
- * @param $thumbName string Thumbnail name
+ * @param string $thumbName Thumbnail name
* @return string Content-Disposition header value
*/
function getThumbDisposition( $thumbName ) {
@@ -1048,7 +1051,7 @@ abstract class File {
* Purge shared caches such as thumbnails and DB data caching
* STUB
* Overridden by LocalFile
- * @param $options Array Options, which include:
+ * @param array $options Options, which include:
* 'forThumbRefresh' : The purging is only to refresh thumbnails
*/
function purgeCache( $options = array() ) {}
@@ -1088,9 +1091,9 @@ abstract class File {
*
* STUB
* @param $limit integer Limit of rows to return
- * @param $start string timestamp Only revisions older than $start will be returned
- * @param $end string timestamp Only revisions newer than $end will be returned
- * @param $inc bool Include the endpoints of the time range
+ * @param string $start timestamp Only revisions older than $start will be returned
+ * @param string $end timestamp Only revisions newer than $end will be returned
+ * @param bool $inc Include the endpoints of the time range
*
* @return array
*/
@@ -1147,7 +1150,7 @@ abstract class File {
/**
* Get the path of an archived file relative to the public zone root
*
- * @param $suffix bool|string if not false, the name of an archived thumbnail file
+ * @param bool|string $suffix if not false, the name of an archived thumbnail file
*
* @return string
*/
@@ -1165,7 +1168,7 @@ abstract class File {
* Get the path, relative to the thumbnail zone root, of the
* thumbnail directory or a particular file if $suffix is specified
*
- * @param $suffix bool|string if not false, the name of a thumbnail file
+ * @param bool|string $suffix if not false, the name of a thumbnail file
*
* @return string
*/
@@ -1191,8 +1194,8 @@ abstract class File {
* Get the path, relative to the thumbnail zone root, for an archived file's thumbs directory
* or a specific thumb if the $suffix is given.
*
- * @param $archiveName string the timestamped name of an archived image
- * @param $suffix bool|string if not false, the name of a thumbnail file
+ * @param string $archiveName the timestamped name of an archived image
+ * @param bool|string $suffix if not false, the name of a thumbnail file
*
* @return string
*/
@@ -1209,7 +1212,7 @@ abstract class File {
/**
* Get the path of the archived file.
*
- * @param $suffix bool|string if not false, the name of an archived file.
+ * @param bool|string $suffix if not false, the name of an archived file.
*
* @return string
*/
@@ -1221,8 +1224,8 @@ abstract class File {
/**
* Get the path of an archived file's thumbs, or a particular thumb if $suffix is specified
*
- * @param $archiveName string the timestamped name of an archived image
- * @param $suffix bool|string if not false, the name of a thumbnail file
+ * @param string $archiveName the timestamped name of an archived image
+ * @param bool|string $suffix if not false, the name of a thumbnail file
*
* @return string
*/
@@ -1235,7 +1238,7 @@ abstract class File {
/**
* Get the path of the thumbnail directory, or a particular file if $suffix is specified
*
- * @param $suffix bool|string if not false, the name of a thumbnail file
+ * @param bool|string $suffix if not false, the name of a thumbnail file
*
* @return string
*/
@@ -1245,15 +1248,28 @@ abstract class File {
}
/**
+ * Get the path of the transcoded directory, or a particular file if $suffix is specified
+ *
+ * @param bool|string $suffix if not false, the name of a media file
+ *
+ * @return string
+ */
+ function getTranscodedPath( $suffix = false ) {
+ $this->assertRepoDefined();
+ return $this->repo->getZonePath( 'transcoded' ) . '/' . $this->getThumbRel( $suffix );
+ }
+
+ /**
* Get the URL of the archive directory, or a particular file if $suffix is specified
*
- * @param $suffix bool|string if not false, the name of an archived file
+ * @param bool|string $suffix if not false, the name of an archived file
*
* @return string
*/
function getArchiveUrl( $suffix = false ) {
$this->assertRepoDefined();
- $path = $this->repo->getZoneUrl( 'public' ) . '/archive/' . $this->getHashPath();
+ $ext = $this->getExtension();
+ $path = $this->repo->getZoneUrl( 'public', $ext ) . '/archive/' . $this->getHashPath();
if ( $suffix === false ) {
$path = substr( $path, 0, -1 );
} else {
@@ -1265,14 +1281,15 @@ abstract class File {
/**
* Get the URL of the archived file's thumbs, or a particular thumb if $suffix is specified
*
- * @param $archiveName string the timestamped name of an archived image
- * @param $suffix bool|string if not false, the name of a thumbnail file
+ * @param string $archiveName the timestamped name of an archived image
+ * @param bool|string $suffix if not false, the name of a thumbnail file
*
* @return string
*/
function getArchiveThumbUrl( $archiveName, $suffix = false ) {
$this->assertRepoDefined();
- $path = $this->repo->getZoneUrl( 'thumb' ) . '/archive/' .
+ $ext = $this->getExtension();
+ $path = $this->repo->getZoneUrl( 'thumb', $ext ) . '/archive/' .
$this->getHashPath() . rawurlencode( $archiveName ) . "/";
if ( $suffix === false ) {
$path = substr( $path, 0, -1 );
@@ -1283,15 +1300,17 @@ abstract class File {
}
/**
- * Get the URL of the thumbnail directory, or a particular file if $suffix is specified
+ * Get the URL of the zone directory, or a particular file if $suffix is specified
*
- * @param $suffix bool|string if not false, the name of a thumbnail file
+ * @param string $zone name of requested zone
+ * @param bool|string $suffix if not false, the name of a file in zone
*
* @return string path
*/
- function getThumbUrl( $suffix = false ) {
+ function getZoneUrl( $zone, $suffix = false ) {
$this->assertRepoDefined();
- $path = $this->repo->getZoneUrl( 'thumb' ) . '/' . $this->getUrlRel();
+ $ext = $this->getExtension();
+ $path = $this->repo->getZoneUrl( $zone, $ext ) . '/' . $this->getUrlRel();
if ( $suffix !== false ) {
$path .= '/' . rawurlencode( $suffix );
}
@@ -1299,9 +1318,31 @@ abstract class File {
}
/**
+ * Get the URL of the thumbnail directory, or a particular file if $suffix is specified
+ *
+ * @param bool|string $suffix if not false, the name of a thumbnail file
+ *
+ * @return string path
+ */
+ function getThumbUrl( $suffix = false ) {
+ return $this->getZoneUrl( 'thumb', $suffix );
+ }
+
+ /**
+ * Get the URL of the transcoded directory, or a particular file if $suffix is specified
+ *
+ * @param bool|string $suffix if not false, the name of a media file
+ *
+ * @return string path
+ */
+ function getTranscodedUrl( $suffix = false ) {
+ return $this->getZoneUrl( 'transcoded', $suffix );
+ }
+
+ /**
* Get the public zone virtual URL for a current version source file
*
- * @param $suffix bool|string if not false, the name of a thumbnail file
+ * @param bool|string $suffix if not false, the name of a thumbnail file
*
* @return string
*/
@@ -1317,7 +1358,7 @@ abstract class File {
/**
* Get the public zone virtual URL for an archived version source file
*
- * @param $suffix bool|string if not false, the name of a thumbnail file
+ * @param bool|string $suffix if not false, the name of a thumbnail file
*
* @return string
*/
@@ -1335,7 +1376,7 @@ abstract class File {
/**
* Get the virtual URL for a thumbnail file or directory
*
- * @param $suffix bool|string if not false, the name of a thumbnail file
+ * @param bool|string $suffix if not false, the name of a thumbnail file
*
* @return string
*/
@@ -1360,7 +1401,7 @@ abstract class File {
* @throws MWException
*/
function readOnlyError() {
- throw new MWException( get_class($this) . ': write operations are not supported' );
+ throw new MWException( get_class( $this ) . ': write operations are not supported' );
}
/**
@@ -1373,8 +1414,12 @@ abstract class File {
* @param $copyStatus string
* @param $source string
* @param $watch bool
+ * @param $timestamp string|bool
+ * @param $user User object or null to use $wgUser
+ * @return bool
+ * @throws MWException
*/
- function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '', $watch = false ) {
+ function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '', $watch = false, $timestamp = false, User $user = null ) {
$this->readOnlyError();
}
@@ -1386,17 +1431,21 @@ abstract class File {
* The archive name should be passed through to recordUpload for database
* registration.
*
- * @param $srcPath String: local filesystem path to the source image
+ * Options to $options include:
+ * - headers : name/value map of HTTP headers to use in response to GET/HEAD requests
+ *
+ * @param string $srcPath local filesystem path to the source image
* @param $flags Integer: a bitwise combination of:
* File::DELETE_SOURCE Delete the source file, i.e. move
* rather than copy
+ * @param array $options Optional additional parameters
* @return FileRepoStatus object. On success, the value member contains the
* archive name, or an empty string if it was a new file.
*
* STUB
* Overridden by LocalFile
*/
- function publish( $srcPath, $flags = 0 ) {
+ function publish( $srcPath, $flags = 0, array $options = array() ) {
$this->readOnlyError();
}
@@ -1490,9 +1539,9 @@ abstract class File {
* @param $target Title New file name
* @return FileRepoStatus object.
*/
- function move( $target ) {
+ function move( $target ) {
$this->readOnlyError();
- }
+ }
/**
* Delete all versions of the file.
@@ -1518,9 +1567,9 @@ abstract class File {
*
* May throw database exceptions on error.
*
- * @param $versions array set of record ids of deleted items to restore,
+ * @param array $versions set of record ids of deleted items to restore,
* or empty to restore all revisions.
- * @param $unsuppress bool remove restrictions on content upon restoration?
+ * @param bool $unsuppress remove restrictions on content upon restoration?
* @return int|bool the number of file revisions restored if successful,
* or false on failure
* STUB
@@ -1580,7 +1629,7 @@ abstract class File {
* Get an image size array like that returned by getImageSize(), or false if it
* can't be determined.
*
- * @param $fileName String: The filename
+ * @param string $fileName The filename
* @return Array
*/
function getImageSize( $fileName ) {
@@ -1617,15 +1666,15 @@ abstract class File {
$renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgLang->getCode() );
if ( $renderUrl ) {
if ( $this->repo->descriptionCacheExpiry > 0 ) {
- wfDebug("Attempting to get the description from cache...");
+ wfDebug( "Attempting to get the description from cache..." );
$key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', $wgLang->getCode(),
$this->getName() );
- $obj = $wgMemc->get($key);
- if ($obj) {
- wfDebug("success!\n");
+ $obj = $wgMemc->get( $key );
+ if ( $obj ) {
+ wfDebug( "success!\n" );
return $obj;
}
- wfDebug("miss\n");
+ wfDebug( "miss\n" );
}
wfDebug( "Fetching shared description from $renderUrl\n" );
$res = Http::get( $renderUrl );
@@ -1704,14 +1753,15 @@ abstract class File {
/**
* Get an associative array containing information about a file in the local filesystem.
*
- * @param $path String: absolute local filesystem path
+ * @param string $path absolute local filesystem path
* @param $ext Mixed: the file extension, or true to extract it from the filename.
* Set it to false to ignore the extension.
*
* @return array
+ * @deprecated since 1.19
*/
static function getPropsFromPath( $path, $ext = true ) {
- wfDebug( __METHOD__.": Getting file info for $path\n" );
+ wfDebug( __METHOD__ . ": Getting file info for $path\n" );
wfDeprecated( __METHOD__, '1.19' );
$fsFile = new FSFile( $path );
@@ -1728,6 +1778,7 @@ abstract class File {
* @param $path string
*
* @return bool|string False on failure
+ * @deprecated since 1.19
*/
static function sha1Base36( $path ) {
wfDeprecated( __METHOD__, '1.19' );
@@ -1737,6 +1788,18 @@ abstract class File {
}
/**
+ * @return Array HTTP header name/value map to use for HEAD/GET request responses
+ */
+ function getStreamHeaders() {
+ $handler = $this->getHandler();
+ if ( $handler ) {
+ return $handler->getStreamHeaders( $this->getMetadata() );
+ } else {
+ return array();
+ }
+ }
+
+ /**
* @return string
*/
function getLongDesc() {
@@ -1780,7 +1843,7 @@ abstract class File {
}
/**
- * @return Title
+ * @return Title|null
*/
function getRedirectedTitle() {
if ( $this->redirected ) {
@@ -1789,6 +1852,7 @@ abstract class File {
}
return $this->redirectTitle;
}
+ return null;
}
/**
diff --git a/includes/filerepo/file/ForeignAPIFile.php b/includes/filerepo/file/ForeignAPIFile.php
index 56482611..a96c1f3f 100644
--- a/includes/filerepo/file/ForeignAPIFile.php
+++ b/includes/filerepo/file/ForeignAPIFile.php
@@ -106,7 +106,7 @@ class ForeignAPIFile extends File {
}
/**
- * @param Array $params
+ * @param array $params
* @param int $flags
* @return bool|MediaTransformOutput
*/
@@ -189,7 +189,7 @@ class ForeignAPIFile extends File {
* @param string $method
* @return int|null|string
*/
- public function getUser( $method='text' ) {
+ public function getUser( $method = 'text' ) {
return isset( $this->mInfo['user'] ) ? strval( $this->mInfo['user'] ) : null;
}
@@ -256,7 +256,7 @@ class ForeignAPIFile extends File {
*/
function getThumbPath( $suffix = '' ) {
if ( $this->repo->canCacheThumbs() ) {
- $path = $this->repo->getZonePath('thumb') . '/' . $this->getHashPath( $this->getName() );
+ $path = $this->repo->getZonePath( 'thumb' ) . '/' . $this->getHashPath( $this->getName() );
if ( $suffix ) {
$path = $path . $suffix . '/';
}
@@ -293,7 +293,7 @@ class ForeignAPIFile extends File {
global $wgMemc, $wgContLang;
$url = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgContLang->getCode() );
- $key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', md5($url) );
+ $key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', md5( $url ) );
$wgMemc->delete( $key );
}
diff --git a/includes/filerepo/file/ForeignDBFile.php b/includes/filerepo/file/ForeignDBFile.php
index 91f6cb62..ee5883c4 100644
--- a/includes/filerepo/file/ForeignDBFile.php
+++ b/includes/filerepo/file/ForeignDBFile.php
@@ -57,9 +57,11 @@ class ForeignDBFile extends LocalFile {
/**
* @param $srcPath String
* @param $flags int
+ * @param $options Array
+ * @return \FileRepoStatus
* @throws MWException
*/
- function publish( $srcPath, $flags = 0 ) {
+ function publish( $srcPath, $flags = 0, array $options = array() ) {
$this->readOnlyError();
}
@@ -71,16 +73,19 @@ class ForeignDBFile extends LocalFile {
* @param $source string
* @param $watch bool
* @param $timestamp bool|string
+ * @param $user User object or null to use $wgUser
+ * @return bool
* @throws MWException
*/
function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '',
- $watch = false, $timestamp = false ) {
+ $watch = false, $timestamp = false, User $user = null ) {
$this->readOnlyError();
}
/**
* @param $versions array
* @param $unsuppress bool
+ * @return \FileRepoStatus
* @throws MWException
*/
function restore( $versions = array(), $unsuppress = false ) {
@@ -90,6 +95,7 @@ class ForeignDBFile extends LocalFile {
/**
* @param $reason string
* @param $suppress bool
+ * @return \FileRepoStatus
* @throws MWException
*/
function delete( $reason, $suppress = false ) {
@@ -98,6 +104,7 @@ class ForeignDBFile extends LocalFile {
/**
* @param $target Title
+ * @return \FileRepoStatus
* @throws MWException
*/
function move( $target ) {
@@ -108,7 +115,7 @@ class ForeignDBFile extends LocalFile {
* @return string
*/
function getDescriptionUrl() {
- // Restore remote behaviour
+ // Restore remote behavior
return File::getDescriptionUrl();
}
@@ -116,7 +123,7 @@ class ForeignDBFile extends LocalFile {
* @return string
*/
function getDescriptionText() {
- // Restore remote behaviour
+ // Restore remote behavior
return File::getDescriptionText();
}
}
diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php
index 695c4e9e..639228b9 100644
--- a/includes/filerepo/file/LocalFile.php
+++ b/includes/filerepo/file/LocalFile.php
@@ -24,7 +24,7 @@
/**
* Bump this number when serialized cache records may be incompatible.
*/
-define( 'MW_FILE_VERSION', 8 );
+define( 'MW_FILE_VERSION', 9 );
/**
* Class to represent a local file in the wiki's own database
@@ -36,7 +36,7 @@ define( 'MW_FILE_VERSION', 8 );
* never name a file class explictly outside of the repo class. Instead use the
* repo's factory functions to generate file objects, for example:
*
- * RepoGroup::singleton()->getLocalRepo()->newFile($title);
+ * RepoGroup::singleton()->getLocalRepo()->newFile( $title );
*
* The convenience functions wfLocalFile() and wfFindFile() should be sufficient
* in most cases.
@@ -67,9 +67,11 @@ class LocalFile extends File {
$sha1, # SHA-1 base 36 content hash
$user, $user_text, # User, who uploaded the file
$description, # Description of current revision of the file
- $dataLoaded, # Whether or not all this has been loaded from the database (loadFromXxx)
+ $dataLoaded, # Whether or not core data has been loaded from the database (loadFromXxx)
+ $extraDataLoaded, # Whether or not lazy-loaded data has been loaded from the database
$upgraded, # Whether the row was upgraded on load
$locked, # True if the image row is locked
+ $lockedOwnTrx, # True if the image row is locked with a lock initiated transaction
$missing, # True if file is not present in file system. Not to be cached in memcached
$deleted; # Bitfield akin to rev_deleted
@@ -82,6 +84,8 @@ class LocalFile extends File {
protected $repoClass = 'LocalRepo';
+ const LOAD_ALL = 1; // integer; load all the lazy fields too (like metadata)
+
/**
* Create a LocalFile from a title
* Do not call this except from inside a repo class.
@@ -119,7 +123,7 @@ class LocalFile extends File {
* Create a LocalFile from a SHA-1 key
* Do not call this except from inside a repo class.
*
- * @param $sha1 string base-36 SHA-1
+ * @param string $sha1 base-36 SHA-1
* @param $repo LocalRepo
* @param string|bool $timestamp MW_timestamp (optional)
*
@@ -175,6 +179,7 @@ class LocalFile extends File {
$this->historyLine = 0;
$this->historyRes = null;
$this->dataLoaded = false;
+ $this->extraDataLoaded = false;
$this->assertRepoDefined();
$this->assertTitleDefined();
@@ -200,6 +205,7 @@ class LocalFile extends File {
wfProfileIn( __METHOD__ );
$this->dataLoaded = false;
+ $this->extraDataLoaded = false;
$key = $this->getCacheKey();
if ( !$key ) {
@@ -210,13 +216,17 @@ class LocalFile extends File {
$cachedValues = $wgMemc->get( $key );
// Check if the key existed and belongs to this version of MediaWiki
- if ( isset( $cachedValues['version'] ) && ( $cachedValues['version'] == MW_FILE_VERSION ) ) {
+ if ( isset( $cachedValues['version'] ) && $cachedValues['version'] == MW_FILE_VERSION ) {
wfDebug( "Pulling file metadata from cache key $key\n" );
$this->fileExists = $cachedValues['fileExists'];
if ( $this->fileExists ) {
$this->setProps( $cachedValues );
}
$this->dataLoaded = true;
+ $this->extraDataLoaded = true;
+ foreach ( $this->getLazyCacheFields( '' ) as $field ) {
+ $this->extraDataLoaded = $this->extraDataLoaded && isset( $cachedValues[$field] );
+ }
}
if ( $this->dataLoaded ) {
@@ -252,7 +262,17 @@ class LocalFile extends File {
}
}
- $wgMemc->set( $key, $cache, 60 * 60 * 24 * 7 ); // A week
+ // Strip off excessive entries from the subset of fields that can become large.
+ // If the cache value gets to large it will not fit in memcached and nothing will
+ // get cached at all, causing master queries for any file access.
+ foreach ( $this->getLazyCacheFields( '' ) as $field ) {
+ if ( isset( $cache[$field] ) && strlen( $cache[$field] ) > 100 * 1024 ) {
+ unset( $cache[$field] ); // don't let the value get too big
+ }
+ }
+
+ // Cache presence for 1 week and negatives for 1 day
+ $wgMemc->set( $key, $cache, $this->fileExists ? 86400 * 7 : 86400 );
}
/**
@@ -288,6 +308,28 @@ class LocalFile extends File {
}
/**
+ * @return array
+ */
+ function getLazyCacheFields( $prefix = 'img_' ) {
+ static $fields = array( 'metadata' );
+ static $results = array();
+
+ if ( $prefix == '' ) {
+ return $fields;
+ }
+
+ if ( !isset( $results[$prefix] ) ) {
+ $prefixedFields = array();
+ foreach ( $fields as $field ) {
+ $prefixedFields[] = $prefix . $field;
+ }
+ $results[$prefix] = $prefixedFields;
+ }
+
+ return $results[$prefix];
+ }
+
+ /**
* Load file metadata from the DB
*/
function loadFromDB() {
@@ -297,9 +339,9 @@ class LocalFile extends File {
# Unconditionally set loaded=true, we don't want the accessors constantly rechecking
$this->dataLoaded = true;
+ $this->extraDataLoaded = true;
$dbr = $this->repo->getMasterDB();
-
$row = $dbr->selectRow( 'image', $this->getCacheFields( 'img_' ),
array( 'img_name' => $this->getName() ), $fname );
@@ -313,27 +355,70 @@ class LocalFile extends File {
}
/**
- * Decode a row from the database (either object or array) to an array
- * with timestamps and MIME types decoded, and the field prefix removed.
- * @param $row
+ * Load lazy file metadata from the DB.
+ * This covers fields that are sometimes not cached.
+ */
+ protected function loadExtraFromDB() {
+ # Polymorphic function name to distinguish foreign and local fetches
+ $fname = get_class( $this ) . '::' . __FUNCTION__;
+ wfProfileIn( $fname );
+
+ # 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 );
+ }
+
+ if ( $row ) {
+ foreach ( $this->unprefixRow( $row, 'img_' ) as $name => $value ) {
+ $this->$name = $value;
+ }
+ } else {
+ throw new MWException( "Could not find data for image '{$this->getName()}'." );
+ }
+
+ wfProfileOut( $fname );
+ }
+
+ /**
+ * @param Row $row
* @param $prefix string
- * @throws MWException
- * @return array
+ * @return Array
*/
- function decodeRow( $row, $prefix = 'img_' ) {
+ protected function unprefixRow( $row, $prefix = 'img_' ) {
$array = (array)$row;
$prefixLength = strlen( $prefix );
// Sanity check prefix once
if ( substr( key( $array ), 0, $prefixLength ) !== $prefix ) {
- throw new MWException( __METHOD__ . ': incorrect $prefix parameter' );
+ throw new MWException( __METHOD__ . ': incorrect $prefix parameter' );
}
$decoded = array();
-
foreach ( $array as $name => $value ) {
$decoded[substr( $name, $prefixLength )] = $value;
}
+ return $decoded;
+ }
+
+ /**
+ * Decode a row from the database (either object or array) to an array
+ * with timestamps and MIME types decoded, and the field prefix removed.
+ * @param $row
+ * @param $prefix string
+ * @throws MWException
+ * @return array
+ */
+ function decodeRow( $row, $prefix = 'img_' ) {
+ $decoded = $this->unprefixRow( $row, $prefix );
$decoded['timestamp'] = wfTimestamp( TS_MW, $decoded['timestamp'] );
@@ -357,6 +442,8 @@ class LocalFile extends File {
*/
function loadFromRow( $row, $prefix = 'img_' ) {
$this->dataLoaded = true;
+ $this->extraDataLoaded = true;
+
$array = $this->decodeRow( $row, $prefix );
foreach ( $array as $name => $value ) {
@@ -369,8 +456,9 @@ class LocalFile extends File {
/**
* Load file metadata from cache or DB, unless already loaded
+ * @param integer $flags
*/
- function load() {
+ function load( $flags = 0 ) {
if ( !$this->dataLoaded ) {
if ( !$this->loadFromCache() ) {
$this->loadFromDB();
@@ -378,6 +466,9 @@ class LocalFile extends File {
}
$this->dataLoaded = true;
}
+ if ( ( $flags & self::LOAD_ALL ) && !$this->extraDataLoaded ) {
+ $this->loadExtraFromDB();
+ }
}
/**
@@ -397,7 +488,7 @@ class LocalFile extends File {
} else {
$handler = $this->getHandler();
if ( $handler ) {
- $validity = $handler->isMetadataValid( $this, $this->metadata );
+ $validity = $handler->isMetadataValid( $this, $this->getMetadata() );
if ( $validity === MediaHandler::METADATA_BAD
|| ( $validity === MediaHandler::METADATA_COMPATIBLE && $wgUpdateCompatibleMetadata )
) {
@@ -464,6 +555,7 @@ class LocalFile extends File {
/**
* Set properties in this object to be equal to those given in the
* associative array $info. Only cacheable fields can be set.
+ * All fields *must* be set in $info except for getLazyCacheFields().
*
* If 'mime' is given, it will be split into major_mime/minor_mime.
* If major_mime/minor_mime are given, $this->mime will also be set.
@@ -552,7 +644,7 @@ class LocalFile extends File {
/**
* Returns ID or name of user who uploaded the file
*
- * @param $type string 'text' or 'id'
+ * @param string $type 'text' or 'id'
* @return int|string
*/
function getUser( $type = 'text' ) {
@@ -570,7 +662,7 @@ class LocalFile extends File {
* @return string
*/
function getMetadata() {
- $this->load();
+ $this->load( self::LOAD_ALL ); // large metadata is loaded in another step
return $this->metadata;
}
@@ -638,15 +730,14 @@ class LocalFile extends File {
* RTT regression for wikis without 404 handling.
*/
function migrateThumbFile( $thumbName ) {
- $thumbDir = $this->getThumbPath();
-
/* 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++ ) {
+ for ( $i = 0; $i < 100; $i++ ) {
$broken = $this->repo->getZonePath( 'public' ) . "/broken-$i-$thumbName";
if ( !file_exists( $broken ) ) {
rename( $thumbPath, $broken );
@@ -672,7 +763,7 @@ class LocalFile extends File {
/**
* Get all thumbnail names previously generated for this file
- * @param $archiveName string|bool Name of an archive file, default false
+ * @param string|bool $archiveName Name of an archive file, default false
* @return array first element is the base dir, then files in that base dir.
*/
function getThumbnails( $archiveName = false ) {
@@ -736,7 +827,7 @@ class LocalFile extends File {
/**
* Delete cached transformed files for an archived version only.
- * @param $archiveName string name of the archived file
+ * @param string $archiveName name of the archived file
*/
function purgeOldThumbnails( $archiveName ) {
global $wgUseSquid;
@@ -771,8 +862,16 @@ class LocalFile extends File {
// Delete thumbnails
$files = $this->getThumbnails();
+ // Always purge all files from squid regardless of handler filters
+ if ( $wgUseSquid ) {
+ $urls = array();
+ foreach( $files as $file ) {
+ $urls[] = $this->getThumbUrl( $file );
+ }
+ array_shift( $urls ); // don't purge directory
+ }
- // Give media handler a chance to filter the purge list
+ // Give media handler a chance to filter the file purge list
if ( !empty( $options['forThumbRefresh'] ) ) {
$handler = $this->getHandler();
if ( $handler ) {
@@ -788,10 +887,6 @@ class LocalFile extends File {
// Purge the squid
if ( $wgUseSquid ) {
- $urls = array();
- foreach( $files as $file ) {
- $urls[] = $this->getThumbUrl( $file );
- }
SquidUpdate::purge( $urls );
}
@@ -800,13 +895,13 @@ class LocalFile extends File {
/**
* Delete a list of thumbnails visible at urls
- * @param $dir string base dir of the files.
- * @param $files array of strings: relative filenames (to $dir)
+ * @param string $dir base dir of the files.
+ * @param array $files of strings: relative filenames (to $dir)
*/
protected function purgeThumbList( $dir, $files ) {
$fileListDebug = strtr(
var_export( $files, true ),
- array("\n"=>'')
+ array( "\n" => '' )
);
wfDebug( __METHOD__ . ": $fileListDebug\n" );
@@ -814,7 +909,9 @@ class LocalFile extends File {
foreach ( $files as $file ) {
# Check that the base file name is part of the thumb name
# This is a basic sanity check to avoid erasing unrelated directories
- if ( strpos( $file, $this->getName() ) !== false ) {
+ if ( strpos( $file, $this->getName() ) !== false
+ || strpos( $file, "-thumbnail" ) !== false // "short" thumb name
+ ) {
$purgeList[] = "{$dir}/{$file}";
}
}
@@ -949,15 +1046,15 @@ class LocalFile extends File {
/**
* Upload a file and record it in the DB
- * @param $srcPath String: source storage path or virtual URL
- * @param $comment String: upload description
- * @param $pageText String: text to use for the new description page,
+ * @param string $srcPath source storage path, virtual URL, or filesystem path
+ * @param string $comment upload description
+ * @param string $pageText text to use for the new description page,
* if a new description page is created
* @param $flags Integer|bool: flags for publish()
- * @param $props Array|bool: File properties, if known. This can be used to reduce the
+ * @param array|bool $props File properties, if known. This can be used to reduce the
* upload time when uploading virtual URLs for which the file info
* is already known
- * @param $timestamp String|bool: timestamp for img_timestamp, or false to use the current time
+ * @param string|bool $timestamp timestamp for img_timestamp, or false to use the current time
* @param $user User|null: User object or null to use $wgUser
*
* @return FileRepoStatus object. On success, the value member contains the
@@ -970,11 +1067,34 @@ class LocalFile extends File {
return $this->readOnlyFatalStatus();
}
+ if ( !$props ) {
+ wfProfileIn( __METHOD__ . '-getProps' );
+ if ( $this->repo->isVirtualUrl( $srcPath )
+ || FileBackend::isStoragePath( $srcPath ) )
+ {
+ $props = $this->repo->getFileProps( $srcPath );
+ } else {
+ $props = FSFile::getPropsFromPath( $srcPath );
+ }
+ wfProfileOut( __METHOD__ . '-getProps' );
+ }
+
+ $options = array();
+ $handler = MediaHandler::getHandler( $props['mime'] );
+ if ( $handler ) {
+ $options['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+ } else {
+ $options['headers'] = array();
+ }
+
+ // Trim spaces on user supplied text
+ $comment = trim( $comment );
+
// truncate nicely or the DB will do it for us
// non-nicely (dangling multi-byte chars, non-truncated version in cache).
$comment = $wgContLang->truncate( $comment, 255 );
$this->lock(); // begin
- $status = $this->publish( $srcPath, $flags );
+ $status = $this->publish( $srcPath, $flags, $options );
if ( $status->successCount > 0 ) {
# Essentially we are displacing any existing current file and saving
@@ -999,20 +1119,25 @@ class LocalFile extends File {
* @param $source string
* @param $watch bool
* @param $timestamp string|bool
+ * @param $user User object or null to use $wgUser
* @return bool
*/
function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '',
- $watch = false, $timestamp = false )
+ $watch = false, $timestamp = false, User $user = null )
{
+ if ( !$user ) {
+ global $wgUser;
+ $user = $wgUser;
+ }
+
$pageText = SpecialUpload::getInitialPageText( $desc, $license, $copyStatus, $source );
- if ( !$this->recordUpload2( $oldver, $desc, $pageText ) ) {
+ if ( !$this->recordUpload2( $oldver, $desc, $pageText, false, $timestamp, $user ) ) {
return false;
}
if ( $watch ) {
- global $wgUser;
- $wgUser->addWatch( $this->getTitle() );
+ $user->addWatch( $this->getTitle() );
}
return true;
}
@@ -1165,7 +1290,7 @@ class LocalFile extends File {
$log->getRcComment(),
false
);
- if (!is_null($nullRevision)) {
+ if ( !is_null( $nullRevision ) ) {
$nullRevision->insertOn( $dbw );
wfRunHooks( 'NewRevisionFromEditComplete', array( $wikiPage, $nullRevision, $latest, $user ) );
@@ -1186,17 +1311,18 @@ class LocalFile extends File {
} else {
# New file; create the description page.
# There's already a log entry, so don't make a second RC entry
- # Squid and file cache for the description page are purged by doEdit.
- $status = $wikiPage->doEdit( $pageText, $comment, EDIT_NEW | EDIT_SUPPRESS_RC, false, $user );
+ # Squid and file cache for the description page are purged by doEditContent.
+ $content = ContentHandler::makeContent( $pageText, $descTitle );
+ $status = $wikiPage->doEditContent( $content, $comment, EDIT_NEW | EDIT_SUPPRESS_RC, false, $user );
if ( isset( $status->value['revision'] ) ) { // XXX; doEdit() uses a transaction
- $dbw->begin();
+ $dbw->begin( __METHOD__ );
$dbw->update( 'logging',
array( 'log_page' => $status->value['revision']->getPage() ),
array( 'log_id' => $logId ),
__METHOD__
);
- $dbw->commit(); // commit before anything bad can happen
+ $dbw->commit( __METHOD__ ); // commit before anything bad can happen
}
}
wfProfileOut( __METHOD__ . '-edit' );
@@ -1246,14 +1372,15 @@ class LocalFile extends File {
* The archive name should be passed through to recordUpload for database
* registration.
*
- * @param $srcPath String: local filesystem path to the source image
+ * @param string $srcPath local filesystem path to the source image
* @param $flags Integer: a bitwise combination of:
* File::DELETE_SOURCE Delete the source file, i.e. move rather than copy
+ * @param array $options Optional additional parameters
* @return FileRepoStatus object. On success, the value member contains the
* archive name, or an empty string if it was a new file.
*/
- function publish( $srcPath, $flags = 0 ) {
- return $this->publishTo( $srcPath, $this->getRel(), $flags );
+ function publish( $srcPath, $flags = 0, array $options = array() ) {
+ return $this->publishTo( $srcPath, $this->getRel(), $flags, $options );
}
/**
@@ -1263,14 +1390,15 @@ class LocalFile extends File {
* The archive name should be passed through to recordUpload for database
* registration.
*
- * @param $srcPath String: local filesystem path to the source image
- * @param $dstRel String: target relative path
+ * @param string $srcPath local filesystem path to the source image
+ * @param string $dstRel target relative path
* @param $flags Integer: a bitwise combination of:
* File::DELETE_SOURCE Delete the source file, i.e. move rather than copy
+ * @param array $options Optional additional parameters
* @return FileRepoStatus object. On success, the value member contains the
* archive name, or an empty string if it was a new file.
*/
- function publishTo( $srcPath, $dstRel, $flags = 0 ) {
+ function publishTo( $srcPath, $dstRel, $flags = 0, array $options = array() ) {
if ( $this->getRepo()->getReadOnlyReason() !== false ) {
return $this->readOnlyFatalStatus();
}
@@ -1280,7 +1408,7 @@ class LocalFile extends File {
$archiveName = wfTimestamp( TS_MW ) . '!'. $this->getName();
$archiveRel = 'archive/' . $this->getHashPath() . $archiveName;
$flags = $flags & File::DELETE_SOURCE ? LocalRepo::DELETE_SOURCE : 0;
- $status = $this->repo->publish( $srcPath, $dstRel, $archiveRel, $flags );
+ $status = $this->repo->publish( $srcPath, $dstRel, $archiveRel, $flags, $options );
if ( $status->value == 'new' ) {
$status->value = '';
@@ -1422,7 +1550,7 @@ class LocalFile extends File {
*
* May throw database exceptions on error.
*
- * @param $versions array set of record ids of deleted items to restore,
+ * @param array $versions set of record ids of deleted items to restore,
* or empty to restore all revisions.
* @param $unsuppress Boolean
* @return FileRepoStatus
@@ -1472,12 +1600,11 @@ class LocalFile extends File {
* @return bool|mixed
*/
function getDescriptionText() {
- global $wgParser;
$revision = Revision::newFromTitle( $this->title, false, Revision::READ_NORMAL );
if ( !$revision ) return false;
- $text = $revision->getText();
- if ( !$text ) return false;
- $pout = $wgParser->parse( $text, $this->title, new ParserOptions() );
+ $content = $revision->getContent();
+ if ( !$content ) return false;
+ $pout = $content->getParserOutput( $this->title, null, new ParserOptions() );
return $pout->getText();
}
@@ -1547,7 +1674,10 @@ class LocalFile extends File {
$dbw = $this->repo->getMasterDB();
if ( !$this->locked ) {
- $dbw->begin( __METHOD__ );
+ if ( !$dbw->trxLevel() ) {
+ $dbw->begin( __METHOD__ );
+ $this->lockedOwnTrx = true;
+ }
$this->locked++;
}
@@ -1562,9 +1692,10 @@ class LocalFile extends File {
function unlock() {
if ( $this->locked ) {
--$this->locked;
- if ( !$this->locked ) {
+ if ( !$this->locked && $this->lockedOwnTrx ) {
$dbw = $this->repo->getMasterDB();
$dbw->commit( __METHOD__ );
+ $this->lockedOwnTrx = false;
}
}
}
@@ -1576,6 +1707,7 @@ class LocalFile extends File {
$this->locked = false;
$dbw = $this->repo->getMasterDB();
$dbw->rollback( __METHOD__ );
+ $this->lockedOwnTrx = false;
}
/**
@@ -1758,7 +1890,7 @@ class LocalFileDeleteBatch {
'fa_deleted_user' => $encUserId,
'fa_deleted_timestamp' => $encTimestamp,
'fa_deleted_reason' => $encReason,
- 'fa_deleted' => $this->suppress ? $bitfield : 0,
+ 'fa_deleted' => $this->suppress ? $bitfield : 0,
'fa_name' => 'img_name',
'fa_archive_name' => 'NULL',
@@ -1773,7 +1905,8 @@ class LocalFileDeleteBatch {
'fa_description' => 'img_description',
'fa_user' => 'img_user',
'fa_user_text' => 'img_user_text',
- 'fa_timestamp' => 'img_timestamp'
+ 'fa_timestamp' => 'img_timestamp',
+ 'fa_sha1' => 'img_sha1',
), $where, __METHOD__ );
}
@@ -1805,6 +1938,7 @@ class LocalFileDeleteBatch {
'fa_user' => 'oi_user',
'fa_user_text' => 'oi_user_text',
'fa_timestamp' => 'oi_timestamp',
+ 'fa_sha1' => 'oi_sha1',
), $where, __METHOD__ );
}
}
@@ -1836,7 +1970,7 @@ class LocalFileDeleteBatch {
$this->file->lock();
// Leave private files alone
$privateFiles = array();
- list( $oldRels, $deleteCurrent ) = $this->getOldRels();
+ list( $oldRels, ) = $this->getOldRels();
$dbw = $this->file->repo->getMasterDB();
if ( !empty( $oldRels ) ) {
@@ -1914,7 +2048,7 @@ class LocalFileDeleteBatch {
$files = $newBatch = array();
foreach ( $batch as $batchItem ) {
- list( $src, $dest ) = $batchItem;
+ list( $src, ) = $batchItem;
$files[$src] = $this->file->repo->getVirtualUrl( 'public' ) . '/' . rawurlencode( $src );
}
@@ -2004,7 +2138,9 @@ class LocalFileRestoreBatch {
$conditions[] = 'fa_id IN (' . $dbw->makeList( $this->ids ) . ')';
}
- $result = $dbw->select( 'filearchive', '*',
+ $result = $dbw->select(
+ 'filearchive',
+ ArchivedFile::selectFields(),
$conditions,
__METHOD__,
array( 'ORDER BY' => 'fa_timestamp DESC' )
@@ -2037,7 +2173,12 @@ class LocalFileRestoreBatch {
$deletedRel = $this->file->repo->getDeletedHashPath( $row->fa_storage_key ) . $row->fa_storage_key;
$deletedUrl = $this->file->repo->getVirtualUrl() . '/deleted/' . $deletedRel;
- $sha1 = substr( $row->fa_storage_key, 0, strcspn( $row->fa_storage_key, '.' ) );
+ if( isset( $row->fa_sha1 ) ) {
+ $sha1 = $row->fa_sha1;
+ } else {
+ // old row, populate from key
+ $sha1 = LocalRepo::getHashFromKey( $row->fa_storage_key );
+ }
# Fix leading zero
if ( strlen( $sha1 ) == 32 && $sha1[0] == '0' ) {
@@ -2251,7 +2392,7 @@ class LocalFileRestoreBatch {
/**
* Delete unused files in the deleted zone.
* This should be called from outside the transaction in which execute() was called.
- * @return FileRepoStatus|void
+ * @return FileRepoStatus
*/
function cleanup() {
if ( !$this->cleanupBatch ) {
@@ -2492,7 +2633,7 @@ class LocalFileMoveBatch {
*/
function getMoveTriplets() {
$moves = array_merge( array( $this->cur ), $this->olds );
- $triplets = array(); // The format is: (srcUrl, destZone, destUrl)
+ $triplets = array(); // The format is: (srcUrl, destZone, destUrl)
foreach ( $moves as $move ) {
// $move: (oldRelativePath, newRelativePath)
diff --git a/includes/filerepo/file/OldLocalFile.php b/includes/filerepo/file/OldLocalFile.php
index 40d7dca7..5c505928 100644
--- a/includes/filerepo/file/OldLocalFile.php
+++ b/includes/filerepo/file/OldLocalFile.php
@@ -42,7 +42,7 @@ class OldLocalFile extends LocalFile {
static function newFromTitle( $title, $repo, $time = null ) {
# The null default value is only here to avoid an E_STRICT
if ( $time === null ) {
- throw new MWException( __METHOD__.' got null for $time parameter' );
+ throw new MWException( __METHOD__ . ' got null for $time parameter' );
}
return new self( $title, $repo, $time, null );
}
@@ -73,7 +73,7 @@ class OldLocalFile extends LocalFile {
* Create a OldLocalFile from a SHA-1 key
* Do not call this except from inside a repo class.
*
- * @param $sha1 string base-36 SHA-1
+ * @param string $sha1 base-36 SHA-1
* @param $repo LocalRepo
* @param string|bool $timestamp MW_timestamp (optional)
*
@@ -123,8 +123,8 @@ class OldLocalFile extends LocalFile {
/**
* @param $title Title
* @param $repo FileRepo
- * @param $time String: timestamp or null to load by archive name
- * @param $archiveName String: archive name or null to load by timestamp
+ * @param string $time timestamp or null to load by archive name
+ * @param string $archiveName archive name or null to load by timestamp
* @throws MWException
*/
function __construct( $title, $repo, $time, $archiveName ) {
@@ -132,7 +132,7 @@ class OldLocalFile extends LocalFile {
$this->requestedTime = $time;
$this->archive_name = $archiveName;
if ( is_null( $time ) && is_null( $archiveName ) ) {
- throw new MWException( __METHOD__.': must specify at least one of $time or $archiveName' );
+ throw new MWException( __METHOD__ . ': must specify at least one of $time or $archiveName' );
}
}
@@ -164,18 +164,19 @@ class OldLocalFile extends LocalFile {
* @return bool
*/
function isVisible() {
- return $this->exists() && !$this->isDeleted(File::DELETED_FILE);
+ return $this->exists() && !$this->isDeleted( File::DELETED_FILE );
}
function loadFromDB() {
wfProfileIn( __METHOD__ );
+
$this->dataLoaded = true;
$dbr = $this->repo->getSlaveDB();
$conds = array( 'oi_name' => $this->getName() );
if ( is_null( $this->requestedTime ) ) {
$conds['oi_archive_name'] = $this->archive_name;
} else {
- $conds[] = 'oi_timestamp = ' . $dbr->addQuotes( $dbr->timestamp( $this->requestedTime ) );
+ $conds['oi_timestamp'] = $dbr->timestamp( $this->requestedTime );
}
$row = $dbr->selectRow( 'oldimage', $this->getCacheFields( 'oi_' ),
$conds, __METHOD__, array( 'ORDER BY' => 'oi_timestamp DESC' ) );
@@ -184,6 +185,42 @@ class OldLocalFile extends LocalFile {
} else {
$this->fileExists = false;
}
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Load lazy file metadata from the DB
+ */
+ protected function loadExtraFromDB() {
+ wfProfileIn( __METHOD__ );
+
+ $this->extraDataLoaded = true;
+ $dbr = $this->repo->getSlaveDB();
+ $conds = array( 'oi_name' => $this->getName() );
+ if ( is_null( $this->requestedTime ) ) {
+ $conds['oi_archive_name'] = $this->archive_name;
+ } else {
+ $conds['oi_timestamp'] = $dbr->timestamp( $this->requestedTime );
+ }
+ // In theory the file could have just been renamed/deleted...oh well
+ $row = $dbr->selectRow( 'oldimage', $this->getLazyCacheFields( 'oi_' ),
+ $conds, __METHOD__, array( 'ORDER BY' => 'oi_timestamp DESC' ) );
+
+ if ( !$row ) { // fallback to master
+ $dbr = $this->repo->getMasterDB();
+ $row = $dbr->selectRow( 'oldimage', $this->getLazyCacheFields( 'oi_' ),
+ $conds, __METHOD__, array( 'ORDER BY' => 'oi_timestamp DESC' ) );
+ }
+
+ if ( $row ) {
+ foreach ( $this->unprefixRow( $row, 'oi_' ) as $name => $value ) {
+ $this->$name = $value;
+ }
+ } else {
+ throw new MWException( "Could not find data for image '{$this->archive_name}'." );
+ }
+
wfProfileOut( __METHOD__ );
}
@@ -218,7 +255,7 @@ class OldLocalFile extends LocalFile {
# Don't destroy file info of missing files
if ( !$this->fileExists ) {
- wfDebug( __METHOD__.": file does not exist, aborting\n" );
+ wfDebug( __METHOD__ . ": file does not exist, aborting\n" );
wfProfileOut( __METHOD__ );
return;
}
@@ -226,7 +263,7 @@ class OldLocalFile extends LocalFile {
$dbw = $this->repo->getMasterDB();
list( $major, $minor ) = self::splitMime( $this->mime );
- wfDebug(__METHOD__.': upgrading '.$this->archive_name." to the current schema\n");
+ wfDebug( __METHOD__ . ': upgrading ' . $this->archive_name . " to the current schema\n" );
$dbw->update( 'oldimage',
array(
'oi_size' => $this->size, // sanity
@@ -281,8 +318,8 @@ class OldLocalFile extends LocalFile {
/**
* Upload a file directly into archive. Generally for Special:Import.
*
- * @param $srcPath string File system path of the source file
- * @param $archiveName string Full archive name of the file, in the form
+ * @param string $srcPath File system path of the source file
+ * @param string $archiveName Full archive name of the file, in the form
* $timestamp!$filename, where $filename must match $this->getName()
*
* @param $timestamp string
@@ -313,10 +350,10 @@ class OldLocalFile extends LocalFile {
/**
* Record a file upload in the oldimage table, without adding log entries.
*
- * @param $srcPath string File system path to the source file
- * @param $archiveName string The archive name of the file
+ * @param string $srcPath File system path to the source file
+ * @param string $archiveName The archive name of the file
* @param $timestamp string
- * @param $comment string Upload comment
+ * @param string $comment Upload comment
* @param $user User User who did this upload
* @return bool
*/
diff --git a/includes/filerepo/file/UnregisteredLocalFile.php b/includes/filerepo/file/UnregisteredLocalFile.php
index 8d4a3f88..47ba6d6b 100644
--- a/includes/filerepo/file/UnregisteredLocalFile.php
+++ b/includes/filerepo/file/UnregisteredLocalFile.php
@@ -42,7 +42,7 @@ class UnregisteredLocalFile extends File {
var $handler;
/**
- * @param $path string Storage path
+ * @param string $path Storage path
* @param $mime string
* @return UnregisteredLocalFile
*/
@@ -71,7 +71,7 @@ class UnregisteredLocalFile extends File {
*/
function __construct( $title = false, $repo = false, $path = false, $mime = false ) {
if ( !( $title && $repo ) && !$path ) {
- throw new MWException( __METHOD__.': not enough parameters, must specify title and repo, or a full path' );
+ throw new MWException( __METHOD__ . ': not enough parameters, must specify title and repo, or a full path' );
}
if ( $title instanceof Title ) {
$this->title = File::normalizeTitle( $title, 'exception' );
@@ -179,10 +179,18 @@ class UnregisteredLocalFile extends File {
*/
function getSize() {
$this->assertRepoDefined();
- $props = $this->repo->getFileProps( $this->path );
- if ( isset( $props['size'] ) ) {
- return $props['size'];
- }
- return false; // doesn't exist
+ return $this->repo->getFileSize( $this->path );
+ }
+
+ /**
+ * Optimize getLocalRefPath() by using an existing local reference.
+ * The file at the path of $fsFile should not be deleted (or at least
+ * not until the end of the request). This is mostly a performance hack.
+ *
+ * @param $fsFile FSFile
+ * @return void
+ */
+ public function setLocalReference( FSFile $fsFile ) {
+ $this->fsFile = $fsFile;
}
}
diff --git a/includes/installer/CliInstaller.php b/includes/installer/CliInstaller.php
index 38b4a824..bb7e8776 100644
--- a/includes/installer/CliInstaller.php
+++ b/includes/installer/CliInstaller.php
@@ -129,7 +129,7 @@ class CliInstaller extends Installer {
/**
* Write LocalSettings.php to a given path
*
- * @param $path String Full path to write LocalSettings.php to
+ * @param string $path Full path to write LocalSettings.php to
*/
public function writeConfigurationFile( $path ) {
$ls = InstallerOverrides::getLocalSettingsGenerator( $this );
@@ -191,9 +191,9 @@ class CliInstaller extends Installer {
}
}
- public function envCheckPath( ) {
+ public function envCheckPath() {
if ( !$this->specifiedScriptPath ) {
- $this->showMessage( 'config-no-cli-uri', $this->getVar("wgScriptPath") );
+ $this->showMessage( 'config-no-cli-uri', $this->getVar( "wgScriptPath" ) );
}
return parent::envCheckPath();
}
diff --git a/includes/installer/DatabaseInstaller.php b/includes/installer/DatabaseInstaller.php
index de59b2d6..3472b7ff 100644
--- a/includes/installer/DatabaseInstaller.php
+++ b/includes/installer/DatabaseInstaller.php
@@ -62,12 +62,12 @@ abstract class DatabaseInstaller {
/**
* Return the internal name, e.g. 'mysql', or 'sqlite'.
*/
- public abstract function getName();
+ abstract public function getName();
/**
* @return bool Returns true if the client library is compiled in.
*/
- public abstract function isCompiled();
+ abstract public function isCompiled();
/**
* Checks for installation prerequisites other than those checked by isCompiled()
@@ -85,7 +85,7 @@ abstract class DatabaseInstaller {
*
* If this is called, $this->parent can be assumed to be a WebInstaller.
*/
- public abstract function getConnectForm();
+ abstract public function getConnectForm();
/**
* Set variables based on the request array, assuming it was submitted
@@ -96,7 +96,7 @@ abstract class DatabaseInstaller {
*
* @return Status
*/
- public abstract function submitConnectForm();
+ abstract public function submitConnectForm();
/**
* Get HTML for a web form that retrieves settings used for installation.
@@ -127,7 +127,7 @@ abstract class DatabaseInstaller {
*
* @return Status
*/
- public abstract function openConnection();
+ abstract public function openConnection();
/**
* Create the database and return a Status object indicating success or
@@ -135,7 +135,7 @@ abstract class DatabaseInstaller {
*
* @return Status
*/
- public abstract function setupDatabase();
+ abstract public function setupDatabase();
/**
* Connect to the database using the administrative user/password currently
@@ -218,7 +218,7 @@ abstract class DatabaseInstaller {
*
* @return String
*/
- public abstract function getLocalSettings();
+ abstract public function getLocalSettings();
/**
* Override this to provide DBMS-specific schema variables, to be
@@ -240,7 +240,7 @@ abstract class DatabaseInstaller {
if ( $status->isOK() ) {
$status->value->setSchemaVars( $this->getSchemaVars() );
} else {
- throw new MWException( __METHOD__.': unexpected DB connection error' );
+ throw new MWException( __METHOD__ . ': unexpected DB connection error' );
}
}
@@ -252,7 +252,7 @@ abstract class DatabaseInstaller {
public function enableLB() {
$status = $this->getConnection();
if ( !$status->isOK() ) {
- throw new MWException( __METHOD__.': unexpected DB connection error' );
+ throw new MWException( __METHOD__ . ': unexpected DB connection error' );
}
LBFactory::setInstance( new LBFactory_Single( array(
'connection' => $status->value ) ) );
@@ -269,14 +269,15 @@ abstract class DatabaseInstaller {
$ret = true;
ob_start( array( $this, 'outputHandler' ) );
+ $up = DatabaseUpdater::newForDB( $this->db );
try {
- $up = DatabaseUpdater::newForDB( $this->db );
$up->doUpdates();
} catch ( MWException $e ) {
echo "\nAn error occurred:\n";
echo $e->getText();
$ret = false;
}
+ $up->purgeCache();
ob_end_flush();
return $ret;
}
@@ -526,7 +527,7 @@ abstract class DatabaseInstaller {
/**
* Get a standard web-user fieldset
- * @param $noCreateMsg String: Message to display instead of the creation checkbox.
+ * @param string $noCreateMsg Message to display instead of the creation checkbox.
* Set this to false to show a creation checkbox.
*
* @return String
diff --git a/includes/installer/DatabaseUpdater.php b/includes/installer/DatabaseUpdater.php
index ff0a99e9..25f751c7 100644
--- a/includes/installer/DatabaseUpdater.php
+++ b/includes/installer/DatabaseUpdater.php
@@ -40,6 +40,13 @@ abstract class DatabaseUpdater {
protected $updates = array();
/**
+ * Array of updates that were skipped
+ *
+ * @var array
+ */
+ protected $updatesSkipped = array();
+
+ /**
* List of extension-provided database updates
* @var array
*/
@@ -54,19 +61,43 @@ abstract class DatabaseUpdater {
protected $shared = false;
+ /**
+ * Scripts to run after database update
+ * Should be a subclass of LoggedUpdateMaintenance
+ */
protected $postDatabaseUpdateMaintenance = array(
'DeleteDefaultMessages',
'PopulateRevisionLength',
'PopulateRevisionSha1',
'PopulateImageSha1',
'FixExtLinksProtocolRelative',
+ 'PopulateFilearchiveSha1',
);
/**
+ * File handle for SQL output.
+ *
+ * @var Filehandle
+ */
+ protected $fileHandle = null;
+
+ /**
+ * Flag specifying whether or not to skip schema (e.g. SQL-only) updates.
+ *
+ * @var bool
+ */
+ protected $skipSchema = false;
+
+ /**
+ * Hold the value of $wgContentHandlerUseDB during the upgrade.
+ */
+ protected $wgContentHandlerUseDB = true;
+
+ /**
* Constructor
*
* @param $db DatabaseBase object to perform updates on
- * @param $shared bool Whether to perform updates on shared tables
+ * @param bool $shared Whether to perform updates on shared tables
* @param $maintenance Maintenance Maintenance object which created us
*/
protected function __construct( DatabaseBase &$db, $shared, Maintenance $maintenance = null ) {
@@ -75,6 +106,7 @@ abstract class DatabaseUpdater {
$this->shared = $shared;
if ( $maintenance ) {
$this->maintenance = $maintenance;
+ $this->fileHandle = $maintenance->fileHandle;
} else {
$this->maintenance = new FakeMaintenance;
}
@@ -150,7 +182,7 @@ abstract class DatabaseUpdater {
/**
* Output some text. If we're running from web, escape the text first.
*
- * @param $str String: Text to output
+ * @param string $str Text to output
*/
public function output( $str ) {
if ( $this->maintenance->isQuiet() ) {
@@ -170,14 +202,14 @@ abstract class DatabaseUpdater {
*
* @since 1.17
*
- * @param $update Array: the update to run. Format is the following:
+ * @param array $update the update to run. Format is the following:
* first item is the callback function, it also can be a
* simple string with the name of a function in this class,
* following elements are parameters to the function.
* Note that callback functions will receive this object as
* first parameter.
*/
- public function addExtensionUpdate( Array $update ) {
+ public function addExtensionUpdate( array $update ) {
$this->extensionUpdates[] = $update;
}
@@ -187,8 +219,8 @@ abstract class DatabaseUpdater {
*
* @since 1.18
*
- * @param $tableName String Name of table to create
- * @param $sqlPath String Full path to the schema file
+ * @param string $tableName Name of table to create
+ * @param string $sqlPath Full path to the schema file
*/
public function addExtensionTable( $tableName, $sqlPath ) {
$this->extensionUpdates[] = array( 'addTable', $tableName, $sqlPath, true );
@@ -230,6 +262,19 @@ abstract class DatabaseUpdater {
}
/**
+ * Drop an index from an extension table
+ *
+ * @since 1.21
+ *
+ * @param string $tableName The table name
+ * @param string $indexName The index name
+ * @param string $sqlPath The path to the SQL change path
+ */
+ public function dropExtensionIndex( $tableName, $indexName, $sqlPath ) {
+ $this->extensionUpdates[] = array( 'dropIndex', $tableName, $indexName, $sqlPath, true );
+ }
+
+ /**
*
* @since 1.20
*
@@ -241,6 +286,32 @@ abstract class DatabaseUpdater {
}
/**
+ * Rename an index on an extension table
+ *
+ * @since 1.21
+ *
+ * @param string $tableName The table name
+ * @param string $oldIndexName The old index name
+ * @param string $newIndexName The new index name
+ * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old and the new indexes exist. [facultative; by default, false]
+ * @param string $sqlPath The path to the SQL change path
+ */
+ public function renameExtensionIndex( $tableName, $oldIndexName, $newIndexName, $sqlPath, $skipBothIndexExistWarning = false ) {
+ $this->extensionUpdates[] = array( 'renameIndex', $tableName, $oldIndexName, $newIndexName, $skipBothIndexExistWarning, $sqlPath, true );
+ }
+
+ /**
+ * @since 1.21
+ *
+ * @param string $tableName The table name
+ * @param string $fieldName The field to be modified
+ * @param string $sqlPath The path to the SQL change path
+ */
+ public function modifyExtensionField( $tableName, $fieldName, $sqlPath) {
+ $this->extensionUpdates[] = array( 'modifyField', $tableName, $fieldName, $sqlPath, true );
+ }
+
+ /**
*
* @since 1.20
*
@@ -254,9 +325,11 @@ abstract class DatabaseUpdater {
/**
* Add a maintenance script to be run after the database updates are complete.
*
+ * Script should subclass LoggedUpdateMaintenance
+ *
* @since 1.19
*
- * @param $class string Name of a Maintenance subclass
+ * @param string $class Name of a Maintenance subclass
*/
public function addPostDatabaseUpdateMaintenance( $class ) {
$this->postDatabaseUpdateMaintenance[] = $class;
@@ -281,15 +354,35 @@ abstract class DatabaseUpdater {
}
/**
+ * @since 1.21
+ *
+ * Writes the schema updates desired to a file for the DB Admin to run.
+ */
+ private function writeSchemaUpdateFile( $schemaUpdate = array() ) {
+ $updates = $this->updatesSkipped;
+ $this->updatesSkipped = array();
+
+ foreach( $updates as $funcList ) {
+ $func = $funcList[0];
+ $arg = $funcList[1];
+ $origParams = $funcList[2];
+ call_user_func_array( $func, $arg );
+ flush();
+ $this->updatesSkipped[] = $origParams;
+ }
+ }
+
+ /**
* Do all the updates
*
- * @param $what Array: what updates to perform
+ * @param array $what what updates to perform
*/
- public function doUpdates( $what = array( 'core', 'extensions', 'purge', 'stats' ) ) {
- global $wgLocalisationCacheConf, $wgVersion;
+ public function doUpdates( $what = array( 'core', 'extensions', 'stats' ) ) {
+ global $wgVersion, $wgLocalisationCacheConf;
$this->db->begin( __METHOD__ );
$what = array_flip( $what );
+ $this->skipSchema = isset( $what['noschema'] ) || $this->fileHandle !== null;
if ( isset( $what['core'] ) ) {
$this->runUpdates( $this->getCoreUpdateList(), false );
}
@@ -298,8 +391,6 @@ abstract class DatabaseUpdater {
$this->runUpdates( $this->getExtensionUpdates(), true );
}
- $this->setAppliedUpdates( $wgVersion, $this->updates );
-
if ( isset( $what['stats'] ) ) {
$this->checkStats();
}
@@ -311,28 +402,46 @@ abstract class DatabaseUpdater {
$this->rebuildLocalisationCache();
}
}
+
+ $this->setAppliedUpdates( $wgVersion, $this->updates );
+
+ if( $this->fileHandle ) {
+ $this->skipSchema = false;
+ $this->writeSchemaUpdateFile();
+ $this->setAppliedUpdates( "$wgVersion-schema", $this->updatesSkipped );
+ }
+
$this->db->commit( __METHOD__ );
}
/**
* Helper function for doUpdates()
*
- * @param $updates Array of updates to run
+ * @param array $updates of updates to run
* @param $passSelf Boolean: whether to pass this object we calling external
* functions
*/
private function runUpdates( array $updates, $passSelf ) {
+ $updatesDone = array();
+ $updatesSkipped = array();
foreach ( $updates as $params ) {
+ $origParams = $params;
$func = array_shift( $params );
if( !is_array( $func ) && method_exists( $this, $func ) ) {
$func = array( $this, $func );
} elseif ( $passSelf ) {
array_unshift( $params, $this );
}
- call_user_func_array( $func, $params );
+ $ret = call_user_func_array( $func, $params );
flush();
+ if( $ret !== false ) {
+ $updatesDone[] = $origParams;
+ } else {
+ $updatesSkipped[] = array( $func, $params, $origParams );
+ }
}
- $this->updates = array_merge( $this->updates, $updates );
+ $this->updatesSkipped = array_merge( $this->updatesSkipped, $updatesSkipped );
+ $this->updates = array_merge( $this->updates, $updatesDone );
}
/**
@@ -347,7 +456,7 @@ abstract class DatabaseUpdater {
$key = "updatelist-$version-" . time();
$this->db->insert( 'updatelog',
array( 'ul_key' => $key, 'ul_value' => serialize( $updates ) ),
- __METHOD__ );
+ __METHOD__ );
$this->db->setFlag( DBO_DDLMODE );
}
@@ -355,7 +464,7 @@ abstract class DatabaseUpdater {
* Helper function: check if the given key is present in the updatelog table.
* Obviously, only use this for updates that occur after the updatelog table was
* created!
- * @param $key String Name of the key to check for
+ * @param string $key Name of the key to check for
*
* @return bool
*/
@@ -373,8 +482,8 @@ abstract class DatabaseUpdater {
* Helper function: Add a key to the updatelog table
* Obviously, only use this for updates that occur after the updatelog table was
* created!
- * @param $key String Name of key to insert
- * @param $val String [optional] value to insert along with the key
+ * @param string $key Name of key to insert
+ * @param string $val [optional] value to insert along with the key
*/
public function insertUpdateRow( $key, $val = null ) {
$this->db->clearFlag( DBO_DDLMODE );
@@ -400,6 +509,26 @@ abstract class DatabaseUpdater {
}
/**
+ * Returns whether updates should be executed on the database table $name.
+ * Updates will be prevented if the table is a shared table and it is not
+ * specified to run updates on shared tables.
+ *
+ * @param string $name table name
+ * @return bool
+ */
+ protected function doTable( $name ) {
+ global $wgSharedDB, $wgSharedTables;
+
+ // Don't bother to check $wgSharedTables if there isn't a shared database
+ // or the user actually also wants to do updates on the shared database.
+ if ( $wgSharedDB === null || $this->shared ) {
+ return true;
+ }
+
+ return !in_array( $name, $wgSharedTables );
+ }
+
+ /**
* Before 1.17, we used to handle updates via stuff like
* $wgExtNewTables/Fields/Indexes. This is nasty :) We refactored a lot
* of this in 1.17 but we want to remain back-compatible for a while. So
@@ -409,11 +538,7 @@ abstract class DatabaseUpdater {
*/
protected function getOldGlobalUpdates() {
global $wgExtNewFields, $wgExtNewTables, $wgExtModifiedFields,
- $wgExtNewIndexes, $wgSharedDB, $wgSharedTables;
-
- $doUser = $this->shared ?
- $wgSharedDB && in_array( 'user', $wgSharedTables ) :
- !$wgSharedDB || !in_array( 'user', $wgSharedTables );
+ $wgExtNewIndexes;
$updates = array();
@@ -424,12 +549,10 @@ abstract class DatabaseUpdater {
}
foreach ( $wgExtNewFields as $fieldRecord ) {
- if ( $fieldRecord[0] != 'user' || $doUser ) {
- $updates[] = array(
- 'addField', $fieldRecord[0], $fieldRecord[1],
- $fieldRecord[2], true
- );
- }
+ $updates[] = array(
+ 'addField', $fieldRecord[0], $fieldRecord[1],
+ $fieldRecord[2], true
+ );
}
foreach ( $wgExtNewIndexes as $fieldRecord ) {
@@ -457,104 +580,221 @@ abstract class DatabaseUpdater {
*
* @return Array
*/
- protected abstract function getCoreUpdateList();
+ abstract protected function getCoreUpdateList();
+
+ /**
+ * Append an SQL fragment to the open file handle.
+ *
+ * @param string $filename File name to open
+ */
+ public function copyFile( $filename ) {
+ $this->db->sourceFile( $filename, false, false, false,
+ array( $this, 'appendLine' )
+ );
+ }
+
+ /**
+ * Append a line to the open filehandle. The line is assumed to
+ * be a complete SQL statement.
+ *
+ * This is used as a callback for for sourceLine().
+ *
+ * @param string $line text to append to the file
+ * @return Boolean false to skip actually executing the file
+ * @throws MWException
+ */
+ public function appendLine( $line ) {
+ $line = rtrim( $line ) . ";\n";
+ if( fwrite( $this->fileHandle, $line ) === false ) {
+ throw new MWException( "trouble writing file" );
+ }
+ return false;
+ }
/**
* Applies a SQL patch
- * @param $path String Path to the patch file
+ *
+ * @param string $path Path to the patch file
* @param $isFullPath Boolean Whether to treat $path as a relative or not
- * @param $msg String Description of the patch
+ * @param string $msg Description of the patch
+ * @return boolean false if patch is skipped.
*/
protected function applyPatch( $path, $isFullPath = false, $msg = null ) {
if ( $msg === null ) {
$msg = "Applying $path patch";
}
+ if ( $this->skipSchema ) {
+ $this->output( "...skipping schema change ($msg).\n" );
+ return false;
+ }
+
+ $this->output( "$msg ..." );
if ( !$isFullPath ) {
$path = $this->db->patchPath( $path );
}
-
- $this->output( "$msg ..." );
- $this->db->sourceFile( $path );
+ if( $this->fileHandle !== null ) {
+ $this->copyFile( $path );
+ } else {
+ $this->db->sourceFile( $path );
+ }
$this->output( "done.\n" );
+ return true;
}
/**
* Add a new table to the database
- * @param $name String Name of the new table
- * @param $patch String Path to the patch file
+ *
+ * @param string $name Name of the new table
+ * @param string $patch Path to the patch file
* @param $fullpath Boolean Whether to treat $patch path as a relative or not
+ * @return Boolean false if this was skipped because schema changes are skipped
*/
protected function addTable( $name, $patch, $fullpath = false ) {
+ if ( !$this->doTable( $name ) ) {
+ return true;
+ }
+
if ( $this->db->tableExists( $name, __METHOD__ ) ) {
$this->output( "...$name table already exists.\n" );
} else {
- $this->applyPatch( $patch, $fullpath, "Creating $name table" );
+ return $this->applyPatch( $patch, $fullpath, "Creating $name table" );
}
+ return true;
}
/**
* Add a new field to an existing table
- * @param $table String Name of the table to modify
- * @param $field String Name of the new field
- * @param $patch String Path to the patch file
+ *
+ * @param string $table Name of the table to modify
+ * @param string $field Name of the new field
+ * @param string $patch Path to the patch file
* @param $fullpath Boolean Whether to treat $patch path as a relative or not
+ * @return Boolean false if this was skipped because schema changes are skipped
*/
protected function addField( $table, $field, $patch, $fullpath = false ) {
+ if ( !$this->doTable( $table ) ) {
+ return true;
+ }
+
if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
$this->output( "...$table table does not exist, skipping new field patch.\n" );
} elseif ( $this->db->fieldExists( $table, $field, __METHOD__ ) ) {
$this->output( "...have $field field in $table table.\n" );
} else {
- $this->applyPatch( $patch, $fullpath, "Adding $field field to table $table" );
+ return $this->applyPatch( $patch, $fullpath, "Adding $field field to table $table" );
}
+ return true;
}
/**
* Add a new index to an existing table
- * @param $table String Name of the table to modify
- * @param $index String Name of the new index
- * @param $patch String Path to the patch file
+ *
+ * @param string $table Name of the table to modify
+ * @param string $index Name of the new index
+ * @param string $patch Path to the patch file
* @param $fullpath Boolean Whether to treat $patch path as a relative or not
+ * @return Boolean false if this was skipped because schema changes are skipped
*/
protected function addIndex( $table, $index, $patch, $fullpath = false ) {
- if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
+ if ( !$this->doTable( $table ) ) {
+ return true;
+ }
+
+ if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
+ $this->output( "...skipping: '$table' table doesn't exist yet.\n" );
+ } else if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
$this->output( "...index $index already set on $table table.\n" );
} else {
- $this->applyPatch( $patch, $fullpath, "Adding index $index to table $table" );
+ return $this->applyPatch( $patch, $fullpath, "Adding index $index to table $table" );
}
+ return true;
}
/**
* Drop a field from an existing table
*
- * @param $table String Name of the table to modify
- * @param $field String Name of the old field
- * @param $patch String Path to the patch file
+ * @param string $table Name of the table to modify
+ * @param string $field Name of the old field
+ * @param string $patch Path to the patch file
* @param $fullpath Boolean Whether to treat $patch path as a relative or not
+ * @return Boolean false if this was skipped because schema changes are skipped
*/
protected function dropField( $table, $field, $patch, $fullpath = false ) {
+ if ( !$this->doTable( $table ) ) {
+ return true;
+ }
+
if ( $this->db->fieldExists( $table, $field, __METHOD__ ) ) {
- $this->applyPatch( $patch, $fullpath, "Table $table contains $field field. Dropping" );
+ return $this->applyPatch( $patch, $fullpath, "Table $table contains $field field. Dropping" );
} else {
$this->output( "...$table table does not contain $field field.\n" );
}
+ return true;
}
/**
* Drop an index from an existing table
*
- * @param $table String: Name of the table to modify
- * @param $index String: Name of the old index
- * @param $patch String: Path to the patch file
+ * @param string $table Name of the table to modify
+ * @param string $index Name of the index
+ * @param string $patch Path to the patch file
* @param $fullpath Boolean: Whether to treat $patch path as a relative or not
+ * @return Boolean false if this was skipped because schema changes are skipped
*/
protected function dropIndex( $table, $index, $patch, $fullpath = false ) {
+ if ( !$this->doTable( $table ) ) {
+ return true;
+ }
+
if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
- $this->applyPatch( $patch, $fullpath, "Dropping $index index from table $table" );
+ return $this->applyPatch( $patch, $fullpath, "Dropping $index index from table $table" );
} else {
$this->output( "...$index key doesn't exist.\n" );
}
+ return true;
+ }
+
+ /**
+ * Rename an index from an existing table
+ *
+ * @param string $table Name of the table to modify
+ * @param string $oldIndex Old name of the index
+ * @param string $newIndex New name of the index
+ * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old and the new indexes exist.
+ * @param string $patch Path to the patch file
+ * @param $fullpath Boolean: Whether to treat $patch path as a relative or not
+ * @return Boolean false if this was skipped because schema changes are skipped
+ */
+ protected function renameIndex( $table, $oldIndex, $newIndex, $skipBothIndexExistWarning, $patch, $fullpath = false ) {
+ if ( !$this->doTable( $table ) ) {
+ return true;
+ }
+
+ // First requirement: the table must exist
+ if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
+ $this->output( "...skipping: '$table' table doesn't exist yet.\n" );
+ return true;
+ }
+
+ // Second requirement: the new index must be missing
+ if ( $this->db->indexExists( $table, $newIndex, __METHOD__ ) ) {
+ $this->output( "...index $newIndex already set on $table table.\n" );
+ if ( !$skipBothIndexExistWarning && $this->db->indexExists( $table, $oldIndex, __METHOD__ ) ) {
+ $this->output( "...WARNING: $oldIndex still exists, despite it has been renamed into $newIndex (which also exists).\n" .
+ " $oldIndex should be manually removed if not needed anymore.\n" );
+ }
+ return true;
+ }
+
+ // Third requirement: the old index must exist
+ if ( !$this->db->indexExists( $table, $oldIndex, __METHOD__ ) ) {
+ $this->output( "...skipping: index $oldIndex doesn't exist.\n" );
+ return true;
+ }
+
+ // Requirements have been satisfied, patch can be applied
+ return $this->applyPatch( $patch, $fullpath, "Renaming index $oldIndex into $newIndex to table $table" );
}
/**
@@ -566,8 +806,13 @@ abstract class DatabaseUpdater {
* @param $table string
* @param $patch string|false
* @param $fullpath bool
+ * @return Boolean false if this was skipped because schema changes are skipped
*/
public function dropTable( $table, $patch = false, $fullpath = false ) {
+ if ( !$this->doTable( $table ) ) {
+ return true;
+ }
+
if ( $this->db->tableExists( $table, __METHOD__ ) ) {
$msg = "Dropping table $table";
@@ -577,23 +822,28 @@ abstract class DatabaseUpdater {
$this->output( "done.\n" );
}
else {
- $this->applyPatch( $patch, $fullpath, $msg );
+ return $this->applyPatch( $patch, $fullpath, $msg );
}
-
} else {
$this->output( "...$table doesn't exist.\n" );
}
+ return true;
}
/**
* Modify an existing field
*
- * @param $table String: name of the table to which the field belongs
- * @param $field String: name of the field to modify
- * @param $patch String: path to the patch file
+ * @param string $table name of the table to which the field belongs
+ * @param string $field name of the field to modify
+ * @param string $patch path to the patch file
* @param $fullpath Boolean: whether to treat $patch path as a relative or not
+ * @return Boolean false if this was skipped because schema changes are skipped
*/
public function modifyField( $table, $field, $patch, $fullpath = false ) {
+ if ( !$this->doTable( $table ) ) {
+ return true;
+ }
+
$updateKey = "$table-$field-$patch";
if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
$this->output( "...$table table does not exist, skipping modify field patch.\n" );
@@ -602,19 +852,25 @@ abstract class DatabaseUpdater {
} elseif( $this->updateRowExists( $updateKey ) ) {
$this->output( "...$field in table $table already modified by patch $patch.\n" );
} else {
- $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" );
$this->insertUpdateRow( $updateKey );
+ return $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" );
}
+ return true;
}
/**
* Purge the objectcache table
*/
- protected function purgeCache() {
+ public function purgeCache() {
+ global $wgLocalisationCacheConf;
# We can't guarantee that the user will be able to use TRUNCATE,
# but we know that DELETE is available to us
$this->output( "Purging caches..." );
$this->db->delete( 'objectcache', '*', __METHOD__ );
+ if ( $wgLocalisationCacheConf['manualRecache'] ) {
+ $this->rebuildLocalisationCache();
+ }
+ MessageBlobStore::clear();
$this->output( "done.\n" );
}
@@ -693,10 +949,11 @@ abstract class DatabaseUpdater {
protected function doUpdateTranscacheField() {
if ( $this->updateRowExists( 'convert transcache field' ) ) {
$this->output( "...transcache tc_time already converted.\n" );
- return;
+ return true;
}
- $this->applyPatch( 'patch-tc-timestamp.sql', false, "Converting tc_time from UNIX epoch to MediaWiki timestamp" );
+ return $this->applyPatch( 'patch-tc-timestamp.sql', false,
+ "Converting tc_time from UNIX epoch to MediaWiki timestamp" );
}
/**
@@ -704,29 +961,33 @@ abstract class DatabaseUpdater {
*/
protected function doCollationUpdate() {
global $wgCategoryCollation;
- if ( $this->db->selectField(
- 'categorylinks',
- 'COUNT(*)',
- 'cl_collation != ' . $this->db->addQuotes( $wgCategoryCollation ),
- __METHOD__
- ) == 0 ) {
- $this->output( "...collations up-to-date.\n" );
- return;
- }
+ if ( $this->db->fieldExists( 'categorylinks', 'cl_collation', __METHOD__ ) ) {
+ if ( $this->db->selectField(
+ 'categorylinks',
+ 'COUNT(*)',
+ 'cl_collation != ' . $this->db->addQuotes( $wgCategoryCollation ),
+ __METHOD__
+ ) == 0 ) {
+ $this->output( "...collations up-to-date.\n" );
+ return;
+ }
- $this->output( "Updating category collations..." );
- $task = $this->maintenance->runChild( 'UpdateCollation' );
- $task->execute();
- $this->output( "...done.\n" );
+ $this->output( "Updating category collations..." );
+ $task = $this->maintenance->runChild( 'UpdateCollation' );
+ $task->execute();
+ $this->output( "...done.\n" );
+ }
}
/**
* Migrates user options from the user table blob to user_properties
*/
protected function doMigrateUserOptions() {
- $cl = $this->maintenance->runChild( 'ConvertUserOptions', 'convertUserOptions.php' );
- $cl->execute();
- $this->output( "done.\n" );
+ if( $this->db->tableExists( 'user_properties' ) ) {
+ $cl = $this->maintenance->runChild( 'ConvertUserOptions', 'convertUserOptions.php' );
+ $cl->execute();
+ $this->output( "done.\n" );
+ }
}
/**
@@ -742,4 +1003,30 @@ abstract class DatabaseUpdater {
$cl->execute();
$this->output( "done.\n" );
}
+
+ /**
+ * Turns off content handler fields during parts of the upgrade
+ * where they aren't available.
+ */
+ protected function disableContentHandlerUseDB() {
+ global $wgContentHandlerUseDB;
+
+ if( $wgContentHandlerUseDB ) {
+ $this->output( "Turning off Content Handler DB fields for this part of upgrade.\n" );
+ $this->holdContentHandlerUseDB = $wgContentHandlerUseDB;
+ $wgContentHandlerUseDB = false;
+ }
+ }
+
+ /**
+ * Turns content handler fields back on.
+ */
+ protected function enableContentHandlerUseDB() {
+ global $wgContentHandlerUseDB;
+
+ if( $this->holdContentHandlerUseDB ) {
+ $this->output( "Content Handler DB fields should be usable now.\n" );
+ $wgContentHandlerUseDB = $this->holdContentHandlerUseDB;
+ }
+ }
}
diff --git a/includes/installer/Ibm_db2Installer.php b/includes/installer/Ibm_db2Installer.php
deleted file mode 100644
index ca9bdf4b..00000000
--- a/includes/installer/Ibm_db2Installer.php
+++ /dev/null
@@ -1,270 +0,0 @@
-<?php
-/**
- * IBM_DB2-specific installer.
- *
- * 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 Deployment
- */
-
-/**
- * Class for setting up the MediaWiki database using IBM_DB2.
- *
- * @ingroup Deployment
- * @since 1.17
- */
-class Ibm_db2Installer extends DatabaseInstaller {
-
-
- protected $globalNames = array(
- 'wgDBserver',
- 'wgDBport',
- 'wgDBname',
- 'wgDBuser',
- 'wgDBpassword',
- 'wgDBmwschema',
- );
-
- protected $internalDefaults = array(
- '_InstallUser' => 'db2admin'
- );
-
- /**
- * Get the DB2 database extension name
- * @return string
- */
- public function getName(){
- return 'ibm_db2';
- }
-
- /**
- * Determine whether the DB2 database extension is currently available in PHP
- * @return boolean
- */
- public function isCompiled() {
- return self::checkExtension( 'ibm_db2' );
- }
-
- /**
- * Generate a connection form for a DB2 database
- * @return string
- */
- public function getConnectForm() {
- return
- $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
- $this->getTextBox( 'wgDBport', 'config-db-port', array(), $this->parent->getHelpBox( 'config-db-port' ) ) .
- Html::openElement( 'fieldset' ) .
- Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
- $this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
- $this->getTextBox( 'wgDBmwschema', 'config-db-schema', array(), $this->parent->getHelpBox( 'config-db-schema-help' ) ) .
- Html::closeElement( 'fieldset' ) .
- $this->getInstallUserBox();
- }
-
- /**
- * Validate and then execute the connection form for a DB2 database
- * @return Status
- */
- public function submitConnectForm() {
- // Get variables from the request
- $newValues = $this->setVarsFromRequest(
- array( 'wgDBserver', 'wgDBport', 'wgDBname',
- 'wgDBmwschema', 'wgDBuser', 'wgDBpassword' ) );
-
- // Validate them
- $status = Status::newGood();
- if ( !strlen( $newValues['wgDBname'] ) ) {
- $status->fatal( 'config-missing-db-name' );
- } elseif ( !preg_match( '/^[a-zA-Z0-9_]+$/', $newValues['wgDBname'] ) ) {
- $status->fatal( 'config-invalid-db-name', $newValues['wgDBname'] );
- }
- if ( !strlen( $newValues['wgDBmwschema'] ) ) {
- $status->fatal( 'config-invalid-schema' );
- }
- elseif ( !preg_match( '/^[a-zA-Z0-9_]*$/', $newValues['wgDBmwschema'] ) ) {
- $status->fatal( 'config-invalid-schema', $newValues['wgDBmwschema'] );
- }
- if ( !strlen( $newValues['wgDBport'] ) ) {
- $status->fatal( 'config-invalid-port' );
- }
- elseif ( !preg_match( '/^[0-9_]*$/', $newValues['wgDBport'] ) ) {
- $status->fatal( 'config-invalid-port', $newValues['wgDBport'] );
- }
-
- // Submit user box
- if ( $status->isOK() ) {
- $status->merge( $this->submitInstallUserBox() );
- }
- if ( !$status->isOK() ) {
- return $status;
- }
-
- global $wgDBport;
- $wgDBport = $newValues['wgDBport'];
-
- // Try to connect
- $status->merge( $this->getConnection() );
- if ( !$status->isOK() ) {
- return $status;
- }
-
- $this->parent->setVar( 'wgDBuser', $this->getVar( '_InstallUser' ) );
- $this->parent->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
-
- return $status;
- }
-
- /**
- * Open a DB2 database connection
- * @return Status
- */
- public function openConnection() {
- $status = Status::newGood();
- try {
- $db = new DatabaseIbm_db2(
- $this->getVar( 'wgDBserver' ),
- $this->getVar( '_InstallUser' ),
- $this->getVar( '_InstallPassword' ),
- $this->getVar( 'wgDBname' ),
- 0,
- $this->getVar( 'wgDBmwschema' )
- );
- $status->value = $db;
- } catch ( DBConnectionError $e ) {
- $status->fatal( 'config-connection-error', $e->getMessage() );
- }
- return $status;
- }
-
- /**
- * Create a DB2 database for MediaWiki
- * @return Status
- */
- public function setupDatabase() {
- $status = $this->getConnection();
- if ( !$status->isOK() ) {
- return $status;
- }
- /**
- * @var $conn DatabaseBase
- */
- $conn = $status->value;
- $dbName = $this->getVar( 'wgDBname' );
- if( !$conn->selectDB( $dbName ) ) {
- $conn->query( "CREATE DATABASE "
- . $conn->addIdentifierQuotes( $dbName )
- . " AUTOMATIC STORAGE YES"
- . " USING CODESET UTF-8 TERRITORY US COLLATE USING SYSTEM"
- . " PAGESIZE 32768", __METHOD__ );
- $conn->selectDB( $dbName );
- }
- $this->setupSchemaVars();
- return $status;
- }
-
- /**
- * Create tables from scratch.
- * First check if pagesize >= 32k.
- *
- * @return Status
- */
- public function createTables() {
- $status = $this->getConnection();
- if ( !$status->isOK() ) {
- return $status;
- }
- $this->db->selectDB( $this->getVar( 'wgDBname' ) );
-
- if( $this->db->tableExists( 'user' ) ) {
- $status->warning( 'config-install-tables-exist' );
- return $status;
- }
-
- /* Check for pagesize */
- $status = $this->checkPageSize();
- if ( !$status->isOK() ) {
- return $status;
- }
-
- $this->db->setFlag( DBO_DDLMODE ); // For Oracle's handling of schema files
- $this->db->begin( __METHOD__ );
-
- $error = $this->db->sourceFile( $this->db->getSchemaPath() );
- if( $error !== true ) {
- $this->db->reportQueryError( $error, 0, '', __METHOD__ );
- $this->db->rollback( __METHOD__ );
- $status->fatal( 'config-install-tables-failed', $error );
- } else {
- $this->db->commit( __METHOD__ );
- }
- // Resume normal operations
- if( $status->isOk() ) {
- $this->enableLB();
- }
- return $status;
- }
-
- /**
- * Check if database has a tablspace with pagesize >= 32k.
- *
- * @return Status
- */
- public function checkPageSize() {
- $status = $this->getConnection();
- if ( !$status->isOK() ) {
- return $status;
- }
- $this->db->selectDB( $this->getVar( 'wgDBname' ) );
-
- try {
- $result = $this->db->query( 'SELECT PAGESIZE FROM SYSCAT.TABLESPACES FOR READ ONLY' );
- if( $result == false ) {
- $status->fatal( 'config-connection-error', '' );
- } else {
- $row = $this->db->fetchRow( $result );
- while ( $row ) {
- if( $row[0] >= 32768 ) {
- return $status;
- }
- $row = $this->db->fetchRow( $result );
- }
- $status->fatal( 'config-ibm_db2-low-db-pagesize', '' );
- }
- } catch ( DBUnexpectedError $e ) {
- $status->fatal( 'config-connection-error', $e->getMessage() );
- }
-
- return $status;
- }
-
- /**
- * Generate the code to store the DB2-specific settings defined by the configuration form
- * @return string
- */
- public function getLocalSettings() {
- $schema = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBmwschema' ) );
- $port = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBport' ) );
- return
-"# IBM_DB2 specific settings
-\$wgDBmwschema = \"{$schema}\";
-\$wgDBport = \"{$port}\";";
- }
-
- public function __construct( $parent ) {
- parent::__construct( $parent );
- }
-}
diff --git a/includes/installer/Ibm_db2Updater.php b/includes/installer/Ibm_db2Updater.php
deleted file mode 100644
index 9daba9c2..00000000
--- a/includes/installer/Ibm_db2Updater.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-/**
- * IBM_DB2-specific updater.
- *
- * 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 Deployment
- */
-
-/**
- * Class for handling updates to IBM_DB2 databases.
- *
- * @ingroup Deployment
- * @since 1.17
- */
-class Ibm_db2Updater extends DatabaseUpdater {
-
- /**
- * Get the changes in the DB2 database scheme since MediaWiki 1.14
- * @return array
- */
- protected function getCoreUpdateList() {
- return array(
- // 1.14
- array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ),
- array( 'addField', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
-
- // 1.15
- array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
- array( 'addTable', 'tag_summary', 'patch-change_tag_summary.sql' ),
- array( 'addTable', 'valid_tag', 'patch-change_valid_tag.sql' ),
-
- // 1.16
- array( 'addTable', 'user_properties', 'patch-user_properties.sql' ),
- array( 'addTable', 'log_search', 'patch-log_search.sql' ),
- array( 'addField', 'logging', 'log_user_text', 'patch-log_user_text.sql' ),
- array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ),
- array( 'addTable', 'external_user', 'patch-external_user.sql' ),
- array( 'addIndex', 'log_search', 'ls_field_val', 'patch-log_search-rename-index.sql' ),
- array( 'addIndex', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
- array( 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ),
-
- // 1.17
- array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
- array( 'addField', 'updatelog', 'ul_value', 'patch-ul_value.sql' ),
- array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api_and_wikiid.sql' ),
- array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ),
- array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
- array( 'addTable', 'msg_resource_links', 'patch-msg_resource_links.sql' ),
- array( 'addIndex', 'msg_resource_links', 'uq61_msg_resource_links', 'patch-uq_61_msg_resource_links.sql' ),
- array( 'addIndex', 'msg_resource', 'uq81_msg_resource', 'patch-uq_81_msg_resource.sql' ),
- array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
- array( 'addIndex', 'module_deps', 'uq96_module_deps', 'patch-uq_96_module_deps.sql' ),
- array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api-field.sql' ),
- array( 'addField', 'interwiki', 'iw_wikiid', 'patch-iw_wikiid-field.sql' ),
- array( 'addField', 'categorylinks', 'cl_sortkey_prefix', 'patch-cl_sortkey_prefix-field.sql' ),
- array( 'addField', 'categorylinks', 'cl_collation', 'patch-cl_collation-field.sql' ),
- array( 'addField', 'categorylinks', 'cl_type', 'patch-cl_type-field.sql' ),
-
- //1.18
- array( 'doUserNewTalkTimestampNotNull' ),
- array( 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ),
- array( 'modifyField', 'user_properties', 'up_property', 'patch-up_property.sql' ),
- array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
- array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql'),
- array( 'doRebuildLocalisationCache' ),
-
- // 1.19
- array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql'),
- array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ),
- array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ),
- array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ),
-
- // 1.20
- );
- }
-}
diff --git a/includes/installer/InstallDocFormatter.php b/includes/installer/InstallDocFormatter.php
index 9a389dd8..a508e24c 100644
--- a/includes/installer/InstallDocFormatter.php
+++ b/includes/installer/InstallDocFormatter.php
@@ -1,6 +1,6 @@
<?php
/**
- * Installer-specific wikitext formating.
+ * Installer-specific wikitext formatting.
*
* 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
@@ -44,9 +44,9 @@ class InstallDocFormatter {
$text = preg_replace( '/^\t\t/m', '::', $text );
$text = preg_replace( '/^\t/m', ':', $text );
// turn (bug nnnn) into links
- $text = preg_replace_callback('/bug (\d+)/', array( $this, 'replaceBugLinks' ), $text );
+ $text = preg_replace_callback( '/bug (\d+)/', array( $this, 'replaceBugLinks' ), $text );
// add links to manual to every global variable mentioned
- $text = preg_replace_callback('/(\$wg[a-z0-9_]+)/i', array( $this, 'replaceConfigLinks' ), $text );
+ $text = preg_replace_callback( '/(\$wg[a-z0-9_]+)/i', array( $this, 'replaceConfigLinks' ), $text );
return $text;
}
diff --git a/includes/installer/Installer.i18n.php b/includes/installer/Installer.i18n.php
index 4f1c4d0c..85b877a8 100644
--- a/includes/installer/Installer.i18n.php
+++ b/includes/installer/Installer.i18n.php
@@ -17,19 +17,19 @@ $messages['en'] = array(
'config-information' => 'Information',
'config-localsettings-upgrade' => "A <code>LocalSettings.php</code> file has been detected.
To upgrade this installation, please enter the value of <code>\$wgUpgradeKey</code> in the box below.
-You will find it in LocalSettings.php.",
- 'config-localsettings-cli-upgrade' => 'A LocalSettings.php file has been detected.
-To upgrade this installation, please run update.php instead',
+You will find it in <code>LocalSettings.php</code>.",
+ 'config-localsettings-cli-upgrade' => 'A <code>LocalSettings.php</code> file has been detected.
+To 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.
-To upgrade this installation, please put the following line at the bottom of your LocalSettings.php:
+To upgrade this installation, please put the following line at the bottom of your <code>LocalSettings.php</code>:
$1',
- 'config-localsettings-incomplete' => 'The existing LocalSettings.php appears to be incomplete.
+ 'config-localsettings-incomplete' => 'The existing <code>LocalSettings.php</code> appears to be incomplete.
The $1 variable is not set.
-Please change LocalSettings.php so that this variable is set, and click "Continue".',
- 'config-localsettings-connection-error' => 'An error was encountered when connecting to the database using the settings specified in LocalSettings.php or AdminSettings.php. Please fix these settings and try again.
+Please 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> or <code>AdminSettings.php</code>. Please fix these settings and try again.
$1',
'config-session-error' => 'Error starting session: $1',
@@ -93,9 +93,9 @@ You cannot install MediaWiki.',
However, 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' => "'''Warning''': The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.
+ 'config-unicode-pure-php-warning' => "'''Warning:''' The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.
If 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' => "'''Warning''': The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.
+ 'config-unicode-update-warning' => "'''Warning:''' The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.
You 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.
The following database types are supported: $1.
@@ -103,8 +103,8 @@ The following database types are supported: $1.
If you are on shared hosting, ask your hosting provider to install a suitable database driver.
If you compiled PHP yourself, reconfigure it with a database client enabled, for example using <code>./configure --with-mysql</code>.
If you installed PHP from a Debian or Ubuntu package, then you also need install the php5-mysql module.',
- 'config-outdated-sqlite' => "'''Warning''': you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
- 'config-no-fts3' => "'''Warning''': SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
+ 'config-outdated-sqlite' => "'''Warning:''' you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
+ 'config-no-fts3' => "'''Warning:''' SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
'config-register-globals' => "'''Warning: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.'''
'''Disable it if you can.'''
MediaWiki will work, but your server is exposed to potential security vulnerabilities.",
@@ -127,19 +127,19 @@ MediaWiki requires functions in this module and will not work in this configurat
If you're running Mandrake, install the php-xml package.",
'config-pcre' => 'The PCRE support module appears to be missing.
MediaWiki requires the Perl-compatible regular expression functions to work.',
- 'config-pcre-no-utf8' => "'''Fatal''': PHP's PCRE module seems to be compiled without PCRE_UTF8 support.
+ 'config-pcre-no-utf8' => "'''Fatal:''' PHP's PCRE module seems to be compiled without PCRE_UTF8 support.
MediaWiki requires UTF-8 support to function correctly.",
'config-memory-raised' => "PHP's <code>memory_limit</code> is $1, raised to $2.",
'config-memory-bad' => "'''Warning:''' PHP's <code>memory_limit</code> is $1.
This is probably too low.
The installation may fail!",
- 'config-ctype' => "'''Fatal''': PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
+ 'config-ctype' => "'''Fatal:''' PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
'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' => "'''Warning:''' Could not find [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].
Object caching is not enabled.",
- 'config-mod-security' => "'''Warning''': 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.
+ 'config-mod-security' => "'''Warning:''' 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.
Refer 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-imagemagick' => 'Found ImageMagick: <code>$1</code>.
@@ -150,7 +150,7 @@ Image thumbnailing will be enabled if you enable uploads.',
Image thumbnailing will be disabled.',
'config-no-uri' => "'''Error:''' Could not determine the current URI.
Installation aborted.",
- 'config-no-cli-uri' => "'''Warning''': No --scriptpath specified, using default: <code>$1</code>.",
+ 'config-no-cli-uri' => "'''Warning:''' No --scriptpath 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' => "'''Warning:''' Your default directory for uploads <code>$1</code> is vulnerable to arbitrary scripts execution.
@@ -163,7 +163,9 @@ Installation aborted.',
'config-using531' => 'MediaWiki cannot be used with PHP $1 due to a bug involving reference parameters to <code>__call()</code>.
Upgrade to PHP 5.3.2 or higher, or downgrade to PHP 5.3.0 to resolve this.
Installation aborted.',
- 'config-suhosin-max-value-length' => "Suhosin is installed and limits the GET parameter length to $1 bytes. MediaWiki's ResourceLoader component will work around this limit, but that will degrade performance. If at all possible, you should set suhosin.get.max_value_length to 1024 or higher in php.ini , and set \$wgResourceLoaderMaxQueryLength to the same value in LocalSettings.php .",
+ 'config-suhosin-max-value-length' => "Suhosin is installed and limits the GET parameter <code>length</code> to $1 bytes.
+MediaWiki's ResourceLoader component will work around this limit, but that will degrade performance.
+If 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.
@@ -230,7 +232,7 @@ The directory you provide must be writable by the webserver during installation.
It should '''not''' be accessible via the web, this is why we're not putting it where your PHP files are.
The installer will write a <code>.htaccess</code> file along with it, but if that fails someone can gain access to your raw database.
-That includes raw user data (e-mail addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.
+That includes raw user data (email addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.
Consider putting the database somewhere else altogether, for example in <code>/var/lib/mediawiki/yourwiki</code>.",
'config-oracle-def-ts' => 'Default tablespace:',
@@ -239,7 +241,6 @@ Consider putting the database somewhere else altogether, for example in <code>/v
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki supports the following database systems:
$1
@@ -249,12 +250,10 @@ If you do not see the database system you are trying to use listed below, then f
'config-support-postgres' => '* $1 is a popular open source database system as an alternative to MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). There may be some minor outstanding bugs, and it is not recommended for use in a production environment.',
'config-support-sqlite' => '* $1 is a lightweight database system which is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)',
'config-support-oracle' => '* $1 is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
- 'config-support-ibm_db2' => '* $1 is a commercial enterprise database.',
'config-header-mysql' => 'MySQL settings',
'config-header-postgres' => 'PostgreSQL settings',
'config-header-sqlite' => 'SQLite settings',
'config-header-oracle' => 'Oracle settings',
- 'config-header-ibm_db2' => 'IBM DB2 settings',
'config-invalid-db-type' => 'Invalid database type',
'config-missing-db-name' => 'You must enter a value for "Database name"',
'config-missing-db-host' => 'You must enter a value for "Database host"',
@@ -316,9 +315,9 @@ This is '''not recommended''' unless you are having problems with your wiki.",
'config-upgrade-done-no-regenerate' => "Upgrade complete.
You can now [$1 start using your wiki].",
- 'config-regenerate' => 'Regenerate LocalSettings.php →',
- 'config-show-table-status' => 'SHOW TABLE STATUS query failed!',
- 'config-unknown-collation' => "'''Warning:''' Database is using unrecognised collation.",
+ 'config-regenerate' => 'Regenerate <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => '<code>SHOW TABLE STATUS</code> query failed!',
+ 'config-unknown-collation' => "'''Warning:''' 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',
@@ -328,7 +327,7 @@ The account you specify here must already exist.',
'config-mysql-engine' => 'Storage engine:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
- 'config-mysql-myisam-dep' => "'''Warning''': You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:
+ 'config-mysql-myisam-dep' => "'''Warning:''' You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:
* it barely supports concurrency due to table locking
* it is more prone to corruption than other engines
* the MediaWiki codebase does not always handle MyISAM as it should
@@ -347,8 +346,6 @@ This is more efficient than MySQL's UTF-8 mode, and allows you to use the full r
In '''UTF-8 mode''', 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-ibm_db2-low-db-pagesize' => "Your DB2 database has a default tablespace with an insufficient pagesize. The pagesize has to be '''32K''' or greater.",
-
'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.',
@@ -359,7 +356,7 @@ In '''UTF-8 mode''', MySQL will know what character set your data is in, and can
'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\'\'\'".
All page titles in this namespace start with a certain prefix, which you can specify here.
-Traditionally, this prefix is derived from the name of the wiki, but it cannot contain punctuation characters such as "#" or ":".',
+Usually, 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.
Specify a different project namespace.',
'config-ns-conflict' => 'The specified namespace "<nowiki>$1</nowiki>" conflicts with a default MediaWiki namespace.
@@ -376,22 +373,22 @@ Specify a different username.',
'config-admin-password-blank' => 'Enter a password for the administrator account.',
'config-admin-password-same' => 'The password must not be the same as the username.',
'config-admin-password-mismatch' => 'The two passwords you entered do not match.',
- 'config-admin-email' => 'E-mail address:',
- 'config-admin-email-help' => 'Enter an e-mail address here to allow you to receive e-mail 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-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 e-mail address.',
+ '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.
You 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 e-mail address.
-Please provide an e-mail address if you wish to subscribe to the mailing list.',
+ 'config-subscribe-noemail' => 'You tried to subscribe to the release announcements mailing list without providing an email address.
+Please provide an email address if you wish to subscribe to the mailing list.',
'config-almost-done' => 'You are almost done!
You 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' => 'Traditional wiki',
+ 'config-profile-wiki' => 'Open wiki',
'config-profile-no-anon' => 'Account creation required',
'config-profile-fishbowl' => 'Authorized editors only',
'config-profile-private' => 'Private wiki',
@@ -401,7 +398,7 @@ In MediaWiki, it is easy to review the recent changes, and to revert any damage
However, 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.
So you have the choice.
-A '''{{int:config-profile-wiki}}''' allows anyone to edit, without even logging in.
+The '''{{int:config-profile-wiki}}''' model allows anyone to edit, without even logging in.
A wiki with '''{{int:config-profile-no-anon}}''' provides extra accountability, but may deter casual contributors.
The '''{{int:config-profile-fishbowl}}''' scenario allows approved users to edit, but the public can view the pages, including history.
@@ -426,22 +423,22 @@ If you want to be able to use text from Wikipedia, and you want Wikipedia to be
Wikipedia previously used the GNU Free Documentation License.
The GFDL is a valid license, but it is difficult to understand.
It is also difficult to reuse content licensed under the GFDL.",
- 'config-email-settings' => 'E-mail settings',
- 'config-enable-email' => 'Enable outbound e-mail',
- 'config-enable-email-help' => "If you want e-mail to work, [http://www.php.net/manual/en/mail.configuration.php PHP's mail settings] need to be configured correctly.
-If you do not want any e-mail features, you can disable them here.",
- 'config-email-user' => 'Enable user-to-user e-mail',
- 'config-email-user-help' => 'Allow all users to send each other e-mail if they have enabled it in their preferences.',
+ '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.
+If 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 e-mail authentication',
- 'config-email-auth-help' => "If this option is enabled, users have to confirm their e-mail address using a link sent to them whenever they set or change it.
-Only authenticated e-mail addresses can receive e-mails from other users or change notification e-mails.
-Setting this option is '''recommended''' for public wikis because of potential abuse of the e-mail features.",
- 'config-email-sender' => 'Return e-mail address:',
- 'config-email-sender-help' => 'Enter the e-mail address to use as the return address on outbound e-mail.
+ '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.
+Only authenticated email addresses can receive emails from other users or change notification emails.
+Setting this option is '''recommended''' 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.
This is where bounces will be sent.
Many mail servers require at least the domain name part to be valid.',
'config-upload-settings' => 'Images and file uploads',
@@ -458,6 +455,8 @@ Ideally, this should not be accessible from the web.',
'config-logo-help' => "MediaWiki's default skin includes space for a 135x160 pixel logo above the sidebar menu.
Upload an image of the appropriate size, and enter the URL here.
+You can use <code>\$wgStylePath</code> or <code>\$wgScriptPath</code> if your logo is relative to those paths.
+
If 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.
@@ -492,7 +491,7 @@ They may require additional configuration, but you can enable them now',
'config-install-alreadydone' => "'''Warning:''' You seem to have already installed MediaWiki and are trying to install it again.
Please proceed to the next page.",
'config-install-begin' => 'By pressing "{{int:config-continue}}", you will begin the installation of MediaWiki.
-If you still want to make changes, press back.',
+If 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',
@@ -517,12 +516,12 @@ MediaWiki currently requires that the tables be owned by the web user. Please sp
'config-install-user-missing-create' => 'The specified user "$1" does not exist.
Please click the "create account" checkbox below if you want to create it.',
'config-install-tables' => 'Creating tables',
- 'config-install-tables-exist' => "'''Warning''': MediaWiki tables seem to already exist.
+ 'config-install-tables-exist' => "'''Warning:''' MediaWiki tables seem to already exist.
Skipping creation.",
- 'config-install-tables-failed' => "'''Error''': Table creation failed with the following error: $1",
+ 'config-install-tables-failed' => "'''Error:''' 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' => "'''Warning''': The interwiki table seems to already have entries.
+ 'config-install-interwiki-exists' => "'''Warning:''' The interwiki table seems to already have entries.
Skipping default list.",
'config-install-stats' => 'Initializing statistics',
'config-install-keys' => 'Generating secret keys',
@@ -545,10 +544,10 @@ If the download was not offered, or if you cancelled it, you can restart the dow
$3
-'''Note''': 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.
+'''Note:''' 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.
When that has been done, you can '''[$2 enter your wiki]'''.",
- 'config-download-localsettings' => 'Download LocalSettings.php',
+ 'config-download-localsettings' => 'Download <code>LocalSettings.php</code>',
'config-help' => 'help',
'config-nofile' => 'File "$1" could not be found. Has it been deleted?',
'mainpagetext' => "'''MediaWiki has been successfully installed.'''",
@@ -557,7 +556,8 @@ When that has been done, you can '''[$2 enter your wiki]'''.",
== Getting started ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]",
);
/** Message documentation (Message documentation)
@@ -582,11 +582,22 @@ $messages['qqq'] = array(
'config-title' => 'Parameters:
* $1 is the version of MediaWiki that is being installed.',
'config-information' => '{{Identical|Information}}',
- 'config-localsettings-cli-upgrade' => 'Do not translate the <code>LocalSettings.php</code> and the <code>update.php</code> parts.',
+ 'config-localsettings-upgrade' => '{{doc-important|Do not translate <code>LocalSettings.php</code> and <code>$wgUpgradeKey</code>.}}',
+ 'config-localsettings-cli-upgrade' => '{{doc-important|Do not translate the <code>LocalSettings.php</code> and the <code>update.php</code> parts.}}',
+ 'config-upgrade-key-missing' => 'Used in info box. Parameters:
+* $1 - the upgrade key, enclosed in <code><nowiki><pre></nowikI></code> tag.',
+ 'config-localsettings-incomplete' => '{{doc-important|Do not translate <code>LocalSettings.php</code> and <code><nowiki>{{int:Config-continue}}</nowiki><code>.}}
+Parameters:
+* $1 - name of variable (any one of required variables or installer-specific global variables)',
+ 'config-localsettings-connection-error' => '{{doc-important|Do not translate <code>LocalSettings.php</code> and <code>AdminSettings.php</code>.}}
+Used as error message. Parameters:
+* $1 - (probably empty string)',
'config-session-error' => 'Parameters:
* $1 is the error that was encountered with the session.',
'config-session-expired' => 'Parameters:
* $1 is the configured session lifetime.',
+ 'config-no-session' => '{{doc-important|Do not translate <code>php.ini</code> and <code>session.save_path</code>.}}
+Used as error message.',
'config-back' => '{{Identical|Back}}',
'config-continue' => '{{Identical|Continue}}',
'config-page-language' => '{{Identical|Language}}',
@@ -600,15 +611,17 @@ $messages['qqq'] = array(
* $1 is the version of PHP that has been installed.',
'config-unicode-pure-php-warning' => 'PECL is the name of a group producing standard pieces of software for PHP, and intl is the name of their library handling some aspects of internationalization.',
'config-unicode-update-warning' => "ICU is a body producing standard software tools for support of Unicode and other internationalization aspects. This message warns the system administrator installing MediaWiki that the server's software is not up-to-date and MediaWiki will have problems handling some characters.",
- 'config-no-db' => 'Do not translate: <code>./configure --with-mysql</code>.
-<br />
-Do not translate: <code>php5-mysql</code>.
-
+ 'config-no-db' => '{{doc-important|Do not translate "<code>./configure --with-mysql</code>" and "<code>php5-mysql</code>".}}
Parameters:
* $1 is comma separated list of database types supported by MediaWiki.',
'config-no-fts3' => 'A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
+ 'config-magic-quotes-runtime' => '{{Related|Config-fatal}}',
+ 'config-magic-quotes-sybase' => '{{Related|Config-fatal}}',
+ 'config-mbstring' => '{{Related|Config-fatal}}',
+ 'config-ze1' => '{{Related|Config-fatal}}',
'config-pcre' => 'PCRE is an initialism for "Perl-compatible regular expression". Perl is programming language whose [[:w:regular expression|regular expression]] syntax is popular and used in other languages using a library called PCRE.',
- 'config-pcre-no-utf8' => "PCRE is a name of a programmers' library for supporting regular expressions. It can probably be translated without change.",
+ 'config-pcre-no-utf8' => "PCRE is a name of a programmers' library for supporting regular expressions. It can probably be translated without change.
+{{Related|Config-fatal}}",
'config-memory-raised' => 'Parameters:
* $1 is the configured <code>memory_limit</code>.
* $2 is the value to which <code>memory_limit</code> was raised.',
@@ -624,11 +637,17 @@ Add dir="ltr" to the <nowiki><code></nowiki> for right-to-left languages.',
'config-no-cli-uri' => 'Parameters:
* $1 is the default value for scriptpath.',
'config-no-cli-uploads-check' => 'CLI = [[w:Command-line interface|command-line interface]] (i.e. the installer runs as a command-line script, not using HTML interface via an internet browser)',
- 'config-suhosin-max-value-length' => 'Message shown when PHP parameter suhosin.get.max_value_length is between 0 and 1023 (that max value is hard set in MediaWiki software)',
+ 'config-suhosin-max-value-length' => '{{doc-important|Do not translate "length", "suhosin.get.max_value_length", "php.ini", "$wgResourceLoaderMaxQueryLength" and "LocalSettings.php".}}
+Message shown when PHP parameter <code>suhosin.get.max_value_length</code> is between 0 and 1023 (that max value is hard set in MediaWiki software).',
+ 'config-db-host-help' => '{{doc-singularthey}}',
'config-db-host-oracle' => 'TNS = [[:wikipedia:Transparent Network Substrate|Transparent Network Substrate]] (<== wikipedia link)',
'config-db-wiki-settings' => 'This is more acurate: "Enter identifying or distinguishing data for this wiki" since a MySQL database can host tables of several wikis.',
'config-db-account-oracle-warn' => 'A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
'config-db-account-lock' => "It might be easier to translate ''normal operation'' as \"also after the installation process\"",
+ 'config-pg-test-error' => '* $1 - database name
+* $2 - error message',
+ 'config-sqlite-dir-help' => '{{doc-important|Do not translate <code>.htaccess</code> and <code>/var/lib/mediawiki/yourwiki</code>.}}
+Used in help box.',
'config-type-mysql' => '{{optional}}',
'config-type-postgres' => '{{optional}}',
'config-type-sqlite' => '{{optional}}',
@@ -650,7 +669,7 @@ If you\'re translating this message to a right-to-left language, consider writin
'config-sqlite-dir-unwritable' => 'webserver refers to a software like Apache or Lighttpd.',
'config-can-upgrade' => 'Parameters:
* $1 - Version or Revision indicator.',
- 'config-show-table-status' => '{{doc-important|"SHOW TABLE STATUS" is a MySQL command. Do not translate this.}}',
+ 'config-show-table-status' => '{{doc-important|"<code>SHOW TABLE STATUS</code>" is a MySQL command. Do not translate this.}}',
'config-db-web-account-same' => 'checkbox label',
'config-db-web-create' => 'checkbox label',
'config-ns-generic' => '{{Identical|Project}}',
@@ -658,17 +677,25 @@ If you\'re translating this message to a right-to-left language, consider writin
'config-admin-password' => '{{Identical|Password}}',
'config-admin-email' => '{{Identical|E-mail address}}',
'config-subscribe' => 'Used as label for the installer checkbox',
+ 'config-subscribe-help' => '"Low-volume" in this context means that there will be few e-mails to that mailing list per time period.',
'config-profile-help' => 'Messages referenced:
* {{msg-mw|config-profile-wiki}}
* {{msg-mw|config-profile-no-anon}}
* {{msg-mw|config-profile-fishbowl}}
* {{msg-mw|config-profile-private}}',
+ 'config-email-settings' => '{{Identical|E-mail setting}}',
+ 'config-email-user' => '{{Identical|Enable user-to-user e-mail}}',
'config-upload-help' => 'The word "mode" here refers to the access rights given to various user groups when attempting to create and store files and/or subdiretories in the said directory on the server. It also refers to the <code>mode</code> command used to maipulate said right mask under Unix, Linux, and similar operating systems. A less operating-system-centric translation is fine.',
'config-logo-help' => '',
- 'config-cc-not-chosen' => 'Do not translate the <code>"proceed".</code> part.
-This message refers to a block of HTML being embedded into the installer page. It comes from the Creative Commons Web site. The block is in the English language. It is a scripted license chooser. When an individual license has been selected, it asks you to klick "proceed" so as to return to the MediaWiki installer page.',
+ 'config-cc-not-chosen' => '{{doc-important|Do not translate the "<code>proceed</code>" part.}}
+This message refers to a block of HTML being embedded into the installer page. It comes from the Creative Commons Web site. The block is in the English language. It is a scripted license chooser. When an individual license has been selected, it asks you to click "proceed" so as to return to the MediaWiki installer page.',
+ 'config-memcached-servers' => '{{doc-important|Do not translate "memcached".}}
+{{Identical|Memcached server}}',
'config-extensions' => '{{Identical|Extension}}',
+ 'config-extensions-help' => '{{doc-important|Do not translate <code>./extensions</code>.}}
+Used in help box.',
'config-install-step-done' => '{{Identical|Done}}',
+ 'config-install-step-failed' => '{{Identical|Failed}}',
'config-install-database' => '*{{msg-mw|Config-install-database}}
*{{msg-mw|Config-install-tables}}
*{{msg-mw|Config-install-schema}}
@@ -729,6 +756,8 @@ See also:
*{{msg-mw|Config-install-keys}}
*{{msg-mw|Config-install-sysop}}
*{{msg-mw|Config-install-mainpage}}',
+ 'config-install-interwiki-list' => '{{doc-important|Do not translate <code>interwiki.list</code>.}}
+Used as error message.',
'config-install-stats' => '*{{msg-mw|Config-install-database}}
*{{msg-mw|Config-install-tables}}
*{{msg-mw|Config-install-schema}}
@@ -779,8 +808,8 @@ See also:
'config-download-localsettings' => 'The link text used in the download link in config-install-done.',
'config-help' => 'This is used in help boxes.
{{Identical|Help}}',
- 'mainpagetext' => 'Along with {{msg|mainpagedocfooter}}, the text you will see on the Main Page when your wiki is installed.',
- 'mainpagedocfooter' => 'Along with {{msg|mainpagetext}}, the text you will see on the Main Page when your wiki is installed.
+ 'mainpagetext' => 'Along with {{msg-mw|mainpagedocfooter}}, the text you will see on the Main Page when your wiki is installed.',
+ 'mainpagedocfooter' => 'Along with {{msg-mw|mainpagetext}}, the text you will see on the Main Page when your wiki is installed.
This might be a good place to put information about <nowiki>{{GRAMMAR:}}</nowiki>. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/fi]] for an example. For languages having grammatical distinctions and not having an appropriate <nowiki>{{GRAMMAR:}}</nowiki> software available, a suggestion to check and possibly amend the messages having <nowiki>{{SITENAME}}</nowiki> may be valuable. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/ksh]] for an example.',
);
@@ -874,8 +903,8 @@ U gebruik tans $2.',
'config-upgrade-done-no-regenerate' => 'Opgradering is voltooi.
U kan nou [$1 u wiki gebruik].',
- 'config-regenerate' => 'Herskep LocalSettings.php →',
- 'config-show-table-status' => 'Die uitvoer van SHOW TABLE STATUS het gefaal!',
+ 'config-regenerate' => 'Herskep <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'Die uitvoer van <code>SHOW TABLE STATUS</code> het gefaal!',
'config-db-web-account' => 'Databasisgebruiker vir toegang tot die web',
'config-mysql-engine' => 'Stoor-enjin:',
'config-mysql-innodb' => 'InnoDB',
@@ -900,7 +929,7 @@ U kan nou [$1 u wiki gebruik].',
'config-admin-email' => 'E-posadres:',
'config-optional-continue' => 'Vra my meer vrae.',
'config-optional-skip' => 'Ek is reeds verveeld, installeer maar net die wiki.',
- 'config-profile-wiki' => 'Tradisionele wiki',
+ 'config-profile-wiki' => 'Tradisionele wiki', # Fuzzy
'config-profile-no-anon' => 'Skep van gebruiker is verpligtend',
'config-profile-fishbowl' => 'Slegs vir gemagtigde redaksie',
'config-profile-private' => 'Privaat wiki',
@@ -957,7 +986,7 @@ U sal dit moet [$1 aflaai] en dit in die hoofgids van u wiki-installasie plaas;
'''Let wel''': As u dit nie nou doen nie, sal die gegenereerde konfigurasielêer nie later meer beskikbaar wees nadat u die installasie afgesluit het nie.
As dit gedoen is, kan u '''[u $2 wiki besoek]'''.", # Fuzzy
- 'config-download-localsettings' => 'Laai LocalSettings.php af',
+ 'config-download-localsettings' => 'Laai <code>LocalSettings.php</code> af',
'config-help' => 'hulp',
'mainpagetext' => "'''MediaWiki is suksesvol geïnstalleer.'''",
'mainpagedocfooter' => "Konsulteer '''[//meta.wikimedia.org/wiki/Help:Contents User's Guide]''' vir inligting oor hoe om die wikisagteware te gebruik.
@@ -965,7 +994,7 @@ As dit gedoen is, kan u '''[u $2 wiki besoek]'''.", # Fuzzy
== Hoe om te Begin ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
);
/** Gheg Albanian (Gegë)
@@ -1025,12 +1054,13 @@ $messages['ang'] = array(
/** Arabic (العربية)
* @author Meno25
+ * @author Mido
* @author OsamaK
* @author روخو
*/
$messages['ar'] = array(
'config-desc' => 'مثبت لميدياويكي',
- 'config-title' => 'ميدياويكي 1$ التثبيت', # Fuzzy
+ 'config-title' => 'تثبيت ميدياويكي $1',
'config-information' => 'معلومات',
'config-back' => '→ ارجع',
'config-continue' => 'استمر â†',
@@ -1051,7 +1081,7 @@ $messages['ar'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings قائمة إعدادات الضبط]
* [//www.mediawiki.org/wiki/Manual:FAQ أسئلة متكررة حول ميدياويكي]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce القائمة البريدية الخاصة بإصدار ميدياويكي]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce القائمة البريدية الخاصة بإصدار ميدياويكي]', # Fuzzy
);
/** Aramaic (ÜܪܡÜÜ)
@@ -1116,16 +1146,63 @@ $messages['as'] = array(
);
/** Asturian (asturianu)
+ * @author Xuacu
*/
$messages['ast'] = array(
+ 'config-desc' => "L'instalador pa MediaWiki",
+ 'config-title' => 'Instalación de MediaWiki $1',
+ 'config-information' => 'Información',
+ 'config-localsettings-upgrade' => "Detectose un ficheru <code>LocalSettings.php</code>.
+P'anovar esta instalación, escriba'l valor de
+<code>\$wgUpgradeKey</code> nel cuadru d'abaxo.
+Alcontraralu en <code>LocalSettings.php</code>.",
+ 'config-localsettings-cli-upgrade' => "Deteutose un ficheru <code>LocalSettings.php</code>.
+P'anovar esta instalación, execute <code>update.php</code>",
+ 'config-localsettings-key' => "Clave d'anovamientu:",
+ 'config-localsettings-badkey' => 'La clave que dio ye incorreuta.',
+ 'config-upgrade-key-missing' => "Deteutose una instalación esistente de MediaWiki.
+P'anovar esta instalación, ponga la llinia siguiente al final del ficheru <code>LocalSettings.php</code>:
+
+$1",
+ 'config-localsettings-incomplete' => 'Paez que\'l ficheru <code>LocalSettings.php</code> esistente ta incompletu.
+La variable $1 nun ta definida.
+Camude\'l ficheru <code>LocalSettings.php</code> pa qu\'esta variable quede definida y calque "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => 'Alcontrose un error al conectar cola base de datos usando la configuración especificada en <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Corrixa esta configuración y vuelva a intentalo.
+
+$1',
+ 'config-your-language' => 'La so llingua:',
+ 'config-your-language-help' => "Seleicione la llingua a emplegar nel procesu d'instalación.",
+ 'config-wiki-language' => 'Llingua de la wiki:',
+ 'config-wiki-language-help' => "Seleicione la llingua que s'usará preferentemente na wiki.",
+ 'config-back' => '↠Atrás',
+ 'config-continue' => 'Siguir →',
+ 'config-page-language' => 'Llingua',
+ 'config-page-welcome' => '¡Bienveníu a MediaWiki!',
+ 'config-page-dbconnect' => 'Conectar cola base de datos',
+ 'config-page-upgrade' => 'Anovar instalación esistente',
+ 'config-page-dbsettings' => 'Configuración de la base de datos',
+ 'config-page-name' => 'Nome',
+ 'config-page-options' => 'Opciones',
+ 'config-page-install' => 'Instalar',
+ 'config-page-complete' => '¡Completo!',
+ 'config-page-restart' => 'Reaniciar la instalación',
+ 'config-page-readme' => 'Llei-me',
+ 'config-page-releasenotes' => 'Notes de la versión',
+ 'config-page-copying' => 'Copiar',
+ 'config-page-upgradedoc' => 'Anovando',
+ 'config-page-existingwiki' => 'Wiki esistente',
+ 'config-download-localsettings' => 'Descargar <code>LocalSettings.php</code>',
+ 'config-help' => 'Ayuda',
+ 'config-nofile' => 'Nun pudo atopase\'l ficheru "$1". ¿Desaniciose?',
'mainpagetext' => "'''MediaWiki instalóse correchamente.'''",
- 'mainpagedocfooter' => "Visita la [//meta.wikimedia.org/wiki/Help:Contents Guía d'usuariu] pa saber cómo usar esti software wiki.
+ 'mainpagedocfooter' => 'Visita la [//meta.wikimedia.org/wiki/Help:Contents Guía del usuariu] pa saber cómo usar esti software wiki.
== Empecipiando ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Llista de les opciones de configuración]
* [//www.mediawiki.org/wiki/Manual:FAQ FAQ de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de les ediciones de MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de les ediciones de MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Llocaliza MediaWiki na to llingua]',
);
/** Kotava (Kotava)
@@ -1238,6 +1315,7 @@ $messages['be'] = array(
* @author Jim-by
* @author Wizardist
* @author Zedlik
+ * @author ì•„ë¼
*/
$messages['be-tarask'] = array(
'config-desc' => 'Праграма ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ MediaWiki',
@@ -1245,19 +1323,19 @@ $messages['be-tarask'] = array(
'config-information' => 'ІнфармацыÑ',
'config-localsettings-upgrade' => 'Ð’Ñ‹Ñўлены файл <code>LocalSettings.php</code>.
Каб абнавіць гÑтае уÑталÑваньне, калі лаÑка, увÑдзіце значÑньне <code>$wgUpgradeKey</code> у полі ніжÑй.
-Яго можна знайÑьці Ñž LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Быў знойдзены файл LocalSettings.php.
-Каб зьмÑніць гÑтае ÑžÑталÑваньне, калі лаÑка, запуÑьціце update.php',
+Яго можна знайÑьці Ñž <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.
-Каб абнавіць гÑтае ÑžÑталÑваньне, калі лаÑка, уÑтаўце наÑтупны радок у канец Вашага LocalSettings.php:
+Каб абнавіць гÑтае ÑžÑталÑваньне, калі лаÑка, уÑтаўце наÑтупны радок у канец Вашага <code>LocalSettings.php</code>:
$1',
- 'config-localsettings-incomplete' => 'ВыглÑдае, што Ñ–Ñнуючы LocalSettings.php зьÑўлÑецца нÑпоўным.
+ 'config-localsettings-incomplete' => 'ВыглÑдае, што Ñ–Ñнуючы <code>LocalSettings.php</code> зьÑўлÑецца нÑпоўным.
Ðе ÑžÑÑ‚Ð°Ð½Ð¾ÑžÐ»ÐµÐ½Ð°Ñ Ð¿ÐµÑ€Ð°Ð¼ÐµÐ½Ð½Ð°Ñ $1.
-Калі лаÑка, зьмÑніце LocalSettings.php так, каб была ÑžÑÑ‚Ð°Ð½Ð¾ÑžÐ»ÐµÐ½Ð°Ñ Ð³ÑÑ‚Ð°Ñ Ð¿ÐµÑ€Ð°Ð¼ÐµÐ½Ð½Ð°Ñ, Ñ– націÑьніце «ПрацÑгваць».',
- 'config-localsettings-connection-error' => 'ÐдбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð·Ð»ÑƒÑ‡ÑÐ½ÑŒÐ½Ñ Ð· базай зьвеÑтак з выкарыÑтаньнем наладаў, пазначаных у LocalSettings.php ці AdminSettings.php. Калі лаÑка, выпраўце гÑÑ‚Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹ Ñ– паÑпрабуйце зноў.
+Калі лаÑка, зьмÑніце <code>LocalSettings.php</code> так, каб была ÑžÑÑ‚Ð°Ð½Ð¾ÑžÐ»ÐµÐ½Ð°Ñ Ð³ÑÑ‚Ð°Ñ Ð¿ÐµÑ€Ð°Ð¼ÐµÐ½Ð½Ð°Ñ, Ñ– націÑьніце «{{int:Config-continue}}».',
+ 'config-localsettings-connection-error' => 'ÐдбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð·Ð»ÑƒÑ‡ÑÐ½ÑŒÐ½Ñ Ð· базай зьвеÑтак з выкарыÑтаньнем наладаў, пазначаных у <code>LocalSettings.php</code> ці <code>AdminSettings.php</code>. Калі лаÑка, выпраўце гÑÑ‚Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹ Ñ– паÑпрабуйце зноў.
$1',
'config-session-error' => 'Памылка ÑтварÑÐ½ÑŒÐ½Ñ ÑÑÑÑ–Ñ–: $1',
@@ -1391,7 +1469,9 @@ MediaWiki патрабуе падтрымкі UTF-8 Ð´Ð»Ñ Ñлушнай пра
'config-using531' => 'PHP $1 не ÑумÑшчальнае з MediaWiki з-за памылкі Ñž перадачы парамÑтраў па ўказальніку да <code>__call()</code>.
Ðбнавіце PHP да вÑÑ€ÑÑ–Ñ– 5.3.2 ці болей позьнÑй, ці адкаціце да вÑÑ€ÑÑ–Ñ– 5.3.0 каб гÑта выправіць.
УÑталÑваньне перарванае.',
- 'config-suhosin-max-value-length' => 'Suhosin уÑталÑваны Ñ– абмÑжоўвае даўжыню парамÑтра GET у $1 {{PLURAL:$1|байт|байты|байтаў}}. ResourceLoader Ð´Ð»Ñ MediaWiki будзе абходзіць гÑтае абмежаваньне, што, аднак, адаб’ецца на хуткадзеÑньні. Калі магчыма, варта ÑžÑтанавіць suhosin.get.max_value_length роўным 1024 ці больш у php.ini, а такÑама ÑžÑтанавіць тое ж значÑньне Ð´Ð»Ñ $wgResourceLoaderMaxQueryLength у LocalSettings.php.',
+ 'config-suhosin-max-value-length' => 'Suhosin уÑталÑваны Ñ– абмÑжоўвае <code>даўжыню</code> парамÑтра GET да $1 {{PLURAL:$1|байта|байтаў}}.
+ResourceLoader, Ñкладнік MediaWiki, будзе абходзіць гÑтае абмежаваньне, што, адаб’ецца на прадукцыйнаÑьці.
+Калі магчыма, варта ÑžÑталÑваць у <code>php.ini</code> <code>suhosin.get.max_value_length</code> роўным 1024 ці больш, а такÑама вызначыць тое ж значÑньне Ð´Ð»Ñ <code>$wgResourceLoaderMaxQueryLength</code> у LocalSettings.php.',
'config-db-type' => 'Тып базы зьвеÑтак:',
'config-db-host' => 'ХоÑÑ‚ базы зьвеÑтак:',
'config-db-host-help' => 'Калі ÑÑрвÑÑ€ Вашай базы зьвеÑтак знаходзіцца на іншым ÑÑрвÑры, увÑдзіце тут Ñ–Ð¼Ñ Ñ…Ð¾Ñта ці IP-адраÑ.
@@ -1475,7 +1555,7 @@ $1
'config-support-postgres' => '* $1 — вÑÐ´Ð¾Ð¼Ð°Ñ ÑÑ‹ÑÑ‚Ñма базы зьвеÑтак з адкрытым кодам, ÑÐºÐ°Ñ Ð·ÑŒÑўлÑецца альтÑрнатывай MySQL ([http://www.php.net/manual/en/pgsql.installation.php Ñк кампілÑваць PHP з падтрымкай PostgreSQL]). Яна можа ўтрымліваць Ð´Ñ€Ð¾Ð±Ð½Ñ‹Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÑ–, Ñ– не Ñ€ÑкамÑндуецца выкарыÑтоўваць Ñе Ð´Ð»Ñ Ð¿Ñ€Ð°Ñ†ÑƒÑŽÑ‡Ñ‹Ñ… праектаў.',
'config-support-sqlite' => '* $1 — невÑÐ»Ñ–ÐºÐ°Ñ ÑÑ‹ÑÑ‚Ñма базы зьвеÑтак, ÑÐºÐ°Ñ Ð¼Ð°Ðµ вельмі добрую падтрымку. ([http://www.php.net/manual/en/pdo.installation.php Ñк кампілÑваць PHP з падтрымкай SQLite], выкарыÑтоўвае PDO)',
'config-support-oracle' => '* $1 зьÑўлÑецца камÑрцыйнай прафÑÑійнай базай зьвеÑтак. ([http://www.php.net/manual/en/oci8.installation.php Як ÑкампілÑваць PHP з падтрымкай OCI8])',
- 'config-support-ibm_db2' => '* $1 — база зьвеÑтак камÑрцыйнага прадпрыемÑтва.',
+ 'config-support-ibm_db2' => '* $1 — база зьвеÑтак маштабу прадпрыемÑтва. ([http://www.php.net/manual/en/ibm-db2.installation.php Як ÑкампілÑваць PHP з падтрымкай IBM DB2])',
'config-header-mysql' => 'Ðалады MySQL',
'config-header-postgres' => 'Ðалады PostgreSQL',
'config-header-sqlite' => 'Ðалады SQLite',
@@ -1542,8 +1622,8 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'Ðбнаўленьне Ñкончанае.
ЦÑпер Ð’Ñ‹ можаце [$1 пачаць працу з вікі].',
- 'config-regenerate' => 'РÑгенÑраваць LocalSettings.php →',
- 'config-show-table-status' => "Запыт 'SHOW TABLE STATUS' не атрымаўÑÑ!",
+ 'config-regenerate' => 'РÑгенÑраваць <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => "Запыт '<code>SHOW TABLE STATUS</code>' не атрымаўÑÑ!",
'config-unknown-collation' => "'''ПапÑÑ€Ñджаньне:''' база зьвеÑтак выкарыÑтоўвае нераÑпазнанае ÑупаÑтаўленьне.",
'config-db-web-account' => 'Рахунак базы зьвеÑтак Ð´Ð»Ñ Ð²Ñб-доÑтупу',
'config-db-web-help' => 'Выберыце Ñ–Ð¼Ñ ÐºÐ°Ñ€Ñ‹Ñтальніка Ñ– пароль, Ñкі выкарыÑтоўваецца вÑб-ÑÑрвÑрам Ð´Ð»Ñ Ð·Ð»ÑƒÑ‡ÑÐ½ÑŒÐ½Ñ Ð· ÑÑрвÑрам базы зьвеÑтак, Ð¿Ð°Ð´Ñ‡Ð°Ñ Ð·Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ñ‹Ñ… апÑрацыÑÑž вікі.',
@@ -1615,7 +1695,7 @@ chmod a+w $3</pre>',
'config-optional-continue' => 'Задаць болей пытаньнÑÑž.',
'config-optional-skip' => 'Хопіць, проÑта ÑžÑталÑваць вікі.',
'config-profile' => 'Профіль правоў удзельніка:',
- 'config-profile-wiki' => 'Ð¢Ñ€Ð°Ð´Ñ‹Ñ†Ñ‹Ð¹Ð½Ð°Ñ Ð²Ñ–ÐºÑ–',
+ 'config-profile-wiki' => 'ÐÐ´ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð²Ñ–ÐºÑ–',
'config-profile-no-anon' => 'ПатрÑбнае ÑтварÑньне рахунку',
'config-profile-fishbowl' => 'Толькі Ð´Ð»Ñ Ð°ÑžÑ‚Ð°Ñ€Ñ‹Ð·Ð°Ð²Ð°Ð½Ñ‹Ñ… Ñ€Ñдактараў',
'config-profile-private' => 'ÐŸÑ€Ñ‹Ð²Ð°Ñ‚Ð½Ð°Ñ Ð²Ñ–ÐºÑ–',
@@ -1631,7 +1711,7 @@ chmod a+w $3</pre>',
СцÑнар '''{{int:config-profile-fishbowl}}''' дазвалÑе Ñ€Ñдагаваць зацьверджаным удзельнікам, але ÑžÑе могуць праглÑдаць Ñтаронкі Ñ–Ñ… гіÑторыю.
'''{{int:config-profile-private}}''' дазвалÑе праглÑдаць Ñ– Ñ€Ñдагаваць Ñтаронкі толькі зацьверджаным удзельнікам.
-Больш ÑÐºÐ»Ð°Ð´Ð°Ð½Ñ‹Ñ Ð¿Ñ€Ð°Ð²Ñ‹ ўдзельнікаў даÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ð¿Ð°ÑÑŒÐ»Ñ ÑžÑталÑваньнÑ, глÑдзіце [//www.mediawiki.org/wiki/Manual:User_rights адпаведную Ñтаронку дакумÑнтацыі].",
+Больш ÑÐºÐ»Ð°Ð´Ð°Ð½Ñ‹Ñ Ð¿Ñ€Ð°Ð²Ñ‹ ўдзельнікаў даÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ð¿Ð°ÑÑŒÐ»Ñ ÑžÑталÑваньнÑ, глÑдзіце [//www.mediawiki.org/wiki/Manual:User_rights адпаведную Ñтаронку дакумÑнтацыі].", # Fuzzy
'config-license' => 'ÐўтарÑÐºÑ–Ñ Ð¿Ñ€Ð°Ð²Ñ‹ Ñ– ліцÑнзіÑ:',
'config-license-none' => 'Без інфармацыі пра ліцÑнзію',
'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
@@ -1716,7 +1796,7 @@ chmod a+w $3</pre>',
'config-install-alreadydone' => "'''ПапÑÑ€Ñджаньне:''' здаецца, што Ð’Ñ‹ ўжо ÑžÑталёўвалі MediaWiki Ñ– Ñпрабуеце зрабіць гÑтай зноў.
Калі лаÑка, перайдзіце на наÑтупную Ñтаронку.",
'config-install-begin' => 'ПаÑÑŒÐ»Ñ Ð½Ð°Ñ†Ñ–Ñку кнопкі «{{int:config-continue}}» пачнецца ÑžÑталÑваньне MediaWiki.
-Калі Ð’Ñ‹ жадаеце што-небудзь зьмÑніць, націÑьніце кнопку «ВÑрнуцца».',
+Калі Ð’Ñ‹ жадаеце што-небудзь зьмÑніць, націÑьніце кнопку «ВÑрнуцца».', # Fuzzy
'config-install-step-done' => 'зроблена',
'config-install-step-failed' => 'не атрымалаÑÑ',
'config-install-extensions' => 'Уключаючы пашырÑньні',
@@ -1772,7 +1852,7 @@ $3
'''Заўвага''': калі Ð’Ñ‹ гÑтага Ð½Ñ Ð·Ñ€Ð¾Ð±Ñ–Ñ†Ðµ зараз, то Ñтвораны файл Ð½Ñ Ð±ÑƒÐ´Ð·Ðµ даÑтупны Вам потым, калі Ð’Ñ‹ выйдзеце з праграмы ÑžÑталÑÐ²Ð°Ð½ÑŒÐ½Ñ Ð±ÐµÐ· Ñго загрузкі.
Калі Ð’Ñ‹ гÑта зробіце, Ð’Ñ‹ можаце '''[$2 ўвайÑьці Ñž Вашую вікі]'''.",
- 'config-download-localsettings' => 'Загрузіць LocalSettings.php',
+ 'config-download-localsettings' => 'Загрузіць <code>LocalSettings.php</code>',
'config-help' => 'дапамога',
'config-nofile' => 'Файл «$1» Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ñ‹. Ці быў ён выдалены?',
'mainpagetext' => "'''MediaWiki паÑьпÑхова ÑžÑталÑванаÑ.'''",
@@ -1781,11 +1861,12 @@ $3
== З чаго пачаць ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Ð¡ÑŒÐ¿Ñ–Ñ Ð¿Ð°Ñ€Ð°Ð¼Ñтраў канфігурацыі]
* [//www.mediawiki.org/wiki/Manual:FAQ ЧаÑÑ‚Ñ‹Ñ Ð¿Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ– MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce РаÑÑылка паведамленьнÑÑž пра зьÑўленьне новых вÑÑ€ÑÑ–ÑÑž MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce РаÑÑылка паведамленьнÑÑž пра зьÑўленьне новых вÑÑ€ÑÑ–ÑÑž MediaWiki]', # Fuzzy
);
/** Bulgarian (българÑки)
* @author DCLXVI
+ * @author ì•„ë¼
*/
$messages['bg'] = array(
'config-desc' => 'ИнÑталатор на МедиÑУики',
@@ -1793,19 +1874,19 @@ $messages['bg'] = array(
'config-information' => 'ИнформациÑ',
'config-localsettings-upgrade' => 'Беше открит файл <code>LocalSettings.php</code>.
За надграждане на ÑъщеÑтвуващата инÑталациÑ, необходимо е в кутиÑта по-долу да Ñе въведе ÑтойноÑтта на <code>$wgUpgradeKey</code>.
-Тази Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ðµ налична в LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Беше открит файл LocalSettings.php.
-За надграждане на наличната инÑталациÑ, необходимо е да Ñе Ñтартира update.php',
+Тази Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ðµ налична в <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' => 'Беше открита ÑъщеÑтвуваща инÑÑ‚Ð°Ð»Ð°Ñ†Ð¸Ñ Ð½Ð° МедиÑУики.
-За надграждане на ÑъщеÑтвуващата инÑталациÑ, необходимо е да Ñе поÑтави ÑледниÑÑ‚ ред в ÐºÑ€Ð°Ñ Ð½Ð° файла LocalSettings.php:
+За надграждане на ÑъщеÑтвуващата инÑталациÑ, необходимо е да Ñе поÑтави ÑледниÑÑ‚ ред в ÐºÑ€Ð°Ñ Ð½Ð° файла <code>LocalSettings.php</code>:
$1',
- 'config-localsettings-incomplete' => 'СъщеÑтвуващиÑÑ‚ файл LocalSettings.php изглежда непълен.
+ 'config-localsettings-incomplete' => 'СъщеÑтвуващиÑÑ‚ файл <code>LocalSettings.php</code> изглежда непълен.
Променливата $1 не е зададена.
-Ðеобходимо е да Ñе редактира файлът LocalSettings.php и да Ñе зададе променливата, Ñлед което да Ñе натиÑне "Продължаване".',
- 'config-localsettings-connection-error' => 'Възникна грешка при Ñвързване Ñ Ð±Ð°Ð·Ð°Ñ‚Ð° от данни чрез данните, поÑочени в LocalSettings.php или AdminSettings.php. Ðеобходимо е да Ñе коригират тези наÑтройки преди повторен опит за Ñвързване.
+Ðеобходимо е да Ñе редактира файлът <code>LocalSettings.php</code> и да Ñе зададе променливата, Ñлед което да Ñе натиÑне „{{int:Config-continue}}“.',
+ 'config-localsettings-connection-error' => 'Възникна грешка при Ñвързване Ñ Ð±Ð°Ð·Ð°Ñ‚Ð° от данни чрез данните, поÑочени в <code>LocalSettings.php</code> или <code>AdminSettings.php</code>. Ðеобходимо е да Ñе коригират тези наÑтройки преди повторен опит за Ñвързване.
$1',
'config-session-error' => 'Грешка при Ñъздаване на ÑеÑиÑ: $1',
@@ -1933,7 +2014,7 @@ $1
'config-using531' => 'МедиÑУики не може да Ñе използва Ñ PHP $1 заради проблем Ñ Ñ€ÐµÑ„ÐµÑ€ÐµÐ½Ñ‚Ð½Ð¸Ñ‚Ðµ параметри за <code>__call()</code>.
За разрешаване на този проблем е необходимо да Ñе обнови до PHP 5.3.2 или по-нова верÑÐ¸Ñ Ð¸Ð»Ð¸ да Ñе инÑталира по-Ñтара верÑиÑ, напр. PHP 5.3.0.
ИнÑталациÑта беше прекратена.',
- 'config-suhosin-max-value-length' => 'Suhosin е инÑталиран и ограничава дължината на параметъра GET на $1 байта. Компонентът на МедиÑУики ResourceLoader ще може да пренебрегне чаÑтично това ограничение, но това ще намали производителноÑтта. По възможноÑÑ‚ е препоръчително да Ñе наÑтрои suhosin.get.max_value_length на 1024 или по-голÑма ÑтойноÑÑ‚ в php.ini и в LocalSettings.php да Ñе наÑтрои $wgResourceLoaderMaxQueryLength ÑÑŠÑ Ñъщата ÑтойноÑÑ‚.',
+ 'config-suhosin-max-value-length' => 'Suhosin е инÑталиран и ограничава дължината на параметъра GET на $1 байта. Компонентът на МедиÑУики ResourceLoader ще може да пренебрегне чаÑтично това ограничение, но това ще намали производителноÑтта. По възможноÑÑ‚ е препоръчително да Ñе наÑтрои <code>suhosin.get.max_value_length</code> на 1024 или по-голÑма ÑтойноÑÑ‚ в <code>php.ini</code> и в LocalSettings.php да Ñе наÑтрои <code>$wgResourceLoaderMaxQueryLength</code> ÑÑŠÑ Ñъщата ÑтойноÑÑ‚.', # Fuzzy
'config-db-type' => 'Тип на базата от данни:',
'config-db-host' => 'ХоÑÑ‚ на базата от данни:',
'config-db-host-help' => 'Ðко базата от данни е на друг Ñървър, в кутиÑта Ñе въвежда името на хоÑта или IP адреÑа.
@@ -2000,7 +2081,7 @@ $1
'config-support-postgres' => '* $1 е популÑрна ÑиÑтема за бази от данни Ñ Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½ изходен код, коÑто е алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на PostgreSQL]). Възможно е вÑе още да има грешки, затова не Ñе препоръчва да Ñе използва в общодоÑтъпна Ñреда.',
'config-support-sqlite' => '* $1 е лека ÑиÑтема за база от данни, коÑто е много добре поддържана. ([http://www.php.net/manual/en/pdo.installation.php Как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на SQLite], използва PDO)',
'config-support-oracle' => '* $1 е комерÑиална корпоративна база от данни. ([http://www.php.net/manual/en/oci8.installation.php Как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на OCI8])',
- 'config-support-ibm_db2' => '* $1 е комерÑиална фирмена база от данни.',
+ 'config-support-ibm_db2' => '* $1 е комерÑиална фирмена база от данни. ([http://www.php.net/manual/en/ibm-db2.installation.php Как Ñе компилира PHP Ñ Ð¿Ð¾Ð´Ð´Ñ€ÑŠÐ¶ÐºÐ° на IBM DB2])',
'config-header-mysql' => 'ÐаÑтройки за MySQL',
'config-header-postgres' => 'ÐаÑтройки за PostgreSQL',
'config-header-sqlite' => 'ÐаÑтройки за SQLite',
@@ -2067,8 +2148,8 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'ОбновÑването приключи.
Вече е възможно [$1 да използвате уикито].',
- 'config-regenerate' => 'Създаване на LocalSettings.php →',
- 'config-show-table-status' => 'ЗаÑвката SHOW TABLE STATUS не Ñполучи!',
+ 'config-regenerate' => 'Създаване на <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'ЗаÑвката <code>SHOW TABLE STATUS</code> не Ñполучи!',
'config-unknown-collation' => "'''Предупреждение:''' Базата от данни използва неразпозната колациÑ.",
'config-db-web-account' => 'Сметка за уеб доÑтъп до базата от данни',
'config-db-web-help' => 'Избиране на потребителÑко име и парола, които уеб Ñървърът ще използва да Ñе Ñвързва Ñ Ð±Ð°Ð·Ð°Ñ‚Ð° от данни при обичайната работа на уикито.',
@@ -2139,7 +2220,7 @@ chmod a+w $3</pre>',
'config-optional-continue' => 'Задаване на допълнителни въпроÑи.',
'config-optional-skip' => 'ДоÑтатъчно, инÑталиране на уикито.',
'config-profile' => 'Профил на потребителÑките права:',
- 'config-profile-wiki' => 'Традиционно уики',
+ 'config-profile-wiki' => 'Отворено уики',
'config-profile-no-anon' => 'Ðеобходимо е Ñъздаване на Ñметка',
'config-profile-fishbowl' => 'Само одобрени редактори',
'config-profile-private' => 'Затворено уики',
@@ -2155,7 +2236,7 @@ chmod a+w $3</pre>',
Уики, което е '''{{int:config-profile-fishbowl}}''' позволÑва на вÑички да преглеждат Ñтраниците, но Ñамо предварително одобрени редактори могат да редактират Ñъдържанието.
Ð’ '''{{int:config-profile-private}}''' Ñамо предварително одобрени потребители могат да четат и редактират Ñъдържанието.
-Детайлно обÑÑнение на конфигурациите на потребителÑките права е доÑтъпно Ñлед инÑталациÑта в [//www.mediawiki.org/wiki/Manual:User_rights Ðаръчника за потребителÑки права].",
+Детайлно обÑÑнение на конфигурациите на потребителÑките права е доÑтъпно Ñлед инÑталациÑта в [//www.mediawiki.org/wiki/Manual:User_rights Ðаръчника за потребителÑки права].", # Fuzzy
'config-license' => 'ÐвторÑки права и лиценз:',
'config-license-none' => 'Без лиценз',
'config-license-cc-by-sa' => 'Криейтив ÐšÐ¾Ð¼ÑŠÐ½Ñ ÐŸÑ€Ð¸Ð·Ð½Ð°Ð½Ð¸Ðµ-СподелÑне на Ñподеленото',
@@ -2238,8 +2319,8 @@ chmod a+w $3</pre>',
Възможно е те да изиÑкват допълнително конфигуриране, но Ñега могат да бъдат включени.',
'config-install-alreadydone' => "'''Предупреждение:''' Изглежда вече Ñте инÑталирали МедиÑУики и Ñе опитвате да го инÑталирате отново.
Продължете към Ñледващата Ñтраница.",
- 'config-install-begin' => 'ИнÑталациÑта на МедиÑУики ще започне Ñлед натиÑкане на бутона "{{int:config-continue}}".
-Ðко желаете да направите промени, натиÑнете Връщане.',
+ 'config-install-begin' => 'ИнÑталациÑта на МедиÑУики ще започне Ñлед натиÑкане на бутона „{{int:config-continue}}“.
+Ð’ Ñлучай, че е необходимо да Ñе направÑÑ‚ промени, използва Ñе бутона „{{int:config-back}}“.',
'config-install-step-done' => 'готово',
'config-install-step-failed' => 'неуÑпешно',
'config-install-extensions' => 'ДобавÑне на разширениÑта',
@@ -2294,15 +2375,17 @@ $3
'''Забележка''': Ðко това не бъде извършено Ñега, генерираниÑÑ‚ конфигурационен файл нÑма да е доÑтъпен на по-къÑен етап ако не бъде изтеглен Ñега или инÑталациÑта приключи без изтеглÑнето му.
Когато файлът вече е в оÑновната директориÑ, '''[$2 уикито ще е доÑтъпно на този адреÑ]'''.",
- 'config-download-localsettings' => 'ИзтеглÑне на LocalSettings.php',
+ 'config-download-localsettings' => 'ИзтеглÑне на <code>LocalSettings.php</code>',
'config-help' => 'помощ',
+ 'config-nofile' => 'Файлът „$1“ не може да бъде открит. Да не е бил изтрит?',
'mainpagetext' => "'''Уикито беше уÑпешно инÑталирано.'''",
- 'mainpagedocfooter' => 'Разгледайте [//meta.wikimedia.org/wiki/Help:Contents ръководÑтвото] за подробна Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно използването на Ñофтуера.
+ 'mainpagedocfooter' => 'Разгледайте [//meta.wikimedia.org/wiki/Help:Contents ръководÑтвото] за подробна Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно използването на уики Ñофтуера.
== Първи Ñтъпки ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Конфигурационни наÑтройки]
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings ÐаÑтройки за конфигуриране]
* [//www.mediawiki.org/wiki/Manual:FAQ ЧЗВ за МедиÑУики]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ПощенÑки ÑпиÑък отноÑно нови верÑии на МедиÑУики]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ПощенÑки ÑпиÑък отноÑно нови верÑии на МедиÑУики]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Локализиране на МедиÑУики]',
);
/** Banjar (Bahasa Banjar)
@@ -2452,6 +2535,7 @@ $messages['bpy'] = array(
* @author Fulup
* @author Gwendal
* @author Y-M D
+ * @author ì•„ë¼
*/
$messages['br'] = array(
'config-desc' => 'Poellad staliañ MediaWIki',
@@ -2459,19 +2543,19 @@ $messages['br'] = array(
'config-information' => 'Titouroù',
'config-localsettings-upgrade' => 'Kavet ez eus bet ur restr <code>LocalSettings.php</code>.
Evit hizivaat ar staliadur-se, merkit an talvoud <code>$wgUpgradeKey</code> er voest dindan.
-E gavout a rit e LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Dinoet ez eus bet ur restr LocalSettings.php.
-Evit lakaat ar staliadur-mañ a-live, implijit update.php e plas',
+E gavout a rit e <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'Dinoet ez eus bet ur restr <code>LocalSettings.php</code>.
+Evit lakaat ar staliadur-mañ a-live, implijit <code>update.php</code> e plas',
'config-localsettings-key' => "Alc'hwez hizivaat :",
'config-localsettings-badkey' => "Direizh eo an alc'hwez merket ganeoc'h",
'config-upgrade-key-missing' => 'Kavet ez eus bet ur staliadur kent eus MediaWiki.
-Evit hizivaat ar staliadur-se, ouzhpennit al linenn da-heul e traoñ ho restr LocalSettings.php:
+Evit hizivaat ar staliadur-se, ouzhpennit al linenn da-heul e traoñ ho restr <code>LocalSettings.php</code>:
$1',
- 'config-localsettings-incomplete' => "Diglok e seblant bezañ ar restr LocalSettings.php zo anezhi dija.
+ 'config-localsettings-incomplete' => "Diglok e seblant bezañ ar restr <code>LocalSettings.php</code> zo anezhi dija.
An argemmenn $1 n'eo ket termenet.
-Kemmit LocalSettings.php evit ma vo termenet an argemmenn-se, ha klikit war « Kenderc'hel ».",
- 'config-localsettings-connection-error' => "C'hoarvezet ez eus ur fazi en ur gevreañ ouzh an diaz roadennoù oc'h implijout an arventennoù diferet e LocalSettings.php pe AdminSettings.php. Reizhit an arventennoù-se hag esaeit en-dro.
+Kemmit <code>LocalSettings.php</code> evit ma vo termenet an argemmenn-se, ha klikit war « {{int:Config-continue}} ».",
+ 'config-localsettings-connection-error' => "C'hoarvezet ez eus ur fazi en ur gevreañ ouzh an diaz roadennoù oc'h implijout an arventennoù diferet e <code>LocalSettings.php</code> pe <code>AdminSettings.php</code>. Reizhit an arventennoù-se hag esaeit en-dro.
$1",
'config-session-error' => "Fazi e-ser loc'hañ an dalc'h : $1",
@@ -2640,7 +2724,6 @@ Arabat cheñch anezho ma n'hoc'h eus ket ezhomm d'en ober.",
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => "Skoret eo ar reizhiadoù diaz titouroù da-heul gant MediaWiki :
$1
@@ -2650,12 +2733,10 @@ Ma ne welit ket amañ dindan ar reizhiad diaz titouroù a fell deoc'h ober ganti
'config-support-postgres' => "* Ur reizhiad diaz titouroù brudet ha digor eo $1. Gallout a ra ober evit MySQL ([http://www.php.net/manual/en/pgsql.installation.php Penaos kempunañ PHP gant skor PostgreSQL]). Gallout a ra bezañ un nebeud drein bihan enni ha n'eo ket erbedet he implijout en un endro produiñ.",
'config-support-sqlite' => "* $1 zo ur reizhiad diaz titouroù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)",
'config-support-oracle' => '* $1 zo un diaz titouroù kenwerzhel. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])',
- 'config-support-ibm_db2' => '* Un diaz titouroù evit embregerezhioù kenwerzhel eo $1.',
'config-header-mysql' => 'Arventennoù MySQL',
'config-header-postgres' => 'Arventennoù PostgreSQL',
'config-header-sqlite' => 'Arventennoù SQLite',
'config-header-oracle' => 'Arventennoù Oracle',
- 'config-header-ibm_db2' => 'Arventennoù IBM DB2',
'config-invalid-db-type' => 'Direizh eo ar seurt diaz roadennoù',
'config-missing-db-name' => 'Ret eo deoc\'h merkañ un dalvoudenn evit "Anv an diaz titouroù"',
'config-missing-db-host' => 'Ret eo deoc\'h merkañ un dalvoudenn evit "Ostiz an diaz titouroù"',
@@ -2692,8 +2773,8 @@ Da hizivaat anezho da VediaWiki $1, klikañ war '''Kenderc'hel'''.",
'config-upgrade-done-no-regenerate' => 'Hizivadenn kaset da benn.
Gallout a rit [$1 kregiñ da implijout ho wiki].',
- 'config-regenerate' => 'Adgenel LocalSettings.php →',
- 'config-show-table-status' => "C'hwitet ar reked SHOW TABLE STATUS !",
+ 'config-regenerate' => 'Adgenel <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => "C'hwitet ar reked <code>SHOW TABLE STATUS</code> !",
'config-unknown-collation' => "'''Diwallit :''' Emañ an diaz roadennoù o renkañ an traoù diouzh un urzh lizherennek dianav.",
'config-db-web-account' => 'Kont an diaz roadennoù evit ar voned Kenrouedad',
'config-db-web-help' => 'Diuzañ an anv implijer hag ar ger-tremen a vo implijet gant ar servijer web evit kevreañ ouzh ar servijer diaz roadennoù pa vez ar wiki o vont en-dro war ar pemdez.',
@@ -2740,7 +2821,7 @@ Gellout a rit tremen ar c'hefluniadur nevez ha staliañ ar wiki war-eeun.",
'config-optional-continue' => "Sevel muioc'h a goulennoù ouzhin.",
'config-optional-skip' => 'Aet on skuizh, staliañ ar wiki hepken.',
'config-profile' => 'Profil ar gwirioù implijer :',
- 'config-profile-wiki' => 'Wiki hengounel',
+ 'config-profile-wiki' => 'Wiki digor',
'config-profile-no-anon' => 'Krouidigezh ur gont ret',
'config-profile-fishbowl' => 'Embanner aotreet hepken',
'config-profile-private' => 'Wiki prevez',
@@ -2797,7 +2878,7 @@ Marteze e vo ezhomm kefluniañ pelloc'h met gallout a rit o gweredekaat bremañ.
'config-install-alreadydone' => "'''Diwallit''': Staliet hoc'h eus MediaWiki dija war a seblant hag emaoc'h o klask e staliañ c'hoazh.
Kit d'ar bajenn war-lerc'h, mar plij.",
'config-install-begin' => 'Pa vo bet pouezet ganeoc\'h war "{{int:config-continue}}" e krogo staliadur MediaWiki.
-Pouezit war Kent mar fell deoc\'h cheñch tra pe dra.',
+Pouezit war "{{int:config-back}}" mar fell deoc\'h cheñch tra pe dra.',
'config-install-step-done' => 'graet',
'config-install-step-failed' => "c'hwitet",
'config-install-extensions' => 'En ur gontañ an astennoù',
@@ -2825,16 +2906,18 @@ Gwiriit hag-eñ e c'hall an implijer « $1 » skrivañ er brastres « $2 ».",
'config-install-mainpage' => "O krouiñ ar bajenn bennañ gant un endalc'had dre ziouer",
'config-install-extension-tables' => 'O krouiñ taolennoù evit an astennoù gweredekaet',
'config-install-mainpage-failed' => "Ne c'haller ket ensoc'hañ ar bajenn bennañ: $1",
- 'config-download-localsettings' => 'Pellgargañ LocalSettings.php',
+ 'config-download-localsettings' => 'Pellgargañ <code>LocalSettings.php</code>',
'config-help' => 'skoazell',
+ 'config-nofile' => 'N\'eus ket bet gallet kavout ar restr "$1". Daoust ha dilamet eo bet ?',
'mainpagetext' => "'''Meziant MediaWiki staliet.'''",
'mainpagedocfooter' => "Sellit ouzh [//meta.wikimedia.org/wiki/Help:Contents Sturlevr an implijerien] evit gouzout hiroc'h war an doare da implijout ar meziant wiki.
== Kregiñ ganti ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Roll an arventennoù kefluniañ]
+* [//www.mediawiki.org/wiki/Manual:FAQ FAG MediaWiki]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Roll ar c'haozeadennoù diwar-benn dasparzhoù MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lec'hiañ MediaWiki en ho yezh", # Fuzzy
);
/** Bosnian (bosanski)
@@ -2846,7 +2929,7 @@ $messages['bs'] = array(
'config-information' => 'Informacija',
'config-localsettings-upgrade' => 'Otkrivena je datoteka <code>LocalSettings.php</code>.
Da biste unaprijedili vaš softver, molimo vas upišite vrijednost od <code>$wgUpgradeKey</code> u okvir ispod.
-Naći ćete ga u LocalSettings.php.',
+Naći ćete ga u <code>LocalSettings.php</code>.',
'config-localsettings-key' => 'KljuÄ za nadgradnju:',
'config-session-error' => 'Greška pri pokretanju sesije: $1',
'config-no-session' => 'Vaši podaci sesije su izgubljeni!
@@ -2919,15 +3002,28 @@ Ovo '''nije preporuÄeno''' osim ako nemate problema s vaÅ¡om wiki.",
== PoÄetak ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista postavki]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki najÄešće postavljana pitanja]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]', # Fuzzy
);
/** Catalan (català)
+ * @author Pitort
* @author පසිඳු කà·à·€à·’න්ද
*/
$messages['ca'] = array(
'config-page-language' => 'Llengua',
'config-page-name' => 'Nom',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-ns-generic' => 'Projecte',
+ 'config-admin-password' => 'Contrasenya:',
+ 'config-profile-wiki' => 'Wiki públic',
+ 'config-profile-private' => 'Wiki privat',
+ 'config-license-pd' => 'Domini públic',
+ 'config-upload-deleted' => 'Directori pels arxius suprimits:',
+ 'config-advanced-settings' => 'Configuració avançada',
+ 'config-extensions' => 'Extensions',
'mainpagetext' => "'''El programari del MediaWiki s'ha instaŀlat correctament.'''",
'mainpagedocfooter' => "Consulteu la [//meta.wikimedia.org/wiki/Help:Contents Guia d'Usuari] per a més informació sobre com utilitzar-lo.
@@ -2935,7 +3031,7 @@ $messages['ca'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Llista de característiques configurables]
* [//www.mediawiki.org/wiki/Manual:FAQ PMF del MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de correu (''listserv'') per a anuncis del MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de correu (''listserv'') per a anuncis del MediaWiki]", # Fuzzy
);
/** Chechen (нохчийн)
@@ -2966,15 +3062,20 @@ $messages['ceb'] = array(
/** Sorani Kurdish (کوردی)
* @author Asoxor
+ * @author Calak
*/
$messages['ckb'] = array(
+ 'config-wiki-language' => 'زمانی ویکی:',
+ 'config-page-language' => 'زمان',
+ 'config-page-name' => 'ناو',
'mainpagetext' => "'''میدیاویکی بە سەرکەوتوویی دامەزرا.'''",
- 'mainpagedocfooter' => 'پرس بکە بە [//meta.wikimedia.org/wiki/Help:Contents ڕێنوێنیی بەکارھێنەران] بۆ زانیاری سەبارەت بە بەکارھێنانی نەرمامێری ویکی.
+ 'mainpagedocfooter' => 'لە [//meta.wikimedia.org/wiki/Help:Contents ڕێنوێنیی بەکارھێنەران] بۆ زانیاری سەبارەت بە بەکارھێنانی نەرمامێری ویکی کەڵک وەربگرە.
== دەستپێکردن ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings لیستی ڕێکخستنەکان شێوەپێدان]
-* [//www.mediawiki.org/wiki/Manual:FAQ پرسیارە دوپاتکراوەکانی میدیاویکی (MediaWiki FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce لیستی ئیمەیلی وەشانەکانی میدیاویکی]',
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings پێرستی ڕێکخستنەکانی شێوەپێدان]
+* [//www.mediawiki.org/wiki/Manual:FAQ پرسیارە دووپاتکراوەکانی میدیاویکی (MediaWiki FAQ)]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce پێرستی ئیمەیلی وەشانەکانی میدیاویکی]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources خۆماڵیکردنی ویکیمیدیا بۆ زمانەکەت]',
);
/** Capiznon (Capiceño)
@@ -3018,25 +3119,26 @@ $messages['crh-latn'] = array(
/** Czech (Äesky)
* @author Danny B.
* @author Mormegil
+ * @author ì•„ë¼
*/
$messages['cs'] = array(
'config-desc' => 'InstalaÄní program pro MediaWiki',
'config-title' => 'Instalace MediaWiki $1',
'config-information' => 'Informace',
'config-localsettings-upgrade' => 'Byl nalezen soubor <code>LocalSettings.php</code>.
-Pokud chcete stávající instalaci aktualizovat, zadejte hodnotu <code>$wgUpgradeKey</code>, kterou naleznete v souboru LocalSettings.php, do následujícího rámeÄku.',
- 'config-localsettings-cli-upgrade' => 'Byl detekován soubor <code>LocalSettings.php</code>
+Pokud chcete stávající instalaci aktualizovat, zadejte hodnotu <code>$wgUpgradeKey</code>, kterou naleznete v souboru <code>LocalSettings.php</code>, do následujícího rámeÄku.',
+ 'config-localsettings-cli-upgrade' => 'Byl detekován soubor <code><code>LocalSettings.php</code></code>
Pro aktualizaci spusťte místo instalace skript <code>update.php</code>.',
'config-localsettings-key' => 'KlÃ­Ä pro aktualizaci:',
'config-localsettings-badkey' => 'Zadaný klÃ­Ä je nesprávný.',
'config-upgrade-key-missing' => 'Byla detekována existující instalace MediaWiki.
-Pokud ji chcete aktualizovat, přidejte následující řádku na konec souboru LocalSettings.php:
+Pokud ji chcete aktualizovat, přidejte následující řádku na konec souboru <code>LocalSettings.php</code>:
$1',
- 'config-localsettings-incomplete' => 'Existující soubor LocalSettings.php vypadá neúplný.
+ 'config-localsettings-incomplete' => 'Existující soubor <code>LocalSettings.php</code> vypadá neúplný.
Není nastavena proměnná $1.
-Upravte soubor LocalSettings.php tak, aby tuto promÄ›nnou obsahoval, a kliknÄ›te na „PokraÄovat“.',
- 'config-localsettings-connection-error' => 'Při připojování k databázi s využitím nastavení uvedených v LocalSettings.php nebo AdminSettings.php došlo k chybě. Opravte tato nastavení a zkuste to znovu.
+Upravte soubor <code>LocalSettings.php</code> tak, aby tuto proměnnou obsahoval, a klikněte na „{{int:Config-continue}}“.',
+ 'config-localsettings-connection-error' => 'Při připojování k databázi s využitím nastavení uvedených v <code>LocalSettings.php</code> nebo <code>AdminSettings.php</code> došlo k chybě. Opravte tato nastavení a zkuste to znovu.
$1',
'config-session-error' => 'Nepodařilo se inicializovat relaci: $1',
@@ -3168,7 +3270,9 @@ Instalace přerušena.',
'config-using531' => 'MediaWiki nelze používat na PHP $1 kvůli chybě při předávání parametrů odkazem do <code>__call()</code>.
Pro vyřešení upgradujte na PHP 5.3.2 nebo vyšší nebo downgradujte na PHP 5.3.0.
Instalace přerušena.',
- 'config-suhosin-max-value-length' => 'Je nainstalován Suhosin, který omezuje délku parametrů GET na $1 bajtů. Komponenta ResourceLoader z MediaWiki dokáže s tímto omezením pracovat, ale sníží to výkon. Pokud to je alespoň trochu možné, měli byste v php.ini nastavit suhosin.get.max_value_length na 1024 nebo vyšší a na stejnou hodnotu nastavit v LocalSettings.php proměnnou $wgResourceLoaderMaxQueryLength.',
+ 'config-suhosin-max-value-length' => 'Je nainstalován Suhosin, který omezuje délku parametrů GET na $1 bajtů.
+Komponenta ResourceLoader z MediaWiki dokáže s tímto omezením pracovat, ale sníží to výkon.
+Pokud to je alespoň trochu možné, měli byste v <code>php.ini</code> nastavit <code>suhosin.get.max_value_length</code> na 1024 nebo vyšší a na stejnou hodnotu nastavit v <code>LocalSettings.php</code> proměnnou <code>$wgResourceLoaderMaxQueryLength</code>.',
'config-db-type' => 'Typ databáze:',
'config-db-host' => 'Databázový server:',
'config-db-host-help' => 'Pokud je váš databázový server na jiném poÄítaÄi, zadejte zde jméno stroje nebo IP adresu.
@@ -3254,7 +3358,7 @@ Pokud v nabídce níže nevidíte databázový systém, který chcete použít,
'config-support-postgres' => '* $1 je populární open-source databázový systém používaný jako alternativa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php jak pÅ™eložit PHP s podporou PostgreSQL]). Mohou se vyskytnout jeÅ¡tÄ› nÄ›jaké menší chyby, použití v produkÄním prostÅ™edí se nedoporuÄuje.',
'config-support-sqlite' => '* $1 je velmi dobře podporovaný lehký databázový systém. ([http://www.php.net/manual/en/pdo.installation.php Jak přeložit PHP s podporou SQLite], používá PDO)',
'config-support-oracle' => '* $1 je komerÄní podniková databáze. ([http://www.php.net/manual/en/oci8.installation.php Jak pÅ™eložit PHP s podporou OCI8])',
- 'config-support-ibm_db2' => '* $1 je komerÄní podniková databáze.',
+ 'config-support-ibm_db2' => '* $1 je komerÄní podniková databáze. ([http://www.php.net/manual/en/ibm-db2.installation.php Jak pÅ™eložit PHP s podporou IBM DB2])',
'config-header-mysql' => 'Nastavení MySQL',
'config-header-postgres' => 'Nastavení PostgreSQL',
'config-header-sqlite' => 'Nastavení SQLite',
@@ -3321,8 +3425,8 @@ To se ale '''nedoporuÄuje''', pokud s wiki nemáte problémy.",
'config-upgrade-done-no-regenerate' => 'Aktualizace byla dokonÄena.
Svou wiki teÄ můžete [$1 zaÄít používat].',
- 'config-regenerate' => 'Přegenerovat LocalSettings.php →',
- 'config-show-table-status' => 'Dotaz SHOW TABLE STATUS se nezdařil!',
+ 'config-regenerate' => 'Přegenerovat <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'Dotaz <code>SHOW TABLE STATUS</code> se nezdařil!',
'config-unknown-collation' => "'''Upozornění:''' Databáze používá nerozpoznané řazení.",
'config-db-web-account' => 'Databázový úÄet pro webový přístup',
'config-db-web-help' => 'Zvolte uživatelské jméno a heslo, které bude webový server používat pro připojení k databázovému serveru při běžném provozu wiki.',
@@ -3394,7 +3498,7 @@ Zbývající konfiguraci už můžete pÅ™eskoÄit a nainstalovat wiki hned teÄ.
'config-optional-continue' => 'Ptejte se mě dál.',
'config-optional-skip' => 'Už mě to nudí, prostě nainstalujte wiki.',
'config-profile' => 'Profil uživatelských práv:',
- 'config-profile-wiki' => 'TradiÄní wiki',
+ 'config-profile-wiki' => 'Otevřená wiki',
'config-profile-no-anon' => 'Vyžadována registrace uživatelů',
'config-profile-fishbowl' => 'Editace jen pro vybrané',
'config-profile-private' => 'Soukromá wiki',
@@ -3404,7 +3508,7 @@ V MediaWiki můžete snadno kontrolovat poslední změny a vracet zpět libovoln
Mnoho lidí vÅ¡ak zjistilo, že je MediaWiki užiteÄné v Å¡irokém spektru rolí a nÄ›kdy není snadné vÅ¡echny pÅ™esvÄ›dÄit o výhodách wikizvyklostí.
Takže si můžete vybrat.
-'''{{int:config-profile-wiki}}''' dovoluje editovat všem, aniž by se museli přihlašovat.
+Model '''{{int:config-profile-wiki}}''' dovoluje editovat všem, aniž by se museli přihlašovat.
Na wiki, kde je '''{{int:config-profile-no-anon}}''', se lépe řídí zodpovědnost, ale může to odradit náhodné přispěvatele.
Profil '''{{int:config-profile-fishbowl}}''' umožňuje schváleným uživatelům editovat, ale veÅ™ejnost si může stránky prohlížet vÄetnÄ› jejich historie.
@@ -3495,7 +3599,7 @@ Mohou vyžadovat dodateÄnou konfiguraci, ale teÄ je můžete povolit.',
'config-install-alreadydone' => "'''UpozornÄ›ní:''' Vypadá to, že jste MediaWiki již nainstalovali a teÄ se o to pokoušíte znovu.
PokraÄujte na další stránku.",
'config-install-begin' => 'Stisknutím „{{int:config-continue}}“ spustíte instalaci MediaWiki.
-Pokud jeÅ¡tÄ› chcete udÄ›lat nÄ›jaké zmÄ›ny, stisknÄ›te tlaÄítko zpÄ›t.',
+Pokud ještě chcete udělat nějaké změny, stiskněte „{{int:config-back}}“.',
'config-install-step-done' => 'hotovo',
'config-install-step-failed' => 'selhaly',
'config-install-extensions' => 'Vkládají se rozšíření',
@@ -3551,7 +3655,7 @@ $3
'''Poznámka''': Pokud to neudÄ›láte hned, tento vygenerovaný konfiguraÄní soubor nebude pozdÄ›ji dostupný, pokud instalaci opustíte, aniž byste si ho stáhli.
Až to dokonÄíte, můžete '''[$2 vstoupit do své wiki]'''.",
- 'config-download-localsettings' => 'Stáhnout LocalSettings.php',
+ 'config-download-localsettings' => 'Stáhnout <code>LocalSettings.php</code>',
'config-help' => 'nápověda',
'config-nofile' => 'Soubor „$1“ nelze nalézt. Byl smazán?',
'mainpagetext' => "'''MediaWiki byla úspěšně nainstalována.'''",
@@ -3561,7 +3665,8 @@ Až to dokonÄíte, můžete '''[$2 vstoupit do své wiki]'''.",
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Nastavení konfigurace]
* [//www.mediawiki.org/wiki/Manual:FAQ Často kladené otázky o MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]',
);
/** Kashubian (kaszëbsczi)
@@ -3614,8 +3719,11 @@ $messages['da'] = array(
* @author LWChris
* @author Metalhead64
* @author Purodha
+ * @author Rillke
* @author The Evil IP address
* @author Umherirrender
+ * @author Wikinaut
+ * @author ì•„ë¼
*/
$messages['de'] = array(
'config-desc' => 'Das MediaWiki-Installationsprogramm',
@@ -3623,19 +3731,19 @@ $messages['de'] = array(
'config-information' => 'Informationen',
'config-localsettings-upgrade' => 'Eine Datei <code>LocalSettings.php</code> wurde gefunden.
Um die vorhandene Installation aktualisieren zu können, muss der Wert des Parameters <code>$wgUpgradeKey</code> im folgenden Eingabefeld angegeben werden.
-Der Parameterwert befindet sich in der Datei LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Eine Datei <code>LocalSettings.php</code> wurde gefunden.
+Der Parameterwert befindet sich in der Datei <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'Eine Datei <code><code>LocalSettings.php</code></code> wurde gefunden.
Um die vorhandene Installation zu aktualisieren, muss die Datei <code>update.php</code> ausgeführt werden.',
'config-localsettings-key' => 'Aktualisierungsschlüssel:',
'config-localsettings-badkey' => 'Der angegebene Aktualisierungsschlüssel ist falsch.',
'config-upgrade-key-missing' => 'Eine MediaWiki-Installation wurde gefunden.
-Um die vorhandene Installation aktualisieren zu können, muss die unten angegebene Codezeile in die Datei LocalSettings.php an deren Ende eingefügt werden:
+Um die vorhandene Installation aktualisieren zu können, muss die unten angegebene Codezeile in die Datei <code>LocalSettings.php</code> an deren Ende eingefügt werden:
$1',
- 'config-localsettings-incomplete' => 'Die vorhandene Datei LocalSettings.php scheint unvollständig zu sein.
+ 'config-localsettings-incomplete' => 'Die vorhandene Datei <code>LocalSettings.php</code> scheint unvollständig zu sein.
Die Variable <code>$1</code> wurde nicht definiert.
-Die Datei LocalSettings.php muss entsprechend geändert werden, so dass sie definiert ist. Klicke danach auf „Weiter“.',
- 'config-localsettings-connection-error' => 'Beim Verbindungsversuch zur Datenbank ist, unter Verwendung der in den Dateien LocalSettings.php oder AdminSettings.php hinterlegten Einstellungen, ein Fehler aufgetreten. Diese Einstellungen müssen korrigiert werden. Danach kann ein erneuter Versuch unternommen werden.
+Die Datei <code>LocalSettings.php</code> muss entsprechend geändert werden, so dass sie definiert ist. Klicke danach auf „{{int:Config-continue}}“.',
+ 'config-localsettings-connection-error' => 'Beim Verbindungsversuch zur Datenbank ist, unter Verwendung der in den Dateien <code>LocalSettings.php</code> oder <code>AdminSettings.php</code> hinterlegten Einstellungen, ein Fehler aufgetreten. Diese Einstellungen müssen korrigiert werden. Danach kann ein erneuter Versuch unternommen werden.
$1',
'config-session-error' => 'Fehler beim Starten der Sitzung: $1',
@@ -3666,7 +3774,7 @@ Die Datei <code>php.ini</code> muss geprüft und es muss dabei sichergestellt we
'config-page-copying' => 'Kopie der Lizenz',
'config-page-upgradedoc' => 'Aktualisiere',
'config-page-existingwiki' => 'Vorhandenes Wiki',
- 'config-help-restart' => 'Sollen alle bereits eingegebene Daten gelöscht und der Installationsvorgang erneut gestartet werden?',
+ 'config-help-restart' => 'Sollen alle bereits eingegebenen Daten gelöscht und der Installationsvorgang erneut gestartet werden?',
'config-restart' => 'Ja, erneut starten',
'config-welcome' => '=== Prüfung der Installationsumgebung ===
Die Basisprüfungen werden durchgeführt, um festzustellen, ob die Installationsumgebung für die Installation von MediaWiki geeignet ist.
@@ -3766,7 +3874,10 @@ PHP muss auf Version 5.2.9 oder später sowie libxml2 auf die Version 2.7.3 oder
'config-using531' => 'MediaWiki kann nicht zusammen mit PHP $1 verwendet werden. Grund hierfür ist ein Fehler im Zusammenhang mit den Verweisparametern zu <code>__call()</code>.
PHP muss auf Version 5.3.2 oder höher oder 5.3.0 oder niedriger aktualisiert werden, um das Problem zu beheben.
Die Installation wurde abgebrochen.',
- 'config-suhosin-max-value-length' => 'Suhosin ist installiert und beschränkt die Länge des GET-Parameters auf $1 Bytes. Der ResouceLoader von MediaWiki wird zwar unter diesen Bedingungen funktionieren, allerdings nur mit verminderter Leistungsfähigkeit. Sofern möglich sollte der Parameter <code>suhosin.get.max_value_length</code> in der Datei php.ini auf 1024 oder höher festgelegt werden. Gleichzeitig muss der Parameter <code>$wgResourceLoaderMaxQueryLength</code> in der Datei LocalSettings.php auf den selben Wert eingestellt werden.',
+ 'config-suhosin-max-value-length' => 'Suhosin ist installiert und beschränkt die Länge des GET-Parameters auf $1 Bytes.
+Der ResouceLoader von MediaWiki wird zwar unter diesen Bedingungen funktionieren, allerdings nur mit verminderter Leistungsfähigkeit.
+Sofern möglich sollte der Parameter <code>suhosin.get.max_value_length</code> in der Datei <code>php.ini</code> auf 1024 oder höher festgelegt werden.
+Gleichzeitig muss der Parameter <code>$wgResourceLoaderMaxQueryLength</code> in der Datei <code>LocalSettings.php</code> auf den selben Wert eingestellt werden.',
'config-db-type' => 'Datenbanksystem:',
'config-db-host' => 'Datenbankserver:',
'config-db-host-help' => 'Sofern sich die Datenbank auf einem anderen Server befindet, ist hier der Servername oder die entsprechende IP-Adresse anzugeben.
@@ -3850,7 +3961,7 @@ Sofern nicht das Datenbanksystem angezeigt wird, das verwendet werden soll, gibt
'config-support-postgres' => '* $1 ist ein beliebtes Open-Source-Datenbanksystem und eine Alternative zu MySQL ([http://www.php.net/manual/de/pgsql.installation.php Anleitung zur Kompilierung von PHP mit PostgreSQL-Unterstützung]). Es gibt allerdings einige kleinere Implementierungsfehler, so dass von der Nutzung in einer Produktivumgebung abgeraten wird.',
'config-support-sqlite' => '* $1 ist ein verschlanktes Datenbanksystem, das auch gut unterstützt wird ([http://www.php.net/manual/de/pdo.installation.php Anleitung zur Kompilierung von PHP mit SQLite-Unterstützung], verwendet PHP Data Objects (PDO))',
'config-support-oracle' => '* $1 ist eine kommerzielle Unternehmensdatenbank ([http://www.php.net/manual/en/oci8.installation.php Anleitung zur Kompilierung von PHP mit OCI8-Unterstützung (en)])',
- 'config-support-ibm_db2' => '* $1 ist eine kommerzielle Unternehmensdatenbank',
+ 'config-support-ibm_db2' => '* $1 ist eine kommerzielle Unternehmensdatenbank ([http://www.php.net/manual/en/ibm-db2.installation.php PHP mit IBM-DB2-Support kompilieren])',
'config-header-mysql' => 'MySQL-Einstellungen',
'config-header-postgres' => 'PostgreSQL-Einstellungen',
'config-header-sqlite' => 'SQLite-Einstellungen',
@@ -3918,8 +4029,8 @@ Dies wird '''nicht empfohlen''', es sei denn, es treten Probleme mit dem Wiki au
'config-upgrade-done-no-regenerate' => 'Die Aktualisierung ist abgeschlossen.
Das Wiki kann nun [$1 genutzt werden].',
- 'config-regenerate' => 'LocalSettings.php neu erstellen →',
- 'config-show-table-status' => 'Die Abfrage SHOW TABLE STATUS ist gescheitert!',
+ 'config-regenerate' => '<code>LocalSettings.php</code> neu erstellen →',
+ 'config-show-table-status' => 'Die Abfrage <code>SHOW TABLE STATUS</code> ist gescheitert!',
'config-unknown-collation' => "'''Warnung:''' Die Datenbank nutzt eine unbekannte Kollation.",
'config-db-web-account' => 'Datenbankkonto für den Webzugriff',
'config-db-web-help' => 'Bitte Benutzernamen und Passwort auswählen, die der Webserver während des Normalbetriebes dazu verwenden soll, eine Verbindung zum Datenbankserver herzustellen.',
@@ -3930,10 +4041,10 @@ Das hier angegebene Datenbankkonto muss daher bereits vorhanden sein.',
'config-mysql-engine' => 'Speicher-Engine:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
- 'config-mysql-myisam-dep' => "'''Warnung:''' Es wurde MyISAM als Speicher-Engine für MySQL ausgewählt, die aus folgenden Gründen nicht die für den Einsatz mit MediaWiki empfohlene ist:
-* sie unterstützt aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen
-* sie ist anfälliger für Datenprobleme
-* sie wird von MediaWiki nicht immer adäquat unterstützt
+ 'config-mysql-myisam-dep' => "'''Warnung:''' Es wurde MyISAM als Speicher-Engine für MySQL ausgewählt, die aus folgenden Gründen nicht für den Einsatz mit MediaWiki empfohlen ist:
+* Sie unterstützt aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen.
+* Sie ist anfälliger für Datenprobleme.
+* Sie wird von MediaWiki nicht immer adäquat unterstützt.
Sofern die vorhandene MySQL-Installation die Speicher-Engine InnoDB unterstützt, wird deren Verwendung eindringlich empfohlen.
Sofern sie sie nicht unterstützt, sollte eine entsprechende Aktualisierung nunmehr Erwägung gezogen werden.",
@@ -4001,7 +4112,7 @@ Mit MediaWiki ist es einfach die letzten Änderungen nachzuvollziehen und unbrau
Allerdings finden etliche Menschen Wikis auch mit anderen Bearbeitungskonzepten sinnvoll. Manchmal ist es zudem nicht einfach alle Beteiligten von den Vorteilen des „Wiki-Prinzips†zu überzeugen. Darum ist diese Auswahl möglich.
-Ein '''{{int:config-profile-wiki}}''' ermöglicht es jedermann, sogar ohne über ein Benutzerkonto zu verfügen, Bearbeitungen vorzunehmen.
+Das Modell „'''{{int:config-profile-wiki}}'''“ ermöglicht es jedermann, sogar ohne über ein Benutzerkonto zu verfügen, Bearbeitungen vorzunehmen.
Ein Wiki bei dem die '''{{int:config-profile-no-anon}}''' ist, fordert von den Benutzern eine höhere Verantwortung für ihre Bearbeitungen ein, könnte allerdings Personen abschrecken, die nur gelegentlich Bearbeitungen vornehmen wollen. Ein Wiki für '''{{int:config-profile-fishbowl}}''' gestattet es nur bestimmten Benutzern, Bearbeitungen vorzunehmen. Allerdings kann dabei die Allgemeinheit die Seiten immer noch betrachten und Änderungen nachvollziehen. Ein '''{{int:config-profile-private}}''' gestattet es nur ausgewählten Benutzern, Seiten zu betrachten sowie zu bearbeiten.
Komplexere Konzepte zur Zugriffssteuerung können erst nach abgeschlossenem Installationsvorgang eingerichtet werden. Hierzu gibt es weitere Informationen auf der Website mit der [//www.mediawiki.org/wiki/Manual:User_rights entsprechenden Anleitung].",
@@ -4089,7 +4200,7 @@ Es könnten zusätzliche Konfigurierungen zu einzelnen Erweiterungen erforderlic
'config-install-alreadydone' => "'''Warnung:''' Es wurde eine vorhandene MediaWiki-Installation gefunden.
Es muss daher mit den nächsten Seite weitergemacht werden.",
'config-install-begin' => 'Durch Drücken von „{{int:config-continue}}“ wird die Installation von MediaWiki gestartet.
-Sofern Änderungen vorgenommen werden sollen, kann man auf „↠Zurück“ klicken.',
+Sofern Änderungen vorgenommen werden sollen, kann man auf „{{int:config-back}}“ klicken.',
'config-install-step-done' => 'erledigt',
'config-install-step-failed' => 'gescheitert',
'config-install-extensions' => 'Programmerweiterungen',
@@ -4145,7 +4256,7 @@ $3
'''Hinweis:''' Die Konfigurationsdatei sollte jetzt unbedingt heruntergeladen werden. Sie wird nach Beenden des Installationsprogramms, nicht mehr zur Verfügung stehen.
Sobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wir wünschen viel Spaß und Erfolg mit dem Wiki.",
- 'config-download-localsettings' => 'LocalSettings.php herunterladen',
+ 'config-download-localsettings' => '<code>LocalSettings.php</code> herunterladen',
'config-help' => 'Hilfe',
'config-nofile' => 'Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?',
'mainpagetext' => "'''MediaWiki wurde erfolgreich installiert.'''",
@@ -4155,7 +4266,8 @@ Sobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wi
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]',
);
/** German (formal address) (Deutsch (Sie-Form)‎)
@@ -4175,6 +4287,8 @@ $messages['de-formal'] = array(
* @author Mirzali
*/
$messages['diq'] = array(
+ 'config-title' => 'MediaWiki $1 sazkerdış',
+ 'config-information' => 'Melumat',
'config-your-language' => 'Zıwanê şıma:',
'config-wiki-language' => 'Wiki zıwan:',
'config-back' => '↠Peyser',
@@ -4185,7 +4299,10 @@ $messages['diq'] = array(
'config-page-name' => 'Name',
'config-page-options' => 'Weçinegi',
'config-page-install' => 'Barine',
+ 'config-page-complete' => 'Temamyayo',
'config-page-readme' => 'Mı bıwane',
+ 'config-page-copying' => 'Kopyayeno',
+ 'config-page-upgradedoc' => 'Berzkerdış',
'config-restart' => 'E, fına dest pekê',
'config-sidebar' => "* [//www.mediawiki.org MediaWiki keye]
* [//www.mediawiki.org/wiki/Help:Contents User's Şınasiye]
@@ -4214,11 +4331,14 @@ $messages['diq'] = array(
'config-admin-name' => 'Namey şıma:',
'config-admin-password' => 'Parola:',
'config-admin-password-confirm' => 'Fına parola:',
+ 'config-admin-email' => 'Adresa e-postey:',
+ 'config-profile-private' => 'Bexse wiki',
'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
'config-license-cc-by' => 'Creative Commons Attribution',
'config-license-cc-by-nc-sa' => 'Creative Commons Attribution Non-Commercial Share Alike',
'config-license-pd' => 'Malê Şari',
'config-extensions' => 'Olekeni',
+ 'config-help' => 'peÅŸti',
'mainpagetext' => "'''MediaWiki vıst ra ser, vıraziya.'''",
'mainpagedocfooter' => 'Seba gurenayış u eyarkerdışê Wiki-Softwarey [//meta.wikimedia.org/wiki/Help:Contents İdarê karberi] de mıracaet ke.
@@ -4230,16 +4350,20 @@ $messages['diq'] = array(
);
/** Lower Sorbian (dolnoserbski)
+ * @author Michawiki
*/
$messages['dsb'] = array(
'mainpagetext' => "'''MediaWiki jo se wuspěšnje instalěrowało.'''",
'mainpagedocfooter' => "Pomoc pśi wužywanju softwary wiki namakajoš pód [//meta.wikimedia.org/wiki/Help:Contents User's Guide].
+Pomoc pśi wužywanju softwary wiki namakajoš pód [//meta.wikimedia.org/wiki/Help:Contents User's Guide].
+
== Na zachopjenje ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfiguracija lisćiny połoženjow]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ (pšašanja a wótegrona)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lisćina e-mailowych nakładow MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lisćina e-mailowych nakładow MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki za twóju rěc lokalizěrowaś]",
);
/** Central Dusun (Dusun Bundu-liwan)
@@ -4256,10 +4380,86 @@ $messages['dtp'] = array(
);
/** Greek (Ελληνικά)
+ * @author Glavkos
+ * @author Protnet
+ * @author ZaDiak
*/
$messages['el'] = array(
+ 'config-desc' => 'Το Ï€ÏόγÏαμμα εγκατάστασης για το MediaWiki',
+ 'config-title' => 'Εγκατάσταση MediaWiki $1',
+ 'config-information' => 'ΠληÏοφοÏίες',
+ 'config-your-language' => 'Η γλώσσα σας:',
+ 'config-wiki-language' => 'Γλώσσα του wiki:',
+ 'config-back' => '↠Πίσω',
+ 'config-continue' => 'Συνέχεια →',
+ 'config-page-language' => 'Γλώσσα',
+ 'config-page-welcome' => 'Καλώς ήλθατε στο MediaWiki!',
+ 'config-page-name' => 'Όνομα',
+ 'config-page-options' => 'Επιλογές',
+ 'config-page-install' => 'Εγκατάσταση',
+ 'config-page-complete' => 'ΟλοκληÏώθηκε!',
+ 'config-page-restart' => 'Επανεκκίνηση εγκατάστασης',
+ 'config-page-copying' => 'ΑντιγÏαφή',
+ 'config-page-upgradedoc' => 'Αναβάθμιση',
+ 'config-page-existingwiki' => 'ΥπάÏχον βίκι',
+ 'config-restart' => 'Îαι, κάντε επανεκκίνηση',
+ 'config-env-php' => 'H PHP $1 είναι εγκατεστημένη.',
+ 'config-db-type' => 'ΤÏπος βάσης δεδομένων:',
+ 'config-db-host' => 'Φιλοξενία βάσης δεδομένων:',
+ 'config-db-wiki-settings' => 'ΑναγνώÏιση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… βίκι',
+ 'config-db-name' => 'Όνομα βάσης δεδομένων:',
+ 'config-db-install-account' => 'ΛογαÏιασμός χÏήστη για την εγκατάσταση',
+ 'config-db-username' => 'Όνομα χÏήστη βάσης δεδομένων:',
+ 'config-db-password' => 'Κωδικός Ï€Ïόσβασης βάσης δεδομένων:',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 δυαδικό',
+ 'config-header-mysql' => 'Ρυθμίσεις MySQL',
+ 'config-header-postgres' => 'Ρυθμίσεις PostgreSQL',
+ 'config-header-sqlite' => 'Ρυθμίσεις SQLite',
+ 'config-header-oracle' => 'Ρυθμίσεις Oracle',
+ 'config-header-ibm_db2' => 'Ρυθμίσεις IBM DB2',
+ 'config-invalid-db-type' => 'Μη έγκυÏος Ï„Ïπος βάσης δεδομένων',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Όνομα του βίκι:',
+ 'config-site-name-blank' => 'Εισαγάγετε όνομα ιστοχώÏου.',
+ 'config-project-namespace' => 'ΟνοματοχώÏος εγχειÏήματος:',
+ 'config-ns-generic' => 'ΕγχείÏημα',
+ 'config-ns-site-name' => 'Ίδιο με το όνομα του wiki: $1',
+ 'config-ns-other' => 'Άλλο (Ï€ÏοσδιοÏίστε)',
+ 'config-admin-box' => 'ΛογαÏιασμός διαχειÏιστή',
+ 'config-admin-name' => 'Το όνομά σας:',
+ 'config-admin-password' => 'Κωδικός Ï€Ïόσβασης:',
+ 'config-admin-password-confirm' => 'Επανάληψη ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης:',
+ 'config-admin-email' => 'ΔιεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου:',
+ 'config-optional-continue' => 'Îα εÏωτηθώ πεÏισσότεÏες εÏωτήσεις.',
+ 'config-profile-wiki' => 'ΠαÏαδοσιακό wiki', # Fuzzy
+ 'config-profile-no-anon' => 'Απαιτείται η δημιουÏγία λογαÏιασμοÏ',
+ 'config-profile-private' => 'Ιδιωτικό wiki',
+ 'config-email-settings' => 'Ρυθμίσεις ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
+ 'config-upload-settings' => 'Ανέβασμα εικόνων και άλλων αÏχείων',
+ 'config-upload-enable' => 'ΕνεÏγοποιήστε το ανέβασμα αÏχείων',
+ 'config-logo' => 'ΔιεÏθυνση URL λογότυπου:',
+ 'config-cc-again' => 'Επιλέξτε ξανά...',
+ 'config-extensions' => 'Επεκτάσεις',
+ 'config-install-step-done' => 'έγινε',
+ 'config-install-step-failed' => 'απέτυχε',
+ 'config-help' => 'βοήθεια',
'mainpagetext' => "'''To λογισμικό MediaWiki εγκαταστάθηκε με επιτυχία.'''",
- 'mainpagedocfooter' => 'ΠεÏισσότεÏες πληÏοφοÏίες σχετικά με τη χÏήση και με τη ÏÏθμιση παÏαμέτÏων θα βÏείτε στους συνδέσμους: [//meta.wikimedia.org/wiki/MediaWiki_localisation Οδηγίες για Ï„Ïοποποίηση του πεÏιβάλλοντος εÏγασίας] και [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide ΕγχειÏίδιο χÏήστη].',
+ 'mainpagedocfooter' => 'ΠεÏισσότεÏες πληÏοφοÏίες σχετικά με τη χÏήση και με τη ÏÏθμιση παÏαμέτÏων θα βÏείτε στους συνδέσμους: [//meta.wikimedia.org/wiki/MediaWiki_localisation Οδηγίες για Ï„Ïοποποίηση του πεÏιβάλλοντος εÏγασίας] και [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide ΕγχειÏίδιο χÏήστη].', # Fuzzy
+);
+
+/** British English (British English)
+ * @author Shirayuki
+ */
+$messages['en-gb'] = array(
+ 'config-unicode-using-utf8' => "Using Brion Vibber's utf8_normalize.so for Unicode normalisation.",
+ 'config-unicode-using-intl' => 'Using the [http://pecl.php.net/intl intl PECL extension] for Unicode normalisation.',
+ 'config-unicode-pure-php-warning' => "'''Warning:''' The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalisation, falling back to slow pure-PHP implementation.
+If you run a high-traffic site, you should read a little on [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalisation].",
+ 'config-unicode-update-warning' => "'''Warning:''' The installed version of the Unicode normalisation wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.
+You should [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
+ 'config-unknown-collation' => "'''Warning:''' Database is using unrecognised collation.",
+ 'config-profile-fishbowl' => 'Authorised editors only',
+ 'config-install-stats' => 'Initialising statistics',
);
/** Esperanto (Esperanto)
@@ -4297,6 +4497,7 @@ $messages['eo'] = array(
* @author Sanbec
* @author Translationista
* @author Vivaelcelta
+ * @author ì•„ë¼
*/
$messages['es'] = array(
'config-desc' => 'El instalador para MediaWiki',
@@ -4304,19 +4505,19 @@ $messages['es'] = array(
'config-information' => 'Información',
'config-localsettings-upgrade' => 'Se ha encontrado un archivo <code>LocalSettings.php</code>.
Para actualizar esta instalación, por favor ingresa el valor de <code>$wgUpgradeKey</code> en el cuadro de abajo.
-Lo encontrarás en LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Se ha detectado un archivo LocalSettings.php.
-Para actualizar la instalación, vuelva a ejecutar update.php',
+Lo encontrarás en <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'Se ha detectado un archivo <code>LocalSettings.php</code>.
+Para actualizar la instalación, vuelva a ejecutar <code>update.php</code>',
'config-localsettings-key' => 'Clave de actualización:',
'config-localsettings-badkey' => 'La clave proporcionada es incorrecta.',
'config-upgrade-key-missing' => 'Se ha detectado una instalación existente de MediaWiki.
-Para actualizar la instalación, por favor, ponga la siguiente línea al final de su archivo LocalSettings.php:
+Para actualizar la instalación, por favor, ponga la siguiente línea al final de su archivo <code>LocalSettings.php</code>:
$1',
- 'config-localsettings-incomplete' => 'El archivo LocalSettings.php existente parece estar incompleto.
+ 'config-localsettings-incomplete' => 'El archivo <code>LocalSettings.php</code> existente parece estar incompleto.
La variable $1 no está definida.
-Cambie el archivo LocalSettings.php para que esta variable quede establecida y haga clic en "Continuar".',
- 'config-localsettings-connection-error' => 'Se detectó un error al conectarse a la base de datos utilizando la configuración especificada en los archivos LocalSettings.php o AdminSettings.php. Corrija estas opciones y vuelva a intentarlo.
+Cambie el archivo <code>LocalSettings.php</code> para que esta variable quede establecida y haga clic en "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => 'Se detectó un error al conectarse a la base de datos utilizando la configuración especificada en los archivos <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Corrija estas opciones y vuelva a intentarlo.
$1',
'config-session-error' => 'Error comenzando sesión: $1',
@@ -4449,7 +4650,9 @@ Instalación anulada.',
'config-using531' => 'MediaWiki no puede utilizarse con PHP $1 debido a un error con los parámetros de referencia para <code>__call()</code> .
Actualice el sistema a PHP 5.3.2 o superior, o vuelva a la versión PHP 5.3.0 para resolver este problema.
Instalación anulada.',
- 'config-suhosin-max-value-length' => 'Suhosin está instalado y limita la longitud del parámetro GET a $1 bytes. El componente ResourceLoader de MediaWiki trabajará en este límite, pero eso degradará el rendimiento. Si es posible, debe establecer el valor de suhosin.get.max_value_length en 1024 o superior en el archivo php.ini y establecer $wgResourceLoaderMaxQueryLength en el mismo valor en LocalSettings.php.',
+ 'config-suhosin-max-value-length' => 'Suhosin está instalado y limita el parámetro <code>length</code> GET a $1 bytes.
+El componente ResourceLoader (gestor de recursos) de MediaWiki trabajará en este límite, pero eso perjudicará el rendimiento.
+Si es posible, deberías establecer <code>suhosin.get.max_value_length</code> en el valor 1024 o superior en <code>php.ini</code> y establecer <code>$wgResourceLoaderMaxQueryLength</code> en el mismo valor en <code>php.ini</code>.',
'config-db-type' => 'Tipo de base de datos',
'config-db-host' => 'Servidor de la base de datos:',
'config-db-host-help' => 'Si su servidor de base de datos está en otro servidor, escriba el nombre del host o su dirección IP aquí.
@@ -4530,9 +4733,9 @@ $1
Si no encuentras en el listado el sistema de base de datos que estás intentando utilizar, sigue las instrucciones vinculadas arriba para habilitar la compatibilidad.',
'config-support-mysql' => '* $1 es la base de datos mayoritaria para MediaWiki y la que goza de mayor compatibilidad ([http://www.php.net/manual/es/mysql.installation.php cómo compilar PHP con compatibilidad MySQL])',
'config-support-postgres' => '$1 es un popular sistema de base de datos de código abierto, alternativa a MySQL. ([http://www.php.net/manual/es/pgsql.installation.php cómo compilar PHP con compatibilidad PostgreSQL]). Puede haber algunos defectos menores destacables, y no es recomendable para uso en un entorno de producción.',
- 'config-support-sqlite' => '* $1 es una base de datos ligera con gran compatibilidad con MediaWiki. ([http://www.php.net/manual/es/pdo.installation.php Cómo compilar PHP con compatibilidad SQLite], usa PDO)',
+ 'config-support-sqlite' => '* $1 es una base de datos ligera con gran compatibilidad con MediaWiki ([http://www.php.net/manual/es/pdo.installation.php cómo compilar PHP con compatibilidad SQLite usando PDO]).',
'config-support-oracle' => '* $1 es una base de datos comercial a nivel empresarial ([http://www.php.net/manual/es/oci8.installation.php cómo compilar PHP con compatibilidad con OCI8])',
- 'config-support-ibm_db2' => ' $1 es una base de datos de empresa comercial.',
+ 'config-support-ibm_db2' => '* $1 es una base de datos comercial a nivel empresarial ([http://www.php.net/manual/es/ibm-db2.installation.php cómo compilar PHP con compatibilidad con ibm_db2]).', # Fuzzy
'config-header-mysql' => 'Configuración de MySQL',
'config-header-postgres' => 'Configuración de PostgreSQL',
'config-header-sqlite' => 'Configuración de SQLite',
@@ -4598,8 +4801,8 @@ Esto '''no se recomienda''' a menos que esté teniendo problemas con su wiki.",
'config-upgrade-done-no-regenerate' => 'Actualización completa.
Usted puede ahora [$1 empezar a usar su wiki].',
- 'config-regenerate' => 'Regenerar LocalSettings.php →',
- 'config-show-table-status' => 'SHOW TABLE STATUS ha fallado!',
+ 'config-regenerate' => 'Regenerar <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => '<code>SHOW TABLE STATUS</code> ha fallado!',
'config-unknown-collation' => "'''Advertencia:''' La base de datos está utilizando una intercalación no reconocida.",
'config-db-web-account' => 'Cuenta de base de datos para acceso Web',
'config-db-web-help' => 'Elige el usuario y contraseña que el servidor Web usará para conectarse al servidor de la base de datos durante el fincionamiento normal del wiki.',
@@ -4672,7 +4875,7 @@ Ahora puedes saltarte el resto de pasos e instalar el wiki con valores predeterm
'config-optional-continue' => 'Hazme más preguntas.',
'config-optional-skip' => 'Ya estoy aburrido, sólo instala el wiki.',
'config-profile' => 'Perfil de derechos de usuario:',
- 'config-profile-wiki' => 'Wiki tradicional',
+ 'config-profile-wiki' => 'Wiki tradicional', # Fuzzy
'config-profile-no-anon' => 'Creación de cuenta requerida',
'config-profile-fishbowl' => 'Sólo editores autorizados',
'config-profile-private' => 'Wiki privado',
@@ -4687,7 +4890,7 @@ Un wiki con '''{{int:config-profile-no-anon}}''' ofrece rendición de cuentas ad
El escenario '''{{int:config-profile-fishbowl}}''' permite editar a los usuarios autorizados, pero el público puede ver las páginas, incluyendo el historial.
Un '''{{int:config-profile-private}}''' sólo permite ver páginas a los usuarios autorizados, el mismo grupo al que le está permitido editar.
-Configuraciones más complejas de derechos de usuario están disponibles después de la instalación, consulte [//www.mediawiki.org/wiki/Manual:User_rights esta entrada en el manual].",
+Configuraciones más complejas de derechos de usuario están disponibles después de la instalación, consulte [//www.mediawiki.org/wiki/Manual:User_rights esta entrada en el manual].", # Fuzzy
'config-license' => 'Copyright and licencia:',
'config-license-none' => 'Pie sin licencia',
'config-license-cc-by-sa' => 'Creative Commons Reconocimiento Compartir Igual',
@@ -4772,7 +4975,7 @@ Puede que necesiten configuraciones adicionales, pero puedes habilitarlas ahora.
'config-install-alreadydone' => "'''Aviso:''' Parece que ya habías instalado MediaWiki y estás intentando instalarlo nuevamente.
Pasa a la próxima página, por favor.",
'config-install-begin' => 'Pulsando "{{int:config-continue}}", se iniciará la instalación de MediaWiki.
-Si todavía desea realizar algún cambio, pulse atrás.',
+Si todavía desea realizar algún cambio, pulse atrás.', # Fuzzy
'config-install-step-done' => 'hecho',
'config-install-step-failed' => 'falló',
'config-install-extensions' => 'Extensiones inclusive',
@@ -4826,16 +5029,17 @@ $3
'''Nota''': Si no haces esto ahora, este archivo de configuración generado no estará disponible para usted más tarde si sale de la instalación sin descargarlo.
Cuando lo haya hecho, usted puede '''[$2 entrar en su wiki]'''.",
- 'config-download-localsettings' => 'Descargar archivo LocalSettings.php',
+ 'config-download-localsettings' => 'Descargar archivo <code>LocalSettings.php</code>',
'config-help' => 'Ayuda',
'config-nofile' => 'El archivo "$1" no se pudo encontrar. ¿Se ha eliminado?',
'mainpagetext' => "'''MediaWiki ha sido instalado con éxito.'''",
- 'mainpagedocfooter' => 'Consulta la [//meta.wikimedia.org/wiki/Ayuda:Contenido Guía de usuario] para obtener información sobre el uso del software wiki.
+ 'mainpagedocfooter' => 'Consulta la [//meta.wikimedia.org/wiki/Ayuda:Guía del usuario de contenidos] para obtener información sobre el uso del software wiki.
== Empezando ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustes de configuración]
* [//www.mediawiki.org/wiki/Manual:FAQ/es FAQ de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Regionalizar MediaWiki para tu idioma]',
);
/** español (formal) (español (formal))
@@ -4852,26 +5056,74 @@ $messages['es-formal'] = array(
/** Estonian (eesti)
* @author Avjoska
+ * @author Pikne
*/
$messages['et'] = array(
+ 'config-information' => 'Teave',
+ 'config-session-error' => 'Tõrge seansi alustamisel: $1',
+ 'config-your-language' => 'Oma keel:',
+ 'config-wiki-language' => 'Viki keel:',
'config-back' => '↠Tagasi',
'config-continue' => 'Jätka →',
'config-page-language' => 'Keel',
'config-page-welcome' => 'Tere tulemast MediaWikisse!',
+ 'config-page-dbconnect' => 'Andmebaasiga ühendamine',
+ 'config-page-upgrade' => 'Olemasoleva installi uuendus',
+ 'config-page-dbsettings' => 'Andmebaasi sätted',
'config-page-name' => 'Nimi',
'config-page-options' => 'Seaded',
'config-page-install' => 'Paigaldamine',
'config-page-complete' => 'Valmis!',
+ 'config-page-restart' => 'Alusta installimist uuesti',
+ 'config-page-readme' => 'Loe mind',
+ 'config-page-copying' => 'Kopeerimine',
+ 'config-page-upgradedoc' => 'Uuendamine',
+ 'config-page-existingwiki' => 'Olemasolev viki',
+ 'config-restart' => 'Jah, tee taaskäivitus',
'config-db-name' => 'Andmebaasi nimi:',
'config-db-username' => 'Andmebaasi kasutajanimi:',
'config-db-password' => 'Andmebaasi parool:',
+ 'config-db-port' => 'Andmebaasi port:',
+ 'config-invalid-db-type' => 'Vigane andmebaasi tüüp',
+ 'config-site-name' => 'Viki nimi:',
+ 'config-site-name-blank' => 'Sisestage lehekülje nimi.',
+ 'config-project-namespace' => 'Projekti nimeruum:',
+ 'config-ns-generic' => 'Projekt',
+ 'config-admin-box' => 'Administraatorikonto',
+ 'config-admin-name' => 'Sinu nimi:',
+ 'config-admin-password' => 'Parool:',
+ 'config-admin-password-confirm' => 'Parool uuesti:',
+ 'config-admin-name-blank' => 'Sisesta administraatori kasutajanimi.',
+ 'config-admin-password-blank' => 'Sisesta administraatorikonto parool.',
+ 'config-admin-password-same' => 'Parool ei tohi kattuda kasutajanimega.',
+ 'config-admin-password-mismatch' => 'Sisestatud kaks parooli ei lange kokku.',
'config-admin-email' => 'E-posti aadress:',
+ 'config-admin-error-bademail' => 'Sisestasid vigase e-posti aadressi.',
'config-optional-continue' => 'Küsi minult veel küsimusi.',
+ 'config-profile-private' => 'Eraviki',
+ 'config-license' => 'Autoriõigus ja litsents:',
+ 'config-license-none' => 'Litsentsijaluseta',
+ 'config-license-cc-by-sa' => 'Creative Commonsi litsents "Autorile viitamine + jagamine samadel tingimustel"',
+ 'config-license-cc-by' => 'Creative Commonsi litsents "Autorile viitamine"',
+ 'config-license-cc-by-nc-sa' => 'Creative Commonsi litsents "Autorile viitamine + mitteäriline eesmärk + jagamine samadel tingimustel"',
+ 'config-email-settings' => 'E-posti sätted',
+ 'config-email-sender' => 'Saatja e-aadress:',
+ 'config-logo' => 'Logo internetiaadress:',
+ 'config-cc-again' => 'Vali uuesti...',
+ 'config-extensions' => 'Lisad',
'config-install-step-done' => 'valmis',
'config-install-step-failed' => 'ebaõnnestus',
+ 'config-install-user-alreadyexists' => 'Kasutaja "$1" on juba olemas',
+ 'config-install-tables' => 'Tabelite loomine',
+ 'config-help' => 'abi',
'mainpagetext' => "'''MediaWiki tarkvara on edukalt paigaldatud.'''",
- 'mainpagedocfooter' => 'Juhiste saamiseks kasutamise ning konfigureerimise kohta vaata palun inglisekeelset [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentatsiooni liidese kohaldamisest]
-ning [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide kasutusjuhendit].',
+ 'mainpagedocfooter' => 'Vikitarkvara kasutamise kohta leiad lisateavet [//meta.wikimedia.org/wiki/Help:Contents juhendist].
+
+== Alustamine ==
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Häälestussätete loend]
+* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki KKK]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki versiooniuuenduste postiloend]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki lokaliseerimine]',
);
/** Basque (euskara)
@@ -4983,18 +5235,22 @@ $messages['fa'] = array(
'config-desc' => 'نصب کنندهٔ ویکی‌مدیا',
'config-title' => 'نصب ویکی‌مدیا $1',
'config-information' => 'اطلاعات',
+ 'config-localsettings-key' => 'کلید ارتقا:',
'config-your-language' => 'زبان شما:',
'config-wiki-language' => 'زبان ویکی:',
'config-back' => '→ بازگشت',
'config-continue' => 'ادامه â†',
'config-page-language' => 'زبان',
'config-page-welcome' => 'به مدیاویکی خوش آمدید!',
+ 'config-page-dbconnect' => 'اتصال به پایگاه داده',
'config-page-name' => 'نام',
'config-page-options' => 'گزینه‌ها',
'config-page-install' => 'نصب',
'config-page-complete' => 'کامل!',
'config-page-readme' => 'مرا بخوان',
'config-page-releasenotes' => 'یادداشت‌های انتشار',
+ 'config-page-copying' => 'تکثیر',
+ 'config-page-upgradedoc' => 'ارتقا',
'config-page-existingwiki' => 'ویکی موجود',
'config-restart' => 'بله ، آن دوباره راه اندازی کن',
'config-sidebar' => '* [//www.mediawiki.org صÙحهٔ اصلی مدیاویکی]
@@ -5013,13 +5269,20 @@ $messages['fa'] = array(
'config-db-host' => 'میزبان پایگاه اطلاعات:',
'config-db-username' => 'نام کاربری پایگاه اطلاعات:',
'config-db-password' => 'کلمه عبور پایگاه اطلاعات:',
+ 'config-mysql-old' => 'مای‌اس‌کیو‌ال نسخهٔ $1 و یا بالاتر نیاز است، شما نسخهٔ $2 را دارید.',
+ 'config-db-port' => 'درگاه پایگاه‌داده:',
'config-header-mysql' => 'تنظیمات مای‌اس‌کیو‌ال',
'config-connection-error' => '$1.
میزبان، نام کاربری و گذرواژه را بررسی کنید و دوباره امتحان کنید.',
+ 'config-mysql-binary' => 'دودویی',
+ 'config-mysql-utf8' => 'UTF-8',
'config-site-name' => 'نام ویکی:',
'config-site-name-blank' => 'نام تارنما را وارد کنید.',
'config-project-namespace' => 'Ùضای نام پروژه:',
+ 'config-ns-generic' => 'پروژه',
+ 'config-ns-other-default' => 'ویکی‌من',
+ 'config-admin-box' => 'حساب مدیر سیستم',
'config-admin-name' => 'نام شما:',
'config-admin-password' => 'کلمه عبور:',
'config-admin-password-confirm' => 'دوباره کلمه عبور:',
@@ -5032,6 +5295,7 @@ $messages['fa'] = array(
'config-email-settings' => 'تنظیمات پست الکترونیکی',
'config-upload-enable' => 'Ùعال سازی بارگذاری پرونده',
'config-logo' => 'نشانی نامواره:',
+ 'config-extensions' => 'اÙزونه‌ها',
'config-install-step-done' => 'انجام شد',
'config-install-step-failed' => 'ناموÙÙ‚ بود',
'config-help' => 'راهنما',
@@ -5043,7 +5307,7 @@ $messages['fa'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings تنظیم پیکربندی]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki پرسش‌های متداول]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ùهرست پست الکترونیکی نسخه‌های مدیاویکی]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ùهرست پست الکترونیکی نسخه‌های مدیاویکی]', # Fuzzy
);
/** Finnish (suomi)
@@ -5053,6 +5317,8 @@ $messages['fa'] = array(
* @author Nike
* @author Olli
* @author Str4nd
+ * @author VezonThunder
+ * @author ì•„ë¼
*/
$messages['fi'] = array(
'config-desc' => 'MediaWiki-asennin',
@@ -5060,19 +5326,28 @@ $messages['fi'] = array(
'config-information' => 'Tiedot',
'config-localsettings-upgrade' => '<code>LocalSettings.php</code>-tiedosto havaittiin.
Kirjoita muuttujan <code>$wgUpgradeKey</code> arvo alla olevaan kenttään päivittääksesi asennuksen.
-Löydät sen LocalSettings.php-tiedostosta.',
- 'config-localsettings-cli-upgrade' => 'LocalSettings.php-tiedosto havaittiin.
-Päivitä asennus suorittamalla update.php.',
+Löydät sen <code>LocalSettings.php</code>-tiedostosta.',
+ 'config-localsettings-cli-upgrade' => '<code>LocalSettings.php</code>-tiedosto havaittiin.
+Päivitä asennus suorittamalla <code>update.php</code>.',
'config-localsettings-key' => 'Päivitysavain',
'config-localsettings-badkey' => 'Antamasi avain on virheellinen.',
- 'config-localsettings-incomplete' => 'Nykyinen LocalSettings.php-tiedosto näyttää olevan puutteellinen.
+ 'config-upgrade-key-missing' => 'Havaittiin aiempi MediaWiki-asennus.
+Päivittääksesi tämän asennuksen lisää <code>LocalSettings.php</code>-tiedostosi loppuun seuraava rivi:
+
+$1',
+ 'config-localsettings-incomplete' => 'Nykyinen <code>LocalSettings.php</code>-tiedosto näyttää olevan puutteellinen.
Muuttujaa $1 ei ole asetettu.
-Muuta LocalSettings.php-tiedostoa siten, että muuttuja on asetettu ja napsauta »Jatka».',
+Muuta <code>LocalSettings.php</code>-tiedostoa siten, että muuttuja on asetettu ja napsauta »{{int:Config-continue}}».',
+ 'config-localsettings-connection-error' => 'Virhe yhdistettäessä tietokantaan käyttäen tiedostossa <code>LocalSettings.php</code> tai <code>AdminSettings.php</code> määritettyjä asetuksia. Korjaa asetukset ja yritä uudelleen.
+
+$1',
'config-session-error' => 'Istunnon aloittaminen epäonnistui: $1',
'config-session-expired' => 'Istuntotietosi näyttävät olevan vanhentuneita.
Istuntojen elinajaksi on määritelty $1.
Voit muuttaa tätä asetusta vaihtamalla kohtaa <code>session.gc_maxlifetime</code> php.ini-tiedostossa.
Käynnistä asennusprosessi uudelleen.',
+ 'config-no-session' => 'Istuntosi tiedot menetettiin!
+Tarkista php.ini-tiedostosi ja varmista, että <code>session.save_path</code> on asetettu sopivaan kansioon.',
'config-your-language' => 'Asennuksen kieli',
'config-your-language-help' => 'Valitse kieli, jota haluat käyttää asennuksen ajan.',
'config-wiki-language' => 'Wikin kieli',
@@ -5145,7 +5420,7 @@ Asennus saattaa epäonnistua!",
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
'config-type-ibm_db2' => 'IBM DB2',
- 'config-support-ibm_db2' => '* $1 on kaupallinen tietokanta yrityskäyttöön.',
+ 'config-support-ibm_db2' => '* $1 on kaupallinen tietokanta yrityskäyttöön.', # Fuzzy
'config-header-mysql' => 'MySQL-asetukset',
'config-header-postgres' => 'PostgreSQL-asetukset',
'config-header-sqlite' => 'SQLite-asetukset',
@@ -5174,8 +5449,8 @@ Tämä '''ei ole suositeltavaa''', jos wikissäsi ei ole ongelmia.",
'config-upgrade-done-no-regenerate' => 'Päivitys valmis.
Voit [$1 aloittaa wikin käytön].',
- 'config-regenerate' => 'Luo LocalSettings.php uudelleen →',
- 'config-show-table-status' => 'Kysely SHOW TABLE STATUS epäonnistui!',
+ 'config-regenerate' => 'Luo <code>LocalSettings.php</code> uudelleen →',
+ 'config-show-table-status' => 'Kysely <code>SHOW TABLE STATUS</code> epäonnistui!',
'config-mysql-engine' => 'Tallennusmoottori',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
@@ -5195,7 +5470,7 @@ Voit [$1 aloittaa wikin käytön].',
'config-admin-error-bademail' => 'Annoit virheellisen sähköpostiosoitteen.',
'config-almost-done' => 'Olet jo lähes valmis!
Voit ohittaa jäljellä olevat määritykset ja asentaa wikin juuri nyt.',
- 'config-profile-wiki' => 'Perinteinen wiki',
+ 'config-profile-wiki' => 'Avoin wiki',
'config-profile-no-anon' => 'Tunnuksen luonti vaaditaan',
'config-profile-private' => 'Yksityinen wiki',
'config-license' => 'Tekijänoikeus ja lisenssi:',
@@ -5208,7 +5483,7 @@ Voit ohittaa jäljellä olevat määritykset ja asentaa wikin juuri nyt.',
'config-install-step-failed' => 'epäonnistui',
'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 LocalSettings.php',
+ 'config-download-localsettings' => 'Lataa <code>LocalSettings.php</code>',
'config-help' => 'ohje',
'mainpagetext' => "'''MediaWiki on onnistuneesti asennettu.'''",
'mainpagedocfooter' => "Lisätietoja käytöstä on sivulla [//meta.wikimedia.org/wiki/Help:Contents User's Guide].
@@ -5253,6 +5528,7 @@ $messages['fo'] = array(
* @author Verdy p
* @author Wyz
* @author Yumeki
+ * @author ì•„ë¼
*/
$messages['fr'] = array(
'config-desc' => 'Le programme d’installation de MediaWiki',
@@ -5260,20 +5536,20 @@ $messages['fr'] = array(
'config-information' => 'Informations',
'config-localsettings-upgrade' => 'Un fichier <code>LocalSettings.php</code> a été détecté.
Pour mettre à jour cette installation, veuillez saisir la valeur de <code>$wgUpgradeKey</code> dans le champ ci-dessous.
-Vous la trouverez dans LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Un fichier LocalSettings.php a été détecté.
-Pour mettre à niveau cette installation, veuillez exécuter update.php',
+Vous la trouverez dans <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'Un fichier <code>LocalSettings.php</code> a été détecté.
+Pour mettre à niveau cette installation, veuillez exécuter <code>update.php</code>',
'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.
-Pour mettre à jour cette installation, veuillez ajouter la ligne suivante à la fin de votre fichier LocalSettings.php
+Pour mettre à jour cette installation, veuillez ajouter la ligne suivante à la fin de votre fichier <code>LocalSettings.php</code>
$1',
- 'config-localsettings-incomplete' => 'Le fichier LocalSettings.php existant semble être incomplet.
+ 'config-localsettings-incomplete' => 'Le fichier <code>LocalSettings.php</code> existant semble être incomplet.
La variable $1 n’est pas définie.
-Veuillez modifier LocalSettings.php de sorte que cette variable soit définie, puis cliquer sur « Continuer ».',
- 'config-localsettings-connection-error' => 'Une erreur est survenue lors de la connexion à la base de données en utilisant la configuration spécifiée dans LocalSettings.php ou AdminSettings.php. Veuillez corriger cette configuration puis réessayer.
+Veuillez modifier <code>LocalSettings.php</code> de sorte que cette variable soit définie, puis cliquer sur « {{int:Config-continue}} ».',
+ 'config-localsettings-connection-error' => 'Une erreur est survenue lors de la connexion à la base de données en utilisant la configuration spécifiée dans <code>LocalSettings.php</code> ou <code>AdminSettings.php</code>. Veuillez corriger cette configuration puis réessayer.
$1',
'config-session-error' => 'Erreur lors du démarrage de la session : $1',
@@ -5405,7 +5681,8 @@ Installation interrompue.',
'config-using531' => 'MediaWiki ne peut pas être utilisé avec PHP $1 à cause d’un bogue affectant les paramètres passés par référence à <code>__call()</code>.
Veuillez mettre à jour votre système vers PHP 5.3.2 ou plus récent ou revenir à PHP 5.3.0 pour résoudre ce problème.
Installation interrompue.',
- 'config-suhosin-max-value-length' => 'Suhosin est installé et limite la longueur du paramètre GET à $1 octets. Le <code>ResourceLoader</code> de MediaWiki va répondre en respectant cette limite, mais ses performances seront dégradées. Si possible, vous devriez définir <code>suhosin.get.max_value_length</code> à 1024 ou plus dans le fichier <code>php.ini</code>, et fixer <code>$wgResourceLoaderMaxQueryLength</code> à la même valeur dans <code>LocalSettings.php</code>.',
+ 'config-suhosin-max-value-length' => 'Suhosin est installé et limite la <code>longueur</code> du paramètre GET à $1 octets.
+Le composant ResourceLoader de MediaWiki va répondre en respectant cette limite, mais ses performances seront dégradées. Si possible, vous devriez définir <code>suhosin.get.max_value_length</code> à 1024 ou plus dans le fichier <code>php.ini</code>, et fixer <code>$wgResourceLoaderMaxQueryLength</code> à la même valeur dans <code>LocalSettings.php</code>.',
'config-db-type' => 'Type de base de données :',
'config-db-host' => 'Nom d’hôte de la base de données :',
'config-db-host-help' => 'Si votre serveur de base de données est sur un serveur différent, saisissez ici son nom d’hôte ou son adresse IP.
@@ -5487,7 +5764,7 @@ Si vous ne voyez pas le système de base de données que vous essayez d'utiliser
'config-support-postgres' => "* $1 est un système de base de données populaire et ''open source'' qui peut être une alternative à MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). Il peut contenir quelques bogues mineurs et n'est pas recommandé dans un environnement de production.",
'config-support-sqlite' => '* $1 est un système de base de données léger qui est bien supporté. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], utilise PDO)',
'config-support-oracle' => '* $1 est un système commercial de gestion de base de données d’entreprise. ([http://www.php.net/manual/en/oci8.installation.php Comment compiler PHP avec le support OCI8])',
- 'config-support-ibm_db2' => "* $1 est une base de données d'entreprise commerciale.",
+ 'config-support-ibm_db2' => "* $1 est une base de données d'entreprise commerciale. ([http://www.php.net/manual/en/ibm-db2.installation.php Comment compiler PHP avec le support de DB2 d’IBM])",
'config-header-mysql' => 'Paramètres de MySQL',
'config-header-postgres' => 'Paramètres de PostgreSQL',
'config-header-sqlite' => 'Paramètres de SQLite',
@@ -5554,8 +5831,8 @@ Ce '''n'est pas recommandé''' sauf si vous rencontrez des problèmes avec votre
'config-upgrade-done-no-regenerate' => 'Mise à jour terminée.
Vous pouvez maintenant [$1 commencer à utiliser votre wiki].',
- 'config-regenerate' => 'Regénérer LocalSettings.php →',
- 'config-show-table-status' => 'Échec de la requête SHOW TABLE STATUS !',
+ 'config-regenerate' => 'Regénérer <code>LocalSettings.php</code> →',
+ '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-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.",
@@ -5623,7 +5900,7 @@ Vous pouvez passer la configuration restante et installer immédiatement le wiki
'config-optional-continue' => 'Me poser davantage de questions.',
'config-optional-skip' => 'J’en ai assez, installer simplement le wiki.',
'config-profile' => 'Profil des droits d’utilisateurs :',
- 'config-profile-wiki' => 'Wiki traditionnel',
+ 'config-profile-wiki' => 'Wiki ouvert',
'config-profile-no-anon' => 'Création de compte requise',
'config-profile-fishbowl' => 'Éditeurs autorisés seulement',
'config-profile-private' => 'Wiki privé',
@@ -5633,7 +5910,7 @@ Avec MediaWiki, il est facile de vérifier les modifications récentes et de ré
Cependant, 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.
Vous avez donc le choix.
-'''{{int:config-profile-wiki}}''' autorise toute personne à modifier, y compris sans s’identifier.
+Le modèle '''{{int:config-profile-wiki}}''' autorise toute personne à modifier, y compris sans s’identifier.
'''{{int:config-profile-no-anon}}''' fournit plus de contrôle, par l’identification, mais peut rebuter les contributeurs occasionnels.
'''{{int:config-profile-fishbowl}}''' autorise la modification par les utilisateurs approuvés, mais le public peut toujours lire les pages et leur historique.
@@ -5722,8 +5999,8 @@ Si vous ne le connaissez pas, la valeur par défaut est 11211.",
Elles 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.
S'il vous plaît, allez à la page suivante.",
- 'config-install-begin' => "En appuyant sur {{int:config-continue}}, vous commencerez l'installation de MediaWiki.
-Si vous voulez apporter des modifications, appuyez sur Retour.",
+ 'config-install-begin' => 'En appuyant sur {{int:config-continue}}, vous commencerez l\'installation de MediaWiki.
+Si vous voulez apporter des modifications, appuyez sur "{{int:config-back}}".',
'config-install-step-done' => 'fait',
'config-install-step-failed' => 'échec',
'config-install-extensions' => 'Inclusion des extensions',
@@ -5776,16 +6053,17 @@ $3
'''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.
Lorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
- 'config-download-localsettings' => 'Télécharger LocalSettings.php',
+ '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é ?',
'mainpagetext' => "'''MediaWiki a été installé avec succès.'''",
- 'mainpagedocfooter' => 'Consultez le [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel.
+ '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.
-== Démarrer avec MediaWiki ==
+== Pour démarrer ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste des paramètres de configuration]
* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ sur MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]',
);
/** Cajun French (français cadien)
@@ -5870,8 +6148,8 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
'config-missing-db-host' => 'Vos dête buchiér una valor por « Hôto de la bâsa de balyês »',
'config-missing-db-server-oracle' => 'Vos dête buchiér una valor por « TNS de la bâsa de balyês »',
'config-sqlite-readonly' => 'Lo fichiér <code>$1</code> est pas accèssiblo en ècritura.',
- 'config-regenerate' => 'Refâre LocalSettings.php →',
- 'config-show-table-status' => 'Falyita de la requéta SHOW TABLE STATUS !',
+ 'config-regenerate' => 'Refâre <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'Falyita de la requéta <code>SHOW TABLE STATUS</code> !',
'config-db-web-account' => 'Compto de la bâsa de balyês por l’accès vouèbe',
'config-db-web-account-same' => 'Utilisâd lo mémo compto que por l’enstalacion',
'config-db-web-create' => 'Féte lo compto s’ègziste p’oncor',
@@ -5897,7 +6175,7 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
'config-admin-email' => 'Adrèce èlèctronica :',
'config-optional-continue' => 'Mè posar més de quèstions.',
'config-profile' => 'Profil des drêts d’usanciér :',
- 'config-profile-wiki' => 'Vouiqui tradicionâl',
+ 'config-profile-wiki' => 'Vouiqui tradicionâl', # Fuzzy
'config-profile-no-anon' => 'Crèacion de compto nècèssèra',
'config-profile-fishbowl' => 'Solament los èditors ôtorisâs',
'config-profile-private' => 'Vouiqui privâ',
@@ -5950,7 +6228,7 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
'config-install-mainpage' => 'Crèacion de la pâge principâla avouéc un contegnu per dèfôt',
'config-install-extension-tables' => 'Crèacion de trâbles por les èxtensions activâs',
'config-install-mainpage-failed' => 'Empossiblo d’entrebetar la pâge principâla : $1',
- 'config-download-localsettings' => 'Tèlèchargiér LocalSettings.php',
+ 'config-download-localsettings' => 'Tèlèchargiér <code>LocalSettings.php</code>',
'config-help' => 'éde',
'mainpagetext' => "'''MediaWiki at étâ enstalâ avouéc reusséta.'''",
'mainpagedocfooter' => 'Vêde lo [//meta.wikimedia.org/wiki/Aide:Contenu guido d’usanciér] por més d’enformacions sur l’usâjo de la programeria vouiqui.
@@ -5958,7 +6236,7 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
== Emmodar avouéc MediaWiki ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista des paramètres de configuracion]
* [//www.mediawiki.org/wiki/Manual:FAQ/fr FDQ sur MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussion sur les distribucions de MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussion sur les distribucions de MediaWiki]', # Fuzzy
);
/** Northern Frisian (Nordfriisk)
@@ -6057,12 +6335,14 @@ $messages['gd'] = array(
== Toiseach tòiseachaidh ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liosta suidheachadh nan roghainnean]
* [//www.mediawiki.org/wiki/Manual:FAQ CÀBHA MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liosta puist nan sgaoilidhean MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liosta puist nan sgaoilidhean MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Cuir do chànan air MediaWiki]",
);
/** Galician (galego)
* @author Elisardojm
* @author Toliño
+ * @author ì•„ë¼
*/
$messages['gl'] = array(
'config-desc' => 'O programa de instalación de MediaWiki',
@@ -6070,19 +6350,19 @@ $messages['gl'] = array(
'config-information' => 'Información',
'config-localsettings-upgrade' => 'Detectouse un ficheiro <code>LocalSettings.php</code>.
Para actualizar esta instalación, introduza o valor de <code>$wgUpgradeKey</code> na caixa.
-Pode atopalo en LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Detectouse un ficheiro LocalSettings.php.
-Para actualizar esta instalación, execute update.php',
+Pode atopalo en <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'Detectouse un ficheiro <code>LocalSettings.php</code>.
+Para actualizar esta instalación, execute <code>update.php</code>',
'config-localsettings-key' => 'Clave de actualización:',
'config-localsettings-badkey' => 'A clave dada é incorrecta',
'config-upgrade-key-missing' => 'Detectouse unha instalación existente de MediaWiki.
-Para actualizar esta instalación, inclúa esta liña ao final do ficheiro LocalSettings.php:
+Para actualizar esta instalación, inclúa esta liña ao final do ficheiro <code>LocalSettings.php</code>:
$1',
- 'config-localsettings-incomplete' => 'Semella que o ficheiro LocalSettings.php existente está incompleto.
+ 'config-localsettings-incomplete' => 'Semella que o ficheiro <code>LocalSettings.php</code> existente está incompleto.
A variable $1 non está establecida.
-Modifique o ficheiro LocalSettings.php de xeito que a variable quede establecida e prema en "Continuar".',
- 'config-localsettings-connection-error' => 'Atopouse un erro ao conectar coa base de datos empregando a configuración especificada no ficheiro LocalSettings.php ou no ficheiro AdminSettings.php. Corrixa esta configuración e inténteo de novo.
+Modifique o ficheiro <code>LocalSettings.php</code> de xeito que a variable quede establecida e prema en "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => 'Atopouse un erro ao conectar coa base de datos empregando a configuración especificada no ficheiro <code>LocalSettings.php</code> ou no ficheiro <code>AdminSettings.php</code>. Corrixa esta configuración e inténteo de novo.
$1',
'config-session-error' => 'Erro ao iniciar a sesión: $1',
@@ -6215,7 +6495,9 @@ Instalación abortada.',
'config-using531' => 'O PHP $1 non é compatible con MediaWiki debido a un erro que afecta aos parámetros de referencia de <code>__call()</code>.
Actualice o sistema á versión 5.3.2 ou posterior do PHP ou volva á versión 5.3.0 do PHP para arranxar o problema.
Instalación abortada.',
- 'config-suhosin-max-value-length' => 'Suhosin está instalado e limita a lonxitude do parámetro GET a $1 bytes. O compoñente ResourceLoader (xestor de recursos) de MediaWiki traballa neste límite, pero este prexudica o rendemento. Se é posible, debería establecer suhosin.get.max_value_length no valor 1024 ou superior en php.ini e establecer $wgResourceLoaderMaxQueryLength no mesmo valor en LocalSettings.php.',
+ 'config-suhosin-max-value-length' => 'Suhosin está instalado e limita o parámetro GET <code>length</code> a $1 bytes.
+O compoñente ResourceLoader (xestor de recursos) de MediaWiki traballa neste límite, pero este prexudica o rendemento.
+Se é posible, debería establecer <code>suhosin.get.max_value_length</code> no valor 1024 ou superior en <code>php.ini</code> e establecer <code>$wgResourceLoaderMaxQueryLength</code> no mesmo valor en <code>LocalSettings.php</code>.',
'config-db-type' => 'Tipo de base de datos:',
'config-db-host' => 'Servidor da base de datos:',
'config-db-host-help' => 'Se o servidor da súa base de datos está nun servidor diferente, escriba o nome do servidor ou o enderezo IP aquí.
@@ -6298,8 +6580,8 @@ Se non ve listado a continuación o sistema de base de datos que intenta usar, s
'config-support-mysql' => '* $1 é o obxectivo principal para MediaWiki e está mellor soportado ([http://www.php.net/manual/en/mysql.installation.php como compilar o PHP con soporte MySQL])',
'config-support-postgres' => '* $1 é un sistema de base de datos popular e de código aberto como alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar o PHP con soporte PostgreSQL]). É posible que haxa algúns pequenos erros e non se recomenda o seu uso nunha contorna de produción.',
'config-support-sqlite' => '* $1 é un sistema de base de datos lixeiro moi ben soportado. ([http://www.php.net/manual/en/pdo.installation.php Como compilar o PHP con soporte SQLite], emprega PDO)',
- 'config-support-oracle' => '* $1 é un sistema comercial de xestión de base de datos de empresa. ([http://www.php.net/manual/en/oci8.installation.php Como compilar PHP con soporte OCI8])',
- 'config-support-ibm_db2' => '* $1 é unha base de datos de empresa comercial.',
+ 'config-support-oracle' => '* $1 é un sistema comercial de xestión de base de datos de empresa. ([http://www.php.net/manual/en/oci8.installation.php Como compilar o PHP con soporte OCI8])',
+ 'config-support-ibm_db2' => '* $1 é unha base de datos de empresa comercial. ([http://www.php.net/manual/en/ibm-db2.installation.php Como compilar o PHP con soporte IBM DB2])',
'config-header-mysql' => 'Configuración do MySQL',
'config-header-postgres' => 'Configuración do PostgreSQL',
'config-header-sqlite' => 'Configuración do SQLite',
@@ -6366,8 +6648,8 @@ Isto '''non é recomendable''' a menos que estea a ter problemas co seu wiki.",
'config-upgrade-done-no-regenerate' => 'Actualización completada.
Xa pode [$1 comezar a usar o seu wiki].',
- 'config-regenerate' => 'Rexenerar LocalSettings.php →',
- 'config-show-table-status' => 'A pescuda SHOW TABLE STATUS fallou!',
+ 'config-regenerate' => 'Rexenerar <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'A pescuda <code>SHOW TABLE STATUS</code> fallou!',
'config-unknown-collation' => "'''Atención:''' A base de datos está a empregar unha clasificación alfabética irrecoñecible.",
'config-db-web-account' => 'Conta na base de datos para o acceso á internet',
'config-db-web-help' => 'Seleccione o nome de usuario e contrasinal que o servidor web empregará para se conectar ao servidor da base de datos durante o funcionamento normal do wiki.',
@@ -6440,7 +6722,7 @@ Neste paso pode saltar o resto da configuración e instalar o wiki agora mesmo.'
'config-optional-continue' => 'Facédeme máis preguntas.',
'config-optional-skip' => 'Xa estou canso. Instalade o wiki.',
'config-profile' => 'Perfil dos dereitos de usuario:',
- 'config-profile-wiki' => 'Wiki tradicional',
+ 'config-profile-wiki' => 'Wiki aberto',
'config-profile-no-anon' => 'Necesítase a creación dunha conta',
'config-profile-fishbowl' => 'Só os editores autorizados',
'config-profile-private' => 'Wiki privado',
@@ -6449,7 +6731,7 @@ En MediaWiki, é doado revisar os cambios recentes e reverter calquera dano feit
Porén, moita xente atopa MediaWiki útil nunha ampla variedade de papeis, e ás veces non é fácil convencer a todos dos beneficios que leva consigo o estilo wiki.
Vostede decide.
-O tipo '''{{int:config-profile-wiki}}''' permite a edición por parte de calquera, mesmo sen rexistro.
+O modelo '''{{int:config-profile-wiki}}''' permite a edición por parte de calquera, mesmo sen rexistro.
A opción '''{{int:config-profile-no-anon}}''' proporciona un control maior, pero pode desalentar os colaboradores casuais.
O escenario '''{{int:config-profile-fishbowl}}''' restrinxe a edición aos usuarios aprobados, pero o público pode ollar as páxinas, incluíndo os historiais.
@@ -6540,7 +6822,7 @@ Quizais necesite algunha configuración adicional, pero pode activalas agora',
'config-install-alreadydone' => "'''Atención:''' Semella que xa instalou MediaWiki e que o está a instalar de novo.
Vaia ata a seguinte páxina.",
'config-install-begin' => 'Ao premer en "{{int:config-continue}}", comezará a instalación de MediaWiki.
-Se aínda quere facer algún cambio, volva atrás.',
+Se aínda quere facer algún cambio, prema en "{{int:config-back}}".',
'config-install-step-done' => 'feito',
'config-install-step-failed' => 'erro',
'config-install-extensions' => 'Incluíndo as extensións',
@@ -6596,7 +6878,7 @@ $3
'''Nota:''' Se non fai iso agora, este ficheiro de configuración xerado non estará dispoñible máis adiante se sae da instalación sen descargalo.
Cando faga todo isto, xa poderá '''[$2 entrar no seu wiki]'''.",
- 'config-download-localsettings' => 'Descargar o LocalSettings.php',
+ 'config-download-localsettings' => 'Descargar o <code>LocalSettings.php</code>',
'config-help' => 'axuda',
'config-nofile' => 'Non se puido atopar o ficheiro "$1". Se cadra, foi borrado?',
'mainpagetext' => "'''MediaWiki instalouse correctamente.'''",
@@ -6605,7 +6887,8 @@ Cando faga todo isto, xa poderá '''[$2 entrar no seu wiki]'''.",
== Primeiros pasos ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista das opcións de configuración]
* [//www.mediawiki.org/wiki/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localice MediaWiki á súa lingua]',
);
/** Goan Konkani (Latin script) (Konknni)
@@ -6639,7 +6922,7 @@ $messages['gsw'] = array(
'config-information' => 'Information',
'config-localsettings-upgrade' => "'''Warnig:''' E Datei <code>LocalSettings.php</code> isch gfunde wore.
Fir d Aktualisierig vu dr däre Inschtallation, gib bitte dr Wärt vum Parameter <code>\$wgUpgradeKey</code> im Fäld unten yy.
-Du findsch dr Wärt in dr Datei LocalSettings.php.",
+Du findsch dr Wärt in dr Datei <code>LocalSettings.php</code>.",
'config-localsettings-key' => 'Aktualisierigsschlissel:',
'config-localsettings-badkey' => 'Dr Aktualisierigsschlissel, wu du aagee hesch, isch falsch.',
'config-session-error' => 'Fähler bim Starte vu dr Sitzig: $1',
@@ -6738,7 +7021,7 @@ S Objäktcaching isch wäge däm nit aktiviert.",
Miniaturaasichte vu Bilder sin megli, sobald s Uffelade vu Dateie aktiviert isch.',
'config-help' => 'Hilf',
'mainpagetext' => "'''MediaWiki isch erfolgrich inschtalliert worre.'''",
- 'mainpagedocfooter' => 'Lueg uf d [//meta.wikimedia.org/wiki/MediaWiki_localisation Dokumentation fir d Aapassig vu dr Benutzeroberflächi] un s [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuech] fir d Hilf iber d Benutzig un s Yystelle.',
+ 'mainpagedocfooter' => 'Lueg uf d [//meta.wikimedia.org/wiki/MediaWiki_localisation Dokumentation fir d Aapassig vu dr Benutzeroberflächi] un s [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuech] fir d Hilf iber d Benutzig un s Yystelle.', # Fuzzy
);
/** Gujarati (ગà«àªœàª°àª¾àª¤à«€)
@@ -6783,6 +7066,7 @@ $messages['haw'] = array(
* @author Amire80
* @author YaronSh
* @author ערן
+ * @author ì•„ë¼
*/
$messages['he'] = array(
'config-desc' => 'תכנית ההתקנה של מדיה־ויקי',
@@ -6790,19 +7074,19 @@ $messages['he'] = array(
'config-information' => 'פרטי×',
'config-localsettings-upgrade' => 'זוהה קובץ <code>LocalSettings.php</code>.
כדי לשדרג ×ת ההתקנה ×”×–×ת, × × ×œ×”×§×œ×™×“ ×ת הערך של <code>$wgUpgradeKey</code> בתיבה להלן.
-×פשר ×œ×ž×¦×•× ×ותו בקובץ LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'זוהה קובץ LocalSettings.php.
-כדי לשדרג ×ת ההתקנה ×”×–×ת, הריצו ×ת update.php ×•×œ× ×ת הקובץ ×”×–×”.',
+×פשר ×œ×ž×¦×•× ×ותו בקובץ <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' => 'זוהתה התקנה קיימת של מדיה־ויקי.
-כדי לשדרג ×ת ההתקנה ×”×–×ת, ×× × ×›×ª×‘×• ×ת השורה ×”×‘× ×‘×ª×—×ª×™×ª קובץ LocalSettings.php שלכ×:
+כדי לשדרג ×ת ההתקנה ×”×–×ת, ×× × ×›×ª×‘×• ×ת השורה ×”×‘× ×‘×ª×—×ª×™×ª קובץ <code>LocalSettings.php</code> שלכ×:
$1',
- 'config-localsettings-incomplete' => 'נר××” שקובץ LocalSettings.php ×”×§×™×™× ×ינו של×.
+ 'config-localsettings-incomplete' => 'נר××” שקובץ <code>LocalSettings.php</code> ×”×§×™×™× ×ינו של×.
המשתנה $1 ×ינו מוגדר.
-נו לשנות ×ת קובץ LocalSettings.php ×©×œ×›× ×›×š שהמשתנה ×”×–×” ×™×”×™×” מוגדר וללחוץ "המשך".',
- 'config-localsettings-connection-error' => '×ירעה שגי××” בעת חיבור למסד × ×ª×•× ×™× ×¢× ×”×’×“×¨×•×ª ב־LocalSettings.php ×ו ב־AdminSettings.php. × × ×œ×ª×§×Ÿ ×ת ההגדרות ×”×לו ולנסות שוב.
+נו לשנות ×ת קובץ <code>LocalSettings.php</code> ×©×œ×›× ×›×š שהמשתנה ×”×–×” ×™×”×™×” מוגדר וללחוץ "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => '×ירעה שגי××” בעת חיבור למסד × ×ª×•× ×™× ×¢× ×”×’×“×¨×•×ª ב־<code>LocalSettings.php</code> ×ו ב־<code>AdminSettings.php</code>. × × ×œ×ª×§×Ÿ ×ת ההגדרות ×”×לו ולנסות שוב.
$1',
'config-session-error' => 'שגי××” ב×תחול שיחה: $1',
@@ -6934,7 +7218,7 @@ $1
'config-using531' => '××™Ö¾×פשר להשתמש במדיה־ויקי ×¢× <span dir="ltr">PHP $1</span> בגלל ב××’ ×‘×¤×¨×ž×˜×¨×™× ×©×œ הפניות (reference parameters) ל־<code dir="ltr">__call()</code>.
שדרגו ל־PHP 5.3.2 ×ו לגרסה גבוהה יותר כדי לתקן ×ת ×–×” ([//bugs.php.net/bug.php?id=50394 bug filed with PHP]) ×ו שַנמכו ל־PHP 5.3.0 כדי לפתור ×ת הבעיה ×”×–×ת.
ההתקנה בוטלה.',
- 'config-suhosin-max-value-length' => 'מותקן פה Suhosin ×•×”×•× ×ž×’×‘×™×œ ×ת ×ורך פרמטר GET ל־$1 בתי×. רכיב ResourceLoader של מדיה־ויקי יעקוף ×ת המגלבה ×”×–×ת, ×בל ×–×” יפגע בביצועי×. ×× ×–×” בכלל ×פשרי, כדי לתקן ×ת הערך של suhosin.get.max_value_length ל־1024 בקובץ php.ini ולהגדיר ×ת ‎$wgResourceLoaderMaxQueryLength ל×ותו הערך בקובץ LocalSettings.php.',
+ 'config-suhosin-max-value-length' => 'מותקן פה Suhosin ×•×”×•× ×ž×’×‘×™×œ ×ת ×ורך פרמטר GET ל־$1 בתי×. רכיב ResourceLoader של מדיה־ויקי יעקוף ×ת המגלבה ×”×–×ת, ×בל ×–×” יפגע בביצועי×. ×× ×–×” בכלל ×פשרי, כד××™ לתקן ×ת הערך של <code>suhosin.get.max_value_length</code> ל־1024 ×ו יותר בקובץ <code>php.ini</code> ולהגדיר ×ת ‎<code>$wgResourceLoaderMaxQueryLength</code> ל×ותו הערך בקובץ LocalSettings.php.',
'config-db-type' => 'סוג מסד הנתוני×:',
'config-db-host' => 'שרת מסד הנתוני×:',
'config-db-host-help' => '×× ×©×¨×ª מסד ×”× ×ª×•× ×™× ×©×œ×›× × ×ž×¦× ×¢×œ שרת ×חר, הקלידו ×ת ×©× ×”×ž×—×©×‘ ×ו ×ת כתובת ×”Ö¾IP ×›×ן.
@@ -7015,7 +7299,7 @@ $1
'config-support-postgres' => '$1 ×”×•× ×ž×¡×“ × ×ª×•× ×™× × ×¤×•×¥ בקוד פתוח ×•×”×•× × ×¤×•×¥ בתור חלופה ל־MySQL (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). ייתכן שיש בתצורה ×”×–×ת ב××’×™× ×ž×¡×•×™×ž×™× ×•×”×™× ×œ× ×ž×•×ž×œ×¦×ª לסביבות מבצעיות.',
'config-support-sqlite' => '* $1 ×”×•× ×ž×¡×“ × ×ª×•× ×™× ×§×œ×™×œ ×¢× ×ª×ž×™×›×” טובה מ×וד. (ר׳ [http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)',
'config-support-oracle' => '* $1 ×”×•× ×ž×¡×“ × ×ª×•× ×™× ×¢×¡×§×™ מסחרי. (ר׳ [http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
- 'config-support-ibm_db2' => '* $1 ×”×•× ×ž×¡×“ × ×ª×•× ×™× ×ž×¡×—×¨×™ ×רגוני.',
+ 'config-support-ibm_db2' => '* $1 ×”×•× ×ž×¡×“ × ×ª×•× ×™× ×ž×¡×—×¨×™ ×רגוני. ([http://www.php.net/manual/en/ibm-db2.installation.php How to compile PHP with IBM DB2 support])',
'config-header-mysql' => 'הגדרות MySQL',
'config-header-postgres' => 'הגדרות PostgreSQL',
'config-header-sqlite' => 'הגדרות SQLite',
@@ -7082,8 +7366,8 @@ chmod a+w $3</pre></div>',
'config-upgrade-done-no-regenerate' => 'השדרוג הושל×.
עכשיו ×פשר [$1 להתחיל להשתמש בוויקי שלכ×].',
- 'config-regenerate' => 'לחולל מחדש ×ת LocalSettings.php â†',
- 'config-show-table-status' => 'ש×ילתת SHOW TABLE STATUS נכשלה!',
+ 'config-regenerate' => 'לחולל מחדש ×ת <code>LocalSettings.php</code> â†',
+ 'config-show-table-status' => 'ש×ילתת <code>SHOW TABLE STATUS</code> נכשלה!',
'config-unknown-collation' => "'''×זהרה:''' מסד ×”× ×ª×•× ×™× ×ž×©×ª×ž×© בשיטת מיון ש××™× ×” מוּכּרת.",
'config-db-web-account' => 'חשבון במסד ×”× ×ª×•× ×™× ×œ×’×™×©×” מהרשת',
'config-db-web-help' => 'לבחור ×ת ×©× ×”×ž×©×ª×ž×© ו×ת הססמה ששרת הווב ישתמש בו להתחברות לשרת מסד ×”× ×ª×•× ×™× ×‘×–×ž×Ÿ פעילות רגילה של הוויקי.',
@@ -7155,7 +7439,7 @@ chmod a+w $3</pre></div>',
'config-optional-continue' => 'הצגת ש×לות נוספות.',
'config-optional-skip' => '×ž×©×¢×ž× ×œ×™, תתקינו לי כבר ×ת הוויקי ×”×–×”.',
'config-profile' => 'תסריט הרש×ות משתמשי×:',
- 'config-profile-wiki' => 'ויקי מסורתי',
+ 'config-profile-wiki' => 'ויקי פיתוח',
'config-profile-no-anon' => 'נדרשת יצירת חשבון',
'config-profile-fishbowl' => '×¢×•×¨×›×™× ×ž×•×¨×©×™× ×‘×œ×‘×“',
'config-profile-private' => 'ויקי פרטי',
@@ -7164,7 +7448,7 @@ chmod a+w $3</pre></div>',
×¢× ×–×ת, ×× ×©×™× ×©×•× ×™× ×ž×¦×ו למדיה־ויקי ×©×™×ž×•×©×™× ×ž×’×•Ö¼×•× ×™× ×•×œ×¢×ª×™× ×œ× ×§×œ לשכנע ×ת ×›×•×œ× ×‘×™×ª×¨×•× ×•×ª של \"דרך הוויקי\" המסורתית. ולכן יש ×œ×›× ×‘×¨×¨×”.
-ב×תר '''{{int:config-profile-wiki}}''' – ×œ×›×•×œ× ×™×© הרש××” לערוך, ×פילו בלי להיכנס לחשבון.
+ב×תר מסוג '''{{int:config-profile-wiki}}''' – ×œ×›×•×œ× ×™×© הרש××” לערוך, ×פילו בלי להיכנס לחשבון.
ב×תר וויקי מסוג '''{{int:config-profile-no-anon}}''' יש ביטחון גדול יותר, ×בל הגדרה ×›×–×ת יכולה להרתיע ×ª×•×¨×ž×™× ×ž×–×“×ž× ×™×.
בתסריט '''{{int:config-profile-fishbowl}}''' רק ×ž×©×ª×ž×©×™× ×©×§×™×‘×œ×• ×ישור ×™×›×•×œ×™× ×œ×¢×¨×•×š, ×בל כל ×”×’×•×œ×©×™× ×™×›×•×œ×™× ×œ×§×¨×•× ×ת ×”×“×¤×™× ×•×ת גרס××•×ª×™×”× ×”×§×•×“×ž×•×ª.
@@ -7255,7 +7539,7 @@ chmod a+w $3</pre></div>',
'config-install-alreadydone' => "'''×זהרה:''' נר××” שכבר ×”×ª×§× ×ª× ×ת מדיה־ויקי ו××ª× ×ž× ×¡×™× ×œ×”×ª×§×™×Ÿ ×ותה שוב.
×× ×” התקדמו לדף הב×.",
'config-install-begin' => 'כשתלחצו על "{{int:config-continue}}", תתחילו ×ת ההתקנה של מדיה־ויקי.
-×× ××ª× ×¢×“×™×™×Ÿ ×¨×•×¦×™× ×œ×©× ×•×ª משהו, לחצו על "הקוד×".',
+×× ××ª× ×¢×“×™×™×Ÿ ×¨×•×¦×™× ×œ×©× ×•×ª משהו, לחצו על "{{int:config-back}}"',
'config-install-step-done' => 'בוצע',
'config-install-step-failed' => 'נכשל',
'config-install-extensions' => 'כולל הרחבות',
@@ -7311,7 +7595,7 @@ $3
'''שימו לב''': ×× ×œ× ×ª×¢×©×• ×–×ת עכשיו, קובץ ההגדרות המחוּלל ×œ× ×™×”×™×” זמין ×œ×›× ×©×•×‘.
×חרי שתעשו ×ת ×–×”, תוכלו '''[$2 להיכנס לוויקי שלכ×]'''.",
- 'config-download-localsettings' => 'הורדת LocalSettings.php',
+ 'config-download-localsettings' => 'הורדת <code>LocalSettings.php</code>',
'config-help' => 'עזרה',
'config-nofile' => 'הקובץ "$1" ×œ× × ×ž×¦×. ×”×× ×”×•× × ×ž×—×§?',
'mainpagetext' => "'''תוכנת מדיה־ויקי הותקנה בהצלחה.'''",
@@ -7320,7 +7604,8 @@ $3
== ×§×™×©×•×¨×™× ×©×™×ž×•×©×™×™× ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings רשימת ההגדרות]
* [//www.mediawiki.org/wiki/Manual:FAQ ש×לות ותשובות על מדיה־ויקי]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרס×ות]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרס×ות]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources ×ª×¨×’×•× ×ž×“×™×”Ö¾×•×™×§×™ לשפה שלך]',
);
/** Hindi (हिनà¥à¤¦à¥€)
@@ -7371,6 +7656,7 @@ i [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide VodiÄ za suradnike] za po
/** Upper Sorbian (hornjoserbsce)
* @author Michawiki
+ * @author ì•„ë¼
*/
$messages['hsb'] = array(
'config-desc' => 'Instalaciski program za MediaWiki',
@@ -7378,19 +7664,19 @@ $messages['hsb'] = array(
'config-information' => 'Informacije',
'config-localsettings-upgrade' => 'Dataja <code>LocalSettings.php</code> je so wotkryła.
Zo by tutu instalaciju aktualizował, zapodaj prošu hódnotu za parameter <code>$wgUpgradeKey</code> do slědowaceho pola.
-Namakaš tón parameter w dataji LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Dataja LocalSettings.php bu wotkryta.
-Zo by tutu instalaciju aktualizował, wuwjedźće update.php',
+Namakaš tón parameter w dataji <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'Dataja <code>LocalSettings.php</code> bu wotkryta.
+Zo by tutu instalaciju aktualizował, wuwjedźće <code>update.php</code>',
'config-localsettings-key' => 'Aktualizaciski kluÄ:',
'config-localsettings-badkey' => 'KluÄ, kotryž sy podaÅ‚, je wopak',
'config-upgrade-key-missing' => 'Eksistowaca instalacija MediaWiki je so wotkryła.
-Zo by tutu instalaciju aktualizował, staj prošu slědowacu linku deleka w dataji LocalSettings.php:
+Zo by tutu instalaciju aktualizował, staj prošu slědowacu linku deleka w dataji <code>LocalSettings.php</code>:
$1',
- 'config-localsettings-incomplete' => 'Zda so, zo eksistwoaca dataja LocalSettings.php je njedospołna.
+ 'config-localsettings-incomplete' => 'Zda so, zo eksistwoaca dataja <code>LocalSettings.php</code> je njedospołna.
Wariabla $1 njeje nastajena.
-Prošu změń dataju LocalSettings.php, zo by so tuta wariabla nastajiła a klikń na "Dale".',
- 'config-localsettings-connection-error' => 'Při zwjazowanju z datowej banku z pomocu nastajenjow podatych w LocalSettings.php abo AdminSettings.php je zmylk wustupił. Prošu skoriguj tute nastajenja a spytaj hišće raz.
+Prošu změń dataju <code>LocalSettings.php</code>, zo by so tuta wariabla nastajiła a klikń na "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => 'Při zwjazowanju z datowej banku z pomocu nastajenjow podatych w <code>LocalSettings.php</code> abo <code>AdminSettings.php</code> je zmylk wustupił. Prošu skoriguj tute nastajenja a spytaj hišće raz.
$1',
'config-session-error' => 'Zmylk při startowanju posedźenja: $1',
@@ -7514,16 +7800,13 @@ Změń ju jenož, jeli su pÅ™eswÄ›dÄiwe pÅ™iÄiny za to.',
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-mysql' => '* $1 je primarny cil za MediaWiki a podpěruje so najlěpje ([http://www.php.net/manual/en/mysql.installation.php Nawod ke kompilowanju PHP z MySQL-podpěru])',
'config-support-postgres' => '* $1 je popularny system datoweje banki zjawneho žórÅ‚a jako alternatiwa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php nawod za kompilowanje PHP z podpÄ›ru PostgreSQL]). MóhÅ‚o hišće nÄ›kotre zmylki eksistować, a njeporuÄa so jón w produktiwnej wokolinje wužiwać.',
'config-support-oracle' => '* $1 je komercielna předewzaćelska datowa banka. ([http://www.php.net/manual/en/oci8.installation.php Nawod za kompilowanje PHP z OCI8-podpěru])',
- 'config-support-ibm_db2' => '* $1 je komercielna předewzaćelska datowa banka.',
'config-header-mysql' => 'Nastajenja MySQL',
'config-header-postgres' => 'Nastajenja PostgreSQL',
'config-header-sqlite' => 'Nastajenja SQLite',
'config-header-oracle' => 'Nastajenja Oracle',
- 'config-header-ibm_db2' => 'Nastajenja IBM DB2',
'config-invalid-db-type' => 'Njepłaćiwy typ datoweje banki',
'config-missing-db-name' => 'Dyrbiš hódnotu za "Mjeno datoweje banki" zapodać',
'config-missing-db-host' => 'Dyrbiš hódnotu za "Database host" zapodać',
@@ -7560,8 +7843,8 @@ Zo by je na MediaWiki $1 aktualizował, klikń na '''Dale'''.",
'config-upgrade-done-no-regenerate' => 'Aktualizacija dokónÄena.
Móžeš nětko [$1 swój wiki wužiwać].',
- 'config-regenerate' => 'LocalSettings.php znowa wutworić →',
- 'config-show-table-status' => 'Naprašowanje SHOW TABLE STATUS je so njeporadźiło!',
+ 'config-regenerate' => '<code>LocalSettings.php</code> znowa wutworić →',
+ 'config-show-table-status' => 'Naprašowanje <code>SHOW TABLE STATUS</code> je so njeporadźiło!',
'config-unknown-collation' => "'''Warnowanje:''' Datowa banka njeznatu kolaciju wužiwa.",
'config-db-web-account' => 'Konto datoweje banki za webpřistup',
'config-db-web-help' => 'wubjer wužiwarske mjeno a hesło, kotrejž webserwer budźe wužiwać, zo by z serwerom datoweje banki za wšědnu operaciju zwjazać',
@@ -7610,7 +7893,7 @@ MóžeÅ¡ nÄ›tko zbytnu konfiguraciju pÅ™eskoÄić a wiki hnydom instalować.',
'config-optional-continue' => 'Dalše prašenja?',
'config-optional-skip' => 'Instaluj nětko wiki.',
'config-profile' => 'Profil wužiwarskich prawow:',
- 'config-profile-wiki' => 'Tradicionelny wiki',
+ 'config-profile-wiki' => 'Zjawny wiki',
'config-profile-no-anon' => 'Załoženje konto je trěbne',
'config-profile-fishbowl' => 'Jenož awtorizowani wobdźěłarjo',
'config-profile-private' => 'Priwatny wiki',
@@ -7668,7 +7951,7 @@ To móže sej přidatnu konfiguraciju wužadać, ale móžeš je nětko zmóžni
'config-install-alreadydone' => "'''Warnowanje:''' Zda so, zo sy hižo MediaWiki instalował a pospytuješ jón znowa instalować.
ProÅ¡u pokroÄuj z pÅ™ichodnej stronu.",
'config-install-begin' => 'Přez kliknjenje na "{{int:config-continue}}" budźe so instalacija MediaWiki startować.
-Jeli hišće chceš něšto změnić, klikń na "Wróćo".',
+Jeli hišće chceš něšto změnić, klikń na "{{int:config-back}}".',
'config-install-step-done' => 'dokónÄene',
'config-install-step-failed' => 'njeporadźiło',
'config-install-extensions' => 'Inkluziwnje rozšěrjenja',
@@ -7704,7 +7987,7 @@ Standardna lisćina sp přeskakuje.",
'config-install-mainpage' => 'HÅ‚owna strona so ze standardnym wobsahom wutworja',
'config-install-extension-tables' => 'Tabele za zmóžnjene rozšěrjenja so tworja',
'config-install-mainpage-failed' => 'Powěsć njeda so zasunyć: $1',
- 'config-download-localsettings' => 'LocalSettings.php sćahnyć',
+ 'config-download-localsettings' => '<code>LocalSettings.php</code> sćahnyć',
'config-help' => 'pomoc',
'config-nofile' => 'Dataja "$1" njeje so namakała. Je so zhašała?',
'mainpagetext' => "'''MediaWiki bu wuspěšnje instalowany.'''",
@@ -7714,7 +7997,8 @@ Standardna lisćina sp přeskakuje.",
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Wo nastajenjach]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki za twoju rÄ›Ä lokalizować]',
);
/** Haitian (Kreyòl ayisyen)
@@ -7734,25 +8018,26 @@ $messages['ht'] = array(
/** Hungarian (magyar)
* @author Dani
* @author Glanthor Reviol
+ * @author ì•„ë¼
*/
$messages['hu'] = array(
'config-desc' => 'A MediaWiki telepítője',
'config-title' => 'A MediaWiki $1 telepítése',
'config-information' => 'Információ',
'config-localsettings-upgrade' => 'Már létezik a <code>LocalSettings.php</code> fájl.
-A telepített szoftver frissítéséhez írd be az alábbi mezőbe a <code>$wgUpgradeKey</code> beállítás értékét, melyet a LocalSettings.php nevű fájlban találhatsz meg.',
- 'config-localsettings-cli-upgrade' => 'A LocalSettings.php fájl megtalálható.
-A telepített rendszer frissítéséhez futtasd az update.php-t.',
+A telepített szoftver frissítéséhez írd be az alábbi mezőbe a <code>$wgUpgradeKey</code> beállítás értékét, melyet a <code>LocalSettings.php</code> nevű fájlban találhatsz meg.',
+ 'config-localsettings-cli-upgrade' => 'A <code>LocalSettings.php</code> fájl megtalálható.
+A telepített rendszer frissítéséhez futtasd az <code>update.php</code>-t.',
'config-localsettings-key' => 'Frissítési kulcs:',
'config-localsettings-badkey' => 'A megadott kulcs érvénytelen.',
'config-upgrade-key-missing' => 'A telepítő a MediaWiki meglévő példányát észlelte.
-A telepített rendszer frissítéséhez helyezd el az alábbi sort a LocalSettings.php végére:
+A telepített rendszer frissítéséhez helyezd el az alábbi sort a <code>LocalSettings.php</code> végére:
$1',
- 'config-localsettings-incomplete' => 'A meglévő LocalSettings.php hiányosnak tűnik.
+ 'config-localsettings-incomplete' => 'A meglévő <code>LocalSettings.php</code> hiányosnak tűnik.
A(z) $1 változó értéke nincs beállítva.
-Módosítsd a LocalSettings.php fájlt úgy, hogy ez a változó be legyen állítva, majd kattints a „Folytatás†gombra.',
- 'config-localsettings-connection-error' => 'Nem sikerült csatlakozni az adatbázishoz a LocalSettings.php-ben vagy az AdminSettings.php-ben megadott adatokkal. Ellenőrizd a beállításokat, majd próbáld újra.
+Módosítsd a <code>LocalSettings.php</code> fájlt úgy, hogy ez a változó be legyen állítva, majd kattints a „{{int:Config-continue}}†gombra.',
+ 'config-localsettings-connection-error' => 'Nem sikerült csatlakozni az adatbázishoz a <code>LocalSettings.php</code>-ben vagy az <code>AdminSettings.php</code>-ben megadott adatokkal. Ellenőrizd a beállításokat, majd próbáld újra.
$1',
'config-session-error' => 'Nem sikerült elindítani a munkamenetet: $1',
@@ -7877,7 +8162,7 @@ Telepítés megszakítva.',
'config-using531' => 'A MediaWiki nem használható a PHP $1-es verziójával, mert hiba van a <code>__call()</code> függvénynek átadott referenciaparaméterekkel.
A probléma kiküszöböléséhez frissíts a PHP 5.3.2-es verziójára, vagy használd a korábbi, 5.3.0-ásat.
Telepítés megszakítva.',
- 'config-suhosin-max-value-length' => 'A Suhosin telepítve van, és a GET paraméter hosszát $1 bájtra korlátozza. A MediaWiki erőforrásbetöltő összetevője megkerüli a problémát, de így csökkenni fog a teljesítmény. Ha lehetséges, állítsd be a suhosin.get.max_value_length értékét legalább 1024-re a php.iniben, és állítsd be a $wgResourceLoaderMaxQueryLength változót ugyanerre az értékre a LocalSettings.php-ben.',
+ 'config-suhosin-max-value-length' => 'A Suhosin telepítve van, és a GET paraméter hosszát $1 bájtra korlátozza. A MediaWiki erőforrásbetöltő összetevője megkerüli a problémát, de így csökkenni fog a teljesítmény. Ha lehetséges, állítsd be a <code>suhosin.get.max_value_length</code> értékét legalább 1024-re a <code>php.ini</code>ben, és állítsd be a <code>$wgResourceLoaderMaxQueryLength</code> változót ugyanerre az értékre a LocalSettings.php-ben.', # Fuzzy
'config-db-type' => 'Adatbázis típusa:',
'config-db-host' => 'Adatbázis hosztneve:',
'config-db-host-help' => 'Ha az adatbázisszerver másik szerveren található, add meg a hosztnevét vagy az IP-címét.
@@ -7955,7 +8240,7 @@ Ha az alábbi listán nem találod azt a rendszert, melyet használni szeretnél
'config-support-postgres' => '* A $1 népszerű, nyílt forráskódú adatbázisrendszer, a MySQL alternatívája ([http://www.php.net/manual/en/pgsql.installation.php Hogyan fordítható a PHP PostgreSQL-támogatással]). Több apró, javítatlan hiba is előfordulhat, így nem ajánlott éles környezetben használni.',
'config-support-sqlite' => '* Az $1 egy könnyű, nagyon jól támogatott adatbázisrendszer. ([http://www.php.net/manual/en/pdo.installation.php Hogyan fordítható a PHP SQLite-támogatással], PDO-t használ)',
'config-support-oracle' => '* Az $1 kereskedelmi, vállalati adatbázisrendszer. ([http://www.php.net/manual/en/oci8.installation.php Hogyan fordítható a PHP OCI8-támogatással])',
- 'config-support-ibm_db2' => '* Az $1 kereskedelmi vállalati adatbázisrendszer.',
+ 'config-support-ibm_db2' => '* Az $1 kereskedelmi vállalati adatbázisrendszer.', # Fuzzy
'config-header-mysql' => 'MySQL-beállítások',
'config-header-postgres' => 'PostgreSQL-beállítások',
'config-header-sqlite' => 'SQLite-beállítások',
@@ -8022,8 +8307,8 @@ Ez '''nem ajánlott''', csak akkor, ha problémák vannak a wikivel.",
'config-upgrade-done-no-regenerate' => "A frissítés befejeződött.
Most már '''[$1 beléphetsz a wikibe]'''.",
- 'config-regenerate' => 'LocalSettings.php elkészítése újra →',
- 'config-show-table-status' => 'A SHOW TABLE STATUS lekérdezés nem sikerült!',
+ 'config-regenerate' => '<code>LocalSettings.php</code> elkészítése újra →',
+ 'config-show-table-status' => 'A <code>SHOW TABLE STATUS</code> lekérdezés nem sikerült!',
'config-unknown-collation' => "'''Figyelmeztetés:''' az adatbázis ismeretlen egybevetést használ.",
'config-db-web-account' => 'A webes hozzáférésnél használt adatbázisfiók',
'config-db-web-help' => 'Add meg azt a felhasználónevet és jelszót, amit a webszerver a wiki általános működése során használ a csatlakozáshoz.',
@@ -8094,7 +8379,7 @@ A további konfigurációt kihagyhatod, és most azonnal elindíthatod a wiki te
'config-optional-continue' => 'További információk megadása.',
'config-optional-skip' => 'Épp elég volt, települjön a wiki!',
'config-profile' => 'Felhasználói jogosultságok profilja:',
- 'config-profile-wiki' => 'Hagyományos wiki',
+ 'config-profile-wiki' => 'Hagyományos wiki', # Fuzzy
'config-profile-no-anon' => 'Felhasználói fiók létrehozása szükséges',
'config-profile-fishbowl' => 'Csak engedélyezett szerkesztők',
'config-profile-private' => 'Privát wiki',
@@ -8108,7 +8393,7 @@ Választhatsz!
Lehetőség van arra is, hogy '''{{lc:{{int:config-profile-fishbowl}}}}''' módosíthassák a lapokat, de a nyilvánosság ekkor megtekintheti a lapokat és azok laptörténetét is. '''{{int:config-profile-private}}''' esetén csak az engedélyezett szerkesztők tekinthetik meg a lapokat, és ugyanez a csoport szerkeszthet.
-Telepítés után jóval összetettebb jogosultságrendszer állítható össze, további információ a [//www.mediawiki.org/wiki/Manual:User_rights kézikönyv kapcsolódó bejegyzésében].",
+Telepítés után jóval összetettebb jogosultságrendszer állítható össze, további információ a [//www.mediawiki.org/wiki/Manual:User_rights kézikönyv kapcsolódó bejegyzésében].", # Fuzzy
'config-license' => 'Szerzői jog és licenc:',
'config-license-none' => 'Nincs licencjelzés',
'config-license-cc-by-sa' => 'Creative Commons Nevezd meg! - Ãgy add tovább!',
@@ -8192,7 +8477,7 @@ Lehetséges, hogy további beállításra lesz szükség hozzájuk, de már most
'config-install-alreadydone' => "'''Figyelmeztetés:''' Úgy tűnik, hogy a MediaWiki telepítve van, és te ismét megpróbálod telepíteni.
Folytasd a következő oldalon.",
'config-install-begin' => 'A „{{int:config-continue}}†gomb megnyomása elindítja a MediaWiki telepítését.
-Ha szeretnél módosítani a beállításokon, kattints a vissza gombra.',
+Ha szeretnél módosítani a beállításokon, kattints a vissza gombra.', # Fuzzy
'config-install-step-done' => 'kész',
'config-install-step-failed' => 'sikertelen',
'config-install-extensions' => 'Kiterjesztések beillesztése',
@@ -8243,7 +8528,7 @@ $3
'''Megjegyzés''': Ha ezt most nem teszed meg, és kilépsz a telepítésből, az elkészített konfigurációs fájlt nem tudod elérni a későbbiekben.
Ha végeztél a fájl elhelyezésével, '''[$2 beléphetsz a wikibe]'''.",
- 'config-download-localsettings' => 'LocalSettings.php letöltése',
+ 'config-download-localsettings' => '<code>LocalSettings.php</code> letöltése',
'config-help' => 'segítség',
'mainpagetext' => "'''A MediaWiki telepítése sikeresen befejeződött.'''",
'mainpagedocfooter' => "Ha segítségre van szükséged a wikiszoftver használatához, akkor keresd fel a [//meta.wikimedia.org/wiki/Help:Contents User's Guide] oldalt.
@@ -8251,7 +8536,7 @@ Ha végeztél a fájl elhelyezésével, '''[$2 beléphetsz a wikibe]'''.",
== Alapok (angol nyelven) ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Beállítások listája]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki GyIK]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]", # Fuzzy
);
/** Magyar (magázó) (Magyar (magázó))
@@ -8330,7 +8615,7 @@ Ha ezzel készen van, '''[$2 beléphet a wikibe]'''.", # Fuzzy
== Alapok (angol nyelven) ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Beállítások listája]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki GyIK]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]", # Fuzzy
);
/** Armenian (Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶)
@@ -8348,6 +8633,7 @@ $messages['hy'] = array(
/** Interlingua (interlingua)
* @author McDutchie
+ * @author ì•„ë¼
*/
$messages['ia'] = array(
'config-desc' => 'Le installator de MediaWiki',
@@ -8355,19 +8641,19 @@ $messages['ia'] = array(
'config-information' => 'Information',
'config-localsettings-upgrade' => 'Un file <code>LocalSettings.php</code> ha essite detegite.
Pro actualisar iste installation, per favor entra le valor de <code>$wgUpgradeKey</code> in le quadro hic infra.
-Iste se trova in LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Un file LocalSettings.php file ha essite detegite.
-Pro actualisar iste installation, per favor executa upgrade.php.',
+Iste se trova in <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'Un file <code>LocalSettings.php</code> file ha essite detegite.
+Pro actualisar iste installation, per favor executa <code>update.php</code>.',
'config-localsettings-key' => 'Clave de actualisation:',
'config-localsettings-badkey' => 'Le clave que tu forniva es incorrecte',
'config-upgrade-key-missing' => 'Un installation existente de MediaWiki ha essite detegite.
-Pro actualisar iste installation, es necessari adjunger le sequente linea al fin del file LocalSettings.php:
+Pro actualisar iste installation, es necessari adjunger le sequente linea al fin del file <code>LocalSettings.php</code>:
$1',
- 'config-localsettings-incomplete' => 'Le file LocalSettings.php existente pare esser incomplete.
+ 'config-localsettings-incomplete' => 'Le file <code>LocalSettings.php</code> existente pare esser incomplete.
Le variabile $1 non es definite.
-Per favor cambia LocalSettings.php de sorta que iste variabile es definite, e clicca "Continuar".',
- 'config-localsettings-connection-error' => 'Un error esseva incontrate durante le connexion al base de datos usante le configurationes specificate in LocalSettings.php o AdminSettings.php. Per favor repara iste configurationes e tenta lo de novo.
+Per favor cambia <code>LocalSettings.php</code> de sorta que iste variabile es definite, e clicca "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => 'Un error esseva incontrate durante le connexion al base de datos usante le configurationes specificate in <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Per favor repara iste configurationes e tenta lo de novo.
$1',
'config-session-error' => 'Error al comenciamento del session: $1',
@@ -8501,7 +8787,7 @@ Installation abortate.',
'config-using531' => 'MediaWiki non pote esser usate con PHP $1 a causa de un defecto concernente parametros de referentia a <code>__call()</code>.
Actualisa a PHP 5.3.2 o plus recente, o retrograda a PHP 5.3.0 pro remediar isto.
Installation abortate.',
- 'config-suhosin-max-value-length' => 'Suhosin es installate e limita le longitude del parametro GET a $1 bytes. Le componente ResourceLoader de MediaWiki pote contornar iste limite, ma isto degradara le rendimento. Si possibile, tu deberea mitter suhosin.get.max_value_length a 1024 o plus in php.ini , e mitter $wgResourceLoaderMaxQueryLength al mesme valor in LocalSettings.php .',
+ 'config-suhosin-max-value-length' => 'Suhosin es installate e limita le longitude del parametro GET a $1 bytes. Le componente ResourceLoader de MediaWiki pote contornar iste limite, ma isto degradara le rendimento. Si possibile, tu deberea mitter <code>suhosin.get.max_value_length</code> a 1024 o plus in <code>php.ini</code> , e mitter <code>$wgResourceLoaderMaxQueryLength</code> al mesme valor in LocalSettings.php .', # Fuzzy
'config-db-type' => 'Typo de base de datos:',
'config-db-host' => 'Servitor de base de datos:',
'config-db-host-help' => 'Si tu servitor de base de datos es in un altere servitor, entra hic le nomine o adresse IP del servitor.
@@ -8585,7 +8871,7 @@ Si tu non vide hic infra le systema de base de datos que tu tenta usar, alora se
'config-support-postgres' => '* $1 es un systema de base de datos popular e open source, alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar PHP con supporto de PostgreSQL]). Es possibile que resta alcun minor defectos non resolvite, dunque illo non es recommendate pro uso in un ambiente de production.',
'config-support-sqlite' => '* $1 es un systema de base de datos legier que es multo ben supportate. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)',
'config-support-oracle' => '* $1 es un banca de datos commercial pro interprisas. ([http://www.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])',
- 'config-support-ibm_db2' => '* $1 es un systema commercial de base de datos pro interprisas.',
+ 'config-support-ibm_db2' => '* $1 es un systema commercial de base de datos pro interprisas.', # Fuzzy
'config-header-mysql' => 'Configuration de MySQL',
'config-header-postgres' => 'Configuration de PostgreSQL',
'config-header-sqlite' => 'Configuration de SQLite',
@@ -8652,8 +8938,8 @@ Isto '''non es recommendate''' si tu non ha problemas con tu wiki.",
'config-upgrade-done-no-regenerate' => 'Actualisation complete.
Tu pote ora [$1 comenciar a usar tu wiki].',
- 'config-regenerate' => 'Regenerar LocalSettings.php →',
- 'config-show-table-status' => 'Le consulta SHOW TABLE STATUS falleva!',
+ 'config-regenerate' => 'Regenerar <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'Le consulta <code>SHOW TABLE STATUS</code> falleva!',
'config-unknown-collation' => "'''Aviso:''' Le base de datos usa un collation non recognoscite.",
'config-db-web-account' => 'Conto de base de datos pro accesso via web',
'config-db-web-help' => 'Selige le nomine de usator e contrasigno que le servitor web usara pro connecter al servitor de base de datos, durante le operation ordinari del wiki.',
@@ -8725,7 +9011,7 @@ Tu pote ora saltar le configuration remanente e installar le wiki immediatemente
'config-optional-continue' => 'Pone me plus questiones.',
'config-optional-skip' => 'Isto me es jam tediose. Simplemente installa le wiki.',
'config-profile' => 'Profilo de derectos de usator:',
- 'config-profile-wiki' => 'Wiki traditional',
+ 'config-profile-wiki' => 'Wiki traditional', # Fuzzy
'config-profile-no-anon' => 'Creation de conto obligatori',
'config-profile-fishbowl' => 'Modificatores autorisate solmente',
'config-profile-private' => 'Wiki private',
@@ -8741,7 +9027,7 @@ Un wiki con '''{{int:config-profile-no-anon}}''' attribue additional responsabil
Le scenario '''{{int:config-profile-fishbowl}}''' permitte al usatores approbate de modificar, ma le publico pote vider le paginas, includente lor historia.
Un '''{{int:config-profile-private}}''' permitte solmente al usatores approbate de vider le paginas e de modificar los.
-Configurationes de derectos de usator plus complexe es disponibile post installation, vide le [//www.mediawiki.org/wiki/Manual:User_rights pertinente section del manual].",
+Configurationes de derectos de usator plus complexe es disponibile post installation, vide le [//www.mediawiki.org/wiki/Manual:User_rights pertinente section del manual].", # Fuzzy
'config-license' => 'Copyright e licentia:',
'config-license-none' => 'Nulle licentia in pede de paginas',
'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
@@ -8826,7 +9112,7 @@ Istes pote requirer additional configuration, ma tu pote activar los ora.',
'config-install-alreadydone' => "'''Aviso:''' Il pare que tu ha jam installate MediaWiki e tenta installar lo de novo.
Per favor continua al proxime pagina.",
'config-install-begin' => 'Un clic sur "{{int:config-continue}}" comencia le installation de MediaWiki.
-Pro facer alterationes, clicca sur "Retro".',
+Pro facer alterationes, clicca sur "Retro".', # Fuzzy
'config-install-step-done' => 'finite',
'config-install-step-failed' => 'fallite',
'config-install-extensions' => 'Include le extensiones',
@@ -8883,7 +9169,7 @@ $3
'''Nota''': Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.
Post facer isto, tu pote '''[$2 entrar in tu wiki]'''.",
- 'config-download-localsettings' => 'Discargar LocalSettings.php',
+ 'config-download-localsettings' => 'Discargar <code>LocalSettings.php</code>',
'config-help' => 'adjuta',
'config-nofile' => 'Le file "$1" non poteva esser trovate. Ha illo essite delite?',
'mainpagetext' => "'''MediaWiki ha essite installate con successo.'''",
@@ -8892,7 +9178,7 @@ Post facer isto, tu pote '''[$2 entrar in tu wiki]'''.",
== Pro initiar ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de configurationes]
* [//www.mediawiki.org/wiki/Manual:FAQ FAQ a proposito de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]', # Fuzzy
);
/** Indonesian (Bahasa Indonesia)
@@ -8900,6 +9186,7 @@ Post facer isto, tu pote '''[$2 entrar in tu wiki]'''.",
* @author IvanLanin
* @author Kenrick95
* @author Reedy
+ * @author ì•„ë¼
*/
$messages['id'] = array(
'config-desc' => 'Penginstal untuk MediaWiki',
@@ -8907,19 +9194,19 @@ $messages['id'] = array(
'config-information' => 'Informasi',
'config-localsettings-upgrade' => 'Berkas <code>LocalSettings.php</code> sudah ada.
Untuk memutakhirkan instalasi ini, masukkan nilai <code>$wgUpgradeKey</code> dalam kotak yang tersedia di bawah ini.
-Anda dapat menemukan nilai tersebut dalam LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Berkas LocalSettings.php terdeteksi.
-Untuk meningkatkan versi, harap jalankan update.php.',
+Anda dapat menemukan nilai tersebut dalam <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'Berkas <code>LocalSettings.php</code> terdeteksi.
+Untuk meningkatkan versi, harap jalankan <code>update.php</code>.',
'config-localsettings-key' => 'Kunci pemutakhiran:',
'config-localsettings-badkey' => 'Kunci yang Anda berikan tidak benar',
'config-upgrade-key-missing' => 'Suatu instalasi MediaWiki telah terdeteksi.
-Untuk memutakhirkan instalasi ini, silakan masukkan baris berikut di bagian bawah LocalSettings.php Anda:
+Untuk memutakhirkan instalasi ini, silakan masukkan baris berikut di bagian bawah <code>LocalSettings.php</code> Anda:
$1',
- 'config-localsettings-incomplete' => 'LocalSettings.php yang ada tampaknya tidak lengkap.
+ 'config-localsettings-incomplete' => '<code>LocalSettings.php</code> yang ada tampaknya tidak lengkap.
Variabel $1 tidak diatur.
-Silakan ubah LocalSettings.php untuk mengatur variabel ini dan klik "Lanjutkan".',
- 'config-localsettings-connection-error' => 'Timbul galat saat menghubungkan ke basis data dengan menggunakan setelan yang ditentukan di LocalSettings.php atau AdminSettings.php. Harap perbaiki setelan ini dan coba lagi.
+Silakan ubah <code>LocalSettings.php</code> untuk mengatur variabel ini dan klik "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => 'Timbul galat saat menghubungkan ke basis data dengan menggunakan setelan yang ditentukan di <code>LocalSettings.php</code> atau <code>AdminSettings.php</code>. Harap perbaiki setelan ini dan coba lagi.
$1',
'config-session-error' => 'Kesalahan sesi mulai: $1',
@@ -9043,7 +9330,7 @@ Instalasi dibatalkan.',
'config-using531' => 'MediaWiki tidak dapat dijalankan dengan PHP $1 karena bug yang melibatkan parameter referensi untuk <code>__call()</code> .
Tingkatkan ke PHP 5.3.2 atau lebih baru, atau turunkan ke PHP versi 5.3.0 untuk menyelesaikan hal ini.
Instalasi dibatalkan.',
- 'config-suhosin-max-value-length' => 'Suhosin terpasang dan membatasi panjang parameter GET sebesar $1 bita. Komponen ResourceLoader MediaWiki akan mengatasi batasan ini, tapi penanganannya akan menurunkan kinerja. Jika memungkinkan, Anda sebaiknya menetapkan nilai suhosin.get.max_value_length menjadi 1024 atau lebih tinggi dalam php.ini dan menyetel $wgResourceLoaderMaxQueryLength dengan nilai yang sama dalam LocalSettings.php.',
+ 'config-suhosin-max-value-length' => 'Suhosin terpasang dan membatasi panjang parameter GET sebesar $1 bita. Komponen ResourceLoader MediaWiki akan mengatasi batasan ini, tapi penanganannya akan menurunkan kinerja. Jika memungkinkan, Anda sebaiknya menetapkan nilai <code>suhosin.get.max_value_length</code> menjadi 1024 atau lebih tinggi dalam <code>php.ini</code> dan menyetel <code>$wgResourceLoaderMaxQueryLength</code> dengan nilai yang sama dalam LocalSettings.php.', # Fuzzy
'config-db-type' => 'Jenis basis data:',
'config-db-host' => 'Inang basis data:',
'config-db-host-help' => 'Jika server basis data Anda berada di server yang berbeda, masukkan nama inang atau alamat IP di sini.
@@ -9115,7 +9402,6 @@ Pertimbangkan untuk menempatkan basis data di tempat lain, misalnya di <code>/va
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki mendukung sistem basis data berikut:
$1
@@ -9125,12 +9411,10 @@ Jika Anda tidak melihat sistem basis data yang Anda gunakan tercantum di bawah i
'config-support-postgres' => '* $1 adalah sistem basis data sumber terbuka populer sebagai alternatif untuk MySQL ([http://www.php.net/manual/en/pgsql.installation.php cara mengompilasi PHP dengan dukungan PostgreSQL]). Mungkin ada beberapa bug terbuka dan alternatif ini tidak direkomendasikan untuk dipakai dalam lingkungan produksi.',
'config-support-sqlite' => '* $1 adalah sistem basis data yang ringan yang sangat baik dukungannya. ([http://www.php.net/manual/en/pdo.installation.php cara mengompilasi PHP dengan dukungan SQLite], menggunakan PDO)',
'config-support-oracle' => '* $1 adalah basis data komersial untuka perusahaan. ([http://www.php.net/manual/en/oci8.installation.php cara mengompilasi PHP dengan dukungan OCI8])',
- 'config-support-ibm_db2' => '* $1 adalah basis data-perusahaan komersial.',
'config-header-mysql' => 'Pengaturan MySQL',
'config-header-postgres' => 'Pengaturan PostgreSQL',
'config-header-sqlite' => 'Pengaturan SQLite',
'config-header-oracle' => 'Pengaturan Oracle',
- 'config-header-ibm_db2' => 'Pengaturan IBM DB2',
'config-invalid-db-type' => 'Jenis basis data tidak sah',
'config-missing-db-name' => 'Anda harus memasukkan nilai untuk "Nama basis data"',
'config-missing-db-host' => 'Anda harus memasukkan nilai untuk "Inang basis data"',
@@ -9192,8 +9476,8 @@ Tindakan ini '''tidak dianjurkan''' kecuali jika Anda mengalami masalah dengan w
'config-upgrade-done-no-regenerate' => 'Pemutakhiran selesai.
Anda sekarang dapat [$1 mulai menggunakan wiki Anda].',
- 'config-regenerate' => 'Regenerasi LocalSettings.php →',
- 'config-show-table-status' => 'Kueri SHOW TABLE STATUS gagal!',
+ 'config-regenerate' => 'Regenerasi <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'Kueri <code>SHOW TABLE STATUS</code> gagal!',
'config-unknown-collation' => "'''Peringatan:''' basis data menggunakan kolasi yang tidak dikenal.",
'config-db-web-account' => 'Akun basis data untuk akses web',
'config-db-web-help' => 'Masukkan nama pengguna dan sandi yang akan digunakan server web untuk terhubung ke server basis data saat operasi normal wiki.',
@@ -9215,7 +9499,6 @@ Basis data MyISAM cenderung lebih sering rusak daripada basis data InnoDB.",
Ini lebih efisien daripada modus UTF-8 MySQL dan memungkinkan Anda untuk menggunakan ragam penuh karakter Unicode.
Dalam '''modus UTF-8''', MySQL akan tahu apa set karakter data dan dapat menampilkan dan mengubahnya sesuai keperluan, tetapi tidak akan mengizinkan Anda menyimpan karakter di atas [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
- 'config-ibm_db2-low-db-pagesize' => "Basis data DB2 Anda tidak memiliki pagesize yang cukup untuk tablespace bawaan. Pagesize harus sama atau lebih dari '''32K'''.",
'config-site-name' => 'Nama wiki:',
'config-site-name-help' => 'Ini akan muncul di bilah judul peramban dan di berbagai tempat lainnya.',
'config-site-name-blank' => 'Masukkan nama situs.',
@@ -9256,7 +9539,7 @@ Anda sekarang dapat melewati sisa konfigurasi dan menginstal wiki sekarang.',
'config-optional-continue' => 'Berikan saya pertanyaan lagi.',
'config-optional-skip' => 'Saya sudah bosan, instal saja wikinya.',
'config-profile' => 'Profil hak pengguna:',
- 'config-profile-wiki' => 'Wiki tradisional',
+ 'config-profile-wiki' => 'Wiki tradisional', # Fuzzy
'config-profile-no-anon' => 'Pembuatan akun diperlukan',
'config-profile-fishbowl' => 'Khusus penyunting terdaftar',
'config-profile-private' => 'Wiki pribadi',
@@ -9270,7 +9553,7 @@ Namun, berbagai kegunaan lain dari MediaWiki telah ditemukan, dan kadang tidak m
'''{{int:config-profile-fishbowl}}''' memungkinkan pengguna yang disetujui untuk menyunting, tetapi publik dapat melihat halaman, termasuk riwayatnya.
'''{{int:config-profile-private}}''' hanya memungkinkan pengguna yang disetujui untuk melihat dan menyunting halaman.
-Konfigurasi hak pengguna yang lebih kompleks tersedia setelah instalasi. Lihat [//www.mediawiki.org/wiki/Manual:User_rights/id entri manual terkait].",
+Konfigurasi hak pengguna yang lebih kompleks tersedia setelah instalasi. Lihat [//www.mediawiki.org/wiki/Manual:User_rights/id entri manual terkait].", # Fuzzy
'config-license' => 'Hak cipta dan lisensi:',
'config-license-none' => 'Tidak ada lisensi',
'config-license-cc-by-sa' => 'Creative Commons Atribusi Berbagi Serupa',
@@ -9355,7 +9638,7 @@ Ekstensi tersebut mungkin memerlukan konfigurasi tambahan, tetapi Anda dapat men
'config-install-alreadydone' => "'''Peringatan:''' Anda tampaknya telah menginstal MediaWiki dan mencoba untuk menginstalnya lagi.
Lanjutkan ke halaman berikutnya.",
'config-install-begin' => 'Dengan menekan "{{int:config-continue}}", Anda akan memulai instalasi MediaWiki.
-Jika Anda masih ingin membuat perubahan, tekan "{{int:config-back}}".',
+Jika Anda masih ingin membuat perubahan, tekan "{{int:config-back}}".', # Fuzzy
'config-install-step-done' => 'selesai',
'config-install-step-failed' => 'gagal',
'config-install-extensions' => 'Termasuk ekstensi',
@@ -9383,7 +9666,8 @@ Mengabaikan daftar bawaan.",
'config-install-keys' => 'Membuat kunci rahasia',
'config-insecure-keys' => "'''Peringatan:''' {{PLURAL:$2|Suatu|Beberapa}} kunci aman ($1) yang dibuat selama instalasi {{PLURAL:$2|tidak|tidak}} benar-benar aman. Pertimbangkan untuk mengubah {{PLURAL:$2|kunci|kunci-kunci}} tersebut secara manual.",
'config-install-sysop' => 'Membuat akun pengguna pengurus',
- 'config-install-subscribe-fail' => 'Tidak dapat berlangganan mediawiki-announce', # Fuzzy
+ 'config-install-subscribe-fail' => 'Tidak dapat berlangganan mediawiki-announce: $1',
+ 'config-install-subscribe-notpossible' => 'cURL tidak diinstal dan allow_url_fopen tidak tersedia.',
'config-install-mainpage' => 'Membuat halaman utama dengan konten bawaan',
'config-install-extension-tables' => 'Pembuatan tabel untuk ekstensi yang diaktifkan',
'config-install-mainpage-failed' => 'Tidak dapat membuat halaman utama: $1',
@@ -9402,16 +9686,17 @@ $3
'''Catatan''': Jika Anda tidak melakukannya sekarang, berkas konfigurasi yang dihasilkan ini tidak akan tersedia lagi setelah Anda keluar dari proses instalasi tanpa mengunduhnya.
Setelah melakukannya, Anda dapat '''[$2 memasuki wiki Anda]'''.",
- 'config-download-localsettings' => 'Unduh LocalSettings.php',
+ 'config-download-localsettings' => 'Unduh <code>LocalSettings.php</code>',
'config-help' => 'bantuan',
+ 'config-nofile' => 'Berkas "$1" tidak dapat ditemukan. Mungkin sudah dihapus?',
'mainpagetext' => "'''MediaWiki telah terpasang dengan sukses'''.",
'mainpagedocfooter' => 'Silakan baca [//www.mediawiki.org/wiki/Help:Contents/id Panduan Pengguna] untuk cara penggunaan perangkat lunak wiki ini.
== Memulai penggunaan ==
-
* [//www.mediawiki.org/wiki/Manual:Configuration_settings/id Daftar pengaturan konfigurasi]
* [//www.mediawiki.org/wiki/Manual:FAQ/id Daftar pertanyaan yang sering diajukan mengenai MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Terjemahkan MediaWiki ke bahasa Anda]',
);
/** Interlingue (Interlingue)
@@ -9424,6 +9709,12 @@ $messages['ie'] = array(
* @author Ukabia
*/
$messages['ig'] = array(
+ 'config-back' => '↠Laàzú',
+ 'config-continue' => 'Gawazie →',
+ 'config-page-language' => 'Ãsụ̀sụ̀',
+ 'config-page-name' => 'Ãhà',
+ 'config-page-install' => 'Sụ̀ímé',
+ 'config-restart' => 'Eeh, bìdówárí ya.',
'config-admin-password' => 'Okwúngáfè:',
'config-admin-password-confirm' => 'Okwúngáfè mgbe ozor:',
'mainpagetext' => "'''MediaWiki a banyélé nke oma.'''",
@@ -9432,7 +9723,7 @@ $messages['ig'] = array(
== I bídó ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Ndétu ndósé ihe]
* [//www.mediawiki.org/wiki/Manual:FAQ FAQ MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce wéfù ndétu nke ozi MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce wéfù ndétu nke ozi MediaWiki]", # Fuzzy
);
/** Iloko (Ilokano)
@@ -9471,7 +9762,9 @@ $messages['is'] = array(
* @author Beta16
* @author Darth Kule
* @author F. Cosoleto
+ * @author Gianfranco
* @author Karika
+ * @author ì•„ë¼
*/
$messages['it'] = array(
'config-desc' => 'Il programma di installazione per MediaWiki',
@@ -9479,19 +9772,19 @@ $messages['it'] = array(
'config-information' => 'Informazioni',
'config-localsettings-upgrade' => 'È stato rilevato un file <code>LocalSettings.php</code>.
Per aggiornare questa installazione, si prega di inserire il valore di <code>$wgUpgradeKey</code> nella casella qui sotto.
-Lo potete trovare in LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'È stato rilevato un file LocalSettings.php.
-Per aggiornare questa installazione, eseguire update.php',
+Lo potete trovare in <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'È stato rilevato un file <code>LocalSettings.php</code>.
+Per aggiornare questa installazione, eseguire <code>update.php</code>',
'config-localsettings-key' => 'Chiave di aggiornamento:',
'config-localsettings-badkey' => 'La chiave che hai fornito non è corretta.',
'config-upgrade-key-missing' => "È stata rilevata un'installazione esistente di MediaWiki.
-Per aggiornare questa installazione, si prega di inserire la seguente riga nella parte inferiore del tuo LocalSettings.php:
+Per aggiornare questa installazione, si prega di inserire la seguente riga nella parte inferiore del tuo <code>LocalSettings.php</code>:
$1",
- 'config-localsettings-incomplete' => 'Il file LocalSettings.php esistente sembra essere incompleto.
+ 'config-localsettings-incomplete' => 'Il file <code>LocalSettings.php</code> esistente sembra essere incompleto.
La variabile $1 non è impostata.
-Cambia LocalSettings.php in modo che questa variabile sia impostata e fai clic su "Continua".',
- 'config-localsettings-connection-error' => 'Si è verificato un errore durante la connessione al database utilizzando le impostazioni specificate in LocalSettings.php o AdminSettings.php. Si prega di correggere queste impostazioni e riprovare.
+Cambia <code>LocalSettings.php</code> in modo che questa variabile sia impostata e fai clic su "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => 'Si è verificato un errore durante la connessione al database utilizzando le impostazioni specificate in <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Si prega di correggere queste impostazioni e riprovare.
$1',
'config-session-error' => "Errore nell'avvio della sessione: $1",
@@ -9526,6 +9819,15 @@ Controlla il tuo file php.ini ed assicurati che <code>session.save_path</code> Ã
'config-welcome' => "=== Controllo dell'ambiente ===
Vengono eseguiti controlli di base per vedere se questo ambiente è adatto per l'installazione di MediaWiki.
Se hai bisogno di aiuto durante l'installazione, è necessario fornire i risultati di questi controlli.",
+ 'config-sidebar' => '* [//www.mediawiki.org Pagina principale MediaWiki]
+* [//www.mediawiki.org/wiki/Aiuto:Guida ai contenuti per utenti]
+* [//www.mediawiki.org/wiki/Manuale:Guida ai contenuti per admin]
+* [//www.mediawiki.org/wiki/Manuale:FAQ FAQ]
+----
+* <doclink href=Readme>Leggimi</doclink>
+* <doclink href=ReleaseNotes>Note di versione</doclink>
+* <doclink href=Copying>Copie</doclink>
+* <doclink href=UpgradeDoc>Aggiornamenti</doclink>',
'config-env-good' => "L'ambiente è stato controllato.
È possibile installare MediaWiki.",
'config-env-bad' => "L'ambiente è stato controllato.
@@ -9564,10 +9866,14 @@ Installazione interrotta.",
'config-using-server' => 'Nome server in uso "<nowiki>$1</nowiki>".',
'config-using-uri' => 'URL del server in uso "<nowiki>$1$2</nowiki>".',
'config-db-type' => 'Tipo di database:',
+ 'config-db-wiki-settings' => 'Identifica questo wiki',
'config-db-name' => 'Nome del database:',
+ 'config-db-name-oracle' => 'Schema del database:',
+ 'config-db-username' => 'Nome utente del database:',
'config-db-password-empty' => 'Inserire una password per il nuovo utente del database: $1.
Anche se può essere possibile creare utenti senza password, questo non è sicuro.',
'config-db-install-help' => "Inserire il nome utente e la password che verranno usate per la connessione al database durante il processo d'installazione.",
+ 'config-db-prefix' => 'Prefisso tabella del database:',
'config-db-charset' => 'Set di caratteri del database',
'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
'config-charset-mysql4' => 'MySQL 4.0 con compatibilità UTF-8',
@@ -9585,15 +9891,19 @@ Da cambiare solamente se si è sicuri di averne bisogno.',
'config-header-oracle' => 'Impostazioni Oracle',
'config-header-ibm_db2' => 'Impostazioni IBM DB2',
'config-invalid-db-type' => 'Tipo di database non valido',
+ 'config-missing-db-name' => 'È necessario immettere un valore per "Nome del database"',
+ 'config-db-web-account' => "Account del database per l'accesso web",
'config-db-web-create' => "Crea l'account se non esiste già",
'config-mysql-engine' => 'Storage engine:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
'config-mysql-charset' => 'Set di caratteri del database:',
+ 'config-mysql-binary' => 'Binario',
'config-mysql-utf8' => 'UTF-8',
'config-ibm_db2-low-db-pagesize' => "Il database DB2 in uso ha una tablespace predefinita con un insufficiente pagesize, che dovrebbe essere '''32K''' o maggiore.",
'config-ns-generic' => 'Progetto',
'config-ns-site-name' => 'Stesso nome wiki: $1',
+ 'config-ns-other-default' => 'MyWiki',
'config-admin-box' => 'Account amministratore',
'config-admin-name' => 'Tuo nome:',
'config-admin-password' => 'Password:',
@@ -9614,26 +9924,47 @@ Specificare un nome utente diverso.',
Inserire un indirizzo email se si desidera effettuare l'iscrizione alla mailing list.",
'config-almost-done' => 'Hai quasi finito!
Adesso puoi saltare la rimanente parte della configurazione e semplicemente installare la wiki.',
+ 'config-optional-continue' => 'Fammi altre domande.',
+ 'config-profile-wiki' => 'Wiki tradizionale', # Fuzzy
+ 'config-profile-no-anon' => 'Creazione utenza obbligatoria',
+ 'config-profile-fishbowl' => 'Solo editori autorizzati',
+ 'config-profile-private' => 'Wiki privata',
'config-license' => 'Copyright e licenza:',
+ 'config-license-none' => 'Nessun piè di pagina per la licenza',
'config-license-cc-by-sa' => 'Creative Commons Attribuzione-Condividi allo stesso modo',
'config-license-cc-by' => 'Creative Commons Attribuzione',
'config-license-cc-by-nc-sa' => 'Creative Commons Attribuzione-Non commerciale-Condividi allo stesso modo',
'config-license-cc-0' => 'Creative Commons Zero (pubblico dominio)',
'config-license-gfdl' => 'GNU Free Documentation License 1.3 o versioni successive',
'config-license-pd' => 'Pubblico dominio',
+ 'config-license-cc-choose' => 'Seleziona una delle licenze Creative Commons',
+ 'config-license-help' => "Molti wiki pubblici rilasciano i loro contributi con una [http://freedomdefined.org/Definition licenza libera]. Questo aiuta a creare un senso di proprietà condivisa nella comunità e incoraggia a contribuire a lungo termine. Non è generalmente necessario per un wiki privato o aziendale.
+
+Se vuoi usare testi da Wikipedia, o desideri che Wikipedia possa essere in grado di accettare testi copiati dal tuo wiki, dovresti scegliere '''Creative Commons Attribution Share Alike'''.
+
+In precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL è una licenza valida, ma è di difficile comprensione e complica il riutilizzo dei contenuti.",
'config-email-settings' => 'Impostazioni email',
+ 'config-email-user' => 'Abilita invio email fra utenti',
'config-email-auth' => 'Abilita autenticazione via email',
+ 'config-upload-enable' => 'Consentire il caricamento di file',
'config-upload-deleted' => 'Directory per i file cancellati:',
'config-logo' => 'URL del logo:',
+ 'config-instantcommons' => 'Abilita Instant Commons',
'config-cc-again' => 'Seleziona di nuovo...',
'config-cc-not-chosen' => 'Scegliere quale licenza Creative Commons si desidera e cliccare su "procedi".',
'config-advanced-settings' => 'Configurazione avanzata',
+ 'config-memcache-needservers' => 'È stato selezionato il tipo di caching Memcached, ma non è stato impostato alcun server.',
'config-memcache-badip' => 'È stato inserito un indirizzo IP non valido per Memcached: $1.',
'config-extensions' => 'Estensioni',
+ 'config-install-step-done' => 'fatto',
+ 'config-install-step-failed' => 'non riuscito',
+ 'config-install-schema' => 'Creazione dello schema',
+ 'config-install-user' => 'Creazione di utente del database',
'config-install-user-alreadyexists' => 'L\'utente "$1" è già presente',
'config-install-user-create-failed' => 'Creazione dell\'utente "$1" non riuscita: $2',
'config-install-user-missing' => 'L\'utente indicato "$1" non esiste.',
'config-install-tables-failed' => "'''Errore''': La creazione della tabella non è riuscita: $1",
+ 'config-install-interwiki' => 'Riempimento della tabella interwiki predefinita',
'config-install-interwiki-list' => 'Impossibile leggere il file <code>interwiki.list</code>.',
'config-install-stats' => 'Inizializzazione delle statistiche',
'config-install-keys' => 'Generazione delle chiavi segrete',
@@ -9642,7 +9973,7 @@ Adesso puoi saltare la rimanente parte della configurazione e semplicemente inst
'config-install-subscribe-notpossible' => 'cURL non è installato e allow_url_fopen non è disponibile.',
'config-install-mainpage' => 'Creazione della pagina principale con contenuto predefinito',
'config-install-mainpage-failed' => 'Impossibile inserire la pagina principale: $1',
- 'config-download-localsettings' => 'Scarica LocalSettings.php',
+ 'config-download-localsettings' => 'Scarica <code>LocalSettings.php</code>',
'config-help' => 'aiuto',
'config-nofile' => 'Il file "$1" non può essere trovato. È stato eliminato?',
'mainpagetext' => "'''Installazione di MediaWiki completata correttamente.'''",
@@ -9653,7 +9984,8 @@ I seguenti collegamenti sono in lingua inglese:
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Impostazioni di configurazione]
* [//www.mediawiki.org/wiki/Manual:FAQ Domande frequenti su MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]",
);
/** Japanese (日本語)
@@ -9673,25 +10005,29 @@ $messages['ja'] = array(
'config-information' => '情報',
'config-localsettings-upgrade' => 'ファイル <code>LocalSettings.php</code> を検出ã—ã¾ã—ãŸã€‚
インストールã•ã‚Œã¦ã„ã‚‹ã‚‚ã®ã‚’アップグレードã™ã‚‹ã«ã¯ã€<code>$wgUpgradeKey</code> ã®å€¤ã‚’以下ã®æ¬„ã«å…¥åŠ›ã—ã¦ãã ã•ã„。
-ã“ã®å€¤ã¯ LocalSettings.php 内ã«ã‚ã‚Šã¾ã™ã€‚',
- 'config-localsettings-cli-upgrade' => 'ファイル LocalSettings.php を検出ã—ã¾ã—ãŸã€‚
-インストールã•ã‚Œã¦ã„ã‚‹ã‚‚ã®ã‚’アップグレードã™ã‚‹ã«ã¯ã€update.php を実行ã—ã¦ãã ã•ã„',
+ã“ã®å€¤ã¯ <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 ãŒæ—¢ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’検出ã—ã¾ã—ãŸã€‚
-インストールã•ã‚Œã¦ã„ã‚‹ã‚‚ã®ã‚’アップグレードã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã®è¡Œã‚’ LocalSettings.php ã®æœ«å°¾ã«æŒ¿å…¥ã—ã¦ãã ã•ã„:
+インストールã•ã‚Œã¦ã„ã‚‹ã‚‚ã®ã‚’アップグレードã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã®è¡Œã‚’ <code>LocalSettings.php</code> ã®æœ«å°¾ã«æŒ¿å…¥ã—ã¦ãã ã•ã„:
$1',
- 'config-localsettings-incomplete' => '既存㮠LocalSettings.php ã®å†…容ã¯ä¸å®Œå…¨ã®ã‚ˆã†ã§ã™ã€‚
+ 'config-localsettings-incomplete' => '既存㮠<code>LocalSettings.php</code> ã®å†…容ã¯ä¸å®Œå…¨ã®ã‚ˆã†ã§ã™ã€‚
変数 $1 ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。
-LocalSettings.php 内ã§ã“ã®å¤‰æ•°ã‚’設定ã—ã¦ã€ã€Œ{{int:Config-continue}}ã€ã‚’クリックã—ã¦ãã ã•ã„。',
+<code>LocalSettings.php</code> 内ã§ã“ã®å¤‰æ•°ã‚’設定ã—ã¦ã€ã€Œ{{int:Config-continue}}ã€ã‚’クリックã—ã¦ãã ã•ã„。',
+ 'config-localsettings-connection-error' => '<code>LocalSettings.php</code> ã¾ãŸã¯ <code>AdminSettings.php</code> ã§æŒ‡å®šã—ãŸè¨­å®šã‚’使用ã—ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+設定を修正ã—ã¦ã‹ã‚‰å†åº¦è©¦ã—ã¦ãã ã•ã„。
+
+$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-no-session' => 'セッションã®ãƒ‡ãƒ¼ã‚¿ãŒæ¶ˆå¤±ã—ã¾ã—ãŸ!
+php.ini 内㧠<code>session.save_path</code> ãŒé©åˆ‡ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¨­å®šã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。',
'config-your-language' => 'ã‚ãªãŸã®è¨€èªž:',
'config-your-language-help' => 'インストール作業ã«ä½¿ç”¨ã™ã‚‹è¨€èªžã‚’é¸æŠžã—ã¦ãã ã•ã„。',
'config-wiki-language' => 'ウィキã®è¨€èªž:',
@@ -9713,7 +10049,7 @@ php.iniを確èªã—ã€<code>session.save_path</code>ãŒé©åˆ‡ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆã
'config-page-copying' => 'コピー',
'config-page-upgradedoc' => 'アップグレード',
'config-page-existingwiki' => '既存ã®ã‚¦ã‚£ã‚­',
- 'config-help-restart' => '入力ã—ãŸä¿å­˜ãƒ‡ãƒ¼ã‚¿ã‚’ã™ã¹ã¦æ¶ˆåŽ»ã—ã¦ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ä½œæ¥­ã‚’å†èµ·å‹•ã—ã¾ã™ã‹ï¼Ÿ',
+ 'config-help-restart' => '入力ã—ãŸä¿å­˜ãƒ‡ãƒ¼ã‚¿ã‚’ã™ã¹ã¦æ¶ˆåŽ»ã—ã¦ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ä½œæ¥­ã‚’å†èµ·å‹•ã—ã¾ã™ã‹?',
'config-restart' => 'ã¯ã„ã€å†èµ·å‹•ã—ã¾ã™',
'config-welcome' => '=== 環境ã®ç¢ºèª ===
基本的ãªç¢ºèªã§ã¯ã€ç¾åœ¨ã®ç’°å¢ƒãŒMediaWikiã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«é©ã—ã¦ã„ã‚‹ã‹ã‚’確èªã—ã¾ã™ã€‚
@@ -9721,12 +10057,12 @@ php.iniを確èªã—ã€<code>session.save_path</code>ãŒé©åˆ‡ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆã
'config-copyright' => '=== 著作権ãŠã‚ˆã³è¦ç´„ ===
$1
-ã“ã®ä½œå“ã¯ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™ã€‚ã‚ãªãŸã¯ã€ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢è²¡å›£ã®ç™ºè¡Œã™ã‚‹GNU一般公衆利用許諾書 (GNU General Public License)(ãƒãƒ¼ã‚¸ãƒ§ãƒ³2ã€ã¾ãŸã¯ãれ以é™ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ï¼‰ã®è¦ç´„ã«åŸºã¥ãã€ã“ã®ãƒ©ã‚¤ãƒ–ラリをå†é…布ãŠã‚ˆã³æ”¹å¤‰ã§ãã¾ã™ã€‚
+ã“ã®ä½œå“ã¯ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™ã€‚ã‚ãªãŸã¯ã€ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢è²¡å›£ã®ç™ºè¡Œã™ã‚‹GNU一般公衆利用許諾書 (GNU General Public License) (ãƒãƒ¼ã‚¸ãƒ§ãƒ³2ã€ã¾ãŸã¯ãれ以é™ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹) ã®è¦ç´„ã«åŸºã¥ãã€ã“ã®ãƒ©ã‚¤ãƒ–ラリをå†é…布ãŠã‚ˆã³æ”¹å¤‰ã§ãã¾ã™ã€‚
ã“ã®ä½œå“ã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€å•†ç”¨ã‚ã‚‹ã„ã¯ç‰¹å®šã®ç›®çš„ã«é©ã™ã‚‹ã‹ã©ã†ã‹ã‚‚å«ã‚ã¦ã€æš—黙的ã«ã‚‚ã€ä¸€åˆ‡ä¿è¨¼ã•ã‚Œã¾ã›ã‚“。
詳ã—ãã¯ã€GNU一般公衆利用許諾書をã”覧ãã ã•ã„。
-ã‚ãªãŸã¯ã“ã®ãƒ—ログラムã¨å…±ã«ã€<doclink href=Copying>GNU一般公衆利用許諾契約書ã®è¤‡è£½</doclink>を一部å—ã‘å–ã£ãŸã¯ãšã§ã™ã€‚ã‚‚ã—å—ã‘å–ã£ã¦ã„ãªã‘ã‚Œã°ã€ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢è²¡å›£(宛先㯠the Free Software Foundation, Inc., 59Temple Place, Suite 330, Boston, MA 02111-1307 USA)ã¾ã§è«‹æ±‚ã—ã¦ãã ã•ã„。',
+ã‚ãªãŸã¯ã“ã®ãƒ—ログラムã¨å…±ã«ã€<doclink href=Copying>GNU一般公衆利用許諾契約書ã®è¤‡è£½</doclink>を一部å—ã‘å–ã£ãŸã¯ãšã§ã™ã€‚å—ã‘å–ã£ã¦ã„ãªã„å ´åˆã¯ã€ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢è²¡å›£ (宛先㯠the Free Software Foundation, Inc., 59Temple Place, Suite 330, Boston, MA 02111-1307 USA) ã¾ã§è«‹æ±‚ã—ã¦ãã ã•ã„。',
'config-sidebar' => '* [//www.mediawiki.org MediaWikiã®ãƒ›ãƒ¼ãƒ ]
* [//www.mediawiki.org/wiki/Help:Contents 利用者å‘ã‘案内]
* [//www.mediawiki.org/wiki/Manual:Contents 管ç†è€…å‘ã‘案内]
@@ -9745,62 +10081,63 @@ MediaWikiã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã¯ã§ãã¾ã›ã‚“。',
ã—ã‹ã—ã€MediaWikiã«ã¯ PHP $2 以上ãŒå¿…è¦ã§ã™ã€‚',
'config-unicode-using-utf8' => 'Unicodeæ­£è¦åŒ–ã«ã€Brion Vibberã®utf8_normalize.soを使用。',
'config-unicode-using-intl' => 'Unicodeæ­£è¦åŒ–ã«[http://pecl.php.net/intl intl PECL 拡張機能]を使用。',
- 'config-unicode-pure-php-warning' => "'''警告''':Unicodeæ­£è¦åŒ–ã®å‡¦ç†ã« [http://pecl.php.net/intl intl PECL 拡張機能]ãŒä½¿ç”¨å¯èƒ½ã§ã¯ãªãã€å‡¦ç†ã®é…ã„ピュア PHP ã®å®Ÿè£…を代ã‚ã‚Šã«ç”¨ã„ã¦ã„ã¾ã™ã€‚
-高トラフィックã®ã‚µã‚¤ãƒˆã‚’é‹å–¶ã™ã‚‹å ´åˆã¯ã€[//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicodeæ­£è¦åŒ–ã«é–¢ã™ã‚‹ãƒšãƒ¼ã‚¸]ã‚’ãŠèª­ã¿ãã ã•ã„。",
- 'config-unicode-update-warning' => "'''警告''':インストールã•ã‚Œã¦ã„ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®Unicodeæ­£è¦åŒ–ラッパーã¯ã€[http://site.icu-project.org/ ICUプロジェクト]ã®ãƒ©ã‚¤ãƒ–ラリã®å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使用ã—ã¦ã„ã¾ã™ã€‚
-Unicodeã‚’å°‘ã—ã§ã‚‚利用ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãªã‚‰ã€[//www.mediawiki.org/wiki/Unicode_normalization_considerations アップグレード]ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚",
+ 'config-unicode-pure-php-warning' => "'''警告:''' Unicode æ­£è¦åŒ–ã®å‡¦ç†ã« [http://pecl.php.net/intl intl PECL 拡張機能]を利用ã§ããªã„ãŸã‚ã€å‡¦ç†ãŒé…ã„ピュア PHP ã®å®Ÿè£…を代ã‚ã‚Šã«ä½¿ç”¨ã—ã¦ã„ã¾ã™ã€‚
+高トラフィックã®ã‚µã‚¤ãƒˆã‚’é‹å–¶ã™ã‚‹å ´åˆã¯ã€[//www.mediawiki.org/wiki/Unicode_normalization_considerations 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
共有サーãƒãƒ¼ã‚’使用ã—ã¦ã„ã‚‹å ´åˆã¯ã€é©åˆ‡ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ ドライãƒãƒ¼ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ã€ã‚µãƒ¼ãƒãƒ¼ã®ç®¡ç†è€…ã«ä¾é ¼ã—ã¦ãã ã•ã„。
PHP を自分ã§ã‚³ãƒ³ãƒ‘イルã—ãŸå ´åˆã¯ã€ä¾‹ãˆã° <code>./configure --with-mysql</code> を実行ã—ã¦ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ クライアントを使用ã§ãるよã†ã«å†è¨­å®šã—ã¦ãã ã•ã„。
Debian ã¾ãŸã¯ Ubuntu ã®ãƒ‘ッケージã‹ã‚‰ PHP をインストールã—ãŸå ´åˆã¯ã€php5-mysql モジュールもインストールã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
- 'config-no-fts3' => "'''警告''':SQLiteã¯[//sqlite.org/fts3.html FTS3]モジュールãªã—ã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ãŠã‚Šã€æ¤œç´¢æ©Ÿèƒ½ã¯ã“ã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã§åˆ©ç”¨ä¸å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚",
- 'config-register-globals' => "'''警告:PHPã®<code>[http://php.net/register_globals register_globals]</code>オプションãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚'''
+ 'config-no-fts3' => "'''警告:''' SQLite 㯠[//sqlite.org/fts3.html FTS3] モジュールãªã—ã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ãŠã‚Šã€ã“ã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã§ã¯æ¤œç´¢æ©Ÿèƒ½ã¯åˆ©ç”¨ã§ããªããªã‚Šã¾ã™ã€‚",
+ 'config-register-globals' => "'''警告: PHP ã® <code>[http://php.net/register_globals register_globals]</code> オプションãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚'''
'''å¯èƒ½ãªã‚‰ç„¡åŠ¹åŒ–ã—ã¦ãã ã•ã„。'''
-MediaWikiã¯å‹•ä½œã—ã¾ã™ãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ã€æ½œåœ¨çš„ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£è„†å¼±æ€§ã‚’露呈ã—ã¾ã™ã€‚",
- 'config-magic-quotes-runtime' => "'''致命的エラー:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]ãŒå‹•ä½œã—ã¦ã„ã¾ã™ï¼'''
+MediaWiki ã¯å‹•ä½œã—ã¾ã™ãŒã€ã‚µãƒ¼ãƒãƒ¼ã®æ½œåœ¨çš„ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£è„†å¼±æ€§ãŒéœ²å‘ˆã•ã‚Œã¾ã™ã€‚",
+ 'config-magic-quotes-runtime' => "'''致命的エラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] ãŒå‹•ä½œã—ã¦ã„ã¾ã™!'''
ã“ã®ã‚ªãƒ—ションã¯ã€äºˆæœŸã›ãšãƒ‡ãƒ¼ã‚¿å…¥åŠ›ã‚’破壊ã—ã¾ã™ã€‚
-ã“ã®ã‚ªãƒ—ションãŒç„¡åŠ¹åŒ–ã•ã‚Œãªã„ã‹ãŽã‚Šã€MediaWikiをインストールã—利用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。",
- 'config-magic-quotes-sybase' => "'''致命的エラー:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]ãŒå‹•ä½œã—ã¦ã„ã¾ã™ï¼'''
+ã“ã®ã‚ªãƒ—ションを無効化ã—ãªã„é™ã‚Šã€MediaWiki ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚„使用ã¯ã§ãã¾ã›ã‚“。",
+ 'config-magic-quotes-sybase' => "'''致命的エラー: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] ãŒå‹•ä½œã—ã¦ã„ã¾ã™!'''
ã“ã®ã‚ªãƒ—ションã¯ã€äºˆæœŸã›ãšãƒ‡ãƒ¼ã‚¿å…¥åŠ›ã‚’破壊ã—ã¾ã™ã€‚
-ã“ã®ã‚ªãƒ—ションãŒç„¡åŠ¹åŒ–ã•ã‚Œãªã„ã‹ãŽã‚Šã€MediaWikiをインストールã—利用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。",
- 'config-mbstring' => "'''致命的エラー:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]ãŒå‹•ä½œã—ã¦ã„ã¾ã™ï¼'''
-ã“ã®ã‚ªãƒ—ションã¯ã€ã‚¨ãƒ©ãƒ¼ã‚’引ãèµ·ã“ã—ã€äºˆæœŸã›ãšãƒ‡ãƒ¼ã‚¿å…¥åŠ›ã‚’破壊ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
-ã“ã®ã‚ªãƒ—ションãŒç„¡åŠ¹åŒ–ã•ã‚Œãªã„ã‹ãŽã‚Šã€MediaWikiをインストールã—利用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。",
- 'config-ze1' => "'''致命的エラー:[http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]ãŒå‹•ä½œã—ã¦ã„ã¾ã™ï¼'''
-ã“ã®ã‚ªãƒ—ションã¯ã€MediaWikiã«ãŠã„ã¦æ·±åˆ»ãªãƒã‚°ã‚’引ãèµ·ã“ã—ã¾ã™ã€‚
-ã“ã®ã‚ªãƒ—ションãŒç„¡åŠ¹åŒ–ã•ã‚Œãªã„ã‹ãŽã‚Šã€MediaWikiをインストールã—利用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。",
- 'config-safe-mode' => "'''警告:'''PHPã®[http://www.php.net/features.safe-mode セーフモード]ãŒæœ‰åŠ¹ã§ã™ã€‚
-特ã«ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¢ãƒƒãƒ—ロード<code>math</code>ã®ã‚µãƒãƒ¼ãƒˆã«ãŠã„ã¦ã€å•é¡ŒãŒç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚",
+ã“ã®ã‚ªãƒ—ションを無効化ã—ãªã„é™ã‚Šã€MediaWiki ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚„使用ã¯ã§ãã¾ã›ã‚“。",
+ 'config-mbstring' => "'''致命的エラー: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] ãŒå‹•ä½œã—ã¦ã„ã¾ã™!'''
+ã“ã®ã‚ªãƒ—ションã¯ã€ã‚¨ãƒ©ãƒ¼ã‚’引ãèµ·ã“ã—ã€äºˆæœŸã›ãšãƒ‡ãƒ¼ã‚¿ã‚’破壊ã™ã‚‹ãŠãã‚ŒãŒã‚ã‚Šã¾ã™ã€‚
+ã“ã®ã‚ªãƒ—ションを無効化ã—ãªã„é™ã‚Šã€MediaWiki ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚„使用ã¯ã§ãã¾ã›ã‚“。",
+ 'config-ze1' => "'''致命的エラー: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] ãŒå‹•ä½œã—ã¦ã„ã¾ã™!'''
+ã“ã®ã‚ªãƒ—ションã¯ã€MediaWiki ã«ãŠã„ã¦æ·±åˆ»ãªãƒã‚°ã‚’引ãèµ·ã“ã—ã¾ã™ã€‚
+ã“ã®ã‚ªãƒ—ションを無効化ã—ãªã„é™ã‚Šã€MediaWiki ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚„使用ã¯ã§ãã¾ã›ã‚“。",
+ 'config-safe-mode' => "'''警告:''' PHPã®[http://www.php.net/features.safe-mode セーフモード]ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚
+特ã«ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¢ãƒƒãƒ—ロードや<code>math</code>機能ã§ã€å•é¡ŒãŒç™ºç”Ÿã™ã‚‹ãŠãã‚ŒãŒã‚ã‚Šã¾ã™ã€‚",
'config-xml-bad' => 'PHPã®XMLモジュールãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚
MediaWikiã¯ã€ã“ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®é–¢æ•°ã‚’å¿…è¦ã¨ã—ã¦ã„ã‚‹ãŸã‚ã€ã“ã®æ§‹æˆã§ã¯å‹•ä½œã—ã¾ã›ã‚“。
Mandrakeを実行ã—ã¦ã„ã‚‹å ´åˆã€php-xmlパッケージをインストールã—ã¦ãã ã•ã„。',
'config-pcre' => 'PCREをサãƒãƒ¼ãƒˆã—ã¦ã„るモジュールãŒä¸è¶³ã—ã¦ã„るよã†ã§ã™ã€‚
MediaWikiã¯ã€Perl互æ›ã®æ­£è¦è¡¨ç¾é–¢æ•°ã®å‹•ä½œãŒå¿…è¦ã§ã™ã€‚',
- 'config-pcre-no-utf8' => "'''致命的エラー''': PHP ã® PCRE ㌠PCRE_UTF8 対応ãªã—ã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„るよã†ã§ã™ã€‚
+ '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-memory-bad' => "'''警告:''' PHPã®<code>memory_limit</code>ã«$1ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚
+ã“ã®å€¤ã¯ãŠãらãå°ã•ã™ãŽã¾ã™ã€‚
+インストールãŒå¤±æ•—ã™ã‚‹ãŠãã‚ŒãŒã‚ã‚Šã¾ã™!",
'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-no-cache' => "'''警告:''' [http://www.php.net/apc APC]ã€[http://xcache.lighttpd.net/ XCache]ã€[http://www.iis.net/download/WinCacheForPhp WinCache] ã®ã„ãšã‚Œã‚‚見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
オブジェクトã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã¯æœ‰åŠ¹åŒ–ã•ã‚Œã¾ã›ã‚“。",
'config-diff3-bad' => 'GNU diff3 ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。',
- 'config-imagemagick' => 'ImageMagickãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸï¼š<code>$1</code>。
-アップロードãŒæœ‰åŠ¹ãªã‚‰ã€ç”»åƒã®ã‚µãƒ ãƒã‚¤ãƒ«ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚',
+ 'config-imagemagick' => 'ImageMagickãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ: <code>$1</code>。
+アップロードãŒæœ‰åŠ¹ã§ã‚ã‚Œã°ã€ç”»åƒã®ã‚µãƒ ãƒã‚¤ãƒ«ã‚’利用ã§ãã¾ã™ã€‚',
'config-gd' => 'GDç”»åƒãƒ©ã‚¤ãƒ–ラリãŒå†…蔵ã•ã‚Œã¦ã„ã‚‹ã“ã¨ãŒç¢ºèªã•ã‚Œã¾ã—ãŸã€‚
アップロードãŒæœ‰åŠ¹ãªã‚‰ã€ç”»åƒã®ã‚µãƒ ãƒã‚¤ãƒ«ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚',
'config-no-scaling' => 'GDライブラリもImageMagickも見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
ç”»åƒã®ã‚µãƒ ãƒã‚¤ãƒ«ç”Ÿæˆã¯ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚',
- 'config-no-uri' => "'''エラー:'''ç¾åœ¨ã®URIを決定ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ 'config-no-uri' => "'''エラー:''' ç¾åœ¨ã®URIを決定ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
インストールã¯ä¸­æ­¢ã•ã‚Œã¾ã—ãŸã€‚",
+ 'config-no-cli-uri' => "'''警告:''' --scriptpath ãŒæŒ‡å®šã•ã‚Œã¦ã„ãªã„ãŸã‚ã€æ—¢å®šå€¤ <code>$1</code> を使用ã—ã¾ã™ã€‚",
'config-using-server' => 'サーãƒãƒ¼å「<nowiki>$1</nowiki>ã€ã‚’使用ã—ã¦ã„ã¾ã™ã€‚',
'config-using-uri' => 'サーãƒãƒ¼ URL「<nowiki>$1$2</nowiki>ã€ã‚’使用ã—ã¦ã„ã¾ã™ã€‚',
- 'config-uploads-not-safe' => "'''警告:'''アップロードã®æ—¢å®šãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª <code>$1</code> ã«ã€ä»»æ„ã®ã‚¹ã‚¯ãƒªãƒ—ト実行ã«é–¢ã™ã‚‹è„†å¼±æ€§ãŒã‚ã‚Šã¾ã™ã€‚
+ 'config-uploads-not-safe' => "'''警告:''' アップロードã®æ—¢å®šãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª <code>$1</code> ã«ã€ä»»æ„ã®ã‚¹ã‚¯ãƒªãƒ—ト実行ã«é–¢ã™ã‚‹è„†å¼±æ€§ãŒã‚ã‚Šã¾ã™ã€‚
MediaWiki ã¯ã‚¢ãƒƒãƒ—ロードã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ä¸Šã®è„…å¨ã‚’確èªã—ã¾ã™ãŒã€ã‚¢ãƒƒãƒ—ロードを有効化ã™ã‚‹å‰ã«ã€[//www.mediawiki.org/wiki/Manual:Security#Upload_security ã“ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ä¸Šã®è„†å¼±æ€§ã‚’解決ã™ã‚‹]ã“ã¨ã‚’å¼·ã推奨ã—ã¾ã™ã€‚",
'config-brokenlibxml' => 'ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ä½¿ã‚ã‚Œã¦ã„ã‚‹PHPã¨libxml2ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã“ã®çµ„ã¿åˆã‚ã›ã«ã¯ãƒã‚°ãŒã‚ã‚Šã¾ã™ã€‚具体的ã«ã¯ã€MediaWikiã‚„ãã®ä»–ã®ã‚¦ã‚§ãƒ–アプリケーションã§hiddenデータãŒç ´æã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
PHPã‚’5.2.9ã‹ãれ以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã€libxml2ã‚’2.7.3ã‹ãれ以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—グレードã—ã¦ãã ã•ã„([//bugs.php.net/bug.php?id=45996 PHPã§ã®ãƒã‚°æƒ…å ±])。
@@ -9808,7 +10145,9 @@ PHPã‚’5.2.9ã‹ãれ以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã€libxml2ã‚’2.7.3ã‹ãれ以é™
'config-using531' => 'PHP$1ã¯<code>__call()</code>ã®å¼•æ•°å‚ç…§ã«é–¢ã™ã‚‹ãƒã‚°ã®ãŸã‚ã€MediaWikiã¨äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“。
PHP5.3.2以é™ã«æ›´æ–°ã™ã‚‹ã‹ã€ã“ã®([//bugs.php.net/bug.php?id=50394 PHPã«æ出ã•ã‚ŒãŸãƒã‚°])を修正ã™ã‚‹ãŸã‚ã«PHP5.3.0ã¸æˆ»ã—ã¦ãã ã•ã„。
インストールã¯ä¸­æ­¢ã•ã‚Œã¾ã—ãŸã€‚',
- 'config-suhosin-max-value-length' => 'Suhosin ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ãŠã‚Šã€GETパラメータã®é•·ã•ã‚’ $1 ãƒã‚¤ãƒˆã«åˆ¶é™ã—ã¦ã„ã¾ã™ã€‚MediaWiki ã® ResourceLoader コンãƒãƒ¼ãƒãƒ³ãƒˆã¯ã“ã®åˆ¶é™ã‚’回é¿ã—ã¾ã™ãŒã€ãƒ‘フォーマンスã¯ä½Žä¸‹ã—ã¾ã™ã€‚å¯èƒ½ãªé™ã‚Šã€php.ini 㧠suhosin.get.max_value_length ã‚’ 1024 以上ã«è¨­å®šã—ã€åŒã˜å€¤ã‚’ LocalSettings.php 中㧠$wgResourceLoaderMaxQueryLength ã«è¨­å®šã—ã¦ãã ã•ã„。',
+ 'config-suhosin-max-value-length' => 'Suhosin ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ãŠã‚Šã€GET パラメーター㮠<code>length</code> ã‚’ $1 ãƒã‚¤ãƒˆã«åˆ¶é™ã—ã¦ã„ã¾ã™ã€‚
+MediaWiki ã® ResourceLoader コンãƒãƒ¼ãƒãƒ³ãƒˆã¯ã“ã®åˆ¶é™ã‚’回é¿ã—ã¾ã™ãŒã€ãƒ‘フォーマンスã¯ä½Žä¸‹ã—ã¾ã™ã€‚
+å¯èƒ½ãªé™ã‚Šã€<code>php.ini</code> 㧠<code>suhosin.get.max_value_length</code> ã‚’ 1024 以上ã«è¨­å®šã—ã€åŒã˜å€¤ã‚’ <code>LocalSettings.php</code> 内㧠<code>$wgResourceLoaderMaxQueryLength</code> ã«è¨­å®šã—ã¦ãã ã•ã„。',
'config-db-type' => 'データベースã®ç¨®é¡ž:',
'config-db-host' => 'データベースã®ãƒ›ã‚¹ãƒˆ:',
'config-db-host-help' => 'ç•°ãªã‚‹ã‚µãƒ¼ãƒãƒ¼ä¸Šã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ãŒã‚ã‚‹å ´åˆã€ãƒ›ã‚¹ãƒˆåã¾ãŸã¯IPアドレスをã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。
@@ -9831,9 +10170,11 @@ PostgreSQLを使用ã—ã¦ã„ã‚‹å ´åˆã€UNIXソケットã§æŽ¥ç¶šã™ã‚‹ã«ã¯ã“
'config-db-username' => 'データベースã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å:',
'config-db-password' => 'データベースã®ãƒ‘スワード:',
'config-db-password-empty' => 'æ–°ã—ã„データベースã®åˆ©ç”¨è€…å $1 ã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。
-パスワードを設定ã—ãªã„ã§ãƒ¦ãƒ¼ã‚¶ã‚’作るã“ã¨ã‚‚ã§ãã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ãŒã€å®‰å…¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“。',
- 'config-db-install-username' => 'インストール中ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã«ä½¿ã†ãƒ¦ãƒ¼ã‚¶åを入力ã—ã¦ãã ã•ã„。ã“れ㯠MediaWiki アカウントã®ãƒ¦ãƒ¼ã‚¶å (利用者å) ã®ã“ã¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã‚ãªãŸã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã®ãƒ¦ãƒ¼ã‚¶åã§ã™ã€‚',
- 'config-db-install-password' => 'インストール中ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã«ä½¿ã†ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。ã“れ㯠MediaWiki アカウントパスワードã®ã“ã¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã‚ãªãŸã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã®ãƒ‘スワードã§ã™ã€‚',
+パスワードを設定ã›ãšã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’作æˆã§ãã‚‹å ´åˆã‚‚ã‚ã‚Šã¾ã™ãŒã€å®‰å…¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“。',
+ 'config-db-install-username' => 'インストール中ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¸ã®æŽ¥ç¶šã§ä½¿ç”¨ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼åを入力ã—ã¦ãã ã•ã„。
+ã“れ㯠MediaWiki アカウントã®åˆ©ç”¨è€…åã®ã“ã¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã‚ãªãŸã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã§ã™ã€‚',
+ 'config-db-install-password' => 'インストール中ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¸ã®æŽ¥ç¶šã§ä½¿ç”¨ã™ã‚‹ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。
+ã“れ㯠MediaWiki アカウントã®ãƒ‘スワードã®ã“ã¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã‚ãªãŸã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã®ãƒ‘スワードã§ã™ã€‚',
'config-db-install-help' => 'インストール作業中ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã®åˆ©ç”¨è€…åã¨ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。',
'config-db-account-lock' => 'インストール作業終了後もåŒã˜åˆ©ç”¨è€…åã¨ãƒ‘スワードを使用ã™ã‚‹',
'config-db-wiki-account' => 'インストール作業終了後ã®åˆ©ç”¨è€…アカウント',
@@ -9859,6 +10200,7 @@ PostgreSQLを使用ã—ã¦ã„ã‚‹å ´åˆã€UNIXソケットã§æŽ¥ç¶šã™ã‚‹ã«ã¯ã“
'config-db-schema' => 'MediaWiki ã®ã‚¹ã‚­ãƒ¼ãƒž:',
'config-db-schema-help' => '通常ã¯ã“ã®ã‚¹ã‚­ãƒ¼ãƒžã§å•é¡Œã‚ã‚Šã¾ã›ã‚“。
å¿…è¦ãªå ´åˆã®ã¿å¤‰æ›´ã—ã¦ãã ã•ã„。',
+ 'config-pg-test-error' => "データベース '''$1''' ã«æŽ¥ç¶šã§ãã¾ã›ã‚“: $2",
'config-sqlite-dir' => 'SQLite データ ディレクトリ:',
'config-sqlite-dir-help' => "SQLite ã¯å˜ä¸€ã®ãƒ•ã‚¡ã‚¤ãƒ«å†…ã«ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ã‚’æ ¼ç´ã—ã¦ã„ã¾ã™ã€‚
@@ -9876,22 +10218,19 @@ PostgreSQLを使用ã—ã¦ã„ã‚‹å ´åˆã€UNIXソケットã§æŽ¥ç¶šã™ã‚‹ã«ã¯ã“
'config-type-postgres' => 'PostgreSQL',
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki ã¯ä»¥ä¸‹ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ システムã«å¯¾å¿œã—ã¦ã„ã¾ã™:
$1
使用ã—よã†ã¨ã—ã¦ã„るデータベース システムãŒä¸‹è¨˜ã®ä¸€è¦§ã«ãªã„å ´åˆã¯ã€ä¸Šè¨˜ãƒªãƒ³ã‚¯å…ˆã®æ‰‹é †ã«å¾“ã£ã¦ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„。',
- 'config-support-mysql' => '* $1ã¯MediaWikiã®ä¸»è¦ãªå¯¾è±¡ã§ã€ã‚‚ã£ã¨ã‚‚サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ï¼ˆ[http://www.php.net/manual/en/mysql.installation.php MySQLã®ã‚µãƒãƒ¼ãƒˆä¸‹ã§PHPをコンパイルã™ã‚‹æ–¹æ³•])',
- 'config-support-postgres' => '* $1ã¯ã€MySQLã®ä»£æ›¿ã¨ã—ã¦ã€äººæ°—ã®ã‚るオープンソースデータベースシステムã§ã™ï¼ˆ[http://www.php.net/manual/en/pgsql.installation.php PostgreSQLã®ã‚µãƒãƒ¼ãƒˆä¸‹ã§PHPをコンパイルã™ã‚‹æ–¹æ³•])',
- 'config-support-sqlite' => '* $1ã¯ã€è‰¯ãサãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹ã€è»½é‡ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã§ã™ã€‚([http://www.php.net/manual/en/pdo.installation.php SQLiteã®ã‚µãƒãƒ¼ãƒˆä¸‹ã§PHPをコンパイルã™ã‚‹æ–¹æ³•]ã€PDOを使用)',
- 'config-support-oracle' => '* $1ã¯å•†æ¥­ä¼æ¥­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã™ã€‚([http://www.php.net/manual/en/oci8.installation.php OCI8サãƒãƒ¼ãƒˆãªPHPをコンパイルã™ã‚‹æ–¹æ³•])',
- 'config-support-ibm_db2' => '* $1 ã¯å•†æ¥­ä¼æ¥­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã™ã€‚',
+ 'config-support-mysql' => '* $1ã¯MediaWikiã®ä¸»è¦ãªå¯¾è±¡ã§ã‚ã‚Šã€æœ€ã‚‚サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ ([http://www.php.net/manual/en/mysql.installation.php MySQLã«å¯¾å¿œã—ãŸPHPをコンパイルã™ã‚‹æ–¹æ³•])',
+ 'config-support-postgres' => '* $1ã¯ã€MySQLã®ä»£æ›¿ã¨ã—ã¦äººæ°—ãŒã‚るオープンソースã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã§ã™ ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQLã«å¯¾å¿œã—ãŸPHPをコンパイルã™ã‚‹æ–¹æ³•])',
+ 'config-support-sqlite' => '* $1ã¯ã€è‰¯ãサãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹ã€è»½é‡ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã§ã™ã€‚([http://www.php.net/manual/ja/pdo.installation.php SQLiteã«å¯¾å¿œã—ãŸPHPをコンパイルã™ã‚‹æ–¹æ³•]ã€PDOを使用)',
+ 'config-support-oracle' => '* $1ã¯å•†æ¥­ä¼æ¥­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã™ã€‚([http://www.php.net/manual/en/oci8.installation.php OCI8サãƒãƒ¼ãƒˆãªPHPをコンパイルã™ã‚‹æ–¹æ³•])',
'config-header-mysql' => 'MySQL ã®è¨­å®š',
'config-header-postgres' => 'PostgreSQL ã®è¨­å®š',
'config-header-sqlite' => 'SQLite ã®è¨­å®š',
'config-header-oracle' => 'Oracle ã®è¨­å®š',
- 'config-header-ibm_db2' => 'IBM DB2 ã®è¨­å®š',
'config-invalid-db-type' => '無効ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ç¨®é¡ž',
'config-missing-db-name' => '「データベースåã€ã‚’入力ã—ã¦ãã ã•ã„',
'config-missing-db-host' => '「データベースã®ãƒ›ã‚¹ãƒˆã€ã‚’入力ã—ã¦ãã ã•ã„',
@@ -9904,7 +10243,7 @@ $1
アスキー英字(a-z, A-Z)ã€æ•°å­—(0-9)ã€ä¸‹ç·š(_)ã€ãƒã‚¤ãƒ•ãƒ³(-)ã®ã¿ã‚’使用ã—ã¦ãã ã•ã„。',
'config-connection-error' => '$1。
-以下ã®ãƒ›ã‚¹ãƒˆåã€ãƒ¦ãƒ¼ã‚¶åã€ãƒ‘スワードをãƒã‚§ãƒƒã‚¯ã—ã¦ã€å†åº¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。',
+以下ã®ãƒ›ã‚¹ãƒˆåã€ãƒ¦ãƒ¼ã‚¶ãƒ¼åã€ãƒ‘スワードを確èªã—ã¦ã‹ã‚‰å†åº¦è©¦ã—ã¦ãã ã•ã„。',
'config-invalid-schema' => '「$1ã€ã¯ MediaWiki ã®ã‚¹ã‚­ãƒ¼ãƒžã¨ã—ã¦ç„¡åŠ¹ã§ã™ã€‚
ASCII ã®è‹±æ•°å­— (a-zã€A-Zã€0-9)ã€ä¸‹ç·š (_) ã®ã¿ã‚’使用ã—ã¦ãã ã•ã„。',
'config-postgres-old' => 'PostgreSQL $1 以é™ãŒå¿…è¦ã§ã™ã€‚ã”使用中㮠PostgreSQL 㯠$2 ã§ã™ã€‚',
@@ -9951,8 +10290,8 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'アップグレードãŒå®Œäº†ã—ã¾ã—ãŸã€‚
[$1 ウィキã®ä½¿ç”¨ã‚’開始]ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚',
- 'config-regenerate' => 'LocalSettings.phpã‚’å†ç”Ÿæˆâ†’',
- 'config-show-table-status' => 'SHOW TABLE STATUSクエリーãŒå¤±æ•—ã—ã¾ã—ãŸï¼',
+ 'config-regenerate' => '<code>LocalSettings.php</code> ã‚’å†ç”Ÿæˆâ†’',
+ 'config-show-table-status' => '<code>SHOW TABLE STATUS</code> クエリãŒå¤±æ•—ã—ã¾ã—ãŸ!',
'config-unknown-collation' => "'''警告:''' データベースã¯èªè­˜ã•ã‚Œãªã„ç…§åˆã‚’使用ã—ã¦ã„ã¾ã™ã€‚",
'config-db-web-account' => 'ウェブアクセスã®ãŸã‚ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ',
'config-db-web-help' => 'ウィキã®é€šå¸¸ã®æ“作ã®éš›ã«ã€ã‚¦ã‚§ãƒ– サーãƒãƒ¼ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ サーãƒãƒ¼ã«æŽ¥ç¶šã§ãるよã†ã«ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ãƒ‘スワードを指定ã—ã¦ãã ã•ã„。',
@@ -9967,7 +10306,7 @@ chmod a+w $3</pre>',
'''MyISAM'''ã¯ã€åˆ©ç”¨è€…ãŒ1人ã®å ´åˆã€ã‚ã‚‹ã„ã¯èª­ã¿è¾¼ã¿å°‚用ã§ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹å ´åˆã«ã€ã‚ˆã‚Šå‡¦ç†ãŒæ—©ããªã‚‹ã§ã—ょã†ã€‚
ãŸã ã—ã€MyISAMã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯ã€InnoDBより高頻度ã§ç ´æã™ã‚‹å‚¾å‘ãŒã‚ã‚Šã¾ã™ã€‚",
- 'config-mysql-charset' => 'データベースã®æ–‡å­—セット:',
+ 'config-mysql-charset' => 'データベースã®æ–‡å­—セット:',
'config-mysql-binary' => 'ãƒã‚¤ãƒŠãƒª',
'config-mysql-utf8' => 'UTF-8',
'config-mysql-charset-help' => "'''ãƒã‚¤ãƒŠãƒª モード'''ã§ã¯ã€MediaWiki ã¯ã€UTF-8 テキストをデータベースã®ãƒã‚¤ãƒŠãƒª フィールドã«æ ¼ç´ã—ã¾ã™ã€‚
@@ -9984,49 +10323,50 @@ chmod a+w $3</pre>',
'config-ns-other' => 'ãã®ä»– (指定ã—ã¦ãã ã•ã„)',
'config-ns-other-default' => 'マイウィキ',
'config-project-namespace-help' => "ウィキペディアã®ä¾‹ã«å¾“ã„ã€å¤šãã®ã‚¦ã‚£ã‚­ã¯ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ãƒšãƒ¼ã‚¸ã¨ã¯åˆ†é›¢ã—ãŸãƒãƒªã‚·ãƒ¼ãƒšãƒ¼ã‚¸ã‚’「'''プロジェクトã®åå‰ç©ºé–“'''ã€ã«æŒã£ã¦ã„ã¾ã™ã€‚
-ã“ã®åå‰ç©ºé–“ã®ãƒšãƒ¼ã‚¸ã®ã‚¿ã‚¤ãƒˆãƒ«ã¯ã™ã¹ã¦ã€ã‚る接頭辞ã§å§‹ã¾ã‚Šã¾ã™ã€‚ãれをã“ã“ã§æŒ‡å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
-ã“ã®æŽ¥é ­è¾žã¯ã‚¦ã‚£ã‚­ã®åå‰ã«ç”±æ¥ã™ã‚‹ã®ãŒä¼çµ±çš„ã§ã™ãŒã€ã€Œ#ã€ã‚„「:ã€ã®ã‚ˆã†ãªåŒºåˆ‡ã‚Šæ–‡å­—ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。",
- 'config-ns-invalid' => '"<nowiki>$1</nowiki>"ã®ã‚ˆã†ã«æŒ‡å®šã•ã‚ŒãŸåå‰ç©ºé–“ã¯ç„¡åŠ¹ã§ã™ã€‚
-é•ã†ãƒ—ロジェクトåå‰ç©ºé–“を指定ã—ã¦ãã ã•ã„。',
+ã“ã®åå‰ç©ºé–“内ã®ãƒšãƒ¼ã‚¸ã®ãƒšãƒ¼ã‚¸åã¯ã™ã¹ã¦ç‰¹å®šã®æŽ¥é ­è¾žã§å§‹ã¾ã‚Šã¾ã™ã€‚ãれをã“ã“ã§æŒ‡å®šã§ãã¾ã™ã€‚
+通常ã€ã“ã®æŽ¥é ­è¾žã¯ã‚¦ã‚£ã‚­åã«åŸºã¥ãã¾ã™ãŒã€ã€Œ#ã€ã‚„「:ã€ã®ã‚ˆã†ãªåŒºåˆ‡ã‚Šæ–‡å­—ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。",
+ 'config-ns-invalid' => '指定ã—ãŸåå‰ç©ºé–“「<nowiki>$1</nowiki>ã€ã¯ç„¡åŠ¹ã§ã™ã€‚
+別ã®ãƒ—ロジェクトåå‰ç©ºé–“を指定ã—ã¦ãã ã•ã„。',
'config-admin-box' => '管ç†ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ',
'config-admin-name' => 'åå‰:',
'config-admin-password' => 'パスワード:',
'config-admin-password-confirm' => 'パスワードã®å†å…¥åŠ›:',
- 'config-admin-help' => '希望ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚’ã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„ (例: "Joe Bloggs")。
+ 'config-admin-help' => '希望ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚’ã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„ (例:「Joe Bloggsã€)。
ã“ã®åå‰ã§ã“ã®ã‚¦ã‚£ã‚­ã«ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚',
- 'config-admin-name-blank' => '管ç†è€…ã®ãƒ¦ãƒ¼ã‚¶åを入力ã—ã¦ãã ã•ã„。',
- 'config-admin-name-invalid' => '指定ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶å "<nowiki>$1</nowiki>" ã¯ç„¡åŠ¹ã§ã™ã€‚
-別ã®ãƒ¦ãƒ¼ã‚¶åを指定ã—ã¦ãã ã•ã„。',
+ 'config-admin-name-blank' => '管ç†è€…ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åを入力ã—ã¦ãã ã•ã„。',
+ 'config-admin-name-invalid' => '指定ã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼å「<nowiki>$1</nowiki>ã€ã¯ç„¡åŠ¹ã§ã™ã€‚
+別ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åを指定ã—ã¦ãã ã•ã„。',
'config-admin-password-blank' => '管ç†è€…アカウントã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。',
- 'config-admin-password-same' => 'ユーザåã¨åŒã˜ãƒ‘スワードã¯ä½¿ãˆã¾ã›ã‚“。',
+ 'config-admin-password-same' => 'ユーザーåã¨åŒã˜ãƒ‘スワードã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。',
'config-admin-password-mismatch' => '入力ã•ã‚ŒãŸ2ã¤ã®ãƒ‘スワードãŒä¸€è‡´ã—ã¾ã›ã‚“。',
'config-admin-email' => 'メールアドレス:',
'config-admin-email-help' => 'メールアドレスを入力ã—ã¦ãã ã•ã„。他ã®åˆ©ç”¨è€…ã‹ã‚‰ã®ãƒ¡ãƒ¼ãƒ«ã®å—ã‘å–ã‚Šã€ãƒ‘スワードã®ãƒªã‚»ãƒƒãƒˆã€ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã«ç™»éŒ²ã—ãŸãƒšãƒ¼ã‚¸ã®æ›´æ–°é€šçŸ¥ã«ä½¿ç”¨ã—ã¾ã™ã€‚空欄ã®ã¾ã¾ã«ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚',
- 'config-admin-error-user' => '"<nowiki>$1</nowiki>"ã¨ã„ã†åå‰ã®ç®¡ç†è€…を作æˆã™ã‚‹éš›ã«å†…部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
- 'config-admin-error-password' => '管ç†è€…"<nowiki>$1</nowiki>"ã®ãƒ‘スワードを設定ã™ã‚‹éš›ã«å†…部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸ: <pre>$2</pre>',
+ 'config-admin-error-user' => '「<nowiki>$1</nowiki>ã€ã¨ã„ã†åå‰ã®ç®¡ç†è€…を作æˆã™ã‚‹éš›ã«å†…部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
+ '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' => 'ã“ã‚Œã¯ã€ãƒªãƒªãƒ¼ã‚¹ã®å‘ŠçŸ¥ï¼ˆé‡è¦ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã«é–¢ã™ã‚‹æ¡ˆå†…ã‚’å«ã‚€ï¼‰ã«ä½¿ã‚れるã€ä½Žå®¹é‡ã®ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆã§ã™ã€‚
+ 'config-subscribe-help' => 'ã“ã‚Œã¯ã€ãƒªãƒªãƒ¼ã‚¹ã®å‘ŠçŸ¥ (é‡è¦ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã«é–¢ã™ã‚‹æ¡ˆå†…ã‚’å«ã‚€) ã«ä½¿ç”¨ã•ã‚Œã‚‹ã€æµé‡ãŒå°‘ãªã„メーリングリストã§ã™ã€‚
ã“ã®ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆã‚’購読ã—ã¦ã€æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå‡ºãŸå ´åˆã«MediaWikiã‚’æ›´æ–°ã—ã¦ãã ã•ã„。',
- 'config-almost-done' => 'ã“ã‚Œã§ã»ã¼çµ‚ã‚ã‚Šã¾ã—ãŸï¼
-残りã®è¨­å®šã‚’飛ã°ã—ã¦ã€ä»Šã™ãã«ã‚¦ã‚£ã‚­ã‚’インストールã§ãã¾ã™ã€‚',
+ 'config-almost-done' => 'ã“ã‚Œã§ã»ã¼çµ‚ã‚ã‚Šã¾ã—ãŸ!
+残りã®è¨­å®šã‚’飛ã°ã—ã¦ã€ã‚¦ã‚£ã‚­ã‚’今ã™ãインストールã§ãã¾ã™ã€‚',
'config-optional-continue' => 'ç§ã«ã‚‚ã£ã¨è³ªå•ã—ã¦ãã ã•ã„。',
'config-optional-skip' => 'ã‚‚ã†é£½ãã¦ã—ã¾ã£ãŸã®ã§ã€ã¨ã«ã‹ãウィキをインストールã—ã¦ãã ã•ã„。',
'config-profile' => '利用者権é™ã®ãƒ—ロファイル:',
- 'config-profile-wiki' => 'ä¼çµ±çš„ãªã‚¦ã‚£ã‚­',
+ 'config-profile-wiki' => 'ä¼çµ±çš„ãªã‚¦ã‚£ã‚­', # Fuzzy
'config-profile-no-anon' => 'アカウントã®ä½œæˆãŒå¿…è¦',
'config-profile-fishbowl' => '承èªã•ã‚ŒãŸç·¨é›†è€…ã®ã¿',
'config-profile-private' => 'éžå…¬é–‹ã‚¦ã‚£ã‚­',
- 'config-profile-help' => "ウィキã¯ã€ãŸãã•ã‚“ã®äººãŒå¯èƒ½ãªé™ã‚Šãã®ã‚¦ã‚£ã‚­ã‚’編集ã§ãã‚‹ã¨ãã€æœ€ã‚‚優れãŸåƒãã‚’ã—ã¾ã™ã€‚
-MediaWikiã§ã¯ã€æœ€è¿‘ã®æ›´æ–°ã‚’確èªã—ã€ç¥žçµŒè³ªãªã€ã‚‚ã—ãã¯æ‚ªæ„ã‚’æŒã£ãŸåˆ©ç”¨è€…ã‹ã‚‰ã®æ害を差ã—戻ã™ã“ã¨ãŒã€ç°¡å˜ã«ã§ãã¾ã™ã€‚
+ 'config-profile-help' => "ウィキã¯ã€ã§ãã‚‹ã ã‘多ãã®äººãŒç·¨é›†ã§ãるよã†ã«ã™ã‚‹ã¨æœ€ã‚‚優れãŸåƒãã‚’ã—ã¾ã™ã€‚
+MediaWikiã§ã¯ã€æœ€è¿‘ã®æ›´æ–°ã‚’確èªã—ã‚„ã™ãã€ç¥žçµŒè³ªãªã€ã¾ãŸã¯æ‚ªæ„ã‚’æŒã£ãŸåˆ©ç”¨è€…ã‹ã‚‰ã®æ害を簡å˜ã«å·®ã—戻ã›ã¾ã™ã€‚
ã—ã‹ã—一方ã§ã€MediaWikiã¯ã€ã•ã‚‰ã«ã•ã¾ã–ã¾ãªå½¢æ…‹ã§ã®åˆ©ç”¨ã‚‚優れã¦ã„ã‚‹ã¨è¨€ã‚ã‚Œã¦ã„ã¾ã™ã€‚ã¾ãŸã€æ™‚ã«ã¯ã€ã™ã¹ã¦ã®äººã«ã‚¦ã‚£ã‚­æ‰‹æ³•ã®åˆ©ç‚¹ã‚’説得ã•ã›ã‚‹ã®ã¯å®¹æ˜“ã§ã¯ãªã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
ãã“ã§ã€é¸æŠžè‚¢ãŒã‚ã‚Šã¾ã™ã€‚
-'''{{int:config-profile-wiki}}'''ã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ã—ãªãã¦ã‚‚ã€èª°ã§ã‚‚編集ã§ãã‚‹ã‚‚ã®ã§ã™ã€‚
-'''{{int:config-profile-no-anon}}'''ãªã‚¦ã‚£ã‚­ã¯ã€å„編集ã«å¯¾ã—ã¦ã‚ˆã‚Šå¼·ã„説明責任を付与ã—ã¾ã™ãŒã€æ°—軽ãªæŠ•ç¨¿ã‚’阻害ã™ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+「'''{{int:config-profile-wiki}}'''ã€ãƒ¢ãƒ‡ãƒ«ã§ã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ã—ãªãã¦ã‚‚ã€èª°ã§ã‚‚編集ã§ãã¾ã™ã€‚
+「'''{{int:config-profile-no-anon}}'''ã€ãªã‚¦ã‚£ã‚­ã§ã¯ã€å„編集ã«å¯¾ã—ã¦ã‚ˆã‚Šå¼·ã„説明責任を付与ã—ã¾ã™ãŒã€æ°—軽ãªæŠ•ç¨¿ã‚’阻害ã™ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
-'''{{int:config-profile-fishbowl}}'''ã®ã‚¦ã‚£ã‚­ã¯ã€æ‰¿èªã•ã‚ŒãŸåˆ©ç”¨è€…ãŒç·¨é›†ã§ãã€ä¸€æ–¹ã€ä¸€èˆ¬ã®äººã¯ãƒšãƒ¼ã‚¸ï¼ˆã¨ãã®å±¥æ­´ï¼‰ã‚’閲覧ã§ãã¾ã™ã€‚
-'''{{int:config-profile-private}}'''ã¯ã€æ‰¿èªã•ã‚ŒãŸåˆ©ç”¨è€…ã®ã¿ãŒãƒšãƒ¼ã‚¸ã‚’閲覧ã§ãã€ãã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒç·¨é›†ã§ãã¾ã™ã€‚
+「'''{{int:config-profile-fishbowl}}'''ã€ã‚·ãƒŠãƒªã‚ªã§ã¯ã€æ‰¿èªã•ã‚ŒãŸåˆ©ç”¨è€…ã®ã¿ãŒç·¨é›†ã§ãã€ä¸€èˆ¬ã®äººã¯ãƒšãƒ¼ã‚¸ (ã¨ãã®å±¥æ­´) を閲覧ã§ãã¾ã™ã€‚
+「'''{{int:config-profile-private}}'''ã€ã§ã¯ã€æ‰¿èªã•ã‚ŒãŸåˆ©ç”¨è€…ã®ã¿ãŒãƒšãƒ¼ã‚¸ã‚’閲覧ã§ãã€ãã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒç·¨é›†ã§ãã¾ã™ã€‚
より複雑ãªåˆ©ç”¨è€…権é™ã®è¨­å®šã¯ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«å¾Œã«è¨­å®šã§ãã¾ã™ã€‚詳細ã¯[//www.mediawiki.org/wiki/Manual:User_rights 関連ã™ã‚‹ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«]ã‚’ã”覧ãã ã•ã„。",
'config-license' => '著作権ã¨ãƒ©ã‚¤ã‚»ãƒ³ã‚¹:',
@@ -10037,23 +10377,23 @@ MediaWikiã§ã¯ã€æœ€è¿‘ã®æ›´æ–°ã‚’確èªã—ã€ç¥žçµŒè³ªãªã€ã‚‚ã—ãã¯æ‚ªæ„
'config-license-gfdl' => 'GNU フリー文書利用許諾契約書 1.3 以é™',
'config-license-pd' => 'パブリック・ドメイン',
'config-license-cc-choose' => 'ãã®ä»–ã®ã‚¯ãƒªã‚¨ã‚¤ãƒ†ã‚£ãƒ–・コモンズ・ライセンスをé¸æŠžã™ã‚‹',
- 'config-license-help' => "多ãã®å…¬é–‹ã‚¦ã‚£ã‚­ã§ã¯ã€ã™ã¹ã¦ã®å¯„稿物ãŒ[http://freedomdefined.org/Definition フリーライセンス]ã®å…ƒã«ç½®ã‹ã‚Œã¦ã„ã¾ã™ã€‚
+ 'config-license-help' => "多ãã®å…¬é–‹ã‚¦ã‚£ã‚­ã§ã¯ã€ã™ã¹ã¦ã®å¯„稿物ãŒ[http://freedomdefined.org/Definition フリーライセンス]ã®ã‚‚ã¨ã«ç½®ã‹ã‚Œã¦ã„ã¾ã™ã€‚
ã“ã†ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã«ã‚ˆã‚‹å…±æœ‰ã®æ„Ÿè¦šãŒç”Ÿã¾ã‚Œã€é•·æœŸçš„ãªå¯„稿ãŒä¿ƒã•ã‚Œã¾ã™ã€‚
ç§çš„ウィキやä¼æ¥­ã®ã‚¦ã‚£ã‚­ã§ã¯ã€é€šå¸¸ã€ãƒ•ãƒªãƒ¼ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã«ã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。
ウィキペディアã«ã‚るテキストをã‚ãªãŸã®ã‚¦ã‚£ã‚­ã§åˆ©ç”¨ã—ã€é€†ã«ã‚ãªãŸã®ã‚¦ã‚£ã‚­ã«ã‚るテキストをウィキペディアã«è¤‡è£½ã™ã‚‹ã“ã¨ã‚’許å¯ã—ãŸã„å ´åˆã«ã¯ã€'''クリエイティブ・コモンズ 表示-継承'''ã‚’é¸æŠžã™ã‚‹ã¹ãã§ã™ã€‚
ウィキペディアã¯ä»¥å‰ã€GNUフリー文書利用許諾契約書(GFDL)を使用ã—ã¦ã„ã¾ã—ãŸã€‚
-GFDL ã¯æœ‰åŠ¹ãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§ã™ãŒã€å†…容をç†è§£ã™ã‚‹ã®ã¯å›°é›£ã§ã™ã€‚
-ã¾ãŸã€GFDL ã®å…ƒã«ç½®ã‹ã‚Œã¦ã„るコンテンツã®å†åˆ©ç”¨ã‚‚困難ã§ã™ã€‚",
+GFDLã¯æœ‰åŠ¹ãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§ã™ãŒã€å†…容をç†è§£ã™ã‚‹ã®ã¯å›°é›£ã§ã™ã€‚
+ã¾ãŸã€GFDLã®ã‚‚ã¨ã«ç½®ã‹ã‚Œã¦ã„るコンテンツã®å†åˆ©ç”¨ã‚‚困難ã§ã™ã€‚",
'config-email-settings' => 'メールã®è¨­å®š',
'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-user-help' => '設定ã§æœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã€ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒãŠäº’ã„ã«ãƒ¡ãƒ¼ãƒ«ã®ã‚„ã‚Šã¨ã‚Šã‚’è¡Œã†ã“ã¨ã‚’許å¯ã™ã‚‹ã€‚',
+ 'config-email-usertalk' => 'ユーザーã®ãƒˆãƒ¼ã‚¯ãƒšãƒ¼ã‚¸ã§ã®é€šçŸ¥ã‚’有効ã«ã™ã‚‹',
+ 'config-email-usertalk-help' => '設定ã§æœ‰åŠ¹ã«ã—ã¦ã„ã‚‹å ´åˆã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒˆãƒ¼ã‚¯ãƒšãƒ¼ã‚¸ã®å¤‰æ›´ã®é€šçŸ¥ã‚’å—ã‘ã‚‹ã“ã¨ã‚’ユーザーã«è¨±å¯ã™ã‚‹ã€‚',
'config-email-watchlist' => 'ウォッãƒãƒªã‚¹ãƒˆã®é€šçŸ¥ã‚’有効ã«ã™ã‚‹',
'config-email-watchlist-help' => '利用者ãŒè¨­å®šã§æœ‰åŠ¹ã«ã—ã¦ã„ã‚‹å ´åˆã€é–²è¦§ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã«é–¢ã™ã‚‹é€šçŸ¥ã‚’å—ã‘å–ã‚‹ã“ã¨ã‚’許å¯ã™ã‚‹ã€‚',
'config-email-auth' => 'メールã®èªè¨¼ã‚’有効ã«ã™ã‚‹',
@@ -10094,8 +10434,8 @@ GFDL ã¯æœ‰åŠ¹ãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§ã™ãŒã€å†…容をç†è§£ã™ã‚‹ã®ã¯å›°é›£ã§
中〜大è¦æ¨¡ã‚µã‚¤ãƒˆã§ã¯ã“れを有効ã«ã™ã‚‹ã“ã¨ã‚’å¼·ããŠå‹§ã‚ã—ã¾ã™ã€‚å°è¦æ¨¡ã‚µã‚¤ãƒˆã§ã‚‚åŒæ§˜ã«åŠ¹æžœãŒã‚ã‚Šã¾ã™ã€‚',
'config-cache-none' => 'キャッシングã—ãªã„(機能ã¯å–り払ã‚ã‚Œã¾ã™ã€ã—ã‹ã‚‚より大ããªã‚¦ã‚£ã‚­ã‚µã‚¤ãƒˆä¸Šã§ã‚¹ãƒ”ードã®å•é¡ŒãŒç™ºç”Ÿã—ã¾ã™)',
'config-cache-accel' => 'PHP オブジェクト キャッシュ (APCã€XCacheã€WinCache ã®ã„ãšã‚Œã‹)',
- 'config-cache-memcached' => 'Memcachedを使用(追加ã®è¨­å®šãŒå¿…è¦ã§ã™ï¼‰',
- 'config-memcached-servers' => 'メモリをキャッシュã•ã‚ŒãŸã‚µãƒ¼ãƒ:',
+ 'config-cache-memcached' => 'memcached を使用 (追加ã®è¨­å®šãŒå¿…è¦)',
+ 'config-memcached-servers' => 'memcached サーãƒãƒ¼:',
'config-memcached-help' => 'Memcachedを使用ã™ã‚‹IPアドレスã®ä¸€è¦§ã€‚
カンマ区切りã§ã€åˆ©ç”¨ã™ã‚‹ç‰¹å®šã®ãƒãƒ¼ãƒˆã®æŒ‡å®šãŒå¿…è¦ã§ã™ã€‚例:
127.0.0.1:11211
@@ -10107,7 +10447,7 @@ GFDL ã¯æœ‰åŠ¹ãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§ã™ãŒã€å†…容をç†è§£ã™ã‚‹ã®ã¯å›°é›£ã§
'config-install-alreadydone' => "'''警告:''' æ—¢ã«MediaWikiãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ¸ˆã¿ã§ã€å†ã³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ç›´ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
次ã®ãƒšãƒ¼ã‚¸ã¸é€²ã‚“ã§ãã ã•ã„。",
'config-install-begin' => '「{{int:config-continue}}ã€ã‚’押ã™ã¨ã€MediaWiki ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’開始ã§ãã¾ã™ã€‚
-変更ã—ãŸã„設定ãŒã‚ã‚‹å ´åˆã¯ã€ã€Œ{{int:Config-back}}ã€ã‚’押ã—ã¦ãã ã•ã„。',
+変更ã—ãŸã„設定ãŒã‚ã‚‹å ´åˆã¯ã€ã€Œ{{int:config-back}}ã€ã‚’押ã—ã¦ãã ã•ã„。',
'config-install-step-done' => '実行',
'config-install-step-failed' => '失敗ã—ãŸ',
'config-install-extensions' => '拡張機能をå«ã‚€',
@@ -10125,42 +10465,44 @@ GFDL ã¯æœ‰åŠ¹ãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã§ã™ãŒã€å†…容をç†è§£ã™ã‚‹ã®ã¯å›°é›£ã§
'config-install-user-missing-create' => '指定ã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã€Œ$1ã€ã¯å­˜åœ¨ã—ã¾ã›ã‚“。
アカウントを作æˆã™ã‚‹å ´åˆã¯ã€ä¸‹ã®ã€Œã‚¢ã‚«ã‚¦ãƒ³ãƒˆä½œæˆã€ã‚’クリックã—ã¦ãã ã•ã„。',
'config-install-tables' => 'テーブルã®ä½œæˆ',
- 'config-install-tables-exist' => "'''警告''':MediaWikiテーブルã¯æ—¢ã«å­˜åœ¨ã™ã‚‹ã‚ˆã†ã§ã™ã€‚
-作æˆã‚’飛ã°ã—ã¾ã™ã€‚",
- 'config-install-tables-failed' => "'''エラー''': テーブルã®ä½œæˆãŒã€ä»¥ä¸‹ã®ã‚¨ãƒ©ãƒ¼ã«ã‚ˆã‚Šå¤±æ•—ã—ã¾ã—ãŸ: $1",
+ 'config-install-tables-exist' => "'''警告:''' MediaWiki テーブルã¯æ—¢ã«å­˜åœ¨ã™ã‚‹ã‚ˆã†ã§ã™ã€‚
+作æˆã‚’çœç•¥ã—ã¾ã™ã€‚",
+ 'config-install-tables-failed' => "'''エラー:''' テーブルã®ä½œæˆãŒã€ä»¥ä¸‹ã®ã‚¨ãƒ©ãƒ¼ã«ã‚ˆã‚Šå¤±æ•—ã—ã¾ã—ãŸ: $1",
'config-install-interwiki' => '既定ã®ã‚¦ã‚£ã‚­é–“テーブルã®å°Žå…¥',
'config-install-interwiki-list' => 'ファイル <code>interwiki.list</code> ã‹ã‚‰èª­ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚',
- 'config-install-interwiki-exists' => "'''警告''':ウィキ間テーブルã¯æ—¢ã«ç™»éŒ²ã•ã‚Œã¦ã„るよã†ã§ã™ã€‚
+ 'config-install-interwiki-exists' => "'''警告:''' ウィキ間テーブルã¯æ—¢ã«ç™»éŒ²ã•ã‚Œã¦ã„るよã†ã§ã™ã€‚
既定ã®ãƒ†ãƒ¼ãƒ–ルを無視ã—ã¾ã™ã€‚",
'config-install-stats' => '統計情報ã®åˆæœŸåŒ–',
'config-install-keys' => '秘密éµã®ç”Ÿæˆ',
'config-install-sysop' => '管ç†è€…ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆ',
'config-install-mainpage' => 'メインページを既定ã®å†…容ã§ä½œæˆ',
'config-install-mainpage-failed' => 'メインページを挿入ã§ãã¾ã›ã‚“ã§ã—ãŸ: $1',
- 'config-install-done' => "'''ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™ï¼'''
+ 'config-install-done' => "'''ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™!'''
MediaWikiã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«æˆåŠŸã—ã¾ã—ãŸã€‚
<code>LocalSettings.php</code>ファイルãŒç”Ÿæˆã•ã‚Œã¾ã—ãŸã€‚
-ã™ã¹ã¦ã®è¨­å®šãŒãã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
+ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã™ã¹ã¦ã®è¨­å®šã‚’å«ã‚“ã§ã„ã¾ã™ã€‚
-ãれをダウンロードã—ã€ã‚¦ã‚£ã‚­ã‚’インストールã—ãŸåŸºæº–ディレクトリ(index.phpã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªï¼‰ã«è¨­ç½®ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ダウンロードã¯è‡ªå‹•çš„ã«é–‹å§‹ã—ã¦ã„ã‚‹ã¯ãšã§ã™ã€‚
+ã“れをダウンロードã—ã¦ã€ã‚¦ã‚£ã‚­ã‚’インストールã—ãŸåŸºæº–ディレクトリ (index.phpã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª) ã«è¨­ç½®ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ダウンロードã¯è‡ªå‹•çš„ã«é–‹å§‹ã•ã‚Œã‚‹ã¯ãšã§ã™ã€‚
-ダウンロードãŒé–‹å§‹ã—ã¦ã„ãªã„å ´åˆã€ã¾ãŸãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚’キャンセルã—ãŸå ´åˆã¯ã€ä¸‹è¨˜ã®ãƒªãƒ³ã‚¯ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚’å†é–‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼š
+ダウンロードãŒé–‹å§‹ã•ã‚Œã¦ã„ãªã„å ´åˆã€ã¾ãŸã¯ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚’キャンセルã—ãŸå ´åˆã¯ã€ä¸‹è¨˜ã®ãƒªãƒ³ã‚¯ã‚’クリックã—ã¦ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚’å†é–‹ã§ãã¾ã™:
$3
-'''注æ„''': ã‚‚ã—ã€ã“れを今ã—ãªã‘ã‚Œã°ã€ã¤ã¾ã‚Šã€ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ダウンロードã›ãšã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’終了ã—ãŸå ´åˆã€ã“ã®ç”Ÿæˆã•ã‚ŒãŸè¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã¯åˆ©ç”¨ã•ã‚Œã¾ã›ã‚“。
+'''注æ„:''' ã“ã®ç”Ÿæˆã•ã‚ŒãŸè¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’ダウンロードã›ãšã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’終了ã™ã‚‹ã¨ã€ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯åˆ©ç”¨ã§ããªããªã‚Šã¾ã™ã€‚
-ãれを完了ã™ã‚Œã°ã€'''[$2 ウィキã«å…¥ã‚‹]'''ã“ã¨ãŒã§ãã¾ã™ã€‚",
- 'config-download-localsettings' => 'LocalSettings.php をダウンロード',
+上記ã®ä½œæ¥­ãŒå®Œäº†ã™ã‚‹ã¨ã€'''[$2 ウィキã«å…¥ã‚‹]'''ã“ã¨ãŒã§ãã¾ã™ã€‚",
+ 'config-download-localsettings' => '<code>LocalSettings.php</code> をダウンロード',
'config-help' => 'ヘルプ',
+ 'config-nofile' => 'ファイル「$1ã€ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚削除ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚',
'mainpagetext' => "'''MediaWiki ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«æˆåŠŸã—ã¾ã—ãŸã€‚'''",
'mainpagedocfooter' => 'ウィキソフトウェアã®ä½¿ã„æ–¹ã«é–¢ã™ã‚‹æƒ…å ±ã¯[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]ã‚’å‚ç…§ã—ã¦ãã ã•ã„。
== ã¯ã˜ã‚ã¾ã—ょㆠ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings/ja 設定ã®ä¸€è¦§]
* [//www.mediawiki.org/wiki/Manual:FAQ/ja MediaWiki よãã‚る質å•ã¨å›žç­”]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiリリース情報メーリングリスト]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]
+* [//www.mediawiki.org/wiki/Localisation/ja MediaWiki ã®ã‚ãªãŸã®è¨€èªžã¸ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚º]',
);
/** Jamaican Creole English (Patois)
@@ -10258,7 +10600,8 @@ $messages['ka'] = array(
'config-admin-password-confirm' => 'პáƒáƒ áƒáƒšáƒ˜ ხელმეáƒáƒ áƒ”დ:',
'config-admin-name-blank' => 'შეიყვáƒáƒœáƒ”თ áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი.',
'config-admin-email' => 'ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი:',
- 'config-profile-wiki' => 'ტრáƒáƒ“იციული ვიკი',
+ 'config-profile' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრუფლებების პრáƒáƒ¤áƒ˜áƒšáƒ˜:',
+ 'config-profile-wiki' => 'ღირვიკი',
'config-profile-private' => 'დáƒáƒ®áƒ£áƒ áƒ£áƒšáƒ˜ ვიკი',
'config-license' => 'სáƒáƒáƒ•áƒ¢áƒáƒ áƒ უფლები დრლიცენზიáƒ:',
'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
@@ -10277,7 +10620,8 @@ $messages['ka'] = array(
'config-install-step-done' => 'შესრულდáƒ',
'config-install-step-failed' => 'ვერ მáƒáƒ®áƒ”რხდáƒ',
'config-install-tables' => 'ცხრილების შექმნáƒ',
- 'config-download-localsettings' => 'LocalSettings.php-ის გáƒáƒ“მáƒáƒ¬áƒ”რáƒ',
+ 'config-install-interwiki-list' => 'ვერ მáƒáƒ˜áƒ«áƒ”ბნრფáƒáƒ˜áƒšáƒ˜ <code>interwiki.list</code>.',
+ 'config-download-localsettings' => '<code>LocalSettings.php</code>-ის გáƒáƒ“მáƒáƒ¬áƒ”რáƒ',
'config-help' => 'დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ',
'mainpagetext' => "'''მედიáƒáƒ•áƒ˜áƒ™áƒ˜ წáƒáƒ áƒ›áƒáƒ¢áƒ”ბით ჩáƒáƒ˜áƒ¢áƒ•áƒ˜áƒ áƒ—áƒ.'''",
'mainpagedocfooter' => 'ვიკი პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნების ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის იხილეთ [//meta.wikimedia.org/wiki/Help:Contents მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მეგზური].
@@ -10286,7 +10630,8 @@ $messages['ka'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ©áƒ•áƒ”ნებლების სიáƒ]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce მედიáƒáƒ•áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒ›áƒáƒªáƒ”მის დáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ სიáƒ]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce მედიáƒáƒ•áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒ›áƒáƒªáƒ”მის დáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ სიáƒ]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources მედიáƒáƒ•áƒ˜áƒ™áƒ˜áƒ¡ ლáƒáƒ™áƒáƒšáƒ˜áƒ–ებრთქვენ ენáƒáƒ–ე]',
);
/** Kara-Kalpak (Qaraqalpaqsha)
@@ -10419,24 +10764,24 @@ $messages['kn'] = array(
* @author ì•„ë¼
*/
$messages['ko'] = array(
- 'config-desc' => '미디어위키 설치 마법사',
+ 'config-desc' => '미디어위키 설치 프로그램',
'config-title' => 'MediaWiki $1 설치',
'config-information' => 'ì •ë³´',
- 'config-localsettings-upgrade' => '<code>LocalSettings.php</code> 파ì¼ì´ ê°ì§€ë˜ì—ˆìŠµë‹ˆë‹¤.
+ 'config-localsettings-upgrade' => '<code>LocalSettings.php</code> 파ì¼ì„ ê°ì§€í–ˆìŠµë‹ˆë‹¤.
ì´ ì„¤ì¹˜ë¥¼ 업그레ì´ë“œí•˜ë ¤ë©´ 아래 ìƒìžì— <code>$wgUpgradeKey</code>ì˜ ê°’ì„ ìž…ë ¥í•˜ì„¸ìš”.
-LocalSettings.phpì— ì°¾ìœ¼ì„¸ìš”.',
- 'config-localsettings-cli-upgrade' => 'LocalSettings.php 파ì¼ì´ ê°ì§€ë˜ì—ˆìŠµë‹ˆë‹¤.
-ì´ ì„¤ì¹˜ë¥¼ 업그레ì´ë“œí•˜ë ¤ë©´ update.php를 대신 실행하세요',
+<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' => 'ë¯¸ë””ì–´ìœ„í‚¤ì˜ ê¸°ì¡´ 설치가 ê°ì§€ë˜ì—ˆìŠµë‹ˆë‹¤.
-ì´ ì„¤ì¹˜ë¥¼ 업그레ì´ë“œí•˜ë ¤ë©´ LocalSettings.phpì˜ ì•„ëž˜ì— ë‹¤ìŒ ì¤„ì„ ë„£ìœ¼ì„¸ìš”:
+ì´ ì„¤ì¹˜ë¥¼ 업그레ì´ë“œí•˜ë ¤ë©´ <code>LocalSettings.php</code>ì˜ ì•„ëž˜ì— ë‹¤ìŒ ì¤„ì„ ë„£ìœ¼ì„¸ìš”:
$1',
- 'config-localsettings-incomplete' => '기존 LocalSettings.phpê°€ 완전하지 ì•Šì€ ê²ƒ 같습니다.
+ 'config-localsettings-incomplete' => '기존 <code>LocalSettings.php</code>ê°€ 완전하지 ì•Šì€ ê²ƒ 같습니다.
$1 변수가 설정ë˜ì–´ 있지 않습니다.
-ì´ ë³€ìˆ˜ê°€ 설정ë˜ë„ë¡ LocalSettings.php를 바꾸고 "계ì†"ì„ í´ë¦­í•˜ì„¸ìš”.',
- 'config-localsettings-connection-error' => 'LocalSettings.php ë˜ëŠ” AdminSettings.phpì— ì§€ì •í•œ ì„¤ì •ì„ ì‚¬ìš©í•˜ì—¬ ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í•  ë•Œ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. ì´ëŸ¬í•œ ì„¤ì •ì„ ìˆ˜ì •í•˜ê³  다시 ì‹œë„하세요.
+ì´ ë³€ìˆ˜ê°€ 설정ë˜ë„ë¡ <code>LocalSettings.php</code>를 바꾸고 "{{int:Config-continue}}"ì„ í´ë¦­í•˜ì„¸ìš”.',
+ 'config-localsettings-connection-error' => '<code>LocalSettings.php</code> ë˜ëŠ” <code>AdminSettings.php</code>ì— ì§€ì •í•œ ì„¤ì •ì„ ì‚¬ìš©í•˜ì—¬ ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í•  ë•Œ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. ì´ëŸ¬í•œ ì„¤ì •ì„ ìˆ˜ì •í•˜ê³  다시 ì‹œë„하세요.
$1',
'config-session-error' => '세션 시작 오류: $1',
@@ -10444,12 +10789,12 @@ $1',
ì„¸ì…˜ì€ $1ì˜ ìž‘ë™ ì‹œê°„ ë™ì•ˆ 구성ë©ë‹ˆë‹¤.
php.iniì— ìžˆëŠ” <code>session.gc_maxlifetime</code>ì—ì„œ 설정해 ì´ë¥¼ ì¦ê°€ì‹œí‚¬ 수 있습니다.
설치 ê³¼ì •ì„ ë‹¤ì‹œ 시작합니다.',
- 'config-no-session' => '세션 ë°ì´í„°ê°€ ì†ì‹¤ë˜ì—ˆìŠµë‹ˆë‹¤!
+ 'config-no-session' => '세션 ë°ì´í„°ê°€ 없어졌습니다!
php.ini를 확ì¸í•˜ê³  <code>session.save_path</code>ê°€ ì ì ˆí•œ 디렉토리로 설정ë˜ì–´ 있는지 확ì¸í•˜ì„¸ìš”.',
'config-your-language' => '설치 언어:',
'config-your-language-help' => '설치 과정ì—ì„œ 사용할 언어를 ì„ íƒí•˜ì„¸ìš”.',
'config-wiki-language' => '위키 언어:',
- 'config-wiki-language-help' => '주로 ìž‘ì„±ë  ìœ„í‚¤ì— ëŒ€í•œ 언어를 ì„ íƒí•˜ì„¸ìš”.',
+ 'config-wiki-language-help' => 'ìœ„í‚¤ì— ì£¼ë¡œ ìž‘ì„±ë  ì–¸ì–´ë¥¼ ì„ íƒí•˜ì„¸ìš”.',
'config-back' => '↠뒤로',
'config-continue' => 'ê³„ì† â†’',
'config-page-language' => '언어',
@@ -10467,7 +10812,7 @@ php.ini를 확ì¸í•˜ê³  <code>session.save_path</code>ê°€ ì ì ˆí•œ 디렉토리
'config-page-copying' => '전문',
'config-page-upgradedoc' => '업그레ì´ë“œí•˜ê¸°',
'config-page-existingwiki' => '기존 위키',
- 'config-help-restart' => 'ë‹¹ì‹ ì´ ìž…ë ¥í•œ 모든 ì €ìž¥ëœ ë°ì´í„°ë¥¼ 지우고 설치 ê³¼ì •ì„ ë‹¤ì‹œ 시작하겠습니까?',
+ 'config-help-restart' => '입력한 모든 ì €ìž¥ëœ ë°ì´í„°ë¥¼ 지우고 설치 ê³¼ì •ì„ ë‹¤ì‹œ 시작하겠습니까?',
'config-restart' => '예, 다시 시작합니다',
'config-welcome' => '=== 사용 환경 검사 ===
ì´ í™˜ê²½ì´ ë¯¸ë””ì–´ìœ„í‚¤ ì„¤ì¹˜ì— ì í•©í•œì§€ 기본 검사를 실행합니다.
@@ -10498,37 +10843,37 @@ $1
'config-env-php' => 'PHP $1(ì´)ê°€ 설치ë˜ì—ˆìŠµë‹ˆë‹¤.',
'config-env-php-toolow' => 'PHP $1(ì´)ê°€ 설치ë˜ì—ˆìŠµë‹ˆë‹¤.
하지만 미디어위키는 PHP $2 ì´ìƒì´ 필요합니다.',
- 'config-unicode-using-utf8' => '유니코드 ì •ê·œí™”ì— ëŒ€í•´ Brion Vibberì˜ utf8_normalize.so를 사용합니다.',
- 'config-unicode-using-intl' => '유니코드 ì •ê·œí™”ì— ëŒ€í•´ [http://pecl.php.net/intl intl PECL 확장]ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.',
- 'config-unicode-pure-php-warning' => "'''경고''': [http://pecl.php.net/intl intl PECL 확장]ì€ PHP만으로 구현하는 ë°ì—는 ëŠë ¤ì§ˆ ì •ë„ë¡œ ì„±ëŠ¥ì´ ë–¨ì–´ì§€ëŠ” 유니코드 정규화를 처리할 수 없습니다.
-ë†’ì€ íŠ¸ëž˜í”½ì˜ ì‚¬ì´íŠ¸ì—ì„œ 실행하려면 [//www.mediawiki.org/wiki/Unicode_normalization_considerations 유니코드 정규화]ì— ëŒ€í•´ 약간 참고해야 합니다.",
+ 'config-unicode-using-utf8' => '유니코드 ì •ê·œí™”ì— Brion Vibberì˜ utf8_normalize.so를 사용합니다.',
+ 'config-unicode-using-intl' => '유니코드 ì •ê·œí™”ì— [http://pecl.php.net/intl intl PECL 확장 기능]ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.',
+ 'config-unicode-pure-php-warning' => "'''경고''': 유니코드 정규화를 처리할 [http://pecl.php.net/intl intl PECL 확장 기능]ì„ ì‚¬ìš©í•  수 없기 ë•Œë¬¸ì— ëŠë¦° 순수한 PHP êµ¬í˜„ì„ ëŒ€ì‹  사용합니다.
+ë†’ì€ íŠ¸ëž˜í”½ 사ì´íŠ¸ì—ì„œ 실행하려면 [//www.mediawiki.org/wiki/Unicode_normalization_considerations 유니코드 정규화]를 ì½ì–´ë³´ì‹œê¸° ë°”ëžë‹ˆë‹¤.",
'config-unicode-update-warning' => "'''경고''': 유니코드 정규화 래í¼ì˜ ì„¤ì¹˜ëœ ë²„ì „ì€ [http://site.icu-project.org/ ICU 프로ì íŠ¸]ì˜ ë¼ì´ë¸ŒëŸ¬ë¦¬ì˜ ì´ì „ ë²„ì „ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.
만약 유니코드를 사용하는 ê²ƒì— ëŒ€í•´ 우려가 ëœë‹¤ë©´ [//www.mediawiki.org/wiki/Unicode_normalization_considerations 업그레ì´ë“œ]해야합니다.",
'config-no-db' => 'ì ì ˆí•œ ë°ì´í„°ë² ì´ìŠ¤ ë“œë¼ì´ë²„를 ì°¾ì„ ìˆ˜ 없습니다! PHPì— ë°ì´í„°ë² ì´ìŠ¤ ë“œë¼ì´ë²„를 설치해야 합니다.
ë‹¤ìŒ ë°ì´í„°ë² ì´ìŠ¤ ìœ í˜•ì„ ì§€ì›í•©ë‹ˆë‹¤ : $1.
-í˜¸ìŠ¤íŒ…ì„ ê³µìœ í•˜ê³  있다면 ì ì ˆí•œ ë°ì´í„°ë² ì´ìŠ¤ ë“œë¼ì´ë²„를 설치하ë„ë¡ í˜¸ìŠ¤íŒ… 제공 ì—…ì²´ì— ë¬¸ì˜í•˜ì„¸ìš”.
-PHP를 ì§ì ‘ 컴파ì¼í•  경우 ë°ì´í„°ë² ì´ìŠ¤ í´ë¼ì´ì–¸íŠ¸ë¥¼ 사용하여 활성화하ë„ë¡ ë‹¤ì‹œ 설정하세요. 예들 들어 <code>./configure --with-mysql</code>ì„ ì‚¬ìš©í•˜ì„¸ìš”.
+공유하는 í˜¸ìŠ¤íŒ…ì„ ì‚¬ìš©í•˜ê³  있다면 ì ì ˆí•œ ë°ì´í„°ë² ì´ìŠ¤ ë“œë¼ì´ë²„를 설치하ë„ë¡ í˜¸ìŠ¤íŒ… 제공 ì—…ì²´ì— ë¬¸ì˜í•˜ì„¸ìš”.
+PHP를 ì§ì ‘ 컴파ì¼í–ˆë‹¤ë©´ 예를 들어 <code>./configure --with-mysql</code>ì„ ì‚¬ìš©í•˜ì—¬ ë°ì´í„°ë² ì´ìŠ¤ í´ë¼ì´ì–¸íŠ¸ë¥¼ 활성화하ë„ë¡ ë‹¤ì‹œ 설정하세요.
ë°ë¹„안ì´ë‚˜ 우분트 패키지ì—ì„œ PHP를 설치했다면 php-mysql ëª¨ë“ˆë„ ì„¤ì¹˜í•´ì•¼ 합니다.',
'config-outdated-sqlite' => "'''경고''': SQLite 필요한 최소 $2 버전보다 ë‚®ì€ $1(ì´)ê°€ 있습니다. SQLite는 사용할 수 없습니다.",
'config-no-fts3' => "'''경고''': SQLite는 [//sqlite.org/fts3.html FTS3 모듈] ì—†ì´ ì»´íŒŒì¼ë˜ì–´, 검색 ê¸°ëŠ¥ì€ ë°±ì—”ë“œì— ì‚¬ìš©í•  수 없습니다.",
'config-register-globals' => "'''경고: PHPì˜ <code>[http://php.net/register_globals register_globals]</code> ì˜µì…˜ì´ í™œì„±í™”ë˜ì–´ 있습니다.'''
'''가능하면 ì´ë¥¼ 비활성화하십시오.'''
-미디어위키는 ìž‘ë™í•˜ì§€ë§Œ ì„œë²„ì— ìž ìž¬ì ì¸ 보안 취약ì ì— 노출ë©ë‹ˆë‹¤.",
+미디어위키는 ìž‘ë™í•˜ì§€ë§Œ ì„œë²„ì— ìž ìž¬ì ì¸ 보안 취약ì ì´ 노출ë©ë‹ˆë‹¤.",
'config-magic-quotes-runtime' => "'''치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]ì´ í™œì„±í•©ë‹ˆë‹¤!'''
ì´ ì˜µì…˜ì€ ë°ì´í„°ë¥¼ 입력하는 ë° ì˜ˆê¸°ì¹˜ 않는 ì†ìƒì´ ì¼ì–´ë‚©ë‹ˆë‹¤.
-설치할 수 없습니다. ë˜ëŠ” 미디어위키가 사용하지 않는 ì´ ì˜µì…˜ì„ ë¹„í™œì„±í™”í•˜ì‹­ì‹œì˜¤.",
+ì´ ì˜µì…˜ì„ ë¹„í™œì„±í™”í•˜ì§€ 않는 í•œ 미디어위키를 설치하고 사용할 수 없습니다.",
'config-magic-quotes-sybase' => "'''치명: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]ì´ í™œì„±í•©ë‹ˆë‹¤!'''
ì´ ì˜µì…˜ì€ ë°ì´í„°ë¥¼ 입력하는 ë° ì˜ˆê¸°ì¹˜ 않는 ì†ìƒì´ ì¼ì–´ë‚©ë‹ˆë‹¤.
-설치할 수 없습니다. ë˜ëŠ” 미디어위키가 사용하지 않는 ì´ ì˜µì…˜ì„ ë¹„í™œì„±í™”í•˜ì‹­ì‹œì˜¤.",
+ì´ ì˜µì…˜ì„ ë¹„í™œì„±í™”í•˜ì§€ 않는 í•œ 미디어위키를 설치하고 사용할 수 없습니다.",
'config-mbstring' => "'''치명: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]ì´ í™œì„±í•©ë‹ˆë‹¤!'''
ì´ ì˜µì…˜ì€ ì˜¤ë¥˜ê°€ ë°œìƒí•˜ê³  ë°ì´í„°ë¥¼ 입력하는 ë° ì˜ˆê¸°ì¹˜ 않는 ì†ìƒì´ ì¼ì–´ë‚  수 있습니다.
-설치할 수 없습니다. ë˜ëŠ” 미디어위키가 사용하지 않는 ì´ ì˜µì…˜ì„ ë¹„í™œì„±í™”í•˜ì‹­ì‹œì˜¤.",
+ì´ ì˜µì…˜ì„ ë¹„í™œì„±í™”í•˜ì§€ 않는 í•œ 미디어위키를 설치하고 사용할 수 없습니다.",
'config-ze1' => "'''치명: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]ì´ í™œì„±í•©ë‹ˆë‹¤!'''
-ì´ ì˜µì…˜ì€ ë¯¸ë””ì–´ìœ„í‚¤ì— ë”ì°í•œ 버그를 ì¼ìœ¼í‚µë‹ˆë‹¤.
-설치할 수 없습니다. ë˜ëŠ” 미디어위키가 사용하지 않는 ì´ ì˜µì…˜ì„ ë¹„í™œì„±í™”í•˜ì‹­ì‹œì˜¤.",
+ì´ ì˜µì…˜ì€ ë¯¸ë””ì–´ìœ„í‚¤ì— ì‹¬ê°„í•œ 버그를 ì¼ìœ¼í‚µë‹ˆë‹¤.
+ì´ ì˜µì…˜ì„ ë¹„í™œì„±í™”í•˜ì§€ 않는 í•œ 미디어위키를 설치하고 사용할 수 없습니다.",
'config-safe-mode' => "'''경고:''' [http://www.php.net/features.safe-mode 안전 모드]ì´ í™œì„±í•©ë‹ˆë‹¤!
-ì´ëŠ” 특히 파ì¼ì„ 올리거나 <code>math</code>를 지ì›í•˜ëŠ” ë° ë¬¸ì œê°€ ë°œìƒí•  수 있습니다.",
+특히 파ì¼ì„ 올리거나 <code>math</code>를 지ì›í•˜ëŠ” ë° ë¬¸ì œê°€ ë°œìƒí•  수 있습니다.",
'config-xml-bad' => 'PHPì˜ XML ëª¨ë“ˆì´ ì—†ìŠµë‹ˆë‹¤.
미디어위키는 ì´ ëª¨ë“ˆì˜ ê¸°ëŠ¥ì´ í•„ìš”í•˜ë©° ì´ ì„¤ì •ì—서는 ìž‘ë™í•˜ì§€ 않습니다.
Mandrake를 실행하고 있다면 php-xml 패키지를 설치하세요.',
@@ -10538,69 +10883,72 @@ Mandrake를 실행하고 있다면 php-xml 패키지를 설치하세요.',
미디어위키가 제대로 ìž‘ë™í•˜ë ¤ë©´ 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-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]ê°€ 허용ë˜ì—ˆìŠµë‹ˆë‹¤. 잘못 ì„¤ì •ëœ ê²½ìš° 미디어위키나 사용ìžê°€ ìž„ì˜ì˜ 콘í…츠를 게시할 수 있는 다른 ì†Œí”„íŠ¸ì›¨ì–´ì— ëŒ€í•œ 문제를 ì¼ìœ¼í‚¬ 수 있습니다.
[http://modsecurity.org/documentation/ mod_security] 문서를 참고하거나 ìž„ì˜ì˜ 오류가 ë°œìƒí•  경우 í˜¸ìŠ¤íŠ¸ì˜ ì§€ì› ìš”ì²­ì— ë¬¸ì˜í•˜ì‹­ì‹œì˜¤.",
'config-diff3-bad' => 'GNU diff3를 ì°¾ì„ ìˆ˜ 없습니다.',
'config-imagemagick' => 'ImageMagick를 찾았습니다: <code>$1</code>.
-올리기를 활성화할 경우 그림 섬네ì¼ì´ í™œì„±í™”ë  ê²ƒìž…ë‹ˆë‹¤.',
+올리기를 활성화할 경우 그림 섬네ì¼ì´ 활성화ë©ë‹ˆë‹¤.',
'config-gd' => 'ë‚´ìž¥ëœ GD 그래픽 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 찾았습니다.
-올리기를 활성화할 경우 그림 섬네ì¼ì´ í™œì„±í™”ë  ê²ƒìž…ë‹ˆë‹¤.',
+올리기를 활성화할 경우 그림 섬네ì¼ì´ 활성화ë©ë‹ˆë‹¤.',
'config-no-scaling' => 'GD ë¼ì´ë¸ŒëŸ¬ë¦¬ë‚˜ ImageMagick를 ì°¾ì„ ìˆ˜ 없습니다.
-그림 섬네ì¼ì´ ë¹„í™œì„±í™”ë  ê²ƒìž…ë‹ˆë‹¤.',
+그림 섬네ì¼ì´ 비활성화ë©ë‹ˆë‹¤.',
'config-no-uri' => "'''오류:''' 현재 URI를 확ì¸í•  수 없습니다.
설치가 중단ë˜ì—ˆìŠµë‹ˆë‹¤.",
'config-no-cli-uri' => "'''경고''': ê¸°ë³¸ê°’ì„ ì‚¬ìš©í•˜ì—¬ --scriptpath를 지정하지 않았습니다: <code>$1</code>.",
'config-using-server' => '"<nowiki>$1</nowiki>"(ì„)를 서버 ì´ë¦„으로 사용합니다.',
'config-using-uri' => '"<nowiki>$1$2</nowiki>"(ì„)를 서버 URLë¡œ 사용합니다.',
'config-uploads-not-safe' => "'''경고:''' ì˜¬ë¦¬ê¸°ì— ëŒ€í•œ 기본 디렉토리(<code>$1</code>)는 ìž„ì˜ì˜ 스í¬ë¦½íŠ¸ ì‹¤í–‰ì— ì·¨ì•½í•©ë‹ˆë‹¤.
-미디어위키는 보안 ìœ„í˜‘ì— ëŒ€í•œ 모든 올린 파ì¼ì„ 검사하지만, ì´ëŠ” 올리기를 활성화하기 ì „ì— [//www.mediawiki.org/wiki/Manual:Security#Upload_security ì´ ë³´ì•ˆ 취약ì ì„ í•´ê²°í•  것]ì„ ë§¤ìš° 권장합니다.",
+미디어위키는 보안 ìœ„í˜‘ì— ëŒ€í•œ 모든 올린 파ì¼ì„ 검사하지만, 올리기를 활성화하기 ì „ì— [//www.mediawiki.org/wiki/Manual:Security#Upload_security ì´ ë³´ì•ˆ 취약ì ì„ í•´ê²°í•  것]ì„ ë§¤ìš° 권장합니다.",
'config-no-cli-uploads-check' => "'''경고:''' ì˜¬ë¦¬ê¸°ì— ëŒ€í•œ 기본 디렉토리(<code>$1</code>)는 CLI를 설치하는 ë™ì•ˆ ìž„ì˜ì˜ 스í¬ë¦½íŠ¸ ì‹¤í–‰ì— ëŒ€í•œ 취약ì ì— 대해 검사ë˜ì§€ 않습니다.",
'config-brokenlibxml' => 'ì‹œìŠ¤í…œì— ë²„ê·¸ê°€ 있는 PHP와 libxml2ì˜ ì¡°í•©ì´ ìžˆìœ¼ë©° 미디어위키나 다른 웹 어플리케ì´ì…˜ì— 숨겨진 ë°ì´í„° ì†ìƒì„ ì¼ìœ¼í‚¬ 수 있습니다.
-PHP 5.2.9 ì´í›„와 libxml2 2.7.3 ì´í›„ë¡œ 업그레ì´ë“œí•˜ì„¸ìš” ([//bugs.php.net/bug.php?id=45996 PHPì— ì œê¸°í•œ 버그]).
+PHP 5.2.9 ì´í›„와 libxml2 2.7.3 ì´í›„ë¡œ 업그레ì´ë“œí•˜ì„¸ìš”. ([//bugs.php.net/bug.php?id=45996 PHPì— ì œê¸°í•œ 버그])
설치가 중단ë˜ì—ˆìŠµë‹ˆë‹¤.',
'config-using531' => '미디어위키는 <code>__call()</code>ì„ ì°¸ê³ ë¡œ 매개 변수를 í¬í•¨í•˜ëŠ” 버그로 ì¸í•´ PHP $1(와)ê³¼ 함께 사용할 수 없습니다.
문제를 해결하려면 PHP 5.3.2 ì´ìƒë¡œ 업그레ì´ë“œí•˜ê±°ë‚˜ PHP 5.3.0으로 다운그레ì´ë“œë¥¼ 하세요.
설치가 중단ë˜ì—ˆìŠµë‹ˆë‹¤.',
- 'config-suhosin-max-value-length' => 'Suhosin(수호신)ì´ ì„¤ì¹˜ë˜ì—ˆê³  $1 ë°”ì´íŠ¸ë¡œ GET 매개 변수 길ì´ë¥¼ 제한하고 있습니다. ë¯¸ë””ì–´ìœ„í‚¤ì˜ ResourceLoader 구성 요소는 ì´ ì œí•œì„ í•´ê²°í•˜ì§€ë§Œ ì„±ëŠ¥ì´ ì €í•˜ë©ë‹ˆë‹¤. 가능하면 php.iniì˜ suhosin.get.max_value_lengthì— 1024 ì´ìƒìœ¼ë¡œ 설정하고 LocalSettings.phpì˜ $wgResourceLoaderMaxQueryLengthì— ê°™ì€ ê°’ì„ ì„¤ì •í•´ì•¼ 합니다.',
+ 'config-suhosin-max-value-length' => 'Suhosinì´ ì„¤ì¹˜ë˜ì—ˆê³  $1 ë°”ì´íŠ¸ë¡œ GET 매개 ë³€ìˆ˜ì¸ <code>length</code>를 제한하고 있습니다.
+ë¯¸ë””ì–´ìœ„í‚¤ì˜ ResourceLoader 구성 요소는 ì´ ì œí•œì„ í•´ê²°í•˜ì§€ë§Œ ì„±ëŠ¥ì´ ì €í•˜ë©ë‹ˆë‹¤.
+가능하면 <code>php.ini</code>ì˜ <code>suhosin.get.max_value_length</code>ì— 1024 ì´ìƒìœ¼ë¡œ 설정하고 <code>LocalSettings.php</code>ì˜ <code>$wgResourceLoaderMaxQueryLength</code>ì— ê°™ì€ ê°’ì„ ì„¤ì •í•´ì•¼ 합니다.',
'config-db-type' => 'ë°ì´í„°ë² ì´ìŠ¤ 종류:',
'config-db-host' => 'ë°ì´í„°ë² ì´ìŠ¤ 호스트:',
- 'config-db-host-help' => 'ë°ì´í„°ë² ì´ìŠ¤ 서버가 다른 ì„œë²„ì— ìžˆì„ ê²½ìš° ì—¬ê¸°ì— í˜¸ìŠ¤íŠ¸ ì´ë¦„ì´ë‚˜ IP 주소를 입력하세요.
+ 'config-db-host-help' => 'ë°ì´í„°ë² ì´ìŠ¤ 서버가 다른 ì„œë²„ì— ìžˆìœ¼ë©´ ì—¬ê¸°ì— í˜¸ìŠ¤íŠ¸ ì´ë¦„ì´ë‚˜ IP 주소를 입력하세요.
-웹 í˜¸ìŠ¤íŒ…ì„ ê³µìœ í•˜ì—¬ 사용하는 경우 호스팅 공급ìžëŠ” 당신ì—게 ì´ë“¤ ì„¤ëª…ì„œì˜ ì˜¬ë°”ë¥¸ 호스트 ì´ë¦„ì„ í‘œê¸°í•´ì•¼ 합니다.
+공유하는 웹 í˜¸ìŠ¤íŒ…ì„ ì‚¬ìš©í•˜ê³  있으면 호스팅 제공 업체는 호스트 ì´ë¦„ì„ ì„¤ëª…í•˜ê³  ìžˆì„ ê²ƒìž…ë‹ˆë‹¤.
-ìœˆë„ ì„œë²„ì— ì„¤ì¹˜í•˜ê³  MySQLì„ ì‚¬ìš©í•  경우 "localhost"는 서버 ì´ë¦„으로 ìž‘ë™í•˜ì§€ ì•Šì„ ìˆ˜ 있습니다. 그렇지 않으면 로컬 IP 주소로 "127.0.0.1"를 ì‹œë„하세요.
+ìœˆë„ ì„œë²„ì— ì„¤ì¹˜í•˜ê³  MySQLì„ ì‚¬ìš©í•˜ë©´ "localhost"는 서버 ì´ë¦„으로 ìž‘ë™í•˜ì§€ ì•Šì„ ìˆ˜ 있습니다. 그렇게 ëœë‹¤ë©´ 로컬 IP 주소로 "127.0.0.1"를 ì‹œë„하세요.
-PostgreSQLì„ ì‚¬ìš©í•  경우 유닉스 ì†Œì¼“ì„ í†µí•´ ì—°ê²°ë˜ë„ë¡ ìž…ë ¥ëž€ì„ ë¹„ì›Œë‘세요.',
+PostgreSQLì„ ì‚¬ìš©í•˜ë©´ 유닉스 ì†Œì¼“ì„ í†µí•´ ì—°ê²°ë˜ë„ë¡ ìž…ë ¥ëž€ì„ ë¹„ì›Œë‘세요.',
'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 쉬운 ì—°ê²°] 네ì´ë° ë©”ì†Œë“œë„ ì‚¬ìš©í•  수 있습니다.',
'config-db-wiki-settings' => 'ì´ ìœ„í‚¤ ì‹ë³„',
'config-db-name' => 'ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„:',
'config-db-name-help' => '위키를 ì‹ë³„하기 위한 ì´ë¦„ì„ ì„ íƒí•˜ì„¸ìš”.
-ì´ëŠ” ê³µë°±ì´ ì—†ì–´ì•¼ 합니다.
+ê³µë°±ì´ ì—†ì–´ì•¼ 합니다.
-웹 í˜¸ìŠ¤íŒ…ì„ ê³µìœ í•´ 사용하는 경우 호스팅 제공 ì—…ì²´ë„ ë‹¹ì‹ ì—게 제어íŒì„ 통해 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 사용하거나 만들 수 있ë„ë¡ íŠ¹ì • ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„ì„ ì œê³µí•©ë‹ˆë‹¤.',
+공유하는 웹 호스팅 사용하면 호스팅 제공 ì—…ì²´ê°€ 특정 ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„ì„ ì œê³µí•˜ê±°ë‚˜ 관리 패ë„ì—ì„œ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만들 수 있습니다.',
'config-db-name-oracle' => 'ë°ì´í„°ë² ì´ìŠ¤ 스키마:',
'config-db-account-oracle-warn' => 'ë°ì´í„°ë² ì´ìŠ¤ 백엔드로 오ë¼í´ì„ 설치하기 위해 지ì›í•˜ëŠ” 세 가지 시나리오가 있습니다:
설치 ê³¼ì •ì˜ ì¼ë¶€ë¡œ ë°ì´í„°ë² ì´ìŠ¤ ê³„ì •ì„ ë§Œë“¤ë ¤ë©´ 설치를 위해 ë°ì´í„°ë² ì´ìŠ¤ 계정으로 SYSDBA ì—­í• ì„ ê°€ì§„ ê³„ì •ì„ ì œê³µí•˜ê³  웹 ì ‘ê·¼ ê³„ì •ì— ëŒ€í•´ ì›í•˜ëŠ” ìžê²© ì¦ëª…ì„ ì§€ì •í•˜ì„¸ìš”, 그렇지 않으면 수ë™ìœ¼ë¡œ 웹 ì ‘ê·¼ ê³„ì •ì„ ë§Œë“¤ 수 있으며 (필요한 경우 권한 스키마 개체를 만들어야 합니다) ë˜ëŠ” 다른 계정 ë‘ ê°œë¥¼ 만들고 ê¶Œí•œì„ ê°€ì§„ í•˜ë‚˜ì˜ ì›¹ ì ‘ê·¼ì„ ìœ„í•œ ì œí•œëœ í•˜ë‚˜ë¥¼ 제공할 수 있습니다.
-필요한 ê¶Œí•œì„ ê°€ì§„ ê³„ì •ì„ ë§Œë“œëŠ” 스í¬ë¦½íŠ¸ëŠ” ì´ ì„¤ì¹˜ì˜ "maintenance/oracle/" 디렉토리ì—ì„œ ì°¾ì„ ìˆ˜ 있습니다. ì œí•œëœ ê³„ì •ì„ ì‚¬ìš©í•˜ë©´ 기본 계정으로 모든 관리 ê¸°ëŠ¥ì„ ë¹„í™œì„±í™”í•  ê²ƒì„ ì—¼ë‘í•´ ë‘십시오.',
+필요한 ê¶Œí•œì„ ê°€ì§„ ê³„ì •ì„ ë§Œë“œëŠ” 스í¬ë¦½íŠ¸ëŠ” ì´ ì„¤ì¹˜ì˜ "maintenance/oracle/" 디렉토리ì—ì„œ ì°¾ì„ ìˆ˜ 있습니다. ì œí•œëœ ê³„ì •ì„ ì‚¬ìš©í•˜ë©´ 기본 계정으로 모든 관리 ê¸°ëŠ¥ì„ ë¹„í™œì„±í™”í•  ê²ƒì„ ìœ ì˜í•˜ì‹­ì‹œì˜¤.',
'config-db-install-account' => '설치를 위한 ì‚¬ìš©ìž ê³„ì •',
'config-db-username' => 'ë°ì´í„°ë² ì´ìŠ¤ ì‚¬ìš©ìž ì´ë¦„:',
'config-db-password' => 'ë°ì´í„°ë² ì´ìŠ¤ 비밀번호:',
'config-db-password-empty' => '새 ë°ì´í„°ë² ì´ìŠ¤ 사용ìžì˜ 비밀번호를 입력하세요: $1.
-비밀번호 ì—†ì´ ì‚¬ìš©ìžë¥¼ 만들 ìˆ˜ë„ ìžˆì§€ë§Œ ì´ëŠ” 안전하지 않습니다.',
+비밀번호 ì—†ì´ ì‚¬ìš©ìžë¥¼ 만들 ìˆ˜ë„ ìžˆì§€ë§Œ 안전하지 않습니다.',
'config-db-install-username' => '설치 과정 ì¤‘ì— ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í•  ë•Œ 사용할 ì‚¬ìš©ìž ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”.
-ì´ëŠ” 미디어위키 ê³„ì •ì˜ ì‚¬ìš©ìž ì´ë¦„ì´ ì•„ë‹Œ ë°ì´í„°ë² ì´ìŠ¤ì— 대한 ì‚¬ìš©ìž ì´ë¦„입니다.',
- 'config-db-install-password' => '설치 과정 ì¤‘ì— ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í•  ë•Œ 사용할 ë¹„ë°€ë²ˆí˜¸ì„ ìž…ë ¥í•˜ì„¸ìš”. ì´ëŠ” 미디어위키 ê³„ì •ì˜ ë¹„ë°€ë²ˆí˜¸ê°€ ì•„ë‹Œ ë°ì´í„°ë² ì´ìŠ¤ì— 대한 비밀번호입니다.',
+미디어위키 ê³„ì •ì˜ ì‚¬ìš©ìž ì´ë¦„ì´ ì•„ë‹Œ ë°ì´í„°ë² ì´ìŠ¤ì— 대한 ì‚¬ìš©ìž ì´ë¦„입니다.',
+ 'config-db-install-password' => '설치 과정 ì¤‘ì— ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í•  ë•Œ 사용할 ë¹„ë°€ë²ˆí˜¸ì„ ìž…ë ¥í•˜ì„¸ìš”.
+미디어위키 ê³„ì •ì˜ ë¹„ë°€ë²ˆí˜¸ê°€ ì•„ë‹Œ ë°ì´í„°ë² ì´ìŠ¤ì— 대한 비밀번호입니다.',
'config-db-install-help' => '설치 과정 ì¤‘ì— ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í•  ë•Œ 사용할 ì‚¬ìš©ìž ì´ë¦„ê³¼ 비밀번호를 입력하세요.',
'config-db-account-lock' => 'ì •ìƒì ìœ¼ë¡œ ìž‘ë™í•˜ëŠ” ë™ì•ˆ ê°™ì€ ì‚¬ìš©ìž ì´ë¦„ê³¼ 비밀번호를 사용함',
'config-db-wiki-account' => 'ì •ìƒì ì¸ ìž‘ë™ì„ 위한 ì‚¬ìš©ìž ê³„ì •',
@@ -10615,29 +10963,29 @@ PostgreSQLì„ ì‚¬ìš©í•  경우 유닉스 ì†Œì¼“ì„ í†µí•´ ì—°ê²°ë˜ë„ë¡ ìž…ë ¥
'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ê°€ ì•„ë‹Œ 문ìžë¥¼ 파괴하고 ì†ìƒí•œ ë°±ì—…ì„ ë˜ëŒë¦´ 수 없습니다!
+ 'config-charset-help' => "'''경고:''' MySQL 4.1ì—ì„œ '''UTF-8 하위 호환성'''ì„ ì‚¬ìš©í•˜ê³  나서 <code>mysqldump</code>ë¡œ ë°ì´í„°ë² ì´ìŠ¤ì— 백업한다면 모든 ASCIIê°€ ì•„ë‹Œ 문ìžë¥¼ 파괴하고 ì†ìƒí•œ ë°±ì—…ì„ ë˜ëŒë¦´ 수 없습니다!
'''ë°”ì´ë„ˆë¦¬ 모드'''ì—서는 미디어위키는 ë°”ì´ë„ˆë¦¬ í•„ë“œì˜ ë°ì´í„°ë² ì´ìŠ¤ì— UTF-8 í…스트를 저장합니다.
-ì´ëŠ” MySQLì˜ UTF-8 모드를 보다 ë” íš¨ìœ¨ì ì´ê³  유니코드 문ìžì˜ ì „ì²´ 범위를 사용할 수 있습니다.
-'''UTF-8 모드'''ì—서는 MySQLì€ ë°ì´í„°ë¥¼ 설정하는 ì–´ë–¤ 문ìžì—´ì¸ì§€ë¥¼ ì•Œ 것ì´ë©°, 표현하고 ì ì ˆí•˜ê²Œ ê·¸ê²ƒì„ ë³€í™˜í•  수 있지만
-[//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes 기본 다국어 범위] ìƒì˜ 문ìžë¥¼ 저장하지 못하게 ë  ìˆ˜ 있습니다.",
+MySQLì˜ UTF-8 모드를 보다 ë” íš¨ìœ¨ì ì´ê³  유니코드 문ìžì˜ ì „ì²´ 범위를 사용할 수 있습니다.
+'''UTF-8 모드'''ì—서는 MySQLì€ ë°ì´í„°ë¥¼ 설정하는 ë¬¸ìž ì§‘í•©ì„ ì•Œê³  있기 ë•Œë¬¸ì— ì ì ˆí•˜ê²Œ 표현하고 변환할 수 있지만
+[//ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%ED%8F%89%EB%A9%B4#.EA.B8.B0.EB.B3.B8_.EB.8B.A4.EA.B5.AD.EC.96.B4_.ED.8F.89.EB.A9.B4 기본 다국어 í‰ë©´] ë°–ì˜ ë¬¸ìžë¥¼ 저장할 수 없습니다.",
'config-mysql-old' => 'MySQL $1 ì´ìƒì´ 필요하나 $2(ì´)ê°€ 있습니다.',
'config-db-port' => 'ë°ì´í„°ë² ì´ìŠ¤ í¬íŠ¸:',
'config-db-schema' => 'ë¯¸ë””ì–´ìœ„í‚¤ì— ëŒ€í•œ 스키마:',
- 'config-db-schema-help' => 'ì´ ìŠ¤í‚¤ë§ˆëŠ” 보통 괜찮습니다.
-필요로 알고 ìžˆì„ ê²½ìš°ì—만 ì´ë¥¼ 바꾸세요.',
+ 'config-db-schema-help' => '보통 ì´ ìŠ¤í‚¤ë§ˆëŠ” 문제가 없습니다.
+필요한 경우ì—만 바꾸세요.',
'config-pg-test-error' => "'''$1''' ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í•  수 없습니다: $2",
'config-sqlite-dir' => 'SQLite ë°ì´í„° 디렉토리:',
- 'config-sqlite-dir-help' => 'SQLite는 í•˜ë‚˜ì˜ íŒŒì¼ì— 모든 ë°ì´í„°ë¥¼ 저장합니다.
+ 'config-sqlite-dir-help' => "SQLite는 í•˜ë‚˜ì˜ íŒŒì¼ì— 모든 ë°ì´í„°ë¥¼ 저장합니다.
-제공하는 디렉토리는 설치하는 ë™ì•ˆ 웹 ì„œë²„ì— ì˜í•´ 쓸 수 있어야 합니다.
+제공하는 디렉토리는 설치하는 ë™ì•ˆ 웹 서버가 쓸 수 있어야 합니다.
-PHP 파ì¼ì´ 있는 ê³³ì„ ìš°ë¦¬ê°€ ì´ë¥¼ 맡길 수 없는 ì´ìœ ëŠ” ì›¹ì„ í†µí•´ 접근할 수 없다는 것입니다.
+ì´ ë””ë ‰í† ë¦¬ëŠ” ì›¹ì„ í†µí•´ 접근할 수 '''없어야''' í•˜ëŠ”ë° PHP 파ì¼ì´ 있는 ê³³ì— ë„£ì„ ìˆ˜ 없는 ê²ƒì€ ì´ ë•Œë¬¸ìž…ë‹ˆë‹¤.
-설치 마법사가 ì´ê³¼ 함께 .htaccess 파ì¼ì„ 만들지만 거기서 실패하면 누군가는 ì›ë³¸ ë°ì´í„°ë² ì´ìŠ¤ì— 접근하는 ë° ì‹¤íŒ¨í•©ë‹ˆë‹¤.
-ì´ëŠ” ì›ì‹œ ì‚¬ìš©ìž ë°ì´í„°(ì´ë©”ì¼ ì£¼ì†Œ, 암호 í•´ì‹œ) ë¿ë§Œ ì•„ë‹ˆë¼ ì‚­ì œëœ ê°œì •íŒê³¼ ìœ„í‚¤ì˜ ë‹¤ë¥¸ ì œí•œëœ ë°ì´í„°ë¥¼ í¬í•¨í•©ë‹ˆë‹¤.
+설치 í”„ë¡œê·¸ëž¨ì€ <code>.htaccess</code> 파ì¼ì„ 작성하지만 ì´ê²ƒì´ 실패하면 누군가가 ì›ë³¸ ë°ì´í„°ë² ì´ìŠ¤ì— 접근할 수 있습니다.
+ë°ì´í„°ë² ì´ìŠ¤ëŠ” ì›ë³¸ ì‚¬ìš©ìž ë°ì´í„°(ì´ë©”ì¼ ì£¼ì†Œ, 해시한 비밀번호) ë¿ë§Œ ì•„ë‹ˆë¼ ì‚­ì œëœ íŒê³¼ ìœ„í‚¤ì˜ ë‹¤ë¥¸ ì œí•œëœ ë°ì´í„°ë¥¼ í¬í•¨í•©ë‹ˆë‹¤.
-<code>/var/lib/mediawiki/yourwiki</code>와 ê°™ì´ ëª¨ë‘ ë‹¤ë¥¸ ê³³ì—ì„œ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 넣어보ë„ë¡ í•˜ì„¸ìš”.',
+예를 들어 <code>/var/lib/mediawiki/yourwiki</code>와 ê°™ì´ ë‹¤ë¥¸ ê³³ì— ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 넣는 ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤.",
'config-oracle-def-ts' => '기본 í…Œì´ë¸”공간:',
'config-oracle-temp-ts' => 'ìž„ì‹œ í…Œì´ë¸”공간:',
'config-type-oracle' => '오ë¼í´',
@@ -10646,12 +10994,12 @@ PHP 파ì¼ì´ 있는 ê³³ì„ ìš°ë¦¬ê°€ ì´ë¥¼ 맡길 수 없는 ì´ìœ ëŠ” 웹ì„
$1
-ë°ì´í„°ë² ì´ìŠ¤ ì‹œìŠ¤í…œì´ í‘œì‹œë˜ì§€ ì•Šì„ ë•Œ ì•„ëž˜ì— ë‚˜ì—´ëœ ë‹¤ìŒ ì§€ì›ì„ 활성화하려면 ë‹¹ì‹ ì€ ìœ„ì˜ ë§í¬ëœ ì§€ì‹œì— ë”°ë¼ ì‚¬ìš©í•´ë³¼ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.',
+ë°ì´í„°ë² ì´ìŠ¤ ì‹œìŠ¤í…œì´ í‘œì‹œë˜ì§€ ì•Šì„ ë•Œ ì•„ëž˜ì— ë‚˜ì—´ëœ ë‹¤ìŒ ì§€ì›ì„ 활성화하려면 ìœ„ì˜ ë§í¬ëœ ì§€ì‹œì— ë”°ë¼ ì„¤ì¹˜í•´ë³¼ 수 있습니다.',
'config-support-mysql' => '* $1ì€ ë¯¸ë””ì–´ìœ„í‚¤ì˜ ê¸°ë³¸ 대ìƒìœ¼ë¡œ 가장 잘 지ì›í•©ë‹ˆë‹¤. ([http://www.php.net/manual/en/mysql.installation.php MySQLì„ ì§€ì›í•˜ì—¬ PHP를 컴파ì¼í•˜ëŠ” 방법])',
- 'config-support-postgres' => '* $1ì€ MySQLì˜ ëŒ€ì•ˆìœ¼ë¡œ ì¸ê¸°ìžˆëŠ” 오픈 소스 ë°ì´í„°ë² ì´ìŠ¤ 시스템입니다. ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQLì„ ì§€ì›í•˜ì—¬ PHP를 컴파ì¼í•˜ëŠ” 방법]) 몇가지 사소한 해결하지 못한 버그가 ìžˆì„ ìˆ˜ 있으며, ì´ë¥¼ 제작 환경ì—ì„œ 사용하지 않는 ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤.',
+ 'config-support-postgres' => '* $1ì€ MySQLì˜ ëŒ€ì•ˆìœ¼ë¡œ ì¸ê¸° 있는 오픈 소스 ë°ì´í„°ë² ì´ìŠ¤ 시스템입니다. ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQLì„ ì§€ì›í•˜ì—¬ PHP를 컴파ì¼í•˜ëŠ” 방법]) 몇가지 사소한 해결하지 못한 버그가 ìžˆì„ ìˆ˜ 있으며, ì´ë¥¼ 제작 환경ì—ì„œ 사용하지 않는 ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤.',
'config-support-sqlite' => '* $1는 매우 잘 지ì›í•˜ëŠ” 가벼운 ë°ì´í„°ë² ì´ìŠ¤ 시스템입니다. ([http://www.php.net/manual/en/pdo.installation.php SQLite를 지ì›í•˜ì—¬ PHP를 컴파ì¼í•˜ëŠ” 방법], PDO 사용)',
'config-support-oracle' => '* $1ì€ ìƒìš© 엔터프ë¼ì´ìŠ¤ ë°ì´í„°ë² ì´ìŠ¤ìž…니다. ([http://www.php.net/manual/en/oci8.installation.php OCI8ì„ ì§€ì›í•˜ì—¬ PHP를 컴파ì¼í•˜ëŠ” 방법])',
- 'config-support-ibm_db2' => '* $1는 ìƒìš© 엔터프ë¼ì´ì¦ˆ ë°ì´í„°ë² ì´ìŠ¤ìž…니다.',
+ 'config-support-ibm_db2' => '* $1는 ìƒìš© 엔터프ë¼ì´ì¦ˆ ë°ì´í„°ë² ì´ìŠ¤ìž…니다.([http://www.php.net/manual/en/ibm-db2.installation.php IBM DB2를 지ì›í•˜ì—¬ PHP를 컴파ì¼í•˜ëŠ” 방법])',
'config-header-mysql' => 'MySQL 설정',
'config-header-postgres' => 'PostgreSQL 설정',
'config-header-sqlite' => 'SQLite 설정',
@@ -10672,39 +11020,39 @@ ASCII ê¸€ìž (a-z, A-Z), ìˆ«ìž (0-9), 밑줄 (_)ê³¼ 하ì´í”ˆ (-)만 사용하ì
호스트, 계정 ì´ë¦„ê³¼ 비밀번호를 확ì¸í•˜ê³  다시 ì‹œë„하세요.',
'config-invalid-schema' => '미디어위키 "$1"ì— ëŒ€í•œ 스키마가 잘못ë습니다.
ASCII ê¸€ìž (a-z, A-Z), ìˆ«ìž (0-9), 밑줄 (_)ê³¼ 하ì´í”ˆ (-)만 사용하세요.',
- 'config-db-sys-create-oracle' => '설치 마법사는 새 ê³„ì •ì„ ë§Œë“¤ê¸° 위한 SYSDBA ê³„ì •ë§Œì„ ì§€ì›í•©ë‹ˆë‹¤.',
+ 'config-db-sys-create-oracle' => '설치 í”„ë¡œê·¸ëž¨ì€ ìƒˆ ê³„ì •ì„ ë§Œë“¤ê¸° 위한 SYSDBA ê³„ì •ë§Œì„ ì§€ì›í•©ë‹ˆë‹¤.',
'config-db-sys-user-exists-oracle' => '"$1" ì‚¬ìš©ìž ê³„ì •ì´ ì´ë¯¸ 존재합니다. SYSDBA는 새 ê³„ì •ì„ ë§Œë“œëŠ” ë°ì—만 사용할 수 있습니다!',
'config-postgres-old' => 'PostgreSQL $1 ì´ìƒì´ 필요하나 $2(ì´)ê°€ 있습니다.',
'config-sqlite-name-help' => '위키를 ì‹ë³„하기 위한 ì´ë¦„ì„ ì„ íƒí•˜ì„¸ìš”.
공백ì´ë‚˜ 하ì´í”ˆì„ 사용하지 마십시오.
-ì´ëŠ” SQLite ë°ì´í„° íŒŒì¼ ì´ë¦„ì— ì‚¬ìš©ë©ë‹ˆë‹¤.',
- 'config-sqlite-parent-unwritable-group' => '<code><nowiki>$1</nowiki></code> ë°ì´í„° 디렉토리를 만들 수 없으며 <code><nowiki>$2</nowiki></code> ìƒìœ„ ë””ë ‰í† ë¦¬ì— ì›¹ ì„œë²„ì— ì˜í•´ 쓸 수 없기 때문입니다.
+SQLite ë°ì´í„° íŒŒì¼ ì´ë¦„ì— ì‚¬ìš©ë©ë‹ˆë‹¤.',
+ 'config-sqlite-parent-unwritable-group' => '<code><nowiki>$1</nowiki></code> ë°ì´í„° 디렉토리를 만들 수 없으며 웹 서버는 <code><nowiki>$2</nowiki></code> ìƒìœ„ ë””ë ‰í† ë¦¬ì— ì“¸ 수 없기 때문입니다.
-설치 마법사는 웹 서버로 ì‹¤í–‰ì¤‘ì¸ ì‚¬ìš©ìžë¥¼ ê²°ì •í•  수 없습니다.
-계ì†í•˜ë ¤ë©´ ì´ë¥¼ 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.
+설치 í”„ë¡œê·¸ëž¨ì€ ì›¹ 서버로 ì‹¤í–‰ì¤‘ì¸ ì‚¬ìš©ìžë¥¼ 지정할 수 없습니다.
+계ì†í•˜ë ¤ë©´ 웹 서버가 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.
유닉스/리눅스 시스템ì—ì„œì˜ ìˆ˜í–‰:
<pre>cd $2
mkdir $3
chgrp $4 $3
chmod g+w $3</pre>',
- 'config-sqlite-parent-unwritable-nogroup' => '<code><nowiki>$1</nowiki></code> ë°ì´í„° 디렉토리를 만들 수 없으며 <code><nowiki>$2</nowiki></code> ìƒìœ„ ë””ë ‰í† ë¦¬ì— ì›¹ ì„œë²„ì— ì˜í•´ 쓸 수 없기 때문입니다.
+ 'config-sqlite-parent-unwritable-nogroup' => '<code><nowiki>$1</nowiki></code> ë°ì´í„° 디렉토리를 만들 수 없으며 웹 서버는 <code><nowiki>$2</nowiki></code> ìƒìœ„ ë””ë ‰í† ë¦¬ì— ì“¸ 수 없기 때문입니다.
-설치 마법사는 웹 서버로 ì‹¤í–‰ì¤‘ì¸ ì‚¬ìš©ìžë¥¼ ê²°ì •í•  수 없습니다.
-계ì†í•˜ë ¤ë©´ ì´(와 기타!)를 전역으로 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.
+설치 í”„ë¡œê·¸ëž¨ì€ ì›¹ 서버로 ì‹¤í–‰ì¤‘ì¸ ì‚¬ìš©ìžë¥¼ 지정할 수 없습니다.
+계ì†í•˜ë ¤ë©´ 웹 서버(와 기타!)ê°€ 전역으로 쓸 수 있는 <code><nowiki>$3</nowiki></code> 디렉토리를 만드세요.
유닉스/리눅스 시스템ì—ì„œì˜ ìˆ˜í–‰:
<pre>cd $2
mkdir $3
chmod a+w $3</pre>',
- 'config-sqlite-mkdir-error' => '"$1" ë°ì´í„° 디렉토리를 만드는 중 오류났습니다.
+ 'config-sqlite-mkdir-error' => '"$1" ë°ì´í„° 디렉토리를 만드는 중 오류가 났습니다.
경로를 확ì¸í•˜ê³  다시 ì‹œë„하세요.',
'config-sqlite-dir-unwritable' => '"$1" ë””ë ‰í† ë¦¬ì— ì“¸ 수 없습니다.
웹 서버를 쓸 수 있ë„ë¡ ê¶Œí•œì„ ë°”ê¾¸ê³  다시 ì‹œë„하세요.',
'config-sqlite-connection-error' => '$1.
호스트, 계정 ì´ë¦„ê³¼ 비밀번호를 확ì¸í•˜ê³  다시 ì‹œë„하세요.',
- 'config-sqlite-readonly' => '<code>$1</code> 파ì¼ì€ 쓰기가 불가능합니다.',
+ 'config-sqlite-readonly' => '<code>$1</code> 파ì¼ì€ 쓸 수 없습니다.',
'config-sqlite-cant-create-db' => '<code>$1</code> ë°ì´í„°ë² ì´ìŠ¤ 파ì¼ì„ 만들 수 없습니다.',
'config-sqlite-fts3-downgrade' => 'PHPê°€ FTS3 지ì›ì´ 없어졌습니다. í…Œì´ë¸”ì„ ë‹¤ìš´ê·¸ë ˆì´ë“œí•˜ì„¸ìš”.',
'config-can-upgrade' => "ì´ ë°ì´í„°ë² ì´ìŠ¤ì— 미디어위키 í…Œì´ë¸”ì´ ìžˆìŠµë‹ˆë‹¤.
@@ -10714,12 +11062,12 @@ chmod a+w $3</pre>',
ì´ì œ [$1 위키를 시작]í•  수 있습니다.
만약 <code>LocalSettings.php</code> 파ì¼ì„ 다시 만들기를 ì›í•˜ë©´ ì•„ëž˜ì˜ ë²„íŠ¼ì„ í´ë¦­í•˜ì„¸ìš”.
-ì´ê²ƒì€ ìœ„í‚¤ì— ë¬¸ì œê°€ 있지 않는 í•œ '''권장하지 않습니다'''.",
+ìœ„í‚¤ì— ë¬¸ì œê°€ 있지 않는 í•œ '''권장하지 않습니다'''.",
'config-upgrade-done-no-regenerate' => '업그레ì´ë“œê°€ 완료ë˜ì—ˆìŠµë‹ˆë‹¤.
ì´ì œ [$1 위키를 시작]í•  수 있습니다.',
- 'config-regenerate' => 'LocalSettings.php 다시 만들기 →',
- 'config-show-table-status' => 'SHOW TABLE STATUS 쿼리 실패!',
+ 'config-regenerate' => '<code>LocalSettings.php</code> 다시 만들기 →',
+ 'config-show-table-status' => '<code>SHOW TABLE STATUS</code> 쿼리를 실패했습니다!',
'config-unknown-collation' => "'''경고:''' ë°ì´í„°ë² ì´ìŠ¤ê°€ ì¸ì‹í•˜ì§€ 않는 ì •ë ¬ì„ ì‚¬ìš©í•˜ê³  있습니다.",
'config-db-web-account' => '웹 ì ‘ê·¼ì„ ìœ„í•œ ë°ì´í„°ë² ì´ìŠ¤ 계정',
'config-db-web-help' => 'ìœ„í‚¤ì˜ ì¼ë°˜ì ì¸ ìž‘ì—… ì¤‘ì— ë°ì´í„°ë² ì´ìŠ¤ ì„œë²„ì— ì—°ê²°í•˜ëŠ” ë° ì‚¬ìš©í•  웹 ì„œë²„ì— ëŒ€í•œ 계정 ì´ë¦„ê³¼ 비밀번호를 ì„ íƒí•˜ì„¸ìš”.',
@@ -10731,13 +11079,13 @@ chmod a+w $3</pre>',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
'config-mysql-myisam-dep' => "'''경고''': 미디어위키와 함께 사용하ë„ë¡ ê¶Œìž¥í•˜ì§€ 않는 MySQLì— ëŒ€í•œ 스토리지 엔진으로 MyISAMì„ ì„ íƒí•˜ì˜€ìŠµë‹ˆë‹¤. ì´ìœ ëŠ”:
-* ì´ëŠ” í…Œì´ë¸”ì´ ìž ê²¨ìžˆì–´ ë™ì‹œì„±ì„ ê±°ì˜ ì§€ì›í•˜ì§€ 않습니다
-* ì´ëŠ” 다른 엔진보다 ì†ìƒì´ ë” ìžì£¼ ë°œìƒí•©ë‹ˆë‹¤
+* í…Œì´ë¸”ì´ ìž ê²¨ìžˆì–´ ë™ì‹œì„±ì„ ê±°ì˜ ì§€ì›í•˜ì§€ 않습니다
+* 다른 엔진보다 ì†ìƒì´ ë” ìžì£¼ ë°œìƒí•©ë‹ˆë‹¤
* 미디어위키 바탕 코드가 í•­ìƒ ì •ìƒì ìœ¼ë¡œ MyISAMì„ ì²˜ë¦¬í•˜ì§€ 않습니다
MySQL 설치가 InnoDB를 지ì›í•œë‹¤ë©´ ê·¸ ì„ íƒ ëŒ€ì‹ ì— InnoDB를 ì„ íƒí•  ê²ƒì„ ë§¤ìš° 권장합니다.
MySQL 설치가 InnoDB를 지ì›í•˜ì§€ 않는다면 ì•„ë§ˆë„ ì—…ê·¸ë ˆì´ë“œë¥¼ 해야 í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.",
- 'config-mysql-engine-help' => "'''InnoDB'''는 ë™ì‹œì ì¸ 지ì›ì— 좋기 ë•Œë¬¸ì— ê±°ì˜ í•­ìƒ ìµœê³ ì˜ ì˜µì…˜ìž…ë‹ˆë‹¤.
+ 'config-mysql-engine-help' => "'''InnoDB'''는 ë™ì‹œì ì¸ 지ì›ì— 좋기 ë•Œë¬¸ì— ëŒ€ë¶€ë¶„ ìµœê³ ì˜ ì˜µì…˜ìž…ë‹ˆë‹¤.
'''MyISAM'''ì€ ë‹¨ì¼ ì‚¬ìš©ìž ë˜ëŠ” ì½ê¸° ì „ìš© ì„¤ì¹˜ì— ë¹ ë¥¼ 수 있습니다.
MyISAM ë°ì´í„°ë² ì´ìŠ¤ëŠ” InnoDB ë°ì´í„°ë² ì´ìŠ¤ë³´ë‹¤ ë” ìžì£¼ ì†ì‹¤ë  수 있습니다.",
@@ -10745,12 +11093,12 @@ MyISAM ë°ì´í„°ë² ì´ìŠ¤ëŠ” InnoDB ë°ì´í„°ë² ì´ìŠ¤ë³´ë‹¤ ë” ìžì£¼ ì†ì‹¤ë
'config-mysql-binary' => 'ë°”ì´ë„ˆë¦¬',
'config-mysql-utf8' => 'UTF-8',
'config-mysql-charset-help' => "'''ë°”ì´ë„ˆë¦¬ 모드'''ì—서는 미디어위키는 ë°”ì´ë„ˆë¦¬ í•„ë“œì˜ ë°ì´í„°ë² ì´ìŠ¤ì— UTF-8 í…스트를 저장합니다.
-ì´ëŠ” MySQLì˜ UTF-8 모드를 보다 ë” íš¨ìœ¨ì ì´ê³  유니코드 문ìžì˜ ì „ì²´ 범위를 사용할 수 있습니다.
-'''UTF-8 모드'''ì—서는 MySQLì€ ë°ì´í„°ë¥¼ 설정하는 ì–´ë–¤ 문ìžì—´ì¸ì§€ë¥¼ ì•Œ 것ì´ë©°, 표현하고 ì ì ˆí•˜ê²Œ ê·¸ê²ƒì„ ë³€í™˜í•  수 있지만
-[//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes 기본 다국어 범위] ìƒì˜ 문ìžë¥¼ 저장하지 못하게 ë  ìˆ˜ 있습니다.",
- 'config-ibm_db2-low-db-pagesize' => "ë‹¹ì‹ ì˜ DB2 ë°ì´í„°ë² ì´ìŠ¤ì— 부족한 페ì´ì§€ í¬ê¸°ê°€ 기본 í…Œì´ë¸” ê³µê°„ì— ìžˆìŠµë‹ˆë‹¤. 페ì´ì§€ í¬ê¸°ëŠ” '''32K''' ì´ìƒì´ì–´ì•¼ 합니다.",
+MySQLì˜ UTF-8 모드를 보다 ë” íš¨ìœ¨ì ì´ê³  유니코드 문ìžì˜ ì „ì²´ 범위를 사용할 수 있습니다.
+'''UTF-8 모드'''ì—서는 MySQLì€ ë°ì´í„°ë¥¼ 설정하는 ë¬¸ìž ì§‘í•©ì„ ì•Œê³  있기 ë•Œë¬¸ì— ì ì ˆí•˜ê²Œ 표현하고 변환할 수 있지만
+[//ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%ED%8F%89%EB%A9%B4#.EA.B8.B0.EB.B3.B8_.EB.8B.A4.EA.B5.AD.EC.96.B4_.ED.8F.89.EB.A9.B4 기본 다국어 í‰ë©´] ë°–ì˜ ë¬¸ìžë¥¼ 저장할 수 없습니다.",
+ 'config-ibm_db2-low-db-pagesize' => "DB2 ë°ì´í„°ë² ì´ìŠ¤ì— 부족한 페ì´ì§€ í¬ê¸°ê°€ 기본 í…Œì´ë¸” ê³µê°„ì— ìžˆìŠµë‹ˆë‹¤. 페ì´ì§€ í¬ê¸°ëŠ” '''32K''' ì´ìƒì´ì–´ì•¼ 합니다.",
'config-site-name' => '위키 ì´ë¦„:',
- 'config-site-name-help' => 'ì´ëŠ” 브ë¼ìš°ì € 제목 표시줄과 다른 여러 ê³³ì— ë‚˜íƒ€ë‚  것입니다.',
+ 'config-site-name-help' => '브ë¼ìš°ì € 제목 표시줄과 다른 여러 ê³³ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤.',
'config-site-name-blank' => '사ì´íŠ¸ ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”.',
'config-project-namespace' => '프로ì íŠ¸ ì´ë¦„공간:',
'config-ns-generic' => '프로ì íŠ¸',
@@ -10759,7 +11107,7 @@ MyISAM ë°ì´í„°ë² ì´ìŠ¤ëŠ” InnoDB ë°ì´í„°ë² ì´ìŠ¤ë³´ë‹¤ ë” ìžì£¼ ì†ì‹¤ë
'config-ns-other-default' => '내위키',
'config-project-namespace-help' => 'ìœ„í‚¤ë°±ê³¼ì˜ ì˜ˆë¥¼ ë”°ë¼ì„œ, ë§Žì€ ìœ„í‚¤ëŠ” "\'\'\'프로ì íŠ¸ ì´ë¦„공간\'\'\'"ì— ê·¸ë“¤ì˜ ì½˜í…츠 페ì´ì§€ì—ì„œ ê·¸ë“¤ì˜ ì •ì±… 페ì´ì§€ëŠ” 별ë„ë¡œ 보관합니다.
ì´ ì´ë¦„ê³µê°„ì— ìžˆëŠ” 모든 페ì´ì§€ì˜ ì œëª©ì€ ì—¬ê¸°ì„œ 지정할 수 있는 특정 ì ‘ë‘ì–´ë¡œ 시작합니다.
-보통 ì´ ì ‘ë‘어는 ìœ„í‚¤ì˜ ì´ë¦„ì—ì„œ 파ìƒë˜ì§€ë§Œ, ì´ëŠ” "#" ë˜ëŠ” ":"와 ê°™ì€ íŠ¹ìˆ˜ 문ìžë¥¼ í¬í•¨í•  수 없습니다.',
+보통 ì´ ì ‘ë‘어는 ìœ„í‚¤ì˜ ì´ë¦„ì—ì„œ 파ìƒë˜ì§€ë§Œ, "#" ë˜ëŠ” ":"와 ê°™ì€ íŠ¹ìˆ˜ 문ìžë¥¼ í¬í•¨í•  수 없습니다.',
'config-ns-invalid' => '특정 "<nowiki>$1</nowiki>" ì´ë¦„ê³µê°„ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤.
다른 프로ì íŠ¸ ì´ë¦„ê³µê°„ì„ ì§€ì •í•˜ì„¸ìš”.',
'config-ns-conflict' => '특정 "<nowiki>$1</nowiki>" ì´ë¦„ê³µê°„ì´ ê¸°ë³¸ 미디어위키 ì´ë¦„공간과 충ëŒí•©ë‹ˆë‹¤.
@@ -10769,7 +11117,7 @@ MyISAM ë°ì´í„°ë² ì´ìŠ¤ëŠ” InnoDB ë°ì´í„°ë² ì´ìŠ¤ë³´ë‹¤ ë” ìžì£¼ ì†ì‹¤ë
'config-admin-password' => '비밀번호:',
'config-admin-password-confirm' => '비밀번호 확ì¸:',
'config-admin-help' => '"í™ê¸¸ë™"ê³¼ ê°™ì´ ì—¬ê¸°ì— ì›í•˜ëŠ” ì‚¬ìš©ìž ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”.
-ì´ëŠ” ìœ„í‚¤ì— ë¡œê·¸ì¸í•˜ëŠ” ë° ì‚¬ìš©ë˜ëŠ” ì´ë¦„입니다.',
+ìœ„í‚¤ì— ë¡œê·¸ì¸í•˜ëŠ” ë° ì‚¬ìš©ë˜ëŠ” ì´ë¦„입니다.',
'config-admin-name-blank' => '관리ìžì˜ ì‚¬ìš©ìž ì´ë¦„ì„ ìž…ë ¥í•˜ì„¸ìš”.',
'config-admin-name-invalid' => '특정 "<nowiki>$1</nowiki>" ì‚¬ìš©ìž ì´ë¦„ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤.
다른 ì‚¬ìš©ìž ì´ë¦„ì„ ì§€ì •í•˜ì„¸ìš”.',
@@ -10782,8 +11130,8 @@ MyISAM ë°ì´í„°ë² ì´ìŠ¤ëŠ” InnoDB ë°ì´í„°ë² ì´ìŠ¤ë³´ë‹¤ ë” ìžì£¼ ì†ì‹¤ë
'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' => 'ì´ëŠ” 중요한 보안 ì•Œë¦¼ì„ í¬í•¨í•œ ë°°í¬ ì•Œë¦¼ì— ëŒ€í•´ 사용ë˜ëŠ” 로우 볼륨 ë©”ì¼ë§ 리스트입니다.
-ë‹¹ì‹ ì´ ì´ë¥¼ 구ë…하고 나서 새 ë²„ì „ì´ ë‚˜ì˜¬ ë•Œ 미디어위키 설치를 ì—…ë°ì´íŠ¸í•´ì•¼í•©ë‹ˆë‹¤.',
+ 'config-subscribe-help' => '중요한 보안 ì•Œë¦¼ì„ í¬í•¨í•œ ë°°í¬ ì•Œë¦¼ì— ëŒ€í•´ 사용ë˜ëŠ” 로우 볼륨 ë©”ì¼ë§ 리스트입니다.
+ì´ ë¦¬ìŠ¤íŠ¸ë¥¼ 구ë…하고 나서 새 ë²„ì „ì´ ë‚˜ì˜¬ ë•Œ 미디어위키 설치를 ì—…ë°ì´íŠ¸í•˜ì‹­ì‹œì˜¤.',
'config-subscribe-noemail' => 'ì´ë©”ì¼ ì£¼ì†Œë¥¼ 제공하지 ì•Šê³  ë°°í¬ ë°œí‘œ ë©”ì¼ë§ ë¦¬ìŠ¤íŠ¸ì— ê°€ìž…í•˜ë ¤ 합니다.
ë©”ì¼ë§ ë¦¬ìŠ¤íŠ¸ì— ê°€ìž…í•˜ê³ ìž í•  경우 ì´ë©”ì¼ ì£¼ì†Œë¥¼ 제공하세요.',
'config-almost-done' => 'ê±°ì˜ ë‹¤ 완료했습니다!
@@ -10791,22 +11139,23 @@ MyISAM ë°ì´í„°ë² ì´ìŠ¤ëŠ” InnoDB ë°ì´í„°ë² ì´ìŠ¤ë³´ë‹¤ ë” ìžì£¼ ì†ì‹¤ë
'config-optional-continue' => 'ë” ë§Žì€ ì§ˆë¬¸ì„ ë¬¼ì–´ë³´ì„¸ìš”.',
'config-optional-skip' => '지겨워요, 그냥 위키를 설치할래요.',
'config-profile' => 'ì‚¬ìš©ìž ê¶Œí•œ 프로필:',
- 'config-profile-wiki' => 'í‰ë²”í•œ 위키',
+ 'config-profile-wiki' => '열린 위키',
'config-profile-no-anon' => '계정 만들기 필요',
- 'config-profile-fishbowl' => '승ì¸ëœ 편집ìžë§Œ ì´ìš© 가능',
+ 'config-profile-fishbowl' => '승ì¸ëœ 편집ìžë§Œ',
'config-profile-private' => '비공개 위키',
- 'config-profile-help' => "위키는 ë‹¹ì‹ ì´ ê°€ëŠ¥í•œ í•œ ë§Žì€ ì‚¬ëžŒë“¤ì´ íŽ¸ì§‘í•˜ë„ë¡ í•  ë•Œ 최고로 ì í•©í•©ë‹ˆë‹¤.
-미디어위키ì—서는 최근 ë°”ë€œì„ ê²€í† í•˜ê³ , 선하거나 ì•…ì˜ì ì¸ 사용ìžì— ì˜í•´ 수행ë˜ëŠ” 모든 ì†ì‹¤ì„ ë˜ëŒë¦¬ëŠ” ê²ƒì´ ì‰½ìŠµë‹ˆë‹¤.
+ 'config-profile-help' => "위키는 ë§Žì€ ì‚¬ëžŒë“¤ì´ ê°€ëŠ¥í•œ í•œ 편집할 수 있ë„ë¡ í•˜ë©´ 가장 ë›°ì–´ë‚œ ì—­í• ì„ í•©ë‹ˆë‹¤.
+미디어위키ì—서는 최근 ë°”ë€œì„ ê²€í† í•˜ê¸° 쉽고, 선하거나 ì•…ì˜ì ì¸ 사용ìžì˜ ì–´ë– í•œ ì†ì‹¤ì„ ë˜ëŒë¦¬ëŠ” ê²ƒì´ ì‰½ìŠµë‹ˆë‹¤.
-그러나 ë§Žì€ ì‚¬ëžŒë“¤ì´ ë¯¸ë””ì–´ìœ„í‚¤ê°€ 다양한 ì—­í• ì˜ ìœ ìš©í•˜ì§€ë§Œ, 때로는 ê·¸ê²ƒì´ ìœ„í‚¤ ë°©ì‹ì˜ 장ì ì„ ëª¨ë‘ ì„¤ë“하기 쉽지 ì•ŠìŒì„ 발견했습니다.
+그러나 ë§Žì€ ì‚¬ëžŒì´ ë¯¸ë””ì–´ìœ„í‚¤ëŠ” 다양한 ì—­í• ë¡œ 유용하지만, 때로는 모든 사람ì—게 위키 ë°©ì‹ì˜ 장ì ì„ 설ë“하기 쉽지 ì•Šì„ ì§€ë„ ëª¨ë¦…ë‹ˆë‹¤.
그래서 ì„ íƒí•  수 있습니다.
-'''{{int:config-profile-wiki}}'''는 로그ì¸í•˜ì§€ ì•Šê³ ë„ ëˆ„êµ¬ë‚˜ 편집할 수 있습니다.
-'''{{int:config-profile-no-anon}}'''는 추가ì ìœ¼ë¡œ 필요한 ì±…ìž„ì„ ì œê³µí•˜ì§€ë§Œ, ê¸°ì¡´ì˜ ê¸°ì—¬ìžë¥¼ ë§ì¹  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.
+'''{{int:config-profile-wiki}}''' 모ë¸ì€ 로그ì¸í•˜ì§€ ì•Šê³ ë„ ëˆ„êµ¬ë‚˜ 편집할 수 있습니다.
+'''{{int:config-profile-no-anon}}'''ì¸ ìœ„í‚¤ëŠ” ê° íŽ¸ì§‘ì— ì¶”ê°€ì ìœ¼ë¡œ ê°•í•œ ì±…ìž„ì„ ì œê³µí•˜ì§€ë§Œ, 부담 없는 기여를 저해할 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.
-'''{{int:config-profile-fishbowl}}''' ê°™ì€ ê²½ìš°ëŠ” 승ì¸ëœ 사용ìžë§Œ 편집할 수 있지만, ëŒ€ì¤‘ì€ ì—­ì‚¬ë¥¼ í¬í•¨í•˜ì—¬ 페ì´ì§€ë¥¼ ë³¼ 수 있습니다. '''{{int:config-profile-private}}'''는 승ì¸ëœ 사용ìžë§Œ ê°™ì€ ê·¸ë£¹ì—ì„œ 편집할 수 있고 ë³¼ 수 있습니다.
+'''{{int:config-profile-fishbowl}}''' 시나리오는 승ì¸ëœ 사용ìžë§Œ 편집할 수 있지만, ëŒ€ì¤‘ì€ ì—­ì‚¬ë¥¼ í¬í•¨í•˜ì—¬ 문서를 ë³¼ 수 있습니다.
+'''{{int:config-profile-private}}'''는 승ì¸ëœ 사용ìžë§Œ 문서를 ë³¼ 수 있으며 해당 ê·¸ë£¹ì„ íŽ¸ì§‘í•  수 있습니다.
-ë” ë³µìž¡í•œ ì‚¬ìš©ìž ê¶Œí•œì„ ì„¤ì •í•˜ì—¬ 설치한 후 사용할 수 있ë„ë¡ í•˜ë ¤ë©´ [//www.mediawiki.org/wiki/Manual:User_rights 관련 매뉴얼 항목]ì„ ì°¸ê³ í•˜ì„¸ìš”.",
+ë” ë³µìž¡í•œ ì‚¬ìš©ìž ê¶Œí•œì„ ì„¤ì •ì€ ì„¤ì¹˜í•œ 후 사용할 수 있으며 [//www.mediawiki.org/wiki/Manual:User_rights 관련 설명서 항목]ì„ ì°¸ê³ í•˜ì„¸ìš”.",
'config-license' => '저작권 ë° ë¼ì´ì„ ìŠ¤:',
'config-license-none' => 'ë¼ì´ì„ ìŠ¤ 바닥글 ì—†ìŒ',
'config-license-cc-by-sa' => 'í¬ë¦¬ì—ì´í‹°ë¸Œ 커먼즈 저작ìží‘œì‹œ-ë™ì¼ì¡°ê±´ë³€ê²½í—ˆë½',
@@ -10816,15 +11165,15 @@ MyISAM ë°ì´í„°ë² ì´ìŠ¤ëŠ” InnoDB ë°ì´í„°ë² ì´ìŠ¤ë³´ë‹¤ ë” ìžì£¼ ì†ì‹¤ë
'config-license-gfdl' => 'GNU ìžìœ  문서 사용 허가서 1.3 ì´ìƒ',
'config-license-pd' => 'í¼ë¸”릭 ë„ë©”ì¸',
'config-license-cc-choose' => '다른 í¬ë¦¬ì—ì´í‹°ë¸Œ 커먼즈 ë¼ì´ì„ ìŠ¤ ì„ íƒ',
- 'config-license-help' => 'ë§Žì€ ê³µê°œ 위키는 모든 기여를 [http://freedomdefined.org/Definition ìžìœ  ë¼ì´ì„ ìŠ¤] í•˜ì— ë„£ìŠµë‹ˆë‹¤.
-ì´ëŸ´ 경우 커뮤니티 ì†Œìœ ê¶Œì˜ ì´í•´ë¥¼ í•  수 있ë„ë¡ í•˜ê³  장기ì ì¸ 기여를 장려합니다.
-ì´ëŠ” ì¼ë°˜ì ìœ¼ë¡œ ê°œì¸ ë˜ëŠ” 회사 ìœ„í‚¤ì— ëŒ€í•´ì„œëŠ” 필요하지 않습니다.
+ 'config-license-help' => "ë§Žì€ ê³µê°œ 위키는 모든 기여를 [http://freedomdefined.org/Definition ìžìœ  ë¼ì´ì„ ìŠ¤] í•˜ì— ë„£ìŠµë‹ˆë‹¤.
+ì´ë ‡ê²Œ 하면 커뮤니티 ì†Œìœ ê¶Œì˜ ì´í•´ë¥¼ í•  수 있ë„ë¡ í•˜ê³  장기ì ì¸ 기여를 장려합니다.
+ì¼ë°˜ì ìœ¼ë¡œ ê°œì¸ ë˜ëŠ” 회사 ìœ„í‚¤ì— ëŒ€í•´ì„œëŠ” 필요하지 않습니다.
-ìœ„í‚¤ë°±ê³¼ì˜ í…스트를 사용할 수 있ë„ë¡ í•˜ê³  위키백과가 위키ì—ì„œ 복사한 í…스트를 사용할 수 있ë„ë¡ ì›í•œë‹¤ë©´ í¬ë¦¬ì—ì´í‹°ë¸Œ 커먼즈 저작ìží‘œì‹œ-ë™ì¼ì¡°ê±´ë³€ê²½í—ˆë½ìœ¼ë¡œ ì„ íƒí•´ì•¼ 합니다.
+ìœ„í‚¤ë°±ê³¼ì˜ í…스트를 사용할 수 있ë„ë¡ í•˜ê³  위키백과가 위키ì—ì„œ 복사한 í…스트를 사용할 수 있ë„ë¡ ì›í•œë‹¤ë©´ '''í¬ë¦¬ì—ì´í‹°ë¸Œ 커먼즈 저작ìží‘œì‹œ-ë™ì¼ì¡°ê±´ë³€ê²½í—ˆë½'''으로 ì„ íƒí•´ì•¼ 합니다.
위키백과는 ì´ì „ì— GNU ìžìœ  문서 사용 허가서를 사용했습니다.
-GFDLì€ ìœ íš¨í•œ ë¼ì´ì„ ìŠ¤ì´ì§€ë§Œ ì´ëŠ” ì´í•´í•˜ê¸° 어렵습니다.
-ì´ëŠ” GFDL í•˜ì— ë¼ì´ì„ ìŠ¤ ë‚´ìš©ì„ ìž¬ì‚¬ìš©í•˜ëŠ” ê²ƒë„ ì–´ë µìŠµë‹ˆë‹¤.',
+GFDLì€ ìœ íš¨í•œ ë¼ì´ì„ ìŠ¤ì´ì§€ë§Œ ë‚´ìš©ì„ ì´í•´í•˜ê¸° 어렵습니다.
+GFDL í•˜ì— ì‚¬ìš©ì„ í—ˆê°€í•œ ë‚´ìš©ì„ ìž¬ì‚¬ìš©í•˜ëŠ” ê²ƒë„ ì–´ë µìŠµë‹ˆë‹¤.",
'config-email-settings' => 'ì´ë©”ì¼ ì„¤ì •',
'config-enable-email' => '발신 ì´ë©”ì¼ í™œì„±í™”',
'config-enable-email-help' => 'ì´ë©”ì¼ì„ ìž‘ë™í•˜ë ¤ë©´ [http://www.php.net/manual/en/mail.configuration.php PHPì˜ ë©”ì¼ ì„¤ì •]ì„ ì˜¬ë°”ë¥´ê²Œ 설정해야 합니다.
@@ -10836,17 +11185,17 @@ GFDLì€ ìœ íš¨í•œ ë¼ì´ì„ ìŠ¤ì´ì§€ë§Œ ì´ëŠ” ì´í•´í•˜ê¸° 어렵습니다.
'config-email-watchlist' => '주시문서 ëª©ë¡ ì•Œë¦¼ 활성화',
'config-email-watchlist-help' => '환경 설정ì—ì„œ 활성화한 경우 사용ìžê°€ 주시한 ë¬¸ì„œì— ëŒ€í•œ ì•Œë¦¼ì„ ë°›ë„ë¡ í™œì„±í™”í•©ë‹ˆë‹¤.',
'config-email-auth' => 'ì´ë©”ì¼ ì¸ì¦ 활성화',
- 'config-email-auth-help' => "ì´ ì„¤ì •ì´ í™œì„±í™”ë˜ì–´ 있으면 사용ìžëŠ” ì´ë©”ì¼ ì£¼ì†Œë¥¼ 설정하거나 바꿀 때마다 그들ì—게 보낸 ë§í¬ë¥¼ 사용하여 ì´ë©”ì¼ ì£¼ì†Œë¥¼ 확ì¸í•´ì•¼ 합니다.
+ 'config-email-auth-help' => "ì´ ì„¤ì •ì´ í™œì„±í™”ë˜ì–´ 있으면 사용ìžëŠ” ì´ë©”ì¼ ì£¼ì†Œë¥¼ 설정하거나 바꿀 때마다 ë§í¬ë¥¼ 사용하여 ì´ë©”ì¼ ì£¼ì†Œë¥¼ 확ì¸í•´ì•¼ 합니다.
ì¸ì¦ëœ ì´ë©”ì¼ ì£¼ì†Œë§Œ 다른 사용ìžë¡œë¶€í„°ì˜ ì´ë©”ì¼ì´ë‚˜ 바뀜 알림 ì´ë©”ì¼ì„ ë°›ì„ ìˆ˜ 있습니다.
ì´ë©”ì¼ ê¸°ëŠ¥ì˜ ë‚¨ìš© ê°€ëŠ¥ì„±ì´ ìžˆê¸° ë•Œë¬¸ì— ì´ ì˜µì…˜ì„ ì„¤ì •í•˜ëŠ” ê²ƒì€ ê³µê°œ 위키ì—ì„œ '''권장'''합니다.",
'config-email-sender' => '반송 ì´ë©”ì¼ ì£¼ì†Œ',
'config-email-sender-help' => '발신한 ì´ë©”ì¼ì— 대한 반송 주소로 사용할 ì´ë©”ì¼ ì£¼ì†Œë¥¼ 입력하세요.
-ì´ëŠ” 반송할 ë•Œ 보내는 주소입니다.
+반송할 때 보내는 주소입니다.
ëŒ€ë¶€ë¶„ì˜ ë©”ì¼ ì„œë²„ëŠ” ì ì–´ë„ ë„ë©”ì¸ ì´ë¦„ ë¶€ë¶„ì€ ìœ íš¨í•©ë‹ˆë‹¤.',
'config-upload-settings' => '그림과 íŒŒì¼ ì˜¬ë¦¬ê¸°',
'config-upload-enable' => 'íŒŒì¼ ì˜¬ë¦¬ê¸° 활성화',
'config-upload-help' => 'íŒŒì¼ ì˜¬ë¦¬ê¸°ëŠ” ì„œë²„ì— ìž ìž¬ì ì¸ 보안 ìœ„í—˜ì— ì‰½ê²Œ ë…¸ì¶œë  ìˆ˜ 있습니다.
-ìžì„¸í•œ ë‚´ìš©ì€ ë§¤ë‰´ì–¼ì˜ [//www.mediawiki.org/wiki/Manual:Security 보안 문단]ì„ ì½ì–´ë³´ì„¸ìš”.
+ìžì„¸í•œ ë‚´ìš©ì€ ë§¤ë‰´ì–¼ì˜ [//www.mediawiki.org/wiki/Manual:Security 보안 문단]ì„ ì°¸ê³ í•˜ì„¸ìš”.
íŒŒì¼ ì˜¬ë¦¬ê¸°ë¥¼ 활성화하려면 ë¯¸ë””ì–´ìœ„í‚¤ì˜ ë£¨íŠ¸ ë””ë ‰í† ë¦¬ì— ìžˆëŠ” <code>images</code> 하위 디렉토리ì—ì„œ 웹 서버가 기ë¡í•  수 있ë„ë¡ ëª¨ë“œë¥¼ 바꿉니다.
ê·¸ ë‹¤ìŒ ì´ ì˜µì…˜ì„ í™œì„±í™”í•©ë‹ˆë‹¤.',
@@ -10854,10 +11203,10 @@ GFDLì€ ìœ íš¨í•œ ë¼ì´ì„ ìŠ¤ì´ì§€ë§Œ ì´ëŠ” ì´í•´í•˜ê¸° 어렵습니다.
'config-upload-deleted-help' => 'ì‚­ì œëœ íŒŒì¼ì„ 보관할 디렉토리를 ì„ íƒí•˜ì„¸ìš”.
ì´ìƒì ìœ¼ë¡œ 웹ì—ì„œ 접근할 수 없게 해야 합니다.',
'config-logo' => '로고 URL:',
- 'config-logo-help' => '미디어위키 기본 ìŠ¤í‚¨ì€ ì‚¬ì´ë“œë°” 메뉴 ìœ„ì— 135×160í”½ì…€ì˜ ë¡œê³ ë¥¼ í¬í•¨í•˜ê³  있습니다.
+ 'config-logo-help' => 'ë¯¸ë””ì–´ìœ„í‚¤ì˜ ê¸°ë³¸ ìŠ¤í‚¨ì€ ì‚¬ì´ë“œë°” 메뉴 ìœ„ì— 135×160 í”½ì…€ì˜ ë¡œê³ ë¥¼ í¬í•¨í•˜ê³  있습니다.
ì ë‹¹í•œ í¬ê¸°ë¡œ ì´ë¯¸ì§€ë¥¼ 올리고 URLì„ ì—¬ê¸°ì— ìž…ë ¥í•˜ì„¸ìš”.
-로고 ì‚¬ìš©ì„ ì›í•˜ì§€ 않으면 ì´ ìƒìžë¥¼ 비워 ë‘십시오.',
+로고 ì‚¬ìš©ì„ ì›í•˜ì§€ 않으면 ì´ ìƒìžë¥¼ 비우세요.',
'config-instantcommons' => 'ì¸ìŠ¤í„´íŠ¸ 공용 활성화',
'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons ì¸ìŠ¤í„´íŠ¸ 공용]ì€ [//commons.wikimedia.org/ 위키미디어 공용] 사ì´íŠ¸ì—ì„œ ì°¾ì„ ìˆ˜ 있는 그림, 소리 ë° ë‹¤ë¥¸ 미디어를 위키ì—ì„œ 사용할 수 있ë„ë¡ í•˜ëŠ” 기능입니다.
ì´ë ‡ê²Œ 하려면 미디어위키가 ì¸í„°ë„·ì— 접근해야합니다.
@@ -10887,11 +11236,11 @@ GFDLì€ ìœ íš¨í•œ ë¼ì´ì„ ìŠ¤ì´ì§€ë§Œ ì´ëŠ” ì´í•´í•˜ê¸° 어렵습니다.
'config-extensions' => '확장 기능',
'config-extensions-help' => 'ìœ„ì— ë‚˜ì—´ëœ í™•ìž¥ ê¸°ëŠ¥ì´ <code>./extensions</code>ì—ì„œ 발견ë˜ì—ˆìŠµë‹ˆë‹¤.
-ì´ëŠ” 추가ì ì¸ ì„¤ì •ì´ í•„ìš”í•  수 있습니다만 지금 활성화시킬 수 있습니다.',
- 'config-install-alreadydone' => "'''경고:''' ë‹¹ì‹ ì€ ì´ë¯¸ 미디어위키를 설치하였고 다시 설치하려고 합니다.
+추가ì ì¸ ì„¤ì •ì´ í•„ìš”í•  수 있습니다만 지금 활성화시킬 수 있습니다.',
+ 'config-install-alreadydone' => "'''경고:''' ì´ë¯¸ 미디어위키를 설치했고 다시 설치하려고 합니다.
ë‹¤ìŒ íŽ˜ì´ì§€ì—ì„œ 진행하세요.",
'config-install-begin' => '"{{int:config-continue}}"ì„ ëˆ„ë¥´ë©´ ë¯¸ë””ì–´ìœ„í‚¤ì˜ ì„¤ì¹˜ë¥¼ 시작합니다.
-ê·¸ëž˜ë„ ë°”ê¾¸ëŠ” ê²ƒì„ ì›í•œë‹¤ë©´ 뒤로를 누릅니다.',
+ê·¸ëž˜ë„ ë°”ê¾¸ëŠ” ê²ƒì„ ì›í•œë‹¤ë©´ "{{int:config-back}}"를 누르세요.',
'config-install-step-done' => '완료',
'config-install-step-failed' => '실패',
'config-install-extensions' => '확장 ê¸°ëŠ¥ì„ í¬í•¨í•˜ëŠ” 중',
@@ -10909,7 +11258,7 @@ GFDLì€ ìœ íš¨í•œ ë¼ì´ì„ ìŠ¤ì´ì§€ë§Œ ì´ëŠ” ì´í•´í•˜ê¸° 어렵습니다.
현재 미디어위키는 í…Œì´ë¸”ì„ ì›¹ 사용ìžê°€ 소유해야 합니다. 다른 웹 계정 ì´ë¦„ì„ ì§€ì •í•˜ê±°ë‚˜ "뒤로"를 í´ë¦­í•˜ê³  ì ì ˆí•œ ê¶Œí•œì˜ ì„¤ì¹˜í•  사용ìžë¥¼ 지정하세요.',
'config-install-user' => 'ë°ì´í„°ë² ì´ìŠ¤ 사용ìžë¥¼ 만드는 중',
- 'config-install-user-alreadyexists' => '"$1" 사용ìžê°€ ì´ë¯¸ 있ìŒ',
+ 'config-install-user-alreadyexists' => '"$1" 사용ìžê°€ ì´ë¯¸ 있습니다',
'config-install-user-create-failed' => '"$1" ì‚¬ìš©ìž ë§Œë“œëŠ” 중 실패: $2',
'config-install-user-grant-failed' => '"$1" 사용ìžì— 대한 권한 부여 실패: $2',
'config-install-user-missing' => '지정한 "$1" 사용ìžê°€ 존재하지 않습니다.',
@@ -10935,29 +11284,30 @@ GFDLì€ ìœ íš¨í•œ ë¼ì´ì„ ìŠ¤ì´ì§€ë§Œ ì´ëŠ” ì´í•´í•˜ê¸° 어렵습니다.
'config-install-done' => "'''축하합니다!'''
미디어위키가 성공ì ìœ¼ë¡œ 설치ë˜ì—ˆìŠµë‹ˆë‹¤.
-설치 마법사가 <code>LocalSettings.php</code> 파ì¼ì„ 만들었습니다.
-ì´ëŠ” 모든 ì„¤ì •ì´ í¬í•¨ë˜ì–´ 있습니다.
+설치 í”„ë¡œê·¸ëž¨ì´ <code>LocalSettings.php</code> 파ì¼ì„ 만들었습니다.
+모든 ì„¤ì •ì´ í¬í•¨ë˜ì–´ 있습니다.
-ì´ë¥¼ 다운로드하여 위키 ì„¤ì¹˜ì˜ ê±°ì ì— 넣어야 합니다 (index.php와 ê°™ì€ ë””ë ‰í† ë¦¬). 다운로드가 ìžë™ìœ¼ë¡œ 시작ë©ë‹ˆë‹¤.
+파ì¼ì„ 다운로드하여 위키 ì„¤ì¹˜ì˜ ê±°ì ì— 넣어야 합니다. (index.php와 ê°™ì€ ë””ë ‰í† ë¦¬) 다운로드가 ìžë™ìœ¼ë¡œ 시작ë©ë‹ˆë‹¤.
다운로드가 제공ë˜ì§€ ì•Šì„ ê²½ìš°ë‚˜ ê·¸ê²ƒì„ ì·¨ì†Œí•œ 경우ì—는 ì•„ëž˜ì˜ ë§í¬ë¥¼ í´ë¦­í•˜ì—¬ 다운로드를 다시 시작할 수 있습니다:
$3
-'''참고''': 지금 ì´ë ‡ê²Œ 하지 않으면, ì´ ì„¤ì • 파ì¼ì„ 다운로드하지 ì•Šê³  설치를 종료할 경우 만들어진 설정 파ì¼ì€ ë‚˜ì¤‘ì— ì‚¬ìš©í•  수 없습니다.
+'''참고''': ì´ ìƒì„±í•œ 설정 파ì¼ì„ 다운로드하지 ì•Šê³  설치를 ëë‚´ë©´ ì´ íŒŒì¼ì€ ë‚˜ì¤‘ì— ì‚¬ìš©í•  수 없습니다.
완료ë˜ì—ˆìœ¼ë©´ '''[$2 ìœ„í‚¤ì— ë“¤ì–´ê°ˆ 수 있습니다]'''.",
- 'config-download-localsettings' => 'LocalSettings.php 다운로드',
+ 'config-download-localsettings' => '<code>LocalSettings.php</code> 다운로드',
'config-help' => 'ë„움ë§',
'config-nofile' => '"$1" 파ì¼ì„ ì°¾ì„ ìˆ˜ 없습니다. ì´ë¯¸ ì‚­ì œë˜ì—ˆë‚˜ìš”?',
'mainpagetext' => "'''미디어위키가 성공ì ìœ¼ë¡œ 설치ë˜ì—ˆìŠµë‹ˆë‹¤.'''",
- 'mainpagedocfooter' => '[//meta.wikimedia.org/wiki/Help:Contents ì´ê³³]ì—ì„œ 위키 í”„ë¡œê·¸ëž¨ì— ëŒ€í•œ 정보를 ì–»ì„ ìˆ˜ 있습니다.
+ 'mainpagedocfooter' => '[//meta.wikimedia.org/wiki/Help:Contents ì´ê³³]ì—ì„œ 위키 ì†Œí”„íŠ¸ì›¨ì–´ì— ëŒ€í•œ 정보를 ì–»ì„ ìˆ˜ 있습니다.
== 시작하기 ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings 설정하기]
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings 설정하기 목ë¡]
* [//www.mediawiki.org/wiki/Manual:FAQ 미디어위키 FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 미디어위키 발표 ë©”ì¼ë§ 리스트]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 미디어위키 발표 ë©”ì¼ë§ 리스트]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources 내 언어로 미디어위키 지역화]',
);
/** Karachay-Balkar (къарачай-малкъар)
@@ -10982,21 +11332,21 @@ $messages['ksh'] = array(
'config-desc' => 'Et Projramm för Mediwiki opzesäze.',
'config-title' => 'MediaWiki $1 opsäze',
'config-information' => 'Enfomazjuhn',
- 'config-localsettings-upgrade' => 'De Dattei <code lang="en">LocalSettings.php</code> es ald doh.
+ 'config-localsettings-upgrade' => 'De Dattei <code lang="en"><code>LocalSettings.php</code></code> es ald doh.
De Projramme vum Wiki künne op der neußte Shtand jebraat wääde:
Donn doför dä Wäät vum <code lang="en">$wgUpgradeKey</code> en dat heh Feld enjävve.
-Do fenggs_et en dä Dattei <code lang="en">LocalSettings.php</code> om ẞööver.',
- 'config-localsettings-cli-upgrade' => 'En Dattei <code lang="en">LocalSettings.php</code> es jefonge woode.
+Do fenggs_et en dä Dattei <code lang="en"><code>LocalSettings.php</code></code> om ẞööver.',
+ 'config-localsettings-cli-upgrade' => 'En Dattei <code lang="en"><code>LocalSettings.php</code></code> es jefonge woode.
Öm et Wiki_Projramm op ene neue Shtand ze bränge, donn <code lang="en">update.php</code> oproofe.',
'config-localsettings-key' => 'Der Schlößel för et Projramm op ene neue Schtand ze bränge:',
'config-localsettings-badkey' => 'Dinge Schlößel paß nit.',
'config-upgrade-key-missing' => 'Mer han jefonge, dat MediaWiki ald enschtalleed es.
-Üm de Projramme un Daate o der neue Schtand bränge ze künne, dunn aan et Engk vun dä Dattei <code lang="en">LocalSettings.php</code> op dämm ẞööver:
+Üm de Projramme un Daate o der neue Schtand bränge ze künne, dunn aan et Engk vun dä Dattei <code lang="en"><code>LocalSettings.php</code></code> op dämm ẞööver:
$1
aanhange.',
- 'config-localsettings-incomplete' => 'Mer han en Dattei <code lang="en">LocalSettings.php:</code> jefonge, ävver di schingk nit kumplätt ze sin.
+ 'config-localsettings-incomplete' => 'Mer han en Dattei <code lang="en"><code>LocalSettings.php</code>:</code> jefonge, ävver di schingk nit kumplätt ze sin.
De Varijable <code lang="en">$1</code> es nit jesatz.
Bes esu joot, un donn di Dattei esu aanpaße, dat se jesaz ea, un dann donn op „{{int:config-continue}}“ klecke.',
'config-localsettings-connection-error' => 'Ene Fähler es opjetrodde wi mer en Verbendung noh de Datebangk opmaache wullte met dä Enshtellunge uß dä Dattei <code lang="en">LocalSettings</code> udder uß dä Dattei <code lang="en">LocalSettings</code> un et hät nit jeflupp. Bes esu joot un dat repareere un versöhg et dann norr_ens.
@@ -11134,7 +11484,7 @@ Heh jeihd et nit wigger.',
'config-using531' => 'MediaWiki läuf nit met PHP $1 zosamme wääje enem [//bugs.php.net/bug.php?id=50394 Fähler em Zosammehang met Parrameetere för <code lang="en">__call()</code>].
Jangk op de Version 5.3.2 vum <i lang="en">PHP</i> ov dohnoh, udder op de Version 5.3.0 udder dovöör, öm dat Problem ze ömjonn.
Heh jeiht et nit wigger.',
- 'config-suhosin-max-value-length' => '<i lang="en">Suhosin</i> es enschtalleet. Dröm kann ene <code lang="en">GET</code>-Parrameeter nit övver {{PLURAL:$1|ei Byte|$q Bytes|noll Byte}} lang wääde. En MediaWiki singe <i lang="en">ResourceLoader</i> kütt doh zwa drömeröm, ävver dat brems. Wann müjelesch, doht <code lang="en">suhosin.get.max_value_length</code> en dä Dattei <code lang="en">php.ini</code> op 1024 Bytes udder drövver enschtälle. un dann moß <code lang="en">$wgResourceLoaderMaxQueryLength</code> en dä Dattei <code lang="en">LocalSettings.php</code> op däsälve Wäät jesaz wääde.',
+ 'config-suhosin-max-value-length' => '<i lang="en">Suhosin</i> es enschtalleet. Dröm kann ene <code lang="en">GET</code>-Parrameeter nit övver {{PLURAL:$1|ei Byte|$q Bytes|noll Byte}} lang wääde. En MediaWiki singe <i lang="en">ResourceLoader</i> kütt doh zwa drömeröm, ävver dat brems. Wann müjelesch, doht <code lang="en">suhosin.get.max_value_length</code> en dä Dattei <code lang="en">php.ini</code> op 1024 Bytes udder drövver enschtälle. un dann moß <code lang="en">$wgResourceLoaderMaxQueryLength</code> en dä Dattei <code lang="en">LocalSettings.php</code> op däsälve Wäät jesaz wääde.', # Fuzzy
'config-db-type' => 'De Zoot Daatebangk:',
'config-db-host' => 'Dä Name vun däm Rääschner met dä Daatebangk:',
'config-db-host-help' => 'Wann Dinge ẞööver för de Daatebangk ob enem andere Rääschner es, donn heh dämm singe Name udder dämm sing <i lang="en">IP</i>-Addräß enjävve.
@@ -11226,7 +11576,7 @@ Wann dat Daatebangk_Süßteem, wat De nämme wells, onge nit dobei es, dann donn
'config-support-postgres' => '* <i lang="en">$1</i> es e bikannt Daatebangksüßteem met offe Quälltäxde, un en och en Wahl nävve <i lang="en">MySQL</i> ([http://www.php.net/manual/de/pgsql.installation.php Aanleidung för et Övversäze un Enreeschte von PHP met <i lang="en">PostgreSQL</i> dobei, op Deutsch]) Et sinn_er ävver paa klein Fählershe bekannt, um kunne dat em Momang för et reschtijje Werke nit emfähle.',
'config-support-sqlite' => '* <i lang="en">$1</i> es e eijfach Daatebangksüßteem, wat joot ongershtöz weed. ([http://www.php.net/manual/de/pdo.installation.php Aanleidong för et Övversäze un Enreeschte von PHP met <i lang="en">SQLite</i> dobei, op Deutsch])',
'config-support-oracle' => '* <i lang="en">$1</i> es e jeschäfflesch Daatebangksüßteem för Ferme. ([http://www.php.net/manual/de/oci8.installation.php Aanleidong för et Övversäze un Enreeschte von PHP met <i lang="en">OCI8</i> dobei, op Deutsch])',
- 'config-support-ibm_db2' => '* $1 es en Datebengk för et Jeschäff un fö Ongernehme.',
+ 'config-support-ibm_db2' => '* $1 es en Datebengk för et Jeschäff un fö Ongernehme.', # Fuzzy
'config-header-mysql' => 'De Enshtällunge för de <i lang="en">MySQL</i> Daatebangk',
'config-header-postgres' => 'De Enshtällunge för de <i lang="en">PostgreSQL</i> Daatebangk',
'config-header-sqlite' => 'De Enshtällunge för de <i lang="en">SQLite</i> Daatebangk',
@@ -11290,7 +11640,7 @@ Dat dom_mer ävver '''nit vörschlonn'''em Jääjedeil, ußer, wann et Probleme
Mer kann dat Wiki jäz [$1 bruche].',
'config-regenerate' => 'Donn de Dattei <code lang="en">LocalSettings.php</code> neu opsäze →',
- 'config-show-table-status' => 'Et Kommando <code lang="en">SHOW TABLE STATUS</code> aan de Daatebangk es donävve jejange!',
+ 'config-show-table-status' => 'Et Kommando <code lang="en"><code>SHOW TABLE STATUS</code></code> aan de Daatebangk es donävve jejange!',
'config-unknown-collation' => "'''Opjepaß:''' De Daatabangk deiht en onbikannte Reijefollsch bruche, för Booshtaabe un Zeishe ze verjliishe un ze zotteere.",
'config-db-web-account' => 'Dä Zohjang zor Daatebangk för et Wiki',
'config-db-web-help' => 'Donn ene Name un e Paßwoot för der Zohjang zor Daatebangk för et Wiki em nomaale Bedrief aanjävve.',
@@ -11363,7 +11713,7 @@ Do künnts jez der Räß vun de einzel Enshtellunge övverjonn, un et Wiki tirä
'config-optional-continue' => 'De wells noch mieh Frore jeshtallt krijje un noch mieh Enshtällunge maache?',
'config-optional-skip' => 'Nä, lohß dä Ömshtand, donn eifarr_et Wiki opsäze.',
'config-profile' => 'Enshtällunge för de Metmaacher ier Rääschte:',
- 'config-profile-wiki' => 'E tradizjonäll offe Wiki',
+ 'config-profile-wiki' => 'E tradizjonäll offe Wiki', # Fuzzy
'config-profile-no-anon' => 'Schriever möße enlogge',
'config-profile-fishbowl' => 'Bloß ußdröcklesch zohjelohße Schriever',
'config-profile-private' => 'E jeschloße Privat_Wiki',
@@ -11381,7 +11731,7 @@ Esu häß De de Wahl:
'''{{int:config-profile-private}}''' kann nur lässe, wäh en et Wiki zohjelohße es, un desellve Jropp kann uch schrieve.
-Noch ander un un opwändijere Enshtellunge för de Rääschte sin müjjelesch, wann et Wiki ens aam Loufe es. Loor Der doför de [//www.mediawiki.org/wiki/Manual:User_rights zopaß Hölp em Handbooch] aan.",
+Noch ander un un opwändijere Enshtellunge för de Rääschte sin müjjelesch, wann et Wiki ens aam Loufe es. Loor Der doför de [//www.mediawiki.org/wiki/Manual:User_rights zopaß Hölp em Handbooch] aan.", # Fuzzy
'config-license' => 'Urhävverrääsch un Lizänz:',
'config-license-none' => 'Kein Fooßreih övver de Lizänz',
'config-license-cc-by-sa' => '<i lang="en">Creative Commons</i> Der Name moß jenannt sin, et Wiggerjävve es zohjelohße onger dersellve Bedengunge',
@@ -11464,7 +11814,7 @@ Do kann se heh un jez aanschallde, ävver se künnte noch zohsäzlesch Enshtellu
Et sühd esu uß, wi wann De MediaWiki ald enshtalleet hätß, un wöhrs aam Versöhke, dat norr_ens ze donn.
Jang wigger op de näähßte Sigg.",
'config-install-begin' => 'Wann De op „{{int:config-continue}}“ klecks, jeiht de Enshtallazjuhn vum MediaWiki loßß.
-Wann De noch Änderonge maache wells, dann kleck op „{{int:config-back}}“.',
+Wann De noch Änderonge maache wells, dann kleck op „{{int:config-back}}“.', # Fuzzy
'config-install-step-done' => 'jedonn',
'config-install-step-failed' => 'donävve jejange',
'config-install-extensions' => 'Zohsazprojramme enjeschloße',
@@ -11531,7 +11881,7 @@ Wann De mem Ronger- un widder Huhlaade fäädesh bes, kanns De '''[\$2 en Ding W
Dat es och all op Änglesch:
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
);
/** Kurdish (Latin script) (Kurdî (latînî)‎)
@@ -11571,6 +11921,7 @@ $messages['lad'] = array(
/** Luxembourgish (Lëtzebuergesch)
* @author Robby
+ * @author ì•„ë¼
*/
$messages['lb'] = array(
'config-desc' => 'Den Installatiounsprogramm vu MediaWiki',
@@ -11578,12 +11929,12 @@ $messages['lb'] = array(
'config-information' => 'Informatioun',
'config-localsettings-upgrade' => "'''Opgepasst''': E Fichier <code>LocalSettings.php</code> gouf fonnt.
Är Software kann aktualiséiert ginn, setzt w.e.g. de Wäert vum <code>\$wgUpgradeKey</code> an d'Këscht.
-Dir fannt en am LocalSettings.php.",
+Dir fannt en am <code>LocalSettings.php</code>.",
'config-localsettings-key' => 'Aktualisatiounsschlëssel:',
'config-localsettings-badkey' => 'De Schlëssel deen Dir aginn hutt ass net korrekt',
- 'config-localsettings-incomplete' => 'De Fichier LocalSettings.php schéngt net komplett ze sinn.
+ 'config-localsettings-incomplete' => 'De Fichier <code>LocalSettings.php</code> schéngt net komplett ze sinn.
D\'Variabel $1 ass net definéiert.
-Ännert w.e.g. de Fichier LocalSettings.php esou datt déi Variabel definéiert ass a klickt op "Virufueren".',
+Ännert w.e.g. de Fichier <code>LocalSettings.php</code> esou datt déi Variabel definéiert ass a klickt op "{{int:Config-continue}}".',
'config-session-error' => 'Feeler beim Starte vun der Sessioun: $1',
'config-no-session' => "D'Donnéeë vun ärer Sessioun si verluergaangen!
Kuckt Är php.ini no a vergewëssert Iech datt <code>session.save_path</code> op adequate REpertoire agestallt ass.",
@@ -11676,7 +12027,7 @@ Wann et de Kont net gëtt, a wann den Installatiouns-Kont genuch Rechter huet, g
'config-type-sqlite' => 'SQLite',
'config-type-oracle' => 'Oracle',
'config-type-ibm_db2' => 'IBM DB2',
- 'config-support-ibm_db2' => '* $1 ass eng kommerziell Firma fir Datebanken',
+ 'config-support-ibm_db2' => '* $1 ass eng kommerziell Firma fir Datebanken', # Fuzzy
'config-header-mysql' => 'MySQL-Astellungen',
'config-header-postgres' => 'PostgreSQL-Astellungen',
'config-header-sqlite' => 'SQLite-Astellungen',
@@ -11696,7 +12047,7 @@ E gëtt fir den Numm vum SQLite Date-Fichier benotzt.',
'config-upgrade-done-no-regenerate' => "D'Aktualisatioun ass ofgeschloss.
Dir kënnt elo [$1 ufänken Är Wiki ze benotzen]",
- 'config-regenerate' => 'LocalSettings.php regeneréieren →',
+ 'config-regenerate' => '<code>LocalSettings.php</code> regeneréieren →',
'config-db-web-account' => 'Datebankkont fir den Accès iwwer de Web',
'config-db-web-account-same' => 'Dee selwechte Kont wéi bei der Installatioun benotzen',
'config-db-web-create' => 'De Kont uleeë wann et e net scho gëtt',
@@ -11734,7 +12085,7 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
'config-optional-continue' => 'Stellt mir méi Froen.',
'config-optional-skip' => "Ech hunn es genuch, installéier just d'Wiki.",
'config-profile' => 'Profil vun de Benotzerrechter:',
- 'config-profile-wiki' => 'Traditionell Wiki',
+ 'config-profile-wiki' => 'Traditionell Wiki', # Fuzzy
'config-profile-no-anon' => 'Uleeë vun engem Benotzerkont verlaangt',
'config-profile-fishbowl' => 'Nëmmen autoriséiert Editeuren',
'config-profile-private' => 'Privat Wiki',
@@ -11773,7 +12124,7 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
'config-install-sysop' => 'Administrateur Benotzerkont gëtt ugeluecht',
'config-install-extension-tables' => "D'Tabelle fir déi aktivéiert Erweiderunge ginn ugeluecht",
'config-install-mainpage-failed' => "D'Haaptsäit konnt net dragesat ginn: $1",
- 'config-download-localsettings' => 'LocalSettings.php eroflueden',
+ 'config-download-localsettings' => '<code>LocalSettings.php</code> eroflueden',
'config-help' => 'Hëllef',
'config-nofile' => 'De Fichier "$1" gouf net fonnt. Gouf e geläscht?',
'mainpagetext' => "'''MediaWiki gouf installéiert.'''",
@@ -11782,7 +12133,7 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
== Starthëllefen ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Hëllef bei der Konfiguratioun]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]", # Fuzzy
);
/** Lingua Franca Nova (Lingua Franca Nova)
@@ -11831,8 +12182,65 @@ $messages['lo'] = array(
);
/** Lithuanian (lietuvių)
+ * @author Eitvys200
*/
$messages['lt'] = array(
+ 'config-information' => 'Informacija',
+ 'config-your-language' => 'Jūsų kalba:',
+ 'config-wiki-language' => 'Viki kalba:',
+ 'config-back' => '↠Atgal',
+ 'config-continue' => 'Toliau →',
+ 'config-page-language' => 'Kalba',
+ 'config-page-welcome' => 'Sveiki atvykę į MediaWiki!',
+ 'config-page-name' => 'Vardas',
+ 'config-page-options' => 'Parinktys',
+ 'config-page-install' => 'Įdiegti',
+ 'config-page-complete' => 'Baigta!',
+ 'config-page-restart' => 'IÅ¡ naujo paleiskite diegimÄ…',
+ 'config-page-readme' => 'Perskaityk manÄ™',
+ 'config-page-copying' => 'Kopijuojama',
+ 'config-page-upgradedoc' => 'Atnaujinama',
+ 'config-restart' => 'Taip, paleiskite jį iš naujo',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-type-ibm_db2' => 'IBM DB2',
+ 'config-header-mysql' => 'MySQL nustatymai',
+ 'config-header-postgres' => 'PostgreSQL nustatymai',
+ 'config-header-sqlite' => 'SQLite nustatymai',
+ 'config-header-oracle' => 'Oracle nustatymai',
+ 'config-header-ibm_db2' => 'IBM DB2 nustatymai',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Viki pavadinimas:',
+ 'config-site-name-blank' => 'Įveskite svetainės pavadinimą.',
+ 'config-project-namespace' => 'Projekto pavadinimas:',
+ 'config-ns-generic' => 'Projektas',
+ 'config-ns-site-name' => 'Toks pat kaip viki pavadinimas: $1',
+ 'config-admin-box' => 'Administratoriaus paskyra',
+ 'config-admin-name' => 'Jūsų vardas:',
+ 'config-admin-password' => 'Slaptažodis:',
+ 'config-admin-password-confirm' => 'Slaptažodis dar kartą:',
+ 'config-admin-name-blank' => 'Įveskite administratoriaus vartotojo vardą.',
+ 'config-admin-password-blank' => 'Įvesti administratoriaus paskyros slaptažodį.',
+ 'config-admin-password-same' => 'Slaptažodis turi būti ne toks pat, kaip vartotojo vardas.',
+ 'config-admin-password-mismatch' => 'Įvesti slaptažodžiai nesutampa.',
+ 'config-admin-email' => 'El. pašto adresas:',
+ 'config-optional-continue' => 'Paklausti daugiau klausimų.',
+ 'config-optional-skip' => 'Man jau nuobodu, tiesiog įdiekite viki.',
+ 'config-profile' => 'Vartotojo teisių paskyra:',
+ 'config-profile-wiki' => 'TradicinÄ— viki',
+ 'config-profile-private' => 'Privati viki',
+ 'config-license-pd' => 'Viešas Domenas',
+ 'config-email-settings' => 'El. pašto nustatymai',
+ 'config-upload-enable' => 'Įgalinti failų įkėlimus',
+ 'config-logo' => 'Logotipo URL:',
+ 'config-cc-again' => 'Pasirinkti dar kartÄ…...',
+ 'config-extensions' => 'PlÄ—tiniai',
+ 'config-install-step-done' => 'atlikta',
+ 'config-install-step-failed' => 'nepavyko',
+ 'config-install-schema' => 'Kuriama schema',
+ 'config-install-keys' => 'Generuojami slapti raktai',
+ 'config-help' => 'pagalba',
'mainpagetext' => "'''MediaWiki sėkmingai įdiegta.'''",
'mainpagedocfooter' => 'Informacijos apie wiki programinės įrangos naudojimą, ieškokite [//meta.wikimedia.org/wiki/Help:Contents žinyne].
@@ -11840,7 +12248,7 @@ $messages['lt'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigūracijos nustatymų sąrašas]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki DUK]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki pranešimai paštu apie naujas versijas]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki pranešimai paštu apie naujas versijas]', # Fuzzy
);
/** Latvian (latviešu)
@@ -12002,6 +12410,7 @@ $messages['min'] = array(
/** Macedonian (македонÑки)
* @author Bjankuloski06
+ * @author ì•„ë¼
*/
$messages['mk'] = array(
'config-desc' => 'ИнÑталатор на МедијаВики',
@@ -12009,19 +12418,19 @@ $messages['mk'] = array(
'config-information' => 'Информации',
'config-localsettings-upgrade' => 'ВоÑтановена е податотека <code>LocalSettings.php</code>.
За да ја надградите инÑталцијава, внеÑете ја вредноÑта на <code>$wgUpgradeKey</code> во полето подолу.
-Тоа е го најдете во LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Утврдено е приÑуÑтвото на податотеката „LocalSettings.php“.
-За да ја надградите инÑталацијата, пуштете ја „update.php“ намеÑто горенаведената.',
+Тоа е го најдете во <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' => 'ВоÑтановена е поÑтоечка инÑталација на МедијаВики.
-За да ја надградите, вметнете го Ñледниов ред на дното од вашата Ñтраница LocalSettings.php:
+За да ја надградите, вметнете го Ñледниов ред на дното од вашата Ñтраница <code>LocalSettings.php</code>:
$1',
- 'config-localsettings-incomplete' => 'ПоÑтоечката Ñтраница LocalSettings.php е нецелоÑна.
+ 'config-localsettings-incomplete' => 'ПоÑтоечката Ñтраница <code>LocalSettings.php</code> е нецелоÑна.
Ðе е поÑтавена променливата $1.
-Изменете ја Ñтраницата LocalSettings.php така што ќе Ñ Ð·Ð°Ð´Ð°Ð´ÐµÑ‚Ðµ вредноÑÑ‚ на променливата, па ÑтиÑнете на „Продолжи“.',
- 'config-localsettings-connection-error' => 'Се појави грешка при поврзувањето Ñо базата кориÑтејќи ги поÑтавките назначени во LocalSettings.php или AdminSettings.php. ИÑправете ги овие поÑтавки и обидете Ñе повторно.
+Изменете ја Ñтраницата <code>LocalSettings.php</code> така што ќе Ñ Ð·Ð°Ð´Ð°Ð´ÐµÑ‚Ðµ вредноÑÑ‚ на променливата, па ÑтиÑнете на „{{int:Config-continue}}“.',
+ 'config-localsettings-connection-error' => 'Се појави грешка при поврзувањето Ñо базата кориÑтејќи ги поÑтавките назначени во <code>LocalSettings.php</code> или <code>AdminSettings.php</code>. ИÑправете ги овие поÑтавки и обидете Ñе повторно.
$1',
'config-session-error' => 'Грешка при започнување на ÑеÑијата: $1',
@@ -12154,7 +12563,7 @@ $1
Ðадградете го на PHP 5.2.9 и libxml2 2.7.3 или нивни понови верзии! ПРЕКИÐУВÐÐœ ([//bugs.php.net/bug.php?id=45996 грешката е заведена во PHP]).',
'config-using531' => 'МедијаВики не може да Ñе кориÑти Ñо PHP $1 поради грешка кај упатните параметри за <code>__call()</code>.
За да го решите проблемот, надградете го на PHP 5.3.2 или понова верзија, или пак кориÑтете го поÑтариот PHP 5.3.0.',
- 'config-suhosin-max-value-length' => 'Suhosin е инÑталиран и ја ограничува должината на параметарот GET на $1 bytes. Делот ResourceLoader на МедијаВики ќе ја заобиколува ова граница, но Ñо тоа ќе Ñе влоши делотворноÑта. Ðко е воопшто можно, на suhosin.get.max_value_length треба да го намеÑтите на 1024 или поевеќе во php.ini , и да му ја зададете иÑтата вредноÑÑ‚ на $wgResourceLoaderMaxQueryLength во LocalSettings.php .',
+ 'config-suhosin-max-value-length' => 'Suhosin е инÑталиран и ја ограничува должината на параметарот GET на $1 бајти. Делот ResourceLoader на МедијаВики ќе ја заобиколува ова граница, но Ñо тоа ќе Ñе влоши делотворноÑта. Ðко е воопшто можно, на <code>suhosin.get.max_value_length</code> треба да го намеÑтите на 1024 или повеќе во <code>php.ini</code>, и да му ја зададете иÑтата вредноÑÑ‚ на <code>$wgResourceLoaderMaxQueryLength</code> во <code>LocalSettings.php</code>.',
'config-db-type' => 'Тип на база:',
'config-db-host' => 'Домаќин на базата:',
'config-db-host-help' => 'Ðко вашата база е на друг опÑлужувач, тогаш тука внеÑете го името на домаќинот или IP-адреÑата.
@@ -12238,7 +12647,7 @@ $1
'config-support-postgres' => '* $1 е популарен ÑиÑтем на бази на податоци Ñо отворен код кој претÑтавува алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php како да ÑоÑтавите PHP Ñо поддршка за PostgreSQL]). Може Ñè уште да има некои грешки. па затоа не Ñе препорачува за употреба во производна Ñредина.',
'config-support-sqlite' => '* $1 е леÑен ÑиÑтем за бази на податоци кој е многу добро поддржан. ([http://www.php.net/manual/en/pdo.installation.php Како да ÑоÑтавите PHP Ñо поддршка за SQLite], кориÑти PDO)',
'config-support-oracle' => '* $1 е база на податоци на комерцијално претпријатие. ([http://www.php.net/manual/en/oci8.installation.php Како да ÑоÑтавите PHP Ñо поддршка за OCI8])',
- 'config-support-ibm_db2' => '* $1 is комерцијална база на податоциза фирми.',
+ 'config-support-ibm_db2' => '* $1 е комерцијална база на податоциза фирми. ([http://www.php.net/manual/en/ibm-db2.installation.php Како да ÑоÑтавите PHP Ñо поддршка за IBM DB2])',
'config-header-mysql' => 'Ðагодувања на MySQL',
'config-header-postgres' => 'Ðагодувања на PostgreSQL',
'config-header-sqlite' => 'Ðагодувања на SQLite',
@@ -12305,8 +12714,8 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'Ðадградбата заврши.
Сега можете да [$1 почнете да го кориÑтите викито].',
- 'config-regenerate' => 'ПреÑоздај LocalSettings.php →',
- 'config-show-table-status' => 'Барањето SHOW TABLE STATUS не уÑпеа!',
+ 'config-regenerate' => 'ПреÑоздај <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'Барањето <code>SHOW TABLE STATUS</code> не уÑпеа!',
'config-unknown-collation' => "'''Предупредување:''' Базата кориÑни непрепознаена упатна Ñпоредба.",
'config-db-web-account' => 'Сметка на базата за мрежен приÑтап',
'config-db-web-help' => 'Одберете кориÑничко име и лозинка што ќе ги кориÑти мрежниот опÑлужувач за поврзување Ñо опÑлужувачот на базта на податоци во текот на редовната работа Ñо викито.',
@@ -12378,7 +12787,7 @@ chmod a+w $3</pre>',
'config-optional-continue' => 'ПоÑтави ми повеќе прашања.',
'config-optional-skip' => 'Веќе ми здоÑади, дај Ñамо инÑталирај го викито.',
'config-profile' => 'Профил на кориÑнички права:',
- 'config-profile-wiki' => 'Традиционално вики',
+ 'config-profile-wiki' => 'Отворено вики',
'config-profile-no-anon' => 'Задолжително отворање Ñметка',
'config-profile-fishbowl' => 'Само овлаÑтени уредници',
'config-profile-private' => 'Приватно вики',
@@ -12388,7 +12797,7 @@ chmod a+w $3</pre>',
Многумина имаат најдено најразлични полезни примени за МедијаВики, но понекогаш не е леÑно да убедите некого во предноÑтите на вики-концептот.
Значи имате избор.
-'''{{int:config-profile-wiki}}''' — Ñекој може да го уредува, дури и без најавување.
+'''{{int:config-profile-wiki}}''' — модел Ñпоред кој Ñекој може да уредува, дури и без најавување.
Ðко имате вики Ñо '''задолжително отворање на Ñметка''', тогаш добивате повеќе контрола, но ова може даги одврати Ñпонтаните учеÑници.
'''{{int:config-profile-fishbowl}}''' — може да уредуваат Ñамо уредници што имаат добиено дозвола за тоа, но јавноÑта може да ги гледа Ñтраниците, вклучувајќи ја нивната иÑторија.
@@ -12397,13 +12806,13 @@ chmod a+w $3</pre>',
По инÑталацијата имате на избор и поÑложени кориÑнички права и поÑтавки. Погледајте во [//www.mediawiki.org/wiki/Manual:User_rights прирачникот].",
'config-license' => 'ÐвторÑки права и лиценца:',
'config-license-none' => 'Без подножје за лиценца',
- 'config-license-cc-by-sa' => 'Creative Commons ÐаведиИзвор СподелиПодИÑтиУÑлови',
+ 'config-license-cc-by-sa' => 'Криејтив ÐºÐ¾Ð¼Ð¾Ð½Ñ ÐаведиИзвор СподелиПодИÑтиУÑлови',
'config-license-cc-by' => 'Криејтив ÐºÐ¾Ð¼Ð¾Ð½Ñ ÐаведиИзвор',
- 'config-license-cc-by-nc-sa' => 'Creative Commons ÐаведиИзвор-Ðекомерцијално-СподелиПодИÑтиУÑлови',
+ 'config-license-cc-by-nc-sa' => 'Криејтив ÐºÐ¾Ð¼Ð¾Ð½Ñ ÐаведиИзвор-Ðекомерцијално-СподелиПодИÑтиУÑлови',
'config-license-cc-0' => 'Криејтив ÐºÐ¾Ð¼Ð¾Ð½Ñ Ðула (јавна ÑопÑтвеноÑÑ‚)',
'config-license-gfdl' => 'ГÐУ-ова лиценца за Ñлободна документација 1.3 или понова',
'config-license-pd' => 'Јавна ÑопÑтвеноÑÑ‚',
- 'config-license-cc-choose' => 'Одберете друга Creative Commons лиценца по ваш избор',
+ 'config-license-cc-choose' => 'Одберете друга лиценца на Криејтив ÐºÐ¾Ð¼Ð¾Ð½Ñ Ð¿Ð¾ ваш избор',
'config-license-help' => "Многу јавни викија ги Ñтаваат Ñите придонеÑи под [http://freedomdefined.org/Definition Ñлободна лиценца].
Со ова Ñе Ñоздава атмоÑфера на општа ÑопÑтвеноÑÑ‚ и поттикнува долгорочно учеÑтво.
Ова не е неопходно за викија на поединечни физички или правни лица.
@@ -12451,10 +12860,10 @@ chmod a+w $3</pre>',
За да може ова да работи, МедијаВики бара приÑтап до интернет.
За повеќе информации за оваа функција и напатÑтвија за нејзино поÑтавување на вики (Ñите други оÑвен Ризницата), коноÑултирајте го [//mediawiki.org/wiki/Manual:$wgForeignFileRepos прирачникот].',
- 'config-cc-error' => 'Изборникот на Creative Commons лиценца не даде резултати.
+ 'config-cc-error' => 'Изборникот на лиценци од Криејтив ÐºÐ¾Ð¼Ð¾Ð½Ñ Ð½Ðµ даде резултати.
ВнеÑете го името на лиценцата рачно.',
'config-cc-again' => 'Одберете повторно...',
- 'config-cc-not-chosen' => 'Одберете ја Ñаканата Creative Commons лиценца и кликнете на „продолжи“.',
+ 'config-cc-not-chosen' => 'Одберете ја Ñаканата лиценца од Криејтив ÐºÐ¾Ð¼Ð¾Ð½Ñ Ð¸ ÑтиÑнете на „продолжи“.',
'config-advanced-settings' => 'Ðапредни нагодувања',
'config-cache-options' => 'Ðагодувања за кеширање на објекти:',
'config-cache-help' => 'Кеширањето на објекти Ñе кориÑти за зголемување на брзината на МедијаВики Ñо кеширање на чеÑто употребуваните податоци.
@@ -12479,7 +12888,7 @@ chmod a+w $3</pre>',
'config-install-alreadydone' => "'''Предупредување:''' Изгледа дека веќе го имате инÑталирано МедијаВики и Ñега Ñакате да го инÑталирате повторно.
Продолжете на Ñледната Ñтраница.",
'config-install-begin' => 'СтиÑкајќи на „{{int:config-continue}}“ ќе ја започнете инÑталацијата на МедијаВики.
-Ðко Ñакате да направите измени во доÑегашното, ÑтиÑнете на „Ðазад“.',
+Ðко Ñакате да направите измени во доÑегашното, ÑтиÑнете на „{{int:config-back}}“.',
'config-install-step-done' => 'готово',
'config-install-step-failed' => 'не уÑпеа',
'config-install-extensions' => 'Вклучувам додатоци',
@@ -12535,7 +12944,7 @@ $3
'''Ðапомена''': Ðко ова не го направите Ñега, податотеката Ñо поÑтавки повеќе нема да биде на доÑтапна.
Откога ќе завршите Ñо тоа, можете да '''[$2 влезете на вашето вики]'''.",
- 'config-download-localsettings' => 'Преземи го LocalSettings.php',
+ 'config-download-localsettings' => 'Преземи го <code>LocalSettings.php</code>',
'config-help' => 'помош',
'config-nofile' => 'Податотеката „$1“ не е пронајдена. Да не е избришана?',
'mainpagetext' => "'''МедијаВики е уÑпешно инÑталиран.'''",
@@ -12544,7 +12953,8 @@ $3
==Од каде да почнете==
* [//meta.wikimedia.org/wiki/Manual:Configuration_settings СпиÑок на нагодувања]
* [//meta.wikimedia.org/wiki/Manual:FAQ ЧПП (чеÑто поÑтавувани прашања) за МедијаВики].
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ПоштенÑки ÑпиÑок на МедијаВики за нови верзии]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce ПоштенÑки ÑпиÑок на МедијаВики за нови верзии]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Локализирајте го МедијаВики на вашиот јазик]',
);
/** Malayalam (മലയാളം)
@@ -12614,7 +13024,7 @@ $1
'config-connection-error' => '$1.
താഴെ നൽകിയിരികàµà´•àµà´¨àµà´¨ ഹോസàµà´±àµà´±àµ, ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚, രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´Žà´¨àµà´¨à´¿à´µ പരിശോധിചàµà´šàµ വീണàµà´Ÿàµà´‚ à´¶àµà´°à´®à´¿à´•àµà´•àµà´•.',
- 'config-regenerate' => 'LocalSettings.php à´ªàµà´¨à´ƒà´¸àµƒà´·àµà´Ÿà´¿à´•àµà´•àµà´• →',
+ 'config-regenerate' => '<code>LocalSettings.php</code> à´ªàµà´¨à´ƒà´¸àµƒà´·àµà´Ÿà´¿à´•àµà´•àµà´• →',
'config-mysql-engine' => 'à´¸àµà´±àµà´±àµ‹à´±àµ‡à´œàµ എൻജിൻ:',
'config-site-name' => 'വികàµà´•à´¿à´¯àµà´Ÿàµ† പേരàµ:',
'config-site-name-help' => 'ഇതൠബàµà´°àµ—സറിനàµà´±àµ† ടൈറàµà´±à´¿àµ½ ബാറിലàµà´‚ മറàµà´±à´¨àµ‡à´•à´‚ ഇടങàµà´™à´³à´¿à´²àµà´‚ à´ªàµà´°à´¦àµ¼à´¶à´¿à´ªàµà´ªà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´‚.',
@@ -12646,7 +13056,7 @@ $1
ബാകàµà´•à´¿à´¯àµà´³àµà´³à´µ അവഗണിചàµà´šàµ വികàµà´•à´¿ ഇൻസàµà´±àµà´±àµ‹àµ¾ ചെയàµà´¯à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµ.',
'config-optional-continue' => 'കൂടàµà´¤àµ½ ചോദàµà´¯à´™àµà´™àµ¾ ചോദികàµà´•àµ‚.',
'config-optional-skip' => 'എനികàµà´•àµ മടàµà´¤àµà´¤àµ, à´’à´¨àµà´¨àµ ഇൻസàµà´±àµà´±àµ‹àµ¾ ചെയàµà´¤àµ തീർകàµà´•àµ.',
- 'config-profile-wiki' => 'പരമàµà´ªà´°à´¾à´—à´¤ വികàµà´•à´¿',
+ 'config-profile-wiki' => 'പരമàµà´ªà´°à´¾à´—à´¤ വികàµà´•à´¿', # Fuzzy
'config-profile-no-anon' => 'à´…à´‚à´—à´¤àµà´µ സൃഷàµà´Ÿà´¿ ചെയàµà´¯àµ‡à´£àµà´Ÿà´¤àµà´£àµà´Ÿàµ',
'config-profile-fishbowl' => 'à´…à´¨àµà´µà´¾à´¦à´®àµà´³àµà´³à´µàµ¼ മാതàµà´°à´‚ തിരàµà´¤àµà´¤àµà´•',
'config-profile-private' => 'à´¸àµà´µà´•à´¾à´°àµà´¯ വികàµà´•à´¿',
@@ -12700,7 +13110,7 @@ $3
== à´ªàµà´°à´¾à´°à´‚ഭസഹായികൾ ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•]
* [//www.mediawiki.org/wiki/Manual:FAQ മീഡിയവികàµà´•à´¿ പതിവàµà´šàµ‹à´¦àµà´¯à´™àµà´™àµ¾]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce മീഡിയവികàµà´•à´¿ à´ªàµà´°à´•à´¾à´¶à´¨ മെയിലിങൠലിസàµà´±àµà´±àµ]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce മീഡിയവികàµà´•à´¿ à´ªàµà´°à´•à´¾à´¶à´¨ മെയിലിങൠലിസàµà´±àµà´±àµ]', # Fuzzy
);
/** Mongolian (монгол)
@@ -12732,8 +13142,19 @@ $messages['mr'] = array(
/** Malay (Bahasa Melayu)
* @author Anakmalaysia
+ * @author Pizza1016
*/
$messages['ms'] = array(
+ 'config-desc' => 'Pemasang MediaWiki',
+ 'config-title' => 'Pasangan MediaWiki $1',
+ 'config-information' => 'Maklumat',
+ 'config-localsettings-key' => 'Kunci naik taraf:',
+ 'config-localsettings-badkey' => 'Kunci yang anda berikan tidak betul.',
+ 'config-session-error' => 'Ralat ketika memulakan sesi: $1',
+ 'config-your-language' => 'Bahasa kamu:',
+ 'config-your-language-help' => 'Pilihkan bahasa untuk digunakan dalam proses pemasangan ini.',
+ 'config-wiki-language' => 'Bahasa wiki:',
+ 'config-wiki-language-help' => 'Pilih bahasa utama wiki yang bakal dicipta ini.',
'config-back' => '↠Undur',
'config-continue' => 'Teruskan →',
'config-page-language' => 'Bahasa',
@@ -12744,6 +13165,13 @@ $messages['ms'] = array(
'config-page-name' => 'Nama',
'config-page-options' => 'Pilihan',
'config-page-install' => 'Pasang',
+ 'config-page-complete' => 'Selesai!',
+ 'config-page-restart' => 'Mulakan semula pemasangan',
+ 'config-page-readme' => 'Baca saya',
+ 'config-page-releasenotes' => 'Catatan keluaran',
+ 'config-page-copying' => 'Sedang menyalin',
+ 'config-page-upgradedoc' => 'Sedang menaik taraf',
+ 'config-page-existingwiki' => 'Wiki sedia ada',
'config-env-php' => 'PHP $1 dipasang.',
'config-env-php-toolow' => 'PHP $1 dipasang.
Bagaimanapun, MediaWiki memerlukan PHP $2 ke atas.',
@@ -12751,6 +13179,14 @@ Bagaimanapun, MediaWiki memerlukan PHP $2 ke atas.',
'config-unicode-using-intl' => '[http://pecl.php.net/intl Sambungan intl PECL] digunakan untuk penormalan Unicode.',
'config-db-charset' => 'Peranggu aksara pangkalan data',
'config-type-ibm_db2' => 'IBM DB2',
+ 'config-header-mysql' => 'Keutamaan MySQL',
+ 'config-header-postgres' => 'Keutamaan PostgreSQL',
+ 'config-header-sqlite' => 'Keutamaan SQLite',
+ 'config-header-oracle' => 'Keutamaan Oracle',
+ 'config-header-ibm_db2' => 'Keutamaan IBM DB2',
+ 'config-invalid-db-type' => 'Jenis pangkalan data tidak sah',
+ 'config-db-web-account-same' => 'Gunakan akaun yang sama seperti dalam pemasangan',
+ 'config-db-web-create' => 'Ciptakan akaun jika belum wujud',
'config-mysql-engine' => 'Enjin storan:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
@@ -12765,19 +13201,26 @@ Bagaimanapun, MediaWiki memerlukan PHP $2 ke atas.',
'config-ns-site-name' => 'Sama dengan nama wiki: $1',
'config-ns-other' => 'Lain-lain (nyatakan)',
'config-ns-other-default' => 'MyWiki',
+ 'config-admin-box' => 'Akaun penyelia',
+ 'config-admin-name' => 'Nama kamu:',
'config-admin-password' => 'Kata laluan:',
+ 'config-admin-password-confirm' => 'Kata laluan lagi:',
+ 'config-admin-password-mismatch' => 'Kata-kata laluan yang kamu berikan tidak sepadan.',
'config-admin-email' => 'Alamat e-mel:',
+ 'config-admin-error-bademail' => 'Kamu telah memberikan alamat e-mel yang tidak betul.',
+ 'config-optional-skip' => 'Saya sudah bosan, pasangkanlah wiki sahaja.',
'config-license' => 'Hak cipta dan lesen:',
'config-license-none' => 'Tiada pengaki lesen',
'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
'config-license-cc-by' => 'Creative Commons Attribution',
'config-license-cc-by-nc-sa' => 'Creative Commons Attribution Non-Commercial Share Alike',
'config-license-cc-0' => 'Creative Commons Zero (Domain Awam)',
- 'config-license-gfdl' => 'Lesen Dokumentasi Bebas GNU 1.3 ke atas',
+ 'config-license-gfdl' => 'Lesen Dokumentasi Bebas GNU 1.3 atau ke atas',
'config-license-pd' => 'Domain Awam',
'config-email-settings' => 'Tetapan e-mel',
'config-install-step-done' => 'siap',
'config-install-step-failed' => 'gagal',
+ 'config-install-user-alreadyexists' => 'Pengguna "$1" sudah wujud',
'config-help' => 'bantuan',
'mainpagetext' => "'''MediaWiki telah berjaya dipasang.'''",
'mainpagedocfooter' => 'Sila rujuk [//meta.wikimedia.org/wiki/Help:Contents Panduan Penggunaan] untuk maklumat mengenai penggunaan perisian wiki ini.
@@ -12786,13 +13229,23 @@ Bagaimanapun, MediaWiki memerlukan PHP $2 ke atas.',
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Senarai tetapan konfigurasi]
* [//www.mediawiki.org/wiki/Manual:FAQ Soalan Lazim MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Senarai mel bagi keluaran MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Senarai mel bagi keluaran MediaWiki]', # Fuzzy
);
/** Maltese (Malti)
* @author Chrisportelli
*/
$messages['mt'] = array(
+ 'config-title' => "Installazzjoni ta' MediaWiki $1",
+ 'config-information' => 'Informazzjoni',
+ 'config-localsettings-key' => 'Ċavetta tal-aġġornament:',
+ 'config-localsettings-badkey' => 'Iċ-ċavetta li tajt hija ħażina.',
+ 'config-your-language' => 'Il-lingwa tiegħek:',
+ 'config-your-language-help' => "Agħżel lingwa li tixtieq tuża' matul il-proċess ta' installazzjoni.",
+ 'config-wiki-language' => 'Lingwi tal-wiki:',
+ 'config-wiki-language-help' => 'Agħżel il-lingwa li l-wiki se tkun l-aktar użata fil-wiki.',
+ 'config-back' => '↠Lura',
+ 'config-continue' => 'Kompli →',
'config-page-language' => 'Lingwa',
'config-page-welcome' => 'Merħba fuq MediaWiki!',
'config-page-dbconnect' => 'Aqbad mad-databażi',
@@ -12805,13 +13258,77 @@ $messages['mt'] = array(
'config-page-restart' => "Erġa' ibda l-installazzjoni",
'config-page-readme' => 'Aqrani',
'config-page-releasenotes' => 'Noti tal-verżjoni',
+ 'config-page-upgradedoc' => 'AÄ¡Ä¡ornament',
+ 'config-page-existingwiki' => 'Wiki eżistenti',
+ 'config-restart' => "Iva, erġa' ibda",
+ 'config-env-php' => 'PHP $1 huwa installat.',
+ 'config-db-wiki-settings' => 'Identifika din il-wiki',
+ 'config-db-name' => 'Isem tad-databażi:',
+ 'config-db-install-account' => 'Kont tal-utent għall-installazzjoni',
+ 'config-db-username' => 'Isem tal-utent tad-databażi:',
+ 'config-db-password' => 'Password tad-databażi:',
+ 'config-db-port' => 'Port tad-databażi:',
+ 'config-db-schema' => 'Skema għal MediaWiki:',
+ 'config-db-web-create' => 'Oħloq il-kont jekk għadu ma jeżistix',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-charset' => "Sett ta' karattri tad-databażi:",
+ 'config-mysql-binary' => 'Binarju',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Isem tal-wiki:',
+ 'config-site-name-help' => "Dan se jidher fil-barra tat-titlu tal-browżer u f'diversi postijiet oħra.",
+ 'config-site-name-blank' => 'Daħħal isem tas-sit.',
+ 'config-project-namespace' => 'Spazju tal-isem tal-proġett:',
+ 'config-ns-generic' => 'Proġett',
+ 'config-ns-site-name' => 'L-istess bħall-isem tal-wiki: $1',
+ 'config-ns-other' => 'Oħrajn (speċifika)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-ns-invalid' => 'L-ispazju speċifikat "<nowiki>$1</nowiki>" huwa ħażin.
+Speċifika spazju tal-isem tal-proġett differenti.',
+ 'config-ns-conflict' => 'L-ispazju speċifikat "<nowiki>$1</nowiki>" joħloq kunflitt ma\' spazju tal-isem ieħor tal-MediaWiki.
+Speċifika spazju tal-isem tal-proġett differenti.',
+ 'config-admin-box' => 'Kont tal-amministratur',
+ 'config-admin-name' => 'Ismek:',
+ 'config-admin-password' => 'Password:',
+ 'config-admin-password-confirm' => "Erġa' daħħal il-password:",
+ 'config-admin-help' => 'Daħħal l-isem tal-utent preferit hawnhekk, per eżempju "Joe Borg".
+Dan huwa l-isem li se tuża\' kull darba li tidħol fil-wiki.',
+ 'config-admin-name-blank' => 'Daħħal isem tal-utent għall-amministratur.',
+ 'config-admin-name-invalid' => 'L-isem tal-utent speċifikat "<nowiki>$1</nowiki>" huwa ħażin.
+Speċifika isem tal-utent differenti.',
+ 'config-admin-password-blank' => 'Daħħal password għall-kont tal-amministratur.',
+ 'config-admin-password-same' => 'Il-password ma tistax tkun l-istess bħall-isem tal-utent.',
+ 'config-admin-password-mismatch' => 'Il-passwords li daħħalt ma jaqblux.',
+ 'config-admin-email' => 'Indirizz elettroniku:',
+ 'config-admin-error-bademail' => 'Daħħalt indirizz elettroniku ħażin.',
+ 'config-almost-done' => "Kważi lest!
+Jekk trid tista' taqbeż il-parti li jmiss tal-konfigurazzjoni u sempliċiment tinstalla l-wiki.",
+ 'config-optional-continue' => 'Staqsini aktar mistoqsijiet.',
+ 'config-optional-skip' => 'Xbajt diġà, installa l-wiki.',
+ 'config-profile-wiki' => 'Wiki tradizzjonali', # Fuzzy
+ 'config-profile-no-anon' => 'Huwa obbligatorju l-ħolqien tal-kont',
+ 'config-profile-fishbowl' => 'Edituri awtorizzati biss',
+ 'config-profile-private' => 'Wiki privata',
+ 'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
+ 'config-license-cc-by' => 'Creative Commons Attribution',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Attribution Non-Commercial Share Alike',
+ 'config-license-cc-0' => 'Creative Commons Zero (dominju pubbliku)',
+ 'config-license-pd' => 'Dominju pubbliku',
+ 'config-license-cc-choose' => 'Agħżel waħda mil-liċenzji tal-Creative Commons',
+ 'config-upload-deleted' => 'Direttorju għall-fajls imħassra:',
+ 'config-upload-deleted-help' => "Agħżel direttorju fejn iżżomm fajls imħassra.
+Idealment, dan m'għandux ikun aċċessibbli mill-web.",
+ 'config-logo' => 'URL tal-logo:',
+ 'config-download-localsettings' => 'Niżżel <code>LocalSettings.php</code>',
+ 'config-help' => 'għajnuna',
+ 'config-nofile' => 'Il-fajl "$1" ma setax jinstab. Dan ġie mħassar?',
'mainpagetext' => "'''MediaWiki ġie installat b'suċċess.'''",
'mainpagedocfooter' => "Ikkonsulta l-[//meta.wikimedia.org/wiki/Help:Contents Gwida għall-utenti] sabiex tikseb iktar informazzjoni dwar kif tuża' s-softwer tal-wiki.
== Biex tibda ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista ta' preferenzi għall-konfigurazzjoni]
* [//www.mediawiki.org/wiki/Manual:FAQ Mistoqsijiet rikorrenti fuq il-MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Il-lista tal-posta tħabbar 'l MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Il-lista tal-posta tħabbar 'l MediaWiki]", # Fuzzy
);
/** Burmese (မြန်မာဘာသာ)
@@ -12865,6 +13382,7 @@ $messages['nan'] = array(
/** Norwegian Bokmål (norsk (bokmål)‎)
* @author Event
* @author Nghtwlkr
+ * @author ì•„ë¼
*/
$messages['nb'] = array(
'config-desc' => 'Installasjonsprogrammet for MediaWiki',
@@ -12872,19 +13390,19 @@ $messages['nb'] = array(
'config-information' => 'Informasjon',
'config-localsettings-upgrade' => 'En <code>LocalSettings.php</code>-fil har blitt oppdaget.
For å oppgradere denne installasjonen, skriv inn verdien av <code>$wgUpgradeKey</code> i boksen nedenfor.
-Du finner denne i LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => "Filen ''LocalSettings.php'' er funnet.
+Du finner denne i <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => "Filen ''<code>LocalSettings.php</code>'' er funnet.
For å oppgradere denne installasjonen, vennligst kjør ''update.php'' i stedet",
'config-localsettings-key' => 'Oppgraderingsnøkkel:',
'config-localsettings-badkey' => 'Nøkkelen du oppga er feil.',
'config-upgrade-key-missing' => "En eksisterende installasjon av MediaWiki er funnet.
-For å oppgradere denne installasjonen, vær vennlig å legge til følgende linje helt til slutt i din ''LocalSettings.php''-fil:
+For å oppgradere denne installasjonen, vær vennlig å legge til følgende linje helt til slutt i din ''<code>LocalSettings.php</code>''-fil:
$1",
- 'config-localsettings-incomplete' => "Den eksisterende ''LocalSettings.php'' ser ut til å være ufullstendig.
+ 'config-localsettings-incomplete' => "Den eksisterende ''<code>LocalSettings.php</code>'' ser ut til å være ufullstendig.
Variabelen $1 har ingen verdi.
-Vær vennlig å endre ''LocalSettings.php'' slik at variabelen får en verdi, og klikk ''Fortsett''.",
- 'config-localsettings-connection-error' => "Det ble funnet en feil ved tilknytning av databasen med innstillingene i ''LocalSettings.php'' eller ''AdminSettings.php''. Vær vennlig å rette opp disse innstillingene og prøv igjen.
+Vær vennlig å endre ''<code>LocalSettings.php</code>'' slik at variabelen får en verdi, og klikk ''{{int:Config-continue}}''.",
+ 'config-localsettings-connection-error' => "Det ble funnet en feil ved tilknytning av databasen med innstillingene i ''<code>LocalSettings.php</code>'' eller ''<code>AdminSettings.php</code>''. Vær vennlig å rette opp disse innstillingene og prøv igjen.
$1",
'config-session-error' => 'Feil under oppstart av økt: $1',
@@ -13017,7 +13535,7 @@ Installasjon abortert.',
'config-using531' => 'MediaWiki kan ikke brukes med PHP $1 på grunn av en feil med referanseparametere til <code>__call()</code>.
Oppgrader til PHP 5.3.2 eller høyere, eller nedgrader til PHP 5.3.0 for å løse dette.
Installasjonen avbrutt.',
- 'config-suhosin-max-value-length' => 'Suhosin er installert og begrenser GET-parameterlengder til $1 bytes. MediaWiki\'s ResourceLoader-komponent klarer å komme rundt denne begrensningen, med med redusert ytelse. På mulig bør du sette suhosin.get.max_value_length til minst 1024 i php.ini, og sette $wgResourceLoaderMaxQueryLength til samme verdi i LocalSettings.php.',
+ 'config-suhosin-max-value-length' => 'Suhosin er installert og begrenser GET-parameterlengder til $1 bytes. MediaWiki\'s ResourceLoader-komponent klarer å komme rundt denne begrensningen, med med redusert ytelse. På mulig bør du sette <code>suhosin.get.max_value_length</code> til minst 1024 i <code>php.ini</code>, og sette <code>$wgResourceLoaderMaxQueryLength</code> til samme verdi i LocalSettings.php.', # Fuzzy
'config-db-type' => 'Databasetype:',
'config-db-host' => 'Databasevert:',
'config-db-host-help' => 'Hvis databasen kjører på en annen tjenermaskin, skriv inn vertsnavnet eller IP-adressen her.
@@ -13102,7 +13620,7 @@ Hvis du ikke ser databasesystemet du prøver å bruke i listen nedenfor, følg i
'config-support-postgres' => '* $1 er et populært åpen kildekode-databasesystem som er et alternativ til MySQL ([http://www.php.net/manual/en/pgsql.installation.php hvordan kompilere PHP med PostgreSQL-støtte]). Det kan være noen små utestående feil og det anbefales ikke for bruk i et produksjonsmiljø.',
'config-support-sqlite' => '* $1 er et lettvekts-databasesystem som er veldig godt støttet. ([http://www.php.net/manual/en/pdo.installation.php hvordan kompilere PHP med SQLite-støtte], bruker PDO)',
'config-support-oracle' => '* $1 er en kommersiell bedriftsdatabase. ([http://www.php.net/manual/en/oci8.installation.php Hvordan kompilere PHP med OCI8-støtte])',
- 'config-support-ibm_db2' => '* $1 er en kommersiell bedriftsdatabase.',
+ 'config-support-ibm_db2' => '* $1 er en kommersiell bedriftsdatabase.', # Fuzzy
'config-header-mysql' => 'MySQL-innstillinger',
'config-header-postgres' => 'PostgreSQL-innstillinger',
'config-header-sqlite' => 'SQLite-innstillinger',
@@ -13169,8 +13687,8 @@ Dette er '''ikke anbefalt''' med mindre du har problemer med wikien din.",
'config-upgrade-done-no-regenerate' => 'Oppgradering fullført.
Du kan nå [$1 begynne å bruke wikien din].',
- 'config-regenerate' => 'Regenerer LocalSettings.php →',
- 'config-show-table-status' => 'SHOW TABLE STATUS etterspørselen mislyktes!',
+ 'config-regenerate' => 'Regenerer <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => '<code>SHOW TABLE STATUS</code> etterspørselen mislyktes!',
'config-unknown-collation' => "'''Advarsel:''' Databasen bruker en ukjent sortering.",
'config-db-web-account' => 'Databasekonto for nettilgang',
'config-db-web-help' => 'Velg brukernavnet og passordet som nettjeneren skal bruke for å koble til databasetjeneren under ordinær drift av wikien.',
@@ -13234,7 +13752,7 @@ Du kan hoppe over de resterende konfigurasjonene og installere wikien nå.',
'config-optional-continue' => 'Spør meg flere spørsmål.',
'config-optional-skip' => 'Jeg er lei, bare installer wikien.',
'config-profile' => 'Brukerrettighetsprofil:',
- 'config-profile-wiki' => 'Tradisjonell wiki',
+ 'config-profile-wiki' => 'Tradisjonell wiki', # Fuzzy
'config-profile-no-anon' => 'Kontoopprettelse påkrevd',
'config-profile-fishbowl' => 'Kun autoriserte bidragsytere',
'config-profile-private' => 'Privat wiki',
@@ -13250,7 +13768,7 @@ En wiki med '''{{int:config-profile-no-anon}}''' tilbyr ekstra ansvarlighet, men
'''{{int:config-profile-fishbowl}}'''-scenariet tillater godkjente brukere å redigere, mens publikum kan se sider, og også historikken.
En '''{{int:config-profile-private}}''' tillater kun godkjente brukere å se sider, den samme gruppen som får lov til å redigere dem.
-Mer komplekse konfigurasjoner av brukerrettigheter er tilgjengelig etter installasjon, se det [//www.mediawiki.org/wiki/Manual:User_rights relevante manualavsnittet].",
+Mer komplekse konfigurasjoner av brukerrettigheter er tilgjengelig etter installasjon, se det [//www.mediawiki.org/wiki/Manual:User_rights relevante manualavsnittet].", # Fuzzy
'config-license' => 'Opphavsrett og lisens:',
'config-license-none' => 'Ingen lisensbunntekst',
'config-license-cc-by-sa' => 'Creative Commons Navngivelse Del på samme vilkår',
@@ -13311,7 +13829,7 @@ For mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man
'config-install-user-grant-failed' => 'Å gi tillatelse til brukeren «$1» mislyktes: $2',
'config-install-tables' => 'Oppretter tabeller',
'config-install-mainpage-failed' => 'Kunne ikke sette inn hovedside: $1',
- 'config-download-localsettings' => 'Last ned LocalSettings.php',
+ 'config-download-localsettings' => 'Last ned <code>LocalSettings.php</code>',
'config-help' => 'hjelp',
'config-nofile' => 'Filen "$1" ble ikke funnet. Kan den være blitt slettet?',
'mainpagetext' => "'''MediaWiki-programvaren er nå installert.'''",
@@ -13320,7 +13838,7 @@ For mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man
==Ã… starte==
*[//www.mediawiki.org/wiki/Manual:Configuration_settings Oppsettsliste]
*[//www.mediawiki.org/wiki/Manual:FAQ Ofte stilte spørsmål]
-*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]',
+*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]', # Fuzzy
);
/** Low German (Plattdüütsch)
@@ -13365,6 +13883,7 @@ $messages['ne'] = array(
* @author SPQRobin
* @author Siebrand
* @author Tjcool007
+ * @author ì•„ë¼
*/
$messages['nl'] = array(
'config-desc' => 'Het installatieprogramma voor MediaWiki',
@@ -13372,19 +13891,19 @@ $messages['nl'] = array(
'config-information' => 'Gegevens',
'config-localsettings-upgrade' => 'Er is een bestaand instellingenbestand <code>LocalSettings.php</code> gevonden.
Voer de waarde van <code>$wgUpgradeKey</code> in in onderstaande invoerveld om deze installatie bij te werken.
-De instelling is terug te vinden in LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Het bestand LocalSettings.php is al aanwezig.
-Voer update.php uit om deze installatie bij te werken.',
+De instelling is terug te vinden in <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'Het bestand <code>LocalSettings.php</code> is al aanwezig.
+Voer <code>update.php</code> uit om deze installatie bij te werken.',
'config-localsettings-key' => 'Upgradesleutel:',
'config-localsettings-badkey' => 'De sleutel die u hebt opgegeven is onjuist',
'config-upgrade-key-missing' => 'Er is een bestaande installatie van MediaWiki aangetroffen.
-Plaats de volgende regel onderaan uw LocalSettings.php om deze installatie bij te werken:
+Plaats de volgende regel onderaan uw <code>LocalSettings.php</code> om deze installatie bij te werken:
$1',
- 'config-localsettings-incomplete' => 'De bestaande inhoud van LocalSettings.php lijkt incompleet.
+ 'config-localsettings-incomplete' => 'De bestaande inhoud van <code>LocalSettings.php</code> lijkt incompleet.
De variabele $1 is niet ingesteld.
-Wijzig LocalSettings.php zodat deze variabele is ingesteld en klik op "Doorgaan".',
- 'config-localsettings-connection-error' => 'Er is een fout opgetreden tijdens het verbinden van de database met de instellingen uit LocalSettings.php of AdminSettings.php. Los het probleem met de instellingen op en probeer het daarna opnieuw.
+Wijzig <code>LocalSettings.php</code> zodat deze variabele is ingesteld en klik op "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => 'Er is een fout opgetreden tijdens het verbinden van de database met de instellingen uit <code>LocalSettings.php</code> of <code>AdminSettings.php</code>. Los het probleem met de instellingen op en probeer het daarna opnieuw.
$1',
'config-session-error' => 'Fout bij het begin van de sessie: $1',
@@ -13448,9 +13967,9 @@ U kunt MediaWiki niet installeren.',
MediaWiki heeft PHP $2 of hoger nodig om correct te kunnen werken.',
'config-unicode-using-utf8' => 'Voor Unicode-normalisatie wordt utf8_normalize.so van Brion Vibber gebruikt.',
'config-unicode-using-intl' => 'Voor Unicode-normalisatie wordt de [http://pecl.php.net/intl PECL-extensie intl] gebruikt.',
- 'config-unicode-pure-php-warning' => "'''Waarschuwing''': De [http://pecl.php.net/intl PECL-extensie intl] is niet beschikbaar om de Unicode-normalisatie af te handelen en daarom wordt de langzame PHP-implementatie gebruikt.
-Als u MediaWiki voor een website met veel verkeer installeert, lees u dan in over [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-normalisatie].",
- 'config-unicode-update-warning' => "'''Waarschuwing''': De geïnstalleerde versie van de Unicode-normalisatiewrapper maakt gebruik van een oudere versie van [http://site.icu-project.org/ de bibliotheek van het ICU-project].
+ 'config-unicode-pure-php-warning' => "'''Waarschuwing''': de [http://pecl.php.net/intl PECL-extensie intl] is niet beschikbaar om de Unicodenormalisatie af te handelen en daarom wordt de langzame PHP-implementatie gebruikt.
+Als u MediaWiki voor een website met veel verkeer installeert, lees u dan in over [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicodenormalisatie].",
+ 'config-unicode-update-warning' => "'''Waarschuwing''': de geïnstalleerde versie van de Unicodenormalisatiewrapper maakt gebruik van een oudere versie van [http://site.icu-project.org/ de bibliotheek van het ICU-project].
U moet [//www.mediawiki.org/wiki/Unicode_normalization_considerations bijwerken] als Unicode voor u van belang is.",
'config-no-db' => 'Het was niet mogelijk een geschikte databasedriver te vinden voor PHP.
U moet een databasedriver installeren voor PHP.
@@ -13461,7 +13980,7 @@ Als u PHP zelf hebt gecompileerd, wijzig dan uw instellingen zodat een databased
Als u PHP hebt geïnstalleerd via een Debian- of Ubuntu-package, installeer dan ook de module php5-mysql.',
'config-outdated-sqlite' => "''' Waarschuwing:''' u gebruikt SQLite $1. SQLite is niet beschikbaar omdat de minimaal vereiste versie $2 is.",
'config-no-fts3' => "'''Waarschuwing''': SQLite is gecompileerd zonder de module [//sqlite.org/fts3.html FTS3]; er zijn geen zoekfuncties niet beschikbaar.",
- 'config-register-globals' => "'''Waarschuwing: De PHP-optie <code>[http://php.net/register_globals register_globals]</code> is ingeschakeld.'''
+ 'config-register-globals' => "'''Waarschuwing: de PHP-optie <code>[http://php.net/register_globals register_globals]</code> is ingeschakeld.'''
'''Schakel deze uit als dat mogelijk is.'''
MediaWiki kan ermee werken, maar uw server is dan meer kwetsbaar voor beveiligingslekken.",
'config-magic-quotes-runtime' => "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is actief!'''
@@ -13494,7 +14013,7 @@ De installatie kan mislukken!",
'config-xcache' => '[http://xcache.lighttpd.net/ XCache] is op dit moment geïnstalleerd',
'config-apc' => '[http://www.php.net/apc APC] is op dit moment geïnstalleerd',
'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] is op dit moment geïnstalleerd',
- 'config-no-cache' => "'''Waarschuwing:''' [http://www.php.net/apc APC] of [http://trac.lighttpd.net/ xcache / XCache] is niet aangetroffen.
+ 'config-no-cache' => "'''Waarschuwing:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] of [http://www.iis.net/download/WinCacheForPhp WinCache] is niet aangetroffen.
Het cachen van objecten is niet ingeschakeld.",
'config-mod-security' => "'''Waarschuwing:''' uw webserver heeft de module [http://modsecurity.org/ mod_security] ingeschakeld. Als deze onjuist is ingesteld, kan dit problemen geven in combinatie met MediaWiki of andere software die gebruikers in staat stelt willekeurige inhoud te posten.
Lees de [http://modsecurity.org/documentation/ documentatie over mod_security] of neem contact op met de helpdesk van uw provider als u tegen problemen aanloopt.",
@@ -13508,17 +14027,20 @@ Het maken van miniaturen van afbeeldingen wordt uitgeschakeld.',
'config-no-uri' => "'''Fout:''' de huidige URI kon niet vastgesteld worden.
De installatie is afgebroken.",
'config-no-cli-uri' => "'''Waarschuwing:''' de parameter ==scriptpath is niet opgegeven. De standaardwaarde wordt gebruikt: <code>$1</code>.",
- 'config-using-server' => 'Servernaam "<nowiki>$1</nowiki>" wordt gebruikt.',
+ 'config-using-server' => 'De servernaam "<nowiki>$1</nowiki>" wordt gebruikt.',
'config-using-uri' => 'De server-URL "<nowiki>$1$2</nowiki>" wordt gebruikt.',
'config-uploads-not-safe' => "'''Waarschuwing:''' uw uploadmap <code>$1</code> kan gebruikt worden voor het arbitrair uitvoeren van scripts.
-Hoewel MediaWiki alle toegevoegde bestanden controleert op bedreigingen, is het zeer aan te bevelen het [//www.mediawiki.org/wiki/Manual:Security#Upload_security beveiligingslek te verhelpen] alvorens uploads in te schakelen.",
+Hoewel MediaWiki alle toegevoegde bestanden controleert op bedreigingen, is het zeer aan te bevelen het [//www.mediawiki.org/wiki/Manual:Security#Upload_security beveiligingslek te verhelpen] alvorens uploads in te schakelen.",
'config-no-cli-uploads-check' => "''Waarschuwing:'' uw standaardmap voor uploads (<code>$1</code>) wordt niet gecontroleerd op kwetsbaarheden voor het uitvoeren van willekeurige scripts gedurende de CLI-installatie.",
'config-brokenlibxml' => 'Uw systeem heeft een combinatie van PHP- en libxml2-versies geïnstalleerd die is foutgevoelig is en kan leiden tot onzichtbare beschadiging van gegevens in MediaWiki en andere webapplicaties.
-Upgrade naar PHP 5.2.9 of hoger en libxml2 2.7.3 of hoger! De installatie wordt afgebroken ([//bugs.php.net/bug.php?id=45996 bij PHP gerapporteerde fout]).',
+Upgrade naar PHP 5.2.9 of hoger en libxml2 2.7.3 of hoger([//bugs.php.net/bug.php?id=45996 bij PHP gerapporteerde fout]).
+De installatie wordt afgebroken.',
'config-using531' => 'PHP $1 is niet compatibel met MediaWiki vanwege een fout met betrekking tot referentieparameters met <code>__call()</code>.
Werk uw PHP bij naar PHP 5.3.2 of hoger of werk bij naar de lagere versie PHP 5.3.0 om dit op te lossen.
De installatie wordt afgebroken.',
- 'config-suhosin-max-value-length' => 'Suhosin is geïnstalleerd en beperkt de lengte van de GET-parameter tot $1 bytes. De ResourceLoader van MediaWiki omzeilt deze beperking, maar dat is slecht voor de prestaties. Als het mogelijk is, moet u de waarde "suhosin.get.max_value_length" in php.ini instellen op 1024 of hoger en $wgResourceLoaderMaxQueryLength in LocalSettings.php op dezelfde waarde instellen.',
+ 'config-suhosin-max-value-length' => 'Suhosin is geïnstalleerd en beperkt de GET-parameter <code>length</code> tot $1 bytes.
+De ResourceLoader van MediaWiki omzeilt deze beperking, maar dat is slecht voor de prestaties.
+Als het mogelijk is, moet u de waarde "<code>suhosin.get.max_value_length</code>" in <code>php.ini</code> instellen op 1024 of hoger en <code>$wgResourceLoaderMaxQueryLength</code> in LocalSettings.php op dezelfde waarde instellen.',
'config-db-type' => 'Databasetype:',
'config-db-host' => 'Databasehost:',
'config-db-host-help' => 'Als uw databaseserver een andere server is, voer dan de hostnaam of het IP-adres hier in.
@@ -13552,7 +14074,7 @@ Hoewel het wellicht mogelijk is gebruikers aan te maken zonder wachtwoord, is di
'config-db-install-help' => 'Voer de gebruikersnaam en het wachtwoord in die worden gebruikt voor de databaseverbinding tijdens het installatieproces.',
'config-db-account-lock' => 'Dezelfde gebruiker en wachwoord gebruiken na de installatie',
'config-db-wiki-account' => 'Gebruiker voor na de installatie',
- 'config-db-wiki-help' => 'Selecteer de gebruikersnaam en het wachtwoord die gebruikt worden om verbinding te maken met de database na de installatie.
+ 'config-db-wiki-help' => 'Voer de gebruikersnaam en het wachtwoord in die gebruikt worden om verbinding te maken met de database na de installatie.
Als de gebruiker niet bestaat en de gebruiker die tijdens de installatie gebruikt wordt voldoende rechten heeft, wordt deze gebruiker aangemaakt met de minimaal benodigde rechten voor het laten werken van de wiki.',
'config-db-prefix' => 'Databasetabelvoorvoegsel:',
'config-db-prefix-help' => "Als u een database moet gebruiken voor meerdere wiki's, of voor MediaWiki en een andere applicatie, dan kunt u ervoor kiezen om een voorvoegsel toe te voegen aan de tabelnamen om conflicten te voorkomen.
@@ -13579,12 +14101,12 @@ Wijzig het alleen als u weet dat dit nodig is.',
'config-sqlite-dir' => 'Gegevensmap voor SQLite:',
'config-sqlite-dir-help' => "SQLite slaat alle gegevens op in een enkel bestand.
-De map die u opgeeft moet schrijfbaar zijn voor de webserver tijdens de installatie.
+De map die u opgeeft moet beschrijfbaar zijn voor de webserver tijdens de installatie.
Deze mag '''niet toegankelijk''' zijn via het web en het bestand mag dus niet tussen de PHP-bestanden staan.
Het installatieprogramma schrijft het bestand <code>.htaccess</code> weg met het databasebestand, maar als dat niet werkt kan iemand zich toegang tot het ruwe databasebestand verschaffen.
-Ook de gebruikersgegevens (e-mailsadressen, wachtwoordhashes) en verwijderde versies en overige gegevens met beperkte toegang via MediaWiki zijn dan onbeschermd.
+Ook de gebruikersgegevens (e-mailadressen, wachtwoordhashes) en verwijderde versies en overige gegevens met beperkte toegang via MediaWiki zijn dan onbeschermd.
Overweeg om de database op een totaal andere plaats neer te zetten, bijvoorbeeld in <code>/var/lib/mediawiki/yourwiki</code>.",
'config-oracle-def-ts' => 'Standaard tablespace:',
@@ -13603,7 +14125,7 @@ Als u het databasesysteem dat u wilt gebruiken niet in de lijst terugvindt, volg
'config-support-postgres' => '* $1 is een populair open source databasesysteem als alternatief voor MySQL ([http://www.php.net/manual/en/pgsql.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor PostgreSQL]). Het is mogelijk dat er een aantal bekende problemen zijn met MediaWiki in combinatie met deze database en daarom wordt PostgreSQL niet aanbevolen voor een productieomgeving.',
'config-support-sqlite' => '* $1 is een zeer goed ondersteund lichtgewicht databasesysteem ([http://www.php.net/manual/en/pdo.installation.php hoe PHP gecompileerd zijn met ondersteuning voor SQLite]; gebruikt PDO)',
'config-support-oracle' => '* $1 is een commerciële data voor grote bedrijven ([http://www.php.net/manual/en/oci8.installation.php PHP compileren met ondersteuning voor OCI8]).',
- 'config-support-ibm_db2' => '* $1 is een commerciële enterprisedatabase.',
+ 'config-support-ibm_db2' => '* $1 is een commerciële enterprisedatabase. ([http://www.php.net/manual/en/ibm-db2.installation.php Hoe PHP compolieren met ondersteuning voor IBM DB2])',
'config-header-mysql' => 'MySQL-instellingen',
'config-header-postgres' => 'PostgreSQL-instellingen',
'config-header-sqlite' => 'SQLite-instellingen',
@@ -13621,7 +14143,7 @@ Gebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_) en st
Gebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_) en streepjes (-).',
'config-connection-error' => '$1.
-Controleer de host, gebruikersnaam en wachtwoord hieronder in en probeer het opnieuw.',
+Controleer de host, gebruikersnaam en wachtwoord en probeer het opnieuw.',
'config-invalid-schema' => 'Ongeldig schema voor MediaWiki "$1".
Gebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_).',
'config-db-sys-create-oracle' => 'Het installatieprogramma biedt alleen de mogelijkheid een nieuwe gebruiker aan te maken met de SYSDBA-gebruiker.',
@@ -13630,7 +14152,7 @@ Gebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_).',
U gebruikt $2.',
'config-sqlite-name-help' => 'Kies een naam die uw wiki identificeert.
Gebruik geen spaties of koppeltekens.
-Deze naam wordt gebruikt voor het gegevensbestands van SQLite.',
+Deze naam wordt gebruikt voor het gegevensbestand van SQLite.',
'config-sqlite-parent-unwritable-group' => 'Het was niet mogelijk de gegevensmap <code><nowiki>$1</nowiki></code> te maken omdat in de bovenliggende map <code><nowiki>$2</nowiki></code> niet geschreven mag worden door de webserver.
Het installatieprogramma heeft vast kunnen stellen onder welke gebruiker de webserver draait.
@@ -13650,14 +14172,14 @@ Voer op een Linux-systeem de volgende opdrachten uit:
<pre>cd $2
mkdir $3
chmod a+w $3</pre>',
- 'config-sqlite-mkdir-error' => 'Er is een fout opgetreden bij het aanmaken van de gegevensmap "$1".
+ 'config-sqlite-mkdir-error' => 'Er is een fout opgetreden tijdens het aanmaken van de gegevensmap "$1".
Controleer de locatie en probeer het opnieuw.',
'config-sqlite-dir-unwritable' => 'Het was niet mogelijk in de map "$1" te schrijven.
Wijzig de rechten zodat de webserver erin kan schrijven en probeer het opnieuw.',
'config-sqlite-connection-error' => '$1.
Controleer de map voor gegevens en de databasenaam hieronder en probeer het opnieuw.',
- 'config-sqlite-readonly' => 'Het bestand <code>$1</code> kan niet geschreven worden.',
+ 'config-sqlite-readonly' => 'Er kan niet naar bestand <code>$1</code> worden geschreven.',
'config-sqlite-cant-create-db' => 'Het was niet mogelijk het databasebestand <code>$1</code> aan te maken.',
'config-sqlite-fts3-downgrade' => 'PHP heeft geen ondersteuning voor FTS3.
De tabellen worden gedowngrade.',
@@ -13671,9 +14193,9 @@ Als u uw <code>LocalSettings.php</code> opnieuw wilt aanmaken, klik dan op de kn
Dit is '''niet aan te raden''' tenzij u problemen hebt met uw wiki.",
'config-upgrade-done-no-regenerate' => 'Het bijwerken is afgerond.
-U kunt u [$1 uw wiki gebruiken].',
- 'config-regenerate' => 'LocalSettings.php opnieuw aanmaken →',
- 'config-show-table-status' => 'Het uitvoeren van SHOW TABLE STATUS is mislukt!',
+U kunt nu [$1 uw wiki gebruiken].',
+ 'config-regenerate' => '<code>LocalSettings.php</code> opnieuw aanmaken →',
+ 'config-show-table-status' => 'Het uitvoeren van <code>SHOW TABLE STATUS</code> is mislukt!',
'config-unknown-collation' => "'''Waarschuwing:''' de database gebruikt een collatie die niet wordt herkend.",
'config-db-web-account' => 'Databasegebruiker voor webtoegang',
'config-db-web-help' => 'Selecteer de gebruikersnaam en het wachtwoord die de webserver gebruikt om verbinding te maken met de databaseserver na de installatie.',
@@ -13684,7 +14206,7 @@ De gebruiker die u hier opgeeft moet al bestaan.',
'config-mysql-engine' => 'Opslagmethode:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
- 'config-mysql-myisam-dep' => "'''Waarschuwing''': U hebt MyISAM geselecteerd als opslagengine voor MySQL. Dit is niet aan te raden voor MediaWiki omdat:
+ 'config-mysql-myisam-dep' => "'''Waarschuwing''': u hebt MyISAM geselecteerd als opslagengine voor MySQL. Dit is niet aan te raden voor MediaWiki omdat:
* het nauwelijks ondersteuning biedt voor gebruik door meerdere gebruikers tegelijkertijd door het locken van tabellen;
* het meer vatbaar is voor corruptie dan andere engines;
* de code van MediaWiki niet alstijd omgaat met MyISAM zoals dat zou moeten.
@@ -13699,7 +14221,7 @@ MyISAM-databases raken vaker corrupt dan InnoDB-databases.",
'config-mysql-binary' => 'Binair',
'config-mysql-utf8' => 'UTF-8',
'config-mysql-charset-help' => "In '''binaire modus''' slaat MediaWiki tekst in UTF-8 op in binaire databasevelden.
-Dit is efficiënter dan de UTF-8-modus van MySQL en stelt u in staat de volledige reeks Unicode-tekens te gebruiken.
+Dit is efficiënter dan de UTF-8-modus van MySQL en stelt u in staat de volledige reeks Unicodetekens te gebruiken.
In '''UTF-8-modus''' kent MySQL de tekenset van uw gegevens en kan de databaseserver ze juist weergeven en converteren.
Het is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
@@ -13740,13 +14262,13 @@ Kies een andere gebruikersnaam.',
'config-subscribe-help' => 'Dit is een mailinglijst met een laag volume voor aankondigingen van nieuwe versies, inclusief belangrijke aankondigingen met betrekking tot beveiliging.
Abonneer uzelf erop en werk uw MediaWiki-installatie bij als er nieuwe versies uitkomen.',
'config-subscribe-noemail' => 'U hebt geprobeerd zich te abonneren op de mailinglijst voor release-aankondigingen zonder een e-mailadres op te geven.
-Geef een e-mailadres op als u zich wil abonneren op de mailinglijst.',
+Geef een e-mailadres op als u zich wilt abonneren op de mailinglijst.',
'config-almost-done' => 'U bent bijna klaar!
Als u wilt kunt u de overige instellingen overslaan en de wiki nu installeren.',
'config-optional-continue' => 'Stel me meer vragen.',
'config-optional-skip' => 'Laat dat maar, installeer gewoon de wiki.',
'config-profile' => 'Gebruikersrechtenprofiel:',
- 'config-profile-wiki' => 'Traditionele wiki',
+ 'config-profile-wiki' => 'Open wiki',
'config-profile-no-anon' => 'Gebruiker aanmaken verplicht',
'config-profile-fishbowl' => 'Alleen voor geautoriseerde bewerkers',
'config-profile-private' => 'Privéwiki',
@@ -13756,7 +14278,7 @@ In MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventu
Daarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.
Daarom biedt dit installatieprogramma u de volgende keuzes voor de basisinstelling van gebruikersvrijheden:
-Een '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.
+Het profiel '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.
Een wiki met '''{{int:config-profile-no-anon}}\" biedt extra verantwoordelijkheid, maar kan afschrikken toevallige gebruikers afschrikken.
Het scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerkt, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.
@@ -13783,25 +14305,25 @@ Dit is nog steeds een geldige licentie, maar deze licentie is lastig te begrijpe
Het is ook lastig inhoud te hergebruiken onder de GFDL.",
'config-email-settings' => 'E-mailinstellingen',
'config-enable-email' => 'Uitgaande e-mail inschakelen',
- 'config-enable-email-help' => "Als u wilt dat e-mailen mogelijk is, dan moeten [http://www.php.net/manual/en/mail.configuration.php PHP's e-mailinstellingen] correct zijn.
-Als u niet wilt dat e-mailen mogelijk is, dan kunt u de instellingen hier uitschakelen.",
+ 'config-enable-email-help' => 'Als u wilt dat e-mailen mogelijk is, dan moeten de [http://www.php.net/manual/en/mail.configuration.php e-mailinstellingen van PHP] correct zijn.
+Als u niet wilt dat e-mailen mogelijk is, dan kunt u de instellingen hier uitschakelen.',
'config-email-user' => 'E-mail tussen gebruikers inschakelen',
'config-email-user-help' => 'Gebruikers toestaan e-mail aan elkaar te verzenden als dit in de voorkeuren is ingesteld.',
- 'config-email-usertalk' => 'Gebruikersoverlegnotificatie inschakelen',
- 'config-email-usertalk-help' => 'Gebruikers toestaan notificaties te ontvangen bij wijzigingen op de eigen overlegpagina als dit in de voorkeuren is ingesteld',
- 'config-email-watchlist' => 'Volglijstnotificatie inschakelen',
- 'config-email-watchlist-help' => "Gebruikers toestaan notificaties te ontvangen bij wijzigingen van pagina's op hun volglijst als dit in de voorkeuren is ingesteld",
+ 'config-email-usertalk' => 'Gebruikersoverlegmeldingen inschakelen',
+ 'config-email-usertalk-help' => 'Gebruikers toestaan meldingen te ontvangen bij wijzigingen op de eigen overlegpagina, als dit in de voorkeuren is ingesteld.',
+ 'config-email-watchlist' => 'Volglijstmeldingen inschakelen',
+ 'config-email-watchlist-help' => "Gebruikers toestaan meldingen te ontvangen bij wijzigingen van pagina's op hun volglijst, als dit in de voorkeuren is ingesteld.",
'config-email-auth' => 'E-mailbevestiging inschakelen',
'config-email-auth-help' => "Als deze instelling actief is, moeten gebruikers hun e-mailadres bevestigen via een verwijziging die ze per e-mail wordt toegezonden.
Alleen bevestigde e-mailadressen kunnen e-mail ontvangen van andere gebruikers of wijzigingsnotificaties ontvangen.
-Het inschakelen van deze instelling is '''aan te raden''' voor openbare wiki's vanwege de mogelijkheden voor misbruik van e-mailmogelijkheden.",
+Het inschakelen van deze instelling wordt '''aangeraden''' voor openbare wiki's vanwege de mogelijkheden voor misbruik van e-mailmogelijkheden.",
'config-email-sender' => 'E-mailadres voor antwoorden:',
'config-email-sender-help' => 'Voer het e-mailadres in dat u wilt gebruiken als antwoordadres voor uitgaande e-mail.
Als een e-mail niet bezorgd kan worden, wordt dat op dit e-mailadres gemeld.
Veel mailservers vereisen dat tenminste het domein bestaat.',
'config-upload-settings' => 'Afbeeldingen en bestanden uploaden',
'config-upload-enable' => 'Uploaden van bestanden inschakelen',
- 'config-upload-help' => "Het uploaden van bestanden stelt uw server mogelijk bloot aan beveiligingsrisico's.
+ 'config-upload-help' => "Het toestaan van het uploaden van bestanden stelt uw server mogelijk bloot aan beveiligingsrisico's.
Er is meer [//www.mediawiki.org/wiki/Manual:Security informatie over beveiliging] beschikbaar in de handleiding.
Om het bestandsuploads mogelijk te maken kunt u de rechten op de submap <code>images</code> onder de hoofdmap van MediaWiki aanpassen, zodat de webserver erin kan schrijven.
@@ -13822,13 +14344,13 @@ Meer informatie over deze functie en hoe deze in te stellen voor andere wiki\'s
'config-cc-error' => 'De licentiekiezer van Creative Commons heeft geen resultaat opgeleverd.
Voer de licentie handmatig in.',
'config-cc-again' => 'Opnieuw kiezen...',
- 'config-cc-not-chosen' => 'Kies alstublieft de Creative Commons-licentie die u wilt gebruiken en klik op "doorgaan".',
+ 'config-cc-not-chosen' => 'Kies alstublieft de Creative Commonslicentie die u wilt gebruiken en klik op "doorgaan".',
'config-advanced-settings' => 'Gevorderde instellingen',
'config-cache-options' => 'Instellingen voor het cachen van objecten:',
'config-cache-help' => 'Het cachen van objecten wordt gebruikt om de snelheid van MediaWiki te verbeteren door vaak gebruikte gegevens te bewaren.
Middelgrote tot grote websites wordt geadviseerd dit in te schakelen en ook kleine sites merken de voordelen.',
'config-cache-none' => 'Niets cachen.
-Er gaat geen functionaliteit verloren, maar dit kan invloed hebben op de snelheid.',
+Er gaat geen functionaliteit verloren, maar dit kan invloed hebben op de prestaties.',
'config-cache-accel' => 'Cachen van objecten via PHP (APC, XCache of WinCache)',
'config-cache-memcached' => 'Memcached gebruiken (dit vereist aanvullende instellingen)',
'config-memcached-servers' => 'Memcachedservers:',
@@ -13849,9 +14371,9 @@ Mogelijk moet u aanvullende instellingen maken, maar u kunt deze uitbreidingen n
'config-install-alreadydone' => "'''Waarschuwing:''' het lijkt alsof u MediaWiki al hebt geïnstalleerd en probeert het programma opnieuw te installeren.
Ga alstublieft door naar de volgende pagina.",
'config-install-begin' => 'Als u nu op "{{int:config-continue}}" klikt, begint de installatie van MediaWiki.
-Als u nog wijzigingen wilt maken, klik dan op "Terug".',
- 'config-install-step-done' => 'Afgerond',
- 'config-install-step-failed' => 'Mislukt',
+Als u nog wijzigingen wilt maken, klik dan op "{{int:config-back}}".',
+ 'config-install-step-done' => 'afgerond',
+ 'config-install-step-failed' => 'mislukt',
'config-install-extensions' => 'Inclusief uitbreidingen',
'config-install-database' => 'Database inrichten',
'config-install-schema' => 'Het schema wordt aangemaakt',
@@ -13872,9 +14394,9 @@ MediaWiki vereist momenteel dat de tabellen van de webgebruiker zijn. Geef een a
'config-install-user-grant-failed' => 'Het geven van rechten aan gebruiker "$1" is mislukt: $2',
'config-install-user-missing' => 'De opgegeven gebruiker "$1" bestaat niet.',
'config-install-user-missing-create' => 'De opgegeven gebruiker "$1" bestaat niet.
-Klik op "registreren" onderaan als u het wilt aanmaken.',
+Klik op "registreren" onderaan als u de gebruiker wilt aanmaken.',
'config-install-tables' => 'Tabellen aanmaken',
- 'config-install-tables-exist' => "'''Waarschuwing''': de MediaWiki-tabellen lijken al te bestaan.
+ 'config-install-tables-exist' => "'''Waarschuwing''': de MediaWikitabellen lijken al te bestaan.
Het aanmaken wordt overgeslagen.",
'config-install-tables-failed' => "'''Fout''': het aanmaken van een tabel is mislukt met de volgende foutmelding: $1",
'config-install-interwiki' => 'Bezig met het vullen van de interwikitabel',
@@ -13899,14 +14421,14 @@ Dit bevat al uw instellingen.
U moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsten; in dezelfde map als index.php.
De download moet u automatisch zijn aangeboden.
-Als de download niet is aangeboden of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande verwijzing te klikken:
+Als de download niet is aangeboden of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:
$3
'''Let op''': als u dit niet nu doet, dan het is bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.
Na het plaatsen van het bestand met instellingen kunt u '''[$2 uw wiki betreden]'''.",
- 'config-download-localsettings' => 'LocalSettings.php downloaden',
+ 'config-download-localsettings' => '<code>LocalSettings.php</code> downloaden',
'config-help' => 'hulp',
'config-nofile' => 'Het bestand "$1" is niet gevonden. Is het verwijderd?',
'mainpagetext' => "'''De installatie van MediaWiki is geslaagd.'''",
@@ -13916,7 +14438,254 @@ Na het plaatsen van het bestand met instellingen kunt u '''[$2 uw wiki betreden]
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lijst met instellingen]
* [//www.mediawiki.org/wiki/Manual:FAQ Veelgestelde vragen (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Maak MediaWiki beschikbaar in uw taal]',
+);
+
+/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
+ * @author Siebrand
+ */
+$messages['nl-informal'] = array(
+ 'config-localsettings-badkey' => 'De sleutel die je hebt opgegeven is onjuist',
+ 'config-upgrade-key-missing' => 'Er is een bestaande installatie van MediaWiki aangetroffen.
+Plaats de volgende regel onderaan je <code>LocalSettings.php</code> om deze installatie bij te werken:
+
+$1',
+ 'config-session-expired' => 'Je sessiegegevens zijn verlopen.
+Sessies zijn ingesteld om een levensduur van $1 te hebben.
+Je kunt deze wijzigen via de instelling <code>session.gc_maxlifetime</code> in php.ini.
+Begin het installatieproces opnieuw.',
+ 'config-no-session' => 'Je sessiegegevens zijn verloren gegaan.
+Controleer je php.ini en zorg dat er een juiste map is ingesteld voor <code>session.save_path</code>.',
+ 'config-your-language' => 'Jouw taal:',
+ 'config-help-restart' => 'Wil je alle opgeslagen gegevens die je hebt ingevoerd wissen en het installatieproces opnieuw starten?',
+ 'config-welcome' => '=== Controle omgeving ===
+Er worden een aantal basiscontroles uitgevoerd met als doel vast te stellen of deze omgeving geschikt is voor een installatie van MediaWiki.
+Als je hulp nodig hebt bij de installatie, lever deze gegevens dan ook aan.',
+ 'config-copyright' => "=== Auteursrechten en voorwaarden ===
+
+$1
+
+Dit programma is vrije software. Je mag het verder verspreiden en/of aanpassen in overeenstemming met de voorwaarden van de GNU General Public License zoals uitgegeven door de Free Software Foundation; ofwel versie 2 van de Licentie of - naar eigen keuze - enige latere versie.
+
+Dit programma wordt verspreid in de hoop dat het nuttig is, maar '''zonder enige garantie''', zelfs zonder de impliciete garantie van '''verkoopbaarheid''' of '''geschiktheid voor een bepaald doel'''.
+Zie de GNU General Public License voor meer informatie.
+
+Samen met dit programma hoor je een <doclink href=Copying>exemplaar van de GNU General Public License</doclink> ontvangen te hebben; zo niet, schrijf dan aan de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Verenigde Staten. Of [http://www.gnu.org/copyleft/gpl.html lees de licentie online].",
+ 'config-env-good' => 'De omgeving is gecontroleerd.
+Je kunt MediaWiki installeren.',
+ 'config-env-bad' => 'De omgeving is gecontroleerd.
+Je kunt MediaWiki niet installeren.',
+ 'config-unicode-pure-php-warning' => "'''Waarschuwing''': de [http://pecl.php.net/intl PECL-extensie intl] is niet beschikbaar om de Unicodenormalisatie af te handelen en daarom wordt de langzame PHP-implementatie gebruikt.
+Als je MediaWiki voor een website met veel verkeer installeert, lees je dan in over [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicodenormalisatie].",
+ 'config-unicode-update-warning' => "'''Waarschuwing''': de geïnstalleerde versie van de Unicodenormalisatiewrapper maakt gebruik van een oudere versie van [http://site.icu-project.org/ de bibliotheek van het ICU-project].
+Je moet [//www.mediawiki.org/wiki/Unicode_normalization_considerations bijwerken] als Unicode voor jou van belang is.",
+ 'config-no-db' => 'Het was niet mogelijk een geschikte databasedriver te vinden voor PHP.
+Je moet een databasedriver installeren voor PHP.
+De volgende databases worden ondersteund: $1.
+
+Als je op een gedeelde omgeving zit, vraag dan aan je hostingprovider een geschikte databasedriver te installeren.
+Als je PHP zelf hebt gecompileerd, wijzig dan je instellingen zodat een databasedriver wordt geactiveerd, bijvoorbeeld via <code>./configure --with-mysql</code>.
+Als je PHP hebt geïnstalleerd via een Debian- of Ubuntu-package, installeer dan ook de module php5-mysql.',
+ 'config-outdated-sqlite' => "''' Waarschuwing:''' je gebruikt SQLite $1. SQLite is niet beschikbaar omdat de minimaal vereiste versie $2 is.",
+ 'config-register-globals' => "'''Waarschuwing: de PHP-optie <code>[http://php.net/register_globals register_globals]</code> is ingeschakeld.'''
+'''Schakel deze uit als dat mogelijk is.'''
+MediaWiki kan ermee werken, maar je server is dan meer kwetsbaar voor beveiligingslekken.",
+ 'config-magic-quotes-runtime' => "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is actief!'''
+Deze instelling zorgt voor gegevenscorruptie.
+Je kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
+ 'config-magic-quotes-sybase' => "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] is actief!'''
+Deze instelling zorgt voor gegevenscorruptie.
+Je kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
+ 'config-mbstring' => "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is actief!'''
+Deze instelling zorgt voor gegevenscorruptie.
+Je kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
+ 'config-ze1' => "'''Onherstelbare fout: [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] is actief!'''
+Deze instelling zorgt voor grote problemen in MediaWiki.
+Je kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
+ 'config-xml-bad' => 'De XML-module van PHP ontbreekt.
+MediaWiki heeft de functies van deze module nodig en werkt niet zonder deze module.
+Als je gebruik maakt van Mandrake, installeer dan het package php-xml.',
+ 'config-mod-security' => "'''Waarschuwing:''' je webserver heeft de module [http://modsecurity.org/ mod_security] ingeschakeld. Als deze onjuist is ingesteld, kan dit problemen geven in combinatie met MediaWiki of andere software die gebruikers in staat stelt willekeurige inhoud te posten.
+Lees de [http://modsecurity.org/documentation/ documentatie over mod_security] of neem contact op met de helpdesk van je provider als je tegen problemen aanloopt.",
+ 'config-imagemagick' => 'ImageMagick aangetroffen: <code>$1</code>.
+Het aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als je uploaden inschakelt.',
+ 'config-gd' => 'Ingebouwde GD grafische bibliotheek aangetroffen.
+Het aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als je uploaden inschakelt.',
+ 'config-uploads-not-safe' => "'''Waarschuwing:''' je uploadmap <code>$1</code> kan gebruikt worden voor het arbitrair uitvoeren van scripts.
+Hoewel MediaWiki alle toegevoegde bestanden controleert op bedreigingen, is het zeer aan te bevelen het [//www.mediawiki.org/wiki/Manual:Security#Upload_security beveiligingslek te verhelpen] alvorens uploads in te schakelen.",
+ 'config-no-cli-uploads-check' => "''Waarschuwing:'' je standaardmap voor uploads (<code>$1</code>) wordt niet gecontroleerd op kwetsbaarheden voor het uitvoeren van willekeurige scripts gedurende de CLI-installatie.",
+ 'config-brokenlibxml' => 'Je systeem heeft een combinatie van PHP- en libxml2-versies geïnstalleerd die is foutgevoelig is en kan leiden tot onzichtbare beschadiging van gegevens in MediaWiki en andere webapplicaties.
+Upgrade naar PHP 5.2.9 of hoger en libxml2 2.7.3 of hoger([//bugs.php.net/bug.php?id=45996 bij PHP gerapporteerde fout]).
+De installatie wordt afgebroken.',
+ 'config-db-host-help' => 'Als je databaseserver een andere server is, voer dan de hostnaam of het IP-adres hier in.
+
+Als je gebruik maakt van gedeelde webhosting, hoort je provider je de juiste hostnaam te hebben verstrekt.
+
+Als je MediaWiki op een Windowsserver installeert en MySQL gebruikt, dan werkt "localhost" mogelijk niet als servernaam.
+Als het inderdaad niet werkt, probeer dan "127.0.0.1" te gebruiken als lokaal IP-adres.
+
+Als je PostgreSQL gebruikt, laat dit veld dan leeg om via een Unix-socket te verbinden.',
+ 'config-db-host-oracle-help' => 'Voer een geldige [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name] in; een tnsnames.ora-bestand moet zichtbaar zijn voor deze installatie.<br />Als je gebruik maakt van clientlibraries 10g of een latere versie, kan je ook gebruik maken van de naamgevingsmethode [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
+ 'config-db-name-help' => 'Kies een naam die je wiki identificeert.
+Er mogen geen spaties gebruikt worden.
+Als je gebruik maakt van gedeelde webhosting, dan hoort je provider ofwel jou een te gebruiken databasenaam gegeven te hebben, of je aangegeven te hebben hoe je databases kunt aanmaken.',
+ 'config-db-account-oracle-warn' => 'Er zijn drie ondersteunde scenario\'s voor het installeren van Oracle als databasebackend:
+
+Als je een databasegebruiker wilt aanmaken als onderdeel van het installatieproces, geef dan de gegevens op van een databasegebruiker in met de rol SYSDBA voor de installatie en voer de gewenste aanmeldgegevens in voor de gebruiker met webtoegang. Je kunt ook de gebruiker met webtoegang handmatig aanmaken en alleen van die gebruiker de aanmeldgegevens opgeven als deze de vereiste rechten heeft om schemaobjecten aan te maken. Als laatste is het mogelijk om aanmeldgegevens van twee verschillende gebruikers op te geven; een met de rechten om schemaobjecten aan te maken, en een met alleen webtoegang.
+
+Een script voor het aanmaken van een gebruiker met de vereiste rechten is te vinden in de map "maintenance/oracle/" van deze installatie. Onthoud dat het gebruiken van een gebruiker met beperkte rechten alle mogelijkheden om beheerscripts uit te voeren met de standaard gebruiker onmogelijk maakt.',
+ 'config-db-prefix-help' => "Als je een database moet gebruiken voor meerdere wiki's, of voor MediaWiki en een andere applicatie, dan kan je ervoor kiezen om een voorvoegsel toe te voegen aan de tabelnamen om conflicten te voorkomen.
+Gebruik geen spaties.
+
+Dit veld wordt meestal leeg gelaten.",
+ 'config-charset-help' => "'''Waarschuwing:''' als je '''achterwaarts compatibel met UTF-8''' gebruikt met MySQL 4.1+ en een back-up van de database maakt met <code>mysqldump</code>, dan kunnen alle niet-ASCII-tekens in je back-ups onherstelbaar beschadigd raken.
+
+In '''binaire modus''' slaat MediaWiki tekst in UTF-8 op in binaire databasevelden.
+Dit is efficiënter dan de UTF-8-modus van MySQL en stelt je in staat de volledige reeks Unicode-tekens te gebruiken.
+In '''UTF-8-modus''' kent MySQL de tekenset van je gegevens en kan de databaseserver ze juist weergeven en converteren.
+Het is dan niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
+ 'config-mysql-old' => 'Je moet MySQL $1 of later gebruiken.
+Jij gebruikt $2.',
+ 'config-db-schema-help' => 'Dit schema klopt meestal.
+Wijzig het alleen als je weet dat dit nodig is.',
+ 'config-sqlite-dir-help' => "SQLite slaat alle gegevens op in een enkel bestand.
+
+De map die je opgeeft moet beschrijfbaar zijn voor de webserver tijdens de installatie.
+
+Deze mag '''niet toegankelijk''' zijn via het web en het bestand mag dus niet tussen de PHP-bestanden staan.
+
+Het installatieprogramma schrijft het bestand <code>.htaccess</code> weg met het databasebestand, maar als dat niet werkt kan iemand zich toegang tot het ruwe databasebestand verschaffen.
+Ook de gebruikersgegevens (e-mailadressen, wachtwoordhashes) en verwijderde versies en overige gegevens met beperkte toegang via MediaWiki zijn dan onbeschermd.
+
+Overweeg om de database op een totaal andere plaats neer te zetten, bijvoorbeeld in <code>/var/lib/mediawiki/yourwiki</code>.",
+ 'config-support-info' => 'MediaWiki ondersteunt de volgende databasesystemen:
+
+$1
+
+Als je het databasesysteem dat je wilt gebruiken niet in de lijst terugvindt, volg dan de handleiding waarnaar hierboven wordt verwezen om ondersteuning toe te voegen.',
+ 'config-missing-db-name' => 'Je moet een waarde ingeven voor "Databasenaam"',
+ 'config-missing-db-host' => 'Je moet een waarde invoeren voor "Databaseserver"',
+ 'config-missing-db-server-oracle' => 'Je moet een waarde voor "Database-TNS" ingeven',
+ 'config-postgres-old' => 'PostgreSQL $1 of hoger is vereist.
+Jij gebruikt $2.',
+ 'config-sqlite-name-help' => 'Kies een naam die je wiki identificeert.
+Gebruik geen spaties of koppeltekens.
+Deze naam wordt gebruikt voor het gegevensbestand van SQLite.',
+ 'config-upgrade-done' => "Het bijwerken is afgerond.
+
+Je kunt [$1 je wiki nu gebruiken].
+
+Als je je <code>LocalSettings.php</code> opnieuw wilt aanmaken, klik dan op de knop hieronder.
+Dit is '''niet aan te raden''' tenzij je problemen hebt met je wiki.",
+ 'config-upgrade-done-no-regenerate' => 'Het bijwerken is afgerond.
+
+Je kunt nu [$1 je wiki gebruiken].',
+ 'config-db-web-no-create-privs' => 'De gebruiker die je hebt opgegeven voor de installatie heeft niet voldoende rechten om een gebruiker aan te maken.
+De gebruiker die je hier opgeeft moet al bestaan.',
+ 'config-mysql-myisam-dep' => "'''Waarschuwing''': je hebt MyISAM geselecteerd als opslagengine voor MySQL. Dit is niet aan te raden voor MediaWiki omdat:
+* het nauwelijks ondersteuning biedt voor gebruik door meerdere gebruikers tegelijkertijd door het locken van tabellen;
+* het meer vatbaar is voor corruptie dan andere engines;
+* de code van MediaWiki niet alstijd omgaat met MyISAM zoals dat zou moeten.
+
+Als je installatie van MySQL InnoDB ondersteunt, gebruik dat dan vooral.
+Als je installatie van MySQL geen ondersteuning heeft voor InnoDB, denk dan na over upgraden.",
+ 'config-mysql-charset-help' => "In '''binaire modus''' slaat MediaWiki tekst in UTF-8 op in binaire databasevelden.
+Dit is efficiënter dan de UTF-8-modus van MySQL en stelt je in staat de volledige reeks Unicodetekens te gebruiken.
+
+In '''UTF-8-modus''' kent MySQL de tekenset van je gegevens en kan de databaseserver ze juist weergeven en converteren.
+Het is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
+ 'config-ibm_db2-low-db-pagesize' => "Je DB2-database heeft een standaard tablespace met een onvoldoende grote pagesize. De pagesize moet tenminste '''32K''' zijn.",
+ 'config-project-namespace-help' => "In het kielzog van Wikipedia beheren veel wiki's hun beleidspagina's apart van hun inhoudelijke pagina's in een \"'''projectnaamruimte'''\".
+Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat je hier kunt aangeven.
+Dit voorvoegsel wordt meestal afgeleid van de naam van de wiki, maar het kan geen bijzondere tekens bevatten als \"#\" of \":\".",
+ 'config-admin-name' => 'Je naam:',
+ 'config-admin-password-mismatch' => 'De twee door jou ingevoerde wachtwoorden komen niet overeen.',
+ 'config-admin-email-help' => "Voer hier een e-mailadres in om e-mail te kunnen ontvangen van andere gebruikers op de wiki, je wachtwoord opnieuw in te kunnen stellen en op de hoogte te worden gehouden van wijzigingen van pagina's op uw volglijst. Je kunt het veld leeg laten.",
+ 'config-admin-error-bademail' => 'Je hebt een ongeldig e-mailadres opgegeven',
+ 'config-subscribe-help' => 'Dit is een mailinglijst met een laag volume voor aankondigingen van nieuwe versies, inclusief belangrijke aankondigingen met betrekking tot beveiliging.
+Abonneer jezelf erop en werk je MediaWiki-installatie bij als er nieuwe versies uitkomen.',
+ 'config-subscribe-noemail' => 'Je hebt geprobeerd je te abonneren op de mailinglijst voor release-aankondigingen zonder een e-mailadres op te geven.
+Geef een e-mailadres op als je je wilt abonneren op de mailinglijst.',
+ 'config-almost-done' => 'Je bent bijna klaar!
+Als je wilt kan je de overige instellingen overslaan en de wiki nu installeren.',
+ 'config-profile-help' => "Wiki's werken het beste als ze door zoveel mogelijk gebruikers worden bewerkt.
+In MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventuele foutieve of kwaadwillende bewerkingen terug te draaien.
+
+Daarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.
+Daarom biedt dit installatieprogramma je de volgende keuzes voor de basisinstelling van gebruikersvrijheden:
+
+Een '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.
+Een wiki met '''{{int:config-profile-no-anon}}\" biedt extra verantwoordelijkheid, maar kan afschrikken toevallige gebruikers afschrikken.
+
+Het scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerkt, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.
+In een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.
+
+Meer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [//www.mediawiki.org/wiki/Manual:User_rights handleiding].", # Fuzzy
+ 'config-license-help' => "In veel openbare wiki's zijn alle bijdragen beschikbaar onder een [http://freedomdefined.org/Definition vrije licentie].
+Dit helpt bij het creëren van een gevoel van gemeenschappelijk eigendom en stimuleert bijdragen op lange termijn.
+Dit is over het algemeen niet nodig is voor een particuliere of zakelijke wiki.
+
+Als je teksten uit Wikipedia wilt kunnen gebruiken en je wilt het mogelijk maken teksten uit je wiki naar Wikipedia te kopiëren, kies dan de licentie '''Creative Commons Naamsvermelding-Gelijk delen'''.
+
+De GNU Free Documentation License is de oude licentie voor inhoud uit Wikipedia.
+Dit is nog steeds een geldige licentie, maar deze licentie is lastig te begrijpen.
+Het is ook lastig inhoud te hergebruiken onder de GFDL.",
+ 'config-enable-email-help' => 'Als je wilt dat e-mailen mogelijk is, dan moeten de [http://www.php.net/manual/en/mail.configuration.php e-mailinstellingen van PHP] correct zijn.
+Als je niet wilt dat e-mailen mogelijk is, dan kan je de instellingen hier uitschakelen.',
+ 'config-upload-help' => "Het toestaan van het uploaden van bestanden stelt je server mogelijk bloot aan beveiligingsrisico's.
+Er is meer [//www.mediawiki.org/wiki/Manual:Security informatie over beveiliging] beschikbaar in de handleiding.
+
+Om het bestandsuploads mogelijk te maken kan je de rechten op de submap <code>images</code> onder de hoofdmap van MediaWiki aanpassen, zodat de webserver erin kan schrijven.
+Daarmee wordt deze functie ingeschakeld.",
+ 'config-logo-help' => 'Het standaarduiterlijk van MediaWiki bevat ruimte voor een logo van 135x160 pixels boven het menu.
+Upload een afbeelding met de juiste afmetingen en voer de URL hier in.
+
+Als je geen logo wilt gebruiken, kan je dit veld leeg laten.',
+ 'config-cc-not-chosen' => 'Kies alsjeblieft de Creative Commonslicentie die je wilt gebruiken en klik op "doorgaan".',
+ 'config-memcache-needservers' => 'Je hebt Memcached geselecteerd als je cache, maar je hebt geen servers opgegeven.',
+ 'config-memcache-badip' => 'Je hebt een ongeldig IP-adres ingevoerd voor Memcached: $1.',
+ 'config-memcache-noport' => 'Je hebt geen poort opgegeven voor de Memcachedserver: $1.
+De standaardpoort is 11211.',
+ 'config-extensions-help' => 'De bovenstaande uitbreidingen zijn aangetroffen in de map <code>./extensions</code>.
+
+Mogelijk moet je aanvullende instellingen maken, maar je kunt deze uitbreidingen nu inschakelen.',
+ 'config-install-alreadydone' => "'''Waarschuwing:''' het lijkt alsof je MediaWiki al hebt geïnstalleerd en probeert het programma opnieuw te installeren.
+Ga alsjeblieft door naar de volgende pagina.",
+ 'config-install-begin' => 'Als je nu op "{{int:config-continue}}" klikt, begint de installatie van MediaWiki.
+Als je nog wijzigingen wilt maken, klik dan op "Terug".', # Fuzzy
+ 'config-pg-no-plpgsql' => 'Je moet de taal PL/pgSQL installeren in de database $1',
+ 'config-pg-no-create-privs' => 'De gebruiker die je hebt opgegeven door de installatie heeft niet voldoende rechten om een gebruiker aan te maken.',
+ 'config-pg-not-in-role' => 'De gebruiker die je hebt opgegeven voor de webgebruiker bestaat al.
+De gebruiker die je hebt opgegeven voor installatie is geen superuser en geen lid van de rol van de webgebruiker, en kan het dus geen objecten aanmaken die van de webgebruiker zijn.
+
+MediaWiki vereist momenteel dat de tabellen van de webgebruiker zijn. Geef een andere webgebruikersnaam op, of klik op "terug" en geef een gebruiker op die voldoende installatierechten heeft.',
+ 'config-install-user-missing-create' => 'De opgegeven gebruiker "$1" bestaat niet.
+Klik op "registreren" onderaan als je de gebruiker wilt aanmaken.',
+ 'config-install-done' => "'''Gefeliciteerd!'''
+Je hebt MediaWiki met geïnstalleerd.
+
+Het installatieprogramma heeft het bestand <code>LocalSettings.php</code> aangemaakt.
+Dit bevat al je instellingen.
+
+Je moet het bestand downloaden en in de hoofdmap van uw wikiinstallatie plaatsten; in dezelfde map als index.php.
+De download moet je automatisch zijn aangeboden.
+
+Als de download niet is aangeboden of als je de download hebt geannuleerd, dan kan je de download opnieuw starten door op de onderstaande koppeling te klikken:
+
+$3
+
+'''Let op''': als je dit niet nu doet, dan het is bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.
+
+Na het plaatsen van het bestand met instellingen kan je '''[$2 je wiki betreden]'''.",
+ 'mainpagedocfooter' => 'Raadpleeg de [//meta.wikimedia.org/wiki/NL_Help:Inhoudsopgave handleiding] voor informatie over het gebruik van de wikisoftware.
+
+== Meer hulp over MediaWiki ==
+
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lijst met instellingen]
+* [//www.mediawiki.org/wiki/Manual:FAQ Veelgestelde vragen (FAQ)]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Maak MediaWiki beschikbaar in jouw taal]',
);
/** Norwegian Nynorsk (norsk (nynorsk)‎)
@@ -14056,6 +14825,7 @@ $messages['pdc'] = array(
* @author Saper
* @author Sp5uhe
* @author Woytecr
+ * @author ì•„ë¼
*/
$messages['pl'] = array(
'config-desc' => 'Instalator MediaWiki',
@@ -14063,19 +14833,19 @@ $messages['pl'] = array(
'config-information' => 'Informacja',
'config-localsettings-upgrade' => 'Plik <code>LocalSettings.php</code> istnieje.
Aby oprogramowanie zostało zaktualizowane musisz wstawić wartość <code>$wgUpgradeKey</code> w poniższe pole.
-Odnajdziesz jÄ… w LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Wykryto obecność pliku LocalSettings.php.
-Aktualizację należy wykonać poprzez uruchomienie update.php',
+Odnajdziesz jÄ… w <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'Wykryto obecność pliku <code>LocalSettings.php</code>.
+Aktualizację należy wykonać poprzez uruchomienie <code>update.php</code>',
'config-localsettings-key' => 'Klucz aktualizacji',
'config-localsettings-badkey' => 'Podany klucz jest nieprawidłowy',
'config-upgrade-key-missing' => 'Wykryto zainstalowane wcześniej MediaWiki.
-Jeśli chcesz je zaktualizować dodaj na koniec pliku LocalSettings.php poniższą linię tekstu.
+Jeśli chcesz je zaktualizować dodaj na koniec pliku <code>LocalSettings.php</code> poniższą linię tekstu.
$1',
- 'config-localsettings-incomplete' => 'IstniejÄ…cy plik LocalSettings.php wyglÄ…da na niekompletny.
+ 'config-localsettings-incomplete' => 'IstniejÄ…cy plik <code>LocalSettings.php</code> wyglÄ…da na niekompletny.
Brak wartości zmiennej $1.
-ZmieÅ„ plik LocalSettings.php, tak by zawieraÅ‚ deklaracjÄ™ wartoÅ›ci tej zmiennej, a nastÄ™pnie kliknij „Dalejâ€.',
- 'config-localsettings-connection-error' => 'Wystąpił błąd podczas łączenia z bazą danych z wykorzystaniem danych z LocalSettings.php lub AdminSettings.php.
+ZmieÅ„ plik <code>LocalSettings.php</code>, tak by zawieraÅ‚ deklaracjÄ™ wartoÅ›ci tej zmiennej, a nastÄ™pnie kliknij „{{int:Config-continue}}â€.',
+ 'config-localsettings-connection-error' => 'Wystąpił błąd podczas łączenia z bazą danych z wykorzystaniem danych z <code>LocalSettings.php</code> lub <code>AdminSettings.php</code>.
Popraw ustawienia i spróbuj ponownie.
$1',
@@ -14206,7 +14976,7 @@ Instalacja została przerwana.',
'config-using531' => 'MediaWiki nie może być używane z PHP $1 z powodu błędu dotyczącego referencyjnych argumentów funkcji <code>__call()</code>.
Uaktualnij do PHP 5.3.2 lub nowszego. Możesz również cofnąć wersję do PHP 5.3.0, aby naprawić ten błąd.
Instalacja została przerwana.',
- 'config-suhosin-max-value-length' => 'Jest zainstalowany Suhosin i ogranicza długość parametru GET do $1 bajtów. Komponent ResourceLoader w MediaWiki wykona obejście tego ograniczenia, ale kosztem wydajności. Jeśli to możliwe należy ustawić suhosin.get.max_value_length na 1024 lub wyższej w php.ini oraz ustawić $wgResourceLoaderMaxQueryLength w LocalSettings.php na tę samą wartość.',
+ 'config-suhosin-max-value-length' => 'Jest zainstalowany Suhosin i ogranicza długość parametru GET do $1 bajtów. Komponent ResourceLoader w MediaWiki wykona obejście tego ograniczenia, ale kosztem wydajności. Jeśli to możliwe należy ustawić <code>suhosin.get.max_value_length</code> na 1024 lub wyższej w <code>php.ini</code> oraz ustawić <code>$wgResourceLoaderMaxQueryLength</code> w LocalSettings.php na tę samą wartość.', # Fuzzy
'config-db-type' => 'Typ bazy danych',
'config-db-host' => 'Adres serwera bazy danych',
'config-db-host-help' => 'Jeśli serwer bazy danych jest na innej maszynie, wprowadź jej nazwę domenową lub adres IP.
@@ -14288,7 +15058,7 @@ Poniżej wyświetlone są systemy baz danych gotowe do użycia. Jeżeli poniżej
'config-support-postgres' => '* $1 jest popularnym systemem baz danych, często stosowanym zamiast MySQL ([http://www.php.net/manual/en/pgsql.installation.php Zobacz, jak skompilować PHP ze wsparciem dla PostgreSQL]). Z powodu możliwości wystąpienia drobnych błędów, nie jest zalecana do wymagających wdrożeń.',
'config-support-sqlite' => '* $1 jest niewielkim systemem bazy danych, z którym MediaWiki bardzo dobrze współpracuje. ([http://www.php.net/manual/en/pdo.installation.php Jak skompilować PHP ze wsparciem dla SQLite], korzystając z PDO)',
'config-support-oracle' => '* $1 jest komercyjną profesjonalną bazą danych. ([http://www.php.net/manual/en/oci8.installation.php Jak skompilować PHP ze wsparciem dla OCI8])',
- 'config-support-ibm_db2' => '* $1 jest komercyjnÄ… zaawansowanÄ… bazÄ… danych.',
+ 'config-support-ibm_db2' => '* $1 jest komercyjnÄ… zaawansowanÄ… bazÄ… danych.', # Fuzzy
'config-header-mysql' => 'Ustawienia MySQL',
'config-header-postgres' => 'Ustawienia PostgreSQL',
'config-header-sqlite' => 'Ustawienia SQLite',
@@ -14355,8 +15125,8 @@ Jest to '''nie zalecane''', chyba że występują problemy z twoją wiki.",
'config-upgrade-done-no-regenerate' => 'Aktualizacja zakończona.
Możesz wreszcie [$1 zacząć korzystać ze swojej wiki].',
- 'config-regenerate' => 'Ponowne generowanie LocalSettings.php →',
- 'config-show-table-status' => 'Zapytanie „SHOW TABLE STATUS†nie powiodło się!',
+ 'config-regenerate' => 'Ponowne generowanie <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'Zapytanie „<code>SHOW TABLE STATUS</code>†nie powiodło się!',
'config-unknown-collation' => "'''Uwaga''' – bazy danych używa nierozpoznanej metody porównywania.",
'config-db-web-account' => 'Konto bazy danych dla dostępu przez WWW',
'config-db-web-help' => 'Wybierz nazwę użytkownika i hasło, z których korzystać będzie serwer WWW do łączenia się z serwerem baz danych, podczas zwykłej pracy z wiki.',
@@ -14428,7 +15198,7 @@ Możesz pominąć pozostałe czynności konfiguracyjne i zainstalować wiki.',
'config-optional-continue' => 'Zadaj mi więcej pytań.',
'config-optional-skip' => 'Jestem już znudzony, po prostu zainstaluj wiki.',
'config-profile' => 'Profil uprawnień użytkowników',
- 'config-profile-wiki' => 'Tradycyjne wiki',
+ 'config-profile-wiki' => 'Tradycyjne wiki', # Fuzzy
'config-profile-no-anon' => 'Wymagane utworzenie konta',
'config-profile-fishbowl' => 'Wyłącznie zatwierdzeni edytorzy',
'config-profile-private' => 'Prywatna wiki',
@@ -14443,7 +15213,7 @@ Wiki z '''{{int:config-profile-no-anon}}''' zawiera dodatkowe funkcje rozliczani
Scenariusz '''{{int:config-profile-fishbowl}}''' umożliwia zatwierdzonym użytkownikom edycję, ale wyświetlanie stron jest powszechnie dostępne, włącznie z historią.
Ustawienie '''{{int:config-profile-private}}'' ' pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może edytować.
-Bardziej skomplikowane konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [//www.mediawiki.org/wiki/Manual:User_rights odpowiednią część podręcznika].",
+Bardziej skomplikowane konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [//www.mediawiki.org/wiki/Manual:User_rights odpowiednią część podręcznika].", # Fuzzy
'config-license' => 'Prawa autorskie i licencja',
'config-license-none' => 'Brak stopki z licencjÄ…',
'config-license-cc-by-sa' => 'Creative Commons – za uznaniem autora, na tych samych zasadach',
@@ -14528,7 +15298,7 @@ Mogą one wymagać dodatkowych czynności konfiguracyjnych, ale można je teraz
'config-install-alreadydone' => "'''Uwaga''' – wydaje się, że MediaWiki jest już zainstalowane, a obecnie próbujesz zainstalować je ponownie.
Przejdź do następnej strony.",
'config-install-begin' => 'Po naciśnięciu "{{int:config-continue}}", rozpocznie się instalacji MediaWiki.
-Jeśli nadal chcesz dokonać zmian, naciśnij wstecz.',
+Jeśli nadal chcesz dokonać zmian, naciśnij wstecz.', # Fuzzy
'config-install-step-done' => 'gotowe',
'config-install-step-failed' => 'nieudane',
'config-install-extensions' => 'WÅ‚Ä…cznie z rozszerzeniami',
@@ -14583,7 +15353,7 @@ $3
'''Uwaga''': Jeśli tego nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie już dostępny po zakończeniu instalacji.
Po załadowaniu pliku konfiguracyjnego możesz '''[ $2 wejść na wiki]'''.",
- 'config-download-localsettings' => 'Pobierz LocalSettings.php',
+ 'config-download-localsettings' => 'Pobierz <code>LocalSettings.php</code>',
'config-help' => 'pomoc',
'config-nofile' => 'Nie udało się odnaleźć pliku "$1". Czy nie został usunięty?',
'mainpagetext' => "'''Instalacja MediaWiki powiodła się.'''",
@@ -14592,13 +15362,14 @@ Po załadowaniu pliku konfiguracyjnego możesz '''[ $2 wejść na wiki]'''.",
== Na poczÄ…tek ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista ustawień konfiguracyjnych]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]', # Fuzzy
);
/** Piedmontese (Piemontèis)
* @author Borichèt
* @author Dragonòt
* @author Krinkle
+ * @author ì•„ë¼
*/
$messages['pms'] = array(
'config-desc' => "L'instalador për mediaWiki",
@@ -14607,10 +15378,20 @@ $messages['pms'] = array(
'config-localsettings-upgrade' => "A l'é stàit trovà n'archivi <code>LocalSettings.php</code>.
Për agiorné cost'anstalassion, ch'a anserissa ël valor ëd <code>\$wgUpgradeKey</code> ant la casela sì-sota.
A la trovrà an LocalSetting.php.",
- 'config-localsettings-cli-upgrade' => "N'archivi LocalSettings.php a l'é stàit trovà.
-Për agiorné sta instalassion, për piasì fà anvece giré update.php",
+ 'config-localsettings-cli-upgrade' => "N'archivi <code>LocalSettings.php</code> a l'é stàit trovà.
+Për agiorné sta instalassion, për piasì fà anvece giré <code>update.php</code>",
'config-localsettings-key' => "Ciav d'agiornament:",
'config-localsettings-badkey' => "La ciav ch'it l'has dàit a l'é pa giusta.",
+ 'config-upgrade-key-missing' => "A l'é stàita trovà n'istalassion esistenta ëd MediaWiki.
+Për agiorné soa istalassion, për piasì ch'a buta la linia sì-sota al fond ëd sò <code>LocalSettings.php</code>:
+
+$1",
+ 'config-localsettings-incomplete' => "L'esistent <code>LocalSettings.php</code> a smija esse ancomplet.
+La variàbil $1 a l'é nen ampostà.
+Për piasì, ch'a modìfica <code>LocalSettings.php</code> ëd fasson che costa variàbil a sia ampostà, e ch'a sgnaca «{{int:Config-continue}}».",
+ 'config-localsettings-connection-error' => "A l'é ancapitaje n'eror an colegand-se a la base ëd dàit an dovrand j'ampostassion specificà an <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Për piasì, ch'a coregia cost'ampostassion e ch'a preuva torna.
+
+$1",
'config-session-error' => 'Eror an fasend parte la session: $1',
'config-session-expired' => "Ij sò dat ëd session a smijo scadù.
Le session a son configurà për na durà ëd $1.
@@ -14638,6 +15419,7 @@ Ch'a contròla sò php.ini e ch'as sigura che <code>session.save_path</code> a s
'config-page-releasenotes' => 'Nòte ëd publicassion',
'config-page-copying' => 'Copié',
'config-page-upgradedoc' => 'Agiorné',
+ 'config-page-existingwiki' => 'Wiki esistenta',
'config-help-restart' => "Veul-lo scancelé tùit ij dat salvà ch'a l'ha anserì e anandié torna ël process d'instalassion?",
'config-restart' => 'É!, felo torna parte',
'config-welcome' => "=== Contròj d'ambient ===
@@ -14666,13 +15448,21 @@ It peule instalé MediaWiki.",
'config-env-bad' => "L'ambient a l'é stàit controlà.
It peule pa instalé MediaWiki.",
'config-env-php' => "PHP $1 a l'é instalà.",
+ 'config-env-php-toolow' => "PHP $1 a l'é instalà.
+Ant tùit ij cas, MediaWiki a ciama PHP $2 o pi neuv.",
'config-unicode-using-utf8' => 'As deuvra utf8_normalize.so ëd Brion Vibber për la normalisassion Unicode.',
'config-unicode-using-intl' => "As deuvra l'[http://pecl.php.net/intl estension intl PECL] për la normalisassion Unicode.",
'config-unicode-pure-php-warning' => "'''Avis:''' L'[http://pecl.php.net/intl estension intl PECL] a l'é pa disponìbil për gestì la normalisassion Unicode, da già che l'implementassion an PHP pur a faliss për lentëssa.
S'a gestiss un sit a àut tràfich, a dovrìa lese cheicòs an sla [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalisassion Unicode].",
'config-unicode-update-warning' => "'''Avis:''' La version instalà dlë spassiador ëd normalisassion Unicode a deuvra na version veja ëd la librarìa dël [http://site.icu-project.org/ proget ICU].
A dovrìa fé n'[//www.mediawiki.org/wiki/Unicode_normalization_considerations agiornament] s'a l'é anteressà a dovré Unicode.",
- 'config-no-db' => 'Impossìbil tové un pilòta ëd base ëd dàit bon!', # Fuzzy
+ 'config-no-db' => "Impossìbil trové un pilòta ëd base ëd dàit bon! A dev instalé un pilòta ëd base ëd dàit për PHP.
+Le sòrt ëd database ch'a ven-o a son apogià: $1.
+
+S'a l'é ansima a 'n servissi partagià, ch'a ciama a sò fornidor ëd servissi d'instalé un pilòta ëd base ëd dàit compatìbil.
+S'a l'é compilasse PHP chiel-midem, ch'a lo configura torna con un client ëd base ëd dàit abilità, për esempi an dovrand <code>./configure --with-mysql</code>.
+S'a l'ha instalà PHP dai pachèt Debian o Ubuntu, antlora a dev ëdcò istalé ël mòdul php5-mysql.",
+ 'config-outdated-sqlite' => "'''Avis''': chiel a l'ha SQLite $1, che a l'é pi vej che la version mìnima dont a-i é damanca $2. SQLite a sarà pa disponìbil.",
'config-no-fts3' => "'''Avis''': SQLite a l'é compilà sensa ël mòdul [//sqlite.org/fts3.html FTS3], le funsion d'arserca a saran pa disponìbij su cost motor.",
'config-register-globals' => "'''Avis: L'opsion <code>[http://php.net/register_globals register_globals]</code> ëd PHP a l'é abilità.'''
'''Ch'a la disabìlita s'a peul.'''
@@ -14696,14 +15486,19 @@ MediaWiki a l'ha da manca dle funsion an sto mòdul e a travajërà pa an costa
S'a fa giré mandrake, ch'a instala ël pachet php-xml.",
'config-pcre' => "A smija che ël mòdul d'apògg PCRE a sia mancant.
MediaWiki a l'ha da manca dle funsion d'espression regolar Perl-compatìbij për marcé.",
+ 'config-pcre-no-utf8' => "'''Fatal''': ël mòdul PCRE ëd PHP a smija esse compilà sensa l'apògg PCRE_UTF8.
+MediaWiki a ciama l'apògg d'UTF8 për marcé për da bin.",
'config-memory-raised' => "<code>memory_limit</code> ëd PHP a l'é $1, aussà a $2.",
'config-memory-bad' => "'''Avis:''' <code>memory_limit</code> ëd PHP a l'é $1.
Sossì a l'é probabilment tròp bass.
L'instalassion a peul falì!",
+ 'config-ctype' => "'''Fatal''': PHP a dev esse compilà con l'apògg për l'[http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
'config-xcache' => "[http://xcache.lighttpd.net/ XCache] a l'é instalà",
'config-apc' => "[http://www.php.net/apc APC] a l'é instalà",
'config-wincache' => "[http://www.iis.net/download/WinCacheForPhp WinCache] a l'é instalà",
'config-no-cache' => "'''Avis:''' As treuva pa [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache]. Ël buté d'oget an memòria local a l'é pa abilità.",
+ 'config-mod-security' => "'''Avis''': Sò servent për l'aragnà a l'ha [http://modsecurity.org/ mod_security] abilità. Se mal configurà, a peul causé dij problema për MediaWiki o d'àutri programa ch'a përmëtto a j'utent dë spedì un contnù qualsëssìa.
+Ch'a fasa arferiment a la [http://modsecurity.org/documentation/ mod_security documentassion] o ch'a contata l'echip ëd sò servissi s'a-j rivo dj'eror casuaj.",
'config-diff3-bad' => 'GNU diff3 pa trovà.',
'config-imagemagick' => "Trovà ImageMagick: <code>$1</code>.
La miniaturisassion ëd figure a sarà abilità s'it abìlite le carie.",
@@ -14713,27 +15508,52 @@ La miniaturisassion ëd figure a sarà abilità s'a abìlita ij cariament.",
La miniaturisassion ëd figure a sarà disabilità.',
'config-no-uri' => "'''Eror:''' As peul pa determiné l'URI corenta.
Instalassion abortìa.",
+ 'config-no-cli-uri' => "'''Avis''': pa gnun --scriptpath specificà, a sarà dovrà ël predefinì: <code>$1</code>.",
+ 'config-using-server' => 'Utilisassion dël nòm ëd servent "<nowiki>$1</nowiki>".',
+ 'config-using-uri' => "Utilisassion ëd l'anliura ëd servent «<nowiki>$1$2</nowiki>».",
'config-uploads-not-safe' => "'''Avis:''' Sò dossié stàndard për carié <code>$1</code> a l'é vulneràbil a l'esecussion ëd qualsëssìa senari.
Bele che MediaWiki a contròla j'aspet ëd sicurëssa ëd tùit j'archivi carià, a l'é motobin arcomandà ëd [//www.mediawiki.org/wiki/Manual:Security#Upload_security saré ës përtus ëd sicurëssa] prima d'abilité ij cariament.",
+ 'config-no-cli-uploads-check' => "'''Avis:''' Toa cartela predefinìa për j-amportassion (<code>$1</code>) a l'é nen controlà a propòsit ëd la vulnerabilità
+d'esecussion ëd senari arbitrari durant l'istalassion CLI.",
+ 'config-brokenlibxml' => "Sò sistema a l'ha na combinassion ëd version PHP e libxml2 che a l'ha dij bigat e a peul provoché la corussion ëd dat ëstërmà an MediaWiki e d'àutre aplicassion për l'aragnà.
+Ch'a agiorna a PHP 5.2.9 o pi neuv e libxml2 2.7.3 o pi neuv ([//bugs.php.net/bug.php?id=45996 bug filed with PHP]).
+Istalassion abortìa.",
+ 'config-using531' => "MediaWiki a peul pa esse dovrà con PHP $1 a motiv d'un bigat ch'a ìmplica ij paràmetr d'arferiment a <code>__call()</code>.
+Ch'a agiorna a PHP 5.3.2 o pi neuv, o ch'a torna andré a PHP 5.3.0 për arzòlve ës problema.
+Istalassion abortìa.",
+ 'config-suhosin-max-value-length' => 'Suhosin a l\'é instalà e a lìmita la longheur dël paràmetr GET a $1 byte. Ël component ResourceLoader ëd MediaWiki a travajerà an rispetand ës lìmit, ma sòn a degraderà le prestassion. Se possìbil, a dovrìa amposté suhosin.get.max_value_lenght a 1024 o pi àut an <code>php.ini</code>, e amposté <code>$wgResourceLoaderMaxQueryLength</code> al midem valor an LocalSettings.php .', # Fuzzy
'config-db-type' => 'Sòrt ëd base ëd dàit:',
'config-db-host' => 'Ospitant ëd la base ëd dàit:',
- 'config-db-host-help' => "Se sò servent ëd base ëd dàit a l'é su un servent diferent, ch'a anseriss ambelessì ël nòm dl'ospitant o l'adrëssa IP.
+ 'config-db-host-help' => "Se sò servent ëd base ëd dàit a l'é su un servent diferent, ch'a anserissa ambelessì ël nòm dl'ospitant o l'adrëssa IP.
S'a deuvra n'ospitalità partagià, sò fornidor d'ospitalità a dovrìa deje ël nòm dl'ospitant giust ant soa documentassion.
-Se a anstala su un servent Windows e a deuvra MySQL, dovré \"localhost\" a podrìa funsioné nen com nòm dël servent. S'a marcia nen, ch'a preuva \"127.0.0.1\" com adrëssa IP local.", # Fuzzy
+Se a anstala su un servent Windows e a deuvra MySQL, dovré «localhost» a podrìa funsioné nen com nòm dël servent. S'a marcia nen, ch'a preuva «127.0.0.1» com adrëssa IP local.
+
+S'a deuvra PostgresSQL, ch'a lassa sto camp bianch për coleghesse a travers un socket UNIX.",
'config-db-host-oracle' => 'TNS dla base ëd dàit:',
'config-db-host-oracle-help' => "Anserì un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nòm ëd conession local] bon; n'archivi tnsnames.ora a dev esse visìbil da costa anstalassion..<br />S'a deuvra le librarìe cliente 10g o pi neuve a peul ëdcò dovré ël métod ëd nominassion [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
'config-db-wiki-settings' => 'Identìfica sta wiki',
'config-db-name' => 'Nòm dla base ëd dàit:',
'config-db-name-help' => "Ch'a serna un nòm ch'a identìfica soa wiki.
-A dovrìa conten-e gnun ëspassi o tratin.
+A dovrìa conten-e gnun ëspassi.
-S'a deuvra n'ospitalità partagià, sò fornidor ëd l'ospitalità a-j darà un nòm ëd base ëd dàit specìfich da dovré, o a lassrà ch'a lo crea via un panel ëd contròl.", # Fuzzy
+S'a deuvra n'ospitalità partagià, sò fornidor ëd l'ospitalità a-j darà un nòm ëd base ëd dàit specìfich da dovré o a lassrà ch'a lo crea via un panel ëd contròl.",
'config-db-name-oracle' => 'Schema dla base ëd dàit:',
+ 'config-db-account-oracle-warn' => "A-i é tre possibilità mantnùe për istalé Oracle tanme terminal ëd base ëd dàit:
+
+S'a veul creé un cont ëd base ëd dàit com part dël process d'istalassion, për piasì ch'a fornissa un cont con ël ròl SYSDBA com cont ëd base ëd dàit për l'istalassion e ch'a specìfica le credensiaj vorsùe për ël cont d'acess an sl'aragnà, dësnò a peul ëdcò creé ël cont d'acess an sl'aragnà manualment e mach fornì col cont (se a l'ha ij përmess necessari për creé j'oget dë schema) o fornì doi cont diferent, un con ij privilegi ëd creé e un limità për l'acess an sla Ragnà.
+
+Ij senari për creé un cont con ij privilegi necessari a peul esse trovà ant la cartela «manutension/oracol/» ëd costa istalassion. Ch'a ten-a da ment che dovrand un cont limità a disabiliterà tute le funsion ëd manutension con ël cont predefinì.",
'config-db-install-account' => "Cont d'utent për l'instalassion.",
'config-db-username' => "Nòm d'utent dla base ëd dàit:",
'config-db-password' => 'Ciav dla base ëd dàit:',
+ 'config-db-password-empty' => "Për piasì, ch'a anserissa na ciav për ël neuv utent ëd base ëd dàit: $1.
+Con tut ch'a sia possìbil creé d'utent sensa ciav, a l'é pa na ròba sigura.",
+ 'config-db-install-username' => "Ch'a nserissa lë stranòm che a sarà dovrà për coleghesse a la base ëd dàit durant ël process d'istalassion.
+Cost-sì a l'é nen lë stranòm dël cont MediaWiki; a l'é lë stranòm për soa base ëd dàit.",
+ 'config-db-install-password' => "Ch'a anserissa la ciav che a sarà dovrà për coleghesse a la base ëd dàit durant ël process d'istalassion.
+Costa-sì a l'é nen la ciav dël cont MediaWiki; a l'é la ciav për soa base ëd dàit.",
'config-db-install-help' => "Ch'a anserissa lë stranòm d'utent e la ciav che a saran dovrà për coleghesse a la base ëd dàit durant ël process d'instalassion.",
'config-db-account-lock' => "Dovré ij midem stranòm d'utent e ciav durant j'operassion normaj",
'config-db-wiki-account' => "Cont d'utent për j'operassion normaj",
@@ -14741,9 +15561,9 @@ S'a deuvra n'ospitalità partagià, sò fornidor ëd l'ospitalità a-j darà un
S'ël cont a esist pa, e ël cont d'instalassion a l'ha ij privilegi ch'a-i van, sto cont utent a sarà creà con ij privilegi mìnin për fé marcé la wiki.",
'config-db-prefix' => 'Prefiss dle tàule dla base ëd dàit:',
'config-db-prefix-help' => "S'a l'ha dabzògn ëd partagé na base ëd dàit an tra vàire wiki, o tra MediaWiki e n'àutra aplicassion dl'aragnà, a peul serne ëd gionté un prefiss a tùit ij nòm ëd le tàule për evité ëd conflit.
-Ch'a deuvra ni dë spassi ni ëd tratin.
+Ch'a deuvra pa dë spassi.
-Cost camp a l'é lassà normalment veuid.", # Fuzzy
+Cost camp a l'é lassà normalment veuid.",
'config-db-charset' => 'Ansema dij caràter dla base ëd dàit',
'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binari',
'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
@@ -14756,8 +15576,9 @@ An '''manera UTF-8''', MySQL a arconòss an che ansema ëd caràter a son ij sò
'config-mysql-old' => "A-i é da manca ëd MySQL $1 o pi recent, chiel a l'ha $2.",
'config-db-port' => 'Porta dla base ëd dàit:',
'config-db-schema' => 'Schema për MediaWiki',
- 'config-db-schema-help' => "Jë schema sì-dzora a son normalment giust.
-Ch'a-j cangia mach s'a sa ch'a n'ha da manca.", # Fuzzy
+ 'config-db-schema-help' => "Lë schema sì-sota a l'é ëd sòlit giust.
+Ch'a lo cangia mach s'a sa ch'a n'ha da manca.",
+ 'config-pg-test-error' => "Impossìbil coleghesse a la base ëd dàit '''$1'''; $2",
'config-sqlite-dir' => 'Dossié dij dat SQLite:',
'config-sqlite-dir-help' => "SQLite a memorisa tùit ij dat ant n'archivi ùnich.
@@ -14771,33 +15592,39 @@ Lòn a comprend ij dat brut ëd l'utent (adrëssa ëd pòsta eletrònica, ciav t
Ch'a consìdera ëd buté la base ëd dàit tuta antrega da n'àutra part, për esempi an <code>/var/lib/mediawiki/yourwiki</code>.",
'config-oracle-def-ts' => 'Spassi dla tàula dë stàndard:',
'config-oracle-temp-ts' => 'Spassi dla tàula temporani:',
+ 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => "MediaWiki a manten ij sistema ëd base ëd dàit sì-dapress:
$1
S'a vëd pa listà sì-sota ël sistema ëd base ëd dàit ch'a preuva a dovré, antlora va andaré a j'istrussion dl'anliura sì-dzora për abilité ël manteniment.",
'config-support-mysql' => "* $1 e l'é l'obietiv primari për MediaWiki e a l'é mej mantnù ([http://www.php.net/manual/en/mysql.installation.php com compilé PHP con ël manteniment MySQL])",
- 'config-support-postgres' => "* $1 e l'é un sistema ëd base ëd dàit popolar a sorgiss duverta com alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php com compilé PHP con ël manteniment ëd PostgreSQL])", # Fuzzy
+ 'config-support-postgres' => "* $1 e l'é un sistema ëd base ëd dàit popolar a sorgiss duverta com alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php com compilé PHP con ël manteniment ëd PostgreSQL]). A peulo ess-ie chèich cit bigat, e a l'é nen arcomandà ëd dovrelo an n'ambient ëd produssion.",
'config-support-sqlite' => "* $1 e l'é un sistema ëd base ëd dàit leger che a l'é motobin bin mantnù ([http://www.php.net/manual/en/pdo.installation.php com compilé PHP con ël manteniment ëd SQLite], a deuvra PDO)",
'config-support-oracle' => "* $1 a l'é na base ëd dàit comersial për j'amprèise. ([http://www.php.net/manual/en/oci8.installation.php Com compilé PHP con ël manteniment OCI8])",
+ 'config-support-ibm_db2' => "* $1 a l'é na base ëd dàit d'asiendal comersial.", # Fuzzy
'config-header-mysql' => 'Ampostassion MySQL',
'config-header-postgres' => 'Ampostassion PostgreSQL',
'config-header-sqlite' => 'Ampostassion SQLite',
'config-header-oracle' => 'Ampostassion Oracle',
+ 'config-header-ibm_db2' => "Ampostassion d'IBM DB2",
'config-invalid-db-type' => 'Sòrt ëd ëd base ëd dàit pa bon-a',
'config-missing-db-name' => 'A dev buteje un valor për "Nòm ëd la base ëd dàit"',
+ 'config-missing-db-host' => 'A dev buteje un valor për "l\'òspit ëd la base ëd dàit"',
'config-missing-db-server-oracle' => 'A dev buteje un valor për "TNS ëd la base ëd dat"',
'config-invalid-db-server-oracle' => 'TNS ëd la base ëd dat pa bon "$1".
Dovré mach dle litre ASCII (a-z, A-Z), nùmer (0-9), sotlignadure (_) e pontin (.).',
'config-invalid-db-name' => 'Nòm ëd la base ëd dàit pa bon "$1".
-Dovré mach litre ASCII (a-z, A-Z), nùmer (0-9) e sotlignadure (_).', # Fuzzy
+Dovré mach litre ASCII (a-z, A-Z), nùmer (0-9), sotlignadure (_) e tratin (-).',
'config-invalid-db-prefix' => 'Prefiss dla base ëd dàit pa bon "$1".
-Dovré mach litre ASCII (a-z, A-Z), nùmer (0-9) e sotlignadure (_).', # Fuzzy
+Dovré mach litre ASCII (a-z, A-Z), nùmer (0-9), sotlignadure (_) e tratin (-).',
'config-connection-error' => "$1.
Controla l'ospitant, lë stranòm d'utent e la ciav sì-sota e prové torna.",
'config-invalid-schema' => 'Schema pa bon për MediaWiki "$1".
Dovré mach litre ASCII (a-z, A-Z), nùmer (0-9) e sotlignadure (_).',
+ 'config-db-sys-create-oracle' => "L'istalador a arconòss mach ij cont SYSDBA durant la creassion d'un cont neuv.",
+ 'config-db-sys-user-exists-oracle' => 'Ël cont utent "$1" a esist già. SYSDBA a peul mach esse dovrà për creé un cont neuv!',
'config-postgres-old' => "A-i é da manca ëd PostgreSQL $1 o pi recent, chiel a l'ha $2.",
'config-sqlite-name-help' => "Serne un nòm ch'a identìfica soa wiki.
Dovré nì dë spassi nì ëd tratin.
@@ -14837,8 +15664,11 @@ Adess a peule [$1 ancaminé a dovré soa wiki].
S'a veul generé torna sò archivi <code>LocalSettings.php</code>, ch'a sgnaca ël boton sì-sota.
Sòn a l'è '''pa arcomandà''' gavà ch'a rancontra dij problema con soa wiki.",
- 'config-regenerate' => 'Generé torna LocalSettings.php →',
- 'config-show-table-status' => 'Arcesta SHOW TABLE STATUS falìa!',
+ 'config-upgrade-done-no-regenerate' => 'Agiornament complet.
+
+It peule adess [$1 ancaminé a dovré toa wiki].',
+ 'config-regenerate' => 'Generé torna <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'Arcesta <code>SHOW TABLE STATUS</code> falìa!',
'config-unknown-collation' => "'''Avis:''' La base ëd dàit a deuvra na classificassion pa arconossùa.",
'config-db-web-account' => "Cont dla base ëd dàit për l'acess a l'aragnà",
'config-db-web-help' => "Ch'a selession-a lë stranòm d'utent e la ciav che ël servent ëd l'aragnà a dovrërà për coleghesse al servent dle base ëd dàit, durant j'operassion ordinarie dla wiki.",
@@ -14849,6 +15679,13 @@ Sòn a l'è '''pa arcomandà''' gavà ch'a rancontra dij problema con soa wiki."
'config-mysql-engine' => 'Motor ëd memorisassion:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-myisam-dep' => "'''Avis''': A l'ha selessionà MyISAM com motor ëd memorisassion për MySQL, che a l'é pa arcomandà da dovré con MediaWiki, përchè:
+* a sopòrta a pen-a la contemporanità për via ëd saradure ëd tàula
+* a l'é pi soget a la corussion che j'àutri motor
+* ël còdes bas ëd MediaWiki pa sempe a gestiss MyISAM com a dovrìa
+
+Se soa istalassion MySQL a manten InnoDB, a l'é fortement arcomandà ch'a serna pitòst col-lì.
+Se soa istalassion MySQL a manten nen InnoDB, a peul esse ch'a sia ël moment ëd n'agiornament.",
'config-mysql-engine-help' => "'''InnoDB''' a l'é scasi sempe la mej opsion, da già ch'a l'ha un bon manteniment dla concorensa.
'''MyISAM''' a peul esse pi lest an instalassion për n'utent sol o mach an letura.
@@ -14860,6 +15697,7 @@ La base ëd dàit MyISAM a tira a corompse pi 'd soens che la base ëd dàit Inn
Sòn a l'é pi eficient che la manera UTF-8 ëd MySQL, e a-j përmët ëd dovré l'ansema antregh ëd caràter Unicode.
An '''manera UTF-8''', MySQL a conossrà an che ansem ëd caràter a son ij sò dat, e a peul presenteje e convertije apropriatament, ma a-j lassa pa memorisé ij caràter ëdzora al [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes pian multilenghìstich ëd base].",
+ 'config-ibm_db2-low-db-pagesize' => "Soa base ëd dàit DB2 a l'ha në spassi d'ambaronament predefinì con na dimension ëd pàgina insuficent. La dimension ëd pàgina a dev esse '''32K''' o pi gròssa.",
'config-site-name' => 'Nòm ëd la wiki:',
'config-site-name-help' => "Sòn a comparirà ant la bara dël tìtol dël navigador e an vàire d'àutri pòst.",
'config-site-name-blank' => "Ch'a buta un nòm ëd sit.",
@@ -14873,6 +15711,8 @@ Tùit ij tìtoj ëd pàgina ant cost ëspassi nominal a parto con un sert prefis
Tradissionalment, sto prefiss a l'é derivà dal nòm ëd la wiki, ma a peul pa conten-e caràter ëd pontegiatura coma \"#\" o \":\".",
'config-ns-invalid' => 'Lë spassi nominal specificà "<nowiki>$1</nowiki>" a l\'é pa bon.
Specìfica në spassi nominal ëd proget diferent.',
+ 'config-ns-conflict' => 'Lë spassi nominal specificà "<nowiki>$1</nowiki>" a và contra në spassi nominal predefinì ëd MediaWiki.
+Specìfica në spassi nominal ëd proget diferent.',
'config-admin-box' => "Cont ëd l'Aministrator",
'config-admin-name' => 'Tò nòm:',
'config-admin-password' => 'Ciav:',
@@ -14886,18 +15726,21 @@ Specìfica un nòm utent diferent.',
'config-admin-password-same' => "La ciav a dev nen esse l'istessa ëd lë stranòm d'utent.",
'config-admin-password-mismatch' => "Le doe ciav che a l'ha scrivù a son diferente antra 'd lor.",
'config-admin-email' => 'Adrëssa ëd pòsta eletrònica:',
- 'config-admin-email-help' => "Ch'a anserissa ambelessì n'adrëssa ëd pòsta eletrònica për përmëtt-je d'arsèive ëd mëssagi da d'àutri utent an sla wiki, riamposté soa ciav, e esse anformà ëd camgiament a le pàgine ch'a ten sot-euj.", # Fuzzy
+ 'config-admin-email-help' => "Ch'a anserissa ambelessì n'adrëssa ëd pòsta eletrònica për përmëtt-je d'arsèive ëd mëssagi da d'àutri utent an sla wiki, riamposté soa ciav, e esse anformà dle modìfiche a le pàgine ch'a ten sot-euj. A peule lassé ës camp veuid.",
'config-admin-error-user' => 'Eror antern an creand n\'aministrator con lë stranòm "<nowiki>$1</nowiki>".',
'config-admin-error-password' => 'Eror antern an ampostand na ciav për l\'admin "<nowiki>$1</nowiki>": <pre>$2</pre>',
+ 'config-admin-error-bademail' => "A l'ha butà n'adrëssa ëd pòsta eletrònica pa bon-a.",
'config-subscribe' => "Ch'a sot-scriva la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista ëd discussion ëd j'anonsi ëd publicassion].",
'config-subscribe-help' => "Costa a l'é na lista ëd discussion a bass tràfich dovrà për j'anonsi ëd publicassion, comprèis d'amportant anonsi ëd sicurëssa.
A dovrìa sot-ëscrivla e agiorné soa instalassion mediaWiki quand che ëd version neuve a rivo.",
+ 'config-subscribe-noemail' => "A l'ha provà a abonesse a la lista ëd difusion dij comunicà sensa dé n'adrëssa ëd pòsta eletrònica.
+Për piasì, ch'a fornissa n'adrëssa ëd pòsta eletrònica s'a veul abonesse a la lista ëd pòsta.",
'config-almost-done' => "A l'ha bele che fàit!
A peul adess sauté la configurassion rimanenta e instalé dlongh la wiki.",
'config-optional-continue' => "Ciameme d'àutre chestion.",
'config-optional-skip' => 'I son già anojà, instala mach la wiki.',
'config-profile' => "Profil dij drit d'utent:",
- 'config-profile-wiki' => 'Wiki tradissional',
+ 'config-profile-wiki' => 'Deurb wiki',
'config-profile-no-anon' => 'A venta creé un cont',
'config-profile-fishbowl' => 'Mach editor autorisà',
'config-profile-private' => 'Wiki privà',
@@ -14907,7 +15750,7 @@ An MediaWiki, a l'é bel fé revisioné ij cambi recent, e buté andré minca da
An tùit ij cas, an tanti a l'han trovà che MediaWiki a sia ùtil ant na gran varietà ëd manere, e dle vire a l'é pa bel fé convince cheidun dij vantagi dla wiki.
Parèj a l'ha doe possibilità.
-Un '''{{int:config-profile-wiki}}''' a përmët a chicassìa ëd modifiché, bele sensa intré ant ël sistema.
+Ël model '''{{int:config-profile-wiki}}''' a përmët a chicassìa ëd modifiché, bele sensa intré ant ël sistema.
Na wiki con '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contribudor casuaj.
Ël senari '''{{int:config-profile-fishbowl}}''' a përmët a j'utent aprovà ëd modifiché, ma ël pùblich a peul vëdde le pàgine, comprèisa la stòria.
@@ -14917,7 +15760,10 @@ Configurassion ëd drit d'utent pi complicà a son disponìbij apress l'instalas
'config-license' => "Drit d'autor e licensa",
'config-license-none' => 'Gnun-a licensa an nòta an bass',
'config-license-cc-by-sa' => 'Creative Commons atribussion an part uguaj',
+ 'config-license-cc-by' => 'Creative Commons Attribution',
'config-license-cc-by-nc-sa' => 'Creative Commons atribussion nen comersial an part uguaj',
+ 'config-license-cc-0' => 'Creative Commons Zero (domini pùblich)',
+ 'config-license-gfdl' => 'Licensa GNU Free Documentation 1.3 o pi neuva',
'config-license-pd' => 'Domini Pùblich',
'config-license-cc-choose' => 'Selessioné na licensa Creative Commons përsonalisà',
'config-license-help' => "Vàire wiki pùbliche a buto tute le contribussion sota na [http://freedomdefined.org/Definition licensa lìbera]. Sòn a giuta a creé un sens d'apartenensa a la comunità e a ancoragia ëd contribussion ëd longa durà.
@@ -14925,8 +15771,9 @@ A l'é generalment nen necessari për na wiki privà o d'asienda.
S'a veul podèj dovré dij test da Wikipedia, e a veul che Wikipedia a aceta dij test copià da soa wiki, a dovrìa serne '''Creative Commons Attribution Share Alike'''.
-La GNU Free Documentation License a l'era la veja licensa dont sota a-i era Wikipedia.
-A l'é anco' na licensa bon-a, an tùit ij cas, sta licensa a l'ha chèich funsion ch'a rendo difìcij l'utilisassion e l'antërpretassion.", # Fuzzy
+Wikipedia prima a dovrava la GNU Free Documentation License.
+La GDFL a l'é anco' na licensa bon-a, ma a l'é malfé da capila.
+A l'é ëdcò mal fé riutilisé dël contnù licensià sota la GDFL.",
'config-email-settings' => 'Ampostassion ëd pòsta eletrònica',
'config-enable-email' => 'Abilité ij mëssagi ëd pòsta eletrònica an surtìa',
'config-enable-email-help' => "S'a veul che la pòsta eletrònica a marcia, j'[http://www.php.net/manual/en/mail.configuration.php ampostassion ëd pòsta eletrònica PHP] a devo esse configurà për da bin.
@@ -14956,10 +15803,10 @@ Peui ch'a abìlita costa opsion.",
'config-upload-deleted-help' => "ch'a serna un dossié andova goerné j'archivi scancelà.
Idealment, sòn a dovrìa pa esse acessìbil an sl'aragnà.",
'config-logo' => 'Anliura dla marca:',
- 'config-logo-help' => "La pel dë stàndard ëd MediaWiki a comprend lë spassi për na marca ëd 135x160 pontin ant ël canton an àut a snista.
+ 'config-logo-help' => "La pel dë stàndard ëd MediaWiki a comprend lë spassi për na marca ëd 135x160 pontin dzora la lista dla bara lateral.
Ch'a dëscaria na figura ëd la dimension aproprià, e ch'a anserissa l'anliura ambelessì.
-S'a veul gnun-e marche, ch'a lassa ës camp bianch.", # Fuzzy
+S'a veul gnun-e marche, ch'a lassa ës camp bianch.",
'config-instantcommons' => 'Abìlita Instant Commons',
'config-instantcommons-help' => "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] a l'é na funsion ch'a përmët a le wiki ëd dovré dle figure, dij son e d'àutri mojen trovà an sël sit [//commons.wikimedia.org/ Wikimedia Commons].
Për dovré sossì, MediaWiki a l'ha da manca dl'acess a la ragnà.
@@ -14978,21 +15825,45 @@ Ij sit da mesan a gròss a son motobin ancoragià a abilité sòn, e ij sit cit
'config-cache-memcached' => "Dovré Memcached (a ciama n'ampostassion e na configurassion adissionaj)",
'config-memcached-servers' => 'Servent Memcached:',
'config-memcached-help' => "Lista d'adrësse IP da dovré për Memcached.
-A dovrìa esse separà con dle vìrgole e specifiché la pòrta da dovré (për esempi: 127.0.0.1:11211, 192.168.1.25:11211).", # Fuzzy
+A dovrìa specifichene un-a për linia e specifiché la pòrta da dovré. Për esempi:
+127.0.0.1:11211
+192.168.1.25:11211",
+ 'config-memcache-needservers' => "A l'ha selessionà Memcached com soa sòrt ëd memorisassion local ma a l'ha specificà gnun servent.",
+ 'config-memcache-badip' => "It l'ha anserì n'adrëssa IP pa bon-a për Memcached: $1.",
+ 'config-memcache-noport' => "A l'ha pa specificà na pòrta da dovré për ël servent Memcached: $1.
+S'a conòsse nen la pòrta, cola predefinìa a l'é 11211.",
+ 'config-memcache-badport' => 'Ij nùmer ëd pòrta ëd Memcached a dovrìo esse tra $1 e $2.',
'config-extensions' => 'Estension',
'config-extensions-help' => "J'estension listà dì-sota a son ëstàite trovà ant sò dossié <code>./extensions</code>.
A peulo avèj da manca ëd configurassion adissionaj, ma a peul abiliteje adess",
'config-install-alreadydone' => "'''Avis''' A smija ch'a l'abie già instalà MediaWiki e ch'a preuva a instalelo torna.
Për piasì, ch'a vada a la pàgina ch'a-i ven.",
+ 'config-install-begin' => 'An sgnacand "{{int:config-continue}}", a anandiërà l\'istalassion ëd MediaWiki.
+S\'a veul anco\' fé dle modìfiche, ch\'a sgnaca su "{{int:config-back}}".',
'config-install-step-done' => 'fàit',
'config-install-step-failed' => 'falì',
'config-install-extensions' => "Comprende j'estension",
'config-install-database' => 'Creassion ëd la base ëd dàit',
+ 'config-install-schema' => 'Creassion dë schema',
+ 'config-install-pg-schema-not-exist' => 'Lë schema postgreSQL a esist pa.',
'config-install-pg-schema-failed' => 'Creassion dle tàule falìa.
Sigurte che l\'utent "$1" a peussa scrive lë schema "$2".',
+ 'config-install-pg-commit' => 'Salvé ij cambi.',
+ 'config-install-pg-plpgsql' => 'Contròl dël langagi PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'A dev istalé ël langage PL/pgSQL ant la base ëd dàit $1',
+ 'config-pg-no-create-privs' => "Ël cont ch'a l'ha specificà për l'istalassion a l'ha pa basta 'd privilegi për creé un cont.",
+ 'config-pg-not-in-role' => "Ël cont ch'a l'ha specificà për l'utent ëd la ragnà a esist già.
+Ël cont ch'a l'has specificà për l'istalassion a l'é pa un superutent e a l'é pa un mémber dla partìa dj'utent dla Ragnà, parèj a peul pa creé dj'oget ch'a apartenent a l'utent dla Ragnà.
+
+MediaWiki al moment a ciama che le tàule a sia possedùe da n'utent dla Ragnà. Për piasì, ch'a specìfica n'àutr nòm ëd cont dla Ragnà, o ch'a sgnaca ansima a \"andré\" e ch'a specìfica n'utent ch'a l'ha ij privilegi ch'a basto për l'anstalassion.",
'config-install-user' => "Creassion ëd n'utent ëd la base ëd dàit",
+ 'config-install-user-alreadyexists' => 'L\'utent "$1" a esist già',
+ 'config-install-user-create-failed' => "Faliment ant la creassion ëd l'utent «$1»: $2",
'config-install-user-grant-failed' => 'Falì a dé ij përmess a l\'utent "$1": $2',
+ 'config-install-user-missing' => 'L\'utent specificà "$1" a esist pa.',
+ 'config-install-user-missing-create' => "L'utent specificà «$1» a esist pa.
+Për piasì, ch'a selession-a la casela «cont da creé» sì-sota s'a veul creelo.",
'config-install-tables' => 'Creassion dle tàule',
'config-install-tables-exist' => "'''Avis''': A smija che le tàule ëd mediaWiki a esisto già.
Sauté la creassion.",
@@ -15001,26 +15872,41 @@ Sauté la creassion.",
'config-install-interwiki-list' => "As peul pa trovesse l'archivi <code>interwiki.list</code>.",
'config-install-interwiki-exists' => "'''Avis''': La tàula interwiki a smija ch'a l'abia già dj'element.
Për stàndard, la lista a sarà sautà.",
- 'config-install-keys' => 'Generassion ëd la ciav segreta', # Fuzzy
+ 'config-install-stats' => 'Inissialisassion dle statìstiche',
+ 'config-install-keys' => 'Generassion ëd le ciav segrete',
+ 'config-insecure-keys' => "'''Avis:''' {{PLURAL:$2|Na ciav sigura|Dle ciav sigure}} ($1) generà durant l'istalassion {{PLURAL:$2|a l'é|a son}} pa completament sigure. Ch'a consìdera ëd modifiche{{PLURAL:$2|la|je}} manualment.",
'config-install-sysop' => "Creassion dël cont ëd l'utent aministrator",
+ 'config-install-subscribe-fail' => 'As peul pa sot-scrivse mediawiki-announce: $1',
+ 'config-install-subscribe-notpossible' => "cURL a l'é pa istalà e allow_url_fopen a l'é pa disponìbil.",
+ 'config-install-mainpage' => 'Creassion ëd la pàgina prinsipal con un contnù predefinì',
+ 'config-install-extension-tables' => "Creassion ëd tàule për j'estension abilità",
+ 'config-install-mainpage-failed' => 'As peul pa inserisse la pàgina prinsipal: $1',
'config-install-done' => "'''Congratulassion!'''
A l'ha instalà për da bin mediaWiki.
L'instalador a l'ha generà n'archivi <code>LocalSettings.php</code>.
A conten tuta soa configurassion.
-A dovrà [$1 dëscarielo] e butelo ant la bas ëd l'instalassion ëd soa wiki (ël midem dossié d'index.php).
+A dovrà dëscarielo e butelo ant la bas ëd l'instalassion ëd soa wiki (ël midem dossié d'index.php). La dëscaria a dovrìa esse ancaminà automaticament.
+
+Se la dëscaria a l'é pa disponìbil, o s'a l'ha scancelala, a peul torna ancaminé la dëscaria an sgnacand an sla liura sì-sota:
+
+$3
+
'''Nòta''': S'a lo fa nen adess, cost archivi ëd configurassion generà a sarà pa disponìbil për chiel pi tard s'a chita l'instalassion sensa dëscarielo.
-Quand che a l'é stàit fàit, a peul '''[$2 intré an soa wiki]'''.", # Fuzzy
+Quand che a l'é stàit fàit, a peul '''[$2 intré an soa wiki]'''.",
+ 'config-download-localsettings' => 'Dëscarié <code>LocalSettings.php</code>',
'config-help' => 'agiut',
+ 'config-nofile' => "L'archivi «$1» as treuva nen. A l'é stàit ëscancelà?",
'mainpagetext' => "'''MediaWiki a l'é staita anstalà a la përfession.'''",
'mainpagedocfooter' => "Che a varda la [//meta.wikimedia.org/wiki/Help:Contents User's Guide] për avèj dj'anformassion ant sël coma dovré ël programa dla wiki.
== Për anandiesse a travajé ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dij paràmeter ëd configurassion]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Chestion frequente]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista ëd discussion an sla distribussion ëd MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista ëd discussion an sla distribussion ëd MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localisa MediaWiki për toa lenga]",
);
/** Pontic (Ποντιακά)
@@ -15079,7 +15965,7 @@ $messages['ps'] = array(
'config-admin-password' => 'پټنوم:',
'config-admin-password-confirm' => 'پټنوم يو ÚÙ„ بيا:',
'config-admin-email' => 'برÛښليک پته:',
- 'config-profile-wiki' => 'دوديزه ويکي',
+ 'config-profile-wiki' => 'دوديزه ويکي', # Fuzzy
'config-license-pd' => 'ټولګړی شپول',
'config-email-settings' => 'د برÛښليک امستنÛ',
'config-install-step-done' => 'ترسره شو',
@@ -15091,7 +15977,8 @@ $messages['ps'] = array(
== پيلول ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings د امستنو د Ø³Ø§Ø²ÙˆÙ†Û Ù„Ú“Ù„ÙŠÚ©]
* [//www.mediawiki.org/wiki/Manual:FAQ د ميډياويکي Ú‰ÛرÚÙ„ÙŠØ²Û Ù¾ÙˆÚšØªÙ†Û]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce د Ù…Ûډياويکي د برÛښليکونو لړليک]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce د Ù…Ûډياويکي د برÛښليکونو لړليک]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Ø®Ù¾Ù„Û Ú˜Ø¨Û Ù„Ù¾Ø§Ø±Ù‡ MediaWiki Úايتابول]',
);
/** Portuguese (português)
@@ -15101,6 +15988,7 @@ $messages['ps'] = array(
* @author Platonides
* @author SandroHc
* @author Waldir
+ * @author ì•„ë¼
*/
$messages['pt'] = array(
'config-desc' => 'O instalador do MediaWiki',
@@ -15108,19 +15996,19 @@ $messages['pt'] = array(
'config-information' => 'Informação',
'config-localsettings-upgrade' => 'Foi detectado um ficheiro <code>LocalSettings.php</code>.
Para actualizar esta instalação, por favor introduza o valor de <code>$wgUpgradeKey</code> na caixa abaixo.
-Encontra este valor no LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Foi detectada a existência de um ficheiro LocalSettings.php.
-Para actualizar esta instalação execute o update.php, por favor.',
+Encontra este valor no <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'Foi detectada a existência de um ficheiro <code>LocalSettings.php</code>.
+Para actualizar esta instalação execute o <code>update.php</code>, por favor.',
'config-localsettings-key' => 'Chave de actualização:',
'config-localsettings-badkey' => 'A chave que forneceu está incorreta.',
'config-upgrade-key-missing' => 'Foi detectada uma instalação existente do MediaWiki.
-Para actualizar esta instalação, por favor coloque a seguinte linha no final do seu LocalSettings.php:
+Para actualizar esta instalação, por favor coloque a seguinte linha no final do seu <code>LocalSettings.php</code>:
$1',
- 'config-localsettings-incomplete' => 'O ficheiro LocalSettings.php existente parece estar incompleto.
+ 'config-localsettings-incomplete' => 'O ficheiro <code>LocalSettings.php</code> existente parece estar incompleto.
A variável $1 não está definida.
-Por favor defina esta variável no LocalSettings.php e clique "Continuar".',
- 'config-localsettings-connection-error' => 'Ocorreu um erro ao ligar à base de dados usando as configurações especificadas no LocalSettings.php ou AdminSettings.php. Por favor corrija essas configurações e tente novamente.
+Por favor defina esta variável no <code>LocalSettings.php</code> e clique "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => 'Ocorreu um erro ao ligar à base de dados usando as configurações especificadas no <code>LocalSettings.php</code> ou <code>AdminSettings.php</code>. Por favor corrija essas configurações e tente novamente.
$1',
'config-session-error' => 'Erro ao iniciar a sessão: $1',
@@ -15252,7 +16140,7 @@ Instalação interrompida.',
'config-using531' => 'O MediaWiki não pode ser usado com o PHP $1 devido a um problema que envolve parâmetros de referência para <code>__call()</code>.
Para resolver este problema, actualize o PHP para a versão 5.3.2 ou posterior, ou reverta-o para a 5.3.0.
Instalação interrompida.',
- 'config-suhosin-max-value-length' => 'O Suhosin está instalado e limita a $1 bytes o comprimento do parâmetro GET. O componente ResourceLoader do MediaWiki pode tornear este limite, mas prejudicando o desempenho. Se lhe for possível, deve atribuir o valor 1024 ou maior ao parâmetro suhosin.get.max_value_length no ficheiro php.ini, e definir o mesmo valor para $wgResourceLoaderMaxQueryLength no ficheiro LocalSettings.php.',
+ 'config-suhosin-max-value-length' => 'O Suhosin está instalado e limita a $1 bytes o comprimento do parâmetro GET. O componente ResourceLoader do MediaWiki pode tornear este limite, mas prejudicando o desempenho. Se lhe for possível, deve atribuir o valor 1024 ou maior ao parâmetro <code>suhosin.get.max_value_length</code> no ficheiro <code>php.ini</code>, e definir o mesmo valor para <code>$wgResourceLoaderMaxQueryLength</code> no ficheiro LocalSettings.php.', # Fuzzy
'config-db-type' => 'Tipo da base de dados:',
'config-db-host' => 'Servidor da base de dados:',
'config-db-host-help' => 'Se a base de dados estiver num servidor separado, introduza aqui o nome ou o endereço IP desse servidor.
@@ -15336,7 +16224,7 @@ Se a plataforma que pretende usar não está listada abaixo, siga as instruçõe
'config-support-postgres' => '* $1 é uma plataforma de base de dados comum, de fonte aberta, alternativa ao MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar PHP com suporte PostgreSQL]). Poderão existir alguns pequenos problemas e não é recomendado o seu uso em ambientes de exploração/produção.',
'config-support-sqlite' => '* $1 é uma plataforma de base de dados ligeira muito bem suportada. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP com suporte SQLite], usa PDO)',
'config-support-oracle' => '* $1 é uma base de dados de uma empresa comercial. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
- 'config-support-ibm_db2' => '* $1 é uma base de dados empresarial.',
+ 'config-support-ibm_db2' => '* $1 é uma base de dados empresarial.', # Fuzzy
'config-header-mysql' => 'Definições MySQL',
'config-header-postgres' => 'Definições PostgreSQL',
'config-header-sqlite' => 'Definições SQLite',
@@ -15403,8 +16291,8 @@ Esta operação '''não é recomendada''' a menos que esteja a ter problemas com
'config-upgrade-done-no-regenerate' => 'Actualização terminada.
Agora pode [$1 começar a usar a sua wiki].',
- 'config-regenerate' => 'Regenerar o LocalSettings.php →',
- 'config-show-table-status' => 'A consulta SHOW TABLE STATUS falhou!',
+ 'config-regenerate' => 'Regenerar o <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'A consulta <code>SHOW TABLE STATUS</code> falhou!',
'config-unknown-collation' => "'''Aviso:''' A base de dados está a utilizar uma colação ''(collation)'' desconhecida.",
'config-db-web-account' => 'Conta na base de dados para acesso pela internet',
'config-db-web-help' => 'Seleccione o nome de utilizador e a palavra-chave que o servidor de internet irá utilizar para aceder ao servidor da base de dados, durante a operação normal da wiki.',
@@ -15477,7 +16365,7 @@ Agora pode saltar as configurações restantes e instalar já a wiki.',
'config-optional-continue' => 'Faz-me mais perguntas.',
'config-optional-skip' => 'Já estou aborrecido, instala lá a wiki.',
'config-profile' => 'Perfil de permissões:',
- 'config-profile-wiki' => 'Wiki tradicional',
+ 'config-profile-wiki' => 'Wiki tradicional', # Fuzzy
'config-profile-no-anon' => 'Criação de conta exigida',
'config-profile-fishbowl' => 'Somente utilizadores autorizados',
'config-profile-private' => 'Wiki privada',
@@ -15493,7 +16381,7 @@ Uma wiki com '''{{int:config-profile-no-anon}}''' atribui mais responsabilidade,
Um cenário '''{{int:config-profile-fishbowl}}''' permite que os utilizadores aprovados editem, mas que o público visione as páginas, incluindo o historial das mesmas.
Uma '''{{int:config-profile-private}}''' só permite que os utilizadores aprovados visionem as páginas e as editem.
-Após a instalação, estarão disponíveis mais configurações de privilégios. Consulte [//www.mediawiki.org/wiki/Manual:User_rights a entrada relevante no Manual].",
+Após a instalação, estarão disponíveis mais configurações de privilégios. Consulte [//www.mediawiki.org/wiki/Manual:User_rights a entrada relevante no Manual].", # Fuzzy
'config-license' => 'Direitos de autor e licença:',
'config-license-none' => 'Sem rodapé com a licença',
'config-license-cc-by-sa' => 'Creative Commons - Atribuição - Partilha nos Mesmos Termos',
@@ -15578,7 +16466,7 @@ Estas talvez necessitem de configurações adicionais, mas pode activá-las agor
'config-install-alreadydone' => "'''Aviso:''' Parece que já instalou o MediaWiki e está a tentar instalá-lo novamente.
Passe para a próxima página, por favor.",
'config-install-begin' => 'Ao clicar "{{int:config-continue}}", vai iniciar a instalação do MediaWiki.
-Se quiser fazer mais alterações, clique Voltar.',
+Se quiser fazer mais alterações, clique Voltar.', # Fuzzy
'config-install-step-done' => 'terminado',
'config-install-step-failed' => 'falhou',
'config-install-extensions' => 'A incluir as extensões',
@@ -15634,7 +16522,7 @@ $3
'''Nota''': Se não fizer isto agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.
Depois de terminar o passo anterior, pode '''[$2 entrar na wiki]'''.",
- 'config-download-localsettings' => 'Download do LocalSettings.php',
+ '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?',
'mainpagetext' => "'''MediaWiki instalado com sucesso.'''",
@@ -15644,7 +16532,7 @@ Depois de terminar o passo anterior, pode '''[$2 entrar na wiki]'''.",
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de opções de configuração]
* [//www.mediawiki.org/wiki/Manual:FAQ Perguntas e respostas frequentes sobre o MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Subscreva a lista de divulgação de novas versões do MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Subscreva a lista de divulgação de novas versões do MediaWiki]', # Fuzzy
);
/** Brazilian Portuguese (português do Brasil)
@@ -15659,13 +16547,13 @@ $messages['pt-br'] = array(
'config-information' => 'Informações',
'config-localsettings-upgrade' => 'Foi detectada a existência do arquivo <code>LocalSettings.php</code>.
Para atualizar esta instalação, insira no box abaixo o valor de <code>$wgUpgradeKey</code>.
-Essa informação pode ser encontrada no arquivo LocalSettings.php',
- 'config-localsettings-cli-upgrade' => 'Foi detectada a existência do arquivo <code>LocalSettings.php</code>.
+Essa informação pode ser encontrada no arquivo <code>LocalSettings.php</code>',
+ 'config-localsettings-cli-upgrade' => 'Foi detectada a existência do arquivo <code><code>LocalSettings.php</code></code>.
Esta instalação deverá ser atualizada através do <code>update.php</code>',
'config-localsettings-key' => 'Chave de atualização:',
'config-localsettings-badkey' => 'A chave fornecida está incorreta.',
'config-upgrade-key-missing' => 'Foi detectada uma instalação existente do MediaWiki.
-Para atualizar esta instalação, por favor, coloque a seguinte linha na parte inferior do seu LocalSettings.php:
+Para atualizar esta instalação, por favor, coloque a seguinte linha na parte inferior do seu <code>LocalSettings.php</code>:
$ 1', # Fuzzy
'config-session-error' => 'Erro ao iniciar a sessão: $1',
@@ -15739,20 +16627,33 @@ Se você não pretende usar um logotipo, deixe este campo em branco.', # Fuzzy
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de opções de configuração]
* [//www.mediawiki.org/wiki/Manual:FAQ FAQ do MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]', # Fuzzy
);
/** Quechua (Runa Simi)
+ * @author AlimanRuna
*/
$messages['qu'] = array(
+ 'config-desc' => 'MediaWiki tiyachiq',
+ 'config-title' => 'MediaWiki $1 tiyachiy',
+ 'config-information' => 'Willay',
+ 'config-your-language' => 'Rimayniyki:',
+ 'config-wiki-language' => 'Wiki rimay:',
+ 'config-back' => '↠Ñawpaqman',
+ 'config-extensions' => "Mast'ariykuna",
+ 'config-install-step-done' => 'rurasqañam',
+ 'config-install-step-failed' => 'manam aypasqachu',
+ 'config-help' => 'yanapay',
+ 'config-nofile' => '"$1" sutiyuq willañiqiqa manam tarisqachu. Qullusqachu?',
'mainpagetext' => "'''MediaWiki nisqa llamp'u kaqqa aypaylla takyachisqañam.'''",
'mainpagedocfooter' => "Wiki llamp'u kaqmanta willasunaykipaqqa [//meta.wikimedia.org/wiki/Help:Contents Ruraqpaq yanapana] ''(User's Guide)'' sutiyuq p'anqata qhaway.
== Qallarichkaspa ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Kunphigurasyun churanamanta sutisuyu]
+* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki nisqamanta pasaq tapuykuna]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki kachaykuy e-chaski sutisuyu]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki nisqata qampa rimaykiman t'ikray]",
);
/** Romagnol (Rumagnôl)
@@ -15775,10 +16676,16 @@ $messages['rm'] = array(
);
/** Romanian (română)
+ * @author Firilacroco
* @author Minisarm
* @author Stelistcristi
*/
$messages['ro'] = array(
+ 'config-desc' => 'Programul de instalare pentru MediaWiki',
+ 'config-title' => 'Instalarea MediaWiki $1',
+ 'config-information' => 'Informații',
+ 'config-localsettings-key' => 'Cheie de actualizare:',
+ 'config-localsettings-badkey' => 'Cheia furnizată este incorectă.',
'config-session-error' => 'Eroare la pornirea sesiunii: $1',
'config-your-language' => 'Limba ta:',
'config-your-language-help' => 'Alege o limbă pentru a o utiliza în timpul procesului de instalare.',
@@ -15794,46 +16701,153 @@ $messages['ro'] = array(
'config-page-name' => 'Nume',
'config-page-options' => 'Opţiuni',
'config-page-install' => 'Instalare',
+ 'config-page-complete' => 'Finalizat!',
'config-page-restart' => 'ReporneÅŸte instalarea',
'config-page-readme' => 'Citeşte-mă',
'config-page-releasenotes' => 'Note de lansare',
+ 'config-page-copying' => 'Copiere',
+ 'config-page-upgradedoc' => 'Actualizare',
+ 'config-page-existingwiki' => 'Wiki existent',
+ 'config-restart' => 'Da, repornește.',
+ 'config-env-php' => 'PHP $1 este instalat.',
+ 'config-env-php-toolow' => 'PHP $1 este instalat.
+Totuși, MediaWiki necesită PHP $2 sau mai nou.',
'config-db-type' => 'Tipul bazei de date:',
'config-db-host' => 'Gazdă bază de date:',
+ 'config-db-host-oracle' => 'Baza de date TNS:',
+ 'config-db-wiki-settings' => 'Identificați acest wiki',
+ 'config-db-name' => 'Numele bazei de date:',
+ 'config-db-name-oracle' => 'Schema bazei de date:',
+ 'config-db-username' => 'Nume de utilizator pentru baza de date:',
+ 'config-db-password' => 'Parola bazei de date:',
+ 'config-db-prefix' => 'Prefixul tabelelor din baza de date:',
+ 'config-db-charset' => 'Setul de caractere al bazei de date',
+ 'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binar',
+ 'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+ 'config-db-port' => 'Portul bazei de date:',
+ 'config-db-schema' => 'Schema pentru MediaWiki:',
+ 'config-sqlite-dir' => 'Director de date SQLite:',
+ 'config-oracle-def-ts' => 'SpaÈ›iu de stocare („tablespaceâ€) implicit:',
+ 'config-oracle-temp-ts' => 'SpaÈ›iu de stocare („tablespaceâ€) temporar:',
+ 'config-type-ibm_db2' => 'IBM DB2',
'config-header-mysql' => 'Setările MySQL',
+ 'config-header-postgres' => 'Setări PostgreSQL',
'config-header-sqlite' => 'Setări SQLite',
'config-header-oracle' => 'Setări Oracle',
+ 'config-header-ibm_db2' => 'Setări IBM DB2',
+ 'config-invalid-db-type' => 'Tip de bază de date incorect',
'config-missing-db-name' => 'Trebuie să introduci o valoare pentru „Numele bazei de dateâ€',
+ 'config-connection-error' => '$1.
+
+Verificați gazda, numele de utilizator și parola și reîncercați.',
+ 'config-upgrade-done-no-regenerate' => 'Actualizare completă.
+
+Acum puteți [$1 începe să vă folosiți wikiul].',
+ 'config-regenerate' => 'Regenerare <code>LocalSettings.php</code> →',
+ 'config-unknown-collation' => 'AVERTISMENT: Baza de date folosește o colaționare nerecunoscută.',
+ 'config-db-web-account' => 'Contul bazei de date pentru accesul web.',
+ 'config-db-web-create' => 'Creați contul dacă nu există deja',
'config-mysql-engine' => 'Motor de stocare:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-charset' => 'Setul de caractere al bazei de date:',
+ 'config-mysql-binary' => 'Binar',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'Numele wikiului:',
'config-site-name-blank' => 'Introduceți un nume pentru sit.',
+ 'config-project-namespace' => 'Spațiul de nume al proiectului:',
'config-ns-generic' => 'Proiect',
+ 'config-ns-site-name' => 'Același nume ca al wikiului: $1',
+ 'config-ns-other' => 'Altul (specificați)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-admin-box' => 'Cont de administrator',
+ 'config-admin-name' => 'Numele dumneavoastră:',
'config-admin-password' => 'Parolă:',
+ 'config-admin-password-confirm' => 'Parola, din nou:',
+ 'config-admin-password-blank' => 'Introduceți o parolă pentru contul de administrator.',
+ 'config-admin-password-same' => 'Parola trebuie să difere de numele de utilizator.',
+ 'config-admin-password-mismatch' => 'Cele două parole introduse nu corespund.',
+ 'config-admin-email' => 'Adresa de e-mail:',
+ 'config-admin-error-bademail' => 'Ați introdus o adresă de e-mail incorectă.',
+ 'config-almost-done' => 'Sunteți aproape gata!
+Puteți sări peste configurarea rămasă și să instalați wikiul chiar acum.',
'config-optional-continue' => 'Adresează-mi mai multe întrebări.',
'config-optional-skip' => 'Sunt deja plictisit, doar instalează wikiul.',
- 'config-profile-wiki' => 'Wiki tradițional',
+ 'config-profile' => 'Profilul drepturilor de utilizator:',
+ 'config-profile-wiki' => 'Wiki tradițional', # Fuzzy
+ 'config-profile-no-anon' => 'Crearea de cont este necesară',
+ 'config-profile-fishbowl' => 'Doar editorii autorizați',
'config-profile-private' => 'Wiki privat',
+ 'config-license' => 'Drepturi de autor și licență:',
+ 'config-license-none' => 'Fără licență în subsolul paginii',
+ 'config-license-cc-by-sa' => 'Creative Commons Atribuire și distribuire în condiții identice',
+ 'config-license-cc-by' => 'Creative Commons Atribuire',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Atribuire, necomercial și distribuire în condiții identice',
+ 'config-license-cc-0' => 'Creative Commons Zero (domeniu public)',
+ 'config-license-gfdl' => 'Licența GNU pentru Documentare Liberă 1.3 sau ulterioară',
+ 'config-license-pd' => 'Domeniu public',
+ 'config-license-cc-choose' => 'Alegeți o licență Creative Commons personalizată',
'config-email-settings' => 'Setări pentru e-mail',
+ 'config-email-usertalk' => 'Activați notificările pentru pagina de discuții a utilizatorului',
+ 'config-upload-deleted' => 'Director pentru fișierele șterse:',
+ 'config-logo' => 'Adresa URL a siglei:',
+ 'config-cc-again' => 'Alegeți din nou...',
+ 'config-advanced-settings' => 'Configurare avansată',
+ 'config-cache-options' => 'Parametrii pentru stocarea temporară a obiectelor:',
+ 'config-extensions' => 'Extensii',
'config-install-step-done' => 'realizat',
+ 'config-install-step-failed' => 'eșuat',
+ 'config-install-extensions' => 'Se includ extensiile',
+ 'config-install-database' => 'Se creează baza de date',
+ 'config-install-schema' => 'Se creează schema',
+ 'config-install-pg-schema-not-exist' => 'Schema PostgreSQL nu există.',
+ 'config-install-pg-commit' => 'Se validează modificările',
+ 'config-install-user' => 'Se creează utilizatorul pentru baza de date',
+ 'config-install-user-alreadyexists' => 'Utilizatorul „$1†există deja',
+ 'config-install-user-create-failed' => 'Crearea utilizatorului „$1†a eșuat: $2',
+ 'config-install-tables' => 'Se creează tabelele',
+ 'config-install-stats' => 'Se inițializează statisticile',
+ 'config-install-keys' => 'Se generează cheile secrete',
+ 'config-install-sysop' => 'Se creează contul de administrator',
+ 'config-install-mainpage-failed' => 'Nu s-a putut insera pagina principală: $1',
+ 'config-download-localsettings' => 'Descarcă <code>LocalSettings.php</code>',
+ 'config-help' => 'ajutor',
'mainpagetext' => "'''Programul Wiki a fost instalat cu succes.'''",
'mainpagedocfooter' => 'Consultați [//meta.wikimedia.org/wiki/Help:Contents Ghidul utilizatorului (en)] pentru informații despre utilizarea software-ului wiki.
== Primii pași ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista parametrilor configurabili (en)]
* [//www.mediawiki.org/wiki/Manual:FAQ Întrebări frecvente despre MediaWiki (en)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discuții a MediaWiki (en)]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discuții a MediaWiki (en)]', # Fuzzy
);
/** tarandíne (tarandíne)
* @author Joetaras
*/
$messages['roa-tara'] = array(
+ 'config-desc' => "'U 'nstallatore de MediaUicchi",
+ 'config-title' => 'Installazzione de MediaUicchi $1',
+ 'config-information' => "'Mbormaziune",
+ 'config-localsettings-key' => 'Chiave de aggiornamende:',
+ 'config-page-language' => 'Lènghe',
+ 'config-page-name' => 'Nome',
'config-db-charset' => "'Nzieme de carattere d'u database",
'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-db-port' => "Porte d'u database:",
+ 'config-db-schema' => 'Scheme pe MediaUicchi:',
+ 'config-type-mysql' => 'MySQL',
+ 'config-type-postgres' => 'PostgreSQL',
+ 'config-type-sqlite' => 'SQLite',
+ 'config-type-oracle' => 'Oracle',
+ 'config-admin-email' => 'Indirizze e-mail:',
'config-install-step-done' => 'fatte',
'config-install-step-failed' => 'fallite',
+ 'config-install-extensions' => "'Ngludenne le estenziune",
+ 'config-install-database' => "Stoche a 'mboste l'archivije",
+ 'config-install-schema' => "Stoche a creje 'u scheme",
+ 'config-install-pg-schema-not-exist' => "'U scheme PostgreSQL non g'esiste.",
'config-help' => 'ajute',
'mainpagetext' => "'''MediaUicchi ha state 'nstallete.'''",
'mainpagedocfooter' => "Vè vide [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer wiki.
@@ -15841,7 +16855,8 @@ $messages['roa-tara'] = array(
== Pe accumenzà ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste pe le configuraziune]
* [//www.mediawiki.org/wiki/Manual:FAQ FAQ de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste d'a poste de MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenghe d'a poste de MediaUicchi]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localizzazzione de MediaUicchi pa lènga toje]",
);
/** Russian (руÑÑкий)
@@ -15856,6 +16871,7 @@ $messages['roa-tara'] = array(
* @author Yuriy Apostol
* @author ÐлекÑандр Сигачёв
* @author Сrower
+ * @author ì•„ë¼
*/
$messages['ru'] = array(
'config-desc' => 'ИнÑталлÑтор MediaWiki',
@@ -15863,19 +16879,19 @@ $messages['ru'] = array(
'config-information' => 'ИнформациÑ',
'config-localsettings-upgrade' => 'Обнаружен файл <code>LocalSettings.php</code>.
Ð”Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñтой уÑтановки, пожалуйÑта, введите значение <code>$wgUpgradeKey</code>.
-Его можно найти в файле LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Обнаружен файл LocalSettings.php.
-Ð”Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñтой уÑтановки, пожалуйÑта, запуÑтите update.php',
+Его можно найти в файле <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.
-Чтобы обновить обнаруженную уÑтановку, пожалуйÑта, добавьте Ñледующую Ñтроку в конец вашего файла LocalSettings.php:
+Чтобы обновить обнаруженную уÑтановку, пожалуйÑта, добавьте Ñледующую Ñтроку в конец вашего файла <code>LocalSettings.php</code>:
$1',
- 'config-localsettings-incomplete' => 'Похоже, что ÑущеÑтвующий файл LocalSettings.php не ÑвлÑетÑÑ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼Ð¸.
+ 'config-localsettings-incomplete' => 'Похоже, что ÑущеÑтвующий файл <code>LocalSettings.php</code> не ÑвлÑетÑÑ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼Ð¸.
Ðе уÑтановлена Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $1.
-ПожалуйÑта, измените LocalSettings.php так, чтобы значение Ñтой переменной было задано, затем нажмите «Продолжить».',
- 'config-localsettings-connection-error' => 'Произошла ошибка при подключении к базе данных Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ наÑтроек, указанных в LocalSettings.php или AdminSettings.php. ПожалуйÑта, иÑправьте Ñти наÑтройки и повторите попытку.
+ПожалуйÑта, измените <code>LocalSettings.php</code> так, чтобы значение Ñтой переменной было задано, затем нажмите «{{int:Config-continue}}».',
+ 'config-localsettings-connection-error' => 'Произошла ошибка при подключении к базе данных Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ наÑтроек, указанных в <code>LocalSettings.php</code> или <code>AdminSettings.php</code>. ПожалуйÑта, иÑправьте Ñти наÑтройки и повторите попытку.
$1',
'config-session-error' => 'Ошибка при запуÑке ÑеÑÑии: $1',
@@ -16006,7 +17022,7 @@ MediaWiki требует поддержки UTF-8 Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ Ñ€
'config-using531' => 'PHP $1 не ÑовмеÑтим Ñ MediaWiki из-за ошибки Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸-ÑÑылками при вызовах <code>__call()</code>.
ОбновитеÑÑŒ до PHP 5.3.2 и выше, или откатитеÑÑŒ до PHP 5.3.0, чтобы избежать Ñтой проблемы.
УÑтановка прервана.',
- 'config-suhosin-max-value-length' => 'Suhosin уÑтановлен и ограничивает длину параметра GET до $1 байт. Компонент MediaWiki ResourceLoader будет обходить Ñто ограничение, но Ñто Ñнизит производительноÑÑ‚ÑŒ. ЕÑли Ñто возможно, Ñледует уÑтановить suhosin.get.max_value_length 1024 или выше в php.ini, а также уÑтановить Ð´Ð»Ñ $wgResourceLoaderMaxQueryLength такое же значение в LocalSettings.php.',
+ 'config-suhosin-max-value-length' => 'Suhosin уÑтановлен и ограничивает длину параметра GET до $1 байт. Компонент MediaWiki ResourceLoader будет обходить Ñто ограничение, но Ñто Ñнизит производительноÑÑ‚ÑŒ. ЕÑли Ñто возможно, Ñледует уÑтановить <code>suhosin.get.max_value_length</code> 1024 или выше в <code>php.ini</code>, а также уÑтановить Ð´Ð»Ñ <code>$wgResourceLoaderMaxQueryLength</code> такое же значение в LocalSettings.php.', # Fuzzy
'config-db-type' => 'Тип базы данных:',
'config-db-host' => 'ХоÑÑ‚ базы данных:',
'config-db-host-help' => 'ЕÑли Ñервер базы данных находитÑÑ Ð½Ð° другом Ñервере, введите здеÑÑŒ его Ð¸Ð¼Ñ Ñ…Ð¾Ñта или IP-адреÑ.
@@ -16092,7 +17108,7 @@ $1
'config-support-postgres' => '* $1 — популÑÑ€Ð½Ð°Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð¡Ð£Ð‘Ð”, альтернатива MySQL ([http://www.php.net/manual/en/pgsql.installation.php инÑтрукциÑ, как Ñобрать PHP Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ PostgreSQL]). Могут вÑтречатьÑÑ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¸Ðµ неиÑправленные ошибки, не рекомендуетÑÑ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² рабочей ÑиÑтеме.',
'config-support-sqlite' => '* $1 — Ñто легковеÑÐ½Ð°Ñ ÑиÑтема баз данных, Ð¸Ð¼ÐµÑŽÑ‰Ð°Ñ Ð¾Ñ‡ÐµÐ½ÑŒ хорошую поддержку. ([http://www.php.net/manual/en/pdo.installation.php инÑтрукциÑ, как Ñобрать PHP Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ SQLite], работающей поÑредÑтвом PDO)',
'config-support-oracle' => '* $1 — Ñто коммерчеÑÐºÐ°Ñ Ð±Ð°Ð·Ð° данных маÑштаба предприÑтиÑ. ([http://www.php.net/manual/en/oci8.installation.php Как Ñобрать PHP Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ OCI8])',
- 'config-support-ibm_db2' => '$1 — коммерчеÑÐºÐ°Ñ Ð±Ð°Ð·Ð° данных маÑштаба предприÑтиÑ.',
+ 'config-support-ibm_db2' => '$1 — коммерчеÑÐºÐ°Ñ Ð±Ð°Ð·Ð° данных маÑштаба предприÑтиÑ.', # Fuzzy
'config-header-mysql' => 'ÐаÑтройки MySQL',
'config-header-postgres' => 'ÐаÑтройки PostgreSQL',
'config-header-sqlite' => 'ÐаÑтройки SQLite',
@@ -16159,8 +17175,8 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'Обновление завершено.
Теперь вы можете [$1 начать работу Ñ Ð²Ð¸ÐºÐ¸].',
- 'config-regenerate' => 'Создать LocalSettings.php заново →',
- 'config-show-table-status' => 'Ð—Ð°Ð¿Ñ€Ð¾Ñ Â«SHOW TABLE STATUS» не выполнен!',
+ 'config-regenerate' => 'Создать <code>LocalSettings.php</code> заново →',
+ 'config-show-table-status' => 'Ð—Ð°Ð¿Ñ€Ð¾Ñ Â«<code>SHOW TABLE STATUS</code>» не выполнен!',
'config-unknown-collation' => "'''Внимание:''' База данных иÑпользует нераÑпознанные правила Ñортировки.",
'config-db-web-account' => 'Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ð´Ð»Ñ Ð´Ð¾Ñтупа к базе данных из веб-Ñервера',
'config-db-web-help' => 'Выберите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль, которые веб-Ñервер будет иÑпользовать Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу базы данных при обычной работе вики.',
@@ -16231,7 +17247,7 @@ chmod a+w $3</pre>',
'config-optional-continue' => 'ПроизвеÑти тонкую наÑтройку',
'config-optional-skip' => 'Хватит, уÑтановить вики',
'config-profile' => 'Профиль прав прользователей:',
- 'config-profile-wiki' => 'Ð¢Ñ€Ð°Ð´Ð¸Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð²Ð¸ÐºÐ¸',
+ 'config-profile-wiki' => 'ÐžÑ‚ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð²Ð¸ÐºÐ¸',
'config-profile-no-anon' => 'ТребуетÑÑ Ñоздание учётной запиÑи',
'config-profile-fishbowl' => 'Только Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… редакторов',
'config-profile-private' => 'Ð—Ð°ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð²Ð¸ÐºÐ¸',
@@ -16241,7 +17257,7 @@ chmod a+w $3</pre>',
Однако, движок MediaWiki можно иÑпользовать и иными ÑпоÑобами, и не далеко не вÑех удаётÑÑ ÑƒÐ±ÐµÐ´Ð¸Ñ‚ÑŒ в преимущеÑтвах открытой вики-работы.
Так что в Ð²Ð°Ñ ÐµÑÑ‚ÑŒ выбор.
-ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ '''«{{int:config-profile-wiki}}»''' позволÑет вÑем править Ñтраницы даже не региÑтрируÑÑÑŒ на Ñайте. ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ '''{{int:config-profile-no-anon}}''' обеÑпечивает дополнительный учёт, но может отÑечь Ñлучайных учаÑтников.
+Модель '''«{{int:config-profile-wiki}}»''' позволÑет вÑем править Ñтраницы даже не региÑтрируÑÑÑŒ на Ñайте. ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ '''{{int:config-profile-no-anon}}''' обеÑпечивает дополнительный учёт, но может отÑечь Ñлучайных учаÑтников.
Сценарий '''«{{int:config-profile-fishbowl}}»''' разрешает редактирование только определённым учаÑтникам, но общедоÑтупным оÑтаётÑÑ Ð¿Ñ€Ð¾Ñмотр Ñтраниц, в том чиÑле проÑмотр иÑтории изменениÑ. Ð’ режиме '''«{{int:config-profile-private}}»''' проÑмотр Ñтраниц разрешён только определённым пользователÑм, какаÑ-то их чаÑÑ‚ÑŒ может иметь также права на редактирование.
@@ -16329,7 +17345,7 @@ GFDL может быть иÑпользована, но она Ñложна дл
'config-install-alreadydone' => "'''Предупреждение:''' Ð’Ñ‹, кажетÑÑ, уже уÑтанавливали MediaWiki и пытаетеÑÑŒ произвеÑти повторную уÑтановку.
ПожалуйÑта, перейдите на Ñледующую Ñтраницу.",
'config-install-begin' => 'Ðажав «{{int:config-continue}}», вы начнёте уÑтановку MediaWiki.
-ЕÑли вы хотите внеÑти изменениÑ, нажмите «Ðазад».',
+ЕÑли вы хотите внеÑти изменениÑ, нажмите «{{int:config-back}}».',
'config-install-step-done' => 'выполнено',
'config-install-step-failed' => 'не удалоÑÑŒ',
'config-install-extensions' => 'Ð’ том чиÑле раÑширениÑ',
@@ -16385,7 +17401,7 @@ $3
'''Примечание''': ЕÑли вы не Ñделаете Ñтого ÑейчаÑ, то Ñгенерированный файл конфигурации не будет доÑтупен вам в дальнейшем, еÑли вы выйдете из уÑтановки, не ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ñ ÐµÐ³Ð¾.
По окончании дейÑтвий, опиÑанных выше, вы Ñможете '''[$2 войти в вашу вики]'''.",
- 'config-download-localsettings' => 'Загрузить LocalSettings.php',
+ 'config-download-localsettings' => 'Загрузить <code>LocalSettings.php</code>',
'config-help' => 'Ñправка',
'config-nofile' => 'Файл "$1" не удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸. Он был удален?',
'mainpagetext' => "'''Вики-движок «MediaWiki» уÑпешно уÑтановлен.'''",
@@ -16394,7 +17410,8 @@ $3
== Ðекоторые полезные реÑурÑÑ‹ ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings СпиÑок возможных наÑтроек];
* [//www.mediawiki.org/wiki/Manual:FAQ ЧаÑто задаваемые вопроÑÑ‹ и ответы по MediaWiki];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce РаÑÑылка уведомлений о выходе новых верÑий MediaWiki].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce РаÑÑылка уведомлений о выходе новых верÑий MediaWiki].
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Перевод MediaWiki на Ñвой Ñзык]',
);
/** Rusyn (руÑиньÑкый)
@@ -16514,62 +17531,146 @@ $messages['shi'] = array(
* @author පසිඳු කà·à·€à·’න්ද
*/
$messages['si'] = array(
+ 'config-desc' => 'මà·à¶°à·Šâ€à¶ºà·€à·’කි සඳහ෠වූ ස්ථà·à¶´à¶šà¶º',
+ 'config-title' => 'මà·à¶°à·Šâ€à¶ºà·€à·’කි $1 ස්ථà·à¶´à¶±à¶º',
'config-information' => 'තොරතුරු',
+ 'config-localsettings-key' => 'උසස්කිරීම් යතුර:',
+ 'config-localsettings-badkey' => 'ඔබ ඉදිරිපත් කෙරූ යතුර à·€à·à¶»à¶¯à·’ය.',
+ 'config-session-error' => 'à·ƒà·à·ƒà·’ය ඇරඹීමේ දà·à·‚ය: $1',
'config-your-language' => 'ඔබේ භà·à·‚à·à·€:',
'config-wiki-language' => 'විකි භà·à·‚à·à·€:',
'config-back' => '↠ආපසු',
'config-continue' => 'ඉදිරියට →',
'config-page-language' => 'භà·à·‚à·à·€',
'config-page-welcome' => 'මà·à¶°à·Šâ€à¶ºà·€à·’කි වෙත පිළිගනිමු!',
+ 'config-page-dbconnect' => 'දත්ත සංචිතයට සම්බන්ධ කරන්න',
+ 'config-page-upgrade' => 'පවත්න෠ස්ථà·à¶´à¶±à¶º උසස් කරන්න',
'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-copying' => 'පිටපත් කරමින්',
+ 'config-page-upgradedoc' => 'උසස් කරමින්',
+ 'config-page-existingwiki' => 'පවත්න෠විකිය',
+ 'config-env-php' => 'PHP $1 ස්ථà·à¶´à·’තයි.',
+ 'config-db-type' => 'දත්ත සංචිත වර්ගය:',
+ 'config-db-host' => 'දත්ත සංචිත ධà·à¶»à¶š:',
+ 'config-db-wiki-settings' => 'මෙම විකිය හඳුන෠ගන්න',
'config-db-name' => 'දත්ත සංචිතයේ නම:',
+ 'config-db-name-oracle' => 'දත්ත සංචිත සංක්ෂිප්ත නිරූපණය:',
+ 'config-db-install-account' => 'ස්ථà·à¶´à¶±à¶º සඳහ෠පරිà·à·“ලක ගිණුම',
+ 'config-db-username' => 'දත්ත සංචිතයේ පරිà·à·“ලක නà·à¶¸à¶º:',
+ 'config-db-password' => 'දත්ත සංචිතයේ මුරපදය:',
+ 'config-db-wiki-account' => 'à·ƒà·à¶¸à·à¶±à·Šâ€à¶º ක්â€à¶»à·’යà·à¶šà·à¶»à·’ත්වය සඳහ෠පරිà·à·“ලක ගිණුම',
+ 'config-db-prefix' => 'දත්ත සංචිත වගු උපසර්ගය:',
+ '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-db-port' => 'දත්ත සංචිතයේ කවුළුව:',
+ 'config-db-schema' => 'මà·à¶°à·Šâ€à¶ºà·€à·’කි සඳහ෠සංක්ෂිප්ත නිරූපණය:',
+ 'config-pg-test-error' => "'''$1''' දත්ත සංචිතය වෙත සම්බන්ධ විය නොහà·à¶š: $2",
+ 'config-sqlite-dir' => 'SQLite දත්ත නà·à¶¸à·€à¶½à·’ය:',
+ 'config-oracle-def-ts' => 'à·ƒà·à¶¸à·à¶±à·Šâ€à¶º වගු අවකà·à·à¶º:',
+ 'config-oracle-temp-ts' => 'තà·à·€à¶šà·à¶½à·’ක වගු අවකà·à·à¶º:',
'config-type-ibm_db2' => 'IBM DB2',
'config-header-mysql' => 'MySQL à·ƒà·à¶šà·ƒà·”ම්',
'config-header-postgres' => 'PostgreSQL à·ƒà·à¶šà·ƒà·”ම්',
'config-header-sqlite' => 'SQLite à·ƒà·à¶šà·ƒà·”ම්',
'config-header-oracle' => 'ඔරකල් à·ƒà·à¶šà·ƒà·”ම්',
'config-header-ibm_db2' => 'IBM DB2 à·ƒà·à¶šà·ƒà·”ම්',
+ 'config-invalid-db-type' => 'වලංගු නොවන දත්ත සංචිත වර්ගය',
+ 'config-missing-db-name' => '"දත්ත සංචිත නà·à¶¸à¶º" සඳහ෠ඔබ විසින් අගයක් දිය යුතු වේ',
+ 'config-missing-db-host' => '"දත්ත සංචිත ධà·à¶»à¶šà¶º" සඳහ෠ඔබ විසින් අගයක් දිය යුතු වේ',
+ 'config-missing-db-server-oracle' => '"දත්ත සංචිත TNS" සඳහ෠ඔබ විසින් අගයක් දිය යුතු වේ',
+ 'config-regenerate' => 'නà·à·€à¶­ ජනිත කරන්න <code>LocalSettings.php</code> →',
+ 'config-db-web-account' => 'ජà·à¶½ ප්â€à¶»à·€à·šà·à¶±à¶º සඳහ෠දත්ත සංචිත ගිණුම',
+ 'config-mysql-engine' => 'ආචයන එන්ජිම:',
'config-mysql-innodb' => 'InnoDB',
'config-mysql-myisam' => 'MyISAM',
'config-mysql-binary' => 'ද්විමය',
'config-mysql-utf8' => 'UTF-8',
+ 'config-site-name' => 'විකියෙහි නම:',
'config-site-name-blank' => 'අඩවි නà·à¶¸à¶ºà¶šà·Š යොදන්න.',
'config-project-namespace' => 'ව්â€à¶ºà·à¶´à·˜à¶­à·’යේ නà·à¶¸à¶…වකà·à·à¶º:',
'config-ns-generic' => 'ව්â€à¶ºà·à¶´à·˜à¶­à·’ය',
+ 'config-ns-site-name' => 'විකියෙහි නම ලෙසම: $1',
'config-ns-other' => 'වෙනත් (විà·à·šà·‚ණය කරන්න)',
'config-ns-other-default' => 'මගේවිකිය',
'config-admin-box' => 'පරිපà·à¶½à¶š ගිණුම',
'config-admin-name' => 'ඔබේ නම:',
'config-admin-password' => 'මුරපදය:',
'config-admin-password-confirm' => 'මුරපදය නà·à·€à¶­à¶­à·Š:',
+ 'config-admin-name-blank' => 'පරිපà·à¶½à¶š පරිà·à·“ලක නà·à¶¸à¶º යොදන්න.',
+ 'config-admin-password-blank' => 'පරිපà·à¶½à¶š ගිණුම සඳහ෠මුරපදය යොදන්න.',
+ 'config-admin-password-same' => 'මුරපදය හ෠පරිà·à·“ලක නà·à¶¸à¶º එක සමà·à¶± නොවිය යුතුය.',
+ 'config-admin-password-mismatch' => 'ඔබ ඇතුළු කල මුරපද දෙක නොගà·à¶½à¶´à·š.',
'config-admin-email' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය:',
- 'config-profile-wiki' => 'à·ƒà·à¶¸à·Šà¶´à·Šâ€à¶»à¶¯à·à¶ºà·’ක විකිය',
+ 'config-admin-error-bademail' => 'ඔබ විසින් වලංගු නොවන විද්â€à¶ºà·”ත්-ලිපිනයක් යොද෠ඇත.',
+ 'config-optional-continue' => 'මගෙන් තව ප්â€à¶»à·à·Šà¶« අහන්න.',
+ 'config-optional-skip' => 'මම දà·à¶±à¶§à¶¸à¶­à·Š කම්මà·à¶½à·’ වී ඇත, විකිය ස්ථà·à¶´à¶±à¶º කරන්න.',
+ 'config-profile' => 'පරිà·à·“ලක හිමිකම් පà·à¶­à·’කඩ:',
+ 'config-profile-wiki' => 'à·ƒà·à¶¸à·Šà¶´à·Šâ€à¶»à¶¯à·à¶ºà·’ක විකිය', # Fuzzy
'config-profile-no-anon' => 'ගිණුම් තà·à¶±à·“ම අවà·à·Šâ€à¶ºà¶ºà·’',
+ 'config-profile-fishbowl' => 'අවසරලත් සංස්කà·à¶»à¶šà·€à¶»à·”න් පමණි',
'config-profile-private' => 'පුද්ගලික විකිය',
+ 'config-license' => 'කතුහිමිකම සහ බලපත්â€à¶»à¶º:',
+ 'config-license-none' => 'බලපත්â€à¶» පà·à¶¯ තලයක් නොමà·à¶­',
+ 'config-license-cc-by-sa' => 'නිර්මà·à¶«à·à¶­à·Šà¶¸à¶š පොදුජන ආරà·à¶´à¶«à¶º හුවමà·à¶»à·”වට සමà·à¶±à·€',
+ 'config-license-cc-by' => 'නිර්මà·à¶«à·à¶­à·Šà¶¸à¶š පොදුජන ආරà·à¶´à¶«à¶º',
+ 'config-license-cc-by-nc-sa' => 'නිර්මà·à¶«à·à¶­à·Šà¶¸à¶š පොදුජන ආරà·à¶´à¶«à¶º à·€à·à¶«à·’ජ්â€à¶º-නොවන හුවමà·à¶»à·”වට සමà·à¶±à·€',
'config-license-pd' => 'පොදු වසම',
'config-email-settings' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š à·ƒà·à¶šà·ƒà·”ම්',
+ 'config-enable-email' => 'පිටතට යොමු වූ විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල සක්â€à¶»à·’ය කරන්න',
+ 'config-email-user' => 'පරිà·à·“ලක-වෙත-පරිà·à·“ලක විද්â€à¶ºà·”ත්-තà·à¶´à·‘ල සක්â€à¶»à·’ය කරන්න',
+ 'config-email-usertalk' => 'පරිà·à·“ලක කතà·à¶¶à·„ පිටු නිවේදනය සක්â€à¶»à·’ය කරන්න',
+ 'config-email-watchlist' => 'මුරලà·à¶ºà·’ස්තු නිවේදනය සක්â€à¶»à·’ය කරන්න',
+ 'config-email-auth' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š සහතික කිරීම සක්â€à¶»à·’ය කරන්න',
+ 'config-email-sender' => 'ප්â€à¶»à¶­à·Šâ€à¶ºà·à¶œà¶¸à¶± විද්â€à¶ºà·”ත්-තà·à¶´à·à¶½à·Š ලිපිනය:',
+ 'config-upload-settings' => 'පින්තූර සහ ගොනු උඩුගත කිරීම්',
+ 'config-upload-enable' => 'ගොනු උඩුගත කිරීම් සක්â€à¶»à·’ය කරන්න',
'config-upload-deleted' => 'මà·à¶šà·– ගොනු සඳහ෠නà·à¶¸à·à·€à¶½à·’ය:',
+ 'config-logo' => 'ලà·à¶‚ඡනයේ URL:',
+ 'config-instantcommons' => 'ක්ෂණික කොමන්ස් සක්â€à¶»à·’ය කරන්න',
+ 'config-cc-again' => 'නà·à·€à¶­ ඇහිඳගන්න...',
+ 'config-advanced-settings' => 'උසස් වින්â€à¶ºà·à·ƒà¶œà¶­à¶šà·™à¶»à·”ම',
+ 'config-cache-options' => 'වස්තු කෑෂය සඳහ෠සà·à¶šà·ƒà·”ම්:',
+ 'config-memcached-servers' => 'මතකකෑෂිත සර්වරයන්:',
'config-extensions' => 'විස්තීර්ණ',
'config-install-step-done' => 'සිදුකලà·',
'config-install-step-failed' => 'අසà·à¶»à·Šà¶®à¶šà¶ºà·’',
+ 'config-install-extensions' => 'විස්තීර්ණ අඩංගු කරමින්',
+ 'config-install-database' => 'දත්ත සංචිතය සකසමින්',
+ 'config-install-schema' => 'සංක්ෂිප්ත නිරූපණය තනමින්',
+ 'config-install-pg-schema-not-exist' => 'PostgreSQL සංක්ෂිප්ත නිරූපණය නොපවතියි.',
+ 'config-install-pg-commit' => 'වෙනස්කම් ප්â€à¶»à¶ºà·à¶´à¶±à¶º කරමින්',
+ 'config-install-pg-plpgsql' => 'PL/pgSQL භà·à·‚à·à·€ සඳහ෠පරික්ෂ෠කරමින්',
+ 'config-install-user' => 'දත්ත සංචිත පරිà·à·“ලක තනමින්',
+ 'config-install-user-alreadyexists' => '"$1" පරිà·à·“ලක දà·à¶±à¶§à¶¸à¶­à·Š පවතී',
+ 'config-install-user-create-failed' => '"$1" පරිà·à·“ලක තà·à¶±à·“ම අසà·à¶»à·Šà¶®à¶šà¶ºà·’: $2',
+ 'config-install-user-missing' => 'විà·à·šà·‚ණය කෙරූ "$1" පරිà·à·“ලකය෠නොපවතියි.',
'config-install-tables' => 'වගු තනමින්',
+ 'config-install-interwiki' => 'à·ƒà·à¶¸à·à¶±à·Šâ€à¶º අන්තර්විකි වගුව ගහනය කරමින්',
+ 'config-install-interwiki-list' => '<code>interwiki.list</code> ගොනුව කියවිය නොහà·à¶š.',
+ 'config-install-stats' => 'සංඛ්â€à¶ºà·à¶±à¶º අරඹමින්',
+ 'config-install-keys' => 'රහස් යතුරු ජනිත කරමින්',
+ 'config-install-sysop' => 'පරිපà·à¶½à¶š පරිà·à·“ලක ගිණුම තනමින්',
+ 'config-install-mainpage' => 'à·ƒà·à¶¸à·à¶±à·Šâ€à¶º අන්තර්ගතය සමඟින් ප්â€à¶»à¶°à·à¶± පිටුව තනමින්',
+ 'config-install-mainpage-failed' => 'ප්â€à¶»à¶°à·à¶± පිටුව ඇතුල් කල නොහà·à¶š: $1',
+ 'config-download-localsettings' => '<code>LocalSettings.php</code> බà·à¶œà¶±à·Šà¶±',
'config-help' => 'උදව්',
+ 'config-nofile' => '"$1" ගොනුව සොයà·à¶œà¶­ නොහà·à¶š. එක මà·à¶šà·’ල෠ගියà·à·€à¶­à·Šà¶¯?',
'mainpagetext' => "'''මීඩියà·à·€à·’කි à·ƒà·à¶»à·Šà¶®à¶š ලෙස ස්ථà·à¶´à¶±à¶º කරන ලදි.'''",
'mainpagedocfooter' => 'විකි මෘදුකà·à¶‚ග භà·à·€à·’ත෠කිරීම පිළිබඳ තොරතුරු සඳහ෠[//meta.wikimedia.org/wiki/Help:Contents පරිà·à·“ලකයන් සඳහ෠නියමුව] හදà·à¶»à¶±à·Šà¶±.
== ඇරඹුම ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings වින්â€à¶ºà·à·ƒ à·ƒà·à¶šà·ƒà·”ම්]
* [//www.mediawiki.org/wiki/Manual:FAQ මීඩියà·à·€à·’කි නිති-විමසන-පà·à¶±]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce මීඩියà·à·€à·’කි නිකුතුව තà·à¶´à·à¶½à·Š ලà·à¶ºà·’ස්තුව]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce මීඩියà·à·€à·’කි නිකුතුව තà·à¶´à·à¶½à·Š ලà·à¶ºà·’ස්තුව]', # Fuzzy
);
/** Slovak (slovenÄina)
@@ -16581,7 +17682,7 @@ $messages['sk'] = array(
'config-back' => '↠Späť',
'config-continue' => 'PokraÄovaÅ¥ →',
'config-page-language' => 'Jazyk',
- 'config-download-localsettings' => 'Stiahnuť LocalSettings.php',
+ 'config-download-localsettings' => 'Stiahnuť <code>LocalSettings.php</code>',
'config-nofile' => 'Súbor "$1" sa nenašiel. Bol zmazaný?',
'mainpagetext' => "'''Softvér MediaWiki bol úspešne nainštalovaný.'''",
'mainpagedocfooter' => 'Informácie ako používaÅ¥ wiki softvér nájdete v [//meta.wikimedia.org/wiki/Help:Contents Používateľskej príruÄke].
@@ -16590,7 +17691,7 @@ $messages['sk'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Zoznam konfiguraÄných nastavení]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailing list nových verzií MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailing list nových verzií MediaWiki]', # Fuzzy
);
/** Slovenian (slovenÅ¡Äina)
@@ -16601,12 +17702,12 @@ $messages['sl'] = array(
'config-desc' => 'Namestitveni program za MediaWiki',
'config-title' => 'Namestitev MediaWiki $1',
'config-information' => 'Informacije',
- 'config-localsettings-cli-upgrade' => 'Zaznana je bila datoteka LocalSettings.php.
-Za nadgradnjo te namestitve zaženite update.php',
+ 'config-localsettings-cli-upgrade' => 'Zaznana je bila datoteka <code>LocalSettings.php</code>.
+Za nadgradnjo te namestitve zaženite <code>update.php</code>',
'config-localsettings-key' => 'Nadgraditveni kljuÄ:',
'config-localsettings-badkey' => 'Naveden kljuÄ je napaÄen.',
'config-upgrade-key-missing' => 'Zaznana je bila obstojeÄa namestitev MediaWiki.
-Za nadgradnjo te namestitve vstavite naslednjo vrstico na dno vaše LocalSettings.php:
+Za nadgradnjo te namestitve vstavite naslednjo vrstico na dno vaše <code>LocalSettings.php</code>:
$1',
'config-session-error' => 'Napaka pri zaÄenjanju seje: $1',
@@ -16717,8 +17818,8 @@ Preverite mapo podatkov in ime zbirke podatkov spodaj ter poskusite znova.',
'config-upgrade-done-no-regenerate' => 'Nadgradnja je konÄana.
Sedaj lahko [$1 zaÄnete uporabljati vaÅ¡ wiki].',
- 'config-regenerate' => 'Ponovno ustvari LocalSettings.php →',
- 'config-show-table-status' => 'Poizvedba SHOW TABLE STATUS ni uspela!',
+ 'config-regenerate' => 'Ponovno ustvari <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'Poizvedba <code>SHOW TABLE STATUS</code> ni uspela!',
'config-unknown-collation' => "'''Opozorilo:''' Zbirke podatkov uporablja neprepoznano razvrÅ¡Äanje znakov.",
'config-db-web-account' => 'RaÄun zbirke podatkov za spletni dostop',
'config-db-web-account-same' => 'Uporabi enak raÄun kot za namestitev',
@@ -16763,7 +17864,7 @@ Sedaj lahko preskoÄite preostalo konfiguriranje in zdaj namestite wiki.',
'config-optional-continue' => 'Zastavi mi veÄ vpraÅ¡anj.',
'config-optional-skip' => 'Se že dolgoÄasim; samo namesti wiki.',
'config-profile' => 'Profil uporabniških pravic:',
- 'config-profile-wiki' => 'KlasiÄen wiki',
+ 'config-profile-wiki' => 'Odprti wiki',
'config-profile-no-anon' => 'Zahtevano je ustvarjanje raÄuna',
'config-profile-fishbowl' => 'Samo pooblaÅ¡Äeni urejevalci',
'config-profile-private' => 'Zasebni wiki',
@@ -16802,11 +17903,11 @@ Vnesite ime dovoljenja roÄno.',
'config-install-pg-schema-not-exist' => 'Shema PostgreSQL ne obstaja.',
'config-install-user-alreadyexists' => 'Uporabnik »$1« že obstaja',
'config-install-tables' => 'Ustvarjanje tabel',
- 'config-download-localsettings' => 'Prenesi LocalSettings.php',
+ 'config-download-localsettings' => 'Prenesi <code>LocalSettings.php</code>',
'config-help' => 'pomoÄ',
'mainpagetext' => "'''Programje MediaWiki je bilo uspeÅ¡no nameÅ¡Äeno.'''",
'mainpagedocfooter' => 'Za uporabo in pomoÄ pri nastavitvi, prosimo, preglejte [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentacijo za prilagajanje vmesnika]
-in [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide UporabniÅ¡ki priroÄnik].',
+in [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide UporabniÅ¡ki priroÄnik].', # Fuzzy
);
/** Lower Silesian (Schläsch)
@@ -17027,12 +18128,14 @@ MediaWiki kräver PHP $2 eller högre.',
'config-diff3-bad' => 'GNU diff3 hittades inte.',
'config-using-server' => 'Använder servernamn "<nowiki>$1</nowiki>".',
'config-using-uri' => 'Använder server-URL "<nowiki>$1$2</nowiki>".',
+ 'config-db-type' => 'Databastyp:',
'config-db-wiki-settings' => 'Identifiera denna wiki',
'config-db-name' => 'Databasnamn:',
'config-db-name-oracle' => 'Databasschema:',
'config-db-install-account' => 'Användarkonto för installation',
'config-db-username' => 'Databas-användarnamn:',
'config-db-password' => 'Databas-lösenord:',
+ 'config-db-port' => 'Databasport:',
'config-db-schema' => 'Schema för MediaWiki',
'config-header-mysql' => 'MySQL-inställningar',
'config-header-postgres' => 'PostgreSQL-inställningar',
@@ -17061,10 +18164,19 @@ Detta '''rekommenderas inte''' om du har problem med din wiki.",
'config-upgrade-done-no-regenerate' => 'Uppgraderingen slutfördes.
Du kan nu [$1 börja använda din wiki].',
+ 'config-db-web-account-same' => 'Använd samma konto som för installation',
+ 'config-db-web-create' => 'Skapa kontot om det inte redan finns',
+ 'config-mysql-engine' => 'Lagringsmotor:',
+ 'config-mysql-binary' => 'Binär',
'config-mysql-utf8' => 'UTF-8',
'config-site-name' => 'Namnet på wikin:',
'config-site-name-blank' => 'Ange ett sidnamn.',
'config-ns-generic' => 'Projekt',
+ 'config-ns-invalid' => 'Den angivna namnrymden "<nowiki>$1</nowiki>" är ogiltig.
+Ange ett annat namnrymd för projektet.',
+ 'config-ns-conflict' => 'Den angivna namnrymden "<nowiki>$1</nowiki>" står i konflikt med en standardnamnrymd för MediaWiki.
+Ange ett annat namnrymd för projektet.',
+ 'config-admin-box' => 'Administratörskonto',
'config-admin-name' => 'Ditt namn:',
'config-admin-password' => 'Lösenord:',
'config-admin-password-confirm' => 'Lösenord igen:',
@@ -17074,26 +18186,78 @@ Detta är namnet du kommer att använda för att logga in på wikin.',
'config-admin-name-invalid' => 'Det angivna användarnamnet "<nowiki>$1</nowiki>" är ogiltigt.
Ange ett annat användarnamn.',
'config-admin-password-blank' => 'Ange ett lösenord för administratörskontot.',
+ 'config-admin-password-same' => 'Lösenordet får inte vara samma som användarnamnet.',
+ 'config-admin-password-mismatch' => 'De två lösenord du uppgett överensstämmer inte med varandra.',
'config-admin-email' => 'E-postadress:',
'config-admin-error-bademail' => 'Du har angivit en felaktigt e-postadress.',
+ 'config-almost-done' => 'Du är nästan färdig!
+Du kan nu hoppa över återstående konfigurationer och installera wikin nu.',
'config-optional-continue' => 'Ställ fler frågor till mig.',
+ 'config-optional-skip' => 'Jag är redan uttråkad, bara installera wiki.',
+ 'config-profile-wiki' => 'Öppen wiki',
+ 'config-profile-fishbowl' => 'Endast auktoriserade redigerare',
'config-profile-private' => 'Privat wiki',
'config-license' => 'Upphovsrätt och licens:',
+ 'config-license-none' => 'Ingen licenssidfot',
+ 'config-license-cc-by-sa' => 'Creative Commons Erkännande Dela Lika',
+ 'config-license-cc-by' => 'Creative Commons Erkännande',
+ 'config-license-cc-by-nc-sa' => 'Creative Commons Erkännande Icke-Kommersiell Dela Lika',
+ 'config-license-cc-0' => 'Creative Commons Zero (allmän egendom)',
+ 'config-license-gfdl' => 'GNU Free Documentation License 1.3 eller senare',
'config-license-pd' => 'Allmän egendom',
+ 'config-license-cc-choose' => 'Välj en anpassad Creative Commons-licens',
'config-email-settings' => 'E-postinställningar',
+ 'config-email-watchlist' => 'Aktivera meddelanden för bevakningslistan',
+ 'config-upload-settings' => 'Bild- och filuppladdningar',
+ 'config-upload-enable' => 'Aktivera filöverföringar',
+ 'config-upload-deleted' => 'Mapp för raderade filer:',
+ 'config-logo' => 'Logotyp-URL:',
+ 'config-cc-again' => 'Välj igen...',
+ 'config-advanced-settings' => 'Avancerad konfiguration',
+ 'config-extensions' => 'Tillägg',
'config-install-step-done' => 'klar',
'config-install-step-failed' => 'misslyckades',
+ 'config-install-database' => 'Konfigurerar databas',
+ 'config-install-schema' => 'Skapar schema',
+ 'config-install-user' => 'Skapar databasanvändare',
+ 'config-install-user-alreadyexists' => 'Användaren "$1" finns redan',
+ 'config-install-user-create-failed' => 'Misslyckades att skapa användare "$1": $2',
+ 'config-install-user-missing' => 'Den angivna användaren "$1" existerar inte.',
+ 'config-install-tables' => 'Skapar tabeller',
+ 'config-install-interwiki' => 'Lägger till standardtabell för interwiki',
+ 'config-install-interwiki-list' => 'Kunde inte läsa filen <code>interwiki.list</code>.',
+ 'config-install-stats' => 'Initierar statistik',
+ 'config-install-keys' => 'Genererar hemliga nycklar',
'config-insecure-keys' => "'''Varning:''' {{PLURAL:$2|En säkerhetsnyckel|Säkerhetsnycklar}} ($1) som generades under installationen är inte helt {{PLURAL:$2|säker|säkra}} . Överväg att ändra {{PLURAL:$2|den|dem}} manuellt.",
- 'config-download-localsettings' => 'Ladda ned LocalSettings.php',
+ 'config-install-sysop' => 'Skapar administratörskonto',
+ 'config-install-mainpage' => 'Skapa huvudsida med standardinnehåll',
+ 'config-install-extension-tables' => 'Skapar tabeller för aktiverade tillägg',
+ 'config-install-done' => "'''Grattis!'''
+Du har installerat MediaWiki.
+
+Installationsprogrammet har genererat filen <code>LocalSettings.php</code>.
+Det innehåller alla dina konfigurationer.
+
+Du kommer att behöva ladda ned den och placera den i botten av din wiki-installation (samma mapp som index.php). Nedladdningen borde ha startats automatiskt.
+
+Om ingen nedladdning erbjöds, eller om du har avbrutit det kan du starta om nedladdningen genom att klicka på länken nedan:
+
+$3
+
+'''OBS''': Om du inte gör detta nu, kommer denna genererade konfigurationsfil inte vara tillgänglig för dig senare om du avslutar installationen utan att ladda ned den.
+
+När det är klart, kan du '''[$2 gå in på din wiki]'''.",
+ 'config-download-localsettings' => 'Ladda ned <code>LocalSettings.php</code>',
'config-help' => 'hjälp',
+ 'config-nofile' => 'Filen "$1" kunde inte hittas. Har den tagits bort?',
'mainpagetext' => "'''MediaWiki har installerats utan problem.'''",
'mainpagedocfooter' => 'Information om hur wiki-programvaran används finns i [//meta.wikimedia.org/wiki/Help:Contents användarguiden].
== Att komma igång ==
-
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista över konfigurationsinställningar]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mail list]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mail list]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokalisera MediaWiki för ditt språk]',
);
/** Swahili (Kiswahili)
@@ -17193,7 +18357,7 @@ $messages['ta'] = array(
'config-optional-continue' => 'எனà¯à®©à¯ˆ இனà¯à®©à¯à®®à¯ அதிகமாக வினவà¯.',
'config-optional-skip' => 'நான௠à®à®±à¯à®•à®©à®µà¯‡ சோரà¯à®µà®Ÿà¯ˆà®¨à¯à®¤à¯à®³à¯à®³à¯‡à®©à¯, விகà¯à®•à®¿à®¯à¯ˆ மடà¯à®Ÿà¯à®®à¯ உரà¯à®µà®¾à®•à¯à®•à¯.',
'config-profile' => 'பயனர௠உரிமைகள௠சà¯à®¯à®µà®¿à®µà®°à®®à¯:',
- 'config-profile-wiki' => 'பாரமà¯à®ªà®°à®¿à®¯ விகà¯à®•à®¿',
+ 'config-profile-wiki' => 'பாரமà¯à®ªà®°à®¿à®¯ விகà¯à®•à®¿', # Fuzzy
'config-profile-no-anon' => 'கணகà¯à®•à¯ உரà¯à®µà®¾à®•à¯à®•à¯à®¤à®²à¯ அவசியமà¯',
'config-profile-private' => 'தனியார௠விகà¯à®•à®¿',
'config-license' => 'பதிபà¯à®ªà¯à®°à®¿à®®à¯ˆ மறà¯à®±à¯à®®à¯ உரிமமà¯:',
@@ -17214,7 +18378,7 @@ $messages['ta'] = array(
'config-install-tables' => 'வரிசைப௠படà¯à®Ÿà®¿à®¯à®²à¯à®•à®³à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯à®•à®¿à®±à®¤à¯',
'config-install-mainpage' => 'இயலà¯à®ªà¯à®¨à®¿à®²à¯ˆ உளà¯à®³à®Ÿà®•à¯à®•à®¤à¯à®¤à¯à®Ÿà®©à¯ à®®à¯à®¤à®±à¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯à®•à®¿à®±à®¤à¯',
'config-install-extension-tables' => 'செயறà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿ நீடà¯à®šà®¿à®•à®³à¯à®•à¯à®•à¯ வரிசைப௠படà¯à®Ÿà®¿à®¯à®²à¯à®•à®³à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯à®•à®¿à®±à®¤à¯',
- 'config-download-localsettings' => 'LocalSettings.phpà®à®¤à¯ தரவிறகà¯à®•à®µà¯à®®à¯',
+ 'config-download-localsettings' => '<code>LocalSettings.php</code>à®à®¤à¯ தரவிறகà¯à®•à®µà¯à®®à¯',
'config-help' => 'உதவி',
'mainpagetext' => "'''விகà¯à®•à®¿ மெனà¯à®ªà¯Šà®°à¯à®³à¯ வெறà¯à®±à®¿à®•à®°à®®à®¾à®• உளà¯à®³à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.'''",
'mainpagedocfooter' => 'விகà¯à®•à®¿ மெனà¯à®ªà¯Šà®°à¯à®³à¯ˆà®ªà¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®µà®¤à¯ தொடரà¯à®ªà®¾à®• [//meta.wikimedia.org/wiki/Help:Contents பயனர௠வழிகாடà¯à®Ÿà®¿à®¯à¯ˆà®ªà¯] பாரà¯à®•à¯à®•.
@@ -17223,7 +18387,7 @@ $messages['ta'] = array(
* [//www.mediawiki.org/wiki/Manual:Configuration_settings அமைபà¯à®ªà¯à®•à¯à®•à®³à¯ˆ மாறà¯à®±à®®à¯ செயà¯à®¤à®²à¯]
* [//www.mediawiki.org/wiki/Manual:FAQ மிடியாவிகà¯à®•à®¿ பொதà¯à®µà®¾à®© கேளà¯à®µà®¿à®•à®³à¯]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce மீடியாவிகà¯à®•à®¿ வெளியீட௠மினà¯à®©à®žà¯à®šà®²à¯ படà¯à®Ÿà®¿à®¯à®²à¯]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce மீடியாவிகà¯à®•à®¿ வெளியீட௠மினà¯à®©à®žà¯à®šà®²à¯ படà¯à®Ÿà®¿à®¯à®²à¯]', # Fuzzy
);
/** Tulu (ತà³à²³à³)
@@ -17368,6 +18532,7 @@ $messages['tk'] = array(
/** Tagalog (Tagalog)
* @author AnakngAraw
* @author Sky Harbor
+ * @author ì•„ë¼
*/
$messages['tl'] = array(
'config-desc' => 'Ang tagapagluklok para sa MediaWiki',
@@ -17375,20 +18540,20 @@ $messages['tl'] = array(
'config-information' => 'Kabatiran',
'config-localsettings-upgrade' => 'Napansin ang isang talaksang <code>LocalSettings.php</code>.
Upang maitaas ang uri ng pagluluklok na ito, paki ipasok ang halaga ng <code>$wgUpgradeKey</code> sa loob ng kahong nasa ibaba.
-Matatagpuan mo ito sa loob ng LocalSettings.php.',
- 'config-localsettings-cli-upgrade' => 'Napansin ang isang talaksan ng LocalSettings.php.
-Upang isapanahon ang pagtatalagang ito, mangyaring patakbuhin sa halip ang update.php',
+Matatagpuan mo ito sa loob ng <code>LocalSettings.php</code>.',
+ 'config-localsettings-cli-upgrade' => 'Napansin ang isang talaksan ng <code>LocalSettings.php</code>.
+Upang isapanahon ang pagtatalagang ito, mangyaring patakbuhin sa halip ang <code>update.php</code>',
'config-localsettings-key' => 'Susi ng pagsasapanahon:',
'config-localsettings-badkey' => 'Hindi tama ang susing ibinigay mo.',
'config-upgrade-key-missing' => 'Napansin ang isang umiiral na pagtatalaga ng MediaWiki.
-Upang isapanahon ang katalagahang ito, mangyaring ilagay ang sumusunod na guhit sa ilalim ng iyong LocalSettings.php:
+Upang isapanahon ang katalagahang ito, mangyaring ilagay ang sumusunod na guhit sa ilalim ng iyong <code>LocalSettings.php</code>:
$1',
- 'config-localsettings-incomplete' => 'Lumilitaw na hindi pa buo ang umiiral na LocalSettings.php.
+ 'config-localsettings-incomplete' => 'Lumilitaw na hindi pa buo ang umiiral na <code>LocalSettings.php</code>.
Ang pabagu-bagong $1 ay hindi nakatakda.
-Mangyaring baguhin ang LocalSettings.php upang ang maitakda ang pagpapabagu-bagong ito, at pindutin ang "Magpatuloy".',
- 'config-localsettings-connection-error' => 'Isang kamalian ang nakatagpo noong kumakabit sa kalipunan ng dato na ginagamit ang tinukoy na mga katakdaan sa loob ng LocalSettings.php o
-AdminSettings.php. Paki kumpunihin ang mga katakdaang ito at subukang muli.
+Mangyaring baguhin ang <code>LocalSettings.php</code> upang ang maitakda ang pagpapabagu-bagong ito, at pindutin ang "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => 'Isang kamalian ang nakatagpo noong kumakabit sa kalipunan ng dato na ginagamit ang tinukoy na mga katakdaan sa loob ng <code>LocalSettings.php</code> o
+<code>AdminSettings.php</code>. Paki kumpunihin ang mga katakdaang ito at subukang muli.
$1',
'config-session-error' => 'Kamalian sa pagsisimula ng sesyon: $1',
@@ -17517,7 +18682,7 @@ Pinigilan ang pag-iinstala.",
'config-brokenlibxml' => "Ang sistema mo ay mayroong isang pagsasama ng mga bersiyon ng PHP at libxml2 na maaaring masurot at maaaring makapagsanhi ng pagkasira ng datong nakakubli sa loob ng MediaWiki at iba pang mga aplikasyon ng sangkasaputan.
Magtaas ng uri upang maging PHP 5.2.9 o mas lalong huli at libxml2 2.7.3 o mas lalong huli ([//bugs.php.net/bug.php?id=45996 isinalansan ang surot o ''bug'' na mayroong PHP]). Binigo ang pagluluklok.",
'config-using531' => 'Hindi maaaring gamitin ang MediaWiki na kapiling ang PHP na $1 dahil sa isang surot na kinasasangkutan ng mga parametrong pangsangguni sa <code>__call()</code>. Magtaas ng uri upang maging PHP 5.3.2 o mas mataas, o magbaba ng uri upang maging PHP 5.3.0 upang malutas ito. Binigo ang pagluluklok.',
- 'config-suhosin-max-value-length' => 'Nakaluklok ang Suhosin at hinahanggahan ang haba ng parametro ng GET sa $1 mga byte. Ang sangkap na ResourceLoader ng MediaWiki ay gagana sa paligid ng hangganang ito, subalit pasasamain nito ang pagganap. Kung talagang maaari, dapat mong itakda ang suhosin.get.max_value_length upang maging 1024 o mas mataas sa loob ng php.ini, at itakda ang $wgResourceLoaderMaxQueryLength sa katulad na halaga sa loob ng LocalSettings.php.',
+ 'config-suhosin-max-value-length' => 'Nakaluklok ang Suhosin at hinahanggahan ang haba ng parametro ng GET sa $1 mga byte. Ang sangkap na ResourceLoader ng MediaWiki ay gagana sa paligid ng hangganang ito, subalit pasasamain nito ang pagganap. Kung talagang maaari, dapat mong itakda ang <code>suhosin.get.max_value_length</code> upang maging 1024 o mas mataas sa loob ng <code>php.ini</code>, at itakda ang <code>$wgResourceLoaderMaxQueryLength</code> sa katulad na halaga sa loob ng LocalSettings.php.', # Fuzzy
'config-db-type' => 'Uri ng kalipunan ng datos:',
'config-db-host' => 'Tagapagpasinaya ng kalipunan ng datos:',
'config-db-host-help' => 'Kung ang iyong tagapaghain ng kalipunan ng dato ay nasa ibabaw ng isang ibang tagapaghain, ipasok ang pangalan ng tagapagpasinaya o tirahan ng IP dito.
@@ -17602,7 +18767,7 @@ Kung hindi mo makita ang sistema ng kalipunan ng dato na sinusubukan mong gamiti
'config-support-postgres' => '* Ang $1 ay isang bantog na sistema ng kalipunan ng dato na bukas ang pinagmulan na panghalili sa MySQL ([http://www.php.net/manual/en/pgsql.installation.php paano magtipon ng PHP na mayroong suporta ng PostgreSQL]). Maaaring mayroong ilang hindi pangunahing mga surot na natitira pa, at hindi iminumungkahi para gamitin sa loob ng isang kapaligiran ng produksiyon.',
'config-support-sqlite' => 'Ang $1 ay isang magaan ang timbang na sistema ng kalipunan ng dato na sinusuportahan nang napaka mainam. ([http://www.php.net/manual/en/pdo.installation.php Paano magtipon ng PHP na mayroong suporta ng SQLite], gumagamit ng PDO)',
'config-support-oracle' => '* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal. ([http://www.php.net/manual/en/oci8.installation.php Paano magtipunan ng PHP na mayroong suporta ng OCI8])',
- 'config-support-ibm_db2' => '* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal.',
+ 'config-support-ibm_db2' => '* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal.', # Fuzzy
'config-header-mysql' => 'Mga katakdaan ng MySQL',
'config-header-postgres' => 'Mga katakdaan ng PostgreSQL',
'config-header-sqlite' => 'Mga katakdaan ng SQLite',
@@ -17669,8 +18834,8 @@ Kung nais mong muling likhain ang iyong talaksang <code>LocalSettings.php</code>
'config-upgrade-done-no-regenerate' => 'Buo na ang pagsasapanahon.
Maaari ka na ngayong [$1 magsimula sa paggamit ng wiki mo].',
- 'config-regenerate' => 'Muling likhain ang LocalSettings.php →',
- 'config-show-table-status' => 'Nabigo ang pagtatanong na IPAKITA ANG KALAGAYAN NG TALAHANAYAN!',
+ 'config-regenerate' => 'Muling likhain ang <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'Nabigo ang pagtatanong na IPAKITA ANG KALAGAYAN NG TALAHANAYAN!', # Fuzzy
'config-unknown-collation' => "'''Babala:''' Ang kalipunan ng dato ay gumagagamit ng hindi nakikilalang pag-iipon.",
'config-db-web-account' => 'Akawnt ng kalipunan ng dato para sa pagpunta sa web',
'config-db-web-help' => 'Piliin ang pangalan ng tagagamit at hudyat na gagamitin ng tagapaghain ng web upang umugnay sa tagapaghain ng kalipunan ng dato, habang nasa pangkaraniwang pagtakbo ng wiki.',
@@ -17740,7 +18905,7 @@ Maaari mo ngayong laktawan ang natitira pang pag-aayos at iluklok na ang wiki ng
'config-optional-continue' => 'Magtanong sa akin ng marami pang mga tanong.',
'config-optional-skip' => 'Naiinip na ako, basta iluklok na lang ang wiki.',
'config-profile' => 'Balangkas ng mga karapatan ng tagagamit:',
- 'config-profile-wiki' => 'Tradisyonal na wiki',
+ 'config-profile-wiki' => 'Tradisyonal na wiki', # Fuzzy
'config-profile-no-anon' => 'Kailangan ang paglikha ng akawnt',
'config-profile-fishbowl' => 'Pinahintulutang mga patnugot lamang',
'config-profile-private' => 'Pribadong wiki',
@@ -17756,7 +18921,7 @@ Ang isang wiki na mayroong '''{{int:config-profile-no-anon}}''' ay nagbibigay ng
Ang tagpo na '''{{int:config-profile-fishbowl}}''' ay nagpapahintulot lamang sa pinayagang mga tagagamit na makatingin ng mga pahina, na kapiling ang pangkat na pinayagang makapamatnugot.
Ang isang '''{{int:config-profile-private}}''' ay nagpapahintulot lamang sa pinayagang mga tagagamit na makatingin ng mga pahina, na kapiling ang pangkat na pinayagang makapamatnugot.
-Ang mas masasalimuot na mga kaayusan ng mga karapatan ng tagagamit ay makukuha pagkaraan ng pagluluklok, tingnan ang [//www.mediawiki.org/wiki/Manual:User_rights may kaugnayang kinamay na lahok].",
+Ang mas masasalimuot na mga kaayusan ng mga karapatan ng tagagamit ay makukuha pagkaraan ng pagluluklok, tingnan ang [//www.mediawiki.org/wiki/Manual:User_rights may kaugnayang kinamay na lahok].", # Fuzzy
'config-license' => 'Karapatang-ari at lisensiya:',
'config-license-none' => 'Walang talababa ng lisensiya',
'config-license-cc-by-sa' => 'Malikhaing Pangkaraniwang Pagtukoy Pamamahaging Magkatulad',
@@ -17841,7 +19006,7 @@ Maaaring mangailangan ang mga ito ng karagdagang kaayusan, subalit mapapagana mo
'config-install-alreadydone' => "'''Babala:''' Tila nailuklok mo na ang MediaWiki at tinatangka mong iluklok ito ulit.
Paki magpatuloy sa susunod na pahina.",
'config-install-begin' => 'Sa pamamagitan ng pagpindot sa "{{int:config-continue}}", sisimulan mo ang pagluluklok ng MediaWiki.
-Kung nais mo paring gumawa ng mga pagbabago, paki pindutin ang bumalik.',
+Kung nais mo paring gumawa ng mga pagbabago, paki pindutin ang bumalik.', # Fuzzy
'config-install-step-done' => 'nagawa na',
'config-install-step-failed' => 'nabigo',
'config-install-extensions' => 'Isinasama ang mga karugtong',
@@ -17897,7 +19062,7 @@ $3
'''Paunawa''': Kapag hindi mo ito ginawa ngayon, ang nagawang talaksang ito ng pagkakaayos ay hindi mo na makukuha mamaya kapag lumabas ka mula sa pagluluklok na hindi ikinakarga itong paibaba.
Kapag nagawa na iyan, maaari ka nang '''[$2 pumasok sa wiki mo]'''.",
- 'config-download-localsettings' => 'Ikargang paibaba ang LocalSettings.php',
+ 'config-download-localsettings' => 'Ikargang paibaba ang <code>LocalSettings.php</code>',
'config-help' => 'saklolo',
'config-nofile' => 'Hindi matagpuan ang talaksang "$1". Binura na ba ito?',
'mainpagetext' => "'''Matagumpay na ininstala ang MediaWiki.'''",
@@ -17907,7 +19072,7 @@ Kapag nagawa na iyan, maaari ka nang '''[$2 pumasok sa wiki mo]'''.",
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Tala ng mga nakatakdang kumpigurasyon]
* [//www.mediawiki.org/wiki/Manual:FAQ Mga malimit itanong sa MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Tala ng mga pinadadalhan ng liham ng MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Tala ng mga pinadadalhan ng liham ng MediaWiki]", # Fuzzy
);
/** толышә зывон (толышә зывон)
@@ -17979,8 +19144,11 @@ $messages['ug-arab'] = array(
* @author AS
* @author Ahonc
* @author Alex Khimich
+ * @author Base
* @author Diemon.ukr
+ * @author Ðта
* @author ТеÑÑ‚
+ * @author ì•„ë¼
*/
$messages['uk'] = array(
'config-desc' => 'ІнÑталÑтор MediaWiki',
@@ -17989,14 +19157,26 @@ $messages['uk'] = array(
'config-localsettings-upgrade' => "'''Увага''': було виÑвлено файл <code>LocalSettings.php</code>.
Ваше програмне Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути оновлено.
Будь-лаÑка, переміÑÑ‚Ñ–Ñ‚ÑŒ файл <code>LocalSettings.php</code> в іншу безпечну директорію, а потім знову запуÑÑ‚Ñ–Ñ‚ÑŒ програму уÑтановки.",
- 'config-localsettings-cli-upgrade' => 'ВиÑвлено файл LocalSettings.php.
-Щоб оновити наÑвну уÑтановку, запуÑÑ‚Ñ–Ñ‚ÑŒ update.php',
+ 'config-localsettings-cli-upgrade' => 'ВиÑвлено файл <code>LocalSettings.php</code>.
+Щоб оновити наÑвну уÑтановку, запуÑÑ‚Ñ–Ñ‚ÑŒ <code>update.php</code>',
'config-localsettings-key' => 'Ключ оновленнÑ:',
'config-localsettings-badkey' => 'Ви вказали неправильний ключ.',
'config-upgrade-key-missing' => 'ВиÑвлено наÑвну уÑтановку MediaWiki.
-Ð”Ð»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— уÑтановки, будь лаÑка, вÑтавте такий Ñ€Ñдок в кінець вашого LocalSettings.php:
+Ð”Ð»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— уÑтановки, будь лаÑка, вÑтавте такий Ñ€Ñдок в кінець вашого <code>LocalSettings.php</code>:
+$1',
+ 'config-localsettings-incomplete' => 'ІÑнуючий файл <code>LocalSettings.php</code> виÑвивÑÑ Ð½ÐµÐ¿Ð¾Ð²Ð½Ð¸Ð¼.
+Ðе вказано змінну $1.
+Будь лаÑка, змініть <code>LocalSettings.php</code> так, щоб цю змінну було задано, Ñ– натиÑніть "{{int:Config-continue}}".',
+ 'config-localsettings-connection-error' => 'СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних з допомогою налаштувань на Ñторінці <code>LocalSettings.php</code> чи <code>AdminSettings.php</code>. Будь лаÑка, виплавте ці Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– Ñпробуйте знову.
+
$1',
'config-session-error' => 'Помилка початку ÑеÑÑ–Ñ—: $1',
+ 'config-session-expired' => 'Ð§Ð°Ñ Ð’Ð°ÑˆÐ¾Ñ— ÑеÑÑ–Ñ— минув.
+Задана триваліÑÑ‚ÑŒ ÑеÑÑ–Ñ— — $1.
+Ви можете збільшити її, змінивши <code>session.gc_maxlifetime</code> у php.ini.
+ПерезапуÑÑ‚Ñ–Ñ‚ÑŒ Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð²ÑтановленнÑ.',
+ 'config-no-session' => 'Дані ÑеÑÑ–Ñ— було втрачено!
+Перевірте Ваш php.ini Ñ– переконайтеÑÑŒ, що <code>session.save_path</code> вÑтановлено у відповідну папку.',
'config-your-language' => 'Ваша мова:',
'config-your-language-help' => 'Оберіть мову Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð² процеÑÑ– уÑтановки.',
'config-wiki-language' => 'Мова Ð´Ð»Ñ Ð²Ñ–ÐºÑ–:',
@@ -18017,73 +19197,491 @@ $1',
'config-page-releasenotes' => 'Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ верÑÑ–ÑŽ',
'config-page-copying' => 'КопіюваннÑ',
'config-page-upgradedoc' => 'ОновленнÑ',
+ 'config-page-existingwiki' => 'ІÑнуюча вікі',
'config-help-restart' => 'Ви бажаєте видалити вÑÑ– введені та збережені вами дані Ñ– запуÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ ÑƒÑтановки Ñпочатку?',
'config-restart' => 'Так, перезапуÑтити уÑтановку',
'config-welcome' => '=== Перевірка Ð¾Ñ‚Ð¾Ñ‡ÐµÐ½Ð½Ñ ===
ПроводÑÑ‚ÑŒÑÑ Ð±Ð°Ð·Ð¾Ð²Ñ– перевірки, щоб виÑвити, чи можлива уÑтановка MediaWiki у даній ÑиÑтемі.
Вкажіть результати цих перевірок при зверненні за допомогою під Ñ‡Ð°Ñ ÑƒÑтановки.',
+ 'config-copyright' => "=== ÐвторÑьке право Ñ– умови ===
+
+$1
+
+Ð¦Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð° Ñ” вільним програмним забезпеченнÑм; Ви можете розповÑюджувати та/або змінювати Ñ—Ñ— під ліцензією GNU General Public License, опублікованою Фондом вільного програмного забезпеченнÑ; верÑією 2 цієї ліцензії або будь-Ñкою пізнішою на Ваш вибір.
+
+Ð¦Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð° поширюєтьÑÑ Ð· надією на те, що вона буде кориÑною, однак '''без жодних гарантій'''; навіть без неÑвної гарантії '''комерційної цінноÑÑ‚Ñ–''' або '''придатноÑÑ‚Ñ– Ð´Ð»Ñ Ð¿ÐµÐ²Ð½Ð¸Ñ… цілей'''.
+Див. GNU General Public License Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÑŒÐ½Ð¾Ñ— інформації.
+
+Ви повинні були отримати <doclink href=Copying>копію GNU General Public License</doclink> разом із цією програмою; Ñкщо ж ні, звернітьÑÑ Ð´Ð¾ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. або [http://www.gnu.org/copyleft/gpl.html ознайомтеÑÑŒ з нею онлайн].",
'config-sidebar' => '* [//www.mediawiki.org Сайт MediaWiki]
-* [//www.mediawiki.org/wiki/Help:Contents/uk Керівництво кориÑтувача]
-* [//www.mediawiki.org/wiki/Manual:Contents/uk Керівництво адмініÑтратора]
-* [//www.mediawiki.org/wiki/Manual:FAQ/uk FAQ]', # Fuzzy
+* [//www.mediawiki.org/wiki/Help:Contents ПоÑібник кориÑтувача]
+* [//www.mediawiki.org/wiki/Manual:Contents ПоÑібник адмініÑтратора]
+* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]
+----
+* <doclink href=Readme>Read me</doclink>
+* <doclink href=ReleaseNotes>Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ випуÑк</doclink>
+* <doclink href=Copying>ЛіцензіÑ</doclink>
+* <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' => 'ВикориÑтовувати utf8_normalize.so Брайона Віббера Ð´Ð»Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— Юнікоду.',
'config-unicode-using-intl' => 'ВикориÑтовувати [http://pecl.php.net/intl міжнародне Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ PECL] Ð´Ð»Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— Юнікоду.',
'config-unicode-pure-php-warning' => "'''Увага''': [http://pecl.php.net/intl міжнародне Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ PECL] не може провеÑти нормалізацію Юнікоду.
Якщо ваш Ñайт має виÑокий трафік, вам варто почитати про [//www.mediawiki.org/wiki/Unicode_normalization_considerations нормалізацію Юнікоду].",
+ 'config-unicode-update-warning' => "'''Увага''': Ð’Ñтановлена верÑÑ–Ñ Ð¾Ð±Ð³Ð¾Ñ€Ñ‚ÐºÐ¸ нормалізації Юнікоду викориÑтовує Ñтару верÑÑ–ÑŽ бібліотеки [http://site.icu-project.org/ проекту ICU].
+Ви маєте [//www.mediawiki.org/wiki/Unicode_normalization_considerations оновити верÑÑ–ÑŽ], Ñкщо плануєте повноцінно викориÑтовувати Юнікод.",
'config-no-db' => 'Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ відповідний драйвер бази даних! Вам необхідно вÑтановити драйвер бази даних Ð´Ð»Ñ PHP. ПідтримуютьÑÑ Ñ‚Ð°ÐºÑ– типи баз даних: $1.
Якщо ви кориÑтуєтеÑÑŒ віртуальним хоÑтингом, попроÑÑ–Ñ‚ÑŒ вашого хоÑтинг-провайдера інÑталювати відповідний драйвер бази даних.
Якщо ви Ñкомпілювали PHP ÑамоÑтійно, переналаштуйте його з включеннÑм клієнта бази даних, наприклад за допомогою <code>./configure --with-mysql</code>.
Якщо уÑтановлено PHP з пакетів Debian або Ubuntu, тоді ви також повинні вÑтановити php5-mysql модуль.',
+ '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> увімкнена.'''
+'''Вимкніть Ñ—Ñ—, Ñкщо це можливо.'''
+MediaWiki буде працювати, але Ваш Ñервер буде більш вразливим до потенційного Ð¿Ñ€Ð¾Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–.",
+ 'config-magic-quotes-runtime' => "'''Проблема: ÐžÐ¿Ñ†Ñ–Ñ PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] увімкнена!'''
+Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÑŒ до непередбачуваного Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ….
+Ви не можете вÑтановити Ñ– викориÑтовувати MediaWiki, поки не буде вимкнено цю опцію.",
+ 'config-magic-quotes-sybase' => "'''Проблема: ÐžÐ¿Ñ†Ñ–Ñ PHP [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] увімкнена!'''
+Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÑŒ до непередбачуваного Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ….
+Ви не можете вÑтановити Ñ– викориÑтовувати MediaWiki, поки не буде вимкнено цю опцію.",
+ 'config-mbstring' => "'''Проблема: ÐžÐ¿Ñ†Ñ–Ñ PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] увімкнена!'''
+Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÑŒ до непередбачуваного Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ….
+Ви не можете вÑтановити Ñ– викориÑтовувати MediaWiki, поки не буде вимкнено цю опцію.",
+ 'config-ze1' => "'''Проблема: ÐžÐ¿Ñ†Ñ–Ñ PHP [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] увімкнена!'''
+Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÑŒ до непередбачуваного Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ….
+Ви не можете вÑтановити Ñ– викориÑтовувати MediaWiki, поки не буде вимкнено цю опцію.",
+ 'config-safe-mode' => "'''Увага:''' ÐžÐ¿Ñ†Ñ–Ñ PHP [http://www.php.net/features.safe-mode «безпечний режим»] увімкнена.
+Це може Ñпричинити проблеми, зокрема із завантаженнÑм файлів та вÑтавкою математичних формул.",
+ 'config-xml-bad' => 'XML-модуть PHP відÑутній.
+MediaWiki необхідні його функції, без цього Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ð¾Ð½Ð° працювати не буде.
+Якщо Ви викориÑтовуєте Mandrake, вÑтановіть php-xml пакет.',
+ 'config-pcre' => 'Модуть підтримку PCRE не знайдено.
+Ð”Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ MediaWiki необхідна підтримка Perl-ÑуміÑних регулÑрних виразів.',
+ 'config-pcre-no-utf8' => "'''Помилка''': PCRE-модуть PHP, вочевидь, було зібрано без підтримки 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-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-imagemagick' => 'ВиÑвлено ImageMagick: <code>$1</code>.
+Буде ввімкнуто Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ñ–Ð½Ñ–Ð°Ñ‚ÑŽÑ€, Ñкщо ви дозволите Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð².',
+ 'config-gd' => 'ВиÑвлено вбудовано графічну бібліотеку GD.
+Буде ввімкнуто Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ñ–Ð½Ñ–Ð°Ñ‚ÑŽÑ€, Ñкщо ви дозволите Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð².',
+ 'config-no-scaling' => 'Ðе вдалоÑÑ Ð²Ð¸Ñвити бібліотеку GD чи ImageMagick.
+Ð’Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ñ–Ð½Ñ–Ð°Ñ‚ÑŽÑ€ буде вимкнено.',
+ 'config-no-uri' => "'''Помилка:''' Ðе вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ поточний URI.
+Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾.",
+ 'config-no-cli-uri' => "'''Увага''': Ðе задано параметр --scriptpath, викориÑтовуєтьÑÑ Ð·Ð° замовчуваннÑм: <code>$1</code>.",
+ 'config-using-server' => 'ВикориÑтовуєтьÑÑ Ñ–Ð¼\'Ñ Ñервера "<nowiki>$1</nowiki>".',
+ 'config-using-uri' => 'ВикориÑтовуєтьÑÑ URL Ñервера "<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' => "'''Увага:''' Ваша типова папка Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½ÑŒ (<code>$1</code>) не перевірÑлаÑÑŒ на вразливіÑÑ‚ÑŒ до Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð´Ð¾Ð²Ñ–Ð»ÑŒÐ½Ð¸Ñ… Ñкриптів під Ñ‡Ð°Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ CLI.",
+ 'config-brokenlibxml' => 'У Вашій ÑиÑтемі невдале Ð¿Ð¾Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð²ÐµÑ€Ñій PHP Ñ– libxml2, Ñке може Ñпричинити Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ñ…Ð¾Ð²Ð°Ð½Ð¸Ñ… даних у MediaWiki та інших веб-заÑтоÑунках.
+Оновіть PHP до верÑÑ–Ñ— 5.2.9 або пізнішої Ñ– libxml2 до 2.7.3 або пізнішої ([//bugs.php.net/bug.php?id=45996 відомоÑÑ‚Ñ– про помилку]).
+Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾.',
+ 'config-using531' => 'MediaWiki не можна викориÑтовувати разом з PHP $1 через помилку з параметрами-поÑиланнÑми <code>__call()</code>.
+Оновіть PHP до верÑÑ–Ñ— 5.3.2 Ñ– вище або відкотіть до PHP 5.3.0 щоб уникнути цієї проблеми.
+Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑкаÑовано.',
+ 'config-suhosin-max-value-length' => 'Suhosin вÑтановлено Ñ– обмежує довжину параметра GET до $1 байтів. Компонент MediaWiki ResourceLoader буде обходити це обмеженнÑ, однак це зменшить продуктивніÑÑ‚ÑŒ. Якщо це можливо, Вам варто вÑтановити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <code>suhosin.get.max_value_length</code> 1024 Ñ– більше у <code>php.ini</code> Ñ– вÑтановити таке ж Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <code>$wgResourceLoaderMaxQueryLength</code> у LocalSettings.php .', # Fuzzy
'config-db-type' => 'Тип бази даних:',
'config-db-host' => 'ХоÑÑ‚ бази даних:',
+ 'config-db-host-help' => 'Якщо Ñервер бази даних знаходитьÑÑ Ð½Ð° іншому Ñервері, введіть тут ім\'Ñ Ñ…Ð¾Ñту Ñ– IP адреÑу.
+
+Якщо Ви викориÑтовуєте віртуальний хоÑтинг, Ваш хоÑтинг-провайдер має надати Вам правильне ім\'Ñ Ñ…Ð¾Ñту у його документації.
+
+Якщо у Ð’Ð°Ñ Ñервер із Windows Ви викориÑтовуєте MySQL, параметр "localhost" може не працювати Ð´Ð»Ñ Ñ–Ð¼ÐµÐ½Ñ– Ñервера. Якщо не працює, викориÑтайте "127.0.0.1" Ñк локальну IP-адреÑу.
+
+Якщо Ви викориÑтовуєте PostgreSQL, залиште це поле пуÑтим, щоб під\'єднатиÑÑŒ через Ñокет Unix.',
+ 'config-db-host-oracle' => 'TNS бази даних:',
+ 'config-db-host-oracle-help' => 'Введіть допуÑтиме [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; файл tnsnames.ora має бути видимим Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— інÑталÑції. <br />Якщо Ви викориÑтовуєте бібліотеки 10g чи новіші, можна також викориÑтовувати метод Ñ–Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
+ 'config-db-wiki-settings' => 'Ідентифікувати цю вікі',
'config-db-name' => 'Ðазва бази даних:',
+ 'config-db-name-help' => 'Виберіть назву, що ідентифікує Вашу вікі.
+Вона не повинна міÑтити пробілів.
+
+Якщо Ви викориÑтовуєте віртуальний хоÑтинг, Ваш хоÑтинг-провайдер або надаÑÑ‚ÑŒ Вам конкретну назву бази даних, або дозволить Ñтворювати бази даних з допомогою панелі управліннÑ.',
+ 'config-db-name-oracle' => 'Схема бази даних:',
+ 'config-db-account-oracle-warn' => 'Є три підтримувані Ñценарії уÑтановки Oracle:
+
+Якщо Ви хочете Ñтворити обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±Ð°Ð·Ð¸ даних у процеÑÑ– вÑтановленнÑ, будь лаÑка, вкажіть обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ€Ð¾Ð»Ñ– SYSDBA Ð´Ð»Ñ ÑƒÑтановки Ñ– бажані Ð¿Ð¾Ð²Ð½Ð¾Ð²Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу з веб-доÑтупом. Ð’ протилежному випадку Ви можете або Ñтворити обліковий Ð·Ð°Ð¿Ð¸Ñ Ð· веб-доÑтупом вручну Ñ– вказати тільки цей обліковий Ð·Ð°Ð¿Ð¸Ñ (Ñкщо він має необхідні дозволи на ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±\'єктів-Ñхем), або вказати два різні облікові запиÑи, з Ñких в одного будуть права на ÑтвореннÑ, а в другого, обмеженого — права веб-доÑтупу.
+
+Скрипт Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу з необхідними повноваженнÑми можна знайти у папці "maintenance/oracle/" цієї інÑталÑції. Майте на увазі, що викориÑÑ‚Ð°Ð½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð¾Ð³Ð¾ облікового запиÑу вимкне можливіÑÑ‚ÑŒ викориÑÑ‚Ð°Ð½Ð½Ñ Ñ‚ÐµÑ…Ð½Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ обÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð· облікового запиÑу за замовчуваннÑм.',
+ 'config-db-install-account' => 'Обліковий Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð²ÑтановленнÑ',
+ 'config-db-username' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача бази даних:",
'config-db-password' => 'Пароль бази даних:',
+ 'config-db-password-empty' => 'Будь лаÑка, введіть пароль Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ кориÑтувача бази даних: $1.
+Хоча можна Ñтворювати кориÑтувачів без паролів, це не Ñ” безпечним.',
+ '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' => "Введіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ñ– пароль, Ñкі будуть викориÑтовуватиÑÑŒ Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· базою даних під Ñ‡Ð°Ñ Ð·Ð²Ð¸Ñ‡Ð°Ð¹Ð½Ð¾Ñ— роботи.
+Якщо обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ðµ Ñ–Ñнує, а в облікового запиÑу інÑталÑції Ñ” доÑтатні повноваженнÑ, цей обліковий Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ñ€Ð¸Ñтувача буде Ñтворено з мінімальними правами, що необхідні Ð´Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ з вікі.",
+ 'config-db-prefix' => 'ÐŸÑ€ÐµÑ„Ñ–ÐºÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ бази даних:',
+ 'config-db-prefix-help' => 'Якщо треба ділити одну базу даних між декількома вікі або між MediaWiki та іншим веб-заÑтоÑунком, Ви можете додати Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ð´Ð¾ уÑÑ–Ñ… назв таблиць Ð´Ð»Ñ ÑƒÐ½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ð»Ñ–ÐºÑ‚Ñ–Ð².
+Ðе викориÑтовуйте пробіли.
+
+Це поле зазвичай залишають пуÑтим.',
'config-db-charset' => 'ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних',
+ '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 зворотно ÑуміÑна з UTF-8',
+ 'config-charset-help' => "'''Увага:''' Якщо Ви викориÑтовуєте '''зворотно ÑуміÑну UTF-8''' на MySQL 4.1+ Ñ– Ñтворюєте резервні копії бази даних з допомогою <code>mysqldump</code>, це може викривити уÑÑ– не-ASCII Ñимволи, незворотно пошкодивши резервні копії!
+
+У '''бінарному режимі''' MediaWiki зберігає текÑÑ‚ UTF-8 у базі даних з бінарними полÑми.
+Це більш ефективно, ніж UTF-8 режим MySQL, Ñ– дозволÑÑ” викориÑтовувати увеÑÑŒ набір Ñимволів Юнікоду.
+У '''режимі UTF-8''' MySQL буде знати, Ñкого Ñимволу ÑтоÑуютьÑÑ Ð’Ð°ÑˆÑ– дані, Ñ– могтиме відображати та конвертувати Ñ—Ñ… належним чином,
+але не дозволÑтиме зберігати Ñимволи, що виходÑÑ‚ÑŒ за межі [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+ 'config-mysql-old' => 'Ðеобхідна MySQL $1 або пізніша, а у Ð’Ð°Ñ $2.',
'config-db-port' => 'Порт бази даних:',
+ 'config-db-schema' => 'Схема Ð´Ð»Ñ MediaWiki',
+ 'config-db-schema-help' => 'Ð¦Ñ Ñхема зазвичай працює добре.
+Змінюйте Ñ—Ñ— тільки Ñкщо знаєте, що Вам це потрібно.',
+ 'config-pg-test-error' => "Ðе вдаєтьÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ бази даних '''$1''': $2",
+ 'config-sqlite-dir' => 'Папка даних SQLite:',
+ 'config-sqlite-dir-help' => "SQLite зберігає уÑÑ– дані в єдиному файлі.
+
+Папка, Ñку Ви вказуєте, має бути доÑтупна Ñерверу Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу під Ñ‡Ð°Ñ Ð²ÑтановленнÑ.
+
+Вона '''не''' повинна бути доÑтупна через інтернет, тому ми Ñ– не поміщуємо Ñ—Ñ— туди, де Ваші файли PHP.
+
+ІнÑталÑтор пропише у неї файл <code>.htaccess</code>, але Ñкщо це не Ñпрацює, хтоÑÑŒ може отримати доÑтуп до Вашої вихідної бази даних, Ñка міÑтить вихідні дані кориÑтувача (адреÑи електронної пошти, хеші паролів), а також видалені верÑÑ–Ñ— та інші обмежені дані на вікі.
+
+За можливоÑÑ‚Ñ– розташуйте базу даних деÑÑŒ окремо, наприклад в <code>/var/lib/mediawiki/yourwiki</code>.",
+ 'config-oracle-def-ts' => 'ПроÑÑ‚Ñ–Ñ€ таблиць за замовчуваннÑм:',
+ 'config-oracle-temp-ts' => 'ТимчаÑовий проÑÑ‚Ñ–Ñ€ таблиць:',
+ 'config-type-ibm_db2' => 'IBM DB2',
+ 'config-support-info' => 'MediaWiki підтримує таки ÑиÑтеми баз даних:
+
+$1
+
+Якщо Ви не бачите Ñеред перерахованих ÑиÑтему баз даних, Ñку викориÑтовуєте, виконайте вказівки, вказані вище, щоб увімкнути підтримку.',
+ 'config-support-mysql' => '* $1 Ñ” оÑновною Ð´Ð»Ñ MediaWiki Ñ– найкраще підтримуєтьÑÑ ([http://www.php.net/manual/en/mysql.installation.php Ñк зібрати PHP з допомогою MySQL])',
+ 'config-support-postgres' => '* $1 — популÑрна відкрита СУБД, альтернатива MySQL ([http://www.php.net/manual/en/pgsql.installation.php Ñк зібрати PHP з допомогою PostgreSQL]). Можуть зуÑтрічатиÑÑŒ деÑкі невеликі невиправлені помилки, не рекомендуєтьÑÑ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовувати у робочій ÑиÑтемі.',
+ 'config-support-sqlite' => '* $1 — легка ÑиÑтема баз даних, Ñка дуже добре підтримуєтьÑÑ. ([http://www.php.net/manual/en/pdo.installation.php Як зібрати PHP з допомогою SQLite], що викориÑтовує PDO)',
+ 'config-support-oracle' => '* $1 — комерційна база даних маÑштабу підприємÑтва. ([http://www.php.net/manual/en/oci8.installation.php Як зібрати PHP з підтримкою OCI8])',
+ 'config-support-ibm_db2' => '* $1 — комерційна база даних маÑштабу підприємÑтва.', # Fuzzy
+ 'config-header-mysql' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ MySQL',
+ 'config-header-postgres' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ PostgreSQL',
+ 'config-header-sqlite' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ SQLite',
+ 'config-header-oracle' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Oracle',
+ 'config-header-ibm_db2' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ IBM DB2',
'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".
+ВикориÑтовуйте тільки ASCII букви (a-z, A-Z), цифри (0-9), знаки підкреÑÐ»ÐµÐ½Ð½Ñ (_) Ñ– крапки (.).',
'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.
+
+Перевірте хоÑÑ‚, ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача та пароль Ñ– Ñпробуйте ще раз.",
+ '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' => 'Виберіть назву, що ідентифікує Вашу вікі.
+Ðе викориÑтовуйте пробіли Ñ– дефіÑи.
+Це буде викориÑтовуватиÑÑŒ у назві файлу даних SQLite.',
+ 'config-sqlite-parent-unwritable-group' => 'Ðе можна Ñтворити папку даних <code><nowiki>$1</nowiki></code>, оÑкільки батьківÑька папка <code><nowiki>$2</nowiki></code> не доÑтупна веб-Ñерверу Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу.
+
+ІнÑталÑтор виÑвив, під Ñким кориÑтувачем працює Ваш Ñервер.
+Зробіть папку <code><nowiki>$3</nowiki></code> доÑтупною Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу, щоб продовжити.
+В ОС Unix/Linux виконайте:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+ 'config-sqlite-parent-unwritable-nogroup' => 'Ðе можна Ñтворити папку даних <code><nowiki>$1</nowiki></code>, оÑкільки батьківÑька папка <code><nowiki>$2</nowiki></code> не доÑтупна веб-Ñерверу Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу.
+
+ІнÑталÑтор не зміг виÑвити, під Ñким кориÑтувачем працює Ваш Ñервер.
+Зробіть папку <code><nowiki>$3</nowiki></code> доÑтупною Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу Ñерверу (Ñ– вÑім!) глобально, щоб продовжити.
+В ОС Unix/Linux виконайте:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+ 'config-sqlite-mkdir-error' => 'Помилка при Ñтворенні папки даних "$1".
+Перевірте Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ– Ñпробуйте знову.',
+ 'config-sqlite-dir-unwritable' => 'Ðе можливо запиÑати до папки "$1".
+Змініть Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупу так, щоб веб-Ñервер міг пиÑати до неї, Ñ– Ñпробуйте ще раз.',
+ 'config-sqlite-connection-error' => '$1.
+
+Перевірте папку даних Ñ– назву бази даних нижче та Ñпробуйте знову.',
+ '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' => "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾.
+
+Ви можете зараз [$1 починати викориÑтовувати Ñвою вікі].
+
+Якщо Ви хочете повторно згенерувати файл <code>LocalSettings.php</code>, натиÑніть на кнопку нижче.
+Це '''не рекомендуєтьÑÑ''', Ñкщо тільки у Ð’Ð°Ñ Ð½Ðµ виникли проблеми з Вашою вікі.",
+ 'config-upgrade-done-no-regenerate' => 'ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾.
+
+Ви можете зараз [$1 починати викориÑтовувати Ñвою вікі].',
+ 'config-regenerate' => 'Повторно згенерувати <code>LocalSettings.php</code> →',
+ 'config-show-table-status' => 'Запит <code>SHOW TABLE STATUS</code> не виконано!',
+ 'config-unknown-collation' => "'''Увага:''' База даних викориÑтовує нерозпізнане ÑортуваннÑ.",
+ 'config-db-web-account' => 'Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð±Ð°Ð·Ð¸ даних Ð´Ð»Ñ Ñ–Ð½Ñ‚ÐµÑ€Ð½ÐµÑ‚-доÑтупу',
+ 'config-db-web-help' => "Оберіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ñ– пароль, Ñкі веб-Ñервер буде викориÑтовувати Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· Ñервером бази даних під Ñ‡Ð°Ñ Ð·Ð²Ð¸Ñ‡Ð°Ð¹Ð½Ð¾Ñ— роботи вікі.",
+ 'config-db-web-account-same' => 'ВикориÑтати той же обліковий Ð·Ð°Ð¿Ð¸Ñ Ð´Ð»Ñ Ð²ÑтановленнÑ',
'config-db-web-create' => 'Створити обліковий запиÑ, Ñкщо його ще не Ñ–Ñнує',
+ 'config-db-web-no-create-privs' => 'Обліковий запиÑ, вказаний Вами Ð´Ð»Ñ Ð²ÑтановленнÑ, не має доÑтатніх повноважень Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу.
+Обліковий запиÑ, Ñкий Ви вказуєте тут, уже повинен Ñ–Ñнувати.',
+ 'config-mysql-engine' => 'Двигун бази даних:',
+ 'config-mysql-innodb' => 'InnoDB',
+ 'config-mysql-myisam' => 'MyISAM',
+ 'config-mysql-myisam-dep' => "'''Увага''': Ви обрали MyISAM Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… MySQL, що не рекомендовано Ð´Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ з MediaWiki, оÑкільки:
+* він Ñлабко підтримує паралелізм через Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ
+* він більш Ñхильний до ушкоджень, ніж інші двигуни
+* база коду MediaWiki не завжди працює з MyISAM так, Ñк мала б.
+
+Якщо Ваша інÑталÑÑ†Ñ–Ñ MySQL підтримує InnoDB, дуже рекомендуєтьÑÑ Ð²Ð¸Ð±Ñ€Ð°Ñ‚Ð¸ цей двигун.
+Якщо Ваша інÑталÑÑ†Ñ–Ñ MySQL не підтримує InnoDB, можливо наÑтав Ñ‡Ð°Ñ Ñ—Ñ— оновити.",
+ 'config-mysql-engine-help' => "'''InnoDB''' Ñ” завжди кращим вибором, оÑкільки краще підтримує паралельний доÑтуп.
+
+'''MyISAM''' може бути швидшим Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кориÑтувача або в інÑталÑціÑÑ… read-only.
+Бази даних MyISAM Ñхильні пÑуватиÑÑŒ чаÑтіше, ніж бази InnoDB.",
'config-mysql-charset' => 'ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних:',
'config-mysql-binary' => 'Двійкове',
+ 'config-mysql-utf8' => 'UTF-8',
+ 'config-mysql-charset-help' => "У '''бінарному режимі''' MediaWiki зберігає текÑÑ‚ UTF-8 у базі даних з бінарними полÑми.
+Це більш ефективно, ніж UTF-8 режим MySQL, Ñ– дозволÑÑ” викориÑтовувати увеÑÑŒ набір Ñимволів Юнікоду.
+
+У '''режимі UTF-8''' MySQL буде знати, Ñкого Ñимволу ÑтоÑуютьÑÑ Ð’Ð°ÑˆÑ– дані, Ñ– могтиме відображати та конвертувати Ñ—Ñ… належним чином, але не дозволÑтиме зберігати Ñимволи, що виходÑÑ‚ÑŒ за межі [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+ 'config-ibm_db2-low-db-pagesize' => "У Вашій базі даних DB2 за замовчуваннÑм заданий табличний проÑÑ‚Ñ–Ñ€ з недоÑтатнім розміром Ñторінки. Розмір Ñторінки має бути '''32K''' Ñ– більше.",
'config-site-name' => 'Ðазва вікі:',
+ 'config-site-name-help' => 'Це буде відображатиÑÑŒ у заголовку вікна браузера та у деÑких інших міÑцÑÑ….',
'config-site-name-blank' => 'Введіть назву Ñайту.',
'config-project-namespace' => 'ПроÑÑ‚Ñ–Ñ€ назв проекту:',
'config-ns-generic' => 'Проект',
+ 'config-ns-site-name' => 'Те ж Ñаме, що й назва вікі: $1',
+ 'config-ns-other' => 'Інше (вкажіть)',
+ 'config-ns-other-default' => 'MyWiki',
+ 'config-project-namespace-help' => 'За прикладом Вікіпедії, чимало вікі тримають Ñвої Ñторінки правил окремо від Ñторінок оÑновного вміÑту, у "\'\'\'проÑторі імен проекту\'\'\'".
+УÑÑ– назви Ñторінок у цьому проÑторі імен починаютьÑÑ Ð· певного префікÑа, Ñкий Ви можете вказати тут.
+Традиційно цей Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ð²Ð¸Ð²Ð¾Ð´Ð¸Ñ‚ÑŒÑÑ Ð· назви вікі, але не може міÑтити знаки пунктуаціÑ, Ñк-то "#" чи ":".',
+ 'config-ns-invalid' => 'Вказаний проÑÑ‚Ñ–Ñ€ імен "<nowiki>$1</nowiki>" не припуÑтимий.
+Вкажіть інший проÑÑ‚Ñ–Ñ€ імен проекту.',
+ 'config-ns-conflict' => 'Вказаний проÑÑ‚Ñ–Ñ€ імен "<nowiki>$1</nowiki>" конфліктує зі Ñтандартним проÑтором імен MediaWiki.
+Вкажіть інший проÑÑ‚Ñ–Ñ€ імен проекту.',
+ 'config-admin-box' => 'Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратора',
'config-admin-name' => "Ваше ім'Ñ:",
'config-admin-password' => 'Пароль:',
'config-admin-password-confirm' => 'Пароль ще раз:',
+ 'config-admin-help' => 'Введіть бажане ім\'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача тут, наприклад "Павло ÐЛО".
+Це ім\'Ñ Ð²Ð¸ будете викориÑтовувати про вході у вікі.',
+ 'config-admin-name-blank' => "Введіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача адмініÑтратора.",
+ 'config-admin-name-invalid' => 'Вказане ім\'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача "<nowiki>$1</nowiki>" не припуÑтиме.
+Вкажіть інше ім\'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача.',
+ 'config-admin-password-blank' => 'Введіть пароль до облікового запиÑу адмініÑтратора.',
+ 'config-admin-password-same' => "Пароль не може бути таким же, Ñк ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача.",
'config-admin-password-mismatch' => 'Два введені вами паролі не збігаютьÑÑ.',
'config-admin-email' => 'ÐдреÑа електронної пошти:',
+ 'config-admin-email-help' => 'Введіть адреÑу електронної пошти, щоб мати змогу отримувати електронну пошту від інших кориÑтувачів у вікі, відновити пароль Ñ– отримувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ зміни, внеÑені до Ñторінок у Вашому ÑпиÑку ÑпоÑтереженнÑ. Ви можете залишити це поле пуÑтим.',
+ 'config-admin-error-user' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратора з ім\'Ñм "<nowiki>$1</nowiki>".',
+ 'config-admin-error-password' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратора "<nowiki>$1</nowiki>":<pre>$2</pre>',
+ 'config-admin-error-bademail' => 'Ви ввели недопуÑтиму адреÑу електронної пошти.',
+ 'config-subscribe' => 'ПідпиÑатиÑÑ Ð½Ð° [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce розÑилку анонÑів нових верÑій MediaWiki].',
+ 'config-subscribe-help' => "Це ÑпиÑок розÑилки з малим обÑÑгом повідомлень, що викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð°Ð½Ð¾Ð½ÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ»Ñ–Ð·Ñ–Ð², а також важливих повідомлень про безпеку.
+Вам варто підпиÑати Ñ– оновлювати інÑталÑцію MediaWiki, коли з'ÑвлÑтимутьÑÑ Ð½Ð¾Ð²Ñ– верÑÑ–Ñ—.",
+ 'config-subscribe-noemail' => 'Ви намагалиÑÑŒ підпиÑатиÑÑŒ на розÑилку анонÑів релізів, не вказавши адреÑи електронної пошти.
+Будь лаÑка, вкажіть адреÑу електронної пошти, Ñкщо хочете підпиÑатиÑÑŒ на розÑилку.',
+ 'config-almost-done' => 'Майже готово!
+Ви можете зараз пропуÑтити налаштуваннÑ, що залишилоÑÑŒ, Ñ– вÑтановити вікі прÑмо зараз.',
+ 'config-optional-continue' => 'Запитуйте ще.',
+ 'config-optional-skip' => 'Це вже втомлює, проÑто вÑтановити вікі.',
+ 'config-profile' => 'Профіль прав кориÑтувача:',
+ 'config-profile-wiki' => 'Традиційна вікі', # Fuzzy
+ 'config-profile-no-anon' => 'Ðеобхідно Ñтворити обліковий запиÑ',
+ 'config-profile-fishbowl' => 'Тільки Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ… редакторів',
+ 'config-profile-private' => 'Приватна вікі',
+ 'config-profile-help' => "Вікі краще працюють, коли Ви дозволÑєте Ñ—Ñ… редагувати Ñкомога ширшому колу людей.
+У MediaWiki легко переглÑдати оÑтанні зміни Ñ– відкочувати будь-Ñку шкоду, Ñпричинену недоÑвідченими або зловмиÑними кориÑтувачами.
+
+Одначе, MediaWiki може бути кориÑна по-різному, й інколи важко переконати у вигідноÑÑ‚Ñ– відкритої вікі-роботи.
+Тож у Ð’Ð°Ñ Ñ” вибір.
+
+'''{{int:config-profile-wiki}}''' дозволÑÑ” редагувати будь-кому, навіть без Ð²Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð² ÑиÑтему.
+Вікі з вимогою \"'''{{int:config-profile-no-anon}}'''\" дає певний облік, але може відвернути випадкових допиÑувачів.
+СпоÑіб \"'''{{int:config-profile-fishbowl}}'''\" дозволÑÑ” редагувати підтвердженим кориÑтувачам, а переглÑдати Ñторінки Ñ– Ñ–Ñторію можуть уÑÑ–.
+'''{{int:config-profile-private}}''' дозволÑÑ” переглÑдати Ñторінки Ñ– редагувати лише підтвердженим кориÑтувачам.
+
+Детальніші конфігурації прав кориÑтувачів доÑтупні піÑÐ»Ñ Ð²ÑтановленнÑ, див. [//www.mediawiki.org/wiki/Manual:User_rights відповідний розділ поÑібника].", # Fuzzy
'config-license' => 'ÐвторÑькі права Ñ– ліцензіÑ:',
+ 'config-license-none' => 'Без ліцензії у нижньому колонтитулі',
+ 'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
+ 'config-license-cc-by' => 'Creative Commons Attribution',
'config-license-cc-by-nc-sa' => 'Creative Commons Attribution Non-Commercial Share Alike',
+ 'config-license-cc-0' => 'Creative Commons Zero (СуÑпільне надбаннÑ)',
+ 'config-license-gfdl' => 'GNU Free Documentation License 1.3 або пізніша',
+ 'config-license-pd' => 'СуÑпільне Ð½Ð°Ð´Ð±Ð°Ð½Ð½Ñ (Public Domain)',
+ 'config-license-cc-choose' => 'Виберіть одну з ліцензій Creative Commons',
+ 'config-license-help' => "Чимало загальнодоÑтупних вікі публікують увеÑÑŒ Ñвій вміÑÑ‚ під [http://freedomdefined.org/Definition вільною ліцензією]. Це розвиває Ð²Ñ–Ð´Ñ‡ÑƒÑ‚Ñ‚Ñ Ñпільної влаÑноÑÑ‚Ñ– Ñ– заохочує довготривалу учаÑÑ‚ÑŒ. У загальному випадку Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð²Ð°Ñ‚Ð½Ð¾Ñ— чи корпоративної вікі у цьому немає необхідноÑÑ‚Ñ–.
+
+Якщо Ви хочете мати змогу викориÑтовувати текÑÑ‚ з Вікіпедії Ñ– дати Вікіпедії змогу викориÑтовувати текÑÑ‚, Ñкопійований з Вашої вікі, вам необхідно обрати '''Creative Commons Attribution Share Alike'''.
+
+Раніше Ð’Ñ–ÐºÑ–Ð¿ÐµÐ´Ñ–Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовувала GNU Free Documentation License.
+GFDL — допуÑтима ліцензіÑ, але у ній важко розібратиÑÑ, а контент під GFDL важко викориÑтовувати повторно.",
'config-email-settings' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти',
+ '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' => "Якщо Ñ†Ñ Ð¾Ð¿Ñ†Ñ–Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð°, кориÑтувачам треба підтвердити Ñвою адреÑу електронної пошти з допомогою надіÑланого їм поÑиланнÑ, коли вони вÑтановлюють чи змінюють Ñ—Ñ—.
+Тільки автентифіковані адреÑи електронної пошти отримують лиÑти від інших кориÑтувачів або змінювати поштові ÑповіщеннÑ.
+Ð£Ð²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— опції '''рекомендуєтьÑÑ''' загальнодоÑтупним вікі через можливі Ð·Ð»Ð¾Ð²Ð¶Ð¸Ð²Ð°Ð½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñми електронної пошти.",
+ 'config-email-sender' => 'Зворотна адреÑа електронної пошти:',
+ 'config-email-sender-help' => "Введіть адреÑу електронної пошти, що буде викориÑтовуватиÑÑŒ Ñк зворотна адреÑа Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¾Ñ— пошти.
+Ðа неї будуть надÑилатиÑÑŒ відмови.
+Чимало поштових Ñерверів вимагають, щоб принаймні доменне ім'Ñ Ð±ÑƒÐ»Ð¾ допуÑтимим.",
+ 'config-upload-settings' => 'Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½ÑŒ Ñ– файлів',
'config-upload-enable' => 'Дозволити Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²',
+ 'config-upload-help' => 'Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² підÑтавлÑÑ” Ваш Ñервер під потенційні загрози.
+Детальнішу інформацію можна почитати у поÑібнику, [//www.mediawiki.org/wiki/Manual:Security розділ про безпеку].
+
+Щоб дозволити Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð², змініть режим підпапки <code>images</code> у кореневій папці MediaWiki так, щоб Ñервер міг у неї запиÑувати.
+Потім увімкніть цю опцію.',
'config-upload-deleted' => 'Каталог Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ… файлів:',
+ 'config-upload-deleted-help' => 'Оберіть папку Ð´Ð»Ñ Ð°Ñ€Ñ…Ñ–Ð²Ð°Ñ†Ñ–Ñ— видалених файлів.
+Ð’ ідеалі, вона не має бути доÑтупною через інтернет.',
+ 'config-logo' => 'URL логотипу:',
+ 'config-logo-help' => 'Стандартна Ñхема Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ñ MediaWiki міÑтить вільне Ð´Ð»Ñ Ð»Ð¾Ð³Ð¾Ñ‚Ð¸Ð¿Ñƒ міÑце над бічною панеллю розміром 135x160 пікÑелів.
+Завантажте Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ð³Ð¾ розміру Ñ– введіть тут його URL.
+
+Якщо Вам не потрібен логотип, залиште це поле пуÑтим.',
+ 'config-instantcommons' => 'Увімкнути Instant Commons',
+ 'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] це функціÑ, що дозволÑÑ” вікі викориÑтовувати зображеннÑ, звуки та інші медіа, розміщені на [//commons.wikimedia.org/ ВікіÑховищі].
+Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ MediaWiki необхідний доÑтуп до інтернету.
+
+Додаткову інформацію ÑтоÑовно цієї функції, включаючи інÑтрукції, Ñк Ñ—Ñ— увімкнути у вікі, відмінних від ВікіÑховища, дивітьÑÑ Ñƒ [//mediawiki.org/wiki/Manual:$wgForeignFileRepos поÑібнику].',
+ 'config-cc-error' => 'Механізм вибору ліцензії Creative Commons не дав результатів.
+Введіть назву ліцензії вручну.',
'config-cc-again' => 'Виберіть знову ...',
+ 'config-cc-not-chosen' => 'Оберіть, Ñку ліцензію Creative Commons Ви хочете викориÑтовувати, Ñ– натиÑніть "продовжити".',
+ 'config-advanced-settings' => 'Розширені налаштуваннÑ',
+ 'config-cache-options' => "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±'єктів:",
+ 'config-cache-help' => "ÐšÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±'єктів викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¿Ð¾ÐºÑ€Ð°Ñ‰ÐµÐ½Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÐ¾Ð´Ñ–Ñ— MediaWiki методом ÐºÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡Ð°Ñто викориÑтовуваних даних.
+ЗаохочуєтьÑÑ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— можливоÑÑ‚Ñ– Ð´Ð»Ñ Ñередніх Ñ– великих Ñайтів, малі Ñайти також можуть відчути Ñ—Ñ— перевагу.",
+ 'config-cache-none' => 'Без ÐºÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ (жодні функції не втрачаютьÑÑ, але впливає на швидкодію великих вікі-Ñайтів)',
+ 'config-cache-accel' => "PHP ÐºÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±'єктів (APC, XCache чи WinCache)",
+ 'config-cache-memcached' => 'ВикориÑтовувати Memcached (вимагає додаткової уÑтановки Ñ– налаштуваннÑ)',
+ 'config-memcached-servers' => 'Сервери Memcached:',
+ 'config-memcached-help' => 'СпиÑок IP-адреÑ, що викоритовує Memcached.
+Вкажіть по одному в Ñ€Ñдку, разом з портами. Ðаприклад:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
+ 'config-memcache-needservers' => 'Ви обрали тип ÐºÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Memcached, але не вказали ніÑких Ñерверів.',
+ 'config-memcache-badip' => 'Ви ввели недопуÑтиму IP-адреÑу Ð´Ð»Ñ Memcached: $1.',
+ 'config-memcache-noport' => 'Ви не вказали порт Ð´Ð»Ñ Ñервера Memcached: $1.
+Якщо Ви його не знаєте, за замовчуваннÑм викориÑтовуєтьÑÑ 11211.',
+ 'config-memcache-badport' => 'Ðомери портів Memcached повинні лежати в межах від $1 до $2.',
'config-extensions' => 'РозширеннÑ',
+ 'config-extensions-help' => 'РозширеннÑ, перераховані вище, були знайдені у папці <code>./extensions</code>.
+
+Вони можуть потребувати додаткових налаштувань, але Ви можете увімкнути їх зараз.',
+ 'config-install-alreadydone' => "'''Увага:''' ЗдаєтьÑÑ, Ви вже вÑтановлювали MediaWiki Ñ– зараз намагаєтеÑÑŒ вÑтановити Ñ—Ñ— знову.
+Будь лаÑка, перейдіть на наÑтупну Ñторінку.",
+ 'config-install-begin' => 'ÐатиÑкаючи "{{int:config-continue}}", Ви розпочинаєте вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ MediaWiki.
+Якщо Ви вÑе ще хочете внеÑти зміни, натиÑніть "Ðазад".', # Fuzzy
'config-install-step-done' => 'виконано',
'config-install-step-failed' => 'не вдалоÑÑ',
+ 'config-install-extensions' => 'У тому чиÑлі розширеннÑ',
+ 'config-install-database' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних',
+ 'config-install-schema' => 'Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñхеми',
+ 'config-install-pg-schema-not-exist' => 'Схеми PostgreSQL не Ñ–Ñнує.',
+ 'config-install-pg-schema-failed' => 'Ðе вдалоÑÑŒ Ñтворити таблиці.
+ПереконайтеÑÑŒ, що кориÑтувач "$1" може пиÑати до Ñхеми "$2".',
+ 'config-install-pg-commit' => 'ВнеÑÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½',
+ 'config-install-pg-plpgsql' => 'Перевірка мови PL/pgSQL',
+ 'config-pg-no-plpgsql' => 'Вам необхідно вÑтановити мову PL/pgSQL у базі даних $1',
+ 'config-pg-no-create-privs' => 'Обліковий запиÑ, вказаний Ð´Ð»Ñ Ð²ÑтановленнÑ, має недоÑтатньо прав Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу.',
+ 'config-pg-not-in-role' => 'Обліковий запиÑ, Ñкий Ви вказали Ð´Ð»Ñ Ð²ÐµÐ±-кориÑтувача, уже Ñ–Ñнує.
+Обліковий запиÑ, Ñкий Ви вказали Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ Ñ” Ñуперюзером Ñ– не відноÑитьÑÑ Ð´Ð¾ ролі веб-кориÑтувача, тому неможливо Ñтворити об\'єкти, що належать веб-кориÑтувачеві.
+
+У даний Ñ‡Ð°Ñ MediaWiki вимагає, щоб уÑÑ– таблиці належали веб-кориÑтувачу. Будь лаÑка, вкажіть інше ім\'Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу або натиÑніть "Ðазад" та вкажіть кориÑтувача з доÑтатніми правами.',
+ 'config-install-user' => 'Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача бази даних',
+ 'config-install-user-alreadyexists' => 'КориÑтувач "$1" уже Ñ–Ñнує',
+ 'config-install-user-create-failed' => 'Ðе вдалоÑÑ Ñтворити кориÑтувача "$1": $2',
+ 'config-install-user-grant-failed' => 'Ðе вдалоÑÑ Ð½Ð°Ð´Ð°Ñ‚Ð¸ права кориÑтувачеві "$1": $2',
+ 'config-install-user-missing' => 'Зазначеного кориÑтувача "$1" не Ñ–Ñнує.',
+ 'config-install-user-missing-create' => 'Зазначеного кориÑтувача "$1" не Ñ–Ñнує.
+Будь лаÑка, поÑтавте галочку "Створити обліковий запиÑ", Ñкщо хочете його Ñтворити.',
+ 'config-install-tables' => 'Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ',
+ 'config-install-tables-exist' => "'''Увага''': Таблиці MediaWiki уже, здаєтьÑÑ, Ñ–Ñнують.
+ПропуÑк ÑтвореннÑ.",
+ 'config-install-tables-failed' => "'''Помилка''': Ðе вдалоÑÑ Ñтворити таблицю внаÑлідок такої помилки: $1",
+ 'config-install-interwiki' => 'Ð—Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– інтервікі значеннÑми за замовчуваннÑм',
'config-install-interwiki-list' => 'Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файл <code>interwiki.list</code>.',
+ 'config-install-interwiki-exists' => "'''Увага''': Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ñ–Ð½Ñ‚ÐµÑ€Ð²Ñ–ÐºÑ– уже, здаєтьÑÑ, має запиÑи.
+Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñтандартного ÑпиÑку пропуÑкаєтьÑÑ.",
+ 'config-install-stats' => 'Ð†Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ ÑтатиÑтики',
+ 'config-install-keys' => 'Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ Ñекретних ключів',
+ 'config-insecure-keys' => "'''Увага:''' {{PLURAL:$2|Секретний ключ|Секретні ключі}} ($1), {{PLURAL:$2|згенерований в процеÑÑ– вÑтановленнÑ, недоÑтатньо надійний|згенеровані в процеÑÑ– вÑтановленнÑ, недоÑтатньо надійні}}. РозглÑньте можливіÑÑ‚ÑŒ {{PLURAL:$2|його|Ñ—Ñ…}} заміни вручку.",
+ 'config-install-sysop' => 'Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу адмініÑтратора',
+ 'config-install-subscribe-fail' => 'Ðе можливо підпиÑатиÑÑŒ на mediawiki-announce: $1',
+ 'config-install-subscribe-notpossible' => 'cURL не вÑтановлено Ñ– Ð¾Ð¿Ñ†Ñ–Ñ allow_url_fopen не доÑтупна.',
+ 'config-install-mainpage' => 'Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ñ— Ñторінки із вміÑтом за замовчуваннÑм',
+ 'config-install-extension-tables' => 'Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ Ð´Ð»Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð¸Ñ… розширень',
+ 'config-install-mainpage-failed' => 'Ðе вдаєтьÑÑ Ð²Ñтавити головну Ñторінку: $1',
+ 'config-install-done' => "'''Вітаємо!'''
+Ви уÑпішно вÑтановили MediaWiki.
+
+ІнÑталÑтор згенерував файл <code>LocalSettings.php</code>, Ñкий міÑтить уÑÑ– Ваші налаштуваннÑ.
+
+Вам необхідно завантажити його Ñ– поміÑтити у кореневу папку Вашої вікі (туди ж, де index.php). Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð°Ð»Ð¾ початиÑÑŒ автоматично.
+
+Якщо Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ðµ почалоÑÑŒ або Ви його ÑкаÑували, можете заново його почати, натиÑнувши на поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð²Ð½Ð¸Ð·Ñƒ:
+
+$3
+
+'''Примітка''': Якщо Ви не зробите цього зараз, цей файл не буде доÑтупним пізніше, коли Ви вийдете з вÑтановленнÑ, не Ñкачавши його.
+
+ПіÑÐ»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð´Ñ–Ð¹, опиÑаних вище, Ви зможете '''[$2 увійти у Ñвою вікі]'''.",
+ 'config-download-localsettings' => 'Завантажити <code>LocalSettings.php</code>',
'config-help' => 'допомога',
+ 'config-nofile' => 'Файл "$1" не знайдено. Його видалено?',
'mainpagetext' => 'Програмне Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Â«MediaWiki» уÑпішно вÑтановлене.',
- 'mainpagedocfooter' => 'Інформацію про роботу з цією вікі можна знайти в [//meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 поÑібнику кориÑтувача].
+ 'mainpagedocfooter' => 'Інформацію про роботу з цією вікі можна знайти в [//meta.wikimedia.org/wiki/Help:Contents поÑібнику кориÑтувача].
== ДеÑкі кориÑні реÑурÑи ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings СпиÑок налаштувань];
* [//www.mediawiki.org/wiki/Manual:FAQ ЧаÑÑ‚Ñ– Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· приводу MediaWiki];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce РозÑилка повідомлень про поÑву нових верÑій MediaWiki].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce РозÑилка повідомлень про поÑву нових верÑій MediaWiki];
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Локалізуйте MediaWiki Ñвоєю мовою]',
);
/** Urdu (اردو)
@@ -18267,21 +19865,36 @@ $messages['xal'] = array(
* @author පසිඳු කà·à·€à·’න්ද
*/
$messages['yi'] = array(
+ 'config-desc' => 'דער ×ינסט×לירער פ×ר מעדיעוויקי',
+ 'config-title' => 'מעדיעוויקי $1 ×ינסט×לירונג',
+ 'config-information' => '×ינפֿ×רמ×ציע',
+ 'config-wiki-language' => 'ווקי שפר×ך:',
'config-back' => '→ צוריק',
+ 'config-continue' => 'פֿ×רזעצן â†',
'config-page-language' => 'שפר×ַך',
'config-page-name' => '× ×ָמען',
'config-page-options' => 'ברירות',
+ 'config-db-type' => 'ד×טנב××–×¢ טיפ:',
+ 'config-db-name' => 'ד×טנב××–×¢ × ×ָמען:',
+ 'config-project-namespace' => 'פר×יעקט × ×ָמענטייל:',
+ 'config-ns-generic' => 'פר×יעקט',
'config-admin-name' => '×ײַער × ×ָמען:',
'config-admin-password' => 'פ×ַסוו×רט:',
+ 'config-admin-password-mismatch' => 'די צוויי פ×סוועטרט ×יר ×”×ט ×יינגעגעבן שטימען נישט.',
'config-admin-email' => 'בליצפּ×ָסט ×ַדרעס:',
+ 'config-install-tables' => 'ש×פן ט×בעלעס',
+ 'config-install-tables-exist' => "'''וו×רענונג''': זעט ×ויס ××– די מעדיעוויקי ט×בעלעס עקזיסטירן שוין.
+×יבערהיפן ש×פֿן.",
+ 'config-download-localsettings' => '×ר×פל×דן <code>LocalSettings.php</code>',
'config-help' => 'הילף',
+ 'config-nofile' => 'מ\'×”×ט נישט געקענט טרעפן די טעקע "$1". צי ×”×ט מען ×–×™ ×ויסגעמעקט?',
'mainpagetext' => "'''מעדיעוויקי ×ינסט×לירט מיט דערפ×לג.'''",
'mainpagedocfooter' => "גיט זיך ×ן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents ב×ניצער'ס וועגווײַזער] פֿ×ר ×ינפֿ×רמ×ציע ווי×זוי זיך ב×נוצן מיט וויקי ווייכוו×ַרג.
== נוצליכע וועבלינקען פֿ×ַר ×נהייבערס ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings רשימה פון ק×נפֿיגור×ציעס]
* [//www.mediawiki.org/wiki/Manual:FAQ ×פֿט געפֿרעגטע ש×לות]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי ב×פֿרײַ×ונג פ×סטליסטע]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי ב×פֿרײַ×ונג פ×סטליסטע]* [//www.mediawiki.org/wiki/Localisation#Translation_resources ×יבערזעצן מעדיעוויקי ×ין ×ײַער שפר×ך]",
);
/** Yoruba (Yorùbá)
@@ -18323,26 +19936,30 @@ $messages['zea'] = array(
);
/** Simplified Chinese (中文(简体)‎)
+ * @author Anthony Fok
* @author Hydra
* @author Hzy980512
* @author Liangent
* @author PhiLiP
* @author Xiaomingyan
+ * @author Yfdyh000
+ * @author 乌拉跨氪
* @author 阿pp
+ * @author ì•„ë¼
*/
$messages['zh-hans'] = array(
'config-desc' => 'MediaWiki安装程åº',
'config-title' => 'MediaWiki $1é…ç½®',
'config-information' => 'ä¿¡æ¯',
- 'config-localsettings-upgrade' => '已检测到<code>LocalSettings.php</code>文件。è¦å‡çº§è¯¥é…置,请在下é¢çš„框中输入<code>$wgUpgradeKey</code>的值。您å¯ä»¥åœ¨LocalSettings.php中找到它。',
- 'config-localsettings-cli-upgrade' => '已检测到LocalSettings.php文件。è¦å‡çº§è¯¥é…置,请直接è¿è¡Œupdate.php。',
+ '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çš„é…置已ç»å­˜åœ¨ã€‚è‹¥è¦å‡çº§è¯¥é…置,请将下é¢ä¸€è¡Œæ–‡æœ¬æ·»åŠ åˆ°LocalSettings.php的底部:
+ 'config-upgrade-key-missing' => '检测到MediaWikiçš„é…置已ç»å­˜åœ¨ã€‚è‹¥è¦å‡çº§è¯¥é…置,请将下é¢ä¸€è¡Œæ–‡æœ¬æ·»åŠ åˆ°<code>LocalSettings.php</code>的底部:
$1',
- 'config-localsettings-incomplete' => '当å‰çš„LocalSettings.phpå¯èƒ½å¹¶ä¸å®Œæ•´ï¼Œå› ä¸ºå˜é‡$1没有设置。请在LocalSettings.php设置该å˜é‡ï¼Œå¹¶å•å‡»â€œç»§ç»­â€ã€‚',
- 'config-localsettings-connection-error' => '在使用LocalSettings.php或AdminSettings.php中指定的设置连接数æ®åº“æ—¶å‘生错误。请修å¤ç›¸åº”设置并é‡è¯•ã€‚
+ 'config-localsettings-incomplete' => '当å‰çš„<code>LocalSettings.php</code>å¯èƒ½å¹¶ä¸å®Œæ•´ï¼Œå› ä¸ºå˜é‡$1没有设置。请在<code>LocalSettings.php</code>设置该å˜é‡ï¼Œå¹¶å•å‡»â€œ{{int:Config-continue}}â€ã€‚',
+ 'config-localsettings-connection-error' => '在使用<code>LocalSettings.php</code>或<code>AdminSettings.php</code>中指定的设置连接数æ®åº“æ—¶å‘生错误。请修å¤ç›¸åº”设置并é‡è¯•ã€‚
$1',
'config-session-error' => 'å¯åŠ¨ä¼šè¯å‡ºé”™ï¼š$1',
@@ -18397,7 +20014,8 @@ $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' => "'''警告''':[http://pecl.php.net/intl intl PECL扩展]无法处ç†Unicode正常化,故åªèƒ½é€€è€Œé‡‡ç”¨è¿è¡Œè¾ƒæ…¢çš„纯PHP实现的方法。如果您è¿è¡Œç€ä¸€ä¸ªé«˜æµé‡çš„站点,请å‚阅[//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode正常化]一文。",
+ 'config-unicode-pure-php-warning' => "'''警告:'''因为尚未安装 [http://pecl.php.net/intl intl PECL 扩展]ä»¥å¤„ç† Unicode 正常化,故åªèƒ½é€€è€Œé‡‡ç”¨è¿è¡Œè¾ƒæ…¢çš„纯 PHP 实现的方法。
+如果您è¿è¡Œç€ä¸€ä¸ªé«˜æµé‡çš„站点,请å‚阅 [//www.mediawiki.org/wiki/Unicode_normalization_considerations 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。
@@ -18438,7 +20056,7 @@ Object caching is not enabled.",
'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-using531' => '由于函数<code>__call()</code>的引用å‚数存在故障,PHP $1å’ŒMediaWiki无法兼容。请å‡çº§åˆ°PHP 5.3.2或更高版本,或é™çº§åˆ°PHP 5.3.0以修å¤è¯¥é—®é¢˜ã€‚安装已中断。',
- 'config-suhosin-max-value-length' => 'Suhosinå·²ç»å®‰è£…并将GET请求的å‚数长度é™åˆ¶åœ¨$1字节。MediaWikiçš„ResourceLoader部件å¯ä»¥åœ¨æ­¤é™åˆ¶ä¸‹æ­£å¸¸å·¥ä½œï¼Œä½†å…¶æ€§èƒ½ä¼šè¢«é™ä½Žã€‚如果å¯èƒ½ï¼Œè¯·åœ¨php.ini中将suhosin.get.max_value_length设为1024或更高值,并在LocalSettings.php中将$wgResourceLoaderMaxQueryLength设为åŒä¸€å€¼ã€‚',
+ '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>设为åŒä¸€å€¼ã€‚', # Fuzzy
'config-db-type' => 'æ•°æ®åº“类型:',
'config-db-host' => 'æ•°æ®åº“主机:',
'config-db-host-help' => '如果您的数æ®åº“在别的æœåŠ¡å™¨ä¸Šï¼Œè¯·åœ¨è¿™é‡Œè¾“入它的域å或IP地å€ã€‚
@@ -18501,7 +20119,6 @@ Object caching is not enabled.",
请考虑将数æ®åº“统一放置在æŸå¤„,如<code>/var/lib/mediawiki/yourwiki</code>下。",
'config-oracle-def-ts' => '默认表空间:',
'config-oracle-temp-ts' => '临时表空间:',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki支æŒä»¥ä¸‹æ•°æ®åº“系统:
$1
@@ -18511,12 +20128,10 @@ $1
'config-support-postgres' => '* $1是一ç§æµè¡Œçš„å¼€æºæ•°æ®åº“系统,å¯ä½œä¸ºMySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何将对PostgreSQL的支æŒç¼–译进PHP中])。本程åºä¸­å¯èƒ½ä¾ç„¶å­˜åœ¨ä¸€äº›å°è€Œæ˜Žæ˜¾çš„错误,因此并ä¸å»ºè®®åœ¨ç”Ÿäº§çŽ¯å¢ƒä¸­ä½¿ç”¨è¯¥æ•°æ®åº“系统。',
'config-support-sqlite' => '* $1是一ç§è½»é‡çº§çš„æ•°æ®åº“系统,能被良好地支æŒã€‚([http://www.php.net/manual/en/pdo.installation.php 如何将对SQLite的支æŒç¼–译进PHP中],须使用PDO)',
'config-support-oracle' => '* $1是一ç§å•†ç”¨ä¼ä¸šçº§çš„æ•°æ®åº“。([http://www.php.net/manual/en/oci8.installation.php 如何将对OCI8的支æŒç¼–译进PHP中])',
- 'config-support-ibm_db2' => '* $1是一ç§å•†ç”¨ä¼ä¸šçº§æ•°æ®åº“。',
'config-header-mysql' => 'MySQL设置',
'config-header-postgres' => 'PostgreSQL设置',
'config-header-sqlite' => 'SQLite设置',
'config-header-oracle' => 'Oracle设置',
- 'config-header-ibm_db2' => 'IBM DB2设置',
'config-invalid-db-type' => '无效的数æ®åº“类型',
'config-missing-db-name' => '您必须为“数æ®åº“å称â€è¾“入内容',
'config-missing-db-host' => '您必须为“数æ®åº“主机â€è¾“入内容',
@@ -18564,8 +20179,8 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'å‡çº§å®Œæˆã€‚
现在您å¯ä»¥[$1 开始使用您的wiki]了。',
- 'config-regenerate' => 'é‡æ–°ç”ŸæˆLocalSettings.php →',
- 'config-show-table-status' => 'SHOW TABLE STATUS语å¥æ‰§è¡Œå¤±è´¥ï¼',
+ 'config-regenerate' => 'é‡æ–°ç”Ÿæˆ<code>LocalSettings.php</code> →',
+ 'config-show-table-status' => '<code>SHOW TABLE STATUS</code>语å¥æ‰§è¡Œå¤±è´¥ï¼',
'config-unknown-collation' => "'''警告:'''æ•°æ®åº“使用了无法识别的整ç†ã€‚",
'config-db-web-account' => '供网页访问使用的数æ®åº“å¸å·',
'config-db-web-help' => '请指定在wiki执行普通æ“作时,网页æœåŠ¡å™¨ç”¨äºŽè¿žæŽ¥æ•°æ®åº“æœåŠ¡å™¨çš„用户å和密ç ã€‚',
@@ -18591,7 +20206,6 @@ chmod a+w $3</pre>',
'config-mysql-charset-help' => "在'''二进制模å¼'''下,MediaWiki会将UTF-8ç¼–ç çš„文本存于数æ®åº“的二进制字段中。相对于MySQLçš„UTF-8模å¼ï¼Œè¿™ç§æ–¹æ³•æ•ˆçŽ‡æ›´é«˜ï¼Œå¹¶å…许您使用全范围的Unicode字符。
在'''UTF-8模å¼'''下,MySQL将知é“您数æ®ä½¿ç”¨çš„字符集,并能适当地æ供和转æ¢å†…容。但这样åšæ‚¨å°†æ— æ³•åœ¨æ•°æ®åº“中存储[//zh.wikipedia.org/wiki/基本多文ç§å¹³é¢ 基本多文ç§å¹³é¢]以外的字符。",
- 'config-ibm_db2-low-db-pagesize' => "您的DB2æ•°æ®åº“默认表空间的页长(pagesize)ä¸è¶³ã€‚至少需è¦'''32K'''或更大的页长。",
'config-site-name' => 'Wikiçš„å称:',
'config-site-name-help' => '填入的内容会出现在æµè§ˆå™¨çš„标题æ ä»¥åŠå…¶ä»–多处ä½ç½®ä¸­ã€‚',
'config-site-name-blank' => '输入网站的å称。',
@@ -18625,7 +20239,7 @@ chmod a+w $3</pre>',
'config-optional-continue' => '多问我一些问题å§ã€‚',
'config-optional-skip' => '我已ç»ä¸è€çƒ¦äº†ï¼Œèµ¶ç´§å®‰è£…我的wiki。',
'config-profile' => '用户æƒé™é…置:',
- 'config-profile-wiki' => '传统wiki',
+ 'config-profile-wiki' => '开放的wiki',
'config-profile-no-anon' => '需è¦æ³¨å†Œå¸å·',
'config-profile-fishbowl' => '编辑å—é™',
'config-profile-private' => 'éžå…¬å¼€wiki',
@@ -18702,7 +20316,7 @@ GNU自由文档许å¯è¯æ˜¯ç»´åŸºç™¾ç§‘曾ç»ä½¿ç”¨è¿‡çš„许å¯è¯ï¼Œå¹¶è¿„今æœ
您å¯èƒ½è¦å¯¹å®ƒä»¬è¿›è¡Œé¢å¤–çš„é…置,但您现在å¯ä»¥å¯ç”¨å®ƒä»¬ã€‚',
'config-install-alreadydone' => "'''警告:'''您似乎已ç»å®‰è£…了MediaWiki,并试图é‡æ–°å®‰è£…它。请å‰å¾€ä¸‹ä¸€ä¸ªé¡µé¢ã€‚",
- 'config-install-begin' => '点击“{{int:config-continue}}â€åŽï¼Œæ‚¨å°†å¼€å§‹å®‰è£…MediaWiki。如果您还想对é…置作一些修改,请点击åŽé€€ã€‚',
+ 'config-install-begin' => '点击“{{int:config-continue}}â€åŽï¼Œæ‚¨å°†å¼€å§‹å®‰è£…MediaWiki。如果您还想对é…置作一些修改,请点击“{{int:config-back}}â€ã€‚',
'config-install-step-done' => '完æˆ',
'config-install-step-failed' => '失败',
'config-install-extensions' => '正在å¯ç”¨æ‰©å±•',
@@ -18753,35 +20367,40 @@ $3
'''注æ„''':如果您现在ä¸å®Œæˆæœ¬æ­¥éª¤ï¼Œè€Œæ˜¯æ²¡æœ‰ä¸‹è½½ä¾¿é€€å‡ºäº†å®‰è£…过程,此åŽæ‚¨å°†æ— æ³•èŽ·å¾—自动生æˆçš„é…置文件。
当本步骤完æˆåŽï¼Œæ‚¨å¯ä»¥ '''[$2 进入您的wiki]'''。",
- 'config-download-localsettings' => '下载LocalSettings.php',
+ 'config-download-localsettings' => '下载<code>LocalSettings.php</code>',
'config-help' => '帮助',
+ 'config-nofile' => '找ä¸åˆ°æ–‡ä»¶â€œ$1â€ã€‚它是å¦å·²è¢«åˆ é™¤ï¼Ÿ',
'mainpagetext' => "'''å·²æˆåŠŸå®‰è£…MediaWiki。'''",
'mainpagedocfooter' => '请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指å—]以获å–使用本wiki软件的信æ¯ï¼
== 入门 ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWikié…置设置列表]
* [//www.mediawiki.org/wiki/Manual:FAQ/zh-hans MediaWiki常è§é—®é¢˜]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiå‘布邮件列表]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiå‘布邮件列表]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources 本地化MediaWiki到您的语言]',
);
/** Traditional Chinese (中文(ç¹é«”)‎)
+ * @author Anthony Fok
* @author Hzy980512
* @author Liangent
* @author Mark85296341
+ * @author Simon Shek
+ * @author ì•„ë¼
*/
$messages['zh-hant'] = array(
'config-desc' => 'MediaWiki安è£ç¨‹åº',
'config-title' => 'MediaWiki $1é…ç½®',
'config-information' => '資訊',
- 'config-localsettings-upgrade' => '已檢測到<code>LocalSettings.php</code>文件。è¦å‡ç´šè©²é…置,請在下é¢çš„框中輸入<code>$wgUpgradeKey</code>的值。您å¯ä»¥åœ¨LocalSettings.php中找到它。',
- 'config-localsettings-cli-upgrade' => '已檢測到LocalSettings.php文件。è¦å‡ç´šè©²é…置,請直接執行update.php。',
+ '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çš„é…置已經存在。若è¦å‡ç´šè©²é…置,請將下é¢ä¸€è¡Œæ–‡æœ¬æ·»åŠ åˆ°LocalSettings.php的底部:
+ 'config-upgrade-key-missing' => '檢測到MediaWikiçš„é…置已經存在。若è¦å‡ç´šè©²é…置,請將下é¢ä¸€è¡Œæ–‡æœ¬æ·»åŠ åˆ°<code>LocalSettings.php</code>的底部:
$1',
- 'config-localsettings-incomplete' => '當å‰çš„LocalSettings.phpå¯èƒ½ä¸¦ä¸å®Œæ•´ï¼Œå› ç‚ºè®Šé‡$1沒有設置。請在LocalSettings.php設置該變é‡ï¼Œä¸¦å–®æ“Šâ€œç¹¼çºŒâ€ã€‚',
- 'config-localsettings-connection-error' => '在使用LocalSettings.php或AdminSettings.php中指定的設置連接數據庫時發生錯誤。請修復相應設置並é‡è©¦ã€‚
+ 'config-localsettings-incomplete' => '當å‰çš„<code>LocalSettings.php</code>å¯èƒ½ä¸¦ä¸å®Œæ•´ï¼Œå› ç‚ºè®Šé‡$1沒有設置。請在<code>LocalSettings.php</code>設置該變é‡ï¼Œä¸¦å–®æ“Šâ€œ{{int:Config-continue}}â€ã€‚',
+ 'config-localsettings-connection-error' => '在使用<code>LocalSettings.php</code>或<code>AdminSettings.php</code>中指定的設置連接數據庫時發生錯誤。請修復相應設置並é‡è©¦ã€‚
$1',
'config-session-error' => '啟動會話出錯:$1',
@@ -18832,11 +20451,11 @@ $1',
* <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' => "'''警告''':[http://pecl.php.net/intl intl PECL擴展]無法處ç†Unicode正常化,故åªèƒ½é€€è€ŒæŽ¡ç”¨é‹è¡Œè¼ƒæ…¢çš„ç´”PHP實ç¾çš„方法。如果您é‹è¡Œç€ä¸€å€‹é«˜æµé‡çš„站點,請åƒé–±[//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode正常化]一文。",
+ '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' => "'''警告:'''å› ç‚ºå°šæœªå®‰è£ [http://pecl.php.net/intl intl PECL 延伸函å¼åº«]ä»¥è™•ç† Unicode æ­£è¦åŒ–,故åªèƒ½é€€è€ŒæŽ¡ç”¨è¼ƒæ…¢çš„ç´” PHP 實作。如果您é‹è¡Œç€ä¸€å€‹é«˜æµé‡çš„網站,請åƒé–± [//www.mediawiki.org/wiki/Unicode_normalization_considerations 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。
@@ -18877,7 +20496,7 @@ Object caching is not enabled.",
'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-using531' => '由於函數<code>__call()</code>的引用åƒæ•¸å­˜åœ¨æ•…障,PHP $1å’ŒMediaWiki無法兼容。請å‡ç´šåˆ°PHP 5.3.2或更高版本,或é™ç´šåˆ°PHP 5.3.0以修復該å•é¡Œã€‚安è£å·²ä¸­æ–·ã€‚',
- 'config-suhosin-max-value-length' => 'Suhosin已經安è£ä¸¦å°‡GET請求的åƒæ•¸é•·åº¦é™åˆ¶åœ¨$1字節。MediaWikiçš„ResourceLoader部件å¯ä»¥åœ¨æ­¤é™åˆ¶ä¸‹æ­£å¸¸å·¥ä½œï¼Œä½†å…¶æ€§èƒ½æœƒè¢«é™ä½Žã€‚如果å¯èƒ½ï¼Œè«‹åœ¨php.ini中將suhosin.get.max_value_length設為1024或更高值,並在LocalSettings.php中將$wgResourceLoaderMaxQueryLength設為åŒä¸€å€¼ã€‚',
+ '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>設為åŒä¸€å€¼ã€‚', # Fuzzy
'config-db-type' => '資料庫類型:',
'config-db-host' => '資料庫主機:',
'config-db-host-help' => '如果您的數據庫在別的æœå‹™å™¨ä¸Šï¼Œè«‹åœ¨é€™è£¡è¼¸å…¥å®ƒçš„域å或IP地å€ã€‚
@@ -18940,7 +20559,6 @@ Object caching is not enabled.",
請考慮將數據庫統一放置在æŸè™•ï¼Œå¦‚<code>/var/lib/mediawiki/yourwiki</code>下。",
'config-oracle-def-ts' => '默èªè¡¨ç©ºé–“:',
'config-oracle-temp-ts' => '臨時表空間:',
- 'config-type-ibm_db2' => 'IBM DB2',
'config-support-info' => 'MediaWiki支æŒä»¥ä¸‹æ•¸æ“šåº«ç³»çµ±ï¼š
$1
@@ -18950,12 +20568,10 @@ $1
'config-support-postgres' => '* $1是一種æµè¡Œçš„é–‹æºæ•¸æ“šåº«ç³»çµ±ï¼Œå¯ä½œç‚ºMySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何將å°PostgreSQL的支æŒç·¨è­¯é€²PHP中])。本程åºä¸­å¯èƒ½ä¾ç„¶å­˜åœ¨ä¸€äº›å°è€Œæ˜Žé¡¯çš„錯誤,因此並ä¸å»ºè­°åœ¨ç”Ÿç”¢ç’°å¢ƒä¸­ä½¿ç”¨è©²æ•¸æ“šåº«ç³»çµ±ã€‚',
'config-support-sqlite' => '* $1是一種輕é‡ç´šçš„數據庫系統,能被良好地支æŒã€‚([http://www.php.net/manual/en/pdo.installation.php 如何將å°SQLite的支æŒç·¨è­¯é€²PHP中],須使用PDO)',
'config-support-oracle' => '* $1是一種商用ä¼æ¥­ç´šçš„數據庫。([http://www.php.net/manual/en/oci8.installation.php 如何將å°OCI8的支æŒç·¨è­¯é€²PHP中])',
- 'config-support-ibm_db2' => '* $1是一種商用ä¼æ¥­ç´šæ•¸æ“šåº«ã€‚',
'config-header-mysql' => 'MySQL 的設定',
'config-header-postgres' => 'PostgreSQL設置',
'config-header-sqlite' => 'SQLite 的設定',
'config-header-oracle' => '甲骨文設定',
- 'config-header-ibm_db2' => 'IBM DB2設置',
'config-invalid-db-type' => '無效的資料庫類型',
'config-missing-db-name' => '您必須為“數據庫å稱â€è¼¸å…¥å…§å®¹',
'config-missing-db-host' => '您必須為“數據庫主機â€è¼¸å…¥å…§å®¹',
@@ -19003,8 +20619,8 @@ chmod a+w $3</pre>',
'config-upgrade-done-no-regenerate' => 'å‡ç´šå®Œæˆã€‚
ç¾åœ¨æ‚¨å¯ä»¥[$1 開始使用您的wiki]了。',
- 'config-regenerate' => 'é‡æ–°ç”ŸæˆLocalSettings.php →',
- 'config-show-table-status' => '查詢SHOW TABLE STATUS失敗ï¼',
+ 'config-regenerate' => 'é‡æ–°ç”Ÿæˆ<code>LocalSettings.php</code> →',
+ 'config-show-table-status' => '查詢<code>SHOW TABLE STATUS</code>失敗ï¼',
'config-unknown-collation' => "'''警告:'''數據庫使用了無法識別的整ç†ã€‚",
'config-db-web-account' => '供網é è¨ªå•ä½¿ç”¨çš„數據庫帳號',
'config-db-web-help' => '請指定在wiki執行普通æ“作時,網é æœå‹™å™¨ç”¨æ–¼é€£æŽ¥æ•¸æ“šåº«æœå‹™å™¨çš„用戶å和密碼。',
@@ -19030,7 +20646,6 @@ chmod a+w $3</pre>',
'config-mysql-charset-help' => "在'''二進制模å¼'''下,MediaWiki會將UTF-8編碼的文本存於數據庫的二進制字段中。相å°æ–¼MySQLçš„UTF-8模å¼ï¼Œé€™ç¨®æ–¹æ³•æ•ˆçŽ‡æ›´é«˜ï¼Œä¸¦å…許您使用全範åœçš„Unicode字符。
在'''UTF-8模å¼'''下,MySQL將知é“您數據使用的字符集,並能é©ç•¶åœ°æ供和轉æ›å…§å®¹ã€‚但這樣åšæ‚¨å°‡ç„¡æ³•åœ¨æ•¸æ“šåº«ä¸­å­˜å„²[//zh.wikipedia.org/wiki/åŸºæœ¬å¤šæ–‡ç¨®å¹³é¢ åŸºæœ¬å¤šæ–‡ç¨®å¹³é¢]以外的字符。",
- 'config-ibm_db2-low-db-pagesize' => "您的DB2數據庫默èªè¡¨ç©ºé–“çš„é é•·ï¼ˆpagesize)ä¸è¶³ã€‚至少需è¦'''32K'''或更大的é é•·ã€‚",
'config-site-name' => 'Wikiçš„å稱:',
'config-site-name-help' => '填入的內容會出ç¾åœ¨ç€è¦½å™¨çš„標題欄以åŠå…¶ä»–多處ä½ç½®ä¸­ã€‚',
'config-site-name-blank' => '輸入站點å稱。',
@@ -19052,7 +20667,7 @@ chmod a+w $3</pre>',
'config-admin-password-blank' => '輸入管ç†å“¡å¸³è™Ÿå¯†ç¢¼ã€‚',
'config-admin-password-same' => '密碼ä¸èƒ½èˆ‡ä½¿ç”¨è€…å稱相åŒã€‚',
'config-admin-password-mismatch' => '兩次輸入的密碼並ä¸ç›¸åŒã€‚',
- 'config-admin-email' => 'E-mail 地å€ï¼š',
+ 'config-admin-email' => '電郵地å€ï¼š',
'config-admin-email-help' => '輸入電å­éƒµä»¶åœ°å€å¾Œï¼Œæ‚¨å¯ä»¥æ”¶åˆ°æ­¤wiki上其他用戶發來的電å­éƒµä»¶ï¼Œä¸¦èƒ½é‡ç½®æ‚¨çš„密碼,還å¯åœ¨ç›£è¦–列表中é é¢è¢«æ›´æ”¹æ™‚收到郵件通知。您å¯ä»¥å°‡æ­¤å­—段留空。',
'config-admin-error-user' => '在創建用戶å為“<nowiki>$1</nowiki>â€çš„管ç†å“¡å¸³è™Ÿæ™‚發生內部錯誤。',
'config-admin-error-password' => '在為管ç†å“¡â€œ<nowiki>$1</nowiki>â€è¨­ç½®å¯†ç¢¼æ™‚發生內部錯誤:<pre>$2</pre>',
@@ -19064,7 +20679,7 @@ chmod a+w $3</pre>',
'config-optional-continue' => '多å•æˆ‘一些å•é¡Œå§ã€‚',
'config-optional-skip' => '我已經ä¸è€ç…©äº†ï¼Œè¶•ç·Šå®‰è£æˆ‘çš„wiki。',
'config-profile' => '用戶權é™é…置:',
- 'config-profile-wiki' => '傳統wiki',
+ 'config-profile-wiki' => '傳統wiki', # Fuzzy
'config-profile-no-anon' => '需è¦è¨»å†Šå¸³è™Ÿ',
'config-profile-fishbowl' => '編輯å—é™',
'config-profile-private' => 'éžå…¬é–‹wiki',
@@ -19076,7 +20691,7 @@ chmod a+w $3</pre>',
'''{{int:config-profile-fishbowl}}'''模å¼åªå…許ç²æ‰¹å‡†çš„用戶編輯,但å°å…¬çœ¾é–‹æ”¾é é¢ç€è¦½ï¼ˆåŒ…括歷å²è¨˜éŒ„)。'''{{int:config-profile-private}}'''則åªå…許ç²æ‰¹å‡†çš„用戶ç€è¦½ã€ç·¨è¼¯é é¢ã€‚
-安è£å®Œæˆå¾Œï¼Œæ‚¨é‚„å¯ä»¥å°ç”¨æˆ¶æ¬Šé™é€²è¡Œæ›´å¤šã€æ›´è¤‡é›œçš„é…置,åƒè¦‹[//www.mediawiki.org/wiki/Manual:User_rights 相關的使用手冊]。",
+安è£å®Œæˆå¾Œï¼Œæ‚¨é‚„å¯ä»¥å°ç”¨æˆ¶æ¬Šé™é€²è¡Œæ›´å¤šã€æ›´è¤‡é›œçš„é…置,åƒè¦‹[//www.mediawiki.org/wiki/Manual:User_rights 相關的使用手冊]。", # Fuzzy
'config-license' => '版權和許å¯è­‰ï¼š',
'config-license-none' => 'é è…³ç„¡è¨±å¯è­‰',
'config-license-cc-by-sa' => '知識共享署å-相åŒæ–¹å¼åˆ†äº«',
@@ -19141,7 +20756,7 @@ GNU自由文檔許å¯è­‰æ˜¯ç¶­åŸºç™¾ç§‘曾經使用éŽçš„許å¯è­‰ï¼Œä¸¦è¿„今æœ
您å¯èƒ½è¦å°å®ƒå€‘進行é¡å¤–çš„é…置,但您ç¾åœ¨å¯ä»¥å•Ÿç”¨å®ƒå€‘。',
'config-install-alreadydone' => "'''警告:'''您似乎已經安è£äº†MediaWiki,並試圖é‡æ–°å®‰è£å®ƒã€‚è«‹å‰å¾€ä¸‹ä¸€å€‹é é¢ã€‚",
- 'config-install-begin' => '點擊“{{int:config-continue}}â€å¾Œï¼Œæ‚¨å°‡é–‹å§‹å®‰è£MediaWiki。如果您還想å°é…置作一些修改,請點擊後退。',
+ 'config-install-begin' => '點擊“{{int:config-continue}}â€å¾Œï¼Œæ‚¨å°‡é–‹å§‹å®‰è£MediaWiki。如果您還想å°é…置作一些修改,請點擊後退。', # Fuzzy
'config-install-step-done' => '完æˆ',
'config-install-step-failed' => '失敗',
'config-install-extensions' => '正在啟用擴展',
@@ -19192,7 +20807,7 @@ $3
'''注æ„''':如果您ç¾åœ¨ä¸å®Œæˆæœ¬æ­¥é©Ÿï¼Œè€Œæ˜¯æ²’有下載便退出了安è£éŽç¨‹ï¼Œæ­¤å¾Œæ‚¨å°‡ç„¡æ³•ç²å¾—自動生æˆçš„é…置文件。
當本步驟完æˆå¾Œï¼Œæ‚¨å¯ä»¥ '''[$2 進入您的wiki]'''。",
- 'config-download-localsettings' => '下載LocalSettings.php',
+ 'config-download-localsettings' => '下載<code>LocalSettings.php</code>',
'config-help' => '說明',
'mainpagetext' => "'''å·²æˆåŠŸå®‰è£MediaWiki。'''",
'mainpagedocfooter' => 'è«‹åƒé–±[//meta.wikimedia.org/wiki/Help:Contents 用戶手冊]以ç²å¾—使用此wiki軟體的訊æ¯ï¼
@@ -19200,7 +20815,8 @@ $3
== 入門 ==
* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWikié…置設定清單]
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki常見å•é¡Œè§£ç­”]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki發佈郵件清單]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki發佈郵件清單]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWikiç•Œé¢æœ¬åœ°åŒ–]',
);
/** Chinese (Hong Kong) (‪中文(香港)‬)
diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php
index ac5dbd74..4d8e5f0d 100644
--- a/includes/installer/Installer.php
+++ b/includes/installer/Installer.php
@@ -88,7 +88,6 @@ abstract class Installer {
'postgres',
'oracle',
'sqlite',
- 'ibm_db2',
);
/**
@@ -313,19 +312,19 @@ abstract class Installer {
* output format such as HTML or text before being sent to the user.
* @param $msg
*/
- public abstract function showMessage( $msg /*, ... */ );
+ abstract public function showMessage( $msg /*, ... */ );
/**
* Same as showMessage(), but for displaying errors
* @param $msg
*/
- public abstract function showError( $msg /*, ... */ );
+ abstract public function showError( $msg /*, ... */ );
/**
* Show a message to the installing user by using a Status object
* @param $status Status
*/
- public abstract function showStatusMessage( Status $status );
+ abstract public function showStatusMessage( Status $status );
/**
* Constructor, always call this from child classes.
@@ -488,7 +487,7 @@ abstract class Installer {
if( !$_lsExists ) {
return false;
}
- unset($_lsExists);
+ unset( $_lsExists );
require( "$IP/includes/DefaultSettings.php" );
require( "$IP/LocalSettings.php" );
@@ -927,7 +926,7 @@ abstract class Installer {
* Helper function to be called from envCheckServer()
* @return String
*/
- protected abstract function envGetDefaultServer();
+ abstract protected function envGetDefaultServer();
/**
* Environment check for setting $IP and $wgScriptPath.
@@ -989,7 +988,7 @@ abstract class Installer {
continue;
}
- list( $all, $lang, $territory, $charset, $modifier ) = $m;
+ list( , $lang, , , ) = $m;
$candidatesByLocale[$m[0]] = $m;
$candidatesByLang[$lang][] = $m;
@@ -1073,24 +1072,23 @@ abstract class Installer {
* @return string
*/
protected function unicodeChar( $c ) {
- $c = hexdec($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);
+ $c = hexdec( $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;
}
}
-
/**
* Check the libicu version
*/
@@ -1105,8 +1103,8 @@ abstract class Installer {
* Note that we use the hex representation to create the code
* points in order to avoid any Unicode-destroying during transit.
*/
- $not_normal_c = $this->unicodeChar("FA6C");
- $normal_c = $this->unicodeChar("242EE");
+ $not_normal_c = $this->unicodeChar( "FA6C" );
+ $normal_c = $this->unicodeChar( "242EE" );
$useNormalizer = 'php';
$needsUpdate = false;
@@ -1174,8 +1172,8 @@ abstract class Installer {
*
* Used only by environment checks.
*
- * @param $path String: path to search
- * @param $names Array of executable names
+ * @param string $path path to search
+ * @param array $names of executable names
* @param $versionInfo Boolean false or array with two members:
* 0 => Command to run for version check, with $1 for the full executable name
* 1 => String to compare the output with
@@ -1279,7 +1277,7 @@ abstract class Installer {
/**
* Checks for presence of an Apache module. Works only if PHP is running as an Apache module, too.
*
- * @param $moduleName String: Name of module to check.
+ * @param string $moduleName Name of module to check.
* @return bool
*/
public static function apacheModulePresent( $moduleName ) {
@@ -1436,8 +1434,8 @@ abstract class Installer {
/**
* Actually perform the installation.
*
- * @param $startCB Array A callback array for the beginning of each step
- * @param $endCB Array A callback array for the end of each step
+ * @param array $startCB A callback array for the beginning of each step
+ * @param array $endCB A callback array for the end of each step
*
* @return Array of Status objects
*/
@@ -1594,13 +1592,16 @@ abstract class Installer {
$status = Status::newGood();
try {
$page = WikiPage::factory( Title::newMainPage() );
- $page->doEdit( wfMessage( 'mainpagetext' )->inContentLanguage()->text() . "\n\n" .
- wfMessage( 'mainpagedocfooter' )->inContentLanguage()->text(),
+ $content = new WikitextContent (
+ wfMessage( 'mainpagetext' )->inContentLanguage()->text() . "\n\n" .
+ wfMessage( 'mainpagedocfooter' )->inContentLanguage()->text()
+ );
+
+ $page->doEditContent( $content,
'',
EDIT_NEW,
false,
- User::newFromName( 'MediaWiki default' )
- );
+ User::newFromName( 'MediaWiki default' ) );
} catch (MWException $e) {
//using raw, because $wgShowExceptionDetails can not be set yet
$status->fatal( 'config-install-mainpage-failed', $e->getMessage() );
@@ -1641,9 +1642,9 @@ abstract class Installer {
/**
* Add an installation step following the given step.
*
- * @param $callback Array A valid installation callback array, in this form:
+ * @param array $callback A valid installation callback array, in this form:
* array( 'name' => 'some-unique-name', 'callback' => array( $obj, 'function' ) );
- * @param $findStep String the step to find. Omit to put the step at the beginning
+ * @param string $findStep the step to find. Omit to put the step at the beginning
*/
public function addInstallStep( $callback, $findStep = 'BEGINNING' ) {
$this->extraInstallSteps[$findStep][] = $callback;
diff --git a/includes/installer/LocalSettingsGenerator.php b/includes/installer/LocalSettingsGenerator.php
index bbc6b64e..72ea3db7 100644
--- a/includes/installer/LocalSettingsGenerator.php
+++ b/includes/installer/LocalSettingsGenerator.php
@@ -62,12 +62,12 @@ class LocalSettingsGenerator {
'wgRightsText', 'wgMainCacheType', 'wgEnableUploads',
'wgMainCacheType', '_MemCachedServers', 'wgDBserver', 'wgDBuser',
'wgDBpassword', 'wgUseInstantCommons', 'wgUpgradeKey', 'wgDefaultSkin',
- 'wgMetaNamespace', 'wgResourceLoaderMaxQueryLength'
+ 'wgMetaNamespace', 'wgResourceLoaderMaxQueryLength', 'wgLogo',
),
$db->getGlobalNames()
);
- $unescaped = array( 'wgRightsIcon' );
+ $unescaped = array( 'wgRightsIcon', 'wgLogo' );
$boolItems = array(
'wgEnableEmail', 'wgEnableUserEmail', 'wgEnotifUserTalk',
'wgEnotifWatchlist', 'wgEmailAuthentication', 'wgEnableUploads', 'wgUseInstantCommons'
@@ -94,8 +94,8 @@ class LocalSettingsGenerator {
/**
* For $wgGroupPermissions, set a given ['group']['permission'] value.
- * @param $group String Group name
- * @param $rightsArr Array An array of permissions, in the form of:
+ * @param string $group Group name
+ * @param array $rightsArr An array of permissions, in the form of:
* array( 'right' => true, 'right2' => false )
*/
public function setGroupRights( $group, $rightsArr ) {
@@ -157,7 +157,7 @@ class LocalSettingsGenerator {
/**
* Write the generated LocalSettings to a file
*
- * @param $fileName String Full path to filename to write to
+ * @param string $fileName Full path to filename to write to
*/
public function writeFile( $fileName ) {
file_put_contents( $fileName, $this->getText() );
@@ -255,59 +255,59 @@ if ( !defined( 'MEDIAWIKI' ) ) {
## Uncomment this to disable output compression
# \$wgDisableOutputCompression = true;
-\$wgSitename = \"{$this->values['wgSitename']}\";
+\$wgSitename = \"{$this->values['wgSitename']}\";
{$metaNamespace}
## The URL base path to the directory containing the wiki;
## defaults for all runtime URL paths are based off of this.
## For more information on customizing the URLs
## (like /w/index.php/Page_title to /wiki/Page_title) please see:
## http://www.mediawiki.org/wiki/Manual:Short_URL
-\$wgScriptPath = \"{$this->values['wgScriptPath']}\";
-\$wgScriptExtension = \"{$this->values['wgScriptExtension']}\";
+\$wgScriptPath = \"{$this->values['wgScriptPath']}\";
+\$wgScriptExtension = \"{$this->values['wgScriptExtension']}\";
## The protocol and server name to use in fully-qualified URLs
-\$wgServer = \"{$this->values['wgServer']}\";
+\$wgServer = \"{$this->values['wgServer']}\";
## The relative URL path to the skins directory
-\$wgStylePath = \"\$wgScriptPath/skins\";
+\$wgStylePath = \"\$wgScriptPath/skins\";
## The relative URL path to the logo. Make sure you change this from the default,
## or else you'll overwrite your logo when you upgrade!
-\$wgLogo = \"\$wgStylePath/common/images/wiki.png\";
+\$wgLogo = \"{$this->values['wgLogo']}\";
## UPO means: this is also a user preference option
-\$wgEnableEmail = {$this->values['wgEnableEmail']};
-\$wgEnableUserEmail = {$this->values['wgEnableUserEmail']}; # UPO
+\$wgEnableEmail = {$this->values['wgEnableEmail']};
+\$wgEnableUserEmail = {$this->values['wgEnableUserEmail']}; # UPO
\$wgEmergencyContact = \"{$this->values['wgEmergencyContact']}\";
-\$wgPasswordSender = \"{$this->values['wgPasswordSender']}\";
+\$wgPasswordSender = \"{$this->values['wgPasswordSender']}\";
-\$wgEnotifUserTalk = {$this->values['wgEnotifUserTalk']}; # UPO
-\$wgEnotifWatchlist = {$this->values['wgEnotifWatchlist']}; # UPO
+\$wgEnotifUserTalk = {$this->values['wgEnotifUserTalk']}; # UPO
+\$wgEnotifWatchlist = {$this->values['wgEnotifWatchlist']}; # UPO
\$wgEmailAuthentication = {$this->values['wgEmailAuthentication']};
## Database settings
-\$wgDBtype = \"{$this->values['wgDBtype']}\";
-\$wgDBserver = \"{$this->values['wgDBserver']}\";
-\$wgDBname = \"{$this->values['wgDBname']}\";
-\$wgDBuser = \"{$this->values['wgDBuser']}\";
-\$wgDBpassword = \"{$this->values['wgDBpassword']}\";
+\$wgDBtype = \"{$this->values['wgDBtype']}\";
+\$wgDBserver = \"{$this->values['wgDBserver']}\";
+\$wgDBname = \"{$this->values['wgDBname']}\";
+\$wgDBuser = \"{$this->values['wgDBuser']}\";
+\$wgDBpassword = \"{$this->values['wgDBpassword']}\";
{$this->dbSettings}
## Shared memory settings
-\$wgMainCacheType = $cacheType;
+\$wgMainCacheType = $cacheType;
\$wgMemCachedServers = $mcservers;
## To enable image uploads, make sure the 'images' directory
## is writable, then set this to true:
-\$wgEnableUploads = {$this->values['wgEnableUploads']};
+\$wgEnableUploads = {$this->values['wgEnableUploads']};
{$magic}\$wgUseImageMagick = true;
{$magic}\$wgImageMagickConvertCommand = \"{$this->values['wgImageMagickConvertCommand']}\";
# InstantCommons allows wiki to use images from http://commons.wikimedia.org
-\$wgUseInstantCommons = {$this->values['wgUseInstantCommons']};
+\$wgUseInstantCommons = {$this->values['wgUseInstantCommons']};
## If you use ImageMagick (or any other shell command) on a
## Linux server, this will need to be set to the name of an
@@ -342,7 +342,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
## appropriate copyright notice / icon. GNU Free Documentation
## License and Creative Commons licenses are supported so far.
\$wgRightsPage = \"\"; # Set to the title of a wiki page that describes your license/copyright
-\$wgRightsUrl = \"{$this->values['wgRightsUrl']}\";
+\$wgRightsUrl = \"{$this->values['wgRightsUrl']}\";
\$wgRightsText = \"{$this->values['wgRightsText']}\";
\$wgRightsIcon = \"{$this->values['wgRightsIcon']}\";
diff --git a/includes/installer/MysqlInstaller.php b/includes/installer/MysqlInstaller.php
index f66f15f2..f9a8ce75 100644
--- a/includes/installer/MysqlInstaller.php
+++ b/includes/installer/MysqlInstaller.php
@@ -107,7 +107,7 @@ class MysqlInstaller extends DatabaseInstaller {
}
if ( !strlen( $newValues['wgDBname'] ) ) {
$status->fatal( 'config-missing-db-name' );
- } elseif ( !preg_match( '/^[a-z0-9_-]+$/i', $newValues['wgDBname'] ) ) {
+ } elseif ( !preg_match( '/^[a-z0-9+_-]+$/i', $newValues['wgDBname'] ) ) {
$status->fatal( 'config-invalid-db-name', $newValues['wgDBname'] );
}
if ( !preg_match( '/^[a-z0-9_-]*$/i', $newValues['wgDBprefix'] ) ) {
@@ -516,7 +516,8 @@ class MysqlInstaller extends DatabaseInstaller {
}
if( $tryToCreate ) {
- $createHostList = array($server,
+ $createHostList = array(
+ $server,
'localhost',
'localhost.localdomain',
'%'
@@ -573,8 +574,8 @@ class MysqlInstaller extends DatabaseInstaller {
/**
* Return a formal 'User'@'Host' username for use in queries
- * @param $name String Username, quotes will be added
- * @param $host String Hostname, quotes will be added
+ * @param string $name Username, quotes will be added
+ * @param string $host Hostname, quotes will be added
* @return String
*/
private function buildFullUserName( $name, $host ) {
@@ -584,8 +585,8 @@ class MysqlInstaller extends DatabaseInstaller {
/**
* Try to see if the user account exists. Our "superuser" may not have
* access to mysql.user, so false means "no" or "maybe"
- * @param $host String Hostname to check
- * @param $user String Username to check
+ * @param string $host Hostname to check
+ * @param string $user Username to check
* @return boolean
*/
private function userDefinitelyExists( $host, $user ) {
@@ -636,10 +637,10 @@ class MysqlInstaller extends DatabaseInstaller {
$tblOpts = LocalSettingsGenerator::escapePhpString( $this->getTableOptions() );
return
"# MySQL specific settings
-\$wgDBprefix = \"{$prefix}\";
+\$wgDBprefix = \"{$prefix}\";
# MySQL table options to use during installation or update
-\$wgDBTableOptions = \"{$tblOpts}\";
+\$wgDBTableOptions = \"{$tblOpts}\";
# Experimental charset support for MySQL 5.0.
\$wgDBmysql5 = {$dbmysql5};";
diff --git a/includes/installer/MysqlUpdater.php b/includes/installer/MysqlUpdater.php
index 49dff805..9d73e629 100644
--- a/includes/installer/MysqlUpdater.php
+++ b/includes/installer/MysqlUpdater.php
@@ -31,6 +31,8 @@ class MysqlUpdater extends DatabaseUpdater {
protected function getCoreUpdateList() {
return array(
+ array( 'disableContentHandlerUseDB' ),
+
// 1.2
array( 'addField', 'ipblocks', 'ipb_id', 'patch-ipblocks.sql' ),
array( 'addField', 'ipblocks', 'ipb_expiry', 'patch-ipb_expiry.sql' ),
@@ -155,8 +157,8 @@ class MysqlUpdater extends DatabaseUpdater {
// 1.15
array( 'doUniquePlTlIl' ),
array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
- array( 'addTable', 'tag_summary', 'patch-change_tag.sql' ),
- array( 'addTable', 'valid_tag', 'patch-change_tag.sql' ),
+ /* array( 'addTable', 'tag_summary', 'patch-change_tag.sql' ), */
+ /* array( 'addTable', 'valid_tag', 'patch-change_tag.sql' ), */
// 1.16
array( 'addTable', 'user_properties', 'patch-user_properties.sql' ),
@@ -203,16 +205,35 @@ class MysqlUpdater extends DatabaseUpdater {
array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ),
array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ),
array( 'addIndex', 'page', 'page_redirect_namespace_len', 'patch-page_redirect_namespace_len.sql' ),
- array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase.sql' ),
array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ),
array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ),
- array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase.sql' ),
// 1.20
array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ),
+
+ // 1.21
+ array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ),
+ array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ),
+ array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ),
+ array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ),
+ array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
+ array( 'enableContentHandlerUseDB' ),
+
+ array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ),
+ array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
+ array( 'addTable', 'sites', 'patch-sites.sql' ),
+ array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+ array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
+ array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
+ array( 'doEnableProfiling' ),
+ array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
+ array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
+ array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
+ array( 'addIndex', 'page_props', 'pp_propname_page', 'patch-page_props-propname-page-index.sql' ),
+ array( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ),
);
}
@@ -220,11 +241,15 @@ class MysqlUpdater extends DatabaseUpdater {
* 1.4 betas were missing the 'binary' marker from logging.log_title,
* which causes a collation mismatch error on joins in MySQL 4.1.
*
- * @param $table String: table name
- * @param $field String: field name to check
- * @param $patchFile String: path to the patch to correct the field
+ * @param string $table table name
+ * @param string $field field name to check
+ * @param string $patchFile path to the patch to correct the field
*/
protected function checkBin( $table, $field, $patchFile ) {
+ if ( !$this->doTable( $table ) ) {
+ return true;
+ }
+
$tableName = $this->db->tableName( $table );
$res = $this->db->query( "SELECT $field FROM $tableName LIMIT 0", __METHOD__ );
$flags = explode( ' ', mysql_field_flags( $res->result, 0 ) );
@@ -239,12 +264,16 @@ class MysqlUpdater extends DatabaseUpdater {
/**
* Check whether an index contain a field
*
- * @param $table String: table name
- * @param $index String: index name to check
- * @param $field String: field that should be in the index
+ * @param string $table table name
+ * @param string $index index name to check
+ * @param string $field field that should be in the index
* @return Boolean
*/
protected function indexHasField( $table, $index, $field ) {
+ if ( !$this->doTable( $table ) ) {
+ return true;
+ }
+
$info = $this->db->indexInfo( $table, $index, __METHOD__ );
if ( $info ) {
foreach ( $info as $row ) {
@@ -264,6 +293,10 @@ class MysqlUpdater extends DatabaseUpdater {
protected function doInterwikiUpdate() {
global $IP;
+ if ( !$this->doTable( 'interwiki' ) ) {
+ return true;
+ }
+
if ( $this->db->tableExists( "interwiki", __METHOD__ ) ) {
$this->output( "...already have interwiki table\n" );
return;
@@ -302,7 +335,7 @@ class MysqlUpdater extends DatabaseUpdater {
}
if( $this->applyPatch( 'patch-fix-il_from.sql', false, "Fixing ancient broken imagelinks table." ) ) {
- $this->output("NOTE: you will have to run maintenance/refreshLinks.php after this." );
+ $this->output( "NOTE: you will have to run maintenance/refreshLinks.php after this." );
}
}
@@ -388,7 +421,7 @@ class MysqlUpdater extends DatabaseUpdater {
if ( $prev_title == $row->cur_title && $prev_namespace == $row->cur_namespace ) {
$deleteId[] = $row->cur_id;
}
- $prev_title = $row->cur_title;
+ $prev_title = $row->cur_title;
$prev_namespace = $row->cur_namespace;
}
$sql = "DELETE FROM $cur WHERE cur_id IN ( " . join( ',', $deleteId ) . ')';
@@ -552,6 +585,10 @@ class MysqlUpdater extends DatabaseUpdater {
}
protected function doUserUniqueUpdate() {
+ if ( !$this->doTable( 'user' ) ) {
+ return true;
+ }
+
$duper = new UserDupes( $this->db, array( $this, 'output' ) );
if ( $duper->hasUniqueIndex() ) {
$this->output( "...already have unique user_name index.\n" );
@@ -565,6 +602,10 @@ class MysqlUpdater extends DatabaseUpdater {
}
protected function doUserGroupsUpdate() {
+ if ( !$this->doTable( 'user_groups' ) ) {
+ return true;
+ }
+
if ( $this->db->tableExists( 'user_groups', __METHOD__ ) ) {
$info = $this->db->fieldInfo( 'user_groups', 'ug_group' );
if ( $info->type() == 'int' ) {
@@ -627,6 +668,9 @@ class MysqlUpdater extends DatabaseUpdater {
*/
protected function doWatchlistNull() {
$info = $this->db->fieldInfo( 'watchlist', 'wl_notificationtimestamp' );
+ if ( !$info ) {
+ return;
+ }
if ( $info->isNullable() ) {
$this->output( "...wl_notificationtimestamp is already nullable.\n" );
return;
@@ -759,14 +803,30 @@ class MysqlUpdater extends DatabaseUpdater {
}
}
+ protected function doEnableProfiling() {
+ global $wgProfileToDatabase;
+
+ if ( !$this->doTable( 'profiling' ) ) {
+ return true;
+ }
+
+ if ( $wgProfileToDatabase === true && ! $this->db->tableExists( 'profiling', __METHOD__ ) ) {
+ $this->applyPatch( 'patch-profiling.sql', false, 'Add profiling table' );
+ }
+ }
+
protected function doMaybeProfilingMemoryUpdate() {
+ if ( !$this->doTable( 'profiling' ) ) {
+ return true;
+ }
+
if ( !$this->db->tableExists( 'profiling', __METHOD__ ) ) {
- // Simply ignore
+ return true;
} elseif ( $this->db->fieldExists( 'profiling', 'pf_memory', __METHOD__ ) ) {
$this->output( "...profiling table has pf_memory field.\n" );
- } else {
- $this->applyPatch( 'patch-profiling-memory.sql', false, "Adding pf_memory field to table profiling" );
+ return true;
}
+ return $this->applyPatch( 'patch-profiling-memory.sql', false, "Adding pf_memory field to table profiling" );
}
protected function doFilearchiveIndicesUpdate() {
@@ -774,16 +834,21 @@ class MysqlUpdater extends DatabaseUpdater {
if ( !$info ) {
$this->applyPatch( 'patch-filearchive-user-index.sql', false, "Updating filearchive indices" );
}
+ return true;
}
protected function doUniquePlTlIl() {
$info = $this->db->indexInfo( 'pagelinks', 'pl_namespace' );
if ( is_array( $info ) && !$info[0]->Non_unique ) {
$this->output( "...pl_namespace, tl_namespace, il_to indices are already UNIQUE.\n" );
- return;
+ return true;
+ }
+ if ( $this->skipSchema ) {
+ $this->output( "...skipping schema change (making pl_namespace, tl_namespace and il_to indices UNIQUE).\n" );
+ return false;
}
- $this->applyPatch( 'patch-pl-tl-il-unique.sql', false, "Making pl_namespace, tl_namespace and il_to indices UNIQUE" );
+ return $this->applyPatch( 'patch-pl-tl-il-unique.sql', false, "Making pl_namespace, tl_namespace and il_to indices UNIQUE" );
}
protected function renameEuWikiId() {
@@ -826,7 +891,14 @@ class MysqlUpdater extends DatabaseUpdater {
}
protected function doUserNewTalkTimestampNotNull() {
+ if ( !$this->doTable( 'user_newtalk' ) ) {
+ return true;
+ }
+
$info = $this->db->fieldInfo( 'user_newtalk', 'user_last_timestamp' );
+ if ( $info === false ) {
+ return;
+ }
if ( $info->isNullable() ) {
$this->output( "...user_last_timestamp is already nullable.\n" );
return;
diff --git a/includes/installer/OracleInstaller.php b/includes/installer/OracleInstaller.php
index 72ec800d..e8538890 100644
--- a/includes/installer/OracleInstaller.php
+++ b/includes/installer/OracleInstaller.php
@@ -40,7 +40,7 @@ class OracleInstaller extends DatabaseInstaller {
protected $internalDefaults = array(
'_OracleDefTS' => 'USERS',
'_OracleTempTS' => 'TEMP',
- '_InstallUser' => 'SYSDBA',
+ '_InstallUser' => 'SYSTEM',
);
public $minimumVersion = '9.0.1'; // 9iR1
@@ -119,7 +119,7 @@ class OracleInstaller extends DatabaseInstaller {
return $status;
}
if ( !$this->getVar( '_CreateDBAccount' ) ) {
- $status->fatal('config-db-sys-create-oracle');
+ $status->fatal( 'config-db-sys-create-oracle' );
}
} else {
return $status;
@@ -202,7 +202,6 @@ class OracleInstaller extends DatabaseInstaller {
$this->parent->addInstallStep( $callback, 'database' );
}
-
public function setupDatabase() {
$status = Status::newGood();
return $status;
@@ -241,7 +240,7 @@ class OracleInstaller extends DatabaseInstaller {
$status->fatal( 'config-db-sys-user-exists-oracle', $this->getVar( 'wgDBuser' ) );
}
- if ($status->isOK()) {
+ if ( $status->isOK() ) {
// user created or already existing, switching back to a normal connection
// as the new user has all needed privileges to setup the rest of the schema
// i will be using that user as _InstallUser from this point on
@@ -294,7 +293,7 @@ class OracleInstaller extends DatabaseInstaller {
$prefix = $this->getVar( 'wgDBprefix' );
return
"# Oracle specific settings
-\$wgDBprefix = \"{$prefix}\";
+\$wgDBprefix = \"{$prefix}\";
";
}
diff --git a/includes/installer/OracleUpdater.php b/includes/installer/OracleUpdater.php
index e71c26fe..b416f4b6 100644
--- a/includes/installer/OracleUpdater.php
+++ b/includes/installer/OracleUpdater.php
@@ -38,6 +38,8 @@ class OracleUpdater extends DatabaseUpdater {
protected function getCoreUpdateList() {
return array(
+ array( 'disableContentHandlerUseDB' ),
+
// 1.17
array( 'doNamespaceDefaults' ),
array( 'doFKRenameDeferr' ),
@@ -59,16 +61,33 @@ class OracleUpdater extends DatabaseUpdater {
array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1_field.sql' ),
array( 'doRemoveNotNullEmptyDefaults2' ),
array( 'addIndex', 'page', 'i03', 'patch-page_redirect_namespace_len.sql' ),
- array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase.sql' ),
array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-us_chunk_inx_field.sql' ),
array( 'addField', 'job', 'job_timestamp', 'patch-job_timestamp_field.sql' ),
array( 'addIndex', 'job', 'i02', 'patch-job_timestamp_index.sql' ),
array( 'doPageRestrictionsPKUKFix' ),
- array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase.sql' ),
//1.20
array( 'addIndex', 'ipblocks', 'i05', 'patch-ipblocks_i05_index.sql' ),
array( 'addIndex', 'revision', 'i05', 'patch-revision_i05_index.sql' ),
+ array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ),
+
+ //1.21
+ array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ),
+ array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ),
+ array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ),
+ array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ),
+ array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
+ array( 'enableContentHandlerUseDB' ),
+
+ array( 'dropField', 'site_stats', 'ss_admins', 'patch-ss_admins.sql' ),
+ array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
+ array( 'addTable', 'sites', 'patch-sites.sql' ),
+ array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+ array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
+ array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
+ array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
+ array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
+ array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
// KEEP THIS AT THE BOTTOM!!
array( 'doRebuildDuplicateFunction' ),
@@ -148,7 +167,7 @@ class OracleUpdater extends DatabaseUpdater {
* converted to NULL in Oracle
*/
protected function doRemoveNotNullEmptyDefaults() {
- $meta = $this->db->fieldInfo( 'categorylinks' , 'cl_sortkey_prefix' );
+ $meta = $this->db->fieldInfo( 'categorylinks', 'cl_sortkey_prefix' );
if ( $meta->isNullable() ) {
return;
}
@@ -156,7 +175,7 @@ class OracleUpdater extends DatabaseUpdater {
}
protected function doRemoveNotNullEmptyDefaults2() {
- $meta = $this->db->fieldInfo( 'ipblocks' , 'ipb_by_text' );
+ $meta = $this->db->fieldInfo( 'ipblocks', 'ipb_by_text' );
if ( $meta->isNullable() ) {
return;
}
@@ -215,7 +234,7 @@ class OracleUpdater extends DatabaseUpdater {
/**
* Overload: because of the DDL_MODE tablename escaping is a bit dodgy
*/
- protected function purgeCache() {
+ public function purgeCache() {
# We can't guarantee that the user will be able to use TRUNCATE,
# but we know that DELETE is available to us
$this->output( "Purging caches..." );
diff --git a/includes/installer/PostgresInstaller.php b/includes/installer/PostgresInstaller.php
index 3ac2b3a8..4e5ae8cf 100644
--- a/includes/installer/PostgresInstaller.php
+++ b/includes/installer/PostgresInstaller.php
@@ -125,9 +125,9 @@ class PostgresInstaller extends DatabaseInstaller {
/**
* Open a PG connection with given parameters
- * @param $user string User name
- * @param $password string Password
- * @param $dbName string Database name
+ * @param string $user User name
+ * @param string $password Password
+ * @param string $dbName Database name
* @return Status
*/
protected function openConnectionWithParams( $user, $password, $dbName ) {
@@ -147,7 +147,7 @@ class PostgresInstaller extends DatabaseInstaller {
/**
* Get a special type of connection
- * @param $type string See openPgConnection() for details.
+ * @param string $type See openPgConnection() for details.
* @return Status
*/
protected function getPgConnection( $type ) {
@@ -183,13 +183,14 @@ class PostgresInstaller extends DatabaseInstaller {
* separate connection for this allows us to avoid accidental cross-module
* dependencies.
*
- * @param $type string The type of connection to get:
+ * @param string $type The type of connection to get:
* - create-db: A connection for creating DBs, suitable for pre-
* installation.
* - create-schema: A connection to the new DB, for creating schemas and
* other similar objects in the new DB.
* - create-tables: A connection with a role suitable for creating tables.
*
+ * @throws MWException
* @return Status object. On success, a connection object will be in the
* value member.
*/
@@ -382,9 +383,9 @@ class PostgresInstaller extends DatabaseInstaller {
/**
* Recursive helper for canCreateObjectsForWebUser().
* @param $conn DatabaseBase object
- * @param $targetMember int Role ID of the member to look for
- * @param $group int Role ID of the group to look for
- * @param $maxDepth int Maximum recursive search depth
+ * @param int $targetMember Role ID of the member to look for
+ * @param int $group Role ID of the group to look for
+ * @param int $maxDepth Maximum recursive search depth
* @return bool
*/
protected function isRoleMember( $conn, $targetMember, $group, $maxDepth ) {
@@ -530,8 +531,8 @@ class PostgresInstaller extends DatabaseInstaller {
$schema = $this->getVar( 'wgDBmwschema' );
return
"# Postgres specific settings
-\$wgDBport = \"{$port}\";
-\$wgDBmwschema = \"{$schema}\";";
+\$wgDBport = \"{$port}\";
+\$wgDBmwschema = \"{$schema}\";";
}
public function preUpgrade() {
diff --git a/includes/installer/PostgresUpdater.php b/includes/installer/PostgresUpdater.php
index 6cffe84a..0a4b5e65 100644
--- a/includes/installer/PostgresUpdater.php
+++ b/includes/installer/PostgresUpdater.php
@@ -90,6 +90,7 @@ class PostgresUpdater extends DatabaseUpdater {
array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
array( 'addTable', 'user_former_groups','patch-user_former_groups.sql' ),
array( 'addTable', 'external_user', 'patch-external_user.sql' ),
+ array( 'addTable', 'sites', 'patch-sites.sql' ),
# Needed before new field
array( 'convertArchive2' ),
@@ -100,6 +101,8 @@ class PostgresUpdater extends DatabaseUpdater {
array( 'addPgField', 'archive', 'ar_len', 'INTEGER' ),
array( 'addPgField', 'archive', 'ar_page_id', 'INTEGER' ),
array( 'addPgField', 'archive', 'ar_parent_id', 'INTEGER' ),
+ array( 'addPgField', 'archive', 'ar_content_model', 'TEXT' ),
+ array( 'addPgField', 'archive', 'ar_content_format', 'TEXT' ),
array( 'addPgField', 'categorylinks', 'cl_sortkey_prefix', "TEXT NOT NULL DEFAULT ''"),
array( 'addPgField', 'categorylinks', 'cl_collation', "TEXT NOT NULL DEFAULT 0"),
array( 'addPgField', 'categorylinks', 'cl_type', "TEXT NOT NULL DEFAULT 'page'"),
@@ -113,6 +116,7 @@ class PostgresUpdater extends DatabaseUpdater {
array( 'addPgField', 'ipblocks', 'ipb_enable_autoblock', 'SMALLINT NOT NULL DEFAULT 1' ),
array( 'addPgField', 'ipblocks', 'ipb_parent_block_id', 'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ),
array( 'addPgField', 'filearchive', 'fa_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+ array( 'addPgField', 'filearchive', 'fa_sha1', "TEXT NOT NULL DEFAULT ''" ),
array( 'addPgField', 'logging', 'log_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
array( 'addPgField', 'logging', 'log_id', "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')" ),
array( 'addPgField', 'logging', 'log_params', 'TEXT' ),
@@ -124,6 +128,7 @@ class PostgresUpdater extends DatabaseUpdater {
array( 'addPgField', 'oldimage', 'oi_metadata', "BYTEA NOT NULL DEFAULT ''" ),
array( 'addPgField', 'oldimage', 'oi_minor_mime', "TEXT NOT NULL DEFAULT 'unknown'" ),
array( 'addPgField', 'oldimage', 'oi_sha1', "TEXT NOT NULL DEFAULT ''" ),
+ array( 'addPgField', 'page', 'page_content_model', 'TEXT' ),
array( 'addPgField', 'page_restrictions', 'pr_id', "INTEGER NOT NULL UNIQUE DEFAULT nextval('page_restrictions_pr_id_seq')" ),
array( 'addPgField', 'profiling', 'pf_memory', 'NUMERIC(18,10) NOT NULL DEFAULT 0' ),
array( 'addPgField', 'recentchanges', 'rc_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
@@ -138,6 +143,8 @@ class PostgresUpdater extends DatabaseUpdater {
array( 'addPgField', 'revision', 'rev_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
array( 'addPgField', 'revision', 'rev_len', 'INTEGER' ),
array( 'addPgField', 'revision', 'rev_parent_id', 'INTEGER DEFAULT NULL' ),
+ array( 'addPgField', 'revision', 'rev_content_model', 'TEXT' ),
+ array( 'addPgField', 'revision', 'rev_content_format', 'TEXT' ),
array( 'addPgField', 'site_stats', 'ss_active_users', "INTEGER DEFAULT '-1'" ),
array( 'addPgField', 'user_newtalk', 'user_last_timestamp', 'TIMESTAMPTZ' ),
array( 'addPgField', 'logging', 'log_user_text', "TEXT NOT NULL DEFAULT ''" ),
@@ -148,6 +155,11 @@ class PostgresUpdater extends DatabaseUpdater {
array( 'addPgField', 'archive', 'ar_sha1', "TEXT NOT NULL DEFAULT ''" ),
array( 'addPgField', 'uploadstash', 'us_chunk_inx', "INTEGER NULL" ),
array( 'addPgField', 'job', 'job_timestamp', "TIMESTAMPTZ" ),
+ array( 'addPgField', 'job', 'job_random', "INTEGER NOT NULL DEFAULT 0" ),
+ array( 'addPgField', 'job', 'job_attempts', "INTEGER NOT NULL DEFAULT 0" ),
+ array( 'addPgField', 'job', 'job_token', "TEXT NOT NULL DEFAULT ''" ),
+ array( 'addPgField', 'job', 'job_token_timestamp', "TIMESTAMPTZ" ),
+ array( 'addPgField', 'job', 'job_sha1', "TEXT NOT NULL DEFAULT ''" ),
# type changes
array( 'changeField', 'archive', 'ar_deleted', 'smallint', '' ),
@@ -213,6 +225,7 @@ class PostgresUpdater extends DatabaseUpdater {
array( 'addPgIndex', 'oldimage', 'oi_sha1', '(oi_sha1)' ),
array( 'addPgIndex', 'page', 'page_mediawiki_title', '(page_title) WHERE page_namespace = 8' ),
array( 'addPgIndex', 'pagelinks', 'pagelinks_title', '(pl_title)' ),
+ array( 'addPgIndex', 'page_props', 'pp_propname_page', '(pp_propname, pp_page)' ),
array( 'addPgIndex', 'revision', 'rev_text_id_idx', '(rev_text_id)' ),
array( 'addPgIndex', 'recentchanges', 'rc_timestamp_bot', '(rc_timestamp) WHERE rc_bot = 0' ),
array( 'addPgIndex', 'templatelinks', 'templatelinks_from', '(tl_from)' ),
@@ -221,64 +234,68 @@ class PostgresUpdater extends DatabaseUpdater {
array( 'addPgIndex', 'logging', 'logging_page_id_time', '(log_page,log_timestamp)' ),
array( 'addPgIndex', 'iwlinks', 'iwl_prefix_title_from', '(iwl_prefix, iwl_title, iwl_from)' ),
array( 'addPgIndex', 'job', 'job_timestamp_idx', '(job_timestamp)' ),
+ array( 'addPgIndex', 'job', 'job_sha1', '(job_sha1)' ),
+ array( 'addPgIndex', 'job', 'job_cmd_token', '(job_cmd, job_token, job_random)' ),
+ array( 'addPgIndex', 'job', 'job_cmd_token_id', '(job_cmd, job_token, job_id)' ),
+ array( 'addPgIndex', 'filearchive', 'fa_sha1', '(fa_sha1)' ),
array( 'checkIndex', 'pagelink_unique', array(
- array('pl_from', 'int4_ops', 'btree', 0),
- array('pl_namespace', 'int2_ops', 'btree', 0),
- array('pl_title', 'text_ops', 'btree', 0),
+ array( 'pl_from', 'int4_ops', 'btree', 0 ),
+ array( 'pl_namespace', 'int2_ops', 'btree', 0 ),
+ array( 'pl_title', 'text_ops', 'btree', 0 ),
),
'CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)' ),
array( 'checkIndex', 'cl_sortkey', array(
- array('cl_to', 'text_ops', 'btree', 0),
- array('cl_sortkey', 'text_ops', 'btree', 0),
- array('cl_from', 'int4_ops', 'btree', 0),
+ array( 'cl_to', 'text_ops', 'btree', 0 ),
+ array( 'cl_sortkey', 'text_ops', 'btree', 0 ),
+ array( 'cl_from', 'int4_ops', 'btree', 0 ),
),
'CREATE INDEX cl_sortkey ON "categorylinks" USING "btree" ("cl_to", "cl_sortkey", "cl_from")' ),
array( 'checkIndex', 'logging_times', array(
- array('log_timestamp', 'timestamptz_ops', 'btree', 0),
+ array( 'log_timestamp', 'timestamptz_ops', 'btree', 0 ),
),
'CREATE INDEX "logging_times" ON "logging" USING "btree" ("log_timestamp")' ),
array( 'dropIndex', 'oldimage', 'oi_name' ),
array( 'checkIndex', 'oi_name_archive_name', array(
- array('oi_name', 'text_ops', 'btree', 0),
- array('oi_archive_name', 'text_ops', 'btree', 0),
+ array( 'oi_name', 'text_ops', 'btree', 0 ),
+ array( 'oi_archive_name', 'text_ops', 'btree', 0 ),
),
'CREATE INDEX "oi_name_archive_name" ON "oldimage" USING "btree" ("oi_name", "oi_archive_name")' ),
array( 'checkIndex', 'oi_name_timestamp', array(
- array('oi_name', 'text_ops', 'btree', 0),
- array('oi_timestamp', 'timestamptz_ops', 'btree', 0),
+ array( 'oi_name', 'text_ops', 'btree', 0 ),
+ array( 'oi_timestamp', 'timestamptz_ops', 'btree', 0 ),
),
'CREATE INDEX "oi_name_timestamp" ON "oldimage" USING "btree" ("oi_name", "oi_timestamp")' ),
array( 'checkIndex', 'page_main_title', array(
- array('page_title', 'text_pattern_ops', 'btree', 0),
+ array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
),
'CREATE INDEX "page_main_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 0)' ),
array( 'checkIndex', 'page_mediawiki_title', array(
- array('page_title', 'text_pattern_ops', 'btree', 0),
+ array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
),
'CREATE INDEX "page_mediawiki_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 8)' ),
array( 'checkIndex', 'page_project_title', array(
- array('page_title', 'text_pattern_ops', 'btree', 0),
+ array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
),
'CREATE INDEX "page_project_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 4)' ),
array( 'checkIndex', 'page_talk_title', array(
- array('page_title', 'text_pattern_ops', 'btree', 0),
+ array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
),
'CREATE INDEX "page_talk_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 1)' ),
array( 'checkIndex', 'page_user_title', array(
- array('page_title', 'text_pattern_ops', 'btree', 0),
+ array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
),
'CREATE INDEX "page_user_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 2)' ),
array( 'checkIndex', 'page_utalk_title', array(
- array('page_title', 'text_pattern_ops', 'btree', 0),
+ array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
),
'CREATE INDEX "page_utalk_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 3)' ),
array( 'checkIndex', 'ts2_page_text', array(
- array('textvector', 'tsvector_ops', 'gist', 0),
+ array( 'textvector', 'tsvector_ops', 'gist', 0 ),
),
'CREATE INDEX "ts2_page_text" ON "pagecontent" USING "gist" ("textvector")' ),
array( 'checkIndex', 'ts2_page_title', array(
- array('titlevector', 'tsvector_ops', 'gist', 0),
+ array( 'titlevector', 'tsvector_ops', 'gist', 0 ),
),
'CREATE INDEX "ts2_page_title" ON "page" USING "gist" ("titlevector")' ),
@@ -287,10 +304,10 @@ class PostgresUpdater extends DatabaseUpdater {
array( 'checkRevUserFkey' ),
array( 'dropIndex', 'ipblocks', 'ipb_address'),
array( 'checkIndex', 'ipb_address_unique', array(
- array('ipb_address', 'text_ops', 'btree', 0),
- array('ipb_user', 'int4_ops', 'btree', 0),
- array('ipb_auto', 'int2_ops', 'btree', 0),
- array('ipb_anon_only', 'int2_ops', 'btree', 0),
+ array( 'ipb_address', 'text_ops', 'btree', 0 ),
+ array( 'ipb_user', 'int4_ops', 'btree', 0 ),
+ array( 'ipb_auto', 'int2_ops', 'btree', 0 ),
+ array( 'ipb_anon_only', 'int2_ops', 'btree', 0 ),
),
'CREATE UNIQUE INDEX ipb_address_unique ON ipblocks (ipb_address,ipb_user,ipb_auto,ipb_anon_only)' ),
@@ -493,7 +510,7 @@ END;
$this->output( "Creating sequence $ns\n" );
$this->db->query( "CREATE SEQUENCE $ns" );
if( $pkey !== false ) {
- $this->setDefault( $table, $pkey, '"nextval"(\'"' . $ns . '"\'::"regclass")' );
+ $this->setDefault( $table, $pkey, '"nextval"(\'"' . $ns . '"\'::"regclass")' );
}
}
}
@@ -521,11 +538,34 @@ END;
}
}
- protected function renameIndex( $table, $old, $new ) {
- if ( $this->db->indexExists( $table, $old ) ) {
- $this->output( "Renaming index $old to $new\n" );
- $this->db->query( "ALTER INDEX $old RENAME TO $new" );
+ protected function renameIndex(
+ $table, $old, $new, $skipBothIndexExistWarning = false, $a = false, $b = false
+ ) {
+ // First requirement: the table must exist
+ if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
+ $this->output( "...skipping: '$table' table doesn't exist yet.\n" );
+ return;
+ }
+
+ // Second requirement: the new index must be missing
+ if ( $this->db->indexExists( $table, $new, __METHOD__ ) ) {
+ $this->output( "...index $new already set on $table table.\n" );
+ if ( !$skipBothIndexExistWarning
+ && $this->db->indexExists( $table, $old, __METHOD__ ) )
+ {
+ $this->output( "...WARNING: $old still exists, despite it has been renamed into $new (which also exists).\n" .
+ " $old should be manually removed if not needed anymore.\n" );
+ }
+ return;
}
+
+ // Third requirement: the old index must exist
+ if ( !$this->db->indexExists( $table, $old, __METHOD__ ) ) {
+ $this->output( "...skipping: index $old doesn't exist.\n" );
+ return;
+ }
+
+ $this->db->query( "ALTER INDEX $old RENAME TO $new" );
}
protected function addPgField( $table, $field, $type ) {
diff --git a/includes/installer/SqliteInstaller.php b/includes/installer/SqliteInstaller.php
index 6e1a74f6..68df6ab2 100644
--- a/includes/installer/SqliteInstaller.php
+++ b/includes/installer/SqliteInstaller.php
@@ -113,6 +113,8 @@ class SqliteInstaller extends DatabaseInstaller {
$dir = self::realpath( $dir );
$this->setVar( 'wgSQLiteDataDir', $dir );
}
+ # Table prefix is not used on SQLite, keep it empty
+ $this->setVar( 'wgDBprefix', '' );
return $result;
}
@@ -238,7 +240,7 @@ class SqliteInstaller extends DatabaseInstaller {
$module = DatabaseSqlite::getFulltextSearchModule();
$fts3tTable = $this->db->checkForEnabledSearch();
- if ( $fts3tTable && !$module ) {
+ if ( $fts3tTable && !$module ) {
$status->warning( 'config-sqlite-fts3-downgrade' );
$this->db->sourceFile( "$IP/maintenance/sqlite/archives/searchindex-no-fts.sql" );
} elseif ( !$fts3tTable && $module == 'FTS3' ) {
@@ -254,6 +256,6 @@ class SqliteInstaller extends DatabaseInstaller {
$dir = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgSQLiteDataDir' ) );
return
"# SQLite-specific settings
-\$wgSQLiteDataDir = \"{$dir}\";";
+\$wgSQLiteDataDir = \"{$dir}\";";
}
}
diff --git a/includes/installer/SqliteUpdater.php b/includes/installer/SqliteUpdater.php
index 12a310af..2064842a 100644
--- a/includes/installer/SqliteUpdater.php
+++ b/includes/installer/SqliteUpdater.php
@@ -31,6 +31,8 @@ class SqliteUpdater extends DatabaseUpdater {
protected function getCoreUpdateList() {
return array(
+ array( 'disableContentHandlerUseDB' ),
+
// 1.14
array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ),
array( 'doActiveUsersInit' ),
@@ -82,16 +84,35 @@ class SqliteUpdater extends DatabaseUpdater {
array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ),
array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ),
array( 'addIndex', 'page', 'page_redirect_namespace_len', 'patch-page_redirect_namespace_len.sql' ),
- array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase.sql' ),
array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ),
array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ),
- array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ug_group-length-increase.sql' ),
// 1.20
array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ),
+
+ // 1.21
+ array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ),
+ array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ),
+ array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ),
+ array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ),
+ array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
+ array( 'enableContentHandlerUseDB' ),
+
+ array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ),
+ array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
+ array( 'addTable', 'sites', 'patch-sites.sql' ),
+ array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+ array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
+ array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
+ array( 'doEnableProfiling' ),
+ array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
+ array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
+ array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
+ array( 'addIndex', 'page_props', 'pp_propname_page', 'patch-page_props-propname-page-index.sql' ),
+ array( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ),
);
}
@@ -107,7 +128,7 @@ class SqliteUpdater extends DatabaseUpdater {
protected function sqliteSetupSearchindex() {
$module = DatabaseSqlite::getFulltextSearchModule();
$fts3tTable = $this->updateRowExists( 'fts3' );
- if ( $fts3tTable && !$module ) {
+ if ( $fts3tTable && !$module ) {
$this->applyPatch( 'searchindex-no-fts.sql', false, 'PHP is missing FTS3 support, downgrading tables' );
} elseif ( !$fts3tTable && $module == 'FTS3' ) {
$this->applyPatch( 'searchindex-fts3.sql', false, "Adding FTS3 search capabilities" );
@@ -115,4 +136,11 @@ class SqliteUpdater extends DatabaseUpdater {
$this->output( "...fulltext search table appears to be in order.\n" );
}
}
+
+ protected function doEnableProfiling() {
+ global $wgProfileToDatabase;
+ if ( $wgProfileToDatabase === true && ! $this->db->tableExists( 'profiling', __METHOD__ ) ) {
+ $this->applyPatch( 'patch-profiling.sql', false, 'Add profiling table' );
+ }
+ }
}
diff --git a/includes/installer/WebInstaller.php b/includes/installer/WebInstaller.php
index 2f46ff0b..35d649b2 100644
--- a/includes/installer/WebInstaller.php
+++ b/includes/installer/WebInstaller.php
@@ -56,10 +56,11 @@ class WebInstaller extends Installer {
/**
* The main sequence of page names. These will be displayed in turn.
- * To add one:
- * * Add it here
- * * Add a config-page-<name> message
- * * Add a WebInstaller_<name> class
+ *
+ * To add a new installer page:
+ * * Add it to this WebInstaller::$pageSequence property
+ * * Add a "config-page-<name>" message
+ * * Add a "WebInstaller_<name>" class
* @var array
*/
public $pageSequence = array(
@@ -139,7 +140,7 @@ class WebInstaller extends Installer {
/**
* Main entry point.
*
- * @param $session Array: initial session array
+ * @param array $session initial session array
*
* @return Array: new session array
*/
@@ -425,7 +426,7 @@ class WebInstaller extends Installer {
$url = preg_replace( '/\?.*$/', '', $url );
if ( $query ) {
- $url .= '?' . wfArrayToCGI( $query );
+ $url .= '?' . wfArrayToCgi( $query );
}
return $url;
@@ -460,7 +461,7 @@ class WebInstaller extends Installer {
/**
* Set a session variable.
- * @param $name String key for the variable
+ * @param string $name key for the variable
* @param $value Mixed
*/
public function setSession( $name, $value ) {
@@ -609,7 +610,7 @@ class WebInstaller extends Installer {
/**
* Get HTML for an error box with an icon.
*
- * @param $text String: wikitext, get this with wfMessage()->plain()
+ * @param string $text wikitext, get this with wfMessage()->plain()
*
* @return string
*/
@@ -620,7 +621,7 @@ class WebInstaller extends Installer {
/**
* Get HTML for a warning box with an icon.
*
- * @param $text String: wikitext, get this with wfMessage()->plain()
+ * @param string $text wikitext, get this with wfMessage()->plain()
*
* @return string
*/
@@ -631,9 +632,9 @@ class WebInstaller extends Installer {
/**
* Get HTML for an info box with an icon.
*
- * @param $text String: wikitext, get this with wfMessage()->plain()
- * @param $icon String: icon name, file in skins/common/images
- * @param $class String: additional class name to add to the wrapper div
+ * @param string $text wikitext, get this with wfMessage()->plain()
+ * @param string $icon icon name, file in skins/common/images
+ * @param string $class additional class name to add to the wrapper div
*
* @return string
*/
@@ -667,7 +668,7 @@ class WebInstaller extends Installer {
/**
* Output a help box.
- * @param $msg String key for wfMessage()
+ * @param string $msg key for wfMessage()
*/
public function showHelpBox( $msg /*, ... */ ) {
$args = func_get_args();
@@ -932,7 +933,7 @@ class WebInstaller extends Installer {
* @return string
*/
public function getRadioSet( $params ) {
- if ( !isset( $params['controlName'] ) ) {
+ if ( !isset( $params['controlName'] ) ) {
$params['controlName'] = 'config_' . $params['var'];
}
@@ -1005,7 +1006,7 @@ class WebInstaller extends Installer {
* fake) passwords.
*
* @param $varNames Array
- * @param $prefix String: the prefix added to variables to obtain form names
+ * @param string $prefix the prefix added to variables to obtain form names
*
* @return array
*/
@@ -1078,14 +1079,14 @@ class WebInstaller extends Installer {
) );
$anchor = Html::rawElement( 'a',
array( 'href' => $this->getURL( array( 'localsettings' => 1 ) ) ),
- $img . ' ' . wfMessage( 'config-download-localsettings' )->escaped() );
+ $img . ' ' . wfMessage( 'config-download-localsettings' )->parse() );
return Html::rawElement( 'div', array( 'class' => 'config-download-link' ), $anchor );
}
/**
* @return bool
*/
- public function envCheckPath( ) {
+ public function envCheckPath() {
// PHP_SELF isn't available sometimes, such as when PHP is CGI but
// cgi.fix_pathinfo is disabled. In that case, fall back to SCRIPT_NAME
// to get the path to the current script... hopefully it's reliable. SIGH
@@ -1095,7 +1096,7 @@ class WebInstaller extends Installer {
} elseif ( !empty( $_SERVER['SCRIPT_NAME'] ) ) {
$path = $_SERVER['SCRIPT_NAME'];
}
- if ($path !== false) {
+ if ( $path !== false ) {
$uri = preg_replace( '{^(.*)/(mw-)?config.*$}', '$1', $path );
$this->setVar( 'wgScriptPath', $uri );
} else {
diff --git a/includes/installer/WebInstallerOutput.php b/includes/installer/WebInstallerOutput.php
index f3166c25..d61d843f 100644
--- a/includes/installer/WebInstallerOutput.php
+++ b/includes/installer/WebInstallerOutput.php
@@ -104,7 +104,7 @@ class WebInstallerOutput {
/**
* Get the raw vector CSS, flipping if needed
- * @param $dir String 'ltr' or 'rtl'
+ * @param string $dir 'ltr' or 'rtl'
* @return String
*/
public function getCSS( $dir ) {
@@ -157,7 +157,7 @@ class WebInstallerOutput {
* "<link>" to index.php?css=foobar for the "<head>"
* @return String
*/
- private function getCssUrl( ) {
+ private function getCssUrl() {
return Html::linkedStyle( $_SERVER['PHP_SELF'] . '?css=' . $this->getDir() );
}
@@ -219,7 +219,7 @@ class WebInstallerOutput {
$dbTypes = $this->parent->getDBTypes();
$this->parent->request->response()->header( 'Content-Type: text/html; charset=utf-8' );
- if (!$this->allowFrames) {
+ if ( !$this->allowFrames ) {
$this->parent->request->response()->header( 'X-Frame-Options: DENY' );
}
if ( $this->redirectTarget ) {
@@ -239,7 +239,7 @@ class WebInstallerOutput {
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<title><?php $this->outputTitle(); ?></title>
<?php echo $this->getCssUrl() . "\n"; ?>
- <?php echo Html::inlineScript( "var dbTypes = " . Xml::encodeJsVar( $dbTypes ) ) . "\n"; ?>
+ <?php echo Html::inlineScript( "var dbTypes = " . Xml::encodeJsVar( $dbTypes ) ) . "\n"; ?>
<?php echo $this->getJQuery() . "\n"; ?>
<?php echo Html::linkedScript( '../skins/common/config.js' ) . "\n"; ?>
</head>
diff --git a/includes/installer/WebInstallerPage.php b/includes/installer/WebInstallerPage.php
index a193afb7..78830293 100644
--- a/includes/installer/WebInstallerPage.php
+++ b/includes/installer/WebInstallerPage.php
@@ -36,7 +36,7 @@ abstract class WebInstallerPage {
*/
public $parent;
- public abstract function execute();
+ abstract public function execute();
/**
* Constructor.
@@ -128,7 +128,7 @@ abstract class WebInstallerPage {
/**
* Get the starting tags of a fieldset.
*
- * @param $legend String: message name
+ * @param string $legend message name
*
* @return string
*/
@@ -357,7 +357,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
/**
* Initiate an upgrade of the existing database
- * @param $vars array Variables from LocalSettings.php and AdminSettings.php
+ * @param array $vars Variables from LocalSettings.php and AdminSettings.php
* @return Status
*/
protected function handleExistingUpgrade( $vars ) {
@@ -369,7 +369,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
// Set the relevant variables from LocalSettings.php
$requiredVars = array( 'wgDBtype' );
- $status = $this->importVariables( $requiredVars , $vars );
+ $status = $this->importVariables( $requiredVars, $vars );
$installer = $this->parent->getDBInstaller();
$status->merge( $this->importVariables( $installer->getGlobalNames(), $vars ) );
if ( !$status->isOK() ) {
@@ -422,6 +422,7 @@ class WebInstaller_Welcome extends WebInstallerPage {
} else {
$this->parent->showStatusMessage( $status );
}
+ return '';
}
}
@@ -459,7 +460,14 @@ class WebInstaller_DBConnect extends WebInstallerPage {
$this->addHTML( $this->parent->getInfoBox(
wfMessage( 'config-support-info', trim( $dbSupport ) )->text() ) );
- foreach ( $this->parent->getVar( '_CompiledDBs' ) as $type ) {
+ // It's possible that the library for the default DB type is not compiled in.
+ // In that case, instead select the first supported DB type in the list.
+ $compiledDBs = $this->parent->getVar( '_CompiledDBs' );
+ if ( !in_array( $defaultType, $compiledDBs ) ) {
+ $defaultType = $compiledDBs[0];
+ }
+
+ foreach ( $compiledDBs as $type ) {
$installer = $this->parent->getDBInstaller( $type );
$types .=
'<li>' .
@@ -493,6 +501,9 @@ class WebInstaller_DBConnect extends WebInstallerPage {
public function submit() {
$r = $this->parent->request;
$type = $r->getVal( 'DBType' );
+ if ( !$type ) {
+ return Status::newFatal( 'config-invalid-db-type' );
+ }
$this->setVar( 'wgDBtype', $type );
$installer = $this->parent->getDBInstaller( $type );
if ( !$installer ) {
@@ -644,7 +655,7 @@ class WebInstaller_Name extends WebInstallerPage {
$this->parent->getTextBox( array(
'var' => 'wgSitename',
'label' => 'config-site-name',
- 'help' => $this->parent->getHelpBox( 'config-site-name-help' )
+ 'help' => $this->parent->getHelpBox( 'config-site-name-help' )
) ) .
$this->parent->getRadioSet( array(
'var' => '_NamespaceType',
@@ -911,6 +922,10 @@ class WebInstaller_Options extends WebInstallerPage {
$this->getVar( 'wgDeletedDirectory' )
)
);
+ // If we're using the default, let the user set it relative to $wgScriptPath
+ $curLogo = $this->getVar( 'wgLogo' );
+ $logoString = ( $curLogo == "/wiki/skins/common/images/wiki.png" ) ?
+ '$wgStylePath/common/images/wiki.png' : $curLogo;
$uploadwrapperStyle = $this->getVar( 'wgEnableUploads' ) ? '' : 'display: none';
$this->addHTML(
@@ -932,6 +947,7 @@ class WebInstaller_Options extends WebInstallerPage {
'</div>' .
$this->parent->getTextBox( array(
'var' => 'wgLogo',
+ 'value' => $logoString,
'label' => 'config-logo',
'attribs' => array( 'dir' => 'ltr' ),
'help' => $this->parent->getHelpBox( 'config-logo-help' )
@@ -954,7 +970,7 @@ class WebInstaller_Options extends WebInstallerPage {
// We'll hide/show this on demand when the value changes, see config.js.
$cacheval = $this->getVar( 'wgMainCacheType' );
- if (!$cacheval) {
+ if ( !$cacheval ) {
// We need to set a default here; but don't hardcode it
// or we lose it every time we reload the page for validation
// or going back!
@@ -1001,7 +1017,7 @@ class WebInstaller_Options extends WebInstallerPage {
$styleUrl = $server . dirname( dirname( $this->parent->getUrl() ) ) .
'/skins/common/config-cc.css';
$iframeUrl = 'http://creativecommons.org/license/?' .
- wfArrayToCGI( array(
+ wfArrayToCgi( array(
'partner' => 'MediaWiki',
'exit_url' => $exitUrl,
'lang' => $this->getVar( '_UserLang' ),
@@ -1024,7 +1040,7 @@ class WebInstaller_Options extends WebInstallerPage {
} else {
$iframeAttribs['src'] = $this->getCCPartnerUrl();
}
- $wrapperStyle = ($this->getVar('_LicenseCode') == 'cc-choose') ? '' : 'display: none';
+ $wrapperStyle = ($this->getVar( '_LicenseCode' ) == 'cc-choose') ? '' : 'display: none';
return
"<div class=\"config-cc-wrapper\" id=\"config-cc-wrapper\" style=\"$wrapperStyle\">\n" .
@@ -1154,12 +1170,12 @@ class WebInstaller_Install extends WebInstallerPage {
return 'continue';
} elseif( $this->parent->request->wasPosted() ) {
$this->startForm();
- $this->addHTML("<ul>");
+ $this->addHTML( "<ul>" );
$results = $this->parent->performInstallation(
- array( $this, 'startStage'),
+ array( $this, 'startStage' ),
array( $this, 'endStage' )
);
- $this->addHTML("</ul>");
+ $this->addHTML( "</ul>" );
// PerformInstallation bails on a fatal, so make sure the last item
// completed before giving 'next.' Likewise, only provide back on failure
$lastStep = end( $results );
@@ -1175,7 +1191,7 @@ class WebInstaller_Install extends WebInstallerPage {
}
public function startStage( $step ) {
- $this->addHTML( "<li>" . wfMessage( "config-install-$step" )->escaped() . wfMessage( 'ellipsis')->escaped() );
+ $this->addHTML( "<li>" . wfMessage( "config-install-$step" )->escaped() . wfMessage( 'ellipsis' )->escaped() );
if ( $step == 'extension-tables' ) {
$this->startLiveBox();
}
@@ -1258,7 +1274,7 @@ class WebInstaller_Restart extends WebInstallerPage {
abstract class WebInstaller_Document extends WebInstallerPage {
- protected abstract function getFileName();
+ abstract protected function getFileName();
public function execute() {
$text = $this->getFileContents();
@@ -1286,8 +1302,8 @@ class WebInstaller_ReleaseNotes extends WebInstaller_Document {
protected function getFileName() {
global $wgVersion;
- if(! preg_match( '/^(\d+)\.(\d+).*/i', $wgVersion, $result ) ) {
- throw new MWException('Variable $wgVersion has an invalid value.');
+ if( !preg_match( '/^(\d+)\.(\d+).*/i', $wgVersion, $result ) ) {
+ throw new MWException( 'Variable $wgVersion has an invalid value.' );
}
return 'RELEASE-NOTES-' . $result[1] . '.' . $result[2];
@@ -1301,4 +1317,3 @@ class WebInstaller_UpgradeDoc extends WebInstaller_Document {
class WebInstaller_Copying extends WebInstaller_Document {
protected function getFileName() { return 'COPYING'; }
}
-
diff --git a/includes/interwiki/Interwiki.php b/includes/interwiki/Interwiki.php
index eacf9a87..4003fa88 100644
--- a/includes/interwiki/Interwiki.php
+++ b/includes/interwiki/Interwiki.php
@@ -27,14 +27,15 @@
* schema updates etc, which aren't wiki-related)
*/
class Interwiki {
-
// Cache - removes oldest entry when it hits limit
protected static $smCache = array();
const CACHE_LIMIT = 100; // 0 means unlimited, any other value is max number of entries.
protected $mPrefix, $mURL, $mAPI, $mWikiID, $mLocal, $mTrans;
- public function __construct( $prefix = null, $url = '', $api = '', $wikiId = '', $local = 0, $trans = 0 ) {
+ public function __construct( $prefix = null, $url = '', $api = '', $wikiId = '', $local = 0,
+ $trans = 0
+ ) {
$this->mPrefix = $prefix;
$this->mURL = $url;
$this->mAPI = $api;
@@ -46,10 +47,10 @@ class Interwiki {
/**
* Check whether an interwiki prefix exists
*
- * @param $prefix String: interwiki prefix to use
- * @return Boolean: whether it exists
+ * @param string $prefix Interwiki prefix to use
+ * @return bool Whether it exists
*/
- static public function isValidInterwiki( $prefix ) {
+ public static function isValidInterwiki( $prefix ) {
$result = self::fetch( $prefix );
return (bool)$result;
}
@@ -57,28 +58,28 @@ class Interwiki {
/**
* Fetch an Interwiki object
*
- * @param $prefix String: interwiki prefix to use
+ * @param string $prefix Interwiki prefix to use
* @return Interwiki|null|bool
*/
- static public function fetch( $prefix ) {
+ public static function fetch( $prefix ) {
global $wgContLang;
- if( $prefix == '' ) {
+ if ( $prefix == '' ) {
return null;
}
$prefix = $wgContLang->lc( $prefix );
- if( isset( self::$smCache[$prefix] ) ) {
+ if ( isset( self::$smCache[$prefix] ) ) {
return self::$smCache[$prefix];
}
global $wgInterwikiCache;
- if( $wgInterwikiCache ) {
+ if ( $wgInterwikiCache ) {
$iw = Interwiki::getInterwikiCached( $prefix );
} else {
$iw = Interwiki::load( $prefix );
- if( !$iw ) {
+ if ( !$iw ) {
$iw = false;
}
}
- if( self::CACHE_LIMIT && count( self::$smCache ) >= self::CACHE_LIMIT ) {
+ if ( self::CACHE_LIMIT && count( self::$smCache ) >= self::CACHE_LIMIT ) {
reset( self::$smCache );
unset( self::$smCache[key( self::$smCache )] );
}
@@ -91,7 +92,7 @@ class Interwiki {
*
* @note More logic is explained in DefaultSettings.
*
- * @param $prefix String: interwiki prefix
+ * @param string $prefix Interwiki prefix
* @return Interwiki object
*/
protected static function getInterwikiCached( $prefix ) {
@@ -114,19 +115,19 @@ class Interwiki {
*
* @note More logic is explained in DefaultSettings.
*
- * @param $prefix String: database key
- * @return String: the entry
+ * @param string $prefix Database key
+ * @return string The interwiki entry
*/
protected static function getInterwikiCacheEntry( $prefix ) {
global $wgInterwikiCache, $wgInterwikiScopes, $wgInterwikiFallbackSite;
static $db, $site;
wfDebug( __METHOD__ . "( $prefix )\n" );
- if( !$db ) {
+ if ( !$db ) {
$db = CdbReader::open( $wgInterwikiCache );
}
/* Resolve site name */
- if( $wgInterwikiScopes >= 3 && !$site ) {
+ if ( $wgInterwikiScopes >= 3 && !$site ) {
$site = $db->get( '__sites:' . wfWikiID() );
if ( $site == '' ) {
$site = $wgInterwikiFallbackSite;
@@ -146,15 +147,14 @@ class Interwiki {
$value = '';
}
-
return $value;
}
/**
* Load the interwiki, trying first memcached then the DB
*
- * @param $prefix string The interwiki prefix
- * @return Boolean: the prefix is valid
+ * @param string $prefix The interwiki prefix
+ * @return bool If $prefix is valid
*/
protected static function load( $prefix ) {
global $wgMemc, $wgInterwikiExpiry;
@@ -172,9 +172,9 @@ class Interwiki {
}
}
- if( $iwData && is_array( $iwData ) ) { // is_array is hack for old keys
+ if ( $iwData && is_array( $iwData ) ) { // is_array is hack for old keys
$iw = Interwiki::loadFromArray( $iwData );
- if( $iw ) {
+ if ( $iw ) {
return $iw;
}
}
@@ -203,11 +203,11 @@ class Interwiki {
/**
* Fill in member variables from an array (e.g. memcached result, Database::fetchRow, etc)
*
- * @param $mc array Associative array: row from the interwiki table
- * @return Boolean|Interwiki whether everything was there
+ * @param array $mc Associative array: row from the interwiki table
+ * @return Interwiki|bool Interwiki object or false if $mc['iw_url'] is not set
*/
protected static function loadFromArray( $mc ) {
- if( isset( $mc['iw_url'] ) ) {
+ if ( isset( $mc['iw_url'] ) ) {
$iw = new Interwiki();
$iw->mURL = $mc['iw_url'];
$iw->mLocal = isset( $mc['iw_local'] ) ? $mc['iw_local'] : 0;
@@ -223,8 +223,8 @@ class Interwiki {
/**
* Fetch all interwiki prefixes from interwiki cache
*
- * @param $local null|string If not null, limits output to local/non-local interwikis
- * @return Array List of prefixes
+ * @param null|string $local If not null, limits output to local/non-local interwikis
+ * @return array List of prefixes
* @since 1.19
*/
protected static function getAllPrefixesCached( $local ) {
@@ -232,11 +232,11 @@ class Interwiki {
static $db, $site;
wfDebug( __METHOD__ . "()\n" );
- if( !$db ) {
+ if ( !$db ) {
$db = CdbReader::open( $wgInterwikiCache );
}
/* Resolve site name */
- if( $wgInterwikiScopes >= 3 && !$site ) {
+ if ( $wgInterwikiScopes >= 3 && !$site ) {
$site = $db->get( '__sites:' . wfWikiID() );
if ( $site == '' ) {
$site = $wgInterwikiFallbackSite;
@@ -257,11 +257,11 @@ class Interwiki {
$data = array();
- foreach( $sources as $source ) {
+ foreach ( $sources as $source ) {
$list = $db->get( "__list:{$source}" );
foreach ( explode( ' ', $list ) as $iw_prefix ) {
$row = $db->get( "{$source}:{$iw_prefix}" );
- if( !$row ) {
+ if ( !$row ) {
continue;
}
@@ -273,8 +273,8 @@ class Interwiki {
$data[$iw_prefix] = array(
'iw_prefix' => $iw_prefix,
- 'iw_url' => $iw_url,
- 'iw_local' => $iw_local,
+ 'iw_url' => $iw_url,
+ 'iw_local' => $iw_local,
);
}
}
@@ -287,8 +287,8 @@ class Interwiki {
/**
* Fetch all interwiki prefixes from DB
*
- * @param $local string|null If not null, limits output to local/non-local interwikis
- * @return Array List of prefixes
+ * @param string|null $local If not null, limits output to local/non-local interwikis
+ * @return array List of prefixes
* @since 1.19
*/
protected static function getAllPrefixesDB( $local ) {
@@ -318,8 +318,8 @@ class Interwiki {
/**
* Returns all interwiki prefixes
*
- * @param $local string|null If set, limits output to local/non-local interwikis
- * @return Array List of prefixes
+ * @param string|null $local If set, limits output to local/non-local interwikis
+ * @return array List of prefixes
* @since 1.19
*/
public static function getAllPrefixes( $local = null ) {
@@ -335,15 +335,15 @@ class Interwiki {
/**
* Get the URL for a particular title (or with $1 if no title given)
*
- * @param $title String: what text to put for the article name
- * @return String: the URL
+ * @param string $title What text to put for the article name
+ * @return string The URL
* @note Prior to 1.19 The getURL with an argument was broken.
* If you if you use this arg in an extension that supports MW earlier
* than 1.19 please wfUrlencode and substitute $1 on your own.
*/
public function getURL( $title = null ) {
$url = $this->mURL;
- if( $title !== null ) {
+ if ( $title !== null ) {
$url = str_replace( "$1", wfUrlencode( $title ), $url );
}
return $url;
@@ -352,7 +352,7 @@ class Interwiki {
/**
* Get the API URL for this wiki
*
- * @return String: the URL
+ * @return string The URL
*/
public function getAPI() {
return $this->mAPI;
@@ -361,7 +361,7 @@ class Interwiki {
/**
* Get the DB name for this wiki
*
- * @return String: the DB name
+ * @return string The DB name
*/
public function getWikiID() {
return $this->mWikiID;
@@ -371,7 +371,7 @@ class Interwiki {
* Is this a local link from a sister project, or is
* it something outside, like Google
*
- * @return Boolean
+ * @return bool
*/
public function isLocal() {
return $this->mLocal;
@@ -381,7 +381,7 @@ class Interwiki {
* Can pages from this wiki be transcluded?
* Still requires $wgEnableScaryTransclusion
*
- * @return Boolean
+ * @return bool
*/
public function isTranscludable() {
return $this->mTrans;
@@ -390,7 +390,7 @@ class Interwiki {
/**
* Get the name for the interwiki site
*
- * @return String
+ * @return string
*/
public function getName() {
$msg = wfMessage( 'interwiki-name-' . $this->mPrefix )->inContentLanguage();
@@ -400,7 +400,7 @@ class Interwiki {
/**
* Get a description for this interwiki
*
- * @return String
+ * @return string
*/
public function getDescription() {
$msg = wfMessage( 'interwiki-desc-' . $this->mPrefix )->inContentLanguage();
@@ -409,8 +409,8 @@ class Interwiki {
/**
* Return the list of interwiki fields that should be selected to create
- * a new interwiki object.
- * @return array
+ * a new Interwiki object.
+ * @return string[]
*/
public static function selectFields() {
return array(
diff --git a/includes/job/DoubleRedirectJob.php b/includes/job/DoubleRedirectJob.php
deleted file mode 100644
index 08af9975..00000000
--- a/includes/job/DoubleRedirectJob.php
+++ /dev/null
@@ -1,207 +0,0 @@
-<?php
-/**
- * Job to fix double redirects after moving a page.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Job to fix double redirects after moving a page
- *
- * @ingroup JobQueue
- */
-class DoubleRedirectJob extends Job {
- var $reason, $redirTitle, $destTitleText;
-
- /**
- * @var User
- */
- static $user;
-
- /**
- * Insert jobs into the job queue to fix redirects to the given title
- * @param $reason String: the reason for the fix, see message "double-redirect-fixed-<reason>"
- * @param $redirTitle Title: the title which has changed, redirects pointing to this title are fixed
- * @param $destTitle bool Not used
- */
- public static function fixRedirects( $reason, $redirTitle, $destTitle = false ) {
- # Need to use the master to get the redirect table updated in the same transaction
- $dbw = wfGetDB( DB_MASTER );
- $res = $dbw->select(
- array( 'redirect', 'page' ),
- array( 'page_namespace', 'page_title' ),
- array(
- 'page_id = rd_from',
- 'rd_namespace' => $redirTitle->getNamespace(),
- 'rd_title' => $redirTitle->getDBkey()
- ), __METHOD__ );
- if ( !$res->numRows() ) {
- return;
- }
- $jobs = array();
- foreach ( $res as $row ) {
- $title = Title::makeTitle( $row->page_namespace, $row->page_title );
- if ( !$title ) {
- continue;
- }
-
- $jobs[] = new self( $title, array(
- 'reason' => $reason,
- 'redirTitle' => $redirTitle->getPrefixedDBkey() ) );
- # Avoid excessive memory usage
- if ( count( $jobs ) > 10000 ) {
- Job::batchInsert( $jobs );
- $jobs = array();
- }
- }
- Job::batchInsert( $jobs );
- }
-
- function __construct( $title, $params = false, $id = 0 ) {
- parent::__construct( 'fixDoubleRedirect', $title, $params, $id );
- $this->reason = $params['reason'];
- $this->redirTitle = Title::newFromText( $params['redirTitle'] );
- $this->destTitleText = !empty( $params['destTitle'] ) ? $params['destTitle'] : '';
- }
-
- /**
- * @return bool
- */
- function run() {
- if ( !$this->redirTitle ) {
- $this->setLastError( 'Invalid title' );
- return false;
- }
-
- $targetRev = Revision::newFromTitle( $this->title, false, Revision::READ_LATEST );
- if ( !$targetRev ) {
- wfDebug( __METHOD__.": target redirect already deleted, ignoring\n" );
- return true;
- }
- $text = $targetRev->getText();
- $currentDest = Title::newFromRedirect( $text );
- if ( !$currentDest || !$currentDest->equals( $this->redirTitle ) ) {
- wfDebug( __METHOD__.": Redirect has changed since the job was queued\n" );
- return true;
- }
-
- # Check for a suppression tag (used e.g. in periodically archived discussions)
- $mw = MagicWord::get( 'staticredirect' );
- if ( $mw->match( $text ) ) {
- wfDebug( __METHOD__.": skipping: suppressed with __STATICREDIRECT__\n" );
- return true;
- }
-
- # Find the current final destination
- $newTitle = self::getFinalDestination( $this->redirTitle );
- if ( !$newTitle ) {
- wfDebug( __METHOD__.": skipping: single redirect, circular redirect or invalid redirect destination\n" );
- return true;
- }
- if ( $newTitle->equals( $this->redirTitle ) ) {
- # The redirect is already right, no need to change it
- # This can happen if the page was moved back (say after vandalism)
- wfDebug( __METHOD__.": skipping, already good\n" );
- }
-
- # Preserve fragment (bug 14904)
- $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
- $currentDest->getFragment() );
-
- # Fix the text
- # Remember that redirect pages can have categories, templates, etc.,
- # so the regex has to be fairly general
- $newText = preg_replace( '/ \[ \[ [^\]]* \] \] /x',
- '[[' . $newTitle->getFullText() . ']]',
- $text, 1 );
-
- if ( $newText === $text ) {
- $this->setLastError( 'Text unchanged???' );
- return false;
- }
-
- # Save it
- global $wgUser;
- $oldUser = $wgUser;
- $wgUser = $this->getUser();
- $article = WikiPage::factory( $this->title );
- $reason = wfMessage( 'double-redirect-fixed-' . $this->reason,
- $this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText()
- )->inContentLanguage()->text();
- $article->doEdit( $newText, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC, false, $this->getUser() );
- $wgUser = $oldUser;
-
- return true;
- }
-
- /**
- * Get the final destination of a redirect
- *
- * @param $title Title
- *
- * @return bool if the specified title is not a redirect, or if it is a circular redirect
- */
- public static function getFinalDestination( $title ) {
- $dbw = wfGetDB( DB_MASTER );
-
- $seenTitles = array(); # Circular redirect check
- $dest = false;
-
- while ( true ) {
- $titleText = $title->getPrefixedDBkey();
- if ( isset( $seenTitles[$titleText] ) ) {
- wfDebug( __METHOD__, "Circular redirect detected, aborting\n" );
- return false;
- }
- $seenTitles[$titleText] = true;
-
- $row = $dbw->selectRow(
- array( 'redirect', 'page' ),
- array( 'rd_namespace', 'rd_title' ),
- array(
- 'rd_from=page_id',
- 'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey()
- ), __METHOD__ );
- if ( !$row ) {
- # No redirect from here, chain terminates
- break;
- } else {
- $dest = $title = Title::makeTitle( $row->rd_namespace, $row->rd_title );
- }
- }
- return $dest;
- }
-
- /**
- * Get a user object for doing edits, from a request-lifetime cache
- * @return User
- */
- function getUser() {
- if ( !self::$user ) {
- self::$user = User::newFromName( wfMessage( 'double-redirect-fixer' )->inContentLanguage()->text(), false );
- # FIXME: newFromName could return false on a badly configured wiki.
- if ( !self::$user->isLoggedIn() ) {
- self::$user->addToDatabase();
- }
- }
- return self::$user;
- }
-}
-
diff --git a/includes/job/EmaillingJob.php b/includes/job/EmaillingJob.php
deleted file mode 100644
index d3599882..00000000
--- a/includes/job/EmaillingJob.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
- * Old job for notification emails.
- *
- * 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 JobQueue
- */
-
-/**
- * Old job used for sending single notification emails;
- * kept for backwards-compatibility
- *
- * @ingroup JobQueue
- */
-class EmaillingJob extends Job {
- function __construct( $title, $params, $id = 0 ) {
- parent::__construct( 'sendMail', Title::newMainPage(), $params, $id );
- }
-
- function run() {
- UserMailer::send(
- $this->params['to'],
- $this->params['from'],
- $this->params['subj'],
- $this->params['body'],
- $this->params['replyto']
- );
- return true;
- }
-
-}
diff --git a/includes/job/EnotifNotifyJob.php b/includes/job/EnotifNotifyJob.php
deleted file mode 100644
index b4c925e9..00000000
--- a/includes/job/EnotifNotifyJob.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-/**
- * Job for notification emails.
- *
- * 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 JobQueue
- */
-
-/**
- * Job for email notification mails
- *
- * @ingroup JobQueue
- */
-class EnotifNotifyJob extends Job {
-
- function __construct( $title, $params, $id = 0 ) {
- parent::__construct( 'enotifNotify', $title, $params, $id );
- }
-
- function run() {
- $enotif = new EmailNotification();
- // Get the user from ID (rename safe). Anons are 0, so defer to name.
- if( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
- $editor = User::newFromId( $this->params['editorID'] );
- // B/C, only the name might be given.
- } else {
- # FIXME: newFromName could return false on a badly configured wiki.
- $editor = User::newFromName( $this->params['editor'], false );
- }
- $enotif->actuallyNotifyOnPageChange(
- $editor,
- $this->title,
- $this->params['timestamp'],
- $this->params['summary'],
- $this->params['minorEdit'],
- $this->params['oldid'],
- $this->params['watchers']
- );
- return true;
- }
-
-}
diff --git a/includes/job/Job.php b/includes/job/Job.php
index d777a5d4..bcf582e7 100644
--- a/includes/job/Job.php
+++ b/includes/job/Job.php
@@ -23,11 +23,11 @@
/**
* Class to both describe a background job and handle jobs.
+ * The queue aspects of this class are now deprecated.
*
* @ingroup JobQueue
*/
abstract class Job {
-
/**
* @var Title
*/
@@ -39,6 +39,9 @@ abstract class Job {
$removeDuplicates,
$error;
+ /** @var Array Additional queue metadata */
+ public $metadata = array();
+
/*-------------------------------------------------------------------------
* Abstract functions
*------------------------------------------------------------------------*/
@@ -47,176 +50,23 @@ abstract class Job {
* Run the job
* @return boolean success
*/
- abstract function run();
+ abstract public function run();
/*-------------------------------------------------------------------------
* Static functions
*------------------------------------------------------------------------*/
/**
- * Pop a job of a certain type. This tries less hard than pop() to
- * actually find a job; it may be adversely affected by concurrent job
- * runners.
- *
- * @param $type string
- *
- * @return Job
- */
- static function pop_type( $type ) {
- wfProfilein( __METHOD__ );
-
- $dbw = wfGetDB( DB_MASTER );
-
- $dbw->begin( __METHOD__ );
-
- $row = $dbw->selectRow(
- 'job',
- '*',
- array( 'job_cmd' => $type ),
- __METHOD__,
- array( 'LIMIT' => 1, 'FOR UPDATE' )
- );
-
- if ( $row === false ) {
- $dbw->commit( __METHOD__ );
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- /* Ensure we "own" this row */
- $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
- $affected = $dbw->affectedRows();
- $dbw->commit( __METHOD__ );
-
- if ( $affected == 0 ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- wfIncrStats( 'job-pop' );
- $namespace = $row->job_namespace;
- $dbkey = $row->job_title;
- $title = Title::makeTitleSafe( $namespace, $dbkey );
- $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ),
- $row->job_id );
-
- $job->removeDuplicates();
-
- wfProfileOut( __METHOD__ );
- return $job;
- }
-
- /**
- * Pop a job off the front of the queue
- *
- * @param $offset Integer: Number of jobs to skip
- * @return Job or false if there's no jobs
- */
- static function pop( $offset = 0 ) {
- wfProfileIn( __METHOD__ );
-
- $dbr = wfGetDB( DB_SLAVE );
-
- /* Get a job from the slave, start with an offset,
- scan full set afterwards, avoid hitting purged rows
-
- NB: If random fetch previously was used, offset
- will always be ahead of few entries
- */
-
- $conditions = self::defaultQueueConditions();
-
- $offset = intval( $offset );
- $options = array( 'ORDER BY' => 'job_id', 'USE INDEX' => 'PRIMARY' );
-
- $row = $dbr->selectRow( 'job', '*',
- array_merge( $conditions, array( "job_id >= $offset" ) ),
- __METHOD__,
- $options
- );
-
- // Refetching without offset is needed as some of job IDs could have had delayed commits
- // and have lower IDs than jobs already executed, blame concurrency :)
- //
- if ( $row === false ) {
- if ( $offset != 0 ) {
- $row = $dbr->selectRow( 'job', '*', $conditions, __METHOD__, $options );
- }
-
- if ( $row === false ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
- }
-
- // Try to delete it from the master
- $dbw = wfGetDB( DB_MASTER );
- $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
- $affected = $dbw->affectedRows();
-
- if ( !$affected ) {
- // Failed, someone else beat us to it
- // Try getting a random row
- $row = $dbw->selectRow( 'job', array( 'minjob' => 'MIN(job_id)',
- 'maxjob' => 'MAX(job_id)' ), '1=1', __METHOD__ );
- if ( $row === false || is_null( $row->minjob ) || is_null( $row->maxjob ) ) {
- // No jobs to get
- wfProfileOut( __METHOD__ );
- return false;
- }
- // Get the random row
- $row = $dbw->selectRow( 'job', '*',
- 'job_id >= ' . mt_rand( $row->minjob, $row->maxjob ), __METHOD__ );
- if ( $row === false ) {
- // Random job gone before we got the chance to select it
- // Give up
- wfProfileOut( __METHOD__ );
- return false;
- }
- // Delete the random row
- $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
- $affected = $dbw->affectedRows();
-
- if ( !$affected ) {
- // Random job gone before we exclusively deleted it
- // Give up
- wfProfileOut( __METHOD__ );
- return false;
- }
- }
-
- // If execution got to here, there's a row in $row that has been deleted from the database
- // by this thread. Hence the concurrent pop was successful.
- wfIncrStats( 'job-pop' );
- $namespace = $row->job_namespace;
- $dbkey = $row->job_title;
- $title = Title::makeTitleSafe( $namespace, $dbkey );
-
- if ( is_null( $title ) ) {
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ), $row->job_id );
-
- // Remove any duplicates it may have later in the queue
- $job->removeDuplicates();
-
- wfProfileOut( __METHOD__ );
- return $job;
- }
-
- /**
* Create the appropriate object to handle a specific job
*
- * @param $command String: Job command
+ * @param string $command Job command
* @param $title Title: Associated title
- * @param $params Array|bool: Job parameters
- * @param $id Int: Job identifier
+ * @param array|bool $params Job parameters
+ * @param int $id Job identifier
* @throws MWException
* @return Job
*/
- static function factory( $command, Title $title, $params = false, $id = 0 ) {
+ public static function factory( $command, Title $title, $params = false, $id = 0 ) {
global $wgJobClasses;
if( isset( $wgJobClasses[$command] ) ) {
$class = $wgJobClasses[$command];
@@ -226,64 +76,18 @@ abstract class Job {
}
/**
- * @param $params
- * @return string
- */
- static function makeBlob( $params ) {
- if ( $params !== false ) {
- return serialize( $params );
- } else {
- return '';
- }
- }
-
- /**
- * @param $blob
- * @return bool|mixed
- */
- static function extractBlob( $blob ) {
- if ( (string)$blob !== '' ) {
- return unserialize( $blob );
- } else {
- return false;
- }
- }
-
- /**
* Batch-insert a group of jobs into the queue.
* This will be wrapped in a transaction with a forced commit.
*
* This may add duplicate at insert time, but they will be
* removed later on, when the first one is popped.
*
- * @param $jobs array of Job objects
+ * @param array $jobs of Job objects
+ * @return bool
+ * @deprecated 1.21
*/
- static function batchInsert( $jobs ) {
- if ( !count( $jobs ) ) {
- return;
- }
- $dbw = wfGetDB( DB_MASTER );
- $rows = array();
-
- /**
- * @var $job Job
- */
- foreach ( $jobs as $job ) {
- $rows[] = $job->insertFields();
- if ( count( $rows ) >= 50 ) {
- # Do a small transaction to avoid slave lag
- $dbw->begin( __METHOD__ );
- $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
- $dbw->commit( __METHOD__ );
- $rows = array();
- }
- }
- if ( $rows ) { // last chunk
- $dbw->begin( __METHOD__ );
- $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
- $dbw->commit( __METHOD__ );
- }
- wfIncrStats( 'job-insert', count( $jobs ) );
+ public static function batchInsert( $jobs ) {
+ return JobQueueGroup::singleton()->push( $jobs );
}
/**
@@ -293,46 +97,36 @@ abstract class Job {
* be rolled-back as part of a larger transaction. However,
* large batches of jobs can cause slave lag.
*
- * @param $jobs array of Job objects
+ * @param array $jobs of Job objects
+ * @return bool
+ * @deprecated 1.21
*/
- static function safeBatchInsert( $jobs ) {
- if ( !count( $jobs ) ) {
- return;
- }
- $dbw = wfGetDB( DB_MASTER );
- $rows = array();
- foreach ( $jobs as $job ) {
- $rows[] = $job->insertFields();
- if ( count( $rows ) >= 500 ) {
- $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
- $rows = array();
- }
- }
- if ( $rows ) { // last chunk
- $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
- }
- wfIncrStats( 'job-insert', count( $jobs ) );
+ public static function safeBatchInsert( $jobs ) {
+ return JobQueueGroup::singleton()->push( $jobs, JobQueue::QoS_Atomic );
}
-
/**
- * SQL conditions to apply on most JobQueue queries
+ * Pop a job of a certain type. This tries less hard than pop() to
+ * actually find a job; it may be adversely affected by concurrent job
+ * runners.
*
- * Whenever we exclude jobs types from the default queue, we want to make
- * sure that queries to the job queue actually ignore them.
+ * @param $type string
+ * @return Job|bool Returns false if there are no jobs
+ * @deprecated 1.21
+ */
+ public static function pop_type( $type ) {
+ return JobQueueGroup::singleton()->get( $type )->pop();
+ }
+
+ /**
+ * Pop a job off the front of the queue.
+ * This is subject to $wgJobTypesExcludedFromDefaultQueue.
*
- * @return array SQL conditions suitable for Database:: methods
+ * @return Job or false if there's no jobs
+ * @deprecated 1.21
*/
- static function defaultQueueConditions( ) {
- global $wgJobTypesExcludedFromDefaultQueue;
- $conditions = array();
- if ( count( $wgJobTypesExcludedFromDefaultQueue ) > 0 ) {
- $dbr = wfGetDB( DB_SLAVE );
- foreach ( $wgJobTypesExcludedFromDefaultQueue as $cmdType ) {
- $conditions[] = "job_cmd != " . $dbr->addQuotes( $cmdType );
- }
- }
- return $conditions;
+ public static function pop() {
+ return JobQueueGroup::singleton()->pop();
}
/*-------------------------------------------------------------------------
@@ -345,83 +139,131 @@ abstract class Job {
* @param $params array|bool
* @param $id int
*/
- function __construct( $command, $title, $params = false, $id = 0 ) {
+ public function __construct( $command, $title, $params = false, $id = 0 ) {
$this->command = $command;
$this->title = $title;
$this->params = $params;
$this->id = $id;
- // A bit of premature generalisation
- // Oh well, the whole class is premature generalisation really
- $this->removeDuplicates = true;
+ $this->removeDuplicates = false; // expensive jobs may set this to true
}
/**
- * Insert a single job into the queue.
- * @return bool true on success
+ * @return integer May be 0 for jobs stored outside the DB
*/
- function insert() {
- $fields = $this->insertFields();
+ public function getId() {
+ return $this->id;
+ }
- $dbw = wfGetDB( DB_MASTER );
+ /**
+ * @return string
+ */
+ public function getType() {
+ return $this->command;
+ }
- if ( $this->removeDuplicates ) {
- $res = $dbw->select( 'job', array( '1' ), $fields, __METHOD__ );
- if ( $dbw->numRows( $res ) ) {
- return true;
- }
- }
- wfIncrStats( 'job-insert' );
- return $dbw->insert( 'job', $fields, __METHOD__ );
+ /**
+ * @return Title
+ */
+ public function getTitle() {
+ return $this->title;
}
/**
* @return array
*/
- protected function insertFields() {
- $dbw = wfGetDB( DB_MASTER );
+ public function getParams() {
+ return $this->params;
+ }
+
+ /**
+ * @return bool Whether only one of each identical set of jobs should be run
+ */
+ public function ignoreDuplicates() {
+ return $this->removeDuplicates;
+ }
+
+ /**
+ * @return bool Whether this job can be retried on failure by job runners
+ */
+ public function allowRetries() {
+ return true;
+ }
+
+ /**
+ * Subclasses may need to override this to make duplication detection work
+ *
+ * @return Array Map of key/values
+ */
+ public function getDeduplicationInfo() {
+ $info = array(
+ 'type' => $this->getType(),
+ 'namespace' => $this->getTitle()->getNamespace(),
+ 'title' => $this->getTitle()->getDBkey(),
+ 'params' => $this->getParams()
+ );
+ // Identical jobs with different "root" jobs should count as duplicates
+ if ( is_array( $info['params'] ) ) {
+ unset( $info['params']['rootJobSignature'] );
+ unset( $info['params']['rootJobTimestamp'] );
+ }
+ return $info;
+ }
+
+ /**
+ * @param string $key A key that identifies the task
+ * @return Array
+ */
+ public static function newRootJobParams( $key ) {
return array(
- 'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
- 'job_cmd' => $this->command,
- 'job_namespace' => $this->title->getNamespace(),
- 'job_title' => $this->title->getDBkey(),
- 'job_timestamp' => $dbw->timestamp(),
- 'job_params' => Job::makeBlob( $this->params )
+ 'rootJobSignature' => sha1( $key ),
+ 'rootJobTimestamp' => wfTimestampNow()
);
}
/**
- * Remove jobs in the job queue which are duplicates of this job.
- * This is deadlock-prone and so starts its own transaction.
+ * @return Array
*/
- function removeDuplicates() {
- if ( !$this->removeDuplicates ) {
- return;
- }
+ public function getRootJobParams() {
+ return array(
+ 'rootJobSignature' => isset( $this->params['rootJobSignature'] )
+ ? $this->params['rootJobSignature']
+ : null,
+ 'rootJobTimestamp' => isset( $this->params['rootJobTimestamp'] )
+ ? $this->params['rootJobTimestamp']
+ : null
+ );
+ }
- $fields = $this->insertFields();
- unset( $fields['job_id'] );
- unset( $fields['job_timestamp'] );
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin( __METHOD__ );
- $dbw->delete( 'job', $fields, __METHOD__ );
- $affected = $dbw->affectedRows();
- $dbw->commit( __METHOD__ );
- if ( $affected ) {
- wfIncrStats( 'job-dup-delete', $affected );
- }
+ /**
+ * Insert a single job into the queue.
+ * @return bool true on success
+ * @deprecated 1.21
+ */
+ public function insert() {
+ return JobQueueGroup::singleton()->push( $this );
}
/**
* @return string
*/
- function toString() {
+ public function toString() {
$paramString = '';
if ( $this->params ) {
foreach ( $this->params as $key => $value ) {
if ( $paramString != '' ) {
$paramString .= ' ';
}
+ if ( is_array( $value ) ) {
+ $value = "array(" . count( $value ) . ")";
+ } elseif ( is_object( $value ) && !method_exists( $value, '__toString' ) ) {
+ $value = "object(" . get_class( $value ) . ")";
+ }
+ $value = (string)$value;
+ if ( mb_strlen( $value ) > 1024 ) {
+ $value = "string(" . mb_strlen( $value ) . ")";
+ }
+
$paramString .= "$key=$value";
}
}
@@ -441,7 +283,7 @@ abstract class Job {
$this->error = $error;
}
- function getLastError() {
+ public function getLastError() {
return $this->error;
}
}
diff --git a/includes/job/JobQueue.php b/includes/job/JobQueue.php
new file mode 100644
index 00000000..b0dd9258
--- /dev/null
+++ b/includes/job/JobQueue.php
@@ -0,0 +1,435 @@
+<?php
+/**
+ * Job queue base code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @defgroup JobQueue JobQueue
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle enqueueing and running of background jobs
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+abstract class JobQueue {
+ protected $wiki; // string; wiki ID
+ protected $type; // string; job type
+ protected $order; // string; job priority for pop()
+ protected $claimTTL; // integer; seconds
+ protected $maxTries; // integer; maximum number of times to try a job
+
+ const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions
+
+ /**
+ * @param $params array
+ */
+ protected function __construct( array $params ) {
+ $this->wiki = $params['wiki'];
+ $this->type = $params['type'];
+ $this->claimTTL = isset( $params['claimTTL'] ) ? $params['claimTTL'] : 0;
+ $this->maxTries = isset( $params['maxTries'] ) ? $params['maxTries'] : 3;
+ if ( isset( $params['order'] ) && $params['order'] !== 'any' ) {
+ $this->order = $params['order'];
+ } else {
+ $this->order = $this->optimalOrder();
+ }
+ if ( !in_array( $this->order, $this->supportedOrders() ) ) {
+ throw new MWException( __CLASS__ . " does not support '{$this->order}' order." );
+ }
+ }
+
+ /**
+ * Get a job queue object of the specified type.
+ * $params includes:
+ * - class : What job class to use (determines job type)
+ * - wiki : wiki ID of the wiki the jobs are for (defaults to current wiki)
+ * - type : The name of the job types this queue handles
+ * - order : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
+ * If "fifo" is used, the queue will effectively be FIFO. Note that
+ * job completion will not appear to be exactly FIFO if there are multiple
+ * job runners since jobs can take different times to finish once popped.
+ * If "timestamp" is used, the queue will at least be loosely ordered
+ * by timestamp, allowing for some jobs to be popped off out of order.
+ * If "random" is used, pop() will pick jobs in random order.
+ * Note that it may only be weakly random (e.g. a lottery of the oldest X).
+ * If "any" is choosen, the queue will use whatever order is the fastest.
+ * This might be useful for improving concurrency for job acquisition.
+ * - claimTTL : If supported, the queue will recycle jobs that have been popped
+ * but not acknowledged as completed after this many seconds. Recycling
+ * of jobs simple means re-inserting them into the queue. Jobs can be
+ * attempted up to three times before being discarded.
+ *
+ * Queue classes should throw an exception if they do not support the options given.
+ *
+ * @param $params array
+ * @return JobQueue
+ * @throws MWException
+ */
+ final public static function factory( array $params ) {
+ $class = $params['class'];
+ if ( !MWInit::classExists( $class ) ) {
+ throw new MWException( "Invalid job queue class '$class'." );
+ }
+ $obj = new $class( $params );
+ if ( !( $obj instanceof self ) ) {
+ throw new MWException( "Class '$class' is not a " . __CLASS__ . " class." );
+ }
+ return $obj;
+ }
+
+ /**
+ * @return string Wiki ID
+ */
+ final public function getWiki() {
+ return $this->wiki;
+ }
+
+ /**
+ * @return string Job type that this queue handles
+ */
+ final public function getType() {
+ return $this->type;
+ }
+
+ /**
+ * @return string One of (random, timestamp, fifo)
+ */
+ final public function getOrder() {
+ return $this->order;
+ }
+
+ /**
+ * @return Array Subset of (random, timestamp, fifo)
+ */
+ abstract protected function supportedOrders();
+
+ /**
+ * @return string One of (random, timestamp, fifo)
+ */
+ abstract protected function optimalOrder();
+
+ /**
+ * Quickly check if the queue is empty (has no available jobs).
+ * Queue classes should use caching if they are any slower without memcached.
+ *
+ * If caching is used, this might return false when there are actually no jobs.
+ * If pop() is called and returns false then it should correct the cache. Also,
+ * calling flushCaches() first prevents this. However, this affect is typically
+ * not distinguishable from the race condition between isEmpty() and pop().
+ *
+ * @return bool
+ * @throws MWException
+ */
+ final public function isEmpty() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doIsEmpty();
+ wfProfileOut( __METHOD__ );
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::isEmpty()
+ * @return bool
+ */
+ abstract protected function doIsEmpty();
+
+ /**
+ * Get the number of available (unacquired) jobs in the queue.
+ * Queue classes should use caching if they are any slower without memcached.
+ *
+ * If caching is used, this number might be out of date for a minute.
+ *
+ * @return integer
+ * @throws MWException
+ */
+ final public function getSize() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doGetSize();
+ wfProfileOut( __METHOD__ );
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::getSize()
+ * @return integer
+ */
+ abstract protected function doGetSize();
+
+ /**
+ * Get the number of acquired jobs (these are temporarily out of the queue).
+ * Queue classes should use caching if they are any slower without memcached.
+ *
+ * If caching is used, this number might be out of date for a minute.
+ *
+ * @return integer
+ * @throws MWException
+ */
+ final public function getAcquiredCount() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doGetAcquiredCount();
+ wfProfileOut( __METHOD__ );
+ return $res;
+ }
+
+ /**
+ * @see JobQueue::getAcquiredCount()
+ * @return integer
+ */
+ abstract protected function doGetAcquiredCount();
+
+ /**
+ * Push a single jobs into the queue.
+ * This does not require $wgJobClasses to be set for the given job type.
+ * Outside callers should use JobQueueGroup::push() instead of this function.
+ *
+ * @param $jobs Job|Array
+ * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+ * @return bool Returns false on failure
+ * @throws MWException
+ */
+ final public function push( $jobs, $flags = 0 ) {
+ return $this->batchPush( is_array( $jobs ) ? $jobs : array( $jobs ), $flags );
+ }
+
+ /**
+ * Push a batch of jobs into the queue.
+ * This does not require $wgJobClasses to be set for the given job type.
+ * Outside callers should use JobQueueGroup::push() instead of this function.
+ *
+ * @param array $jobs List of Jobs
+ * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+ * @return bool Returns false on failure
+ * @throws MWException
+ */
+ final public function batchPush( array $jobs, $flags = 0 ) {
+ if ( !count( $jobs ) ) {
+ return true; // nothing to do
+ }
+
+ foreach ( $jobs as $job ) {
+ if ( $job->getType() !== $this->type ) {
+ throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+ }
+ }
+
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doBatchPush( $jobs, $flags );
+ wfProfileOut( __METHOD__ );
+ return $ok;
+ }
+
+ /**
+ * @see JobQueue::batchPush()
+ * @return bool
+ */
+ abstract protected function doBatchPush( array $jobs, $flags );
+
+ /**
+ * Pop a job off of the queue.
+ * This requires $wgJobClasses to be set for the given job type.
+ * Outside callers should use JobQueueGroup::pop() instead of this function.
+ *
+ * @return Job|bool Returns false if there are no jobs
+ * @throws MWException
+ */
+ final public function pop() {
+ global $wgJobClasses;
+
+ if ( $this->wiki !== wfWikiID() ) {
+ throw new MWException( "Cannot pop '{$this->type}' job off foreign wiki queue." );
+ } elseif ( !isset( $wgJobClasses[$this->type] ) ) {
+ // Do not pop jobs if there is no class for the queue type
+ throw new MWException( "Unrecognized job type '{$this->type}'." );
+ }
+
+ wfProfileIn( __METHOD__ );
+ $job = $this->doPop();
+ wfProfileOut( __METHOD__ );
+ return $job;
+ }
+
+ /**
+ * @see JobQueue::pop()
+ * @return Job
+ */
+ abstract protected function doPop();
+
+ /**
+ * Acknowledge that a job was completed.
+ *
+ * This does nothing for certain queue classes or if "claimTTL" is not set.
+ * Outside callers should use JobQueueGroup::ack() instead of this function.
+ *
+ * @param $job Job
+ * @return bool
+ * @throws MWException
+ */
+ final public function ack( Job $job ) {
+ if ( $job->getType() !== $this->type ) {
+ throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+ }
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doAck( $job );
+ wfProfileOut( __METHOD__ );
+ return $ok;
+ }
+
+ /**
+ * @see JobQueue::ack()
+ * @return bool
+ */
+ abstract protected function doAck( Job $job );
+
+ /**
+ * Register the "root job" of a given job into the queue for de-duplication.
+ * This should only be called right *after* all the new jobs have been inserted.
+ * This is used to turn older, duplicate, job entries into no-ops. The root job
+ * information will remain in the registry until it simply falls out of cache.
+ *
+ * This requires that $job has two special fields in the "params" array:
+ * - rootJobSignature : hash (e.g. SHA1) that identifies the task
+ * - rootJobTimestamp : TS_MW timestamp of this instance of the task
+ *
+ * A "root job" is a conceptual job that consist of potentially many smaller jobs
+ * that are actually inserted into the queue. For example, "refreshLinks" jobs are
+ * spawned when a template is edited. One can think of the task as "update links
+ * of pages that use template X" and an instance of that task as a "root job".
+ * However, what actually goes into the queue are potentially many refreshLinks2 jobs.
+ * Since these jobs include things like page ID ranges and DB master positions, and morph
+ * into smaller refreshLinks2 jobs recursively, simple duplicate detection (like job_sha1)
+ * for individual jobs being identical is not useful.
+ *
+ * In the case of "refreshLinks", if these jobs are still in the queue when the template
+ * is edited again, we want all of these old refreshLinks jobs for that template to become
+ * no-ops. This can greatly reduce server load, since refreshLinks jobs involves parsing.
+ * Essentially, the new batch of jobs belong to a new "root job" and the older ones to a
+ * previous "root job" for the same task of "update links of pages that use template X".
+ *
+ * This does nothing for certain queue classes.
+ *
+ * @param $job Job
+ * @return bool
+ * @throws MWException
+ */
+ final public function deduplicateRootJob( Job $job ) {
+ if ( $job->getType() !== $this->type ) {
+ throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+ }
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doDeduplicateRootJob( $job );
+ wfProfileOut( __METHOD__ );
+ return $ok;
+ }
+
+ /**
+ * @see JobQueue::deduplicateRootJob()
+ * @param $job Job
+ * @return bool
+ */
+ protected function doDeduplicateRootJob( Job $job ) {
+ return true;
+ }
+
+ /**
+ * Wait for any slaves or backup servers to catch up.
+ *
+ * This does nothing for certain queue classes.
+ *
+ * @return void
+ * @throws MWException
+ */
+ final public function waitForBackups() {
+ wfProfileIn( __METHOD__ );
+ $this->doWaitForBackups();
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * @see JobQueue::waitForBackups()
+ * @return void
+ */
+ protected function doWaitForBackups() {}
+
+ /**
+ * Return a map of task names to task definition maps.
+ * A "task" is a fast periodic queue maintenance action.
+ * Mutually exclusive tasks must implement their own locking in the callback.
+ *
+ * Each task value is an associative array with:
+ * - name : the name of the task
+ * - callback : a PHP callable that performs the task
+ * - period : the period in seconds corresponding to the task frequency
+ *
+ * @return Array
+ */
+ final public function getPeriodicTasks() {
+ $tasks = $this->doGetPeriodicTasks();
+ foreach ( $tasks as $name => &$def ) {
+ $def['name'] = $name;
+ }
+ return $tasks;
+ }
+
+ /**
+ * @see JobQueue::getPeriodicTasks()
+ * @return Array
+ */
+ protected function doGetPeriodicTasks() {
+ return array();
+ }
+
+ /**
+ * Clear any process and persistent caches
+ *
+ * @return void
+ */
+ final public function flushCaches() {
+ wfProfileIn( __METHOD__ );
+ $this->doFlushCaches();
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * @see JobQueue::flushCaches()
+ * @return void
+ */
+ protected function doFlushCaches() {}
+
+ /**
+ * Get an iterator to traverse over all of the jobs in this queue.
+ * This does not include jobs that are current acquired. In general,
+ * this should only be called on a queue that is no longer being popped.
+ *
+ * @return Iterator|Traversable|Array
+ * @throws MWException
+ */
+ abstract public function getAllQueuedJobs();
+
+ /**
+ * Namespace the queue with a key to isolate it for testing
+ *
+ * @param $key string
+ * @return void
+ * @throws MWException
+ */
+ public function setTestingPrefix( $key ) {
+ throw new MWException( "Queue namespacing not supported for this queue type." );
+ }
+}
diff --git a/includes/job/JobQueueAggregator.php b/includes/job/JobQueueAggregator.php
new file mode 100644
index 00000000..3dba3c53
--- /dev/null
+++ b/includes/job/JobQueueAggregator.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * Job queue aggregator code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+abstract class JobQueueAggregator {
+ /** @var JobQueueAggregator */
+ protected static $instance = null;
+
+ /**
+ * @param array $params
+ */
+ protected function __construct( array $params ) {}
+
+ /**
+ * @return JobQueueAggregator
+ */
+ final public static function singleton() {
+ global $wgJobQueueAggregator;
+
+ if ( !isset( self::$instance ) ) {
+ $class = $wgJobQueueAggregator['class'];
+ $obj = new $class( $wgJobQueueAggregator );
+ if ( !( $obj instanceof JobQueueAggregator ) ) {
+ throw new MWException( "Class '$class' is not a JobQueueAggregator class." );
+ }
+ self::$instance = $obj;
+ }
+
+ return self::$instance;
+ }
+
+ /**
+ * Destroy the singleton instance
+ *
+ * @return void
+ */
+ final public static function destroySingleton() {
+ self::$instance = null;
+ }
+
+ /**
+ * Mark a queue as being empty
+ *
+ * @param string $wiki
+ * @param string $type
+ * @return bool Success
+ */
+ final public function notifyQueueEmpty( $wiki, $type ) {
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doNotifyQueueEmpty( $wiki, $type );
+ wfProfileOut( __METHOD__ );
+ return $ok;
+ }
+
+ /**
+ * @see JobQueueAggregator::notifyQueueEmpty()
+ */
+ abstract protected function doNotifyQueueEmpty( $wiki, $type );
+
+ /**
+ * Mark a queue as being non-empty
+ *
+ * @param string $wiki
+ * @param string $type
+ * @return bool Success
+ */
+ final public function notifyQueueNonEmpty( $wiki, $type ) {
+ wfProfileIn( __METHOD__ );
+ $ok = $this->doNotifyQueueNonEmpty( $wiki, $type );
+ wfProfileOut( __METHOD__ );
+ return $ok;
+ }
+
+ /**
+ * @see JobQueueAggregator::notifyQueueNonEmpty()
+ */
+ abstract protected function doNotifyQueueNonEmpty( $wiki, $type );
+
+ /**
+ * Get the list of all of the queues with jobs
+ *
+ * @return Array (job type => (list of wiki IDs))
+ */
+ final public function getAllReadyWikiQueues() {
+ wfProfileIn( __METHOD__ );
+ $res = $this->doGetAllReadyWikiQueues();
+ wfProfileOut( __METHOD__ );
+ return $res;
+ }
+
+ /**
+ * @see JobQueueAggregator::getAllReadyWikiQueues()
+ */
+ abstract protected function doGetAllReadyWikiQueues();
+
+ /**
+ * Get all databases that have a pending job.
+ * This poll all the queues and is this expensive.
+ *
+ * @return Array (job type => (list of wiki IDs))
+ */
+ protected function findPendingWikiQueues() {
+ global $wgLocalDatabases;
+
+ $pendingDBs = array(); // (job type => (db list))
+ foreach ( $wgLocalDatabases as $db ) {
+ foreach ( JobQueueGroup::singleton( $db )->getQueuesWithJobs() as $type ) {
+ $pendingDBs[$type][] = $db;
+ }
+ }
+
+ return $pendingDBs;
+ }
+}
diff --git a/includes/job/JobQueueAggregatorMemc.php b/includes/job/JobQueueAggregatorMemc.php
new file mode 100644
index 00000000..4b82cf92
--- /dev/null
+++ b/includes/job/JobQueueAggregatorMemc.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Job queue aggregator code that uses BagOStuff.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues using BagOStuff
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueAggregatorMemc extends JobQueueAggregator {
+ /** @var BagOStuff */
+ protected $cache;
+
+ protected $cacheTTL; // integer; seconds
+
+ /**
+ * @params include:
+ * - objectCache : Name of an object cache registered in $wgObjectCaches.
+ * This defaults to the one specified by $wgMainCacheType.
+ * - cacheTTL : Seconds to cache the aggregate data before regenerating.
+ * @param array $params
+ */
+ protected function __construct( array $params ) {
+ parent::__construct( $params );
+ $this->cache = isset( $params['objectCache'] )
+ ? wfGetCache( $params['objectCache'] )
+ : wfGetMainCache();
+ $this->cacheTTL = isset( $params['cacheTTL'] ) ? $params['cacheTTL'] : 180; // 3 min
+ }
+
+ /**
+ * @see JobQueueAggregator::doNotifyQueueEmpty()
+ */
+ protected function doNotifyQueueEmpty( $wiki, $type ) {
+ $key = $this->getReadyQueueCacheKey();
+ // Delist the queue from the "ready queue" list
+ if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
+ $curInfo = $this->cache->get( $key );
+ if ( is_array( $curInfo ) && isset( $curInfo['pendingDBs'][$type] ) ) {
+ if ( in_array( $wiki, $curInfo['pendingDBs'][$type] ) ) {
+ $curInfo['pendingDBs'][$type] = array_diff(
+ $curInfo['pendingDBs'][$type], array( $wiki ) );
+ $this->cache->set( $key, $curInfo );
+ }
+ }
+ $this->cache->delete( "$key:lock" ); // unlock
+ }
+ return true;
+ }
+
+ /**
+ * @see JobQueueAggregator::doNotifyQueueNonEmpty()
+ */
+ protected function doNotifyQueueNonEmpty( $wiki, $type ) {
+ return true; // updated periodically
+ }
+
+ /**
+ * @see JobQueueAggregator::doAllGetReadyWikiQueues()
+ */
+ protected function doGetAllReadyWikiQueues() {
+ $key = $this->getReadyQueueCacheKey();
+ // If the cache entry wasn't present, is stale, or in .1% of cases otherwise,
+ // regenerate the cache. Use any available stale cache if another process is
+ // currently regenerating the pending DB information.
+ $pendingDbInfo = $this->cache->get( $key );
+ if ( !is_array( $pendingDbInfo )
+ || ( time() - $pendingDbInfo['timestamp'] ) > $this->cacheTTL
+ || mt_rand( 0, 999 ) == 0
+ ) {
+ if ( $this->cache->add( "$key:rebuild", 1, 1800 ) ) { // lock
+ $pendingDbInfo = array(
+ 'pendingDBs' => $this->findPendingWikiQueues(),
+ 'timestamp' => time()
+ );
+ for ( $attempts=1; $attempts <= 25; ++$attempts ) {
+ if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
+ $this->cache->set( $key, $pendingDbInfo );
+ $this->cache->delete( "$key:lock" ); // unlock
+ break;
+ }
+ }
+ $this->cache->delete( "$key:rebuild" ); // unlock
+ }
+ }
+ return is_array( $pendingDbInfo )
+ ? $pendingDbInfo['pendingDBs']
+ : array(); // cache is both empty and locked
+ }
+
+ /**
+ * @return string
+ */
+ private function getReadyQueueCacheKey() {
+ return "jobqueue:aggregator:ready-queues:v1"; // global
+ }
+}
diff --git a/includes/job/JobQueueAggregatorRedis.php b/includes/job/JobQueueAggregatorRedis.php
new file mode 100644
index 00000000..74e9171c
--- /dev/null
+++ b/includes/job/JobQueueAggregatorRedis.php
@@ -0,0 +1,165 @@
+<?php
+/**
+ * Job queue aggregator code that uses PhpRedis.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues using PhpRedis
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueAggregatorRedis extends JobQueueAggregator {
+ /** @var RedisConnectionPool */
+ protected $redisPool;
+
+ /**
+ * @params include:
+ * - redisConfig : An array of parameters to RedisConnectionPool::__construct().
+ * - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
+ * If a hostname is specified but no port, the standard port number
+ * 6379 will be used. Required.
+ * @param array $params
+ */
+ protected function __construct( array $params ) {
+ parent::__construct( $params );
+ $this->server = $params['redisServer'];
+ $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
+ }
+
+ /**
+ * @see JobQueueAggregator::doNotifyQueueEmpty()
+ */
+ protected function doNotifyQueueEmpty( $wiki, $type ) {
+ $conn = $this->getConnection();
+ if ( !$conn ) {
+ return false;
+ }
+ try {
+ $conn->hDel( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ) );
+ return true;
+ } catch ( RedisException $e ) {
+ $this->handleException( $conn, $e );
+ return false;
+ }
+ }
+
+ /**
+ * @see JobQueueAggregator::doNotifyQueueNonEmpty()
+ */
+ protected function doNotifyQueueNonEmpty( $wiki, $type ) {
+ $conn = $this->getConnection();
+ if ( !$conn ) {
+ return false;
+ }
+ try {
+ $conn->hSet( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ), time() );
+ return true;
+ } catch ( RedisException $e ) {
+ $this->handleException( $conn, $e );
+ return false;
+ }
+ }
+
+ /**
+ * @see JobQueueAggregator::doAllGetReadyWikiQueues()
+ */
+ protected function doGetAllReadyWikiQueues() {
+ $conn = $this->getConnection();
+ if ( !$conn ) {
+ return array();
+ }
+ try {
+ $conn->multi( Redis::PIPELINE );
+ $conn->exists( $this->getReadyQueueKey() );
+ $conn->hGetAll( $this->getReadyQueueKey() );
+ list( $exists, $map ) = $conn->exec();
+
+ if ( $exists ) { // cache hit
+ $pendingDBs = array(); // (type => list of wikis)
+ foreach ( $map as $key => $time ) {
+ list( $type, $wiki ) = $this->dencQueueName( $key );
+ $pendingDBs[$type][] = $wiki;
+ }
+ } else { // cache miss
+ $pendingDBs = $this->findPendingWikiQueues(); // (type => list of wikis)
+
+ $now = time();
+ $map = array();
+ foreach ( $pendingDBs as $type => $wikis ) {
+ foreach ( $wikis as $wiki ) {
+ $map[$this->encQueueName( $type, $wiki )] = $now;
+ }
+ }
+ $conn->hMSet( $this->getReadyQueueKey(), $map );
+ }
+
+ return $pendingDBs;
+ } catch ( RedisException $e ) {
+ $this->handleException( $conn, $e );
+ return array();
+ }
+ }
+
+ /**
+ * Get a connection to the server that handles all sub-queues for this queue
+ *
+ * @return Array (server name, Redis instance)
+ * @throws MWException
+ */
+ protected function getConnection() {
+ return $this->redisPool->getConnection( $this->server );
+ }
+
+ /**
+ * @param RedisConnRef $conn
+ * @param RedisException $e
+ * @return void
+ */
+ protected function handleException( RedisConnRef $conn, $e ) {
+ $this->redisPool->handleException( $this->server, $conn, $e );
+ }
+
+ /**
+ * @return string
+ */
+ private function getReadyQueueKey() {
+ return "jobqueue:aggregator:h-ready-queues:v1"; // global
+ }
+
+ /**
+ * @param string $type
+ * @param string $wiki
+ * @return string
+ */
+ private function encQueueName( $type, $wiki ) {
+ return rawurlencode( $type ) . '/' . rawurlencode( $wiki );
+ }
+
+ /**
+ * @param string $name
+ * @return string
+ */
+ private function dencQueueName( $name ) {
+ list( $type, $wiki ) = explode( '/', $name, 2 );
+ return array( rawurldecode( $type ), rawurldecode( $wiki ) );
+ }
+}
diff --git a/includes/job/JobQueueDB.php b/includes/job/JobQueueDB.php
new file mode 100644
index 00000000..ff7f7abc
--- /dev/null
+++ b/includes/job/JobQueueDB.php
@@ -0,0 +1,716 @@
+<?php
+/**
+ * Database-backed job queue code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle job queues stored in the DB
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueDB extends JobQueue {
+ const ROOTJOB_TTL = 1209600; // integer; seconds to remember root jobs (14 days)
+ const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
+ const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
+ const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed
+ const MAX_JOB_RANDOM = 2147483647; // integer; 2^31 - 1, used for job_random
+ const MAX_OFFSET = 255; // integer; maximum number of rows to skip
+
+ protected $cluster = false; // string; name of an external DB cluster
+
+ /**
+ * Additional parameters include:
+ * - cluster : The name of an external cluster registered via LBFactory.
+ * If not specified, the primary DB cluster for the wiki will be used.
+ * This can be overridden with a custom cluster so that DB handles will
+ * be retrieved via LBFactory::getExternalLB() and getConnection().
+ * @param $params array
+ */
+ protected function __construct( array $params ) {
+ parent::__construct( $params );
+ $this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : false;
+ }
+
+ protected function supportedOrders() {
+ return array( 'random', 'timestamp', 'fifo' );
+ }
+
+ protected function optimalOrder() {
+ return 'random';
+ }
+
+ /**
+ * @see JobQueue::doIsEmpty()
+ * @return bool
+ */
+ protected function doIsEmpty() {
+ global $wgMemc;
+
+ $key = $this->getCacheKey( 'empty' );
+
+ $isEmpty = $wgMemc->get( $key );
+ if ( $isEmpty === 'true' ) {
+ return true;
+ } elseif ( $isEmpty === 'false' ) {
+ return false;
+ }
+
+ list( $dbr, $scope ) = $this->getSlaveDB();
+ $found = $dbr->selectField( // unclaimed job
+ 'job', '1', array( 'job_cmd' => $this->type, 'job_token' => '' ), __METHOD__
+ );
+ $wgMemc->add( $key, $found ? 'false' : 'true', self::CACHE_TTL_LONG );
+
+ return !$found;
+ }
+
+ /**
+ * @see JobQueue::doGetSize()
+ * @return integer
+ */
+ protected function doGetSize() {
+ global $wgMemc;
+
+ $key = $this->getCacheKey( 'size' );
+
+ $size = $wgMemc->get( $key );
+ if ( is_int( $size ) ) {
+ return $size;
+ }
+
+ list( $dbr, $scope ) = $this->getSlaveDB();
+ $size = (int)$dbr->selectField( 'job', 'COUNT(*)',
+ array( 'job_cmd' => $this->type, 'job_token' => '' ),
+ __METHOD__
+ );
+ $wgMemc->set( $key, $size, self::CACHE_TTL_SHORT );
+
+ return $size;
+ }
+
+ /**
+ * @see JobQueue::doGetAcquiredCount()
+ * @return integer
+ */
+ protected function doGetAcquiredCount() {
+ global $wgMemc;
+
+ if ( $this->claimTTL <= 0 ) {
+ return 0; // no acknowledgements
+ }
+
+ $key = $this->getCacheKey( 'acquiredcount' );
+
+ $count = $wgMemc->get( $key );
+ if ( is_int( $count ) ) {
+ return $count;
+ }
+
+ list( $dbr, $scope ) = $this->getSlaveDB();
+ $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
+ array( 'job_cmd' => $this->type, "job_token != {$dbr->addQuotes( '' )}" ),
+ __METHOD__
+ );
+ $wgMemc->set( $key, $count, self::CACHE_TTL_SHORT );
+
+ return $count;
+ }
+
+ /**
+ * @see JobQueue::doBatchPush()
+ * @param array $jobs
+ * @param $flags
+ * @throws DBError|Exception
+ * @return bool
+ */
+ protected function doBatchPush( array $jobs, $flags ) {
+ if ( count( $jobs ) ) {
+ list( $dbw, $scope ) = $this->getMasterDB();
+
+ $rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
+ $rowList = array(); // list of jobs for jobs that are are not de-duplicated
+
+ foreach ( $jobs as $job ) {
+ $row = $this->insertFields( $job );
+ if ( $job->ignoreDuplicates() ) {
+ $rowSet[$row['job_sha1']] = $row;
+ } else {
+ $rowList[] = $row;
+ }
+ }
+
+ $key = $this->getCacheKey( 'empty' );
+ $atomic = ( $flags & self::QoS_Atomic );
+
+ $dbw->onTransactionIdle(
+ function() use ( $dbw, $rowSet, $rowList, $atomic, $key, $scope
+ ) {
+ global $wgMemc;
+
+ if ( $atomic ) {
+ $dbw->begin( __METHOD__ ); // wrap all the job additions in one transaction
+ }
+ try {
+ // Strip out any duplicate jobs that are already in the queue...
+ if ( count( $rowSet ) ) {
+ $res = $dbw->select( 'job', 'job_sha1',
+ array(
+ // No job_type condition since it's part of the job_sha1 hash
+ 'job_sha1' => array_keys( $rowSet ),
+ 'job_token' => '' // unclaimed
+ ),
+ __METHOD__
+ );
+ foreach ( $res as $row ) {
+ wfDebug( "Job with hash '{$row->job_sha1}' is a duplicate." );
+ unset( $rowSet[$row->job_sha1] ); // already enqueued
+ }
+ }
+ // Build the full list of job rows to insert
+ $rows = array_merge( $rowList, array_values( $rowSet ) );
+ // Insert the job rows in chunks to avoid slave lag...
+ foreach ( array_chunk( $rows, 50 ) as $rowBatch ) {
+ $dbw->insert( 'job', $rowBatch, __METHOD__ );
+ }
+ wfIncrStats( 'job-insert', count( $rows ) );
+ wfIncrStats( 'job-insert-duplicate',
+ count( $rowSet ) + count( $rowList ) - count( $rows ) );
+ } catch ( DBError $e ) {
+ if ( $atomic ) {
+ $dbw->rollback( __METHOD__ );
+ }
+ throw $e;
+ }
+ if ( $atomic ) {
+ $dbw->commit( __METHOD__ );
+ }
+
+ $wgMemc->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
+ } );
+ }
+
+ return true;
+ }
+
+ /**
+ * @see JobQueue::doPop()
+ * @return Job|bool
+ */
+ protected function doPop() {
+ global $wgMemc;
+
+ if ( $wgMemc->get( $this->getCacheKey( 'empty' ) ) === 'true' ) {
+ return false; // queue is empty
+ }
+
+ list( $dbw, $scope ) = $this->getMasterDB();
+ $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+ $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
+ $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+ $scopedReset = new ScopedCallback( function() use ( $dbw, $autoTrx ) {
+ $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
+ } );
+
+ $uuid = wfRandomString( 32 ); // pop attempt
+ $job = false; // job popped off
+ do { // retry when our row is invalid or deleted as a duplicate
+ // Try to reserve a row in the DB...
+ if ( in_array( $this->order, array( 'fifo', 'timestamp' ) ) ) {
+ $row = $this->claimOldest( $uuid );
+ } else { // random first
+ $rand = mt_rand( 0, self::MAX_JOB_RANDOM ); // encourage concurrent UPDATEs
+ $gte = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
+ $row = $this->claimRandom( $uuid, $rand, $gte );
+ }
+ // Check if we found a row to reserve...
+ if ( !$row ) {
+ $wgMemc->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
+ break; // nothing to do
+ }
+ wfIncrStats( 'job-pop' );
+ // Get the job object from the row...
+ $title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
+ if ( !$title ) {
+ $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
+ wfDebugLog( 'JobQueueDB', "Row has invalid title '{$row->job_title}'." );
+ continue; // try again
+ }
+ $job = Job::factory( $row->job_cmd, $title,
+ self::extractBlob( $row->job_params ), $row->job_id );
+ $job->id = $row->job_id; // XXX: work around broken subclasses
+ // Flag this job as an old duplicate based on its "root" job...
+ if ( $this->isRootJobOldDuplicate( $job ) ) {
+ wfIncrStats( 'job-pop-duplicate' );
+ $job = DuplicateJob::newFromJob( $job ); // convert to a no-op
+ }
+ break; // done
+ } while( true );
+
+ return $job;
+ }
+
+ /**
+ * Reserve a row with a single UPDATE without holding row locks over RTTs...
+ *
+ * @param string $uuid 32 char hex string
+ * @param $rand integer Random unsigned integer (31 bits)
+ * @param bool $gte Search for job_random >= $random (otherwise job_random <= $random)
+ * @return Row|false
+ */
+ protected function claimRandom( $uuid, $rand, $gte ) {
+ global $wgMemc;
+
+ list( $dbw, $scope ) = $this->getMasterDB();
+ // Check cache to see if the queue has <= OFFSET items
+ $tinyQueue = $wgMemc->get( $this->getCacheKey( 'small' ) );
+
+ $row = false; // the row acquired
+ $invertedDirection = false; // whether one job_random direction was already scanned
+ // This uses a replication safe method for acquiring jobs. One could use UPDATE+LIMIT
+ // instead, but that either uses ORDER BY (in which case it deadlocks in MySQL) or is
+ // not replication safe. Due to http://bugs.mysql.com/bug.php?id=6980, subqueries cannot
+ // be used here with MySQL.
+ do {
+ if ( $tinyQueue ) { // queue has <= MAX_OFFSET rows
+ // For small queues, using OFFSET will overshoot and return no rows more often.
+ // Instead, this uses job_random to pick a row (possibly checking both directions).
+ $ineq = $gte ? '>=' : '<=';
+ $dir = $gte ? 'ASC' : 'DESC';
+ $row = $dbw->selectRow( 'job', '*', // find a random job
+ array(
+ 'job_cmd' => $this->type,
+ 'job_token' => '', // unclaimed
+ "job_random {$ineq} {$dbw->addQuotes( $rand )}" ),
+ __METHOD__,
+ array( 'ORDER BY' => "job_random {$dir}" )
+ );
+ if ( !$row && !$invertedDirection ) {
+ $gte = !$gte;
+ $invertedDirection = true;
+ continue; // try the other direction
+ }
+ } else { // table *may* have >= MAX_OFFSET rows
+ // Bug 42614: "ORDER BY job_random" with a job_random inequality causes high CPU
+ // in MySQL if there are many rows for some reason. This uses a small OFFSET
+ // instead of job_random for reducing excess claim retries.
+ $row = $dbw->selectRow( 'job', '*', // find a random job
+ array(
+ 'job_cmd' => $this->type,
+ 'job_token' => '', // unclaimed
+ ),
+ __METHOD__,
+ array( 'OFFSET' => mt_rand( 0, self::MAX_OFFSET ) )
+ );
+ if ( !$row ) {
+ $tinyQueue = true; // we know the queue must have <= MAX_OFFSET rows
+ $wgMemc->set( $this->getCacheKey( 'small' ), 1, 30 );
+ continue; // use job_random
+ }
+ }
+ if ( $row ) { // claim the job
+ $dbw->update( 'job', // update by PK
+ array(
+ 'job_token' => $uuid,
+ 'job_token_timestamp' => $dbw->timestamp(),
+ 'job_attempts = job_attempts+1' ),
+ array( 'job_cmd' => $this->type, 'job_id' => $row->job_id, 'job_token' => '' ),
+ __METHOD__
+ );
+ // This might get raced out by another runner when claiming the previously
+ // selected row. The use of job_random should minimize this problem, however.
+ if ( !$dbw->affectedRows() ) {
+ $row = false; // raced out
+ }
+ } else {
+ break; // nothing to do
+ }
+ } while ( !$row );
+
+ return $row;
+ }
+
+ /**
+ * Reserve a row with a single UPDATE without holding row locks over RTTs...
+ *
+ * @param string $uuid 32 char hex string
+ * @return Row|false
+ */
+ protected function claimOldest( $uuid ) {
+ list( $dbw, $scope ) = $this->getMasterDB();
+
+ $row = false; // the row acquired
+ do {
+ if ( $dbw->getType() === 'mysql' ) {
+ // Per http://bugs.mysql.com/bug.php?id=6980, we can't use subqueries on the
+ // same table being changed in an UPDATE query in MySQL (gives Error: 1093).
+ // Oracle and Postgre have no such limitation. However, MySQL offers an
+ // alternative here by supporting ORDER BY + LIMIT for UPDATE queries.
+ $dbw->query( "UPDATE {$dbw->tableName( 'job' )} " .
+ "SET " .
+ "job_token = {$dbw->addQuotes( $uuid ) }, " .
+ "job_token_timestamp = {$dbw->addQuotes( $dbw->timestamp() )}, " .
+ "job_attempts = job_attempts+1 " .
+ "WHERE ( " .
+ "job_cmd = {$dbw->addQuotes( $this->type )} " .
+ "AND job_token = {$dbw->addQuotes( '' )} " .
+ ") ORDER BY job_id ASC LIMIT 1",
+ __METHOD__
+ );
+ } else {
+ // Use a subquery to find the job, within an UPDATE to claim it.
+ // This uses as much of the DB wrapper functions as possible.
+ $dbw->update( 'job',
+ array(
+ 'job_token' => $uuid,
+ 'job_token_timestamp' => $dbw->timestamp(),
+ 'job_attempts = job_attempts+1' ),
+ array( 'job_id = (' .
+ $dbw->selectSQLText( 'job', 'job_id',
+ array( 'job_cmd' => $this->type, 'job_token' => '' ),
+ __METHOD__,
+ array( 'ORDER BY' => 'job_id ASC', 'LIMIT' => 1 ) ) .
+ ')'
+ ),
+ __METHOD__
+ );
+ }
+ // Fetch any row that we just reserved...
+ if ( $dbw->affectedRows() ) {
+ $row = $dbw->selectRow( 'job', '*',
+ array( 'job_cmd' => $this->type, 'job_token' => $uuid ), __METHOD__
+ );
+ if ( !$row ) { // raced out by duplicate job removal
+ wfDebugLog( 'JobQueueDB', "Row deleted as duplicate by another process." );
+ }
+ } else {
+ break; // nothing to do
+ }
+ } while ( !$row );
+
+ return $row;
+ }
+
+ /**
+ * Recycle or destroy any jobs that have been claimed for too long
+ *
+ * @return integer Number of jobs recycled/deleted
+ */
+ public function recycleAndDeleteStaleJobs() {
+ global $wgMemc;
+
+ $now = time();
+ list( $dbw, $scope ) = $this->getMasterDB();
+ $count = 0; // affected rows
+
+ if ( !$dbw->lock( "jobqueue-recycle-{$this->type}", __METHOD__, 1 ) ) {
+ return $count; // already in progress
+ }
+
+ // Remove claims on jobs acquired for too long if enabled...
+ if ( $this->claimTTL > 0 ) {
+ $claimCutoff = $dbw->timestamp( $now - $this->claimTTL );
+ // Get the IDs of jobs that have be claimed but not finished after too long.
+ // These jobs can be recycled into the queue by expiring the claim. Selecting
+ // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
+ $res = $dbw->select( 'job', 'job_id',
+ array(
+ 'job_cmd' => $this->type,
+ "job_token != {$dbw->addQuotes( '' )}", // was acquired
+ "job_token_timestamp < {$dbw->addQuotes( $claimCutoff )}", // stale
+ "job_attempts < {$dbw->addQuotes( $this->maxTries )}" ), // retries left
+ __METHOD__
+ );
+ $ids = array_map( function( $o ) { return $o->job_id; }, iterator_to_array( $res ) );
+ if ( count( $ids ) ) {
+ // Reset job_token for these jobs so that other runners will pick them up.
+ // Set the timestamp to the current time, as it is useful to now that the job
+ // was already tried before (the timestamp becomes the "released" time).
+ $dbw->update( 'job',
+ array(
+ 'job_token' => '',
+ 'job_token_timestamp' => $dbw->timestamp( $now ) ), // time of release
+ array(
+ 'job_id' => $ids ),
+ __METHOD__
+ );
+ $count += $dbw->affectedRows();
+ wfIncrStats( 'job-recycle', $dbw->affectedRows() );
+ $wgMemc->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
+ }
+ }
+
+ // Just destroy any stale jobs...
+ $pruneCutoff = $dbw->timestamp( $now - self::MAX_AGE_PRUNE );
+ $conds = array(
+ 'job_cmd' => $this->type,
+ "job_token != {$dbw->addQuotes( '' )}", // was acquired
+ "job_token_timestamp < {$dbw->addQuotes( $pruneCutoff )}" // stale
+ );
+ if ( $this->claimTTL > 0 ) { // only prune jobs attempted too many times...
+ $conds[] = "job_attempts >= {$dbw->addQuotes( $this->maxTries )}";
+ }
+ // Get the IDs of jobs that are considered stale and should be removed. Selecting
+ // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
+ $res = $dbw->select( 'job', 'job_id', $conds, __METHOD__ );
+ $ids = array_map( function( $o ) { return $o->job_id; }, iterator_to_array( $res ) );
+ if ( count( $ids ) ) {
+ $dbw->delete( 'job', array( 'job_id' => $ids ), __METHOD__ );
+ $count += $dbw->affectedRows();
+ }
+
+ $dbw->unlock( "jobqueue-recycle-{$this->type}", __METHOD__ );
+
+ return $count;
+ }
+
+ /**
+ * @see JobQueue::doAck()
+ * @param Job $job
+ * @throws MWException
+ * @return Job|bool
+ */
+ protected function doAck( Job $job ) {
+ if ( !$job->getId() ) {
+ throw new MWException( "Job of type '{$job->getType()}' has no ID." );
+ }
+
+ list( $dbw, $scope ) = $this->getMasterDB();
+ $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+ $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
+ $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+ $scopedReset = new ScopedCallback( function() use ( $dbw, $autoTrx ) {
+ $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
+ } );
+
+ // Delete a row with a single DELETE without holding row locks over RTTs...
+ $dbw->delete( 'job',
+ array( 'job_cmd' => $this->type, 'job_id' => $job->getId() ), __METHOD__ );
+
+ return true;
+ }
+
+ /**
+ * @see JobQueue::doDeduplicateRootJob()
+ * @param Job $job
+ * @throws MWException
+ * @return bool
+ */
+ protected function doDeduplicateRootJob( Job $job ) {
+ $params = $job->getParams();
+ if ( !isset( $params['rootJobSignature'] ) ) {
+ throw new MWException( "Cannot register root job; missing 'rootJobSignature'." );
+ } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
+ throw new MWException( "Cannot register root job; missing 'rootJobTimestamp'." );
+ }
+ $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+ // Callers should call batchInsert() and then this function so that if the insert
+ // fails, the de-duplication registration will be aborted. Since the insert is
+ // deferred till "transaction idle", do the same here, so that the ordering is
+ // maintained. Having only the de-duplication registration succeed would cause
+ // jobs to become no-ops without any actual jobs that made them redundant.
+ list( $dbw, $scope ) = $this->getMasterDB();
+ $dbw->onTransactionIdle( function() use ( $params, $key, $scope ) {
+ global $wgMemc;
+
+ $timestamp = $wgMemc->get( $key ); // current last timestamp of this job
+ if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
+ return true; // a newer version of this root job was enqueued
+ }
+
+ // Update the timestamp of the last root job started at the location...
+ return $wgMemc->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
+ } );
+
+ return true;
+ }
+
+ /**
+ * Check if the "root" job of a given job has been superseded by a newer one
+ *
+ * @param $job Job
+ * @return bool
+ */
+ protected function isRootJobOldDuplicate( Job $job ) {
+ global $wgMemc;
+
+ $params = $job->getParams();
+ if ( !isset( $params['rootJobSignature'] ) ) {
+ return false; // job has no de-deplication info
+ } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
+ trigger_error( "Cannot check root job; missing 'rootJobTimestamp'." );
+ return false;
+ }
+
+ // Get the last time this root job was enqueued
+ $timestamp = $wgMemc->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
+
+ // Check if a new root job was started at the location after this one's...
+ return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
+ }
+
+ /**
+ * @see JobQueue::doWaitForBackups()
+ * @return void
+ */
+ protected function doWaitForBackups() {
+ wfWaitForSlaves();
+ }
+
+ /**
+ * @return Array
+ */
+ protected function doGetPeriodicTasks() {
+ return array(
+ 'recycleAndDeleteStaleJobs' => array(
+ 'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
+ 'period' => ceil( $this->claimTTL / 2 )
+ )
+ );
+ }
+
+ /**
+ * @return void
+ */
+ protected function doFlushCaches() {
+ global $wgMemc;
+
+ foreach ( array( 'empty', 'size', 'acquiredcount' ) as $type ) {
+ $wgMemc->delete( $this->getCacheKey( $type ) );
+ }
+ }
+
+ /**
+ * @see JobQueue::getAllQueuedJobs()
+ * @return Iterator
+ */
+ public function getAllQueuedJobs() {
+ list( $dbr, $scope ) = $this->getSlaveDB();
+ return new MappedIterator(
+ $dbr->select( 'job', '*', array( 'job_cmd' => $this->getType(), 'job_token' => '' ) ),
+ function( $row ) use ( $scope ) {
+ $job = Job::factory(
+ $row->job_cmd,
+ Title::makeTitle( $row->job_namespace, $row->job_title ),
+ strlen( $row->job_params ) ? unserialize( $row->job_params ) : false,
+ $row->job_id
+ );
+ $job->id = $row->job_id; // XXX: work around broken subclasses
+ return $job;
+ }
+ );
+ }
+
+ /**
+ * @return Array (DatabaseBase, ScopedCallback)
+ */
+ protected function getSlaveDB() {
+ return $this->getDB( DB_SLAVE );
+ }
+
+ /**
+ * @return Array (DatabaseBase, ScopedCallback)
+ */
+ protected function getMasterDB() {
+ return $this->getDB( DB_MASTER );
+ }
+
+ /**
+ * @param $index integer (DB_SLAVE/DB_MASTER)
+ * @return Array (DatabaseBase, ScopedCallback)
+ */
+ protected function getDB( $index ) {
+ $lb = ( $this->cluster !== false )
+ ? wfGetLBFactory()->getExternalLB( $this->cluster, $this->wiki )
+ : wfGetLB( $this->wiki );
+ $conn = $lb->getConnection( $index, array(), $this->wiki );
+ return array(
+ $conn,
+ new ScopedCallback( function() use ( $lb, $conn ) {
+ $lb->reuseConnection( $conn );
+ } )
+ );
+ }
+
+ /**
+ * @param $job Job
+ * @return array
+ */
+ protected function insertFields( Job $job ) {
+ list( $dbw, $scope ) = $this->getMasterDB();
+ return array(
+ // Fields that describe the nature of the job
+ 'job_cmd' => $job->getType(),
+ 'job_namespace' => $job->getTitle()->getNamespace(),
+ 'job_title' => $job->getTitle()->getDBkey(),
+ 'job_params' => self::makeBlob( $job->getParams() ),
+ // Additional job metadata
+ 'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
+ 'job_timestamp' => $dbw->timestamp(),
+ 'job_sha1' => wfBaseConvert(
+ sha1( serialize( $job->getDeduplicationInfo() ) ),
+ 16, 36, 31
+ ),
+ 'job_random' => mt_rand( 0, self::MAX_JOB_RANDOM )
+ );
+ }
+
+ /**
+ * @return string
+ */
+ private function getCacheKey( $property ) {
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $property );
+ }
+
+ /**
+ * @param string $signature Hash identifier of the root job
+ * @return string
+ */
+ private function getRootJobCacheKey( $signature ) {
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+ return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
+ }
+
+ /**
+ * @param $params
+ * @return string
+ */
+ protected static function makeBlob( $params ) {
+ if ( $params !== false ) {
+ return serialize( $params );
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * @param $blob
+ * @return bool|mixed
+ */
+ protected static function extractBlob( $blob ) {
+ if ( (string)$blob !== '' ) {
+ return unserialize( $blob );
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/includes/job/JobQueueGroup.php b/includes/job/JobQueueGroup.php
new file mode 100644
index 00000000..351c71a3
--- /dev/null
+++ b/includes/job/JobQueueGroup.php
@@ -0,0 +1,351 @@
+<?php
+/**
+ * Job queue base code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle enqueueing of background jobs
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueGroup {
+ /** @var Array */
+ protected static $instances = array();
+
+ /** @var ProcessCacheLRU */
+ protected $cache;
+
+ protected $wiki; // string; wiki ID
+
+ const TYPE_DEFAULT = 1; // integer; jobs popped by default
+ const TYPE_ANY = 2; // integer; any job
+
+ const USE_CACHE = 1; // integer; use process or persistent cache
+
+ const PROC_CACHE_TTL = 15; // integer; seconds
+
+ const CACHE_VERSION = 1; // integer; cache version
+
+ /**
+ * @param string $wiki Wiki ID
+ */
+ protected function __construct( $wiki ) {
+ $this->wiki = $wiki;
+ $this->cache = new ProcessCacheLRU( 10 );
+ }
+
+ /**
+ * @param string $wiki Wiki ID
+ * @return JobQueueGroup
+ */
+ public static function singleton( $wiki = false ) {
+ $wiki = ( $wiki === false ) ? wfWikiID() : $wiki;
+ if ( !isset( self::$instances[$wiki] ) ) {
+ self::$instances[$wiki] = new self( $wiki );
+ }
+ return self::$instances[$wiki];
+ }
+
+ /**
+ * Destroy the singleton instances
+ *
+ * @return void
+ */
+ public static function destroySingletons() {
+ self::$instances = array();
+ }
+
+ /**
+ * Get the job queue object for a given queue type
+ *
+ * @param $type string
+ * @return JobQueue
+ */
+ public function get( $type ) {
+ global $wgJobTypeConf;
+
+ $conf = array( 'wiki' => $this->wiki, 'type' => $type );
+ if ( isset( $wgJobTypeConf[$type] ) ) {
+ $conf = $conf + $wgJobTypeConf[$type];
+ } else {
+ $conf = $conf + $wgJobTypeConf['default'];
+ }
+
+ return JobQueue::factory( $conf );
+ }
+
+ /**
+ * Insert jobs into the respective queues of with the belong.
+ *
+ * This inserts the jobs into the queue specified by $wgJobTypeConf
+ * and updates the aggregate job queue information cache as needed.
+ *
+ * @param $jobs Job|array A single Job or a list of Jobs
+ * @throws MWException
+ * @return bool
+ */
+ public function push( $jobs ) {
+ $jobs = is_array( $jobs ) ? $jobs : array( $jobs );
+
+ $jobsByType = array(); // (job type => list of jobs)
+ foreach ( $jobs as $job ) {
+ if ( $job instanceof Job ) {
+ $jobsByType[$job->getType()][] = $job;
+ } else {
+ throw new MWException( "Attempted to push a non-Job object into a queue." );
+ }
+ }
+
+ $ok = true;
+ foreach ( $jobsByType as $type => $jobs ) {
+ if ( $this->get( $type )->push( $jobs ) ) {
+ JobQueueAggregator::singleton()->notifyQueueNonEmpty( $this->wiki, $type );
+ } else {
+ $ok = false;
+ }
+ }
+
+ if ( $this->cache->has( 'queues-ready', 'list' ) ) {
+ $list = $this->cache->get( 'queues-ready', 'list' );
+ if ( count( array_diff( array_keys( $jobsByType ), $list ) ) ) {
+ $this->cache->clear( 'queues-ready' );
+ }
+ }
+
+ return $ok;
+ }
+
+ /**
+ * Pop a job off one of the job queues
+ *
+ * This pops a job off a queue as specified by $wgJobTypeConf and
+ * updates the aggregate job queue information cache as needed.
+ *
+ * @param $qtype integer|string JobQueueGroup::TYPE_DEFAULT or type string
+ * @param $flags integer Bitfield of JobQueueGroup::USE_* constants
+ * @return Job|bool Returns false on failure
+ */
+ public function pop( $qtype = self::TYPE_DEFAULT, $flags = 0 ) {
+ if ( is_string( $qtype ) ) { // specific job type
+ $job = $this->get( $qtype )->pop();
+ if ( !$job ) {
+ JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $qtype );
+ }
+ return $job;
+ } else { // any job in the "default" jobs types
+ if ( $flags & self::USE_CACHE ) {
+ if ( !$this->cache->has( 'queues-ready', 'list', self::PROC_CACHE_TTL ) ) {
+ $this->cache->set( 'queues-ready', 'list', $this->getQueuesWithJobs() );
+ }
+ $types = $this->cache->get( 'queues-ready', 'list' );
+ } else {
+ $types = $this->getQueuesWithJobs();
+ }
+
+ if ( $qtype == self::TYPE_DEFAULT ) {
+ $types = array_intersect( $types, $this->getDefaultQueueTypes() );
+ }
+ shuffle( $types ); // avoid starvation
+
+ foreach ( $types as $type ) { // for each queue...
+ $job = $this->get( $type )->pop();
+ if ( $job ) { // found
+ return $job;
+ } else { // not found
+ JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $type );
+ $this->cache->clear( 'queues-ready' );
+ }
+ }
+
+ return false; // no jobs found
+ }
+ }
+
+ /**
+ * Acknowledge that a job was completed
+ *
+ * @param $job Job
+ * @return bool
+ */
+ public function ack( Job $job ) {
+ return $this->get( $job->getType() )->ack( $job );
+ }
+
+ /**
+ * Register the "root job" of a given job into the queue for de-duplication.
+ * This should only be called right *after* all the new jobs have been inserted.
+ *
+ * @param $job Job
+ * @return bool
+ */
+ public function deduplicateRootJob( Job $job ) {
+ return $this->get( $job->getType() )->deduplicateRootJob( $job );
+ }
+
+ /**
+ * Wait for any slaves or backup queue servers to catch up.
+ *
+ * This does nothing for certain queue classes.
+ *
+ * @return void
+ * @throws MWException
+ */
+ public function waitForBackups() {
+ global $wgJobTypeConf;
+
+ wfProfileIn( __METHOD__ );
+ // Try to avoid doing this more than once per queue storage medium
+ foreach ( $wgJobTypeConf as $type => $conf ) {
+ $this->get( $type )->waitForBackups();
+ }
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Get the list of queue types
+ *
+ * @return array List of strings
+ */
+ public function getQueueTypes() {
+ return array_keys( $this->getCachedConfigVar( 'wgJobClasses' ) );
+ }
+
+ /**
+ * Get the list of default queue types
+ *
+ * @return array List of strings
+ */
+ public function getDefaultQueueTypes() {
+ global $wgJobTypesExcludedFromDefaultQueue;
+
+ return array_diff( $this->getQueueTypes(), $wgJobTypesExcludedFromDefaultQueue );
+ }
+
+ /**
+ * Get the list of job types that have non-empty queues
+ *
+ * @return Array List of job types that have non-empty queues
+ */
+ public function getQueuesWithJobs() {
+ $types = array();
+ foreach ( $this->getQueueTypes() as $type ) {
+ if ( !$this->get( $type )->isEmpty() ) {
+ $types[] = $type;
+ }
+ }
+ return $types;
+ }
+
+ /**
+ * Check if jobs should not be popped of a queue right now.
+ * This is only used for performance, such as to avoid spamming
+ * the queue with many sub-jobs before they actually get run.
+ *
+ * @param $type string
+ * @return bool
+ */
+ public function isQueueDeprioritized( $type ) {
+ if ( $type === 'refreshLinks2' ) {
+ // Don't keep converting refreshLinks2 => refreshLinks jobs if the
+ // later jobs have not been done yet. This helps throttle queue spam.
+ return !$this->get( 'refreshLinks' )->isEmpty();
+ }
+ return false;
+ }
+
+ /**
+ * Execute any due periodic queue maintenance tasks for all queues.
+ *
+ * A task is "due" if the time ellapsed since the last run is greater than
+ * the defined run period. Concurrent calls to this function will cause tasks
+ * to be attempted twice, so they may need their own methods of mutual exclusion.
+ *
+ * @return integer Number of tasks run
+ */
+ public function executeReadyPeriodicTasks() {
+ global $wgMemc;
+
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+ $key = wfForeignMemcKey( $db, $prefix, 'jobqueuegroup', 'taskruns', 'v1' );
+ $lastRuns = $wgMemc->get( $key ); // (queue => task => UNIX timestamp)
+
+ $count = 0;
+ $tasksRun = array(); // (queue => task => UNIX timestamp)
+ foreach ( $this->getQueueTypes() as $type ) {
+ $queue = $this->get( $type );
+ foreach ( $queue->getPeriodicTasks() as $task => $definition ) {
+ if ( $definition['period'] <= 0 ) {
+ continue; // disabled
+ } elseif ( !isset( $lastRuns[$type][$task] )
+ || $lastRuns[$type][$task] < ( time() - $definition['period'] ) )
+ {
+ if ( call_user_func( $definition['callback'] ) !== null ) {
+ $tasksRun[$type][$task] = time();
+ ++$count;
+ }
+ }
+ }
+ }
+
+ $wgMemc->merge( $key, function( $cache, $key, $lastRuns ) use ( $tasksRun ) {
+ if ( is_array( $lastRuns ) ) {
+ foreach ( $tasksRun as $type => $tasks ) {
+ foreach ( $tasks as $task => $timestamp ) {
+ if ( !isset( $lastRuns[$type][$task] )
+ || $timestamp > $lastRuns[$type][$task] )
+ {
+ $lastRuns[$type][$task] = $timestamp;
+ }
+ }
+ }
+ } else {
+ $lastRuns = $tasksRun;
+ }
+ return $lastRuns;
+ } );
+
+ return $count;
+ }
+
+ /**
+ * @param $name string
+ * @return mixed
+ */
+ private function getCachedConfigVar( $name ) {
+ global $wgConf, $wgMemc;
+
+ if ( $this->wiki === wfWikiID() ) {
+ return $GLOBALS[$name]; // common case
+ } else {
+ list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+ $key = wfForeignMemcKey( $db, $prefix, 'configvalue', $name );
+ $value = $wgMemc->get( $key ); // ('v' => ...) or false
+ if ( is_array( $value ) ) {
+ return $value['v'];
+ } else {
+ $value = $wgConf->getConfig( $this->wiki, $name );
+ $wgMemc->set( $key, array( 'v' => $value ), 86400 + mt_rand( 0, 86400 ) );
+ return $value;
+ }
+ }
+ }
+}
diff --git a/includes/job/README b/includes/job/README
new file mode 100644
index 00000000..c11d5a78
--- /dev/null
+++ b/includes/job/README
@@ -0,0 +1,81 @@
+/*!
+\ingroup JobQueue
+\page jobqueue_design Job queue design
+
+Notes on the Job queuing system architecture.
+
+\section intro Introduction
+
+The data model consist of the following main components:
+* The Job object represents a particular deferred task that happens in the
+ background. All jobs subclass the Job object and put the main logic in the
+ function called run().
+* The JobQueue object represents a particular queue of jobs of a certain type.
+ For example there may be a queue for email jobs and a queue for squid purge
+ jobs.
+
+\section jobqueue Job queues
+
+Each job type has its own queue and is associated to a storage medium. One
+queue might save its jobs in redis while another one uses would use a database.
+
+Storage medium are defined in a queue class. Before using it, you must
+define in $wgJobTypeConf a mapping of the job type to a queue class.
+
+The factory class JobQueueGroup provides helper functions:
+- getting the queue for a given job
+- route new job insertions to the proper queue
+
+The following queue classes are available:
+* JobQueueDB (stores jobs in the `job` table in a database)
+* JobQueueRedis (stores jobs in a redis server)
+
+All queue classes support some basic operations (though some may be no-ops):
+* enqueueing a batch of jobs
+* dequeueing a single job
+* acknowledging a job is completed
+* checking if the queue is empty
+
+Some queue classes (like JobQueueDB) may dequeue jobs in random order while other
+queues might dequeue jobs in exact FIFO order. Callers should thus not assume jobs
+are executed in FIFO order.
+
+Also note that not all queue classes will have the same reliability guarantees.
+In-memory queues may lose data when restarted depending on snapshot and journal
+settings (including journal fsync() frequency). Some queue types may totally remove
+jobs when dequeued while leaving the ack() function as a no-op; if a job is
+dequeued by a job runner, which crashes before completion, the job will be
+lost. Some jobs, like purging squid caches after a template change, may not
+require durable queues, whereas other jobs might be more important.
+
+\section aggregator Job queue aggregator
+
+The aggregators are used by nextJobDB.php, which is a script that will return a
+random ready queue (on any wiki in the farm) that can be used with runJobs.php.
+This can be used in conjunction with any scripts that handle wiki farm job queues.
+Note that $wgLocalDatabases defines what wikis are in the wiki farm.
+
+Since each job type has its own queue, and wiki-farms may have many wikis,
+there might be a large number of queues to keep track of. To avoid wasting
+large amounts of time polling empty queues, aggregators exists to keep track
+of which queues are ready.
+
+The following queue aggregator classes are available:
+* JobQueueAggregatorMemc (uses $wgMemc to track ready queues)
+* JobQueueAggregatorRedis (uses a redis server to track ready queues)
+
+Some aggregators cache data for a few minutes while others may be always up to date.
+This can be an important factor for jobs that need a low pickup time (or latency).
+
+\section jobs Jobs
+
+Callers should also try to make jobs maintain correctness when executed twice.
+This is useful for queues that actually implement ack(), since they may recycle
+dequeued but un-acknowledged jobs back into the queue to be attempted again. If
+a runner dequeues a job, runs it, but then crashes before calling ack(), the
+job may be returned to the queue and run a second time. Jobs like cache purging can
+happen several times without any correctness problems. However, a pathological case
+would be if a bug causes the problem to systematically keep repeating. For example,
+a job may always throw a DB error at the end of run(). This problem is trickier to
+solve and more obnoxious for things like email jobs, for example. For such jobs,
+it might be useful to use a queue that does not retry jobs.
diff --git a/includes/job/RefreshLinksJob.php b/includes/job/RefreshLinksJob.php
deleted file mode 100644
index b23951c6..00000000
--- a/includes/job/RefreshLinksJob.php
+++ /dev/null
@@ -1,202 +0,0 @@
-<?php
-/**
- * Job to update links for a given title.
- *
- * 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 JobQueue
- */
-
-/**
- * Background job to update links for a given title.
- *
- * @ingroup JobQueue
- */
-class RefreshLinksJob extends Job {
-
- function __construct( $title, $params = '', $id = 0 ) {
- parent::__construct( 'refreshLinks', $title, $params, $id );
- }
-
- /**
- * Run a refreshLinks job
- * @return boolean success
- */
- function run() {
- wfProfileIn( __METHOD__ );
-
- $linkCache = LinkCache::singleton();
- $linkCache->clear();
-
- if ( is_null( $this->title ) ) {
- $this->error = "refreshLinks: Invalid title";
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- # Wait for the DB of the current/next slave DB handle to catch up to the master.
- # This way, we get the correct page_latest for templates or files that just changed
- # milliseconds ago, having triggered this job to begin with.
- if ( isset( $this->params['masterPos'] ) ) {
- wfGetLB()->waitFor( $this->params['masterPos'] );
- }
-
- $revision = Revision::newFromTitle( $this->title, false, Revision::READ_NORMAL );
- if ( !$revision ) {
- $this->error = 'refreshLinks: Article not found "' .
- $this->title->getPrefixedDBkey() . '"';
- wfProfileOut( __METHOD__ );
- return false; // XXX: what if it was just deleted?
- }
-
- self::runForTitleInternal( $this->title, $revision, __METHOD__ );
-
- wfProfileOut( __METHOD__ );
- return true;
- }
-
- public static function runForTitleInternal( Title $title, Revision $revision, $fname ) {
- global $wgParser, $wgContLang;
-
- wfProfileIn( $fname . '-parse' );
- $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
- $parserOutput = $wgParser->parse(
- $revision->getText(), $title, $options, true, true, $revision->getId() );
- wfProfileOut( $fname . '-parse' );
-
- wfProfileIn( $fname . '-update' );
- $updates = $parserOutput->getSecondaryDataUpdates( $title, false );
- DataUpdate::runUpdates( $updates );
- wfProfileOut( $fname . '-update' );
- }
-}
-
-/**
- * Background job to update links for a given title.
- * Newer version for high use templates.
- *
- * @ingroup JobQueue
- */
-class RefreshLinksJob2 extends Job {
- const MAX_TITLES_RUN = 10;
-
- function __construct( $title, $params, $id = 0 ) {
- parent::__construct( 'refreshLinks2', $title, $params, $id );
- }
-
- /**
- * Run a refreshLinks2 job
- * @return boolean success
- */
- function run() {
- wfProfileIn( __METHOD__ );
-
- $linkCache = LinkCache::singleton();
- $linkCache->clear();
-
- if ( is_null( $this->title ) ) {
- $this->error = "refreshLinks2: Invalid title";
- wfProfileOut( __METHOD__ );
- return false;
- } elseif ( !isset( $this->params['start'] ) || !isset( $this->params['end'] ) ) {
- $this->error = "refreshLinks2: Invalid params";
- wfProfileOut( __METHOD__ );
- return false;
- }
-
- // Back compat for pre-r94435 jobs
- $table = isset( $this->params['table'] ) ? $this->params['table'] : 'templatelinks';
-
- // Avoid slave lag when fetching templates
- if ( isset( $this->params['masterPos'] ) ) {
- $masterPos = $this->params['masterPos'];
- } elseif ( wfGetLB()->getServerCount() > 1 ) {
- $masterPos = wfGetLB()->getMasterPos();
- } else {
- $masterPos = false;
- }
-
- $titles = $this->title->getBacklinkCache()->getLinks(
- $table, $this->params['start'], $this->params['end'] );
-
- if ( $titles->count() > self::MAX_TITLES_RUN ) {
- # We don't want to parse too many pages per job as it can starve other jobs.
- # If there are too many pages to parse, break this up into smaller jobs. By passing
- # in the master position here we can cut down on the time spent waiting for slaves to
- # catch up by the runners handling these jobs since time will have passed between now
- # and when they pop these jobs off the queue.
- $start = 0; // batch start
- $end = 0; // batch end
- $bsize = 0; // batch size
- $first = true; // first of batch
- $jobs = array();
- foreach ( $titles as $title ) {
- $start = $first ? $title->getArticleId() : $start;
- $end = $title->getArticleId();
- $first = false;
- if ( ++$bsize >= self::MAX_TITLES_RUN ) {
- $jobs[] = new RefreshLinksJob2( $this->title, array(
- 'table' => $table,
- 'start' => $start,
- 'end' => $end,
- 'masterPos' => $masterPos
- ) );
- $first = true;
- $start = $end = $bsize = 0;
- }
- }
- if ( $bsize > 0 ) { // group remaining pages into a job
- $jobs[] = new RefreshLinksJob2( $this->title, array(
- 'table' => $table,
- 'start' => $start,
- 'end' => $end,
- 'masterPos' => $masterPos
- ) );
- }
- Job::batchInsert( $jobs );
- } elseif ( php_sapi_name() != 'cli' ) {
- # Not suitable for page load triggered job running!
- # Gracefully switch to refreshLinks jobs if this happens.
- $jobs = array();
- foreach ( $titles as $title ) {
- $jobs[] = new RefreshLinksJob( $title, array( 'masterPos' => $masterPos ) );
- }
- Job::batchInsert( $jobs );
- } else {
- # Wait for the DB of the current/next slave DB handle to catch up to the master.
- # This way, we get the correct page_latest for templates or files that just changed
- # milliseconds ago, having triggered this job to begin with.
- if ( $masterPos ) {
- wfGetLB()->waitFor( $masterPos );
- }
- # Re-parse each page that transcludes this page and update their tracking links...
- foreach ( $titles as $title ) {
- $revision = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
- if ( !$revision ) {
- $this->error = 'refreshLinks: Article not found "' .
- $title->getPrefixedDBkey() . '"';
- continue; // skip this page
- }
- RefreshLinksJob::runForTitleInternal( $title, $revision, __METHOD__ );
- wfWaitForSlaves();
- }
- }
-
- wfProfileOut( __METHOD__ );
- return true;
- }
-}
diff --git a/includes/job/UploadFromUrlJob.php b/includes/job/UploadFromUrlJob.php
deleted file mode 100644
index e06f68e4..00000000
--- a/includes/job/UploadFromUrlJob.php
+++ /dev/null
@@ -1,179 +0,0 @@
-<?php
-/**
- * Job for asynchronous upload-by-url.
- *
- * 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 JobQueue
- */
-
-/**
- * Job for asynchronous upload-by-url.
- *
- * This job is in fact an interface to UploadFromUrl, which is designed such
- * that it does not require any globals. If it does, fix it elsewhere, do not
- * add globals in here.
- *
- * @ingroup JobQueue
- */
-class UploadFromUrlJob extends Job {
- const SESSION_KEYNAME = 'wsUploadFromUrlJobData';
-
- /**
- * @var UploadFromUrl
- */
- public $upload;
-
- /**
- * @var User
- */
- protected $user;
-
- public function __construct( $title, $params, $id = 0 ) {
- parent::__construct( 'uploadFromUrl', $title, $params, $id );
- }
-
- public function run() {
- # Initialize this object and the upload object
- $this->upload = new UploadFromUrl();
- $this->upload->initialize(
- $this->title->getText(),
- $this->params['url'],
- false
- );
- $this->user = User::newFromName( $this->params['userName'] );
-
- # Fetch the file
- $status = $this->upload->fetchFile();
- if ( !$status->isOk() ) {
- $this->leaveMessage( $status );
- return true;
- }
-
- # Verify upload
- $result = $this->upload->verifyUpload();
- if ( $result['status'] != UploadBase::OK ) {
- $status = $this->upload->convertVerifyErrorToStatus( $result );
- $this->leaveMessage( $status );
- return true;
- }
-
- # Check warnings
- if ( !$this->params['ignoreWarnings'] ) {
- $warnings = $this->upload->checkWarnings();
- if ( $warnings ) {
-
- # Stash the upload
- $key = $this->upload->stashFile();
-
- if ( $this->params['leaveMessage'] ) {
- $this->user->leaveUserMessage(
- wfMessage( 'upload-warning-subj' )->text(),
- wfMessage( 'upload-warning-msg',
- $key,
- $this->params['url'] )->text()
- );
- } else {
- wfSetupSession( $this->params['sessionId'] );
- $this->storeResultInSession( 'Warning',
- 'warnings', $warnings );
- session_write_close();
- }
-
- return true;
- }
- }
-
- # Perform the upload
- $status = $this->upload->performUpload(
- $this->params['comment'],
- $this->params['pageText'],
- $this->params['watch'],
- $this->user
- );
- $this->leaveMessage( $status );
- return true;
-
- }
-
- /**
- * Leave a message on the user talk page or in the session according to
- * $params['leaveMessage'].
- *
- * @param $status Status
- */
- protected function leaveMessage( $status ) {
- if ( $this->params['leaveMessage'] ) {
- if ( $status->isGood() ) {
- $this->user->leaveUserMessage( wfMessage( 'upload-success-subj' )->text(),
- wfMessage( 'upload-success-msg',
- $this->upload->getTitle()->getText(),
- $this->params['url']
- )->text() );
- } else {
- $this->user->leaveUserMessage( wfMessage( 'upload-failure-subj' )->text(),
- wfMessage( 'upload-failure-msg',
- $status->getWikiText(),
- $this->params['url']
- )->text() );
- }
- } else {
- wfSetupSession( $this->params['sessionId'] );
- if ( $status->isOk() ) {
- $this->storeResultInSession( 'Success',
- 'filename', $this->upload->getLocalFile()->getName() );
- } else {
- $this->storeResultInSession( 'Failure',
- 'errors', $status->getErrorsArray() );
- }
- session_write_close();
- }
- }
-
- /**
- * Store a result in the session data. Note that the caller is responsible
- * for appropriate session_start and session_write_close calls.
- *
- * @param $result String: the result (Success|Warning|Failure)
- * @param $dataKey String: the key of the extra data
- * @param $dataValue Mixed: the extra data itself
- */
- protected function storeResultInSession( $result, $dataKey, $dataValue ) {
- $session =& self::getSessionData( $this->params['sessionKey'] );
- $session['result'] = $result;
- $session[$dataKey] = $dataValue;
- }
-
- /**
- * Initialize the session data. Sets the intial result to queued.
- */
- public function initializeSessionData() {
- $session =& self::getSessionData( $this->params['sessionKey'] );
- $$session['result'] = 'Queued';
- }
-
- /**
- * @param $key
- * @return mixed
- */
- public static function &getSessionData( $key ) {
- if ( !isset( $_SESSION[self::SESSION_KEYNAME][$key] ) ) {
- $_SESSION[self::SESSION_KEYNAME][$key] = array();
- }
- return $_SESSION[self::SESSION_KEYNAME][$key];
- }
-}
diff --git a/includes/job/jobs/AssembleUploadChunksJob.php b/includes/job/jobs/AssembleUploadChunksJob.php
new file mode 100644
index 00000000..c5dd9eaa
--- /dev/null
+++ b/includes/job/jobs/AssembleUploadChunksJob.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Assemble the segments of a chunked upload.
+ *
+ * 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 Upload
+ */
+
+/**
+ * Assemble the segments of a chunked upload.
+ *
+ * @ingroup Upload
+ */
+class AssembleUploadChunksJob extends Job {
+ public function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'AssembleUploadChunks', $title, $params, $id );
+ $this->removeDuplicates = true;
+ }
+
+ public function run() {
+ $scope = RequestContext::importScopedSession( $this->params['session'] );
+ $context = RequestContext::getMain();
+ try {
+ $user = $context->getUser();
+ if ( !$user->isLoggedIn() ) {
+ $this->setLastError( "Could not load the author user from session." );
+ return false;
+ }
+
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Poll', 'stage' => 'assembling', 'status' => Status::newGood() )
+ );
+
+ $upload = new UploadFromChunks( $user );
+ $upload->continueChunks(
+ $this->params['filename'],
+ $this->params['filekey'],
+ $context->getRequest()
+ );
+
+ // Combine all of the chunks into a local file and upload that to a new stash file
+ $status = $upload->concatenateChunks();
+ if ( !$status->isGood() ) {
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status )
+ );
+ $this->setLastError( $status->getWikiText() );
+ return false;
+ }
+
+ // We have a new filekey for the fully concatenated file
+ $newFileKey = $upload->getLocalFile()->getFileKey();
+
+ // Remove the old stash file row and first chunk file
+ $upload->stash->removeFileNoAuth( $this->params['filekey'] );
+
+ // Build the image info array while we have the local reference handy
+ $apiMain = new ApiMain(); // dummy object (XXX)
+ $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
+
+ // Cleanup any temporary local file
+ $upload->cleanupTempFile();
+
+ // Cache the info so the user doesn't have to wait forever to get the final info
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array(
+ 'result' => 'Success',
+ 'stage' => 'assembling',
+ 'filekey' => $newFileKey,
+ 'imageinfo' => $imageInfo,
+ 'status' => Status::newGood()
+ )
+ );
+ } catch ( MWException $e ) {
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array(
+ 'result' => 'Failure',
+ 'stage' => 'assembling',
+ 'status' => Status::newFatal( 'api-error-stashfailed' )
+ )
+ );
+ $this->setLastError( get_class( $e ) . ": " . $e->getText() );
+ return false;
+ }
+ return true;
+ }
+
+ public function getDeduplicationInfo() {
+ $info = parent::getDeduplicationInfo();
+ if ( is_array( $info['params'] ) ) {
+ $info['params'] = array( 'filekey' => $info['params']['filekey'] );
+ }
+ return $info;
+ }
+
+ public function allowRetries() {
+ return false;
+ }
+}
diff --git a/includes/job/jobs/DoubleRedirectJob.php b/includes/job/jobs/DoubleRedirectJob.php
new file mode 100644
index 00000000..05abeeef
--- /dev/null
+++ b/includes/job/jobs/DoubleRedirectJob.php
@@ -0,0 +1,218 @@
+<?php
+/**
+ * Job to fix double redirects after moving a page.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job to fix double redirects after moving a page
+ *
+ * @ingroup JobQueue
+ */
+class DoubleRedirectJob extends Job {
+ var $reason, $redirTitle;
+
+ /**
+ * @var User
+ */
+ static $user;
+
+ /**
+ * Insert jobs into the job queue to fix redirects to the given title
+ * @param string $reason the reason for the fix, see message "double-redirect-fixed-<reason>"
+ * @param $redirTitle Title: the title which has changed, redirects pointing to this title are fixed
+ * @param bool $destTitle Not used
+ */
+ public static function fixRedirects( $reason, $redirTitle, $destTitle = false ) {
+ # Need to use the master to get the redirect table updated in the same transaction
+ $dbw = wfGetDB( DB_MASTER );
+ $res = $dbw->select(
+ array( 'redirect', 'page' ),
+ array( 'page_namespace', 'page_title' ),
+ array(
+ 'page_id = rd_from',
+ 'rd_namespace' => $redirTitle->getNamespace(),
+ 'rd_title' => $redirTitle->getDBkey()
+ ), __METHOD__ );
+ if ( !$res->numRows() ) {
+ return;
+ }
+ $jobs = array();
+ foreach ( $res as $row ) {
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+ if ( !$title ) {
+ continue;
+ }
+
+ $jobs[] = new self( $title, array(
+ 'reason' => $reason,
+ 'redirTitle' => $redirTitle->getPrefixedDBkey() ) );
+ # Avoid excessive memory usage
+ if ( count( $jobs ) > 10000 ) {
+ JobQueueGroup::singleton()->push( $jobs );
+ $jobs = array();
+ }
+ }
+ JobQueueGroup::singleton()->push( $jobs );
+ }
+
+ function __construct( $title, $params = false, $id = 0 ) {
+ parent::__construct( 'fixDoubleRedirect', $title, $params, $id );
+ $this->reason = $params['reason'];
+ $this->redirTitle = Title::newFromText( $params['redirTitle'] );
+ }
+
+ /**
+ * @return bool
+ */
+ function run() {
+ if ( !$this->redirTitle ) {
+ $this->setLastError( 'Invalid title' );
+ return false;
+ }
+
+ $targetRev = Revision::newFromTitle( $this->title, false, Revision::READ_LATEST );
+ if ( !$targetRev ) {
+ wfDebug( __METHOD__.": target redirect already deleted, ignoring\n" );
+ return true;
+ }
+ $content = $targetRev->getContent();
+ $currentDest = $content ? $content->getRedirectTarget() : null;
+ if ( !$currentDest || !$currentDest->equals( $this->redirTitle ) ) {
+ wfDebug( __METHOD__.": Redirect has changed since the job was queued\n" );
+ return true;
+ }
+
+ # Check for a suppression tag (used e.g. in periodically archived discussions)
+ $mw = MagicWord::get( 'staticredirect' );
+ if ( $content->matchMagicWord( $mw ) ) {
+ wfDebug( __METHOD__.": skipping: suppressed with __STATICREDIRECT__\n" );
+ return true;
+ }
+
+ # Find the current final destination
+ $newTitle = self::getFinalDestination( $this->redirTitle );
+ if ( !$newTitle ) {
+ wfDebug( __METHOD__.": skipping: single redirect, circular redirect or invalid redirect destination\n" );
+ return true;
+ }
+ if ( $newTitle->equals( $this->redirTitle ) ) {
+ # The redirect is already right, no need to change it
+ # This can happen if the page was moved back (say after vandalism)
+ wfDebug( __METHOD__.": skipping, already good\n" );
+ }
+
+ # Preserve fragment (bug 14904)
+ $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
+ $currentDest->getFragment(), $newTitle->getInterwiki() );
+
+ # Fix the text
+ $newContent = $content->updateRedirect( $newTitle );
+
+ if ( $newContent->equals( $content ) ) {
+ $this->setLastError( 'Content unchanged???' );
+ return false;
+ }
+
+ $user = $this->getUser();
+ if ( !$user ) {
+ $this->setLastError( 'Invalid user' );
+ return false;
+ }
+
+ # Save it
+ global $wgUser;
+ $oldUser = $wgUser;
+ $wgUser = $user;
+ $article = WikiPage::factory( $this->title );
+ $reason = wfMessage( 'double-redirect-fixed-' . $this->reason,
+ $this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText()
+ )->inContentLanguage()->text();
+ $article->doEditContent( $newContent, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC, false, $user );
+ $wgUser = $oldUser;
+
+ return true;
+ }
+
+ /**
+ * Get the final destination of a redirect
+ *
+ * @param $title Title
+ *
+ * @return bool if the specified title is not a redirect, or if it is a circular redirect
+ */
+ public static function getFinalDestination( $title ) {
+ $dbw = wfGetDB( DB_MASTER );
+
+ $seenTitles = array(); # Circular redirect check
+ $dest = false;
+
+ while ( true ) {
+ $titleText = $title->getPrefixedDBkey();
+ if ( isset( $seenTitles[$titleText] ) ) {
+ wfDebug( __METHOD__, "Circular redirect detected, aborting\n" );
+ return false;
+ }
+ $seenTitles[$titleText] = true;
+
+ if ( $title->getInterwiki() ) {
+ // If the target is interwiki, we have to break early (bug 40352).
+ // Otherwise it will look up a row in the local page table
+ // with the namespace/page of the interwiki target which can cause
+ // unexpected results (e.g. X -> foo:Bar -> Bar -> .. )
+ break;
+ }
+
+ $row = $dbw->selectRow(
+ array( 'redirect', 'page' ),
+ array( 'rd_namespace', 'rd_title', 'rd_interwiki' ),
+ array(
+ 'rd_from=page_id',
+ 'page_namespace' => $title->getNamespace(),
+ 'page_title' => $title->getDBkey()
+ ), __METHOD__ );
+ if ( !$row ) {
+ # No redirect from here, chain terminates
+ break;
+ } else {
+ $dest = $title = Title::makeTitle( $row->rd_namespace, $row->rd_title, '', $row->rd_interwiki );
+ }
+ }
+ return $dest;
+ }
+
+ /**
+ * Get a user object for doing edits, from a request-lifetime cache
+ * False will be returned if the user name specified in the
+ * 'double-redirect-fixer' message is invalid.
+ *
+ * @return User|bool
+ */
+ function getUser() {
+ if ( !self::$user ) {
+ self::$user = User::newFromName( wfMessage( 'double-redirect-fixer' )->inContentLanguage()->text() );
+ # User::newFromName() can return false on a badly configured wiki.
+ if ( self::$user && !self::$user->isLoggedIn() ) {
+ self::$user->addToDatabase();
+ }
+ }
+ return self::$user;
+ }
+}
diff --git a/includes/job/jobs/DuplicateJob.php b/includes/job/jobs/DuplicateJob.php
new file mode 100644
index 00000000..524983b8
--- /dev/null
+++ b/includes/job/jobs/DuplicateJob.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * No-op job that does nothing.
+ *
+ * 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 Cache
+ */
+
+/**
+ * No-op job that does nothing. Used to represent duplicates.
+ *
+ * @ingroup JobQueue
+ */
+final class DuplicateJob extends Job {
+ /**
+ * Callers should use DuplicateJob::newFromJob() instead
+ *
+ * @param $title Title
+ * @param array $params job parameters
+ * @param $id Integer: job id
+ */
+ function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'duplicate', $title, $params, $id );
+ }
+
+ /**
+ * Get a duplicate no-op version of a job
+ *
+ * @param Job $job
+ * @return Job
+ */
+ public static function newFromJob( Job $job ) {
+ $djob = new self( $job->getTitle(), $job->getParams(), $job->getId() );
+ $djob->command = $job->getType();
+ $djob->params = is_array( $djob->params ) ? $djob->params : array();
+ $djob->params = array( 'isDuplicate' => true ) + $djob->params;
+ $djob->metadata = $job->metadata;
+ return $djob;
+ }
+
+ public function run() {
+ return true;
+ }
+}
diff --git a/includes/job/jobs/EmaillingJob.php b/includes/job/jobs/EmaillingJob.php
new file mode 100644
index 00000000..9fbf3124
--- /dev/null
+++ b/includes/job/jobs/EmaillingJob.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Old job for notification emails.
+ *
+ * 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 JobQueue
+ */
+
+/**
+ * Old job used for sending single notification emails;
+ * kept for backwards-compatibility
+ *
+ * @ingroup JobQueue
+ */
+class EmaillingJob extends Job {
+ function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'sendMail', Title::newMainPage(), $params, $id );
+ }
+
+ function run() {
+ $status = UserMailer::send(
+ $this->params['to'],
+ $this->params['from'],
+ $this->params['subj'],
+ $this->params['body'],
+ $this->params['replyto']
+ );
+
+ return $status->isOK();
+ }
+
+}
diff --git a/includes/job/jobs/EnotifNotifyJob.php b/includes/job/jobs/EnotifNotifyJob.php
new file mode 100644
index 00000000..2be05b63
--- /dev/null
+++ b/includes/job/jobs/EnotifNotifyJob.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Job for notification emails.
+ *
+ * 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 JobQueue
+ */
+
+/**
+ * Job for email notification mails
+ *
+ * @ingroup JobQueue
+ */
+class EnotifNotifyJob extends Job {
+
+ function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'enotifNotify', $title, $params, $id );
+ }
+
+ function run() {
+ $enotif = new EmailNotification();
+ // Get the user from ID (rename safe). Anons are 0, so defer to name.
+ if( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
+ $editor = User::newFromId( $this->params['editorID'] );
+ // B/C, only the name might be given.
+ } else {
+ # FIXME: newFromName could return false on a badly configured wiki.
+ $editor = User::newFromName( $this->params['editor'], false );
+ }
+ $enotif->actuallyNotifyOnPageChange(
+ $editor,
+ $this->title,
+ $this->params['timestamp'],
+ $this->params['summary'],
+ $this->params['minorEdit'],
+ $this->params['oldid'],
+ $this->params['watchers'],
+ $this->params['pageStatus']
+ );
+ return true;
+ }
+
+}
diff --git a/includes/job/jobs/HTMLCacheUpdateJob.php b/includes/job/jobs/HTMLCacheUpdateJob.php
new file mode 100644
index 00000000..818c6abf
--- /dev/null
+++ b/includes/job/jobs/HTMLCacheUpdateJob.php
@@ -0,0 +1,254 @@
+<?php
+/**
+ * HTML cache invalidation of all pages linking to a given title.
+ *
+ * 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 Cache
+ */
+
+/**
+ * Job wrapper for HTMLCacheUpdate. Gets run whenever a related
+ * job gets called from the queue.
+ *
+ * This class is designed to work efficiently with small numbers of links, and
+ * to work reasonably well with up to ~10^5 links. Above ~10^6 links, the memory
+ * and time requirements of loading all backlinked IDs in doUpdate() might become
+ * prohibitive. The requirements measured at Wikimedia are approximately:
+ *
+ * memory: 48 bytes per row
+ * time: 16us per row for the query plus processing
+ *
+ * The reason this query is done is to support partitioning of the job
+ * by backlinked ID. The memory issue could be allieviated by doing this query in
+ * batches, but of course LIMIT with an offset is inefficient on the DB side.
+ *
+ * The class is nevertheless a vast improvement on the previous method of using
+ * File::getLinksTo() and Title::touchArray(), which uses about 2KB of memory per
+ * link.
+ *
+ * @ingroup JobQueue
+ */
+class HTMLCacheUpdateJob extends Job {
+ /** @var BacklinkCache */
+ protected $blCache;
+
+ protected $rowsPerJob, $rowsPerQuery;
+
+ /**
+ * Construct a job
+ * @param $title Title: the title linked to
+ * @param array $params job parameters (table, start and end page_ids)
+ * @param $id Integer: job id
+ */
+ function __construct( $title, $params, $id = 0 ) {
+ global $wgUpdateRowsPerJob, $wgUpdateRowsPerQuery;
+
+ parent::__construct( 'htmlCacheUpdate', $title, $params, $id );
+
+ $this->rowsPerJob = $wgUpdateRowsPerJob;
+ $this->rowsPerQuery = $wgUpdateRowsPerQuery;
+ $this->blCache = $title->getBacklinkCache();
+ }
+
+ public function run() {
+ if ( isset( $this->params['start'] ) && isset( $this->params['end'] ) ) {
+ # This is hit when a job is actually performed
+ return $this->doPartialUpdate();
+ } else {
+ # This is hit when the jobs have to be inserted
+ return $this->doFullUpdate();
+ }
+ }
+
+ /**
+ * Update all of the backlinks
+ */
+ protected function doFullUpdate() {
+ # Get an estimate of the number of rows from the BacklinkCache
+ $numRows = $this->blCache->getNumLinks( $this->params['table'] );
+ if ( $numRows > $this->rowsPerJob * 2 ) {
+ # Do fast cached partition
+ $this->insertPartitionJobs();
+ } else {
+ # Get the links from the DB
+ $titleArray = $this->blCache->getLinks( $this->params['table'] );
+ # Check if the row count estimate was correct
+ if ( $titleArray->count() > $this->rowsPerJob * 2 ) {
+ # Not correct, do accurate partition
+ wfDebug( __METHOD__.": row count estimate was incorrect, repartitioning\n" );
+ $this->insertJobsFromTitles( $titleArray );
+ } else {
+ $this->invalidateTitles( $titleArray ); // just do the query
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Update some of the backlinks, defined by a page ID range
+ */
+ protected function doPartialUpdate() {
+ $titleArray = $this->blCache->getLinks(
+ $this->params['table'], $this->params['start'], $this->params['end'] );
+ if ( $titleArray->count() <= $this->rowsPerJob * 2 ) {
+ # This partition is small enough, do the update
+ $this->invalidateTitles( $titleArray );
+ } else {
+ # Partitioning was excessively inaccurate. Divide the job further.
+ # This can occur when a large number of links are added in a short
+ # period of time, say by updating a heavily-used template.
+ $this->insertJobsFromTitles( $titleArray );
+ }
+ return true;
+ }
+
+ /**
+ * Partition the current range given by $this->params['start'] and $this->params['end'],
+ * using a pre-calculated title array which gives the links in that range.
+ * Queue the resulting jobs.
+ *
+ * @param $titleArray array
+ * @param $rootJobParams array
+ * @return void
+ */
+ protected function insertJobsFromTitles( $titleArray, $rootJobParams = array() ) {
+ // Carry over any "root job" information
+ $rootJobParams = $this->getRootJobParams();
+ # We make subpartitions in the sense that the start of the first job
+ # will be the start of the parent partition, and the end of the last
+ # job will be the end of the parent partition.
+ $jobs = array();
+ $start = $this->params['start']; # start of the current job
+ $numTitles = 0;
+ foreach ( $titleArray as $title ) {
+ $id = $title->getArticleID();
+ # $numTitles is now the number of titles in the current job not
+ # including the current ID
+ if ( $numTitles >= $this->rowsPerJob ) {
+ # Add a job up to but not including the current ID
+ $jobs[] = new HTMLCacheUpdateJob( $this->title,
+ array(
+ 'table' => $this->params['table'],
+ 'start' => $start,
+ 'end' => $id - 1
+ ) + $rootJobParams // carry over information for de-duplication
+ );
+ $start = $id;
+ $numTitles = 0;
+ }
+ $numTitles++;
+ }
+ # Last job
+ $jobs[] = new HTMLCacheUpdateJob( $this->title,
+ array(
+ 'table' => $this->params['table'],
+ 'start' => $start,
+ 'end' => $this->params['end']
+ ) + $rootJobParams // carry over information for de-duplication
+ );
+ wfDebug( __METHOD__.": repartitioning into " . count( $jobs ) . " jobs\n" );
+
+ if ( count( $jobs ) < 2 ) {
+ # I don't think this is possible at present, but handling this case
+ # makes the code a bit more robust against future code updates and
+ # avoids a potential infinite loop of repartitioning
+ wfDebug( __METHOD__.": repartitioning failed!\n" );
+ $this->invalidateTitles( $titleArray );
+ } else {
+ JobQueueGroup::singleton()->push( $jobs );
+ }
+ }
+
+ /**
+ * @param $rootJobParams array
+ * @return void
+ */
+ protected function insertPartitionJobs( $rootJobParams = array() ) {
+ // Carry over any "root job" information
+ $rootJobParams = $this->getRootJobParams();
+
+ $batches = $this->blCache->partition( $this->params['table'], $this->rowsPerJob );
+ if ( !count( $batches ) ) {
+ return; // no jobs to insert
+ }
+
+ $jobs = array();
+ foreach ( $batches as $batch ) {
+ list( $start, $end ) = $batch;
+ $jobs[] = new HTMLCacheUpdateJob( $this->title,
+ array(
+ 'table' => $this->params['table'],
+ 'start' => $start,
+ 'end' => $end,
+ ) + $rootJobParams // carry over information for de-duplication
+ );
+ }
+
+ JobQueueGroup::singleton()->push( $jobs );
+ }
+
+ /**
+ * Invalidate an array (or iterator) of Title objects, right now
+ * @param $titleArray array
+ */
+ protected function invalidateTitles( $titleArray ) {
+ global $wgUseFileCache, $wgUseSquid;
+
+ $dbw = wfGetDB( DB_MASTER );
+ $timestamp = $dbw->timestamp();
+
+ # Get all IDs in this query into an array
+ $ids = array();
+ foreach ( $titleArray as $title ) {
+ $ids[] = $title->getArticleID();
+ }
+
+ if ( !$ids ) {
+ return;
+ }
+
+ # Don't invalidated pages that were already invalidated
+ $touchedCond = isset( $this->params['rootJobTimestamp'] )
+ ? array( "page_touched < " .
+ $dbw->addQuotes( $dbw->timestamp( $this->params['rootJobTimestamp'] ) ) )
+ : array();
+
+ # Update page_touched
+ $batches = array_chunk( $ids, $this->rowsPerQuery );
+ foreach ( $batches as $batch ) {
+ $dbw->update( 'page',
+ array( 'page_touched' => $timestamp ),
+ array( 'page_id' => $batch ) + $touchedCond,
+ __METHOD__
+ );
+ }
+
+ # Update squid
+ if ( $wgUseSquid ) {
+ $u = SquidUpdate::newFromTitles( $titleArray );
+ $u->doUpdate();
+ }
+
+ # Update file cache
+ if ( $wgUseFileCache ) {
+ foreach ( $titleArray as $title ) {
+ HTMLFileCache::clearFileCache( $title );
+ }
+ }
+ }
+}
diff --git a/includes/job/jobs/NullJob.php b/includes/job/jobs/NullJob.php
new file mode 100644
index 00000000..d282a8e6
--- /dev/null
+++ b/includes/job/jobs/NullJob.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Degenerate job that does nothing.
+ *
+ * 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 Cache
+ */
+
+/**
+ * Degenerate job that does nothing, but can optionally replace itself
+ * in the queue and/or sleep for a brief time period. These can be used
+ * to represent "no-op" jobs or test lock contention and performance.
+ *
+ * @ingroup JobQueue
+ */
+class NullJob extends Job {
+ /**
+ * @param $title Title (can be anything)
+ * @param array $params job parameters (lives, usleep)
+ * @param $id Integer: job id
+ */
+ function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'null', $title, $params, $id );
+ if ( !isset( $this->params['lives'] ) ) {
+ $this->params['lives'] = 1;
+ }
+ if ( !isset( $this->params['usleep'] ) ) {
+ $this->params['usleep'] = 0;
+ }
+ $this->removeDuplicates = !empty( $this->params['removeDuplicates'] );
+ }
+
+ public function run() {
+ if ( $this->params['usleep'] > 0 ) {
+ usleep( $this->params['usleep'] );
+ }
+ if ( $this->params['lives'] > 1 ) {
+ $params = $this->params;
+ $params['lives']--;
+ $job = new self( $this->title, $params );
+ JobQueueGroup::singleton()->push( $job );
+ }
+ return true;
+ }
+}
diff --git a/includes/job/jobs/PublishStashedFileJob.php b/includes/job/jobs/PublishStashedFileJob.php
new file mode 100644
index 00000000..d3feda28
--- /dev/null
+++ b/includes/job/jobs/PublishStashedFileJob.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * Upload a file from the upload stash into the local file repo.
+ *
+ * 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 Upload
+ */
+
+/**
+ * Upload a file from the upload stash into the local file repo.
+ *
+ * @ingroup Upload
+ */
+class PublishStashedFileJob extends Job {
+ public function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'PublishStashedFile', $title, $params, $id );
+ $this->removeDuplicates = true;
+ }
+
+ public function run() {
+ $scope = RequestContext::importScopedSession( $this->params['session'] );
+ $context = RequestContext::getMain();
+ try {
+ $user = $context->getUser();
+ if ( !$user->isLoggedIn() ) {
+ $this->setLastError( "Could not load the author user from session." );
+ return false;
+ }
+
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Poll', 'stage' => 'publish', 'status' => Status::newGood() )
+ );
+
+ $upload = new UploadFromStash( $user );
+ // @TODO: initialize() causes a GET, ideally we could frontload the antivirus
+ // checks and anything else to the stash stage (which includes concatenation and
+ // the local file is thus already there). That way, instead of GET+PUT, there could
+ // just be a COPY operation from the stash to the public zone.
+ $upload->initialize( $this->params['filekey'], $this->params['filename'] );
+
+ // Check if the local file checks out (this is generally a no-op)
+ $verification = $upload->verifyUpload();
+ if ( $verification['status'] !== UploadBase::OK ) {
+ $status = Status::newFatal( 'verification-error' );
+ $status->value = array( 'verification' => $verification );
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
+ );
+ $this->setLastError( "Could not verify upload." );
+ return false;
+ }
+
+ // Upload the stashed file to a permanent location
+ $status = $upload->performUpload(
+ $this->params['comment'],
+ $this->params['text'],
+ $this->params['watch'],
+ $user
+ );
+ if ( !$status->isGood() ) {
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array( 'result' => 'Failure', 'stage' => 'publish', 'status' => $status )
+ );
+ $this->setLastError( $status->getWikiText() );
+ return false;
+ }
+
+ // Build the image info array while we have the local reference handy
+ $apiMain = new ApiMain(); // dummy object (XXX)
+ $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
+
+ // Cleanup any temporary local file
+ $upload->cleanupTempFile();
+
+ // Cache the info so the user doesn't have to wait forever to get the final info
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array(
+ 'result' => 'Success',
+ 'stage' => 'publish',
+ 'filename' => $upload->getLocalFile()->getName(),
+ 'imageinfo' => $imageInfo,
+ 'status' => Status::newGood()
+ )
+ );
+ } catch ( MWException $e ) {
+ UploadBase::setSessionStatus(
+ $this->params['filekey'],
+ array(
+ 'result' => 'Failure',
+ 'stage' => 'publish',
+ 'status' => Status::newFatal( 'api-error-publishfailed' )
+ )
+ );
+ $this->setLastError( get_class( $e ) . ": " . $e->getText() );
+ return false;
+ }
+ return true;
+ }
+
+ public function getDeduplicationInfo() {
+ $info = parent::getDeduplicationInfo();
+ if ( is_array( $info['params'] ) ) {
+ $info['params'] = array( 'filekey' => $info['params']['filekey'] );
+ }
+ return $info;
+ }
+
+ public function allowRetries() {
+ return false;
+ }
+}
diff --git a/includes/job/jobs/RefreshLinksJob.php b/includes/job/jobs/RefreshLinksJob.php
new file mode 100644
index 00000000..9dbe8278
--- /dev/null
+++ b/includes/job/jobs/RefreshLinksJob.php
@@ -0,0 +1,226 @@
+<?php
+/**
+ * Job to update links for a given title.
+ *
+ * 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 JobQueue
+ */
+
+/**
+ * Background job to update links for a given title.
+ *
+ * @ingroup JobQueue
+ */
+class RefreshLinksJob extends Job {
+ function __construct( $title, $params = '', $id = 0 ) {
+ parent::__construct( 'refreshLinks', $title, $params, $id );
+ $this->removeDuplicates = true; // job is expensive
+ }
+
+ /**
+ * Run a refreshLinks job
+ * @return boolean success
+ */
+ function run() {
+ wfProfileIn( __METHOD__ );
+
+ $linkCache = LinkCache::singleton();
+ $linkCache->clear();
+
+ if ( is_null( $this->title ) ) {
+ $this->error = "refreshLinks: Invalid title";
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ # Wait for the DB of the current/next slave DB handle to catch up to the master.
+ # This way, we get the correct page_latest for templates or files that just changed
+ # milliseconds ago, having triggered this job to begin with.
+ if ( isset( $this->params['masterPos'] ) ) {
+ wfGetLB()->waitFor( $this->params['masterPos'] );
+ }
+
+ $revision = Revision::newFromTitle( $this->title, false, Revision::READ_NORMAL );
+ if ( !$revision ) {
+ $this->error = 'refreshLinks: Article not found "' .
+ $this->title->getPrefixedDBkey() . '"';
+ wfProfileOut( __METHOD__ );
+ return false; // XXX: what if it was just deleted?
+ }
+
+ self::runForTitleInternal( $this->title, $revision, __METHOD__ );
+
+ wfProfileOut( __METHOD__ );
+ return true;
+ }
+
+ /**
+ * @return Array
+ */
+ public function getDeduplicationInfo() {
+ $info = parent::getDeduplicationInfo();
+ // Don't let highly unique "masterPos" values ruin duplicate detection
+ if ( is_array( $info['params'] ) ) {
+ unset( $info['params']['masterPos'] );
+ }
+ return $info;
+ }
+
+ /**
+ * @param $title Title
+ * @param $revision Revision
+ * @param $fname string
+ * @return void
+ */
+ public static function runForTitleInternal( Title $title, Revision $revision, $fname ) {
+ wfProfileIn( $fname );
+ $content = $revision->getContent( Revision::RAW );
+
+ if ( !$content ) {
+ // if there is no content, pretend the content is empty
+ $content = $revision->getContentHandler()->makeEmptyContent();
+ }
+
+ // Revision ID must be passed to the parser output to get revision variables correct
+ $parserOutput = $content->getParserOutput( $title, $revision->getId(), null, false );
+
+ $updates = $content->getSecondaryDataUpdates( $title, null, false, $parserOutput );
+ DataUpdate::runUpdates( $updates );
+ wfProfileOut( $fname );
+ }
+}
+
+/**
+ * Background job to update links for a given title.
+ * Newer version for high use templates.
+ *
+ * @ingroup JobQueue
+ */
+class RefreshLinksJob2 extends Job {
+ function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'refreshLinks2', $title, $params, $id );
+ }
+
+ /**
+ * Run a refreshLinks2 job
+ * @return boolean success
+ */
+ function run() {
+ global $wgUpdateRowsPerJob;
+
+ wfProfileIn( __METHOD__ );
+
+ $linkCache = LinkCache::singleton();
+ $linkCache->clear();
+
+ if ( is_null( $this->title ) ) {
+ $this->error = "refreshLinks2: Invalid title";
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ // Back compat for pre-r94435 jobs
+ $table = isset( $this->params['table'] ) ? $this->params['table'] : 'templatelinks';
+
+ // Avoid slave lag when fetching templates.
+ // When the outermost job is run, we know that the caller that enqueued it must have
+ // committed the relevant changes to the DB by now. At that point, record the master
+ // position and pass it along as the job recursively breaks into smaller range jobs.
+ // Hopefully, when leaf jobs are popped, the slaves will have reached that position.
+ if ( isset( $this->params['masterPos'] ) ) {
+ $masterPos = $this->params['masterPos'];
+ } elseif ( wfGetLB()->getServerCount() > 1 ) {
+ $masterPos = wfGetLB()->getMasterPos();
+ } else {
+ $masterPos = false;
+ }
+
+ $tbc = $this->title->getBacklinkCache();
+
+ $jobs = array(); // jobs to insert
+ if ( isset( $this->params['start'] ) && isset( $this->params['end'] ) ) {
+ # This is a partition job to trigger the insertion of leaf jobs...
+ $jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
+ } else {
+ # This is a base job to trigger the insertion of partitioned jobs...
+ if ( $tbc->getNumLinks( $table ) <= $wgUpdateRowsPerJob ) {
+ # Just directly insert the single per-title jobs
+ $jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
+ } else {
+ # Insert the partition jobs to make per-title jobs
+ foreach ( $tbc->partition( $table, $wgUpdateRowsPerJob ) as $batch ) {
+ list( $start, $end ) = $batch;
+ $jobs[] = new RefreshLinksJob2( $this->title,
+ array(
+ 'table' => $table,
+ 'start' => $start,
+ 'end' => $end,
+ 'masterPos' => $masterPos,
+ ) + $this->getRootJobParams() // carry over information for de-duplication
+ );
+ }
+ }
+ }
+
+ if ( count( $jobs ) ) {
+ JobQueueGroup::singleton()->push( $jobs );
+ }
+
+ wfProfileOut( __METHOD__ );
+ return true;
+ }
+
+ /**
+ * @param $table string
+ * @param $masterPos mixed
+ * @return Array
+ */
+ protected function getSingleTitleJobs( $table, $masterPos ) {
+ # The "start"/"end" fields are not set for the base jobs
+ $start = isset( $this->params['start'] ) ? $this->params['start'] : false;
+ $end = isset( $this->params['end'] ) ? $this->params['end'] : false;
+ $titles = $this->title->getBacklinkCache()->getLinks( $table, $start, $end );
+ # Convert into single page refresh links jobs.
+ # This handles well when in sapi mode and is useful in any case for job
+ # de-duplication. If many pages use template A, and that template itself
+ # uses template B, then an edit to both will create many duplicate jobs.
+ # Roughly speaking, for each page, one of the "RefreshLinksJob" jobs will
+ # get run first, and when it does, it will remove the duplicates. Of course,
+ # one page could have its job popped when the other page's job is still
+ # buried within the logic of a refreshLinks2 job.
+ $jobs = array();
+ foreach ( $titles as $title ) {
+ $jobs[] = new RefreshLinksJob( $title,
+ array( 'masterPos' => $masterPos ) + $this->getRootJobParams()
+ ); // carry over information for de-duplication
+ }
+ return $jobs;
+ }
+
+ /**
+ * @return Array
+ */
+ public function getDeduplicationInfo() {
+ $info = parent::getDeduplicationInfo();
+ // Don't let highly unique "masterPos" values ruin duplicate detection
+ if ( is_array( $info['params'] ) ) {
+ unset( $info['params']['masterPos'] );
+ }
+ return $info;
+ }
+}
diff --git a/includes/job/jobs/UploadFromUrlJob.php b/includes/job/jobs/UploadFromUrlJob.php
new file mode 100644
index 00000000..87549140
--- /dev/null
+++ b/includes/job/jobs/UploadFromUrlJob.php
@@ -0,0 +1,179 @@
+<?php
+/**
+ * Job for asynchronous upload-by-url.
+ *
+ * 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 JobQueue
+ */
+
+/**
+ * Job for asynchronous upload-by-url.
+ *
+ * This job is in fact an interface to UploadFromUrl, which is designed such
+ * that it does not require any globals. If it does, fix it elsewhere, do not
+ * add globals in here.
+ *
+ * @ingroup JobQueue
+ */
+class UploadFromUrlJob extends Job {
+ const SESSION_KEYNAME = 'wsUploadFromUrlJobData';
+
+ /**
+ * @var UploadFromUrl
+ */
+ public $upload;
+
+ /**
+ * @var User
+ */
+ protected $user;
+
+ public function __construct( $title, $params, $id = 0 ) {
+ parent::__construct( 'uploadFromUrl', $title, $params, $id );
+ }
+
+ public function run() {
+ # Initialize this object and the upload object
+ $this->upload = new UploadFromUrl();
+ $this->upload->initialize(
+ $this->title->getText(),
+ $this->params['url'],
+ false
+ );
+ $this->user = User::newFromName( $this->params['userName'] );
+
+ # Fetch the file
+ $status = $this->upload->fetchFile();
+ if ( !$status->isOk() ) {
+ $this->leaveMessage( $status );
+ return true;
+ }
+
+ # Verify upload
+ $result = $this->upload->verifyUpload();
+ if ( $result['status'] != UploadBase::OK ) {
+ $status = $this->upload->convertVerifyErrorToStatus( $result );
+ $this->leaveMessage( $status );
+ return true;
+ }
+
+ # Check warnings
+ if ( !$this->params['ignoreWarnings'] ) {
+ $warnings = $this->upload->checkWarnings();
+ if ( $warnings ) {
+
+ # Stash the upload
+ $key = $this->upload->stashFile();
+
+ if ( $this->params['leaveMessage'] ) {
+ $this->user->leaveUserMessage(
+ wfMessage( 'upload-warning-subj' )->text(),
+ wfMessage( 'upload-warning-msg',
+ $key,
+ $this->params['url'] )->text()
+ );
+ } else {
+ wfSetupSession( $this->params['sessionId'] );
+ $this->storeResultInSession( 'Warning',
+ 'warnings', $warnings );
+ session_write_close();
+ }
+
+ return true;
+ }
+ }
+
+ # Perform the upload
+ $status = $this->upload->performUpload(
+ $this->params['comment'],
+ $this->params['pageText'],
+ $this->params['watch'],
+ $this->user
+ );
+ $this->leaveMessage( $status );
+ return true;
+
+ }
+
+ /**
+ * Leave a message on the user talk page or in the session according to
+ * $params['leaveMessage'].
+ *
+ * @param $status Status
+ */
+ protected function leaveMessage( $status ) {
+ if ( $this->params['leaveMessage'] ) {
+ if ( $status->isGood() ) {
+ $this->user->leaveUserMessage( wfMessage( 'upload-success-subj' )->text(),
+ wfMessage( 'upload-success-msg',
+ $this->upload->getTitle()->getText(),
+ $this->params['url']
+ )->text() );
+ } else {
+ $this->user->leaveUserMessage( wfMessage( 'upload-failure-subj' )->text(),
+ wfMessage( 'upload-failure-msg',
+ $status->getWikiText(),
+ $this->params['url']
+ )->text() );
+ }
+ } else {
+ wfSetupSession( $this->params['sessionId'] );
+ if ( $status->isOk() ) {
+ $this->storeResultInSession( 'Success',
+ 'filename', $this->upload->getLocalFile()->getName() );
+ } else {
+ $this->storeResultInSession( 'Failure',
+ 'errors', $status->getErrorsArray() );
+ }
+ session_write_close();
+ }
+ }
+
+ /**
+ * Store a result in the session data. Note that the caller is responsible
+ * for appropriate session_start and session_write_close calls.
+ *
+ * @param string $result the result (Success|Warning|Failure)
+ * @param string $dataKey the key of the extra data
+ * @param $dataValue Mixed: the extra data itself
+ */
+ protected function storeResultInSession( $result, $dataKey, $dataValue ) {
+ $session =& self::getSessionData( $this->params['sessionKey'] );
+ $session['result'] = $result;
+ $session[$dataKey] = $dataValue;
+ }
+
+ /**
+ * Initialize the session data. Sets the intial result to queued.
+ */
+ public function initializeSessionData() {
+ $session =& self::getSessionData( $this->params['sessionKey'] );
+ $$session['result'] = 'Queued';
+ }
+
+ /**
+ * @param $key
+ * @return mixed
+ */
+ public static function &getSessionData( $key ) {
+ if ( !isset( $_SESSION[self::SESSION_KEYNAME][$key] ) ) {
+ $_SESSION[self::SESSION_KEYNAME][$key] = array();
+ }
+ return $_SESSION[self::SESSION_KEYNAME][$key];
+ }
+}
diff --git a/includes/json/FormatJson.php b/includes/json/FormatJson.php
index f67700c9..eececcba 100644
--- a/includes/json/FormatJson.php
+++ b/includes/json/FormatJson.php
@@ -1,6 +1,6 @@
<?php
/**
- * Simple wrapper for json_econde and json_decode that falls back on Services_JSON class.
+ * Simple wrapper for json_encode and json_decode that falls back on Services_JSON class.
*
* 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
@@ -31,28 +31,23 @@ class FormatJson {
* Returns the JSON representation of a value.
*
* @param $value Mixed: the value being encoded. Can be any type except a resource.
- * @param $isHtml Boolean
- *
- * @todo FIXME: "$isHtml" parameter's purpose is not documented. It appears to
- * map to a parameter labeled "pretty-print output with indents and
- * newlines" in Services_JSON::encode(), which has no string relation
- * to HTML output.
+ * @param $pretty Boolean: If true, adds non-significant whitespace to improve readability.
*
* @return string
*/
- public static function encode( $value, $isHtml = false ) {
- if ( !function_exists( 'json_encode' ) || ( $isHtml && version_compare( PHP_VERSION, '5.4.0', '<' ) ) ) {
+ public static function encode( $value, $pretty = false ) {
+ if ( !function_exists( 'json_encode' ) || ( $pretty && version_compare( PHP_VERSION, '5.4.0', '<' ) ) ) {
$json = new Services_JSON();
- return $json->encode( $value, $isHtml );
+ return $json->encode( $value, $pretty );
} else {
- return json_encode( $value, $isHtml ? JSON_PRETTY_PRINT : 0 );
+ return json_encode( $value, $pretty ? JSON_PRETTY_PRINT : 0 );
}
}
/**
* Decodes a JSON string.
*
- * @param $value String: the json string being decoded.
+ * @param string $value the json string being decoded.
* @param $assoc Boolean: when true, returned objects will be converted into associative arrays.
*
* @return Mixed: the value encoded in json in appropriate PHP type.
diff --git a/includes/json/Services_JSON.php b/includes/json/Services_JSON.php
index 398ed6a2..b7c101a1 100644
--- a/includes/json/Services_JSON.php
+++ b/includes/json/Services_JSON.php
@@ -100,7 +100,7 @@ define('SERVICES_JSON_SUPPRESS_ERRORS', 32);
* // create a new instance of Services_JSON
* $json = new Services_JSON();
*
- * // convert a complexe value to JSON notation, and send it to the browser
+ * // convert a complex value to JSON notation, and send it to the browser
* $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
* $output = $json->encode($value);
*
@@ -155,9 +155,9 @@ class Services_JSON
*
* Normally should be handled by mb_convert_encoding, but
* provides a slower PHP-only method for installations
- * that lack the multibye string extension.
+ * that lack the multibyte string extension.
*
- * @param $utf16 String: UTF-16 character
+ * @param string $utf16 UTF-16 character
* @return String: UTF-8 character
* @access private
*/
@@ -210,9 +210,9 @@ class Services_JSON
*
* Normally should be handled by mb_convert_encoding, but
* provides a slower PHP-only method for installations
- * that lack the multibye string extension.
+ * that lack the multibyte string extension.
*
- * @param $utf8 String: UTF-8 character
+ * @param string $utf8 UTF-8 character
* @return String: UTF-16 character
* @access private
*/
@@ -268,7 +268,7 @@ class Services_JSON
*
* @param $var Mixed: any number, boolean, string, array, or object to be encoded.
* see argument 1 to Services_JSON() above for array-parsing behavior.
- * if var is a strng, note that encode() always expects it
+ * if var is a string, note that encode() always expects it
* to be in ASCII or UTF-8 format!
* @param $pretty Boolean: pretty-print output with indents and newlines
*
@@ -283,12 +283,12 @@ class Services_JSON
return $this->encode2($var);
}
- /**
+ /**
* encodes an arbitrary variable into JSON format
*
* @param $var Mixed: any number, boolean, string, array, or object to be encoded.
* see argument 1 to Services_JSON() above for array-parsing behavior.
- * if var is a strng, note that encode() always expects it
+ * if var is a string, note that encode() always expects it
* to be in ASCII or UTF-8 format!
*
* @return mixed JSON string representation of input var or an error if a problem occurs
@@ -424,7 +424,7 @@ class Services_JSON
*/
// treat as a JSON object
- if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
+ if (is_array($var) && count($var) && (array_keys($var) !== range(0, count($var) - 1))) {
$this->indent++;
$properties = array_map(array($this, 'name_value'),
array_keys($var),
@@ -480,7 +480,7 @@ class Services_JSON
/**
* array-walking function for use in generating JSON-formatted name-value pairs
*
- * @param $name String: name of key to use
+ * @param string $name name of key to use
* @param $value Mixed: reference to an array element to be encoded
*
* @return String: JSON-formatted name-value pair, like '"name":value'
@@ -500,7 +500,7 @@ class Services_JSON
/**
* reduce a string by removing leading and trailing comments and whitespace
*
- * @param $str String: string value to strip of comments and whitespace
+ * @param string $str string value to strip of comments and whitespace
*
* @return String: string value stripped of comments and whitespace
* @access private
@@ -527,7 +527,7 @@ class Services_JSON
/**
* decodes a JSON string into appropriate variable
*
- * @param $str String: JSON-formatted string
+ * @param string $str JSON-formatted string
*
* @return mixed number, boolean, string, array, or object
* corresponding to given JSON input string.
diff --git a/includes/libs/CSSJanus.php b/includes/libs/CSSJanus.php
index 4ebbc497..fb1e9a4c 100644
--- a/includes/libs/CSSJanus.php
+++ b/includes/libs/CSSJanus.php
@@ -57,6 +57,7 @@ class CSSJanus {
'lookahead_not_open_brace' => null,
'lookahead_not_closing_paren' => null,
'lookahead_for_closing_paren' => null,
+ 'lookahead_not_letter' => '(?![a-zA-Z])',
'lookbehind_not_letter' => '(?<![a-zA-Z])',
'chars_within_selector' => '[^\}]*?',
'noflip_annotation' => '\/\*\s*@noflip\s*\*\/',
@@ -104,8 +105,8 @@ class CSSJanus {
$patterns['noflip_class'] = "/({$patterns['noflip_annotation']}{$patterns['chars_within_selector']}})/i";
$patterns['direction_ltr'] = "/({$patterns['direction']})ltr/i";
$patterns['direction_rtl'] = "/({$patterns['direction']})rtl/i";
- $patterns['left'] = "/{$patterns['lookbehind_not_letter']}(left){$patterns['lookahead_not_closing_paren']}{$patterns['lookahead_not_open_brace']}/i";
- $patterns['right'] = "/{$patterns['lookbehind_not_letter']}(right){$patterns['lookahead_not_closing_paren']}{$patterns['lookahead_not_open_brace']}/i";
+ $patterns['left'] = "/{$patterns['lookbehind_not_letter']}(left){$patterns['lookahead_not_letter']}{$patterns['lookahead_not_closing_paren']}{$patterns['lookahead_not_open_brace']}/i";
+ $patterns['right'] = "/{$patterns['lookbehind_not_letter']}(right){$patterns['lookahead_not_letter']}{$patterns['lookahead_not_closing_paren']}{$patterns['lookahead_not_open_brace']}/i";
$patterns['left_in_url'] = "/{$patterns['lookbehind_not_letter']}(left){$patterns['lookahead_for_closing_paren']}/i";
$patterns['right_in_url'] = "/{$patterns['lookbehind_not_letter']}(right){$patterns['lookahead_for_closing_paren']}/i";
$patterns['ltr_in_url'] = "/{$patterns['lookbehind_not_letter']}(ltr){$patterns['lookahead_for_closing_paren']}/i";
@@ -122,7 +123,7 @@ class CSSJanus {
/**
* Transform an LTR stylesheet to RTL
- * @param $css String: stylesheet to transform
+ * @param string $css stylesheet to transform
* @param $swapLtrRtlInURL Boolean: If true, swap 'ltr' and 'rtl' in URLs
* @param $swapLeftRightInURL Boolean: If true, swap 'left' and 'right' in URLs
* @return string Transformed stylesheet
@@ -304,8 +305,8 @@ class CSSJanus_Tokenizer {
/**
* Constructor
- * @param $regex string Regular expression whose matches to replace by a token.
- * @param $token string Token
+ * @param string $regex Regular expression whose matches to replace by a token.
+ * @param string $token Token
*/
public function __construct( $regex, $token ) {
$this->regex = $regex;
@@ -316,7 +317,7 @@ class CSSJanus_Tokenizer {
/**
* Replace all occurrences of $regex in $str with a token and remember
* the original strings.
- * @param $str String to tokenize
+ * @param string $str to tokenize
* @return string Tokenized string
*/
public function tokenize( $str ) {
@@ -335,7 +336,7 @@ class CSSJanus_Tokenizer {
/**
* Replace tokens with their originals. If multiple strings were tokenized, it's important they be
* detokenized in exactly the SAME ORDER.
- * @param $str String: previously run through tokenize()
+ * @param string $str previously run through tokenize()
* @return string Original string
*/
public function detokenize( $str ) {
diff --git a/includes/libs/CSSMin.php b/includes/libs/CSSMin.php
index fc75cdcc..8b0e2873 100644
--- a/includes/libs/CSSMin.php
+++ b/includes/libs/CSSMin.php
@@ -59,8 +59,8 @@ class CSSMin {
/**
* Gets a list of local file paths which are referenced in a CSS style sheet
*
- * @param $source string CSS data to remap
- * @param $path string File path where the source was read from (optional)
+ * @param string $source CSS data to remap
+ * @param string $path File path where the source was read from (optional)
* @return array List of local file references
*/
public static function getLocalFileReferences( $source, $path = null ) {
@@ -115,10 +115,10 @@ class CSSMin {
* Remaps CSS URL paths and automatically embeds data URIs for URL rules
* preceded by an /* @embed * / comment
*
- * @param $source string CSS data to remap
- * @param $local string File path where the source was read from
- * @param $remote string URL path to the file
- * @param $embedData bool If false, never do any data URI embedding, even if / * @embed * / is found
+ * @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
* @return string Remapped CSS data
*/
public static function remap( $source, $local, $remote, $embedData = true ) {
@@ -219,7 +219,7 @@ class CSSMin {
/**
* Removes whitespace from CSS data
*
- * @param $css string CSS data to minify
+ * @param string $css CSS data to minify
* @return string Minified CSS data
*/
public static function minify( $css ) {
diff --git a/includes/libs/GenericArrayObject.php b/includes/libs/GenericArrayObject.php
index b4b9d610..d77d8ad6 100644
--- a/includes/libs/GenericArrayObject.php
+++ b/includes/libs/GenericArrayObject.php
@@ -28,9 +28,8 @@
* @since 1.20
*
* @file
- * @ingroup Diff
*
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
abstract class GenericArrayObject extends ArrayObject {
@@ -42,7 +41,7 @@ abstract class GenericArrayObject extends ArrayObject {
*
* @return string
*/
- public abstract function getObjectType();
+ abstract public function getObjectType();
/**
* @see SiteList::getNewOffset()
@@ -61,13 +60,11 @@ abstract class GenericArrayObject extends ArrayObject {
* @return integer
*/
protected function getNewOffset() {
- while ( true ) {
- if ( !$this->offsetExists( $this->indexOffset ) ) {
- return $this->indexOffset;
- }
-
+ while ( $this->offsetExists( $this->indexOffset ) ) {
$this->indexOffset++;
}
+
+ return $this->indexOffset;
}
/**
@@ -194,7 +191,7 @@ abstract class GenericArrayObject extends ArrayObject {
/**
* Returns an array holding all the data that should go into serialization calls.
* This is intended to allow overloading without having to reimplement the
- * behaviour of this base class.
+ * behavior of this base class.
*
* @since 1.20
*
diff --git a/includes/libs/IEContentAnalyzer.php b/includes/libs/IEContentAnalyzer.php
index cfc7f536..7f461a03 100644
--- a/includes/libs/IEContentAnalyzer.php
+++ b/includes/libs/IEContentAnalyzer.php
@@ -329,9 +329,9 @@ class IEContentAnalyzer {
* Get the MIME types from getMimesFromData(), but convert the result from IE's
* idiosyncratic private types into something other apps will understand.
*
- * @param $fileName String: the file name (unused at present)
- * @param $chunk String: the first 256 bytes of the file
- * @param $proposed String: the MIME type proposed by the server
+ * @param string $fileName the file name (unused at present)
+ * @param string $chunk the first 256 bytes of the file
+ * @param string $proposed the MIME type proposed by the server
*
* @return Array: map of IE version to detected mime type
*/
@@ -367,9 +367,9 @@ class IEContentAnalyzer {
/**
* Get the untranslated MIME types for all known versions
*
- * @param $fileName String: the file name (unused at present)
- * @param $chunk String: the first 256 bytes of the file
- * @param $proposed String: the MIME type proposed by the server
+ * @param string $fileName the file name (unused at present)
+ * @param string $chunk the first 256 bytes of the file
+ * @param string $proposed the MIME type proposed by the server
*
* @return Array: map of IE version to detected mime type
*/
@@ -848,4 +848,3 @@ class IEContentAnalyzer {
return 'unknown';
}
}
-
diff --git a/includes/libs/IEUrlExtension.php b/includes/libs/IEUrlExtension.php
index e9cfa997..79387e63 100644
--- a/includes/libs/IEUrlExtension.php
+++ b/includes/libs/IEUrlExtension.php
@@ -55,8 +55,8 @@ class IEUrlExtension {
*
* If the a variable is unset in $_SERVER, it should be unset in $vars.
*
- * @param $vars array A subset of $_SERVER.
- * @param $extWhitelist array Extensions which are allowed, assumed harmless.
+ * @param array $vars A subset of $_SERVER.
+ * @param array $extWhitelist Extensions which are allowed, assumed harmless.
* @return bool
*/
public static function areServerVarsBad( $vars, $extWhitelist = array() ) {
@@ -92,8 +92,8 @@ class IEUrlExtension {
* Given a right-hand portion of a URL, determine whether IE would detect
* a potentially harmful file extension.
*
- * @param $urlPart string The right-hand portion of a URL
- * @param $extWhitelist array An array of file extensions which may occur in this
+ * @param string $urlPart The right-hand portion of a URL
+ * @param array $extWhitelist An array of file extensions which may occur in this
* URL, and which should be allowed.
* @return bool
*/
@@ -187,7 +187,7 @@ class IEUrlExtension {
* - if we find a possible extension followed by a dot or another illegal
* character, we ignore it and continue searching
*
- * @param $url string URL
+ * @param string $url URL
* @return mixed Detected extension (string), or false if none found
*/
public static function findIE6Extension( $url ) {
@@ -245,7 +245,7 @@ class IEUrlExtension {
* whether the script filename has been obscured.
*
* The function returns false if the server is not known to have this
- * behaviour. Microsoft IIS in particular is known to decode escaped script
+ * behavior. Microsoft IIS in particular is known to decode escaped script
* filenames.
*
* SERVER_SOFTWARE typically contains either a plain string such as "Zeus",
diff --git a/includes/libs/JavaScriptMinifier.php b/includes/libs/JavaScriptMinifier.php
index 0b4be9ae..998805ae 100644
--- a/includes/libs/JavaScriptMinifier.php
+++ b/includes/libs/JavaScriptMinifier.php
@@ -59,7 +59,7 @@ class JavaScriptMinifier {
const TYPE_DO = 15; // keywords: case, var, finally, else, do, try
const TYPE_FUNC = 16; // keywords: function
const TYPE_LITERAL = 17; // all literals, identifiers and unrecognised tokens
-
+
// Sanity limit to avoid excessive memory usage
const STACK_LIMIT = 1000;
@@ -72,9 +72,9 @@ class JavaScriptMinifier {
* literals (e.g. quoted strings) longer than $maxLineLength are encountered
* or when required to guard against semicolon insertion.
*
- * @param $s String JavaScript code to minify
- * @param $statementsOnOwnLine Bool Whether to put each statement on its own line
- * @param $maxLineLength Int Maximum length of a single line, or -1 for no maximum.
+ * @param string $s JavaScript code to minify
+ * @param bool $statementsOnOwnLine Whether to put each statement on its own line
+ * @param int $maxLineLength Maximum length of a single line, or -1 for no maximum.
* @return String Minified code
*/
public static function minify( $s, $statementsOnOwnLine = false, $maxLineLength = 1000 ) {
@@ -385,7 +385,7 @@ class JavaScriptMinifier {
self::TYPE_LITERAL => true
)
);
-
+
// Rules for when newlines should be inserted if
// $statementsOnOwnLine is enabled.
// $newlineBefore is checked before switching state,
@@ -514,7 +514,7 @@ class JavaScriptMinifier {
return self::parseError($s, $end, 'Number with several E' );
}
$end++;
-
+
// + sign is optional; - sign is required.
$end += strspn( $s, '-+', $end );
$len = strspn( $s, '0123456789', $end );
@@ -564,13 +564,13 @@ class JavaScriptMinifier {
$out .= ' ';
$lineLength++;
}
-
+
$out .= $token;
$lineLength += $end - $pos; // += strlen( $token )
$last = $s[$end - 1];
$pos = $end;
$newlineFound = false;
-
+
// Output a newline after the token if required
// This is checked before AND after switching state
$newlineAdded = false;
@@ -589,7 +589,7 @@ class JavaScriptMinifier {
} elseif( isset( $goto[$state][$type] ) ) {
$state = $goto[$state][$type];
}
-
+
// Check for newline insertion again
if ( $statementsOnOwnLine && !$newlineAdded && isset( $newlineAfter[$state][$type] ) ) {
$out .= "\n";
@@ -598,7 +598,7 @@ class JavaScriptMinifier {
}
return $out;
}
-
+
static function parseError($fullJavascript, $position, $errorMsg) {
// TODO: Handle the error: trigger_error, throw exception, return false...
return false;
diff --git a/includes/libs/jsminplus.php b/includes/libs/jsminplus.php
index 7c4e32bd..f250217f 100644
--- a/includes/libs/jsminplus.php
+++ b/includes/libs/jsminplus.php
@@ -256,7 +256,7 @@ class JSMinPlus
}
elseif ($type == KEYWORD_VAR && $type == $lastType)
{
- // mutiple var-statements can go into one
+ // multiple var-statements can go into one
$t = ',' . substr($t, 4);
}
else
@@ -298,7 +298,7 @@ class JSMinPlus
if ($elsePart)
{
- // be carefull and always make a block out of the thenPart; could be more optimized but is a lot of trouble
+ // be careful and always make a block out of the thenPart; could be more optimized but is a lot of trouble
if ($thenPart != ';' && $thenPart[0] != '{')
$thenPart = '{' . $thenPart . '}';
@@ -521,7 +521,7 @@ class JSMinPlus
break;
case TOKEN_STRING:
- //combine concatted strings with same quotestyle
+ //combine concatenated strings with same quote style
if ($n->type == OP_PLUS && substr($left, -1) == $right[0])
{
$s = substr($left, 0, -1) . substr($right, 1);
diff --git a/includes/limit.sh b/includes/limit.sh
new file mode 100644
index 00000000..bc1988de
--- /dev/null
+++ b/includes/limit.sh
@@ -0,0 +1,102 @@
+#!/bin/bash
+#
+# Resource limiting wrapper for command execution
+#
+# Why is this in shell script? Because bash has a setrlimit() wrapper
+# and is available on most Linux systems. If Perl was distributed with
+# BSD::Resource included, we would happily use that instead, but it isn't.
+
+MW_CPU_LIMIT=0
+MW_CGROUP=
+MW_MEM_LIMIT=0
+MW_FILE_SIZE_LIMIT=0
+MW_WALL_CLOCK_LIMIT=0
+
+# Override settings
+eval "$2"
+
+if [ "$MW_CPU_LIMIT" -gt 0 ]; then
+ ulimit -t "$MW_CPU_LIMIT"
+fi
+if [ "$MW_MEM_LIMIT" -gt 0 ]; then
+ if [ -n "$MW_CGROUP" ]; then
+ # Create cgroup
+ if ! mkdir -m 0700 "$MW_CGROUP"/$$; then
+ echo "limit.sh: failed to create the cgroup." 1>&2
+ exit 1
+ fi
+ echo $$ > "$MW_CGROUP"/$$/tasks
+ if [ -n "$MW_CGROUP_NOTIFY" ]; then
+ echo "1" > "$MW_CGROUP"/$$/notify_on_release
+ fi
+ # Memory
+ echo $(($MW_MEM_LIMIT*1024)) > "$MW_CGROUP"/$$/memory.limit_in_bytes
+ # Memory+swap
+ echo $(($MW_MEM_LIMIT*1024)) > "$MW_CGROUP"/$$/memory.memsw.limit_in_bytes
+ else
+ ulimit -v "$MW_MEM_LIMIT"
+ fi
+else
+ MW_CGROUP=""
+fi
+if [ "$MW_FILE_SIZE_LIMIT" -gt 0 ]; then
+ ulimit -f "$MW_FILE_SIZE_LIMIT"
+fi
+if [ "$MW_WALL_CLOCK_LIMIT" -gt 0 -a -x "/usr/bin/timeout" ]; then
+ /usr/bin/timeout $MW_WALL_CLOCK_LIMIT /bin/bash -c "$1"
+ STATUS="$?"
+ if [ "$STATUS" == 124 ]; then
+ echo "limit.sh: timed out." 1>&2
+ fi
+else
+ eval "$1"
+ STATUS="$?"
+fi
+
+# Clean up cgroup
+cleanup() {
+ # First we have to move the current task into a "garbage" group, otherwise
+ # the cgroup will not be empty, and attempting to remove it will fail with
+ # "Device or resource busy"
+ if [ -w "$MW_CGROUP"/tasks ]; then
+ GARBAGE="$MW_CGROUP"
+ else
+ GARBAGE="$MW_CGROUP"/garbage-"$USER"
+ if [ ! -e "$GARBAGE" ]; then
+ mkdir -m 0700 "$GARBAGE"
+ fi
+ fi
+ echo $BASHPID > "$GARBAGE"/tasks
+
+ # Suppress errors in case the cgroup has disappeared due to a release script
+ rmdir "$MW_CGROUP"/$$ 2>/dev/null
+}
+
+updateTaskCount() {
+ # There are lots of ways to count lines in a file in shell script, but this
+ # is one of the few that doesn't create another process, which would
+ # increase the returned number of tasks.
+ readarray < "$MW_CGROUP"/$$/tasks
+ NUM_TASKS=${#MAPFILE[*]}
+}
+
+if [ -n "$MW_CGROUP" ]; then
+ updateTaskCount
+
+ if [ $NUM_TASKS -gt 1 ]; then
+ # Spawn a monitor process which will continue to poll for completion
+ # of all processes in the cgroup after termination of the parent shell
+ (
+ while [ $NUM_TASKS -gt 1 ]; do
+ sleep 10
+ updateTaskCount
+ done
+ cleanup
+ ) >&/dev/null < /dev/null &
+ disown -a
+ else
+ cleanup
+ fi
+fi
+exit "$STATUS"
+
diff --git a/includes/logging/LogEntry.php b/includes/logging/LogEntry.php
index 37560d80..0f20ed16 100644
--- a/includes/logging/LogEntry.php
+++ b/includes/logging/LogEntry.php
@@ -175,6 +175,7 @@ class DatabaseLogEntry extends LogEntryBase {
/// Database result row.
protected $row;
+ protected $performer;
protected function __construct( $row ) {
$this->row = $row;
@@ -232,17 +233,20 @@ class DatabaseLogEntry extends LogEntryBase {
}
public function getPerformer() {
- $userId = (int) $this->row->log_user;
- if ( $userId !== 0 ) { // logged-in users
- if ( isset( $this->row->user_name ) ) {
- return User::newFromRow( $this->row );
- } else {
- return User::newFromId( $userId );
+ if( !$this->performer ) {
+ $userId = (int) $this->row->log_user;
+ if ( $userId !== 0 ) { // logged-in users
+ if ( isset( $this->row->user_name ) ) {
+ $this->performer = User::newFromRow( $this->row );
+ } else {
+ $this->performer = User::newFromId( $userId );
+ }
+ } else { // IP users
+ $userText = $this->row->log_user_text;
+ $this->performer = User::newFromName( $userText, false );
}
- } else { // IP users
- $userText = $this->row->log_user_text;
- return User::newFromName( $userText, false );
}
+ return $this->performer;
}
public function getTarget() {
@@ -287,14 +291,17 @@ class RCDatabaseLogEntry extends DatabaseLogEntry {
}
public function getPerformer() {
- $userId = (int) $this->row->rc_user;
- if ( $userId !== 0 ) {
- return User::newFromId( $userId );
- } else {
- $userText = $this->row->rc_user_text;
- // Might be an IP, don't validate the username
- return User::newFromName( $userText, false );
+ if( !$this->performer ) {
+ $userId = (int) $this->row->rc_user;
+ if ( $userId !== 0 ) {
+ $this->performer = User::newFromId( $userId );
+ } else {
+ $userText = $this->row->rc_user_text;
+ // Might be an IP, don't validate the username
+ $this->performer = User::newFromName( $userText, false );
+ }
}
+ return $this->performer;
}
public function getTarget() {
@@ -335,9 +342,9 @@ class ManualLogEntry extends LogEntryBase {
/**
* Constructor.
- *
+ *
* @since 1.19
- *
+ *
* @param string $type
* @param string $subtype
*/
@@ -357,10 +364,10 @@ class ManualLogEntry extends LogEntryBase {
* '4:color' => 'blue',
* 'animal' => 'dog'
* );
- *
+ *
* @since 1.19
- *
- * @param $parameters array Associative array
+ *
+ * @param array $parameters Associative array
*/
public function setParameters( $parameters ) {
$this->parameters = $parameters;
@@ -368,9 +375,9 @@ class ManualLogEntry extends LogEntryBase {
/**
* Set the user that performed the action being logged.
- *
+ *
* @since 1.19
- *
+ *
* @param User $performer
*/
public function setPerformer( User $performer ) {
@@ -379,9 +386,9 @@ class ManualLogEntry extends LogEntryBase {
/**
* Set the title of the object changed.
- *
+ *
* @since 1.19
- *
+ *
* @param Title $target
*/
public function setTarget( Title $target ) {
@@ -390,9 +397,9 @@ class ManualLogEntry extends LogEntryBase {
/**
* Set the timestamp of when the logged action took place.
- *
+ *
* @since 1.19
- *
+ *
* @param string $timestamp
*/
public function setTimestamp( $timestamp ) {
@@ -401,9 +408,9 @@ class ManualLogEntry extends LogEntryBase {
/**
* Set a comment associated with the action being logged.
- *
+ *
* @since 1.19
- *
+ *
* @param string $comment
*/
public function setComment( $comment ) {
@@ -412,9 +419,9 @@ class ManualLogEntry extends LogEntryBase {
/**
* TODO: document
- *
+ *
* @since 1.19
- *
+ *
* @param integer $deleted
*/
public function setDeleted( $deleted ) {
@@ -435,8 +442,11 @@ class ManualLogEntry extends LogEntryBase {
$this->timestamp = wfTimestampNow();
}
+ # Trim spaces on user supplied text
+ $comment = trim( $this->getComment() );
+
# Truncate for whole multibyte characters.
- $comment = $wgContLang->truncate( $this->getComment(), 255 );
+ $comment = $wgContLang->truncate( $comment, 255 );
$data = array(
'log_id' => $id,
@@ -458,8 +468,8 @@ class ManualLogEntry extends LogEntryBase {
/**
* Publishes the log entry.
- * @param $newId int id of the log entry.
- * @param $to string: rcandudp (default), rc, udp
+ * @param int $newId id of the log entry.
+ * @param string $to rcandudp (default), rc, udp
*/
public function publish( $newId, $to = 'rcandudp' ) {
$log = new LogPage( $this->getType() );
diff --git a/includes/logging/LogEventsList.php b/includes/logging/LogEventsList.php
index 4de1a974..501af7d6 100644
--- a/includes/logging/LogEventsList.php
+++ b/includes/logging/LogEventsList.php
@@ -42,7 +42,7 @@ class LogEventsList extends ContextSource {
*
* @param $context IContextSource Context to use; formerly it was Skin object.
* @param $unused void Unused; used to be an OutputPage object.
- * @param $flags int flags; can be a combinaison of self::NO_ACTION_LINK,
+ * @param int $flags flags; can be a combinaison of self::NO_ACTION_LINK,
* self::NO_EXTRA_USER_LINKS or self::USE_REVDEL_CHECKBOXES.
*/
public function __construct( $context, $unused = null, $flags = 0 ) {
@@ -74,7 +74,7 @@ class LogEventsList extends ContextSource {
public function showHeader( $type ) {
wfDeprecated( __METHOD__, '1.19' );
// If only one log type is used, then show a special message...
- $headerType = (count($type) == 1) ? $type[0] : '';
+ $headerType = (count( $type ) == 1) ? $type[0] : '';
$out = $this->getOutput();
if( LogPage::isLogType( $headerType ) ) {
$page = new LogPage( $headerType );
@@ -88,7 +88,7 @@ class LogEventsList extends ContextSource {
/**
* Show options for the log list
*
- * @param $types string or Array
+ * @param string $types or Array
* @param $user String
* @param $page String
* @param $pattern String
@@ -97,8 +97,8 @@ class LogEventsList extends ContextSource {
* @param $filter: array
* @param $tagFilter: array?
*/
- public function showOptions( $types=array(), $user='', $page='', $pattern='', $year='',
- $month = '', $filter = null, $tagFilter='' ) {
+ public function showOptions( $types=array(), $user = '', $page = '', $pattern = '', $year = '',
+ $month = '', $filter = null, $tagFilter = '' ) {
global $wgScript, $wgMiserMode;
$title = SpecialPage::getTitleFor( 'Log' );
@@ -117,7 +117,7 @@ class LogEventsList extends ContextSource {
$html .= $this->getExtraInputs( $types ) . "\n";
// Title pattern, if allowed
- if (!$wgMiserMode) {
+ if ( !$wgMiserMode ) {
$html .= $this->getTitlePattern( $pattern ) . "\n";
}
@@ -125,12 +125,12 @@ class LogEventsList extends ContextSource {
$html .= Xml::tags( 'p', null, Xml::dateMenu( $year, $month ) );
// Tag filter
- if ($tagSelector) {
+ if ( $tagSelector ) {
$html .= Xml::tags( 'p', null, implode( '&#160;', $tagSelector ) );
}
// Filter links
- if ($filter) {
+ if ( $filter ) {
$html .= Xml::tags( 'p', null, $this->getFilterLinks( $filter ) );
}
@@ -162,7 +162,7 @@ class LogEventsList extends ContextSource {
$query = $this->getDefaultQuery();
$queryKey = "hide_{$type}_log";
- $hideVal = 1 - intval($val);
+ $hideVal = 1 - intval( $val );
$query[$queryKey] = $hideVal;
$link = Linker::linkKnown(
@@ -176,7 +176,7 @@ class LogEventsList extends ContextSource {
$hiddens .= Html::hidden( "hide_{$type}_log", $val ) . "\n";
}
// Build links
- return '<small>'.$this->getLanguage()->pipeList( $links ) . '</small>' . $hiddens;
+ return '<small>' . $this->getLanguage()->pipeList( $links ) . '</small>' . $hiddens;
}
private function getDefaultQuery() {
@@ -198,7 +198,7 @@ class LogEventsList extends ContextSource {
* @return String: Formatted HTML
*/
private function getTypeMenu( $queryTypes ) {
- $queryType = count($queryTypes) == 1 ? $queryTypes[0] : '';
+ $queryType = count( $queryTypes ) == 1 ? $queryTypes[0] : '';
$selector = $this->getTypeSelector();
$selector->setDefault( $queryType );
return $selector->getHtml();
@@ -212,7 +212,7 @@ class LogEventsList extends ContextSource {
public function getTypeSelector() {
$typesByName = array(); // Temporary array
// First pass to load the log names
- foreach( LogPage::validTypes() as $type ) {
+ foreach( LogPage::validTypes() as $type ) {
$page = new LogPage( $type );
$restriction = $page->getRestriction();
if ( $this->getUser()->isAllowed( $restriction ) ) {
@@ -221,7 +221,7 @@ class LogEventsList extends ContextSource {
}
// Second pass to sort by name
- asort($typesByName);
+ asort( $typesByName );
// Always put "All public logs" on top
$public = $typesByName[''];
@@ -273,10 +273,10 @@ class LogEventsList extends ContextSource {
private function getExtraInputs( $types ) {
$offender = $this->getRequest()->getVal( 'offender' );
$user = User::newFromName( $offender, false );
- if( !$user || ($user->getId() == 0 && !IP::isIPAddress($offender) ) ) {
+ if( !$user || ( $user->getId() == 0 && !IP::isIPAddress( $offender ) ) ) {
$offender = ''; // Blank field if invalid
}
- if( count($types) == 1 && $types[0] == 'suppress' ) {
+ if( count( $types ) == 1 && $types[0] == 'suppress' ) {
return Xml::inputLabel( $this->msg( 'revdelete-offender' )->text(), 'offender',
'mw-log-offender', 20, $offender );
}
@@ -307,7 +307,6 @@ class LogEventsList extends ContextSource {
$formatter->setContext( $this->getContext() );
$formatter->setShowUserToolLinks( !( $this->flags & self::NO_EXTRA_USER_LINKS ) );
- $title = $entry->getTarget();
$time = htmlspecialchars( $this->getLanguage()->userTimeAndDate(
$entry->getTimestamp(), $this->getUser() ) );
@@ -351,9 +350,9 @@ class LogEventsList extends ContextSource {
$user = $this->getUser();
// Don't show useless checkbox to people who cannot hide log entries
if( $user->isAllowed( 'deletedhistory' ) ) {
- if( $row->log_deleted || $user->isAllowed( 'deletelogentry' ) ) {
- $canHide = $user->isAllowed( 'deletelogentry' );
- if ( $this->flags & self::USE_REVDEL_CHECKBOXES ) { // Show checkboxes instead of links.
+ $canHide = $user->isAllowed( 'deletelogentry' );
+ if( $row->log_deleted || $canHide ) {
+ if ( $canHide && $this->flags & self::USE_REVDEL_CHECKBOXES ) { // Show checkboxes instead of links.
if ( !self::userCan( $row, LogPage::DELETED_RESTRICTED, $user ) ) { // If event was hidden from sysops
$del = Xml::check( 'deleterevisions', false, array( 'disabled' => 'disabled' ) );
} else {
@@ -383,8 +382,8 @@ class LogEventsList extends ContextSource {
* @param $right string
* @return Boolean
*/
- public static function typeAction( $row, $type, $action, $right='' ) {
- $match = is_array($type) ?
+ public static function typeAction( $row, $type, $action, $right = '' ) {
+ $match = is_array( $type ) ?
in_array( $row->log_type, $type ) : $row->log_type == $type;
if( $match ) {
$match = is_array( $action ) ?
@@ -450,10 +449,10 @@ class LogEventsList extends ContextSource {
* Show log extract. Either with text and a box (set $msgKey) or without (don't set $msgKey)
*
* @param $out OutputPage|String-by-reference
- * @param $types String|Array Log types to show
- * @param $page String|Title The page title to show log entries for
- * @param $user String The user who made the log entries
- * @param $param array Associative Array with the following additional options:
+ * @param string|array $types Log types to show
+ * @param string|Title $page The page title to show log entries for
+ * @param string $user The user who made the log entries
+ * @param array $param Associative Array with the following additional options:
* - lim Integer Limit of items to show, default is 50
* - conds Array Extra conditions for the query (e.g. "log_action != 'revision'")
* - showIfEmpty boolean Set to false if you don't want any output in case the loglist is empty
@@ -468,13 +467,13 @@ class LogEventsList extends ContextSource {
* @return Integer Number of total log items (not limited by $lim)
*/
public static function showLogExtract(
- &$out, $types=array(), $page='', $user='', $param = array()
+ &$out, $types=array(), $page = '', $user = '', $param = array()
) {
$defaultParameters = array(
'lim' => 25,
'conds' => array(),
'showIfEmpty' => true,
- 'msgKey' => array(''),
+ 'msgKey' => array( '' ),
'wrap' => "$1",
'flags' => 0
);
@@ -520,8 +519,8 @@ class LogEventsList extends ContextSource {
}
}
$s .= $loglist->beginLogEventsList() .
- $logBody .
- $loglist->endLogEventsList();
+ $logBody .
+ $loglist->endLogEventsList();
} else {
if ( $showIfEmpty ) {
$s = Html::rawElement( 'div', array( 'class' => 'mw-warning-logempty' ),
@@ -535,7 +534,7 @@ class LogEventsList extends ContextSource {
} elseif ( $page != '' ) {
$urlParam['page'] = $page;
}
- if ( $user != '')
+ if ( $user != '' )
$urlParam['user'] = $user;
if ( !is_array( $types ) ) # Make it an array, if it isn't
$types = array( $types );
@@ -560,7 +559,7 @@ class LogEventsList extends ContextSource {
/* hook can return false, if we don't want the message to be emitted (Wikia BugId:7093) */
if ( wfRunHooks( 'LogEventsListShowLogExtract', array( &$s, $types, $page, $user, $param ) ) ) {
// $out can be either an OutputPage object or a String-by-reference
- if ( $out instanceof OutputPage ){
+ if ( $out instanceof OutputPage ) {
$out->addHTML( $s );
} else {
$out = $s;
@@ -575,24 +574,31 @@ class LogEventsList extends ContextSource {
*
* @param $db DatabaseBase
* @param $audience string, public/user
+ * @param $user User object to check, or null to use $wgUser
* @return Mixed: string or false
*/
- public static function getExcludeClause( $db, $audience = 'public' ) {
- global $wgLogRestrictions, $wgUser;
+ public static function getExcludeClause( $db, $audience = 'public', User $user = null ) {
+ global $wgLogRestrictions;
+
+ if ( $audience != 'public' && $user === null ) {
+ global $wgUser;
+ $user = $wgUser;
+ }
+
// Reset the array, clears extra "where" clauses when $par is used
$hiddenLogs = array();
+
// Don't show private logs to unprivileged users
foreach( $wgLogRestrictions as $logType => $right ) {
- if( $audience == 'public' || !$wgUser->isAllowed($right) ) {
- $safeType = $db->strencode( $logType );
- $hiddenLogs[] = $safeType;
+ if( $audience == 'public' || !$user->isAllowed( $right ) ) {
+ $hiddenLogs[] = $logType;
}
}
- if( count($hiddenLogs) == 1 ) {
+ if( count( $hiddenLogs ) == 1 ) {
return 'log_type != ' . $db->addQuotes( $hiddenLogs[0] );
} elseif( $hiddenLogs ) {
- return 'log_type NOT IN (' . $db->makeList($hiddenLogs) . ')';
+ return 'log_type NOT IN (' . $db->makeList( $hiddenLogs ) . ')';
}
return false;
}
- }
+}
diff --git a/includes/logging/LogFormatter.php b/includes/logging/LogFormatter.php
index 7586bb65..ace26bbe 100644
--- a/includes/logging/LogFormatter.php
+++ b/includes/logging/LogFormatter.php
@@ -192,18 +192,18 @@ class LogFormatter {
$parameters = $entry->getParameters();
// @see LogPage::actionText()
// Text of title the action is aimed at.
- $target = $entry->getTarget()->getPrefixedText() ;
+ $target = $entry->getTarget()->getPrefixedText();
$text = null;
switch( $entry->getType() ) {
case 'move':
switch( $entry->getSubtype() ) {
case 'move':
- $movesource = $parameters['4::target'];
+ $movesource = $parameters['4::target'];
$text = wfMessage( '1movedto2' )
->rawParams( $target, $movesource )->inContentLanguage()->escaped();
break;
case 'move_redir':
- $movesource = $parameters['4::target'];
+ $movesource = $parameters['4::target'];
$text = wfMessage( '1movedto2_redir' )
->rawParams( $target, $movesource )->inContentLanguage()->escaped();
break;
@@ -270,6 +270,7 @@ class LogFormatter {
->inContentLanguage()->escaped();
break;
case 'create2':
+ case 'byemail':
$text = wfMessage( 'newuserlog-create2-entry' )
->rawParams( $target )->inContentLanguage()->escaped();
break;
@@ -293,6 +294,28 @@ class LogFormatter {
}
break;
+ case 'rights':
+ if ( count( $parameters['4::oldgroups'] ) ) {
+ $oldgroups = implode( ', ', $parameters['4::oldgroups'] );
+ } else {
+ $oldgroups = wfMessage( 'rightsnone' )->inContentLanguage()->escaped();
+ }
+ if ( count( $parameters['5::newgroups'] ) ) {
+ $newgroups = implode( ', ', $parameters['5::newgroups'] );
+ } else {
+ $newgroups = wfMessage( 'rightsnone' )->inContentLanguage()->escaped();
+ }
+ switch( $entry->getSubtype() ) {
+ case 'rights':
+ $text = wfMessage( 'rightslogentry' )
+ ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
+ break;
+ case 'autopromote':
+ $text = wfMessage( 'rightslogentry-autopromote' )
+ ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
+ break;
+ }
+ break;
// case 'suppress' --private log -- aaron (sign your messages so we know who to blame in a few years :-D)
// default:
@@ -379,9 +402,11 @@ class LogFormatter {
// Filter out parameters which are not in format #:foo
foreach ( $entry->getParameters() as $key => $value ) {
- if ( strpos( $key, ':' ) === false ) continue;
- list( $index, $type, $name ) = explode( ':', $key, 3 );
- $params[$index - 1] = $value;
+ if ( strpos( $key, ':' ) === false ) {
+ continue;
+ }
+ list( $index, $type, ) = explode( ':', $key, 3 );
+ $params[$index - 1] = $this->formatParameterValue( $type, $value );
}
/* Message class doesn't like non consecutive numbering.
@@ -416,7 +441,7 @@ class LogFormatter {
$entry = $this->entry;
$params = $this->extractParameters();
$params[0] = Message::rawParam( $this->getPerformerElement() );
- $params[1] = $entry->getPerformer()->getName();
+ $params[1] = $this->canView( LogPage::DELETED_USER ) ? $entry->getPerformer()->getName() : '';
$params[2] = Message::rawParam( $this->makePageLink( $entry->getTarget() ) );
// Bad things happens if the numbers are not in correct order
@@ -425,10 +450,83 @@ class LogFormatter {
}
/**
+ * Formats parameters values dependent to their type
+ * @param string $type The type of the value.
+ * Valid are currently:
+ * * - (empty) or plain: The value is returned as-is
+ * * raw: The value will be added to the log message
+ * as raw parameter (e.g. no escaping)
+ * Use this only if there is no other working
+ * type like user-link or title-link
+ * * msg: The value is a message-key, the output is
+ * the message in user language
+ * * msg-content: The value is a message-key, the output
+ * is the message in content language
+ * * user: The value is a user name, e.g. for GENDER
+ * * user-link: The value is a user name, returns a
+ * link for the user
+ * * title: The value is a page title,
+ * returns name of page
+ * * title-link: The value is a page title,
+ * returns link to this page
+ * * number: Format value as number
+ * @param string $value The parameter value that should
+ * be formated
+ * @return string or Message::numParam or Message::rawParam
+ * Formated value
+ * @since 1.21
+ */
+ protected function formatParameterValue( $type, $value ) {
+ $saveLinkFlood = $this->linkFlood;
+
+ switch( strtolower( trim( $type ) ) ) {
+ case 'raw':
+ $value = Message::rawParam( $value );
+ break;
+ case 'msg':
+ $value = $this->msg( $value )->text();
+ break;
+ case 'msg-content':
+ $value = $this->msg( $value )->inContentLanguage()->text();
+ break;
+ case 'number':
+ $value = Message::numParam( $value );
+ break;
+ case 'user':
+ $user = User::newFromName( $value );
+ $value = $user->getName();
+ break;
+ case 'user-link':
+ $this->setShowUserToolLinks( false );
+
+ $user = User::newFromName( $value );
+ $value = Message::rawParam( $this->makeUserLink( $user ) );
+
+ $this->setShowUserToolLinks( $saveLinkFlood );
+ break;
+ case 'title':
+ $title = Title::newFromText( $value );
+ $value = $title->getPrefixedText();
+ break;
+ case 'title-link':
+ $title = Title::newFromText( $value );
+ $value = Message::rawParam( $this->makePageLink( $title ) );
+ break;
+ case 'plain':
+ // Plain text, nothing to do
+ default:
+ // Catch other types and use the old behavior (return as-is)
+ }
+
+ return $value;
+ }
+
+ /**
* Helper to make a link to the page, taking the plaintext
* value in consideration.
* @param $title Title the page
- * @param $parameters array query parameters
+ * @param array $parameters query parameters
+ * @throws MWException
* @return String
*/
protected function makePageLink( Title $title = null, $parameters = array() ) {
@@ -492,7 +590,7 @@ class LogFormatter {
return $this->msg( $message )->text();
}
- $content = $this->msg( $message )->escaped();
+ $content = $this->msg( $message )->escaped();
$attribs = array( 'class' => 'history-deleted' );
return Html::rawElement( 'span', $attribs, $content );
}
@@ -547,6 +645,16 @@ class LogFormatter {
return array();
}
+ /**
+ * @return Output of getMessageParameters() for testing
+ */
+ public function getMessageParametersForTesting() {
+ // This function was added because getMessageParameters() is
+ // protected and a change from protected to public caused
+ // problems with extensions
+ return $this->getMessageParameters();
+ }
+
}
/**
@@ -607,7 +715,7 @@ class LegacyLogFormatter extends LogFormatter {
$performer = $this->getPerformerElement();
if ( !$this->irctext ) {
- $action = $performer . $this->msg( 'word-separator' )->text() . $action;
+ $action = $performer . $this->msg( 'word-separator' )->text() . $action;
}
return $action;
@@ -786,9 +894,11 @@ class DeleteLogFormatter extends LogFormatter {
$params = parent::getMessageParameters();
$subtype = $this->entry->getSubtype();
if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
+ // $params[3] here is 'revision' for page revisions, 'oldimage' for file versions, or a comma-separated list of log_ids for log entries.
+ // $subtype here is 'revision' for page revisions and file versions, or 'event' for log entries.
if (
- ($subtype === 'event' && count( $params ) === 6 ) ||
- ($subtype === 'revision' && isset( $params[3] ) && $params[3] === 'revision' )
+ ( $subtype === 'event' && count( $params ) === 6 ) ||
+ ( $subtype === 'revision' && isset( $params[3] ) && ( $params[3] === 'revision' || $params[3] === 'oldimage' ) )
) {
$paramStart = $subtype === 'revision' ? 4 : 3;
@@ -805,8 +915,7 @@ class DeleteLogFormatter extends LogFormatter {
foreach ( $extra as $v ) {
$changes[] = $this->msg( $v )->plain();
}
- $changeText = $this->context->getLanguage()->listToText( $changes );
-
+ $changeText = $this->context->getLanguage()->listToText( $changes );
$newParams = array_slice( $params, 0, 3 );
$newParams[3] = $changeText;
@@ -849,7 +958,7 @@ class DeleteLogFormatter extends LogFormatter {
$this->msg( $message )->escaped(),
array(),
array( 'target' => $this->entry->getTarget()->getPrefixedDBkey() )
- );
+ );
return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
case 'revision': // If an edit was hidden from a page give a review link to the history
@@ -885,7 +994,7 @@ class DeleteLogFormatter extends LogFormatter {
$this->msg( 'diff' )->escaped(),
array(),
array(
- 'target' => $this->entry->getTarget()->getPrefixedDBKey(),
+ 'target' => $this->entry->getTarget()->getPrefixedDBkey(),
'diff' => 'prev',
'timestamp' => $ids[0]
)
@@ -978,7 +1087,8 @@ class PatrolLogFormatter extends LogFormatter {
class NewUsersLogFormatter extends LogFormatter {
protected function getMessageParameters() {
$params = parent::getMessageParameters();
- if ( $this->entry->getSubtype() === 'create2' ) {
+ $subtype = $this->entry->getSubtype();
+ if ( $subtype === 'create2' || $subtype === 'byemail' ) {
if ( isset( $params[3] ) ) {
$target = User::newFromId( $params[3] );
} else {
@@ -1001,10 +1111,98 @@ class NewUsersLogFormatter extends LogFormatter {
}
public function getPreloadTitles() {
- if ( $this->entry->getSubtype() === 'create2' ) {
+ $subtype = $this->entry->getSubtype();
+ if ( $subtype === 'create2' || $subtype === 'byemail' ) {
//add the user talk to LinkBatch for the userLink
return array( Title::makeTitle( NS_USER_TALK, $this->entry->getTarget()->getText() ) );
}
return array();
}
}
+
+/**
+ * This class formats rights log entries.
+ * @since 1.21
+ */
+class RightsLogFormatter extends LogFormatter {
+ protected function makePageLink( Title $title = null, $parameters = array() ) {
+ global $wgContLang, $wgUserrightsInterwikiDelimiter;
+
+ if ( !$this->plaintext ) {
+ $text = $wgContLang->ucfirst( $title->getText() );
+ $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
+
+ if ( count( $parts ) === 2 ) {
+ $titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
+ htmlspecialchars( $title->getPrefixedText() ) );
+
+ if ( $titleLink !== false ) {
+ return $titleLink;
+ }
+ }
+ }
+
+ return parent::makePageLink( $title, $parameters );
+ }
+
+ protected function getMessageKey() {
+ $key = parent::getMessageKey();
+ $params = $this->getMessageParameters();
+ if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
+ $key .= '-legacy';
+ }
+ return $key;
+ }
+
+ protected function getMessageParameters() {
+ $params = parent::getMessageParameters();
+
+ // Really old entries
+ if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
+ return $params;
+ }
+
+ $oldGroups = $params[3];
+ $newGroups = $params[4];
+
+ // Less old entries
+ if ( $oldGroups === '' ) {
+ $oldGroups = array();
+ } elseif ( is_string( $oldGroups ) ) {
+ $oldGroups = array_map( 'trim', explode( ',', $oldGroups ) );
+ }
+ if ( $newGroups === '' ) {
+ $newGroups = array();
+ } elseif ( is_string( $newGroups ) ) {
+ $newGroups = array_map( 'trim', explode( ',', $newGroups ) );
+ }
+
+ $userName = $this->entry->getTarget()->getText();
+ if ( !$this->plaintext && count( $oldGroups ) ) {
+ foreach ( $oldGroups as &$group ) {
+ $group = User::getGroupMember( $group, $userName );
+ }
+ }
+ if ( !$this->plaintext && count( $newGroups ) ) {
+ foreach ( $newGroups as &$group ) {
+ $group = User::getGroupMember( $group, $userName );
+ }
+ }
+
+ $lang = $this->context->getLanguage();
+ if ( count( $oldGroups ) ) {
+ $params[3] = $lang->listToText( $oldGroups );
+ } else {
+ $params[3] = $this->msg( 'rightsnone' )->text();
+ }
+ if ( count( $newGroups ) ) {
+ // Array_values is used here because of bug 42211
+ // see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
+ $params[4] = $lang->listToText( array_values( $newGroups ) );
+ } else {
+ $params[4] = $this->msg( 'rightsnone' )->text();
+ }
+
+ return $params;
+ }
+}
diff --git a/includes/logging/LogPage.php b/includes/logging/LogPage.php
index d96a5ea5..4191c577 100644
--- a/includes/logging/LogPage.php
+++ b/includes/logging/LogPage.php
@@ -50,16 +50,16 @@ class LogPage {
*/
var $target;
- /* @acess public */
+ /* @access public */
var $updateRecentChanges, $sendToUDP;
/**
* Constructor
*
- * @param $type String: one of '', 'block', 'protect', 'rights', 'delete',
+ * @param string $type one of '', 'block', 'protect', 'rights', 'delete',
* 'upload', 'move'
* @param $rc Boolean: whether to update recent changes as well as the logging table
- * @param $udp String: pass 'UDP' to send to the UDP feed if NOT sent to RC
+ * @param string $udp pass 'UDP' to send to the UDP feed if NOT sent to RC
*/
public function __construct( $type, $rc = true, $udp = 'skipUDP' ) {
$this->type = $type;
@@ -181,7 +181,7 @@ class LogPage {
/**
* Is $type a valid log type
*
- * @param $type String: log type to check
+ * @param string $type log type to check
* @return Boolean
*/
public static function isLogType( $type ) {
@@ -191,7 +191,7 @@ class LogPage {
/**
* Get the name for the given log type
*
- * @param $type String: logtype
+ * @param string $type logtype
* @return String: log name
* @deprecated in 1.19, warnings in 1.21. Use getName()
*/
@@ -210,7 +210,7 @@ class LogPage {
* Get the log header for the given log type
*
* @todo handle missing log types
- * @param $type String: logtype
+ * @param string $type logtype
* @return String: headertext of this logtype
* @deprecated in 1.19, warnings in 1.21. Use getDescription()
*/
@@ -220,15 +220,15 @@ class LogPage {
}
/**
- * Generate text for a log entry.
+ * Generate text for a log entry.
* Only LogFormatter should call this function.
*
- * @param $type String: log type
- * @param $action String: log action
+ * @param string $type log type
+ * @param string $action log action
* @param $title Mixed: Title object or null
* @param $skin Mixed: Skin object or null. If null, we want to use the wiki
* content language, since that will go to the IRC feed.
- * @param $params Array: parameters
+ * @param array $params parameters
* @param $filterWikilinks Boolean: whether to filter wiki links
* @return HTML string
*/
@@ -253,29 +253,6 @@ class LogPage {
} else {
$titleLink = self::getTitleLink( $type, $langObjOrNull, $title, $params );
- if( preg_match( '/^rights\/(rights|autopromote)/', $key ) ) {
- $rightsnone = wfMessage( 'rightsnone' )->inLanguage( $langObj )->text();
-
- if( $skin ) {
- $username = $title->getText();
- foreach ( $params as &$param ) {
- $groupArray = array_map( 'trim', explode( ',', $param ) );
- foreach( $groupArray as &$group ) {
- $group = User::getGroupMember( $group, $username );
- }
- $param = $wgLang->listToText( $groupArray );
- }
- }
-
- if( !isset( $params[0] ) || trim( $params[0] ) == '' ) {
- $params[0] = $rightsnone;
- }
-
- if( !isset( $params[1] ) || trim( $params[1] ) == '' ) {
- $params[1] = $rightsnone;
- }
- }
-
if( count( $params ) == 0 ) {
$rv = wfMessage( $wgLogActions[$key] )->rawParams( $titleLink )->inLanguage( $langObj )->escaped();
} else {
@@ -294,7 +271,7 @@ class LogPage {
$params[2] = isset( $params[2] ) ?
self::formatBlockFlags( $params[2], $langObj ) : '';
// Page protections
- } elseif ( $type == 'protect' && count($params) == 3 ) {
+ } elseif ( $type == 'protect' && count( $params ) == 3 ) {
// Restrictions and expiries
if( $skin ) {
$details .= $wgLang->getDirMark() . htmlspecialchars( " {$params[1]}" );
@@ -350,8 +327,6 @@ class LogPage {
* @return String
*/
protected static function getTitleLink( $type, $lang, $title, &$params ) {
- global $wgContLang, $wgUserrightsInterwikiDelimiter;
-
if( !$lang ) {
return $title->getPrefixedText();
}
@@ -388,20 +363,6 @@ class LogPage {
. Linker::userToolLinks( $id, $title->getText(), false, Linker::TOOL_LINKS_NOBLOCK );
}
break;
- case 'rights':
- $text = $wgContLang->ucfirst( $title->getText() );
- $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
-
- if ( count( $parts ) == 2 ) {
- $titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
- htmlspecialchars( $title->getPrefixedText() ) );
-
- if ( $titleLink !== false ) {
- break;
- }
- }
- $titleLink = Linker::link( Title::makeTitle( NS_USER, $text ) );
- break;
case 'merge':
$titleLink = Linker::link(
$title,
@@ -441,10 +402,10 @@ class LogPage {
/**
* Add a log entry
*
- * @param $action String: one of '', 'block', 'protect', 'rights', 'delete', 'upload', 'move', 'move_redir'
+ * @param string $action one of '', 'block', 'protect', 'rights', 'delete', 'upload', 'move', 'move_redir'
* @param $target Title object
- * @param $comment String: description associated
- * @param $params Array: parameters passed later to wfMessage function
+ * @param string $comment description associated
+ * @param array $params parameters passed later to wfMessage function
* @param $doer User object: the user doing the action
*
* @return int log_id of the inserted log entry
@@ -460,6 +421,9 @@ class LogPage {
$comment = '';
}
+ # Trim spaces on user supplied text
+ $comment = trim( $comment );
+
# Truncate for whole multibyte characters.
$comment = $wgContLang->truncate( $comment, 255 );
@@ -549,7 +513,7 @@ class LogPage {
* Convert a comma-delimited list of block log flags
* into a more readable (and translated) form
*
- * @param $flags string Flags to format
+ * @param string $flags Flags to format
* @param $lang Language object to use
* @return String
*/
@@ -570,7 +534,7 @@ class LogPage {
/**
* Translate a block log flag if possible
*
- * @param $flag int Flag to translate
+ * @param int $flag Flag to translate
* @param $lang Language object to use
* @return String
*/
@@ -598,7 +562,6 @@ class LogPage {
return $messages[$flag];
}
-
/**
* Name of the log.
* @return Message
diff --git a/includes/logging/LogPager.php b/includes/logging/LogPager.php
index ea1be8e0..908755ed 100644
--- a/includes/logging/LogPager.php
+++ b/includes/logging/LogPager.php
@@ -35,14 +35,14 @@ class LogPager extends ReverseChronologicalPager {
* Constructor
*
* @param $list LogEventsList
- * @param $types String or Array: log types to show
- * @param $performer String: the user who made the log entries
- * @param $title String|Title: the page title the log entries are for
- * @param $pattern String: do a prefix search rather than an exact title match
- * @param $conds Array: extra conditions for the query
+ * @param string $types or Array: log types to show
+ * @param string $performer the user who made the log entries
+ * @param string|Title $title the page title the log entries are for
+ * @param string $pattern do a prefix search rather than an exact title match
+ * @param array $conds extra conditions for the query
* @param $year Integer: the year to start from
* @param $month Integer: the month to start from
- * @param $tagFilter String: tag
+ * @param string $tagFilter tag
*/
public function __construct( $list, $types = array(), $performer = '', $title = '', $pattern = '',
$conds = array(), $year = false, $month = false, $tagFilter = '' ) {
@@ -71,7 +71,7 @@ class LogPager extends ReverseChronologicalPager {
public function getFilterParams() {
global $wgFilterLogTypes;
$filters = array();
- if( count($this->types) ) {
+ if( count( $this->types ) ) {
return $filters;
}
foreach( $wgFilterLogTypes as $type => $default ) {
@@ -90,18 +90,20 @@ class LogPager extends ReverseChronologicalPager {
* Set the log reader to return only entries of the given type.
* Type restrictions enforced here
*
- * @param $types String or array: Log types ('upload', 'delete', etc);
+ * @param string $types or array: Log types ('upload', 'delete', etc);
* empty string means no restriction
*/
private function limitType( $types ) {
global $wgLogRestrictions;
+
+ $user = $this->getUser();
// If $types is not an array, make it an array
$types = ($types === '') ? array() : (array)$types;
// Don't even show header for private logs; don't recognize it...
$needReindex = false;
foreach ( $types as $type ) {
if( isset( $wgLogRestrictions[$type] )
- && !$this->getUser()->isAllowed($wgLogRestrictions[$type])
+ && !$user->isAllowed( $wgLogRestrictions[$type] )
) {
$needReindex = true;
$types = array_diff( $types, array( $type ) );
@@ -116,21 +118,21 @@ class LogPager extends ReverseChronologicalPager {
// Don't show private logs to unprivileged users.
// Also, only show them upon specific request to avoid suprises.
$audience = $types ? 'user' : 'public';
- $hideLogs = LogEventsList::getExcludeClause( $this->mDb, $audience );
+ $hideLogs = LogEventsList::getExcludeClause( $this->mDb, $audience, $user );
if( $hideLogs !== false ) {
$this->mConds[] = $hideLogs;
}
- if( count($types) ) {
+ if( count( $types ) ) {
$this->mConds['log_type'] = $types;
// Set typeCGI; used in url param for paging
- if( count($types) == 1 ) $this->typeCGI = $types[0];
+ if( count( $types ) == 1 ) $this->typeCGI = $types[0];
}
}
/**
* Set the log reader to return only entries by the given user.
*
- * @param $name String: (In)valid user name
+ * @param string $name (In)valid user name
* @return bool
*/
private function limitPerformer( $name ) {
@@ -138,7 +140,7 @@ class LogPager extends ReverseChronologicalPager {
return false;
}
$usertitle = Title::makeTitleSafe( NS_USER, $name );
- if( is_null($usertitle) ) {
+ if( is_null( $usertitle ) ) {
return false;
}
/* Fetch userid at first, if known, provides awesome query plan afterwards */
@@ -152,9 +154,9 @@ class LogPager extends ReverseChronologicalPager {
// Paranoia: avoid brute force searches (bug 17342)
$user = $this->getUser();
if( !$user->isAllowed( 'deletedhistory' ) ) {
- $this->mConds[] = $this->mDb->bitAnd('log_deleted', LogPage::DELETED_USER) . ' = 0';
+ $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::DELETED_USER ) . ' = 0';
} elseif( !$user->isAllowed( 'suppressrevision' ) ) {
- $this->mConds[] = $this->mDb->bitAnd('log_deleted', LogPage::SUPPRESSED_USER) .
+ $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::SUPPRESSED_USER ) .
' != ' . LogPage::SUPPRESSED_USER;
}
$this->performer = $usertitle->getText();
@@ -165,7 +167,7 @@ class LogPager extends ReverseChronologicalPager {
* Set the log reader to return only entries affecting the given page.
* (For the block and rights logs, this is a user page.)
*
- * @param $page String or Title object: Title name
+ * @param string $page or Title object: Title name
* @param $pattern String
* @return bool
*/
@@ -207,9 +209,9 @@ class LogPager extends ReverseChronologicalPager {
// Paranoia: avoid brute force searches (bug 17342)
$user = $this->getUser();
if( !$user->isAllowed( 'deletedhistory' ) ) {
- $this->mConds[] = $db->bitAnd('log_deleted', LogPage::DELETED_ACTION) . ' = 0';
+ $this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::DELETED_ACTION) . ' = 0';
} elseif( !$user->isAllowed( 'suppressrevision' ) ) {
- $this->mConds[] = $db->bitAnd('log_deleted', LogPage::SUPPRESSED_ACTION) .
+ $this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::SUPPRESSED_ACTION) .
' != ' . LogPage::SUPPRESSED_ACTION;
}
}
@@ -249,10 +251,10 @@ class LogPager extends ReverseChronologicalPager {
# avoids site-breaking filesorts.
} elseif( $this->title || $this->pattern || $this->performer ) {
$index['logging'] = array( 'page_time', 'user_time' );
- if( count($this->types) == 1 ) {
+ if( count( $this->types ) == 1 ) {
$index['logging'][] = 'log_user_type_time';
}
- } elseif( count($this->types) == 1 ) {
+ } elseif( count( $this->types ) == 1 ) {
$index['logging'] = 'type_time';
} else {
$index['logging'] = 'times';
diff --git a/includes/media/BMP.php b/includes/media/BMP.php
index a515c635..46d1b95b 100644
--- a/includes/media/BMP.php
+++ b/includes/media/BMP.php
@@ -62,7 +62,7 @@ class BmpHandler extends BitmapHandler {
return false;
}
$header = fread( $f, 54 );
- fclose($f);
+ fclose( $f );
// Extract binary form of width and height from the header
$w = substr( $header, 18, 4);
diff --git a/includes/media/Bitmap.php b/includes/media/Bitmap.php
index 99ac854b..e2dc68b2 100644
--- a/includes/media/Bitmap.php
+++ b/includes/media/Bitmap.php
@@ -29,7 +29,7 @@
class BitmapHandler extends ImageHandler {
/**
* @param $image File
- * @param $params array Transform parameters. Entries with the keys 'width'
+ * @param array $params Transform parameters. Entries with the keys 'width'
* and 'height' are the respective screen width and height, while the keys
* 'physicalWidth' and 'physicalHeight' indicate the thumbnail dimensions.
* @return bool
@@ -75,7 +75,6 @@ class BitmapHandler extends ImageHandler {
return true;
}
-
/**
* Extracts the width/height if the image will be scaled before rotating
*
@@ -84,8 +83,8 @@ class BitmapHandler extends ImageHandler {
* stored as raw landscape with 90-degress rotation, the resulting size
* will be wider than it is tall.
*
- * @param $params array Parameters as returned by normaliseParams
- * @param $rotation int The rotation angle that will be applied
+ * @param array $params Parameters as returned by normaliseParams
+ * @param int $rotation The rotation angle that will be applied
* @return array ($width, $height) array
*/
public function extractPreRotationDimensions( $params, $rotation ) {
@@ -100,7 +99,6 @@ class BitmapHandler extends ImageHandler {
return array( $width, $height );
}
-
/**
* Function that returns the number of pixels to be thumbnailed.
* Intended for animated GIFs to multiply by the number of frames.
@@ -158,7 +156,6 @@ class BitmapHandler extends ImageHandler {
return $this->getClientScalingThumbnailImage( $image, $scalerParams );
}
-
if ( $scaler == 'client' ) {
# Client-side image scaling, use the source URL
# Using the destination URL in a TRANSFORM_LATER request would be incorrect
@@ -264,7 +261,7 @@ class BitmapHandler extends ImageHandler {
* client side
*
* @param $image File File associated with this thumbnail
- * @param $scalerParams array Array with scaler params
+ * @param array $scalerParams Array with scaler params
* @return ThumbnailImage
*
* @todo fixme: no rotation support
@@ -281,7 +278,7 @@ class BitmapHandler extends ImageHandler {
* Transform an image using ImageMagick
*
* @param $image File File associated with this thumbnail
- * @param $params array Array with scaler params
+ * @param array $params Array with scaler params
*
* @return MediaTransformError Error object if error occurred, false (=no error) otherwise
*/
@@ -341,7 +338,7 @@ class BitmapHandler extends ImageHandler {
$rotation = $this->getRotation( $image );
list( $width, $height ) = $this->extractPreRotationDimensions( $params, $rotation );
- $cmd =
+ $cmd =
wfEscapeShellArg( $wgImageMagickConvertCommand ) .
// Specify white background color, will be used for transparent images
// in Internet Explorer/Windows instead of default black.
@@ -380,7 +377,7 @@ class BitmapHandler extends ImageHandler {
* Transform an image using the Imagick PHP extension
*
* @param $image File File associated with this thumbnail
- * @param $params array Array with scaler params
+ * @param array $params Array with scaler params
*
* @return MediaTransformError Error object if error occurred, false (=no error) otherwise
*/
@@ -457,7 +454,7 @@ class BitmapHandler extends ImageHandler {
* Transform an image using a custom command
*
* @param $image File File associated with this thumbnail
- * @param $params array Array with scaler params
+ * @param array $params Array with scaler params
*
* @return MediaTransformError Error object if error occurred, false (=no error) otherwise
*/
@@ -500,8 +497,8 @@ class BitmapHandler extends ImageHandler {
/**
* Get a MediaTransformError with error 'thumbnail_error'
*
- * @param $params array Parameter array as passed to the transform* functions
- * @param $errMsg string Error message
+ * @param array $params Parameter array as passed to the transform* functions
+ * @param string $errMsg Error message
* @return MediaTransformError
*/
public function getMediaTransformError( $params, $errMsg ) {
@@ -513,7 +510,7 @@ class BitmapHandler extends ImageHandler {
* Transform an image using the built in GD library
*
* @param $image File File associated with this thumbnail
- * @param $params array Array with scaler params
+ * @param array $params Array with scaler params
*
* @return MediaTransformError Error object if error occurred, false (=no error) otherwise
*/
@@ -622,8 +619,9 @@ class BitmapHandler extends ImageHandler {
* in a directory, so we're better off escaping and waiting for the bugfix
* to filter down to users.
*
- * @param $path string The file path
- * @param $scene string The scene specification, or false if there is none
+ * @param string $path The file path
+ * @param bool|string $scene The scene specification, or false if there is none
+ * @throws MWException
* @return string
*/
function escapeMagickInput( $path, $scene = false ) {
@@ -653,8 +651,9 @@ class BitmapHandler extends ImageHandler {
* Armour a string against ImageMagick's GetPathComponent(). This is a
* helper function for escapeMagickInput() and escapeMagickOutput().
*
- * @param $path string The file path
- * @param $scene string The scene specification, or false if there is none
+ * @param string $path The file path
+ * @param bool|string $scene The scene specification, or false if there is none
+ * @throws MWException
* @return string
*/
protected function escapeMagickPath( $path, $scene = false ) {
@@ -757,6 +756,55 @@ class BitmapHandler extends ImageHandler {
}
/**
+ * @param $file File
+ * @param array $params Rotate parameters.
+ * 'rotation' clockwise rotation in degrees, allowed are multiples of 90
+ * @since 1.21
+ * @return bool
+ */
+ public function rotate( $file, $params ) {
+ global $wgImageMagickConvertCommand;
+
+ $rotation = ( $params[ 'rotation' ] + $this->getRotation( $file ) ) % 360;
+ $scene = false;
+
+ $scaler = self::getScalerType( null, false );
+ switch ( $scaler ) {
+ case 'im':
+ $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " .
+ wfEscapeShellArg( $this->escapeMagickInput( $params[ 'srcPath' ], $scene ) ) .
+ " -rotate -$rotation " .
+ wfEscapeShellArg( $this->escapeMagickOutput( $params[ 'dstPath' ] ) ) . " 2>&1";
+ wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
+ wfProfileIn( 'convert' );
+ $retval = 0;
+ $err = wfShellExec( $cmd, $retval, $env );
+ wfProfileOut( 'convert' );
+ if ( $retval !== 0 ) {
+ $this->logErrorForExternalProcess( $retval, $err, $cmd );
+ return new MediaTransformError( 'thumbnail_error', 0, 0, $err );
+ }
+ return false;
+ case 'imext':
+ $im = new Imagick();
+ $im->readImage( $params['srcPath'] );
+ if ( !$im->rotateImage( new ImagickPixel( 'white' ), 360 - $rotation ) ) {
+ return new MediaTransformError( 'thumbnail_error', 0, 0,
+ "Error rotating $rotation degrees" );
+ }
+ $result = $im->writeImage( $params['dstPath'] );
+ if ( !$result ) {
+ return new MediaTransformError( 'thumbnail_error', 0, 0,
+ "Unable to write image to {$params['dstPath']}" );
+ }
+ return false;
+ default:
+ return new MediaTransformError( 'thumbnail_error', 0, 0,
+ "$scaler rotation not implemented" );
+ }
+ }
+
+ /**
* Rerurns whether the file needs to be rendered. Returns true if the
* file requires rotation and we are able to rotate it.
*
diff --git a/includes/media/BitmapMetadataHandler.php b/includes/media/BitmapMetadataHandler.php
index 0a195547..345e7869 100644
--- a/includes/media/BitmapMetadataHandler.php
+++ b/includes/media/BitmapMetadataHandler.php
@@ -47,13 +47,13 @@ class BitmapMetadataHandler {
private $iptcType = 'iptc-no-hash';
/**
- * This does the photoshop image resource app13 block
- * of interest, IPTC-IIM metadata is stored here.
- *
- * Mostly just calls doPSIR and doIPTC
- *
- * @param String $app13 String containing app13 block from jpeg file
- */
+ * This does the photoshop image resource app13 block
+ * of interest, IPTC-IIM metadata is stored here.
+ *
+ * Mostly just calls doPSIR and doIPTC
+ *
+ * @param string $app13 String containing app13 block from jpeg file
+ */
private function doApp13 ( $app13 ) {
try {
$this->iptcType = JpegMetadataExtractor::doPSIR( $app13 );
@@ -69,7 +69,6 @@ class BitmapMetadataHandler {
$this->addMetadata( $iptc, $this->iptcType );
}
-
/**
* Get exif info using exif class.
* Basically what used to be in BitmapHandler::getMetadata().
@@ -91,11 +90,11 @@ class BitmapMetadataHandler {
}
}
/** Add misc metadata. Warning: atm if the metadata category
- * doesn't have a priority, it will be silently discarded.
- *
- * @param Array $metaArray array of metadata values
- * @param string $type type. defaults to other. if two things have the same type they're merged
- */
+ * doesn't have a priority, it will be silently discarded.
+ *
+ * @param array $metaArray array of metadata values
+ * @param string $type type. defaults to other. if two things have the same type they're merged
+ */
function addMetadata ( $metaArray, $type = 'other' ) {
if ( isset( $this->metadata[$type] ) ) {
/* merge with old data */
@@ -106,14 +105,14 @@ class BitmapMetadataHandler {
}
/**
- * Merge together the various types of metadata
- * the different types have different priorites,
- * and are merged in order.
- *
- * This function is generally called by the media handlers' getMetadata()
- *
- * @return Array metadata array
- */
+ * Merge together the various types of metadata
+ * the different types have different priorites,
+ * and are merged in order.
+ *
+ * This function is generally called by the media handlers' getMetadata()
+ *
+ * @return Array metadata array
+ */
function getMetadataArray () {
// this seems a bit ugly... This is all so its merged in right order
// based on the MWG recomendation.
@@ -144,7 +143,7 @@ class BitmapMetadataHandler {
/** Main entry point for jpeg's.
*
- * @param $filename string filename (with full path)
+ * @param string $filename filename (with full path)
* @return array metadata result array.
* @throws MWException on invalid file.
*/
@@ -187,10 +186,10 @@ class BitmapMetadataHandler {
* merge the png various tEXt chunks to that
* are interesting, but for now it only does XMP
*
- * @param $filename String full path to file
+ * @param string $filename full path to file
* @return Array Array for storage in img_metadata.
*/
- static public function PNG ( $filename ) {
+ public static function PNG ( $filename ) {
$showXMP = function_exists( 'xml_parser_create_ns' );
$meta = new self();
@@ -216,10 +215,10 @@ class BitmapMetadataHandler {
* They don't really have native metadata, so just merges together
* XMP and image comment.
*
- * @param $filename string full path to file
+ * @param string $filename full path to file
* @return Array metadata array
*/
- static public function GIF ( $filename ) {
+ public static function GIF ( $filename ) {
$meta = new self();
$baseArray = GIFMetadataExtractor::getMetadata( $filename );
@@ -240,7 +239,7 @@ class BitmapMetadataHandler {
unset( $baseArray['comment'] );
unset( $baseArray['xmp'] );
-
+
$baseArray['metadata'] = $meta->getMetadataArray();
$baseArray['metadata']['_MW_GIF_VERSION'] = GIFMetadataExtractor::VERSION;
return $baseArray;
@@ -257,9 +256,10 @@ class BitmapMetadataHandler {
*
* The various exceptions this throws are caught later.
* @param $filename String
+ * @throws MWException
* @return Array The metadata.
*/
- static public function Tiff ( $filename ) {
+ public static function Tiff ( $filename ) {
if ( file_exists( $filename ) ) {
$byteOrder = self::getTiffByteOrder( $filename );
if ( !$byteOrder ) {
@@ -281,7 +281,7 @@ class BitmapMetadataHandler {
* Read the first 2 bytes of a tiff file to figure out
* Little Endian or Big Endian. Needed for exif stuff.
*
- * @param $filename String The filename
+ * @param string $filename The filename
* @return String 'BE' or 'LE' or false
*/
static function getTiffByteOrder( $filename ) {
@@ -300,6 +300,4 @@ class BitmapMetadataHandler {
}
}
-
-
}
diff --git a/includes/media/DjVu.php b/includes/media/DjVu.php
index 84672e05..0a39a2cf 100644
--- a/includes/media/DjVu.php
+++ b/includes/media/DjVu.php
@@ -183,7 +183,7 @@ class DjVuHandler extends ImageHandler {
if ( $wgDjvuPostProcessor ) {
$cmd .= " | {$wgDjvuPostProcessor}";
}
- $cmd .= ' > ' . wfEscapeShellArg($dstPath) . ') 2>&1';
+ $cmd .= ' > ' . wfEscapeShellArg( $dstPath ) . ') 2>&1';
wfProfileIn( 'ddjvu' );
wfDebug( __METHOD__.": $cmd\n" );
$retval = '';
@@ -194,7 +194,7 @@ class DjVuHandler extends ImageHandler {
if ( $retval != 0 || $removed ) {
wfDebugLog( 'thumbnail',
sprintf( 'thumbnail failed on %s: error %d "%s" from "%s"',
- wfHostname(), $retval, trim($err), $cmd ) );
+ wfHostname(), $retval, trim( $err ), $cmd ) );
return new MediaTransformError( 'thumbnail_error', $width, $height, $err );
} else {
$params = array(
@@ -228,7 +228,7 @@ class DjVuHandler extends ImageHandler {
* @param $gettext Boolean: DOCUMENT (Default: false)
* @return bool
*/
- function getMetaTree( $image , $gettext = false ) {
+ function getMetaTree( $image, $gettext = false ) {
if ( isset( $image->dejaMetaTree ) ) {
return $image->dejaMetaTree;
}
@@ -247,7 +247,7 @@ class DjVuHandler extends ImageHandler {
$image->djvuTextTree = false;
$tree = new SimpleXMLElement( $metadata );
if( $tree->getName() == 'mw-djvu' ) {
- foreach($tree->children() as $b){
+ foreach( $tree->children() as $b ) {
if( $b->getName() == 'DjVuTxt' ) {
$image->djvuTextTree = $b;
}
@@ -322,7 +322,7 @@ class DjVuHandler extends ImageHandler {
}
}
- function getPageText( $image, $page ){
+ function getPageText( $image, $page ) {
$tree = $this->getMetaTree( $image, true );
if ( !$tree ) {
return false;
diff --git a/includes/media/DjVuImage.php b/includes/media/DjVuImage.php
index 6aef562b..46989668 100644
--- a/includes/media/DjVuImage.php
+++ b/includes/media/DjVuImage.php
@@ -34,11 +34,21 @@
* @ingroup Media
*/
class DjVuImage {
+ /**
+ * Constructor
+ *
+ * @param string $filename The DjVu file name.
+ */
function __construct( $filename ) {
$this->mFilename = $filename;
}
/**
+ * @const DJVUTXT_MEMORY_LIMIT Memory limit for the DjVu description software
+ */
+ const DJVUTXT_MEMORY_LIMIT = 300000;
+
+ /**
* Check if the given file is indeed a valid DjVu image file
* @return bool
*/
@@ -47,7 +57,6 @@ class DjVuImage {
return $info !== false;
}
-
/**
* Return data in the style of getimagesize()
* @return array or false on failure
@@ -56,7 +65,7 @@ class DjVuImage {
$data = $this->getInfo();
if( $data !== false ) {
- $width = $data['width'];
+ $width = $data['width'];
$height = $data['height'];
return array( $width, $height, 'DjVu',
@@ -228,7 +237,7 @@ class DjVuImage {
function retrieveMetaData() {
global $wgDjvuToXML, $wgDjvuDump, $wgDjvuTxt;
wfProfileIn( __METHOD__ );
-
+
if ( isset( $wgDjvuDump ) ) {
# djvudump is faster as of version 3.5
# http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
@@ -247,12 +256,12 @@ class DjVuImage {
$xml = null;
}
# Text layer
- if ( isset( $wgDjvuTxt ) ) {
+ if ( isset( $wgDjvuTxt ) ) {
wfProfileIn( 'djvutxt' );
- $cmd = wfEscapeShellArg( $wgDjvuTxt ) . ' --detail=page ' . wfEscapeShellArg( $this->mFilename ) ;
- wfDebug( __METHOD__.": $cmd\n" );
+ $cmd = wfEscapeShellArg( $wgDjvuTxt ) . ' --detail=page ' . wfEscapeShellArg( $this->mFilename );
+ wfDebug( __METHOD__ . ": $cmd\n" );
$retval = '';
- $txt = wfShellExec( $cmd, $retval );
+ $txt = wfShellExec( $cmd, $retval, array(), array( 'memory' => self::DJVUTXT_MEMORY_LIMIT ) );
wfProfileOut( 'djvutxt' );
if( $retval == 0) {
# Strip some control characters
@@ -260,7 +269,7 @@ class DjVuImage {
$reg = <<<EOR
/\(page\s[\d-]*\s[\d-]*\s[\d-]*\s[\d-]*\s*"
((?> # Text to match is composed of atoms of either:
- \\\\. # - any escaped character
+ \\\\. # - any escaped character
| # - any character different from " and \
[^"\\\\]+
)*?)
@@ -271,7 +280,7 @@ EOR;
$txt = preg_replace_callback( $reg, array( $this, 'pageTextCallback' ), $txt );
$txt = "<DjVuTxt>\n<HEAD></HEAD>\n<BODY>\n" . $txt . "</BODY>\n</DjVuTxt>\n";
$xml = preg_replace( "/<DjVuXML>/", "<mw-djvu><DjVuXML>", $xml, 1 );
- $xml = $xml . $txt. '</mw-djvu>' ;
+ $xml = $xml . $txt. '</mw-djvu>';
}
}
wfProfileOut( __METHOD__ );
diff --git a/includes/media/Exif.php b/includes/media/Exif.php
index 784a6018..17671808 100644
--- a/includes/media/Exif.php
+++ b/includes/media/Exif.php
@@ -31,15 +31,15 @@
*/
class Exif {
- const BYTE = 1; //!< An 8-bit (1-byte) unsigned integer.
- const ASCII = 2; //!< An 8-bit byte containing one 7-bit ASCII code. The final byte is terminated with NULL.
- const SHORT = 3; //!< A 16-bit (2-byte) unsigned integer.
- const LONG = 4; //!< A 32-bit (4-byte) unsigned integer.
- const RATIONAL = 5; //!< Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator
- const UNDEFINED = 7; //!< An 8-bit byte that can take any value depending on the field definition
- const SLONG = 9; //!< A 32-bit (4-byte) signed integer (2's complement notation),
- const SRATIONAL = 10; //!< Two SLONGs. The first SLONG is the numerator and the second SLONG is the denominator.
- const IGNORE = -1; // A fake value for things we don't want or don't support.
+ const BYTE = 1; //!< An 8-bit (1-byte) unsigned integer.
+ const ASCII = 2; //!< An 8-bit byte containing one 7-bit ASCII code. The final byte is terminated with NULL.
+ const SHORT = 3; //!< A 16-bit (2-byte) unsigned integer.
+ const LONG = 4; //!< A 32-bit (4-byte) unsigned integer.
+ const RATIONAL = 5; //!< Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator
+ const UNDEFINED = 7; //!< An 8-bit byte that can take any value depending on the field definition
+ const SLONG = 9; //!< A 32-bit (4-byte) signed integer (2's complement notation),
+ const SRATIONAL = 10; //!< Two SLONGs. The first SLONG is the numerator and the second SLONG is the denominator.
+ const IGNORE = -1; // A fake value for things we don't want or don't support.
//@{
/* @var array
@@ -102,8 +102,9 @@ class Exif {
/**
* Constructor
*
- * @param $file String: filename.
- * @param $byteOrder String Type of byte ordering either 'BE' (Big Endian) or 'LE' (Little Endian). Default ''.
+ * @param string $file filename.
+ * @param string $byteOrder Type of byte ordering either 'BE' (Big Endian) or 'LE' (Little Endian). Default ''.
+ * @throws MWException
* @todo FIXME: The following are broke:
* SubjectArea. Need to test the more obscure tags.
*
@@ -289,8 +290,8 @@ class Exif {
// Only give a warning for b/c, since originally we didn't
// require this. The number of things affected by this is
// rather small.
- wfWarn( 'Exif class did not have byte order specified. '
- . 'Some properties may be decoded incorrectly.' );
+ wfWarn( 'Exif class did not have byte order specified. ' .
+ 'Some properties may be decoded incorrectly.' );
$this->byteOrder = 'BE'; // BE seems about twice as popular as LE in jpg's.
}
@@ -321,7 +322,7 @@ class Exif {
foreach ( array_keys( $this->mRawExifData ) as $section ) {
if ( !in_array( $section, array_keys( $this->mExifTags ) ) ) {
- $this->debug( $section , __FUNCTION__, "'$section' is not a valid Exif section" );
+ $this->debug( $section, __FUNCTION__, "'$section' is not a valid Exif section" );
continue;
}
@@ -345,24 +346,24 @@ class Exif {
}
/**
- * Collapse some fields together.
- * This converts some fields from exif form, to a more friendly form.
- * For example GPS latitude to a single number.
- *
- * The rationale behind this is that we're storing data, not presenting to the user
- * For example a longitude is a single number describing how far away you are from
- * the prime meridian. Well it might be nice to split it up into minutes and seconds
- * for the user, it doesn't really make sense to split a single number into 4 parts
- * for storage. (degrees, minutes, second, direction vs single floating point number).
- *
- * Other things this might do (not really sure if they make sense or not):
- * Dates -> mediawiki date format.
- * convert values that can be in different units to be in one standardized unit.
- *
- * As an alternative approach, some of this could be done in the validate phase
- * if we make up our own types like Exif::DATE.
- */
- function collapseData( ) {
+ * Collapse some fields together.
+ * This converts some fields from exif form, to a more friendly form.
+ * For example GPS latitude to a single number.
+ *
+ * The rationale behind this is that we're storing data, not presenting to the user
+ * For example a longitude is a single number describing how far away you are from
+ * the prime meridian. Well it might be nice to split it up into minutes and seconds
+ * for the user, it doesn't really make sense to split a single number into 4 parts
+ * for storage. (degrees, minutes, second, direction vs single floating point number).
+ *
+ * Other things this might do (not really sure if they make sense or not):
+ * Dates -> mediawiki date format.
+ * convert values that can be in different units to be in one standardized unit.
+ *
+ * As an alternative approach, some of this could be done in the validate phase
+ * if we make up our own types like Exif::DATE.
+ */
+ function collapseData() {
$this->exifGPStoNumber( 'GPSLatitude' );
$this->exifGPStoNumber( 'GPSDestLatitude' );
@@ -386,22 +387,22 @@ class Exif {
$this->exifPropToOrd( 'SceneType' );
$this->charCodeString( 'UserComment' );
- $this->charCodeString( 'GPSProcessingMethod');
+ $this->charCodeString( 'GPSProcessingMethod' );
$this->charCodeString( 'GPSAreaInformation' );
-
+
//ComponentsConfiguration should really be an array instead of a string...
//This turns a string of binary numbers into an array of numbers.
if ( isset ( $this->mFilteredExifData['ComponentsConfiguration'] ) ) {
$val = $this->mFilteredExifData['ComponentsConfiguration'];
$ccVals = array();
- for ($i = 0; $i < strlen($val); $i++) {
- $ccVals[$i] = ord( substr($val, $i, 1) );
+ for ( $i = 0; $i < strlen( $val ); $i++ ) {
+ $ccVals[$i] = ord( substr( $val, $i, 1 ) );
}
$ccVals['_type'] = 'ol'; //this is for formatting later.
$this->mFilteredExifData['ComponentsConfiguration'] = $ccVals;
}
-
+
//GPSVersion(ID) is treated as the wrong type by php exif support.
//Go through each byte turning it into a version string.
//For example: "\x02\x02\x00\x00" -> "2.2.0.0"
@@ -412,11 +413,11 @@ class Exif {
if ( isset ( $this->mFilteredExifData['GPSVersion'] ) ) {
$val = $this->mFilteredExifData['GPSVersion'];
$newVal = '';
- for ($i = 0; $i < strlen($val); $i++) {
+ for ( $i = 0; $i < strlen( $val ); $i++ ) {
if ( $i !== 0 ) {
$newVal .= '.';
}
- $newVal .= ord( substr($val, $i, 1) );
+ $newVal .= ord( substr( $val, $i, 1 ) );
}
if ( $this->byteOrder === 'LE' ) {
// Need to reverse the string
@@ -433,26 +434,25 @@ class Exif {
}
/**
- * Do userComment tags and similar. See pg. 34 of exif standard.
- * basically first 8 bytes is charset, rest is value.
- * This has not been tested on any shift-JIS strings.
- * @param $prop String prop name.
- */
+ * Do userComment tags and similar. See pg. 34 of exif standard.
+ * basically first 8 bytes is charset, rest is value.
+ * This has not been tested on any shift-JIS strings.
+ * @param string $prop prop name.
+ */
private function charCodeString ( $prop ) {
if ( isset( $this->mFilteredExifData[$prop] ) ) {
- if ( strlen($this->mFilteredExifData[$prop]) <= 8 ) {
+ if ( strlen( $this->mFilteredExifData[$prop] ) <= 8 ) {
//invalid. Must be at least 9 bytes long.
- $this->debug( $this->mFilteredExifData[$prop] , __FUNCTION__, false );
- unset($this->mFilteredExifData[$prop]);
+ $this->debug( $this->mFilteredExifData[$prop], __FUNCTION__, false );
+ unset( $this->mFilteredExifData[$prop] );
return;
}
- $charCode = substr( $this->mFilteredExifData[$prop], 0, 8);
- $val = substr( $this->mFilteredExifData[$prop], 8);
-
-
- switch ($charCode) {
+ $charCode = substr( $this->mFilteredExifData[$prop], 0, 8 );
+ $val = substr( $this->mFilteredExifData[$prop], 8 );
+
+ switch ( $charCode ) {
case "\x4A\x49\x53\x00\x00\x00\x00\x00":
//JIS
$charset = "Shift-JIS";
@@ -466,9 +466,9 @@ class Exif {
}
// This could possibly check to see if iconv is really installed
// or if we're using the compatibility wrapper in globalFunctions.php
- if ($charset) {
+ if ( $charset ) {
wfSuppressWarnings();
- $val = iconv($charset, 'UTF-8//IGNORE', $val);
+ $val = iconv( $charset, 'UTF-8//IGNORE', $val );
wfRestoreWarnings();
} else {
// if valid utf-8, assume that, otherwise assume windows-1252
@@ -476,17 +476,17 @@ class Exif {
UtfNormal::quickIsNFCVerify( $valCopy ); //validates $valCopy.
if ( $valCopy !== $val ) {
wfSuppressWarnings();
- $val = iconv('Windows-1252', 'UTF-8//IGNORE', $val);
+ $val = iconv( 'Windows-1252', 'UTF-8//IGNORE', $val );
wfRestoreWarnings();
}
}
-
+
//trim and check to make sure not only whitespace.
- $val = trim($val);
+ $val = trim( $val );
if ( strlen( $val ) === 0 ) {
//only whitespace.
- $this->debug( $this->mFilteredExifData[$prop] , __FUNCTION__, "$prop: Is only whitespace" );
- unset($this->mFilteredExifData[$prop]);
+ $this->debug( $this->mFilteredExifData[$prop], __FUNCTION__, "$prop: Is only whitespace" );
+ unset( $this->mFilteredExifData[$prop] );
return;
}
@@ -495,21 +495,21 @@ class Exif {
}
}
/**
- * Convert an Exif::UNDEFINED from a raw binary string
- * to its value. This is sometimes needed depending on
- * the type of UNDEFINED field
- * @param $prop String name of property
- */
+ * Convert an Exif::UNDEFINED from a raw binary string
+ * to its value. This is sometimes needed depending on
+ * the type of UNDEFINED field
+ * @param string $prop name of property
+ */
private function exifPropToOrd ( $prop ) {
if ( isset( $this->mFilteredExifData[$prop] ) ) {
$this->mFilteredExifData[$prop] = ord( $this->mFilteredExifData[$prop] );
}
}
/**
- * Convert gps in exif form to a single floating point number
- * for example 10 degress 20`40`` S -> -10.34444
- * @param String $prop a gps coordinate exif tag name (like GPSLongitude)
- */
+ * Convert gps in exif form to a single floating point number
+ * for example 10 degress 20`40`` S -> -10.34444
+ * @param string $prop a gps coordinate exif tag name (like GPSLongitude)
+ */
private function exifGPStoNumber ( $prop ) {
$loc =& $this->mFilteredExifData[$prop];
$dir =& $this->mFilteredExifData[$prop . 'Ref'];
@@ -545,7 +545,7 @@ class Exif {
*
* @deprecated since 1.18
*/
- function makeFormattedData( ) {
+ function makeFormattedData() {
wfDeprecated( __METHOD__, '1.18' );
$this->mFormattedExifData = FormatMetadata::getFormattedData(
$this->mFilteredExifData );
@@ -580,7 +580,7 @@ class Exif {
*/
function getFormattedData() {
wfDeprecated( __METHOD__, '1.18' );
- if (!$this->mFormattedExifData) {
+ if ( !$this->mFormattedExifData ) {
$this->makeFormattedData();
}
return $this->mFormattedExifData;
@@ -612,7 +612,7 @@ class Exif {
* @return bool
*/
private function isByte( $in ) {
- if ( !is_array( $in ) && sprintf('%d', $in) == $in && $in >= 0 && $in <= 255 ) {
+ if ( !is_array( $in ) && sprintf( '%d', $in ) == $in && $in >= 0 && $in <= 255 ) {
$this->debug( $in, __FUNCTION__, true );
return true;
} else {
@@ -648,7 +648,7 @@ class Exif {
* @return bool
*/
private function isShort( $in ) {
- if ( !is_array( $in ) && sprintf('%d', $in) == $in && $in >= 0 && $in <= 65536 ) {
+ if ( !is_array( $in ) && sprintf( '%d', $in ) == $in && $in >= 0 && $in <= 65536 ) {
$this->debug( $in, __FUNCTION__, true );
return true;
} else {
@@ -662,7 +662,7 @@ class Exif {
* @return bool
*/
private function isLong( $in ) {
- if ( !is_array( $in ) && sprintf('%d', $in) == $in && $in >= 0 && $in <= 4294967296 ) {
+ if ( !is_array( $in ) && sprintf( '%d', $in ) == $in && $in >= 0 && $in <= 4294967296 ) {
$this->debug( $in, __FUNCTION__, true );
return true;
} else {
@@ -677,7 +677,7 @@ class Exif {
*/
private function isRational( $in ) {
$m = array();
- if ( !is_array( $in ) && @preg_match( '/^(\d+)\/(\d+[1-9]|[1-9]\d*)$/', $in, $m ) ) { # Avoid division by zero
+ if ( !is_array( $in ) && preg_match( '/^(\d+)\/(\d+[1-9]|[1-9]\d*)$/', $in, $m ) ) { # Avoid division by zero
return $this->isLong( $m[1] ) && $this->isLong( $m[2] );
} else {
$this->debug( $in, __FUNCTION__, 'fed a non-fraction value' );
@@ -727,8 +727,8 @@ class Exif {
* Validates if a tag has a legal value according to the Exif spec
*
* @private
- * @param $section String: section where tag is located.
- * @param $tag String: the tag to check.
+ * @param string $section section where tag is located.
+ * @param string $tag the tag to check.
* @param $val Mixed: the value of the tag.
* @param $recursive Boolean: true if called recursively for array types.
* @return bool
@@ -748,10 +748,10 @@ class Exif {
return false;
}
if( $count > 1 ) {
- foreach( $val as $v ) {
+ foreach( $val as $v ) {
if( !$this->validate( $section, $tag, $v, true ) ) {
- return false;
- }
+ return false;
+ }
}
return true;
}
@@ -813,13 +813,13 @@ class Exif {
}
if ( $action === true ) {
- wfDebugLog( $this->log, "$class::$fname: accepted: '$in' (type: $type)\n");
+ wfDebugLog( $this->log, "$class::$fname: accepted: '$in' (type: $type)\n" );
} elseif ( $action === false ) {
- wfDebugLog( $this->log, "$class::$fname: rejected: '$in' (type: $type)\n");
+ wfDebugLog( $this->log, "$class::$fname: rejected: '$in' (type: $type)\n" );
} elseif ( $action === null ) {
- wfDebugLog( $this->log, "$class::$fname: input was: '$in' (type: $type)\n");
+ wfDebugLog( $this->log, "$class::$fname: input was: '$in' (type: $type)\n" );
} else {
- wfDebugLog( $this->log, "$class::$fname: $action (type: $type; content: '$in')\n");
+ wfDebugLog( $this->log, "$class::$fname: $action (type: $type; content: '$in')\n" );
}
}
@@ -828,7 +828,7 @@ class Exif {
*
* @private
*
- * @param $fname String: the name of the function calling this function
+ * @param string $fname the name of the function calling this function
* @param $io Boolean: Specify whether we're beginning or ending
*/
private function debugFile( $fname, $io ) {
@@ -843,4 +843,3 @@ class Exif {
}
}
}
-
diff --git a/includes/media/ExifBitmap.php b/includes/media/ExifBitmap.php
index 34a1f511..1671ab25 100644
--- a/includes/media/ExifBitmap.php
+++ b/includes/media/ExifBitmap.php
@@ -34,8 +34,8 @@ class ExifBitmapHandler extends BitmapHandler {
function convertMetadataVersion( $metadata, $version = 1 ) {
// basically flattens arrays.
- $version = explode(';', $version, 2);
- $version = intval($version[0]);
+ $version = explode( ';', $version, 2 );
+ $version = intval( $version[0] );
if ( $version < 1 || $version >= 2 ) {
return $metadata;
}
@@ -56,7 +56,7 @@ class ExifBitmapHandler extends BitmapHandler {
&& is_array( $metadata['Software'][0])
&& isset( $metadata['Software'][0][0] )
&& isset( $metadata['Software'][0][1])
- ) {
+ ) {
$metadata['Software'] = $metadata['Software'][0][0] . ' (Version '
. $metadata['Software'][0][1] . ')';
}
@@ -86,7 +86,7 @@ class ExifBitmapHandler extends BitmapHandler {
if ( $metadata === self::OLD_BROKEN_FILE ) {
# Old special value indicating that there is no EXIF data in the file.
# or that there was an error well extracting the metadata.
- wfDebug( __METHOD__ . ": back-compat version\n");
+ wfDebug( __METHOD__ . ": back-compat version\n" );
return self::METADATA_COMPATIBLE;
}
if ( $metadata === self::BROKEN_FILE ) {
@@ -102,11 +102,11 @@ class ExifBitmapHandler extends BitmapHandler {
$exif['MEDIAWIKI_EXIF_VERSION'] == 1 )
{
//back-compatible but old
- wfDebug( __METHOD__.": back-compat version\n" );
+ wfDebug( __METHOD__ . ": back-compat version\n" );
return self::METADATA_COMPATIBLE;
}
# Wrong (non-compatible) version
- wfDebug( __METHOD__.": wrong version\n" );
+ wfDebug( __METHOD__ . ": wrong version\n" );
return self::METADATA_BAD;
}
return self::METADATA_GOOD;
@@ -163,7 +163,7 @@ class ExifBitmapHandler extends BitmapHandler {
$rotation = 0;
}
- if ($rotation == 90 || $rotation == 270) {
+ if ( $rotation == 90 || $rotation == 270 ) {
$width = $gis[0];
$gis[0] = $gis[1];
$gis[1] = $width;
@@ -225,4 +225,3 @@ class ExifBitmapHandler extends BitmapHandler {
return 0;
}
}
-
diff --git a/includes/media/FormatMetadata.php b/includes/media/FormatMetadata.php
index 843c1fa2..1a7d7723 100644
--- a/includes/media/FormatMetadata.php
+++ b/includes/media/FormatMetadata.php
@@ -1,6 +1,6 @@
<?php
/**
- * Formating of image metadata values into human readable form.
+ * Formatting of image metadata values into human readable form.
*
* 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
@@ -25,7 +25,6 @@
* @file
*/
-
/**
* Format Image metadata values into a human readable form.
*
@@ -53,7 +52,7 @@ class FormatMetadata {
* value which most of the time are plain integers. This function
* formats Exif (and other metadata) values into human readable form.
*
- * @param $tags Array: the Exif data to format ( as returned by
+ * @param array $tags the Exif data to format ( as returned by
* Exif::getFilteredData() or BitmapMetadataHandler )
* @return array
*/
@@ -80,20 +79,20 @@ class FormatMetadata {
}
//This is done differently as the tag is an array.
- if ($tag == 'GPSTimeStamp' && count($vals) === 3) {
+ if ( $tag == 'GPSTimeStamp' && count( $vals ) === 3) {
//hour min sec array
- $h = explode('/', $vals[0]);
- $m = explode('/', $vals[1]);
- $s = explode('/', $vals[2]);
+ $h = explode( '/', $vals[0] );
+ $m = explode( '/', $vals[1] );
+ $s = explode( '/', $vals[2] );
// this should already be validated
// when loaded from file, but it could
// come from a foreign repo, so be
// paranoid.
- if ( !isset($h[1])
- || !isset($m[1])
- || !isset($s[1])
+ if ( !isset( $h[1] )
+ || !isset( $m[1] )
+ || !isset( $s[1] )
|| $h[1] == 0
|| $m[1] == 0
|| $s[1] == 0
@@ -322,7 +321,7 @@ class FormatMetadata {
if ( $subTag != 'fired' && $subValue == 0 ) {
continue;
}
- $fullTag = $tag . '-' . $subTag ;
+ $fullTag = $tag . '-' . $subTag;
$flashMsgs[] = self::msg( $fullTag, $subValue );
}
$val = $wgLang->commaList( $flashMsgs );
@@ -526,7 +525,6 @@ class FormatMetadata {
}
break;
-
case 'GPSTrackRef':
case 'GPSImgDirectionRef':
case 'GPSDestBearingRef':
@@ -631,7 +629,7 @@ class FormatMetadata {
case 'MaxApertureValue':
if ( strpos( $val, '/' ) !== false ) {
// need to expand this earlier to calculate fNumber
- list($n, $d) = explode('/', $val);
+ list( $n, $d ) = explode( '/', $val );
if ( is_numeric( $n ) && is_numeric( $d ) ) {
$val = $n / $d;
}
@@ -809,7 +807,7 @@ class FormatMetadata {
case 'LanguageCode':
$lang = Language::fetchLanguageName( strtolower( $val ), $wgLang->getCode() );
- if ($lang) {
+ if ( $lang ) {
$val = htmlspecialchars( $lang );
} else {
$val = htmlspecialchars( $val );
@@ -829,20 +827,20 @@ class FormatMetadata {
}
/**
- * A function to collapse multivalued tags into a single value.
- * This turns an array of (for example) authors into a bulleted list.
- *
- * This is public on the basis it might be useful outside of this class.
- *
- * @param $vals Array array of values
- * @param $type String Type of array (either lang, ul, ol).
- * lang = language assoc array with keys being the lang code
- * ul = unordered list, ol = ordered list
- * type can also come from the '_type' member of $vals.
- * @param $noHtml Boolean If to avoid returning anything resembling
- * html. (Ugly hack for backwards compatibility with old mediawiki).
- * @return String single value (in wiki-syntax).
- */
+ * A function to collapse multivalued tags into a single value.
+ * This turns an array of (for example) authors into a bulleted list.
+ *
+ * This is public on the basis it might be useful outside of this class.
+ *
+ * @param array $vals array of values
+ * @param string $type Type of array (either lang, ul, ol).
+ * lang = language assoc array with keys being the lang code
+ * ul = unordered list, ol = ordered list
+ * type can also come from the '_type' member of $vals.
+ * @param $noHtml Boolean If to avoid returning anything resembling
+ * html. (Ugly hack for backwards compatibility with old mediawiki).
+ * @return String single value (in wiki-syntax).
+ */
public static function flattenArray( $vals, $type = 'ul', $noHtml = false ) {
if ( isset( $vals['_type'] ) ) {
$type = $vals['_type'];
@@ -850,7 +848,7 @@ class FormatMetadata {
}
if ( !is_array( $vals ) ) {
- return $vals; // do nothing if not an array;
+ return $vals; // do nothing if not an array;
}
elseif ( count( $vals ) === 1 && $type !== 'lang' ) {
return $vals[0];
@@ -899,7 +897,7 @@ class FormatMetadata {
}
$content .= self::langItem(
$vals[$cLang], $cLang,
- $isDefault, $noHtml );
+ $isDefault, $noHtml );
unset( $vals[$cLang] );
}
@@ -915,8 +913,8 @@ class FormatMetadata {
}
if ( $defaultItem !== false ) {
$content = self::langItem( $defaultItem,
- $defaultLang, true, $noHtml )
- . $content;
+ $defaultLang, true, $noHtml ) .
+ $content;
}
if ( $noHtml ) {
return $content;
@@ -941,8 +939,8 @@ class FormatMetadata {
/** Helper function for creating lists of translations.
*
- * @param $value String value (this is not escaped)
- * @param $lang String lang code of item or false
+ * @param string $value value (this is not escaped)
+ * @param string $lang lang code of item or false
* @param $default Boolean if it is default value.
* @param $noHtml Boolean If to avoid html (for back-compat)
* @throws MWException
@@ -951,8 +949,8 @@ class FormatMetadata {
*/
private static function langItem( $value, $lang, $default = false, $noHtml = false ) {
if ( $lang === false && $default === false) {
- throw new MWException('$lang and $default cannot both '
- . 'be false.');
+ throw new MWException( '$lang and $default cannot both '
+ . 'be false.' );
}
if ( $noHtml ) {
@@ -1008,16 +1006,16 @@ class FormatMetadata {
*
* @private
*
- * @param $tag String: the tag name to pass on
- * @param $val String: the value of the tag
- * @param $arg String: an argument to pass ($1)
- * @param $arg2 String: a 2nd argument to pass ($2)
+ * @param string $tag the tag name to pass on
+ * @param string $val the value of the tag
+ * @param string $arg an argument to pass ($1)
+ * @param string $arg2 a 2nd argument to pass ($2)
* @return string A wfMessage of "exif-$tag-$val" in lower case
*/
static function msg( $tag, $val, $arg = null, $arg2 = null ) {
global $wgContLang;
- if ($val === '')
+ if ( $val === '' )
$val = 'value';
return wfMessage( $wgContLang->lc( "exif-$tag-$val" ), $arg, $arg2 )->text();
}
@@ -1033,10 +1031,10 @@ class FormatMetadata {
static function formatNum( $num, $round = false ) {
global $wgLang;
$m = array();
- if( is_array($num) ) {
+ if( is_array( $num ) ) {
$out = array();
foreach( $num as $number ) {
- $out[] = self::formatNum($number);
+ $out[] = self::formatNum( $number );
}
return $wgLang->commaList( $out );
}
@@ -1117,16 +1115,16 @@ class FormatMetadata {
* Note, leading 0's are significant, so this is
* a string, not an int.
*
- * @param $val String: The 8 digit news code.
+ * @param string $val The 8 digit news code.
* @return string The human readable form
*/
- static private function convertNewsCode( $val ) {
+ private static function convertNewsCode( $val ) {
if ( !preg_match( '/^\d{8}$/D', $val ) ) {
// Not a valid news code.
return $val;
}
$cat = '';
- switch( substr( $val , 0, 2 ) ) {
+ switch( substr( $val, 0, 2 ) ) {
case '01':
$cat = 'ace';
break;
@@ -1190,8 +1188,8 @@ class FormatMetadata {
* Format a coordinate value, convert numbers from floating point
* into degree minute second representation.
*
- * @param $coord int degrees, minutes and seconds
- * @param $type String: latitude or longitude (for if its a NWS or E)
+ * @param int $coord degrees, minutes and seconds
+ * @param string $type latitude or longitude (for if its a NWS or E)
* @return mixed A floating point number or whatever we were fed
*/
static function formatCoords( $coord, $type ) {
@@ -1226,7 +1224,7 @@ class FormatMetadata {
/**
* Format the contact info field into a single value.
*
- * @param $vals Array array with fields of the ContactInfo
+ * @param array $vals array with fields of the ContactInfo
* struct defined in the IPTC4XMP spec. Or potentially
* an array with one element that is a free form text
* value from the older iptc iim 1:118 prop.
@@ -1238,7 +1236,7 @@ class FormatMetadata {
* @return String of html-ish looking wikitext
*/
public static function collapseContactInfo( $vals ) {
- if( ! ( isset( $vals['CiAdrExtadr'] )
+ if( !( isset( $vals['CiAdrExtadr'] )
|| isset( $vals['CiAdrCity'] )
|| isset( $vals['CiAdrCtry'] )
|| isset( $vals['CiEmailWork'] )
@@ -1353,7 +1351,7 @@ class FormatMetadata {
*
* @deprecated since 1.18
*
-**/
+ */
class FormatExif {
var $meta;
@@ -1361,7 +1359,7 @@ class FormatExif {
* @param $meta array
*/
function FormatExif( $meta ) {
- wfDeprecated(__METHOD__);
+ wfDeprecated( __METHOD__, '1.18' );
$this->meta = $meta;
}
diff --git a/includes/media/GIF.php b/includes/media/GIF.php
index 84b9b8ca..2e532feb 100644
--- a/includes/media/GIF.php
+++ b/includes/media/GIF.php
@@ -29,7 +29,7 @@
class GIFHandler extends BitmapHandler {
const BROKEN_FILE = '0'; // value to store in img_metadata if error extracting metadata.
-
+
function getMetadata( $image, $filename ) {
try {
$parsedGIFMetadata = BitmapMetadataHandler::GIF( $filename );
@@ -39,7 +39,7 @@ class GIFHandler extends BitmapHandler {
return self::BROKEN_FILE;
}
- return serialize($parsedGIFMetadata);
+ return serialize( $parsedGIFMetadata );
}
/**
@@ -53,7 +53,7 @@ class GIFHandler extends BitmapHandler {
return false;
}
$meta = unserialize( $meta );
- if ( !isset( $meta['metadata'] ) || count( $meta['metadata'] ) <= 1 ) {
+ if ( !isset( $meta['metadata'] ) || count( $meta['metadata'] ) <= 1 ) {
return false;
}
@@ -85,7 +85,7 @@ class GIFHandler extends BitmapHandler {
function isAnimatedImage( $image ) {
$ser = $image->getMetadata();
if ( $ser ) {
- $metadata = unserialize($ser);
+ $metadata = unserialize( $ser );
if( $metadata['frameCount'] > 1 ) {
return true;
}
@@ -119,13 +119,13 @@ class GIFHandler extends BitmapHandler {
wfRestoreWarnings();
if ( !$data || !is_array( $data ) ) {
- wfDebug(__METHOD__ . ' invalid GIF metadata' );
+ wfDebug( __METHOD__ . ' invalid GIF metadata' );
return self::METADATA_BAD;
}
if ( !isset( $data['metadata']['_MW_GIF_VERSION'] )
|| $data['metadata']['_MW_GIF_VERSION'] != GIFMetadataExtractor::VERSION ) {
- wfDebug(__METHOD__ . ' old but compatible GIF metadata' );
+ wfDebug( __METHOD__ . ' old but compatible GIF metadata' );
return self::METADATA_COMPATIBLE;
}
return self::METADATA_GOOD;
@@ -141,29 +141,29 @@ class GIFHandler extends BitmapHandler {
$original = parent::getLongDesc( $image );
wfSuppressWarnings();
- $metadata = unserialize($image->getMetadata());
+ $metadata = unserialize( $image->getMetadata() );
wfRestoreWarnings();
-
- if (!$metadata || $metadata['frameCount'] <= 1) {
+
+ if ( !$metadata || $metadata['frameCount'] <= 1 ) {
return $original;
}
/* Preserve original image info string, but strip the last char ')' so we can add even more */
$info = array();
$info[] = $original;
-
+
if ( $metadata['looped'] ) {
$info[] = wfMessage( 'file-info-gif-looped' )->parse();
}
-
+
if ( $metadata['frameCount'] > 1 ) {
$info[] = wfMessage( 'file-info-gif-frames' )->numParams( $metadata['frameCount'] )->parse();
}
-
+
if ( $metadata['duration'] ) {
$info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
}
-
+
return $wgLang->commaList( $info );
}
}
diff --git a/includes/media/GIFMetadataExtractor.php b/includes/media/GIFMetadataExtractor.php
index 5fc5c1a7..6a4e753d 100644
--- a/includes/media/GIFMetadataExtractor.php
+++ b/includes/media/GIFMetadataExtractor.php
@@ -49,16 +49,16 @@ class GIFMetadataExtractor {
* @return array
*/
static function getMetadata( $filename ) {
- self::$gif_frame_sep = pack( "C", ord("," ) );
- self::$gif_extension_sep = pack( "C", ord("!" ) );
- self::$gif_term = pack( "C", ord(";" ) );
+ self::$gif_frame_sep = pack( "C", ord( "," ) );
+ self::$gif_extension_sep = pack( "C", ord( "!" ) );
+ self::$gif_term = pack( "C", ord( ";" ) );
$frameCount = 0;
$duration = 0.0;
$isLooped = false;
$xmp = "";
$comment = array();
-
+
if ( !$filename ) {
throw new Exception( "No file name specified" );
} elseif ( !file_exists( $filename ) || is_dir( $filename ) ) {
@@ -73,7 +73,7 @@ class GIFMetadataExtractor {
// Check for the GIF header
$buf = fread( $fh, 6 );
- if ( !($buf == 'GIF87a' || $buf == 'GIF89a') ) {
+ if ( !( $buf == 'GIF87a' || $buf == 'GIF89a' ) ) {
throw new Exception( "Not a valid GIF file; header: $buf" );
}
@@ -93,7 +93,7 @@ class GIFMetadataExtractor {
while( !feof( $fh ) ) {
$buf = fread( $fh, 1 );
- if ($buf == self::$gif_frame_sep) {
+ if ( $buf == self::$gif_frame_sep ) {
// Found a frame
$frameCount++;
@@ -107,14 +107,14 @@ class GIFMetadataExtractor {
## Read GCT
self::readGCT( $fh, $bpp );
fread( $fh, 1 );
- self::skipBlock( $fh );
+ self::skipBlock( $fh );
} elseif ( $buf == self::$gif_extension_sep ) {
$buf = fread( $fh, 1 );
if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
$extension_code = unpack( 'C', $buf );
$extension_code = $extension_code[1];
- if ($extension_code == 0xF9) {
+ if ( $extension_code == 0xF9 ) {
// Graphics Control Extension.
fread( $fh, 1 ); // Block size
@@ -132,10 +132,10 @@ class GIFMetadataExtractor {
if ( strlen( $term ) < 1 ) throw new Exception( "Ran out of input" );
$term = unpack( 'C', $term );
$term = $term[1];
- if ($term != 0 ) {
+ if ( $term != 0 ) {
throw new Exception( "Malformed Graphics Control Extension block" );
}
- } elseif ($extension_code == 0xFE) {
+ } elseif ( $extension_code == 0xFE ) {
// Comment block(s).
$data = self::readBlock( $fh );
if ( $data === "" ) {
@@ -164,7 +164,7 @@ class GIFMetadataExtractor {
// is identical to the last, only extract once.
$comment[] = $data;
}
- } elseif ($extension_code == 0xFF) {
+ } elseif ( $extension_code == 0xFF ) {
// Application extension (Netscape info about the animated gif)
// or XMP (or theoretically any other type of extension block)
$blockLength = fread( $fh, 1 );
@@ -173,7 +173,7 @@ class GIFMetadataExtractor {
$blockLength = $blockLength[1];
$data = fread( $fh, $blockLength );
- if ($blockLength != 11 ) {
+ if ( $blockLength != 11 ) {
wfDebug( __METHOD__ . ' GIF application block with wrong length' );
fseek( $fh, -($blockLength + 1), SEEK_CUR );
self::skipBlock( $fh );
@@ -182,23 +182,22 @@ class GIFMetadataExtractor {
// NETSCAPE2.0 (application name for animated gif)
if ( $data == 'NETSCAPE2.0' ) {
-
$data = fread( $fh, 2 ); // Block length and introduction, should be 03 01
- if ($data != "\x03\x01") {
+ if ( $data != "\x03\x01" ) {
throw new Exception( "Expected \x03\x01, got $data" );
}
-
+
// Unsigned little-endian integer, loop count or zero for "forever"
$loopData = fread( $fh, 2 );
if ( strlen( $loopData ) < 2 ) throw new Exception( "Ran out of input" );
$loopData = unpack( 'v', $loopData );
$loopCount = $loopData[1];
-
- if ($loopCount != 1) {
+
+ if ( $loopCount != 1 ) {
$isLooped = true;
}
-
+
// Read out terminator byte
fread( $fh, 1 );
} elseif ( $data == 'XMP DataXMP' ) {
@@ -232,7 +231,7 @@ class GIFMetadataExtractor {
if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
$byte = unpack( 'C', $buf );
$byte = $byte[1];
- throw new Exception( "At position: ".ftell($fh). ", Unknown byte ".$byte );
+ throw new Exception( "At position: " . ftell( $fh ) . ", Unknown byte " . $byte );
}
}
@@ -252,7 +251,7 @@ class GIFMetadataExtractor {
*/
static function readGCT( $fh, $bpp ) {
if ( $bpp > 0 ) {
- for( $i=1; $i<=pow( 2, $bpp ); ++$i ) {
+ for( $i = 1; $i <= pow( 2, $bpp ); ++$i ) {
fread( $fh, 3 );
}
}
@@ -260,6 +259,7 @@ class GIFMetadataExtractor {
/**
* @param $data
+ * @throws Exception
* @return int
*/
static function decodeBPP( $data ) {
@@ -276,7 +276,7 @@ class GIFMetadataExtractor {
/**
* @param $fh
- * @return
+ * @throws Exception
*/
static function skipBlock( $fh ) {
while ( !feof( $fh ) ) {
@@ -284,12 +284,13 @@ class GIFMetadataExtractor {
if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
$block_len = unpack( 'C', $buf );
$block_len = $block_len[1];
- if ($block_len == 0) {
+ if ( $block_len == 0 ) {
return;
}
fread( $fh, $block_len );
}
}
+
/**
* Read a block. In the GIF format, a block is made up of
* several sub-blocks. Each sub block starts with one byte
@@ -301,6 +302,7 @@ class GIFMetadataExtractor {
* sub-blocks in the returned value. Normally this is false,
* except XMP is weird and does a hack where you need to keep
* these length bytes.
+ * @throws Exception
* @return string The data.
*/
static function readBlock( $fh, $includeLengths = false ) {
diff --git a/includes/media/IPTC.php b/includes/media/IPTC.php
index 8fd3552f..4191cde0 100644
--- a/includes/media/IPTC.php
+++ b/includes/media/IPTC.php
@@ -29,27 +29,27 @@
class IPTC {
/**
- * This takes the results of iptcparse() and puts it into a
- * form that can be handled by mediawiki. Generally called from
- * BitmapMetadataHandler::doApp13.
- *
- * @see http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf
- *
- * @param $rawData String app13 block from jpeg containing iptc/iim data
- * @return Array iptc metadata array
- */
+ * This takes the results of iptcparse() and puts it into a
+ * form that can be handled by mediawiki. Generally called from
+ * BitmapMetadataHandler::doApp13.
+ *
+ * @see http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf
+ *
+ * @param string $rawData app13 block from jpeg containing iptc/iim data
+ * @return Array iptc metadata array
+ */
static function parse( $rawData ) {
$parsed = iptcparse( $rawData );
$data = Array();
- if (!is_array($parsed)) {
+ if ( !is_array( $parsed ) ) {
return $data;
}
$c = '';
//charset info contained in tag 1:90.
- if (isset($parsed['1#090']) && isset($parsed['1#090'][0])) {
- $c = self::getCharset($parsed['1#090'][0]);
- if ($c === false) {
+ if ( isset( $parsed['1#090'] ) && isset( $parsed['1#090'][0] ) ) {
+ $c = self::getCharset( $parsed['1#090'][0] );
+ if ( $c === false ) {
//Unknown charset. refuse to parse.
//note: There is a different between
//unknown and no charset specified.
@@ -59,8 +59,8 @@ class IPTC {
}
foreach ( $parsed as $tag => $val ) {
- if ( isset( $val[0] ) && trim($val[0]) == '' ) {
- wfDebugLog('iptc', "IPTC tag $tag had only whitespace as its value.");
+ if ( isset( $val[0] ) && trim( $val[0] ) == '' ) {
+ wfDebugLog( 'iptc', "IPTC tag $tag had only whitespace as its value." );
continue;
}
switch( $tag ) {
@@ -175,7 +175,7 @@ class IPTC {
if ( isset( $parsed['2#070'] ) ) {
//if a version is set for the software.
$softwareVersion = self::convIPTC( $parsed['2#070'], $c );
- unset($parsed['2#070']);
+ unset( $parsed['2#070'] );
$data['Software'] = array( array( $software[0], $softwareVersion[0] ) );
} else {
$data['Software'] = $software;
@@ -198,7 +198,7 @@ class IPTC {
/* original transmission ref.
* "A code representing the location of original transmission ac-
* cording to practises of the provider."
- */
+ */
$data['OriginalTransmissionRef'] = self::convIPTC( $val, $c );
break;
case '2#118': /*contact*/
@@ -227,8 +227,8 @@ class IPTC {
} else {
$time = Array();
}
- $timestamp = self::timeHelper( $val, $time, $c );
- if ($timestamp) {
+ $timestamp = self::timeHelper( $val, $time, $c );
+ if ( $timestamp ) {
$data['DateTimeOriginal'] = $timestamp;
}
break;
@@ -241,8 +241,8 @@ class IPTC {
} else {
$time = Array();
}
- $timestamp = self::timeHelper( $val, $time, $c );
- if ($timestamp) {
+ $timestamp = self::timeHelper( $val, $time, $c );
+ if ( $timestamp ) {
$data['DateTimeDigitized'] = $timestamp;
}
break;
@@ -254,8 +254,8 @@ class IPTC {
} else {
$time = Array();
}
- $timestamp = self::timeHelper( $val, $time, $c );
- if ($timestamp) {
+ $timestamp = self::timeHelper( $val, $time, $c );
+ if ( $timestamp ) {
$data['DateTimeReleased'] = $timestamp;
}
break;
@@ -267,8 +267,8 @@ class IPTC {
} else {
$time = Array();
}
- $timestamp = self::timeHelper( $val, $time, $c );
- if ($timestamp) {
+ $timestamp = self::timeHelper( $val, $time, $c );
+ if ( $timestamp ) {
$data['DateTimeExpires'] = $timestamp;
}
break;
@@ -313,7 +313,7 @@ class IPTC {
// describing the subject matter of the content.
$codes = self::convIPTC( $val, $c );
foreach ( $codes as $ic ) {
- $fields = explode(':', $ic, 3 );
+ $fields = explode( ':', $ic, 3 );
if ( count( $fields ) < 2 ||
$fields[0] !== 'IPTC' )
@@ -350,43 +350,43 @@ class IPTC {
}
/**
- * Convert an iptc date and time tags into the exif format
- *
- * @todo Potentially this should also capture the timezone offset.
- * @param Array $date The date tag
- * @param Array $time The time tag
- * @param $c
- * @return String Date in exif format.
- */
+ * Convert an iptc date and time tags into the exif format
+ *
+ * @todo Potentially this should also capture the timezone offset.
+ * @param array $date The date tag
+ * @param array $time The time tag
+ * @param $c
+ * @return String Date in exif format.
+ */
private static function timeHelper( $date, $time, $c ) {
if ( count( $date ) === 1 ) {
//the standard says this should always be 1
//just double checking.
- list($date) = self::convIPTC( $date, $c );
+ list( $date ) = self::convIPTC( $date, $c );
} else {
return null;
}
if ( count( $time ) === 1 ) {
- list($time) = self::convIPTC( $time, $c );
+ list( $time ) = self::convIPTC( $time, $c );
$dateOnly = false;
} else {
$time = '000000+0000'; //placeholder
$dateOnly = true;
}
- if ( ! ( preg_match('/\d\d\d\d\d\d[-+]\d\d\d\d/', $time)
- && preg_match('/\d\d\d\d\d\d\d\d/', $date)
- && substr($date, 0, 4) !== '0000'
- && substr($date, 4, 2) !== '00'
- && substr($date, 6, 2) !== '00'
- ) ) {
+ if ( !( preg_match( '/\d\d\d\d\d\d[-+]\d\d\d\d/', $time )
+ && preg_match( '/\d\d\d\d\d\d\d\d/', $date )
+ && substr( $date, 0, 4 ) !== '0000'
+ && substr( $date, 4, 2 ) !== '00'
+ && substr( $date, 6, 2 ) !== '00'
+ ) ) {
//something wrong.
// Note, this rejects some valid dates according to iptc spec
// for example: the date 00000400 means the photo was taken in
// April, but the year and day is unknown. We don't process these
// types of incomplete dates atm.
- wfDebugLog( 'iptc', "IPTC: invalid time ( $time ) or date ( $date )");
+ wfDebugLog( 'iptc', "IPTC: invalid time ( $time ) or date ( $date )" );
return null;
}
@@ -417,15 +417,15 @@ class IPTC {
}
/**
- * Helper function to convert charset for iptc values.
- * @param $data string|array The iptc string
- * @param $charset String: The charset
+ * Helper function to convert charset for iptc values.
+ * @param string|array $data The iptc string
+ * @param string $charset The charset
*
* @return string|array
- */
+ */
private static function convIPTC ( $data, $charset ) {
if ( is_array( $data ) ) {
- foreach ($data as &$val) {
+ foreach ( $data as &$val ) {
$val = self::convIPTCHelper( $val, $charset );
}
} else {
@@ -435,27 +435,27 @@ class IPTC {
return $data;
}
/**
- * Helper function of a helper function to convert charset for iptc values.
- * @param $data Mixed String or Array: The iptc string
- * @param $charset String: The charset
- *
- * @return string
- */
+ * Helper function of a helper function to convert charset for iptc values.
+ * @param $data Mixed String or Array: The iptc string
+ * @param string $charset The charset
+ *
+ * @return string
+ */
private static function convIPTCHelper ( $data, $charset ) {
if ( $charset ) {
wfSuppressWarnings();
- $data = iconv($charset, "UTF-8//IGNORE", $data);
+ $data = iconv( $charset, "UTF-8//IGNORE", $data );
wfRestoreWarnings();
- if ($data === false) {
+ if ( $data === false ) {
$data = "";
- wfDebugLog('iptc', __METHOD__ . " Error converting iptc data charset $charset to utf-8");
+ wfDebugLog( 'iptc', __METHOD__ . " Error converting iptc data charset $charset to utf-8" );
}
} else {
//treat as utf-8 if is valid utf-8. otherwise pretend its windows-1252
// most of the time if there is no 1:90 tag, it is either ascii, latin1, or utf-8
$oldData = $data;
UtfNormal::quickIsNFCVerify( $data ); //make $data valid utf-8
- if ($data === $oldData) {
+ if ( $data === $oldData ) {
return $data; //if validation didn't change $data
} else {
return self::convIPTCHelper( $oldData, 'Windows-1252' );
@@ -465,14 +465,14 @@ class IPTC {
}
/**
- * take the value of 1:90 tag and returns a charset
- * @param String $tag 1:90 tag.
- * @return string charset name or "?"
- * Warning, this function does not (and is not intended to) detect
- * all iso 2022 escape codes. In practise, the code for utf-8 is the
- * only code that seems to have wide use. It does detect that code.
- */
- static function getCharset($tag) {
+ * take the value of 1:90 tag and returns a charset
+ * @param string $tag 1:90 tag.
+ * @return string charset name or "?"
+ * Warning, this function does not (and is not intended to) detect
+ * all iso 2022 escape codes. In practise, the code for utf-8 is the
+ * only code that seems to have wide use. It does detect that code.
+ */
+ static function getCharset( $tag ) {
//According to iim standard, charset is defined by the tag 1:90.
//in which there are iso 2022 escape sequences to specify the character set.
@@ -530,7 +530,7 @@ class IPTC {
case "\x1b(K":
$c = "ISO646-DE";
break;
- case "\x1b(N": //crylic
+ case "\x1b(N": //crylic
$c = "ISO_5427";
break;
case "\x1b(`": //iso646-NO
@@ -590,7 +590,7 @@ class IPTC {
$c = 'CSN_369103';
break;
default:
- wfDebugLog('iptc', __METHOD__ . 'Unknown charset in iptc 1:90: ' . bin2hex( $tag ) );
+ wfDebugLog( 'iptc', __METHOD__ . 'Unknown charset in iptc 1:90: ' . bin2hex( $tag ) );
//at this point just give up and refuse to parse iptc?
$c = false;
}
diff --git a/includes/media/ImageHandler.php b/includes/media/ImageHandler.php
index 61759074..419afeef 100644
--- a/includes/media/ImageHandler.php
+++ b/includes/media/ImageHandler.php
@@ -139,7 +139,6 @@ abstract class ImageHandler extends MediaHandler {
$params['height'] = $params['physicalHeight'];
}
-
if ( !$this->validateThumbParams( $params['physicalWidth'],
$params['physicalHeight'], $srcWidth, $srcHeight, $mimeType ) ) {
return false;
@@ -162,11 +161,11 @@ abstract class ImageHandler extends MediaHandler {
# Sanity check $width
if( $width <= 0) {
- wfDebug( __METHOD__.": Invalid destination width: $width\n" );
+ wfDebug( __METHOD__ . ": Invalid destination width: $width\n" );
return false;
}
if ( $srcWidth <= 0 ) {
- wfDebug( __METHOD__.": Invalid source width: $srcWidth\n" );
+ wfDebug( __METHOD__ . ": Invalid source width: $srcWidth\n" );
return false;
}
@@ -188,7 +187,7 @@ abstract class ImageHandler extends MediaHandler {
if ( !$this->normaliseParams( $image, $params ) ) {
return false;
}
- $url = $script . '&' . wfArrayToCGI( $this->getScriptParams( $params ) );
+ $url = $script . '&' . wfArrayToCgi( $this->getScriptParams( $params ) );
if( $image->mustRender() || $params['width'] < $image->getWidth() ) {
return new ThumbnailImage( $image, $url, false, $params );
diff --git a/includes/media/Jpeg.php b/includes/media/Jpeg.php
index a15b6524..8b5d6513 100644
--- a/includes/media/Jpeg.php
+++ b/includes/media/Jpeg.php
@@ -37,7 +37,7 @@ class JpegHandler extends ExifBitmapHandler {
$meta = BitmapMetadataHandler::Jpeg( $filename );
if ( !is_array( $meta ) ) {
// This should never happen, but doesn't hurt to be paranoid.
- throw new MWException('Metadata array is not an array');
+ throw new MWException( 'Metadata array is not an array' );
}
$meta['MEDIAWIKI_EXIF_VERSION'] = Exif::version();
return serialize( $meta );
@@ -59,5 +59,36 @@ class JpegHandler extends ExifBitmapHandler {
}
}
-}
+ /**
+ * @param $file File
+ * @param array $params Rotate parameters.
+ * 'rotation' clockwise rotation in degrees, allowed are multiples of 90
+ * @since 1.21
+ * @return bool
+ */
+ public function rotate( $file, $params ) {
+ global $wgJpegTran;
+
+ $rotation = ( $params[ 'rotation' ] + $this->getRotation( $file ) ) % 360;
+ if( $wgJpegTran && is_file( $wgJpegTran ) ){
+ $cmd = wfEscapeShellArg( $wgJpegTran ) .
+ " -rotate " . wfEscapeShellArg( $rotation ) .
+ " -outfile " . wfEscapeShellArg( $params[ 'dstPath' ] ) .
+ " " . wfEscapeShellArg( $params[ 'srcPath' ] ) . " 2>&1";
+ wfDebug( __METHOD__ . ": running jpgtran: $cmd\n" );
+ wfProfileIn( 'jpegtran' );
+ $retval = 0;
+ $err = wfShellExec( $cmd, $retval, $env );
+ wfProfileOut( 'jpegtran' );
+ if ( $retval !== 0 ) {
+ $this->logErrorForExternalProcess( $retval, $err, $cmd );
+ return new MediaTransformError( 'thumbnail_error', 0, 0, $err );
+ }
+ return false;
+ } else {
+ return parent::rotate( $file, $params );
+ }
+ }
+
+}
diff --git a/includes/media/JpegMetadataExtractor.php b/includes/media/JpegMetadataExtractor.php
index 8d7e43b9..6ff07ed2 100644
--- a/includes/media/JpegMetadataExtractor.php
+++ b/includes/media/JpegMetadataExtractor.php
@@ -25,7 +25,7 @@
* Class for reading jpegs and extracting metadata.
* see also BitmapMetadataHandler.
*
- * Based somewhat on GIFMetadataExtrator.
+ * Based somewhat on GIFMetadataExtractor.
*
* @ingroup Media
*/
@@ -37,16 +37,16 @@ class JpegMetadataExtractor {
// that many segments. Your average file has about 10.
/** Function to extract metadata segments of interest from jpeg files
- * based on GIFMetadataExtractor.
- *
- * we can almost use getimagesize to do this
- * but gis doesn't support having multiple app1 segments
- * and those can't extract xmp on files containing both exif and xmp data
- *
- * @param String $filename name of jpeg file
- * @return Array of interesting segments.
- * @throws MWException if given invalid file.
- */
+ * based on GIFMetadataExtractor.
+ *
+ * we can almost use getimagesize to do this
+ * but gis doesn't support having multiple app1 segments
+ * and those can't extract xmp on files containing both exif and xmp data
+ *
+ * @param string $filename name of jpeg file
+ * @return Array of interesting segments.
+ * @throws MWException if given invalid file.
+ */
static function segmentSplitter ( $filename ) {
$showXMP = function_exists( 'xml_parser_create_ns' );
@@ -129,7 +129,7 @@ class JpegMetadataExtractor {
// whatever...
$segments["XMP"] = substr( $temp, 29 );
wfDebug( __METHOD__ . ' Found XMP section with wrong app identifier '
- . "Using anyways.\n" );
+ . "Using anyways.\n" );
} elseif ( substr( $temp, 0, 6 ) === "Exif\0\0" ) {
// Just need to find out what the byte order is.
// because php's exif plugin sucks...
@@ -165,10 +165,11 @@ class JpegMetadataExtractor {
}
/**
- * Helper function for jpegSegmentSplitter
- * @param &$fh FileHandle for jpeg file
- * @return string data content of segment.
- */
+ * Helper function for jpegSegmentSplitter
+ * @param &$fh FileHandle for jpeg file
+ * @throws MWException
+ * @return string data content of segment.
+ */
private static function jpegExtractMarker( &$fh ) {
$size = wfUnpack( "nint", fread( $fh, 2 ), 2 );
if ( $size['int'] <= 2 ) {
@@ -182,18 +183,18 @@ class JpegMetadataExtractor {
}
/**
- * This reads the photoshop image resource.
- * Currently it only compares the iptc/iim hash
- * with the stored hash, which is used to determine the precedence
- * of the iptc data. In future it may extract some other info, like
- * url of copyright license.
- *
- * This should generally be called by BitmapMetadataHandler::doApp13()
- *
- * @param String $app13 photoshop psir app13 block from jpg.
- * @throws MWException (It gets caught next level up though)
- * @return String if the iptc hash is good or not.
- */
+ * This reads the photoshop image resource.
+ * Currently it only compares the iptc/iim hash
+ * with the stored hash, which is used to determine the precedence
+ * of the iptc data. In future it may extract some other info, like
+ * url of copyright license.
+ *
+ * This should generally be called by BitmapMetadataHandler::doApp13()
+ *
+ * @param string $app13 photoshop psir app13 block from jpg.
+ * @throws MWException (It gets caught next level up though)
+ * @return String if the iptc hash is good or not.
+ */
public static function doPSIR ( $app13 ) {
if ( !$app13 ) {
throw new MWException( "No App13 segment given" );
diff --git a/includes/media/MediaHandler.php b/includes/media/MediaHandler.php
index 965099fd..9a3f645b 100644
--- a/includes/media/MediaHandler.php
+++ b/includes/media/MediaHandler.php
@@ -46,7 +46,7 @@ abstract class MediaHandler {
static function getHandler( $type ) {
global $wgMediaHandlers;
if ( !isset( $wgMediaHandlers[$type] ) ) {
- wfDebug( __METHOD__ . ": no handler found for $type.\n");
+ wfDebug( __METHOD__ . ": no handler found for $type.\n" );
return false;
}
$class = $wgMediaHandlers[$type];
@@ -103,7 +103,7 @@ abstract class MediaHandler {
* can't be determined.
*
* @param $image File: the image object, or false if there isn't one
- * @param $path String: the filename
+ * @param string $path the filename
* @return Array Follow the format of PHP getimagesize() internal function. See http://www.php.net/getimagesize
*/
abstract function getImageSize( $image, $path );
@@ -113,42 +113,42 @@ abstract class MediaHandler {
*
* @param $image File: the image object, or false if there isn't one.
* Warning, FSFile::getPropsFromPath might pass an (object)array() instead (!)
- * @param $path String: the filename
+ * @param string $path the filename
* @return String
*/
function getMetadata( $image, $path ) { return ''; }
/**
- * Get metadata version.
- *
- * This is not used for validating metadata, this is used for the api when returning
- * metadata, since api content formats should stay the same over time, and so things
- * using ForiegnApiRepo can keep backwards compatibility
- *
- * All core media handlers share a common version number, and extensions can
- * use the GetMetadataVersion hook to append to the array (they should append a unique
- * string so not to get confusing). If there was a media handler named 'foo' with metadata
- * version 3 it might add to the end of the array the element 'foo=3'. if the core metadata
- * version is 2, the end version string would look like '2;foo=3'.
- *
- * @return string version string
- */
+ * Get metadata version.
+ *
+ * This is not used for validating metadata, this is used for the api when returning
+ * metadata, since api content formats should stay the same over time, and so things
+ * using ForiegnApiRepo can keep backwards compatibility
+ *
+ * All core media handlers share a common version number, and extensions can
+ * use the GetMetadataVersion hook to append to the array (they should append a unique
+ * string so not to get confusing). If there was a media handler named 'foo' with metadata
+ * version 3 it might add to the end of the array the element 'foo=3'. if the core metadata
+ * version is 2, the end version string would look like '2;foo=3'.
+ *
+ * @return string version string
+ */
static function getMetadataVersion () {
$version = Array( '2' ); // core metadata version
- wfRunHooks('GetMetadataVersion', Array(&$version));
+ wfRunHooks( 'GetMetadataVersion', Array( &$version ) );
return implode( ';', $version);
- }
-
- /**
- * Convert metadata version.
- *
- * By default just returns $metadata, but can be used to allow
- * media handlers to convert between metadata versions.
- *
- * @param $metadata Mixed String or Array metadata array (serialized if string)
- * @param $version Integer target version
- * @return Array serialized metadata in specified version, or $metadata on fail.
- */
+ }
+
+ /**
+ * Convert metadata version.
+ *
+ * By default just returns $metadata, but can be used to allow
+ * media handlers to convert between metadata versions.
+ *
+ * @param $metadata Mixed String or Array metadata array (serialized if string)
+ * @param $version Integer target version
+ * @return Array serialized metadata in specified version, or $metadata on fail.
+ */
function convertMetadataVersion( $metadata, $version = 1 ) {
if ( !is_array( $metadata ) ) {
@@ -181,7 +181,6 @@ abstract class MediaHandler {
return self::METADATA_GOOD;
}
-
/**
* Get a MediaTransformOutput object representing an alternate of the transformed
* output which will call an intermediary thumbnail assist script.
@@ -200,9 +199,9 @@ abstract class MediaHandler {
* actually do the transform.
*
* @param $image File: the image object
- * @param $dstPath String: filesystem destination path
- * @param $dstUrl String: Destination URL to use in output HTML
- * @param $params Array: Arbitrary set of parameters validated by $this->validateParam()
+ * @param string $dstPath filesystem destination path
+ * @param string $dstUrl Destination URL to use in output HTML
+ * @param array $params Arbitrary set of parameters validated by $this->validateParam()
* @return MediaTransformOutput
*/
final function getTransform( $image, $dstPath, $dstUrl, $params ) {
@@ -214,9 +213,9 @@ abstract class MediaHandler {
* transform unless $flags contains self::TRANSFORM_LATER.
*
* @param $image File: the image object
- * @param $dstPath String: filesystem destination path
- * @param $dstUrl String: destination URL to use in output HTML
- * @param $params Array: arbitrary set of parameters validated by $this->validateParam()
+ * @param string $dstPath filesystem destination path
+ * @param string $dstUrl destination URL to use in output HTML
+ * @param array $params arbitrary set of parameters validated by $this->validateParam()
* @param $flags Integer: a bitfield, may contain self::TRANSFORM_LATER
*
* @return MediaTransformOutput
@@ -244,6 +243,15 @@ abstract class MediaHandler {
}
/**
+ * Get useful response headers for GET/HEAD requests for a file with the given metadata
+ * @param $metadata mixed Result of the getMetadata() function of this handler for a file
+ * @return Array
+ */
+ public function getStreamHeaders( $metadata ) {
+ return array();
+ }
+
+ /**
* True if the handled types can be transformed
* @return bool
*/
@@ -352,11 +360,11 @@ abstract class MediaHandler {
*
* This is used by the media handlers that use the FormatMetadata class
*
- * @param $metadataArray Array metadata array
+ * @param array $metadataArray metadata array
* @return array for use displaying metadata.
*/
function formatMetadataHelper( $metadataArray ) {
- $result = array(
+ $result = array(
'visible' => array(),
'collapsed' => array()
);
@@ -396,7 +404,6 @@ abstract class MediaHandler {
return $fields;
}
-
/**
* This is used to generate an array element for each metadata value
* That array is then used to generate the table of metadata values
@@ -405,17 +412,17 @@ abstract class MediaHandler {
* @param &$array Array An array containing elements for each type of visibility
* and each of those elements being an array of metadata items. This function adds
* a value to that array.
- * @param $visibility string ('visible' or 'collapsed') if this value is hidden
+ * @param string $visibility ('visible' or 'collapsed') if this value is hidden
* by default.
- * @param $type String type of metadata tag (currently always 'exif')
- * @param $id String the name of the metadata tag (like 'artist' for example).
+ * @param string $type type of metadata tag (currently always 'exif')
+ * @param string $id the name of the metadata tag (like 'artist' for example).
* its name in the table displayed is the message "$type-$id" (Ex exif-artist ).
- * @param $value String thingy goes into a wikitext table; it used to be escaped but
+ * @param string $value thingy goes into a wikitext table; it used to be escaped but
* that was incompatible with previous practise of customized display
* with wikitext formatting via messages such as 'exif-model-value'.
* So the escaping is taken back out, but generally this seems a confusing
* interface.
- * @param $param String value to pass to the message for the name of the field
+ * @param string $param value to pass to the message for the name of the field
* as $1. Currently this parameter doesn't seem to ever be used.
*
* Note, everything here is passed through the parser later on (!)
@@ -512,7 +519,7 @@ abstract class MediaHandler {
* match the handler class, a Status object should be returned containing
* relevant errors.
*
- * @param $fileName string The local path to the file.
+ * @param string $fileName The local path to the file.
* @return Status object
*/
function verifyUpload( $fileName ) {
@@ -523,8 +530,8 @@ abstract class MediaHandler {
* Check for zero-sized thumbnails. These can be generated when
* no disk space is available or some other error occurs
*
- * @param $dstPath string The location of the suspect file
- * @param $retval int Return value of some shell process, file will be deleted if this is non-zero
+ * @param string $dstPath The location of the suspect file
+ * @param int $retval Return value of some shell process, file will be deleted if this is non-zero
* @return bool True if removed, false otherwise
*/
function removeBadFile( $dstPath, $retval = 0 ) {
@@ -557,4 +564,13 @@ abstract class MediaHandler {
public function filterThumbnailPurgeList( &$files, $options ) {
// Do nothing
}
+
+ /*
+ * True if the handler can rotate the media
+ * @since 1.21
+ * @return bool
+ */
+ public static function canRotate() {
+ return false;
+ }
}
diff --git a/includes/media/MediaTransformOutput.php b/includes/media/MediaTransformOutput.php
index 773824cb..1f95bc3b 100644
--- a/includes/media/MediaTransformOutput.php
+++ b/includes/media/MediaTransformOutput.php
@@ -33,6 +33,13 @@ abstract class MediaTransformOutput {
var $file;
var $width, $height, $url, $page, $path;
+
+ /**
+ * @var array Associative array mapping optional supplementary image files
+ * from pixel density (eg 1.5 or 2) to additional URLs.
+ */
+ public $responsiveUrls = array();
+
protected $storagePath = false;
/**
@@ -73,7 +80,7 @@ abstract class MediaTransformOutput {
}
/**
- * @param $storagePath string The permanent storage path
+ * @param string $storagePath The permanent storage path
* @return void
*/
public function setStoragePath( $storagePath ) {
@@ -83,7 +90,7 @@ abstract class MediaTransformOutput {
/**
* Fetch HTML for this transform output
*
- * @param $options array Associative array of options. Boolean options
+ * @param array $options Associative array of options. Boolean options
* should be indicated with a value of true for true, and false or
* absent for false.
*
@@ -153,7 +160,7 @@ abstract class MediaTransformOutput {
/**
* Stream the file if there were no errors
*
- * @param $headers Array Additional HTTP headers to send on success
+ * @param array $headers Additional HTTP headers to send on success
* @return Bool success
*/
public function streamFile( $headers = array() ) {
@@ -189,9 +196,12 @@ abstract class MediaTransformOutput {
* @return array
*/
public function getDescLinkAttribs( $title = null, $params = '' ) {
- $query = $this->page ? ( 'page=' . urlencode( $this->page ) ) : '';
+ $query = '';
+ if ( $this->page && $this->page !== 1 ) {
+ $query = 'page=' . urlencode( $this->page );
+ }
if( $params ) {
- $query .= $query ? '&'.$params : $params;
+ $query .= $query ? '&' . $params : $params;
}
$attribs = array(
'href' => $this->file->getTitle()->getLocalURL( $query ),
@@ -218,16 +228,16 @@ class ThumbnailImage extends MediaTransformOutput {
* It may also include a 'page' parameter for multipage files.
*
* @param $file File object
- * @param $url String: URL path to the thumb
+ * @param string $url URL path to the thumb
* @param $path String|bool|null: filesystem path to the thumb
- * @param $parameters Array: Associative array of parameters
+ * @param array $parameters Associative array of parameters
* @private
*/
function __construct( $file, $url, $path = false, $parameters = array() ) {
# Previous parameters:
# $file, $url, $width, $height, $path = false, $page = false
- if( is_array( $parameters ) ){
+ if( is_array( $parameters ) ) {
$defaults = array(
'page' => false
);
@@ -260,7 +270,7 @@ class ThumbnailImage extends MediaTransformOutput {
* Return HTML <img ... /> tag for the thumbnail, will include
* width and height attributes and a blank alt text (as required).
*
- * @param $options array Associative array of options. Boolean options
+ * @param array $options Associative array of options. Boolean options
* should be indicated with a value of true for true, and false or
* absent for false.
*
@@ -281,6 +291,7 @@ class ThumbnailImage extends MediaTransformOutput {
* For images, desc-link and file-link are implemented as a click-through. For
* sounds and videos, they may be displayed in other ways.
*
+ * @throws MWException
* @return string
*/
function toHtml( $options = array() ) {
@@ -290,7 +301,7 @@ class ThumbnailImage extends MediaTransformOutput {
$alt = empty( $options['alt'] ) ? '' : $options['alt'];
- $query = empty( $options['desc-query'] ) ? '' : $options['desc-query'];
+ $query = empty( $options['desc-query'] ) ? '' : $options['desc-query'];
if ( !empty( $options['custom-url-link'] ) ) {
$linkAttribs = array( 'href' => $options['custom-url-link'] );
@@ -323,7 +334,7 @@ class ThumbnailImage extends MediaTransformOutput {
'alt' => $alt,
'src' => $this->url,
'width' => $this->width,
- 'height' => $this->height,
+ 'height' => $this->height
);
if ( !empty( $options['valign'] ) ) {
$attribs['style'] = "vertical-align: {$options['valign']}";
@@ -331,6 +342,14 @@ class ThumbnailImage extends MediaTransformOutput {
if ( !empty( $options['img-class'] ) ) {
$attribs['class'] = $options['img-class'];
}
+
+ // Additional densities for responsive images, if specified.
+ if ( !empty( $this->responsiveUrls ) ) {
+ $attribs['srcset'] = Html::srcSet( $this->responsiveUrls );
+ }
+
+ wfRunHooks( 'ThumbnailBeforeProduceHTML', array( $this, &$attribs, &$linkAttribs ) );
+
return $this->linkWrap( $linkAttribs, Xml::element( 'img', $attribs ) );
}
@@ -385,7 +404,7 @@ class MediaTransformError extends MediaTransformOutput {
class TransformParameterError extends MediaTransformError {
function __construct( $params ) {
parent::__construct( 'thumbnail_error',
- max( isset( $params['width'] ) ? $params['width'] : 0, 120 ),
+ max( isset( $params['width'] ) ? $params['width'] : 0, 120 ),
max( isset( $params['height'] ) ? $params['height'] : 0, 120 ),
wfMessage( 'thumbnail_invalid_params' )->text() );
}
diff --git a/includes/media/PNG.php b/includes/media/PNG.php
index 1b329e57..b8a5b40b 100644
--- a/includes/media/PNG.php
+++ b/includes/media/PNG.php
@@ -44,7 +44,7 @@ class PNGHandler extends BitmapHandler {
return self::BROKEN_FILE;
}
- return serialize($metadata);
+ return serialize( $metadata );
}
/**
@@ -74,8 +74,8 @@ class PNGHandler extends BitmapHandler {
*/
function isAnimatedImage( $image ) {
$ser = $image->getMetadata();
- if ($ser) {
- $metadata = unserialize($ser);
+ if ( $ser ) {
+ $metadata = unserialize( $ser );
if( $metadata['frameCount'] > 1 ) return true;
}
return false;
@@ -88,11 +88,11 @@ class PNGHandler extends BitmapHandler {
function canAnimateThumbnail( $image ) {
return false;
}
-
+
function getMetadataType( $image ) {
return 'parsed-png';
}
-
+
function isMetadataValid( $image, $metadata ) {
if ( $metadata === self::BROKEN_FILE ) {
@@ -105,13 +105,13 @@ class PNGHandler extends BitmapHandler {
wfRestoreWarnings();
if ( !$data || !is_array( $data ) ) {
- wfDebug(__METHOD__ . ' invalid png metadata' );
+ wfDebug( __METHOD__ . ' invalid png metadata' );
return self::METADATA_BAD;
}
if ( !isset( $data['metadata']['_MW_PNG_VERSION'] )
|| $data['metadata']['_MW_PNG_VERSION'] != PNGMetadataExtractor::VERSION ) {
- wfDebug(__METHOD__ . ' old but compatible png metadata' );
+ wfDebug( __METHOD__ . ' old but compatible png metadata' );
return self::METADATA_COMPATIBLE;
}
return self::METADATA_GOOD;
@@ -126,7 +126,7 @@ class PNGHandler extends BitmapHandler {
$original = parent::getLongDesc( $image );
wfSuppressWarnings();
- $metadata = unserialize($image->getMetadata());
+ $metadata = unserialize( $image->getMetadata() );
wfRestoreWarnings();
if( !$metadata || $metadata['frameCount'] <= 0 )
@@ -134,21 +134,21 @@ class PNGHandler extends BitmapHandler {
$info = array();
$info[] = $original;
-
+
if ( $metadata['loopCount'] == 0 ) {
$info[] = wfMessage( 'file-info-png-looped' )->parse();
} elseif ( $metadata['loopCount'] > 1 ) {
$info[] = wfMessage( 'file-info-png-repeat' )->numParams( $metadata['loopCount'] )->parse();
}
-
+
if ( $metadata['frameCount'] > 0 ) {
$info[] = wfMessage( 'file-info-png-frames' )->numParams( $metadata['frameCount'] )->parse();
}
-
+
if ( $metadata['duration'] ) {
$info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
}
-
+
return $wgLang->commaList( $info );
}
diff --git a/includes/media/PNGMetadataExtractor.php b/includes/media/PNGMetadataExtractor.php
index 9dcde406..87f705ca 100644
--- a/includes/media/PNGMetadataExtractor.php
+++ b/includes/media/PNGMetadataExtractor.php
@@ -124,7 +124,7 @@ class PNGMetadataExtractor {
case 0:
$colorType = 'greyscale';
break;
- case 2:
+ case 2:
$colorType = 'truecolour';
break;
case 3:
@@ -417,7 +417,7 @@ class PNGMetadataExtractor {
* @throws Exception if too big.
* @return String The chunk.
*/
- static private function read( $fh, $size ) {
+ private static function read( $fh, $size ) {
if ( $size > self::MAX_CHUNK_SIZE ) {
throw new Exception( __METHOD__ . ': Chunk size of ' . $size .
' too big. Max size is: ' . self::MAX_CHUNK_SIZE );
diff --git a/includes/media/SVG.php b/includes/media/SVG.php
index 55fa5547..cddab51d 100644
--- a/includes/media/SVG.php
+++ b/includes/media/SVG.php
@@ -120,6 +120,12 @@ class SvgHandler extends ImageHandler {
return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
}
+ $metadata = $this->unpackMetadata( $image->getMetadata() );
+ if ( isset( $metadata['error'] ) ) { // sanity check
+ $err = wfMessage( 'svg-long-error', $metadata['error']['message'] )->text();
+ return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight, $err );
+ }
+
if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight,
wfMessage( 'thumbnail_dest_directory' )->text() );
@@ -127,7 +133,7 @@ class SvgHandler extends ImageHandler {
$srcPath = $image->getLocalRefPath();
$status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight );
- if( $status === true ) {
+ if ( $status === true ) {
return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
} else {
return $status; // MediaTransformError
@@ -135,14 +141,15 @@ class SvgHandler extends ImageHandler {
}
/**
- * Transform an SVG file to PNG
- * This function can be called outside of thumbnail contexts
- * @param string $srcPath
- * @param string $dstPath
- * @param string $width
- * @param string $height
- * @return bool|MediaTransformError
- */
+ * Transform an SVG file to PNG
+ * This function can be called outside of thumbnail contexts
+ * @param string $srcPath
+ * @param string $dstPath
+ * @param string $width
+ * @param string $height
+ * @throws MWException
+ * @return bool|MediaTransformError
+ */
public function rasterize( $srcPath, $dstPath, $width, $height ) {
global $wgSVGConverters, $wgSVGConverter, $wgSVGConverterPath;
$err = false;
@@ -163,14 +170,14 @@ class SvgHandler extends ImageHandler {
$cmd = str_replace(
array( '$path/', '$width', '$height', '$input', '$output' ),
array( $wgSVGConverterPath ? wfEscapeShellArg( "$wgSVGConverterPath/" ) : "",
- intval( $width ),
- intval( $height ),
- wfEscapeShellArg( $srcPath ),
- wfEscapeShellArg( $dstPath ) ),
+ intval( $width ),
+ intval( $height ),
+ wfEscapeShellArg( $srcPath ),
+ wfEscapeShellArg( $dstPath ) ),
$wgSVGConverters[$wgSVGConverter]
) . " 2>&1";
wfProfileIn( 'rsvg' );
- wfDebug( __METHOD__.": $cmd\n" );
+ wfDebug( __METHOD__ . ": $cmd\n" );
$err = wfShellExec( $cmd, $retval );
wfProfileOut( 'rsvg' );
}
@@ -178,7 +185,7 @@ class SvgHandler extends ImageHandler {
$removed = $this->removeBadFile( $dstPath, $retval );
if ( $retval != 0 || $removed ) {
wfDebugLog( 'thumbnail', sprintf( 'thumbnail failed on %s: error %d "%s" from "%s"',
- wfHostname(), $retval, trim($err), $cmd ) );
+ wfHostname(), $retval, trim( $err ), $cmd ) );
return new MediaTransformError( 'thumbnail_error', $width, $height, $err );
}
return true;
@@ -213,6 +220,8 @@ class SvgHandler extends ImageHandler {
if ( isset( $metadata['width'] ) && isset( $metadata['height'] ) ) {
return array( $metadata['width'], $metadata['height'], 'SVG',
"width=\"{$metadata['width']}\" height=\"{$metadata['height']}\"" );
+ } else { // error
+ return array( 0, 0, 'SVG', "width=\"0\" height=\"0\"" );
}
}
@@ -231,6 +240,12 @@ class SvgHandler extends ImageHandler {
*/
function getLongDesc( $file ) {
global $wgLang;
+
+ $metadata = $this->unpackMetadata( $file->getMetadata() );
+ if ( isset( $metadata['error'] ) ) {
+ return wfMessage( 'svg-long-error', $metadata['error']['message'] )->text();
+ }
+
$size = $wgLang->formatSize( $file->getSize() );
if ( $this->isAnimatedImage( $file ) ) {
@@ -239,23 +254,23 @@ class SvgHandler extends ImageHandler {
$msg = wfMessage( 'svg-long-desc' );
}
- $msg->numParams(
- $file->getWidth(),
- $file->getHeight()
- );
- $msg->Params( $size );
+ $msg->numParams( $file->getWidth(), $file->getHeight() )->params( $size );
+
return $msg->parse();
}
function getMetadata( $file, $filename ) {
+ $metadata = array( 'version' => self::SVG_METADATA_VERSION );
try {
- $metadata = SVGMetadataExtractor::getMetadata( $filename );
- } catch( Exception $e ) {
- // Broken file?
+ $metadata += SVGMetadataExtractor::getMetadata( $filename );
+ } catch( MWException $e ) { // @TODO: SVG specific exceptions
+ // File not found, broken, etc.
+ $metadata['error'] = array(
+ 'message' => $e->getMessage(),
+ 'code' => $e->getCode()
+ );
wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
- return '0';
}
- $metadata['version'] = self::SVG_METADATA_VERSION;
return serialize( $metadata );
}
@@ -305,7 +320,7 @@ class SvgHandler extends ImageHandler {
return false;
}
$metadata = $this->unpackMetadata( $metadata );
- if ( !$metadata ) {
+ if ( !$metadata || isset( $metadata['error'] ) ) {
return false;
}
diff --git a/includes/media/SVGMetadataExtractor.php b/includes/media/SVGMetadataExtractor.php
index c6f63fd4..0de212b9 100644
--- a/includes/media/SVGMetadataExtractor.php
+++ b/includes/media/SVGMetadataExtractor.php
@@ -51,7 +51,8 @@ class SVGReader {
* Constructor
*
* Creates an SVGReader drawing from the source provided
- * @param $source String: URI from which to read
+ * @param string $source URI from which to read
+ * @throws MWException|Exception
*/
function __construct( $source ) {
global $wgSVGMetadataCutoff;
@@ -66,7 +67,7 @@ class SVGReader {
if ( $size > $wgSVGMetadataCutoff ) {
$this->debug( "SVG is $size bytes, which is bigger than $wgSVGMetadataCutoff. Truncating." );
$contents = file_get_contents( $source, false, null, -1, $wgSVGMetadataCutoff );
- if ($contents === false) {
+ if ( $contents === false ) {
throw new MWException( 'Error reading SVG file.' );
}
$this->reader->XML( $contents, null, LIBXML_NOERROR | LIBXML_NOWARNING );
@@ -120,6 +121,7 @@ class SVGReader {
/**
* Read the SVG
+ * @throws MWException
* @return bool
*/
protected function read() {
@@ -137,7 +139,7 @@ class SVGReader {
$this->debug( "<svg> tag is correct." );
$this->handleSVGAttribs();
- $exitDepth = $this->reader->depth;
+ $exitDepth = $this->reader->depth;
$keepReading = $this->reader->read();
while ( $keepReading ) {
$tag = $this->reader->localName;
@@ -180,8 +182,8 @@ class SVGReader {
/**
* Read a textelement from an element
*
- * @param String $name of the element that we are reading from
- * @param String $metafield that we will fill with the result
+ * @param string $name of the element that we are reading from
+ * @param string $metafield that we will fill with the result
*/
private function readField( $name, $metafield=null ) {
$this->debug ( "Read field $metafield" );
@@ -192,7 +194,7 @@ class SVGReader {
while( $keepReading ) {
if( $this->reader->localName == $name && $this->reader->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::END_ELEMENT ) {
break;
- } elseif( $this->reader->nodeType == XmlReader::TEXT ){
+ } elseif( $this->reader->nodeType == XmlReader::TEXT ) {
$this->metadata[$metafield] = trim( $this->reader->value );
}
$keepReading = $this->reader->read();
@@ -202,7 +204,8 @@ class SVGReader {
/**
* Read an XML snippet from an element
*
- * @param String $metafield that we will fill with the result
+ * @param string $metafield that we will fill with the result
+ * @throws MWException
*/
private function readXml( $metafield=null ) {
$this->debug ( "Read top level metadata" );
@@ -221,7 +224,7 @@ class SVGReader {
/**
* Filter all children, looking for animate elements
*
- * @param String $name of the element that we are reading from
+ * @param string $name of the element that we are reading from
*/
private function animateFilter( $name ) {
$this->debug ( "animate filter for tag $name" );
@@ -231,7 +234,7 @@ class SVGReader {
if ( $this->reader->isEmptyElement ) {
return;
}
- $exitDepth = $this->reader->depth;
+ $exitDepth = $this->reader->depth;
$keepReading = $this->reader->read();
while( $keepReading ) {
if( $this->reader->localName == $name && $this->reader->depth <= $exitDepth
@@ -282,16 +285,16 @@ class SVGReader {
*
* The parser has to be in the start element of "<svg>"
*/
- private function handleSVGAttribs( ) {
+ private function handleSVGAttribs() {
$defaultWidth = self::DEFAULT_WIDTH;
$defaultHeight = self::DEFAULT_HEIGHT;
$aspect = 1.0;
$width = null;
$height = null;
- if( $this->reader->getAttribute('viewBox') ) {
+ if( $this->reader->getAttribute( 'viewBox' ) ) {
// min-x min-y width height
- $viewBox = preg_split( '/\s+/', trim( $this->reader->getAttribute('viewBox') ) );
+ $viewBox = preg_split( '/\s+/', trim( $this->reader->getAttribute( 'viewBox' ) ) );
if( count( $viewBox ) == 4 ) {
$viewWidth = $this->scaleSVGUnit( $viewBox[2] );
$viewHeight = $this->scaleSVGUnit( $viewBox[3] );
@@ -301,12 +304,12 @@ class SVGReader {
}
}
}
- if( $this->reader->getAttribute('width') ) {
- $width = $this->scaleSVGUnit( $this->reader->getAttribute('width'), $defaultWidth );
+ if( $this->reader->getAttribute( 'width' ) ) {
+ $width = $this->scaleSVGUnit( $this->reader->getAttribute( 'width' ), $defaultWidth );
$this->metadata['originalWidth'] = $this->reader->getAttribute( 'width' );
}
- if( $this->reader->getAttribute('height') ) {
- $height = $this->scaleSVGUnit( $this->reader->getAttribute('height'), $defaultHeight );
+ if( $this->reader->getAttribute( 'height' ) ) {
+ $height = $this->scaleSVGUnit( $this->reader->getAttribute( 'height' ), $defaultHeight );
$this->metadata['originalHeight'] = $this->reader->getAttribute( 'height' );
}
@@ -329,11 +332,11 @@ class SVGReader {
* Return a rounded pixel equivalent for a labeled CSS/SVG length.
* http://www.w3.org/TR/SVG11/coords.html#UnitIdentifiers
*
- * @param $length String: CSS/SVG length.
+ * @param string $length CSS/SVG length.
* @param $viewportSize: Float optional scale for percentage units...
* @return float: length in pixels
*/
- static function scaleSVGUnit( $length, $viewportSize=512 ) {
+ static function scaleSVGUnit( $length, $viewportSize = 512 ) {
static $unitLength = array(
'px' => 1.0,
'pt' => 1.25,
diff --git a/includes/media/Tiff.php b/includes/media/Tiff.php
index d95c9074..0042208b 100644
--- a/includes/media/Tiff.php
+++ b/includes/media/Tiff.php
@@ -70,8 +70,9 @@ class TiffHandler extends ExifBitmapHandler {
}
/**
- * @param $image
- * @param $filename
+ * @param File $image
+ * @param string $filename
+ * @throws MWException
* @return string
*/
function getMetadata( $image, $filename ) {
@@ -81,7 +82,7 @@ class TiffHandler extends ExifBitmapHandler {
$meta = BitmapMetadataHandler::Tiff( $filename );
if ( !is_array( $meta ) ) {
// This should never happen, but doesn't hurt to be paranoid.
- throw new MWException('Metadata array is not an array');
+ throw new MWException( 'Metadata array is not an array' );
}
$meta['MEDIAWIKI_EXIF_VERSION'] = Exif::version();
return serialize( $meta );
diff --git a/includes/media/XCF.php b/includes/media/XCF.php
index 555fa1fb..ba38d158 100644
--- a/includes/media/XCF.php
+++ b/includes/media/XCF.php
@@ -72,7 +72,7 @@ class XCFHandler extends BitmapHandler {
* @author Hexmode
* @author Hashar
*
- * @param $filename String Full path to a XCF file
+ * @param string $filename Full path to a XCF file
* @return bool|array metadata array just like PHP getimagesize()
*/
static function getXCFMetaData( $filename ) {
@@ -84,7 +84,7 @@ class XCFHandler extends BitmapHandler {
# The image structure always starts at offset 0 in the XCF file.
# So we just read it :-)
$binaryHeader = fread( $f, 26 );
- fclose($f);
+ fclose( $f );
# Master image structure:
#
diff --git a/includes/media/XMP.php b/includes/media/XMP.php
index 36660b3d..62738a00 100644
--- a/includes/media/XMP.php
+++ b/includes/media/XMP.php
@@ -22,30 +22,30 @@
*/
/**
-* Class for reading xmp data containing properties relevant to
-* images, and spitting out an array that FormatExif accepts.
-*
-* Note, this is not meant to recognize every possible thing you can
-* encode in XMP. It should recognize all the properties we want.
-* For example it doesn't have support for structures with multiple
-* nesting levels, as none of the properties we're supporting use that
-* feature. If it comes across properties it doesn't recognize, it should
-* ignore them.
-*
-* The public methods one would call in this class are
-* - parse( $content )
-* Reads in xmp content.
-* Can potentially be called multiple times with partial data each time.
-* - parseExtended( $content )
-* Reads XMPExtended blocks (jpeg files only).
-* - getResults
-* Outputs a results array.
-*
-* Note XMP kind of looks like rdf. They are not the same thing - XMP is
-* encoded as a specific subset of rdf. This class can read XMP. It cannot
-* read rdf.
-*
-*/
+ * Class for reading xmp data containing properties relevant to
+ * images, and spitting out an array that FormatExif accepts.
+ *
+ * Note, this is not meant to recognize every possible thing you can
+ * encode in XMP. It should recognize all the properties we want.
+ * For example it doesn't have support for structures with multiple
+ * nesting levels, as none of the properties we're supporting use that
+ * feature. If it comes across properties it doesn't recognize, it should
+ * ignore them.
+ *
+ * The public methods one would call in this class are
+ * - parse( $content )
+ * Reads in xmp content.
+ * Can potentially be called multiple times with partial data each time.
+ * - parseExtended( $content )
+ * Reads XMPExtended blocks (jpeg files only).
+ * - getResults
+ * Outputs a results array.
+ *
+ * Note XMP kind of looks like rdf. They are not the same thing - XMP is
+ * encoded as a specific subset of rdf. This class can read XMP. It cannot
+ * read rdf.
+ *
+ */
class XMPReader {
private $curItem = array(); // array to hold the current element (and previous element, and so on)
@@ -63,39 +63,38 @@ class XMPReader {
protected $items;
/**
- * These are various mode constants.
- * they are used to figure out what to do
- * with an element when its encountered.
- *
- * For example, MODE_IGNORE is used when processing
- * a property we're not interested in. So if a new
- * element pops up when we're in that mode, we ignore it.
- */
+ * These are various mode constants.
+ * they are used to figure out what to do
+ * with an element when its encountered.
+ *
+ * For example, MODE_IGNORE is used when processing
+ * a property we're not interested in. So if a new
+ * element pops up when we're in that mode, we ignore it.
+ */
const MODE_INITIAL = 0;
- const MODE_IGNORE = 1;
- const MODE_LI = 2;
+ const MODE_IGNORE = 1;
+ const MODE_LI = 2;
const MODE_LI_LANG = 3;
- const MODE_QDESC = 4;
+ const MODE_QDESC = 4;
// The following MODE constants are also used in the
// $items array to denote what type of property the item is.
- const MODE_SIMPLE = 10;
- const MODE_STRUCT = 11; // structure (associative array)
- const MODE_SEQ = 12; // ordered list
- const MODE_BAG = 13; // unordered list
- const MODE_LANG = 14;
- const MODE_ALT = 15; // non-language alt. Currently not implemented, and not needed atm.
+ const MODE_SIMPLE = 10;
+ const MODE_STRUCT = 11; // structure (associative array)
+ const MODE_SEQ = 12; // ordered list
+ const MODE_BAG = 13; // unordered list
+ const MODE_LANG = 14;
+ const MODE_ALT = 15; // non-language alt. Currently not implemented, and not needed atm.
const MODE_BAGSTRUCT = 16; // A BAG of Structs.
const NS_RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
const NS_XML = 'http://www.w3.org/XML/1998/namespace';
-
/**
- * Constructor.
- *
- * Primary job is to initialize the XMLParser
- */
+ * Constructor.
+ *
+ * Primary job is to initialize the XMLParser
+ */
function __construct() {
if ( !function_exists( 'xml_parser_create_ns' ) ) {
@@ -109,12 +108,12 @@ class XMPReader {
}
/**
- * Main use is if a single item has multiple xmp documents describing it.
- * For example in jpeg's with extendedXMP
- */
+ * Main use is if a single item has multiple xmp documents describing it.
+ * For example in jpeg's with extendedXMP
+ */
private function resetXMLParser() {
- if ($this->xmlParser) {
+ if ( $this->xmlParser ) {
//is this needed?
xml_parser_free( $this->xmlParser );
}
@@ -131,20 +130,20 @@ class XMPReader {
}
/** Destroy the xml parser
- *
- * Not sure if this is actually needed.
- */
+ *
+ * Not sure if this is actually needed.
+ */
function __destruct() {
// not sure if this is needed.
xml_parser_free( $this->xmlParser );
}
/** Get the result array. Do some post-processing before returning
- * the array, and transform any metadata that is special-cased.
- *
- * @return Array array of results as an array of arrays suitable for
- * FormatMetadata::getFormattedData().
- */
+ * the array, and transform any metadata that is special-cased.
+ *
+ * @return Array array of results as an array of arrays suitable for
+ * FormatMetadata::getFormattedData().
+ */
public function getResults() {
// xmp-special is for metadata that affects how stuff
// is extracted. For example xmpNote:HasExtendedXMP.
@@ -156,7 +155,7 @@ class XMPReader {
$data = $this->results;
- wfRunHooks('XMPGetResults', Array(&$data));
+ wfRunHooks( 'XMPGetResults', Array( &$data ) );
if ( isset( $data['xmp-special']['AuthorsPosition'] )
&& is_string( $data['xmp-special']['AuthorsPosition'] )
@@ -201,13 +200,12 @@ class XMPReader {
// To avoid copying over the _type meta-fields.
continue;
}
- foreach( $loc as $field => $val ) {
+ foreach( $loc as $field => $val ) {
$data['xmp-general'][$field . 'Created'][] = $val;
}
}
}
-
// We don't want to return the special values, since they're
// special and not info to be stored about the file.
unset( $data['xmp-special'] );
@@ -232,17 +230,18 @@ class XMPReader {
}
/**
- * Main function to call to parse XMP. Use getResults to
- * get results.
- *
- * Also catches any errors during processing, writes them to
- * debug log, blanks result array and returns false.
- *
- * @param $content String: XMP data
- * @param $allOfIt Boolean: If this is all the data (true) or if its split up (false). Default true
- * @param $reset Boolean: does xml parser need to be reset. Default false
- * @return Boolean success.
- */
+ * Main function to call to parse XMP. Use getResults to
+ * get results.
+ *
+ * Also catches any errors during processing, writes them to
+ * debug log, blanks result array and returns false.
+ *
+ * @param string $content XMP data
+ * @param $allOfIt Boolean: If this is all the data (true) or if its split up (false). Default true
+ * @param $reset Boolean: does xml parser need to be reset. Default false
+ * @throws MWException
+ * @return Boolean success.
+ */
public function parse( $content, $allOfIt = true, $reset = false ) {
if ( $reset ) {
$this->resetXMLParser();
@@ -254,7 +253,7 @@ class XMPReader {
if ( !$this->charset ) {
$bom = array();
if ( preg_match( '/\xEF\xBB\xBF|\xFE\xFF|\x00\x00\xFE\xFF|\xFF\xFE\x00\x00|\xFF\xFE/',
- $content, $bom )
+ $content, $bom )
) {
switch ( $bom[0] ) {
case "\xFE\xFF":
@@ -274,11 +273,8 @@ class XMPReader {
break;
default:
//this should be impossible to get to
- throw new MWException("Invalid BOM");
- break;
-
+ throw new MWException( "Invalid BOM" );
}
-
} else {
// standard specifically says, if no bom assume utf-8
$this->charset = 'UTF-8';
@@ -314,7 +310,7 @@ class XMPReader {
*
* @todo In serious need of testing
* @see http://www.adobe.ge/devnet/xmp/pdfs/XMPSpecificationPart3.pdf XMP spec part 3 page 20
- * @param String $content XMPExtended block minus the namespace signature
+ * @param string $content XMPExtended block minus the namespace signature
* @return Boolean If it succeeded.
*/
public function parseExtended( $content ) {
@@ -323,17 +319,16 @@ class XMPReader {
$guid = substr( $content, 0, 32 );
if ( !isset( $this->results['xmp-special']['HasExtendedXMP'] )
|| $this->results['xmp-special']['HasExtendedXMP'] !== $guid ) {
- wfDebugLog('XMP', __METHOD__ . " Ignoring XMPExtended block due to wrong guid (guid= '$guid' )");
+ wfDebugLog( 'XMP', __METHOD__ . " Ignoring XMPExtended block due to wrong guid (guid= '$guid')" );
return false;
}
- $len = unpack( 'Nlength/Noffset', substr( $content, 32, 8 ) );
+ $len = unpack( 'Nlength/Noffset', substr( $content, 32, 8 ) );
- if (!$len || $len['length'] < 4 || $len['offset'] < 0 || $len['offset'] > $len['length'] ) {
- wfDebugLog('XMP', __METHOD__ . 'Error reading extended XMP block, invalid length or offset.');
+ if ( !$len || $len['length'] < 4 || $len['offset'] < 0 || $len['offset'] > $len['length'] ) {
+ wfDebugLog( 'XMP', __METHOD__ . 'Error reading extended XMP block, invalid length or offset.' );
return false;
}
-
// we're not very robust here. we should accept it in the wrong order. To quote
// the xmp standard:
// "A JPEG writer should write the ExtendedXMP marker segments in order, immediately following the
@@ -344,8 +339,8 @@ class XMPReader {
// so the probability that it will have > 128k, and be in the wrong order is very low...
if ( $len['offset'] !== $this->extendedXMPOffset ) {
- wfDebugLog('XMP', __METHOD__ . 'Ignoring XMPExtended block due to wrong order. (Offset was '
- . $len['offset'] . ' but expected ' . $this->extendedXMPOffset . ')');
+ wfDebugLog( 'XMP', __METHOD__ . 'Ignoring XMPExtended block due to wrong order. (Offset was '
+ . $len['offset'] . ' but expected ' . $this->extendedXMPOffset . ')' );
return false;
}
@@ -365,26 +360,26 @@ class XMPReader {
$atEnd = false;
}
- wfDebugLog('XMP', __METHOD__ . 'Parsing a XMPExtended block');
+ wfDebugLog( 'XMP', __METHOD__ . 'Parsing a XMPExtended block' );
return $this->parse( $actualContent, $atEnd );
}
/**
- * Character data handler
- * Called whenever character data is found in the xmp document.
- *
- * does nothing if we're in MODE_IGNORE or if the data is whitespace
- * throws an error if we're not in MODE_SIMPLE (as we're not allowed to have character
- * data in the other modes).
- *
- * As an example, this happens when we encounter XMP like:
- * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
- * and are processing the 0/10 bit.
- *
- * @param $parser XMLParser reference to the xml parser
- * @param $data String Character data
- * @throws MWException on invalid data
- */
+ * Character data handler
+ * Called whenever character data is found in the xmp document.
+ *
+ * does nothing if we're in MODE_IGNORE or if the data is whitespace
+ * throws an error if we're not in MODE_SIMPLE (as we're not allowed to have character
+ * data in the other modes).
+ *
+ * As an example, this happens when we encounter XMP like:
+ * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
+ * and are processing the 0/10 bit.
+ *
+ * @param $parser XMLParser reference to the xml parser
+ * @param string $data Character data
+ * @throws MWException on invalid data
+ */
function char( $parser, $data ) {
$data = trim( $data );
@@ -414,36 +409,33 @@ class XMPReader {
}
/** When we hit a closing element in MODE_IGNORE
- * Check to see if this is the element we started to ignore,
- * in which case we get out of MODE_IGNORE
- *
- * @param $elm String Namespace of element followed by a space and then tag name of element.
- */
+ * Check to see if this is the element we started to ignore,
+ * in which case we get out of MODE_IGNORE
+ *
+ * @param string $elm Namespace of element followed by a space and then tag name of element.
+ */
private function endElementModeIgnore ( $elm ) {
-
if ( $this->curItem[0] === $elm ) {
array_shift( $this->curItem );
array_shift( $this->mode );
}
- return;
-
}
/**
- * Hit a closing element when in MODE_SIMPLE.
- * This generally means that we finished processing a
- * property value, and now have to save the result to the
- * results array
- *
- * For example, when processing:
- * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
- * this deals with when we hit </exif:DigitalZoomRatio>.
- *
- * Or it could be if we hit the end element of a property
- * of a compound data structure (like a member of an array).
- *
- * @param $elm String namespace, space, and tag name.
- */
+ * Hit a closing element when in MODE_SIMPLE.
+ * This generally means that we finished processing a
+ * property value, and now have to save the result to the
+ * results array
+ *
+ * For example, when processing:
+ * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
+ * this deals with when we hit </exif:DigitalZoomRatio>.
+ *
+ * Or it could be if we hit the end element of a property
+ * of a compound data structure (like a member of an array).
+ *
+ * @param string $elm namespace, space, and tag name.
+ */
private function endElementModeSimple ( $elm ) {
if ( $this->charContent !== false ) {
if ( $this->processingArray ) {
@@ -463,22 +455,23 @@ class XMPReader {
}
/**
- * Hit a closing element in MODE_STRUCT, MODE_SEQ, MODE_BAG
- * generally means we've finished processing a nested structure.
- * resets some internal variables to indicate that.
- *
- * Note this means we hit the closing element not the "</rdf:Seq>".
- *
- * @par For example, when processing:
- * @code{,xml}
- * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
- * </rdf:Seq> </exif:ISOSpeedRatings>
- * @endcode
- *
- * This method is called when we hit the "</exif:ISOSpeedRatings>" tag.
- *
- * @param $elm String namespace . space . tag name.
- */
+ * Hit a closing element in MODE_STRUCT, MODE_SEQ, MODE_BAG
+ * generally means we've finished processing a nested structure.
+ * resets some internal variables to indicate that.
+ *
+ * Note this means we hit the closing element not the "</rdf:Seq>".
+ *
+ * @par For example, when processing:
+ * @code{,xml}
+ * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
+ * </rdf:Seq> </exif:ISOSpeedRatings>
+ * @endcode
+ *
+ * This method is called when we hit the "</exif:ISOSpeedRatings>" tag.
+ *
+ * @param string $elm namespace . space . tag name.
+ * @throws MWException
+ */
private function endElementNested( $elm ) {
/* cur item must be the same as $elm, unless if in MODE_STRUCT
@@ -486,7 +479,7 @@ class XMPReader {
if ( $this->curItem[0] !== $elm
&& !( $elm === self::NS_RDF . ' Description'
&& $this->mode[0] === self::MODE_STRUCT )
- ) {
+ ) {
throw new MWException( "nesting mismatch. got a </$elm> but expected a </" . $this->curItem[0] . '>' );
}
@@ -528,23 +521,24 @@ class XMPReader {
}
/**
- * Hit a closing element in MODE_LI (either rdf:Seq, or rdf:Bag )
- * Add information about what type of element this is.
- *
- * Note we still have to hit the outer "</property>"
- *
- * @par For example, when processing:
- * @code{,xml}
- * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
- * </rdf:Seq> </exif:ISOSpeedRatings>
- * @endcode
- *
- * This method is called when we hit the "</rdf:Seq>".
- * (For comparison, we call endElementModeSimple when we
- * hit the "</rdf:li>")
- *
- * @param $elm String namespace . ' ' . element name
- */
+ * Hit a closing element in MODE_LI (either rdf:Seq, or rdf:Bag )
+ * Add information about what type of element this is.
+ *
+ * Note we still have to hit the outer "</property>"
+ *
+ * @par For example, when processing:
+ * @code{,xml}
+ * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
+ * </rdf:Seq> </exif:ISOSpeedRatings>
+ * @endcode
+ *
+ * This method is called when we hit the "</rdf:Seq>".
+ * (For comparison, we call endElementModeSimple when we
+ * hit the "</rdf:li>")
+ *
+ * @param string $elm namespace . ' ' . element name
+ * @throws MWException
+ */
private function endElementModeLi( $elm ) {
list( $ns, $tag ) = explode( ' ', $this->curItem[0], 2 );
@@ -575,15 +569,15 @@ class XMPReader {
}
/**
- * End element while in MODE_QDESC
- * mostly when ending an element when we have a simple value
- * that has qualifiers.
- *
- * Qualifiers aren't all that common, and we don't do anything
- * with them.
- *
- * @param $elm String namespace and element
- */
+ * End element while in MODE_QDESC
+ * mostly when ending an element when we have a simple value
+ * that has qualifiers.
+ *
+ * Qualifiers aren't all that common, and we don't do anything
+ * with them.
+ *
+ * @param string $elm namespace and element
+ */
private function endElementModeQDesc( $elm ) {
if ( $elm === self::NS_RDF . ' value' ) {
@@ -594,22 +588,21 @@ class XMPReader {
array_shift( $this->mode );
array_shift( $this->curItem );
}
-
-
}
/**
- * Handler for hitting a closing element.
- *
- * generally just calls a helper function depending on what
- * mode we're in.
- *
- * Ignores the outer wrapping elements that are optional in
- * xmp and have no meaning.
- *
- * @param $parser XMLParser
- * @param $elm String namespace . ' ' . element name
- */
+ * Handler for hitting a closing element.
+ *
+ * generally just calls a helper function depending on what
+ * mode we're in.
+ *
+ * Ignores the outer wrapping elements that are optional in
+ * xmp and have no meaning.
+ *
+ * @param $parser XMLParser
+ * @param string $elm namespace . ' ' . element name
+ * @throws MWException
+ */
function endElement( $parser, $elm ) {
if ( $elm === ( self::NS_RDF . ' RDF' )
|| $elm === 'adobe:ns:meta/ xmpmeta'
@@ -681,16 +674,16 @@ class XMPReader {
}
/**
- * Hit an opening element while in MODE_IGNORE
- *
- * XMP is extensible, so ignore any tag we don't understand.
- *
- * Mostly ignores, unless we encounter the element that we are ignoring.
- * in which case we add it to the item stack, so we can ignore things
- * that are nested, correctly.
- *
- * @param $elm String namespace . ' ' . tag name
- */
+ * Hit an opening element while in MODE_IGNORE
+ *
+ * XMP is extensible, so ignore any tag we don't understand.
+ *
+ * Mostly ignores, unless we encounter the element that we are ignoring.
+ * in which case we add it to the item stack, so we can ignore things
+ * that are nested, correctly.
+ *
+ * @param string $elm namespace . ' ' . tag name
+ */
private function startElementModeIgnore( $elm ) {
if ( $elm === $this->curItem[0] ) {
array_unshift( $this->curItem, $elm );
@@ -699,12 +692,12 @@ class XMPReader {
}
/**
- * Start element in MODE_BAG (unordered array)
- * this should always be <rdf:Bag>
- *
- * @param $elm String namespace . ' ' . tag
- * @throws MWException if we have an element that's not <rdf:Bag>
- */
+ * Start element in MODE_BAG (unordered array)
+ * this should always be <rdf:Bag>
+ *
+ * @param string $elm namespace . ' ' . tag
+ * @throws MWException if we have an element that's not <rdf:Bag>
+ */
private function startElementModeBag( $elm ) {
if ( $elm === self::NS_RDF . ' Bag' ) {
array_unshift( $this->mode, self::MODE_LI );
@@ -715,12 +708,12 @@ class XMPReader {
}
/**
- * Start element in MODE_SEQ (ordered array)
- * this should always be <rdf:Seq>
- *
- * @param $elm String namespace . ' ' . tag
- * @throws MWException if we have an element that's not <rdf:Seq>
- */
+ * Start element in MODE_SEQ (ordered array)
+ * this should always be <rdf:Seq>
+ *
+ * @param string $elm namespace . ' ' . tag
+ * @throws MWException if we have an element that's not <rdf:Seq>
+ */
private function startElementModeSeq( $elm ) {
if ( $elm === self::NS_RDF . ' Seq' ) {
array_unshift( $this->mode, self::MODE_LI );
@@ -736,19 +729,19 @@ class XMPReader {
}
/**
- * Start element in MODE_LANG (language alternative)
- * this should always be <rdf:Alt>
- *
- * This tag tends to be used for metadata like describe this
- * picture, which can be translated into multiple languages.
- *
- * XMP supports non-linguistic alternative selections,
- * which are really only used for thumbnails, which
- * we don't care about.
- *
- * @param $elm String namespace . ' ' . tag
- * @throws MWException if we have an element that's not <rdf:Alt>
- */
+ * Start element in MODE_LANG (language alternative)
+ * this should always be <rdf:Alt>
+ *
+ * This tag tends to be used for metadata like describe this
+ * picture, which can be translated into multiple languages.
+ *
+ * XMP supports non-linguistic alternative selections,
+ * which are really only used for thumbnails, which
+ * we don't care about.
+ *
+ * @param string $elm namespace . ' ' . tag
+ * @throws MWException if we have an element that's not <rdf:Alt>
+ */
private function startElementModeLang( $elm ) {
if ( $elm === self::NS_RDF . ' Alt' ) {
array_unshift( $this->mode, self::MODE_LI_LANG );
@@ -759,22 +752,23 @@ class XMPReader {
}
/**
- * Handle an opening element when in MODE_SIMPLE
- *
- * This should not happen often. This is for if a simple element
- * already opened has a child element. Could happen for a
- * qualified element.
- *
- * For example:
- * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
- * <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
- * </exif:DigitalZoomRatio>
- *
- * This method is called when processing the <rdf:Description> element
- *
- * @param $elm String namespace and tag names separated by space.
- * @param $attribs Array Attributes of the element.
- */
+ * Handle an opening element when in MODE_SIMPLE
+ *
+ * This should not happen often. This is for if a simple element
+ * already opened has a child element. Could happen for a
+ * qualified element.
+ *
+ * For example:
+ * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
+ * <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
+ * </exif:DigitalZoomRatio>
+ *
+ * This method is called when processing the <rdf:Description> element
+ *
+ * @param string $elm namespace and tag names separated by space.
+ * @param array $attribs Attributes of the element.
+ * @throws MWException
+ */
private function startElementModeSimple( $elm, $attribs ) {
if ( $elm === self::NS_RDF . ' Description' ) {
// If this value has qualifiers
@@ -800,19 +794,19 @@ class XMPReader {
}
/**
- * Start an element when in MODE_QDESC.
- * This generally happens when a simple element has an inner
- * rdf:Description to hold qualifier elements.
- *
- * For example in:
- * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
- * <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
- * </exif:DigitalZoomRatio>
- * Called when processing the <rdf:value> or <foo:someQualifier>.
- *
- * @param $elm String namespace and tag name separated by a space.
- *
- */
+ * Start an element when in MODE_QDESC.
+ * This generally happens when a simple element has an inner
+ * rdf:Description to hold qualifier elements.
+ *
+ * For example in:
+ * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
+ * <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
+ * </exif:DigitalZoomRatio>
+ * Called when processing the <rdf:value> or <foo:someQualifier>.
+ *
+ * @param string $elm namespace and tag name separated by a space.
+ *
+ */
private function startElementModeQDesc( $elm ) {
if ( $elm === self::NS_RDF . ' value' ) {
return; // do nothing
@@ -824,16 +818,17 @@ class XMPReader {
}
/**
- * Starting an element when in MODE_INITIAL
- * This usually happens when we hit an element inside
- * the outer rdf:Description
- *
- * This is generally where most properties start.
- *
- * @param $ns String Namespace
- * @param $tag String tag name (without namespace prefix)
- * @param $attribs Array array of attributes
- */
+ * Starting an element when in MODE_INITIAL
+ * This usually happens when we hit an element inside
+ * the outer rdf:Description
+ *
+ * This is generally where most properties start.
+ *
+ * @param string $ns Namespace
+ * @param string $tag tag name (without namespace prefix)
+ * @param array $attribs array of attributes
+ * @throws MWException
+ */
private function startElementModeInitial( $ns, $tag, $attribs ) {
if ( $ns !== self::NS_RDF ) {
@@ -877,23 +872,24 @@ class XMPReader {
}
/**
- * Hit an opening element when in a Struct (MODE_STRUCT)
- * This is generally for fields of a compound property.
- *
- * Example of a struct (abbreviated; flash has more properties):
- *
- * <exif:Flash> <rdf:Description> <exif:Fired>True</exif:Fired>
- * <exif:Mode>1</exif:Mode></rdf:Description></exif:Flash>
- *
- * or:
- *
- * <exif:Flash rdf:parseType='Resource'> <exif:Fired>True</exif:Fired>
- * <exif:Mode>1</exif:Mode></exif:Flash>
- *
- * @param $ns String namespace
- * @param $tag String tag name (no ns)
- * @param $attribs Array array of attribs w/ values.
- */
+ * Hit an opening element when in a Struct (MODE_STRUCT)
+ * This is generally for fields of a compound property.
+ *
+ * Example of a struct (abbreviated; flash has more properties):
+ *
+ * <exif:Flash> <rdf:Description> <exif:Fired>True</exif:Fired>
+ * <exif:Mode>1</exif:Mode></rdf:Description></exif:Flash>
+ *
+ * or:
+ *
+ * <exif:Flash rdf:parseType='Resource'> <exif:Fired>True</exif:Fired>
+ * <exif:Mode>1</exif:Mode></exif:Flash>
+ *
+ * @param string $ns namespace
+ * @param string $tag tag name (no ns)
+ * @param array $attribs array of attribs w/ values.
+ * @throws MWException
+ */
private function startElementModeStruct( $ns, $tag, $attribs ) {
if ( $ns !== self::NS_RDF ) {
@@ -929,18 +925,18 @@ class XMPReader {
}
/**
- * opening element in MODE_LI
- * process elements of arrays.
- *
- * Example:
- * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
- * </rdf:Seq> </exif:ISOSpeedRatings>
- * This method is called when we hit the <rdf:li> element.
- *
- * @param $elm String: namespace . ' ' . tagname
- * @param $attribs Array: Attributes. (needed for BAGSTRUCTS)
- * @throws MWException if gets a tag other than <rdf:li>
- */
+ * opening element in MODE_LI
+ * process elements of arrays.
+ *
+ * Example:
+ * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
+ * </rdf:Seq> </exif:ISOSpeedRatings>
+ * This method is called when we hit the <rdf:li> element.
+ *
+ * @param string $elm namespace . ' ' . tagname
+ * @param array $attribs Attributes. (needed for BAGSTRUCTS)
+ * @throws MWException if gets a tag other than <rdf:li>
+ */
private function startElementModeLi( $elm, $attribs ) {
if ( ( $elm ) !== self::NS_RDF . ' li' ) {
throw new MWException( "<rdf:li> expected but got $elm." );
@@ -980,19 +976,19 @@ class XMPReader {
}
/**
- * Opening element in MODE_LI_LANG.
- * process elements of language alternatives
- *
- * Example:
- * <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">My house
- * </rdf:li> </rdf:Alt> </dc:title>
- *
- * This method is called when we hit the <rdf:li> element.
- *
- * @param $elm String namespace . ' ' . tag
- * @param $attribs array array of elements (most importantly xml:lang)
- * @throws MWException if gets a tag other than <rdf:li> or if no xml:lang
- */
+ * Opening element in MODE_LI_LANG.
+ * process elements of language alternatives
+ *
+ * Example:
+ * <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">My house
+ * </rdf:li> </rdf:Alt> </dc:title>
+ *
+ * This method is called when we hit the <rdf:li> element.
+ *
+ * @param string $elm namespace . ' ' . tag
+ * @param array $attribs array of elements (most importantly xml:lang)
+ * @throws MWException if gets a tag other than <rdf:li> or if no xml:lang
+ */
private function startElementModeLiLang( $elm, $attribs ) {
if ( $elm !== self::NS_RDF . ' li' ) {
throw new MWException( __METHOD__ . " <rdf:li> expected but got $elm." );
@@ -1015,19 +1011,20 @@ class XMPReader {
}
/**
- * Hits an opening element.
- * Generally just calls a helper based on what MODE we're in.
- * Also does some initial set up for the wrapper element
- *
- * @param $parser XMLParser
- * @param $elm String namespace "<space>" element
- * @param $attribs Array attribute name => value
- */
+ * Hits an opening element.
+ * Generally just calls a helper based on what MODE we're in.
+ * Also does some initial set up for the wrapper element
+ *
+ * @param $parser XMLParser
+ * @param string $elm namespace "<space>" element
+ * @param array $attribs attribute name => value
+ * @throws MWException
+ */
function startElement( $parser, $elm, $attribs ) {
if ( $elm === self::NS_RDF . ' RDF'
|| $elm === 'adobe:ns:meta/ xmpmeta'
- || $elm === 'adobe:ns:meta/ xapmeta')
+ || $elm === 'adobe:ns:meta/ xapmeta' )
{
/* ignore. */
return;
@@ -1057,7 +1054,7 @@ class XMPReader {
if ( count( $this->mode ) === 0 ) {
// This should not happen.
- throw new MWException('Error extracting XMP, '
+ throw new MWException( 'Error extracting XMP, '
. "encountered <$elm> with no mode" );
}
@@ -1095,24 +1092,24 @@ class XMPReader {
break;
default:
throw new MWException( 'StartElement in unknown mode: ' . $this->mode[0] );
- break;
}
}
/**
- * Process attributes.
- * Simple values can be stored as either a tag or attribute
- *
- * Often the initial "<rdf:Description>" tag just has all the simple
- * properties as attributes.
- *
- * @par Example:
- * @code
- * <rdf:Description rdf:about="" xmlns:exif="http://ns.adobe.com/exif/1.0/" exif:DigitalZoomRatio="0/10">
- * @endcode
- *
- * @param $attribs Array attribute=>value array.
- */
+ * Process attributes.
+ * Simple values can be stored as either a tag or attribute
+ *
+ * Often the initial "<rdf:Description>" tag just has all the simple
+ * properties as attributes.
+ *
+ * @par Example:
+ * @code
+ * <rdf:Description rdf:about="" xmlns:exif="http://ns.adobe.com/exif/1.0/" exif:DigitalZoomRatio="0/10">
+ * @endcode
+ *
+ * @param array $attribs attribute=>value array.
+ * @throws MWException
+ */
private function doAttribs( $attribs ) {
// first check for rdf:parseType attribute, as that can change
@@ -1126,8 +1123,6 @@ class XMPReader {
$this->mode[0] = self::MODE_QDESC;
}
foreach ( $attribs as $name => $val ) {
-
-
if ( strpos( $name, ' ' ) === false ) {
// This shouldn't happen, but so far some old software forgets namespace
// on rdf:about.
@@ -1155,16 +1150,16 @@ class XMPReader {
}
/**
- * Given an extracted value, save it to results array
- *
- * note also uses $this->ancestorStruct and
- * $this->processingArray to determine what name to
- * save the value under. (in addition to $tag).
- *
- * @param $ns String namespace of tag this is for
- * @param $tag String tag name
- * @param $val String value to save
- */
+ * Given an extracted value, save it to results array
+ *
+ * note also uses $this->ancestorStruct and
+ * $this->processingArray to determine what name to
+ * save the value under. (in addition to $tag).
+ *
+ * @param string $ns namespace of tag this is for
+ * @param string $tag tag name
+ * @param string $val value to save
+ */
private function saveValue( $ns, $tag, $val ) {
$info =& $this->items[$ns][$tag];
diff --git a/includes/media/XMPInfo.php b/includes/media/XMPInfo.php
index 83b8a102..102547ff 100644
--- a/includes/media/XMPInfo.php
+++ b/includes/media/XMPInfo.php
@@ -22,20 +22,20 @@
*/
/**
-* This class is just a container for a big array
-* used by XMPReader to determine which XMP items to
-* extract.
-*/
+ * This class is just a container for a big array
+ * used by XMPReader to determine which XMP items to
+ * extract.
+ */
class XMPInfo {
/** get the items array
* @return Array XMP item configuration array.
- */
- public static function getItems ( ) {
+ */
+ public static function getItems () {
if( !self::$ranHooks ) {
// This is for if someone makes a custom metadata extension.
// For example, a medical wiki might want to decode DICOM xmp properties.
- wfRunHooks('XMPGetInfo', Array(&self::$items));
+ wfRunHooks( 'XMPGetInfo', Array( &self::$items ) );
self::$ranHooks = true; // Only want to do this once.
}
return self::$items;
@@ -44,26 +44,25 @@ class XMPInfo {
static private $ranHooks = false;
/**
- * XMPInfo::$items keeps a list of all the items
- * we are interested to extract, as well as
- * information about the item like what type
- * it is.
- *
- * Format is an array of namespaces,
- * each containing an array of tags
- * each tag is an array of information about the
- * tag, including:
- * * map_group - what group (used for precedence during conflicts)
- * * mode - What type of item (self::MODE_SIMPLE usually, see above for all values)
- * * validate - method to validate input. Could also post-process the input. A string value is assumed to be a static method of XMPValidate. Can also take a array( 'className', 'methodName' ).
- * * choices - array of potential values (format of 'value' => true ). Only used with validateClosed
- * * rangeLow and rangeHigh - alternative to choices for numeric ranges. Again for validateClosed only.
- * * children - for MODE_STRUCT items, allowed children.
- * * structPart - Indicates that this element can only appear as a member of a structure.
- *
- * currently this just has a bunch of exif values as this class is only half-done
- */
-
+ * XMPInfo::$items keeps a list of all the items
+ * we are interested to extract, as well as
+ * information about the item like what type
+ * it is.
+ *
+ * Format is an array of namespaces,
+ * each containing an array of tags
+ * each tag is an array of information about the
+ * tag, including:
+ * * map_group - what group (used for precedence during conflicts)
+ * * mode - What type of item (self::MODE_SIMPLE usually, see above for all values)
+ * * validate - method to validate input. Could also post-process the input. A string value is assumed to be a static method of XMPValidate. Can also take a array( 'className', 'methodName' ).
+ * * choices - array of potential values (format of 'value' => true ). Only used with validateClosed
+ * * rangeLow and rangeHigh - alternative to choices for numeric ranges. Again for validateClosed only.
+ * * children - for MODE_STRUCT items, allowed children.
+ * * structPart - Indicates that this element can only appear as a member of a structure.
+ *
+ * currently this just has a bunch of exif values as this class is only half-done
+ */
static private $items = array(
'http://ns.adobe.com/exif/1.0/' => array(
'ApertureValue' => array(
@@ -260,7 +259,7 @@ class XMPInfo {
'mode' => XMPReader::MODE_SIMPLE,
'validate' => 'validateDate',
),
- 'DateTimeDigitized' => array( /* xmp:CreateDate */
+ 'DateTimeDigitized' => array( /* xmp:CreateDate */
'map_group' => 'exif',
'mode' => XMPReader::MODE_SIMPLE,
'validate' => 'validateDate',
@@ -552,12 +551,12 @@ class XMPInfo {
'map_group' => 'exif',
'mode' => XMPReader::MODE_LANG,
),
- 'DateTime' => array( /* proper prop is xmp:ModifyDate */
+ 'DateTime' => array( /* proper prop is xmp:ModifyDate */
'map_group' => 'exif',
'mode' => XMPReader::MODE_SIMPLE,
'validate' => 'validateDate',
),
- 'ImageDescription' => array( /* proper one is dc:description */
+ 'ImageDescription' => array( /* proper one is dc:description */
'map_group' => 'exif',
'mode' => XMPReader::MODE_LANG,
),
@@ -622,7 +621,7 @@ class XMPInfo {
'mode' => XMPReader::MODE_SIMPLE,
'validate' => 'validateInteger',
),
- 'Software' => array( /* see xmp:CreatorTool */
+ 'Software' => array( /* see xmp:CreatorTool */
'map_group' => 'exif',
'mode' => XMPReader::MODE_SIMPLE,
),
@@ -669,7 +668,7 @@ class XMPInfo {
* 'validate' => 'validateClosed',
* 'choices' => array( '1' => true, '2' => true ),
* ),
- */
+ */
),
'http://ns.adobe.com/exif/1.0/aux/' => array(
'Lens' => array(
diff --git a/includes/media/XMPValidate.php b/includes/media/XMPValidate.php
index 5ce3c00b..f98f0b57 100644
--- a/includes/media/XMPValidate.php
+++ b/includes/media/XMPValidate.php
@@ -22,32 +22,32 @@
*/
/**
-* This contains some static methods for
-* validating XMP properties. See XMPInfo and XMPReader classes.
-*
-* Each of these functions take the same parameters
-* * an info array which is a subset of the XMPInfo::items array
-* * A value (passed as reference) to validate. This can be either a
-* simple value or an array
-* * A boolean to determine if this is validating a simple or complex values
-*
-* It should be noted that when an array is being validated, typically the validation
-* function is called once for each value, and then once at the end for the entire array.
-*
-* These validation functions can also be used to modify the data. See the gps and flash one's
-* for example.
-*
-* @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf starting at pg 28
-* @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf starting at pg 11
-*/
+ * This contains some static methods for
+ * validating XMP properties. See XMPInfo and XMPReader classes.
+ *
+ * Each of these functions take the same parameters
+ * * an info array which is a subset of the XMPInfo::items array
+ * * A value (passed as reference) to validate. This can be either a
+ * simple value or an array
+ * * A boolean to determine if this is validating a simple or complex values
+ *
+ * It should be noted that when an array is being validated, typically the validation
+ * function is called once for each value, and then once at the end for the entire array.
+ *
+ * These validation functions can also be used to modify the data. See the gps and flash one's
+ * for example.
+ *
+ * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf starting at pg 28
+ * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf starting at pg 11
+ */
class XMPValidate {
/**
- * function to validate boolean properties ( True or False )
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate boolean properties ( True or False )
+ *
+ * @param array $info information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateBoolean( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
@@ -61,12 +61,12 @@ class XMPValidate {
}
/**
- * function to validate rational properties ( 12/10 )
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate rational properties ( 12/10 )
+ *
+ * @param array $info information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateRational( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
@@ -80,23 +80,23 @@ class XMPValidate {
}
/**
- * function to validate rating properties -1, 0-5
- *
- * if its outside of range put it into range.
- *
- * @see MWG spec
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate rating properties -1, 0-5
+ *
+ * if its outside of range put it into range.
+ *
+ * @see MWG spec
+ * @param array $info information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateRating( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
return;
}
if ( !preg_match( '/^[-+]?\d*(?:\.?\d*)$/D', $val )
- || !is_numeric($val)
- ) {
+ || !is_numeric( $val )
+ ) {
wfDebugLog( 'XMP', __METHOD__ . " Expected rating but got $val" );
$val = null;
return;
@@ -106,12 +106,12 @@ class XMPValidate {
// We do < 0 here instead of < -1 here, since
// the values between 0 and -1 are also illegal
// as -1 is meant as a special reject rating.
- wfDebugLog( 'XMP', __METHOD__ . " Rating too low, setting to -1 (Rejected)");
+ wfDebugLog( 'XMP', __METHOD__ . " Rating too low, setting to -1 (Rejected)" );
$val = '-1';
return;
}
if ( $nVal > 5 ) {
- wfDebugLog( 'XMP', __METHOD__ . " Rating too high, setting to 5");
+ wfDebugLog( 'XMP', __METHOD__ . " Rating too high, setting to 5" );
$val = '5';
return;
}
@@ -119,12 +119,12 @@ class XMPValidate {
}
/**
- * function to validate integers
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate integers
+ *
+ * @param array $info information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateInteger( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
@@ -138,13 +138,13 @@ class XMPValidate {
}
/**
- * function to validate properties with a fixed number of allowed
- * choices. (closed choice)
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate properties with a fixed number of allowed
+ * choices. (closed choice)
+ *
+ * @param array $info information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateClosed( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
@@ -153,7 +153,7 @@ class XMPValidate {
//check if its in a numeric range
$inRange = false;
- if ( isset( $info['rangeLow'] )
+ if ( isset( $info['rangeLow'] )
&& isset( $info['rangeHigh'] )
&& is_numeric( $val )
&& ( intval( $val ) <= $info['rangeHigh'] )
@@ -169,12 +169,12 @@ class XMPValidate {
}
/**
- * function to validate and modify flash structure
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate and modify flash structure
+ *
+ * @param array $info information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateFlash( $info, &$val, $standalone ) {
if ( $standalone ) {
// this only validates flash structs, not individual properties
@@ -198,17 +198,17 @@ class XMPValidate {
}
/**
- * function to validate LangCode properties ( en-GB, etc )
- *
- * This is just a naive check to make sure it somewhat looks like a lang code.
- *
- * @see rfc 3066
- * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf page 30 (section 8.2.2.5)
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate LangCode properties ( en-GB, etc )
+ *
+ * This is just a naive check to make sure it somewhat looks like a lang code.
+ *
+ * @see rfc 3066
+ * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf page 30 (section 8.2.2.5)
+ *
+ * @param array $info information about current property
+ * @param &$val Mixed current value to validate
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateLangCode( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
@@ -223,22 +223,22 @@ class XMPValidate {
}
/**
- * function to validate date properties, and convert to (partial) Exif format.
- *
- * Dates can be one of the following formats:
- * YYYY
- * YYYY-MM
- * YYYY-MM-DD
- * YYYY-MM-DDThh:mmTZD
- * YYYY-MM-DDThh:mm:ssTZD
- * YYYY-MM-DDThh:mm:ss.sTZD
- *
- * @param $info Array information about current property
- * @param &$val Mixed current value to validate. Converts to TS_EXIF as a side-effect.
- * in cases where there's only a partial date, it will give things like
- * 2011:04.
- * @param $standalone Boolean if this is a simple property or array
- */
+ * function to validate date properties, and convert to (partial) Exif format.
+ *
+ * Dates can be one of the following formats:
+ * YYYY
+ * YYYY-MM
+ * YYYY-MM-DD
+ * YYYY-MM-DDThh:mmTZD
+ * YYYY-MM-DDThh:mm:ssTZD
+ * YYYY-MM-DDThh:mm:ss.sTZD
+ *
+ * @param array $info information about current property
+ * @param &$val Mixed current value to validate. Converts to TS_EXIF as a side-effect.
+ * in cases where there's only a partial date, it will give things like
+ * 2011:04.
+ * @param $standalone Boolean if this is a simple property or array
+ */
public static function validateDate( $info, &$val, $standalone ) {
if ( !$standalone ) {
// this only validates standalone properties, not arrays, etc
@@ -247,8 +247,8 @@ class XMPValidate {
$res = array();
if ( !preg_match(
/* ahh! scary regex... */
- '/^([0-3]\d{3})(?:-([01]\d)(?:-([0-3]\d)(?:T([0-2]\d):([0-6]\d)(?::([0-6]\d)(?:\.\d+)?)?([-+]\d{2}:\d{2}|Z)?)?)?)?$/D'
- , $val, $res)
+ '/^([0-3]\d{3})(?:-([01]\d)(?:-([0-3]\d)(?:T([0-2]\d):([0-6]\d)(?::([0-6]\d)(?:\.\d+)?)?([-+]\d{2}:\d{2}|Z)?)?)?)?$/D',
+ $val, $res )
) {
wfDebugLog( 'XMP', __METHOD__ . " Expected date but got $val" );
$val = null;
@@ -295,7 +295,6 @@ class XMPValidate {
return;
}
-
// Extra check for empty string necessary due to TZ but no second case.
$stripSeconds = false;
if ( !isset( $res[6] ) || $res[6] === '' ) {
@@ -331,7 +330,7 @@ class XMPValidate {
* @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf
* section 1.2.7.4 on page 23
*
- * @param $info Array unused (info about prop)
+ * @param array $info unused (info about prop)
* @param &$val String GPS string in either DDD,MM,SSk or
* or DDD,MM.mmk form
* @param $standalone Boolean if its a simple prop (should always be true)
@@ -342,7 +341,7 @@ class XMPValidate {
}
$m = array();
- if ( preg_match(
+ if ( preg_match(
'/(\d{1,3}),(\d{1,2}),(\d{1,2})([NWSE])/D',
$val, $m )
) {
@@ -354,7 +353,7 @@ class XMPValidate {
}
$val = $coord;
return;
- } elseif ( preg_match(
+ } elseif ( preg_match(
'/(\d{1,3}),(\d{1,2}(?:.\d*)?)([NWSE])/D',
$val, $m )
) {
@@ -367,7 +366,7 @@ class XMPValidate {
return;
} else {
- wfDebugLog( 'XMP', __METHOD__
+ wfDebugLog( 'XMP', __METHOD__
. " Expected GPSCoordinate, but got $val." );
$val = null;
return;
diff --git a/includes/mime.types b/includes/mime.types
index 5b64201f..a89d229a 100644
--- a/includes/mime.types
+++ b/includes/mime.types
@@ -65,6 +65,7 @@ audio/basic au snd
audio/midi mid midi kar
audio/mpeg mpga mp2 mp3
audio/ogg oga ogg spx
+video/webm webm
audio/webm webm
audio/x-aiff aif aiff aifc
audio/x-matroska mka mkv
@@ -120,7 +121,6 @@ video/mpeg mpeg mpg mpe
video/ogg ogv ogm ogg
video/quicktime qt mov
video/vnd.mpegurl mxu
-video/webm webm
video/x-flv flv
video/x-matroska mkv mka
video/x-msvideo avi
diff --git a/includes/mobile/DeviceDetection.php b/includes/mobile/DeviceDetection.php
deleted file mode 100644
index 262665be..00000000
--- a/includes/mobile/DeviceDetection.php
+++ /dev/null
@@ -1,459 +0,0 @@
-<?php
-/**
- * Mobile device detection code
- *
- * Copyright © 2011 Patrick Reilly
- * http://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Base for classes describing devices and their capabilities
- * @since 1.20
- */
-interface IDeviceProperties {
- /**
- * @return string: 'html' or 'wml'
- */
- function format();
-
- /**
- * @return bool
- */
- function supportsJavaScript();
-
- /**
- * @return bool
- */
- function supportsJQuery();
-
- /**
- * @return bool
- */
- function disableZoom();
-}
-
-/**
- * @since 1.20
- */
-interface IDeviceDetector {
- /**
- * @param $userAgent
- * @param string $acceptHeader
- * @return IDeviceProperties
- */
- function detectDeviceProperties( $userAgent, $acceptHeader = '' );
-
- /**
- * @param $deviceName
- * @return IDeviceProperties
- */
- function getDeviceProperties( $deviceName );
-
- /**
- * @param $userAgent string
- * @param $acceptHeader string
- * @return string
- */
- function detectDeviceName( $userAgent, $acceptHeader = '' );
-}
-
-/**
- * MediaWiki's default IDeviceProperties implementation
- */
-final class DeviceProperties implements IDeviceProperties {
- private $device;
-
- public function __construct( array $deviceCapabilities ) {
- $this->device = $deviceCapabilities;
- }
-
- /**
- * @return string
- */
- function format() {
- return $this->device['view_format'];
- }
-
- /**
- * @return bool
- */
- function supportsJavaScript() {
- return $this->device['supports_javascript'];
- }
-
- /**
- * @return bool
- */
- function supportsJQuery() {
- return $this->device['supports_jquery'];
- }
-
- /**
- * @return bool
- */
- function disableZoom() {
- return $this->device['disable_zoom'];
- }
-}
-
-/**
- * Provides abstraction for a device.
- * A device can select which format a request should receive and
- * may be extended to provide access to particular device functionality.
- * @since 1.20
- */
-class DeviceDetection implements IDeviceDetector {
-
- private static $formats = array (
- 'html' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'default',
- 'supports_javascript' => false,
- 'supports_jquery' => false,
- 'disable_zoom' => true,
- ),
- 'capable' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'default',
- 'supports_javascript' => true,
- 'supports_jquery' => true,
- 'disable_zoom' => true,
- ),
- 'webkit' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'webkit',
- 'supports_javascript' => true,
- 'supports_jquery' => true,
- 'disable_zoom' => false,
- ),
- 'ie' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'default',
- 'supports_javascript' => true,
- 'supports_jquery' => true,
- 'disable_zoom' => false,
- ),
- 'android' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'android',
- 'supports_javascript' => true,
- 'supports_jquery' => true,
- 'disable_zoom' => false,
- ),
- 'iphone' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'iphone',
- 'supports_javascript' => true,
- 'supports_jquery' => true,
- 'disable_zoom' => false,
- ),
- 'iphone2' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'iphone2',
- 'supports_javascript' => true,
- 'supports_jquery' => true,
- 'disable_zoom' => true,
- ),
- 'native_iphone' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'default',
- 'supports_javascript' => true,
- 'supports_jquery' => true,
- 'disable_zoom' => false,
- ),
- 'palm_pre' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'palm_pre',
- 'supports_javascript' => true,
- 'supports_jquery' => false,
- 'disable_zoom' => true,
- ),
- 'kindle' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'kindle',
- 'supports_javascript' => false,
- 'supports_jquery' => false,
- 'disable_zoom' => true,
- ),
- 'kindle2' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'kindle',
- 'supports_javascript' => false,
- 'supports_jquery' => false,
- 'disable_zoom' => true,
- ),
- 'blackberry' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'blackberry',
- 'supports_javascript' => true,
- 'supports_jquery' => false,
- 'disable_zoom' => true,
- ),
- 'blackberry-lt5' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'blackberry',
- 'supports_javascript' => false,
- 'supports_jquery' => false,
- 'disable_zoom' => true,
- ),
- 'netfront' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'simple',
- 'supports_javascript' => false,
- 'supports_jquery' => false,
- 'disable_zoom' => true,
- ),
- 'wap2' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'simple',
- 'supports_javascript' => false,
- 'supports_jquery' => false,
- 'disable_zoom' => true,
- ),
- 'psp' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'psp',
- 'supports_javascript' => false,
- 'supports_jquery' => false,
- 'disable_zoom' => true,
- ),
- 'ps3' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'simple',
- 'supports_javascript' => false,
- 'supports_jquery' => false,
- 'disable_zoom' => true,
- ),
- 'wii' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'wii',
- 'supports_javascript' => true,
- 'supports_jquery' => true,
- 'disable_zoom' => true,
- ),
- 'operamini' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'operamini',
- 'supports_javascript' => false,
- 'supports_jquery' => false,
- 'disable_zoom' => true,
- ),
- 'operamobile' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'operamobile',
- 'supports_javascript' => true,
- 'supports_jquery' => true,
- 'disable_zoom' => true,
- ),
- 'nokia' => array (
- 'view_format' => 'html',
- 'css_file_name' => 'nokia',
- 'supports_javascript' => true,
- 'supports_jquery' => false,
- 'disable_zoom' => true,
- ),
- 'wml' => array (
- 'view_format' => 'wml',
- 'css_file_name' => null,
- 'supports_javascript' => false,
- 'supports_jquery' => false,
- 'disable_zoom' => true,
- ),
- );
-
- /**
- * Returns an instance of detection class, overridable by extensions
- * @return IDeviceDetector
- */
- public static function factory() {
- global $wgDeviceDetectionClass;
-
- static $instance = null;
- if ( !$instance ) {
- $instance = new $wgDeviceDetectionClass();
- }
- return $instance;
- }
-
- /**
- * @deprecated: Deprecated, will be removed once detectDeviceProperties() will be deployed everywhere on WMF
- * @param $userAgent
- * @param string $acceptHeader
- * @return array
- */
- public function detectDevice( $userAgent, $acceptHeader = '' ) {
- $formatName = $this->detectFormatName( $userAgent, $acceptHeader );
- return $this->getDevice( $formatName );
- }
-
- /**
- * @param $userAgent
- * @param string $acceptHeader
- * @return IDeviceProperties
- */
- public function detectDeviceProperties( $userAgent, $acceptHeader = '' ) {
- $deviceName = $this->detectDeviceName( $userAgent, $acceptHeader );
- return $this->getDeviceProperties( $deviceName );
- }
-
- /**
- * @deprecated: Deprecated, will be removed once detectDeviceProperties() will be deployed everywhere on WMF
- * @param $formatName
- * @return array
- */
- public function getDevice( $formatName ) {
- return ( isset( self::$formats[$formatName] ) ) ? self::$formats[$formatName] : array();
- }
-
- /**
- * @param $deviceName
- * @return IDeviceProperties
- */
- public function getDeviceProperties( $deviceName ) {
- if ( isset( self::$formats[$deviceName] ) ) {
- return new DeviceProperties( self::$formats[$deviceName] );
- } else {
- return new DeviceProperties( array(
- 'view_format' => 'html',
- 'css_file_name' => 'default',
- 'supports_javascript' => true,
- 'supports_jquery' => true,
- 'disable_zoom' => true,
- ) );
- }
- }
-
- /**
- * @deprecated: Renamed to detectDeviceName()
- * @param $userAgent string
- * @param $acceptHeader string
- * @return string
- */
- public function detectFormatName( $userAgent, $acceptHeader = '' ) {
- return $this->detectDeviceName( $userAgent, $acceptHeader );
- }
-
- /**
- * @param $userAgent string
- * @param $acceptHeader string
- * @return string
- */
- public function detectDeviceName( $userAgent, $acceptHeader = '' ) {
- wfProfileIn( __METHOD__ );
-
- $deviceName = '';
- if ( preg_match( '/Android/', $userAgent ) ) {
- $deviceName = 'android';
- if ( strpos( $userAgent, 'Opera Mini' ) !== false ) {
- $deviceName = 'operamini';
- } elseif ( strpos( $userAgent, 'Opera Mobi' ) !== false ) {
- $deviceName = 'operamobile';
- }
- } elseif ( preg_match( '/MSIE 9.0/', $userAgent ) ||
- preg_match( '/MSIE 8.0/', $userAgent ) ) {
- $deviceName = 'ie';
- } elseif( preg_match( '/MSIE/', $userAgent ) ) {
- $deviceName = 'html';
- } elseif ( strpos( $userAgent, 'Opera Mobi' ) !== false ) {
- $deviceName = 'operamobile';
- } elseif ( preg_match( '/iPad.* Safari/', $userAgent ) ) {
- $deviceName = 'iphone';
- } elseif ( preg_match( '/iPhone.* Safari/', $userAgent ) ) {
- if ( strpos( $userAgent, 'iPhone OS 2' ) !== false ) {
- $deviceName = 'iphone2';
- } else {
- $deviceName = 'iphone';
- }
- } elseif ( preg_match( '/iPhone/', $userAgent ) ) {
- if ( strpos( $userAgent, 'Opera' ) !== false ) {
- $deviceName = 'operamini';
- } else {
- $deviceName = 'native_iphone';
- }
- } elseif ( preg_match( '/WebKit/', $userAgent ) ) {
- if ( preg_match( '/Series60/', $userAgent ) ) {
- $deviceName = 'nokia';
- } elseif ( preg_match( '/webOS/', $userAgent ) ) {
- $deviceName = 'palm_pre';
- } else {
- $deviceName = 'webkit';
- }
- } elseif ( preg_match( '/Opera/', $userAgent ) ) {
- if ( strpos( $userAgent, 'Nintendo Wii' ) !== false ) {
- $deviceName = 'wii';
- } elseif ( strpos( $userAgent, 'Opera Mini' ) !== false ) {
- $deviceName = 'operamini';
- } else {
- $deviceName = 'operamobile';
- }
- } elseif ( preg_match( '/Kindle\/1.0/', $userAgent ) ) {
- $deviceName = 'kindle';
- } elseif ( preg_match( '/Kindle\/2.0/', $userAgent ) ) {
- $deviceName = 'kindle2';
- } elseif ( preg_match( '/Firefox/', $userAgent ) ) {
- $deviceName = 'capable';
- } elseif ( preg_match( '/NetFront/', $userAgent ) ) {
- $deviceName = 'netfront';
- } elseif ( preg_match( '/SEMC-Browser/', $userAgent ) ) {
- $deviceName = 'wap2';
- } elseif ( preg_match( '/Series60/', $userAgent ) ) {
- $deviceName = 'wap2';
- } elseif ( preg_match( '/PlayStation Portable/', $userAgent ) ) {
- $deviceName = 'psp';
- } elseif ( preg_match( '/PLAYSTATION 3/', $userAgent ) ) {
- $deviceName = 'ps3';
- } elseif ( preg_match( '/SAMSUNG/', $userAgent ) ) {
- $deviceName = 'capable';
- } elseif ( preg_match( '/BlackBerry/', $userAgent ) ) {
- if( preg_match( '/BlackBerry[^\/]*\/[1-4]\./', $userAgent ) ) {
- $deviceName = 'blackberry-lt5';
- } else {
- $deviceName = 'blackberry';
- }
- }
-
- if ( $deviceName === '' ) {
- if ( strpos( $acceptHeader, 'application/vnd.wap.xhtml+xml' ) !== false ) {
- // Should be wap2
- $deviceName = 'html';
- } elseif ( strpos( $acceptHeader, 'vnd.wap.wml' ) !== false ) {
- $deviceName = 'wml';
- } else {
- $deviceName = 'html';
- }
- }
- wfProfileOut( __METHOD__ );
- return $deviceName;
- }
-
- /**
- * @return array: List of all device-specific stylesheets
- */
- public function getCssFiles() {
- $files = array();
-
- foreach ( self::$formats as $dev ) {
- if ( isset( $dev['css_file_name'] ) ) {
- $files[] = $dev['css_file_name'];
- }
- }
- return array_unique( $files );
- }
-}
diff --git a/includes/normal/Makefile b/includes/normal/Makefile
index f0c340f6..66348ee3 100644
--- a/includes/normal/Makefile
+++ b/includes/normal/Makefile
@@ -8,7 +8,7 @@
# Explicitly using Unicode 6.0
BASE=http://www.unicode.org/Public/6.0.0/ucd
-# Can override to php-cli or php5 or whatevah
+# Can override to php-cli or php5 or whatever
PHP=php
#PHP=php-cli
diff --git a/includes/normal/RandomTest.php b/includes/normal/RandomTest.php
index 23471e94..9dc1c861 100644
--- a/includes/normal/RandomTest.php
+++ b/includes/normal/RandomTest.php
@@ -26,7 +26,7 @@
* @ingroup UtfNormal
*/
-if( php_sapi_name() != 'cli' ) {
+if( PHP_SAPI != 'cli' ) {
die( "Run me from the command line please.\n" );
}
diff --git a/includes/normal/Utf8CaseGenerate.php b/includes/normal/Utf8CaseGenerate.php
index 368d0bcd..adc3ef22 100644
--- a/includes/normal/Utf8CaseGenerate.php
+++ b/includes/normal/Utf8CaseGenerate.php
@@ -25,7 +25,7 @@
* @ingroup UtfNormal
*/
-if( php_sapi_name() != 'cli' ) {
+if( PHP_SAPI != 'cli' ) {
die( "Run me from the command line please.\n" );
}
@@ -49,7 +49,7 @@ while( false !== ($line = fgets( $in ) ) ) {
$name = $columns[1];
$simpleUpper = $columns[12];
$simpleLower = $columns[13];
-
+
$source = codepointToUtf8( hexdec( $codepoint ) );
if( $simpleUpper ) {
$wikiUpperChars[$source] = codepointToUtf8( hexdec( $simpleUpper ) );
@@ -60,7 +60,7 @@ while( false !== ($line = fgets( $in ) ) ) {
}
fclose( $in );
-$out = fopen("Utf8Case.php", "wt");
+$out = fopen( "Utf8Case.php", "wt" );
if( $out ) {
$outUpperChars = escapeArray( $wikiUpperChars );
$outLowerChars = escapeArray( $wikiLowerChars );
diff --git a/includes/normal/Utf8Test.php b/includes/normal/Utf8Test.php
index 6eae6e72..c5c1be59 100644
--- a/includes/normal/Utf8Test.php
+++ b/includes/normal/Utf8Test.php
@@ -27,6 +27,10 @@
/** */
+if ( PHP_SAPI != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
+
require_once 'UtfNormalDefines.php';
require_once 'UtfNormalUtil.php';
require_once 'UtfNormal.php';
@@ -34,9 +38,6 @@ mb_internal_encoding( "utf-8" );
$verbose = false;
#$verbose = true;
-if( php_sapi_name() != 'cli' ) {
- die( "Run me from the command line please.\n" );
-}
$in = fopen( "UTF-8-test.txt", "rt" );
if( !$in ) {
diff --git a/includes/normal/UtfNormal.php b/includes/normal/UtfNormal.php
index 08f85bd3..77ddb79b 100644
--- a/includes/normal/UtfNormal.php
+++ b/includes/normal/UtfNormal.php
@@ -37,7 +37,7 @@ define( 'NORMALIZE_INTL', function_exists( 'normalizer_normalize' ) );
*
* Not as fast as I'd like, but should be usable for most purposes.
* UtfNormal::toNFC() will bail early if given ASCII text or text
- * it can quickly deterimine is already normalized.
+ * it can quickly determine is already normalized.
*
* All functions can be called static.
*
@@ -73,7 +73,7 @@ class UtfNormal {
* Fast return for pure ASCII strings; some lesser optimizations for
* strings containing only known-good characters. Not as fast as toNFC().
*
- * @param $string String: a UTF-8 string
+ * @param string $string a UTF-8 string
* @return string a clean, shiny, normalized UTF-8 string
*/
static function cleanUp( $string ) {
@@ -114,7 +114,7 @@ class UtfNormal {
* Fast return for pure ASCII strings; some lesser optimizations for
* strings containing only known-good characters.
*
- * @param $string String: a valid UTF-8 string. Input is not validated.
+ * @param string $string a valid UTF-8 string. Input is not validated.
* @return string a UTF-8 string in normal form C
*/
static function toNFC( $string ) {
@@ -132,7 +132,7 @@ class UtfNormal {
* Convert a UTF-8 string to normal form D, canonical decomposition.
* Fast return for pure ASCII strings.
*
- * @param $string String: a valid UTF-8 string. Input is not validated.
+ * @param string $string a valid UTF-8 string. Input is not validated.
* @return string a UTF-8 string in normal form D
*/
static function toNFD( $string ) {
@@ -151,7 +151,7 @@ class UtfNormal {
* This may cause irreversible information loss, use judiciously.
* Fast return for pure ASCII strings.
*
- * @param $string String: a valid UTF-8 string. Input is not validated.
+ * @param string $string a valid UTF-8 string. Input is not validated.
* @return string a UTF-8 string in normal form KC
*/
static function toNFKC( $string ) {
@@ -170,7 +170,7 @@ class UtfNormal {
* This may cause irreversible information loss, use judiciously.
* Fast return for pure ASCII strings.
*
- * @param $string String: a valid UTF-8 string. Input is not validated.
+ * @param string $string a valid UTF-8 string. Input is not validated.
* @return string a UTF-8 string in normal form KD
*/
static function toNFKD( $string ) {
@@ -197,7 +197,7 @@ class UtfNormal {
/**
* Returns true if the string is _definitely_ in NFC.
* Returns false if not or uncertain.
- * @param $string String: a valid UTF-8 string. Input is not validated.
+ * @param string $string a valid UTF-8 string. Input is not validated.
* @return bool
*/
static function quickIsNFC( $string ) {
@@ -237,7 +237,7 @@ class UtfNormal {
/**
* Returns true if the string is _definitely_ in NFC.
* Returns false if not or uncertain.
- * @param $string String: a UTF-8 string, altered on output to be valid UTF-8 safe for XML.
+ * @param string $string a UTF-8 string, altered on output to be valid UTF-8 safe for XML.
* @return bool
*/
static function quickIsNFCVerify( &$string ) {
@@ -503,8 +503,8 @@ class UtfNormal {
* (depending on which decomposition map is passed to us).
* Input is assumed to be *valid* UTF-8. Invalid code will break.
* @private
- * @param $string String: valid UTF-8 string
- * @param $map Array: hash of expanded decomposition map
+ * @param string $string valid UTF-8 string
+ * @param array $map hash of expanded decomposition map
* @return string a UTF-8 string decomposed, not yet normalized (needs sorting)
*/
static function fastDecompose( $string, $map ) {
@@ -564,7 +564,7 @@ class UtfNormal {
* Sorts combining characters into canonical order. This is the
* final step in creating decomposed normal forms D and KD.
* @private
- * @param $string String: a valid, decomposed UTF-8 string. Input is not validated.
+ * @param string $string a valid, decomposed UTF-8 string. Input is not validated.
* @return string a UTF-8 string with combining characters sorted in canonical order
*/
static function fastCombiningSort( $string ) {
@@ -616,7 +616,7 @@ 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.
+ * @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 ) {
@@ -627,8 +627,8 @@ class UtfNormal {
$lastHangul = 0;
$startChar = '';
$combining = '';
- $x1 = ord(substr(UTF8_HANGUL_VBASE,0,1));
- $x2 = ord(substr(UTF8_HANGUL_TEND,0,1));
+ $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 );
@@ -762,10 +762,10 @@ class UtfNormal {
* Function to replace some characters that we don't want
* but most of the native normalize functions keep.
*
- * @param $string String The string
+ * @param string $string The string
* @return String String with the character codes replaced.
*/
- private static function replaceForNativeNormalize( $string ) {
+ private static function replaceForNativeNormalize( $string ) {
$string = preg_replace(
'/[\x00-\x08\x0b\x0c\x0e-\x1f]/',
UTF8_REPLACEMENT,
diff --git a/includes/normal/UtfNormalBench.php b/includes/normal/UtfNormalBench.php
index 944c4435..89de9290 100644
--- a/includes/normal/UtfNormalBench.php
+++ b/includes/normal/UtfNormalBench.php
@@ -19,11 +19,15 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
- *
+ *
* @file
* @ingroup UtfNormal
*/
+if( PHP_SAPI != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
+
if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
dl( 'php_utfnormal.so' );
}
@@ -34,10 +38,6 @@ require_once 'UtfNormal.php';
define( 'BENCH_CYCLES', 5 );
-if( php_sapi_name() != 'cli' ) {
- die( "Run me from the command line please.\n" );
-}
-
$testfiles = array(
'testdata/washington.txt' => 'English text',
'testdata/berlin.txt' => 'German text',
@@ -80,7 +80,7 @@ function benchmarkTest( &$u, $filename, $desc ) {
}
}
-function benchTime(){
+function benchTime() {
$st = explode( ' ', microtime() );
return (float)$st[0] + (float)$st[1];
}
diff --git a/includes/normal/UtfNormalDefines.php b/includes/normal/UtfNormalDefines.php
index 5142a414..b07e3399 100644
--- a/includes/normal/UtfNormalDefines.php
+++ b/includes/normal/UtfNormalDefines.php
@@ -2,7 +2,7 @@
/**
* Some constant definitions for the unicode normalization module.
*
- * Note: these constants must all be resolvable at compile time by HipHop,
+ * Note: these constants must all be resolvable at compile time by HipHop,
* since this file will not be executed during request startup for a compiled
* MediaWiki.
*
@@ -26,7 +26,7 @@
*/
define( 'UNICODE_HANGUL_FIRST', 0xac00 );
-define( 'UNICODE_HANGUL_LAST', 0xd7a3 );
+define( 'UNICODE_HANGUL_LAST', 0xd7a3 );
define( 'UNICODE_HANGUL_LBASE', 0x1100 );
define( 'UNICODE_HANGUL_VBASE', 0x1161 );
diff --git a/includes/normal/UtfNormalGenerate.php b/includes/normal/UtfNormalGenerate.php
index e4c1138e..f392df52 100644
--- a/includes/normal/UtfNormalGenerate.php
+++ b/includes/normal/UtfNormalGenerate.php
@@ -25,7 +25,7 @@
* @ingroup UtfNormal
*/
-if( php_sapi_name() != 'cli' ) {
+if( PHP_SAPI != 'cli' ) {
die( "Run me from the command line please.\n" );
}
@@ -177,7 +177,7 @@ if( $out ) {
*
* @file
*/
-
+
UtfNormal::\$utfCombiningClass = unserialize( '$serCombining' );
UtfNormal::\$utfCanonicalComp = unserialize( '$serComp' );
UtfNormal::\$utfCanonicalDecomp = unserialize( '$serCanon' );
diff --git a/includes/normal/UtfNormalMemStress.php b/includes/normal/UtfNormalMemStress.php
index 1277dc20..9732d762 100644
--- a/includes/normal/UtfNormalMemStress.php
+++ b/includes/normal/UtfNormalMemStress.php
@@ -26,6 +26,10 @@
* @ingroup UtfNormal
*/
+if( PHP_SAPI != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
+
if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
dl( 'php_utfnormal.so' );
}
@@ -38,10 +42,6 @@ define( 'BENCH_CYCLES', 1 );
define( 'BIGSIZE', 1024 * 1024 * 10); // 10m
ini_set('memory_limit', BIGSIZE + 120 * 1024 * 1024);
-if( php_sapi_name() != 'cli' ) {
- die( "Run me from the command line please.\n" );
-}
-
$testfiles = array(
'testdata/washington.txt' => 'English text',
'testdata/berlin.txt' => 'German text',
@@ -82,7 +82,7 @@ function benchmarkTest( &$u, $filename, $desc ) {
}
}
-function benchTime(){
+function benchTime() {
$st = explode( ' ', microtime() );
return (float)$st[0] + (float)$st[1];
}
diff --git a/includes/normal/UtfNormalTest.php b/includes/normal/UtfNormalTest.php
index 5872ec34..661e53fd 100644
--- a/includes/normal/UtfNormalTest.php
+++ b/includes/normal/UtfNormalTest.php
@@ -25,6 +25,10 @@
* @ingroup UtfNormal
*/
+if( PHP_SAPI != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
+
$verbose = true;
#define( 'PRETTY_UTF8', true );
@@ -54,10 +58,6 @@ require_once 'UtfNormalDefines.php';
require_once 'UtfNormalUtil.php';
require_once 'UtfNormal.php';
-if( php_sapi_name() != 'cli' ) {
- die( "Run me from the command line please.\n" );
-}
-
$in = fopen("NormalizationTest.txt", "rt");
if( !$in ) {
print "Couldn't open NormalizationTest.txt -- can't run tests.\n";
diff --git a/includes/normal/UtfNormalTest2.php b/includes/normal/UtfNormalTest2.php
index 691bfaa7..2266696e 100644
--- a/includes/normal/UtfNormalTest2.php
+++ b/includes/normal/UtfNormalTest2.php
@@ -1,4 +1,4 @@
-#!/usr/bin/php
+#!/usr/bin/env php
<?php
/**
* Other tests for the unicode normalization module.
@@ -22,7 +22,7 @@
* @ingroup UtfNormal
*/
-if( php_sapi_name() != 'cli' ) {
+if( PHP_SAPI != 'cli' ) {
die( "Run me from the command line please.\n" );
}
diff --git a/includes/normal/UtfNormalUtil.php b/includes/normal/UtfNormalUtil.php
index bfad7095..9b96a073 100644
--- a/includes/normal/UtfNormalUtil.php
+++ b/includes/normal/UtfNormalUtil.php
@@ -71,7 +71,7 @@ function hexSequenceToUtf8( $sequence ) {
* Take a UTF-8 string and return a space-separated series of hex
* numbers representing Unicode code points. For debugging.
*
- * @param $str String: UTF-8 string.
+ * @param string $str UTF-8 string.
* @return string
* @private
*/
@@ -114,7 +114,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;
}
@@ -125,7 +125,7 @@ function utf8ToCodepoint( $char ) {
/**
* Escape a string for inclusion in a PHP single-quoted string literal.
*
- * @param $string String: string to be escaped.
+ * @param string $string string to be escaped.
* @return String: escaped string.
* @public
*/
diff --git a/includes/objectcache/APCBagOStuff.php b/includes/objectcache/APCBagOStuff.php
index 1a0de218..3fb80835 100644
--- a/includes/objectcache/APCBagOStuff.php
+++ b/includes/objectcache/APCBagOStuff.php
@@ -29,11 +29,14 @@
class APCBagOStuff extends BagOStuff {
/**
* @param $key string
+ * @param $casToken[optional] int
* @return mixed
*/
- public function get( $key ) {
+ public function get( $key, &$casToken = null ) {
$val = apc_fetch( $key );
+ $casToken = $val;
+
if ( is_string( $val ) ) {
if ( $this->isInteger( $val ) ) {
$val = intval( $val );
@@ -62,6 +65,18 @@ class APCBagOStuff extends BagOStuff {
}
/**
+ * @param $casToken mixed
+ * @param $key string
+ * @param $value mixed
+ * @param $exptime int
+ * @return bool
+ */
+ public function cas( $casToken, $key, $value, $exptime = 0 ) {
+ // APC's CAS functions only work on integers
+ throw new MWException( "CAS is not implemented in " . __CLASS__ );
+ }
+
+ /**
* @param $key string
* @param $time int
* @return bool
@@ -72,6 +87,17 @@ class APCBagOStuff extends BagOStuff {
return true;
}
+ /**
+ * @param $key string
+ * @param $callback closure Callback method to be executed
+ * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+ * @param int $attempts The amount of times to attempt a merge in case of failure
+ * @return bool success
+ */
+ public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+ return $this->mergeViaLock( $key, $callback, $exptime, $attempts );
+ }
+
public function incr( $key, $value = 1 ) {
return apc_inc( $key, $value );
}
@@ -79,19 +105,4 @@ class APCBagOStuff extends BagOStuff {
public function decr( $key, $value = 1 ) {
return apc_dec( $key, $value );
}
-
- /**
- * @return Array
- */
- public function keys() {
- $info = apc_cache_info( 'user' );
- $list = $info['cache_list'];
- $keys = array();
-
- foreach ( $list as $entry ) {
- $keys[] = $entry['info'];
- }
-
- return $keys;
- }
}
diff --git a/includes/objectcache/BagOStuff.php b/includes/objectcache/BagOStuff.php
index 7bbaff93..dd744672 100644
--- a/includes/objectcache/BagOStuff.php
+++ b/includes/objectcache/BagOStuff.php
@@ -56,58 +56,153 @@ abstract class BagOStuff {
/**
* Get an item with the given key. Returns false if it does not exist.
* @param $key string
+ * @param $casToken[optional] mixed
* @return mixed Returns false on failure
*/
- abstract public function get( $key );
+ abstract public function get( $key, &$casToken = null );
/**
* Set an item.
* @param $key string
* @param $value mixed
- * @param $exptime int Either an interval in seconds or a unix timestamp for expiry
+ * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
* @return bool success
*/
abstract public function set( $key, $value, $exptime = 0 );
/**
+ * Check and set an item.
+ * @param $casToken mixed
+ * @param $key string
+ * @param $value mixed
+ * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+ * @return bool success
+ */
+ abstract public function cas( $casToken, $key, $value, $exptime = 0 );
+
+ /**
* Delete an item.
* @param $key string
- * @param $time int Amount of time to delay the operation (mostly memcached-specific)
+ * @param int $time Amount of time to delay the operation (mostly memcached-specific)
* @return bool True if the item was deleted or not found, false on failure
*/
abstract public function delete( $key, $time = 0 );
/**
+ * Merge changes into the existing cache value (possibly creating a new one).
+ * The callback function returns the new value given the current value (possibly false),
+ * and takes the arguments: (this BagOStuff object, cache key, current value).
+ *
* @param $key string
- * @param $timeout integer
+ * @param $callback closure Callback method to be executed
+ * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+ * @param int $attempts The amount of times to attempt a merge in case of failure
* @return bool success
*/
- public function lock( $key, $timeout = 0 ) {
- /* stub */
- return true;
+ public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+ return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
}
/**
+ * @see BagOStuff::merge()
+ *
* @param $key string
+ * @param $callback closure Callback method to be executed
+ * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+ * @param int $attempts The amount of times to attempt a merge in case of failure
* @return bool success
*/
- public function unlock( $key ) {
- /* stub */
- return true;
+ protected function mergeViaCas( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+ do {
+ $casToken = null; // passed by reference
+ $currentValue = $this->get( $key, $casToken ); // get the old value
+ $value = $callback( $this, $key, $currentValue ); // derive the new value
+
+ if ( $value === false ) {
+ $success = true; // do nothing
+ } elseif ( $currentValue === false ) {
+ // Try to create the key, failing if it gets created in the meantime
+ $success = $this->add( $key, $value, $exptime );
+ } else {
+ // Try to update the key, failing if it gets changed in the meantime
+ $success = $this->cas( $casToken, $key, $value, $exptime );
+ }
+ } while ( !$success && --$attempts );
+
+ return $success;
}
/**
- * @todo: what is this?
- * @return Array
+ * @see BagOStuff::merge()
+ *
+ * @param $key string
+ * @param $callback closure Callback method to be executed
+ * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+ * @param int $attempts The amount of times to attempt a merge in case of failure
+ * @return bool success
*/
- public function keys() {
- /* stub */
- return array();
+ protected function mergeViaLock( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+ if ( !$this->lock( $key, 60 ) ) {
+ return false;
+ }
+
+ $currentValue = $this->get( $key ); // get the old value
+ $value = $callback( $this, $key, $currentValue ); // derive the new value
+
+ if ( $value === false ) {
+ $success = true; // do nothing
+ } else {
+ $success = $this->set( $key, $value, $exptime ); // set the new value
+ }
+
+ if ( !$this->unlock( $key ) ) {
+ // this should never happen
+ trigger_error( "Could not release lock for key '$key'." );
+ }
+
+ return $success;
+ }
+
+ /**
+ * @param $key string
+ * @param $timeout integer [optional]
+ * @return bool success
+ */
+ public function lock( $key, $timeout = 60 ) {
+ $timestamp = microtime( true ); // starting UNIX timestamp
+ if ( $this->add( "{$key}:lock", $timeout ) ) {
+ return true;
+ }
+
+ $uRTT = ceil( 1e6 * ( microtime( true ) - $timestamp ) ); // estimate RTT (us)
+ $sleep = 2*$uRTT; // rough time to do get()+set()
+
+ $locked = false; // lock acquired
+ $attempts = 0; // failed attempts
+ do {
+ if ( ++$attempts >= 3 && $sleep <= 1e6 ) {
+ // Exponentially back off after failed attempts to avoid network spam.
+ // About 2*$uRTT*(2^n-1) us of "sleep" happen for the next n attempts.
+ $sleep *= 2;
+ }
+ usleep( $sleep ); // back off
+ $locked = $this->add( "{$key}:lock", $timeout );
+ } while( !$locked );
+
+ return $locked;
+ }
+
+ /**
+ * @param $key string
+ * @return bool success
+ */
+ public function unlock( $key ) {
+ return $this->delete( "{$key}:lock" );
}
/**
* Delete all objects expiring before a certain date.
- * @param $date string The reference date in MW format
+ * @param string $date The reference date in MW format
* @param $progressCallback callback|bool Optional, a function which will be called
* regularly during long-running operations with the percentage progress
* as the first parameter.
@@ -123,7 +218,7 @@ abstract class BagOStuff {
/**
* Get an associative array containing the item for each of the keys that have items.
- * @param $keys Array List of strings
+ * @param array $keys List of strings
* @return Array
*/
public function getMulti( array $keys ) {
@@ -165,7 +260,7 @@ abstract class BagOStuff {
/**
* Increase stored value of $key by $value while preserving its TTL
- * @param $key String: Key to increase
+ * @param string $key Key to increase
* @param $value Integer: Value to add to $key (Default 1)
* @return integer|bool New value or false on failure
*/
diff --git a/includes/objectcache/DBABagOStuff.php b/includes/objectcache/DBABagOStuff.php
index 36ced496..c82b3aa4 100644
--- a/includes/objectcache/DBABagOStuff.php
+++ b/includes/objectcache/DBABagOStuff.php
@@ -111,9 +111,10 @@ class DBABagOStuff extends BagOStuff {
/**
* @param $key string
+ * @param $casToken[optional] mixed
* @return mixed
*/
- public function get( $key ) {
+ public function get( $key, &$casToken = null ) {
wfProfileIn( __METHOD__ );
wfDebug( __METHOD__ . "($key)\n" );
@@ -138,7 +139,10 @@ class DBABagOStuff extends BagOStuff {
$val = false;
}
+ $casToken = $val;
+
wfProfileOut( __METHOD__ );
+
return $val;
}
@@ -168,6 +172,42 @@ class DBABagOStuff extends BagOStuff {
}
/**
+ * @param $casToken mixed
+ * @param $key string
+ * @param $value mixed
+ * @param $exptime int
+ * @return bool
+ */
+ public function cas( $casToken, $key, $value, $exptime = 0 ) {
+ wfProfileIn( __METHOD__ );
+ wfDebug( __METHOD__ . "($key)\n" );
+
+ $blob = $this->encode( $value, $exptime );
+
+ $handle = $this->getWriter();
+ if ( !$handle ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ // DBA is locked to any other write connection, so we can safely
+ // compare the current & previous value before saving new value
+ $val = dba_fetch( $key, $handle );
+ list( $val, $exptime ) = $this->decode( $val );
+ if ( $casToken !== $val ) {
+ dba_close( $handle );
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ $ret = dba_replace( $key, $blob, $handle );
+ dba_close( $handle );
+
+ wfProfileOut( __METHOD__ );
+ return $ret;
+ }
+
+ /**
* @param $key string
* @param $time int
* @return bool
@@ -211,7 +251,7 @@ class DBABagOStuff extends BagOStuff {
# Insert failed, check to see if it failed due to an expired key
if ( !$ret ) {
- list( $value, $expiry ) = $this->decode( dba_fetch( $key, $handle ) );
+ list( , $expiry ) = $this->decode( dba_fetch( $key, $handle ) );
if ( $expiry && $expiry < time() ) {
# Yes expired, delete and try again
@@ -264,23 +304,4 @@ class DBABagOStuff extends BagOStuff {
return ( $value === false ) ? false : (int)$value;
}
-
- function keys() {
- $reader = $this->getReader();
- $k1 = dba_firstkey( $reader );
-
- if ( !$k1 ) {
- return array();
- }
-
- $result[] = $k1;
-
- $key = dba_nextkey( $reader );
- while ( $key ) {
- $result[] = $key;
- $key = dba_nextkey( $reader );
- }
-
- return $result;
- }
}
diff --git a/includes/objectcache/EhcacheBagOStuff.php b/includes/objectcache/EhcacheBagOStuff.php
index f86cf157..960668f5 100644
--- a/includes/objectcache/EhcacheBagOStuff.php
+++ b/includes/objectcache/EhcacheBagOStuff.php
@@ -28,27 +28,28 @@
* @ingroup Cache
*/
class EhcacheBagOStuff extends BagOStuff {
- var $servers, $cacheName, $connectTimeout, $timeout, $curlOptions,
+ var $servers, $cacheName, $connectTimeout, $timeout, $curlOptions,
$requestData, $requestDataPos;
-
+
var $curls = array();
/**
* @param $params array
+ * @throws MWException
*/
function __construct( $params ) {
if ( !defined( 'CURLOPT_TIMEOUT_MS' ) ) {
- throw new MWException( __CLASS__.' requires curl version 7.16.2 or later.' );
+ throw new MWException( __CLASS__ . ' requires curl version 7.16.2 or later.' );
}
if ( !extension_loaded( 'zlib' ) ) {
- throw new MWException( __CLASS__.' requires the zlib extension' );
+ throw new MWException( __CLASS__ . ' requires the zlib extension' );
}
if ( !isset( $params['servers'] ) ) {
- throw new MWException( __METHOD__.': servers parameter is required' );
+ throw new MWException( __METHOD__ . ': servers parameter is required' );
}
$this->servers = $params['servers'];
$this->cacheName = isset( $params['cache'] ) ? $params['cache'] : 'mw';
- $this->connectTimeout = isset( $params['connectTimeout'] )
+ $this->connectTimeout = isset( $params['connectTimeout'] )
? $params['connectTimeout'] : 1;
$this->timeout = isset( $params['timeout'] ) ? $params['timeout'] : 1;
$this->curlOptions = array(
@@ -64,9 +65,10 @@ class EhcacheBagOStuff extends BagOStuff {
/**
* @param $key string
+ * @param $casToken[optional] mixed
* @return bool|mixed
*/
- public function get( $key ) {
+ public function get( $key, &$casToken = null ) {
wfProfileIn( __METHOD__ );
$response = $this->doItemRequest( $key );
if ( !$response || $response['http_code'] == 404 ) {
@@ -74,16 +76,16 @@ class EhcacheBagOStuff extends BagOStuff {
return false;
}
if ( $response['http_code'] >= 300 ) {
- wfDebug( __METHOD__.": GET failure, got HTTP {$response['http_code']}\n" );
+ wfDebug( __METHOD__ . ": GET failure, got HTTP {$response['http_code']}\n" );
wfProfileOut( __METHOD__ );
- return false;
+ return false;
}
$body = $response['body'];
$type = $response['content_type'];
if ( $type == 'application/vnd.php.serialized+deflate' ) {
$body = gzinflate( $body );
if ( !$body ) {
- wfDebug( __METHOD__.": error inflating $key\n" );
+ wfDebug( __METHOD__ . ": error inflating $key\n" );
wfProfileOut( __METHOD__ );
return false;
}
@@ -91,11 +93,13 @@ class EhcacheBagOStuff extends BagOStuff {
} elseif ( $type == 'application/vnd.php.serialized' ) {
$data = unserialize( $body );
} else {
- wfDebug( __METHOD__.": unknown content type \"$type\"\n" );
+ wfDebug( __METHOD__ . ": unknown content type \"$type\"\n" );
wfProfileOut( __METHOD__ );
return false;
}
+ $casToken = $body;
+
wfProfileOut( __METHOD__ );
return $data;
}
@@ -123,7 +127,7 @@ class EhcacheBagOStuff extends BagOStuff {
if ( $code == 404 ) {
// Maybe the cache does not exist yet, let's try creating it
if ( !$this->createCache( $key ) ) {
- wfDebug( __METHOD__.": cache creation failed\n" );
+ wfDebug( __METHOD__ . ": cache creation failed\n" );
wfProfileOut( __METHOD__ );
return false;
}
@@ -132,9 +136,9 @@ class EhcacheBagOStuff extends BagOStuff {
$result = false;
if ( !$code ) {
- wfDebug( __METHOD__.": PUT failure for key $key\n" );
+ wfDebug( __METHOD__ . ": PUT failure for key $key\n" );
} elseif ( $code >= 300 ) {
- wfDebug( __METHOD__.": PUT failure for key $key: HTTP $code\n" );
+ wfDebug( __METHOD__ . ": PUT failure for key $key: HTTP $code\n" );
} else {
$result = true;
}
@@ -144,6 +148,20 @@ class EhcacheBagOStuff extends BagOStuff {
}
/**
+ * @param $casToken mixed
+ * @param $key string
+ * @param $value mixed
+ * @param $exptime int
+ * @return bool
+ */
+ public function cas( $casToken, $key, $value, $exptime = 0 ) {
+ // Not sure if we can implement CAS for ehcache. There appears to be CAS-support per
+ // http://ehcache.org/documentation/get-started/consistency-options#cas-cache-operations,
+ // but I can't find any docs for our current implementation.
+ throw new MWException( "CAS is not implemented in " . __CLASS__ );
+ }
+
+ /**
* @param $key string
* @param $time int
* @return bool
@@ -154,7 +172,7 @@ class EhcacheBagOStuff extends BagOStuff {
array( CURLOPT_CUSTOMREQUEST => 'DELETE' ) );
$code = isset( $response['http_code'] ) ? $response['http_code'] : 0;
if ( !$response || ( $code != 404 && $code >= 300 ) ) {
- wfDebug( __METHOD__.": DELETE failure for key $key\n" );
+ wfDebug( __METHOD__ . ": DELETE failure for key $key\n" );
$result = false;
} else {
$result = true;
@@ -164,6 +182,14 @@ class EhcacheBagOStuff extends BagOStuff {
}
/**
+ * @see BagOStuff::merge()
+ * @return bool success
+ */
+ public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+ return $this->mergeViaLock( $key, $callback, $exptime, $attempts );
+ }
+
+ /**
* @param $key string
* @return string
*/
@@ -202,9 +228,9 @@ class EhcacheBagOStuff extends BagOStuff {
* @return int
*/
protected function attemptPut( $key, $data, $type, $ttl ) {
- // In initial benchmarking, it was 30 times faster to use CURLOPT_POST
+ // In initial benchmarking, it was 30 times faster to use CURLOPT_POST
// than CURLOPT_UPLOAD with CURLOPT_READFUNCTION. This was because
- // CURLOPT_UPLOAD was pushing the request headers first, then waiting
+ // CURLOPT_UPLOAD was pushing the request headers first, then waiting
// for an ACK packet, then sending the data, whereas CURLOPT_POST just
// sends the headers and the data in a single send().
$response = $this->doItemRequest( $key,
@@ -230,15 +256,15 @@ class EhcacheBagOStuff extends BagOStuff {
* @return bool
*/
protected function createCache( $key ) {
- wfDebug( __METHOD__.": creating cache for $key\n" );
- $response = $this->doCacheRequest( $key,
+ wfDebug( __METHOD__ . ": creating cache for $key\n" );
+ $response = $this->doCacheRequest( $key,
array(
CURLOPT_POST => 1,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_POSTFIELDS => '',
) );
if ( !$response ) {
- wfDebug( __CLASS__.": failed to create cache for $key\n" );
+ wfDebug( __CLASS__ . ": failed to create cache for $key\n" );
return false;
}
return ( $response['http_code'] == 201 /* created */
@@ -278,8 +304,8 @@ class EhcacheBagOStuff extends BagOStuff {
protected function doRequest( $curl, $url, $curlOptions = array() ) {
if ( array_diff_key( $curlOptions, $this->curlOptions ) ) {
// var_dump( array_diff_key( $curlOptions, $this->curlOptions ) );
- throw new MWException( __METHOD__.": to prevent options set in one doRequest() " .
- "call from affecting subsequent doRequest() calls, only options listed " .
+ throw new MWException( __METHOD__ . ": to prevent options set in one doRequest() " .
+ "call from affecting subsequent doRequest() calls, only options listed " .
"in \$this->curlOptions may be specified in the \$curlOptions parameter." );
}
$curlOptions += $this->curlOptions;
@@ -288,7 +314,7 @@ class EhcacheBagOStuff extends BagOStuff {
curl_setopt_array( $curl, $curlOptions );
$result = curl_exec( $curl );
if ( $result === false ) {
- wfDebug( __CLASS__.": curl error: " . curl_error( $curl ) . "\n" );
+ wfDebug( __CLASS__ . ": curl error: " . curl_error( $curl ) . "\n" );
return false;
}
$info = curl_getinfo( $curl );
diff --git a/includes/objectcache/EmptyBagOStuff.php b/includes/objectcache/EmptyBagOStuff.php
index bd28b241..62060579 100644
--- a/includes/objectcache/EmptyBagOStuff.php
+++ b/includes/objectcache/EmptyBagOStuff.php
@@ -30,9 +30,10 @@ class EmptyBagOStuff extends BagOStuff {
/**
* @param $key string
+ * @param $casToken[optional] mixed
* @return bool
*/
- function get( $key ) {
+ function get( $key, &$casToken = null ) {
return false;
}
@@ -47,6 +48,17 @@ class EmptyBagOStuff extends BagOStuff {
}
/**
+ * @param $casToken mixed
+ * @param $key string
+ * @param $value mixed
+ * @param $exp int
+ * @return bool
+ */
+ function cas( $casToken, $key, $value, $exp = 0 ) {
+ return true;
+ }
+
+ /**
* @param $key string
* @param $time int
* @return bool
@@ -54,6 +66,17 @@ class EmptyBagOStuff extends BagOStuff {
function delete( $key, $time = 0 ) {
return true;
}
+
+ /**
+ * @param $key string
+ * @param $callback closure Callback method to be executed
+ * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+ * @param int $attempts The amount of times to attempt a merge in case of failure
+ * @return bool success
+ */
+ public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+ return true;
+ }
}
/**
diff --git a/includes/objectcache/HashBagOStuff.php b/includes/objectcache/HashBagOStuff.php
index 799f26a3..d061eff0 100644
--- a/includes/objectcache/HashBagOStuff.php
+++ b/includes/objectcache/HashBagOStuff.php
@@ -52,9 +52,10 @@ class HashBagOStuff extends BagOStuff {
/**
* @param $key string
+ * @param $casToken[optional] mixed
* @return bool|mixed
*/
- function get( $key ) {
+ function get( $key, &$casToken = null ) {
if ( !isset( $this->bag[$key] ) ) {
return false;
}
@@ -63,6 +64,8 @@ class HashBagOStuff extends BagOStuff {
return false;
}
+ $casToken = $this->bag[$key][0];
+
return $this->bag[$key][0];
}
@@ -78,6 +81,21 @@ class HashBagOStuff extends BagOStuff {
}
/**
+ * @param $casToken mixed
+ * @param $key string
+ * @param $value mixed
+ * @param $exptime int
+ * @return bool
+ */
+ function cas( $casToken, $key, $value, $exptime = 0 ) {
+ if ( $this->get( $key ) === $casToken ) {
+ return $this->set( $key, $value, $exptime );
+ }
+
+ return false;
+ }
+
+ /**
* @param $key string
* @param $time int
* @return bool
@@ -91,12 +109,4 @@ class HashBagOStuff extends BagOStuff {
return true;
}
-
- /**
- * @return array
- */
- function keys() {
- return array_keys( $this->bag );
- }
}
-
diff --git a/includes/objectcache/MemcachedBagOStuff.php b/includes/objectcache/MemcachedBagOStuff.php
index 813c2727..3f1fa3a0 100644
--- a/includes/objectcache/MemcachedBagOStuff.php
+++ b/includes/objectcache/MemcachedBagOStuff.php
@@ -57,10 +57,11 @@ class MemcachedBagOStuff extends BagOStuff {
/**
* @param $key string
+ * @param $casToken[optional] mixed
* @return Mixed
*/
- public function get( $key ) {
- return $this->client->get( $this->encodeKey( $key ) );
+ public function get( $key, &$casToken = null ) {
+ return $this->client->get( $this->encodeKey( $key ), $casToken );
}
/**
@@ -76,6 +77,18 @@ class MemcachedBagOStuff extends BagOStuff {
/**
* @param $key string
+ * @param $casToken mixed
+ * @param $value
+ * @param $exptime int
+ * @return bool
+ */
+ public function cas( $casToken, $key, $value, $exptime = 0 ) {
+ return $this->client->cas( $casToken, $this->encodeKey( $key ),
+ $value, $this->fixExpiry( $exptime ) );
+ }
+
+ /**
+ * @param $key string
* @param $time int
* @return bool
*/
@@ -86,7 +99,7 @@ class MemcachedBagOStuff extends BagOStuff {
/**
* @param $key string
* @param $value int
- * @param $exptime int (default 0)
+ * @param int $exptime (default 0)
* @return Mixed
*/
public function add( $key, $value, $exptime = 0 ) {
@@ -101,7 +114,7 @@ class MemcachedBagOStuff extends BagOStuff {
* @return Mixed
*/
public function replace( $key, $value, $exptime = 0 ) {
- return $this->client->replace( $this->encodeKey( $key ), $value,
+ return $this->client->replace( $this->encodeKey( $key ), $value,
$this->fixExpiry( $exptime ) );
}
@@ -166,15 +179,9 @@ class MemcachedBagOStuff extends BagOStuff {
* Send a debug message to the log
*/
protected function debugLog( $text ) {
- global $wgDebugLogGroups;
- if( !isset( $wgDebugLogGroups['memcached'] ) ) {
- # Prefix message since it will end up in main debug log file
- $text = "memcached: $text";
- }
if ( substr( $text, -1 ) !== "\n" ) {
$text .= "\n";
}
wfDebugLog( 'memcached', $text );
}
}
-
diff --git a/includes/objectcache/MemcachedClient.php b/includes/objectcache/MemcachedClient.php
index 536ba6ea..0d96ed6c 100644
--- a/includes/objectcache/MemcachedClient.php
+++ b/includes/objectcache/MemcachedClient.php
@@ -99,7 +99,6 @@ class MWMemcached {
// }}}
-
/**
* Command statistics
*
@@ -242,7 +241,7 @@ class MWMemcached {
/**
* Memcache initializer
*
- * @param $args Array Associative array of settings
+ * @param array $args Associative array of settings
*
* @return mixed
*/
@@ -272,12 +271,12 @@ class MWMemcached {
* Adds a key/value to the memcache server if one isn't already set with
* that key
*
- * @param $key String: key to set with data
+ * @param string $key key to set with data
* @param $val Mixed: value to store
* @param $exp Integer: (optional) Expiration time. This can be a number of seconds
* to cache for (up to 30 days inclusive). Any timespans of 30 days + 1 second or
* longer must be the timestamp of the time at which the mapping should expire. It
- * is safe to use timestamps in all cases, regardless of exipration
+ * is safe to use timestamps in all cases, regardless of expiration
* eg: strtotime("+3 hour")
*
* @return Boolean
@@ -292,7 +291,7 @@ class MWMemcached {
/**
* Decrease a value stored on the memcache server
*
- * @param $key String: key to decrease
+ * @param string $key key to decrease
* @param $amt Integer: (optional) amount to decrease
*
* @return Mixed: FALSE on failure, value on success
@@ -307,7 +306,7 @@ class MWMemcached {
/**
* Deletes a key from the server, optionally after $time
*
- * @param $key String: key to delete
+ * @param string $key key to delete
* @param $time Integer: (optional) how long to wait before deleting
*
* @return Boolean: TRUE on success, FALSE on failure
@@ -407,11 +406,12 @@ class MWMemcached {
/**
* Retrieves the value associated with the key from the memcache server
*
- * @param $key array|string key to retrieve
+ * @param array|string $key key to retrieve
+ * @param $casToken[optional] Float
*
* @return Mixed
*/
- public function get( $key ) {
+ public function get( $key, &$casToken = null ) {
wfProfileIn( __METHOD__ );
if ( $this->_debug ) {
@@ -437,14 +437,14 @@ class MWMemcached {
$this->stats['get'] = 1;
}
- $cmd = "get $key\r\n";
+ $cmd = "gets $key\r\n";
if ( !$this->_fwrite( $sock, $cmd ) ) {
wfProfileOut( __METHOD__ );
return false;
}
$val = array();
- $this->_load_items( $sock, $val );
+ $this->_load_items( $sock, $val, $casToken );
if ( $this->_debug ) {
foreach ( $val as $k => $v ) {
@@ -466,7 +466,7 @@ class MWMemcached {
/**
* Get multiple keys from the server(s)
*
- * @param $keys Array: keys to retrieve
+ * @param array $keys keys to retrieve
*
* @return Array
*/
@@ -498,7 +498,7 @@ class MWMemcached {
$gather = array();
// Send out the requests
foreach ( $socks as $sock ) {
- $cmd = 'get';
+ $cmd = 'gets';
foreach ( $sock_keys[ intval( $sock ) ] as $key ) {
$cmd .= ' ' . $key;
}
@@ -512,7 +512,7 @@ class MWMemcached {
// Parse responses
$val = array();
foreach ( $gather as $sock ) {
- $this->_load_items( $sock, $val );
+ $this->_load_items( $sock, $val, $casToken );
}
if ( $this->_debug ) {
@@ -530,7 +530,7 @@ class MWMemcached {
/**
* Increments $key (optionally) by $amt
*
- * @param $key String: key to increment
+ * @param string $key key to increment
* @param $amt Integer: (optional) amount to increment
*
* @return Integer: null if the key does not exist yet (this does NOT
@@ -547,7 +547,7 @@ class MWMemcached {
/**
* Overwrites an existing value for key; only works if key is already set
*
- * @param $key String: key to set value as
+ * @param string $key key to set value as
* @param $value Mixed: value to store
* @param $exp Integer: (optional) Expiration time. This can be a number of seconds
* to cache for (up to 30 days inclusive). Any timespans of 30 days + 1 second or
@@ -569,7 +569,7 @@ class MWMemcached {
* output as an array (null array if no output)
*
* @param $sock Resource: socket to send command on
- * @param $cmd String: command to run
+ * @param string $cmd command to run
*
* @return Array: output array
*/
@@ -603,7 +603,7 @@ class MWMemcached {
* Unconditionally sets a key to a given value in the memcache. Returns true
* if set successfully.
*
- * @param $key String: key to set value as
+ * @param string $key key to set value as
* @param $value Mixed: value to set
* @param $exp Integer: (optional) Expiration time. This can be a number of seconds
* to cache for (up to 30 days inclusive). Any timespans of 30 days + 1 second or
@@ -618,6 +618,28 @@ class MWMemcached {
}
// }}}
+ // {{{ cas()
+
+ /**
+ * Sets a key to a given value in the memcache if the current value still corresponds
+ * to a known, given value. Returns true if set successfully.
+ *
+ * @param $casToken Float: current known value
+ * @param string $key key to set value as
+ * @param $value Mixed: value to set
+ * @param $exp Integer: (optional) Expiration time. This can be a number of seconds
+ * to cache for (up to 30 days inclusive). Any timespans of 30 days + 1 second or
+ * longer must be the timestamp of the time at which the mapping should expire. It
+ * is safe to use timestamps in all cases, regardless of exipration
+ * eg: strtotime("+3 hour")
+ *
+ * @return Boolean: TRUE on success
+ */
+ public function cas( $casToken, $key, $value, $exp = 0 ) {
+ return $this->_set( 'cas', $key, $value, $exp, $casToken );
+ }
+
+ // }}}
// {{{ set_compress_threshold()
/**
@@ -649,7 +671,7 @@ class MWMemcached {
/**
* Sets the server list to distribute key gets and puts between
*
- * @param $list Array of servers to connect to
+ * @param array $list of servers to connect to
*
* @see MWMemcached::__construct()
*/
@@ -684,7 +706,7 @@ class MWMemcached {
/**
* Close the specified socket
*
- * @param $sock String: socket to close
+ * @param string $sock socket to close
*
* @access private
*/
@@ -701,7 +723,7 @@ class MWMemcached {
* Connects $sock to $host, timing out after $timeout
*
* @param $sock Integer: socket to connect
- * @param $host String: Host:IP to connect to
+ * @param string $host Host:IP to connect to
*
* @return boolean
* @access private
@@ -743,7 +765,7 @@ class MWMemcached {
/**
* Marks a host as dead until 30-40 seconds in the future
*
- * @param $sock String: socket to mark as dead
+ * @param string $sock socket to mark as dead
*
* @access private
*/
@@ -769,7 +791,7 @@ class MWMemcached {
/**
* get_sock
*
- * @param $key String: key to retrieve value for;
+ * @param string $key key to retrieve value for;
*
* @return Mixed: resource on success, false on failure
* @access private
@@ -818,7 +840,7 @@ class MWMemcached {
/**
* Creates a hash integer based on the $key
*
- * @param $key String: key to hash
+ * @param string $key key to hash
*
* @return Integer: hash value
* @access private
@@ -836,8 +858,8 @@ class MWMemcached {
/**
* Perform increment/decriment on $key
*
- * @param $cmd String command to perform
- * @param $key String|array key to perform it on
+ * @param string $cmd command to perform
+ * @param string|array $key key to perform it on
* @param $amt Integer amount to adjust
*
* @return Integer: new value of $key
@@ -878,40 +900,78 @@ class MWMemcached {
* Load items into $ret from $sock
*
* @param $sock Resource: socket to read from
- * @param $ret Array: returned values
+ * @param array $ret returned values
+ * @param $casToken[optional] Float
* @return boolean True for success, false for failure
*
* @access private
*/
- function _load_items( $sock, &$ret ) {
+ function _load_items( $sock, &$ret, &$casToken = null ) {
+ $results = array();
+
while ( 1 ) {
$decl = $this->_fgets( $sock );
+
if( $decl === false ) {
+ /*
+ * If nothing can be read, something is wrong because we know exactly when
+ * to stop reading (right after "END") and we return right after that.
+ */
return false;
+ } elseif ( preg_match( '/^VALUE (\S+) (\d+) (\d+) (\d+)$/', $decl, $match ) ) {
+ /*
+ * Read all data returned. This can be either one or multiple values.
+ * Save all that data (in an array) to be processed later: we'll first
+ * want to continue reading until "END" before doing anything else,
+ * to make sure that we don't leave our client in a state where it's
+ * output is not yet fully read.
+ */
+ $results[] = array(
+ $match[1], // rkey
+ $match[2], // flags
+ $match[3], // len
+ $match[4], // casToken
+ $this->_fread( $sock, $match[3] + 2 ), // data
+ );
} elseif ( $decl == "END" ) {
- return true;
- } elseif ( preg_match( '/^VALUE (\S+) (\d+) (\d+)$/', $decl, $match ) ) {
- list( $rkey, $flags, $len ) = array( $match[1], $match[2], $match[3] );
- $data = $this->_fread( $sock, $len + 2 );
- if ( $data === false ) {
- return false;
- }
- if ( substr( $data, -2 ) !== "\r\n" ) {
- $this->_handle_error( $sock,
- 'line ending missing from data block from $1' );
+ if ( count( $results ) == 0 ) {
return false;
}
- $data = substr( $data, 0, -2 );
- $ret[$rkey] = $data;
- if ( $this->_have_zlib && $flags & self::COMPRESSED ) {
- $ret[$rkey] = gzuncompress( $ret[$rkey] );
- }
+ /**
+ * All data has been read, time to process the data and build
+ * meaningful return values.
+ */
+ foreach ( $results as $vars ) {
+ list( $rkey, $flags, $len, $casToken, $data ) = $vars;
+
+ if ( $data === false || substr( $data, -2 ) !== "\r\n" ) {
+ $this->_handle_error( $sock,
+ 'line ending missing from data block from $1' );
+ return false;
+ }
+ $data = substr( $data, 0, -2 );
+ $ret[$rkey] = $data;
+
+ if ( $this->_have_zlib && $flags & self::COMPRESSED ) {
+ $ret[$rkey] = gzuncompress( $ret[$rkey] );
+ }
- if ( $flags & self::SERIALIZED ) {
- $ret[$rkey] = unserialize( $ret[$rkey] );
+ /*
+ * This unserialize is the exact reason that we only want to
+ * process data after having read until "END" (instead of doing
+ * this right away): "unserialize" can trigger outside code:
+ * in the event that $ret[$rkey] is a serialized object,
+ * unserializing it will trigger __wakeup() if present. If that
+ * function attempted to read from memcached (while we did not
+ * yet read "END"), these 2 calls would collide.
+ */
+ if ( $flags & self::SERIALIZED ) {
+ $ret[$rkey] = unserialize( $ret[$rkey] );
+ }
}
+ return true;
} else {
$this->_handle_error( $sock, 'Error parsing response from $1' );
return false;
@@ -925,19 +985,20 @@ class MWMemcached {
/**
* Performs the requested storage operation to the memcache server
*
- * @param $cmd String: command to perform
- * @param $key String: key to act on
+ * @param string $cmd command to perform
+ * @param string $key key to act on
* @param $val Mixed: what we need to store
* @param $exp Integer: (optional) Expiration time. This can be a number of seconds
* to cache for (up to 30 days inclusive). Any timespans of 30 days + 1 second or
* longer must be the timestamp of the time at which the mapping should expire. It
* is safe to use timestamps in all cases, regardless of exipration
* eg: strtotime("+3 hour")
+ * @param $casToken[optional] Float
*
* @return Boolean
* @access private
*/
- function _set( $cmd, $key, $val, $exp ) {
+ function _set( $cmd, $key, $val, $exp, $casToken = null ) {
if ( !$this->_active ) {
return false;
}
@@ -966,7 +1027,7 @@ class MWMemcached {
$len = strlen( $val );
if ( $this->_have_zlib && $this->_compress_enable &&
- $this->_compress_threshold && $len >= $this->_compress_threshold )
+ $this->_compress_threshold && $len >= $this->_compress_threshold )
{
$c_val = gzcompress( $val, 9 );
$c_len = strlen( $c_val );
@@ -980,7 +1041,13 @@ class MWMemcached {
$flags |= self::COMPRESSED;
}
}
- if ( !$this->_fwrite( $sock, "$cmd $key $flags $exp $len\r\n$val\r\n" ) ) {
+
+ $command = "$cmd $key $flags $exp $len";
+ if ( $casToken ) {
+ $command .= " $casToken";
+ }
+
+ if ( !$this->_fwrite( $sock, "$command\r\n$val\r\n" ) ) {
return false;
}
@@ -1001,7 +1068,7 @@ class MWMemcached {
/**
* Returns the socket for the host
*
- * @param $host String: Host:IP to get socket for
+ * @param string $host Host:IP to get socket for
*
* @return Mixed: IO Stream or false
* @access private
@@ -1036,11 +1103,6 @@ class MWMemcached {
* @param $text string
*/
function _debugprint( $text ) {
- global $wgDebugLogGroups;
- if( !isset( $wgDebugLogGroups['memcached'] ) ) {
- # Prefix message since it will end up in main debug log file
- $text = "memcached: $text";
- }
wfDebugLog( 'memcached', $text );
}
@@ -1096,7 +1158,7 @@ class MWMemcached {
}
/**
- * Read the specified number of bytes from a stream. If there is an error,
+ * Read the specified number of bytes from a stream. If there is an error,
* mark the socket dead.
*
* @param $sock The socket
@@ -1137,7 +1199,7 @@ class MWMemcached {
function _fgets( $sock ) {
$result = fgets( $sock );
// fgets() may return a partial line if there is a select timeout after
- // a successful recv(), so we have to check for a timeout even if we
+ // a successful recv(), so we have to check for a timeout even if we
// got a string response.
$data = stream_get_meta_data( $sock );
if ( $data['timed_out'] ) {
@@ -1167,10 +1229,16 @@ class MWMemcached {
if ( !is_resource( $f ) ) {
return;
}
- $n = stream_select( $r = array( $f ), $w = null, $e = null, 0, 0 );
+ $r = array( $f );
+ $w = null;
+ $e = null;
+ $n = stream_select( $r, $w, $e, 0, 0 );
while ( $n == 1 && !feof( $f ) ) {
fread( $f, 1024 );
- $n = stream_select( $r = array( $f ), $w = null, $e = null, 0, 0 );
+ $r = array( $f );
+ $w = null;
+ $e = null;
+ $n = stream_select( $r, $w, $e, 0, 0 );
}
}
@@ -1179,7 +1247,6 @@ class MWMemcached {
// }}}
}
-
// }}}
class MemCachedClientforWiki extends MWMemcached {
diff --git a/includes/objectcache/MemcachedPeclBagOStuff.php b/includes/objectcache/MemcachedPeclBagOStuff.php
index 76886ebb..31924293 100644
--- a/includes/objectcache/MemcachedPeclBagOStuff.php
+++ b/includes/objectcache/MemcachedPeclBagOStuff.php
@@ -47,7 +47,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
if ( $params['persistent'] ) {
// The pool ID must be unique to the server/option combination.
// The Memcached object is essentially shared for each pool ID.
- // We can only resuse a pool ID if we keep the config consistent.
+ // We can only reuse a pool ID if we keep the config consistent.
$this->client = new Memcached( md5( serialize( $params ) ) );
if ( count( $this->client->getServerList() ) ) {
wfDebug( __METHOD__ . ": persistent Memcached object already loaded.\n" );
@@ -104,11 +104,16 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
/**
* @param $key string
+ * @param $casToken[optional] float
* @return Mixed
*/
- public function get( $key ) {
+ public function get( $key, &$casToken = null ) {
+ wfProfileIn( __METHOD__ );
$this->debugLog( "get($key)" );
- return $this->checkResult( $key, parent::get( $key ) );
+ $result = $this->client->get( $this->encodeKey( $key ), null, $casToken );
+ $result = $this->checkResult( $key, $result );
+ wfProfileOut( __METHOD__ );
+ return $result;
}
/**
@@ -123,6 +128,18 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
}
/**
+ * @param $casToken float
+ * @param $key string
+ * @param $value
+ * @param $exptime int
+ * @return bool
+ */
+ public function cas( $casToken, $key, $value, $exptime = 0 ) {
+ $this->debugLog( "cas($key)" );
+ return $this->checkResult( $key, parent::cas( $casToken, $key, $value, $exptime ) );
+ }
+
+ /**
* @param $key string
* @param $time int
* @return bool
@@ -189,7 +206,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
* the client, but some day we might find a case where it should be
* different.
*
- * @param $key string The key used by the caller, or false if there wasn't one.
+ * @param string $key The key used by the caller, or false if there wasn't one.
* @param $result Mixed The return value
* @return Mixed
*/
@@ -224,9 +241,11 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
* @return Array
*/
public function getMulti( array $keys ) {
+ wfProfileIn( __METHOD__ );
$this->debugLog( 'getMulti(' . implode( ', ', $keys ) . ')' );
$callback = array( $this, 'encodeKey' );
$result = $this->client->getMulti( array_map( $callback, $keys ) );
+ wfProfileOut( __METHOD__ );
return $this->checkResult( false, $result );
}
diff --git a/includes/objectcache/MemcachedPhpBagOStuff.php b/includes/objectcache/MemcachedPhpBagOStuff.php
index a46dc716..33a134c7 100644
--- a/includes/objectcache/MemcachedPhpBagOStuff.php
+++ b/includes/objectcache/MemcachedPhpBagOStuff.php
@@ -81,7 +81,7 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
public function unlock( $key ) {
return $this->client->unlock( $this->encodeKey( $key ) );
}
-
+
/**
* @param $key string
* @param $value int
@@ -100,4 +100,3 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
return $this->client->decr( $this->encodeKey( $key ), $value );
}
}
-
diff --git a/includes/objectcache/MultiWriteBagOStuff.php b/includes/objectcache/MultiWriteBagOStuff.php
index e496ddd8..92afaacd 100644
--- a/includes/objectcache/MultiWriteBagOStuff.php
+++ b/includes/objectcache/MultiWriteBagOStuff.php
@@ -22,8 +22,8 @@
*/
/**
- * A cache class that replicates all writes to multiple child caches. Reads
- * are implemented by reading from the caches in the order they are given in
+ * A cache class that replicates all writes to multiple child caches. Reads
+ * are implemented by reading from the caches in the order they are given in
* the configuration until a cache gives a positive result.
*
* @ingroup Cache
@@ -61,9 +61,10 @@ class MultiWriteBagOStuff extends BagOStuff {
/**
* @param $key string
+ * @param $casToken[optional] mixed
* @return bool|mixed
*/
- public function get( $key ) {
+ public function get( $key, &$casToken = null ) {
foreach ( $this->caches as $cache ) {
$value = $cache->get( $key );
if ( $value !== false ) {
@@ -74,6 +75,17 @@ class MultiWriteBagOStuff extends BagOStuff {
}
/**
+ * @param $casToken mixed
+ * @param $key string
+ * @param $value mixed
+ * @param $exptime int
+ * @return bool
+ */
+ public function cas( $casToken, $key, $value, $exptime = 0 ) {
+ throw new MWException( "CAS is not implemented in " . __CLASS__ );
+ }
+
+ /**
* @param $key string
* @param $value mixed
* @param $exptime int
@@ -157,6 +169,17 @@ class MultiWriteBagOStuff extends BagOStuff {
}
/**
+ * @param $key string
+ * @param $callback closure Callback method to be executed
+ * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+ * @param int $attempts The amount of times to attempt a merge in case of failure
+ * @return bool success
+ */
+ public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+ return $this->doWrite( 'merge', $key, $callback, $exptime );
+ }
+
+ /**
* @param $method string
* @return bool
*/
diff --git a/includes/objectcache/ObjectCache.php b/includes/objectcache/ObjectCache.php
index 9b360f32..eafa836a 100644
--- a/includes/objectcache/ObjectCache.php
+++ b/includes/objectcache/ObjectCache.php
@@ -123,7 +123,7 @@ class ObjectCache {
* @return ObjectCache
*/
static function newAccelerator( $params ) {
- if ( function_exists( 'apc_fetch') ) {
+ if ( function_exists( 'apc_fetch' ) ) {
$id = 'apc';
} elseif( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) {
$id = 'xcache';
@@ -139,9 +139,9 @@ class ObjectCache {
/**
* Factory function that creates a memcached client object.
*
- * This always uses the PHP client, since the PECL client has a different
- * hashing scheme and a different interpretation of the flags bitfield, so
- * switching between the two clients randomly would be disasterous.
+ * This always uses the PHP client, since the PECL client has a different
+ * hashing scheme and a different interpretation of the flags bitfield, so
+ * switching between the two clients randomly would be disastrous.
*
* @param $params array
*
diff --git a/includes/objectcache/ObjectCacheSessionHandler.php b/includes/objectcache/ObjectCacheSessionHandler.php
index f55da94d..bc76294a 100644
--- a/includes/objectcache/ObjectCacheSessionHandler.php
+++ b/includes/objectcache/ObjectCacheSessionHandler.php
@@ -58,7 +58,7 @@ class ObjectCacheSessionHandler {
/**
* Get a cache key for the given session id.
*
- * @param $id String: session id
+ * @param string $id session id
* @return String: cache key
*/
static function getKey( $id ) {
@@ -89,7 +89,7 @@ class ObjectCacheSessionHandler {
/**
* Callback when reading session data.
*
- * @param $id String: session id
+ * @param string $id session id
* @return Mixed: session data
*/
static function read( $id ) {
@@ -103,7 +103,7 @@ class ObjectCacheSessionHandler {
/**
* Callback when writing session data.
*
- * @param $id String: session id
+ * @param string $id session id
* @param $data Mixed: session data
* @return Boolean: success
*/
@@ -116,7 +116,7 @@ class ObjectCacheSessionHandler {
/**
* Callback to destroy a session when calling session_destroy().
*
- * @param $id String: session id
+ * @param string $id session id
* @return Boolean: success
*/
static function destroy( $id ) {
diff --git a/includes/objectcache/RedisBagOStuff.php b/includes/objectcache/RedisBagOStuff.php
index c5966cdb..f9feaf9d 100644
--- a/includes/objectcache/RedisBagOStuff.php
+++ b/includes/objectcache/RedisBagOStuff.php
@@ -20,29 +20,13 @@
* @file
*/
-
class RedisBagOStuff extends BagOStuff {
- protected $connectTimeout, $persistent, $password, $automaticFailover;
-
- /**
- * A list of server names, from $params['servers']
- */
+ /** @var RedisConnectionPool */
+ protected $redisPool;
+ /** @var Array List of server names */
protected $servers;
-
- /**
- * A cache of Redis objects, representing connections to Redis servers.
- * The key is the server name.
- */
- protected $conns = array();
-
- /**
- * An array listing "dead" servers which have had a connection error in
- * the past. Servers are marked dead for a limited period of time, to
- * avoid excessive overhead from repeated connection timeouts. The key in
- * the array is the server name, the value is the UNIX timestamp at which
- * the server is resurrected.
- */
- protected $deadServers = array();
+ /** @var bool */
+ protected $automaticFailover;
/**
* Construct a RedisBagOStuff object. Parameters are:
@@ -71,18 +55,15 @@ class RedisBagOStuff extends BagOStuff {
* flap, for example if it is in swap death.
*/
function __construct( $params ) {
- if ( !extension_loaded( 'redis' ) ) {
- throw new MWException( __CLASS__. ' requires the phpredis extension: ' .
- 'https://github.com/nicolasff/phpredis' );
+ $redisConf = array( 'serializer' => 'php' );
+ foreach ( array( 'connectTimeout', 'persistent', 'password' ) as $opt ) {
+ if ( isset( $params[$opt] ) ) {
+ $redisConf[$opt] = $params[$opt];
+ }
}
+ $this->redisPool = RedisConnectionPool::singleton( $redisConf );
$this->servers = $params['servers'];
- $this->connectTimeout = isset( $params['connectTimeout'] )
- ? $params['connectTimeout'] : 1;
- $this->persistent = !empty( $params['persistent'] );
- if ( isset( $params['password'] ) ) {
- $this->password = $params['password'];
- }
if ( isset( $params['automaticFailover'] ) ) {
$this->automaticFailover = $params['automaticFailover'];
} else {
@@ -90,7 +71,7 @@ class RedisBagOStuff extends BagOStuff {
}
}
- public function get( $key ) {
+ public function get( $key, &$casToken = null ) {
wfProfileIn( __METHOD__ );
list( $server, $conn ) = $this->getConnection( $key );
if ( !$conn ) {
@@ -101,8 +82,9 @@ class RedisBagOStuff extends BagOStuff {
$result = $conn->get( $key );
} catch ( RedisException $e ) {
$result = false;
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
+ $casToken = $result;
$this->logRequest( 'get', $key, $server, $result );
wfProfileOut( __METHOD__ );
return $result;
@@ -125,7 +107,7 @@ class RedisBagOStuff extends BagOStuff {
}
} catch ( RedisException $e ) {
$result = false;
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
$this->logRequest( 'set', $key, $server, $result );
@@ -133,6 +115,42 @@ class RedisBagOStuff extends BagOStuff {
return $result;
}
+ public function cas( $casToken, $key, $value, $expiry = 0 ) {
+ wfProfileIn( __METHOD__ );
+ list( $server, $conn ) = $this->getConnection( $key );
+ if ( !$conn ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+ $expiry = $this->convertToRelative( $expiry );
+ try {
+ $conn->watch( $key );
+
+ if ( $this->get( $key ) !== $casToken ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ $conn->multi();
+
+ if ( !$expiry ) {
+ // No expiry, that is very different from zero expiry in Redis
+ $conn->set( $key, $value );
+ } else {
+ $conn->setex( $key, $expiry, $value );
+ }
+
+ $result = $conn->exec();
+ } catch ( RedisException $e ) {
+ $result = false;
+ $this->handleException( $server, $conn, $e );
+ }
+
+ $this->logRequest( 'cas', $key, $server, $result );
+ wfProfileOut( __METHOD__ );
+ return $result;
+ }
+
public function delete( $key, $time = 0 ) {
wfProfileIn( __METHOD__ );
list( $server, $conn ) = $this->getConnection( $key );
@@ -146,7 +164,7 @@ class RedisBagOStuff extends BagOStuff {
$result = true;
} catch ( RedisException $e ) {
$result = false;
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
$this->logRequest( 'delete', $key, $server, $result );
wfProfileOut( __METHOD__ );
@@ -184,7 +202,7 @@ class RedisBagOStuff extends BagOStuff {
}
}
} catch ( RedisException $e ) {
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
}
@@ -209,7 +227,7 @@ class RedisBagOStuff extends BagOStuff {
}
} catch ( RedisException $e ) {
$result = false;
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
$this->logRequest( 'add', $key, $server, $result );
wfProfileOut( __METHOD__ );
@@ -241,7 +259,7 @@ class RedisBagOStuff extends BagOStuff {
}
} catch ( RedisException $e ) {
$result = false;
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
$this->logRequest( 'replace', $key, $server, $result );
@@ -273,7 +291,7 @@ class RedisBagOStuff extends BagOStuff {
$result = $conn->incrBy( $key, $value );
} catch ( RedisException $e ) {
$result = false;
- $this->handleException( $server, $e );
+ $this->handleException( $server, $conn, $e );
}
$this->logRequest( 'incr', $key, $server, $result );
@@ -283,27 +301,21 @@ class RedisBagOStuff extends BagOStuff {
/**
* Get a Redis object with a connection suitable for fetching the specified key
+ * @return Array (server, RedisConnRef) or (false, false)
*/
protected function getConnection( $key ) {
if ( count( $this->servers ) === 1 ) {
$candidates = $this->servers;
} else {
- // Use consistent hashing
- $hashes = array();
- foreach ( $this->servers as $server ) {
- $hashes[$server] = md5( $server . '/' . $key );
- }
- asort( $hashes );
+ $candidates = $this->servers;
+ ArrayUtils::consistentHashSort( $candidates, $key, '/' );
if ( !$this->automaticFailover ) {
- reset( $hashes );
- $candidates = array( key( $hashes ) );
- } else {
- $candidates = array_keys( $hashes );
+ $candidates = array_slice( $candidates, 0, 1 );
}
}
foreach ( $candidates as $server ) {
- $conn = $this->getConnectionToServer( $server );
+ $conn = $this->redisPool->getConnection( $server );
if ( $conn ) {
return array( $server, $conn );
}
@@ -312,79 +324,6 @@ class RedisBagOStuff extends BagOStuff {
}
/**
- * Get a connection to the server with the specified name. Connections
- * are cached, and failures are persistent to avoid multiple timeouts.
- *
- * @return Redis object, or false on failure
- */
- protected function getConnectionToServer( $server ) {
- if ( isset( $this->deadServers[$server] ) ) {
- $now = time();
- if ( $now > $this->deadServers[$server] ) {
- // Dead time expired
- unset( $this->deadServers[$server] );
- } else {
- // Server is dead
- $this->debug( "server $server is marked down for another " .
- ($this->deadServers[$server] - $now ) .
- " seconds, can't get connection" );
- return false;
- }
- }
-
- if ( isset( $this->conns[$server] ) ) {
- return $this->conns[$server];
- }
-
- if ( substr( $server, 0, 1 ) === '/' ) {
- // UNIX domain socket
- // These are required by the redis extension to start with a slash, but
- // we still need to set the port to a special value to make it work.
- $host = $server;
- $port = 0;
- } else {
- // TCP connection
- $hostPort = IP::splitHostAndPort( $server );
- if ( !$hostPort ) {
- throw new MWException( __CLASS__.": invalid configured server \"$server\"" );
- }
- list( $host, $port ) = $hostPort;
- if ( $port === false ) {
- $port = 6379;
- }
- }
- $conn = new Redis;
- try {
- if ( $this->persistent ) {
- $this->debug( "opening persistent connection to $host:$port" );
- $result = $conn->pconnect( $host, $port, $this->connectTimeout );
- } else {
- $this->debug( "opening non-persistent connection to $host:$port" );
- $result = $conn->connect( $host, $port, $this->connectTimeout );
- }
- if ( !$result ) {
- $this->logError( "could not connect to server $server" );
- // Mark server down for 30s to avoid further timeouts
- $this->deadServers[$server] = time() + 30;
- return false;
- }
- if ( $this->password !== null ) {
- if ( !$conn->auth( $this->password ) ) {
- $this->logError( "authentication error connecting to $server" );
- }
- }
- } catch ( RedisException $e ) {
- $this->deadServers[$server] = time() + 30;
- wfDebugLog( 'redis', "Redis exception: " . $e->getMessage() . "\n" );
- return false;
- }
-
- $conn->setOption( Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP );
- $this->conns[$server] = $conn;
- return $conn;
- }
-
- /**
* Log a fatal error
*/
protected function logError( $msg ) {
@@ -397,9 +336,8 @@ class RedisBagOStuff extends BagOStuff {
* not. The safest response for us is to explicitly destroy the connection
* object and let it be reopened during the next request.
*/
- protected function handleException( $server, $e ) {
- wfDebugLog( 'redis', "Redis exception on server $server: " . $e->getMessage() . "\n" );
- unset( $this->conns[$server] );
+ protected function handleException( $server, RedisConnRef $conn, $e ) {
+ $this->redisPool->handleException( $server, $conn, $e );
}
/**
@@ -410,4 +348,3 @@ class RedisBagOStuff extends BagOStuff {
( $result === false ? "failure" : "success" ) );
}
}
-
diff --git a/includes/objectcache/SqlBagOStuff.php b/includes/objectcache/SqlBagOStuff.php
index 54051dc1..87f787d8 100644
--- a/includes/objectcache/SqlBagOStuff.php
+++ b/includes/objectcache/SqlBagOStuff.php
@@ -32,23 +32,26 @@ class SqlBagOStuff extends BagOStuff {
*/
var $lb;
- /**
- * @var DatabaseBase
- */
- var $db;
- var $serverInfo;
+ var $serverInfos;
+ var $serverNames;
+ var $numServers;
+ var $conns;
var $lastExpireAll = 0;
var $purgePeriod = 100;
var $shards = 1;
var $tableName = 'objectcache';
- protected $connFailureTime = 0; // UNIX timestamp
- protected $connFailureError; // exception
+ protected $connFailureTimes = array(); // UNIX timestamps
+ protected $connFailureErrors = array(); // exceptions
/**
* Constructor. Parameters are:
- * - server: A server info structure in the format required by each
- * element in $wgDBServers.
+ * - server: A server info structure in the format required by each
+ * element in $wgDBServers.
+ *
+ * - servers: An array of server info structures describing a set of
+ * database servers to distribute keys to. If this is
+ * specified, the "server" option will be ignored.
*
* - purgePeriod: The average number of object cache requests in between
* garbage collection operations, where expired entries
@@ -59,8 +62,8 @@ class SqlBagOStuff extends BagOStuff {
*
* - tableName: The table name to use, default is "objectcache".
*
- * - shards: The number of tables to use for data storage. If this is
- * more than 1, table names will be formed in the style
+ * - shards: The number of tables to use for data storage on each server.
+ * If this is more than 1, table names will be formed in the style
* objectcacheNNN where NNN is the shard index, between 0 and
* shards-1. The number of digits will be the minimum number
* required to hold the largest shard index. Data will be
@@ -70,9 +73,19 @@ class SqlBagOStuff extends BagOStuff {
* @param $params array
*/
public function __construct( $params ) {
- if ( isset( $params['server'] ) ) {
- $this->serverInfo = $params['server'];
- $this->serverInfo['load'] = 1;
+ if ( isset( $params['servers'] ) ) {
+ $this->serverInfos = $params['servers'];
+ $this->numServers = count( $this->serverInfos );
+ $this->serverNames = array();
+ foreach ( $this->serverInfos as $i => $info ) {
+ $this->serverNames[$i] = isset( $info['host'] ) ? $info['host'] : "#$i";
+ }
+ } elseif ( isset( $params['server'] ) ) {
+ $this->serverInfos = array( $params['server'] );
+ $this->numServers = count( $this->serverInfos );
+ } else {
+ $this->serverInfos = false;
+ $this->numServers = 1;
}
if ( isset( $params['purgePeriod'] ) ) {
$this->purgePeriod = intval( $params['purgePeriod'] );
@@ -86,60 +99,81 @@ class SqlBagOStuff extends BagOStuff {
}
/**
+ * Get a connection to the specified database
+ *
+ * @param $serverIndex integer
* @return DatabaseBase
*/
- protected function getDB() {
+ protected function getDB( $serverIndex ) {
global $wgDebugDBTransactions;
- # Don't keep timing out trying to connect for each call if the DB is down
- if ( $this->connFailureError && ( time() - $this->connFailureTime ) < 60 ) {
- throw $this->connFailureError;
- }
+ if ( !isset( $this->conns[$serverIndex] ) ) {
+ if ( $serverIndex >= $this->numServers ) {
+ throw new MWException( __METHOD__ . ": Invalid server index \"$serverIndex\"" );
+ }
+
+ # Don't keep timing out trying to connect for each call if the DB is down
+ if ( isset( $this->connFailureErrors[$serverIndex] )
+ && ( time() - $this->connFailureTimes[$serverIndex] ) < 60 )
+ {
+ throw $this->connFailureErrors[$serverIndex];
+ }
- if ( !isset( $this->db ) ) {
# If server connection info was given, use that
- if ( $this->serverInfo ) {
+ if ( $this->serverInfos ) {
if ( $wgDebugDBTransactions ) {
- wfDebug( sprintf( "Using provided serverInfo for SqlBagOStuff\n" ) );
+ wfDebug( "Using provided serverInfo for SqlBagOStuff\n" );
}
- $this->lb = new LoadBalancer( array(
- 'servers' => array( $this->serverInfo ) ) );
- $this->db = $this->lb->getConnection( DB_MASTER );
- $this->db->clearFlag( DBO_TRX );
+ $info = $this->serverInfos[$serverIndex];
+ $type = isset( $info['type'] ) ? $info['type'] : 'mysql';
+ $host = isset( $info['host'] ) ? $info['host'] : '[unknown]';
+ wfDebug( __CLASS__ . ": connecting to $host\n" );
+ $db = DatabaseBase::factory( $type, $info );
+ $db->clearFlag( DBO_TRX );
} else {
/*
* We must keep a separate connection to MySQL in order to avoid deadlocks
- * However, SQLite has an opposite behaviour. And PostgreSQL needs to know
+ * However, SQLite has an opposite behavior. And PostgreSQL needs to know
* if we are in transaction or no
*/
if ( wfGetDB( DB_MASTER )->getType() == 'mysql' ) {
$this->lb = wfGetLBFactory()->newMainLB();
- $this->db = $this->lb->getConnection( DB_MASTER );
- $this->db->clearFlag( DBO_TRX ); // auto-commit mode
+ $db = $this->lb->getConnection( DB_MASTER );
+ $db->clearFlag( DBO_TRX ); // auto-commit mode
} else {
- $this->db = wfGetDB( DB_MASTER );
+ $db = wfGetDB( DB_MASTER );
}
}
if ( $wgDebugDBTransactions ) {
- wfDebug( sprintf( "Connection %s will be used for SqlBagOStuff\n", $this->db ) );
+ wfDebug( sprintf( "Connection %s will be used for SqlBagOStuff\n", $db ) );
}
+ $this->conns[$serverIndex] = $db;
}
- return $this->db;
+ return $this->conns[$serverIndex];
}
/**
- * Get the table name for a given key
+ * Get the server index and table name for a given key
* @param $key string
- * @return string
+ * @return Array: server index and table name
*/
protected function getTableByKey( $key ) {
if ( $this->shards > 1 ) {
$hash = hexdec( substr( md5( $key ), 0, 8 ) ) & 0x7fffffff;
- return $this->getTableByShard( $hash % $this->shards );
+ $tableIndex = $hash % $this->shards;
} else {
- return $this->tableName;
+ $tableIndex = 0;
+ }
+ if ( $this->numServers > 1 ) {
+ $sortedServers = $this->serverNames;
+ ArrayUtils::consistentHashSort( $sortedServers, $key );
+ reset( $sortedServers );
+ $serverIndex = key( $sortedServers );
+ } else {
+ $serverIndex = 0;
}
+ return array( $serverIndex, $this->getTableNameByShard( $tableIndex ) );
}
/**
@@ -147,7 +181,7 @@ class SqlBagOStuff extends BagOStuff {
* @param $index int
* @return string
*/
- protected function getTableByShard( $index ) {
+ protected function getTableNameByShard( $index ) {
if ( $this->shards > 1 ) {
$decimals = strlen( $this->shards - 1 );
return $this->tableName .
@@ -159,11 +193,16 @@ class SqlBagOStuff extends BagOStuff {
/**
* @param $key string
+ * @param $casToken[optional] mixed
* @return mixed
*/
- public function get( $key ) {
+ public function get( $key, &$casToken = null ) {
$values = $this->getMulti( array( $key ) );
- return array_key_exists( $key, $values ) ? $values[$key] : false;
+ if ( array_key_exists( $key, $values ) ) {
+ $casToken = $values[$key];
+ return $values[$key];
+ }
+ return false;
}
/**
@@ -173,59 +212,61 @@ class SqlBagOStuff extends BagOStuff {
public function getMulti( array $keys ) {
$values = array(); // array of (key => value)
- try {
- $db = $this->getDB();
- $keysByTableName = array();
- foreach ( $keys as $key ) {
- $tableName = $this->getTableByKey( $key );
- if ( !isset( $keysByTableName[$tableName] ) ) {
- $keysByTableName[$tableName] = array();
- }
- $keysByTableName[$tableName][] = $key;
- }
+ $keysByTable = array();
+ foreach ( $keys as $key ) {
+ list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
+ $keysByTable[$serverIndex][$tableName][] = $key;
+ }
- $this->garbageCollect(); // expire old entries if any
+ $this->garbageCollect(); // expire old entries if any
- $dataRows = array();
- foreach ( $keysByTableName as $tableName => $tableKeys ) {
- $res = $db->select( $tableName,
- array( 'keyname', 'value', 'exptime' ),
- array( 'keyname' => $tableKeys ),
- __METHOD__ );
- foreach ( $res as $row ) {
- $dataRows[$row->keyname] = $row;
+ $dataRows = array();
+ foreach ( $keysByTable as $serverIndex => $serverKeys ) {
+ $db = $this->getDB( $serverIndex );
+ try {
+ foreach ( $serverKeys as $tableName => $tableKeys ) {
+ $res = $db->select( $tableName,
+ array( 'keyname', 'value', 'exptime' ),
+ array( 'keyname' => $tableKeys ),
+ __METHOD__ );
+ foreach ( $res as $row ) {
+ $row->serverIndex = $serverIndex;
+ $row->tableName = $tableName;
+ $dataRows[$row->keyname] = $row;
+ }
}
+ } catch ( DBError $e ) {
+ $this->handleReadError( $e, $serverIndex );
}
+ }
- foreach ( $keys as $key ) {
- if ( isset( $dataRows[$key] ) ) { // HIT?
- $row = $dataRows[$key];
- $this->debug( "get: retrieved data; expiry time is " . $row->exptime );
- if ( $this->isExpired( $row->exptime ) ) { // MISS
- $this->debug( "get: key has expired, deleting" );
- try {
- $db->begin( __METHOD__ );
- # Put the expiry time in the WHERE condition to avoid deleting a
- # newly-inserted value
- $db->delete( $this->getTableByKey( $key ),
- array( 'keyname' => $key, 'exptime' => $row->exptime ),
- __METHOD__ );
- $db->commit( __METHOD__ );
- } catch ( DBQueryError $e ) {
- $this->handleWriteError( $e );
- }
- $values[$key] = false;
- } else { // HIT
- $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
+ foreach ( $keys as $key ) {
+ if ( isset( $dataRows[$key] ) ) { // HIT?
+ $row = $dataRows[$key];
+ $this->debug( "get: retrieved data; expiry time is " . $row->exptime );
+ $db = $this->getDB( $row->serverIndex );
+ if ( $this->isExpired( $db, $row->exptime ) ) { // MISS
+ $this->debug( "get: key has expired, deleting" );
+ try {
+ $db->begin( __METHOD__ );
+ # Put the expiry time in the WHERE condition to avoid deleting a
+ # newly-inserted value
+ $db->delete( $row->tableName,
+ array( 'keyname' => $key, 'exptime' => $row->exptime ),
+ __METHOD__ );
+ $db->commit( __METHOD__ );
+ } catch ( DBQueryError $e ) {
+ $this->handleWriteError( $e, $row->serverIndex );
}
- } else { // MISS
$values[$key] = false;
- $this->debug( 'get: no matching rows' );
+ } else { // HIT
+ $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
}
+ } else { // MISS
+ $values[$key] = false;
+ $this->debug( 'get: no matching rows' );
}
- } catch ( DBError $e ) {
- $this->handleReadError( $e );
- };
+ }
return $values;
}
@@ -237,8 +278,9 @@ class SqlBagOStuff extends BagOStuff {
* @return bool
*/
public function set( $key, $value, $exptime = 0 ) {
+ list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
try {
- $db = $this->getDB();
+ $db = $this->getDB( $serverIndex );
$exptime = intval( $exptime );
if ( $exptime < 0 ) {
@@ -246,7 +288,7 @@ class SqlBagOStuff extends BagOStuff {
}
if ( $exptime == 0 ) {
- $encExpiry = $this->getMaxDateTime();
+ $encExpiry = $this->getMaxDateTime( $db );
} else {
if ( $exptime < 3.16e8 ) { # ~10 years
$exptime += time();
@@ -258,7 +300,7 @@ class SqlBagOStuff extends BagOStuff {
// (bug 24425) use a replace if the db supports it instead of
// delete/insert to avoid clashes with conflicting keynames
$db->replace(
- $this->getTableByKey( $key ),
+ $tableName,
array( 'keyname' ),
array(
'keyname' => $key,
@@ -267,7 +309,7 @@ class SqlBagOStuff extends BagOStuff {
), __METHOD__ );
$db->commit( __METHOD__ );
} catch ( DBError $e ) {
- $this->handleWriteError( $e );
+ $this->handleWriteError( $e, $serverIndex );
return false;
}
@@ -275,21 +317,73 @@ class SqlBagOStuff extends BagOStuff {
}
/**
+ * @param $casToken mixed
+ * @param $key string
+ * @param $value mixed
+ * @param $exptime int
+ * @return bool
+ */
+ public function cas( $casToken, $key, $value, $exptime = 0 ) {
+ list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
+ try {
+ $db = $this->getDB( $serverIndex );
+ $exptime = intval( $exptime );
+
+ 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 );
+ }
+ $db->begin( __METHOD__ );
+ // (bug 24425) use a replace if the db supports it instead of
+ // delete/insert to avoid clashes with conflicting keynames
+ $db->update(
+ $tableName,
+ array(
+ 'keyname' => $key,
+ 'value' => $db->encodeBlob( $this->serialize( $value ) ),
+ 'exptime' => $encExpiry
+ ),
+ array(
+ 'keyname' => $key,
+ 'value' => $db->encodeBlob( $this->serialize( $casToken ) )
+ ),
+ __METHOD__
+ );
+ $db->commit( __METHOD__ );
+ } catch ( DBQueryError $e ) {
+ $this->handleWriteError( $e, $serverIndex );
+
+ return false;
+ }
+
+ return (bool) $db->affectedRows();
+ }
+
+ /**
* @param $key string
* @param $time int
* @return bool
*/
public function delete( $key, $time = 0 ) {
+ list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
try {
- $db = $this->getDB();
+ $db = $this->getDB( $serverIndex );
$db->begin( __METHOD__ );
$db->delete(
- $this->getTableByKey( $key ),
+ $tableName,
array( 'keyname' => $key ),
__METHOD__ );
$db->commit( __METHOD__ );
} catch ( DBError $e ) {
- $this->handleWriteError( $e );
+ $this->handleWriteError( $e, $serverIndex );
return false;
}
@@ -302,9 +396,9 @@ class SqlBagOStuff extends BagOStuff {
* @return int|null
*/
public function incr( $key, $step = 1 ) {
+ list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
try {
- $db = $this->getDB();
- $tableName = $this->getTableByKey( $key );
+ $db = $this->getDB( $serverIndex );
$step = intval( $step );
$db->begin( __METHOD__ );
$row = $db->selectRow(
@@ -320,7 +414,7 @@ class SqlBagOStuff extends BagOStuff {
return null;
}
$db->delete( $tableName, array( 'keyname' => $key ), __METHOD__ );
- if ( $this->isExpired( $row->exptime ) ) {
+ if ( $this->isExpired( $db, $row->exptime ) ) {
// Expired, do not reinsert
$db->commit( __METHOD__ );
@@ -342,7 +436,7 @@ class SqlBagOStuff extends BagOStuff {
}
$db->commit( __METHOD__ );
} catch ( DBError $e ) {
- $this->handleWriteError( $e );
+ $this->handleWriteError( $e, $serverIndex );
return null;
}
@@ -350,43 +444,21 @@ class SqlBagOStuff extends BagOStuff {
}
/**
- * @return Array
- */
- public function keys() {
- $result = array();
-
- try {
- $db = $this->getDB();
- for ( $i = 0; $i < $this->shards; $i++ ) {
- $res = $db->select( $this->getTableByShard( $i ),
- array( 'keyname' ), false, __METHOD__ );
- foreach ( $res as $row ) {
- $result[] = $row->keyname;
- }
- }
- } catch ( DBError $e ) {
- $this->handleReadError( $e );
- }
-
- return $result;
- }
-
- /**
* @param $exptime string
* @return bool
*/
- protected function isExpired( $exptime ) {
- return $exptime != $this->getMaxDateTime() && wfTimestamp( TS_UNIX, $exptime ) < time();
+ protected function isExpired( $db, $exptime ) {
+ return $exptime != $this->getMaxDateTime( $db ) && wfTimestamp( TS_UNIX, $exptime ) < time();
}
/**
* @return string
*/
- protected function getMaxDateTime() {
+ protected function getMaxDateTime( $db ) {
if ( time() > 0x7fffffff ) {
- return $this->getDB()->timestamp( 1 << 62 );
+ return $db->timestamp( 1 << 62 );
} else {
- return $this->getDB()->timestamp( 0x7fffffff );
+ return $db->timestamp( 0x7fffffff );
}
}
@@ -418,87 +490,91 @@ class SqlBagOStuff extends BagOStuff {
* @return bool
*/
public function deleteObjectsExpiringBefore( $timestamp, $progressCallback = false ) {
- try {
- $db = $this->getDB();
- $dbTimestamp = $db->timestamp( $timestamp );
- $totalSeconds = false;
- $baseConds = array( 'exptime < ' . $db->addQuotes( $dbTimestamp ) );
- for ( $i = 0; $i < $this->shards; $i++ ) {
- $maxExpTime = false;
- while ( true ) {
- $conds = $baseConds;
- if ( $maxExpTime !== false ) {
- $conds[] = 'exptime > ' . $db->addQuotes( $maxExpTime );
- }
- $rows = $db->select(
- $this->getTableByShard( $i ),
- array( 'keyname', 'exptime' ),
- $conds,
- __METHOD__,
- array( 'LIMIT' => 100, 'ORDER BY' => 'exptime' ) );
- if ( !$rows->numRows() ) {
- break;
- }
- $keys = array();
- $row = $rows->current();
- $minExpTime = $row->exptime;
- if ( $totalSeconds === false ) {
- $totalSeconds = wfTimestamp( TS_UNIX, $timestamp )
- - wfTimestamp( TS_UNIX, $minExpTime );
- }
- foreach ( $rows as $row ) {
- $keys[] = $row->keyname;
- $maxExpTime = $row->exptime;
- }
-
- $db->begin( __METHOD__ );
- $db->delete(
- $this->getTableByShard( $i ),
- array(
- 'exptime >= ' . $db->addQuotes( $minExpTime ),
- 'exptime < ' . $db->addQuotes( $dbTimestamp ),
- 'keyname' => $keys
- ),
- __METHOD__ );
- $db->commit( __METHOD__ );
+ for ( $serverIndex = 0; $serverIndex < $this->numServers; $serverIndex++ ) {
+ try {
+ $db = $this->getDB( $serverIndex );
+ $dbTimestamp = $db->timestamp( $timestamp );
+ $totalSeconds = false;
+ $baseConds = array( 'exptime < ' . $db->addQuotes( $dbTimestamp ) );
+ for ( $i = 0; $i < $this->shards; $i++ ) {
+ $maxExpTime = false;
+ while ( true ) {
+ $conds = $baseConds;
+ if ( $maxExpTime !== false ) {
+ $conds[] = 'exptime > ' . $db->addQuotes( $maxExpTime );
+ }
+ $rows = $db->select(
+ $this->getTableNameByShard( $i ),
+ array( 'keyname', 'exptime' ),
+ $conds,
+ __METHOD__,
+ array( 'LIMIT' => 100, 'ORDER BY' => 'exptime' ) );
+ if ( !$rows->numRows() ) {
+ break;
+ }
+ $keys = array();
+ $row = $rows->current();
+ $minExpTime = $row->exptime;
+ if ( $totalSeconds === false ) {
+ $totalSeconds = wfTimestamp( TS_UNIX, $timestamp )
+ - wfTimestamp( TS_UNIX, $minExpTime );
+ }
+ foreach ( $rows as $row ) {
+ $keys[] = $row->keyname;
+ $maxExpTime = $row->exptime;
+ }
- if ( $progressCallback ) {
- if ( intval( $totalSeconds ) === 0 ) {
- $percent = 0;
- } else {
- $remainingSeconds = wfTimestamp( TS_UNIX, $timestamp )
- - wfTimestamp( TS_UNIX, $maxExpTime );
- if ( $remainingSeconds > $totalSeconds ) {
- $totalSeconds = $remainingSeconds;
+ $db->begin( __METHOD__ );
+ $db->delete(
+ $this->getTableNameByShard( $i ),
+ array(
+ 'exptime >= ' . $db->addQuotes( $minExpTime ),
+ 'exptime < ' . $db->addQuotes( $dbTimestamp ),
+ 'keyname' => $keys
+ ),
+ __METHOD__ );
+ $db->commit( __METHOD__ );
+
+ if ( $progressCallback ) {
+ if ( intval( $totalSeconds ) === 0 ) {
+ $percent = 0;
+ } else {
+ $remainingSeconds = wfTimestamp( TS_UNIX, $timestamp )
+ - wfTimestamp( TS_UNIX, $maxExpTime );
+ if ( $remainingSeconds > $totalSeconds ) {
+ $totalSeconds = $remainingSeconds;
+ }
+ $percent = ( $i + $remainingSeconds / $totalSeconds )
+ / $this->shards * 100;
}
- $percent = ( $i + $remainingSeconds / $totalSeconds )
- / $this->shards * 100;
+ $percent = ( $percent / $this->numServers )
+ + ( $serverIndex / $this->numServers * 100 );
+ call_user_func( $progressCallback, $percent );
}
- call_user_func( $progressCallback, $percent );
}
}
+ } catch ( DBError $e ) {
+ $this->handleWriteError( $e, $serverIndex );
+ return false;
}
- } catch ( DBError $e ) {
- $this->handleWriteError( $e );
- return false;
}
-
return true;
}
public function deleteAll() {
- try {
- $db = $this->getDB();
- for ( $i = 0; $i < $this->shards; $i++ ) {
- $db->begin( __METHOD__ );
- $db->delete( $this->getTableByShard( $i ), '*', __METHOD__ );
- $db->commit( __METHOD__ );
+ for ( $serverIndex = 0; $serverIndex < $this->numServers; $serverIndex++ ) {
+ try {
+ $db = $this->getDB( $serverIndex );
+ for ( $i = 0; $i < $this->shards; $i++ ) {
+ $db->begin( __METHOD__ );
+ $db->delete( $this->getTableNameByShard( $i ), '*', __METHOD__ );
+ $db->commit( __METHOD__ );
+ }
+ } catch ( DBError $e ) {
+ $this->handleWriteError( $e, $serverIndex );
+ return false;
}
- } catch ( DBError $e ) {
- $this->handleWriteError( $e );
- return false;
}
-
return true;
}
@@ -544,58 +620,77 @@ class SqlBagOStuff extends BagOStuff {
/**
* Handle a DBError which occurred during a read operation.
*/
- protected function handleReadError( DBError $exception ) {
+ protected function handleReadError( DBError $exception, $serverIndex ) {
if ( $exception instanceof DBConnectionError ) {
- $this->connFailureTime = time();
- $this->connFailureError = $exception;
+ $this->markServerDown( $exception, $serverIndex );
}
wfDebugLog( 'SQLBagOStuff', "DBError: {$exception->getMessage()}" );
- if ( $this->db ) {
- wfDebug( __METHOD__ . ": ignoring query error\n" );
- } else {
+ if ( $exception instanceof DBConnectionError ) {
wfDebug( __METHOD__ . ": ignoring connection error\n" );
+ } else {
+ wfDebug( __METHOD__ . ": ignoring query error\n" );
}
}
/**
* Handle a DBQueryError which occurred during a write operation.
*/
- protected function handleWriteError( DBError $exception ) {
+ protected function handleWriteError( DBError $exception, $serverIndex ) {
if ( $exception instanceof DBConnectionError ) {
- $this->connFailureTime = time();
- $this->connFailureError = $exception;
+ $this->markServerDown( $exception, $serverIndex );
}
- if ( $this->db && $this->db->wasReadOnlyError() ) {
+ if ( $exception->db && $exception->db->wasReadOnlyError() ) {
try {
- $this->db->rollback( __METHOD__ );
+ $exception->db->rollback( __METHOD__ );
} catch ( DBError $e ) {}
}
wfDebugLog( 'SQLBagOStuff', "DBError: {$exception->getMessage()}" );
- if ( $this->db ) {
- wfDebug( __METHOD__ . ": ignoring query error\n" );
- } else {
+ if ( $exception instanceof DBConnectionError ) {
wfDebug( __METHOD__ . ": ignoring connection error\n" );
+ } else {
+ wfDebug( __METHOD__ . ": ignoring query error\n" );
+ }
+ }
+
+ /**
+ * Mark a server down due to a DBConnectionError exception
+ */
+ protected function markServerDown( $exception, $serverIndex ) {
+ if ( isset( $this->connFailureTimes[$serverIndex] ) ) {
+ if ( time() - $this->connFailureTimes[$serverIndex] >= 60 ) {
+ unset( $this->connFailureTimes[$serverIndex] );
+ unset( $this->connFailureErrors[$serverIndex] );
+ } else {
+ wfDebug( __METHOD__ . ": Server #$serverIndex already down\n" );
+ return;
+ }
}
+ $now = time();
+ wfDebug( __METHOD__ . ": Server #$serverIndex down until " . ( $now + 60 ) . "\n" );
+ $this->connFailureTimes[$serverIndex] = $now;
+ $this->connFailureErrors[$serverIndex] = $exception;
}
/**
* Create shard tables. For use from eval.php.
*/
public function createTables() {
- $db = $this->getDB();
- if ( $db->getType() !== 'mysql'
- || version_compare( $db->getServerVersion(), '4.1.0', '<' ) )
- {
- throw new MWException( __METHOD__ . ' is not supported on this DB server' );
- }
+ for ( $serverIndex = 0; $serverIndex < $this->numServers; $serverIndex++ ) {
+ $db = $this->getDB( $serverIndex );
+ if ( $db->getType() !== 'mysql'
+ || version_compare( $db->getServerVersion(), '4.1.0', '<' ) )
+ {
+ throw new MWException( __METHOD__ . ' is not supported on this DB server' );
+ }
- for ( $i = 0; $i < $this->shards; $i++ ) {
- $db->begin( __METHOD__ );
- $db->query(
- 'CREATE TABLE ' . $db->tableName( $this->getTableByShard( $i ) ) .
- ' LIKE ' . $db->tableName( 'objectcache' ),
- __METHOD__ );
- $db->commit( __METHOD__ );
+ for ( $i = 0; $i < $this->shards; $i++ ) {
+ $db->begin( __METHOD__ );
+ $db->query(
+ 'CREATE TABLE ' . $db->tableName( $this->getTableNameByShard( $i ) ) .
+ ' LIKE ' . $db->tableName( 'objectcache' ),
+ __METHOD__ );
+ $db->commit( __METHOD__ );
+ }
}
}
}
@@ -604,4 +699,3 @@ class SqlBagOStuff extends BagOStuff {
* Backwards compatibility alias
*/
class MediaWikiBagOStuff extends SqlBagOStuff { }
-
diff --git a/includes/objectcache/WinCacheBagOStuff.php b/includes/objectcache/WinCacheBagOStuff.php
index 21aa39e7..6d9b47ad 100644
--- a/includes/objectcache/WinCacheBagOStuff.php
+++ b/includes/objectcache/WinCacheBagOStuff.php
@@ -32,12 +32,15 @@ class WinCacheBagOStuff extends BagOStuff {
/**
* Get a value from the WinCache object cache
*
- * @param $key String: cache key
+ * @param string $key cache key
+ * @param $casToken[optional] int: cas token
* @return mixed
*/
- public function get( $key ) {
+ public function get( $key, &$casToken = null ) {
$val = wincache_ucache_get( $key );
+ $casToken = $val;
+
if ( is_string( $val ) ) {
$val = unserialize( $val );
}
@@ -48,9 +51,9 @@ class WinCacheBagOStuff extends BagOStuff {
/**
* Store a value in the WinCache object cache
*
- * @param $key String: cache key
+ * @param string $key cache key
* @param $value Mixed: object to store
- * @param $expire Int: expiration time
+ * @param int $expire expiration time
* @return bool
*/
public function set( $key, $value, $expire = 0 ) {
@@ -62,34 +65,28 @@ class WinCacheBagOStuff extends BagOStuff {
}
/**
- * Remove a value from the WinCache object cache
+ * Store a value in the WinCache object cache, race condition-safe
*
- * @param $key String: cache key
- * @param $time Int: not used in this implementation
+ * @param int $casToken cas token
+ * @param string $key cache key
+ * @param int $value object to store
+ * @param int $exptime expiration time
* @return bool
*/
- public function delete( $key, $time = 0 ) {
- wincache_ucache_delete( $key );
-
- return true;
+ public function cas( $casToken, $key, $value, $exptime = 0 ) {
+ return wincache_ucache_cas( $key, $casToken, serialize( $value ) );
}
/**
- * @return Array
+ * Remove a value from the WinCache object cache
+ *
+ * @param string $key cache key
+ * @param int $time not used in this implementation
+ * @return bool
*/
- public function keys() {
- $info = wincache_ucache_info();
- $list = $info['ucache_entries'];
- $keys = array();
-
- if ( is_null( $list ) ) {
- return array();
- }
-
- foreach ( $list as $entry ) {
- $keys[] = $entry['key_name'];
- }
+ public function delete( $key, $time = 0 ) {
+ wincache_ucache_delete( $key );
- return $keys;
+ return true;
}
}
diff --git a/includes/objectcache/XCacheBagOStuff.php b/includes/objectcache/XCacheBagOStuff.php
index bc68b596..0f45db73 100644
--- a/includes/objectcache/XCacheBagOStuff.php
+++ b/includes/objectcache/XCacheBagOStuff.php
@@ -31,10 +31,11 @@ class XCacheBagOStuff extends BagOStuff {
/**
* Get a value from the XCache object cache
*
- * @param $key String: cache key
+ * @param string $key cache key
+ * @param $casToken mixed: cas token
* @return mixed
*/
- public function get( $key ) {
+ public function get( $key, &$casToken = null ) {
$val = xcache_get( $key );
if ( is_string( $val ) ) {
@@ -53,9 +54,9 @@ class XCacheBagOStuff extends BagOStuff {
/**
* Store a value in the XCache object cache
*
- * @param $key String: cache key
+ * @param string $key cache key
* @param $value Mixed: object to store
- * @param $expire Int: expiration time
+ * @param int $expire expiration time
* @return bool
*/
public function set( $key, $value, $expire = 0 ) {
@@ -68,10 +69,22 @@ class XCacheBagOStuff extends BagOStuff {
}
/**
+ * @param $casToken mixed
+ * @param $key string
+ * @param $value mixed
+ * @param $exptime int
+ * @return bool
+ */
+ public function cas( $casToken, $key, $value, $exptime = 0 ) {
+ // Can't find any documentation on xcache cas
+ throw new MWException( "CAS is not implemented in " . __CLASS__ );
+ }
+
+ /**
* Remove a value from the XCache object cache
*
- * @param $key String: cache key
- * @param $time Int: not used in this implementation
+ * @param string $key cache key
+ * @param int $time not used in this implementation
* @return bool
*/
public function delete( $key, $time = 0 ) {
@@ -79,6 +92,21 @@ class XCacheBagOStuff extends BagOStuff {
return true;
}
+ /**
+ * Merge an item.
+ * XCache does not seem to support any way of performing CAS - this however will
+ * provide a way to perform CAS-like functionality.
+ *
+ * @param $key string
+ * @param $callback closure Callback method to be executed
+ * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+ * @param int $attempts The amount of times to attempt a merge in case of failure
+ * @return bool success
+ */
+ public function merge( $key, closure $callback, $exptime = 0, $attempts = 10 ) {
+ return $this->mergeViaLock( $key, $callback, $exptime, $attempts );
+ }
+
public function incr( $key, $value = 1 ) {
return xcache_inc( $key, $value );
}
diff --git a/includes/parser/CacheTime.php b/includes/parser/CacheTime.php
index 881dded7..6b70e1da 100644
--- a/includes/parser/CacheTime.php
+++ b/includes/parser/CacheTime.php
@@ -116,7 +116,7 @@ class CacheTime {
* per-article cache invalidation timestamps, or if it comes from
* an incompatible older version.
*
- * @param $touched String: the affected article's last touched timestamp
+ * @param string $touched the affected article's last touched timestamp
* @return Boolean
*/
public function expired( $touched ) {
diff --git a/includes/parser/CoreLinkFunctions.php b/includes/parser/CoreLinkFunctions.php
index 4bfa9d35..1cabf766 100644
--- a/includes/parser/CoreLinkFunctions.php
+++ b/includes/parser/CoreLinkFunctions.php
@@ -47,15 +47,15 @@ class CoreLinkFunctions {
*/
static function defaultLinkHook( $parser, $holders, $markers,
Title $title, $titleText, &$displayText = null, &$leadingColon = false ) {
- if( isset($displayText) && $markers->findMarker( $displayText ) ) {
+ if( isset( $displayText ) && $markers->findMarker( $displayText ) ) {
# There are links inside of the displayText
# For backwards compatibility the deepest links are dominant so this
# link should not be handled
- $displayText = $markers->expand($displayText);
+ $displayText = $markers->expand( $displayText );
# Return false so that this link is reverted back to WikiText
return false;
}
- return $holders->makeHolder( $title, isset($displayText) ? $displayText : $titleText, array(), '', '' );
+ return $holders->makeHolder( $title, isset( $displayText ) ? $displayText : $titleText, array(), '', '' );
}
/**
@@ -73,15 +73,15 @@ class CoreLinkFunctions {
global $wgContLang;
# When a category link starts with a : treat it as a normal link
if( $leadingColon ) return true;
- if( isset($sortText) && $markers->findMarker( $sortText ) ) {
+ if( isset( $sortText ) && $markers->findMarker( $sortText ) ) {
# There are links inside of the sortText
# For backwards compatibility the deepest links are dominant so this
# link should not be handled
- $sortText = $markers->expand($sortText);
+ $sortText = $markers->expand( $sortText );
# Return false so that this link is reverted back to WikiText
return false;
}
- if( !isset($sortText) ) $sortText = $parser->getDefaultSort();
+ if( !isset( $sortText ) ) $sortText = $parser->getDefaultSort();
$sortText = Sanitizer::decodeCharReferences( $sortText );
$sortText = str_replace( "\n", '', $sortText );
$sortText = $wgContLang->convertCategoryKey( $sortText );
diff --git a/includes/parser/CoreParserFunctions.php b/includes/parser/CoreParserFunctions.php
index 8917b6d0..cdd03aa4 100644
--- a/includes/parser/CoreParserFunctions.php
+++ b/includes/parser/CoreParserFunctions.php
@@ -175,8 +175,8 @@ class CoreParserFunctions {
* For links to "wiki"s, or similar software, spaces are encoded as '_',
*
* @param $parser Parser object
- * @param $s String: The text to encode.
- * @param $arg String (optional): The type of encoding.
+ * @param string $s The text to encode.
+ * @param string $arg (optional): The type of encoding.
* @return string
*/
static function urlencode( $parser, $s = '', $arg = null ) {
@@ -269,12 +269,14 @@ class CoreParserFunctions {
/**
* @param $parser Parser
* @param string $num
- * @param null $raw
- * @return
+ * @param string $arg
+ * @return string
*/
- static function formatnum( $parser, $num = '', $raw = null) {
- if ( self::isRaw( $raw ) ) {
+ static function formatnum( $parser, $num = '', $arg = null ) {
+ if ( self::matchAgainstMagicword( 'rawsuffix', $arg ) ) {
$func = array( $parser->getFunctionLang(), 'parseFormattedNumber' );
+ } elseif ( self::matchAgainstMagicword( 'nocommafysuffix', $arg ) ) {
+ $func = array( $parser->getFunctionLang(), 'formatNumNoSeparators' );
} else {
$func = array( $parser->getFunctionLang(), 'formatNum' );
}
@@ -351,7 +353,7 @@ class CoreParserFunctions {
* title which will normalise to the canonical title
*
* @param $parser Parser: parent parser
- * @param $text String: desired title text
+ * @param string $text desired title text
* @return String
*/
static function displaytitle( $parser, $text = '' ) {
@@ -386,20 +388,23 @@ class CoreParserFunctions {
return '';
}
- static function isRaw( $param ) {
- static $mwRaw;
- if ( !$mwRaw ) {
- $mwRaw =& MagicWord::get( 'rawsuffix' );
- }
- if ( is_null( $param ) ) {
+ /**
+ * Matches the given value against the value of given magic word
+ *
+ * @param string $magicword magic word key
+ * @param mixed $value value to match
+ * @return boolean true on successful match
+ */
+ static private function matchAgainstMagicword( $magicword, $value ) {
+ if ( strval( $value ) === '' ) {
return false;
- } else {
- return $mwRaw->match( $param );
}
+ $mwObject = MagicWord::get( $magicword );
+ return $mwObject->match( $value );
}
static function formatRaw( $num, $raw ) {
- if( self::isRaw( $raw ) ) {
+ if( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
return $num;
} else {
global $wgContLang;
@@ -422,7 +427,7 @@ class CoreParserFunctions {
return self::formatRaw( SiteStats::images(), $raw );
}
static function numberofadmins( $parser, $raw = null ) {
- return self::formatRaw( SiteStats::numberingroup('sysop'), $raw );
+ return self::formatRaw( SiteStats::numberingroup( 'sysop' ), $raw );
}
static function numberofedits( $parser, $raw = null ) {
return self::formatRaw( SiteStats::edits(), $raw );
@@ -437,7 +442,6 @@ class CoreParserFunctions {
return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw );
}
-
/**
* Given a title, return the namespace name that would be given by the
* corresponding magic word
@@ -585,7 +589,7 @@ class CoreParserFunctions {
static $cache = array();
// split the given option to its variable
- if( self::isRaw( $arg1 ) ) {
+ if( self::matchAgainstMagicword( 'rawsuffix', $arg1 ) ) {
//{{pagesincategory:|raw[|type]}}
$raw = $arg1;
$type = $magicWords->matchStartToEnd( $arg2 );
@@ -641,7 +645,7 @@ class CoreParserFunctions {
* @todo Document parameters
*
* @param $parser Parser
- * @param $page String TODO DOCUMENT (Default: empty string)
+ * @param string $page TODO DOCUMENT (Default: empty string)
* @param $raw TODO DOCUMENT (Default: null)
* @return string
*/
@@ -662,21 +666,31 @@ class CoreParserFunctions {
$length = $cache[$page];
} elseif( $parser->incrementExpensiveFunctionCount() ) {
$rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
- $id = $rev ? $rev->getPage() : 0;
+ $pageID = $rev ? $rev->getPage() : 0;
+ $revID = $rev ? $rev->getId() : 0;
$length = $cache[$page] = $rev ? $rev->getSize() : 0;
// Register dependency in templatelinks
- $parser->mOutput->addTemplate( $title, $id, $rev ? $rev->getId() : 0 );
+ $parser->mOutput->addTemplate( $title, $pageID, $revID );
}
return self::formatRaw( $length, $raw );
}
/**
- * Returns the requested protection level for the current page
+ * Returns the requested protection level for the current page
+ *
+ * @param Parser $parser
+ * @param string $type
+ * @param string $title
+ *
* @return string
*/
- static function protectionlevel( $parser, $type = '' ) {
- $restrictions = $parser->mTitle->getRestrictions( strtolower( $type ) );
+ static function protectionlevel( $parser, $type = '', $title = '' ) {
+ $titleObject = Title::newFromText( $title );
+ if ( !( $titleObject instanceof Title ) ) {
+ $titleObject = $parser->mTitle;
+ }
+ $restrictions = $titleObject->getRestrictions( strtolower( $type ) );
# Title::getRestrictions returns an array, its possible it may have
# multiple values in the future
return implode( $restrictions, ',' );
@@ -685,8 +699,8 @@ class CoreParserFunctions {
/**
* Gives language names.
* @param $parser Parser
- * @param $code String Language code (of which to get name)
- * @param $inLanguage String Language code (in which to get name)
+ * @param string $code Language code (of which to get name)
+ * @param string $inLanguage Language code (in which to get name)
* @return String
*/
static function language( $parser, $code = '', $inLanguage = '' ) {
@@ -739,7 +753,7 @@ class CoreParserFunctions {
*/
static function anchorencode( $parser, $text ) {
$text = $parser->killMarkers( $text );
- return substr( $parser->guessSectionNameFromWikiText( $text ), 1);
+ return (string)substr( $parser->guessSectionNameFromWikiText( $text ), 1 );
}
static function special( $parser, $text ) {
@@ -758,8 +772,8 @@ class CoreParserFunctions {
/**
* @param $parser Parser
- * @param $text String The sortkey to use
- * @param $uarg String Either "noreplace" or "noerror" (in en)
+ * @param string $text The sortkey to use
+ * @param string $uarg Either "noreplace" or "noerror" (in en)
* both suppress errors, and noreplace does nothing if
* a default sortkey already exists.
* @return string
@@ -790,7 +804,7 @@ class CoreParserFunctions {
// Usage {{filepath|300}}, {{filepath|nowiki}}, {{filepath|nowiki|300}} or {{filepath|300|nowiki}}
// or {{filepath|300px}}, {{filepath|200x300px}}, {{filepath|nowiki|200x300px}}, {{filepath|200x300px|nowiki}}
- public static function filepath( $parser, $name='', $argA='', $argB='' ) {
+ public static function filepath( $parser, $name = '', $argA = '', $argB = '' ) {
$file = wfFindFile( $name );
if( $argA == 'nowiki' ) {
diff --git a/includes/parser/CoreTagHooks.php b/includes/parser/CoreTagHooks.php
index 296be66f..65051839 100644
--- a/includes/parser/CoreTagHooks.php
+++ b/includes/parser/CoreTagHooks.php
@@ -72,6 +72,7 @@ class CoreTagHooks {
* @param $content string
* @param $attributes array
* @param $parser Parser
+ * @throws MWException
* @return array
*/
static function html( $content, $attributes, $parser ) {
diff --git a/includes/parser/DateFormatter.php b/includes/parser/DateFormatter.php
index 2917b4a7..a2da3074 100644
--- a/includes/parser/DateFormatter.php
+++ b/includes/parser/DateFormatter.php
@@ -22,7 +22,7 @@
*/
/**
- * Date formatter, recognises dates in plain text and formats them accoding to user preferences.
+ * Date formatter, recognises dates in plain text and formats them according to user preferences.
* @todo preferences, OutputPage
* @ingroup Parser
*/
@@ -55,7 +55,7 @@ class DateFormatter {
$this->lang = $lang;
$this->monthNames = $this->getMonthRegex();
- for ( $i=1; $i<=12; $i++ ) {
+ for ( $i = 1; $i <= 12; $i++ ) {
$this->xMonths[$this->lang->lc( $this->lang->getMonthName( $i ) )] = $i;
$this->xMonths[$this->lang->lc( $this->lang->getMonthAbbreviation( $i ) )] = $i;
}
@@ -102,11 +102,11 @@ class DateFormatter {
# Rules
# pref source target
- $this->rules[self::DMY][self::MD] = self::DM;
- $this->rules[self::ALL][self::MD] = self::MD;
- $this->rules[self::MDY][self::DM] = self::MD;
- $this->rules[self::ALL][self::DM] = self::DM;
- $this->rules[self::NONE][self::ISO2] = self::ISO1;
+ $this->rules[self::DMY][self::MD] = self::DM;
+ $this->rules[self::ALL][self::MD] = self::MD;
+ $this->rules[self::MDY][self::DM] = self::MD;
+ $this->rules[self::ALL][self::DM] = self::DM;
+ $this->rules[self::NONE][self::ISO2] = self::ISO1;
$this->preferences = array(
'default' => self::NONE,
@@ -140,12 +140,12 @@ class DateFormatter {
}
/**
- * @param $preference String: User preference
- * @param $text String: Text to reformat
- * @param $options Array: can contain 'linked' and/or 'match-whole'
+ * @param string $preference User preference
+ * @param string $text Text to reformat
+ * @param array $options can contain 'linked' and/or 'match-whole'
* @return mixed|String
*/
- function reformat( $preference, $text, $options = array('linked') ) {
+ function reformat( $preference, $text, $options = array( 'linked' ) ) {
$linked = in_array( 'linked', $options );
$match_whole = in_array( 'match-whole', $options );
@@ -154,7 +154,7 @@ class DateFormatter {
} else {
$preference = self::NONE;
}
- for ( $i=1; $i<=self::LAST; $i++ ) {
+ for ( $i = 1; $i <= self::LAST; $i++ ) {
$this->mSource = $i;
if ( isset ( $this->rules[$preference][$i] ) ) {
# Specific rules
@@ -172,21 +172,21 @@ class DateFormatter {
$regex = $this->regexes[$i];
// Horrible hack
- if (!$linked) {
+ if ( !$linked ) {
$regex = str_replace( array( '\[\[', '\]\]' ), '', $regex );
}
- if ($match_whole) {
+ if ( $match_whole ) {
// Let's hope this works
$regex = preg_replace( '!^/!', '/^', $regex );
$regex = str_replace( $this->regexTrail,
- '$'.$this->regexTrail, $regex );
+ '$' . $this->regexTrail, $regex );
}
// Another horrible hack
$this->mLinked = $linked;
$text = preg_replace_callback( $regex, array( &$this, 'replace' ), $text );
- unset($this->mLinked);
+ unset( $this->mLinked );
}
return $text;
}
@@ -200,10 +200,10 @@ class DateFormatter {
$linked = true;
if ( isset( $this->mLinked ) )
$linked = $this->mLinked;
-
+
$bits = array();
$key = $this->keys[$this->mSource];
- for ( $p=0; $p < strlen($key); $p++ ) {
+ for ( $p = 0; $p < strlen( $key ); $p++ ) {
if ( $key[$p] != ' ' ) {
$bits[$key[$p]] = $matches[$p+1];
}
@@ -219,8 +219,8 @@ class DateFormatter {
*/
function formatDate( $bits, $link = true ) {
$format = $this->targets[$this->mTarget];
-
- if (!$link) {
+
+ if ( !$link ) {
// strip piped links
$format = preg_replace( '/\[\[[^|]+\|([^\]]+)\]\]/', '$1', $format );
// strip remaining links
@@ -246,11 +246,11 @@ class DateFormatter {
}
}
- if ( !isset($bits['d']) ) {
+ if ( !isset( $bits['d'] ) ) {
$bits['d'] = sprintf( '%02d', $bits['j'] );
}
- for ( $p=0; $p < strlen( $format ); $p++ ) {
+ for ( $p = 0; $p < strlen( $format ); $p++ ) {
$char = $format[$p];
switch ( $char ) {
case 'd': # ISO day of month
@@ -263,7 +263,7 @@ class DateFormatter {
$text .= $bits['y'];
break;
case 'j': # ordinary day of month
- if ( !isset($bits['j']) ) {
+ if ( !isset( $bits['j'] ) ) {
$text .= intval( $bits['d'] );
} else {
$text .= $bits['j'];
@@ -271,7 +271,7 @@ class DateFormatter {
break;
case 'F': # long month
if ( !isset( $bits['F'] ) ) {
- $m = intval($bits['m']);
+ $m = intval( $bits['m'] );
if ( $m > 12 || $m < 1 ) {
$fail = true;
} else {
@@ -293,7 +293,7 @@ class DateFormatter {
}
$isoBits = array();
- if ( isset($bits['y']) )
+ if ( isset( $bits['y'] ) )
$isoBits[] = $bits['y'];
$isoBits[] = $bits['m'];
$isoBits[] = $bits['d'];
@@ -321,7 +321,7 @@ class DateFormatter {
/**
* Makes an ISO month, e.g. 02, from a month name
- * @param $monthName String: month name
+ * @param string $monthName month name
* @return string ISO month name
*/
function makeIsoMonth( $monthName ) {
@@ -331,7 +331,7 @@ class DateFormatter {
/**
* @todo document
- * @param $year String: Year name
+ * @param string $year Year name
* @return string ISO year name
*/
function makeIsoYear( $year ) {
diff --git a/includes/parser/LinkHolderArray.php b/includes/parser/LinkHolderArray.php
index d9356b48..49b2d333 100644
--- a/includes/parser/LinkHolderArray.php
+++ b/includes/parser/LinkHolderArray.php
@@ -43,9 +43,9 @@ class LinkHolderArray {
}
}
- /**
+ /**
* Don't serialize the parent object, it is big, and not needed when it is
- * a parameter to mergeForeign(), which is the only application of
+ * a parameter to mergeForeign(), which is the only application of
* serializing at present.
*
* Compact the titles, only serialize the text form.
@@ -103,15 +103,15 @@ class LinkHolderArray {
}
/**
- * Merge a LinkHolderArray from another parser instance into this one. The
- * keys will not be preserved. Any text which went with the old
- * LinkHolderArray and needs to work with the new one should be passed in
+ * Merge a LinkHolderArray from another parser instance into this one. The
+ * keys will not be preserved. Any text which went with the old
+ * LinkHolderArray and needs to work with the new one should be passed in
* the $texts array. The strings in this array will have their link holders
* converted for use in the destination link holder. The resulting array of
* strings will be returned.
*
* @param $other LinkHolderArray
- * @param $texts Array of strings
+ * @param array $texts of strings
* @return Array
*/
function mergeForeign( $other, $texts ) {
@@ -126,7 +126,7 @@ class LinkHolderArray {
$maxId = $newKey > $maxId ? $newKey : $maxId;
}
}
- $texts = preg_replace_callback( '/(<!--LINK \d+:)(\d+)(-->)/',
+ $texts = preg_replace_callback( '/(<!--LINK \d+:)(\d+)(-->)/',
array( $this, 'mergeForeignCallback' ), $texts );
# Renumber interwiki links
@@ -135,7 +135,7 @@ class LinkHolderArray {
$this->interwikis[$newKey] = $entry;
$maxId = $newKey > $maxId ? $newKey : $maxId;
}
- $texts = preg_replace_callback( '/(<!--IWLINK )(\d+)(-->)/',
+ $texts = preg_replace_callback( '/(<!--IWLINK )(\d+)(-->)/',
array( $this, 'mergeForeignCallback' ), $texts );
# Set the parent link ID to be beyond the highest used ID
@@ -159,8 +159,8 @@ class LinkHolderArray {
# Internal links
$pos = 0;
while ( $pos < strlen( $text ) ) {
- if ( !preg_match( '/<!--LINK (\d+):(\d+)-->/',
- $text, $m, PREG_OFFSET_CAPTURE, $pos ) )
+ if ( !preg_match( '/<!--LINK (\d+):(\d+)-->/',
+ $text, $m, PREG_OFFSET_CAPTURE, $pos ) )
{
break;
}
@@ -210,14 +210,14 @@ class LinkHolderArray {
*
* @param $nt Title
* @param $text String
- * @param $query Array [optional]
- * @param $trail String [optional]
- * @param $prefix String [optional]
+ * @param array $query [optional]
+ * @param string $trail [optional]
+ * @param string $prefix [optional]
* @return string
*/
- function makeHolder( $nt, $text = '', $query = array(), $trail = '', $prefix = '' ) {
+ function makeHolder( $nt, $text = '', $query = array(), $trail = '', $prefix = '' ) {
wfProfileIn( __METHOD__ );
- if ( ! is_object($nt) ) {
+ if ( !is_object( $nt ) ) {
# Fail gracefully
$retVal = "<!-- ERROR -->{$prefix}{$text}{$trail}";
} else {
@@ -226,7 +226,7 @@ class LinkHolderArray {
$entry = array(
'title' => $nt,
- 'text' => $prefix.$text.$inside,
+ 'text' => $prefix . $text . $inside,
'pdbk' => $nt->getPrefixedDBkey(),
);
if ( $query !== array() ) {
@@ -254,12 +254,12 @@ class LinkHolderArray {
* @todo FIXME: Update documentation. makeLinkObj() is deprecated.
* Replace <!--LINK--> link placeholders with actual links, in the buffer
* Placeholders created in Skin::makeLinkObj()
- * Returns an array of link CSS classes, indexed by PDBK.
+ * @return array of link CSS classes, indexed by PDBK.
*/
function replace( &$text ) {
wfProfileIn( __METHOD__ );
- $colours = $this->replaceInternal( $text );
+ $colours = $this->replaceInternal( $text ); // FIXME: replaceInternal doesn't return a value
$this->replaceInterwiki( $text );
wfProfileOut( __METHOD__ );
@@ -281,7 +281,7 @@ class LinkHolderArray {
$linkCache = LinkCache::singleton();
$output = $this->parent->getOutput();
- wfProfileIn( __METHOD__.'-check' );
+ wfProfileIn( __METHOD__ . '-check' );
$dbr = wfGetDB( DB_SLAVE );
$threshold = $this->parent->getOptions()->getStubThreshold();
@@ -322,7 +322,7 @@ class LinkHolderArray {
}
if ( $queries ) {
$where = array();
- foreach( $queries as $ns => $pages ){
+ foreach( $queries as $ns => $pages ) {
$where[] = $dbr->makeList(
array(
'page_namespace' => $ns,
@@ -355,19 +355,19 @@ class LinkHolderArray {
}
unset( $res );
}
- if ( count($linkcolour_ids) ) {
+ if ( count( $linkcolour_ids ) ) {
//pass an array of page_ids to an extension
wfRunHooks( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
}
- wfProfileOut( __METHOD__.'-check' );
+ wfProfileOut( __METHOD__ . '-check' );
# Do a second query for different language variants of links and categories
- if($wgContLang->hasVariants()) {
+ if( $wgContLang->hasVariants() ) {
$this->doVariants( $colours );
}
# Construct search and replace arrays
- wfProfileIn( __METHOD__.'-construct' );
+ wfProfileIn( __METHOD__ . '-construct' );
$replacePairs = array();
foreach ( $this->internals as $ns => $entries ) {
foreach ( $entries as $index => $entry ) {
@@ -399,16 +399,16 @@ class LinkHolderArray {
}
}
$replacer = new HashtableReplacer( $replacePairs, 1 );
- wfProfileOut( __METHOD__.'-construct' );
+ wfProfileOut( __METHOD__ . '-construct' );
# Do the thing
- wfProfileIn( __METHOD__.'-replace' );
+ wfProfileIn( __METHOD__ . '-replace' );
$text = preg_replace_callback(
'/(<!--LINK .*?-->)/',
$replacer->cb(),
$text);
- wfProfileOut( __METHOD__.'-replace' );
+ wfProfileOut( __METHOD__ . '-replace' );
wfProfileOut( __METHOD__ );
}
@@ -497,20 +497,23 @@ class LinkHolderArray {
// process categories, check if a category exists in some variant
$categoryMap = array(); // maps $category_variant => $category (dbkeys)
$varCategories = array(); // category replacements oldDBkey => newDBkey
- foreach( $output->getCategoryLinks() as $category ){
+ foreach ( $output->getCategoryLinks() as $category ) {
+ $categoryTitle = Title::makeTitleSafe( NS_CATEGORY, $category );
+ $linkBatch->addObj( $categoryTitle );
$variants = $wgContLang->autoConvertToAllVariants( $category );
- foreach($variants as $variant){
- if($variant != $category){
- $variantTitle = Title::newFromDBkey( Title::makeName(NS_CATEGORY,$variant) );
- if(is_null($variantTitle)) continue;
+ foreach ( $variants as $variant ) {
+ if ( $variant !== $category ) {
+ $variantTitle = Title::makeTitleSafe( NS_CATEGORY, $variant );
+ if ( is_null( $variantTitle ) ) {
+ continue;
+ }
$linkBatch->addObj( $variantTitle );
- $categoryMap[$variant] = $category;
+ $categoryMap[$variant] = array( $category, $categoryTitle );
}
}
}
-
- if(!$linkBatch->isEmpty()){
+ if( !$linkBatch->isEmpty() ) {
// construct query
$dbr = wfGetDB( DB_SLAVE );
$varRes = $dbr->select( 'page',
@@ -556,25 +559,28 @@ class LinkHolderArray {
}
// check if the object is a variant of a category
- if(isset($categoryMap[$vardbk])){
- $oldkey = $categoryMap[$vardbk];
- if($oldkey != $vardbk)
- $varCategories[$oldkey]=$vardbk;
+ if ( isset( $categoryMap[$vardbk] ) ) {
+ list( $oldkey, $oldtitle ) = $categoryMap[$vardbk];
+ if ( !isset( $varCategories[$oldkey] ) && !$oldtitle->exists() ) {
+ $varCategories[$oldkey] = $vardbk;
+ }
}
}
wfRunHooks( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
// rebuild the categories in original order (if there are replacements)
- if(count($varCategories)>0){
+ if( count( $varCategories ) > 0 ) {
$newCats = array();
$originalCats = $output->getCategories();
- foreach($originalCats as $cat => $sortkey){
+ foreach( $originalCats as $cat => $sortkey ) {
// make the replacement
- if( array_key_exists($cat,$varCategories) )
+ if( array_key_exists( $cat, $varCategories ) ) {
$newCats[$varCategories[$cat]] = $sortkey;
- else $newCats[$cat] = $sortkey;
+ } else {
+ $newCats[$cat] = $sortkey;
+ }
}
- $output->setCategoryLinks($newCats);
+ $output->setCategoryLinks( $newCats );
}
}
}
@@ -607,7 +613,7 @@ class LinkHolderArray {
*/
function replaceTextCallback( $matches ) {
$type = $matches[1];
- $key = $matches[2];
+ $key = $matches[2];
if( $type == 'LINK' ) {
list( $ns, $index ) = explode( ':', $key, 2 );
if( isset( $this->internals[$ns][$index]['text'] ) ) {
diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php
index 10765de2..5ef0bc71 100644
--- a/includes/parser/Parser.php
+++ b/includes/parser/Parser.php
@@ -62,7 +62,6 @@
* $wgAllowSpecialInclusion
* $wgInterwikiMagic
* $wgMaxArticleSize
- * $wgUseDynamicDates
*
* @ingroup Parser
*/
@@ -123,8 +122,8 @@ class Parser {
var $mFunctionHooks = array();
var $mFunctionSynonyms = array( 0 => array(), 1 => array() );
var $mFunctionTagHooks = array();
- var $mStripList = array();
- var $mDefaultStripList = array();
+ var $mStripList = array();
+ var $mDefaultStripList = array();
var $mVarCache = array();
var $mImageParams = array();
var $mImageParamsMagicArray = array();
@@ -201,6 +200,13 @@ class Parser {
var $mUniqPrefix;
/**
+ * @var Array with the language name of each language link (i.e. the
+ * interwiki prefix) in the key, value arbitrary. Used to avoid sending
+ * duplicate language links to the ParserOutput.
+ */
+ var $mLangLinkLanguages;
+
+ /**
* Constructor
*
* @param $conf array
@@ -208,8 +214,8 @@ class Parser {
public function __construct( $conf = array() ) {
$this->mConf = $conf;
$this->mUrlProtocols = wfUrlProtocols();
- $this->mExtLinkBracketedRegex = '/\[(((?i)' . $this->mUrlProtocols . ')'.
- self::EXT_LINK_URL_CLASS.'+)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
+ $this->mExtLinkBracketedRegex = '/\[(((?i)' . $this->mUrlProtocols . ')' .
+ self::EXT_LINK_URL_CLASS . '+)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
if ( isset( $conf['preprocessorClass'] ) ) {
$this->mPreprocessorClass = $conf['preprocessorClass'];
} elseif ( defined( 'MW_COMPILED' ) ) {
@@ -240,6 +246,13 @@ class Parser {
}
/**
+ * Allow extensions to clean up when the parser is cloned
+ */
+ function __clone() {
+ wfRunHooks( 'ParserCloned', array( $this ) );
+ }
+
+ /**
* Do various kinds of initialisation on the first call of the parser
*/
function firstCallInit() {
@@ -282,6 +295,7 @@ class Parser {
$this->mRevisionId = $this->mRevisionUser = null;
$this->mVarCache = array();
$this->mUser = null;
+ $this->mLangLinkLanguages = array();
/**
* Prefix for temporary replacement strings for the multipass parser.
@@ -291,12 +305,11 @@ class Parser {
* string constructs.
*
* Must not consist of all title characters, or else it will change
- * the behaviour of <nowiki> in a link.
+ * the behavior of <nowiki> in a link.
*/
$this->mUniqPrefix = "\x7fUNIQ" . self::getRandomString();
$this->mStripState = new StripState( $this->mUniqPrefix );
-
# Clear these on every parse, bug 4549
$this->mTplExpandCache = $this->mTplRedirCache = $this->mTplDomCache = array();
@@ -327,12 +340,12 @@ class Parser {
* Convert wikitext to HTML
* Do not call this function recursively.
*
- * @param $text String: text we want to parse
+ * @param string $text text we want to parse
* @param $title Title object
* @param $options ParserOptions
* @param $linestart boolean
* @param $clearState boolean
- * @param $revid Int: number to pass in {{REVISIONID}}
+ * @param int $revid number to pass in {{REVISIONID}}
* @return ParserOutput a ParserOutput
*/
public function parse( $text, Title $title, ParserOptions $options, $linestart = true, $clearState = true, $revid = null ) {
@@ -342,7 +355,7 @@ class Parser {
*/
global $wgUseTidy, $wgAlwaysUseTidy;
- $fname = __METHOD__.'-' . wfGetCaller();
+ $fname = __METHOD__ . '-' . wfGetCaller();
wfProfileIn( __METHOD__ );
wfProfileIn( $fname );
@@ -397,9 +410,7 @@ class Parser {
if ( !( $options->getDisableContentConversion()
|| isset( $this->mDoubleUnderscores['nocontentconvert'] ) ) )
{
- # Run convert unconditionally in 1.18-compatible mode
- global $wgBug34832TransitionalRollback;
- if ( $wgBug34832TransitionalRollback || !$this->mOptions->getInterfaceMessage() ) {
+ if ( !$this->mOptions->getInterfaceMessage() ) {
# The position of the convert() call should not be changed. it
# assumes that the links are all replaced and the only thing left
# is the <nowiki> mark.
@@ -486,8 +497,8 @@ class Parser {
"Preprocessor generated node count: " .
"{$this->mGeneratedPPNodeCount}/{$this->mOptions->getMaxGeneratedPPNodeCount()}\n" .
"Post-expand include size: {$this->mIncludeSizes['post-expand']}/$max bytes\n" .
- "Template argument size: {$this->mIncludeSizes['arg']}/$max bytes\n".
- "Highest expansion depth: {$this->mHighestExpansionDepth}/{$this->mOptions->getMaxPPExpandDepth()}\n".
+ "Template argument size: {$this->mIncludeSizes['arg']}/$max bytes\n" .
+ "Highest expansion depth: {$this->mHighestExpansionDepth}/{$this->mOptions->getMaxPPExpandDepth()}\n" .
$PFreport;
wfRunHooks( 'ParserLimitReport', array( $this, &$limitReport ) );
@@ -496,6 +507,11 @@ class Parser {
$limitReport = str_replace( array( '-', '&' ), array( 'â€', '&amp;' ), $limitReport );
$text .= "\n<!-- \n$limitReport-->\n";
+
+ if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
+ wfDebugLog( 'generated-pp-node-count', $this->mGeneratedPPNodeCount . ' ' .
+ $this->mTitle->getPrefixedDBkey() );
+ }
}
$this->mOutput->setText( $text );
@@ -515,7 +531,7 @@ class Parser {
*
* If $frame is not provided, then template variables (e.g., {{{1}}}) within $text are not expanded
*
- * @param $text String: text extension wants to have parsed
+ * @param string $text text extension wants to have parsed
* @param $frame PPFrame: The frame to use for expanding any template variables
*
* @return string
@@ -534,7 +550,7 @@ class Parser {
* Also removes comments.
* @return mixed|string
*/
- function preprocess( $text, Title $title, ParserOptions $options, $revid = null ) {
+ function preprocess( $text, Title $title = null, ParserOptions $options, $revid = null ) {
wfProfileIn( __METHOD__ );
$this->startParse( $title, $options, self::OT_PREPROCESS, true );
if ( $revid !== null ) {
@@ -552,7 +568,7 @@ class Parser {
* Recursive parser entry point that can be called from an extension tag
* hook.
*
- * @param $text String: text to be expanded
+ * @param string $text text to be expanded
* @param $frame PPFrame: The frame to use for expanding any template variables
* @return String
* @since 1.19
@@ -593,7 +609,7 @@ class Parser {
*
* @return string
*/
- static public function getRandomString() {
+ public static function getRandomString() {
return wfRandomString( 16 );
}
@@ -682,7 +698,7 @@ class Parser {
/**
* Accessor/mutator for the output type
*
- * @param $x int|null New value or null to just get the current one
+ * @param int|null $x New value or null to just get the current one
* @return Integer
*/
function OutputType( $x = null ) {
@@ -745,6 +761,7 @@ class Parser {
*
* @since 1.19
*
+ * @throws MWException
* @return Language|null
*/
public function getTargetLanguage() {
@@ -765,12 +782,7 @@ class Parser {
* Get the language object for language conversion
*/
function getConverterLanguage() {
- global $wgBug34832TransitionalRollback, $wgContLang;
- if ( $wgBug34832TransitionalRollback ) {
- return $wgContLang;
- } else {
- return $this->getTargetLanguage();
- }
+ return $this->getTargetLanguage();
}
/**
@@ -813,9 +825,9 @@ class Parser {
* '<element param="x">tag content</element>' ) )
* @endcode
*
- * @param $elements array list of element names. Comments are always extracted.
- * @param $text string Source text string.
- * @param $matches array Out parameter, Array: extracted tags
+ * @param array $elements list of element names. Comments are always extracted.
+ * @param string $text Source text string.
+ * @param array $matches Out parameter, Array: extracted tags
* @param $uniq_prefix string
* @return String: stripped text
*/
@@ -835,16 +847,16 @@ class Parser {
}
if ( count( $p ) > 5 ) {
# comment
- $element = $p[4];
+ $element = $p[4];
$attributes = '';
- $close = '';
- $inside = $p[5];
+ $close = '';
+ $inside = $p[5];
} else {
# tag
- $element = $p[1];
+ $element = $p[1];
$attributes = $p[2];
- $close = $p[3];
- $inside = $p[4];
+ $close = $p[3];
+ $inside = $p[4];
}
$marker = "$uniq_prefix-$element-" . sprintf( '%08X', $n++ ) . self::MARKER_SUFFIX;
@@ -928,33 +940,33 @@ class Parser {
$line = trim( $outLine );
if ( $line === '' ) { # empty line, go to next line
- $out .= $outLine."\n";
+ $out .= $outLine . "\n";
continue;
}
$first_character = $line[0];
$matches = array();
- if ( preg_match( '/^(:*)\{\|(.*)$/', $line , $matches ) ) {
+ if ( preg_match( '/^(:*)\{\|(.*)$/', $line, $matches ) ) {
# First check if we are starting a new table
$indent_level = strlen( $matches[1] );
$attributes = $this->mStripState->unstripBoth( $matches[2] );
- $attributes = Sanitizer::fixTagAttributes( $attributes , 'table' );
-
- $outLine = str_repeat( '<dl><dd>' , $indent_level ) . "<table{$attributes}>";
- array_push( $td_history , false );
- array_push( $last_tag_history , '' );
- array_push( $tr_history , false );
- array_push( $tr_attributes , '' );
- array_push( $has_opened_tr , false );
+ $attributes = Sanitizer::fixTagAttributes( $attributes, 'table' );
+
+ $outLine = str_repeat( '<dl><dd>', $indent_level ) . "<table{$attributes}>";
+ array_push( $td_history, false );
+ array_push( $last_tag_history, '' );
+ array_push( $tr_history, false );
+ array_push( $tr_attributes, '' );
+ array_push( $has_opened_tr, false );
} elseif ( count( $td_history ) == 0 ) {
# Don't do any of the following
- $out .= $outLine."\n";
+ $out .= $outLine . "\n";
continue;
- } elseif ( substr( $line , 0 , 2 ) === '|}' ) {
+ } elseif ( substr( $line, 0, 2 ) === '|}' ) {
# We are ending a table
- $line = '</table>' . substr( $line , 2 );
+ $line = '</table>' . substr( $line, 2 );
$last_tag = array_pop( $last_tag_history );
if ( !array_pop( $has_opened_tr ) ) {
@@ -969,8 +981,8 @@ class Parser {
$line = "</{$last_tag}>{$line}";
}
array_pop( $tr_attributes );
- $outLine = $line . str_repeat( '</dd></dl>' , $indent_level );
- } elseif ( substr( $line , 0 , 2 ) === '|-' ) {
+ $outLine = $line . str_repeat( '</dd></dl>', $indent_level );
+ } elseif ( substr( $line, 0, 2 ) === '|-' ) {
# Now we have a table row
$line = preg_replace( '#^\|-+#', '', $line );
@@ -983,7 +995,7 @@ class Parser {
$line = '';
$last_tag = array_pop( $last_tag_history );
array_pop( $has_opened_tr );
- array_push( $has_opened_tr , true );
+ array_push( $has_opened_tr, true );
if ( array_pop( $tr_history ) ) {
$line = '</tr>';
@@ -994,27 +1006,27 @@ class Parser {
}
$outLine = $line;
- array_push( $tr_history , false );
- array_push( $td_history , false );
- array_push( $last_tag_history , '' );
- } elseif ( $first_character === '|' || $first_character === '!' || substr( $line , 0 , 2 ) === '|+' ) {
+ array_push( $tr_history, false );
+ array_push( $td_history, false );
+ array_push( $last_tag_history, '' );
+ } elseif ( $first_character === '|' || $first_character === '!' || substr( $line, 0, 2 ) === '|+' ) {
# This might be cell elements, td, th or captions
- if ( substr( $line , 0 , 2 ) === '|+' ) {
+ if ( substr( $line, 0, 2 ) === '|+' ) {
$first_character = '+';
- $line = substr( $line , 1 );
+ $line = substr( $line, 1 );
}
- $line = substr( $line , 1 );
+ $line = substr( $line, 1 );
if ( $first_character === '!' ) {
- $line = str_replace( '!!' , '||' , $line );
+ $line = str_replace( '!!', '||', $line );
}
# Split up multiple cells on the same line.
# FIXME : This can result in improper nesting of tags processed
# by earlier parser steps, but should avoid splitting up eg
# attribute values containing literal "||".
- $cells = StringUtils::explodeMarkup( '||' , $line );
+ $cells = StringUtils::explodeMarkup( '||', $line );
$outLine = '';
@@ -1026,10 +1038,10 @@ class Parser {
if ( !array_pop( $tr_history ) ) {
$previous = "<tr{$tr_after}>\n";
}
- array_push( $tr_history , true );
- array_push( $tr_attributes , '' );
+ array_push( $tr_history, true );
+ array_push( $tr_attributes, '' );
array_pop( $has_opened_tr );
- array_push( $has_opened_tr , true );
+ array_push( $has_opened_tr, true );
}
$last_tag = array_pop( $last_tag_history );
@@ -1048,10 +1060,10 @@ class Parser {
$last_tag = '';
}
- array_push( $last_tag_history , $last_tag );
+ array_push( $last_tag_history, $last_tag );
# A cell could contain both parameters and data
- $cell_data = explode( '|' , $cell , 2 );
+ $cell_data = explode( '|', $cell, 2 );
# Bug 553: Note that a '|' inside an invalid link should not
# be mistaken as delimiting cell parameters
@@ -1061,12 +1073,12 @@ class Parser {
$cell = "{$previous}<{$last_tag}>{$cell_data[0]}";
} else {
$attributes = $this->mStripState->unstripBoth( $cell_data[0] );
- $attributes = Sanitizer::fixTagAttributes( $attributes , $last_tag );
+ $attributes = Sanitizer::fixTagAttributes( $attributes, $last_tag );
$cell = "{$previous}<{$last_tag}{$attributes}>{$cell_data[1]}";
}
$outLine .= $cell;
- array_push( $td_history , true );
+ array_push( $td_history, true );
}
}
$out .= $outLine . "\n";
@@ -1081,7 +1093,7 @@ class Parser {
$out .= "</tr>\n";
}
if ( !array_pop( $has_opened_tr ) ) {
- $out .= "<tr><td></td></tr>\n" ;
+ $out .= "<tr><td></td></tr>\n";
}
$out .= "</table>\n";
@@ -1122,7 +1134,7 @@ class Parser {
# Hook to suspend the parser in this state
if ( !wfRunHooks( 'ParserBeforeInternalParse', array( &$this, &$text, &$this->mStripState ) ) ) {
wfProfileOut( __METHOD__ );
- return $text ;
+ return $text;
}
# if $frame is provided, then use $frame for replacing any variables
@@ -1156,17 +1168,13 @@ class Parser {
$text = $this->doDoubleUnderscore( $text );
$text = $this->doHeadings( $text );
- if ( $this->mOptions->getUseDynamicDates() ) {
- $df = DateFormatter::getInstance();
- $text = $df->reformat( $this->mOptions->getDateFormat(), $text );
- }
$text = $this->replaceInternalLinks( $text );
$text = $this->doAllQuotes( $text );
$text = $this->replaceExternalLinks( $text );
# replaceInternalLinks may sometimes leave behind
# absolute URLs, which have to be masked to hide them from replaceExternalLinks
- $text = str_replace( $this->mUniqPrefix.'NOPARSE', '', $text );
+ $text = str_replace( $this->mUniqPrefix . 'NOPARSE', '', $text );
$text = $this->doMagicLinks( $text );
$text = $this->formatHeadings( $text, $origText, $isMain );
@@ -1234,7 +1242,7 @@ class Parser {
$CssClass = 'mw-magiclink-pmid';
$id = $m[4];
} else {
- throw new MWException( __METHOD__.': unrecognised match type "' .
+ throw new MWException( __METHOD__ . ': unrecognised match type "' .
substr( $m[0], 0, 20 ) . '"' );
}
$url = wfMessage( $urlmsg, $id )->inContentLanguage()->text();
@@ -1298,7 +1306,8 @@ class Parser {
if ( $text === false ) {
# Not an image, make a link
$text = Linker::makeExternalLink( $url,
- $this->getConverterLanguage()->markNoConversion($url), true, 'free',
+ $this->getConverterLanguage()->markNoConversion( $url, true ),
+ true, 'free',
$this->getExternalLinkAttribs( $url ) );
# Register it in the output object...
# Replace unnecessary URL escape codes with their equivalent characters
@@ -1309,7 +1318,6 @@ class Parser {
return $text . $trail;
}
-
/**
* Parse headers and return html
*
@@ -1323,8 +1331,7 @@ class Parser {
wfProfileIn( __METHOD__ );
for ( $i = 6; $i >= 1; --$i ) {
$h = str_repeat( '=', $i );
- $text = preg_replace( "/^$h(.+)$h\\s*$/m",
- "<h$i>\\1</h$i>", $text );
+ $text = preg_replace( "/^$h(.+)$h\\s*$/m", "<h$i>\\1</h$i>", $text );
}
wfProfileOut( __METHOD__ );
return $text;
@@ -1345,7 +1352,7 @@ class Parser {
foreach ( $lines as $line ) {
$outtext .= $this->doQuotes( $line ) . "\n";
}
- $outtext = substr( $outtext, 0,-1 );
+ $outtext = substr( $outtext, 0, -1 );
wfProfileOut( __METHOD__ );
return $outtext;
}
@@ -1410,7 +1417,7 @@ class Parser {
if ( $firstspace == -1 ) {
$firstspace = $i;
}
- } elseif ( $x2 === ' ') {
+ } elseif ( $x2 === ' ' ) {
if ( $firstsingleletterword == -1 ) {
$firstsingleletterword = $i;
}
@@ -1461,7 +1468,7 @@ class Parser {
} elseif ( $state === 'ib' ) {
$output .= '</b></i><b>'; $state = 'b';
} elseif ( $state === 'both' ) {
- $output .= '<b><i>'.$buffer.'</i>'; $state = 'b';
+ $output .= '<b><i>' . $buffer . '</i>'; $state = 'b';
} else { # $state can be 'b' or ''
$output .= '<i>'; $state .= 'i';
}
@@ -1473,7 +1480,7 @@ class Parser {
} elseif ( $state === 'ib' ) {
$output .= '</b>'; $state = 'i';
} elseif ( $state === 'both' ) {
- $output .= '<i><b>'.$buffer.'</b>'; $state = 'i';
+ $output .= '<i><b>' . $buffer . '</b>'; $state = 'i';
} else { # $state can be 'i' or ''
$output .= '<b>'; $state .= 'b';
}
@@ -1487,7 +1494,7 @@ class Parser {
} elseif ( $state === 'ib' ) {
$output .= '</b></i>'; $state = '';
} elseif ( $state === 'both' ) {
- $output .= '<i><b>'.$buffer.'</b></i>'; $state = '';
+ $output .= '<i><b>' . $buffer . '</b></i>'; $state = '';
} else { # ($state == '')
$buffer = ''; $state = 'both';
}
@@ -1507,7 +1514,7 @@ class Parser {
}
# There might be lonely ''''', so make sure we have a buffer
if ( $state === 'both' && $buffer ) {
- $output .= '<b><i>'.$buffer.'</i></b>';
+ $output .= '<b><i>' . $buffer . '</i></b>';
}
return $output;
}
@@ -1523,6 +1530,7 @@ class Parser {
*
* @param $text string
*
+ * @throws MWException
* @return string
*/
function replaceExternalLinks( $text ) {
@@ -1537,7 +1545,7 @@ class Parser {
$i = 0;
while ( $i<count( $bits ) ) {
$url = $bits[$i++];
- $protocol = $bits[$i++];
+ $i++; // protocol
$text = $bits[$i++];
$trail = $bits[$i++];
@@ -1595,26 +1603,39 @@ class Parser {
wfProfileOut( __METHOD__ );
return $s;
}
-
+ /**
+ * Get the rel attribute for a particular external link.
+ *
+ * @since 1.21
+ * @param string|bool $url optional URL, to extract the domain from for rel =>
+ * nofollow if appropriate
+ * @param $title Title optional Title, for wgNoFollowNsExceptions lookups
+ * @return string|null rel attribute for $url
+ */
+ public static function getExternalLinkRel( $url = false, $title = null ) {
+ global $wgNoFollowLinks, $wgNoFollowNsExceptions, $wgNoFollowDomainExceptions;
+ $ns = $title ? $title->getNamespace() : false;
+ if ( $wgNoFollowLinks && !in_array( $ns, $wgNoFollowNsExceptions ) &&
+ !wfMatchesDomainList( $url, $wgNoFollowDomainExceptions ) )
+ {
+ return 'nofollow';
+ }
+ return null;
+ }
/**
* Get an associative array of additional HTML attributes appropriate for a
* particular external link. This currently may include rel => nofollow
* (depending on configuration, namespace, and the URL's domain) and/or a
* target attribute (depending on configuration).
*
- * @param $url String|bool optional URL, to extract the domain from for rel =>
+ * @param string|bool $url optional URL, to extract the domain from for rel =>
* nofollow if appropriate
* @return Array associative array of HTML attributes
*/
function getExternalLinkAttribs( $url = false ) {
$attribs = array();
- global $wgNoFollowLinks, $wgNoFollowNsExceptions, $wgNoFollowDomainExceptions;
- $ns = $this->mTitle->getNamespace();
- if ( $wgNoFollowLinks && !in_array( $ns, $wgNoFollowNsExceptions ) &&
- !wfMatchesDomainList( $url, $wgNoFollowDomainExceptions ) )
- {
- $attribs['rel'] = 'nofollow';
- }
+ $attribs['rel'] = self::getExternalLinkRel( $url, $this->mTitle );
+
if ( $this->mOptions->getExternalLinkTarget() ) {
$attribs['target'] = $this->mOptions->getExternalLinkTarget();
}
@@ -1726,6 +1747,8 @@ class Parser {
/**
* Process [[ ]] wikilinks (RIL)
+ * @param $s
+ * @throws MWException
* @return LinkHolderArray
*
* @private
@@ -1733,8 +1756,8 @@ class Parser {
function replaceInternalLinks2( &$s ) {
wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__.'-setup' );
- static $tc = FALSE, $e1, $e1_img;
+ wfProfileIn( __METHOD__ . '-setup' );
+ static $tc = false, $e1, $e1_img;
# the % is needed to support urlencoded titles as well
if ( !$tc ) {
$tc = Title::legalChars() . '#%';
@@ -1763,9 +1786,9 @@ class Parser {
}
if ( is_null( $this->mTitle ) ) {
- wfProfileOut( __METHOD__.'-setup' );
+ wfProfileOut( __METHOD__ . '-setup' );
wfProfileOut( __METHOD__ );
- throw new MWException( __METHOD__.": \$this->mTitle is null\n" );
+ throw new MWException( __METHOD__ . ": \$this->mTitle is null\n" );
}
$nottalk = !$this->mTitle->isTalkPage();
@@ -1780,17 +1803,11 @@ class Parser {
$prefix = '';
}
- if ( $this->getConverterLanguage()->hasVariants() ) {
- $selflink = $this->getConverterLanguage()->autoConvertToAllVariants(
- $this->mTitle->getPrefixedText() );
- } else {
- $selflink = array( $this->mTitle->getPrefixedText() );
- }
$useSubpages = $this->areSubpagesAllowed();
- wfProfileOut( __METHOD__.'-setup' );
+ wfProfileOut( __METHOD__ . '-setup' );
# Loop for each link
- for ( ; $line !== false && $line !== null ; $a->next(), $line = $a->current() ) {
+ for ( ; $line !== false && $line !== null; $a->next(), $line = $a->current() ) {
# Check for excessive memory usage
if ( $holders->isBig() ) {
# Too big
@@ -1800,24 +1817,24 @@ class Parser {
}
if ( $useLinkPrefixExtension ) {
- wfProfileIn( __METHOD__.'-prefixhandling' );
+ wfProfileIn( __METHOD__ . '-prefixhandling' );
if ( preg_match( $e2, $s, $m ) ) {
$prefix = $m[2];
$s = $m[1];
} else {
- $prefix='';
+ $prefix = '';
}
# first link
if ( $first_prefix ) {
$prefix = $first_prefix;
$first_prefix = false;
}
- wfProfileOut( __METHOD__.'-prefixhandling' );
+ wfProfileOut( __METHOD__ . '-prefixhandling' );
}
$might_be_img = false;
- wfProfileIn( __METHOD__."-e1" );
+ wfProfileIn( __METHOD__ . "-e1" );
if ( preg_match( $e1, $line, $m ) ) { # page with normal text or alt
$text = $m[2];
# If we get a ] at the beginning of $m[3] that means we have a link that's something like:
@@ -1839,7 +1856,7 @@ class Parser {
# fix up urlencoded title texts
if ( strpos( $m[1], '%' ) !== false ) {
# Should anchors '#' also be rejected?
- $m[1] = str_replace( array('<', '>'), array('&lt;', '&gt;'), rawurldecode( $m[1] ) );
+ $m[1] = str_replace( array( '<', '>' ), array( '&lt;', '&gt;' ), rawurldecode( $m[1] ) );
}
$trail = $m[3];
} elseif ( preg_match( $e1_img, $line, $m ) ) { # Invalid, but might be an image with a link in its caption
@@ -1850,19 +1867,19 @@ class Parser {
}
$trail = "";
} else { # Invalid form; output directly
- $s .= $prefix . '[[' . $line ;
- wfProfileOut( __METHOD__."-e1" );
+ $s .= $prefix . '[[' . $line;
+ wfProfileOut( __METHOD__ . "-e1" );
continue;
}
- wfProfileOut( __METHOD__."-e1" );
- wfProfileIn( __METHOD__."-misc" );
+ wfProfileOut( __METHOD__ . "-e1" );
+ wfProfileIn( __METHOD__ . "-misc" );
# Don't allow internal links to pages containing
# PROTO: where PROTO is a valid URL protocol; these
# should be external links.
if ( preg_match( '/^(?i:' . $this->mUrlProtocols . ')/', $m[1] ) ) {
- $s .= $prefix . '[[' . $line ;
- wfProfileOut( __METHOD__."-misc" );
+ $s .= $prefix . '[[' . $line;
+ wfProfileOut( __METHOD__ . "-misc" );
continue;
}
@@ -1879,21 +1896,21 @@ class Parser {
$link = substr( $link, 1 );
}
- wfProfileOut( __METHOD__."-misc" );
- wfProfileIn( __METHOD__."-title" );
+ wfProfileOut( __METHOD__ . "-misc" );
+ wfProfileIn( __METHOD__ . "-title" );
$nt = Title::newFromText( $this->mStripState->unstripNoWiki( $link ) );
if ( $nt === null ) {
$s .= $prefix . '[[' . $line;
- wfProfileOut( __METHOD__."-title" );
+ wfProfileOut( __METHOD__ . "-title" );
continue;
}
$ns = $nt->getNamespace();
$iw = $nt->getInterWiki();
- wfProfileOut( __METHOD__."-title" );
+ wfProfileOut( __METHOD__ . "-title" );
if ( $might_be_img ) { # if this is actually an invalid link
- wfProfileIn( __METHOD__."-might_be_img" );
+ wfProfileIn( __METHOD__ . "-might_be_img" );
if ( $ns == NS_FILE && $noforce ) { # but might be an image
$found = false;
while ( true ) {
@@ -1925,19 +1942,19 @@ class Parser {
$holders->merge( $this->replaceInternalLinks2( $text ) );
$s .= "{$prefix}[[$link|$text";
# note: no $trail, because without an end, there *is* no trail
- wfProfileOut( __METHOD__."-might_be_img" );
+ wfProfileOut( __METHOD__ . "-might_be_img" );
continue;
}
} else { # it's not an image, so output it raw
$s .= "{$prefix}[[$link|$text";
# note: no $trail, because without an end, there *is* no trail
- wfProfileOut( __METHOD__."-might_be_img" );
+ wfProfileOut( __METHOD__ . "-might_be_img" );
continue;
}
- wfProfileOut( __METHOD__."-might_be_img" );
+ wfProfileOut( __METHOD__ . "-might_be_img" );
}
- $wasblank = ( $text == '' );
+ $wasblank = ( $text == '' );
if ( $wasblank ) {
$text = $link;
} else {
@@ -1951,18 +1968,25 @@ class Parser {
# Link not escaped by : , create the various objects
if ( $noforce ) {
# Interwikis
- wfProfileIn( __METHOD__."-interwiki" );
+ wfProfileIn( __METHOD__ . "-interwiki" );
if ( $iw && $this->mOptions->getInterwikiMagic() && $nottalk && Language::fetchLanguageName( $iw, null, 'mw' ) ) {
- $this->mOutput->addLanguageLink( $nt->getFullText() );
+ // XXX: the above check prevents links to sites with identifiers that are not language codes
+
+ # Bug 24502: filter duplicates
+ if ( !isset( $this->mLangLinkLanguages[$iw] ) ) {
+ $this->mLangLinkLanguages[$iw] = true;
+ $this->mOutput->addLanguageLink( $nt->getFullText() );
+ }
+
$s = rtrim( $s . $prefix );
$s .= trim( $trail, "\n" ) == '' ? '': $prefix . $trail;
- wfProfileOut( __METHOD__."-interwiki" );
+ wfProfileOut( __METHOD__ . "-interwiki" );
continue;
}
- wfProfileOut( __METHOD__."-interwiki" );
+ wfProfileOut( __METHOD__ . "-interwiki" );
if ( $ns == NS_FILE ) {
- wfProfileIn( __METHOD__."-image" );
+ wfProfileIn( __METHOD__ . "-image" );
if ( !wfIsBadImage( $nt->getDBkey(), $this->mTitle ) ) {
if ( $wasblank ) {
# if no parameters were passed, $text
@@ -1983,12 +2007,12 @@ class Parser {
} else {
$s .= $prefix . $trail;
}
- wfProfileOut( __METHOD__."-image" );
+ wfProfileOut( __METHOD__ . "-image" );
continue;
}
if ( $ns == NS_CATEGORY ) {
- wfProfileIn( __METHOD__."-category" );
+ wfProfileIn( __METHOD__ . "-category" );
$s = rtrim( $s . "\n" ); # bug 87
if ( $wasblank ) {
@@ -2007,14 +2031,18 @@ class Parser {
*/
$s .= trim( $prefix . $trail, "\n" ) == '' ? '' : $prefix . $trail;
- wfProfileOut( __METHOD__."-category" );
+ wfProfileOut( __METHOD__ . "-category" );
continue;
}
}
# Self-link checking
if ( $nt->getFragment() === '' && $ns != NS_SPECIAL ) {
- if ( in_array( $nt->getPrefixedText(), $selflink, true ) ) {
+ if ( $nt->equals( $this->mTitle ) || ( !$nt->isKnown() && in_array(
+ $this->mTitle->getPrefixedText(),
+ $this->getConverterLanguage()->autoConvertToAllVariants( $nt->getPrefixedText() ),
+ true
+ ) ) ) {
$s .= $prefix . Linker::makeSelfLinkObj( $nt, $text, '', $trail );
continue;
}
@@ -2023,7 +2051,7 @@ class Parser {
# NS_MEDIA is a pseudo-namespace for linking directly to a file
# @todo FIXME: Should do batch file existence checks, see comment below
if ( $ns == NS_MEDIA ) {
- wfProfileIn( __METHOD__."-media" );
+ wfProfileIn( __METHOD__ . "-media" );
# Give extensions a chance to select the file revision for us
$options = array();
$descQuery = false;
@@ -2034,11 +2062,11 @@ class Parser {
# Cloak with NOPARSE to avoid replacement in replaceExternalLinks
$s .= $prefix . $this->armorLinks(
Linker::makeMediaLinkFile( $nt, $file, $text ) ) . $trail;
- wfProfileOut( __METHOD__."-media" );
+ wfProfileOut( __METHOD__ . "-media" );
continue;
}
- wfProfileIn( __METHOD__."-always_known" );
+ wfProfileIn( __METHOD__ . "-always_known" );
# Some titles, such as valid special pages or files in foreign repos, should
# be shown as bluelinks even though they're not included in the page table
#
@@ -2051,7 +2079,7 @@ class Parser {
# Links will be added to the output link list after checking
$s .= $holders->makeHolder( $nt, $text, array(), $trail, $prefix );
}
- wfProfileOut( __METHOD__."-always_known" );
+ wfProfileOut( __METHOD__ . "-always_known" );
}
wfProfileOut( __METHOD__ );
return $holders;
@@ -2066,7 +2094,7 @@ class Parser {
*
* @param $nt Title
* @param $text String
- * @param $query Array or String
+ * @param array $query or String
* @param $trail String
* @param $prefix String
* @return String: HTML-wikitext mix oh yuck
@@ -2093,7 +2121,7 @@ class Parser {
* Not needed quite as much as it used to be since free links are a bit
* more sensible these days. But bracketed links are still an issue.
*
- * @param $text String: more-or-less HTML
+ * @param string $text more-or-less HTML
* @return String: less-or-more HTML with NOPARSE bits
*/
function armorLinks( $text ) {
@@ -2113,7 +2141,7 @@ class Parser {
/**
* Handle link to subpage if necessary
*
- * @param $target String: the source of the link
+ * @param string $target the source of the link
* @param &$text String: the link text, modified as necessary
* @return string the full name of the link
* @private
@@ -2239,7 +2267,7 @@ class Parser {
} else {
return '<!-- ERR 3 -->';
}
- return $text."\n";
+ return $text . "\n";
}
/**#@-*/
@@ -2306,7 +2334,7 @@ class Parser {
$output .= $this->nextItem( substr( $prefix, -1 ) );
$paragraphStack = false;
- if ( substr( $prefix, -1 ) === ';') {
+ if ( substr( $prefix, -1 ) === ';' ) {
# The one nasty exception: definition lists work like this:
# ; title : definition text
# So we check for : in the remainder text to split up the
@@ -2354,13 +2382,13 @@ class Parser {
# If we have no prefixes, go to paragraph mode.
if ( 0 == $prefixLength ) {
- wfProfileIn( __METHOD__."-paragraph" );
+ wfProfileIn( __METHOD__ . "-paragraph" );
# No prefix (not in list)--go to paragraph mode
# XXX: use a stack for nestable elements like span, table and div
- $openmatch = preg_match('/(?:<table|<blockquote|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
+ $openmatch = preg_match( '/(?:<table|<blockquote|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
$closematch = preg_match(
'/(?:<\\/table|<\\/blockquote|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'.
- '<td|<th|<\\/?div|<hr|<\\/pre|<\\/p|'.$this->mUniqPrefix.'-pre|<\\/li|<\\/ul|<\\/ol|<\\/?center)/iS', $t );
+ '<td|<th|<\\/?div|<hr|<\\/pre|<\\/p|'.$this->mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t );
if ( $openmatch or $closematch ) {
$paragraphStack = false;
# TODO bug 5718: paragraph closed
@@ -2374,7 +2402,7 @@ class Parser {
# pre
if ( $this->mLastSection !== 'pre' ) {
$paragraphStack = false;
- $output .= $this->closeParagraph().'<pre>';
+ $output .= $this->closeParagraph() . '<pre>';
$this->mLastSection = 'pre';
}
$t = substr( $t, 1 );
@@ -2382,7 +2410,7 @@ class Parser {
# paragraph
if ( trim( $t ) === '' ) {
if ( $paragraphStack ) {
- $output .= $paragraphStack.'<br />';
+ $output .= $paragraphStack . '<br />';
$paragraphStack = false;
$this->mLastSection = 'p';
} else {
@@ -2400,20 +2428,20 @@ class Parser {
$paragraphStack = false;
$this->mLastSection = 'p';
} elseif ( $this->mLastSection !== 'p' ) {
- $output .= $this->closeParagraph().'<p>';
+ $output .= $this->closeParagraph() . '<p>';
$this->mLastSection = 'p';
}
}
}
}
- wfProfileOut( __METHOD__."-paragraph" );
+ wfProfileOut( __METHOD__ . "-paragraph" );
}
# somewhere above we forget to get out of pre block (bug 785)
if ( $preCloseMatch && $this->mInPre ) {
$this->mInPre = false;
}
if ( $paragraphStack === false ) {
- $output .= $t."\n";
+ $output .= $t . "\n";
}
}
while ( $prefixLength ) {
@@ -2433,9 +2461,10 @@ class Parser {
* Split up a string on ':', ignoring any occurrences inside tags
* to prevent illegal overlapping.
*
- * @param $str String the string to split
+ * @param string $str the string to split
* @param &$before String set to everything before the ':'
* @param &$after String set to everything after the ':'
+ * @throws MWException
* @return String the position of the ':', or false if none found
*/
function findColonNoLinks( $str, &$before, &$after ) {
@@ -2546,7 +2575,7 @@ class Parser {
if ( $c === ">" ) {
$stack--;
if ( $stack < 0 ) {
- wfDebug( __METHOD__.": Invalid input; too many close tags\n" );
+ wfDebug( __METHOD__ . ": Invalid input; too many close tags\n" );
wfProfileOut( __METHOD__ );
return false;
}
@@ -2586,7 +2615,7 @@ class Parser {
}
}
if ( $stack > 0 ) {
- wfDebug( __METHOD__.": Invalid input; not enough close tags (stack $stack, state $state)\n" );
+ wfDebug( __METHOD__ . ": Invalid input; not enough close tags (stack $stack, state $state)\n" );
wfProfileOut( __METHOD__ );
return false;
}
@@ -2600,8 +2629,9 @@ class Parser {
* @private
*
* @param $index integer
- * @param $frame PPFrame
+ * @param bool|\PPFrame $frame
*
+ * @throws MWException
* @return string
*/
function getVariableValue( $index, $frame = false ) {
@@ -2813,7 +2843,7 @@ class Parser {
$value = $this->getRevisionUser();
break;
case 'namespace':
- $value = str_replace( '_',' ',$wgContLang->getNsText( $this->mTitle->getNamespace() ) );
+ $value = str_replace( '_', ' ', $wgContLang->getNsText( $this->mTitle->getNamespace() ) );
break;
case 'namespacee':
$value = wfUrlencode( $wgContLang->getNsText( $this->mTitle->getNamespace() ) );
@@ -2822,7 +2852,7 @@ class Parser {
$value = $this->mTitle->getNamespace();
break;
case 'talkspace':
- $value = $this->mTitle->canTalk() ? str_replace( '_',' ',$this->mTitle->getTalkNsText() ) : '';
+ $value = $this->mTitle->canTalk() ? str_replace( '_', ' ', $this->mTitle->getTalkNsText() ) : '';
break;
case 'talkspacee':
$value = $this->mTitle->canTalk() ? wfUrlencode( $this->mTitle->getTalkNsText() ) : '';
@@ -2960,7 +2990,7 @@ class Parser {
* Preprocess some wikitext and return the document tree.
* This is the ghost of replace_variables().
*
- * @param $text String: The text to parse
+ * @param string $text The text to parse
* @param $flags Integer: bitwise combination of:
* self::PTD_FOR_INCLUSION Handle "<noinclude>" and "<includeonly>" as if the text is being
* included. Default is to assume a direct page view.
@@ -3015,7 +3045,7 @@ class Parser {
* self::OT_PREPROCESS: templates but not extension tags
* self::OT_HTML: all templates and extension tags
*
- * @param $text String the text to transform
+ * @param string $text the text to transform
* @param $frame PPFrame Object describing the arguments passed to the template.
* Arguments may also be provided as an associative array, as was the usual case before MW1.12.
* Providing arguments this way may be useful for extensions wishing to perform variable replacement explicitly.
@@ -3034,7 +3064,7 @@ class Parser {
if ( $frame === false ) {
$frame = $this->getPreprocessor()->newFrame();
} elseif ( !( $frame instanceof PPFrame ) ) {
- wfDebug( __METHOD__." called using plain parameters instead of a PPFrame instance. Creating custom frame.\n" );
+ wfDebug( __METHOD__ . " called using plain parameters instead of a PPFrame instance. Creating custom frame.\n" );
$frame = $this->getPreprocessor()->newCustomFrame( $frame );
}
@@ -3079,7 +3109,7 @@ class Parser {
* Warn the user when a parser limitation is reached
* Will warn at most once the user per limitation type
*
- * @param $limitationType String: should be one of:
+ * @param string $limitationType should be one of:
* 'expensive-parserfunction' (corresponding messages:
* 'expensive-parserfunction-warning',
* 'expensive-parserfunction-category')
@@ -3089,8 +3119,8 @@ class Parser {
* 'post-expand-template-inclusion' (corresponding messages:
* 'post-expand-template-inclusion-warning',
* 'post-expand-template-inclusion-category')
- * @param $current int|null Current value
- * @param $max int|null Maximum allowed, when an explicit limit has been
+ * @param int|null $current Current value
+ * @param int|null $max Maximum allowed, when an explicit limit has been
* exceeded, provide the values (optional)
*/
function limitationWarn( $limitationType, $current = '', $max = '' ) {
@@ -3105,18 +3135,19 @@ class Parser {
* Return the text of a template, after recursively
* replacing any variables or templates within the template.
*
- * @param $piece Array: the parts of the template
+ * @param array $piece the parts of the template
* $piece['title']: the title, i.e. the part before the |
* $piece['parts']: the parameter array
* $piece['lineStart']: whether the brace was at the start of a line
* @param $frame PPFrame The current frame, contains template arguments
+ * @throws MWException
* @return String: the text of the template
* @private
*/
function braceSubstitution( $piece, $frame ) {
global $wgContLang;
wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__.'-setup' );
+ wfProfileIn( __METHOD__ . '-setup' );
# Flags
$found = false; # $text has been filled
@@ -3141,12 +3172,12 @@ class Parser {
# $args is a list of argument nodes, starting from index 0, not including $part1
# @todo FIXME: If piece['parts'] is null then the call to getLength() below won't work b/c this $args isn't an object
$args = ( null == $piece['parts'] ) ? array() : $piece['parts'];
- wfProfileOut( __METHOD__.'-setup' );
+ wfProfileOut( __METHOD__ . '-setup' );
$titleProfileIn = null; // profile templates
# SUBST
- wfProfileIn( __METHOD__.'-modifiers' );
+ wfProfileIn( __METHOD__ . '-modifiers' );
if ( !$found ) {
$substMatch = $this->mSubstWords->matchStartAndRemove( $part1 );
@@ -3203,7 +3234,7 @@ class Parser {
$forceRawInterwiki = true;
}
}
- wfProfileOut( __METHOD__.'-modifiers' );
+ wfProfileOut( __METHOD__ . '-modifiers' );
# Parser functions
if ( !$found ) {
@@ -3211,70 +3242,22 @@ class Parser {
$colonPos = strpos( $part1, ':' );
if ( $colonPos !== false ) {
- # Case sensitive functions
- $function = substr( $part1, 0, $colonPos );
- if ( isset( $this->mFunctionSynonyms[1][$function] ) ) {
- $function = $this->mFunctionSynonyms[1][$function];
- } else {
- # Case insensitive functions
- $function = $wgContLang->lc( $function );
- if ( isset( $this->mFunctionSynonyms[0][$function] ) ) {
- $function = $this->mFunctionSynonyms[0][$function];
- } else {
- $function = false;
- }
+ $func = substr( $part1, 0, $colonPos );
+ $funcArgs = array( trim( substr( $part1, $colonPos + 1 ) ) );
+ for ( $i = 0; $i < $args->getLength(); $i++ ) {
+ $funcArgs[] = $args->item( $i );
}
- if ( $function ) {
- wfProfileIn( __METHOD__ . '-pfunc-' . $function );
- list( $callback, $flags ) = $this->mFunctionHooks[$function];
- $initialArgs = array( &$this );
- $funcArgs = array( trim( substr( $part1, $colonPos + 1 ) ) );
- if ( $flags & SFH_OBJECT_ARGS ) {
- # Add a frame parameter, and pass the arguments as an array
- $allArgs = $initialArgs;
- $allArgs[] = $frame;
- for ( $i = 0; $i < $args->getLength(); $i++ ) {
- $funcArgs[] = $args->item( $i );
- }
- $allArgs[] = $funcArgs;
- } else {
- # Convert arguments to plain text
- for ( $i = 0; $i < $args->getLength(); $i++ ) {
- $funcArgs[] = trim( $frame->expand( $args->item( $i ) ) );
- }
- $allArgs = array_merge( $initialArgs, $funcArgs );
- }
-
- # Workaround for PHP bug 35229 and similar
- if ( !is_callable( $callback ) ) {
- wfProfileOut( __METHOD__ . '-pfunc-' . $function );
- wfProfileOut( __METHOD__ . '-pfunc' );
- wfProfileOut( __METHOD__ );
- throw new MWException( "Tag hook for $function is not callable\n" );
- }
- $result = call_user_func_array( $callback, $allArgs );
- $found = true;
- $noparse = true;
- $preprocessFlags = 0;
-
- if ( is_array( $result ) ) {
- if ( isset( $result[0] ) ) {
- $text = $result[0];
- unset( $result[0] );
- }
-
- # Extract flags into the local scope
- # This allows callers to set flags such as nowiki, found, etc.
- extract( $result );
- } else {
- $text = $result;
- }
- if ( !$noparse ) {
- $text = $this->preprocessToDom( $text, $preprocessFlags );
- $isChildObj = true;
- }
- wfProfileOut( __METHOD__ . '-pfunc-' . $function );
+ try {
+ $result = $this->callParserFunction( $frame, $func, $funcArgs );
+ } catch ( Exception $ex ) {
+ wfProfileOut( __METHOD__ . '-pfunc' );
+ throw $ex;
}
+
+ # The interface for parser functions allows for extracting
+ # flags into the local scope. Extract any forwarded flags
+ # here.
+ extract( $result );
}
wfProfileOut( __METHOD__ . '-pfunc' );
}
@@ -3350,7 +3333,7 @@ class Parser {
}
} elseif ( MWNamespace::isNonincludable( $title->getNamespace() ) ) {
$found = false; # access denied
- wfDebug( __METHOD__.": template inclusion denied for " . $title->getPrefixedDBkey() );
+ wfDebug( __METHOD__ . ": template inclusion denied for " . $title->getPrefixedDBkey() );
} else {
list( $text, $title ) = $this->getTemplateDom( $title );
if ( $text !== false ) {
@@ -3385,7 +3368,7 @@ class Parser {
$text = '<span class="error">'
. wfMessage( 'parser-template-loop-warning', $titleText )->inContentLanguage()->text()
. '</span>';
- wfDebug( __METHOD__.": template loop broken at '$titleText'\n" );
+ wfDebug( __METHOD__ . ": template loop broken at '$titleText'\n" );
}
wfProfileOut( __METHOD__ . '-loadtpl' );
}
@@ -3442,7 +3425,7 @@ class Parser {
{
# Bug 529: if the template begins with a table or block-level
# element, it should be treated as beginning a new line.
- # This behaviour is somewhat controversial.
+ # This behavior is somewhat controversial.
$text = "\n" . $text;
}
@@ -3472,6 +3455,120 @@ class Parser {
}
/**
+ * Call a parser function and return an array with text and flags.
+ *
+ * The returned array will always contain a boolean 'found', indicating
+ * whether the parser function was found or not. It may also contain the
+ * following:
+ * text: string|object, resulting wikitext or PP DOM object
+ * isHTML: bool, $text is HTML, armour it against wikitext transformation
+ * isChildObj: bool, $text is a DOM node needing expansion in a child frame
+ * isLocalObj: bool, $text is a DOM node needing expansion in the current frame
+ * nowiki: bool, wiki markup in $text should be escaped
+ *
+ * @since 1.21
+ * @param $frame PPFrame The current frame, contains template arguments
+ * @param $function string Function name
+ * @param $args array Arguments to the function
+ * @return array
+ */
+ public function callParserFunction( $frame, $function, array $args = array() ) {
+ global $wgContLang;
+
+ wfProfileIn( __METHOD__ );
+
+ # Case sensitive functions
+ if ( isset( $this->mFunctionSynonyms[1][$function] ) ) {
+ $function = $this->mFunctionSynonyms[1][$function];
+ } else {
+ # Case insensitive functions
+ $function = $wgContLang->lc( $function );
+ if ( isset( $this->mFunctionSynonyms[0][$function] ) ) {
+ $function = $this->mFunctionSynonyms[0][$function];
+ } else {
+ wfProfileOut( __METHOD__ );
+ return array( 'found' => false );
+ }
+ }
+
+ wfProfileIn( __METHOD__ . '-pfunc-' . $function );
+ list( $callback, $flags ) = $this->mFunctionHooks[$function];
+
+ # Workaround for PHP bug 35229 and similar
+ if ( !is_callable( $callback ) ) {
+ wfProfileOut( __METHOD__ . '-pfunc-' . $function );
+ wfProfileOut( __METHOD__ );
+ throw new MWException( "Tag hook for $function is not callable\n" );
+ }
+
+ $allArgs = array( &$this );
+ if ( $flags & SFH_OBJECT_ARGS ) {
+ # Convert arguments to PPNodes and collect for appending to $allArgs
+ $funcArgs = array();
+ foreach ( $args as $k => $v ) {
+ if ( $v instanceof PPNode || $k === 0 ) {
+ $funcArgs[] = $v;
+ } else {
+ $funcArgs[] = $this->mPreprocessor->newPartNodeArray( array( $k => $v ) )->item( 0 );
+ }
+ }
+
+ # Add a frame parameter, and pass the arguments as an array
+ $allArgs[] = $frame;
+ $allArgs[] = $funcArgs;
+ } else {
+ # Convert arguments to plain text and append to $allArgs
+ foreach ( $args as $k => $v ) {
+ if ( $v instanceof PPNode ) {
+ $allArgs[] = trim( $frame->expand( $v ) );
+ } elseif ( is_int( $k ) && $k >= 0 ) {
+ $allArgs[] = trim( $v );
+ } else {
+ $allArgs[] = trim( "$k=$v" );
+ }
+ }
+ }
+
+ $result = call_user_func_array( $callback, $allArgs );
+
+ # The interface for function hooks allows them to return a wikitext
+ # string or an array containing the string and any flags. This mungs
+ # things around to match what this method should return.
+ if ( !is_array( $result ) ) {
+ $result = array(
+ 'found' => true,
+ 'text' => $result,
+ );
+ } else {
+ if ( isset( $result[0] ) && !isset( $result['text'] ) ) {
+ $result['text'] = $result[0];
+ }
+ unset( $result[0] );
+ $result += array(
+ 'found' => true,
+ );
+ }
+
+ $noparse = true;
+ $preprocessFlags = 0;
+ if ( isset( $result['noparse'] ) ) {
+ $noparse = $result['noparse'];
+ }
+ if ( isset( $result['preprocessFlags'] ) ) {
+ $preprocessFlags = $result['preprocessFlags'];
+ }
+
+ if ( !$noparse ) {
+ $result['text'] = $this->preprocessToDom( $result['text'], $preprocessFlags );
+ $result['isChildObj'] = true;
+ }
+ wfProfileOut( __METHOD__ . '-pfunc-' . $function );
+ wfProfileOut( __METHOD__ );
+
+ return $result;
+ }
+
+ /**
* Get the semi-parsed DOM representation of a template with a given title,
* and its redirect destination title. Cached.
*
@@ -3593,7 +3690,13 @@ class Parser {
}
if ( $rev ) {
- $text = $rev->getText();
+ $content = $rev->getContent();
+ $text = $content ? $content->getWikitextForTransclusion() : null;
+
+ if ( $text === false || $text === null ) {
+ $text = false;
+ break;
+ }
} elseif ( $title->getNamespace() == NS_MEDIAWIKI ) {
global $wgContLang;
$message = wfMessage( $wgContLang->lcfirst( $title->getText() ) )->inContentLanguage();
@@ -3601,16 +3704,17 @@ class Parser {
$text = false;
break;
}
+ $content = $message->content();
$text = $message->plain();
} else {
break;
}
- if ( $text === false ) {
+ if ( !$content ) {
break;
}
# Redirect?
$finalTitle = $title;
- $title = Title::newFromRedirect( $text );
+ $title = $content->getRedirectTarget();
}
return array(
'text' => $text,
@@ -3622,7 +3726,7 @@ class Parser {
* Fetch a file and its title and register a reference to it.
* If 'broken' is a key in $options then the file will appear as a broken thumbnail.
* @param Title $title
- * @param Array $options Array of options to RepoGroup::findFile
+ * @param array $options Array of options to RepoGroup::findFile
* @return File|bool
*/
function fetchFile( $title, $options = array() ) {
@@ -3634,7 +3738,7 @@ class Parser {
* Fetch a file and its title and register a reference to it.
* If 'broken' is a key in $options then the file will appear as a broken thumbnail.
* @param Title $title
- * @param Array $options Array of options to RepoGroup::findFile
+ * @param array $options Array of options to RepoGroup::findFile
* @return Array ( File or false, Title of file )
*/
function fetchFileAndTitle( $title, $options = array() ) {
@@ -3674,7 +3778,7 @@ class Parser {
global $wgEnableScaryTranscluding;
if ( !$wgEnableScaryTranscluding ) {
- return wfMessage('scarytranscludedisabled')->inContentLanguage()->text();
+ return wfMessage( 'scarytranscludedisabled' )->inContentLanguage()->text();
}
$url = $title->getFullUrl( "action=$action" );
@@ -3693,19 +3797,24 @@ class Parser {
global $wgTranscludeCacheExpiry;
$dbr = wfGetDB( DB_SLAVE );
$tsCond = $dbr->timestamp( time() - $wgTranscludeCacheExpiry );
- $obj = $dbr->selectRow( 'transcache', array('tc_time', 'tc_contents' ),
+ $obj = $dbr->selectRow( 'transcache', array( 'tc_time', 'tc_contents' ),
array( 'tc_url' => $url, "tc_time >= " . $dbr->addQuotes( $tsCond ) ) );
if ( $obj ) {
return $obj->tc_contents;
}
- $text = Http::get( $url );
- if ( !$text ) {
+ $req = MWHttpRequest::factory( $url );
+ $status = $req->execute(); // Status object
+ if ( $status->isOK() ) {
+ $text = $req->getContent();
+ } elseif ( $req->getStatus() != 200 ) { // Though we failed to fetch the content, this status is useless.
+ return wfMessage( 'scarytranscludefailed-httpstatus', $url, $req->getStatus() /* HTTP status */ )->inContentLanguage()->text();
+ } else {
return wfMessage( 'scarytranscludefailed', $url )->inContentLanguage()->text();
}
$dbw = wfGetDB( DB_MASTER );
- $dbw->replace( 'transcache', array('tc_url'), array(
+ $dbw->replace( 'transcache', array( 'tc_url' ), array(
'tc_url' => $url,
'tc_time' => $dbw->timestamp( time() ),
'tc_contents' => $text)
@@ -3731,7 +3840,7 @@ class Parser {
$argName = trim( $nameWithSpaces );
$object = false;
$text = $frame->getArgument( $argName );
- if ( $text === false && $parts->getLength() > 0
+ if ( $text === false && $parts->getLength() > 0
&& (
$this->ot['html']
|| $this->ot['pre']
@@ -3767,7 +3876,7 @@ class Parser {
* Return the text to be used for a given extension tag.
* This is the ghost of strip().
*
- * @param $params array Associative array of parameters:
+ * @param array $params Associative array of parameters:
* name PPNode for the tag name
* attr PPNode for unparsed text where tag attributes are thought to be
* attributes Optional associative array of parsed attributes
@@ -3775,6 +3884,7 @@ class Parser {
* noClose Original text did not have a close tag
* @param $frame PPFrame
*
+ * @throws MWException
* @return string
*/
function extensionSubstitution( $params, $frame ) {
@@ -3783,7 +3893,7 @@ class Parser {
$content = !isset( $params['inner'] ) ? null : $frame->expand( $params['inner'] );
$marker = "{$this->mUniqPrefix}-$name-" . sprintf( '%08X', $this->mMarkerIndex++ ) . self::MARKER_SUFFIX;
- $isFunctionTag = isset( $this->mFunctionTagHooks[strtolower($name)] ) &&
+ $isFunctionTag = isset( $this->mFunctionTagHooks[strtolower( $name )] ) &&
( $this->ot['html'] || $this->ot['pre'] );
if ( $isFunctionTag ) {
$markerType = 'none';
@@ -3805,7 +3915,7 @@ class Parser {
$output = call_user_func_array( $this->mTagHooks[$name],
array( $content, $attributes, $this, $frame ) );
} elseif ( isset( $this->mFunctionTagHooks[$name] ) ) {
- list( $callback, $flags ) = $this->mFunctionTagHooks[$name];
+ list( $callback, ) = $this->mFunctionTagHooks[$name];
if ( !is_callable( $callback ) ) {
throw new MWException( "Tag hook for $name is not callable\n" );
}
@@ -3848,7 +3958,7 @@ class Parser {
} elseif ( $markerType === 'general' ) {
$this->mStripState->addGeneral( $marker, $output );
} else {
- throw new MWException( __METHOD__.': invalid marker type' );
+ throw new MWException( __METHOD__ . ': invalid marker type' );
}
return $marker;
}
@@ -3856,7 +3966,7 @@ class Parser {
/**
* Increment an include size counter
*
- * @param $type String: the type of expansion
+ * @param string $type the type of expansion
* @param $size Integer: the size of the text
* @return Boolean: false if this inclusion would take it over the maximum, true otherwise
*/
@@ -3942,12 +4052,12 @@ class Parser {
* Add a tracking category, getting the title from a system message,
* or print a debug message if the title is invalid.
*
- * @param $msg String: message key
+ * @param string $msg message key
* @return Boolean: whether the addition was successful
*/
public function addTrackingCategory( $msg ) {
if ( $this->mTitle->getNamespace() === NS_SPECIAL ) {
- wfDebug( __METHOD__.": Not adding tracking category $msg to special page!\n" );
+ wfDebug( __METHOD__ . ": Not adding tracking category $msg to special page!\n" );
return false;
}
// Important to parse with correct title (bug 31469)
@@ -3966,7 +4076,7 @@ class Parser {
$this->mOutput->addCategory( $containerCategory->getDBkey(), $this->getDefaultSort() );
return true;
} else {
- wfDebug( __METHOD__.": [[MediaWiki:$msg]] is not a valid title!\n" );
+ wfDebug( __METHOD__ . ": [[MediaWiki:$msg]] is not a valid title!\n" );
return false;
}
}
@@ -3982,7 +4092,7 @@ class Parser {
* string and re-inserts the newly formatted headlines.
*
* @param $text String
- * @param $origText String: original, untouched wikitext
+ * @param string $origText original, untouched wikitext
* @param $isMain Boolean
* @return mixed|string
* @private
@@ -4062,7 +4172,7 @@ class Parser {
$sectionIndex = false;
$numbering = '';
$markerMatches = array();
- if ( preg_match("/^$markerRegex/", $headline, $markerMatches ) ) {
+ if ( preg_match( "/^$markerRegex/", $headline, $markerMatches ) ) {
$serial = $markerMatches[1];
list( $titleText, $sectionIndex ) = $this->mHeadings[$serial];
$isTemplate = ( $titleText != $baseTitleText );
@@ -4078,7 +4188,7 @@ class Parser {
# Increase TOC level
$toclevel++;
$sublevelCount[$toclevel] = 0;
- if ( $toclevel<$wgMaxTocLevel ) {
+ if ( $toclevel < $wgMaxTocLevel ) {
$prevtoclevel = $toclevel;
$toc .= Linker::tocIndent();
$numVisible++;
@@ -4100,7 +4210,7 @@ class Parser {
if ( $i == 0 ) {
$toclevel = 1;
}
- if ( $toclevel<$wgMaxTocLevel ) {
+ if ( $toclevel < $wgMaxTocLevel ) {
if ( $prevtoclevel < $wgMaxTocLevel ) {
# Unindent only if the previous toc level was shown :p
$toc .= Linker::tocUnindent( $prevtoclevel - $toclevel );
@@ -4111,7 +4221,7 @@ class Parser {
}
} else {
# No change in level, end TOC line
- if ( $toclevel<$wgMaxTocLevel ) {
+ if ( $toclevel < $wgMaxTocLevel ) {
$toc .= Linker::tocLineEnd();
}
}
@@ -4119,7 +4229,7 @@ class Parser {
$levelCount[$toclevel] = $level;
# count number of headlines for each level
- @$sublevelCount[$toclevel]++;
+ $sublevelCount[$toclevel]++;
$dot = 0;
for( $i = 1; $i <= $toclevel; $i++ ) {
if ( !empty( $sublevelCount[$i] ) ) {
@@ -4144,11 +4254,17 @@ class Parser {
$safeHeadline = $this->mStripState->unstripBoth( $safeHeadline );
# Strip out HTML (first regex removes any tag not allowed)
- # Allowed tags are <sup> and <sub> (bug 8393), <i> (bug 26375) and <b> (r105284)
- # We strip any parameter from accepted tags (second regex)
+ # Allowed tags are:
+ # * <sup> and <sub> (bug 8393)
+ # * <i> (bug 26375)
+ # * <b> (r105284)
+ # * <span dir="rtl"> and <span dir="ltr"> (bug 35167)
+ #
+ # We strip any parameter from accepted tags (second regex), except dir="rtl|ltr" from <span>,
+ # to allow setting directionality in toc items.
$tocline = preg_replace(
- array( '#<(?!/?(sup|sub|i|b)(?: [^>]*)?>).*?'.'>#', '#<(/?(sup|sub|i|b))(?: .*?)?'.'>#' ),
- array( '', '<$1>' ),
+ array( '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?'.'>#', '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?'.'>#' ),
+ array( '', '<$1>' ),
$safeHeadline
);
$tocline = trim( $tocline );
@@ -4269,9 +4385,9 @@ class Parser {
// We use a page and section attribute to stop the language converter from converting these important bits
// of data, but put the headline hint inside a content block because the language converter is supposed to
// be able to convert that piece of data.
- $editlink = '<mw:editsection page="' . htmlspecialchars($editlinkArgs[0]);
- $editlink .= '" section="' . htmlspecialchars($editlinkArgs[1]) .'"';
- if ( isset($editlinkArgs[2]) ) {
+ $editlink = '<mw:editsection page="' . htmlspecialchars( $editlinkArgs[0] );
+ $editlink .= '" section="' . htmlspecialchars( $editlinkArgs[1] ) . '"';
+ if ( isset( $editlinkArgs[2] ) ) {
$editlink .= '>' . $editlinkArgs[2] . '</mw:editsection>';
} else {
$editlink .= '/>';
@@ -4353,7 +4469,7 @@ class Parser {
* Transform wiki markup when saving a page by doing "\r\n" -> "\n"
* conversion, substitting signatures, {{subst:}} templates, etc.
*
- * @param $text String: the text to transform
+ * @param string $text the text to transform
* @param $title Title: the Title object for the current article
* @param $user User: the User object describing the current user
* @param $options ParserOptions: parsing options
@@ -4436,14 +4552,14 @@ class Parser {
'~~~' => $sigText
) );
- # Context links: [[|name]] and [[name (context)|]]
+ # Context links ("pipe tricks"): [[|name]] and [[name (context)|]]
$tc = '[' . Title::legalChars() . ']';
$nc = '[ _0-9A-Za-z\x80-\xff-]'; # Namespaces can use non-ascii!
- $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/"; # [[ns:page (context)|]]
- $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/"; # [[ns:page(context)|]]
- $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)((?:, |,)$tc+|)\\|]]/"; # [[ns:page (context), context|]]
- $p2 = "/\[\[\\|($tc+)]]/"; # [[|page]]
+ $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/"; # [[ns:page (context)|]]
+ $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/"; # [[ns:page(context)|]] (double-width brackets, added in r40257)
+ $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)((?:, |,)$tc+|)\\|]]/"; # [[ns:page (context), context|]] (using either single or double-width comma)
+ $p2 = "/\[\[\\|($tc+)]]/"; # [[|page]] (reverse pipe trick: add context from page title)
# try $p1 first, to turn "[[A, B (C)|]]" into "[[A, B (C)|A, B]]"
$text = preg_replace( $p1, '[[\\1\\2\\3|\\2]]', $text );
@@ -4476,7 +4592,7 @@ class Parser {
* as it may have changed if it's the $wgParser.
*
* @param $user User
- * @param $nickname String|bool nickname to use or false to use user's default nickname
+ * @param string|bool $nickname nickname to use or false to use user's default nickname
* @param $fancySig Boolean|null whether the nicknname is the complete signature
* or null to use default value
* @return string
@@ -4507,7 +4623,7 @@ class Parser {
} else {
# Failed to validate; fall back to the default
$nickname = $username;
- wfDebug( __METHOD__.": $username has bad XML tags in signature.\n" );
+ wfDebug( __METHOD__ . ": $username has bad XML tags in signature.\n" );
}
}
@@ -4539,7 +4655,7 @@ class Parser {
* 2) Substitute all transclusions
*
* @param $text String
- * @param $parsing bool Whether we're cleaning (preferences save) or parsing
+ * @param bool $parsing Whether we're cleaning (preferences save) or parsing
* @return String: signature text
*/
public function cleanSig( $text, $parsing = false ) {
@@ -4614,7 +4730,7 @@ class Parser {
/**
* Wrapper for preprocess()
*
- * @param $text String: the text to preprocess
+ * @param string $text the text to preprocess
* @param $options ParserOptions: options
* @param $title Title object or null to use $wgTitle
* @return String
@@ -4633,11 +4749,7 @@ class Parser {
global $wgTitle;
$title = $wgTitle;
}
- if ( !$title ) {
- # It's not uncommon having a null $wgTitle in scripts. See r80898
- # Create a ghost title in such case
- $title = Title::newFromText( 'Dwimmerlaik' );
- }
+
$text = $this->preprocess( $text, $title, $options );
$executing = false;
@@ -4666,6 +4778,7 @@ class Parser {
*
* @param $tag Mixed: the tag to use, e.g. 'hook' for "<hook>"
* @param $callback Mixed: the callback function (and object) to use for the tag
+ * @throws MWException
* @return Mixed|null The old value of the mTagHooks array associated with the hook
*/
public function setHook( $tag, $callback ) {
@@ -4696,6 +4809,7 @@ class Parser {
*
* @param $tag Mixed: the tag to use, e.g. 'hook' for "<hook>"
* @param $callback Mixed: the callback function (and object) to use for the tag
+ * @throws MWException
* @return Mixed|null The old value of the mTagHooks array associated with the hook
*/
function setTransparentTagHook( $tag, $callback ) {
@@ -4734,7 +4848,7 @@ class Parser {
* nowiki Wiki markup in the return value should be escaped
* isHTML The returned text is HTML, armour it against wikitext transformation
*
- * @param $id String: The magic word ID
+ * @param string $id The magic word ID
* @param $callback Mixed: the callback function (and object) to use
* @param $flags Integer: a combination of the following flags:
* SFH_NO_HASH No leading hash, i.e. {{plural:...}} instead of {{#if:...}}
@@ -4758,6 +4872,7 @@ class Parser {
* Please read the documentation in includes/parser/Preprocessor.php for more information
* about the methods available in PPFrame and PPNode.
*
+ * @throws MWException
* @return string|callback The old callback function for this name, if any
*/
public function setFunctionHook( $id, $callback, $flags = 0 ) {
@@ -4769,7 +4884,7 @@ class Parser {
# Add to function cache
$mw = MagicWord::get( $id );
if ( !$mw )
- throw new MWException( __METHOD__.'() expecting a magic word identifier.' );
+ throw new MWException( __METHOD__ . '() expecting a magic word identifier.' );
$synonyms = $mw->getSynonyms();
$sensitive = intval( $mw->isCaseSensitive() );
@@ -4805,6 +4920,10 @@ class Parser {
* Create a tag function, e.g. "<test>some stuff</test>".
* Unlike tag hooks, tag functions are parsed at preprocessor level.
* Unlike parser functions, their content is not preprocessed.
+ * @param $tag
+ * @param $callback
+ * @param $flags
+ * @throws MWException
* @return null
*/
function setFunctionTagHook( $tag, $callback, $flags ) {
@@ -4920,7 +5039,7 @@ class Parser {
// is defined for images in galleries
$matches[3] = $this->recursiveTagParse( trim( $matches[3] ) );
- $parameterMatches = StringUtils::explode('|', $matches[3]);
+ $parameterMatches = StringUtils::explode( '|', $matches[3] );
$magicWordAlt = MagicWord::get( 'img_alt' );
$magicWordLink = MagicWord::get( 'img_link' );
@@ -4928,14 +5047,18 @@ class Parser {
if ( $match = $magicWordAlt->matchVariableStartToEnd( $parameterMatch ) ) {
$alt = $this->stripAltText( $match, false );
}
- elseif( $match = $magicWordLink->matchVariableStartToEnd( $parameterMatch ) ){
- $link = strip_tags($this->replaceLinkHoldersText($match));
+ elseif( $match = $magicWordLink->matchVariableStartToEnd( $parameterMatch ) ) {
+ $linkValue = strip_tags( $this->replaceLinkHoldersText( $match ) );
$chars = self::EXT_LINK_URL_CLASS;
$prots = $this->mUrlProtocols;
//check to see if link matches an absolute url, if not then it must be a wiki link.
- if(!preg_match( "/^($prots)$chars+$/u", $link)){
- $localLinkTitle = Title::newFromText($link);
- $link = $localLinkTitle->getLocalURL();
+ if ( preg_match( "/^($prots)$chars+$/u", $linkValue ) ) {
+ $link = $linkValue;
+ } else {
+ $localLinkTitle = Title::newFromText( $linkValue );
+ if ( $localLinkTitle !== null ) {
+ $link = $localLinkTitle->getLocalURL();
+ }
}
}
else {
@@ -4947,7 +5070,7 @@ class Parser {
$label = substr( $label, 1 );
}
- $ig->add( $title, $label, $alt ,$link);
+ $ig->add( $title, $label, $alt, $link );
}
return $ig->toHTML();
}
@@ -4962,7 +5085,7 @@ class Parser {
} else {
$handlerClass = '';
}
- if ( !isset( $this->mImageParams[$handlerClass] ) ) {
+ if ( !isset( $this->mImageParams[$handlerClass] ) ) {
# Initialise static lists
static $internalParamNames = array(
'horizAlign' => array( 'left', 'right', 'center', 'none' ),
@@ -5180,7 +5303,7 @@ class Parser {
} else { # Inline image
if ( !isset( $params['frame']['alt'] ) ) {
# No alt text, use the "caption" for the alt text
- if ( $caption !== '') {
+ if ( $caption !== '' ) {
$params['frame']['alt'] = $this->stripAltText( $caption, $holders );
} else {
# No caption, fall back to using the filename for the
@@ -5303,8 +5426,8 @@ class Parser {
*
* External callers should use the getSection and replaceSection methods.
*
- * @param $text String: Page wikitext
- * @param $section String: a section identifier string of the form:
+ * @param string $text Page wikitext
+ * @param string $section a section identifier string of the form:
* "<flag1> - <flag2> - ... - <section number>"
*
* Currently the only recognised flag is "T", which means the target section number
@@ -5321,12 +5444,12 @@ class Parser {
* string. If $text is the empty string and section 0 is replaced, $newText is
* returned.
*
- * @param $mode String: one of "get" or "replace"
- * @param $newText String: replacement text for section data.
+ * @param string $mode one of "get" or "replace"
+ * @param string $newText replacement text for section data.
* @return String: for "get", the extracted section text.
* for "replace", the whole page with the section replaced.
*/
- private function extractSections( $text, $section, $mode, $newText='' ) {
+ private function extractSections( $text, $section, $mode, $newText = '' ) {
global $wgTitle; # not generally used but removes an ugly failure mode
$this->startParse( $wgTitle, new ParserOptions, self::OT_PLAIN, true );
$outText = '';
@@ -5442,12 +5565,12 @@ class Parser {
*
* If a section contains subsections, these are also returned.
*
- * @param $text String: text to look in
- * @param $section String: section identifier
- * @param $deftext String: default to return if section is not found
+ * @param string $text text to look in
+ * @param string $section section identifier
+ * @param string $deftext default to return if section is not found
* @return string text of the requested section
*/
- public function getSection( $text, $section, $deftext='' ) {
+ public function getSection( $text, $section, $deftext = '' ) {
return $this->extractSections( $text, $section, "get", $deftext );
}
@@ -5456,9 +5579,9 @@ class Parser {
* specified by $section has been replaced with $text. If the target
* section does not exist, $oldtext is returned unchanged.
*
- * @param $oldtext String: former text of the article
- * @param $section int section identifier
- * @param $text String: replacing text
+ * @param string $oldtext former text of the article
+ * @param int $section section identifier
+ * @param string $text replacing text
* @return String: modified text
*/
public function replaceSection( $oldtext, $section, $text ) {
@@ -5540,7 +5663,7 @@ class Parser {
/**
* Mutator for $mDefaultSort
*
- * @param $sort string New value
+ * @param string $sort New value
*/
public function setDefaultSort( $sort ) {
$this->mDefaultSort = $sort;
@@ -5596,7 +5719,7 @@ class Parser {
* instead. For use in redirects, since IE6 interprets Redirect: headers
* as something other than UTF-8 (apparently?), resulting in breakage.
*
- * @param $text String: The section name
+ * @param string $text The section name
* @return string An anchor
*/
public function guessLegacySectionNameFromWikiText( $text ) {
@@ -5616,7 +5739,7 @@ class Parser {
* to create valid section anchors by mimicing the output of the
* parser when headings are parsed.
*
- * @param $text String: text string to be stripped of wikitext
+ * @param string $text text string to be stripped of wikitext
* for use in a Section anchor
* @return string Filtered text string
*/
@@ -5767,12 +5890,13 @@ class Parser {
* If the $data array has been stored persistently, the caller should first
* check whether it is still valid, by calling isValidHalfParsedText().
*
- * @param $data array Serialized data
+ * @param array $data Serialized data
+ * @throws MWException
* @return String
*/
function unserializeHalfParsedText( $data ) {
if ( !isset( $data['version'] ) || $data['version'] != self::HALF_PARSED_VERSION ) {
- throw new MWException( __METHOD__.': invalid version' );
+ throw new MWException( __METHOD__ . ': invalid version' );
}
# First, extract the strip state.
diff --git a/includes/parser/ParserCache.php b/includes/parser/ParserCache.php
index 6a4ef0c5..0faa40a8 100644
--- a/includes/parser/ParserCache.php
+++ b/includes/parser/ParserCache.php
@@ -48,6 +48,7 @@ class ParserCache {
* May be a memcached client or a BagOStuff derivative.
*
* @param $memCached Object
+ * @throws MWException
*/
protected function __construct( $memCached ) {
if ( !$memCached ) {
@@ -66,7 +67,7 @@ class ParserCache {
// idhash seem to mean 'page id' + 'rendering hash' (r3710)
$pageid = $article->getID();
- $renderkey = (int)($wgRequest->getVal('action') == 'render');
+ $renderkey = (int)($wgRequest->getVal( 'action' ) == 'render');
$key = wfMemcKey( 'pcache', 'idhash', "{$pageid}-{$renderkey}!{$hash}" );
return $key;
@@ -200,8 +201,8 @@ class ParserCache {
wfDebug( "ParserOutput cache found.\n" );
- // The edit section preference may not be the appropiate one in
- // the ParserOutput, as we are not storing it in the parsercache
+ // The edit section preference may not be the appropiate one in
+ // the ParserOutput, as we are not storing it in the parsercache
// key. Force it here. See bug 31445.
$value->setEditSectionTokens( $popts->getEditSection() );
diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php
index 009b18a1..3eb83e36 100644
--- a/includes/parser/ParserOptions.php
+++ b/includes/parser/ParserOptions.php
@@ -29,67 +29,62 @@
* @ingroup Parser
*/
class ParserOptions {
-
- /**
- * Use DateFormatter to format dates
- */
- var $mUseDynamicDates;
-
+
/**
* Interlanguage links are removed and returned in an array
*/
var $mInterwikiMagic;
-
+
/**
* Allow external images inline?
*/
var $mAllowExternalImages;
-
+
/**
* If not, any exception?
*/
var $mAllowExternalImagesFrom;
-
+
/**
* If not or it doesn't match, should we check an on-wiki whitelist?
*/
var $mEnableImageWhitelist;
-
+
/**
* Date format index
*/
var $mDateFormat = null;
-
+
/**
* Create "edit section" links?
*/
var $mEditSection = true;
-
+
/**
* Allow inclusion of special pages?
*/
var $mAllowSpecialInclusion;
-
+
/**
* Use tidy to cleanup output HTML?
*/
var $mTidy = false;
-
+
/**
* Which lang to call for PLURAL and GRAMMAR
*/
var $mInterfaceMessage = false;
-
+
/**
* Overrides $mInterfaceMessage with arbitrary language
*/
var $mTargetLanguage = null;
-
+
/**
* Maximum size of template expansions, in bytes
*/
var $mMaxIncludeSize;
-
+
/**
* Maximum number of nodes touched by PPFrame::expand()
*/
@@ -99,56 +94,56 @@ class ParserOptions {
* Maximum number of nodes generated by Preprocessor::preprocessToObj()
*/
var $mMaxGeneratedPPNodeCount;
-
+
/**
* Maximum recursion depth in PPFrame::expand()
*/
var $mMaxPPExpandDepth;
-
+
/**
* Maximum recursion depth for templates within templates
*/
var $mMaxTemplateDepth;
-
+
/**
* Maximum number of calls per parse to expensive parser functions
*/
var $mExpensiveParserFunctionLimit;
-
+
/**
* Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS
*/
var $mRemoveComments = true;
-
+
/**
* Callback for template fetching. Used as first argument to call_user_func().
*/
var $mTemplateCallback =
array( 'Parser', 'statelessFetchTemplate' );
-
+
/**
* Enable limit report in an HTML comment on output
*/
var $mEnableLimitReport = false;
-
+
/**
* Timestamp used for {{CURRENTDAY}} etc.
*/
var $mTimestamp;
-
+
/**
* Target attribute for external links
*/
var $mExternalLinkTarget;
-
+
/**
- * Clean up signature texts?
+ * Clean up signature texts?
*
* 1) Strip ~~~, ~~~~ and ~~~~~ out of signatures
* 2) Substitute all transclusions
*/
var $mCleanSignatures;
-
+
/**
* Transform wiki markup when saving the page?
*/
@@ -168,43 +163,43 @@ class ParserOptions {
* Automatically number headings?
*/
var $mNumberHeadings;
-
+
/**
* User math preference (as integer). Not used (1.19)
*/
var $mMath;
-
+
/**
* Thumb size preferred by the user.
*/
var $mThumbSize;
-
+
/**
* Maximum article size of an article to be marked as "stub"
*/
private $mStubThreshold;
-
+
/**
* Language object of the User language.
*/
var $mUserLang;
/**
- * @var User
+ * @var User
* Stored user object
*/
var $mUser;
-
+
/**
* Parsing the page for a "preview" operation?
*/
var $mIsPreview = false;
-
+
/**
* Parsing the page for a "preview" operation on a single section?
*/
var $mIsSectionPreview = false;
-
+
/**
* Parsing the printable version of the page?
*/
@@ -220,7 +215,6 @@ class ParserOptions {
*/
protected $onAccessCallback = null;
- function getUseDynamicDates() { return $this->mUseDynamicDates; }
function getInterwikiMagic() { return $this->mInterwikiMagic; }
function getAllowExternalImages() { return $this->mAllowExternalImages; }
function getAllowExternalImagesFrom() { return $this->mAllowExternalImagesFrom; }
@@ -308,7 +302,6 @@ class ParserOptions {
return $this->getUserLangObj()->getCode();
}
- function setUseDynamicDates( $x ) { return wfSetVar( $this->mUseDynamicDates, $x ); }
function setInterwikiMagic( $x ) { return wfSetVar( $this->mInterwikiMagic, $x ); }
function setAllowExternalImages( $x ) { return wfSetVar( $this->mAllowExternalImages, $x ); }
function setAllowExternalImagesFrom( $x ) { return wfSetVar( $this->mAllowExternalImagesFrom, $x ); }
@@ -415,14 +408,14 @@ class ParserOptions {
return new ParserOptions( $context->getUser(), $context->getLanguage() );
}
- /**
- * Get user options
+ /**
+ * Get user options
*
* @param $user User object
* @param $lang Language object
*/
private function initialiseFromUser( $user, $lang ) {
- global $wgUseDynamicDates, $wgInterwikiMagic, $wgAllowExternalImages,
+ global $wgInterwikiMagic, $wgAllowExternalImages,
$wgAllowExternalImagesFrom, $wgEnableImageWhitelist, $wgAllowSpecialInclusion,
$wgMaxArticleSize, $wgMaxPPNodeCount, $wgMaxTemplateDepth, $wgMaxPPExpandDepth,
$wgCleanSignatures, $wgExternalLinkTarget, $wgExpensiveParserFunctionLimit,
@@ -430,7 +423,6 @@ class ParserOptions {
wfProfileIn( __METHOD__ );
- $this->mUseDynamicDates = $wgUseDynamicDates;
$this->mInterwikiMagic = $wgInterwikiMagic;
$this->mAllowExternalImages = $wgAllowExternalImages;
$this->mAllowExternalImagesFrom = $wgAllowExternalImagesFrom;
@@ -481,12 +473,7 @@ class ParserOptions {
* @return array
*/
public static function legacyOptions() {
- global $wgUseDynamicDates;
- $legacyOpts = array( 'math', 'stubthreshold', 'numberheadings', 'userlang', 'thumbsize', 'editsection', 'printable' );
- if ( $wgUseDynamicDates ) {
- $legacyOpts[] = 'dateformat';
- }
- return $legacyOpts;
+ return array( 'math', 'stubthreshold', 'numberheadings', 'userlang', 'thumbsize', 'editsection', 'printable' );
}
/**
@@ -518,14 +505,13 @@ class ParserOptions {
$confstr .= '*';
}
-
// Space assigned for the stubthreshold but unused
// since it disables the parser cache, its value will always
// be 0 when this function is called by parsercache.
if ( in_array( 'stubthreshold', $forOptions ) ) {
$confstr .= '!' . $this->mStubThreshold;
} else {
- $confstr .= '!*' ;
+ $confstr .= '!*';
}
if ( in_array( 'dateformat', $forOptions ) ) {
diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php
index 41b4a385..db649f11 100644
--- a/includes/parser/ParserOutput.php
+++ b/includes/parser/ParserOutput.php
@@ -50,7 +50,8 @@ class ParserOutput extends CacheTime {
$mTimestamp; # Timestamp of the revision
private $mIndexPolicy = ''; # 'index' or 'noindex'? Any other value will result in no change.
private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
- private $mSecondaryDataUpdates = array(); # List of instances of SecondaryDataObject(), used to cause some information extracted from the page in a custom place.
+ private $mSecondaryDataUpdates = array(); # List of DataUpdate, used to save info from the page somewhere else.
+ private $mExtensionData = array(); # extra data used by extensions
const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
@@ -75,18 +76,20 @@ class ParserOutput extends CacheTime {
/**
* callback used by getText to replace editsection tokens
* @private
+ * @param $m
+ * @throws MWException
* @return mixed
*/
function replaceEditSectionLinksCallback( $m ) {
global $wgOut, $wgLang;
$args = array(
- htmlspecialchars_decode($m[1]),
- htmlspecialchars_decode($m[2]),
- isset($m[4]) ? $m[3] : null,
+ htmlspecialchars_decode( $m[1] ),
+ htmlspecialchars_decode( $m[2] ),
+ isset( $m[4] ) ? $m[3] : null,
);
$args[0] = Title::newFromText( $args[0] );
- if ( !is_object($args[0]) ) {
- throw new MWException("Bad parser output text.");
+ if ( !is_object( $args[0] ) ) {
+ throw new MWException( "Bad parser output text." );
}
$args[] = $wgLang->getCode();
$skin = $wgOut->getSkin();
@@ -150,11 +153,35 @@ class ParserOutput extends CacheTime {
return (bool)$this->mNewSection;
}
+ /**
+ * Checks, if a url is pointing to the own server
+ *
+ * @param string $internal the server to check against
+ * @param string $url the url to check
+ * @return bool
+ */
+ static function isLinkInternal( $internal, $url ) {
+ return (bool)preg_match( '/^' .
+ # If server is proto relative, check also for http/https links
+ ( substr( $internal, 0, 2 ) === '//' ? '(?:https?:)?' : '' ) .
+ preg_quote( $internal, '/' ) .
+ # check for query/path/anchor or end of link in each case
+ '(?:[\?\/\#]|$)/i',
+ $url
+ );
+ }
+
function addExternalLink( $url ) {
# We don't register links pointing to our own server, unless... :-)
global $wgServer, $wgRegisterInternalExternals;
- if( $wgRegisterInternalExternals or stripos($url,$wgServer.'/')!==0)
+
+ $registerExternalLink = true;
+ if( !$wgRegisterInternalExternals ) {
+ $registerExternalLink = !self::isLinkInternal( $wgServer, $url );
+ }
+ if( $registerExternalLink ) {
$this->mExternalLinks[$url] = 1;
+ }
}
/**
@@ -163,7 +190,7 @@ class ParserOutput extends CacheTime {
* @param $title Title object
* @param $id Mixed: optional known page_id so we can skip the lookup
*/
- function addLink( $title, $id = null ) {
+ function addLink( Title $title, $id = null ) {
if ( $title->isExternal() ) {
// Don't record interwikis in pagelinks
$this->addInterwikiLink( $title );
@@ -193,9 +220,9 @@ class ParserOutput extends CacheTime {
/**
* Register a file dependency for this output
- * @param $name string Title dbKey
- * @param $timestamp string MW timestamp of file creation (or false if non-existing)
- * @param $sha1 string base 36 SHA-1 of file (or false if non-existing)
+ * @param string $name Title dbKey
+ * @param string $timestamp MW timestamp of file creation (or false if non-existing)
+ * @param string $sha1 base 36 SHA-1 of file (or false if non-existing)
* @return void
*/
function addImage( $name, $timestamp = null, $sha1 = null ) {
@@ -234,7 +261,7 @@ class ParserOutput extends CacheTime {
if( $prefix == '' ) {
throw new MWException( 'Non-interwiki link passed, internal parser error.' );
}
- if (!isset($this->mInterwikiLinks[$prefix])) {
+ if ( !isset( $this->mInterwikiLinks[$prefix] ) ) {
$this->mInterwikiLinks[$prefix] = array();
}
$this->mInterwikiLinks[$prefix][$title->getDBkey()] = 1;
@@ -288,7 +315,7 @@ class ParserOutput extends CacheTime {
* -- this is assumed to have been validated
* (check equal normalisation, etc.)
*
- * @param $text String: desired title text
+ * @param string $text desired title text
*/
public function setDisplayTitle( $text ) {
$this->setTitleText( $text );
@@ -320,13 +347,67 @@ class ParserOutput extends CacheTime {
}
/**
- * Set a property to be cached in the DB
+ * Set a property to be stored in the page_props database table.
+ *
+ * page_props is a key value store indexed by the page ID. This allows
+ * the parser to set a property on a page which can then be quickly
+ * retrieved given the page ID or via a DB join when given the page
+ * title.
+ *
+ * setProperty() is thus used to propagate properties from the parsed
+ * page to request contexts other than a page view of the currently parsed
+ * article.
+ *
+ * Some applications examples:
+ *
+ * * To implement hidden categories, hiding pages from category listings
+ * by storing a property.
+ *
+ * * Overriding the displayed article title.
+ * @see ParserOutput::setDisplayTitle()
+ *
+ * * To implement image tagging, for example displaying an icon on an
+ * image thumbnail to indicate that it is listed for deletion on
+ * Wikimedia Commons.
+ * This is not actually implemented, yet but would be pretty cool.
+ *
+ * @note: Do not use setProperty() to set a property which is only used
+ * in a context where the ParserOutput object itself is already available,
+ * for example a normal page view. There is no need to save such a property
+ * in the database since it the text is already parsed. You can just hook
+ * OutputPageParserOutput and get your data out of the ParserOutput object.
+ *
+ * If you are writing an extension where you want to set a property in the
+ * parser which is used by an OutputPageParserOutput hook, you have to
+ * associate the extension data directly with the ParserOutput object.
+ * Since MediaWiki 1.21, you can use setExtensionData() to do this:
+ *
+ * @par Example:
+ * @code
+ * $parser->getOutput()->setExtensionData( 'my_ext_foo', '...' );
+ * @endcode
+ *
+ * And then later, in OutputPageParserOutput or similar:
+ *
+ * @par Example:
+ * @code
+ * $output->getExtensionData( 'my_ext_foo' );
+ * @endcode
+ *
+ * In MediaWiki 1.20 and older, you have to use a custom member variable
+ * within the ParserOutput object:
+ *
+ * @par Example:
+ * @code
+ * $parser->getOutput()->my_ext_foo = '...';
+ * @endcode
+ *
*/
public function setProperty( $name, $value ) {
$this->mProperties[$name] = $value;
}
- public function getProperty( $name ){
+ public function getProperty( $name ) {
return isset( $this->mProperties[$name] ) ? $this->mProperties[$name] : false;
}
@@ -337,26 +418,25 @@ class ParserOutput extends CacheTime {
return $this->mProperties;
}
-
/**
* Returns the options from its ParserOptions which have been taken
* into account to produce this output or false if not available.
* @return mixed Array
*/
- public function getUsedOptions() {
+ public function getUsedOptions() {
if ( !isset( $this->mAccessedOptions ) ) {
return array();
}
return array_keys( $this->mAccessedOptions );
- }
+ }
- /**
- * Callback passed by the Parser to the ParserOptions to keep track of which options are used.
- * @access private
- */
- function recordOption( $option ) {
- $this->mAccessedOptions[$option] = true;
- }
+ /**
+ * Callback passed by the Parser to the ParserOptions to keep track of which options are used.
+ * @access private
+ */
+ function recordOption( $option ) {
+ $this->mAccessedOptions[$option] = true;
+ }
/**
* Adds an update job to the output. Any update jobs added to the output will eventually bexecuted in order to
@@ -375,9 +455,13 @@ class ParserOutput extends CacheTime {
* extracted from the page's content, including a LinksUpdate object for all links stored in
* this ParserOutput object.
*
+ * @note: Avoid using this method directly, use ContentHandler::getSecondaryDataUpdates() instead! The content
+ * handler may provide additional update objects.
+ *
* @since 1.20
*
- * @param $title Title of the page we're updating. If not given, a title object will be created based on $this->getTitleText()
+ * @param $title Title The title of the page we're updating. If not given, a title object will be created
+ * based on $this->getTitleText()
* @param $recursive Boolean: queue jobs for recursive updates?
*
* @return Array. An array of instances of DataUpdate
@@ -389,13 +473,75 @@ class ParserOutput extends CacheTime {
$linksUpdate = new LinksUpdate( $title, $this, $recursive );
- if ( $this->mSecondaryDataUpdates === array() ) {
- return array( $linksUpdate );
+ return array_merge( $this->mSecondaryDataUpdates, array( $linksUpdate ) );
+ }
+
+ /**
+ * Attaches arbitrary data to this ParserObject. This can be used to store some information in
+ * the ParserOutput object for later use during page output. The data will be cached along with
+ * the ParserOutput object, but unlike data set using setProperty(), it is not recorded in the
+ * database.
+ *
+ * This method is provided to overcome the unsafe practice of attaching extra information to a
+ * ParserObject by directly assigning member variables.
+ *
+ * To use setExtensionData() to pass extension information from a hook inside the parser to a
+ * hook in the page output, use this in the parser hook:
+ *
+ * @par Example:
+ * @code
+ * $parser->getOutput()->setExtensionData( 'my_ext_foo', '...' );
+ * @endcode
+ *
+ * And then later, in OutputPageParserOutput or similar:
+ *
+ * @par Example:
+ * @code
+ * $output->getExtensionData( 'my_ext_foo' );
+ * @endcode
+ *
+ * In MediaWiki 1.20 and older, you have to use a custom member variable
+ * within the ParserOutput object:
+ *
+ * @par Example:
+ * @code
+ * $parser->getOutput()->my_ext_foo = '...';
+ * @endcode
+ *
+ * @since 1.21
+ *
+ * @param string $key The key for accessing the data. Extensions should take care to avoid
+ * conflicts in naming keys. It is suggested to use the extension's name as a
+ * prefix.
+ *
+ * @param mixed $value The value to set. Setting a value to null is equivalent to removing
+ * the value.
+ */
+ public function setExtensionData( $key, $value ) {
+ if ( $value === null ) {
+ unset( $this->mExtensionData[$key] );
} else {
- $updates = array_merge( $this->mSecondaryDataUpdates, array( $linksUpdate ) );
+ $this->mExtensionData[$key] = $value;
}
+ }
- return $updates;
- }
+ /**
+ * Gets extensions data previously attached to this ParserOutput using setExtensionData().
+ * Typically, such data would be set while parsing the page, e.g. by a parser function.
+ *
+ * @since 1.21
+ *
+ * @param string $key The key to look up.
+ *
+ * @return mixed The value previously set for the given key using setExtensionData( $key ),
+ * or null if no value was set for this key.
+ */
+ public function getExtensionData( $key ) {
+ if ( isset( $this->mExtensionData[$key] ) ) {
+ return $this->mExtensionData[$key];
+ }
+
+ return null;
+ }
}
diff --git a/includes/parser/Parser_LinkHooks.php b/includes/parser/Parser_LinkHooks.php
index 6bcc324d..b2cdc41a 100644
--- a/includes/parser/Parser_LinkHooks.php
+++ b/includes/parser/Parser_LinkHooks.php
@@ -32,7 +32,7 @@ class Parser_LinkHooks extends Parser {
* can automatically discard old data.
*/
const VERSION = '1.6.4';
-
+
# Flags for Parser::setLinkHook
# Also available as global constants from Defines.php
const SLH_PATTERN = 1;
@@ -84,11 +84,11 @@ class Parser_LinkHooks extends Parser {
* Create a link hook, e.g. [[Namepsace:...|display}}
* The callback function should have the form:
* function myLinkCallback( $parser, $holders, $markers,
- * Title $title, $titleText, &$sortText = null, &$leadingColon = false ) { ... }
+ * Title $title, $titleText, &$sortText = null, &$leadingColon = false ) { ... }
*
* Or with SLH_PATTERN:
* function myLinkCallback( $parser, $holders, $markers, )
- * &$titleText, &$sortText = null, &$leadingColon = false ) { ... }
+ * &$titleText, &$sortText = null, &$leadingColon = false ) { ... }
*
* The callback may either return a number of different possible values:
* String) Text result of the link
@@ -100,18 +100,19 @@ class Parser_LinkHooks extends Parser {
* @param $flags Integer: a combination of the following flags:
* SLH_PATTERN Use a regex link pattern rather than a namespace
*
+ * @throws MWException
* @return callback|null The old callback function for this name, if any
*/
public function setLinkHook( $ns, $callback, $flags = 0 ) {
if( $flags & SLH_PATTERN && !is_string($ns) )
- throw new MWException( __METHOD__.'() expecting a regex string pattern.' );
- elseif( $flags | ~SLH_PATTERN && !is_int($ns) )
- throw new MWException( __METHOD__.'() expecting a namespace index.' );
+ throw new MWException( __METHOD__ . '() expecting a regex string pattern.' );
+ elseif( $flags | ~SLH_PATTERN && !is_int( $ns ) )
+ throw new MWException( __METHOD__ . '() expecting a namespace index.' );
$oldVal = isset( $this->mLinkHooks[$ns] ) ? $this->mLinkHooks[$ns][0] : null;
$this->mLinkHooks[$ns] = array( $callback, $flags );
return $oldVal;
}
-
+
/**
* Get all registered link hook identifiers
*
@@ -120,9 +121,11 @@ class Parser_LinkHooks extends Parser {
function getLinkHooks() {
return array_keys( $this->mLinkHooks );
}
-
+
/**
* Process [[ ]] wikilinks
+ * @param $s
+ * @throws MWException
* @return LinkHolderArray
*
* @private
@@ -130,8 +133,8 @@ class Parser_LinkHooks extends Parser {
function replaceInternalLinks2( &$s ) {
wfProfileIn( __METHOD__ );
- wfProfileIn( __METHOD__.'-setup' );
- static $tc = FALSE, $titleRegex;//$e1, $e1_img;
+ wfProfileIn( __METHOD__ . '-setup' );
+ static $tc = false, $titleRegex; //$e1, $e1_img;
if( !$tc ) {
# the % is needed to support urlencoded titles as well
$tc = Title::legalChars() . '#%';
@@ -144,15 +147,15 @@ class Parser_LinkHooks extends Parser {
}
$holders = new LinkHolderArray( $this );
-
+
if( is_null( $this->mTitle ) ) {
+ wfProfileOut( __METHOD__ . '-setup' );
wfProfileOut( __METHOD__ );
- wfProfileOut( __METHOD__.'-setup' );
- throw new MWException( __METHOD__.": \$this->mTitle is null\n" );
+ throw new MWException( __METHOD__ . ": \$this->mTitle is null\n" );
}
- wfProfileOut( __METHOD__.'-setup' );
-
+ wfProfileOut( __METHOD__ . '-setup' );
+
$offset = 0;
$offsetStack = array();
$markers = new LinkMarkerReplacer( $this, $holders, array( &$this, 'replaceInternalLinksCallback' ) );
@@ -164,7 +167,7 @@ class Parser_LinkHooks extends Parser {
# Determine if the bracket is a starting or ending bracket
# When we find both, use the first one
elseif( $startBracketOffset !== false && $endBracketOffset !== false )
- $isStart = $startBracketOffset <= $endBracketOffset;
+ $isStart = $startBracketOffset <= $endBracketOffset;
# When we only found one, check which it is
else $isStart = $startBracketOffset !== false;
$bracketOffset = $isStart ? $startBracketOffset : $endBracketOffset;
@@ -175,26 +178,26 @@ class Parser_LinkHooks extends Parser {
} else {
/** Closing bracket **/
# Pop the start pos for our current link zone off the stack
- $startBracketOffset = array_pop($offsetStack);
+ $startBracketOffset = array_pop( $offsetStack );
# Just to clean up the code, lets place offsets on the outer ends
$endBracketOffset += 2;
-
+
# Only do logic if we actually have a opening bracket for this
- if( isset($startBracketOffset) ) {
+ if( isset( $startBracketOffset ) ) {
# Extract text inside the link
- @list( $titleText, $paramText ) = explode('|',
- substr($s, $startBracketOffset+2, $endBracketOffset-$startBracketOffset-4), 2);
+ @list( $titleText, $paramText ) = explode( '|',
+ substr( $s, $startBracketOffset + 2, $endBracketOffset - $startBracketOffset - 4 ), 2 );
# Create markers only for valid links
if( preg_match( $titleRegex, $titleText ) ) {
# Store the text for the marker
- $marker = $markers->addMarker($titleText, $paramText);
+ $marker = $markers->addMarker( $titleText, $paramText );
# Replace the current link with the marker
- $s = substr($s,0,$startBracketOffset).
- $marker.
- substr($s, $endBracketOffset);
+ $s = substr( $s, 0, $startBracketOffset ) .
+ $marker .
+ substr( $s, $endBracketOffset );
# We have modified $s, because of this we need to set the
# offset manually since the end position is different now
- $offset = $startBracketOffset+strlen($marker);
+ $offset = $startBracketOffset+strlen( $marker );
continue;
}
# ToDo: Some LinkHooks may allow recursive links inside of
@@ -203,55 +206,55 @@ class Parser_LinkHooks extends Parser {
# ToDO: Some LinkHooks use patterns rather than namespaces
# these need to be tested at this point here
}
-
}
# Bump our offset to after our current bracket
$offset = $bracketOffset+2;
}
-
-
+
# Now expand our tree
- wfProfileIn( __METHOD__.'-expand' );
+ wfProfileIn( __METHOD__ . '-expand' );
$s = $markers->expand( $s );
- wfProfileOut( __METHOD__.'-expand' );
-
+ wfProfileOut( __METHOD__ . '-expand' );
+
wfProfileOut( __METHOD__ );
return $holders;
}
-
+
function replaceInternalLinksCallback( $parser, $holders, $markers, $titleText, $paramText ) {
wfProfileIn( __METHOD__ );
- $wt = isset($paramText) ? "[[$titleText|$paramText]]" : "[[$titleText]]";
- wfProfileIn( __METHOD__."-misc" );
+ $wt = isset( $paramText ) ? "[[$titleText|$paramText]]" : "[[$titleText]]";
+ wfProfileIn( __METHOD__ . "-misc" );
+
# Don't allow internal links to pages containing
# PROTO: where PROTO is a valid URL protocol; these
# should be external links.
- if( preg_match('/^\b(?i:' . wfUrlProtocols() . ')/', $titleText) ) {
+ if( preg_match( '/^\b(?i:' . wfUrlProtocols() . ')/', $titleText ) ) {
+ wfProfileOut( __METHOD__ . "-misc" );
wfProfileOut( __METHOD__ );
return $wt;
}
-
+
# Make subpage if necessary
if( $this->areSubpagesAllowed() ) {
$titleText = $this->maybeDoSubpageLink( $titleText, $paramText );
}
-
+
# Check for a leading colon and strip it if it is there
$leadingColon = $titleText[0] == ':';
if( $leadingColon ) $titleText = substr( $titleText, 1 );
-
- wfProfileOut( __METHOD__."-misc" );
+
+ wfProfileOut( __METHOD__ . "-misc" );
# Make title object
- wfProfileIn( __METHOD__."-title" );
+ wfProfileIn( __METHOD__ . "-title" );
$title = Title::newFromText( $this->mStripState->unstripNoWiki( $titleText ) );
if( !$title ) {
- wfProfileOut( __METHOD__."-title" );
+ wfProfileOut( __METHOD__ . "-title" );
wfProfileOut( __METHOD__ );
return $wt;
}
$ns = $title->getNamespace();
- wfProfileOut( __METHOD__."-title" );
-
+ wfProfileOut( __METHOD__ . "-title" );
+
# Default for Namespaces is a default link
# ToDo: Default for patterns is plain wikitext
$return = true;
@@ -270,25 +273,25 @@ class Parser_LinkHooks extends Parser {
}
if( $return === true ) {
# True (treat as plain link) was returned, call the defaultLinkHook
- $return = CoreLinkFunctions::defaultLinkHook( $parser, $holders, $markers, $title,
+ $return = CoreLinkFunctions::defaultLinkHook( $parser, $holders, $markers, $title,
$titleText, $paramText, $leadingColon );
}
if( $return === false ) {
# False (no link) was returned, output plain wikitext
# Build it again as the hook is allowed to modify $paramText
- $return = isset($paramText) ? "[[$titleText|$paramText]]" : "[[$titleText]]";
+ $return = isset( $paramText ) ? "[[$titleText|$paramText]]" : "[[$titleText]]";
}
# Content was returned, return it
wfProfileOut( __METHOD__ );
return $return;
}
-
+
}
class LinkMarkerReplacer {
-
+
protected $markers, $nextId, $parser, $holders, $callback;
-
+
function __construct( $parser, $holders, $callback ) {
$this->nextId = 0;
$this->markers = array();
@@ -296,29 +299,28 @@ class LinkMarkerReplacer {
$this->holders = $holders;
$this->callback = $callback;
}
-
- function addMarker($titleText, $paramText) {
+
+ function addMarker( $titleText, $paramText ) {
$id = $this->nextId++;
$this->markers[$id] = array( $titleText, $paramText );
return "<!-- LINKMARKER $id -->";
}
-
+
function findMarker( $string ) {
- return (bool) preg_match('/<!-- LINKMARKER [0-9]+ -->/', $string );
+ return (bool) preg_match( '/<!-- LINKMARKER [0-9]+ -->/', $string );
}
-
+
function expand( $string ) {
return StringUtils::delimiterReplaceCallback( "<!-- LINKMARKER ", " -->", array( &$this, 'callback' ), $string );
}
-
+
function callback( $m ) {
- $id = intval($m[1]);
- if( !array_key_exists($id, $this->markers) ) return $m[0];
+ $id = intval( $m[1] );
+ if( !array_key_exists( $id, $this->markers ) ) return $m[0];
$args = $this->markers[$id];
array_unshift( $args, $this );
array_unshift( $args, $this->holders );
array_unshift( $args, $this->parser );
return call_user_func_array( $this->callback, $args );
}
-
}
diff --git a/includes/parser/Preprocessor.php b/includes/parser/Preprocessor.php
index bd13f9ae..aeacd2e1 100644
--- a/includes/parser/Preprocessor.php
+++ b/includes/parser/Preprocessor.php
@@ -84,9 +84,9 @@ interface PPFrame {
/**
* Create a child frame
*
- * @param $args array
- * @param $title Title
- * @param $indexOffset A number subtracted from the index attributes of the arguments
+ * @param array $args
+ * @param Title $title
+ * @param int $indexOffset A number subtracted from the index attributes of the arguments
*
* @return PPFrame
*/
@@ -205,7 +205,6 @@ interface PPNode {
*/
function getChildrenOfType( $type );
-
/**
* Returns the length of the array, or false if this is not an array-type node
*/
diff --git a/includes/parser/Preprocessor_DOM.php b/includes/parser/Preprocessor_DOM.php
index 34de0ba5..d0c57ab5 100644
--- a/includes/parser/Preprocessor_DOM.php
+++ b/includes/parser/Preprocessor_DOM.php
@@ -110,7 +110,7 @@ class Preprocessor_DOM implements Preprocessor {
* Preprocess some wikitext and return the document tree.
* This is the ghost of Parser::replace_variables().
*
- * @param $text String: the text to parse
+ * @param string $text the text to parse
* @param $flags Integer: bitwise combination of:
* Parser::PTD_FOR_INCLUSION Handle "<noinclude>" and "<includeonly>" as if the text is being
* included. Default is to assume a direct page view.
@@ -126,6 +126,7 @@ class Preprocessor_DOM implements Preprocessor {
* cache may be implemented at a later date which takes further advantage of these strict
* dependency requirements.
*
+ * @throws MWException
* @return PPNode_DOM
*/
function preprocessToObj( $text, $flags = 0 ) {
@@ -136,9 +137,9 @@ class Preprocessor_DOM implements Preprocessor {
$cacheable = ( $wgPreprocessorCacheThreshold !== false
&& strlen( $text ) > $wgPreprocessorCacheThreshold );
if ( $cacheable ) {
- wfProfileIn( __METHOD__.'-cacheable' );
+ wfProfileIn( __METHOD__ . '-cacheable' );
- $cacheKey = wfMemcKey( 'preprocess-xml', md5($text), $flags );
+ $cacheKey = wfMemcKey( 'preprocess-xml', md5( $text ), $flags );
$cacheValue = $wgMemc->get( $cacheKey );
if ( $cacheValue ) {
$version = substr( $cacheValue, 0, 8 );
@@ -151,11 +152,11 @@ class Preprocessor_DOM implements Preprocessor {
}
if ( $xml === false ) {
if ( $cacheable ) {
- wfProfileIn( __METHOD__.'-cache-miss' );
+ wfProfileIn( __METHOD__ . '-cache-miss' );
$xml = $this->preprocessToXml( $text, $flags );
$cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . $xml;
$wgMemc->set( $cacheKey, $cacheValue, 86400 );
- wfProfileOut( __METHOD__.'-cache-miss' );
+ wfProfileOut( __METHOD__ . '-cache-miss' );
wfDebugLog( "Preprocessor", "Saved preprocessor XML to memcached (key $cacheKey)" );
} else {
$xml = $this->preprocessToXml( $text, $flags );
@@ -164,14 +165,14 @@ class Preprocessor_DOM implements Preprocessor {
}
// Fail if the number of elements exceeds acceptable limits
- // Do not attempt to generate the DOM
+ // Do not attempt to generate the DOM
$this->parser->mGeneratedPPNodeCount += substr_count( $xml, '<' );
$max = $this->parser->mOptions->getMaxGeneratedPPNodeCount();
if ( $this->parser->mGeneratedPPNodeCount > $max ) {
- throw new MWException( __METHOD__.': generated node count limit exceeded' );
+ throw new MWException( __METHOD__ . ': generated node count limit exceeded' );
}
- wfProfileIn( __METHOD__.'-loadXML' );
+ wfProfileIn( __METHOD__ . '-loadXML' );
$dom = new DOMDocument;
wfSuppressWarnings();
$result = $dom->loadXML( $xml );
@@ -182,13 +183,13 @@ class Preprocessor_DOM implements Preprocessor {
// 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
$result = $dom->loadXML( $xml, 1 << 19 );
if ( !$result ) {
- throw new MWException( __METHOD__.' generated invalid XML' );
+ throw new MWException( __METHOD__ . ' generated invalid XML' );
}
}
$obj = new PPNode_DOM( $dom->documentElement );
- wfProfileOut( __METHOD__.'-loadXML' );
+ wfProfileOut( __METHOD__ . '-loadXML' );
if ( $cacheable ) {
- wfProfileOut( __METHOD__.'-cacheable' );
+ wfProfileOut( __METHOD__ . '-cacheable' );
}
wfProfileOut( __METHOD__ );
return $obj;
@@ -396,7 +397,7 @@ class Preprocessor_DOM implements Preprocessor {
if ( $stack->top ) {
$part = $stack->top->getCurrentPart();
- if ( ! (isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 )) {
+ if ( !(isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 )) {
$part->visualEnd = $wsStart;
}
// Else comments abutting, no change in visual end
@@ -521,7 +522,7 @@ class Preprocessor_DOM implements Preprocessor {
if ( $equalsLength > 0 ) {
if ( $searchStart - $equalsLength == $piece->startPos ) {
// This is just a single string of equals signs on its own line
- // Replicate the doHeadings behaviour /={count}(.+)={count}/
+ // Replicate the doHeadings behavior /={count}(.+)={count}/
// First find out how many equals signs there really are (don't stop at 6)
$count = $equalsLength;
if ( $count < 3 ) {
@@ -657,19 +658,13 @@ class Preprocessor_DOM implements Preprocessor {
$piece->parts = array( new PPDPart );
$piece->count -= $matchingCount;
# do we still qualify for any callback with remaining count?
- $names = $rules[$piece->open]['names'];
- $skippedBraces = 0;
- $enclosingAccum =& $accum;
- while ( $piece->count ) {
- if ( array_key_exists( $piece->count, $names ) ) {
- $stack->push( $piece );
- $accum =& $stack->getAccum();
- break;
- }
- --$piece->count;
- $skippedBraces ++;
+ $min = $rules[$piece->open]['min'];
+ if ( $piece->count >= $min ) {
+ $stack->push( $piece );
+ $accum =& $stack->getAccum();
+ } else {
+ $accum .= str_repeat( $piece->open, $piece->count );
}
- $enclosingAccum .= str_repeat( $piece->open, $skippedBraces );
}
$flags = $stack->getFlags();
extract( $flags );
@@ -757,7 +752,7 @@ class PPDStack {
function pop() {
if ( !count( $this->stack ) ) {
- throw new MWException( __METHOD__.': no elements remaining' );
+ throw new MWException( __METHOD__ . ': no elements remaining' );
}
$temp = array_pop( $this->stack );
@@ -796,8 +791,8 @@ class PPDStack {
* @ingroup Parser
*/
class PPDStackElement {
- var $open, // Opening character (\n for heading)
- $close, // Matching closing character
+ var $open, // Opening character (\n for heading)
+ $close, // Matching closing character
$count, // Number of opening characters found (number of "=" for heading)
$parts, // Array of PPDPart objects describing pipe-separated parts.
$lineStart; // True if the open char appeared at the start of the input line. Not set for headings.
@@ -814,7 +809,7 @@ class PPDStackElement {
}
function &getAccum() {
- return $this->parts[count($this->parts) - 1]->out;
+ return $this->parts[count( $this->parts ) - 1]->out;
}
function addPart( $s = '' ) {
@@ -823,7 +818,7 @@ class PPDStackElement {
}
function getCurrentPart() {
- return $this->parts[count($this->parts) - 1];
+ return $this->parts[count( $this->parts ) - 1];
}
/**
@@ -916,7 +911,6 @@ class PPFrame_DOM implements PPFrame {
*/
var $depth;
-
/**
* Construct a new preprocessor frame.
* @param $preprocessor Preprocessor The parent preprocessor
@@ -1117,7 +1111,7 @@ class PPFrame_DOM implements PPFrame {
}
# Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
# Not in RECOVER_COMMENTS mode (extractSections) though
- elseif ( $this->parser->ot['wiki'] && ! ( $flags & PPFrame::RECOVER_COMMENTS ) ) {
+ elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
$out .= $this->parser->insertStripItem( $contextNode->textContent );
}
# Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
@@ -1174,7 +1168,7 @@ class PPFrame_DOM implements PPFrame {
}
} else {
wfProfileOut( __METHOD__ );
- throw new MWException( __METHOD__.': Invalid parameter type' );
+ throw new MWException( __METHOD__ . ': Invalid parameter type' );
}
if ( $newIterator !== false ) {
@@ -1458,25 +1452,25 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
function getArguments() {
$arguments = array();
foreach ( array_merge(
- array_keys($this->numberedArgs),
- array_keys($this->namedArgs)) as $key ) {
- $arguments[$key] = $this->getArgument($key);
+ array_keys( $this->numberedArgs ),
+ array_keys( $this->namedArgs ) ) as $key ) {
+ $arguments[$key] = $this->getArgument( $key );
}
return $arguments;
}
function getNumberedArguments() {
$arguments = array();
- foreach ( array_keys($this->numberedArgs) as $key ) {
- $arguments[$key] = $this->getArgument($key);
+ foreach ( array_keys( $this->numberedArgs ) as $key ) {
+ $arguments[$key] = $this->getArgument( $key );
}
return $arguments;
}
function getNamedArguments() {
$arguments = array();
- foreach ( array_keys($this->namedArgs) as $key ) {
- $arguments[$key] = $this->getArgument($key);
+ foreach ( array_keys( $this->namedArgs ) as $key ) {
+ $arguments[$key] = $this->getArgument( $key );
}
return $arguments;
}
@@ -1673,6 +1667,7 @@ class PPNode_DOM implements PPNode {
* - index String index
* - value PPNode value
*
+ * @throws MWException
* @return array
*/
function splitArg() {
@@ -1694,6 +1689,7 @@ class PPNode_DOM implements PPNode {
* Split an "<ext>" node into an associative array containing name, attr, inner and close
* All values in the resulting array are PPNodes. Inner and close are optional.
*
+ * @throws MWException
* @return array
*/
function splitExt() {
@@ -1719,6 +1715,7 @@ class PPNode_DOM implements PPNode {
/**
* Split a "<h>" node
+ * @throws MWException
* @return array
*/
function splitHeading() {
diff --git a/includes/parser/Preprocessor_Hash.php b/includes/parser/Preprocessor_Hash.php
index 4f04c865..fad1adbb 100644
--- a/includes/parser/Preprocessor_Hash.php
+++ b/includes/parser/Preprocessor_Hash.php
@@ -89,7 +89,7 @@ class Preprocessor_Hash implements Preprocessor {
* Preprocess some wikitext and return the document tree.
* This is the ghost of Parser::replace_variables().
*
- * @param $text String: the text to parse
+ * @param string $text the text to parse
* @param $flags Integer: bitwise combination of:
* Parser::PTD_FOR_INCLUSION Handle "<noinclude>" and "<includeonly>" as if the text is being
* included. Default is to assume a direct page view.
@@ -105,6 +105,7 @@ class Preprocessor_Hash implements Preprocessor {
* cache may be implemented at a later date which takes further advantage of these strict
* dependency requirements.
*
+ * @throws MWException
* @return PPNode_Hash_Tree
*/
function preprocessToObj( $text, $flags = 0 ) {
@@ -115,9 +116,9 @@ class Preprocessor_Hash implements Preprocessor {
$cacheable = $wgPreprocessorCacheThreshold !== false && strlen( $text ) > $wgPreprocessorCacheThreshold;
if ( $cacheable ) {
- wfProfileIn( __METHOD__.'-cacheable' );
+ wfProfileIn( __METHOD__ . '-cacheable' );
- $cacheKey = wfMemcKey( 'preprocess-hash', md5($text), $flags );
+ $cacheKey = wfMemcKey( 'preprocess-hash', md5( $text ), $flags );
$cacheValue = $wgMemc->get( $cacheKey );
if ( $cacheValue ) {
$version = substr( $cacheValue, 0, 8 );
@@ -126,12 +127,12 @@ class Preprocessor_Hash implements Preprocessor {
// From the cache
wfDebugLog( "Preprocessor",
"Loaded preprocessor hash from memcached (key $cacheKey)" );
- wfProfileOut( __METHOD__.'-cacheable' );
+ wfProfileOut( __METHOD__ . '-cacheable' );
wfProfileOut( __METHOD__ );
return $hash;
}
}
- wfProfileIn( __METHOD__.'-cache-miss' );
+ wfProfileIn( __METHOD__ . '-cache-miss' );
}
$rules = array(
@@ -331,7 +332,7 @@ class Preprocessor_Hash implements Preprocessor {
if ( $stack->top ) {
$part = $stack->top->getCurrentPart();
- if ( ! (isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 )) {
+ if ( !(isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 )) {
$part->visualEnd = $wsStart;
}
// Else comments abutting, no change in visual end
@@ -390,7 +391,7 @@ class Preprocessor_Hash implements Preprocessor {
}
// <includeonly> and <noinclude> just become <ignore> tags
if ( in_array( $lowerName, $ignoredElements ) ) {
- $accum->addNodeWithText( 'ignore', substr( $text, $tagStartPos, $i - $tagStartPos ) );
+ $accum->addNodeWithText( 'ignore', substr( $text, $tagStartPos, $i - $tagStartPos ) );
continue;
}
@@ -461,7 +462,7 @@ class Preprocessor_Hash implements Preprocessor {
if ( $equalsLength > 0 ) {
if ( $searchStart - $equalsLength == $piece->startPos ) {
// This is just a single string of equals signs on its own line
- // Replicate the doHeadings behaviour /={count}(.+)={count}/
+ // Replicate the doHeadings behavior /={count}(.+)={count}/
// First find out how many equals signs there really are (don't stop at 6)
$count = $equalsLength;
if ( $count < 3 ) {
@@ -548,7 +549,7 @@ class Preprocessor_Hash implements Preprocessor {
}
}
- if ($matchingCount <= 0) {
+ if ( $matchingCount <= 0 ) {
# No matching element found in callback array
# Output a literal closing brace and continue
$accum->addLiteral( str_repeat( $curChar, $count ) );
@@ -590,10 +591,10 @@ class Preprocessor_Hash implements Preprocessor {
$lastNode = $node;
}
if ( !$node ) {
- throw new MWException( __METHOD__. ': eqpos not found' );
+ throw new MWException( __METHOD__ . ': eqpos not found' );
}
if ( $node->name !== 'equals' ) {
- throw new MWException( __METHOD__ .': eqpos is not equals' );
+ throw new MWException( __METHOD__ . ': eqpos is not equals' );
}
$equalsNode = $node;
@@ -638,23 +639,17 @@ class Preprocessor_Hash implements Preprocessor {
$accum =& $stack->getAccum();
# Re-add the old stack element if it still has unmatched opening characters remaining
- if ($matchingCount < $piece->count) {
+ if ( $matchingCount < $piece->count ) {
$piece->parts = array( new PPDPart_Hash );
$piece->count -= $matchingCount;
# do we still qualify for any callback with remaining count?
- $names = $rules[$piece->open]['names'];
- $skippedBraces = 0;
- $enclosingAccum =& $accum;
- while ( $piece->count ) {
- if ( array_key_exists( $piece->count, $names ) ) {
- $stack->push( $piece );
- $accum =& $stack->getAccum();
- break;
- }
- --$piece->count;
- $skippedBraces ++;
+ $min = $rules[$piece->open]['min'];
+ if ( $piece->count >= $min ) {
+ $stack->push( $piece );
+ $accum =& $stack->getAccum();
+ } else {
+ $accum->addLiteral( str_repeat( $piece->open, $piece->count ) );
}
- $enclosingAccum->addLiteral( str_repeat( $piece->open, $skippedBraces ) );
}
extract( $stack->getFlags() );
@@ -695,11 +690,11 @@ class Preprocessor_Hash implements Preprocessor {
$rootNode->lastChild = $stack->rootAccum->lastNode;
// Cache
- if ($cacheable) {
+ if ( $cacheable ) {
$cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . serialize( $rootNode );
$wgMemc->set( $cacheKey, $cacheValue, 86400 );
- wfProfileOut( __METHOD__.'-cache-miss' );
- wfProfileOut( __METHOD__.'-cacheable' );
+ wfProfileOut( __METHOD__ . '-cache-miss' );
+ wfProfileOut( __METHOD__ . '-cacheable' );
wfDebugLog( "Preprocessor", "Saved preprocessor Hash to memcached (key $cacheKey)" );
}
@@ -866,7 +861,6 @@ class PPFrame_Hash implements PPFrame {
*/
var $depth;
-
/**
* Construct a new preprocessor frame.
* @param $preprocessor Preprocessor: the parent preprocessor
@@ -884,9 +878,11 @@ class PPFrame_Hash implements PPFrame {
* Create a new child frame
* $args is optionally a multi-root PPNode or array containing the template arguments
*
- * @param $args PPNode_Hash_Array|array
+ * @param array|bool|\PPNode_Hash_Array $args PPNode_Hash_Array|array
* @param $title Title|bool
*
+ * @param int $indexOffset
+ * @throws MWException
* @return PPTemplateFrame_Hash
*/
function newChild( $args = false, $title = false, $indexOffset = 0 ) {
@@ -1035,7 +1031,7 @@ class PPFrame_Hash implements PPFrame {
}
# Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
# Not in RECOVER_COMMENTS mode (extractSections) though
- elseif ( $this->parser->ot['wiki'] && ! ( $flags & PPFrame::RECOVER_COMMENTS ) ) {
+ elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
$out .= $this->parser->insertStripItem( $contextNode->firstChild->value );
}
# Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
@@ -1082,7 +1078,7 @@ class PPFrame_Hash implements PPFrame {
$newIterator = $contextNode->getChildren();
}
} else {
- throw new MWException( __METHOD__.': Invalid parameter type' );
+ throw new MWException( __METHOD__ . ': Invalid parameter type' );
}
if ( $newIterator !== false ) {
@@ -1371,9 +1367,9 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
function getArguments() {
$arguments = array();
foreach ( array_merge(
- array_keys($this->numberedArgs),
- array_keys($this->namedArgs)) as $key ) {
- $arguments[$key] = $this->getArgument($key);
+ array_keys( $this->numberedArgs ),
+ array_keys( $this->namedArgs ) ) as $key ) {
+ $arguments[$key] = $this->getArgument( $key );
}
return $arguments;
}
@@ -1383,8 +1379,8 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
*/
function getNumberedArguments() {
$arguments = array();
- foreach ( array_keys($this->numberedArgs) as $key ) {
- $arguments[$key] = $this->getArgument($key);
+ foreach ( array_keys( $this->numberedArgs ) as $key ) {
+ $arguments[$key] = $this->getArgument( $key );
}
return $arguments;
}
@@ -1394,8 +1390,8 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
*/
function getNamedArguments() {
$arguments = array();
- foreach ( array_keys($this->namedArgs) as $key ) {
- $arguments[$key] = $this->getArgument($key);
+ foreach ( array_keys( $this->namedArgs ) as $key ) {
+ $arguments[$key] = $this->getArgument( $key );
}
return $arguments;
}
@@ -1609,6 +1605,7 @@ class PPNode_Hash_Tree implements PPNode {
* - index String index
* - value PPNode value
*
+ * @throws MWException
* @return array
*/
function splitArg() {
@@ -1642,6 +1639,7 @@ class PPNode_Hash_Tree implements PPNode {
* Split an "<ext>" node into an associative array containing name, attr, inner and close
* All values in the resulting array are PPNodes. Inner and close are optional.
*
+ * @throws MWException
* @return array
*/
function splitExt() {
@@ -1669,6 +1667,7 @@ class PPNode_Hash_Tree implements PPNode {
/**
* Split an "<h>" node
*
+ * @throws MWException
* @return array
*/
function splitHeading() {
@@ -1695,6 +1694,7 @@ class PPNode_Hash_Tree implements PPNode {
/**
* Split a "<template>" or "<tplarg>" node
*
+ * @throws MWException
* @return array
*/
function splitTemplate() {
diff --git a/includes/parser/Preprocessor_HipHop.hphp b/includes/parser/Preprocessor_HipHop.hphp
deleted file mode 100644
index 8b71a1b5..00000000
--- a/includes/parser/Preprocessor_HipHop.hphp
+++ /dev/null
@@ -1,2013 +0,0 @@
-<?php
-/**
- * A preprocessor optimised for HipHop, using HipHop-specific syntax.
- * vim: ft=php
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Parser
- */
-
-/**
- * @ingroup Parser
- */
-class Preprocessor_HipHop implements Preprocessor {
- /**
- * @var Parser
- */
- var $parser;
-
- const CACHE_VERSION = 1;
-
- /**
- * @param $parser Parser
- */
- function __construct( $parser ) {
- $this->parser = $parser;
- }
-
- /**
- * @return PPFrame_HipHop
- */
- function newFrame() {
- return new PPFrame_HipHop( $this );
- }
-
- /**
- * @param $args array
- * @return PPCustomFrame_HipHop
- */
- function newCustomFrame( $args ) {
- return new PPCustomFrame_HipHop( $this, $args );
- }
-
- /**
- * @param $values array
- * @return PPNode_HipHop_Array
- */
- function newPartNodeArray( $values ) {
- $list = array();
-
- foreach ( $values as $k => $val ) {
- $partNode = new PPNode_HipHop_Tree( 'part' );
- $nameNode = new PPNode_HipHop_Tree( 'name' );
-
- if ( is_int( $k ) ) {
- $nameNode->addChild( new PPNode_HipHop_Attr( 'index', $k ) );
- $partNode->addChild( $nameNode );
- } else {
- $nameNode->addChild( new PPNode_HipHop_Text( $k ) );
- $partNode->addChild( $nameNode );
- $partNode->addChild( new PPNode_HipHop_Text( '=' ) );
- }
-
- $valueNode = new PPNode_HipHop_Tree( 'value' );
- $valueNode->addChild( new PPNode_HipHop_Text( $val ) );
- $partNode->addChild( $valueNode );
-
- $list[] = $partNode;
- }
-
- $node = new PPNode_HipHop_Array( $list );
- return $node;
- }
-
- /**
- * Preprocess some wikitext and return the document tree.
- * This is the ghost of Parser::replace_variables().
- *
- * @param $text String: the text to parse
- * @param $flags Integer: bitwise combination of:
- * Parser::PTD_FOR_INCLUSION Handle <noinclude>/<includeonly> as if the text is being
- * included. Default is to assume a direct page view.
- *
- * The generated DOM tree must depend only on the input text and the flags.
- * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
- *
- * Any flag added to the $flags parameter here, or any other parameter liable to cause a
- * change in the DOM tree for a given text, must be passed through the section identifier
- * in the section edit link and thus back to extractSections().
- *
- * The output of this function is currently only cached in process memory, but a persistent
- * cache may be implemented at a later date which takes further advantage of these strict
- * dependency requirements.
- *
- * @throws MWException
- * @return PPNode_HipHop_Tree
- */
- function preprocessToObj( $text, $flags = 0 ) {
- wfProfileIn( __METHOD__ );
-
- // Check cache.
- global $wgMemc, $wgPreprocessorCacheThreshold;
-
- $lengthText = strlen( $text );
-
- $cacheable = ($wgPreprocessorCacheThreshold !== false && $lengthText > $wgPreprocessorCacheThreshold);
- if ( $cacheable ) {
- wfProfileIn( __METHOD__.'-cacheable' );
-
- $cacheKey = strval( wfMemcKey( 'preprocess-hash', md5($text), $flags ) );
- $cacheValue = strval( $wgMemc->get( $cacheKey ) );
- if ( $cacheValue !== '' ) {
- $version = substr( $cacheValue, 0, 8 );
- if ( intval( $version ) == self::CACHE_VERSION ) {
- $hash = unserialize( substr( $cacheValue, 8 ) );
- // From the cache
- wfDebugLog( "Preprocessor",
- "Loaded preprocessor hash from memcached (key $cacheKey)" );
- wfProfileOut( __METHOD__.'-cacheable' );
- wfProfileOut( __METHOD__ );
- return $hash;
- }
- }
- wfProfileIn( __METHOD__.'-cache-miss' );
- }
-
- $rules = array(
- '{' => array(
- 'end' => '}',
- 'names' => array(
- 2 => 'template',
- 3 => 'tplarg',
- ),
- 'min' => 2,
- 'max' => 3,
- ),
- '[' => array(
- 'end' => ']',
- 'names' => array( 2 => 'LITERAL' ),
- 'min' => 2,
- 'max' => 2,
- )
- );
-
- $forInclusion = (bool)( $flags & Parser::PTD_FOR_INCLUSION );
-
- $xmlishElements = (array)$this->parser->getStripList();
- $enableOnlyinclude = false;
- if ( $forInclusion ) {
- $ignoredTags = array( 'includeonly', '/includeonly' );
- $ignoredElements = array( 'noinclude' );
- $xmlishElements[] = 'noinclude';
- if ( strpos( $text, '<onlyinclude>' ) !== false && strpos( $text, '</onlyinclude>' ) !== false ) {
- $enableOnlyinclude = true;
- }
- } else if ( $this->parser->ot['wiki'] ) {
- $ignoredTags = array( 'noinclude', '/noinclude', 'onlyinclude', '/onlyinclude', 'includeonly', '/includeonly' );
- $ignoredElements = array();
- } else {
- $ignoredTags = array( 'noinclude', '/noinclude', 'onlyinclude', '/onlyinclude' );
- $ignoredElements = array( 'includeonly' );
- $xmlishElements[] = 'includeonly';
- }
- $xmlishRegex = implode( '|', array_merge( $xmlishElements, $ignoredTags ) );
-
- // Use "A" modifier (anchored) instead of "^", because ^ doesn't work with an offset
- $elementsRegex = "~($xmlishRegex)(?:\s|\/>|>)|(!--)~iA";
-
- $stack = new PPDStack_HipHop;
-
- $searchBase = "[{<\n";
- $revText = strrev( $text ); // For fast reverse searches
-
- $i = 0; # Input pointer, starts out pointing to a pseudo-newline before the start
- $accum = $stack->getAccum(); # Current accumulator
- $headingIndex = 1;
- $stackFlags = array(
- 'findPipe' => false, # True to take notice of pipe characters
- 'findEquals' => false, # True to find equals signs in arguments
- 'inHeading' => false, # True if $i is inside a possible heading
- );
- $noMoreGT = false; # True if there are no more greater-than (>) signs right of $i
- $findOnlyinclude = $enableOnlyinclude; # True to ignore all input up to the next <onlyinclude>
- $fakeLineStart = true; # Do a line-start run without outputting an LF character
-
- while ( true ) {
- //$this->memCheck();
-
- if ( $findOnlyinclude ) {
- // Ignore all input up to the next <onlyinclude>
- $variantStartPos = strpos( $text, '<onlyinclude>', $i );
- if ( $variantStartPos === false ) {
- // Ignored section runs to the end
- $accum->addNodeWithText( 'ignore', strval( substr( $text, $i ) ) );
- break;
- }
- $startPos1 = intval( $variantStartPos );
- $tagEndPos = $startPos1 + strlen( '<onlyinclude>' ); // past-the-end
- $accum->addNodeWithText( 'ignore', strval( substr( $text, $i, $tagEndPos - $i ) ) );
- $i = $tagEndPos;
- $findOnlyinclude = false;
- }
-
- if ( $fakeLineStart ) {
- $found = 'line-start';
- $curChar = '';
- } else {
- # Find next opening brace, closing brace or pipe
- $search = $searchBase;
- if ( $stack->top === false ) {
- $currentClosing = '';
- } else {
- $currentClosing = strval( $stack->getTop()->close );
- $search .= $currentClosing;
- }
- if ( $stackFlags['findPipe'] ) {
- $search .= '|';
- }
- if ( $stackFlags['findEquals'] ) {
- // First equals will be for the template
- $search .= '=';
- }
- $rule = null;
- # Output literal section, advance input counter
- $literalLength = intval( strcspn( $text, $search, $i ) );
- if ( $literalLength > 0 ) {
- $accum->addLiteral( strval( substr( $text, $i, $literalLength ) ) );
- $i += $literalLength;
- }
- if ( $i >= $lengthText ) {
- if ( $currentClosing === "\n" ) {
- // Do a past-the-end run to finish off the heading
- $curChar = '';
- $found = 'line-end';
- } else {
- # All done
- break;
- }
- } else {
- $curChar = $text[$i];
- if ( $curChar === '|' ) {
- $found = 'pipe';
- } elseif ( $curChar === '=' ) {
- $found = 'equals';
- } elseif ( $curChar === '<' ) {
- $found = 'angle';
- } elseif ( $curChar === "\n" ) {
- if ( $stackFlags['inHeading'] ) {
- $found = 'line-end';
- } else {
- $found = 'line-start';
- }
- } elseif ( $curChar === $currentClosing ) {
- $found = 'close';
- } elseif ( isset( $rules[$curChar] ) ) {
- $found = 'open';
- $rule = $rules[$curChar];
- } else {
- # Some versions of PHP have a strcspn which stops on null characters
- # Ignore and continue
- ++$i;
- continue;
- }
- }
- }
-
- if ( $found === 'angle' ) {
- $matches = false;
- // Handle </onlyinclude>
- if ( $enableOnlyinclude
- && substr( $text, $i, strlen( '</onlyinclude>' ) ) === '</onlyinclude>' )
- {
- $findOnlyinclude = true;
- continue;
- }
-
- // Determine element name
- if ( !preg_match( $elementsRegex, $text, $matches, 0, $i + 1 ) ) {
- // Element name missing or not listed
- $accum->addLiteral( '<' );
- ++$i;
- continue;
- }
- // Handle comments
- if ( isset( $matches[2] ) && $matches[2] === '!--' ) {
- // To avoid leaving blank lines, when a comment is both preceded
- // and followed by a newline (ignoring spaces), trim leading and
- // trailing spaces and one of the newlines.
-
- // Find the end
- $variantEndPos = strpos( $text, '-->', $i + 4 );
- if ( $variantEndPos === false ) {
- // Unclosed comment in input, runs to end
- $inner = strval( substr( $text, $i ) );
- $accum->addNodeWithText( 'comment', $inner );
- $i = $lengthText;
- } else {
- $endPos = intval( $variantEndPos );
- // Search backwards for leading whitespace
- if ( $i ) {
- $wsStart = $i - intval( strspn( $revText, ' ', $lengthText - $i ) );
- } else {
- $wsStart = 0;
- }
- // Search forwards for trailing whitespace
- // $wsEnd will be the position of the last space (or the '>' if there's none)
- $wsEnd = $endPos + 2 + intval( strspn( $text, ' ', $endPos + 3 ) );
- // Eat the line if possible
- // TODO: This could theoretically be done if $wsStart == 0, i.e. for comments at
- // the overall start. That's not how Sanitizer::removeHTMLcomments() did it, but
- // it's a possible beneficial b/c break.
- if ( $wsStart > 0 && substr( $text, $wsStart - 1, 1 ) === "\n"
- && substr( $text, $wsEnd + 1, 1 ) === "\n" )
- {
- $startPos2 = $wsStart;
- $endPos = $wsEnd + 1;
- // Remove leading whitespace from the end of the accumulator
- // Sanity check first though
- $wsLength = $i - $wsStart;
- if ( $wsLength > 0
- && $accum->lastNode instanceof PPNode_HipHop_Text
- && substr( $accum->lastNode->value, -$wsLength ) === str_repeat( ' ', $wsLength ) )
- {
- $accum->lastNode->value = strval( substr( $accum->lastNode->value, 0, -$wsLength ) );
- }
- // Do a line-start run next time to look for headings after the comment
- $fakeLineStart = true;
- } else {
- // No line to eat, just take the comment itself
- $startPos2 = $i;
- $endPos += 2;
- }
-
- if ( $stack->top ) {
- $part = $stack->getTop()->getCurrentPart();
- if ( ! (isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 )) {
- $part->visualEnd = $wsStart;
- }
- // Else comments abutting, no change in visual end
- $part->commentEnd = $endPos;
- }
- $i = $endPos + 1;
- $inner = strval( substr( $text, $startPos2, $endPos - $startPos2 + 1 ) );
- $accum->addNodeWithText( 'comment', $inner );
- }
- continue;
- }
- $name = strval( $matches[1] );
- $lowerName = strtolower( $name );
- $attrStart = $i + strlen( $name ) + 1;
-
- // Find end of tag
- $variantTagEndPos = $noMoreGT ? false : strpos( $text, '>', $attrStart );
- if ( $variantTagEndPos === false ) {
- // Infinite backtrack
- // Disable tag search to prevent worst-case O(N^2) performance
- $noMoreGT = true;
- $accum->addLiteral( '<' );
- ++$i;
- continue;
- }
- $tagEndPos = intval( $variantTagEndPos );
-
- // Handle ignored tags
- if ( in_array( $lowerName, $ignoredTags ) ) {
- $accum->addNodeWithText( 'ignore', strval( substr( $text, $i, $tagEndPos - $i + 1 ) ) );
- $i = $tagEndPos + 1;
- continue;
- }
-
- $tagStartPos = $i;
- $close = '';
- if ( $text[$tagEndPos-1] === '/' ) {
- // Short end tag
- $attrEnd = $tagEndPos - 1;
- $shortEnd = true;
- $inner = '';
- $i = $tagEndPos + 1;
- $haveClose = false;
- } else {
- $attrEnd = $tagEndPos;
- $shortEnd = false;
- // Find closing tag
- if ( preg_match( "/<\/" . preg_quote( $name, '/' ) . "\s*>/i",
- $text, $matches, PREG_OFFSET_CAPTURE, $tagEndPos + 1 ) )
- {
- $inner = strval( substr( $text, $tagEndPos + 1, $matches[0][1] - $tagEndPos - 1 ) );
- $i = intval( $matches[0][1] ) + strlen( $matches[0][0] );
- $close = strval( $matches[0][0] );
- $haveClose = true;
- } else {
- // No end tag -- let it run out to the end of the text.
- $inner = strval( substr( $text, $tagEndPos + 1 ) );
- $i = $lengthText;
- $haveClose = false;
- }
- }
- // <includeonly> and <noinclude> just become <ignore> tags
- if ( in_array( $lowerName, $ignoredElements ) ) {
- $accum->addNodeWithText( 'ignore', strval( substr( $text, $tagStartPos, $i - $tagStartPos ) ) );
- continue;
- }
-
- if ( $attrEnd <= $attrStart ) {
- $attr = '';
- } else {
- // Note that the attr element contains the whitespace between name and attribute,
- // this is necessary for precise reconstruction during pre-save transform.
- $attr = strval( substr( $text, $attrStart, $attrEnd - $attrStart ) );
- }
-
- $extNode = new PPNode_HipHop_Tree( 'ext' );
- $extNode->addChild( PPNode_HipHop_Tree::newWithText( 'name', $name ) );
- $extNode->addChild( PPNode_HipHop_Tree::newWithText( 'attr', $attr ) );
- if ( !$shortEnd ) {
- $extNode->addChild( PPNode_HipHop_Tree::newWithText( 'inner', $inner ) );
- }
- if ( $haveClose ) {
- $extNode->addChild( PPNode_HipHop_Tree::newWithText( 'close', $close ) );
- }
- $accum->addNode( $extNode );
- }
-
- elseif ( $found === 'line-start' ) {
- // Is this the start of a heading?
- // Line break belongs before the heading element in any case
- if ( $fakeLineStart ) {
- $fakeLineStart = false;
- } else {
- $accum->addLiteral( $curChar );
- $i++;
- }
-
- $count = intval( strspn( $text, '=', $i, 6 ) );
- if ( $count == 1 && $stackFlags['findEquals'] ) {
- // DWIM: This looks kind of like a name/value separator
- // Let's let the equals handler have it and break the potential heading
- // This is heuristic, but AFAICT the methods for completely correct disambiguation are very complex.
- } elseif ( $count > 0 ) {
- $partData = array(
- 'open' => "\n",
- 'close' => "\n",
- 'parts' => array( new PPDPart_HipHop( str_repeat( '=', $count ) ) ),
- 'startPos' => $i,
- 'count' => $count );
- $stack->push( $partData );
- $accum = $stack->getAccum();
- $stackFlags = $stack->getFlags();
- $i += $count;
- }
- } elseif ( $found === 'line-end' ) {
- $piece = $stack->getTop();
- // A heading must be open, otherwise \n wouldn't have been in the search list
- assert( $piece->open === "\n" ); // Passing the assert condition directly instead of string, as
- // HPHP /compiler/ chokes on strings when ASSERT_ACTIVE != 0.
- $part = $piece->getCurrentPart();
- // Search back through the input to see if it has a proper close
- // Do this using the reversed string since the other solutions (end anchor, etc.) are inefficient
- $wsLength = intval( strspn( $revText, " \t", $lengthText - $i ) );
- $searchStart = $i - $wsLength;
- if ( isset( $part->commentEnd ) && $searchStart - 1 == $part->commentEnd ) {
- // Comment found at line end
- // Search for equals signs before the comment
- $searchStart = intval( $part->visualEnd );
- $searchStart -= intval( strspn( $revText, " \t", $lengthText - $searchStart ) );
- }
- $count = intval( $piece->count );
- $equalsLength = intval( strspn( $revText, '=', $lengthText - $searchStart ) );
- $isTreeNode = false;
- $resultAccum = $accum;
- if ( $equalsLength > 0 ) {
- if ( $searchStart - $equalsLength == $piece->startPos ) {
- // This is just a single string of equals signs on its own line
- // Replicate the doHeadings behaviour /={count}(.+)={count}/
- // First find out how many equals signs there really are (don't stop at 6)
- $count = $equalsLength;
- if ( $count < 3 ) {
- $count = 0;
- } else {
- $count = intval( ( $count - 1 ) / 2 );
- if ( $count > 6 ) {
- $count = 6;
- }
- }
- } else {
- if ( $count > $equalsLength ) {
- $count = $equalsLength;
- }
- }
- if ( $count > 0 ) {
- // Normal match, output <h>
- $tree = new PPNode_HipHop_Tree( 'possible-h' );
- $tree->addChild( new PPNode_HipHop_Attr( 'level', $count ) );
- $tree->addChild( new PPNode_HipHop_Attr( 'i', $headingIndex++ ) );
- $tree->lastChild->nextSibling = $accum->firstNode;
- $tree->lastChild = $accum->lastNode;
- $isTreeNode = true;
- } else {
- // Single equals sign on its own line, count=0
- // Output $resultAccum
- }
- } else {
- // No match, no <h>, just pass down the inner text
- // Output $resultAccum
- }
- // Unwind the stack
- $stack->pop();
- $accum = $stack->getAccum();
- $stackFlags = $stack->getFlags();
-
- // Append the result to the enclosing accumulator
- if ( $isTreeNode ) {
- $accum->addNode( $tree );
- } else {
- $accum->addAccum( $resultAccum );
- }
- // Note that we do NOT increment the input pointer.
- // This is because the closing linebreak could be the opening linebreak of
- // another heading. Infinite loops are avoided because the next iteration MUST
- // hit the heading open case above, which unconditionally increments the
- // input pointer.
- } elseif ( $found === 'open' ) {
- # count opening brace characters
- $count = intval( strspn( $text, $curChar, $i ) );
-
- # we need to add to stack only if opening brace count is enough for one of the rules
- if ( $count >= $rule['min'] ) {
- # Add it to the stack
- $partData = array(
- 'open' => $curChar,
- 'close' => $rule['end'],
- 'count' => $count,
- 'lineStart' => ($i == 0 || $text[$i-1] === "\n"),
- );
-
- $stack->push( $partData );
- $accum = $stack->getAccum();
- $stackFlags = $stack->getFlags();
- } else {
- # Add literal brace(s)
- $accum->addLiteral( str_repeat( $curChar, $count ) );
- }
- $i += $count;
- } elseif ( $found === 'close' ) {
- $piece = $stack->getTop();
- # lets check if there are enough characters for closing brace
- $maxCount = intval( $piece->count );
- $count = intval( strspn( $text, $curChar, $i, $maxCount ) );
-
- # check for maximum matching characters (if there are 5 closing
- # characters, we will probably need only 3 - depending on the rules)
- $rule = $rules[$piece->open];
- if ( $count > $rule['max'] ) {
- # The specified maximum exists in the callback array, unless the caller
- # has made an error
- $matchingCount = intval( $rule['max'] );
- } else {
- # Count is less than the maximum
- # Skip any gaps in the callback array to find the true largest match
- # Need to use array_key_exists not isset because the callback can be null
- $matchingCount = $count;
- while ( $matchingCount > 0 && !array_key_exists( $matchingCount, $rule['names'] ) ) {
- --$matchingCount;
- }
- }
-
- if ($matchingCount <= 0) {
- # No matching element found in callback array
- # Output a literal closing brace and continue
- $accum->addLiteral( str_repeat( $curChar, $count ) );
- $i += $count;
- continue;
- }
- $name = strval( $rule['names'][$matchingCount] );
- $isTreeNode = false;
- if ( $name === 'LITERAL' ) {
- // No element, just literal text
- $resultAccum = $piece->breakSyntax( $matchingCount );
- $resultAccum->addLiteral( str_repeat( $rule['end'], $matchingCount ) );
- } else {
- # Create XML element
- # Note: $parts is already XML, does not need to be encoded further
- $isTreeNode = true;
- $parts = $piece->parts;
- $titleAccum = PPDAccum_HipHop::cast( $parts[0]->out );
- unset( $parts[0] );
-
- $tree = new PPNode_HipHop_Tree( $name );
-
- # The invocation is at the start of the line if lineStart is set in
- # the stack, and all opening brackets are used up.
- if ( $maxCount == $matchingCount && !empty( $piece->lineStart ) ) {
- $tree->addChild( new PPNode_HipHop_Attr( 'lineStart', 1 ) );
- }
- $titleNode = new PPNode_HipHop_Tree( 'title' );
- $titleNode->firstChild = $titleAccum->firstNode;
- $titleNode->lastChild = $titleAccum->lastNode;
- $tree->addChild( $titleNode );
- $argIndex = 1;
- foreach ( $parts as $variantPart ) {
- $part = PPDPart_HipHop::cast( $variantPart );
- if ( isset( $part->eqpos ) ) {
- // Find equals
- $lastNode = false;
- for ( $node = $part->out->firstNode; $node; $node = $node->nextSibling ) {
- if ( $node === $part->eqpos ) {
- break;
- }
- $lastNode = $node;
- }
- if ( !$node ) {
- throw new MWException( __METHOD__. ': eqpos not found' );
- }
- if ( $node->name !== 'equals' ) {
- throw new MWException( __METHOD__ .': eqpos is not equals' );
- }
- $equalsNode = $node;
-
- // Construct name node
- $nameNode = new PPNode_HipHop_Tree( 'name' );
- if ( $lastNode !== false ) {
- $lastNode->nextSibling = false;
- $nameNode->firstChild = $part->out->firstNode;
- $nameNode->lastChild = $lastNode;
- }
-
- // Construct value node
- $valueNode = new PPNode_HipHop_Tree( 'value' );
- if ( $equalsNode->nextSibling !== false ) {
- $valueNode->firstChild = $equalsNode->nextSibling;
- $valueNode->lastChild = $part->out->lastNode;
- }
- $partNode = new PPNode_HipHop_Tree( 'part' );
- $partNode->addChild( $nameNode );
- $partNode->addChild( $equalsNode->firstChild );
- $partNode->addChild( $valueNode );
- $tree->addChild( $partNode );
- } else {
- $partNode = new PPNode_HipHop_Tree( 'part' );
- $nameNode = new PPNode_HipHop_Tree( 'name' );
- $nameNode->addChild( new PPNode_HipHop_Attr( 'index', $argIndex++ ) );
- $valueNode = new PPNode_HipHop_Tree( 'value' );
- $valueNode->firstChild = $part->out->firstNode;
- $valueNode->lastChild = $part->out->lastNode;
- $partNode->addChild( $nameNode );
- $partNode->addChild( $valueNode );
- $tree->addChild( $partNode );
- }
- }
- }
-
- # Advance input pointer
- $i += $matchingCount;
-
- # Unwind the stack
- $stack->pop();
- $accum = $stack->getAccum();
-
- # Re-add the old stack element if it still has unmatched opening characters remaining
- if ($matchingCount < $piece->count) {
- $piece->parts = array( new PPDPart_HipHop );
- $piece->count -= $matchingCount;
- # do we still qualify for any callback with remaining count?
- $names = $rules[$piece->open]['names'];
- $skippedBraces = 0;
- $enclosingAccum = $accum;
- while ( $piece->count ) {
- if ( array_key_exists( $piece->count, $names ) ) {
- $stack->push( $piece );
- $accum = $stack->getAccum();
- break;
- }
- --$piece->count;
- $skippedBraces ++;
- }
- $enclosingAccum->addLiteral( str_repeat( $piece->open, $skippedBraces ) );
- }
-
- $stackFlags = $stack->getFlags();
-
- # Add XML element to the enclosing accumulator
- if ( $isTreeNode ) {
- $accum->addNode( $tree );
- } else {
- $accum->addAccum( $resultAccum );
- }
- } elseif ( $found === 'pipe' ) {
- $stackFlags['findEquals'] = true; // shortcut for getFlags()
- $stack->addPart();
- $accum = $stack->getAccum();
- ++$i;
- } elseif ( $found === 'equals' ) {
- $stackFlags['findEquals'] = false; // shortcut for getFlags()
- $accum->addNodeWithText( 'equals', '=' );
- $stack->getCurrentPart()->eqpos = $accum->lastNode;
- ++$i;
- }
- }
-
- # Output any remaining unclosed brackets
- foreach ( $stack->stack as $variantPiece ) {
- $piece = PPDStackElement_HipHop::cast( $variantPiece );
- $stack->rootAccum->addAccum( $piece->breakSyntax() );
- }
-
- # Enable top-level headings
- for ( $node = $stack->rootAccum->firstNode; $node; $node = $node->nextSibling ) {
- if ( isset( $node->name ) && $node->name === 'possible-h' ) {
- $node->name = 'h';
- }
- }
-
- $rootNode = new PPNode_HipHop_Tree( 'root' );
- $rootNode->firstChild = $stack->rootAccum->firstNode;
- $rootNode->lastChild = $stack->rootAccum->lastNode;
-
- // Cache
- if ($cacheable) {
- $cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . serialize( $rootNode );
- $wgMemc->set( $cacheKey, $cacheValue, 86400 );
- wfProfileOut( __METHOD__.'-cache-miss' );
- wfProfileOut( __METHOD__.'-cacheable' );
- wfDebugLog( "Preprocessor", "Saved preprocessor Hash to memcached (key $cacheKey)" );
- }
-
- wfProfileOut( __METHOD__ );
- return $rootNode;
- }
-}
-
-
-
-/**
- * Stack class to help Preprocessor::preprocessToObj()
- * @ingroup Parser
- */
-class PPDStack_HipHop {
- var $stack, $rootAccum;
-
- /**
- * @var PPDStack
- */
- var $top;
- var $out;
-
- static $false = false;
-
- function __construct() {
- $this->stack = array();
- $this->top = false;
- $this->rootAccum = new PPDAccum_HipHop;
- $this->accum = $this->rootAccum;
- }
-
- /**
- * @return int
- */
- function count() {
- return count( $this->stack );
- }
-
- function getAccum() {
- return PPDAccum_HipHop::cast( $this->accum );
- }
-
- function getCurrentPart() {
- return $this->getTop()->getCurrentPart();
- }
-
- function getTop() {
- return PPDStackElement_HipHop::cast( $this->top );
- }
-
- function push( $data ) {
- if ( $data instanceof PPDStackElement_HipHop ) {
- $this->stack[] = $data;
- } else {
- $this->stack[] = new PPDStackElement_HipHop( $data );
- }
- $this->top = $this->stack[ count( $this->stack ) - 1 ];
- $this->accum = $this->top->getAccum();
- }
-
- function pop() {
- if ( !count( $this->stack ) ) {
- throw new MWException( __METHOD__.': no elements remaining' );
- }
- $temp = array_pop( $this->stack );
-
- if ( count( $this->stack ) ) {
- $this->top = $this->stack[ count( $this->stack ) - 1 ];
- $this->accum = $this->top->getAccum();
- } else {
- $this->top = self::$false;
- $this->accum = $this->rootAccum;
- }
- return $temp;
- }
-
- function addPart( $s = '' ) {
- $this->top->addPart( $s );
- $this->accum = $this->top->getAccum();
- }
-
- /**
- * @return array
- */
- function getFlags() {
- if ( !count( $this->stack ) ) {
- return array(
- 'findEquals' => false,
- 'findPipe' => false,
- 'inHeading' => false,
- );
- } else {
- return $this->top->getFlags();
- }
- }
-}
-
-/**
- * @ingroup Parser
- */
-class PPDStackElement_HipHop {
- var $open, // Opening character (\n for heading)
- $close, // Matching closing character
- $count, // Number of opening characters found (number of "=" for heading)
- $parts, // Array of PPDPart objects describing pipe-separated parts.
- $lineStart; // True if the open char appeared at the start of the input line. Not set for headings.
-
- /**
- * @param $obj PPDStackElement_HipHop
- * @return PPDStackElement_HipHop
- */
- static function cast( PPDStackElement_HipHop $obj ) {
- return $obj;
- }
-
- /**
- * @param $data array
- */
- function __construct( $data = array() ) {
- $this->parts = array( new PPDPart_HipHop );
-
- foreach ( $data as $name => $value ) {
- $this->$name = $value;
- }
- }
-
- /**
- * @return PPDAccum_HipHop
- */
- function getAccum() {
- return PPDAccum_HipHop::cast( $this->parts[count($this->parts) - 1]->out );
- }
-
- /**
- * @param $s string
- */
- function addPart( $s = '' ) {
- $this->parts[] = new PPDPart_HipHop( $s );
- }
-
- /**
- * @return PPDPart_HipHop
- */
- function getCurrentPart() {
- return PPDPart_HipHop::cast( $this->parts[count($this->parts) - 1] );
- }
-
- /**
- * @return array
- */
- function getFlags() {
- $partCount = count( $this->parts );
- $findPipe = $this->open !== "\n" && $this->open !== '[';
- return array(
- 'findPipe' => $findPipe,
- 'findEquals' => $findPipe && $partCount > 1 && !isset( $this->parts[$partCount - 1]->eqpos ),
- 'inHeading' => $this->open === "\n",
- );
- }
-
- /**
- * Get the accumulator that would result if the close is not found.
- *
- * @param $openingCount bool
- * @return PPDAccum_HipHop
- */
- function breakSyntax( $openingCount = false ) {
- if ( $this->open === "\n" ) {
- $accum = PPDAccum_HipHop::cast( $this->parts[0]->out );
- } else {
- if ( $openingCount === false ) {
- $openingCount = $this->count;
- }
- $accum = new PPDAccum_HipHop;
- $accum->addLiteral( str_repeat( $this->open, $openingCount ) );
- $first = true;
- foreach ( $this->parts as $part ) {
- if ( $first ) {
- $first = false;
- } else {
- $accum->addLiteral( '|' );
- }
- $accum->addAccum( $part->out );
- }
- }
- return $accum;
- }
-}
-
-/**
- * @ingroup Parser
- */
-class PPDPart_HipHop {
- var $out; // Output accumulator object
-
- // Optional member variables:
- // eqpos Position of equals sign in output accumulator
- // commentEnd Past-the-end input pointer for the last comment encountered
- // visualEnd Past-the-end input pointer for the end of the accumulator minus comments
-
- function __construct( $out = '' ) {
- $this->out = new PPDAccum_HipHop;
- if ( $out !== '' ) {
- $this->out->addLiteral( $out );
- }
- }
-
- static function cast( PPDPart_HipHop $obj ) {
- return $obj;
- }
-}
-
-/**
- * @ingroup Parser
- */
-class PPDAccum_HipHop {
- var $firstNode, $lastNode;
-
- function __construct() {
- $this->firstNode = $this->lastNode = false;
- }
-
- static function cast( PPDAccum_HipHop $obj ) {
- return $obj;
- }
-
- /**
- * Append a string literal
- */
- function addLiteral( string $s ) {
- if ( $this->lastNode === false ) {
- $this->firstNode = $this->lastNode = new PPNode_HipHop_Text( $s );
- } elseif ( $this->lastNode instanceof PPNode_HipHop_Text ) {
- $this->lastNode->value .= $s;
- } else {
- $this->lastNode->nextSibling = new PPNode_HipHop_Text( $s );
- $this->lastNode = $this->lastNode->nextSibling;
- }
- }
-
- /**
- * Append a PPNode
- */
- function addNode( PPNode $node ) {
- if ( $this->lastNode === false ) {
- $this->firstNode = $this->lastNode = $node;
- } else {
- $this->lastNode->nextSibling = $node;
- $this->lastNode = $node;
- }
- }
-
- /**
- * Append a tree node with text contents
- */
- function addNodeWithText( string $name, string $value ) {
- $node = PPNode_HipHop_Tree::newWithText( $name, $value );
- $this->addNode( $node );
- }
-
- /**
- * Append a PPDAccum_HipHop
- * Takes over ownership of the nodes in the source argument. These nodes may
- * subsequently be modified, especially nextSibling.
- */
- function addAccum( PPDAccum_HipHop $accum ) {
- if ( $accum->lastNode === false ) {
- // nothing to add
- } elseif ( $this->lastNode === false ) {
- $this->firstNode = $accum->firstNode;
- $this->lastNode = $accum->lastNode;
- } else {
- $this->lastNode->nextSibling = $accum->firstNode;
- $this->lastNode = $accum->lastNode;
- }
- }
-}
-
-/**
- * An expansion frame, used as a context to expand the result of preprocessToObj()
- * @ingroup Parser
- */
-class PPFrame_HipHop implements PPFrame {
-
- /**
- * @var Parser
- */
- var $parser;
-
- /**
- * @var Preprocessor
- */
- var $preprocessor;
-
- /**
- * @var Title
- */
- var $title;
- var $titleCache;
-
- /**
- * Hashtable listing templates which are disallowed for expansion in this frame,
- * having been encountered previously in parent frames.
- */
- var $loopCheckHash;
-
- /**
- * Recursion depth of this frame, top = 0
- * Note that this is NOT the same as expansion depth in expand()
- */
- var $depth;
-
- /**
- * Construct a new preprocessor frame.
- * @param $preprocessor Preprocessor: the parent preprocessor
- */
- function __construct( $preprocessor ) {
- $this->preprocessor = $preprocessor;
- $this->parser = $preprocessor->parser;
- $this->title = $this->parser->mTitle;
- $this->titleCache = array( $this->title ? $this->title->getPrefixedDBkey() : false );
- $this->loopCheckHash = array();
- $this->depth = 0;
- }
-
- /**
- * Create a new child frame
- * $args is optionally a multi-root PPNode or array containing the template arguments
- *
- * @param $args PPNode_HipHop_Array|array|bool
- * @param $title Title|bool
- * @param $indexOffset A number subtracted from the index attributes of the arguments
- *
- * @throws MWException
- * @return PPTemplateFrame_HipHop
- */
- function newChild( $args = false, $title = false, $indexOffset = 0 ) {
- $namedArgs = array();
- $numberedArgs = array();
- if ( $title === false ) {
- $title = $this->title;
- }
- if ( $args !== false ) {
- if ( $args instanceof PPNode_HipHop_Array ) {
- $args = $args->value;
- } elseif ( !is_array( $args ) ) {
- throw new MWException( __METHOD__ . ': $args must be array or PPNode_HipHop_Array' );
- }
- foreach ( $args as $arg ) {
- $bits = $arg->splitArg();
- if ( $bits['index'] !== '' ) {
- // Numbered parameter
- $numberedArgs[$bits['index']] = $bits['value'];
- unset( $namedArgs[$bits['index']] );
- } else {
- // Named parameter
- $name = trim( $this->expand( $bits['name'], PPFrame::STRIP_COMMENTS ) );
- $namedArgs[$name] = $bits['value'];
- unset( $numberedArgs[$name] );
- }
- }
- }
- return new PPTemplateFrame_HipHop( $this->preprocessor, $this, $numberedArgs, $namedArgs, $title );
- }
-
- /**
- * @throws MWException
- * @param $root
- * @param $flags int
- * @return string
- */
- function expand( $root, $flags = 0 ) {
- static $expansionDepth = 0;
- if ( is_string( $root ) ) {
- return $root;
- }
-
- if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() ) {
- $this->parser->limitationWarn( 'node-count-exceeded',
- $this->parser->mPPNodeCount,
- $this->parser->mOptions->getMaxPPNodeCount()
- );
- return '<span class="error">Node-count limit exceeded</span>';
- }
- if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
- $this->parser->limitationWarn( 'expansion-depth-exceeded',
- $expansionDepth,
- $this->parser->mOptions->getMaxPPExpandDepth()
- );
- return '<span class="error">Expansion depth limit exceeded</span>';
- }
- ++$expansionDepth;
- if ( $expansionDepth > $this->parser->mHighestExpansionDepth ) {
- $this->parser->mHighestExpansionDepth = $expansionDepth;
- }
-
- $outStack = array( '', '' );
- $iteratorStack = array( false, $root );
- $indexStack = array( 0, 0 );
-
- while ( count( $iteratorStack ) > 1 ) {
- $level = count( $outStack ) - 1;
- $iteratorNode =& $iteratorStack[ $level ];
- $out =& $outStack[$level];
- $index =& $indexStack[$level];
-
- if ( is_array( $iteratorNode ) ) {
- if ( $index >= count( $iteratorNode ) ) {
- // All done with this iterator
- $iteratorStack[$level] = false;
- $contextNode = false;
- } else {
- $contextNode = $iteratorNode[$index];
- $index++;
- }
- } elseif ( $iteratorNode instanceof PPNode_HipHop_Array ) {
- if ( $index >= $iteratorNode->getLength() ) {
- // All done with this iterator
- $iteratorStack[$level] = false;
- $contextNode = false;
- } else {
- $contextNode = $iteratorNode->item( $index );
- $index++;
- }
- } else {
- // Copy to $contextNode and then delete from iterator stack,
- // because this is not an iterator but we do have to execute it once
- $contextNode = $iteratorStack[$level];
- $iteratorStack[$level] = false;
- }
-
- $newIterator = false;
-
- if ( $contextNode === false ) {
- // nothing to do
- } elseif ( is_string( $contextNode ) ) {
- $out .= $contextNode;
- } elseif ( is_array( $contextNode ) || $contextNode instanceof PPNode_HipHop_Array ) {
- $newIterator = $contextNode;
- } elseif ( $contextNode instanceof PPNode_HipHop_Attr ) {
- // No output
- } elseif ( $contextNode instanceof PPNode_HipHop_Text ) {
- $out .= $contextNode->value;
- } elseif ( $contextNode instanceof PPNode_HipHop_Tree ) {
- if ( $contextNode->name === 'template' ) {
- # Double-brace expansion
- $bits = $contextNode->splitTemplate();
- if ( $flags & PPFrame::NO_TEMPLATES ) {
- $newIterator = $this->virtualBracketedImplode( '{{', '|', '}}', $bits['title'], $bits['parts'] );
- } else {
- $ret = $this->parser->braceSubstitution( $bits, $this );
- if ( isset( $ret['object'] ) ) {
- $newIterator = $ret['object'];
- } else {
- $out .= $ret['text'];
- }
- }
- } elseif ( $contextNode->name === 'tplarg' ) {
- # Triple-brace expansion
- $bits = $contextNode->splitTemplate();
- if ( $flags & PPFrame::NO_ARGS ) {
- $newIterator = $this->virtualBracketedImplode( '{{{', '|', '}}}', $bits['title'], $bits['parts'] );
- } else {
- $ret = $this->parser->argSubstitution( $bits, $this );
- if ( isset( $ret['object'] ) ) {
- $newIterator = $ret['object'];
- } else {
- $out .= $ret['text'];
- }
- }
- } elseif ( $contextNode->name === 'comment' ) {
- # HTML-style comment
- # Remove it in HTML, pre+remove and STRIP_COMMENTS modes
- if ( $this->parser->ot['html']
- || ( $this->parser->ot['pre'] && $this->parser->mOptions->getRemoveComments() )
- || ( $flags & PPFrame::STRIP_COMMENTS ) )
- {
- $out .= '';
- }
- # Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
- # Not in RECOVER_COMMENTS mode (extractSections) though
- elseif ( $this->parser->ot['wiki'] && ! ( $flags & PPFrame::RECOVER_COMMENTS ) ) {
- $out .= $this->parser->insertStripItem( $contextNode->firstChild->value );
- }
- # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
- else {
- $out .= $contextNode->firstChild->value;
- }
- } elseif ( $contextNode->name === 'ignore' ) {
- # Output suppression used by <includeonly> etc.
- # OT_WIKI will only respect <ignore> in substed templates.
- # The other output types respect it unless NO_IGNORE is set.
- # extractSections() sets NO_IGNORE and so never respects it.
- if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] ) || ( $flags & PPFrame::NO_IGNORE ) ) {
- $out .= $contextNode->firstChild->value;
- } else {
- //$out .= '';
- }
- } elseif ( $contextNode->name === 'ext' ) {
- # Extension tag
- $bits = $contextNode->splitExt() + array( 'attr' => null, 'inner' => null, 'close' => null );
- $out .= $this->parser->extensionSubstitution( $bits, $this );
- } elseif ( $contextNode->name === 'h' ) {
- # Heading
- if ( $this->parser->ot['html'] ) {
- # Expand immediately and insert heading index marker
- $s = '';
- for ( $node = $contextNode->firstChild; $node; $node = $node->nextSibling ) {
- $s .= $this->expand( $node, $flags );
- }
-
- $bits = $contextNode->splitHeading();
- $titleText = $this->title->getPrefixedDBkey();
- $this->parser->mHeadings[] = array( $titleText, $bits['i'] );
- $serial = count( $this->parser->mHeadings ) - 1;
- $marker = "{$this->parser->mUniqPrefix}-h-$serial-" . Parser::MARKER_SUFFIX;
- $s = substr( $s, 0, $bits['level'] ) . $marker . substr( $s, $bits['level'] );
- $this->parser->mStripState->addGeneral( $marker, '' );
- $out .= $s;
- } else {
- # Expand in virtual stack
- $newIterator = $contextNode->getChildren();
- }
- } else {
- # Generic recursive expansion
- $newIterator = $contextNode->getChildren();
- }
- } else {
- throw new MWException( __METHOD__.': Invalid parameter type' );
- }
-
- if ( $newIterator !== false ) {
- $outStack[] = '';
- $iteratorStack[] = $newIterator;
- $indexStack[] = 0;
- } elseif ( $iteratorStack[$level] === false ) {
- // Return accumulated value to parent
- // With tail recursion
- while ( $iteratorStack[$level] === false && $level > 0 ) {
- $outStack[$level - 1] .= $out;
- array_pop( $outStack );
- array_pop( $iteratorStack );
- array_pop( $indexStack );
- $level--;
- }
- }
- }
- --$expansionDepth;
- return $outStack[0];
- }
-
- /**
- * @param $sep
- * @param $flags
- * @return string
- */
- function implodeWithFlags( $sep, $flags /*, ... */ ) {
- $args = array_slice( func_get_args(), 2 );
-
- $first = true;
- $s = '';
- foreach ( $args as $root ) {
- if ( $root instanceof PPNode_HipHop_Array ) {
- $root = $root->value;
- }
- if ( !is_array( $root ) ) {
- $root = array( $root );
- }
- foreach ( $root as $node ) {
- if ( $first ) {
- $first = false;
- } else {
- $s .= $sep;
- }
- $s .= $this->expand( $node, $flags );
- }
- }
- return $s;
- }
-
- /**
- * Implode with no flags specified
- * This previously called implodeWithFlags but has now been inlined to reduce stack depth
- * @param $sep
- * @return string
- */
- function implode( $sep /*, ... */ ) {
- $args = array_slice( func_get_args(), 1 );
-
- $first = true;
- $s = '';
- foreach ( $args as $root ) {
- if ( $root instanceof PPNode_HipHop_Array ) {
- $root = $root->value;
- }
- if ( !is_array( $root ) ) {
- $root = array( $root );
- }
- foreach ( $root as $node ) {
- if ( $first ) {
- $first = false;
- } else {
- $s .= $sep;
- }
- $s .= $this->expand( $node );
- }
- }
- return $s;
- }
-
- /**
- * Makes an object that, when expand()ed, will be the same as one obtained
- * with implode()
- *
- * @param $sep
- * @return PPNode_HipHop_Array
- */
- function virtualImplode( $sep /*, ... */ ) {
- $args = array_slice( func_get_args(), 1 );
- $out = array();
- $first = true;
-
- foreach ( $args as $root ) {
- if ( $root instanceof PPNode_HipHop_Array ) {
- $root = $root->value;
- }
- if ( !is_array( $root ) ) {
- $root = array( $root );
- }
- foreach ( $root as $node ) {
- if ( $first ) {
- $first = false;
- } else {
- $out[] = $sep;
- }
- $out[] = $node;
- }
- }
- return new PPNode_HipHop_Array( $out );
- }
-
- /**
- * Virtual implode with brackets
- *
- * @param $start
- * @param $sep
- * @param $end
- * @return PPNode_HipHop_Array
- */
- function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) {
- $args = array_slice( func_get_args(), 3 );
- $out = array( $start );
- $first = true;
-
- foreach ( $args as $root ) {
- if ( $root instanceof PPNode_HipHop_Array ) {
- $root = $root->value;
- }
- if ( !is_array( $root ) ) {
- $root = array( $root );
- }
- foreach ( $root as $node ) {
- if ( $first ) {
- $first = false;
- } else {
- $out[] = $sep;
- }
- $out[] = $node;
- }
- }
- $out[] = $end;
- return new PPNode_HipHop_Array( $out );
- }
-
- function __toString() {
- return 'frame{}';
- }
-
- /**
- * @param $level bool
- * @return array|bool|String
- */
- function getPDBK( $level = false ) {
- if ( $level === false ) {
- return $this->title->getPrefixedDBkey();
- } else {
- return isset( $this->titleCache[$level] ) ? $this->titleCache[$level] : false;
- }
- }
-
- /**
- * @return array
- */
- function getArguments() {
- return array();
- }
-
- /**
- * @return array
- */
- function getNumberedArguments() {
- return array();
- }
-
- /**
- * @return array
- */
- function getNamedArguments() {
- return array();
- }
-
- /**
- * Returns true if there are no arguments in this frame
- *
- * @return bool
- */
- function isEmpty() {
- return true;
- }
-
- /**
- * @param $name
- * @return bool
- */
- function getArgument( $name ) {
- return false;
- }
-
- /**
- * Returns true if the infinite loop check is OK, false if a loop is detected
- *
- * @param $title Title
- *
- * @return bool
- */
- function loopCheck( $title ) {
- return !isset( $this->loopCheckHash[$title->getPrefixedDBkey()] );
- }
-
- /**
- * Return true if the frame is a template frame
- *
- * @return bool
- */
- function isTemplate() {
- return false;
- }
-
- /**
- * Get a title of frame
- *
- * @return Title
- */
- function getTitle() {
- return $this->title;
- }
-}
-
-/**
- * Expansion frame with template arguments
- * @ingroup Parser
- */
-class PPTemplateFrame_HipHop extends PPFrame_HipHop {
- var $numberedArgs, $namedArgs, $parent;
- var $numberedExpansionCache, $namedExpansionCache;
-
- /**
- * @param $preprocessor Preprocessor_HipHop
- * @param $parent bool
- * @param $numberedArgs array
- * @param $namedArgs array
- * @param $title Title|bool
- */
- function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
- parent::__construct( $preprocessor );
-
- $this->parent = $parent;
- $this->numberedArgs = $numberedArgs;
- $this->namedArgs = $namedArgs;
- $this->title = $title;
- $pdbk = $title ? $title->getPrefixedDBkey() : false;
- $this->titleCache = $parent->titleCache;
- $this->titleCache[] = $pdbk;
- $this->loopCheckHash = /*clone*/ $parent->loopCheckHash;
- if ( $pdbk !== false ) {
- $this->loopCheckHash[$pdbk] = true;
- }
- $this->depth = $parent->depth + 1;
- $this->numberedExpansionCache = $this->namedExpansionCache = array();
- }
-
- function __toString() {
- $s = 'tplframe{';
- $first = true;
- $args = $this->numberedArgs + $this->namedArgs;
- foreach ( $args as $name => $value ) {
- if ( $first ) {
- $first = false;
- } else {
- $s .= ', ';
- }
- $s .= "\"$name\":\"" .
- str_replace( '"', '\\"', $value->__toString() ) . '"';
- }
- $s .= '}';
- return $s;
- }
- /**
- * Returns true if there are no arguments in this frame
- *
- * @return bool
- */
- function isEmpty() {
- return !count( $this->numberedArgs ) && !count( $this->namedArgs );
- }
-
- /**
- * @return array
- */
- function getArguments() {
- $arguments = array();
- foreach ( array_merge(
- array_keys($this->numberedArgs),
- array_keys($this->namedArgs)) as $key ) {
- $arguments[$key] = $this->getArgument($key);
- }
- return $arguments;
- }
-
- /**
- * @return array
- */
- function getNumberedArguments() {
- $arguments = array();
- foreach ( array_keys($this->numberedArgs) as $key ) {
- $arguments[$key] = $this->getArgument($key);
- }
- return $arguments;
- }
-
- /**
- * @return array
- */
- function getNamedArguments() {
- $arguments = array();
- foreach ( array_keys($this->namedArgs) as $key ) {
- $arguments[$key] = $this->getArgument($key);
- }
- return $arguments;
- }
-
- /**
- * @param $index
- * @return array|bool
- */
- function getNumberedArgument( $index ) {
- if ( !isset( $this->numberedArgs[$index] ) ) {
- return false;
- }
- if ( !isset( $this->numberedExpansionCache[$index] ) ) {
- # No trimming for unnamed arguments
- $this->numberedExpansionCache[$index] = $this->parent->expand( $this->numberedArgs[$index], PPFrame::STRIP_COMMENTS );
- }
- return $this->numberedExpansionCache[$index];
- }
-
- /**
- * @param $name
- * @return bool
- */
- function getNamedArgument( $name ) {
- if ( !isset( $this->namedArgs[$name] ) ) {
- return false;
- }
- if ( !isset( $this->namedExpansionCache[$name] ) ) {
- # Trim named arguments post-expand, for backwards compatibility
- $this->namedExpansionCache[$name] = trim(
- $this->parent->expand( $this->namedArgs[$name], PPFrame::STRIP_COMMENTS ) );
- }
- return $this->namedExpansionCache[$name];
- }
-
- /**
- * @param $name
- * @return array|bool
- */
- function getArgument( $name ) {
- $text = $this->getNumberedArgument( $name );
- if ( $text === false ) {
- $text = $this->getNamedArgument( $name );
- }
- return $text;
- }
-
- /**
- * Return true if the frame is a template frame
- *
- * @return bool
- */
- function isTemplate() {
- return true;
- }
-}
-
-/**
- * Expansion frame with custom arguments
- * @ingroup Parser
- */
-class PPCustomFrame_HipHop extends PPFrame_HipHop {
- var $args;
-
- function __construct( $preprocessor, $args ) {
- parent::__construct( $preprocessor );
- $this->args = $args;
- }
-
- function __toString() {
- $s = 'cstmframe{';
- $first = true;
- foreach ( $this->args as $name => $value ) {
- if ( $first ) {
- $first = false;
- } else {
- $s .= ', ';
- }
- $s .= "\"$name\":\"" .
- str_replace( '"', '\\"', $value->__toString() ) . '"';
- }
- $s .= '}';
- return $s;
- }
-
- /**
- * @return bool
- */
- function isEmpty() {
- return !count( $this->args );
- }
-
- /**
- * @param $index
- * @return bool
- */
- function getArgument( $index ) {
- if ( !isset( $this->args[$index] ) ) {
- return false;
- }
- return $this->args[$index];
- }
-}
-
-/**
- * @ingroup Parser
- */
-class PPNode_HipHop_Tree implements PPNode {
- var $name, $firstChild, $lastChild, $nextSibling;
-
- function __construct( $name ) {
- $this->name = $name;
- $this->firstChild = $this->lastChild = $this->nextSibling = false;
- }
-
- function __toString() {
- $inner = '';
- $attribs = '';
- for ( $node = $this->firstChild; $node; $node = $node->nextSibling ) {
- if ( $node instanceof PPNode_HipHop_Attr ) {
- $attribs .= ' ' . $node->name . '="' . htmlspecialchars( $node->value ) . '"';
- } else {
- $inner .= $node->__toString();
- }
- }
- if ( $inner === '' ) {
- return "<{$this->name}$attribs/>";
- } else {
- return "<{$this->name}$attribs>$inner</{$this->name}>";
- }
- }
-
- /**
- * @param $name
- * @param $text
- * @return PPNode_HipHop_Tree
- */
- static function newWithText( $name, $text ) {
- $obj = new self( $name );
- $obj->addChild( new PPNode_HipHop_Text( $text ) );
- return $obj;
- }
-
- function addChild( $node ) {
- if ( $this->lastChild === false ) {
- $this->firstChild = $this->lastChild = $node;
- } else {
- $this->lastChild->nextSibling = $node;
- $this->lastChild = $node;
- }
- }
-
- /**
- * @return PPNode_HipHop_Array
- */
- function getChildren() {
- $children = array();
- for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
- $children[] = $child;
- }
- return new PPNode_HipHop_Array( $children );
- }
-
- function getFirstChild() {
- return $this->firstChild;
- }
-
- function getNextSibling() {
- return $this->nextSibling;
- }
-
- /**
- * @param $name string
- * @return array
- */
- function getChildrenOfType( $name ) {
- $children = array();
- for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
- if ( isset( $child->name ) && $child->name === $name ) {
- $children[] = $child;
- }
- }
- return $children;
- }
-
- /**
- * @return bool
- */
- function getLength() {
- return false;
- }
-
- /**
- * @param $i
- * @return bool
- */
- function item( $i ) {
- return false;
- }
-
- /**
- * @return string
- */
- function getName() {
- return $this->name;
- }
-
- /**
- * Split a <part> node into an associative array containing:
- * name PPNode name
- * index String index
- * value PPNode value
- *
- * @throws MWException
- * @return array
- */
- function splitArg() {
- $bits = array();
- for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
- if ( !isset( $child->name ) ) {
- continue;
- }
- if ( $child->name === 'name' ) {
- $bits['name'] = $child;
- if ( $child->firstChild instanceof PPNode_HipHop_Attr
- && $child->firstChild->name === 'index' )
- {
- $bits['index'] = $child->firstChild->value;
- }
- } elseif ( $child->name === 'value' ) {
- $bits['value'] = $child;
- }
- }
-
- if ( !isset( $bits['name'] ) ) {
- throw new MWException( 'Invalid brace node passed to ' . __METHOD__ );
- }
- if ( !isset( $bits['index'] ) ) {
- $bits['index'] = '';
- }
- return $bits;
- }
-
- /**
- * Split an <ext> node into an associative array containing name, attr, inner and close
- * All values in the resulting array are PPNodes. Inner and close are optional.
- *
- * @throws MWException
- * @return array
- */
- function splitExt() {
- $bits = array();
- for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
- if ( !isset( $child->name ) ) {
- continue;
- }
- if ( $child->name === 'name' ) {
- $bits['name'] = $child;
- } elseif ( $child->name === 'attr' ) {
- $bits['attr'] = $child;
- } elseif ( $child->name === 'inner' ) {
- $bits['inner'] = $child;
- } elseif ( $child->name === 'close' ) {
- $bits['close'] = $child;
- }
- }
- if ( !isset( $bits['name'] ) ) {
- throw new MWException( 'Invalid ext node passed to ' . __METHOD__ );
- }
- return $bits;
- }
-
- /**
- * Split an <h> node
- *
- * @throws MWException
- * @return array
- */
- function splitHeading() {
- if ( $this->name !== 'h' ) {
- throw new MWException( 'Invalid h node passed to ' . __METHOD__ );
- }
- $bits = array();
- for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
- if ( !isset( $child->name ) ) {
- continue;
- }
- if ( $child->name === 'i' ) {
- $bits['i'] = $child->value;
- } elseif ( $child->name === 'level' ) {
- $bits['level'] = $child->value;
- }
- }
- if ( !isset( $bits['i'] ) ) {
- throw new MWException( 'Invalid h node passed to ' . __METHOD__ );
- }
- return $bits;
- }
-
- /**
- * Split a <template> or <tplarg> node
- *
- * @return array
- */
- function splitTemplate() {
- $parts = array();
- $bits = array( 'lineStart' => '' );
- for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
- if ( !isset( $child->name ) ) {
- continue;
- }
- if ( $child->name === 'title' ) {
- $bits['title'] = $child;
- }
- if ( $child->name === 'part' ) {
- $parts[] = $child;
- }
- if ( $child->name === 'lineStart' ) {
- $bits['lineStart'] = '1';
- }
- }
- if ( !isset( $bits['title'] ) ) {
- throw new MWException( 'Invalid node passed to ' . __METHOD__ );
- }
- $bits['parts'] = new PPNode_HipHop_Array( $parts );
- return $bits;
- }
-}
-
-/**
- * @ingroup Parser
- */
-class PPNode_HipHop_Text implements PPNode {
- var $value, $nextSibling;
-
- function __construct( $value ) {
- if ( is_object( $value ) ) {
- throw new MWException( __CLASS__ . ' given object instead of string' );
- }
- $this->value = $value;
- }
-
- function __toString() {
- return htmlspecialchars( $this->value );
- }
-
- function getNextSibling() {
- return $this->nextSibling;
- }
-
- function getChildren() { return false; }
- function getFirstChild() { return false; }
- function getChildrenOfType( $name ) { return false; }
- function getLength() { return false; }
- function item( $i ) { return false; }
- function getName() { return '#text'; }
- function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); }
- function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); }
- function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); }
-}
-
-/**
- * @ingroup Parser
- */
-class PPNode_HipHop_Array implements PPNode {
- var $value, $nextSibling;
-
- function __construct( $value ) {
- $this->value = $value;
- }
-
- function __toString() {
- return var_export( $this, true );
- }
-
- function getLength() {
- return count( $this->value );
- }
-
- function item( $i ) {
- return $this->value[$i];
- }
-
- function getName() { return '#nodelist'; }
-
- function getNextSibling() {
- return $this->nextSibling;
- }
-
- function getChildren() { return false; }
- function getFirstChild() { return false; }
- function getChildrenOfType( $name ) { return false; }
- function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); }
- function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); }
- function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); }
-}
-
-/**
- * @ingroup Parser
- */
-class PPNode_HipHop_Attr implements PPNode {
- var $name, $value, $nextSibling;
-
- function __construct( $name, $value ) {
- $this->name = $name;
- $this->value = $value;
- }
-
- function __toString() {
- return "<@{$this->name}>" . htmlspecialchars( $this->value ) . "</@{$this->name}>";
- }
-
- function getName() {
- return $this->name;
- }
-
- function getNextSibling() {
- return $this->nextSibling;
- }
-
- function getChildren() { return false; }
- function getFirstChild() { return false; }
- function getChildrenOfType( $name ) { return false; }
- function getLength() { return false; }
- function item( $i ) { return false; }
- function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); }
- function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); }
- function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); }
-}
diff --git a/includes/parser/StripState.php b/includes/parser/StripState.php
index ad95d5f7..5f3f18ea 100644
--- a/includes/parser/StripState.php
+++ b/includes/parser/StripState.php
@@ -112,7 +112,7 @@ class StripState {
* @return mixed
*/
protected function unstripType( $type, $text ) {
- // Shortcut
+ // Shortcut
if ( !count( $this->data[$type] ) ) {
return $text;
}
@@ -139,7 +139,7 @@ class StripState {
. '</span>';
}
if ( $this->recursionLevel >= self::UNSTRIP_RECURSION_LIMIT ) {
- return '<span class="error">' .
+ return '<span class="error">' .
wfMessage( 'parser-unstrip-recursion-limit' )
->numParams( self::UNSTRIP_RECURSION_LIMIT )->inContentLanguage()->text() .
'</span>';
@@ -156,7 +156,7 @@ class StripState {
}
/**
- * Get a StripState object which is sufficient to unstrip the given text.
+ * Get a StripState object which is sufficient to unstrip the given text.
* It will contain the minimum subset of strip items necessary.
*
* @param $text string
@@ -233,4 +233,3 @@ class StripState {
return preg_replace( $this->regex, '', $text );
}
}
-
diff --git a/includes/parser/Tidy.php b/includes/parser/Tidy.php
index ed2d436d..0f7e0d31 100644
--- a/includes/parser/Tidy.php
+++ b/includes/parser/Tidy.php
@@ -59,12 +59,18 @@ class MWTidyWrapper {
dechex( mt_rand( 0, 0x7fffffff ) ) . dechex( mt_rand( 0, 0x7fffffff ) );
$this->mMarkerIndex = 0;
+ // Replace <mw:editsection> elements with placeholders
$wrappedtext = preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
array( &$this, 'replaceEditSectionLinksCallback' ), $text );
- $wrappedtext = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'.
- ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>'.
- '<head><title>test</title></head><body>'.$wrappedtext.'</body></html>';
+ // Modify inline Microdata <link> and <meta> elements so they say <html-link> and <html-meta> so
+ // we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config
+ $wrappedtext = preg_replace( '!<(link|meta)([^>]*?)(/{0,1}>)!', '<html-$1$2$3', $wrappedtext );
+
+ // Wrap the whole thing in a doctype and body for Tidy.
+ $wrappedtext = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' .
+ ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>' .
+ '<head><title>test</title></head><body>' . $wrappedtext . '</body></html>';
return $wrappedtext;
}
@@ -86,7 +92,13 @@ class MWTidyWrapper {
* @return string
*/
public function postprocess( $text ) {
- return $this->mTokens->replace( $text );
+ // Revert <html-{link,meta}> back to <{link,meta}>
+ $text = preg_replace( '!<html-(link|meta)([^>]*?)(/{0,1}>)!', '<$1$2$3', $text );
+
+ // Restore the contents of placeholder tokens
+ $text = $this->mTokens->replace( $text );
+
+ return $text;
}
}
@@ -106,7 +118,7 @@ class MWTidy {
* If tidy isn't able to correct the markup, the original will be
* returned in all its glory with a warning comment appended.
*
- * @param $text String: hideous HTML input
+ * @param string $text hideous HTML input
* @return String: corrected HTML output
*/
public static function tidy( $text ) {
@@ -159,7 +171,7 @@ class MWTidy {
* Spawn an external HTML tidy process and get corrected markup back from it.
* Also called in OutputHandler.php for full page validation
*
- * @param $text String: HTML to check
+ * @param string $text HTML to check
* @param $stderr Boolean: Whether to read result from STDERR rather than STDOUT
* @param &$retval int Exit code (-1 on internal error)
* @return mixed String or null
@@ -223,7 +235,7 @@ class MWTidy {
* Use the HTML tidy extension to use the tidy library in-process,
* saving the overhead of spawning a new process.
*
- * @param $text String: HTML to check
+ * @param string $text HTML to check
* @param $stderr Boolean: Whether to read result from error status instead of output
* @param &$retval int Exit code (-1 on internal error)
* @return mixed String or null
@@ -248,24 +260,24 @@ class MWTidy {
wfProfileOut( __METHOD__ );
return $tidy->errorBuffer;
+ }
+
+ $tidy->cleanRepair();
+ $retval = $tidy->getStatus();
+ if ( $retval == 2 ) {
+ // 2 is magic number for fatal error
+ // http://www.php.net/manual/en/function.tidy-get-status.php
+ $cleansource = null;
} else {
- $tidy->cleanRepair();
- $retval = $tidy->getStatus();
- if ( $retval == 2 ) {
- // 2 is magic number for fatal error
- // http://www.php.net/manual/en/function.tidy-get-status.php
- $cleansource = null;
- } else {
- $cleansource = tidy_get_output( $tidy );
- if ( $wgDebugTidy && $retval > 0 ) {
- $cleansource .= "<!--\nTidy reports:\n" .
- str_replace( '-->', '--&gt;', $tidy->errorBuffer ) .
- "\n-->";
- }
+ $cleansource = tidy_get_output( $tidy );
+ if ( $wgDebugTidy && $retval > 0 ) {
+ $cleansource .= "<!--\nTidy reports:\n" .
+ str_replace( '-->', '--&gt;', $tidy->errorBuffer ) .
+ "\n-->";
}
-
- wfProfileOut( __METHOD__ );
- return $cleansource;
}
+
+ wfProfileOut( __METHOD__ );
+ return $cleansource;
}
}
diff --git a/includes/profiler/Profiler.php b/includes/profiler/Profiler.php
index 62be39e4..5ecdc4f0 100644
--- a/includes/profiler/Profiler.php
+++ b/includes/profiler/Profiler.php
@@ -28,7 +28,7 @@
/**
* Begin profiling of a function
- * @param $functionname String: name of the function we will profile
+ * @param string $functionname name of the function we will profile
*/
function wfProfileIn( $functionname ) {
global $wgProfiler;
@@ -39,7 +39,7 @@ function wfProfileIn( $functionname ) {
/**
* Stop profiling of a function
- * @param $functionname String: name of the function we have profiled
+ * @param string $functionname name of the function we have profiled
*/
function wfProfileOut( $functionname = 'missing' ) {
global $wgProfiler;
@@ -157,7 +157,7 @@ class Profiler {
*/
public function profileIn( $functionname ) {
global $wgDebugFunctionEntry;
- if( $wgDebugFunctionEntry ){
+ if( $wgDebugFunctionEntry ) {
$this->debug( str_repeat( ' ', count( $this->mWorkStack ) ) . 'Entering ' . $functionname . "\n" );
}
@@ -174,22 +174,22 @@ class Profiler {
$memory = memory_get_usage();
$time = $this->getTime();
- if( $wgDebugFunctionEntry ){
+ if( $wgDebugFunctionEntry ) {
$this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) . 'Exiting ' . $functionname . "\n" );
}
- $bit = array_pop($this->mWorkStack);
+ $bit = array_pop( $this->mWorkStack );
- if (!$bit) {
- $this->debug("Profiling error, !\$bit: $functionname\n");
+ if ( !$bit ) {
+ $this->debug( "Profiling error, !\$bit: $functionname\n" );
} else {
- //if( $wgDebugProfiling ){
- if( $functionname == 'close' ){
+ //if( $wgDebugProfiling ) {
+ if( $functionname == 'close' ) {
$message = "Profile section ended by close(): {$bit[0]}";
$this->debug( "$message\n" );
$this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
}
- elseif( $bit[0] != $functionname ){
+ elseif( $bit[0] != $functionname ) {
$message = "Profiling error: in({$bit[0]}), out($functionname)";
$this->debug( "$message\n" );
$this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
@@ -205,7 +205,7 @@ class Profiler {
* Close opened profiling sections
*/
public function close() {
- while( count( $this->mWorkStack ) ){
+ while( count( $this->mWorkStack ) ) {
$this->profileOut( 'close' );
}
}
@@ -228,7 +228,7 @@ class Profiler {
global $wgDebugFunctionEntry, $wgProfileCallTree;
$wgDebugFunctionEntry = false;
- if( !count( $this->mStack ) && !count( $this->mCollated ) ){
+ if( !count( $this->mStack ) && !count( $this->mCollated ) ) {
return "No profiling output\n";
}
@@ -250,20 +250,20 @@ class Profiler {
/**
* Recursive function the format the current profiling array into a tree
*
- * @param $stack array profiling array
+ * @param array $stack profiling array
* @return array
*/
function remapCallTree( $stack ) {
- if( count( $stack ) < 2 ){
+ if( count( $stack ) < 2 ) {
return $stack;
}
$outputs = array ();
- for( $max = count( $stack ) - 1; $max > 0; ){
+ for( $max = count( $stack ) - 1; $max > 0; ) {
/* Find all items under this entry */
$level = $stack[$max][1];
$working = array ();
- for( $i = $max -1; $i >= 0; $i-- ){
- if( $stack[$i][1] > $level ){
+ for( $i = $max -1; $i >= 0; $i-- ) {
+ if( $stack[$i][1] > $level ) {
$working[] = $stack[$i];
} else {
break;
@@ -271,7 +271,7 @@ class Profiler {
}
$working = $this->remapCallTree( array_reverse( $working ) );
$output = array();
- foreach( $working as $item ){
+ foreach( $working as $item ) {
array_push( $output, $item );
}
array_unshift( $output, $stack[$max] );
@@ -280,8 +280,8 @@ class Profiler {
array_unshift( $outputs, $output );
}
$final = array();
- foreach( $outputs as $output ){
- foreach( $output as $item ){
+ foreach( $outputs as $output ) {
+ foreach( $output as $item ) {
$final[] = $item;
}
}
@@ -293,9 +293,9 @@ class Profiler {
* @return string
*/
function getCallTreeLine( $entry ) {
- list( $fname, $level, $start, /* $x */, $end) = $entry;
+ list( $fname, $level, $start, /* $x */, $end ) = $entry;
$delta = $end - $start;
- $space = str_repeat(' ', $level);
+ $space = str_repeat( ' ', $level );
# The ugly double sprintf is to work around a PHP bug,
# which has been fixed in recent releases.
return sprintf( "%10s %s %s\n", trim( sprintf( "%7.3f", $delta * 1000.0 ) ), $space, $fname );
@@ -305,7 +305,7 @@ class Profiler {
* Get the initial time of the request, based either on $wgRequestTime or
* $wgRUstart. Will return null if not able to find data.
*
- * @param $metric string|false: metric to use, with the following possibilities:
+ * @param string|false $metric metric to use, with the following possibilities:
* - user: User CPU time (without system calls)
* - cpu: Total CPU time (user and system calls)
* - wall (or any other string): elapsed time
@@ -338,7 +338,7 @@ class Profiler {
* Get the initial time of the request, based either on $wgRequestTime or
* $wgRUstart. Will return null if not able to find data.
*
- * @param $metric string|false: metric to use, with the following possibilities:
+ * @param string|false $metric metric to use, with the following possibilities:
* - user: User CPU time (without system calls)
* - cpu: Total CPU time (user and system calls)
* - wall (or any other string): elapsed time
@@ -386,23 +386,23 @@ class Profiler {
$this->mMemory = array();
# Estimate profiling overhead
- $profileCount = count($this->mStack);
+ $profileCount = count( $this->mStack );
self::calculateOverhead( $profileCount );
# First, subtract the overhead!
$overheadTotal = $overheadMemory = $overheadInternal = array();
- foreach( $this->mStack as $entry ){
+ foreach( $this->mStack as $entry ) {
$fname = $entry[0];
$start = $entry[2];
$end = $entry[4];
$elapsed = $end - $start;
$memory = $entry[5] - $entry[3];
- if( $fname == '-overhead-total' ){
+ if( $fname == '-overhead-total' ) {
$overheadTotal[] = $elapsed;
$overheadMemory[] = $memory;
}
- elseif( $fname == '-overhead-internal' ){
+ elseif( $fname == '-overhead-internal' ) {
$overheadInternal[] = $elapsed;
}
}
@@ -411,7 +411,7 @@ class Profiler {
$overheadInternal = $overheadInternal ? array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
# Collate
- foreach( $this->mStack as $index => $entry ){
+ foreach( $this->mStack as $index => $entry ) {
$fname = $entry[0];
$start = $entry[2];
$end = $entry[4];
@@ -420,7 +420,7 @@ class Profiler {
$memory = $entry[5] - $entry[3];
$subcalls = $this->calltreeCount( $this->mStack, $index );
- if( !preg_match( '/^-overhead/', $fname ) ){
+ if( !preg_match( '/^-overhead/', $fname ) ) {
# Adjust for profiling overhead (except special values with elapsed=0
if( $elapsed ) {
$elapsed -= $overheadInternal;
@@ -429,7 +429,7 @@ class Profiler {
}
}
- if( !array_key_exists( $fname, $this->mCollated ) ){
+ if( !array_key_exists( $fname, $this->mCollated ) ) {
$this->mCollated[$fname] = 0;
$this->mCalls[$fname] = 0;
$this->mMemory[$fname] = 0;
@@ -441,8 +441,8 @@ class Profiler {
$this->mCollated[$fname] += $elapsed;
$this->mCalls[$fname]++;
$this->mMemory[$fname] += $memory;
- $this->mMin[$fname] = min($this->mMin[$fname], $elapsed);
- $this->mMax[$fname] = max($this->mMax[$fname], $elapsed);
+ $this->mMin[$fname] = min( $this->mMin[$fname], $elapsed );
+ $this->mMax[$fname] = max( $this->mMax[$fname], $elapsed );
$this->mOverhead[$fname] += $subcalls;
}
@@ -460,18 +460,18 @@ class Profiler {
$width = 140;
$nameWidth = $width - 65;
- $format = "%-{$nameWidth}s %6d %13.3f %13.3f %13.3f%% %9d (%13.3f -%13.3f) [%d]\n";
+ $format = "%-{$nameWidth}s %6d %13.3f %13.3f %13.3f%% %9d (%13.3f -%13.3f) [%d]\n";
$titleFormat = "%-{$nameWidth}s %6s %13s %13s %13s %9s\n";
$prof = "\nProfiling data\n";
$prof .= sprintf( $titleFormat, 'Name', 'Calls', 'Total', 'Each', '%', 'Mem' );
$total = isset( $this->mCollated['-total'] ) ? $this->mCollated['-total'] : 0;
- foreach( $this->mCollated as $fname => $elapsed ){
+ foreach( $this->mCollated as $fname => $elapsed ) {
$calls = $this->mCalls[$fname];
$percent = $total ? 100. * $elapsed / $total : 0;
$memory = $this->mMemory[$fname];
- $prof .= sprintf($format, substr($fname, 0, $nameWidth), $calls, (float) ($elapsed * 1000), (float) ($elapsed * 1000) / $calls, $percent, $memory, ($this->mMin[$fname] * 1000.0), ($this->mMax[$fname] * 1000.0), $this->mOverhead[$fname]);
+ $prof .= sprintf( $format, substr( $fname, 0, $nameWidth ), $calls, (float) ($elapsed * 1000), (float) ($elapsed * 1000) / $calls, $percent, $memory, ( $this->mMin[$fname] * 1000.0 ), ( $this->mMax[$fname] * 1000.0 ), $this->mOverhead[$fname] );
}
$prof .= "\nTotal: $total\n\n";
@@ -483,7 +483,7 @@ class Profiler {
*/
protected static function calculateOverhead( $profileCount ) {
wfProfileIn( '-overhead-total' );
- for( $i = 0; $i < $profileCount; $i++ ){
+ for( $i = 0; $i < $profileCount; $i++ ) {
wfProfileIn( '-overhead-internal' );
wfProfileOut( '-overhead-internal' );
}
@@ -499,10 +499,10 @@ class Profiler {
* @return Integer
* @private
*/
- function calltreeCount($stack, $start) {
+ function calltreeCount( $stack, $start ) {
$level = $stack[$start][1];
$count = 0;
- for ($i = $start -1; $i >= 0 && $stack[$i][1] > $level; $i --) {
+ for ( $i = $start -1; $i >= 0 && $stack[$i][1] > $level; $i-- ) {
$count ++;
}
return $count;
@@ -511,7 +511,7 @@ class Profiler {
/**
* Log the whole profiling data into the database.
*/
- public function logData(){
+ public function logData() {
global $wgProfilePerHost, $wgProfileToDatabase;
# Do not log anything if database is readonly (bug 5375)
@@ -524,52 +524,50 @@ class Profiler {
return;
}
- $errorState = $dbw->ignoreErrors( true );
-
- if( $wgProfilePerHost ){
+ if( $wgProfilePerHost ) {
$pfhost = wfHostname();
} else {
$pfhost = '';
}
- $this->collateData();
-
- foreach( $this->mCollated as $name => $elapsed ){
- $eventCount = $this->mCalls[$name];
- $timeSum = (float) ($elapsed * 1000);
- $memorySum = (float)$this->mMemory[$name];
- $name = substr($name, 0, 255);
-
- // Kludge
- $timeSum = ($timeSum >= 0) ? $timeSum : 0;
- $memorySum = ($memorySum >= 0) ? $memorySum : 0;
-
- $dbw->update( 'profiling',
- array(
- "pf_count=pf_count+{$eventCount}",
- "pf_time=pf_time+{$timeSum}",
- "pf_memory=pf_memory+{$memorySum}",
- ),
- array(
- 'pf_name' => $name,
- 'pf_server' => $pfhost,
- ),
- __METHOD__ );
-
- $rc = $dbw->affectedRows();
- if ( $rc == 0 ) {
- $dbw->insert('profiling', array ('pf_name' => $name, 'pf_count' => $eventCount,
- 'pf_time' => $timeSum, 'pf_memory' => $memorySum, 'pf_server' => $pfhost ),
- __METHOD__, array ('IGNORE'));
+ try {
+ $this->collateData();
+
+ foreach( $this->mCollated as $name => $elapsed ) {
+ $eventCount = $this->mCalls[$name];
+ $timeSum = (float) ($elapsed * 1000);
+ $memorySum = (float)$this->mMemory[$name];
+ $name = substr($name, 0, 255);
+
+ // Kludge
+ $timeSum = ($timeSum >= 0) ? $timeSum : 0;
+ $memorySum = ($memorySum >= 0) ? $memorySum : 0;
+
+ $dbw->update( 'profiling',
+ array(
+ "pf_count=pf_count+{$eventCount}",
+ "pf_time=pf_time+{$timeSum}",
+ "pf_memory=pf_memory+{$memorySum}",
+ ),
+ array(
+ 'pf_name' => $name,
+ 'pf_server' => $pfhost,
+ ),
+ __METHOD__ );
+
+ $rc = $dbw->affectedRows();
+ if ( $rc == 0 ) {
+ $dbw->insert( 'profiling', array ( 'pf_name' => $name, 'pf_count' => $eventCount,
+ 'pf_time' => $timeSum, 'pf_memory' => $memorySum, 'pf_server' => $pfhost ),
+ __METHOD__, array ( 'IGNORE' ) );
+ }
+ // When we upgrade to mysql 4.1, the insert+update
+ // can be merged into just a insert with this construct added:
+ // "ON DUPLICATE KEY UPDATE ".
+ // "pf_count=pf_count + VALUES(pf_count), ".
+ // "pf_time=pf_time + VALUES(pf_time)";
}
- // When we upgrade to mysql 4.1, the insert+update
- // can be merged into just a insert with this construct added:
- // "ON DUPLICATE KEY UPDATE ".
- // "pf_count=pf_count + VALUES(pf_count), ".
- // "pf_time=pf_time + VALUES(pf_time)";
- }
-
- $dbw->ignoreErrors( $errorState );
+ } catch ( DBError $e ) {}
}
/**
@@ -584,11 +582,25 @@ class Profiler {
/**
* Add an entry in the debug log file
*
- * @param $s String to output
+ * @param string $s to output
*/
function debug( $s ) {
if( defined( 'MW_COMPILED' ) || function_exists( 'wfDebug' ) ) {
wfDebug( $s );
}
}
+
+ /**
+ * Get the content type sent out to the client.
+ * Used for profilers that output instead of store data.
+ * @return string
+ */
+ protected function getContentType() {
+ foreach ( headers_list() as $header ) {
+ if ( preg_match( '#^content-type: (\w+/\w+);?#i', $header, $m ) ) {
+ return $m[1];
+ }
+ }
+ return null;
+ }
}
diff --git a/includes/profiler/ProfilerSimple.php b/includes/profiler/ProfilerSimple.php
index d1d1c5d9..1d4873c6 100644
--- a/includes/profiler/ProfilerSimple.php
+++ b/includes/profiler/ProfilerSimple.php
@@ -29,7 +29,7 @@
class ProfilerSimple extends Profiler {
var $mMinimumTime = 0;
- var $zeroEntry = array('cpu'=> 0.0, 'cpu_sq' => 0.0, 'real' => 0.0, 'real_sq' => 0.0, 'count' => 0);
+ var $zeroEntry = array( 'cpu' => 0.0, 'cpu_sq' => 0.0, 'real' => 0.0, 'real_sq' => 0.0, 'count' => 0 );
var $errorEntry;
public function isPersistent() {
@@ -57,33 +57,33 @@ class ProfilerSimple extends Profiler {
$this->mMinimumTime = $min;
}
- function profileIn($functionname) {
+ function profileIn( $functionname ) {
global $wgDebugFunctionEntry;
- if ($wgDebugFunctionEntry) {
- $this->debug(str_repeat(' ', count($this->mWorkStack)).'Entering '.$functionname."\n");
+ if ( $wgDebugFunctionEntry ) {
+ $this->debug( str_repeat( ' ', count( $this->mWorkStack ) ) . 'Entering ' . $functionname . "\n" );
}
$this->mWorkStack[] = array( $functionname, count( $this->mWorkStack ), $this->getTime(), $this->getTime( 'cpu' ) );
}
- function profileOut($functionname) {
+ function profileOut( $functionname ) {
global $wgDebugFunctionEntry;
- if ($wgDebugFunctionEntry) {
- $this->debug(str_repeat(' ', count($this->mWorkStack) - 1).'Exiting '.$functionname."\n");
+ if ( $wgDebugFunctionEntry ) {
+ $this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) . 'Exiting ' . $functionname . "\n" );
}
- list($ofname, /* $ocount */ ,$ortime,$octime) = array_pop($this->mWorkStack);
+ list( $ofname, /* $ocount */, $ortime, $octime ) = array_pop( $this->mWorkStack );
- if (!$ofname) {
- $this->debug("Profiling error: $functionname\n");
+ if ( !$ofname ) {
+ $this->debug( "Profiling error: $functionname\n" );
} else {
- if ($functionname == 'close') {
+ if ( $functionname == 'close' ) {
$message = "Profile section ended by close(): {$ofname}";
$functionname = $ofname;
$this->debug( "$message\n" );
$this->mCollated[$message] = $this->errorEntry;
}
- elseif ($ofname != $functionname) {
+ elseif ( $ofname != $functionname ) {
$message = "Profiling error: in({$ofname}), out($functionname)";
$this->debug( "$message\n" );
$this->mCollated[$message] = $this->errorEntry;
@@ -91,7 +91,7 @@ class ProfilerSimple extends Profiler {
$entry =& $this->mCollated[$functionname];
$elapsedcpu = $this->getTime( 'cpu' ) - $octime;
$elapsedreal = $this->getTime() - $ortime;
- if (!is_array($entry)) {
+ if ( !is_array( $entry ) ) {
$entry = $this->zeroEntry;
$this->mCollated[$functionname] =& $entry;
}
diff --git a/includes/profiler/ProfilerSimpleText.php b/includes/profiler/ProfilerSimpleText.php
index 3e7d6fa4..37350bf3 100644
--- a/includes/profiler/ProfilerSimpleText.php
+++ b/includes/profiler/ProfilerSimpleText.php
@@ -48,12 +48,20 @@ class ProfilerSimpleText extends ProfilerSimple {
$totalReal = isset( $this->mCollated['-total'] )
? $this->mCollated['-total']['real']
: 0; // profiling mismatch error?
- uasort( $this->mCollated, array('self','sort') );
- array_walk( $this->mCollated, array('self','format'), $totalReal );
- if ( $this->visible ) {
- print '<pre>'.self::$out.'</pre>';
- } else {
+ uasort( $this->mCollated, array( 'self', 'sort' ) );
+ array_walk( $this->mCollated, array( 'self', 'format' ), $totalReal );
+ if ( PHP_SAPI === 'cli' ) {
print "<!--\n".self::$out."\n-->\n";
+ } elseif ( $this->getContentType() === 'text/html' ) {
+ if ( $this->visible ) {
+ print '<pre>'.self::$out.'</pre>';
+ } else {
+ print "<!--\n".self::$out."\n-->\n";
+ }
+ } elseif ( $this->getContentType() === 'text/javascript' ) {
+ print "\n/*\n".self::$out."*/\n";
+ } elseif ( $this->getContentType() === 'text/css' ) {
+ print "\n/*\n".self::$out."*/\n";
}
}
}
diff --git a/includes/profiler/ProfilerSimpleTrace.php b/includes/profiler/ProfilerSimpleTrace.php
index 822e9fe4..d44dfe1b 100644
--- a/includes/profiler/ProfilerSimpleTrace.php
+++ b/includes/profiler/ProfilerSimpleTrace.php
@@ -32,18 +32,18 @@ class ProfilerSimpleTrace extends ProfilerSimple {
function profileIn( $functionname ) {
parent::profileIn( $functionname );
- $this->trace .= " " . sprintf("%6.1f",$this->memoryDiff()) .
- str_repeat( " ", count($this->mWorkStack)) . " > " . $functionname . "\n";
+ $this->trace .= " " . sprintf( "%6.1f", $this->memoryDiff() ) .
+ str_repeat( " ", count( $this->mWorkStack ) ) . " > " . $functionname . "\n";
}
- function profileOut($functionname) {
+ function profileOut( $functionname ) {
global $wgDebugFunctionEntry;
if ( $wgDebugFunctionEntry ) {
- $this->debug(str_repeat(' ', count($this->mWorkStack) - 1).'Exiting '.$functionname."\n");
+ $this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) . 'Exiting ' . $functionname . "\n" );
}
- list( $ofname, /* $ocount */ , $ortime ) = array_pop( $this->mWorkStack );
+ list( $ofname, /* $ocount */, $ortime ) = array_pop( $this->mWorkStack );
if ( !$ofname ) {
$this->trace .= "Profiling error: $functionname\n";
@@ -58,7 +58,7 @@ class ProfilerSimpleTrace extends ProfilerSimple {
}
$elapsedreal = $this->getTime() - $ortime;
$this->trace .= sprintf( "%03.6f %6.1f", $elapsedreal, $this->memoryDiff() ) .
- str_repeat(" ", count( $this->mWorkStack ) + 1 ) . " < " . $functionname . "\n";
+ str_repeat( " ", count( $this->mWorkStack ) + 1 ) . " < " . $functionname . "\n";
}
}
@@ -69,6 +69,14 @@ class ProfilerSimpleTrace extends ProfilerSimple {
}
function logData() {
- print "<!-- \n {$this->trace} \n -->";
+ if ( PHP_SAPI === 'cli' ) {
+ print "<!-- \n {$this->trace} \n -->";
+ } elseif ( $this->getContentType() === 'text/html' ) {
+ print "<!-- \n {$this->trace} \n -->";
+ } elseif ( $this->getContentType() === 'text/javascript' ) {
+ print "\n/*\n {$this->trace}\n*/";
+ } elseif ( $this->getContentType() === 'text/css' ) {
+ print "\n/*\n {$this->trace}\n*/";
+ }
}
}
diff --git a/includes/profiler/ProfilerSimpleUDP.php b/includes/profiler/ProfilerSimpleUDP.php
index a95ccb0d..abefa811 100644
--- a/includes/profiler/ProfilerSimpleUDP.php
+++ b/includes/profiler/ProfilerSimpleUDP.php
@@ -50,7 +50,7 @@ class ProfilerSimpleUDP extends ProfilerSimple {
$plength = 0;
$packet = "";
foreach ( $this->mCollated as $entry => $pfdata ) {
- if( !isset($pfdata['count'])
+ if( !isset( $pfdata['count'] )
|| !isset( $pfdata['cpu'] )
|| !isset( $pfdata['cpu_sq'] )
|| !isset( $pfdata['real'] )
diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php
index 7b87f9d4..27f682c2 100644
--- a/includes/resourceloader/ResourceLoader.php
+++ b/includes/resourceloader/ResourceLoader.php
@@ -39,7 +39,7 @@ class ResourceLoader {
/** Associative array mapping module name to info associative array */
protected $moduleInfos = array();
-
+
/** Associative array mapping framework ids to a list of names of test suite modules */
/** like array( 'qunit' => array( 'mediawiki.tests.qunit.suites', 'ext.foo.tests', .. ), .. ) */
protected $testModuleNames = array();
@@ -60,7 +60,7 @@ class ResourceLoader {
* requests its own information. This sacrifice of modularity yields a substantial
* performance improvement.
*
- * @param $modules Array: List of module names to preload information for
+ * @param array $modules List of module names to preload information for
* @param $context ResourceLoaderContext: Context to load the information within
*/
public function preloadModuleInfo( array $modules, ResourceLoaderContext $context ) {
@@ -127,8 +127,8 @@ class ResourceLoader {
* If $data is empty, only contains whitespace or the filter was unknown,
* $data is returned unmodified.
*
- * @param $filter String: Name of filter to run
- * @param $data String: Text to filter, such as JavaScript or CSS text
+ * @param string $filter Name of filter to run
+ * @param string $data Text to filter, such as JavaScript or CSS text
* @return String: Filtered data, or a comment containing an error message
*/
protected function filter( $filter, $data ) {
@@ -210,7 +210,6 @@ class ResourceLoader {
$this->registerTestModules();
}
-
wfProfileOut( __METHOD__ );
}
@@ -218,7 +217,7 @@ class ResourceLoader {
* Registers a module with the ResourceLoader system.
*
* @param $name Mixed: Name of module as a string or List of name/object pairs as an array
- * @param $info array Module info array. For backwards compatibility with 1.17alpha,
+ * @param array $info Module info array. For backwards compatibility with 1.17alpha,
* this may also be a ResourceLoaderModule object. Optional when using
* multiple-registration calling style.
* @throws MWException: If a duplicate module registration is attempted
@@ -309,7 +308,8 @@ class ResourceLoader {
* 'loadScript': URL (either fully-qualified or protocol-relative) of load.php for this source
*
* @param $id Mixed: source ID (string), or array( id1 => props1, id2 => props2, ... )
- * @param $properties Array: source properties
+ * @param array $properties source properties
+ * @throws MWException
*/
public function addSource( $id, $properties = null) {
// Allow multiple sources to be registered in one call
@@ -346,13 +346,13 @@ class ResourceLoader {
public function getModuleNames() {
return array_keys( $this->moduleInfos );
}
-
- /**
+
+ /**
* Get a list of test module names for one (or all) frameworks.
* If the given framework id is unknkown, or if the in-object variable is not an array,
* then it will return an empty array.
*
- * @param $framework String: Optional. Get only the test module names for one
+ * @param string $framework Optional. Get only the test module names for one
* particular framework.
* @return Array
*/
@@ -370,7 +370,7 @@ class ResourceLoader {
/**
* Get the ResourceLoaderModule object for a given module name.
*
- * @param $name String: Module name
+ * @param string $name Module name
* @return ResourceLoaderModule if module has been registered, null otherwise
*/
public function getModule( $name ) {
@@ -450,7 +450,7 @@ class ResourceLoader {
$this->hasErrors = true;
continue;
}
- $modules[$name] = $this->getModule( $name );
+ $modules[$name] = $module;
} else {
$missing[] = $name;
}
@@ -530,8 +530,8 @@ class ResourceLoader {
/**
* Send content type and last modified headers to the client.
* @param $context ResourceLoaderContext
- * @param $mtime string TS_MW timestamp to use for last-modified
- * @param $error bool Whether there are commented-out errors in the response
+ * @param string $mtime TS_MW timestamp to use for last-modified
+ * @param bool $error Whether there are commented-out errors in the response
* @return void
*/
protected function sendResponseHeaders( ResourceLoaderContext $context, $mtime, $errors ) {
@@ -540,12 +540,12 @@ class ResourceLoader {
// to propagate to clients quickly
// If there were errors, we also need a shorter expiry time so we can recover quickly
if ( is_null( $context->getVersion() ) || $errors ) {
- $maxage = $wgResourceLoaderMaxage['unversioned']['client'];
+ $maxage = $wgResourceLoaderMaxage['unversioned']['client'];
$smaxage = $wgResourceLoaderMaxage['unversioned']['server'];
// If a version was specified we can use a longer expiry time since changing
// version numbers causes cache misses
} else {
- $maxage = $wgResourceLoaderMaxage['versioned']['client'];
+ $maxage = $wgResourceLoaderMaxage['versioned']['client'];
$smaxage = $wgResourceLoaderMaxage['versioned']['server'];
}
if ( $context->getOnly() === 'styles' ) {
@@ -569,7 +569,7 @@ class ResourceLoader {
* If there's an If-Modified-Since header, respond with a 304 appropriately
* and clear out the output buffer. If the client cache is too old then do nothing.
* @param $context ResourceLoaderContext
- * @param $mtime string The TS_MW timestamp to check the header against
+ * @param string $mtime The TS_MW timestamp to check the header against
* @return bool True iff 304 header sent and output handled
*/
protected function tryRespondLastModified( ResourceLoaderContext $context, $mtime ) {
@@ -666,8 +666,8 @@ class ResourceLoader {
* Generates code for a response
*
* @param $context ResourceLoaderContext: Context in which to generate a response
- * @param $modules Array: List of module objects keyed by module name
- * @param $missing Array: List of unavailable modules (optional)
+ * @param array $modules List of module objects keyed by module name
+ * @param array $missing List of unavailable modules (optional)
* @return String: Response data
*/
public function makeModuleResponse( ResourceLoaderContext $context,
@@ -834,7 +834,7 @@ class ResourceLoader {
* Returns JS code to call to mw.loader.implement for a module with
* given properties.
*
- * @param $name string Module name
+ * @param string $name Module name
* @param $scripts Mixed: List of URLs to JavaScript files or String of JavaScript code
* @param $styles Mixed: Array of CSS strings keyed by media type, or an array of lists of URLs to
* CSS files keyed by media type
@@ -842,6 +842,7 @@ class ResourceLoader {
* associative array mapping message key to value, or a JSON-encoded message blob containing
* the same data, wrapped in an XmlJsCode object.
*
+ * @throws MWException
* @return string
*/
public static function makeLoaderImplementScript( $name, $scripts, $styles, $messages ) {
@@ -881,7 +882,7 @@ class ResourceLoader {
* Combines an associative array mapping media type to CSS into a
* single stylesheet with "@media" blocks.
*
- * @param $styles Array: Array keyed by media type containing (arrays of) CSS strings.
+ * @param array $stylePairs Array keyed by media type containing (arrays of) CSS strings.
*
* @return Array
*/
@@ -941,12 +942,12 @@ class ResourceLoader {
* which will have values corresponding to $name, $version, $dependencies
* and $group as supplied.
*
- * @param $name String: Module name
+ * @param string $name Module name
* @param $version Integer: Module version number as a timestamp
- * @param $dependencies Array: List of module names on which this module depends
- * @param $group String: Group which the module is in.
- * @param $source String: Source of the module, or 'local' if not foreign.
- * @param $script String: JavaScript code
+ * @param array $dependencies List of module names on which this module depends
+ * @param string $group Group which the module is in.
+ * @param string $source Source of the module, or 'local' if not foreign.
+ * @param string $script JavaScript code
*
* @return string
*/
@@ -974,11 +975,11 @@ class ResourceLoader {
* ) ):
* Registers modules with the given names and parameters.
*
- * @param $name String: Module name
+ * @param string $name Module name
* @param $version Integer: Module version number as a timestamp
- * @param $dependencies Array: List of module names on which this module depends
- * @param $group String: group which the module is in.
- * @param $source String: source of the module, or 'local' if not foreign
+ * @param array $dependencies List of module names on which this module depends
+ * @param string $group group which the module is in.
+ * @param string $source source of the module, or 'local' if not foreign
*
* @return string
*/
@@ -1004,8 +1005,8 @@ class ResourceLoader {
* - ResourceLoader::makeLoaderSourcesScript( array( $id1 => $props1, $id2 => $props2, ... ) );
* Register sources with the given IDs and properties.
*
- * @param $id String: source ID
- * @param $properties Array: source properties (see addSource())
+ * @param string $id source ID
+ * @param array $properties source properties (see addSource())
*
* @return string
*/
@@ -1021,7 +1022,7 @@ class ResourceLoader {
* Returns JS code which runs given JS code if the client-side framework is
* present.
*
- * @param $script String: JavaScript code
+ * @param string $script JavaScript code
*
* @return string
*/
@@ -1033,7 +1034,7 @@ class ResourceLoader {
* Returns JS code which will set the MediaWiki configuration array to
* the given value.
*
- * @param $configuration Array: List of configuration values keyed by variable name
+ * @param array $configuration List of configuration values keyed by variable name
*
* @return string
*/
@@ -1046,7 +1047,7 @@ class ResourceLoader {
*
* For example, array( 'foo.bar', 'foo.baz', 'bar.baz', 'bar.quux' )
* becomes 'foo.bar,baz|bar.baz,quux'
- * @param $modules array of module names (strings)
+ * @param array $modules of module names (strings)
* @return string Packed query string
*/
public static function makePackedModulesString( $modules ) {
@@ -1084,16 +1085,16 @@ class ResourceLoader {
/**
* Build a load.php URL
- * @param $modules array of module names (strings)
- * @param $lang string Language code
- * @param $skin string Skin name
- * @param $user string|null User name. If null, the &user= parameter is omitted
- * @param $version string|null Versioning timestamp
- * @param $debug bool Whether the request should be in debug mode
- * @param $only string|null &only= parameter
- * @param $printable bool Printable mode
- * @param $handheld bool Handheld mode
- * @param $extraQuery array Extra query parameters to add
+ * @param array $modules of module names (strings)
+ * @param string $lang Language code
+ * @param string $skin Skin name
+ * @param string|null $user User name. If null, the &user= parameter is omitted
+ * @param string|null $version Versioning timestamp
+ * @param bool $debug Whether the request should be in debug mode
+ * @param string|null $only &only= parameter
+ * @param bool $printable Printable mode
+ * @param bool $handheld Handheld mode
+ * @param array $extraQuery Extra query parameters to add
* @return string URL to load.php. May be protocol-relative (if $wgLoadScript is procol-relative)
*/
public static function makeLoaderURL( $modules, $lang, $skin, $user = null, $version = null, $debug = false, $only = null,
@@ -1149,7 +1150,7 @@ class ResourceLoader {
* Module names may not contain pipes (|), commas (,) or exclamation marks (!) and can be
* at most 255 bytes.
*
- * @param $moduleName string Module name to check
+ * @param string $moduleName Module name to check
* @return bool Whether $moduleName is a valid module name
*/
public static function isValidModuleName( $moduleName ) {
diff --git a/includes/resourceloader/ResourceLoaderContext.php b/includes/resourceloader/ResourceLoaderContext.php
index 0e96c6c8..4588015f 100644
--- a/includes/resourceloader/ResourceLoaderContext.php
+++ b/includes/resourceloader/ResourceLoaderContext.php
@@ -58,14 +58,14 @@ class ResourceLoaderContext {
// Interpret request
// List of modules
$modules = $request->getVal( 'modules' );
- $this->modules = $modules ? self::expandModuleNames( $modules ) : array();
+ $this->modules = $modules ? self::expandModuleNames( $modules ) : array();
// Various parameters
- $this->skin = $request->getVal( 'skin' );
- $this->user = $request->getVal( 'user' );
- $this->debug = $request->getFuzzyBool( 'debug', $wgResourceLoaderDebug );
- $this->only = $request->getVal( 'only' );
- $this->version = $request->getVal( 'version' );
- $this->raw = $request->getFuzzyBool( 'raw' );
+ $this->skin = $request->getVal( 'skin' );
+ $this->user = $request->getVal( 'user' );
+ $this->debug = $request->getFuzzyBool( 'debug', $wgResourceLoaderDebug );
+ $this->only = $request->getVal( 'only' );
+ $this->version = $request->getVal( 'version' );
+ $this->raw = $request->getFuzzyBool( 'raw' );
$skinnames = Skin::getSkinNames();
// If no skin is specified, or we don't recognize the skin, use the default skin
@@ -78,7 +78,7 @@ class ResourceLoaderContext {
* Expand a string of the form jquery.foo,bar|jquery.ui.baz,quux to
* an array of module names like array( 'jquery.foo', 'jquery.bar',
* 'jquery.ui.baz', 'jquery.ui.quux' )
- * @param $modules String Packed module name list
+ * @param string $modules Packed module name list
* @return array of module names
*/
public static function expandModuleNames( $modules ) {
@@ -145,7 +145,7 @@ class ResourceLoaderContext {
public function getLanguage() {
if ( $this->language === null ) {
global $wgLang;
- $this->language = $this->request->getVal( 'lang' );
+ $this->language = $this->request->getVal( 'lang' );
if ( !$this->language ) {
$this->language = $wgLang->getCode();
}
diff --git a/includes/resourceloader/ResourceLoaderFileModule.php b/includes/resourceloader/ResourceLoaderFileModule.php
index 8b9b7277..cedb5dcc 100644
--- a/includes/resourceloader/ResourceLoaderFileModule.php
+++ b/includes/resourceloader/ResourceLoaderFileModule.php
@@ -113,6 +113,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
protected $debugRaw = true;
/** Boolean: Whether mw.loader.state() call should be omitted */
protected $raw = false;
+ protected $targets = array( 'desktop' );
+
/**
* Array: Cache for mtime
* @par Usage:
@@ -135,52 +137,53 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Constructs a new module from an options array.
*
- * @param $options Array: List of options; if not given or empty, an empty module will be
+ * @param array $options List of options; if not given or empty, an empty module will be
* constructed
- * @param $localBasePath String: Base path to prepend to all local paths in $options. Defaults
+ * @param string $localBasePath Base path to prepend to all local paths in $options. Defaults
* to $IP
- * @param $remoteBasePath String: Base path to prepend to all remote paths in $options. Defaults
+ * @param string $remoteBasePath Base path to prepend to all remote paths in $options. Defaults
* to $wgScriptPath
*
* Below is a description for the $options array:
+ * @throws MWException
* @par Construction options:
* @code
- * array(
- * // Base path to prepend to all local paths in $options. Defaults to $IP
- * 'localBasePath' => [base path],
- * // Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath
- * 'remoteBasePath' => [base path],
- * // Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath
- * 'remoteExtPath' => [base path],
- * // Scripts to always include
- * 'scripts' => [file path string or array of file path strings],
- * // Scripts to include in specific language contexts
- * 'languageScripts' => array(
- * [language code] => [file path string or array of file path strings],
- * ),
- * // Scripts to include in specific skin contexts
- * 'skinScripts' => array(
- * [skin name] => [file path string or array of file path strings],
- * ),
- * // Scripts to include in debug contexts
- * 'debugScripts' => [file path string or array of file path strings],
- * // Scripts to include in the startup module
- * 'loaderScripts' => [file path string or array of file path strings],
- * // Modules which must be loaded before this module
- * 'dependencies' => [modile name string or array of module name strings],
- * // Styles to always load
- * 'styles' => [file path string or array of file path strings],
- * // Styles to include in specific skin contexts
- * 'skinStyles' => array(
- * [skin name] => [file path string or array of file path strings],
- * ),
- * // Messages to always load
- * 'messages' => [array of message key strings],
- * // Group which this module should be loaded together with
- * 'group' => [group name string],
- * // Position on the page to load this module at
- * 'position' => ['bottom' (default) or 'top']
- * )
+ * array(
+ * // Base path to prepend to all local paths in $options. Defaults to $IP
+ * 'localBasePath' => [base path],
+ * // Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath
+ * 'remoteBasePath' => [base path],
+ * // Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath
+ * 'remoteExtPath' => [base path],
+ * // Scripts to always include
+ * 'scripts' => [file path string or array of file path strings],
+ * // Scripts to include in specific language contexts
+ * 'languageScripts' => array(
+ * [language code] => [file path string or array of file path strings],
+ * ),
+ * // Scripts to include in specific skin contexts
+ * 'skinScripts' => array(
+ * [skin name] => [file path string or array of file path strings],
+ * ),
+ * // Scripts to include in debug contexts
+ * 'debugScripts' => [file path string or array of file path strings],
+ * // Scripts to include in the startup module
+ * 'loaderScripts' => [file path string or array of file path strings],
+ * // Modules which must be loaded before this module
+ * 'dependencies' => [module name string or array of module name strings],
+ * // Styles to always load
+ * 'styles' => [file path string or array of file path strings],
+ * // Styles to include in specific skin contexts
+ * 'skinStyles' => array(
+ * [skin name] => [file path string or array of file path strings],
+ * ),
+ * // Messages to always load
+ * 'messages' => [array of message key strings],
+ * // Group which this module should be loaded together with
+ * 'group' => [group name string],
+ * // Position on the page to load this module at
+ * 'position' => ['bottom' (default) or 'top']
+ * )
* @endcode
*/
public function __construct( $options = array(), $localBasePath = null,
@@ -231,6 +234,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
// Lists of strings
case 'dependencies':
case 'messages':
+ case 'targets':
$this->{$member} = (array) $option;
break;
// Single strings
@@ -437,9 +441,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
return $this->modifiedTime[$context->getHash()] = 1;
}
- wfProfileIn( __METHOD__.'-filemtime' );
+ wfProfileIn( __METHOD__ . '-filemtime' );
$filesMtime = max( array_map( array( __CLASS__, 'safeFilemtime' ), $files ) );
- wfProfileOut( __METHOD__.'-filemtime' );
+ wfProfileOut( __METHOD__ . '-filemtime' );
$this->modifiedTime[$context->getHash()] = max(
$filesMtime,
$this->getMsgBlobMtime( $context->getLanguage() ) );
@@ -469,9 +473,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Collates file paths by option (where provided).
*
- * @param $list Array: List of file paths in any combination of index/path
+ * @param array $list List of file paths in any combination of index/path
* or path/options pairs
- * @param $option String: option name
+ * @param string $option option name
* @param $default Mixed: default value if the option isn't set
* @return Array: List of file paths, collated by $option
*/
@@ -499,9 +503,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Gets a list of element that match a key, optionally using a fallback key.
*
- * @param $list Array: List of lists to select from
- * @param $key String: Key to look for in $map
- * @param $fallback String: Key to look for in $list if $key doesn't exist
+ * @param array $list List of lists to select from
+ * @param string $key Key to look for in $map
+ * @param string $fallback Key to look for in $list if $key doesn't exist
* @return Array: List of elements from $map which matched $key or $fallback,
* or an empty list in case of no match
*/
@@ -532,7 +536,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
if ( $context->getDebug() ) {
$files = array_merge( $files, $this->debugScripts );
}
- return $files;
+
+ return array_unique( $files );
}
/**
@@ -553,7 +558,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Gets the contents of a list of JavaScript files.
*
- * @param $scripts Array: List of file paths to scripts to read, remap and concetenate
+ * @param array $scripts List of file paths to scripts to read, remap and concetenate
+ * @throws MWException
* @return String: Concatenated and remapped JavaScript data from $scripts
*/
protected function readScriptFiles( array $scripts ) {
@@ -565,7 +571,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
foreach ( array_unique( $scripts ) as $fileName ) {
$localPath = $this->getLocalPath( $fileName );
if ( !file_exists( $localPath ) ) {
- throw new MWException( __METHOD__.": script file not found: \"$localPath\"" );
+ throw new MWException( __METHOD__ . ": script file not found: \"$localPath\"" );
}
$contents = file_get_contents( $localPath );
if ( $wgResourceLoaderValidateStaticJS ) {
@@ -582,7 +588,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
/**
* Gets the contents of a list of CSS files.
*
- * @param $styles Array: List of media type/list of file paths pairs, to read, remap and
+ * @param array $styles List of media type/list of file paths pairs, to read, remap and
* concetenate
*
* @param $flip bool
@@ -613,7 +619,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
*
* This method can be used as a callback for array_map()
*
- * @param $path String: File path of style file to read
+ * @param string $path File path of style file to read
* @param $flip bool
*
* @return String: CSS data in script file
@@ -622,7 +628,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
protected function readStyleFile( $path, $flip ) {
$localPath = $this->getLocalPath( $path );
if ( !file_exists( $localPath ) ) {
- throw new MWException( __METHOD__.": style file not found: \"$localPath\"" );
+ $msg = __METHOD__ . ": style file not found: \"$localPath\"";
+ wfDebugLog( 'resourceloader', $msg );
+ throw new MWException( $msg );
}
$style = file_get_contents( $localPath );
if ( $flip ) {
@@ -646,23 +654,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
}
/**
- * Safe version of filemtime(), which doesn't throw a PHP warning if the file doesn't exist
- * but returns 1 instead.
- * @param $filename string File name
- * @return int UNIX timestamp, or 1 if the file doesn't exist
- */
- protected static function safeFilemtime( $filename ) {
- if ( file_exists( $filename ) ) {
- return filemtime( $filename );
- } else {
- // We only ever map this function on an array if we're gonna call max() after,
- // so return our standard minimum timestamps here. This is 1, not 0, because
- // wfTimestamp(0) == NOW
- return 1;
- }
- }
-
- /**
* Get whether CSS for this module should be flipped
* @param $context ResourceLoaderContext
* @return bool
@@ -670,4 +661,14 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
public function getFlip( $context ) {
return $context->getDirection() === 'rtl';
}
+
+ /**
+ * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
+ *
+ * @return array of strings
+ */
+ public function getTargets() {
+ return $this->targets;
+ }
+
}
diff --git a/includes/resourceloader/ResourceLoaderLanguageDataModule.php b/includes/resourceloader/ResourceLoaderLanguageDataModule.php
index c916c4a5..0f8e54ce 100644
--- a/includes/resourceloader/ResourceLoaderLanguageDataModule.php
+++ b/includes/resourceloader/ResourceLoaderLanguageDataModule.php
@@ -28,6 +28,7 @@
class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
protected $language;
+ protected $targets = array( 'desktop', 'mobile' );
/**
* Get the grammar forms for the site content language.
*
@@ -47,24 +48,35 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
}
/**
+ * Get the digit groupin Pattern for the site content language.
+ *
+ * @return array
+ */
+ protected function getDigitGroupingPattern() {
+ return $this->language->digitGroupingPattern();
+ }
+
+ /**
* Get the digit transform table for the content language
- * Seperator transform table also required here to convert
- * the . and , sign to appropriate forms in content language.
*
* @return array
*/
protected function getDigitTransformTable() {
- $digitTransformTable = $this->language->digitTransformTable();
- $separatorTransformTable = $this->language->separatorTransformTable();
- if ( $digitTransformTable ) {
- array_merge( $digitTransformTable, (array)$separatorTransformTable );
- } else {
- return $separatorTransformTable;
- }
- return $digitTransformTable;
+ return $this->language->digitTransformTable();
}
/**
+ * Get seperator transform table required for converting
+ * the . and , sign to appropriate forms in site content language.
+ *
+ * @return array
+ */
+ protected function getSeparatorTransformTable() {
+ return $this->language->separatorTransformTable();
+ }
+
+
+ /**
* Get all the dynamic data for the content language to an array
*
* @return array
@@ -72,8 +84,10 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
protected function getData() {
return array(
'digitTransformTable' => $this->getDigitTransformTable(),
+ 'separatorTransformTable' => $this->getSeparatorTransformTable(),
'grammarForms' => $this->getSiteLangGrammarForms(),
'pluralRules' => $this->getPluralRules(),
+ 'digitGroupingPattern' => $this->getDigitGroupingPattern(),
);
}
diff --git a/includes/resourceloader/ResourceLoaderModule.php b/includes/resourceloader/ResourceLoaderModule.php
index 9c49c45f..03f3cc37 100644
--- a/includes/resourceloader/ResourceLoaderModule.php
+++ b/includes/resourceloader/ResourceLoaderModule.php
@@ -58,6 +58,7 @@ abstract class ResourceLoaderModule {
/* Protected Members */
protected $name = null;
+ protected $targets = array( 'desktop' );
// In-object cache for file dependencies
protected $fileDeps = array();
@@ -77,10 +78,10 @@ abstract class ResourceLoaderModule {
}
/**
- * Set this module's name. This is called by ResourceLodaer::register()
+ * Set this module's name. This is called by ResourceLoader::register()
* when registering the module. Other code should not call this.
*
- * @param $name String: Name
+ * @param string $name Name
*/
public function setName( $name ) {
$this->name = $name;
@@ -91,17 +92,17 @@ abstract class ResourceLoaderModule {
* with ResourceLoader::register()
*
* @return Int ResourceLoaderModule class constant, the subclass default
- * if not set manuall
+ * if not set manually
*/
public function getOrigin() {
return $this->origin;
}
/**
- * Set this module's origin. This is called by ResourceLodaer::register()
+ * Set this module's origin. This is called by ResourceLoader::register()
* when registering the module. Other code should not call this.
*
- * @param $origin Int origin
+ * @param int $origin origin
*/
public function setOrigin( $origin ) {
$this->origin = $origin;
@@ -290,10 +291,19 @@ abstract class ResourceLoaderModule {
}
/**
+ * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
+ *
+ * @return array of strings
+ */
+ public function getTargets() {
+ return $this->targets;
+ }
+
+ /**
* Get the files this module depends on indirectly for a given skin.
* Currently these are only image files referenced by the module's CSS.
*
- * @param $skin String: Skin name
+ * @param string $skin Skin name
* @return Array: List of files
*/
public function getFileDependencies( $skin ) {
@@ -319,8 +329,8 @@ abstract class ResourceLoaderModule {
/**
* Set preloaded file dependency information. Used so we can load this
* information for all modules at once.
- * @param $skin String: Skin name
- * @param $deps Array: Array of file names
+ * @param string $skin Skin name
+ * @param array $deps Array of file names
*/
public function setFileDependencies( $skin, $deps ) {
$this->fileDeps[$skin] = $deps;
@@ -329,13 +339,14 @@ abstract class ResourceLoaderModule {
/**
* Get the last modification timestamp of the message blob for this
* module in a given language.
- * @param $lang String: Language code
+ * @param string $lang Language code
* @return Integer: UNIX timestamp, or 0 if the module doesn't have messages
*/
public function getMsgBlobMtime( $lang ) {
if ( !isset( $this->msgBlobMtime[$lang] ) ) {
- if ( !count( $this->getMessages() ) )
+ if ( !count( $this->getMessages() ) ) {
return 0;
+ }
$dbr = wfGetDB( DB_SLAVE );
$msgBlobMtime = $dbr->selectField( 'msg_resource', 'mr_timestamp', array(
@@ -356,7 +367,7 @@ abstract class ResourceLoaderModule {
/**
* Set a preloaded message blob last modification timestamp. Used so we
* can load this information for all modules at once.
- * @param $lang String: Language code
+ * @param string $lang Language code
* @param $mtime Integer: UNIX timestamp or 0 if there is no such blob
*/
public function setMsgBlobMtime( $lang, $mtime ) {
@@ -375,7 +386,7 @@ abstract class ResourceLoaderModule {
* NOTE: The mtime of the module's messages is NOT automatically included.
* If you want this to happen, you'll need to call getMsgBlobMtime()
* yourself and take its result into consideration.
- *
+ *
* @param $context ResourceLoaderContext: Context object
* @return Integer: UNIX timestamp
*/
@@ -397,7 +408,6 @@ abstract class ResourceLoaderModule {
return false;
}
-
/** @var JSParser lazy-initialized; use self::javaScriptParser() */
private static $jsParser;
private static $parseCacheVersion = 1;
@@ -426,10 +436,10 @@ abstract class ResourceLoaderModule {
try {
$parser->parse( $contents, $fileName, 1 );
$result = $contents;
- } catch (Exception $e) {
+ } catch ( Exception $e ) {
// We'll save this to cache to avoid having to validate broken JS over and over...
$err = $e->getMessage();
- $result = "throw new Error(" . Xml::encodeJsVar("JavaScript parse error: $err") . ");";
+ $result = "throw new Error(" . Xml::encodeJsVar( "JavaScript parse error: $err" ) . ");";
}
$cache->set( $key, $result );
@@ -449,4 +459,20 @@ abstract class ResourceLoaderModule {
return self::$jsParser;
}
+ /**
+ * Safe version of filemtime(), which doesn't throw a PHP warning if the file doesn't exist
+ * but returns 1 instead.
+ * @param string $filename File name
+ * @return int UNIX timestamp, or 1 if the file doesn't exist
+ */
+ protected static function safeFilemtime( $filename ) {
+ if ( file_exists( $filename ) ) {
+ return filemtime( $filename );
+ } else {
+ // We only ever map this function on an array if we're gonna call max() after,
+ // so return our standard minimum timestamps here. This is 1, not 0, because
+ // wfTimestamp(0) == NOW
+ return 1;
+ }
+ }
}
diff --git a/includes/resourceloader/ResourceLoaderNoscriptModule.php b/includes/resourceloader/ResourceLoaderNoscriptModule.php
index 8e81c8d9..bd026f3f 100644
--- a/includes/resourceloader/ResourceLoaderNoscriptModule.php
+++ b/includes/resourceloader/ResourceLoaderNoscriptModule.php
@@ -45,7 +45,7 @@ class ResourceLoaderNoscriptModule extends ResourceLoaderWikiModule {
/**
* Gets group name
- *
+ *
* @return String: Name of group
*/
public function getGroup() {
diff --git a/includes/resourceloader/ResourceLoaderSiteModule.php b/includes/resourceloader/ResourceLoaderSiteModule.php
index 03fe1fe5..1cc5c1a9 100644
--- a/includes/resourceloader/ResourceLoaderSiteModule.php
+++ b/includes/resourceloader/ResourceLoaderSiteModule.php
@@ -47,8 +47,8 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
'MediaWiki:Print.css' => array( 'type' => 'style', 'media' => 'print' ),
);
if ( $wgHandheldStyle ) {
- $pages['MediaWiki:Handheld.css'] = array(
- 'type' => 'style',
+ $pages['MediaWiki:Handheld.css'] = array(
+ 'type' => 'style',
'media' => 'handheld' );
}
return $pages;
@@ -58,7 +58,7 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
/**
* Gets group name
- *
+ *
* @return String: Name of group
*/
public function getGroup() {
diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php
index 20ee83f9..32cf6b26 100644
--- a/includes/resourceloader/ResourceLoaderStartUpModule.php
+++ b/includes/resourceloader/ResourceLoaderStartUpModule.php
@@ -114,6 +114,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
$out = '';
$registrations = array();
$resourceLoader = $context->getResourceLoader();
+ $target = $context->getRequest()->getVal( 'target', 'desktop' );
// Register sources
$out .= ResourceLoader::makeLoaderSourcesScript( $resourceLoader->getSources() );
@@ -121,6 +122,10 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
// Register modules
foreach ( $resourceLoader->getModuleNames() as $name ) {
$module = $resourceLoader->getModule( $name );
+ $moduleTargets = $module->getTargets();
+ if ( !in_array( $target, $moduleTargets ) ) {
+ continue;
+ }
$deps = $module->getDependencies();
$group = $module->getGroup();
$source = $module->getSource();
@@ -130,33 +135,33 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
$version = wfTimestamp( TS_ISO_8601_BASIC,
$module->getModifiedTime( $context ) );
$out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $source, $loader );
+ continue;
}
+
// Automatically register module
+ // getModifiedTime() is supposed to return a UNIX timestamp, but it doesn't always
+ // seem to do that, and custom implementations might forget. Coerce it to TS_UNIX
+ $moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) );
+ $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
+ // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
+ // mw.loader.register()
+ if ( !count( $deps ) && $group === null && $source === 'local' ) {
+ $registrations[] = array( $name, $mtime );
+ }
+ // Modules with dependencies but no group or foreign source pass three arguments
+ // (name, timestamp, dependencies) to mw.loader.register()
+ elseif ( $group === null && $source === 'local' ) {
+ $registrations[] = array( $name, $mtime, $deps );
+ }
+ // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
+ // to mw.loader.register()
+ elseif ( $source === 'local' ) {
+ $registrations[] = array( $name, $mtime, $deps, $group );
+ }
+ // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
+ // to mw.loader.register()
else {
- // getModifiedTime() is supposed to return a UNIX timestamp, but it doesn't always
- // seem to do that, and custom implementations might forget. Coerce it to TS_UNIX
- $moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) );
- $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
- // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
- // mw.loader.register()
- if ( !count( $deps ) && $group === null && $source === 'local' ) {
- $registrations[] = array( $name, $mtime );
- }
- // Modules with dependencies but no group or foreign source pass three arguments
- // (name, timestamp, dependencies) to mw.loader.register()
- elseif ( $group === null && $source === 'local' ) {
- $registrations[] = array( $name, $mtime, $deps );
- }
- // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
- // to mw.loader.register()
- elseif ( $source === 'local' ) {
- $registrations[] = array( $name, $mtime, $deps, $group );
- }
- // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
- // to mw.loader.register()
- else {
- $registrations[] = array( $name, $mtime, $deps, $group, $source );
- }
+ $registrations[] = array( $name, $mtime, $deps, $group, $source );
}
}
$out .= ResourceLoader::makeLoaderRegisterScript( $registrations );
@@ -219,7 +224,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
"};\n";
// Conditional script injection
- $scriptTag = Html::linkedScript( $wgLoadScript . '?' . wfArrayToCGI( $query ) );
+ $scriptTag = Html::linkedScript( $wgLoadScript . '?' . wfArrayToCgi( $query ) );
$out .= "if ( isCompatible() ) {\n" .
"\t" . Xml::encodeJsCall( 'document.write', array( $scriptTag ) ) .
"}\n" .
diff --git a/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php b/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
index 0e95d964..bdb240e0 100644
--- a/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
+++ b/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
@@ -48,7 +48,7 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
global $wgUser;
return $this->modifiedTime[$hash] = wfTimestamp( TS_UNIX, $wgUser->getTouched() );
}
-
+
/**
* @param $context ResourceLoaderContext
* @return array
diff --git a/includes/resourceloader/ResourceLoaderUserTokensModule.php b/includes/resourceloader/ResourceLoaderUserTokensModule.php
index 62d096a6..6d787c50 100644
--- a/includes/resourceloader/ResourceLoaderUserTokensModule.php
+++ b/includes/resourceloader/ResourceLoaderUserTokensModule.php
@@ -43,7 +43,8 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
return array(
'editToken' => $wgUser->getEditToken(),
- 'watchToken' => ApiQueryInfo::getWatchToken(null, null),
+ 'patrolToken' => ApiQueryRecentChanges::getPatrolToken( null, null ),
+ 'watchToken' => ApiQueryInfo::getWatchToken( null, null ),
);
}
diff --git a/includes/resourceloader/ResourceLoaderWikiModule.php b/includes/resourceloader/ResourceLoaderWikiModule.php
index ee8dd1e5..6c60d474 100644
--- a/includes/resourceloader/ResourceLoaderWikiModule.php
+++ b/includes/resourceloader/ResourceLoaderWikiModule.php
@@ -42,7 +42,20 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
/* Abstract Protected Methods */
/**
+ * Subclasses should return an associative array of resources in the module.
+ * Keys should be the title of a page in the MediaWiki or User namespace.
+ *
+ * Values should be a nested array of options. The supported keys are 'type' and
+ * (CSS only) 'media'.
+ *
+ * For scripts, 'type' should be 'script'.
+ *
+ * For stylesheets, 'type' should be 'style'.
+ * There is an optional media key, the value of which can be the
+ * medium ('screen', 'print', etc.) of the stylesheet.
+ *
* @param $context ResourceLoaderContext
+ * @return array
*/
abstract protected function getPages( ResourceLoaderContext $context );
@@ -75,7 +88,22 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
if ( !$revision ) {
return null;
}
- return $revision->getRawText();
+
+ $content = $revision->getContent( Revision::RAW );
+
+ if ( !$content ) {
+ wfDebug( __METHOD__ . "failed to load content of JS/CSS page!\n" );
+ return null;
+ }
+
+ $model = $content->getModel();
+
+ if ( $model !== CONTENT_MODEL_CSS && $model !== CONTENT_MODEL_JAVASCRIPT ) {
+ wfDebug( __METHOD__ . "bad content model $model for JS/CSS page!\n" );
+ return null;
+ }
+
+ return $content->getNativeData(); //NOTE: this is safe, we know it's JS or CSS
}
/* Methods */
@@ -98,7 +126,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
if ( strval( $script ) !== '' ) {
$script = $this->validateScriptFile( $titleText, $script );
if ( strpos( $titleText, '*/' ) === false ) {
- $scripts .= "/* $titleText */\n";
+ $scripts .= "/* $titleText */\n";
}
$scripts .= $script . "\n";
}
@@ -119,7 +147,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
continue;
}
$title = Title::newFromText( $titleText );
- if ( !$title || $title->isRedirect() ) {
+ if ( !$title || $title->isRedirect() ) {
continue;
}
$media = isset( $options['media'] ) ? $options['media'] : 'all';
@@ -135,7 +163,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
$styles[$media] = array();
}
if ( strpos( $titleText, '*/' ) === false ) {
- $style = "/* $titleText */\n" . $style;
+ $style = "/* $titleText */\n" . $style;
}
$styles[$media][] = $style;
}
diff --git a/includes/revisiondelete/RevisionDelete.php b/includes/revisiondelete/RevisionDelete.php
index 6ceadff4..1ace3836 100644
--- a/includes/revisiondelete/RevisionDelete.php
+++ b/includes/revisiondelete/RevisionDelete.php
@@ -398,7 +398,6 @@ class RevDel_ArchiveItem extends RevDel_RevisionItem {
}
}
-
/**
* Item class for a archive table row by ar_rev_id -- actually
* used via RevDel_RevisionList.
@@ -424,7 +423,7 @@ class RevDel_ArchivedRevisionItem extends RevDel_ArchiveItem {
$dbw->update( 'archive',
array( 'ar_deleted' => $bits ),
array( 'ar_rev_id' => $this->row->ar_rev_id,
- 'ar_deleted' => $this->getBits()
+ 'ar_deleted' => $this->getBits()
),
__METHOD__ );
return (bool)$dbw->affectedRows();
@@ -454,7 +453,9 @@ class RevDel_FileList extends RevDel_List {
foreach( $this->ids as $timestamp ) {
$archiveNames[] = $timestamp . '!' . $this->title->getDBkey();
}
- return $db->select( 'oldimage', '*',
+ return $db->select(
+ 'oldimage',
+ OldLocalFile::selectFields(),
array(
'oi_name' => $this->title->getDBkey(),
'oi_archive_name' => $archiveNames
@@ -695,7 +696,9 @@ class RevDel_ArchivedFileList extends RevDel_FileList {
*/
public function doQuery( $db ) {
$ids = array_map( 'intval', $this->ids );
- return $db->select( 'filearchive', '*',
+ return $db->select(
+ 'filearchive',
+ ArchivedFile::selectFields(),
array(
'fa_name' => $this->title->getDBkey(),
'fa_id' => $ids
@@ -899,7 +902,7 @@ class RevDel_LogItem extends RevDel_Item {
$action = $formatter->getActionText();
// Comment
$comment = $this->list->getLanguage()->getDirMark() . Linker::commentBlock( $this->row->log_comment );
- if( LogEventsList::isDeleted($this->row,LogPage::DELETED_COMMENT) ) {
+ if( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) {
$comment = '<span class="history-deleted">' . $comment . '</span>';
}
diff --git a/includes/revisiondelete/RevisionDeleteAbstracts.php b/includes/revisiondelete/RevisionDeleteAbstracts.php
index 4f58099f..b2108de6 100644
--- a/includes/revisiondelete/RevisionDeleteAbstracts.php
+++ b/includes/revisiondelete/RevisionDeleteAbstracts.php
@@ -47,7 +47,7 @@ abstract class RevDel_List extends RevisionListBase {
* Set the visibility for the revisions in this list. Logging and
* transactions are done here.
*
- * @param $params array Associative array of parameters. Members are:
+ * @param array $params Associative array of parameters. Members are:
* value: The integer value to set the visibility to
* comment: The log comment.
* @return Status
@@ -176,7 +176,7 @@ abstract class RevDel_List extends RevisionListBase {
/**
* Record a log entry on the action
- * @param $params array Associative array of parameters:
+ * @param array $params Associative array of parameters:
* newBits: The new value of the *_deleted bitfield
* oldBits: The old value of the *_deleted bitfield.
* title: The target title
@@ -184,6 +184,7 @@ abstract class RevDel_List extends RevisionListBase {
* comment: The log comment
* authorsIds: The array of the user IDs of the offenders
* authorsIPs: The array of the IP/anon user offenders
+ * @throws MWException
*/
protected function updateLog( $params ) {
// Get the URL param's corresponding DB field
@@ -219,7 +220,7 @@ abstract class RevDel_List extends RevisionListBase {
/**
* Get log parameter array.
- * @param $params array Associative array of log parameters, same as updateLog()
+ * @param array $params Associative array of log parameters, same as updateLog()
* @return array
*/
public function getLogParams( $params ) {
diff --git a/includes/revisiondelete/RevisionDeleter.php b/includes/revisiondelete/RevisionDeleter.php
index c59edc2a..fe351c51 100644
--- a/includes/revisiondelete/RevisionDeleter.php
+++ b/includes/revisiondelete/RevisionDeleter.php
@@ -31,12 +31,12 @@ class RevisionDeleter {
* Checks for a change in the bitfield for a certain option and updates the
* provided array accordingly.
*
- * @param $desc String: description to add to the array if the option was
+ * @param string $desc description to add to the array if the option was
* enabled / disabled.
* @param $field Integer: the bitmask describing the single option.
* @param $diff Integer: the xor of the old and new bitfields.
* @param $new Integer: the new bitfield
- * @param $arr Array: the array to update.
+ * @param array $arr the array to update.
*/
protected static function checkItem( $desc, $field, $diff, $new, &$arr ) {
if( $diff & $field ) {
diff --git a/includes/search/SearchEngine.php b/includes/search/SearchEngine.php
index 27a321ac..6b3e62b1 100644
--- a/includes/search/SearchEngine.php
+++ b/includes/search/SearchEngine.php
@@ -45,7 +45,7 @@ class SearchEngine {
*/
protected $db;
- function __construct($db = null) {
+ function __construct( $db = null ) {
if ( $db ) {
$this->db = $db;
} else {
@@ -58,7 +58,7 @@ class SearchEngine {
* If title searches are not supported or disabled, return null.
* STUB
*
- * @param $term String: raw search term
+ * @param string $term raw search term
* @return SearchResultSet
*/
function searchText( $term ) {
@@ -70,7 +70,7 @@ class SearchEngine {
* If title searches are not supported or disabled, return null.
* STUB
*
- * @param $term String: raw search term
+ * @param string $term raw search term
* @return SearchResultSet
*/
function searchTitle( $term ) {
@@ -118,7 +118,7 @@ class SearchEngine {
* on text to be used for searching or updating search index.
* Default implementation does nothing (simply returns $string).
*
- * @param $string string: String to process
+ * @param string $string String to process
* @return string
*/
public function normalizeText( $string ) {
@@ -163,7 +163,7 @@ class SearchEngine {
/**
* Really find the title match.
- * @return null|\Title
+ * @return null|Title
*/
private static function getNearMatchInternal( $searchterm ) {
global $wgContLang, $wgEnableSearchContributorsByIP;
@@ -183,10 +183,15 @@ class SearchEngine {
# Exact match? No need to look further.
$title = Title::newFromText( $term );
- if ( is_null( $title ) ){
+ if ( is_null( $title ) ) {
return null;
}
+ # Try files if searching in the Media: namespace
+ if ( $title->getNamespace() == NS_MEDIA ) {
+ $title = Title::makeTitle( NS_FILE, $title->getText() );
+ }
+
if ( $title->isSpecialPage() || $title->isExternal() || $title->exists() ) {
return $title;
}
@@ -197,22 +202,23 @@ class SearchEngine {
return $title;
}
+ if ( !wfRunHooks( 'SearchAfterNoDirectMatch', array( $term, &$title ) ) ) {
+ return $title;
+ }
+
# Now try all lower case (i.e. first letter capitalized)
- #
$title = Title::newFromText( $wgContLang->lc( $term ) );
if ( $title && $title->exists() ) {
return $title;
}
# Now try capitalized string
- #
$title = Title::newFromText( $wgContLang->ucwords( $term ) );
if ( $title && $title->exists() ) {
return $title;
}
# Now try all upper case
- #
$title = Title::newFromText( $wgContLang->uc( $term ) );
if ( $title && $title->exists() ) {
return $title;
@@ -233,7 +239,6 @@ class SearchEngine {
$title = Title::newFromText( $searchterm );
-
# Entering an IP address goes to the contributions page
if ( $wgEnableSearchContributorsByIP ) {
if ( ( $title->getNamespace() == NS_USER && User::isIP( $title->getText() ) )
@@ -242,7 +247,6 @@ class SearchEngine {
}
}
-
# Entering a user goes to the user page whether it's there or not
if ( $title->getNamespace() == NS_USER ) {
return $title;
@@ -669,7 +673,6 @@ class SearchResultTooMany {
# # Some search engines may bail out if too many matches are found
}
-
/**
* @todo FIXME: This class is horribly factored. It would probably be better to
* have a useful base class to which you pass some standard information, then
@@ -791,21 +794,26 @@ class SearchResult {
*/
protected function initText() {
if ( !isset( $this->mText ) ) {
- if ( $this->mRevision != null )
- $this->mText = $this->mRevision->getText();
- else // TODO: can we fetch raw wikitext for commons images?
+ if ( $this->mRevision != null ) {
+ //TODO: if we could plug in some code that knows about special content models *and* about
+ // special features of the search engine, the search could benefit.
+ $content = $this->mRevision->getContent();
+ $this->mText = $content ? $content->getTextForSearchIndex() : '';
+ } else { // TODO: can we fetch raw wikitext for commons images?
$this->mText = '';
-
+ }
}
}
/**
- * @param $terms Array: terms to highlight
+ * @param array $terms terms to highlight
* @return String: highlighted text snippet, null (and not '') if not supported
*/
function getTextSnippet( $terms ) {
global $wgUser, $wgAdvancedSearchHighlighting;
$this->initText();
+
+ // TODO: make highliter take a content object. Make ContentHandler a factory for SearchHighliter.
list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs( $wgUser );
$h = new SearchHighlighter();
if ( $wgAdvancedSearchHighlighting )
@@ -815,7 +823,7 @@ class SearchResult {
}
/**
- * @param $terms Array: terms to highlight
+ * @param array $terms terms to highlight
* @return String: highlighted title, '' if not supported
*/
function getTitleSnippet( $terms ) {
@@ -823,7 +831,7 @@ class SearchResult {
}
/**
- * @param $terms Array: terms to highlight
+ * @param array $terms terms to highlight
* @return String: highlighted redirect name (redirect to this page), '' if none or not supported
*/
function getRedirectSnippet( $terms ) {
@@ -934,7 +942,7 @@ class SearchHighlighter {
* Default implementation of wikitext highlighting
*
* @param $text String
- * @param $terms Array: terms to highlight (unescaped)
+ * @param array $terms terms to highlight (unescaped)
* @param $contextlines Integer
* @param $contextchars Integer
* @return String
@@ -962,7 +970,7 @@ class SearchHighlighter {
}
$spat .= '/';
$textExt = array(); // text extracts
- $otherExt = array(); // other extracts
+ $otherExt = array(); // other extracts
wfProfileIn( "$fname-split" );
$start = 0;
$textLen = strlen( $text );
@@ -1131,8 +1139,8 @@ class SearchHighlighter {
// add more lines
$add = $index + 1;
while ( $len < $targetchars - 20
- && array_key_exists( $add, $all )
- && !array_key_exists( $add, $snippets ) ) {
+ && array_key_exists( $add, $all )
+ && !array_key_exists( $add, $snippets ) ) {
$offsets[$add] = 0;
$tt = "\n" . $this->extract( $all[$add], 0, $targetchars - $len, $offsets[$add] );
$extended[$add] = $tt;
@@ -1142,7 +1150,7 @@ class SearchHighlighter {
}
}
- // $snippets = array_map('htmlspecialchars', $extended);
+ // $snippets = array_map( 'htmlspecialchars', $extended );
$snippets = $extended;
$last = - 1;
$extract = '';
@@ -1177,7 +1185,7 @@ class SearchHighlighter {
/**
* Split text into lines and add it to extracts array
*
- * @param $extracts Array: index -> $line
+ * @param array $extracts index -> $line
* @param $count Integer
* @param $text String
*/
@@ -1232,7 +1240,7 @@ class SearchHighlighter {
$posEnd = $end;
}
- if ( $end > $start ) {
+ if ( $end > $start ) {
return substr( $text, $start, $end - $start );
} else {
return '';
@@ -1272,12 +1280,12 @@ class SearchHighlighter {
/**
* Search extracts for a pattern, and return snippets
*
- * @param $pattern String: regexp for matching lines
- * @param $extracts Array: extracts to search
+ * @param string $pattern regexp for matching lines
+ * @param array $extracts extracts to search
* @param $linesleft Integer: number of extracts to make
* @param $contextchars Integer: length of snippet
- * @param $out Array: map for highlighted snippets
- * @param $offsets Array: map of starting points of snippets
+ * @param array $out map for highlighted snippets
+ * @param array $offsets map of starting points of snippets
* @protected
*/
function process( $pattern, $extracts, &$linesleft, &$contextchars, &$out, &$offsets ) {
@@ -1321,12 +1329,12 @@ class SearchHighlighter {
$fname = __METHOD__;
wfProfileIn( $fname );
- // $text = preg_replace("/'{2,5}/", "", $text);
- // $text = preg_replace("/\[[a-z]+:\/\/[^ ]+ ([^]]+)\]/", "\\2", $text);
- // $text = preg_replace("/\[\[([^]|]+)\]\]/", "\\1", $text);
- // $text = preg_replace("/\[\[([^]]+\|)?([^|]]+)\]\]/", "\\2", $text);
- // $text = preg_replace("/\\{\\|(.*?)\\|\\}/", "", $text);
- // $text = preg_replace("/\\[\\[[A-Za-z_-]+:([^|]+?)\\]\\]/", "", $text);
+ // $text = preg_replace( "/'{2,5}/", "", $text );
+ // $text = preg_replace( "/\[[a-z]+:\/\/[^ ]+ ([^]]+)\]/", "\\2", $text );
+ // $text = preg_replace( "/\[\[([^]|]+)\]\]/", "\\1", $text );
+ // $text = preg_replace( "/\[\[([^]]+\|)?([^|]]+)\]\]/", "\\2", $text );
+ // $text = preg_replace( "/\\{\\|(.*?)\\|\\}/", "", $text );
+ // $text = preg_replace( "/\\[\\[[A-Za-z_-]+:([^|]+?)\\]\\]/", "", $text );
$text = preg_replace( "/\\{\\{([^|]+?)\\}\\}/", "", $text );
$text = preg_replace( "/\\{\\{([^|]+\\|)(.*?)\\}\\}/", "\\2", $text );
$text = preg_replace( "/\\[\\[([^|]+?)\\]\\]/", "\\1", $text );
@@ -1408,8 +1416,7 @@ class SearchHighlighter {
$line = htmlspecialchars( $pre . $found . $post );
$pat2 = '/(' . $terms . ")/i";
- $line = preg_replace( $pat2,
- "<span class='searchmatch'>\\1</span>", $line );
+ $line = preg_replace( $pat2, "<span class='searchmatch'>\\1</span>", $line );
$extract .= "${line}\n";
}
diff --git a/includes/search/SearchIBM_DB2.php b/includes/search/SearchIBM_DB2.php
deleted file mode 100644
index 51ed000f..00000000
--- a/includes/search/SearchIBM_DB2.php
+++ /dev/null
@@ -1,234 +0,0 @@
-<?php
-/**
- * IBM DB2 search engine
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Search
- */
-
-/**
- * Search engine hook base class for IBM DB2
- * @ingroup Search
- */
-class SearchIBM_DB2 extends SearchEngine {
-
- /**
- * Creates an instance of this class
- * @param $db DatabaseIbm_db2: database object
- */
- function __construct($db) {
- parent::__construct( $db );
- }
-
- /**
- * Perform a full text search query and return a result set.
- *
- * @param $term String: raw search term
- * @return SqlSearchResultSet
- */
- function searchText( $term ) {
- $resultSet = $this->db->resultObject($this->db->query($this->getQuery($this->filter($term), true)));
- return new SqlSearchResultSet($resultSet, $this->searchTerms);
- }
-
- /**
- * Perform a title-only search query and return a result set.
- *
- * @param $term String: taw search term
- * @return SqlSearchResultSet
- */
- function searchTitle($term) {
- $resultSet = $this->db->resultObject($this->db->query($this->getQuery($this->filter($term), false)));
- return new SqlSearchResultSet($resultSet, $this->searchTerms);
- }
-
-
- /**
- * Return a partial WHERE clause to exclude redirects, if so set
- * @return String
- */
- function queryRedirect() {
- if ($this->showRedirects) {
- return '';
- } else {
- return 'AND page_is_redirect=0';
- }
- }
-
- /**
- * Return a partial WHERE clause to limit the search to the given namespaces
- * @return String
- */
- function queryNamespaces() {
- if( is_null($this->namespaces) )
- return '';
- $namespaces = implode(',', $this->namespaces);
- if ($namespaces == '') {
- $namespaces = '0';
- }
- return 'AND page_namespace IN (' . $namespaces . ')';
- }
-
- /**
- * Return a LIMIT clause to limit results on the query.
- * @return String
- */
- function queryLimit( $sql ) {
- return $this->db->limitResult($sql, $this->limit, $this->offset);
- }
-
- /**
- * Does not do anything for generic search engine
- * subclasses may define this though
- * @return String
- */
- function queryRanking($filteredTerm, $fulltext) {
- // requires Net Search Extender or equivalent
- // return ' ORDER BY score(1)';
- return '';
- }
-
- /**
- * Construct the full SQL query to do the search.
- * The guts shoulds be constructed in queryMain()
- * @param $filteredTerm String
- * @param $fulltext Boolean
- * @return String
- */
- function getQuery( $filteredTerm, $fulltext ) {
- return $this->queryLimit($this->queryMain($filteredTerm, $fulltext) . ' ' .
- $this->queryRedirect() . ' ' .
- $this->queryNamespaces() . ' ' .
- $this->queryRanking( $filteredTerm, $fulltext ) . ' ');
- }
-
-
- /**
- * Picks which field to index on, depending on what type of query.
- * @param $fulltext Boolean
- * @return String
- */
- function getIndexField($fulltext) {
- return $fulltext ? 'si_text' : 'si_title';
- }
-
- /**
- * Get the base part of the search query.
- *
- * @param $filteredTerm String
- * @param $fulltext Boolean
- * @return String
- */
- function queryMain( $filteredTerm, $fulltext ) {
- $match = $this->parseQuery($filteredTerm, $fulltext);
- $page = $this->db->tableName('page');
- $searchindex = $this->db->tableName('searchindex');
- return 'SELECT page_id, page_namespace, page_title ' .
- "FROM $page,$searchindex " .
- 'WHERE page_id=si_page AND ' . $match;
- }
-
- /** @todo document
- * @return string
- */
- function parseQuery($filteredText, $fulltext) {
- global $wgContLang;
- $lc = SearchEngine::legalSearchChars();
- $this->searchTerms = array();
-
- # @todo FIXME: This doesn't handle parenthetical expressions.
- $m = array();
- $q = array();
-
- if (preg_match_all('/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
- $filteredText, $m, PREG_SET_ORDER)) {
- foreach($m as $terms) {
-
- // Search terms in all variant forms, only
- // apply on wiki with LanguageConverter
- $temp_terms = $wgContLang->autoConvertToAllVariants( $terms[2] );
- if( is_array( $temp_terms )) {
- $temp_terms = array_unique( array_values( $temp_terms ));
- foreach( $temp_terms as $t )
- $q[] = $terms[1] . $wgContLang->normalizeForSearch( $t );
- }
- else
- $q[] = $terms[1] . $wgContLang->normalizeForSearch( $terms[2] );
-
- if (!empty($terms[3])) {
- $regexp = preg_quote( $terms[3], '/' );
- if ($terms[4])
- $regexp .= "[0-9A-Za-z_]+";
- } else {
- $regexp = preg_quote(str_replace('"', '', $terms[2]), '/');
- }
- $this->searchTerms[] = $regexp;
- }
- }
-
- $searchon = $this->db->strencode(join(',', $q));
- $field = $this->getIndexField($fulltext);
-
- // requires Net Search Extender or equivalent
- //return " CONTAINS($field, '$searchon') > 0 ";
-
- return " lcase($field) LIKE lcase('%$searchon%')";
- }
-
- /**
- * Create or update the search index record for the given page.
- * Title and text should be pre-processed.
- *
- * @param $id Integer
- * @param $title String
- * @param $text String
- */
- function update($id, $title, $text) {
- $dbw = wfGetDB(DB_MASTER);
- $dbw->replace('searchindex',
- array('si_page'),
- array(
- 'si_page' => $id,
- 'si_title' => $title,
- 'si_text' => $text
- ), 'SearchIBM_DB2::update' );
- // ?
- //$dbw->query("CALL ctx_ddl.sync_index('si_text_idx')");
- //$dbw->query("CALL ctx_ddl.sync_index('si_title_idx')");
- }
-
- /**
- * Update a search index record's title only.
- * Title should be pre-processed.
- *
- * @param $id Integer
- * @param $title String
- */
- function updateTitle($id, $title) {
- $dbw = wfGetDB(DB_MASTER);
-
- $dbw->update('searchindex',
- array('si_title' => $title),
- array('si_page' => $id),
- 'SearchIBM_DB2::updateTitle',
- array());
- }
-}
diff --git a/includes/search/SearchMssql.php b/includes/search/SearchMssql.php
index 69c92ba3..163d9dc3 100644
--- a/includes/search/SearchMssql.php
+++ b/includes/search/SearchMssql.php
@@ -38,7 +38,7 @@ class SearchMssql extends SearchEngine {
/**
* Perform a full text search query and return a result set.
*
- * @param $term String: raw search term
+ * @param string $term raw search term
* @return MssqlSearchResultSet
* @access public
*/
@@ -50,7 +50,7 @@ class SearchMssql extends SearchEngine {
/**
* Perform a title-only search query and return a result set.
*
- * @param $term String: raw search term
+ * @param string $term raw search term
* @return MssqlSearchResultSet
* @access public
*/
@@ -59,7 +59,6 @@ class SearchMssql extends SearchEngine {
return new MssqlSearchResultSet( $resultSet, $this->searchTerms );
}
-
/**
* Return a partial WHERE clause to exclude redirects, if so set
*
@@ -78,7 +77,7 @@ class SearchMssql extends SearchEngine {
* Return a partial WHERE clause to limit the search to the given namespaces
*
* @return String
- * @private
+ * @private
*/
function queryNamespaces() {
$namespaces = implode( ',', $this->namespaces );
@@ -144,9 +143,9 @@ class SearchMssql extends SearchEngine {
*/
function queryMain( $filteredTerm, $fulltext ) {
$match = $this->parseQuery( $filteredTerm, $fulltext );
- $page = $this->db->tableName( 'page' );
+ $page = $this->db->tableName( 'page' );
$searchindex = $this->db->tableName( 'searchindex' );
-
+
return 'SELECT page_id, page_namespace, page_title, ftindex.[RANK]' .
"FROM $page,FREETEXTTABLE($searchindex , $match, LANGUAGE 'English') as ftindex " .
'WHERE page_id=ftindex.[KEY] ';
@@ -192,11 +191,11 @@ class SearchMssql extends SearchEngine {
* @param $id Integer
* @param $title String
* @param $text String
- * @return bool|\ResultWrapper
+ * @return bool|ResultWrapper
*/
function update( $id, $title, $text ) {
// We store the column data as UTF-8 byte order marked binary stream
- // because we are invoking the plain text IFilter on it so that, and we want it
+ // because we are invoking the plain text IFilter on it so that, and we want it
// to properly decode the stream as UTF-8. SQL doesn't support UTF8 as a data type
// but the indexer will correctly handle it by this method. Since all we are doing
// is passing this data to the indexer and never retrieving it via PHP, this will save space
@@ -215,7 +214,7 @@ class SearchMssql extends SearchEngine {
*
* @param $id Integer
* @param $title String
- * @return bool|\ResultWrapper
+ * @return bool|ResultWrapper
*/
function updateTitle( $id, $title ) {
$table = $this->db->tableName( 'searchindex' );
@@ -253,5 +252,3 @@ class MssqlSearchResultSet extends SearchResultSet {
return new SearchResult( $row );
}
}
-
-
diff --git a/includes/search/SearchMySQL.php b/includes/search/SearchMySQL.php
index 5cee03e0..4a501fd0 100644
--- a/includes/search/SearchMySQL.php
+++ b/includes/search/SearchMySQL.php
@@ -58,7 +58,7 @@ class SearchMySQL extends SearchEngine {
# @todo FIXME: This doesn't handle parenthetical expressions.
$m = array();
if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
- $filteredText, $m, PREG_SET_ORDER ) ) {
+ $filteredText, $m, PREG_SET_ORDER ) ) {
foreach( $m as $bits ) {
@list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
@@ -156,7 +156,7 @@ class SearchMySQL extends SearchEngine {
/**
* Perform a full text search query and return a result set.
*
- * @param $term String: raw search term
+ * @param string $term raw search term
* @return MySQLSearchResultSet
*/
function searchText( $term ) {
@@ -166,7 +166,7 @@ class SearchMySQL extends SearchEngine {
/**
* Perform a title-only search query and return a result set.
*
- * @param $term String: raw search term
+ * @param string $term raw search term
* @return MySQLSearchResultSet
*/
function searchTitle( $term ) {
@@ -221,7 +221,7 @@ class SearchMySQL extends SearchEngine {
*/
protected function queryFeatures( &$query ) {
foreach ( $this->features as $feature => $value ) {
- if ( $feature === 'list-redirects' && !$value ) {
+ if ( $feature === 'list-redirects' && !$value ) {
$query['conds']['page_is_redirect'] = 0;
} elseif( $feature === 'title-suffix-filter' && $value ) {
$query['conds'][] = 'page_title' . $this->db->buildLike( $this->db->anyString(), $value );
diff --git a/includes/search/SearchOracle.php b/includes/search/SearchOracle.php
index a2db52f3..b0ea97fe 100644
--- a/includes/search/SearchOracle.php
+++ b/includes/search/SearchOracle.php
@@ -29,77 +29,76 @@
* @ingroup Search
*/
class SearchOracle extends SearchEngine {
-
- private $reservedWords = array ('ABOUT' => 1,
- 'ACCUM' => 1,
- 'AND' => 1,
- 'BT' => 1,
- 'BTG' => 1,
- 'BTI' => 1,
+
+ private $reservedWords = array ('ABOUT' => 1,
+ 'ACCUM' => 1,
+ 'AND' => 1,
+ 'BT' => 1,
+ 'BTG' => 1,
+ 'BTI' => 1,
'BTP' => 1,
- 'FUZZY' => 1,
- 'HASPATH' => 1,
- 'INPATH' => 1,
- 'MINUS' => 1,
- 'NEAR' => 1,
+ 'FUZZY' => 1,
+ 'HASPATH' => 1,
+ 'INPATH' => 1,
+ 'MINUS' => 1,
+ 'NEAR' => 1,
'NOT' => 1,
- 'NT' => 1,
- 'NTG' => 1,
- 'NTI' => 1,
- 'NTP' => 1,
- 'OR' => 1,
- 'PT' => 1,
- 'RT' => 1,
+ 'NT' => 1,
+ 'NTG' => 1,
+ 'NTI' => 1,
+ 'NTP' => 1,
+ 'OR' => 1,
+ 'PT' => 1,
+ 'RT' => 1,
'SQE' => 1,
- 'SYN' => 1,
- 'TR' => 1,
- 'TRSYN' => 1,
- 'TT' => 1,
+ 'SYN' => 1,
+ 'TR' => 1,
+ 'TRSYN' => 1,
+ 'TT' => 1,
'WITHIN' => 1);
/**
* Creates an instance of this class
* @param $db DatabasePostgres: database object
*/
- function __construct($db) {
+ function __construct( $db ) {
parent::__construct( $db );
}
/**
* Perform a full text search query and return a result set.
*
- * @param $term String: raw search term
+ * @param string $term raw search term
* @return SqlSearchResultSet
*/
function searchText( $term ) {
- if ($term == '')
- return new SqlSearchResultSet(false, '');
+ if ( $term == '' )
+ return new SqlSearchResultSet( false, '' );
- $resultSet = $this->db->resultObject($this->db->query($this->getQuery($this->filter($term), true)));
- return new SqlSearchResultSet($resultSet, $this->searchTerms);
+ $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), true ) ) );
+ return new SqlSearchResultSet( $resultSet, $this->searchTerms );
}
/**
* Perform a title-only search query and return a result set.
*
- * @param $term String: raw search term
+ * @param string $term raw search term
* @return SqlSearchResultSet
*/
- function searchTitle($term) {
- if ($term == '')
- return new SqlSearchResultSet(false, '');
+ function searchTitle( $term ) {
+ if ( $term == '' )
+ return new SqlSearchResultSet( false, '' );
- $resultSet = $this->db->resultObject($this->db->query($this->getQuery($this->filter($term), false)));
- return new MySQLSearchResultSet($resultSet, $this->searchTerms);
+ $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), false ) ) );
+ return new MySQLSearchResultSet( $resultSet, $this->searchTerms );
}
-
/**
* Return a partial WHERE clause to exclude redirects, if so set
* @return String
*/
function queryRedirect() {
- if ($this->showRedirects) {
+ if ( $this->showRedirects ) {
return '';
} else {
return 'AND page_is_redirect=0';
@@ -111,7 +110,7 @@ class SearchOracle extends SearchEngine {
* @return String
*/
function queryNamespaces() {
- if( is_null($this->namespaces) )
+ if( is_null( $this->namespaces ) )
return '';
if ( !count( $this->namespaces ) ) {
$namespaces = '0';
@@ -129,7 +128,7 @@ class SearchOracle extends SearchEngine {
* @return String
*/
function queryLimit( $sql ) {
- return $this->db->limitResult($sql, $this->limit, $this->offset);
+ return $this->db->limitResult( $sql, $this->limit, $this->offset );
}
/**
@@ -150,19 +149,18 @@ class SearchOracle extends SearchEngine {
* @return String
*/
function getQuery( $filteredTerm, $fulltext ) {
- return $this->queryLimit($this->queryMain($filteredTerm, $fulltext) . ' ' .
+ return $this->queryLimit( $this->queryMain( $filteredTerm, $fulltext ) . ' ' .
$this->queryRedirect() . ' ' .
$this->queryNamespaces() . ' ' .
- $this->queryRanking( $filteredTerm, $fulltext ) . ' ');
+ $this->queryRanking( $filteredTerm, $fulltext ) . ' ' );
}
-
/**
* Picks which field to index on, depending on what type of query.
* @param $fulltext Boolean
* @return String
*/
- function getIndexField($fulltext) {
+ function getIndexField( $fulltext ) {
return $fulltext ? 'si_text' : 'si_title';
}
@@ -174,9 +172,9 @@ class SearchOracle extends SearchEngine {
* @return String
*/
function queryMain( $filteredTerm, $fulltext ) {
- $match = $this->parseQuery($filteredTerm, $fulltext);
- $page = $this->db->tableName('page');
- $searchindex = $this->db->tableName('searchindex');
+ $match = $this->parseQuery( $filteredTerm, $fulltext );
+ $page = $this->db->tableName( 'page' );
+ $searchindex = $this->db->tableName( 'searchindex' );
return 'SELECT page_id, page_namespace, page_title ' .
"FROM $page,$searchindex " .
'WHERE page_id=si_page AND ' . $match;
@@ -187,7 +185,7 @@ class SearchOracle extends SearchEngine {
* as part of a WHERE clause
* @return string
*/
- function parseQuery($filteredText, $fulltext) {
+ function parseQuery( $filteredText, $fulltext ) {
global $wgContLang;
$lc = SearchEngine::legalSearchChars();
$this->searchTerms = array();
@@ -195,9 +193,9 @@ class SearchOracle extends SearchEngine {
# @todo FIXME: This doesn't handle parenthetical expressions.
$m = array();
$searchon = '';
- if (preg_match_all('/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
- $filteredText, $m, PREG_SET_ORDER)) {
- foreach($m as $terms) {
+ if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
+ $filteredText, $m, PREG_SET_ORDER ) ) {
+ foreach( $m as $terms ) {
// Search terms in all variant forms, only
// apply on wiki with LanguageConverter
$temp_terms = $wgContLang->autoConvertToAllVariants( $terms[2] );
@@ -210,27 +208,26 @@ class SearchOracle extends SearchEngine {
else {
$searchon .= ($terms[1] == '-' ? ' ~' : ' & ') . $this->escapeTerm( $terms[2] );
}
- if (!empty($terms[3])) {
+ if ( !empty( $terms[3] ) ) {
$regexp = preg_quote( $terms[3], '/' );
- if ($terms[4])
+ if ( $terms[4] )
$regexp .= "[0-9A-Za-z_]+";
} else {
- $regexp = preg_quote(str_replace('"', '', $terms[2]), '/');
+ $regexp = preg_quote( str_replace( '"', '', $terms[2] ), '/' );
}
$this->searchTerms[] = $regexp;
}
}
-
- $searchon = $this->db->addQuotes(ltrim($searchon, ' &'));
- $field = $this->getIndexField($fulltext);
+ $searchon = $this->db->addQuotes( ltrim( $searchon, ' &' ) );
+ $field = $this->getIndexField( $fulltext );
return " CONTAINS($field, $searchon, 1) > 0 ";
}
- private function escapeTerm($t) {
+ private function escapeTerm( $t ) {
global $wgContLang;
- $t = $wgContLang->normalizeForSearch($t);
- $t = isset($this->reservedWords[strtoupper($t)]) ? '{'.$t.'}' : $t;
+ $t = $wgContLang->normalizeForSearch( $t );
+ $t = isset( $this->reservedWords[strtoupper( $t )] ) ? '{'.$t.'}' : $t;
$t = preg_replace('/^"(.*)"$/', '($1)', $t);
$t = preg_replace('/([-&|])/', '\\\\$1', $t);
return $t;
@@ -243,10 +240,10 @@ class SearchOracle extends SearchEngine {
* @param $title String
* @param $text String
*/
- function update($id, $title, $text) {
- $dbw = wfGetDB(DB_MASTER);
- $dbw->replace('searchindex',
- array('si_page'),
+ function update( $id, $title, $text ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->replace( 'searchindex',
+ array( 'si_page' ),
array(
'si_page' => $id,
'si_title' => $title,
@@ -254,13 +251,13 @@ class SearchOracle extends SearchEngine {
), 'SearchOracle::update' );
// Sync the index
- // We need to specify the DB name (i.e. user/schema) here so that
+ // We need to specify the DB name (i.e. user/schema) here so that
// it can work from the installer, where
// ALTER SESSION SET CURRENT_SCHEMA = ...
// was used.
- $dbw->query( "CALL ctx_ddl.sync_index(" .
+ $dbw->query( "CALL ctx_ddl.sync_index(" .
$dbw->addQuotes( $dbw->getDBname() . '.' . $dbw->tableName( 'si_text_idx', 'raw' ) ) . ")" );
- $dbw->query( "CALL ctx_ddl.sync_index(" .
+ $dbw->query( "CALL ctx_ddl.sync_index(" .
$dbw->addQuotes( $dbw->getDBname() . '.' . $dbw->tableName( 'si_title_idx', 'raw' ) ) . ")" );
}
@@ -271,17 +268,16 @@ class SearchOracle extends SearchEngine {
* @param $id Integer
* @param $title String
*/
- function updateTitle($id, $title) {
- $dbw = wfGetDB(DB_MASTER);
+ function updateTitle( $id, $title ) {
+ $dbw = wfGetDB( DB_MASTER );
- $dbw->update('searchindex',
- array('si_title' => $title),
- array('si_page' => $id),
+ $dbw->update( 'searchindex',
+ array( 'si_title' => $title ),
+ array( 'si_page' => $id ),
'SearchOracle::updateTitle',
- array());
+ array() );
}
-
public static function legalSearchChars() {
return "\"" . parent::legalSearchChars();
}
diff --git a/includes/search/SearchPostgres.php b/includes/search/SearchPostgres.php
index 68648894..56464e98 100644
--- a/includes/search/SearchPostgres.php
+++ b/includes/search/SearchPostgres.php
@@ -47,15 +47,15 @@ class SearchPostgres extends SearchEngine {
* Currently searches a page's current title (page.page_title) and
* latest revision article text (pagecontent.old_text)
*
- * @param $term String: raw search term
+ * @param string $term raw search term
* @return PostgresSearchResultSet
*/
function searchTitle( $term ) {
- $q = $this->searchQuery( $term , 'titlevector', 'page_title' );
- $olderror = error_reporting(E_ERROR);
+ $q = $this->searchQuery( $term, 'titlevector', 'page_title' );
+ $olderror = error_reporting( E_ERROR );
$resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) );
- error_reporting($olderror);
- if (!$resultSet) {
+ error_reporting( $olderror );
+ if ( !$resultSet ) {
// Needed for "Query requires full scan, GIN doesn't support it"
return new SearchResultTooMany();
}
@@ -66,8 +66,8 @@ class SearchPostgres extends SearchEngine {
$q = $this->searchQuery( $term, 'textvector', 'old_text' );
$olderror = error_reporting(E_ERROR);
$resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) );
- error_reporting($olderror);
- if (!$resultSet) {
+ error_reporting( $olderror );
+ if ( !$resultSet ) {
return new SearchResultTooMany();
}
return new PostgresSearchResultSet( $resultSet, $this->searchTerms );
@@ -99,16 +99,16 @@ class SearchPostgres extends SearchEngine {
$m = array();
if( preg_match_all('/([-!]?)(\S+)\s*/', $term, $m, PREG_SET_ORDER ) ) {
foreach( $m as $terms ) {
- if (strlen($terms[1])) {
+ if ( strlen( $terms[1] ) ) {
$searchstring .= ' & !';
}
- if (strtolower($terms[2]) === 'and') {
+ if ( strtolower( $terms[2] ) === 'and' ) {
$searchstring .= ' & ';
}
- elseif (strtolower($terms[2]) === 'or' or $terms[2] === '|') {
+ elseif ( strtolower( $terms[2] ) === 'or' or $terms[2] === '|' ) {
$searchstring .= ' | ';
}
- elseif (strtolower($terms[2]) === 'not') {
+ elseif ( strtolower( $terms[2] ) === 'not' ) {
$searchstring .= ' & !';
}
else {
@@ -133,7 +133,7 @@ class SearchPostgres extends SearchEngine {
$searchstring = preg_replace('/^[\'"](.*)[\'"]$/', "$1", $searchstring);
## Quote the whole thing
- $searchstring = $this->db->addQuotes($searchstring);
+ $searchstring = $this->db->addQuotes( $searchstring );
wfDebug( "parseQuery returned: $searchstring \n" );
@@ -154,15 +154,15 @@ class SearchPostgres extends SearchEngine {
## We need a separate query here so gin does not complain about empty searches
$SQL = "SELECT to_tsquery($searchstring)";
- $res = $this->db->query($SQL);
- if (!$res) {
+ $res = $this->db->query( $SQL );
+ if ( !$res ) {
## TODO: Better output (example to catch: one 'two)
- die ("Sorry, that was not a valid search string. Please go back and try again");
+ die( "Sorry, that was not a valid search string. Please go back and try again" );
}
$top = $res->fetchRow();
$top = $top[0];
- if ($top === "") { ## e.g. if only stopwords are used XXX return something better
+ if ( $top === "" ) { ## e.g. if only stopwords are used XXX return something better
$query = "SELECT page_id, page_namespace, page_title, 0 AS score ".
"FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
"AND r.rev_text_id = c.old_id AND 1=0";
@@ -182,14 +182,14 @@ class SearchPostgres extends SearchEngine {
}
## Redirects
- if (! $this->showRedirects)
+ if ( !$this->showRedirects )
$query .= ' AND page_is_redirect = 0';
## Namespaces - defaults to 0
- if( !is_null($this->namespaces) ){ // null -> search all
- if ( count($this->namespaces) < 1)
+ if( !is_null( $this->namespaces ) ) { // null -> search all
+ if ( count( $this->namespaces ) < 1 ) {
$query .= ' AND page_namespace = 0';
- else {
+ } else {
$namespaces = $this->db->makeList( $this->namespaces );
$query .= " AND page_namespace IN ($namespaces)";
}
@@ -211,7 +211,7 @@ class SearchPostgres extends SearchEngine {
$SQL = "UPDATE pagecontent SET textvector = NULL WHERE old_id IN ".
"(SELECT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) .
" ORDER BY rev_text_id DESC OFFSET 1)";
- $this->db->query($SQL);
+ $this->db->query( $SQL );
return true;
}
@@ -226,7 +226,7 @@ class SearchPostgres extends SearchEngine {
*/
class PostgresSearchResult extends SearchResult {
function __construct( $row ) {
- parent::__construct($row);
+ parent::__construct( $row );
$this->score = $row->score;
}
function getScore() {
diff --git a/includes/search/SearchSqlite.php b/includes/search/SearchSqlite.php
index e52e4fe3..f3f4788c 100644
--- a/includes/search/SearchSqlite.php
+++ b/includes/search/SearchSqlite.php
@@ -62,7 +62,7 @@ class SearchSqlite extends SearchEngine {
$m = array();
if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
- $filteredText, $m, PREG_SET_ORDER ) ) {
+ $filteredText, $m, PREG_SET_ORDER ) ) {
foreach( $m as $bits ) {
@list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
@@ -156,7 +156,7 @@ class SearchSqlite extends SearchEngine {
/**
* Perform a full text search query and return a result set.
*
- * @param $term String: raw search term
+ * @param string $term raw search term
* @return SqliteSearchResultSet
*/
function searchText( $term ) {
@@ -166,7 +166,7 @@ class SearchSqlite extends SearchEngine {
/**
* Perform a title-only search query and return a result set.
*
- * @param $term String: raw search term
+ * @param string $term raw search term
* @return SqliteSearchResultSet
*/
function searchTitle( $term ) {
@@ -196,7 +196,6 @@ class SearchSqlite extends SearchEngine {
return new SqliteSearchResultSet( $resultSet, $this->searchTerms, $total );
}
-
/**
* Return a partial WHERE clause to exclude redirects, if so set
* @return String
@@ -214,7 +213,7 @@ class SearchSqlite extends SearchEngine {
* @return String
*/
function queryNamespaces() {
- if( is_null($this->namespaces) )
+ if( is_null( $this->namespaces ) )
return ''; # search all
if ( !count( $this->namespaces ) ) {
$namespaces = '0';
@@ -266,7 +265,7 @@ class SearchSqlite extends SearchEngine {
*/
function queryMain( $filteredTerm, $fulltext ) {
$match = $this->parseQuery( $filteredTerm, $fulltext );
- $page = $this->db->tableName( 'page' );
+ $page = $this->db->tableName( 'page' );
$searchindex = $this->db->tableName( 'searchindex' );
return "SELECT $searchindex.rowid, page_namespace, page_title " .
"FROM $page,$searchindex " .
@@ -275,7 +274,7 @@ class SearchSqlite extends SearchEngine {
function getCountQuery( $filteredTerm, $fulltext ) {
$match = $this->parseQuery( $filteredTerm, $fulltext );
- $page = $this->db->tableName( 'page' );
+ $page = $this->db->tableName( 'page' );
$searchindex = $this->db->tableName( 'searchindex' );
return "SELECT COUNT(*) AS c " .
"FROM $page,$searchindex " .
@@ -317,7 +316,7 @@ class SearchSqlite extends SearchEngine {
* @param $id Integer
* @param $title String
*/
- function updateTitle( $id, $title ) {
+ function updateTitle( $id, $title ) {
if ( !$this->fulltextSearchSupported() ) {
return;
}
diff --git a/includes/search/SearchUpdate.php b/includes/search/SearchUpdate.php
index 40dd36c2..eabcda3e 100644
--- a/includes/search/SearchUpdate.php
+++ b/includes/search/SearchUpdate.php
@@ -34,7 +34,12 @@ class SearchUpdate implements DeferrableUpdate {
private $mTitleWords;
function __construct( $id, $title, $text = false ) {
- $nt = Title::newFromText( $title );
+ if ( is_string( $title ) ) {
+ $nt = Title::newFromText( $title );
+ } else {
+ $nt = $title;
+ }
+
if( $nt ) {
$this->mId = $id;
$this->mText = $text;
@@ -74,7 +79,7 @@ class SearchUpdate implements DeferrableUpdate {
$text = preg_replace( "/<\\/?\\s*[A-Za-z][^>]*?>/",
' ', $wgContLang->lc( " " . $text . " " ) ); # Strip HTML markup
$text = preg_replace( "/(^|\\n)==\\s*([^\\n]+)\\s*==(\\s)/sD",
- "\\1\\2 \\2 \\2\\3", $text ); # Emphasize headings
+ "\\1\\2 \\2 \\2\\3", $text ); # Emphasize headings
# Strip external URLs
$uc = "A-Za-z0-9_\\/:.,~%\\-+&;#?!=()@\\x80-\\xFF";
@@ -92,7 +97,7 @@ class SearchUpdate implements DeferrableUpdate {
$text = preg_replace( $pat2, " \\1 \\3", $text );
$text = preg_replace( "/([^{$lc}])([{$lc}]+)]]([a-z]+)/",
- "\\1\\2 \\2\\3", $text ); # Handle [[game]]s
+ "\\1\\2 \\2\\3", $text ); # Handle [[game]]s
# Strip all remaining non-search characters
$text = preg_replace( "/[^{$lc}]+/", " ", $text );
@@ -122,7 +127,7 @@ class SearchUpdate implements DeferrableUpdate {
wfRunHooks( 'SearchUpdate', array( $this->mId, $this->mNamespace, $this->mTitle, &$text ) );
# Perform the actual update
- $search->update($this->mId, $search->normalizeText( Title::indexTitle( $this->mNamespace, $this->mTitle ) ),
+ $search->update( $this->mId, $search->normalizeText( Title::indexTitle( $this->mNamespace, $this->mTitle ) ),
$search->normalizeText( $text ) );
wfProfileOut( __METHOD__ );
diff --git a/includes/site/MediaWikiSite.php b/includes/site/MediaWikiSite.php
new file mode 100644
index 00000000..05092723
--- /dev/null
+++ b/includes/site/MediaWikiSite.php
@@ -0,0 +1,352 @@
+<?php
+/**
+ * Class representing a MediaWiki site.
+ *
+ * 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 Site
+ * @license GNU GPL v2+
+ * @author John Erling Blad < jeblad@gmail.com >
+ * @author Daniel Kinzler
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+
+/**
+ * Class representing a MediaWiki site.
+ *
+ * @since 1.21
+ *
+ * @ingroup Site
+ */
+class MediaWikiSite extends Site {
+
+ const PATH_FILE = 'file_path';
+ const PATH_PAGE = 'page_path';
+
+ /**
+ * @since 1.21
+ * @deprecated Just use the constructor or the factory Site::newForType
+ *
+ * @param integer $globalId
+ *
+ * @return MediaWikiSite
+ */
+ public static function newFromGlobalId( $globalId ) {
+ $site = new static();
+ $site->setGlobalId( $globalId );
+ return $site;
+ }
+
+ /**
+ * Constructor.
+ *
+ * @since 1.21
+ *
+ * @param string $type
+ */
+ public function __construct( $type = self::TYPE_MEDIAWIKI ) {
+ parent::__construct( $type );
+ }
+
+ /**
+ * Returns the database form of the given title.
+ *
+ * @since 1.21
+ *
+ * @param string $title the target page's title, in normalized form.
+ *
+ * @return String
+ */
+ public function toDBKey( $title ) {
+ return str_replace( ' ', '_', $title );
+ }
+
+ /**
+ * Returns the normalized form of the given page title, using the normalization rules of the given site.
+ * If the given title is a redirect, the redirect weill be resolved and the redirect target is returned.
+ *
+ * @note : This actually makes an API request to the remote site, so beware that this function is slow and depends
+ * on an external service.
+ *
+ * @note : If MW_PHPUNIT_TEST is defined, the call to the external site is skipped, and the title
+ * is normalized using the local normalization rules as implemented by the Title class.
+ *
+ * @see Site::normalizePageName
+ *
+ * @since 1.21
+ *
+ * @param string $pageName
+ *
+ * @return string
+ * @throws MWException
+ */
+ public function normalizePageName( $pageName ) {
+
+ // Check if we have strings as arguments.
+ if ( !is_string( $pageName ) ) {
+ throw new MWException( '$pageName must be a string' );
+ }
+
+ // Go on call the external site
+ if ( defined( 'MW_PHPUNIT_TEST' ) ) {
+ // If the code is under test, don't call out to other sites, just normalize locally.
+ // Note: this may cause results to be inconsistent with the actual normalization used by the respective remote site!
+
+ $t = Title::newFromText( $pageName );
+ return $t->getPrefixedText();
+ } else {
+
+ // Make sure the string is normalized into NFC (due to the bug 40017)
+ // but do nothing to the whitespaces, that should work appropriately.
+ // @see https://bugzilla.wikimedia.org/show_bug.cgi?id=40017
+ $pageName = UtfNormal::cleanUp( $pageName );
+
+ // Build the args for the specific call
+ $args = array(
+ 'action' => 'query',
+ 'prop' => 'info',
+ 'redirects' => true,
+ 'converttitles' => true,
+ 'format' => 'json',
+ 'titles' => $pageName,
+ //@todo: options for maxlag and maxage
+ // Note that maxlag will lead to a long delay before a reply is made,
+ // but that maxage can avoid the extreme delay. On the other hand
+ // maxage could be nice to use anyhow as it stops unnecessary requests.
+ // Also consider smaxage if maxage is used.
+ );
+
+ $url = $this->getFileUrl( 'api.php' ) . '?' . wfArrayToCgi( $args );
+
+ // Go on call the external site
+ //@todo: we need a good way to specify a timeout here.
+ $ret = Http::get( $url );
+ }
+
+ if ( $ret === false ) {
+ wfDebugLog( "MediaWikiSite", "call to external site failed: $url" );
+ return false;
+ }
+
+ $data = FormatJson::decode( $ret, true );
+
+ if ( !is_array( $data ) ) {
+ wfDebugLog( "MediaWikiSite", "call to <$url> returned bad json: " . $ret );
+ return false;
+ }
+
+ $page = static::extractPageRecord( $data, $pageName );
+
+ if ( isset( $page['missing'] ) ) {
+ wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for a missing page title! " . $ret );
+ return false;
+ }
+
+ if ( isset( $page['invalid'] ) ) {
+ wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for an invalid page title! " . $ret );
+ return false;
+ }
+
+ if ( !isset( $page['title'] ) ) {
+ wfDebugLog( "MediaWikiSite", "call to <$url> did not return a page title! " . $ret );
+ return false;
+ }
+
+ return $page['title'];
+ }
+
+ /**
+ * Get normalization record for a given page title from an API response.
+ *
+ * @since 1.21
+ *
+ * @param array $externalData A reply from the API on a external server.
+ * @param string $pageTitle Identifies the page at the external site, needing normalization.
+ *
+ * @return array|boolean a 'page' structure representing the page identified by $pageTitle.
+ */
+ private static function extractPageRecord( $externalData, $pageTitle ) {
+ // If there is a special case with only one returned page
+ // we can cheat, and only return
+ // the single page in the "pages" substructure.
+ if ( isset( $externalData['query']['pages'] ) ) {
+ $pages = array_values( $externalData['query']['pages'] );
+ if ( count( $pages) === 1 ) {
+ return $pages[0];
+ }
+ }
+ // This is only used during internal testing, as it is assumed
+ // a more optimal (and lossfree) storage.
+ // Make initial checks and return if prerequisites are not meet.
+ if ( !is_array( $externalData ) || !isset( $externalData['query'] ) ) {
+ return false;
+ }
+ // Loop over the tree different named structures, that otherwise are similar
+ $structs = array(
+ 'normalized' => 'from',
+ 'converted' => 'from',
+ 'redirects' => 'from',
+ 'pages' => 'title'
+ );
+ foreach ( $structs as $listId => $fieldId ) {
+ // Check if the substructure exist at all.
+ if ( !isset( $externalData['query'][$listId] ) ) {
+ continue;
+ }
+ // Filter the substructure down to what we actually are using.
+ $collectedHits = array_filter(
+ array_values( $externalData['query'][$listId] ),
+ function( $a ) use ( $fieldId, $pageTitle ) {
+ return $a[$fieldId] === $pageTitle;
+ }
+ );
+ // If still looping over normalization, conversion or redirects,
+ // then we need to keep the new page title for later rounds.
+ if ( $fieldId === 'from' && is_array( $collectedHits ) ) {
+ switch ( count( $collectedHits ) ) {
+ case 0:
+ break;
+ case 1:
+ $pageTitle = $collectedHits[0]['to'];
+ break;
+ default:
+ return false;
+ }
+ }
+ // If on the pages structure we should prepare for returning.
+ elseif ( $fieldId === 'title' && is_array( $collectedHits ) ) {
+ switch ( count( $collectedHits ) ) {
+ case 0:
+ return false;
+ case 1:
+ return array_shift( $collectedHits );
+ default:
+ return false;
+ }
+ }
+ }
+ // should never be here
+ return false;
+ }
+
+ /**
+ * @see Site::getLinkPathType
+ * Returns Site::PATH_PAGE
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function getLinkPathType() {
+ return self::PATH_PAGE;
+ }
+
+ /**
+ * Returns the relative page path.
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function getRelativePagePath() {
+ return parse_url( $this->getPath( self::PATH_PAGE ), PHP_URL_PATH );
+ }
+
+ /**
+ * Returns the relative file path.
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function getRelativeFilePath() {
+ return parse_url( $this->getPath( self::PATH_FILE ), PHP_URL_PATH );
+ }
+
+ /**
+ * Sets the relative page path.
+ *
+ * @since 1.21
+ *
+ * @param string $path
+ */
+ public function setPagePath( $path ) {
+ $this->setPath( self::PATH_PAGE, $path );
+ }
+
+ /**
+ * Sets the relative file path.
+ *
+ * @since 1.21
+ *
+ * @param string $path
+ */
+ public function setFilePath( $path ) {
+ $this->setPath( self::PATH_FILE, $path );
+ }
+
+ /**
+ * @see Site::getPageUrl
+ *
+ * This implementation returns a URL constructed using the path returned by getLinkPath().
+ * In addition to the default behavior implemented by Site::getPageUrl(), this
+ * method converts the $pageName to DBKey-format by replacing spaces with underscores
+ * before using it in the URL.
+ *
+ * @since 1.21
+ *
+ * @param string|boolean $pageName Page name or false (default: false)
+ *
+ * @return string
+ */
+ public function getPageUrl( $pageName = false ) {
+ $url = $this->getLinkPath();
+
+ if ( $url === false ) {
+ return false;
+ }
+
+ if ( $pageName !== false ) {
+ $pageName = $this->toDBKey( trim( $pageName ) );
+ $url = str_replace( '$1', wfUrlencode( $pageName ), $url );
+ }
+
+ return $url;
+ }
+
+ /**
+ * Returns the full file path (ie site url + relative file path).
+ * The path should go at the $1 marker. If the $path
+ * argument is provided, the marker will be replaced by it's value.
+ *
+ * @since 1.21
+ *
+ * @param string|boolean $path
+ *
+ * @return string
+ */
+ public function getFileUrl( $path = false ) {
+ $filePath = $this->getPath( self::PATH_FILE );
+
+ if ( $filePath !== false ) {
+ $filePath = str_replace( '$1', $path, $filePath );
+ }
+
+ return $filePath;
+ }
+
+}
diff --git a/includes/site/Site.php b/includes/site/Site.php
new file mode 100644
index 00000000..076dc88c
--- /dev/null
+++ b/includes/site/Site.php
@@ -0,0 +1,702 @@
+<?php
+
+/**
+ * Represents a single site.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class Site implements Serializable {
+
+ const TYPE_UNKNOWN = 'unknown';
+ const TYPE_MEDIAWIKI = 'mediawiki';
+
+ const GROUP_NONE = 'none';
+
+ const ID_INTERWIKI = 'interwiki';
+ const ID_EQUIVALENT = 'equivalent';
+
+ const SOURCE_LOCAL = 'local';
+
+ const PATH_LINK = 'link';
+
+ /**
+ * A version ID that identifies the serialization structure used by getSerializationData()
+ * and unserialize(). This is useful for constructing cache keys in cases where the cache relies
+ * on serialization for storing the SiteList.
+ *
+ * @var string A string uniquely identifying the version of the serialization structure.
+ */
+ const SERIAL_VERSION_ID = '2013-01-23';
+
+ /**
+ * @since 1.21
+ *
+ * @var string|null
+ */
+ protected $globalId = null;
+
+ /**
+ * @since 1.21
+ *
+ * @var string
+ */
+ protected $type = self::TYPE_UNKNOWN;
+
+ /**
+ * @since 1.21
+ *
+ * @var string
+ */
+ protected $group = self::GROUP_NONE;
+
+ /**
+ * @since 1.21
+ *
+ * @var string
+ */
+ protected $source = self::SOURCE_LOCAL;
+
+ /**
+ * @since 1.21
+ *
+ * @var string|null
+ */
+ protected $languageCode = null;
+
+ /**
+ * Holds the local ids for this site.
+ * local id type => [ ids for this type (strings) ]
+ *
+ * @since 1.21
+ *
+ * @var array[]
+ */
+ protected $localIds = array();
+
+ /**
+ * @since 1.21
+ *
+ * @var array
+ */
+ protected $extraData = array();
+
+ /**
+ * @since 1.21
+ *
+ * @var array
+ */
+ protected $extraConfig = array();
+
+ /**
+ * @since 1.21
+ *
+ * @var bool
+ */
+ protected $forward = false;
+
+ /**
+ * @since 1.21
+ *
+ * @var int|null
+ */
+ protected $internalId = null;
+
+ /**
+ * Constructor.
+ *
+ * @since 1.21
+ *
+ * @param string $type
+ */
+ public function __construct( $type = self::TYPE_UNKNOWN ) {
+ $this->type = $type;
+ }
+
+ /**
+ * Returns the global site identifier (ie enwiktionary).
+ *
+ * @since 1.21
+ *
+ * @return string|null
+ */
+ public function getGlobalId() {
+ return $this->globalId;
+ }
+
+ /**
+ * Sets the global site identifier (ie enwiktionary).
+ *
+ * @since 1.21
+ *
+ * @param string|null $globalId
+ *
+ * @throws MWException
+ */
+ public function setGlobalId( $globalId ) {
+ if ( $globalId !== null && !is_string( $globalId ) ) {
+ throw new MWException( '$globalId needs to be string or null' );
+ }
+
+ $this->globalId = $globalId;
+ }
+
+ /**
+ * Returns the type of the site (ie mediawiki).
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function getType() {
+ return $this->type;
+ }
+
+ /**
+ * Gets the type of the site (ie wikipedia).
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function getGroup() {
+ return $this->group;
+ }
+
+ /**
+ * Sets the type of the site (ie wikipedia).
+ *
+ * @since 1.21
+ *
+ * @param string $group
+ *
+ * @throws MWException
+ */
+ public function setGroup( $group ) {
+ if ( !is_string( $group ) ) {
+ throw new MWException( '$group needs to be a string' );
+ }
+
+ $this->group = $group;
+ }
+
+ /**
+ * Returns the source of the site data (ie 'local', 'wikidata', 'my-magical-repo').
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function getSource() {
+ return $this->source;
+ }
+
+ /**
+ * Sets the source of the site data (ie 'local', 'wikidata', 'my-magical-repo').
+ *
+ * @since 1.21
+ *
+ * @param string $source
+ *
+ * @throws MWException
+ */
+ public function setSource( $source ) {
+ if ( !is_string( $source ) ) {
+ throw new MWException( '$source needs to be a string' );
+ }
+
+ $this->source = $source;
+ }
+
+ /**
+ * Gets if site.tld/path/key:pageTitle should forward users to the page on
+ * the actual site, where "key" is the local identifier.
+ *
+ * @since 1.21
+ *
+ * @return boolean
+ */
+ public function shouldForward() {
+ return $this->forward;
+ }
+
+ /**
+ * Sets if site.tld/path/key:pageTitle should forward users to the page on
+ * the actual site, where "key" is the local identifier.
+ *
+ * @since 1.21
+ *
+ * @param boolean $shouldForward
+ *
+ * @throws MWException
+ */
+ public function setForward( $shouldForward ) {
+ if ( !is_bool( $shouldForward ) ) {
+ throw new MWException( '$shouldForward needs to be a boolean' );
+ }
+
+ $this->forward = $shouldForward;
+ }
+
+ /**
+ * Returns the domain of the site, ie en.wikipedia.org
+ * Or false if it's not known.
+ *
+ * @since 1.21
+ *
+ * @return string|null
+ */
+ public function getDomain() {
+ $path = $this->getLinkPath();
+
+ if ( $path === null ) {
+ return null;
+ }
+
+ return parse_url( $path, PHP_URL_HOST );
+ }
+
+ /**
+ * Returns the protocol of the site.
+ *
+ * @since 1.21
+ *
+ * @throws MWException
+ * @return string
+ */
+ public function getProtocol() {
+ $path = $this->getLinkPath();
+
+ if ( $path === null ) {
+ return '';
+ }
+
+ $protocol = parse_url( $path, PHP_URL_SCHEME );
+
+ // Malformed URL
+ if ( $protocol === false ) {
+ throw new MWException( "failed to parse URL '$path'" );
+ }
+
+ // No schema
+ if ( $protocol === null ) {
+ // Used for protocol relative URLs
+ $protocol = '';
+ }
+
+ return $protocol;
+ }
+
+ /**
+ * Sets the path used to construct links with.
+ * Shall be equivalent to setPath( getLinkPathType(), $fullUrl ).
+ *
+ * @param string $fullUrl
+ *
+ * @since 1.21
+ *
+ * @throws MWException
+ */
+ public function setLinkPath( $fullUrl ) {
+ $type = $this->getLinkPathType();
+
+ if ( $type === null ) {
+ throw new MWException( "This Site does not support link paths." );
+ }
+
+ $this->setPath( $type, $fullUrl );
+ }
+
+ /**
+ * Returns the path used to construct links with or false if there is no such path.
+ *
+ * Shall be equivalent to getPath( getLinkPathType() ).
+ *
+ * @return string|null
+ */
+ public function getLinkPath() {
+ $type = $this->getLinkPathType();
+ return $type === null ? null: $this->getPath( $type );
+ }
+
+ /**
+ * Returns the main path type, that is the type of the path that should generally be used to construct links
+ * to the target site.
+ *
+ * This default implementation returns Site::PATH_LINK as the default path type. Subclasses can override this
+ * to define a different default path type, or return false to disable site links.
+ *
+ * @since 1.21
+ *
+ * @return string|null
+ */
+ public function getLinkPathType() {
+ return self::PATH_LINK;
+ }
+
+ /**
+ * Returns the full URL for the given page on the site.
+ * Or false if the needed information is not known.
+ *
+ * This generated URL is usually based upon the path returned by getLinkPath(),
+ * but this is not a requirement.
+ *
+ * This implementation returns a URL constructed using the path returned by getLinkPath().
+ *
+ * @since 1.21
+ *
+ * @param bool|String $pageName
+ *
+ * @return string|boolean false
+ */
+ public function getPageUrl( $pageName = false ) {
+ $url = $this->getLinkPath();
+
+ if ( $url === false ) {
+ return false;
+ }
+
+ if ( $pageName !== false ) {
+ $url = str_replace( '$1', rawurlencode( $pageName ), $url );
+ }
+
+ return $url;
+ }
+
+ /**
+ * Returns $pageName without changes.
+ * Subclasses may override this to apply some kind of normalization.
+ *
+ * @see Site::normalizePageName
+ *
+ * @since 1.21
+ *
+ * @param string $pageName
+ *
+ * @return string
+ */
+ public function normalizePageName( $pageName ) {
+ return $pageName;
+ }
+
+ /**
+ * Returns the type specific fields.
+ *
+ * @since 1.21
+ *
+ * @return array
+ */
+ public function getExtraData() {
+ return $this->extraData;
+ }
+
+ /**
+ * Sets the type specific fields.
+ *
+ * @since 1.21
+ *
+ * @param array $extraData
+ */
+ public function setExtraData( array $extraData ) {
+ $this->extraData = $extraData;
+ }
+
+ /**
+ * Returns the type specific config.
+ *
+ * @since 1.21
+ *
+ * @return array
+ */
+ public function getExtraConfig() {
+ return $this->extraConfig;
+ }
+
+ /**
+ * Sets the type specific config.
+ *
+ * @since 1.21
+ *
+ * @param array $extraConfig
+ */
+ public function setExtraConfig( array $extraConfig ) {
+ $this->extraConfig = $extraConfig;
+ }
+
+ /**
+ * Returns language code of the sites primary language.
+ * Or null if it's not known.
+ *
+ * @since 1.21
+ *
+ * @return string|null
+ */
+ public function getLanguageCode() {
+ return $this->languageCode;
+ }
+
+ /**
+ * Sets language code of the sites primary language.
+ *
+ * @since 1.21
+ *
+ * @param string $languageCode
+ */
+ public function setLanguageCode( $languageCode ) {
+ $this->languageCode = $languageCode;
+ }
+
+ /**
+ * Returns the set internal identifier for the site.
+ *
+ * @since 1.21
+ *
+ * @return string|null
+ */
+ public function getInternalId() {
+ return $this->internalId;
+ }
+
+ /**
+ * Sets the internal identifier for the site.
+ * This typically is a primary key in a db table.
+ *
+ * @since 1.21
+ *
+ * @param int|null $internalId
+ */
+ public function setInternalId( $internalId = null ) {
+ $this->internalId = $internalId;
+ }
+
+ /**
+ * Adds a local identifier.
+ *
+ * @since 1.21
+ *
+ * @param string $type
+ * @param string $identifier
+ */
+ public function addLocalId( $type, $identifier ) {
+ if ( $this->localIds === false ) {
+ $this->localIds = array();
+ }
+
+ if ( !array_key_exists( $type, $this->localIds ) ) {
+ $this->localIds[$type] = array();
+ }
+
+ if ( !in_array( $identifier, $this->localIds[$type] ) ) {
+ $this->localIds[$type][] = $identifier;
+ }
+ }
+
+ /**
+ * Adds an interwiki id to the site.
+ *
+ * @since 1.21
+ *
+ * @param string $identifier
+ */
+ public function addInterwikiId( $identifier ) {
+ $this->addLocalId( self::ID_INTERWIKI, $identifier );
+ }
+
+ /**
+ * Adds a navigation id to the site.
+ *
+ * @since 1.21
+ *
+ * @param string $identifier
+ */
+ public function addNavigationId( $identifier ) {
+ $this->addLocalId( self::ID_EQUIVALENT, $identifier );
+ }
+
+ /**
+ * Returns the interwiki link identifiers that can be used for this site.
+ *
+ * @since 1.21
+ *
+ * @return string[]
+ */
+ public function getInterwikiIds() {
+ return array_key_exists( self::ID_INTERWIKI, $this->localIds ) ? $this->localIds[self::ID_INTERWIKI] : array();
+ }
+
+ /**
+ * Returns the equivalent link identifiers that can be used to make
+ * the site show up in interfaces such as the "language links" section.
+ *
+ * @since 1.21
+ *
+ * @return string[]
+ */
+ public function getNavigationIds() {
+ return array_key_exists( self::ID_EQUIVALENT, $this->localIds ) ? $this->localIds[self::ID_EQUIVALENT] : array();
+ }
+
+ /**
+ * Returns all local ids
+ *
+ * @since 1.21
+ *
+ * @return array[]
+ */
+ public function getLocalIds() {
+ return $this->localIds;
+ }
+
+ /**
+ * Sets the path used to construct links with.
+ * Shall be equivalent to setPath( getLinkPathType(), $fullUrl ).
+ *
+ * @since 1.21
+ *
+ * @param string $pathType
+ * @param string $fullUrl
+ *
+ * @throws MWException
+ */
+ public function setPath( $pathType, $fullUrl ) {
+ if ( !is_string( $fullUrl ) ) {
+ throw new MWException( '$fullUrl needs to be a string' );
+ }
+
+ if ( !array_key_exists( 'paths', $this->extraData ) ) {
+ $this->extraData['paths'] = array();
+ }
+
+ $this->extraData['paths'][$pathType] = $fullUrl;
+ }
+
+ /**
+ * Returns the path of the provided type or false if there is no such path.
+ *
+ * @since 1.21
+ *
+ * @param string $pathType
+ *
+ * @return string|null
+ */
+ public function getPath( $pathType ) {
+ $paths = $this->getAllPaths();
+ return array_key_exists( $pathType, $paths ) ? $paths[$pathType] : null;
+ }
+
+ /**
+ * Returns the paths as associative array.
+ * The keys are path types, the values are the path urls.
+ *
+ * @since 1.21
+ *
+ * @return string[]
+ */
+ public function getAllPaths() {
+ return array_key_exists( 'paths', $this->extraData ) ? $this->extraData['paths'] : array();
+ }
+
+ /**
+ * Removes the path of the provided type if it's set.
+ *
+ * @since 1.21
+ *
+ * @param string $pathType
+ */
+ public function removePath( $pathType ) {
+ if ( array_key_exists( 'paths', $this->extraData ) ) {
+ unset( $this->extraData['paths'][$pathType] );
+ }
+ }
+
+ /**
+ * @since 1.21
+ *
+ * @param string $siteType
+ *
+ * @return Site
+ */
+ public static function newForType( $siteType ) {
+ global $wgSiteTypes;
+
+ if ( array_key_exists( $siteType, $wgSiteTypes ) ) {
+ return new $wgSiteTypes[$siteType]();
+ }
+
+ return new Site();
+ }
+
+ /**
+ * @see Serializable::serialize
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function serialize() {
+ $fields = array(
+ 'globalid' => $this->globalId,
+ 'type' => $this->type,
+ 'group' => $this->group,
+ 'source' => $this->source,
+ 'language' => $this->languageCode,
+ 'localids' => $this->localIds,
+ 'config' => $this->extraConfig,
+ 'data' => $this->extraData,
+ 'forward' => $this->forward,
+ 'internalid' => $this->internalId,
+
+ );
+
+ return serialize( $fields );
+ }
+
+ /**
+ * @see Serializable::unserialize
+ *
+ * @since 1.21
+ *
+ * @param string $serialized
+ */
+ public function unserialize( $serialized ) {
+ $fields = unserialize( $serialized );
+
+ $this->__construct( $fields['type'] );
+
+ $this->setGlobalId( $fields['globalid'] );
+ $this->setGroup( $fields['group'] );
+ $this->setSource( $fields['source'] );
+ $this->setLanguageCode( $fields['language'] );
+ $this->localIds = $fields['localids'];
+ $this->setExtraConfig( $fields['config'] );
+ $this->setExtraData( $fields['data'] );
+ $this->setForward( $fields['forward'] );
+ $this->setInternalId( $fields['internalid'] );
+ }
+
+}
+
+/**
+ * @deprecated
+ */
+class SiteObject extends Site {}
diff --git a/includes/site/SiteList.php b/includes/site/SiteList.php
new file mode 100644
index 00000000..b0d1f95b
--- /dev/null
+++ b/includes/site/SiteList.php
@@ -0,0 +1,300 @@
+<?php
+
+/**
+ * Collection of Site objects.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class SiteList extends GenericArrayObject {
+
+ /**
+ * Internal site identifiers pointing to their sites offset value.
+ *
+ * @since 1.21
+ *
+ * @var array of integer
+ */
+ protected $byInternalId = array();
+
+ /**
+ * Global site identifiers pointing to their sites offset value.
+ *
+ * @since 1.21
+ *
+ * @var array of string
+ */
+ protected $byGlobalId = array();
+
+ /**
+ * @see GenericArrayObject::getObjectType
+ *
+ * @since 1.21
+ *
+ * @return string
+ */
+ public function getObjectType() {
+ return 'Site';
+ }
+
+ /**
+ * @see GenericArrayObject::preSetElement
+ *
+ * @since 1.21
+ *
+ * @param int|string $index
+ * @param Site $site
+ *
+ * @return boolean
+ */
+ protected function preSetElement( $index, $site ) {
+ if ( $this->hasSite( $site->getGlobalId() ) ) {
+ $this->removeSite( $site->getGlobalId() );
+ }
+
+ $this->byGlobalId[$site->getGlobalId()] = $index;
+ $this->byInternalId[$site->getInternalId()] = $index;
+
+ return true;
+ }
+
+ /**
+ * @see ArrayObject::offsetUnset()
+ *
+ * @since 1.21
+ *
+ * @param mixed $index
+ */
+ public function offsetUnset( $index ) {
+ if ( $this->offsetExists( $index ) ) {
+ /**
+ * @var Site $site
+ */
+ $site = $this->offsetGet( $index );
+
+ unset( $this->byGlobalId[$site->getGlobalId()] );
+ unset( $this->byInternalId[$site->getInternalId()] );
+ }
+
+ parent::offsetUnset( $index );
+ }
+
+ /**
+ * Returns all the global site identifiers.
+ * Optionally only those belonging to the specified group.
+ *
+ * @since 1.21
+ *
+ * @return array
+ */
+ public function getGlobalIdentifiers() {
+ return array_keys( $this->byGlobalId );
+ }
+
+ /**
+ * Returns if the list contains the site with the provided global site identifier.
+ *
+ * @param string $globalSiteId
+ *
+ * @return boolean
+ */
+ public function hasSite( $globalSiteId ) {
+ return array_key_exists( $globalSiteId, $this->byGlobalId );
+ }
+
+ /**
+ * Returns the Site with the provided global site identifier.
+ * The site needs to exist, so if not sure, call hasGlobalId first.
+ *
+ * @since 1.21
+ *
+ * @param string $globalSiteId
+ *
+ * @return Site
+ */
+ public function getSite( $globalSiteId ) {
+ return $this->offsetGet( $this->byGlobalId[$globalSiteId] );
+ }
+
+ /**
+ * Removes the site with the specified global site identifier.
+ * The site needs to exist, so if not sure, call hasGlobalId first.
+ *
+ * @since 1.21
+ *
+ * @param string $globalSiteId
+ */
+ public function removeSite( $globalSiteId ) {
+ $this->offsetUnset( $this->byGlobalId[$globalSiteId] );
+ }
+
+ /**
+ * Returns if the list contains no sites.
+ *
+ * @since 1.21
+ *
+ * @return boolean
+ */
+ public function isEmpty() {
+ return $this->byGlobalId === array();
+ }
+
+ /**
+ * Returns if the list contains the site with the provided site id.
+ *
+ * @param integer $id
+ *
+ * @return boolean
+ */
+ public function hasInternalId( $id ) {
+ return array_key_exists( $id, $this->byInternalId );
+ }
+
+ /**
+ * Returns the Site with the provided site id.
+ * The site needs to exist, so if not sure, call has first.
+ *
+ * @since 1.21
+ *
+ * @param integer $id
+ *
+ * @return Site
+ */
+ public function getSiteByInternalId( $id ) {
+ return $this->offsetGet( $this->byInternalId[$id] );
+ }
+
+ /**
+ * Removes the site with the specified site id.
+ * The site needs to exist, so if not sure, call has first.
+ *
+ * @since 1.21
+ *
+ * @param integer $id
+ */
+ public function removeSiteByInternalId( $id ) {
+ $this->offsetUnset( $this->byInternalId[$id] );
+ }
+
+ /**
+ * Sets a site in the list. If the site was not there,
+ * it will be added. If it was, it will be updated.
+ *
+ * @since 1.21
+ *
+ * @param Site $site
+ */
+ public function setSite( Site $site ) {
+ $this[] = $site;
+ }
+
+ /**
+ * Returns the sites that are in the provided group.
+ *
+ * @since 1.21
+ *
+ * @param string $groupName
+ *
+ * @return SiteList
+ */
+ public function getGroup( $groupName ) {
+ $group = new self();
+
+ /**
+ * @var \Site $site
+ */
+ foreach ( $this as $site ) {
+ if ( $site->getGroup() === $groupName ) {
+ $group[] = $site;
+ }
+ }
+
+ return $group;
+ }
+
+ /**
+ * A version ID that identifies the serialization structure used by getSerializationData()
+ * and unserialize(). This is useful for constructing cache keys in cases where the cache relies
+ * on serialization for storing the SiteList.
+ *
+ * @var string A string uniquely identifying the version of the serialization structure,
+ * not including any sub-structures.
+ */
+ const SERIAL_VERSION_ID = '2013-02-07';
+
+ /**
+ * Returns the version ID that identifies the serialization structure used by
+ * getSerializationData() and unserialize(), including the structure of any nested structures.
+ * This is useful for constructing cache keys in cases where the cache relies
+ * on serialization for storing the SiteList.
+ *
+ * @return string A string uniquely identifying the version of the serialization structure,
+ * including any sub-structures.
+ */
+ public static function getSerialVersionId() {
+ return self::SERIAL_VERSION_ID . '+Site:' . Site::SERIAL_VERSION_ID;
+ }
+
+ /**
+ * @see GenericArrayObject::getSerializationData
+ *
+ * @since 1.21
+ *
+ * @return array
+ */
+ protected function getSerializationData() {
+ //NOTE: When changing the structure, either implement unserialize() to handle the
+ // old structure too, or update SERIAL_VERSION_ID to kill any caches.
+ return array_merge(
+ parent::getSerializationData(),
+ array(
+ 'internalIds' => $this->byInternalId,
+ 'globalIds' => $this->byGlobalId,
+ )
+ );
+ }
+
+ /**
+ * @see GenericArrayObject::unserialize
+ *
+ * @since 1.21
+ *
+ * @param string $serialization
+ *
+ * @return array
+ */
+ public function unserialize( $serialization ) {
+ $serializationData = parent::unserialize( $serialization );
+
+ $this->byInternalId = $serializationData['internalIds'];
+ $this->byGlobalId = $serializationData['globalIds'];
+
+ return $serializationData;
+ }
+
+}
+
+/**
+ * @deprecated
+ */
+class SiteArray extends SiteList {}
diff --git a/includes/site/SiteSQLStore.php b/includes/site/SiteSQLStore.php
new file mode 100644
index 00000000..41238055
--- /dev/null
+++ b/includes/site/SiteSQLStore.php
@@ -0,0 +1,491 @@
+<?php
+
+/**
+ * Represents the site configuration of a wiki.
+ * Holds a list of sites (ie SiteList) and takes care
+ * of retrieving and caching site information when appropriate.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class SiteSQLStore implements SiteStore {
+
+ /**
+ * @since 1.21
+ *
+ * @var SiteList|null
+ */
+ protected $sites = null;
+
+ /**
+ * @var ORMTable
+ */
+ protected $sitesTable;
+
+ /**
+ * @var string|null
+ */
+ private $cacheKey = null;
+
+ /**
+ * @var int
+ */
+ private $cacheTimeout = 3600;
+
+ /**
+ * @since 1.21
+ *
+ * @param ORMTable|null $sitesTable
+ *
+ * @return SiteStore
+ */
+ public static function newInstance( ORMTable $sitesTable = null ) {
+ return new static( $sitesTable );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @since 1.21
+ *
+ * @param ORMTable|null $sitesTable
+ */
+ protected function __construct( ORMTable $sitesTable = null ) {
+ if ( $sitesTable === null ) {
+ $sitesTable = $this->newSitesTable();
+ }
+
+ $this->sitesTable = $sitesTable;
+ }
+
+ /**
+ * Constructs a cache key to use for caching the list of sites.
+ *
+ * This includes the concrete class name of the site list as well as a version identifier
+ * for the list's serialization, to avoid problems when unserializing site lists serialized
+ * by an older version, e.g. when reading from a cache.
+ *
+ * The cache key also includes information about where the sites were loaded from, e.g.
+ * the name of a database table.
+ *
+ * @see SiteList::getSerialVersionId
+ *
+ * @return String The cache key.
+ */
+ protected function getCacheKey() {
+ wfProfileIn( __METHOD__ );
+
+ if ( $this->cacheKey === null ) {
+ $type = 'SiteList#' . SiteList::getSerialVersionId();
+ $source = $this->sitesTable->getName();
+
+ if ( $this->sitesTable->getTargetWiki() !== false ) {
+ $source = $this->sitesTable->getTargetWiki() . '.' . $source;
+ }
+
+ $this->cacheKey = wfMemcKey( "$source/$type" );
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $this->cacheKey;
+ }
+
+ /**
+ * @see SiteStore::getSites
+ *
+ * @since 1.21
+ *
+ * @param string $source either 'cache' or 'recache'
+ *
+ * @return SiteList
+ */
+ public function getSites( $source = 'cache' ) {
+ wfProfileIn( __METHOD__ );
+
+ if ( $source === 'cache' ) {
+ if ( $this->sites === null ) {
+ $cache = wfGetMainCache();
+ $sites = $cache->get( $this->getCacheKey() );
+
+ if ( is_object( $sites ) ) {
+ $this->sites = $sites;
+ } else {
+ $this->loadSites();
+ }
+ }
+ }
+ else {
+ $this->loadSites();
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $this->sites;
+ }
+
+ /**
+ * Returns a new Site object constructed from the provided ORMRow.
+ *
+ * @since 1.21
+ *
+ * @param ORMRow $siteRow
+ *
+ * @return Site
+ */
+ protected function siteFromRow( ORMRow $siteRow ) {
+ wfProfileIn( __METHOD__ );
+
+ $site = Site::newForType( $siteRow->getField( 'type', Site::TYPE_UNKNOWN ) );
+
+ $site->setGlobalId( $siteRow->getField( 'global_key' ) );
+
+ $site->setInternalId( $siteRow->getField( 'id' ) );
+
+ if ( $siteRow->hasField( 'forward' ) ) {
+ $site->setForward( $siteRow->getField( 'forward' ) );
+ }
+
+ if ( $siteRow->hasField( 'group' ) ) {
+ $site->setGroup( $siteRow->getField( 'group' ) );
+ }
+
+ if ( $siteRow->hasField( 'language' ) ) {
+ $site->setLanguageCode( $siteRow->getField( 'language' ) === '' ? null : $siteRow->getField( 'language' ) );
+ }
+
+ if ( $siteRow->hasField( 'source' ) ) {
+ $site->setSource( $siteRow->getField( 'source' ) );
+ }
+
+ if ( $siteRow->hasField( 'data' ) ) {
+ $site->setExtraData( $siteRow->getField( 'data' ) );
+ }
+
+ if ( $siteRow->hasField( 'config' ) ) {
+ $site->setExtraConfig( $siteRow->getField( 'config' ) );
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $site;
+ }
+
+ /**
+ * Fetches the site from the database and loads them into the sites field.
+ *
+ * @since 1.21
+ */
+ protected function loadSites() {
+ wfProfileIn( __METHOD__ );
+
+ $this->sites = new SiteList();
+
+ foreach ( $this->sitesTable->select() as $siteRow ) {
+ $this->sites[] = $this->siteFromRow( $siteRow );
+ }
+
+ // Batch load the local site identifiers.
+ $ids = wfGetDB( $this->sitesTable->getReadDb() )->select(
+ 'site_identifiers',
+ array(
+ 'si_site',
+ 'si_type',
+ 'si_key',
+ ),
+ array(),
+ __METHOD__
+ );
+
+ foreach ( $ids as $id ) {
+ if ( $this->sites->hasInternalId( $id->si_site ) ) {
+ $site = $this->sites->getSiteByInternalId( $id->si_site );
+ $site->addLocalId( $id->si_type, $id->si_key );
+ $this->sites->setSite( $site );
+ }
+ }
+
+ $cache = wfGetMainCache();
+ $cache->set( $this->getCacheKey(), $this->sites, $this->cacheTimeout );
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * @see SiteStore::getSite
+ *
+ * @since 1.21
+ *
+ * @param string $globalId
+ * @param string $source
+ *
+ * @return Site|null
+ */
+ public function getSite( $globalId, $source = 'cache' ) {
+ wfProfileIn( __METHOD__ );
+
+ $sites = $this->getSites( $source );
+
+ wfProfileOut( __METHOD__ );
+ return $sites->hasSite( $globalId ) ? $sites->getSite( $globalId ) : null;
+ }
+
+ /**
+ * @see SiteStore::saveSite
+ *
+ * @since 1.21
+ *
+ * @param Site $site
+ *
+ * @return boolean Success indicator
+ */
+ public function saveSite( Site $site ) {
+ return $this->saveSites( array( $site ) );
+ }
+
+ /**
+ * @see SiteStore::saveSites
+ *
+ * @since 1.21
+ *
+ * @param Site[] $sites
+ *
+ * @return boolean Success indicator
+ */
+ public function saveSites( array $sites ) {
+ wfProfileIn( __METHOD__ );
+
+ if ( empty( $sites ) ) {
+ wfProfileOut( __METHOD__ );
+ return true;
+ }
+
+ $dbw = $this->sitesTable->getWriteDbConnection();
+
+ $trx = $dbw->trxLevel();
+
+ if ( $trx == 0 ) {
+ $dbw->begin( __METHOD__ );
+ }
+
+ $success = true;
+
+ $internalIds = array();
+ $localIds = array();
+
+ foreach ( $sites as $site ) {
+ $fields = array(
+ // Site data
+ 'global_key' => $site->getGlobalId(), // TODO: check not null
+ 'type' => $site->getType(),
+ 'group' => $site->getGroup(),
+ 'source' => $site->getSource(),
+ 'language' => $site->getLanguageCode() === null ? '' : $site->getLanguageCode(),
+ 'protocol' => $site->getProtocol(),
+ 'domain' => strrev( $site->getDomain() ) . '.',
+ 'data' => $site->getExtraData(),
+
+ // Site config
+ 'forward' => $site->shouldForward(),
+ 'config' => $site->getExtraConfig(),
+ );
+
+ if ( $site->getInternalId() !== null ) {
+ $fields['id'] = $site->getInternalId();
+ $internalIds[] = $site->getInternalId();
+ }
+
+ $siteRow = new ORMRow( $this->sitesTable, $fields );
+ $success = $siteRow->save( __METHOD__ ) && $success;
+
+ foreach ( $site->getLocalIds() as $idType => $ids ) {
+ foreach ( $ids as $id ) {
+ $localIds[] = array( $siteRow->getId(), $idType, $id );
+ }
+ }
+ }
+
+ if ( $internalIds !== array() ) {
+ $dbw->delete(
+ 'site_identifiers',
+ array( 'si_site' => $internalIds ),
+ __METHOD__
+ );
+ }
+
+ foreach ( $localIds as $localId ) {
+ $dbw->insert(
+ 'site_identifiers',
+ array(
+ 'si_site' => $localId[0],
+ 'si_type' => $localId[1],
+ 'si_key' => $localId[2],
+ ),
+ __METHOD__
+ );
+ }
+
+ if ( $trx == 0 ) {
+ $dbw->commit( __METHOD__ );
+ }
+
+ // purge cache
+ $this->reset();
+
+ wfProfileOut( __METHOD__ );
+ return $success;
+ }
+
+ /**
+ * Purges the internal and external cache of the site list, forcing the list
+ * of sites to be re-read from the database.
+ *
+ * @since 1.21
+ */
+ public function reset() {
+ wfProfileIn( __METHOD__ );
+ // purge cache
+ $cache = wfGetMainCache();
+ $cache->delete( $this->getCacheKey() );
+ $this->sites = null;
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Clears the list of sites stored in the database.
+ *
+ * @see SiteStore::clear()
+ *
+ * @return bool success
+ */
+ public function clear() {
+ wfProfileIn( __METHOD__ );
+ $dbw = $this->sitesTable->getWriteDbConnection();
+
+ $trx = $dbw->trxLevel();
+
+ if ( $trx == 0 ) {
+ $dbw->begin( __METHOD__ );
+ }
+
+ $ok = $dbw->delete( 'sites', '*', __METHOD__ );
+ $ok = $dbw->delete( 'site_identifiers', '*', __METHOD__ ) && $ok;
+
+ if ( $trx == 0 ) {
+ $dbw->commit( __METHOD__ );
+ }
+
+ $this->reset();
+
+ wfProfileOut( __METHOD__ );
+ return $ok;
+ }
+
+ /**
+ * @since 1.21
+ *
+ * @return ORMTable
+ */
+ protected function newSitesTable() {
+ return new ORMTable(
+ 'sites',
+ array(
+ 'id' => 'id',
+
+ // Site data
+ 'global_key' => 'str',
+ 'type' => 'str',
+ 'group' => 'str',
+ 'source' => 'str',
+ 'language' => 'str',
+ 'protocol' => 'str',
+ 'domain' => 'str',
+ 'data' => 'array',
+
+ // Site config
+ 'forward' => 'bool',
+ 'config' => 'array',
+ ),
+ array(
+ 'type' => Site::TYPE_UNKNOWN,
+ 'group' => Site::GROUP_NONE,
+ 'source' => Site::SOURCE_LOCAL,
+ 'data' => array(),
+
+ 'forward' => false,
+ 'config' => array(),
+ 'language' => '',
+ ),
+ 'ORMRow',
+ 'site_'
+ );
+ }
+
+}
+
+/**
+ * @deprecated
+ */
+class Sites extends SiteSQLStore {
+
+ /**
+ * Factory for creating new site objects.
+ *
+ * @since 1.21
+ * @deprecated
+ *
+ * @param string|boolean false $globalId
+ *
+ * @return Site
+ */
+ public static function newSite( $globalId = false ) {
+ $site = new Site();
+
+ if ( $globalId !== false ) {
+ $site->setGlobalId( $globalId );
+ }
+
+ return $site;
+ }
+
+ /**
+ * @deprecated
+ * @return SiteStore
+ */
+ public static function singleton() {
+ static $singleton;
+
+ if ( $singleton === null ) {
+ $singleton = new static();
+ }
+
+ return $singleton;
+ }
+
+ /**
+ * @deprecated
+ * @return SiteList
+ */
+ public function getSiteGroup( $group ) {
+ return $this->getSites()->getGroup( $group );
+ }
+
+}
diff --git a/includes/site/SiteStore.php b/includes/site/SiteStore.php
new file mode 100644
index 00000000..52ba8fbf
--- /dev/null
+++ b/includes/site/SiteStore.php
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * Interface for service objects providing a storage interface for Site objects.
+ *
+ * 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
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+interface SiteStore {
+
+ /**
+ * Saves the provided site.
+ *
+ * @since 1.21
+ *
+ * @param Site $site
+ *
+ * @return boolean Success indicator
+ */
+ public function saveSite( Site $site );
+
+ /**
+ * Saves the provided sites.
+ *
+ * @since 1.21
+ *
+ * @param Site[] $sites
+ *
+ * @return boolean Success indicator
+ */
+ public function saveSites( array $sites );
+
+ /**
+ * Returns the site with provided global id, or null if there is no such site.
+ *
+ * @since 1.21
+ *
+ * @param string $globalId
+ * @param string $source either 'cache' or 'recache'.
+ * If 'cache', the values are allowed (but not obliged) to come from a cache.
+ *
+ * @return Site|null
+ */
+ public function getSite( $globalId, $source = 'cache' );
+
+ /**
+ * Returns a list of all sites. By default this site is
+ * fetched from the cache, which can be changed to loading
+ * the list from the database using the $useCache parameter.
+ *
+ * @since 1.21
+ *
+ * @param string $source either 'cache' or 'recache'.
+ * If 'cache', the values are allowed (but not obliged) to come from a cache.
+ *
+ * @return SiteList
+ */
+ public function getSites( $source = 'cache' );
+
+ /**
+ * Deletes all sites from the database. After calling clear(), getSites() will return an empty
+ * list and getSite() will return null until saveSite() or saveSites() is called.
+ */
+ public function clear();
+}
diff --git a/includes/specials/SpecialActiveusers.php b/includes/specials/SpecialActiveusers.php
index c5aa2389..c9c82ada 100644
--- a/includes/specials/SpecialActiveusers.php
+++ b/includes/specials/SpecialActiveusers.php
@@ -50,7 +50,7 @@ class ActiveUsersPager extends UsersPager {
/**
* @param $context IContextSource
* @param $group null Unused
- * @param $par string Parameter passed to the page
+ * @param string $par Parameter passed to the page
*/
function __construct( IContextSource $context = null, $group = null, $par = null ) {
global $wgActiveUserDays;
@@ -93,37 +93,38 @@ class ActiveUsersPager extends UsersPager {
function getQueryInfo() {
$dbr = wfGetDB( DB_SLAVE );
$conds = array( 'rc_user > 0' ); // Users - no anons
- $conds[] = 'ipb_deleted IS NULL'; // don't show hidden names
+ if( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+ $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0'; // don't show hidden names
+ }
$conds[] = 'rc_log_type IS NULL OR rc_log_type != ' . $dbr->addQuotes( 'newusers' );
- $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge*24*3600 ) );
+ $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes(
+ $dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge*24*3600 ) );
if( $this->requestedUser != '' ) {
$conds[] = 'rc_user_text >= ' . $dbr->addQuotes( $this->requestedUser );
}
- $query = array(
- 'tables' => array( 'recentchanges', 'user', 'ipblocks' ),
- 'fields' => array( 'user_name' => 'rc_user_text', // inheritance
+ return array(
+ 'tables' => array( 'recentchanges', 'ipblocks' ),
+ 'fields' => array(
+ 'user_name' => 'rc_user_text', // for Pager inheritance
'rc_user_text', // for Pager
- 'user_id',
+ 'user_id' => 'rc_user',
'recentedits' => 'COUNT(*)',
- 'blocked' => 'MAX(ipb_user)'
+ 'ipb_deleted' => 'MAX(ipb_deleted)'
),
'options' => array(
'GROUP BY' => array( 'rc_user_text', 'user_id' ),
'USE INDEX' => array( 'recentchanges' => 'rc_user_text' )
),
- 'join_conds' => array(
- 'user' => array( 'INNER JOIN', 'rc_user_text=user_name' ),
+ 'join_conds' => array( // check for suppression blocks
'ipblocks' => array( 'LEFT JOIN', array(
- 'user_id=ipb_user',
- 'ipb_auto' => 0,
- 'ipb_deleted' => 1
+ 'rc_user=ipb_user',
+ 'ipb_auto' => 0 # avoid duplicate blocks
)),
),
'conds' => $conds
);
- return $query;
}
function formatRow( $row ) {
@@ -162,9 +163,12 @@ class ActiveUsersPager extends UsersPager {
$groups = $lang->commaList( $list );
$item = $lang->specialList( $ulinks, $groups );
+ if( $row->ipb_deleted ) {
+ $item = "<span class=\"deleted\">$item</span>";
+ }
$count = $this->msg( 'activeusers-count' )->numParams( $row->recentedits )
->params( $userName )->numParams( $this->RCMaxAge )->escaped();
- $blocked = $row->blocked ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
+ $blocked = !is_null( $row->ipb_deleted ) ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
return Html::rawElement( 'li', array(), "{$item} [{$count}]{$blocked}" );
}
@@ -240,4 +244,7 @@ class SpecialActiveUsers extends SpecialPage {
}
}
+ protected function getGroupName() {
+ return 'users';
+ }
}
diff --git a/includes/specials/SpecialAllmessages.php b/includes/specials/SpecialAllmessages.php
index fe9d41e5..a60c8efe 100644
--- a/includes/specials/SpecialAllmessages.php
+++ b/includes/specials/SpecialAllmessages.php
@@ -77,6 +77,9 @@ class SpecialAllmessages extends SpecialPage {
}
+ protected function getGroupName() {
+ return 'wiki';
+ }
}
/**
@@ -113,12 +116,12 @@ class AllmessagesTablePager extends TablePager {
$this->lang = ( $langObj ? $langObj : $wgContLang );
$this->langcode = $this->lang->getCode();
- $this->foreign = $this->langcode != $wgContLang->getCode();
+ $this->foreign = $this->langcode != $wgContLang->getCode();
$request = $this->getRequest();
$this->filter = $request->getVal( 'filter', 'all' );
- if( $this->filter === 'all' ){
+ if( $this->filter === 'all' ) {
$this->custom = null; // So won't match in either case
} else {
$this->custom = ($this->filter == 'unmodified');
@@ -126,7 +129,7 @@ class AllmessagesTablePager extends TablePager {
$prefix = $this->getLanguage()->ucfirst( $request->getVal( 'prefix', '' ) );
$prefix = $prefix != '' ? Title::makeTitleSafe( NS_MEDIAWIKI, $request->getVal( 'prefix', null ) ) : null;
- if( $prefix !== null ){
+ if( $prefix !== null ) {
$this->displayPrefix = $prefix->getDBkey();
$this->prefix = '/^' . preg_quote( $this->displayPrefix ) . '/i';
} else {
@@ -150,7 +153,7 @@ class AllmessagesTablePager extends TablePager {
$msg = wfMessage( 'allmessages-language' );
$langSelect = Xml::languageSelector( $this->langcode, false, null, $attrs, $msg );
- $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-allmessages-form' ) ) .
+ $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-allmessages-form' ) ) .
Xml::fieldset( $this->msg( 'allmessages-filter-legend' )->text() ) .
Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
Xml::openElement( 'table', array( 'class' => 'mw-allmessages-table' ) ) . "\n" .
@@ -216,7 +219,7 @@ class AllmessagesTablePager extends TablePager {
function getAllMessages( $descending ) {
wfProfileIn( __METHOD__ );
$messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' );
- if( $descending ){
+ if( $descending ) {
rsort( $messageNames );
} else {
asort( $messageNames );
@@ -331,15 +334,13 @@ class AllmessagesTablePager extends TablePager {
</tr></thead><tbody>\n";
}
- function formatValue( $field, $value ){
- switch( $field ){
-
+ function formatValue( $field, $value ) {
+ switch( $field ) {
case 'am_title' :
-
$title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
- $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
+ $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
- if( $this->mCurrentRow->am_customised ){
+ if( $this->mCurrentRow->am_customised ) {
$title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
} else {
$title = Linker::link(
@@ -351,7 +352,7 @@ class AllmessagesTablePager extends TablePager {
);
}
if ( $this->mCurrentRow->am_talk_exists ) {
- $talk = Linker::linkKnown( $talk , $this->talk );
+ $talk = Linker::linkKnown( $talk, $this->talk );
} else {
$talk = Linker::link(
$talk,
@@ -370,12 +371,12 @@ class AllmessagesTablePager extends TablePager {
return '';
}
- function formatRow( $row ){
+ function formatRow( $row ) {
// Do all the normal stuff
$s = parent::formatRow( $row );
// But if there's a customised message, add that too.
- if( $row->am_customised ){
+ if( $row->am_customised ) {
$s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) );
$formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) );
if ( $formatted == '' ) {
@@ -387,19 +388,19 @@ class AllmessagesTablePager extends TablePager {
return $s;
}
- function getRowAttrs( $row, $isSecond = false ){
+ function getRowAttrs( $row, $isSecond = false ) {
$arr = array();
- if( $row->am_customised ){
+ if( $row->am_customised ) {
$arr['class'] = 'allmessages-customised';
}
- if( !$isSecond ){
+ if( !$isSecond ) {
$arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) );
}
return $arr;
}
- function getCellAttrs( $field, $value ){
- if( $this->mCurrentRow->am_customised && $field == 'am_title' ){
+ function getCellAttrs( $field, $value ) {
+ if( $this->mCurrentRow->am_customised && $field == 'am_title' ) {
return array( 'rowspan' => '2', 'class' => $field );
} elseif( $field == 'am_title' ) {
return array( 'class' => $field );
@@ -420,16 +421,15 @@ class AllmessagesTablePager extends TablePager {
return SpecialPage::getTitleFor( 'Allmessages', false );
}
- function isFieldSortable( $x ){
+ function isFieldSortable( $x ) {
return false;
}
- function getDefaultSort(){
+ function getDefaultSort() {
return '';
}
- function getQueryInfo(){
+ function getQueryInfo() {
return '';
}
}
-
diff --git a/includes/specials/SpecialAllpages.php b/includes/specials/SpecialAllpages.php
index 0f8b2557..f9cb5cd8 100644
--- a/includes/specials/SpecialAllpages.php
+++ b/includes/specials/SpecialAllpages.php
@@ -59,16 +59,16 @@ class SpecialAllpages extends IncludableSpecialPage {
/**
* Constructor
*
- * @param $name string: name of the special page, as seen in links and URLs (default: 'Allpages')
+ * @param string $name name of the special page, as seen in links and URLs (default: 'Allpages')
*/
- function __construct( $name = 'Allpages' ){
+ function __construct( $name = 'Allpages' ) {
parent::__construct( $name );
}
/**
* Entry point : initialise variables and call subfunctions.
*
- * @param $par String: becomes "FOO" when called like Special:Allpages/FOO (default NULL)
+ * @param string $par becomes "FOO" when called like Special:Allpages/FOO (default NULL)
*/
function execute( $par ) {
global $wgContLang;
@@ -107,16 +107,16 @@ class SpecialAllpages extends IncludableSpecialPage {
* HTML for the top form
*
* @param $namespace Integer: a namespace constant (default NS_MAIN).
- * @param $from String: dbKey we are starting listing at.
- * @param $to String: dbKey we are ending listing at.
- * @param $hideredirects Bool: dont show redirects (default FALSE)
+ * @param string $from dbKey we are starting listing at.
+ * @param string $to dbKey we are ending listing at.
+ * @param bool $hideredirects dont show redirects (default FALSE)
* @return string
*/
function namespaceForm( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
global $wgScript;
$t = $this->getTitle();
- $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
+ $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
$out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
$out .= Html::hidden( 'title', $t->getPrefixedText() );
$out .= Xml::openElement( 'fieldset' );
@@ -127,7 +127,7 @@ class SpecialAllpages extends IncludableSpecialPage {
Xml::label( $this->msg( 'allpagesfrom' )->text(), 'nsfrom' ) .
" </td>
<td class='mw-input'>" .
- Xml::input( 'from', 30, str_replace('_',' ',$from), array( 'id' => 'nsfrom' ) ) .
+ Xml::input( 'from', 30, str_replace( '_', ' ', $from ), array( 'id' => 'nsfrom' ) ) .
" </td>
</tr>
<tr>
@@ -135,7 +135,7 @@ class SpecialAllpages extends IncludableSpecialPage {
Xml::label( $this->msg( 'allpagesto' )->text(), 'nsto' ) .
" </td>
<td class='mw-input'>" .
- Xml::input( 'to', 30, str_replace('_',' ',$to), array( 'id' => 'nsto' ) ) .
+ Xml::input( 'to', 30, str_replace( '_', ' ', $to ), array( 'id' => 'nsto' ) ) .
" </td>
</tr>
<tr>
@@ -165,9 +165,9 @@ class SpecialAllpages extends IncludableSpecialPage {
/**
* @param $namespace Integer (default NS_MAIN)
- * @param $from String: list all pages from this name
- * @param $to String: list all pages to this name
- * @param $hideredirects Bool: dont show redirects (default FALSE)
+ * @param string $from list all pages from this name
+ * @param string $to list all pages to this name
+ * @param bool $hideredirects dont show redirects (default FALSE)
*/
function showToplevel( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
$output = $this->getOutput();
@@ -180,7 +180,7 @@ class SpecialAllpages extends IncludableSpecialPage {
$where = array( 'page_namespace' => $namespace );
if ( $hideredirects ) {
- $where[ 'page_is_redirect' ] = 0;
+ $where['page_is_redirect'] = 0;
}
$from = Title::makeTitleSafe( $namespace, $from );
@@ -188,18 +188,18 @@ class SpecialAllpages extends IncludableSpecialPage {
$from = ( $from && $from->isLocal() ) ? $from->getDBkey() : null;
$to = ( $to && $to->isLocal() ) ? $to->getDBkey() : null;
- if( isset($from) )
- $where[] = 'page_title >= '.$dbr->addQuotes( $from );
- if( isset($to) )
- $where[] = 'page_title <= '.$dbr->addQuotes( $to );
+ if( isset( $from ) )
+ $where[] = 'page_title >= ' . $dbr->addQuotes( $from );
+ if( isset( $to ) )
+ $where[] = 'page_title <= ' . $dbr->addQuotes( $to );
global $wgMemc;
- $key = wfMemcKey( 'allpages', 'ns', $namespace, $from, $to );
+ $key = wfMemcKey( 'allpages', 'ns', $namespace, sha1( $from ), sha1( $to ) );
$lines = $wgMemc->get( $key );
$count = $dbr->estimateRowCount( 'page', '*', $where, __METHOD__ );
- $maxPerSubpage = intval($count/$this->maxLineCount);
- $maxPerSubpage = max($maxPerSubpage,$this->maxPerPage);
+ $maxPerSubpage = intval( $count / $this->maxLineCount );
+ $maxPerSubpage = max( $maxPerSubpage, $this->maxPerPage );
if( !is_array( $lines ) ) {
$options = array( 'LIMIT' => 1 );
@@ -217,9 +217,9 @@ class SpecialAllpages extends IncludableSpecialPage {
: array( 'page_title >= ' . $dbr->addQuotes( $lastTitle ) );
$res = $dbr->select( 'page', /* FROM */
'page_title', /* WHAT */
- array_merge($where,$chunk),
+ array_merge( $where, $chunk ),
__METHOD__,
- array ('LIMIT' => 2, 'OFFSET' => $maxPerSubpage - 1, 'ORDER BY' => 'page_title ASC')
+ array( 'LIMIT' => 2, 'OFFSET' => $maxPerSubpage - 1, 'ORDER BY' => 'page_title ASC' )
);
$s = $dbr->fetchObject( $res );
@@ -228,7 +228,7 @@ class SpecialAllpages extends IncludableSpecialPage {
} else {
// Final chunk, but ended prematurely. Go back and find the end.
$endTitle = $dbr->selectField( 'page', 'MAX(page_title)',
- array_merge($where,$chunk),
+ array_merge( $where, $chunk ),
__METHOD__ );
array_push( $lines, $endTitle );
$done = true;
@@ -250,7 +250,7 @@ class SpecialAllpages extends IncludableSpecialPage {
// If there are only two or less sections, don't even display them.
// Instead, display the first section directly.
if( count( $lines ) <= 2 ) {
- if( !empty($lines) ) {
+ if( !empty( $lines ) ) {
$this->showChunk( $namespace, $from, $to, $hideredirects );
} else {
$output->addHTML( $this->namespaceForm( $namespace, $from, $to, $hideredirects ) );
@@ -272,7 +272,7 @@ class SpecialAllpages extends IncludableSpecialPage {
if( $this->including() ) {
$out2 = '';
} else {
- if( isset($from) || isset($to) ) {
+ if( isset( $from ) || isset( $to ) ) {
$out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ).
'<tr>
<td>' .
@@ -294,10 +294,10 @@ class SpecialAllpages extends IncludableSpecialPage {
/**
* Show a line of "ABC to DEF" ranges of articles
*
- * @param $inpoint String: lower limit of pagenames
- * @param $outpoint String: upper limit of pagenames
+ * @param string $inpoint lower limit of pagenames
+ * @param string $outpoint upper limit of pagenames
* @param $namespace Integer (Default NS_MAIN)
- * @param $hideredirects Bool: dont show redirects (default FALSE)
+ * @param bool $hideredirects dont show redirects (default FALSE)
* @return string
*/
function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideredirects ) {
@@ -311,12 +311,12 @@ class SpecialAllpages extends IncludableSpecialPage {
$queryparams = $namespace ? "namespace=$namespace&" : '';
$queryhideredirects = array();
- if ($hideredirects) {
- $queryhideredirects[ 'hideredirects' ] = 1;
+ if ( $hideredirects ) {
+ $queryhideredirects['hideredirects'] = 1;
}
$special = $this->getTitle();
- $link = htmlspecialchars( $special->getLocalUrl( $queryparams . 'from=' . urlencode($inpoint) . '&to=' . urlencode($outpoint), $queryhideredirects ) );
+ $link = htmlspecialchars( $special->getLocalUrl( $queryparams . 'from=' . urlencode( $inpoint ) . '&to=' . urlencode( $outpoint ), $queryhideredirects ) );
$out = $this->msg( 'alphaindexline' )->rawParams(
"<a href=\"$link\">$inpointf</a></td><td>",
@@ -327,15 +327,15 @@ class SpecialAllpages extends IncludableSpecialPage {
/**
* @param $namespace Integer (Default NS_MAIN)
- * @param $from String: list all pages from this name (default FALSE)
- * @param $to String: list all pages to this name (default FALSE)
- * @param $hideredirects Bool: dont show redirects (default FALSE)
+ * @param string $from list all pages from this name (default FALSE)
+ * @param string $to list all pages to this name (default FALSE)
+ * @param bool $hideredirects dont show redirects (default FALSE)
*/
function showChunk( $namespace = NS_MAIN, $from = false, $to = false, $hideredirects = false ) {
global $wgContLang;
$output = $this->getOutput();
- $fromList = $this->getNamespaceKeyAndText($namespace, $from);
+ $fromList = $this->getNamespaceKeyAndText( $namespace, $from );
$toList = $this->getNamespaceKeyAndText( $namespace, $to );
$namespaces = $wgContLang->getNamespaces();
$n = 0;
@@ -357,7 +357,7 @@ class SpecialAllpages extends IncludableSpecialPage {
);
if ( $hideredirects ) {
- $conds[ 'page_is_redirect' ] = 0;
+ $conds['page_is_redirect'] = 0;
}
if( $toKey !== "" ) {
@@ -416,10 +416,10 @@ class SpecialAllpages extends IncludableSpecialPage {
$res_prev = $dbr->select(
'page',
'page_title',
- array( 'page_namespace' => $namespace, 'page_title < '.$dbr->addQuotes($from) ),
+ array( 'page_namespace' => $namespace, 'page_title < ' . $dbr->addQuotes( $from ) ),
__METHOD__,
array( 'ORDER BY' => 'page_title DESC',
- 'LIMIT' => $this->maxPerPage, 'OFFSET' => ($this->maxPerPage - 1 )
+ 'LIMIT' => $this->maxPerPage, 'OFFSET' => ( $this->maxPerPage - 1 )
)
);
@@ -438,7 +438,7 @@ class SpecialAllpages extends IncludableSpecialPage {
array( 'page_namespace' => $namespace ), __METHOD__, $options );
# Show the previous link if it s not the current requested chunk
if( $from != $reallyFirstPage_title ) {
- $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
+ $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
} else {
$prevTitle = null;
}
@@ -457,7 +457,7 @@ class SpecialAllpages extends IncludableSpecialPage {
Linker::link( $self, $this->msg( 'allpages' )->escaped() );
# Do we put a previous link ?
- if( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
+ if( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
$query = array( 'from' => $prevTitle->getText() );
if( $namespace )
@@ -477,7 +477,7 @@ class SpecialAllpages extends IncludableSpecialPage {
if( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
# $s is the first link of the next chunk
- $t = Title::makeTitle($namespace, $s->page_title);
+ $t = Title::makeTitle( $namespace, $s->page_title );
$query = array( 'from' => $t->getText() );
if( $namespace )
@@ -515,14 +515,14 @@ class SpecialAllpages extends IncludableSpecialPage {
/**
* @param $ns Integer: the namespace of the article
- * @param $text String: the name of the article
+ * @param string $text the name of the article
* @return array( int namespace, string dbkey, string pagename ) or NULL on error
*/
- protected function getNamespaceKeyAndText($ns, $text) {
+ protected function getNamespaceKeyAndText( $ns, $text ) {
if ( $text == '' )
return array( $ns, '', '' ); # shortcut for common case
- $t = Title::makeTitleSafe($ns, $text);
+ $t = Title::makeTitleSafe( $ns, $text );
if ( $t && $t->isLocal() ) {
return array( $t->getNamespace(), $t->getDBkey(), $t->getText() );
} elseif ( $t ) {
@@ -530,12 +530,16 @@ class SpecialAllpages extends IncludableSpecialPage {
}
# try again, in case the problem was an empty pagename
- $text = preg_replace('/(#|$)/', 'X$1', $text);
- $t = Title::makeTitleSafe($ns, $text);
+ $text = preg_replace( '/(#|$)/', 'X$1', $text );
+ $t = Title::makeTitleSafe( $ns, $text );
if ( $t && $t->isLocal() ) {
return array( $t->getNamespace(), '', '' );
} else {
return null;
}
}
+
+ protected function getGroupName() {
+ return 'pages';
+ }
}
diff --git a/includes/specials/SpecialAncientpages.php b/includes/specials/SpecialAncientpages.php
index 6e3d49bd..b0f333c4 100644
--- a/includes/specials/SpecialAncientpages.php
+++ b/includes/specials/SpecialAncientpages.php
@@ -36,7 +36,9 @@ class AncientPagesPage extends QueryPage {
return true;
}
- function isSyndicated() { return false; }
+ function isSyndicated() {
+ return false;
+ }
function getQueryInfo() {
return array(
@@ -69,4 +71,8 @@ class AncientPagesPage extends QueryPage {
);
return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialBlankpage.php b/includes/specials/SpecialBlankpage.php
index 42d33779..bfa2f951 100644
--- a/includes/specials/SpecialBlankpage.php
+++ b/includes/specials/SpecialBlankpage.php
@@ -33,6 +33,6 @@ class SpecialBlankpage extends UnlistedSpecialPage {
}
public function execute( $par ) {
$this->setHeaders();
- $this->getOutput()->addWikiMsg('intentionallyblankpage');
+ $this->getOutput()->addWikiMsg( 'intentionallyblankpage' );
}
}
diff --git a/includes/specials/SpecialBlock.php b/includes/specials/SpecialBlock.php
index 1d6656ab..50fdbc26 100644
--- a/includes/specials/SpecialBlock.php
+++ b/includes/specials/SpecialBlock.php
@@ -62,7 +62,7 @@ class SpecialBlock extends FormSpecialPage {
* @throws ErrorPageError
*/
protected function checkExecutePermissions( User $user ) {
- parent::checkExecutePermissions( $user );
+ parent::checkExecutePermissions( $user );
# bug 15810: blocked admins should have limited access here
$status = self::checkUnblockSelf( $this->target, $user );
@@ -134,6 +134,7 @@ class SpecialBlock extends FormSpecialPage {
'tabindex' => '1',
'id' => 'mw-bi-target',
'size' => '45',
+ 'autofocus' => true,
'required' => true,
'validation-callback' => array( __CLASS__, 'validateTargetField' ),
),
@@ -224,7 +225,7 @@ class SpecialBlock extends FormSpecialPage {
/**
* If the user has already been blocked with similar settings, load that block
* and change the defaults for the form fields to match the existing settings.
- * @param $fields Array HTMLForm descriptor array
+ * @param array $fields HTMLForm descriptor array
* @return Bool whether fields were altered (that is, whether the target is
* already blocked)
*/
@@ -239,7 +240,7 @@ class SpecialBlock extends FormSpecialPage {
if ( $block instanceof Block && !$block->mAuto # The block exists and isn't an autoblock
&& ( $this->type != Block::TYPE_RANGE # The block isn't a rangeblock
- || $block->getTarget() == $this->target ) # or if it is, the range is what we're about to block
+ || $block->getTarget() == $this->target ) # or if it is, the range is what we're about to block
)
{
$fields['HardBlock']['default'] = $block->isHardblock();
@@ -386,7 +387,7 @@ class SpecialBlock extends FormSpecialPage {
);
}
- $text = Html::rawElement(
+ $text = Html::rawElement(
'p',
array( 'class' => 'mw-ipb-conveniencelinks' ),
$this->getLanguage()->pipeList( $links )
@@ -450,7 +451,7 @@ class SpecialBlock extends FormSpecialPage {
/**
* Determine the target of the block, and the type of target
* TODO: should be in Block.php?
- * @param $par String subpage parameter passed to setup, or data value from
+ * @param string $par subpage parameter passed to setup, or data value from
* the HTMLForm
* @param $request WebRequest optionally try and get data from a request too
* @return array( User|string|null, Block::TYPE_ constant|null )
@@ -507,53 +508,74 @@ class SpecialBlock extends FormSpecialPage {
* @return Message
*/
public static function validateTargetField( $value, $alldata, $form ) {
+ $status = self::validateTarget( $value, $form->getUser() );
+ if ( !$status->isOK() ) {
+ $errors = $status->getErrorsArray();
+ return call_user_func_array( array( $form, 'msg' ), $errors[0] );
+ } else {
+ return true;
+ }
+ }
+
+ /**
+ * Validate a block target.
+ *
+ * @since 1.21
+ * @param string $value Block target to check
+ * @param User $user Performer of the block
+ * @return Status
+ */
+ public static function validateTarget( $value, User $user ) {
global $wgBlockCIDRLimit;
list( $target, $type ) = self::getTargetAndType( $value );
+ $status = Status::newGood( $target );
if ( $type == Block::TYPE_USER ) {
- # TODO: why do we not have a User->exists() method?
- if ( !$target->getId() ) {
- return $form->msg( 'nosuchusershort',
- wfEscapeWikiText( $target->getName() ) );
+ if ( $target->isAnon() ) {
+ $status->fatal(
+ 'nosuchusershort',
+ wfEscapeWikiText( $target->getName() )
+ );
}
- $status = self::checkUnblockSelf( $target, $form->getUser() );
- if ( $status !== true ) {
- return $form->msg( 'badaccess', $status );
+ $unblockStatus = self::checkUnblockSelf( $target, $user );
+ if ( $unblockStatus !== true ) {
+ $status->fatal( 'badaccess', $unblockStatus );
}
-
} elseif ( $type == Block::TYPE_RANGE ) {
list( $ip, $range ) = explode( '/', $target, 2 );
- if ( ( IP::isIPv4( $ip ) && $wgBlockCIDRLimit['IPv4'] == 32 )
- || ( IP::isIPv6( $ip ) && $wgBlockCIDRLimit['IPv6'] == 128 ) )
- {
- # Range block effectively disabled
- return $form->msg( 'range_block_disabled' );
+ if (
+ ( IP::isIPv4( $ip ) && $wgBlockCIDRLimit['IPv4'] == 32 ) ||
+ ( IP::isIPv6( $ip ) && $wgBlockCIDRLimit['IPv6'] == 128 )
+ ) {
+ // Range block effectively disabled
+ $status->fatal( 'range_block_disabled' );
}
- if ( ( IP::isIPv4( $ip ) && $range > 32 )
- || ( IP::isIPv6( $ip ) && $range > 128 ) )
- {
- # Dodgy range
- return $form->msg( 'ip_range_invalid' );
+ if (
+ ( IP::isIPv4( $ip ) && $range > 32 ) ||
+ ( IP::isIPv6( $ip ) && $range > 128 )
+ ) {
+ // Dodgy range
+ $status->fatal( 'ip_range_invalid' );
}
if ( IP::isIPv4( $ip ) && $range < $wgBlockCIDRLimit['IPv4'] ) {
- return $form->msg( 'ip_range_toolarge', $wgBlockCIDRLimit['IPv4'] );
+ $status->fatal( 'ip_range_toolarge', $wgBlockCIDRLimit['IPv4'] );
}
if ( IP::isIPv6( $ip ) && $range < $wgBlockCIDRLimit['IPv6'] ) {
- return $form->msg( 'ip_range_toolarge', $wgBlockCIDRLimit['IPv6'] );
+ $status->fatal( 'ip_range_toolarge', $wgBlockCIDRLimit['IPv6'] );
}
} elseif ( $type == Block::TYPE_IP ) {
# All is well
} else {
- return $form->msg( 'badipaddress' );
+ $status->fatal( 'badipaddress' );
}
- return true;
+ return $status;
}
/**
@@ -629,7 +651,7 @@ class SpecialBlock extends FormSpecialPage {
}
if ( $data['HideUser'] ) {
- if ( !$performer->isAllowed('hideuser') ) {
+ if ( !$performer->isAllowed( 'hideuser' ) ) {
# this codepath is unreachable except by a malicious user spoofing forms,
# or by race conditions (user has oversight and sysop, loads block form,
# and is de-oversighted before submission); so need to fail completely
@@ -672,10 +694,16 @@ class SpecialBlock extends FormSpecialPage {
# Try to insert block. Is there a conflicting block?
$status = $block->insert();
if ( !$status ) {
+ # Indicates whether the user is confirming the block and is aware of
+ # the conflict (did not change the block target in the meantime)
+ $blockNotConfirmed = !$data['Confirm'] || ( array_key_exists( 'PreviousTarget', $data )
+ && $data['PreviousTarget'] !== $target );
+
+ # Special case for API - bug 32434
+ $reblockNotAllowed = ( array_key_exists( 'Reblock', $data ) && !$data['Reblock'] );
+
# Show form unless the user is already aware of this...
- if ( !$data['Confirm'] || ( array_key_exists( 'PreviousTarget', $data )
- && $data['PreviousTarget'] !== $target ) )
- {
+ if( $blockNotConfirmed || $reblockNotAllowed ) {
return array( array( 'ipb_already_blocked', $block->getTarget() ) );
# Otherwise, try to update the block...
} else {
@@ -742,7 +770,7 @@ class SpecialBlock extends FormSpecialPage {
$logParams
);
# Relate log ID to block IDs (bug 25763)
- $blockIds = array_merge( array( $status['id'] ), $status['autoIds'] );
+ $blockIds = array_merge( array( $status['id'] ), $status['autoIds'] );
$log->addRelations( 'ipb_id', $blockIds, $log_id );
# Report to the user
@@ -782,7 +810,7 @@ class SpecialBlock extends FormSpecialPage {
/**
* Convert a submitted expiry time, which may be relative ("2 weeks", etc) or absolute
* ("24 May 2034", etc), into an absolute timestamp we can put into the database.
- * @param $expiry String: whatever was typed into the form
+ * @param string $expiry whatever was typed into the form
* @return String: timestamp or "infinity" string for the DB implementation
*/
public static function parseExpiryInput( $expiry ) {
@@ -855,7 +883,7 @@ class SpecialBlock extends FormSpecialPage {
/**
* Return a comma-delimited list of "flags" to be passed to the log
* reader for this block, to provide more information in the logs
- * @param $data Array from HTMLForm data
+ * @param array $data from HTMLForm data
* @param $type Block::TYPE_ constant (USER, RANGE, or IP)
* @return string
*/
@@ -918,6 +946,10 @@ class SpecialBlock extends FormSpecialPage {
$out->setPageTitle( $this->msg( 'blockipsuccesssub' ) );
$out->addWikiMsg( 'blockipsuccesstext', wfEscapeWikiText( $this->target ) );
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
# BC @since 1.18
diff --git a/includes/specials/SpecialBlockList.php b/includes/specials/SpecialBlockList.php
index 7143d5bc..e10df4fe 100644
--- a/includes/specials/SpecialBlockList.php
+++ b/includes/specials/SpecialBlockList.php
@@ -37,7 +37,7 @@ class SpecialBlockList extends SpecialPage {
/**
* Main execution point
*
- * @param $par String title fragment
+ * @param string $par title fragment
*/
public function execute( $par ) {
$this->setHeaders();
@@ -113,14 +113,14 @@ class SpecialBlockList extends SpecialPage {
$conds = array();
# Is the user allowed to see hidden blocks?
- if ( !$this->getUser()->isAllowed( 'hideuser' ) ){
+ if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
$conds['ipb_deleted'] = 0;
}
- if ( $this->target !== '' ){
+ if ( $this->target !== '' ) {
list( $target, $type ) = Block::parseTarget( $this->target );
- switch( $type ){
+ switch( $type ) {
case Block::TYPE_ID:
case Block::TYPE_AUTO:
$conds['ipb_id'] = $target;
@@ -205,6 +205,10 @@ class SpecialBlockList extends SpecialPage {
$out->addHTML( Html::rawElement( 'ul', array( 'class' => 'mw-ipblocklist-otherblocks' ), $list ) . "\n" );
}
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
class BlockListPager extends TablePager {
@@ -269,11 +273,11 @@ class BlockListPager extends TablePager {
break;
case 'ipb_target':
- if( $row->ipb_auto ){
+ if( $row->ipb_auto ) {
$formatted = $this->msg( 'autoblockid', $row->ipb_id )->parse();
} else {
list( $target, $type ) = Block::parseTarget( $row->ipb_address );
- switch( $type ){
+ switch( $type ) {
case Block::TYPE_USER:
case Block::TYPE_IP:
$formatted = Linker::userLink( $target->getId(), $target );
@@ -292,8 +296,8 @@ class BlockListPager extends TablePager {
case 'ipb_expiry':
$formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */ true );
- if( $this->getUser()->isAllowed( 'block' ) ){
- if( $row->ipb_auto ){
+ if( $this->getUser()->isAllowed( 'block' ) ) {
+ if( $row->ipb_auto ) {
$links[] = Linker::linkKnown(
SpecialPage::getTitleFor( 'Unblock' ),
$msg['unblocklink'],
@@ -329,7 +333,7 @@ class BlockListPager extends TablePager {
break;
case 'ipb_reason':
- $formatted = Linker::commentBlock( $value );
+ $formatted = Linker::formatComment( $value );
break;
case 'ipb_params':
@@ -391,14 +395,14 @@ class BlockListPager extends TablePager {
);
# Is the user allowed to see hidden blocks?
- if ( !$this->getUser()->isAllowed( 'hideuser' ) ){
+ if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
$info['conds']['ipb_deleted'] = 0;
}
return $info;
}
- public function getTableClass(){
+ public function getTableClass() {
return 'TablePager mw-blocklist';
}
@@ -418,7 +422,7 @@ class BlockListPager extends TablePager {
* Do a LinkBatch query to minimise database load when generating all these links
* @param $result
*/
- function preprocessResults( $result ){
+ function preprocessResults( $result ) {
wfProfileIn( __METHOD__ );
# Do a link batch query
$lb = new LinkBatch;
@@ -437,11 +441,11 @@ class BlockListPager extends TablePager {
}
$ua = UserArray::newFromIDs( $userids );
- foreach( $ua as $user ){
+ foreach( $ua as $user ) {
$name = str_replace( ' ', '_', $user->getName() );
$lb->add( NS_USER, $name );
$lb->add( NS_USER_TALK, $name );
- }
+ }
$lb->execute();
wfProfileOut( __METHOD__ );
@@ -472,7 +476,7 @@ class HTMLBlockedUsersItemSelect extends HTMLSelectField {
// This adds the explicitly requested limit value to the drop-down,
// then makes sure it's sorted correctly so when we output the list
// later, the custom option doesn't just show up last.
- $this->mParams['options'][ $this->mParent->getLanguage()->formatNum( $value ) ] = intval($value);
+ $this->mParams['options'][$this->mParent->getLanguage()->formatNum( $value )] = intval( $value );
asort( $this->mParams['options'] );
}
diff --git a/includes/specials/SpecialBlockme.php b/includes/specials/SpecialBlockme.php
index 3840b2ff..85a3019e 100644
--- a/includes/specials/SpecialBlockme.php
+++ b/includes/specials/SpecialBlockme.php
@@ -22,7 +22,7 @@
*/
/**
- * A special page called by proxy_check.php to block open proxies
+ * A special page called by proxyCheck.php to block open proxies
*
* @ingroup SpecialPage
*/
@@ -59,4 +59,8 @@ class SpecialBlockme extends UnlistedSpecialPage {
$this->getOutput()->addWikiMsg( 'proxyblocksuccess' );
}
+
+ protected function getGroupName() {
+ return 'other';
+ }
}
diff --git a/includes/specials/SpecialBooksources.php b/includes/specials/SpecialBooksources.php
index bf7de3f5..bdbd77b8 100644
--- a/includes/specials/SpecialBooksources.php
+++ b/includes/specials/SpecialBooksources.php
@@ -46,7 +46,7 @@ class SpecialBookSources extends SpecialPage {
/**
* Show the special page
*
- * @param $isbn string ISBN passed as a subpage parameter
+ * @param string $isbn ISBN passed as a subpage parameter
*/
public function execute( $isbn ) {
$this->setHeaders();
@@ -62,8 +62,8 @@ class SpecialBookSources extends SpecialPage {
}
/**
- * Returns whether a given ISBN (10 or 13) is valid. True indicates validity.
- * @param isbn string ISBN passed for check
+ * Returns whether a given ISBN (10 or 13) is valid. True indicates validity.
+ * @param string $isbn ISBN passed for check
* @return bool
*/
public static function isValidISBN( $isbn ) {
@@ -71,7 +71,7 @@ class SpecialBookSources extends SpecialPage {
$sum = 0;
if( strlen( $isbn ) == 13 ) {
for( $i = 0; $i < 12; $i++ ) {
- if($i % 2 == 0) {
+ if( $i % 2 == 0 ) {
$sum += $isbn[$i];
} else {
$sum += 3 * $isbn[$i];
@@ -79,19 +79,19 @@ class SpecialBookSources extends SpecialPage {
}
$check = (10 - ($sum % 10)) % 10;
- if ($check == $isbn[12]) {
+ if ( $check == $isbn[12] ) {
return true;
}
} elseif( strlen( $isbn ) == 10 ) {
- for($i = 0; $i < 9; $i++) {
+ for( $i = 0; $i < 9; $i++ ) {
$sum += $isbn[$i] * ($i + 1);
}
$check = $sum % 11;
- if($check == 10) {
+ if( $check == 10 ) {
$check = "X";
}
- if($check == $isbn[9]) {
+ if( $check == $isbn[9] ) {
return true;
}
}
@@ -101,7 +101,7 @@ class SpecialBookSources extends SpecialPage {
/**
* Trim ISBN and remove characters which aren't required
*
- * @param $isbn string Unclean ISBN
+ * @param string $isbn Unclean ISBN
* @return string
*/
private static function cleanIsbn( $isbn ) {
@@ -116,7 +116,7 @@ class SpecialBookSources extends SpecialPage {
private function makeForm() {
global $wgScript;
- $form = '<fieldset><legend>' . $this->msg( 'booksources-search-legend' )->escaped() . '</legend>';
+ $form = '<fieldset><legend>' . $this->msg( 'booksources-search-legend' )->escaped() . '</legend>';
$form .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
$form .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() );
$form .= '<p>' . Xml::inputLabel( $this->msg( 'booksources-isbn' )->text(), 'isbn', 'isbn', 20, $this->isbn );
@@ -130,6 +130,7 @@ class SpecialBookSources extends SpecialPage {
* Determine where to get the list of book sources from,
* format and output them
*
+ * @throws MWException
* @return string
*/
private function showList() {
@@ -144,8 +145,17 @@ class SpecialBookSources extends SpecialPage {
$title = Title::makeTitleSafe( NS_PROJECT, $page ); # Show list in content language
if( is_object( $title ) && $title->exists() ) {
$rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
- $this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $rev->getText() ) );
- return true;
+ $content = $rev->getContent();
+
+ if ( $content instanceof TextContent ) {
+ //XXX: in the future, this could be stored as structured data, defining a list of book sources
+
+ $text = $content->getNativeData();
+ $this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $text ) );
+ return true;
+ } else {
+ throw new MWException( "Unexpected content type for book sources: " . $content->getModel() );
+ }
}
# Fall back to the defaults given in the language file
@@ -161,12 +171,16 @@ class SpecialBookSources extends SpecialPage {
/**
* Format a book source list item
*
- * @param $label string Book source label
- * @param $url string Book source URL
+ * @param string $label Book source label
+ * @param string $url Book source URL
* @return string
*/
private function makeListItem( $label, $url ) {
$url = str_replace( '$1', $this->isbn, $url );
return '<li><a href="' . htmlspecialchars( $url ) . '" class="external">' . htmlspecialchars( $label ) . '</a></li>';
}
+
+ protected function getGroupName() {
+ return 'other';
+ }
}
diff --git a/includes/specials/SpecialBrokenRedirects.php b/includes/specials/SpecialBrokenRedirects.php
index 8119e6d1..fac41236 100644
--- a/includes/specials/SpecialBrokenRedirects.php
+++ b/includes/specials/SpecialBrokenRedirects.php
@@ -33,35 +33,54 @@ class BrokenRedirectsPage extends QueryPage {
parent::__construct( $name );
}
- function isExpensive() { return true; }
- function isSyndicated() { return false; }
- function sortDescending() { return false; }
+ function isExpensive() {
+ return true;
+ }
+
+ function isSyndicated() {
+ return false;
+ }
+
+ function sortDescending() {
+ return false;
+ }
function getPageHeader() {
return $this->msg( 'brokenredirectstext' )->parseAsBlock();
}
function getQueryInfo() {
+ $dbr = wfGetDB( DB_SLAVE );
return array(
- 'tables' => array( 'redirect', 'p1' => 'page',
- 'p2' => 'page' ),
- 'fields' => array( 'namespace' => 'p1.page_namespace',
- 'title' => 'p1.page_title',
- 'value' => 'p1.page_title',
- 'rd_namespace',
- 'rd_title'
+ 'tables' => array(
+ 'redirect',
+ 'p1' => 'page',
+ 'p2' => 'page',
),
- 'conds' => array( 'rd_namespace >= 0',
- 'p2.page_namespace IS NULL'
+ 'fields' => array(
+ 'namespace' => 'p1.page_namespace',
+ 'title' => 'p1.page_title',
+ 'value' => 'p1.page_title',
+ 'rd_namespace',
+ 'rd_title',
+ ),
+ 'conds' => array(
+ // Exclude pages that don't exist locally as wiki pages,
+ // but aren't "broken" either.
+ // Special pages and interwiki links
+ 'rd_namespace >= 0',
+ 'rd_interwiki IS NULL OR rd_interwiki = ' . $dbr->addQuotes( '' ),
+ 'p2.page_namespace IS NULL',
+ ),
+ 'join_conds' => array(
+ 'p1' => array( 'JOIN', array(
+ 'rd_from=p1.page_id',
+ ) ),
+ 'p2' => array( 'LEFT JOIN', array(
+ 'rd_namespace=p2.page_namespace',
+ 'rd_title=p2.page_title'
+ ) ),
),
- 'join_conds' => array( 'p1' => array( 'JOIN', array(
- 'rd_from=p1.page_id',
- ) ),
- 'p2' => array( 'LEFT JOIN', array(
- 'rd_namespace=p2.page_namespace',
- 'rd_title=p2.page_title'
- ) )
- )
);
}
@@ -132,4 +151,8 @@ class BrokenRedirectsPage extends QueryPage {
$out .= " {$arr} {$to}";
return $out;
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialCachedPage.php b/includes/specials/SpecialCachedPage.php
index b3f6c720..ddd11ad0 100644
--- a/includes/specials/SpecialCachedPage.php
+++ b/includes/specials/SpecialCachedPage.php
@@ -119,7 +119,7 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
*
* @since 1.20
*
- * @param {function} $computeFunction
+ * @param callable $computeFunction
* @param array|mixed $args
* @param string|null $key
*
@@ -137,7 +137,7 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
*
* @since 1.20
*
- * @param {function} $computeFunction
+ * @param callable $computeFunction
* @param array $args
* @param string|null $key
*/
diff --git a/includes/specials/SpecialCategories.php b/includes/specials/SpecialCategories.php
index 1232e3fa..9040c640 100644
--- a/includes/specials/SpecialCategories.php
+++ b/includes/specials/SpecialCategories.php
@@ -50,6 +50,10 @@ class SpecialCategories extends SpecialPage {
Html::closeElement( 'div' )
);
}
+
+ protected function getGroupName() {
+ return 'pages';
+ }
}
/**
@@ -72,7 +76,7 @@ class CategoryPager extends AlphabeticPager {
function getQueryInfo() {
return array(
'tables' => array( 'category' ),
- 'fields' => array( 'cat_title','cat_pages' ),
+ 'fields' => array( 'cat_title', 'cat_pages' ),
'conds' => array( 'cat_pages > 0' ),
'options' => array( 'USE INDEX' => 'cat_title' ),
);
@@ -112,7 +116,7 @@ class CategoryPager extends AlphabeticPager {
return parent::getBody();
}
- function formatRow($result) {
+ function formatRow( $result ) {
$title = Title::makeTitle( NS_CATEGORY, $result->cat_title );
$titleText = Linker::link( $title, htmlspecialchars( $title->getText() ) );
$count = $this->msg( 'nmembers' )->numParams( $result->cat_pages )->escaped();
diff --git a/includes/specials/SpecialChangeEmail.php b/includes/specials/SpecialChangeEmail.php
index fc726106..59a02578 100644
--- a/includes/specials/SpecialChangeEmail.php
+++ b/includes/specials/SpecialChangeEmail.php
@@ -151,10 +151,10 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
$items = array(
array( 'wpName', 'username', 'text', $user->getName() ),
array( 'wpOldEmail', 'changeemail-oldemail', 'text', $oldEmailText ),
- array( 'wpNewEmail', 'changeemail-newemail', 'input', $this->mNewEmail ),
+ array( 'wpNewEmail', 'changeemail-newemail', 'email', $this->mNewEmail ),
);
if ( $wgRequirePasswordforEmailChange ) {
- $items[] = array( 'wpPassword', 'yourpassword', 'password', $this->mPassword );
+ $items[] = array( 'wpPassword', 'changeemail-password', 'password', $this->mPassword );
}
$this->getOutput()->addHTML(
@@ -195,7 +195,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
if ( $type != 'text' ) {
$out .= Xml::label( $this->msg( $label )->text(), $name );
} else {
- $out .= $this->msg( $label )->escaped();
+ $out .= $this->msg( $label )->escaped();
}
$out .= "</td>\n";
$out .= "\t<td class='mw-input'>";
@@ -213,6 +213,8 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
* @return bool|string true or string on success, false on failure
*/
protected function attemptChange( User $user, $pass, $newaddr ) {
+ global $wgAuth;
+
if ( $newaddr != '' && !Sanitizer::validateEmail( $newaddr ) ) {
$this->error( 'invalidemailaddress' );
return false;
@@ -248,6 +250,12 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
$user->saveSettings();
+ $wgAuth->updateExternalDB( $user );
+
return $status->value;
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
diff --git a/includes/specials/SpecialChangePassword.php b/includes/specials/SpecialChangePassword.php
index ba728ac2..e538caca 100644
--- a/includes/specials/SpecialChangePassword.php
+++ b/includes/specials/SpecialChangePassword.php
@@ -27,6 +27,9 @@
* @ingroup SpecialPage
*/
class SpecialChangePassword extends UnlistedSpecialPage {
+
+ protected $mUserName, $mOldpass, $mNewpass, $mRetype, $mDomain;
+
public function __construct() {
parent::__construct( 'ChangePassword' );
}
@@ -70,8 +73,10 @@ class SpecialChangePassword extends UnlistedSpecialPage {
}
$this->attemptReset( $this->mNewpass, $this->mRetype );
- $this->getOutput()->addWikiMsg( 'resetpass_success' );
- if( !$user->isLoggedIn() ) {
+
+ if( $user->isLoggedIn() ) {
+ $this->doReturnTo();
+ } else {
LoginForm::setLoginToken();
$token = LoginForm::getLoginToken();
$data = array(
@@ -79,17 +84,13 @@ class SpecialChangePassword extends UnlistedSpecialPage {
'wpName' => $this->mUserName,
'wpDomain' => $this->mDomain,
'wpLoginToken' => $token,
- 'wpPassword' => $this->mNewpass,
- 'returnto' => $request->getVal( 'returnto' ),
- );
- if( $request->getCheck( 'wpRemember' ) ) {
- $data['wpRemember'] = 1;
- }
+ 'wpPassword' => $request->getVal( 'wpNewPassword' ),
+ ) + $request->getValues( 'wpRemember', 'returnto', 'returntoquery' );
$login = new LoginForm( new FauxRequest( $data, true ) );
$login->setContext( $this->getContext() );
$login->execute( null );
}
- $this->doReturnTo();
+ return;
} catch( PasswordError $e ) {
$this->error( $e->getMessage() );
}
@@ -98,15 +99,20 @@ class SpecialChangePassword extends UnlistedSpecialPage {
}
function doReturnTo() {
- $titleObj = Title::newFromText( $this->getRequest()->getVal( 'returnto' ) );
+ $request = $this->getRequest();
+ $titleObj = Title::newFromText( $request->getVal( 'returnto' ) );
if ( !$titleObj instanceof Title ) {
$titleObj = Title::newMainPage();
}
- $this->getOutput()->redirect( $titleObj->getFullURL() );
+ $query = $request->getVal( 'returntoquery' );
+ $this->getOutput()->redirect( $titleObj->getFullURL( $query ) );
}
+ /**
+ * @param $msg string
+ */
function error( $msg ) {
- $this->getOutput()->addHTML( Xml::element('p', array( 'class' => 'error' ), $msg ) );
+ $this->getOutput()->addHTML( Xml::element( 'p', array( 'class' => 'error' ), $msg ) );
}
function showForm() {
@@ -142,6 +148,15 @@ class SpecialChangePassword extends UnlistedSpecialPage {
array( 'wpRetype', 'retypenew', 'password', null ),
);
$prettyFields = array_merge( $prettyFields, $extraFields );
+ $hiddenFields = array(
+ 'token' => $user->getEditToken(),
+ 'wpName' => $this->mUserName,
+ 'wpDomain' => $this->mDomain,
+ ) + $this->getRequest()->getValues( 'returnto', 'returntoquery' );
+ $hiddenFieldsStr = '';
+ foreach( $hiddenFields as $fieldname => $fieldvalue ) {
+ $hiddenFieldsStr .= Html::hidden( $fieldname, $fieldvalue ) . "\n";
+ }
$this->getOutput()->addHTML(
Xml::fieldset( $this->msg( 'resetpass_header' )->text() ) .
Xml::openElement( 'form',
@@ -149,10 +164,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
'method' => 'post',
'action' => $this->getTitle()->getLocalUrl(),
'id' => 'mw-resetpass-form' ) ) . "\n" .
- Html::hidden( 'token', $user->getEditToken() ) . "\n" .
- Html::hidden( 'wpName', $this->mUserName ) . "\n" .
- Html::hidden( 'wpDomain', $this->mDomain ) . "\n" .
- Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
+ $hiddenFieldsStr .
$this->msg( 'resetpass_text' )->parseAsBlock() . "\n" .
Xml::openElement( 'table', array( 'id' => 'mw-resetpass-table' ) ) . "\n" .
$this->pretty( $prettyFields ) . "\n" .
@@ -170,6 +182,10 @@ class SpecialChangePassword extends UnlistedSpecialPage {
);
}
+ /**
+ * @param $fields array
+ * @return string
+ */
function pretty( $fields ) {
$out = '';
foreach ( $fields as $list ) {
@@ -192,7 +208,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
if ( $type != 'text' )
$out .= Xml::label( $this->msg( $label )->text(), $name );
else
- $out .= $this->msg( $label )->escaped();
+ $out .= $this->msg( $label )->escaped();
$out .= "</td>\n";
$out .= "\t<td class='mw-input'>";
$out .= $field;
@@ -206,7 +222,13 @@ class SpecialChangePassword extends UnlistedSpecialPage {
* @throws PasswordError when cannot set the new password because requirements not met.
*/
protected function attemptReset( $newpass, $retype ) {
- $user = User::newFromName( $this->mUserName );
+ $isSelf = ( $this->mUserName === $this->getUser()->getName() );
+ if ( $isSelf ) {
+ $user = $this->getUser();
+ } else {
+ $user = User::newFromName( $this->mUserName );
+ }
+
if( !$user || $user->isAnon() ) {
throw new PasswordError( $this->msg( 'nosuchusershort', $this->mUserName )->text() );
}
@@ -227,7 +249,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
throw new PasswordError( $this->msg( $abortMsg )->text() );
}
- if( !$user->checkTemporaryPassword($this->mOldpass) && !$user->checkPassword($this->mOldpass) ) {
+ if( !$user->checkTemporaryPassword( $this->mOldpass ) && !$user->checkPassword( $this->mOldpass ) ) {
wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'wrongpassword' ) );
throw new PasswordError( $this->msg( 'resetpass-wrong-oldpass' )->text() );
}
@@ -240,13 +262,22 @@ class SpecialChangePassword extends UnlistedSpecialPage {
try {
$user->setPassword( $this->mNewpass );
wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'success' ) );
- $this->mNewpass = $this->mOldpass = $this->mRetypePass = '';
+ $this->mNewpass = $this->mOldpass = $this->mRetype = '';
} catch( PasswordError $e ) {
wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'error' ) );
throw new PasswordError( $e->getMessage() );
}
- $user->setCookies();
+ if ( $isSelf ) {
+ // This is needed to keep the user connected since
+ // changing the password also modifies the user's token.
+ $user->setCookies();
+ }
+
$user->saveSettings();
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
diff --git a/includes/specials/SpecialComparePages.php b/includes/specials/SpecialComparePages.php
index 9e3c52b9..c3bd3fec 100644
--- a/includes/specials/SpecialComparePages.php
+++ b/includes/specials/SpecialComparePages.php
@@ -106,28 +106,33 @@ class SpecialComparePages extends SpecialPage {
$form->trySubmit();
}
- public static function showDiff( $data, HTMLForm $form ){
+ public static function showDiff( $data, HTMLForm $form ) {
$rev1 = self::revOrTitle( $data['Revision1'], $data['Page1'] );
$rev2 = self::revOrTitle( $data['Revision2'], $data['Page2'] );
if( $rev1 && $rev2 ) {
- $de = new DifferenceEngine( $form->getContext(),
- $rev1,
- $rev2,
- null, // rcid
- ( $data['Action'] == 'purge' ),
- ( $data['Unhide'] == '1' )
- );
- $de->showDiffPage( true );
+ $revision = Revision::newFromId( $rev1 );
+
+ if ( $revision ) { // NOTE: $rev1 was already checked, should exist.
+ $contentHandler = $revision->getContentHandler();
+ $de = $contentHandler->createDifferenceEngine( $form->getContext(),
+ $rev1,
+ $rev2,
+ null, // rcid
+ ( $data['Action'] == 'purge' ),
+ ( $data['Unhide'] == '1' )
+ );
+ $de->showDiffPage( true );
+ }
}
}
public static function revOrTitle( $revision, $title ) {
- if( $revision ){
+ if( $revision ) {
return $revision;
} elseif( $title ) {
$title = Title::newFromText( $title );
- if( $title instanceof Title ){
+ if( $title instanceof Title ) {
return $title->getLatestRevID();
}
}
@@ -158,4 +163,8 @@ class SpecialComparePages extends SpecialPage {
}
return true;
}
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
diff --git a/includes/specials/SpecialConfirmemail.php b/includes/specials/SpecialConfirmemail.php
index 3e9ce128..078c3865 100644
--- a/includes/specials/SpecialConfirmemail.php
+++ b/includes/specials/SpecialConfirmemail.php
@@ -98,7 +98,7 @@ class EmailConfirmation extends UnlistedSpecialPage {
$out->wrapWikiMsg( "<div class=\"error mw-confirmemail-pending\">\n$1\n</div>", 'confirmemail_pending' );
}
$out->addWikiMsg( 'confirmemail_text' );
- $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl() ) );
+ $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl() ) );
$form .= Html::hidden( 'token', $user->getEditToken() );
$form .= Xml::submitButton( $this->msg( 'confirmemail_send' )->text() );
$form .= Xml::closeElement( 'form' );
@@ -110,7 +110,7 @@ class EmailConfirmation extends UnlistedSpecialPage {
* Attempt to confirm the user's email address and show success or failure
* as needed; if successful, take the user to log in
*
- * @param $code string Confirmation code
+ * @param string $code Confirmation code
*/
function attemptConfirm( $code ) {
$user = User::newFromConfirmationCode( $code );
@@ -145,9 +145,7 @@ class EmailInvalidation extends UnlistedSpecialPage {
function execute( $code ) {
$this->setHeaders();
- if ( wfReadOnly() ) {
- throw new ReadOnlyError;
- }
+ $this->checkReadOnly();
$this->attemptInvalidate( $code );
}
@@ -156,7 +154,7 @@ class EmailInvalidation extends UnlistedSpecialPage {
* Attempt to invalidate the user's email address and show success or failure
* as needed; if successful, link to main page
*
- * @param $code string Confirmation code
+ * @param string $code Confirmation code
*/
function attemptInvalidate( $code ) {
$user = User::newFromConfirmationCode( $code );
diff --git a/includes/specials/SpecialContributions.php b/includes/specials/SpecialContributions.php
index 54f8e261..b118059c 100644
--- a/includes/specials/SpecialContributions.php
+++ b/includes/specials/SpecialContributions.php
@@ -152,7 +152,7 @@ class SpecialContributions extends SpecialPage {
$apiParams['month'] = $this->opts['month'];
}
- $url = wfScript( 'api' ) . '?' . wfArrayToCGI( $apiParams );
+ $url = wfScript( 'api' ) . '?' . wfArrayToCgi( $apiParams );
$out->redirect( $url, '301' );
return;
@@ -192,7 +192,6 @@ class SpecialContributions extends SpecialPage {
}
$out->preventClickjacking( $pager->getPreventClickjacking() );
-
# Show the appropriate "footer" message - WHOIS tools, etc.
if ( $this->opts['contribs'] == 'newbie' ) {
$message = 'sp-contributions-footer-newbies';
@@ -360,7 +359,7 @@ class SpecialContributions extends SpecialPage {
if ( !isset( $this->opts['target'] ) ) {
$this->opts['target'] = '';
} else {
- $this->opts['target'] = str_replace( '_' , ' ' , $this->opts['target'] );
+ $this->opts['target'] = str_replace( '_', ' ', $this->opts['target'] );
}
if ( !isset( $this->opts['namespace'] ) ) {
@@ -399,7 +398,7 @@ class SpecialContributions extends SpecialPage {
$this->opts['topOnly'] = false;
}
- $form = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'class' => 'mw-contributions-form' ) );
+ $form = Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'class' => 'mw-contributions-form' ) );
# Add hidden params for tracking except for parameters in $skipParameters
$skipParameters = array( 'namespace', 'nsInvert', 'deletedOnly', 'target', 'contribs', 'year', 'month', 'topOnly', 'associated' );
@@ -414,17 +413,17 @@ class SpecialContributions extends SpecialPage {
if ( $tagFilter ) {
$filterSelection =
- Xml::tags( 'td', array( 'class' => 'mw-label' ), array_shift( $tagFilter ) ) .
- Xml::tags( 'td', array( 'class' => 'mw-input' ), implode( '&#160', $tagFilter ) );
+ Html::rawElement( 'td', array( 'class' => 'mw-label' ), array_shift( $tagFilter ) ) .
+ Html::rawElement( 'td', array( 'class' => 'mw-input' ), implode( '&#160', $tagFilter ) );
} else {
- $filterSelection = Xml::tags( 'td', array( 'colspan' => 2 ), '' );
+ $filterSelection = Html::rawElement( 'td', array( 'colspan' => 2 ), '' );
}
- $targetSelection = Xml::tags( 'td', array( 'colspan' => 2 ),
+ $targetSelection = Html::rawElement( 'td', array( 'colspan' => 2 ),
Xml::radioLabel(
$this->msg( 'sp-contributions-newbies' )->text(),
'contribs',
- 'newbie' ,
+ 'newbie',
'newbie',
$this->opts['contribs'] == 'newbie',
array( 'class' => 'mw-input' )
@@ -445,7 +444,7 @@ class SpecialContributions extends SpecialPage {
( $this->opts['target'] ? array() : array( 'autofocus' )
)
) . ' '
- ) ;
+ );
$namespaceSelection =
Xml::tags( 'td', array( 'class' => 'mw-label' ),
@@ -455,7 +454,7 @@ class SpecialContributions extends SpecialPage {
''
)
) .
- Xml::tags( 'td', null,
+ Html::rawElement( 'td', null,
Html::namespaceSelector( array(
'selected' => $this->opts['namespace'],
'all' => '',
@@ -483,10 +482,10 @@ class SpecialContributions extends SpecialPage {
array( 'title' => $this->msg( 'tooltip-namespace_association' )->text(), 'class' => 'mw-input' )
) . '&#160;'
)
- ) ;
+ );
- $extraOptions = Xml::tags( 'td', array( 'colspan' => 2 ),
- Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+ if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
+ $deletedOnlyCheck = Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
Xml::checkLabel(
$this->msg( 'history-show-deleted' )->text(),
'deletedOnly',
@@ -494,7 +493,13 @@ class SpecialContributions extends SpecialPage {
$this->opts['deletedOnly'],
array( 'class' => 'mw-input' )
)
- ) .
+ );
+ } else {
+ $deletedOnlyCheck = '';
+ }
+
+ $extraOptions = Html::rawElement( 'td', array( 'colspan' => 2 ),
+ $deletedOnlyCheck .
Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
Xml::checkLabel(
$this->msg( 'sp-contributions-toponly' )->text(),
@@ -504,7 +509,7 @@ class SpecialContributions extends SpecialPage {
array( 'class' => 'mw-input' )
)
)
- ) ;
+ );
$dateSelectionAndSubmit = Xml::tags( 'td', array( 'colspan' => 2 ),
Xml::dateMenu(
@@ -515,36 +520,30 @@ class SpecialContributions extends SpecialPage {
$this->msg( 'sp-contributions-submit' )->text(),
array( 'class' => 'mw-submit' )
)
- ) ;
+ );
$form .=
Xml::fieldset( $this->msg( 'sp-contributions-search' )->text() ) .
- Xml::openElement( 'table', array( 'class' => 'mw-contributions-table' ) ) .
- Xml::openElement( 'tr' ) .
- $targetSelection .
- Xml::closeElement( 'tr' ) .
- Xml::openElement( 'tr' ) .
- $namespaceSelection .
- Xml::closeElement( 'tr' ) .
- Xml::openElement( 'tr' ) .
- $filterSelection .
- Xml::closeElement( 'tr' ) .
- Xml::openElement( 'tr' ) .
- $extraOptions .
- Xml::closeElement( 'tr' ) .
- Xml::openElement( 'tr' ) .
- $dateSelectionAndSubmit .
- Xml::closeElement( 'tr' ) .
- Xml::closeElement( 'table' );
+ Html::rawElement( 'table', array( 'class' => 'mw-contributions-table' ), "\n" .
+ Html::rawElement( 'tr', array(), $targetSelection ) . "\n" .
+ Html::rawElement( 'tr', array(), $namespaceSelection ) . "\n" .
+ Html::rawElement( 'tr', array(), $filterSelection ) . "\n" .
+ Html::rawElement( 'tr', array(), $extraOptions ) . "\n" .
+ Html::rawElement( 'tr', array(), $dateSelectionAndSubmit ) . "\n"
+ );
$explain = $this->msg( 'sp-contributions-explain' );
- if ( $explain->exists() ) {
- $form .= "<p id='mw-sp-contributions-explain'>{$explain}</p>";
+ if ( !$explain->isBlank() ) {
+ $form .= "<p id='mw-sp-contributions-explain'>{$explain->parse()}</p>";
}
$form .= Xml::closeElement( 'fieldset' ) .
Xml::closeElement( 'form' );
return $form;
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
/**
@@ -598,7 +597,7 @@ class ContribsPager extends ReverseChronologicalPager {
* This method basically executes the exact same code as the parent class, though with
* a hook added, to allow extentions to add additional queries.
*
- * @param $offset String: index offset, inclusive
+ * @param string $offset index offset, inclusive
* @param $limit Integer: exact query limit
* @param $descending Boolean: query direction, false for ascending, true for descending
* @return ResultWrapper
@@ -631,7 +630,7 @@ class ContribsPager extends ReverseChronologicalPager {
$result = array();
// loop all results and collect them in an array
- foreach ( $data as $j => $query ) {
+ foreach ( $data as $query ) {
foreach ( $query as $i => $row ) {
// use index column as key, allowing us to easily sort in PHP
$result[$row->{$this->getIndexField()} . "-$i"] = $row;
@@ -731,10 +730,10 @@ class ContribsPager extends ReverseChronologicalPager {
}
}
if ( $this->deletedOnly ) {
- $condition[] = "rev_deleted != '0'";
+ $condition[] = 'rev_deleted != 0';
}
if ( $this->topOnly ) {
- $condition[] = "rev_id = page_latest";
+ $condition[] = 'rev_id = page_latest';
}
return array( $tables, $index, $condition, $join_conds );
}
@@ -831,7 +830,7 @@ class ContribsPager extends ReverseChronologicalPager {
*/
wfSuppressWarnings();
$rev = new Revision( $row );
- $validRevision = $rev->getParentId() !== null;
+ $validRevision = (bool) $rev->getId();
wfRestoreWarnings();
if ( $validRevision ) {
@@ -950,8 +949,12 @@ class ContribsPager extends ReverseChronologicalPager {
// Let extensions add data
wfRunHooks( 'ContributionsLineEnding', array( $this, &$ret, $row, &$classes ) );
- $classes = implode( ' ', $classes );
- $ret = "<li class=\"$classes\">$ret</li>\n";
+ if ( $classes === array() && $ret === '' ) {
+ wfDebug( 'Dropping Special:Contribution row that could not be formatted' );
+ $ret = "<!-- Could not format Special:Contribution row. -->\n";
+ } else {
+ $ret = Html::rawElement( 'li', array( 'class' => $classes ), $ret ) . "\n";
+ }
wfProfileOut( __METHOD__ );
return $ret;
diff --git a/includes/specials/SpecialDeadendpages.php b/includes/specials/SpecialDeadendpages.php
index f4904a50..6978d6bb 100644
--- a/includes/specials/SpecialDeadendpages.php
+++ b/includes/specials/SpecialDeadendpages.php
@@ -82,4 +82,8 @@ class DeadendPagesPage extends PageQueryPage {
return array( 'page_title' );
}
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialDeletedContributions.php b/includes/specials/SpecialDeletedContributions.php
index c880b617..e374979e 100644
--- a/includes/specials/SpecialDeletedContributions.php
+++ b/includes/specials/SpecialDeletedContributions.php
@@ -135,7 +135,10 @@ class DeletedContribsPager extends IndexPager {
function formatRow( $row ) {
wfProfileIn( __METHOD__ );
+ $page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
+
$rev = new Revision( array(
+ 'title' => $page,
'id' => $row->ar_rev_id,
'comment' => $row->ar_comment,
'user' => $row->ar_user,
@@ -145,8 +148,6 @@ class DeletedContribsPager extends IndexPager {
'deleted' => $row->ar_deleted,
) );
- $page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
-
$undelete = SpecialPage::getTitleFor( 'Undelete' );
$logs = SpecialPage::getTitleFor( 'Log' );
@@ -167,7 +168,7 @@ class DeletedContribsPager extends IndexPager {
$user = $this->getUser();
- if( $user->isAllowed('deletedtext') ) {
+ if( $user->isAllowed( 'deletedtext' ) ) {
$last = Linker::linkKnown(
$undelete,
$this->messages['diff'],
@@ -260,7 +261,7 @@ class DeletedContributionsPage extends SpecialPage {
* Special page "deleted user contributions".
* Shows a list of the deleted contributions of a user.
*
- * @param $par String: (optional) user name of the user for which to show the contributions
+ * @param string $par (optional) user name of the user for which to show the contributions
*/
function execute( $par ) {
global $wgQueryPageDefaultLimit;
@@ -464,7 +465,7 @@ class DeletedContributionsPage extends SpecialPage {
/**
* Generates the namespace selector form with hidden attributes.
- * @param $options Array: the options to be included.
+ * @param array $options the options to be included.
* @return string
*/
function getForm( $options ) {
@@ -474,7 +475,7 @@ class DeletedContributionsPage extends SpecialPage {
if ( !isset( $options['target'] ) ) {
$options['target'] = '';
} else {
- $options['target'] = str_replace( '_' , ' ' , $options['target'] );
+ $options['target'] = str_replace( '_', ' ', $options['target'] );
}
if ( !isset( $options['namespace'] ) ) {
@@ -498,7 +499,7 @@ class DeletedContributionsPage extends SpecialPage {
$f .= "\t" . Html::hidden( $name, $value ) . "\n";
}
- $f .= Xml::openElement( 'fieldset' ) .
+ $f .= Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', array(), $this->msg( 'sp-contributions-search' )->text() ) .
Xml::tags( 'label', array( 'for' => 'target' ), $this->msg( 'sp-contributions-username' )->parse() ) . ' ' .
Html::input( 'target', $options['target'], 'text', array(
@@ -521,4 +522,8 @@ class DeletedContributionsPage extends SpecialPage {
Xml::closeElement( 'form' );
return $f;
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
diff --git a/includes/specials/SpecialDisambiguations.php b/includes/specials/SpecialDisambiguations.php
index 48180a77..2126ca52 100644
--- a/includes/specials/SpecialDisambiguations.php
+++ b/includes/specials/SpecialDisambiguations.php
@@ -59,20 +59,20 @@ class DisambiguationsPage extends QueryPage {
if( $dp->getNamespace() != NS_TEMPLATE ) {
# @todo FIXME: We assume the disambiguation message is a template but
# the page can potentially be from another namespace :/
- wfDebug("Mediawiki:disambiguationspage message does not refer to a template!\n");
+ wfDebug( "Mediawiki:disambiguationspage message does not refer to a template!\n" );
}
$linkBatch->addObj( $dp );
} else {
# Get all the templates linked from the Mediawiki:Disambiguationspage
$disPageObj = Title::makeTitleSafe( NS_MEDIAWIKI, 'disambiguationspage' );
$res = $dbr->select(
- array('pagelinks', 'page'),
+ array( 'pagelinks', 'page' ),
'pl_title',
- array('page_id = pl_from',
+ array( 'page_id = pl_from',
'pl_namespace' => NS_TEMPLATE,
'page_namespace' => $disPageObj->getNamespace(),
- 'page_title' => $disPageObj->getDBkey()),
- __METHOD__ );
+ 'page_title' => $disPageObj->getDBkey()
+ ), __METHOD__ );
foreach ( $res as $row ) {
$linkBatch->addObj( Title::makeTitle( NS_TEMPLATE, $row->pl_title ));
@@ -158,4 +158,8 @@ class DisambiguationsPage extends QueryPage {
return "$from $edit $arr $to";
}
+
+ protected function getGroupName() {
+ return 'pages';
+ }
}
diff --git a/includes/specials/SpecialDoubleRedirects.php b/includes/specials/SpecialDoubleRedirects.php
index 5864ca9f..5a5d749c 100644
--- a/includes/specials/SpecialDoubleRedirects.php
+++ b/includes/specials/SpecialDoubleRedirects.php
@@ -33,9 +33,17 @@ class DoubleRedirectsPage extends QueryPage {
parent::__construct( $name );
}
- function isExpensive() { return true; }
- function isSyndicated() { return false; }
- function sortDescending() { return false; }
+ function isExpensive() {
+ return true;
+ }
+
+ function isSyndicated() {
+ return false;
+ }
+
+ function sortDescending() {
+ return false;
+ }
function getPageHeader() {
return $this->msg( 'doubleredirectstext' )->parseAsBlock();
@@ -43,23 +51,45 @@ class DoubleRedirectsPage extends QueryPage {
function reallyGetQueryInfo( $namespace = null, $title = null ) {
$limitToTitle = !( $namespace === null && $title === null );
+ $dbr = wfGetDB( DB_SLAVE );
$retval = array (
- 'tables' => array ( 'ra' => 'redirect',
- 'rb' => 'redirect', 'pa' => 'page',
- 'pb' => 'page', 'pc' => 'page' ),
- 'fields' => array ( 'namespace' => 'pa.page_namespace',
- 'title' => 'pa.page_title',
- 'value' => 'pa.page_title',
- 'nsb' => 'pb.page_namespace',
- 'tb' => 'pb.page_title',
- 'nsc' => 'pc.page_namespace',
- 'tc' => 'pc.page_title' ),
- 'conds' => array ( 'ra.rd_from = pa.page_id',
- 'pb.page_namespace = ra.rd_namespace',
- 'pb.page_title = ra.rd_title',
- 'rb.rd_from = pb.page_id',
- 'pc.page_namespace = rb.rd_namespace',
- 'pc.page_title = rb.rd_title' )
+ 'tables' => array (
+ 'ra' => 'redirect',
+ 'rb' => 'redirect',
+ 'pa' => 'page',
+ 'pb' => 'page'
+ ),
+ 'fields' => array(
+ 'namespace' => 'pa.page_namespace',
+ 'title' => 'pa.page_title',
+ 'value' => 'pa.page_title',
+
+ 'nsb' => 'pb.page_namespace',
+ 'tb' => 'pb.page_title',
+
+ // Select fields from redirect instead of page. Because there may
+ // not actually be a page table row for this target (e.g. for interwiki redirects)
+ 'nsc' => 'rb.rd_namespace',
+ 'tc' => 'rb.rd_title',
+ 'iwc' => 'rb.rd_interwiki',
+ ),
+ 'conds' => array(
+ 'ra.rd_from = pa.page_id',
+
+ // Filter out redirects where the target goes interwiki (bug 40353).
+ // This isn't an optimization, it is required for correct results,
+ // otherwise a non-double redirect like Bar -> w:Foo will show up
+ // like "Bar -> Foo -> w:Foo".
+
+ // Need to check both NULL and "" for some reason,
+ // apparently either can be stored for non-iw entries.
+ 'ra.rd_interwiki IS NULL OR ra.rd_interwiki = ' . $dbr->addQuotes( '' ),
+
+ 'pb.page_namespace = ra.rd_namespace',
+ 'pb.page_title = ra.rd_title',
+
+ 'rb.rd_from = pb.page_id',
+ )
);
if ( $limitToTitle ) {
$retval['conds']['pa.page_namespace'] = $namespace;
@@ -79,11 +109,16 @@ class DoubleRedirectsPage extends QueryPage {
function formatResult( $skin, $result ) {
$titleA = Title::makeTitle( $result->namespace, $result->title );
+ // If only titleA is in the query, it means this came from
+ // querycache (which only saves 3 columns).
+ // That does save the bulk of the query cost, but now we need to
+ // get a little more detail about each individual entry quickly
+ // using the filter of reallyGetQueryInfo.
if ( $result && !isset( $result->nsb ) ) {
$dbr = wfGetDB( DB_SLAVE );
$qi = $this->reallyGetQueryInfo( $result->namespace,
$result->title );
- $res = $dbr->select($qi['tables'], $qi['fields'],
+ $res = $dbr->select( $qi['tables'], $qi['fields'],
$qi['conds'], __METHOD__ );
if ( $res ) {
$result = $dbr->fetchObject( $res );
@@ -94,7 +129,7 @@ class DoubleRedirectsPage extends QueryPage {
}
$titleB = Title::makeTitle( $result->nsb, $result->tb );
- $titleC = Title::makeTitle( $result->nsc, $result->tc );
+ $titleC = Title::makeTitle( $result->nsc, $result->tc, '', $result->iwc );
$linkA = Linker::linkKnown(
$titleA,
@@ -127,4 +162,8 @@ class DoubleRedirectsPage extends QueryPage {
return( "{$linkA} {$edit} {$arr} {$linkB} {$arr} {$linkC}" );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialEditWatchlist.php b/includes/specials/SpecialEditWatchlist.php
index 23cd9aa6..d2838e01 100644
--- a/includes/specials/SpecialEditWatchlist.php
+++ b/includes/specials/SpecialEditWatchlist.php
@@ -49,7 +49,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
private $badItems = array();
- public function __construct(){
+ public function __construct() {
parent::__construct( 'EditWatchlist' );
}
@@ -77,6 +77,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
}
$this->checkPermissions();
+ $this->checkReadOnly();
$this->outputHeader();
@@ -85,9 +86,9 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
# B/C: $mode used to be waaay down the parameter list, and the first parameter
# was $wgUser
- if( $mode instanceof User ){
+ if( $mode instanceof User ) {
$args = func_get_args();
- if( count( $args >= 4 ) ){
+ if( count( $args >= 4 ) ) {
$mode = $args[3];
}
}
@@ -101,7 +102,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
case self::EDIT_RAW:
$out->setPageTitle( $this->msg( 'watchlistedit-raw-title' ) );
$form = $this->getRawForm();
- if( $form->show() ){
+ if( $form->show() ) {
$out->addHTML( $this->successMessage );
$out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
}
@@ -111,7 +112,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
default:
$out->setPageTitle( $this->msg( 'watchlistedit-normal-title' ) );
$form = $this->getNormalForm();
- if( $form->show() ){
+ if( $form->show() ) {
$out->addHTML( $this->successMessage );
$out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
} elseif ( $this->toc !== false ) {
@@ -153,7 +154,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
return array_unique( $list );
}
- public function submitRaw( $data ){
+ public function submitRaw( $data ) {
$wanted = $this->extractTitles( $data['Titles'] );
$current = $this->getWatchlist();
@@ -164,7 +165,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$this->unwatchTitles( $toUnwatch );
$this->getUser()->invalidateCache();
- if( count( $toWatch ) > 0 || count( $toUnwatch ) > 0 ){
+ if( count( $toWatch ) > 0 || count( $toUnwatch ) > 0 ) {
$this->successMessage = $this->msg( 'watchlistedit-raw-done' )->parse();
} else {
return false;
@@ -185,7 +186,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$this->clearWatchlist();
$this->getUser()->invalidateCache();
- if( count( $current ) > 0 ){
+ if( count( $current ) > 0 ) {
$this->successMessage = $this->msg( 'watchlistedit-raw-done' )->parse();
} else {
return false;
@@ -204,7 +205,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
* $titles can be an array of strings or Title objects; the former
* is preferred, since Titles are very memory-heavy
*
- * @param $titles array of strings, or Title objects
+ * @param array $titles of strings, or Title objects
* @param $output String
*/
private function showTitles( $titles, &$output ) {
@@ -289,7 +290,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$res = $dbr->select(
array( 'watchlist' ),
- array( 'wl_namespace', 'wl_title' ),
+ array( 'wl_namespace', 'wl_title' ),
array( 'wl_user' => $this->getUser()->getId() ),
__METHOD__,
array( 'ORDER BY' => array( 'wl_namespace', 'wl_title' ) )
@@ -312,7 +313,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
*
* @param Title $title
* @param int $namespace
- * @param String $dbKey
+ * @param string $dbKey
* @return bool: Whether this item is valid
*/
private function checkTitle( $title, $namespace, $dbKey ) {
@@ -381,7 +382,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
* $titles can be an array of strings or Title objects; the former
* is preferred, since Titles are very memory-heavy
*
- * @param $titles Array of strings, or Title objects
+ * @param array $titles of strings, or Title objects
*/
private function watchTitles( $titles ) {
$dbw = wfGetDB( DB_MASTER );
@@ -393,13 +394,13 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
if( $title instanceof Title ) {
$rows[] = array(
'wl_user' => $this->getUser()->getId(),
- 'wl_namespace' => ( $title->getNamespace() & ~1 ),
+ 'wl_namespace' => MWNamespace::getSubject( $title->getNamespace() ),
'wl_title' => $title->getDBkey(),
'wl_notificationtimestamp' => null,
);
$rows[] = array(
'wl_user' => $this->getUser()->getId(),
- 'wl_namespace' => ( $title->getNamespace() | 1 ),
+ 'wl_namespace' => MWNamespace::getTalk( $title->getNamespace() ),
'wl_title' => $title->getDBkey(),
'wl_notificationtimestamp' => null,
);
@@ -414,7 +415,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
* $titles can be an array of strings or Title objects; the former
* is preferred, since Titles are very memory-heavy
*
- * @param $titles Array of strings, or Title objects
+ * @param array $titles of strings, or Title objects
*/
private function unwatchTitles( $titles ) {
$dbw = wfGetDB( DB_MASTER );
@@ -427,7 +428,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
'watchlist',
array(
'wl_user' => $this->getUser()->getId(),
- 'wl_namespace' => ( $title->getNamespace() & ~1 ),
+ 'wl_namespace' => MWNamespace::getSubject( $title->getNamespace() ),
'wl_title' => $title->getDBkey(),
),
__METHOD__
@@ -436,7 +437,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
'watchlist',
array(
'wl_user' => $this->getUser()->getId(),
- 'wl_namespace' => ( $title->getNamespace() | 1 ),
+ 'wl_namespace' => MWNamespace::getTalk( $title->getNamespace() ),
'wl_title' => $title->getDBkey(),
),
__METHOD__
@@ -470,26 +471,26 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
*
* @return HTMLForm
*/
- protected function getNormalForm(){
+ protected function getNormalForm() {
global $wgContLang;
$fields = array();
$count = 0;
- foreach( $this->getWatchlistInfo() as $namespace => $pages ){
+ foreach( $this->getWatchlistInfo() as $namespace => $pages ) {
if ( $namespace >= 0 ) {
- $fields['TitlesNs'.$namespace] = array(
+ $fields['TitlesNs' . $namespace] = array(
'class' => 'EditWatchlistCheckboxSeriesField',
'options' => array(),
'section' => "ns$namespace",
);
}
- foreach( array_keys( $pages ) as $dbkey ){
+ foreach( array_keys( $pages ) as $dbkey ) {
$title = Title::makeTitleSafe( $namespace, $dbkey );
if ( $this->checkTitle( $title, $namespace, $dbkey ) ) {
$text = $this->buildRemoveLine( $title );
- $fields['TitlesNs'.$namespace]['options'][$text] = htmlspecialchars( $title->getPrefixedText() );
+ $fields['TitlesNs' . $namespace]['options'][$text] = $title->getPrefixedText();
$count++;
}
}
@@ -519,7 +520,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$form->setTitle( $this->getTitle() );
$form->setSubmitTextMsg( 'watchlistedit-normal-submit' );
# Used message keys: 'accesskey-watchlistedit-normal-submit', 'tooltip-watchlistedit-normal-submit'
- $form->setSubmitTooltip('watchlistedit-normal-submit');
+ $form->setSubmitTooltip( 'watchlistedit-normal-submit' );
$form->setWrapperLegendMsg( 'watchlistedit-normal-legend' );
$form->addHeaderText( $this->msg( 'watchlistedit-normal-explain' )->parse() );
$form->setSubmitCallback( array( $this, 'submitNormal' ) );
@@ -564,7 +565,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
*
* @return HTMLForm
*/
- protected function getRawForm(){
+ protected function getRawForm() {
$titles = implode( $this->getWatchlist(), "\n" );
$fields = array(
'Titles' => array(
@@ -577,7 +578,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
$form->setTitle( $this->getTitle( 'raw' ) );
$form->setSubmitTextMsg( 'watchlistedit-raw-submit' );
# Used message keys: 'accesskey-watchlistedit-raw-submit', 'tooltip-watchlistedit-raw-submit'
- $form->setSubmitTooltip('watchlistedit-raw-submit');
+ $form->setSubmitTooltip( 'watchlistedit-raw-submit' );
$form->setWrapperLegendMsg( 'watchlistedit-raw-legend' );
$form->addHeaderText( $this->msg( 'watchlistedit-raw-explain' )->parse() );
$form->setSubmitCallback( array( $this, 'submitRaw' ) );
@@ -648,7 +649,7 @@ class WatchlistEditor extends SpecialEditWatchlist {}
* Extend HTMLForm purely so we can have a more sane way of getting the section headers
*/
class EditWatchlistNormalHTMLForm extends HTMLForm {
- public function getLegend( $namespace ){
+ public function getLegend( $namespace ) {
$namespace = substr( $namespace, 2 );
return $namespace == NS_MAIN
? $this->msg( 'blanknamespace' )->escaped()
@@ -667,8 +668,8 @@ class EditWatchlistCheckboxSeriesField extends HTMLMultiSelectField {
* form is open (bug 32126), but we know that invalid items will
* be harmless so we can override it here.
*
- * @param $value String the value the field was submitted with
- * @param $alldata Array the data collected from the form
+ * @param string $value the value the field was submitted with
+ * @param array $alldata the data collected from the form
* @return Mixed Bool true on success, or String error to display.
*/
function validate( $value, $alldata ) {
diff --git a/includes/specials/SpecialEmailuser.php b/includes/specials/SpecialEmailuser.php
index 4d875e6e..b5ad589e 100644
--- a/includes/specials/SpecialEmailuser.php
+++ b/includes/specials/SpecialEmailuser.php
@@ -139,7 +139,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
$this->mTargetObj = $ret;
$form = new HTMLForm( $this->getFormFields(), $this->getContext() );
- $form->addPreText( $this->msg( 'emailpagetext' )->parse() );
+ // By now we are supposed to be sure that $this->mTarget is a user name
+ $form->addPreText( $this->msg( 'emailpagetext', $this->mTarget )->parse() );
$form->setSubmitTextMsg( 'emailsend' );
$form->setTitle( $this->getTitle() );
$form->setSubmitCallback( array( __CLASS__, 'uiSubmit' ) );
@@ -162,7 +163,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
/**
* Validate target User
*
- * @param $target String: target user name
+ * @param string $target target user name
* @return User object on success or a string on error
*/
public static function getTarget( $target ) {
@@ -190,7 +191,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
* Check whether a user is allowed to send email
*
* @param $user User object
- * @param $editToken String: edit token
+ * @param string $editToken edit token
* @return null on success or string on error
*/
public static function getPermissionsError( $user, $editToken ) {
@@ -230,7 +231,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
/**
* Form to ask for target user name.
*
- * @param $name String: user name submitted.
+ * @param string $name user name submitted.
* @return String: form asking for user name.
*/
protected function userForm( $name ) {
@@ -336,4 +337,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
return $status;
}
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
diff --git a/includes/specials/SpecialExport.php b/includes/specials/SpecialExport.php
index b4294b32..7abfefe2 100644
--- a/includes/specials/SpecialExport.php
+++ b/includes/specials/SpecialExport.php
@@ -80,7 +80,7 @@ class SpecialExport extends SpecialPage {
$page = $request->getText( 'pages' );
$nsindex = $request->getText( 'nsindex', '' );
- if ( strval( $nsindex ) !== '' ) {
+ if ( strval( $nsindex ) !== '' ) {
/**
* Same implementation as above, so same @todo
*/
@@ -124,7 +124,7 @@ class SpecialExport extends SpecialPage {
if ( $this->curonly ) {
$history = WikiExporter::CURRENT;
} elseif ( !$historyCheck ) {
- if ( $limit > 0 && ($wgExportMaxHistory == 0 || $limit < $wgExportMaxHistory ) ) {
+ if ( $limit > 0 && ( $wgExportMaxHistory == 0 || $limit < $wgExportMaxHistory ) ) {
$history['limit'] = $limit;
}
if ( !is_null( $offset ) ) {
@@ -161,7 +161,7 @@ class SpecialExport extends SpecialPage {
$list_authors = $request->getCheck( 'listauthors' );
if ( !$this->curonly || !$wgExportAllowListContributors ) {
- $list_authors = false ;
+ $list_authors = false;
}
if ( $this->doExport ) {
@@ -272,7 +272,7 @@ class SpecialExport extends SpecialPage {
/**
* Do the actual page exporting
*
- * @param $page String: user input on what page(s) to export
+ * @param string $page user input on what page(s) to export
* @param $history Mixed: one of the WikiExporter history export constants
* @param $list_authors Boolean: Whether to add distinct author list (when
* not returning full history)
@@ -286,7 +286,7 @@ class SpecialExport extends SpecialPage {
} else {
$pageSet = array(); // Inverted index of all pages to look up
-
+
// Split up and normalize input
foreach( explode( "\n", $page ) as $pageName ) {
$pageName = trim( $pageName );
@@ -339,7 +339,7 @@ class SpecialExport extends SpecialPage {
// This might take a while... :D
wfSuppressWarnings();
- set_time_limit(0);
+ set_time_limit( 0 );
wfRestoreWarnings();
}
@@ -405,7 +405,7 @@ class SpecialExport extends SpecialPage {
foreach ( $res as $row ) {
$n = $row->page_title;
- if ($row->page_namespace) {
+ if ( $row->page_namespace ) {
$ns = $wgContLang->getNsText( $row->page_namespace );
$n = $ns . ':' . $n;
}
@@ -561,4 +561,7 @@ class SpecialExport extends SpecialPage {
return $pageSet;
}
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
diff --git a/includes/specials/SpecialFewestrevisions.php b/includes/specials/SpecialFewestrevisions.php
index 7e4bc9ce..5b7f353d 100644
--- a/includes/specials/SpecialFewestrevisions.php
+++ b/includes/specials/SpecialFewestrevisions.php
@@ -60,7 +60,6 @@ class FewestrevisionsPage extends QueryPage {
);
}
-
function sortDescending() {
return false;
}
@@ -94,4 +93,8 @@ class FewestrevisionsPage extends QueryPage {
return $this->getLanguage()->specialList( $plink, $nlink );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialFileDuplicateSearch.php b/includes/specials/SpecialFileDuplicateSearch.php
index ccf8ba17..3fe64e6f 100644
--- a/includes/specials/SpecialFileDuplicateSearch.php
+++ b/includes/specials/SpecialFileDuplicateSearch.php
@@ -40,9 +40,17 @@ class FileDuplicateSearchPage extends QueryPage {
parent::__construct( $name );
}
- function isSyndicated() { return false; }
- function isCacheable() { return false; }
- function isCached() { return false; }
+ function isSyndicated() {
+ return false;
+ }
+
+ function isCacheable() {
+ return false;
+ }
+
+ function isCached() {
+ return false;
+ }
function linkParameters() {
return array( 'filename' => $this->filename );
@@ -59,7 +67,7 @@ class FileDuplicateSearchPage extends QueryPage {
/**
*
- * @param $dupes Array of File objects
+ * @param array $dupes of File objects
*/
function showList( $dupes ) {
$html = array();
@@ -93,7 +101,7 @@ class FileDuplicateSearchPage extends QueryPage {
$this->setHeaders();
$this->outputHeader();
- $this->filename = isset( $par ) ? $par : $this->getRequest()->getText( 'filename' );
+ $this->filename = isset( $par ) ? $par : $this->getRequest()->getText( 'filename' );
$this->file = null;
$this->hash = '';
$title = Title::newFromText( $this->filename, NS_FILE );
@@ -106,7 +114,7 @@ class FileDuplicateSearchPage extends QueryPage {
# Create the input form
$out->addHTML(
Xml::openElement( 'form', array( 'id' => 'fileduplicatesearch', 'method' => 'get', 'action' => $wgScript ) ) .
- Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
Xml::openElement( 'fieldset' ) .
Xml::element( 'legend', null, $this->msg( 'fileduplicatesearch-legend' )->text() ) .
Xml::inputLabel( $this->msg( 'fileduplicatesearch-filename' )->text(), 'filename', 'filename', 50, $this->filename ) . ' ' .
@@ -207,4 +215,8 @@ class FileDuplicateSearchPage extends QueryPage {
return "$plink . . $user . . $time";
}
+
+ protected function getGroupName() {
+ return 'media';
+ }
}
diff --git a/includes/specials/SpecialFilepath.php b/includes/specials/SpecialFilepath.php
index e0866504..bbcced26 100644
--- a/includes/specials/SpecialFilepath.php
+++ b/includes/specials/SpecialFilepath.php
@@ -47,7 +47,7 @@ class SpecialFilepath extends SpecialPage {
$file = wfFindFile( $title );
if ( $file && $file->exists() ) {
- // Default behaviour: Use the direct link to the file.
+ // Default behavior: Use the direct link to the file.
$url = $file->getURL();
$width = $request->getInt( 'width', -1 );
$height = $request->getInt( 'height', -1 );
@@ -86,4 +86,8 @@ class SpecialFilepath extends SpecialPage {
Html::closeElement( 'form' )
);
}
+
+ protected function getGroupName() {
+ return 'media';
+ }
}
diff --git a/includes/specials/SpecialImport.php b/includes/specials/SpecialImport.php
index 362fc5cf..aa56041b 100644
--- a/includes/specials/SpecialImport.php
+++ b/includes/specials/SpecialImport.php
@@ -101,7 +101,7 @@ class SpecialImport extends SpecialPage {
$this->logcomment = $request->getText( 'log-comment' );
$this->pageLinkDepth = $wgExportMaxLinkDepth == 0 ? 0 : $request->getIntOrNull( 'pagelink-depth' );
- $this->rootpage = $request->getText( 'rootpage' );
+ $this->rootpage = $request->getText( 'rootpage' );
$user = $this->getUser();
if ( !$user->matchEditToken( $request->getVal( 'editToken' ) ) ) {
@@ -114,7 +114,7 @@ class SpecialImport extends SpecialPage {
throw new PermissionsError( 'importupload' );
}
} elseif ( $sourceName == "interwiki" ) {
- if( !$user->isAllowed( 'import' ) ){
+ if( !$user->isAllowed( 'import' ) ) {
throw new PermissionsError( 'import' );
}
$this->interwiki = $request->getVal( 'interwiki' );
@@ -153,7 +153,7 @@ class SpecialImport extends SpecialPage {
$out->addWikiMsg( "importstart" );
- $reporter = new ImportReporter( $importer, $isUpload, $this->interwiki , $this->logcomment);
+ $reporter = new ImportReporter( $importer, $isUpload, $this->interwiki, $this->logcomment );
$reporter->setContext( $this->getContext() );
$exception = false;
@@ -194,14 +194,14 @@ class SpecialImport extends SpecialPage {
$this->msg( 'importtext' )->parseAsBlock() .
Html::hidden( 'action', 'submit' ) .
Html::hidden( 'source', 'upload' ) .
- Xml::openElement( 'table', array( 'id' => 'mw-import-table' ) ) .
+ Xml::openElement( 'table', array( 'id' => 'mw-import-table-upload' ) ) .
"<tr>
<td class='mw-label'>" .
Xml::label( $this->msg( 'import-upload-filename' )->text(), 'xmlimport' ) .
"</td>
<td class='mw-input'>" .
- Xml::input( 'xmlimport', 50, '', array( 'type' => 'file' ) ) . ' ' .
+ Html::input( 'xmlimport', '', 'file', array( 'id' => 'xmlimport' ) ) . ' ' .
"</td>
</tr>
<tr>
@@ -215,11 +215,11 @@ class SpecialImport extends SpecialPage {
</tr>
<tr>
<td class='mw-label'>" .
- Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage' ) .
+ Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-upload' ) .
"</td>
<td class='mw-input'>" .
Xml::input( 'rootpage', 50, $this->rootpage,
- array( 'id' => 'mw-interwiki-rootpage', 'type' => 'text' ) ) . ' ' .
+ array( 'id' => 'mw-interwiki-rootpage-upload', 'type' => 'text' ) ) . ' ' .
"</td>
</tr>
<tr>
@@ -260,13 +260,13 @@ class SpecialImport extends SpecialPage {
Html::hidden( 'action', 'submit' ) .
Html::hidden( 'source', 'interwiki' ) .
Html::hidden( 'editToken', $user->getEditToken() ) .
- Xml::openElement( 'table', array( 'id' => 'mw-import-table' ) ) .
+ Xml::openElement( 'table', array( 'id' => 'mw-import-table-interwiki' ) ) .
"<tr>
<td class='mw-label'>" .
Xml::label( $this->msg( 'import-interwiki-source' )->text(), 'interwiki' ) .
"</td>
<td class='mw-input'>" .
- Xml::openElement( 'select', array( 'name' => 'interwiki' ) )
+ Xml::openElement( 'select', array( 'name' => 'interwiki', 'id' => 'interwiki' ) )
);
foreach( $wgImportSources as $prefix ) {
$selected = ( $this->interwiki === $prefix ) ? ' selected="selected"' : '';
@@ -275,7 +275,7 @@ class SpecialImport extends SpecialPage {
$out->addHTML(
Xml::closeElement( 'select' ) .
- Xml::input( 'frompage', 50, $this->frompage ) .
+ Xml::input( 'frompage', 50, $this->frompage, array( 'id' => 'frompage' ) ) .
"</td>
</tr>
<tr>
@@ -321,11 +321,11 @@ class SpecialImport extends SpecialPage {
</tr>
<tr>
<td class='mw-label'>" .
- Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage' ) .
+ Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-interwiki' ) .
"</td>
<td class='mw-input'>" .
Xml::input( 'rootpage', 50, $this->rootpage,
- array( 'id' => 'mw-interwiki-rootpage', 'type' => 'text' ) ) . ' ' .
+ array( 'id' => 'mw-interwiki-rootpage-interwiki', 'type' => 'text' ) ) . ' ' .
"</td>
</tr>
<tr>
@@ -341,6 +341,10 @@ class SpecialImport extends SpecialPage {
);
}
}
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
/**
@@ -353,7 +357,7 @@ class ImportReporter extends ContextSource {
private $mOriginalPageOutCallback = null;
private $mLogItemCount = 0;
- function __construct( $importer, $upload, $interwiki , $reason=false ) {
+ function __construct( $importer, $upload, $interwiki, $reason = false ) {
$this->mOriginalPageOutCallback =
$importer->setPageOutCallback( array( $this, 'reportPage' ) );
$this->mOriginalLogCallback =
@@ -410,7 +414,7 @@ class ImportReporter extends ContextSource {
$detail = $this->msg( 'import-logentry-upload-detail' )->numParams(
$successCount )->inContentLanguage()->text();
if ( $this->reason ) {
- $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
+ $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
}
$log->addEntry( 'upload', $title, $detail );
} else {
@@ -419,7 +423,7 @@ class ImportReporter extends ContextSource {
$detail = $this->msg( 'import-logentry-interwiki-detail' )->numParams(
$successCount )->params( $interwiki )->inContentLanguage()->text();
if ( $this->reason ) {
- $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
+ $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
}
$log->addEntry( 'interwiki', $title, $detail );
}
@@ -428,7 +432,7 @@ class ImportReporter extends ContextSource {
$dbw = wfGetDB( DB_MASTER );
$latest = $title->getLatestRevID();
$nullRevision = Revision::newNullRevision( $dbw, $title->getArticleID(), $comment, true );
- if (!is_null($nullRevision)) {
+ if ( !is_null( $nullRevision ) ) {
$nullRevision->insertOn( $dbw );
$page = WikiPage::factory( $title );
# Update page record
diff --git a/includes/specials/SpecialJavaScriptTest.php b/includes/specials/SpecialJavaScriptTest.php
index c217eccb..d204d50c 100644
--- a/includes/specials/SpecialJavaScriptTest.php
+++ b/includes/specials/SpecialJavaScriptTest.php
@@ -40,19 +40,11 @@ class SpecialJavaScriptTest extends SpecialPage {
}
public function execute( $par ) {
- global $wgEnableJavaScriptTest;
-
$out = $this->getOutput();
$this->setHeaders();
$out->disallowUserJs();
- // Abort early if we're disabled
- if ( $wgEnableJavaScriptTest !== true ) {
- $out->addWikiMsg( 'javascripttest-disabled' );
- return;
- }
-
$out->addModules( 'mediawiki.special.javaScriptTest' );
// Determine framework
@@ -110,8 +102,9 @@ class SpecialJavaScriptTest extends SpecialPage {
* Function to wrap the summary.
* It must be given a valid state as a second parameter or an exception will
* be thrown.
- * @param $html String: The raw HTML.
- * @param $state String: State, one of 'noframework', 'unknownframework' or 'frameworkfound'
+ * @param string $html The raw HTML.
+ * @param string $state State, one of 'noframework', 'unknownframework' or 'frameworkfound'
+ * @throws MWException
* @return string
*/
private function wrapSummaryHtml( $html, $state ) {
@@ -165,9 +158,7 @@ HTML;
$out->addJsConfigVars( 'QUnitTestSwarmInjectJSPath', $wgJavaScriptTestConfig['qunit']['testswarm-injectjs'] );
}
- public function isListed(){
- global $wgEnableJavaScriptTest;
- return $wgEnableJavaScriptTest === true;
+ protected function getGroupName() {
+ return 'other';
}
-
}
diff --git a/includes/specials/SpecialLinkSearch.php b/includes/specials/SpecialLinkSearch.php
index 0810ee77..030416fb 100644
--- a/includes/specials/SpecialLinkSearch.php
+++ b/includes/specials/SpecialLinkSearch.php
@@ -22,7 +22,6 @@
* @author Brion Vibber
*/
-
/**
* Special:LinkSearch to search the external-links table.
* @ingroup SpecialPage
@@ -43,7 +42,7 @@ class LinkSearchPage extends QueryPage {
}
function execute( $par ) {
- global $wgUrlProtocols, $wgMiserMode;
+ global $wgUrlProtocols, $wgMiserMode, $wgScript;
$this->setHeaders();
$this->outputHeader();
@@ -64,15 +63,15 @@ class LinkSearchPage extends QueryPage {
$target2 = $target;
$protocol = '';
- $pr_sl = strpos($target2, '//' );
- $pr_cl = strpos($target2, ':' );
+ $pr_sl = strpos( $target2, '//' );
+ $pr_cl = strpos( $target2, ':' );
if ( $pr_sl ) {
// For protocols with '//'
- $protocol = substr( $target2, 0 , $pr_sl+2 );
- $target2 = substr( $target2, $pr_sl+2 );
+ $protocol = substr( $target2, 0, $pr_sl + 2 );
+ $target2 = substr( $target2, $pr_sl + 2 );
} elseif ( !$pr_sl && $pr_cl ) {
// For protocols without '//' like 'mailto:'
- $protocol = substr( $target2, 0 , $pr_cl+1 );
+ $protocol = substr( $target2, 0, $pr_cl + 1 );
$target2 = substr( $target2, $pr_cl+1 );
} elseif ( $protocol == '' && $target2 != '' ) {
// default
@@ -84,12 +83,16 @@ class LinkSearchPage extends QueryPage {
$protocol = '';
}
- $out->addWikiMsg( 'linksearch-text', '<nowiki>' . $this->getLanguage()->commaList( $protocols_list ) . '</nowiki>' );
- $s = Xml::openElement( 'form', array( 'id' => 'mw-linksearch-form', 'method' => 'get', 'action' => $GLOBALS['wgScript'] ) ) .
- Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) .
- '<fieldset>' .
- Xml::element( 'legend', array(), $this->msg( 'linksearch' )->text() ) .
- Xml::inputLabel( $this->msg( 'linksearch-pat' )->text(), 'target', 'target', 50, $target ) . ' ';
+ $out->addWikiMsg(
+ 'linksearch-text',
+ '<nowiki>' . $this->getLanguage()->commaList( $protocols_list ) . '</nowiki>',
+ count( $protocols_list )
+ );
+ $s = Html::openElement( 'form', array( 'id' => 'mw-linksearch-form', 'method' => 'get', 'action' => $wgScript ) ) . "\n" .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
+ Html::openElement( 'fieldset' ) . "\n" .
+ Html::element( 'legend', array(), $this->msg( 'linksearch' )->text() ) . "\n" .
+ Xml::inputLabel( $this->msg( 'linksearch-pat' )->text(), 'target', 'target', 50, $target ) . "\n";
if ( !$wgMiserMode ) {
$s .= Html::namespaceSelector(
array(
@@ -103,9 +106,9 @@ class LinkSearchPage extends QueryPage {
)
);
}
- $s .= Xml::submitButton( $this->msg( 'linksearch-ok' )->text() ) .
- '</fieldset>' .
- Xml::closeElement( 'form' );
+ $s .= Xml::submitButton( $this->msg( 'linksearch-ok' )->text() ) . "\n" .
+ Html::closeElement( 'fieldset' ) . "\n" .
+ Html::closeElement( 'form' ) . "\n";
$out->addHTML( $s );
if( $target != '' ) {
@@ -134,10 +137,10 @@ class LinkSearchPage extends QueryPage {
*/
static function mungeQuery( $query, $prot ) {
$field = 'el_index';
- $rv = LinkFilter::makeLikeArray( $query , $prot );
+ $rv = LinkFilter::makeLikeArray( $query, $prot );
if ( $rv === false ) {
// LinkFilter doesn't handle wildcard in IP, so we'll have to munge here.
- if (preg_match('/^(:?[0-9]{1,3}\.)+\*\s*$|^(:?[0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]*\*\s*$/', $query)) {
+ if ( preg_match( '/^(:?[0-9]{1,3}\.)+\*\s*$|^(:?[0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]*\*\s*$/', $query ) ) {
$dbr = wfGetDB( DB_SLAVE );
$rv = array( $prot . rtrim( $query, " \t*" ), $dbr->anyString() );
$field = 'el_to';
@@ -197,7 +200,7 @@ class LinkSearchPage extends QueryPage {
* Override to check query validity.
*/
function doQuery( $offset = false, $limit = false ) {
- list( $this->mMungedQuery, ) = LinkSearchPage::mungeQuery( $this->mQuery, $this->mProt );
+ list( $this->mMungedQuery, ) = LinkSearchPage::mungeQuery( $this->mQuery, $this->mProt );
if( $this->mMungedQuery === false ) {
$this->getOutput()->addWikiMsg( 'linksearch-error' );
} else {
@@ -218,4 +221,8 @@ class LinkSearchPage extends QueryPage {
function getOrderFields() {
return array();
}
+
+ protected function getGroupName() {
+ return 'redirects';
+ }
}
diff --git a/includes/specials/SpecialListfiles.php b/includes/specials/SpecialListfiles.php
index cc055221..c864ae2a 100644
--- a/includes/specials/SpecialListfiles.php
+++ b/includes/specials/SpecialListfiles.php
@@ -23,11 +23,11 @@
class SpecialListFiles extends IncludableSpecialPage {
- public function __construct(){
+ public function __construct() {
parent::__construct( 'Listfiles' );
}
- public function execute( $par ){
+ public function execute( $par ) {
$this->setHeaders();
$this->outputHeader();
@@ -51,6 +51,10 @@ class SpecialListFiles extends IncludableSpecialPage {
}
$this->getOutput()->addHTML( $html );
}
+
+ protected function getGroupName() {
+ return 'media';
+ }
}
/**
@@ -137,7 +141,7 @@ class ImageListPager extends TablePager {
$tables = array( 'image' );
$fields = array_keys( $this->getFieldNames() );
$fields[] = 'img_user';
- $fields[array_search('thumb', $fields)] = 'img_name AS thumb';
+ $fields[array_search( 'thumb', $fields )] = 'img_name AS thumb';
$options = $join_conds = array();
# Depends on $wgMiserMode
@@ -223,7 +227,7 @@ class ImageListPager extends TablePager {
case 'img_size':
return htmlspecialchars( $this->getLanguage()->formatSize( $value ) );
case 'img_description':
- return Linker::commentBlock( $value );
+ return Linker::formatComment( $value );
case 'count':
return intval( $value ) + 1;
}
diff --git a/includes/specials/SpecialListgrouprights.php b/includes/specials/SpecialListgrouprights.php
index 1f95c225..7cccf887 100644
--- a/includes/specials/SpecialListgrouprights.php
+++ b/includes/specials/SpecialListgrouprights.php
@@ -139,15 +139,15 @@ class SpecialListGroupRights extends SpecialPage {
/**
* Create a user-readable list of permissions from the given array.
*
- * @param $permissions Array of permission => bool (from $wgGroupPermissions items)
- * @param $revoke Array of permission => bool (from $wgRevokePermissions items)
- * @param $add Array of groups this group is allowed to add or true
- * @param $remove Array of groups this group is allowed to remove or true
- * @param $addSelf Array of groups this group is allowed to add to self or true
- * @param $removeSelf Array of group this group is allowed to remove from self or true
+ * @param array $permissions of permission => bool (from $wgGroupPermissions items)
+ * @param array $revoke of permission => bool (from $wgRevokePermissions items)
+ * @param array $add of groups this group is allowed to add or true
+ * @param array $remove of groups this group is allowed to remove or true
+ * @param array $addSelf of groups this group is allowed to add to self or true
+ * @param array $removeSelf of group this group is allowed to remove from self or true
* @return string List of all granted permissions, separated by comma separator
*/
- private function formatPermissions( $permissions, $revoke, $add, $remove, $addSelf, $removeSelf ) {
+ private function formatPermissions( $permissions, $revoke, $add, $remove, $addSelf, $removeSelf ) {
$r = array();
foreach( $permissions as $permission => $granted ) {
//show as granted only if it isn't revoked to prevent duplicate display of permissions
@@ -170,7 +170,7 @@ class SpecialListGroupRights extends SpecialPage {
}
sort( $r );
$lang = $this->getLanguage();
- if( $add === true ){
+ if( $add === true ) {
$r[] = $this->msg( 'listgrouprights-addgroup-all' )->escaped();
} elseif( is_array( $add ) && count( $add ) ) {
$add = array_values( array_unique( $add ) );
@@ -179,7 +179,7 @@ class SpecialListGroupRights extends SpecialPage {
count( $add )
)->parse();
}
- if( $remove === true ){
+ if( $remove === true ) {
$r[] = $this->msg( 'listgrouprights-removegroup-all' )->escaped();
} elseif( is_array( $remove ) && count( $remove ) ) {
$remove = array_values( array_unique( $remove ) );
@@ -188,7 +188,7 @@ class SpecialListGroupRights extends SpecialPage {
count( $remove )
)->parse();
}
- if( $addSelf === true ){
+ if( $addSelf === true ) {
$r[] = $this->msg( 'listgrouprights-addgroup-self-all' )->escaped();
} elseif( is_array( $addSelf ) && count( $addSelf ) ) {
$addSelf = array_values( array_unique( $addSelf ) );
@@ -197,7 +197,7 @@ class SpecialListGroupRights extends SpecialPage {
count( $addSelf )
)->parse();
}
- if( $removeSelf === true ){
+ if( $removeSelf === true ) {
$r[] = $this->msg( 'listgrouprights-removegroup-self-all' )->parse();
} elseif( is_array( $removeSelf ) && count( $removeSelf ) ) {
$removeSelf = array_values( array_unique( $removeSelf ) );
@@ -212,4 +212,8 @@ class SpecialListGroupRights extends SpecialPage {
return '<ul><li>' . implode( "</li>\n<li>", $r ) . '</li></ul>';
}
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
diff --git a/includes/specials/SpecialListredirects.php b/includes/specials/SpecialListredirects.php
index fe338a08..0283767a 100644
--- a/includes/specials/SpecialListredirects.php
+++ b/includes/specials/SpecialListredirects.php
@@ -34,9 +34,17 @@ class ListredirectsPage extends QueryPage {
parent::__construct( $name );
}
- function isExpensive() { return true; }
- function isSyndicated() { return false; }
- function sortDescending() { return false; }
+ function isExpensive() {
+ return true;
+ }
+
+ function isSyndicated() {
+ return false;
+ }
+
+ function sortDescending() {
+ return false;
+ }
function getQueryInfo() {
return array(
@@ -77,7 +85,7 @@ class ListredirectsPage extends QueryPage {
$batch->execute();
// Back to start for display
- if ( $db->numRows( $res ) > 0 ) {
+ if ( $res->numRows() > 0 ) {
// If there are no rows we get an error seeking.
$db->dataSeek( $res, 0 );
}
@@ -118,4 +126,8 @@ class ListredirectsPage extends QueryPage {
return "<del>$rd_link</del>";
}
}
+
+ protected function getGroupName() {
+ return 'pages';
+ }
}
diff --git a/includes/specials/SpecialListusers.php b/includes/specials/SpecialListusers.php
index 1089fbbe..d253a4d3 100644
--- a/includes/specials/SpecialListusers.php
+++ b/includes/specials/SpecialListusers.php
@@ -36,7 +36,9 @@ class UsersPager extends AlphabeticPager {
/**
* @param $context IContextSource
- * @param $par null|array
+ * @param array $par (Default null)
+ * @param $including boolean Whether this page is being transcluded in
+ * another page
*/
function __construct( IContextSource $context = null, $par = null, $including = null ) {
if ( $context ) {
@@ -89,7 +91,7 @@ class UsersPager extends AlphabeticPager {
$conds = array();
// Don't show hidden names
if( !$this->getUser()->isAllowed( 'hideuser' ) ) {
- $conds[] = 'ipb_deleted IS NULL';
+ $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0';
}
$options = array();
@@ -114,7 +116,7 @@ class UsersPager extends AlphabeticPager {
$options['GROUP BY'] = $this->creationSort ? 'user_id' : 'user_name';
$query = array(
- 'tables' => array( 'user', 'user_groups', 'ipblocks'),
+ 'tables' => array( 'user', 'user_groups', 'ipblocks' ),
'fields' => array(
'user_name' => $this->creationSort ? 'MAX(user_name)' : 'user_name',
'user_id' => $this->creationSort ? 'user_id' : 'MAX(user_id)',
@@ -129,7 +131,6 @@ class UsersPager extends AlphabeticPager {
'user_groups' => array( 'LEFT JOIN', 'user_id=ug_user' ),
'ipblocks' => array( 'LEFT JOIN', array(
'user_id=ipb_user',
- 'ipb_deleted' => 1,
'ipb_auto' => 0
)),
),
@@ -152,7 +153,7 @@ class UsersPager extends AlphabeticPager {
$userName = $row->user_name;
$ulinks = Linker::userLink( $row->user_id, $userName );
- $ulinks .= Linker::userToolLinks( $row->user_id, $userName );
+ $ulinks .= Linker::userToolLinksRedContribs( $row->user_id, $userName, intval( $row->edits ) );
$lang = $this->getLanguage();
@@ -185,9 +186,10 @@ class UsersPager extends AlphabeticPager {
$created = $this->msg( 'usercreated', $d, $t, $row->user_name )->escaped();
$created = ' ' . $this->msg( 'parentheses' )->rawParams( $created )->escaped();
}
+ $blocked = !is_null( $row->ipb_deleted ) ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
wfRunHooks( 'SpecialListusersFormatRow', array( &$item, $row ) );
- return Html::rawElement( 'li', array(), "{$item}{$edits}{$created}" );
+ return Html::rawElement( 'li', array(), "{$item}{$edits}{$created}{$blocked}" );
}
function doBatchLookups() {
@@ -204,23 +206,32 @@ class UsersPager extends AlphabeticPager {
/**
* @return string
*/
- function getPageHeader( ) {
+ function getPageHeader() {
global $wgScript;
list( $self ) = explode( '/', $this->getTitle()->getPrefixedDBkey() );
# Form tag
- $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listusers-form' ) ) .
+ $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listusers-form' ) ) .
Xml::fieldset( $this->msg( 'listusers' )->text() ) .
Html::hidden( 'title', $self );
# Username field
$out .= Xml::label( $this->msg( 'listusersfrom' )->text(), 'offset' ) . ' ' .
- Xml::input( 'username', 20, $this->requestedUser, array( 'id' => 'offset' ) ) . ' ';
+ Html::input(
+ 'username',
+ $this->requestedUser,
+ 'text',
+ array(
+ 'id' => 'offset',
+ 'size' => 20,
+ 'autofocus' => $this->requestedUser === ''
+ )
+ ) . ' ';
# Group drop-down list
$out .= Xml::label( $this->msg( 'group' )->text(), 'group' ) . ' ' .
- Xml::openElement('select', array( 'name' => 'group', 'id' => 'group' ) ) .
+ Xml::openElement( 'select', array( 'name' => 'group', 'id' => 'group' ) ) .
Xml::option( $this->msg( 'group-all' )->text(), '' );
foreach( $this->getAllGroups() as $group => $groupText )
$out .= Xml::option( $groupText, $group, $group == $this->requestedGroup );
@@ -286,8 +297,8 @@ class UsersPager extends AlphabeticPager {
/**
* Format a link to a group description page
*
- * @param $group String: group name
- * @param $username String Username
+ * @param string $group group name
+ * @param string $username Username
* @return string
*/
protected static function buildGroupLink( $group, $username ) {
@@ -298,20 +309,19 @@ class UsersPager extends AlphabeticPager {
/**
* @ingroup SpecialPage
*/
-class SpecialListUsers extends SpecialPage {
+class SpecialListUsers extends IncludableSpecialPage {
/**
* Constructor
*/
public function __construct() {
parent::__construct( 'Listusers' );
- $this->mIncludable = true;
}
/**
* Show the special page
*
- * @param $par string (optional) A group to list users from
+ * @param string $par (optional) A group to list users from
*/
public function execute( $par ) {
$this->setHeaders();
@@ -337,4 +347,8 @@ class SpecialListUsers extends SpecialPage {
$this->getOutput()->addHTML( $s );
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
diff --git a/includes/specials/SpecialLockdb.php b/includes/specials/SpecialLockdb.php
index d71ac6e1..95ef9510 100644
--- a/includes/specials/SpecialLockdb.php
+++ b/includes/specials/SpecialLockdb.php
@@ -102,4 +102,8 @@ class SpecialLockdb extends FormSpecialPage {
$out->addSubtitle( $this->msg( 'lockdbsuccesssub' ) );
$out->addWikiMsg( 'lockdbsuccesstext' );
}
+
+ protected function getGroupName() {
+ return 'wiki';
+ }
}
diff --git a/includes/specials/SpecialLog.php b/includes/specials/SpecialLog.php
index 7800e566..4fc0f6e8 100644
--- a/includes/specials/SpecialLog.php
+++ b/includes/specials/SpecialLog.php
@@ -182,7 +182,6 @@ class SpecialLog extends SpecialPage {
return $s;
}
-
/**
* Set page title and show header for this log type
* @param $type string
@@ -194,4 +193,7 @@ class SpecialLog extends SpecialPage {
$this->getOutput()->addHTML( $page->getDescription()->parseAsBlock() );
}
+ protected function getGroupName() {
+ return 'changes';
+ }
}
diff --git a/includes/specials/SpecialLonelypages.php b/includes/specials/SpecialLonelypages.php
index 763bbdb1..8c6a88ac 100644
--- a/includes/specials/SpecialLonelypages.php
+++ b/includes/specials/SpecialLonelypages.php
@@ -44,7 +44,10 @@ class LonelyPagesPage extends PageQueryPage {
function isExpensive() {
return true;
}
- function isSyndicated() { return false; }
+
+ function isSyndicated() {
+ return false;
+ }
function getQueryInfo() {
return array (
@@ -78,4 +81,8 @@ class LonelyPagesPage extends PageQueryPage {
return array( 'page_title' );
}
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialLongpages.php b/includes/specials/SpecialLongpages.php
index dd60e37d..c045f9e9 100644
--- a/includes/specials/SpecialLongpages.php
+++ b/includes/specials/SpecialLongpages.php
@@ -34,4 +34,8 @@ class LongPagesPage extends ShortPagesPage {
function sortDescending() {
return true;
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialMIMEsearch.php b/includes/specials/SpecialMIMEsearch.php
index 104c653f..c5a109d4 100644
--- a/includes/specials/SpecialMIMEsearch.php
+++ b/includes/specials/SpecialMIMEsearch.php
@@ -34,9 +34,17 @@ class MIMEsearchPage extends QueryPage {
parent::__construct( $name );
}
- function isExpensive() { return true; }
- function isSyndicated() { return false; }
- function isCacheable() { return false; }
+ function isExpensive() {
+ return true;
+ }
+
+ function isSyndicated() {
+ return false;
+ }
+
+ function isCacheable() {
+ return false;
+ }
function linkParameters() {
return array( 'mime' => "{$this->major}/{$this->minor}" );
@@ -84,7 +92,6 @@ class MIMEsearchPage extends QueryPage {
parent::execute( $par );
}
-
function formatResult( $skin, $result ) {
global $wgContLang;
@@ -126,4 +133,8 @@ class MIMEsearchPage extends QueryPage {
);
return in_array( $type, $types );
}
+
+ protected function getGroupName() {
+ return 'media';
+ }
}
diff --git a/includes/specials/SpecialMergeHistory.php b/includes/specials/SpecialMergeHistory.php
index 1f057499..1476e156 100644
--- a/includes/specials/SpecialMergeHistory.php
+++ b/includes/specials/SpecialMergeHistory.php
@@ -141,7 +141,7 @@ class SpecialMergeHistory extends SpecialPage {
'<fieldset>' .
Xml::element( 'legend', array(),
$this->msg( 'mergehistory-box' )->text() ) .
- Html::hidden( 'title', $this->getTitle()->getPrefixedDbKey() ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
Html::hidden( 'submitted', '1' ) .
Html::hidden( 'mergepoint', $this->mTimestamp ) .
Xml::openElement( 'table' ) .
@@ -373,26 +373,33 @@ class SpecialMergeHistory extends SpecialPage {
$destTitle->getPrefixedText()
)->inContentLanguage()->text();
}
- $mwRedir = MagicWord::get( 'redirect' );
- $redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $destTitle->getPrefixedText() . "]]\n";
- $redirectPage = WikiPage::factory( $targetTitle );
- $redirectRevision = new Revision( array(
- 'page' => $this->mTargetID,
- 'comment' => $comment,
- 'text' => $redirectText ) );
- $redirectRevision->insertOn( $dbw );
- $redirectPage->updateRevisionOn( $dbw, $redirectRevision );
-
- # Now, we record the link from the redirect to the new title.
- # It should have no other outgoing links...
- $dbw->delete( 'pagelinks', array( 'pl_from' => $this->mDestID ), __METHOD__ );
- $dbw->insert( 'pagelinks',
- array(
- 'pl_from' => $this->mDestID,
- 'pl_namespace' => $destTitle->getNamespace(),
- 'pl_title' => $destTitle->getDBkey() ),
- __METHOD__
- );
+
+ $contentHandler = ContentHandler::getForTitle( $targetTitle );
+ $redirectContent = $contentHandler->makeRedirectContent( $destTitle );
+
+ if ( $redirectContent ) {
+ $redirectPage = WikiPage::factory( $targetTitle );
+ $redirectRevision = new Revision( array(
+ 'title' => $targetTitle,
+ 'page' => $this->mTargetID,
+ 'comment' => $comment,
+ 'content' => $redirectContent ) );
+ $redirectRevision->insertOn( $dbw );
+ $redirectPage->updateRevisionOn( $dbw, $redirectRevision );
+
+ # Now, we record the link from the redirect to the new title.
+ # It should have no other outgoing links...
+ $dbw->delete( 'pagelinks', array( 'pl_from' => $this->mDestID ), __METHOD__ );
+ $dbw->insert( 'pagelinks',
+ array(
+ 'pl_from' => $this->mDestID,
+ 'pl_namespace' => $destTitle->getNamespace(),
+ 'pl_title' => $destTitle->getDBkey() ),
+ __METHOD__
+ );
+ } else {
+ // would be nice to show a warning if we couldn't create a redirect
+ }
} else {
$targetTitle->invalidateCache(); // update histories
}
@@ -416,6 +423,10 @@ class SpecialMergeHistory extends SpecialPage {
return true;
}
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
class MergeHistoryPager extends ReverseChronologicalPager {
diff --git a/includes/specials/SpecialMostcategories.php b/includes/specials/SpecialMostcategories.php
index 3f0bafa3..11f26bd7 100644
--- a/includes/specials/SpecialMostcategories.php
+++ b/includes/specials/SpecialMostcategories.php
@@ -35,8 +35,13 @@ class MostcategoriesPage extends QueryPage {
parent::__construct( $name );
}
- function isExpensive() { return true; }
- function isSyndicated() { return false; }
+ function isExpensive() {
+ return true;
+ }
+
+ function isSyndicated() {
+ return false;
+ }
function getQueryInfo() {
return array (
@@ -94,4 +99,8 @@ class MostcategoriesPage extends QueryPage {
return $this->getLanguage()->specialList( $link, $count );
}
+
+ protected function getGroupName() {
+ return 'highuse';
+ }
}
diff --git a/includes/specials/SpecialMostimages.php b/includes/specials/SpecialMostimages.php
index 3d797908..78b2d911 100644
--- a/includes/specials/SpecialMostimages.php
+++ b/includes/specials/SpecialMostimages.php
@@ -35,8 +35,13 @@ class MostimagesPage extends ImageQueryPage {
parent::__construct( $name );
}
- function isExpensive() { return true; }
- function isSyndicated() { return false; }
+ function isExpensive() {
+ return true;
+ }
+
+ function isSyndicated() {
+ return false;
+ }
function getQueryInfo() {
return array (
@@ -53,4 +58,7 @@ class MostimagesPage extends ImageQueryPage {
return $this->msg( 'nimagelinks' )->numParams( $row->value )->escaped() . '<br />';
}
+ protected function getGroupName() {
+ return 'highuse';
+ }
}
diff --git a/includes/specials/SpecialMostinterwikis.php b/includes/specials/SpecialMostinterwikis.php
index 894d697b..574a9afb 100644
--- a/includes/specials/SpecialMostinterwikis.php
+++ b/includes/specials/SpecialMostinterwikis.php
@@ -35,8 +35,13 @@ class MostinterwikisPage extends QueryPage {
parent::__construct( $name );
}
- function isExpensive() { return true; }
- function isSyndicated() { return false; }
+ function isExpensive() {
+ return true;
+ }
+
+ function isSyndicated() {
+ return false;
+ }
function getQueryInfo() {
return array (
@@ -109,4 +114,8 @@ class MostinterwikisPage extends QueryPage {
return $this->getLanguage()->specialList( $link, $count );
}
+
+ protected function getGroupName() {
+ return 'highuse';
+ }
}
diff --git a/includes/specials/SpecialMostlinked.php b/includes/specials/SpecialMostlinked.php
index 89c43509..4b6e5670 100644
--- a/includes/specials/SpecialMostlinked.php
+++ b/includes/specials/SpecialMostlinked.php
@@ -36,8 +36,13 @@ class MostlinkedPage extends QueryPage {
parent::__construct( $name );
}
- function isExpensive() { return true; }
- function isSyndicated() { return false; }
+ function isExpensive() {
+ return true;
+ }
+
+ function isSyndicated() {
+ return false;
+ }
function getQueryInfo() {
return array (
@@ -76,7 +81,7 @@ class MostlinkedPage extends QueryPage {
* Make a link to "what links here" for the specified title
*
* @param $title Title being queried
- * @param $caption String: text to display on the link
+ * @param string $caption text to display on the link
* @return String
*/
function makeWlhLink( $title, $caption ) {
@@ -102,4 +107,8 @@ class MostlinkedPage extends QueryPage {
$this->msg( 'nlinks' )->numParams( $result->value )->escaped() );
return $this->getLanguage()->specialList( $link, $wlh );
}
+
+ protected function getGroupName() {
+ return 'highuse';
+ }
}
diff --git a/includes/specials/SpecialMostlinkedcategories.php b/includes/specials/SpecialMostlinkedcategories.php
index dadef8bf..a1bce45d 100644
--- a/includes/specials/SpecialMostlinkedcategories.php
+++ b/includes/specials/SpecialMostlinkedcategories.php
@@ -35,7 +35,9 @@ class MostlinkedCategoriesPage extends QueryPage {
parent::__construct( $name );
}
- function isSyndicated() { return false; }
+ function isSyndicated() {
+ return false;
+ }
function getQueryInfo() {
return array (
@@ -46,7 +48,9 @@ class MostlinkedCategoriesPage extends QueryPage {
);
}
- function sortDescending() { return true; }
+ function sortDescending() {
+ return true;
+ }
/**
* Fetch user page links and cache their existence
@@ -90,4 +94,8 @@ class MostlinkedCategoriesPage extends QueryPage {
$nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
return $this->getLanguage()->specialList( $plink, $nlinks );
}
+
+ protected function getGroupName() {
+ return 'highuse';
+ }
}
diff --git a/includes/specials/SpecialMostlinkedtemplates.php b/includes/specials/SpecialMostlinkedtemplates.php
index 22932e5c..506e6b22 100644
--- a/includes/specials/SpecialMostlinkedtemplates.php
+++ b/includes/specials/SpecialMostlinkedtemplates.php
@@ -124,5 +124,8 @@ class MostlinkedTemplatesPage extends QueryPage {
$label = $this->msg( 'ntransclusions' )->numParams( $result->value )->escaped();
return Linker::link( $wlh, $label );
}
-}
+ protected function getGroupName() {
+ return 'highuse';
+ }
+}
diff --git a/includes/specials/SpecialMostrevisions.php b/includes/specials/SpecialMostrevisions.php
index b0253316..ad6b788d 100644
--- a/includes/specials/SpecialMostrevisions.php
+++ b/includes/specials/SpecialMostrevisions.php
@@ -31,4 +31,8 @@ class MostrevisionsPage extends FewestrevisionsPage {
function sortDescending() {
return true;
}
+
+ protected function getGroupName() {
+ return 'highuse';
+ }
}
diff --git a/includes/specials/SpecialMovepage.php b/includes/specials/SpecialMovepage.php
index af3dbf3e..4adb0371 100644
--- a/includes/specials/SpecialMovepage.php
+++ b/includes/specials/SpecialMovepage.php
@@ -71,7 +71,6 @@ class MovePageForm extends UnlistedSpecialPage {
? Title::newFromText( $newTitleText_bc )
: Title::makeTitleSafe( $newTitleTextNs, $newTitleTextMain );
-
$user = $this->getUser();
# Check rights
@@ -104,7 +103,7 @@ class MovePageForm extends UnlistedSpecialPage {
/**
* Show the form
*
- * @param $err Array: error messages. Each item is an error message.
+ * @param array $err error messages. Each item is an error message.
* It may either be a string message name or array message name and
* parameters, like the second argument to OutputPage::wrapWikiMsg().
*/
@@ -152,7 +151,7 @@ class MovePageForm extends UnlistedSpecialPage {
</tr>";
$err = array();
} else {
- if ($this->oldTitle->getNamespace() == NS_USER && !$this->oldTitle->isSubpage() ) {
+ if ( $this->oldTitle->getNamespace() == NS_USER && !$this->oldTitle->isSubpage() ) {
$out->wrapWikiMsg( "<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>", 'moveuserpage-warning' );
}
$out->addWikiMsg( $wgFixDoubleRedirects ? 'movepagetext' :
@@ -189,7 +188,7 @@ class MovePageForm extends UnlistedSpecialPage {
array(
'rd_namespace' => $this->oldTitle->getNamespace(),
'rd_title' => $this->oldTitle->getDBkey(),
- ) , __METHOD__ );
+ ), __METHOD__ );
} else {
$hasRedirects = false;
}
@@ -254,12 +253,14 @@ class MovePageForm extends UnlistedSpecialPage {
}
}
+ $handler = ContentHandler::getForTitle( $this->oldTitle );
+
$out->addHTML(
- Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL( 'action=submit' ), 'id' => 'movepage' ) ) .
- Xml::openElement( 'fieldset' ) .
- Xml::element( 'legend', null, $this->msg( 'move-page-legend' )->text() ) .
- Xml::openElement( 'table', array( 'id' => 'mw-movepage-table' ) ) .
- "<tr>
+ Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL( 'action=submit' ), 'id' => 'movepage' ) ) .
+ Xml::openElement( 'fieldset' ) .
+ Xml::element( 'legend', null, $this->msg( 'move-page-legend' )->text() ) .
+ Xml::openElement( 'table', array( 'id' => 'mw-movepage-table' ) ) .
+ "<tr>
<td class='mw-label'>" .
$this->msg( 'movearticle' )->escaped() .
"</td>
@@ -309,7 +310,7 @@ class MovePageForm extends UnlistedSpecialPage {
);
}
- if ( $user->isAllowed( 'suppressredirect' ) ) {
+ if ( $user->isAllowed( 'suppressredirect' ) && $handler->supportsRedirects() ) {
$out->addHTML( "
<tr>
<td></td>
@@ -342,7 +343,7 @@ class MovePageForm extends UnlistedSpecialPage {
'wpMovesubpages',
# Don't check the box if we only have talk subpages to
# move and we aren't moving the talk page.
- $this->moveSubpages && ($this->oldTitle->hasSubpages() || $this->moveTalk),
+ $this->moveSubpages && ( $this->oldTitle->hasSubpages() || $this->moveTalk ),
array( 'id' => 'wpMovesubpages' )
) . '&#160;' .
Xml::tags( 'label', array( 'for' => 'wpMovesubpages' ),
@@ -357,7 +358,7 @@ class MovePageForm extends UnlistedSpecialPage {
);
}
- $watchChecked = $user->isLoggedIn() && ($this->watch || $user->getBoolOption( 'watchmoves' )
+ $watchChecked = $user->isLoggedIn() && ( $this->watch || $user->getBoolOption( 'watchmoves' )
|| $user->isWatched( $this->oldTitle ) );
# Don't allow watching if user is not logged in
if( $user->isLoggedIn() ) {
@@ -447,7 +448,11 @@ class MovePageForm extends UnlistedSpecialPage {
}
}
- if ( $user->isAllowed( 'suppressredirect' ) ) {
+ $handler = ContentHandler::getForTitle( $ot );
+
+ if ( !$handler->supportsRedirects() ) {
+ $createRedirect = false;
+ } elseif ( $user->isAllowed( 'suppressredirect' ) ) {
$createRedirect = $this->leaveRedirect;
} else {
$createRedirect = true;
@@ -464,8 +469,6 @@ class MovePageForm extends UnlistedSpecialPage {
DoubleRedirectJob::fixRedirects( 'move', $ot, $nt );
}
- wfRunHooks( 'SpecialMovepageAfterMove', array( &$this, &$ot, &$nt ) );
-
$out = $this->getOutput();
$out->setPageTitle( $this->msg( 'pagemovedsub' ) );
@@ -479,11 +482,23 @@ class MovePageForm extends UnlistedSpecialPage {
$oldText = $ot->getPrefixedText();
$newText = $nt->getPrefixedText();
- $msgName = $createRedirect ? 'movepage-moved-redirect' : 'movepage-moved-noredirect';
+ if ( $ot->exists() ) {
+ //NOTE: we assume that if the old title exists, it's because it was re-created as
+ // a redirect to the new title. This is not safe, but what we did before was
+ // even worse: we just determined whether a redirect should have been created,
+ // and reported that it was created if it should have, without any checks.
+ // Also note that isRedirect() is unreliable because of bug 37209.
+ $msgName = 'movepage-moved-redirect';
+ } else {
+ $msgName = 'movepage-moved-noredirect';
+ }
+
$out->addHTML( $this->msg( 'movepage-moved' )->rawParams( $oldLink,
$newLink )->params( $oldText, $newText )->parseAsBlock() );
$out->addWikiMsg( $msgName );
+ wfRunHooks( 'SpecialMovepageAfterMove', array( &$this, &$ot, &$nt ) );
+
# Now we move extra pages we've been asked to move: subpages and talk
# pages. First, if the old page or the new page is a talk page, we
# can't move any talk pages: cancel that.
@@ -521,10 +536,10 @@ class MovePageForm extends UnlistedSpecialPage {
);
$conds['page_namespace'] = array();
if( MWNamespace::hasSubpages( $nt->getNamespace() ) ) {
- $conds['page_namespace'] []= $ot->getNamespace();
+ $conds['page_namespace'][] = $ot->getNamespace();
}
if( $this->moveTalk && MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() ) ) {
- $conds['page_namespace'] []= $ot->getTalkPage()->getNamespace();
+ $conds['page_namespace'][] = $ot->getTalkPage()->getNamespace();
}
} elseif( $this->moveTalk ) {
$conds = array(
@@ -570,7 +585,7 @@ class MovePageForm extends UnlistedSpecialPage {
$newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
if( !$newSubpage ) {
$oldLink = Linker::linkKnown( $oldSubpage );
- $extraOutput []= $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink
+ $extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink
)->params( Title::makeName( $newNs, $newPageName ) )->escaped();
continue;
}
@@ -578,7 +593,7 @@ class MovePageForm extends UnlistedSpecialPage {
# This was copy-pasted from Renameuser, bleh.
if ( $newSubpage->exists() && !$oldSubpage->isValidMoveTarget( $newSubpage ) ) {
$link = Linker::linkKnown( $newSubpage );
- $extraOutput []= $this->msg( 'movepage-page-exists' )->rawParams( $link )->escaped();
+ $extraOutput[] = $this->msg( 'movepage-page-exists' )->rawParams( $link )->escaped();
} else {
$success = $oldSubpage->moveTo( $newSubpage, true, $this->reason, $createRedirect );
if( $success === true ) {
@@ -592,16 +607,16 @@ class MovePageForm extends UnlistedSpecialPage {
array( 'redirect' => 'no' )
);
$newLink = Linker::linkKnown( $newSubpage );
- $extraOutput []= $this->msg( 'movepage-page-moved' )->rawParams( $oldLink, $newLink )->escaped();
+ $extraOutput[] = $this->msg( 'movepage-page-moved' )->rawParams( $oldLink, $newLink )->escaped();
++$count;
if( $count >= $wgMaximumMovedPages ) {
- $extraOutput []= $this->msg( 'movepage-max-pages' )->numParams( $wgMaximumMovedPages )->escaped();
+ $extraOutput[] = $this->msg( 'movepage-max-pages' )->numParams( $wgMaximumMovedPages )->escaped();
break;
}
} else {
$oldLink = Linker::linkKnown( $oldSubpage );
$newLink = Linker::link( $newSubpage );
- $extraOutput []= $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink, $newLink )->escaped();
+ $extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink, $newLink )->escaped();
}
}
@@ -660,4 +675,8 @@ class MovePageForm extends UnlistedSpecialPage {
}
$out->addHTML( "</ul>\n" );
}
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
diff --git a/includes/specials/SpecialNewimages.php b/includes/specials/SpecialNewimages.php
index 350aac63..52cbc3aa 100644
--- a/includes/specials/SpecialNewimages.php
+++ b/includes/specials/SpecialNewimages.php
@@ -22,11 +22,11 @@
*/
class SpecialNewFiles extends IncludableSpecialPage {
- public function __construct(){
+ public function __construct() {
parent::__construct( 'Newimages' );
}
- public function execute( $par ){
+ public function execute( $par ) {
$this->setHeaders();
$this->outputHeader();
@@ -42,8 +42,11 @@ class SpecialNewFiles extends IncludableSpecialPage {
$this->getOutput()->addHTML( $pager->getNavigationBar() );
}
}
-}
+ protected function getGroupName() {
+ return 'changes';
+ }
+}
/**
* @ingroup SpecialPage Pager
@@ -57,7 +60,7 @@ class NewFilesPager extends ReverseChronologicalPager {
function __construct( IContextSource $context, $par = null ) {
$this->like = $context->getRequest()->getText( 'like' );
- $this->showbots = $context->getRequest()->getBool( 'showbots' , 0 );
+ $this->showbots = $context->getRequest()->getBool( 'showbots', 0 );
if ( is_numeric( $par ) ) {
$this->setLimit( $par );
}
@@ -85,10 +88,10 @@ class NewFilesPager extends ReverseChronologicalPager {
}
}
- if( !$wgMiserMode && $this->like !== null ){
+ if( !$wgMiserMode && $this->like !== null ) {
$dbr = wfGetDB( DB_SLAVE );
$likeObj = Title::newFromURL( $this->like );
- if( $likeObj instanceof Title ){
+ if( $likeObj instanceof Title ) {
$like = $dbr->buildLike( $dbr->anyString(), strtolower( $likeObj->getDBkey() ), $dbr->anyString() );
$conds[] = "LOWER(img_name) $like";
}
@@ -104,18 +107,18 @@ class NewFilesPager extends ReverseChronologicalPager {
return $query;
}
- function getIndexField(){
+ function getIndexField() {
return 'img_timestamp';
}
- function getStartBody(){
+ function getStartBody() {
if ( !$this->gallery ) {
$this->gallery = new ImageGallery();
}
return '';
}
- function getEndBody(){
+ function getEndBody() {
return $this->gallery->toHTML();
}
@@ -161,7 +164,7 @@ class NewFilesPager extends ReverseChronologicalPager {
),
);
- if( $wgMiserMode ){
+ if( $wgMiserMode ) {
unset( $fields['like'] );
}
diff --git a/includes/specials/SpecialNewpages.php b/includes/specials/SpecialNewpages.php
index 8e15d554..ebb3021d 100644
--- a/includes/specials/SpecialNewpages.php
+++ b/includes/specials/SpecialNewpages.php
@@ -53,12 +53,13 @@ class SpecialNewpages extends IncludableSpecialPage {
$opts->add( 'hidepatrolled', $this->getUser()->getBoolOption( 'newpageshidepatrolled' ) );
$opts->add( 'hidebots', false );
$opts->add( 'hideredirs', true );
- $opts->add( 'limit', (int)$this->getUser()->getOption( 'rclimit' ) );
+ $opts->add( 'limit', $this->getUser()->getIntOption( 'rclimit' ) );
$opts->add( 'offset', '' );
$opts->add( 'namespace', '0' );
$opts->add( 'username', '' );
$opts->add( 'feed', '' );
$opts->add( 'tagfilter', '' );
+ $opts->add( 'invert', false );
$this->customFilters = array();
wfRunHooks( 'SpecialNewPagesFilters', array( $this, &$this->customFilters ) );
@@ -105,7 +106,7 @@ class SpecialNewpages extends IncludableSpecialPage {
}
// PG offsets not just digits!
if ( preg_match( '/^offset=([^=]+)$/', $bit, $m ) ) {
- $this->opts->setValue( 'offset', intval( $m[1] ) );
+ $this->opts->setValue( 'offset', intval( $m[1] ) );
}
if ( preg_match( '/^username=(.*)$/', $bit, $m ) ) {
$this->opts->setValue( 'username', $m[1] );
@@ -113,7 +114,7 @@ class SpecialNewpages extends IncludableSpecialPage {
if ( preg_match( '/^namespace=(.*)$/', $bit, $m ) ) {
$ns = $this->getLanguage()->getNsIndex( $m[1] );
if( $ns !== false ) {
- $this->opts->setValue( 'namespace', $ns );
+ $this->opts->setValue( 'namespace', $ns );
}
}
}
@@ -140,12 +141,13 @@ class SpecialNewpages extends IncludableSpecialPage {
$feedType = $this->opts->getValue( 'feed' );
if( $feedType ) {
- return $this->feed( $feedType );
+ $this->feed( $feedType );
+ return;
}
$allValues = $this->opts->getAllValues();
unset( $allValues['feed'] );
- $out->setFeedAppendQuery( wfArrayToCGI( $allValues ) );
+ $out->setFeedAppendQuery( wfArrayToCgi( $allValues ) );
}
$pager = new NewPagesPager( $this, $this->opts );
@@ -164,8 +166,6 @@ class SpecialNewpages extends IncludableSpecialPage {
}
protected function filterLinks() {
- global $wgGroupPermissions;
-
// show/hide links
$showhide = array( $this->msg( 'show' )->escaped(), $this->msg( 'hide' )->escaped() );
@@ -181,8 +181,7 @@ class SpecialNewpages extends IncludableSpecialPage {
}
// Disable some if needed
- # @todo FIXME: Throws E_NOTICEs if not set; and doesn't obey hooks etc.
- if ( $wgGroupPermissions['*']['createpage'] !== true ) {
+ if ( !User::groupHasPermission( '*', 'createpage' ) ) {
unset( $filters['hideliu'] );
}
if ( !$this->getUser()->useNPPatrol() ) {
@@ -213,6 +212,7 @@ class SpecialNewpages extends IncludableSpecialPage {
$namespace = $this->opts->consumeValue( 'namespace' );
$username = $this->opts->consumeValue( 'username' );
$tagFilterVal = $this->opts->consumeValue( 'tagfilter' );
+ $nsinvert = $this->opts->consumeValue( 'invert' );
// Check username input validity
$ut = Title::makeTitleSafe( NS_USER, $username );
@@ -248,6 +248,13 @@ class SpecialNewpages extends IncludableSpecialPage {
'id' => 'namespace',
'class' => 'namespaceselector',
)
+ ) . '&#160;' .
+ Xml::checkLabel(
+ $this->msg( 'invert' )->text(),
+ 'invert',
+ 'nsinvert',
+ $nsinvert,
+ array( 'title' => $this->msg( 'tooltip-invert' )->text() )
) .
'</td>
</tr>' . ( $tagFilter ? (
@@ -298,11 +305,11 @@ class SpecialNewpages extends IncludableSpecialPage {
# Revision deletion works on revisions, so we should cast one
$row = array(
- 'comment' => $result->rc_comment,
- 'deleted' => $result->rc_deleted,
- 'user_text' => $result->rc_user_text,
- 'user' => $result->rc_user,
- );
+ 'comment' => $result->rc_comment,
+ 'deleted' => $result->rc_deleted,
+ 'user_text' => $result->rc_user_text,
+ 'user' => $result->rc_user,
+ );
$rev = new Revision( $row );
$rev->setTitle( $title );
@@ -328,12 +335,13 @@ class SpecialNewpages extends IncludableSpecialPage {
$query['rcid'] = $result->rc_id;
}
- $plink = Linker::linkKnown(
+ // Linker::linkKnown() uses 'known' and 'noclasses' options. This breaks the colouration for stubs.
+ $plink = Linker::link(
$title,
null,
array( 'class' => 'mw-newpages-pagename' ),
$query,
- array( 'known' ) // Set explicitly to avoid the default of 'known','noclasses'. This breaks the colouration for stubs
+ array( 'known' )
);
$histLink = Linker::linkKnown(
$title,
@@ -459,14 +467,19 @@ class SpecialNewpages extends IncludableSpecialPage {
protected function feedItemDesc( $row ) {
$revision = Revision::newFromId( $row->rev_id );
if( $revision ) {
+ //XXX: include content model/type in feed item?
return '<p>' . htmlspecialchars( $revision->getUserText() ) .
$this->msg( 'colon-separator' )->inContentLanguage()->escaped() .
htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) .
"</p>\n<hr />\n<div>" .
- nl2br( htmlspecialchars( $revision->getText() ) ) . "</div>";
+ nl2br( htmlspecialchars( $revision->getContent()->serialize() ) ) . "</div>";
}
return '';
}
+
+ protected function getGroupName() {
+ return 'changes';
+ }
}
/**
@@ -488,7 +501,7 @@ class NewPagesPager extends ReverseChronologicalPager {
}
function getQueryInfo() {
- global $wgEnableNewpagesUserFilter, $wgGroupPermissions;
+ global $wgEnableNewpagesUserFilter;
$conds = array();
$conds['rc_new'] = 1;
@@ -499,7 +512,11 @@ class NewPagesPager extends ReverseChronologicalPager {
$user = Title::makeTitleSafe( NS_USER, $username );
if( $namespace !== false ) {
- $conds['rc_namespace'] = $namespace;
+ if ( $this->opts->getValue( 'invert' ) ) {
+ $conds[] = 'rc_namespace != ' . $this->mDb->addQuotes( $namespace );
+ } else {
+ $conds['rc_namespace'] = $namespace;
+ }
$rcIndexes = array( 'new_name_timestamp' );
} else {
$rcIndexes = array( 'rc_timestamp' );
@@ -510,7 +527,7 @@ class NewPagesPager extends ReverseChronologicalPager {
$conds['rc_user_text'] = $user->getText();
$rcIndexes = 'rc_user_text';
# If anons cannot make new pages, don't "exclude logged in users"!
- } elseif( $wgGroupPermissions['*']['createpage'] && $this->opts->getValue( 'hideliu' ) ) {
+ } elseif( User::groupHasPermission( '*', 'createpage' ) && $this->opts->getValue( 'hideliu' ) ) {
$conds['rc_user'] = 0;
}
# If this user cannot see patrolled edits or they are off, don't do dumb queries!
diff --git a/includes/specials/SpecialPagesWithProp.php b/includes/specials/SpecialPagesWithProp.php
new file mode 100644
index 00000000..8f8c981e
--- /dev/null
+++ b/includes/specials/SpecialPagesWithProp.php
@@ -0,0 +1,138 @@
+<?php
+/**
+ * Implements Special:PagesWithProp
+ *
+ * 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
+ *
+ * @since 1.21
+ * @file
+ * @ingroup SpecialPage
+ * @author Brad Jorsch
+ */
+
+
+/**
+ * Special:PagesWithProp to search the page_props table
+ * @ingroup SpecialPage
+ * @since 1.21
+ */
+class SpecialPagesWithProp extends QueryPage {
+ private $propName = null;
+
+ function __construct( $name = 'PagesWithProp' ) {
+ parent::__construct( $name );
+ }
+
+ function isCacheable() {
+ return false;
+ }
+
+ function execute( $par ) {
+ $this->setHeaders();
+ $this->outputHeader();
+
+ $request = $this->getRequest();
+ $propname = $request->getVal( 'propname', $par );
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $res = $dbr->select(
+ 'page_props',
+ 'pp_propname',
+ '',
+ __METHOD__,
+ array( 'DISTINCT', 'ORDER BY' => 'pp_propname' )
+ );
+ foreach ( $res as $row ) {
+ $propnames[$row->pp_propname] = $row->pp_propname;
+ }
+
+ $form = new HTMLForm( array(
+ 'propname' => array(
+ 'type' => 'selectorother',
+ 'name' => 'propname',
+ 'options' => $propnames,
+ 'default' => $propname,
+ 'label-message' => 'pageswithprop-prop',
+ 'required' => true,
+ ),
+ ), $this->getContext() );
+ $form->setMethod( 'get' );
+ $form->setAction( $this->getTitle()->getFullUrl() );
+ $form->setSubmitCallback( array( $this, 'onSubmit' ) );
+ $form->setWrapperLegend( $this->msg( 'pageswithprop-legend' ) );
+ $form->addHeaderText( $this->msg( 'pageswithprop-text' )->parseAsBlock() );
+ $form->setSubmitTextMsg( 'pageswithprop-submit' );
+
+ $form->prepareForm();
+ $form->displayForm( false );
+ if ( $propname !== '' && $propname !== null ) {
+ $form->trySubmit();
+ }
+ }
+
+ public function onSubmit( $data, $form ) {
+ $this->propName = $data['propname'];
+ parent::execute( $data['propname'] );
+ }
+
+ /**
+ * Disable RSS/Atom feeds
+ * @return bool
+ */
+ function isSyndicated() {
+ return false;
+ }
+
+ function getQueryInfo() {
+ return array(
+ 'tables' => array( 'page_props', 'page' ),
+ 'fields' => array(
+ 'page_id' => 'pp_page',
+ 'page_namespace',
+ 'page_title',
+ 'page_len',
+ 'page_is_redirect',
+ 'page_latest',
+ 'pp_value',
+ ),
+ 'conds' => array(
+ 'page_id = pp_page',
+ 'pp_propname' => $this->propName,
+ ),
+ 'options' => array()
+ );
+ }
+
+ function getOrderFields() {
+ return array( 'page_id' );
+ }
+
+ function formatResult( $skin, $result ) {
+ $title = Title::newFromRow( $result );
+ $ret = Linker::link( $title, null, array(), array(), array( 'known' ) );
+ if ( $result->pp_value !== '' ) {
+ $value = $this->msg( 'parentheses' )
+ ->rawParams( Xml::span( $result->pp_value, 'prop-value' ) )
+ ->escaped();
+ $ret .= " $value";
+ }
+ return $ret;
+ }
+
+ protected function getGroupName() {
+ return 'pages';
+ }
+}
diff --git a/includes/specials/SpecialPasswordReset.php b/includes/specials/SpecialPasswordReset.php
index efb57657..90b0ac80 100644
--- a/includes/specials/SpecialPasswordReset.php
+++ b/includes/specials/SpecialPasswordReset.php
@@ -86,7 +86,7 @@ class SpecialPasswordReset extends FormSpecialPage {
);
}
- if( $this->getUser()->isAllowed( 'passwordreset' ) ){
+ if( $this->getUser()->isAllowed( 'passwordreset' ) ) {
$a['Capture'] = array(
'type' => 'check',
'label-message' => 'passwordreset-capture',
@@ -121,6 +121,8 @@ class SpecialPasswordReset extends FormSpecialPage {
* userCanExecute(), and if the data array contains 'Username', etc, then Username
* resets are allowed.
* @param $data array
+ * @throws MWException
+ * @throws ThrottledError|PermissionsError
* @return Bool|Array
*/
public function onSubmit( array $data ) {
@@ -134,7 +136,7 @@ class SpecialPasswordReset extends FormSpecialPage {
}
}
- if( isset( $data['Capture'] ) && !$this->getUser()->isAllowed( 'passwordreset' ) ){
+ if( isset( $data['Capture'] ) && !$this->getUser()->isAllowed( 'passwordreset' ) ) {
// The user knows they don't have the passwordreset permission, but they tried to spoof the form. That's naughty
throw new PermissionsError( 'passwordreset' );
}
@@ -160,7 +162,7 @@ class SpecialPasswordReset extends FormSpecialPage {
);
if ( $res ) {
$users = array();
- foreach( $res as $row ){
+ foreach( $res as $row ) {
$users[] = User::newFromRow( $row );
}
} else {
@@ -178,8 +180,8 @@ class SpecialPasswordReset extends FormSpecialPage {
return array( $error );
}
- if( count( $users ) == 0 ){
- if( $method == 'email' ){
+ if( count( $users ) == 0 ) {
+ if( $method == 'email' ) {
// Don't reveal whether or not an email address is in use
return true;
} else {
@@ -247,13 +249,13 @@ class SpecialPasswordReset extends FormSpecialPage {
$username,
$passwordBlock,
count( $passwords ),
- Title::newMainPage()->getCanonicalUrl(),
+ '<' . Title::newMainPage()->getCanonicalUrl() . '>',
round( $wgNewPasswordExpiry / 86400 )
);
$title = $this->msg( 'passwordreset-emailtitle' );
- $this->result = $firstUser->sendMail( $title->escaped(), $this->email->escaped() );
+ $this->result = $firstUser->sendMail( $title->escaped(), $this->email->text() );
// Blank the email if the user is not supposed to see it
if( !isset( $data['Capture'] ) || !$data['Capture'] ) {
@@ -262,7 +264,7 @@ class SpecialPasswordReset extends FormSpecialPage {
if ( $this->result->isGood() ) {
return true;
- } elseif( isset( $data['Capture'] ) && $data['Capture'] ){
+ } elseif( isset( $data['Capture'] ) && $data['Capture'] ) {
// The email didn't send, but maybe they knew that and that's why they captured it
return true;
} else {
@@ -273,10 +275,10 @@ class SpecialPasswordReset extends FormSpecialPage {
}
public function onSuccess() {
- if( $this->getUser()->isAllowed( 'passwordreset' ) && $this->email != null ){
+ if( $this->getUser()->isAllowed( 'passwordreset' ) && $this->email != null ) {
// @todo: Logging
- if( $this->result->isGood() ){
+ if( $this->result->isGood() ) {
$this->getOutput()->addWikiMsg( 'passwordreset-emailsent-capture' );
} else {
$this->getOutput()->addWikiMsg( 'passwordreset-emailerror-capture', $this->result->getMessage() );
@@ -324,4 +326,8 @@ class SpecialPasswordReset extends FormSpecialPage {
return false;
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
diff --git a/includes/specials/SpecialPopularpages.php b/includes/specials/SpecialPopularpages.php
index 448d1799..7ce8c13f 100644
--- a/includes/specials/SpecialPopularpages.php
+++ b/includes/specials/SpecialPopularpages.php
@@ -37,14 +37,16 @@ class PopularPagesPage extends QueryPage {
return true;
}
- function isSyndicated() { return false; }
+ function isSyndicated() {
+ return false;
+ }
function getQueryInfo() {
return array (
'tables' => array( 'page' ),
'fields' => array( 'namespace' => 'page_namespace',
'title' => 'page_title',
- 'value' => 'page_counter'),
+ 'value' => 'page_counter' ),
'conds' => array( 'page_is_redirect' => 0,
'page_namespace' => MWNamespace::getContentNamespaces() ) );
}
@@ -70,4 +72,8 @@ class PopularPagesPage extends QueryPage {
$nv = $this->msg( 'nviews' )->numParams( $result->value )->escaped();
return $this->getLanguage()->specialList( $link, $nv );
}
+
+ protected function getGroupName() {
+ return 'wiki';
+ }
}
diff --git a/includes/specials/SpecialPreferences.php b/includes/specials/SpecialPreferences.php
index c6b2bb6b..a50e7c18 100644
--- a/includes/specials/SpecialPreferences.php
+++ b/includes/specials/SpecialPreferences.php
@@ -78,7 +78,7 @@ class SpecialPreferences extends SpecialPage {
public function submitReset( $formData ) {
$user = $this->getUser();
- $user->resetOptions();
+ $user->resetOptions( 'all' );
$user->saveSettings();
$url = $this->getTitle()->getFullURL( 'success' );
@@ -87,4 +87,8 @@ class SpecialPreferences extends SpecialPage {
return true;
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
diff --git a/includes/specials/SpecialPrefixindex.php b/includes/specials/SpecialPrefixindex.php
index 7740b320..6affa735 100644
--- a/includes/specials/SpecialPrefixindex.php
+++ b/includes/specials/SpecialPrefixindex.php
@@ -29,13 +29,13 @@
class SpecialPrefixindex extends SpecialAllpages {
// Inherit $maxPerPage
- function __construct(){
+ function __construct() {
parent::__construct( 'Prefixindex' );
}
/**
* Entry point : initialise variables and call subfunctions.
- * @param $par String: becomes "FOO" when called like Special:Prefixindex/FOO (default null)
+ * @param string $par becomes "FOO" when called like Special:Prefixindex/FOO (default null)
*/
function execute( $par ) {
global $wgContLang;
@@ -83,14 +83,14 @@ class SpecialPrefixindex extends SpecialAllpages {
/**
* HTML for the top form
* @param $namespace Integer: a namespace constant (default NS_MAIN).
- * @param $from String: dbKey we are starting listing at.
- * @param $hideredirects Bool: hide redirects (default FALSE)
+ * @param string $from dbKey we are starting listing at.
+ * @param bool $hideredirects hide redirects (default FALSE)
* @return string
*/
function namespacePrefixForm( $namespace = NS_MAIN, $from = '', $hideredirects = false ) {
global $wgScript;
- $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
+ $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
$out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
$out .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() );
$out .= Xml::openElement( 'fieldset' );
@@ -101,7 +101,7 @@ class SpecialPrefixindex extends SpecialAllpages {
Xml::label( $this->msg( 'allpagesprefix' )->text(), 'nsfrom' ) .
"</td>
<td class='mw-input'>" .
- Xml::input( 'prefix', 30, str_replace('_',' ',$from), array( 'id' => 'nsfrom' ) ) .
+ Xml::input( 'prefix', 30, str_replace( '_', ' ', $from ), array( 'id' => 'nsfrom' ) ) .
"</td>
</tr>
<tr>
@@ -135,8 +135,8 @@ class SpecialPrefixindex extends SpecialAllpages {
/**
* @param $namespace Integer, default NS_MAIN
* @param $prefix String
- * @param $from String: list all pages from this name (default FALSE)
- * @param $hideredirects Bool: hide redirects (default FALSE)
+ * @param string $from list all pages from this name (default FALSE)
+ * @param bool $hideredirects hide redirects (default FALSE)
*/
function showPrefixChunk( $namespace = NS_MAIN, $prefix, $from = null, $hideredirects = false ) {
global $wgContLang;
@@ -145,8 +145,8 @@ class SpecialPrefixindex extends SpecialAllpages {
$from = $prefix;
}
- $fromList = $this->getNamespaceKeyAndText($namespace, $from);
- $prefixList = $this->getNamespaceKeyAndText($namespace, $prefix);
+ $fromList = $this->getNamespaceKeyAndText( $namespace, $from );
+ $prefixList = $this->getNamespaceKeyAndText( $namespace, $prefix );
$namespaces = $wgContLang->getNamespaces();
if ( !$prefixList || !$fromList ) {
@@ -227,7 +227,7 @@ class SpecialPrefixindex extends SpecialAllpages {
} else {
$nsForm = $this->namespacePrefixForm( $namespace, $prefix, $hideredirects );
$self = $this->getTitle();
- $out2 = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-nav-table' ) ) .
+ $out2 = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-nav-table' ) ) .
'<tr>
<td>' .
$nsForm .
@@ -241,14 +241,14 @@ class SpecialPrefixindex extends SpecialAllpages {
'hideredirects' => $hideredirects,
);
- if( $namespace || ($prefix == '')) {
+ if( $namespace || $prefix == '' ) {
// Keep the namespace even if it's 0 for empty prefixes.
// This tells us we're not just a holdover from old links.
$query['namespace'] = $namespace;
}
$nextLink = Linker::linkKnown(
$self,
- $this->msg( 'nextpage', str_replace( '_',' ', $s->page_title ) )->escaped(),
+ $this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
array(),
$query
);
@@ -263,4 +263,8 @@ class SpecialPrefixindex extends SpecialAllpages {
$this->getOutput()->addHTML( $out2 . $out . $footer );
}
+
+ protected function getGroupName() {
+ return 'pages';
+ }
}
diff --git a/includes/specials/SpecialProtectedpages.php b/includes/specials/SpecialProtectedpages.php
index 74ed5378..cdf053ec 100644
--- a/includes/specials/SpecialProtectedpages.php
+++ b/includes/specials/SpecialProtectedpages.php
@@ -29,7 +29,7 @@
class SpecialProtectedpages extends SpecialPage {
protected $IdLevel = 'level';
- protected $IdType = 'type';
+ protected $IdType = 'type';
public function __construct() {
parent::__construct( 'Protectedpages' );
@@ -51,7 +51,7 @@ class SpecialProtectedpages extends SpecialPage {
$size = $request->getIntOrNull( 'size' );
$NS = $request->getIntOrNull( 'namespace' );
$indefOnly = $request->getBool( 'indefonly' ) ? 1 : 0;
- $cascadeOnly = $request->getBool('cascadeonly') ? 1 : 0;
+ $cascadeOnly = $request->getBool( 'cascadeonly' ) ? 1 : 0;
$pager = new ProtectedPagesPager( $this, array(), $type, $level, $NS, $sizetype, $size, $indefOnly, $cascadeOnly );
@@ -78,11 +78,17 @@ class SpecialProtectedpages extends SpecialPage {
static $infinity = null;
- if( is_null( $infinity ) ){
+ if( is_null( $infinity ) ) {
$infinity = wfGetDB( DB_SLAVE )->getInfinity();
}
$title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+ if( !$title ) {
+ return Html::rawElement( 'li', array(),
+ Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+ Linker::getInvalidTitleDescription( $this->getContext(), $row->page_namespace, $row->page_title ) ) ) . "\n";
+ }
+
$link = Linker::link( $title );
$description_items = array ();
@@ -109,7 +115,7 @@ class SpecialProtectedpages extends SpecialPage {
)->escaped();
}
- if(!is_null($size = $row->page_len)) {
+ if( !is_null( $size = $row->page_len ) ) {
$stxt = $lang->getDirMark() . ' ' . Linker::formatRevisionSize( $size );
}
@@ -146,15 +152,15 @@ class SpecialProtectedpages extends SpecialPage {
/**
* @param $namespace Integer
- * @param $type String: restriction type
- * @param $level String: restriction level
- * @param $sizetype String: "min" or "max"
+ * @param string $type restriction type
+ * @param string $level restriction level
+ * @param string $sizetype "min" or "max"
* @param $size Integer
* @param $indefOnly Boolean: only indefinie protection
* @param $cascadeOnly Boolean: only cascading protection
* @return String: input form
*/
- protected function showOptions( $namespace, $type='edit', $level, $sizetype, $size, $indefOnly, $cascadeOnly ) {
+ protected function showOptions( $namespace, $type = 'edit', $level, $sizetype, $size, $indefOnly, $cascadeOnly ) {
global $wgScript;
$title = $this->getTitle();
return Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
@@ -272,7 +278,7 @@ class SpecialProtectedpages extends SpecialPage {
// First pass to load the log names
foreach( $wgRestrictionLevels as $type ) {
// Messages used can be 'restriction-level-sysop' and 'restriction-level-autoconfirmed'
- if( $type !='' && $type !='*') {
+ if( $type != '' && $type != '*' ) {
$text = $this->msg( "restriction-level-$type" )->text();
$m[$text] = $type;
}
@@ -290,6 +296,10 @@ class SpecialProtectedpages extends SpecialPage {
array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ),
implode( "\n", $options ) ) . "</span>";
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
/**
@@ -300,7 +310,7 @@ class ProtectedPagesPager extends AlphabeticPager {
public $mForm, $mConds;
private $type, $level, $namespace, $sizetype, $size, $indefonly;
- function __construct( $form, $conds = array(), $type, $level, $namespace, $sizetype='', $size=0,
+ function __construct( $form, $conds = array(), $type, $level, $namespace, $sizetype = '', $size = 0,
$indefonly = false, $cascadeonly = false )
{
$this->mForm = $form;
@@ -309,7 +319,7 @@ class ProtectedPagesPager extends AlphabeticPager {
$this->level = $level;
$this->namespace = $namespace;
$this->sizetype = $sizetype;
- $this->size = intval($size);
+ $this->size = intval( $size );
$this->indefonly = (bool)$indefonly;
$this->cascadeonly = (bool)$cascadeonly;
parent::__construct( $form->getContext() );
@@ -336,27 +346,27 @@ class ProtectedPagesPager extends AlphabeticPager {
$conds[] = 'page_id=pr_page';
$conds[] = 'pr_type=' . $this->mDb->addQuotes( $this->type );
- if( $this->sizetype=='min' ) {
+ if( $this->sizetype == 'min' ) {
$conds[] = 'page_len>=' . $this->size;
- } elseif( $this->sizetype=='max' ) {
+ } elseif( $this->sizetype == 'max' ) {
$conds[] = 'page_len<=' . $this->size;
}
if( $this->indefonly ) {
- $db = wfGetDB( DB_SLAVE );
- $conds[] = "pr_expiry = {$db->addQuotes( $db->getInfinity() )} OR pr_expiry IS NULL";
+ $conds[] = "pr_expiry = {$this->mDb->addQuotes( $this->mDb->getInfinity() )} OR pr_expiry IS NULL";
}
if( $this->cascadeonly ) {
- $conds[] = "pr_cascade = '1'";
+ $conds[] = 'pr_cascade = 1';
}
if( $this->level )
$conds[] = 'pr_level=' . $this->mDb->addQuotes( $this->level );
- if( !is_null($this->namespace) )
+ if( !is_null( $this->namespace ) )
$conds[] = 'page_namespace=' . $this->mDb->addQuotes( $this->namespace );
return array(
'tables' => array( 'page_restrictions', 'page' ),
- 'fields' => 'pr_id,page_namespace,page_title,page_len,pr_type,pr_level,pr_expiry,pr_cascade',
+ 'fields' => array( 'pr_id', 'page_namespace', 'page_title', 'page_len',
+ 'pr_type', 'pr_level', 'pr_expiry', 'pr_cascade' ),
'conds' => $conds
);
}
diff --git a/includes/specials/SpecialProtectedtitles.php b/includes/specials/SpecialProtectedtitles.php
index a80f0d0a..0cba5ebd 100644
--- a/includes/specials/SpecialProtectedtitles.php
+++ b/includes/specials/SpecialProtectedtitles.php
@@ -29,7 +29,7 @@
class SpecialProtectedtitles extends SpecialPage {
protected $IdLevel = 'level';
- protected $IdType = 'type';
+ protected $IdType = 'type';
public function __construct() {
parent::__construct( 'Protectedtitles' );
@@ -76,11 +76,17 @@ class SpecialProtectedtitles extends SpecialPage {
static $infinity = null;
- if( is_null( $infinity ) ){
+ if( is_null( $infinity ) ) {
$infinity = wfGetDB( DB_SLAVE )->getInfinity();
}
$title = Title::makeTitleSafe( $row->pt_namespace, $row->pt_title );
+ if( !$title ) {
+ return Html::rawElement( 'li', array(),
+ Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+ Linker::getInvalidTitleDescription( $this->getContext(), $row->pt_namespace, $row->pt_title ) ) ) . "\n";
+ }
+
$link = Linker::link( $title );
$description_items = array ();
@@ -113,7 +119,7 @@ class SpecialProtectedtitles extends SpecialPage {
* @return string
* @private
*/
- function showOptions( $namespace, $type='edit', $level ) {
+ function showOptions( $namespace, $type = 'edit', $level ) {
global $wgScript;
$action = htmlspecialchars( $wgScript );
$title = $this->getTitle();
@@ -161,13 +167,13 @@ class SpecialProtectedtitles extends SpecialPage {
// First pass to load the log names
foreach( $wgRestrictionLevels as $type ) {
- if ( $type !='' && $type !='*') {
+ if ( $type != '' && $type != '*' ) {
$text = $this->msg( "restriction-level-$type" )->text();
$m[$text] = $type;
}
}
// Is there only one level (aside from "all")?
- if( count($m) <= 2 ) {
+ if( count( $m ) <= 2 ) {
return '';
}
// Third pass generates sorted XHTML content
@@ -182,6 +188,10 @@ class SpecialProtectedtitles extends SpecialPage {
array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ),
implode( "\n", $options ) );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
/**
@@ -191,7 +201,7 @@ class SpecialProtectedtitles extends SpecialPage {
class ProtectedTitlesPager extends AlphabeticPager {
public $mForm, $mConds;
- function __construct( $form, $conds = array(), $type, $level, $namespace, $sizetype='', $size=0 ) {
+ function __construct( $form, $conds = array(), $type, $level, $namespace, $sizetype = '', $size = 0 ) {
$this->mForm = $form;
$this->mConds = $conds;
$this->level = $level;
@@ -234,11 +244,12 @@ class ProtectedTitlesPager extends AlphabeticPager {
$conds[] = 'pt_expiry>' . $this->mDb->addQuotes( $this->mDb->timestamp() );
if( $this->level )
$conds['pt_create_perm'] = $this->level;
- if( !is_null($this->namespace) )
+ if( !is_null( $this->namespace ) )
$conds[] = 'pt_namespace=' . $this->mDb->addQuotes( $this->namespace );
return array(
'tables' => 'protected_titles',
- 'fields' => 'pt_namespace,pt_title,pt_create_perm,pt_expiry,pt_timestamp',
+ 'fields' => array( 'pt_namespace', 'pt_title', 'pt_create_perm',
+ 'pt_expiry', 'pt_timestamp' ),
'conds' => $conds
);
}
@@ -247,4 +258,3 @@ class ProtectedTitlesPager extends AlphabeticPager {
return 'pt_timestamp';
}
}
-
diff --git a/includes/specials/SpecialRandompage.php b/includes/specials/SpecialRandompage.php
index 307088ed..b59f8349 100644
--- a/includes/specials/SpecialRandompage.php
+++ b/includes/specials/SpecialRandompage.php
@@ -28,11 +28,11 @@
* @ingroup SpecialPage
*/
class RandomPage extends SpecialPage {
- private $namespaces; // namespaces to select pages from
+ private $namespaces; // namespaces to select pages from
protected $isRedir = false; // should the result be a redirect?
protected $extra = array(); // Extra SQL statements
- public function __construct( $name = 'Randompage' ){
+ public function __construct( $name = 'Randompage' ) {
$this->namespaces = MWNamespace::getContentNamespaces();
parent::__construct( $name );
}
@@ -49,7 +49,7 @@ class RandomPage extends SpecialPage {
}
// select redirects instead of normal pages?
- public function isRedirect(){
+ public function isRedirect() {
return $this->isRedir;
}
@@ -159,4 +159,8 @@ class RandomPage extends SpecialPage {
return $dbr->fetchObject( $res );
}
+
+ protected function getGroupName() {
+ return 'redirects';
+ }
}
diff --git a/includes/specials/SpecialRandomredirect.php b/includes/specials/SpecialRandomredirect.php
index 88c81b31..51783a2f 100644
--- a/includes/specials/SpecialRandomredirect.php
+++ b/includes/specials/SpecialRandomredirect.php
@@ -28,7 +28,7 @@
* @ingroup SpecialPage
*/
class SpecialRandomredirect extends RandomPage {
- function __construct(){
+ function __construct() {
parent::__construct( 'Randomredirect' );
$this->isRedir = true;
}
diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php
index 2bd8b0a9..008678f7 100644
--- a/includes/specials/SpecialRecentchanges.php
+++ b/includes/specials/SpecialRecentchanges.php
@@ -42,16 +42,16 @@ class SpecialRecentChanges extends IncludableSpecialPage {
public function getDefaultOptions() {
$opts = new FormOptions();
- $opts->add( 'days', (int)$this->getUser()->getOption( 'rcdays' ) );
- $opts->add( 'limit', (int)$this->getUser()->getOption( 'rclimit' ) );
+ $opts->add( 'days', $this->getUser()->getIntOption( 'rcdays' ) );
+ $opts->add( 'limit', $this->getUser()->getIntOption( 'rclimit' ) );
$opts->add( 'from', '' );
- $opts->add( 'hideminor', $this->getUser()->getBoolOption( 'hideminor' ) );
- $opts->add( 'hidebots', true );
- $opts->add( 'hideanons', false );
- $opts->add( 'hideliu', false );
+ $opts->add( 'hideminor', $this->getUser()->getBoolOption( 'hideminor' ) );
+ $opts->add( 'hidebots', true );
+ $opts->add( 'hideanons', false );
+ $opts->add( 'hideliu', false );
$opts->add( 'hidepatrolled', $this->getUser()->getBoolOption( 'hidepatrolled' ) );
- $opts->add( 'hidemyself', false );
+ $opts->add( 'hidemyself', false );
$opts->add( 'namespace', '', FormOptions::INTNULL );
$opts->add( 'invert', false );
@@ -109,8 +109,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
public function feedSetup() {
global $wgFeedLimit;
$opts = $this->getDefaultOptions();
- # Feed is cached on limit,hideminor,namespace; other params would randomly not work
- $opts->fetchValuesFromRequest( $this->getRequest(), array( 'limit', 'hideminor', 'namespace' ) );
+ $opts->fetchValuesFromRequest( $this->getRequest() );
$opts->validateIntBounds( 'limit', 0, $wgFeedLimit );
return $opts;
}
@@ -130,7 +129,6 @@ class SpecialRecentChanges extends IncludableSpecialPage {
return $this->rcOptions;
}
-
/**
* Main execution point
*
@@ -156,7 +154,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
// Fetch results, prepare a batch link existence check query
$conds = $this->buildMainQueryConds( $opts );
$rows = $this->doMainQuery( $conds, $opts );
- if( $rows === false ){
+ if( $rows === false ) {
if( !$this->including() ) {
$this->doHeader( $opts );
}
@@ -187,7 +185,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
*
* @return Array
*/
- public function getFeedObject( $feedFormat ){
+ public function getFeedObject( $feedFormat ) {
$changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
$formatter = $changesFeed->getFeedObject(
$this->msg( 'recentchanges' )->inContentLanguage()->text(),
@@ -233,7 +231,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
}
if( is_numeric( $bit ) ) {
- $opts['limit'] = $bit;
+ $opts['limit'] = $bit;
}
$m = array();
@@ -282,9 +280,9 @@ class SpecialRecentChanges extends IncludableSpecialPage {
# It makes no sense to hide both anons and logged-in users
# Where this occurs, force anons to be shown
$forcebot = false;
- if( $opts['hideanons'] && $opts['hideliu'] ){
+ if( $opts['hideanons'] && $opts['hideliu'] ) {
# Check if the user wants to show bots only
- if( $opts['hidebots'] ){
+ if( $opts['hidebots'] ) {
$opts['hideanons'] = false;
} else {
$forcebot = true;
@@ -297,9 +295,9 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$cutoff_unixtime = $cutoff_unixtime - ($cutoff_unixtime % 86400);
$cutoff = $dbr->timestamp( $cutoff_unixtime );
- $fromValid = preg_match('/^[0-9]{14}$/', $opts['from']);
- if( $fromValid && $opts['from'] > wfTimestamp(TS_MW,$cutoff) ) {
- $cutoff = $dbr->timestamp($opts['from']);
+ $fromValid = preg_match( '/^[0-9]{14}$/', $opts['from'] );
+ if( $fromValid && $opts['from'] > wfTimestamp( TS_MW, $cutoff ) ) {
+ $cutoff = $dbr->timestamp( $opts['from'] );
} else {
$opts->reset( 'from' );
}
@@ -341,7 +339,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
if( $opts['namespace'] !== '' ) {
$selectedNS = $dbr->addQuotes( $opts['namespace'] );
$operator = $opts['invert'] ? '!=' : '=';
- $boolean = $opts['invert'] ? 'AND' : 'OR';
+ $boolean = $opts['invert'] ? 'AND' : 'OR';
# namespace association (bug 2429)
if( !$opts['associated'] ) {
@@ -352,8 +350,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
MWNamespace::getAssociated( $opts['namespace'] )
);
$condition = "(rc_namespace $operator $selectedNS "
- . $boolean
- . " rc_namespace $operator $associatedNS)";
+ . $boolean
+ . " rc_namespace $operator $associatedNS)";
}
$conds[] = $condition;
@@ -382,19 +380,22 @@ class SpecialRecentChanges extends IncludableSpecialPage {
$invert = $opts['invert'];
$associated = $opts['associated'];
- $fields = array( $dbr->tableName( 'recentchanges' ) . '.*' ); // all rc columns
+ $fields = RecentChange::selectFields();
// JOIN on watchlist for users
if ( $uid ) {
$tables[] = 'watchlist';
$fields[] = 'wl_user';
$fields[] = 'wl_notificationtimestamp';
- $join_conds['watchlist'] = array('LEFT JOIN',
- "wl_user={$uid} AND wl_title=rc_title AND wl_namespace=rc_namespace");
+ $join_conds['watchlist'] = array( 'LEFT JOIN', array(
+ 'wl_user' => $uid,
+ 'wl_title=rc_title',
+ 'wl_namespace=rc_namespace'
+ ));
}
if ( $this->getUser()->isAllowed( 'rollback' ) ) {
$tables[] = 'page';
$fields[] = 'page_latest';
- $join_conds['page'] = array('LEFT JOIN', 'rc_cur_id=page_id');
+ $join_conds['page'] = array( 'LEFT JOIN', 'rc_cur_id=page_id' );
}
// Tag stuff.
ChangeTags::modifyDisplayQuery(
@@ -467,7 +468,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
/**
* Send output to the OutputPage object, only called if not used feeds
*
- * @param $rows Array of database rows
+ * @param array $rows of database rows
* @param $opts FormOptions
*/
public function webOutput( $rows, $opts ) {
@@ -481,7 +482,12 @@ class SpecialRecentChanges extends IncludableSpecialPage {
}
// And now for the content
- $this->getOutput()->setFeedAppendQuery( $this->getFeedQuery() );
+ $feedQuery = $this->getFeedQuery();
+ if ( $feedQuery !== '' ) {
+ $this->getOutput()->setFeedAppendQuery( $feedQuery );
+ } else {
+ $this->getOutput()->setFeedAppendQuery( false );
+ }
if( $wgAllowCategorizedRecentChanges ) {
$this->filterByCategories( $rows, $opts );
@@ -525,8 +531,12 @@ class SpecialRecentChanges extends IncludableSpecialPage {
}
$rc->numberofWatchingusers = $watcherCache[$obj->rc_namespace][$obj->rc_title];
}
- $s .= $list->recentChangesLine( $rc, !empty( $obj->wl_user ), $counter );
- --$limit;
+
+ $changeLine = $list->recentChangesLine( $rc, !empty( $obj->wl_user ), $counter );
+ if ( $changeLine !== false ) {
+ $s .= $changeLine;
+ --$limit;
+ }
}
$s .= $list->endRecentChangesList();
$this->getOutput()->addHTML( $s );
@@ -534,11 +544,24 @@ class SpecialRecentChanges extends IncludableSpecialPage {
/**
* Get the query string to append to feed link URLs.
- * This is overridden by RCL to add the target parameter
- * @return bool
+ *
+ * @return string
*/
public function getFeedQuery() {
- return false;
+ global $wgFeedLimit;
+
+ $this->getOptions()->validateIntBounds( 'limit', 0, $wgFeedLimit );
+ $options = $this->getOptions()->getChangedValues();
+
+ // wfArrayToCgi() omits options set to null or false
+ foreach ( $options as &$value ) {
+ if ( $value === false ) {
+ $value = '0';
+ }
+ }
+ unset( $value );
+
+ return wfArrayToCgi( $options );
}
/**
@@ -701,11 +724,11 @@ class SpecialRecentChanges extends IncludableSpecialPage {
/**
* Filter $rows by categories set in $opts
*
- * @param $rows Array of database rows
+ * @param array $rows of database rows
* @param $opts FormOptions
*/
function filterByCategories( &$rows, FormOptions $opts ) {
- $categories = array_map( 'trim', explode( '|' , $opts['categories'] ) );
+ $categories = array_map( 'trim', explode( '|', $opts['categories'] ) );
if( !count( $categories ) ) {
return;
@@ -766,8 +789,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
* Makes change an option link which carries all the other options
*
* @param $title Title
- * @param $override Array: options to override
- * @param $options Array: current options
+ * @param array $override options to override
+ * @param array $options current options
* @param $active Boolean: whether to show the link in bold
* @return string
*/
@@ -839,7 +862,6 @@ class SpecialRecentChanges extends IncludableSpecialPage {
}
$dl = $lang->pipeList( $dl );
-
// show/hide links
$showhide = array( $this->msg( 'show' )->text(), $this->msg( 'hide' )->text() );
$filters = array(
@@ -885,4 +907,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
'mediawiki.special.recentchanges',
) );
}
+
+ protected function getGroupName() {
+ return 'changes';
+ }
}
diff --git a/includes/specials/SpecialRecentchangeslinked.php b/includes/specials/SpecialRecentchangeslinked.php
index 862736d3..391c4a7f 100644
--- a/includes/specials/SpecialRecentchangeslinked.php
+++ b/includes/specials/SpecialRecentchangeslinked.php
@@ -29,7 +29,7 @@
class SpecialRecentchangeslinked extends SpecialRecentChanges {
var $rclTargetTitle;
- function __construct(){
+ function __construct() {
parent::__construct( 'Recentchangeslinked' );
}
@@ -37,7 +37,6 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
$opts = parent::getDefaultOptions();
$opts->add( 'target', '' );
$opts->add( 'showlinkedto', false );
- $opts->add( 'tagfilter', '' );
return $opts;
}
@@ -51,7 +50,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
return $opts;
}
- public function getFeedObject( $feedFormat ){
+ public function getFeedObject( $feedFormat ) {
$feed = new ChangesFeed( $feedFormat, false );
$feedObj = $feed->getFeedObject(
$this->msg( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() )
@@ -72,7 +71,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
}
$outputPage = $this->getOutput();
$title = Title::newFromURL( $target );
- if( !$title || $title->getInterwiki() != '' ){
+ if( !$title || $title->getInterwiki() != '' ) {
$outputPage->wrapWikiMsg( "<div class=\"errorbox\">\n$1\n</div><br style=\"clear: both\" />", 'allpagesbadtitle' );
return false;
}
@@ -94,7 +93,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
$dbkey = $title->getDBkey();
$tables = array( 'recentchanges' );
- $select = array( $dbr->tableName( 'recentchanges' ) . '.*' );
+ $select = RecentChange::selectFields();
$join_conds = array();
$query_options = array();
@@ -103,11 +102,15 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
if( $uid ) {
$tables[] = 'watchlist';
$select[] = 'wl_user';
- $join_conds['watchlist'] = array( 'LEFT JOIN', "wl_user={$uid} AND wl_title=rc_title AND wl_namespace=rc_namespace" );
+ $join_conds['watchlist'] = array( 'LEFT JOIN', array(
+ 'wl_user' => $uid,
+ 'wl_title=rc_title',
+ 'wl_namespace=rc_namespace'
+ ));
}
if ( $this->getUser()->isAllowed( 'rollback' ) ) {
$tables[] = 'page';
- $join_conds['page'] = array('LEFT JOIN', 'rc_cur_id=page_id');
+ $join_conds['page'] = array( 'LEFT JOIN', 'rc_cur_id=page_id' );
$select[] = 'page_latest';
}
ChangeTags::modifyDisplayQuery(
@@ -125,7 +128,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
if( $ns == NS_CATEGORY && !$showlinkedto ) {
// special handling for categories
- // XXX: should try to make this less klugy
+ // XXX: should try to make this less kludgy
$link_tables = array( 'categorylinks' );
$showlinkedto = true;
} else {
@@ -176,7 +179,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
$subconds["rc_namespace"] = $link_ns;
$subjoin = "rc_title = {$pfx}_to";
} else {
- $subjoin = "rc_namespace = {$pfx}_namespace AND rc_title = {$pfx}_title";
+ $subjoin = array( "rc_namespace = {$pfx}_namespace", "rc_title = {$pfx}_title" );
}
}
@@ -201,15 +204,15 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
$subsql[] = $query;
}
- if( count($subsql) == 0 ) {
+ if( count( $subsql ) == 0 ) {
return false; // should never happen
}
- if( count($subsql) == 1 && $dbr->unionSupportsOrderAndLimit() ) {
+ if( count( $subsql ) == 1 && $dbr->unionSupportsOrderAndLimit() ) {
$sql = $subsql[0];
} else {
// need to resort and relimit after union
- $sql = $dbr->unionQueries($subsql, false).' ORDER BY rc_timestamp DESC';
- $sql = $dbr->limitResult($sql, $limit, false);
+ $sql = $dbr->unionQueries( $subsql, false ) . ' ORDER BY rc_timestamp DESC';
+ $sql = $dbr->limitResult( $sql, $limit, false );
}
$res = $dbr->query( $sql, __METHOD__ );
@@ -225,16 +228,16 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
* @param $opts FormOptions
* @return array
*/
- function getExtraOptions( $opts ){
+ function getExtraOptions( $opts ) {
$opts->consumeValues( array( 'showlinkedto', 'target', 'tagfilter' ) );
$extraOpts = array();
$extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
$extraOpts['target'] = array( $this->msg( 'recentchangeslinked-page' )->escaped(),
- Xml::input( 'target', 40, str_replace('_',' ',$opts['target']) ) .
- Xml::check( 'showlinkedto', $opts['showlinkedto'], array('id' => 'showlinkedto') ) . ' ' .
+ Xml::input( 'target', 40, str_replace( '_', ' ', $opts['target'] ) ) .
+ Xml::check( 'showlinkedto', $opts['showlinkedto'], array( 'id' => 'showlinkedto' ) ) . ' ' .
Xml::label( $this->msg( 'recentchangeslinked-to' )->text(), 'showlinkedto' ) );
$tagFilter = ChangeTags::buildTagFilterSelector( $opts['tagfilter'] );
- if ($tagFilter) {
+ if ( $tagFilter ) {
$extraOpts['tagfilter'] = $tagFilter;
}
return $extraOpts;
@@ -262,15 +265,6 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
}
}
- public function getFeedQuery() {
- $target = $this->getTargetTitle();
- if( $target ) {
- return "target=" . urlencode( $target->getPrefixedDBkey() );
- } else {
- return false;
- }
- }
-
function setBottomText( FormOptions $opts ) {
if( isset( $this->mResultEmpty ) && $this->mResultEmpty ) {
$this->getOutput()->addWikiMsg( 'recentchangeslinked-noresult' );
diff --git a/includes/specials/SpecialRevisiondelete.php b/includes/specials/SpecialRevisiondelete.php
index aba90cf8..5a5f8ffb 100644
--- a/includes/specials/SpecialRevisiondelete.php
+++ b/includes/specials/SpecialRevisiondelete.php
@@ -133,7 +133,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$this->ids = explode( ',', $ids );
} else {
# Array input
- $this->ids = array_keys( $request->getArray('ids',array()) );
+ $this->ids = array_keys( $request->getArray( 'ids', array() ) );
}
// $this->ids = array_map( 'intval', $this->ids );
$this->ids = array_unique( array_filter( $this->ids ) );
@@ -147,7 +147,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
} else {
$this->typeName = $request->getVal( 'type' );
$this->targetObj = Title::newFromText( $request->getText( 'target' ) );
- if ( $this->targetObj->isSpecial( 'Log' ) ) {
+ if ( $this->targetObj && $this->targetObj->isSpecial( 'Log' ) && count( $this->ids ) !== 0 ) {
$result = wfGetDB( DB_SLAVE )->select( 'logging',
'log_type',
array( 'log_id' => $this->ids ),
@@ -155,14 +155,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
array( 'DISTINCT' )
);
- $logTypes = array();
- foreach ( $result as $row ) {
- $logTypes[] = $row->log_type;
- }
-
- if ( count( $logTypes ) == 1 ) {
+ if ( $result->numRows() == 1 ) {
// If there's only one type, the target can be set to include it.
- $this->targetObj = SpecialPage::getTitleFor( 'Log', $logTypes[0] );
+ $this->targetObj = SpecialPage::getTitleFor( 'Log', $result->current()->log_type );
}
}
}
@@ -196,7 +191,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$this->otherReason = $request->getVal( 'wpReason' );
# We need a target page!
- if( is_null($this->targetObj) ) {
+ if( is_null( $this->targetObj ) ) {
$output->addWikiMsg( 'undelete-header' );
return;
}
@@ -209,7 +204,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
array( 'revdelete-hide-comment', 'wpHideComment', Revision::DELETED_COMMENT ),
array( 'revdelete-hide-user', 'wpHideUser', Revision::DELETED_USER )
);
- if( $user->isAllowed('suppressrevision') ) {
+ if( $user->isAllowed( 'suppressrevision' ) ) {
$this->checks[] = array( 'revdelete-hide-restricted',
'wpHideRestricted', Revision::DELETED_RESTRICTED );
}
@@ -230,7 +225,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
# Show relevant lines from the suppression log
if( $user->isAllowed( 'suppressionlog' ) ) {
$suppressLogPage = new LogPage( 'suppress' );
- $output->addHTML( "<h2>" . $suppressLogPage->getName()->escaped() . "</h2>\n" );
+ $output->addHTML( "<h2>" . $suppressLogPage->getName()->escaped() . "</h2>\n" );
LogEventsList::showLogExtract( $output, 'suppress',
$this->targetObj, '', array( 'lim' => 25, 'conds' => $qc ) );
}
@@ -258,7 +253,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
array( 'action' => 'history' )
);
# Link to deleted edits
- if( $this->getUser()->isAllowed('undelete') ) {
+ if( $this->getUser()->isAllowed( 'undelete' ) ) {
$undelete = SpecialPage::getTitleFor( 'Undelete' );
$links[] = Linker::linkKnown(
$undelete,
@@ -361,7 +356,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$UserAllowed = true;
if ( $this->typeName == 'logging' ) {
- $this->getOutput()->addWikiMsg( 'logdelete-selected', $this->getLanguage()->formatNum( count($this->ids) ) );
+ $this->getOutput()->addWikiMsg( 'logdelete-selected', $this->getLanguage()->formatNum( count( $this->ids ) ) );
} else {
$this->getOutput()->addWikiMsg( 'revdelete-selected',
$this->targetObj->getPrefixedText(), count( $this->ids ) );
@@ -469,8 +464,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
}
/**
- * @return String: HTML
- */
+ * @return String: HTML
+ */
protected function buildCheckBoxes() {
$html = '<table>';
// If there is just one item, use checkboxes
@@ -522,11 +517,12 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
/**
* UI entry point for form submission.
+ * @throws PermissionsError
* @return bool
*/
protected function submit() {
# Check edit token on submission
- $token = $this->getRequest()->getVal('wpEditToken');
+ $token = $this->getRequest()->getVal( 'wpEditToken' );
if( $this->submitClicked && !$this->getUser()->matchEditToken( $token ) ) {
$this->getOutput()->addWikiMsg( 'sessionfailure' );
return false;
@@ -541,7 +537,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
$comment = $this->otherReason;
}
# Can the user set this field?
- if( $bitParams[Revision::DELETED_RESTRICTED]==1 && !$this->getUser()->isAllowed('suppressrevision') ) {
+ if( $bitParams[Revision::DELETED_RESTRICTED] == 1 && !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
throw new PermissionsError( 'suppressrevision' );
}
# If the save went through, go to success message...
@@ -583,14 +579,14 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
protected function extractBitParams() {
$bitfield = array();
foreach( $this->checks as $item ) {
- list( /* message */ , $name, $field ) = $item;
+ list( /* message */, $name, $field ) = $item;
$val = $this->getRequest()->getInt( $name, 0 /* unchecked */ );
if( $val < -1 || $val > 1) {
$val = -1; // -1 for existing value
}
$bitfield[$field] = $val;
}
- if( !isset($bitfield[Revision::DELETED_RESTRICTED]) ) {
+ if( !isset( $bitfield[Revision::DELETED_RESTRICTED] ) ) {
$bitfield[Revision::DELETED_RESTRICTED] = 0;
}
return $bitfield;
@@ -598,8 +594,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
/**
* Put together a rev_deleted bitfield
- * @param $bitPars array extractBitParams() params
- * @param $oldfield int current bitfield
+ * @param array $bitPars extractBitParams() params
+ * @param int $oldfield current bitfield
* @return array
*/
public static function extractBitfield( $bitPars, $oldfield ) {
@@ -627,5 +623,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
array( 'value' => $bitfield, 'comment' => $reason )
);
}
-}
+ protected function getGroupName() {
+ return 'pagetools';
+ }
+}
diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php
index 5f5b6b4d..6c401486 100644
--- a/includes/specials/SpecialSearch.php
+++ b/includes/specials/SpecialSearch.php
@@ -78,7 +78,7 @@ class SpecialSearch extends SpecialPage {
/**
* Entry point
*
- * @param $par String or null
+ * @param string $par or null
*/
public function execute( $par ) {
$this->setHeaders();
@@ -138,7 +138,7 @@ class SpecialSearch extends SpecialPage {
// BC with old request format
$profile = 'advanced';
foreach( $profiles as $key => $data ) {
- if ( $nslist === $data['namespaces'] && $key !== 'advanced') {
+ if ( $nslist === $data['namespaces'] && $key !== 'advanced' ) {
$profile = $key;
}
}
@@ -159,7 +159,7 @@ class SpecialSearch extends SpecialPage {
$default = $request->getBool( 'profile' ) ? 0 : 1;
$this->searchRedirects = $request->getBool( 'redirs', $default ) ? 1 : 0;
$this->didYouMeanHtml = ''; # html of did you mean... link
- $this->fulltext = $request->getVal('fulltext');
+ $this->fulltext = $request->getVal( 'fulltext' );
$this->profile = $profile;
}
@@ -218,7 +218,7 @@ class SpecialSearch extends SpecialPage {
$search->showRedirects = $this->searchRedirects; // BC
$search->setFeatureData( 'list-redirects', $this->searchRedirects );
$search->prefix = $this->mPrefix;
- $term = $search->transformSearchTerm($term);
+ $term = $search->transformSearchTerm( $term );
wfRunHooks( 'SpecialSearchSetupEngine', array( $this, $this->profile, $search ) );
@@ -250,7 +250,7 @@ class SpecialSearch extends SpecialPage {
$t = Title::newFromText( $term );
// fetch search results
- $rewritten = $search->replacePrefixes($term);
+ $rewritten = $search->replacePrefixes( $term );
$titleMatches = $search->searchTitle( $rewritten );
if( !( $titleMatches instanceof SearchResultTooMany ) ) {
@@ -261,7 +261,7 @@ class SpecialSearch extends SpecialPage {
if( $textMatches && $textMatches->hasSuggestion() ) {
$st = SpecialPage::getTitleFor( 'Search' );
- # mirror Go/Search behaviour of original request ..
+ # mirror Go/Search behavior of original request ..
$didYouMeanParams = array( 'search' => $textMatches->getSuggestionQuery() );
if( $this->fulltext != null ) {
@@ -288,6 +288,13 @@ class SpecialSearch extends SpecialPage {
$this->didYouMeanHtml = '<div class="searchdidyoumean">' . $this->msg( 'search-suggest' )->rawParams( $suggestLink )->text() . '</div>';
}
+
+ if ( !wfRunHooks( 'SpecialSearchResultsPrepend', array( $this, $out, $term ) ) ) {
+ # Hook requested termination
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
// start rendering the page
$out->addHtml(
Xml::openElement(
@@ -304,9 +311,9 @@ class SpecialSearch extends SpecialPage {
Xml::openElement( 'tr' ) .
Xml::openElement( 'td' ) . "\n" .
$this->shortDialog( $term ) .
- Xml::closeElement('td') .
- Xml::closeElement('tr') .
- Xml::closeElement('table')
+ Xml::closeElement( 'td' ) .
+ Xml::closeElement( 'tr' ) .
+ Xml::closeElement( 'table' )
);
// Sometimes the search engine knows there are too many hits
@@ -316,7 +323,7 @@ class SpecialSearch extends SpecialPage {
return;
}
- $filePrefix = $wgContLang->getFormattedNsText(NS_FILE).':';
+ $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
if( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
$out->addHTML( $this->formHeader( $term, 0, 0 ) );
$out->addHtml( $this->getProfileForm( $this->profile, $term ) );
@@ -340,16 +347,15 @@ class SpecialSearch extends SpecialPage {
// get total number of results if backend can calculate it
$totalRes = 0;
- if($titleMatches && !is_null( $titleMatches->getTotalHits() ) )
+ if( $titleMatches && !is_null( $titleMatches->getTotalHits() ) )
$totalRes += $titleMatches->getTotalHits();
- if($textMatches && !is_null( $textMatches->getTotalHits() ))
+ if( $textMatches && !is_null( $textMatches->getTotalHits() ) )
$totalRes += $textMatches->getTotalHits();
// show number of results and current offset
$out->addHTML( $this->formHeader( $term, $num, $totalRes ) );
$out->addHtml( $this->getProfileForm( $this->profile, $term ) );
-
$out->addHtml( Xml::closeElement( 'form' ) );
$out->addHtml( "<div class='searchresults'>" );
@@ -404,6 +410,7 @@ class SpecialSearch extends SpecialPage {
if( $num || $this->offset ) {
$out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
}
+ wfRunHooks( 'SpecialSearchResultsAppend', array( $this, $out, $term ) );
wfProfileOut( __METHOD__ );
}
@@ -423,7 +430,7 @@ class SpecialSearch extends SpecialPage {
if( $t->isKnown() ) {
$messageName = 'searchmenu-exists';
- } elseif( $t->userCan( 'create' ) ) {
+ } elseif( $t->userCan( 'create', $this->getUser() ) ) {
$messageName = 'searchmenu-new';
} else {
$messageName = 'searchmenu-new-nocreate';
@@ -447,9 +454,11 @@ class SpecialSearch extends SpecialPage {
# Should advanced UI be used?
$this->searchAdvanced = ($this->profile === 'advanced');
$out = $this->getOutput();
- if( strval( $term ) !== '' ) {
+ if( strval( $term ) !== '' ) {
$out->setPageTitle( $this->msg( 'searchresults' ) );
- $out->setHTMLTitle( $this->msg( 'pagetitle', $this->msg( 'searchresults-title', $term )->plain() ) );
+ $out->setHTMLTitle( $this->msg( 'pagetitle' )->rawParams(
+ $this->msg( 'searchresults-title' )->rawParams( $term )->text()
+ ) );
}
// add javascript specific to special:search
$out->addModules( 'mediawiki.special.search' );
@@ -506,7 +515,7 @@ class SpecialSearch extends SpecialPage {
$out = "";
$infoLine = $matches->getInfo();
- if( !is_null($infoLine) ) {
+ if( !is_null( $infoLine ) ) {
$out .= "\n<!-- {$infoLine} -->\n";
}
$out .= "<ul class='mw-search-results'>\n";
@@ -527,7 +536,7 @@ class SpecialSearch extends SpecialPage {
* Format a single hit result
*
* @param $result SearchResult
- * @param $terms Array: terms to highlight
+ * @param array $terms terms to highlight
*
* @return string
*/
@@ -541,7 +550,7 @@ class SpecialSearch extends SpecialPage {
$t = $result->getTitle();
- $titleSnippet = $result->getTitleSnippet($terms);
+ $titleSnippet = $result->getTitleSnippet( $terms );
if( $titleSnippet == '' )
$titleSnippet = null;
@@ -559,7 +568,7 @@ class SpecialSearch extends SpecialPage {
//If page content is not readable, just return the title.
//This is not quite safe, but better than showing excerpts from non-readable pages
//Note that hiding the entry entirely would screw up paging.
- if( !$t->userCan( 'read' ) ) {
+ if( !$t->userCan( 'read', $this->getUser() ) ) {
wfProfileOut( __METHOD__ );
return "<li>{$link}</li>\n";
}
@@ -574,12 +583,12 @@ class SpecialSearch extends SpecialPage {
// format redirects / relevant sections
$redirectTitle = $result->getRedirectTitle();
- $redirectText = $result->getRedirectSnippet($terms);
+ $redirectText = $result->getRedirectSnippet( $terms );
$sectionTitle = $result->getSectionTitle();
- $sectionText = $result->getSectionSnippet($terms);
+ $sectionText = $result->getSectionSnippet( $terms );
$redirect = '';
- if( !is_null($redirectTitle) ) {
+ if( !is_null( $redirectTitle ) ) {
if( $redirectText == '' )
$redirectText = null;
@@ -591,7 +600,7 @@ class SpecialSearch extends SpecialPage {
$section = '';
- if( !is_null($sectionTitle) ) {
+ if( !is_null( $sectionTitle ) ) {
if( $sectionText == '' )
$sectionText = null;
@@ -602,7 +611,7 @@ class SpecialSearch extends SpecialPage {
}
// format text extract
- $extract = "<div class='searchresult'>".$result->getTextSnippet($terms)."</div>";
+ $extract = "<div class='searchresult'>" . $result->getTextSnippet( $terms ) . "</div>";
$lang = $this->getLanguage();
@@ -667,7 +676,7 @@ class SpecialSearch extends SpecialPage {
return "<li>" .
'<table class="searchResultImage">' .
'<tr>' .
- '<td width="120" style="text-align: center; vertical-align: top;">' .
+ '<td style="width: 120px; text-align: center; vertical-align: top;">' .
$thumb->toHtml( array( 'desc-link' => true ) ) .
'</td>' .
'<td style="vertical-align: top;">' .
@@ -682,11 +691,21 @@ class SpecialSearch extends SpecialPage {
}
}
- wfProfileOut( __METHOD__ );
- return "<li><div class='mw-search-result-heading'>{$link} {$redirect} {$section}</div> {$extract}\n" .
- "<div class='mw-search-result-data'>{$score}{$size} - {$date}{$related}</div>" .
- "</li>\n";
+ $html = null;
+
+ if ( wfRunHooks( 'ShowSearchHit', array (
+ $this, $result, $terms,
+ &$link, &$redirect, &$section, &$extract,
+ &$score, &$size, &$date, &$related,
+ &$html
+ ) ) ) {
+ $html = "<li><div class='mw-search-result-heading'>{$link} {$redirect} {$section}</div> {$extract}\n" .
+ "<div class='mw-search-result-data'>{$score}{$size} - {$date}{$related}</div>" .
+ "</li>\n";
+ }
+ wfProfileOut( __METHOD__ );
+ return $html;
}
/**
@@ -703,16 +722,17 @@ class SpecialSearch extends SpecialPage {
$terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
$out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>".
- $this->msg( 'search-interwiki-caption' )->text() . "</div>\n";
+ $this->msg( 'search-interwiki-caption' )->text() . "</div>\n";
$out .= "<ul class='mw-search-iwresults'>\n";
// work out custom project captions
$customCaptions = array();
$customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() ); // format per line <iwprefix>:<caption>
- foreach($customLines as $line) {
- $parts = explode(":",$line,2);
- if(count($parts) == 2) // validate line
+ foreach( $customLines as $line ) {
+ $parts = explode( ":", $line, 2 );
+ if( count( $parts ) == 2 ) { // validate line
$customCaptions[$parts[0]] = $parts[1];
+ }
}
$prev = null;
@@ -738,7 +758,7 @@ class SpecialSearch extends SpecialPage {
* @param $lastInterwiki String
* @param $terms Array
* @param $query String
- * @param $customCaptions Array: iw prefix -> caption
+ * @param array $customCaptions iw prefix -> caption
*
* @return string
*/
@@ -752,7 +772,7 @@ class SpecialSearch extends SpecialPage {
$t = $result->getTitle();
- $titleSnippet = $result->getTitleSnippet($terms);
+ $titleSnippet = $result->getTitleSnippet( $terms );
if( $titleSnippet == '' )
$titleSnippet = null;
@@ -764,9 +784,9 @@ class SpecialSearch extends SpecialPage {
// format redirect if any
$redirectTitle = $result->getRedirectTitle();
- $redirectText = $result->getRedirectSnippet($terms);
+ $redirectText = $result->getRedirectSnippet( $terms );
$redirect = '';
- if( !is_null($redirectTitle) ) {
+ if( !is_null( $redirectTitle ) ) {
if( $redirectText == '' )
$redirectText = null;
@@ -778,8 +798,8 @@ class SpecialSearch extends SpecialPage {
$out = "";
// display project name
- if(is_null($lastInterwiki) || $lastInterwiki != $t->getInterwiki()) {
- if( array_key_exists($t->getInterwiki(),$customCaptions) ) {
+ if( is_null( $lastInterwiki ) || $lastInterwiki != $t->getInterwiki() ) {
+ if( array_key_exists( $t->getInterwiki(), $customCaptions ) ) {
// captions from 'search-interwiki-custom'
$caption = $customCaptions[$t->getInterwiki()];
} else {
@@ -789,7 +809,7 @@ class SpecialSearch extends SpecialPage {
$caption = $this->msg( 'search-interwiki-default', $parsed['host'] )->text();
}
// "more results" link (special page stuff could be localized, but we might not know target lang)
- $searchTitle = Title::newFromText($t->getInterwiki().":Special:Search");
+ $searchTitle = Title::newFromText( $t->getInterwiki() . ":Special:Search" );
$searchLink = Linker::linkKnown(
$searchTitle,
$this->msg( 'search-interwiki-more' )->text(),
@@ -831,7 +851,7 @@ class SpecialSearch extends SpecialPage {
/**
* Generates the power search box at [[Special:Search]]
*
- * @param $term String: search term
+ * @param string $term search term
* @param $opts array
* @return String: HTML form
*/
@@ -897,7 +917,7 @@ class SpecialSearch extends SpecialPage {
'fieldset',
array( 'id' => 'mw-searchoptions', 'style' => 'margin:0em;' )
) .
- Xml::element( 'legend', null, $this->msg('powersearch-legend' )->text() ) .
+ Xml::element( 'legend', null, $this->msg( 'powersearch-legend' )->text() ) .
Xml::tags( 'h4', null, $this->msg( 'powersearch-ns' )->parse() ) .
Html::element( 'div', array( 'id' => 'mw-search-togglebox' ) ) .
Xml::element( 'div', array( 'class' => 'divider' ), '', false ) .
@@ -964,7 +984,7 @@ class SpecialSearch extends SpecialPage {
* @return string
*/
protected function formHeader( $term, $resultsShown, $totalNum ) {
- $out = Xml::openElement('div', array( 'class' => 'mw-search-formheader' ) );
+ $out = Xml::openElement( 'div', array( 'class' => 'mw-search-formheader' ) );
$bareterm = $term;
if( $this->startsWithImage( $term ) ) {
@@ -1001,11 +1021,11 @@ class SpecialSearch extends SpecialPage {
);
}
$out .= Xml::closeElement( 'ul' );
- $out .= Xml::closeElement('div') ;
+ $out .= Xml::closeElement( 'div' );
// Results-info
if ( $resultsShown > 0 ) {
- if ( $totalNum > 0 ){
+ if ( $totalNum > 0 ) {
$top = $this->msg( 'showingresultsheader' )
->numParams( $this->offset + 1, $this->offset + $resultsShown, $totalNum )
->params( wfEscapeWikiText( $term ) )
@@ -1026,7 +1046,7 @@ class SpecialSearch extends SpecialPage {
}
$out .= Xml::element( 'div', array( 'style' => 'clear:both' ), '', false );
- $out .= Xml::closeElement('div');
+ $out .= Xml::closeElement( 'div' );
return $out;
}
@@ -1053,10 +1073,10 @@ class SpecialSearch extends SpecialPage {
* Make a search link with some target namespaces
*
* @param $term String
- * @param $namespaces Array ignored
- * @param $label String: link's text
- * @param $tooltip String: link's tooltip
- * @param $params Array: query string parameters
+ * @param array $namespaces ignored
+ * @param string $label link's text
+ * @param string $tooltip link's tooltip
+ * @param array $params query string parameters
* @return String: HTML fragment
*/
protected function makeSearchLink( $term, $namespaces, $label, $tooltip, $params = array() ) {
@@ -1086,7 +1106,7 @@ class SpecialSearch extends SpecialPage {
/**
* Check if query starts with image: prefix
*
- * @param $term String: the string to check
+ * @param string $term the string to check
* @return Boolean
*/
protected function startsWithImage( $term ) {
@@ -1102,7 +1122,7 @@ class SpecialSearch extends SpecialPage {
/**
* Check if query starts with all: prefix
*
- * @param $term String: the string to check
+ * @param string $term the string to check
* @return Boolean
*/
protected function startsWithAll( $term ) {
@@ -1111,7 +1131,7 @@ class SpecialSearch extends SpecialPage {
$p = explode( ':', $term );
if( count( $p ) > 1 ) {
- return $p[0] == $allkeyword;
+ return $p[0] == $allkeyword;
}
return false;
}
@@ -1141,4 +1161,7 @@ class SpecialSearch extends SpecialPage {
$this->extraParams[$key] = $value;
}
+ protected function getGroupName() {
+ return 'redirects';
+ }
}
diff --git a/includes/specials/SpecialShortpages.php b/includes/specials/SpecialShortpages.php
index 5a4e8f03..1be7fbed 100644
--- a/includes/specials/SpecialShortpages.php
+++ b/includes/specials/SpecialShortpages.php
@@ -110,4 +110,8 @@ class ShortPagesPage extends QueryPage {
? "${hlinkInParentheses} {$dm}{$plink} {$dm}[{$size}]"
: "<del>${hlinkInParentheses} {$dm}{$plink} {$dm}[{$size}]</del>";
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialSpecialpages.php b/includes/specials/SpecialSpecialpages.php
index e973ddc8..57fffb84 100644
--- a/includes/specials/SpecialSpecialpages.php
+++ b/includes/specials/SpecialSpecialpages.php
@@ -62,11 +62,15 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
$groups = array();
foreach ( $pages as $page ) {
if ( $page->isListed() ) {
- $group = SpecialPageFactory::getGroup( $page );
+ $group = $page->getFinalGroupName();
if( !isset( $groups[$group] ) ) {
$groups[$group] = array();
}
- $groups[$group][$page->getDescription()] = array( $page->getTitle(), $page->isRestricted(), $page->isExpensive() );
+ $groups[$group][$page->getDescription()] = array(
+ $page->getTitle(),
+ $page->isRestricted(),
+ $page->isCached()
+ );
}
}
@@ -88,15 +92,14 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
}
private function outputPageList( $groups ) {
- global $wgMiserMode;
$out = $this->getOutput();
$includesRestrictedPages = false;
$includesCachedPages = false;
foreach ( $groups as $group => $sortedPages ) {
- $middle = ceil( count( $sortedPages )/2 );
$total = count( $sortedPages );
+ $middle = ceil( $total / 2 );
$count = 0;
$out->wrapWikiMsg( "<h2 class=\"mw-specialpagesgroup\" id=\"mw-specialpagesgroup-$group\">$1</h2>\n", "specialpages-group-$group" );
@@ -107,10 +110,10 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
Html::openElement( 'ul' ) . "\n"
);
foreach( $sortedPages as $desc => $specialpage ) {
- list( $title, $restricted, $expensive) = $specialpage;
+ list( $title, $restricted, $cached ) = $specialpage;
$pageClasses = array();
- if ( $expensive && $wgMiserMode ){
+ if ( $cached ) {
$includesCachedPages = true;
$pageClasses[] = 'mw-specialpagecached';
}
@@ -119,7 +122,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
$pageClasses[] = 'mw-specialpagerestricted';
}
- $link = Linker::linkKnown( $title , htmlspecialchars( $desc ) );
+ $link = Linker::linkKnown( $title, htmlspecialchars( $desc ) );
$out->addHTML( Html::rawElement( 'li', array( 'class' => implode( ' ', $pageClasses ) ), $link ) . "\n" );
# Split up the larger groups
diff --git a/includes/specials/SpecialStatistics.php b/includes/specials/SpecialStatistics.php
index 46881ec4..ee768263 100644
--- a/includes/specials/SpecialStatistics.php
+++ b/includes/specials/SpecialStatistics.php
@@ -61,7 +61,7 @@ class SpecialStatistics extends SpecialPage {
if( !$wgMiserMode ) {
$key = wfMemcKey( 'sitestats', 'activeusers-updated' );
// Re-calculate the count if the last tally is old...
- if( !$wgMemc->get($key) ) {
+ if( !$wgMemc->get( $key ) ) {
$dbw = wfGetDB( DB_MASTER );
SiteStatsUpdate::cacheUpdate( $dbw );
$wgMemc->set( $key, '1', 24*3600 ); // don't update for 1 day
@@ -222,7 +222,7 @@ class SpecialStatistics extends SpecialPage {
}
$text .= $this->formatRow( $grouppage . ' ' . $grouplink,
$this->getLanguage()->formatNum( $countUsers ),
- array( 'class' => 'statistics-group-' . Sanitizer::escapeClass( $group ) . $classZero ) );
+ array( 'class' => 'statistics-group-' . Sanitizer::escapeClass( $group ) . $classZero ) );
}
return $text;
}
@@ -277,21 +277,60 @@ class SpecialStatistics extends SpecialPage {
return $text;
}
- private function getOtherStats( $stats ) {
- if ( !count( $stats ) )
- return '';
+ /**
+ * Conversion of external statistics into an internal representation
+ * Following a ([<header-message>][<item-message>] = number) pattern
+ *
+ * @param array $stats
+ * @return string
+ */
+ private function getOtherStats( array $stats ) {
+ $return = '';
- $return = Xml::openElement( 'tr' ) .
- Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-header-hooks' )->parse() ) .
- Xml::closeElement( 'tr' );
+ foreach( $stats as $header => $items ) {
+
+ // Identify the structure used
+ if ( is_array( $items ) ) {
- foreach( $stats as $name => $number ) {
- $name = htmlspecialchars( $name );
- $number = htmlspecialchars( $number );
+ // Ignore headers that are recursively set as legacy header
+ if ( $header !== 'statistics-header-hooks' ) {
+ $return .= $this->formatRowHeader( $header );
+ }
+
+ // Collect all items that belong to the same header
+ foreach( $items as $key => $value ) {
+ $name = $this->msg( $key )->parse();
+ $number = htmlspecialchars( $value );
+
+ $return .= $this->formatRow( $name, $this->getLanguage()->formatNum( $number ), array( 'class' => 'mw-statistics-hook' ) );
+ }
+ } else {
+ // Create the legacy header only once
+ if ( $return === '' ) {
+ $return .= $this->formatRowHeader( 'statistics-header-hooks' );
+ }
- $return .= $this->formatRow( $name, $this->getLanguage()->formatNum( $number ), array( 'class' => 'mw-statistics-hook' ) );
+ // Recursively remap the legacy structure
+ $return .= $this->getOtherStats( array( 'statistics-header-hooks' => array( $header => $items ) ) );
+ }
}
return $return;
}
+
+ /**
+ * Format row header
+ *
+ * @param string $header
+ * @return string
+ */
+ private function formatRowHeader( $header ) {
+ return Xml::openElement( 'tr' ) .
+ Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( $header )->parse() ) .
+ Xml::closeElement( 'tr' );
+ }
+
+ protected function getGroupName() {
+ return 'wiki';
+ }
}
diff --git a/includes/specials/SpecialTags.php b/includes/specials/SpecialTags.php
index 4036ebb2..6d161031 100644
--- a/includes/specials/SpecialTags.php
+++ b/includes/specials/SpecialTags.php
@@ -92,4 +92,8 @@ class SpecialTags extends SpecialPage {
return Xml::tags( 'tr', null, $newRow ) . "\n";
}
+
+ protected function getGroupName() {
+ return 'changes';
+ }
}
diff --git a/includes/specials/SpecialUnblock.php b/includes/specials/SpecialUnblock.php
index fb2005b5..c4a53cf0 100644
--- a/includes/specials/SpecialUnblock.php
+++ b/includes/specials/SpecialUnblock.php
@@ -32,11 +32,11 @@ class SpecialUnblock extends SpecialPage {
protected $type;
protected $block;
- public function __construct(){
+ public function __construct() {
parent::__construct( 'Unblock', 'block' );
}
- public function execute( $par ){
+ public function execute( $par ) {
$this->checkPermissions();
$this->checkReadOnly();
@@ -56,8 +56,8 @@ class SpecialUnblock extends SpecialPage {
$form->setSubmitTextMsg( 'ipusubmit' );
$form->addPreText( $this->msg( 'unblockiptext' )->parseAsBlock() );
- if( $form->show() ){
- switch( $this->type ){
+ if( $form->show() ) {
+ switch( $this->type ) {
case Block::TYPE_USER:
case Block::TYPE_IP:
$out->addWikiMsg( 'unblocked', wfEscapeWikiText( $this->target ) );
@@ -73,7 +73,7 @@ class SpecialUnblock extends SpecialPage {
}
}
- protected function getFields(){
+ protected function getFields() {
$fields = array(
'Target' => array(
'type' => 'text',
@@ -92,21 +92,21 @@ class SpecialUnblock extends SpecialPage {
)
);
- if( $this->block instanceof Block ){
+ if( $this->block instanceof Block ) {
list( $target, $type ) = $this->block->getTargetAndType();
# Autoblocks are logged as "autoblock #123 because the IP was recently used by
# User:Foo, and we've just got any block, auto or not, that applies to a target
# the user has specified. Someone could be fishing to connect IPs to autoblocks,
# so don't show any distinction between unblocked IPs and autoblocked IPs
- if( $type == Block::TYPE_AUTO && $this->type == Block::TYPE_IP ){
+ if( $type == Block::TYPE_AUTO && $this->type == Block::TYPE_IP ) {
$fields['Target']['default'] = $this->target;
unset( $fields['Name'] );
} else {
$fields['Target']['default'] = $target;
$fields['Target']['type'] = 'hidden';
- switch( $type ){
+ switch( $type ) {
case Block::TYPE_USER:
case Block::TYPE_IP:
$fields['Name']['default'] = Linker::link(
@@ -149,14 +149,15 @@ class SpecialUnblock extends SpecialPage {
*
* @param $data Array
* @param $context IContextSource
+ * @throws ErrorPageError
* @return Array( Array(message key, parameters) ) on failure, True on success
*/
- public static function processUnblock( array $data, IContextSource $context ){
+ public static function processUnblock( array $data, IContextSource $context ) {
$performer = $context->getUser();
$target = $data['Target'];
$block = Block::newFromTarget( $data['Target'] );
- if( !$block instanceof Block ){
+ if( !$block instanceof Block ) {
return array( array( 'ipb_cant_unblock', $target ) );
}
@@ -172,8 +173,8 @@ class SpecialUnblock extends SpecialPage {
# unblock the whole range.
list( $target, $type ) = SpecialBlock::getTargetAndType( $target );
if( $block->getType() == Block::TYPE_RANGE && $type == Block::TYPE_IP ) {
- $range = $block->getTarget();
- return array( array( 'ipb_blocked_as_range', $target, $range ) );
+ $range = $block->getTarget();
+ return array( array( 'ipb_blocked_as_range', $target, $range ) );
}
# If the name was hidden and the blocking user cannot hide
@@ -212,4 +213,8 @@ class SpecialUnblock extends SpecialPage {
return true;
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
diff --git a/includes/specials/SpecialUncategorizedcategories.php b/includes/specials/SpecialUncategorizedcategories.php
index 70d98df9..54b20dde 100644
--- a/includes/specials/SpecialUncategorizedcategories.php
+++ b/includes/specials/SpecialUncategorizedcategories.php
@@ -31,4 +31,17 @@ class UncategorizedCategoriesPage extends UncategorizedPagesPage {
parent::__construct( $name );
$this->requestedNamespace = NS_CATEGORY;
}
+
+ /**
+ * Formats the result
+ * @param $skin The current skin
+ * @param $result The query result
+ * @return string The category link
+ */
+ function formatResult ( $skin, $result ) {
+ $title = Title::makeTitle( NS_CATEGORY, $result->title );
+ $text = $title->getText();
+
+ return Linker::linkKnown( $title, htmlspecialchars( $text ) );
+ }
}
diff --git a/includes/specials/SpecialUncategorizedimages.php b/includes/specials/SpecialUncategorizedimages.php
index 5865bf62..53aa3f34 100644
--- a/includes/specials/SpecialUncategorizedimages.php
+++ b/includes/specials/SpecialUncategorizedimages.php
@@ -60,4 +60,7 @@ class UncategorizedImagesPage extends ImageQueryPage {
);
}
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialUncategorizedpages.php b/includes/specials/SpecialUncategorizedpages.php
index 1226a6ca..b518e6fb 100644
--- a/includes/specials/SpecialUncategorizedpages.php
+++ b/includes/specials/SpecialUncategorizedpages.php
@@ -41,7 +41,10 @@ class UncategorizedPagesPage extends PageQueryPage {
function isExpensive() {
return true;
}
- function isSyndicated() { return false; }
+
+ function isSyndicated() {
+ return false;
+ }
function getQueryInfo() {
return array (
@@ -52,7 +55,7 @@ class UncategorizedPagesPage extends PageQueryPage {
// default for page_namespace is all content namespaces (if requestedNamespace is false)
// otherwise, page_namespace is requestedNamespace
'conds' => array ( 'cl_from IS NULL',
- 'page_namespace' => ( $this->requestedNamespace!==false ? $this->requestedNamespace : MWNamespace::getContentNamespaces() ),
+ 'page_namespace' => ( $this->requestedNamespace !== false ? $this->requestedNamespace : MWNamespace::getContentNamespaces() ),
'page_is_redirect' => 0 ),
'join_conds' => array ( 'categorylinks' => array (
'LEFT JOIN', 'cl_from = page_id' ) )
@@ -66,4 +69,8 @@ class UncategorizedPagesPage extends PageQueryPage {
return array( 'page_namespace', 'page_title' );
return array( 'page_title' );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialUndelete.php b/includes/specials/SpecialUndelete.php
index d8e0b97c..e0363481 100644
--- a/includes/specials/SpecialUndelete.php
+++ b/includes/specials/SpecialUndelete.php
@@ -32,7 +32,16 @@ class PageArchive {
* @var Title
*/
protected $title;
- var $fileStatus;
+
+ /**
+ * @var Status
+ */
+ protected $fileStatus;
+
+ /**
+ * @var Status
+ */
+ protected $revisionStatus;
function __construct( $title ) {
if( is_null( $title ) ) {
@@ -58,7 +67,7 @@ class PageArchive {
* given title prefix.
* Returns result wrapper with (ar_namespace, ar_title, count) fields.
*
- * @param $prefix String: title prefix
+ * @param string $prefix title prefix
* @return ResultWrapper
*/
public static function listPagesByPrefix( $prefix ) {
@@ -112,14 +121,24 @@ class PageArchive {
* @return ResultWrapper
*/
function listRevisions() {
+ global $wgContentHandlerUseDB;
+
$dbr = wfGetDB( DB_SLAVE );
+
+ $fields = array(
+ 'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text',
+ 'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1',
+ );
+
+ if ( $wgContentHandlerUseDB ) {
+ $fields[] = 'ar_content_format';
+ $fields[] = 'ar_content_model';
+ }
+
$res = $dbr->select( 'archive',
- array(
- 'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text',
- 'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1'
- ),
+ $fields,
array( 'ar_namespace' => $this->title->getNamespace(),
- 'ar_title' => $this->title->getDBkey() ),
+ 'ar_title' => $this->title->getDBkey() ),
__METHOD__,
array( 'ORDER BY' => 'ar_timestamp DESC' ) );
$ret = $dbr->resultObject( $res );
@@ -137,26 +156,9 @@ class PageArchive {
function listFiles() {
if( $this->title->getNamespace() == NS_FILE ) {
$dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'filearchive',
- array(
- 'fa_id',
- 'fa_name',
- 'fa_archive_name',
- 'fa_storage_key',
- 'fa_storage_group',
- 'fa_size',
- 'fa_width',
- 'fa_height',
- 'fa_bits',
- 'fa_metadata',
- 'fa_media_type',
- 'fa_major_mime',
- 'fa_minor_mime',
- 'fa_description',
- 'fa_user',
- 'fa_user_text',
- 'fa_timestamp',
- 'fa_deleted' ),
+ $res = $dbr->select(
+ 'filearchive',
+ ArchivedFile::selectFields(),
array( 'fa_name' => $this->title->getDBkey() ),
__METHOD__,
array( 'ORDER BY' => 'fa_timestamp DESC' ) );
@@ -174,28 +176,38 @@ class PageArchive {
* @return Revision
*/
function getRevision( $timestamp ) {
+ global $wgContentHandlerUseDB;
+
$dbr = wfGetDB( DB_SLAVE );
+
+ $fields = array(
+ 'ar_rev_id',
+ 'ar_text',
+ 'ar_comment',
+ 'ar_user',
+ 'ar_user_text',
+ 'ar_timestamp',
+ 'ar_minor_edit',
+ 'ar_flags',
+ 'ar_text_id',
+ 'ar_deleted',
+ 'ar_len',
+ 'ar_sha1',
+ );
+
+ if ( $wgContentHandlerUseDB ) {
+ $fields[] = 'ar_content_format';
+ $fields[] = 'ar_content_model';
+ }
+
$row = $dbr->selectRow( 'archive',
- array(
- 'ar_rev_id',
- 'ar_text',
- 'ar_comment',
- 'ar_user',
- 'ar_user_text',
- 'ar_timestamp',
- 'ar_minor_edit',
- 'ar_flags',
- 'ar_text_id',
- 'ar_deleted',
- 'ar_len',
- 'ar_sha1',
- ),
+ $fields,
array( 'ar_namespace' => $this->title->getNamespace(),
'ar_title' => $this->title->getDBkey(),
'ar_timestamp' => $dbr->timestamp( $timestamp ) ),
__METHOD__ );
if( $row ) {
- return Revision::newFromArchiveRow( $row, array( 'page' => $this->title->getArticleID() ) );
+ return Revision::newFromArchiveRow( $row, array( 'title' => $this->title ) );
} else {
return null;
}
@@ -218,9 +230,9 @@ class PageArchive {
$row = $dbr->selectRow( 'archive',
'ar_timestamp',
array( 'ar_namespace' => $this->title->getNamespace(),
- 'ar_title' => $this->title->getDBkey(),
- 'ar_timestamp < ' .
- $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ),
+ 'ar_title' => $this->title->getDBkey(),
+ 'ar_timestamp < ' .
+ $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ),
__METHOD__,
array(
'ORDER BY' => 'ar_timestamp DESC',
@@ -289,7 +301,7 @@ class PageArchive {
$row = $dbr->selectRow( 'archive',
array( 'ar_text', 'ar_flags', 'ar_text_id' ),
array( 'ar_namespace' => $this->title->getNamespace(),
- 'ar_title' => $this->title->getDBkey() ),
+ 'ar_title' => $this->title->getDBkey() ),
__METHOD__,
array( 'ORDER BY' => 'ar_timestamp DESC' ) );
if( $row ) {
@@ -308,7 +320,7 @@ class PageArchive {
$dbr = wfGetDB( DB_SLAVE );
$n = $dbr->selectField( 'archive', 'COUNT(ar_title)',
array( 'ar_namespace' => $this->title->getNamespace(),
- 'ar_title' => $this->title->getDBkey() ),
+ 'ar_title' => $this->title->getDBkey() ),
__METHOD__
);
return ( $n > 0 );
@@ -319,7 +331,7 @@ class PageArchive {
* Once restored, the items will be removed from the archive tables.
* The deletion log will be updated with an undeletion notice.
*
- * @param $timestamps Array: pass an empty array to restore all revisions, otherwise list the ones to undelete.
+ * @param array $timestamps pass an empty array to restore all revisions, otherwise list the ones to undelete.
* @param $comment String
* @param $fileVersions Array
* @param $unsuppress Boolean
@@ -329,8 +341,6 @@ class PageArchive {
* on success, false on failure
*/
function undelete( $timestamps, $comment = '', $fileVersions = array(), $unsuppress = false, User $user = null ) {
- global $wgUser;
-
// If both the set of text revisions and file revisions are empty,
// restore everything. Otherwise, just restore the requested items.
$restoreAll = empty( $timestamps ) && empty( $fileVersions );
@@ -341,7 +351,7 @@ class PageArchive {
if( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
$img = wfLocalFile( $this->title );
$this->fileStatus = $img->restore( $fileVersions, $unsuppress );
- if ( !$this->fileStatus->isOk() ) {
+ if ( !$this->fileStatus->isOK() ) {
return false;
}
$filesRestored = $this->fileStatus->successCount;
@@ -350,10 +360,12 @@ class PageArchive {
}
if( $restoreText ) {
- $textRestored = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
- if( $textRestored === false ) { // It must be one of UNDELETE_*
+ $this->revisionStatus = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
+ if( !$this->revisionStatus->isOK() ) {
return false;
}
+
+ $textRestored = $this->revisionStatus->getValue();
} else {
$textRestored = 0;
}
@@ -379,6 +391,7 @@ class PageArchive {
}
if ( $user === null ) {
+ global $wgUser;
$user = $wgUser;
}
@@ -386,6 +399,9 @@ class PageArchive {
$logEntry->setPerformer( $user );
$logEntry->setTarget( $this->title );
$logEntry->setComment( $reason );
+
+ wfRunHooks( 'ArticleUndeleteLogEntry', array( $this, &$logEntry, $user ) );
+
$logid = $logEntry->insert();
$logEntry->publish( $logid );
@@ -397,15 +413,18 @@ class PageArchive {
* to the cur/old tables. If the page currently exists, all revisions will
* be stuffed into old, otherwise the most recent will go into cur.
*
- * @param $timestamps Array: pass an empty array to restore all revisions, otherwise list the ones to undelete.
- * @param $comment String
+ * @param array $timestamps pass an empty array to restore all revisions, otherwise list the ones to undelete.
* @param $unsuppress Boolean: remove all ar_deleted/fa_deleted restrictions of seletected revs
*
- * @return Mixed: number of revisions restored or false on failure
+ * @param $comment String
+ * @throws ReadOnlyError
+ * @return Status, containing the number of revisions restored on success
*/
private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
+ global $wgContentHandlerUseDB;
+
if ( wfReadOnly() ) {
- return false;
+ throw new ReadOnlyError();
}
$restoreAll = empty( $timestamps );
@@ -420,7 +439,7 @@ class PageArchive {
$page = $dbw->selectRow( 'page',
array( 'page_id', 'page_latest' ),
array( 'page_namespace' => $this->title->getNamespace(),
- 'page_title' => $this->title->getDBkey() ),
+ 'page_title' => $this->title->getDBkey() ),
__METHOD__,
array( 'FOR UPDATE' ) // lock page
);
@@ -428,16 +447,21 @@ class PageArchive {
$makepage = false;
# Page already exists. Import the history, and if necessary
# we'll update the latest revision field in the record.
- $newid = 0;
- $pageId = $page->page_id;
- $previousRevId = $page->page_latest;
+
+ $previousRevId = $page->page_latest;
+
# Get the time span of this page
$previousTimestamp = $dbw->selectField( 'revision', 'rev_timestamp',
array( 'rev_id' => $previousRevId ),
__METHOD__ );
+
if( $previousTimestamp === false ) {
- wfDebug( __METHOD__.": existing page refers to a page_latest that does not exist\n" );
- return 0;
+ wfDebug( __METHOD__ . ": existing page refers to a page_latest that does not exist\n" );
+
+ $status = Status::newGood( 0 );
+ $status->warning( 'undeleterevision-missing' );
+
+ return $status;
}
} else {
# Have to create a new article...
@@ -457,24 +481,32 @@ class PageArchive {
$oldones = "ar_timestamp IN ( {$oldts} )";
}
+ $fields = array(
+ 'ar_rev_id',
+ 'ar_text',
+ 'ar_comment',
+ 'ar_user',
+ 'ar_user_text',
+ 'ar_timestamp',
+ 'ar_minor_edit',
+ 'ar_flags',
+ 'ar_text_id',
+ 'ar_deleted',
+ 'ar_page_id',
+ 'ar_len',
+ 'ar_sha1'
+ );
+
+ if ( $wgContentHandlerUseDB ) {
+ $fields[] = 'ar_content_format';
+ $fields[] = 'ar_content_model';
+ }
+
/**
* Select each archived revision...
*/
$result = $dbw->select( 'archive',
- /* fields */ array(
- 'ar_rev_id',
- 'ar_text',
- 'ar_comment',
- 'ar_user',
- 'ar_user_text',
- 'ar_timestamp',
- 'ar_minor_edit',
- 'ar_flags',
- 'ar_text_id',
- 'ar_deleted',
- 'ar_page_id',
- 'ar_len',
- 'ar_sha1' ),
+ $fields,
/* WHERE */ array(
'ar_namespace' => $this->title->getNamespace(),
'ar_title' => $this->title->getDBkey(),
@@ -486,29 +518,51 @@ class PageArchive {
$rev_count = $dbw->numRows( $result );
if( !$rev_count ) {
wfDebug( __METHOD__ . ": no revisions to restore\n" );
- return false; // ???
+
+ $status = Status::newGood( 0 );
+ $status->warning( "undelete-no-results" );
+ return $status;
}
$ret->seek( $rev_count - 1 ); // move to last
$row = $ret->fetchObject(); // get newest archived rev
$ret->seek( 0 ); // move back
+ // grab the content to check consistency with global state before restoring the page.
+ $revision = Revision::newFromArchiveRow( $row,
+ array(
+ 'title' => $article->getTitle(), // used to derive default content model
+ )
+ );
+ $user = User::newFromName( $revision->getRawUserText(), false );
+ $content = $revision->getContent( Revision::RAW );
+
+ //NOTE: article ID may not be known yet. prepareSave() should not modify the database.
+ $status = $content->prepareSave( $article, 0, -1, $user );
+
+ if ( !$status->isOK() ) {
+ return $status;
+ }
+
if( $makepage ) {
// Check the state of the newest to-be version...
if( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
- return false; // we can't leave the current revision like this!
+ return Status::newFatal( "undeleterevdel" );
}
// Safe to insert now...
- $newid = $article->insertOn( $dbw );
+ $newid = $article->insertOn( $dbw );
$pageId = $newid;
} else {
// Check if a deleted revision will become the current revision...
if( $row->ar_timestamp > $previousTimestamp ) {
// Check the state of the newest to-be version...
if( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
- return false; // we can't leave the current revision like this!
+ return Status::newFatal( "undeleterevdel" );
}
}
+
+ $newid = false;
+ $pageId = $article->getId();
}
$revision = null;
@@ -528,6 +582,7 @@ class PageArchive {
$revision = Revision::newFromArchiveRow( $row,
array(
'page' => $pageId,
+ 'title' => $this->title,
'deleted' => $unsuppress ? 0 : $row->ar_deleted
) );
@@ -546,7 +601,7 @@ class PageArchive {
// Was anything restored at all?
if ( $restored == 0 ) {
- return 0;
+ return Status::newGood( 0 );
}
$created = (bool)$newid;
@@ -566,13 +621,18 @@ class PageArchive {
$update->doUpdate();
}
- return $restored;
+ return Status::newGood( $restored );
}
/**
* @return Status
*/
function getFileStatus() { return $this->fileStatus; }
+
+ /**
+ * @return Status
+ */
+ function getRevisionStatus() { return $this->revisionStatus; }
}
/**
@@ -721,7 +781,7 @@ class SpecialUndelete extends SpecialPage {
'action' => $wgScript ) ) .
Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) .
Html::hidden( 'title',
- $this->getTitle()->getPrefixedDbKey() ) .
+ $this->getTitle()->getPrefixedDBkey() ) .
Xml::inputLabel( $this->msg( 'undelete-search-prefix' )->text(),
'prefix', 'prefix', 20,
$this->mSearchPrefix ) . ' ' .
@@ -748,7 +808,7 @@ class SpecialUndelete extends SpecialPage {
if( $result->numRows() == 0 ) {
$out->addWikiMsg( 'undelete-no-results' );
- return;
+ return false;
}
$out->addWikiMsg( 'undeletepagetext', $this->getLanguage()->formatNum( $result->numRows() ) );
@@ -780,11 +840,13 @@ class SpecialUndelete extends SpecialPage {
private function showRevision( $timestamp ) {
if( !preg_match( '/[0-9]{14}/', $timestamp ) ) {
- return 0;
+ return;
}
$archive = new PageArchive( $this->mTargetObj );
- wfRunHooks( 'UndeleteForm::showRevision', array( &$archive, $this->mTargetObj ) );
+ if ( !wfRunHooks( 'UndeleteForm::showRevision', array( &$archive, $this->mTargetObj ) ) ) {
+ return;
+ }
$rev = $archive->getRevision( $timestamp );
$out = $this->getOutput();
@@ -834,7 +896,11 @@ class SpecialUndelete extends SpecialPage {
$t = $lang->userTime( $timestamp, $user );
$userLink = Linker::revUserTools( $rev );
- if( $this->mPreview ) {
+ $content = $rev->getContent( Revision::FOR_THIS_USER, $user );
+
+ $isText = ( $content instanceof TextContent );
+
+ if( $this->mPreview || $isText ) {
$openDiv = '<div id="mw-undelete-revision" class="mw-warning">';
} else {
$openDiv = '<div id="mw-undelete-revision">';
@@ -851,30 +917,55 @@ class SpecialUndelete extends SpecialPage {
$out->addHTML( $this->msg( 'undelete-revision' )->rawParams( $link )->params(
$time )->rawParams( $userLink )->params( $d, $t )->parse() . '</div>' );
- wfRunHooks( 'UndeleteShowRevision', array( $this->mTargetObj, $rev ) );
- if( $this->mPreview ) {
+ if ( !wfRunHooks( 'UndeleteShowRevision', array( $this->mTargetObj, $rev ) ) ) {
+ return;
+ }
+
+ if( $this->mPreview || !$isText ) {
+ // NOTE: non-text content has no source view, so always use rendered preview
+
// Hide [edit]s
$popts = $out->parserOptions();
$popts->setEditSection( false );
- $out->parserOptions( $popts );
- $out->addWikiTextTitleTidy( $rev->getText( Revision::FOR_THIS_USER, $user ), $this->mTargetObj, true );
+
+ $pout = $content->getParserOutput( $this->mTargetObj, $rev->getId(), $popts, true );
+ $out->addParserOutput( $pout );
}
+ if ( $isText ) {
+ // source view for textual content
+ $sourceView = Xml::element( 'textarea', array(
+ 'readonly' => 'readonly',
+ 'cols' => $user->getIntOption( 'cols' ),
+ 'rows' => $user->getIntOption( 'rows' ) ),
+ $content->getNativeData() . "\n" );
+
+ $previewButton = Xml::element( 'input', array(
+ 'type' => 'submit',
+ 'name' => 'preview',
+ 'value' => $this->msg( 'showpreview' )->text() ) );
+ } else {
+ $sourceView = '';
+ $previewButton = '';
+ }
+
+ $diffButton = Xml::element( 'input', array(
+ 'name' => 'diff',
+ 'type' => 'submit',
+ 'value' => $this->msg( 'showdiff' )->text() ) );
+
$out->addHTML(
- Xml::element( 'textarea', array(
- 'readonly' => 'readonly',
- 'cols' => intval( $user->getOption( 'cols' ) ),
- 'rows' => intval( $user->getOption( 'rows' ) ) ),
- $rev->getText( Revision::FOR_THIS_USER, $user ) . "\n" ) .
- Xml::openElement( 'div' ) .
+ $sourceView .
+ Xml::openElement( 'div', array(
+ 'style' => 'clear: both' ) ) .
Xml::openElement( 'form', array(
'method' => 'post',
'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ) ) ) .
Xml::element( 'input', array(
'type' => 'hidden',
'name' => 'target',
- 'value' => $this->mTargetObj->getPrefixedDbKey() ) ) .
+ 'value' => $this->mTargetObj->getPrefixedDBkey() ) ) .
Xml::element( 'input', array(
'type' => 'hidden',
'name' => 'timestamp',
@@ -883,14 +974,8 @@ class SpecialUndelete extends SpecialPage {
'type' => 'hidden',
'name' => 'wpEditToken',
'value' => $user->getEditToken() ) ) .
- Xml::element( 'input', array(
- 'type' => 'submit',
- 'name' => 'preview',
- 'value' => $this->msg( 'showpreview' )->text() ) ) .
- Xml::element( 'input', array(
- 'name' => 'diff',
- 'type' => 'submit',
- 'value' => $this->msg( 'showdiff' )->text() ) ) .
+ $previewButton .
+ $diffButton .
Xml::closeElement( 'form' ) .
Xml::closeElement( 'div' ) );
}
@@ -904,26 +989,30 @@ class SpecialUndelete extends SpecialPage {
* @return String: HTML
*/
function showDiff( $previousRev, $currentRev ) {
- $diffEngine = new DifferenceEngine( $this->getContext() );
+ $diffContext = clone $this->getContext();
+ $diffContext->setTitle( $currentRev->getTitle() );
+ $diffContext->setWikiPage( WikiPage::factory( $currentRev->getTitle() ) );
+
+ $diffEngine = $currentRev->getContentHandler()->createDifferenceEngine( $diffContext );
$diffEngine->showDiffStyle();
$this->getOutput()->addHTML(
"<div>" .
- "<table width='98%' cellpadding='0' cellspacing='4' class='diff'>" .
+ "<table style='width: 98%;' cellpadding='0' cellspacing='4' class='diff'>" .
"<col class='diff-marker' />" .
"<col class='diff-content' />" .
"<col class='diff-marker' />" .
"<col class='diff-content' />" .
"<tr>" .
- "<td colspan='2' width='50%' style='text-align: center' class='diff-otitle'>" .
+ "<td colspan='2' style='width: 50%; text-align: center' class='diff-otitle'>" .
$this->diffHeader( $previousRev, 'o' ) .
"</td>\n" .
- "<td colspan='2' width='50%' style='text-align: center' class='diff-ntitle'>" .
+ "<td colspan='2' style='width: 50%; text-align: center' class='diff-ntitle'>" .
$this->diffHeader( $currentRev, 'n' ) .
"</td>\n" .
"</tr>" .
- $diffEngine->generateDiffBody(
- $previousRev->getText( Revision::FOR_THIS_USER, $this->getUser() ),
- $currentRev->getText( Revision::FOR_THIS_USER, $this->getUser() ) ) .
+ $diffEngine->generateContentDiffBody(
+ $previousRev->getContent( Revision::FOR_THIS_USER, $this->getUser() ),
+ $currentRev->getContent( Revision::FOR_THIS_USER, $this->getUser() ) ) .
"</table>" .
"</div>\n"
);
@@ -967,10 +1056,10 @@ class SpecialUndelete extends SpecialPage {
$targetQuery
) .
'</strong></div>' .
- '<div id="mw-diff-'.$prefix.'title2">' .
+ '<div id="mw-diff-' . $prefix . 'title2">' .
Linker::revUserTools( $rev ) . '<br />' .
'</div>' .
- '<div id="mw-diff-'.$prefix.'title3">' .
+ '<div id="mw-diff-' . $prefix . 'title3">' .
Linker::revComment( $rev ) . $rdel . '<br />' .
'</div>';
}
@@ -1122,7 +1211,7 @@ class SpecialUndelete extends SpecialPage {
Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) .
"</td>
<td class='mw-input'>" .
- Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
+ Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
"</td>
</tr>
<tr>
@@ -1169,7 +1258,7 @@ class SpecialUndelete extends SpecialPage {
if ( $this->mAllowed ) {
# Slip in the hidden controls here
- $misc = Html::hidden( 'target', $this->mTarget );
+ $misc = Html::hidden( 'target', $this->mTarget );
$misc .= Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() );
$misc .= Xml::closeElement( 'form' );
$out->addHTML( $misc );
@@ -1180,7 +1269,10 @@ class SpecialUndelete extends SpecialPage {
private function formatRevisionRow( $row, $earliestLiveTime, $remaining ) {
$rev = Revision::newFromArchiveRow( $row,
- array( 'page' => $this->mTargetObj->getArticleID() ) );
+ array(
+ 'title' => $this->mTargetObj
+ ) );
+
$revTextSize = '';
$ts = wfTimestamp( TS_MW, $row->ar_timestamp );
// Build checkboxen...
@@ -1237,7 +1329,7 @@ class SpecialUndelete extends SpecialPage {
// Revision delete links
$revdlink = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
- $revisionRow = $this->msg( 'undelete-revisionrow' )->rawParams( $checkBox, $revdlink, $last, $pageLink , $userLink, $revTextSize, $comment )->escaped();
+ $revisionRow = $this->msg( 'undelete-revisionrow' )->rawParams( $checkBox, $revdlink, $last, $pageLink, $userLink, $revTextSize, $comment )->escaped();
return "<li>$revisionRow</li>";
}
@@ -1286,7 +1378,7 @@ class SpecialUndelete extends SpecialPage {
*
* @param $rev Revision
* @param $titleObj Title
- * @param $ts string Timestamp
+ * @param string $ts Timestamp
* @return string
*/
function getPageLink( $rev, $titleObj, $ts ) {
@@ -1317,8 +1409,8 @@ class SpecialUndelete extends SpecialPage {
*
* @param $file File
* @param $titleObj Title
- * @param $ts string A timestamp
- * @param $key String: a storage key
+ * @param string $ts A timestamp
+ * @param string $key a storage key
*
* @return String: HTML fragment
*/
@@ -1417,14 +1509,22 @@ class SpecialUndelete extends SpecialPage {
$out->addHTML( $this->msg( 'undeletedpage' )->rawParams( $link )->parse() );
} else {
$out->setPageTitle( $this->msg( 'undelete-error' ) );
- $out->addWikiMsg( 'cannotundelete' );
- $out->addWikiMsg( 'undeleterevdel' );
}
- // Show file deletion warnings and errors
+ // Show revision undeletion warnings and errors
+ $status = $archive->getRevisionStatus();
+ if( $status && !$status->isGood() ) {
+ $out->addWikiText( '<div class="error">' . $status->getWikiText( 'cannotundelete', 'cannotundelete' ) . '</div>' );
+ }
+
+ // Show file undeletion warnings and errors
$status = $archive->getFileStatus();
if( $status && !$status->isGood() ) {
$out->addWikiText( '<div class="error">' . $status->getWikiText( 'undelete-error-short', 'undelete-error-long' ) . '</div>' );
}
}
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
diff --git a/includes/specials/SpecialUnlockdb.php b/includes/specials/SpecialUnlockdb.php
index 2e772540..35141d80 100644
--- a/includes/specials/SpecialUnlockdb.php
+++ b/includes/specials/SpecialUnlockdb.php
@@ -84,4 +84,8 @@ class SpecialUnlockdb extends FormSpecialPage {
$out->addSubtitle( $this->msg( 'unlockdbsuccesssub' ) );
$out->addWikiMsg( 'unlockdbsuccesstext' );
}
+
+ protected function getGroupName() {
+ return 'wiki';
+ }
}
diff --git a/includes/specials/SpecialUnusedcategories.php b/includes/specials/SpecialUnusedcategories.php
index 1bd38e17..6b91dd39 100644
--- a/includes/specials/SpecialUnusedcategories.php
+++ b/includes/specials/SpecialUnusedcategories.php
@@ -26,7 +26,9 @@
*/
class UnusedCategoriesPage extends QueryPage {
- function isExpensive() { return true; }
+ function isExpensive() {
+ return true;
+ }
function __construct( $name = 'Unusedcategories' ) {
parent::__construct( $name );
@@ -62,4 +64,8 @@ class UnusedCategoriesPage extends QueryPage {
$title = Title::makeTitle( NS_CATEGORY, $result->title );
return Linker::link( $title, htmlspecialchars( $title->getText() ) );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialUnusedimages.php b/includes/specials/SpecialUnusedimages.php
index cdab557e..69553282 100644
--- a/includes/specials/SpecialUnusedimages.php
+++ b/includes/specials/SpecialUnusedimages.php
@@ -80,4 +80,7 @@ class UnusedimagesPage extends ImageQueryPage {
return $this->msg( 'unusedimagestext' )->parseAsBlock();
}
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialUnusedtemplates.php b/includes/specials/SpecialUnusedtemplates.php
index 06077d1f..493e936a 100644
--- a/includes/specials/SpecialUnusedtemplates.php
+++ b/includes/specials/SpecialUnusedtemplates.php
@@ -35,9 +35,17 @@ class UnusedtemplatesPage extends QueryPage {
parent::__construct( $name );
}
- function isExpensive() { return true; }
- function isSyndicated() { return false; }
- function sortDescending() { return false; }
+ function isExpensive() {
+ return true;
+ }
+
+ function isSyndicated() {
+ return false;
+ }
+
+ function sortDescending() {
+ return false;
+ }
function getQueryInfo() {
return array (
@@ -77,4 +85,8 @@ class UnusedtemplatesPage extends QueryPage {
function getPageHeader() {
return $this->msg( 'unusedtemplatestext' )->parseAsBlock();
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialUnwatchedpages.php b/includes/specials/SpecialUnwatchedpages.php
index e5a79413..05ec6b02 100644
--- a/includes/specials/SpecialUnwatchedpages.php
+++ b/includes/specials/SpecialUnwatchedpages.php
@@ -35,8 +35,13 @@ class UnwatchedpagesPage extends QueryPage {
parent::__construct( $name, 'unwatchedpages' );
}
- function isExpensive() { return true; }
- function isSyndicated() { return false; }
+ function isExpensive() {
+ return true;
+ }
+
+ function isSyndicated() {
+ return false;
+ }
function getQueryInfo() {
return array (
@@ -54,7 +59,9 @@ class UnwatchedpagesPage extends QueryPage {
);
}
- function sortDescending() { return false; }
+ function sortDescending() {
+ return false;
+ }
function getOrderFields() {
return array( 'page_namespace', 'page_title' );
@@ -87,4 +94,8 @@ class UnwatchedpagesPage extends QueryPage {
return $this->getLanguage()->specialList( $plink, $wlink );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialUpload.php b/includes/specials/SpecialUpload.php
index 43ea345b..89c06b2a 100644
--- a/includes/specials/SpecialUpload.php
+++ b/includes/specials/SpecialUpload.php
@@ -39,7 +39,7 @@ class SpecialUpload extends SpecialPage {
}
/** Misc variables **/
- public $mRequest; // The WebRequest or FauxRequest this form is supposed to handle
+ public $mRequest; // The WebRequest or FauxRequest this form is supposed to handle
public $mSourceType;
/**
@@ -54,7 +54,7 @@ class SpecialUpload extends SpecialPage {
public $mUploadClicked;
/** User input variables from the "description" section **/
- public $mDesiredDestName; // The requested target file name
+ public $mDesiredDestName; // The requested target file name
public $mComment;
public $mLicense;
@@ -66,10 +66,10 @@ class SpecialUpload extends SpecialPage {
/** Hidden variables **/
public $mDestWarningAck;
- public $mForReUpload; // The user followed an "overwrite this file" link
- public $mCancelUpload; // The user clicked "Cancel and return to upload form" button
+ public $mForReUpload; // The user followed an "overwrite this file" link
+ public $mCancelUpload; // The user clicked "Cancel and return to upload form" button
public $mTokenOk;
- public $mUploadSuccessful = false; // Subclasses can use this to determine whether a file was uploaded
+ public $mUploadSuccessful = false; // Subclasses can use this to determine whether a file was uploaded
/** Text injection points for hooks not using HTMLForm **/
public $uploadFormTextTop;
@@ -82,32 +82,30 @@ class SpecialUpload extends SpecialPage {
*/
protected function loadRequest() {
$this->mRequest = $request = $this->getRequest();
- $this->mSourceType = $request->getVal( 'wpSourceType', 'file' );
- $this->mUpload = UploadBase::createFromRequest( $request );
- $this->mUploadClicked = $request->wasPosted()
+ $this->mSourceType = $request->getVal( 'wpSourceType', 'file' );
+ $this->mUpload = UploadBase::createFromRequest( $request );
+ $this->mUploadClicked = $request->wasPosted()
&& ( $request->getCheck( 'wpUpload' )
|| $request->getCheck( 'wpUploadIgnoreWarning' ) );
// Guess the desired name from the filename if not provided
- $this->mDesiredDestName = $request->getText( 'wpDestFile' );
+ $this->mDesiredDestName = $request->getText( 'wpDestFile' );
if( !$this->mDesiredDestName && $request->getFileName( 'wpUploadFile' ) !== null ) {
$this->mDesiredDestName = $request->getFileName( 'wpUploadFile' );
}
- $this->mComment = $request->getText( 'wpUploadDescription' );
- $this->mLicense = $request->getText( 'wpLicense' );
+ $this->mComment = $request->getText( 'wpUploadDescription' );
+ $this->mLicense = $request->getText( 'wpLicense' );
-
- $this->mDestWarningAck = $request->getText( 'wpDestFileWarningAck' );
- $this->mIgnoreWarning = $request->getCheck( 'wpIgnoreWarning' )
+ $this->mDestWarningAck = $request->getText( 'wpDestFileWarningAck' );
+ $this->mIgnoreWarning = $request->getCheck( 'wpIgnoreWarning' )
|| $request->getCheck( 'wpUploadIgnoreWarning' );
- $this->mWatchthis = $request->getBool( 'wpWatchthis' ) && $this->getUser()->isLoggedIn();
- $this->mCopyrightStatus = $request->getText( 'wpUploadCopyStatus' );
- $this->mCopyrightSource = $request->getText( 'wpUploadSource' );
-
+ $this->mWatchthis = $request->getBool( 'wpWatchthis' ) && $this->getUser()->isLoggedIn();
+ $this->mCopyrightStatus = $request->getText( 'wpUploadCopyStatus' );
+ $this->mCopyrightSource = $request->getText( 'wpUploadSource' );
- $this->mForReUpload = $request->getBool( 'wpForReUpload' ); // updating a file
- $this->mCancelUpload = $request->getCheck( 'wpCancelUpload' )
- || $request->getCheck( 'wpReUpload' ); // b/w compat
+ $this->mForReUpload = $request->getBool( 'wpForReUpload' ); // updating a file
+ $this->mCancelUpload = $request->getCheck( 'wpCancelUpload' )
+ || $request->getCheck( 'wpReUpload' ); // b/w compat
// If it was posted check for the token (no remote POST'ing with user credentials)
$token = $request->getVal( 'wpEditToken' );
@@ -209,8 +207,8 @@ class SpecialUpload extends SpecialPage {
/**
* Get an UploadForm instance with title and text properly set.
*
- * @param $message String: HTML string to add to the form
- * @param $sessionKey String: session key in case this is a stashed upload
+ * @param string $message HTML string to add to the form
+ * @param string $sessionKey session key in case this is a stashed upload
* @param $hideIgnoreWarning Boolean: whether to hide "ignore warning" check box
* @return UploadForm
*/
@@ -246,9 +244,9 @@ class SpecialUpload extends SpecialPage {
LogEventsList::showLogExtract( $delNotice, array( 'delete', 'move' ),
$desiredTitleObj,
'', array( 'lim' => 10,
- 'conds' => array( "log_action != 'revision'" ),
- 'showIfEmpty' => false,
- 'msgKey' => array( 'upload-recreate-warning' ) )
+ 'conds' => array( "log_action != 'revision'" ),
+ 'showIfEmpty' => false,
+ 'msgKey' => array( 'upload-recreate-warning' ) )
);
}
$form->addPreText( $delNotice );
@@ -300,7 +298,7 @@ class SpecialUpload extends SpecialPage {
* essentially means that UploadBase::VERIFICATION_ERROR and
* UploadBase::EMPTY_FILE should not be passed here.
*
- * @param $message String: HTML message to be passed to mainUploadForm
+ * @param string $message HTML message to be passed to mainUploadForm
*/
protected function showRecoverableUploadError( $message ) {
$sessionKey = $this->mUpload->stashSession();
@@ -312,12 +310,12 @@ class SpecialUpload extends SpecialPage {
$this->showUploadForm( $form );
}
/**
- * Stashes the upload, shows the main form, but adds an "continue anyway button".
+ * Stashes the upload, shows the main form, but adds a "continue anyway button".
* Also checks whether there are actually warnings to display.
*
* @param $warnings Array
* @return boolean true if warnings were displayed, false if there are no
- * warnings and the should continue processing like there was no warning
+ * warnings and it should continue processing
*/
protected function showUploadWarning( $warnings ) {
# If there are no warnings, or warnings we can ignore, return early.
@@ -336,6 +334,9 @@ class SpecialUpload extends SpecialPage {
$warningHtml = '<h2>' . $this->msg( 'uploadwarning' )->escaped() . "</h2>\n"
. '<ul class="warning">';
foreach( $warnings as $warning => $args ) {
+ if( $warning == 'badfilename' ) {
+ $this->mDesiredDestName = Title::makeTitle( NS_FILE, $args )->getText();
+ }
if( $warning == 'exists' ) {
$msg = "\t<li>" . self::getExistsWarning( $args ) . "</li>\n";
} elseif( $warning == 'duplicate' ) {
@@ -371,7 +372,7 @@ class SpecialUpload extends SpecialPage {
/**
* Show the upload form with error message, but do not stash the file.
*
- * @param $message string HTML string
+ * @param string $message HTML string
*/
protected function showUploadError( $message ) {
$message = '<h2>' . $this->msg( 'uploadwarning' )->escaped() . "</h2>\n" .
@@ -473,17 +474,17 @@ class SpecialUpload extends SpecialPage {
if ( $wgUseCopyrightUpload ) {
$licensetxt = '';
if ( $license != '' ) {
- $licensetxt = '== ' . $msg[ 'license-header' ] . " ==\n" . '{{' . $license . '}}' . "\n";
+ $licensetxt = '== ' . $msg['license-header'] . " ==\n" . '{{' . $license . '}}' . "\n";
}
- $pageText = '== ' . $msg[ 'filedesc' ] . " ==\n" . $comment . "\n" .
- '== ' . $msg[ 'filestatus' ] . " ==\n" . $copyStatus . "\n" .
+ $pageText = '== ' . $msg['filedesc'] . " ==\n" . $comment . "\n" .
+ '== ' . $msg['filestatus'] . " ==\n" . $copyStatus . "\n" .
"$licensetxt" .
- '== ' . $msg[ 'filesource' ] . " ==\n" . $source;
+ '== ' . $msg['filesource'] . " ==\n" . $source;
} else {
if ( $license != '' ) {
- $filedesc = $comment == '' ? '' : '== ' . $msg[ 'filedesc' ] . " ==\n" . $comment . "\n";
+ $filedesc = $comment == '' ? '' : '== ' . $msg['filedesc'] . " ==\n" . $comment . "\n";
$pageText = $filedesc .
- '== ' . $msg[ 'license-header' ] . " ==\n" . '{{' . $license . '}}' . "\n";
+ '== ' . $msg['license-header'] . " ==\n" . '{{' . $license . '}}' . "\n";
} else {
$pageText = $comment;
}
@@ -520,11 +521,11 @@ class SpecialUpload extends SpecialPage {
}
}
-
/**
* Provides output to the user for a result of UploadBase::verifyUpload
*
- * @param $details Array: result of UploadBase::verifyUpload
+ * @param array $details result of UploadBase::verifyUpload
+ * @throws MWException
*/
protected function processVerificationError( $details ) {
global $wgFileExtensions;
@@ -622,7 +623,7 @@ class SpecialUpload extends SpecialPage {
* Formats a result of UploadBase::getExistsWarning as HTML
* This check is static and can be done pre-upload via AJAX
*
- * @param $exists Array: the result of UploadBase::getExistsWarning
+ * @param array $exists the result of UploadBase::getExistsWarning
* @return String: empty string if there is no warning or an HTML fragment
*/
public static function getExistsWarning( $exists ) {
@@ -645,7 +646,7 @@ class SpecialUpload extends SpecialPage {
$exists['normalizedFile']->getTitle()->getPrefixedText() )->parse();
} elseif ( $exists['warning'] == 'thumb' ) {
// Swapped argument order compared with other messages for backwards compatibility
- $warning = wfMessage( 'fileexists-thumbnail-yes',
+ $warning = wfMessage( 'fileexists-thumbnail-yes',
$exists['thumbFile']->getTitle()->getPrefixedText(), $filename )->parse();
} elseif ( $exists['warning'] == 'thumb-name' ) {
// Image w/o '180px-' does not exists, but we do not like these filenames
@@ -675,7 +676,7 @@ class SpecialUpload extends SpecialPage {
/**
* Get a list of warnings
*
- * @param $filename String: local filename, e.g. 'file exists', 'non-descriptive filename'
+ * @param string $filename local filename, e.g. 'file exists', 'non-descriptive filename'
* @return Array: list of warning messages
*/
public static function ajaxGetExistsWarning( $filename ) {
@@ -716,6 +717,9 @@ class SpecialUpload extends SpecialPage {
$gallery->toHtml() . "</li>\n";
}
+ protected function getGroupName() {
+ return 'media';
+ }
}
/**
@@ -789,6 +793,8 @@ class UploadForm extends HTMLForm {
* @return Array: descriptor array
*/
protected function getSourceSection() {
+ global $wgCopyUploadsFromSpecialUpload;
+
if ( $this->mSessionKey ) {
return array(
'SessionKey' => array(
@@ -802,7 +808,9 @@ class UploadForm extends HTMLForm {
);
}
- $canUploadByUrl = UploadFromUrl::isEnabled() && UploadFromUrl::isAllowed( $this->getUser() );
+ $canUploadByUrl = UploadFromUrl::isEnabled()
+ && UploadFromUrl::isAllowed( $this->getUser() )
+ && $wgCopyUploadsFromSpecialUpload;
$radio = $canUploadByUrl;
$selectedSourceType = strtolower( $this->getRequest()->getText( 'wpSourceType', 'File' ) );
@@ -946,7 +954,7 @@ class UploadForm extends HTMLForm {
? 'filereuploadsummary'
: 'fileuploadsummary',
'default' => $this->mComment,
- 'cols' => intval( $this->getUser()->getOption( 'cols' ) ),
+ 'cols' => $this->getUser()->getIntOption( 'cols' ),
'rows' => 8,
)
);
@@ -1077,7 +1085,6 @@ class UploadForm extends HTMLForm {
$out = $this->getOutput();
$out->addJsConfigVars( $scriptVars );
-
$out->addModules( array(
'mediawiki.action.edit', // For <charinsert> support
'mediawiki.legacy.upload', // Old form stuff...
@@ -1106,7 +1113,7 @@ class UploadSourceField extends HTMLTextField {
* @return string
*/
function getLabelHtml( $cellAttributes = array() ) {
- $id = "wpSourceType{$this->mParams['upload-type']}";
+ $id = $this->mParams['id'];
$label = Html::rawElement( 'label', array( 'for' => $id ), $this->mLabel );
if ( !empty( $this->mParams['radio'] ) ) {
@@ -1134,4 +1141,3 @@ class UploadSourceField extends HTMLTextField {
: 60;
}
}
-
diff --git a/includes/specials/SpecialUploadStash.php b/includes/specials/SpecialUploadStash.php
index 1a00d731..ddf0c6da 100644
--- a/includes/specials/SpecialUploadStash.php
+++ b/includes/specials/SpecialUploadStash.php
@@ -57,7 +57,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
/**
* Execute page -- can output a file directly or show a listing of them.
*
- * @param $subPage String: subpage, e.g. in http://example.com/wiki/Special:UploadStash/foo.jpg, the "foo.jpg" part
+ * @param string $subPage subpage, e.g. in http://example.com/wiki/Special:UploadStash/foo.jpg, the "foo.jpg" part
* @return Boolean: success
*/
public function execute( $subPage ) {
@@ -73,7 +73,8 @@ class SpecialUploadStash extends UnlistedSpecialPage {
* If file available in stash, cats it out to the client as a simple HTTP response.
* n.b. Most sanity checking done in UploadStashLocalFile, so this is straightforward.
*
- * @param $key String: the key of a particular requested file
+ * @param string $key the key of a particular requested file
+ * @throws HttpError
* @return bool
*/
public function showUpload( $key ) {
@@ -113,6 +114,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
* application the transform parameters
*
* @param string $key
+ * @throws UploadStashBadPathException
* @return array
*/
private function parseKey( $key ) {
@@ -164,10 +166,11 @@ class SpecialUploadStash extends UnlistedSpecialPage {
/**
* Scale a file (probably with a locally installed imagemagick, or similar) and output it to STDOUT.
- * @param $file: File object
- * @param $params: scaling parameters ( e.g. array( width => '50' ) );
- * @param $flags: scaling flags ( see File:: constants )
+ * @param $file File
+ * @param array $params Scaling parameters ( e.g. array( width => '50' ) );
+ * @param int $flags Scaling flags ( see File:: constants )
* @throws MWException
+ * @throws UploadStashFileNotFoundException
* @return boolean success
*/
private function outputLocallyScaledThumb( $file, $params, $flags ) {
@@ -189,7 +192,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
// now we should construct a File, so we can get mime and other such info in a standard way
// n.b. mimetype may be different from original (ogx original -> jpeg thumb)
- $thumbFile = new UnregisteredLocalFile( false,
+ $thumbFile = new UnregisteredLocalFile( false,
$this->stash->repo, $thumbnailImage->getStoragePath(), false );
if ( !$thumbFile ) {
throw new UploadStashFileNotFoundException( "couldn't create local file object for thumbnail" );
@@ -258,6 +261,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
* Side effect: writes HTTP response to STDOUT.
*
* @param $file File object with a local path (e.g. UnregisteredLocalFile, LocalFile. Oddly these don't share an ancestor!)
+ * @throws SpecialUploadStashTooLargeException
* @return bool
*/
private function outputLocalFile( File $file ) {
@@ -273,8 +277,9 @@ class SpecialUploadStash extends UnlistedSpecialPage {
/**
* Output HTTP response of raw content
* Side effect: writes HTTP response to STDOUT.
- * @param $content String content
- * @param $contentType String mime type
+ * @param string $content content
+ * @param string $contentType mime type
+ * @throws SpecialUploadStashTooLargeException
* @return bool
*/
private function outputContents( $content, $contentType ) {
@@ -291,8 +296,8 @@ class SpecialUploadStash extends UnlistedSpecialPage {
* Output headers for streaming
* XXX unsure about encoding as binary; if we received from HTTP perhaps we should use that encoding, concatted with semicolon to mimeType as it usually is.
* Side effect: preps PHP to write headers to STDOUT.
- * @param String $contentType : string suitable for content-type header
- * @param String $size: length in bytes
+ * @param string $contentType : string suitable for content-type header
+ * @param string $size: length in bytes
*/
private static function outputFileHeaders( $contentType, $size ) {
header( "Content-Type: $contentType", true );
@@ -322,14 +327,9 @@ class SpecialUploadStash extends UnlistedSpecialPage {
/**
* Default action when we don't have a subpage -- just show links to the uploads we have,
* Also show a button to clear stashed files
- * @param $status [optional] Status: the result of processRequest
* @return bool
*/
- private function showUploads( $status = null ) {
- if ( $status === null ) {
- $status = Status::newGood();
- }
-
+ private function showUploads() {
// sets the title, etc.
$this->setHeaders();
$this->outputHeader();
@@ -344,7 +344,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
'name' => 'clear',
)
), $this->getContext(), 'clearStashedUploads' );
- $form->setSubmitCallback( array( __CLASS__ , 'tryClearStashedUploads' ) );
+ $form->setSubmitCallback( array( __CLASS__, 'tryClearStashedUploads' ) );
$form->setTitle( $this->getTitle() );
$form->setSubmitTextMsg( 'uploadstash-clear' );
diff --git a/includes/specials/SpecialUserlogin.php b/includes/specials/SpecialUserlogin.php
index 58da77da..eef66914 100644
--- a/includes/specials/SpecialUserlogin.php
+++ b/includes/specials/SpecialUserlogin.php
@@ -95,9 +95,9 @@ class LoginForm extends SpecialPage {
$this->mReason = $request->getText( 'wpReason' );
$this->mCookieCheck = $request->getVal( 'wpCookieCheck' );
$this->mPosted = $request->wasPosted();
- $this->mCreateaccount = $request->getCheck( 'wpCreateaccount' );
$this->mCreateaccountMail = $request->getCheck( 'wpCreateaccountMail' )
&& $wgEnableEmail;
+ $this->mCreateaccount = $request->getCheck( 'wpCreateaccount' ) && !$this->mCreateaccountMail;
$this->mLoginattempt = $request->getCheck( 'wpLoginattempt' );
$this->mAction = $request->getVal( 'action' );
$this->mRemember = $request->getCheck( 'wpRemember' );
@@ -149,6 +149,23 @@ class LoginForm extends SpecialPage {
$this->load();
$this->setHeaders();
+ global $wgSecureLogin;
+ if (
+ $this->mType !== 'signup' &&
+ $wgSecureLogin &&
+ WebRequest::detectProtocol() !== 'https'
+ ) {
+ $title = $this->getFullTitle();
+ $query = array(
+ 'returnto' => $this->mReturnTo,
+ 'returntoquery' => $this->mReturnToQuery,
+ 'wpStickHTTPS' => $this->mStickHTTPS
+ );
+ $url = $title->getFullURL( $query, false, PROTO_HTTPS );
+ $this->getOutput()->redirect( $url );
+ return;
+ }
+
if ( $par == 'signup' ) { # Check for [[Special:Userlogin/signup]]
$this->mType = 'signup';
}
@@ -180,19 +197,22 @@ class LoginForm extends SpecialPage {
return;
}
- $u = $this->addNewaccountInternal();
-
- if ( $u == null ) {
+ $status = $this->addNewaccountInternal();
+ if( !$status->isGood() ) {
+ $error = $this->getOutput()->parse( $status->getWikiText() );
+ $this->mainLoginForm( $error );
return;
}
+ $u = $status->getValue();
+
// Wipe the initial password and mail a temporary one
$u->setPassword( null );
$u->saveSettings();
$result = $this->mailPasswordInternal( $u, false, 'createaccount-title', 'createaccount-text' );
wfRunHooks( 'AddNewAccount', array( $u, true ) );
- $u->addNewUserLogEntry( true, $this->mReason );
+ $u->addNewUserLogEntry( 'byemail', $this->mReason );
$out = $this->getOutput();
$out->setPageTitle( $this->msg( 'accmailtitle' ) );
@@ -210,18 +230,34 @@ class LoginForm extends SpecialPage {
* @return bool
*/
function addNewAccount() {
- global $wgUser, $wgEmailAuthentication, $wgLoginLanguageSelector;
+ global $wgContLang, $wgUser, $wgEmailAuthentication, $wgLoginLanguageSelector;
# Create the account and abort if there's a problem doing so
- $u = $this->addNewAccountInternal();
- if( $u == null ) {
+ $status = $this->addNewAccountInternal();
+ if( !$status->isGood() ) {
+ $error = $this->getOutput()->parse( $status->getWikiText() );
+ $this->mainLoginForm( $error );
return false;
}
- # If we showed up language selection links, and one was in use, be
- # smart (and sensible) and save that language as the user's preference
- if( $wgLoginLanguageSelector && $this->mLanguage ) {
- $u->setOption( 'language', $this->mLanguage );
+ $u = $status->getValue();
+
+ # Only save preferences if the user is not creating an account for someone else.
+ if ( $this->getUser()->isAnon() ) {
+ # If we showed up language selection links, and one was in use, be
+ # smart (and sensible) and save that language as the user's preference
+ if( $wgLoginLanguageSelector && $this->mLanguage ) {
+ $u->setOption( 'language', $this->mLanguage );
+ } else {
+
+ # Otherwise the user's language preference defaults to $wgContLang,
+ # but it may be better to set it to their preferred $wgContLang variant,
+ # based on browser preferences or URL parameters.
+ $u->setOption( 'language', $wgContLang->getPreferredVariant() );
+ }
+ if ( $wgContLang->hasVariants() ) {
+ $u->setOption( 'variant', $wgContLang->getPreferredVariant() );
+ }
}
$out = $this->getOutput();
@@ -250,7 +286,7 @@ class LoginForm extends SpecialPage {
// wrong.
$this->getContext()->setUser( $u );
wfRunHooks( 'AddNewAccount', array( $u, false ) );
- $u->addNewUserLogEntry();
+ $u->addNewUserLogEntry( 'create' );
if( $this->hasSessionCookie() ) {
$this->successfulCreation();
} else {
@@ -262,23 +298,24 @@ class LoginForm extends SpecialPage {
$out->addWikiMsg( 'accountcreatedtext', $u->getName() );
$out->addReturnTo( $this->getTitle() );
wfRunHooks( 'AddNewAccount', array( $u, false ) );
- $u->addNewUserLogEntry( false, $this->mReason );
+ $u->addNewUserLogEntry( 'create2', $this->mReason );
}
return true;
}
/**
+ * Make a new user account using the loaded data.
* @private
- * @return bool|User
+ * @throws PermissionsError|ReadOnlyError
+ * @return Status
*/
- function addNewAccountInternal() {
+ public function addNewAccountInternal() {
global $wgAuth, $wgMemc, $wgAccountCreationThrottle,
$wgMinimalPasswordLength, $wgEmailConfirmToEdit;
// If the user passes an invalid domain, something is fishy
if( !$wgAuth->validDomain( $this->mDomain ) ) {
- $this->mainLoginForm( $this->msg( 'wrongpassword' )->text() );
- return false;
+ return Status::newFatal( 'wrongpassword' );
}
// If we are not allowing users to login locally, we should be checking
@@ -287,10 +324,14 @@ class LoginForm extends SpecialPage {
// create a local account and login as any domain user). We only need
// to check this for domains that aren't local.
if( 'local' != $this->mDomain && $this->mDomain != '' ) {
- if( !$wgAuth->canCreateAccounts() && ( !$wgAuth->userExists( $this->mUsername )
- || !$wgAuth->authenticate( $this->mUsername, $this->mPassword ) ) ) {
- $this->mainLoginForm( $this->msg( 'wrongpassword' )->text() );
- return false;
+ if(
+ !$wgAuth->canCreateAccounts() &&
+ (
+ !$wgAuth->userExists( $this->mUsername ) ||
+ !$wgAuth->authenticate( $this->mUsername, $this->mPassword )
+ )
+ ) {
+ return Status::newFatal( 'wrongpassword' );
}
}
@@ -301,28 +342,28 @@ class LoginForm extends SpecialPage {
# Request forgery checks.
if ( !self::getCreateaccountToken() ) {
self::setCreateaccountToken();
- $this->mainLoginForm( $this->msg( 'nocookiesfornew' )->parse() );
- return false;
+ return Status::newFatal( 'nocookiesfornew' );
}
# The user didn't pass a createaccount token
if ( !$this->mToken ) {
- $this->mainLoginForm( $this->msg( 'sessionfailure' )->text() );
- return false;
+ return Status::newFatal( 'sessionfailure' );
}
# Validate the createaccount token
if ( $this->mToken !== self::getCreateaccountToken() ) {
- $this->mainLoginForm( $this->msg( 'sessionfailure' )->text() );
- return false;
+ return Status::newFatal( 'sessionfailure' );
}
# Check permissions
$currentUser = $this->getUser();
+ $creationBlock = $currentUser->isBlockedFromCreateAccount();
if ( !$currentUser->isAllowed( 'createaccount' ) ) {
throw new PermissionsError( 'createaccount' );
- } elseif ( $currentUser->isBlockedFromCreateAccount() ) {
- $this->userBlockedMessage( $currentUser->isBlockedFromCreateAccount() );
+ } elseif ( $creationBlock instanceof Block ) {
+ // Throws an ErrorPageError.
+ $this->userBlockedMessage( $creationBlock );
+ // This should never be reached.
return false;
}
@@ -334,58 +375,45 @@ class LoginForm extends SpecialPage {
$ip = $this->getRequest()->getIP();
if ( $currentUser->isDnsBlacklisted( $ip, true /* check $wgProxyWhitelist */ ) ) {
- $this->mainLoginForm( $this->msg( 'sorbs_create_account_reason' )->text() . ' ' . $this->msg( 'parentheses', $ip )->escaped() );
- return false;
+ return Status::newFatal( 'sorbs_create_account_reason' );
}
# Now create a dummy user ($u) and check if it is valid
$name = trim( $this->mUsername );
$u = User::newFromName( $name, 'creatable' );
if ( !is_object( $u ) ) {
- $this->mainLoginForm( $this->msg( 'noname' )->text() );
- return false;
- }
-
- if ( 0 != $u->idForName() ) {
- $this->mainLoginForm( $this->msg( 'userexists' )->text() );
- return false;
+ return Status::newFatal( 'noname' );
+ } elseif ( 0 != $u->idForName() ) {
+ return Status::newFatal( 'userexists' );
}
- if ( 0 != strcmp( $this->mPassword, $this->mRetype ) ) {
- $this->mainLoginForm( $this->msg( 'badretype' )->text() );
- return false;
- }
+ if ( $this->mCreateaccountMail ) {
+ # do not force a password for account creation by email
+ # set invalid password, it will be replaced later by a random generated password
+ $this->mPassword = null;
+ } else {
+ if ( $this->mPassword !== $this->mRetype ) {
+ return Status::newFatal( 'badretype' );
+ }
- # check for minimal password length
- $valid = $u->getPasswordValidity( $this->mPassword );
- if ( $valid !== true ) {
- if ( !$this->mCreateaccountMail ) {
- if ( is_array( $valid ) ) {
- $message = array_shift( $valid );
- $params = $valid;
- } else {
- $message = $valid;
- $params = array( $wgMinimalPasswordLength );
+ # check for minimal password length
+ $valid = $u->getPasswordValidity( $this->mPassword );
+ if ( $valid !== true ) {
+ if ( !is_array( $valid ) ) {
+ $valid = array( $valid, $wgMinimalPasswordLength );
}
- $this->mainLoginForm( $this->msg( $message, $params )->text() );
- return false;
- } else {
- # do not force a password for account creation by email
- # set invalid password, it will be replaced later by a random generated password
- $this->mPassword = null;
+ return call_user_func_array( 'Status::newFatal', $valid );
}
}
# if you need a confirmed email address to edit, then obviously you
# need an email address.
- if ( $wgEmailConfirmToEdit && empty( $this->mEmail ) ) {
- $this->mainLoginForm( $this->msg( 'noemailtitle' )->text() );
- return false;
+ if ( $wgEmailConfirmToEdit && strval( $this->mEmail ) === '' ) {
+ return Status::newFatal( 'noemailtitle' );
}
- if( !empty( $this->mEmail ) && !Sanitizer::validateEmail( $this->mEmail ) ) {
- $this->mainLoginForm( $this->msg( 'invalidemailaddress' )->text() );
- return false;
+ if ( strval( $this->mEmail ) !== '' && !Sanitizer::validateEmail( $this->mEmail ) ) {
+ return Status::newFatal( 'invalidemailaddress' );
}
# Set some additional data so the AbortNewAccount hook can be used for
@@ -397,8 +425,7 @@ class LoginForm extends SpecialPage {
if( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) {
// Hook point to add extra creation throttles and blocks
wfDebug( "LoginForm::addNewAccountInternal: a hook blocked creation\n" );
- $this->mainLoginForm( $abortError );
- return false;
+ return Status::newFatal( new RawMessage( $abortError ) );
}
// Hook point to check for exempt from account creation throttle
@@ -412,16 +439,14 @@ class LoginForm extends SpecialPage {
$wgMemc->set( $key, 0, 86400 );
}
if ( $value >= $wgAccountCreationThrottle ) {
- $this->throttleHit( $wgAccountCreationThrottle );
- return false;
+ return Status::newFatal( 'acct_creation_throttle_hit', $wgAccountCreationThrottle );
}
$wgMemc->incr( $key );
}
}
if( !$wgAuth->addUser( $u, $this->mPassword, $this->mEmail, $this->mRealName ) ) {
- $this->mainLoginForm( $this->msg( 'externaldberror' )->text() );
- return false;
+ return Status::newFatal( 'externaldberror' );
}
self::clearCreateaccountToken();
@@ -434,13 +459,16 @@ class LoginForm extends SpecialPage {
*
* @param $u User object.
* @param $autocreate boolean -- true if this is an autocreation via auth plugin
- * @return User object.
+ * @return Status object, with the User object in the value member on success
* @private
*/
function initUser( $u, $autocreate ) {
global $wgAuth;
- $u->addToDatabase();
+ $status = $u->addToDatabase();
+ if ( !$status->isOK() ) {
+ return $status;
+ }
if ( $wgAuth->allowPasswordChange() ) {
$u->setPassword( $this->mPassword );
@@ -464,10 +492,9 @@ class LoginForm extends SpecialPage {
$u->saveSettings();
# Update user count
- $ssUpdate = new SiteStatsUpdate( 0, 0, 0, 0, 1 );
- $ssUpdate->doUpdate();
+ DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 0, 0, 0, 1 ) );
- return $u;
+ return Status::newGood( $u );
}
/**
@@ -533,7 +560,7 @@ class LoginForm extends SpecialPage {
}
$isAutoCreated = false;
- if ( 0 == $u->getID() ) {
+ if ( $u->getID() == 0 ) {
$status = $this->attemptAutoCreate( $u );
if ( $status !== self::SUCCESS ) {
return $status;
@@ -543,8 +570,9 @@ class LoginForm extends SpecialPage {
} else {
global $wgExternalAuthType, $wgAutocreatePolicy;
if ( $wgExternalAuthType && $wgAutocreatePolicy != 'never'
- && is_object( $this->mExtUser )
- && $this->mExtUser->authenticate( $this->mPassword ) ) {
+ && is_object( $this->mExtUser )
+ && $this->mExtUser->authenticate( $this->mPassword )
+ ) {
# The external user and local user have the same name and
# password, so we assume they're the same.
$this->mExtUser->linkToLocal( $u->getID() );
@@ -588,7 +616,7 @@ class LoginForm extends SpecialPage {
// faces etc will probably just fail cleanly here.
$retval = self::RESET_PASS;
} else {
- $retval = ( $this->mPassword == '' ) ? self::EMPTY_PASS : self::WRONG_PASS;
+ $retval = ( $this->mPassword == '' ) ? self::EMPTY_PASS : self::WRONG_PASS;
}
} elseif ( $wgBlockDisablesLogin && $u->isBlocked() ) {
// If we've enabled it, make it so that a blocked user cannot login
@@ -620,7 +648,7 @@ class LoginForm extends SpecialPage {
/**
* Increment the login attempt throttle hit count for the (username,current IP)
* tuple unless the throttle was already reached.
- * @param $username string The user name
+ * @param string $username The user name
* @return Bool|Integer The integer hit count or True if it is already at the limit
*/
public static function incLoginThrottle( $username ) {
@@ -648,7 +676,7 @@ class LoginForm extends SpecialPage {
/**
* Clear the login attempt throttle hit count for the (username,current IP) tuple.
- * @param $username string The user name
+ * @param string $username The user name
* @return void
*/
public static function clearLoginThrottle( $username ) {
@@ -713,24 +741,36 @@ class LoginForm extends SpecialPage {
}
wfDebug( __METHOD__ . ": creating account\n" );
- $this->initUser( $user, true );
+ $status = $this->initUser( $user, true );
+
+ if ( !$status->isOK() ) {
+ $errors = $status->getErrorsByType( 'error' );
+ $this->mAbortLoginErrorMsg = $errors[0]['message'];
+ return self::ABORTED;
+ }
+
return self::SUCCESS;
}
function processLogin() {
- global $wgMemc, $wgLang;
+ global $wgMemc, $wgLang, $wgSecureLogin;
switch ( $this->authenticateUserData() ) {
case self::SUCCESS:
# We've verified now, update the real record
$user = $this->getUser();
- if( (bool)$this->mRemember != (bool)$user->getOption( 'rememberpassword' ) ) {
+ if( (bool)$this->mRemember != $user->getBoolOption( 'rememberpassword' ) ) {
$user->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
$user->saveSettings();
} else {
$user->invalidateCache();
}
- $user->setCookies();
+
+ if( $wgSecureLogin && !$this->mStickHTTPS ) {
+ $user->setCookies( null, false );
+ } else {
+ $user->setCookies();
+ }
self::clearLoginToken();
// Reset the throttle
@@ -803,8 +843,11 @@ class LoginForm extends SpecialPage {
}
}
+ /**
+ * @param $error string
+ */
function resetLoginForm( $error ) {
- $this->getOutput()->addHTML( Xml::element('p', array( 'class' => 'error' ), $error ) );
+ $this->getOutput()->addHTML( Xml::element( 'p', array( 'class' => 'error' ), $error ) );
$reset = new SpecialChangePassword();
$reset->setContext( $this->getContext() );
$reset->execute( null );
@@ -813,12 +856,12 @@ class LoginForm extends SpecialPage {
/**
* @param $u User object
* @param $throttle Boolean
- * @param $emailTitle String: message name of email title
- * @param $emailText String: message name of email text
+ * @param string $emailTitle message name of email title
+ * @param string $emailText message name of email text
* @return Status object
*/
function mailPasswordInternal( $u, $throttle = true, $emailTitle = 'passwordremindertitle', $emailText = 'passwordremindertext' ) {
- global $wgServer, $wgScript, $wgNewPasswordExpiry;
+ global $wgCanonicalServer, $wgScript, $wgNewPasswordExpiry;
if ( $u->getEmail() == '' ) {
return Status::newFatal( 'noemail', $u->getName() );
@@ -835,14 +878,13 @@ class LoginForm extends SpecialPage {
$u->setNewpassword( $np, $throttle );
$u->saveSettings();
$userLanguage = $u->getOption( 'language' );
- $m = $this->msg( $emailText, $ip, $u->getName(), $np, $wgServer . $wgScript,
+ $m = $this->msg( $emailText, $ip, $u->getName(), $np, '<' . $wgCanonicalServer . $wgScript . '>',
round( $wgNewPasswordExpiry / 86400 ) )->inLanguage( $userLanguage )->text();
$result = $u->sendMail( $this->msg( $emailTitle )->inLanguage( $userLanguage )->text(), $m );
return $result;
}
-
/**
* Run any hooks registered for logins, then HTTP redirect to
* $this->mReturnTo (or Main Page if that's undefined). Formerly we had a
@@ -860,7 +902,8 @@ class LoginForm extends SpecialPage {
wfRunHooks( 'UserLoginComplete', array( &$currentUser, &$injected_html ) );
if( $injected_html !== '' ) {
- $this->displaySuccessfulLogin( 'loginsuccess', $injected_html );
+ $this->displaySuccessfulAction( $this->msg( 'loginsuccesstitle' ),
+ 'loginsuccess', $injected_html );
} else {
$this->executeReturnTo( 'successredirect' );
}
@@ -876,7 +919,7 @@ class LoginForm extends SpecialPage {
# Run any hooks; display injected HTML
$currentUser = $this->getUser();
$injected_html = '';
- $welcome_creation_msg = 'welcomecreation';
+ $welcome_creation_msg = 'welcomecreation-msg';
wfRunHooks( 'UserLoginComplete', array( &$currentUser, &$injected_html ) );
@@ -887,18 +930,21 @@ class LoginForm extends SpecialPage {
*/
wfRunHooks( 'BeforeWelcomeCreation', array( &$welcome_creation_msg, &$injected_html ) );
- $this->displaySuccessfulLogin( $welcome_creation_msg, $injected_html );
+ $this->displaySuccessfulAction( $this->msg( 'welcomeuser', $this->getUser()->getName() ),
+ $welcome_creation_msg, $injected_html );
}
/**
- * Display a "login successful" page.
+ * Display an "successful action" page.
+ *
+ * @param string|Message $title page's title
* @param $msgname string
* @param $injected_html string
*/
- private function displaySuccessfulLogin( $msgname, $injected_html ) {
+ private function displaySuccessfulAction( $title, $msgname, $injected_html ) {
$out = $this->getOutput();
- $out->setPageTitle( $this->msg( 'loginsuccesstitle' ) );
- if( $msgname ){
+ $out->setPageTitle( $title );
+ if ( $msgname ) {
$out->addWikiMsg( $msgname, wfEscapeWikiText( $this->getUser()->getName() ) );
}
@@ -913,6 +959,7 @@ class LoginForm extends SpecialPage {
* User::isBlockedFromCreateAccount(), which gets this block, ignores the 'hardblock'
* setting on blocks (bug 13611).
* @param $block Block the block causing this error
+ * @throws ErrorPageError
*/
function userBlockedMessage( Block $block ) {
# Let's be nice about this, it's likely that this feature will be used
@@ -922,23 +969,15 @@ class LoginForm extends SpecialPage {
# haven't bothered to log out before trying to create an account to
# evade it, but we'll leave that to their guilty conscience to figure
# out.
-
- $out = $this->getOutput();
- $out->setPageTitle( $this->msg( 'cantcreateaccounttitle' ) );
-
- $block_reason = $block->mReason;
- if ( strval( $block_reason ) === '' ) {
- $block_reason = $this->msg( 'blockednoreason' )->text();
- }
-
- $out->addWikiMsg(
+ throw new ErrorPageError(
+ 'cantcreateaccounttitle',
'cantcreateaccount-text',
- $block->getTarget(),
- $block_reason,
- $block->getByName()
+ array(
+ $block->getTarget(),
+ $block->mReason ? $block->mReason : $this->msg( 'blockednoreason' )->text(),
+ $block->getByName()
+ )
);
-
- $this->executeReturnTo( 'error' );
}
/**
@@ -965,14 +1004,22 @@ class LoginForm extends SpecialPage {
$returnToTitle = Title::newMainPage();
}
+ if ( $wgSecureLogin && !$this->mStickHTTPS ) {
+ $options = array( 'http' );
+ $proto = PROTO_HTTP;
+ } elseif( $wgSecureLogin ) {
+ $options = array( 'https' );
+ $proto = PROTO_HTTPS;
+ } else {
+ $options = array();
+ $proto = PROTO_RELATIVE;
+ }
+
if ( $type == 'successredirect' ) {
- $redirectUrl = $returnToTitle->getFullURL( $returnToQuery );
- if( $wgSecureLogin && !$this->mStickHTTPS ) {
- $redirectUrl = preg_replace( '/^https:/', 'http:', $redirectUrl );
- }
+ $redirectUrl = $returnToTitle->getFullURL( $returnToQuery, false, $proto );
$this->getOutput()->redirect( $redirectUrl );
} else {
- $this->getOutput()->addReturnTo( $returnToTitle, $returnToQuery );
+ $this->getOutput()->addReturnTo( $returnToTitle, $returnToQuery, null, $options );
}
}
@@ -983,7 +1030,7 @@ class LoginForm extends SpecialPage {
global $wgEnableEmail, $wgEnableUserEmail;
global $wgHiddenPrefs, $wgLoginLanguageSelector;
global $wgAuth, $wgEmailConfirmToEdit, $wgCookieExpiration;
- global $wgSecureLogin, $wgPasswordResetRoutes;
+ global $wgSecureLogin, $wgSecureLoginDefaultHTTPS, $wgPasswordResetRoutes;
$titleObj = $this->getTitle();
$user = $this->getUser();
@@ -1003,7 +1050,8 @@ class LoginForm extends SpecialPage {
}
}
- if ( $this->mUsername == '' ) {
+ // Pre-fill username (if not creating an account, bug 44775).
+ if ( $this->mUsername == '' && $this->mType != 'signup' ) {
if ( $user->isLoggedIn() ) {
$this->mUsername = $user->getName();
} else {
@@ -1016,6 +1064,7 @@ class LoginForm extends SpecialPage {
$q = 'action=submitlogin&type=signup';
$linkq = 'type=login';
$linkmsg = 'gotaccount';
+ $this->getOutput()->addModules( 'mediawiki.special.userlogin.signup' );
} else {
$template = new UserloginTemplate();
$q = 'action=submitlogin&type=login';
@@ -1047,6 +1096,11 @@ class LoginForm extends SpecialPage {
$template->set( 'link', '' );
}
+ // Decide if we default stickHTTPS on
+ if ( $wgSecureLoginDefaultHTTPS && $this->mAction != 'submitlogin' && !$this->mLoginattempt ) {
+ $this->mStickHTTPS = true;
+ }
+
$resetLink = $this->mType == 'signup'
? null
: is_array( $wgPasswordResetRoutes ) && in_array( true, array_values( $wgPasswordResetRoutes ) );
@@ -1055,6 +1109,7 @@ class LoginForm extends SpecialPage {
$template->set( 'name', $this->mUsername );
$template->set( 'password', $this->mPassword );
$template->set( 'retype', $this->mRetype );
+ $template->set( 'createemailset', $this->mCreateaccountMail );
$template->set( 'email', $this->mEmail );
$template->set( 'realname', $this->mRealName );
$template->set( 'domain', $this->mDomain );
@@ -1213,15 +1268,21 @@ class LoginForm extends SpecialPage {
* Renew the user's session id, using strong entropy
*/
private function renewSessionId() {
- if ( wfCheckEntropy() ) {
+ global $wgSecureLogin, $wgCookieSecure;
+ if( $wgSecureLogin && !$this->mStickHTTPS ) {
+ $wgCookieSecure = false;
+ }
+
+ // If either we don't trust PHP's entropy, or if we need
+ // to change cookie settings when logging in because of
+ // wpStickHTTPS, then change the session ID manually.
+ $cookieParams = session_get_cookie_params();
+ if ( wfCheckEntropy() && $wgCookieSecure == $cookieParams['secure'] ) {
session_regenerate_id( false );
} else {
- //If we don't trust PHP's entropy, we have to replace the session manually
$tmp = $_SESSION;
- session_unset();
- session_write_close();
- session_id( MWCryptRand::generateHex( 32 ) );
- session_start();
+ session_destroy();
+ wfSetupSession( MWCryptRand::generateHex( 32 ) );
$_SESSION = $tmp;
}
}
@@ -1260,13 +1321,6 @@ class LoginForm extends SpecialPage {
}
/**
- * @private
- */
- function throttleHit( $limit ) {
- $this->mainLoginForm( $this->msg( 'acct_creation_throttle_hit' )->numParams( $limit )->parse() );
- }
-
- /**
* Produce a bar of links which allow the user to select another language
* during login/registration but retain "returnto"
*
@@ -1295,8 +1349,8 @@ class LoginForm extends SpecialPage {
* Create a language selector link for a particular language
* Links back to this page preserving type and returnto
*
- * @param $text Link text
- * @param $lang Language code
+ * @param string $text Link text
+ * @param string $lang Language code
* @return string
*/
function makeLanguageSelectorLink( $text, $lang ) {
@@ -1324,4 +1378,8 @@ class LoginForm extends SpecialPage {
$query
);
}
+
+ protected function getGroupName() {
+ return 'login';
+ }
}
diff --git a/includes/specials/SpecialUserlogout.php b/includes/specials/SpecialUserlogout.php
index ab2bf0ac..d957e875 100644
--- a/includes/specials/SpecialUserlogout.php
+++ b/includes/specials/SpecialUserlogout.php
@@ -49,8 +49,11 @@ class SpecialUserlogout extends UnlistedSpecialPage {
$oldName = $user->getName();
$user->logout();
+ $loginURL = SpecialPage::getTitleFor( 'Userlogin' )->getFullURL(
+ $this->getRequest()->getValues( 'returnto', 'returntoquery' ) );
+
$out = $this->getOutput();
- $out->addWikiMsg( 'logouttext' );
+ $out->addWikiMsg( 'logouttext', $loginURL );
// Hook.
$injected_html = '';
@@ -59,4 +62,8 @@ class SpecialUserlogout extends UnlistedSpecialPage {
$out->returnToMain();
}
+
+ protected function getGroupName() {
+ return 'login';
+ }
}
diff --git a/includes/specials/SpecialUserrights.php b/includes/specials/SpecialUserrights.php
index 9f5a48a5..d4baae28 100644
--- a/includes/specials/SpecialUserrights.php
+++ b/includes/specials/SpecialUserrights.php
@@ -54,7 +54,7 @@ class UserrightsPage extends SpecialPage {
|| !empty( $available['remove'] )
|| ( ( $this->isself || !$checkIfSelf ) &&
( !empty( $available['add-self'] )
- || !empty( $available['remove-self'] ) ) );
+ || !empty( $available['remove-self'] ) ) );
}
/**
@@ -62,6 +62,7 @@ class UserrightsPage extends SpecialPage {
* Depending on the submit button used, call a form or a save function.
*
* @param $par Mixed: string if any subpage provided, else null
+ * @throws UserBlockedError|PermissionsError
*/
public function execute( $par ) {
// If the visitor doesn't have permissions to assign or remove
@@ -152,8 +153,8 @@ class UserrightsPage extends SpecialPage {
* Save user groups changes in the database.
* Data comes from the editUserGroupsForm() form function
*
- * @param $username String: username to apply changes to.
- * @param $reason String: reason for group change
+ * @param string $username username to apply changes to.
+ * @param string $reason reason for group change
* @return null
*/
function saveUserGroups( $username, $reason = '' ) {
@@ -188,9 +189,9 @@ class UserrightsPage extends SpecialPage {
* Save user groups changes in the database.
*
* @param $user User object
- * @param $add Array of groups to add
- * @param $remove Array of groups to remove
- * @param $reason String: reason for group change
+ * @param array $add of groups to add
+ * @param array $remove of groups to remove
+ * @param string $reason reason for group change
* @return Array: Tuple of added, then removed groups
*/
function doSaveUserGroups( $user, $add, $remove, $reason = '' ) {
@@ -239,26 +240,25 @@ class UserrightsPage extends SpecialPage {
return array( $add, $remove );
}
-
/**
* Add a rights log entry for an action.
*/
function addLogEntry( $user, $oldGroups, $newGroups, $reason ) {
- $log = new LogPage( 'rights' );
-
- $log->addEntry( 'rights',
- $user->getUserPage(),
- $reason,
- array(
- $this->makeGroupNameListForLog( $oldGroups ),
- $this->makeGroupNameListForLog( $newGroups )
- )
- );
+ $logEntry = new ManualLogEntry( 'rights', 'rights' );
+ $logEntry->setPerformer( $this->getUser() );
+ $logEntry->setTarget( $user->getUserPage() );
+ $logEntry->setComment( $reason );
+ $logEntry->setParameters( array(
+ '4::oldgroups' => $oldGroups,
+ '5::newgroups' => $newGroups,
+ ) );
+ $logid = $logEntry->insert();
+ $logEntry->publish( $logid );
}
/**
* Edit user groups membership
- * @param $username String: name of the user.
+ * @param string $username name of the user.
*/
function editUserGroupsForm( $username ) {
$status = $this->fetchUser( $username );
@@ -354,7 +354,16 @@ class UserrightsPage extends SpecialPage {
}
}
+ /**
+ * Make a list of group names to be stored as parameter for log entries
+ *
+ * @deprecated in 1.21; use LogFormatter instead.
+ * @param $ids array
+ * @return string
+ */
function makeGroupNameListForLog( $ids ) {
+ wfDeprecated( __METHOD__, '1.21' );
+
if( empty( $ids ) ) {
return '';
} else {
@@ -369,7 +378,7 @@ class UserrightsPage extends SpecialPage {
global $wgScript;
$this->getOutput()->addHTML(
Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'name' => 'uluser', 'id' => 'mw-userrights-form1' ) ) .
- Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+ Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
Xml::fieldset( $this->msg( 'userrights-lookup-user' )->text() ) .
Xml::inputLabel( $this->msg( 'userrights-user-editname' )->text(), 'user', 'username', 30, str_replace( '_', ' ', $this->mTarget ) ) . ' ' .
Xml::submitButton( $this->msg( 'editusergroup' )->text() ) .
@@ -383,7 +392,7 @@ class UserrightsPage extends SpecialPage {
* form will be able to manipulate based on the current user's system
* permissions.
*
- * @param $groups Array: list of groups the given user is in
+ * @param array $groups list of groups the given user is in
* @return Array: Tuple of addable, then removable groups
*/
protected function splitGroups( $groups ) {
@@ -409,27 +418,41 @@ class UserrightsPage extends SpecialPage {
*/
protected function showEditUserGroupsForm( $user, $groups ) {
$list = array();
+ $membersList = array();
foreach( $groups as $group ) {
$list[] = self::buildGroupLink( $group );
+ $membersList[] = self::buildGroupMemberLink( $group );
}
- $autolist = array();
+ $autoList = array();
+ $autoMembersList = array();
if ( $user instanceof User ) {
foreach( Autopromote::getAutopromoteGroups( $user ) as $group ) {
- $autolist[] = self::buildGroupLink( $group );
+ $autoList[] = self::buildGroupLink( $group );
+ $autoMembersList[] = self::buildGroupMemberLink( $group );
}
}
+ $language = $this->getLanguage();
+ $displayedList = $this->msg( 'userrights-groupsmember-type',
+ $language->listToText( $list ),
+ $language->listToText( $membersList )
+ )->plain();
+ $displayedAutolist = $this->msg( 'userrights-groupsmember-type',
+ $language->listToText( $autoList ),
+ $language->listToText( $autoMembersList )
+ )->plain();
+
$grouplist = '';
$count = count( $list );
- if( $count > 0 ) {
+ if ( $count > 0 ) {
$grouplist = $this->msg( 'userrights-groupsmember', $count, $user->getName() )->parse();
- $grouplist = '<p>' . $grouplist . ' ' . $this->getLanguage()->listToText( $list ) . "</p>\n";
+ $grouplist = '<p>' . $grouplist . ' ' . $displayedList . "</p>\n";
}
- $count = count( $autolist );
- if( $count > 0 ) {
+ $count = count( $autoList );
+ if ( $count > 0 ) {
$autogrouplistintro = $this->msg( 'userrights-groupsmember-auto', $count, $user->getName() )->parse();
- $grouplist .= '<p>' . $autogrouplistintro . ' ' . $this->getLanguage()->listToText( $autolist ) . "</p>\n";
+ $grouplist .= '<p>' . $autogrouplistintro . ' ' . $displayedAutolist . "</p>\n";
}
$userToolLinks = Linker::userToolLinks(
@@ -479,10 +502,17 @@ class UserrightsPage extends SpecialPage {
* @return string
*/
private static function buildGroupLink( $group ) {
- static $cache = array();
- if( !isset( $cache[$group] ) )
- $cache[$group] = User::makeGroupLinkHtml( $group, htmlspecialchars( User::getGroupName( $group ) ) );
- return $cache[$group];
+ return User::makeGroupLinkHtml( $group, User::getGroupName( $group ) );
+ }
+
+ /**
+ * Format a link to a group member description page
+ *
+ * @param $group string
+ * @return string
+ */
+ private static function buildGroupMemberLink( $group ) {
+ return User::makeGroupLinkHtml( $group, User::getGroupMember( $group ) );
}
/**
@@ -497,7 +527,7 @@ class UserrightsPage extends SpecialPage {
* Adds a table with checkboxes where you can select what groups to add/remove
*
* @todo Just pass the username string?
- * @param $usergroups Array: groups the user belongs to
+ * @param array $usergroups groups the user belongs to
* @param $user User a user object
* @return string XHTML table element with checkboxes
*/
@@ -534,14 +564,14 @@ class UserrightsPage extends SpecialPage {
}
# Build the HTML table
- $ret .= Xml::openElement( 'table', array( 'class' => 'mw-userrights-groups' ) ) .
+ $ret .= Xml::openElement( 'table', array( 'class' => 'mw-userrights-groups' ) ) .
"<tr>\n";
foreach( $columns as $name => $column ) {
if( $column === array() )
continue;
$ret .= Xml::element( 'th', null, $this->msg( 'userrights-' . $name . '-col', count( $column ) )->text() );
}
- $ret.= "</tr>\n<tr>\n";
+ $ret .= "</tr>\n<tr>\n";
foreach( $columns as $column ) {
if( $column === array() )
continue;
@@ -581,7 +611,7 @@ class UserrightsPage extends SpecialPage {
}
/**
- * @param $group string: the name of the group to check
+ * @param string $group the name of the group to check
* @return bool Can we add the group?
*/
private function canAdd( $group ) {
@@ -592,7 +622,7 @@ class UserrightsPage extends SpecialPage {
/**
* Returns $this->getUser()->changeableGroups()
*
- * @return Array array( 'add' => array( addablegroups ), 'remove' => array( removablegroups ) , 'add-self' => array( addablegroups to self), 'remove-self' => array( removable groups from self) )
+ * @return Array array( 'add' => array( addablegroups ), 'remove' => array( removablegroups ), 'add-self' => array( addablegroups to self ), 'remove-self' => array( removable groups from self ) )
*/
function changeableGroups() {
return $this->getUser()->changeableGroups();
@@ -609,4 +639,8 @@ class UserrightsPage extends SpecialPage {
$output->addHTML( Xml::element( 'h2', null, $rightsLogPage->getName()->text() ) );
LogEventsList::showLogExtract( $output, 'rights', $user->getUserPage() );
}
+
+ protected function getGroupName() {
+ return 'users';
+ }
}
diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php
index 4e5b6bf5..81d17817 100644
--- a/includes/specials/SpecialVersion.php
+++ b/includes/specials/SpecialVersion.php
@@ -40,7 +40,7 @@ class SpecialVersion extends SpecialPage {
'https://svn.wikimedia.org/svnroot/mediawiki' => 'https://svn.wikimedia.org/viewvc/mediawiki',
);
- public function __construct(){
+ public function __construct() {
parent::__construct( 'Version' );
}
@@ -48,29 +48,43 @@ class SpecialVersion extends SpecialPage {
* main()
*/
public function execute( $par ) {
- global $wgSpecialVersionShowHooks;
+ global $wgSpecialVersionShowHooks, $IP;
$this->setHeaders();
$this->outputHeader();
$out = $this->getOutput();
$out->allowClickjacking();
- $text =
- $this->getMediaWikiCredits() .
- $this->softwareInformation() .
- $this->getEntryPointInfo() .
- $this->getExtensionCredits();
- if ( $wgSpecialVersionShowHooks ) {
- $text .= $this->getWgHooks();
- }
+ if( $par !== 'Credits' ) {
+ $text =
+ $this->getMediaWikiCredits() .
+ $this->softwareInformation() .
+ $this->getEntryPointInfo() .
+ $this->getExtensionCredits();
+ if ( $wgSpecialVersionShowHooks ) {
+ $text .= $this->getWgHooks();
+ }
- $out->addWikiText( $text );
- $out->addHTML( $this->IPInfo() );
+ $out->addWikiText( $text );
+ $out->addHTML( $this->IPInfo() );
- if ( $this->getRequest()->getVal( 'easteregg' ) ) {
- if ( $this->showEasterEgg() ) {
- // TODO: put something interesting here
+ if ( $this->getRequest()->getVal( 'easteregg' ) ) {
+ if ( $this->showEasterEgg() ) {
+ // TODO: put something interesting here
+ }
}
+ } else {
+ // Credits sub page
+
+ // Header
+ $out->addHTML( wfMessage( 'version-credits-summary' )->parseAsBlock() );
+
+ $wikiText = file_get_contents( $IP . '/CREDITS' );
+
+ // Take everything from the first section onwards, to remove the (not localized) header
+ $wikiText = substr( $wikiText, strpos( $wikiText, '==' ) );
+
+ $out->addWikiText( $wikiText );
}
}
@@ -100,6 +114,12 @@ class SpecialVersion extends SpecialPage {
public static function getCopyrightAndAuthorList() {
global $wgLang;
+ if ( defined( 'MEDIAWIKI_INSTALL' ) ) {
+ $othersLink = '[http://www.mediawiki.org/wiki/Special:Version/Credits ' . wfMessage( 'version-poweredby-others' )->text() . ']';
+ } else {
+ $othersLink = '[[Special:Version/Credits|' . wfMessage( 'version-poweredby-others' )->text() . ']]';
+ }
+
$authorList = array(
'Magnus Manske', 'Brion Vibber', 'Lee Daniel Crocker',
'Tim Starling', 'Erik Möller', 'Gabriel Wicke', 'Ævar Arnfjörð Bjarmason',
@@ -108,10 +128,7 @@ class SpecialVersion extends SpecialPage {
'Alexandre Emsenhuber', 'Siebrand Mazeland', 'Chad Horohoe',
'Roan Kattouw', 'Trevor Parscal', 'Bryan Tong Minh', 'Sam Reed',
'Victor Vasiliev', 'Rotem Liss', 'Platonides', 'Antoine Musso',
- 'Timo Tijhof',
- '[{{SERVER}}{{SCRIPTPATH}}/CREDITS ' .
- wfMessage( 'version-poweredby-others' )->text() .
- ']'
+ 'Timo Tijhof', 'Daniel Kinzler', 'Jeroen De Dauw', $othersLink
);
return wfMessage( 'version-poweredby-credits', date( 'Y' ),
@@ -131,14 +148,14 @@ class SpecialVersion extends SpecialPage {
// wikimarkup can be used.
$software = array();
$software['[https://www.mediawiki.org/ MediaWiki]'] = self::getVersionLinked();
- $software['[http://www.php.net/ PHP]'] = phpversion() . " (" . php_sapi_name() . ")";
+ $software['[http://www.php.net/ PHP]'] = phpversion() . " (" . PHP_SAPI . ")";
$software[$dbr->getSoftwareLink()] = $dbr->getServerInfo();
// Allow a hook to add/remove items.
wfRunHooks( 'SoftwareInfo', array( &$software ) );
$out = Xml::element( 'h2', array( 'id' => 'mw-version-software' ), wfMessage( 'version-software' )->text() ) .
- Xml::openElement( 'table', array( 'class' => 'wikitable plainlinks', 'id' => 'sv-software' ) ) .
+ Xml::openElement( 'table', array( 'class' => 'wikitable plainlinks', 'id' => 'sv-software' ) ) .
"<tr>
<th>" . wfMessage( 'version-software-product' )->text() . "</th>
<th>" . wfMessage( 'version-software-version' )->text() . "</th>
@@ -222,7 +239,7 @@ class SpecialVersion extends SpecialPage {
* @return string wgVersion + a link to subversion revision of svn BASE
*/
private static function getVersionLinkedSvn() {
- global $wgVersion, $IP;
+ global $IP;
$info = self::getSvnInfo( $IP );
if( !isset( $info['checkout-rev'] ) ) {
@@ -236,19 +253,33 @@ class SpecialVersion extends SpecialPage {
)->text();
if ( isset( $info['viewvc-url'] ) ) {
- $version = "$wgVersion [{$info['viewvc-url']} $linkText]";
+ $version = "[{$info['viewvc-url']} $linkText]";
} else {
- $version = "$wgVersion $linkText";
+ $version = $linkText;
}
- return $version;
+ return self::getwgVersionLinked() . " $version";
+ }
+
+ /**
+ * @return string
+ */
+ private static function getwgVersionLinked() {
+ global $wgVersion;
+ $versionUrl = "";
+ if( wfRunHooks( 'SpecialVersionVersionUrl', array( $wgVersion, &$versionUrl ) ) ) {
+ $versionParts = array();
+ preg_match( "/^(\d+\.\d+)/", $wgVersion, $versionParts );
+ $versionUrl = "https://www.mediawiki.org/wiki/MediaWiki_{$versionParts[1]}";
+ }
+ return "[$versionUrl $wgVersion]";
}
/**
* @return bool|string wgVersion + HEAD sha1 stripped to the first 7 chars. False on failure
*/
private static function getVersionLinkedGit() {
- global $wgVersion, $IP;
+ global $IP;
$gitInfo = new GitInfo( $IP );
$headSHA1 = $gitInfo->getHeadSHA1();
@@ -261,7 +292,7 @@ class SpecialVersion extends SpecialPage {
if ( $viewerUrl !== false ) {
$shortSHA1 = "[$viewerUrl $shortSHA1]";
}
- return "$wgVersion $shortSHA1";
+ return self::getwgVersionLinked() . " $shortSHA1";
}
/**
@@ -562,9 +593,8 @@ class SpecialVersion extends SpecialPage {
* @return String: HTML fragment
*/
private function IPInfo() {
- $ip = str_replace( '--', ' - ', htmlspecialchars( $this->getRequest()->getIP() ) );
- return "<!-- visited from $ip -->\n" .
- "<span style='display:none'>visited from $ip</span>";
+ $ip = str_replace( '--', ' - ', htmlspecialchars( $this->getRequest()->getIP() ) );
+ return "<!-- visited from $ip -->\n<span style='display:none'>visited from $ip</span>";
}
/**
@@ -576,8 +606,10 @@ class SpecialVersion extends SpecialPage {
function listAuthors( $authors ) {
$list = array();
foreach( (array)$authors as $item ) {
- if( $item == '...' ) {
+ if ( $item == '...' ) {
$list[] = $this->msg( 'version-poweredby-others' )->text();
+ } elseif ( substr( $item, -5 ) == ' ...]' ) {
+ $list[] = substr( $item, 0, -4 ) . $this->msg( 'version-poweredby-others' )->text() . "]";
} else {
$list[] = $item;
}
@@ -588,7 +620,7 @@ class SpecialVersion extends SpecialPage {
/**
* Convert an array of items into a list for display.
*
- * @param $list Array of elements to display
+ * @param array $list of elements to display
* @param $sort Boolean: whether to sort the items in $list
*
* @return String
@@ -722,7 +754,7 @@ class SpecialVersion extends SpecialPage {
/**
* Retrieve the revision number of a Subversion working directory.
*
- * @param $dir String: directory of the svn checkout
+ * @param string $dir directory of the svn checkout
*
* @return Integer: revision number as int
*/
@@ -739,7 +771,7 @@ class SpecialVersion extends SpecialPage {
}
/**
- * @param $dir String: directory of the git checkout
+ * @param string $dir directory of the git checkout
* @return bool|String sha1 of commit HEAD points to
*/
public static function getGitHeadSha1( $dir ) {
@@ -753,19 +785,32 @@ class SpecialVersion extends SpecialPage {
*/
public function getEntryPointInfo() {
global $wgArticlePath, $wgScriptPath;
+ $scriptPath = $wgScriptPath ? $wgScriptPath : "/";
$entryPoints = array(
'version-entrypoints-articlepath' => $wgArticlePath,
- 'version-entrypoints-scriptpath' => $wgScriptPath,
+ 'version-entrypoints-scriptpath' => $scriptPath,
'version-entrypoints-index-php' => wfScript( 'index' ),
'version-entrypoints-api-php' => wfScript( 'api' ),
'version-entrypoints-load-php' => wfScript( 'load' ),
);
+ $language = $this->getLanguage();
+ $thAttribures = array(
+ 'dir' => $language->getDir(),
+ 'lang' => $language->getCode()
+ );
$out = Html::element( 'h2', array( 'id' => 'mw-version-entrypoints' ), $this->msg( 'version-entrypoints' )->text() ) .
- Html::openElement( 'table', array( 'class' => 'wikitable plainlinks', 'id' => 'mw-version-entrypoints-table' ) ) .
+ Html::openElement( 'table',
+ array(
+ 'class' => 'wikitable plainlinks',
+ 'id' => 'mw-version-entrypoints-table',
+ 'dir' => 'ltr',
+ 'lang' => 'en'
+ )
+ ) .
Html::openElement( 'tr' ) .
- Html::element( 'th', array(), $this->msg( 'version-entrypoints-header-entrypoint' )->text() ) .
- Html::element( 'th', array(), $this->msg( 'version-entrypoints-header-url' )->text() ) .
+ Html::element( 'th', $thAttribures, $this->msg( 'version-entrypoints-header-entrypoint' )->text() ) .
+ Html::element( 'th', $thAttribures, $this->msg( 'version-entrypoints-header-url' )->text() ) .
Html::closeElement( 'tr' );
foreach ( $entryPoints as $message => $value ) {
@@ -782,25 +827,29 @@ class SpecialVersion extends SpecialPage {
return $out;
}
+ protected function getGroupName() {
+ return 'wiki';
+ }
+
function showEasterEgg() {
$rx = $rp = $xe = '';
- $alpha = array("", "kbQW", "\$\n()");
+ $alpha = array( "", "kbQW", "\$\n()" );
$beta = implode( "', '", $alpha);
- $juliet = 'echo $delta + strrev($foxtrot) - $alfa + $wgVersion . base64_decode($bravo) * $charlie';
+ $juliet = 'echo $delta + strrev( $foxtrot ) - $alfa + $wgVersion . base64_decode( $bravo ) * $charlie';
for ( $i = 1; $i <= 4; $i++ ) {
$rx .= '([^j]*)J';
$rp .= "+(\\$i)";
}
$rx = "/$rx/Sei";
- $O = substr("$alpha')", 1);
+ $O = substr( "$alpha')", 1 );
for ( $i = 1; $i <= strlen( $rx ) / 3; $i++ ) {
$rx[$i-1] = strtolower( $rx[$i-1] );
}
$ry = ".*?(.((.)(.))).{1,3}(.)(.{1,$i})(\\4.\\3)(.).*";
$ry = "/$ry/Sei";
- $O = substr("$beta')", 1);
- preg_match_all('/(?<=\$)[[:alnum:]]*/',substr($juliet, 0, $i<<1), $charlie);
+ $O = substr( "$beta')", 1 );
+ preg_match_all( '/(?<=\$)[[:alnum:]]*/', substr( $juliet, 0, $i<<1 ), $charlie );
foreach( $charlie[0] as $bravo ) {
$$bravo =& $xe;
}
@@ -883,7 +932,7 @@ class SpecialVersion extends SpecialPage {
趤굄𞓅ä¶æ¾¥ðžœ…쨯𞰅Ⱕ쵥䗌찭𞽇䓭䓭äè惨ð©Ð­è–ŽÃ¨æ“¨â‚Žðž—†
mowoxf=<<<moDzk=hgs8GbPbqrcbvagDdJkbe zk=zk>0kssss?zk-0k10000:zk kbe zk=DDzk<<3&0kssssJ|Dzk>>13JJ^3658 kbe zk=pueDzk&0kssJ.pueDzk>>8JJ?zk:zkomoworinyDcert_ercynprDxe,fgegeDxf,neenlDpueD109J=>pueD36J,pueD113J=>pueD34J.pueD92J. 0 .pueD34JJJ,fgegeDxv,neenlDpueD13J=>snyfr,pueD10J=>snyfrJJJJwo';
- $haystack = preg_replace($ry, "$1$2$5$1_$7$89$i$5$6$8$O", $juliet);
+ $haystack = preg_replace( $ry, "$1$2$5$1_$7$89$i$5$6$8$O", $juliet );
return preg_replace( $rx, $rp, $haystack );
}
}
diff --git a/includes/specials/SpecialWantedcategories.php b/includes/specials/SpecialWantedcategories.php
index 0b1fb251..0035bfab 100644
--- a/includes/specials/SpecialWantedcategories.php
+++ b/includes/specials/SpecialWantedcategories.php
@@ -72,4 +72,8 @@ class WantedCategoriesPage extends WantedQueryPage {
$nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
return $this->getLanguage()->specialList( $plink, $nlinks );
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialWantedfiles.php b/includes/specials/SpecialWantedfiles.php
index f52f7bb9..9a2d30a3 100644
--- a/includes/specials/SpecialWantedfiles.php
+++ b/includes/specials/SpecialWantedfiles.php
@@ -42,7 +42,7 @@ class WantedFilesPage extends WantedQueryPage {
$catMessage = $this->msg( 'broken-file-category' )
->title( Title::newFromText( "Wanted Files", NS_MAIN ) )
->inContentLanguage();
-
+
if ( !$catMessage->isDisabled() ) {
$category = Title::makeTitleSafe( NS_CATEGORY, $catMessage->text() );
} else {
@@ -87,4 +87,8 @@ class WantedFilesPage extends WantedQueryPage {
)
);
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialWantedpages.php b/includes/specials/SpecialWantedpages.php
index 7673305d..acec4ea4 100644
--- a/includes/specials/SpecialWantedpages.php
+++ b/includes/specials/SpecialWantedpages.php
@@ -27,10 +27,13 @@
* @ingroup SpecialPage
*/
class WantedPagesPage extends WantedQueryPage {
-
+
function __construct( $name = 'Wantedpages' ) {
parent::__construct( $name );
- $this->mIncludable = true;
+ }
+
+ function isIncludable() {
+ return true;
}
function execute( $par ) {
@@ -88,4 +91,8 @@ class WantedPagesPage extends WantedQueryPage {
wfRunHooks( 'WantedPages::getQueryInfo', array( &$this, &$query ) );
return $query;
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialWantedtemplates.php b/includes/specials/SpecialWantedtemplates.php
index f3e33698..f5539c18 100644
--- a/includes/specials/SpecialWantedtemplates.php
+++ b/includes/specials/SpecialWantedtemplates.php
@@ -52,4 +52,8 @@ class WantedTemplatesPage extends WantedQueryPage {
'page_title = tl_title' ) ) )
);
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php
index 5dfc1133..c7f122b8 100644
--- a/includes/specials/SpecialWatchlist.php
+++ b/includes/specials/SpecialWatchlist.php
@@ -26,7 +26,7 @@ class SpecialWatchlist extends SpecialPage {
/**
* Constructor
*/
- public function __construct( $page = 'Watchlist' ){
+ public function __construct( $page = 'Watchlist' ) {
parent::__construct( $page );
}
@@ -76,7 +76,7 @@ class SpecialWatchlist extends SpecialPage {
$mode = SpecialEditWatchlist::getMode( $request, $par );
if( $mode !== false ) {
# TODO: localise?
- switch( $mode ){
+ switch( $mode ) {
case SpecialEditWatchlist::EDIT_CLEAR:
$mode = 'clear';
break;
@@ -91,7 +91,9 @@ class SpecialWatchlist extends SpecialPage {
return;
}
- $nitems = $this->countItems();
+ $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
+
+ $nitems = $this->countItems( $dbr );
if ( $nitems == 0 ) {
$output->addWikiMsg( 'nowatchlist' );
return;
@@ -106,37 +108,30 @@ class SpecialWatchlist extends SpecialPage {
/* bool */ 'hideLiu' => (int)$user->getBoolOption( 'watchlisthideliu' ),
/* bool */ 'hidePatrolled' => (int)$user->getBoolOption( 'watchlisthidepatrolled' ),
/* bool */ 'hideOwn' => (int)$user->getBoolOption( 'watchlisthideown' ),
- /* ? */ 'namespace' => 'all',
+ /* bool */ 'extended' => (int)$user->getBoolOption( 'extendwatchlist' ),
+ /* ? */ 'namespace' => '', //means all
/* ? */ 'invert' => false,
/* bool */ 'associated' => false,
);
$this->customFilters = array();
wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
foreach( $this->customFilters as $key => $params ) {
- $defaults[$key] = $params['msg'];
+ $defaults[$key] = $params['default'];
}
# Extract variables from the request, falling back to user preferences or
# other default values if these don't exist
- $prefs['days'] = floatval( $user->getOption( 'watchlistdays' ) );
- $prefs['hideminor'] = $user->getBoolOption( 'watchlisthideminor' );
- $prefs['hidebots'] = $user->getBoolOption( 'watchlisthidebots' );
- $prefs['hideanons'] = $user->getBoolOption( 'watchlisthideanons' );
- $prefs['hideliu'] = $user->getBoolOption( 'watchlisthideliu' );
- $prefs['hideown' ] = $user->getBoolOption( 'watchlisthideown' );
- $prefs['hidepatrolled' ] = $user->getBoolOption( 'watchlisthidepatrolled' );
-
- # Get query variables
$values = array();
- $values['days'] = $request->getVal( 'days', $prefs['days'] );
- $values['hideMinor'] = (int)$request->getBool( 'hideMinor', $prefs['hideminor'] );
- $values['hideBots'] = (int)$request->getBool( 'hideBots' , $prefs['hidebots'] );
- $values['hideAnons'] = (int)$request->getBool( 'hideAnons', $prefs['hideanons'] );
- $values['hideLiu'] = (int)$request->getBool( 'hideLiu' , $prefs['hideliu'] );
- $values['hideOwn'] = (int)$request->getBool( 'hideOwn' , $prefs['hideown'] );
- $values['hidePatrolled'] = (int)$request->getBool( 'hidePatrolled', $prefs['hidepatrolled'] );
+ $values['days'] = $request->getVal( 'days', $defaults['days'] );
+ $values['hideMinor'] = (int)$request->getBool( 'hideMinor', $defaults['hideMinor'] );
+ $values['hideBots'] = (int)$request->getBool( 'hideBots', $defaults['hideBots'] );
+ $values['hideAnons'] = (int)$request->getBool( 'hideAnons', $defaults['hideAnons'] );
+ $values['hideLiu'] = (int)$request->getBool( 'hideLiu', $defaults['hideLiu'] );
+ $values['hideOwn'] = (int)$request->getBool( 'hideOwn', $defaults['hideOwn'] );
+ $values['hidePatrolled'] = (int)$request->getBool( 'hidePatrolled', $defaults['hidePatrolled'] );
+ $values['extended'] = (int)$request->getBool( 'extended', $defaults['extended'] );
foreach( $this->customFilters as $key => $params ) {
- $values[$key] = (int)$request->getBool( $key );
+ $values[$key] = (int)$request->getBool( $key, $defaults[$key] );
}
# Get namespace value, if supplied, and prepare a WHERE fragment
@@ -190,13 +185,11 @@ class SpecialWatchlist extends SpecialPage {
return;
}
- $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
-
# Possible where conditions
$conds = array();
if( $values['days'] > 0 ) {
- $conds[] = "rc_timestamp > '".$dbr->timestamp( time() - intval( $values['days'] * 86400 ) )."'";
+ $conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $values['days'] * 86400 ) ) );
}
# If the watchlist is relatively short, it's simplest to zip
@@ -207,7 +200,6 @@ class SpecialWatchlist extends SpecialPage {
# Up estimate of watched items by 15% to compensate for talk pages...
-
# Toggles
if( $values['hideOwn'] ) {
$conds[] = 'rc_user != ' . $user->getId();
@@ -232,8 +224,8 @@ class SpecialWatchlist extends SpecialPage {
}
# Toggle watchlist content (all recent edits or just the latest)
- if( $user->getOption( 'extendwatchlist' ) ) {
- $limitWatchlist = intval( $user->getOption( 'wllimit' ) );
+ if( $values['extended'] ) {
+ $limitWatchlist = $user->getIntOption( 'wllimit' );
$usePage = false;
} else {
# Top log Ids for a page are not stored
@@ -249,10 +241,10 @@ class SpecialWatchlist extends SpecialPage {
}
# Create output form
- $form = Xml::fieldset( $this->msg( 'watchlist-options' )->text(), false, array( 'id' => 'mw-watchlist-options' ) );
+ $form = Xml::fieldset( $this->msg( 'watchlist-options' )->text(), false, array( 'id' => 'mw-watchlist-options' ) );
# Show watchlist header
- $form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse();
+ $form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse() . "\n";
if( $user->getOption( 'enotifwatchlistpages' ) && $wgEnotifWatchlist) {
$form .= $this->msg( 'wlheader-enotif' )->parseAsBlock() . "\n";
@@ -260,19 +252,19 @@ class SpecialWatchlist extends SpecialPage {
if( $wgShowUpdatedMarker ) {
$form .= Xml::openElement( 'form', array( 'method' => 'post',
'action' => $this->getTitle()->getLocalUrl(),
- 'id' => 'mw-watchlist-resetbutton' ) ) .
- $this->msg( 'wlheader-showupdated' )->parse() . ' ' .
- Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) .
- Html::hidden( 'reset', 'all' );
+ 'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
+ $this->msg( 'wlheader-showupdated' )->parse() .
+ Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
+ Html::hidden( 'reset', 'all' ) . "\n";
foreach ( $nondefaults as $key => $value ) {
- $form .= Html::hidden( $key, $value );
+ $form .= Html::hidden( $key, $value ) . "\n";
}
- $form .= Xml::closeElement( 'form' );
+ $form .= Xml::closeElement( 'form' ) . "\n";
}
- $form .= '<hr />';
+ $form .= "<hr />\n";
$tables = array( 'recentchanges', 'watchlist' );
- $fields = array( $dbr->tableName( 'recentchanges' ) . '.*' );
+ $fields = RecentChange::selectFields();
$join_conds = array(
'watchlist' => array(
'INNER JOIN',
@@ -291,17 +283,17 @@ class SpecialWatchlist extends SpecialPage {
$options['LIMIT'] = $limitWatchlist;
}
- $rollbacker = $user->isAllowed('rollback');
+ $rollbacker = $user->isAllowed( 'rollback' );
if ( $usePage || $rollbacker ) {
$tables[] = 'page';
- $join_conds['page'] = array('LEFT JOIN','rc_cur_id=page_id');
+ $join_conds['page'] = array( 'LEFT JOIN', 'rc_cur_id=page_id' );
if ( $rollbacker ) {
$fields[] = 'page_latest';
}
}
ChangeTags::modifyDisplayQuery( $tables, $fields, $conds, $join_conds, $options, '' );
- wfRunHooks('SpecialWatchlistQuery', array(&$conds,&$tables,&$join_conds,&$fields) );
+ wfRunHooks( 'SpecialWatchlistQuery', array( &$conds, &$tables, &$join_conds, &$fields, $values ) );
$res = $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $join_conds );
$numRows = $res->numRows();
@@ -313,10 +305,10 @@ class SpecialWatchlist extends SpecialPage {
if( $values['days'] > 0 ) {
$timestamp = wfTimestampNow();
$wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $values['days'] * 24 ) )->params(
- $lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user ) )->parse() . '<br />';
+ $lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user ) )->parse() . "<br />\n";
}
- $cutofflinks = "\n" . $this->cutoffLinks( $values['days'], $nondefaults ) . "<br />\n";
+ $cutofflinks = $this->cutoffLinks( $values['days'], $nondefaults ) . "<br />\n";
# Spit out some control panel links
$filters = array(
@@ -340,12 +332,17 @@ class SpecialWatchlist extends SpecialPage {
$links[] = $this->showHideLink( $nondefaults, $msg, $name, $values[$name] );
}
+ $hiddenFields = $nondefaults;
+ unset( $hiddenFields['namespace'] );
+ unset( $hiddenFields['invert'] );
+ unset( $hiddenFields['associated'] );
+
# Namespace filter and put the whole form together.
$form .= $wlInfo;
$form .= $cutofflinks;
- $form .= $lang->pipeList( $links );
- $form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl(), 'id' => 'mw-watchlist-form-namespaceselector' ) );
- $form .= '<hr /><p>';
+ $form .= $lang->pipeList( $links ) . "\n";
+ $form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl(), 'id' => 'mw-watchlist-form-namespaceselector' ) ) . "\n";
+ $form .= "<hr />\n<p>";
$form .= Html::namespaceSelector(
array(
'selected' => $nameSpace,
@@ -371,15 +368,12 @@ class SpecialWatchlist extends SpecialPage {
$associated,
array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
) . '&#160;';
- $form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . '</p>';
- $form .= Html::hidden( 'days', $values['days'] );
- foreach ( $filters as $key => $msg ) {
- if ( $values[$key] ) {
- $form .= Html::hidden( $key, 1 );
- }
+ $form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "</p>\n";
+ foreach ( $hiddenFields as $key => $value ) {
+ $form .= Html::hidden( $key, $value ) . "\n";
}
- $form .= Xml::closeElement( 'form' );
- $form .= Xml::closeElement( 'fieldset' );
+ $form .= Xml::closeElement( 'form' ) . "\n";
+ $form .= Xml::closeElement( 'fieldset' ) . "\n";
$output->addHTML( $form );
# If there's nothing to show, stop here
@@ -432,7 +426,10 @@ class SpecialWatchlist extends SpecialPage {
$rc->numberofWatchingusers = 0;
}
- $s .= $list->recentChangesLine( $rc, $updated, $counter );
+ $changeLine = $list->recentChangesLine( $rc, $updated, $counter );
+ if ( $changeLine !== false ) {
+ $s .= $changeLine;
+ }
}
$s .= $list->endRecentChangesList();
@@ -494,11 +491,10 @@ class SpecialWatchlist extends SpecialPage {
/**
* Count the number of items on a user's watchlist
*
+ * @param $dbr A database connection
* @return Integer
*/
- protected function countItems() {
- $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
-
+ protected function countItems( $dbr ) {
# Fetch the raw count
$res = $dbr->select( 'watchlist', array( 'count' => 'COUNT(*)' ),
array( 'wl_user' => $this->getUser()->getId() ), __METHOD__ );
@@ -507,4 +503,8 @@ class SpecialWatchlist extends SpecialPage {
return floor( $count / 2 );
}
+
+ protected function getGroupName() {
+ return 'changes';
+ }
}
diff --git a/includes/specials/SpecialWhatlinkshere.php b/includes/specials/SpecialWhatlinkshere.php
index f1356493..cb3e985c 100644
--- a/includes/specials/SpecialWhatlinkshere.php
+++ b/includes/specials/SpecialWhatlinkshere.php
@@ -69,7 +69,7 @@ class SpecialWhatLinksHere extends SpecialPage {
$opts->validateIntBounds( 'limit', 0, 5000 );
// Give precedence to subpage syntax
- if ( isset($par) ) {
+ if ( isset( $par ) ) {
$opts->setValue( 'target', $par );
}
@@ -94,9 +94,9 @@ class SpecialWhatLinksHere extends SpecialPage {
}
/**
- * @param $level int Recursion level
+ * @param int $level Recursion level
* @param $target Title Target title
- * @param $limit int Number of entries to display
+ * @param int $limit Number of entries to display
* @param $from Title Display from this article ID
* @param $back Title Display from this article ID at backwards scrolling
*/
@@ -137,7 +137,7 @@ class SpecialWhatLinksHere extends SpecialPage {
);
$namespace = $this->opts->getValue( 'namespace' );
- if ( is_int($namespace) ) {
+ if ( is_int( $namespace ) ) {
$plConds['page_namespace'] = $namespace;
$tlConds['page_namespace'] = $namespace;
$ilConds['page_namespace'] = $namespace;
@@ -187,7 +187,7 @@ class SpecialWhatLinksHere extends SpecialPage {
$joinConds);
}
- if( ( !$fetchlinks || !$dbr->numRows($plRes) ) && ( $hidetrans || !$dbr->numRows($tlRes) ) && ( $hideimages || !$dbr->numRows($ilRes) ) ) {
+ if( ( !$fetchlinks || !$plRes->numRows() ) && ( $hidetrans || !$tlRes->numRows() ) && ( $hideimages || !$ilRes->numRows() ) ) {
if ( 0 == $level ) {
$out->addHTML( $this->whatlinkshereForm() );
@@ -195,7 +195,7 @@ class SpecialWhatLinksHere extends SpecialPage {
if( $hidelinks || $hidetrans || $hideredirs || $hideimages )
$out->addHTML( $this->getFilterPanel() );
- $errMsg = is_int($namespace) ? 'nolinkshere-ns' : 'nolinkshere';
+ $errMsg = is_int( $namespace ) ? 'nolinkshere-ns' : 'nolinkshere';
$out->addWikiMsg( $errMsg, $this->target->getPrefixedText() );
}
return;
@@ -360,7 +360,7 @@ class SpecialWhatLinksHere extends SpecialPage {
$next = $this->msg( 'whatlinkshere-next' )->numParams( $currentLimit )->escaped();
$changed = $this->opts->getChangedValues();
- unset($changed['target']); // Already in the request title
+ unset( $changed['target'] ); // Already in the request title
if ( 0 != $prevId ) {
$overrides = array( 'from' => $this->opts->getValue( 'back' ) );
@@ -446,7 +446,7 @@ class SpecialWhatLinksHere extends SpecialPage {
$hide = $this->msg( 'hide' )->escaped();
$changed = $this->opts->getChangedValues();
- unset($changed['target']); // Already in the request title
+ unset( $changed['target'] ); // Already in the request title
$links = array();
$types = array( 'hidetrans', 'hidelinks', 'hideredirs' );
@@ -459,9 +459,13 @@ class SpecialWhatLinksHere extends SpecialPage {
$chosen = $this->opts->getValue( $type );
$msg = $chosen ? $show : $hide;
$overrides = array( $type => !$chosen );
- $links[] = $this->msg( "whatlinkshere-{$type}" )->rawParams(
+ $links[] = $this->msg( "whatlinkshere-{$type}" )->rawParams(
$this->makeSelfLink( $msg, array_merge( $changed, $overrides ) ) )->escaped();
}
return Xml::fieldset( $this->msg( 'whatlinkshere-filters' )->text(), $this->getLanguage()->pipeList( $links ) );
}
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
}
diff --git a/includes/specials/SpecialWithoutinterwiki.php b/includes/specials/SpecialWithoutinterwiki.php
index 2988b04f..37237407 100644
--- a/includes/specials/SpecialWithoutinterwiki.php
+++ b/includes/specials/SpecialWithoutinterwiki.php
@@ -95,4 +95,8 @@ class WithoutInterwikiPage extends PageQueryPage {
}
return $query;
}
+
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}
diff --git a/includes/templates/NoLocalSettings.php b/includes/templates/NoLocalSettings.php
index bf5c487a..2483e58c 100644
--- a/includes/templates/NoLocalSettings.php
+++ b/includes/templates/NoLocalSettings.php
@@ -21,6 +21,10 @@
* @ingroup Templates
*/
+if ( !defined( 'MEDIAWIKI' ) ) {
+ die( "NoLocalSettings.php is not a valid MediaWiki entry point\n" );
+}
+
if ( !isset( $wgVersion ) ) {
$wgVersion = 'VERSION';
}
diff --git a/includes/templates/Usercreate.php b/includes/templates/Usercreate.php
index 98727f17..541d9e40 100644
--- a/includes/templates/Usercreate.php
+++ b/includes/templates/Usercreate.php
@@ -40,7 +40,7 @@ class UsercreateTemplate extends QuickTemplate {
'helptext' => $helptext,
);
}
-
+
function execute() {
if( $this->data['message'] ) {
?>
@@ -77,13 +77,27 @@ class UsercreateTemplate extends QuickTemplate {
</td>
</tr>
<tr>
+ <td></td>
+ <td class="mw-input">
+ <?php if( $this->data['createemail'] ) {
+ echo Xml::checkLabel(
+ wfMessage( 'createaccountmail' )->text(),
+ 'wpCreateaccountMail',
+ 'wpCreateaccountMail',
+ $this->data['createemailset'],
+ array( 'tabindex' => '2' )
+ );
+ } ?>
+ </td>
+ </tr>
+ <tr class="mw-row-password">
<td class="mw-label"><label for='wpPassword2'><?php $this->msg('yourpassword') ?></label></td>
<td class="mw-input">
<?php
echo Html::input( 'wpPassword', null, 'password', array(
'class' => 'loginPassword',
'id' => 'wpPassword2',
- 'tabindex' => '2',
+ 'tabindex' => '3',
'size' => '20'
) + User::passwordChangeInputAttribs() ); ?>
</td>
@@ -94,24 +108,24 @@ class UsercreateTemplate extends QuickTemplate {
$doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
}
?>
- <tr>
+ <tr id="mw-user-domain-section">
<td class="mw-label"><?php $this->msg( 'yourdomainname' ) ?></td>
<td class="mw-input">
<select name="wpDomain" value="<?php $this->text( 'domain' ) ?>"
- tabindex="3">
+ tabindex="4">
<?php echo $doms ?>
</select>
</td>
</tr>
<?php } ?>
- <tr>
+ <tr class="mw-row-password">
<td class="mw-label"><label for='wpRetype'><?php $this->msg('yourpasswordagain') ?></label></td>
<td class="mw-input">
<?php
echo Html::input( 'wpRetype', null, 'password', array(
'class' => 'loginPassword',
'id' => 'wpRetype',
- 'tabindex' => '4',
+ 'tabindex' => '5',
'size' => '20'
) + User::passwordChangeInputAttribs() ); ?>
</td>
@@ -124,7 +138,7 @@ class UsercreateTemplate extends QuickTemplate {
echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
'class' => 'loginText',
'id' => 'wpEmail',
- 'tabindex' => '5',
+ 'tabindex' => '6',
'size' => '20'
) ); ?>
<div class="prefsectiontip">
@@ -146,7 +160,7 @@ class UsercreateTemplate extends QuickTemplate {
<td class="mw-label"><label for='wpRealName'><?php $this->msg('yourrealname') ?></label></td>
<td class="mw-input">
<input type='text' class='loginText' name="wpRealName" id="wpRealName"
- tabindex="6"
+ tabindex="7"
value="<?php $this->text('realname') ?>" size='20' />
<div class="prefsectiontip">
<?php $this->msgWiki('prefs-help-realname'); ?>
@@ -159,7 +173,7 @@ class UsercreateTemplate extends QuickTemplate {
<td class="mw-label"><label for='wpReason'><?php $this->msg('createaccountreason') ?></label></td>
<td class="mw-input">
<input type='text' class='loginText' name="wpReason" id="wpReason"
- tabindex="7"
+ tabindex="8"
value="<?php $this->text('reason') ?>" size='20' />
</td>
<?php } ?>
@@ -176,20 +190,20 @@ class UsercreateTemplate extends QuickTemplate {
'wpRemember',
'wpRemember',
$this->data['remember'],
- array( 'tabindex' => '8' )
+ array( 'tabindex' => '9' )
)
?>
</td>
</tr>
<?php }
- $tabIndex = 9;
+ $tabIndex = 10;
if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
foreach ( $this->data['extraInput'] as $inputItem ) { ?>
<tr>
- <?php
+ <?php
if ( !empty( $inputItem['msg'] ) && $inputItem['type'] != 'checkbox' ) {
- ?><td class="mw-label"><label for="<?php
+ ?><td class="mw-label"><label for="<?php
echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
$this->msgWiki( $inputItem['msg'] ) ?></label><?php
} else {
@@ -200,17 +214,17 @@ class UsercreateTemplate extends QuickTemplate {
<input type="<?php echo htmlspecialchars( $inputItem['type'] ) ?>" name="<?php
echo htmlspecialchars( $inputItem['name'] ); ?>"
tabindex="<?php echo $tabIndex++; ?>"
- value="<?php
+ value="<?php
if ( $inputItem['type'] != 'checkbox' ) {
echo htmlspecialchars( $inputItem['value'] );
} else {
echo '1';
- }
+ }
?>" id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
- <?php
+ <?php
if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['value'] ) )
- echo 'checked="checked"';
- ?> /> <?php
+ echo 'checked="checked"';
+ ?> /> <?php
if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['msg'] ) ) {
?>
<label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
@@ -224,8 +238,7 @@ class UsercreateTemplate extends QuickTemplate {
<?php } ?>
</td>
</tr>
-<?php
-
+<?php
}
}
?>
@@ -235,11 +248,6 @@ class UsercreateTemplate extends QuickTemplate {
<input type='submit' name="wpCreateaccount" id="wpCreateaccount"
tabindex="<?php echo $tabIndex++; ?>"
value="<?php $this->msg('createaccount') ?>" />
- <?php if( $this->data['createemail'] ) { ?>
- <input type='submit' name="wpCreateaccountMail" id="wpCreateaccountMail"
- tabindex="<?php echo $tabIndex++; ?>"
- value="<?php $this->msg('createaccountmail') ?>" />
- <?php } ?>
</td>
</tr>
</table>
diff --git a/includes/templates/Userlogin.php b/includes/templates/Userlogin.php
index a3f6a38b..7bc0241a 100644
--- a/includes/templates/Userlogin.php
+++ b/includes/templates/Userlogin.php
@@ -25,8 +25,6 @@
* @defgroup Templates Templates
*/
-if( !defined( 'MEDIAWIKI' ) ) die( -1 );
-
/**
* HTML template for Special:Userlogin form
* @ingroup Templates
@@ -146,7 +144,7 @@ class UserloginTemplate extends QuickTemplate {
'tabindex' => '9'
) );
if ( $this->data['useemail'] && $this->data['canreset'] ) {
- if( $this->data['resetlink'] === true ){
+ if( $this->data['resetlink'] === true ) {
echo '&#160;';
echo Linker::link(
SpecialPage::getTitleFor( 'PasswordReset' ),
diff --git a/includes/tidy.conf b/includes/tidy.conf
index aa333fcb..6c947295 100644
--- a/includes/tidy.conf
+++ b/includes/tidy.conf
@@ -16,4 +16,7 @@ quiet: yes
quote-nbsp: yes
fix-backslash: no
fix-uri: no
-new-inline-tags: video,audio,source,track,bdi
+# Don't strip html5 elements we support
+# html-{meta,link} is a hack we use to prevent Tidy from stripping <meta> and <link> used in the body for Microdata
+new-empty-tags: html-meta, html-link
+new-inline-tags: video, audio, source, track, bdi, data, time, mark
diff --git a/includes/upload/UploadBase.php b/includes/upload/UploadBase.php
index 0848780f..5a823622 100644
--- a/includes/upload/UploadBase.php
+++ b/includes/upload/UploadBase.php
@@ -65,6 +65,8 @@ abstract class UploadBase {
const WINDOWS_NONASCII_FILENAME = 13;
const FILENAME_TOO_LONG = 14;
+ const SESSION_STATUS_KEY = 'wsUploadStatusData';
+
/**
* @param $error int
* @return string
@@ -78,7 +80,7 @@ abstract class UploadBase {
self::ILLEGAL_FILENAME => 'illegal-filename',
self::OVERWRITE_EXISTING_FILE => 'overwrite',
self::VERIFICATION_ERROR => 'verification-error',
- self::HOOK_ABORTED => 'hookaborted',
+ self::HOOK_ABORTED => 'hookaborted',
self::WINDOWS_NONASCII_FILENAME => 'windows-nonascii-filename',
self::FILENAME_TOO_LONG => 'filename-toolong',
);
@@ -108,7 +110,7 @@ abstract class UploadBase {
/**
* Returns true if the user can use this upload module or else a string
* identifying the missing permission.
- * Can be overriden by subclasses.
+ * Can be overridden by subclasses.
*
* @param $user User
* @return bool
@@ -190,10 +192,10 @@ abstract class UploadBase {
/**
* Initialize the path information
- * @param $name string the desired destination name
- * @param $tempPath string the temporary path
- * @param $fileSize int the file size
- * @param $removeTempFile bool (false) remove the temporary file?
+ * @param string $name the desired destination name
+ * @param string $tempPath the temporary path
+ * @param int $fileSize the file size
+ * @param bool $removeTempFile (false) remove the temporary file?
* @throws MWException
*/
public function initializePathInfo( $name, $tempPath, $fileSize, $removeTempFile = false ) {
@@ -209,7 +211,7 @@ abstract class UploadBase {
/**
* Initialize from a WebRequest. Override this in a subclass.
*/
- public abstract function initializeFromRequest( &$request );
+ abstract public function initializeFromRequest( &$request );
/**
* Fetch the file. Usually a no-op
@@ -236,7 +238,15 @@ abstract class UploadBase {
}
/**
- * @param $srcPath String: the source path
+ * Get the base 36 SHA1 of the file
+ * @return string
+ */
+ public function getTempFileSha1Base36() {
+ return FSFile::getSha1Base36FromPath( $this->mTempPath );
+ }
+
+ /**
+ * @param string $srcPath the source path
* @return string the real path if it was a virtual URL
*/
function getRealPath( $srcPath ) {
@@ -244,9 +254,9 @@ abstract class UploadBase {
$repo = RepoGroup::singleton()->getLocalRepo();
if ( $repo->isVirtualUrl( $srcPath ) ) {
// @TODO: just make uploads work with storage paths
- // UploadFromStash loads files via virtuals URLs
+ // UploadFromStash loads files via virtual URLs
$tmpFile = $repo->getLocalCopy( $srcPath );
- $tmpFile->bind( $this ); // keep alive with $thumb
+ $tmpFile->bind( $this ); // keep alive with $this
wfProfileOut( __METHOD__ );
return $tmpFile->getPath();
}
@@ -347,14 +357,14 @@ abstract class UploadBase {
*
* @note Only checks that it is not an evil mime. The does it have
* correct extension given its mime type check is in verifyFile.
- * @param $mime string representing the mime
+ * @param string $mime representing the mime
* @return mixed true if the file is verified, an array otherwise
*/
protected function verifyMimeType( $mime ) {
global $wgVerifyMimeType;
wfProfileIn( __METHOD__ );
if ( $wgVerifyMimeType ) {
- wfDebug ( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n");
+ wfDebug ( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n" );
global $wgMimeTypeBlacklist;
if ( $this->checkFileExtension( $mime, $wgMimeTypeBlacklist ) ) {
wfProfileOut( __METHOD__ );
@@ -447,7 +457,7 @@ abstract class UploadBase {
$this->mFileProps = FSFile::getPropsFromPath( $this->mTempPath, $this->mFinalExtension );
# check mime type, if desired
- $mime = $this->mFileProps[ 'file-mime' ];
+ $mime = $this->mFileProps['file-mime'];
$status = $this->verifyMimeType( $mime );
if ( $status !== true ) {
wfProfileOut( __METHOD__ );
@@ -575,7 +585,9 @@ abstract class UploadBase {
}
/**
- * Check for non fatal problems with the file
+ * Check for non fatal problems with the file.
+ *
+ * This should not assume that mTempPath is set.
*
* @return Array of warnings
*/
@@ -610,7 +622,7 @@ abstract class UploadBase {
global $wgUploadSizeWarning;
if ( $wgUploadSizeWarning && ( $this->mFileSize > $wgUploadSizeWarning ) ) {
- $warnings['large-file'] = $wgUploadSizeWarning;
+ $warnings['large-file'] = array( $wgUploadSizeWarning, $this->mFileSize );
}
if ( $this->mFileSize == 0 ) {
@@ -623,7 +635,7 @@ abstract class UploadBase {
}
// Check dupes against existing files
- $hash = FSFile::getSha1Base36FromPath( $this->mTempPath );
+ $hash = $this->getTempFileSha1Base36();
$dupes = RepoGroup::singleton()->findBySha1( $hash );
$title = $this->getTitle();
// Remove all matches against self
@@ -723,8 +735,6 @@ abstract class UploadBase {
}
$this->mFilteredName = $nt->getDBkey();
-
-
/**
* We'll want to blacklist against *any* 'extension', and use
* only the final one for the whitelist.
@@ -752,7 +762,6 @@ abstract class UploadBase {
$ext = array( $this->mFinalExtension );
}
}
-
}
/* Don't allow users to override the blacklist (check file extension) */
@@ -787,7 +796,7 @@ abstract class UploadBase {
}
if( strlen( $partname ) < 1 ) {
- $this->mTitleError = self::MIN_LENGTH_PARTNAME;
+ $this->mTitleError = self::MIN_LENGTH_PARTNAME;
return $this->mTitle = null;
}
@@ -816,13 +825,14 @@ abstract class UploadBase {
* This method returns the file object, which also has a 'fileKey' property which can be passed through a form or
* API request to find this stashed file again.
*
+ * @param $user User
* @return UploadStashFile stashed file
*/
- public function stashFile() {
+ public function stashFile( User $user = null ) {
// was stashSessionFile
wfProfileIn( __METHOD__ );
- $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
+ $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash( $user );
$file = $stash->stashFile( $this->mTempPath, $this->getSourceType() );
$this->mLocalFile = $file;
@@ -905,8 +915,8 @@ abstract class UploadBase {
/**
* Checks if the mime type of the uploaded file matches the file extension.
*
- * @param $mime String: the mime type of the uploaded file
- * @param $extension String: the filename extension that the file is to be served with
+ * @param string $mime the mime type of the uploaded file
+ * @param string $extension the filename extension that the file is to be served with
* @return Boolean
*/
public static function verifyExtension( $mime, $extension ) {
@@ -946,9 +956,9 @@ abstract class UploadBase {
* potentially harmful. The present implementation will produce false
* positives in some situations.
*
- * @param $file String: pathname to the temporary upload file
- * @param $mime String: the mime type of the file
- * @param $extension String: the extension of the file
+ * @param string $file pathname to the temporary upload file
+ * @param string $mime the mime type of the file
+ * @param string $extension the extension of the file
* @return Boolean: true if the file contains something looking like embedded scripts
*/
public static function detectScript( $file, $mime, $extension ) {
@@ -958,7 +968,7 @@ abstract class UploadBase {
# ugly hack: for text files, always look at the entire file.
# For binary field, just check the first K.
- if( strpos( $mime,'text/' ) === 0 ) {
+ if( strpos( $mime, 'text/' ) === 0 ) {
$chunk = file_get_contents( $file );
} else {
$fp = fopen( $file, 'rb' );
@@ -988,7 +998,7 @@ abstract class UploadBase {
$chunk = trim( $chunk );
- # @todo FIXME: Convert from UTF-16 if necessarry!
+ # @todo FIXME: Convert from UTF-16 if necessary!
wfDebug( __METHOD__ . ": checking for embedded scripts and HTML stuff\n" );
# check for HTML doctype
@@ -1173,7 +1183,7 @@ abstract class UploadBase {
foreach( $attribs as $attrib => $value ) {
$stripped = $this->stripXmlNamespace( $attrib );
- $value = strtolower($value);
+ $value = strtolower( $value );
if( substr( $stripped, 0, 2 ) == 'on' ) {
wfDebug( __METHOD__ . ": Found event-handler attribute '$attrib'='$value' in uploaded file.\n" );
@@ -1186,13 +1196,13 @@ abstract class UploadBase {
return true;
}
- # href with embeded svg as target
+ # href with embedded svg as target
if( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
return true;
}
- # href with embeded (text/xml) svg as target
+ # href with embedded (text/xml) svg as target
if( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
return true;
@@ -1206,19 +1216,18 @@ abstract class UploadBase {
# use set to add href attribute to parent element
if( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
- wfDebug( __METHOD__ . ": Found svg setting href attibute '$value' in uploaded file.\n" );
+ wfDebug( __METHOD__ . ": Found svg setting href attribute '$value' in uploaded file.\n" );
return true;
}
# use set to add a remote / data / script target to an element
- if( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
- wfDebug( __METHOD__ . ": Found svg setting attibute to '$value' in uploaded file.\n" );
+ if( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+ wfDebug( __METHOD__ . ": Found svg setting attribute to '$value' in uploaded file.\n" );
return true;
}
-
# use handler attribute with remote / data / script
- if( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+ if( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script '$attrib'='$value' in uploaded file.\n" );
return true;
}
@@ -1226,8 +1235,8 @@ abstract class UploadBase {
# use CSS styles to bring in remote code
# catch url("http:..., url('http:..., url(http:..., but not url("#..., url('#..., url(#....
if( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
- foreach ($matches[1] as $match) {
- if (!preg_match( '!(?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
+ foreach ( $matches[1] as $match ) {
+ if ( !preg_match( '!(?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
wfDebug( __METHOD__ . ": Found svg setting a style with remote url '$attrib'='$value' in uploaded file.\n" );
return true;
}
@@ -1260,7 +1269,7 @@ abstract class UploadBase {
* This relies on the $wgAntivirus and $wgAntivirusSetup variables.
* $wgAntivirusRequired may be used to deny upload if the scan fails.
*
- * @param $file String: pathname to the temporary upload file
+ * @param string $file pathname to the temporary upload file
* @return mixed false if not virus is found, NULL if the scan fails or is disabled,
* or a string containing feedback from the virus scanner if a virus was found.
* If textual feedback is missing but a virus was found, this function returns true.
@@ -1317,27 +1326,22 @@ abstract class UploadBase {
}
}
+ /* NB: AV_NO_VIRUS is 0 but AV_SCAN_FAILED is false,
+ * so we need the strict equalities === and thus can't use a switch here
+ */
if ( $mappedCode === AV_SCAN_FAILED ) {
# scan failed (code was mapped to false by $exitCodeMap)
wfDebug( __METHOD__ . ": failed to scan $file (code $exitCode).\n" );
- if ( $wgAntivirusRequired ) {
- wfProfileOut( __METHOD__ );
- return wfMessage( 'virus-scanfailed', array( $exitCode ) )->text();
- } else {
- wfProfileOut( __METHOD__ );
- return null;
- }
+ $output = $wgAntivirusRequired ? wfMessage( 'virus-scanfailed', array( $exitCode ) )->text() : null;
} elseif ( $mappedCode === AV_SCAN_ABORTED ) {
# scan failed because filetype is unknown (probably imune)
wfDebug( __METHOD__ . ": unsupported file type $file (code $exitCode).\n" );
- wfProfileOut( __METHOD__ );
- return null;
+ $output = null;
} elseif ( $mappedCode === AV_NO_VIRUS ) {
# no virus found
wfDebug( __METHOD__ . ": file passed virus scan.\n" );
- wfProfileOut( __METHOD__ );
- return false;
+ $output = false;
} else {
$output = trim( $output );
@@ -1353,9 +1357,10 @@ abstract class UploadBase {
}
wfDebug( __METHOD__ . ": FOUND VIRUS! scanner feedback: $output \n" );
- wfProfileOut( __METHOD__ );
- return $output;
}
+
+ wfProfileOut( __METHOD__ );
+ return $output;
}
/**
@@ -1392,7 +1397,7 @@ abstract class UploadBase {
* Check if a user is the last uploader
*
* @param $user User object
- * @param $img String: image name
+ * @param string $img image name
* @return Boolean
*/
public static function userCanReUpload( User $user, $img ) {
@@ -1464,9 +1469,20 @@ abstract class UploadBase {
}
}
+ // Check for files with the same name but a different extension
+ $similarFiles = RepoGroup::singleton()->getLocalRepo()->findFilesByPrefix(
+ "{$partname}.", 1 );
+ if ( count( $similarFiles ) ) {
+ return array(
+ 'warning' => 'exists-normalized',
+ 'file' => $file,
+ 'normalizedFile' => $similarFiles[0],
+ );
+ }
+
if ( self::isThumbName( $file->getName() ) ) {
# Check for filenames like 50px- or 180px-, these are mostly thumbnails
- $nt_thb = Title::newFromText( substr( $partname , strpos( $partname , '-' ) +1 ) . '.' . $extension, NS_FILE );
+ $nt_thb = Title::newFromText( substr( $partname, strpos( $partname, '-' ) + 1 ) . '.' . $extension, NS_FILE );
$file_thb = wfLocalFile( $nt_thb );
if( $file_thb->exists() ) {
return array(
@@ -1484,7 +1500,6 @@ abstract class UploadBase {
}
}
-
foreach( self::getFilenamePrefixBlacklist() as $prefix ) {
if ( substr( $partname, 0, strlen( $prefix ) ) == $prefix ) {
return array(
@@ -1507,10 +1522,10 @@ abstract class UploadBase {
$n = strrpos( $filename, '.' );
$partname = $n ? substr( $filename, 0, $n ) : $filename;
return (
- substr( $partname , 3, 3 ) == 'px-' ||
- substr( $partname , 2, 3 ) == 'px-'
+ substr( $partname, 3, 3 ) == 'px-' ||
+ substr( $partname, 2, 3 ) == 'px-'
) &&
- preg_match( "/[0-9]{2}/" , substr( $partname , 0, 2 ) );
+ preg_match( "/[0-9]{2}/", substr( $partname, 0, 2 ) );
}
/**
@@ -1590,6 +1605,32 @@ abstract class UploadBase {
} else {
return intval( $wgMaxUploadSize );
}
+ }
+
+ /**
+ * Get the current status of a chunked upload (used for polling).
+ * The status will be read from the *current* user session.
+ * @param $statusKey string
+ * @return Array|bool
+ */
+ public static function getSessionStatus( $statusKey ) {
+ return isset( $_SESSION[self::SESSION_STATUS_KEY][$statusKey] )
+ ? $_SESSION[self::SESSION_STATUS_KEY][$statusKey]
+ : false;
+ }
+ /**
+ * Set the current status of a chunked upload (used for polling).
+ * The status will be stored in the *current* user session.
+ * @param $statusKey string
+ * @param $value array|false
+ * @return void
+ */
+ public static function setSessionStatus( $statusKey, $value ) {
+ if ( $value === false ) {
+ unset( $_SESSION[self::SESSION_STATUS_KEY][$statusKey] );
+ } else {
+ $_SESSION[self::SESSION_STATUS_KEY][$statusKey] = $value;
+ }
}
}
diff --git a/includes/upload/UploadFromChunks.php b/includes/upload/UploadFromChunks.php
index 531f7be4..4b331e98 100644
--- a/includes/upload/UploadFromChunks.php
+++ b/includes/upload/UploadFromChunks.php
@@ -37,7 +37,7 @@ class UploadFromChunks extends UploadFromFile {
* @param $stash UploadStash
* @param $repo FileRepo
*/
- public function __construct( $user = false, $stash = false, $repo = false ) {
+ public function __construct( $user = null, $stash = false, $repo = false ) {
// user object. sometimes this won't exist, as when running from cron.
$this->user = $user;
@@ -60,12 +60,13 @@ class UploadFromChunks extends UploadFromFile {
return true;
}
+
/**
* Calls the parent stashFile and updates the uploadsession table to handle "chunks"
*
* @return UploadStashFile stashed file
*/
- public function stashFile() {
+ public function stashFile( User $user = null ) {
// Stash file is the called on creating a new chunk session:
$this->mChunkIndex = 0;
$this->mOffset = 0;
@@ -78,7 +79,7 @@ class UploadFromChunks extends UploadFromFile {
$this->mFileKey = $this->mLocalFile->getFileKey();
// Output a copy of this first to chunk 0 location:
- $status = $this->outputChunk( $this->mLocalFile->getPath() );
+ $this->outputChunk( $this->mLocalFile->getPath() );
// Update db table to reflect initial "chunk" state
$this->updateChunkStatus();
@@ -113,7 +114,7 @@ class UploadFromChunks extends UploadFromFile {
// Concatenate all the chunks to mVirtualTempPath
$fileList = Array();
// The first chunk is stored at the mVirtualTempPath path so we start on "chunk 1"
- for( $i = 0; $i <= $this->getChunkIndex(); $i++ ){
+ for( $i = 0; $i <= $this->getChunkIndex(); $i++ ) {
$fileList[] = $this->getVirtualChunkLocation( $i );
}
@@ -122,13 +123,16 @@ class UploadFromChunks extends UploadFromFile {
// Get a 0-byte temp file to perform the concatenation at
$tmpFile = TempFSFile::factory( 'chunkedupload_', $ext );
$tmpPath = $tmpFile
- ? $tmpFile->getPath()
+ ? $tmpFile->bind( $this )->getPath() // keep alive with $this
: false; // fail in concatenate()
// Concatenate the chunks at the temp file
+ $tStart = microtime( true );
$status = $this->repo->concatenate( $fileList, $tmpPath, FileRepo::DELETE_SOURCE );
- if( !$status->isOk() ){
+ $tAmount = microtime( true ) - $tStart;
+ if( !$status->isOk() ) {
return $status;
}
+ wfDebugLog( 'fileconcatenate', "Combined $i chunks in $tAmount seconds.\n" );
$this->mTempPath = $tmpPath; // file system path
$this->mFileSize = filesize( $this->mTempPath ); //Since this was set for the last chunk previously
@@ -141,7 +145,11 @@ class UploadFromChunks extends UploadFromFile {
// Update the mTempPath and mLocalFile
// ( for FileUpload or normal Stash to take over )
- $this->mLocalFile = parent::stashFile();
+ $tStart = microtime( true );
+ $this->mLocalFile = parent::stashFile( $this->user );
+ $tAmount = microtime( true ) - $tStart;
+ $this->mLocalFile->setLocalReference( $tmpFile ); // reuse (e.g. for getImageInfo())
+ wfDebugLog( 'fileconcatenate', "Stashed combined file ($i chunks) in $tAmount seconds.\n" );
return $status;
}
@@ -164,7 +172,7 @@ class UploadFromChunks extends UploadFromFile {
* @param $index
* @return string
*/
- function getVirtualChunkLocation( $index ){
+ function getVirtualChunkLocation( $index ) {
return $this->repo->getVirtualUrl( 'temp' ) .
'/' .
$this->repo->getHashPath(
@@ -176,9 +184,9 @@ class UploadFromChunks extends UploadFromFile {
/**
* Add a chunk to the temporary directory
*
- * @param $chunkPath string path to temporary chunk file
- * @param $chunkSize int size of the current chunk
- * @param $offset int offset of current chunk ( mutch match database chunk offset )
+ * @param string $chunkPath path to temporary chunk file
+ * @param int $chunkSize size of the current chunk
+ * @param int $offset offset of current chunk ( mutch match database chunk offset )
* @return Status
*/
public function addChunk( $chunkPath, $chunkSize, $offset ) {
@@ -202,7 +210,7 @@ class UploadFromChunks extends UploadFromFile {
return Status::newFatal( $e->getMessage() );
}
$status = $this->outputChunk( $chunkPath );
- if( $status->isGood() ){
+ if( $status->isGood() ) {
// Update local offset:
$this->mOffset = $preAppendOffset + $chunkSize;
// Update chunk table status db
@@ -218,11 +226,14 @@ class UploadFromChunks extends UploadFromFile {
/**
* Update the chunk db table with the current status:
*/
- private function updateChunkStatus(){
+ private function updateChunkStatus() {
wfDebug( __METHOD__ . " update chunk status for {$this->mFileKey} offset:" .
$this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
$dbw = $this->repo->getMasterDb();
+ // Use a quick transaction since we will upload the full temp file into shared
+ // storage, which takes time for large files. We don't want to hold locks then.
+ $dbw->begin( __METHOD__ );
$dbw->update(
'uploadstash',
array(
@@ -233,12 +244,13 @@ class UploadFromChunks extends UploadFromFile {
array( 'us_key' => $this->mFileKey ),
__METHOD__
);
+ $dbw->commit( __METHOD__ );
}
/**
* Get the chunk db state and populate update relevant local values
*/
- private function getChunkStatus(){
+ private function getChunkStatus() {
// get Master db to avoid race conditions.
// Otherwise, if chunk upload time < replag there will be spurious errors
$dbw = $this->repo->getMasterDb();
@@ -264,8 +276,8 @@ class UploadFromChunks extends UploadFromFile {
* Get the current Chunk index
* @return Integer index of the current chunk
*/
- private function getChunkIndex(){
- if( $this->mChunkIndex !== null ){
+ private function getChunkIndex() {
+ if( $this->mChunkIndex !== null ) {
return $this->mChunkIndex;
}
return 0;
@@ -275,8 +287,8 @@ class UploadFromChunks extends UploadFromFile {
* Gets the current offset in fromt the stashedupload table
* @return Integer current byte offset of the chunk file set
*/
- private function getOffset(){
- if ( $this->mOffset !== null ){
+ private function getOffset() {
+ if ( $this->mOffset !== null ) {
return $this->mOffset;
}
return 0;
@@ -289,7 +301,7 @@ class UploadFromChunks extends UploadFromFile {
* @throws UploadChunkFileException
* @return FileRepoStatus
*/
- private function outputChunk( $chunkPath ){
+ private function outputChunk( $chunkPath ) {
// Key is fileKey + chunk index
$fileKey = $this->getChunkFileKey();
@@ -314,11 +326,11 @@ class UploadFromChunks extends UploadFromFile {
return $storeStatus;
}
- private function getChunkFileKey( $index = null ){
- if( $index === null ){
+ private function getChunkFileKey( $index = null ) {
+ if( $index === null ) {
$index = $this->getChunkIndex();
}
- return $this->mFileKey . '.' . $index ;
+ return $this->mFileKey . '.' . $index;
}
/**
diff --git a/includes/upload/UploadFromFile.php b/includes/upload/UploadFromFile.php
index aa0cc77b..ab2a7a39 100644
--- a/includes/upload/UploadFromFile.php
+++ b/includes/upload/UploadFromFile.php
@@ -79,21 +79,21 @@ class UploadFromFile extends UploadBase {
* @return array
*/
public function verifyUpload() {
- # Check for a post_max_size or upload_max_size overflow, so that a
+ # Check for a post_max_size or upload_max_size overflow, so that a
# proper error can be shown to the user
if ( is_null( $this->mTempPath ) || $this->isEmptyFile() ) {
if ( $this->mUpload->isIniSizeOverflow() ) {
- return array(
+ return array(
'status' => UploadBase::FILE_TOO_LARGE,
- 'max' => min(
- self::getMaxUploadSize( $this->getSourceType() ),
- wfShorthandToInteger( ini_get( 'upload_max_filesize' ) ),
+ 'max' => min(
+ self::getMaxUploadSize( $this->getSourceType() ),
+ wfShorthandToInteger( ini_get( 'upload_max_filesize' ) ),
wfShorthandToInteger( ini_get( 'post_max_size' ) )
),
);
}
}
-
+
return parent::verifyUpload();
}
}
diff --git a/includes/upload/UploadFromStash.php b/includes/upload/UploadFromStash.php
index d79641ce..c82103cb 100644
--- a/includes/upload/UploadFromStash.php
+++ b/includes/upload/UploadFromStash.php
@@ -89,7 +89,7 @@ class UploadFromStash extends UploadBase {
* @param $key string
* @param $name string
*/
- public function initialize( $key, $name = 'upload_file' ) {
+ public function initialize( $key, $name = 'upload_file', $initTempFile = true ) {
/**
* Confirming a temporarily stashed upload.
* We don't want path names to be forged, so we keep
@@ -98,7 +98,7 @@ class UploadFromStash extends UploadBase {
*/
$metadata = $this->stash->getMetadata( $key );
$this->initializePathInfo( $name,
- $this->getRealPath ( $metadata['us_path'] ),
+ $initTempFile ? $this->getRealPath( $metadata['us_path'] ) : false,
$metadata['us_size'],
false
);
@@ -129,6 +129,14 @@ class UploadFromStash extends UploadBase {
return $this->mSourceType;
}
+ /**
+ * Get the base 36 SHA1 of the file
+ * @return string
+ */
+ public function getTempFileSha1Base36() {
+ return $this->mFileProps['sha1'];
+ }
+
/*
* protected function verifyFile() inherited
*/
@@ -136,12 +144,13 @@ class UploadFromStash extends UploadBase {
/**
* Stash the file.
*
+ * @param $user User
* @return UploadStashFile
*/
- public function stashFile() {
+ public function stashFile( User $user = null ) {
// replace mLocalFile with an instance of UploadStashFile, which adds some methods
// that are useful for stashed files.
- $this->mLocalFile = parent::stashFile();
+ $this->mLocalFile = parent::stashFile( $user );
return $this->mLocalFile;
}
diff --git a/includes/upload/UploadFromUrl.php b/includes/upload/UploadFromUrl.php
index 927c3cd9..70b69034 100644
--- a/includes/upload/UploadFromUrl.php
+++ b/includes/upload/UploadFromUrl.php
@@ -61,6 +61,8 @@ class UploadFromUrl extends UploadBase {
/**
* Checks whether the URL is for an allowed host
+ * The domains in the whitelist can include wildcard characters (*) in place
+ * of any of the domain levels, e.g. '*.flickr.com' or 'upload.*.gov.uk'.
*
* @param $url string
* @return bool
@@ -76,10 +78,28 @@ class UploadFromUrl extends UploadBase {
}
$valid = false;
foreach( $wgCopyUploadsDomains as $domain ) {
+ // See if the domain for the upload matches this whitelisted domain
+ $whitelistedDomainPieces = explode( '.', $domain );
+ $uploadDomainPieces = explode( '.', $parsedUrl['host'] );
+ if ( count( $whitelistedDomainPieces ) === count( $uploadDomainPieces ) ) {
+ $valid = true;
+ // See if all the pieces match or not (excluding wildcards)
+ foreach ( $whitelistedDomainPieces as $index => $piece ) {
+ if ( $piece !== '*' && $piece !== $uploadDomainPieces[$index] ) {
+ $valid = false;
+ }
+ }
+ if ( $valid ) {
+ // We found a match, so quit comparing against the list
+ break;
+ }
+ }
+ /* Non-wildcard test
if ( $parsedUrl['host'] === $domain ) {
$valid = true;
break;
}
+ */
}
return $valid;
}
@@ -312,7 +332,7 @@ class UploadFromUrl extends UploadBase {
'sessionKey' => $sessionKey,
) );
$job->initializeSessionData();
- $job->insert();
+ JobQueueGroup::singleton()->push( $job );
return $sessionKey;
}
diff --git a/includes/upload/UploadStash.php b/includes/upload/UploadStash.php
index 53a90582..089bd8b7 100644
--- a/includes/upload/UploadStash.php
+++ b/includes/upload/UploadStash.php
@@ -97,7 +97,7 @@ class UploadStash {
* Get a file and its metadata from the stash.
* The noAuth param is a bit janky but is required for automated scripts which clean out the stash.
*
- * @param $key String: key under which file information is stored
+ * @param string $key key under which file information is stored
* @param $noAuth Boolean (optional) Don't check authentication. Used by maintenance scripts.
* @throws UploadStashFileNotFoundException
* @throws UploadStashNotLoggedInException
@@ -106,15 +106,13 @@ class UploadStash {
* @return UploadStashFile
*/
public function getFile( $key, $noAuth = false ) {
-
if ( ! preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
throw new UploadStashBadPathException( "key '$key' is not in a proper format" );
}
- if ( !$noAuth ) {
- if ( !$this->isLoggedIn ) {
- throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
- }
+ if ( !$noAuth && !$this->isLoggedIn ) {
+ throw new UploadStashNotLoggedInException( __METHOD__ .
+ ' No user is logged in, files must belong to users' );
}
if ( !isset( $this->fileMetadata[$key] ) ) {
@@ -131,8 +129,13 @@ class UploadStash {
$this->initFile( $key );
// fetch fileprops
- $path = $this->fileMetadata[$key]['us_path'];
- $this->fileProps[$key] = $this->repo->getFileProps( $path );
+ if ( strlen( $this->fileMetadata[$key]['us_props'] ) ) {
+ $this->fileProps[$key] = unserialize( $this->fileMetadata[$key]['us_props'] );
+ } else { // b/c for rows with no us_props
+ wfDebug( __METHOD__ . " fetched props for $key from file\n" );
+ $path = $this->fileMetadata[$key]['us_path'];
+ $this->fileProps[$key] = $this->repo->getFileProps( $path );
+ }
}
if ( ! $this->files[$key]->exists() ) {
@@ -152,7 +155,7 @@ class UploadStash {
/**
* Getter for file metadata.
*
- * @param key String: key under which file information is stored
+ * @param string $key key under which file information is stored
* @return Array
*/
public function getMetadata ( $key ) {
@@ -163,7 +166,7 @@ class UploadStash {
/**
* Getter for fileProps
*
- * @param key String: key under which file information is stored
+ * @param string $key key under which file information is stored
* @return Array
*/
public function getFileProps ( $key ) {
@@ -174,15 +177,15 @@ class UploadStash {
/**
* Stash a file in a temp directory and record that we did this in the database, along with other metadata.
*
- * @param $path String: path to file you want stashed
- * @param $sourceType String: the type of upload that generated this file (currently, I believe, 'file' or null)
+ * @param string $path path to file you want stashed
+ * @param string $sourceType the type of upload that generated this file (currently, I believe, 'file' or null)
* @throws UploadStashBadPathException
* @throws UploadStashFileException
* @throws UploadStashNotLoggedInException
* @return UploadStashFile: file, or null on failure
*/
public function stashFile( $path, $sourceType = null ) {
- if ( ! file_exists( $path ) ) {
+ if ( !is_file( $path ) ) {
wfDebug( __METHOD__ . " tried to stash file at '$path', but it doesn't exist\n" );
throw new UploadStashBadPathException( "path doesn't exist" );
}
@@ -192,12 +195,10 @@ class UploadStash {
// we will be initializing from some tmpnam files that don't have extensions.
// most of MediaWiki assumes all uploaded files have good extensions. So, we fix this.
$extension = self::getExtensionForPath( $path );
- if ( ! preg_match( "/\\.\\Q$extension\\E$/", $path ) ) {
+ if ( !preg_match( "/\\.\\Q$extension\\E$/", $path ) ) {
$pathWithGoodExtension = "$path.$extension";
- if ( ! rename( $path, $pathWithGoodExtension ) ) {
- throw new UploadStashFileException( "couldn't rename $path to have a better extension at $pathWithGoodExtension" );
- }
- $path = $pathWithGoodExtension;
+ } else {
+ $pathWithGoodExtension = $path;
}
// If no key was supplied, make one. a mysql insertid would be totally reasonable here, except
@@ -205,8 +206,8 @@ class UploadStash {
//
// some things that when combined will make a suitably unique key.
// see: http://www.jwz.org/doc/mid.html
- list ($usec, $sec) = explode( ' ', microtime() );
- $usec = substr($usec, 2);
+ list( $usec, $sec ) = explode( ' ', microtime() );
+ $usec = substr( $usec, 2 );
$key = wfBaseConvert( $sec . $usec, 10, 36 ) . '.' .
wfBaseConvert( mt_rand(), 10, 36 ) . '.'.
$this->userId . '.' .
@@ -221,7 +222,7 @@ class UploadStash {
wfDebug( __METHOD__ . " key for '$path': $key\n" );
// if not already in a temporary area, put it there
- $storeStatus = $this->repo->storeTemp( basename( $path ), $path );
+ $storeStatus = $this->repo->storeTemp( basename( $pathWithGoodExtension ), $path );
if ( ! $storeStatus->isOK() ) {
// It is a convention in MediaWiki to only return one error per API exception, even if multiple errors
@@ -244,9 +245,6 @@ class UploadStash {
}
$stashPath = $storeStatus->value;
- // we have renamed the file so we have to cleanup once done
- unlink($path);
-
// fetch the current user ID
if ( !$this->isLoggedIn ) {
throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
@@ -262,6 +260,7 @@ class UploadStash {
'us_key' => $key,
'us_orig_path' => $path,
'us_path' => $stashPath, // virtual URL
+ 'us_props' => serialize( $fileProps ),
'us_size' => $fileProps['size'],
'us_sha1' => $fileProps['sha1'],
'us_mime' => $fileProps['mime'],
@@ -319,8 +318,8 @@ class UploadStash {
/**
* Remove a particular file from the stash. Also removes it from the repo.
*
- * @throws UploadStashNotLoggedInException
- * @throws UploadStashWrongOwnerException
+ * @param $key
+ * @throws UploadStashNoSuchKeyException|UploadStashNotLoggedInException|UploadStashWrongOwnerException
* @return boolean: success
*/
public function removeFile( $key ) {
@@ -350,7 +349,6 @@ class UploadStash {
return $this->removeFileNoAuth( $key );
}
-
/**
* Remove a file (see removeFile), but doesn't check ownership first.
*
@@ -359,16 +357,16 @@ class UploadStash {
public function removeFileNoAuth( $key ) {
wfDebug( __METHOD__ . " clearing row $key\n" );
+ // Ensure we have the UploadStashFile loaded for this key
+ $this->getFile( $key );
+
$dbw = $this->repo->getMasterDb();
- // this gets its own transaction since it's called serially by the cleanupUploadStash maintenance script
- $dbw->begin( __METHOD__ );
$dbw->delete(
'uploadstash',
array( 'us_key' => $key ),
__METHOD__
);
- $dbw->commit( __METHOD__ );
// TODO: look into UnregisteredLocalFile and find out why the rv here is sometimes wrong (false when file was removed)
// for now, ignore.
@@ -419,6 +417,8 @@ class UploadStash {
* with an extension.
* XXX this is somewhat redundant with the checks that ApiUpload.php does with incoming
* uploads versus the desired filename. Maybe we can get that passed to us...
+ * @param $path
+ * @throws UploadStashFileException
* @return string
*/
public static function getExtensionForPath( $path ) {
@@ -456,7 +456,7 @@ class UploadStash {
/**
* Helper function: do the actual database query to fetch file metadata.
*
- * @param $key String: key
+ * @param string $key key
* @param $readFromDB: constant (default: DB_SLAVE)
* @return boolean
*/
@@ -490,7 +490,7 @@ class UploadStash {
/**
* Helper function: Initialize the UploadStashFile for a given file.
*
- * @param $key String: key under which to store the object
+ * @param string $key key under which to store the object
* @throws UploadStashZeroLengthFileException
* @return bool
*/
@@ -514,8 +514,8 @@ class UploadStashFile extends UnregisteredLocalFile {
* Arguably UnregisteredLocalFile should be handling its own file repo but that class is a bit retarded currently
*
* @param $repo FileRepo: repository where we should find the path
- * @param $path String: path to file
- * @param $key String: key to store the path and any stashed data under
+ * @param string $path path to file
+ * @param string $key key to store the path and any stashed data under
* @throws UploadStashBadPathException
* @throws UploadStashFileNotFoundException
*/
@@ -564,7 +564,7 @@ class UploadStashFile extends UnregisteredLocalFile {
* The actual argument is the result of thumbName although we seem to have
* buggy code elsewhere that expects a boolean 'suffix'
*
- * @param $thumbName String: name of thumbnail (e.g. "120px-123456.jpg" ), or false to just get the path
+ * @param string $thumbName name of thumbnail (e.g. "120px-123456.jpg" ), or false to just get the path
* @return String: path thumbnail should take on filesystem, or containing directory if thumbname is false
*/
public function getThumbPath( $thumbName = false ) {
@@ -580,7 +580,7 @@ class UploadStashFile extends UnregisteredLocalFile {
* We override this because we want to use the pretty url name instead of the
* ugly file name.
*
- * @param $params Array: handler-specific parameters
+ * @param array $params handler-specific parameters
* @param $flags integer Bitfield that supports THUMB_* constants
* @return String: base name for URL, like '120px-12345.jpg', or null if there is no handler
*/
@@ -603,7 +603,7 @@ class UploadStashFile extends UnregisteredLocalFile {
* the thumbnail urls be predictable. However, in our model the URL is not based on the filename
* (that's hidden in the db)
*
- * @param $thumbName String: basename of thumbnail file -- however, we don't want to use the file exactly
+ * @param string $thumbName basename of thumbnail file -- however, we don't want to use the file exactly
* @return String: URL to access thumbnail, or URL with partial path
*/
public function getThumbUrl( $thumbName = false ) {
diff --git a/includes/zhtable/Makefile b/includes/zhtable/Makefile
deleted file mode 100644
index 5dd88d38..00000000
--- a/includes/zhtable/Makefile
+++ /dev/null
@@ -1,336 +0,0 @@
-#
-# Creating the file ZhConversion.php used for Simplified/Traditional
-# Chinese conversion. It gets the basic conversion table from the Unihan
-# database, and construct the phrase tables using phrase libraries in
-# the SCIM packages and the libtabe package. There are also special
-# tables used to for adjustment.
-#
-
-GREP = LANG=zh_CN.UTF8 grep
-SED = LANG=zh_CN.UTF8 sed
-DIFF = LANG=zh_CN.UTF8 diff
-CC ?= gcc
-
-SF_MIRROR = easynews
-SCIM_TABLES_VER = 0.5.9
-SCIM_PINYIN_VER = 0.5.91
-LIBTABE_VER = 0.2.3
-
-# Installation directory
-INSTDIR = /usr/local/share/zhdaemons/
-
-all: ZhConversion.php tradphrases.notsure simpphrases.notsure wordlist toHans.dict toHant.dict toCN.dict toTW.dict toHK.dict toSG.dict
-
-# Download Unihan database and Traditional Chinese / Simplified Chinese phrases files
-Unihan.zip:
- wget -nc http://www.unicode.org/Public/UNIDATA/Unihan.zip
-
-scim-tables-$(SCIM_TABLES_VER).tar.gz:
- wget -nc http://$(SF_MIRROR).dl.sourceforge.net/sourceforge/scim/scim-tables-$(SCIM_TABLES_VER).tar.gz
-
-scim-pinyin-$(SCIM_PINYIN_VER).tar.gz:
- wget -nc http://$(SF_MIRROR).dl.sourceforge.net/sourceforge/scim/scim-pinyin-$(SCIM_PINYIN_VER).tar.gz
-
-libtabe-$(LIBTABE_VER).tgz:
- wget -nc http://$(SF_MIRROR).dl.sourceforge.net/sourceforge/libtabe/libtabe-$(LIBTABE_VER).tgz
-
-# Extract the file from a comressed files
-Unihan.txt: Unihan.zip
- unzip -oq Unihan.zip
-
-EZ.txt.in: scim-tables-$(SCIM_TABLES_VER).tar.gz
- tar -xzf scim-tables-$(SCIM_TABLES_VER).tar.gz -O scim-tables-$(SCIM_TABLES_VER)/tables/zh/EZ-Big.txt.in > EZ.txt.in
-
-Wubi.txt.in: scim-tables-$(SCIM_TABLES_VER).tar.gz
- tar -xzf scim-tables-$(SCIM_TABLES_VER).tar.gz -O scim-tables-$(SCIM_TABLES_VER)/tables/zh/Wubi.txt.in > Wubi.txt.in
-
-Ziranma.txt.in: scim-tables-$(SCIM_TABLES_VER).tar.gz
- tar -xzf scim-tables-$(SCIM_TABLES_VER).tar.gz -O scim-tables-$(SCIM_TABLES_VER)/tables/zh/Ziranma.txt.in > Ziranma.txt.in
-
-
-phrase_lib.txt: scim-pinyin-$(SCIM_PINYIN_VER).tar.gz
- tar -xzf scim-pinyin-$(SCIM_PINYIN_VER).tar.gz -O scim-pinyin-$(SCIM_PINYIN_VER)/data/phrase_lib.txt > phrase_lib.txt
-
-tsi.src: libtabe-$(LIBTABE_VER).tgz
- tar -xzf libtabe-$(LIBTABE_VER).tgz -O libtabe/tsi-src/tsi.src > tsi.src
-
-# Make a word list
-wordlist: phrase_lib.txt EZ.txt.in tsi.src
- iconv -c -f big5 -t utf8 tsi.src | $(SED) 's/# //g' | $(SED) 's/[ ][0-9].*//' > wordlist
- $(SED) 's/\(.*\)\t[0-9][0-9]*.*/\1/' phrase_lib.txt | $(SED) '1,5d' >> wordlist
- $(SED) '1,/BEGIN_TABLE/d' EZ.txt.in | colrm 1 8 | $(SED) 's/\t.*//' | $(GREP) "^...*" >> wordlist
- sort wordlist | uniq | $(SED) 's/ //g' > t
- mv t wordlist
-
-printutf8: printutf8.c
- $(CC) -o printutf8 printutf8.c
-
-unihan.t2s.t: Unihan.txt printutf8
- $(GREP) kSimplifiedVariant Unihan.txt | $(SED) '/#/d' | $(SED) 's/kSimplifiedVariant//' | ./printutf8 > unihan.t2s.t
-
-trad2simp.t: trad2simp.manual unihan.t2s.t
- cp unihan.t2s.t tmp1
- for I in `colrm 11 < trad2simp.manual` ; do $(SED) "/^$$I/d" tmp1 > tmp2; mv tmp2 tmp1; done
- cat trad2simp.manual tmp1 > trad2simp.t
-
-unihan.s2t.t: Unihan.txt printutf8
- $(GREP) kTraditionalVariant Unihan.txt | $(SED) '/#/d' | $(SED) 's/kTraditionalVariant//' | ./printutf8 > unihan.s2t.t
-
-simp2trad.t: unihan.s2t.t simp2trad.manual
- cp unihan.s2t.t tmp1
- for I in `colrm 11 < simp2trad.manual` ; do $(SED) "/^$$I/d" tmp1 > tmp2; mv tmp2 tmp1; done
- cat simp2trad.manual tmp1 > simp2trad.t
-
-t2s_1tomany.t: trad2simp.t
- $(GREP) -s ".\{19,\}" trad2simp.t | $(SED) 's/U+...../"/' | $(SED) 's/|U+...../"=>"/' | $(SED) 's/|U+.....//g' | $(SED) 's/|/",/' > t2s_1tomany.t
-
-t2s_1to1.t: trad2simp.t s2t_1tomany.t
- $(SED) "/.*|.*|.*|.*/d" trad2simp.t | $(SED) 's/U+[0-9a-z][0-9a-z]*/"/' | $(SED) 's/|U+[0-9a-z][0-9a-z]*/"=>"/' | $(SED) 's/|/",/' > t2s_1to1.t
- $(GREP) '"."=>"..",' s2t_1tomany.t | $(SED) 's/\("."\)=>".\(.\)",/"\2"=>\1,/' >> t2s_1to1.t
- $(GREP) '"."=>"...",' s2t_1tomany.t | $(SED) 's/\("."\)=>".\(.\).",/"\2"=>\1,/' >> t2s_1to1.t
- $(GREP) '"."=>"...",' s2t_1tomany.t | $(SED) 's/\("."\)=>"..\(.\)",/"\2"=>\1,/' >> t2s_1to1.t
- $(GREP) '"."=>"....",' s2t_1tomany.t | $(SED) 's/\("."\)=>".\(.\)..",/"\2"=>\1,/' >> t2s_1to1.t
- $(GREP) '"."=>"....",' s2t_1tomany.t | $(SED) 's/\("."\)=>"..\(.\).",/"\2"=>\1,/' >> t2s_1to1.t
- $(GREP) '"."=>"....",' s2t_1tomany.t | $(SED) 's/\("."\)=>"...\(.\)",/"\2"=>\1,/' >> t2s_1to1.t
- sort t2s_1to1.t | uniq > t
- mv t t2s_1to1.t
-
-
-s2t_1tomany.t: simp2trad.t
- $(GREP) -s ".\{19,\}" simp2trad.t | $(SED) 's/U+...../"/' | $(SED) 's/|U+...../"=>"/' | $(SED) 's/|U+.....//g' | $(SED) 's/|/",/' > s2t_1tomany.t
-
-s2t_1to1.t: simp2trad.t t2s_1tomany.t
- $(SED) "/.*|.*|.*|.*/d" simp2trad.t | $(SED) 's/U+[0-9a-z][0-9a-z]*/"/' | $(SED) 's/|U+[0-9a-z][0-9a-z]*/"=>"/' | $(SED) 's/|/",/' > s2t_1to1.t
- $(GREP) '"."=>"..",' t2s_1tomany.t | $(SED) 's/\("."\)=>".\(.\)",/"\2"=>\1,/' >> s2t_1to1.t
- $(GREP) '"."=>"...",' t2s_1tomany.t | $(SED) 's/\("."\)=>".\(.\).",/"\2"=>\1,/' >> s2t_1to1.t
- $(GREP) '"."=>"...",' t2s_1tomany.t | $(SED) 's/\("."\)=>"..\(.\)",/"\2"=>\1,/' >> s2t_1to1.t
- $(GREP) '"."=>"....",' t2s_1tomany.t | $(SED) 's/\("."\)=>".\(.\)..",/"\2"=>\1,/' >> s2t_1to1.t
- $(GREP) '"."=>"....",' t2s_1tomany.t | $(SED) 's/\("."\)=>"..\(.\).",/"\2"=>\1,/' >> s2t_1to1.t
- $(GREP) '"."=>"....",' t2s_1tomany.t | $(SED) 's/\("."\)=>"...\(.\)",/"\2"=>\1,/' >> s2t_1to1.t
- sort s2t_1to1.t | uniq > t
- mv t s2t_1to1.t
-
-tphrase.t: EZ.txt.in tsi.src
- colrm 1 8 < EZ.txt.in | $(SED) 's/\t//g' | $(GREP) "^.\{2,4\}[0-9]" | $(SED) 's/[0-9]//g' > t
- iconv -c -f big5 -t utf8 tsi.src | $(SED) 's/ [0-9].*//g' | $(SED) 's/[# ]//g'| $(GREP) "^.\{2,4\}" >> t
- sort t | uniq > tphrase.t
-
-alltradphrases.t: tphrase.t s2t_1tomany.t tradphrases_exclude.manual
- for i in `cat s2t_1tomany.t | $(SED) 's/.*=>".//' | $(SED) 's/"//g' |$(SED) 's/,/\n/' | $(SED) 's/\(.\)/\1\n/g' |sort | uniq`; do $(GREP) -s $$i tphrase.t ; done > alltradphrases.t || true
- cat alltradphrases.t | $(GREP) -vf tradphrases_exclude.manual > alltradphrases.tt ; mv alltradphrases.tt alltradphrases.t
-
-
-tradphrases_2.t: alltradphrases.t
- cat alltradphrases.t | $(GREP) "^..$$" | sort | uniq > tradphrases_2.t
-
-tradphrases_3.t: alltradphrases.t
- cat alltradphrases.t | $(GREP) "^...$$" | sort | uniq > tradphrases_3.t
- for i in `cat tradphrases_2.t`; do $(GREP) $$i tradphrases_3.t ; done | sort | uniq > t3 || true
- $(DIFF) t3 tradphrases_3.t | $(GREP) ">" | $(SED) 's/> //' > t
- mv t tradphrases_3.t
-
-
-tradphrases_4.t: alltradphrases.t
- cat alltradphrases.t | $(GREP) "^....$$" | sort | uniq > tradphrases_4.t
- for i in `cat tradphrases_2.t`; do $(GREP) $$i tradphrases_4.t ; done | sort | uniq > t3 || true
- $(DIFF) t3 tradphrases_4.t | $(GREP) ">" | $(SED) 's/> //' > t
- mv t tradphrases_4.t
- for i in `cat tradphrases_3.t`; do $(GREP) $$i tradphrases_4.t ; done | sort | uniq > t3 || true
- $(DIFF) t3 tradphrases_4.t | $(GREP) ">" | $(SED) 's/> //' > t
- mv t tradphrases_4.t
-
-tradphrases.t: tradphrases.manual tradphrases_2.t tradphrases_3.t tradphrases_4.t t2s_1tomany.t
- cat tradphrases.manual tradphrases_2.t tradphrases_3.t tradphrases_4.t |sort | uniq > tradphrases.t
- for i in `$(SED) 's/"\(.\).*/\1/' t2s_1tomany.t ` ; do $(GREP) $$i tradphrases.t ; done | $(DIFF) tradphrases.t - | $(GREP) '<' | $(SED) 's/< //' > t
- for i in `$(SED) 's/"\(..\)..*/\1/' t2s_1tomany.t ` ; do $(GREP) $$i tradphrases.t ; done | $(DIFF) tradphrases.t - | $(GREP) '<' | $(SED) 's/< //' >> t
- mv t tradphrases.t
- cat tradphrases.t | sort | uniq > t
- mv t tradphrases.t
-
-tradphrases.notsure: tradphrases_2.t tradphrases_3.t tradphrases_4.t t2s_1tomany.t
- cat tradphrases_2.t tradphrases_3.t tradphrases_4.t |sort | uniq > t
- for i in `$(SED) 's/"\(.\).*/\1/' t2s_1tomany.t ` ; do $(GREP) $$i t; done | $(DIFF) t - | $(GREP) '>' | $(SED) 's/> //' > tradphrases.notsure
-
-
-ph.t: phrase_lib.txt
- $(SED) 's/[\t0-9a-zA-Z]//g' phrase_lib.txt | $(GREP) "^.\{2,4\}$$" > ph.t
-
-Wubi.t: Wubi.txt.in
- $(SED) '1,/BEGIN_TABLE/d' Wubi.txt.in | colrm 1 8 | $(SED) 's/\t.*//' | $(GREP) "^...*" > Wubi.t
-
-Ziranma.t: Ziranma.txt.in
- $(SED) '1,/BEGIN_TABLE/d' Ziranma.txt.in | colrm 1 8 | $(SED) 's/\t.*//' | $(GREP) "^...*" > Ziranma.t
-
-
-allsimpphrases.t: t2s_1tomany.t ph.t Wubi.t Ziranma.t simpphrases_exclude.manual
- rm -f allsimpphrases.t
- for i in `cat t2s_1tomany.t | $(SED) 's/.*=>".//' | $(SED) 's/"//g' | $(SED) 's/,/\n/' | $(SED) 's/\(.\)/\1\n/g' | sort | uniq `; do $(GREP) $$i Wubi.t >> allsimpphrases.t; done
- for i in `cat t2s_1tomany.t | $(SED) 's/.*=>".//' | $(SED) 's/"//g' | $(SED) 's/,/\n/' | $(SED) 's/\(.\)/\1\n/g' | sort | uniq `; do $(GREP) $$i Ziranma.t >> allsimpphrases.t; done
- for i in `cat t2s_1tomany.t | $(SED) 's/.*=>".//' | $(SED) 's/"//g' | $(SED) 's/,/\n/' | $(SED) 's/\(.\)/\1\n/g' | sort | uniq `; do $(GREP) $$i ph.t >> allsimpphrases.t; done
- cat allsimpphrases.t | $(GREP) -vf simpphrases_exclude.manual > allsimpphrases.tt ; mv allsimpphrases.tt allsimpphrases.t
-
-simpphrases_2.t: allsimpphrases.t
- cat allsimpphrases.t | $(GREP) "^..$$" | sort | uniq > simpphrases_2.t
-
-simpphrases_3.t: allsimpphrases.t
- cat allsimpphrases.t | $(GREP) "^...$$" | sort | uniq > simpphrases_3.t
- for i in `cat simpphrases_2.t`; do $(GREP) $$i simpphrases_3.t ; done | sort | uniq > t3 || true
- $(DIFF) t3 simpphrases_3.t | $(GREP) ">" | $(SED) 's/> //' > t
- mv t simpphrases_3.t
-
-simpphrases_4.t: allsimpphrases.t
- cat allsimpphrases.t | $(GREP) "^....$$" | sort | uniq > simpphrases_4.t
- rm -f t
- for i in `cat simpphrases_2.t`; do $(GREP) $$i simpphrases_4.t >> t; done || true
- sort t | uniq > t3
- $(DIFF) t3 simpphrases_4.t | $(GREP) ">" | $(SED) 's/> //' > t
- mv t simpphrases_4.t
- for i in `cat simpphrases_3.t`; do $(GREP) $$i simpphrases_4.t; done | sort | uniq > t3 || true
- $(DIFF) t3 simpphrases_4.t | $(GREP) ">" | $(SED) 's/> //' > t
- mv t simpphrases_4.t
-
-simpphrases.t: simpphrases.manual simpphrases_2.t simpphrases_3.t simpphrases_4.t t2s_1tomany.t
- cat simpphrases.manual simpphrases_2.t simpphrases_3.t simpphrases_4.t > simpphrases.t
- for i in `$(SED) 's/"\(.\).*/\1/' t2s_1tomany.t ` ; do $(GREP) $$i simpphrases.t ; done | $(DIFF) simpphrases.t - | $(GREP) '<' | $(SED) 's/< //' > t
- for i in `$(SED) 's/"\(..\)..*/\1/' t2s_1tomany.t ` ; do $(GREP) $$i simpphrases.t ; done | $(DIFF) simpphrases.t - | $(GREP) '<' | $(SED) 's/< //' >> t
- mv t simpphrases.t
- cat simpphrases.t | sort | uniq > t
- mv t simpphrases.t
-
-simpphrases.notsure: simpphrases_2.t simpphrases_3.t simpphrases_4.t t2s_1tomany.t
- cat simpphrases_2.t simpphrases_3.t simpphrases_4.t > t
- for i in `$(SED) 's/"\(.\).*/\1/' t2s_1tomany.t ` ; do $(GREP) $$i t ; done | $(DIFF) t - | $(GREP) '>' | $(SED) 's/> //' > simpphrases.notsure
-
-trad2simp1to1.t: t2s_1tomany.t t2s_1to1.t trad2simp_noconvert.manual
- $(SED) 's/\(.......\).*/\1",/' t2s_1tomany.t > tt
- colrm 1 7 < trad2simp.manual | colrm 3 > trad2simpcharsrc.t
- colrm 1 17 < trad2simp.manual | colrm 3 > trad2simpchardest.t
- cat trad2simpcharsrc.t | $(GREP) -f trad2simpchardest.t > trad2simprepeatedchar.t
- cat tt | $(GREP) -vf trad2simprepeatedchar.t > trad2simp1to1.t
- cat t2s_1to1.t >> trad2simp1to1.t
- cat trad2simp1to1.t | $(GREP) -vf trad2simp_noconvert.manual > tt
- mv tt trad2simp1to1.t
-
-simp2trad1to1.t: s2t_1tomany.t s2t_1to1.t simp2trad.manual simp2trad_noconvert.manual
- $(SED) 's/\(.......\).*/\1",/' s2t_1tomany.t > tt
- colrm 1 7 < simp2trad.manual | colrm 3 > simp2tradcharsrc.t
- colrm 1 17 < simp2trad.manual | colrm 3 > simp2tradchardest.t
- cat simp2tradcharsrc.t | $(GREP) -f simp2tradchardest.t > simp2tradrepeatedchar.t
- cat tt | $(GREP) -vf simp2tradrepeatedchar.t > simp2trad1to1.t
- cat s2t_1to1.t >> simp2trad1to1.t
- cat simp2trad1to1.t | $(GREP) -vf simp2trad_noconvert.manual > tt
- mv tt simp2trad1to1.t
-
-trad2simp.php: trad2simp1to1.t tradphrases.t trad2simp_supp_unset.manual trad2simp_supp_set.manual
- printf '<?php\n$$trad2simp=array(' > trad2simp.php
- cat trad2simp1to1.t >> trad2simp.php
- $(SED) 's/\(.*\)\t\(.*\)/"\1" => "\2",/' trad2simp_supp_set.manual >> trad2simp.php
- printf ');\n$$str=\n"' >> trad2simp.php
- cat tradphrases.t >> trad2simp.php
- printf '";\n$$t=strtr($$str, $$trad2simp);\necho $$t;\n?>' >> trad2simp.php
- cat trad2simp1to1.t | $(GREP) -vf trad2simp_supp_unset.manual > tt
- mv tt trad2simp1to1.t
-
-simp2trad.php: simp2trad1to1.t simpphrases.t simp2trad_supp_set.manual
- printf '<?php\n$$simp2trad=array(' > simp2trad.php
- cat simp2trad1to1.t >> simp2trad.php
- $(SED) 's/\(.*\)\t\(.*\)/"\1" => "\2",/' simp2trad_supp_set.manual >> simp2trad.php
- printf ');\n$$str=\n"' >> simp2trad.php
- cat simpphrases.t >> simp2trad.php
- printf '";\n$$t=strtr($$str, $$simp2trad);\necho $$t;\n?>' >> simp2trad.php
-
-simp2trad.phrases.t: trad2simp.php tradphrases.t simp2trad_supp_set.manual
- php -f trad2simp.php | $(SED) 's/\(.*\)/"\1" => /' > tmp1
- cat tradphrases.t | $(SED) 's/\(.*\)/"\1",/' > tmp2
- paste tmp1 tmp2 > simp2trad.phrases.t
- colrm 3 < simp2trad_supp_set.manual > simp2trad_supp_noconvert.t
- cat trad2simp.php | $(GREP) -vf simp2trad_supp_noconvert.t > trad2simp.tt
- mv trad2simp.tt trad2simp.php
-
-trad2simp.phrases.t: simp2trad.php simpphrases.t trad2simp_supp_set.manual
- php -f simp2trad.php | $(SED) 's/\(.*\)/"\1" => /' > tmp1
- cat simpphrases.t | $(SED) 's/\(.*\)/"\1",/' > tmp2
- paste tmp1 tmp2 > trad2simp.phrases.t
- colrm 3 < trad2simp_supp_set.manual > trad2simp_supp_noconvert.t
- cat simp2trad.php | $(GREP) -vf trad2simp_supp_noconvert.t > simp2trad.tt
- mv simp2trad.tt simp2trad.php
-
-toHans.dict: trad2simp1to1.t trad2simp.phrases.t toSimp.manual
- cat trad2simp1to1.t | $(SED) 's/[, \t]//g' | $(SED) 's/=>/\t/' > toHans.dict
- cat trad2simp.phrases.t | $(SED) 's/[, \t]//g' | $(SED) 's/=>/\t/' >> toHans.dict
- cat toSimp.manual | $(SED) 's/ //g' | $(SED) 's/\(^.*\)\t\(.*\)/"\1"\t"\2"/' >> toHans.dict
-
-toHant.dict: simp2trad1to1.t simp2trad.phrases.t toTrad.manual
- cat simp2trad1to1.t | $(SED) 's/[, \t]//g' | $(SED) 's/=>/\t/' > toHant.dict
- cat simp2trad.phrases.t | $(SED) 's/[, \t]//g' | $(SED) 's/=>/\t/' >> toHant.dict
- cat toTrad.manual | $(SED) 's/ //g' | $(SED) 's/\(^.*\)\t\(.*\)/"\1"\t"\2"/' >> toHant.dict
-
-toTW.dict: toTW.manual
- cat toTW.manual | $(SED) 's/ //g' | $(SED) 's/\(^.*\)\t\(.*\)/"\1"\t"\2"/' > toTW.dict
-
-toHK.dict: toHK.manual
- cat toHK.manual | $(SED) 's/ //g' | $(SED) 's/\(^.*\)\t\(.*\)/"\1"\t"\2"/' > toHK.dict
-
-toCN.dict: toCN.manual
- cat toCN.manual | $(SED) 's/ //g' | $(SED) 's/\(^.*\)\t\(.*\)/"\1"\t"\2"/' > toCN.dict
-
-toSG.dict: toSG.manual
- cat toSG.manual | $(SED) 's/ //g' | $(SED) 's/\(^.*\)\t\(.*\)/"\1"\t"\2"/' > toSG.dict
-
-ZhConversion.php: simp2trad1to1.t simp2trad.phrases.t trad2simp1to1.t trad2simp.phrases.t toSimp.manual toTrad.manual toCN.manual toHK.manual toSG.manual toTW.manual
- printf '<?php\n/**\n * Simplified / Traditional Chinese conversion tables\n' > ZhConversion.php
- printf ' *\n * Automatically generated using code and data in includes/zhtable/\n' >> ZhConversion.php
- printf ' * Do not modify directly!\n */\n\n' >> ZhConversion.php
- printf '$$zh2Hant = array(\n' >> ZhConversion.php
- cat simp2trad1to1.t >> ZhConversion.php
- echo >> ZhConversion.php
- cat simp2trad.phrases.t >> ZhConversion.php
- $(SED) 's/\(.*\)\t\(.*\)/"\1" => "\2",/' toTrad.manual >> ZhConversion.php
- echo ');' >> ZhConversion.php
- echo >> ZhConversion.php
- printf '$$zh2Hans = array(\n' >> ZhConversion.php
- cat trad2simp1to1.t >> ZhConversion.php
- echo >> ZhConversion.php
- cat trad2simp.phrases.t >> ZhConversion.php
- $(SED) 's/\(.*\)\t\(.*\)/"\1" => "\2",/' toSimp.manual >> ZhConversion.php
- echo ');' >> ZhConversion.php
- echo >> ZhConversion.php
- printf '$$zh2TW = array(\n' >> ZhConversion.php
- $(SED) 's/\(.*\)\t\(.*\)/"\1" => "\2",/' toTW.manual >> ZhConversion.php
- echo ');' >> ZhConversion.php
- echo >> ZhConversion.php
- printf '$$zh2HK = array(\n' >> ZhConversion.php
- $(SED) 's/\(.*\)\t\(.*\)/"\1" => "\2",/' toHK.manual >> ZhConversion.php
- echo ');' >> ZhConversion.php
- echo >> ZhConversion.php
- printf '$$zh2CN = array(\n' >> ZhConversion.php
- $(SED) 's/\(.*\)\t\(.*\)/"\1" => "\2",/' toCN.manual >> ZhConversion.php
- echo ');' >> ZhConversion.php
- echo >> ZhConversion.php
- printf '$$zh2SG = array(\n' >> ZhConversion.php
- $(SED) 's/\(.*\)\t\(.*\)/"\1" => "\2",/' toSG.manual >> ZhConversion.php
- echo >> ZhConversion.php
- printf ');' >> ZhConversion.php
-
-clean: cleantmp cleandl
-
-cleantmp:
- # Stuff unpacked from the files fetched by wget
- rm -f \
- Unihan.txt \
- EZ.txt.in \
- Wubi.txt.in \
- Ziranma.txt.in \
- phrase_lib.txt \
- tsi.src
- # Temporary files and other trash
- rm -f ZhConversion.php tmp1 tmp2 tmp3 t3 *.t trad2simp.php simp2trad.php *.dict printutf8 *~ \
- simpphrases.notsure tradphrases.notsure wordlist
-
-cleandl:
- rm -f \
- Unihan.zip \
- scim-tables-$(SCIM_TABLES_VER).tar.gz \
- scim-pinyin-$(SCIM_PINYIN_VER).tar.gz \
- libtabe-$(LIBTABE_VER).tgz
-
diff --git a/includes/zhtable/Makefile.py b/includes/zhtable/Makefile.py
deleted file mode 100644
index fd603ce4..00000000
--- a/includes/zhtable/Makefile.py
+++ /dev/null
@@ -1,391 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# @author Philip
-import tarfile as tf
-import zipfile as zf
-import os, re, shutil, sys, platform
-
-pyversion = platform.python_version()
-islinux = platform.system().lower() == 'linux'
-
-if pyversion[:3] in ['2.6', '2.7']:
- import urllib as urllib_request
- import codecs
- open = codecs.open
- _unichr = unichr
- if sys.maxunicode < 0x10000:
- def unichr(i):
- if i < 0x10000:
- return _unichr(i)
- else:
- return _unichr( 0xD7C0 + ( i>>10 ) ) + _unichr( 0xDC00 + ( i & 0x3FF ) )
-elif pyversion[:2] == '3.':
- import urllib.request as urllib_request
- unichr = chr
-
-def unichr2( *args ):
- return [unichr( int( i.split('<')[0][2:], 16 ) ) for i in args]
-
-def unichr3( *args ):
- return [unichr( int( i[2:7], 16 ) ) for i in args if i[2:7]]
-
-# DEFINE
-UNIHAN_VER = '5.2.0'
-SF_MIRROR = 'dfn'
-SCIM_TABLES_VER = '0.5.10'
-SCIM_PINYIN_VER = '0.5.91'
-LIBTABE_VER = '0.2.3'
-# END OF DEFINE
-
-def download( url, dest ):
- if os.path.isfile( dest ):
- print( 'File %s is up to date.' % dest )
- return
- global islinux
- if islinux:
- # we use wget instead urlretrieve under Linux,
- # because wget could display details like download progress
- os.system( 'wget %s -O %s' % ( url, dest ) )
- else:
- print( 'Downloading from [%s] ...' % url )
- urllib_request.urlretrieve( url, dest )
- print( 'Download complete.\n' )
- return
-
-def uncompress( fp, member, encoding = 'U8' ):
- name = member.rsplit( '/', 1 )[-1]
- print( 'Extracting %s ...' % name )
- fp.extract( member )
- shutil.move( member, name )
- if '/' in member:
- shutil.rmtree( member.split( '/', 1 )[0] )
- return open( name, 'rb', encoding, 'ignore' )
-
-unzip = lambda path, member, encoding = 'U8': \
- uncompress( zf.ZipFile( path ), member, encoding )
-
-untargz = lambda path, member, encoding = 'U8': \
- uncompress( tf.open( path, 'r:gz' ), member, encoding )
-
-def parserCore( fp, pos, beginmark = None, endmark = None ):
- if beginmark and endmark:
- start = False
- else: start = True
- mlist = set()
- for line in fp:
- if beginmark and line.startswith( beginmark ):
- start = True
- continue
- elif endmark and line.startswith( endmark ):
- break
- if start and not line.startswith( '#' ):
- elems = line.split()
- if len( elems ) < 2:
- continue
- elif len( elems[0] ) > 1 and \
- len( elems[pos] ) > 1: # words only
- mlist.add( elems[pos] )
- return mlist
-
-def tablesParser( path, name ):
- """ Read file from scim-tables and parse it. """
- global SCIM_TABLES_VER
- src = 'scim-tables-%s/tables/zh/%s' % ( SCIM_TABLES_VER, name )
- fp = untargz( path, src, 'U8' )
- return parserCore( fp, 1, 'BEGIN_TABLE', 'END_TABLE' )
-
-ezbigParser = lambda path: tablesParser( path, 'EZ-Big.txt.in' )
-wubiParser = lambda path: tablesParser( path, 'Wubi.txt.in' )
-zrmParser = lambda path: tablesParser( path, 'Ziranma.txt.in' )
-
-def phraseParser( path ):
- """ Read phrase_lib.txt and parse it. """
- global SCIM_PINYIN_VER
- src = 'scim-pinyin-%s/data/phrase_lib.txt' % SCIM_PINYIN_VER
- dst = 'phrase_lib.txt'
- fp = untargz( path, src, 'U8' )
- return parserCore( fp, 0 )
-
-def tsiParser( path ):
- """ Read tsi.src and parse it. """
- src = 'libtabe/tsi-src/tsi.src'
- dst = 'tsi.src'
- fp = untargz( path, src, 'big5hkscs' )
- return parserCore( fp, 0 )
-
-def unihanParser( path ):
- """ Read Unihan_Variants.txt and parse it. """
- fp = unzip( path, 'Unihan_Variants.txt', 'U8' )
- t2s = dict()
- s2t = dict()
- for line in fp:
- if line.startswith( '#' ):
- continue
- else:
- elems = line.split()
- if len( elems ) < 3:
- continue
- type = elems.pop( 1 )
- elems = unichr2( *elems )
- if type == 'kTraditionalVariant':
- s2t[elems[0]] = elems[1:]
- elif type == 'kSimplifiedVariant':
- t2s[elems[0]] = elems[1:]
- fp.close()
- return ( t2s, s2t )
-
-def applyExcludes( mlist, path ):
- """ Apply exclude rules from path to mlist. """
- excludes = open( path, 'rb', 'U8' ).read().split()
- excludes = [word.split( '#' )[0].strip() for word in excludes]
- excludes = '|'.join( excludes )
- excptn = re.compile( '.*(?:%s).*' % excludes )
- diff = [mword for mword in mlist if excptn.search( mword )]
- mlist.difference_update( diff )
- return mlist
-
-def charManualTable( path ):
- fp = open( path, 'rb', 'U8' )
- ret = {}
- for line in fp:
- elems = line.split( '#' )[0].split( '|' )
- elems = unichr3( *elems )
- if len( elems ) > 1:
- ret[elems[0]] = elems[1:]
- return ret
-
-def toManyRules( src_table ):
- tomany = set()
- for ( f, t ) in src_table.iteritems():
- for i in range( 1, len( t ) ):
- tomany.add( t[i] )
- return tomany
-
-def removeRules( path, table ):
- fp = open( path, 'rb', 'U8' )
- texc = list()
- for line in fp:
- elems = line.split( '=>' )
- f = t = elems[0].strip()
- if len( elems ) == 2:
- t = elems[1].strip()
- f = f.strip('"').strip("'")
- t = t.strip('"').strip("'")
- if f:
- try:
- table.pop( f )
- except:
- pass
- if t:
- texc.append( t )
- texcptn = re.compile( '^(?:%s)$' % '|'.join( texc ) )
- for (tmp_f, tmp_t) in table.copy().iteritems():
- if texcptn.match( tmp_t ):
- table.pop( tmp_f )
- return table
-
-def customRules( path ):
- fp = open( path, 'rb', 'U8' )
- ret = dict()
- for line in fp:
- elems = line.split( '#' )[0].split()
- if len( elems ) > 1:
- ret[elems[0]] = elems[1]
- return ret
-
-def dictToSortedList( src_table, pos ):
- return sorted( src_table.items(), key = lambda m: m[pos] )
-
-def translate( text, conv_table ):
- i = 0
- while i < len( text ):
- for j in range( len( text ) - i, 0, -1 ):
- f = text[i:][:j]
- t = conv_table.get( f )
- if t:
- text = text[:i] + t + text[i:][j:]
- i += len(t) - 1
- break
- i += 1
- return text
-
-def manualWordsTable( path, conv_table, reconv_table ):
- fp = open( path, 'rb', 'U8' )
- reconv_table = {}
- wordlist = [line.split( '#' )[0].strip() for line in fp]
- wordlist = list( set( wordlist ) )
- wordlist.sort( key = len, reverse = True )
- while wordlist:
- word = wordlist.pop()
- new_word = translate( word, conv_table )
- rcv_word = translate( word, reconv_table )
- if word != rcv_word:
- reconv_table[word] = word
- reconv_table[new_word] = word
- return reconv_table
-
-def defaultWordsTable( src_wordlist, src_tomany, char_conv_table, char_reconv_table ):
- wordlist = list( src_wordlist )
- wordlist.sort( key = len, reverse = True )
- word_conv_table = {}
- word_reconv_table = {}
- conv_table = char_conv_table.copy()
- reconv_table = char_reconv_table.copy()
- tomanyptn = re.compile( '(?:%s)' % '|'.join( src_tomany ) )
- while wordlist:
- conv_table.update( word_conv_table )
- reconv_table.update( word_reconv_table )
- word = wordlist.pop()
- new_word_len = word_len = len( word )
- while new_word_len == word_len:
- add = False
- test_word = translate( word, reconv_table )
- new_word = translate( word, conv_table )
- if not reconv_table.get( new_word ) \
- and ( test_word != word \
- or ( tomanyptn.search( word ) \
- and word != translate( new_word, reconv_table ) ) ):
- word_conv_table[word] = new_word
- word_reconv_table[new_word] = word
- try:
- word = wordlist.pop()
- except IndexError:
- break
- new_word_len = len(word)
- return word_reconv_table
-
-def PHPArray( table ):
- lines = ['\'%s\' => \'%s\',' % (f, t) for (f, t) in table if f and t]
- return '\n'.join(lines)
-
-def main():
- #Get Unihan.zip:
- url = 'http://www.unicode.org/Public/%s/ucd/Unihan.zip' % UNIHAN_VER
- han_dest = 'Unihan.zip'
- download( url, han_dest )
-
- # Get scim-tables-$(SCIM_TABLES_VER).tar.gz:
- url = 'http://%s.dl.sourceforge.net/sourceforge/scim/scim-tables-%s.tar.gz' % ( SF_MIRROR, SCIM_TABLES_VER )
- tbe_dest = 'scim-tables-%s.tar.gz' % SCIM_TABLES_VER
- download( url, tbe_dest )
-
- # Get scim-pinyin-$(SCIM_PINYIN_VER).tar.gz:
- url = 'http://%s.dl.sourceforge.net/sourceforge/scim/scim-pinyin-%s.tar.gz' % ( SF_MIRROR, SCIM_PINYIN_VER )
- pyn_dest = 'scim-pinyin-%s.tar.gz' % SCIM_PINYIN_VER
- download( url, pyn_dest )
-
- # Get libtabe-$(LIBTABE_VER).tgz:
- url = 'http://%s.dl.sourceforge.net/sourceforge/libtabe/libtabe-%s.tgz' % ( SF_MIRROR, LIBTABE_VER )
- lbt_dest = 'libtabe-%s.tgz' % LIBTABE_VER
- download( url, lbt_dest )
-
- # Unihan.txt
- ( t2s_1tomany, s2t_1tomany ) = unihanParser( han_dest )
-
- t2s_1tomany.update( charManualTable( 'trad2simp.manual' ) )
- s2t_1tomany.update( charManualTable( 'simp2trad.manual' ) )
-
- t2s_1to1 = dict( [( f, t[0] ) for ( f, t ) in t2s_1tomany.iteritems()] )
- s2t_1to1 = dict( [( f, t[0] ) for ( f, t ) in s2t_1tomany.iteritems()] )
-
- s_tomany = toManyRules( t2s_1tomany )
- t_tomany = toManyRules( s2t_1tomany )
-
- # noconvert rules
- t2s_1to1 = removeRules( 'trad2simp_noconvert.manual', t2s_1to1 )
- s2t_1to1 = removeRules( 'simp2trad_noconvert.manual', s2t_1to1 )
-
- # the supper set for word to word conversion
- t2s_1to1_supp = t2s_1to1.copy()
- s2t_1to1_supp = s2t_1to1.copy()
- t2s_1to1_supp.update( customRules( 'trad2simp_supp_set.manual' ) )
- s2t_1to1_supp.update( customRules( 'simp2trad_supp_set.manual' ) )
-
- # word to word manual rules
- t2s_word2word_manual = manualWordsTable( 'simpphrases.manual', s2t_1to1_supp, t2s_1to1_supp )
- t2s_word2word_manual.update( customRules( 'toSimp.manual' ) )
- s2t_word2word_manual = manualWordsTable( 'tradphrases.manual', t2s_1to1_supp, s2t_1to1_supp )
- s2t_word2word_manual.update( customRules( 'toTrad.manual' ) )
-
- # word to word rules from input methods
- t_wordlist = set()
- s_wordlist = set()
- t_wordlist.update( ezbigParser( tbe_dest ),
- tsiParser( lbt_dest ) )
- s_wordlist.update( wubiParser( tbe_dest ),
- zrmParser( tbe_dest ),
- phraseParser( pyn_dest ) )
-
- # exclude
- s_wordlist = applyExcludes( s_wordlist, 'simpphrases_exclude.manual' )
- t_wordlist = applyExcludes( t_wordlist, 'tradphrases_exclude.manual' )
-
- s2t_supp = s2t_1to1_supp.copy()
- s2t_supp.update( s2t_word2word_manual )
- t2s_supp = t2s_1to1_supp.copy()
- t2s_supp.update( t2s_word2word_manual )
-
- # parse list to dict
- t2s_word2word = defaultWordsTable( s_wordlist, s_tomany, s2t_1to1_supp, t2s_supp )
- t2s_word2word.update( t2s_word2word_manual )
- s2t_word2word = defaultWordsTable( t_wordlist, t_tomany, t2s_1to1_supp, s2t_supp )
- s2t_word2word.update( s2t_word2word_manual )
-
- # Final tables
- # sorted list toHans
- t2s_1to1 = dict( [( f, t ) for ( f, t ) in t2s_1to1.iteritems() if f != t] )
- toHans = dictToSortedList( t2s_1to1, 0 ) + dictToSortedList( t2s_word2word, 1 )
- # sorted list toHant
- s2t_1to1 = dict( [( f, t ) for ( f, t ) in s2t_1to1.iteritems() if f != t] )
- toHant = dictToSortedList( s2t_1to1, 0 ) + dictToSortedList( s2t_word2word, 1 )
- # sorted list toCN
- toCN = dictToSortedList( customRules( 'toCN.manual' ), 1 )
- # sorted list toHK
- toHK = dictToSortedList( customRules( 'toHK.manual' ), 1 )
- # sorted list toSG
- toSG = dictToSortedList( customRules( 'toSG.manual' ), 1 )
- # sorted list toTW
- toTW = dictToSortedList( customRules( 'toTW.manual' ), 1 )
-
- # Get PHP Array
- php = '''<?php
-/**
- * Simplified / Traditional Chinese conversion tables
- *
- * Automatically generated using code and data in includes/zhtable/
- * Do not modify directly!
- *
- * @file
- */
-
-$zh2Hant = array(\n'''
- php += PHPArray( toHant ) \
- + '\n);\n\n$zh2Hans = array(\n' \
- + PHPArray( toHans ) \
- + '\n);\n\n$zh2TW = array(\n' \
- + PHPArray( toTW ) \
- + '\n);\n\n$zh2HK = array(\n' \
- + PHPArray( toHK ) \
- + '\n);\n\n$zh2CN = array(\n' \
- + PHPArray( toCN ) \
- + '\n);\n\n$zh2SG = array(\n' \
- + PHPArray( toSG ) \
- + '\n);\n'
-
- f = open( os.path.join( '..', 'ZhConversion.php' ), 'wb', encoding = 'utf8' )
- print ('Writing ZhConversion.php ... ')
- f.write( php )
- f.close()
-
- # Remove temporary files
- print ('Deleting temporary files ... ')
- os.remove('EZ-Big.txt.in')
- os.remove('phrase_lib.txt')
- os.remove('tsi.src')
- os.remove('Unihan_Variants.txt')
- os.remove('Wubi.txt.in')
- os.remove('Ziranma.txt.in')
-
-
-if __name__ == '__main__':
- main()
diff --git a/includes/zhtable/printutf8.c b/includes/zhtable/printutf8.c
deleted file mode 100644
index b6ccf17c..00000000
--- a/includes/zhtable/printutf8.c
+++ /dev/null
@@ -1,99 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-/*
- Unicode UTF8
-0x00000000 - 0x0000007F: 0xxxxxxx
-0x00000080 - 0x000007FF: 110xxx xx 10xx xxxx
-0x00000800 - 0x0000FFFF: 1110xxxx 10xxxx xx 10xx xxxx
-0x00010000 - 0x001FFFFF: 11110x xx 10xx xxxx 10xxxx xx 10xx xxxx
-0x00200000 - 0x03FFFFFF: 111110xx 10xxxx xx 10xx xxxx 10xxxx xx 10xx xxxx
-0x04000000 - 0x7FFFFFFF: 1111110x 10xx xxxx 10xxxx xx 10xx xxxx 10xxxx xx 10xx xxxx
-
-0000 0 1001 9
-0001 1 1010 A
-0010 2 1011 B
-0011 3 1100 C
-0100 4 1101 D
-0101 5 1110 E
-0110 6 1111 F
-0111 7
-1000 8
-*/
-void printUTF8(long long u) {
- long long m;
- if(u<0x80) {
- printf("%c", (unsigned char)u);
- }
- else if(u<0x800) {
- m = ((u&0x7c0)>>6) | 0xc0;
- printf("%c", (unsigned char)m);
- m = (u&0x3f) | 0x80;
- printf("%c", (unsigned char)m);
- }
- else if(u<0x10000) {
- m = ((u&0xf000)>>12) | 0xe0;
- printf("%c",(unsigned char)m);
- m = ((u&0xfc0)>>6) | 0x80;
- printf("%c",(unsigned char)m);
- m = (u & 0x3f) | 0x80;
- printf("%c",(unsigned char)m);
- }
- else if(u<0x200000) {
- m = ((u&0x1c0000)>>18) | 0xf0;
- printf("%c", (unsigned char)m);
- m = ((u& 0x3f000)>>12) | 0x80;
- printf("%c", (unsigned char)m);
- m = ((u& 0xfc0)>>6) | 0x80;
- printf("%c", (unsigned char)m);
- m = (u&0x3f) | 0x80;
- printf("%c", (unsigned char)m);
- }
- else if(u<0x4000000){
- m = ((u&0x3000000)>>24) | 0xf8;
- printf("%c", (unsigned char)m);
- m = ((u&0xfc0000)>>18) | 0x80;
- printf("%c", (unsigned char)m);
- m = ((u&0x3f000)>>12) | 0x80;
- printf("%c", (unsigned char)m);
- m = ((u&0xfc00)>>6) | 0x80;
- printf("%c", (unsigned char)m);
- m = (u&0x3f) | 0x80;
- printf("%c", (unsigned char)m);
- }
- else {
- m = ((u&0x40000000)>>30) | 0xfc;
- printf("%c", (unsigned char)m);
- m = ((u&0x3f000000)>>24) | 0x80;
- printf("%c", (unsigned char)m);
- m = ((u&0xfc0000)>>18) | 0x80;
- printf("%c", (unsigned char)m);
- m = ((u&0x3f000)>>12) | 0x80;
- printf("%c", (unsigned char)m);
- m = ((u&0xfc0)>>6) | 0x80;
- printf("%c", (unsigned char)m);
- m = (u&0x3f)| 0x80;
- printf("%c", (unsigned char)m);
- }
-}
-
-int main() {
- int i,j;
- long long n1, n2;
- unsigned char b1[15], b2[15];
- unsigned char buf[1024];
- i=0;
- while(fgets(buf, 1024, stdin)) {
- // printf("read %s\n", buf);
- for(i=0;i<strlen(buf); i++)
- if(buf[i]=='U') {
- if(buf[i+1] == '+') {
- n1 = strtoll(buf+i+2,0,16);
- printf("U+%05x", n1);
- printUTF8(n1);printf("|");
- }
- }
- printf("\n");
- }
-}
-
diff --git a/includes/zhtable/toSimp.manual b/includes/zhtable/toSimp.manual
deleted file mode 100644
index 739d04c3..00000000
--- a/includes/zhtable/toSimp.manual
+++ /dev/null
@@ -1,165 +0,0 @@
-乾县 乾县
-è§ä¹¾ è§ä¹¾
-乾断 乾断
-乾图 乾图
-乾纲 乾纲
-乾红 乾红
-乾清宫 乾清宫
-乾仪 乾仪
-乾兴 乾兴
-乾冈 乾冈
-乾刘 乾刘
-乾刚 乾刚
-ä¹¾å¯ ä¹¾å¯
-ä¹¾å® ä¹¾å®
-乾岗 乾岗
-乾录 乾录
-乾晖 乾晖
-乾构 乾构
-乾枢 乾枢
-乾栋 乾栋
-ä¹¾çµ ä¹¾çµ
-乾窦 乾窦
-乾笃 乾笃
-乾纽 乾纽
-乾络 乾络
-乾统 乾统
-乾维 乾维
-乾罗 乾罗
-ä¹¾è« ä¹¾è«
-乾象历 乾象历
-乾贞 乾贞
-乾贶 乾贶
-乾车 乾车
-乾轴 乾轴
-乾鉴 乾鉴
-乾钧 乾钧
-乾闼 乾闼
-乾顾 乾顾
-乾风 乾风
-乾马 乾马
-乾鹄 乾鹄
-乾鹊 乾鹊
-乾龙 乾龙
-张法乾 张法乾
-æ—‹ä¹¾è½¬å¤ æ—‹ä¹¾è½¬å¤
-天é“为乾 天é“为乾
-易ç»Â·ä¹¾ 易ç»Â·ä¹¾
-易ç»ä¹¾ 易ç»ä¹¾
-乾务 乾务
-黄润乾 黄润乾
-男性为乾 男性为乾
-男为乾 男为乾
-阳为乾 阳为乾
-男性为乾 男性为乾
-男性爲乾 男性为乾
-男为乾 男为乾
-男爲乾 男为乾
-阳为乾 阳为乾
-陽爲乾 阳为乾
-乾一组 乾一组
-ä¹¾ä¸€å› ä¹¾ä¸€å›
-陈乾生 陈乾生
-陈公乾生 陈公乾生
-柳诒徵 柳诒徵
-於夫罗 於夫罗
-æ–¼æ¢¨åŽ æ–¼æ¢¨åŽ
-於潜县 於潜县
-於志贺 於志贺
-憑藉 凭借
-藉端 借端
-藉故 借故
-è—‰å£ å€Ÿå£
-藉助 借助
-藉手 借手
-藉詞 借è¯
-藉機 借机
-藉此 借此
-藉由 借由
-藉著 借ç€
-è—‰ç€ å€Ÿç€
-æ²ˆç© æ²‰ç§¯
-沈船 沉船
-沈默 沉默
-沈沒 沉没
-彷彿 仿佛
-é …éŠ é¡¹é“¾
-肘手éŠè¶³ 肘手链足
-éŠå­ 链å­
-éŠæ¢ 链æ¡
-æ‹‰éŠ æ‹‰é“¾
-é‰¸éŠ é“°é“¾
-éŠéŽ– 链é”
-éŽ–éŠ é”链
-éµéŠ é“链
-é‡‘éŠ é‡‘é“¾
-éŠ€éŠ é“¶é“¾
-éŠéŒ˜ 链锤
-æ´—éŠ æ´—ç»ƒ
-石ç¢é•‡ 石ç¢é•‡
-å覆 åå¤
-回覆 回å¤
-答覆 ç­”å¤
-åå覆覆 ååå¤å¤
-é‡è¦† é‡å¤
-覆核 å¤æ ¸
-覆查 å¤æŸ¥
-鬱姓 鬱姓
-é¬±æ° é¬±æ°
-ä¾å„¸ç´€ ä¾ç½—纪
-夥計 伙计
-å³å…¶æ¿¬ å´å…¶æ¿¬
-å´å…¶æ¿¬ å´å…¶æ¿¬
-乾泉水 干泉水
-么åŠç¾¤ 幺åŠç¾¤
-么元 幺元
-么爹 幺爹
-ä¹ˆå” å¹ºå”
-么舅 幺舅
-么爸 幺爸
-么媽 幺妈
-么姨 幺姨
-么娘 幺娘
-么孃 幺娘
-幺孃 幺娘
-么妹 幺妹
-ä¹ˆå° å¹ºå°
-么姓 幺姓
-ä¹ˆæ° å¹ºæ°
-ä¹ˆè›¾å­ å¹ºè›¾å­
-幺厮 幺厮
-çªä¸¸ ç¾ä¸¸
-é™„çª é™„ç¾
-éš±çª éš±ç¾
-麼麼 麽麽
-么麼 幺麽
-么麼å°ä¸‘ 幺麽å°ä¸‘
-么鳳 幺凤
-么二三 幺二三
-么篇 幺篇
-么謙 幺谦
-麴义 麴义
-乾乾淨淨 干干净净
-乾乾脆脆 干干脆脆
-肉乾乾 肉干干
-魚乾乾 鱼干干
-æ–¼äºŽåŒ æ–¼äºŽåŒ
-æ–¼ä¹™äºŽåŒ æ–¼ä¹™äºŽåŒ
-閻懷禮 闫怀礼
-醯酱 醯酱
-醯鸡 醯鸡
-醯壶 醯壶
-苧烯 苧烯
-æŽä¹¾é¡º æŽä¹¾é¡º
-幹著 å¹²ç€
-氾濫 泛滥
-显著 显著
-顯著 显著
-標誌著 标志ç€
-近角èªä¿¡ 近角èªä¿¡
-ä¿®éŠ ä¿®ç‚¼
-米泽瑠美 米泽瑠美
-太閤 太é˜
-候覆 候å¤
-待覆 å¾…å¤
-批覆 批å¤
diff --git a/includes/zhtable/trad2simp.manual b/includes/zhtable/trad2simp.manual
deleted file mode 100644
index 7c3ce10d..00000000
--- a/includes/zhtable/trad2simp.manual
+++ /dev/null
@@ -1,150 +0,0 @@
-U+04E99亙|U+04E98亘|
-U+04F48佈|U+05E03布|
-U+04F48佈|U+05E03布|
-U+04F54ä½”|U+05360å |
-U+05016倖|U+05E78幸|
-U+050A2傢|U+05BB6家|
-U+050F1僱|U+096C7雇|
-U+05138儸|U+03469㑩|U+07F57罗|
-U+05147兇|U+051F6凶|
-U+05277剷|U+094F2铲|
-U+052F3勳|U+052CB勋|
-U+0537Då½|U+05373å³|
-U+053A4厤|U+05386历|
-U+055ABå–«|U+05403åƒ|
-U+05641å™|U+06076æ¶|
-U+05690åš|U+05C1Då°|
-U+056A5嚥|U+054BD咽|
-U+056AEåš®|U+05411å‘|
-U+056CC囌|U+082CFè‹|
-U+0585A塚|U+051A2冢|
-U+058B0墰|U+0575Bå›|
-U+058DC壜|U+0575Bå›|
-U+05925夥|U+04F19伙|
-U+05BC0寀|U+091C7采|
-U+05D11崑|U+06606昆|
-U+05D19崙|U+04ED1仑|
-U+05D57åµ—|U+05C81å²|
-U+05DBD嶽|U+05CB3岳|
-U+05DD6巖|U+05CA9岩|
-U+05DF9å·¹|U+0537Aåº|
-U+05F14å¼”|U+0540AåŠ|
-U+05F46彆|U+0522B别|
-U+0617C慼|U+0621A戚|
-U+0617E慾|U+06B32欲|
-U+061DE懞|U+08499蒙|
-U+062DA拚|U+062FC拼|
-U+06331挱|U+06332挲|
-U+06371æ±|U+06328挨|
-U+06372æ²|U+05377å·|
-U+0647A摺|U+06298折|
-U+065C2æ—‚|U+065D7æ——|
-U+065E3æ—£|U+065E2æ—¢|
-U+06607昇|U+05347å‡|
-U+0672E朮|U+0672F术|
-U+068CA棊|U+068CB棋|
-U+069A6榦|U+05E72干|
-U+069D3槓|U+06760æ |
-U+06A11樑|U+06881æ¢|
-U+06B05欅|U+06989榉|
-U+06B4Eæ­Ž|U+053F9å¹|
-U+06BAD殭|U+050F5僵|
-U+06C59汙|U+06C61污|
-U+06CDDæ³|U+06EAF溯|
-U+06D29洩|U+06CC4泄|
-U+06DD2淒|U+051C4凄|
-U+06DE8淨|U+051C0净|
-U+06DE9淩|U+051CC凌|
-U+06E67湧|U+06D8C涌|
-U+06ED9滙|U+06C47汇|
-U+06F90æ¾|U+06C84沄|
-U+06FBEæ¾¾|U+03CE0ã³ |
-U+06FDBæ¿›|U+06FDBæ¿›|U+08499è’™|
-U+07030瀰|U+05F25弥|
-U+071EC燬|U+06BC1æ¯|
-U+07343çƒ|U+05446呆|
-U+07515甕|U+074EE瓮|
-U+07526甦|U+082CFè‹|
-U+0752F甯|U+05B81å®|
-U+0756B畫|U+0753B画|U+05212划|
-U+07575畵|U+0753B画|U+05212划|
-U+075E0ç— |U+09178é…¸|
-U+07652癒|U+06108愈|
-U+07661癡|U+075F4痴|
-U+076C3盃|U+0676Fæ¯|
-U+0771E眞|U+0771F真|
-U+077AD瞭|U+04E86了|
-U+077C7矇|U+08499蒙|
-U+07843硃|U+06731朱|
-U+07895碕|U+057FC埼|
-U+07958祘|U+07B97算|
-U+07A1C稜|U+068F1棱|
-U+07B87箇|U+04E2A个|
-U+07C11ç°‘|U+084D1è“‘|
-U+07C64籤|U+07B7E签|
-U+07C72ç±²|U+05401å|
-U+07CF0糰|U+056E2团|
-U+07D2E紮|U+0624E扎|
-U+07DB5綵|U+05F69彩|U+0433D䌽|
-U+07E34縴|U+07EA4纤|
-U+07E50ç¹|U+07A57ç©—|
-U+07E94纔|U+0624Dæ‰|
-U+07F4E罎|U+0575Bå›|
-U+07FA8羨|U+07FA1羡|
-U+08123脣|U+05507唇|
-U+081E5臥|U+05367å§|
-U+08218舘|U+09986馆|
-U+083F4è´|U+05EB5庵|
-U+08457è‘—|U+08457è‘—|U+07740ç€|
-U+08518蔘|U+053C2å‚|
-U+08591薑|U+059DC姜|
-U+085C9藉|U+085C9藉|U+0501F借|
-U+0880Dè |U+0874EèŽ|
-U+0884A衊|U+08511蔑|
-U+08946襆|U+05E5E幞|
-U+08986覆|U+08986覆|U+0590Då¤|
-U+08A17託|U+06258托|U+08BAC讬|
-U+08AEEè«®|U+054A8å’¨|U+08C18è°˜|
-U+08B6Dè­­|U+06BC1æ¯|
-U+08B8E讎|U+04EC7仇|
-U+08B9A讚|U+08D5E赞|
-U+08C54豔|U+08273艳|
-U+08FF4迴|U+056DE回|
-U+09031週|U+05468周|
-U+0904AéŠ|U+06E38游|
-U+09061é¡|U+06EAF溯|
-U+091A3醣|U+07CD6糖|
-U+091AF醯|U+09170酰|
-U+0934AéŠ|U+070BC炼|U+094FE链|
-U+0938C鎌|U+09570镰|
-U+093AD鎭|U+093AE镇|
-U+093DAéš|U+0621A戚|
-U+09451鑑|U+09274鉴|
-U+0955Fé•Ÿ|U+065CBæ—‹|
-U+09592é–’|U+095F2é—²|
-U+095A4é–¤|U+05408åˆ|
-U+095E2闢|U+08F9F辟|
-U+0962A阪|U+0962A阪|U+05742å‚|
-U+0965E陞|U+05347å‡|
-U+097A6鞦|U+079CB秋|U+097A7鞧|
-U+097C6韆|U+05343åƒ|
-U+097DDéŸ|U+097B2éž²|
-U+09858願|U+0613F愿|
-U+098F1飱|U+098E7飧|
-U+09918餘|U+04F59余|U+09980馀|
-U+09931餱|U+07CC7糇|
-U+09935餵|U+05582喂|
-U+09B28鬨|U+054C4哄|
-U+09D70鵰|U+096D5雕|U+05F6B彫|
-U+09E7C鹼|U+078B1碱|U+07877硷|
-U+09EAA麪|U+09762é¢|
-U+09EAB麫|U+09762é¢|
-U+09EAF麯|U+066F2曲|
-U+09EB4麴|U+066F2曲|U+09EB4麴|
-U+09EF4黴|U+09709霉|
-U+09F15鼕|U+051AC冬|
-U+09F47齇|U+09F44齄|
-U+09F63齣|U+051FA出|
-U+09F91龑|U+04DAE䶮|
-U+21ED5ð¡»•|U+05C81å²|
-U+298F5𩣵|U+299FB𩧻|
diff --git a/includes/zhtable/tradphrases.manual b/includes/zhtable/tradphrases.manual
deleted file mode 100644
index 9a9534f8..00000000
--- a/includes/zhtable/tradphrases.manual
+++ /dev/null
@@ -1,4310 +0,0 @@
-零隻
-〇隻
-一隻
-二隻
-å…©éš»
-三隻
-四隻
-五隻
-å…­éš»
-七隻
-å…«éš»
-ä¹éš»
-0éš»
-1éš»
-2éš»
-3éš»
-4éš»
-5éš»
-6éš»
-7éš»
-8éš»
-9éš»
-ï¼éš»
-1隻
-ï¼’éš»
-3隻
-4隻
-5隻
-ï¼–éš»
-ï¼—éš»
-8隻
-9隻
-0åªæ”¯æ´
-1åªæ”¯æ´
-2åªæ”¯æ´
-3åªæ”¯æ´
-4åªæ”¯æ´
-5åªæ”¯æ´
-6åªæ”¯æ´
-7åªæ”¯æ´
-8åªæ”¯æ´
-9åªæ”¯æ´
-0åªæ”¯æŒ
-1åªæ”¯æŒ
-2åªæ”¯æŒ
-3åªæ”¯æŒ
-4åªæ”¯æŒ
-5åªæ”¯æŒ
-6åªæ”¯æŒ
-7åªæ”¯æŒ
-8åªæ”¯æŒ
-9åªæ”¯æŒ
-百隻
-åƒéš»
-è¬éš»
-å„„éš»
-最多
-至多
-頂多
-多隻
-0多隻
-ï¼å¤šéš»
-零多隻
-å多隻
-百多隻
-åƒå¤šéš»
-è¬å¤šéš»
-億多隻
-這åªèƒ½
-這åªå¯
-這åªåœ¨
-這åªæ˜¯
-這åªéœ€
-這åªæœƒ
-這åªç”¨
-é‚£åªèƒ½
-é‚£åªå¯
-é‚£åªåœ¨
-é‚£åªæ˜¯
-é‚£åªéœ€
-é‚£åªæœƒ
-é‚£åªç”¨
-多åªèƒ½
-多åªå¯
-多åªåœ¨
-多åªæœ‰
-多åªæ˜¯
-多åªéœ€
-多åªæœƒ
-多åªç”¨
-大åªèƒ½
-大åªå¯
-大åªåœ¨
-大åªæœ‰
-大åªæ˜¯
-大åªéœ€
-大åªæœƒ
-å°åªèƒ½
-å°åªå¯
-å°åªåœ¨
-å°åªæœ‰
-å°åªæ˜¯
-å°åªéœ€
-å°åªæœƒ
-隻身
-形單影隻
-首隻
-數天後
-幾天後
-多天後
-零天後
-一天後
-二天後
-兩天後
-三天後
-四天後
-五天後
-六天後
-七天後
-八天後
-ä¹å¤©å¾Œ
-å天後
-百天後
-åƒå¤©å¾Œ
-è¬å¤©å¾Œ
-億天後
-0天後
-1天後
-2天後
-3天後
-4天後
-5天後
-6天後
-7天後
-8天後
-9天後
-ï¼å¤©å¾Œ
-1天後
-2天後
-3天後
-4天後
-5天後
-6天後
-7天後
-8天後
-9天後
-天後來
-天後天
-天後åŠ
-後å°
-è¬è±¡
-並存著
-乾絲
-乾著急
-乾魚
-é­šä¹¾
-乾梅
-糕乾
-黃乾黑瘦
-馬乾
-香乾
-趲幹
-謀幹
-è©žå¹¹
-蟶乾
-è–„å¹¹
-腦幹
-營幹
-è€ä¹¾
-è€å¹¹éƒ¨
-管幹
-盲幹
-煨乾
-æµ·ä¹¾
-乾漆
-æ·šä¹¾
-æ²’å¹¹
-沒乾沒淨
-æžä¸å¾—大於榦
-æ¯ä¹¾
-打幹
-打乾噦
-å¾å¹¹
-府幹
-乾館
-乾顙
-å¹¹é©å‘½
-ä¹¾éœäº‚
-乾雷
-乾阿奶
-ä¹¾é‡
-乾醋
-乾逼
-乾貨
-乾衣
-幹蠱
-乾虔
-ä¹¾è½
-幹營生
-乾茶錢
-乾茨臘
-乾苔
-乾花
-乾肥
-乾耗
-幹缺
-乾繃
-ä¹¾çµ
-乾餱
-乾篾片
-乾稿
-乾禮
-乾瞪眼
-乾白兒
-乾疥
-乾生å­
-乾生å—
-幹父之蠱
-乾熬
-乾燈盞
-乾濕
-乾澀
-幹濟
-乾沒
-乾死
-ä¹¾æ‘æ²™
-乾暖
-乾料
-乾敲梆å­ä¸è³£æ²¹
-乾支支
-乾支剌
-乾擦
-乾撇下
-乾撂å°
-乾折
-乾急
-幹當
-ä¹¾å¼
-乾屎橛
-幹家
-乾奴æ‰
-幹頭
-乾塢
-乾圓潔淨
-乾回付
-乾啼
-乾哭
-乾噦
-乾咽
-乾和
-å¹¹å
-ä¹¾åŠè‘—下巴
-乾號
-乾颱
-ä¹¾å¦
-ä¹¾å‰å‰
-乾刻版
-乾芻
-幹人
-乾產
-乾喬
-夯幹
-大目乾連
-國之楨榦
-唇乾
-單幹
-勾幹
-豆乾
-果乾
-如果幹
-乾麵
-乾柴
-枯乾
-æ™’ä¹¾
-顛乾倒å¤
-å¼·å¹¹
-乾著
-乾眼
-幹的åœç•¶
-乾巴
-åŽä¹¾
-眼乾
-å·é›žä¸è‘—
-几絲
-划著
-划著走
-別著
-刮著
-åƒçµ²è¬ç¸·
-åƒåˆ
-åƒè€ƒåƒ¹å€¼
-åƒèˆ‡
-åƒèˆ‡äººå“¡
-åƒèˆ‡åˆ¶
-åƒèˆ‡æ„Ÿ
-åƒèˆ‡è€…
-åƒè§€åœ˜
-åƒè§€åœ˜é«”
-åƒé–±
-åƒè‘—ä¸ç›¡
-åˆè‘—
-åŠå¸¶è¤²
-åŠæŽ›è‘—
-åŠè‘—
-åŠè¤²
-åŠè¤²å¸¶
-å‘è‘—
-åš´çµ²åˆç¸«
-回絲
-回著
-å¡—è‘—
-壟斷價格
-壟斷資產
-壟斷集團
-姜絲
-帶團åƒåŠ 
-干著急
-幾絲
-彆著
-怎麼著
-憑藉著
-憑藉
-接著說
-擔著
-擔負著
-敘說著
-斗轉åƒæ©«
-旋繞著
-æ¿è‘—臉
-正當著
-沈著
-æ²–è‘—
-派團åƒåŠ 
-涂著
-湊åˆè‘—
-瀰漫著
-為著
-煙斗絲
-率團åƒåŠ 
-ç•«è‘—
-當著
-發著
-直接åƒä¸Ž
-ç¡è‘—了
-秋褲
-ç©æžåƒä¸Ž
-ç©æžåƒåŠ 
-簽著
-系著
-絕å°åƒç…§
-絲來線去
-絲布
-çµ²æ¿
-絲瓜布
-絲絨布
-絲線
-絲織廠
-絲蟲
-緊繃著
-繃著
-繃著臉
-繃著臉兒
-繫著
-罵著
-肉絲麵
-背å‘è‘—
-èŒçµ²é«”
-è‘—å…’
-著書立說
-著色軟體
-è‘—é‡æŒ‡å‡º
-著錄
-著錄è¦å‰‡
-è–‘çµ²
-藉著
-蘊å«è‘—
-蘊涵著
-è¡è‘—
-被覆著
-覆著
-覆蓋著
-å覆
-訴說著
-說著
-è«‹åƒé–±
-è¬çµ•åƒè§€
-豎著
-è±æ¿±
-è±æ¿±é„‰
-è±åº¦
-象徵著
-這麼著
-那麼著
-é…åˆè‘—
-醞釀著
-錄著
-é›éŠå‡º
-關係著
-雞絲
-雞絲麵
-é¢æœè‘—
-é¢è‡¨è‘—
-颳著
-髮絲
-æ–·é«®
-ä¸æ–·ç™¼
-判斷發
-評斷發
-買斷發
-賣斷發
-打斷發
-披頭散髮
-é«®ç¦
-鬥著
-鬧著玩兒
-鯰魚
-世界盃
-其次辟地
-é–‹é—¢
-闢地
-精闢
-別闢
-å¦é—¢
-闢佛
-闢田
-闢築
-闢謠
-闢辟
-é€é—¢
-墾闢
-ç¿•é—¢
-è»’é—¢
-闢建
-闢室
-å„é—¢
-增闢
-闢邪以律
-錶盤
-錶æ¿
-錶帶
-錶é‡
-錶蒙å­
-袋錶
-腕錶
-碼錶
-錶冠
-魔錶
-彆å£æ°£
-彆強
-皺彆
-一彆頭
-并州
-併兼
-併產
-併骨
-併網
-併線
-ä½µæµ
-逼併
-ä½µå
-併當
-ä½µç«
-併肩å­
-併除
-併疊
-忙併
-打併
-ç°¡ä½µ
-並發表
-並發ç¾
-並發展
-並發動
-並發布
-ç«ä¸¦éž
-舉手表
-æ®æ‰‹è¡¨
-併一ä¸äºŒ
-連三併四
-相併
-撤併
-數罪併罰
-催併
-狂併潮
-è–è””
-æ摩太後書
-當家纔知柴米價
-剛纔一載
-è£æµ·
-骨頭裡掙出來的錢纔åšå¾—肉
-æ°çº”
-é ç¸£çº”至
-別日å—鴻纔北去
-然身死纔數月耳
-纔得兩年
-纔則
-纔此
-你纔å­ç™¼æ˜
-纔å¯å®¹é¡å五餘
-ä¸æŽ¡
-披榛採蘭
-謬採虛è²
-採樵人
-回採
-觀採
-開採
-æªæŽ¡
-樵採
-採訪
-採辦
-採補
-採買
-採風å•ä¿—
-採ç´
-採çµ
-採蓮
-採錄
-採購
-採光
-採礦
-採花
-採集
-採擷
-採掘
-採芹人
-採å–
-採é¸
-採摭
-採摘
-採ç 
-採種
-採茶
-採石
-採拾
-採收
-採生折割
-採樹種
-採擇
-採藥
-採薇
-採用
-盜採
-採信
-採行
-採證
-採èŠ
-åšæŽ¡
-採空採穗
-採挖
-採éµ
-採金
-採氣
-採油
-採煤
-採鹽
-採å€
-採é‹
-採風
-官地為寀
-寮寀
-蔘ç¶
-個人# “個人åƒæ•¸â€ä¸æ˜¯â€œå€‹äººè”˜æ•¸â€
-人蔘
-蕭蔘
-人åƒèˆ‡
-人åƒé¸
-人åƒè§€
-人åƒè€ƒ
-人åƒå±•
-人åƒåŠ 
-人åƒè­°
-人åƒè¬€
-人åƒé…Œ
-人åƒç…§
-人åƒæ”¿
-人åƒæˆ°
-人åƒæ‹œ
-人åƒé–±
-人åƒç¦ª
-人åƒè´Š
-人åƒè¦‹
-人åƒé€
-人åƒçœ‹
-æ±è¡è¥¿çª
-天克地è¡
-å…­è¡
-撞陣è¡è»
-è¡æ³¢
-è¡é¢¨
-è¡é ­é™£
-è¡å …陷陣
-è¡é™·
-è¡å¿ƒ
-è¡å·žæ’žåºœ
-è¡æ®º
-è¡ç„¶
-è¡ç›¹
-å·¦è¡å³çª
-虫部
-手塚治虫
-群醜
-百拙åƒé†œ
-大醜
-地醜德齊
-丟醜
-亮醜
-æ­é†œ
-倛醜
-嫌好é“醜
-醜巴怪
-醜末
-醜婦
-醜地
-醜頭怪臉
-醜女效顰
-醜剌剌
-醜話
-醜媳
-醜å’
-醜è²é æ’­
-醜夷
-弄醜
-露醜
-摧堅ç²é†œ
-謷醜
-ä¸å«Œæ¯é†œ
-一爭兩醜
-惡直醜正
-很醜
-醜男
-醜斃了
-醜奴兒
-醜言
-醜徒
-醜雜
-醜儕
-醜沮
-醜辭
-醜比
-醜辱
-醜逆
-醜å²
-醜賊生
-醜婆å­
-出乖弄醜
-出乖露醜
-ç²åŒªå…¶é†œ
-乙丑
-ä¸ä¸‘
-己丑
-辛丑
-癸丑
-丑時
-丑日
-丑月
-丑年
-文丑
-武丑
-女丑
-å°ä¸‘
-大丑
-丑婆å­
-丑旦
-丑角
-丑三
-丑表功
-公孫丑
-么麼å°ä¸‘
-齣電影
-齣電視
-齣動畫
-齣節目
-é½£å¡é€š
-齣戲
-齣劇
-平平當當
-滿滿當當
-當當ä¸ä¸
-ä¸ä¸ç•¶ç•¶
-åœåœç•¶ç•¶
-快快當當
-咯噹
-啷噹
-å…šåƒ
-党進
-党太尉
-å…šé …
-撲鼕
-æ´—é«®
-牽一髮
-白發其事
-åŽé«®åº§
-åŽé«®æ˜Ÿç³»åœ˜
-åŽé«®FK型星
-波髮藻
-辮髮
-逋髮
-抿髮
-髮漂
-髮匪
-髮腳
-髮癬
-髮釵
-髮飾
-髮紗
-髮上指冠
-髮上沖冠
-髮乳
-髮引åƒéˆž
-髮踴沖冠
-è‘£æ°å°é«®
-胎髮
-禿妃之髮
-æ‰é«®
-綠髮
-括髮
-é«¡é«®
-éµ é«®
-截髮
-解髮佯狂
-淨髮
-秋髮
-噙齒戴髮
-é’山一髮
-晞髮
-ç´°ä¸å®¹é«®
-心細如髮
-ç¥é«®
-擢髮
-é½’é«®
-é½’å±é«®ç§€
-沖冠髮怒
-甩髮
-絲髮
-çµ²æ©é«®æ€¨
-蒜髮
-ç®—é«®
-有髮頭陀寺
-髮箋
-髮屋
-櫛髮工
-鬒髮
-模范棒棒堂
-模范三è»
-模范七棒
-模范14棒
-模范21棒
-é¡ç¯„
-儀範
-典範
-å¤ç¯„
-壼範
-容範
-懿範
-明範
-格範
-模範
-樣範
-æ¯ç¯„
-洪範
-淑範
-éºç¯„
-科範
-立範
-貽範
-é“範
-閨範
-閫範
-雅範
-霽範
-鴻範
-沒樣範
-錢範
-銅範
-金範
-範金
-垂範
-範性形變
-範字
-有事之無範
-置言æˆç¯„
-å¾çˆ²ä¹‹ç¯„我馳驅
-天地為範
-範數
-丰采
-丰標ä¸å‡¡
-丰神
-丰茸
-丰儀
-丰度
-丰情
-丰韵
-å­ä¹‹ä¸°å…®
-艸木丰丰
-張三丰
-復始
-複分æž
-複輔音
-複元音
-複平é¢
-複函數
-複æµ
-å複製
-複å°æ•¸
-顛覆
-答覆
-覆沒
-覆亡
-覆水難收
-翻雲覆雨
-覆雨翻雲
-覆è½
-覆巢之下無完åµ
-覆蓋
-覆命
-天翻地覆
-天覆地載
-撥穀
-æ‰æ“¬ç©€ç›œèŸ²
-ä¸ç©€
-辟穀
-米穀
-ç”°ç©€
-脫穀機
-å¹´ç©€
-礱穀機
-孤寡ä¸ç©€
-穀米
-穀旦
-穀圭
-穀貴餓農
-穀食
-穀日
-館穀
-禾穀
-ç©ç©€
-嘉穀
-嚼穀
-ä¹ç©€
-戩穀
-錢穀
-æ¯ç©€
-æ®–ç©€
-å·ç©€
-曬穀
-臧穀亡羊
-種穀
-颳雪
-刮風下雪倒便宜
-广部
-亂鬨ä¸éŽä¾†
-斗鬨
-亂鬨
-開鬨
-花鬨
-鬨動
-交鬨
-喧鬨
-起鬨
-內鬨
-於後
-猜三划五
-划é¾èˆŸ
-å—è¿´ç·š
-å—è¿´éµè·¯
-北迴線
-北迴éµè·¯
-文匯報
-æ²³æµåŒ¯é›†
-å“å½™
-åšå½™
-æ»™è±
-伙頭
-方几
-ä¼å‡ 
-高几
-雪窗螢几
-燕几
-隱几
-饑饉
-乾薑
-毛薑
-è–‘æ¯
-薑湯
-è–‘æ¡‚
-薑是è€çš„è¾£
-åƒè–‘
-è–‘è€è¾£
-野薑
-咬薑呷醋
-薑蓉
-薑黃
-ç‹è—‰è™Žå¨
-滑藉
-藉寇兵
-藉箸代籌
-藉手
-藉此
-é¾æ²
-æ²èˆŒ
-夸父
-夸克
-夸特
-夸毗
-夸麗
-夸姣
-夸人
-夸容
-大言éžå¤¸
-言大而夸
-ç覺
-æ„›ç
-çºå †
-çºç´²
-çºè‡£
-çºç“¦çµç¹©
-湘çº
-å°çºç¶¬è‹¥
-ç•æ¹˜
-ç•ç„¶
-澤滲ç•è€Œä¸‹é™
-è£å‹¾å¤–連
-è£æ‰‹
-水里鄉
-水里溪
-水里æ¿æ°´æºª
-二里頭
-å¹´æ­·å²
-西歷å²
-國歷å²
-國歷代
-國歷任
-國歷屆
-國歷經
-國歷來
-æ–°æ­·å²
-å¤æ­·å²
-百花曆
-寶曆
-穆罕默德曆
-大明曆
-大曆
-å°æ›†
-太åˆæ›†
-通曆
-曆本
-曆命
-曆紀
-曆始
-曆室
-曆日
-曆尾
-曆元
-律曆志
-官曆
-回曆
-巧曆
-慶曆
-朱ç†å®‰æ›†
-長曆
-è—曆
-四分曆
-三統曆
-é¡æˆ‘略曆
-埃åŠæ›†
-伊斯蘭教曆
-åˆæ›†
-玉曆
-農民曆
-桌曆
-商曆
-周曆
-大è¡æ›†
-皇極曆
-儒略改é©æ›†
-希伯來曆
-格里曆
-格里高利曆
-共和曆
-掛曆
-曆ç„
-天文曆表
-日心曆表
-地心曆表
-復活節曆表
-月çƒæ›†è¡¨
-伊爾汗曆表
-延曆
-共和歷å²
-厤物之æ„
-爰定祥厤
-白黴
-黴黧
-黴黑
-麴黴
-蒙霧露
-懞懞懂懂
-懞直
-è€æ‡ž
-放懞掙
-矇著
-矇èµ
-矇çž
-矇事
-矇頭轉
-矇æ¾é›¨
-è—矇歌兒
-矇著é‹å…’
-朦朧
-濛濛細雨
-濛汜
-冥濛
-溟濛
-淡濛濛
-凌濛åˆ
-涳濛
-ç°æ¿›æ¿›
-æ¾’æ¿›
-瀰山é野
-瀰瀰
-冷麵
-撈麵
-煮麵
-炆麵
-煎麵
-泡麵
-食麵
-公仔麵
-方便麵
-白粉麵
-棒å­éºµ
-麵缸
-麵å¯å…’
-麵碼兒
-麵åŠ
-麵湯
-麵疙瘩
-麵館
-麵漿
-甜水麵
-麵人兒
-麵塑
-æ麵人
-趕麵æ£
-擀麵
-éŽæ°´éºµ
-蕎麥麵
-巧婦åšä¸å¾—無麵餺飥
-削麵
-å°ç±³éºµ
-壯麵
-åƒæ¿åˆ€éºµ
-åƒè¾£éºµ
-扯麵
-æ‹éºµ
-é‡ç¾…麵
-雜麵
-雜åˆéºµå…’
-溲麵
-索麵
-一é‹éºµ
-伊府麵
-藥麵兒
-æ„大利麵
-湯下麵
-茶麵
-麵糰
-冷é¢ç›¸
-糞穢衊é¢
-湟潦生苹
-食野之苹
-苹縈
-é’苹
-é’蘋果
-僕僕
-有僕
-冉有僕
-屢顧爾僕
-僕少
-僕雖罷駑
-僕夫
-僕僮
-僕å
-僕姑
-僕固懷æ©
-僕程
-僕使
-僕憎
-僕æ­
-僕射
-太僕
-僮僕
-金僕姑
-僕婢
-樸實
-樸訥
-樸念ä»
-白樸
-抱素懷樸
-抱朴而長åŸå…®
-樸鄙
-樸馬
-樸父
-樸陋
-樸魯
-樸厚
-樸學
-樸質
-樸拙
-樸é‡
-樸素
-樸樕
-樸野
-å樸
-å¤æ¨¸
-胡樸安
-返樸
-渾樸
-儉樸
-簡樸
-拙樸
-斫雕為樸
-斲雕為樸
-質樸
-誠樸
-純樸
-曾樸
-éƒæ¨¸
-棫樸
-敦樸
-樸éˆ
-樸直
-見素抱樸
-掣籤
-標籤
-書籤
-發籤
-粉籤å­
-路籤
-更籤
-好籤
-ç«ç±¤
-籤å¹
-籤押
-照入籤
-制籤
-抽公籤
-瑤籤
-藥籤
-è¬ç±¤æ’架
-雲笈七籤
-上簽å
-上簽字
-上簽收
-上簽寫
-下簽å
-下簽字
-下簽收
-下簽寫
-犖确
-磽确
-确瘠
-言辯而确
-數與虜确
-關弓與我确
-æ‹šæ¨
-廣æ¨
-齊王æ¨ç‰›
-æ¨å¢®
-æ¨å¯¦
-棄æ¨
-æ¨å®‰å°±å±
-æ–½èˆä¹‹é“
-瀋河
-瀋水
-瀋州
-瀋山線
-瀋å‰ç·š
-墨沈
-瀋海éµè·¯
-é¼ç€‹
-胜肽
-胜éµ
-雙胜類
-兀朮
-白朮
-蒼朮
-赤朮
-朮赤
-髼鬆
-皮鬆
-濛鬆雨
-發鬆
-翻鬆
-浮鬆
-弄鬆
-精鬆
-懈鬆
-鬆蛋
-鬆寬
-鬆氣
-鬆一å£æ°£
-鬆元音
-鬆喉
-囉囉囌囌
-囉囌
-骨罈
-罈騞
-餵驢
-剪牡丹喂牛
-鹹粥
-鹹食
-鹹潟
-鹹嘴淡舌
-鹽打怎麼鹹
-鹹派
-鹹批
-錦綉花園
-籲天
-勃鬱
-怫鬱
-氣鬱
-沉鬱
-神è¼é¬±å£˜
-èºé¬±
-蒼鬱
-漚鬱
-伊鬱
-壹鬱
-悒鬱
-氤鬱
-湮鬱
-陰鬱
-泱鬱
-å±é¬±
-滃鬱
-蓊鬱
-紆鬱
-鬱勃
-鬱陶
-鬱律
-鬱壘
-鬱ç«
-鬱ç©
-鬱金
-鬱江
-鬱血
-鬱蒸
-鬱症
-鬱沉沉
-鬱熱
-鬱塞
-鬱伊
-鬱邑
-鬱挹
-鬱堙ä¸å¶
-鬱泱
-鬱蓊
-鬱紆
-鬱燠
-è‚鬱
-鬱å’
-鬱鬱ä¸å¹³
-鬱鬱ä¸æ¨‚
-鬱鬱寡歡
-鬱鬱蔥蔥
-鬱鬱而終
-愿樸
-愿而æ­
-許愿起經
-北嶽
-嶽麓
-但云
-胡云
-詩云
-注云
-鄭凱云
-云乎
-云然
-云為
-å°æ‘º
-網誌
-標標致致
-澄澹精致
-呆緻緻
-光緻緻
-工緻
-功緻
-ç¸ç·»
-å …ç·»
-ç§æ”¾
-ç§å¸«é“
-ç§å¸«ä¸­
-後庄
-舊庄
-正官庄
-龜山庄
-寶山庄
-冬山庄
-員山庄
-æ¾å±±åº„
-厂部
-閤府
-佈é“
-剪綵
-è¡é‡
-è¡è»Š
-書çƒå­
-相干
-府干é 
-府干涉
-府干政
-府干擾
-府干犯
-府干å¿
-一干人
-未乾
-未干涉
-抹乾
-餅乾
-æ‹­ä¹¾
-擦乾
-晾乾
-烘乾
-肉乾
-èœä¹¾
-è…ä¹¾
-乾脆
-乾淨
-乾燥
-乾旱
-乾涸
-乾洗
-乾女
-乾等
-乾糧
-乾枯
-乾薪
-乾爹
-乾粉
-乾爽
-乾兒
-ä¹¾å­
-乾渴
-乾股
-乾果
-ä¹¾è‰
-ä¹¾èœ
-乾笑
-乾餾
-乾電
-乾飯
-乾冰
-乾嘔
-ä¹¾æ
-乾媽
-乾季
-è‘¡è„ä¹¾
-æå­ä¹¾
-蘿蔔乾
-蘋果乾
-芒果乾
-è è˜¿ä¹¾
-鳳梨乾
-豆è…ä¹¾
-æžœå­ä¹¾
-é¾çœ¼ä¹¾
-乾乾淨淨
-乾柴烈ç«
-乾乾兒的
-æ¡‘ä¹¾
-撈乾
-æ­ä¹¾é‹ª
-æ©ä¹¾
-敢幹
-幹探
-幹事
-幹什麼
-幹細胞
-悶著頭兒幹
-é…水幹管
-ç¹å¹ƒé£„井幹
-站乾岸兒
-秋陰入井幹
-沒梢幹
-楨幹
-據榦而窺井底
-井榦摧敗
-æ°ç‰¹
-æŽé€£æ°
-周æ°å€«
-æ°å€«
-姜文æ°
-稜é¡
-稜角
-稜å°
-稜éŒ
-觚稜
-稜å­
-稜層
-稜柱
-盧稜伽
-波稜èœ
-è ç¨œèœ
-稜縫
-稜等登
-稜稜
-嶒稜
-蹭稜å­
-稜體
-二ä¸ç¨œç™»
-有稜有角
-å¨ç¨œ
-負債çºçº
-å‚·ç—•çºçº
-儒略曆
-伊斯蘭曆
-酒麴
-昇平
-爾冬陞
-澹臺
-拜託
-委託
-輓曲
-敬輓
-万俟
-万旗
-鬚鯨
-鬚鯊
-兇手
-兇徒
-兇案
-兇器
-兇殺
-兇殘
-行兇
-ç·å…‡
-追兇
-真兇
-ç–‘å…‡
-è²·å…‡
-元兇
-å¶éŸ»
-å¶éŸ³
-å¶æ­å¼˜
-å¶ æ­å¼˜
-å¶ã€€æ­å¼˜
-æ–¼1
-æ–¼2
-æ–¼3
-æ–¼4
-æ–¼5
-æ–¼6
-æ–¼7
-æ–¼8
-æ–¼9
-æ–¼0
-於1
-於2
-於3
-於4
-於5
-於6
-於7
-於8
-於9
-æ–¼ï¼
-於一
-於二
-於三
-於四
-於五
-於六
-於七
-於八
-æ–¼ä¹
-æ–¼å
-æ–¼åŠ
-於夫羅
-於梨è¯
-置於
-佈於
-散於
-æ’­æ–¼
-國於
-æ•—æ–¼
-於一役
-畢於
-畢業於
-寒於
-任於
-拘於
-æ’æ–¼
-中於
-於市
-於野
-æ•æ–¼
-è½æ–¼
-短於
-æˆæ–¼
-樊於期
-æ·¡æ–¼
-於陸
-於密
-於盡
-ç¦æ–¼
-格於
-猛於
-施於
-於牆
-於物
-於己
-於你
-於我
-於他
-於她
-於它
-於祂
-拒人於
-æ‹’æ–¼
-æ½°æ–¼
-窮於
-相於
-形於
-åŠæ–¼
-於始
-於終
-詢於
-美於
-醜於
-好於
-åæ–¼
-å¼·æ–¼
-弱於
-差於
-劣於
-於美
-於醜
-於好
-æ–¼å
-於強
-於弱
-於差
-於劣
-於垂
-染指於
-æ–¼ç«
-å­˜å一於åƒç™¾
-存於
-於勤
-隱於
-è—æ–¼
-åš´æ–¼
-寬於
-於幕
-給於
-於穆
-於呼哀哉
-於時
-於該
-å±æ–¼
-æ–¼ä¼
-於何
-於家
-於國
-於潛縣
-於焉
-於徵
-離於
-於畢
-麗於
-下於
-亞於
-åŒæ–¼
-屑於
-絕於
-致於
-於行
-éœæ–¼
-任教於
-教於
-自於
-來於
-附於
-於人
-於世
-阻於
-於民
-於盲
-於色
-囿於
-ç›´æ–¼
-建於
-都於
-於農
-於樂
-æ–¼å‰
-役於
-於心
-於法
-於事
-助於
-害於
-ææ–¼
-益於
-從於
-隨於
-順於
-汲於
-溺於
-è¿·æ–¼
-醉於
-行於
-泥於
-身於
-足於
-溢於
-於衷
-ç•æ–¼
-視於
-è¡·æ–¼
-狃於
-疲於
-通於
-於途
-è€æ–¼
-耿於
-於懷
-æœæ–¼
-臻於
-匿於
-å› æ–¼
-似於
-é·æ–¼
-怒於
-心於
-集於
-容於
-é«’è©ž
-髒心
-æ–°ç´®
-紙紮
-ç´®éµ
-紮寨
-一紮
-å…©ç´®
-三紮
-四紮
-五紮
-å…­ç´®
-七紮
-å…«ç´®
-ä¹ç´®
-åç´®
-百紮
-åƒç´®
-è¬ç´®
-ä½”1
-ä½”2
-ä½”3
-ä½”4
-ä½”5
-ä½”6
-ä½”7
-ä½”8
-ä½”9
-ä½”0
-佔1
-佔2
-佔3
-佔4
-佔5
-佔6
-佔7
-佔8
-佔9
-ä½”ï¼
-佔零
-佔〇
-佔一
-佔二
-佔兩
-佔三
-佔四
-佔五
-佔六
-佔七
-佔八
-ä½”ä¹
-ä½”å
-佔百
-ä½”åƒ
-佔万
-佔億
-佔超éŽ
-ä½”ä¸è¶³
-佔至少
-佔少
-佔至多
-ä½”åŠ
-佔多
-佔大
-ä½”å°
-佔中
-ä½”æ±
-佔西
-ä½”å—
-佔北
-佔平å‡
-佔總
-ç¨ä½”鰲頭
-所佔
-市佔
-佔率
-市佔率
-佔市場
-佔世界
-佔全
-佔國內
-佔美
-ä½”å°
-佔香
-佔澳
-佔加
-佔新
-佔馬
-ä½”å°
-佔英
-佔法
-佔德
-佔葡
-佔俄
-佔蘇
-佔缺
-ä½”A
-ä½”B
-ä½”C
-ä½”D
-ä½”E
-ä½”F
-ä½”G
-ä½”H
-ä½”I
-ä½”J
-ä½”K
-ä½”L
-ä½”M
-ä½”N
-ä½”O
-ä½”P
-ä½”Q
-ä½”R
-ä½”S
-ä½”T
-ä½”U
-ä½”V
-ä½”W
-ä½”X
-ä½”Y
-ä½”Z
-ä½”a
-ä½”b
-ä½”c
-ä½”d
-ä½”e
-ä½”f
-ä½”g
-ä½”h
-ä½”i
-ä½”j
-ä½”k
-ä½”l
-ä½”m
-ä½”n
-ä½”o
-ä½”p
-ä½”q
-ä½”r
-ä½”s
-ä½”t
-ä½”u
-ä½”v
-ä½”w
-ä½”x
-ä½”y
-ä½”z
-佔A
-佔B
-佔C
-佔D
-佔E
-佔F
-佔G
-佔H
-佔I
-佔J
-佔K
-佔L
-佔M
-佔N
-佔O
-佔P
-佔Q
-佔R
-佔S
-佔T
-佔U
-佔V
-佔W
-佔X
-佔Y
-佔Z
-ä½”ï½
-佔b
-佔c
-佔d
-佔e
-佔f
-佔g
-佔h
-佔i
-佔j
-佔k
-佔l
-ä½”ï½
-佔n
-ä½”ï½
-ä½”ï½
-佔q
-佔r
-佔s
-佔t
-佔u
-佔v
-佔w
-佔x
-佔y
-佔z
-ä½”ä¸ä½”
-ä¸ä½”
-佔了
-佔穩
-佔資æº
-佔人便宜
-佔頭
-ä½”é“
-佔屋
-佔網
-佔床
-佔座
-佔分
-佔飯
-佔個ä½
-佔後
-佔著
-佔山
-馬å å±±
-佔比
-ä½”åœè»Š
-佔哺乳
-佔下風
-å°‘ä½”
-多佔
-費佔
-佔查
-佔壓
-佔優
-佔劣
-ç©©ä½”
-佔整體
-佔局部
-日佔
-美佔
-英佔
-å¾·ä½”
-法佔
-ä¿„ä½”
-è‘¡ä½”
-西佔
-奧佔
-æ„ä½”
-義佔
-地佔
-佔場
-佔耕
-ç‹‚ä½”
-徵佔
-圈佔
-已佔
-ä½”å›
-佔主
-佔次
-寡佔
-佔去
-將佔
-å°‡å åœ
-è¦ä½”
-è¦å åœ
-會佔
-會å åœ
-å åœ
-夢有五ä¸å 
-å æœ‰äº”ä¸é©—
-誌異
-ç­‘å‰
-筑後
-ç­‘ç´«
-ç­‘æ³¢
-ç­‘å·ž
-ç­‘è‚¥
-筑西
-筑北
-肥筑方言
-筑邦
-筑陽
-å—ç­‘
-批准的
-核准的
-為準
-準直
-擺é˜
-ç·¨é˜
-碰é˜
-é³´é˜
-晨é˜
-é˜é«”
-飯後é˜
-盜é˜
-一天é˜
-æ’žé˜
-殿é˜è‡ªé³´
-天文é˜
-天文學é˜
-æ´›é˜æ±æ‡‰
-亮é˜
-郘é˜
-æ­Œé˜
-é˜ä¸æ’žä¸é³´
-毀é˜ç‚ºé¸
-æ´ªé˜
-æ“Šé˜
-警世é˜
-ç«Šé˜æŽ©è€³
-ç´é˜
-見é˜ä¸æ‰“
-é‡é˜
-æœé˜
-木é˜
-é˜ä¸æ‰£ä¸é³´
-é˜é³´
-é˜å¡”
-é˜æ¼
-é˜ç´
-é˜ç£¬
-é˜å½¢èŸ²
-é˜ä¹³æ´ž
-é˜ä¹³çŸ³
-é˜åœ¨å¯ºè£¡
-è©©é˜
-懸é˜
-山崩é˜æ‡‰
-åé˜
-宗周é˜
-塞耳盜é˜
-二缶é˜æƒ‘
-å£é˜
-é˜çš„
-çš„é˜
-這é˜
-å©é˜
-音è²å¦‚é˜
-應é˜
-原å­é˜
-泳氣é˜
-é›»å­é˜
-é›»å­é˜éŒ¶
-石英é˜éŒ¶
-石英é˜
-é˜éŒ¶çŽ‹
-é˜å¾‹
-看é˜
-看錶
-看表é¢
-éµé˜
-看下é˜
-看下錶
-瞅下é˜
-瞅下錶
-拿下é˜
-拿下錶
-é˜ä¸æ•²ä¸éŸ¿
-å°æº–é˜
-å°æº–é˜éŒ¶
-å°æº–錶
-é˜éŒ¶å¿«
-é˜å¿«
-錶快
-é˜éŒ¶æ…¢
-é˜æ…¢
-錶慢
-響é˜
-é˜æ•²
-大本é˜æ•²
-大笨é˜æ•²
-世紀é˜éŒ¶
-世紀é˜
-錶王
-é˜çŽ‹
-é˜éŒ¶
-å¤é˜
-å¤é˜éŒ¶
-é˜é¢
-é˜è¡¨é¢
-å—京é˜
-å—京é˜éŒ¶
-造é˜éŒ¶
-造é˜
-ä¹é¾è¡¨è¡Œ
-é˜éŒ¶è¡Œ
-é˜è¡Œ
-錶行
-å°åž‹é˜è¡¨é¢
-å°åž‹é˜é¢
-å°åž‹é˜éŒ¶
-å°åž‹é˜
-中型é˜è¡¨é¢
-中型é˜é¢
-中型é˜éŒ¶
-中型é˜
-大型é˜è¡¨é¢
-大型é˜é¢
-大型é˜éŒ¶
-大型é˜
-é˜åŒ 
-深山何處é˜
-下課é˜
-上課é˜
-è€çˆºé˜
-è¬å¹´æ›†éŒ¶
-個é˜
-個é˜éŒ¶
-喜歡é˜
-喜歡é˜éŒ¶
-喜歡錶
-大é˜
-ä½›é˜
-é˜å£
-é˜è…°
-é˜å£
-é˜èº«
-é˜æ¨¡
-é˜é ‚
-é˜ç´
-é˜åº§
-ä»–é˜
-寺é˜
-座é˜
-盜é˜
-大笨é˜
-大本é˜
-é˜éŒ¶æ­·å²
-錶的歷å²
-é˜éŒ¶çš„æ­·å²
-點多é˜
-點åŠé˜
-分多é˜
-刻多é˜
-分åŠé˜
-刻åŠé˜
-教學é˜
-æ“作é˜
-å—å±æ™šé˜
-敲é˜
-瞧著é˜
-瞧著é˜éŒ¶
-瞧著錶
-警報é˜
-猶如é˜
-猶如é˜éŒ¶
-猶如錶
-舊é˜éŒ¶
-ç¹é˜
-å››é¢é˜
-æ›´é˜
-警示é˜
-é˜å·®
-任何é˜éŒ¶
-任何é˜
-任何錶
-任何表示
-任何表é”
-任何表演
-é¸æ‰‹è¡¨ç¾
-é¸æ‰‹è¡¨é”
-é¸æ‰‹è¡¨ç¤º
-é¸æ‰‹è¡¨æ˜Ž
-é¸æ‰‹è¡¨æ±º
-分å­é˜
-飛行é˜
-é˜ç½©
-主é˜å·®
-花é˜
-磬é˜
-主é˜æ›²ç·š
-é˜é€Ÿ
-ç´…é˜
-å„é¡žé˜
-打著é˜
-é˜æ„
-衛星é˜
-該é˜
-錶轉
-é˜èª¿
-調é˜éŒ¶
-調錶
-原é˜
-é˜éŒ¶é€Ÿ
-件é˜
-é˜ç™¼éŸ³
-逆é˜
-æ‹‚é˜ç„¡è²
-é˜ä¸ç©ºå‰‡å•ž
-看著é˜éŒ¶
-看著é˜
-看著錶
-晚é˜
-潛水é˜éŒ¶
-潛水é˜
-潛水錶
-樂器é˜
-é˜å·¦å³
-埋頭尋é˜éŒ¶
-埋頭尋é˜
-埋頭尋錶
-é˜é™³åˆ—
-é©šé˜
-望著é˜éŒ¶
-望著é˜
-望著錶
-é˜éŒ¶åœ
-é˜åœ
-銫é˜
-數字é˜éŒ¶
-數字é˜
-顯示é˜éŒ¶
-顯示é˜
-顯示錶
-å如é˜
-錶åœ
-西周é˜
-æ±å‘¨é˜
-錶速
-機械é˜éŒ¶
-機械é˜
-機械錶
-之é˜
-é˜å½¢
-架é˜
-é †é˜å‘
-逆é˜å‘
-éºå‚³é˜
-鬧錶
-è¯åš´é˜
-懷é˜
-生物é˜
-é˜éŒ¶çš„
-錶的嘀嗒
-çš„é˜éŒ¶
-嘀嗒的錶
-é˜å¥½
-é˜å¤ª
-é˜ä¸
-é˜æœ‰
-é˜ç›¤
-é˜éŒ¶ç›¤
-é˜æ²’
-é˜è¢«
-制é˜
-布穀鳥é˜
-å’•å’•é˜
-拉克施爾德é˜
-é˜ä¸Š
-é˜ä¸‹
-摸é˜
-舊é˜
-舊錶
-å°é˜
-é˜éŸ¿
-å©é˜
-計時錶
-防水錶
-å°„éµ°
-神鵰
-神雕åƒ
-采石磯
-采石之戰
-采石之役
-èŠé½‹å¿—ç•°
-部è½ç™¼
-角è½ç™¼
-æ‘è½ç™¼
-蛇髮女妖
-畢生發展
-å°è¯ç™¼å‹•
-中美發表
-尸魂界
-樹樑
-屋樑
-樑柱
-柱樑
-下樑
-上æ¢å±±
-昇陽
-僥倖
-å¤éŠ
-秋éŠ
-冬éŠ
-黑奴籲天錄
-æž—éƒæ–¹
-讚歌
-編餘
-餘墨
-唾餘
-餘韻
-歸餘
-公餘
-寬餘
-餘糧
-餘慶
-餘殃
-餘燼
-劫餘
-çµé¤˜
-燼餘
-淨餘
-餕餘
-餘暉
-餘è¼
-羨餘
-餘悸
-心餘
-刑餘
-緒餘
-血餘
-朱慶餘
-諸餘
-餘論
-茶餘
-廚餘
-餘裕
-餘氣
-詩餘
-詞餘
-餘僇
-餘辜
-餘責
-餘罪
-無餘
-耳餘
-餘烈
-餘æ€
-鹽餘
-嬴餘
-è´é¤˜
-王餘魚
-紆餘
-餘波
-餘æ¯
-餘步
-餘妙
-餘音
-餘è²
-餘明
-餘風
-餘黨
-餘毒
-餘桃
-餘桶
-餘利
-餘ç€
-餘è†
-餘光
-餘æ­
-餘竅
-餘缺
-餘暇
-餘閒
-餘羨
-餘響
-餘興
-餘蓄
-餘緒
-餘ç
-餘眾
-餘酲
-餘喘
-餘食
-餘熱
-餘刃
-餘é–
-餘存
-餘業
-餘姚
-餘蔭
-餘映
-餘外
-餘å¨
-餘味
-餘溫
-餘勇
-多餘
-剩餘
-餘生
-餘歡
-有餘
-一餘
-二餘
-兩餘
-三餘
-四餘
-五餘
-六餘
-七餘
-八餘
-ä¹é¤˜
-å餘
-百餘
-åƒé¤˜
-è¬é¤˜
-億餘
-兆餘
-0餘
-1餘
-2餘
-3餘
-4餘
-5餘
-6餘
-7餘
-8餘
-9餘
-ï¼é¤˜
-1餘
-2餘
-3餘
-4餘
-5餘
-6餘
-7餘
-8餘
-9餘
-余姓
-余光生
-余光中
-ä½™æ€æ•
-ä½™å¨å¾·
-ä½™å­æ˜Ž
-余三å‹
-å´‘å±±
-崑曲
-å´‘è…”
-崑調
-崑劇
-崑蘇
-蘇崑
-分布圖
-一干家中
-星期後
-ä¸å‡†ä½ 
-ä¸å‡†æˆ‘
-ä¸å‡†ä»–
-ä¸å‡†å¥¹
-ä¸å‡†å®ƒ
-ä¸å‡†èª°
-ä¸å‡†è¨±
-准ä¸å‡†ä½ 
-准ä¸å‡†æˆ‘
-准ä¸å‡†ä»–
-准ä¸å‡†å¥¹
-准ä¸å‡†å®ƒ
-准ä¸å‡†èª°
-准ä¸å‡†è¨±
-ä¾ä¾ä¸æ¨
-戀戀ä¸æ¨
-窮追ä¸æ¨
-緊追ä¸æ¨
-é¥è€Œä¸æ¨
-稜登
-å‰è¨€ä¸ç­”後語
-繃扒弔拷
-ä¸å¼”
-ä¸é€šå¼”æ…¶
-陪弔
-盆弔
-å±è‚¡å¤§å¼”了心
-撇弔
-憑弔
-門弔兒
-ä¼ç½ªå¼”æ°‘
-打出弔入
-æ—鬼弔白
-弔膀å­
-弔民
-弔民ä¼ç½ª
-弔奠
-弔頭
-å¼”å¤
-å¼”å¤å°‹å¹½
-弔詭
-弔詭矜奇
-弔客
-弔拷
-弔拷繃扒
-弔扣
-弔賀迎é€
-弔鶴
-弔喉
-弔謊
-弔祭
-弔腳兒事
-弔頸
-弔橋
-å¼”å–
-å¼”å­
-弔紙
-弔者大悅
-弔場
-弔書
-弔詞
-弔死å•å­¤
-弔死å•ç–¾
-弔撒
-弔喪
-弔喪å•ç–¾
-弔腰撒跨
-å¼”å”
-弔宴
-弔喭
-弔影
-弔慰
-弔文
-å¼”å•
-頭巾弔在水裡
-æ心弔膽
-弄鬼弔猴
-管人弔腳兒事
-é–‹å¼”
-鶴弔
-昊天ä¸å¼”
-花馬弔嘴
-會弔
-å‰å‡¶æ…¶å¼”
-蟣è¨ç›¸å¼”
-祭弔
-祭弔文
-é’蠅弔客
-慶弔
-形影相弔
-哀弔
-一弔
-å”å¼”
-於水
-安於
-è¿«æ–¼
-ç½·æ–¼
-蹪於
-æ–¼æ•
-æ–¼éŽ
-甚於
-等於
-定於
-利於
-å°æ–¼
-推舟於陸
-退è—於密
-歸於
-難於
-移ç¦æ–¼
-生於
-ç«‹æ–¼
-多於
-å‹æ–¼
-傳於
-æµæ–¼
-éŽæ–¼
-關於
-毀於
-基於
-急於
-å«ç¦æ–¼
-借è½æ–¼è¾
-見於
-é‘’æ–¼
-謹於心
-求é“於盲
-始於
-æ–¼è—
-出於
-輕於
-行百里者åŠæ–¼ä¹å
-幸於
-怠於
-詢於芻蕘
-止於
-至於
-拙於
-å¿ æ–¼
-終於
-é‡æ–¼
-åž‚æ–¼
-å–„æ–¼
-死於
-屬於
-浮於
-在於
-åŽè–ªæ–¼ç«
-易於
-精於
-由於
-於此
-燕巢於幕
-æ–¼èŸ
-於乎
-於戲
-於邑
-補於
-ä½æ–¼
-於今
-於是
-於是乎
-於斯
-寓於
-月離於畢
-月麗於箕
-æºæ–¼
-且於
-é•·æ–¼
-短於
-ç¾æ–¼
-較於
-於之
-分布於
-分散於
-優於
-æ—©æ–¼
-晚於
-æ„Ÿæ–¼
-鬼谷å­
-于美人
-ç·Šç·»
-冗餘
-曰云
-若干
-徵婚
-鬥鬨
-事有鬥巧
-歹鬥
-鬥茶
-鬥鴨
-爭奇鬥å¦
-誇能鬥智
-春香鬥學
-鬥引
-鬥彩
-鬥武
-鬥悶
-鬥牙拌齒
-鬥幌å­
-鬥腳
-雞åµéµé¬¥
-辯鬥
-å»é¬¥
-誇多鬥é¡
-臨潼鬥寶
-鬥趣
-撩鬥
-傲霜鬥雪
-賭鬥
-æ¬é¬¥
-鬥爭鬥åˆ
-鬥疊
-鬥文
-è€é¬¥
-鬥巧
-油鬥
-蚊動牛鬥
-åµèˆ‡çŸ³é¬¥
-挑鬥
-爭奇鬥異
-鬥葉å­
-鬥分å­
-爭å¦é¬¥å¥‡
-ä¸é¬¥
-鬥心眼
-鬥頭
-挌鬥
-好鬥
-鬥åˆ
-拚鬥
-兩虎共鬥
-兩鼠鬥穴
-鬥犀臺
-鬥牙鬥齒
-惡鬥
-鬥å‹
-鬥富
-鬥艦
-鬥葉兒
-鬥彆氣
-鬥話
-鬥牌
-鬥百è‰
-鬥打
-鬥犬
-鬥風
-鬥雪紅
-鬥暴
-鬥閑氣
-é¾é¬¥è™Žå‚·
-殷師牛鬥
-二虎相鬥
-鬥力
-爭紅鬥紫
-鬥麗
-鬥狠
-鬥飣
-虎鬥
-引鬥
-爭å¦é¬¥è±”
-轉鬥åƒé‡Œ
-鬥而鑄兵
-困鬥
-好勇鬥狠
-爭奇鬥豔
-使其鬥
-鬥地主
-石樑
-木樑
-è—æ­·å²
-é é¢
-æ–¹é¢
-表é¢
-é¢æ¢ç›®
-課餘
-節餘
-盈餘
-病餘
-餘地
-餘力
-餘å­
-餘事
-扶餘國
-è…餘
-富餘
-之餘
-餘澤
-æµé¢¨é¤˜ä¿—
-æµé¢¨é¤˜éŸ»
-淋餘土
-餘一
-餘二
-餘三
-餘四
-餘五
-餘六
-餘七
-餘八
-餘ä¹
-餘å
-零餘
-〇餘
-餘零
-餘〇
-餘1
-餘2
-餘3
-餘4
-餘5
-餘6
-餘7
-餘8
-餘9
-餘0
-餘1
-餘2
-餘3
-餘4
-餘5
-餘6
-餘7
-餘8
-餘9
-餘ï¼
-餘數
-其餘
-尸居餘氣
-賸餘
-餘孽
-殘餘
-業餘
-餘割
-餘款
-餘角
-餘切
-餘霞
-餘下
-餘弦
-餘震
-餘貾
-餘é¡
-禹餘糧
-餘人
-編余
-ç—…ä½™
-餘俗
-餘å€
-åŒé¤˜
-大讚
-唄讚
-褒讚
-謬讚
-誄讚
-ç¥è®š
-詩讚
-賞讚
-讚唄
-飛紮
-紮裹
-紮腳
-ç´®è©
-紮囮
-ä½ç´®
-佔畢
-佔頭籌
-佔高æžå…’
-隱佔
-憑摺
-沒摺至
-大摺兒
-大週摺
-ç«æ‘ºå­
-è£æ‘º
-變徵
-談徵
-ç´å¾µ
-æµå¾µ
-柳詒徵
-固徵
-è²´å¾µ
-考徵
-å’Žå¾µ
-æžå®‹ç„¡å¾µ
-休徵
-徵辟
-å¾µå責實
-徵發
-徵風å¬é›¨
-徵答
-徵啟
-å¾µé¸
-徵招
-徵士
-徵庸
-之徵
-ç‘žå¾µ
-三徵七辟
-é¡å¾µ
-有徵
-有å¾æœ
-有å¾æˆ°
-有å¾ä¼
-有å¾è¨Ž
-ç„¡å¾µä¸ä¿¡
-文徵明
-徵跡
-徵車
-徵效
-徵怪
-å¾µè–
-徵咎
-å¾µå
-徵令
-本徵
-船é˜
-黃鈺筑
-齊莊
-鴻案相莊
-項莊
-韋莊
-é‹èŽŠ
-鄭莊公
-通莊
-蒙莊
-端莊
-票莊
-矜莊
-楚莊å•é¼Ž
-楚莊絕纓
-整莊
-打路莊æ¿
-莊騷
-莊語
-莊舄越åŸ
-莊房
-莊客
-莊農
-平泉莊
-布莊
-香山庄
-寶莊
-å莊
-周莊王
-發莊
-åžèŽŠ
-包莊
-剔莊貨
-劉克莊
-冷莊å­
-石家莊
-åžèŽŠå­
-新莊市
-當準
-憑準
-沒準
-蜂準
-推情準ç†
-寇準
-åˆæº–
-準ä¿
-準譜
-準分å­
-準點
-一個準
-準擬
-準貨幣
-準å¼
-èªæº–
-三準
-éµæº–
-有準
-å´‘å´™
-鎌倉
-è«‹å›å…¥ç”•
-甕安
-ç—Šç™’
-治癒
-ç—…ç™’
-大病åˆç™’
-ç™’åˆ
-槓桿
-宣洩
-圖鑑
-諮詢
-勳章
-張勳
-趙治勳
-æ®­å±
-有栖å·
-兇惡
-兇狠
-兇猛
-兇橫
-å…‡æ‚
-兇險
-兇相
-兇犯
-嫌兇
-兇嫌
-兇疑
-兇刀
-å…‡æ§
-很兇
-兇巴巴
-行兇å‰
-å‡éŠ
-éŠè²§
-éŠåº¦
-éŠå½¢
-éŠå¸«
-éŠçŸ³
-éŠå­—
-éŠå†¶
-ç´°éŠ
-陳éŠ
-é—–éŠ
-éŠæ±ž
-æ·¬éŠ
-鋼之éŠé‡‘術師
-索馬里
-范登堡
-世田谷
-製漿
-三統歷å²
-伊斯蘭教歷å²
-伊斯蘭歷å²
-儒略改é©æ­·å²
-儒略歷å²
-公歷å²
-å°æ­·å²
-åˆæ­·å²
-周歷å²
-商歷å²
-四分歷å²
-回歷å²
-埃åŠæ­·å²
-大明歷å²
-大歷å²
-大è¡æ­·å²
-太åˆæ­·å²
-官歷å²
-寶歷å²
-巧歷å²
-希伯來歷å²
-弘歷å²
-慶歷å²
-日歷å²
-星歷å²
-月歷å²
-朱ç†å®‰æ­·å²
-桌歷å²
-永歷å²
-玉歷å²
-百花歷å²
-皇歷å²
-皇極歷å²
-穆罕默德歷å²
-ç®—æ­·å²
-紀歷å²
-舊歷å²
-航海歷å²
-è¬æ­·å²
-行事歷å²
-農歷å²
-農民歷å²
-通歷å²
-é•·æ­·å²
-é™°æ­·å²
-陽歷å²
-é¡æˆ‘略歷å²
-黃歷å²
-天曆
-天歷å²
-美醜
-ç»é†œ
-出醜
-家醜
-é®é†œ
-醜八怪
-醜å
-醜詆
-醜態
-醜女
-醜類
-醜陋
-醜虜
-醜化
-醜劇
-醜媳婦
-醜å°é´¨
-醜行
-醜事
-醜è²
-醜人
-醜惡
-醜丫頭
-醜èž
-醜語
-æ¯é†œ
-一齣å­
-齣兒
-è³£çƒ
-發çƒ
-大çƒ
-çƒçƒ
-çƒç­‰
-çƒé ­
-çƒè…¦
-çƒæ ¹
-çƒç£•
-çƒæ†¨çƒ
-çƒè©±
-çƒæ°£
-çƒæƒ³
-çƒæ€§
-çƒæ»¯
-çƒè‘—
-çƒç—´
-çƒä¸²äº†çš®
-çƒäº‹
-çƒäºº
-çƒå­
-好çƒ
-å ä¾¿å®œçš„是çƒ
-阿çƒ
-丰標
-丰姿
-丰韻
-éµ°ç¿Ž
-鵰心é›çˆª
-鵰鶚
-雙鵰
-撲鼕鼕
-普鼕鼕
-鼕鼕鼓
-令人髮指
-爆發指數
-開發
-剪其髮
-å哺æ‰é«®
-å哺æ¡é«®
-å«é½’戴髮
-大金髮苔
-寸髮åƒé‡‘
-心長髮短
-戴髮å«é½’
-拔髮
-拔鬚
-æªé«®
-æªé¬š
-整髮用å“
-斷髮文身
-滿頭洋髮
-燙一個髮
-燙一次髮
-燙個髮
-燙完髮
-燙次髮
-ç†ä¸€å€‹é«®
-ç†ä¸€æ¬¡é«®
-ç†å€‹é«®
-ç†å®Œé«®
-ç†æ¬¡é«®
-細如髮
-繫於一髮
-膚髮
-皮膚
-生è¯é«®
-蒼髮
-被髮佯狂
-被髮入山
-被髮左衽
-被髮纓冠
-被髮陽狂
-身體髮膚
-é«’é«®
-髮光å¯é‘‘
-髮已霜白
-髮油
-髮為血之本
-髮網
-髮踊沖冠
-髮際
-黃髮
-é½’è½é«®ç™½
-剷頭
-剷刈
-å£ç‡¥å”‡ä¹¾
-舌乾唇焦
-花è´è©žé¸
-渾箇
-箇中原因
-箇中ç†ç”±
-箇中高手
-箇中好手
-箇中強手
-箇中滋味
-箇中奧秘
-箇中奧妙
-箇中玄機
-箇中消æ¯
-箇中資訊
-箇中訊æ¯
-å°è¡¨é”
-å°è¡¨ç¾
-å°è¡¨æ¼”
-å°è¡¨æš
-å°è¡¨ä¸­
-å°è¡¨æ˜Ž
-ä¸æº–確
-並ä¸æº–確
-一伙頭
-一伙食
-一åŠåª
-一干弟兄
-一干弟å­
-一干部下
-一斗斗
-一é¢é£Ÿ
-è¬ä¸€åª
-上é¢ç³Š
-ä¸å…‹è‡ªåˆ¶
-ä¸å‡†æ²’
-ä¸åŠ è‡ªåˆ¶
-ä¸å å‡¶å‰
-ä¸å åœ
-ä¸å å‰å‡¶
-ä¸å ç®—
-ä¸å¥½å¹²æ¶‰
-ä¸å¥½å¹²é 
-ä¸å¹²é 
-ä¸å¹²æ¶‰
-ä¸å¹²ä¼‘
-ä¸å¹²çŠ¯
-ä¸å¹²æ“¾
-ä¸å¹²ä½ 
-ä¸å¹²æˆ‘
-ä¸å¹²ä»–
-ä¸å¹²å¥¹
-ä¸å¹²å®ƒ
-ä¸å¹²äº‹
-ä¸æ–—膽
-ä¸æ¯åª
-ä¸é‡‡è²
-å°ˆå‘å¾€
-丰容
-之一åª
-之二åª
-之八ä¹åª
-也斗了膽
-事情干脆
-事都干脆
-二åªå¾—
-亦云
-人云
-以自制
-們斗了膽
-你斗了膽
-其一åª
-其二åª
-其八ä¹åª
-å…§é¢åŒ…
-å…§é¢åŒ…çš„
-准ä¿è­·
-准ä¿é‡‹
-几上
-几淨窗明
-几凳
-几å­
-几æ—
-几椅
-几榻
-几é¢ä¸Š
-出å¾æ”¶
-擊扑
-划一槳
-划了一會
-划到岸
-划到江心
-å‰é¢åº—
-åƒåªå¯
-åƒåªå¤ 
-åƒåªæ€•
-åƒåªèƒ½
-åƒåªè¶³å¤ 
-åŠåªå¯
-åŠåªå¤ 
-å äº†åœ
-å£å¹²å†’
-å£å¹²æ”¿
-å£å¹²æ¶‰
-å£å¹²çŠ¯
-å£å¹²é 
-å¤æ›¸äº‘
-å¤èªžäº‘
-åªå åœ
-åªå å‰
-åªå ç¥žå•åœ
-åªå ç®—
-åªèº«ä¸Šå·²
-åªèº«ä¸Šç„¡
-åªèº«ä¸Šæœ‰
-åªèº«ä¸Šæ²’
-åªèº«ä¸Šçš„
-åªèº«ä¸–
-åªèº«ç‚º
-åªèº«ä»½
-åªèº«é«”
-åªèº«å‰
-åªèº«å—
-åªèº«å¾Œ
-åªèº«å­
-åªèº«å½¢
-åªèº«å½±
-åªèº«å¿ƒ
-åªèº«æ—
-åªèº«æ
-åªèº«æ®µ
-åªèº«é‚Š
-åªèº«é¦–
-åªèº«é«˜
-åªé‡‡è²
-å¯è‡ªåˆ¶
-å°å­å¥³
-å°å­å­«
-å°å¸ƒæ™¯
-å°é¢å‰
-åˆåºœä¸Š
-後é¢åº—
-å‘往常
-å‘往日
-å‘往時
-å‘往來
-唯一åª
-喂了一è²
-å–œå‘å¾€
-四出徵收
-å››é¢åŒ…
-多åŠåª
-好斗大
-好斗室
-好斗笠
-好斗篷
-好斗膽
-好斗蓬
-家具體
-家具備
-家具有
-å°å‡ 
-尸利
-尸祿
-尸臣
-尸鳩
-å·²å åœ
-å·²å ç®—
-并迭
-所云
-所云云
-所å åœ
-所å æ˜Ÿ
-所å ç®—
-手表決
-手表態
-手表明
-手表演
-手表ç¾
-手表示
-手表é”
-手表露
-手表é¢
-æ‰å¹²ä¼‘
-æ‰å¹²æˆˆ
-æ‰å¹²æ“¾
-æ‰å¹²æ”¿
-æ‰å¹²æ¶‰
-æ‰å¹²é 
-扎好底å­
-扎好根
-扑撻
-打å¨
-折å‘å¾€
-拉é¢ä¸Š
-拉é¢å…·
-拉é¢å‰
-拉é¢å·¾
-拉é¢ç„¡
-拉é¢çš®
-拉é¢ç½©
-拉é¢è‰²
-拉é¢éƒ¨
-æ‰å¥¸é»¨
-æ‰å¥¸å¾’
-æ‰å¥¸ç´°
-æ‰å¥¸è³Š
-敢情欲
-敢斗了膽
-敲扑
-æ–¹å‘å¾€
-望了望
-桌几
-æ¯æ¯åª
-法自制
-洒滌
-æ´’æ·…
-洒濯
-洒然
-ç˜æ¶‚
-特制ä½
-特制定
-特制止
-特制訂
-百åªå¯
-百åªå¤ 
-百åªæ€•
-百åªè¶³å¤ 
-皮制æœ
-相克制
-相克æœ
-短几
-石几
-秒表明
-秒表示
-窗明几亮
-竹几
-精制ä¼
-精制ä½
-精制æœ
-經有云
-給我干脆
-編制法
-能干休
-能干戈
-能干擾
-能干政
-能干涉
-能干é 
-能自制
-自制一下
-自制下來
-自制ä¸
-自制之力
-自制之能
-自制他
-自制ä¼
-自制你
-自制地
-自制她
-自制情
-自制我
-自制æœ
-自制的能
-自制能力
-船åªå¾—
-船åªæœ‰
-船åªèƒ½
-è‰è
-èå±…
-è臻
-è饑
-è¦è‡ªåˆ¶
-語有云
-跌扑
-轉å‘å¾€
-酒帘
-裡é¢åŒ…
-金表態
-金表情
-金表æš
-金表明
-金表演
-金表ç¾
-金表示
-金表é”
-金表露
-金表é¢
-長几
-隆准許
-雄斗斗
-é¢åŒ…ä½
-é¢åŒ…辦
-é¢åŒ…廂
-é¢åŒ…å«
-é¢åŒ…åœ
-é¢åŒ…容
-é¢åŒ…庇
-é¢åŒ…ç´®
-é¢åŒ…抄
-é¢åŒ…括
-é¢åŒ…攬
-é¢åŒ…涵
-é¢åŒ…管
-é¢åŒ…ç¾…
-é¢åŒ…è‘—
-é¢åŒ…è—
-é¢åŒ…è£
-é¢åŒ…裹
-é¢åŒ…èµ·
-é¢åº—舖
-é¢ç²‰ç¢Ž
-é¢ç²‰ç´…
-é¢é£Ÿéºµ
-é¢é£Ÿé£¯
-顛顛仆仆
-高干擾
-高干é 
-高度自制
-黃金表
-天åŽå®®
-一åŠéŒ¢
-ä¸é£Ÿä¹¾è…Š
-傳ä½äºŽå››å¤ªå­
-儉确之教
-党懷英
-八蜡
-憑几
-å—宮适
-大蜡
-å­äº‘
-分å­é›²
-å°ä»·
-æ­²è¿äº‘æš®
-崖广
-æ•ä¹ä»·å‚¬
-悲筑
-折å­æˆ²
-æ®æ†
-æ¤è‚®æ‹ŠèƒŒ
-文采éƒéƒ
-木æ†
-洪适
-çƒæ†
-腊之以為餌
-腊毒
-蜡月
-蜡祭
-言云
-宜云
-è²´ä»·
-éƒéƒè²è²
-馬æ†
-造麯
-麴生
-麴秀æ‰
-麴塵
-麴櫱
-大麴
-黃麴毒素
-酒醴麴櫱
-麴é“士
-麴錢
-麴車
-麴院
-鼠麴è‰
-ä¸ä¹¾ä¸æ·¨
-生發生
-å¿…é ˆ
-須根據
-·范
-ã€å‰‹åˆ¶
-,剋制
-。剋制
-ï¼å‰‹åˆ¶
-?剋制
-;剋制
-:剋制
-ä¸å‰‹åˆ¶
-也剋制
-了剋制
-他剋制
-們剋制
-剋制ä¸äº†
-剋制ä¸ä½
-力剋制
-力求剋制
-å¯ä»¥å‰‹åˆ¶
-和剋制
-在剋制
-地剋制
-夠剋制
-她剋制
-你剋制
-您剋制
-就剋制
-彼此剋制
-得剋制
-快剋制
-想剋制
-æ„剋制
-應剋制
-我剋制
-æ‰å‰‹åˆ¶
-於剋制
-易剋制
-無法剋制
-的剋制
-盡é‡å‰‹åˆ¶
-而剋制
-能剋制
-與剋制
-著剋制
-è¦å‰‹åˆ¶
-è»éšŠå‰‹åˆ¶
-空投佈雷
-ç«ç®­ä½ˆé›·
-æµ·ç£ä½ˆé›·
-空中佈雷
-海上佈雷
-佈雷的
-佈雷,
-佈雷ã€
-佈雷。
-佈雷;
-佈雷艦
-佈雷艇
-佈雷速度
-佈雷å°éŽ–
-滿拚自盡
-拚生盡死
-æ‹šå»
-æ‹šè€å‘½
-拚絕
-æˆæ–¼æ€
-單單於
-ç©æ¾±
-æ¾±ç©
-澱北片
-澱解物
-澱謂之滓
-淺澱
-堙澱
-茂都澱
-並曰入澱
-澱乃ä¸è€•ä¹‹åœ°
-è—æ¾±
-皆å¯ä½œæ¾±
-澱山
-海淀山後
-澱澱
-掛鈎
-è–´æ‚´
-絡腮é¬
-è½è…®é¬
-山羊é¬
-幸é‹é¬
-刮é¬
-剃é¬
-å¹é¬
-è“„é¬
-白é¬
-é•·é¬
-é¬é«¯
-髯é¬
-é«­é¬
-鬚é¬
-范文瀾
-范文åŒ
-范文正公
-范文程
-范文芳
-范文藤
-范文虎
-范文照
-發表
-ä¹¾é‡
-若干
-鈎心鬥角
-若干
-ä¹¾é‡
-å…¨é¢åŒ…åœ
-å…¨é¢åŒ…裹
-機械系
-體系
-心ç†
-複分解
-é¹°éµ°
-å±å’¤903
-å±å’¤MY903
-å±å’¤My903
-å±å’¤æ¨‚壇
-å±å’¤å’¤
-å±å’¤å±å’¤å±å’¤å’¤
-å±å’¤å±å±å’¤
-正在å±å’¤
-空餘
-變髒
-天地志狼
-薴烯
-阿斯圖里亞斯
-雙折射
-心繫家
-心繫國
-心繫祖
-心繫北
-心繫京
-心繫å—
-心繫西
-心繫æ±
-心繫四
-心繫å·
-心繫浙
-心繫汶
-心繫廣
-心繫湖
-心繫山
-心繫å°
-心繫江
-心繫昌
-心繫香
-心繫澳
-心繫港
-心繫泰
-心繫å¥
-心繫天
-心繫地
-心繫大
-心繫å°
-心繫全
-心繫眾
-心繫奧
-心繫世
-心繫中
-心繫高
-心繫ç½
-心繫éž
-心繫群
-心繫新
-心繫沈
-心繫å”
-心繫黃
-心繫乔
-心繫阮
-心繫父
-心繫æ¯
-心繫病
-心繫故
-心繫哪
-心繫中
-心繫英
-心繫美
-心繫日
-心繫德
-心繫功
-心繫曉
-心繫神
-心繫è¬
-心繫的
-心繫在
-心繫兩
-心繫社
-心繫曼
-心繫彼
-心繫風
-心繫募
-心繫一
-心繫何
-心繫困
-心繫輸
-心繫人
-心繫民
-心繫å
-心繫百
-心繫åƒ
-心繫和
-心繫é¸
-心繫囑
-心繫我
-心繫你
-心繫您
-心繫他
-心繫她
-心繫它
-心繫伊
-心繫長
-心繫舞
-心繫蘭
-心繫五
-心繫生
-心繫婦
-心繫幼
-心繫茶
-心繫動
-心繫沙
-心繫林
-心繫摩
-心繫农
-心繫慈
-心繫麥
-心繫貧
-心繫富
-心繫é 
-心繫近
-心繫宣
-心繫傳
-心繫紅
-心繫è€
-心繫é‡
-心繫震
-心繫妻
-心繫夫
-心繫女
-心繫å­
-心繫著
-é‡å›ž
-挑大樑
-扛大樑
-åŽè±
-製得
-é™åˆ¶
-控制
-製å–
-第四出局
-心臟
-è‚臟
-脾臟
-肺臟
-腎臟
-åƒèˆ‡
-浮誇
-星巴克
-于謙
-于寘
-淳于
-于ç¦
-于æ•ä¸­
-註:# ä¸ä½œâ€œæ³¨ï¼šâ€
-呆呆ç¸
-劃為# ä¸ä½œâ€œåˆ’為â€
-併為一體
-併為一家
-一個# é¿å…“個裡â€çš„錯誤
-兩個
-二個
-三個
-四個
-五個
-六個
-七個
-八個
-ä¹å€‹
-å個
-百個
-åƒå€‹
-è¬å€‹
-億個
-兆個
-零個
-云:# ä¸ä½œâ€œé›²ï¼šâ€
-é›»å­è¡¨æ ¼
-雪裡紅
-雪裡蕻
-森林裡
-æ—¥å­è£¡
-故事裡
-領域裡
-時間裡
-深淵裡
-醫院裡
-春å‡è£¡
-æš‘å‡è£¡
-秋å‡è£¡
-寒å‡è£¡
-春天裡
-å¤å¤©è£¡
-秋天裡
-冬天裡
-春日裡
-å¤æ—¥è£¡
-秋日裡
-冬日裡
-嘴裡
-心裡
-皮裡陽秋
-肚裡
-苦裡
-裡勾外連
-裡é¢
-這裡
-中文裡
-山洞裡
-世界裡
-眼ç›è£¡
-首發
-夸脫
-誰幹的
-é˜èžº
-風采
-代碼表
-編碼表
-字碼表
-電碼表
-科斗
-佔領
-ç•æ°´
-點裡
-這åªæ˜¯
-這åªä¸
-這åªå®¹
-這åªå…
-這åªæŽ¡
-這åªç”¨
-有åªæ˜¯
-有åªä¸
-有åªå®¹
-有åªå…
-有åªæŽ¡
-有åªç”¨
-葉å¶ç¹
-胡å­æ˜‚
-包括
-特别致
-分别致
-會上簽訂
-會上簽署
-周一 # (åŠä»¥ä¸‹ï¼‰é¿å…“周一齣版â€çš„錯誤
-周二
-周三
-周四
-周五
-周六
-韶山沖
-總è£åˆ¶
-于丹
-于樂
-于冕
-于è»
-于å‰
-于堅
-于姓
-于æ°
-于娜
-于娟
-于山
-于帥
-于慧
-于振
-于æ•
-于斌
-于晴
-于波
-于濤
-于衡
-于贈
-于越
-于é–
-于勒
-于格
-于ä»æ³°
-于會泳
-于å‰åœ‹
-于佳å‰
-于光é 
-于克勒
-于凌奎
-于鳳至
-于化虎
-于å å…ƒ
-于å°ç…™
-于å“æµ·
-于國楨
-于大寶
-于天ä»
-于å­åƒ
-于孔兼
-于學忠
-于家堡
-于å°å‰
-于å°å½¤
-于山國
-于幼è»
-于廣洲
-于康震
-于å¼æžš
-于從濂
-于德海
-于志寧
-于慎行
-于æˆé¾
-于振武
-于明濤
-于是之
-于晨楠
-于根å‰
-于樹潔
-于欣æº
-于正昇
-于正昌
-于永波
-于漢超
-于江震
-于洪å€
-于浩å¨
-于海洋
-于湘蘭
-于特森
-于玉立
-于秀æ•
-于素秋
-于若木
-于蔭霖
-于西翰
-于é å‰
-于é“泉
-于都縣
-于震寰
-于震環
-于éžé—‡
-于風政
-于鳳æ¡
-于默奧
-于家堡
-于爾岑
-于默奧
-于è²çˆ¾
-于爾根
-于雙戈
-于里察
-于澤爾
-于斯塔德
-于斯é”爾
-于爾里克
-于奇庫æœå…‹
-于韋斯屈èŠ
-于克-蘭多縣
-于斯ç´çˆ¾æ–¯è²é‡Œ
-å¤äºŽå–¬
-涂姓
-涂å¤
-涂天相
-涂åºç‘„
-涂澤民
-涂紹煃
-涂羽å¿
-涂逢年
-涂長望
-涂謹申
-涂鴻欽
-涂壯勳
-涂醒哲
-涂善妮
-涂æ•æ†
-總è£åˆ¶
-故云
-強制作用
-鬱å—
-西米谷
-一出生
-二出生
-三出生
-四出生
-五出生
-六出生
-七出生
-八出生
-ä¹å‡ºç”Ÿ
-å出生
-一出版
-二出版
-三出版
-四出版
-五出版
-六出版
-七出版
-八出版
-ä¹å‡ºç‰ˆ
-å出版
-一出刊
-二出刊
-三出刊
-四出刊
-五出刊
-六出刊
-七出刊
-八出刊
-ä¹å‡ºåˆŠ
-å出刊
-一出逃
-二出逃
-三出逃
-四出逃
-五出逃
-六出逃
-七出逃
-八出逃
-ä¹å‡ºé€ƒ
-å出逃
-一出å£
-二出å£
-三出å£
-四出å£
-五出å£
-六出å£
-七出å£
-八出å£
-ä¹å‡ºå£
-å出å£
-一出ç¥å±±
-二出ç¥å±±
-三出ç¥å±±
-四出ç¥å±±
-五出ç¥å±±
-六出ç¥å±±
-七出ç¥å±±
-八出ç¥å±±
-ä¹å‡ºç¥å±±
-å出ç¥å±±
-鬱林
-饑è’
-å…å¾µ
-亞美尼亞曆
-百科裡
-æ­·å²è£¡
-戲裡
-作å“裡
-專輯裡
-年代裡
-棺æ裡
-注釋
-月é¢
-è·¯é¢
-ä¿®æ°æ¥·
-ä¿®æ°éºŸ
-學裡
-ç„裡
-館裡
-系列裡
-æ‘å­è£¡
-艷åŽ
-廢åŽ
-妖åŽ
-åŽæµ·ç£
-ä»™åŽ
-賈åŽ
-è³¢åŽ
-蜂åŽ
-皇åŽ
-王åŽ
-王侯åŽ
-æ¯åŽ
-æ­¦åŽ
-æ­ŒåŽ
-å½±åŽ
-å°åŽ
-太åŽ
-天åŽ
-å‘‚åŽ
-åŽé‡Œ
-åŽè¡—
-åŽç¾¿
-åŽç¨·
-åŽåº§
-åŽå¹³è·¯
-åŽå®‰è·¯
-åŽåœŸ
-åŽåŒ—è¡—
-åŽå† 
-望åŽçŸ³
-åŽè§’
-蟻åŽ
-åŽå¦ƒ
-大周åŽ
-å°å‘¨åŽ
-染殿åŽ
-准三åŽ
-風åŽ
-åŽæ¯æˆŠ
-風後,
-人如風後入江雲
-中風後
-å±é¢¨å¾Œ
-颱風後
-颳風後
-整風後
-打風後
-é‡é¢¨å¾Œ
-èžé¢¨å¾Œ
-逆風後
-順風後
-大風後
-馬格里布
-伊里布
-劃入
-中庄å­
-埔è£ç¤¾æ’«å¢¾å±€
-懸掛
-僱傭
-å››æ¨å…­å…¥
-宿èˆ
-會干擾
-代表
-高清愿
-瓷製
-竹製
-絲製
-莜麵
-劃入
-ç°¡ç­‘ç¿Ž
-楊雅筑
-é­”æ°åº§
-æ°å¨çˆ¾éŸ³æ¨‚
-彭于æ™
-尸羅精èˆ
-索馬里 # (åŠä»¥ä¸‹ï¼‰é¿å…里海=>è£æµ·çš„轉æ›
-西西里
-騰格里
-阿里
-æ‘里長
-進制
-黃詩æ°
-陳冲
-何æ°
-劉佳怜
-于å°æƒ 
-于å“æµ·
-于耘婕
-于洋
-于澄
-于光新
-范賢惠
-于國治
-于楓
-于熙ç
-涂善妮
-邱于庭
-熊æ°
-åœäº‘å‰
-黎å‰é›²
-于飛島
-代表
-水無怜奈
-å‚²éŠ # æµè§ˆå™¨å
-å¤äºŽå–¬
-è³­åŽ
-åŽæµ·ç£
-ç«‹åŽç¶œ
-甲åŽè·¯
-劉芸åŽ
-è¬è¯åŽ
-趙惠åŽ
-趙å¨åŽ
-è–åŽ
-陳有åŽ
-許虬
-網éŠ
-ç‹„å¿—æ°
-伊é©æ°
-于冠è¯
-于å°ç…™
-于雲鶴
-于忠肅集
-于å‹æ¾¤
-于和å‰
-于來山
-于樂
-于天é¾
-于謹
-于榮光
-電波é˜
-余三å‹
-掛å
-啟發å¼
-舞åŽ
-甄åŽ
-郭åŽ
-0å¹´ # å”助分詞
-1å¹´
-2å¹´
-3å¹´
-4å¹´
-5å¹´
-6å¹´
-7å¹´
-8å¹´
-9å¹´
-ï¼å¹´
-1年
-ï¼’å¹´
-3年
-4年
-5年
-ï¼–å¹´
-ï¼—å¹´
-8年
-9年
-〇年
-零年
-一年
-å…©å¹´
-二年
-三年
-四年
-五年
-å…­å¹´
-七年
-å…«å¹´
-ä¹å¹´
-åå¹´
-百年
-åƒå¹´
-è¬å¹´
-å„„å¹´
-周åŽ
-0周後
-1周後
-2周後
-3周後
-4周後
-5周後
-6周後
-7周後
-8周後
-9周後
-ï¼å‘¨å¾Œ
-1周後
-2周後
-3周後
-4周後
-5周後
-6周後
-7周後
-8周後
-9周後
-零周後
-〇周後
-一周後
-二周後
-兩周後
-三周後
-四周後
-五周後
-六周後
-七周後
-八周後
-ä¹å‘¨å¾Œ
-å周後
-百周後
-åƒå‘¨å¾Œ
-è¬å‘¨å¾Œ
-億周後
-幾周後
-多周後
-å‰å¾€
-åŽç‘žç«™
-å¸åŽè‡º
-新井里美
-樗里å­
-伊é”里å­
-濱田里佳å­
-å°ŠåŽ
-å¶å¿—ç©—
-å¶ä¸äºŒå­
-于立æˆ
-山谷é“
-æŽå¿—å–œ
-于欣
-于少ä¿
-于海
-於海邊
-於海上
-于凌辰
-于é­æ™º
-于鬯
-于仲文
-于å†æ¸…
-于震
-於震å‰
-於震åŽ
-於震中
-固定制
-毗婆尸佛
-尸棄佛
-划船
-划ä¸ä¾†
-划拳
-划槳
-划動
-划艇
-划行
-划算
-總è£åˆ¶
-æ’生
-嚴云農
-手è£åŠ
-秦莊襄王
-伊æ±æ€œ
-衛後莊公
-餘é‡
-並行
-éƒéƒé’é’
-å”防
-å°è¡¨æ ¼
-å°è¡¨ç¤º
-å°è¡¨é”
-å°è¡¨æ¼”
-å°è¡¨æ˜Ž
-了然後
-戴表元
-張樂于張å¾
-余力為
-葉å¶ç´
-万俟
-幾個
-澀谷å€
-å”調
-é¸æ‰‹
-併發症
-併發é‡ç—‡
-併發模å¼
-併發型模å¼
-金色長髮
-紅色長髮
-一頭長髮
-çš„é•·é«®
-黑色長髮
-å‰å¤©
-昨天
-今天
-明天
-後天
-數學家
-科學家
-物ç†å­¸å®¶
-化學家
-生物學家
-天文學家
-游離
-å­æ™³
-ç´…åŽå‡èªª
-書é¢
-ä¸åª
-高涌泉
-請求
-考試
-測試
-筆試
-å£è©¦
-冰冷
-王田里
-åŽå§“
-å°å·ž
-田庄英雄
-計劃
-抑制劑
diff --git a/index.php5 b/index.php5
index 2c3dc07f..b3e40b67 100644
--- a/index.php5
+++ b/index.php5
@@ -1,7 +1,7 @@
<?php
/**
* Version of index.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
*
* 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
diff --git a/languages/Language.php b/languages/Language.php
index 40d1f36c..1d2e7164 100644
--- a/languages/Language.php
+++ b/languages/Language.php
@@ -48,12 +48,13 @@ class FakeConverter {
/**
* @var Language
*/
- var $mLang;
+ public $mLang;
function __construct( $langobj ) { $this->mLang = $langobj; }
function autoConvertToAllVariants( $text ) { return array( $this->mLang->getCode() => $text ); }
function convert( $t ) { return $t; }
function convertTo( $text, $variant ) { return $text; }
function convertTitle( $t ) { return $t->getPrefixedText(); }
+ function convertNamespace( $ns ) { return $this->mLang->getFormattedNsText( $ns ); }
function getVariants() { return array( $this->mLang->getCode() ); }
function getPreferredVariant() { return $this->mLang->getCode(); }
function getDefaultVariant() { return $this->mLang->getCode(); }
@@ -77,21 +78,21 @@ class Language {
/**
* @var LanguageConverter
*/
- var $mConverter;
+ public $mConverter;
- var $mVariants, $mCode, $mLoaded = false;
- var $mMagicExtensions = array(), $mMagicHookDone = false;
+ public $mVariants, $mCode, $mLoaded = false;
+ public $mMagicExtensions = array(), $mMagicHookDone = false;
private $mHtmlCode = null;
- var $dateFormatStrings = array();
- var $mExtendedSpecialPageAliases;
+ public $dateFormatStrings = array();
+ public $mExtendedSpecialPageAliases;
protected $namespaceNames, $mNamespaceIds, $namespaceAliases;
/**
* ReplacementArray object caches
*/
- var $transformData = array();
+ public $transformData = array();
/**
* @var LocalisationCache
@@ -159,10 +160,10 @@ class Language {
* @var array
*/
static public $durationIntervals = array(
- 'millennia' => 31557600000,
- 'centuries' => 3155760000,
- 'decades' => 315576000,
- 'years' => 31557600, // 86400 * 365.25
+ 'millennia' => 31556952000,
+ 'centuries' => 3155695200,
+ 'decades' => 315569520,
+ 'years' => 31556952, // 86400 * ( 365 + ( 24 * 3 + 25 ) / 400 )
'weeks' => 604800,
'days' => 86400,
'hours' => 3600,
@@ -171,19 +172,28 @@ class Language {
);
/**
- * Get a cached language object for a given language code
+ * Get a cached or new language object for a given language code
* @param $code String
* @return Language
*/
static function factory( $code ) {
- if ( !isset( self::$mLangObjCache[$code] ) ) {
- if ( count( self::$mLangObjCache ) > 10 ) {
- // Don't keep a billion objects around, that's stupid.
- self::$mLangObjCache = array();
- }
- self::$mLangObjCache[$code] = self::newFromCode( $code );
+ global $wgDummyLanguageCodes, $wgLangObjCacheSize;
+
+ if ( isset( $wgDummyLanguageCodes[$code] ) ) {
+ $code = $wgDummyLanguageCodes[$code];
}
- return self::$mLangObjCache[$code];
+
+ // get the language object to process
+ $langObj = isset( self::$mLangObjCache[$code] )
+ ? self::$mLangObjCache[$code]
+ : self::newFromCode( $code );
+
+ // merge the language object in to get it up front in the cache
+ self::$mLangObjCache = array_merge( array( $code => $langObj ), self::$mLangObjCache );
+ // get rid of the oldest ones in case we have an overflow
+ self::$mLangObjCache = array_slice( self::$mLangObjCache, 0, $wgLangObjCacheSize, true );
+
+ return $langObj;
}
/**
@@ -236,6 +246,78 @@ class Language {
}
/**
+ * Checks whether any localisation is available for that language tag
+ * in MediaWiki (MessagesXx.php exists).
+ *
+ * @param string $code Language tag (in lower case)
+ * @return bool Whether language is supported
+ * @since 1.21
+ */
+ public static function isSupportedLanguage( $code ) {
+ return $code === strtolower( $code ) && is_readable( self::getMessagesFileName( $code ) );
+ }
+
+ /**
+ * Returns true if a language code string is a well-formed language tag
+ * according to RFC 5646.
+ * This function only checks well-formedness; it doesn't check that
+ * language, script or variant codes actually exist in the repositories.
+ *
+ * Based on regexes by Mark Davis of the Unicode Consortium:
+ * http://unicode.org/repos/cldr/trunk/tools/java/org/unicode/cldr/util/data/langtagRegex.txt
+ *
+ * @param $code string
+ * @param $lenient boolean Whether to allow '_' as separator. The default is only '-'.
+ *
+ * @return bool
+ * @since 1.21
+ */
+ public static function isWellFormedLanguageTag( $code, $lenient = false ) {
+ $alpha = '[a-z]';
+ $digit = '[0-9]';
+ $alphanum = '[a-z0-9]';
+ $x = 'x' ; # private use singleton
+ $singleton = '[a-wy-z]'; # other singleton
+ $s = $lenient ? '[-_]' : '-';
+
+ $language = "$alpha{2,8}|$alpha{2,3}$s$alpha{3}";
+ $script = "$alpha{4}"; # ISO 15924
+ $region = "(?:$alpha{2}|$digit{3})"; # ISO 3166-1 alpha-2 or UN M.49
+ $variant = "(?:$alphanum{5,8}|$digit$alphanum{3})";
+ $extension = "$singleton(?:$s$alphanum{2,8})+";
+ $privateUse = "$x(?:$s$alphanum{1,8})+";
+
+ # Define certain grandfathered codes, since otherwise the regex is pretty useless.
+ # Since these are limited, this is safe even later changes to the registry --
+ # the only oddity is that it might change the type of the tag, and thus
+ # the results from the capturing groups.
+ # http://www.iana.org/assignments/language-subtag-registry
+
+ $grandfathered = "en{$s}GB{$s}oed"
+ . "|i{$s}(?:ami|bnn|default|enochian|hak|klingon|lux|mingo|navajo|pwn|tao|tay|tsu)"
+ . "|no{$s}(?:bok|nyn)"
+ . "|sgn{$s}(?:BE{$s}(?:fr|nl)|CH{$s}de)"
+ . "|zh{$s}min{$s}nan";
+
+ $variantList = "$variant(?:$s$variant)*";
+ $extensionList = "$extension(?:$s$extension)*";
+
+ $langtag = "(?:($language)"
+ . "(?:$s$script)?"
+ . "(?:$s$region)?"
+ . "(?:$s$variantList)?"
+ . "(?:$s$extensionList)?"
+ . "(?:$s$privateUse)?)";
+
+ # The final breakdown, with capturing groups for each of these components
+ # The variants, extensions, grandfathered, and private-use may have interior '-'
+
+ $root = "^(?:$langtag|$privateUse|$grandfathered)$";
+
+ return (bool)preg_match( "/$root/", strtolower( $code ) );
+ }
+
+ /**
* Returns true if a language code string is of a valid form, whether or
* not it exists. This includes codes which are used solely for
* customisation via the MediaWiki namespace.
@@ -276,7 +358,31 @@ class Language {
throw new MWException( __METHOD__ . " must be passed a string, $type given$addmsg" );
}
- return preg_match( '/^[a-z0-9-]+$/i', $code );
+ return (bool)preg_match( '/^[a-z0-9-]+$/i', $code );
+ }
+
+ /**
+ * Returns true if a language code is an IETF tag known to MediaWiki.
+ *
+ * @param $code string
+ *
+ * @since 1.21
+ * @return bool
+ */
+ public static function isKnownLanguageTag( $tag ) {
+ static $coreLanguageNames;
+
+ if ( $coreLanguageNames === null ) {
+ include( MWInit::compiledPath( 'languages/Names.php' ) );
+ }
+
+ if ( isset( $coreLanguageNames[$tag] )
+ || self::fetchLanguageName( $tag, $tag ) !== ''
+ ) {
+ return true;
+ }
+
+ return false;
}
/**
@@ -356,7 +462,7 @@ class Language {
* @deprecated in 1.19
*/
function getFallbackLanguageCode() {
- wfDeprecated( __METHOD__ );
+ wfDeprecated( __METHOD__, '1.19' );
return self::getFallbackFor( $this->mCode );
}
@@ -419,6 +525,16 @@ class Language {
*/
public function setNamespaces( array $namespaces ) {
$this->namespaceNames = $namespaces;
+ $this->mNamespaceIds = null;
+ }
+
+ /**
+ * Resets all of the namespace caches. Mainly used for testing
+ */
+ public function resetNamespaces() {
+ $this->namespaceNames = null;
+ $this->mNamespaceIds = null;
+ $this->namespaceAliases = null;
}
/**
@@ -457,9 +573,13 @@ class Language {
* getNsText() except with '_' changed to ' ', useful for
* producing output.
*
- * @param $index string
+ * <code>
+ * $mw_ns = $wgContLang->getFormattedNsText( NS_MEDIAWIKI_TALK );
+ * echo $mw_ns; // prints 'MediaWiki talk'
+ * </code>
*
- * @return array
+ * @param int $index The array key of the namespace to return
+ * @return string Namespace name without underscores (empty string if namespace does not exist)
*/
function getFormattedNsText( $index ) {
$ns = $this->getNsText( $index );
@@ -1965,7 +2085,7 @@ class Language {
$segments = array();
foreach ( $intervals as $intervalName => $intervalValue ) {
- $message = new Message( 'duration-' . $intervalName, array( $intervalValue ) );
+ $message = wfMessage( 'duration-' . $intervalName )->numParams( $intervalValue );
$segments[] = $message->inLanguage( $this )->escaped();
}
@@ -2405,19 +2525,7 @@ class Language {
if ( is_array( $s ) ) {
wfDebugDieBacktrace( 'Given array to checkTitleEncoding.' );
}
- # Check for non-UTF-8 URLs
- $ishigh = preg_match( '/[\x80-\xff]/', $s );
- if ( !$ishigh ) {
- return $s;
- }
-
- if ( function_exists( 'mb_check_encoding' ) ) {
- $isutf8 = mb_check_encoding( $s, 'UTF-8' );
- } else {
- $isutf8 = preg_match( '/^(?>[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
- '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
- }
- if ( $isutf8 ) {
+ if ( StringUtils::isUtf8( $s ) ) {
return $s;
}
@@ -2855,30 +2963,30 @@ class Language {
return "<em>$text</em>";
}
- /**
- * Normally we output all numbers in plain en_US style, that is
- * 293,291.235 for twohundredninetythreethousand-twohundredninetyone
- * point twohundredthirtyfive. However this is not suitable for all
- * languages, some such as Pakaran want ੨੯੩,੨੯੫.੨੩੫ and others such as
- * Icelandic just want to use commas instead of dots, and dots instead
- * of commas like "293.291,235".
- *
- * An example of this function being called:
- * <code>
- * wfMessage( 'message' )->numParams( $num )->text()
- * </code>
- *
- * See LanguageGu.php for the Gujarati implementation and
- * $separatorTransformTable on MessageIs.php for
- * the , => . and . => , implementation.
- *
- * @todo check if it's viable to use localeconv() for the decimal
- * separator thing.
- * @param $number Mixed: the string to be formatted, should be an integer
- * or a floating point number.
- * @param $nocommafy Bool: set to true for special numbers like dates
- * @return string
- */
+ /**
+ * Normally we output all numbers in plain en_US style, that is
+ * 293,291.235 for twohundredninetythreethousand-twohundredninetyone
+ * point twohundredthirtyfive. However this is not suitable for all
+ * languages, some such as Pakaran want ੨੯੩,੨੯੫.੨੩੫ and others such as
+ * Icelandic just want to use commas instead of dots, and dots instead
+ * of commas like "293.291,235".
+ *
+ * An example of this function being called:
+ * <code>
+ * wfMessage( 'message' )->numParams( $num )->text()
+ * </code>
+ *
+ * See LanguageGu.php for the Gujarati implementation and
+ * $separatorTransformTable on MessageIs.php for
+ * the , => . and . => , implementation.
+ *
+ * @todo check if it's viable to use localeconv() for the decimal
+ * separator thing.
+ * @param $number Mixed: the string to be formatted, should be an integer
+ * or a floating point number.
+ * @param $nocommafy Bool: set to true for special numbers like dates
+ * @return string
+ */
public function formatNum( $number, $nocommafy = false ) {
global $wgTranslateNumerals;
if ( !$nocommafy ) {
@@ -2900,6 +3008,18 @@ class Language {
}
/**
+ * Front-end for non-commafied formatNum
+ *
+ * @param mixed $number the string to be formatted, should be an integer
+ * or a floating point number.
+ * @since 1.21
+ * @return string
+ */
+ public function formatNumNoSeparators( $number ) {
+ return $this->formatNum( $number, true );
+ }
+
+ /**
* @param $number string
* @return string
*/
@@ -2921,37 +3041,37 @@ class Language {
/**
* Adds commas to a given number
* @since 1.19
- * @param $_ mixed
+ * @param $number mixed
* @return string
*/
- function commafy( $_ ) {
+ function commafy( $number ) {
$digitGroupingPattern = $this->digitGroupingPattern();
- if ( $_ === null ) {
+ if ( $number === null ) {
return '';
}
if ( !$digitGroupingPattern || $digitGroupingPattern === "###,###,###" ) {
// default grouping is at thousands, use the same for ###,###,### pattern too.
- return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $number ) ) );
} else {
// Ref: http://cldr.unicode.org/translation/number-patterns
$sign = "";
- if ( intval( $_ ) < 0 ) {
+ if ( intval( $number ) < 0 ) {
// For negative numbers apply the algorithm like positive number and add sign.
$sign = "-";
- $_ = substr( $_, 1 );
+ $number = substr( $number, 1 );
}
- $numberpart = array();
- $decimalpart = array();
+ $integerPart = array();
+ $decimalPart = array();
$numMatches = preg_match_all( "/(#+)/", $digitGroupingPattern, $matches );
- preg_match( "/\d+/", $_, $numberpart );
- preg_match( "/\.\d*/", $_, $decimalpart );
- $groupedNumber = ( count( $decimalpart ) > 0 ) ? $decimalpart[0]:"";
- if ( $groupedNumber === $_ ) {
+ preg_match( "/\d+/", $number, $integerPart );
+ preg_match( "/\.\d*/", $number, $decimalPart );
+ $groupedNumber = ( count( $decimalPart ) > 0 ) ? $decimalPart[0]:"";
+ if ( $groupedNumber === $number ) {
// the string does not have any number part. Eg: .12345
return $sign . $groupedNumber;
}
- $start = $end = strlen( $numberpart[0] );
+ $start = $end = strlen( $integerPart[0] );
while ( $start > 0 ) {
$match = $matches[0][$numMatches -1] ;
$matchLen = strlen( $match );
@@ -2959,7 +3079,7 @@ class Language {
if ( $start < 0 ) {
$start = 0;
}
- $groupedNumber = substr( $_ , $start, $end -$start ) . $groupedNumber ;
+ $groupedNumber = substr( $number, $start, $end -$start ) . $groupedNumber ;
$end = $start;
if ( $numMatches > 1 ) {
// use the last pattern for the rest of the number
@@ -2972,6 +3092,7 @@ class Language {
return $sign . $groupedNumber;
}
}
+
/**
* @return String
*/
@@ -3003,25 +3124,26 @@ class Language {
* @return string
*/
function listToText( array $l ) {
- $s = '';
$m = count( $l ) - 1;
-
- if ( $m === 0 ) {
- return $l[0];
- } elseif ( $m === 1 ) {
- return $l[0] . $this->getMessageFromDB( 'and' ) . $this->getMessageFromDB( 'word-separator' ) . $l[1];
- } else {
- for ( $i = $m; $i >= 0; $i-- ) {
- if ( $i == $m ) {
- $s = $l[$i];
- } elseif ( $i == $m - 1 ) {
- $s = $l[$i] . $this->getMessageFromDB( 'and' ) . $this->getMessageFromDB( 'word-separator' ) . $s;
- } else {
- $s = $l[$i] . $this->getMessageFromDB( 'comma-separator' ) . $s;
- }
+ if ( $m < 0 ) {
+ return '';
+ }
+ if ( $m > 0 ) {
+ $and = $this->getMessageFromDB( 'and' );
+ $space = $this->getMessageFromDB( 'word-separator' );
+ if ( $m > 1 ) {
+ $comma = $this->getMessageFromDB( 'comma-separator' );
+ }
+ }
+ $s = $l[$m];
+ for ( $i = $m - 1; $i >= 0; $i-- ) {
+ if ( $i == $m - 1 ) {
+ $s = $l[$i] . $and . $space . $s;
+ } else {
+ $s = $l[$i] . $comma . $s;
}
- return $s;
}
+ return $s;
}
/**
@@ -3409,6 +3531,19 @@ class Language {
if ( !count( $forms ) ) {
return '';
}
+
+ // Handle explicit n=pluralform cases
+ foreach ( $forms as $index => $form ) {
+ if ( preg_match( '/\d+=/i', $form ) ) {
+ $pos = strpos( $form, '=' );
+ if ( substr( $form, 0, $pos ) === (string) $count ) {
+ return substr( $form, $pos + 1 );
+ }
+ unset( $forms[$index] );
+ }
+ }
+ $forms = array_values( $forms );
+
$pluralForm = $this->getPluralForm( $count );
$pluralForm = min( $pluralForm, count( $forms ) - 1 );
return $forms[$pluralForm];
@@ -3459,8 +3594,22 @@ class Language {
}
}
}
- // If all else fails, return the original string.
- return $str;
+
+ // If all else fails, return a standard duration or timestamp description.
+ $time = strtotime( $str, 0 );
+ if ( $time === false ) { // Unknown format. Return it as-is in case.
+ return $str;
+ } elseif ( $time !== strtotime( $str, 1 ) ) { // It's a relative timestamp.
+ // $time is relative to 0 so it's a duration length.
+ return $this->formatDuration( $time );
+ } else { // It's an absolute timestamp.
+ if ( $time === 0 ) {
+ // wfTimestamp() handles 0 as current time instead of epoch.
+ return $this->timeanddate( '19700101000000' );
+ } else {
+ return $this->timeanddate( $time );
+ }
+ }
}
/**
@@ -3525,12 +3674,22 @@ class Language {
}
/**
+ * Convert a namespace index to a string in the preferred variant
+ *
+ * @param $ns int
+ * @return string
+ */
+ public function convertNamespace( $ns ) {
+ return $this->mConverter->convertNamespace( $ns );
+ }
+
+ /**
* Check if this is a language with variants
*
* @return bool
*/
public function hasVariants() {
- return sizeof( $this->getVariants() ) > 1;
+ return count( $this->getVariants() ) > 1;
}
/**
@@ -3657,15 +3816,24 @@ class Language {
}
/**
- * Enclose a string with the "no conversion" tag. This is used by
- * various functions in the Parser
+ * Prepare external link text for conversion. When the text is
+ * a URL, it shouldn't be converted, and it'll be wrapped in
+ * the "raw" tag (-{R| }-) to prevent conversion.
+ *
+ * This function is called "markNoConversion" for historical
+ * reasons.
*
- * @param $text String: text to be tagged for no conversion
- * @param $noParse bool
+ * @param $text String: text to be used for external link
+ * @param $noParse bool: wrap it without confirming it's a real URL first
* @return string the tagged text
*/
public function markNoConversion( $text, $noParse = false ) {
- return $this->mConverter->markNoConversion( $text, $noParse );
+ // Excluding protocal-relative URLs may avoid many false positives.
+ if ( $noParse || preg_match( '/^(?:' . wfUrlProtocolsWithoutProtRel() . ')/', $text ) ) {
+ return $this->mConverter->markNoConversion( $text );
+ } else {
+ return $text;
+ }
}
/**
@@ -4229,5 +4397,4 @@ class Language {
$form = CLDRPluralRuleEvaluator::evaluateCompiled( $number, $pluralRules );
return $form;
}
-
}
diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php
index 8b7d6cbe..43afe653 100644
--- a/languages/LanguageConverter.php
+++ b/languages/LanguageConverter.php
@@ -47,28 +47,28 @@ class LanguageConverter {
'zh',
);
- var $mMainLanguageCode;
- var $mVariants, $mVariantFallbacks, $mVariantNames;
- var $mTablesLoaded = false;
- var $mTables;
+ public $mMainLanguageCode;
+ public $mVariants, $mVariantFallbacks, $mVariantNames;
+ public $mTablesLoaded = false;
+ public $mTables;
// 'bidirectional' 'unidirectional' 'disable' for each variant
- var $mManualLevel;
+ public $mManualLevel;
/**
* @var String: memcached key name
*/
- var $mCacheKey;
-
- var $mLangObj;
- var $mFlags;
- var $mDescCodeSep = ':', $mDescVarSep = ';';
- var $mUcfirst = false;
- var $mConvRuleTitle = false;
- var $mURLVariant;
- var $mUserVariant;
- var $mHeaderVariant;
- var $mMaxDepth = 10;
- var $mVarSeparatorPattern;
+ public $mCacheKey;
+
+ public $mLangObj;
+ public $mFlags;
+ public $mDescCodeSep = ':', $mDescVarSep = ';';
+ public $mUcfirst = false;
+ public $mConvRuleTitle = false;
+ public $mURLVariant;
+ public $mUserVariant;
+ public $mHeaderVariant;
+ public $mMaxDepth = 10;
+ public $mVarSeparatorPattern;
const CACHE_VERSION_KEY = 'VERSION 6';
@@ -184,7 +184,7 @@ class LanguageConverter {
/**
* Get default variant.
- * This function would not be affected by user's settings or headers
+ * This function would not be affected by user's settings
* @return String: the default variant code
*/
public function getDefaultVariant() {
@@ -192,6 +192,10 @@ class LanguageConverter {
$req = $this->getURLVariant();
+ if ( !$req ) {
+ $req = $this->getHeaderVariant();
+ }
+
if ( $wgDefaultLanguageVariant && !$req ) {
$req = $this->validateVariant( $wgDefaultLanguageVariant );
}
@@ -406,7 +410,7 @@ class LanguageConverter {
$attr = $attrs[$attrName];
// Don't convert URLs
if ( !strpos( $attr, '://' ) ) {
- $attr = $this->translate( $attr, $toVariant );
+ $attr = $this->recursiveConvertTopLevel( $attr, $toVariant );
}
// Remove HTML tags to avoid disrupting the layout
@@ -546,24 +550,41 @@ class LanguageConverter {
public function convertTitle( $title ) {
$variant = $this->getPreferredVariant();
$index = $title->getNamespace();
- if ( $index === NS_MAIN ) {
+ if ( $index !== NS_MAIN ) {
+ $text = $this->convertNamespace( $index ) . ':';
+ } else {
$text = '';
+ }
+ $text .= $this->translate( $title->getText(), $variant );
+ return $text;
+ }
+
+ /**
+ * Get the namespace display name in the preferred variant.
+ *
+ * @param $index int namespace id
+ * @return String: namespace name for display
+ */
+ public function convertNamespace( $index ) {
+ $variant = $this->getPreferredVariant();
+ if ( $index === NS_MAIN ) {
+ return '';
} else {
- // first let's check if a message has given us a converted name
+ // First check if a message gives a converted name in the target variant.
+ $nsConvMsg = wfMessage( 'conversion-ns' . $index )->inLanguage( $variant );
+ if ( $nsConvMsg->exists() ) {
+ return $nsConvMsg->plain();
+ }
+ // Then check if a message gives a converted name in content language
+ // which needs extra translation to the target variant.
$nsConvMsg = wfMessage( 'conversion-ns' . $index )->inContentLanguage();
if ( $nsConvMsg->exists() ) {
- $text = $nsConvMsg->plain();
- } else {
- // the message does not exist, try retrieve it from the current
- // variant's namespace names.
- $langObj = $this->mLangObj->factory( $variant );
- $text = $langObj->getFormattedNsText( $index );
+ return $this->translate( $nsConvMsg->plain(), $variant );
}
- $text .= ':';
+ // No message exists, retrieve it from the target variant's namespace names.
+ $langObj = $this->mLangObj->factory( $variant );
+ return $langObj->getFormattedNsText( $index );
}
- $text .= $title->getText();
- $text = $this->translate( $text, $variant );
- return $text;
}
/**
@@ -597,6 +618,8 @@ class LanguageConverter {
if ( $wgDisableLangConversion ) {
return $text;
}
+ // Reset converter state for a new converter run.
+ $this->mConvRuleTitle = false;
return $this->recursiveConvertTopLevel( $text, $variant );
}
@@ -803,9 +826,9 @@ class LanguageConverter {
/**
* Guess if a text is written in a variant. This should be implemented in subclasses.
*
- * @param string $text the text to be checked
- * @param string $variant language code of the variant to be checked for
- * @return bool true if $text appears to be written in $variant, false if not
+ * @param string $text the text to be checked
+ * @param string $variant language code of the variant to be checked for
+ * @return bool true if $text appears to be written in $variant, false if not
*
* @author Nikola Smolenski <smolensk@eunet.rs>
* @since 1.19
@@ -925,7 +948,11 @@ class LanguageConverter {
if ( $title && $title->exists() ) {
$revision = Revision::newFromTitle( $title );
if ( $revision ) {
- $txt = $revision->getRawText();
+ if ( $revision->getContentModel() == CONTENT_MODEL_WIKITEXT ) {
+ $txt = $revision->getContent( Revision::RAW )->getNativeData();
+ }
+
+ //@todo: in the future, use a specialized content model, perhaps based on json!
}
}
}
@@ -1035,9 +1062,9 @@ class LanguageConverter {
* MediaWiki:Conversiontable* is updated.
* @private
*
- * @param $article Article object
+ * @param $page WikiPage object
* @param $user Object: User object for the current user
- * @param $text String: article text (?)
+ * @param $content Content: new page content
* @param $summary String: edit summary of the edit
* @param $isMinor Boolean: was the edit marked as minor?
* @param $isWatch Boolean: did the user watch this page or not?
@@ -1046,9 +1073,9 @@ class LanguageConverter {
* @param $revision Object: new Revision object or null
* @return Boolean: true
*/
- function OnArticleSaveComplete( $article, $user, $text, $summary, $isMinor,
+ function OnPageContentSaveComplete( $page, $user, $content, $summary, $isMinor,
$isWatch, $section, $flags, $revision ) {
- $titleobj = $article->getTitle();
+ $titleobj = $page->getTitle();
if ( $titleobj->getNamespace() == NS_MEDIAWIKI ) {
$title = $titleobj->getDBkey();
$t = explode( '/', $title, 3 );
@@ -1113,17 +1140,17 @@ class LanguageConverter {
* @author fdcn <fdcn64@gmail.com>, PhiLiP <philip.npc@gmail.com>
*/
class ConverterRule {
- var $mText; // original text in -{text}-
- var $mConverter; // LanguageConverter object
- var $mRuleDisplay = '';
- var $mRuleTitle = false;
- var $mRules = '';// string : the text of the rules
- var $mRulesAction = 'none';
- var $mFlags = array();
- var $mVariantFlags = array();
- var $mConvTable = array();
- var $mBidtable = array();// array of the translation in each variant
- var $mUnidtable = array();// array of the translation in each variant
+ public $mText; // original text in -{text}-
+ public $mConverter; // LanguageConverter object
+ public $mRuleDisplay = '';
+ public $mRuleTitle = false;
+ public $mRules = '';// string : the text of the rules
+ public $mRulesAction = 'none';
+ public $mFlags = array();
+ public $mVariantFlags = array();
+ public $mConvTable = array();
+ public $mBidtable = array();// array of the translation in each variant
+ public $mUnidtable = array();// array of the translation in each variant
/**
* Constructor
@@ -1245,7 +1272,7 @@ class ConverterRule {
$bidtable[$v] = $to;
} elseif ( count( $u ) == 2 ) {
$from = trim( $u[0] );
- $v = trim( $u[1] );
+ $v = trim( $u[1] );
if ( array_key_exists( $v, $unidtable )
&& !is_array( $unidtable[$v] )
&& $to
diff --git a/languages/Names.php b/languages/Names.php
index 8f158a47..bce1663e 100644
--- a/languages/Names.php
+++ b/languages/Names.php
@@ -25,6 +25,16 @@
* These determine things like interwikis, language selectors, and so on.
* Safe to change without running scripts on the respective sites.
*
+ * \xE2\x80\x8E is the left-to-right marker and
+ * \xE2\x80\x8F is the right-to-left marker.
+ * They are required for ensuring the correct display of brackets in
+ * mixed rtl/ltr environment.
+ *
+ * Some writing systems require some line-height fixes. This includes
+ * most Indic scripts, like Devanagari.
+ * If you are adding support for such a language, add it also to
+ * the relevant section in skins/common/shared.css.
+ *
* @ingroup Language
*/
/* private */ $coreLanguageNames = array(
@@ -50,14 +60,15 @@
'avk' => 'Kotava', # Kotava
'ay' => 'Aymar aru', # Aymara
'az' => 'azərbaycanca', # Azerbaijani
+ 'azb' => 'تورکجه', # South Azerbaijani
'ba' => 'башҡортÑа', # Bashkir
'bar' => 'Boarisch', # Bavarian (Austro-Bavarian and South Tyrolean)
'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 693-3 since 2010-06-30 )
'bcc' => 'بلوچی مکرانی', # Southern Balochi
'bcl' => 'Bikol Central', # Bikol: Central Bicolano language
'be' => 'беларуÑкаÑ', # Belarusian normative
- 'be-tarask' => "\xE2\x80\xAAбеларуÑÐºÐ°Ñ (тарашкевіца)\xE2\x80\xAC", # Belarusian in Taraskievica orthography
- 'be-x-old' => "\xE2\x80\xAAбеларуÑÐºÐ°Ñ (тарашкевіца)\xE2\x80\xAC", # Belarusian in Taraskievica orthography; compat link
+ 'be-tarask' => "беларуÑÐºÐ°Ñ (тарашкевіца)\xE2\x80\x8E", # Belarusian in Taraskievica orthography
+ 'be-x-old' => "беларуÑÐºÐ°Ñ (тарашкевіца)\xE2\x80\x8E", # Belarusian in Taraskievica orthography; compat link
'bg' => 'българÑки', # Bulgarian
'bh' => 'भोजपà¥à¤°à¥€', # Bihari macro language. Falls back to Bhojpuri (bho). The name actually says "Bhojpuri".
'bho' => 'भोजपà¥à¤°à¥€', # Bhojpuri
@@ -87,8 +98,8 @@
'cps' => 'Capiceño', # Capiznon
'cr' => 'NÄ“hiyawÄ“win / á“€á¦áƒá”­ááá£', # Cree
'crh' => 'qırımtatarca', # Crimean Tatar (multiple scripts - defaults to Latin)
- 'crh-latn' => "\xE2\x80\xAAqırımtatarca (Latin)\xE2\x80\xAC", # Crimean Tatar (Latin)
- 'crh-cyrl' => "\xE2\x80\xAAкъырымтатарджа (Кирилл)\xE2\x80\xAC", # Crimean Tatar (Cyrillic)
+ 'crh-latn' => "qırımtatarca (Latin)\xE2\x80\x8E", # Crimean Tatar (Latin)
+ 'crh-cyrl' => "къырымтатарджа (Кирилл)\xE2\x80\x8E", # Crimean Tatar (Cyrillic)
'cs' => 'Äesky', # Czech
'csb' => 'kaszëbsczi', # Cassubian
'cu' => 'ÑловѣÌньÑкъ / ⰔⰎⰑⰂⰡâ°â° â°”â°â°Ÿ', # Old Church Slavonic (ancient language)
@@ -98,7 +109,7 @@
'de' => 'Deutsch', # German ("Du")
'de-at' => 'Österreichisches Deutsch', # Austrian German
'de-ch' => 'Schweizer Hochdeutsch', # Swiss Standard German
- 'de-formal' => "\xE2\x80\xAADeutsch (Sie-Form)\xE2\x80\xAC", # German - formal address ("Sie")
+ 'de-formal' => "Deutsch (Sie-Form)\xE2\x80\x8E", # German - formal address ("Sie")
'diq' => 'Zazaki', # Zazaki
'dsb' => 'dolnoserbski', # Lower Sorbian
'dtp' => 'Dusun Bundu-liwan', # Central Dusun
@@ -132,8 +143,8 @@
'ga' => 'Gaeilge', # Irish
'gag' => 'Gagauz', # Gagauz
'gan' => '贛語', # Gan (multiple scripts - defaults to Traditional)
- 'gan-hans' => "\xE2\x80\xAA赣语(简体)\xE2\x80\xAC", # Gan (Simplified Han)
- 'gan-hant' => "\xE2\x80\xAA贛語(ç¹é«”)\xE2\x80\xAC", # Gan (Traditional Han)
+ 'gan-hans' => "赣语(简体)\xE2\x80\x8E", # Gan (Simplified Han)
+ 'gan-hant' => "贛語(ç¹é«”)\xE2\x80\x8E", # Gan (Traditional Han)
'gd' => 'Gàidhlig', # Scots Gaelic
'gl' => 'galego', # Galician
'glk' => 'گیلکی', # Gilaki
@@ -143,7 +154,7 @@
'gsw' => 'Alemannisch', # Alemannic
'gu' => 'ગà«àªœàª°àª¾àª¤à«€', # Gujarati
'gv' => 'Gaelg', # Manx
- 'ha' => 'Ù‡ÙŽÙˆÙسَ', # Hausa
+ 'ha' => 'Hausa', # Hausa
'hak' => 'Hak-kâ-fa', # Hakka
'haw' => 'Hawai`i', # Hawaiian
'he' => 'עברית', # Hebrew
@@ -188,12 +199,12 @@
'kiu' => 'Kırmancki', # Kirmanjki
'kj' => 'Kwanyama', # Kwanyama
'kk' => 'қазақша', # Kazakh (multiple scripts - defaults to Cyrillic)
- 'kk-arab' => "\xE2\x80\xABقازاقشا (تٴوتە)\xE2\x80\xAC", # Kazakh Arabic
- 'kk-cyrl' => "\xE2\x80\xAAқазақша (кирил)\xE2\x80\xAC", # Kazakh Cyrillic
- 'kk-latn' => "\xE2\x80\xAAqazaqşa (latın)\xE2\x80\xAC", # Kazakh Latin
- 'kk-cn' => "\xE2\x80\xABقازاقشا (جۇنگو)\xE2\x80\xAC", # Kazakh (China)
- 'kk-kz' => "\xE2\x80\xAAқазақша (ҚазақÑтан)\xE2\x80\xAC", # Kazakh (Kazakhstan)
- 'kk-tr' => "\xE2\x80\xAAqazaqşa (Türkïya)\xE2\x80\xAC", # Kazakh (Turkey)
+ 'kk-arab' => "قازاقشا (تٴوتە)\xE2\x80\x8F", # Kazakh Arabic
+ 'kk-cyrl' => "қазақша (кирил)\xE2\x80\x8E", # Kazakh Cyrillic
+ 'kk-latn' => "qazaqşa (latın)\xE2\x80\x8E", # Kazakh Latin
+ 'kk-cn' => "قازاقشا (جۇنگو)\xE2\x80\x8F", # Kazakh (China)
+ 'kk-kz' => "қазақша (ҚазақÑтан)\xE2\x80\x8E", # Kazakh (Kazakhstan)
+ 'kk-tr' => "qazaqşa (Türkïya)\xE2\x80\x8E", # Kazakh (Turkey)
'kl' => 'kalaallisut', # Inuktitut, Greenlandic/Greenlandic/Kalaallisut (kal)
'km' => 'ភាសាážáŸ’មែរ', # Khmer, Central
'kn' => 'ಕನà³à²¨à²¡', # Kannada
@@ -209,8 +220,8 @@
'ks-deva' => 'कॉशà¥à¤°', # Kashmiri (Devanagari script)
'ksh' => 'Ripoarisch', # Ripuarian
'ku' => 'Kurdî', # Kurdish (multiple scripts - defaults to Latin)
- 'ku-latn' => "\xE2\x80\xAAKurdî (latînî)\xE2\x80\xAC", # Northern Kurdish (Latin script)
- 'ku-arab' => "\xE2\x80\xABكوردي (عەرەبی)\xE2\x80\xAC", # Northern Kurdish (Arabic script) (falls back to ckb)
+ 'ku-latn' => "Kurdî (latînî)\xE2\x80\x8E", # Northern Kurdish (Latin script)
+ 'ku-arab' => "كوردي (عەرەبی)\xE2\x80\x8F", # Northern Kurdish (Arabic script) (falls back to ckb)
'kv' => 'коми', # Komi-Zyrian (Cyrillic is common script but also written in Latin script)
'kw' => 'kernowek', # Cornish
'ky' => 'Кыргызча', # Kirghiz
@@ -259,17 +270,17 @@
'nah' => 'NÄhuatl', # Nahuatl, en:Wikipedia writes Nahuatlahtolli, while another form is Náhuatl
'nan' => 'Bân-lâm-gú', # Min-nan -- (bug 8217) nan instead of zh-min-nan, http://www.sil.org/iso639-3/codes.asp?order=639_3&letter=n
'nap' => 'Nnapulitano', # Neapolitan
- 'nb' => "\xE2\x80\xAAnorsk (bokmål)\xE2\x80\xAC", # Norwegian (Bokmal)
+ 'nb' => "norsk bokmål", # Norwegian (Bokmal)
'nds' => 'Plattdüütsch', # Low German ''or'' Low Saxon
- 'nds-nl' => 'Nedersaksisch', # Dutch Low Saxon
+ 'nds-nl' => 'Nedersaksies', # aka Nedersaksisch: Dutch Low Saxon
'ne' => 'नेपाली', # Nepali
'new' => 'नेपाल भाषा', # Newar / Nepal Bhasha
'ng' => 'Oshiwambo', # Ndonga
'niu' => 'Niuē', # Niuean
'nl' => 'Nederlands', # Dutch
- 'nl-informal' => "\xE2\x80\xAANederlands (informeel)\xE2\x80\xAC", # Dutch (informal address ("je"))
- 'nn' => "\xE2\x80\xAAnorsk (nynorsk)\xE2\x80\xAC", # Norwegian (Nynorsk)
- 'no' => "\xE2\x80\xAAnorsk (bokmål)\xE2\x80\xAC", # Norwegian (falls back to nb).
+ 'nl-informal' => "Nederlands (informeel)\xE2\x80\x8E", # Dutch (informal address ("je"))
+ 'nn' => "norsk nynorsk", # Norwegian (Nynorsk)
+ 'no' => "norsk bokmål", # Norwegian (falls back to nb).
'nov' => 'Novial', # Novial
'nrm' => 'Nouormand', # Norman
'nso' => 'Sesotho sa Leboa', # Northern Sotho
@@ -287,7 +298,7 @@
'pdc' => 'Deitsch', # Pennsylvania German
'pdt' => 'Plautdietsch', # Plautdietsch/Mennonite Low German
'pfl' => 'Pälzisch', # Palatinate German
- 'pi' => 'पाळि', # Pali
+ 'pi' => 'पालि', # Pali
'pih' => 'Norfuk / Pitkern', # Norfuk/Pitcairn/Norfolk
'pl' => 'polski', # Polish
'pms' => 'Piemontèis', # Piedmontese
@@ -342,8 +353,8 @@
'so' => 'Soomaaliga', # Somali
'sq' => 'shqip', # Albanian
'sr' => 'ÑрпÑки / srpski', # Serbian (multiple scripts - defaults to Cyrillic)
- 'sr-ec' => "\xE2\x80\xAAÑрпÑки (ћирилица)\xE2\x80\xAC", # Serbian Cyrillic ekavian
- 'sr-el' => "\xE2\x80\xAAsrpski (latinica)\xE2\x80\xAC", # Serbian Latin ekavian
+ 'sr-ec' => "ÑрпÑки (ћирилица)\xE2\x80\x8E", # Serbian Cyrillic ekavian
+ 'sr-el' => "srpski (latinica)\xE2\x80\x8E", # Serbian Latin ekavian
'srn' => 'Sranantongo', # Sranan Tongo
'ss' => 'SiSwati', # Swati
'st' => 'Sesotho', # Southern Sotho
@@ -408,15 +419,15 @@
'zea' => 'Zeêuws', # Zeeuws/Zeaws
'zh' => '中文', # (ZhÅng Wén) - Chinese
'zh-classical' => '文言', # Classical Chinese/Literary Chinese -- (see bug 8217)
- 'zh-cn' => "\xE2\x80\xAA中文(中国大陆)\xE2\x80\xAC", # Chinese (PRC)
- 'zh-hans' => "\xE2\x80\xAA中文(简体)\xE2\x80\xAC", # Mandarin Chinese (Simplified Chinese script) (cmn-hans)
- 'zh-hant' => "\xE2\x80\xAA中文(ç¹é«”)\xE2\x80\xAC", # Mandarin Chinese (Traditional Chinese script) (cmn-hant)
- 'zh-hk' => "\xE2\x80\xAA中文(香港)\xE2\x80\xAC", # Chinese (Hong Kong)
+ 'zh-cn' => "中文(中国大陆)\xE2\x80\x8E", # Chinese (PRC)
+ 'zh-hans' => "中文(简体)\xE2\x80\x8E", # Mandarin Chinese (Simplified Chinese script) (cmn-hans)
+ 'zh-hant' => "中文(ç¹é«”)\xE2\x80\x8E", # Mandarin Chinese (Traditional Chinese script) (cmn-hant)
+ 'zh-hk' => "中文(香港)\xE2\x80\x8E", # Chinese (Hong Kong)
'zh-min-nan' => 'Bân-lâm-gú', # Min-nan -- (see bug 8217)
- 'zh-mo' => "\xE2\x80\xAA中文(澳門)\xE2\x80\xAC", # Chinese (Macau)
- 'zh-my' => "\xE2\x80\xAA中文(马æ¥è¥¿äºšï¼‰\xE2\x80\xAC", # Chinese (Malaysia)
- 'zh-sg' => "\xE2\x80\xAA中文(新加å¡ï¼‰\xE2\x80\xAC", # Chinese (Singapore)
- 'zh-tw' => "\xE2\x80\xAA中文(å°ç£ï¼‰\xE2\x80\xAC", # Chinese (Taiwan)
+ 'zh-mo' => "中文(澳門)\xE2\x80\x8E", # Chinese (Macau)
+ 'zh-my' => "中文(马æ¥è¥¿äºšï¼‰\xE2\x80\x8E", # Chinese (Malaysia)
+ 'zh-sg' => "中文(新加å¡ï¼‰\xE2\x80\x8E", # Chinese (Singapore)
+ 'zh-tw' => "中文(å°ç£ï¼‰\xE2\x80\x8E", # Chinese (Taiwan)
'zh-yue' => '粵語', # Cantonese -- (see bug 8217)
'zu' => 'isiZulu' # Zulu
);
diff --git a/languages/classes/LanguageEo.php b/languages/classes/LanguageEo.php
index 3c162480..8f843224 100644
--- a/languages/classes/LanguageEo.php
+++ b/languages/classes/LanguageEo.php
@@ -63,7 +63,7 @@ class LanguageEo extends Language {
if ( strcasecmp( $in, 'x' ) == 0 && strcasecmp( $out, 'utf-8' ) == 0 ) {
return preg_replace_callback (
'/([cghjsu]x?)((?:xx)*)(?!x)/i',
- array( $this, 'strrtxuCallback' ), $string );
+ array( $this, 'strrtxuCallback' ), $string );
} elseif ( strcasecmp( $in, 'UTF-8' ) == 0 && strcasecmp( $out, 'x' ) == 0 ) {
# Double Xs only if they follow cxapelutaj literoj.
return preg_replace_callback(
diff --git a/languages/classes/LanguageFi.php b/languages/classes/LanguageFi.php
index 1865cc5c..6a2820d1 100644
--- a/languages/classes/LanguageFi.php
+++ b/languages/classes/LanguageFi.php
@@ -102,7 +102,7 @@ class LanguageFi extends Language {
'monday' => 'maanantai',
'tuesday' => 'tiistai',
'wednesday' => 'keskiviikko',
- 'thursay' => 'torstai',
+ 'thursday' => 'torstai',
'friday' => 'perjantai',
'saturday' => 'lauantai',
'sunday' => 'sunnuntai',
diff --git a/languages/classes/LanguageGan.php b/languages/classes/LanguageGan.php
index 14fe9282..0d652d43 100644
--- a/languages/classes/LanguageGan.php
+++ b/languages/classes/LanguageGan.php
@@ -67,20 +67,6 @@ class GanConverter extends LanguageConverter {
}
/**
- * there shouldn't be any latin text in Chinese conversion, so no need
- * to mark anything.
- * $noParse is there for compatibility with LanguageConvert::markNoConversion
- *
- * @param $text string
- * @param $noParse bool
- *
- * @return string
- */
- function markNoConversion( $text, $noParse = false ) {
- return $text;
- }
-
- /**
* @param $key string
* @return String
*/
@@ -116,7 +102,7 @@ class LanguageGan extends LanguageZh {
array(),
$ml );
- $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+ $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
/**
diff --git a/languages/classes/LanguageHe.php b/languages/classes/LanguageHe.php
index 48c0c057..03919886 100644
--- a/languages/classes/LanguageHe.php
+++ b/languages/classes/LanguageHe.php
@@ -49,17 +49,17 @@ class LanguageHe extends Language {
switch ( $case ) {
case 'prefixed':
case 'תחילית':
- # Duplicate the "Waw" if prefixed
- if ( substr( $word, 0, 2 ) == "ו" && substr( $word, 0, 4 ) != "וו" ) {
+ # Duplicate the "Waw" if prefixed, but not if it is already double.
+ if ( substr( $word, 0, 2 ) === "ו" && substr( $word, 0, 4 ) !== "וו" ) {
$word = "ו" . $word;
}
- # Remove the "He" if prefixed
- if ( substr( $word, 0, 2 ) == "×”" ) {
+ # Remove the "He" article if prefixed.
+ if ( substr( $word, 0, 2 ) === "×”" ) {
$word = substr( $word, 2 );
}
- # Add a hyphen (maqaf) if non-Hebrew letters
+ # Add a hyphen (maqaf) before non-Hebrew letters.
if ( substr( $word, 0, 2 ) < "×" || substr( $word, 0, 2 ) > "ת" ) {
$word = "Ö¾" . $word;
}
@@ -67,5 +67,4 @@ class LanguageHe extends Language {
return $word;
}
-
}
diff --git a/languages/classes/LanguageHy.php b/languages/classes/LanguageHy.php
index 9c155951..50798131 100644
--- a/languages/classes/LanguageHy.php
+++ b/languages/classes/LanguageHy.php
@@ -78,19 +78,6 @@ class LanguageHy extends Language {
}
/**
- * @param $count int
- * @param $forms array
- *
- * @return string
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
- $forms = $this->preConvertPlural( $forms, 2 );
-
- return ( abs( $count ) <= 1 ) ? $forms[0] : $forms[1];
- }
-
- /**
* Armenian numeric format is "12 345,67" but "1234,56"
*
* @param $_ string
diff --git a/languages/classes/LanguageIu.php b/languages/classes/LanguageIu.php
index 9bac5d73..fe5cdf8d 100644
--- a/languages/classes/LanguageIu.php
+++ b/languages/classes/LanguageIu.php
@@ -38,7 +38,7 @@ require_once( __DIR__ . '/../LanguageConverter.php' );
class IuConverter extends LanguageConverter {
protected $mDoContentConvert;
- var $mToLatin = array(
+ public $mToLatin = array(
'á¦' => 'h', 'áƒ' => 'i', 'á„' => 'ii', 'á…' => 'u', 'á†' => 'uu', 'áŠ' => 'a', 'á‹' => 'aa',
'ᑉ' => 'p', 'á±' => 'pi', 'á²' => 'pii', 'á³' => 'pu', 'á´' => 'puu', 'á¸' => 'pa', 'á¹' => 'paa',
'ᑦ' => 't', 'á‘Ž' => 'ti', 'á‘' => 'tii', 'á‘' => 'tu', 'á‘‘' => 'tuu', 'á‘•' => 'ta', 'á‘–' => 'taa',
@@ -58,7 +58,7 @@ class IuConverter extends LanguageConverter {
'á–¦' => 'É«', 'á– ' => 'É«i', 'á–¡' => 'É«ii', 'á–¢' => 'É«u', 'á–£' => 'É«uu', 'á–¤' => 'É«a', 'á–¥' => 'É«aa',
);
- var $mUpperToLowerCaseLatin = array(
+ public $mUpperToLowerCaseLatin = array(
'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e',
'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j',
'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o',
@@ -67,7 +67,7 @@ class IuConverter extends LanguageConverter {
'Z' => 'z',
);
- var $mToSyllabics = array(
+ public $mToSyllabics = array(
'h' => 'á¦', 'i' => 'áƒ', 'ii' => 'á„', 'u' => 'á…', 'uu' => 'á†', 'a' => 'áŠ', 'aa' => 'á‹',
'p' => 'ᑉ', 'pi' => 'á±', 'pii' => 'á²', 'pu' => 'á³', 'puu' => 'á´', 'pa' => 'á¸', 'paa' => 'á¹',
't' => 'ᑦ', 'ti' => 'á‘Ž', 'tii' => 'á‘', 'tu' => 'á‘', 'tuu' => 'á‘‘', 'ta' => 'á‘•', 'taa' => 'á‘–',
@@ -158,21 +158,6 @@ class IuConverter extends LanguageConverter {
}
/**
- * We want our external link captions to be converted in variants,
- * so we return the original text instead -{$text}-, except for URLs
- *
- * @param $text string
- * @param $noParse bool
- *
- * @return string
- */
- function markNoConversion( $text, $noParse = false ) {
- if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
- return parent::markNoConversion( $text );
- return $text;
- }
-
- /**
* An ugly function wrapper for parsing Image titles
* (to prevent image name conversion)
*
@@ -233,6 +218,6 @@ class LanguageIu extends Language {
$flags = array();
$this->mConverter = new IuConverter( $this, 'iu', $variants, $variantfallbacks, $flags );
- $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+ $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
}
diff --git a/languages/classes/LanguageKk.php b/languages/classes/LanguageKk.php
index d3d487fe..6dd6959f 100644
--- a/languages/classes/LanguageKk.php
+++ b/languages/classes/LanguageKk.php
@@ -391,21 +391,6 @@ class KkConverter extends LanguageConverter {
}
/**
- * We want our external link captions to be converted in variants,
- * so we return the original text instead -{$text}-, except for URLs
- *
- * @param $text string
- * @param $noParse string|bool
- *
- * @return string
- */
- function markNoConversion( $text, $noParse = false ) {
- if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
- return parent::markNoConversion( $text );
- return $text;
- }
-
- /**
* @param $key string
* @return String
*/
@@ -440,7 +425,7 @@ class LanguageKk extends LanguageKk_cyrl {
$this->mConverter = new KkConverter( $this, 'kk', $variants, $variantfallbacks );
- $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+ $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
/**
diff --git a/languages/classes/LanguageKu.php b/languages/classes/LanguageKu.php
index 02ec6482..56a52ccb 100644
--- a/languages/classes/LanguageKu.php
+++ b/languages/classes/LanguageKu.php
@@ -30,7 +30,7 @@ require_once( __DIR__ . '/LanguageKu_ku.php' );
* @ingroup Language
*/
class KuConverter extends LanguageConverter {
- var $mArabicToLatin = array(
+ public $mArabicToLatin = array(
'ب' => 'b', 'ج' => 'c', 'Ú†' => 'ç', 'د' => 'd', 'Ù' => 'f', 'Ú¯' => 'g', 'Ú¾' => 'h',
'Û' => 'h', 'Ù‡' => 'h', 'Ø­' => 'h', 'Ú˜' => 'j', 'Ùƒ' => 'k', 'Ú©' => 'k', 'Ù„' => 'l',
'م' => 'm', 'ن' => 'n', 'پ' => 'p', 'ق' => 'q', 'ر' => 'r', 'س' => 's', 'ش' => 'ş',
@@ -72,7 +72,7 @@ class KuConverter extends LanguageConverter {
'Ù©' => '9', # &#x0669;
);
- var $mLatinToArabic = array(
+ public $mLatinToArabic = array(
'b' => 'ب', 'c' => 'ج', 'ç' => 'Ú†', 'd' => 'د', 'f' => 'Ù', 'g' => 'Ú¯',
'h' => 'Ù‡', 'j' => 'Ú˜', 'k' => 'Ú©', 'l' => 'Ù„',
'm' => 'م', 'n' => 'ن', 'p' => 'پ', 'q' => 'ق', 'r' => 'ر', 's' => 'س', 'ş' => 'ش',
@@ -178,21 +178,6 @@ class KuConverter extends LanguageConverter {
}
/**
- * We want our external link captions to be converted in variants,
- * so we return the original text instead -{$text}-, except for URLs
- *
- * @param $text string
- * @param $noParse bool
- *
- * @return string
- */
- function markNoConversion( $text, $noParse = false ) {
- if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
- return parent::markNoConversion( $text );
- return $text;
- }
-
- /**
* An ugly function wrapper for parsing Image titles
* (to prevent image name conversion)
*
@@ -221,6 +206,7 @@ class KuConverter extends LanguageConverter {
* @return string
*/
function translate( $text, $toVariant ) {
+ $this->loadTables();
/* From Kazakh interface, maybe we need it later
$breaks = '[^\w\x80-\xff]';
// regexp for roman numbers
@@ -273,6 +259,6 @@ class LanguageKu extends LanguageKu_ku {
);
$this->mConverter = new KuConverter( $this, 'ku', $variants, $variantfallbacks );
- $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+ $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
}
diff --git a/languages/classes/LanguageLn.php b/languages/classes/LanguageLn.php
deleted file mode 100644
index d7329d51..00000000
--- a/languages/classes/LanguageLn.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * Lingala (Lingála) specific code.
- *
- * 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 Language
- */
-
-/**
- * Lingala (Lingála)
- *
- * @ingroup Language
- */
-class LanguageLn extends Language {
- /**
- * Use singular form for zero
- * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#ln
- *
- * @param $count int
- * @param $forms array
- *
- * @return string
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
- $forms = $this->preConvertPlural( $forms, 2 );
-
- return ( $count <= 1 ) ? $forms[0] : $forms[1];
- }
-}
diff --git a/languages/classes/LanguageLt.php b/languages/classes/LanguageLt.php
deleted file mode 100644
index ac4ebdad..00000000
--- a/languages/classes/LanguageLt.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-/**
- * Lithuanian (Lietuvių) specific code.
- *
- * 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 Language
- */
-
-/**
- * Lithuanian (Lietuvių)
- *
- * @ingroup Language
- */
-class LanguageLt extends Language {
- /* Word forms (with examples):
- 1 - vienas (1) lapas, dvidešimt vienas (21) lapas
- 2 - trys (3) lapai
- 3 - penkiolika (15) lapų
- */
-
- /**
- * Lithuanian plural forms as per http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#lt
- * @param $count int
- * @param $forms array
- *
- * @return string
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
-
- // if the number is not mentioned in message, then use $form[0] for singular and $form[1] for plural or zero
- if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
-
- $forms = $this->preConvertPlural( $forms, 3 );
- // Form[0] if n mod 10 is 1 and n mod 100 not in 11..19;
- if ( $count % 10 == 1 && $count % 100 != 11 ) return $forms[0];
- // Forms[1] if n mod 10 in 2..9 and n mod 100 not in 11..19;
- if ( $count % 10 >= 2 && ( $count % 100 < 10 || $count % 100 >= 20 ) ) return $forms[1];
- return $forms[2];
- }
-}
diff --git a/languages/classes/LanguageLv.php b/languages/classes/LanguageLv.php
deleted file mode 100644
index e76f6f93..00000000
--- a/languages/classes/LanguageLv.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * Latvian (Latviešu) specific code.
- *
- * 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 Niklas Laxström
- * @copyright Copyright © 2006, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- * @ingroup Language
- */
-
-/**
- * Latvian (Latviešu)
- *
- * @ingroup Language
- */
-class LanguageLv extends Language {
- /**
- * Plural form transformations. Using the first form for words with the last digit 1, but not for words with the last digits 11, and the second form for all the others.
- *
- * Example: {{plural:{{NUMBEROFARTICLES}}|article|articles}}
- *
- * @param $count Integer
- * @param $forms Array
- * @return String
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
-
- // @todo FIXME: CLDR defines 3 plural forms instead of 2. Form for 0 is missing.
- // http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#lv
- $forms = $this->preConvertPlural( $forms, 2 );
-
- return ( ( $count % 10 == 1 ) && ( $count % 100 != 11 ) ) ? $forms[0] : $forms[1];
- }
-}
diff --git a/languages/classes/LanguageMo.php b/languages/classes/LanguageMo.php
deleted file mode 100644
index bf8a10d0..00000000
--- a/languages/classes/LanguageMo.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * Moldavian (МолдовенÑÑкÑ) specific code.
- *
- * 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 Language
- */
-
-/**
- * Moldavian (МолдовенÑÑкÑ)
- *
- * @ingroup Language
- */
-class LanguageMo extends Language {
-
- /**
- * @param $count int
- * @param $forms array
- * @return string
- */
- function convertPlural( $count, $forms ) {
- // Plural rules per
- // http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#mo
- // Identical to Romanian (ro).
- if ( !count( $forms ) ) { return ''; }
-
- $forms = $this->preConvertPlural( $forms, 3 );
-
- if ( $count == 1 ) {
- $index = 0;
- } elseif ( $count == 0 || ( $count % 100 > 0 && $count % 100 < 20 ) ) {
- $index = 1;
- } else {
- $index = 2;
- }
- return $forms[$index];
- }
-}
diff --git a/languages/classes/LanguageQqx.php b/languages/classes/LanguageQqx.php
index 8e2115c3..9d92834d 100644
--- a/languages/classes/LanguageQqx.php
+++ b/languages/classes/LanguageQqx.php
@@ -36,6 +36,6 @@ class LanguageQqx extends Language {
* @return string
*/
function getMessage( $key ) {
- return "($key)";
+ return "($key$*)";
}
}
diff --git a/languages/classes/LanguageRo.php b/languages/classes/LanguageRo.php
deleted file mode 100644
index 0db2ec00..00000000
--- a/languages/classes/LanguageRo.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-/**
- * Romanian (Română) specific code.
- *
- * 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 Language
- */
-
-/**
- * Romanian (Română)
- *
- * @ingroup Language
- */
-class LanguageRo extends Language {
-
- /**
- * @param $count int
- * @param $forms array
- * @return string
- */
- function convertPlural( $count, $forms ) {
- // Plural rules per
- // http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#ro
- if ( !count( $forms ) ) { return ''; }
-
- $forms = $this->preConvertPlural( $forms, 3 );
-
- if ( $count == 1 ) {
- $index = 0;
- } elseif ( $count == 0 || ( $count % 100 > 0 && $count % 100 < 20 ) ) {
- $index = 1;
- } else {
- $index = 2;
- }
- return $forms[$index];
- }
-}
diff --git a/languages/classes/LanguageRu.php b/languages/classes/LanguageRu.php
index 6407e156..11b42cf9 100644
--- a/languages/classes/LanguageRu.php
+++ b/languages/classes/LanguageRu.php
@@ -44,43 +44,61 @@ class LanguageRu extends Language {
return $wgGrammarForms['ru'][$case][$word];
}
- # These rules are not perfect, but they are currently only used for site names so it doesn't
+ # These rules are not perfect, but they are currently only used for Wikimedia site names so it doesn't
# matter if they are wrong sometimes. Just add a special case for your site name if necessary.
- # join and array_slice instead mb_substr
- $ar = array();
- preg_match_all( '/./us', $word, $ar );
- if ( !preg_match( "/[a-zA-Z_]/us", $word ) )
+ # substr doesn't support Unicode and mb_substr has issues,
+ # so break it to characters using preg_match_all and then use array_slice and join
+ $chars = array();
+ preg_match_all( '/./us', $word, $chars );
+ if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
switch ( $case ) {
case 'genitive': # родительный падеж
- if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вики' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вики' ) )
- { }
- elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ь' )
- $word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'Ñ';
- elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'иÑ' )
- $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ии';
- elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ка' )
- $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ки';
- elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ти' )
- $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'тей';
- elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ды' )
- $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'дов';
- elseif ( join( '', array_slice( $ar[0], -3 ) ) == 'ник' )
- $word = join( '', array_slice( $ar[0], 0, -3 ) ) . 'ника';
+ if ( join( '', array_slice( $chars[0], -1 ) ) === 'ь' ) {
+ $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'Ñ';
+ } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'иÑ' ) {
+ $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ии';
+ } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ка' ) {
+ $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ки';
+ } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ти' ) {
+ $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'тей';
+ } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ды' ) {
+ $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'дов';
+ } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ник' ) {
+ $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'ника';
+ } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ные' ) {
+ $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'ных';
+ }
break;
- case 'dative': # дательный падеж
+ case 'dative': # дательный падеж
# stub
break;
case 'accusative': # винительный падеж
# stub
break;
- case 'instrumental': # творительный падеж
+ case 'instrumental': # творительный падеж
# stub
break;
case 'prepositional': # предложный падеж
- # stub
+ if ( join( '', array_slice( $chars[0], -1 ) ) === 'ь' ) {
+ $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'е';
+ } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'иÑ' ) {
+ $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ии';
+ } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ка' ) {
+ $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ке';
+ } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ти' ) {
+ $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'Ñ‚ÑÑ…';
+ } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ды' ) {
+ $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'дах';
+ } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ник' ) {
+ $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'нике';
+ } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ные' ) {
+ $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'ных';
+ }
break;
}
+ }
+
return $word;
}
@@ -104,28 +122,35 @@ class LanguageRu extends Language {
* @return string
*/
function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
+ if ( !count( $forms ) ) {
+ return '';
+ }
// If the actual number is not mentioned in the expression, then just two forms are enough:
- // singular for $count == 1
- // plural for $count != 1
+ // singular for $count === 1
+ // plural for $count !== 1
// For example, "This user belongs to {{PLURAL:$1|one group|several groups}}."
- if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+ if ( count( $forms ) === 2 ) {
+ return $count === 1 ? $forms[0] : $forms[1];
+ }
// @todo FIXME: CLDR defines 4 plural forms. Form with decimals missing.
// See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#ru
$forms = $this->preConvertPlural( $forms, 3 );
- if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
+ if ( $count > 10 && (int)floor( ( $count % 100 ) / 10 ) === 1 ) {
return $forms[2];
- } else {
- switch ( $count % 10 ) {
- case 1: return $forms[0];
- case 2:
- case 3:
- case 4: return $forms[1];
- default: return $forms[2];
- }
+ }
+
+ switch ( $count % 10 ) {
+ case 1:
+ return $forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return $forms[1];
+ default:
+ return $forms[2];
}
}
diff --git a/languages/classes/LanguageSe.php b/languages/classes/LanguageSe.php
deleted file mode 100644
index 25b61c30..00000000
--- a/languages/classes/LanguageSe.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * Northern Sami (Sámegiella) specific code.
- *
- * 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 Language
- */
-
-/**
- * Northern Sami (Sámegiella)
- *
- * @ingroup Language
- */
-class LanguageSe extends Language {
-
- /**
- * @param $count int
- * @param $forms array
- * @return string
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
-
- // plural forms per http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#se
- $forms = $this->preConvertPlural( $forms, 3 );
-
- if ( $count == 1 ) {
- $index = 0;
- } elseif ( $count == 2 ) {
- $index = 1;
- } else {
- $index = 2;
- }
- return $forms[$index];
- }
-}
diff --git a/languages/classes/LanguageSgs.php b/languages/classes/LanguageSgs.php
deleted file mode 100644
index 0c74e450..00000000
--- a/languages/classes/LanguageSgs.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-/**
- * Samogitian (Žemaitėška) specific code.
- *
- * 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 Niklas Laxström
- * @ingroup Language
- */
-
-/**
- * Samogitian (Žemaitėška)
- *
- * @ingroup Language
- */
-class LanguageSgs extends Language {
-
- /**
- * @param $count int
- * @param $forms array
- * @return string
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
- $forms = $this->preConvertPlural( $forms, 4 );
-
- $count = abs( $count );
- if ( $count == 0 || ( $count % 100 === 0 || ( $count % 100 >= 10 && $count % 100 < 20 ) ) ) {
- return $forms[2];
- } elseif ( $count % 10 === 1 ) {
- return $forms[0];
- } elseif ( $count % 10 === 2 ) {
- return $forms[1];
- } else {
- return $forms[3];
- }
- }
-}
diff --git a/languages/classes/LanguageShi.php b/languages/classes/LanguageShi.php
index 27c5d64f..5ddcfdef 100644
--- a/languages/classes/LanguageShi.php
+++ b/languages/classes/LanguageShi.php
@@ -39,7 +39,7 @@ class ShiConverter extends LanguageConverter {
protected $mDoContentConvert;
- var $mToLatin = array(
+ public $mToLatin = array(
'â´°' => 'a', 'â´±' => 'b', 'â´³' => 'g', 'â´·' => 'd', 'â´¹' => 'á¸', 'â´»' => 'e',
'ⴼ' => 'f', 'ⴽ' => 'k', 'ⵀ' => 'h', 'ⵃ' => 'ḥ', 'ⵄ' => 'ε', 'ⵅ' => 'x',
'ⵇ' => 'q', 'ⵉ' => 'i', 'ⵊ' => 'j', 'âµ' => 'l', 'ⵎ' => 'm', 'âµ' => 'n',
@@ -48,7 +48,7 @@ class ShiConverter extends LanguageConverter {
'ⵥ' => 'ẓ', 'ⵯ' => 'ʷ', 'ⵖ' => 'ɣ', 'ⵠ' => 'v', 'ⵒ' => 'p',
);
- var $mUpperToLowerCaseLatin = array(
+ public $mUpperToLowerCaseLatin = array(
'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e',
'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j',
'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o',
@@ -57,7 +57,7 @@ class ShiConverter extends LanguageConverter {
'Z' => 'z', 'Æ”' => 'É£',
);
- var $mToTifinagh = array(
+ public $mToTifinagh = array(
'a' => 'â´°', 'b' => 'â´±', 'g' => 'â´³', 'd' => 'â´·', 'á¸' => 'â´¹', 'e' => 'â´»',
'f' => 'ⴼ', 'k' => 'ⴽ', 'h' => 'ⵀ', 'ḥ' => 'ⵃ', 'ε' => 'ⵄ', 'x' => 'ⵅ',
'q' => 'ⵇ', 'i' => 'ⵉ', 'j' => 'ⵊ', 'l' => 'âµ', 'm' => 'ⵎ', 'n' => 'âµ',
@@ -137,21 +137,6 @@ class ShiConverter extends LanguageConverter {
}
/**
- * We want our external link captions to be converted in variants,
- * so we return the original text instead -{$text}-, except for URLs
- *
- * @param $text string
- * @param $noParse bool
- *
- * @return string
- */
- function markNoConversion( $text, $noParse = false ) {
- if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
- return parent::markNoConversion( $text );
- return $text;
- }
-
- /**
* An ugly function wrapper for parsing Image titles
* (to prevent image name conversion)
*
@@ -212,6 +197,6 @@ class LanguageShi extends Language {
$flags = array();
$this->mConverter = new ShiConverter( $this, 'shi', $variants, $variantfallbacks, $flags );
- $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+ $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
}
diff --git a/languages/classes/LanguageSma.php b/languages/classes/LanguageSma.php
deleted file mode 100644
index 19618710..00000000
--- a/languages/classes/LanguageSma.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * Southern Sami (Ã…arjelsaemien) specific code.
- *
- * 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 Language
- */
-
-/**
- * Southern Sami (Ã…arjelsaemien)
- *
- * @ingroup Language
- */
-class LanguageSma extends Language {
-
- /**
- * @param $count int
- * @param $forms array
- * @return string
- */
- function convertPlural( $count, $forms ) {
- if ( !count( $forms ) ) { return ''; }
-
- // plural forms per http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#sma
- $forms = $this->preConvertPlural( $forms, 3 );
-
- if ( $count == 1 ) {
- $index = 0;
- } elseif ( $count == 2 ) {
- $index = 1;
- } else {
- $index = 2;
- }
- return $forms[$index];
- }
-}
diff --git a/languages/classes/LanguageSr.php b/languages/classes/LanguageSr.php
index 4b799f28..55aec32e 100644
--- a/languages/classes/LanguageSr.php
+++ b/languages/classes/LanguageSr.php
@@ -35,7 +35,7 @@ require_once( __DIR__ . '/LanguageSr_el.php' );
* @ingroup Language
*/
class SrConverter extends LanguageConverter {
- var $mToLatin = array(
+ public $mToLatin = array(
'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd',
'ђ' => 'đ', 'е' => 'e', 'ж' => 'ž', 'з' => 'z', 'и' => 'i',
'ј' => 'j', 'к' => 'k', 'л' => 'l', 'љ' => 'lj', 'м' => 'm',
@@ -51,7 +51,7 @@ class SrConverter extends LanguageConverter {
'Ð¥' => 'H', 'Ц' => 'C', 'Ч' => 'ÄŒ', 'Ð' => 'Dž', 'Ш' => 'Å ',
);
- var $mToCyrillics = array(
+ public $mToCyrillics = array(
'a' => 'а', 'b' => 'б', 'c' => 'ц', 'Ä' => 'ч', 'ć' => 'Ñ›',
'd' => 'д', 'dž' => 'џ', 'đ' => 'ђ', 'e' => 'е', 'f' => 'ф',
'g' => 'г', 'h' => 'х', 'i' => 'и', 'j' => 'ј', 'k' => 'к',
@@ -129,21 +129,6 @@ class SrConverter extends LanguageConverter {
}
/**
- * We want our external link captions to be converted in variants,
- * so we return the original text instead -{$text}-, except for URLs
- *
- * @param $text string
- * @param $noParse bool
- *
- * @return string
- */
- function markNoConversion( $text, $noParse = false ) {
- if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
- return parent::markNoConversion( $text );
- return $text;
- }
-
- /**
* An ugly function wrapper for parsing Image titles
* (to prevent image name conversion)
*
@@ -182,6 +167,7 @@ class SrConverter extends LanguageConverter {
$matches = preg_split( $reg, $text, -1, PREG_SPLIT_OFFSET_CAPTURE );
$m = array_shift( $matches );
+ $this->loadTables();
if ( !isset( $this->mTables[$toVariant] ) ) {
throw new MWException( "Broken variant table: " . implode( ',', array_keys( $this->mTables ) ) );
}
@@ -246,7 +232,7 @@ class LanguageSr extends LanguageSr_ec {
'W' => 'W', 'реч' => 'W', 'reÄ' => 'W', 'ријеч' => 'W', 'rijeÄ' => 'W'
);
$this->mConverter = new SrConverter( $this, 'sr', $variants, $variantfallbacks, $flags );
- $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+ $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
/**
diff --git a/languages/classes/LanguageUz.php b/languages/classes/LanguageUz.php
index bd69e307..a2c917cd 100644
--- a/languages/classes/LanguageUz.php
+++ b/languages/classes/LanguageUz.php
@@ -27,7 +27,7 @@ require_once( __DIR__ . '/../LanguageConverter.php' );
* @ingroup Language
*/
class UzConverter extends LanguageConverter {
- var $toLatin = array(
+ public $toLatin = array(
'а' => 'a', 'Ð' => 'A',
'б' => 'b', 'Б' => 'B',
'д' => 'd', 'Д' => 'D',
@@ -65,7 +65,7 @@ class UzConverter extends LanguageConverter {
'ъ' => 'ʼ',
);
- var $toCyrillic = array(
+ public $toCyrillic = array(
'a' => 'а', 'A' => 'Ð',
'b' => 'б', 'B' => 'Б',
'd' => 'д', 'D' => 'Д',
@@ -132,6 +132,6 @@ class LanguageUz extends Language {
);
$this->mConverter = new UzConverter( $this, 'uz', $variants, $variantfallbacks );
- $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+ $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
}
diff --git a/languages/classes/LanguageZh.php b/languages/classes/LanguageZh.php
index 63f90fd9..04767f2d 100644
--- a/languages/classes/LanguageZh.php
+++ b/languages/classes/LanguageZh.php
@@ -88,20 +88,6 @@ class ZhConverter extends LanguageConverter {
}
/**
- * there shouldn't be any latin text in Chinese conversion, so no need
- * to mark anything.
- * $noParse is there for compatibility with LanguageConvert::markNoConversion
- *
- * @param $text string
- * @param $noParse bool
- *
- * @return string
- */
- function markNoConversion( $text, $noParse = false ) {
- return $text;
- }
-
- /**
* @param $key string
* @return String
*/
@@ -146,7 +132,7 @@ class LanguageZh extends LanguageZh_hans {
array(),
$ml );
- $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+ $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
}
/**
diff --git a/languages/classes/LanguageZh_hans.php b/languages/classes/LanguageZh_hans.php
index d95c42ea..04b2e16a 100644
--- a/languages/classes/LanguageZh_hans.php
+++ b/languages/classes/LanguageZh_hans.php
@@ -65,4 +65,31 @@ class LanguageZh_hans extends Language {
wfProfileOut( __METHOD__ );
return $s;
}
+
+ /**
+ * Takes a number of seconds and turns it into a text using values such as hours and minutes.
+ *
+ * @since 1.21
+ *
+ * @param integer $seconds The amount of seconds.
+ * @param array $chosenIntervals The intervals to enable.
+ *
+ * @return string
+ */
+ public function formatDuration( $seconds, array $chosenIntervals = array() ) {
+ if ( empty( $chosenIntervals ) ) {
+ $chosenIntervals = array( 'centuries', 'years', 'days', 'hours', 'minutes', 'seconds' );
+ }
+
+ $intervals = $this->getDurationIntervals( $seconds, $chosenIntervals );
+
+ $segments = array();
+
+ foreach ( $intervals as $intervalName => $intervalValue ) {
+ $message = wfMessage( 'duration-' . $intervalName )->numParams( $intervalValue );
+ $segments[] = $message->inLanguage( $this )->escaped();
+ }
+
+ return implode( '', $segments );
+ }
}
diff --git a/languages/data/plurals-mediawiki.xml b/languages/data/plurals-mediawiki.xml
index b2e72272..07e157a3 100644
--- a/languages/data/plurals-mediawiki.xml
+++ b/languages/data/plurals-mediawiki.xml
@@ -11,28 +11,26 @@
<pluralRule count="two">n mod 100 is 2</pluralRule>
<pluralRule count="few">n mod 100 in 3..4</pluralRule>
</pluralRules>
+ <!-- Copied from "be" -->
+ <pluralRules locales="be-tarask">
+ <pluralRule count="one">n mod 10 is 1 and n mod 100 is not 11</pluralRule>
+ <pluralRule count="few">n mod 10 in 2..4 and n mod 100 not in 12..14</pluralRule>
+ <pluralRule count="many">n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14</pluralRule>
+ <!-- others are fractions -->
+ </pluralRules>
<pluralRules locales="cu">
<pluralRule count="one">n mod 10 is 1</pluralRule>
<pluralRule count="two">n mod 10 is 2</pluralRule>
<pluralRule count="few">n mod 10 in 3..4</pluralRule>
</pluralRules>
- <!-- Plural form transformations
- Based on this discussion: http://translatewiki.net/wiki/Thread:Support/New_plural_rules_for_Scots_Gaelic_(gd)
- $forms[0] - 1
- $forms[1] - 2
- $forms[2] - 11
- $forms[3] - 12
- $forms[4] - 3-10, 13-19
- $forms[5] - 0, 20, rest -->
- <pluralRules locales="gd">
- <pluralRule count="one">n is 1</pluralRule>
- <pluralRule count="two">n is 2</pluralRule>
- <pluralRule count="elevan">n is 11</pluralRule>
- <pluralRule count="twelve">n is 12</pluralRule>
- <pluralRule count="few">n in 3..10 or n in 13..19</pluralRule>
+ <!-- Copied from "bh" -->
+ <pluralRules locales="bho">
+ <pluralRule count="one">n in 0..1</pluralRule>
</pluralRules>
- <pluralRules locales="vi">
- <pluralRule count="one">n is 1</pluralRule>
+ <pluralRules locales="sgs">
+ <pluralRule count="one">n mod 10 is 1 and n mod 100 is not 11</pluralRule>
+ <pluralRule count="two">n mod 10 is 2 and n mod 100 is not 12</pluralRule>
+ <pluralRule count="few">n is 0 or n mod 100 is 0 or n mod 100 in 10..19</pluralRule>
</pluralRules>
</plurals>
</supplementalData>
diff --git a/languages/data/plurals.xml b/languages/data/plurals.xml
index 8432df44..d1a403dc 100644
--- a/languages/data/plurals.xml
+++ b/languages/data/plurals.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE supplementalData SYSTEM "../../common/dtd/ldmlSupplemental.dtd">
<supplementalData>
- <version number="$Revision: 6155 $"/>
- <generation date="$Date: 2011-09-21 23:51:12 +0530 (à´¬àµ, 21 സെപൠ2011) $"/>
+ <version number="$Revision: 8007 $"/>
+ <generation date="$Date: 2013-01-03 07:17:41 +0530 (Thu, 03 Jan 2013) $"/>
<plurals>
<!-- if locale is known to have no plurals, there are no rules -->
- <pluralRules locales="az bm bo dz fa id ig ii hu ja jv ka kde kea km kn ko lo ms my sah ses sg th to tr vi wo yo zh"/>
+ <pluralRules locales="az bm bo dz fa id ig ii hu ja jv ka kde kea km kn ko lo ms my sah ses sg th to tr vi wo yo zh"/>
<pluralRules locales="ar">
<pluralRule count="zero">n is 0</pluralRule>
<pluralRule count="one">n is 1</pluralRule>
@@ -13,7 +13,12 @@
<pluralRule count="few">n mod 100 in 3..10</pluralRule>
<pluralRule count="many">n mod 100 in 11..99</pluralRule>
</pluralRules>
- <pluralRules locales="asa af bem bez bg bn brx ca cgg chr da de dv ee el en eo es et eu fi fo fur fy gl gsw gu ha haw he is it jmc kaj kcg kk kl ksb ku lb lg mas ml mn mr nah nb nd ne nl nn no nr ny nyn om or pa pap ps pt rof rm rwk saq seh sn so sq ss ssy st sv sw syr ta te teo tig tk tn ts ur wae ve vun xh xog zu">
+ <pluralRules locales="he">
+ <pluralRule count="one">n is 1</pluralRule>
+ <pluralRule count="two">n is 2</pluralRule>
+ <pluralRule count="many">n is not 0 AND n mod 10 is 0</pluralRule>
+ </pluralRules>
+ <pluralRules locales="asa ast af bem bez bg bn brx ca cgg chr ckb da de dv ee el en eo es et eu fi fo fur fy gl gsw gu ha haw hy is it jgo jmc kaj kcg kk kkj kl ks ksb ku ky lb lg mas mgo ml mn mr nah nb nd ne nl nn nnh no nr ny nyn om or os pa pap ps pt rof rm rwk saq seh sn so sq ss ssy st sv sw syr ta te teo tig tk tn ts ur vo wae ve vun xh xog zu">
<pluralRule count="one">n is 1</pluralRule>
</pluralRules>
<pluralRules locales="ak am bh fil tl guw hi ln mg nso ti wa">
@@ -93,7 +98,7 @@
<pluralRule count="one">n mod 10 is 1 and n mod 100 not in 11,71,91</pluralRule>
<pluralRule count="two">n mod 10 is 2 and n mod 100 not in 12,72,92</pluralRule>
<pluralRule count="few">n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99</pluralRule>
- <pluralRule count="many">n mod 1000000 is 0 and n is not 0</pluralRule>
+ <pluralRule count="many">n is not 0 and n mod 1000000 is 0</pluralRule>
</pluralRules>
<pluralRules locales="ksh">
<pluralRule count="zero">n is 0</pluralRule>
diff --git a/languages/messages/MessagesAce.php b/languages/messages/MessagesAce.php
index 1e757d2d..f47d7e9a 100644
--- a/languages/messages/MessagesAce.php
+++ b/languages/messages/MessagesAce.php
@@ -26,8 +26,8 @@ $namespaceNames = array(
NS_PROJECT_TALK => 'Marit_$1',
NS_FILE => 'Beureukaih',
NS_FILE_TALK => 'Marit_Beureukaih',
- NS_MEDIAWIKI => 'AlatWiki',
- NS_MEDIAWIKI_TALK => 'Marit_AlatWiki',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'Marit_MediaWiki',
NS_TEMPLATE => 'Pola',
NS_TEMPLATE_TALK => 'Marit_Pola',
NS_HELP => 'Beunantu',
@@ -38,28 +38,30 @@ $namespaceNames = array(
$namespaceAliases = array(
'Istimewa' => NS_SPECIAL,
+ 'Bicara' => NS_TALK,
'Pembicaraan' => NS_TALK,
'Pengguna' => NS_USER,
+ 'Bicara_Pengguna' => NS_USER_TALK,
'Pembicaraan_Pengguna' => NS_USER_TALK,
'Pembicaraan_$1' => NS_PROJECT_TALK,
'Berkas' => NS_FILE,
+ 'Gambar' => NS_FILE,
'Pembicaraan_Berkas' => NS_FILE_TALK,
+ 'Pembicaraan_Gambar' => NS_FILE_TALK,
+ 'AlatWiki' => NS_MEDIAWIKI,
+ 'Marit_AlatWiki' => NS_MEDIAWIKI_TALK,
'Pembicaraan_MediaWiki' => NS_MEDIAWIKI_TALK,
+ 'MediaWiki_Pembicaraan' => NS_MEDIAWIKI_TALK,
'Templat' => NS_TEMPLATE,
'Pembicaraan_Templat' => NS_TEMPLATE_TALK,
+ 'Templat_Pembicaraan' => NS_TEMPLATE_TALK,
'Bantuan' => NS_HELP,
+ 'Bantuan_Pembicaraan' => NS_HELP_TALK,
'Pembicaraan_Bantuan' => NS_HELP_TALK,
'Kategori' => NS_CATEGORY,
+ 'Kategori_Pembicaraan' => NS_CATEGORY_TALK,
'Pembicaraan_Kategori' => NS_CATEGORY_TALK,
'Gambar_Pembicaraan' => NS_FILE_TALK,
- 'MediaWiki_Pembicaraan' => NS_MEDIAWIKI_TALK,
- 'Templat_Pembicaraan' => NS_TEMPLATE_TALK,
- 'Bantuan_Pembicaraan' => NS_HELP_TALK,
- 'Kategori_Pembicaraan' => NS_CATEGORY_TALK,
- 'Gambar' => NS_FILE,
- 'Pembicaraan_Gambar' => NS_FILE_TALK,
- 'Bicara' => NS_TALK,
- 'Bicara_Pengguna' => NS_USER_TALK,
);
$specialPageAliases = array(
@@ -290,6 +292,7 @@ $messages = array(
'newwindow' => '(peuhah bak tingkap barô)',
'cancel' => 'Peubateuë',
'moredotdotdot' => 'Lom...',
+'morenotlisted' => 'Lom...',
'mypage' => 'Ôn',
'mytalk' => 'Marit',
'anontalk' => 'Peugah haba IP nyoë.',
@@ -301,7 +304,6 @@ $messages = array(
'qbbrowse' => 'Lop',
'qbedit' => 'Andam',
'qbpageoptions' => 'Ôn nyoe',
-'qbpageinfo' => 'Asoe ôn',
'qbmyoptions' => 'Ôn lôn',
'qbspecialpages' => 'Ôn kusuih',
'faq' => 'FAQ',
@@ -324,6 +326,7 @@ $messages = array(
'namespaces' => 'Ruweuëng nan',
'variants' => 'Ragam',
+'navigation-heading' => 'Menu navigasi',
'errorpagetitle' => 'Seunalah',
'returnto' => 'Gisa u $1.',
'tagline' => 'Nibak {{SITENAME}}',
@@ -532,9 +535,6 @@ Neuci lom lam padum minet.',
'viewsourcetext' => 'Droëneuh jeuët neu’eu',
# Login and logout pages
-'welcomecreation' => '== Seulamat trok teuka, $1! ==
-
-Nan Droeneuh ka teupeugot. Neuato laju [[Special:Preferences|peue nyang neugalak {{SITENAME}}]].',
'yourname' => 'Ureuëng nguy:',
'yourpassword' => 'Lageuëm:',
'yourpasswordagain' => 'Pasoë lom lageuëm:',
@@ -758,6 +758,9 @@ Surat-e droeneuh h'an geupeugah keu ureueng nyan.",
'grouppage-sysop' => '{{ns:project}}:Ureuëng urôh',
+# Special:Log/newusers
+'newuserlogpage' => 'ureuëng nguy barô',
+
# User rights log
'rightslog' => 'Log neuubah hak peuhah',
@@ -933,9 +936,6 @@ Teuneurang bak [$2 on teuneurangjih] geupeuleumah di yup nyoe.",
'linksearch-ok' => 'Mita',
'linksearch-line' => '$1 meusambat nibak $2',
-# Special:Log/newusers
-'newuserlogpage' => 'ureuëng nguy barô',
-
# Special:ListGroupRights
'listgrouprights-members' => '(dapeuta anggèëta)',
@@ -1012,7 +1012,7 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
'blanknamespace' => '(Keuë)',
# Contributions
-'contributions' => 'Peuneugöt',
+'contributions' => 'Peuneugöt {{GENDER:$1|ureuëng nguy}}',
'contributions-title' => 'Peuneugöt ureuëng nguy keu $1',
'mycontris' => 'Peuneugöt',
'contribsub2' => 'Keu $1 ($2)',
diff --git a/languages/messages/MessagesAeb.php b/languages/messages/MessagesAeb.php
index 624b824e..dd485ef4 100644
--- a/languages/messages/MessagesAeb.php
+++ b/languages/messages/MessagesAeb.php
@@ -11,6 +11,10 @@
* @author Csisc
*/
+$fallback = 'ar';
+
+$rtl = true;
+
$messages = array(
# User preference toggles
'tog-underline' => 'ضع خطا تحت الوصلات:',
@@ -156,7 +160,6 @@ $messages = array(
'qbbrowse' => 'ara',
'qbedit' => 'modifi el page (baddelha)',
'qbpageoptions' => 'هذه الصÙحة',
-'qbpageinfo' => 'سياق النص',
'qbmyoptions' => 'صÙحاتي',
'qbspecialpages' => 'الصÙحات الخاصة',
'faq' => 'الأسئلة الأكثر تكرارا',
@@ -417,11 +420,8 @@ $2',
# Login and logout pages
'logouttext' => "'''أنت الآن غير مسجل الدخول.'''
-تستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو [[Special:UserLogin|الدخول مرة أخرى]] بنÙس الاسم أو باسم آخر.
+تستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو <span class='plainlinks'>[$1 الدخول مرة أخرى]</span> بنÙس الاسم أو باسم آخر.
من الممكن أن ترى بعض الصÙحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإÙراغ الصÙحات المختزنة ÙÙŠ المتصÙØ­ لديك.",
-'welcomecreation' => '== مرحبا، $1! ==
-تم إنشاء حسابك.
-لا تنس أن تغير [[Special:Preferences|تÙضيلاتك ÙÙŠ {{SITENAME}}]].',
'yourname' => 'اسم المستخدم:',
'yourpassword' => 'كلمة السر:',
'yourpasswordagain' => 'أعد كتابة كلمة السر:',
@@ -764,7 +764,6 @@ $2
'template-protected' => '(حماية كاملة)',
'template-semiprotected' => '(حماية جزئية)',
'hiddencategories' => '{{PLURAL:$1|هذه الصÙحة غير موجودة ÙÙŠ أي تصناي٠مخÙية|هذه الصÙحة موجودة ÙÙŠ تصني٠مخÙÙŠ واحد|هذه الصÙحة موجودة ÙÙŠ تصنيÙين مخÙيين|هذه الصÙحة موجودة ÙÙŠ $1 تصاني٠مخÙية|هذه الصÙحة موجودة ÙÙŠ $1 تصنيÙا مخÙيا|هذه الصÙحة موجودة ÙÙŠ $1 تصني٠مخÙÙŠ}}:',
-'nocreatetitle' => 'تم تحديد إنشاء الصÙحات',
'nocreatetext' => 'قام {{SITENAME}} بتحديد القدرة على إنشاء صÙحات جديدة.
يمكنك العودة وتحرير صÙحة موجودة بالÙعل، أو [[Special:UserLogin|الدخول أو تسجيل حساب]].',
'nocreate-loggedin' => 'أنت لا تمتلك الصلاحية لإنشاء صÙحات جديدة.',
@@ -1040,6 +1039,9 @@ $1",
'prefs-help-email' => 'عنوان البريد الإلكتروني هو أمر اختياري، ولكن ستحتاج لإعادة تعيين كلمة المرور، إن نسيت كلمة المرور الخاصة بك.',
'prefs-help-email-others' => 'يمكنك أيضا اختيار للسماح للآخرين الاتصال بك عن طريق صÙحة المستخدم أو نقاش المستخدم الخاص بك دون الحاجة إلى الكش٠عن الهوية الخاصة بك.',
+# Special:Log/newusers
+'newuserlogpage' => 'سجل إنشاء المستخدمين',
+
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'modifi hal page',
@@ -1148,9 +1150,6 @@ $1",
# Special:LinkSearch
'linksearch-line' => '$1 موصولة من $2',
-# Special:Log/newusers
-'newuserlogpage' => 'سجل إنشاء المستخدمين',
-
# Special:ListGroupRights
'listgrouprights-members' => '(قائمة الأعضاء)',
diff --git a/languages/messages/MessagesAf.php b/languages/messages/MessagesAf.php
index 6d1c9b53..e3793d11 100644
--- a/languages/messages/MessagesAf.php
+++ b/languages/messages/MessagesAf.php
@@ -54,7 +54,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__DWINGIO__', '__FORCETOC__' ),
'toc' => array( '0', '__IO__', '__TOC__' ),
'noeditsection' => array( '0', '__GEENNUWEAFDELING__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__GEENOPSKRIF__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'HUIDIGEMAAND', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'HUIDIGEMAAND1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
@@ -341,6 +340,7 @@ $messages = array(
'newwindow' => '(verskyn in nuwe venster)',
'cancel' => 'Kanselleer',
'moredotdotdot' => 'Meer…',
+'morenotlisted' => 'Meer nie gelys nie...',
'mypage' => 'Gebruikersblad',
'mytalk' => 'Bespreking',
'anontalk' => 'Besprekingsblad vir hierdie IP',
@@ -352,7 +352,6 @@ $messages = array(
'qbbrowse' => 'Snuffel',
'qbedit' => 'Wysig',
'qbpageoptions' => 'Bladsyopsies',
-'qbpageinfo' => 'Bladsyinligting',
'qbmyoptions' => 'My bladsye',
'qbspecialpages' => 'Spesiale bladsye',
'faq' => 'Gewilde vrae',
@@ -375,6 +374,7 @@ $messages = array(
'namespaces' => 'Naamruimtes',
'variants' => 'Variante',
+'navigation-heading' => 'Navigasie-keuseskerm',
'errorpagetitle' => 'Fout',
'returnto' => 'Keer terug na $1.',
'tagline' => 'in {{SITENAME}}',
@@ -615,11 +615,11 @@ Die rede hiervoor is "\'\'$3\'\'".',
# Login and logout pages
'logouttext' => "'''U is nou uitgeteken'''
-U kan aanhou om {{SITENAME}} anoniem te gebruik; of u kan weer [[Special:UserLogin|inteken]] as dieselfde of 'n ander gebruiker.
+U kan aanhou om {{SITENAME}} anoniem te gebruik; of u kan weer <span class='plainlinks'>[$1 inteken]</span> as dieselfde of 'n ander gebruiker.
Dit is moontlik dat sommige bladsye nog sal aandui dat u aangeteken is totdat u u webblaaier se kas skoonmaak.",
-'welcomecreation' => '== Welkom, $1! ==
-U rekening is geskep;
-moenie vergeet om u [[Special:Preferences|persoonlike voorkeure vir {{SITENAME}}]] te stel nie.',
+'welcomeuser' => 'Welkom, $1!',
+'welcomecreation-msg' => 'U gebruiker is geskep.
+Moenie vergeet om u [[Special:Preferences|voorkeure vir {{SITENAME}}]] te stel nie.',
'yourname' => 'Gebruikersnaam:',
'yourpassword' => 'Wagwoord:',
'yourpasswordagain' => 'Herhaal wagwoord',
@@ -642,7 +642,7 @@ moenie vergeet om u [[Special:Preferences|persoonlike voorkeure vir {{SITENAME}}
'gotaccount' => "Het u reeds 'n rekening? $1.",
'gotaccountlink' => 'Meld aan',
'userlogin-resetlink' => 'U aanmeld besonderhede vergeet?',
-'createaccountmail' => 'deur e-pos',
+'createaccountmail' => "Gebruik 'n tydelike lukrake wagwoord en stuur dit na die e-posadres hier onder",
'createaccountreason' => 'Rede:',
'badretype' => 'Die ingetikte wagwoorde is nie dieselfde nie.',
'userexists' => "Die gebruikersnaam wat u gekies het is beset.
@@ -713,6 +713,7 @@ Wag asseblief alvorens u weer probeer.",
# Email sending
'php-mail-error-unknown' => 'Onbekende fout in PHP se mail()-funksie',
'user-mail-no-addy' => "Geprobeer om e-pos te stuur sonder 'n e-posadres.",
+'user-mail-no-body' => "Daar is probeer om 'n leë of 'n onredelike kort boodskap te stuur.",
# Change password dialog
'resetpass' => 'Verander wagwoord',
@@ -773,6 +774,7 @@ Tydelike wagwoord: $2',
'changeemail-oldemail' => 'Huidige e-posadres:',
'changeemail-newemail' => 'Nuwe e-posadres:',
'changeemail-none' => '(geen)',
+'changeemail-password' => 'U wagwoord vir {{SITENAME}}:',
'changeemail-submit' => 'Wysig E-posadres',
'changeemail-cancel' => 'Kanselleer',
@@ -951,7 +953,6 @@ Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
'template-semiprotected' => '(half-beskerm)',
'hiddencategories' => "Hierdie bladsy is 'n lid van {{PLURAL:$1|1 versteekte kategorie|$1 versteekte kategorië}}:",
'edittools' => '<!-- Die teks hier sal onderaan wysiging- en oplaaivorms vertoon word. -->',
-'nocreatetitle' => 'Bladsy skepping beperk',
'nocreatetext' => '{{SITENAME}} het die skep van nuwe bladsye beperk.
U kan slegs bestaande bladsye wysig, of u kan [[Special:UserLogin|aanteken of registreer]].',
'nocreate-loggedin' => 'U het nie regte om nuwe blaaie te skep nie.',
@@ -976,6 +977,15 @@ Dit lyk of dit verwyder is.',
'edit-already-exists' => 'Die bladsy is nie geskep nie.
Dit bestaan alreeds.',
'defaultmessagetext' => 'Verstekteks',
+'content-failed-to-parse' => 'Dit was nie moontlik om die inhoud van die MIME-tipe $2 vir die model $1 te verwerk nie: $3.',
+'invalid-content-data' => 'Ongeldige inhoud',
+'content-not-allowed-here' => '"$1" word nie op bladsy [[$2]] toegelaat nie.',
+
+# Content models
+'content-model-wikitext' => 'Wikiteks',
+'content-model-text' => 'eenvoudige teks',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Waarskuwing: Die bladsy gebruik te veel duur ontlederfunksies.
@@ -1342,9 +1352,9 @@ Die aksie kan nie ongedaan gemaak word nie.',
'prefs-emailconfirm-label' => 'E-posbevestiging:',
'prefs-textboxsize' => 'Afmetings van die wysigingsvenster',
'youremail' => 'E-posadres:',
-'username' => 'Gebruikersnaam:',
-'uid' => 'Gebruiker-ID:',
-'prefs-memberingroups' => 'Lid van {{PLURAL:$1|groep|groepe}}:',
+'username' => '{{GENDER:$1|Gebruikersnaam}}:',
+'uid' => '{{GENDER:$1|Gebruiker-ID}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepe}}:',
'prefs-registration' => 'Registrasiedatum:',
'yourrealname' => 'Regte naam:',
'yourlanguage' => 'Taal:',
@@ -1495,12 +1505,13 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
'right-sendemail' => 'Stuur e-pos aan ander gebruikers',
'right-passwordreset' => 'Wys e-posse vir herstel van wagwoord',
+# Special:Log/newusers
+'newuserlogpage' => 'Logboek van nuwe gebruikers',
+'newuserlogpagetext' => "Dit is 'n logboek van gebruikers wat onlangs ingeteken het.",
+
# User rights log
'rightslog' => 'Gebruikersregtelogboek',
'rightslogtext' => 'Hier onder is die logboek van gebruikersregte wat verander is.',
-'rightslogentry' => 'wysig gebruikersregte vir $1 van $2 na $3',
-'rightslogentry-autopromote' => 'was outomaties bevorder van $2 na $3',
-'rightsnone' => '(geen)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lees die bladsy',
@@ -1744,6 +1755,7 @@ As daar steeds probleme is, kontak 'n [[Special:ListUsers/sysop|administrateur]]
'backend-fail-notsame' => "'n Nie-identiese lêer bestaan al reeds by $1.",
'backend-fail-invalidpath' => "$1 is nie 'n geldige stoorplek nie.",
'backend-fail-delete' => 'Die lêer $1 kon nie geskrap word nie.',
+'backend-fail-describe' => 'Kon nie metadata vir lêer "$1" verander nie.',
'backend-fail-alreadyexists' => 'Die lêer $1 bestaan al reeds.',
'backend-fail-store' => 'Kon nie lêer $1 in $2 stoor nie.',
'backend-fail-copy' => 'Kon nie lêer $1 na $2 kopieer nie.',
@@ -1980,6 +1992,12 @@ Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
Hulle moet gewysig word om eerder direk na die regte onderwerpe te skakel.<br />
'n Bladsy word beskou as 'n dubbelsinnigheidsbladsy as dit 'n sjabloon bevat wat geskakel is vanaf [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => "Blaaie met 'n bladsy-eienskap",
+'pageswithprop-legend' => "Blaaie met 'n bladsy-eienskap",
+'pageswithprop-text' => "Hierdie bladsy lys blaaie met 'n bepaalde blady-eienskap.",
+'pageswithprop-prop' => 'Naam van die eienskap:',
+'pageswithprop-submit' => 'OK',
+
'doubleredirects' => 'Dubbele aansture',
'doubleredirectstext' => 'Hierdie lys bevat bladsye wat aansture na ander aanstuurblaaie is.
Elke ry bevat skakels na die eerste en die tweede aanstuur, asook die eerste reël van van die tweede aanstuur se teks, wat gewoonlik die "regte" teiken-bladsy gee waarna die eerste aanstuur behoort te wys.
@@ -2134,7 +2152,7 @@ Sien ook [[Special:WantedCategories|nie-bestaande kategorieë met verwysings]].'
'linksearch-ok' => 'Soek',
'linksearch-text' => 'Patrone soos "*.wikipedia.org" kan gebruik word.<br />
Benodig ten minste een topvlakdomein, soos byvoorbeeld "*.org".<br />
-Ondersteunde protokolle: <code>$1</code> (moenie hierdie in u soektog gebruik nie)',
+{{PLURAL:$2|Ondersteunde protokol|Ondersteunde protokolle}}: <code>$1</code> (http:// word gebruik as niks gespesifiseer is nie)',
'linksearch-line' => '$1 geskakel vanaf $2',
'linksearch-error' => 'Patrone kan slegs aan die begin van die rekenaarnaam geplaas word.',
@@ -2153,10 +2171,6 @@ Ondersteunde protokolle: <code>$1</code> (moenie hierdie in u soektog gebruik ni
'activeusers-hidesysops' => 'Versteek administrateurs',
'activeusers-noresult' => 'Geen gebruikers gevind nie.',
-# Special:Log/newusers
-'newuserlogpage' => 'Logboek van nuwe gebruikers',
-'newuserlogpagetext' => "Dit is 'n logboek van gebruikers wat onlangs ingeteken het.",
-
# Special:ListGroupRights
'listgrouprights' => 'Gebruikersgroepregte',
'listgrouprights-summary' => "Hier volg 'n lys van gebruikersgroepe met hulle ooreenstemmende regte wat op die wiki gedefinieer is.
@@ -2250,19 +2264,23 @@ Toekomstige wysigings aan hierdie bladsy en sy bybehorende besprekingsblad sal h
'enotif_mailer' => '{{SITENAME}} E-pos kennisgewings',
'enotif_reset' => 'Merk alle bladsye as besoek',
-'enotif_newpagetext' => "Dis 'n nuwe bladsy.",
'enotif_impersonal_salutation' => '{{SITENAME}} gebruiker',
-'changed' => 'verander',
-'created' => 'geskep',
-'enotif_subject' => 'Bladsy $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED deur $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}}: bladsy $1 is verwyder deur {{GENDER:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}}: bladsy $1 is geskep deur {{GENDER:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}}: bladsy $1 is geskuif deur {{GENDER:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}}: bladsy $1 is teruggeplaas deur {{GENDER:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}}: bladsy $1 is gewysig deur {{GENDER:$2|$2}}',
+'enotif_body_intro_deleted' => 'Die bladsy $1 op {{SITENAME}} is deur {{gender:$2|$2}} op $PAGEEDITDATE verwyder. Sien $3 vir die huidige weergawe.',
+'enotif_body_intro_created' => 'Die bladsy $1 op {{SITENAME}} is deur {{GENDER:$2|$2}} op $PAGEEDITDATE geskep. Sien $3 vir die huidige weergawe.',
+'enotif_body_intro_moved' => 'Die bladsy $1 op {{SITENAME}} is deur {{GENDER:$2|$2}} op $PAGEEDITDATE hernoem. Sien $3 vir die huidige weergawe.',
+'enotif_body_intro_restored' => 'Die bladsy $1 op {{SITENAME}} is deur {{GENDER:$2|$2}} op $PAGEEDITDATE teruggeplaas. Sien $3 vir die huidige weergawe.',
+'enotif_body_intro_changed' => 'Die bladsy $1 op {{SITENAME}} is op $PAGEEDITDATE deur {{GENDER:$2|$2}} gewysig. Sien $3 vir die huidige weergawe.',
'enotif_lastvisited' => 'Sien $1 vir alle wysigings sedert u laaste besoek.',
'enotif_lastdiff' => 'Gaan na $1 om hierdie wysiging te sien.',
'enotif_anon_editor' => 'anonieme gebruiker $1',
'enotif_body' => 'Beste $WATCHINGUSERNAME,
-Die bladsy $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED op $PAGEEDITDATE deur $PAGEEDITOR, sien $PAGETITLE_URL vir die nuutste weergawe.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Samevatting van die wysiging: $PAGESUMMARY $PAGEMINOREDIT
@@ -2271,9 +2289,9 @@ E-pos: $PAGEEDITOR_EMAIL
Wiki: $PAGEEDITOR_WIKI
Tensy u hierdie bladsy besoek, sal u geen verdere kennisgewings ontvang nie.
-U kan ook die waarskuwingsvlag op u dophoulys verstel.
+U kan ook die waarskuwingsvlag op u dophoulys stel.
-Groete van {{SITENAME}} se waarskuwingssisteem.
+Groete van {{SITENAME}} se waarskuwingsstelsel.
--
U kan u e-posvoorkeure stel by:
@@ -2287,6 +2305,8 @@ $UNWATCHURL
Terugvoer en verdere bystand:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'geskep',
+'changed' => 'verander',
# Delete
'deletepage' => 'Skrap bladsy',
@@ -2359,6 +2379,8 @@ Sien die [[Special:ProtectedPages|lys van beveiligde bladsye]] vir alle bladsye
'prot_1movedto2' => 'het [[$1]] geskuif na [[$2]]',
'protect-badnamespace-title' => 'Nie-beskermde naamruimte',
'protect-badnamespace-text' => 'Bladsye in hierdie naamruimte kan nie beskerm word nie.',
+'protect-norestrictiontypes-text' => 'Die bladsy kan nie beveilig word nie omdat daar geen beperkingstipes beskikbaar is nie.',
+'protect-norestrictiontypes-title' => 'Nie beveiligbare bladsy',
'protect-legend' => 'Bevestig beskerming',
'protectcomment' => 'Rede:',
'protectexpiry' => 'Verval:',
@@ -2442,7 +2464,8 @@ U mag moontlik 'n foutiewe skakel hê, of die weergawe is reeds herstel of uit d
'undeletedrevisions' => '{{PLURAL:$1|1 weergawe|$1 weergawes}} herstel',
'undeletedrevisions-files' => '{{PLURAL:$1|1 weergawe|$1 weergawes}} en {{PLURAL:$2|1 lêer|$2 lêers}} herstel',
'undeletedfiles' => '{{PLURAL:$1|1 lêer|$1 lêers}} herstel',
-'cannotundelete' => 'Skrapping onsuksesvol; miskien het iemand anders dié bladsy al geskrap.',
+'cannotundelete' => 'Terugplasing was onsuksesvol:
+$1',
'undeletedpage' => "'''$1 is teruggeplaas'''
Konsulteer die [[Special:Log/delete|verwyderingslogboek]] vir 'n rekord van onlangse verwyderings en terugplasings.",
@@ -2474,7 +2497,7 @@ $1',
'blanknamespace' => '(Hoof)',
# Contributions
-'contributions' => 'Gebruikersbydraes',
+'contributions' => '{{GENDER:$1|Gebruikersbydraes}}',
'contributions-title' => '$1 se bydraes',
'mycontris' => 'Bydraes',
'contribsub2' => 'Vir $1 ($2)',
@@ -2748,6 +2771,7 @@ Die teikenartikel "[[:$1]]" bestaan reeds. Wil u dit skrap om plek te maak vir d
'immobile-target-namespace-iw' => "'n Interwiki-skakel is nie 'n geldige bestemming vir die skuif van die bladsy nie.",
'immobile-source-page' => 'Die bladsy kan nie geskuif word nie.',
'immobile-target-page' => 'Dit is nie moontlik om na die titel toe te skuif nie.',
+'bad-target-model' => "Die gewenste bestemming gebruik 'n ander inhoudsmodel. Dit is nie moontlik van $1 na $2 om te skakel nie.",
'imagenocrossnamespace' => "'n Medialêer kan nie na 'n ander naamruimte geskuif word nie",
'nonfile-cannot-move-to-file' => 'Net lêers kan na die lêernaamruimte geskuif word',
'imagetypemismatch' => 'Die nuwe lêer se uitbreiding pas nie by die lêertipe nie',
@@ -2862,6 +2886,7 @@ Die lêer is slegs gedeeltelik opgelaai.',
'import-error-interwiki' => 'Die bladsy "$1" is nie geïmporteer nie omdat sy naam vir eksterne skakeling (interwiki) gereserveer is.',
'import-error-special' => 'Die bladsy "$1" is nie geïmporteer nie omdat dit aan \'n spesiale naamruimte behoort waarin geen bladsye geplaas kan word nie.',
'import-error-invalid' => 'Die bladsy "$1" is nie geïmporteer nie omdat die naam ongeldig is.',
+'import-error-unserialize' => 'Weergawe $2 van die bladsy "$1" kon nie verwerk word nie. Die weergawe hoort inhoudsmodel $3 te gebruik met \'n serialisasie van $4.',
'import-options-wrong' => 'Verkeerde {{PLURAL:$2|opsie|opsies}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Die gespesifiseerde basisblad is ongeldig.',
'import-rootpage-nosubpage' => 'Die naamruimte "$1" van die basisblad laat nie subblaaie toe nie.',
@@ -2876,7 +2901,6 @@ Die lêer is slegs gedeeltelik opgelaai.',
# JavaScriptTest
'javascripttest' => 'JavaScript toetsing',
-'javascripttest-disabled' => 'Die funksie is nie op hierdie wiki geaktiveer nie.',
'javascripttest-title' => 'Voer toetse uit vir $1',
'javascripttest-pagetext-noframework' => 'Hierdie bladsy is gereserveer vir die uitvoer van JavaScript-toetse.',
'javascripttest-pagetext-unknownframework' => 'Onbekende toetsraamwerk "$1".',
@@ -2994,11 +3018,13 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
'pageinfo-default-sort' => 'Standaard sorteerwyse',
'pageinfo-length' => 'Bldasylengte (in grepe)',
'pageinfo-article-id' => 'Bladsy-ID',
+'pageinfo-language' => 'Taal vir die bladsy',
'pageinfo-robot-policy' => 'Status vir soekenjins',
'pageinfo-robot-index' => 'Indekseerbaar',
'pageinfo-robot-noindex' => 'Nie indekseerbaar nie',
'pageinfo-views' => 'Aantal kere gewys',
'pageinfo-watchers' => 'Aantal dophouers',
+'pageinfo-few-watchers' => 'Minder as {{PLURAL:$1|dophouer|$1 dophouers}}',
'pageinfo-redirects-name' => 'Aansture na die bladsy',
'pageinfo-subpages-name' => 'Subblaaie van die bladsy',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|aanstuur|aansture}}; $3 {{PLURAL:$3|nie-aanstuur|nie-aansture}})',
@@ -3013,6 +3039,19 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
'pageinfo-magic-words' => '{{PLURAL:$1|Magiese woord|Magiese woorde}} ($1)',
'pageinfo-hidden-categories' => 'Versteekte {{PLURAL:$1|kategorie|kategorieë}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Gebruikte sjabloon|Gebruikte sjablone}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Bladsy|Bladsye}} getranskludeerd op ($1)',
+'pageinfo-toolboxlink' => 'Bladinligting',
+'pageinfo-redirectsto' => 'Stuur aan na',
+'pageinfo-redirectsto-info' => 'Inligting',
+'pageinfo-contentpage' => "Getel as 'n bladsy met inhoud",
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Beveiliging werk vanaf hier deur',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => "Bladsy is vanuit 'n ander blad beveilig",
+'pageinfo-category-info' => 'Kategoriegegewens',
+'pageinfo-category-pages' => 'Aantal bladsye',
+'pageinfo-category-subcats' => 'Aantal subkategorieë',
+'pageinfo-category-files' => 'Aantal lêers',
# Skin names
'skinname-standard' => 'Standaard',
@@ -3029,6 +3068,8 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
'markedaspatrollederror' => 'Kan nie as gekontroleerd merk nie',
'markedaspatrollederrortext' => "U moet 'n weergawe spesifiseer om as gekontroleerd te merk.",
'markedaspatrollederror-noautopatrol' => 'U kan nie u eie veranderinge as gekontroleerd merk nie.',
+'markedaspatrollednotify' => 'Hierdie wysiging aan $1 is as gekontroleerd gemerk.',
+'markedaspatrollederrornotify' => 'Merk as gekontroleerd het misluk.',
# Patrol log
'patrol-log-page' => 'Kontroleringslogboek',
@@ -3061,6 +3102,7 @@ $1',
'file-nohires' => 'Geen hoër resolusie is beskikbaar nie.',
'svg-long-desc' => 'SVG-lêer, normaalweg $1 × $2 piksels, lêergrootte: $3',
'svg-long-desc-animated' => 'Geanimeerde SVG-lêer, normaalweg $1 × $2 piksels, lêergrootte: $3',
+'svg-long-error' => 'Ongeldige SVG-lêer: $1',
'show-big-image' => 'Volle resolusie',
'show-big-image-preview' => 'Grootte van hierdie voorskou: $1.',
'show-big-image-other' => 'Ander {{PLURAL:$2|resolusie|resolusies}}: $1.',
@@ -3090,7 +3132,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minuut|$1 minute}}',
'hours' => '{{PLURAL:$1|$1 uur|$1 ure}}',
'days' => '{{PLURAL:$1|$1 dag|$1 dae}}',
+'months' => '{{PLURAL:$1|een maand|$1 maande}}',
+'years' => '{{PLURAL:$1|een jaar|$1 jaar}}',
'ago' => '$1 gelede',
+'just-now' => 'Nou net',
# Bad image list
'bad_image_list' => "Die formaat is as volg:
@@ -3582,6 +3627,7 @@ Die bevestigingskode sal om $4 verval.',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-invoeging van sjablone is afgeskakel]',
'scarytranscludefailed' => '[Sjabloon $1 kon nie gelaai word nie]',
+'scarytranscludefailed-httpstatus' => '[Sjabloon $1 kon nie gelaai word nie: HTTP $2]',
'scarytranscludetoolong' => '[Die URL is te lank]',
# Delete conflict
@@ -3700,6 +3746,7 @@ U kan ook die [[Special:EditWatchlist|standaard opdaterigskerm gebruik]].',
'version-license' => 'Lisensie',
'version-poweredby-credits' => "Hierdie wiki word aangedryf deur '''[//www.mediawiki.org/ MediaWiki]''', kopiereg © 2001-$1 $2.",
'version-poweredby-others' => 'andere',
+'version-credits-summary' => 'Ons erken graag die volgende persone vir hul bydrae aan [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki is vrye sagteware, u kan MediaWiki versprei en/of wysig onder die voorwaardes van die "GNU Algemene Publieke Lisensie", soos deur die "Free Software Foundation" gepubliseer; óf weergawe 2 van die lisensie, of (as u wil) enige latere weergawe daarvan.
MediaWiki word versprei met die hoop dat dit nuttig sal wees, maar SONDER ENIGE WAARBORGE, selfs sonder geïmpliseerde waarborg van VERHANDELBAARHEID of GESKIKTHEID VIR \'N SPESIFIEKE DOEL. Verwys na die "GNU Algemene Publieke Lisensie" vir meer besonderhede.
@@ -3814,17 +3861,17 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
'sqlite-no-fts' => 'Weergawe $1 sonder ondersteuning vir vol-teks soektogte ("full-text search")',
# New logging system
-'logentry-delete-delete' => '$1 het die bladsy $3 verwyder',
-'logentry-delete-restore' => '$1 het die bladsy $3 teruggeplaas',
-'logentry-delete-event' => "$1 het die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
-'logentry-delete-revision' => "$1 het die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van bladsy $3 gewysig: $4",
-'logentry-delete-event-legacy' => '$1 het die sigbaarheid van logboekreëls van $3 gewysig',
-'logentry-delete-revision-legacy' => '$1 het die sigbaarheid van weergawes van die bladsy $3 gewysig.',
-'logentry-suppress-delete' => '$1 het die bladsy $3 onderdruk',
-'logentry-suppress-event' => "$1 het in die geheim die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
-'logentry-suppress-revision' => "$1 het in die geheim die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van die bladsy $3 gewysig: $4",
-'logentry-suppress-event-legacy' => '$1 het in die geheim die sigbaarheid van logboekreëls van $3 gewysig',
-'logentry-suppress-revision-legacy' => '$1 het in die geheim die sigbaarheid van weergawes van die bladsy $3 gewysig',
+'logentry-delete-delete' => '$1 {{GENDER:$2|het}} bladsy $3 verwyder',
+'logentry-delete-restore' => '$1 {{GENDER:$2|het}} bladsy $3 teruggeplaas',
+'logentry-delete-event' => "$1 {{GENDER:$2|het}} die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
+'logentry-delete-revision' => "$1 {{GENDER:$2|het}} die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van bladsy $3 gewysig: $4",
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|het}} die sigbaarheid van logboekreëls van $3 gewysig',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|het}} die sigbaarheid van weergawes van bladsy $3 gewysig.',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|het}} die bladsy $3 onderdruk',
+'logentry-suppress-event' => "$1 {{GENDER:$2|het}} in die geheim die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
+'logentry-suppress-revision' => "$1 {{GENDER:$2|het}} in die geheim die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van die bladsy $3 gewysig: $4",
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|het}} in die geheim die sigbaarheid van logboekreëls van $3 gewysig',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|het}} in die geheim die sigbaarheid van weergawes van die bladsy $3 gewysig',
'revdelete-content-hid' => 'inhoud versteek',
'revdelete-summary-hid' => 'wysigingsopsomming versteek',
'revdelete-uname-hid' => 'gebruikersnaam versteek',
@@ -3833,17 +3880,21 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
'revdelete-uname-unhid' => 'gebruikersnaam sigbaar gemaak',
'revdelete-restricted' => 'beperkings is aan administrateurs opgelê',
'revdelete-unrestricted' => 'beperkings vir administrateurs is opgehef',
-'logentry-move-move' => '$1 het bladsy $3 na $4 geskuif',
-'logentry-move-move-noredirect' => "$1 het bladsy $3 na $4 geskuif sonder om 'n aanstuur agter te laat",
-'logentry-move-move_redir' => "$1 het bladsy $3 na $4 oor 'n aanstuur geskuif",
-'logentry-move-move_redir-noredirect' => "$1 het bladsy $3 na $4 oor 'n bestaande aanstuur geskuif sonder om 'n aanstuur agter te laat",
-'logentry-patrol-patrol' => '$1 het weergawe $4 van bladsy $3 as gekontroleerd gemerk',
-'logentry-patrol-patrol-auto' => '$1 het weergawe $4 van bladsy $3 outomaties as gekontroleerd gemerk',
-'logentry-newusers-newusers' => 'Gebruiker $1 is geskep',
-'logentry-newusers-create' => 'Gebruiker $1 is geskep',
-'logentry-newusers-create2' => 'Gebruiker $3 is deur $1 geskep',
-'logentry-newusers-autocreate' => 'Die gebruiker $1 is outomaties geskep',
-'newuserlog-byemail' => 'wagwoord is per e-pos versend',
+'logentry-move-move' => '$1 {{GENDER:$2|het}} bladsy $3 na $4 geskuif',
+'logentry-move-move-noredirect' => "$1 {{GENDER:$2|het}} bladsy $3 na $4 geskuif sonder om 'n aanstuur agter te laat",
+'logentry-move-move_redir' => "$1 {{GENDER:$2|het}} bladsy $3 na $4 oor 'n aanstuur geskuif",
+'logentry-move-move_redir-noredirect' => "$1 {{GENDER:$2|het}} bladsy $3 na $4 oor 'n bestaande aanstuur geskuif sonder om 'n aanstuur agter te laat",
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|het}} weergawe $4 van bladsy $3 as gekontroleerd gemerk',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|het}} weergawe $4 van bladsy $3 outomaties as gekontroleerd gemerk',
+'logentry-newusers-newusers' => 'Gebruiker $1 {{GENDER:$2|is}} geskep',
+'logentry-newusers-create' => 'Gebruiker $1 {{GENDER:$2|is}} geskep',
+'logentry-newusers-create2' => 'Gebruiker $3 {{GENDER:$2|is}} deur $1 geskep',
+'logentry-newusers-byemail' => 'Gebruiker $3 {{GENDER:$2|is}} deur $1 geskep en die wagwoord is per e-pos aangestuur',
+'logentry-newusers-autocreate' => 'Die gebruiker $1 {{GENDER:$2|is}} outomaties geskep',
+'logentry-rights-rights' => '$1 {{GENDER:$2|het}} groepslidmaatskap vir $3 van $4 na $5 gewysig',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|het}} groepslidmaatskap vir $3 gewysig',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|is}} outomaties van $4 na $5 gepromoveerd',
+'rightsnone' => '(geen)',
# Feedback
'feedback-bugornote' => 'As u reg is om \'n tegniese probleem in detail te beskryf, [$1 rapporteer \'n fout].
@@ -3897,6 +3948,7 @@ Anders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die blad
'api-error-ok-but-empty' => 'Interne fout: geen reaksie van die bediener.',
'api-error-overwrite' => "'N bestaande lêer vervang word nie toegelaat nie.",
'api-error-stashfailed' => 'Interne fout: Server nie tydelike lêer te stoor.',
+'api-error-publishfailed' => 'Interne fout: bediener kon nie die tydelike lêer publiseer nie.',
'api-error-timeout' => 'Die bediener het nie reageer binne die verwagte tyd.',
'api-error-unclassified' => "'n Onbekende fout het voorgekom.",
'api-error-unknown-code' => 'Onbekende fout: "$1"',
@@ -3917,4 +3969,7 @@ Anders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die blad
'duration-centuries' => '$1 {{PLURAL:$1|eeu|eeue}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+# Image rotation
+'rotate-comment' => 'Beeld $1 {{PLURAL:$1|graad|grade}} kloksgewys gedraai',
+
);
diff --git a/languages/messages/MessagesAln.php b/languages/messages/MessagesAln.php
index d6dc2d2b..d34721f4 100644
--- a/languages/messages/MessagesAln.php
+++ b/languages/messages/MessagesAln.php
@@ -211,7 +211,6 @@ $messages = array(
'qbbrowse' => 'Shfleto',
'qbedit' => 'Redakto',
'qbpageoptions' => 'Kjo faqe',
-'qbpageinfo' => 'Konteksti',
'qbmyoptions' => 'Faqet e mija',
'qbspecialpages' => 'Faqet speciale',
'faq' => 'Pyetjet e shpeshta',
@@ -451,12 +450,8 @@ Arsyeja e dhânë âsht "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Jeni çlajmërue.'''
-Mundeni me vazhdue me shfrytëzue {{SITENAME}} në mënyrë anonime, apo mundeni [[Special:UserLogin|me u kyçë]] si përdoruesi i njêjtë apo si nji tjetër.
+Mundeni me vazhdue me shfrytëzue {{SITENAME}} në mënyrë anonime, apo mundeni <span class='plainlinks'>[$1 me u kyçë]</span> si përdoruesi i njêjtë apo si nji tjetër.
Disa faqe mujnë me u paraqitë prap si t'kishit qenë t'kyçun, derisa ta pastroni memorizimin e shfletuesit.",
-'welcomecreation' => '== Mirësevini, $1! ==
-
-Llogaria juej âsht krijue.
-Mos harroni me i ndryshue [[Special:Preferences|parapëlqimet për {{SITENAME}}]].',
'yourname' => 'Nofka:',
'yourpassword' => 'Fjalëkalimi:',
'yourpasswordagain' => 'Fjalëkalimi përsëdyti:',
@@ -738,7 +733,6 @@ Administruesi që e ka mshelë e ka dhânë këtë shpjegim: $1",
'template-protected' => '(e mbrojtme)',
'template-semiprotected' => '(gjysë-mbrojtun)',
'hiddencategories' => 'Kjo faqe bân pjesë në {{PLURAL:$1|1 kategori të msheftë|$1 kategori të mshefta}}:',
-'nocreatetitle' => 'Krijimi i faqeve âsht i kufizuem.',
'nocreatetext' => '{{SITENAME}} ka kufizue mundësinë e krijimit të faqeve të reja.
Mundeni me u kthy mbrapa edhe me redaktue faqen ekzistuese, apo [[Special:UserLogin|me u kyçë a me krijue nji llogari]].',
'nocreate-loggedin' => 'Nuk keni tagër me krijue faqe të reja.',
@@ -1136,11 +1130,12 @@ Mundeni me zgjedhe që të tjerët me ju kontaktue përmjet faqe së diskutimit
'right-userrights' => 'Redakto të gjitha të drejtat e përdoruesit',
'right-passwordreset' => 'Fjalëkalimi Reset e një përdoruesi ([[Special:PasswordReset|faqe veçantë]])',
+# Special:Log/newusers
+'newuserlogpage' => 'Regjistri i krijimit të përdoruesve',
+
# User rights log
'rightslog' => 'Regjsitri i tagrit të përdoruesve',
'rightslogtext' => 'Ky është një regjistër për ndryshimet e titujve të përdoruesve.',
-'rightslogentry' => 'të drejtat e $1 u ndryshuan prej $2 në $3',
-'rightsnone' => '(asgjë)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lexo këtë faqe',
@@ -1278,9 +1273,6 @@ Faqet në [[Special:Watchlist|listën tuej të mbikëqyrjes]] janë '''të theks
# Special:LinkSearch
'linksearch' => 'Vegzat e jashtme',
-# Special:Log/newusers
-'newuserlogpage' => 'Regjistri i krijimit të përdoruesve',
-
# Special:ListGroupRights
'listgrouprights-members' => '(lista e antarëve)',
@@ -1616,6 +1608,7 @@ Tjerat kanë me mbetë të mshefuna.
# New logging system
'revdelete-restricted' => 'u vendosën kufizime për administruesit',
'revdelete-unrestricted' => 'u hoqën kufizimet për administruesit',
+'rightsnone' => '(asgjë)',
# Search suggestions
'searchsuggest-search' => 'Kërkim',
diff --git a/languages/messages/MessagesAls.php b/languages/messages/MessagesAls.php
deleted file mode 100644
index 867d2a88..00000000
--- a/languages/messages/MessagesAls.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-/** Alemannisch
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
- *
- * @ingroup Language
- * @file
- * @comment Deprecated code. Falls back to 'gsw'.
- */
-
-$fallback = 'gsw, de';
diff --git a/languages/messages/MessagesAm.php b/languages/messages/MessagesAm.php
index 2ac5d539..f40de91e 100644
--- a/languages/messages/MessagesAm.php
+++ b/languages/messages/MessagesAm.php
@@ -185,7 +185,6 @@ $messages = array(
'qbbrowse' => 'ቃáŠ',
'qbedit' => 'አርáˆ',
'qbpageoptions' => 'ይህ ገጽ',
-'qbpageinfo' => 'አáŒá‰£á‰¥',
'qbmyoptions' => 'የኔ ገጾች',
'qbspecialpages' => 'áˆá‹© ገጾች',
'faq' => 'ብጊየጥ (ብዙ ጊዜ የሚጠየበጥያቀዎች)',
@@ -410,9 +409,7 @@ $2",
አáˆáŠ•áˆ በá‰áŒ¥áˆ­ መታወቂያዎ ማዘጋጀት ይቻላáˆá¢ ወይሠደáŒáˆž እንደገና በብዕር ስáˆá‹Ž መáŒá‰£á‰µ ይችላሉá¢
በጥቂት ሴኮንድ á‹áˆµáŒ¥ ወደሚከተለዠገጽ በቀጥታ ይመለሳáˆá¦",
-'welcomecreation' => '== ሰላáˆá‰³á£ $1! ==
-
-የብዕር ስáˆá‹Ž ተáˆáŒ¥áˆ¯áˆá¢ áˆáˆ­áŒ«á‹Žá‰½á‹ŽáŠ• ለማስተካከሠይችላሉá¢',
+'welcomeuser' => 'ሰላáˆá‰³ $1! እንኳን ደህናመጡá¢',
'yourname' => 'Username / የብዕር ስáˆ:',
'yourpassword' => 'Password / መáŒá‰¢á‹« ቃáˆ',
'yourpasswordagain' => 'መáŒá‰¢á‹« ቃáˆá‹ŽáŠ• ዳáŒáˆ˜áŠ› ይስጡ',
@@ -526,6 +523,7 @@ $2",
'changeemail-oldemail' => 'የቆየዠኢ-ሜሠአድራሻዎá¦',
'changeemail-newemail' => 'አዲስ ኢ-ሜሠአድራሻá¦',
'changeemail-none' => '(የለáˆ)',
+'changeemail-password' => 'የ{{SITENAME}} መáŒá‰¢á‹« ቃáˆá‹Žá¦',
'changeemail-submit' => 'አድራሻዎን ለመቀይር',
'changeemail-cancel' => 'ይቅር',
@@ -652,7 +650,6 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'template-protected' => '(የተቆለáˆ)',
'template-semiprotected' => '(በከáŠáˆ የተቆለáˆ)',
'hiddencategories' => 'ይህ ገጽ በ{{PLURAL:$1|1 የተደበቀ መደብ|$1 የተደበበመድቦች}} á‹áˆµáŒ¥ ይገኛáˆá¢',
-'nocreatetitle' => 'የገጽ መáጠር ተወሰáŠ',
'nocreatetext' => '{{SITENAME}} አዳዲስ ገጾችን ለመáጠር ያሚያስችሠáˆáŠ”ታ ከለክáˆáˆá¢ ተመáˆáˆ°á‹ የቆየá‹áŠ• ገጽ ማዘጋጀት ይችላሉᤠአለዚያ [[Special:UserLogin|በብዕር ስሠመáŒá‰£á‰µ]] ይችላሉá¢',
'nocreate-loggedin' => 'አዲስ ገጽ በ{{SITENAME}} ለመáጠር áˆá‰ƒá‹µ የለዎáˆá¢',
'permissionserrors' => 'የáˆá‰ƒá‹µ ስሕተቶች',
@@ -675,6 +672,9 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
ገና ይኖራáˆáŠ“á¢',
'defaultmessagetext' => 'የቆየዠጽሕáˆá‰µ',
+# Content models
+'content-model-javascript' => 'ጃቫ ስክሪá•á‰µ',
+
# "Undo" feature
'undo-success' => "á‹« ለá‹áŒ¥ በቀጥታ ሊገለበጥ ይቻላáˆá¢ እባክዎ ከታች ያለá‹áŠ• ማáŠáŒ»áŒ¸áˆ­á‹« ተመáˆáŠ­á‰°á‹ ይህ እንደሚáˆáˆáŒ‰ ያረጋáŒáŒ¡áŠ“ ለá‹áŒ¡ እንዲገለበጥ '''ገጹን ለማቅረብ''' ይጫኑá¢",
'undo-failure' => 'ከዚሠለá‹áŒ¥ በኋላ ቅራኔ ለá‹áŒ¦á‰½ ስለ ገቡ ሊገለበጥ አይቻáˆáˆá¢',
@@ -1022,11 +1022,13 @@ $1ን ወይሠማንሠሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
'right-userrights' => 'ያባላት áˆáˆ‰ መብቶች ለማስተካከáˆ',
'right-sendemail' => 'ወደ ሌላ አባሠኢ-ሜሠለመላክ',
+# Special:Log/newusers
+'newuserlogpage' => 'የአባáˆáŠá‰µ መá‹áŒˆá‰¥ (user log)',
+'newuserlogpagetext' => 'ይህ መá‹áŒˆá‰¥ ወደ አባáˆáŠá‰µ የገቡትን ብዕር ስሞች ይዘርá‹áˆ«áˆá¢',
+
# User rights log
'rightslog' => 'የአባሠመብቶች መá‹áŒˆá‰¥',
'rightslogtext' => 'ይህ መá‹áŒˆá‰¥ የአባሠመብቶች ሲለወጡ ይዘረá‹áˆ«áˆá¢',
-'rightslogentry' => 'የ$1 ማዕረጠከ$2 ወደ $3 ለወጠ',
-'rightsnone' => '(የለáˆ)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ይህን ገጽ ለማንበብ',
@@ -1480,10 +1482,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'activeusers-hidesysops' => 'መጋቢዎች ይደበá‰',
'activeusers-noresult' => 'ማንሠተጠቃሚ አáˆá‰°áŒˆáŠ˜áˆá¢',
-# Special:Log/newusers
-'newuserlogpage' => 'የአባáˆáŠá‰µ መá‹áŒˆá‰¥ (user log)',
-'newuserlogpagetext' => 'ይህ መá‹áŒˆá‰¥ ወደ አባáˆáŠá‰µ የገቡትን ብዕር ስሞች ይዘርá‹áˆ«áˆá¢',
-
# Special:ListGroupRights
'listgrouprights' => 'የተጠቃሚ ስብስባ መብቶች',
'listgrouprights-group' => 'ስብስባ',
@@ -1556,11 +1554,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'enotif_mailer' => 'የ{{SITENAME}} ኢሜáˆ-ማስታወቂያ',
'enotif_reset' => 'ገጾች áˆáˆ‰ የተጎበኙ ሆáŠá‹ ለማመáˆáŠ¨á‰µ',
-'enotif_newpagetext' => 'ይህ አዲስ ገጽ áŠá‹á¢',
'enotif_impersonal_salutation' => '{{SITENAME}} ተጠቃሚ',
-'changed' => 'ተለወጠ',
-'created' => 'ተáˆáŒ áˆ¨',
-'enotif_subject' => 'የ{{SITENAME}} ገጽ $PAGETITLE በ$PAGEEDITOR $CHANGEDORCREATED',
'enotif_lastvisited' => 'መጨረሻ ከጎበኙ ጀáˆáˆ® ለá‹áŒ¦á‰½áŠ• áˆáˆ‰ ለመመáˆáŠ¨á‰µ $1 á‹­á‹©á¢',
'enotif_lastdiff' => 'ይህን ለá‹áŒ¥ ለማመáˆáŠ¨á‰µ $1 á‹­á‹©á¢',
'enotif_anon_editor' => 'á‰áŒ¥áˆ­ አድራሻ $1',
@@ -1586,6 +1580,8 @@ $NEWPAGE
በተጨማሪ ለመረዳትá¦
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'ተáˆáŒ áˆ¨',
+'changed' => 'ተለወጠ',
# Delete
'deletepage' => 'ገጹ ይጥá‹',
@@ -2071,6 +2067,9 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
'pageinfo-lastuser' => 'የመጨረሻዠአራሚ',
'pageinfo-lasttime' => 'የመጨረሻዠዕትሠቀን',
'pageinfo-edits' => 'ጠቅላላ የእርማት á‰áŒ¥áˆ­',
+'pageinfo-toolboxlink' => 'የዚህ ገጽ መረጃ',
+'pageinfo-contentpage-yes' => 'አዎ',
+'pageinfo-protect-cascading-yes' => 'አዎ',
# Patrolling
'markaspatrolleddiff' => 'የተሳለሠሆኖ ማመáˆáŠ¨á‰µ',
@@ -2127,6 +2126,7 @@ $1',
'hours' => '$1 ሰዓት',
'days' => '$1 ቀን',
'ago' => 'ከ$1 በáŠá‰µ',
+'just-now' => 'ገና አáˆáŠ•',
# Bad image list
'bad_image_list' => 'ሥርዓቱ እንዲህ áŠá‹á¦
@@ -2572,7 +2572,7 @@ $3
# New logging system
'logentry-delete-delete' => '$1 ገጹን $3 አጠá‹',
-'newuserlog-byemail' => 'ማለáŠá‹«-ቃሠበኤ-መáˆá‹•áŠ­á‰µ ተáˆáŠ³áˆ',
+'rightsnone' => '(የለáˆ)',
# Feedback
'feedback-cancel' => 'ይቅር',
diff --git a/languages/messages/MessagesAn.php b/languages/messages/MessagesAn.php
index 9fa907bd..03fc4792 100644
--- a/languages/messages/MessagesAn.php
+++ b/languages/messages/MessagesAn.php
@@ -276,7 +276,6 @@ $messages = array(
'qbbrowse' => 'Navegar',
'qbedit' => 'Editar',
'qbpageoptions' => 'Ista pachina',
-'qbpageinfo' => 'Contexto',
'qbmyoptions' => 'Pachinas propias',
'qbspecialpages' => 'Pachinas especials',
'faq' => 'Preguntas freqüents (FAQ)',
@@ -522,10 +521,7 @@ A razón data ye ''$2''.",
# Login and logout pages
'logouttext' => "'''Ha rematato a sesión.'''
-Puede continar navegando por {{SITENAME}} anonimament, u puede [[Special:UserLogin|encetar]] una nueva sesión con o mesmo nombre d'usuario u bell atro diferent. Pare cuenta que, entre que se limpia a caché d'o navegador, puet estar que bellas pachinas s'amuestren como si encara continase en a sesión anterior.",
-'welcomecreation' => "== ¡Bienveniu(da), $1! ==
-S'ha creyato a suya cuenta.
-No xublide de presonalizar [[Special:Preferences|as suyas preferencias en {{SITENAME}}]].",
+Puede continar navegando por {{SITENAME}} anonimament, u puede <span class='plainlinks'>[$1 encetar]</span> una nueva sesión con o mesmo nombre d'usuario u bell atro diferent. Pare cuenta que, entre que se limpia a caché d'o navegador, puet estar que bellas pachinas s'amuestren como si encara continase en a sesión anterior.",
'yourname' => "Nombre d'usuario:",
'yourpassword' => "Clau d'acceso:",
'yourpasswordagain' => 'Torne a escribir a clau:',
@@ -822,7 +818,6 @@ Como información adicional s'amuestra contino a zaguera dentrada en o rechistro
'hiddencategories' => 'Ista pachina fa parte de {{PLURAL:$1|1 categoría amagata|$1 categorías amagatas}}:',
'edittools' => "<!-- Iste testo amanixerá baxo os formularios d'edizión y carga. -->",
'edittools-upload' => '-',
-'nocreatetitle' => "S'ha restrinchito a creyación de pachinas",
'nocreatetext' => '{{SITENAME}} ha restrinchito a creyación de nuevas pachinas. Puede tornar enta zaga y editar una pachina ya existent, [[Special:UserLogin|identificarse u creyar una cuenta]].',
'nocreate-loggedin' => 'No tiene premiso ta creyar nuevas pachinas.',
'sectioneditnotsupported-title' => 'A edición por seccions no ye suportada',
@@ -1343,12 +1338,13 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
'right-sendemail' => 'Ninviar un correu electronico a atros usuarios',
'right-passwordreset' => 'Veyer os correus electronicos de restabimiento de claus',
+# Special:Log/newusers
+'newuserlogpage' => 'Rechistro de nuevos usuarios',
+'newuserlogpagetext' => "Isto ye un rechistro de creyación d'usuarios.",
+
# User rights log
'rightslog' => "Rechistro de cambios en os dreitos d'os usuarios",
'rightslogtext' => "Iste ye un rechistro d'os cambios en os dreitos d'os usuarios",
-'rightslogentry' => "ha cambiato os dreitos d'usuario de $1: de $2 a $3",
-'rightslogentry-autopromote' => "S'ha promovito automaticament dende $2 ta $3",
-'rightsnone' => '(garra)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'leyer ista pachina',
@@ -1961,10 +1957,6 @@ Protocolos suportados: <code>$1</code> (no los adhiba en a suya busca).',
'activeusers-hidesysops' => 'Amagar administradors',
'activeusers-noresult' => "No s'han trobato usuarios.",
-# Special:Log/newusers
-'newuserlogpage' => 'Rechistro de nuevos usuarios',
-'newuserlogpagetext' => "Isto ye un rechistro de creyación d'usuarios.",
-
# Special:ListGroupRights
'listgrouprights' => "Dreitos d'a colla d'usuarios",
'listgrouprights-summary' => "Contino trobará a lista de collas d'usuario definitas en iste wiki, con os suyos dreitos d'acceso asociatos. Tamién puet trobar aquí [[{{MediaWiki:Listgrouprights-helppage}}|información adicional]] sobre os dreitos individuals.",
@@ -2055,19 +2047,13 @@ L\'adreza de correu-e que endicó en as suyas [[Special:Preferences|preferencias
'enotif_mailer' => 'Sistema de notificación por correu de {{SITENAME}}',
'enotif_reset' => 'Marcar todas as pachinas como vesitatas',
-'enotif_newpagetext' => 'Ista ye una nueva pachina.',
'enotif_impersonal_salutation' => 'usuario de {{SITENAME}}',
-'changed' => 'editata',
-'created' => 'creyata',
-'enotif_subject' => 'A pachina $PAGETITLE de {{SITENAME}} ha estato $CHANGEDORCREATED por $PAGEEDITOR',
'enotif_lastvisited' => 'Vaiga ta $1 ta veyer totz os cambeos dende a suya zaguer vesita.',
'enotif_lastdiff' => 'Vaiga ta $1 ta veyer iste cambeo.',
'enotif_anon_editor' => 'usuario anonimo $1',
'enotif_body' => 'Queriu/ida $WATCHINGUSERNAME,
-A pachina $PAGETITLE d\'o prochecto {{SITENAME}} s\'ha $CHANGEDORCREATED o día $PAGEEDITDATE por $PAGEEDITOR, veiga a versión actual en $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Resumen de l\'editor: $PAGESUMMARY $PAGEMINOREDIT
@@ -2075,8 +2061,9 @@ Contacto con l\'editor:
correu-e: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Si no visita a pachina, no recibirá mas notificacions de futuros cambios cambios.
+Si no visita a pachina, no recibirá mas notificacions de futuros cambios.
Tamién puet cambiar o modo de notificación d\'as pachinas que cosira en a suya lista de seguimiento.
+
Atentament,
O servicio de notificacions d\'o prochecto {{SITENAME}}
@@ -2091,6 +2078,8 @@ Ta eliminar a pachina d\'a suya lista de seguimiento, vaiga ta $UNWATCHURL
Sucherencias y aduya:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'creyata',
+'changed' => 'editata',
# Delete
'deletepage' => 'Borrar ista pachina',
@@ -2649,7 +2638,6 @@ Alce-lo en o suyo ordenador y cargue-lo aquí.",
# JavaScriptTest
'javascripttest' => 'Prebatinas de JavaScript',
-'javascripttest-disabled' => 'Ista función ye desactivata.',
'javascripttest-title' => 'Fendo as prebas de $1',
'javascripttest-pagetext-noframework' => 'Ista pachina ye reservada ta fer as prebas de JavaScrip.',
'javascripttest-pagetext-unknownframework' => 'Bastida de prebas "$1" desconoixida.',
@@ -3612,7 +3600,7 @@ As imachens s'amuestran en resolución completa, a resta de fichers fan encetar
'logentry-newusers-create' => "$1 creyó una cuenta d'usuario",
'logentry-newusers-create2' => "$1 creyó una cuenta d'usuario $3",
'logentry-newusers-autocreate' => "S'ha creyau automaticament a cuenta $1",
-'newuserlog-byemail' => 'Clau ninviata por correu electronico',
+'rightsnone' => '(garra)',
# Feedback
'feedback-bugornote' => "Si creye que puede describir en detalle un problema tecnico, [$1 informe d'un bug] por favor.
diff --git a/languages/messages/MessagesAng.php b/languages/messages/MessagesAng.php
index b367c84b..03c65762 100644
--- a/languages/messages/MessagesAng.php
+++ b/languages/messages/MessagesAng.php
@@ -173,7 +173,6 @@ $messages = array(
'qbbrowse' => 'OnbirÈe',
'qbedit' => 'Ä€dihte',
'qbpageoptions' => 'Þēos sīde',
-'qbpageinfo' => 'Ȝeƿef',
'qbmyoptions' => 'Mīna sīdan',
'qbspecialpages' => 'SyndriÈa sÄ«dan',
'faq' => 'Oftost ascoda ascunÈa',
@@ -359,11 +358,8 @@ Cȳþþuhord edÆ¿ende Æ¿Åh "<tt>$3: $4</tt>"',
# Login and logout pages
'logouttext' => "'''Þū eart nū ūtmeldod.'''
-Þū canst ætfeolan tÅ brÅ«cenne {{SITENAME}} ungecūðe, oþþe þū canst [[Special:UserLogin|inmeldian eft]] tÅ ylcan oþþe Åðrum brÅ«cende.
+Þū canst ætfeolan tÅ brÅ«cenne {{SITENAME}} ungecūðe, oþþe þū canst <span class='plainlinks'>[$1 inmeldian eft]</span> tÅ ylcan oþþe Åðrum brÅ«cende.
CnÄw þæt sume sÄ«dan cunnon gelÇ£stende Ä“owod wesan swÄ Ã¾Å« wÇ£re gÄ«et inmeldod, oþ þæt þū clÇ£nsie þīnes sÄ“cendtÅles gemynd.",
-'welcomecreation' => '== Ç·ilcumen, $1! ==
-
-Þīn hordcleofa Æ¿earþ Èescapen. Ne forÈiet tÅ hÆ¿ierfenne þīna [[Special:Preferences|{{SITENAME}} foreberunga]].',
'yourname' => 'Þīn brūcendnama',
'yourpassword' => 'Þafungƿord:',
'yourpasswordagain' => 'Þafungƿord edƿrītan:',
@@ -480,7 +476,6 @@ folcliÄ‹um Ägnunge oþþe ÈelÄ«Ä‹um frÄ“om horde (sÄ“o $1 for Äscungum).
'template-protected' => '(borgen)',
'template-semiprotected' => '(sÄmborgen)',
'hiddencategories' => 'Þēos sÄ«de is Èesīþ {{PLURAL:$1|1 Èehȳdedes flocces|$1 Èehȳdeda flocca}}:',
-'nocreatetitle' => 'SÄ«dan Èesceaft mÇ£te',
'nocreate-loggedin' => 'Þū ne hæfst þafunge to scieppenne nīƿa sīdan.',
'permissionserrors' => 'Þafunga Æ¿Åh',
'permissionserrorstext-withaction' => 'Þū ne hæfst þafunge for $2, forþǣm þe {{PLURAL:$1|race|racum}}:',
@@ -636,6 +631,9 @@ folcliÄ‹um Ägnunge oþþe ÈelÄ«Ä‹um frÄ“om horde (sÄ“o $1 for Äscungum).
'grouppage-sysop' => '{{ns:project}}:Beƿitendas',
+# Special:Log/newusers
+'newuserlogpage' => 'BrÅ«cenda Èesceaft Èetalu',
+
# User rights log
'rightslog' => 'Brūcenda riht cranic',
@@ -838,9 +836,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Special:ActiveUsers
'activeusers' => 'HÆ¿ata brÅ«cenda Èetalu',
-# Special:Log/newusers
-'newuserlogpage' => 'BrÅ«cenda Èesceaft Èetalu',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Clīeƿen',
'listgrouprights-rights' => 'Riht',
@@ -878,13 +873,12 @@ Also see [[Special:WantedCategories|wanted categories]].',
'watching' => 'Ƿæccende...',
'unwatching' => 'Unƿæccende...',
-'enotif_newpagetext' => 'Þēos is nīƿu sīde.',
'enotif_impersonal_salutation' => '{{SITENAME}} brūcend',
-'changed' => 'hƿorfen',
-'created' => 'Èescapen',
'enotif_lastvisited' => 'Sēo $1 for eall hƿearfas siþþan þīn læst cyme.',
'enotif_lastdiff' => 'Sēo $1 to sēonne þisne hƿearf.',
'enotif_anon_editor' => 'uncūþ brūcend $1',
+'created' => 'Èescapen',
+'changed' => 'hƿorfen',
# Delete
'deletepage' => 'SÄ«dan Äfeorsian',
diff --git a/languages/messages/MessagesAnp.php b/languages/messages/MessagesAnp.php
index 20c22145..a62f0216 100644
--- a/languages/messages/MessagesAnp.php
+++ b/languages/messages/MessagesAnp.php
@@ -316,6 +316,9 @@ Hindi (hi)फ़िलहाल इस पनà¥à¤¨à¥‡ पर कोई साà¤
'grouppage-sysop' => '{{ns:project}}:पà¥à¤°à¤šà¤¾à¤²à¤•',
+# Special:Log/newusers
+'newuserlogpage' => 'नया सदसà¥à¤¯à¥Š के सूची',
+
# User rights log
'rightslog' => 'सदसà¥à¤¯ अधिकार सूची',
@@ -406,9 +409,6 @@ Hindi (hi)फ़िलहाल इस पनà¥à¤¨à¥‡ पर कोई साà¤
# Special:LinkSearch
'linksearch' => 'बाहरी कड़ी',
-# Special:Log/newusers
-'newuserlogpage' => 'नया सदसà¥à¤¯à¥Š के सूची',
-
# Special:ListGroupRights
'listgrouprights-members' => '(सदसà¥à¤¯ सूची)',
diff --git a/languages/messages/MessagesAr.php b/languages/messages/MessagesAr.php
index 7837b824..1d8de505 100644
--- a/languages/messages/MessagesAr.php
+++ b/languages/messages/MessagesAr.php
@@ -15,6 +15,7 @@
* @author Ali1
* @author Alnokta
* @author Antime
+ * @author Arjanizary
* @author Avocato
* @author Bassem JARKAS
* @author Chaos
@@ -47,8 +48,10 @@
* @author Riadismet
* @author Samer
* @author Sami Lab
+ * @author TTMTT
* @author Tarawneh
* @author TheEgyptian
+ * @author Tux-tn
* @author Uwe a
* @author Zack wadghiri
* @author Zanatos
@@ -194,7 +197,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__لصق_Ùهرس__', '__FORCETOC__' ),
'toc' => array( '0', '__Ùهرس__', '__TOC__' ),
'noeditsection' => array( '0', '__لاتحريرقسم__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__لاعنوان__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'شهر_حالي', 'شهر_حالي2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'شهر_حالي1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'اسم_الشهر_الحالي', 'CURRENTMONTHNAME' ),
@@ -421,7 +423,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'أحدث_التغييرات' ),
'Recentchangeslinked' => array( 'أحدث_التغييرات_الموصولة', 'تغييرات_مرتبطة' ),
'Revisiondelete' => array( 'حذÙ_مراجعة' ),
- 'RevisionMove' => array( 'نقل_مراجعة' ),
'Search' => array( 'بحث' ),
'Shortpages' => array( 'صÙحات_قصيرة' ),
'Specialpages' => array( 'صÙحات_خاصة' ),
@@ -603,6 +604,7 @@ $messages = array(
'newwindow' => '(تÙتح ÙÙŠ ناÙذة جديدة)',
'cancel' => 'ألغÙ',
'moredotdotdot' => 'المزيد...',
+'morenotlisted' => 'يوجد المزيد غير مسرود...',
'mypage' => 'صÙحة',
'mytalk' => 'نقاش',
'anontalk' => 'النقاش لعنوان الأيبي هذا',
@@ -614,7 +616,6 @@ $messages = array(
'qbbrowse' => 'تصÙØ­',
'qbedit' => 'حرّر',
'qbpageoptions' => 'هذه الصÙحة',
-'qbpageinfo' => 'سياق النص',
'qbmyoptions' => 'صÙحاتي',
'qbspecialpages' => 'الصÙحات الخاصة',
'faq' => 'الأسئلة المتكررة',
@@ -637,6 +638,7 @@ $messages = array(
'namespaces' => 'Ùضاءات التسمية',
'variants' => 'المتغيرات',
+'navigation-heading' => 'قائمة التصÙØ­',
'errorpagetitle' => 'خطأ',
'returnto' => 'ارجع إلى $1.',
'tagline' => 'من {{SITENAME}}',
@@ -882,11 +884,11 @@ $2',
# Login and logout pages
'logouttext' => "'''أنت الآن غير مسجل الدخول.'''
-تستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو [[Special:UserLogin|الدخول مرة أخرى]] بنÙس الاسم أو باسم آخر.
+تستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو <span class='plainlinks'>[$1 الدخول مرة أخرى]</span> بنÙس الاسم أو باسم آخر.
من الممكن أن ترى بعض الصÙحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإÙراغ الصÙحات المختزنة ÙÙŠ المتصÙØ­ لديك.",
-'welcomecreation' => '== مرحبا، $1! ==
-تم إنشاء حسابك.
-لا تنس أن تغير [[Special:Preferences|تÙضيلاتك ÙÙŠ {{SITENAME}}]].',
+'welcomeuser' => 'أهلاً بك يا $1!',
+'welcomecreation-msg' => 'تم إنشاء حسابك.
+لا تنس تعديل [[Special:Preferences|تÙضيلاتك ÙÙŠ {{SITENAME}}]].',
'yourname' => 'اسم المستخدم:',
'yourpassword' => 'كلمة السر:',
'yourpasswordagain' => 'أعد كتابة كلمة السر:',
@@ -909,7 +911,7 @@ $2',
'gotaccount' => "لديك حساب؟ '''$1'''.",
'gotaccountlink' => 'تسجيل الدخول',
'userlogin-resetlink' => 'نسيت تÙاصيل الدخول؟',
-'createaccountmail' => 'بواسطة البريد الإلكتروني',
+'createaccountmail' => 'استخدم كلمة سر عشوائية مؤقتة وارسلها إلى عنوان البريد الإلكتروني المحدد أدناه',
'createaccountreason' => 'السبب:',
'badretype' => 'كلمات السر التي أدخلتها لا تتطابق.',
'userexists' => 'اسم المستخدم الذي تم إدخاله مستعمل بالÙعل.
@@ -988,6 +990,7 @@ $2',
# Email sending
'php-mail-error-unknown' => "خطأ غير معرو٠ÙÙŠ وظيÙØ© البريد PHP's mail()",
'user-mail-no-addy' => 'لقد حاولت إرسال بريد إلكتروني دون عنوان بريد إلكتروني.',
+'user-mail-no-body' => 'محاول ارسال بريد إلكتروني Ùارغ أو ذو نص قصير.',
# Change password dialog
'resetpass' => 'تغيير كلمة السر',
@@ -1046,6 +1049,7 @@ $2
'changeemail-oldemail' => 'عنوان البريد الإلكتروني الحالي:',
'changeemail-newemail' => 'عنوان البريد الإلكتروني الجديد:',
'changeemail-none' => '(لا شيء)',
+'changeemail-password' => 'كلمة سر {{SITENAME}} الخاصة بك:',
'changeemail-submit' => 'غيّر البريد الإلكتروني',
'changeemail-cancel' => 'إلغاء',
@@ -1235,7 +1239,6 @@ $2
'template-semiprotected' => '(حماية جزئية)',
'hiddencategories' => '{{PLURAL:$1|هذه الصÙحة غير موجودة ÙÙŠ أي تصناي٠مخÙية|هذه الصÙحة موجودة ÙÙŠ تصني٠مخÙÙŠ واحد|هذه الصÙحة موجودة ÙÙŠ تصنيÙين مخÙيين|هذه الصÙحة موجودة ÙÙŠ $1 تصاني٠مخÙية|هذه الصÙحة موجودة ÙÙŠ $1 تصنيÙا مخÙيا|هذه الصÙحة موجودة ÙÙŠ $1 تصني٠مخÙÙŠ}}:',
'edittools' => '<!-- النص هنا سيظهر تحت صندوق التحرير واستمارة رÙع الصور. -->',
-'nocreatetitle' => 'تم تحديد إنشاء الصÙحات',
'nocreatetext' => 'قام {{SITENAME}} بتحديد القدرة على إنشاء صÙحات جديدة.
يمكنك العودة وتحرير صÙحة موجودة بالÙعل، أو [[Special:UserLogin|الدخول أو تسجيل حساب]].',
'nocreate-loggedin' => 'أنت لا تمتلك الصلاحية لإنشاء صÙحات جديدة.',
@@ -1260,6 +1263,15 @@ $2
'edit-already-exists' => 'لم يمكن إنشاء صÙحة جديدة.
هي موجودة بالÙعل.',
'defaultmessagetext' => 'نص الرسالة الاÙتراضي',
+'content-failed-to-parse' => 'Ùشل ÙÙŠ تحليل $2 محتوى لـ $1 نموذج: $3',
+'invalid-content-data' => 'بيانات المحتوى غير صالحة',
+'content-not-allowed-here' => '"$1" المحتوى غير مسموح على صÙحة [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'نص ويكي',
+'content-model-text' => 'نص عادي',
+'content-model-javascript' => 'جاÙاسكربت',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''تحذير:''' هذه الصÙحة تحتوي على استدعاءات دالة محلل كثيرة مكلÙØ©.
@@ -1630,9 +1642,9 @@ $1",
'prefs-emailconfirm-label' => 'تأكيد البريد الإلكتروني:',
'prefs-textboxsize' => 'حجم ناÙذة التحرير',
'youremail' => 'البريد:',
-'username' => 'اسم المستخدم:',
-'uid' => 'رقم المستخدم:',
-'prefs-memberingroups' => 'عضو ÙÙŠ {{PLURAL:$1|مجموعة|مجموعة|مجموعتي|مجموعات}}:',
+'username' => '{{GENDER:$1|اسم المستخدم|اسم المستخدمة}}:',
+'uid' => 'رقم {{GENDER:$1|المستخدم|المستخدمة}}:',
+'prefs-memberingroups' => '{{GENDER:$2|عضو|عضوة}} ÙÙŠ {{PLURAL:$1|مجموعة|مجموعة|مجموعتي|مجموعات}}:',
'prefs-registration' => 'وقت التسجيل:',
'yourrealname' => 'الاسم الحقيقي:',
'yourlanguage' => 'اللغة:',
@@ -1781,12 +1793,13 @@ $1",
'right-sendemail' => 'إرسال رسائل بريد إلكتروني إلى مستخدمين آخرين',
'right-passwordreset' => 'عرض رسائل إعادة ضبط كلمات السر',
+# Special:Log/newusers
+'newuserlogpage' => 'سجل إنشاء المستخدمين',
+'newuserlogpagetext' => 'هذا سجل بعمليات إنشاء المستخدمين.',
+
# User rights log
'rightslog' => 'سجل صلاحيات المستخدمين',
'rightslogtext' => 'هذا سجل بالتغييرات ÙÙŠ صلاحيات المستخدمين.',
-'rightslogentry' => 'غير صلاحيات $1 من $2 إلى $3',
-'rightslogentry-autopromote' => 'تمت ترقيته تلقائيا من $2 إلى $3',
-'rightsnone' => '(لا شيء)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'قراءة هذه الصÙحة',
@@ -2032,6 +2045,7 @@ $1',
'backend-fail-notsame' => 'يوجد بالÙعل مل٠غير متطابق ÙÙŠ $1.',
'backend-fail-invalidpath' => '$1 ليس مساراً صالحاً للتخزين.',
'backend-fail-delete' => 'لم يمكن حذ٠المل٠$1.',
+'backend-fail-describe' => 'لا يمكن تغيير البيانات التعري٠(metadata) للمل٠" $1 ".',
'backend-fail-alreadyexists' => 'المل٠$1 موجود بالÙعل.',
'backend-fail-store' => 'لا يمكن تخزين المل٠$1 ÙÙŠ $2 .',
'backend-fail-copy' => 'لا يمكن نسخ المل٠$1 إلى $2 .',
@@ -2272,6 +2286,12 @@ $1',
ربما ينبغي أن تصل إلى صÙحة أكثر ملائمة. <br />
تعامل الصÙحة كصÙحة توضيح إذا كان بها قالب موجود ÙÙŠ [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'صÙحات مع خاصية الصÙحة',
+'pageswithprop-legend' => 'صÙحات مع خاصية الصÙحة',
+'pageswithprop-text' => 'تسرد هذه الصÙحة الصÙحات التي تستخدم خاصية صÙحة معينة.',
+'pageswithprop-prop' => 'اسم الخاصية:',
+'pageswithprop-submit' => 'اذهب',
+
'doubleredirects' => 'تحويلات مزدوجة',
'doubleredirectstext' => 'هذه الصÙحة تعرض الصÙحات التي تحول إلى صÙحات تحويل أخرى.
كل سطر يحتوي على وصلات للتحويلة الأولى والثانية وهد٠التحويلة الثانية، والذي عادة ما يشير إلى صÙحة الهد٠"الحقيقية"ØŒ التي من المÙترض أن تحول إليها التحويلة الأولى.
@@ -2426,7 +2446,7 @@ $1',
'linksearch-ok' => 'بحث',
'linksearch-text' => 'Wildcards مثل "*.wikipedia.org" يمكن استخدامها.
تحتاج على الأقل إلى نطاق ذو مستوى أعلى، كمثال "*.org".<br />
-البروتوكولات المدعومة: <code>$1</code> (لا تقم بإضاÙØ© أي من هذه إلى بحثك).',
+{{PLURAL:$2|البروتوكول المدعوم|البروتوكولان المدعومان|البروتوكولات المدعومة}}: <code>$1</code> (تتم إضاÙØ© http:// تلقائيا عند عدم تحديد أي بروتوكول).',
'linksearch-line' => '$1 موصولة من $2',
'linksearch-error' => 'الكروت الخاصة يمكن أن تظهر Ùقط ÙÙŠ بداية اسم المضيÙ.',
@@ -2445,10 +2465,6 @@ $1',
'activeusers-hidesysops' => 'أخ٠الإداريين',
'activeusers-noresult' => 'لم يعثر على أي مستخدمين',
-# Special:Log/newusers
-'newuserlogpage' => 'سجل إنشاء المستخدمين',
-'newuserlogpagetext' => 'هذا سجل بعمليات إنشاء المستخدمين.',
-
# Special:ListGroupRights
'listgrouprights' => 'صلاحيات مجموعات المستخدمين',
'listgrouprights-summary' => 'التالي قائمة بمجموعات المستخدمين المعرÙØ© ÙÙŠ هذا الويكي، بصلاحياتهم المصاحبة.
@@ -2543,18 +2559,25 @@ $1',
'enotif_mailer' => 'نظام {{SITENAME}} البريدي للإخطارات',
'enotif_reset' => 'علم على كل الصÙحات كمزارة',
-'enotif_newpagetext' => 'هذه صÙحة جديدة.',
'enotif_impersonal_salutation' => 'مستخدم {{SITENAME}}',
-'changed' => 'غيرت',
-'created' => 'أنشئت',
-'enotif_subject' => 'صÙحة {{SITENAME}} $PAGETITLE $CHANGEDORCREATED بواسطة $PAGEEDITOR',
+'enotif_subject_deleted' => 'الصÙحة {{SITENAME}} $1 حذÙها {{الجنس: $2 | $2 }}',
+'enotif_subject_created' => 'الصÙحة {{SITENAME}} $1 أنشأها {{الجنس: $2 | $2 }}',
+'enotif_subject_moved' => 'صÙحة {{SITENAME}} $1 {{GENDER:$2|نقلها|نقلتها}} $2',
+'enotif_subject_restored' => 'صÙحة {{SITENAME}} $1 {{GENDER:$2|استرجعها|استرجعتها}} $2',
+'enotif_subject_changed' => 'صÙحة {{SITENAME}} $1 {{GENDER:$2|عدلها|عدلتها}} $2',
+'enotif_body_intro_deleted' => 'صÙحة {{SITENAME}} $1 {{GENDER:$2|حذÙها|حذÙتها}} $2 ÙÙŠ $PAGEEDITDATE.راجع $3.',
+'enotif_body_intro_created' => 'صÙحة {{SITENAME}} $1 {{GENDER:$2|أنشأها|أنشأتها}} $2 ÙÙŠ $PAGEEDITDATE. لمشاهدة النسخة الحالية راجع $3.',
+'enotif_body_intro_moved' => 'صÙحة {{SITENAME}} $1 {{GENDER:$2|نقلها|نقلتها}} $2 ÙÙŠ $PAGEEDITDATE. لمشاهدة النسخة الحالية راجع $3.',
+'enotif_body_intro_restored' => 'صÙحة {{SITENAME}} $1 {{GENDER:$2|استرجعها|استرجعتها}} $2 ÙÙŠ $PAGEEDITDATE. لمشاهدة النسخة الحالية راجع $3.',
+'enotif_body_intro_changed' => 'صÙحة {{SITENAME}} $1 {{GENDER:$2|عدلها|عدلتها}} $2 ÙÙŠ $PAGEEDITDATE. لمشاهدة النسخة الحالية راجع $3.',
'enotif_lastvisited' => 'انظر $1 لكل التغييرات منذ زيارتك الأخيرة.',
'enotif_lastdiff' => 'انظر $1 لرؤية هذا التغيير.',
'enotif_anon_editor' => 'مستخدم مجهول $1',
'enotif_body' => 'عزيزي $WATCHINGUSERNAME
-صÙحة $PAGETITLE قد $CHANGEDORCREATED ÙÙŠ $PAGEEDITDATE بواسطة $PAGEEDITOR, انظر $PAGETITLE_URL للنسخة الحالية
-ملخص التعديل: $PAGESUMMARY $PAGEMINOREDIT
+$PAGEINTRO $NEWPAGE
+
+ملخص التعديل: $PAGESUMMARY $PAGEMINOREDIT
الاتصال بالمحرر:
البريد: $PAGEEDITOR_EMAIL
@@ -2563,7 +2586,7 @@ $1',
لن يكون هناك إخطارات أخرى ÙÙŠ حالة حدوث مزيد من التغييرات إلا إذا قمت بزيارة تلك الصÙحة.
يمكنك أيضاً إزالة العلامات عن جميع الصÙحات ÙÙŠ قائمة مراقبتك.
- نظام {{SITENAME}} للإعلام بالبريد الإلكتروني
+ نظام {{SITENAME}} للإعلام بالبريد الإلكتروني
--
لتغيير إعدادات الإعلام بالبريد الإلكتروني الخاص بك، قم بزيارة
@@ -2575,8 +2598,10 @@ $1',
لحذ٠الصÙحة من قائمة مراقبتك، قم بزيارة
$UNWATCHURL
-التغذية المرتدة، والحصول على مساعدة إضاÙية:
+للمقترحات والحصول على مساعدة إضاÙية:
{{canonicalurl: {{MediaWiki:Helppage}}}}',
+'created' => 'أنشئت',
+'changed' => 'غيرت',
# Delete
'deletepage' => 'حذ٠الصÙحة',
@@ -2650,6 +2675,8 @@ $UNWATCHURL
'prot_1movedto2' => 'Ù†Ùقلت [[$1]] إلى [[$2]]',
'protect-badnamespace-title' => 'نطاق لا يحمى',
'protect-badnamespace-text' => 'صÙحات هذا النطاق لا يمكن حمايتها',
+'protect-norestrictiontypes-text' => 'لا يمكن حماية هذه الصÙحة لعدم تواÙر أنواع المحددات المطلوبة.',
+'protect-norestrictiontypes-title' => 'صÙحة غير قابلة للحماية',
'protect-legend' => 'تأكيد الحماية',
'protectcomment' => 'السبب:',
'protectexpiry' => 'تنتهي ÙÙŠ:',
@@ -2736,7 +2763,7 @@ $UNWATCHURL
'undeletedrevisions-files' => 'أسترجعت {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}} Ùˆ{{PLURAL:$2||مل٠واحد|ملÙان|$2 ملÙات|$2 ملÙًا|$2 ملÙ}}',
'undeletedfiles' => 'أسترجع {{PLURAL:$1||مل٠واحد|ملÙان|$1 ملÙات|$1 ملÙًا|$1 ملÙ}}',
'cannotundelete' => 'Ùشل الاسترجاع؛
-ربما قام شخص آخر باسترجاع الصÙحة بالÙعل.',
+$1',
'undeletedpage' => "'''تم استرجاع $1'''
راجع [[Special:Log/delete|سجل الحدÙ]] لمعاينة عمليات الحذ٠والاسترجاعات الحديثة.",
@@ -2768,7 +2795,7 @@ $1',
'blanknamespace' => '(رئيسي)',
# Contributions
-'contributions' => 'مساهمات المستخدم',
+'contributions' => 'مساهمات {{GENDER:$1|المستخدم|المستخدمة}}',
'contributions-title' => 'مساهمات {{GENDER:$1|المستخدم|المستخدمة}} $1',
'mycontris' => 'مساهماتي',
'contribsub2' => 'Ù„$1 ($2)',
@@ -3046,6 +3073,7 @@ $1',
'immobile-target-namespace-iw' => 'وصلة الإنترويكي ليست هدÙاً صالحاً لنقل صÙحة.',
'immobile-source-page' => 'هذه الصÙحة غير قابلة للنقل.',
'immobile-target-page' => 'غير قادر على النقل إلى العنوان الوجهة هذا.',
+'bad-target-model' => 'الوجهة المطلوبة تستخدم نموذج محتوى مختلÙ. لا يمكن تحويل من $1 إلى $2.',
'imagenocrossnamespace' => 'لا يمكن نقل المل٠إلى نطاق غير نطاق الملÙات',
'nonfile-cannot-move-to-file' => 'لا يمكن نقل غير الملÙات إلى نطاق الملÙات',
'imagetypemismatch' => 'امتداد المل٠الجديد لا يطابق نوعه',
@@ -3160,6 +3188,7 @@ $1',
'import-error-interwiki' => 'تعذر أستيراد الصÙحة "$1" بسبب أن إسمها محجوز للربط الخارجي (interwiki).',
'import-error-special' => 'صÙحة "$1" لم تستورد لأنها تنتمي إلى نطاق خاص يمنع الصÙحات.',
'import-error-invalid' => 'تعذر أستيراد الصÙحة "$1" بسبب أن إسمها غير صحيح.',
+'import-error-unserialize' => 'مراجعة $2 من صÙحة " $1 " لا يمكن أن يكون أونسيرياليزيد. وأÙيد المراجعة استخدام طراز المحتوى $3 تسلسل Ùƒ $4 .',
'import-options-wrong' => 'خطأ {{PLURAL:$2|خيار|خيارات}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'إن عنوان الصÙحة الجذر المعطاة هي ذات عنوان غير صالح.',
'import-rootpage-nosubpage' => 'إن النطاق "$1" لصÙحة الجذر لا يسمح بصÙحات Ùرعية.',
@@ -3174,7 +3203,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'اختبار جاÙاسكربت',
-'javascripttest-disabled' => 'هذه الخاصية معطلة.',
'javascripttest-title' => 'تشغيل أختبارات $1',
'javascripttest-pagetext-noframework' => 'هذه الصÙحة محجوزة لإجراء أختبارات الجاÙا سكريبت.',
'javascripttest-pagetext-unknownframework' => 'إطار اختبار غير معرو٠"$1".',
@@ -3325,11 +3353,13 @@ $1',
'pageinfo-default-sort' => 'Ù…Ùتاح الترتيب الاÙتراضي',
'pageinfo-length' => 'حجم الصÙحة (بالبايت)',
'pageinfo-article-id' => 'معر٠الصÙحة (ID)',
+'pageinfo-language' => 'لغة محتوى الصÙحة',
'pageinfo-robot-policy' => 'الصÙØ© ÙÙŠ محرك البحث',
'pageinfo-robot-index' => 'قابلة للÙهرسة',
'pageinfo-robot-noindex' => 'غير قابلة للÙهرسة',
'pageinfo-views' => 'عدد المشاهدات',
'pageinfo-watchers' => 'عدد المراقبين',
+'pageinfo-few-watchers' => 'أقل من {{PLURAL:$1||مراقب واحد|مراقبين اثنين|$1 مراقبين|$1 مراقباً|$1 مراقب}}',
'pageinfo-redirects-name' => 'التحويلات إلى هذه الصÙحة',
'pageinfo-subpages-name' => 'الصÙحات الÙرعية لهذه الصÙحة',
'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|لا تحويلات|تحويلة واحدة|تحويلتان|$2 تحويلات|$2 تحويلة}}؛ $3 {{PLURAL:$3|من غير التحويلات}})',
@@ -3344,6 +3374,19 @@ $1',
'pageinfo-magic-words' => '{{PLURAL:$1|لا كلمات سحرية|الكلمة|الكلمات}} السحرية ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|لا تصنيÙات مخÙية|التصني٠المخÙÙŠ|التصنيÙان المخÙيان|التصنيÙات المخÙية ($1)}}',
'pageinfo-templates' => '{{PLURAL:$1|لا قوالب مضمنة|القالب المضمن|القالبان المضمنان|القوالب المضمنة ($1)}}',
+'pageinfo-transclusions' => '{{PLURAL:$1||صÙحة واحدة|صÙحتين|$1 صÙحات|$1 صÙحة}} مضمنة ÙÙŠ ($1)',
+'pageinfo-toolboxlink' => 'معلومات عن هذه الصÙحة',
+'pageinfo-redirectsto' => 'تحويلة إلى',
+'pageinfo-redirectsto-info' => 'معلومات',
+'pageinfo-contentpage' => 'محسوبة كصÙحة محتوى',
+'pageinfo-contentpage-yes' => 'نعم',
+'pageinfo-protect-cascading' => 'مصدر توريث الحماية للصÙحات المدمجة',
+'pageinfo-protect-cascading-yes' => 'نعم',
+'pageinfo-protect-cascading-from' => 'حماية الصÙحات المدمجة موروثة من',
+'pageinfo-category-info' => 'معلومات التصنيÙ',
+'pageinfo-category-pages' => 'عدد الصÙحات',
+'pageinfo-category-subcats' => 'عدد التصنيÙات الÙرعية',
+'pageinfo-category-files' => 'عدد الملÙات',
# Skin names
'skinname-standard' => 'كلاسيك',
@@ -3366,6 +3409,8 @@ $1',
'markedaspatrollederror' => 'لا يمكن التعليم بالمراجعة',
'markedaspatrollederrortext' => 'يجب عليك اختيار المراجعة التي تريد أن تشير أنها مراجعة',
'markedaspatrollederror-noautopatrol' => 'لا يجوز لك تعليم تغييراتك الشخصية بعلامة المراجعة.',
+'markedaspatrollednotify' => 'هذا التغيير لـ $1 تم تعليمه كمراقب.',
+'markedaspatrollederrornotify' => 'لم ينجح وسم هذه النسخة بأنها مراجعة',
# Patrol log
'patrol-log-page' => 'سجل الخÙر',
@@ -3398,6 +3443,7 @@ $1',
'file-nohires' => 'لا توجد دقة أعلى متوÙرة.',
'svg-long-desc' => 'مل٠SVGØŒ أبعاده $1 × $2 بكسل، حجم الملÙ: $3',
'svg-long-desc-animated' => 'مل٠SVG متحرك، بمقاسات $1 × $2 بكسل، حجم الملÙ: $3',
+'svg-long-error' => 'مل٠SVG غير صالح: $1',
'show-big-image' => 'دقة كاملة',
'show-big-image-preview' => 'حجم هذه المعاينة: $1.',
'show-big-image-other' => '{{PLURAL:$2||البعد الآخر|البعدان الآخران|الأبعاد الأخرى}}: $1.',
@@ -3432,7 +3478,10 @@ $1',
'minutes' => '{{PLURAL:$1||دقيقة واحدة|دقيقتين|$1 دقائق|$1 دقيقة}}',
'hours' => '{{PLURAL:$1||ساعة واحدة|ساعتين|$1 ساعات|$1 ساعة}}',
'days' => '{{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}}',
+'months' => '{{PLURAL:$1||شهر واحد|شهرين|$1 شهور|$1 شهرا|$1 شهر}}',
+'years' => '{{PLURAL:$1||سنة واحدة|سنتين|$1 سنين|$1 سنة}}',
'ago' => 'قبل $1',
+'just-now' => 'الآن Ùقط',
# Bad image list
'bad_image_list' => 'الصيغة كالتالي:
@@ -3965,6 +4014,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[التضمين بالإنترويكي معطل]',
'scarytranscludefailed' => '[البحث عن القالب Ùشل Ù„$1]',
+'scarytranscludefailed-httpstatus' => '[Ùشل جلب القالب لـ $1: HTTP $2]',
'scarytranscludetoolong' => '[المسار طويل للغاية]',
# Delete conflict
@@ -4164,6 +4214,7 @@ $5
'version-license' => 'الرخصة',
'version-poweredby-credits' => "تدار هذه الويكي ب'''[//www.mediawiki.org/ ميدياويكي]''', حقوق النشر © 2001-$1 $2.",
'version-poweredby-others' => 'آخرون',
+'version-credits-summary' => 'نود أن نعر٠بالأشخاص التالية أسماؤهم لمساهمتهم ÙÙŠ [[Special:Version|ميدياويكي]].',
'version-license-info' => "ميدياويكي برنامج حر، يحق لك توزيعه Ùˆ/أو تعديله ÙˆÙقاً لبنود رخصة غنو العمومية كما نشرتها مؤسسة البرمجيات الحرة، الإصدار الثاني أو (ÙˆÙقا لاختيارك أنت) أي إصدار لاحق.
هذا البرنامج يوزع على أمل أن يكون Ù…Ùيداً، ولكن '''دون أية ضمانات'''ØŒ بما ÙÙŠ ذلك ضمانات '''التسويق''' أو '''الملاءمة لغرض معين'''. انظر رخصة غنو العمومية لمزيد من التÙاصيل.
@@ -4280,15 +4331,15 @@ $5
'sqlite-no-fts' => '$1 بدون دعم البحث ÙÙŠ كامل النص',
# New logging system
-'logentry-delete-delete' => '$1 حذ٠الصÙحة $3',
-'logentry-delete-restore' => 'استعاد $1 صÙحة $3',
-'logentry-delete-event' => '$1 غير خاصية العرض لـ {{PLURAL:$5|مدخل السجل|$5 مدخلات السجل}} ÙÙŠ $3: $4',
-'logentry-delete-revision' => 'غيّر $1 إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} ÙÙŠ صÙحة $3: $4',
-'logentry-delete-event-legacy' => 'غيّر $1 إمكانية رؤية أحداث سجل $3',
-'logentry-delete-revision-legacy' => 'غيّر $1 إمكانية رؤية مراجعات صÙحة $3',
-'logentry-suppress-delete' => '$1 suppressed صÙحة $3',
-'logentry-suppress-event' => 'غيّر $1 بسرية إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} ÙÙŠ سجل $3: $4',
-'logentry-suppress-revision' => 'غيّر $1 بسرية إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} ÙÙŠ صÙحة $3: $4',
+'logentry-delete-delete' => '{{GENDER:$2|حذÙ|حذÙت}} $1 صÙحة $3',
+'logentry-delete-restore' => '{{GENDER:$2|استعاد|استعادت}} $1 صÙحة $3',
+'logentry-delete-event' => '{{GENDER:$2|غيّر|غيّرت}} $1 إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} ÙÙŠ سجل $3: $4',
+'logentry-delete-revision' => 'غيّر{{GENDER:$2||ت}} $1 إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} ÙÙŠ صÙحة $3: $4',
+'logentry-delete-event-legacy' => '{{GENDER:$2|غيّر|غيّرت}} $1 إمكانية رؤية أحداث ÙÙŠ سجل $3',
+'logentry-delete-revision-legacy' => '{{GENDER:$2|غيّر|غيّرت}} $1 إمكانية رؤية مراجعات من صÙحة $3',
+'logentry-suppress-delete' => '{{GENDER:$2|أخÙÙ‰|أخÙت}} $1 صÙحة $3',
+'logentry-suppress-event' => 'غيّر{{GENDER:$2||ت}} $1 بسرية إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} ÙÙŠ سجل $3: $4',
+'logentry-suppress-revision' => 'غيّر{{GENDER:$2||ت}} $1 سراً إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} ÙÙŠ صÙحة $3: $4',
'logentry-suppress-event-legacy' => 'غيّر $1 بسرية إمكانية رؤية أحداث سجل $3',
'logentry-suppress-revision-legacy' => 'غيّر $1 بسرية إمكانية رؤية مراجعات صÙحة $3',
'revdelete-content-hid' => 'محتوى مخÙÙŠ',
@@ -4308,8 +4359,12 @@ $5
'logentry-newusers-newusers' => 'تم إنشاء الحساب $1',
'logentry-newusers-create' => 'تم إنشاء الحساب $1',
'logentry-newusers-create2' => 'أنشأ $1 الحساب $3',
+'logentry-newusers-byemail' => 'Ù{{GENDER:$2|أنشأ|أنشأت}} $1 حساب المستخدم $3 وأÙرسلت كلمة السر بالبريد الإلكتروني',
'logentry-newusers-autocreate' => 'أنشئ حساب $1 تلقائياً',
-'newuserlog-byemail' => 'كلمة السر تم إرسالها بواسطة البريد الإلكتروني',
+'logentry-rights-rights' => 'غير $1 صلاحيات $3 من $4 إلى $5',
+'logentry-rights-rights-legacy' => 'غير $1 صلاحيات $3',
+'logentry-rights-autopromote' => 'تمت ترقية $1 تلقائياً من $4 إلى $5',
+'rightsnone' => '(لا شيء)',
# Feedback
'feedback-bugornote' => 'إن كنت مستعدا لشرح مشكلة تقنية بالتÙصيل، رجاءا [$1 قدم تقريرا بالخلل].
@@ -4363,6 +4418,7 @@ $5
'api-error-ok-but-empty' => 'خطأ داخلي : لم يكن هناك استجابة من الملقم.',
'api-error-overwrite' => 'لا يسمح بالكتابة Ùوق مل٠موجود.',
'api-error-stashfailed' => 'خطأ داخلي: Ùشل الملقم ÙÙŠ تخزين الملÙات المؤقتة.',
+'api-error-publishfailed' => 'خطأ داخلي: لم ينجح الخادوم ÙÙŠ نشر مل٠مؤقت',
'api-error-timeout' => 'لم يستجب الملقم ÙÙŠ الوقت المتوقع.',
'api-error-unclassified' => 'حدث خطأ غير معروÙ',
'api-error-unknown-code' => 'خطأ غير معرو٠: " $1 "',
@@ -4383,4 +4439,7 @@ $5
'duration-centuries' => '{{PLURAL: $1||قرن واحد|قرنان|$1 قرون|$1 قرنًا|$1 قرن}}',
'duration-millennia' => '{{PLURAL: $1||ألÙية واحدة|ألÙيتان|$1 ألÙيات|$1 ألÙية}}',
+# Image rotation
+'rotate-comment' => 'تدوير الصورة {{PLURAL:$1||درجة واحدة|درجتان|$1 درجات|$1 درجة}} باتجاه عقارب الساعة',
+
);
diff --git a/languages/messages/MessagesArc.php b/languages/messages/MessagesArc.php
index 0fa76a14..18a2f45c 100644
--- a/languages/messages/MessagesArc.php
+++ b/languages/messages/MessagesArc.php
@@ -44,36 +44,67 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'Activeusers' => array( 'ܡܦܠܚܢ̈Ü_ܙܪ̄ÜÜ™Ü' ),
- 'Allmessages' => array( 'ÜŸÜ _Üܓܪ̈ܬÜ' ),
- 'Allpages' => array( 'ÜŸÜ _ܦÜܬܬ̈Ü' ),
+ 'Activeusers' => array( 'ܡܦܠܚܢ̈Ü_ܙܪ̈ÜÜ™Ü' ),
+ 'Allmessages' => array( 'ÜŸÜ Ü—ÜÜ¢_Üܓܪ̈ܬÜ' ),
+ 'Allpages' => array( 'ÜŸÜ Ü—ÜÜ¢_ܦÜܬܬ̈Ü' ),
+ 'Ancientpages' => array( 'ܦÜܬܬ̈Ü_ܥܬÜܩ̈ܬÜ' ),
'Badtitle' => array( 'ܟܘܢÜÜ_Ü Ü_ܛܒÜ' ),
'Blankpage' => array( 'ܦÜܬÜ_ܣܦÜܩܬÜ' ),
+ 'BrokenRedirects' => array( 'ܨܘÜܒ̈Ü_ܬܒÜܪ̈Ü' ),
'Categories' => array( 'ܣܕܪ̈Ü' ),
- 'Contributions' => array( 'ܫܘܬܦܘÜܬ̈Ü' ),
+ 'ChangeEmail' => array( 'ܫܚܠܦ_Ü’ÜܠܕܪÜ_ÜܠܩܛܪܘܢÜÜ' ),
+ 'ComparePages' => array( 'ܦܚܡ_Ü’Üܢܬ_ܦÜܬܬ̈Ü' ),
+ 'Confirmemail' => array( 'ܫܪܪ_Ü’ÜܠܕܪÜ_ÜܠܩܛܪܘܢÜÜ' ),
+ 'Contributions' => array( 'ܫܘܬܦܘ̈ܬÜ' ),
'CreateAccount' => array( 'ܒܪÜ_ܚܘܫܒܢÜ' ),
- 'DeletedContributions' => array( 'ܫܘܬܦܘÜܬ̈Ü_Ü«Üܦܬ̈Ü' ),
+ 'Deadendpages' => array( 'ܦÜܬܬ̈Ü_ܥܡ_ܚܪܬÜ_Ü¡ÜܬܬÜ' ),
+ 'DeletedContributions' => array( 'ܫܘܬܦܘ̈ܬÜ_Ü«Ü̈ܦܬÜ' ),
+ 'Disambiguations' => array( 'ܬܘܚܡ̈Ü_Üܚܪ̈ܢÜ' ),
+ 'DoubleRedirects' => array( 'ܨܘÜܒ̈Ü_ܥܦÜ̈ܦÜ' ),
+ 'EditWatchlist' => array( 'ܫܚܠܦ_ܪ̈ܗÜܬÜ' ),
+ 'Emailuser' => array( 'ܫܕܪ_Ü’ÜܠܕܪÜ_ÜܠܩܛܪܘܢÜÜ_ܠܡܦܠܚܢÜ' ),
+ 'Fewestrevisions' => array( 'ܬܢÜ̈ܬÜ_ܒܨÜܪ_Ü¡Ü¢_ÜŸÜ ' ),
'Filepath' => array( 'Ü«Ü’ÜÜ Ü_ܕܦÜܬÜ' ),
'Log' => array( 'ܣܓܠÜ', 'ܣܓܠ̈Ü' ),
- 'Lonelypages' => array( 'ܦÜܬܬ̈Ü_Üܬܡܬ̈Ü' ),
+ 'Lonelypages' => array( 'ܦÜܬܬ̈Ü_Üܬܡ̈ܬÜ' ),
'Longpages' => array( 'ܦÜܬܬ̈Ü_Üܪ̈ÜܟܬÜ' ),
+ 'Mostlinkedcategories' => array( 'ܣܕܪ̈Ü_ÜÜ£Üܪ̈Ü_ÜܬÜܪ_Ü¡Ü¢_ÜŸÜ ', 'ܣܕܪ̈Ü_ܦܠÜܚ̈Ü_ÜܬÜܪ_Ü¡Ü¢_ÜŸÜ ' ),
+ 'Mostlinkedtemplates' => array( 'ܩܠܒ̈Ü_ÜÜ£Üܪ̈Ü_ÜܬÜܪ_Ü¡Ü¢_ÜŸÜ ', 'ܩܠܒ̈Ü_ܦܠÜܚ̈Ü_ÜܬÜܪ_Ü¡Ü¢_ÜŸÜ ' ),
+ 'Mostrevisions' => array( 'ܬܢÜ̈ܬÜ_ÜܬÜܪ_Ü¡Ü¢_ÜŸÜ ' ),
'Movepage' => array( 'Ü«Ü¢Ü_ܦÜܬÜ' ),
- 'Mycontributions' => array( 'ܫܘܬܦܘÜܬ̈Ü' ),
+ 'Mycontributions' => array( 'ܫܘܬܦܘ̈ܬÜ' ),
'Mypage' => array( 'ܦÜܬÜ_Ü•ÜÜ Ü' ),
'Mytalk' => array( 'Ü¡Ü¡Ü Ü Ü_Ü•ÜÜ Ü' ),
- 'Myuploads' => array( 'Üܣܩܬ̈Ü_Ü•ÜÜ Ü' ),
+ 'Myuploads' => array( 'Üܣܩ̈ܬÜ_Ü•ÜÜ Ü' ),
'Newimages' => array( 'ܠܦܦ̈Ü_ܚܕ̈ܬÜ', 'ܨܘܪ̈ܬÜ_ܚܕ̈ܬܬÜ' ),
'Newpages' => array( 'ܦÜܬܬ̈Ü_ܚܕ̈ܬܬÜ' ),
'PermanentLink' => array( 'ÜܣܘܪÜ_ܦÜܘܫÜ' ),
- 'Preferences' => array( 'ܨܒÜÜ¢Üܘܬ̈Ü' ),
+ 'Popularpages' => array( 'ܦÜܬܬ̈Ü_ܡܫܡܗ̈Ü' ),
+ 'Preferences' => array( 'ܨܒÜÜ¢Üܘ̈ܬÜ' ),
'Protectedpages' => array( 'ܦÜܬܬ̈Ü_ܢܛÜܪ̈ܬÜ' ),
'Protectedtitles' => array( 'ܟܘܢÜ̈Ü_ܢܛÜܪ̈Ü' ),
'Recentchanges' => array( 'ܫܘܚܠܦ̈Ü_ܚܕ̈ܬÜ' ),
'Search' => array( 'ܒܨÜÜ' ),
'Shortpages' => array( 'ܦÜܬܬ̈Ü_ܟܪ̈ÜܬÜ' ),
'Specialpages' => array( 'ܦÜܬܬ̈Ü_ܕ̈ÜܠܢÜܬÜ' ),
+ 'Statistics' => array( 'ܚܒÜܫܘܬ_Ü¡Ü¢ÜÜ¢Ü' ),
+ 'Uncategorizedcategories' => array( 'ܣܕܪ̈Ü_Ü Ü_ܣܕÜܪ̈Ü' ),
+ 'Uncategorizedimages' => array( 'ܠܦܦ̈Ü_Ü Ü_ܣܕÜܪ̈Ü', 'ܨܘܪ̈ܬÜ_Ü Ü_ܣܕÜܪ̈ܬÜ' ),
+ 'Uncategorizedpages' => array( 'ܦÜܬܬ̈Ü_Ü Ü_ܣܕÜܪ̈ܬÜ' ),
+ 'Uncategorizedtemplates' => array( 'ܩܠܒ̈Ü_Ü Ü_ܣܕÜܪ̈Ü' ),
+ 'Unusedcategories' => array( 'ܣܕܪ̈Ü_Ü Ü_ܦܠÜܚ̈Ü' ),
+ 'Unusedimages' => array( 'ܠܦܦ̈Ü_Ü Ü_ܦܠÜܚ̈Ü', 'ܨܘܪ̈ܬÜ_Ü Ü_ܦܠÜܚܬ̈Ü' ),
+ 'Unusedtemplates' => array( 'ܩܠܒ̈Ü_Ü Ü_ܦܠÜܚ̈Ü' ),
+ 'Unwatchedpages' => array( 'ܦÜܬܬ̈Ü_Ü Ü_ܣܢÜܩ̈ܬÜ' ),
'Upload' => array( 'Üܣܩ' ),
- 'Version' => array( 'ܨܚܚÜ' ),
+ 'Userlogin' => array( 'ܥܠܠÜ_ܕܡܦܠܚܢÜ' ),
+ 'Userlogout' => array( 'ܦܠܛÜ_ܕܡܦܠܚܢÜ' ),
+ 'Userrights' => array( 'ܙܕ̈ܩÜ_ܕܡܦܠܚܢÜ', 'ܥܒܕ_ܡܕܒܪܢÜ_ܕܛܟܣÜ', 'ܥܒܕ_ܒܘܛ' ),
+ 'Version' => array( 'ܡܦܩܬÜ' ),
+ 'Wantedcategories' => array( 'ܣܕܪ̈Ü_ܣܢÜܩ̈Ü' ),
+ 'Wantedfiles' => array( 'ܠܦܦ̈Ü_ܣܢÜܩ̈Ü' ),
+ 'Wantedpages' => array( 'ܦÜܬܬ̈Ü_ܣܢÜܩ̈ܬÜ', 'Üܣܘܪ̈Ü_ܬܒÜܪ̈Ü' ),
+ 'Wantedtemplates' => array( 'ܩܠܒ̈Ü_ܣܢÜܩ̈Ü' ),
'Watchlist' => array( 'ܪ̈ܗÜܬÜ' ),
'Whatlinkshere' => array( 'Ü¡Ü_Üܣܪ_ܠܗܪܟÜ' ),
);
@@ -237,6 +268,7 @@ $messages = array(
'namespaces' => 'ܚܩܠܬ̈Ü',
'variants' => 'ܡܫܬܚܠܦܢܘ̈ܬÜ',
+'navigation-heading' => 'Ü¡ÜŸÜ¬Ü’Ü˜Ü¬Ü Ü•ÜܠܦܪܘܬÜ',
'errorpagetitle' => 'ܦܘܕÜ',
'returnto' => 'ܕܥܘܪ ܠ$1.',
'tagline' => 'Ü¡Ü¢ {{SITENAME}}',
@@ -397,12 +429,10 @@ $1',
# Login and logout pages
'logouttext' => "'''Ü—Ü«Ü Ü¦Ü Ü›Ü ÜŸ Ü¡Ü¢ ܚܘܫܒܢܟ.'''
-ܡܨܬ Üܦܠܚܬ {{SITENAME}} ÜÜÜŸ Ü¡Ü¦Ü ÜšÜ¢Ü Ü Ü ÜÜ•ÜÜ¥Ü Üܘ ܡܨܬ Ü•[[Special:UserLogin|ܬܥܘܠ]] Ü’ÜšÜ˜Ü«Ü’Ü¢Ü Ü¥Üܢܗ Üܘ ÜÜÜŸ Ü¡Ü¦Ü ÜšÜ¢Ü ÜܚܪܢÜ.
+ܡܨܬ Üܦܠܚܬ {{SITENAME}} ÜÜÜŸ Ü¡Ü¦Ü ÜšÜ¢Ü Ü Ü ÜÜ•ÜÜ¥Ü Üܘ ܡܨܬ Ü•<span class='plainlinks'>[$1 ܬܥܘܠ]</span> Ü’ÜšÜ˜Ü«Ü’Ü¢Ü Ü¥Üܢܗ Üܘ ÜÜÜŸ Ü¡Ü¦Ü ÜšÜ¢Ü ÜܚܪܢÜ.
-ܚܕ ÜŸÜ¡Ü Ü¡Ü¢ ܦÜÜ¬Ü¬ÌˆÜ Ü¡Ü¬ÜšÜ™ÜÜ¢ ÜÜÜŸ ܕܗܘ Üܢܬ ܥܠÜÜ Ü ÜÜܬÜÜŸ Ü¥Ü•Ü¡Ü Ü•Üܣܦܩܬ ܠܦÜÜ¬Ü¬ÌˆÜ Ü Ü’ÜÜŸÜ¬ÌˆÜ Ü•Ü¡Ü¦ÜÜ¬Ü¢Ü Ü•ÜÜ ÜŸ",
-'welcomecreation' => '== Ü’Ü«ÜÜ¢Ü, $1! ==
-ÜÜ¬Ü’ÜªÜ ÜšÜ˜Ü«Ü’Ü¢ÜŸ.
-Ü Ü Ü¢Ü«Ü Üܢܬ Ü Ü«ÜšÜ Ü¦Ü¬Ü Ü•[[Special:Preferences|ܨܒÜÜ¢ÜÜ˜Ü¬ÌˆÜ Ü’ {{SITENAME}}]].',
+ܚܕ ÜŸÜ¡Ü Ü¡Ü¢ ܦÜÜ¬Ü¬ÌˆÜ Ü¡Ü¬ÜšÜ™ÜÜ¢ ÜÜÜŸ ܕܗܘ Üܢܬ ܥܠÜÜ Ü ÜÜܬÜÜŸ Ü¥Ü•Ü¡Ü Ü•Üܣܦܩܬ ܠܦÜÜ¬Ü¬ÌˆÜ Ü Ü’ÜÜŸÜ¬ÌˆÜ Ü•Ü¡Ü¦ÜÜ¬Ü¢Ü Ü•ÜÜ ÜŸ.",
+'welcomeuser' => 'Ü’Ü«ÜÜ¢Ü $1!',
'yourname' => 'Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü:',
'yourpassword' => 'Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü:',
'yourpasswordagain' => 'ܟܬܘܒ Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Ü™Ü’Ü¢Ü¬Ü ÜܚܪܬÜ:',
@@ -421,7 +451,7 @@ $1',
'gotaccount' => "ÜÜܬ Ü ÜŸ ܚܘܫܒܢÜØŸ '''$1'''.",
'gotaccountlink' => 'ܥܘܠ',
'userlogin-resetlink' => 'ÜܬܢܫÜܬ ÜÜ•ÌˆÜ¥Ü¬Ü Ü•Ü¥Ü Ü ÜØŸ',
-'createaccountmail' => 'Ü’ÜÜ• Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ',
+'createaccountmail' => 'Üܦܠܚ Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Ü™Ü’Ü¢Ü¢ÜÜ¬Ü Ü˜Ü«Ü•Üª Ü Ü— ܥܠ Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ Ü¬Ü˜ÜšÜ¡Ü Ü Ü¬ÜšÜ¬',
'createaccountreason' => 'ܥܠܬÜ',
'badretype' => 'Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü ÜŸÜ¬Ü’Ü¬ Üܢܬ Ü Ü ÜܘÜܢܬÜ.',
'userexists' => 'Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü Ü•Üܥܠܬ Ü«Ü©ÜÜ Ü ÜÜܬܘܗÜ.
@@ -723,9 +753,9 @@ $1',
'prefs-files' => 'ܠܦܦ̈Ü',
'prefs-emailconfirm-label' => 'Ü«Ü˜ÜªÜªÜ Ü•Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ:',
'youremail' => 'Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ:',
-'username' => 'Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü:',
-'uid' => 'Ü—ÜÜÜ˜Ü¬Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü:',
-'prefs-memberingroups' => 'Ü—Ü•Ü¡Ü Ü•{{PLURAL:$1|ܟܢܘܫܬÜ|ܟܢܘܫܬ̈Ü}}:',
+'username' => '{{GENDER:$1|Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü|Ü«Ü¡Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü¬Ü}}:',
+'uid' => 'Ü—ÜÜÜ˜Ü¬Ü Ü•{{GENDER:$1|ܡܦܠܚܢÜ|ܡܦܠܚܢܬÜ}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Ü—Ü•Ü¡Ü}} Ü•{{PLURAL:$1|ܟܢܘܫܬÜ|ܟܢܘܫܬ̈Ü}}:',
'prefs-registration' => 'Ü™Ü’Ü¢Ü Ü•Ü£Ü˜Ü“Ü Ü:',
'yourrealname' => 'Ü«Ü¡Ü Ü«ÜªÜܪÜ:',
'yourlanguage' => 'Ü Ü«Ü¢Ü:',
@@ -806,10 +836,13 @@ $1',
'right-mergehistory' => 'ܚܒܘܛ ܬܫܥÜÜ¬Ü Ü•Ü¦Üܬܬ̈Ü',
'right-userrights' => 'ܫܚܠܦ ÜŸÜ  Ü™Ü•ÌˆÜ©Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
+# Special:Log/newusers
+'newuserlogpage' => 'Ü£Ü“Ü Ü Ü•Ü’ÜªÜÜ¬Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
+'newuserlogpagetext' => 'ܗܢܘ Ü£Ü“Ü Ü Ü•Ü’ÜªÜÜ Ü•Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ',
+
# User rights log
'rightslog' => 'Ü£Ü“Ü Ü Ü•Ü™Ü•ÌˆÜ©Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
'rightslogtext' => 'ܗܢܘ Ü£Ü“Ü Ü Ü•Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü•Ü™Ü•ÌˆÜ©Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü.',
-'rightsnone' => '(Ü Ü Ü¡Ü•Ü¡)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'Ü©ÜªÜ Ü¦ÜÜ¬Ü Ü—Ü•Ü',
@@ -1012,6 +1045,11 @@ $1',
'disambiguations' => 'ܦÜÜ¬Ü¬ÌˆÜ ÜÜ£ÜÜªÌˆÜ¬Ü Ü’Ü¦ÜÜ¬Ü¬ÌˆÜ Ü•Ü¬Ü˜ÜšÜ¡Ü ÜܚܪܢÜ',
'disambiguationspage' => 'Template:Ü¬Ü˜ÜšÜ¡Ü ÜܚܪܢÜ',
+'pageswithprop' => 'ܦÜÜ¬Ü¬ÌˆÜ Ü¥Ü¡ Ü•ÜÜ ÜÜ¬Ü Ü•Ü¦ÜܬÜ',
+'pageswithprop-legend' => 'ܦÜÜ¬Ü¬ÌˆÜ Ü¥Ü¡ Ü•ÜÜ ÜÜ¬Ü Ü•Ü¦ÜܬÜ',
+'pageswithprop-prop' => 'Ü«Ü¡Ü Ü•Ü•ÜÜ ÜܬÜ',
+'pageswithprop-submit' => 'ܙܠ',
+
'doubleredirects' => 'ܨܘÜÜ’ÌˆÜ Ü¥Ü¦Üܦ̈Ü',
'double-redirect-fixed-move' => '[[$1]] ÜܫܬܢÜܬ.
Ü—Ü«Ü ÜÜܬÜÜ—Ü Ü¨Ü˜ÜÜ’Ü Ü  [[$2]].',
@@ -1149,10 +1187,6 @@ $1',
'activeusers-hidesysops' => 'Ü›Ü«Ü Ü¡Ü•Ü’ÜªÌˆÜ¢Ü',
'activeusers-noresult' => 'Ü Ü Üܫܬܟܚ Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ Üܢܫ̈ÜÜ¢.',
-# Special:Log/newusers
-'newuserlogpage' => 'Ü£Ü“Ü Ü Ü•Ü’ÜªÜÜ¬Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
-'newuserlogpagetext' => 'ܗܢܘ Ü£Ü“Ü Ü Ü•Ü’ÜªÜÜ Ü•Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ',
-
# Special:ListGroupRights
'listgrouprights' => 'Ü™Ü•ÌˆÜ©Ü Ü•ÜŸÜ¢Ü˜Ü«Ü¬Ü Ü•Ü¡Ü¦Ü ÜšÜ¢ÌˆÜ',
'listgrouprights-group' => 'ܟܢܘܫܬÜ',
@@ -1217,13 +1251,12 @@ $1',
'unwatching' => 'Ü ÜšÜ ÜªÜ—ÜÜ...',
'enotif_reset' => 'ܫܘܕܥ ÜŸÜ  ܦÜÜ¬Ü¬ÌˆÜ ÜÜÜŸ ܣܥÜܪ̈ܬÜ',
-'enotif_newpagetext' => 'Ü—Ü•Ü Ü—Ü Ü¦ÜÜ¬Ü ÜšÜ•Ü¬Ü',
'enotif_impersonal_salutation' => 'Ü¡Ü¦Ü ÜšÜ¢Ü {{SITENAME}}',
-'changed' => 'Üܫܬܚܠܦܬ',
-'created' => 'ܒܪÜ',
'enotif_lastvisited' => 'ÜšÜ™Ü $1 Ü ÜŸÜ  Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Ü¡Ü¢ ÜÜ¡Ü¬Ü Ü•Ü£Ü˜Ü¥ÜªÜ¢Ü ÜܚܪÜÜ Ü•ÜÜ ÜŸ.',
'enotif_lastdiff' => 'ÜšÜ™Ü $1 ܠܚܙÜÜ Ü•Ü«Ü˜ÜšÜ Ü¦Ü Ü—Ü¢Ü.',
'enotif_anon_editor' => 'Ü¡Ü¦Ü ÜšÜ¢Ü Ü Ü ÜÜ•ÜÜ¥Ü $1',
+'created' => 'ܒܪÜ',
+'changed' => 'Üܫܬܚܠܦܬ',
# Delete
'deletepage' => 'ܫܘܦ ܦÜܬÜ',
@@ -1322,7 +1355,7 @@ $1',
'blanknamespace' => '(ܪܫÜܬÜ)',
# Contributions
-'contributions' => 'ܫܘܬܦܘÜÜ¬ÌˆÜ Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
+'contributions' => 'Ü«Ü˜Ü¬Ü¦Ü˜ÌˆÜ¬Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü',
'contributions-title' => 'Ü«Ü˜Ü¬Ü¦Ü˜ÌˆÜ¬Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü Ü $1',
'mycontris' => 'ܫܘܬܦܘ̈ܬÜ',
'contribsub2' => 'Ü• $1 ($2)',
@@ -1551,11 +1584,16 @@ Do you want to change the settings?',
'pageinfo-authors' => 'Ü¡Ü¢ÜÜ¢Ü Ü•Ü¡Ü«ÜšÜ Ü¦Ü¢ÌˆÜ Ü¡Ü«ÜšÜ Ü¦ÌˆÜ',
'pageinfo-recent-edits' => 'Ü¡Ü¢ÜÜ¢Ü Ü•Ü«Ü˜ÜšÜ Ü¦ÌˆÜ Üܚܪ̈ÜÜ (Ü’ $1 ܕܕܥܒܪ)',
'pageinfo-recent-authors' => 'Ü¡Ü¢ÜÜ¢Ü Ü•Ü¡Ü«ÜšÜ Ü¦Ü¢ÌˆÜ Ü¡Ü«ÜšÜ Ü¦ÌˆÜ Üܚܪ̈ÜÜ',
+'pageinfo-toolboxlink' => 'ÜÜ•ÌˆÜ¥Ü¬Ü Ü¥Ü  ܦÜܬÜ',
+'pageinfo-contentpage-yes' => 'ÜÜÜ¢',
+'pageinfo-protect-cascading-yes' => 'ÜÜÜ¢',
# Patrolling
'markaspatrolleddiff' => 'ܫܘܕܥ ÜÜÜŸ ܟܪÜܟܬÜ',
'markaspatrolledtext' => 'ܫܘܕܥ ܦÜÜ¬Ü Ü—Ü•Ü ÜÜÜŸ ܟܪÜܟܬÜ',
'markedaspatrolled' => 'ܫܘܕܥܬ ÜÜÜŸ ܟܪÜܟܬÜ',
+'markedaspatrollednotify' => 'Ü«Ü˜ÜšÜ Ü¦Ü Ü—Ü¢Ü Ü¥Ü  $1 Üܫܬܘܕܥ ÜÜÜŸ ܟܪÜÜŸÜ.',
+'markedaspatrollederrornotify' => 'Ü Ü Üܬܢܨܚ Ü«Ü˜Ü˜Ü•Ü¥Ü ÜÜÜŸ ܟܪÜܟܬÜ',
# Patrol log
'patrol-log-page' => 'Ü£Ü“Ü Ü Ü•ÜŸÜªÜŸÜ',
@@ -1598,6 +1636,7 @@ $1',
'hours' => '{{PLURAL:$1|$1 ܫܥܬÜ|$1 ܫܥܬ̈Ü}}',
'days' => '{{PLURAL:$1|$1 ÜܘܡÜ|$1 Üܘܡܬ̈Ü}}',
'ago' => 'Ü©Ü•Ü¡ $1',
+'just-now' => 'Ü—Ü«Ü Ü’Üª ܫܥܬܗ',
# Metadata
'metadata' => 'Ü“Ü ÜÜ¬ÌˆÜ Ü•Ü¡ÜÜ›Ü',
@@ -1794,16 +1833,18 @@ $1',
'htmlform-selectorother-other' => 'ÜܚܪܢÜ',
# New logging system
-'logentry-delete-delete' => '$1 ܫܦ ܦÜÜ¬Ü Ü• $3',
-'logentry-move-move' => '$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-newusers-newusers' => 'ÜšÜ˜Ü«Ü’Ü¢Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü $1 ÜܬܒܪÜ',
-'logentry-newusers-create' => 'ÜšÜ˜Ü«Ü’Ü¢Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü $1 ÜܬܒܪÜ',
-'logentry-newusers-create2' => 'ÜšÜ˜Ü«Ü’Ü¢Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü $3 ÜÜ¬Ü’ÜªÜ Ü’ÜÜ• $1',
-'logentry-newusers-autocreate' => 'ÜšÜ˜Ü«Ü’Ü¢Ü $1 ÜÜ¬Ü’ÜªÜ ÜܬÜÜܬ',
-'newuserlog-byemail' => 'Ü¡Ü Ü¬Ü Ü•Ü¥Ü Ü Ü Üܫܬܕܪܬ Ü’ÜÜ• Ü’ÜÜ Ü•ÜªÜ ÜܠܩܛܪܘܢÜÜ',
+'logentry-delete-delete' => '$1 {{GENDER:$2|ܫܦ}} ܦÜÜ¬Ü Ü• $3',
+'logentry-move-move' => '$1 {{GENDER:$2|Ü«Ü¢Ü}} ܦÜÜ¬Ü Ü• $3 Ü  $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|Ü«Ü¢Ü}} ܦÜÜ¬Ü Ü• $3 Ü  $4 Ü˜Ü Ü Ü«Ü’Ü© ܦÜÜ¬Ü Ü•Ü¨Ü˜ÜÜ’Ü',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|Ü«Ü¢Ü}} ܦÜÜ¬Ü Ü• $3 Ü  $4 Ü•ÜÜÜ¬Ü˜Ü—Ü Ü¦ÜÜ¬Ü Ü•Ü¨Ü˜ÜÜ’Ü',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|Ü«Ü¢Ü}} ܦÜÜ¬Ü Ü• $3 Ü  $4 Ü•ÜÜÜ¬Ü˜Ü—Ü Ü¦ÜÜ¬Ü Ü•Ü¨Ü˜ÜÜ’Ü Ü˜Ü Ü Ü«Ü’Ü© ܦÜÜ¬Ü Ü•Ü¨Ü˜ÜÜ’Ü',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|ܫܘܕܥ}} ܬܢÜÜ¬Ü $4 ܕܦÜÜ¬Ü $3 ܟܪÜܟܬÜ',
+'logentry-patrol-patrol-auto' => '$1 ÜܬÜÜܬ {{GENDER:$2|ܫܘܕܥ}} ܬܢÜÜ¬Ü $4 ܕܦÜÜ¬Ü $3 ܟܪÜܟܬÜ',
+'logentry-newusers-newusers' => 'ÜšÜ˜Ü«Ü’Ü¢Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü $1 {{GENDER:$2|ÜܬܬܟÜÜ¢}}',
+'logentry-newusers-create' => 'ÜšÜ˜Ü«Ü’Ü¢Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü $1 {{GENDER:$2|ÜܬܬܟÜÜ¢}}',
+'logentry-newusers-create2' => 'ÜšÜ˜Ü«Ü’Ü¢Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü $3 {{GENDER:$2|ÜܬܬܟÜÜ¢}} Ü’ÜÜ• $1',
+'logentry-newusers-autocreate' => 'ÜšÜ˜Ü«Ü’Ü¢Ü Ü•Ü¡Ü¦Ü ÜšÜ¢Ü $1 {{GENDER:$2|ÜܬܬܣÜÜ¡}} ÜܬÜÜܬ',
+'rightsnone' => '(Ü Ü Ü¡Ü•Ü¡)',
# Feedback
'feedback-subject' => 'ܡܠܘÜÜ:',
diff --git a/languages/messages/MessagesArn.php b/languages/messages/MessagesArn.php
index 1bb91e5b..25fa236b 100644
--- a/languages/messages/MessagesArn.php
+++ b/languages/messages/MessagesArn.php
@@ -110,7 +110,6 @@ $messages = array(
'qbbrowse' => 'Kintun',
'qbedit' => 'Pepikape',
'qbpageoptions' => 'Tüfachi wülngiñ',
-'qbpageinfo' => 'Trokiñdungu',
'qbmyoptions' => 'tañi nütramkawe',
'qbspecialpages' => 'Kangelu',
'faq' => 'Rumelfemkelu ramtun',
@@ -475,8 +474,8 @@ Rulpakünuy feychi kangelkülelu dungu.",
'right-browsearchive' => 'kintun pakina ñamümüngelu',
'right-undelete' => 'Wüñoñamümün kiñe pakina',
-# User rights log
-'rightsnone' => 'chemnorume',
+# Special:Log/newusers
+'newuserlogpage' => 'We kellufe ñi wirintukun',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'chillkatun tüfachi pakina',
@@ -634,9 +633,6 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
# Special:ListUsers
'listusers-submit' => 'Pengelün',
-# Special:Log/newusers
-'newuserlogpage' => 'We kellufe ñi wirintukun',
-
# Special:ListGroupRights
'listgrouprights-members' => '(koneltulu kellufe ñi wif)',
@@ -664,7 +660,6 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
'watching' => 'Llaytumekey...',
'unwatching' => 'Llaytumekewelay...',
-'enotif_newpagetext' => 'Tüfachi ta we pakina',
'enotif_impersonal_salutation' => '{{SITENAME}} kellufe',
'created' => 'Llituy',
@@ -977,4 +972,7 @@ Ka dungu ellkangeay wünedullin reke.
# HTML forms
'htmlform-selectorother-other' => 'Kakelu',
+# New logging system
+'rightsnone' => 'chemnorume',
+
);
diff --git a/languages/messages/MessagesAry.php b/languages/messages/MessagesAry.php
index 15a835b3..4bf86e03 100644
--- a/languages/messages/MessagesAry.php
+++ b/languages/messages/MessagesAry.php
@@ -163,7 +163,6 @@ $messages = array(
'qbbrowse' => 'ṫsffeh',
'qbedit' => 'Äœedel',
'qbpageoptions' => "Had 'ṣ-ṣefḫa",
-'qbpageinfo' => 'L-Meá¸mon',
'qbmyoptions' => "'Ṣ-Ṣefḫaṫ dyawli",
'qbspecialpages' => 'Ṣefḫaṫ ĥaṣṣin',
'faq' => 'asaila kaytaawdo bzaf',
@@ -418,12 +417,9 @@ ossabab lli Ätah hwwa "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "''' nta daba kharj.'''
-ila bghiti tqdr tstamr tstaml {{SITENAME}} kamjhol , olla ila bghiti [[Special:UserLogin|tdkhl aawtani]] bnafs smiya ola bsmiya khra.
+ila bghiti tqdr tstamr tstaml {{SITENAME}} kamjhol , olla ila bghiti <span class='plainlinks'>[$1 tdkhl aawtani]</span> bnafs smiya ola bsmiya khra.
tqdr tchof baad sfahi bhal ila msjl hta tfrgh lcache dyalk",
-'welcomecreation' => '== mrhba bik, $1! ==
-lcont dyalk raha mojoda
-matnsach tbddl[[Special:Preferences|{{SITENAME}} tfdilat dyal]].',
'yourname' => 'smiṫ l-mosṫĥdim:',
'yourpassword' => 'Saroṫ:',
'yourpasswordagain' => 'aaawd ktb lmot de passe dyalk',
@@ -760,7 +756,6 @@ l-idari lli qffelha Äta had ṫfsir: $1",
'template-semiprotected' => '(ḫimaya ma kamlaċ)',
'hiddencategories' => '{{PLURAL:$1|L-Katégori l-mĥebbya li kaṫmlek|L-Katégoriyaṫ l-mĥebbyin li kaymelko}} had ṣ-ṣefḫa :',
'edittools' => '<!-- nass ghayban hna t7t t3dil ot7t istimarat raf3 sowar. -->',
-'nocreatetitle' => "inċa' ṣfaḫi mḫdod",
'nocreate-loggedin' => 'ma Ändek-Ä‹ l-heqq ṫsayb á¹£-á¹£faḫi jdad.',
'sectioneditnotsupported-title' => 'ṫÄdil l-aqsam ma kayn-Ä‹ hna',
'sectioneditnotsupported-text' => 'ṫṫÄdil l-aqsam ma kayn-Ä‹ f-had á¹£fḫa.',
@@ -1191,11 +1186,13 @@ Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫi
'right-override-export-depth' => 'tsdir sfahi obinha sfahi lmawsola hta lomq 5',
'right-sendemail' => 'sift email lmostkhdimin lkhrin',
+# Special:Log/newusers
+'newuserlogpage' => 'Ṫariĥ dyal l-ḫsabaṫ j-jdad',
+'newuserlogpagetext' => "hada sijill d-inċa'aṫ l-moṣṫĥdimin.",
+
# User rights log
'rightslog' => 'Ĝamaliyaṫ ḫoqoq l-mosṫeĥdim',
'rightslogtext' => 'hada sijil btaghyirat f salahiyat lmostkhdimin',
-'rightslogentry' => 'ghyr salahiyat $1 mn $2 l $3',
-'rightsnone' => '(walo)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => "ĤṫareÄ had 'á¹£-á¹£efḫa",
@@ -1613,10 +1610,6 @@ daba ka ṫḫwwal l-[[$2]].',
'activeusers-hidesysops' => 'Khbbi lidariyin',
'activeusers-noresult' => 'ta mostakhdim matlgach.',
-# Special:Log/newusers
-'newuserlogpage' => 'Ṫariĥ dyal l-ḫsabaṫ j-jdad',
-'newuserlogpagetext' => "hada sijill d-inċa'aṫ l-moṣṫĥdimin.",
-
# Special:ListGroupRights
'listgrouprights' => 'salahiyat mjmoat lmostkhdimin',
'listgrouprights-key' => '* <span class="listgrouprights-granted">ḫoqoq mÄtiyya</span>
@@ -1695,14 +1688,12 @@ L-Kṫaba dyal had á¹£-á¹£efḫa Ä¡aṫban '''Ä¡liá¸a''' fe [[Special:RecentCha
'enotif_mailer' => '{{SITENAME}} nidam lbaridi',
'enotif_reset' => 'Qiyyed ṣ-ṣefḫaṫ bḫal la zerṫihom kamlin',
-'enotif_newpagetext' => 'ṣfḫa jdida di.',
'enotif_impersonal_salutation' => 'Mosṫeḫdim {{SITENAME}}',
-'changed' => 'Beddel',
-'created' => "tnch'at",
-'enotif_subject' => 'Ṣ-Ṣefḫa $PAGETITLE dyal {{SITENAME}} $CHANGEDORCREATEDha $PAGEEDITOR',
'enotif_lastvisited' => 'Sir ċof $1 baċ ṫċof ṫ-ṫeġyiraṫ kamlin men ziyarṫek l-leĥĥraniya.',
'enotif_lastdiff' => 'Ċof $1 baċ ṫċof had ṫ-ṫeġyiraṫ.',
'enotif_anon_editor' => 'mosṫeĥdim ma mċejjelċ $1',
+'created' => "tnch'at",
+'changed' => 'Beddel',
# Delete
'deletepage' => "Mḫi had 'ṣ-ṣefḫa",
@@ -2718,6 +2709,6 @@ jrreb l-ÄṛḠl-Äadi.',
# New logging system
'revdelete-restricted' => 'tḅḅq á¸-á¸awaḅit ll-idariyyin',
'revdelete-unrestricted' => 'ḫyyd á¸-á¸awaḅit ll-idariyyin',
-'newuserlog-byemail' => "lmot de passe raha tsiftat f l'email",
+'rightsnone' => '(walo)',
);
diff --git a/languages/messages/MessagesArz.php b/languages/messages/MessagesArz.php
index fe1000e2..35e7368e 100644
--- a/languages/messages/MessagesArz.php
+++ b/languages/messages/MessagesArz.php
@@ -17,21 +17,7 @@
$fallback = 'ar';
-// (bug 16469) Override Eastern Arabic numberals, use Western
-$digitTransformTable = array(
- '0' => '0',
- '1' => '1',
- '2' => '2',
- '3' => '3',
- '4' => '4',
- '5' => '5',
- '6' => '6',
- '7' => '7',
- '8' => '8',
- '9' => '9',
- '.' => '.',
- ',' => ',',
-);
+$rtl = true;
$namespaceNames = array(
NS_MEDIA => 'ميديا',
@@ -58,6 +44,98 @@ $namespaceAliases = array(
'نقاش_الصورة' => NS_FILE_TALK,
);
+$specialPageAliases = array(
+ 'Activeusers' => array( 'يوزرات_نشطا' ),
+ 'Allmessages' => array( 'كل_الرسايل' ),
+ 'Allpages' => array( 'كل_الصÙØ­' ),
+ 'Ancientpages' => array( 'صÙØ­_قديمه' ),
+ 'Blankpage' => array( 'صÙحه_Ùارضيه' ),
+ 'Block' => array( 'بلوك', 'بلوك_IP', 'بلوك_يوزر' ),
+ 'Blockme' => array( 'بلوك_لنÙسى' ),
+ 'Booksources' => array( 'مصادر_كتاب' ),
+ 'BrokenRedirects' => array( 'تحويلات_مكسوره' ),
+ 'Categories' => array( 'تصانيÙ' ),
+ 'ChangePassword' => array( 'تغيير_الپاسوورد', 'ظبط_الپاسوورد' ),
+ 'Confirmemail' => array( 'تأكيد_الايميل' ),
+ 'Contributions' => array( 'مساهمات' ),
+ 'CreateAccount' => array( 'ابتدى_حساب' ),
+ 'Deadendpages' => array( 'صÙØ­_نهايه_مسدوده' ),
+ 'DeletedContributions' => array( 'مساهمات_ممسوحه' ),
+ 'Disambiguations' => array( 'توضيحات' ),
+ 'DoubleRedirects' => array( 'تحويلات_دوبل' ),
+ 'Emailuser' => array( 'ابعت_ايميل_لليوزر' ),
+ 'Export' => array( 'تصدير' ),
+ 'Fewestrevisions' => array( 'اقل_مراجعات' ),
+ 'FileDuplicateSearch' => array( 'تدوير_Ùايل_متكرر' ),
+ 'Filepath' => array( 'مسار_ملÙ' ),
+ 'Import' => array( 'استوراد' ),
+ 'Invalidateemail' => array( 'تعطيل_الايميل' ),
+ 'BlockList' => array( 'ليستة_البلوك', 'بيّن_البلوك', 'ليستة_بلوك_IP' ),
+ 'LinkSearch' => array( 'تدوير_اللينكات' ),
+ 'Listadmins' => array( 'عرض_الاداريين' ),
+ 'Listbots' => array( 'عرض_البوتات' ),
+ 'Listfiles' => array( 'عرض_الÙايلات', 'ليستة_الÙايلات', 'ليستة_الصور' ),
+ 'Listgrouprights' => array( 'عرض_حقوق_الجروپات' ),
+ 'Listredirects' => array( 'عرض_التحويلات' ),
+ 'Listusers' => array( 'عرض_اليوزرات', 'ليستة_اليوزرات' ),
+ 'Lockdb' => array( 'Ù‚ÙÙ„_قب' ),
+ 'Log' => array( 'سجل', 'سجلات' ),
+ 'Lonelypages' => array( 'صÙØ­_وحدانيه', 'صÙØ­_يتيمه' ),
+ 'Longpages' => array( 'صÙØ­_طويله' ),
+ 'MergeHistory' => array( 'دمج_التاريخ' ),
+ 'MIMEsearch' => array( 'تدوير_MIME' ),
+ 'Mostcategories' => array( 'اكتر_تصانيÙ' ),
+ 'Mostimages' => array( 'اكتر_Ùايلات_معمول_ليها_لينك', 'اكتر_Ùايلات', 'اكتر_صور' ),
+ 'Mostlinked' => array( 'اكتر_صÙØ­_معمول_ليها_لينك' ),
+ 'Mostlinkedcategories' => array( 'اكتر_تصانيÙ_معمول_ليها_لينك', 'اكتر_تصانيÙ_مستعمله' ),
+ 'Mostlinkedtemplates' => array( 'اكتر_قوالب_معمول_ليها_لينك', 'اكتر_قوالب_مستعمله' ),
+ 'Mostrevisions' => array( 'اكتر_مراجعات' ),
+ 'Movepage' => array( 'نقل_صÙحه' ),
+ 'Mycontributions' => array( 'مساهماتى' ),
+ 'Mypage' => array( 'صÙحتى' ),
+ 'Mytalk' => array( 'مناقشتى' ),
+ 'Newimages' => array( 'Ùايلات_جديده', 'صور_جديده' ),
+ 'Newpages' => array( 'صÙØ­_جديده' ),
+ 'Popularpages' => array( 'صÙØ­_مشهوره' ),
+ 'Preferences' => array( 'تÙضيلات' ),
+ 'Prefixindex' => array( 'Ùهرس_بدايه' ),
+ 'Protectedpages' => array( 'صÙØ­_محميه' ),
+ 'Protectedtitles' => array( 'عناوين_محميه' ),
+ 'Randompage' => array( 'عشوائى', 'صÙحه_عشوائيه' ),
+ 'Randomredirect' => array( 'تحويله_عشوائيه' ),
+ 'Recentchanges' => array( 'اخر_تعديلات' ),
+ 'Recentchangeslinked' => array( 'اجدد_التغييرات_اللى_معمول_ليها_لينك', 'تغييرات_مرتبطه' ),
+ 'Revisiondelete' => array( 'مسح_نسخه' ),
+ 'Search' => array( 'تدوير' ),
+ 'Shortpages' => array( 'صÙØ­_قصيره' ),
+ 'Specialpages' => array( 'صÙØ­_مخصوصه' ),
+ 'Statistics' => array( 'احصائيات' ),
+ 'Tags' => array( 'وسوم' ),
+ 'Unblock' => array( 'رÙع_منع' ),
+ 'Uncategorizedcategories' => array( 'تصانيÙ_مش_متصنÙÙ‡' ),
+ 'Uncategorizedimages' => array( 'Ùايلات_مش_متصنÙÙ‡', 'صور_مش_متصنÙÙ‡' ),
+ 'Uncategorizedpages' => array( 'صÙØ­_مش_متصنÙÙ‡' ),
+ 'Uncategorizedtemplates' => array( 'قوالب_مش_متصنÙÙ‡' ),
+ 'Undelete' => array( 'استرجاع' ),
+ 'Unlockdb' => array( 'Ùتح_قب' ),
+ 'Unusedcategories' => array( 'تصانيÙ_مش_مستعمله' ),
+ 'Unusedimages' => array( 'Ùايلات_مش_مستعمله', 'صور_مش_مستعمله' ),
+ 'Unusedtemplates' => array( 'قوالب_مش_مستعمله' ),
+ 'Unwatchedpages' => array( 'صÙØ­_مش_متراقبه' ),
+ 'Upload' => array( 'رÙع' ),
+ 'Userlogin' => array( 'دخول_اليوزر' ),
+ 'Userlogout' => array( 'خروج_اليوزر' ),
+ 'Userrights' => array( 'حقوق_اليوزر', 'ترقية_سيسوپ', 'ترقية_بوت' ),
+ 'Version' => array( 'نسخه' ),
+ 'Wantedcategories' => array( 'تصانيÙ_مطلوبه' ),
+ 'Wantedfiles' => array( 'Ùايلات_مطلوبه' ),
+ 'Wantedpages' => array( 'صÙØ­_مطلوبه', 'لينكات_مكسوره' ),
+ 'Wantedtemplates' => array( 'قوالب_مطلوبه' ),
+ 'Watchlist' => array( 'ليستة_المراقبه' ),
+ 'Whatlinkshere' => array( 'ايه_بيوصل_هنا' ),
+ 'Withoutinterwiki' => array( 'من-غير_interwiki' ),
+);
+
$magicWords = array(
'redirect' => array( '0', '#تحويل', '#REDIRECT' ),
'notoc' => array( '0', '__لاÙهرس__', '__NOTOC__' ),
@@ -65,7 +143,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__لصق_Ùهرس__', '__FORCETOC__' ),
'toc' => array( '0', '__Ùهرس__', '__TOC__' ),
'noeditsection' => array( '0', '__لاتحريرقسم__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__لاعنوان__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'شهر_حالى', 'شهر_حالي2', 'شهر_حالي', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'شهر_حالي1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'اسم_الشهر_الحالى', 'اسم_الشهر_الحالي', 'CURRENTMONTHNAME' ),
@@ -208,96 +285,20 @@ $magicWords = array(
'url_query' => array( '0', 'استعلام', 'QUERY' ),
);
-$specialPageAliases = array(
- 'Activeusers' => array( 'يوزرات_نشطا' ),
- 'Allmessages' => array( 'كل_الرسايل' ),
- 'Allpages' => array( 'كل_الصÙØ­' ),
- 'Ancientpages' => array( 'صÙØ­_قديمه' ),
- 'Blankpage' => array( 'صÙحه_Ùارضيه' ),
- 'Block' => array( 'بلوك', 'بلوك_IP', 'بلوك_يوزر' ),
- 'Blockme' => array( 'بلوك_لنÙسى' ),
- 'Booksources' => array( 'مصادر_كتاب' ),
- 'BrokenRedirects' => array( 'تحويلات_مكسوره' ),
- 'Categories' => array( 'تصانيÙ' ),
- 'ChangePassword' => array( 'تغيير_الپاسوورد', 'ظبط_الپاسوورد' ),
- 'Confirmemail' => array( 'تأكيد_الايميل' ),
- 'Contributions' => array( 'مساهمات' ),
- 'CreateAccount' => array( 'ابتدى_حساب' ),
- 'Deadendpages' => array( 'صÙØ­_نهايه_مسدوده' ),
- 'DeletedContributions' => array( 'مساهمات_ممسوحه' ),
- 'Disambiguations' => array( 'توضيحات' ),
- 'DoubleRedirects' => array( 'تحويلات_دوبل' ),
- 'Emailuser' => array( 'ابعت_ايميل_لليوزر' ),
- 'Export' => array( 'تصدير' ),
- 'Fewestrevisions' => array( 'اقل_مراجعات' ),
- 'FileDuplicateSearch' => array( 'تدوير_Ùايل_متكرر' ),
- 'Filepath' => array( 'مسار_ملÙ' ),
- 'Import' => array( 'استوراد' ),
- 'Invalidateemail' => array( 'تعطيل_الايميل' ),
- 'BlockList' => array( 'ليستة_البلوك', 'بيّن_البلوك', 'ليستة_بلوك_IP' ),
- 'LinkSearch' => array( 'تدوير_اللينكات' ),
- 'Listadmins' => array( 'عرض_الاداريين' ),
- 'Listbots' => array( 'عرض_البوتات' ),
- 'Listfiles' => array( 'عرض_الÙايلات', 'ليستة_الÙايلات', 'ليستة_الصور' ),
- 'Listgrouprights' => array( 'عرض_حقوق_الجروپات' ),
- 'Listredirects' => array( 'عرض_التحويلات' ),
- 'Listusers' => array( 'عرض_اليوزرات', 'ليستة_اليوزرات' ),
- 'Lockdb' => array( 'Ù‚ÙÙ„_قب' ),
- 'Log' => array( 'سجل', 'سجلات' ),
- 'Lonelypages' => array( 'صÙØ­_وحدانيه', 'صÙØ­_يتيمه' ),
- 'Longpages' => array( 'صÙØ­_طويله' ),
- 'MergeHistory' => array( 'دمج_التاريخ' ),
- 'MIMEsearch' => array( 'تدوير_MIME' ),
- 'Mostcategories' => array( 'اكتر_تصانيÙ' ),
- 'Mostimages' => array( 'اكتر_Ùايلات_معمول_ليها_لينك', 'اكتر_Ùايلات', 'اكتر_صور' ),
- 'Mostlinked' => array( 'اكتر_صÙØ­_معمول_ليها_لينك' ),
- 'Mostlinkedcategories' => array( 'اكتر_تصانيÙ_معمول_ليها_لينك', 'اكتر_تصانيÙ_مستعمله' ),
- 'Mostlinkedtemplates' => array( 'اكتر_قوالب_معمول_ليها_لينك', 'اكتر_قوالب_مستعمله' ),
- 'Mostrevisions' => array( 'اكتر_مراجعات' ),
- 'Movepage' => array( 'نقل_صÙحه' ),
- 'Mycontributions' => array( 'مساهماتى' ),
- 'Mypage' => array( 'صÙحتى' ),
- 'Mytalk' => array( 'مناقشتى' ),
- 'Newimages' => array( 'Ùايلات_جديده', 'صور_جديده' ),
- 'Newpages' => array( 'صÙØ­_جديده' ),
- 'Popularpages' => array( 'صÙØ­_مشهوره' ),
- 'Preferences' => array( 'تÙضيلات' ),
- 'Prefixindex' => array( 'Ùهرس_بدايه' ),
- 'Protectedpages' => array( 'صÙØ­_محميه' ),
- 'Protectedtitles' => array( 'عناوين_محميه' ),
- 'Randompage' => array( 'عشوائى', 'صÙحه_عشوائيه' ),
- 'Randomredirect' => array( 'تحويله_عشوائيه' ),
- 'Recentchanges' => array( 'اخر_تعديلات' ),
- 'Recentchangeslinked' => array( 'اجدد_التغييرات_اللى_معمول_ليها_لينك', 'تغييرات_مرتبطه' ),
- 'Revisiondelete' => array( 'مسح_نسخه' ),
- 'Search' => array( 'تدوير' ),
- 'Shortpages' => array( 'صÙØ­_قصيره' ),
- 'Specialpages' => array( 'صÙØ­_مخصوصه' ),
- 'Statistics' => array( 'احصائيات' ),
- 'Tags' => array( 'وسوم' ),
- 'Unblock' => array( 'رÙع_منع' ),
- 'Uncategorizedcategories' => array( 'تصانيÙ_مش_متصنÙÙ‡' ),
- 'Uncategorizedimages' => array( 'Ùايلات_مش_متصنÙÙ‡', 'صور_مش_متصنÙÙ‡' ),
- 'Uncategorizedpages' => array( 'صÙØ­_مش_متصنÙÙ‡' ),
- 'Uncategorizedtemplates' => array( 'قوالب_مش_متصنÙÙ‡' ),
- 'Undelete' => array( 'استرجاع' ),
- 'Unlockdb' => array( 'Ùتح_قب' ),
- 'Unusedcategories' => array( 'تصانيÙ_مش_مستعمله' ),
- 'Unusedimages' => array( 'Ùايلات_مش_مستعمله', 'صور_مش_مستعمله' ),
- 'Unusedtemplates' => array( 'قوالب_مش_مستعمله' ),
- 'Unwatchedpages' => array( 'صÙØ­_مش_متراقبه' ),
- 'Upload' => array( 'رÙع' ),
- 'Userlogin' => array( 'دخول_اليوزر' ),
- 'Userlogout' => array( 'خروج_اليوزر' ),
- 'Userrights' => array( 'حقوق_اليوزر', 'ترقية_سيسوپ', 'ترقية_بوت' ),
- 'Version' => array( 'نسخه' ),
- 'Wantedcategories' => array( 'تصانيÙ_مطلوبه' ),
- 'Wantedfiles' => array( 'Ùايلات_مطلوبه' ),
- 'Wantedpages' => array( 'صÙØ­_مطلوبه', 'لينكات_مكسوره' ),
- 'Wantedtemplates' => array( 'قوالب_مطلوبه' ),
- 'Watchlist' => array( 'ليستة_المراقبه' ),
- 'Whatlinkshere' => array( 'ايه_بيوصل_هنا' ),
- 'Withoutinterwiki' => array( 'من-غير_interwiki' ),
+// (bug 16469) Override Eastern Arabic numberals, use Western
+$digitTransformTable = array(
+ '0' => '0',
+ '1' => '1',
+ '2' => '2',
+ '3' => '3',
+ '4' => '4',
+ '5' => '5',
+ '6' => '6',
+ '7' => '7',
+ '8' => '8',
+ '9' => '9',
+ '.' => '.',
+ ',' => ',',
);
$messages = array(
@@ -446,7 +447,6 @@ $messages = array(
'qbbrowse' => 'تصÙØ­',
'qbedit' => 'عدل',
'qbpageoptions' => ' الصÙحه دى',
-'qbpageinfo' => 'السياق',
'qbmyoptions' => 'صÙحاتى',
'qbspecialpages' => 'الصÙحات الخاصة',
'faq' => 'اسئله بتتسئل كتير',
@@ -683,11 +683,8 @@ $2',
# Login and logout pages
'logouttext' => "'''أنت دلوقتى مش مسجل دخولك.'''
-تقدر تكمل استعمال {{SITENAME}} على انك مجهول، أو [[Special:UserLogin|الدخول مرة تانيه]] بنÙس الاسم أو باسم تاني.
+تقدر تكمل استعمال {{SITENAME}} على انك مجهول، أو <span class='plainlinks'>[$1 الدخول مرة تانيه]</span> بنÙس الاسم أو باسم تاني.
ممكن تشو٠بعض الصÙحات كأنك متسجل ØŒ Ùˆ دا علشان استعمال الصÙحات المتخبية ÙÙ‰ المتصÙØ­ بتاعك.",
-'welcomecreation' => '== اهلاً و سهلا يا $1! ==
-اتÙتحلك حساب.
-ما تنساش تغير [[Special:Preferences|تÙضيلاتك ÙÙŠ {{SITENAME}}]].',
'yourname' => 'اليوزرنيم:',
'yourpassword' => 'الباسوورد:',
'yourpasswordagain' => 'اكتب الباسورد تاني:',
@@ -963,7 +960,6 @@ $2',
'template-semiprotected' => '(حمايه جزئيه )',
'hiddencategories' => 'الصÙحه دى موجوده ÙÙ‰ {{PLURAL:$1|تصني٠مخÙÙ‰ واحد|$1 تصني٠مخÙÙ‰}}:',
'edittools' => '<!-- النص هنا هايظهر تحت صندوق التحرير و استمارة تحميل الصور. -->',
-'nocreatetitle' => 'إنشاء الصÙحات اتحدد',
'nocreatetext' => '{{SITENAME}} حدد القدره على انشاء صÙحات جديده.
ممكن ترجع وتحرر صÙحه موجوده بالÙعل، او [[Special:UserLogin|الدخول / Ùتح حساب]].',
'nocreate-loggedin' => 'انت ما عندك Ø´ صلاحية تعمل صÙحات جديدة.',
@@ -1481,11 +1477,13 @@ $1",
'right-sendemail' => 'يبعت إيميل لليوزرز التانيين',
'right-passwordreset' => 'إعادة ضبط كلمة سر مستخدم([[Special:PasswordReset|صÙحة خاصة]])',
+# Special:Log/newusers
+'newuserlogpage' => 'سجل اليوزرز الجداد',
+'newuserlogpagetext' => 'دا سجل لليوزرز الجداد',
+
# User rights log
'rightslog' => 'سجل صلاحيات اليوزرز',
'rightslogtext' => 'ده سجل بالتغييرات ٠صلاحيات اليوزرز .',
-'rightslogentry' => 'غير صلاحيات $1 من $2 ل $3',
-'rightsnone' => '(Ùاضى)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'قراية الصÙحه دى',
@@ -2027,10 +2025,6 @@ PICT # misc.
'activeusers-hidesysops' => 'خبى السيسوبات',
'activeusers-noresult' => 'مالقيناش اى يوزر',
-# Special:Log/newusers
-'newuserlogpage' => 'سجل اليوزرز الجداد',
-'newuserlogpagetext' => 'دا سجل لليوزرز الجداد',
-
# Special:ListGroupRights
'listgrouprights' => 'حقوق مجموعات اليوزرز',
'listgrouprights-summary' => 'دى لستة بمجموعات اليوزرز المتعرÙØ© ÙÙ‰ الويكى دا، بالحقوق اللى معاهم.
@@ -2110,11 +2104,7 @@ PICT # misc.
'enotif_mailer' => 'نظام {{SITENAME}} البريدى للإخطارات',
'enotif_reset' => 'علم على كل الصÙحات كأنك خلاص زرتها',
-'enotif_newpagetext' => 'دى صÙحه جديده.',
'enotif_impersonal_salutation' => 'يوزر {{SITENAME}}',
-'changed' => 'اتغيرت',
-'created' => 'إتنشأت',
-'enotif_subject' => 'صÙحة {{SITENAME}} $PAGETITLE تم $CHANGEDORCREATED بواسطة $PAGEEDITOR',
'enotif_lastvisited' => 'شو٠$1 لمراجعة كل التغييرات اللى حصلت من أخر زيارة ليك.',
'enotif_lastdiff' => 'شو٠$1 علشان تبص على التغيير دا.',
'enotif_anon_editor' => 'يوزر مش معرو٠$1',
@@ -2146,6 +2136,8 @@ $UNWATCHURL
الfeedback و مساعده اكتر:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'إتنشأت',
+'changed' => 'اتغيرت',
# Delete
'deletepage' => 'امسح الصÙحه',
@@ -3483,7 +3475,7 @@ $5
# New logging system
'revdelete-restricted' => 'طبق التعليمات على السيسوبات',
'revdelete-unrestricted' => 'شيل الضوابط من على السيسوبات',
-'newuserlog-byemail' => 'الباسورد اتبعتت بالايميل',
+'rightsnone' => '(Ùاضى)',
# Search suggestions
'searchsuggest-search' => 'تدوير',
diff --git a/languages/messages/MessagesAs.php b/languages/messages/MessagesAs.php
index 4d811b7e..723c04c0 100644
--- a/languages/messages/MessagesAs.php
+++ b/languages/messages/MessagesAs.php
@@ -86,7 +86,7 @@ $specialPageAliases = array(
'CreateAccount' => array( 'সদসà§à¦¯à¦­à§à¦•à§à¦¤à¦¿' ),
'DeletedContributions' => array( 'বিলোপ_কৰা_বৰঙনিসমূহ' ),
'Disambiguations' => array( 'দà§à¦¬à§à¦¯à§°à§à¦¥à¦¤à¦¾_দূৰীকৰণসমূহ' ),
- 'DoubleRedirects' => array( 'দà§à¦¬à¦¿_পà§à¦£à¦ƒà¦¨à¦¿à§°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦¸à¦®à§‚হ' ),
+ 'DoubleRedirects' => array( 'দà§à¦¬à¦¿_পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦¸à¦®à§‚হ' ),
'EditWatchlist' => array( 'লকà§à¦·à§à¦¯à¦¤à¦¾à¦²à¦¿à¦•à¦¾_সমà§à¦ªà¦¾à¦¦à¦¨à¦¾_কৰক' ),
'Emailuser' => array( 'সদসà§à¦¯à¦²à§ˆ_ই-মেইল_পঠিয়াওক' ),
'Export' => array( 'ৰপà§à¦¤à¦¾à¦¨à¦¿' ),
@@ -102,14 +102,14 @@ $specialPageAliases = array(
'Listbots' => array( 'বটৰ_তালিকা' ),
'Listfiles' => array( 'চিতà§à§°-তালিকা' ),
'Listgrouprights' => array( 'গোটৰ_অধিকাৰসমূহ' ),
- 'Listredirects' => array( 'পà§à¦£à¦ƒà¦¨à¦¿à§°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦¸à¦®à§‚হৰ_তালিকা' ),
+ 'Listredirects' => array( 'পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦¸à¦®à§‚হৰ_তালিকা' ),
'Listusers' => array( 'সদসà§à¦¯-তালিকা' ),
'Lockdb' => array( 'তথà§à¦¯à¦•à§‹à¦·_বনà§à¦§_কৰক' ),
'Log' => array( 'অভিলেখ', 'অভিলেখসমূহ' ),
'Lonelypages' => array( 'অকলশৰীয়া_পৃষà§à¦ à¦¾' ),
'Longpages' => array( 'দীঘলীয়া_পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ' ),
'MergeHistory' => array( 'à¦à¦•à¦¤à§à§°à§€à¦•à§°à¦£_ইতিহাস' ),
- 'MIMEsearch' => array( 'MIME_অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨' ),
+ 'MIMEsearch' => array( 'MIMEMIMEmmmgM_অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨' ),
'Movepage' => array( 'পৃষà§à¦ à¦¾_সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§°' ),
'Mycontributions' => array( 'মোৰ_বৰঙনি' ),
'Mypage' => array( 'মোৰ_পৃষà§à¦ à¦¾' ),
@@ -124,11 +124,10 @@ $specialPageAliases = array(
'Protectedpages' => array( 'সà§à§°à¦•à§à¦·à¦¿à¦¤_পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ' ),
'Protectedtitles' => array( 'সà§à§°à¦•à§à¦·à¦¿à¦¤_শিৰোনামসমূহ' ),
'Randompage' => array( 'আকসà§à¦®à¦¿à¦•' ),
- 'Randomredirect' => array( 'আকসà§à¦®à¦¿à¦•_পà§à¦£à¦ƒà¦¨à¦¿à§°à§à¦¦à§‡à¦¶à¦¨à¦¾' ),
+ 'Randomredirect' => array( 'আকসà§à¦®à¦¿à¦•_পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶à¦¨à¦¾' ),
'Recentchanges' => array( 'শেহতীয়া_সালসলনি' ),
'Recentchangeslinked' => array( 'সমà§à¦ªà§°à§à¦•à¦¿à¦¤_সালসলনিসমূহ' ),
'Revisiondelete' => array( 'সংসà§à¦•à§°à¦£_বিলোপ' ),
- 'RevisionMove' => array( 'সংসà§à¦•à§°à¦£_সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§°' ),
'Search' => array( 'সনà§à¦§à¦¾à¦¨' ),
'Shortpages' => array( 'চমà§_পৃষà§à¦ à¦¾' ),
'Specialpages' => array( 'বিশেষ_পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ' ),
@@ -316,6 +315,7 @@ $messages = array(
'newwindow' => "(নতà§à¦¨ ৱিণà§à¦¡'ত খোল খায়)",
'cancel' => 'বাতিল কৰক',
'moredotdotdot' => 'অধিক...',
+'morenotlisted' => 'আৰৠতালিকাভà§à¦•à§à¦¤ কৰা হোৱা নাই...',
'mypage' => 'মোৰ পৃষà§à¦ à¦¾',
'mytalk' => 'কথা-বতৰা',
'anontalk' => 'à¦à¦‡ IP-ত যোগাযোগ কৰক',
@@ -327,7 +327,6 @@ $messages = array(
'qbbrowse' => 'বà§à§°à¦¾à¦“জ',
'qbedit' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'qbpageoptions' => 'à¦à¦‡ পৃষà§à¦ à¦¾',
-'qbpageinfo' => 'পà§à§°à¦¸à¦‚গ',
'qbmyoptions' => 'মোৰ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
'qbspecialpages' => 'বিশেষ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
'faq' => 'সততে উদিত পà§à§°à¦¶à§à¦¨à¦¸à¦®à§‚হ (FAQ)',
@@ -350,6 +349,7 @@ $messages = array(
'namespaces' => 'নামসà§à¦¥à¦¾à¦¨',
'variants' => 'বিকলà§à¦ªà¦¸à¦®à§‚হ',
+'navigation-heading' => 'সা-সà¦à¦œà§à¦²à¦¿',
'errorpagetitle' => 'ভà§à¦²',
'returnto' => '$1লৈ ঘূৰি যাওক ।',
'tagline' => '{{SITENAME}}ৰ পৰা',
@@ -589,9 +589,10 @@ $2',
# Login and logout pages
'logouttext' => "'''আপà§à¦¨à¦¿ পà§à§°à¦¸à§à¦¥à¦¾à¦¨ কৰিলে ।'''
-আপà§à¦¨à¦¿ বেনামী ভাবেও {{SITENAME}} বà§à¦¯à§±à¦¹à¦¾à§° কৰিব পাৰে, অথবা আকৌ সেই à¦à¦•à§‡ বা বেলেগ নামেৰে [[Special:UserLogin|পà§à§°à§±à§‡à¦¶]] কৰিব পাৰে।
+আপà§à¦¨à¦¿ বেনামী ভাবেও {{SITENAME}} বà§à¦¯à§±à¦¹à¦¾à§° কৰিব পাৰে, অথবা আকৌ সেই à¦à¦•à§‡ বা বেলেগ নামেৰে <span class='plainlinks'>[$1 পà§à§°à§±à§‡à¦¶]</span> কৰিব পাৰে।
মন কৰিব যে যেতিয়ালৈকে আপোনাৰ বà§à§°à¦¾à¦‰à¦œà¦¾à§°à§° অসà§à¦¥à¦¾à¦¯à¦¼à§€-সà§à¦®à§ƒà¦¤à¦¿ (cache memory) খালী নকৰে, তেতিয়ালৈকে কিছà§à¦®à¦¾à¦¨ পৃষà§à¦ à¦¾à¦¤ আপà§à¦¨à¦¿ পà§à§°à§±à§‡à¦¶ কৰা বà§à¦²à¦¿ দেখà§à§±à¦¾à¦‡ থাকিব পাৰে।",
-'welcomecreation' => '== আদৰিছোà¦, $1! ==
+'welcomeuser' => 'আদৰিছোà¦, $1!',
+'welcomecreation-msg' => '== আদৰিছোà¦, $1! ==
আপোনাৰ সদসà§à¦¯à¦­à§à¦•à§à¦¤à¦¿ হৈ গ’ল ।
[[Special:Preferences|{{SITENAME}}ৰ পছনà§à¦¦à¦¸à¦®à§‚হ]]ত আপোনাৰ পছনà§à¦¦à¦®à¦¤à§‡ বà§à¦¯à¦•à§à¦¤à¦¿à¦—তকৰণ কৰি ল’বলৈ নাপাহৰে যেন ।',
'yourname' => 'সদসà§à¦¯à¦¨à¦¾à¦®:',
@@ -616,7 +617,7 @@ $2',
'gotaccount' => "আপà§à¦¨à¦¿ সদসà§à¦¯ হয়নে? '''$1'''",
'gotaccountlink' => 'পà§à§°à§±à§‡à¦¶',
'userlogin-resetlink' => 'আপোনাৰ পà§à§°à§±à§‡à¦¶ তথà§à¦¯ পাহৰিছে?',
-'createaccountmail' => 'ই-মেইলেৰে',
+'createaccountmail' => 'যিকোনো à¦à¦Ÿà¦¾ অসà§à¦¥à¦¾à¦¯à¦¼à§€ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ বà§à¦¯à§±à¦¹à¦¾à§° কৰক আৰৠইয়াক তলত দিয়া ইমেইল ঠিকনাটোলৈ পঠিয়াই দিয়ক',
'createaccountreason' => 'কাৰণ:',
'badretype' => 'আপà§à¦¨à¦¿ দিয়া গà§à¦ªà§à¦¤ শবà§à¦¦ দà§à¦Ÿà¦¾ মিলা নাই।',
'userexists' => 'আপà§à¦¨à¦¿ দিয়া সদসà§à¦¯à¦¨à¦¾à¦® আগৰে পৰাই বà§à¦¯à§±à¦¹à¦¾à§° হৈ আছে।
@@ -692,6 +693,7 @@ $2',
# Email sending
'php-mail-error-unknown' => 'পি.à¦à¦‡à¦›.পি মেইল () কাৰà§à¦¯à¦¤ অজà§à¦žà¦¾à¦¤ তà§à§°à§à¦Ÿà¦¿ ।',
'user-mail-no-addy' => 'ই-মেইল ঠিকনা নোহোৱাকৈয়ে ই-মেইল পঠোৱাৰ চেষà§à¦Ÿà¦¾ কৰা হৈছে ।',
+'user-mail-no-body' => 'কোনো সমল নোহোৱাকৈ বা অতি সংকà§à¦·à¦¿à¦ªà§à¦¤ কথাৰে ইমেইল পঠিয়াবলৈ চেষà§à¦Ÿà¦¾ কৰিছিল।',
# Change password dialog
'resetpass' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ সলনি কৰক',
@@ -737,7 +739,7 @@ $2
অসà§à¦¥à¦¾à¦¯à¦¼à§€ গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦: $2',
'passwordreset-emailsent' => 'à¦à¦–ন গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ উদà§à¦§à¦¾à§° ই-মেইল পঠিওৱা হৈছে।',
'passwordreset-emailsent-capture' => 'à¦à¦–ন গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ উদà§à¦§à¦¾à§° ইমেইল পঠিওৱা হৈছে, à¦à¦‡à¦–ন তলত দেখা পাব।',
-'passwordreset-emailerror-capture' => "à¦à¦–ন সà§à¦®à¦¾à§°à¦• ই-মেইল সৃষà§à¦Ÿà¦¿ কৰা হ'ল কিনà§à¦¤à§ সদসà§à¦¯à¦œà¦¨à¦²à§ˆ পঠিয়াব পৰা নগ'ল, à¦à¦‡à¦–ন তলত দেখà§à¦“ৱা হৈছে: $1",
+'passwordreset-emailerror-capture' => "à¦à¦–ন গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ উদà§à¦§à¦¾à§° ইমেইল সৃষà§à¦Ÿà¦¿ কৰা হ'ল কিনà§à¦¤à§ সদসà§à¦¯à¦œà¦¨à¦²à§ˆ পঠিয়াব পৰা নগ'ল, à¦à¦‡à¦–ন তলত দেখà§à¦“ৱা হৈছে: $1",
# Special:ChangeEmail
'changeemail' => 'ই-মেইল ঠিকনা সলনি কৰক',
@@ -747,6 +749,7 @@ $2
'changeemail-oldemail' => 'বৰà§à¦¤à¦®à¦¾à¦¨à§° ই-মেইল ঠিকনা:',
'changeemail-newemail' => 'নতà§à¦¨ ই-মেইল ঠিকনা:',
'changeemail-none' => '(নাই)',
+'changeemail-password' => 'আপোনাৰ {{SITENAME}} গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦:',
'changeemail-submit' => 'ই-মেইল ঠিকনা সলনি কৰক',
'changeemail-cancel' => 'বাতিল কৰক',
@@ -936,7 +939,6 @@ $1ৰ দà§à¦¬à¦¾à§°à¦¾ à¦à¦‡ অৱৰোধ কৰা হৈছে ।
'template-protected' => '(সà§à§°à¦•à§à¦·à¦¿à¦¤)',
'template-semiprotected' => '(অৰà§à¦§-সà§à§°à¦•à§à¦·à¦¿à¦¤)',
'hiddencategories' => 'à¦à¦‡ পৃষà§à¦ à¦¾ {{PLURAL:$1|১-টা নিহিত শà§à§°à§‡à¦£à§€à§°|$1-টা নিহিত শà§à§°à§‡à¦£à§€à§°}} সদসà§à¦¯:',
-'nocreatetitle' => 'পৃষà§à¦ à¦¾ সৃষà§à¦Ÿà¦¿ সীমিত',
'nocreatetext' => '{{SITENAME}}ত নতà§à¦¨ পৃষà§à¦ à¦¾ সৃষà§à¦Ÿà¦¿à§° কà§à¦·à¦®à¦¤à¦¾ সীমাবদà§à¦§ কৰা হৈছে।
আপà§à¦¨à¦¿ ঘূৰি গৈ বৰà§à¦¤à¦®à¦¾à¦¨à§‡ থকা পৃষà§à¦ à¦¾ à¦à¦Ÿà¦¾ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ কৰিব পাৰে, বা [[Special:UserLogin|নতà§à¦¨ সদসà§à¦¯à¦­à§°à§à¦¤à¦¿ হওক/ পà§à§°à¦¬à§‡à¦¶ কৰক]] ।',
'nocreate-loggedin' => 'নতà§à¦¨ পৃষà§à¦ à¦¾ সৃষà§à¦Ÿà¦¿ কৰিবলৈ আপোনাৰ অনà§à¦®à¦¤à¦¿ নাই ।',
@@ -961,6 +963,15 @@ $1ৰ দà§à¦¬à¦¾à§°à¦¾ à¦à¦‡ অৱৰোধ কৰা হৈছে ।
'edit-already-exists' => "নতà§à¦¨ পৃষà§à¦ à¦¾ সৃষà§à¦Ÿà¦¿ কৰা নহ'ল ।
পৃষà§à¦ à¦¾à¦–ন ইতিমধà§à¦¯à§‡ আছেই ।",
'defaultmessagetext' => 'সাধাৰণ বাৰà§à¦¤à¦¾ পাঠà§à¦¯',
+'content-failed-to-parse' => '$1 মডেলৰ বাবে $2ৰ তথà§à¦¯ নিকা কৰিব পৰা নগ’ল: $3',
+'invalid-content-data' => 'অবৈধ সমল তথà§à¦¯',
+'content-not-allowed-here' => '[[$2]] পৃষà§à¦ à¦¾à¦¤ "$1" সমল অনà§à¦®à§‹à¦¦à¦¿à¦¤ নহয়',
+
+# Content models
+'content-model-wikitext' => 'ৱিকিপাঠà§à¦¯',
+'content-model-text' => 'সাধাৰণ পাঠà§à¦¯',
+'content-model-javascript' => 'জাভাসà§à¦•à§à§°à§€à¦ªà§à¦Ÿ',
+'content-model-css' => 'চি.à¦à¦š.à¦à¦š.',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''সতৰà§à¦•à¦¬à¦¾à¦£à§€:''' à¦à¦‡ পৃষà§à¦ à¦¾à¦–নত অধিক à¦à¦•à§à¦¸à¦ªà§‡à¦¨à¦šà¦¿à¦­ পাৰà§à¦šà¦¾à§° ফাংচন কল আছে ।
@@ -1331,9 +1342,9 @@ $1",
'prefs-emailconfirm-label' => 'ইমেইল নিশà§à¦šà¦¿à¦¤à¦•à§°à¦£:',
'prefs-textboxsize' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ ৱিণà§à¦¡â€™à§° আকাৰ',
'youremail' => 'আপোনাৰ ই-মেইল *',
-'username' => 'সদসà§à¦¯à¦¨à¦¾à¦®:',
-'uid' => 'সদসà§à¦¯ চিহà§à¦¨:',
-'prefs-memberingroups' => 'à¦à¦‡ {{PLURAL:$1|গোটৰ|গোটবোৰৰ}} সদসà§à¦¯:',
+'username' => '{{GENDER:$1|সদসà§à¦¯à¦¨à¦¾à¦®}}:',
+'uid' => '{{GENDER:$1|User}} চিহà§à¦¨:',
+'prefs-memberingroups' => '{{PLURAL:$1|গোট|গোটসমূহৰ}} {{GENDER:$2|সদসà§à¦¯}} :',
'prefs-registration' => 'পঞà§à¦œà§€à¦¯à¦¼à¦¨ কৰাৰ সময়:',
'yourrealname' => 'পà§à§°à¦•à§ƒà¦¤ নাম:',
'yourlanguage' => 'ভাষা:',
@@ -1483,12 +1494,13 @@ $1",
'right-sendemail' => 'আন সদসà§à¦¯à¦²à§ˆ ই-পতà§à§° ঠিকনা পঠিয়াওক',
'right-passwordreset' => 'পাছৱৰà§à¦¡ ৰি-চেটৰ ই-মেইলসমূহ দেখà§à§±à¦¾à¦“ক',
+# Special:Log/newusers
+'newuserlogpage' => 'সদসà§à¦¯à§° সৃষà§à¦Ÿà¦¿ অভিলেখ',
+'newuserlogpagetext' => 'à¦à¦‡à¦–ন à¦à¦–ন সদসà§à¦¯ সৃষà§à¦Ÿà¦¿à§° ল’গ।',
+
# User rights log
'rightslog' => 'সভà§à¦¯à§° অধিকাৰৰ লেখ',
'rightslogtext' => 'সদসà§à¦¯ অধিকাৰৰ পৰিৱৰà§à¦¤à¦¨à¦¸à¦®à§‚হৰ ল’গ',
-'rightslogentry' => "$1-ৰ গোট সদসà§à¦¯à¦ªà¦¦ $2-ৰ পৰা $3-লৈ সলনি কৰা হ'ল",
-'rightslogentry-autopromote' => '$2ৰ পৰা $3লৈ সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼à¦­à¦¾à§±à§‡ পদোনà§à¦¨à§€à¦¤ হ’ল',
-'rightsnone' => '(নাই)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'à¦à¦‡ পৃষà§à¦ à¦¾ পঢ়ক',
@@ -1725,6 +1737,7 @@ URL টোৰ বৈধতা বিচাৰ কৰি পà§à¦¨à§° চেষà§
'backend-fail-notsame' => '$1ত ইতিমধà§à¦¯à§‡ বেলেগ à¦à¦Ÿà¦¾ ফাইল আছে।',
'backend-fail-invalidpath' => '$1টো বৈধ সঞà§à¦šà¦¯à¦¼ পথ নহয়।',
'backend-fail-delete' => '$1 ফাইলটো বিলোপ কৰিব পৰা নগল।',
+'backend-fail-describe' => 'নথিৰ "$1" মিডিয়া তথà§à¦¯ সলনি কৰিব পৰা নগ’ল',
'backend-fail-alreadyexists' => '$1 ফাইলটো ইতিমধà§à¦¯à§‡ আছেই।',
'backend-fail-store' => "$1 ফাইলটো $2ত সাà¦à¦šà¦¿à¦¬ পৰা নগ'ল।",
'backend-fail-copy' => '$1 ফাইলটো $2 লৈ পà§à§°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ কৰিব পৰা নগ’ল',
@@ -1963,6 +1976,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
তাৰ সলনি সেইবোৰত উপযà§à¦•à§à¦¤ পৃষà§à¦ à¦¾à§° লগত সংযোগ থাকিব পাৰে।
[[MediaWiki:Disambiguationspage]]ৰ পৰা সংযোগ থকা কোনো সাà¦à¦š বà§à¦¯à§±à¦¹à¦¾à§° কৰিলে à¦à¦–ন পৃষà§à¦ à¦¾à¦• দà§à¦¬à§à¦¯à§°à§à¦¥à¦¤à¦¾ দূৰীকৰণ পৃষà§à¦ à¦¾ হিছাপে গণà§à¦¯ কৰা হয়।",
+'pageswithprop' => 'পৃষà§à¦ à¦¾ উপাদান সমà§à¦¬à¦²à¦¿à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
+'pageswithprop-legend' => 'পৃষà§à¦ à¦¾ উপাদান সমà§à¦¬à¦²à¦¿à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
+'pageswithprop-submit' => 'যাওক',
+
'doubleredirects' => 'দà§à¦¬à¦¿-পà§à¦¨à¦ƒà¦¨à¦¿à§°à§à¦¦à§‡à¦¶à¦¿à¦¤',
'doubleredirectstext' => 'আন পà§à¦¨à§°à§à¦¨à¦¿à¦¦à§‡à¦¶à¦¨à¦¾ পৃষà§à¦ à¦¾à¦²à§ˆ পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶à¦¿à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ à¦à¦‡ তালিকাত দিয়া হৈছে ।
পà§à§°à¦¤à§à¦¯à§‡à¦• পথালী শাৰীত পà§à§°à¦¥à¦® আৰৠদà§à¦¬à¦¿à¦¤à§€à¦¯à¦¼ পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶à¦¨à¦¾à§° সংযোগৰ লগতে দà§à¦¬à¦¿à¦¤à§€à¦¯à¦¼ পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶à¦¨à¦¾à§° লকà§à¦·à§à¦¯ সংযোগ দিয়া আছে । à¦à¦‡ লকà§à¦·à§à¦¯ সংযোগটো সাধাৰণতে "পà§à§°à¦•à§ƒà¦¤" লকà§à¦·à§à¦¯ পৃষà§à¦ à¦¾ যাক পà§à§°à¦¥à¦® পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦‡ আঙà§à¦²à¦¿à¦¯à¦¼à¦¾à¦‡ দিয়ে ।
@@ -2114,9 +2131,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
'linksearch-pat' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ আৰà§à¦¹à¦¿:',
'linksearch-ns' => 'নামসà§à¦¥à¦¾à¦¨:',
'linksearch-ok' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
-'linksearch-text' => 'ৱাইলà§à¦¡à¦•à¦¾à§°à§à¦¡à¦¸à¦®à§‚হ যেনে "*.wikipedia.org" বà§à¦¯à§±à¦¹à¦¾à§° কৰিব পাৰি।
-অনà§à¦¤à¦¤ à¦à¦Ÿà¦¾ উচà§à¦š-সà§à¦¤à§°à§° ডমেইনৰ পà§à§°à¦¯à¦¼à§‹à¦œà¦¨, উদাহৰণসà§à¦¬à§°à§‚প "*.org"। <br />
-সমৰà§à¦¥à¦¿à¦¤ পà§à§°à¦Ÿà§‹à¦•à¦²à¦¸à¦®à§‚হ: <code>$1</code> (ইয়াৰ à¦à¦Ÿà¦¾à¦•à§‹ নিজৰ সনà§à¦§à¦¾à¦¨ যোগ নকৰিব)।',
+'linksearch-text' => "ৱাইলà§à¦¡à¦•à¦¾à§°à§à¦¡à¦¸à¦®à§‚হ যেনে \"*.wikipedia.org\" বà§à¦¯à§±à¦¹à¦¾à§° কৰিব পাৰি।
+অনà§à¦¤à¦¤ à¦à¦Ÿà¦¾ উচà§à¦š-সà§à¦¤à§°à§° ডমেইনৰ পà§à§°à¦¯à¦¼à§‹à¦œà¦¨, উদাহৰণসà§à¦¬à§°à§‚প \"*.org\"। <br />
+সমৰà§à¦¥à¦¿à¦¤ {{PLURAL:\$2|পà§à§°'ট'ক'ল|পà§à§°'ট'ক'লসমূহ}} : <code>\$1</code> (কোনো পà§à§°'ট'ক'ল নিৰà§à¦¦à¦¿à¦·à§à¦Ÿ নকৰিলে http:// সূচাব)।",
'linksearch-line' => '$2 পৰা $1 সংযোগ কৰা হৈছে',
'linksearch-error' => "ৱাইলà§à¦¡à¦•à¦¾à§°à§à¦¡ কেৱল হ'ষà§à¦Ÿà¦¨à¦¾à¦®à§° আৰমà§à¦­à¦£à¦¿à¦¤à¦¹à§‡ দেখা যাব ।",
@@ -2135,10 +2152,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
'activeusers-hidesysops' => 'পà§à§°à¦¶à¦¾à¦¸à¦• নেদেখà§à§±à¦¾à¦¬',
'activeusers-noresult' => "কোনো সদসà§à¦¯ পোৱা নগ'ল।",
-# Special:Log/newusers
-'newuserlogpage' => 'সদসà§à¦¯à§° সৃষà§à¦Ÿà¦¿ অভিলেখ',
-'newuserlogpagetext' => 'à¦à¦‡à¦–ন à¦à¦–ন সদসà§à¦¯ সৃষà§à¦Ÿà¦¿à§° ল’গ।',
-
# Special:ListGroupRights
'listgrouprights' => 'বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€ গোটৰ অধিকাৰ',
'listgrouprights-summary' => 'à¦à¦‡ ৱিকিত থকা গোটসমূহৰ তালিকা সেইবোৰৰ পà§à§°à§±à§‡à¦¶à¦¾à¦§à¦¿à¦•à¦¾à§°à¦¸à¦¹ তলত দিয়া হ’ল ।
@@ -2233,31 +2246,34 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
'enotif_mailer' => '{{SITENAME}} জাননী ই-পতà§à§° পà§à§°à§‡à§°à¦•',
'enotif_reset' => 'সকলো পৃষà§à¦ à¦¾ পৰিদৰà§à¦¶à¦¿à¦¤ বà§à¦²à¦¿ চিহà§à¦¨à¦¿à¦¤ কৰক',
-'enotif_newpagetext' => 'à¦à¦‡à¦–ন à¦à¦–ন নতà§à¦¨ পৃষà§à¦ à¦¾à¥¤',
'enotif_impersonal_salutation' => '{{SITENAME}} সদসà§à¦¯',
-'changed' => 'সলোৱা হৈছে',
-'created' => 'সৃষà§à¦Ÿà¦¿ কৰা হ’ল',
-'enotif_subject' => '{{SITENAME}}ৰ $PAGETITLE পৃষà§à¦ à¦¾à¦–ন $PAGEEDITORৰ দà§à¦¬à¦¾à§°à¦¾ $CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}} পৃষà§à¦ à¦¾ $1 {{gender:$2|$2}} ৰ দà§à¦¬à¦¾à§°à¦¾ বিলোপ কৰা হ’ল',
+'enotif_subject_created' => '{{SITENAME}} পৃষà§à¦ à¦¾ $1 {{gender:$2|$2}}ৰ দà§à¦¬à¦¾à§°à¦¾ সৃষà§à¦Ÿà¦¿ কৰা হ’ল',
+'enotif_subject_moved' => '{{SITENAME}} পৃষà§à¦ à¦¾ $1 {{gender:$2|$2}}ৰ দà§à¦¬à¦¾à§°à¦¾ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° সৃষà§à¦Ÿà¦¿ কৰা',
+'enotif_subject_restored' => '{{SITENAME}} পৃষà§à¦ à¦¾ $1 {{gender:$2|$2}}ৰ দà§à¦¬à¦¾à§°à¦¾ পà§à¦¨à§° সà§à¦¥à¦¾à¦ªà¦¨ কৰা',
+'enotif_subject_changed' => '{{SITENAME}} পৃষà§à¦ à¦¾ $1 {{gender:$2|$2}}ৰ দà§à¦¬à¦¾à§°à¦¾ সলনি কৰা হ’ল',
+'enotif_body_intro_deleted' => '{{SITENAME}}ৰ পৃষà§à¦ à¦¾ $1ক $PAGEEDITDATE তাৰিখে {{gender:$2|$2}}ৰ দà§à¦¬à¦¾à§°à¦¾ বিলোপ কৰা হৈছিল। $3 চাওক।',
+'enotif_body_intro_created' => '{{SITENAME}}ৰ পৃষà§à¦ à¦¾ $1, $PAGEEDITDATE তাৰিখে {{gender:$2|$2}}ৰ দà§à¦¬à¦¾à§°à¦¾ সৃষà§à¦Ÿà¦¿ কৰা হৈছিল, বৰà§à¦¤à¦®à¦¾à¦¨à§° সংসà§à¦•à§°à¦£à§° বাবে $3 চাওক।',
+'enotif_body_intro_moved' => '{{SITENAME}}ৰ পৃষà§à¦ à¦¾ $1, $PAGEEDITDATE তাৰিখে {{gender:$2|$2}}ৰ দà§à¦¬à¦¾à§°à¦¾ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰা হৈছিল, বৰà§à¦¤à¦®à¦¾à¦¨à§° সংসà§à¦•à§°à¦£à§° বাবে $3 চাওক।',
+'enotif_body_intro_restored' => '{{SITENAME}}ৰ পৃষà§à¦ à¦¾ $1, $PAGEEDITDATE তাৰিখে {{gender:$2|$2}}ৰ দà§à¦¬à¦¾à§°à¦¾ পà§à¦¨à§° সà§à¦¥à¦¾à¦ªà¦¨ কৰা হৈছিল, বৰà§à¦¤à¦®à¦¾à¦¨à§° সংসà§à¦•à§°à¦£à§° বাবে $3 চাওক।',
+'enotif_body_intro_changed' => '{{SITENAME}}ৰ পৃষà§à¦ à¦¾ $1, $PAGEEDITDATE তাৰিখে {{gender:$2|$2}}ৰ দà§à¦¬à¦¾à§°à¦¾ সলনি কৰা হৈছিল, বৰà§à¦¤à¦®à¦¾à¦¨à§° সংসà§à¦•à§°à¦£à§° বাবে $3 চাওক।',
'enotif_lastvisited' => 'আপোনাৰ শেষ পৰিদৰà§à¦¶à¦¨à§° পিছত হোৱা সকলো সালসলনিৰ বাবে $1 চাওক ।',
'enotif_lastdiff' => 'à¦à¦‡ পৰিৱৰà§à¦¤à¦¨à¦Ÿà§‹ চাবৰ বাবে $1 চাওক ।',
'enotif_anon_editor' => 'বেনামী সদসà§à¦¯ $1',
'enotif_body' => 'পà§à§°à¦¿à¦¯à¦¼ $WATCHINGUSERNAME,
-
-{{SITENAME}}ৰ $PAGETITLE শিৰোনামাৰ পৃষà§à¦ à¦¾à¦–ন $PAGEEDITDATE তাৰিখে $PAGEEDITORৰ দà§à¦¬à¦¾à§°à¦¾ $CHANGEDORCREATED। সামà§à¦ªà§à§°à¦¤à¦¿à¦• সংশোধনৰ বাবে $PAGETITLE_URL চাওক।
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
সমà§à¦ªà¦¾à¦¦à¦•à§° সাৰাংশ: $PAGESUMMARY $PAGEMINOREDIT
-সমà§à¦ªà¦¾à¦¦à¦•à¦œà¦¨à§° লগত যোগাযোগ:
+সমà§à¦ªà¦¾à¦¦à¦•à¦œà¦¨à¦• যোগাযোগ কৰক:
মেইল: $PAGEEDITOR_EMAIL
ৱিকি: $PAGEEDITOR_WIKI
-আপà§à¦¨à¦¿ à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন নোচোৱালৈকে আন সালসলনিৰ কোনো জাননী দিয়া নহ’ব ।
+আপà§à¦¨à¦¿ à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন নোচোৱালৈকে আন সালসলনিৰ কোনো জাননী দিয়া নহ’ব।
আপà§à¦¨à¦¿ আপোনাৰ লকà§à¦·à§à¦¯-তালিকাৰ পৃষà§à¦ à¦¾à¦¬à§‹à§°à§° জাননী ফà§à¦²à§‡à¦— পূৰà§à¦¬à§° অৱসà§à¦¥à¦¾à¦²à§ˆà¦“ ঘূৰাই নিব পাৰে ।
-আপোনাৰ {{SITENAME}}ৰ জাননী বà§à¦¯à§±à¦¸à§à¦¥à¦¾
+আপোনাৰ {{SITENAME}} জাননী বà§à¦¯à§±à¦¸à§à¦¥à¦¾
--
আপোনাৰ ই-মেইল জাননী ছেটিং সলনি কৰিবলৈ à¦à¦‡à¦–ন চাওক
@@ -2271,6 +2287,8 @@ $UNWATCHURL
পà§à§°à¦¤à¦¿à¦•à§à§°à¦¿à¦¯à¦¼à¦¾ আৰৠঅধিক সহযোগিতাৰ বাবে:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'সৃষà§à¦Ÿà¦¿ কৰা হ’ল',
+'changed' => 'সলোৱা হৈছে',
# Delete
'deletepage' => 'পৃষà§à¦ à¦¾ বিলোপ কৰক',
@@ -2343,6 +2361,8 @@ $UNWATCHURL
'prot_1movedto2' => '$1 ক $2 লৈ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§°à¦¿à¦¤ কৰা হল',
'protect-badnamespace-title' => 'অসà§à§°à¦•à§à¦·à¦¿à¦¤ নামসà§à¦¥à¦¾à¦¨',
'protect-badnamespace-text' => 'à¦à¦‡ নামসà§à¦¥à¦¾à¦¨à§° পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ সà§à§°à¦•à§à¦·à¦¿à¦¤ কৰিব নোৱাৰি।',
+'protect-norestrictiontypes-text' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন সà§à§°à¦•à§à¦·à¦¿à¦¤ কৰিব নোৱাৰি কাৰণ কোনো বাধা পà§à§°à¦•à¦¾à§° নাই।',
+'protect-norestrictiontypes-title' => 'সà§à§°à¦•à§à¦·à¦¾ পà§à§°à¦¯à§‹à¦œà§à¦¯ নোহোৱা পৃষà§à¦ à¦¾',
'protect-legend' => 'সà§à§°à¦•à§à¦·à¦¾ নিশà§à¦šà¦¿à¦¤ কৰক',
'protectcomment' => 'কাৰণ:',
'protectexpiry' => 'সময় শেষ:',
@@ -2428,8 +2448,8 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|১টা সংশোধন|$1টা সংশোধন}} পà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§° কৰা হৈছে',
'undeletedrevisions-files' => '{{PLURAL:$1|১টা সংশোধন|$1 টা সংশোধন}} আৰৠ{{PLURAL:$2|১ খন নথি|$2 খন নথি}} পà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§° কৰা হ’ল',
'undeletedfiles' => '{{PLURAL:$1|১খন নথি|$1 খন নথি}} পà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§° কৰা হ’ল',
-'cannotundelete' => 'অৱলà§à¦ªà§à¦¤à¦¿ বিফল হৈছে;
-আন কোনোবাই আগতেই ইয়াক বিলোপ কৰিছে ।',
+'cannotundelete' => 'বিলোপ বাতিলকৰণ বিফল হৈছে;
+$1',
'undeletedpage' => "'''$1ক পà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§° কৰা হৈছে'''
অনà§à¦—à§à§°à¦¹ কৰি শেহতীয়া অৱলà§à¦ªà§à¦¤à¦¿ আৰৠপà§à¦¨à§°à§à¦¦à§à¦§à¦¾à§°à§° বাবে [[Special:Log/delete|অৱলà§à¦ªà§à¦¤à¦¿ অভিলেখ]] চাওক ।",
'undelete-header' => 'শেহতীয়াকৈ বিলোপ কৰা পৃষà§à¦ à¦¾à¦¸à¦®à§‚হৰ বাবে [[Special:Log/delete|অৱলà§à¦ªà§à¦¤à¦¿ ল’গ]] চাওক ।',
@@ -2460,7 +2480,7 @@ $1',
'blanknamespace' => '(মà§à¦–à§à¦¯)',
# Contributions
-'contributions' => 'সদসà§à¦¯à§° বৰঙণিসমূহ',
+'contributions' => '{{GENDER:$1|সদসà§à¦¯à§°}} বৰঙণিসমূহ',
'contributions-title' => '$1ৰ বৰঙণিসমূহ',
'mycontris' => 'বৰঙণিসমূহ',
'contribsub2' => '$1 ৰ কাৰণে ($2)',
@@ -2738,6 +2758,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
'immobile-target-namespace-iw' => 'পৃষà§à¦ à¦¾ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§°à§° বাবে আনà§à¦¤à¦ƒà§±à¦¿à¦•à¦¿ সংযোগ বৈধ গনà§à¦¤à¦¬à§à¦¯à¦¸à§à¦¥à¦² নহয় ।',
'immobile-source-page' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰিব নোৱাৰি ।',
'immobile-target-page' => 'গনà§à¦¤à¦¬à§à¦¯ শিৰোনামালৈ সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰিব পৰা নাযাব ।',
+'bad-target-model' => 'কাংকà§à¦·à¦¿à¦¤ লকà§à¦·à§à¦¯à¦¸à§à¦¥à¦¾à¦¨à§° সমলৰ মডেলৰ সতে মিলা নাই। $1ৰ পৰা $2লৈ সলনি কৰিব পৰা নগ’ল।',
'imagenocrossnamespace' => 'অনা-ফাইল নামসà§à¦¥à¦¾à¦¨à¦²à§ˆ ফাইল সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰিব নোৱাৰি',
'nonfile-cannot-move-to-file' => 'ফাইল নামসà§à¦¥à¦¾à¦¨à¦²à§ˆ অনা-ফাইল সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à§° কৰিব নোৱাৰি',
'imagetypemismatch' => 'নতà§à¦¨ ফাইলৰ à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦›à¦¨à¦Ÿà§‹ ইয়াৰ পà§à§°à¦•à¦¾à§°à§° লগত মিলা নাই',
@@ -2869,7 +2890,6 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
# JavaScriptTest
'javascripttest' => 'জাভাসà§à¦•à§à§°à¦¿à¦ªà§à¦Ÿ পৰীকà§à¦·à¦¾à¥¤',
-'javascripttest-disabled' => 'à¦à¦‡ ৱিকিত à¦à¦‡ কাৰà§à¦¯à¦Ÿà§‹ সকà§à§°à¦¿à¦¯à¦¼ কৰা হোৱা নাই।',
'javascripttest-title' => '$1 পৰীকà§à¦·à¦¾à¦¸à¦®à§‚হ চলোৱা হৈছে',
'javascripttest-pagetext-noframework' => 'à¦à¦‡ পৃষà§à¦ à¦¾à¦–ন জাভালিপি পৰীকà§à¦·à¦¾ চলোৱাৰ বাবে সংৰকà§à¦·à¦¿à¦¤à¥¤',
'javascripttest-pagetext-unknownframework' => 'অজà§à¦žà¦¾à¦¤ সমà§à¦ªà§°à§€à¦•à§à¦·à¦¾ ফà§à§°à§‡à¦®à§±à§°à§à¦• "$1"।',
@@ -2983,6 +3003,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
'pageinfo-default-sort' => 'ডিফলà§à¦Ÿ চৰà§à¦Ÿ কী',
'pageinfo-length' => 'পৃষà§à¦ à¦¾à§° দৈৰà§à¦˜à§à¦¯ (বাইটত)',
'pageinfo-article-id' => 'পৃষà§à¦ à¦¾ ID',
+'pageinfo-language' => 'পৃষà§à¦ à¦¾à¦¤ সনà§à¦¨à¦¿à¦¬à¦¿à¦·à§à¦Ÿ ভাষা',
'pageinfo-robot-policy' => 'সনà§à¦§à¦¾à¦¨ ইঞà§à¦œà¦¿à¦¨à§° সà§à¦¥à¦¿à¦¤à¦¿',
'pageinfo-robot-index' => 'ইনডেকà§à¦¸ উপযোগী',
'pageinfo-robot-noindex' => 'ইনডেকà§à¦¸à§° অনà§à¦ªà¦¯à§‹à¦—ী',
@@ -3002,6 +3023,14 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
'pageinfo-magic-words' => 'যাদà§à¦•à§°à§€ {{PLURAL:$1|শবà§à¦¦|শবà§à¦¦à¦¬à§‹à§°}} ($1)',
'pageinfo-hidden-categories' => 'অদৃশà§à¦¯ {{PLURAL:$1|শà§à§°à§‡à¦£à§€|শà§à§°à§‡à¦£à§€à¦¸à¦®à§‚হ}} ($1)',
'pageinfo-templates' => 'সংযà§à¦•à§à¦¤ {{PLURAL:$1|সাà¦à¦š|সাà¦à¦šà¦¸à¦®à§‚হ}} ($1)',
+'pageinfo-toolboxlink' => 'পৃষà§à¦ à¦¾à¦–নৰ বিষয়ে তথà§à¦¯',
+'pageinfo-redirectsto' => 'পà§à¦¨à§°à§à¦¨à¦¿à§°à§à¦¦à§‡à¦¶ কৰা হৈছে',
+'pageinfo-redirectsto-info' => 'তথà§à¦¯',
+'pageinfo-contentpage' => 'সমল পৃষà§à¦ à¦¾à§°à§‚পে গণনা কৰা হৈছে',
+'pageinfo-contentpage-yes' => 'হয়',
+'pageinfo-protect-cascading' => 'সà§à§°à¦•à§à¦·à¦¾à¦¸à¦®à§‚হ ইয়াৰ পৰা পà§à§°à¦ªà¦¾à¦¤à¦¾à¦•à¦¾à§° হৈছে',
+'pageinfo-protect-cascading-yes' => 'হয়',
+'pageinfo-protect-cascading-from' => 'সà§à§°à¦•à§à¦·à¦¾à¦¸à¦®à§‚হ পà§à§°à¦ªà¦¾à¦¤à¦¾à¦•à¦¾à§° হৈছে',
# Patrolling
'markaspatrolleddiff' => 'নিৰীকà§à¦·à¦¿à¦¤ বà§à¦²à¦¿ চিহà§à¦¨à¦¿à¦¤ কৰক',
@@ -3013,6 +3042,8 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
'markedaspatrollederror' => 'নিৰীকà§à¦·à¦¿à¦¤ বà§à¦²à¦¿ চিহà§à¦¨à¦¿à¦¤ কৰিব নোৱাৰি',
'markedaspatrollederrortext' => 'নিৰীকà§à¦·à¦£ কৰা বà§à¦²à¦¿ চিহà§à¦¨à¦¿à¦¤ কৰিবলৈ আপà§à¦¨à¦¿ à¦à¦Ÿà¦¾ পà§à¦¨à§°à§€à¦•à§à¦·à¦£ ধাৰà§à¦¯à§à¦¯ কৰিব লাগিব।',
'markedaspatrollederror-noautopatrol' => 'আপোনাক নিজৰ পৰিৱৰà§à¦¤à¦¨à¦¸à¦®à§‚হ নিৰিকà§à¦·à¦¿à¦¤ বà§à¦²à¦¿ চিহà§à¦¨à¦¿à¦¤ কৰাৰ অনà§à¦®à¦¤à¦¿ নাই।',
+'markedaspatrollednotify' => '$1ৰ à¦à¦‡ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ নিৰীকà§à¦·à¦¿à¦¤à§°à§‚পে চিহà§à¦¨à¦¿à¦¤ কৰা হ’ল।',
+'markedaspatrollederrornotify' => 'নিৰীকà§à¦·à¦£à¦¬à¦¿à¦¹à§€à¦¨ ৰূপে চিহà§à¦¨à¦¿à¦¤ কৰা হ’ল',
# Patrol log
'patrol-log-page' => 'নিৰীকà§à¦·à¦£ অভিলেখ',
@@ -3046,6 +3077,7 @@ $1',
'file-nohires' => 'ইয়াতকৈ ডাঙৰকৈ দেখà§à§±à¦¾à¦¬ নোৱাৰি ।',
'svg-long-desc' => 'SVG ফাইল, সাধাৰণতঃ $1 × $2 পিকà§à¦¸à§‡à¦², ফাইল মাতà§à§°à¦¾: $3',
'svg-long-desc-animated' => 'à¦à¦¨à¦¿à¦®à§‡à¦Ÿà§‡à¦¡ SVG ফাইল, সাধাৰণতে $1 × $2 পিকà§à¦¸à§‡à¦², ফাইলৰ আকাৰ: $3',
+'svg-long-error' => 'অবৈধ SVG ফাইল: $1',
'show-big-image' => "সমà§à¦ªà§‚ৰà§à¦£ ৰিজ'লিউশà§à¦¯à¦¨",
'show-big-image-preview' => 'à¦à¦‡ খচৰাৰ আকাৰ: $1.',
'show-big-image-other' => "আন {{PLURAL:$2|ৰিজ'লিউশà§à¦¯à¦¨|ৰিজ'লিউশà§à¦¯à¦¨à¦¸à¦®à§‚হ}}: $1।",
@@ -3076,6 +3108,7 @@ $1',
'hours' => '{{PLURAL:$1|$1 ঘনà§à¦Ÿà¦¾|$1 ঘনà§à¦Ÿà¦¾}}',
'days' => '{{PLURAL:$1|$1 দিন|$1 দিন}}',
'ago' => '$1 আগেয়ে',
+'just-now' => 'à¦à¦‡à¦®à¦¾à¦¤à§à§°',
# Bad image list
'bad_image_list' => 'The format is as follows:
@@ -3577,6 +3610,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[আনà§à¦¤à¦ƒà§±à¦¿à¦•à¦¿ আনà§à¦¤à¦ƒà¦­à§à¦•à§à¦¤à¦¿ নিষà§à¦•à§à§°à¦¿à¦¯à¦¼ কৰা আছে]',
'scarytranscludefailed' => '[$1ৰ বাবে সাà¦à¦š অনা অসফল হৈছে]',
+'scarytranscludefailed-httpstatus' => '[$1ৰ বাবে সাà¦à¦š অনা অসফল হৈছে: HTTP $2]',
'scarytranscludetoolong' => '[URL অতà§à¦¯à¦¾à¦§à¦¿à¦• দীঘল]',
# Delete conflict
@@ -3688,6 +3722,7 @@ $5
'version-license' => 'অনà§à¦œà§à¦žà¦¾à¦ªà¦¤à§à§°',
'version-poweredby-credits' => "à¦à¦‡ ৱিকি '''[//www.mediawiki.org/ মিডিয়াৱিকিৰ]''' দà§à¦¬à¦¾à§°à¦¾ পà§à§°à¦šà¦²à¦¿à¦¤ , কপিৰাইট © ২০০১-$1 $2.",
'version-poweredby-others' => 'অনà§à¦¯',
+'version-credits-summary' => 'আমি নিমà§à¦¨à§‹à¦•à§à¦¤ বà§à¦¯à¦•à§à¦¤à¦¿à¦¸à¦•à¦²à¦• তেওà¦à¦²à§‹à¦•à§‡ [[Special:Version|মিডিয়াৱিকি]]লৈ দিয়া দিয়া বৰঙনিৰ বাবে চিনাকী কৰিব বিচাৰিছো।',
'version-license-info' => "মিডিয়াৱিকি à¦à¦Ÿà¦¾ বিনামূলীয়া চফà§à¦Ÿà§±à§‡à§°; আপà§à¦¨à¦¿ Free Software Foundation -ৰ দà§à¦¬à¦¾à§°à¦¾ পà§à§°à¦•à¦¾à¦¶à¦¿à¦¤ GNU General Public License -ৰ চà§à¦•à§à¦¤à¦¿à¦¸à¦®à§‚হৰ অনà§à¦¤à§°à§à¦—ত ইয়াক পà§à¦¨à§° বিতৰণ কৰিব পাৰিব অথবা সলনি কৰিব পাৰিব; হয়তো অনà§à¦œà§à¦žà¦¾à¦ªà¦¤à§à§°à§° সংসà§à¦•à§°à¦£ ২
অথবা (আপোনাৰ বিকলà§à¦ªà¦¤) যিকোনো পৰৱৰà§à¦¤à§€ সংসà§à¦•à§°à¦£à¥¤
@@ -3834,7 +3869,10 @@ $5
'logentry-newusers-create' => "বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ $1 সৃষà§à¦Ÿà¦¿ কৰা হ'ল",
'logentry-newusers-create2' => "$1ৰ দà§à¦¬à¦¾à§°à¦¾ à¦à¦Ÿà¦¾ বà§à¦¯à§±à¦¹à¦¾à§°à¦•à¦¾à§°à§€ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ $3 সৃষà§à¦Ÿà¦¿ কৰা হ'ল",
'logentry-newusers-autocreate' => '$1’ৰ à¦à¦•à¦¾à¦‰à¦£à§à¦Ÿ সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼à¦­à¦¾à§±à§‡ সৃষà§à¦Ÿà¦¿ কৰা হৈছিল',
-'newuserlog-byemail' => 'গà§à¦ªà§à¦¤à¦¶à¦¬à§à¦¦ ই-মেইল কৰি পঠোৱা হৈছে',
+'logentry-rights-rights' => "$1ৰ গোট সদসà§à¦¯à¦ªà¦¦ $3ৰ পৰা $4লৈ $5 লৈ সলনি কৰা হ'ল",
+'logentry-rights-rights-legacy' => "$1-ৰ গোট সদসà§à¦¯à¦ªà¦¦ $3-লৈ সলনি কৰা হ'ল",
+'logentry-rights-autopromote' => '$1ক $4ৰ পৰা $5লৈ সà§à¦¬à¦¯à¦¼à¦‚কà§à§°à¦¿à¦¯à¦¼à¦­à¦¾à§±à§‡ পদোনà§à¦¨à§€à¦¤ কৰা হ’ল',
+'rightsnone' => '(নাই)',
# Feedback
'feedback-bugornote' => 'যদি আপà§à¦¨à¦¿ à¦à¦Ÿà¦¾ কাৰিকৰী সমসà§à¦¯à¦¾à§° বিৱৰণ দিবলৈ পà§à§°à¦¸à§à¦¤à§à¦¤, অনà§à¦—à§à§°à¦¹ কৰি [$1 à¦à¦Ÿà¦¾ বাগ ৰিপ\'ৰà§à¦Ÿ কৰক]।
diff --git a/languages/messages/MessagesAst.php b/languages/messages/MessagesAst.php
index f7f19ea4..e39f4955 100644
--- a/languages/messages/MessagesAst.php
+++ b/languages/messages/MessagesAst.php
@@ -192,6 +192,7 @@ $messages = array(
'newwindow' => "(s'abre nuna ventana nueva)",
'cancel' => 'Encaboxar',
'moredotdotdot' => 'Más...',
+'morenotlisted' => 'Más na llista...',
'mypage' => 'Páxina',
'mytalk' => 'Alderique',
'anontalk' => 'Alderique pa esta IP',
@@ -203,7 +204,6 @@ $messages = array(
'qbbrowse' => 'Navegar',
'qbedit' => 'Editar',
'qbpageoptions' => 'Esta páxina',
-'qbpageinfo' => 'Contestu',
'qbmyoptions' => 'Les mios páxines',
'qbspecialpages' => 'Páxines especiales',
'faq' => 'EMF (entrugues más frecuentes)',
@@ -226,6 +226,7 @@ $messages = array(
'namespaces' => 'Espacios de nome',
'variants' => 'Variantes',
+'navigation-heading' => 'Menú de navegación',
'errorpagetitle' => 'Error',
'returnto' => 'Tornar a $1.',
'tagline' => 'De {{SITENAME}}',
@@ -469,10 +470,10 @@ L'alministrador que lu bloquió dio esti motivu: «$3».",
# Login and logout pages
'logouttext' => "'''Agora tas desconeutáu.'''
-Pues siguir usando {{SITENAME}} de forma anónima, o pues [[Special:UserLogin|volver entrar]] como'l mesmu o como otru usuariu.
+Pues siguir usando {{SITENAME}} de forma anónima, o pues <span class='plainlinks'>[$1 volver entrar]</span> como'l mesmu o como otru usuariu.
Ten en cuenta que dalgunes páxines puen siguir apaeciendo como si tovía tuvieres coneutáu, hasta que llimpies la caché del restolador.",
-'welcomecreation' => "== ¡Bienllegáu, $1! ==
-Creóse la to cuenta.
+'welcomeuser' => '¡Bienllegáu, $1!',
+'welcomecreation-msg' => "Creóse la to cuenta.
Nun t'escaezas d'escoyer les tos [[Special:Preferences|preferencies de {{SITENAME}}]].",
'yourname' => "Nome d'usuariu:",
'yourpassword' => 'Contraseña:',
@@ -496,7 +497,7 @@ Nun t'escaezas d'escoyer les tos [[Special:Preferences|preferencies de {{SITENAM
'gotaccount' => '¿Ya tienes una cuenta? $1.',
'gotaccountlink' => 'Identificase',
'userlogin-resetlink' => "¿Escaecisti los datos d'identificación?",
-'createaccountmail' => 'Per corréu electrónicu',
+'createaccountmail' => 'Usar una contraseña al debalu temporal y unviala a la direición de corréu electrónicu conseñada más abaxo',
'createaccountreason' => 'Motivu:',
'badretype' => "Les claves qu'escribisti nun concuayen.",
'userexists' => "El nome d'usuariu conseñáu yá ta usándose.
@@ -577,6 +578,7 @@ Por favor espera enantes d'intentalo otra vuelta.",
# Email sending
'php-mail-error-unknown' => 'Fallu desconocíu na función mail() de PHP.',
'user-mail-no-addy' => 'Intentasti unviar un corréu electrónicu ensin direición.',
+'user-mail-no-body' => "Trató d'unviar un corréu electrónicu con un cuerpu baleru o curtiu enforma.",
# Change password dialog
'resetpass' => 'Camudar la clave',
@@ -640,6 +642,7 @@ Clave provisional: $2",
'changeemail-oldemail' => 'Direición de corréu electrónicu actual:',
'changeemail-newemail' => 'Direición de corréu electrónicu nueva:',
'changeemail-none' => '(nengún)',
+'changeemail-password' => 'La to contraseña en {{SITENAME}}:',
'changeemail-submit' => 'Camudar el corréu electrónicu',
'changeemail-cancel' => 'Encaboxar',
@@ -829,7 +832,6 @@ La cabera entrada del rexistru s'ufre darréu pa referencia:",
'template-semiprotected' => '(semi-protexida)',
'hiddencategories' => 'Esta páxina pertenez a {{PLURAL:$1|una categoría anubrida|$1 categoríes anubríes}}:',
'edittools' => "<!-- Esti testu apaecerá baxo los formularios d'edición y xuba. -->",
-'nocreatetitle' => 'Creación de páxines limitada',
'nocreatetext' => '{{SITENAME}} tien restrinxida la capacidá de crear páxines nueves.
Pues volver atrás y editar una páxina esistente, o bien [[Special:UserLogin|identificate o crear una cuenta]].',
'nocreate-loggedin' => 'Nun tienes permisu pa crear páxines nueves.',
@@ -854,6 +856,15 @@ Paez que se desanició.',
'edit-already-exists' => 'Nun se pudo crear una páxina nueva.
Yá esiste.',
'defaultmessagetext' => 'Testu predetermináu',
+'content-failed-to-parse' => 'Fallu al analizar el conteníu $2 pal modelu $1: $3',
+'invalid-content-data' => 'Datos del conteníu inválidos',
+'content-not-allowed-here' => 'El conteníu «$1» nun se permite na páxina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'testu wiki',
+'content-model-text' => 'testu simple',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Avisu:''' Esta páxina contién demasiaes llamaes costoses a funciones d'análisis sintáuticu.
@@ -1218,9 +1229,9 @@ Esto nun se pue desfacer.',
'prefs-emailconfirm-label' => 'Confirmación del corréu:',
'prefs-textboxsize' => "Tamañu de la ventana d'edición",
'youremail' => 'Corréu electrónicu:',
-'username' => "Nome d'usuariu:",
-'uid' => "ID d'usuariu:",
-'prefs-memberingroups' => 'Miembru {{PLURAL:$1|del grupu|de los grupos}}:',
+'username' => "Nome d'{{GENDER:$1|usuariu|usuaria}}:",
+'uid' => 'ID {{GENDER:$1|del usuariu|de la usuaria}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Miembru}} {{PLURAL:$1|del grupu|de los grupos}}:',
'prefs-registration' => 'Hora del rexistru:',
'yourrealname' => 'Nome real:',
'yourlanguage' => 'Llingua:',
@@ -1369,12 +1380,13 @@ Esta información sedrá pública.",
'right-sendemail' => 'Unviar corréu a otros usuarios',
'right-passwordreset' => 'Ver los correos de reestablecimientu de conseña',
+# Special:Log/newusers
+'newuserlogpage' => "Rexistru de creación d'usuarios",
+'newuserlogpagetext' => "Esti ye un rexistru de creación d'usuarios.",
+
# User rights log
'rightslog' => "Rexistru de perfil d'usuariu",
'rightslogtext' => "Esti ye un rexistru de los cambeos de los perfiles d'usuariu.",
-'rightslogentry' => 'camudó la pertenencia de grupu del usuariu $1 dende $2 a $3',
-'rightslogentry-autopromote' => 'promocionó automáticamente de $2 a $3',
-'rightsnone' => '(nengún)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lleer esta páxina',
@@ -1624,6 +1636,7 @@ Si'l problema persiste, contauta con un [[Special:ListUsers/sysop|alministrador]
'backend-fail-notsame' => 'Yá esiste un ficheru non idénticu en $1.',
'backend-fail-invalidpath' => "$1 nun ye una ruta d'almacenamientu válida.",
'backend-fail-delete' => 'Nun se pudo desaniciar el ficheru $1.',
+'backend-fail-describe' => 'Nun se pudieron camudar los metadatos del ficheru "$1".',
'backend-fail-alreadyexists' => 'El ficheru $1 yá esiste.',
'backend-fail-store' => 'Nun se pudo guardar el ficheru $1 en $2.',
'backend-fail-copy' => 'Nun se pudo copiar el ficheru $1 como $2.',
@@ -1857,6 +1870,12 @@ Alcuérdate de comprobar otros enllaces a les plantíes enantes d'esborrales.",
'disambiguations-text' => "Les siguientes páxines contienen polo menos un enllaz a una '''páxina de dixebra'''. En cuenta d'ello habríen enllaciar a una páxina más apropiada.<br />
Una páxina tratase como una páxina de dixebra si usa una plantía que tea enllaciada dende [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'Páxines con una propiedá de páxina',
+'pageswithprop-legend' => 'Páxines con una propiedá de páxina',
+'pageswithprop-text' => "Esta páxina llista les páxines qu'usen una propiedá de páxina determinada.",
+'pageswithprop-prop' => 'Nome de la propiedá:',
+'pageswithprop-submit' => 'Dir',
+
'doubleredirects' => 'Redireiciones dobles',
'doubleredirectstext' => 'Esta páxina llista páxines que redireicionen a otres páxines de redireición.
Cada filera contién enllaces a la primer y segunda redireición, asina como al oxetivu de la segunda redireición, que de vezu ye la páxina oxetivu "real", onde tendría d\'empobinar la primer redireición.
@@ -2009,7 +2028,7 @@ Ver tamién les [[Special:WantedCategories|categoríes más buscaes]].",
'linksearch-ok' => 'Guetar',
'linksearch-text' => 'Se puen usar comodinos como "*.wikipedia.org".
Necesita polo menos un dominiu de primer nivel, como "*.org".<br />
-Protocolos almitíos: <code>$1</code> (el predetermináu ye http:// si nun se conseña dengún protocolu).',
+{{PLURAL:$2|Protocolu almitíu|Protocolos almitíos}}: <code>$1</code> (el predetermináu ye http:// si nun se conseña dengún protocolu).',
'linksearch-line' => '$1 enllaciáu dende $2',
'linksearch-error' => 'Los comodinos namái puen apaecer al entamu del nome del güéspede.',
@@ -2028,10 +2047,6 @@ Protocolos almitíos: <code>$1</code> (el predetermináu ye http:// si nun se co
'activeusers-hidesysops' => 'Anubrir alministradores',
'activeusers-noresult' => "Nun s'alcontraron usuarios.",
-# Special:Log/newusers
-'newuserlogpage' => "Rexistru de creación d'usuarios",
-'newuserlogpagetext' => "Esti ye un rexistru de creación d'usuarios.",
-
# Special:ListGroupRights
'listgrouprights' => "Drechos de los grupos d'usuariu",
'listgrouprights-summary' => "La siguiente ye una llista de grupos d'usuariu definíos nesta wiki, colos sos drechos d'accesu asociaos.
@@ -2126,24 +2141,27 @@ Los futuro cambeos nesta páxina y na so páxina d\'alderique asociada apaecerá
'enotif_mailer' => 'Notificación de corréu de {{SITENAME}}',
'enotif_reset' => 'Marcar toles páxines visitaes',
-'enotif_newpagetext' => 'Esta ye una páxina nueva.',
'enotif_impersonal_salutation' => 'Usuariu de {{SITENAME}}',
-'changed' => 'camudada',
-'created' => 'creada',
-'enotif_subject' => 'La páxina de {{SITENAME}} $PAGETITLE foi $CHANGEDORCREATED por $PAGEEDITOR',
+'enotif_subject_deleted' => '{{GENDER:$2|$2}} desanició la páxina «$1» de {{SITENAME}}',
+'enotif_subject_created' => '{{GENDER:$2|$2}} creó la páxina «$1» de {{SITENAME}}',
+'enotif_subject_moved' => '{{GENDER:$2|$2}} treslladó la páxina «$1» de {{SITENAME}}',
+'enotif_subject_restored' => '{{GENDER:$2|$2}} restauró la páxina «$1» de {{SITENAME}}',
+'enotif_subject_changed' => '{{GENDER:$2|$2}} camudó la páxina «$1» de {{SITENAME}}',
+'enotif_body_intro_deleted' => '{{GENDER:$2|$2}} desanició la páxina «$1» de {{SITENAME}} el $PAGEEDITDATE, consulta $3.',
+'enotif_body_intro_created' => '{{GENDER:$2|$2}} creó la páxina «$1» de {{SITENAME}} el $PAGEEDITDATE, consulta $3 pa ver la revisión actual.',
+'enotif_body_intro_moved' => '{{GENDER:$2|$2}} treslladó la páxina «$1» de {{SITENAME}} el $PAGEEDITDATE, consulta $3 pa ver la revisión actual.',
+'enotif_body_intro_restored' => '{{GENDER:$2|$2}} restauró la páxina «$1» de {{SITENAME}} el $PAGEEDITDATE, consulta $3 pa ver la revisión actual.',
+'enotif_body_intro_changed' => '{{GENDER:$2|$2}} camudó la páxina «$1» de {{SITENAME}} el $PAGEEDITDATE, consulta $3 pa ver la revisión actual.',
'enotif_lastvisited' => 'Mira en $1 pa ver tolos cambios dende la cabera visita.',
'enotif_lastdiff' => 'Mira en $1 pa ver esti cambéu.',
'enotif_anon_editor' => 'usuariu anónimu $1',
'enotif_body' => 'Estimáu $WATCHINGUSERNAME,
-
-La páxina de {{SITENAME}} $PAGETITLE foi $CHANGEDORCREATED el $PAGEEDITDATE por $PAGEEDITOR, mira $PAGETITLE_URL pa ver la versión actual.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Resume del editor: $PAGESUMMARY $PAGEMINOREDIT
-Ponte\'n contautu col editor:
+Ponte en contautu col editor:
corréu: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
@@ -2163,6 +2181,8 @@ $UNWATCHURL
Más ayuda y sofitu:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'creada',
+'changed' => 'camudada',
# Delete
'deletepage' => 'Esborrar páxina',
@@ -2234,6 +2254,8 @@ Consulta la [[Special:ProtectedPages|llista de páxines protexíes]] pa ver les
'prot_1movedto2' => '[[$1]] treslladáu a [[$2]]',
'protect-badnamespace-title' => 'Espaciu de nomes non protexible',
'protect-badnamespace-text' => "Les páxines d'esti espaciu de nomes nun se puen protexer.",
+'protect-norestrictiontypes-text' => 'Esta páxina nun se pue protexer porque nun ta disponible dengún tipu de torga.',
+'protect-norestrictiontypes-title' => 'Páxina non protexible',
'protect-legend' => 'Confirmar proteición',
'protectcomment' => 'Motivu:',
'protectexpiry' => 'Caduca:',
@@ -2317,7 +2339,8 @@ revisión fuera restaurada o eliminada del archivu.",
'undeletedrevisions' => '{{PLURAL:$1|1 revisión restaurada|$1 revisiones restauraes}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revisión|$1 revisiones}} y {{PLURAL:$2|1 archivu|$2 archivos}} restauraos',
'undeletedfiles' => '{{PLURAL:$1|1 archivu restauráu|$1 archivos restauraos}}',
-'cannotundelete' => 'Falló la restauración; seique daquién yá restaurara la páxina enantes.',
+'cannotundelete' => 'Falló la restauración:
+$1',
'undeletedpage' => "'''Restauróse $1'''
Consulta'l [[Special:Log/delete|rexistru d'esborraos]] pa ver los esborraos y restauraciones de recién.",
@@ -2348,7 +2371,7 @@ $1",
'blanknamespace' => '(Principal)',
# Contributions
-'contributions' => 'Collaboraciones del usuariu',
+'contributions' => 'Collaboraciones {{GENDER:$1|del usuariu|de la usuaria}}',
'contributions-title' => "Contribuciones d'usuariu pa $1",
'mycontris' => 'Collaboraciones',
'contribsub2' => 'Pa $1 ($2)',
@@ -2615,6 +2638,7 @@ La páxina de destín "[[:$1]]" yá esiste. ¿Quies esborrala pa dexar sitiu pal
'immobile-target-namespace-iw' => "Nun puedes mover una páxina a un enllaz d'Interwiki.",
'immobile-source-page' => 'Esta páxina nun ye treslladable.',
'immobile-target-page' => 'Nun se pue treslladar a esi títulu de destín.',
+'bad-target-model' => 'El destín deseáu utiliza un modelu de conteníu diferente. Nun se pue convertir de $1 a $2.',
'imagenocrossnamespace' => "Nun se pue treslladar una imaxe a nun espaciu de nomes que nun ye d'imáxenes",
'nonfile-cannot-move-to-file' => 'Nun se pue treslladar más que ficheros al espaciu de nomes de ficheros',
'imagetypemismatch' => 'La estensión nueva del archivu nun concueya cola so mena',
@@ -2730,6 +2754,7 @@ Guárdalu nel ordenador y xúbilu equí.",
'import-error-interwiki' => "La páxina «$1» nun s'importó porque'l so nome ta acutáu pa enllaces esternos (interwiki).",
'import-error-special' => "La páxina «$1» nun s'importó porque pertenez a un espaciu de nomes especial que nun permite les páxines.",
'import-error-invalid' => "La páxina «$1» nun s'importó porque tien un nome inválidu.",
+'import-error-unserialize' => 'Nun se pudo quitar la serialización de la revisión $2 de la páxina "$1". Nel informe figura que la revisión usa\'l modelu de conteníu $3 serializáu como $4.',
'import-options-wrong' => '{{PLURAL:$2|Opción enquivocada|Opciones enquivocaes}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'La páxina raíz dada ye un títulu inválidu.',
'import-rootpage-nosubpage' => 'L\'espaciu de nomes "$1" de la páxina raíz nun permite subpáxines.',
@@ -2744,7 +2769,6 @@ Guárdalu nel ordenador y xúbilu equí.",
# JavaScriptTest
'javascripttest' => 'Prueba de JavaScript',
-'javascripttest-disabled' => 'Esta función ta desactivada.',
'javascripttest-title' => 'Executando pruebes de $1',
'javascripttest-pagetext-noframework' => 'Esta páxina ta acutada pa executar pruebes de javascript.',
'javascripttest-pagetext-unknownframework' => "L'entornu de pruebes «$1» ye desconocíu.",
@@ -2894,11 +2918,13 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
'pageinfo-default-sort' => "Clave d'ordenación predeterminada",
'pageinfo-length' => 'Llonxitú de la páxina (en bytes)',
'pageinfo-article-id' => 'ID de la páxina',
+'pageinfo-language' => 'Llingua del conteníu de la páxina',
'pageinfo-robot-policy' => 'Estáu del motor de gueta',
'pageinfo-robot-index' => 'Pue ser índiz',
'pageinfo-robot-noindex' => 'Nun pue ser índiz',
'pageinfo-views' => 'Númberu de visites',
'pageinfo-watchers' => 'Númberu de vixilantes de la páxina',
+'pageinfo-few-watchers' => 'Menos de $1 {{PLURAL:$1|vixilante|vixilantes}}',
'pageinfo-redirects-name' => 'Redireiciones a esta páxina',
'pageinfo-subpages-name' => "Subpáxines d'esta páxina",
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redireición|redireiciones}}; $3 {{PLURAL:$3|non-redireición|non-redireiciones}})',
@@ -2913,6 +2939,19 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
'pageinfo-magic-words' => '{{PLURAL:$1|Pallabra máxica|Pallabres máxiques}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría anubrida|Categoríes anubríes}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Plantía incluída|Plantíes incluíes}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Páxina|Páxines}} trescluyíes en ($1)',
+'pageinfo-toolboxlink' => 'Información de la páxina',
+'pageinfo-redirectsto' => 'Redirixe a',
+'pageinfo-redirectsto-info' => 'información',
+'pageinfo-contentpage' => 'Contada como páxina de conteníu',
+'pageinfo-contentpage-yes' => 'Sí',
+'pageinfo-protect-cascading' => "Les proteiciones s'activen en serie dende equí",
+'pageinfo-protect-cascading-yes' => 'Sí',
+'pageinfo-protect-cascading-from' => "Les proteiciones s'activen en serie dende",
+'pageinfo-category-info' => 'Información de la categoría',
+'pageinfo-category-pages' => 'Númberu de páxines',
+'pageinfo-category-subcats' => 'Númberu de subcategoríes',
+'pageinfo-category-files' => 'Númberu de ficheros',
# Skin names
'skinname-standard' => 'Clásicu',
@@ -2931,6 +2970,8 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
'markedaspatrollederror' => 'Nun se pue marcar como supervisada',
'markedaspatrollederrortext' => 'Necesites conseñar una revisión pa marcala como supervisada.',
'markedaspatrollederror-noautopatrol' => 'Nun tienes permisu pa marcar los cambios propios como supervisaos.',
+'markedaspatrollednotify' => 'Esti cambiu en $1 marcóse como revisáu.',
+'markedaspatrollederrornotify' => "Falló l'aición de marcar como revisáu.",
# Patrol log
'patrol-log-page' => 'Rexistru de supervisión',
@@ -2964,6 +3005,7 @@ Al executalu pues comprometer el to sistema.",
'file-nohires' => 'Nun ta disponible con mayor resolución.',
'svg-long-desc' => 'ficheru SVG, $1 × $2 píxels nominales, tamañu de ficheru: $3',
'svg-long-desc-animated' => 'Ficheru SVG animáu; nominalmente de $1 × $2 pixels; tamañu del ficheru: $3',
+'svg-long-error' => 'Ficheru SVG inválidu: $1',
'show-big-image' => 'Resolución completa',
'show-big-image-preview' => "Tamañu d'esta previsualización: $1.",
'show-big-image-other' => '{{PLURAL:$2|Otra resolución|Otres resoluciones}}: $1.',
@@ -2993,7 +3035,10 @@ Al executalu pues comprometer el to sistema.",
'minutes' => '{{PLURAL:$1|$1 minutu|$1 minutos}}',
'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
'days' => '{{PLURAL:$1|$1 día|$1 díes}}',
+'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
+'years' => '{{PLURAL:$1|$1 añu|$1 años}}',
'ago' => 'hai $1',
+'just-now' => 'agora mesmo',
# Bad image list
'bad_image_list' => "El formatu ye'l que sigue:
@@ -3497,6 +3542,7 @@ Esti códigu de confirmación caduca\'l $4.',
# Scary transclusion
'scarytranscludedisabled' => '[La tresclusión interwiki ta desactivada]',
'scarytranscludefailed' => '[Falló la recuperación de la plantía pa $1]',
+'scarytranscludefailed-httpstatus' => '[Falló la recuperación de la plantía pa $1: HTTP $2]',
'scarytranscludetoolong' => '[La URL ye demasiao llarga]',
# Delete conflict
@@ -3608,6 +3654,7 @@ Tamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
'version-license' => 'Llicencia',
'version-poweredby-credits' => "Esta wiki funciona con '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'otros',
+'version-credits-summary' => 'Nos prestaría dar reconocimientu a les siguientes persones pola so contribución a [[Special:Version|MediaWiki]].',
'version-license-info' => "MediaWiki ye software llibre; pue redistribuilu y/o camudalu baxo los términos de la Llicencia Pública Xeneral GNU tal como ta asoleyada pola Free Software Foundation; o la versión 2 de la Llicencia, o (como prefieras) cualesquier versión posterior.
MediaWiki distribúise col envís de que seya afayadiza, pero ENSIN GARANTÃA DALA; ensin siquiera garantía implícita de COMERCIALIDà o ADAUTACIÓN A UN DETERMINÃU PROPÓSITU. Llea la Llicencia Pública Xeneral GNU pa más detalles.
@@ -3722,17 +3769,17 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
'sqlite-no-fts' => '$1 ensin sofitu pa gueta en testu completu',
# New logging system
-'logentry-delete-delete' => '$1 desanició la páxina $3',
-'logentry-delete-restore' => '$1 restauró la páxina $3',
-'logentry-delete-event' => "$1 camudó la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
-'logentry-delete-revision' => "$1 camudó la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
-'logentry-delete-event-legacy' => '$1 camudó la visibilidá de los socesos del rexistru en $3',
-'logentry-delete-revision-legacy' => '$1 camudó la visibilidá de les revisiones na páxina $3',
-'logentry-suppress-delete' => '$1 suprimió la páxina $3',
-'logentry-suppress-event' => "$1 camudó en secretu la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
-'logentry-suppress-revision' => "$1 camudó en secretu la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
-'logentry-suppress-event-legacy' => '$1 camudó en secretu la visibilidá de los socesos del rexistru en $3',
-'logentry-suppress-revision-legacy' => '$1 camudó en secretu la visibilidá de les revisiones na páxina $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|desanició}} la páxina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|restauró}} la páxina $3',
+'logentry-delete-event' => "$1 {{GENDER:$2|camudó}} la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
+'logentry-delete-revision' => "$1 {{GENDER:$2|camudó}} la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|camudó}} la visibilidá de los socesos del rexistru en $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|camudó}} la visibilidá de les revisiones na páxina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|suprimió}} la páxina $3',
+'logentry-suppress-event' => "$1 {{GENDER:$2|camudó}} en secretu la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
+'logentry-suppress-revision' => "$1 {{GENDER:$2|camudó}} en secretu la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|camudó}} en secretu la visibilidá de los socesos del rexistru en $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|camudó}} en secretu la visibilidá de les revisiones na páxina $3',
'revdelete-content-hid' => 'conteníu tapecíu',
'revdelete-summary-hid' => "resume d'edición tapecíu",
'revdelete-uname-hid' => "nome d'usuariu anubríu",
@@ -3741,17 +3788,21 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
'revdelete-uname-unhid' => "nome d'usuariu non anubríu",
'revdelete-restricted' => 'aplicaes les restricciones a los alministradores',
'revdelete-unrestricted' => 'eliminaes les restricciones a los alministradores',
-'logentry-move-move' => '$1 treslladó la páxina "$3" a "$4"',
-'logentry-move-move-noredirect' => '$1 treslladó la páxina "$3" a "$4" ensin dexar una redireición',
-'logentry-move-move_redir' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición',
-'logentry-move-move_redir-noredirect' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición ensin dexar una redireición',
-'logentry-patrol-patrol' => '$1 marcó la revisión $4 de la páxina "$3" como patrullada',
-'logentry-patrol-patrol-auto' => '$1 marcó automaticamente la revisión $4 de la páxina "$3" como patrullada',
-'logentry-newusers-newusers' => "Se creó la cuenta d'usuariu $1",
-'logentry-newusers-create' => "Se creó la cuenta d'usuariu $1",
-'logentry-newusers-create2' => "$1 creó la cuenta d'usuariu $3",
-'logentry-newusers-autocreate' => 'La cuenta $1 se creó automáticamente',
-'newuserlog-byemail' => 'conseña unviada per corréu electrónicu',
+'logentry-move-move' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4"',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" ensin dexar una redireición',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" sobre una redireición',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" sobre una redireición ensin dexar una redireición',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|marcó}} la revisión $4 de la páxina "$3" como patrullada',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|marcó}} automáticamente la revisión $4 de la páxina "$3" como patrullada',
+'logentry-newusers-newusers' => "{{GENDER:$2|Creóse}} la cuenta d'usuariu $1",
+'logentry-newusers-create' => "{{GENDER:$2|Creóse}} la cuenta d'usuariu $1",
+'logentry-newusers-create2' => "$1 {{GENDER:$2|creó}} la cuenta d'usuariu $3",
+'logentry-newusers-byemail' => "$1 {{GENDER:$2|creó}} la cuenta d'usuariu $3 y la contraseña unvióse per corréu electrónicu",
+'logentry-newusers-autocreate' => 'La cuenta $1 {{GENDER:$2|creóse}} automáticamente',
+'logentry-rights-rights' => '$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3 dende $4 a $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|camudó}} la pertenencia a grupos de $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|promocionó}} automáticamente de $4 a $5',
+'rightsnone' => '(nengún)',
# Feedback
'feedback-bugornote' => 'Si tas preparáu pa describir un problema técnicu en detalle, [$1 informa del fallu].
@@ -3805,6 +3856,7 @@ D\'otra miente, pues usar el formulariu cenciellu d\'abaxo. El to comentariu apa
'api-error-ok-but-empty' => 'Fallu internu: nun hai respuesta del sirvidor.',
'api-error-overwrite' => 'Nun ta permitío sobroscribir un ficheru esistente.',
'api-error-stashfailed' => 'Fallu internu: el sirvidor nun pudo guardar el ficheru temporal.',
+'api-error-publishfailed' => 'Fallu internu: el sirvidor nun pudo espublizar el ficheru temporal.',
'api-error-timeout' => 'El sirvidor nun respondió nel tiempu esperáu.',
'api-error-unclassified' => 'Hebo un fallu desconocíu',
'api-error-unknown-code' => 'Fallu desconocíu: «$1»',
@@ -3825,4 +3877,7 @@ D\'otra miente, pues usar el formulariu cenciellu d\'abaxo. El to comentariu apa
'duration-centuries' => '$1 {{PLURAL:$1|sieglu|sieglos}}',
'duration-millennia' => '$1 {{PLURAL:$1|mileniu|milenios}}',
+# Image rotation
+'rotate-comment' => 'Imaxe xirada $1 {{PLURAL:$1|grau|graos}} en sentíu horariu',
+
);
diff --git a/languages/messages/MessagesAvk.php b/languages/messages/MessagesAvk.php
index da2758a3..8a0d281f 100644
--- a/languages/messages/MessagesAvk.php
+++ b/languages/messages/MessagesAvk.php
@@ -230,7 +230,6 @@ $messages = array(
'qbbrowse' => 'Farura',
'qbedit' => 'Betara',
'qbpageoptions' => 'Ikatcuksbu',
-'qbpageinfo' => 'Givabu',
'qbmyoptions' => 'Jinaf ikatcukseem',
'qbspecialpages' => 'Aptaf bueem',
'faq' => 'NEB',
@@ -445,8 +444,6 @@ Batdume : ''$2''.",
# Login and logout pages
'logouttext' => 'Rin daletoe til solgluyanaf.
Rin va {{SITENAME}} yoltiskon ware rofavel oke, bifoton kan ar yolt, va int toldogluyal.',
-'welcomecreation' => '<h2>Til drumbaf, $1!</h2><p>Rinaf favesikpata su zo redur.
-Me vulkul da rupeson va "Lodamaceem" bu va intaf {{SITENAME}} rotuilkal.',
'yourname' => 'Rinaf favesikyolt',
'yourpassword' => 'Rinaf remravlem',
'yourpasswordagain' => 'Va rinaf remravlem tolon bazel',
@@ -662,7 +659,6 @@ Rin dere abdiplekul da va webeks miv suteyel ike mal sangiskafa ok gundafa nuyaf
'template-protected' => '(nendana)',
'template-semiprotected' => '(nendamana)',
'hiddencategories' => 'Batu bu tir bewafu gu {{PLURAL:$1|1 palsena loma|$1 palsena loma}}:',
-'nocreatetitle' => 'Irutana buredura',
'nocreatetext' => '{{SITENAME}} va roredura va warzafu bu irutar.
Rodimal aze va tisu bu robetal oke [[Special:UserLogin|va int rodogluyal oke ropataredul]].',
'nocreate-loggedin' => 'Rin va warzafu bu me ronoredul.',
@@ -1039,10 +1035,12 @@ Rinafe e-mail mane me zo razdar viele ar webesik uzerar.',
'right-userrights-interwiki' => "Betara va favesikrokeem koe aro 'wiki' xo",
'right-siteadmin' => 'Origakelekara is dimelekara',
+# Special:Log/newusers
+'newuserlogpage' => 'Buredura "log"',
+
# User rights log
'rightslog' => '"Log" bu va favesikrokeem',
'rightslogtext' => 'Tir "log" va betara va favesikroka.',
-'rightsnone' => '(mek)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'Redura va batu bu',
@@ -1418,9 +1416,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'Nedira',
'listusers-noresult' => 'Mek trasiyin favesik.',
-# Special:Log/newusers
-'newuserlogpage' => 'Buredura "log"',
-
# Special:ListGroupRights
'listgrouprights' => 'Rokeem ke favesiklospa',
'listgrouprights-group' => 'Lospa',
@@ -1493,11 +1488,7 @@ Ta sulara va batu bu div rinafi suzdasiki, koe grablexo va « Mea suzdá » vule
'enotif_mailer' => '{{SITENAME}} Kowalzesi Staksasiki',
'enotif_reset' => 'Va kotu woranu bu tcalar',
-'enotif_newpagetext' => 'Batcoba tir warzafu bu',
'enotif_impersonal_salutation' => '{{SITENAME}} favesik',
-'changed' => 'betayan',
-'created' => 'reduyun',
-'enotif_subject' => '{{SITENAME}} bu $PAGETITLE su zo $CHANGEDORCREATED gan $PAGEEDITOR',
'enotif_lastvisited' => 'Va $1 disukel ta da va kot betaks mali ironokafa worara wil.',
'enotif_lastdiff' => 'Ta wira va bat betaks va $1 disukel.',
'enotif_anon_editor' => '$1 yoltiskaf favesik',
@@ -1525,6 +1516,8 @@ To change your watchlist settings, visit
Feedback and further assistance:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'reduyun',
+'changed' => 'betayan',
# Delete
'deletepage' => 'Busulara',
@@ -2392,6 +2385,6 @@ This confirmation code will expire at $4.',
# New logging system
'revdelete-restricted' => 'irutara rewana pu ristusik',
'revdelete-unrestricted' => 'irutara tiolteyena pu ristusik',
-'newuserlog-byemail' => 'remravlem staksayan kan e-mail',
+'rightsnone' => '(mek)',
);
diff --git a/languages/messages/MessagesAy.php b/languages/messages/MessagesAy.php
index 119c65b4..b5581498 100644
--- a/languages/messages/MessagesAy.php
+++ b/languages/messages/MessagesAy.php
@@ -127,7 +127,6 @@ $messages = array(
'qbbrowse' => 'Wampuña',
'qbedit' => 'Turkaña',
'qbpageoptions' => 'Uñstawitaki ajllita',
-'qbpageinfo' => "Uñstawxat uñt'ayawi",
'qbmyoptions' => 'Ajllitanakaja',
'errorpagetitle' => 'Pantja',
diff --git a/languages/messages/MessagesAz.php b/languages/messages/MessagesAz.php
index cc598a78..abd5b752 100644
--- a/languages/messages/MessagesAz.php
+++ b/languages/messages/MessagesAz.php
@@ -227,7 +227,6 @@ $messages = array(
'qbbrowse' => 'Gözdən keçir',
'qbedit' => 'RedaktÉ™',
'qbpageoptions' => 'Bu səhifə',
-'qbpageinfo' => 'Məzmun',
'qbmyoptions' => 'Mənim səhifələrim',
'qbspecialpages' => 'Xüsusi səhifələr',
'faq' => 'TSS',
@@ -250,6 +249,7 @@ $messages = array(
'namespaces' => 'Adlar fəzası',
'variants' => 'Variantlar',
+'navigation-heading' => 'Naviqasiya menyusu',
'errorpagetitle' => 'Xəta',
'returnto' => '$1 səhifəsinə qayıt.',
'tagline' => '{{SITENAME}} saytından',
@@ -478,9 +478,9 @@ Göstərilən səbəb: "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Sistemdən çıxdınız.'''
-Siz {{SITENAME}} saytını anonim olaraq istifadə etməyə davam edə bilər və ya eyni, yaxud başqa istifadəçi adı ilə [[Special:UserLogin|yenidən daxil ola]] bilərsiniz. Veb-brauzerin keş yaddaşını təmizləyənədək bəzi səhifələr hələ də sistemdə imişsiniz kimi görünə bilər.",
-'welcomecreation' => '== $1, xoş gəlmişsiniz! ==
-Hesabınız yaradıldı.
+Siz {{SITENAME}} saytını anonim olaraq istifadə etməyə davam edə bilər və ya eyni, yaxud başqa istifadəçi adı ilə <span class='plainlinks'>[$1 yenidən daxil ola]</span> bilərsiniz. Veb-brauzerin keş yaddaşını təmizləyənədək bəzi səhifələr hələ də sistemdə imişsiniz kimi görünə bilər.",
+'welcomeuser' => 'Xoş gəldin $1!',
+'welcomecreation-msg' => 'Hesabınız yaradıldı.
[[Special:Preferences|{{SITENAME}} nizamlamalarınızı]] dəyişdirməyi unutmayın.',
'yourname' => 'İstifadəçi adı',
'yourpassword' => 'Parol:',
@@ -712,7 +712,6 @@ Siz eyni zamanda söz verirsiniz ki, bu yazıları siz özünüz yazmısınız v
'template-semiprotected' => '(yarım-mühafizə)',
'hiddencategories' => 'Bu səhifə {{PLURAL:$1|1 gizli kateqoriyaya|$1 gizli kateqoriyaya}} aiddir:',
'edittools-upload' => '-',
-'nocreatetitle' => 'Səhifə yaratma məhdudlaşdırılıb.',
'nocreatetext' => '{{SITENAME}} saytında yeni səhifələrin yaradılması imkanları məhdudlaşdırılıb.
Siz geri qayıdıb mövcud səhifəni və ya [[Special:UserLogin|sistemə təqdim olunma və ya yeni hesab açmaq]] səhifəsini redaktə edə bilərsiniz.',
'nocreate-loggedin' => 'Sizin yeni səhifələr yaratmaq üçün icazəniz yoxdur.',
@@ -737,6 +736,9 @@ Məlumat üçün aşağıda bu səhifənin tarixçəsindən müvafiq silmə qeyd
'edit-already-exists' => 'Yeni səhifəni yaratmaq mümkün deyil.
Belə ki, bu adda səhifə artıq mövcuddur.',
+# Content models
+'content-model-javascript' => 'JavaScript',
+
# Parser/template warnings
'expensive-parserfunction-category' => 'Kifayət qədər böyük sayda genişresurslu funksiyaların müraciət olunduğu səhifələr',
'post-expand-template-inclusion-warning' => "'''DÄ°QQÆT!''' Daxil edilÉ™n ÅŸablonların hÉ™cmi hÉ™ddindÉ™n artıq böyükdür.
@@ -1174,11 +1176,13 @@ HÉ™mçinin kimliyinizi gostÉ™rmÉ™dÉ™n belÉ™, baÅŸqalarının sizinlÉ™ istifadÉ™Ã
'right-siteadmin' => 'Məlumatlar bazasının bloklanması və blokun götürülməsi',
'right-sendemail' => 'Digər istifadəçilərə elektron poçt göndər',
+# Special:Log/newusers
+'newuserlogpage' => 'Yeni istifadəçilərin qeydiyyatı',
+'newuserlogpagetext' => 'Yeni qeydiyyatdan keçmiş istifadəçilərin siyahısı.',
+
# User rights log
'rightslog' => 'İstifadəçi hüquqları qeydləri',
'rightslogtext' => 'İstifadəçi hüquqları dəyişikliyi qeydləri.',
-'rightslogentry' => '$1 adlı istifadəçinin istifadəçi qruplarındakı üzvlüyü dəyişdirildi: $2 ► $3',
-'rightsnone' => '(yoxdur)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'bu səhifənin oxunması',
@@ -1654,10 +1658,6 @@ Həmçinin, [[Special:WantedCategories|tələb olunan kateqoriyalara]] baxın.',
'activeusers-hidesysops' => 'İdarəçiləri gizlə',
'activeusers-noresult' => 'İstifadəçi tapılmadı.',
-# Special:Log/newusers
-'newuserlogpage' => 'Yeni istifadəçilərin qeydiyyatı',
-'newuserlogpagetext' => 'Yeni qeydiyyatdan keçmiş istifadəçilərin siyahısı.',
-
# Special:ListGroupRights
'listgrouprights' => 'İstifadəçi qruplarının hüquqları',
'listgrouprights-summary' => 'Bu vikidə olan istifadəçi siyahıları və onların hüquqları aşağıda göstərilmişdir.
@@ -1744,11 +1744,7 @@ Fərdi hüquqlar haqqında əlavə məlumatı [[{{MediaWiki:Listgrouprights-help
'enotif_mailer' => '{{SITENAME}} Bildiriş Xidməti',
'enotif_reset' => 'Baxılmış bütün səhifələri işarələ.',
-'enotif_newpagetext' => 'Bu səhifə yeni səhifədir.',
'enotif_impersonal_salutation' => '{{SITENAME}} istifadəçisi',
-'changed' => 'dəyişdi',
-'created' => 'yaradıldı',
-'enotif_subject' => '{{SITENAME}} saytındakı $PAGETITLE səhifəsi $PAGEEDITOR tərəfindən $CHANGEDORCREATED',
'enotif_lastvisited' => 'Sonuncu ziyarətinizdən indiyədək olan bütün dəyişiklikləri görmək üçün baxın: $1.',
'enotif_lastdiff' => 'Bu dəyişikliyi görmək üçün $1 səhifəsinə baxın.',
'enotif_anon_editor' => 'qeydiyyatsız istifadəçi $1',
@@ -1774,6 +1770,8 @@ Siz haqqında söhbÉ™t gedÉ™n sÉ™hifÉ™yÉ™ baxanadÉ™k sÉ™hifÉ™dÉ™ki digÉ™r dÉ™yiÅ
Yardım və təklifləriniz üçün:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'yaradıldı',
+'changed' => 'dəyişdi',
# Delete
'deletepage' => 'Səhifəni sil',
@@ -2992,7 +2990,7 @@ Bu saytda texniki problemlər var.',
'logentry-newusers-create' => '$1 istifadəçi hesabı yaratdı',
'logentry-newusers-create2' => '$1 $3 üçün istifadəçi hesabı yaratdı',
'logentry-newusers-autocreate' => '$1 hesabı avtomatik yaradıldı',
-'newuserlog-byemail' => 'parol e-maillə göndərildi',
+'rightsnone' => '(yoxdur)',
# Feedback
'feedback-subject' => 'Mövzu:',
diff --git a/languages/messages/MessagesAzb.php b/languages/messages/MessagesAzb.php
new file mode 100644
index 00000000..8cd1fb42
--- /dev/null
+++ b/languages/messages/MessagesAzb.php
@@ -0,0 +1,3820 @@
+<?php
+/** South Azerbaijani (تورکجه)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Amir a57
+ * @author Arjanizary
+ * @author Calak
+ * @author E THP
+ * @author Ebrahimi-amir
+ * @author Erdemaslancan
+ * @author Mousa
+ */
+
+$fallback = 'fa';
+$rtl = true;
+
+$namespaceNames = array(
+ NS_MEDIA => 'مئدیا',
+ NS_SPECIAL => 'اؤزل',
+ NS_MAIN => '',
+ NS_TALK => 'دانیشیق',
+ NS_USER => 'ایستیÙاده‌چی',
+ NS_USER_TALK => 'ایستیÙاده‌چی_دانیشیغی',
+ NS_PROJECT_TALK => '$1_دانیشیق',
+ NS_FILE => 'Ùایل',
+ NS_FILE_TALK => 'Ùایل_دانیشیغی',
+ NS_MEDIAWIKI => 'مئدیا‌ویکی',
+ NS_MEDIAWIKI_TALK => 'مئدیا‌ویکی_دانیشیغی',
+ NS_TEMPLATE => 'شابلون',
+ NS_TEMPLATE_TALK => 'شابلون_دانیشیغی',
+ NS_HELP => 'یاردیم',
+ NS_HELP_TALK => 'یاردیم_دانیشیغی',
+ NS_CATEGORY => 'بؤلمه',
+ NS_CATEGORY_TALK => 'بؤلمه_دانیشیغی',
+);
+
+$specialPageAliases = array(
+ 'Activeusers' => array( 'چالیشقان_ایستسÙاده‌چیلر' ),
+ 'Allmessages' => array( 'بوتون_مئساژلار' ),
+ 'Allpages' => array( 'بوتون_صحیÙه‌لر' ),
+ 'Ancientpages' => array( 'اسکی_صحیÙه‌لر' ),
+ 'Badtitle' => array( 'پیس_آد' ),
+ 'Blankpage' => array( 'بوش_صحیÙÙ‡' ),
+ 'ChangePassword' => array( 'رمزی_دَییش' ),
+ 'CreateAccount' => array( 'حساب_یارات' ),
+ 'Mycontributions' => array( 'چالیشمالاریم' ),
+ 'Mypage' => array( 'صحیÙه‌م' ),
+ 'Mytalk' => array( 'دانیشیغیم' ),
+ 'Myuploads' => array( 'یوکله‌دیکلریم' ),
+ 'Newimages' => array( 'یئنی_Ùایل‌لار' ),
+ 'Newpages' => array( 'یئنی_صحیÙه‌لر' ),
+ 'PasswordReset' => array( 'رمز_دَییشمه‌' ),
+ 'Randompage' => array( 'راست‌گله' ),
+ 'Recentchanges' => array( 'سون_دَییشیکلر' ),
+ 'Search' => array( 'آختار' ),
+ 'Shortpages' => array( 'قیسسا_صحیÙه‌لر' ),
+ 'Specialpages' => array( 'اؤزل_صحیÙه‌لر' ),
+ 'Statistics' => array( 'آمار' ),
+ 'Unusedcategories' => array( 'ایشلنممیش_بؤلمه‌لر' ),
+ 'Unusedimages' => array( 'ایشلنممیش_Ùایل‌لار' ),
+ 'Unusedtemplates' => array( 'ایشلنممیش_شابلونلار' ),
+ 'Unwatchedpages' => array( 'باخیلمامیش_صحیÙه‌لر' ),
+ 'Upload' => array( 'یوکله' ),
+ 'Version' => array( 'نوسخه' ),
+ 'Watchlist' => array( 'ایزله‌دیکلر' ),
+);
+
+$magicWords = array(
+ 'numberofpages' => array( '1', 'صحیÙه‌لر_ساییسی', 'تعدادصÙحه‌ها', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'مقاله‌لر_ساییسی', 'تعدادمقاله‌ها', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'قایل‌لار_ساییسی', 'تعدادپرونده‌ها', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ایستیÙاده‌چیلر_ساییسی', 'تعدادکاربران', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'چالیشقان_ایستیÙاده‌چیلر', 'کاربران‌Ùعال', 'کاربران_Ùعال', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'دَییشدیرمه_ساییسی', 'تعدادویرایش‌ها', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'صحیÙه‌نین_آدی', 'نام‌صÙحه', 'نام_صÙحه', 'PAGENAME' ),
+ 'img_right' => array( '1', 'ساغ', 'راست', 'right' ),
+ 'img_left' => array( '1', 'سول', 'چپ', 'left' ),
+ 'img_none' => array( '1', 'هئچ', 'هیچ', 'none' ),
+ 'img_framed' => array( '1', 'قابیق', 'قاب', 'framed', 'enframed', 'frame' ),
+);
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'باغلانتی‌لارین آلتینی خطله:',
+'tog-justify' => 'متنی صحیÙÙ‡ بویو پایلا',
+'tog-hideminor' => 'سون دییشیکلیکلرده کیچیک‌لری گیزلت',
+'tog-hidepatrolled' => 'نظارتلنمیش دَییشیکلیکلری سون دییشیکلیکلرده گیزلت',
+'tog-newpageshidepatrolled' => 'نظارتلنمیش صحیÙه‌لری یئنی صحیÙه‌لر سیاهی‌سیندان گیزلت',
+'tog-extendwatchlist' => 'ایزله‌دیکلری، بوتون دیشیکلیکلری گؤسترمک اوچون گئنیشلندیر',
+'tog-usenewrc' => 'دَییشیکلیکلری سون دَییشیکلیکلر صحیÙه‌سینده ایزله‌دیکلر صحیÙه‌سینده گروپ‌لا (جاوااسکریپت لازیم‌دیر)',
+'tog-numberheadings' => 'باشلیق‌لاری اوتوماتیک نومره‌له',
+'tog-showtoolbar' => 'دَییشدیرمه آراج چوبوغونو گؤستر (جاوااسکریپت لازیم‌دیر)',
+'tog-editondblclick' => 'صحیÙه‌‌لری ایکی کلیکله دَییشدیر (جاوااسکریپت لازیم‌دیر)',
+'tog-editsection' => '[دَییشدیر] باغلانتی‌سیلا بؤلوم دَییشدیرمه‌سینه ایجازه وئر',
+'tog-editsectiononrightclick' => 'بؤلوم‌لرین دیشدیرمه‌سینی، باشلیقلارین اوزرینده ساغ‌کلیک ائتمک‌له ایجازه وئر (جاوااسکریپت لازیم‌دیر)',
+'tog-showtoc' => 'ایچینده‌کیلر جدولینی گؤستر (Û³-دن آرتیق باشلیقلاری اولان صحیÙه‌‌لرده)',
+'tog-rememberpassword' => 'منیم گیریشیمی بو بیلگی‌سایاردا یاددا ساخلا (چوخو {{PLURAL:$1|بیر گونه|$1 گونه}} کیمی)',
+'tog-watchcreations' => 'ياراتدیغیم صحیÙه‌‌لری Ùˆ يوکله‌دیگیم Ùايل‌لاری ایزله‌مه‌لریمه آرتیر',
+'tog-watchdefault' => 'دَییشدیردیگیم صحیÙه‌‌لری Ùˆ Ùايل‌لاری ایزله‌دیکلریمه آرتیر',
+'tog-watchmoves' => 'داشیدیغیم صحیÙه‌‌لری Ùˆ Ùايل‌لاری ایزله‌دیکلریمه آرتیر',
+'tog-watchdeletion' => 'سیلدیگیم صحیÙه‌‌لری Ùˆ Ùايل‌لاری ایزله‌دیکلریمه آرتیر',
+'tog-minordefault' => 'دیÙالت اولاراق بوتون دَییشدیر‌مه‌لریمی کیچیک دَییشدیر کیمی نیشانلا',
+'tog-previewontop' => 'اؤن‌گؤستریشی يازماق قوتوسوندان قاباق گؤستر',
+'tog-previewonfirst' => 'ایلک دَییشدیرمه‌ده اؤن‌گؤستریشی گؤستر',
+'tog-nocache' => 'براوزرین کَش ائتمگینی ایشلدن سال',
+'tog-enotifwatchlistpages' => 'ایزله‌دیکلریم‌ده اولان صحیÙÙ‡ یوخسا Ùایل دَییشدیریلنده، منه ایمیل گؤندر',
+'tog-enotifusertalkpages' => 'دانیشیق صحیÙه‌‌م دَییشدیریلنده منه ایمیل گؤندر',
+'tog-enotifminoredits' => 'صحیÙه‌لرده Ùˆ Ùایل‌لاردا کیچیک دَییشیکلیکلر اولسا دا منه ایمیل گؤندر',
+'tog-enotifrevealaddr' => 'منیم ایمیل آدرسیمی خبر وئرمه ایمیل‌لرینده گؤستر',
+'tog-shownumberswatching' => 'ایزله‌ين ایستیÙاده‌چیلرین سایینی گؤستر',
+'tog-oldsig' => 'ایندی‌کی ایمضا:',
+'tog-fancysig' => 'ویکی متن کیمی ایمضا (اوتوماتیک باغلانتی‌سیز)',
+'tog-externaleditor' => 'دَییشدیرمک اوچون ائشیک یازیلیم ایشلد (یالنیز چوخ باشارانلار اوچون، بیلگی‌سایارینیزدا مخصوص تنظیملر لازیم‌دیر. [//www.mediawiki.org/wiki/Manual:External_editors آرتیق بیلگیلر])',
+'tog-externaldiff' => 'موقاییسه ائتمک اوچون ائشیک یازیلیم ایشلد (یالنیز چوخ باشارانلار اوچون، بیلگی‌سایارینیزدا مخصوص تنظیملر لازیم‌دیر. [//www.mediawiki.org/wiki/Manual:External_editors آرتیق بیلگیلر])',
+'tog-showjumplinks' => '«آتلان:» یاردیم باغلانتیلارینی آچ',
+'tog-uselivepreview' => 'دیری اؤن‌گؤستریش ایشلد (جاوااسکریپت لازیم‌دیر)(تست مرحله‌سینده)',
+'tog-forceeditsummary' => 'دَییشیکلیک قیساسی بوش قالاندا منی بیلدیر',
+'tog-watchlisthideown' => 'منیم دَییشیکلیکلریمی ایزله‌دیکلردن گیزلت',
+'tog-watchlisthidebots' => 'بوت دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت',
+'tog-watchlisthideminor' => 'کیچیک دَییشیکلیکلری ایزله‌دیکلردن گیزلت',
+'tog-watchlisthideliu' => 'گیرمیش ایستیÙاده‌چیلرین دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت',
+'tog-watchlisthideanons' => 'تانینمامیش ایستیÙاده‌چیلرین دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت',
+'tog-watchlisthidepatrolled' => 'نظارتلنمیش دَییشیکلیکلری ایزله‌دیکلردن گیزلت',
+'tog-ccmeonemails' => 'باشقا ایستیÙاده‌چیلره گؤندردیگیم ایمیل‌لرین کوپیلرینی منه گؤندر',
+'tog-diffonly' => 'موقاییسه‌لر آلیتندا صحیÙه‌لرین ایچینده‌کیلرینی گؤسترمه',
+'tog-showhiddencats' => 'گیزلی بؤلمه‌لری گؤستر',
+'tog-norollbackdiff' => 'قایتاراندان سونرا موقاییسه گؤسترمه',
+
+'underline-always' => 'همیشه',
+'underline-never' => 'هئچ واخت',
+'underline-default' => 'دیÙالت قابیق یوخسا براوزر',
+
+# Font style option in Special:Preferences
+'editfont-style' => 'دَییشدیرمه قوتوطونون Ùونت نؤوعو:',
+'editfont-default' => 'براوزر دیÙالتی',
+'editfont-monospace' => 'ثابیت آرالی Ùونت',
+'editfont-sansserif' => 'بوجاق‌سیز Ùونت',
+'editfont-serif' => 'بوجاق‌لی Ùونت',
+
+# Dates
+'sunday' => 'سود گونو(یکشنبه)',
+'monday' => 'دوزگونو(دوشنبه)',
+'tuesday' => 'آرا گون(سه‌شنبه)',
+'wednesday' => 'اوْدگونو(چهارشنبه)',
+'thursday' => 'سوگونو(پنجشنبه)',
+'friday' => 'جوما(آینی‌گون)',
+'saturday' => 'يئل‌گونو(شنبه)',
+'sun' => 'سود گونو(یکشنبه)',
+'mon' => 'دوزگونو(دوشنبه)',
+'tue' => 'سه‌شنبه(آرا گون)',
+'wed' => 'اوْدگونو (چهارشنبه)',
+'thu' => 'سوگونو(پنجشنبه)',
+'fri' => 'آینی‌گون(جوما)',
+'sat' => 'يئل‌گونو(شنبه)',
+'january' => 'ژانویه',
+'february' => 'Ùئوریه',
+'march' => 'مارس',
+'april' => 'آوریل',
+'may_long' => 'مئی',
+'june' => 'ژوئن',
+'july' => 'ژولای',
+'august' => 'آقوست',
+'september' => 'سئپتامبر',
+'october' => 'اوکتوبر',
+'november' => 'نووامبر',
+'december' => 'دئسامبر',
+'january-gen' => 'ژانویه',
+'february-gen' => 'Ùوریه',
+'march-gen' => 'مارس',
+'april-gen' => 'آوریل',
+'may-gen' => 'Ù…ÙÛŒ',
+'june-gen' => 'ژوئن',
+'july-gen' => 'جولای',
+'august-gen' => 'آقوست',
+'september-gen' => 'سئپتامبر',
+'october-gen' => 'اوکتوبر',
+'november-gen' => 'نووامبر',
+'december-gen' => 'دئسامبر',
+'jan' => 'ژانویه',
+'feb' => 'Ùئوریه',
+'mar' => 'مارس',
+'apr' => 'آوریل',
+'may' => 'مئی',
+'jun' => 'ژوئن',
+'jul' => 'ژولای',
+'aug' => 'آقوست',
+'sep' => 'سئپتامبر',
+'oct' => 'اوکتوبر',
+'nov' => 'نووامبر',
+'dec' => 'دئسامبر',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|بؤلمه|بؤلمه‌لر}}',
+'category_header' => '«$1» بؤلمه‌سین‌ده‌کی مقاله‌لر',
+'subcategories' => 'آلت بؤلمه‌لر',
+'category-media-header' => '«$1» بؤلمه‌سینده مئدیا',
+'category-empty' => "''بو بؤلمه‌نین ایندی Ùایل یوخسا مئدیاسی یوخدور.''",
+'hidden-categories' => '{{PLURAL:$1|گیزلی بؤلمه|گیزلی بؤلمه‌لر}}',
+'hidden-category-category' => 'گیزلی بؤلمه‌لر',
+'category-subcat-count' => 'بو بؤلمه‌ده {{PLURAL:$2|یالنیز|}} آشاغیداکی {{PLURAL:$1|بیر|$1}} آلت‌بؤلمه وار؛ بو بؤلمه‌نین جمعاً $2 آلت‌بؤلمه‌سی وار.',
+'category-subcat-count-limited' => 'بو بؤلمه‌ده آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.',
+'category-article-count' => 'بو بؤلمه‌ده {{PLURAL:$2|یالنیز|}} آشاغیداکی {{PLURAL:$1|بیر|$1}} صحیÙÙ‡ وار؛ بو بؤلمه‌نین جمعاً $2 صحیÙه‌سی وار.',
+'category-article-count-limited' => 'بو بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|یارپاق|$1 یارپاق}} واردیر.',
+'category-file-count' => 'بو بؤلمه‌ده {{PLURAL:$2|یالنیز|}} آشاغیداکی {{PLURAL:$1|بیر|$1}} Ùایل وار؛ بو بؤلمه‌نین جمعاً $2 Ùایلی وار.',
+'category-file-count-limited' => 'بؤلمه‌ده، بو {{PLURAL:$1|Ùایل|$1 Ùایل}} واردیر.',
+'listingcontinuesabbrev' => '(قالانی)',
+'index-category' => 'ایندئکس‌لشدیریلمیش یارپاقلار',
+'noindex-category' => 'ایندئکس‌لشدیریلمه‌ین یارپاقلار',
+'broken-file-category' => 'Ùایل‌لارا قیریلمیش باغلانتیلاری اولان یارپاقلار',
+
+'about' => 'گؤره',
+'article' => 'ایچری‌لی یارپاق',
+'newwindow' => '(یئنی پنجره‌ده آچیلیر)',
+'cancel' => 'لغو ائت',
+'moredotdotdot' => 'داها...',
+'morenotlisted' => 'داها آرتیق لیست اولونماییب‌دیر...',
+'mypage' => 'مقاله',
+'mytalk' => 'دانیشیق',
+'anontalk' => 'بو آی‌پی آدرسینه دانیشیق',
+'navigation' => 'دولانماق',
+'and' => '&#32;Ùˆ',
+
+# Cologne Blue skin
+'qbfind' => 'تاپ',
+'qbbrowse' => 'گؤزدن گئچید',
+'qbedit' => 'دَییشدیر',
+'qbpageoptions' => 'بو صحیÙه‌‌',
+'qbmyoptions' => 'منیم صحیÙه‌‌لریم',
+'qbspecialpages' => 'اؤزل صحیÙه‌لر',
+'faq' => 'چوخ سوروشولان سواللار',
+'faqpage' => 'Project:چوخلو سوروشولان سورغولار',
+
+# Vector skin
+'vector-action-addsection' => 'قونو آرتیر',
+'vector-action-delete' => 'سیل',
+'vector-action-move' => 'آدینی ديَیشدیر',
+'vector-action-protect' => 'قورو',
+'vector-action-undelete' => 'سیلمگی قایتار',
+'vector-action-unprotect' => 'قوروماغی دَییشدیر',
+'vector-simplesearch-preference' => 'ساده‌لشدیریلمیش آختاریش چوبوغو (یالنیز Vector دَری‌سینده)',
+'vector-view-create' => 'یارات',
+'vector-view-edit' => 'دَییشدیر',
+'vector-view-history' => 'گئچمیشه باخ',
+'vector-view-view' => 'اوخو',
+'vector-view-viewsource' => 'قایناغا باخ',
+'actions' => 'ایشلر',
+'namespaces' => 'آدلار Ùضاسی',
+'variants' => 'واریانتلار',
+
+'navigation-heading' => 'دولانماق Ù…Ùنوسو',
+'errorpagetitle' => 'خطا',
+'returnto' => '$1-ه قاییت.',
+'tagline' => '{{SITENAME}} سایتیندان',
+'help' => 'یاردیم',
+'search' => 'آختار',
+'searchbutton' => 'آختار',
+'go' => 'گئت',
+'searcharticle' => 'گئت',
+'history' => 'صحیÙه‌‌نین گئچمیشی',
+'history_short' => 'گئچمیش',
+'updatedmarker' => 'سون باخیشیمدان بویانا، یئنی‌لشیب‌دیر',
+'printableversion' => 'چاپ ائتمه‌لی نوسخه',
+'permalink' => 'قالان باغلانتی',
+'print' => 'یازدیر',
+'view' => 'باخ',
+'edit' => 'دَییشدیر',
+'create' => 'یارات',
+'editthispage' => 'بو صحیÙه‌‌نی دَییشدیر',
+'create-this-page' => 'بو صحیÙه‌‌نی يارات',
+'delete' => 'سیل',
+'deletethispage' => 'بو صحیÙه‌‌نی سیل',
+'undelete_short' => '{{PLURAL:$1|بیر دَییشیکلیگی|$1 دَییشیکلیگی}} برپا ائت',
+'viewdeleted_short' => '{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیگی گؤستر',
+'protect' => 'قوروماق',
+'protect_change' => 'ديَیشدیر',
+'protectthispage' => 'بو صحیÙه‌‌نی قورو',
+'unprotect' => 'قوروماغی دَییشدیر',
+'unprotectthispage' => 'بو یارپاغین قوروماسینی دَییشدیر',
+'newpage' => 'يئنی صحیÙه‌‌',
+'talkpage' => 'بو صحیÙه‌یه گؤره دانیشیق آپارین',
+'talkpagelinktext' => 'دانیشیق',
+'specialpage' => 'اؤزل صحیÙÙ‡',
+'personaltools' => 'شخصی آراجلار',
+'postcomment' => 'يئنی بؤلوم',
+'articlepage' => 'مقاله‌یه باخین',
+'talk' => 'دانیشیق',
+'views' => 'گؤرونوشلر',
+'toolbox' => 'آراجلار قوتوسو',
+'userpage' => 'ایستیÙاده‌چی صحیÙه‌‌سینی باخین',
+'projectpage' => 'پروژه صحیÙه‌سینه باخین',
+'imagepage' => 'Ùایل صحیÙه‌سینه باخین',
+'mediawikipage' => 'مئساژ صحیÙه‌سینه باخین',
+'templatepage' => 'شابلون صحیÙه‌سینه باخین',
+'viewhelppage' => 'یاردیم صحیÙه‌سینه باخین',
+'categorypage' => 'بؤلمه صحیÙه‌‌سینی گؤستر',
+'viewtalkpage' => 'دانیشیغا باخین',
+'otherlanguages' => 'آیری دیل‌لرده',
+'redirectedfrom' => '($1 صحیÙه‌‌سیندن يؤنلن‌دیریلمیش‌دیر)',
+'redirectpagesub' => 'یوللاندیرما صحیÙه‌سی',
+'lastmodifiedat' => 'بو صحیÙه‌‌ سون دÙعه‌‌ $1ØŒ $2 چاغیندا دَییشیلیب‌دیر.',
+'viewcount' => 'بو یارپاق {{PLURAL:$1|بیر|$1}} دÙعه گؤرونوب‌دور.',
+'protectedpage' => 'قورونموش یارپاق',
+'jumpto' => 'آتلان:',
+'jumptonavigation' => 'دولانماق',
+'jumptosearch' => 'آختار',
+'view-pool-error' => 'باغیشلایین، ایندی خیدمت‌چیلر آرتیق یوک آلتیندادیلار.
+چوخلو ایشلدنلر بو یارپاغی گؤرمک ایسته‌ییرلر.
+لوطÙاً یئنی‌دن بو یارپاغا ال تاپماغا چالیشماقدان اؤنجه، بیر آز دؤزون.
+
+$1',
+'pool-timeout' => 'Ù‚ÛŒÙیلا دؤزمک واختی قورتاردی',
+'pool-queuefull' => 'مخزن صÙÛŒ دولودور',
+'pool-errorunknown' => 'تانینمامیش خطا',
+
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+'aboutsite' => '{{SITENAME}}-ا گؤره',
+'aboutpage' => 'Project:حاقیندا',
+'copyright' => 'ایچینده‌کیلر $1 لیسانسی احاطه‌سینده‌دیلر.',
+'copyrightpage' => '{{ns:project}}:کوپی حاقی',
+'currentevents' => 'ایندیکی اولایلار',
+'currentevents-url' => 'Project:ایندیکی اولایلار',
+'disclaimers' => 'رد ائتمک',
+'disclaimerpage' => 'Project:عمومی رد ائتمک',
+'edithelp' => 'ديَیشیکلیک‌لر اوچون یاردیم',
+'edithelppage' => 'Help:دَییشدیرمه',
+'helppage' => 'Help:ایچینده‌کیلر',
+'mainpage' => 'آنا صحیÙÙ‡',
+'mainpage-description' => 'آنا صحیÙÙ‡',
+'policy-url' => 'Project:قایدالار',
+'portal' => 'توپلوم پورتالی',
+'portal-url' => 'Project:توپلوم پورتالی',
+'privacy' => 'گیزلیلیک سیاستی',
+'privacypage' => 'Project:گیزلیلیک سیاستی',
+
+'badaccess' => 'یول وئرمه خطاسی',
+'badaccess-group0' => 'ایسته‌دیگینیز ایشه ایجازه‌نیز یوخدور.',
+'badaccess-groups' => 'ایسته‌دیگینیز ایشین ایجازه‌سی، تکجه بو {{PLURAL:$2|قروپ|قروپلار}}داکی ایشلدنلره وئریلیب‌دیر: $1.',
+
+'versionrequired' => 'مدئدیاویکی یازیلیمینین $1 نوسخه‌سی لازیم‌دیر',
+'versionrequiredtext' => 'بو یارپاغی ایشلتدماغا، مئدیاویکی یازیلیمینین $1 نوسخه‌سی لازیم‌دیر.
+[[Special:Version|نوسخه یارپاغینا]] باخین.',
+
+'ok' => 'اولدو',
+'retrievedfrom' => '«$1»-دن آلینمیشدیر',
+'youhavenewmessages' => 'سیزین $1 ($2) وارینیزدیر.',
+'newmessageslink' => 'یئنی مئساژلار',
+'newmessagesdifflink' => 'سون دَییشیکلیک',
+'youhavenewmessagesfromusers' => 'سیزین {{PLURAL:$3|بیر آیری ایستیÙاده‌چی‌دن|$3 ایستیÙاده‌چی‌دن}} $1 وارینیزدیر ($2).',
+'youhavenewmessagesmanyusers' => 'سیزین چوخلو ایشلدنلردن $1 وارینیزدیر ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|بیر یئنی مئساژ|یئنی مئساژلار}}',
+'newmessagesdifflinkplural' => 'سون {{PLURAL:$1|دَییشیکلیک|دَییشیکلیکلر}}',
+'youhavenewmessagesmulti' => '$1-دا یئنی بیلدیرینیز وار.',
+'editsection' => 'دَییشدیر',
+'editold' => 'دَییشدیر',
+'viewsourceold' => 'قایناغا باخ',
+'editlink' => 'دَییشدیر',
+'viewsourcelink' => 'قایناغا باخ',
+'editsectionhint' => 'بؤلومو دَییشدیر: $1',
+'toc' => 'ایچینده‌کیلر',
+'showtoc' => 'گؤستر',
+'hidetoc' => 'گیزلت',
+'collapsible-collapse' => 'گیزلت',
+'collapsible-expand' => 'گئنیشلندیر',
+'thisisdeleted' => '$1-نا باخ یا اونو قایتار؟',
+'viewdeleted' => '$1 گؤستریلسین؟',
+'restorelink' => '{{PLURAL:$1|بیر سیلینمیش دَییشیکلیک|$1 سیلینمیش دَییشیکلیکلر}}',
+'feedlinks' => 'بسلمه',
+'feed-invalid' => 'گئچرسیز آبونه کانال جورو.',
+'feed-unavailable' => 'سیندیکاسیا خطلری ال‌ده دئییل‌لر',
+'site-rss-feed' => '$1 آراÙس‌اÙس Ùید',
+'site-atom-feed' => '$1 آتوم Ùید',
+'page-rss-feed' => '«$1» آراÙس‌اÙس Ùید',
+'page-atom-feed' => '«$1» آتوم Ùید',
+'red-link-title' => '$1 (صحیÙÙ‡ یوخدور)',
+'sort-descending' => 'آزالان سیرالاماق',
+'sort-ascending' => 'چوخالان سیرالاماق',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'مقاله',
+'nstab-user' => 'ایستیÙاده‌چی صحیÙه‌سی',
+'nstab-media' => 'مئدیا صحیÙه‌سی',
+'nstab-special' => 'اؤزل صحیÙÙ‡',
+'nstab-project' => 'پروژه صحیÙه‌سی',
+'nstab-image' => 'Ùایل',
+'nstab-mediawiki' => 'مئساژ',
+'nstab-template' => 'شابلون',
+'nstab-help' => 'یاردیم صحیÙه‌سی',
+'nstab-category' => 'بؤلمه',
+
+# Main script and global functions
+'nosuchaction' => 'بئله چالیشما یوخدور',
+'nosuchactiontext' => 'URL-ده گؤستریلن ایش گئچرسیزدیر.
+اولا بیلر کی URL-ی یانلیش یازیب یوخسا یانلیش باغلانتی‌لا گلمیشسینیز.
+همده بو، {{SITENAME}} سایتی ایشلدن یازیلیمین خطاسینی گؤستره بیلر.',
+'nosuchspecialpage' => 'بئله اؤزل یارپاق یوخدور',
+'nospecialpagetext' => '<strong>سیز بیر یانلیش اؤزل یارپاغینی ایسته‌میسینیز.</strong>
+دوزگون اؤزل یارپاق‌لارین سیاهی‌سینی [[Special:SpecialPages|{{int:specialpages}}]]-ده گؤره بیلرسینیز.',
+
+# General errors
+'error' => 'خطا',
+'databaseerror' => 'دیتابیس خطاسی',
+'dberrortext' => 'بیر دیتابیس سورغو سینتکس خطاسی قاباغا گلدی.
+بو، یازیلیم‌دا بیر خطانی گؤستره بیلر.
+سون قصد ائدیلن دیتابیس سورغوسو بو ایدی:
+<blockquote><code>$1</code></blockquote>
+"<code>$2</code>" Ùونکسیاسی ایچیندن.
+دیتابیس بو خطانی قایتاردی: "<samp>$3: $4</samp>".',
+'dberrortextcl' => 'بیر دیتابیس سورغو سینتکس خطاسی قاباغا گلدی.
+سون قصد ائدیلن دیتابیس سورغوسو بو ایدی:
+"$1"
+"$2" Ùونکسیاسی ایچیندن.
+دیتابیس بو خطانی قایتاردی: "$3: $4"',
+'laggedslavemode' => "'''دیقت:''' یارپاق‌دا، سون دَییشیکلیکلرین اولماماسی ایمکانی وار.",
+'readonly' => 'دیتابیس باغلانیب',
+'enterlockreason' => 'باغلاما نَدَن‌لیگی و آچیلماغین تخمینی واختینی یازین',
+'readonlytext' => 'ایندی دیتابیس یئنی گیرمه‌لره و باشقا دَییشیکلیکلره باغلی‌دیر، اولا بیلر بو روتین دیتابیس باخیمی اوچون‌دور، قورتاران‌دان سونرا، عادی دورومونا قاییتاجاق.
+
+اونو باغلایان ایداره‌چی بو ایضاحی وئریب‌دیر: $1',
+'missing-article' => 'معلومات بازاسی، تاپیلماسی ایستنن "$1" $2 آدلی صحیÙه‌‌يه عاید متنی تاپا بیلمه‌دی.
+
+بۇ وضعیت صحیÙه‌‌نین، سیلینمیش بیر صحیÙه‌‌نین کئچمیش وئرسیياسی اوْلماسیندان قايناقلانا بیلر.
+
+اگر نیيه بۇ دئيیلسه، پروْقرامدا بیر سهو ایله قارشیلاشمیش اوْلا بیلرسینیز.
+خاهیش ائدیریک بۇنو بیر [[Special:ListUsers/sysop|administrator]]، URL نوْت ائده‌رک گؤندرین.',
+'missingarticle-rev' => '(نوسخه نومره‌سی: $1)',
+'missingarticle-diff' => '(Ùرق: $1ØŒ $2)',
+'readonly_lag' => 'ایکینجی درجه‌لی دیتابیس خیدمت‌چیلری، آنا دیتابیسه یئتیشماغا گؤره، بو دیتابیس اوتوماتیک باغلانیب‌دیر',
+'internalerror' => 'ایچ خطاسی',
+'internalerror_info' => 'ایچ خطاسی: $1',
+'fileappenderrorread' => 'اکلَنَنده، «$1»-ی اوخوماق مومکون دئییل‌دیر.',
+'fileappenderror' => '«$1»-ی «$2»-ه اکله‌مک اولانمادی.',
+'filecopyerror' => '«$1» Ùایلی، «$2»-Ù‡ کوپی اولانمادی.',
+'filerenameerror' => '«$1» Ùایلین آدی «$2»-نا دَییشدیریلنمه‌دی.',
+'filedeleteerror' => '«$1» Ùایلی سیلیننمه‌دی.',
+'directorycreateerror' => '«$1» دایرکتوری‌سی سیلیننمه‌دی.',
+'filenotfound' => '«$1» Ùایلی تاپیلانمادی.',
+'fileexistserror' => '«$1» Ùایلینا یازیلانمادی: Ùایل اؤنجه‌دن واردیر.',
+'unexpected' => 'گؤزلنیلمه‌ین دَیَر: «$1»=«$2»',
+'formerror' => 'خطا: Ùورم یوللانانمادی.',
+'badarticleerror' => 'بو ایشی بو یارپاق اوستون‌ده ائتمک اولماز.',
+'cannotdelete' => '«$1» Ùایل یا یارپاغی سیلیننمه‌دی.
+اولا بیلر اونو اؤنجه‌دن باشقا بیر اشلدن سیلمیش اولا.',
+'cannotdelete-title' => '«$1» یارپاغی سیلیننمیر',
+'delete-hook-aborted' => 'سیمک، چنگل‌له یاری‌دا قالدی.
+او هئچ بیر ایضاح وئرمه‌دی.',
+'badtitle' => 'پیس باشلیق',
+'badtitletext' => 'آختاریلان صحیÙه‌‌ آدی سهودیر Ùˆ يا بوْشدور، يا دا دۆزگون اوْلمايان دیللر‌آراسی، ياخود ویکیلرآراسی کئچید ایستیÙاده ائدیلیب.
+باشلیقلاردا ایستیÙاده ائدیلمه‌سی قاداغان اوْلونان بیر Ùˆ يا داها چوْخ سیمووْل ایستیÙاده ائدیلمیش اوْلا بیلر.',
+'perfcached' => 'بو بیلگی، کَش اولوب‌دور و اولا بیلر گونجل اولماسین. چوخو {{PLURAL:$1|بیر نتیجه|$1 نتیجه}} کَش‌ده‌دیر.',
+'perfcachedts' => 'بو بیلگی Ú©ÙŽØ´ اولوب‌دور، سون دÙعه $1 واختیندا گونجلیب‌دیر. چوخو {{PLURAL:$4|بیر نتیجه|$4 نتیجه}} کَش‌ده‌دیر.',
+'querypage-no-updates' => 'بو یارپاق‌دا گونجل‌له‌مک ایندی باغلانیب‌دیر.
+بورداکی بیلگیلر یئنی‌لشمیه‌جکلر.',
+'wrong_wfQuery_params' => 'wfQuery() اوچون یانلیش پارامئترلر وئریلیب‌دیر<br />
+Ùونکسیا: $1<br />
+سورغو: $2',
+'viewsource' => 'قایناغا باخ',
+'viewsource-title' => '$1 اوچون قایناغا باخین',
+'actionthrottled' => 'سیزین چالیشمانیزین قاباغی آلیندی',
+'actionthrottledtext' => 'آنتی-ایسپام حرکت‌لری گؤره، بیر حرکتی قیسا بیر زامان آرالیغیندا چوخئتمه‌نیز انگللندی، Ùˆ سیز حدی آشمیسینیز. لطÙاً بیر نئچه دقیقه سونرا یئنی‌دن یوخلایین.',
+'protectedpagetext' => 'بو صحیÙÙ‡ دیَیشدیرمک Ùˆ باشقا ایشلر اوچون باغلی‌دیر.',
+'viewsourcetext' => 'سیز بو صحیÙه‌نین مزمونونو گؤره Ùˆ کؤچوره بیلرسینیز:',
+'viewyourtext' => "'''اؤز دَییشیکلیکلرینیز''' ین کودونو گؤروب Ùˆ بو صحیÙه‌یه کوپی ائده بیلرسینیز:",
+'protectedinterface' => 'بو صحیÙه‌ده پروقرام تأمیناتی اوچون سیستئم بیلگی‌لری وار Ùˆ سوی-ایستیÙاده‌نین قارشی‌سینی آلماق اوچون محاÙظه اولونما‌لی‌دیر.',
+'editinginterface' => "'''دیقت:''' سیز بیر یازیلیم آرا-اوزونه یازی تعمین ائدن صحیÙه‌نی دَییشدیرمک‌ده‌سینیز.
+بو صحیÙه‌نی دَییشدیرمک، بو ویکی‌نی ایستیÙاده ائدن باشقا ایستیÙاده‌چیلرین گؤرونوشونو دَییشه‌جک‌دیر.
+چئویرمه‌لری بوتون ویکی‌لره آرتیریب یوخسا دَییشدیرمک اوچون لوطÙاً [//translatewiki.net/ translatewiki.net]ØŒ مئدیاویکی‌نین یئرلیلشدیرمه پروژه‌سیندن ایستیÙاده ائدین.",
+'sqlhidden' => '(اس‌کیوال سورغوسو گیزلی)',
+'cascadeprotected' => 'بو صحیÙÙ‡ دَییشیکلیکلر قاباغیندا قورونوب‌دور، چونکو بو آشاغیداکی، آبشاری {{PLURAL:$1|سئچمه‌سی|سئچمه‌لری}} سئچیلن، قورونان {{PLURAL:$1|صحیÙÙ‡|صحیÙه‌لر}} ایچینده‌دیر:
+$2',
+'namespaceprotected' => "سیز '''$1''' آدÙضاسینداکی صحیÙه‌لرین دَییشمه‌سینه ایجازه‌نیز یوخدور.",
+'customcssprotected' => 'سیز بو CSS صÙحه‌سینین دَییشمه‌سینه ایجازه‌نیز یوخدور نییه Ú©ÛŒ اون‌دا باشقا ایشلدنین شخصی تنظیملری واردیر.',
+'customjsprotected' => 'سیز بو جاوااسکریپت صÙحه‌سینین دَییشمه‌سینه ایجازه‌نیز یوخدور، نییه Ú©ÛŒ اون‌دا باشقا ایشلدنین شخصی تنظیملری واردیر.',
+'ns-specialprotected' => 'اؤزل یارپاقلاری دَییشمک اولماز.',
+'titleprotected' => 'بو آددا یارپاغین یارادیلماسی [[User:$1|$1]] ایشلدن طرÙیندن باغلانیب‌دیر.
+اونون نَدَن‌لیگی بودور: "\'\'$2\'\'"',
+'filereadonlyerror' => '«$2» آنباری‌نین تکجه-اوخومالی دوروموندا اولدوغونا گؤره، «$1»-ی دَییشمک اولماز.
+
+اونو باغلایان ایداره‌چی بو ایضاحی وئریب‌دیر: $3',
+'invalidtitle-knownnamespace' => '«$2» آدآلان‌لی و «$3» یازی‌لی یانلیش باشلیق',
+'invalidtitle-unknownnamespace' => 'تانینمامیش $1 نومره‌لی آدآلان و «$2» یازی‌لی یانلیش باشلیق',
+'exception-nologin' => 'گیریش ائتمه‌میسینیز',
+'exception-nologin-text' => 'بو یارپاق یا ایشی گؤرمگه، بو ویکی‌یه گیرمه‌لیسینیز.',
+
+# Virus scanner
+'virus-badscanner' => "پیس تنظیملر: تانینمامیش ویروس یوخلایان: ''$1''",
+'virus-scanfailed' => 'یوخلاماق باشا چاتمادی (کود $1)',
+'virus-unknownscanner' => 'تانینمامیش آنتی‌ویروس:',
+
+# Login and logout pages
+'logouttext' => "'''سیز ایندی سیستÙم‌دن چیخدینیز.'''
+
+سیز {{SITENAME}}-ÛŒ تانینمامیش اولاراق ایشلده بیلرسینیز، یوخسا همن ایستیÙاده‌چی آدی یا باشقا ایستیÙاده‌چی آدی ایله <span class='plainlinks'>[$1یئنی‌دن گیریش]</span> ائده بیلرسینیز.
+بونا دیقت ائدین Ú©ÛŒ بعضی صحیÙه‌لر، Ú©ÙŽØ´-ینیزی سیلمه‌میشه کیمی، هله ده سیزین گیریش ائتدیگینیز کیمی گؤستریله‌جکلر.",
+'welcomeuser' => 'خوش گلمیسینیز، $1!',
+'welcomecreation-msg' => 'حسابینیز آچیلدی.
+[[Special:Preferences|{{SITENAME}}ترجیحلر]] دییشدیرمیی اونوتمایین.',
+'yourname' => 'ایستیÙاده‌چی آدی:',
+'yourpassword' => 'رمز:',
+'yourpasswordagain' => 'رمزی یئنی‌دن یازین:',
+'remembermypassword' => 'بو بیلگی‌سایاردا منیم گیریشیمی (چوخو $1 {{PLURAL:$1|گون}}ه قدر) یاددا ساخلا',
+'securelogin-stick-https' => 'گیرندن سونرا، HTTPS-ه باغلی قال',
+'yourdomainname' => 'سیزین دامنه:',
+'password-change-forbidden' => 'بو ویکی‌ده رمزلری دَییشه بیلنمه‌سینیز.',
+'externaldberror' => 'بیر دیتابیس دوغرولاما خطاسی اولدو، یوخسا سیزین ائشیک حسابینیزی گونجل‌لدمگه ایجازه‌نیز یوخدور.',
+'login' => 'گیریش',
+'nav-login-createaccount' => 'گیریش / حساب یاراد',
+'loginprompt' => '{{SITENAME}} سایتینا گیریش اوچون، کوکی‌لره ایجازه وئرمک لازیم‌دیر.',
+'userlogin' => 'گیریش / حساب یاراد',
+'userloginnocreate' => 'گیریش',
+'logout' => 'چیخیش',
+'userlogout' => 'چیخیش',
+'notloggedin' => 'گیرمه‌میسینیز',
+'nologin' => 'حسابینیز یوخدومو؟ $1.',
+'nologinlink' => 'حساب یارات',
+'createaccount' => 'حساب یارات',
+'gotaccount' => 'اؤنجه‌دن حسابینیز وارمی؟ $1.',
+'gotaccountlink' => 'گیریش',
+'userlogin-resetlink' => 'گیریش بیلگیلرینیزی اونوتموسونوز؟',
+'createaccountmail' => 'بیر گئچیجی راست‌گله رمز ایشلت و اونو آشاغیدا بللندیرن ایمیل آدرسینه گؤندر',
+'createaccountreason' => 'نَدَن‌لیک:',
+'badretype' => 'یازدیغینیز رمزلر بیر دئییل‌لر.',
+'userexists' => 'یازدیغینیز آد، اؤنجه‌دن ایشده‌دیر.
+لوطÙاً باشقا بیر آد سئچین.',
+'loginerror' => 'گیریش خطاسی',
+'createaccounterror' => 'بو حساب یارادیلانمادیر: $1',
+'nocookiesnew' => 'ایستیÙاده‌چی حسابی یارادیلدی، اما سیز گیرمه‌میسینیز.
+{{SITENAME}} ایستیÙاده‌چیلری گیردیرمک اوچون، کوکی‌لری ایشلدیر.
+سیزین کوکی‌لریز باغلانیب‌دیر.
+لوطÙاً اونلاری آچین Ùˆ سونرا یئنی ایستیÙاده‌چی آدی Ùˆ رمزینیزله گیریش ائدین.',
+'nocookieslogin' => '{{SITENAME}} ایشلدنلری گیردیرمک اوچون، کوکی‌لری ایشلدیر.
+سیزین کوکی‌لریز باغلانیب‌دیر.
+لوطÙا اونلاری آچین Ùˆ یئنی‌دن چالیشین.',
+'nocookiesfornew' => 'قایناغینی دوغرو اولدوغونو بیلمه‌مک اوچون، ایشلدن حسابی یارادیلمادی.
+کوکی‌لرینیزین آچیق اولدوغون دان آرخایین اولوب، بو یارپاغی یئنی‌دن یوکله‌ییب، یئنی‌دن چالیشین.',
+'noname' => 'گئچرلی ایستیÙاده‌چی آدی وئرمه‌دینیز.',
+'loginsuccesstitle' => 'گیریش اوغورلو',
+'loginsuccess' => "'''سیز ایندی {{SITENAME}} سایتینا، «$1» آدی‌له گیرمیسینیز.'''",
+'nosuchuser' => '«$1» آدلا ایستیÙاده‌چی یوخدور.
+ایستیÙاده‌چی آدلاری، حرÙلرین بؤیوک/کیچیک‌لیگینه حساس‌دیلار.
+یازدیغینیزا یئنی‌دن باخین، یوخسا [[Special:UserLogin/signup|یئنی بیر حساب آچین]].',
+'nosuchusershort' => '"$1" آدلا ایستیÙاده‌چی یوخدور.
+دوزگون یازدیغینیزدان آرخایین اولون.',
+'nouserspecified' => 'بیر ایستیÙاده‌چی آدی وئرمه‌لیسینیز.',
+'login-userblocked' => 'بو ایستیÙاده Ú†ÛŒ باغلانیب‌دیر. گیریشه ایجازه یوخدور.',
+'wrongpassword' => 'یانلیش رمز وئریلدی.
+یئنی‌دن یازین.',
+'wrongpasswordempty' => 'بوش رمز وئردینیز.
+یئنی‌دن یازین.',
+'passwordtooshort' => 'رمز، آزی {{PLURAL:$1|بیر|$1}} کاراکتئر اولمالی‌دیر.',
+'password-name-match' => 'رمزینیز ایستیÙاده‌چی آدینیزلا Ùرق‌لی اولمالی‌دیر.',
+'password-login-forbidden' => 'بو ایستیÙاده‌چی آدی Ùˆ رمزی ایشلدمک، قاداغان اولوب‌دور.',
+'mailmypassword' => 'یئنی رمزی ایمیل ایله گؤندر',
+'passwordremindertitle' => '{{SITENAME}} سایتینا یئنی گئچیجی رمز',
+'passwordremindertext' => 'بیر کس (احتیمالاً سیز، $1 آی‌پی آدرسی‌له) {{SITENAME}} ($4) اوچون یئنی رمز ایستگی وئریب‌دیر. «$2» ایستیÙاده‌چیسی اوچون یئنی بیر رمز دوزلیب Ùˆ «$3»-Ù‡ تنظیم اولوب‌دور. بو سیزین ایسته‌دیگینیز اولسا، گیریب Ùˆ بیر یئنی رمز وئرمک لازیم‌دیر.
+بو گئچیجی رمز، {{PLURAL:$5|بیر|$5}} گون‌ده واختی گئچه‌جک‌دیر.
+
+بو ایستگی باشقا بیر کس وئریب‌سه، یوخسا سیز رمزینیزی یادا گئتیرمیسیزسه، و داها اونو دَییشمک ایسته‌میرسینیزسه، بو مئساژی نظره توتماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.',
+'noemail' => '«$1» ایستیÙاده‌چی‌یه ایمیل آدرسی قئید اولماییب‌دیر.',
+'noemailcreate' => 'دوزگون بیر ایمیل آدرسی وئرمه‌لیسینیز',
+'passwordsent' => '«$1»-نا قئید اولونان ایمیل آدرسینه، یئنی بیر رمز گؤندریلدی.
+اونا آلان‌دان سونرا یئنی‌دن گیرین.',
+'blocked-mailpassword' => 'سیزین آی‌پی آدرسینیز دَییشیک وئرمه‌یه باغلانیب Ùˆ سوءاستÙاده قاباغی آلماق اوچون، رمزی یئنی‌دن اله گتیرمک ایمکانینا ایجازه‌نیز یوخدور.',
+'eauthentsent' => 'سیزین سئچیلمیش ایمیل آدرسینه، دوغرولاماق اوچون بیر ایمیل گؤندریلدی.
+هر یئنی بیر ایمیل گؤندرمک‌دن اؤنجه، بو حسابین دوغرودان سیزین اولدوغونو گؤسترمک اوچون، او ایمیل‌ده‌کی ایشلری گؤرمه‌لیسینیز.',
+'throttled-mailpassword' => 'سون {{PLURAL:$1|ساعات|$1 ساعات}}‌دا سیزه بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.
+سوءاستÙاده قاباغین آلماق اوچون، هر {{PLURAL:$1|ساعات|$1 ساعات}}‌دا یالنیز بیر رمز یئنیله‌مه ایمیلی گؤندریلر.',
+'mailerror' => 'ایمیل گؤندرمه خطاسی: $1',
+'acct_creation_throttle_hit' => 'سیزین آی‌پی آدرسینیزی ایشلدن زیارتچیلر، سون گون‌ده {{PLURAL:$1|بیر حساب|$1 حساب}} یارادیبلار کی ان چون ایجازه وئریلن‌دیر.
+اونا باخاراق، بو آی‌پی آدرسی ایشلدن زیارتچیلر، بو زامان‌دا، داها آرتیق حساب یارادابیلمزلر.',
+'emailauthenticated' => 'ایمیل آدرسینیز $3 تاریخینده ساعات $2-ده دوغرولانیب‌دیر.',
+'emailnotauthenticated' => 'سیزین ایمیل آدرسینیز هله دوغرولانماییب‌دیر.
+آشاغیداکی اؤزل‌لیکلر اوچون هئچ بیر ایمیل گؤندریلمه‌یه‌جک‌دیر.',
+'noemailprefs' => 'بو اؤزل‌لیکلر ایشله‌مک اوچون، ترجیح‌لرینیزده ایمیل آدرسینیزی وئرین.',
+'emailconfirmlink' => 'ایمیل آدرسینیزی دوغرولایین',
+'invalidemailaddress' => 'بو ایمیل آدرس، یانلیش Ùورمتی اولدوغو اوچون، قبول اولماز.
+لوطÙاً دوزگون Ùورمت‌لی آدرس وئرین، یوخسا اونو بوش بوراخین.',
+'cannotchangeemail' => 'حساب ایمیل آدرسلری بو ویکی‌ده دَییشیلنمزلر.',
+'emaildisabled' => 'بو سایت ایمیل گؤندرنمز.',
+'accountcreated' => 'حساب یارادیلدی',
+'accountcreatedtext' => '$1 ایستیÙاده‌چی حسابی یارادیلیب‌دیر.',
+'createaccount-title' => '{{SITENAME}} اوچون حساب یارادیلماسی',
+'createaccount-text' => 'بیر کس، سیزین ایمیل آدرسینیزه {{SITENAME}} ($4) سایتیندا «$2» آدی و «$3» رمزی ایله بیر حساب آچیب‌دیر. سیز گرک گیریش ائدیب و رمزینیزی ایندی دَییشدیره‌سیز.
+
+بو حساب یانلیش دوزلیب‌سه، بو مئساژا محل قویمایابیلرسیز.',
+'usernamehasherror' => 'ایستیÙاده‌چی آدیندا hash حرÙلری اولا بیلمز',
+'login-throttled' => 'سیزین چوخ گیریش چالیشماغینیز اولوب‌دور.
+لوطÙاً یئنی‌دن چالیشماق‌دان اؤنجه بیر آز دؤزون.',
+'login-abort-generic' => 'سیزین گیریشینیز باشاری‌سیز اولدو - دایاندیریلدی',
+'loginlanguagelabel' => 'دیل: $1',
+'suspicious-userlogout' => 'سیزین چیخیش ایستگینیز رد اولوندو. بو، براوزرین یا پروکسی-کَشلمه‌سینین دوزگون ایشله‌مه‌مه‌سین‌دن قایناق‌لانیر.',
+
+# Email sending
+'php-mail-error-unknown' => 'پی‌اچ‌پی‌نین mail() Ùونکسیاسیندا تانینمامیش خطا.',
+'user-mail-no-addy' => 'ایمیل آدرسی اولماماق‌لا، ایمیل گؤندرمگه چالیشدی',
+'user-mail-no-body' => 'بیر بوش یا چوخ قیسا یازیسی اولان ایمیل گؤندرمگه چالیشیلدی.',
+
+# Change password dialog
+'resetpass' => 'رمزی دَییشدیر',
+'resetpass_announce' => 'سیز بیر گئچرلی ایمیل اولونان کود ایله گیرمیسینیز.
+گیرمگی قورتارماق اوچون، یئنی بیر رمز قویمالیسینیز:',
+'resetpass_header' => 'حساب رمزینی دَییشدیر',
+'oldpassword' => 'اسکی رمز',
+'newpassword' => 'یئنی رمز',
+'retypenew' => 'یئنی رمزی یئنی‌دن یازین:',
+'resetpass_submit' => 'رمز یارادین و گیریش ائدین',
+'resetpass_success' => 'رمزینیز باشاری‌لا دَییشدیرلدی! ایندی گیریرسینیز...',
+'resetpass_forbidden' => 'رمزلر دَییشیلمز',
+'resetpass-no-info' => 'بو صحیÙه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.',
+'resetpass-submit-loggedin' => 'رمزی دَییشدیر',
+'resetpass-submit-cancel' => 'لغو ائت',
+'resetpass-wrong-oldpass' => 'یانلیش گئچیجی یا ایندیکی رمز.
+اولا بیلر سیز باشاریلیق‌لا رمزینیزی دَییشمیسینیز یوخسا یئنی گئچرلی رمز ایسته‌میسینیز.',
+'resetpass-temp-password' => 'گئچیجی رمز:',
+
+# Special:PasswordReset
+'passwordreset' => 'رمزی یئنی‌له',
+'passwordreset-text' => 'رمزینیزی یئنیله‌مک اوچون بو Ùورمو دولدورون.',
+'passwordreset-legend' => 'رمزی یئنی‌له',
+'passwordreset-disabled' => 'بو ویکی‌ده رمزی یئنی‌له‌مک باغلانیب‌دیر.',
+'passwordreset-pretext' => '{{PLURAL:$1|آشاغیداکی وئری پارچالارینین بیرینی وئرین}}',
+'passwordreset-username' => 'ایستیÙاده‌چی آدی:',
+'passwordreset-domain' => 'دامنه:',
+'passwordreset-capture' => 'سون نتیجه ایمیل گؤستریلسین؟',
+'passwordreset-capture-help' => 'بو قوطویا علامت قویساز، (گئچیجی رمزی اولان) ایمیل ایستیÙاده‌چی‌یه گؤندریلن کیمی بوردا سیزه گؤستریله‌جکدیر.',
+'passwordreset-email' => 'ایمیل آدرسی:',
+'passwordreset-emailtitle' => '{{SITENAME}}-ده حساب بیلگیلری',
+'passwordreset-emailtext-ip' => 'بیر کس (احتیمالاً سیز، $1 آی‌پی آدرسی‌له)ØŒ {{SITENAME}} ($4) سایتینداکی حسابینیز اوچون رمزی یئنیله‌مک ایسته‌ییب‌دیر. آشاغیداکی ایستیÙاده‌چی {{PLURAL:$3|حسابی|حسابلاری}} بو ایمیل ایله ایلگی‌لی‌دیرلر:
+
+$2
+
+بو گئچیجی {{PLURAL:$3|رمز|رمزلر}}، {{PLURAL:$5|بیر گون|$5 گون}}‌ده {{PLURAL:$3|واختی|واختلاری}} قورتاراجاق‌دیر.
+سیز گرک ایندی سایتا گیریب و یئنی بیر رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.',
+'passwordreset-emailtext-user' => '{{SITENAME}} سایتیندا، $1 ایستیÙاده‌چی، سیزین اوردا ($4) حسابینیزین رمزینی یئنیله‌مک ایستگی وئریب‌دیر. آشاغیداکی {{PLURAL:$3|ایستیÙاده‌چی|ایستیÙاده‌چیلر}} بو ایمیل ایله ایلگیلیدیرلر:
+
+$2
+
+بو گئچیجی {{PLURAL:$3|رمز|رمزلر}}، {{PLURAL:$5|بیر|$5گون}} سونرا واختلاری قورتاراجاق‌دیر.
+سیز گرک ایندی گیریب و بیر یئنی رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.',
+'passwordreset-emailelement' => 'ایستیÙاده‌چی آدی: $1
+گئچیجی رمز: $2',
+'passwordreset-emailsent' => 'بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.',
+'passwordreset-emailsent-capture' => 'آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.',
+'passwordreset-emailerror-capture' => 'آشاغیدا گؤستریلن کیمی بیر یادا سالما ایمیل یارادیلیب‌دیر، اما ایستیÙاده‌چی‌یه گؤندرمگی باشاریلی اولمادی: $1',
+
+# Special:ChangeEmail
+'changeemail' => 'ایمیل آدرسینی دَییشدیر',
+'changeemail-header' => 'حساب ایمیل آدرسینی دَییشدیر',
+'changeemail-text' => 'ایمیل آدرسینیزی دَییشمک اوچون بو Ùورمو دولدورون. بو دَییشیگی دوغرولاماق اوچون رمزینیزی وئرمه‌لیسینیز.',
+'changeemail-no-info' => 'بو صحیÙه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.',
+'changeemail-oldemail' => 'ایندیکی ایمیل آدرس:',
+'changeemail-newemail' => 'یئنی ایمیل آدرسی:',
+'changeemail-none' => '(هئچ)',
+'changeemail-password' => 'سیزین {{SITENAME}} رمزینیز:',
+'changeemail-submit' => 'ایمیلی دَییشدیر',
+'changeemail-cancel' => 'لغو',
+
+# Edit page toolbar
+'bold_sample' => 'قالین یازی',
+'bold_tip' => 'قالین یازی',
+'italic_sample' => 'اَیری یازی',
+'italic_tip' => 'اَیری یازی',
+'link_sample' => 'باغلانتی باشلیغی',
+'link_tip' => 'ایچری باغلانتی‌سی',
+'extlink_sample' => 'http://www.example.com باغلانتی باشلیغی',
+'extlink_tip' => 'خاریجی باغلانتی (http:// اؤن‌اکی‌نی اونوتمایین)',
+'headline_sample' => 'باشلیق متنی',
+'headline_tip' => '۲ یوکسک باشلیق',
+'nowiki_sample' => 'Ùورمت‌لشدیریلمه‌میش یازی‌نی بورا داخیل ائدین',
+'nowiki_tip' => 'ویکی Ùورمت‌لندیرمه‌سینی سایما',
+'image_tip' => 'یئرلشدیریلمیش Ùایل',
+'media_tip' => 'Ùایل باغلانتی‌سی',
+'sig_tip' => 'سیزین ایمضانیز واخت ایله',
+'hr_tip' => 'دوزئی خط (آز ایشلدین)',
+
+# Edit pages
+'summary' => 'قیساسی:',
+'subject' => 'قونو/باشلیق:',
+'minoredit' => 'بو بیر کیچیک دَییشدیرمه‌دیر',
+'watchthis' => 'بو صÙحه‌نی ایزله',
+'savearticle' => 'صحیÙه‌نی قئید ائت',
+'preview' => 'اؤن‌گؤستریش',
+'showpreview' => 'سیناق گؤستریش',
+'showlivepreview' => 'دیری اؤن‌گؤستریش',
+'showdiff' => 'دَییشیکلیکلری گؤستر',
+'anoneditwarning' => "'''دیقت:''' سیز سیستئمه گیرمه‌میسینیز. سیزین آی‌پی آدرسینیز بو صÙحه‌نین دییشیک تاریخچه‌سین‌ده یازیلاجاق‌دیر.",
+'anonpreviewwarning' => "''سیستمه گیرمه‌میسینیز. قئید ائتمک‌له، سیزین آی‌پی آدرسینیز بو صحیÙه‌نین گئچمیشین‌ده ثبت اولوناجاقدیر.''",
+'missingsummary' => "'''یادا سالما:''' سیز بیر دَییشیکلیک قیساسی یازمامیسینیز. «{{int:savearticle}}» دویمه‌سینی تیک‌لاسازسا، دَییشیکلیگینیز، قیسا شرح‌سیز اولاراق قئید اولوناجاق.",
+'missingcommenttext' => 'لوطÙاً آشاغی‌دا بیر یوروم یازین.',
+'missingcommentheader' => "'''یادا سالما:''' سیز یورومونوز اوچون بیر قونو/باشلیق یازمامیسینیز.
+«{{int:savearticle}}»-ی تیک‌لاسازسا، دَییشیکلیگینیز، قونو/باشلیق-ی اولمایاراق قئید اولوناجاق‌دیر.",
+'summary-preview' => 'قیسا اؤن‌گؤستریش:',
+'subject-preview' => 'قونو/باشلیق اؤن‌گؤستریشی:',
+'blockedtitle' => 'ایستیÙاده‌چی باغلانیب',
+'blockedtext' => '\' \'ایستیÙاده‌چی آدی Ùˆ یا Ø¢ÛŒ Ù¾ÛŒ عنوانینیز قاباغی باغلانیب دیر.\'
+
+سیزی باغلایان$ 1. الیله اولوب دیر
+باغلاماق سببی:\' $ 2.
+
+* باغلانمانین باشلانان زامانی: $ 8
+* باغلانمانین قورتولان زامانی: $ 6
+* باغلانما مدتی: $ 7
+
+گؤستریلن سببه گؤره ائنگئللئنمئنیزین اویغون اولمادیغینی دوشونورسونوزسه، $ 1 یا دا باشقا بیر [[{{MediaWiki:Grouppage-sysop}}|مدیر]] ایله بو وضعیتی گؤروشه بیلرسینیز. [[Special:Preferences|ترجیح لرینیز]] قیسمینده اعتبارلی بیر ائ-پوچت اونوانی گیرمئدیسئنیز "ایستیÙاده‌چییه ائ-پوچت گؤندر" خصوصیتینی ایستیÙاده ائده، ترجیهلرینیز ایمیل عنوانینیزی علاوه ایمیل گؤندرمک حقوقونا صاحب اولاجاقسینیز.
+بو آنکی باغلانما عنوانینیز $ 3، ائنگئللئنمئ نؤمره‌نیز # $ 5.
+بیر ایداره‌چی‌لر وضعیتینیز حاقیندا معلومات آلماق ایستدیگینیزده و یا هر هانسی بیر سورگودا بو معلومات‌لار لازیم اولا‌جاق، خاهیش ائدیریک نوت ائدین.',
+'autoblockedtext' => '
+\' \'ایستیÙاده‌چی آدی Ùˆ یا Ø¢ÛŒ Ù¾ÛŒ عنوانینیز قاباغی باغلانیب دیر.\'
+
+سیزی باغلایان$ 1. الیله اولوب دیر
+باغلاماق سببی:\' $ 2.
+
+* باغلانمانین باشلانان زامانی: $ 8
+* باغلانمانین قورتولان زامانی: $ 6
+* باغلانما مدتی: $ 7
+
+گؤستریلن سببه گؤره ائنگئللئنمئنیزین اویغون اولمادیغینی دوشونورسونوزسه، $ 1 یا دا باشقا بیر [[{{MediaWiki:Grouppage-sysop}}|مدیر]] ایله بو وضعیتی گؤروشه بیلرسینیز. [[Special:Preferences|ترجیح لرینیز]] قیسمینده اعتبارلی بیر ائ-پوچت اونوانی گیرمئدیسئنیز "ایستیÙاده‌چییه ائ-پوچت گؤندر" خصوصیتینی ایستیÙاده ائده، ترجیهلرینیز ایمیل عنوانینیزی علاوه ایمیل گؤندرمک حقوقونا صاحب اولاجاقسینیز.
+بو آنکی باغلانما عنوانینیز $ 3، ائنگئللئنمئ نؤمره‌نیز # $ 5.
+بیر ایداره‌چی‌لر وضعیتینیز حاقیندا معلومات آلماق ایستدیگینیزده و یا هر هانسی بیر سورگودا بو معلومات‌لار لازیم اولا‌جاق، خاهیش ائدیریک نوت ائدین.',
+'blockednoreason' => 'دلیل وئریلمه‌ییب',
+'whitelistedittext' => 'صحیÙه‌لری دَییشمک اوچون گرک $1.',
+'confirmedittext' => 'سیز صحیÙه‌لری دَییشدیرمک‌دن اؤنجه، ایمیل آدرسینیزی دوغرولامالیسینیز.
+لوطÙاً ایمیل آدرسینیزی [[Special:Preferences|ایستیÙاده‌چی تنظیملری]]نیزدن بیلدیریب Ùˆ دوغرولایین.',
+'nosuchsectiontitle' => 'بؤلوم تاپیلانمادی',
+'nosuchsectiontext' => 'سیز بیر وار اولمایان بؤلومو دَییشدیرمگه چالیشدینیز.
+اولا بولر سیز صحیÙه‌یه باخاندا، او بؤلوم سیلینیب یوخسا داشینیب‌دیر.',
+'loginreqtitle' => 'گیریش لازیم‌دیر',
+'loginreqlink' => 'گیریش',
+'loginreqpagetext' => 'باشقا صحیÙه‌لری گؤرمک اوچون گرک $1.',
+'accmailtitle' => 'رمز گؤندریلدی',
+'accmailtext' => "[[User talk:$1|$1]] اوچون بیر راست‌گله رمز یارادیلیب و $2-ه گؤندریلدی.
+
+بو یئنی حسابین رمزی، گیرندن سونرا ''[[Special:ChangePassword|رمز دَییشدیرمه]]'' صحیÙه‌سیندن دَییشیله بیلر.",
+'newarticle' => '(یئنی)',
+'newarticletext' => "مؤوجود اوْلمايان صحیÙه‌‌يه اوْلان کئچیدی ایزله‌دینیز.
+آشاغیداکی ساحه‌‌يه مظمونونو يازاراق بۇ صحیÙه‌‌نی '''سیز''' يارادا بیلرسینیز. (علاوه‌‌ معلومات اۆچون [[{{MediaWiki:Helppage}}|کؤمک صحیÙه‌‌سینه]] باخین). اگر بۇ صحیÙه‌‌يه سهون گلمیسینیزسه ساده‌جه اوْلاراق براوزئرین '''گئری''' دۆيمه‌سینه وۇرون.",
+'anontalkpagetext' => "''بو صحیÙÙ‡ قئیدیات‌دان کئچممیش Ùˆ یا داخیل اولمامیش آنونیم ایستیÙادچییه عایید موذاکیره صحیÙه‌سی‌دیر.
+اونا گؤره بو ایستیÙادچینی رقم‌لردن عبارت ایپ اونوانی ایله معین ائتمک مجبوریتیندییک.
+بئله ایپ اونوان بیر نئچه Ùرد طرÙین‌دن ایستیÙاده‌ده اولا بیلر.
+اگر سیز آنونیم ایستیÙادچیسینیزسه Ùˆ بو مئساژین سیزه عایید اولمادیغینی دوشونورسونوزسه، اوندا [[Special:UserLogin/signup|قئیدیات‌دان کئچین]] Ùˆ یا [[Special:UserLogin|داخی اولون]].''",
+'noarticletext' => 'ایندی بو صحیÙه‌ده یازی یوخدور.
+سیز آیری صحیÙه‌‌لرده [[Special:Search/{{PAGENAME}}|بو باشلیق اوچون آختارا بیلرسیز]]ØŒ
+یا دا <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ایلگیلی قئیدلری آختارا بیلرسیز]،
+یا دا [{{fullurl:{{FULLPAGENAME}}|action=edit}} بو صحیÙه‌نی دَییشدیره بیلرسیز]</span>.',
+'noarticletext-nopermission' => 'بو صحیÙه‌‌ ایندی بوشدور.
+باشقا صحیÙه‌‌لرده عینی آددا صحیÙه‌‌نی [[Special:Search/{{PAGENAME}}| آختار]], علاقه‌‌لی قئيدلره
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} باخا],
+Ùˆ يا صحیÙه‌‌نی [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktÉ™]</span> ائده بیلرسینیز.',
+'missing-revision' => '«{{PAGENAME}}» صحیÙه‌سی اوچون $1 نومره‌لی نوسخه یوخدور.
+
+عموما٠بو ایشکال، واختی گئچمیش بیر باغلانتی ایله سیلینمیش بیر صحیÙه‌یه گلنده، قاباغا گلر.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیلمک سیاهی]‌سینده باشقا بیلگیلر اولا بیلر.',
+'userpage-userdoesnotexist' => '«$1» ایستیÙاده‌چی حسابی یارانماییب‌دیر.
+بو صحیÙه‌نی یارادماق یوخسا دَییشدیرمگینه بیر ده باخین.',
+'userpage-userdoesnotexist-view' => '«$1» ایستیÙاده‌چی حسابی یارانماییب‌دیر.',
+'blocked-notice-logextract' => 'بو ایستیÙاده‌چی ایندی باغلانیب‌دیر.
+باغلاماق سیاهی‌سینده‌کی سون یازی آشاغیدا قایناق اوچون گلیب‌دیر:',
+'clearyourcache' => "' 'قئید:' یازدیق‌دان سونرا دییشیک‌لیک‌لری گؤرمک اوچون براوزئرینیزین کئش یادداشیندا تمیزلمه‌نیز لازیم اولا بیلر.
+* 'ÙایرÙاکس / ساÙاری:''Shift'' دویمه‌سینه باسین \"یئنی‌دن یوکله\"-ا داخیل اولون یا دا ''Ctrl-F5'' یا ''Ctrl-R'' ائدین (ماج اوچون ''⌘-R'').
+* 'گووگل کروم:'''Ctrl+Shift+R'' باسین. (ماج اوچون ''⌘-Shift-R'')
+* 'اینترنت ایکسپئلور:''' کلید ''Ctrl'' باسین یئنی‌لئ 'یئ داخیل اولون یا دا ''Ctrl-F5'' ائدین.
+* 'اوپئرا:' آلت‌لری → سئچیملر 'دن اؤنبئللیغی ''Tools &rarr; Preferences'' تمیزلیین.",
+'usercssyoucanpreview' => "'''اؤنری:''' یئنی سی‌اس‌اس-ی قئید ائتمک‌دن اؤنجه، یوخلاماق اوچون، «{{int:showpreview}}» دویمه‌سینی ایشلدین.",
+'userjsyoucanpreview' => "'''اؤنری:''' یئنی جاوااسکریپتی قئید ائتمک‌دن اؤنجه، یوخلاماق اوچون، «{{int:showpreview}}» دویمه‌سینی ایشلدین.",
+'usercsspreview' => "'''خاتیرلادیریق کی، سیز یالنیز سی‌اس‌اس-ده سیناق گؤستریشی ائتمیسینیز.'''
+''''بو هله یادداشدا ساخلانیلماییب!'''",
+'userjspreview' => "'خاتیرلادیریق کی، سیز یالنیز سی اس اس -ده تئست/سیناق گؤستریشی ائتمیسینیز.'
+'بو هله یادداشدا ساخلانیلماییب!'",
+'sitecsspreview' => "'''خاتیرلادیریق کی، سیز یالنیز سی‌اس‌اس-ده سیناق گؤستریشی ائتمیسینیز.'''
+'''بو هله یادداشدا ساخلانیلماییب!'''",
+'sitejspreview' => "'خاتیرلادیریق کی، سیز یالنیز ژاواسجریپت کودوندا سیناق گؤستریشی ائتمیسینیز.'
+'بو هله یادداشدا ساخلانیلماییب!'",
+'userinvalidcssjstitle' => 'خاتیرلادیرق:\' \'"$1" آدییلا بیر پوشه یوخ‌دور. پوشه-آدی.css Ùˆ. js Ùایل‌لارینین آدلاری کیچیک حر٠ایله یازماسی لازیم‌دیر، یعنی {{ns:user}}: تمل / vector.css دئییل، {{ns:user}}: تمل / Vector.css.',
+'updated' => '(گونجل‌لندی)',
+'note' => "'''دیقت:'''",
+'previewnote' => "'''بونون ساده‌جه بیر سیناق گؤستریشی اولدوغونو نظرده آلین.'''
+سیزین دییشیکلرینیز هله قئید اولونماییب!",
+'continue-editing' => 'دَییشدیرمه یئرینه گئت',
+'previewconflict' => 'بو سیناق گؤستریشی‌دیر Ùˆ یادداشدا ساخلایاجاغینیز تق‌دیرده متنین دییشدیر صحیÙه‌سی‌نین یوخاری حیسه‌سینده نتیجه‌نین نئجه اولاجاغینی گؤستریر.',
+'session_fail_preview' => "'''اوزر ایستییریک! سیزین دییشتیرینیز‌ ساخلانیلمادی. لطÙاً بیر داها تکرار ائدین. پروبلئم حل اولونماسا حسابینیزدان [[Special:UserLogout|چیخین]] Ùˆ یئنی‌دن داخیل اولون.'''",
+'session_fail_preview_html' => "'''اوزر ایستییریک! داخیل وئری‌سی‌نین ایتمه‌سین‌دن گؤره تنظیملمه‌نیزی اعمال کئچیره بیلمیجیی.' '
+
+' چونکی {{SITENAME}} سایتیندا raw هتمل تأثیرین‌دیر،تا جاوااسکریپت هوجوم‌لارینا تدبیر اولا‌راق گیزلنمیش‌دیر.'
+
+' 'گر بو حاق‌لی بیر تنظیملمه گیریش میسئ، لطÙاً یئنی‌دن جهد ائدین. اگر هله چالیشمازسا، [[Special:UserLogout|خارج شوید]] یئنی‌دن ایجلاس آچماغی یوخلایین.' '",
+'token_suffix_mismatch' => "'' ' ديَیشیکلیگی‌نین گئری چئوریلدی، چونکی آلیجی‌نین تنزیمله‌مه کوتوجوغونداکی دورغو ایشاره‌لرینی پوزدو.
+ديَیشیکلیگی‌نین، صحیÙه‌‌ متنینده پوزولماغی اؤنله‌مک اوچون گئری چئوریلدی.
+اگر پروبلئملی بیر wئب-باسئد آنونیم پروکسی خیدمتی ایستیÙاده بو حادثه‌‌ بضا رئاللاشا بیلر.'' '",
+'edit_form_incomplete' => "'''دییشیک‌لیک Ùورماسی اوچون بعضی سئروئرلره ایشلمه‌دی؛ ائتدیگینیز دییشیک‌لیک‌لر بوزولمامیشتیر، نظردن کئچیریب یئنی‌دن سینایین.'",
+'editing' => '<font style="color:red">$1</font> دییشدیریلیر',
+'creating' => '$1 یارادیلیر',
+'editingsection' => '$1 دَییشدیریلیر (بؤلوم)',
+'editingcomment' => '$1 دَییشدیریلیر (یئنی بؤلوم)',
+'editconflict' => 'عینی واختدا دییشدیرمک: $1',
+'explainconflict' => "سیز صحیÙه‌‌نی رئداکته باشقا بیری ده ديَیشیکلیک ائتدی.
+يوخاریداکی يازی صحیÙه‌‌نین بو آنکی حالینی گؤستریر.
+سیزین ديَیشیکلیکلری‌نین آلتا گؤستریلمیشدیر. سون دئغیشیکلئرینیزی يازی‌نین ایچینه داخیل ائتمه‌يینیز لازیم اولاجاق.
+«{{int:savearticle}}» ائ باسدیغینیزداع' ' يالنیزعع' يوخاریداکی يازی يازیلاجاق.",
+'yourtext' => 'یازینیز',
+'storedversion' => 'قئید ائدیلمیش نوسخه',
+'nonunicodebrowser' => "' 'دیققت: آختاریش برنامه نیز اویغون دئییل.
+صحیÙه‌لری اعتبارلا دییشدیرمیینیزه ایجازه وئرمک اوچون: آسجیی اولمایان کاراکتئرلر دییشدیرمه قوتوسوندا اونالتیلیک کودلار اولا‌راق گؤرونه‌جک.' '",
+'editingold' => "'دیققت! سیز بو صحیÙه‌نین کؤهنه نوسخه سین دییشدیر ائدیرسینیز. مقالنی یادداشدا ساخلایاجاغینیز حالدا بو نوسخه سونرا ائدیلمیش هر بیر دییشیک‌لیک ایتیریله‌جک.'",
+'yourdiff' => 'Ùرقلر',
+'copyrightwarning' => 'خاهیش اولونور دقته آلاسینیز کی، {{SITENAME}}داکی بوتون Ùالیت‌لرینیز $2 لیسئنزیاسینا تابع اولدوغو حساب ائدیلیر (تÙرروات اوچون باخ: $1). اگر یازدیق‌لارینیزین اساس‌لی شکیلده رئداکته ائدیلمه‌سینی Ùˆ ایستنیلدیگی واخت باشقا یئره اؤتورولمه‌سینی ایستمیرسینیزسه، یازی‌لارینیزی بورادا درج ائتمیین.
+<br />
+سیز عینی زاماندا سؤز وئریرسینیز کی، بو یازی‌لاری سیز اؤزونوز یازمیسینیز و یا اونلاری هامییا آچیق موهیت‌دن یا دا بونا بنزر منبع‌دن کؤچورموسونوز.
+
+----
+
+</div> ایستیلئ="Ùونت-weight: بولد؛ Ùونت-سیزئ: 110%Ø› جولور:رئد؛">موللی٠حقوق‌لاری ایله قورونموش هئچ بیر ایشی ایجازه‌سیز درج ائتمیین!</div>',
+'copyrightwarning2' => 'خاهیش ائدیریک، {{SITENAME}} سایتینا ائده‌جه‌یم بوتون روسوم دیگر عضو‌لر طرÙین‌دن دوزئنلئنئبیلئجئغینی، دییش‌دیریله Ùˆ یا سیلینئبیلئجئغینی خاتیرلایین. یازی‌لارینین مئرهامئتسیزجئ دئغیشتیریلی بیلمسینه راضی‌لیق گؤسترمیرسه بورا ایشتیراک ائتمیین. <br />
+آیریجا بو علاوه یازینی سیزین یازدیغینیزدان یا دا سربست کوپیالاما ایجازه‌سی وئرن بیر قایناق‌دان کوپیالادیغینیزی بیزه اؤهده‌لرینه ائتمکدسینیز (دئتال‌لار اوچون ایستیناد: $1).',
+'longpageerror' => "خطا: داخیل متنین اوزون‌لوغو قبول ائدیله بیلر ان چوخ اوزونلوق اولان {{PLURAL: $2 | بیر کیلوبایت | $2 کیلوبایت}} دان چوخ‌دور و {{PLURAL: $1 | بیر کیلوبایت | $1 کیلوبایت}} بؤیوکلوگونده‌دیر.'
+دییشیک‌لیگی‌نین کایدئدیلئمئز.",
+'readonlywarning' => "'''دیقت: باخیم سببی ایله دیتابیس بو آندا Ù‚ÛŒÙیللی‌دیر. بو سببله دییشیک‌لیکلری‌نین بو آندا قئید ائدیل میه‌جکدیر. یازدیقلارینیزی باشقا بیر Ùایل‌دا آلیب ساخلایا Ùˆ داها سونرا یئنی‌دن بورا گتیریب یازا بیلرسینیز.
+
+اونو Ù‚ÛŒÙیل‌لایان ایداره‌چی، بو شرحی وئریب‌دیر: $1",
+'protectedpagewarning' => "' 'خاطیرلیریق: بو ​​صحیÙÙ‡ باغلانیب دیر Ùˆ یالنیز مودیر اولان‌لار طرÙین‌دن دییش‌دیریله بیلر.'
+سون گونده‌لیک گیردی‌سی ایستیناد مقصدلی آشاغیدا وئریلمیش‌دیر:",
+'semiprotectedpagewarning' => "'قئید:' بو صحیÙÙ‡ محاÙظه‌لی اولدوغو اوچون یالنیز قئیدیات‌دان کئچمیش ایستیÙاده‌چی‌لر دییشدیر ائده بیلرلر.",
+'cascadeprotectedwarning' => "'''خاطیرلایریق:''' بو صحیÙÙ‡ بو یئرده {{PLURAL:$1|صحیÙÙ‡Ù”|صحیÙه‌لر}} یئرلشمیه یه گوره آبشاری- Ø­Ùظ اولونوب آلتیندا باغلانیب بونجه مودیر Ùقط ائلیه بیله لر دییشدیر ائده بیلسین لر",
+'titleprotectedwarning' => "'دیققت! بو صحیÙÙ‡ محاÙظه‌لی‌دیر، یالنیز [[Special:ListGroupRights|ایجازه سی اولان]] ایستیÙاده‌چی‌لر اونو دییشدیر ائده بیلرلر.'",
+'templatesused' => '{{PLURAL:$1|شابلون}} بو صÙحه‌ده ایشلنیب‌دیر:',
+'templatesusedpreview' => '{{PLURAL:$1|بیر|$1}} شابلون بو اؤن‌گؤستریش‌ده ایشلنیب‌دیر:',
+'templatesusedsection' => '{{PLURAL:$1|شابلون}} بو بؤلمه‌ده ایشلنیب‌دیر:',
+'template-protected' => '(قورونوب)',
+'template-semiprotected' => '(یاریم‌قورونموش)',
+'hiddencategories' => 'بو صحیÙÙ‡ {{PLURAL:$1|بیر گیزلی دسته‌یه|$1 گیزلی دسته‌لره}} عایددیر:',
+'nocreatetext' => '{{SITENAME}} یئنی صحیÙÙ‡ یارادماق ایمکانی‌نی محدودلاشدیریب‌دیر.
+سیز دالی دؤنوب Ùˆ اؤنجه‌دن اولان بیر صحیÙه‌نی دَییشدیره بیلرسینیز، یا دا [[Special:UserLogin|گیریب یوخسا یئنی حساب آچین]].',
+'nocreate-loggedin' => 'سیزین یئنی صحیÙه‌لر یاراتماغا ایجازه‌نیز یوخدور.',
+'sectioneditnotsupported-title' => 'بؤلوم دییشدیرمه‌سی دستک‌لنمیر',
+'sectioneditnotsupported-text' => 'بو صحیÙه‌ده بؤلوم دَییشدیرمه‌سی دستکلنمیر.',
+'permissionserrors' => 'ایزین خطاسی',
+'permissionserrorstext' => 'سیز آشاغیداکی {{PLURAL:$1|دلیل|دلیل‌لر}}ه گؤره، او ایشه ایجازه‌نیز یوخدور.',
+'permissionserrorstext-withaction' => 'سیز آشاغیداکی {{PLURAL:$1|دلیل|دلیل‌لر}}اوچون، $2 ایشینه ایجازه‌نیز یوخدور:',
+'recreate-moveddeleted-warn' => "'''دیقت: سیز اؤنجه‌ده سیلینمیش بیر صÙحه‌نی یئنی‌دن یارادیرسینیز.'''
+
+بو صÙحه‌نین یئنی‌دن یارادماغی‌نین نه‌قدر اویغون اولدوغونو گرک نظرده آلاسینیز.
+بو صÙحه‌نین سیلمک Ùˆ آپارماق گئچمیشی بوردا گؤستریلیب‌دیر:",
+'moveddeleted-notice' => 'بو صحیÙÙ‡ سیلینمیشدیر.
+معلومات اوچون آشاغیدا بو صحیÙه‌نین آددَییشدیرمه Ùˆ سیلمه قئيدلری گؤستریلیب‌دیر.',
+'log-fulllog' => 'بوتون بیلگی‌لری گؤستر',
+'edit-hook-aborted' => 'دوزلیش‌لر قارماق-پروسئ‌دور طرÙین‌دن گئری قایتاریلیب.
+علاوه ایزاهات وئریلمه‌ییب.',
+'edit-gone-missing' => 'صحیÙÙ†ÛŒ یئنی لمک مومکون دئییل.
+چوخ گومان کی، صحیÙÙ‡ سیلینمیش‌دیر.',
+'edit-conflict' => 'سیزله برابر دییشدیرمه',
+'edit-no-change' => 'سیزین دییشدیر قئیده آلینمامیش‌دیر. بئله کی، متنده هئچ بیر دییشدیر ائدیلممیش‌دیر.',
+'edit-already-exists' => 'یئنی صحیÙÙ†ÛŒ یاراتماق مومکون دئییل.
+بئله کی، بو آددا صحیÙÙ‡ آرتیق مؤوجوددور.',
+'defaultmessagetext' => 'دÙالت دانیشیق متنی',
+'content-failed-to-parse' => 'تجزیه محتوای $2 مدل اوچون $1: $3 موÙقیت اله گلمه دی',
+'invalid-content-data' => 'اعتبارسیز مضمون معلوماتی',
+'content-not-allowed-here' => '"$1" مقاله‌سینه، [[$2]] صحیÙه‌سینده ایجازه وئریلممیش دیر.',
+
+# Content models
+'content-model-wikitext' => 'ویکی‌یازی',
+'content-model-text' => 'ساده یازی',
+'content-model-javascript' => 'جاوااسکریپت',
+'content-model-css' => 'سی‌اس‌اس',
+
+# Parser/template warnings
+'expensive-parserfunction-warning' => 'خبردارلیق: بو ​​صحیÙÙ‡ چوخ چوخ زنگین ییغیجی تجزیه ائدن چاغیریشی دستورلار ائدیر.
+
+بو $2 مراجعت آز اولما‌لی، بو آندا {{PLURAL:$2|چاغیرش وار|چاغریش وار}} و اینک {{PLURAL:$1|چاغیرش وار|$1چاغریش وار}} .',
+'expensive-parserfunction-category' => 'Ú©ÛŒÙایت قدر بؤیوک سایدا گئنیشرئسورس‌لو Ùونکسیا‌لارین مراجعت اولوندوغو صحیÙه‌لر',
+'post-expand-template-inclusion-warning' => "'''دیققت!''' داخیل ائدیلن شابلوْنلارین حجمی حددیندن آرتیق بؤيوکدور.
+بعضی شابلوْنلار علاوه‌‌ اوْلونماياجاق.",
+'post-expand-template-inclusion-category' => 'شابلونون داخیل اولدوغو صحیÙه‌‌لرین اؤلچوسو بؤيوکدور.',
+'post-expand-template-argument-warning' => "'''دیقت:''' بو صÙحه‌ده، آزی بیر چوخ اوزون بویلو شابلون آرگومانی واردیر.
+بو آرگومانلارین اوستون‌دن کئچیلیب‌دیر.",
+'post-expand-template-argument-category' => 'شابلونلاردا بوراخیلمیش آرگومانلارین مؤوجود اولدوغو صÙحه‌لر',
+'parser-template-loop-warning' => '[[$1]]: شابلوندا دويون تاپیلدی',
+'parser-template-recursion-depth-warning' => '($1) شابلوندا درین‌لیک لیمیتی کئچیلدی',
+'language-converter-depth-warning' => '($1) دیل کونوئرتورونون لیمیتی کئچیلدی',
+'node-count-exceeded-category' => 'دویون سایی آشیلان صحیÙه‌لر',
+'node-count-exceeded-warning' => 'صحیÙÙ‡ دویون سیاهییاالما آشیلدی',
+'expansion-depth-exceeded-category' => 'گئنیشلمه درین‌لیگی آشیلان صحیÙه‌لر',
+'expansion-depth-exceeded-warning' => 'صحیÙÙ‡ گئنیشلنمه درین‌لیگی آشیلدی',
+'parser-unstrip-loop-warning' => 'تکرارلاما دونمه سی قبول ائدیلدی',
+'parser-unstrip-recursion-limit' => 'حداکثر ارجاع دستور دا unstrip تجاوز گئچیب دیر ($1)',
+'converter-manual-rule-error' => 'خطا ال مبدیلی قانون لاریندا',
+
+# "Undo" feature
+'undo-success' => 'بو دَییشیک‌لیک گئری آلینا بیلر. لطÙاً آشاغی‌داکی موقاییسه ائتمیی نظارت ائدین، حقیقتن بو دییشیک‌لیگی ائتمک ایستدیگینیزدن امین اولون Ùˆ صحیÙÙ†ÛŒ یازا‌راق بیر اوولکی دییشیک‌لیگی گئرییه آلین.',
+'undo-failure' => 'دییشیک‌لیک‌لرین توققوشماسی نتیجه‌سینده گئرییه قایتارما ایشی اوغورسوز اولدو.',
+'undo-norev' => 'دوزلیش‌لر گئری قایتاریلا بیلینمیر، چونکی اونلار یا مؤوجود دئییل، یا دا سیلینیب.',
+'undo-summary' => '$1 دییشیک‌لیک [[Special:Contributions/$2|$2]] ([[User talk:$2|دانیشیق]]) طرÙین‌دن گئری آلیندی​​.',
+
+# Account creation failure
+'cantcreateaccounttitle' => 'حساب یارادماق اولمور',
+'cantcreateaccount-text' => "بو ای Ù¾ÛŒ عنوانین‌دان ('$1) ایستیÙاده‌چی حسابی یارادیلماسی [[User:$3|$3]] طرÙین‌دن انگللنمیش‌دیر.
+
+$3 طرÙین‌دن وئریلن سبب '$2",
+
+# History pages
+'viewpagelogs' => 'بو صحیÙه‌نین قئیدلرینه باخ',
+'nohistory' => 'بو صحیÙÙ‡ اوچون دَییشدیرمه گئچمیشی یوخدور.',
+'currentrev' => 'سون نوسخه',
+'currentrev-asof' => '$1 تاریخینه کیمی سون حال',
+'revisionasof' => '$1 نوسخه‌سی',
+'revision-info' => '$1-ده $2-له یارادیلمیش نوسخه',
+'previousrevision' => 'اونجه‌کی وئرسیيا',
+'nextrevision' => 'داها یئنی نوسخه â†',
+'currentrevisionlink' => 'سون نوسخه',
+'cur' => 'ایندی',
+'next' => 'سونراکی',
+'last' => 'اؤنجه',
+'page_first' => 'ایلک',
+'page_last' => 'سون',
+'histlegend' => "Ùرقلری سئچمه: موقاییسه ائتمک ایسته‌دیگینیز دییشیک‌لیکلرین یانینداکی گیرده دویمه‌لره علامت قویون Ùˆ سونرا Enter-ÛŒ ووروب یوخسا آشاغیداکی اویمه‌نی وورون.<br />
+آچیقلاما:'''({{int:cur}})''' =سون نوسخه ایله Ùرقلر ØŒ '''({{int:last}})''' = اؤنجه‌کی نوسخه ایله Ùرقلر، '''{{int:minoreditletter}}''' = کیچیک دییشیک‌لیک.",
+'history-fieldset-title' => 'گئچمیشی آختار',
+'history-show-deleted' => 'یالنیز سیلینَنلر',
+'histfirst' => 'ان قاباقکی',
+'histlast' => 'ان سونراکی',
+'historysize' => '({{PLURAL:$1|بیر|$1}} بایت)',
+'historyempty' => '(بوش)',
+
+# Revision feed
+'history-feed-title' => 'دَییشیکلیکلر گئچمیشی',
+'history-feed-description' => 'ویکی‌ده بو صحیÙÙ‡ اوچون نوسخه‌لر گئچمیشی',
+'history-feed-item-nocomment' => '$2-ده $1',
+'history-feed-empty' => 'ایسته‌دیگینیز صحیÙÙ‡ یوخدور.
+اولا بیلر کی بو ویکی‌دن سیلینیب یوخسا آدی دَییشیلیب‌دیر.
+ایلگیلی یئنی صحیÙه‌لری تاپماق اوچون [[Special:Search|بو ویکی‌ده آختارماغا چالیشین]].',
+
+# Revision deletion
+'rev-deleted-comment' => '(دَییشدیرمک قیساسی سیلیندی)',
+'rev-deleted-user' => '(ایستیÙاده‌چی آدی سیلیندی)',
+'rev-deleted-event' => '(قئيد سیلیندی)',
+'rev-deleted-user-contribs' => '[ایستیÙاده‌چی آدی Ùˆ يا ای-Ù¾ÛŒ اونوانی سیلیندی - ديَیشیکلیک چالیشمالاردان چیخاریلدی]',
+'rev-deleted-text-permission' => "بو ديَیشیکلیک بو صحیÙه‌دن '''سیلینیب دیر.'''",
+'rev-deleted-text-unhide' => "بو صحیÙÙ‡ رئویزیونو 'سیلینمیش.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاهه سیلینمش] دئتال‌لاری بیلر.
+بیر خیدمتله اولا‌راق اگر داوام ائتسه‌نیز [$1 بو رئویزیونو هله گؤره بیلرسینیز].",
+'rev-suppressed-text-unhide' => 'صحیÙه‌نین بو نوسخه سی سیلینیب.
+مومکون‌دور کی، بونون سببی [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیلمه قئیدلرینده]گؤستریلمیش‌دیر.
+سیز ایداره‌چی اولدوغونوزا گؤره سیلینن [$1 بو وئرسیانی] نظردن کئچیره بیلرسینیز.',
+'rev-deleted-text-view' => 'صحیÙه‌نین بو نوسخه سی سیلینیب.
+سیز ایداره‌چی اولدوغونوزا گؤره سیلینن بو وئرسیانی نظردن کئچیره بیلرسینیز. مومکون‌دور کی، سیلینمه‌نین سببی [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیلمه قئیدلرینده] گؤستریلمیش‌دیر.',
+'rev-suppressed-text-view' => "بو صحیÙÙ‡ رئویزیونو 'باسدیریلمیش.
+بیر خیدمتله اولا‌راق صحیÙÙ†ÛŒ گؤره بیلرسینیز؛ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} دایاندیرما قئیدلرینده] دئتال‌لار اولا بیلر.",
+'rev-deleted-no-diff' => "سیز نوسخه لر آراسین‌داکی Ùرقی نظردن کئچیره بیلمزسینیز. بئله کی، نوسخه لردن بیری 'سیلینیب.
+مومکون‌دور کی، بونونلا باغ‌لی تÙرروات‌لار [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیلمه قئیدلرینده] گؤستریلمیش‌دیر.",
+'rev-suppressed-no-diff' => "اولکی دییشدیر‌لرین بیری 'سیلینمیش Ùرقی گؤره بیلمزسینیز.",
+'rev-deleted-unhide-diff' => "بو دییشیک‌لیگی‌نین رئویزیون‌لارین‌دان بیری 'سیلینمیش.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیلمه گوندلیگینده] دئتال‌لار اولا بیلر.
+بیر خیدمتله اولا‌راق اگر داوام ائتسه‌نیز [$1 بو دییشیک‌لیگی هله گؤره بیلرسینیز].",
+'rev-suppressed-unhide-diff' => "بو دییشیک‌لیگی‌نین رئویزیون‌لارین‌دان بیری 'باسدیریلمیش.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} دایاندیرما گوندلیگینده] دئتال‌لار اولا بیلر.
+بیر خیدمتله اولا‌راق اگر داوام ائتسه‌نیز [$1 بو دییشیک‌لیگی هله گؤره بیلرسینیز].",
+'rev-deleted-diff-view' => "بو دییشیک‌لیگی‌نین رئویزیون‌لارین‌دان بیری 'سیلینمیش.
+بیر خیدمتله اولا‌راق بو دییشیک‌لیگی گؤره بیلرسینیز؛ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیلمه گوندلیگینده] دئتال‌لار اولا بیلر.",
+'rev-suppressed-diff-view' => "بو دییشیک‌لیگی‌نین رئویزیون‌لارین‌دان بیری 'باسدیریلمیش.
+بیر خیدمتله اولا‌راق بو دییشیک‌لیگی گؤره بیلرسینیز؛ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} دایاندیرما گوندلیگینده] دئتال‌لار اولا بیلر.",
+'rev-delundel' => 'گؤستر/گیزلت',
+'rev-showdeleted' => 'گؤستر',
+'revisiondelete' => 'نوسخه‌لری سیل/قایتار',
+'revdelete-nooldid-title' => 'هد٠نوسخه گئچرسیزدیر',
+'revdelete-nooldid-text' => 'بو Ùونکسیانی حیاتا کئچیرمک اوچون مویین هد٠دییشیک‌لیک Ùˆ یا دئغیشیکیلئرینیز یوخ. تقدیم ائدیلمیش اولان رئویزیون مؤوجود دئییل، Ùˆ یا مؤوجود رئویزیونو گیزلتمه‌یه چالیشیرسینیز.',
+'revdelete-nologtype-title' => 'هئچ بیر قئيد تیپی وئریلمه‌دی',
+'revdelete-nologtype-text' => 'بو عملیاتی دؤوره‌يه سوخماق اوچون بیر قئيد تیپی ایÙاده ائتمه‌دینیز.',
+'revdelete-nologid-title' => 'يانلیش ژورنال يازیسی',
+'revdelete-nologid-text' => 'بو ایتÙاق حیاتا کئچیرمک اوچون هئچ بیر قئید تیپی ایÙاده ائدیلمه‌دی Ùˆ یا گؤستریلن قئید تیپی مؤوجود دئییل.',
+'revdelete-no-file' => 'آختاریلان Ùايل مؤوجود دئيیل',
+'revdelete-show-file-confirm' => '"<nowiki>$1</nowiki>" Ùایلینین $2 $3 تاریخ‌لی سیلینمیش بیر رئداکته‌سینی گؤرمک ایستدیگینیزدن امینسیزینیزمی؟',
+'revdelete-show-file-submit' => 'بلی',
+'revdelete-selected' => "[[:$1]] صحیÙه‌سی‌نین {{PLURAL:$2|سئچیلمیش نوسخه لری|سئچیلمیش نوسخه لری }}:'",
+'logdelete-selected' => "'ژورنالین {{PLURAL:$1|سئچیلمیش قئیدی|سئچیلمیش قئیدلری}}:'",
+'revdelete-text' => "' 'سیلینئن رئویزیون‌لار Ùˆ حادثه‌لر هله صحیÙÙ‡ کئچمیشینده Ùˆ گونده‌لیک‌لرده گؤرونه‌جک، لاکین ترکیبین پارچا‌لاری عمومی اولا‌راق ائریشیلئمئیئجئکتیر.'
+{{SITENAME}} سایتین‌داکی دیگر ایداره‌چی‌لر گیزلی مزمونا چاتا بیلر Ùˆ علاوه محدودیت‌لر آیارلانمادییسا بو اینتئرÙئیس ایله گئری گتیره بیلر.",
+'revdelete-confirm' => 'خاهیش ائدیریک، بونو ائتمک ایستدیگینیزی، نتیجه‌لرینی آنلادیغینیزی، و بونو [[{{MediaWiki:Policy-url}}| پرینسیپ‌لره]] گؤره ائدیر اولدوغونوزو تسدیق ائدین.',
+'revdelete-suppress-text' => "ساخلاما 'یالنیز آشاغی‌داکی حال‌لار اوچون ایستیÙاده ائدیلمه‌لی‌دیر:
+* اویگون‌سوز Ùردی معلومات
+*:' ائو اونوان‌لاری Ùˆ تئلئÙون نؤمره‌لری، سوسیال تهلوکه‌سیزلیک نؤمره‌لری، Ùˆ س.'",
+'revdelete-legend' => 'گؤرونوش محدودیتلری قوی:',
+'revdelete-hide-text' => 'صحیÙه‌‌نین بو وئرسیياسی‌نین متنینی گیزله',
+'revdelete-hide-image' => 'Ùایلین ایچینده‌کیلرینی گیزلت',
+'revdelete-hide-name' => 'حرکتی و مقصدی گیزله‌مک',
+'revdelete-hide-comment' => 'ديَیشیکلیکلرین شرحینی گیزله',
+'revdelete-hide-user' => 'دَییشدیرن یازارین ایستیÙاده‌چی آدینی/آی‌پی اونوانینی گیزله',
+'revdelete-hide-restricted' => 'بیلگی‌لری ایدارچی‌لردن ده گیزله',
+'revdelete-radio-same' => '(ديَیشدیرمه)',
+'revdelete-radio-set' => 'بلی',
+'revdelete-radio-unset' => 'یوخ',
+'revdelete-suppress' => 'بیلگی‌لری ایداره‌چیلردن ده گیزله',
+'revdelete-unsuppress' => 'برپا اولونان وئرسیا‌لار اوزرین‌دن محدودیت‌لری قال‌دیر',
+'revdelete-log' => 'ندن:',
+'revdelete-submit' => 'سئچیلمیش {{PLURAL:$1|نوسخه|نوسخه لری}} تطبیق ائت',
+'revdelete-success' => "'نوسخه لرین گؤرونوشو یئنیلندی.'",
+'revdelete-failure' => "'نوسخه لرین گؤرونوشو دییش‌دیریله بیلمز:'$1",
+'logdelete-success' => "''' گونده‌لیک گؤرونوشو اوغورلا تاماملاندی.'''",
+'logdelete-failure' => "'''ژورنالین گؤرونوشو تنزیملنمه‌ییب:'''
+$1",
+'revdel-restore' => 'گؤرونوشو دییش',
+'revdel-restore-deleted' => 'سیلینمیش نوسخه‌لر',
+'revdel-restore-visible' => 'گؤرونن نوسخه‌لر',
+'pagehist' => 'صحیÙه‌‌نین گئچمیشی',
+'deletedhist' => 'سیلین‌میش گئچمیشی',
+'revdelete-hide-current' => 'تاریخ $2 و ساعات $1-ده‌کی آیتئمی گیزلدمک خطاسی: بو ایندیکی نوسخه‌دیر و گیزلدیلنمز.',
+'revdelete-show-no-access' => 'تاریخ $2 و ساعات $1-ده‌کی آیتئمی گؤسترمک خطاسی: بو آیتئم «محدودلاشدیریلیب» و سیز اونا ال تاپانماسینیز.',
+'revdelete-modify-no-access' => 'تاریخ $2 و ساعات $1-ده‌کی آیتئمی دَییشدیرمک خطاسی: بو آیتئم «محدودلاشدیریلیب» و سیز اونا ال تاپانماسینیز.',
+'revdelete-modify-missing' => '$1 نومره‌لی آیتئمی دَییشدیرمک خطاسی: بو آیتئم دیتابیس‌ده دئییل!',
+'revdelete-no-change' => "'''دیقت:''' تاریخ $2 و ساعات $1-ده‌کی آیتئم اوچون اؤنجه‌دن گؤرونوش تنظیملری ایستگی وئریلیب‌دیر.",
+'revdelete-concurrent-change' => 'تاریخ $2 و ساعات $1-ده‌کی آیتئمی گیزلدمک خطاسی: نظره گلیر سیز اونو دَییشدیرنده، باشقا بیر کس اونو دَییشیب‌دیر.
+لوطÙاً سیاهی‌لره باخین.',
+'revdelete-only-restricted' => 'تاریخ $2 و ساعات $1-ده‌کی آیتئمی گیزلدمک خطاسی: سیز باشقا گؤرونوش تنظیملرینین هئچ بیرینی سئچمه‌مک‌له، آیتئملری ایداره‌چیلردن گیزلده بیلنمزسینیز.',
+'revdelete-reason-dropdown' => '*عمومی سیلمک دلیل‌لری
+** کوپی حاقی نقضی
+** اویغون‌سوز باخیش یوخسا شخصی بیلگیلر
+** اویغون‌سوز ایستیÙاده‌چی آدی
+** ایÙتیرا احتیمالی اولان بیلگیلر',
+'revdelete-otherreason' => 'آیری/آرتیق دلیل:',
+'revdelete-reasonotherlist' => 'آیری دلیل‌لر',
+'revdelete-edit-reasonlist' => 'سیلمک دلیل‌لرینی دَییشدیر',
+'revdelete-offender' => 'نوسخه یازاری:',
+
+# Suppression log
+'suppressionlog' => 'سؤندورمک سیاهی‌سی',
+'suppressionlogtext' => 'آشاغی‌دا ایداره‌چیلردن گیزلنن سیلمکلر و باغلاماقلار شامیل اولان سیاهی گؤستریلیر.
+ایندیکی ایش‌ده اولان باغلاماقلارین سیاهی‌سینی گؤرمگه، [[Special:BlockList|باغلانانلار صحیÙه‌سی]]نه باش وورون.',
+
+# History merging
+'mergehistory' => 'صحیÙه‌لر بیرلشدیرمه گئچمیشی',
+'mergehistory-header' => 'بو صحیÙÙ‡ ایله، سیز بیر صحیÙه‌نین نوسخه‌لرینین گئچمیشینی، یئنی بیر صحیÙه‌نینکی ایله بیلشدیره بیلرسینیز.
+آرخایین اولون Ú©ÛŒ بو دَییشیکلیک تاریخی صحیÙه‌نین داوامینی ساخلایاجاق‌دیر.',
+'mergehistory-box' => 'ایکی صحیÙه‌نین نوسخه‌لرینی بیرلشدیرمک:',
+'mergehistory-from' => 'قایناق صحیÙÙ‡:',
+'mergehistory-into' => 'مقصد صحیÙÙ‡:',
+'mergehistory-list' => 'بیلشدیریله بیلن دَییشیکلیک گئچمیشی',
+'mergehistory-merge' => '[[:$1]]-ین آشاغیداکی نوسخهلری، [[:$2]]-ین‌له بیرلشه بیلرلر.
+یالنیز بلیرلنمیش زامان‌دا Ùˆ اوندان اؤنجه ائدیلمیش دَییشیکلیکلری بیرلشدیرمک اوچون، گیرده دویمه‌لردن ایستیÙاده ائدین.
+دیقت ائدین کی دولانما باغلانتیلارینی ایشلدمک، بو سوتونو یئنی‌له‌یه‌جکدیر.',
+'mergehistory-go' => 'بیرلشدیریله بیلن دَییشیکلیکلری گؤستر',
+'mergehistory-submit' => 'نوسخه‌لری بیرلشدیرمک',
+'mergehistory-empty' => 'نوسخه‌لرین هئچ بیری بیرلشدیریلنمزلر.',
+'mergehistory-success' => '[[:$1]]-ین {{PLURAL:$3|بیر|$3}} نوسخه‌سی باشاری‌لا [[:$2]]-له بیرلشدیریلدی.',
+'mergehistory-fail' => 'گئچمیش بیرلشدیریلنمه‌دی، لوطÙاً صحیÙÙ‡ Ùˆ زامان پارامئترلرینی یئنی‌دن یوخلایین.',
+'mergehistory-no-source' => '$1 قایناق صحیÙه‌سی یوخدور.',
+'mergehistory-no-destination' => '$1 مقصد صحیÙه‌سی یوخدور.',
+'mergehistory-invalid-source' => 'قایناق صحیÙه‌نین گرک دوزگون باشلیغی اولسون.',
+'mergehistory-invalid-destination' => 'مقصد صحیÙه‌نین گرک دوزگون باشلیغی اولسون.',
+'mergehistory-autocomment' => '[[:$1]]، [[:$2]] ایله بیرلشدیریلدی',
+'mergehistory-comment' => '[[:$1]]، [[:$2]] ایله بیرلشدیریلدی: $3',
+'mergehistory-same-destination' => 'قایناق Ùˆ مقصد صحیÙه‌لر، بیر اولانمازلار',
+'mergehistory-reason' => 'ندن',
+
+# Merge log
+'mergelog' => 'بیرلشدیرمه سیاهی‌سی',
+'pagemerge-logentry' => '[[$1]]، [[$2]] ایله بیرلشدیریلدی (نوسخه‌لر $3-ه قدر)',
+'revertmerge' => 'آيیر',
+'mergelogpagetext' => 'آشاغدی‌دا، ان سون صحیÙÙ‡ بیرلشدیریلمه‌لری گؤستریلیر.',
+
+# Diffs
+'history-title' => '«$1»-ین گئچمیشی',
+'difference-title' => '«$1» نوسخه‌لرینین آراسینداکی Ùرقلری',
+'difference-title-multipage' => '«$1» Ùˆ «$2» صحیÙه‌لرین آراسینداکی Ùرقلر',
+'difference-multipage' => '(صحیÙه‌لر آراسینداکی Ùرقلر)',
+'lineno' => 'خط $1:',
+'compareselectedversions' => 'سئچیلمیش نوسخه‌لری قارشیلاشدیر',
+'showhideselectedversions' => 'سئچیلمیش نوسخه‌لری گؤستر/گیزلد',
+'editundo' => 'قایتار',
+'diff-multi' => '({{PLURAL:$2|بیر|$2}} ایستیÙاده‌چی طرÙیندن ائدیلن {{PLURAL:$1|بیر|$1}} اورتا دَییشیکلیک گؤستریلمیر)',
+'diff-multi-manyusers' => '{{PLURAL:$2|بیر|$2}}-دن چوخ ایستیÙاده‌چی یارادان {{PLURAL:$1|بیر|$1}} نوسخه، گؤستریلمه‌ییب‌دیر',
+'difference-missing-revision' => 'بو Ùرقین ($1) {{PLURAL:$2|بیر|$2}} نوسخه‌سی تاپیلانمادی.
+
+عموماً بو خطا، سیلینن بیر صحیÙه‌یه واختی گئچمیش بیر Ùرق باغلانتی‌سیلا گلمک ایله آرا گلر.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}سیلمک سیاهی‌سی]ندا باشقا بیلگیلر اولا بیلر.',
+
+# Search results
+'searchresults' => 'آختاریش سونوجلاری',
+'searchresults-title' => '«$1» اوچون آختاریش نتیجه‌لری',
+'searchresulttext' => '{{SITENAME}} سایتینی آختارماق‌دا آرتیق بیلگیلر اوچون [[{{MediaWiki:Helppage}}|{{int:help}}]]-ه باخین.',
+'searchsubtitle' => "سیز '''[[:$1]]'''-ÛŒ آختاردینیز ([[Special:Prefixindex/$1| «$1» ایله باشلانان بوتون صحیÙه‌لر]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|«$1»-Ù‡ باغلانان بوتون صحیÙه‌لر]])",
+'searchsubtitleinvalid' => "'''$1'''-ی آختاردینیز",
+'toomanymatches' => 'چوخلو سونوچلار تاپیلدی، لوطÙاً باشقا بیر سورغویلا چالیشین.',
+'titlematches' => 'صحیÙه‌‌ آدی عینیدیر',
+'notitlematches' => 'عینی صحیÙÙ‡ باشلیغی تاپیلمادی',
+'textmatches' => 'یازی عینی‌دیر',
+'notextmatches' => 'هئچ بیر بنزر صحیÙÙ‡ یازی‌سی تاپیلمادی',
+'prevn' => 'اؤنجه‌کی {{PLURAL:$1|$1}}',
+'nextn' => 'سونراکی {{PLURAL:$1|$1}}',
+'prevn-title' => 'قاباقکی {{PLURAL:$1|بیر|$1}} نتیجه',
+'nextn-title' => 'سونراکی {{PLURAL:$1|بیر|$1}} سونوج',
+'shown-title' => 'هر صحیÙه‌ده {{PLURAL:$1|بیر|$1}} نتیجه گؤستر',
+'viewprevnext' => 'گؤستر ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-legend' => 'آختارماق تنظیملری',
+'searchmenu-exists' => "'''بو ویکی‌ده «[[:$1]]» آدلی صحیÙÙ‡ واردیر.'''",
+'searchmenu-new' => "'''بو ویکی‌ده «[[:$1]]» صحیÙه‌‌سینی يارات!'''",
+'searchhelp-url' => 'Help:ایچینده‌کیلر',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1| بو اؤن‌اک ایله اولان صحیÙه‌لری آختار]]',
+'searchprofile-articles' => 'مقاله‌لر',
+'searchprofile-project' => 'یاردیم Ùˆ پروژه صحیÙه‌لری',
+'searchprofile-images' => 'مولتی‌مئدیا',
+'searchprofile-everything' => 'هرشئی',
+'searchprofile-advanced' => 'گلیشمیش',
+'searchprofile-articles-tooltip' => '$1-ده آختار',
+'searchprofile-project-tooltip' => '$1-ده آختار',
+'searchprofile-images-tooltip' => 'Ùایل‌لار اوچون آختار',
+'searchprofile-everything-tooltip' => 'بوتون متنلری آختار (دانیشیق صحیÙه‌لری اولماقلا)',
+'searchprofile-advanced-tooltip' => 'تاپشیریلان آدÙضالاریندا آختار',
+'search-result-size' => '$1 ({{PLURAL:$2|۱ سؤزجوک|$2 سؤزجوک}})',
+'search-result-category-size' => '{{PLURAL:$1|بیر|$1}} عوضو ({{PLURAL:$2|بیر|$}} آلت‌بؤلمه، {{PLURAL:$3|بیر|$3}} Ùایل)',
+'search-result-score' => 'اویغونلوق: $1٪',
+'search-redirect' => 'یول‌لاندیرما $1',
+'search-section' => '(بؤلوم $1)',
+'search-suggest' => 'بونو نظرده توتوردونوزمو: $1',
+'search-interwiki-caption' => 'قارداش پروژه‌لر',
+'search-interwiki-default' => '$1 سونوج:',
+'search-interwiki-more' => '(داها)',
+'search-relatedarticle' => 'ایلگیلی',
+'mwsuggest-disable' => 'آختاریش اؤنرلرینی ایشدن سال',
+'searcheverything-enable' => 'بوتون آدÙضالاریندا آختار',
+'searchrelated' => 'ایلگیلی',
+'searchall' => 'بوتون',
+'showingresults' => "آشاغیدا نومره '''$2'''-دن باشلایان {{PLURAL:$1|'''بیر'''|'''$1'''}} سونوجا قدر گؤستریلیر.",
+'showingresultsnum' => "آشاغیدا نومره '''$2'''-دن باشلایان {{PLURAL:$3|'''بیر'''|'''$3'''}} سونوج گؤستریلیر.",
+'showingresultsheader' => "'''$4''' اوچون {{PLURAL:$5|'''$3'''-دن '''$1''' نتیجه|'''$3'''-دن '''$1-$2''' نتیجه}}",
+'nonefound' => "'''دیقت:''' یالنیز بعضی آدÙضالاری آختاریلیر. سورغونوزو ''all:'' اؤن‌اکی‌نی آرتیرماقلا بوتون یئرلرده (او جومله‌دن دانیشیق صحیÙه‌لری، شابلونلار Ùˆ سونرا) آختارین، یوخسا ایسته‌دیگینیز آدÙضاسینین آدینی اؤن‌اک کیمی آرتیرین Ùˆ یالنیز اوردا آختارین.",
+'search-nonefound' => 'سیزین سورونوزا اویغون نتیجه تاپیلمادی.',
+'powersearch' => 'گلیشمیش آختاریش',
+'powersearch-legend' => 'گلیشمیش آختاریش',
+'powersearch-ns' => 'آدÙضالاریندا آختار',
+'powersearch-redir' => 'یوللاندیرمالاری لیست ائت',
+'powersearch-field' => 'آختار:',
+'powersearch-togglelabel' => 'یوخلا:',
+'powersearch-toggleall' => 'بوتون',
+'powersearch-togglenone' => 'هئچ بیری',
+'search-external' => 'ائشیک آختاریش',
+'searchdisabled' => '{{SITENAME}} آختاریشی باغلانیب‌دیر.
+ایندی گوگل ایله آختارا بیلرسینیز.
+دیقت ائدین کی اونون {{SITENAME}} ایندئکسی، کؤهنه اولا بیلر.',
+
+# Quickbar
+'qbsettings' => 'سورعت پانئلی',
+'qbsettings-none' => 'هئچ بیری',
+'qbsettings-fixedleft' => 'سولا ثابیت',
+'qbsettings-fixedright' => 'ساغا ثابیت',
+'qbsettings-floatingleft' => 'سولا اوزن',
+'qbsettings-floatingright' => 'ساغا اوزن',
+'qbsettings-directionality' => 'ثابیت، سیزین دیل یازینیزین یولویلا',
+
+# Preferences page
+'preferences' => 'ترجیحلر',
+'mypreferences' => 'ترجیحلر',
+'prefs-edits' => 'دَییشمه‌لرین سایی:',
+'prefsnologin' => 'گیرمه‌میسینیز',
+'prefsnologintext' => 'ایستیÙاده‌چی تنظیملرینی دَییشمک اوچون، <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} گیرمه‌لیسینیز]</span>.',
+'changepassword' => 'رمزی دَییشدیر',
+'prefs-skin' => 'قابیق',
+'skin-preview' => 'اؤن‌گؤستریش',
+'datedefault' => 'سئچیم‌سیز',
+'prefs-beta' => 'بئتا اؤزل‌لیکلر',
+'prefs-datetime' => 'تاریخ و واخت',
+'prefs-labs' => 'آزماییشی اؤزل‌لیکلر',
+'prefs-user-pages' => 'ایستیÙاده‌چی صحیÙه‌لری',
+'prefs-personal' => 'ایستیÙاده‌چی پروÙایلی',
+'prefs-rc' => 'سون دَییشیکلیکلر',
+'prefs-watchlist' => 'ایزله‌دیکلر',
+'prefs-watchlist-days' => 'ایزله‌دیکلرده گؤستریلن گونلر',
+'prefs-watchlist-days-max' => 'چوخو {{PLURAL:$1|بیر|$1}} گون',
+'prefs-watchlist-edits' => 'گنیشلنمیش ایزله‌مه‌لرده گؤستریلن دَییشیکلیکلرین چوخو:',
+'prefs-watchlist-edits-max' => 'چوخ سایی: ۱۰۰۰',
+'prefs-watchlist-token' => 'ایزله‌دیکلر نیشانی:',
+'prefs-misc' => 'باشقا',
+'prefs-resetpass' => 'رمزی دَییشدیر',
+'prefs-changeemail' => 'ایمیل آدرسینی دَییشدیر',
+'prefs-setemail' => 'بیر ایمیل آدرسی وئر',
+'prefs-email' => 'ایمیل ترجیحلری',
+'prefs-rendering' => 'گؤرونوش',
+'saveprefs' => 'قئید ائت',
+'resetprefs' => 'قئید ائدیلمه‌میش ترجیحلری صیÙیرله',
+'restoreprefs' => 'بوتون ایلک ترجیحلری قایتار',
+'prefs-editing' => 'دَییشدیرمک‌ده',
+'prefs-edit-boxsize' => 'دَییشدیرمه پنجره‌سینین اؤلچو',
+'rows' => 'سطرلر:',
+'columns' => 'سوتونلار',
+'searchresultshead' => 'آختار',
+'resultsperpage' => 'صحیÙه‌‌يه عاید تاپیلمیش نتیجه‌لر:',
+'stub-threshold' => '<a href="#" class="stub">کئچیدسیز لینکی</a> Ùورمات ائتمک اوچون حدود (بایت‌لارلا):',
+'stub-threshold-disabled' => 'چالیشمایان',
+'recentchangesdays' => 'سون دییشیک‌لرده گؤستریلن گون‌لرین میقداری:',
+'recentchangesdays-max' => 'ماکسیموم $1 {{PLURAL:$1|گون |گون}}',
+'recentchangescount' => 'سون ديَیشیکلیکلرده باشلیق سايی:',
+'prefs-help-recentchangescount' => 'بورایا یئنی دییشیک‌لیک‌لر، صحیÙه‌لرین Ùˆ ژورنال‌لارین تاریخچه‌سی داخیل‌دیر.',
+'prefs-help-watchlist-token' => 'بو ساحنی گیزلی پاروللا دولدورماغینیز سیزین ایزلمه سیاهینیز اوچون آراس‌اس یاییم کانا‌لی یارادا‌جاق‌دیر.
+بو پارولو بیلن هر کس ایزلمه سیاهینیزی اوخویا بیلر، بو سبب‌دن اعتبارلی پارول سئچین.
+تصادÙÛŒ یوللا سئچیلمیش بو پارول‌دان ایستیÙاده ائده بیلرسینیز: $1',
+'savedprefs' => 'سئچیمینیز قئيد ائدیلدی.',
+'timezonelegend' => 'چاغ بؤلگه‌سی:',
+'localtime' => 'یئرلی چاغ:',
+'timezoneuseserverdefault' => 'ویکی اؤن‌Ùرضینی ایشلد ($1)',
+'timezoneuseoffset' => 'باشقا (چاغ Ùرقینی بیلدیر)',
+'timezoneoffset' => 'واقت Ùرقی¹:',
+'servertime' => 'خیدمتچی چاغی:',
+'guesstimezone' => 'براوزÙردن دولدور',
+'timezoneregion-africa' => 'Ø¢Ùریقا',
+'timezoneregion-america' => 'آمریکا',
+'timezoneregion-antarctica' => 'گونئی قطب',
+'timezoneregion-arctic' => 'قوزئی قطب',
+'timezoneregion-asia' => 'آسیا',
+'timezoneregion-atlantic' => 'اطلس اوقیانوسو',
+'timezoneregion-australia' => 'اوسترالیا',
+'timezoneregion-europe' => 'اوروپا',
+'timezoneregion-indian' => 'هیند اوقیانوسو',
+'timezoneregion-pacific' => 'بؤیوک اوقیانوس',
+'allowemail' => 'باشقا ایستیÙاده‌چیلردن ایمیل آلماغی Ø¢Ú†',
+'prefs-searchoptions' => 'آختار',
+'prefs-namespaces' => 'آدلار Ùضاسی:',
+'defaultns' => 'یوخسا بو آدÙضالاریندا آختار:',
+'default' => 'Ùرض ائدیلن',
+'prefs-files' => 'Ùایل‌لار',
+'prefs-custom-css' => 'شخصی سی‌اس‌اس',
+'prefs-custom-js' => 'شخصی جاوااسکریپت',
+'prefs-common-css-js' => 'بوتون قابیقلار اوچون پایلاشمیش سی‌اس‌اس/جاوااسکریپت:',
+'prefs-reset-intro' => 'ترجیحلرینیزی سایتین ایلک Ùرض ائدیلنلرینه دؤندرمک اوچون، بو صحیÙه‌دن ایستیÙاده ائده بیلرسینیز.
+بو ایش قایتاریلا بیلمز.',
+'prefs-emailconfirm-label' => 'ایمیل دوغرولاماسی:',
+'prefs-textboxsize' => 'دَییشدیرمه قوتوسونون اؤلچو',
+'youremail' => 'ایمیل:',
+'username' => '{{GENDER:$1|ایستیÙاده‌چی آدی}}:',
+'uid' => '{{GENDER:$1|ایستیÙاده‌چی}} ID:',
+'prefs-memberingroups' => '{{PLURAL:$1|بیر|$1}} قروپ {{GENDER:$2|عوضو}}و:',
+'prefs-registration' => 'یازیلماق واختی:',
+'yourrealname' => 'دوغرو آد:',
+'yourlanguage' => 'دیل:',
+'yourvariant' => 'دیل واریانتی:',
+'prefs-help-variant' => 'بو ویکی‌نین ایچینده‌کیلری‌نین گؤستریلدیگی اوچون سئچدیگینیز واریانت یوخسا اورتوقراÙÛŒ.',
+'yournick' => 'یئنی ایمضا:',
+'prefs-help-signature' => 'دانیشیق صحیÙه‌لرینده یاخیشلار گرک «<nowiki>~~~~</nowiki>» ایله ایمضالانالار. بو نیشان اوتوماتیک‌جه سیزین آدینیز Ùˆ تاریخه دؤنه‌جک‌دیر.',
+'badsig' => 'یانلیش خام ایمضا.
+اچ‌تی‌ام‌ال تگ‌لرینی یوخلایین.',
+'badsiglength' => 'ایمضانیز چوخ اوزون‌دور.
+او گرک {{PLURAL:$1|بیر|$1}} حرÙ‌دن اوزون اولمایا.',
+'yourgender' => 'جینس:',
+'gender-unknown' => 'بیلیندیرمه‌میش',
+'gender-male' => 'آقا',
+'gender-female' => 'خانیم',
+'prefs-help-gender' => 'ایستگه یاغلی: یازیلیم‌لا، دوزگون جنسیته ایلگی‌لی آدرس وئرمک اوچون ایشنیر.
+بو بیلگی، عمومی اولاجاق‌دیر.',
+'email' => 'ایمیل',
+'prefs-help-realname' => 'اصلی آد ایستگه باغلی‌دیر.
+اگر اونو وئرماغی سئچسز، سیزین ایشلرینیزی سیزه مونتسب ائدن‌ده، بو اصلی آد ایشلنه‌جک‌دیر.',
+'prefs-help-email' => 'ایمیل آدرسی ایستگه باغلی‌دیر، آنجاق رمزینیزی اونوتدوغونوز واخت، سیزه يئنی رمز گؤندرمگه گرکلی‌دیر.',
+'prefs-help-email-others' => 'سیز هم‌ده آیری ایستیÙاده‌چیلره ایجازه وئره بیلرسیز، سیزین ایستیÙاده‌چی یا دانیشیق صحیÙه‌نیزده بیر باغلانتی ایله، سیزله ایلگی قورسونلار.
+آیری ایستیÙاده‌چیلر سیزینله ایلگی قوراندا، سیزین ایمیل آدرسیز گؤستریلمه‌یه‌جک‌دیر.',
+'prefs-help-email-required' => 'ایمیل آدرس گرکلی‌دیر.',
+'prefs-info' => 'اساس بیلگیلر',
+'prefs-i18n' => 'اولوسلارآراسی‌لاشدیرما',
+'prefs-signature' => 'ایمضا',
+'prefs-dateformat' => 'تاریخ Ùورمتی',
+'prefs-timeoffset' => 'ساعات قورشاغینین Ùرقی',
+'prefs-advancedediting' => 'گلیشمیش سئچَنکلر',
+'prefs-advancedrc' => 'گلیشمیش سئچَنکلر',
+'prefs-advancedrendering' => 'گلیشمیش سئچَنکلر',
+'prefs-advancedsearchoptions' => 'گلیشمیش سئچَنکلر',
+'prefs-advancedwatchlist' => 'گلیشمیش سئچَنکلر',
+'prefs-displayrc' => 'گؤرونتو سئچَنکلری',
+'prefs-displaysearchoptions' => 'گؤرونتو سئچَنکلری',
+'prefs-displaywatchlist' => 'گؤرونتو سئچَنکلری',
+'prefs-diffs' => 'Ùرقلر',
+
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'ایمیل آدرسی، گئچرلی نظره گلیر',
+'email-address-validity-invalid' => 'گئچرلی بیر ایمیل آدرسی وئرین',
+
+# User rights
+'userrights' => 'ایستیÙاده‌چی حاقلاری ایداره‌سی',
+'userrights-lookup-user' => 'ایستیÙاده‌چی گروپلاری ایداره‌سی',
+'userrights-user-editname' => 'ایستیÙاده‌چی آدی‌نیزی یازین',
+'editusergroup' => 'ایستیÙاده‌چی قروپونو دَییشدیر',
+'editinguser' => "ایستیÙاده‌چی '[[User:$1|$1]]' $2 اوچون ایستیÙاده‌چی حقوق‌لاری دییشدیریلیر",
+'userrights-editusergroup' => 'ایستیÙاده‌چی قروپونو دَییشدیر',
+'saveusergroups' => 'ایستیÙاده‌چی قروپونو قئيد ائت',
+'userrights-groupsmember' => 'داخیل اولدوغو قروپلار:',
+'userrights-groupsmember-auto' => 'گومان ائدیلن عضو:',
+'userrights-groups-help' => 'بو ایستیÙاده‌چی‌نین ایچینده اولدوغو قروپ‌لاری دییش‌دیره بیلرسینیز:
+* سئچیلمیش بیر قوتو، ایستیÙاده‌چی‌نین او قروپا داخیل اولدوغو معناسینی وئرر
+* سئچیلمه‌ییب بیر قوتو، ایستیÙاده‌چی‌نین او قروپدا اولمادیغی معناسینی وئرر.
+**ØŒ قروپو بیر دÙعه میدانا گتیردیک‌دن سونرا سیلئمئجئغینیزی بیلدیریر، یا دا قارشی‌لیق‌لی اولا‌راق.',
+'userrights-reason' => 'ندن:',
+'userrights-no-interwiki' => 'سیزه باشقا ویکی لايیهه‌لرده‌کی ایستیÙاده‌چیلرین ائستاتوسونو ديَیشمه‌يه ایزین وئریلمه‌يیب',
+'userrights-nodatabase' => '$1 وئریلنلر بازاسی يا مؤوجود دئيیل، يا دا لوکال دئيیل.',
+'userrights-nologin' => 'سیز ایستیÙاده‌چی‌لرین حقوق‌لارینی دییشمک اوچون سیستئمه ایداره‌چی اولا‌راق [[Special:UserLogin|daxil olmalısınız]].',
+'userrights-notallowed' => 'سیزین ایستیÙاده‌چی حسابینیزا دیگر ایستیÙاده‌چی‌لره حقوق‌لار وئرمک Ùˆ یا آلماغا ایجازه وئریلمه‌ییب.',
+'userrights-changeable-col' => 'ديَیشدیره بیلدیگینیز قروپلار',
+'userrights-unchangeable-col' => 'ديَیشدیره بیلمه‌دیگینیز قروپلار',
+
+# Groups
+'group' => 'قروپ:',
+'group-user' => 'ایستÙاده‌چیلر',
+'group-autoconfirmed' => 'اوتوماتیک دوغرولانمیش ایستیÙاده‌چیلر',
+'group-bot' => 'بوتلار',
+'group-sysop' => 'ایداره‌چیلر',
+'group-bureaucrat' => 'بوروکراتلار',
+'group-suppress' => 'باخانلار',
+'group-all' => '(بوتون)',
+
+'group-user-member' => '{{GENDER:$1|ایستیÙاده‌چی}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|دوغرولانمیش ایستیÙاده‌چی}}',
+'group-bot-member' => '{{GENDER:$1|بوت}}',
+'group-sysop-member' => '{{GENDER:$1|ایداره‌چی}}',
+'group-bureaucrat-member' => '{{GENDER:$1|بوروکرات}}',
+'group-suppress-member' => '{{GENDER:$1|نظارت}}',
+
+'grouppage-user' => '{{ns:project}}:ایستیÙاده‌چیلر',
+'grouppage-autoconfirmed' => '{{ns:project}}:دوغرولانمیش ایستیÙاده‌چیلر',
+'grouppage-bot' => '{{ns:project}}:بوتلار',
+'grouppage-sysop' => '{{ns:project}}:ایداره‌چیلر',
+'grouppage-bureaucrat' => '{{ns:project}}:بوروکراتلار',
+'grouppage-suppress' => '{{ns:project}}:نظارت',
+
+# Rights
+'right-read' => 'صحیÙه‌لری اوخو',
+'right-edit' => 'صحیÙه‌لری دَییشدیر',
+'right-createpage' => 'صحیÙه‌لری یاراد (دانیشیق صحیÙه‌لر نظرده توتولمور)',
+'right-createtalk' => 'دانیشیق صحیÙه‌لری یاراد',
+'right-createaccount' => 'یئنی ایستیÙاده‌چی حسابلاری یاراد',
+'right-minoredit' => 'دَییشیکلیکلری، کیچیک اولاراق نیشانلا',
+'right-move' => 'صحیÙه‌لرین آدینی دَییشدیر',
+'right-move-subpages' => 'صحیÙه‌لرین آدلارینی، آلت‌صحیÙه‌لری ایله بیرلیکده، دَییشدیر',
+'right-move-rootuserpages' => 'ایستیÙاده‌چی کؤک صحیÙه‌لرینین آدلارینی دَییشدیر',
+'right-movefile' => 'Ùایل‌لارین آدلارینی دَییشدیر',
+'right-suppressredirect' => 'صحیÙه‌لرین آدینی دَییشدیرنده، قایناق صحیÙه‌لردن یوللاندیرما یارادما',
+'right-upload' => 'Ùایل یوکله‌یین',
+'right-reupload' => 'اؤنجه‌دن اولان Ùایل‌لارین اوستونه یاز',
+'right-reupload-own' => 'همن ایستیÙاده‌چی ایله یوکلنن Ùایل‌لارین اوستونه یاز',
+'right-reupload-shared' => 'عمومی آنبارها اولان Ùایل‌لاری، محلی اولاراق ابطال ائت',
+'right-upload_by_url' => 'Ùایل‌لاری بیر اینترنت آدرسیندن یوکله',
+'right-purge' => 'بیر صحیÙه‌نین کَشینی، دوغرولانمامیش سیل',
+'right-autoconfirmed' => 'یاریم‌قورونموش صحیÙه‌لری دَییشدیر',
+'right-bot' => 'بیر اوتوماتیک پروسئس کیمی حساب اولون',
+'right-nominornewtalk' => 'دانیشیق صحیÙه‌لرده کیچیک دَییشیکلیک، یئنی مئساژ یارادماسین',
+'right-apihighlimits' => 'API سورغولاریندا، یوخاری محدودیتلر ایشلد',
+'right-writeapi' => 'یازان API ایشلد',
+'right-delete' => 'صحیÙه‌لری سیل',
+'right-bigdelete' => 'یئکه گئچمیشلری اولان صحیÙه‌لری سیل',
+'right-deletelogentry' => 'بعضی خاص سیاهی آیتئملرینی سیل و سیلماغی قایتار',
+'right-deleterevision' => 'بعضی خاص صحیÙÙ‡ نوسخه‌لرینی سیل Ùˆ سیلماغی قایتار',
+'right-deletedhistory' => 'سیلینمیش گئچمیش آیتئملرینی، یازیلارینی گؤسترمه‌مکله، گؤستر',
+'right-deletedtext' => 'سیلینمیش یازی Ùˆ سیلینمیش نوسخه‌لر آراسینداکی Ùرقلره باخ',
+'right-browsearchive' => 'سیلینمیش صحیÙه‌لری آختار',
+'right-undelete' => 'بیر صحیÙه‌نین سیلینمگینی قایتار',
+'right-suppressrevision' => 'ایداره‌چیلردن گیزلی اولان نوسخه‌لره باخ و قایتار',
+'right-suppressionlog' => 'خصوصی سیاهی‌لره باخ',
+'right-block' => 'باشقا ایستیÙاده‌چیلرله دَییشدیرمگی باغلا',
+'right-blockemail' => 'بیر ایستیÙاده‌چینین ایمیل گؤندرمگینی باغلا',
+'right-hideuser' => 'بیر ایستیÙاده‌چی آدینی باغلا Ùˆ اونو عموم‌دان گیزلد',
+'right-ipblock-exempt' => 'آی‌پی باغلاماقلاری، اوتوماتیک باغلاماقلاری و سیرا باغلاماقلاریندان گئچ',
+'right-proxyunbannable' => 'پروکسیلرین اوتوماتیک باغلاماقلاریندان گئچ',
+'right-unblockself' => 'اؤزلرینی آچسینلار',
+'right-protect' => 'قوروماق سطحینی Ùˆ قورونموش صحیÙه‌لری دَییشدیر',
+'right-editprotected' => 'قورونموش صحیÙه‌لری (قورونماقلاری مونتشیر اولمایان) دَییشدیر',
+'right-editinterface' => 'ایستیÙاده‌چی آرا-اوزونو دَییشدیر',
+'right-editusercssjs' => 'باشقا ایستیÙاده‌چیلرین سی‌اس‌اس Ùˆ جاوااسکریپت Ùایل‌لارینی دَییشدیر',
+'right-editusercss' => 'باشقا ایستÙاده‌چیلرین سی‌اس‌اس Ùایل‌لارینی دَییشدیر',
+'right-edituserjs' => 'باشقا ایستیÙاده‌چیلرین جاوااسکریپت Ùایل‌لارینی دَییشدیر',
+'right-rollback' => 'بیر خاص صحیÙه‌نی سون دÙعه دَییشدیرن ایستیÙاده‌چینین دَییشیکلیکلرینی تئزلیکله قایتار',
+'right-markbotedits' => 'قایتاریلان دَییشیکلیکلری، بوت دَییشیکلیگی اولاراق نیشانلا',
+'right-noratelimit' => 'سورعت محدودیتلریندن گئچ',
+'right-import' => 'باشقا ویکیلردن صحیÙÙ‡ گیردیر',
+'right-importupload' => 'بیر Ùایل یوکلمه‌سیندن صحیÙÙ‡ گیردیر',
+'right-patrol' => 'باشقالارین دَییشیکلیکلرینه نظارت ائت',
+'right-autopatrol' => 'بیر کسین اؤز دَییشیکلیکلرینی، نظارتلنمیش اولاراق نیشانلا',
+'right-patrolmarks' => 'سون نظارتلنمیش دَییشیکلیکلره باخ',
+'right-unwatchedpages' => 'نظارتلنمه‌میش صحیÙه‌لرین لیستینه باخ',
+'right-mergehistory' => 'صحیÙه‌لرین گئچمیشلرینی بیرلشدیر',
+'right-userrights' => 'بوتون ایستیÙاده‌چی حاقلارینی دَییشدیر',
+'right-userrights-interwiki' => 'باشقا ویکیلرده‌کی ایستیÙاده‌چیلرین ایستیÙاده‌چی حاقلارینی دَییشدیر',
+'right-siteadmin' => 'دیتابیسی Ù‚ÛŒÙیل‌لا Ùˆ Ù‚ÛŒÙیلینی Ø¢Ú†',
+'right-override-export-depth' => 'ایچری باغلانتیلاری اولان صحیÙه‌لری، چوخو Ûµ درجه درینلیگی ایله، ایخراج ائت',
+'right-sendemail' => 'باشقا ایستیÙاده‌چیلره ایمیل گؤندر',
+'right-passwordreset' => 'رمز یئنی‌له‌مه ایمیل‌لرینه باخ',
+
+# Special:Log/newusers
+'newuserlogpage' => 'ایستیÙاده‌چی یارادیلما قئیدی',
+'newuserlogpagetext' => 'بو ایستیÙاده‌چی یارادماق سیاهیسیدیر.',
+
+# User rights log
+'rightslog' => 'ایستیÙاده‌چی حاقلاری سیاهی‌سی',
+'rightslogtext' => 'بو، ایستیÙاده‌چی حاقلارینا اولان دَییشیکلیکلر سیاهی‌سی‌دیر.',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-read' => 'بو صحیÙه‌نی اوخو',
+'action-edit' => 'بو صحیÙه‌نی دَییشدیر',
+'action-createpage' => 'صحیÙÙ‡ یارات',
+'action-createtalk' => 'دانیشیق صحیÙه‌سی یاراد',
+'action-createaccount' => 'بو ایستیÙاده‌چی حسابینی یاراد',
+'action-minoredit' => 'بو دَییشیکلیگی، کیچیک اولاراق نیشانلا',
+'action-move' => 'بو صحیÙه‌‌نین آدینی ديَیشدیر',
+'action-move-subpages' => 'بو صحیÙه‌نین آدینی، آلت‌صحیÙه‌لری ایله بیرلیکده دَییشدیر',
+'action-move-rootuserpages' => 'ایستیÙاده‌چی کؤک صحیÙه‌لرینین آدلارینی دَییشدیر',
+'action-movefile' => 'بو Ùایلین آدینی دَییشدیر',
+'action-upload' => 'بو Ùایلی یوکله',
+'action-reupload' => 'بو اؤنجه‌دن اولان Ùایلین اوستونه یاز',
+'action-reupload-shared' => 'بو Ùایلی بیر عمومی آنبارها ایبطال ائت',
+'action-upload_by_url' => 'بو Ùایلی بیر اینترنت آدرسیندن یوکله',
+'action-writeapi' => 'یازان API ایشلد',
+'action-delete' => 'بو صحیÙه‌‌نی سیل',
+'action-deleterevision' => 'بو نوسخه‌نی سیل',
+'action-deletedhistory' => 'بو صحیÙه‌نین سیلینمیش گئچمیشینه باخ',
+'action-browsearchive' => 'سیلینمیش صحیÙه‌لری آختار',
+'action-undelete' => 'بو صحیÙه‌نین سیلمگینی قایتار',
+'action-suppressrevision' => 'بو گیزلی نوسخه‌یه یئنی‌دن باخ و اونو قایتار',
+'action-suppressionlog' => 'بو خصوصی سیاهی‌یا باخ',
+'action-block' => 'بو ایستیÙاده‌چی‌نین دَییشدیرمه‌سینین قاباغینی آل',
+'action-protect' => 'بو صحیÙÙ‡ اوچون قورونماق سطحلرینی دَییشدیر',
+'action-rollback' => 'بیر خاص صحیÙه‌نی سون دÙعه دَییشدیرن ایستیÙاده‌چینین دَییشیکلیکلرینی تئزلیکله قایتار',
+'action-import' => 'بو صحیÙه‌نی باشقا بیر ویکی‌دن گیردیر',
+'action-importupload' => 'بو صحیÙه‌نی بیر Ùایل یوکلمه‌سیندن گیردیر',
+'action-patrol' => 'باشقالارین دَییشیکلیکلرینی، نظارتلنمیش اولاراق نیشانلا',
+'action-autopatrol' => 'اؤز دَییشیکلیکلرینیزی نظارتلنمیش اولاراق نیشانلا',
+'action-unwatchedpages' => 'نظارتلنمه‌میش صحیÙه‌لرین لیستینه باخ',
+'action-mergehistory' => 'بو صحیÙه‌نین گئچمیشینی بیرلشدیر',
+'action-userrights' => 'بوتون ایستیÙاده‌چی حاقلارینی دَییشدیر',
+'action-userrights-interwiki' => 'باشقا ویکیلرده‌کی ایستیÙاده‌چیلرین ایستیÙاده‌چی حاقلارینی دَییشدیر',
+'action-siteadmin' => 'دیتابیسی Ù‚ÛŒÙیل‌لا یا Ù‚ÛŒÙیلینی Ø¢Ú†',
+'action-sendemail' => 'ایمیل گؤندر',
+
+# Recent changes
+'nchanges' => '$1 {{PLURAL:$1|دَییشیکلیک}}',
+'recentchanges' => 'سون دَییشیکلیکلر',
+'recentchanges-legend' => 'سون دَییشیکلیکلر سئچمه‌لری',
+'recentchanges-summary' => 'بو صحیÙه‌ده، بو ویکی‌ده وئریلن ان سون دَییشیکلیکلری ایزله‌یین.',
+'recentchanges-feed-description' => 'ویکی‌ده‌کی ان سون ديَیشیکلیک‌لری بو يايیم کانالیندان ایزله‌يین.',
+'recentchanges-label-newpage' => 'بو دییشیک یئنی بیر صحیÙÙ‡ یاراتدی',
+'recentchanges-label-minor' => 'بو بیر کیچیک دَییشدیرمه‌دیر',
+'recentchanges-label-bot' => 'بو دییشیک بیر بوت طرÙیندن ائدیلیب‌دیر',
+'recentchanges-label-unpatrolled' => 'بو دییشیکلیک هله گؤزدن گئچیریلمه‌ییب‌دیر',
+'rcnote' => "آشاغیدا {{PLURAL:$1|'''بیر'''|'''$1'''}} ديَیشیکلیک، سون {{PLURA?:$2|بیر|$2}} گون‌ده، ساعت $5، $4 تاریخینه قدر گلیب‌دیر.",
+'rcnotefrom' => "آشاغیدا '''$2'''-دن ('''$1'''-ه قدر) ديَیشیکلیکلر گلیبلر.",
+'rclistfrom' => '$1 واختیندان باشلایاراق یئنی دییشیکلری گؤستر',
+'rcshowhideminor' => 'کیچیک دَییشیکلری $1',
+'rcshowhidebots' => 'بوتلاری $1',
+'rcshowhideliu' => 'ایچری گیرمیش ایستیÙاده‌چیلری $1',
+'rcshowhideanons' => 'تانینمامیش ایستیÙاده‌چیلری $1',
+'rcshowhidepatr' => 'نظارت ائدیلن دَییشیکلیکلری $1',
+'rcshowhidemine' => 'منیم دَییشیکلریمی $1',
+'rclinks' => 'سون $2 گون عرضینده‌کی سون $1 ديَیشیکلیگی گؤستر <br />$3',
+'diff' => 'Ùرق',
+'hist' => 'گئچمیش',
+'hide' => 'گیزلت',
+'show' => 'گؤستر',
+'minoreditletter' => 'Ú©',
+'newpageletter' => 'ی',
+'boteditletter' => 'ب',
+'number_of_watching_users_pageview' => '[{{PLURAL:$1|بیر|$1}} ایزله‌ین ایستیÙاده‌چی]',
+'rc_categories' => 'بؤلمه‌لره محدودلاشدیر («|» ایله آییر)',
+'rc_categories_any' => 'هر',
+'rc-change-size-new' => 'دَییشیکلیک‌دن سونرا {{PLURAL:|بیر|$1}} بایت',
+'newsectionsummary' => '/* $1 */ یئنی بؤلمه',
+'rc-enhanced-expand' => 'تÙصیلاتی گؤستر (جاوااسکریپت لازیم‌دیر)',
+'rc-enhanced-hide' => 'تÙصیل‌لری گیزلت',
+'rc-old-title' => 'ایلک‌جه «$1» آدی‌له یارانمیشدیر',
+
+# Recent changes linked
+'recentchangeslinked' => 'ایلگیلی دَییشیکلیکلر',
+'recentchangeslinked-feed' => 'ایلگیلی دَییشیکلیکلر',
+'recentchangeslinked-toolbox' => 'ایلگیلی دَییشیکلیکلر',
+'recentchangeslinked-title' => "''$1'' ایله ایلگی‌لی دییشیکلر",
+'recentchangeslinked-noresult' => 'قئيد اوْلونان دؤورده ایلگیلی صحیÙه‌‌لرده هئچ بیر ديَیشیکلیک يوْخدور.',
+'recentchangeslinked-summary' => "آشاغیداکی سیياهی، قئيد اوْلونان صحیÙه‌‌يه (Ùˆ يا قئيد اوْلونان کاتئقوْرياداکی صحیÙه‌‌لره) داخیلی کئچید وئرن صحیÙه‌‌لرده ائدیلمیش سوْن ديَیشیکلیکلرین سیياهیسیدیر.
+[[Special:Watchlist|ایزله‌مه سیياهینیزداکی]] صحیÙه‌‌لر '''قالین''' شریÙتله گؤستریلمیشدیر.",
+'recentchangeslinked-page' => 'صحیÙÙ‡ آدی:',
+'recentchangeslinked-to' => 'قئيد اوْلونان صحیÙه‌‌ده‌کی دئيیل، اوْنا داخیلی کئچید وئرن صحیÙه‌‌لرده‌کی ديَیشیکلیکلری گؤستر',
+
+# Upload
+'upload' => 'Ùایل یوکله‌',
+'uploadbtn' => 'Ùایل یوکله‌یین',
+'reuploaddesc' => 'يوکلئمئ Ùورمونا گئری دؤن.',
+'upload-tryagain' => 'ديَشدیریلمیش Ùايل ایضاهینی گؤندر',
+'uploadnologin' => 'گیریش ائتمه‌میسینیز',
+'uploadnologintext' => 'Ùايل يوکله‌مک اوچون [[Special:UserLogin|گیریش ائتمه‌میسینیز]].',
+'upload_directory_missing' => '($1) یوکلمه قایداسی آختاریلیر و وئبسئروئرده یارادیلماسی قئیری-مومکون‌دور.',
+'upload_directory_read_only' => '"$1" کاتالوقونون آرشیوی وئب-سئروئر یازی‌لاری اوچون باغلی‌دیر.',
+'uploaderror' => 'یوکلمه خطاسی',
+'upload-recreate-warning' => "'دیققت: بو آددا Ùایل سیلینیب، یاخود آدی دییشدیریلیب.'
+
+بو صحیÙه‌نین سیلینمه Ùˆ آددییشمه ژورنا‌لی آشاغیدا گؤستریلمیش‌دیر:",
+'uploadtext' => "Ùایل یوکلمک اوچون آشاغی‌داکی Ùورما‌دان ایستیÙاده ائدین.
+اول‌لر یوکلنمیش Ùایل‌لارا باخماق اوچون [[Special:FileList|یوکلنمیش Ùایل‌لار سیاهی‌سینا]] کئچین، هم‌چی‌نین (تکرار) یوکلنمیش Ùایل‌لارا [[Special:Log/upload|یوکلمه ژورنالیندا]]ØŒ سیلینمیش Ùایل‌لارا [[Special:Log/delete|سیلینمه ژورنالیندا]] باخا بیلرسینیز.
+
+مقاله‌یه Ùایل یئرلش‌دیرمک اوچون آشاغیداکی Ùورما‌لاردان بیرینی ایستیÙاده ائدین:
+* Ùایلین تام نوسخه لری یئرلش‌دیرمک اوچون: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''';
+* Ùایلین 200 پیکسئلدک کیچیلدیلمیش وئرسیاسینی متن‌دن سولدا، آلتیندا ایزاهلا یئرلش‌دیرمک اوچون: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|tÉ™svir]]</nowiki></code>''';
+* صحیÙه‌ده Ùایلین اؤزونو گؤسترمه‌دن اونا بیرباشا کئچید یئرلش‌دیرمک اوچون: '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''.",
+'upload-permitted' => 'ایجازه وئریلن Ùايل تیپلری: $1.',
+'upload-preferred' => 'ایجازه وئریلن Ùايل تیپلری: $1.',
+'upload-prohibited' => 'ایجازه وئریلمه‌ين Ùايل تیپلری: $1.',
+'uploadlog' => 'يوکله‌مه قئيدی',
+'uploadlogpage' => 'یوکلمه قئیدلری',
+'uploadlogpagetext' => 'آشاغیدا ان سون یوکله‌نیلن Ùایل‌لارین لیستی گؤستریلیر.
+داها گؤرونوش‌لو گؤسترمک اوچون، [[Special:NewFiles|یئنی Ùایل‌لار گالئری‌سینه]] باخین.',
+'filename' => 'Ùایل آدی',
+'filedesc' => 'قیساسی',
+'fileuploadsummary' => 'قیساسی:',
+'filereuploadsummary' => 'Ùایل دَییشیکلری:',
+'filestatus' => 'مؤل٠حوقوقلاری:',
+'filesource' => 'قایناق:',
+'uploadedfiles' => 'یوکلنمیش Ùایللار‌',
+'ignorewarning' => 'خبردارلیقلارا اهمیت وئرمه Ùˆ Ùايلی ساخلا',
+'ignorewarnings' => 'بوتون خبردارلیقلارا محل قويماماق',
+'minlength1' => 'Ùايل آدی ان آزی بیر حرÙدن عبارت اولمالیدیر.',
+'illegalfilename' => '"$1" Ùایل آدیندا صحیÙÙ‡ آدلاریندا ایستیÙاده‌سینه یول وئریلمه‌ین سیمبول‌لار وار. لطÙاً Ùایلین آدینی دییشین Ùˆ یئنی‌دن یوکلمه‌یه جهد ائدین.',
+'filename-toolong' => 'Ùایل آدی 240 بایت‌دان اوزون اولا بیلمز.',
+'badfilename' => 'Ùایلین آدی دییشیلدی. یئنی آدی: "$1".',
+'filetype-mime-mismatch' => '".$1" Ùایل اوزانتی‌سی Ùایلین میمئ تیپینه ($2) اویغون گلمیر.',
+'filetype-badmime' => '"$1" MIME تیپین‌دکی Ùایل‌لارین یوکلنمه‌سینه ایجازه وئریلمیر.',
+'filetype-bad-ie-mime' => 'بو Ùایل یوک‌لنه، چونکی اینتئرنئت اکسپلورر بونو، ایجازه وئریلمه‌ین Ùˆ احتمالا زررلی Ùایل نؤوو اولان "$1" اولا‌راق تثبیت ائدیر.',
+'filetype-unwanted-type' => "'''\". \$1\"''' ایستنمه‌ین بیر Ùایل نؤوودور. تکلی٠ائدیلن {{PLURAL: \$3 | Ùایل نؤوو | Ùایل نؤو‌لری}} \$2.",
+'filetype-banned-type' => '\' \'". $1"\' {{PLURAL: $4 | ایجازه وئریلن بیر Ùایل نؤوو دئییل | ایجازه وئریلن بیر Ùایل نؤوو دئییل}}. ایجازه وئریلن {{PLURAL: $3 | Ùایل نؤوو | Ùایل نؤو‌لری}} $2.',
+'filetype-missing' => 'Ùايلین هئچ بیر اوزانتیسی يوخدور (مثلا، ".jpg").',
+'empty-file' => 'سیز یول‌لادیغینیز Ùایل، بوش ایدی.',
+'file-too-large' => 'گؤندردیگینیز Ùایل چوخ بؤیوک‌دور.',
+'filename-tooshort' => 'Ùایل آدی چوخ قیسادی.',
+'filetype-banned' => 'بو تیپ Ùایل‌لار قاداغان‌دیر.',
+'verification-error' => 'Ùایل تصدیقی باش توتمادی.',
+'hookaborted' => 'ائتمه‌یه چالیشدیغینیز دییشیک‌لیک بیر Ùایل اوزانتی‌سی چئنگئلیلئ لغو ائدیلدی.',
+'illegal-filename' => 'Ùایل آدینا ایجازه یوخ‌دور.',
+'overwrite' => 'بیر اولان Ùایلین اوستونه یازماغا ایجازه یوخدور.',
+'unknown-error' => 'بیلینمه‌ين بیر خطا ياراندی.',
+'tmp-create-error' => 'مووققتی Ùايل يارادیلا بیلمه‌دی.',
+'tmp-write-error' => 'موقتی Ùایل یازیلارکن ختا.',
+'large-file' => 'Ùایل‌لارین $1 اؤلچوسون‌دن داها بؤیوک اولماماسی تکلیÙØ›
+بو Ùایلین اؤلچوسو $2.',
+'largefileserver' => 'Ùایلین اؤلچوسو یول وئریلن حدی آشیر.',
+'emptyfile' => 'یوکلدیگینیز Ùایل بوش‌دور. بو Ùایلین آدیندا اولان هر٠سهوی ایله باغ‌لی اولا بیلر. خاهیش اولونور کی، دوغوردان دا بو Ùای‌لی یوکلمک ایستدیگینیزی یوخلایاسینیز.',
+'windows-nonascii-filename' => 'بو wiki Ùایل آدلاریندا خصوصی کاراکتئر ایستیÙاده‌سینی دستکلمیر',
+'fileexists' => 'یوکلمک ایستدیگینیز آددا Ùایل مؤوجوددور.
+لطÙاً <strong>[[:$1]]</strong> کئچیدینی یوخلایین Ùˆ بو Ùای‌لی یوکلمک ایستدیگینیزدن عمین اولون.
+[[$1|thumb]]',
+'filepageexists' => 'بو Ùایل اوچون شرح صحیÙه‌سی <strong>[[:$1]]</strong> عنوانیندا اونسوز دا یارادیلمیش، لاکین بو آددا بیر Ùایل بو آندا مؤوجود دئییل.
+گیرجیینیز خلاصه شرح صحیÙه‌سینده گؤرونمه‌یه‌جک.
+اؤزئتینیزین اورادا گؤرونمه‌سی اوچون، بونو الله دییشدیرملیسینیز.
+[[$1|کیچیک شکیل]]',
+'fileexists-extension' => 'بئنزئر آدلا باشقا بیر Ùایل مؤوجود: [[$2|thumb]]
+* چکیلمیش Ùایلین آدی: <strong>[[:$1]]</strong>
+* مؤوجود Ùایلین آدی: <strong>[[:$2]]</strong>
+خاهیش ائدیریک باشقا بیر آد سئچین',
+'fileexists-thumbnail-yes' => "بو Ùایل، بیر رسمی Ùور وئرسیاسی کیمی گؤرونور (تهومبنایل)'. [[$1|thumb]]
+خاهیش ائدیریک <سترونگ> [[:$1]] </strong> Ùایلینی نظارت ائدین.
+اگر نظارت ائدیلن Ùایل ایله خصوصی اؤلچوسون‌دکی عینی دوسیایسا آرتیق کیچیک شکیل یوکلمه‌یه احتیاج یوخ‌دور.",
+'file-thumbnail-no' => "بو Ùایلین آدی <strong>$1</strong> ایله باشلاییر.
+بو باشقا بیر شکیل Ùور نوسخه سینه بنزییر (thumbnail)'
+اگر سیزده بو شکیلین تام نظر گلیر نسخه سی وارسا اونو یوکلیین، عکس حالدا خاهیش ائدیریک Ùایل آدینی دییش‌دیرین.",
+'fileexists-forbidden' => 'بو آددا بیر Ùايل وار، Ùˆ اوزرینه يازیلما اولماز.
+Ùايلینیزی يئنه ده يوکله‌مک ایسته‌يیرسینیزسه، خاهیش ائدیریک گئری دؤنوب يئنی بیر آد ایستیÙاده ائدین.
+[[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'بو آددا بیر Ùايل اورتاق آمباردا مؤوجود دیر.
+Ùايلینیزی يئنه ده يوکله‌مک ایسته‌يیرسینیزسه، خاهیش ائدیریک گئری گئدیب يئنی بیر آد ایستیÙاده ائدین.
+[[File:$1|thumb|center|$1]]',
+'file-exists-duplicate' => 'بو Ùایل آشاغی‌داکی {{PLURAL: $1 | Ùایلین | Ùایل‌لارین}} تکراری سی‌دیر:',
+'file-deleted-duplicate' => 'بو Ùایلین عینی اولان باشقا بیر Ùایل([[:$1]])داها اول‌دن سیلیندی. بو Ùای‌لی یئنی‌دن یوکلمه‌دن اول دیگر Ùایلین سیلینمه‌سی قئیدلرینی ایداره ائتملیسینیز.',
+'uploadwarning' => 'يوکله‌مه خبردارلیغی',
+'uploadwarning-text' => 'خاهیش ائدیریک آشاغی‌داکی Ùایل شرحینی دییش‌دیرین Ùˆ یئنی‌دن جهد ائدین.',
+'savefile' => 'Ùايلی قئيد ائت',
+'uploadedimage' => '«[[$1]]» یوکلندی',
+'overwroteimage' => '"[[$1]]"-این یئنی نوسخه سی یوکلندی',
+'uploaddisabled' => 'يوکله‌مه باش توتمادی',
+'copyuploaddisabled' => 'اینترنت آدرسی ایله یوکلمه باش توتمادی.',
+'uploadfromurl-queued' => 'يوکله‌مه‌نیز نؤوبه گؤزله‌يیر',
+'uploaddisabledtext' => 'Ùايل يوکلنمه‌سی باش توتمادی.',
+'php-uploaddisabledtext' => 'Ù¾ÛŒ اچ Ù¾ÛŒ Ùایل یوکلملری دؤوره خاریجی‌دیر. خاهیش ائدیریک file_uploads تنظیم لرین یئنی دن بیر باخین.',
+'uploadscripted' => 'بو Ùایل بیر اینتئرنئت آختاریش برنامه سی طرÙین‌دن سهو چئوریلبیلجک بیر HTML Ùˆ یا ایسکریپت کودو عبارت‌دیر.',
+'uploadvirus' => 'Ùايلدا ویروس وار!
+دئتاللار: $1',
+'uploadjava' => 'Ùایل، بیر جاوا. نوع ‎‎class ائهتیوا ائدن بیر زیپ Ùایلی‌دیر.
+جاوا Ùایل‌لارینین یوکلنمه‌سینه ایجازه وئریلمیر، چونکی تهلوکه‌سیزلیک محدودلاشدیرما‌لارینین آتلانماسینا سبب اولا بیلمکده‌دیرلر.',
+'upload-source' => 'قایناق Ùايلی',
+'sourcefilename' => 'Ùايل آدی منبع‌لری',
+'sourceurl' => 'قایناق آدرسی',
+'destfilename' => 'Ùايل آدی',
+'upload-maxfilesize' => 'Ùايلین بویوک هجمی: $1',
+'upload-description' => 'Ùایل ایضاهی',
+'upload-options' => 'یوکلمه سئچینیکلر',
+'watchthisupload' => 'بو Ùايلی ایزله',
+'filewasdeleted' => 'بو آددا بیر Ùایل یاخین زاماندا یوکلندی Ùˆ سونرا ایداره‌چی‌لر طرÙین‌دن سیلیندی. Ùای‌لی یوکلئمئدئن اول، $1 صحیÙه‌سینه بیر گؤز آتین.',
+'filename-bad-prefix' => 'یوکلمکده اولدوغونوز Ùایلین آدی، عمومی اولا‌راق رقمسال کامئرا‌لار طرÙین‌دن آوتوماتیک اولا‌راق ائکئلئنئن Ùˆ آچیقلاییجی اولمایان \'"$1"\' ایله باشلاییر.
+خاهیش ائدیریک Ùایلینیز اوچون داها آچیقلاییجی بیر آد سئچین.
+
+یوکلمکده اولدوغونوز Ùایلین آدی، عمومی اولا‌راق رقمسال کامئرا‌لار طرÙین‌دن آوتوماتیک اولا‌راق باغلانان Ùˆ آچیقلاییجی اولمایان \'"$1"\' ایله باشلاییر.
+خاهیش ائدیریک Ùایلینیز اوچون داها آچیقلاییجی بیر آد سئچین.',
+'upload-success-subj' => 'یوکلمه گوتولدو',
+'upload-success-msg' => '[$2] یوکلمه‌نیز موÙقیت‌لی اولدو. یوکلمه‌نیز بورادا مؤوجود: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'یوکلمه پروبلئمی',
+'upload-failure-msg' => '[$2]-دن یوکله‌دیگینیزده بیر ایشکال قاباغا گلدی:
+
+$1',
+'upload-warning-subj' => 'یوکلمه خبردارلیغی',
+'upload-warning-msg' => '[$2]-دن یوکله‌دیگینیزده بیر ایشکال قاباغا گلدی. بو ایشکالی دوزلدمک اوچون، [[Special:Upload/stash/$1|یوکلمه Ùورمو]]نا قاییدا بیلرسینیز.',
+
+'upload-proto-error' => 'یانلیش پروتوکول',
+'upload-proto-error-text' => 'اوزاقدان یوکلمه، <code>http://</code> یوخسا <code>ftp://</code> ایله باشلانان آدرس ایسته‌ییر.',
+'upload-file-error' => 'ایچ خطاسی',
+'upload-file-error-text' => 'سئروئرده مووققتی Ùایل میدانا گتیرمه جهدی زامانی بیر داخیلی خطا میدانا گلدی.
+خاهیش ائدیریک بیر [[Special:ListUsers/sysop|administrator]] یله علاقه ساخلایین.',
+'upload-misc-error' => 'بیلین‌مه‌ین یوکلمه خطاسی',
+'upload-misc-error-text' => 'یوکلمه اسناسیندا بیلینمه‌ین بیر خطا میدانا گلدی.
+خاهیش ائدیریک علاقه‌نین اعتبارلی و چاتیلا بیلر اولدوغونو تصدیق و یئنی‌دن جهد ائدین.
+اگر پروبلئم تکرارلانسا، بیر [[Special:ListUsers/sysop|administrator]] ایله علاقه ساخلایین',
+'upload-too-many-redirects' => 'آدرس ده چوخ یؤنلندیرمه وار',
+'upload-unknown-size' => 'بیلین‌مه‌ين هجم',
+'upload-http-error' => 'اچ تی تی پی ختاسی وار : $1',
+'upload-copy-upload-invalid-domain' => 'Ùایل یوکلنمه سی بو بازه ده امکانی یوخدور',
+
+# File backend
+'backend-fail-stream' => '$1 Ùای‌لی یولانمامادی.',
+'backend-fail-backup' => 'بو Ùایل $1 اوچون نوسخه پشتیان یارتماق اولماز',
+'backend-fail-notexists' => '"$1" Ùای‌لی مؤوجود دئییل',
+'backend-fail-hashes' => 'هش‌لری آلماق پرونده مقایسه اوچون یانلیشی دیر.',
+'backend-fail-notsame' => 'بیر اولمایان Ùایل $1 دا واردیر.',
+'backend-fail-invalidpath' => '"$1" اعتبارلی بیر ییغما یولو دئییل.',
+'backend-fail-delete' => '"$1" Ùایلن سیله بیلمه سینیز.',
+'backend-fail-describe' => 'مئتاداتا "$1" Ùایل دییشیک‌لیک وئرمک اولماز.',
+'backend-fail-alreadyexists' => '"$1" Ùای‌لی اونسوز دا مؤوجوددور.',
+'backend-fail-store' => 'Ùایلین $1 $2 ساخلایا ائتمک اولا بیلمز.',
+'backend-fail-copy' => '"$1" Ùايلی "$2" Ùايلینا کوپي‌لانمیر.',
+'backend-fail-move' => '"$1" Ùای‌لی، "$2" Ùایلینا تاشینامادی.',
+'backend-fail-opentemp' => 'مووققتی Ùایل آچیلا بیلمه‌دی.',
+'backend-fail-writetemp' => 'مووققتی Ùایل اولوشتورولامادی.',
+'backend-fail-closetemp' => 'مووققتی Ùایل باغلاندی.',
+'backend-fail-read' => '"$1" Ùایلی اوخونمادی.',
+'backend-fail-create' => '"$1" Ùایلی یارانمادی.',
+'backend-fail-maxsize' => 'ائدیر: Ùایل داها چوخ $1 {{PLURAL:$2|بیر بایتی|$2 بایتی}} $2 {جمع} چونکی داتا یازا بیلمز.',
+'backend-fail-readonly' => 'پشتیبان "$1" حال حاضیر دا Ùقط اوخوماق وضعیتینده دیر. وئریلمیش سببی: "$2"',
+'backend-fail-synced' => 'Ùایل «$1» پشتیبان لاری اوچوجو داخی‌لی وضعیت ساخلانیلیر',
+'backend-fail-connect' => 'ارتیباط ذخیره پشتیبانی «$1» ایله قورولمادی',
+'backend-fail-internal' => 'بیلنمه ین خطا ذخیره پشتیبانین دا «$1» اوز وئردی.',
+'backend-fail-contenttype' => 'Ùایلین ایچینده Ú©ÛŒ نوعون ساخلاماق اوچون «$1» یئرده تعیین اولماسی موÙقیت سیزی دیر.',
+'backend-fail-batchsize' => 'دسته لر واردیر $1 {{PLURAL:$1|ایش آپاریلماسی |ایش آپاریلماسی}} Ùایل ذخیره پشتیبانینا ذخیره وئریلدی؛ چوخلوسی، ایجازه وار $2 {{PLURAL:$2|ایش آپاریلماسی |ایش آپاریلماسی}} دیر.',
+'backend-fail-usable' => '$1Ùایل اوچون اوخوماق Ùˆ یازماق ایمکانی یوخدور نیه Ú©ÛŒ دسرسی سطحی Ú©ÛŒÙایت ائتمیر یا دا نظرده آلینان شاخه/محÙظهٔ یوخدور.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'وصل اولماق ایمکانی دÙترخانا داده پایگاهینا پشتیبانلیق ائتمک اوچون "$1" ساخلاماقی یوخدور.',
+'filejournal-fail-dbquery' => 'دÙترخانا داده پایگاهین یئنی لمک پشتیبان ساخلاماق اوچون«$1» امکان یوخدور.',
+
+# Lock manager
+'lockmanager-notlocked' => 'کلید «$1» آچماق اولمور؛ نیه کی بالانمییب.',
+'lockmanager-fail-closelock' => 'موحاÙیظه اولونموش Ùایل "$1" اوچون باقلاماق اولا بیلمز .',
+'lockmanager-fail-deletelock' => 'موحاÙیظه اولونموش Ùایل "$1" اوچون سیلمه اولا بیلمز .',
+'lockmanager-fail-acquirelock' => 'موحاÙیظه «$1» اوچون اولا بیلمز',
+'lockmanager-fail-openlock' => 'موحاÙیظه اولونموش Ùایل "$1" اوچون آچمااولا بیلمز .',
+'lockmanager-fail-releaselock' => 'موحاÙیظه «$1» اوچون آچیلا بیلمز',
+'lockmanager-fail-db-bucket' => 'ارتباط ایمکانی داده پایگاهین تعداد کاÙÛŒ کیلد لر $1 محÙظه سینده یوخدور.',
+'lockmanager-fail-db-release' => 'داده پایاگاهین $1 کیلید لرین آچماقی مومکین دییل.',
+'lockmanager-fail-svr-acquire' => 'سئرور کیلید لرین $1 اچماق مومکین دییل.',
+'lockmanager-fail-svr-release' => 'سئرور کیلید لرین $1 آچماق امکانی یوخدور.',
+
+# ZipDirectoryReader
+'zip-file-open-error' => 'Ùايل زیپ يوخلامالاری اوچون آچیلارکن بیر خطاایله قارشیلاشیلدی.',
+'zip-wrong-format' => 'گؤستریلن Ùايل زیپ Ùايلی دئيیل.',
+'zip-bad' => 'Ùایل خاراب یا دا باشقا بیر سبب‌دن اؤتری اوخونمایان بیر زیپ Ùایلی.
+تهلوکه‌سیزلیک نظارتی اویغون شکیلده گئرچکلشدیریلمیر.',
+'zip-unsupported' => 'Ùايل، مئدیياویکی طرÙیندن دستکلنمه‌ين زیپ خصوصیتلرینه صاحب بیر زیپ Ùايلی.
+تهلوکه‌‌سیزلیک نظارتی اويغون بیر شکیلده گئرچئکلئشتیریلئمیيور.',
+
+# Special:UploadStash
+'uploadstash' => 'گیزلی يوکله‌مه',
+'uploadstash-summary' => 'بو صحیÙه‌‌ يوکلنمیش(Ùˆ يا يوکلنمکده دیر) آمما هله ویکیده نشر اولونمامیش Ùايللارا چاتماغی تعمین ائدر. بو Ùايللار يالنیز يوکله‌يه‌نی طرÙیندن گؤروله بیلر.',
+'uploadstash-clear' => 'مووققتی Ùايللاری تمیزله',
+'uploadstash-nofiles' => 'سیزین هئچ آمبار اولموش Ùایلینیز یوخدور.',
+'uploadstash-badtoken' => 'چالیشمانین حیاتا کئچیریلمه‌سی باشاریسیز اولدو، احتیماللا تنزیمله‌مه قايدالاری زامان آشیمینا معروض قالدی. يئنیدن چالیشین.',
+'uploadstash-errclear' => 'Ùايللارین سیلینمه‌سی باشاریسیز اولدو.',
+'uploadstash-refresh' => 'Ùايل سیياهیسینی يئنیله',
+'invalid-chunk-offset' => 'اعتبارسیز یئربه‌یئر',
+
+# img_auth script messages
+'img-auth-accessdenied' => 'گیریش قاداغاندیر',
+'img-auth-nopathinfo' => 'PATH_INFO یوخدور.
+سئروئرینیز بو معلوماتی کئچیرمک اوچون نیزاملانمامیش.
+سی‌جی‌آی اولا بیلر و img_auth دستکله‌نیلمیر اولا بیلر.
+https://www.mediawiki.org/wiki/Manual:Image_Authorization صحیÙه‌‌سینه باخین.',
+'img-auth-notindir' => 'ایسته‌دیگینیز يول قورولموش يوکله‌مه قوولوغونا دئيیل.',
+'img-auth-badtitle' => '«$1» ایله اعتبارلی بیر مؤوضو یوخدور....',
+'img-auth-nologinnWL' => 'گیریش ائتمه‌دینیز و «$1» آغ سیياهیدا دئيیل.',
+'img-auth-nofile' => 'Ùایل "$1" یوخدور.',
+'img-auth-isdir' => '"$1" قوو‌لوغونا چیخماغا چالیشیرسینیز.
+یالنیز Ùایل مراجعتینه ایجازه وئریلیر.',
+'img-auth-streaming' => '"$1" آخینی.',
+'img-auth-public' => "img_auth.php 'نین Ùونکسیاسی خصوصی بیر ویکی Ùایل‌لاری چیخارماق‌دیر.
+بو wiki اومومی بیر wiki اولا‌راق قورولوب.
+ان اویغون تهلوکه‌سیزلیک اوچون، img_auth.php دؤوره خاریجی بوراخیلدی.",
+'img-auth-noread' => 'ایستیÙاده‌چی‌نین «$1»بیر اوخوماق حقوقو يوخدور.',
+'img-auth-bad-query-string' => 'آدرس اونواندا يانلیش آختاریش ستری وار.',
+
+# HTTP errors
+'http-invalid-url' => 'سهو اورل: $1',
+'http-invalid-scheme' => '"$1" سماسینا صاحب اورللئر دستک‌لنمیر',
+'http-request-error' => 'هتتپ ایستیی بیلینمه‌ین بیر سببله موÙقیت‌سیز اولدو.',
+'http-read-error' => 'اچ‌تی‌تی‌پی اوخوما ختاسی',
+'http-timed-out' => 'اچ‌تی‌تی‌پی ایستیی‌نین واختی بیتدی.',
+'http-curl-error' => 'مراجعت نشانی ده یانلیش : $1',
+'http-host-unreachable' => 'آدرسه چاتماق اولمادی (خطا).',
+'http-bad-status' => 'اچ‌تی‌تی‌پی مراجعتین یوخلانماسی زامانی پروبلئم آشکارلانمیش‌دیر: $1 $2',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'اینترنتی آدرسه چاتماق اولمادی.',
+'upload-curl-error6-text' => 'گؤستریلن اورل ائریشیلمیر.
+خاهیش ائدیریک اورل دوغرو و سایتین آچیق اولدوغونو نظارت ائدین.',
+'upload-curl-error28' => 'يوکله‌مه واختی بیتدی',
+'upload-curl-error28-text' => 'بو سایتین جاواب وئرمه‌سی چوخ اوزون سورور.
+خاهیش ائدیریک سایتین آچیق اولدوغونو نظارت ائدین، قیسا بیر مدت گؤزلیین و یئنی‌دن جهد ائدین.
+سایتین داها آز مشغول اولدوغو بیر زاماندا سیناماق داها یاخشی اولا بیلر.',
+
+'license' => 'لیسانس:',
+'license-header' => 'لیسانس',
+'nolicense' => 'هئچ‌بیری سئچیلمه‌ییب',
+'license-nopreview' => '(اؤن‌گؤستریش یوخدور)',
+'upload_source_url' => '(بیر گئچرلی و عموم گؤره بیلن اینترنت آدرسی)',
+'upload_source_file' => '(بیلگی‌سایارینیزدا بیر Ùایل)',
+
+# Special:ListFiles
+'listfiles-summary' => 'بو اؤزل صحیÙه، بوتون یوکله‌نیلن Ùایل‌لاری گؤستریر.
+ایستیÙاده‌چیه Ùیلتر اولوناندا، یالنیز او ایستیÙاده‌چی سون نوسخه‌لرینی یوکله‌ین Ùایل‌لار گؤستریلیر.',
+'listfiles_search_for' => 'مئدیا آدی اوچون آختار:',
+'imgfile' => 'Ùایل',
+'listfiles' => 'Ùایل لیستی',
+'listfiles_thumb' => 'کیچیک شکیل',
+'listfiles_date' => 'تاریخ',
+'listfiles_name' => 'آد',
+'listfiles_user' => 'ایستیÙاده‌چی',
+'listfiles_size' => 'اؤلچو',
+'listfiles_description' => 'شرح',
+'listfiles_count' => 'نوسخه‌لر',
+
+# File description page
+'file-anchor-link' => 'Ùایل',
+'filehist' => 'Ùايل گئچمیشی',
+'filehist-help' => 'Ùايلین اول‌کی وئرسیياسینی گؤرمک اۆچون Ú¯Û†Ù†/تاریخ بؤلمه‌سینده‌کی تاریخلری تێقلايین.',
+'filehist-deleteall' => 'هاممی‌سین سیل',
+'filehist-deleteone' => 'سیل',
+'filehist-revert' => 'قایتار',
+'filehist-current' => 'ایندیکی',
+'filehist-datetime' => 'تاریخ/واخت',
+'filehist-thumb' => 'کیچیک شکیل',
+'filehist-thumbtext' => '$1 تاریخینده‌کی نوسخه‌نین کیچیک گؤرونتوسو',
+'filehist-nothumb' => 'کیچیک شکیل یوخدو',
+'filehist-user' => 'ایستیÙاده‌چی',
+'filehist-dimensions' => 'اؤلچولر',
+'filehist-filesize' => 'Ùایل اؤلچوسو',
+'filehist-comment' => 'باخیش',
+'filehist-missing' => 'Ùایل یوخدور',
+'imagelinks' => 'Ùايل ایشلدمه‌سی',
+'linkstoimage' => 'آشاغیداکی {{PLURAL:$1|صحیÙÙ‡|$1 صحیÙه‌لر}} بو Ùایلا {{PLURAL:$1|باغلانیر|باغلانیرلار}}',
+'linkstoimage-more' => 'بو Ùایلا {{PLURAL:$1|بیر|$1}}-دن چوخ صحیÙÙ‡ باغلانتی‌سی واردیر.
+آشاغیداکی لیست بو Ùایلا یالنیز ایلک $1 صحیÙÙ‡ باغلانتیسینی گؤستریر.
+بیر [[Special:WhatLinksHere/$2|بوتون لیست]] ده واردیر.',
+'nolinkstoimage' => 'بو Ùایلا هئچ بیر صحیÙÙ‡ باغلانماییب.',
+'morelinkstoimage' => 'بو Ùایلا [[Special:WhatLinksHere/$1| داها چوخ علاقه‌لری]] باخ.',
+'linkstoimage-redirect' => '$1 (Ùایل ایستیقامتلندیریلیر) $2',
+'duplicatesoffile' => 'بو {{PLURAL:$1 | Ùایل | $1 Ùایل}}ØŒ بو Ùایلین صورتی ([[Special:FileDuplicateSearch/$2|داها چوخ دئتال]]):',
+'sharedupload' => 'بو Ùایل $1-دان‌دیر Ùˆ اولا بیلسین کی، باشقا لاییهه‌لرده ده ایستیÙاده ائدیلیر.',
+'sharedupload-desc-there' => 'بو Ùایل $1 آنبارین‌دان Ùˆ دیگر پروژئجتس. داها چوخ معلومات اوچون لطÙاً [$2 Ùایل شرح صحیÙه‌سینه] باخین.',
+'sharedupload-desc-here' => 'بو Ùایل $1-دن‌دیر Ùˆ آیری پروژه‌ده ایستیÙاده اولماق امکانی وار.
+اونون باره‌سینده اولان شرح [$2 Ùایلین شرح صحیÙه‌سی] آشاغیدا گوستریلیب.',
+'sharedupload-desc-edit' => 'بو Ùایل $1 دن دیر Ùˆ ائلیه بیلر اوبیری پروژه لرده ایستÙاده اولا.
+ایر ایستیرسینیز ائلیه بیلرسینیز پرونده نین شرحلرین [$2 شرحلر صحیÙÙ‡ سیندن]دییشدیرسینیز.',
+'sharedupload-desc-create' => 'بو Ùایل $1 دن دیر Ùˆ ائلیه بیلر اوبیری پروژه لرده ایستÙاده اولا.
+ایر ایستیرسینیز ائلیه بیلرسینیز پرونده نین شرحلرین[$2 شرحلر صحیÙÙ‡ سیندن]دییشدیرسینیز.',
+'filepage-nofile' => 'بو آدلا Ùایل یوخدور',
+'filepage-nofile-link' => 'بو آددا بیر Ùایل یوخ، اما سیز [$1 یوکله‌یه بیلرسینیز].',
+'uploadnewversion-linktext' => 'بو Ùايلین يئنی سین يوکله',
+'shared-repo-from' => '$1-دن',
+'shared-repo' => 'عومومی آمبار',
+'upload-disallowed-here' => 'تاس٠لر سیز ائلیه بیلمه سیز بو Ùایلی تزدن یازاسیز.',
+
+# File reversion
+'filerevert' => '$1Ùایلی اولکی حالینا قایتار',
+'filerevert-legend' => 'Ùايلی اولکی وضعیتینه قايتار',
+'filerevert-intro' => "'''[[Media:$1|$1]]'''مئدیاسینین [$4 $3، $2 ایل تاریخ‌لی نوسخه] اونو گئری گتیریرسینیز.",
+'filerevert-comment' => 'ندن:',
+'filerevert-defaultcomment' => '$2، $1 تاریخ‌لی سورومئ گئری قایتاریلدی',
+'filerevert-submit' => 'وضعیتینه',
+'filerevert-success' => "'''[[Media:$1|$1]]' Ùایلی [$4 $3ØŒ $2 ایل تاریخ‌لی سورومئ] گئری قایتاریلدی.",
+'filerevert-badversion' => 'بو Ùایلین وئریلن زامان معلوماتینا صاحب اوولکی بیر یئرلی نوسخه سی یوخ‌دور.',
+
+# File deletion
+'filedelete' => 'سیل $1',
+'filedelete-legend' => 'Ùایلی سیل',
+'filedelete-intro' => "سیز '''[[Media:$1|$1]]''' Ùایلینی بوتون گئچمیشی‌له بیرلیکده سیلمک‌ده‌سینیز.",
+'filedelete-intro-old' => "سیز '''[[Media:$1|$1]]''' Ùایلینین [$4 $3ØŒ $2]-ده‌کی نوسخه‌سینی سیلمک‌ده‌سینیز.",
+'filedelete-comment' => 'نَدَن‌لیک:',
+'filedelete-submit' => 'سیل',
+'filedelete-success' => "'$1 سیلینمیش‌دیر.",
+'filedelete-success-old' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\'-nin $3 və $2 نوسخه لری سیلینمیش‌دیر.</span>',
+'filedelete-nofile' => "'$1 مؤوجود دئییل.",
+'filedelete-nofile-old' => "'''$1 اوچون نظرده توتولان خصوصیتده آرشیولئنمیش بیر نوسخه یوخ.",
+'filedelete-otherreason' => 'باشقا/آرتیق دلیل:',
+'filedelete-reason-otherlist' => 'باشقا سبب',
+'filedelete-reason-dropdown' => '*اساس سیلمه سببی
+** یازانلار حقوقون پوزونتوسو
+** دوبلیکات Ùایل
+** کئیÙیت‌سیز شکیل
+** ایستیÙاده‌سیز Ùایل
+** قئیری-ائنسیکلوپئدیک شخص
+** لیسئنزیا‌سیز Ùایل
+** آزاد شکیلله اوز اولوندو
+** مؤل٠ایستیی',
+'filedelete-edit-reasonlist' => 'سیلمک دلیل‌لرینی دَییشدیر',
+'filedelete-maintenance' => 'ساخلاماق سیراسیندا، Ùایل‌لاری سیلمک Ùˆ قایتارماق، گئچرلی اولاراق باغلی‌دیر.',
+'filedelete-maintenance-title' => 'Ùایل سیلیننمه‌دی',
+
+# MIME search
+'mimesearch' => 'MIME آختار',
+'mimesearch-summary' => 'بو صحیÙه، Ùایل‌لارین MIME-لارینا گؤره Ùیلترله‌مگی آچار.
+وئرمک: contenttype/subtype، میثال: <code>image/jpeg</code>.',
+'mimetype' => 'MIME تیپی:',
+'download' => 'اندیر',
+
+# Unwatched pages
+'unwatchedpages' => 'ایزلنمه‌میش صحیÙه‌لر',
+
+# List redirects
+'listredirects' => 'یول‌لاندیرمالارین لیستی',
+
+# Unused templates
+'unusedtemplates' => 'ایشلدیلمه‌میش شابلونلار',
+'unusedtemplatestext' => 'بو صحیÙÙ‡ بوتون، {{ns:template}} آدÙضاسیندا اولان Ùˆ باشقا صحیÙه‌لرده اولمایان صحیÙه‌لری لیست ائدیر.
+شابلونلاری سیلمک‌دن اؤنجه، لوطÙاً اونلارا اولان باشقا باغلانتیلاری یوخلایین.',
+'unusedtemplateswlh' => 'باشقا باغلانتیلار',
+
+# Random page
+'randompage' => 'راست‌گله صحیÙÙ‡',
+'randompage-nopages' => 'بو {{PLURAL:$2|آدÙضاسیندا|آدÙضالاریندا}} هئچ صحیÙÙ‡ یوخدور: $1.',
+
+# Random redirect
+'randomredirect' => 'راست‌گله یول‌لاندیرما',
+'randomredirect-nopages' => '«$1» آدÙضاسیندا هئچ بیر یول‌لاندیرما یوخدور.',
+
+# Statistics
+'statistics' => 'آمارلار',
+'statistics-header-pages' => 'صحیÙÙ‡ آمارلاری',
+'statistics-header-edits' => 'دَییشمه آمارلاری',
+'statistics-header-views' => 'باخما آمارلاری',
+'statistics-header-users' => 'ایستیÙاده‌چی آمارلاری',
+'statistics-header-hooks' => 'باشقا آمارلار',
+'statistics-articles' => 'مقاله‌لر',
+'statistics-pages' => 'صحیÙه‌لر:',
+'statistics-pages-desc' => 'بو ویکی‌ده بوتون صحیÙه‌لر، او جومله‌دن دانیشیق صحیÙه‌لری، یول‌لاندیرمالار Ùˆ سونرا.',
+'statistics-files' => 'یوکلنمیش Ùایل‌لار',
+'statistics-edits' => '{{SITENAME}} یولا دوشندن بَری صحیÙÙ‡ دَییشیکلیکلری',
+'statistics-edits-average' => 'هر صحیÙه‌ده اورتا دَییشیکلیک سایی',
+'statistics-views-total' => 'گؤرونوشلر جمعی',
+'statistics-views-total-desc' => 'اولمایان صحیÙه‌لر Ùˆ اؤزل صحیÙه‌لره گؤرونوشلر، داخیل ائدیلمه‌ییب‌دیر',
+'statistics-views-peredit' => 'دَییشیکلیگه گؤرونوشلر',
+'statistics-users' => 'یازیلمیش [[Special:ListUsers|ایستیÙاده‌چیلر]]',
+'statistics-users-active' => 'چالیشقان ایستیÙاده‌چیلر',
+'statistics-users-active-desc' => 'سون {{PLURAL:$1|بیر|$1}} گون‌ده بیر ایش گؤرن ایستیÙاده‌چیلر',
+'statistics-mostpopular' => 'ان چوخ گؤرونموش صحیÙه‌لر',
+
+'disambiguations' => 'آیدین‌لاشدیرما صحیÙه‌لرینه باغلانتیلاری اولان صحیÙه‌لر',
+'disambiguationspage' => 'Template:دقیقلشدیرمه',
+'disambiguations-text' => "آشاغیداکی صحیÙه‌لرده آزی بیر باغلانتی، '''بلیرلیندیمه صحیÙه‌لری'''نه واردیر.
+اولا بیلر اونلاری داها اویغون صحیÙه‌یه باغلاماق لازیم اولا.<br />
+بیر صحیÙه، بلیرلندیرمه صحیÙه‌سی کیمی اولار، اگر [[MediaWiki:Disambiguationspage]] صحیÙه‌سینه باغلانمیش بیر شابلون‌دان ایستیÙاده ائتسه.",
+
+'pageswithprop' => 'صحیÙÙ‡ اؤزل‌لیگی اولان صحیÙه‌لر',
+'pageswithprop-legend' => 'صحیÙÙ‡ اؤزل‌لیگی اولان صحیÙه‌لر',
+'pageswithprop-text' => 'بو صحیÙه‌ده، بیر خاص صحیÙÙ‡ اؤزل‌لیگی ایشلدن صحیÙه‌لرین لیستی واردیر.',
+'pageswithprop-prop' => 'اؤزل‌لیک آدی:',
+'pageswithprop-submit' => 'گئت',
+
+'doubleredirects' => 'ایکی‌قات یول‌لاندیرمالار',
+'doubleredirectstext' => 'بو صحیÙÙ‡ دیگر ایستیقامتلندیرمه صحیÙه‌لرینه ایستیقامتلندیرمه ائدن صحیÙه‌لری سیاهی‌لار.
+هر سطرین ائهتیوا ائتدیگی کئچیدلر؛ بیرینجی Ùˆ ایکینجی ایستیقامتلندیرمه، هم‌چی‌نین ایکینجی ایستیقامتلن‌دیرمک هدÙی، Ú©ÛŒ بو عمومیتله بیرینجی ایستیقامتلن‌دیرمک گؤسترمه‌سی لازیم اولان "گئرچک" هد٠صحیÙه‌سی‌دیر.
+<del> اوستو خط لنیب </del> دوزلمیش دیر.',
+'double-redirect-fixed-move' => '[[$1]] دییشدیریلیب.
+حاضردا [[$2]]-یه ایستیقامتلنیب.',
+'double-redirect-fixed-maintenance' => '[[$1]]-دن [[$2]]-یه ایکی‌قات ایستیقامتلنمه دوزلدیلیر.',
+'double-redirect-fixer' => 'يؤنلندیرمه تعمیرجیسی',
+
+'brokenredirects' => 'خطالی ایستیقامتلندیرمه',
+'brokenredirectstext' => 'آشاغی‌داکی ایستیقامتلندیرمه‌لر مؤوجود اولمایان صحیÙه‌لره کئچید وئریر:',
+'brokenredirects-edit' => 'دَییشدیر',
+'brokenredirects-delete' => 'سیل',
+
+'withoutinterwiki' => 'دیل باغلانتیلاری اولمایان صحیÙه‌لر',
+'withoutinterwiki-summary' => 'آشاغیداکی صحیÙه‌لر، باشقا دیل‌لره باغلانتیلاری یوخدور.',
+'withoutinterwiki-legend' => 'اؤن‌اَک',
+'withoutinterwiki-submit' => 'گؤستر',
+
+'fewestrevisions' => 'ان آز دَییشدیریلن صحیÙه‌لر',
+
+# Miscellaneous special pages
+'nbytes' => '{{PLURAL:$1|بیر|$1}} بایت',
+'ncategories' => '{{PLURAL:$1|بیر|$1}} بؤلمه',
+'ninterwikis' => '{{PLURAL:$1|بیر|$1}} ویکی‌آراسی',
+'nlinks' => '{{PLURAL:$1|بیر|$1}} باغلانتی',
+'nmembers' => '{{PLURAL:$1|بیر|$1}} عوضو',
+'nrevisions' => '{{PLURAL:$1|بیر|$1}} نوسخه',
+'nviews' => '{{PLURAL:$1|بیر|$1}} گؤرونوش',
+'nimagelinks' => '$1 ده{{PLURAL:$1|صحیÙه‌ده}}ایستیÙاده اولونمور',
+'ntransclusions' => '$1 ده{{PLURAL:$1|صحیÙه‌ده}}ایستیÙاده اولونور',
+'specialpage-empty' => 'بو صحیÙÙ‡ بوشدور',
+'lonelypages' => 'يئتیم صحیÙه‌‌لر',
+'lonelypagestext' => 'آشاغی‌داکی صحیÙه‌لره {{SITENAME}} سایتین‌داکی دیگر صحیÙه‌لردن علاقه وئریلممیش یا دا چارپاز داخیل ائدیلممیش.',
+'uncategorizedpages' => 'بؤلمه‌سیز صحیÙه‌لر',
+'uncategorizedcategories' => 'بؤلمه‌سیز بؤلمه‌لر',
+'uncategorizedimages' => 'بؤلمه‌سیز شکیل‌لر',
+'uncategorizedtemplates' => 'بؤلمه‌سیز شابلون‌لار',
+'unusedcategories' => 'ایستیÙاده ائدیلمه‌میش بؤلمه‌لر',
+'unusedimages' => 'ایشلنمه‌میش Ùایل‌لار',
+'popularpages' => 'سئویلن صحیÙه‌لر',
+'wantedcategories' => 'یسته نن بؤلمه‌لر',
+'wantedpages' => 'ایسته‌نیلن صحیÙه‌لر',
+'wantedpages-badtitle' => 'مراجعت زامانتی يانلیش باشلیق: $1',
+'wantedfiles' => 'ایسته نن Ùایللار',
+'wantedfiletext-cat' => 'آشاغیداکی Ùایل‌لار ایشله‌نیبلر اما یوخدورلار. ائشیک آنباردا اولان Ùایل‌لار دا اولدوقلارینا باخمایاراق، لیست‌ده گلیبلر. ائله یانلیش باخیشلار <del>خطلنه‌جکلر</del>. هم‌ده، اولمایان Ùایل‌لاری ایشلدن صحیÙه‌لر ده [[:$1]]-ده لیست اولونوبلار.',
+'wantedfiletext-nocat' => 'اشاغی داکی Ùایل لار ایستÙاده اولور سانکی یوخدولار.حتی مومکین دیر خارجی حویض مخزن لریندن اولماق ایله بو ردا Ùهرست اولا . وهر مثب رتبه سی یانلیش <del> خط یئمیش اولاجاق.</del>',
+'wantedtemplates' => 'ایسته نن شابلونلار',
+'mostlinked' => 'ان چوخ کئچیدلنن صحیÙه‌‌لر',
+'mostlinkedcategories' => 'ان چوخ مقاله‌سی اولان بولمه لر',
+'mostlinkedtemplates' => 'ان چوخ ایستیÙاده اولونان شابلون‌لار',
+'mostcategories' => 'بؤلمه‌سی ان چوخ اولان صحیÙه‌لر',
+'mostimages' => 'ان چوخ ایستیÙاده ائدیلمیش شکیللر',
+'mostinterwikis' => 'اینتر ویکی‌سی ان چوخ اولان صحیÙه‌لر',
+'mostrevisions' => 'ان چوخ نظردن کئچیریلمیش (وئرسیا‌لی) مقاله‌لر',
+'prefixindex' => 'بوتون اؤن‌اَکلی صحیÙه‌لر',
+'prefixindex-namespace' => 'بوتون صÙحه لر (آد Ùضاسی$1) قاباق دان یاپیشیقی وار',
+'shortpages' => 'قیسا صحیÙه‌‌لر',
+'longpages' => 'اوزون صحیÙه‌‌لر',
+'deadendpages' => 'کئچید وئرمه‌ين صحیÙه‌‌لر',
+'deadendpagestext' => 'آشاغیداکی صحیÙه‌‌لردن بو ویکیپئدیياداکی دیگر صحیÙه‌‌لره هئچ بیر کئچید يوخدور.',
+'protectedpages' => 'محاÙظه‌‌لی صحیÙه‌‌لر',
+'protectedpages-indef' => 'يالنیز مدتسیز محاÙظه‌‌لر',
+'protectedpages-cascade' => 'یالنیز کاسکاد محاÙظه‌لر',
+'protectedpagestext' => 'آشاغی‌داکی صحیÙه‌لر آد دییشیمینه Ùˆ دَییشدیرمه‌یه باغلی‌دیر',
+'protectedpagesempty' => 'حال-حاضردا بو پارامئتره اویغون هئچ بیر محاÙظه‌لی صحیÙÙ‡ یوخ‌دور',
+'protectedtitles' => 'محاÙظه‌لی باش‌لیق‌لار',
+'protectedtitlestext' => 'آشاغی‌داکی باش‌لیق‌لار یارادیلماغا قارشی قوروما‌لی‌دیر',
+'protectedtitlesempty' => 'حال-حاضردا، بو پارامئترلری قورونان هئچ بیر موضوع یوخ‌دور.',
+'listusers' => 'ایستیÙاده‌چی سیياهیسی',
+'listusers-editsonly' => 'يالنیز دَییشدیرمه ائدن ایستیÙاده‌چیلری گؤستر',
+'listusers-creationsort' => 'يارانما تاریخینه گؤره سیرالا',
+'usereditcount' => '$1 {{PLURAL:$1|دَییشدیرمه}}',
+'usercreated' => '$1 تاریخینده، ساعات $2-ده {{GENDER:$3|یارانیب‌دیر}}',
+'newpages' => 'يئنی صحیÙه‌‌‌لر',
+'newpages-username' => 'ایستیÙاده‌چی آدی:',
+'ancientpages' => 'ان اسکی صحیÙه‌لر',
+'move' => 'آدینی دَییشدیر',
+'movethispage' => 'بو صحیÙه‌‌نین آدینی ديَیشدیر',
+'unusedimagestext' => 'آشاغی‌داکی Ùایل‌لار وار آنجاق هر هانسی بیر صحیÙه‌ده باسدیریلمیش دئییل.
+خاهیش ائدیریک اونوتمایین کی، دیگر web سایت‌لاری بیر Ùایلا بیرباشا بیر اورل ایله علاقه وئره بیلر، Ùˆ بونا گؤره ائÙÙئکتیو ایستیÙاده‌ده اولماسا بئله هله بورادا لیستنبیلیر.',
+'unusedcategoriestext' => 'آشاغیدا اولان بولمه لر مؤوجود اولدوغو حالدا، هئچ بیر مادده یا دا بولمه لر طرÙین‌دن ایستیÙاده ائدیلمیر.',
+'notargettitle' => 'وئریلمه‌يیب',
+'notargettext' => 'بو صحیÙÙ‡ یا یا کاربر حیاتا کئچیرمک اوچون بیر هد٠صحیÙه‌سی یا دا ایستیÙاده‌چی‌سی بئلیرتمئدینیز.',
+'nopagetitle' => 'بئله هد٠صحیÙه‌سی یوخ‌دور',
+'nopagetext' => 'ایÙاده ائتدیگینیز هد٠صحیÙه‌سی مؤوجود دئییل.',
+'pager-newer-n' => '{{PLURAL:$1|بیر داها یئنی|$1 داها یئنی}}',
+'pager-older-n' => '{{PLURAL:$1|بیر داها کؤهنه|$1 داها کؤهنه}}',
+'suppress' => 'باخان',
+'querypage-disabled' => 'Ù¾ÙرÙورمانس اوچون بو اؤزل صحیÙÙ‡ باغلانیب‌دیر.',
+
+# Book sources
+'booksources' => 'کیتاب قایناقلاری',
+'booksources-search-legend' => 'کیتاب قایناقلارین آختار',
+'booksources-go' => 'گئت',
+'booksources-text' => 'آشاغیدا یئنی و ایشلنمیش کیتاب‌لار ساتان خاریجی کئچیدلرده سیز آختاردیغینیز کیتاب حاقیندا علاوه معلومات آلا بیلرسیز:',
+'booksources-invalid-isbn' => 'وئریلن ISBN اعتبارسیز کیمی گؤرونور؛ اورجینال قایناق‌دان کوپیالاما اشکالار اوچون نظارت ائدین.',
+
+# Special:Log
+'specialloguserlabel' => 'ایجراچی',
+'speciallogtitlelabel' => 'مقصد (باش‌لیق Ùˆ یا ایستیÙاده‌چی):',
+'log' => 'قئیدلر',
+'all-logs-page' => 'بوتون اجتماعی قئيدلر',
+'alllogstext' => '{{SITENAME}} اوچون بوتون مؤوجود قئیدلرین بیرگه گؤستریشی.
+قئید نؤوو، ایستیÙاده‌چی آدی Ùˆ یا تأثیر ائدیلمیش صحیÙÙ†ÛŒ سئچمکله داها ایسپئسیÙیک اولا بیلرسینیز.',
+'logempty' => 'ژورنالدا اويغون قئيد تاپیلمادی.',
+'log-title-wildcard' => 'بو متنله باشلایان باش‌لیق‌لاری آختار',
+'showhideselectedlogentries' => 'گؤستریش/گیزلمه سییاهه ده سئچیلمیش‌لر اوچون',
+
+# Special:AllPages
+'allpages' => 'بوتون صحیÙه‌لر',
+'alphaindexline' => '$1-دن $2-یه',
+'nextpage' => 'سونراکی صحیÙه‌‌ ($1)',
+'prevpage' => 'اولکی صحیÙÙ‡ ($1)',
+'allpagesfrom' => 'بو حرÙله باشلایان صحیÙه‌لری گؤستر:',
+'allpagesto' => 'بو حرÙله باشلایان صحیÙÙ‡ لری گؤستر:',
+'allarticles' => 'بوتون صحیÙه‌لر',
+'allinnamespace' => 'بوتون صحیÙه‌لر ($1 صحیÙه‌لری)',
+'allnotinnamespace' => 'بوتون صحیÙه‌لر ( $1 ساحه‌سینده اولمایان‌لار)',
+'allpagesprev' => 'قاباقکی',
+'allpagesnext' => 'سونراکی',
+'allpagessubmit' => 'گئت',
+'allpagesprefix' => 'بورا یازدیغینیز حرÙ‌لرله باشلایان صحیÙه‌لری سیاهی‌سینی:',
+'allpagesbadtitle' => 'گیریلن صحیÙÙ‡ آدی دیل‌لر آراسی علاقه Ùˆ یا wiki آراسی علاقه ائهتیوا ائتدیگین‌دن اعتبارلی دئییل. باش‌لیق‌لاردا ایستیÙاده ائدیلمه‌سی قاداغان اولان بیر یا دا داها چوخ کاراکتئر ائهتیوا ائدیر اولا بیلر.',
+'allpages-bad-ns' => '{{SITENAME}} سایتیندا "$1" آد ساحه‌سی یوخ.',
+'allpages-hide-redirects' => 'یول‌لاندیرمالاری گیزلت',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'سیز بو صÙحه نین بیر نوسخه Ù†ÛŒ گورورسیز Ú©ÛŒ اورتا توتان یئرلشیب دیر Ùˆ مومکین دیر $1 اوچون قاباقدان اولا.',
+'cachedspecial-viewing-cached-ts' => 'سیز ایندی بیر Ú©ÙŽØ´ اولونموش صحیÙه‌یه باخیرسینیز؛ بو صحیÙه‌ده ایندی‌کی ایله Ùرق‌لی اولا بیلر.',
+'cachedspecial-refresh-now' => 'ان سونراکی گورونوش',
+
+# Special:Categories
+'categories' => 'بؤلمه‌لر',
+'categoriespagetext' => 'آشاغی‌داکی {{PLURAL:$1|بولمه لردهٔ|بولمه لرده}} صحیÙه‌لر، یاخود مئدیا-Ùایل‌لار وار.
+[[Special:UnusedCategories|ایستÙاده اولمایان بولمه لر]] بورادا گؤستریلمه‌ییب.
+هم‌چی‌نین، [[Special:WantedCategories|لازیم اولان بولمه لره]] باخین.',
+'categoriesfrom' => 'شونونلا باشلایان بولمه لر باخ:',
+'special-categories-sort-count' => 'میقدارا گؤره تنزیمله',
+'special-categories-sort-abc' => 'الیÙبا سیراسی ایله دوز',
+
+# Special:DeletedContributions
+'deletedcontributions' => 'سیلینمیش ایستیÙاده‌چی چالیشمالاری',
+'deletedcontributions-title' => 'سیلین‌میش ایستیÙاده‌چی چالیشمالاری',
+'sp-deletedcontributions-contribs' => 'Ùالیت',
+
+# Special:LinkSearch
+'linksearch' => 'خاریجی باغلانتی آختار',
+'linksearch-pat' => 'آختاریش اولگوسو:',
+'linksearch-ns' => 'آد Ùضاسی:',
+'linksearch-ok' => 'آختار',
+'linksearch-text' => '«*.wikipedia.org» کیمی نیشانلاری ایشلده بیلرسینیز.
+آزی بیر دنه «*.org» کیمی یوخاری دامنه لازیم‌دیر.<br />
+دستلکلنمیش {{PLURAL:$2|پروتوکول|پروتوکول‌لار}}: <code>$1</code> (بوش بیراخیلسا، http:// نظرده آلیناجاقدیر).',
+'linksearch-line' => '$1، $2-دن باغلانیب‌دیر',
+'linksearch-error' => 'نیشانلار یالنیز آدی اولینده گله بیلرلر.',
+
+# Special:ListUsers
+'listusersfrom' => 'بوندان باشلایاراق ایستیÙاده‌چیلری گؤستر:',
+'listusers-submit' => 'گؤستر',
+'listusers-noresult' => 'هئچ ایستیÙاده‌چی تاپیلمادی.',
+'listusers-blocked' => '(باغلانیب)',
+
+# Special:ActiveUsers
+'activeusers' => 'چالیشان ایستیÙاده‌چیلرین لیستی',
+'activeusers-intro' => 'بوردا سون {{PLURAL:$1|بیر|$1}} گون‌ده بیر ایشلر گؤرن ایستیÙاده‌چیلرین لیستی گؤستریلیر.',
+'activeusers-count' => 'سون {{PLURAL:$3|گون|$3 گون}}‌ده، {{PLURAL:$1|$1}} چالیشما',
+'activeusers-from' => 'بوندان باشلایاراق ایستیÙاده‌چیلری گؤستر:',
+'activeusers-hidebots' => 'بوتلاری گیزلت',
+'activeusers-hidesysops' => 'ایداره‌چیلری گیزلت',
+'activeusers-noresult' => 'هئچ ایستیÙاده‌چی تاپیلمادی.',
+
+# Special:ListGroupRights
+'listgrouprights' => 'ایستیÙاده‌چی قروپ حاقلاری',
+'listgrouprights-summary' => 'آشاغیدا، بو ویکی‌ده تانیلان ایستیÙاده‌چی گروپلاری Ùˆ اونلارین حاقلاری گؤستریلیر.
+تک حاقلار اوچون ده، [[{{MediaWiki:Listgrouprights-helppage}}|آرتیق بیلگیلر]] اولا بیلر.',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">وئریلمیش حاق</span>
+* <span class="listgrouprights-revoked">قایتاریلمیش حاق</span>',
+'listgrouprights-group' => 'قروپ',
+'listgrouprights-rights' => 'حاقلار',
+'listgrouprights-helppage' => 'Help:قروپ حاقلاری',
+'listgrouprights-members' => '(عضولرین لیستی)',
+'listgrouprights-addgroup' => '{{PLURAL:$2|گروپو|گروپلاری}} آرتیر: $1',
+'listgrouprights-removegroup' => '{{PLURAL:$2|گروپو|گروپلاری}} سیل: $1',
+'listgrouprights-addgroup-all' => 'بوتون گروپلاری آرتیر',
+'listgrouprights-removegroup-all' => 'بوتون گروپلاری سیل',
+'listgrouprights-addgroup-self' => '{{PLURAL:$2|گروپو|گروپلاری}} اؤز حسابینا آرتیر: $1',
+'listgrouprights-removegroup-self' => '{{PLURAL:$2|گروپو|گروپلاری}} اؤز حسابیندان سیل: $1',
+'listgrouprights-addgroup-self-all' => 'بوتون گروپلاری اؤز حسابینا آرتیر',
+'listgrouprights-removegroup-self-all' => 'بوتون گروپلاری اؤز حسابیندان سیل',
+
+# Email user
+'mailnologin' => 'گؤندرمه آدرسی یوخدور',
+'mailnologintext' => 'باشقا ایستیÙاده‌چیلره ایمیل گؤندرک اوچون، [[Special:UserLogin|گیریش]] ائدیب Ùˆ [[Special:Preferences|ترجیحلر]]ینیزده گئچرلی ایمیل آدرسی وئرمه‌لیسینیز.',
+'emailuser' => 'بو ایستیÙاده‌چی‌یه ایمیل گؤندر',
+'emailuser-title-target' => 'بو {{GENDER:$1|ایستیÙاده‌چی}}‌یه ایمیل گؤندر',
+'emailuser-title-notarget' => 'ایستیÙاده‌چی‌یه ایمیل گؤندر',
+'emailpage' => 'ایستیÙاده‌چی‌یه ایمیل گؤندر',
+'emailpagetext' => 'آشغیداکی Ùورم‌دان، بو {{GENDER:$1|ایستیÙاده‌چی}}‌یه ایمیل گؤندرمک اوچون ایستیÙاده ائده بیلرسینیز.
+[[Special:Preferences|اؤز ترجیحلرینیز]]ده وئرن ایمیل آدرسی، بو ایمیلین "From" یئرینده گؤستریله‌جک‌دیر و بونا گؤره ایمیلی آلان سیزه موستقیم جاواب گؤندره بیلر.',
+'usermailererror' => 'ایمیل‌دن بو خطا قایتاریلدی:',
+'defemailsubject' => '«$1» آدلی ایستیÙاده‌چی‌دن، {{SITENAME}} ایمیلی',
+'usermaildisabled' => 'ایستیÙاده‌چی ایمیلی باغلی‌دیر',
+'usermaildisabledtext' => 'بو ویکی‌ده باشقا ایستیÙاده‌چیلره ایمیل گؤندره بیلنمه‌سینیز',
+'noemailtitle' => 'ایمیل آدرسی یوخدور',
+'noemailtext' => 'بو ایستیÙاده‌چی، بیر گئچرلی ایمیل آدرسی وئرمه‌ییب‌دیر.',
+'nowikiemailtitle' => 'ایمیل ایجازه‌سی یوخدور',
+'nowikiemailtext' => 'بو ایستیÙاده‌چی، باشقا ایستیÙاده‌چیلردن ایمیل آلماماغینی بیلدیریب‌دیر.',
+'emailnotarget' => 'آلان اوچون، اولمایان یوخسا گئچرسیز ایستیÙاده‌چی آدی.',
+'emailtarget' => 'آلانین ایستیÙاده‌چی آدینی دَییشدیر',
+'emailusername' => 'ایستیÙاده‌چی آدی:',
+'emailusernamesubmit' => 'گؤندر',
+'email-legend' => 'باشقا {{SITENAME}} ایستیÙاده‌چیسینه ایمیل گؤندر',
+'emailfrom' => 'کیم‌دن:',
+'emailto' => 'کیمه:',
+'emailsubject' => 'قونو:',
+'emailmessage' => 'مئساژ',
+'emailsend' => 'گؤندر',
+'emailccme' => 'مئساژیمین بیر کوپیسینی ده منه ایمیل ائت.',
+'emailccsubject' => 'سیزین $1-ه مئساژینیزین کوپی‌سی: $2',
+'emailsent' => 'ایمیل گؤنده‌ریلدی',
+'emailsenttext' => 'ایمیل مئساژینیز گئنده‌ریلدی.',
+'emailuserfooter' => 'بو ایمیل، {{SITENAME}}-ده «ایستیÙاده‌چی‌یه ایمیل گؤندر» ایمکانی ایله، $1-دن $2-Ù‡ گؤنده‌ریلیب‌دیر.',
+
+# User Messenger
+'usermessage-summary' => 'مئساژ گئنده‌ریلدی.',
+'usermessage-editor' => 'سیستÙÙ… مئساژ گؤندَرَنی',
+
+# Watchlist
+'watchlist' => 'ایزله‌دیکلر',
+'mywatchlist' => 'ایزله‌دیکلر',
+'watchlistfor2' => '$1 اوچون $2',
+'nowatchlist' => 'ایزلمه سیاهینیز بؤش‌دور.',
+'watchlistanontext' => 'لطÙاً، ایزلدیگینیز صحیÙه‌لری گؤرمک Ùˆ یا رئداکته ائتمک اوچون $1.',
+'watchnologin' => 'داخیل اولمامیسینیز',
+'watchnologintext' => 'ایزلمه سیاهینیزدا دییشیک‌لیک آپارماق اوچون [[Special:UserLogin|داخیل اولمالیسینیز]].',
+'addwatch' => 'ایزلمه سیاهی‌سینا علاوه ائت',
+'addedwatchtext' => '"[[:$1]]" صحیÙه‌سی [[Special:Watchlist|ایزله‌دیکلرینیزه]] آرتیریلدی. بو صحیÙه‌ده Ùˆ ایلگیلی دانیشیق صحیÙه‌سین‌ده‌کی بوتون دییشیکلیکلر اوردا گؤستریله‌جکلر.',
+'removewatch' => 'بو صحیÙÙ†ÛŒ ایزلدیگیم صحیÙه‌لر سیاهی‌سین‌دان چیخار',
+'removedwatchtext' => '"[[:$1]]" صحیÙه‌سی [[Special:Watchlist|ایزلمه سیاهینیزدان]] چیخاریلدی.',
+'watch' => 'ایزله',
+'watchthispage' => 'بو صÙحه‌نی ایزله',
+'unwatch' => 'ایزله‌مه',
+'unwatchthispage' => 'صحیÙÙ‡ ایزلمیی دایان‌دیر',
+'notanarticle' => 'مضمون صحیÙه‌سی دئییل',
+'notvisiblerev' => 'باشقا ایستیÙادی‌چی‌نین سون دییشیک‌لیگی سیلینیب',
+'watchnochange' => 'گؤستریلن واخت‌دا هئچ بیر ایزله‌دیگینیز صحیÙÙ‡ دَییشدیریلمه‌ییبدیر.',
+'watchlist-details' => 'دانیشیق صÙحه‌لرینی سایمایاراق، {{PLURAL:$1|$1 صÙحه‌نی}} ایزله‌ییرسینیز.',
+'wlheader-enotif' => '* ایمیل مکتوبلا بیلدیریش اولا بیلر.',
+'wlheader-showupdated' => "* سون گؤروشونوزدن سونرا ائدیلن دییشیکلیکلر '''قالین''' گؤستریلیبدیلر.",
+'watchmethod-recent' => 'یئنی دییشیک‌لیک‌لر ایزلنیلن صحیÙه‌لر اوچون یوخلانیلیر',
+'watchmethod-list' => 'ایزلنیلن صحیÙه‌لر یئنی دییشیک‌لیک‌لر اوچون یوخلانیلیر',
+'watchlistcontains' => 'ایزلمه سیاهینیزدا $1 {{PLURAL:$11|صحیÙÙ‡}} وار.',
+'iteminvalidname' => "'$1 ایله باغ‌لی پروبلئم، آدی دوزگون دئییل...",
+'wlnote' => "آشاغیداکی {{PLURAL:$1|'''$1''' ديَیشیک‌لیک|'''$1'''ديَیشیک‌لیک}} سون {{PLURAL:$2|ساعتدا|'''$2''' ساعتدا}} ائدیلمیشدیر.$3، $4",
+'wlshowlast' => 'سون $1 ساعات $2 گون گؤستر $3',
+'watchlist-options' => 'ایزله‌دیکلر سئچمه‌لری',
+
+# Displayed when you click the "watch" button and it is in the process of watching
+'watching' => 'ایزله‌نیلیر...',
+'unwatching' => 'ایزله‌مه...',
+'watcherrortext' => 'ایزلئمئ سیاهی‌سی ترجیحلرینیزی "$1" اوچون دییشدیررکن بیر خطا میدانا گلدی.',
+
+'enotif_mailer' => '{{SITENAME}} بیلدیریش خیدمتی',
+'enotif_reset' => 'باخیلمیش بوتون صحیÙه‌لری ایشاره‌له.',
+'enotif_impersonal_salutation' => '{{SITENAME}} ایستیÙاده‌چی‌سی',
+'enotif_subject_deleted' => '{{SITENAME}} $1 صحیÙه‌سی، {{gender:$2|$2}} ایله سیلینیب‌دیر',
+'enotif_subject_created' => '{{SITENAME}} $1 صحیÙه‌سی، {{gender:$2|$2}} ایله یارانیب‌دیر',
+'enotif_subject_moved' => '{{SITENAME}} $1 صحیÙه‌سی، {{gender:$2|$2}} ایله آدی دَییشیلیب‌دیر',
+'enotif_subject_restored' => '{{SITENAME}} $1 صحیÙه‌سی، {{gender:$2|$2}} ایله قایتاریلیب‌دیر',
+'enotif_subject_changed' => '{{SITENAME}} $1 صحیÙه‌سی، {{gender:$2|$2}} ایله دَییشیلیب‌دیر',
+'enotif_body_intro_deleted' => '{{SITENAME}} صحیÙه‌‌ $1-ÛŒ $PAGEEDITDATE تاریخیمده {{gender:$2|$2}} طرÙیندن سیلینمیشدیر، $3-ÛŒ گؤرون.',
+'enotif_body_intro_created' => '{{SITENAME}} صحیÙه‌‌$1-ای {{gender:$2|$2}} $PAGEEDITDATE-سینده سیلینمیشدیر، جاری يئنیدن باخما اوچون $3-ای گؤر.',
+'enotif_body_intro_moved' => '{{SITENAME}} صحیÙه‌‌$1-ای {{gender:$2|$2}} $PAGEEDITDATE-سینده حرکت ائتدیریلن ØŒ جاری يئنیدن باخما اوچون $3-ای گؤر.',
+'enotif_body_intro_restored' => '{{SITENAME}} $1 صحیÙه‌سی، {{gender:$2|$2}} ایله $PAGEEDITDATE-ده قایتاریلیب‌دیر، سون نوسخه اوچون $3-Ù‡ باخین.',
+'enotif_body_intro_changed' => '{{SITENAME}} $1 صحیÙه‌سی، {{gender:$2|$2}} ایله $PAGEEDITDATE-ده دَییشیلیب‌دیر، سون نوسخه اوچون $3-Ù‡ باخین.',
+'enotif_lastvisited' => 'سونونجو زیارتینیزدن ایندیدک اولان بوتون دییشیک‌لیک‌لری گؤرمک اوچون باخین: $1.',
+'enotif_lastdiff' => 'بو دییشیک‌لیگی گؤرمک اوچون $1 صحیÙه‌سینه باخین.',
+'enotif_anon_editor' => 'قئیدیات‌سیز ایستیÙاده‌چی $1',
+'enotif_body' => 'حؤرمتلی $WATCHINGUSERNAME,
+
+{{SITENAME}} وئب-سايتینداکی $PAGETITLE آدلی صحیÙه‌‌ $PAGETITLE تاریخینده $PAGEEDITOR طرÙیندن $CHANGEDORCREATED. صحیÙه‌‌نین سونونجو وئرسیياسینا باخماق اوچون $PAGETITLE_URL کئچیدیندن ایستیÙاده ائدین.
+
+$نئwپاگئ
+
+ديَیشیکلیگی ائدن ایستیÙاده‌چی‌نین ایضاهی: $PAGESUMMARY $PAGEMINOREDIT
+
+صحیÙه‌‌نی ديَیشدیرن ایستیÙاده‌چی‌نین علاقه‌‌ معلوماتلاری:
+ائ-پوچت:$PAGEEDITOR_EMAIL
+ویکی:$PAGEEDITOR_WIKI
+
+سیز حاقیندا صؤحبت گئدن صحیÙه‌‌يه باخانادک صحیÙه‌‌دکی دیگر ديَیشیکلیکلرله باغلی باشقا بیلدیریش مکتوبو آلماياجاقسینیز. سیز همچی‌نین، ایزله‌مه سیياهینیزداکی بوتون صحیÙه‌‌لرله باغلی بیلدیریش معلوماتلارینی سیله بیلرسینیز.
+
+ {{SITENAME}} سايتی‌نین خبردارلیق سیستمی.
+
+--
+ایزله‌مه سیياهیسی‌نین تنزیمله‌مه‌لرینی ديَیشمک اوچون:
+{{canonicalurl:Special:Watchlist/edit}}
+
+ياردیم Ùˆ تکلیÙلرینیز اوچون:
+{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'یارادیلیب',
+'changed' => 'ديَیشدی',
+
+# Delete
+'deletepage' => 'صحیÙه‌‌نی سیل',
+'confirm' => 'تصدیق ائت',
+'excontent' => "کؤهنه مظمون: '$1'",
+'excontentauthor' => "ترکیب: '$1 (Ùˆ'[[Special:Contributions/$2|$2]]' تاریخچه‌ده Ùالیتی قئید ائدیلن یئگانه ایستیÙاده‌چی‌دیر)",
+'exbeforeblank' => "سیلینمه‌دن اوولکی مزمون: '$1",
+'exblank' => 'صحیÙÙ‡ بوش',
+'delete-confirm' => 'سیل $1',
+'delete-legend' => 'سیل',
+'historywarning' => "'خبردارلیق:' سیلینه‌جک صحیÙه‌نین تاریخچه‌سینده قئید اولونموش $1 {{PLURAL::$1|دییشدیر|دییشدیرمه}} وار:",
+'confirmdeletetext' => 'بو صحیÙÙ‡ Ùˆ یا Ùایل بوتون تاریخچه‌سی ایله بیرلیکده بیردÙه‌لیک سیلینه‌جک. بونو [[{{MediaWiki:Policy-url}}|قایدا‌لارا]] اویغون ائتدیگینیزی Ùˆ عملیاتین نتیجه‌لرینی باشا دوشدوگونوزو تسدیق ائدین.',
+'actioncomplete' => 'چالیشما سوناچاتدی',
+'actionfailed' => 'چالیشما اوغورسوز اولدو',
+'deletedtext' => '"$1" سیلیندی.
+سونونجو سیلینمه‌لره باخ: $2.',
+'dellogpage' => 'سیلمه قئیدی',
+'dellogpagetext' => 'ان سون سیلینمیش صحیÙه‌لرین سیاهی‌سی.',
+'deletionlog' => 'سیلمه سییاهه‌سی',
+'reverted' => 'داها اوولکی وئرسیا برپا ائدیلدی',
+'deletecomment' => 'ندن:',
+'deleteotherreason' => 'باشقا/آرتیق دلیل:',
+'deletereasonotherlist' => 'باشقا سبب',
+'deletereason-dropdown' => '*ساس سیلمه سببی
+** یازان ایستیی
+** یازانلار حقوق پوزونتوسو
+** واندالیزم',
+'delete-edit-reasonlist' => 'سیلمک دلیل‌لرینی دَییشدیر',
+'delete-toobig' => 'بو صحیÙه، $1 {{PLURAL: $1 | دنه دییشیک‌لیک | دنه دییشیک‌لیک}} ایله چوخ اوزون بیر کئچمیشه مالیک‌دیر.
+بئله صحیÙه‌لرین سیلینمه‌سی، {{SITENAME}} سایتینی پوزماماق اوچون مهدودلاشدیریلماقدا‌دیر.',
+'delete-warning-toobig' => 'بو صحیÙه‌‌نین بؤيوک بیر ديَیشیکلیک کئچمیشی وار، $1 {{PLURAL:$1|نسخه| نسخه}} اوزرینده.
+بونو سیلمک {{SITENAME}} عملیاتلارینی مخدل‌ائده‌بیلیر؛
+دیقتله داوام ائدین.',
+
+# Rollback
+'rollback' => 'اوولکی نوسخه لر',
+'rollback_short' => 'اوولکی حالینا قایتار',
+'rollbacklink' => 'گئری‌دؤندر',
+'rollbacklinkcount' => 'گیتیرلمه $1 {{PLURAL:$1|دییشمک |دییشمک}} دییشدیرمه',
+'rollbacklinkcount-morethan' => 'گیتیرلمه آرتیق $1 {{PLURAL:$1|دییشمک |دییشمک}} دییشدیرمه',
+'rollbackfailed' => 'گئری قایتارما اوغورسوزدور',
+'cantrollback' => 'دییشدیر گئری قایتاریلا بیلمز؛ آخیرینجی دییشدیر صحیÙه‌ده اولان یئگانه Ùالیت‌دیر.',
+'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|موزاکیره]] {{int:pipe-separator}} [[Special:Contributions/$2| {{int:contribslink}}]]) طرÙین‌دن [[:$1]] صحیÙه‌سینده ائدیلمیش سون دییشیک‌لیک گئرییه آلینا بیلمیر؛
+باشقا بیری صحیÙه‌ده دییشیک‌لیک ائتدی یا دا صحیÙÙ†ÛŒ گئرییه آلدی.
+
+سون دییشیک‌لیگی ائدن: [[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' => '(ایستیÙاده‌چی آدی چیخاریلمیش) طرÙین‌دن ائدیلن دییشیک‌لیک‌لر [[User:$1|$1]] طرÙین‌دن ائدیلن سون دییشیک‌لییه گئری آلیندی',
+'rollback-success' => '$1 طرÙین‌دن ائدیلمیش دییشدیر‌لر گئری قایتاریلدی؛ $2 طرÙین‌دن یارادیلمیش سون وئرسیا برپا اولوندو.',
+
+# Edit tokens
+'sessionfailure-title' => 'گیریش خطاسی',
+'sessionfailure' => 'گیریش اوتورومونوزلا ایلگی‌لی بیر سورون وار گیبی گؤرونویور؛
+بو ائیلئم، اوتوروم گاسپینا کارشی اؤنلئم اولاراک ایپتال ائدیلدی.
+لوتÙÙ† "گئری" گیدین Ùˆ گئلدیغینیز سایÙایی یئنی‌دئن یوکلئیین، سونرا تئکرار دئنئیین.',
+
+# Protect
+'protectlogpage' => 'قوروما قئیدلری',
+'protectlogtext' => 'آشاغی‌داکی، صحیÙÙ‡ قوروما‌لارینا دییشیک‌لیک‌لرین بیر سیاهی‌سی‌دیر.
+حال-حاضردا تطبیق اولونان صحیÙÙ‡ قوروما‌لاری اوچون [[Special:ProtectedPages| قوروما آلتینا آلینمیش صحیÙه‌لر سیاهی‌سینا]] باخا بیلرسینیز.',
+'protectedarticle' => '«[[$1]]» قوروندو',
+'modifiedarticleprotection' => '"[[$1]]" صحیÙه‌سی اوچون محاÙظه سویه‌سی دییشیلدی',
+'unprotectedarticle' => 'محاÙظه کنارلاشدیریلدی "[[$1]]"',
+'movedarticleprotection' => 'قوروما نیزام‌لاری "[[$2]]" صحیÙه‌سین‌دن "[[$1]]" صحیÙه‌سی داشیندی',
+'protect-title' => '"$1" اوچون محاÙظه سویه‌سی‌نین دییشدیریلمه‌سی',
+'protect-title-notallowed' => '"$1"اوچون محاÙظه سویه‌سی‌نین گؤسترین',
+'prot_1movedto2' => '[[$1]] آدی دییشیلدی. یئنی آدی: [[$2]]',
+'protect-badnamespace-title' => 'آد سیز Ø­Ùظ اولموش Ùضا',
+'protect-badnamespace-text' => 'بو آد ساحه‌سین‌دکی صحیÙه‌لر قورونا.',
+'protect-norestrictiontypes-text' => 'بو صحیÙه‌نی قوروماق اولماز، چون هئچ بیر محدودلاشدیرما نؤوعو ال‌ده یوخدور.',
+'protect-norestrictiontypes-title' => 'قورونا-بیلمه‌ین صحیÙÙ‡',
+'protect-legend' => 'قورومایی تصدیق ائت',
+'protectcomment' => 'ندن:',
+'protectexpiry' => 'زامان بیتدی',
+'protect_expiry_invalid' => 'محاÙظه‌نین بیتمه واختی یانلیش‌دیر.',
+'protect_expiry_old' => 'بیتمه واختی کئچمیش‌دیر.',
+'protect-unchain-permissions' => 'محاÙظه‌نین علاوه پارامئترلرینی آچماق',
+'protect-text' => "سیز '$1 صحیÙه‌سی‌نین محاÙظه سویه‌سینی گؤره Ùˆ دییشه بیلرسینیز.",
+'protect-locked-blocked' => "صحیÙه‌نین بلوک‌لو اولدوغو مدتده سیز محاÙظه سویه‌سینی دییشه بیلمزسینیز.
+'$1 صحیÙه‌سینده حال-حاضردا ائده بیلجیینیز عملیات‌لار بون‌لاردیر:",
+'protect-locked-dblock' => "وئریلن‌لر بازاسی کیلیدلی اولدوغو اوچون محاÙظه سویه‌سی دییشیله بیلمز.
+'$1 صحیÙه‌سینده حال-حاضردا ائده بیلجیینیز عملیات‌لار بون‌لاردیر:",
+'protect-locked-access' => "سیزین حسابینیزین محاÙظه سویه‌سینی دییشمه‌یه ایختیاری یوخ‌دور.
+'$1 صحیÙه‌سینده حال-حاضردا ائده بیلجیینیز عملیات‌لار بون‌لاردیر:",
+'protect-cascadeon' => 'بو صحیÙÙ‡ محاÙظه‌لی‌دیر، چونکی بو صحیÙÙ‡ {{PLURAL:$1|باشقا بیر}} صحیÙه‌دن کاسکاد محاÙظه ائدیلمیش‌دیر. سیز بو صحیÙه‌نین محاÙظه سویه‌سینی دییش‌دیره بیلرسینیز، بو کاسکاد محاÙظه‌یه تأثیر ائتمه‌یه‌جک.',
+'protect-default' => 'بوتون ایستیÙاده‌چی‌لره ایجازه وئر',
+'protect-fallback' => 'یالنیز «$1» ایجازه‌سی اولان ایستیÙاده‌چیلره ایجازه وئر',
+'protect-level-autoconfirmed' => 'یالنیز اوتوماتیک دوغرولانان ایستیÙاده‌چیلره ایجازه وئر',
+'protect-level-sysop' => 'یالنیز ایداره‌چیلره ایجازه وئر',
+'protect-summary-cascade' => 'پیلله‌لی',
+'protect-expiring' => '$1 (UTC)- تاریخینده واختی بیتیر',
+'protect-expiring-local' => '$1-ده بیتیر',
+'protect-expiry-indefinite' => 'سون سوز',
+'protect-cascade' => 'بو صحیÙه‌ده ایستیÙاده ائدیلن بوتون صحیÙه‌لری قوروماغا آل (پیلله‌لی قوروماق)',
+'protect-cantedit' => 'بو صحیÙه‌نین محاÙظه درجه‌سینی دییش‌دیره بیلمزسینیز، چونکی بو دییشیک‌لیک اوچون حقوقونوز یوخ‌دور.',
+'protect-othertime' => 'آیری واخت',
+'protect-othertime-op' => 'باشقا واخت',
+'protect-existing-expiry' => 'مؤوجود بیتیش زامانی: $3، $2',
+'protect-otherreason' => 'باشقا/آرتیق دلیل:',
+'protect-otherreason-op' => 'دیگر سبب',
+'protect-dropdown' => '* عمومی قوروما سبب‌لری
+** حدین‌دن آرتیق واندالیزم
+** حدین‌دن آرتیق هرزه یازماق
+** دییشیک‌لیک دؤیوشو
+** یوکسک تراÙیکه صاحب صحیÙÙ‡',
+'protect-edit-reasonlist' => 'محاÙظت دلیل‌لرینی دَییشدیر',
+'protect-expiry-options' => '1 ساهات:1 hour,1 گون:1 day,1 Ù‡Ùته:1 week,2 Ù‡Ùته:2 weeks,1 Ø¢ÛŒ:1 month,3 Ø¢ÛŒ:3 months,6 Ø¢ÛŒ:6 months,1 ایل:1 year,سون سوز:infinite',
+'restriction-type' => 'حقوقلار',
+'restriction-level' => 'محدودیت درجه‌‌سی:',
+'minimum-size' => 'ان کوچیک بویوت',
+'maximum-size' => 'ان بویوک بویوت',
+'pagesize' => '(بایت)',
+
+# Restrictions (nouns)
+'restriction-edit' => 'دَییشدیر',
+'restriction-move' => 'آدینی دَییشدیر',
+'restriction-create' => 'یارات',
+'restriction-upload' => 'یوکله',
+
+# Restriction levels
+'restriction-level-sysop' => 'تام محاÙظه',
+'restriction-level-autoconfirmed' => '(ياریم-محاÙظه‌‌)',
+'restriction-level-all' => 'ایستنیلن سویه',
+
+# Undelete
+'undelete' => 'سیلینمیش صحیÙه‌‌لری گؤستر',
+'undeletepage' => 'سیلینمیش صحیÙه‌لری گؤستر Ùˆ یا برپا ائت',
+'undeletepagetitle' => "'اشاغی‌داکی، [[:$1|$1]] صحیÙه‌سی‌نین سیلینمیش دییشیک‌لیک‌لرین‌دن ایبارتدیر.",
+'viewdeletedpage' => 'سیلینمیش صحیÙه‌لری گؤستر',
+'undeletepagetext' => 'آشاغی‌داکی {{PLURAL:$1|صحیÙÙ‡|$1 صحیÙÙ‡}} سیلینمیش‌دیر اما هله آرشیودئ‌دیر Ùˆ گئری گتیریله بیلر.
+آرخیو نیزام‌لی اولا‌راق تمیزلمک اولار.',
+'undelete-fieldset-title' => 'دییشیک‌لیک‌لری گئری یوکله',
+'undeleteextrahelp' => "سایÙا‌لارلا بیرلیکده کئچمیشی گئری گتیرمک اوچون تصدیق قوتولارینا توخونمادان 'گئری گتیر!' دویمه‌سینه باسین. صحیÙه‌نین کئچمیشینی آیری-آیری گتیرمک اوچون گئری گتیرمک ایستدیگینیز دییشیک‌لیک‌لرین تصدیق قوتولارینی سئچیب 'گئری گتیر!' دویمه‌سینه باسین. سئچیلن تسدیق قوتولارینی Ùˆ سبب ساحه‌سینی یئنی‌دن قورماق اوچون 'وازگئچ دویمه‌سینه باسین.",
+'undeleterevisions' => '$1 {{PLURAL:$1 | اولوب دیر | اولدولار}} آرشیولئندی',
+'undeletehistory' => 'اگر صحیÙه‌‌نی گئری گتیرسه‌نیز، بوتون رئویزيونلار کئچمیشه گئری گتیریله‌جک.
+سیلیندیکدن سونرا عینی آدلا يئنی بیر صحیÙه‌‌ يارانمیشسا، گئری گلن رئویزيونلار مؤوجود اولان صحیÙه‌‌نین کئچمیشینده گؤرونه‌جک.',
+'undeleterevdel' => 'اگر اوست صحیÙه‌ده سونو چلاناجاقسا یا دا Ùایل رئویزیونو قیسمن سیلینمیش ایسه، سیلمیی گئری آلما تطبیق اولونا بیلمز.
+بئله حال‌لاردا، ان یئنی سیلینن رئویزیونو سئچمملی یا دا گیزلمه سینی قالدیرما‌لی‌دیر.',
+'undeletehistorynoadmin' => 'بو مادده سیلینمیش‌دیر. سیلینمه سببی Ùˆ سیلینمه اولینده ماددنی تشکیل ائدن ایستیÙاده‌چی‌لرین دئتال‌لاری آشاغی‌داکی ایستÙادچی موشخصاتی وئریلمیش‌دیر. بو سیلینمیش‌دیر دییشیک لیک متن‌لری ایسه یالنیز ایداره‌چی‌لر طرÙین‌دن گؤروله بیلر.',
+'undelete-revision' => '$3 طرÙین‌دن $1 صحیÙه‌سی‌نین سیلینمیش دییشدیر ‌سین ($4 تاریخیندئن بری، $5 ساعتدا):',
+'undeleterevision-missing' => 'اعتبارسیز و یا ایتکین نوسخه.
+نوسخه تمیر و یا آرخیو‌دن سیلینمیش اولا بیلر یا دا صاحب اولدوغونوز علاقه اشتباه دیر.',
+'undelete-nodiff' => 'اولکی دَییشمه تاپیلمادی.',
+'undeletebtn' => 'قایتار',
+'undeletelink' => 'باخ/قایتار',
+'undeleteviewlink' => 'باخ',
+'undeletereset' => 'قور',
+'undeleteinvert' => 'سئچیلنی دؤندر',
+'undeletecomment' => 'ندن:',
+'undeletedrevisions' => 'جمعی {{PLURAL:$11|1 دییش|$1 دییشدیر}} گئری قایتاریلدی.',
+'undeletedrevisions-files' => '{{PLURAL:$1|1 نوسخه|$1 نوسخه}} Ùˆ {{PLURAL:$2|1 Ùایل|$2 Ùایل}} برپا ائدیلدی',
+'undeletedfiles' => '{{PLURAL:$1|1 Ùایل|$1 Ùایل}} برپا اولوندو',
+'cannotundelete' => 'برپا ائدیلمه اولمادی
+
+$1',
+'undeletedpage' => "'$1 برپا ائدیلدی
+
+مقاله‌لرین برپا ائدیلمه‌سی و سیلینمه‌سی حاقیندا سون دییشیک‌لیک‌لری نظردن کئچیرمک اوچون [[Special:Log/delete|سیلمه قئیدلرینه]] باخین.",
+'undelete-header' => 'سون سیلینمیش صحیÙه‌لره باخماق اوچون [[Special:Log/delete|سیلمه قئیدلرینه]] باخ.',
+'undelete-search-title' => 'سیلینمیش صحیÙه‌لری آختار',
+'undelete-search-box' => 'سیلینمیش صحیÙه‌لری آختار.',
+'undelete-search-prefix' => 'بونونلا باشلایان صحیÙÙ‡ لری گؤستر:',
+'undelete-search-submit' => 'آختار',
+'undelete-no-results' => 'سیلمه آرخیوینده بیربیریله اؤرتوشن هئچ بیر صحیÙÙ‡ تاپیلمادی.',
+'undelete-filename-mismatch' => 'Ùایلین $1 تاریخ‌لی نوسخه سینی برپا ائتمک مومکون دئییل: Ùایلین آدیندا اویغونسوزلوق',
+'undelete-bad-store-key' => 'Ùایلین $1 تاریخ‌لی نوسخه سینی برپا ائتمک مومکون دئییل: Ùایل سیلینمزدن اول مؤوجود دئییلدی.',
+'undelete-cleanup-error' => 'ایستیÙاده‌سیز "$1" آرشیو Ùایلینین سیلینمه ختاسی.',
+'undelete-missing-filearchive' => '$1 نؤمره‌لی آرشیو Ùایلینی برپا ائتمک مومکون دئییل، چونکی او معلومات بازاسیندا یوخ‌دور. اولا بیلر Ùایل آرتیق برپا اولونوب.',
+'undelete-error' => 'صحیÙÙ‡ برپاسیندا ختا',
+'undelete-error-short' => 'Ùایل سیلینرکن ختا: $1',
+'undelete-error-long' => 'Ùایل سیلینرکن اوزه چیخان ختا‌لار:
+
+$1',
+'undelete-show-file-confirm' => '"<nowiki>$1</nowiki>" Ùایلینین $2 $3 تاریخ‌لی سیلینمیش بیر دییشدیر ‌سینی گؤرمک ایستدیگینیزدن اطمیناننیز وار می؟',
+'undelete-show-file-submit' => 'بلی',
+
+# Namespace form on various pages
+'namespace' => 'آد Ùضاسی:',
+'invert' => 'سئچیلنی دؤندر',
+'tooltip-invert' => 'بو قوتونی علامتله یین تا انتخاب اولان آد Ùضا سینین ایچری صحیÙÙ‡ لری دییشیک لیک لری(Ùˆ اوبیری علامتلنمیش Ùضالار) گیزله نه آدی',
+'namespace_association' => 'علاقه‌لی آد ساحه‌سی',
+'tooltip-namespace_association' => 'بو قوتونو علامت له ین یالنیز آد بحث Ùضاسی یا مرتبط اولان آد Ùضاسی ایله انتخاب اولا',
+'blanknamespace' => '(آنا)',
+
+# Contributions
+'contributions' => '{{GENDER:$1|ایستیÙاده‌چی}} چالیشمالاری',
+'contributions-title' => '$1 ایستیÙاده‌چی چالیشمالاری',
+'mycontris' => 'چالیشمالار',
+'contribsub2' => '$1 اوچون ($2)',
+'nocontribs' => 'بو موشخصاتا اویغون دییشدیر تاپیلمادی',
+'uctop' => '(یوخاری)',
+'month' => 'بو آی‌دان (و اؤنجه‌سی):',
+'year' => 'بو ایل‌دن (و اؤنجه‌سی):',
+
+'sp-contributions-newbies' => 'یالنیز یئنی ایستیÙاده‌چیلرین چالیشمالارینی گؤستر',
+'sp-contributions-newbies-sub' => 'یئنی ایستیÙاده‌چی‌لر اوچون',
+'sp-contributions-newbies-title' => 'یئنی حساب‌لار اوچون ایستیÙاده‌چی Ùالیت‌لری',
+'sp-contributions-blocklog' => 'باغلاما قئیدلری',
+'sp-contributions-deleted' => 'سیلینمیش ایستیÙاده‌چی چالیشمالاری',
+'sp-contributions-uploads' => 'یوکله‌نَنلر',
+'sp-contributions-logs' => 'قئیدلر',
+'sp-contributions-talk' => 'دانیشیق',
+'sp-contributions-userrights' => 'ایستیÙاده‌چی حاقلارین ایداره‌ ائتمه‌سی',
+'sp-contributions-blocked-notice' => 'بو ایستیÙاده‌چی حال-حاضردا بلوکلانمیش‌دیر.
+بلوکلاما قئیدلری‌نین سونونجوسو آشاغیدا گؤستریلمیش‌دیر:',
+'sp-contributions-blocked-notice-anon' => 'بو آی پی-عنوان حال-حاضردا باغلانمیش ‌دیر.
+بالانما قئیدلری‌نین سونونجوسو آشاغیدا گؤستریلمیش‌دیر:',
+'sp-contributions-search' => 'چالیشمالاری آختار',
+'sp-contributions-username' => 'آی‌پی آدرسی ویا ایستیÙاده‌چی آدی:',
+'sp-contributions-toponly' => 'تکجه سون نوسخه اولان دییشیکلری گؤستر',
+'sp-contributions-submit' => 'آختار',
+
+# What links here
+'whatlinkshere' => 'بو صحیÙه‌یه باغلانتیلار',
+'whatlinkshere-title' => '«$1»-Ù‡ باغلانان صحیÙه‌لر',
+'whatlinkshere-page' => 'صحیÙÙ‡:',
+'linkshere' => "آشاغیداکی صحیÙه‌لر '''[[:$1]]'''-Ù‡ باغلانیب:",
+'nolinkshere' => "'''[[:$1]]'''-Ù‡ هئچ بیر صحیÙÙ‡ باغلانماییب‌دیر.",
+'nolinkshere-ns' => "سئچیلمیش آدÙضاسیندا، هئچ صحیÙÙ‡ '''[[:$1]]'''-Ù‡ باغلانتی‌سی یوخدور.",
+'isredirect' => 'یوللاندیرما صحیÙه‌سی',
+'istemplate' => 'داخیل اولموش',
+'isimage' => 'Ùایلا باغلانتی',
+'whatlinkshere-prev' => '{{PLURAL:$1|اؤنجه‌کی|اؤنجه‌کی $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|سونراکی|سونراکی $1}}',
+'whatlinkshere-links' => '↠باغلانتیلار',
+'whatlinkshere-hideredirs' => 'یول‌لاندیرمالاری $1',
+'whatlinkshere-hidetrans' => 'علاوه‌لری $1',
+'whatlinkshere-hidelinks' => 'باغلانتیلاری $1',
+'whatlinkshere-hideimages' => 'Ùایل باغلانتیلارینی $1',
+'whatlinkshere-filters' => 'سۆزگَجلر',
+
+# Block/unblock
+'autoblockid' => 'اوتوماتیک باغلانما #$1',
+'block' => 'ایستیÙادچینی باغلاما',
+'unblock' => 'ایستیÙاده‌چی‌نین باغلانماسین گؤتور',
+'blockip' => 'ایستیÙاده Ú†ÛŒ Ù†ÛŒ باغلا',
+'blockip-title' => 'ایستیÙادچی Ù†ÛŒ باغلا',
+'blockip-legend' => 'ایستیÙادچی Ù†ÛŒ باغلا',
+'blockiptext' => 'آشاغی‌داکی Ùورمو ایستیÙاده ائده‌رک مویین بیر ایپنین Ùˆ یا قئیدیات‌دان کئچمیش ایستیÙاده‌چی‌نین دییشیک‌لیک ائتمه‌سینی مانعه تؤره‌ده بیلرسینیز. بو یالنیز واندالیزمی قارشی‌سینی آلماق اوچون Ùˆ [[{{MediaWiki:Policy-url}}|قایدا‌لارا]] اویغون اولا‌راق ائدیلمه‌لی. آشاغییا موتلق قاداغا ایله علاقه‌دار بیر شرح یازین. (نومونه:-بو-صحیÙه‌لرده واندالیزم ائتمیش‌دیر).',
+'ipadressorusername' => 'Ø¢ÛŒ-Ù¾ÛŒ عونوانی Ùˆ یا ایستیÙاده‌چی آدی',
+'ipbexpiry' => 'بیتمه مدتی:',
+'ipbreason' => 'ندن:',
+'ipbreasonotherlist' => 'باشقا سبب',
+'ipbreason-dropdown' => '*باغلانما سبب‌لری:
+** یالان معلومات‌لارین علاوه ائدیلمه‌سی
+** صحیÙه‌نین مزمونونون سیلینمه‌سی
+** خاریجی سایت‌لارا ایسپام-کئچیدلر
+** صحیÙه‌یه معنا‌سیز Ùˆ یارارسیز علاوه‌لره گؤره
+** حده و تعقیب‌لره گؤره
+** تحقیره گؤره
+** چوخسای‌لی حساب‌دان سوی ایستیÙاده‌یه گؤره
+** قاداغان اولونموش ایستیÙاده‌چی آدینا گؤره',
+'ipb-hardblock' => 'بو ای Ù¾ÛŒ-ده ایجلاس آچمیش ایستیÙاده‌چی‌لرین دییشیک‌لیک ائتمه‌سینی تدبیر',
+'ipbcreateaccount' => 'حساب آچمانی محدودلاش‌دیر',
+'ipbemailban' => 'ایستیÙاده‌چی‌نین ایمیل گؤندرمه‌سینه مانع اول',
+'ipbenableautoblock' => 'مؤوجود اولان مانعه تؤرتمه‌لری گؤستر...',
+'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',
+'ipbotheroption' => 'آیری',
+'ipbotherreason' => 'آیری سبب/آرتیق:',
+'ipbhidename' => 'ایستیÙاده‌چی آدینی دییشدیر‌لرده Ùˆ سیاهی‌لاردا گیزلت',
+'ipbwatchuser' => 'بو ایستیÙاده‌چی‌نین دانیشیق Ùˆ ایستیÙاده‌چی صحیÙه‌سینی ایزله',
+'ipb-disableusertalk' => 'بو ایستیÙاده‌چی باغلی اولارکن اؤز دانیشیق صحیÙه‌سینده دییشدیر ائتمه‌سینی اوز الیله قاباقین آلما',
+'ipb-change-block' => 'بو سبب‌لرله ایستیÙادچینی یئنی‌دن باغلا',
+'ipb-confirm' => 'بلوکو تصدیقله',
+'badipaddress' => 'سهو آی پی',
+'blockipsuccesssub' => 'باغلاندی',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] باغلاندی.<br />
+باخ [[Special:BlockList|آی پی باغلانماق سیاهی‌سی]] باغلانمیش آی پ-لر.',
+'ipb-blockingself' => 'اؤزونوزو باغلاماق حالیندا سیز.! بونو ائتمک ایستدیگینیزدن اطمینانییز وار می؟',
+'ipb-confirmhideuser' => 'ایستیÙادچینی باغلاماق Ùˆ دییشدیر سیاهی‌سین‌دان اونون آدینی سیلمک اوزرسینیز. بونو ائتمک ایستدیگینیزدن اطمینانیز وار می؟',
+'ipb-edit-dropdown' => 'باغلاما سبب‌لرینی دییشدیر',
+'ipb-unblock-addr' => '$1 آچیلدی',
+'ipb-unblock' => 'ایستیÙاده Ú†ÛŒ نین یا دا Ø¢ÛŒ Ù¾ÛŒ نین آچیلماسی',
+'ipb-blocklist' => 'مؤوجود بلوکلاری گؤستر',
+'ipb-blocklist-contribs' => '$1 ایستیÙاده‌چی Ùعالیتلری',
+'unblockip' => 'ایستیÙاده‌چی‌نین باغلانماسین گؤتور',
+'unblockiptext' => 'اولجه‌دن باغلانمیش بیر ای Ù¾ÛŒ عنوانینا Ùˆ یا ایستیÙاده‌چی آدینا یازما گئری وئرمک اوچون آشاغی‌داکی Ùورمادا ایستیÙاده ائدین.',
+'ipusubmit' => 'بو بلوکو گؤتور',
+'unblocked' => '[[User:$1|$1]] - نین بلوکو گؤتورولدو',
+'unblocked-range' => '$1-نین بلوکو گؤتورولدو',
+'unblocked-id' => '$1-نین بلوکو گؤتورولدو',
+'blocklist' => 'بلوکلانمیش ایستیÙاده‌چیلر',
+'ipblocklist' => 'باغلانمیش ایستیÙاده‌چیلر',
+'ipblocklist-legend' => 'بلوکلانمیش ایستیÙاده‌چینی آختار',
+'blocklist-userblocks' => 'حساب بلوکلارینی گیزلت',
+'blocklist-tempblocks' => 'مووققتی بلوکلاری گیزله',
+'blocklist-addressblocks' => 'تک ای‌پی بلوکلارینی گیزله',
+'blocklist-rangeblocks' => 'ایندیکی بلوکلاری گیزله',
+'blocklist-timestamp' => 'واخت',
+'blocklist-target' => 'هدÙ',
+'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' => 'دانیشیق صحیÙه‌‌سینی دَییشدیره بیلمزسیز.',
+'ipblocklist-empty' => 'بلوک سیياهیسی بوشدور.',
+'ipblocklist-no-results' => 'طلب اولونان ای‌پی اونوانی Ùˆ يا ایستیÙاده‌چی بلوکلانمادی.',
+'blocklink' => 'باغلا',
+'unblocklink' => 'بلوکلامانی قالدیر',
+'change-blocklink' => 'بلوکلامانی ديَیشدیر',
+'contribslink' => 'چالیشمالار',
+'emaillink' => 'ایمیل گؤندر',
+'autoblocker' => 'آوتوماتیک اولا‌راق باغلانمیسینیز. چونکی، قیسا مدت اول سیزین ای Ù¾ÛŒ-عنوانینیز "آوتوماتیک اولا‌راق بلوکلانمیسینیز. چونکی، قیسا مدت اول سیزین ایپ-اونوانینیز "[[User:$1|$1]]" طرÙین‌دن ایستیÙاده ائدیلمیش‌دیر.
+$1 آدلی ایستیÙاده‌چی‌نین باغلانما سببی: "$2"',
+'blocklogpage' => 'باغلاما قئیدلری',
+'blocklog-showlog' => 'بو ایستیÙاده‌چی داها اول بلوکلانمیش‌دیر. بلوکلاما گونده‌لیگی رئÙئرانس اوچون آشاغیدا گؤستریلیب:',
+'blocklog-showsuppresslog' => 'بو ایستیÙاده‌چی داها اول باغلانمیش‌دیر. باغلانما گونده‌لیگی رئÙئرانس اوچون آشاغیدا گؤستریلیب:',
+'blocklogentry' => '[[$1]]-ی $2 واختینه قدر بلوْکلادی $3',
+'reblock-logentry' => '[[$1]] اوچون سون تاریخی $2 $3 اولماق اوزره بلوک پارامئترلری دییشدیریلدی',
+'blocklogtext' => 'ایستیÙاده‌چی‌لرین باغلانماسی Ùˆ باغلانماقین گؤتورولمه‌سی سیاهی‌سی.
+آوتوماتیک باغلانمیش ای پی-عنوان‌لار بورادا گؤستریلمیر.
+حال-هازیرکی [[Special:BlockList|قاداغا‌لارین و بلوکلاما‌لارین سیاهی‌سی]]نا باخ.',
+'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-angry-autoblock' => 'آوتوبلوک قوووه‌ددیر',
+'block-log-flags-hiddenname' => 'ایستیÙاده‌چی آدی گیزلی‌دیر',
+'range_block_disabled' => 'ایداره‌چیلره دیاپازونو بلوکلاماق قاداغاندیر.',
+'ipb_expiry_invalid' => 'بیتمه واختی سهودیر',
+'ipb_expiry_temp' => 'گیزلی ایستیÙاده‌چی آدی بلوکلاما‌لاری مدت‌سیز اولما‌لی‌دیر.',
+'ipb_hide_invalid' => 'ایستیÙاده‌چی هئسابینلن گیزلدیلمه‌سی قئیری-مومکون‌دور؛ حددن چوخ رئداکته‌سی وار.',
+'ipb_already_blocked' => '"$1" آرتیق بلوکلانیب',
+'ipb-needreblock' => '$1 آرتیق باغلانیب.
+باغلاما شرط‌لرینی دییشمک ایستییرسینیز؟',
+'ipb-otherblocks-header' => 'آیری {{PLURAL:$1|باغلانماا|باغلاما‌لار}}',
+'unblock-hideuser' => 'ایستیÙاده‌چی آدی گیزلی اولدوغو اوچون، بی باغلامانی گؤتوره بیلمزسینیز.',
+'ipb_cant_unblock' => 'ختا: باغلاما آی دی سی $1 تاپیلمادی. باغلامانین گؤتورولمه‌سی مومکون‌دور.',
+'ipb_blocked_as_range' => 'خطا: $1 ای پی عنوانی بیرباشا مانعه و مانعه تؤرتمه آزالدیلماسینا یول وئریلمیر.
+آنجاق، بو عنوان $2 آرا‌لیغینین پارچاسی اولا‌راق مانعه تؤردیلمیش، دئکابر مانعه تؤرتمه‌سینی قال‌دیرا.',
+'ip_range_invalid' => 'یانلیش ای پی',
+'ip_range_toolarge' => '/ $1 بلوک‌دان داها بؤیوک بازه باغلانمالارینا ایجازه وئریلمیر.',
+'blockme' => 'منی باغلا',
+'proxyblocker' => 'پروکسی باغلییان',
+'proxyblocker-disabled' => 'بو ایش باغلانیب دیر.',
+'proxyblockreason' => 'ای پی آدرئسینیز آچیق بیر پروکسی اولدوغو اوچون مانعه تؤردیلدی.
+خاهیش ائدیریک اینتئرنئت سئویش تعمین ایله یا دا تئکنیکی دستک ایله علاقه قورون و بو جدی تهلوکه‌سیزلیک پروبلئمین‌دن خبردار ائدین.',
+'proxyblocksuccess' => 'اولدو.',
+'sorbsreason' => 'ای Ù¾ÛŒ عنوانینیز، {{SITENAME}} سایتی طرÙین‌دن ایستیÙاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش.',
+'sorbs_create_account_reason' => 'ایپ اونوانینیز {{SITENAME}} سایتی طرÙین‌دن ایستیÙاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش.
+حساب میدانا گتیره بیلمز',
+'cant-block-while-blocked' => 'سیز ائنگئللیيکئن باشقا ایستیÙاده‌چیلری مانعه تؤره‌ده بیلمزسینیز.',
+'cant-see-hidden-user' => 'قارشیسینی آلماق ایسته‌دیگینیز ایستیÙاده‌چی اونسوز دا مانعه تؤره‌دیلمیش Ùˆ گیزلنمیش. کوللانیجیگیزلئ ایجازه‌نیز اولمادیغی اوچون، ایستیÙاده‌چی‌نین قارشیسی‌نین آلینماسینی گؤره بیلمز يا دا ديَیشدیره.',
+'ipbblocked' => 'دیگر ایستیÙاده‌چیلری مانعه تؤره‌ده بیلمز يا دا مانعه تؤرتمه‌سینی قالدیرا بیلمز، چونکی اؤزونوز ائنگئللئنمیشسیز',
+'ipbnounblockself' => 'اؤز بوولوکلانمانیزی کالدیرمانیزا ایجازه وئریلمیر',
+
+# Developer tools
+'lockdb' => 'وئریلن‌لر بازاسینی باغلا',
+'unlockdb' => 'وئریلن‌لر بازاسین‌دان باغلانتی سین گؤتور',
+'lockdbtext' => 'وئریلنلر بازاسینی کیلیدله‌مک؛ بوتون ایستیÙاده‌چیلرین صحیÙه‌‌لری، سئچیملرینی Ùˆ ایزلئمئ سیياهیلارینی ديَیشدیرمه‌لرینی Ùˆ وئریلنلر بازاسیندا ديَیشیکلیک طلب ائدن دیگر شئيلری تخیره آلیر.
+خاهیش ائدیریک ائتمک ایسته‌دیگینیزین بو اولدوغونو و باخیم ایشلرینیز بیتدیگینده وئریلنلر بازاسینی ایشه سالماغی تسدیق ائدین.',
+'unlockdbtext' => 'وئریلنلر بازاسی‌نین کیلیدینی آچماق؛ بوتون ایستیÙاده‌چیلره صحیÙه‌‌لری، سئچیملرینی Ùˆ ایزلئمئ سیياهیلارینی ديَیشدیرمه‌لرینی Ùˆ وئریلنلر بازاسیندا ديَیشیکلیک طلب ائدن دیگر شئيلری ائده بیلمه قابیلیتینی گئری وئرر.
+خاهیش ائدیریک ائتمک ایسته‌دیگینیزین بو اولدوغونو تسدیق ائدین.',
+'lockconfirm' => 'بلی، من حقیقتن وئریلن‌لر بازاسینین باغلاماق ایستییرم.',
+'unlockconfirm' => 'بلی، من حقیقتن وئریلن‌لر بازاسینین باغلانمانی آچماق ایستییرم.',
+'lockbtn' => 'وئریلن‌لر بازاسینی باغلا',
+'unlockbtn' => 'وئریلن‌لر بازاسین‌دان باغلانتی سین گؤتور',
+'locknoconfirm' => 'تصدیق قوتوسونو سئچمئدینیز.',
+'lockdbsuccesssub' => 'وئریلن‌لر بازاسی باغلانیب',
+'unlockdbsuccesssub' => 'باغلانما وئریلن‌لر بازاسی گوتورلنیب',
+'lockdbsuccesstext' => 'وئریلن‌لر بازاسی کیلیدلندی. <br />
+باخیمین ایشلرینیز بیتدیگینده وئریلن‌لر بازاسینین [[Special:UnlockDB| کیلیدینی آچماغی]] اونوتمایین.',
+'unlockdbsuccesstext' => 'وئریلن‌لر بازاسی باغلانمیش آولا بیلر.',
+'lockfilenotwritable' => 'وئریلن‌لر بازاسی کیلیدلمه Ùایلی یازیلا دئییل.
+بو، وئریلن‌لر بازاسینی کیلیدله‌ییب آچا بیلمک اوچون، وئب سئروئری طرÙین‌دن یازیلا اولما‌لی‌دیر.',
+'databasenotlocked' => 'وئریلن‌لر بازاسی باغلانماییب.',
+'lockedbyandtime' => '({{Gender: $1 | $1}} طرÙین‌دن $2 $3 اعتبار ایله)',
+
+# Move page
+'move-page' => '$1 داشینیر',
+'move-page-legend' => 'صحیÙه‌نین آدینی دییش',
+'movepagetext' => "آشاغی‌داکی Ùورمدان ایستیÙاده ائتمک، صحیÙه‌نین آدینی، بوتون تاریخچه‌سینی ده کؤچورمک‌له، یئنی باشلیغا دییشه‌جک.
+اسکی باشلیق یئنی باشلیغا یول‌لاندیریلاجاق‌دیر.
+اسکی صحیÙه‌یه اولان یول‌لاندیرماقلاری، اوتوماتیک گونجل‌له‌یه بیلرسینیز.
+بو سئچیمی ائتمه‌دیگینیز حالدا، [[Special:DoubleRedirects|تکرارلانان]] و یا [[Special:BrokenRedirects|قیریق یول‌لاندیرمالاری]] یوخلاماغی یاددان چیخارمایین.
+باغلانتیلاری اویغون یئره یول‌لاندیرماسیندان آرخایین اولماق، سیزین مسئولیتینیزده‌دیر.
+
+نظره آلین کی، هد٠باشلیق آلتیندا بیر صحیÙÙ‡ مؤوجود اولسا، یئردییشمه '''باش توتمایاجاق'''ØŒ مگر بوکی او سونراکی صحیÙÙ‡ یول‌لاندیرما اولا Ùˆ اؤنجه دَییشمه گئچمیشی ده اولمایا. بو او دئمک‌دیر کی، سهواً آدینی دییشدیگینیز صحیÙه‌لری گئری قایتارا بیلمک اولار، بونونلا یاناشی آرتیق مؤوجود اولان صحیÙه‌نین اوزرینه باشقا صحیÙÙ‡ یازا بیلمزسینیز.
+
+'''خبردارلیق!'''
+بو یئردییشمه مشهور صحیÙÙ‡ اوچون اساس‌لی Ùˆ گؤزلنیلمز اولا بیلر؛ اونا گؤره ده بو دییشیک‌لیگی یئرینه یئتیرمزدن اول، بونون مومکون نتیجه‌لرینی باشا دوشدوگونوزدن آرخایین اولون.",
+'movepagetext-noredirectfixer' => "آشاغی‌داکی Ùورمو دول‌دورماق بیر صحیÙÙ†ÛŒ یئنی‌دن آدلاندیریر، بوتون کئچمیشینی یئنی آدا داشیییر.
+کؤهنه مؤوزو یئنی باشلیغا بیر ایستیقامتلندیرمه صحیÙه‌سی اولار.
+[[Special:DoubleRedirects|جوت]] یا دا [[Special:BrokenRedirects|نوزوک ایستیقامتلندیرمه‌لر]] صحیÙه‌لرینی ایداره ائدین.
+علاقه‌لرین گئتمه‌لری لازیم اولان یئرلره گئتدیک‌لرینی عمین اولماق سیزین سوروملولوغونوزدا‌دیر.
+
+یئنی باش‌لیقدا مؤوجود بیر صحیÙÙ‡ وارسا، بوش یا دا بیر ایستیقامتلندیرمه اولمادیقجا Ùˆ دییشیک‌لیک کئچمیشی اولمادیغی تق‌دیرده، سهی٠'تاشینمایاجاکتیر.
+بو بو معنانی وئرر، بیر صحیÙÙ†ÛŒ اشتباه ائتسه‌نیز صحیÙÙ†ÛŒ کؤهنه آدییلا یئنی‌دن آدلان‌دیرا بیلریک، بو مؤوجود صحیÙه‌نین اوزرینه یازماز.
+
+' 'خبردارلیق!'
+بو مشهور بیر صحیÙÙ‡ اوچون تأثیرلی Ùˆ گؤزلنیلمز بیر دییشیک‌لیک اولا بیلر؛
+خاهیش ائدیریک راتیÙیکاسیا ائتمه‌دن اول بونون نتیجه‌لرینی آنلادیغینیزدان امین اولون.",
+'movepagetalktext' => "اویغون دانیشیق صحیÙه‌سی آوتوماتیک حرکت ائده‌جک 'گر:'
+* بوش اولمایان دانیشیق صحیÙه‌سی یئنی آدلا آرتیق مؤوجوددورسا، Ùˆ یا
+* سیز بایراغی آشاغی‌دان گؤتورسه‌نیز.
+
+همین حال‌لاردا ØŒ احتیاج یارانارسا سیز صحیÙه‌لری الله بیرلش‌دیرمک مجبوریتینده قالاجاقسینیز",
+'movearticle' => 'صحیÙه‌نین آدینی دییش‌دیر',
+'moveuserpage-warning' => "' 'خبردارلیق:' بیر ایستیÙاده‌چی صحیÙه‌سینی داشیماق اوزرسینیز. خاهیش ائدیریک یالنیز صحیÙه‌نین تاشیناجاغینا، آنجاق ایستیÙاده‌چی‌نین یئنی‌دن آدلاندیریلمایاجاغینا دقت ائدین.",
+'movenologin' => 'سیستئمده دئییلسینیز',
+'movenologintext' => 'صحیÙه‌نین آدینی دییشیک‌لیک اوچون قئیدیات‌لی Ùˆ [[Special:UserLogin|سیستئمه]] داخیل اولمانیز لازیم‌دیر.',
+'movenotallowed' => 'سیز صحیÙه‌لرین آدینی دییشه بیلمزسینیز.',
+'movenotallowedfile' => 'سیز Ùایل‌لارین آدینی دییشه بیلمزسینیز.',
+'cant-move-user-page' => 'ایستیÙاده‌چی صحیÙه‌لری‌نین آدینی دییشه بیلمزسینیز (باش‌لیق‌لاردان باشقا).',
+'cant-move-to-user-page' => 'بیر صحیÙنی، بیر ایستیÙاده‌چی صحیÙه‌سینه داشیماغا ایجازه وئریلمیر (بیر ایستیÙاده‌چی آلتسایÙاسی خاریجینده).',
+'newtitle' => 'یئنی باش‌لیق',
+'move-watch' => 'بو صحیÙÙ†ÛŒ ایزله',
+'movepagebtn' => 'صحیÙه‌نین آدینی دییش',
+'pagemovedsub' => 'یئردییشمه ائدیلمیش‌دیر',
+'movepage-moved' => '\'"$1" صحیÙه‌سی "$2" صحیÙه‌سینه یئرلشدیریلمیشدیر',
+'movepage-moved-redirect' => 'یؤنلندیرمه یارادیلدی.',
+'movepage-moved-noredirect' => 'یؤنلندیرمه‌نین یارادیلماسینین قارشییس آلیندی.',
+'articleexists' => 'بو آددا صحیÙÙ‡ آرتیق مؤوجوددور Ùˆ یا سیزین سئچدیگینیز آد اویغون دئییل.
+زحمت اولماسا باشقا آد سئچین.',
+'cantmove-titleprotected' => 'بیر صحیÙÙ†ÛŒ بو مؤوقئیه داشییا بیلمز، چونکی یئنی موضونون یارادیلماسی قورونور',
+'talkexists' => "'صحیÙه‌نین آدی دییشدی، لاکین دانیشیق صحیÙه‌سی یئنی آدلا اولدوغو اوچون دییشه بیلمیر. زحمت اولماسا، اونون آدینی اؤزونوز دییشین.'",
+'movedto' => 'داشیندی :',
+'movetalk' => 'بو صحیÙه‌نین دانیشیق صحیÙه‌سی‌نین ده آدینی دییش‌دیر.',
+'move-subpages' => 'یاریم صحیÙه‌لری کؤچور ($1-ا قدر)',
+'move-talk-subpages' => 'دانیشیق صحیÙه‌لری‌نین آلت صحیÙه‌لرینی کؤچور ($1-ا قدر)',
+'movepage-page-exists' => '$1 مادده‌سی اونسوز دا وار اولماقدا‌دیر، و آوتوماتیک اولا‌راق یئنی‌دن یازیلا بیلمز.',
+'movepage-page-moved' => '$1 صحیÙه‌سی $2 صحیÙه‌سینه کؤچورولوب.',
+'movepage-page-unmoved' => '$1 صحیÙه‌سی $2 صحیÙه‌سینه کؤچوروله بیلینمیر.',
+'movepage-max-pages' => 'ان چوخ $1 {{PLURAL:$1|صحیÙÙ‡ |صحیÙÙ‡}} داشیندی Ùˆ داها چوخو آوتوماتیک اولا‌راق تاشیناماز.',
+'movelogpage' => 'آد ديیشدیرمک قئیدی',
+'movelogpagetext' => 'آشاغیدا اولان سیاهی آدی دییشدیریلمیش صحیÙه‌لری گؤستریر.',
+'movesubpage' => '{{PLURAL:$1|آلتینداکی صحیÙÙ‡}}',
+'movesubpagetext' => 'بو صحیÙه‌نین آشاغیدا گؤستریلن $1 {{PLURAL: $1 | آلت صحیÙÙ‡ سی | آلت صحیÙÙ‡ اسی}} وار.',
+'movenosubpage' => 'بو صحیÙه‌نین آلت صحیÙه‌سی یوخ‌دور.',
+'movereason' => 'ندن:',
+'revertmove' => 'قایتار',
+'delete_and_move' => 'سیل و آپار',
+'delete_and_move_text' => '==هازیرکی مقاله‌نین سیلینمه‌سی لازیم‌دیر==
+
+«[[:$1]]» مقاله‌سی مؤوجوددور. بو دییشیکلیگین یئرینه یئتیریله بیلمه‌سی اوچون همین مقاله‌نین سیلینمه‌سینی ایستییرسینیزمی؟',
+'delete_and_move_confirm' => 'بلی، صحیÙÙ†ÛŒ سیل',
+'delete_and_move_reason' => '«[[$1]]» آد دَییشمه ‌یه یئر آچماق اوچون سیلینمیش‌دیر',
+'selfmove' => 'صحیÙه‌نین هازیرکی آدی ایله دییشمک ایستنیلن آد عینی‌دیر. بو عملیات یئرینه یئتیریله بیلمز.',
+'immobile-source-namespace' => '"$1" آد آرالیغیندا صحیÙÙ‡ آدلاری دییشمیر.',
+'immobile-target-namespace' => 'سهی‌لرین "$1" آد آرا‌لیغینا داشینماسی قئیری-مومکون‌دور',
+'immobile-target-namespace-iw' => 'ویکیلر اراسی علاقه، صحیÙÙ‡ داشیماسی اوچون اعتبارلی بیر هد٠دئییل.',
+'immobile-source-page' => 'بو صحیÙه‌نین آدی دییش‌دیریله بیلمز.',
+'immobile-target-page' => 'بو هد٠باش‌لیغینا داشینمیر.',
+'bad-target-model' => 'هد٠Ùرق‌لی بیر مزمون مودئل ایستیÙاده ائدیر. $1 $2 مومکون دئییل.',
+'imagenocrossnamespace' => 'قئيری-Ùايل آد ایماگئ کؤچورمه يوخدور',
+'nonfile-cannot-move-to-file' => 'Ùایل اولمایان‌لار، Ùایل آد ساحه‌سینه تاشیناماز',
+'imagetypemismatch' => 'یئنی Ùایل علاوه‌سی تیپیله بیربیر لر ایله دوز دئمیر',
+'imageinvalidfilename' => 'سئچیلمیش Ùایل آدی کئچرسیزدیر.',
+'fix-double-redirects' => 'اوریژینال باشلیغا ایشاره ائدن گیزلت یوکله',
+'move-leave-redirect' => 'آرخادا بیر ایستیقامتلندیرمه بوراخ',
+'protectedpagemovewarning' => "'''خبردارلیق:''' بو صحیÙÙ‡ محاÙظه ائدیلدیگی اوچون اونون آدینی یالنیز ایداره‌چی‌لر دییشه بیلرلر.",
+'semiprotectedpagemovewarning' => "'''قئید:' بو صحیÙÙ‡ کیلیدلنمیش، یالنیز قئیدیات‌لی ایستیÙاده‌چی‌لر داشییا بیلر.
+سون گونده‌لیک گیردی‌سی ایستیناد مقصدلی آشاغیدا وئریلمیش‌دیر:",
+'move-over-sharedrepo' => '== Ùایل مؤوجود ==
+[[:$1]] پایلاشیلمیش هوووزدا مؤوجود. بیر Ùایلی بو باشلیغا داشیماق پایلاشیلمیش Ùایلین اوستونه گله‌جک.',
+'file-exists-sharedrepo' => 'سئچیلن آد پایلاشیلمیش بیر هوووزدا اونسوز دا مؤوجود.
+خاهیش ائدیریک باشقا بیر آد سئچین.',
+
+# Export
+'export' => 'صحیÙه‌‌لری ائشیگه چیخارت',
+'exporttext' => 'مویین بیر صحیÙÙ‡ Ùˆ یا صحیÙÙ‡ کومانداسینین متنی Ùˆ دییشدیرمه کئچمیشینی خمل ایله ساری‌لی اولا‌راق خاریجه کؤچوره بیلرسینیز.
+بو، مئدیاویکی ایستیÙاده باشقا بیر ویکی [[Special:Import|ایچه کؤچورمه صحیÙه‌سی]] ایله ایچه کؤچوروله بیلر.
+
+صحیÙه‌لری خاریجه کؤچورمک اوچون، باش‌لیق‌لاری آشاغی‌داکی متن قوتوسونا داخیل ائدین، هر سطره بیر دنه، Ùˆ کؤهنه سوروملئرلئ بیرلیکده ایندیکی وئرسیاسی، صحیÙÙ‡ کئچمیشی سطرلرینی، یا دا سون دییشیک‌لیک ملوماتییلا بیرلیکده آکتوال وئرسیاسی ایسته‌ییب ایستمدیگینیزی قئید ائدین.
+
+سونونجو حالدا، بیر لینک ده ایستیÙاده ائده بیلرسینیز، هؤر: "[[{{MediaWiki:Mainpage}}]]" صحیÙه‌سی اوچون [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
+'exportall' => 'بوتون صحیÙه‌لری خاریجه کؤچور',
+'exportcuronly' => 'بوتون تاریخچنی دئییل، یالنیز حال-هازیرکی نوسخه نی داخیل ائت',
+'exportnohistory' => 'هدÙ‌لنن قایناق صحیÙه‌سی (ایسته‌یه باغ‌لی):',
+'exportlistauthors' => 'هر صحیÙه‌‌ اوچون دَییشدیرمه ائدن سیياهیسینی اؤزونده ساخلايین',
+'export-submit' => 'ایخراج',
+'export-addcattext' => 'صحیÙه‌لری بو بولمه دن علاوه ائت:',
+'export-addcat' => 'آرتیر',
+'export-addnstext' => 'صحیÙه‌لری آدلار Ùزاسین‌دان علاوه ائت:',
+'export-addns' => 'آرتیر',
+'export-download' => 'Ùایلی قئید ائت',
+'export-templates' => 'شابلون‌لاری داخیل ائت',
+'export-pagelinks' => 'باغ‌لی صحیÙه‌لری داخیل درین‌لیک:',
+
+# Namespace 8 related
+'allmessages' => 'سیستئم معلومات‌لاری',
+'allmessagesname' => 'آد',
+'allmessagesdefault' => 'دÙالت دانیشیق متنی',
+'allmessagescurrent' => 'ایندیکی متن',
+'allmessagestext' => 'بو مئدیا ویکی-ده اولان سیستئم مئساژلارینین سیاهی‌سی‌دیر. اگر مئدیا ویکی-Ù†ÛŒ لوکاللاش‌دیرماق ایشینده کؤمک ائتمک ایسییرسینیزسه، لطÙاً [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] Ùˆ [//translatewiki.net translatewiki.net]-ا باش چکین.',
+'allmessagesnotsupportedDB' => "'''\$ wgUseDatabaseMessages''' باغ‌لی اولدوغو اوچون '{{ns:special}}: Allmessages ایستیÙاده‌یه آچیق دئییل.",
+'allmessages-filter-legend' => 'سۆزگَج',
+'allmessages-filter' => 'خصوصی ائتمک وضعیتینه گؤره Ùیلترلی:',
+'allmessages-filter-unmodified' => 'دییشدیریلممیش',
+'allmessages-filter-all' => 'بوتون',
+'allmessages-filter-modified' => 'دییشدیریلمیش',
+'allmessages-prefix' => 'اؤنک ایله Ùیلترلی:',
+'allmessages-language' => 'دیل:',
+'allmessages-filter-submit' => 'گئت',
+
+# Thumbnails
+'thumbnail-more' => 'بؤیوت',
+'filemissing' => 'Ùایل تاپیلمادی',
+'thumbnail_error' => 'کیچیک شکیل یاراتما خطاسی: $1',
+'djvu_page_error' => 'DjVu صحیÙه‌سی الچاتمازدیر',
+'djvu_no_xml' => 'DjVu اوچون XML Ùایلی آلماق مومکون دئییل.',
+'thumbnail-temp-create' => 'ائلمک اولماز بارماق اولچوسوجه موقت Ùایل دوزتمک اولا',
+'thumbnail-dest-create' => 'باجاریقسیز تعییناتا باش بارماغین دیرناغینی خلاص ائتمک اوچون',
+'thumbnail_invalid_params' => 'اعتبارسیز کیچیک شکیل پارامئترلری',
+'thumbnail_dest_directory' => 'هد٠قورو‌لوغو یارادیلا بیلمیر',
+'thumbnail_image-type' => 'گؤرونوش نؤع دستکله‌نیلمیر',
+'thumbnail_gd-library' => "' 'قئید:' صحیÙه‌لرین بوتون کئچمیشینی بو Ùورملا خاریجه اؤتورولمه‌سی، پئرÙورمانس سبب‌لرین‌دن اؤتری دؤوره خاریجی بوراخیلمیش‌دیر.$1",
+'thumbnail_image-missing' => 'بئله گؤرونور کی، $1 Ùایلی یوخ‌دور',
+
+# Special:Import
+'import' => 'صحیÙه‌لری ایدخال ائت',
+'importinterwiki' => 'ویکیلر اراسی چیخارما',
+'import-interwiki-text' => 'ایچه کؤچورمک اوچون بیر wiki Ùˆ صحیÙÙ‡ باش‌لیغی سئچین.
+رئویزیون تاریخ‌لری و یازارلارین آدلاری قورونا‌جاق.
+بوتون ویکیلئراراسی ایچه کؤچورمه حرکت‌لری [[Special:Log/import|ایچه کؤچورمه گوندلیگینده]] یازیلماقدا‌دیر.',
+'import-interwiki-source' => 'قایناق ویکی/صحیÙÙ‡:',
+'import-interwiki-history' => 'صحیÙه‌نین دییشمه تاریخچه‌لری‌نین هامی‌سینی کؤچور',
+'import-interwiki-templates' => 'بوتون شابلون‌لارلا بیرلیکده',
+'import-interwiki-submit' => 'ایچری توکمه اولسون',
+'import-interwiki-namespace' => 'هد٠آد ساحه‌سی:',
+'import-interwiki-rootpage' => 'هدÙ‌لنن قایناق صحیÙه‌سی (ایسته‌یه باغ‌لی):',
+'import-upload-filename' => 'Ùایل آدی',
+'import-comment' => 'آچیخلا:',
+'importtext' => 'خاهیش ائدیریک Ùایلی [[Special:Export| خاریجه کؤچورمه کؤمک پروقرامییلا]] قایناق ویکی خاریجه کؤچورون.
+کومپوتئرینیزه یازین و بورا یوکلیین.',
+'importstart' => 'صحیÙه‌لری ایچری توکمه حالیندا...',
+'import-revision-count' => '$1 {{PLURAL:$1|دییشدیر|دییشدیرین}}',
+'importnopages' => 'ایچری توکمه صحیÙÙ‡ یوخ‌دور.',
+'imported-log-entries' => '$1{{PLURAL:$1|گونده‌لیک گیردی‌سی |گونده‌لیک گیردی‌سی}}ایچه کؤچوردو.',
+'importfailed' => 'اوغورسوز چیخاریش: <nowiki>$1</nowiki>',
+'importunknownsource' => 'بیلینمه‌ین ایچری کؤچورمه قایناق نؤوو',
+'importcantopen' => 'ایچری توکمه Ùایل پرونده لری آچیلمادی',
+'importbadinterwiki' => 'یانلیش اینتئرویکی کئچیدی',
+'importnotext' => 'بوش و یا متن یوخ‌دور',
+'importsuccess' => 'ایچری توکمه باشا چاتدی!',
+'importhistoryconflict' => 'اوست-اوسته دوشمه‌ین کئچمیش رئویزیونو مؤوجود (بو صحیÙÙ‡ داها اول‌دن ایچه کؤچورولموش اولا بیلر)',
+'importnosources' => 'هئچ ویکیلئراراسی ایچه کؤچورمه قایناغی تعیین و بیرباشا کئچمیش یوکلملری دؤوره خاریجی.',
+'importnofile' => 'بیر کؤچورمه Ùایلی یوکلنمدی.',
+'importuploaderrorsize' => 'ایچه کؤچورولموش Ùایلین یوکلنمه‌سی اوغورسوز اولدو.
+Ùایل، ایجازه وئریلن یوکلمه اؤلچوسون‌دن بؤیوک.',
+'importuploaderrorpartial' => 'ایچه کؤچورولموش Ùایلین یوکلنمه‌سی اوغورسوز اولدو.
+Ùایلین یالنیز بیر قیسیمی یوکلندی.',
+'importuploaderrortemp' => 'ایچه کؤچورولن Ùایلین یوکلنمه‌سی اوغورسوز اولدو.
+مووققتی Ùایل ایتکین.',
+'import-parse-failure' => 'اکس ام ال ایچری کؤچورمه ییغماسی موÙقیت‌سیز',
+'import-noarticle' => 'یوکلمگه صحیÙÙ‡ یوخدور!',
+'import-nonewrevisions' => 'بوتون نوسخه لر اول‌دن ایچه کؤچورولموش.',
+'xml-error-string' => '$1 $2 سترینده، $3 سوتونوندا ($4 بایت): $5',
+'import-upload' => 'XML-وئریلنی یوکله',
+'import-token-mismatch' => 'سئانس معلومات‌لارینین ایتیریلمه‌سی. لطÙاً، یئنی‌دن جهد ائدین.',
+'import-invalid-interwiki' => 'گؤستریلن ویکی‌دن کؤچورمک مومکون دئییل',
+'import-error-edit' => '"$1" صحیÙه‌سی ایدخال ائدیله بیلینمیر، چونکی اونو دییشمک سلاهیتینیز یوخ‌دور.',
+'import-error-create' => '"$1" صحیÙه‌سی آچیلمیر، چونکی اونو یاراتماق سلاهیتینیز یوخ‌دور.',
+'import-error-interwiki' => 'صحیÙÙ‡ "$1" داخیل ائدیلممیش‌دیر. چونکی اونون خاریجی باغلانتی سی (interwiki) یئری توتولوب Ùˆ رئزرو اولوب.',
+'import-error-special' => 'صحیÙÙ‡ «$1» ایچری توکمه اولنمادی، نیه Ú©ÛŒ بیر اجازه سیز آد ین Ùضاسینا تعلوقو وار.',
+'import-error-invalid' => 'صحیÙÙ‡ "$1" اعتبار سیز اولماق دلیل اوچون آدی داخیل اولنمور.',
+'import-error-unserialize' => '«$1» صحیÙه‌سینین $2 نوسخه‌سی سÙریالیزه‌لیقدان چیخاردیلانمادی. بو نوسخه، $4 کیمی سÙریالیزه اولان $3 مودÙلینی ایشلدمگه بیلدیریلدی.',
+'import-options-wrong' => '{{PLURAL:$2|جزئیات| جزئیات}} یانلیش: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'وئریلن کؤک صحیÙه‌‌سی اعتبارسیز آددیر.',
+'import-rootpage-nosubpage' => 'آد Ùضا سی "$1" آنا باسئ ٔآلت صحیÙÙ‡ اوچون اجازه وئرمیر.',
+
+# Import log
+'importlogpage' => 'چیخاریلما گونده‌لیگی',
+'importlogpagetext' => 'باشقا ویکیلردن، دَییشیکلیک گئچمیشلریله بیرلیک‌ده گتیریلمیش صحیÙه‌لر.',
+'import-logentry-upload' => '[[$1]]-ÛŒ Ùایل یوکله‌مکله گتیردی',
+'import-logentry-upload-detail' => '{{PLURAL:$1|بیر|$1}} نوسخه',
+'import-logentry-interwiki' => '$1-ی ویکی‌آراسی ائتدی',
+'import-logentry-interwiki-detail' => '$2-دن {{PLURAL:$1|بیر|$1}} نوسخه',
+
+# JavaScriptTest
+'javascripttest' => 'جاوااسکریپت تÙستی',
+'javascripttest-title' => '$1 تÙستلری ایشله‌دیلیر',
+'javascripttest-pagetext-noframework' => 'بو صحیÙه، جاوااسکریپت تÙستلرینی ایشلدمگه ساخلانیلیب‌دیر.',
+'javascripttest-pagetext-unknownframework' => 'تانینمامیش تÙست ائتمه سیستÙÙ…ÛŒ «$1».',
+'javascripttest-pagetext-frameworks' => 'لوطÙاً بو تÙست ائتمه سیستÙملرین بیرینی سئچین: $1',
+'javascripttest-pagetext-skins' => 'تÙستلرین ایجرا ائتمک اوچون بیر قابیق سئچین:',
+'javascripttest-qunit-intro' => 'mediawiki.org-دا [$1 تÙست ائتمه سندلندیرمه‌لری]نه باخین.',
+'javascripttest-qunit-heading' => 'مئدیاویکی جاوااسکریپت QUnit تÙست مجموعه‌سی',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'ایستیÙاده‌چی صÙحه‌نیز',
+'tooltip-pt-anonuserpage' => 'سیز او آی‌پی آدرسیله دَییشیکلیک ائتدیگینیز ایستیÙاده‌چی صحیÙه‌سی',
+'tooltip-pt-mytalk' => 'دانیشیق صحیÙه‌نیز',
+'tooltip-pt-anontalk' => 'بو آی‌پی آدرسینین دَییشیکلیکلرینه گؤره دانیشیق',
+'tooltip-pt-preferences' => 'ترجیحلرینیز',
+'tooltip-pt-watchlist' => 'دییشمکلرینی ایزله‌دیگینیز صÙحه‌لرین سیاهی‌سی',
+'tooltip-pt-mycontris' => 'سیزین چالیشمالارینیزین لیستی',
+'tooltip-pt-login' => 'گیریش ائتمه‌یینیز توصیه اولونور؛ اما گرکلی دئییل',
+'tooltip-pt-anonlogin' => 'داخیل اولمانیز توصیه‌‌ اولونور، آمما طلب اولونمور.',
+'tooltip-pt-logout' => 'چیخیش',
+'tooltip-ca-talk' => 'ایچینده‌کیلره گؤره دانیشیق',
+'tooltip-ca-edit' => 'سیز بو صحیÙه‌نی دَییشدیره بیلرسینیز. لوطÙاً قئید ائتمه‌دن اونجه اؤن‌گؤستریش دویگه‌سینی ایشلدین',
+'tooltip-ca-addsection' => 'یئنی بؤلوم یارات',
+'tooltip-ca-viewsource' => 'بو صحیÙه‌‌ قورونوب‌دور.
+اونون قایناغینا باخا بیلرسیز',
+'tooltip-ca-history' => 'بو صحیÙه‌نین گئچمیش نوسخه‌لری',
+'tooltip-ca-protect' => 'بو صحیÙه‌نی قورو',
+'tooltip-ca-unprotect' => 'بو صحیÙه‌نین قوروماسینی دَییشدیر',
+'tooltip-ca-delete' => 'بو صحیÙه‌‌نی سیل',
+'tooltip-ca-undelete' => 'بو صحیÙه‌‌نین محاÙظه‌‌سینی کنارلاشدیر',
+'tooltip-ca-move' => 'بو صحیÙه‌‌نین آدینی ديَیشدیر',
+'tooltip-ca-watch' => 'بو صحیÙه‌‌نی ایزله',
+'tooltip-ca-unwatch' => 'بو صÙحه‌نی ایزله‌دیگینیز صÙحه‌لردن قالدیرین',
+'tooltip-search' => '{{SITENAME}}-دا آختار',
+'tooltip-search-go' => 'اولورسا بو آددا بیر صحیÙه‌یه گئت',
+'tooltip-search-fulltext' => 'بو یازی اولان صحیÙه‌لری آختار',
+'tooltip-p-logo' => 'آنا صحیÙه‌یه باخ',
+'tooltip-n-mainpage' => 'آنا صحیÙه‌‌یه باخین',
+'tooltip-n-mainpage-description' => 'آنا صحیÙه‌یه باخین',
+'tooltip-n-portal' => 'پروژه‌ یه گؤره، سیز نه ایش گوره بیلرسیز، هاردا نه‌لری تاپا بیلرسیز',
+'tooltip-n-currentevents' => 'ایندیکی اولایلارا ایلگیلی بیلگیلر تاپ',
+'tooltip-n-recentchanges' => 'بو ویکی‌ده سون دَییشیکلرین لیستی',
+'tooltip-n-randompage' => 'بیر راست‌گله صحیÙÙ‡ گتیر',
+'tooltip-n-help' => 'آنلاماق یئری',
+'tooltip-t-whatlinkshere' => 'بورایا باغلانان بوتون ویکی صحیÙه‌لرین لیستی',
+'tooltip-t-recentchangeslinked' => 'بو صحیÙه‌دن باغلانان صحیÙه‌لرین سون دَییشیکلیکلری',
+'tooltip-feed-rss' => 'بو صحیÙه‌‌ اوچون آراس‌اس يايیمی',
+'tooltip-feed-atom' => 'بو صحیÙه‌‌ اوچون آتوم يايیمی',
+'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' => 'مئدیا-Ùايل',
+'tooltip-ca-nstab-special' => 'بو بیر اؤزل صحیÙه‌دیر، سیز اونو دَییشدیره بیلمزسیز',
+'tooltip-ca-nstab-project' => 'پروژه صحیÙه‌سینه باخ',
+'tooltip-ca-nstab-image' => 'Ùايل صحیÙه‌‌سینه باخین',
+'tooltip-ca-nstab-mediawiki' => 'سیستم مئساژلرینه باخ',
+'tooltip-ca-nstab-template' => 'شابلونا باخ',
+'tooltip-ca-nstab-help' => 'یاردیم صحیÙه‌‌سی',
+'tooltip-ca-nstab-category' => 'بؤلمه صحیÙه‌‌سینی گؤستر',
+'tooltip-minoredit' => 'بو دییشیگی کیچیک دییشیک کیمی قئید ائت',
+'tooltip-save' => 'ديَیشیکلیکلرینیزی قئيد ائدین',
+'tooltip-preview' => 'لوطÙاً صحیÙه‌نی قئید ائتمک‌دن اؤنجه، دییشیکلرینیزی سیناق گؤستریش ایله باخین!',
+'tooltip-diff' => 'مقاله‌ده ائتدیگی‌نیز ديَیشیکلیک‌لره باخین',
+'tooltip-compareselectedversions' => 'بو صحیÙه‌نین ایکی سئچیلمیش نوسخه‌لری‌نین Ùرقلرینه باخ',
+'tooltip-watch' => 'بو صÙحه‌نی ایزله‌دیکلرینیزه آرتیر',
+'tooltip-watchlistedit-normal-submit' => 'باشلیغین سیلینمه‌سی',
+'tooltip-watchlistedit-raw-submit' => 'ایزلدیگیم صحیÙه‌لرین سیاهی‌سینین یئنی‌لنمه‌سی',
+'tooltip-recreate' => 'اول سیلینمه‌سینه باخمایا‌راق صحیÙÙ†ÛŒ برپا ائت',
+'tooltip-upload' => 'یوکلمنی باشلات',
+'tooltip-rollback' => 'سوْنونجو ایستیÙاده‌چی طرÙیندن ائدیلمیش بۆتون ديَیشیکلیکلری بیر دÙعه‌‌يه گئری قايتار',
+'tooltip-undo' => 'ائدیلمیش ديَیشیکلیگی گئری قايتار و گئری قايتارما سببینی قئيد ائتمک اۆچون سێناق گؤستریشینی آچ',
+'tooltip-preferences-save' => 'ترجیحلری ساخلا',
+'tooltip-summary' => 'قیسا بیر خولاصه‌‌ یازین',
+
+# Metadata
+'notacceptable' => 'ویکی-سئروئر معلومات‌لاری براوزئرینیزین اوخویا بیلجیی Ùورماتدا تقدیم ائده بیلمیر.',
+
+# Attribution
+'anonymous' => '{{SITENAME}} سایتینین آنونیم {{PLURAL:$1|یستیÙادچیسی|یستیÙاده‌چی‌لری}}',
+'siteuser' => '{{SITENAME}} ایستیÙاده‌چی‌سی $1',
+'anonuser' => '{{SITENAME}} آنونیم ایستیÙاده‌چی‌سی $1',
+'lastmodifiedatby' => 'بۇ صحیÙه‌‌ سوْنونجو دÙعه‌‌ $1ØŒ $2 تاریخینده دَییشیلیب.',
+'othercontribs' => '$1-این ایشینه اساسلانیب.',
+'others' => 'آیریلار',
+'siteusers' => '{{SITENAME}} {{PLURAL:$2|وسئر|یستیÙاده‌چی}} $1',
+'anonusers' => '{{SITENAME}} آنونیم {{PLURAL:$2|وسئر|یستیÙاده‌چی}} $1',
+'creditspage' => 'صحیÙÙ‡ اعتبارلاری',
+'nocredits' => 'بو صحیÙÙ‡ اوچون هئچ بیر اعتیبار بیلگیلری ال‌ده دئییل.',
+
+# Spam protection
+'spamprotectiontitle' => 'Ùایداسیز یازما قوروما Ùیلتری',
+'spamprotectiontext' => 'سیز قئید ائتمک ایسته‌دیگینیز یازینین قاباغی، اÙسپم ÙیلتÙریله، آلیندی.
+بو ایش، اوندا ائشیک قره‌لیست‌ده اولان بیر سایتا باغلانتی وئرمک اوچون اولا بیلر.',
+'spamprotectionmatch' => 'بو یازی، بیزیم اÙسپم ÙیلتÙریمیزی ایشه سالان‌دیر: $1',
+'spambot_username' => 'مئدیاویکی Ùایداسیز یازی تمیزلمه‌سی',
+'spam_reverting' => '$1-ه باغلانتیسی اولمایان سون نوسخه‌یه قایتاریلیر',
+'spam_blanking' => '$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، بوشادیلیر',
+'spam_deleting' => '$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، سیلینیر',
+
+# Info page
+'pageinfo-title' => '«$1» اوچون بیلگیلر',
+'pageinfo-not-current' => 'تأسÙله بو بیلگیلری اسکی نوسخه‌لره وئرمک اولانماز بیر ایش‌دیر.',
+'pageinfo-header-basic' => 'اساس معلومات‌لار',
+'pageinfo-header-edits' => 'تاریخچه نی دییشدیر',
+'pageinfo-header-restrictions' => 'صÙحه دن محاÙظت ائله Ù…Ú©',
+'pageinfo-header-properties' => 'صحیÙÙ‡ خصوصیت‌لری',
+'pageinfo-display-title' => 'گؤستریلن باشلیق',
+'pageinfo-default-sort' => 'Ùرض ائدیلن سیرالاما آچاری',
+'pageinfo-length' => 'صحیÙه‌‌ اوزونلوغو (بايت)',
+'pageinfo-article-id' => 'صحیÙÙ‡ آی‌دی-سی',
+'pageinfo-language' => 'صحیÙÙ‡ مضمونونون دیلی',
+'pageinfo-robot-policy' => 'آختاریش سیستمین دورومو',
+'pageinfo-robot-index' => 'سییاهه آلینیشی',
+'pageinfo-robot-noindex' => 'ایندÙکسله‌نه بیلمز',
+'pageinfo-views' => 'گؤسترمه صحیÙه‌سی',
+'pageinfo-watchers' => 'صحیÙه‌نین تاماشا‌چی سایی',
+'pageinfo-few-watchers' => '$1-دن آز {{PLURAL:$1|ایزله‌ین}}',
+'pageinfo-redirects-name' => 'بو صحیÙه‌یه یول‌لاندیرمالار',
+'pageinfo-subpages-name' => 'بو صحیÙه‌نین آلت‌صحیÙه‌لری',
+'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|بیر|$2}} یول‌لاندیرما؛ {{PLURAL:$3|بیر|$3}} Ù‚Ùیری-یول‌لاندیرما)',
+'pageinfo-firstuser' => 'صحیÙÙ†ÛŒ یارا‌دان',
+'pageinfo-firsttime' => 'صحیÙه‌نین یارانما تاریخی',
+'pageinfo-lastuser' => 'سونونجو دییشدیرن',
+'pageinfo-lasttime' => 'سونونجو دییشدیر‌نین تاریخی',
+'pageinfo-edits' => 'دییشدیر‌لرین سایی',
+'pageinfo-authors' => 'Ùرق‌لی مؤلÙ‌لرین سایی',
+'pageinfo-recent-edits' => 'سون زامانلارداکی تنزیمله‌مه‌لر (سون $1)',
+'pageinfo-recent-authors' => 'Ùرقلی يازارلارین سون سايی',
+'pageinfo-magic-words' => 'سیحیرلی {{PLURAL:$1|بیر|$1}} سؤزجوک ($1)',
+'pageinfo-hidden-categories' => 'گیزلی {{PLURAL:$1|بؤلمه|بؤلمه‌لر}} ($1)',
+'pageinfo-templates' => 'ایشله‌دیلمیش {{PLURAL:$1|بیر|$1}} شابلون ($1)',
+'pageinfo-transclusions' => 'ایچینده گلن {{PLURAL:$1|صحیÙÙ‡|صحیÙه‌لر}} ($1)',
+'pageinfo-toolboxlink' => 'صحیÙÙ‡ بیلگی‌سی',
+'pageinfo-redirectsto' => 'ایستیقامتلن‌دیریلن',
+'pageinfo-redirectsto-info' => 'بیلگی',
+'pageinfo-contentpage' => 'بیر مزمون صحیÙه‌سی ساییلیر',
+'pageinfo-contentpage-yes' => 'بلی',
+'pageinfo-protect-cascading' => 'مداÙعه‌‌لر بورادان شراره کیمی تؤکولور',
+'pageinfo-protect-cascading-yes' => 'بلی',
+'pageinfo-protect-cascading-from' => 'شراره مداÙعه‌‌لر بورادان',
+'pageinfo-category-info' => 'بؤلمه بیلگیلری',
+'pageinfo-category-pages' => 'صحیÙه‌لرین سایی',
+'pageinfo-category-subcats' => 'آلت‌بؤلمه‌لرین سایی',
+'pageinfo-category-files' => 'Ùایل‌لارین سایی',
+
+# Skin names
+'skinname-myskin' => 'منیم قابیغیم',
+
+# Patrolling
+'markaspatrolleddiff' => 'ایداره ائدیلمیش اولا‌راق ایشاره‌له',
+'markaspatrolledtext' => 'صحیÙÙ†ÛŒ پاتروللانمیش کیمی ایشاره‌له',
+'markedaspatrolled' => 'یوخلانیلدی',
+'markedaspatrolledtext' => '[[:$1]] اوچون سئچیلمیش نوسخه گؤزدن کئچیریله‌رک ایشاره‌لندی.',
+'rcpatroldisabled' => 'سون دییشیک‌لیک‌لرین پاتروللانماسی قاداغان‌دیر',
+'rcpatroldisabledtext' => 'سون دییشیک‌لیک‌لرین یوخلانیلماسی حال-حاضردا مومکون دئییل.',
+'markedaspatrollederror' => 'یوخلانمادی',
+'markedaspatrollederrortext' => 'موشاهیده کیمی ایشاره‌لمک اوچون بیر رئویزیون ائتملیسینیز.',
+'markedaspatrollederror-noautopatrol' => 'اؤز دییشیک‌لیک‌لرینیزی یوخلاییب ایشاره‌له‌یه بیلمزسینیز.',
+'markedaspatrollednotify' => '$1-اوستونده ديَیشیکلیک قئيد ائدیلمیشدیر، نئجه کی پاترول کئشیگی چکدی.',
+'markedaspatrollederrornotify' => 'دولانماق برچسبی مووÙقیت سیز اولدو',
+
+# Patrol log
+'patrol-log-page' => 'پاترول گونده‌لیگی',
+'patrol-log-header' => 'بو یوخلانمیش دییشیک‌لیک‌لرین گونده‌لیگی‌دیر.',
+'log-show-hide-patrol' => '$1 پاترول گونده‌لیگی',
+
+# Image deletion
+'deletedrevision' => 'کؤهنه نوسخه لری سیلیندی $1.',
+'filedeleteerror-short' => 'Ùایل سیلینرکن ختا: $1',
+'filedeleteerror-long' => 'Ùایل سیلینرکن اوزه چیخان ختا‌لار:
+
+$1',
+'filedelete-missing' => '"$1" Ùایلی مؤوجود اولمادیغین‌دان سیلینه بیلینمیر.',
+'filedelete-old-unregistered' => 'گؤستریلن Ùایل نوسخه سی "$1" وئریلن‌لر بازاسیندا یوخ‌دور.',
+'filedelete-current-unregistered' => 'گؤستریلن "$1" Ùایلی وئریلن‌لر بازاسیندا یوخ‌دور.',
+'filedelete-archive-read-only' => '"$1" کاتالوقونون آرشیوی وئب-سئروئر یازی‌لاری اوچون باغلی‌دیر.',
+
+# Browsing diffs
+'previousdiff' => 'اسکی دَییشدیرمه',
+'nextdiff' => 'یئنی دَییشدیرمه',
+
+# Media information
+'mediawarning' => "'''خبردارلیق: بو ​​Ùایل نوعو پیس نیت‌لی کودلار اولا بیلر.
+بونو ایشلتمک، سیستئمینیزی تهلوکه‌یه آتا بیلر.",
+'imagemaxsize' => "شکیلین ماکسیمال توتومو:<br />(Ùایلین تصویری صحیÙه‌لری اوچون)'",
+'thumbsize' => 'کیچیک اؤلچو:',
+'widthheightpage' => '$1 × $2ØŒ $3 {{PLURAL:$3|صحیÙ|صحیÙه‌لر}}',
+'file-info' => 'Ùایلین اؤلچوسو: $1ØŒ MIME تیپی: $2',
+'file-info-size' => '$1 × $2 پیکسل, Ùایل اؤلچوسو: $3, MIME نوعو: $4',
+'file-info-size-pages' => '$1 × $2 پیکسئل، Ùایلین اؤلچوسو: $3ØŒ میمئ نؤوو: $4ØŒ $5 {{PLURAL:$5|صحیÙÙ‡| صحیÙÙ‡}}',
+'file-nohires' => 'یوخاری Ú©ÛŒÙیت الده یوخدور.',
+'svg-long-desc' => 'SVG Ùایلی، $1 × $2 پیکسئل، Ùایلین اؤلچوسو: $3',
+'svg-long-desc-animated' => 'Ùایل اس‌وی‌جی حرکت ائدن، ابعادی <span dir="ltr">$1 × $2</span> پیکسل، Ùایل اولچوسو: $3',
+'svg-long-error' => 'اعتبارسیز سوگ Ùایل: $1',
+'show-big-image' => 'یوکسک Ú©ÛŒÙیتلی',
+'show-big-image-preview' => 'سیناق گؤستریشی اؤلچوسو: $1.',
+'show-big-image-other' => 'دیگر {{PLURAL:$2|نتیج|نتیجه‌لر}}: $1.',
+'show-big-image-size' => '$1 × $2 پیکسئل',
+'file-info-gif-looped' => 'ایلملنیب',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|Ùرامئ|چرچیوه}}',
+'file-info-png-looped' => 'ایلملنیب',
+'file-info-png-repeat' => '$1 {{PLURAL: $ 1|دÙعه| دÙعه}} اویناتیلدی',
+'file-info-png-frames' => '$1 {{PLURAL:$1|Ùرامئ|چرچیوه}}',
+'file-no-thumb-animation' => "'''قئید:تئکنیکی مسئله‌لر سببیندن قاباق دان گورسنمه Ùایل متحرک شکیلی گؤرستمیر .",
+'file-no-thumb-animation-gif' => "'''قئید:ÙÙ†ÛŒ مسائیله گوره GIF Ùایلارین Ùˆ اونا تای اولانان لار قالباق دان گورستمه پروقرمی متحرک حالیندا گورسدیلمیجک.'''",
+
+# Special:NewFiles
+'newimages' => 'یئنی Ùایل‌لارین سیاهی‌سی',
+'imagelisttext' => "آشاغی‌داکی سیاهی '$2 گؤره دوزولموش {{PLURAL:$1|ادد Ùایلی| ادد Ùای‌لی}} گؤستریر.",
+'newimages-summary' => 'بو خصوصی صحیÙه، ان سون یوک‌لنن Ùایل‌لاری گؤستریر.',
+'newimages-legend' => 'سۆزگَج',
+'newimages-label' => 'Ùایلین (Ùˆ یا اونون بیر حیسه‌سی‌نین) آدی:',
+'showhidebots' => '($1 روبات دییشدیر)',
+'noimages' => 'هئچ نیی گؤرممک.',
+'ilsubmit' => 'آختار',
+'bydate' => 'تاریخین اوستوندن',
+'sp-newimages-showfrom' => '$1ØŒ $2 تاریخی اعتباری ایله یئنی Ùایل‌لاری گؤستر',
+
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 ثانی|$1 ثانییه}}',
+'minutes' => '{{PLURAL:$1|$1 دقیقه}}',
+'hours' => '{{PLURAL:$1|$1 ساعت |$1 ساعت}}',
+'days' => '{{PLURAL:$1|$1 گون |$1 گون}}',
+'months' => '{{PLURAL:$1|$1}} آی',
+'years' => '{{PLURAL:$1|$1}} ایل',
+'ago' => '$1 اؤنجه',
+'just-now' => 'ایندی',
+
+# Bad image list
+'bad_image_list' => 'Ùورمت بئله اولمالیدیر:
+
+يالنیز لیست آیتÙملری (* ایله باشلايان سطرلر) نظره آلینیر.
+سطرده‌کی ایلک باغلانتی، بیر پیس Ùایلا باغلانان اولمالیدیر.
+ائله بو سطرده سونراکی باغلانتیلار استثنا حساب اولونور. مثلاً، Ùايل صحیÙه‌ده سطرین ایچینده گؤرونه بیلر.',
+
+# Metadata
+'metadata' => 'Ù…Ùتابیلگیلر',
+'metadata-help' => 'بۇ Ùايلدا Ùوْتوْاپارات Ùˆ يا سکانئرله علاوه‌‌ اوْلونموش معلوماتلار وار. اگر Ùايل سوْنرادان دَییشدیریلیبسه، بعضی پارامئترلر بۇ شکیلده گؤستریلنلردن Ùرقلی اوْلا بیلر.',
+'metadata-expand' => 'جزئیات معلومات‌لاری گؤستر',
+'metadata-collapse' => 'جزئیات معلومات‌لاری گیزلت',
+'metadata-fields' => 'بو صحیÙه‌‌ده سیرالانان ائخی٠مئتاداتا ساحه‌‌لری شکیل گؤرونوش صحیÙه‌‌لرینده مئتاداتا جدوه‌لی چؤکدويونده ایستیÙاده ائدیلیر. دیگرلری وارسايیلان اولاراق گیزلنه‌جکدیر.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength
+* artist
+* copyright
+* imagedescription
+* gpslatitude
+* gpslongitude
+* gpsaltitude',
+
+# EXIF tags
+'exif-imagewidth' => 'گئنیش‌لیک',
+'exif-imagelength' => 'اوزوناسی',
+'exif-bitspersample' => 'هر جز دا نقطه',
+'exif-compression' => 'سیخیلمامیش',
+'exif-photometricinterpretation' => 'نقاطین بیرلشمه‌سی',
+'exif-orientation' => 'جهت',
+'exif-samplesperpixel' => 'اجزا سایی س',
+'exif-planarconfiguration' => 'معلومات نیزامی',
+'exif-ycbcrsubsampling' => 'Y-C آلت نومونه نیسبتی',
+'exif-ycbcrpositioning' => 'Y و C یئرلشمه سیراسی',
+'exif-xresolution' => 'اوÙیقی سئچیلمک',
+'exif-yresolution' => 'عمودی سئچیلمک',
+'exif-stripoffsets' => 'شکیل معلومات مؤوقئیی',
+'exif-rowsperstrip' => 'هر بلوک‌داکی سطرلرین سایی',
+'exif-stripbytecounts' => 'بایت هر نوار Ùشرده ده',
+'exif-jpeginterchangeformat' => 'جابه‌جایی نسبت به JPEG SOI',
+'exif-jpeginterchangeformatlength' => 'JPEG معلومات بازاسینین بایت‌لاری',
+'exif-whitepoint' => 'آغ نقطه کروماتیغی',
+'exif-primarychromaticities' => 'اولویت رنگ آلماقلاری',
+'exif-ycbcrcoefficients' => 'رنگ آرا‌لیغی چئویرمه ماتریس امسا‌لی',
+'exif-referenceblackwhite' => 'آغ قارا جÙت مقادیر مرجع',
+'exif-datetime' => 'Ùایلین دییشمه‌سی تاریخی Ùˆ واختی',
+'exif-imagedescription' => 'شکیل باشلیقی',
+'exif-make' => 'کامئرا دوزلدنی',
+'exif-model' => 'کامئرا مود‌لی',
+'exif-software' => 'پروقرام تمیناتی',
+'exif-artist' => 'یازار',
+'exif-copyright' => 'یازانلار حقوقو صاحبی',
+'exif-exifversion' => 'exif نوسخه سی',
+'exif-flashpixversion' => 'دستک‌لنن Flashpix نوسخه سی',
+'exif-colorspace' => 'رنگ ساحه‌سی',
+'exif-componentsconfiguration' => 'هر بیلشنین معناسی',
+'exif-compressedbitsperpixel' => 'شکیل سیخیشدیرما Ùورماتی',
+'exif-pixelydimension' => 'شکیلین انی',
+'exif-pixelxdimension' => 'شکیلین اوزوناسی',
+'exif-usercomment' => 'استÙادچی شرحی',
+'exif-relatedsoundfile' => 'حاقیندا سس Ù„ÛŒ Ùایل',
+'exif-datetimeoriginal' => 'اورژینال یاراتما زامانی',
+'exif-datetimedigitized' => 'دیجیتالی‌ اولان تاریخ و زمانی',
+'exif-subsectime' => 'آلت-ایکینجی واخت',
+'exif-subsectimeoriginal' => 'اورژینال آلت-ایکینجی واخت',
+'exif-subsectimedigitized' => 'دیژیتالیز آلت-ایکینجی واخت',
+'exif-exposuretime' => 'چکیلیش مدتی',
+'exif-exposuretime-format' => '$1 سانییه ($2)',
+'exif-fnumber' => '٠نؤمره‌سی',
+'exif-exposureprogram' => 'پوزا برنامه سی',
+'exif-spectralsensitivity' => 'Ø·ÛŒÙÛŒ حساس‌لیق',
+'exif-isospeedratings' => 'ایزو سرعت درجه سی',
+'exif-shutterspeedvalue' => 'آپکس شاتر سرعتی',
+'exif-aperturevalue' => 'آپکس دیاÙراگم اندازه سی',
+'exif-brightnessvalue' => 'آپکس پارلاقی',
+'exif-exposurebiasvalue' => 'ایشیق وئرمه خطاسی',
+'exif-maxaperturevalue' => 'یئرین ان چوخ آچیقلیغی',
+'exif-subjectdistance' => 'سوژهه قدر مساÙÙ‡',
+'exif-meteringmode' => 'اؤلچمک دورومو',
+'exif-lightsource' => 'ایشیق قایناقی',
+'exif-flash' => 'Ùلاش',
+'exif-focallength' => 'Ùوکوس مساÙه‌سی',
+'exif-subjectarea' => 'جسمین مساحتی',
+'exif-flashenergy' => 'Ùلاش ائنئرژی‌سی',
+'exif-focalplanexresolution' => 'صÙحهٔ کانونی سویه X هللولما دقیق‌لیگی',
+'exif-focalplaneyresolution' => 'صÙحهٔ کانونی ده تÙکیک‌پذیری Y',
+'exif-focalplaneresolutionunit' => 'کانونی صحیÙÙ‡ نین بیربیرندن سئچمه واحدی',
+'exif-subjectlocation' => 'سوژه یئری',
+'exif-exposureindex' => 'ایشیق شاخیصی',
+'exif-sensingmethod' => 'قبول ائتمه مئتودو',
+'exif-filesource' => 'Ùایل قایناقی',
+'exif-scenetype' => 'صحنه تیپی',
+'exif-customrendered' => 'شخصی شکیل عملیاتی',
+'exif-exposuremode' => 'ایشیق وئرمه حالتی',
+'exif-whitebalance' => 'آغ بالانسی',
+'exif-digitalzoomratio' => 'یاخینلاشدیرما نیسبتی (زوم)',
+'exif-focallengthin35mmfilm' => '35 میلی متر-لیک Ùیلمده مرکز اوزاق‌لیغی',
+'exif-scenecapturetype' => 'سهنه توتما تیپی',
+'exif-gaincontrol' => 'سهنه ایداره‌سی',
+'exif-contrast' => 'کونتراست',
+'exif-saturation' => 'دویموشلوق',
+'exif-sharpness' => 'کسکین‌لیک',
+'exif-devicesettingdescription' => 'دسگاهین تنظیم لر تعریÙ‌لری',
+'exif-subjectdistancerange' => 'سوژه نین مساÙÙ‡ محدوده سی',
+'exif-imageuniqueid' => 'شکیل خصوصی شخصیتی',
+'exif-gpsversionid' => 'جی پی اس ائتیکئت نوسخه سی',
+'exif-gpslatituderef' => 'شیمال Ùˆ یا جنوب جغراÙیایی ائنی',
+'exif-gpslatitude' => 'جغراÙیایی ائنی',
+'exif-gpslongituderef' => 'جغراÙیایی شرق Ùˆ یا قرب اوزونلوقو',
+'exif-gpslongitude' => 'جغراÙیایی اوزوناسی',
+'exif-gpsaltituderef' => 'اوجالیق یئری',
+'exif-gpsaltitude' => 'يوکسکلیک',
+'exif-gpstimestamp' => 'جی پی اس واختی (آتوم ساعتی)',
+'exif-gpssatellites' => 'اؤلچمک اوچون ایستیÙاده ائتدیگی پئیک‌لر',
+'exif-gpsstatus' => 'ایستاتوسو قبول ائدن',
+'exif-gpsmeasuremode' => 'اؤلچمه اوصولو',
+'exif-gpsdop' => 'اؤلچونون دقیقلیگی',
+'exif-gpsspeedref' => 'سرعت اونیتی',
+'exif-gpsspeed' => 'چی پی اس قبولئدیجی‌نین سرعتی',
+'exif-gpstrackref' => 'جهت حرکتی اوچون قایناق',
+'exif-gpstrack' => 'ایدارئتمه مئخانیزمی',
+'exif-gpsimgdirectionref' => 'شکیل جهتی اوچون قایناق',
+'exif-gpsimgdirection' => 'شکلین ایستیقامتی',
+'exif-gpsmapdatum' => 'نقشه‌گوتورمک اطلاعاتی ژئودزیک',
+'exif-gpsdestlatituderef' => 'جغراÙیایی ائنی مقصد اوچون قایناق',
+'exif-gpsdestlatitude' => 'ائن دایره‌سی‌نین تعیین اولونماسی',
+'exif-gpsdestlongituderef' => 'جغراÙیایی اوزوناسی مقصد اوچون قایناق',
+'exif-gpsdestlongitude' => 'اوزونلوق دایره‌سی‌نین تعیین اولونماسی',
+'exif-gpsdestbearingref' => 'مقصد جهتی اوچون قایناق',
+'exif-gpsdestbearing' => 'اوبيئکتین پئلئنقی',
+'exif-gpsdestdistanceref' => 'قایناق Ùاصله مقصد چان',
+'exif-gpsdestdistance' => 'مساÙÙ‡',
+'exif-gpsprocessingmethod' => 'چی پی اس پردازیشینین آدی',
+'exif-gpsareainformation' => 'چی پی اس ساحه‌نین آدی',
+'exif-gpsdatestamp' => 'چی پی اس زامانی',
+'exif-gpsdifferential' => 'چی پی اس ین جزئی اصلاحی',
+'exif-jpegfilecomment' => 'JPEG شکیل شرحی',
+'exif-keywords' => 'آچار سؤزلر',
+'exif-worldregioncreated' => 'شکلین چکیلدیگی دونيا یئرلری',
+'exif-countrycreated' => 'شکلین چکیلدیگی اؤلکه',
+'exif-countrycodecreated' => 'شکلین چکیلدیگی اؤلکه‌نین کودو',
+'exif-provinceorstatecreated' => 'شکلین چکیلدیگی ایالت،آدی',
+'exif-citycreated' => 'شکلین چکیلدیگی شهر',
+'exif-sublocationcreated' => 'شکلین چکیلدیگی شهرین بخش آدی',
+'exif-worldregiondest' => 'تصویر ائدیلمیش دونیا بؤلگه‌سی',
+'exif-countrydest' => 'تصویر اولونموش اؤلکه',
+'exif-countrycodedest' => 'تصویر ائدیلمیش اؤلکه‌نین کودو',
+'exif-provinceorstatedest' => 'تصویر ائدیلمیش بؤلگه یاخود ایشتات',
+'exif-citydest' => 'تصویر ائدیلمیش شهر',
+'exif-sublocationdest' => 'تصویر ائدیلمیش شهر بؤلگه‌سی',
+'exif-objectname' => 'قیسا باشلیق',
+'exif-specialinstructions' => 'خصوصی دستور عمل لر',
+'exif-headline' => 'باشلیق',
+'exif-credit' => 'تعمین ائدیچی',
+'exif-source' => 'قایناق',
+'exif-editstatus' => 'شکلین دییشدیرمه وضعیته',
+'exif-urgency' => 'ضروری‌لیک',
+'exif-fixtureidentifier' => 'ستون آدی',
+'exif-locationdest' => 'تصویر ائدیلمیش اراضی',
+'exif-locationdestcode' => 'تصویر ائدیلمیش یئرین کودو',
+'exif-objectcycle' => 'شکلین نظرده توتولدوغو زمان حیسه‌سی',
+'exif-contact' => 'تماس معلوماتی',
+'exif-writer' => 'یازیچی',
+'exif-languagecode' => 'دیل',
+'exif-iimversion' => 'IIM نوسخه سی',
+'exif-iimcategory' => 'بؤلمه',
+'exif-iimsupplementalcategory' => 'علاوه بولمه لر',
+'exif-datetimeexpires' => 'سونرا ایشلتمه',
+'exif-datetimereleased' => 'چیخیش تاریخی',
+'exif-originaltransmissionref' => 'اصلی تاشیماق یئر کودو',
+'exif-identifier' => 'تانیتدیران',
+'exif-lens' => 'ایستیÙاده اولونموش لنز',
+'exif-serialnumber' => 'کامئرانین سئریال نؤمره‌سی',
+'exif-cameraownername' => 'کامئرانین صاحبی',
+'exif-label' => 'نیشان',
+'exif-datetimemetadata' => 'سون دَییشیکلر تاریخی',
+'exif-nickname' => 'شکلین قئيری-رسمی آدی',
+'exif-rating' => 'قیيمت (5 اوزرینده)',
+'exif-rightscertificate' => 'ایداره‌چی گوواهی حاقی',
+'exif-copyrighted' => 'ستاتوسون یازانلار حقوقو',
+'exif-copyrightowner' => 'یازانلار حقوقو صاحبی',
+'exif-usageterms' => 'ایستیÙاده قايداسی',
+'exif-webstatement' => 'اینتئرنئتده مؤلÙ‌لیک حقوق‌لاری قایدا‌لاری',
+'exif-originaldocumentid' => 'تانیشچی تکجه سند',
+'exif-licenseurl' => 'مؤل٠حقوقو اینترنت آدرسی تکثیر حقی اوچون',
+'exif-morepermissionsurl' => 'آلتئرناتیو لیسئنزیيا بیلگی‌لری',
+'exif-attributionurl' => 'بو ایشی یئنی‌دن ایستیÙاده لطÙاً علاقه وئرین',
+'exif-preferredattributionname' => 'ایستیÙاده ائدیلنده لطÙاً علاقه وئرین',
+'exif-pngfilecomment' => 'PNG شکیل شرحی',
+'exif-disclaimer' => 'مسئولیتدن ایمتیناع',
+'exif-contentwarning' => 'متن خبردارلیغی',
+'exif-giffilecomment' => 'GIF شکیل شرحی',
+'exif-intellectualgenre' => 'اوبیئکتین تیپی',
+'exif-subjectnewscode' => 'مؤوضونون کودو',
+'exif-scenecode' => 'IPTC صحنه‌‌ کودو',
+'exif-event' => 'تصویر ائدیلمیش حادثه‌‌',
+'exif-organisationinimage' => 'تصویر ائدیلمیش قوروملار',
+'exif-personinimage' => 'تصویر ائدیلمیش شخص',
+'exif-originalimageheight' => 'شکیلین کسیلمه دن اوولکی اوجالیقی',
+'exif-originalimagewidth' => 'شکیلین کسیلمه دن اوولکی گئنیش‌لیگی',
+
+# EXIF attributes
+'exif-compression-1' => 'سیخیلمامیش',
+'exif-compression-2' => 'پسوورد قویماق سی‌سی‌آی‌تی‌تی Û³ گروه دا بیر بعدی هاÙمن روشی ایله اوزوناسی اوستونده دییشیلیب',
+'exif-compression-3' => 'رمز قرار وئرمک سی‌سی‌آی‌تی‌تی قروپ ۳',
+'exif-compression-4' => 'رمز قرار وئرمک سی‌سی‌آی‌تی‌تی قروپ 4',
+
+'exif-copyrighted-true' => 'مؤلÙ‌لیک حقوقو ایله قورونور',
+'exif-copyrighted-false' => 'عمومی دامنه',
+
+'exif-unknowndate' => 'تانینمامیش تاریخ',
+
+'exif-orientation-1' => 'نورمال',
+'exif-orientation-2' => 'یاتای چئویریلیب',
+'exif-orientation-3' => '۱۸۰ درجه دؤنده‌ریلیب',
+'exif-orientation-4' => 'دیکَی چئویریلیب',
+'exif-orientation-5' => '۹۰ درجه ساعات عکسی دؤنده‌ریلیب و دیکَی چئویریلیب',
+'exif-orientation-6' => '۹۰ درجه ساعات عکسی دؤنده‌ریلیب',
+'exif-orientation-7' => '۹۰ درجه ساعات یولوندا دؤنده‌ریلیب و دیکَی چئویریلیب',
+'exif-orientation-8' => '۹۰ درجه ساعات یولوندا دؤنده‌ریلیب',
+
+'exif-planarconfiguration-1' => 'قالین Ùورمت',
+'exif-planarconfiguration-2' => 'دوزلمه Ùورمت',
+
+'exif-colorspace-65535' => 'تنظیم‌لنمه‌میش',
+
+'exif-componentsconfiguration-0' => 'یوخدور',
+
+'exif-exposureprogram-0' => 'تانیملانماییب',
+'exif-exposureprogram-1' => 'ال ایله',
+'exif-exposureprogram-2' => 'نورمال پروقرام',
+'exif-exposureprogram-3' => 'آچیقلیق اوستونلوگو',
+'exif-exposureprogram-4' => 'شاتیر اوستونلوگو',
+'exif-exposureprogram-5' => 'یارادیجی پروقرام (میدان درینلیگینه اَییلمیش)',
+'exif-exposureprogram-6' => 'حرکت پروقرامی (شاتیر سورعتینه اَییلمیش)',
+'exif-exposureprogram-7' => 'پورتره دورومو (دالیلاری Ùوکوس‌دا اولمایان یاخین عکسلر اوچون)',
+'exif-exposureprogram-8' => 'منظره دورومو (دالیلاری Ùوکوس‌دا اولان منظره عکسلری اوچون)',
+
+'exif-subjectdistance-value' => '$1 متر',
+
+'exif-meteringmode-0' => 'بیلینمه‌ین',
+'exif-meteringmode-1' => 'اورتا',
+'exif-meteringmode-2' => 'وسطی آغیر اورتا',
+'exif-meteringmode-3' => 'بیر-نوقطه‌لی',
+'exif-meteringmode-4' => 'نئچه-نوقطه‌لی',
+'exif-meteringmode-5' => 'اؤرنک',
+'exif-meteringmode-6' => 'قیسمی',
+'exif-meteringmode-255' => 'باشقا',
+
+'exif-lightsource-0' => 'بیلینمه‌ین',
+'exif-lightsource-1' => 'گون‌ایشیغی',
+'exif-lightsource-2' => 'Ùلورسانت',
+'exif-lightsource-3' => 'تنگستن (ایستی‌سیز ایشیق)',
+'exif-lightsource-4' => 'Ùلاش',
+'exif-lightsource-9' => 'یاخشی هاوا',
+'exif-lightsource-10' => 'بولودلو هاوا',
+'exif-lightsource-11' => 'کؤلگه',
+'exif-lightsource-12' => 'گون‌ایشیغی Ùلورسانت (D 5700 – 7100K)',
+'exif-lightsource-13' => 'گون آغ Ùلورسانت (N 4600 – 5400K)',
+'exif-lightsource-14' => 'سرین آغ Ùلورسانت (W 3900 – 4500K)',
+'exif-lightsource-15' => 'آغ Ùلورسانت (WW 3200 – 3700K)',
+'exif-lightsource-17' => 'A ایستاندارد ایشیق',
+'exif-lightsource-18' => 'B ایستاندارد ایشیق',
+'exif-lightsource-19' => 'C ایستاندارد ایشیق',
+'exif-lightsource-24' => 'ISO ایستودیو تنگستنی',
+'exif-lightsource-255' => 'باشقا ایشیق قایناغی',
+
+# Flash modes
+'exif-flash-fired-0' => 'Ùلاش یاندیریلمادی',
+'exif-flash-fired-1' => 'Ùلاش یاندیریلدی',
+'exif-flash-return-0' => 'دؤنن ایشیق بیلن Ùونکسیاسی یوخدور',
+'exif-flash-return-2' => 'دؤنن ایشیق بیلیننمه‌دی',
+'exif-flash-return-3' => 'دؤنن ایشیق بیلیندی',
+'exif-flash-mode-1' => 'زورلو Ùلاش یاندیریلماسی',
+'exif-flash-mode-2' => 'زورلو Ùلاش یاندیریلماماسی',
+'exif-flash-mode-3' => 'اوتوماتیک دوروم',
+'exif-flash-function-1' => 'Ùلاش یوخدور',
+'exif-flash-redeye-1' => 'قیرمیز-گؤز آزالتما دورومو',
+
+'exif-focalplaneresolutionunit-2' => 'اینچ',
+
+'exif-sensingmethod-1' => 'تاندیریلمامیش',
+'exif-sensingmethod-2' => 'بیر چیپ‌لی رنگ ساحه سÙنسورو',
+'exif-sensingmethod-3' => 'ایکی چیپ‌لی رنگ ساحه سÙنسورو',
+'exif-sensingmethod-4' => 'اوچ چیپ‌لی رنگ ساحه سÙنسورو',
+'exif-sensingmethod-5' => 'سیرالی رنگ ساحه سÙنسورو',
+'exif-sensingmethod-7' => 'اوچ-خط‌لی سÙنسور',
+'exif-sensingmethod-8' => 'بیر چیپ‌لی رنگ خط سÙنسورو',
+
+'exif-filesource-3' => 'دیجیتال کامئرا',
+
+'exif-scenetype-1' => 'موستقیم سالینمیش عکس',
+
+'exif-customrendered-0' => 'نورمال پروسÙس',
+'exif-customrendered-1' => 'اؤزل پروسÙس',
+
+'exif-exposuremode-0' => 'اوتو ایشیق-توتما',
+'exif-exposuremode-1' => 'ال ایله ایشیق-توتما',
+'exif-exposuremode-2' => 'اوتو دیرَکلندیرمه',
+
+'exif-whitebalance-0' => 'اوتوماتیک آغ رنگی بالانسلاندیرماسی',
+'exif-whitebalance-1' => 'ای ایله آغ رنگ بالانسلاندیرماسی',
+
+'exif-scenecapturetype-0' => 'ایستاندارد',
+'exif-scenecapturetype-1' => 'منظره',
+'exif-scenecapturetype-2' => 'پورتره',
+'exif-scenecapturetype-3' => 'گئجه گؤرونوشو',
+
+'exif-gaincontrol-0' => 'هئچ',
+'exif-gaincontrol-1' => 'آز-آلماغی آرتیر',
+'exif-gaincontrol-2' => 'چوخ-آلماغی آرتیر',
+'exif-gaincontrol-3' => 'آز-آلماغی آزالت',
+'exif-gaincontrol-4' => 'چوخ-آلماغی آزالت',
+
+'exif-contrast-0' => 'نورمال',
+'exif-contrast-1' => 'یوموشاق',
+'exif-contrast-2' => 'بَرک',
+
+'exif-saturation-0' => 'نورمال',
+'exif-saturation-1' => 'آشاغی دویدورما',
+'exif-saturation-2' => 'یوخاری دویدورما',
+
+'exif-sharpness-0' => 'نورمال',
+'exif-sharpness-1' => 'یوموشاق',
+'exif-sharpness-2' => 'بَرک',
+
+'exif-subjectdistancerange-0' => 'بیلینمه‌ین',
+'exif-subjectdistancerange-1' => 'ماکرو',
+'exif-subjectdistancerange-2' => 'یاخین گؤرونوش',
+'exif-subjectdistancerange-3' => 'اوزاق گؤرونوش',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'قوزئی عرض درجه‌سی',
+'exif-gpslatitude-s' => 'گونئی عرض درجه‌سی',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'دوغو عرض درجه‌سی',
+'exif-gpslongitude-w' => 'باتی عرض درجه‌سی',
+
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '{{PLURAL:$1|بیر|$1}} متر دنیز سویه‌سیندن یوخاری',
+'exif-gpsaltitude-below-sealevel' => '{{PLURAL:$1|بیر|$1}} متر نیز سویه‌سیندن آشاغی',
+
+'exif-gpsstatus-a' => 'اؤلچمه یئکونلاشماییب',
+'exif-gpsstatus-v' => 'وئریلن‌لری اؤتورمک اوچون حاضردیر',
+
+'exif-gpsmeasuremode-2' => '2-اؤلچولو اولچو',
+'exif-gpsmeasuremode-3' => '3-اؤلچولو اولچو',
+
+# Pseudotags used for GPSSpeedRef
+'exif-gpsspeed-k' => 'کیلومتر ساهات دا',
+'exif-gpsspeed-m' => 'مایل ساهات دا',
+'exif-gpsspeed-n' => 'دویون',
+
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'کیلومتر',
+'exif-gpsdestdistance-m' => 'مایل',
+'exif-gpsdestdistance-n' => 'دنیز مایلی',
+
+'exif-gpsdop-excellent' => 'علا($1)',
+'exif-gpsdop-good' => 'یاخشی($1)',
+'exif-gpsdop-moderate' => 'متوسط($1)',
+'exif-gpsdop-fair' => 'نه چوخ یاخشی ($1)',
+'exif-gpsdop-poor' => 'ضعی٠($1)',
+
+'exif-objectcycle-a' => 'Ùقظ صوبح',
+'exif-objectcycle-p' => 'Ùقط آخشام',
+'exif-objectcycle-b' => 'گوندوزلر و آخشام‌لار',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'دوغرو جهت',
+'exif-gpsdirection-m' => 'مغناطیسی جهت',
+
+'exif-ycbcrpositioning-1' => 'مرکزلشدیریلمیش',
+'exif-ycbcrpositioning-2' => 'اشتراکه',
+
+'exif-dc-contributor' => 'مشارکت ائدنلر',
+'exif-dc-coverage' => 'مئدیانین مکان و زامان چرچیوه‌سی',
+'exif-dc-date' => 'تاریخ لر',
+'exif-dc-publisher' => 'یایمچی',
+'exif-dc-relation' => 'علاقه‌لی مئدیا',
+'exif-dc-rights' => 'حاقلار',
+'exif-dc-source' => 'قیناق مئدیا',
+'exif-dc-type' => 'مئدیانین تیپی',
+
+'exif-rating-rejected' => 'رد ائدیلدی',
+
+'exif-isospeedratings-overflow' => '65535-دن بؤیوک‌دور',
+
+'exif-iimcategory-ace' => 'هنر، مدنیت و ایلنجه',
+'exif-iimcategory-clj' => 'جنایت و قانون',
+'exif-iimcategory-dis' => 'Ùاجعه Ùˆ قزا‌لار',
+'exif-iimcategory-fin' => 'ایقتصاد و تجارت',
+'exif-iimcategory-edu' => 'تحصیل',
+'exif-iimcategory-evn' => 'یاشام محیطی',
+'exif-iimcategory-hth' => 'ساغللیک',
+'exif-iimcategory-hum' => 'اینسان ماراق‌لاری',
+'exif-iimcategory-lab' => 'ایش',
+'exif-iimcategory-lif' => 'حیات طرزی و ایلنجه',
+'exif-iimcategory-pol' => 'سیاست',
+'exif-iimcategory-rel' => 'دین وایمان',
+'exif-iimcategory-sci' => 'علم و تکنولوژی',
+'exif-iimcategory-soi' => 'اجتماعی مسئله‌لر',
+'exif-iimcategory-spo' => 'ورزش',
+'exif-iimcategory-war' => 'محاربه، موناقیشه و ایغتیشاش‌لار',
+'exif-iimcategory-wea' => 'هوا',
+
+'exif-urgency-normal' => 'نورمال($1)',
+'exif-urgency-low' => 'آز ($1)',
+'exif-urgency-high' => 'چوخ($1)',
+'exif-urgency-other' => 'ایستیÙاده‌چی طرÙین‌دن مویین اولونموش بیرینجی‌لیک ($1)',
+
+# External editor support
+'edit-externally' => 'بو Ùایلی خاریجی یازیلیم‌لا دَییشدیر',
+'edit-externally-help' => '(آرتیق بیلگیلر اوچون [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] صحیÙه‌سینه باخ)',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'بوتون',
+'namespacesall' => 'بوتون',
+'monthsall' => 'بوتون',
+'limitall' => 'بوتون',
+
+# Email address confirmation
+'confirmemail' => 'ایمیل-پوست اونوانینی تصدیق ائت',
+'confirmemail_noemail' => '[[Special:Preferences|ایستیÙاده‌چی ترجیه لرینی]] تعیین اولونموش اویغون بیر ایمیل عنوانینیز یوخ.',
+'confirmemail_text' => 'ویکینین ایمیل اعتباری کوللانمابیلمئک اوچون، اول ایمیل عنوانینیزین تصدیقلنمه‌سی لازیم‌دیر.
+اونوانینیزا تسدیق ائ-پوچت گؤندرمک اوچون آشاغی‌داکی بوتونو تیکلایین.
+گؤندریله‌جک ایسماریج‌لار اونوانینیزی تسدیقلمک اوچون براوزئری ایله سیز گیریش ایمکانینیز، تسدیق کودو ائهتیوا ائدن بیر علاقه اولا‌جاق؛
+لینکی تاراییجینیدا آچین و ایمیل عنوانینیزین اعتبارلی‌لیغینی یوخلایین.',
+'confirmemail_pending' => 'بیر تسدیقلمه کودو سیزه اونسوز دا ایمیلندی؛
+اگر حسابینیزی یئنی آچ بیلسنیز، یئنی بیر کود ایستمه‌یه ایشدن اول گلمه‌سینی بیر آز گؤزلمیی ایسته‌یه بیلرسینیز.',
+'confirmemail_send' => 'تسدیق کودو گؤندر',
+'confirmemail_sent' => 'تصدیق ایمیل مکتوبو گؤندریلدی.',
+'confirmemail_oncreate' => 'بیر تصدیقله‌مه کودو ائ-پوست اونوانینیزا گؤندریلدی.
+گیریش ائتمک اوچون بو کود لازیملی دئيیل، آنجاق بو ویکیدئکی هر هانسی بیر ائ-پوست اساسلی خصوصیتی دؤوره‌يه سوخماق اوچون بونو تعمین ائتمک مجبوریتینده‌سینیز.',
+'confirmemail_sendfailed' => '{{SITENAME}} تسدیق مای‌لی گؤندره. اعتبارسیز کاراکتئرلر اولا بیلر اونوانی نظارت ائدین
+
+مایل پروقرامی قایتاردی: $1',
+'confirmemail_invalid' => 'خطاتسدیقله‌مه کودو. کودون واختی کئچمیش اولا بیلر.',
+'confirmemail_needlogin' => 'ائ-پوست اونوانینیزین تسدیق‌لنمه‌سی اوچون $1 لازیمدیر.',
+'confirmemail_success' => 'ایمیل اونوانینیز ایندی تسدیق ائدیلدی.
+سیز ایندی [[Special:UserLogin|حئساب آچاراق]] ویکیدن لذت آپارین.',
+'confirmemail_loggedin' => 'ایمیل‌نیز ایندی تسدیق ائدیلدی.',
+'confirmemail_error' => 'قئید بیلینمه‌ين بیر خطا اوچون قئید اولونمادی.',
+'confirmemail_subject' => '{{SITENAME}} ایمیل تسدیق ائتمه',
+'confirmemail_body' => 'بیری، احتیماللا سیز، $1 ایپ اونوانیندان،
+{{SITENAME}} سايتیندا بو ائ-پوچت اونوانی ایله $2 حسابینی آچدی.
+
+بو حسابین حقیقتن سیزه عاید اولدوغونو تسدیق و {{SITENAME}} سايتینداکی
+ائ-پوست Ùونکسیيالارینی آکتیو حالا گتیرمک اوچون آشاغیداکی علاقه‌‌نی تارايیجینیزدا آچین.
+
+$3
+
+اگر حسابی سیز * آچمادیيسانیز *، ائ-پوچت اونوانی دوغرولاماسینی
+لغو ائتمک اوچون آشاغیداکی علاقه‌‌نی تعقیب ائدین:
+
+$5
+
+بو تسدیق کودو $4 تاریخینه قدر اعتبارلی اولاجاق.',
+'confirmemail_body_changed' => 'بیری، ائحتیماللا سیز، $1 ایپ اونوانین‌دان،
+{{SITENAME}} سایتیندا "$2" حسابی اوچون ایمیل اونوانینی دییشدیردی.
+
+بو حسابین حقیقتن سیزه عاید اولدوغونو تسدیق و {{SITENAME}} سایتین‌داکی
+ایمیل Ùونکسیا‌لارینی تکرار آکتیو حالا گتیرمک اوچون آشاغی‌داکی علاقنی تاراییجینیزدا آچین.:
+
+$3
+
+اگر حساب سیزه عاید * دئییلسه *، ائ-پوچت اونوانی دوغرولاماسینی
+لغو ائتمک اوچون آشاغی‌داکی علاقنی تعقیب ائدین:
+
+$5
+
+بو تسدیق کودو $4 تاریخینه قدر اعتبارلی اولا‌جاق.',
+'confirmemail_body_set' => 'بیری $1 ای‌پی آدرئسیيلئ{{SITENAME}} سايتیندا "$2" ایستیÙاده‌چی حسابی ایمیل اونوانی اولاراق بو ایمیل اونوانینی ایÙاده ائتدی.
+
+اگر بو عملیاتی ائدن سیزسینیزسه Ùˆ {{SITENAME}} سايتینداکی ایمیل Ùونکسیيالارینی تکرار آکتیو ائتمک ایسته‌يیرسینیزسه آشاغیداکی علاقه‌‌نی تارايیجینیزدا آچمانیز لازیمدیر:
+
+$3
+
+اگر بو عملیاتی ائدن سیز دئيیلسینیزسه و بئله بیر عضولويونوز يوخسا ایمیل تسدیق عملیاتینی لغو ائتمک اوچون آشاغیداکی علاقه‌‌نی تارايیجینیزدا آچمانیز لازیمدیر:
+
+$5
+
+بو تسدیق کودو $4 تاریخینه قدر اعتبارلیدیر.',
+'confirmemail_invalidated' => 'ایمیل تصدیقلنمه‌سی دایاندیریلدی',
+'invalidateemail' => 'ایمیل تصدیقلنمه‌سین‌دن ایمتینا',
+
+# Scary transclusion
+'scarytranscludedisabled' => '[«Interwiki transcluding»دن چیخیلمیش‌دیر]',
+'scarytranscludefailed' => '[$1اوچون شابلون آلیشی موÙقیت‌سیز اولدو]',
+'scarytranscludefailed-httpstatus' => '[چاغریش $1 شابلون اوچون اولا بیلمه دی: اچ‌تی‌تی‌پی خطاسی $2]',
+'scarytranscludetoolong' => '[آدرس(URL)اوزوندور]',
+
+# Delete conflict
+'deletedwhileediting' => "'''دیققت!''' بو صحیÙه‌‌ سیز دَییشدیرمه‌ائتمه‌يه باشلادیقدان سونرا سیلینمیشدیر!",
+'confirmrecreate' => "بو صحیÙÙ†ÛŒ [[User:$1|$1]] ([[User talk:$1|مئساژ]]) ایستیÙاده‌چی‌سی سیز صحیÙه‌ده دییشیک‌لیک ائدرکن سیلمیشتیر، سببی:
+:' $2
+صحیÙÙ†ÛŒ باش‌دان آچماق ایسیتیورسانیز، لطÙاً تسدیق ائدین.",
+'confirmrecreate-noreason' => '[[User:$1|$1]] ([[User talk:$1|دانیشیق]]) آدلی ایستیÙاده‌چی، سیز ديَیشیکلیک ائتمه‌يه باشلادیقدان سونرا بو صحیÙه‌‌نی سیلدی. خاهیش ائدیریک بو صحیÙه‌‌نی حقیقتن يئنیدن ياراتماق ایسته‌دیگینیزی تسدیق ائدین.',
+'recreate' => 'يئنیله‌مک',
+
+# action=purge
+'confirm_purge_button' => 'اولدو',
+'confirm-purge-top' => 'بو صحیÙه‌‌ کئشدن (cache) سیلینسین؟',
+'confirm-purge-bottom' => 'بیر صحیÙه‌‌نی لغو ائتمک کئشی تمیزله‌ير Ùˆ ان آکتوال دیستریبوتیوین گؤرونمه‌سینه مجبور ائدر.',
+
+# action=watch/unwatch
+'confirm-watch-button' => 'اولدو',
+'confirm-watch-top' => 'بو صÙحه‌نی ایزله‌دیکلرینیزه آرتیریلدی',
+'confirm-unwatch-button' => 'اولدو',
+'confirm-unwatch-top' => 'بو صÙحه‌نی ایزله‌دیگینیز صÙحه‌لردن قالدیریلدی',
+
+# Multipage image navigation
+'imgmultipageprev' => '&larr; اولکی صحیÙه‌‌',
+'imgmultipagenext' => 'سونراکی صحیÙه‌‌ &rarr;',
+'imgmultigo' => 'گئت!',
+'imgmultigoto' => '$1 صحیÙه‌‌يه گئت',
+
+# Table pager
+'ascending_abbrev' => 'آرتما سیراسینا گؤره',
+'descending_abbrev' => 'آزالما سیراسینا گؤره',
+'table_pager_next' => 'سونراکی صحیÙÙ‡',
+'table_pager_prev' => 'قاباغکی صحیÙÙ‡',
+'table_pager_first' => 'ایلک صحیÙه‌‌',
+'table_pager_last' => 'سون صحیÙه‌‌',
+'table_pager_limit' => 'صحیÙه‌‌ده $1 مؤوقئ سرگیله',
+'table_pager_limit_label' => 'هر صحیÙه‌ده اولان موردلر سایی‌سی',
+'table_pager_limit_submit' => 'گئت',
+'table_pager_empty' => 'نتیجه سیز',
+
+# Auto-summaries
+'autosumm-blank' => 'صحیÙه‌‌نی بوشالتدی',
+'autosumm-replace' => "صحیÙه‌‌نین مظمونو ' $1' يازیسی ایله ديَیشدیریلدی",
+'autoredircomment' => '[[$1]] صحیÙه‌‌سینه ایستیقامتلندیریلیر',
+'autosumm-new' => "صحیÙه‌‌نی ' $1' ایله يارات",
+
+# Live preview
+'livepreview-loading' => 'یوکلنیر...',
+'livepreview-ready' => 'گؤزله... حاضردیر!',
+'livepreview-failed' => 'جانلی اؤنیزلئمئ موÙقیتسیز! نورمال سینیق گوستریشی کولانین.',
+'livepreview-error' => 'علاقه‌‌ موÙقیتسیز:$1 "$2".
+نورمال سینیق گوستریشی کولانین.',
+
+# Friendlier slave lag warnings
+'lag-warn-normal' => '$1 {{PLURAL: $1 | سانیيه‌دن | سانیيه‌ده}} يئنی ديَیشیکلیکلر بو سیياهیدا گؤرولمه‌يه.',
+'lag-warn-high' => 'وئریلنلر بازاسی سونوجوسونداکی هددیندن آرتیق گئجیکمه‌دن گؤره، $1 {{PLURAL:$1 | سانیيه‌دن | سانیيه‌دن}} يئنی ديَیشیکلیکلر بو سیياهیدا گؤرونمئيئبیلیر.',
+
+# Watchlist editor
+'watchlistedit-numitems' => 'ایزلئمئ صحیÙه‌‌نیزده {{PLURAL:$1|1 باشلیق|$1 باشلیق}} وار، دانیشیق صحیÙه‌‌لری چیخماق شرطیله.',
+'watchlistedit-noitems' => 'ایزله‌مه سیياهینیز بوشدور.',
+'watchlistedit-normal-title' => 'ایزله‌دیگیم صحیÙه‌‌لری دَییشدیر',
+'watchlistedit-normal-legend' => 'ایزله‌مه سیياهیسیندان باشلیقلارین سیلینمه‌سی',
+'watchlistedit-normal-explain' => 'ایزله‌مه سیياهینیزدا باشلیقلار آشاغیدا گؤستریلمیشدیر.
+بیر باشلیغی چیخارماق اوچون، يانینداکی قوتوجوغو ایشارله‌يین و «{{int:Watchlistedit-normal-submit}}» دويمه‌سینی باسین.
+[[Special:EditWatchlist/raw|سطرلر سیياهیسینی]] ده تشکیل ائده بیلرسینیز',
+'watchlistedit-normal-submit' => 'باشلیقین سیلینمه‌سی',
+'watchlistedit-normal-done' => '{{PLURAL:$1|$1 صحیÙه‌‌}} ایزله‌مه صحیÙه‌‌لرینیزدن سیلیندی:',
+'watchlistedit-raw-title' => 'چیی ایزله‌دیکلری دَییشدیر',
+'watchlistedit-raw-legend' => 'چیی ایزله‌دیکلری دَییشدیر',
+'watchlistedit-raw-explain' => 'ایزله‌مه سیياهینیزدا باشلیقلار آشاغیدا گؤستریلیر. هر سطرده بیر باشلیق اولماق عذره، باشلیقلاری علاوه‌‌ ائده‌رک يا دا سیله‌رک سیياهینی تشکیل ائده بیلرسینیز.
+بیتدیگینده «{{int:Watchlistedit-raw-submit}}» يئ تیکلايینیز.
+آيریجا [[Special:EditWatchlist|استاندارت تنزیمله‌مه صحیÙه‌‌سینی]] دا ایستیÙاده ائده بیلرسینیز.',
+'watchlistedit-raw-titles' => 'باشلیقلار:',
+'watchlistedit-raw-submit' => 'ایزلدیگیم صحیÙه‌لرین سیاهی‌سینین یئنی‌لنمه‌سی',
+'watchlistedit-raw-done' => 'ایزله‌دیکلرینیز گونجل‌لندی.',
+'watchlistedit-raw-added' => '{{PLURAL:$1|بیر|$1}} باشلیق آرلیریلدی:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|بیر|$1}} باشلیق چیخاریلدی:',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'ایلگیلی دَییشیکلیکلره باخین',
+'watchlisttools-edit' => 'ایزله‌دیکلره باخ و اونلاری دَییشدیر',
+'watchlisttools-raw' => 'چیی ایزله‌دیکلری دَییشدیر',
+
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|دانیشیق]])',
+
+# Core parser functions
+'unknown_extension_tag' => 'تانینمامیش گنیشلندیرمه اÙتیکÙتی «$1»',
+'duplicate-defaultsort' => "'''دیقت:''' احتیمال ائدیلن «$2» دÙالت آچاری، قاباقکی «$1» دÙالت آچارینی گئچرسیز ائدیر.",
+
+# Special:Version
+'version' => 'نوسخه‌',
+'version-extensions' => 'قورولموش گنیشلندیرمه‌لر',
+'version-specialpages' => 'اؤزل صحیÙه‌لر',
+'version-parserhooks' => 'آیریشدیران چنگل‌لری',
+'version-variables' => 'دَییشینلر',
+'version-antispam' => 'اÙسپم اؤنله‌مه',
+'version-skins' => 'قابیقلار',
+'version-other' => 'آیری',
+'version-mediahandlers' => 'مئدیا ایشلدنلری',
+'version-hooks' => 'چنگل‌لر',
+'version-extension-functions' => 'علاوه‌‌ Ùوبکسیيالار',
+'version-parser-extensiontags' => 'آیریشدیران گنیشلندیرمه اÙتیکÙتلری',
+'version-parser-function-hooks' => 'آیریشدیران Ùونکسیا چنگل‌لری',
+'version-hook-name' => 'چنگه‌لین آدی',
+'version-hook-subscribedby' => 'طرÙیندن گیریش‌‌میش',
+'version-version' => '(نسخه $1)',
+'version-license' => 'لیسانس',
+'version-poweredby-credits' => "بو wیکی ' ''[//www.mediawiki.org/ مئدیاwیکی]'ع' پروقرامی ایستیÙاده ائدیله‌رک يارادیلمیشدیر، یاازارلار © 2001-$1 $2.",
+'version-poweredby-others' => 'آیریلار',
+'version-credits-summary' => 'بو ایستÙاده چیلر دییشدیر لرینه گوره [[Special:Version|مئدیاویکی]] تانیش ائدیرم.',
+'version-license-info' => 'مئدیاویکی بیر اؤزگور یازیلیم‌دیر؛ سیز اونو، اؤزگور یازیلیم قورولوشو یایان GNU گنل عمومی لیسانسی اساسی‌له یئنی‌دن داغیدیب یوخسا دَییشه بیلرسینیز؛ یا لیسانسین ۲-نجی نوسخه‌سی، یا دا (اؤز سئچدیگینیزله) هر هانکی سونراکی نوسخه‌سی.
+
+مئدیاویکی، Ùایدالی اولماق اومودویله داغینیب‌دیر، اما هئچ قارانتی‌سی یوخدور؛ حتی تیجارت یا بیر ایشه اویغون اولماق قارانتی‌سی ده یوخدور.باشقا بیلگیلر اوچون GNU گنل عمومی لیسانسینا باخین.
+
+سیز گرک بو یازیلیم‌لا، [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU گنل عمومی لیسانسی]نین بیر نوسخه‌نی‌ده آلمیش اولاسینیز؛ ائله اولماسا، [//www.gnu.org/licenses/old-licenses/gpl-2.0.html اونو آنلاین اوخویون]، یوخسا اؤزگور یازیلیم قورولوشونا بو آدرس‌ده یازین: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301',
+'version-software' => 'يوکلو پروقرام',
+'version-software-product' => 'محصول',
+'version-software-version' => 'نوسخه‌',
+'version-entrypoints' => 'گیریش نقطه‌‌سی‌نین آدرسی',
+'version-entrypoints-header-entrypoint' => 'گیریش نقطه‌‌سی',
+'version-entrypoints-header-url' => 'اینترنت آدرسی',
+
+# Special:FilePath
+'filepath' => 'Ùايل يولو',
+'filepath-page' => 'Ùایل:',
+'filepath-submit' => 'گئت',
+'filepath-summary' => 'بو اؤزل صحیÙه‌‌ بیر Ùايل اوچون تام يولو گتیرر.
+شکیللر تام تصویرین گؤستریلیر، دیگر Ùايل نؤولری ایله باغلی پروقراملاری بیرباشا ایشه باشلايیر.',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch' => 'دوبلیکات Ùايل آختاریشی',
+'fileduplicatesearch-summary' => 'تعمین ائتمک ديَری دؤشه‌مه‌سینده بنزر Ùايللاری آختار.',
+'fileduplicatesearch-legend' => 'Dublikatı axtar',
+'fileduplicatesearch-filename' => 'Ùايل آدی:',
+'fileduplicatesearch-submit' => 'آختار',
+'fileduplicatesearch-info' => '$1 × $2 پیکسÙÙ„<br />Ùایل اؤلچوسو: $3<br />MIME نوعو: $4',
+'fileduplicatesearch-result-1' => '«$1» Ùایلینین هئچ بیر عینی کوپیسی یوخدور.',
+'fileduplicatesearch-result-n' => '«$1» Ùایلینین، {{PLURAL:$2|بیر|$2}} عینی کوپیسی واردیر.',
+'fileduplicatesearch-noresults' => '"$1" آدیندا Ùایل تاپیلمادی.',
+
+# Special:SpecialPages
+'specialpages' => 'اؤزل صحیÙه‌لر',
+'specialpages-note' => '----
+* نورمال اؤزل صحیÙه‌لر.
+* <span class="mw-specialpagerestricted">محدودلاشدیریلمیش اؤزل صحیÙه‌لر.</span>',
+'specialpages-group-maintenance' => 'جاری مروزه‌لر',
+'specialpages-group-other' => 'دیگر خصوصی صحیÙه‌لر',
+'specialpages-group-login' => 'گیریش / حساب یاراد',
+'specialpages-group-changes' => 'سون دییشیک‌لیک‌لر و قئیدلر',
+'specialpages-group-media' => 'مئدیا مروزه‌لری و یوکلمه‌لر',
+'specialpages-group-users' => 'ایستیÙاده‌چی‌لر Ùˆ حاقلار',
+'specialpages-group-highuse' => 'ان چوخ ایستیÙاده ائدیلن صحیÙه‌لر',
+'specialpages-group-pages' => 'صحیÙه‌لرین سیاهی‌لاری',
+'specialpages-group-pagetools' => 'صحیÙÙ‡ آلتلری',
+'specialpages-group-wiki' => 'بیلگیلر و آلتلر',
+'specialpages-group-redirects' => 'خصوصی ایستیقامتلندیرمه صحیÙه‌لری',
+'specialpages-group-spam' => 'هرزه یازماق آلت‌لری',
+
+# Special:BlankPage
+'blankpage' => 'بوش صحیÙÙ‡',
+'intentionallyblankpage' => 'بو صحیÙÙ‡ خصوصیله بوش‌دور.',
+
+# External image whitelist
+'external_image_whitelist' => ' #بو سطری اولدوغو کیمی بوراخین <pre>
+#دوزگون ایÙاده (رÙقولار اÙکسپرÙØ´ÙÙ†) پارچالارینی (یالنیز // آراسیندا اولان قیسمی) آشاغی‌يا قویون
+#بونلار ائشیک‌ده‌کی عکسلرین آدرسلریله تطبیق اولاجاقلار
+#تطبیق اولانلار، عکس کیمی گؤستریله‌جکلر، اولمایانلارا یالنیز بیر باغلانتی گؤستریله‌جکدیر
+#بو # نیشانی ایله باشلایان سطرلر، شرح کیمی نظرده توتولاجاقلار
+#بو حرÙلرین کیچیک/بؤیوک اولماغینا حساس دئییل
+
+#بوتون دوزگون ایÙاده پارچالارینی، بو سطرین اوستونه قویون. بو سطری اولدوغو کیمی بوراخین</pre>',
+
+# Special:Tags
+'tags' => 'مومکون دییشیک‌لیک ائتیکئت‌لری',
+'tag-filter' => '[[Special:Tags|اÙتیکÙت]] سۆزگÙجی:',
+'tag-filter-submit' => 'سۆزگَج',
+'tags-title' => 'یاپیشقان',
+'tags-intro' => 'بو صحیÙه، یازیلیم دَییشدیرمه‌لری نیشانلایان اÙتیکÙتلری Ùˆ اونلارین آنلاملارینی گؤستریر.',
+'tags-tag' => 'یاپیشقان آدی',
+'tags-display-header' => 'ديَیشیکلیک لیستئلئریندئکی گؤرونوش',
+'tags-description-header' => 'آنلامینین تام آچیقلاماسی',
+'tags-hitcount-header' => 'یاپیشقانلی دییشیک‌لیک‌لر',
+'tags-edit' => 'دَییشدیر',
+'tags-hitcount' => '$1 {{PLURAL:$1|دییشیکلیک|دییشیک‌لیک}}',
+
+# Special:ComparePages
+'comparepages' => 'صحیÙه‌لری قارشی‌لاش‌دیر',
+'compare-selector' => 'صحیÙÙ‡ دییشدیر‌لرینی قارشی‌لاش‌دیر',
+'compare-page1' => 'صحیÙÙ‡ 1',
+'compare-page2' => 'صحیÙÙ‡ 2',
+'compare-rev1' => 'نوسخه ۱',
+'compare-rev2' => 'نوسخه ۲',
+'compare-submit' => 'قارشی‌لاش‌دیر',
+'compare-invalid-title' => 'وئردیگینیز باشلیق گئچرسیزدیر.',
+'compare-title-not-exists' => 'وئردیگینیز باشلیق یوخدور.',
+'compare-revision-not-exists' => 'بَلیرتدیگینیز نوسخه یوخدور.',
+
+# Database error messages
+'dberr-header' => 'بو ویکی‌ده بیر ایشکال وار',
+'dberr-problems' => 'عوذر ایسته‌ییریک!
+بو سایت‌دا تÙکنیکی ایشکال‌لار واردیر.',
+'dberr-again' => 'بیر نئچه دقیقه دؤزوب سونرا یئنی‌دن یوکله‌یین.',
+'dberr-info' => '(دیتابیس خیدمت‌چیسی‌یه باغلانماق اولونمادی: $1)',
+'dberr-usegoogle' => 'بو آرادا، گوگل‌ده آختارابیلرسینیز.',
+'dberr-outofdate' => 'دیقت ائدین Ú©ÛŒ اوردا بیزیم سایتیمیزین ایندÙکسی کؤهنه اولا بیلر.',
+'dberr-cachederror' => 'بو ایسته‌نیلن صحیÙه‌نین بیر Ú©ÙŽØ´ اولونموش کوپی‌سیدیر Ùˆ کؤهنه اولا بیلر.',
+
+# HTML forms
+'htmlform-invalid-input' => 'سیزین بعضی وئردیکلرینیزله ایلگی‌لی موشکول‌لر وار',
+'htmlform-select-badoption' => 'سیز وئردیگینیز دَیَر، گئچرلی دئییل.',
+'htmlform-int-invalid' => 'سیز وئردیگینیز دَیَر، بیر تام عدد دئییل.',
+'htmlform-float-invalid' => 'سیز وئردیگینیز دَیَر، بیر عدد دئییل.',
+'htmlform-int-toolow' => 'سیز وئردیگینیز دَیَر، $1 آشاغی حدین‌دن آزدیر',
+'htmlform-int-toohigh' => 'سیز وئردیگینیز دَیَر، $1 یوخاری حدین‌دن چوخدور',
+'htmlform-required' => 'بو دَیَر لازیم‌دیر',
+'htmlform-submit' => 'گؤندر',
+'htmlform-reset' => 'دَییشیکلیکلری قایتار',
+'htmlform-selectorother-other' => 'باشقا',
+
+# SQLite database support
+'sqlite-has-fts' => '$1 بوتون یازی آختارما دستگی‌له',
+'sqlite-no-fts' => '$1 بوتون یازی آختارماماق‌لا',
+
+# New logging system
+'logentry-delete-delete' => '$1ØŒ $3 صحیÙه‌سینی {{GENDER:$2|سیلدی}}',
+'logentry-delete-restore' => '$1ØŒ $3 صحیÙه‌سینی {{GENDER:$2|قایتاردی}}',
+'logentry-delete-event' => '$1، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} {{GENDER:$2|دَییشدیردی}}: $4',
+'logentry-delete-revision' => '$1ØŒ $3 صحیÙه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} {{GENDER:$2|دَییشدیردی}}: $4',
+'logentry-delete-event-legacy' => '$1، $3-ده سیاهی اولایلارینین گؤرونوشلرینی {{GENDER:$2|دَییشدیردی}}',
+'logentry-delete-revision-legacy' => '$1ØŒ $3 صحیÙه‌سینده نوسخه‌لرین گؤرونوشلرینی {{GENDER:$2|دَییشدیردی}}',
+'logentry-suppress-delete' => '$1ØŒ $3 صحیÙه‌سینی {{GENDER:$2|یاتیردی}}',
+'logentry-suppress-event' => '$1، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه {{GENDER:$2|دَییشدیردی}}: $4',
+'logentry-suppress-revision' => '$1ØŒ $3 صحیÙه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه {{GENDER:$2|دَییشدیردی}}: $4',
+'logentry-suppress-event-legacy' => '$1، $3-ده سیاهی اولایلارینین گؤرونوشلرینی گیزلینجه {{GENDER:$2|دَییشدیردی}}',
+'logentry-suppress-revision-legacy' => '$1ØŒ $3 صحیÙه‌سینده نوسخه‌لرین گؤرونوشلرینی گیزلینجه {{GENDER:$2|دَییشدیردی}}',
+'revdelete-content-hid' => 'ایچینده‌کیلر گیزلی‌دیر',
+'revdelete-summary-hid' => 'دَییشیکلیک قیساسی گیزلی‌دیر',
+'revdelete-uname-hid' => 'ایستیÙاده‌چی آدی گیزلی‌دیر',
+'revdelete-content-unhid' => 'ایچینده‌کیلر گیزلیلیک‌دن چیخدی',
+'revdelete-summary-unhid' => 'دَییشیکلیک قیساسی گیزلیلیک‌دن چیخدی',
+'revdelete-uname-unhid' => 'ایستیÙاده‌چی آدی گیزلیلیک‌دن چیخدی',
+'revdelete-restricted' => 'ایداره‌چیلره محدودیت قویدو',
+'revdelete-unrestricted' => 'ایداره‌چیلرین محدودیتلرینی گؤتوردو',
+'logentry-move-move' => '$1ØŒ $3 صحیÙه‌سینی $4-Ù‡ {{GENDER:$2|آپاردی}}',
+'logentry-move-move-noredirect' => '$1ØŒ $3 صحیÙه‌سینی، یول‌لاندیرما قویماماق‌لا، $4-Ù‡ {{GENDER:$2|آپاردی}}',
+'logentry-move-move_redir' => '$1ØŒ $3 صحیÙه‌سینی، $4-ده یول‌لاندیرما اوستونه {{GENDER:$2|آپاردی}}',
+'logentry-move-move_redir-noredirect' => '$1ØŒ $3 صحیÙه‌سینی، یول‌لاندیرما قویماماق‌لا، یول‌لاندیرما اولان $4 اوستونه {{GENDER:$2|آپاردی}}',
+'logentry-patrol-patrol' => '$1ØŒ $3 صحیÙه‌سینین $4 نوسخه‌سینی، نظارتلنمیش {{GENDER:$2|نیشانلادی}}',
+'logentry-patrol-patrol-auto' => '$1ØŒ $3 صحیÙه‌سینین $4 نوسخه‌سینی، اوتوماتیک اولاراق نظارتلنمیش {{GENDER:$2|نیشانلادی}}',
+'logentry-newusers-newusers' => ' بیر ایستیÙاده‌چی حسابی $1 {{GENDER:$2|یاراتدی}}',
+'logentry-newusers-create' => 'بیر ایستیÙاده‌چی حسابی $1 {{GENDER:$2|یاراتدی}}',
+'logentry-newusers-create2' => '$1 ایستیÙاده‌چی، $3 حسابی {{GENDER:$2|یاراتدی}}',
+'logentry-newusers-byemail' => '$3 ایستیÙاده‌چی حسابی، $1 ایله {{GENDER:$2|یارادیلیب}} Ùˆ رمز، ایمیل ایله گؤندریلیب‌دیر',
+'logentry-newusers-autocreate' => '$1 ایستیÙاده‌چی حسابی اوتوماتیک {{GENDER:$2|یارادیلدی}}',
+'logentry-rights-rights' => '$1، $3-ین قروپ عوضولوگونو $4-دن $5-ه {{GENDER:$2|دَییشدیردی}}',
+'logentry-rights-rights-legacy' => '$1، $3-ین قروپ عوضولوگونو {{GENDER:$2|دَییشدیردی}}',
+'logentry-rights-autopromote' => '$1-ین مقامی اوتوماتیک $4-دن $5-ه {{GENDER:$2|آرتیریلدی}}',
+'rightsnone' => '(هئچ)',
+
+# Feedback
+'feedback-bugornote' => 'بیر تکنیکی خطانی شرح وئرمگه آماده اولساز، لوطÙاً [$1 بیر باگ بیلدیرین].
+او اولماسا، بو آشاغیداکی ساده Ùورم‌دان ایستیÙاده ائده بیلرسینیز. سیزین باخیشینیز، ایستیÙاده‌چی آدینیزلا، «[$3 $2]» صحیÙه‌سینه آرتیریلاجاق‌دیر.',
+'feedback-subject' => 'قونو:',
+'feedback-message' => 'مئساژ:',
+'feedback-cancel' => 'لغو ائت',
+'feedback-submit' => 'گئری-بیلدیریمی یول‌لا',
+'feedback-adding' => 'صحیÙه‌یه گئری-بیلدیریم آرتیریلیر...',
+'feedback-error1' => 'خطا: API-دان تانینمامیش نتیجه',
+'feedback-error2' => 'خطا: دَییشدیرمه باشاری‌سیز اولدو',
+'feedback-error3' => 'خطا: API-دان جاواب گلمه‌دی',
+'feedback-thanks' => 'تشکورلر! سیزین گئری-بیلدیریمینیز «[$2 $1]» صحیÙه‌سینه گؤندریلدی.',
+'feedback-close' => 'اولدو',
+'feedback-bugcheck' => 'گؤزل! Ùقط لوطÙاً باخین او [$1 تانینمیش خطالار]دان اولماسین.',
+'feedback-bugnew' => 'یوخلادیم. یئنی بیر خطا گؤندر',
+
+# Search suggestions
+'searchsuggest-search' => 'آختار',
+'searchsuggest-containing' => 'ساخلانیلیر...',
+
+# API errors
+'api-error-badaccess-groups' => 'سیزین بو ویکی‌یه Ùایل یوکله‌مک ایجازه‌نیز یوخدور.',
+'api-error-badtoken' => 'ایچری خطاسی: پیس کود.',
+'api-error-copyuploaddisabled' => 'بو خیدمتچی‌ده، اینترنت آدرسی‌له Ùایل یوکله‌مک یاساقلانیب‌دیر.',
+'api-error-duplicate' => 'بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|[$2 Ùایل]|[$2 Ùایل‌لار]}} واردیر.',
+'api-error-duplicate-archive' => 'بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|[$2 Ùایل]|[$2 Ùایل‌لار]}} وار ایدی، اما {{PLURAL:$1|سیلینیب‌دیر|سیلینیبلر}}.',
+'api-error-duplicate-archive-popup-title' => 'تیکرارلانمیش {{PLURAL:$1|Ùایل|Ùایل‌لار}}ØŒ اؤنجه‌دن {{PLURAL:$1|سیلینیب‌دیر|سیلینیبلر}}.',
+'api-error-duplicate-popup-title' => 'تیکرارلانمیش {{PLURAL:$1|Ùایل|Ùایل‌لار}}.',
+'api-error-empty-file' => 'سیز یول‌لادیغینیز Ùایل، بوش ایدی.',
+'api-error-emptypage' => 'یئنی بوش صحیÙÙ‡ یارادماغا ایجازه یوخدور.',
+'api-error-fetchfileerror' => 'ایچری خطا: Ùایلی گتیرمک‌ده بیر ایشکال قاباغا گلدی.',
+'api-error-fileexists-forbidden' => '«$1» آدلا بیر Ùایل واردیر Ùˆ اوستونه یازماق اولماز.',
+'api-error-fileexists-shared-forbidden' => 'پایلاشمیش آنباردا «$1» آدلا بیر Ùایل واردیر Ùˆ اوستونه یازماق اولماز.',
+'api-error-file-too-large' => 'سیز یول‌لادیغینیز Ùایل، چوخ یئکه ایدی.',
+'api-error-filename-tooshort' => 'Ùایل آدی چوخ قیسادی.',
+'api-error-filetype-banned' => 'بوجور Ùایل یاساق‌لانیب‌دیر.',
+'api-error-filetype-banned-type' => '$1 Ùایل {{PLURAL:$4|نؤوعو ایجازه‌لی دئییل|نؤوعلری ایجازه‌لی دئییل‌لر}}. ایجازه‌لی Ùایل {{PLURAL:$3|نؤوعو بئله‌دیر|نؤوعلاری بئله‌دیرلر}}: $2.',
+'api-error-filetype-missing' => 'Ùایل آدینین اوزانتیسی یوخدور.',
+'api-error-hookaborted' => 'سیز وئردیگینیز دَییشیکلیکلرین قاباغی، بیر extension ایله قاباغی آلیندی.',
+'api-error-http' => 'ایچری خطا: خیدمتچی‌یه باغلانماق اولونمادیر.',
+'api-error-illegal-filename' => 'بو Ùایل آدینا ایجازه یوخدور.',
+'api-error-internal-error' => 'ایچری خطا: سیزین Ùایلینیزی بو ویکی‌یه یوکله‌مک‌ده بیر ایشکال قاباغا گلدی.',
+'api-error-invalid-file-key' => 'ایچری خطا: Ùایل، گئچرلی آنباردا تاپیلانمادی.',
+'api-error-missingparam' => 'ایچری خطا: ایستک‌ده بعضی پارامترلر وئریلمه‌ییبلر.',
+'api-error-missingresult' => 'ایچری خطا: کوپی‌نین باشاریلی اولدوغو بیلینمیر.',
+'api-error-mustbeloggedin' => 'Ùایل یوکله‌مک اوچون، گیریش ائتمه‌لیسینیز.',
+'api-error-mustbeposted' => 'ایچری خطا: بو ایستک اوچون HTTP POST لازیم‌دیر.',
+'api-error-noimageinfo' => 'یوکله‌مک باشاریلی اولدور، اما خیدمت‌چی Ùایلا گؤره هئچ بیر بیلگیلر وئرمه‌دی.',
+'api-error-nomodule' => 'ایچری خطا: هئچ بیر آپلود ماژولی یوخدور.',
+'api-error-ok-but-empty' => 'ایچری خطا: خیدمتچی‌دن جاواب گلمه‌دی.',
+'api-error-overwrite' => 'بیر اولان Ùایلین اوستونه یازماغا ایجازه یوخدور.',
+'api-error-stashfailed' => 'ایچری خطا: خیدمتچی، گئچیجی Ùایلی ساخلایانمادی.',
+'api-error-publishfailed' => 'ایچری خطاسی: خیدمت‌چی، گئچیجی Ùایلی یایانمادی.',
+'api-error-timeout' => 'خیدمتچی، گؤزله‌نیلن واخت‌دا جاواب وئرمه‌دی.',
+'api-error-unclassified' => 'بیر تانینمامیش خطا قاباغا گلدی.',
+'api-error-unknown-code' => 'تانینمامیش خطا: «$1».',
+'api-error-unknown-error' => 'ایچری خطا: سیزین Ùایلینیزی یوکله‌مگه چالیشاندا بیر ایشکال قاباغا گلدی.',
+'api-error-unknown-warning' => 'تانینمامیش ایخطار: «$1».',
+'api-error-unknownerror' => 'تانینمامیش خطا: «$1».',
+'api-error-uploaddisabled' => 'بو ویکی‌ده یوکله‌مک باغلانیب‌دیر.',
+'api-error-verification-error' => 'Ùایل خاراب‌دیر یوخسا یانلیش اوزانتی‌سی واردیر.',
+
+# Durations
+'duration-seconds' => '{{PLURAL:$1|بیر|$1}} ثانیه',
+'duration-minutes' => '{{PLURAL:$1|بیر|$1}} دقیقه',
+'duration-hours' => '{{PLURAL:$1|بیر|$1}} ساعات',
+'duration-days' => '{{PLURAL:$1|بیر|$1}} گون',
+'duration-weeks' => '{{PLURAL:$1|بیر|$1}} Ù‡Ùته',
+'duration-years' => '{{PLURAL:$1|بیر|$1}} ایل',
+'duration-decades' => '{{PLURAL:$1|بیر|$1}} اون‌ایل',
+'duration-centuries' => '{{PLURAL:$1|بیر|$1}} یوز-ایل',
+'duration-millennia' => '{{PLURAL:$1|بیر|$1}} مین‌ایل',
+
+# Image rotation
+'rotate-comment' => 'عکس $1 {{PLURAL:$1|درجه}} ساعات عقربه‌لری ایستیقامتینده Ùیرلاندیریلب‌دیر',
+
+);
diff --git a/languages/messages/MessagesBa.php b/languages/messages/MessagesBa.php
index 72c608bf..d8a85a7a 100644
--- a/languages/messages/MessagesBa.php
+++ b/languages/messages/MessagesBa.php
@@ -25,13 +25,13 @@ $fallback = 'ru';
$namespaceNames = array(
NS_MEDIA => 'Медиа',
- NS_SPECIAL => 'ЯрҙамÑÑ‹',
+ NS_SPECIAL => 'МахÑуÑ',
NS_TALK => 'Фекерләшеү',
NS_USER => 'ҠатнашыуÑÑ‹',
NS_USER_TALK => 'ҠатнашыуÑÑ‹_менән_һөйләшеү',
NS_PROJECT_TALK => '$1_буйынÑа_фекерләшеү',
- NS_FILE => 'РәÑем',
- NS_FILE_TALK => 'РәÑем_буйынÑа_фекерләшеү',
+ NS_FILE => 'Файл',
+ NS_FILE_TALK => 'Файл_буйынÑа_фекерләшеү',
NS_MEDIAWIKI => 'MediaWiki',
NS_MEDIAWIKI_TALK => 'MediaWiki_буйынÑа_фекерләшеү',
NS_TEMPLATE => 'Ҡалып',
@@ -43,9 +43,12 @@ $namespaceNames = array(
);
$namespaceAliases = array(
+ 'ЯрҙамÑÑ‹' => NS_SPECIAL,
'Фекер_алышыу' => NS_TALK,
'ҠатнашыуÑÑ‹_м-н_фекер_алышыу' => NS_USER_TALK,
'$1_б-Ñа_фекер_алышыу' => NS_PROJECT_TALK,
+ 'РәÑем' => NS_FILE,
+ 'РәÑем_буйынÑа_фекерләшеү' => NS_FILE_TALK,
'РәÑем_б-Ñа_фекер_алышыу' => NS_FILE_TALK,
'MediaWiki_б-Ñа_фекер_алышыу' => NS_MEDIAWIKI_TALK,
'Ҡалып_б-Ñа_фекер_алышыу' => NS_TEMPLATE_TALK,
@@ -57,6 +60,85 @@ $namespaceAliases = array(
$specialPageAliases = array(
'Activeusers' => array( 'ӘүҙемҠатнашыуÑылар', 'ÐктивҠатнашыуÑылар' ),
+ 'Allmessages' => array( 'СиÑтема_хәбәрҙәре' ),
+ 'Allpages' => array( 'Барлыҡ_битәр' ),
+ 'Blankpage' => array( 'Буш_бит' ),
+ 'Block' => array( 'Блоклау' ),
+ 'Blockme' => array( 'Мине_блокла' ),
+ 'Booksources' => array( 'Китап_Ñығанаҡтары' ),
+ 'BrokenRedirects' => array( 'Өҙөлгән_йүнәлтеүҙәр' ),
+ 'Categories' => array( 'КатегориÑлар' ),
+ 'ChangeEmail' => array( 'Email-ды_алыштырыу' ),
+ 'ChangePassword' => array( 'Паролде_алыштырыу' ),
+ 'ComparePages' => array( 'Биттәрҙе_Ñағыштырыу' ),
+ 'Confirmemail' => array( 'Email-ды_раҫлау' ),
+ 'Contributions' => array( 'Өлөштәр' ),
+ 'CreateAccount' => array( 'Иҫәп_Ñҙыуы_Ñһау' ),
+ 'Deadendpages' => array( 'КөрÑөк_биттәр' ),
+ 'DeletedContributions' => array( 'Юйылған_өлөш' ),
+ 'Disambiguations' => array( 'Күп_мәғәнәлелек' ),
+ 'DoubleRedirects' => array( 'Икеле_йүнәлтеүҙәр' ),
+ 'EditWatchlist' => array( 'Күҙәтеү_иÑемлеген_мөхәррирләү' ),
+ 'Emailuser' => array( 'ҠатнашыуÑыға_хат' ),
+ 'Export' => array( 'ЭкÑпорт' ),
+ 'FileDuplicateSearch' => array( 'Файлдың_дубликаттарын_Ñҙләү' ),
+ 'Filepath' => array( 'Файл_юлы' ),
+ 'Import' => array( 'Импорт' ),
+ 'BlockList' => array( 'Блоклауҙар_иÑемлеге' ),
+ 'LinkSearch' => array( 'Һылтанмалар_Ñҙләү' ),
+ 'Listadmins' => array( 'Хакимдар_иÑемлеге' ),
+ 'Listbots' => array( 'Боттар_иÑемлеге' ),
+ 'Listfiles' => array( 'Файлдар_иÑемлеге' ),
+ 'Listgrouprights' => array( 'ҠатнашыуÑÑ‹_төркөмдәре_хоҡуҡтары' ),
+ 'Listredirects' => array( 'Йүнәлтеүҙәр_иÑемлеге' ),
+ 'Listusers' => array( 'ҠатнашыуÑылар_иÑемлеге' ),
+ 'Log' => array( 'Журналдар' ),
+ 'Lonelypages' => array( 'Етем_биттәр' ),
+ 'Longpages' => array( 'Оҙон_биттәр' ),
+ 'MergeHistory' => array( 'Тарихтарҙы_берләштереү' ),
+ 'Mostimages' => array( 'Йыш_ҡулланылған_файлдар' ),
+ 'Movepage' => array( 'Бит_иÑемен_үҙгәртеү' ),
+ 'Mycontributions' => array( 'Өлөшөм' ),
+ 'Mypage' => array( 'Битем' ),
+ 'Mytalk' => array( 'Әңгәмә_битем' ),
+ 'Myuploads' => array( 'Тейәүҙәрем' ),
+ 'Newimages' => array( 'Яңы_файлдар' ),
+ 'Newpages' => array( 'Яңы_биттәр' ),
+ 'PasswordReset' => array( 'Паролде_Ñңыртыу' ),
+ 'PermanentLink' => array( 'Даими_һылтанма' ),
+ 'Popularpages' => array( 'ПопулÑÑ€_биттәр' ),
+ 'Preferences' => array( 'Көйләүҙәр' ),
+ 'Protectedpages' => array( 'Һаҡланған_биттәр' ),
+ 'Protectedtitles' => array( 'Һаҡланған_иÑемдәр' ),
+ 'Randompage' => array( 'ОÑраҡлы_мәҡәлә' ),
+ 'Recentchanges' => array( 'Һуңғы_үҙгәртеүҙәр' ),
+ 'Recentchangeslinked' => array( 'Бәйле_үҙгәртеүҙәр' ),
+ 'Revisiondelete' => array( 'Төҙәтеүҙе_юйыу' ),
+ 'Search' => array( 'Эҙләү' ),
+ 'Shortpages' => array( 'Ҡыҫҡа_биттәр' ),
+ 'Specialpages' => array( 'МахÑуÑ_биттәр' ),
+ 'Tags' => array( 'Билдәләр' ),
+ 'Unblock' => array( 'Блокты_ÑиÑеү' ),
+ 'Uncategorizedcategories' => array( 'КатегориÑланмаған_категориÑлар' ),
+ 'Uncategorizedimages' => array( 'КатегориÑланмаған_файлдар' ),
+ 'Uncategorizedpages' => array( 'КатегориÑланмаған_биттәр' ),
+ 'Uncategorizedtemplates' => array( 'КатегориÑланмаған_ҡалыптар' ),
+ 'Undelete' => array( 'Тергеҙеү' ),
+ 'Unusedcategories' => array( 'Ҡулланылмаған_категориÑлар' ),
+ 'Unusedimages' => array( 'Ҡулланылмаған_файлдар' ),
+ 'Unusedtemplates' => array( 'Ҡулланылмаған_ҡалыптар' ),
+ 'Upload' => array( 'Тейәү' ),
+ 'UploadStash' => array( 'Йәшерен_тейәү' ),
+ 'Userlogin' => array( 'Танылыу' ),
+ 'Userlogout' => array( 'Ултырышты_тамамлау' ),
+ 'Userrights' => array( 'Хоҡуҡтарҙы_идаралау' ),
+ 'Wantedcategories' => array( 'Кәрәкле_категориÑлар' ),
+ 'Wantedfiles' => array( 'Кәрәкле_файлдар' ),
+ 'Wantedpages' => array( 'Кәрәкле_биттәр' ),
+ 'Wantedtemplates' => array( 'Кәрәкле_ҡалыптар' ),
+ 'Watchlist' => array( 'Күҙәтеү_иÑемлеге' ),
+ 'Whatlinkshere' => array( 'Бында_һылтанмалар' ),
+ 'Withoutinterwiki' => array( 'Интервикиһыҙ' ),
);
// Remove Russian aliases
@@ -209,7 +291,6 @@ $messages = array(
'qbbrowse' => 'Байҡарға',
'qbedit' => 'Үҙгәртергә',
'qbpageoptions' => 'Был бит',
-'qbpageinfo' => 'Бит тураһында мәғлүмәттәр',
'qbmyoptions' => 'Биттәрем',
'qbspecialpages' => 'МахÑÑƒÑ Ð±Ð¸Ñ‚Ñ‚Ó™Ñ€',
'faq' => 'ЙБҺ',
@@ -232,6 +313,7 @@ $messages = array(
'namespaces' => 'ИÑем арауыҡтары',
'variants' => 'Варианттар',
+'navigation-heading' => 'ÐавигациÑ',
'errorpagetitle' => 'Хата',
'returnto' => '$1 битенә ҡайтыу.',
'tagline' => '{{SITENAME}} проектынан',
@@ -475,11 +557,11 @@ $2',
# Login and logout pages
'logouttext' => "'''Һеҙ иҫәп Ñҙыуығыҙҙан ÑÑ‹Ò¡Ñ‚Ñ‹Ò“Ñ‹Ò™.'''
-Һеҙ {{SITENAME}} проектында аноним рәүештә дауам итә йәки [[Special:UserLogin|Ñңынан таныла]] алаһығыҙ (Ò¯Ò™ йәки башҡа иÑем менән).
+Һеҙ {{SITENAME}} проектында аноним рәүештә дауам итә йәки <span class='plainlinks'>[$1 Ñңынан таныла]</span> алаһығыҙ (Ò¯Ò™ йәки башҡа иÑем менән).
Ҡайһы бер биттәр һеҙ ÑиÑтемала танылған һымаҡ күренергә мөмкин, уны бөтөрөү Ó©Ñөн браузер кÑшын таҙартығыҙ.",
-'welcomecreation' => '== Рәхим итегеҙ, $1! ==
-Иҫәп Ñҙыуығыҙ Ñһалды.
-ШәхÑи [[Special:Preferences|көйләүҙәрегеҙҙе]] үҙегеҙгә уңайлы итеп үҙгәртергә онотмағыҙ.',
+'welcomeuser' => 'Рәхим итегеҙ $1!',
+'welcomecreation-msg' => 'Иҫәп Ñҙыуығыҙ Ñһалды.
+ШәхÑи [[Special:Preferences|{{SITENAME}} көйләүҙәрен]] үҙегеҙгә уңайлы итеп үҙгәртергә онотмағыҙ.',
'yourname' => 'ҠатнашыуÑÑ‹ иÑеме',
'yourpassword' => 'Һеҙҙең пароль',
'yourpasswordagain' => 'Паролде ҡабаттан Ñҙыу',
@@ -626,6 +708,7 @@ $2
'changeemail-oldemail' => 'Хәҙерге Ñлектрон почта адреÑÑ‹:',
'changeemail-newemail' => 'Яңы Ñлектрон почта адреÑÑ‹:',
'changeemail-none' => '(ÑŽÒ¡)',
+'changeemail-password' => '{{SITENAME}} прокты Ó©Ñөн паролегеҙ:',
'changeemail-submit' => 'ÐдреÑÑ‚Ñ‹ үҙгәртергә',
'changeemail-cancel' => 'Кире алырға',
@@ -802,7 +885,6 @@ $2
'template-protected' => '(һаҡланған)',
'template-semiprotected' => '(өлөшләтә һаҡланған)',
'hiddencategories' => 'Был бит $1 {{PLURAL:$1|йәшерен категориÑға}} керә:',
-'nocreatetitle' => 'Биттәр Ñһау Ñикләнгән',
'nocreatetext' => '{{SITENAME}}, Ñңы бит Ñһауҙы Ñ€Ó©Ñ…Ñәт итмәгән.
Һеҙ кире ҡайта һәм булған битте мөхәррирләй, [[Special:UserLogin|ÑиÑтемала таныла йәки Ñңы иҫәп Ñҙыуы Ñһай]] алаһығыҙ.',
'nocreate-loggedin' => 'Яңы биттәр Ñһау хоҡуғығыҙ ÑŽÒ¡.',
@@ -827,6 +909,15 @@ $2
'edit-already-exists' => 'Яңы бит Ñһап булмай.
Ул былай ҙа бар.',
'defaultmessagetext' => 'Ðлдан билдәләнгән Ñҙма',
+'content-failed-to-parse' => '$2 ÑÑтәлеге $1 төрөнә тура килмәй: $3.',
+'invalid-content-data' => 'Ярамаған мәғлүмәт',
+'content-not-allowed-here' => '"$1" ÑÑтәлеге [[$2]] бит Ó©Ñөн Ñрамай',
+
+# Content models
+'content-model-wikitext' => 'викиÑҙма',
+'content-model-text' => 'ғәҙәти Ñҙма',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Иғтибар:''' был биттә хәтерҙе күп ҡулланыуÑÑ‹ функциÑлар ныҡ күп.
@@ -1192,9 +1283,9 @@ $1",
'prefs-emailconfirm-label' => 'Электрон почтаны раҫлау:',
'prefs-textboxsize' => 'Мөхәррирләү тәҙрәһе дәүмәле',
'youremail' => 'Электрон почта *',
-'username' => 'ҠулланыуÑÑ‹ иÑеме:',
-'uid' => 'ҠатнашыуÑының идентификаторы:',
-'prefs-memberingroups' => 'Түбәндәге {{PLURAL:$1|төркөм|төркөмдәр}} ағзаһы:',
+'username' => '{{GENDER:$1|ҠулланыуÑÑ‹ иÑеме}}:',
+'uid' => '{{GENDER:$1|ҠатнашыуÑÑ‹}} номеры:',
+'prefs-memberingroups' => '{{PLURAL:$1|төркөм}} {{GENDER:$2|ағзаһы}}:',
'prefs-registration' => 'Теркәлеү ваҡыты:',
'yourrealname' => 'Һеҙҙең Ñ‹Ñын иÑемегеҙ (*)',
'yourlanguage' => 'Тышҡы күренештә ҡулланылған тел:',
@@ -1345,12 +1436,13 @@ $1",
'right-sendemail' => 'Башҡа ҡатнашыуÑыларға Ñлектрон почта аша хат ебәреү',
'right-passwordreset' => 'Паролде Ñңыртыу хәбәрҙәрен ҡарау',
+# Special:Log/newusers
+'newuserlogpage' => 'Яңы ҡулланыуÑÑ‹ Ñҙмалары',
+'newuserlogpagetext' => 'Яңы теркәлгән ҡатнашыуÑылар Ñҙмалары журналы.',
+
# User rights log
'rightslog' => 'ҠулланыуÑының хоҡуҡтары көндәлеге',
'rightslogtext' => 'Был — ҡулланыуÑÑ‹ хоҡуҡтары үҙгәрештәре Ñҙмалары журналы',
-'rightslogentry' => '$1 хоҡуҡтары $2 икән, $3 итеп үҙгертелде',
-'rightslogentry-autopromote' => '$2 автоматик рәүештә $3 ителде.',
-'rightsnone' => '(ÑŽÒ¡)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'Был битте уҡыу',
@@ -1582,6 +1674,7 @@ $1',
'backend-fail-notsame' => 'Бер үҡ булмаған файл $1 бар инде.',
'backend-fail-invalidpath' => '$1 Ñраҡлы һаҡлау юлы түгел.',
'backend-fail-delete' => '«$1» файлын юйып булмай.',
+'backend-fail-describe' => '"$1" файлының метамәғлүмәттәрен үҙгәртеп булманы.',
'backend-fail-alreadyexists' => '$1 файлы бар инде.',
'backend-fail-store' => '$1 файлын $2 адреÑында һаҡлап булманы.',
'backend-fail-copy' => 'Файлдың күÑермәһен $1 адреÑынан $2 адреÑына Ñһап булманы.',
@@ -1973,7 +2066,7 @@ $1',
'linksearch-ok' => 'Эҙләү',
'linksearch-text' => '<code>*.wikipedia.org</code> һымаҡ төркөм билдәләрен ҡулланырға була.
Кәмендә, өҫкө кимәл домен кәрәк. Мәҫәлән, <code>*.org</code><br />
-Терәкләнгән протоколдар: <code>$1</code> (Ñҙләүегеҙҙә булғандарҙың береһен дә өҫтәмәгеҙ)',
+Мөмкин булған протоколдар: <code>$1</code> (бер протокол да күрһәтелмәһә, http:// ҡулланыла)',
'linksearch-line' => '$1 адреÑына $2 битенән һылтанма Ñһалған',
'linksearch-error' => 'Төркөм билдәләре URL адреÑÑ‚Ñ‹Ò£ башында ғына ҡулланыла ала.',
@@ -1992,10 +2085,6 @@ $1',
'activeusers-hidesysops' => 'Хәкимдәрҙе йәшерергә',
'activeusers-noresult' => 'ҠатнашыуÑылар табылманы',
-# Special:Log/newusers
-'newuserlogpage' => 'Яңы ҡулланыуÑÑ‹ Ñҙмалары',
-'newuserlogpagetext' => 'Яңы теркәлгән ҡатнашыуÑылар Ñҙмалары журналы.',
-
# Special:ListGroupRights
'listgrouprights' => 'ҠатнашыуÑылар төркөмө хоҡуҡтары',
'listgrouprights-summary' => 'Түбәндә был вики-проектта билдәләнгән ҡатнашыуÑÑ‹ төркөмдәре килтерелгән һәм уларҙың хоҡуҡтары күрһәтелгән.
@@ -2090,25 +2179,29 @@ $1',
'enotif_mailer' => '{{SITENAME}} проектының белдереү хеҙмәте',
'enotif_reset' => 'Бөтә биттәрҙе ҡаралған тип билдәләргә',
-'enotif_newpagetext' => 'Был Ñңы бит.',
'enotif_impersonal_salutation' => '{{SITENAME}} проектының ҡатнашыуÑыһы',
-'changed' => 'үҙгәртелгән',
-'created' => 'булдырылды',
-'enotif_subject' => '{{SITENAME}} проектының $PAGETITLE бите $PAGEEDITOR тарафынан $CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}} проектының $1 иÑемле бите {{gender:$2|$2}} тарафынан юйылды',
+'enotif_subject_created' => '{{SITENAME}} проектының $1 иÑемле бите {{gender:$2|$2}} тарафынан Ñһалды',
+'enotif_subject_moved' => '{{SITENAME}} проектының $1 битенең {{gender:$2|$2}} иÑеме үҙгәртелде',
+'enotif_subject_restored' => '{{SITENAME}} проектының $1 иÑемле бите {{gender:$2|$2}} тарафынан тергеҙелде',
+'enotif_subject_changed' => '{{SITENAME}} проектының $1 иÑемле бите {{gender:$2|$2}} тарафынан үҙгәртелде',
+'enotif_body_intro_deleted' => '{{SITENAME}} проектының $1 иÑемле бите {{gender:$2|$2}} тарафынан юйылды. Ваҡыты: $PAGEEDITDATE. Ҡарағыҙ: $3.',
+'enotif_body_intro_created' => '{{SITENAME}} проектының $1 иÑемле бите {{gender:$2|$2}} тарафынан Ñһалды. Ваҡыты: $PAGEEDITDATE. Ҡарағыҙ: $3.',
+'enotif_body_intro_moved' => '{{SITENAME}} проектының $1 иÑемле бите {{gender:$2|$2}} тарафынан күÑерелде. Ваҡыты: $PAGEEDITDATE. Ҡарағыҙ: $3.',
+'enotif_body_intro_restored' => '{{SITENAME}} проектының $1 иÑемле бите {{gender:$2|$2}} тарафынан тергеҙелде. Ваҡыты: $PAGEEDITDATE. Ҡарағыҙ: $3.',
+'enotif_body_intro_changed' => '{{SITENAME}} проектының $1 иÑемле бите {{gender:$2|$2}} тарафынан үҙгәртелде. Ваҡыты: $PAGEEDITDATE. Ҡарағыҙ: $3.',
'enotif_lastvisited' => 'Һеҙҙең аҙаҡҡы кереүегеҙҙән һуңғы үҙгәртеүҙәрҙе ҡарау Ó©Ñөн, $1 ҡарағыҙ.',
'enotif_lastdiff' => 'Был үҙгәртеүҙе ҡарау Ó©Ñөн, $1 ҡарағыҙ.',
'enotif_anon_editor' => 'танылмаған ҡатнашыуÑÑ‹ $1',
'enotif_body' => 'Хөрмәтле $WATCHINGUSERNAME,
-{{SITENAME}} проектының $PAGETITLE бите $PAGEEDITDATE көнө $PAGEEDITOR тарафынан $CHANGEDORCREATED. Биттең ағымдағы өлгөһөн $PAGETITLE_URL адреÑынан ҡарай алаһығыҙ.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
-Мөхәррирләүҙең ҡыҫҡаÑа аңлатмаһы: $PAGESUMMARY $PAGEMINOREDIT
+Мөхәррирләү аңлатмаһы: $PAGESUMMARY $PAGEMINOREDIT
ҮҙгәртеүÑе менән бәйләнеш Ó©Ñөн:
-Ñл. почта: $PAGEEDITOR_EMAIL
-вики: $PAGEEDITOR_WIKI
+Эл. почта адреÑÑ‹: $PAGEEDITOR_EMAIL
+Вики бите: $PAGEEDITOR_WIKI
Әгәр һеҙ был битте ҡарамаһағыҙ, бынан һуң булаÑаҡ үҙгәртеүҙәр тураһында белдереү алмаÑÑаҡһығыҙ.
Һеҙ шулай уҡ күҙәтеү иÑемлегегеҙҙәге бар биттәр Ó©Ñөн белдереү көйләүен һүндерә алаһығыҙ.
@@ -2119,14 +2212,16 @@ $NEWPAGE
Электрон почта белдереүҙәрен көйләү Ó©Ñөн:
{{canonicalurl:{{#special:Preferences}}}}
-Күҙәтеү иÑемлеге көйләүҙәрен үҙгәртергә:
+Күҙәтеү иÑемлеге көйләүҙәрен үҙгәртер Ó©Ñөн:
{{canonicalurl:{{#special:EditWatchlist}}}}
-Битте һеҙҙең күҙәтеү иÑемлегенән юйырға
+Битте һеҙҙең күҙәтеү иÑемлегенән юйыр Ó©Ñөн:
$UNWATCHURL
Кире бәйләнеш һәм Ñрҙам:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'булдырылды',
+'changed' => 'үҙгәртелгән',
# Delete
'deletepage' => 'Битте юйырға',
@@ -2280,8 +2375,8 @@ $2 өлгөһөнә ҡайтыу.',
'undeletedrevisions' => '$1 {{PLURAL:$1|өлгө}} тергеҙелде',
'undeletedrevisions-files' => '{{PLURAL:$1|өлгө}} һәм {{PLURAL:$2|файл}} тергеҙелде',
'undeletedfiles' => '{{PLURAL:$1|файл}} тергеҙелде',
-'cannotundelete' => 'Тергеҙеп булманы;
-кемдер был битте алдараҡ тергеҙгән, булырға тейеш.',
+'cannotundelete' => 'Юйыуҙы кире алып булманы:
+$1',
'undeletedpage' => "'''$1 бите тергеҙелде'''
Һуңғы юйыуҙарҙы һәм тергеҙеүҙәрҙе ҡарау Ó©Ñөн, [[Special:Log/delete|юйыу Ñҙмалары журналын]] ҡарағыҙ.",
@@ -2313,7 +2408,7 @@ $1',
'blanknamespace' => '(Төп)',
# Contributions
-'contributions' => 'ҠатнашыуÑÑ‹ өлөшө',
+'contributions' => '{{GENDER:$1|ҠатнашыуÑÑ‹}} өлөшө',
'contributions-title' => '$1 иÑемле ҡулланыуÑының кереткән өлөшө',
'mycontris' => 'Өлөш',
'contribsub2' => '$1 ($2) Ó©Ñөн',
@@ -2591,6 +2686,7 @@ $1 ҡатнашыуÑыһын бикләү Ñәбәбе: "$2"',
'immobile-target-namespace-iw' => 'Интервики һылтанмаһы Ñңы иÑем булараҡ ҡулланыла алмай.',
'immobile-source-page' => 'Был биттең иÑемен үҙгәртеү мөмкин түгел.',
'immobile-target-page' => 'Биткә был иÑемде биреү мөмкин түгел.',
+'bad-target-model' => 'Тап килмәгән мәғлүмәттәр моделе. $1, $2 итеп үҙгәртелмәне.',
'imagenocrossnamespace' => 'Файлға башҡа иÑемдәр арауығындағы иÑемде биреү мөмкин түгел.',
'nonfile-cannot-move-to-file' => 'Файл булмаған еÑемгә файл иÑемдәре арауығындағы иÑемде биреү мөмкин түгел.',
'imagetypemismatch' => 'Яңы файл киңәйтеүе уның төрө менән тап килмәй',
@@ -2703,6 +2799,7 @@ $1 ҡатнашыуÑыһын бикләү Ñәбәбе: "$2"',
'import-error-interwiki' => '«$1» бите импортҡа Ñығарылманы, Ñөнки уның иÑеме тышҡы һылианма (интервики)Ó©Ñөн резервланған.',
'import-error-special' => ' «$1» бите импортҡа Ñығарылманы, Ñөнки ул биттәр Ñһау мөмкин булмаған иÑемдәр арауығына ҡарай.',
'import-error-invalid' => '"$1" бите Ñраҡһыҙ иÑеме Ó©Ñөн импортланманы.',
+'import-error-unserialize' => '«$1» битенең $2 өлгөһөн Ñтруктуралаштырып (деÑериаÑлап) булмай. $4 форматында ÑериÑланған $3 ÑÑтәлегенең моделеның был өлгөлә ҡулланылыуы тураһында хәбәр алынды.',
'import-options-wrong' => 'Хаталы {{PLURAL:$2|опциÑ|опциÑлар}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Төп биттең күрһәтелгән иÑеме Ñңылыш.',
'import-rootpage-nosubpage' => 'Төп биттең "$1" иÑемдәр арауығы ÑÑке биттәргә Ñ€Ó©Ñ…Ñәт бирмәй.',
@@ -2718,7 +2815,6 @@ $1 ҡатнашыуÑыһын бикләү Ñәбәбе: "$2"',
# JavaScriptTest
'javascripttest' => '
JavaScript тикшереү',
-'javascripttest-disabled' => 'Был мөмкинлек был Википроектта ғәмәлгә индерелмәгән.',
'javascripttest-title' => '$1 тикшеренеү үткәрелә',
'javascripttest-pagetext-noframework' => 'Был бит JavaScript тикшеренеүҙәре үткәреү Ó©Ñөн резервланған.',
'javascripttest-pagetext-unknownframework' => 'Билдәһеҙ тикшеренеүҙәр мөхитнамәһе "$1".',
@@ -2834,6 +2930,7 @@ The wiki server cannot provide data in a format your client can read.',
'pageinfo-default-sort' => 'Ғәҙәттәге Ñортлау аÑÒ¡Ñ‹ÑÑ‹',
'pageinfo-length' => 'Бит оҙонлоғо (байттарҙа)',
'pageinfo-article-id' => 'Бит идентификаторы',
+'pageinfo-language' => 'Бит ÑÑтәлегенең теле',
'pageinfo-robot-policy' => 'Эҙләү хеҙмәттәре ÑтатуÑÑ‹',
'pageinfo-robot-index' => 'ИндекÑлана',
'pageinfo-robot-noindex' => 'ИндекÑланмай',
@@ -2853,6 +2950,14 @@ The wiki server cannot provide data in a format your client can read.',
'pageinfo-magic-words' => 'ТылÑымлы {{PLURAL:$1|Ò»Ò¯Ò™|һүҙҙәр}} ($1)',
'pageinfo-hidden-categories' => 'Йәшерен {{PLURAL:$1|категориÑ|категориÑлар}} ($1)',
'pageinfo-templates' => 'Ҡулланылған {{PLURAL:$1|ҡалып|ҡалыптар}} ($1)',
+'pageinfo-toolboxlink' => 'Бит мәғлүмәттәре',
+'pageinfo-redirectsto' => 'Йүнәлтеү',
+'pageinfo-redirectsto-info' => 'мәғлүмәт',
+'pageinfo-contentpage' => 'ЭÑтәлек бите тип иҫәпләнә',
+'pageinfo-contentpage-yes' => 'Эйе',
+'pageinfo-protect-cascading' => 'Бынан башлап һикәлтәле һаҡлау',
+'pageinfo-protect-cascading-yes' => 'Эйе',
+'pageinfo-protect-cascading-from' => 'Бынан башлап һикәлтәле һаҡлау',
# Skin names
'skinname-standard' => 'КлаÑÑик',
@@ -2873,6 +2978,8 @@ The wiki server cannot provide data in a format your client can read.',
'markedaspatrollederror' => 'Тикшерелгән тип билдәләп булмай',
'markedaspatrollederrortext' => 'Һеҙ тикшерелгән тип билдәләнәÑәк биттең өлгөһөн күрһәтергә тейешһегеҙ.',
'markedaspatrollederror-noautopatrol' => 'Һеҙгә үҙегеҙҙең үҙгәртеүҙәрегеҙҙе тикшерелгән тип билдәләргә Ñ€Ó©Ñ…Ñәт ителмәй.',
+'markedaspatrollednotify' => '$1 битендәге үҙгәртеү патрулләнгән тип билдәләнде.',
+'markedaspatrollederrornotify' => 'Патрулләнгән тип билдәләү уңышһыҙ тамамланды.',
# Patrol log
'patrol-log-page' => 'Тикшереү Ñҙмалары журналы',
@@ -2906,6 +3013,7 @@ $1',
'file-nohires' => 'Юғары аÑыҡлыҡтағы өлгө ÑŽÒ¡.',
'svg-long-desc' => 'SVG файлы, номиналь $1 × $2 нөктә, файлдың дәүмәле: $3',
'svg-long-desc-animated' => 'ÐнимациÑлы SVG файлы, номиналь $1 × $2 нөктә, файлдың дәүмәле: $3',
+'svg-long-error' => 'Яңылыш SVG файл: $1',
'show-big-image' => 'Тулы аÑыҡлыҡ',
'show-big-image-preview' => 'Байҡау ваҡытындағы күләм: $1.',
'show-big-image-other' => '{{PLURAL:$2|Башҡа ÑиÑелеш|Башҡа ÑиÑелештәр}}: $1.',
@@ -2937,6 +3045,7 @@ $1',
'hours' => '{{PLURAL:$1|$1 Ñәғәт|$1 Ñәғәт}}',
'days' => '{{PLURAL:$1|$1 көн|$1 көн}}',
'ago' => '$1 Ñлек',
+'just-now' => 'Ñңы ғына',
# Bad image list
'bad_image_list' => 'Формат киләһе рәүештә булырға тейеш:
@@ -3434,6 +3543,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[Интервики индереү мөмкинлеге һүндерелгән]',
'scarytranscludefailed' => '[$1 ҡалыбына мөрәжәғәт итеү хатаһы]',
+'scarytranscludefailed-httpstatus' => '[$1 Ó©Ñөн ҡалып алып булманы: HTTP $2]',
'scarytranscludetoolong' => '[URL Ð°Ð´Ñ€ÐµÑ Ð±Ð¸Ð³ÐµÑ€Ó™Ðº оҙон]',
# Delete conflict
@@ -3544,6 +3654,7 @@ $5
'version-license' => 'РөхÑәтнамә',
'version-poweredby-credits' => "Был вики проект '''[//www.mediawiki.org/ MediaWiki]''' нигеҙендә Ñшләй, copyright © 2001-$1 $2.",
'version-poweredby-others' => 'башҡалар',
+'version-credits-summary' => '[[Special:Version|MediaWiki]] үҫешенә өлөш индергәндәре Ó©Ñөн киләһе ҡатнашыуÑыларға рәхмәт әйтәбеҙ.',
'version-license-info' => 'MediaWiki — ирекле программа, һеҙ уны Ирекле программалар фонды тарафынан баҫтырылған GNU General Public License Ñ€Ó©Ñ…Ñәтнамәһенә Ñрашлы тарата һәм/йәки үҙгәртә алаһығыҙ (Ñ€Ó©Ñ…Ñәтнамәнең йә иÑенÑе өлгөһө, йә унан һуңғы өлгөләре).
MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР ÐИДӘЙ Ò˜Ó˜ ЯУÐПЛЫЛЫҠ ЙӨКЛӘМӘҺЕҘ, хатта фараз ителгән ÒºÐТЫУ ӨСӨРЯРÐҠЛЫЛЫҠ йәки БИЛДӘЛӘÐГӘРМÐҠСÐТ ӨСӨРЯРÐҠЛЫТЫҠ тураһында Ñуаплылыҡ йөкләмәһеҙ таратыла. Ентекле мәғлүмәт алыр Ó©Ñөн, GNU General Public License Ñ€Ó©Ñ…Ñәтнамәһе тураһында уҡығыҙ.
@@ -3688,7 +3799,10 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
'logentry-newusers-create' => '$1 ҡатнашыуÑыһының иҫәп Ñҙмаһы булдырылды',
'logentry-newusers-create2' => '$3 ҡатнашыуÑыһының иҫәп Ñҙмаһы $1 тарафынан булдырылды',
'logentry-newusers-autocreate' => 'Ðвтоматик рәүештә $1 иҫәп Ñҙыуы Ñһалды',
-'newuserlog-byemail' => 'пароль Ñлектрон почта адреÑÑ‹ аша ебәрелде',
+'logentry-rights-rights' => '$1 $3 ҡулланыуÑыһының төркөмдәрҙәге ағзалығын $4 икән, $5 тип үҙгәртте',
+'logentry-rights-rights-legacy' => '$1 $3 ҡулланыуÑыһының төркөм ағзалығын үҙгәртте',
+'logentry-rights-autopromote' => '$1 автоматик рәүештә $2 икән, $3 ителде.',
+'rightsnone' => '(ÑŽÒ¡)',
# Feedback
'feedback-bugornote' => 'Әгәр Һеҙ техник проблеманы ентекле рәүештә аңлатырға теләһәгеҙ, зинһар, [$1 хата тураһында белдерегеҙ].
diff --git a/languages/messages/MessagesBar.php b/languages/messages/MessagesBar.php
index ee6cca9e..a3c00d7b 100644
--- a/languages/messages/MessagesBar.php
+++ b/languages/messages/MessagesBar.php
@@ -22,6 +22,41 @@
$fallback = 'de';
+$namespaceNames = array(
+ NS_MEDIA => 'Media',
+ NS_SPECIAL => 'Spezial',
+ NS_TALK => 'Dischkrian',
+ NS_USER => 'Nutza',
+ NS_USER_TALK => 'Nutza_Dischkrian',
+ NS_PROJECT_TALK => '$1_Dischkrian',
+ NS_FILE => 'Datei',
+ NS_FILE_TALK => 'Datei_Dischkrian',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWiki_Dischkrian',
+ NS_TEMPLATE => 'Vorlog',
+ NS_TEMPLATE_TALK => 'Vorlog_Dischkrian',
+ NS_HELP => 'Huif',
+ NS_HELP_TALK => 'Huif_Dischkrian',
+ NS_CATEGORY => 'Kategorie',
+ NS_CATEGORY_TALK => 'Kategorie_Dischkrian',
+);
+
+$namespaceAliases = array(
+ # German namespaces
+ 'Medium' => NS_MEDIA,
+ 'Diskussion' => NS_TALK,
+ 'Benutzer' => NS_USER,
+ 'Benutzer_Diskussion' => NS_USER_TALK,
+ '$1_Diskussion' => NS_PROJECT_TALK,
+ 'Datei_Diskussion' => NS_FILE_TALK,
+ 'MediaWiki_Diskussion' => NS_MEDIAWIKI_TALK,
+ 'Vorlage' => NS_TEMPLATE,
+ 'Vorlage_Diskussion' => NS_TEMPLATE_TALK,
+ 'Hilfe' => NS_HELP,
+ 'Hilfe_Diskussion' => NS_HELP_TALK,
+ 'Kategorie_Diskussion' => NS_CATEGORY_TALK,
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'Links unterstreichen:',
@@ -167,7 +202,6 @@ $messages = array(
'qbbrowse' => 'Blaadeln',
'qbedit' => 'werkeln',
'qbpageoptions' => 'Seitenopzionen',
-'qbpageinfo' => 'Seitendaaten',
'qbmyoptions' => 'Meine Seiten',
'qbspecialpages' => 'Speziaalseiten',
'faq' => 'Oft gstejte Frong',
@@ -414,12 +448,8 @@ $2",
# Login and logout pages
'logouttext' => "'''Iatzerd bist obgmödt.'''
-Du kåst {{SITENAME}} iatzerd anónym weiderdoah, óder di danaid unterm söwing óder am åndern Benutzernåm [[Special:UserLogin|åmöden]].
+Du kåst {{SITENAME}} iatzerd anónym weiderdoah, óder di danaid unterm söwing óder am åndern Benutzernåm <span class='plainlinks'>[$1 åmöden]</span>.
Beochtt ower, daas oanige Seiten noh åzoang kennern, daas du ågmödt bist, sólång du néd deih Browsercache glaard host.",
-'welcomecreation' => '== Servas, $1! ==
-
-Deih Benutzerkontó is grood eihgrichtt worn.
-Vagiss bittscheh néd, deine [[Special:Preferences|{{SITENAME}}-Eishtellungen]] åzpassen',
'yourname' => 'Nutzanama:',
'yourpassword' => 'Passwort:',
'yourpasswordagain' => 'Es Passwort no amoi eigebm',
@@ -573,7 +603,6 @@ Zur Informazion foigt da aktuöie Logbuachaitrog:",
'template-protected' => '(schreibgschitzt)',
'template-semiprotected' => '(schreibgschitzt fia ned-ogmejdte Nutza)',
'hiddencategories' => 'De Seitn is in {{PLURAL:$1|a vasteckde Kategorie|$1 vasteckde Kategorina}} eisortiad:',
-'nocreatetitle' => 'De Erstöiung vo naiche Saiten is aigschränkt.',
'nocreate-loggedin' => "Du host koah Berechtigung, neiche Seiten z' erstön.",
'permissionserrors' => 'Berechtigungsfeeler',
'permissionserrorstext' => 'Du bist néd berechtigt, dé Akzión auszfyrn. {{PLURAL:$1|Grund|Grynd}}:',
@@ -762,6 +791,9 @@ Dei Mail-Adress wead dabei ned ozoagt.',
'right-edit' => 'Seiten beorweiten',
'right-block' => 'Benutzer sperrn (Schreiwrecht)',
+# Special:Log/newusers
+'newuserlogpage' => 'Neiomejdungs-Logbuach',
+
# User rights log
'rightslog' => 'Rechte-Logbiache',
@@ -1051,9 +1083,6 @@ Links as Naumensraim wern do néd afglistt.",
'listusers-submit' => 'Zoag',
'listusers-noresult' => 'Koane Benutzer gfunden.',
-# Special:Log/newusers
-'newuserlogpage' => 'Neiomejdungs-Logbuach',
-
# Special:ListGroupRights
'listgrouprights' => 'Benutzergruppmrechtt',
'listgrouprights-summary' => 'Dés do is a Listen voh dé in dém Wiki definierden Benutzergruppm und da dodamid vabundernen Rechtt.
@@ -1132,11 +1161,7 @@ Waunnst dé Seiten wieder voh deiner Beówochtungslisten weggerddoah mechst, dru
'enotif_mailer' => '{{SITENAME}}-E-Mail-Benoochrichtigungsdeanst',
'enotif_reset' => 'Olle Seiten ois bsuacht markiern',
-'enotif_newpagetext' => 'Dés is a neiche Seiten.',
'enotif_impersonal_salutation' => '{{SITENAME}}-Benutzer',
-'changed' => 'gänderd',
-'created' => 'erstöd',
-'enotif_subject' => '[{{SITENAME}}] Dé Seiten „$PAGETITLE“ is voh $PAGEEDITOR $CHANGEDORCREATED',
'enotif_lastvisited' => 'Olle Änderrungen auf oan Blick: $1',
'enotif_lastdiff' => 'Schaug auf $1 noch derer Änderrung.',
'enotif_anon_editor' => 'Anonymer Benutzer $1',
@@ -1165,6 +1190,8 @@ Um d\' Eihstöungen voh deine Beówochtungslisten åzpassen, bsuachst {{canonica
Um d\' Seiten voh deiner Beówochtungslisten ower z\' doah, bsuachst $UNWATCHURL
Ryckmödungen und a weidre Hüf: {{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'erstöd',
+'changed' => 'gänderd',
# Delete
'deletepage' => 'Seiten léschen',
@@ -1250,7 +1277,7 @@ Da aktuöje Text voh da gléschden Seiten is netter fyr Administraatorn zuagäng
'blanknamespace' => '(Seitn)',
# Contributions
-'contributions' => 'Benutzerbeiträg',
+'contributions' => '{{GENDER:$1|Nutza}}beidreg',
'contributions-title' => 'Nutzabeidräg vo „$1“',
'mycontris' => 'Meine Beidreg',
'contribsub2' => 'Vo $1 ($2)',
diff --git a/languages/messages/MessagesBat_smg.php b/languages/messages/MessagesBat_smg.php
deleted file mode 100644
index 44041f0e..00000000
--- a/languages/messages/MessagesBat_smg.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-/** Samogitian
- *
- * ISO 639-3 code 'sgs' should be used. This is code is maintained for backward
- * compatilibity.
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
- *
- * @ingroup Language
- * @file
- *
- */
-
-$fallback = 'sgs, lt';
diff --git a/languages/messages/MessagesBcc.php b/languages/messages/MessagesBcc.php
index beaeec4f..fb40202e 100644
--- a/languages/messages/MessagesBcc.php
+++ b/languages/messages/MessagesBcc.php
@@ -16,6 +16,7 @@
$fallback = 'fa';
+$rtl = true;
$namespaceNames = array(
NS_MEDIA => 'مدیا',
@@ -274,7 +275,6 @@ $messages = array(
'qbbrowse' => 'بروز',
'qbedit' => 'اصلاح',
'qbpageoptions' => 'صÙحه',
-'qbpageinfo' => 'متن',
'qbmyoptions' => 'منی صÙحات',
'qbspecialpages' => 'حاصین صÙحات',
'faq' => 'ب.ج.س',
@@ -511,9 +511,6 @@ $2',
شما تونیت Ú†Ù‡ {{SITENAME}} ناشناس استÙاده کنیت یا شما تونیت دگه وراد بیت گون دگه یا هما کاربر.
توجه بیت Ú©Ù‡ لهتی صÙحات شاید په داب هما وهدی Ú©Ù‡ شما وراد بوتتیت پیش درگ بند تا وهدی Ú©Ù‡ ذخیره بروزر وتی پاک کنیت.",
-'welcomecreation' => '== وش آتکی،$1! ==
-شمی حساب شر بیت.
- مه شموشیت وتی [[Special:Preferences|{{SITENAME}} ترجیحات]] ترجیحات عوض کنیت',
'yourname' => 'نام کاربری',
'yourpassword' => 'کلمه رمز',
'yourpasswordagain' => 'کلمه رمز دگه نویس',
@@ -760,7 +757,6 @@ $2',
'template-semiprotected' => '(نیم محاÙظتی)',
'hiddencategories' => 'ای صÙحه عضوی Ú†Ù‡ {{PLURAL:$1|1 hidden category|$1 پناهین دسته جات}}:',
'edittools' => '<!-- <strong>په Ú©Ù¾ÛŒ Ùˆ پست کتن Ú†Ù‡ CTRL+V , CTRL+C استÙاده کنیت.</strong> -->',
-'nocreatetitle' => 'شرکتن صÙحه محدودنت',
'nocreatetext' => '{{SITENAME}} شما را Ú†Ù‡ شرکتن نوکین صÙحه منه کته.
شما تونیت برگردیت Ùˆ یک پیشگین صÙحه ای اصلاح کنیت، یا [[Special:UserLogin|وارد بیت یان یک حسابی شرکنیت]].',
'nocreate-loggedin' => 'شما را اجازت په شرکتن نوکین صÙحات نیست.',
@@ -1215,11 +1211,13 @@ $1",
'right-siteadmin' => 'کبل و پچ دیتابیس',
'right-override-export-depth' => 'درگیزگ صÙحات گون صÙحاتی لینک بوتگین ته سطح Ûµ',
+# Special:Log/newusers
+'newuserlogpage' => 'ورود شرکتن کاربر',
+'newuserlogpagetext' => '.شی یک ورودی چه شرکتن کاربر',
+
# User rights log
'rightslog' => 'ورودان حقوق کاربر',
'rightslogtext' => 'شی یک آماری چه تغییرات په حقوق کاربری انت.',
-'rightslogentry' => 'عوض بوت عضویت گروهی په $1 چه $2 په $3',
-'rightsnone' => '(هچ یک)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'وانگ این صÙحه',
@@ -1707,10 +1705,6 @@ PICT # misc.
'activeusers-from' => 'پیشدار کاربرانی که شروع بنت گون :‌',
'activeusers-noresult' => 'هچ کاربری درگیزگ نه بیت',
-# Special:Log/newusers
-'newuserlogpage' => 'ورود شرکتن کاربر',
-'newuserlogpagetext' => '.شی یک ورودی چه شرکتن کاربر',
-
# Special:ListGroupRights
'listgrouprights' => 'حقوق گروه کاربر',
'listgrouprights-summary' => 'جهلیگین یک لیستی چه گروهان کاربری تعری٠بوتگین ته ای ویکی انت گون آیانی حق دسترسی آن همراهنت.
@@ -1789,11 +1783,7 @@ PICT # misc.
'enotif_mailer' => '{{SITENAME}} ایمیل دیم دهوک اخطاری',
'enotif_reset' => 'نشان Ú©Ù† Ú©Ù„ صÙحات په داب چارتگین',
-'enotif_newpagetext' => 'Ø´ÛŒ یک نوکین صÙحه ایت.',
'enotif_impersonal_salutation' => '{{SITENAME}} کاربر',
-'changed' => 'عوض بوت.',
-'created' => 'شربوتت',
-'enotif_subject' => '{{SITENAME}} صÙحه $PAGETITLE بوتت $CHANGEDORCREATED گون $PAGEEDITOR',
'enotif_lastvisited' => 'بچار $1 په کلین تغییرات چه شمی آهری چارگ.',
'enotif_lastdiff' => 'بچار $1 په گندگ ای تغییر.',
'enotif_anon_editor' => 'ناشناس کاربر $1',
@@ -1820,6 +1810,8 @@ $NEWPAGE
نظرات و گیشترین کمک:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'شربوتت',
+'changed' => 'عوض بوت.',
# Delete
'deletepage' => 'حذ٠صÙحه',
@@ -3128,6 +3120,6 @@ $5
# New logging system
'revdelete-restricted' => 'محدودیت آن په مدیران سیستم بوت',
'revdelete-unrestricted' => 'به زور چه مدیران سیستم محدودیتان',
-'newuserlog-byemail' => 'کلمه رمز گون ایمیل دیم دهگ بوت',
+'rightsnone' => '(هچ یک)',
);
diff --git a/languages/messages/MessagesBcl.php b/languages/messages/MessagesBcl.php
index d042c798..4bc09526 100644
--- a/languages/messages/MessagesBcl.php
+++ b/languages/messages/MessagesBcl.php
@@ -34,6 +34,11 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'Olay_sa_kategorya',
);
+$specialPageAliases = array(
+ 'Search' => array( 'Hanapon' ),
+ 'Upload' => array( 'Ikarga' ),
+);
+
$magicWords = array(
'currentmonth' => array( '1', 'BULANNGONYAN', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonthname' => array( '1', 'NGARANBULANNGONYAN', 'CURRENTMONTHNAME' ),
@@ -90,11 +95,6 @@ $magicWords = array(
'pagesize' => array( '1', 'PAHINASOKOL', 'PAGESIZE' ),
);
-$specialPageAliases = array(
- 'Search' => array( 'Hanapon' ),
- 'Upload' => array( 'Ikarga' ),
-);
-
$messages = array(
# User preference toggles
'tog-underline' => 'Linyahan an kilyawan:',
@@ -231,6 +231,7 @@ $messages = array(
'newwindow' => '(minabukas sa bàgong bintanà)',
'cancel' => 'Kanselaron',
'moredotdotdot' => 'Kadagdagan...',
+'morenotlisted' => 'Dakol pa an bakong listado...',
'mypage' => 'An Pahina',
'mytalk' => 'Orolayan',
'anontalk' => 'Olay para kaining IP address',
@@ -242,7 +243,6 @@ $messages = array(
'qbbrowse' => 'Halungkáta',
'qbedit' => 'Liwata',
'qbpageoptions' => 'Ining pahina',
-'qbpageinfo' => 'Konteksto',
'qbmyoptions' => 'Sakong mga pahina',
'qbspecialpages' => 'Espesyal na mga pahina',
'faq' => 'PPK (Pirmihang Pighahapot na mga kahaputan)',
@@ -265,6 +265,7 @@ $messages = array(
'namespaces' => 'Mga espasyong ngaran',
'variants' => 'Mga pinalaen',
+'navigation-heading' => 'Listahan sa Nabigasyon',
'errorpagetitle' => 'Salâ',
'returnto' => 'Magbalik sa $1.',
'tagline' => 'Gikan sa {{SITENAME}}',
@@ -507,11 +508,11 @@ An administrador na iyo an nagkandado kaini nagpahayag kaining kapaliwanagan: "$
# Login and logout pages
'logouttext' => "'''Ika po sa ngunyan nakaluwas na.'''
-Ika makakadagos pa sa paggamit kan {{SITENAME}} na dai nagpapabisto, o ika [[Special:UserLogin|Maglaog giraray]] bilang pareho o bilang ibang paragamit.
+Ika makakadagos pa sa paggamit kan {{SITENAME}} na dai nagpapabisto, o ika <span class='plainlinks'>[$1 Maglaog giraray]</span> bilang pareho o bilang ibang paragamit.
Giromdoma na an ibang mga pahina mapuwedeng padagos na magpapahiling siring baga na kun ika garo yaon man sana sa laog, sagkod na saimong malinigan mo an sarayan sa kilyawan.",
-'welcomecreation' => '== Maogmang Pag-abot, $1! ==
-An saimong panindog (account) naimukna na tabi.
-Dae ka man tabi malingaw na ribayan an saimong [[Special:Preferences|{{SITENAME}} mga kabôtan]].',
+'welcomeuser' => 'Marhayong pag-abot, $1!',
+'welcomecreation-msg' => 'An saimong panindog pinagmukna na.
+Dae malingaw na liwaton an saimong [[Special:Preferences|{{SITENAME}} mga kamuyahan]].',
'yourname' => 'Pangaran kan paragamit:',
'yourpassword' => 'Pasa-taramon:',
'yourpasswordagain' => 'Pakilaog giraray kan sekretong panlaog:',
@@ -534,7 +535,7 @@ Dae ka man tabi malingaw na ribayan an saimong [[Special:Preferences|{{SITENAME}
'gotaccount' => 'Igwa ka na tabi nin panindog? $1.',
'gotaccountlink' => 'Maglaog',
'userlogin-resetlink' => 'Nakalingaw ka sa panlaog mong detalye?',
-'createaccountmail' => 'Sa paagi nin e-koreo',
+'createaccountmail' => 'Gumamit nin sarong random na temporaryong sekretong panlaog asin ipadara ini sa adres kan e-surat na pinaghaya sa ibaba',
'createaccountreason' => 'Rason:',
'badretype' => 'An mga sekretong panlaog mong pinagtatak bakong pareho.',
'userexists' => 'Paragamit na ngarang piglaog may naggagamit na.
@@ -607,6 +608,7 @@ Pakilaog sana tabi nin sarong tugmadong koreo o pabayae na mayong laman an surat
# Email sending
'php-mail-error-unknown' => 'Bakong bantog na kasalaan sa PHP mail() function.',
'user-mail-no-addy' => 'Nagprubar na magpadara nin e-koreo na mayo nin e-koreong address.',
+'user-mail-no-body' => 'Nagprubar na magpadara nin e-surat na mayong laman o daeng kanultulan na halipot an hawak.',
# Change password dialog
'resetpass' => 'Ribayan an sekretong panlaog',
@@ -667,6 +669,7 @@ Temporaryong sekretong panlaog: $2',
'changeemail-oldemail' => 'Presenteng e-koreong address:',
'changeemail-newemail' => 'Bagong e-koreong address:',
'changeemail-none' => 'mayo tabi.',
+'changeemail-password' => 'An saimong {{SITENAME}} sikretong panlaog:',
'changeemail-submit' => 'Ribayan an e-koreo',
'changeemail-cancel' => 'Kanselaha',
@@ -849,7 +852,6 @@ An pinakahuring entrada sa talaan pinaghaya sa ibaba bilang reperensiya:",
'template-semiprotected' => '(semi-protektado)',
'hiddencategories' => 'Ining pahina sarong miyembro kan {{PLURAL:$1|1 pinagtagong kategorya|$1 pinagtagong mga kategorya}}:',
'edittools' => '<!-- An teksto digdi mahihiling sa babâ kan mga pormang pighihirá asin pigkakarga. -->',
-'nocreatetitle' => 'Limitado an paggibo nin pahina',
'nocreatetext' => '{{SITENAME}} pinagpupugol an kakayanan na magmukna nin baguhong mga pahina.
Ika makakabalik asin magliwat kan eksistidong nang pahina, o [[Special:UserLogin|maglaog ka o magmukna nin sarong panindog]].',
'nocreate-loggedin' => 'Ika mayo tabi nin permiso tanganing magmukna nin baguhong mga pahina.',
@@ -874,6 +876,15 @@ Ini minapahiwatig tabi na pinagpura na.',
'edit-already-exists' => 'Dai maggibo an bàgong pahina.
Igwa na kaini.',
'defaultmessagetext' => 'Tugmadong mensahe sa teksto',
+'content-failed-to-parse' => 'Nagpalya sa paglunhay an $2 na laman para sa $1 na modelo: $3',
+'invalid-content-data' => 'Imbalidong datos nin laman',
+'content-not-allowed-here' => '"$1" na laman dae pinagtutugutan sa pahina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wiki-teksto',
+'content-model-text' => 'yanong-teksto',
+'content-model-javascript' => 'Java-Kurit',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Patanid tabi:''' Ining pahina naglalaman nin grabe kadakulon na ekspensibong programang pambaranga sa punksyon nin mga pag-aapod.
@@ -1241,9 +1252,9 @@ Ini dae tabi matitingkog.',
'prefs-emailconfirm-label' => 'Kumpirmasyon sa E-koreo',
'prefs-textboxsize' => 'Sukol kan bintana sa pagliliwat',
'youremail' => 'E-koreo:',
-'username' => 'Pangaran kan parágamit:',
-'uid' => 'ID kan parágamit:',
-'prefs-memberingroups' => 'Miembro kan {{PLURAL:$1|grupo|grupos}}:',
+'username' => '{{GENDER:$1|Pangaran nin paragamit}}:',
+'uid' => '{{GENDER:$1|Paragamit}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|Miyembro}} kan {{PLURAL:$1|grupo|mga grupo}}:',
'prefs-registration' => 'Rehistrasyong oras:',
'yourrealname' => 'Totoong pangaran:',
'yourlanguage' => 'Tataramon:',
@@ -1393,12 +1404,13 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
'right-sendemail' => 'Magpadara nin e-koreo sa ibang mga paragamit',
'right-passwordreset' => 'Tanawon an e-koreo kan pagbabago nin sekretong panlaog',
+# Special:Log/newusers
+'newuserlogpage' => 'Paragamit na talaan nin pagmukna',
+'newuserlogpagetext' => 'Ini an talaan kan mga pagmukna nin paragamit.',
+
# User rights log
'rightslog' => 'Usip nin derechos nin paragamit',
'rightslogtext' => 'Ini an historial kan mga pagbabâgo sa mga derecho nin parágamit.',
-'rightslogentry' => 'Rinibayab an pagkamyembro ni $1 sa $2 sagkod sa $3',
-'rightslogentry-autopromote' => 'dati na awtomatikong pinagpalangkaw gikan sa $2 sagkod $3',
-'rightsnone' => '(mayô)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'basaha ining pahina',
@@ -1628,6 +1640,7 @@ Kun an problema yaon pa, pakikontak tabi nin sarong [[Special:ListUsers/sysop|ad
'backend-fail-notsame' => 'Bakong magkakaparehong sagunson yaon na po sa $1.',
'backend-fail-invalidpath' => '$1 bakong balidong agihan sa pagsasaray.',
'backend-fail-delete' => 'Dae makakapura kan sagunson $1.',
+'backend-fail-describe' => 'Dae makakaliwat nin meta-datos para sa sagunson na #$1".',
'backend-fail-alreadyexists' => 'An sagunson $1 eksistido na po.',
'backend-fail-store' => 'Dae makakapagsaray nin sagunson an $1 sa $2.',
'backend-fail-copy' => 'Dae makakakopya nin sagunson $1 pasiring sa $2.',
@@ -1861,6 +1874,12 @@ Giromdoma baya na mag-tsek para sa iba pang kasugpon sa mga templato bago mo pag
Sinda mapuwedeng makipagsugpon pasiring sa sarong mas manigong pahina nanggad.<br />
An sarong pahina tratado bilang pampalinaw na pahina kun ini minagamit nin sarong templato na nakasugpon gikan sa [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Mga pahina na igwang pahina nin kagrugaring',
+'pageswithprop-legend' => 'Mga pahina na igwang pahina nin kagrugaring',
+'pageswithprop-text' => 'Ining mahina naglilista kan mga pahina na minagamit nin partikular na pahina nin kagrugaring.',
+'pageswithprop-prop' => 'Kagrugaring na pangaran:',
+'pageswithprop-submit' => 'Larga',
+
'doubleredirects' => 'Dobleng mga redirekta',
'doubleredirectstext' => 'Ining pahina minalista nin mga pahina na minatukdo liwat pasiring sa pinagtukdong-liwat na mga pahina.
Kada palunpon igwang laog na minasugpon pasiring sa enot asin ikaduwang pagtukdo-liwat, siring man sa target kan ikaduwang pagtukdo-liwat, na pirme nanggad an "tunay" na pahinang target, na an enot na pagtukdong-liwat dapat na iyo an pagtutukdoon.
@@ -2012,9 +2031,9 @@ Asin man hilnga an [[Special:WantedCategories|kinakaipong mga kategorya]].',
'linksearch-pat' => 'Pangarugan sa paghahanap:',
'linksearch-ns' => 'Espasyong-ngaran:',
'linksearch-ok' => 'Hanápon',
-'linksearch-text' => 'Mga pantsambang baraha arog baka kan "*.wikipedia.org" mapuwedeng gamiton.
-Minakaipo kisera sarong halangkaw na mugtak nin kinasakupan, halimbawa "*.org".<br />
-Suportadong mga panundan: <code>$1</code> (dae magdagdag arinman kaini sa saimong paghahanap).',
+'linksearch-text' => 'Mga tsambang baraha arog baka kan "*.wikipedia.org" na puwedeng paggamiton.
+Minakaipo kisera halangkaw na kamugtakan nin kinasakupan, halimbawa "*.org".<br />
+Suportadong {{PLURAL:$2|protokol|mga protokol}}: <code>$1</code> (defaults to http:// kun mayong protokol na pinagkaag).',
'linksearch-line' => '$1 an nakatakod sa $2',
'linksearch-error' => 'Mga pantsambang baraha mapuwedeng magluwas sana sa poon kan hostname.',
@@ -2033,10 +2052,6 @@ Suportadong mga panundan: <code>$1</code> (dae magdagdag arinman kaini sa saimon
'activeusers-hidesysops' => 'Itago an mga administrador',
'activeusers-noresult' => 'Mayong mga paragamit na nanagboan.',
-# Special:Log/newusers
-'newuserlogpage' => 'Paragamit na talaan nin pagmukna',
-'newuserlogpagetext' => 'Ini an talaan kan mga pagmukna nin paragamit.',
-
# Special:ListGroupRights
'listgrouprights' => 'Mga karapatan kan grupo nin paragamit',
'listgrouprights-summary' => 'An minasunod iyo an listahan kan mga grupo nin paragamit na pinaghunsay kaining wiki, kaiba an saindang asosyadong mga karapatan nin paggamit.
@@ -2133,19 +2148,23 @@ An maabot na mga pagbabâgo sa páhinang ini asin sa asosyadong páhina nin olay
'enotif_mailer' => '{{SITENAME}} Kartero nin isi',
'enotif_reset' => 'Markahan an gabos na mga binisitang pahina',
-'enotif_newpagetext' => 'Bâgo ining pahina.',
'enotif_impersonal_salutation' => '{{SITENAME}} parágamit',
-'changed' => 'pigbâgo',
-'created' => 'piggibo',
-'enotif_subject' => 'An pahinang {{SITENAME}} na $PAGETITLE binago $CHANGEDORCREATED ni $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}} pahina $1 pinagpura ni {{gender:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}} pahina $1 pinagmukna ni {{gender:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}} pahina $1 pinagbalyo ni {{gender:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}} pahina $1 pinagbalik-liwat ni {{gender:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}} pahina $1 pinagliwat ni {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'An {{SITENAME}} pahina $1 pinagpura sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon sa $3.',
+'enotif_body_intro_created' => 'An {{SITENAME}} pahina $1 pinagmukna sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon $3 para sa pinakahuring rebisyon.',
+'enotif_body_intro_moved' => 'An {{SITENAME}} pahina $1 pinagbalyo sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon $3 para sa pinakahuring rebisyon.',
+'enotif_body_intro_restored' => 'An {{SITENAME}} pahina $1 pinagbalik-liwat sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon $3 para sa pinakahuring rebisyon.',
+'enotif_body_intro_changed' => 'An {{SITENAME}} pahina $1 pinagliwat sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon $3 para sa pinakahuring rebisyon.',
'enotif_lastvisited' => 'Hilingón an $1 para sa gabos na mga pagbâgo poon kan huring bisita.',
'enotif_lastdiff' => 'Hilingón an $1 tangarig mahiling an pagbâgong ini.',
'enotif_anon_editor' => 'dai bistong parágamit $1',
-'enotif_body' => 'Namomotang $WATCHINGUSERNAME,
-
-An {{SITENAME}} pahina $PAGETITLE pinagmukna $CHANGEDORCREATED kan $PAGEEDITDATE ni $PAGEEDITOR, hilngon sa $PAGETITLE_URL para sa presenteng rebisyon.
+'enotif_body' => 'Namumutan na $WATCHINGUSERNAME,
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Sumaryo kan paraliwat: $PAGESUMMARY $PAGEMINOREDIT
@@ -2170,6 +2189,8 @@ $UNWATCHURL
Balik-simbag asin kadagdagang asistensiya:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'piggibo',
+'changed' => 'pigbâgo',
# Delete
'deletepage' => 'Paraon an pahina',
@@ -2241,6 +2262,8 @@ Hilnga tabi an [[Special:ProtectedPages|listahan kan protektadong mga pahina]] p
'prot_1movedto2' => '[[$1]] piglipat sa [[$2]]',
'protect-badnamespace-title' => 'Dae maprotektaran na espasyong-ngaran',
'protect-badnamespace-text' => 'Mga pahina kaining espasyong-ngaran dae tabi protektado.',
+'protect-norestrictiontypes-text' => 'Ining pahina dae maprotektaran ta mayo pang ikinaag na mga tipo nin restriksyon.',
+'protect-norestrictiontypes-title' => 'Dae maprotektaran na pahina',
'protect-legend' => 'Kompermaron an proteksyon',
'protectcomment' => 'Rason:',
'protectexpiry' => 'Mápasó:',
@@ -2322,7 +2345,8 @@ binalik an na pagribay o hinalî sa archibo.',
'undeletedrevisions' => '{{PLURAL:$1|1 rebisyon|$1 mga rebisyon}} ipinagbalik',
'undeletedrevisions-files' => '{{PLURAL:$1|1 rebisyon|$1 mga rebisyon}} asin {{PLURAL:$2|1 sagunson|$2 mga sagunson}} ipinagbalik',
'undeletedfiles' => '{{PLURAL:$1|1 sagunson|$1 mga sagunson}} ipinagbalik',
-'cannotundelete' => 'Naprakaso an pagbalik kan pigparâ; pwede ser an binawi an pagparâ kan páhina kan ibang parágamit.',
+'cannotundelete' => 'An dae pagpura nagpalya:
+$1',
'undeletedpage' => "'''binalik na an $1 '''
Ikonsultar an [[Special:Log/delete|historial nin pagparâ]] para mahiling an lista nin mga kaaaging pagparâ asin pagbalik.",
@@ -2353,7 +2377,7 @@ $1",
'blanknamespace' => '(Principal)',
# Contributions
-'contributions' => 'Mga kontribusyon kan parágamit',
+'contributions' => '{{GENDER:$1|Paragamit}} na mga kaambagan',
'contributions-title' => 'Mga kontribusyon kan paragamit para sa $1',
'mycontris' => 'Mga Kaarambagan',
'contribsub2' => 'Para sa $1 ($2)',
@@ -2622,6 +2646,7 @@ Igwa nang páhina na "[[:$1]]". Gusto mong parâon ini tangarig maibalyó?',
'immobile-target-namespace-iw' => 'An Interwiki na kilyaw bakong balido puntirya para sa pagbalyo nin pahina.',
'immobile-source-page' => 'Ining pahina bakong mabalyuhon.',
'immobile-target-page' => 'Dae makakabalyo paduman sa titulong destinasyon.',
+'bad-target-model' => 'An pinagmamawot na destinasyon minagamit kan ibahong modelo nin laog. Dae makapagpalis gikan sa $1 pasiring sa $2.',
'imagenocrossnamespace' => 'Dae makakapagbalyo nin sagunson paduman sa bakong sagunson na espasyong pangaran.',
'nonfile-cannot-move-to-file' => 'Dae makakapagbalyo nin bakong-sagunson pasiring sa sagunson kan espasyong-pangaran',
'imagetypemismatch' => 'An baguhon na ekstensyon nin sagunson dae mai-aampad sa tipong ini',
@@ -2737,6 +2762,7 @@ Paki-otro giraray.',
'import-error-interwiki' => 'An pahina "$1" bakong importado nin huli ta an pangaran kaini reserbado na para sa panluwas na kasugpunan (interwiki).',
'import-error-special' => 'An pahina "$1" bakong importado nin huli ta ini kabali sa espesyal an espasyong-ngaran na dae nagtutugot nin mga pahina.',
'import-error-invalid' => 'An pahina "$1" bakong importado nin huli ta an ngaran kaini imbalido.',
+'import-error-unserialize' => 'An rebisyon sa $2 kan pahina "$1" dae maseryalisado. An rebisyon pinagtala na gumamit nin modelong laman na $3 na seryalisado bilang $4.',
'import-options-wrong' => 'Salang {{PLURAL:$2|pagpipilian|mga pagpipilian}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'An pinagtaong ugat na pahina sarong imbalidong titulo.',
'import-rootpage-nosubpage' => 'Espasyong-ngaran "$1" kan ugat na pahina dae minatugot nin pan-irarom na mga pahina.',
@@ -2751,7 +2777,6 @@ Paki-otro giraray.',
# JavaScriptTest
'javascripttest' => 'Testing sa JavaScript',
-'javascripttest-disabled' => 'Ining punksyon dae pinagpagana sa wiki na ini.',
'javascripttest-title' => 'Pinapadalagan na $1 na mga pagtesting',
'javascripttest-pagetext-noframework' => 'An pahinang ini reserbado para sa pagpapadalagan kan mga pagtesting sa JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Bakong bistadong modelo para sa pagtesting kan "$1".',
@@ -2873,11 +2898,13 @@ Ini hurot na pinagkausa nin sarong sugpunan pasiring sa sarong pinagbawal na pan
'pageinfo-default-sort' => 'Panugmad na susi nin salansan',
'pageinfo-length' => 'Kalabaan kan pahina (yaon sa mga bayta)',
'pageinfo-article-id' => 'ID kan pahina',
+'pageinfo-language' => 'Lengguwahe kan laog sa pahina',
'pageinfo-robot-policy' => 'Estado kan makinang parahanap',
'pageinfo-robot-index' => 'Maihuhukdo',
'pageinfo-robot-noindex' => 'Dae maihuhukdo',
'pageinfo-views' => 'Numero kan mga patanaw',
'pageinfo-watchers' => 'Numero kan parabantay nin pahina',
+'pageinfo-few-watchers' => 'Kadikiton kesa $1{{PLURAL:$1|parabantay|mga parabantay}}',
'pageinfo-redirects-name' => 'Maipalikwat pasiring sa pahina ini',
'pageinfo-subpages-name' => 'Mga sub-pahina kaining pahina',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|panlikwat|mga panlikwat}}; $3 {{PLURAL:$3|bakong panlikwat|bakong mga panlikwat}})',
@@ -2892,6 +2919,19 @@ Ini hurot na pinagkausa nin sarong sugpunan pasiring sa sarong pinagbawal na pan
'pageinfo-magic-words' => 'Mahiko {{PLURAL:$1|taramon|mga taramon}} ($1)',
'pageinfo-hidden-categories' => 'Itinago na {{PLURAL:$1|kategorya|mga kategorya}} ($1)',
'pageinfo-templates' => 'Kabaling pinagbalyo na {{PLURAL:$1|panguyog|mga panguyog}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pahina|Mga Pahina}} kabaling pinagbalyo sa ($1)',
+'pageinfo-toolboxlink' => 'Pahina kan impormasyon',
+'pageinfo-redirectsto' => 'Mga panlikwat paduman sa',
+'pageinfo-redirectsto-info' => 'impo',
+'pageinfo-contentpage' => 'Pinagbilang siring sa sarong pahina nin laog',
+'pageinfo-contentpage-yes' => 'Iyo',
+'pageinfo-protect-cascading' => 'An mga proteksyon pasurunod gikan digde',
+'pageinfo-protect-cascading-yes' => 'Iyo',
+'pageinfo-protect-cascading-from' => 'An mga proteksyon pasurunod gikan sa',
+'pageinfo-category-info' => 'Impormasyon sa Kategorya',
+'pageinfo-category-pages' => 'Bilang nin mga pahina',
+'pageinfo-category-subcats' => 'Bilang nin mga sub-kategorya',
+'pageinfo-category-files' => 'Bilang nin mga sagunson',
# Skin names
'skinname-standard' => 'Klasiko',
@@ -2908,6 +2948,8 @@ Ini hurot na pinagkausa nin sarong sugpunan pasiring sa sarong pinagbawal na pan
'markedaspatrollederror' => 'Dai mamamarkahan bilang pigpapatrolya',
'markedaspatrollederrortext' => 'Kaipúhan mong magpilì nin pagpakarháy na mamarkahan bilang pigpapatrolya.',
'markedaspatrollederror-noautopatrol' => 'Daí ka pigtotogótan na markahan an sadíri mong pababàgo bilang pigpapatrolya.',
+'markedaspatrollednotify' => 'Ining kaliwatan sa $1 pinagmarkahang patrolyado na.',
+'markedaspatrollederrornotify' => 'Pagmamarka bilang patrolyado na nagpalya.',
# Patrol log
'patrol-log-page' => 'Laóg kan Pigpapatrolya',
@@ -2941,6 +2983,7 @@ Sa pagpapa-andar kaini, an saimong sistema mapupuwedeng makompromiso.",
'file-nohires' => 'Mayong mas halangkáw na resolusyon.',
'svg-long-desc' => 'file na SVG, haros $1 × $2 pixels, sokol kan file: $3',
'svg-long-desc-animated' => 'Animatadong SVG na sagunson, nangangaranang $1 x $2 piksel, kadakulaan nin sagunson: $3',
+'svg-long-error' => 'Imbalidong SVG na sagunson: $1',
'show-big-image' => 'Todong resolusyon',
'show-big-image-preview' => 'Sukol kaining patanaw: $1.',
'show-big-image-other' => 'Ibang {{PLURAL:$2|resolusyon|mga resoluyon}}: $1.',
@@ -2970,7 +3013,10 @@ Sa pagpapa-andar kaini, an saimong sistema mapupuwedeng makompromiso.",
'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
'hours' => '{{PLURAL:$1|$1 oras|$1 oras}}',
'days' => '{{PLURAL:$1|$1 aldaw|$1 mga aldaw}}',
+'months' => '{{PLURAL:$1|$1 bulan|$1 mga bulan}}',
+'years' => '{{PLURAL:$1|$1 taon|$1 mga taon}}',
'ago' => '$1 nakaagi',
+'just-now' => 'ngunyan sana',
# Bad image list
'bad_image_list' => 'An pormat iyo ining minasunod:
@@ -3470,6 +3516,7 @@ Ining pankumpirmang koda mapalso sa $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Pigpopogolan an transcluding na Interwiki]',
'scarytranscludefailed' => '[Templatong panakdo nagpalya para sa $1]',
+'scarytranscludefailed-httpstatus' => '[An paghigkos kan panguyog nagpalya para sa $1: HTTP $2]',
'scarytranscludetoolong' => '[An kilyawan grabe kahalaba]',
# Delete conflict
@@ -3579,6 +3626,7 @@ Pwede mo man [[Special:EditWatchlist|gamiton an standard editor]].',
'version-license' => 'Lisensiya',
'version-poweredby-credits' => "An wiking ini pinagpagana kan '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'mga iba pa',
+'version-credits-summary' => 'Gusto niyamong rekonosiron an minasunod na mga persona nin huli kan saindang ambag sa [[Special:Version|Mediawiki]].',
'version-license-info' => 'An MediaWiki sarong libreng kasungatan; puwede mong ipanao ini asin/o baguhon ini sa irarom kan termino nin HNU (Heneral na Pampublikong Lisensiya) bilang publisado kan Free Software Foundation; maski sa arin na bersyon 2 kan lisensiya, o (saimong pansadireng pagpipilian) arinman na huring bersyon.
An MediaWiki ipinagpanao sa paglaom na ini magigin kapakinabangan, pero MAYO NIN ANUMAN NA WARANTIYA; mayo dawa ngani nin pinaghuhurot na warantiya kan MERKANTIBILIDAD o KAUYUGAN PARA SA SARONG PARTIKULAR NA KATUYUHAN. Hilngon an HNU (Heneral na Pampublikong Lisensiya) para sa kadagdagang mga detalye.
@@ -3693,17 +3741,17 @@ Ining sityo igwang naeksperiyensiyahan na mga kakundian sa teknikal.',
'sqlite-no-fts' => '$1 na mayong suporta sa kabilogang-teksto nin paghahanap',
# New logging system
-'logentry-delete-delete' => '$1 pinagpurang pahina $3',
-'logentry-delete-restore' => '$1 pinagbalik na pahina $3',
-'logentry-delete-event' => '$1 pinagliwat an bisibilidad kan {{PLURAL:$5|sarong talaan nin pangyayari|%5 talaan nin mga pangyayari}} kan $3: $4',
-'logentry-delete-revision' => '$1 pinagliwat an bisibilidad kan {{PLURAL:$5|sarong rebisyon|$5 na mga rebisyon}} na yaon sa pahina $3: $4',
-'logentry-delete-event-legacy' => '$1 pinagliwat an bisibilidad kan talaan nin mga pangyayari sa $3',
-'logentry-delete-revision-legacy' => '$1 pinagliwat an bisibilidad kan mga rebisyon sa pahina $3',
-'logentry-suppress-delete' => '$1 pinaglubog na pahina $3',
-'logentry-suppress-event' => '$1 pasikretong pinagliwat an bisibilidad kan {{PLURAL:$5|talaan nin pangyayari|$5 mga talaan nin pangyayari}} sa $3: $4',
-'logentry-suppress-revision' => '$1 pasikretong pinagliwat an bisibilidad kan {{PLURAL:$5|rebisyon|$5 mga rebisyon}} sa pahina $3: $4',
-'logentry-suppress-event-legacy' => '$1 pasikretong pinagliwat an bisibilidad kan talaan nin mga pangyayari sa $3',
-'logentry-suppress-revision-legacy' => '$1 pasikretong pinagliwat an bisibilidad kan mga rebisyon sa pahina $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|pinagpura na}} pahina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|pinagbalik}} na pahina $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|pinagliwat}}an bisibilidad kan {{PLURAL:$5|sarong talaan nin pangyayari|$5 talaan nin mga pangyayari}} kan $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|pinagliwat}} an bisibilidad kan {{PLURAL:$5|sarong rebisyon|$5 na mga rebisyon}} na yaon sa pahina $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|pinagliwat}} an bisibilidad kan talaan nin mga pangyayari sa $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|pinagliwat}} an bisibilidad kan mga rebisyon sa pahina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|pinaglubog}} na pahina $3',
+'logentry-suppress-event' => '$1 pasikretong {{GENDER:$2|pinagliwat}} an bisibilidad kan {{PLURAL:$5|talaan nin pangyayari|$5 mga talaan nin pangyayari}} sa $3: $4',
+'logentry-suppress-revision' => '$1 pasikretong {{GENDER:$2|pinagliwat}} an bisibilidad kan {{PLURAL:$5|rebisyon|$5 mga rebisyon}} sa pahina $3: $4',
+'logentry-suppress-event-legacy' => '$1 pasikretong {{GENDER:$2|pinagliwat}} an bisibilidad kan talaan nin mga pangyayari sa $3',
+'logentry-suppress-revision-legacy' => '$1 pasikretong {{GENDER:$2|pinagliwat}} an bisibilidad kan mga rebisyon sa pahina $3',
'revdelete-content-hid' => 'an laog pinagtago',
'revdelete-summary-hid' => 'Sumaryo nin pagliwat itinago',
'revdelete-uname-hid' => 'pangaran nin paragamit itinago',
@@ -3712,17 +3760,21 @@ Ining sityo igwang naeksperiyensiyahan na mga kakundian sa teknikal.',
'revdelete-uname-unhid' => 'pangaran nin paragamit ipinaghaya',
'revdelete-restricted' => 'Pinag-aplikar an mga restriksyon sa mga administrador',
'revdelete-unrestricted' => 'Pinaghale an mga restriksyon para sa mga administrador',
-'logentry-move-move' => '$1 pinagbalyo an pahina $3 paduman sa $4',
-'logentry-move-move-noredirect' => 'S1 pinagbalyo an pahina $3 paduman sa $4 na mayong iwinalat na panlikwat',
-'logentry-move-move_redir' => '$1 pinagbalyo an pahina $3 paduman sa $4 sa paagi kan panlikwat',
-'logentry-move-move_redir-noredirect' => '$1 pinagbalyo an pahina $3 paduman sa $4 sa paagi kan panlikwat na mayong iwinawalat na sarong panlikwat',
-'logentry-patrol-patrol' => '$1 pinagmarkahan an rebisyon $4 kan pahina $3 na patrolyado',
-'logentry-patrol-patrol-auto' => '$1 awtomatikong pinagmarkahan an rebisyonn $4 kan pahina $3 na patrolyado',
-'logentry-newusers-newusers' => 'An paragamit na panindog $1 pinagmukna na',
-'logentry-newusers-create' => 'An paragamit na panindog $1 pinagmukna na',
-'logentry-newusers-create2' => 'An paragamit na panindog $3 pinagmukna na ni $1',
-'logentry-newusers-autocreate' => 'An paragamit na panindog $1 awtomatikong pinagmukna na',
-'newuserlog-byemail' => 'an pasa-taramon ipinadara na sa paagi kan e-surat',
+'logentry-move-move' => '$1 {{GENDER:$2|pinagbalyo}} an pahina $3 pasiring sa $4',
+'logentry-move-move-noredirect' => 'S1 {{GENDER:$2|pinagbalyo}} an pahina $3 pasiring sa $4 na dae iwinalat an sarong panlikwat',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|pinagbalyo}} an pahina $3 pasiring sa $4 sa paagi kan panlikwat',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|pinagbalyo}} an pahina $3 pasiring sa $4 sa paagi kan panlikwat na dae iwinawalat na sarong panlikwat',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|pinagmarkahan}} an rebisyon $4 kan pahina $3 na patrolyado',
+'logentry-patrol-patrol-auto' => '$1 awtomatikong {{GENDER:$2|pinagmarkahan}} an rebisyon $4 kan pahina $3 na patrolyado',
+'logentry-newusers-newusers' => 'An panindog kan paragamit $1 {{GENDER:$2|pinagmukna}} na',
+'logentry-newusers-create' => 'An panindog kan paragamit $1 {{GENDER:$2|pinagmukna}} na',
+'logentry-newusers-create2' => 'An panindog kan paragamit $3 {{GENDER:$2|pinagmukna}} na ni $1',
+'logentry-newusers-byemail' => 'An panindog kan paragamit $3 {{GENDER:$2|pinagmukna}} ni $1 asin an sekretong panlaog ipinadara na sa paagi nin e-surat',
+'logentry-newusers-autocreate' => 'An panindong kan paragamit $1 awtomatikong {{GENDER:$2|pinagmukna}} na',
+'logentry-rights-rights' => '$1 {{GENDER:$2|pinagliwat}} kan pangrupong pagkamiyembro para sa $3 gikan sa $4 pasiring sa $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|nagliwat}} kan pangrupong pagkamiyembro para sa $3',
+'logentry-rights-autopromote' => '$1 awtomatikong {{GENDER:$2|pinagpalangkaw}} gikan sa $4 pasiring sa $5',
+'rightsnone' => '(mayô)',
# Feedback
'feedback-bugornote' => 'Kun ika andam na iladawan an sarong teknikal na problema na igwang detalye tabi [$1 ipaaram an kuto].
@@ -3776,6 +3828,7 @@ Kun bako man, ika makakagamit nin sayon na porma sa ibaba. An saimong komento id
'api-error-ok-but-empty' => 'Panlaog na kasalaan: Mayong simbag gikan sa serbidor.',
'api-error-overwrite' => 'An salambawan na sarong eksistido nang sagunson dae pinagtutugutan.',
'api-error-stashfailed' => 'Panlaog na kasalaan: An serbidor nagpalya sa pagsaray kan temporaryong sagunson.',
+'api-error-publishfailed' => 'Panlaog na kasalaan: An serbidor nagpalya na ipublikar an temporaryong sagunson.',
'api-error-timeout' => 'An serbidor dae nakapagsimbag sa laog kan pinaghunang panahon.',
'api-error-unclassified' => 'May dae midbid na kasalaan an nangyari.',
'api-error-unknown-code' => 'Dae midbid na kasalaan: "$1".',
@@ -3796,4 +3849,7 @@ Kun bako man, ika makakagamit nin sayon na porma sa ibaba. An saimong komento id
'duration-centuries' => '$1 {{PLURAL:$1|siglo|mga siglo}}',
'duration-millennia' => '$1 {{PLURAL:$1|milenyo|mga millenyo}}',
+# Image rotation
+'rotate-comment' => 'An imahe pinagbirik ni $1 {{PLURAL:$1|grado|mga grado}} hitsado',
+
);
diff --git a/languages/messages/MessagesBe.php b/languages/messages/MessagesBe.php
index d586d603..ec98157b 100644
--- a/languages/messages/MessagesBe.php
+++ b/languages/messages/MessagesBe.php
@@ -25,25 +25,6 @@
* @author לערי ריינה×רט
*/
-$bookstoreList = array(
- 'OZ.by' => 'http://oz.by/search.phtml?what=books&isbn=$1',
- 'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
-);
-
-$datePreferences = array(
- 'default',
- 'dmy',
- 'ISO 8601',
-);
-
-$defaultDateFormat = 'dmy';
-
-$dateFormats = array(
- 'dmy time' => 'H:i',
- 'dmy date' => 'j xg Y',
- 'dmy both' => 'H:i, j xg Y',
-);
-
$namespaceNames = array(
NS_MEDIA => 'МультымедыÑ',
NS_SPECIAL => 'ÐдмыÑловае',
@@ -51,8 +32,8 @@ $namespaceNames = array(
NS_USER => 'Удзельнік',
NS_USER_TALK => 'Размовы_з_удзельнікам',
NS_PROJECT_TALK => 'Размовы_пра_{{GRAMMAR:вінавальны|$1}}',
- NS_FILE => 'Ð’Ñ‹Ñва',
- NS_FILE_TALK => 'Размовы_пра_выÑву',
+ NS_FILE => 'Файл',
+ NS_FILE_TALK => 'Размовы_пра_файл',
NS_MEDIAWIKI => 'MediaWiki',
NS_MEDIAWIKI_TALK => 'Размовы_пра_MediaWiki',
NS_TEMPLATE => 'Шаблон',
@@ -65,6 +46,8 @@ $namespaceNames = array(
$namespaceAliases = array(
'$1_размовы' => NS_PROJECT_TALK,
+ 'Ð’Ñ‹Ñва' => NS_FILE,
+ 'Размовы_пра_выÑву' => NS_FILE_TALK,
);
$magicWords = array(
@@ -78,6 +61,25 @@ $magicWords = array(
'img_framed' => array( '1', 'безрамкі', 'framed', 'enframed', 'frame' ),
);
+$bookstoreList = array(
+ 'OZ.by' => 'http://oz.by/search.phtml?what=books&isbn=$1',
+ 'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+);
+
+$datePreferences = array(
+ 'default',
+ 'dmy',
+ 'ISO 8601',
+);
+
+$defaultDateFormat = 'dmy';
+
+$dateFormats = array(
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j xg Y',
+ 'dmy both' => 'H:i, j xg Y',
+);
+
# Per discussion on http://translatewiki.net/wiki/Thread:Support/Customization_of number format
$separatorTransformTable = array(
',' => "\xc2\xa0", # nbsp
@@ -231,7 +233,6 @@ $messages = array(
'qbbrowse' => 'Выбраць',
'qbedit' => 'Правіць',
'qbpageoptions' => 'ГÑÑ‚Ð°Ñ Ñтаронка',
-'qbpageinfo' => 'КантÑкÑÑ‚',
'qbmyoptions' => 'Свае Ñтаронкі',
'qbspecialpages' => 'ÐдмыÑÐ»Ð¾Ð²Ñ‹Ñ Ñтаронкі',
'faq' => 'ЧÐПЫ',
@@ -481,8 +482,10 @@ $2',
# Login and logout pages
'logouttext' => "'''Ð’Ñ‹ выйшлі з ÑÑ–ÑÑ‚Ñмы.'''
-Можна працÑгваць працу на {{SITENAME}} ананімна, або можна [[Special:UserLogin|ўвайÑці Ñž ÑÑ–ÑÑ‚Ñму ізноў]], пад тым Ñамым або пад іншым удзельніцкім імем. Заўважце, што Ð½ÐµÐºÐ°Ñ‚Ð¾Ñ€Ñ‹Ñ Ñтаронкі могуць паказвацца так, быццам вы ÑÑˆÑ‡Ñ Ð½Ðµ выйшлі; у такім разе Ñ‚Ñ€Ñба ачыÑціць кÑш вашага браўзера.",
-'welcomecreation' => '== Вітаем, $1! == Ваш рахунак быў Ñтвораны. Ðе забудзьцеÑÑ Ð´Ð°Ð¿Ð°Ñаваць Ñвае [[Special:Preferences|{{SITENAME}} наÑтáўленні]].',
+Можна працÑгваць працу на {{SITENAME}} ананімна, або можна <span class='plainlinks'>[$1 ўвайÑці Ñž ÑÑ–ÑÑ‚Ñму ізноў]</span>, пад тым Ñамым або пад іншым удзельніцкім імем. Заўважце, што Ð½ÐµÐºÐ°Ñ‚Ð¾Ñ€Ñ‹Ñ Ñтаронкі могуць паказвацца так, быццам вы ÑÑˆÑ‡Ñ Ð½Ðµ выйшлі; у такім разе Ñ‚Ñ€Ñба ачыÑціць кÑш вашага браўзера.",
+'welcomeuser' => 'Вітаем, $1!',
+'welcomecreation-msg' => 'Ваш рахунак быў Ñтвораны.
+Ðе забудзьцеÑÑ Ð´Ð°Ð¿Ð°Ñаваць [[Special:Preferences|перÑÐ°Ð½Ð°Ð»ÑŒÐ½Ñ‹Ñ Ð½Ð°Ñтаўленні]] Ð´Ð»Ñ {{SITENAME}}.',
'yourname' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°',
'yourpassword' => 'Пароль',
'yourpasswordagain' => 'Паўтарыце пароль',
@@ -789,7 +792,6 @@ $2
'template-protected' => '(ахоўваецца)',
'template-semiprotected' => '(чаÑткова ахоўвацца)',
'hiddencategories' => 'Старонка належыць да {{PLURAL:$1|1 Ñхаванай катÑгорыі|$1 Ñхаваных катÑгорый}}:',
-'nocreatetitle' => 'СтварÑнне Ñтаронак абмежавана',
'nocreatetext' => 'Ðа плÑцоўцы {{SITENAME}} магчымаÑці ÑтварÑÐ½Ð½Ñ Ð½Ð¾Ð²Ñ‹Ñ… Ñтаронак абмежаваныÑ.
Ð’Ñ‹ можаце папрацаваць з Ñ–Ñнуючай Ñтаронкай, або [[Special:UserLogin|увайÑці Ñž ÑÑ–ÑÑ‚Ñму, або завеÑці Ñабе рахунак]].',
'nocreate-loggedin' => 'Вам не дазволена Ñтвараць новых Ñтаронак.',
@@ -1307,12 +1309,13 @@ $1",
'right-sendemail' => 'Ðдправіць па Ñлектроннай пошце іншым карыÑтальнікам',
'right-passwordreset' => 'праглÑд Ñлектронных ліÑтоў Ñа змÑненнем паролÑ',
+# Special:Log/newusers
+'newuserlogpage' => 'Журнал Ñ€ÑгіÑтрацыі ўдзельнікаў',
+'newuserlogpagetext' => 'ГÑта журнал Ñ€ÑгіÑтрацыі новых удзельнікаў.',
+
# User rights log
'rightslog' => 'Журнал правоў удзельнікаў',
'rightslogtext' => 'Журнал змÑненнÑÑž у дазволах, прыпіÑаных удзельнікам.',
-'rightslogentry' => 'зменена Ð³Ñ€ÑƒÐ¿Ð°Ð²Ð°Ñ Ð¿Ñ€Ñ‹Ð½Ð°Ð»ÐµÐ¶Ð½Ð°Ñць $1 з $2 на $3',
-'rightslogentry-autopromote' => 'быў аўтаматычна перакладзены з $2 да $3',
-'rightsnone' => '(нÑма)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'чытаць гÑтую Ñтаронку',
@@ -1907,10 +1910,6 @@ $1',
'activeusers-hidesysops' => 'Без адмініÑтратараў',
'activeusers-noresult' => 'ÐÑма такіх удзельнікаў.',
-# Special:Log/newusers
-'newuserlogpage' => 'Журнал Ñ€ÑгіÑтрацыі ўдзельнікаў',
-'newuserlogpagetext' => 'ГÑта журнал Ñ€ÑгіÑтрацыі новых удзельнікаў.',
-
# Special:ListGroupRights
'listgrouprights' => 'Дазволы Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿ удзельнікаў',
'listgrouprights-summary' => 'ГÑÑ‚Ñ‹ пералік вызначаных у гÑтай вікі груп удзельнікаў, разам з прыпіÑанымі ім дазволамі.
@@ -2005,11 +2004,7 @@ $1',
'enotif_mailer' => 'ÐпавÑшчальнік {{SITENAME}}',
'enotif_reset' => 'Пазначыць уÑе Ñтаронкі Ñк наведаныÑ',
-'enotif_newpagetext' => 'ГÑта Ð½Ð¾Ð²Ð°Ñ Ñтаронка.',
'enotif_impersonal_salutation' => 'Шаноўны ўдзельнік {{SITENAME}}',
-'changed' => 'зменена',
-'created' => 'Ñтворана',
-'enotif_subject' => 'Старонка {{SITENAME}} з назвай $PAGETITLE была $CHANGEDORCREATED удзельнікам $PAGEEDITOR',
'enotif_lastvisited' => 'Гл. $1 каб бачыць уÑе мены паÑÐ»Ñ Ð²Ð°ÑˆÐ°Ð³Ð° апошнÑга наведваннÑ.',
'enotif_lastdiff' => 'Гл. $1 каб бачыць гÑтую мену.',
'enotif_anon_editor' => 'ананімны ўдзельнік $1',
@@ -2042,6 +2037,8 @@ $UNWATCHURL
Ð—Ð²Ð°Ñ€Ð¾Ñ‚Ð½Ð°Ñ ÑувÑзь Ñ– дапамога
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'Ñтворана',
+'changed' => 'зменена',
# Delete
'deletepage' => 'Сцерці Ñтаронку',
@@ -2603,7 +2600,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'JavaScript-Ñ‚ÑÑÑ‚Ñ‹',
-'javascripttest-disabled' => 'ГÑта Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ.',
'javascripttest-title' => 'Праводзіцца Ñ‚ÑÑтаванне $1',
'javascripttest-pagetext-noframework' => 'ГÑта Ñтаронка зарÑзервавана Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку Ñ‚ÑÑтаў JavaScript',
'javascripttest-pagetext-unknownframework' => 'ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð±Ñ–Ð±Ð»Ñ–ÑÑ‚Ñка Ñ‚ÑÑÑ‚Ð°Ð²Ð°Ð½Ð½Ñ Â«$1».',
@@ -3531,7 +3527,7 @@ MediaWiki раÑпаўÑюджваецца, ÑпадзеючыÑÑ Ð½Ð° прыд
'logentry-newusers-create' => '$1 Ñтварыў уліковы Ð·Ð°Ð¿Ñ–Ñ ÑƒÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°',
'logentry-newusers-create2' => '$1 Ñтварыў уліковы Ð·Ð°Ð¿Ñ–Ñ ÑƒÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° $3',
'logentry-newusers-autocreate' => 'Ðўтаматычна Ñтвораны ўліковы Ð·Ð°Ð¿Ñ–Ñ $1',
-'newuserlog-byemail' => 'пароль адаÑланы Ñл.поштай',
+'rightsnone' => '(нÑма)',
# Feedback
'feedback-bugornote' => 'Калі вы Ð³Ð°Ñ‚Ð¾Ð²Ñ‹Ñ Ð¿Ð°Ð´Ñ€Ð°Ð±Ñзна апіÑаць Ñ‚Ñхнічную праблему, калі лаÑка, [$1 паведаміце пра памылку].
diff --git a/languages/messages/MessagesBe_tarask.php b/languages/messages/MessagesBe_tarask.php
index 9e0c1810..b80f1b7c 100644
--- a/languages/messages/MessagesBe_tarask.php
+++ b/languages/messages/MessagesBe_tarask.php
@@ -19,23 +19,93 @@
* @author ТеÑÑ‚
*/
-$bookstoreList = array(
- 'OZ.by' => 'http://oz.by/search.phtml?what=books&isbn=$1',
- 'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+$fallback = 'be';
+
+$namespaceNames = array(
+ NS_MEDIA => 'ÐœÑдыÑ',
+ NS_SPECIAL => 'СпÑцыÑльныÑ',
+ NS_TALK => 'Ðбмеркаваньне',
+ NS_USER => 'Удзельнік',
+ NS_USER_TALK => 'Гутаркі_ўдзельніка',
+ NS_PROJECT_TALK => 'Ðбмеркаваньне_{{GRAMMAR:родны|$1}}',
+ NS_FILE => 'Файл',
+ NS_FILE_TALK => 'Ðбмеркаваньне_файла',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'Ðбмеркаваньне_MediaWiki',
+ NS_TEMPLATE => 'Шаблён',
+ NS_TEMPLATE_TALK => 'Ðбмеркаваньне_шаблёну',
+ NS_HELP => 'Дапамога',
+ NS_HELP_TALK => 'Ðбмеркаваньне_дапамогі',
+ NS_CATEGORY => 'КатÑгорыÑ',
+ NS_CATEGORY_TALK => 'Ðбмеркаваньне_катÑгорыі',
);
-$datePreferences = array(
- 'default',
- 'dmy',
- 'ISO 8601',
+$namespaceAliases = array(
+ 'Ðбмеркаваньне_$1' => NS_PROJECT_TALK, // legacy support for old non-inflected links
+ 'Ð’Ñ‹Ñва' => NS_FILE,
+ 'Ðбмеркаваньне_выÑвы' => NS_FILE_TALK,
);
-$defaultDateFormat = 'dmy';
+$namespaceGenderAliases = array(
+ NS_USER => array( 'male' => 'Удзельнік', 'female' => 'Удзельніца' ),
+ NS_USER_TALK => array( 'male' => 'Гутаркі_ўдзельніка', 'female' => 'Гутаркі_ўдзельніцы' ),
+);
-$dateFormats = array(
- 'dmy time' => 'H:i',
- 'dmy date' => 'j xg Y',
- 'dmy both' => 'H:i, j xg Y',
+$specialPageAliases = array(
+ 'Allmessages' => array( 'СыÑÑ‚ÑмныÑ_паведамленьні' ),
+ 'Allpages' => array( 'УÑе_Ñтаронкі' ),
+ 'Ancientpages' => array( 'ÐайÑтарÑйшыÑ_Ñтаронкі' ),
+ 'Block' => array( 'БлÑкаваньне' ),
+ 'BrokenRedirects' => array( 'ÐекарÑктныÑ_перанакіраваньні' ),
+ 'Categories' => array( 'КатÑгорыі' ),
+ 'ChangePassword' => array( 'ЗьмÑніць_пароль', 'ÐчыÑьціць_пароль' ),
+ 'Contributions' => array( 'УнёÑак' ),
+ 'CreateAccount' => array( 'Стварыць_рахунак' ),
+ 'Deadendpages' => array( 'ТупіковыÑ_Ñтаронкі' ),
+ 'DeletedContributions' => array( 'Выдалены_ўнёÑак' ),
+ 'Disambiguations' => array( 'ÐеадназначнаÑьці' ),
+ 'DoubleRedirects' => array( 'ДвайныÑ_перанакіраваньні' ),
+ 'Emailuser' => array( 'ДаÑлаць_ліÑÑ‚' ),
+ 'Export' => array( 'ЭкÑпарт' ),
+ 'Filepath' => array( 'ШлÑÑ…_да_файла' ),
+ 'Import' => array( 'Імпарт' ),
+ 'LinkSearch' => array( 'Пошук_вонкавых_ÑпаÑылак' ),
+ 'Listadmins' => array( 'СьпіÑ_адмініÑтратараў' ),
+ 'Listbots' => array( 'СьпіÑ_робатаў' ),
+ 'Listfiles' => array( 'СьпіÑ_файлаў' ),
+ 'Listredirects' => array( 'СьпіÑ_перанакіраваньнÑÑž' ),
+ 'Listusers' => array( 'СьпіÑ_удзельнікаў' ),
+ 'Log' => array( 'Журналы_падзеÑÑž' ),
+ 'Lonelypages' => array( 'Старонкі-Ñіраціны' ),
+ 'Longpages' => array( 'ДоўгіÑ_Ñтаронкі' ),
+ 'MergeHistory' => array( 'ГіÑторыÑ_аб\'ÑднаньнÑÑž' ),
+ 'Mycontributions' => array( 'Мой_унёÑак' ),
+ 'Mypage' => array( 'МаÑ_Ñтаронка' ),
+ 'Mytalk' => array( 'Мае_размовы' ),
+ 'Newimages' => array( 'ÐовыÑ_файлы' ),
+ 'Newpages' => array( 'ÐовыÑ_Ñтаронкі' ),
+ 'Popularpages' => array( 'ПапулÑрныÑ_Ñтаронкі' ),
+ 'Protectedpages' => array( 'ÐбароненыÑ_Ñтаронкі' ),
+ 'Protectedtitles' => array( 'ЗабароненыÑ_Ñтаронкі' ),
+ 'Randompage' => array( 'ВыпадковаÑ_Ñтаронка' ),
+ 'Randomredirect' => array( 'Выпадковае_перанакіраваньне' ),
+ 'Recentchanges' => array( 'ÐпошніÑ_зьмены' ),
+ 'Search' => array( 'Пошук' ),
+ 'Shortpages' => array( 'КароткіÑ_Ñтаронкі' ),
+ 'Specialpages' => array( 'СпÑцыÑльныÑ_Ñтаронкі' ),
+ 'Statistics' => array( 'СтатыÑтыка' ),
+ 'Uncategorizedcategories' => array( 'ÐекатÑгарызаваныÑ_катÑгорыі' ),
+ 'Uncategorizedimages' => array( 'ÐекатÑгарызаваныÑ_файлы' ),
+ 'Uncategorizedpages' => array( 'ÐекатÑгарызаваныÑ_Ñтаронкі' ),
+ 'Uncategorizedtemplates' => array( 'ÐекатÑгарызаваныÑ_шаблёны' ),
+ 'Upload' => array( 'Загрузка' ),
+ 'Version' => array( 'Ð’ÑÑ€ÑÑ–Ñ' ),
+ 'Wantedcategories' => array( 'ЗапатрабаваныÑ_катÑгорыі' ),
+ 'Wantedfiles' => array( 'ЗапатрабаваныÑ_файлы' ),
+ 'Wantedpages' => array( 'ЗапатрабаваныÑ_Ñтаронкі', 'ÐекарÑктныÑ_ÑпаÑылкі' ),
+ 'Wantedtemplates' => array( 'ЗапатрабаваныÑ_шаблёны' ),
+ 'Watchlist' => array( 'СьпіÑ_назіраньнÑ' ),
+ 'Whatlinkshere' => array( 'СпаÑылкі_на_Ñтаронку' ),
);
$magicWords = array(
@@ -93,14 +163,14 @@ $magicWords = array(
'msg' => array( '0', 'ПÐВЕДÐМЛЕÐЬÐЕ:', 'MSG:' ),
'subst' => array( '0', 'ПÐДСТÐÐОЎКÐ:', 'SUBST:' ),
'msgnw' => array( '0', 'ПÐВЕДÐМЛЕÐЬÐЕ_БЯЗЬ_ВІКІ:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'значак', 'міні', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'значак=$1', 'міні=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_thumbnail' => array( '1', 'значак', 'міні', 'мініÑцюра', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'значак=$1', 'міні=$1', 'мініÑцюра=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'Ñправа', 'right' ),
- 'img_left' => array( '1', 'зьлева', 'left' ),
+ 'img_left' => array( '1', 'зьлева', 'злева', 'left' ),
'img_none' => array( '1', 'нÑма', 'none' ),
'img_width' => array( '1', '$1пкÑ', '$1px' ),
- 'img_center' => array( '1', 'цÑнтар', 'center', 'centre' ),
- 'img_framed' => array( '1', 'рамка', 'framed', 'enframed', 'frame' ),
+ 'img_center' => array( '1', 'цÑнтар', 'цÑнтр', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'рамка', 'безрамкі', 'framed', 'enframed', 'frame' ),
'img_page' => array( '1', 'Ñтаронка=$1', 'Ñтаронка $1', 'page=$1', 'page $1' ),
'img_top' => array( '1', 'зьверху', 'top' ),
'img_middle' => array( '1', 'паÑÑÑ€Ñдзіне', 'middle' ),
@@ -156,88 +226,23 @@ $magicWords = array(
'staticredirect' => array( '1', '__СТÐТЫЧÐÐЕ_ПЕРÐÐÐКІРÐÐ’ÐÐЬÐЕ__', '__STATICREDIRECT__' ),
);
-$namespaceNames = array(
- NS_MEDIA => 'ÐœÑдыÑ',
- NS_SPECIAL => 'СпÑцыÑльныÑ',
- NS_TALK => 'Ðбмеркаваньне',
- NS_USER => 'Удзельнік',
- NS_USER_TALK => 'Гутаркі_ўдзельніка',
- NS_PROJECT_TALK => 'Ðбмеркаваньне_{{GRAMMAR:родны|$1}}',
- NS_FILE => 'Файл',
- NS_FILE_TALK => 'Ðбмеркаваньне_файла',
- NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'Ðбмеркаваньне_MediaWiki',
- NS_TEMPLATE => 'Шаблён',
- NS_TEMPLATE_TALK => 'Ðбмеркаваньне_шаблёну',
- NS_HELP => 'Дапамога',
- NS_HELP_TALK => 'Ðбмеркаваньне_дапамогі',
- NS_CATEGORY => 'КатÑгорыÑ',
- NS_CATEGORY_TALK => 'Ðбмеркаваньне_катÑгорыі',
+$bookstoreList = array(
+ 'OZ.by' => 'http://oz.by/search.phtml?what=books&isbn=$1',
+ 'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
);
-$namespaceAliases = array(
- 'Удзельніца' => NS_USER,
- 'Гутаркі ўдзельніцы' => NS_USER_TALK,
- 'Ðбмеркаваньне_$1' => NS_PROJECT_TALK,
- 'Ð’Ñ‹Ñва' => NS_FILE,
- 'Ðбмеркаваньне выÑвы' => NS_FILE_TALK,
+$datePreferences = array(
+ 'default',
+ 'dmy',
+ 'ISO 8601',
);
-$specialPageAliases = array(
- 'Allmessages' => array( 'СыÑÑ‚ÑмныÑ_паведамленьні' ),
- 'Allpages' => array( 'УÑе_Ñтаронкі' ),
- 'Ancientpages' => array( 'ÐайÑтарÑйшыÑ_Ñтаронкі' ),
- 'Block' => array( 'БлÑкаваньне' ),
- 'BrokenRedirects' => array( 'ÐекарÑктныÑ_перанакіраваньні' ),
- 'Categories' => array( 'КатÑгорыі' ),
- 'ChangePassword' => array( 'ЗьмÑніць_пароль', 'ÐчыÑьціць_пароль' ),
- 'Contributions' => array( 'УнёÑак' ),
- 'CreateAccount' => array( 'Стварыць_рахунак' ),
- 'Deadendpages' => array( 'ТупіковыÑ_Ñтаронкі' ),
- 'DeletedContributions' => array( 'Выдалены_ўнёÑак' ),
- 'Disambiguations' => array( 'ÐеадназначнаÑьці' ),
- 'DoubleRedirects' => array( 'ДвайныÑ_перанакіраваньні' ),
- 'Emailuser' => array( 'ДаÑлаць_ліÑÑ‚' ),
- 'Export' => array( 'ЭкÑпарт' ),
- 'Filepath' => array( 'ШлÑÑ…_да_файла' ),
- 'Import' => array( 'Імпарт' ),
- 'LinkSearch' => array( 'Пошук_вонкавых_ÑпаÑылак' ),
- 'Listadmins' => array( 'СьпіÑ_адмініÑтратараў' ),
- 'Listbots' => array( 'СьпіÑ_робатаў' ),
- 'Listfiles' => array( 'СьпіÑ_файлаў' ),
- 'Listredirects' => array( 'СьпіÑ_перанакіраваньнÑÑž' ),
- 'Listusers' => array( 'СьпіÑ_удзельнікаў' ),
- 'Log' => array( 'Журналы_падзеÑÑž' ),
- 'Lonelypages' => array( 'Старонкі-Ñіраціны' ),
- 'Longpages' => array( 'ДоўгіÑ_Ñтаронкі' ),
- 'MergeHistory' => array( 'ГіÑторыÑ_аб\'ÑднаньнÑÑž' ),
- 'Mycontributions' => array( 'Мой_унёÑак' ),
- 'Mypage' => array( 'МаÑ_Ñтаронка' ),
- 'Mytalk' => array( 'Мае_размовы' ),
- 'Newimages' => array( 'ÐовыÑ_файлы' ),
- 'Newpages' => array( 'ÐовыÑ_Ñтаронкі' ),
- 'Popularpages' => array( 'ПапулÑрныÑ_Ñтаронкі' ),
- 'Protectedpages' => array( 'ÐбароненыÑ_Ñтаронкі' ),
- 'Protectedtitles' => array( 'ЗабароненыÑ_Ñтаронкі' ),
- 'Randompage' => array( 'ВыпадковаÑ_Ñтаронка' ),
- 'Randomredirect' => array( 'Выпадковае_перанакіраваньне' ),
- 'Recentchanges' => array( 'ÐпошніÑ_зьмены' ),
- 'Search' => array( 'Пошук' ),
- 'Shortpages' => array( 'КароткіÑ_Ñтаронкі' ),
- 'Specialpages' => array( 'СпÑцыÑльныÑ_Ñтаронкі' ),
- 'Statistics' => array( 'СтатыÑтыка' ),
- 'Uncategorizedcategories' => array( 'ÐекатÑгарызаваныÑ_катÑгорыі' ),
- 'Uncategorizedimages' => array( 'ÐекатÑгарызаваныÑ_файлы' ),
- 'Uncategorizedpages' => array( 'ÐекатÑгарызаваныÑ_Ñтаронкі' ),
- 'Uncategorizedtemplates' => array( 'ÐекатÑгарызаваныÑ_шаблёны' ),
- 'Upload' => array( 'Загрузка' ),
- 'Version' => array( 'Ð’ÑÑ€ÑÑ–Ñ' ),
- 'Wantedcategories' => array( 'ЗапатрабаваныÑ_катÑгорыі' ),
- 'Wantedfiles' => array( 'ЗапатрабаваныÑ_файлы' ),
- 'Wantedpages' => array( 'ЗапатрабаваныÑ_Ñтаронкі', 'ÐекарÑктныÑ_ÑпаÑылкі' ),
- 'Wantedtemplates' => array( 'ЗапатрабаваныÑ_шаблёны' ),
- 'Watchlist' => array( 'СьпіÑ_назіраньнÑ' ),
- 'Whatlinkshere' => array( 'СпаÑылкі_на_Ñтаронку' ),
+$defaultDateFormat = 'dmy';
+
+$dateFormats = array(
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j xg Y',
+ 'dmy both' => 'H:i, j xg Y',
);
$separatorTransformTable = array(
@@ -388,6 +393,7 @@ $messages = array(
'newwindow' => '(адкрываецца ў новым акне)',
'cancel' => 'СкаÑаваць',
'moredotdotdot' => 'Далей…',
+'morenotlisted' => 'Болей не паказанага...',
'mypage' => 'Старонка',
'mytalk' => 'Гутаркі',
'anontalk' => 'Гутаркі Ð´Ð»Ñ Ð³Ñтага IP-адраÑу',
@@ -399,7 +405,6 @@ $messages = array(
'qbbrowse' => 'ПраглÑдзець',
'qbedit' => 'РÑдагаваць',
'qbpageoptions' => 'ГÑÑ‚Ð°Ñ Ñтаронка',
-'qbpageinfo' => 'Ð†Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð¿Ñ€Ð° Ñтаронку',
'qbmyoptions' => 'Мае Ñтаронкі',
'qbspecialpages' => 'СпÑцыÑÐ»ÑŒÐ½Ñ‹Ñ Ñтаронкі',
'faq' => 'ЧаÑÑ‚Ñ‹Ñ Ð¿Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ–',
@@ -422,6 +427,7 @@ $messages = array(
'namespaces' => 'ПраÑторы назваў',
'variants' => 'ВарыÑнты',
+'navigation-heading' => 'Ðавігацыйнае мÑню',
'errorpagetitle' => 'Памылка',
'returnto' => 'Ð’Ñрнуцца да Ñтаронкі «$1».',
'tagline' => 'ЗьвеÑткі з {{GRAMMAR:родны|{{SITENAME}}}}',
@@ -662,10 +668,10 @@ $2',
# Login and logout pages
'logouttext' => "'''Ð’Ñ‹ выйшлі з ÑÑ‹ÑÑ‚Ñмы.'''
-Ð’Ñ‹ можаце працÑгваць працу Ñž {{GRAMMAR:меÑны|{{SITENAME}}}} ананімна, альбо можаце [[Special:UserLogin|ўвайÑьці Ñž ÑÑ‹ÑÑ‚Ñму]] Ñк той жа альбо іншы ўдзельнік.
+Ð’Ñ‹ можаце працÑгваць працу Ñž {{GRAMMAR:меÑны|{{SITENAME}}}} ананімна, альбо можаце <span class='plainlinks'>[$1 ўвайÑьці Ñž ÑÑ‹ÑÑ‚Ñму]</span> Ñк той жа альбо іншы ўдзельнік.
ÐÐµÐºÐ°Ñ‚Ð¾Ñ€Ñ‹Ñ Ñтаронкі могуць паказвацца, быццам Ð’Ñ‹ ÑžÑÑ‘ ÑÑˆÑ‡Ñ Ñž ÑÑ‹ÑÑ‚Ñме. Каб гÑтага пазьбегнуць, Ñ‚Ñ€Ñба ачыÑьціць кÑш браўзÑра.",
-'welcomecreation' => '== Вітаем, $1! ==
-Ваш рахунак быў Ñтвораны.
+'welcomeuser' => 'Вітаем, $1!',
+'welcomecreation-msg' => 'Ваш рахунак быў Ñтвораны.
Ðе забудзьцеÑÑ Ð·ÑŒÐ¼Ñніць Ð’Ð°ÑˆÑ‹Ñ [[Special:Preferences|налады Ñž {{GRAMMAR:меÑны|{{SITENAME}}}}]].',
'yourname' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°:',
'yourpassword' => 'Пароль:',
@@ -689,7 +695,7 @@ $2',
'gotaccount' => 'Ужо маеце рахунак? $1.',
'gotaccountlink' => 'Увайдзіце',
'userlogin-resetlink' => 'ЗабыліÑÑ Ð½Ð° зьвеÑткі Ð´Ð»Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ñƒ?',
-'createaccountmail' => 'па Ñлектроннай пошце',
+'createaccountmail' => 'Стварыць чаÑовы адвольны пароль Ñ– даÑлаць Ñго на e-mail адраÑ, пазначаны ніжÑй',
'createaccountreason' => 'Прычына:',
'badretype' => 'Ð£Ð²ÐµÐ´Ð·ÐµÐ½Ñ‹Ñ Ð’Ð°Ð¼Ñ– паролі не Ñупадаюць.',
'userexists' => 'Уведзенае Вамі Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° ўжо выкарыÑтоўваецца кімÑьці іншым.
@@ -761,6 +767,7 @@ $2',
# Email sending
'php-mail-error-unknown' => 'Узьнікла невÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ñž функцыі PHP mail()',
'user-mail-no-addy' => 'Спроба даÑлаць Ñлектронны ліÑÑ‚ без адраÑу даÑтаўкі',
+'user-mail-no-body' => 'Спроба даÑлаць ліÑÑ‚ з пуÑтым або надзвычай кароткім зьмеÑтам.',
# Change password dialog
'resetpass' => 'ЗьмÑніць пароль',
@@ -812,7 +819,7 @@ $2
ЧаÑовы пароль: $2',
'passwordreset-emailsent' => 'ЛіÑÑ‚ пра Ñкіданьне паролю быў даÑланы.',
'passwordreset-emailsent-capture' => 'ЛіÑÑ‚ пра Ñкіданьне паролю быў даÑланы, што паказана ніжÑй.',
-'passwordreset-emailerror-capture' => 'Электронны ліÑÑ‚ з напамінам быў Ñтвораны, што паказана ніжÑй, але адбылаÑÑ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° адпраўкі ўдзельніку: $1',
+'passwordreset-emailerror-capture' => 'ЛіÑÑ‚ пра Ñкіданьне паролю быў Ñтвораны Ñ– паказаны ніжÑй, але не ўдалоÑÑ Ð°Ð´Ð¿Ñ€Ð°Ð²Ñ–Ñ†ÑŒ Ñго карыÑтальніку: $1',
# Special:ChangeEmail
'changeemail' => 'ЗьмÑніць Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
@@ -822,6 +829,7 @@ $2
'changeemail-oldemail' => 'ЦÑперашні Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты:',
'changeemail-newemail' => 'Ðовы Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты:',
'changeemail-none' => '(нÑма)',
+'changeemail-password' => 'Ваш пароль у {{GRAMMAR:меÑны|{{SITENAME}}}}:',
'changeemail-submit' => 'ЗьмÑніць Ð°Ð´Ñ€Ð°Ñ Ñлектроннай пошты',
'changeemail-cancel' => 'СкаÑаваць',
@@ -999,7 +1007,6 @@ $2
'template-protected' => '(абаронены)',
'template-semiprotected' => '(чаÑткова абароненаÑ)',
'hiddencategories' => 'ГÑÑ‚Ð°Ñ Ñтаронка належыць $1 {{PLURAL:$1|Ñхаванай катÑгорыі|Ñхаваным катÑгорыÑм|Ñхаваным катÑгорыÑм}}:',
-'nocreatetitle' => 'СтварÑньне Ñтаронак абмежаванае',
'nocreatetext' => 'У {{GRAMMAR:меÑны|{{SITENAME}}}} абмежаванае ÑтварÑньне новых Ñтаронак.
Ð’Ñ‹ можаце вÑрнуцца Ñ– Ñ€Ñдагаваць Ñ–Ñнуючую Ñтаронку, альбо [[Special:UserLogin|ўвайÑьці Ñž ÑÑ‹ÑÑ‚Ñму ці Ñтварыць рахунак]].',
'nocreate-loggedin' => 'Ð’Ñ‹ Ð½Ñ Ð¼Ð°ÐµÑ†Ðµ дазволу на ÑтварÑньне новых Ñтаронак.',
@@ -1023,6 +1030,15 @@ $2
'edit-already-exists' => 'Ðемагчыма Ñтварыць новую Ñтаронку.
Яна ўжо Ñ–Ñнуе.',
'defaultmessagetext' => 'Перадвызначаны Ñ‚ÑкÑÑ‚ паведамленьнÑ',
+'content-failed-to-parse' => 'ЗьмеÑÑ‚ «$2» не адпавÑдае тыпу $1: $3.',
+'invalid-content-data' => 'ÐÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі',
+'content-not-allowed-here' => 'ЗьмеÑÑ‚ тыпу «$1» на Ñтаронцы [[$2]] не дазволены',
+
+# Content models
+'content-model-wikitext' => 'вікі-Ñ‚ÑкÑÑ‚',
+'content-model-text' => 'проÑÑ‚Ñ‹ Ñ‚ÑкÑÑ‚',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'ПапÑÑ€Ñджаньне: гÑÑ‚Ð°Ñ Ñтаронка ўтрымлівае зашмат працаёміÑÑ‚Ñ‹Ñ… зваротаў да функцыÑÑž парÑÑра.
@@ -1388,9 +1404,9 @@ $1",
'prefs-emailconfirm-label' => 'Пацьверджаньне адраÑу Ñлектроннай пошты:',
'prefs-textboxsize' => 'Памеры акна Ñ€ÑдагаваньнÑ',
'youremail' => 'ÐÐ´Ñ€Ð°Ñ Ñлектроннай пошты:',
-'username' => 'Ð†Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ°/ўдзельніцы:',
-'uid' => 'ID удзельніка/ўдзельніцы:',
-'prefs-memberingroups' => 'Удзельнік {{PLURAL:$1|групы|групаў}}:',
+'username' => 'Ð†Ð¼Ñ {{GENDER:$1|ўдзельніка|ўдзельніцы}}:',
+'uid' => 'ID {{GENDER:$1|удзельніка|удзельніцы}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Удзельнік|Удзельніца}} {{PLURAL:$1|групы|групаў}}:',
'prefs-registration' => 'Ð§Ð°Ñ Ñ€ÑгіÑтрацыі:',
'yourrealname' => 'Сапраўднае імÑ:',
'yourlanguage' => 'Мова інтÑрфÑйÑу:',
@@ -1539,12 +1555,13 @@ $1",
'right-sendemail' => 'адпраўка Ñлектронных ліÑтоў іншым удзельнікам',
'right-passwordreset' => 'праглÑд Ñлектронных ліÑтоў з ачыÑткай паролю',
+# Special:Log/newusers
+'newuserlogpage' => 'Журнал ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž',
+'newuserlogpagetext' => 'ГÑта журнал ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž удзельнікаў Ñ– ўдзельніц.',
+
# User rights log
'rightslog' => 'Журнал правоў удзельнікаў',
'rightslogtext' => 'ГÑта журнал зьменаў правоў удзельнікаў.',
-'rightslogentry' => 'зьменена прыналежнаÑьць $1 з групы $2 да $3',
-'rightslogentry-autopromote' => 'быў аўтаматычна падвышаны з $2 да $3',
-'rightsnone' => '(нÑма)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'чытаньне гÑтай Ñтаронкі',
@@ -1771,6 +1788,7 @@ $1',
'backend-fail-notsame' => 'ÐеідÑнтыфікаваны файл ужо Ñ–Ñнуе $1.',
'backend-fail-invalidpath' => '$1 не зьÑўлÑецца Ñлушным шлÑхам да Ñховішча.',
'backend-fail-delete' => 'Ðемагчыма выдаліць файл $1.',
+'backend-fail-describe' => 'Ðе атрымалаÑÑ Ð·ÑŒÐ¼Ñніць мÑтазьвеÑткі Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° «$1».',
'backend-fail-alreadyexists' => 'Файл $1 ужо Ñ–Ñнуе.',
'backend-fail-store' => 'Ðемагчыма захаваць файл $1 у $2.',
'backend-fail-copy' => 'Ðемагчыма ÑкапіÑваць файл $1 у $2.',
@@ -2009,6 +2027,12 @@ $1',
ЗамеÑÑ‚ гÑтага, Ñны павінны ÑпаÑылацца на пÑÑžÐ½Ñ‹Ñ Ñтаронкі.<br />
Старонка лічыцца шматзначнай, калі Ñна ўтрымлівае шаблён назва Ñкога знаходзіцца на Ñтаронцы [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'Старонкі з улаÑьціваÑьцÑмі Ñтаронак',
+'pageswithprop-legend' => 'Старонкі з улаÑьціваÑьцÑмі Ñтаронак',
+'pageswithprop-text' => 'Ðа гÑтай Ñтаронцы адлюÑтроўваюцца Ñтаронкі, ÑÐºÑ–Ñ ÑžÐ¶Ñ‹Ð²Ð°ÑŽÑ†ÑŒ пÑÑžÐ½Ñ‹Ñ ÑžÐ»Ð°ÑьціваÑьці Ñтаронак',
+'pageswithprop-prop' => 'Ð†Ð¼Ñ ÑžÐ»Ð°ÑьціваÑьці:',
+'pageswithprop-submit' => 'Паказаць',
+
'doubleredirects' => 'Ð”Ð²Ð°Ð¹Ð½Ñ‹Ñ Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½Ñ–',
'doubleredirectstext' => 'Ðа гÑтай Ñтаронцы пададзены ÑÑŒÐ¿Ñ–Ñ Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½ÑÑž на Ñ–Ð½ÑˆÑ‹Ñ Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½Ñ–. Кожны радок утрымлівае ÑпаÑылкі на першае Ñ– другое перанакіраваньне, а такÑама мÑтавую Ñтаронку другога перанакіраваньнÑ, ÑÐºÐ°Ñ Ð·Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ð° зьÑўлÑецца «Ñапраўднай» мÑтавай Ñтаронкай, куды павіннае ÑпаÑылацца першае перанакіраваньне.
<del>ЗакрÑÑьленыÑ</del> ÑлемÑнты былі выпраўленыÑ.',
@@ -2161,7 +2185,7 @@ $1',
'linksearch-ok' => 'Шукаць',
'linksearch-text' => 'Можна ўжываць Ñымбалі падÑтаноўкі, напрыклад, «*.wikipedia.org».<br />
Ðеабходны дамÑн першага ўзроўню, напрыклад, «*.org».<br />
-Пратаколы, ÑÐºÑ–Ñ Ð¿Ð°Ð´Ñ‚Ñ€Ñ‹Ð¼Ð»Ñ–Ð²Ð°ÑŽÑ†Ñ†Ð°: <code>$1</code> (дапомна http://, калі пратакол не пазначаны).',
+{{PLURAL:$2|Пратакол, Ñкі падтрымліваецца|Пратаколы, ÑÐºÑ–Ñ Ð¿Ð°Ð´Ñ‚Ñ€Ñ‹Ð¼Ð»Ñ–Ð²Ð°ÑŽÑ†Ñ†Ð°}}: <code>$1</code> (дапомна http://, калі пратакол не пазначаны).',
'linksearch-line' => 'СпаÑылка на $1 з $2',
'linksearch-error' => 'Сымбалі падÑтаноўкі могуць ужывацца толькі Ñž пачатку адраÑоў.',
@@ -2180,10 +2204,6 @@ $1',
'activeusers-hidesysops' => 'Схаваць адмініÑтратараў',
'activeusers-noresult' => 'Удзельнікі Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ñ‹Ñ.',
-# Special:Log/newusers
-'newuserlogpage' => 'Журнал ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž',
-'newuserlogpagetext' => 'ГÑта журнал ÑтварÑÐ½ÑŒÐ½Ñ Ñ€Ð°Ñ…ÑƒÐ½ÐºÐ°Ñž удзельнікаў Ñ– ўдзельніц.',
-
# Special:ListGroupRights
'listgrouprights' => 'Правы групаў удзельнікаў',
'listgrouprights-summary' => 'ÐіжÑй пададзены ÑÑŒÐ¿Ñ–Ñ Ð³Ñ€ÑƒÐ¿Ð°Ñž удзельнікаў {{GRAMMAR:родны|{{SITENAME}}}}, разам зь Ñ–Ñ… правамі.
@@ -2278,29 +2298,31 @@ $1',
'enotif_mailer' => 'Служба паштовага апавÑшчÑÐ½ÑŒÐ½Ñ {{GRAMMAR:родны|{{SITENAME}}}}',
'enotif_reset' => 'Пазначыць уÑе Ñтаронкі Ñк прагледжаныÑ',
-'enotif_newpagetext' => 'ГÑта Ð½Ð¾Ð²Ð°Ñ Ñтаронка.',
'enotif_impersonal_salutation' => 'Удзельнік {{GRAMMAR:родны|{{SITENAME}}}}',
-'changed' => 'зьмененаÑ',
-'created' => 'ÑтворанаÑ',
-'enotif_subject' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} $PAGETITLE была $CHANGEDORCREATED ўдзельнікам $PAGEEDITOR',
+'enotif_subject_deleted' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð°Ñ {{GENDER:$2|удзельнікам|удзельніцай}} $2',
+'enotif_subject_created' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была ÑÑ‚Ð²Ð¾Ñ€Ð°Ð½Ð°Ñ {{GENDER:$2|удзельнікам|удзельніцай}} $2',
+'enotif_subject_moved' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была перанеÑÐµÐ½Ð°Ñ {{GENDER:$2|удзельнікам|удзельніцай}} $2',
+'enotif_subject_restored' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ð°Ñ {{GENDER:$2|удзельнікам|удзельніцай}} $2',
+'enotif_subject_changed' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была Ð·ÑŒÐ¼ÐµÐ½ÐµÐ½Ð°Ñ {{GENDER:$2|удзельнікам|удзельніцай}} $2',
+'enotif_body_intro_deleted' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð°Ñ $PAGEEDITDATE {{GENDER:$2|удзельнікам|удзельніцай}} $2, глÑдзіце $3.',
+'enotif_body_intro_created' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была ÑÑ‚Ð²Ð¾Ñ€Ð°Ð½Ð°Ñ $PAGEEDITDATE {{GENDER:$2|удзельнікам|удзельніцай}} $2, па цÑперашнюю вÑÑ€ÑÑ–ÑŽ глÑдзіце $3.',
+'enotif_body_intro_moved' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была перанеÑÐµÐ½Ð°Ñ $PAGEEDITDATE {{GENDER:$2|удзельнікам|удзельніцай}} $2, па цÑперашнюю вÑÑ€ÑÑ–ÑŽ глÑдзіце $3.',
+'enotif_body_intro_restored' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ð°Ñ $PAGEEDITDATE {{GENDER:$2|удзельнікам|удзельніцай}} $2, па цÑперашнюю вÑÑ€ÑÑ–ÑŽ глÑдзіце $3.',
+'enotif_body_intro_changed' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была Ð·ÑŒÐ¼ÐµÐ½ÐµÐ½Ð°Ñ $PAGEEDITDATE {{GENDER:$2|удзельнікам|удзельніцай}} $2, па цÑперашнюю вÑÑ€ÑÑ–ÑŽ глÑдзіце $3.',
'enotif_lastvisited' => 'ГлÑдзіце на $1 уÑе Ð°Ð¿Ð¾ÑˆÐ½Ñ–Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹, ÑÐºÑ–Ñ Ð°Ð´Ð±Ñ‹Ð»Ñ–ÑÑ Ð¿Ð°ÑÑŒÐ»Ñ Ð’Ð°ÑˆÐ°Ð³Ð° апошнÑга наведваньнÑ.',
'enotif_lastdiff' => 'ГлÑдзіце $1, каб пабачыць гÑтую зьмену.',
'enotif_anon_editor' => 'ананімны ўдзельнік $1',
-'enotif_body' => 'Шаноўны $WATCHINGUSERNAME,
-
+'enotif_body' => 'Вітаем, $WATCHINGUSERNAME.
-Старонка $PAGETITLE {{GRAMMAR:родны|{{SITENAME}}}} была $CHANGEDORCREATED $PAGEEDITDATE $PAGEEDITOR, глÑдзіце цÑперашнюю вÑÑ€ÑÑ–ÑŽ на $PAGETITLE_URL.
+$PAGEINTRO $NEWPAGE
-$NEWPAGE
+ÐпіÑаньне зьменаў: $PAGESUMMARY $PAGEMINOREDIT
-Кароткае апіÑаньне зьменаў: $PAGESUMMARY $PAGEMINOREDIT
+ЗьвÑзацца з Ñ€Ñдактарам:
+па Ñлектроннай пошце: $PAGEEDITOR_EMAIL
+празь вікі-Ñтаронку: $PAGEEDITOR_WIKI
-ЗьвÑзацца з аўтарам:
-ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾ÑˆÑ‚Ð°: $PAGEEDITOR_EMAIL
-вікі-Ñтаронка: $PAGEEDITOR_WIKI
-
-Паведамленьні Ð½Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ даÑылацца Ñž выпадку паўторных Ñ€ÑдагаваньнÑÑž, пакуль Ð’Ñ‹ не наведаеце гÑтую Ñтаронку.
-Ð’Ñ‹ можаце пазначыць ÑьцÑжкі даÑылкі паведамленьнÑÑž Ð´Ð»Ñ ÑžÑÑ–Ñ… Ñтаронках Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ Ð’Ð°ÑˆÐ°Ð³Ð° ÑьпіÑу назіраньнÑ.
+Паведамленьні Ð½Ñ Ð±ÑƒÐ´ÑƒÑ†ÑŒ даÑылацца Ñž выпадку паўторных Ñ€ÑдагаваньнÑÑž, пакуль Ð’Ñ‹ не наведаеце гÑтую Ñтаронку. Ð’Ñ‹ можаце пазначыць ÑьцÑжкі даÑылкі паведамленьнÑÑž Ð´Ð»Ñ ÑžÑÑ–Ñ… Ñтаронках Ð½Ð°Ð·Ñ–Ñ€Ð°Ð½ÑŒÐ½Ñ Ð’Ð°ÑˆÐ°Ð³Ð° ÑьпіÑу назіраньнÑ.
СыÑÑ‚Ñма паведамленьнÑÑž {{GRAMMAR:родны|{{SITENAME}}}}
@@ -2316,6 +2338,8 @@ $UNWATCHURL
Ð—Ð²Ð°Ñ€Ð¾Ñ‚Ð½Ð°Ñ ÑувÑзь Ñ– дапамога:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'ÑтворанаÑ',
+'changed' => 'зьмененаÑ',
# Delete
'deletepage' => 'Выдаліць Ñтаронку',
@@ -2386,6 +2410,8 @@ $UNWATCHURL
'prot_1movedto2' => '[[$1]] перанеÑÐµÐ½Ð°Ñ Ñž [[$2]]',
'protect-badnamespace-title' => 'ПраÑтора назваў, у Ñкой немагчыма абаранÑць Ñтаронкі',
'protect-badnamespace-text' => 'Старонкі Ñž гÑтай праÑторы назваў Ð½Ñ Ð¼Ð¾Ð³ÑƒÑ†ÑŒ быць абароненыÑ.',
+'protect-norestrictiontypes-text' => 'Ðемагчыма абараніць гÑтую Ñтаронку, паколькі не Ñ–Ñнуе тыпаў абароны.',
+'protect-norestrictiontypes-title' => 'ÐеабаранÑÐ»ÑŒÐ½Ð°Ñ Ñтаронка',
'protect-legend' => 'Пацьверджаньне абароны',
'protectcomment' => 'Прычына:',
'protectexpiry' => 'ТÑрмін:',
@@ -2471,7 +2497,8 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ð°Ñ $1 вÑÑ€ÑÑ–Ñ|Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ $1 вÑÑ€ÑÑ–Ñ–|Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ $1 вÑÑ€ÑÑ–ÑÑž}}',
'undeletedrevisions-files' => 'Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ $1 {{PLURAL:$1|вÑÑ€ÑÑ–Ñ|вÑÑ€ÑÑ–Ñ–|вÑÑ€ÑÑ–ÑÑž}} Ñ– $2 {{PLURAL:$2|файл|файлы|файлаў}}',
'undeletedfiles' => '{{PLURAL:$1|адноўлены $1 файл|Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ $1 файлы|Ð°Ð´Ð½Ð¾ÑžÐ»ÐµÐ½Ñ‹Ñ $1 файлаў}}',
-'cannotundelete' => 'Ðднаўленьне не адбылоÑÑ; нехта іншы мог паÑьпець аднавіць Ñтаронку раней.',
+'cannotundelete' => 'Памылка аднаўленьнÑ:
+$1',
'undeletedpage' => "'''Старонка $1 была адноўленаÑ'''
ГлÑдзіце [[Special:Log/delete|журнал выдаленьнÑÑž]] Ð´Ð»Ñ Ð¿Ñ€Ð°Ð³Ð»Ñду апошніх выдаленьнÑÑž Ñ– аднаўненьнÑÑž.",
@@ -2503,7 +2530,7 @@ $1',
'blanknamespace' => '(ÐÑноўнаÑ)',
# Contributions
-'contributions' => 'УнёÑак',
+'contributions' => 'УнёÑак {{GENDER:$1|удзельніка|удзельніцы}}',
'contributions-title' => 'УнёÑак {{GENDER:$1|удзельніка|удзельніцы}} $1',
'mycontris' => 'УнёÑак',
'contribsub2' => 'Ð”Ð»Ñ $1 ($2)',
@@ -2771,6 +2798,7 @@ $1',
'immobile-target-namespace-iw' => 'ІнтÑрвікі-ÑпаÑылка — нÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð° Ð´Ð»Ñ Ð¿ÐµÑ€Ð°Ð½Ð¾Ñу Ñтаронкі.',
'immobile-source-page' => 'ГÑтую Ñтаронку нельга пераноÑіць.',
'immobile-target-page' => 'Ðемагчыма перанеÑьці Ñтаронку пад гÑтую назву.',
+'bad-target-model' => 'Ð’Ñ‹Ð½Ñ–ÐºÐ¾Ð²Ð°Ñ Ñтаронка выкарыÑтоўвае іншы тып зьмеÑту. Ðемагчыма пераўтварыць $1 у $2.',
'imagenocrossnamespace' => 'Ðельга перанеÑьці файл у нÑ-файлавую праÑтору назваў',
'nonfile-cannot-move-to-file' => 'Ðельга перанеÑьці Ð½Ñ Ñ„Ð°Ð¹Ð» у праÑтору назваў файлаў',
'imagetypemismatch' => 'Ðовае пашырÑньне файла не адпавÑдае Ñго тыпу',
@@ -2887,6 +2915,7 @@ $1',
'import-error-interwiki' => 'Старонка «$1» не была імпартаванаÑ, таму што гÑÑ‚Ð°Ñ Ð½Ð°Ð·Ð²Ð° зарÑзÑÑ€Ð²Ð°Ð²Ð°Ð½Ð°Ñ Ð´Ð»Ñ Ñ–Ð½Ñ‚Ñрвікі.',
'import-error-special' => 'Старонка «$1» не была імпартаванаÑ, таму што Ñна належыць да ÑпÑцыÑльнай праÑторы назваў, Ñтаронкі Ñž Ñкой не дазволеныÑ.',
'import-error-invalid' => 'Старонка «$1» не была Ñ–Ð¼Ð¿Ð°Ñ€Ñ‚Ð°Ð²Ð°Ð½Ð°Ñ Ð·-за нÑÑлушнаÑьці назвы.',
+'import-error-unserialize' => 'Ðе атрымалаÑÑ Ð´ÑÑÑрыÑлізаваць вÑÑ€ÑÑ–ÑŽ $2 Ñтаронкі «$1». МеркавалаÑÑ, што вÑÑ€ÑÑ–Ñ Ð²Ñ‹ÐºÐ°Ñ€Ñ‹Ñтоўвала мадÑль зьвеÑтак $3 Ñ– была ÑÑрыÑлізавана Ñž фармаце $4.',
'import-options-wrong' => '{{PLURAL:$2|ÐÑÑÐ»ÑƒÑˆÐ½Ð°Ñ Ð½Ð°Ð»Ð°Ð´Ð°|ÐÑÑÐ»ÑƒÑˆÐ½Ñ‹Ñ Ð½Ð°Ð»Ð°Ð´Ñ‹}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'ÐŸÐ°Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ Ð½Ð°Ð·Ð²Ð° карнÑвой Ñтаронкі нÑÑлушнаÑ.',
'import-rootpage-nosubpage' => 'ПадÑтаронкі Ñž праÑторы назваў «$1» карнÑвой Ñтаронкі не дазволеныÑ.',
@@ -2901,7 +2930,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'ТÑÑтаваньне JavaScript',
-'javascripttest-disabled' => 'ГÑÑ‚Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ Ð½Ðµ была ÑžÐºÐ»ÑŽÑ‡Ð°Ð½Ð°Ñ Ñž гÑтай вікі.',
'javascripttest-title' => 'Праводзіцца Ñ‚ÑÑтаваньне $1',
'javascripttest-pagetext-noframework' => 'ГÑÑ‚Ð°Ñ Ñтаронка трымаецца Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²ÑÐ´Ð·ÐµÐ½ÑŒÐ½Ñ Ñ‚ÑÑтаў JavaScript.',
'javascripttest-pagetext-unknownframework' => 'ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð±Ñ–Ð±Ð»Ñ–ÑÑ‚Ñка Ñ‚ÑÑÑ‚Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Â«$1».',
@@ -3017,11 +3045,13 @@ $1',
'pageinfo-default-sort' => 'Перадвызначаны ключ ÑартаваньнÑ',
'pageinfo-length' => 'Памер Ñтаронкі (у байтах)',
'pageinfo-article-id' => 'ІдÑнтыфікатар Ñтаронкі',
+'pageinfo-language' => 'Мова зьмеÑту Ñтаронкі',
'pageinfo-robot-policy' => 'ІндÑкÑÐ°Ñ†Ñ‹Ñ Ð¿Ð°ÑˆÑƒÐºÐ°Ð²Ñ–ÐºÐ°Ð¼Ñ–',
'pageinfo-robot-index' => 'ІндÑкÑуецца',
'pageinfo-robot-noindex' => 'Ðе індÑкÑуецца',
'pageinfo-views' => 'КолькаÑьць праглÑдаў',
'pageinfo-watchers' => 'КолькаÑьць назіральнікаў Ñ– назіральніц',
+'pageinfo-few-watchers' => 'Менш за $1 {{PLURAL:$1|назіральніка|назіральнікаў}}',
'pageinfo-redirects-name' => 'ПеранакіраваньнÑÑž на гÑтую Ñтаронку',
'pageinfo-subpages-name' => 'КолькаÑьць падÑтаронак',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|перанакіраваньне|перанакіраваньні|перанакіраваньнÑÑž}}; $3 {{PLURAL:$3|звычайнаÑ|звычайныÑ|звычайных}})',
@@ -3036,6 +3066,19 @@ $1',
'pageinfo-magic-words' => '{{PLURAL:$1|Магічнае Ñлова|ÐœÐ°Ð³Ñ–Ñ‡Ð½Ñ‹Ñ Ñловы}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Ð¡Ñ…Ð°Ð²Ð°Ð½Ð°Ñ ÐºÐ°Ñ‚ÑгорыÑ|Ð¡Ñ…Ð°Ð²Ð°Ð½Ñ‹Ñ ÐºÐ°Ñ‚Ñгорыі}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Шаблён|Шаблёны}} ($1)',
+'pageinfo-transclusions' => 'ВыкарыÑтаньне на {{PLURAL:$1|іншай Ñтаронцы|іншых Ñтаронках}} ($1)',
+'pageinfo-toolboxlink' => 'ЗьвеÑткі пра Ñтаронку',
+'pageinfo-redirectsto' => 'Перанакіроўвае на',
+'pageinfo-redirectsto-info' => 'інфармацыÑ',
+'pageinfo-contentpage' => 'Лічыцца артыкулам',
+'pageinfo-contentpage-yes' => 'Так',
+'pageinfo-protect-cascading' => 'ÐдÑюль пачынаецца каÑÐºÐ°Ð´Ð½Ð°Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ð°',
+'pageinfo-protect-cascading-yes' => 'Так',
+'pageinfo-protect-cascading-from' => 'КаÑÐºÐ°Ð´Ð½Ð°Ñ Ð°Ð±Ð°Ñ€Ð¾Ð½Ð°Ñ Ð¿Ð°Ñ‡Ñ‹Ð½Ð°ÐµÑ†Ñ†Ð° з',
+'pageinfo-category-info' => 'Ð†Ð½Ñ„Ð°Ñ€Ð¼Ð°Ñ†Ñ‹Ñ Ð¿Ñ€Ð° катÑгорыю',
+'pageinfo-category-pages' => 'КолькаÑьць Ñтаронак',
+'pageinfo-category-subcats' => 'КолькаÑьць падкатÑгорыÑÑž',
+'pageinfo-category-files' => 'КолькаÑьць файлаў',
# Skin names
'skinname-standard' => 'КлÑÑычнае',
@@ -3058,6 +3101,8 @@ $1',
'markedaspatrollederror' => 'Ðемагчыма пазначыць Ñк «патрулÑваную»',
'markedaspatrollederrortext' => 'Ð’Ñ‹ муÑіце абраць вÑÑ€ÑÑ–ÑŽ, каб пазначыць Ñе «патрулÑванай».',
'markedaspatrollederror-noautopatrol' => 'Вам не дазволена пазначаць Ð’Ð°ÑˆÑ‹Ñ ÑžÐ»Ð°ÑÐ½Ñ‹Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹ Ñк «патрулÑваныÑ».',
+'markedaspatrollednotify' => 'ГÑÑ‚Ð°Ñ Ð·ÑŒÐ¼ÐµÐ½Ð° Ñž «$1» была Ð¿Ð°Ð·Ð½Ð°Ñ‡Ð°Ð½Ð°Ñ Ñк патрулÑванаÑ.',
+'markedaspatrollederrornotify' => 'Ðе атрымалаÑÑ Ð°Ð´Ð¿Ð°Ñ‚Ñ€ÑƒÐ»Ñваць Ñтаронку.',
# Patrol log
'patrol-log-page' => 'Журнал патрулÑваньнÑÑž',
@@ -3090,6 +3135,7 @@ $1',
'file-nohires' => 'ÐÑма вÑÑ€ÑÑ–Ñ– зь лепшым разрозьненьнем.',
'svg-long-desc' => 'SVG-файл, намінальна $1 × $2 {{PLURAL:$2|пікÑÑл|пікÑÑлы|пікÑÑлаў}}, памер файла: $3.',
'svg-long-desc-animated' => 'Ðнімаваны SVG-файл, намінальна $1 × $2 {{PLURAL:$2|пікÑÑл|пікÑÑлы|пікÑÑлаў}}, памер файла: $3',
+'svg-long-error' => 'ÐÑÑлушны SVG-файл: $1',
'show-big-image' => 'Ðайлепшае разрозьненьне',
'show-big-image-preview' => 'Памер праглÑду: $1.',
'show-big-image-other' => '{{PLURAL:$2|Іншае разрозьненьне|Ð†Ð½ÑˆÑ‹Ñ Ñ€Ð°Ð·Ñ€Ð¾Ð·ÑŒÐ½ÐµÐ½ÑŒÐ½Ñ–}}: $1.',
@@ -3123,7 +3169,10 @@ $1',
'minutes' => '$1 {{PLURAL:$1|хвіліна|хвіліны|хвілінаў}}',
'hours' => '$1 {{PLURAL:$1|гадзіна|гадзіны|гадзінаў}}',
'days' => '$1 {{PLURAL:$1|дзень|дні|дзён}}',
+'months' => '{{PLURAL:$1|$1 меÑÑц|$1 меÑÑцы|$1 меÑÑцаў}}',
+'years' => '{{PLURAL:$1|$1 год|$1 гады|$1 гадоў}}',
'ago' => '$1 таму',
+'just-now' => 'толькі што',
# Bad image list
'bad_image_list' => 'Фармат наÑтупны:
@@ -3614,6 +3663,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[УлучÑньне інтÑрвікі было адключанае]',
'scarytranscludefailed' => '[Памылка Ð°Ñ‚Ñ€Ñ‹Ð¼Ð°Ð½ÑŒÐ½Ñ ÑˆÐ°Ð±Ð»Ñ‘Ð½Ñƒ $1]',
+'scarytranscludefailed-httpstatus' => '[Памылка Ð°Ñ‚Ñ€Ñ‹Ð¼Ð°Ð½ÑŒÐ½Ñ ÑˆÐ°Ð±Ð»Ñ‘Ð½Ñƒ $1: HTTP $2]',
'scarytranscludetoolong' => '[Занадта даўгі URL-адраÑ]',
# Delete conflict
@@ -3741,6 +3791,7 @@ $5
'version-license' => 'ЛіцÑнзіÑ',
'version-poweredby-credits' => "{{SITENAME}} працуе на праграмным забеÑьпÑчÑньні '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'іншыÑ',
+'version-credits-summary' => 'Ðам вельмі хацелаÑÑ Ð± адзначыць наÑтупных аÑобаў, што зрабілі ўнёÑак у [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki зьÑўлÑецца вольным праграмным забеÑьпÑчÑньнем, Ñкое Ð’Ñ‹ можаце раÑпаўÑюджваць Ñ–/ці зьмÑнÑць на ўмовах ліцÑнзіі GNU General Public License вÑÑ€ÑÑ–Ñ– 2 ці болей позьнÑй, апублікаванай ФундацыÑй вольнага праграмнага забеÑьпÑчÑÐ½ÑŒÐ½Ñ (Free Software Foundation).
MediaWiki раÑпаўÑюджваецца з надзеÑй, што будзе карыÑным, але БЕЗ ÐÐІЯКІХ ГÐРÐÐТЫЯЎ, нават без меркаваных гарантыÑÑž КÐМЭРЦЫЙÐÐЙ КÐШТОЎÐÐСЬЦІ ці ПРЫДÐТÐÐСЬЦІ ДРПЭЎÐÐЙ МЭТЫ. ГлÑдзіце ліцÑнзію GNU General Public License Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐ¹ падрабÑзных зьвеÑтак.
@@ -3857,17 +3908,17 @@ MediaWiki раÑпаўÑюджваецца з надзеÑй, што будзе
'sqlite-no-fts' => '$1 без падтрымкі поўнатÑкÑтнага пошуку',
# New logging system
-'logentry-delete-delete' => '$1 выдаліў Ñтаронку $3',
-'logentry-delete-restore' => '$1 аднавіў Ñтаронку $3',
-'logentry-delete-event' => '$1 зьмÑніў бачнаÑьць $5 {{PLURAL:$5|падзеі Ñž журнале|падзеÑÑž у журнале|падзеÑÑž у журнале}} на $3: $4',
-'logentry-delete-revision' => '$1 зьмÑніў бачнаÑьць $5 {{PLURAL:$5|вÑÑ€ÑÑ–Ñ–|вÑÑ€ÑÑ–ÑÑž|вÑÑ€ÑÑ–ÑÑž}} Ñтаронкі $3: $4',
-'logentry-delete-event-legacy' => '$1 зьмÑніў бачнаÑьць падзеÑÑž у журнале на $3',
-'logentry-delete-revision-legacy' => '$1 зьмÑніў бачнаÑьць вÑÑ€ÑÑ–ÑÑž Ñтаронкі $3',
-'logentry-suppress-delete' => '$1 Ñхаваў Ñтаронку $3',
-'logentry-suppress-event' => '$1 прыхавана зьмÑніў бачнаÑьць $5 {{PLURAL:$5|падзеі Ñž журнале|падзеÑÑž у журнале|падзеÑÑž у журнале}} на $3: $4',
-'logentry-suppress-revision' => '$1 прыхавана зьмÑніў бачнаÑьць $5 {{PLURAL:$5|вÑÑ€ÑÑ–Ñ–|вÑÑ€ÑÑ–ÑÑž|вÑÑ€ÑÑ–ÑÑž}} Ñтаронкі $3: $4',
-'logentry-suppress-event-legacy' => '$1 прыхавана зьмÑніў бачнаÑьць падзеÑÑž у журнале на $3',
-'logentry-suppress-revision-legacy' => '$1 прыхавана зьмÑніў бачнаÑьць вÑÑ€ÑÑ–ÑÑž Ñтаронкі $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|выдаліў|выдаліла}} Ñтаронку $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|аднавіў|аднавіла}} Ñтаронку $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|зьмÑніў|зьмÑніла}} бачнаÑьць $5 {{PLURAL:$5|падзеі Ñž журнале|падзеÑÑž у журнале}} на $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|зьмÑніў|зьмÑніла}} бачнаÑьць $5 {{PLURAL:$5|вÑÑ€ÑÑ–Ñ–|вÑÑ€ÑÑ–ÑÑž}} Ñтаронкі $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|зьмÑніў|зьмÑніла}} бачнаÑьць падзеÑÑž у журнале на $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|зьмÑніў|зьмÑніла}} бачнаÑьць вÑÑ€ÑÑ–ÑÑž Ñтаронкі $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|Ñхаваў|Ñхавала}} Ñтаронку $3',
+'logentry-suppress-event' => '$1 прыхавана {{GENDER:$2|зьмÑніў|зьмÑніла}} бачнаÑьць $5 {{PLURAL:$5|падзеі Ñž журнале|падзеÑÑž у журнале}} на $3: $4',
+'logentry-suppress-revision' => '$1 прыхавана {{GENDER:$2|зьмÑніў|зьмÑніла}} бачнаÑьць $5 {{PLURAL:$5|вÑÑ€ÑÑ–Ñ–|вÑÑ€ÑÑ–ÑÑž}} Ñтаронкі $3: $4',
+'logentry-suppress-event-legacy' => '$1 прыхавана {{GENDER:$2|зьмÑніў|зьмÑніла}} бачнаÑьць падзеÑÑž у журнале на $3',
+'logentry-suppress-revision-legacy' => '$1 прыхавана {{GENDER:$2|зьмÑніў|зьмÑніоа}} бачнаÑьць вÑÑ€ÑÑ–ÑÑž Ñтаронкі $3',
'revdelete-content-hid' => 'зьмеÑÑ‚ Ñхаваны',
'revdelete-summary-hid' => 'апіÑаньне Ñ€ÑÐ´Ð°Ð³Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ñхаванае',
'revdelete-uname-hid' => 'Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° Ñхаванае',
@@ -3876,17 +3927,21 @@ MediaWiki раÑпаўÑюджваецца з надзеÑй, што будзе
'revdelete-uname-unhid' => 'Ñ–Ð¼Ñ ÑžÐ´Ð·ÐµÐ»ÑŒÐ½Ñ–ÐºÐ° адкрытае',
'revdelete-restricted' => 'ужыць абмежаваньні Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратараў',
'revdelete-unrestricted' => 'зьнÑÑ‚Ñ‹Ñ Ð°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½ÑŒÐ½Ñ– Ð´Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратараў',
-'logentry-move-move' => '$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-patrol-patrol' => '$1 пазначыў вÑÑ€ÑÑ–ÑŽ $4 Ñтаронкі $3 Ñк правераную',
-'logentry-patrol-patrol-auto' => '$1 аўтаматычна пазначыў вÑÑ€ÑÑ–ÑŽ $4 Ñтаронкі $3 Ñк правераную',
-'logentry-newusers-newusers' => 'Быў Ñтвораны рахунак $1',
-'logentry-newusers-create' => 'Быў Ñтвораны рахунак $1',
-'logentry-newusers-create2' => '$1 Ñтварыў рахунак $3',
-'logentry-newusers-autocreate' => 'Рахунак $1 быў Ñтвораны аўтаматычна',
-'newuserlog-byemail' => 'Пароль адаÑланы па Ñлектроннай пошце',
+'logentry-move-move' => '$1 {{GENDER:$2|перанёÑ|перанеÑла}} Ñтаронку $3 у $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|перанёÑ|перанеÑла}} Ñтаронку $3 у $4 без пакінутага перанакіраваньнÑ',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|перанёÑ|перанеÑла}} Ñтаронку $3 у $4 паўзьверх перанакіраваньнÑ',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|перанёÑ|перанеÑла}} Ñтаронку $3 у $4 паўзьверх Ð¿ÐµÑ€Ð°Ð½Ð°ÐºÑ–Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð±ÐµÐ· пакінутага перанакіраваньнÑ',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|пазначыў|пазначыла}} вÑÑ€ÑÑ–ÑŽ $4 Ñтаронкі $3 Ñк правераную',
+'logentry-patrol-patrol-auto' => '$1 аўтаматычна {{GENDER:$2|пазначыў|пазначыла}} вÑÑ€ÑÑ–ÑŽ $4 Ñтаронкі $3 Ñк правераную',
+'logentry-newusers-newusers' => 'Быў {{GENDER:$2|Ñтвораны}} рахунак $1',
+'logentry-newusers-create' => 'Быў {{GENDER:$2|Ñтвораны}} рахунак $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|Ñтварыў|Ñтварыла}} рахунак $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|Ñтварыў|Ñтварыла}} рахунак $3, пароль быў даÑланы Ñлектроннай поштай',
+'logentry-newusers-autocreate' => 'Рахунак $1 быў {{GENDER:$2|Ñтвораны}} аўтаматычна',
+'logentry-rights-rights' => '$1 {{GENDER:$1|зьмÑніў|зьмÑніла}} прыналежнаÑьць $3 да групы з $4 на $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|зьмÑніў|зьмÑніла}} прыналежнаÑьць $3 да групаў',
+'logentry-rights-autopromote' => '$1 {{GENDER:$1|быў аўтаматычна пераведзены|была аўтаматычна пераведзенаÑ}} з групы $4 Ñž $5',
+'rightsnone' => '(нÑма)',
# Feedback
'feedback-bugornote' => 'Калі Ð’Ñ‹ гатовы падрабÑзна апіÑаць Ñ‚Ñхнічную праблему, калі лаÑка [$1 паведаміце пра памылку].
@@ -3940,6 +3995,7 @@ MediaWiki раÑпаўÑюджваецца з надзеÑй, што будзе
'api-error-ok-but-empty' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: нÑма адказу ад ÑÑрвÑра.',
'api-error-overwrite' => 'Замена Ñ–Ñнуючага файла забароненаÑ.',
'api-error-stashfailed' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: ÑÑрвÑÑ€ Ð½Ñ Ð·Ð¼Ð¾Ð³ захаваць чаÑовы файл.',
+'api-error-publishfailed' => 'Ð£Ð½ÑƒÑ‚Ñ€Ð°Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: ÑÑрвÑÑ€ Ð½Ñ Ð·Ð¼Ð¾Ð³ захаваць чаÑловы файл.',
'api-error-timeout' => 'СÑрвÑÑ€ не адказаў у чаканы Ñ‚Ñрмін.',
'api-error-unclassified' => 'Узьнікла невÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°',
'api-error-unknown-code' => 'ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°: «$1».',
@@ -3960,4 +4016,7 @@ MediaWiki раÑпаўÑюджваецца з надзеÑй, што будзе
'duration-centuries' => '$1 {{PLURAL:$1|Ñтагодзьдзе|Ñтагодзьдзі|ÑтагодзьдзÑÑž}}',
'duration-millennia' => '$1 {{PLURAL:$1|Ñ‚Ñ‹ÑÑчагодзьдзе|Ñ‚Ñ‹ÑÑчагодзьдзі|Ñ‚Ñ‹ÑÑчагодзьдзÑÑž}}',
+# Image rotation
+'rotate-comment' => 'Ð’Ñ‹Ñва Ð¿Ð°Ð²ÐµÑ€Ð½ÑƒÑ‚Ð°Ñ Ð½Ð° $1{{PLURAL:$1|°}} па гадзіньнікавай ÑÑ‚Ñ€Ñлцы',
+
);
diff --git a/languages/messages/MessagesBe_x_old.php b/languages/messages/MessagesBe_x_old.php
deleted file mode 100644
index 26895def..00000000
--- a/languages/messages/MessagesBe_x_old.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-/** Belarusian in TaraÅ¡kievica orthography (БеларуÑÐºÐ°Ñ Ñ‚Ð°Ñ€Ð°ÑˆÐºÐµÐ²Ñ–Ñ†Ð°)
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
- *
- * @ingroup Language
- * @file
- * @comment dummy language file. Falls back to 'be-tarask'. Backward compat.
- */
-
-$fallback = 'be-tarask';
diff --git a/languages/messages/MessagesBg.php b/languages/messages/MessagesBg.php
index 392aef41..87c01092 100644
--- a/languages/messages/MessagesBg.php
+++ b/languages/messages/MessagesBg.php
@@ -48,98 +48,6 @@ $namespaceAliases = array(
'Картинка беÑеда' => NS_FILE_TALK,
);
-
-$datePreferences = false;
-
-$bookstoreList = array(
- 'books.bg' => 'http://www.books.bg/ISBN/$1',
- 'Пингвините' => 'http://www.pe-bg.com/?cid=3&search_q=$1&where=ISBN&x=0&y=0**',
- 'Бард' => 'http://www.bard.bg/search/?q=$1'
-);
-
-$magicWords = array(
- 'redirect' => array( '0', '#пренаÑочване', '#виж', '#REDIRECT' ),
- 'notoc' => array( '0', '__БЕЗСЪДЪРЖÐÐИЕ__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__БЕЗГÐЛЕРИЯ__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__СЪССЪДЪРЖÐÐИЕ__', '__FORCETOC__' ),
- 'toc' => array( '0', '__СЪДЪРЖÐÐИЕ__', '__TOC__' ),
- 'noeditsection' => array( '0', '__БЕЗ_РЕДÐКТИРÐÐЕ_ÐÐ_РÐЗДЕЛИ__', '__NOEDITSECTION__' ),
- 'currentmonth' => array( '1', 'ТЕКУЩМЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
- 'currentmonth1' => array( '1', 'ТЕКУЩМЕСЕЦ1', 'CURRENTMONTH1' ),
- 'currentmonthname' => array( '1', 'ТЕКУЩМЕСЕЦИМЕ', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'ТЕКУЩМЕСЕЦИМЕРОД', 'CURRENTMONTHNAMEGEN' ),
- 'currentmonthabbrev' => array( '1', 'ТЕКУЩМЕСЕЦСЪКР', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'ТЕКУЩДЕÐ', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'ТЕКУЩДЕÐ2', 'CURRENTDAY2' ),
- 'currentdayname' => array( '1', 'ТЕКУЩДЕÐИМЕ', 'CURRENTDAYNAME' ),
- 'currentyear' => array( '1', 'ТЕКУЩÐГОДИÐÐ', 'CURRENTYEAR' ),
- 'currenttime' => array( '1', 'ТЕКУЩОВРЕМЕ', 'CURRENTTIME' ),
- 'currenthour' => array( '1', 'ТЕКУЩЧÐС', 'CURRENTHOUR' ),
- 'numberofpages' => array( '1', 'БРОЙСТРÐÐИЦИ', 'NUMBEROFPAGES' ),
- 'numberofarticles' => array( '1', 'БРОЙСТÐТИИ', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'БРОЙФÐЙЛОВЕ', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'БРОЙПОТРЕБИТЕЛИ', 'NUMBEROFUSERS' ),
- 'numberofactiveusers' => array( '1', 'БРОЙÐКТИВÐИПОТРЕБИТЕЛИ', 'NUMBEROFACTIVEUSERS' ),
- 'numberofedits' => array( '1', 'БРОЙРЕДÐКЦИИ', 'NUMBEROFEDITS' ),
- 'numberofviews' => array( '1', 'БРОЙПРЕГЛЕДИ', 'NUMBEROFVIEWS' ),
- 'pagename' => array( '1', 'СТРÐÐИЦÐ', 'PAGENAME' ),
- 'pagenamee' => array( '1', 'СТРÐÐИЦÐИ', 'PAGENAMEE' ),
- 'namespace' => array( '1', 'ИМЕÐÐОПРОСТРÐÐСТВО', 'NAMESPACE' ),
- 'namespacee' => array( '1', 'ИМЕÐÐОПРОСТРÐÐСТВОИ', 'NAMESPACEE' ),
- 'fullpagename' => array( '1', 'ПЪЛÐОИМЕ_СТРÐÐИЦÐ', 'FULLPAGENAME' ),
- 'fullpagenamee' => array( '1', 'ПЪЛÐОИМЕ_СТРÐÐИЦÐИ', 'FULLPAGENAMEE' ),
- 'subpagename' => array( '1', 'ИМЕ_ПОДСТРÐÐИЦÐ', 'SUBPAGENAME' ),
- 'subpagenamee' => array( '1', 'ИМЕ_ПОДСТРÐÐИЦÐИ', 'SUBPAGENAMEE' ),
- 'talkpagename' => array( '1', 'ИМЕ_БЕСЕДÐ', 'TALKPAGENAME' ),
- 'talkpagenamee' => array( '1', 'ИМЕ_БЕСЕДÐИ', 'TALKPAGENAMEE' ),
- 'msg' => array( '0', 'СЪОБЩ:', 'MSG:' ),
- 'subst' => array( '0', 'ЗÐМЕСТ:', 'SUBST:' ),
- 'msgnw' => array( '0', 'СЪОБЩБУ:', 'MSGNW:' ),
- 'img_thumbnail' => array( '1', 'мини', 'thumbnail', 'thumb' ),
- 'img_manualthumb' => array( '1', 'мини=$1', 'thumbnail=$1', 'thumb=$1' ),
- 'img_right' => array( '1', 'вдÑÑно', 'дÑÑно', 'д', 'right' ),
- 'img_left' => array( '1', 'влÑво', 'лÑво', 'л', 'left' ),
- 'img_none' => array( '1', 'н', 'none' ),
- 'img_width' => array( '1', '$1пкÑ', '$1п', '$1px' ),
- 'img_center' => array( '1', 'център', 'центр', 'ц', 'center', 'centre' ),
- 'img_framed' => array( '1', 'рамка', 'врамка', 'framed', 'enframed', 'frame' ),
- 'img_frameless' => array( '1', 'безрамка', 'frameless' ),
- 'img_border' => array( '1', 'ръб', 'контур', 'border' ),
- 'int' => array( '0', 'ВЪТР:', 'INT:' ),
- 'sitename' => array( '1', 'ИМЕÐÐСÐЙТÐ', 'SITENAME' ),
- 'ns' => array( '0', 'ИП:', 'NS:' ),
- 'localurl' => array( '0', 'ЛОКÐЛЕÐÐДРЕС:', 'LOCALURL:' ),
- 'localurle' => array( '0', 'ЛОКÐЛЕÐÐДРЕСИ:', 'LOCALURLE:' ),
- 'server' => array( '0', 'СЪРВЪР', 'SERVER' ),
- 'servername' => array( '0', 'ИМЕÐÐСЪРВЪРÐ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ПЪТДОСКРИПТÐ', 'SCRIPTPATH' ),
- 'grammar' => array( '0', 'ГРÐÐœÐТИКÐ:', 'GRAMMAR:' ),
- 'gender' => array( '0', 'ПОЛ:', 'GENDER:' ),
- 'currentweek' => array( '1', 'ТЕКУЩÐСЕДМИЦÐ', 'CURRENTWEEK' ),
- 'currentdow' => array( '1', 'ТЕКУЩ_ДЕÐ_ОТ_СЕДМИЦÐТÐ', 'CURRENTDOW' ),
- 'revisionid' => array( '1', 'ИД_ÐÐ_ВЕРСИЯТÐ', 'REVISIONID' ),
- 'revisionday' => array( '1', 'ДЕÐ_ÐÐ_ВЕРСИЯТÐ', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'ДЕÐ_ÐÐ_ВЕРСИЯТÐ2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'МЕСЕЦ_ÐÐ_ВЕРСИЯТÐ', 'REVISIONMONTH' ),
- 'revisionyear' => array( '1', 'ГОДИÐÐ_ÐÐ_ВЕРСИЯТÐ', 'REVISIONYEAR' ),
- 'plural' => array( '0', 'ÐœÐ_ЧИСЛО:', 'PLURAL:' ),
- 'fullurl' => array( '0', 'ПЪЛЕÐ_ÐДРЕС:', 'FULLURL:' ),
- 'fullurle' => array( '0', 'ПЪЛЕÐ_ÐДРЕСИ:', 'FULLURLE:' ),
- 'lcfirst' => array( '0', 'МБПЪРВÐ:', 'LCFIRST:' ),
- 'ucfirst' => array( '0', 'ГБПЪРВÐ:', 'UCFIRST:' ),
- 'lc' => array( '0', 'МБ:', 'LC:' ),
- 'uc' => array( '0', 'ГБ:', 'UC:' ),
- 'raw' => array( '0', 'ÐЕОБРÐБ:', 'RAW:' ),
- 'displaytitle' => array( '1', 'ПОКÐЗВ_ЗÐГЛÐВИЕ', 'DISPLAYTITLE' ),
- 'newsectionlink' => array( '1', '__ВРЪЗКÐ_ЗÐ_ÐОВ_РÐЗДЕЛ__', '__NEWSECTIONLINK__' ),
- 'language' => array( '0', '#ЕЗИК:', '#LANGUAGE:' ),
- 'numberofadmins' => array( '1', 'БРОЙÐДМИÐИСТРÐТОРИ', 'NUMBEROFADMINS' ),
- 'defaultsort' => array( '1', 'СОРТКÐТ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'hiddencat' => array( '1', '__СКРИТÐКÐТЕГОРИЯ__', '__HIDDENCAT__' ),
- 'index' => array( '1', '__ИÐДЕКСИРÐÐЕ__', '__INDEX__' ),
- 'noindex' => array( '1', '__БЕЗИÐДЕКСИРÐÐЕ__', '__NOINDEX__' ),
-);
-
$specialPageAliases = array(
'Activeusers' => array( 'Ðктивни_потребители' ),
'Allmessages' => array( 'СиÑтемни_ÑъобщениÑ' ),
@@ -232,6 +140,97 @@ $specialPageAliases = array(
'Withoutinterwiki' => array( 'Без_междууикита' ),
);
+$magicWords = array(
+ 'redirect' => array( '0', '#пренаÑочване', '#виж', '#REDIRECT' ),
+ 'notoc' => array( '0', '__БЕЗСЪДЪРЖÐÐИЕ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__БЕЗГÐЛЕРИЯ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__СЪССЪДЪРЖÐÐИЕ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__СЪДЪРЖÐÐИЕ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__БЕЗ_РЕДÐКТИРÐÐЕ_ÐÐ_РÐЗДЕЛИ__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'ТЕКУЩМЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ТЕКУЩМЕСЕЦ1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ТЕКУЩМЕСЕЦИМЕ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ТЕКУЩМЕСЕЦИМЕРОД', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ТЕКУЩМЕСЕЦСЪКР', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'ТЕКУЩДЕÐ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ТЕКУЩДЕÐ2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ТЕКУЩДЕÐИМЕ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ТЕКУЩÐГОДИÐÐ', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ТЕКУЩОВРЕМЕ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ТЕКУЩЧÐС', 'CURRENTHOUR' ),
+ 'numberofpages' => array( '1', 'БРОЙСТРÐÐИЦИ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'БРОЙСТÐТИИ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'БРОЙФÐЙЛОВЕ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'БРОЙПОТРЕБИТЕЛИ', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'БРОЙÐКТИВÐИПОТРЕБИТЕЛИ', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'БРОЙРЕДÐКЦИИ', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'БРОЙПРЕГЛЕДИ', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'СТРÐÐИЦÐ', 'PAGENAME' ),
+ 'pagenamee' => array( '1', 'СТРÐÐИЦÐИ', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'ИМЕÐÐОПРОСТРÐÐСТВО', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ИМЕÐÐОПРОСТРÐÐСТВОИ', 'NAMESPACEE' ),
+ 'fullpagename' => array( '1', 'ПЪЛÐОИМЕ_СТРÐÐИЦÐ', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', 'ПЪЛÐОИМЕ_СТРÐÐИЦÐИ', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'ИМЕ_ПОДСТРÐÐИЦÐ', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'ИМЕ_ПОДСТРÐÐИЦÐИ', 'SUBPAGENAMEE' ),
+ 'talkpagename' => array( '1', 'ИМЕ_БЕСЕДÐ', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', 'ИМЕ_БЕСЕДÐИ', 'TALKPAGENAMEE' ),
+ 'msg' => array( '0', 'СЪОБЩ:', 'MSG:' ),
+ 'subst' => array( '0', 'ЗÐМЕСТ:', 'SUBST:' ),
+ 'msgnw' => array( '0', 'СЪОБЩБУ:', 'MSGNW:' ),
+ 'img_thumbnail' => array( '1', 'мини', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'мини=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'вдÑÑно', 'дÑÑно', 'д', 'right' ),
+ 'img_left' => array( '1', 'влÑво', 'лÑво', 'л', 'left' ),
+ 'img_none' => array( '1', 'н', 'none' ),
+ 'img_width' => array( '1', '$1пкÑ', '$1п', '$1px' ),
+ 'img_center' => array( '1', 'център', 'центр', 'ц', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'рамка', 'врамка', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'безрамка', 'frameless' ),
+ 'img_border' => array( '1', 'ръб', 'контур', 'border' ),
+ 'int' => array( '0', 'ВЪТР:', 'INT:' ),
+ 'sitename' => array( '1', 'ИМЕÐÐСÐЙТÐ', 'SITENAME' ),
+ 'ns' => array( '0', 'ИП:', 'NS:' ),
+ 'localurl' => array( '0', 'ЛОКÐЛЕÐÐДРЕС:', 'LOCALURL:' ),
+ 'localurle' => array( '0', 'ЛОКÐЛЕÐÐДРЕСИ:', 'LOCALURLE:' ),
+ 'server' => array( '0', 'СЪРВЪР', 'SERVER' ),
+ 'servername' => array( '0', 'ИМЕÐÐСЪРВЪРÐ', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', 'ПЪТДОСКРИПТÐ', 'SCRIPTPATH' ),
+ 'grammar' => array( '0', 'ГРÐÐœÐТИКÐ:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'ПОЛ:', 'GENDER:' ),
+ 'currentweek' => array( '1', 'ТЕКУЩÐСЕДМИЦÐ', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ТЕКУЩ_ДЕÐ_ОТ_СЕДМИЦÐТÐ', 'CURRENTDOW' ),
+ 'revisionid' => array( '1', 'ИД_ÐÐ_ВЕРСИЯТÐ', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'ДЕÐ_ÐÐ_ВЕРСИЯТÐ', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'ДЕÐ_ÐÐ_ВЕРСИЯТÐ2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'МЕСЕЦ_ÐÐ_ВЕРСИЯТÐ', 'REVISIONMONTH' ),
+ 'revisionyear' => array( '1', 'ГОДИÐÐ_ÐÐ_ВЕРСИЯТÐ', 'REVISIONYEAR' ),
+ 'plural' => array( '0', 'ÐœÐ_ЧИСЛО:', 'PLURAL:' ),
+ 'fullurl' => array( '0', 'ПЪЛЕÐ_ÐДРЕС:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'ПЪЛЕÐ_ÐДРЕСИ:', 'FULLURLE:' ),
+ 'lcfirst' => array( '0', 'МБПЪРВÐ:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', 'ГБПЪРВÐ:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'МБ:', 'LC:' ),
+ 'uc' => array( '0', 'ГБ:', 'UC:' ),
+ 'raw' => array( '0', 'ÐЕОБРÐБ:', 'RAW:' ),
+ 'displaytitle' => array( '1', 'ПОКÐЗВ_ЗÐГЛÐВИЕ', 'DISPLAYTITLE' ),
+ 'newsectionlink' => array( '1', '__ВРЪЗКÐ_ЗÐ_ÐОВ_РÐЗДЕЛ__', '__NEWSECTIONLINK__' ),
+ 'language' => array( '0', '#ЕЗИК:', '#LANGUAGE:' ),
+ 'numberofadmins' => array( '1', 'БРОЙÐДМИÐИСТРÐТОРИ', 'NUMBEROFADMINS' ),
+ 'defaultsort' => array( '1', 'СОРТКÐТ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'hiddencat' => array( '1', '__СКРИТÐКÐТЕГОРИЯ__', '__HIDDENCAT__' ),
+ 'index' => array( '1', '__ИÐДЕКСИРÐÐЕ__', '__INDEX__' ),
+ 'noindex' => array( '1', '__БЕЗИÐДЕКСИРÐÐЕ__', '__NOINDEX__' ),
+);
+
+$datePreferences = false;
+
+$bookstoreList = array(
+ 'books.bg' => 'http://www.books.bg/ISBN/$1',
+ 'Пингвините' => 'http://www.pe-bg.com/?cid=3&search_q=$1&where=ISBN&x=0&y=0**',
+ 'Бард' => 'http://www.bard.bg/search/?q=$1'
+);
+
$linkTrail = '/^([a-zабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ]+)(.*)$/sDu';
$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
@@ -383,7 +382,6 @@ $messages = array(
'qbbrowse' => 'Избор',
'qbedit' => 'Редактиране',
'qbpageoptions' => 'Тази Ñтраница',
-'qbpageinfo' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ñтраницата',
'qbmyoptions' => 'Моите Ñтраници',
'qbspecialpages' => 'Специални Ñтраници',
'faq' => 'ЧЗВ',
@@ -406,6 +404,7 @@ $messages = array(
'namespaces' => 'Именни проÑтранÑтва',
'variants' => 'Варианти',
+'navigation-heading' => 'ÐавигациÑ',
'errorpagetitle' => 'Грешка',
'returnto' => 'Обратно към $1.',
'tagline' => 'от {{SITENAME}}',
@@ -639,11 +638,10 @@ $2',
# Login and logout pages
'logouttext' => "'''ИзлÑзохте от ÑиÑтемата.'''
-Можете да продължите да използвате {{SITENAME}} анонимно или да [[Special:UserLogin|влезете отново]] като друг потребител.
+Можете да продължите да използвате {{SITENAME}} анонимно или да <span class='plainlinks'>[$1 влезете отново]</span> като друг потребител.
Обърнете внимание, че нÑкои Ñтраници вÑе още ще Ñе показват така, ÑÑкаш Ñте влезли, докато не изтриете кеш-паметта на браузъра.",
-'welcomecreation' => '== Добре дошли, $1! ==
-
-Вашата Ñметка беше Ñъздадена.
+'welcomeuser' => 'Здравейте, $1!',
+'welcomecreation-msg' => 'Вашата Ñметка беше Ñъздадена.
Можете да промените [[Special:Preferences|наÑтройките на {{SITENAME}}]] Ñпоред предпочитаниÑта Ñи.',
'yourname' => 'ПотребителÑко име:',
'yourpassword' => 'Парола:',
@@ -669,7 +667,7 @@ $2',
'gotaccount' => "Имате ли вече Ñметка? '''$1'''.",
'gotaccountlink' => 'Влизане',
'userlogin-resetlink' => 'Забравени данни за влизане в ÑиÑтемата?',
-'createaccountmail' => 'Ñ Ð¿Ð¸Ñмо по електронната поща',
+'createaccountmail' => 'Използване на временна парола, коÑто Ñе изпраща по електронната поща, поÑочена по-долу',
'createaccountreason' => 'Причина:',
'badretype' => 'Въведените пароли не Ñъвпадат.',
'userexists' => 'Въведеното потребителÑко име вече Ñе използва.
@@ -797,6 +795,7 @@ $2
'changeemail-oldemail' => 'Текущ Ð°Ð´Ñ€ÐµÑ Ð·Ð° е-поща:',
'changeemail-newemail' => 'Ðов Ð°Ð´Ñ€ÐµÑ Ð·Ð° е-поща:',
'changeemail-none' => '(нÑма)',
+'changeemail-password' => 'Парола за {{SITENAME}}:',
'changeemail-submit' => 'ПромÑна на е-пощата',
'changeemail-cancel' => 'Отказване',
@@ -972,7 +971,6 @@ $2
'template-semiprotected' => '(полузащитен)',
'hiddencategories' => 'Тази Ñтраница е включена в {{PLURAL:$1|Една Ñкрита категориÑ|$1 Ñкрити категории}}:',
'edittools' => '<!-- Евентуален текÑÑ‚ тук ще бъде показван под формулÑрите за редактиране и качване. -->',
-'nocreatetitle' => 'Създаването на Ñтраници е ограничено',
'nocreatetext' => 'Създаването на нови Ñтраници в {{SITENAME}} е ограничено. Можете да Ñе върнете назад и да редактирате нÑÐºÐ¾Ñ Ð¾Ñ‚ ÑъщеÑтвуващите Ñтраници, [[Special:UserLogin|да Ñе региÑтрирате или да Ñъздадете нова потребителÑка Ñметка]].',
'nocreate-loggedin' => 'ÐÑмате необходимите права да Ñъздавате нови Ñтраници.',
'sectioneditnotsupported-title' => 'Ðе Ñе поддържа редактиране на раздели',
@@ -995,6 +993,16 @@ $2
'edit-already-exists' => 'Ðе можа да Ñе Ñъздаде нова Ñтраница.
Такава вече ÑъщеÑтвува.',
'defaultmessagetext' => 'ТекÑÑ‚ на Ñъобщението по подразбиране',
+'content-failed-to-parse' => 'ÐеуÑпех при анализиране на Ñъдържанието от тип $2 за модела $1: $3',
+'invalid-content-data' => 'Ðевалидни данни за Ñъдържание',
+'content-not-allowed-here' => '
+Ðа Ñтраницата [[$2]] не е позволено използването на $1',
+
+# Content models
+'content-model-wikitext' => 'уикитекÑÑ‚',
+'content-model-text' => 'обикновен текÑÑ‚',
+'content-model-javascript' => 'ДжаваÑкрипт',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Внимание: Тази Ñтраница прекалено много пъти използва реÑурÑоемки парÑерни функции.
@@ -1351,9 +1359,9 @@ $1",
'prefs-emailconfirm-label' => 'Потвърждаване на Ð°Ð´Ñ€ÐµÑ Ð·Ð° е-поща:',
'prefs-textboxsize' => 'Размер на кутиÑта за редактиране',
'youremail' => 'Е-поща:',
-'username' => 'ПотребителÑко име:',
-'uid' => 'ПотребителÑки номер:',
-'prefs-memberingroups' => 'Член на {{PLURAL:$1|група|групи}}:',
+'username' => '{{GENDER:$1|ПотребителÑко име}}:',
+'uid' => '{{GENDER:$1|ПотребителÑки}} номер:',
+'prefs-memberingroups' => '{{GENDER:$2|Член}} на {{PLURAL:$1|група|групи}}:',
'prefs-registration' => 'РегиÑтрациÑ:',
'yourrealname' => 'ИÑтинÑко име:',
'yourlanguage' => 'Език:',
@@ -1500,12 +1508,13 @@ $1",
'right-sendemail' => 'Изпращане на е-пиÑма до другите потребители',
'right-passwordreset' => 'Преглеждане на е-пиÑма за възÑтановÑване на парола',
+# Special:Log/newusers
+'newuserlogpage' => 'Дневник на региÑтрациите',
+'newuserlogpagetext' => 'Ð’ този дневник Ñе запиÑват региÑтрациите на потребители.',
+
# User rights log
'rightslog' => 'Дневник на потребителÑките права',
'rightslogtext' => 'Това е дневник на промените на потребителÑки права.',
-'rightslogentry' => 'промени потребителÑката група на $1 от $2 в $3',
-'rightslogentry-autopromote' => 'автоматично е повишен от $2 до$3',
-'rightsnone' => '(никакви)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'четене на Ñтраницата',
@@ -2061,7 +2070,9 @@ $1',
'linksearch-pat' => 'ТърÑене по:',
'linksearch-ns' => 'Именно проÑтранÑтво:',
'linksearch-ok' => 'ТърÑене',
-'linksearch-text' => 'Възможна е употребата на замеÑтващи знаци като: „*.wikipedia.org“.<br />Поддържани протоколи: <code>$1</code>',
+'linksearch-text' => 'Възможна е употребата на замеÑтващи знаци като: „*.wikipedia.org“.
+Ðеобходим е поне домейн от най-виÑоко ниво, например „*.org“.<br />
+{{PLURAL:$2|Поддържан протокол|Поддържани протоколи}}: <code>$1</code> (ако не е поÑочено, по подразбиране Ñе използва http:// ).',
'linksearch-line' => '$1 Ñ Ð¿Ñ€ÐµÐ¿Ñ€Ð°Ñ‚ÐºÐ° от $2',
'linksearch-error' => 'ЗамеÑтващите знаци могат да ÑтоÑÑ‚ Ñамо в началото на името на хоÑта.',
@@ -2080,10 +2091,6 @@ $1',
'activeusers-hidesysops' => 'Скриване на админиÑтраторите',
'activeusers-noresult' => 'ÐÑма намерени потребители.',
-# Special:Log/newusers
-'newuserlogpage' => 'Дневник на региÑтрациите',
-'newuserlogpagetext' => 'Ð’ този дневник Ñе запиÑват региÑтрациите на потребители.',
-
# Special:ListGroupRights
'listgrouprights' => 'Права по потребителÑки групи',
'listgrouprights-summary' => 'По-долу на тази Ñтраница е показан ÑпиÑък на групите потребители в това уики Ñ Ð°Ñоциираните им права за доÑтъп. Допълнителна Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° отделните права може да бъде намерена [[{{MediaWiki:Listgrouprights-helppage}}|тук]].',
@@ -2175,19 +2182,20 @@ $1',
'enotif_mailer' => 'ИзвеÑÑ‚Ñване по пощата на {{SITENAME}}',
'enotif_reset' => 'ОтбелÑзване на вÑички Ñтраници като поÑетени',
-'enotif_newpagetext' => 'Това е нова Ñтраница.',
'enotif_impersonal_salutation' => 'Потребител на {{SITENAME}}',
-'changed' => 'променена',
-'created' => 'Ñъздадена',
-'enotif_subject' => 'Страницата $PAGETITLE в {{SITENAME}} е била $CHANGEDORCREATED от $PAGEEDITOR',
+'enotif_subject_deleted' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|изтрита}} от $2',
+'enotif_subject_created' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|Ñъздадена}} от $2',
+'enotif_subject_moved' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|премеÑтена}} от $2',
+'enotif_subject_restored' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|възÑтановена}} от $2',
+'enotif_subject_changed' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|променена}} от $2',
+'enotif_body_intro_deleted' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|изтрита}} на $PAGEEDITDATE от $2. Вижте $3.',
+'enotif_body_intro_created' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|Ñъздадена}} на $PAGEEDITDATE от $2. За текущата верÑиÑ, вижте $3',
'enotif_lastvisited' => 'Преглед на вÑички промени Ñлед поÑледното ви поÑещение: $1.',
'enotif_lastdiff' => 'Преглед на тази промÑна: $1.',
'enotif_anon_editor' => 'анонимен потребител $1',
'enotif_body' => 'Уважаеми(а) $WATCHINGUSERNAME,
-Страницата $PAGETITLE в {{SITENAME}} е била $CHANGEDORCREATED на $PAGEEDITDATE от $PAGEEDITOR. За текущата верÑÐ¸Ñ Ð½Ð° Ñтраницата, вижте $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Резюме на редакциÑта: $PAGESUMMARY $PAGEMINOREDIT
@@ -2198,20 +2206,22 @@ $NEWPAGE
ÐÑма да получавате други извеÑÑ‚Ð¸Ñ Ð·Ð° поÑледващи промени, докато не поÑетите Ñтраницата.
Можете да актуализиране наÑтройките Ñи за този вид извеÑÑ‚Ð¸Ñ Ð·Ð° вÑички Ñтраници от Ð²Ð°ÑˆÐ¸Ñ ÑпиÑък за наблюдение.
- СиÑтемата за извеÑÑ‚Ñване на {{SITENAME}}
+СиÑтемата за извеÑÑ‚Ñване на {{SITENAME}}
--
-За да промените наÑтройките Ñи за извеÑÑ‚ÑÐ²Ð°Ð½Ð¸Ñ Ñ‡Ñ€ÐµÐ· електронна поща, поÑетете
+ПромÑна на наÑтройките за извеÑÑ‚ÑÐ²Ð°Ð½Ð¸Ñ Ñ‡Ñ€ÐµÐ· електронна поща може да Ñе извърши на
{{canonicalurl:{{#special:Preferences}}}}
-За да промените наÑтройките на ÑпиÑъка Ñи за наблюдение, поÑетете
+ПромÑна на наÑтройките на ÑпиÑъка за наблюдение Ñе извършва на
{{canonicalurl:{{#special:EditWatchlist}}}}
-За да изтриете Ñтраницата от ÑпиÑъка Ñи за наблюдение, поÑетете
+Изтриването на тази Ñтраницата от ÑпиÑъка за наблюдение Ñтава чрез
$UNWATCHURL
За обратна връзка и помощ:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'Ñъздадена',
+'changed' => 'променена',
# Delete
'deletepage' => 'Изтриване',
@@ -2276,6 +2286,7 @@ $UNWATCHURL
'prot_1movedto2' => '„[[$1]]“ премеÑтена като „[[$2]]“',
'protect-badnamespace-title' => 'Ðезащитимо именно проÑтранÑтво',
'protect-badnamespace-text' => 'Страниците в това именно проÑтранÑтво не могат да бъдат защитени.',
+'protect-norestrictiontypes-title' => 'Ðезащитима Ñтраница',
'protect-legend' => 'Потвърждение на защитата',
'protectcomment' => 'Причина:',
'protectexpiry' => 'Изтича на:',
@@ -2352,7 +2363,8 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|Една верÑÐ¸Ñ Ð±ÐµÑˆÐµ възÑтановена|$1 верÑии бÑха възÑтановени}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Една верÑиÑ|$1 верÑии}} и {{PLURAL:$1|един файл|$2 файла}} бÑха възÑтановени',
'undeletedfiles' => '{{PLURAL:$1|Един файл беше възÑтановен|$1 файла бÑха възÑтановени}}',
-'cannotundelete' => 'Грешка при възÑтановÑването. Възможно е нÑкой друг вече да е възÑтановил Ñтраницата.',
+'cannotundelete' => 'ВъзÑтановÑването беше неуÑпешно:
+$1',
'undeletedpage' => "'''Страницата „$1“ беше възÑтановена.'''
Можете да видите поÑледните изтрити и възÑтановени Ñтраници в [[Special:Log/delete|дневника на изтриваниÑта]].",
@@ -2383,7 +2395,7 @@ $1',
'blanknamespace' => '(ОÑновно)',
# Contributions
-'contributions' => 'ПриноÑи',
+'contributions' => '{{GENDER:$1|ПотребителÑки}} приноÑи',
'contributions-title' => 'ПотребителÑки приноÑи за $1',
'mycontris' => 'ПриноÑи',
'contribsub2' => 'За $1 ($2)',
@@ -2770,7 +2782,6 @@ $1',
'import-logentry-interwiki-detail' => '{{PLURAL:$1|една верÑиÑ|$1 верÑии}} на $2 бÑха внеÑени',
# JavaScriptTest
-'javascripttest-disabled' => 'Тази функционалноÑÑ‚ не е активирана в това уики.',
'javascripttest-pagetext-noframework' => 'Тази Ñтраница е запазена за изпълнение на ДжаваÑкрипт теÑтове.',
'javascripttest-pagetext-skins' => 'Избор на облик за теÑтваниÑта:',
'javascripttest-qunit-intro' => 'Вижте [$1 теÑтовата документациÑ] на mediawiki.org.',
@@ -2885,6 +2896,7 @@ $1',
'pageinfo-article-id' => 'Ðомер на Ñтраницата',
'pageinfo-views' => 'Брой прегледи',
'pageinfo-watchers' => 'Брой наблюдаващи Ñтраницата',
+'pageinfo-few-watchers' => 'Под $1 {{PLURAL:$1|наблюдаващ|наблюдаващи}}',
'pageinfo-redirects-name' => 'ПренаÑÐ¾Ñ‡Ð²Ð°Ð½Ð¸Ñ ÐºÑŠÐ¼ тази Ñтраница',
'pageinfo-subpages-name' => 'ПодÑтраници на тази Ñтраница',
'pageinfo-firsttime' => 'Дата на Ñъздаване на Ñтраницата',
@@ -2895,6 +2907,12 @@ $1',
'pageinfo-recent-edits' => 'Скорошен брой редакции (в рамките на $1)',
'pageinfo-magic-words' => '{{PLURAL:$1|Вълшебна думичка|Вълшебни думички}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Скрита категориÑ|Скрити категории}} ($1)',
+'pageinfo-toolboxlink' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ñтраницата',
+'pageinfo-contentpage-yes' => 'Да',
+'pageinfo-protect-cascading-yes' => 'Да',
+'pageinfo-category-pages' => 'Брой Ñтраници',
+'pageinfo-category-subcats' => 'Брой подкатегории',
+'pageinfo-category-files' => 'Брой файлове',
# Skin names
'skinname-standard' => 'КлаÑика',
@@ -2916,6 +2934,7 @@ $1',
'markedaspatrollederror' => 'Ðе е възможно да Ñе отбележи като проверена',
'markedaspatrollederrortext' => 'Ðеобходимо е да Ñе поÑочи редакциÑ, коÑто да бъде отбелÑзана като проверена.',
'markedaspatrollederror-noautopatrol' => 'Ðе е разрешено да маркирате Ñвоите редакции като проверени.',
+'markedaspatrollednotify' => 'Тази промÑна на $1 беше отбелÑзана като патрулирана.',
# Patrol log
'patrol-log-page' => 'Дневник на патрула',
@@ -2948,6 +2967,7 @@ $1',
'file-nohires' => 'Ðе е налична верÑÐ¸Ñ Ñ Ð¿Ð¾-виÑока разделителна ÑпоÑобноÑÑ‚.',
'svg-long-desc' => 'Файл във формат SVG, оÑновен размер: $1 × $2 пикÑела, големина на файла: $3',
'svg-long-desc-animated' => 'Ðнимиран SVG файл, оÑновен размер $1 × $2 пикÑела, големина на файла: $3',
+'svg-long-error' => 'Ðевалиден SVG файл: $1',
'show-big-image' => 'Пълна разделителна ÑпоÑобноÑÑ‚',
'show-big-image-preview' => 'Размер на този преглед: $1.',
'show-big-image-other' => '{{PLURAL:$2|Друга разделителна ÑпоÑобноÑÑ‚|Други разделителни ÑпоÑобноÑти}}: $1.',
@@ -2977,7 +2997,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 минута|$1 минути}}',
'hours' => '{{PLURAL:$1|$1 чаÑ|$1 чаÑа}}',
'days' => '{{PLURAL:$1|$1 ден|$1 дни}}',
+'months' => '{{PLURAL:$1|един меÑец|$1 меÑеца}}',
+'years' => '{{PLURAL:$1|една година|$1 години}}',
'ago' => 'преди $1',
+'just-now' => 'току що',
# Bad image list
'bad_image_list' => 'Спазва Ñе ÑледниÑÑ‚ формат:
@@ -3531,6 +3554,7 @@ $5
'version-license' => 'Лиценз',
'version-poweredby-credits' => "Това уики Ñе задвиждва от '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'други',
+'version-credits-summary' => 'Бихме иÑкали да изкажем признателноÑÑ‚ на Ñледните хора за техните приноÑи към [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki е Ñвободен Ñофтуер, можете да го разпроÑтранÑвате и/или променÑте ÑъглаÑно уÑловиÑта на GNU General Public License, както е публикуван от Free Software Foundation, верÑÐ¸Ñ 2 на лиценза или (по ваше уÑмотрение) коÑто и да е Ñледваща верÑиÑ.
MediaWiki Ñе разпроÑтранÑва Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°Ñ‚Ð°, че ще бъде полезен, но БЕЗ ÐИКÐКВИ ГÐРÐÐЦИИ, без дори коÑвена Ð³Ð°Ñ€Ð°Ð½Ñ†Ð¸Ñ Ð·Ð° ПРОДÐÐ’ÐЕМОСТ или ПРИГОДÐОСТ ЗРКОÐКРЕТÐРУПОТРЕБÐ. Вижте GNU General Public License за повече подробноÑти.
@@ -3663,8 +3687,13 @@ MediaWiki Ñе разпроÑтранÑва Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°Ñ‚Ð°, че ще бÑ
'logentry-newusers-newusers' => 'ПотребителÑката Ñметка $1 беше Ñъздадена',
'logentry-newusers-create' => 'ПотребителÑката Ñметка $1 беше Ñъздадена',
'logentry-newusers-create2' => '$1 Ñъздаде потребителÑка Ñметка $3',
+'logentry-newusers-byemail' => '$1 Ñъздаде потребителÑката Ñметка $3, паролата беше изпратена по електронна поща',
'logentry-newusers-autocreate' => 'Сметката $1 беше Ñъздадена автоматично',
-'newuserlog-byemail' => 'паролата е изпратена по е-поща',
+'logentry-rights-rights' => '$1 промени потребителÑката група на $3 от $4 на $5',
+'logentry-rights-rights-legacy' => '$1 промени потребителÑката група на $3',
+'logentry-rights-autopromote' => '
+$1 е автоматично повишен от $4 до $5',
+'rightsnone' => '(никакви)',
# Feedback
'feedback-subject' => 'Тема:',
@@ -3713,6 +3742,7 @@ MediaWiki Ñе разпроÑтранÑва Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°Ñ‚Ð°, че ще бÑ
'api-error-ok-but-empty' => 'Вътрешна грешка: ÐÑма отговор от Ñървъра.',
'api-error-overwrite' => 'Ðе е позволено презапиÑването върху ÑъщеÑтвуващ файл.',
'api-error-stashfailed' => 'Вътрешна грешка: Сървърът не уÑÐ¿Ñ Ð´Ð° Ñъхрани Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð».',
+'api-error-publishfailed' => 'Вътрешна грешка: Сървърът не уÑÐ¿Ñ Ð´Ð° Ñъхрани Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð».',
'api-error-timeout' => 'Сървърът не отговори в рамките на предвиденото време.',
'api-error-unclassified' => 'Възникна непозната грешка.',
'api-error-unknown-code' => 'Ðепозната грешка: "$1"',
diff --git a/languages/messages/MessagesBh.php b/languages/messages/MessagesBh.php
index 438bdcea..1ec602b0 100644
--- a/languages/messages/MessagesBh.php
+++ b/languages/messages/MessagesBh.php
@@ -10,3 +10,4 @@
*/
$fallback = 'bho';
+
diff --git a/languages/messages/MessagesBho.php b/languages/messages/MessagesBho.php
index 1497f2c9..4d9dbb87 100644
--- a/languages/messages/MessagesBho.php
+++ b/languages/messages/MessagesBho.php
@@ -127,7 +127,6 @@ $messages = array(
'qbbrowse' => 'बà¥à¤°à¤¾à¤‰à¤œ',
'qbedit' => 'समà¥à¤ªà¤¾à¤¦à¤¨',
'qbpageoptions' => 'ई पनà¥à¤¨à¤¾',
-'qbpageinfo' => 'पà¥à¤°à¤¸à¤‚ग',
'qbmyoptions' => 'हमार पनà¥à¤¨à¤¾',
'qbspecialpages' => 'विशेष पनà¥à¤¨à¤¾',
'faq' => 'साधारण सवाल',
@@ -596,7 +595,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के साà
'watching' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची में जाते हà¥à¤',
'unwatching' => 'धà¥à¤¯à¤¾à¤¨à¤¸à¥‚ची से हटते हà¥à¤',
-'enotif_newpagetext' => 'इ à¤à¤—ो नया पनà¥à¤¨à¤¾ ह',
'created' => 'बनावल गईल',
# Rollback
@@ -611,7 +609,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के साà
'blanknamespace' => '(मà¥à¤–à¥à¤¯)',
# Contributions
-'contributions' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ योगदान',
+'contributions' => '{{GENDER:$1|सदसà¥à¤¯}} योगदान',
'contributions-title' => ' $1 खातिर पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ योगदान',
'mycontris' => 'राउर योगदान के सूची',
'nocontribs' => 'ई मानदंड से मिलत जà¥à¤²à¤¤ कौनो बदलाव ना मिलल।',
diff --git a/languages/messages/MessagesBjn.php b/languages/messages/MessagesBjn.php
index b983678b..e141271b 100644
--- a/languages/messages/MessagesBjn.php
+++ b/languages/messages/MessagesBjn.php
@@ -114,7 +114,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Paubahan_pahanyarnya' ),
'Recentchangeslinked' => array( 'Paubahan_tarait' ),
'Revisiondelete' => array( 'Hapus_ralatan' ),
- 'RevisionMove' => array( 'Ralatan_pamindahan' ),
'Search' => array( 'Panggagaian' ),
'Shortpages' => array( 'Tungkaran_handap' ),
'Specialpages' => array( 'Tungkaran_istimiwa' ),
@@ -277,6 +276,7 @@ $messages = array(
'newwindow' => '(buka di lalungkang hanyar)',
'cancel' => 'Walangi',
'moredotdotdot' => 'Lainnya...',
+'morenotlisted' => 'Salanjutnya...',
'mypage' => 'Tungkaran ulun',
'mytalk' => 'Pamandiran ulun',
'anontalk' => 'Pamandiran hagan alamat IP ini',
@@ -288,7 +288,6 @@ $messages = array(
'qbbrowse' => 'Tangadahi',
'qbedit' => 'Babak',
'qbpageoptions' => 'Tungkaran ini',
-'qbpageinfo' => 'Naskah aluran',
'qbmyoptions' => 'Tungkaran ulun',
'qbspecialpages' => 'Tungkaran istimiwa',
'faq' => 'FAQ',
@@ -311,6 +310,7 @@ $messages = array(
'namespaces' => 'Ngarankamar',
'variants' => 'Macam',
+'navigation-heading' => 'Menu napigasi',
'errorpagetitle' => 'Kasalahan',
'returnto' => 'Bulik ka $1.',
'tagline' => 'Matan {{SITENAME}}',
@@ -550,9 +550,10 @@ Administrator nang takunci nintu manawarakan panjalasan: "$3".',
# Login and logout pages
'logouttext' => "'''Pian parhatan ni sudah kaluar log.'''
-Pian kawa manyambung hagan mangguna'akan {{SITENAME}} kada bangaran, atawa Pian kawa [[Special:UserLogin|babuat log pulang]] sawagai pamakai nang sama atawa sawagai pamakai balain.
+Pian kawa manyambung hagan mangguna'akan {{SITENAME}} kada bangaran, atawa Pian kawa <span class='plainlinks'>[$1 babuat log pulang]</span> sawagai pamakai nang sama atawa sawagai pamakai balain.
Catatan bahwasa babarapa tungkaran pinanya masih ha tarus manampaiakan Pian masih babuat log, sampai Pian mahabisakan timbuluk panjalajah web Pian.",
-'welcomecreation' => '==Salamat datang, $1!==
+'welcomeuser' => 'Salamat datang, $1 !',
+'welcomecreation-msg' => '==Salamat datang, $1!==
Akun Pian sudah diulah.
Jangan kada ingat hagan maubah [[Special:Preferences|kakatujuan {{SITENAME}}]] Pian.',
'yourname' => 'Ngaran pamakai:',
@@ -651,6 +652,7 @@ Muhun hadangi dahulu sapandang hanyar cubai pulang.',
# Email sending
'php-mail-error-unknown' => 'Kasalahan kada dipinandui dalam pungsi surat () PHP',
'user-mail-no-addy' => 'Mancuba mangirim suril kada baalamat suril.',
+'user-mail-no-body' => 'Manarai hagan mangirim suril puang atawa talalu handap.',
# Change password dialog
'resetpass' => 'Ubah katasunduk',
@@ -711,6 +713,7 @@ Katasunduk pahadangan: $2',
'changeemail-oldemail' => 'Alamat suril wayah ni:',
'changeemail-newemail' => 'Alamat suril puga:',
'changeemail-none' => '(kadada)',
+'changeemail-password' => 'Sandi {{SITENAME}} Pian:',
'changeemail-submit' => 'Ganti suril',
'changeemail-cancel' => 'Walangi',
@@ -888,7 +891,6 @@ Log masuk pauncitnya disadiakan di bawah gasan rujukan:",
'template-protected' => '(dilindungi)',
'template-semiprotected' => '(semi-dilindungi)',
'hiddencategories' => 'Tungkaran ini adalah angguta matan {{PLURAL:$1|1 tumbung tasungkup|$1 tumbung tasungkup}}:',
-'nocreatetitle' => 'Maulah tungkaran dibatasi',
'nocreatetext' => '{{SITENAME}} lagi mambatasi kakawaan maulah tungkaran hanyar.
Pian kawa babulik wan mambabak sabuah tungkaran nag ada, atawa [[Special:UserLogin|lbabuat log atawa baulah sabuah akun]]',
'nocreate-loggedin' => 'Pian kada baisi ijin hagan maulah tungkaran-tungkaran hanyar.',
@@ -913,6 +915,15 @@ Ini cungul pinanya sudah tahapus.',
'edit-already-exists' => 'Kada kawa maulah sabuting tungkaran hanyar.
Nangini sudah ada.',
'defaultmessagetext' => 'Naskah baku pasan',
+'content-failed-to-parse' => 'Gagal manjabarakan isi $2 gasan model $1: $3',
+'invalid-content-data' => 'Data isi kada sah',
+'content-not-allowed-here' => 'Isi "$1" kada diijinakan di tungkaran [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'teks wiki',
+'content-model-text' => 'teks polos',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Paringatan:''' Tungkaran ini mangandung kabanyakan pungsi parser kiauan.
@@ -1419,12 +1430,13 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
'right-sendemail' => 'Mangirim suril ka papamuruk lain',
'right-passwordreset' => 'Tiringi setelan-pulang katasunduk suril',
+# Special:Log/newusers
+'newuserlogpage' => 'Log pamakai hanyar',
+'newuserlogpagetext' => 'Ngini adalah sabuah log paulahan pamuruk.',
+
# User rights log
'rightslog' => 'Log paubahan hak masuk',
'rightslogtext' => 'Nangini sabuting log paubahan ka hak pamakai.',
-'rightslogentry' => 'Ubah galambang angguta gasan $1 matan $2 ka $3',
-'rightslogentry-autopromote' => 'sudah utumatis diangkat matan $2 ka $3',
-'rightsnone' => '(kadada)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'baca tungkaran ini',
@@ -2052,10 +2064,6 @@ Protokol nang didukung: <code>$1</code> (jangan tambahakan dalam panggagaian Pia
'activeusers-hidesysops' => 'Sungkupakan pambakal',
'activeusers-noresult' => 'Kadada papamuruk tatamu.',
-# Special:Log/newusers
-'newuserlogpage' => 'Log pamakai hanyar',
-'newuserlogpagetext' => 'Ngini adalah sabuah log paulahan pamuruk.',
-
# Special:ListGroupRights
'listgrouprights' => 'Galambang hak pamuruk',
'listgrouprights-summary' => 'Barikut adalah sabuah daptar matan galambang pamuruk nang ada di wiki ngini, lawan hak ungkai masing-masing.
@@ -2148,11 +2156,17 @@ Paubahan-paubahan salanjutnya pada tungkaran ngini dan tungkaran pamandiran tara
'enotif_mailer' => 'Panyurili pamadahan {{SITENAME}}',
'enotif_reset' => 'Tandai samunyaan tutungkaran sudah diilangi',
-'enotif_newpagetext' => 'Ngini adalah sabuah tungkaran hanyar.',
'enotif_impersonal_salutation' => 'Pamuruk {{SITENAME}}',
-'changed' => "ta'ubah",
-'created' => "ta'ulah",
-'enotif_subject' => 'Tungkaran $PAGETITLE pintang {{SITENAME}} sudah $CHANGEDORCREATED ulih $PAGEEDITOR',
+'enotif_subject_deleted' => 'Tungkaran $1 di {{SITENAME}} hudah dihapus ulih {{gender:$2|$2}}',
+'enotif_subject_created' => 'Tungkaran $1 di {{SITENAME}} hudah diulah ulih {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Tungkaran $1 di {{SITENAME}} hudah dipindahakan ulih {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Tungkaran $1 di {{SITENAME}} hudah dibulikakan ulih {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Tungkaran $1 di {{SITENAME}} hudah diubah ulih {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Tungkaran $1 di {{SITENAME}} hudah dihapus pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3.',
+'enotif_body_intro_created' => 'Tungkaran $1 di {{SITENAME}} hudah diulah pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3 gasan ralatan damini.',
+'enotif_body_intro_moved' => 'Tungkaran $1 di {{SITENAME}} hudah dipindahakan pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3 gasan ralatan damini.',
+'enotif_body_intro_restored' => 'Tungkaran $1 di {{SITENAME}} hudah dibulikakan pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3 gasan ralatan damini.',
+'enotif_body_intro_changed' => 'Tungkaran $1 di {{SITENAME}} hudah diubah pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3 gasan ralatan damini.',
'enotif_lastvisited' => 'Janaki $1 gasan samunyaan paubahan mula Pian pauncitan tadi bailang.',
'enotif_lastdiff' => 'Janaki $1 hagan maniringi paubahan ngini.',
'enotif_anon_editor' => 'pamakai kada-bangaran $1',
@@ -2183,6 +2197,8 @@ $UNWATCHURL
kitihan-bulik wan pangganian labih jauh:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => "ta'ulah",
+'changed' => "ta'ubah",
# Delete
'deletepage' => 'Hapus tungkaran',
@@ -2253,6 +2269,8 @@ Janaki [[Special:ProtectedPages|daptar tungkaran talindungi]] gasan daptar palin
'prot_1movedto2' => '[[$1]] dipindahakan ka [[$2]]',
'protect-badnamespace-title' => 'Ruang-ngaran nang kada-dilindungi',
'protect-badnamespace-text' => 'Tutungkaran dalam ruang-ngaran ngini kada kawa dilindungi.',
+'protect-norestrictiontypes-text' => 'Tungkaran ngini kada kawa dilindungi marga kadada janis pambatasan nang tasadia.',
+'protect-norestrictiontypes-title' => 'Tungkaran kada-dilindungi',
'protect-legend' => 'Konpirmasi palindungan',
'protectcomment' => 'Alasan:',
'protectexpiry' => 'Kadaluwarsa:',
@@ -2637,6 +2655,7 @@ kada kawa mamindah sabuah tungkaran ka tungkaran ngitu jua.',
'immobile-target-namespace-iw' => 'Tautan interwiki adalah lainan sabuah tujuan sah gasan mamindahakan tungkaran.',
'immobile-source-page' => 'Tungkaran ngini kada kawa dipindahakan.',
'immobile-target-page' => 'Kada kawa mamindahakan ka judul tujuan ngitu.',
+'bad-target-model' => "Tujuan nang dihandaki mengguna'akan model konten nang babida. Kada kawa mamindah matan $1 gasan $2 .",
'imagenocrossnamespace' => 'Kada kawa mamindahakan barakas ka ngaran-kamar lainan-barakas.',
'nonfile-cannot-move-to-file' => 'Kada kawa mamindahakan lainan-barakas ka ngaran-kamar barakas',
'imagetypemismatch' => 'Ekstensi barakas hanyar kada cucuk lawa macamnya.',
@@ -2868,11 +2887,13 @@ Ngini pinanya dikaranakan ulih sabuah tautan ka sabuah situs daptar-hirang luar.
'pageinfo-default-sort' => 'Kunci urut baku',
'pageinfo-length' => 'Panjang tungkaran (dalam bita)',
'pageinfo-article-id' => 'ID Tungkaran',
+'pageinfo-language' => 'Bahasa isi tungkaran',
'pageinfo-robot-policy' => 'Status masin panggagai',
'pageinfo-robot-index' => 'Kawa diindeks',
'pageinfo-robot-noindex' => 'Kada kawa diindeks',
'pageinfo-views' => 'Rikinan titiringan',
'pageinfo-watchers' => 'Jumlah pa-itih tungkaran',
+'pageinfo-few-watchers' => 'Kurang matan $1 {{PLURAL:$1|pa-ilang}}',
'pageinfo-redirects-name' => 'Paugahan ka tungkaran ngini',
'pageinfo-subpages-name' => 'Subtungkaran tungkaran ngini',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|paugahan|paugahan}}; $3 {{PLURAL:$3|non-paugahan|non-paugahan}})',
@@ -2887,6 +2908,19 @@ Ngini pinanya dikaranakan ulih sabuah tautan ka sabuah situs daptar-hirang luar.
'pageinfo-magic-words' => '{{PLURAL:$1|Kata|Kata}} ajaib ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|tumbung|tutumbung}}',
'pageinfo-templates' => '{{PLURAL:$1|Citakan|Citakan}} nang ditransklusi ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Tungkaran|Tutungkaran}} ditransklusikan pada ( $1 )',
+'pageinfo-toolboxlink' => 'Maklumat tungkaran',
+'pageinfo-redirectsto' => 'Ba-ugah ka',
+'pageinfo-redirectsto-info' => 'Maklumat',
+'pageinfo-contentpage' => 'Dirikin sabagai tungkaran isi',
+'pageinfo-contentpage-yes' => 'Ya',
+'pageinfo-protect-cascading' => 'Palindungan baurutan matan sini',
+'pageinfo-protect-cascading-yes' => 'Ya',
+'pageinfo-protect-cascading-from' => 'Palindungan mulai matan',
+'pageinfo-category-info' => 'Tumbung maklumat',
+'pageinfo-category-pages' => 'Jumlah tungkaran',
+'pageinfo-category-subcats' => 'Jumlah subtumbung',
+'pageinfo-category-files' => 'Jumlah babarakas',
# Patrolling
'markaspatrolleddiff' => 'Ciri-i sawagai ta-awasi',
@@ -2898,6 +2932,8 @@ Ngini pinanya dikaranakan ulih sabuah tautan ka sabuah situs daptar-hirang luar.
'markedaspatrollederror' => 'Kada kawa diciri-i sawagai ta-awasi',
'markedaspatrollederrortext' => 'Pian parlu manantuakan sabuah ralatan hagan diciri-i sawagai ta-awasi.',
'markedaspatrollederror-noautopatrol' => 'Pian kada dibulihakan manyiri-i paubahan Pian surang sawagai ta-awasi.',
+'markedaspatrollednotify' => 'Paubahan ngini gasan $1 hudah ditandai ta-itihi.',
+'markedaspatrollederrornotify' => 'Manandai sabagai paitihan nang gagal.',
# Patrol log
'patrol-log-page' => 'Log pa-awasan',
@@ -3569,6 +3605,7 @@ Pian kawa jua [[Special:EditWatchlist|mamuruk si pambabak standar]].',
'version-license' => 'Lisansi',
'version-poweredby-credits' => "Wiki ngini disukung ulih '''[//www.mediawiki.org/ MediaWiki]''', hak salin © 2001-$1 $2.",
'version-poweredby-others' => 'lainnya',
+'version-credits-summary' => 'Kami ingin ma-akui urang-urang ini atas sumbangan pikiran-tanaga kapada [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki adalah parangkat lunak bibas; Pian kawa manyabarakan wan/atawa maubahi ngini di bawah syarat Lisansi Publik Umum sawagai tarbitan ulih Free Software Foundation; apakah Lisansi virsi 2, atawa (pilihan Pian) pahanyarnya.
MediaWiki disabarakan awan harapan akan baguna, tagal KADA BAJAMINAN; kada jaminan PANIAGAAN atawa KATAPATAN HAGAN TUJUAN TARTANTU. Janaki Lisansi Publik Umum GNU gasan panjalasan rinci.
@@ -3711,7 +3748,7 @@ Situs ngini mangalami kangalihan teknik.',
'logentry-newusers-create' => '$1 ma-ulah sabuting akun pamakai',
'logentry-newusers-create2' => '$1 ma-ulah sabuting akun pamakai $3',
'logentry-newusers-autocreate' => 'Akun $1 utumatis diulah',
-'newuserlog-byemail' => 'Katasunduk dikirimakan lung suril.',
+'rightsnone' => '(kadada)',
# Feedback
'feedback-bugornote' => 'Pabila Pian siap manjalasakan sabuah masalah taknik rinci muhun [lapurakan sabuah bug $1].
diff --git a/languages/messages/MessagesBn.php b/languages/messages/MessagesBn.php
index daa4fedd..f65512e8 100644
--- a/languages/messages/MessagesBn.php
+++ b/languages/messages/MessagesBn.php
@@ -204,6 +204,7 @@ $messages = array(
'newwindow' => '(নতà§à¦¨ উইনà§à¦¡à§‹à¦¤à§‡ খà§à¦²à¦¬à§‡)',
'cancel' => 'বাতিল',
'moredotdotdot' => 'আরও...',
+'morenotlisted' => 'আরও তালিকাভà§à¦•à§à¦¤ হয়নি...',
'mypage' => 'আমার পাতা',
'mytalk' => 'আলোচনা',
'anontalk' => 'à¦à¦‡ বেনামী বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° আলাপের পাতা',
@@ -215,7 +216,6 @@ $messages = array(
'qbbrowse' => 'বà§à¦°à¦¾à¦‰à¦œ',
'qbedit' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾',
'qbpageoptions' => 'ঠপাতার বিকলà§à¦ªà¦¸à¦®à§‚হ',
-'qbpageinfo' => 'পাতা-সংকà§à¦°à¦¾à¦¨à§à¦¤ তথà§à¦¯',
'qbmyoptions' => 'আমার পছনà§à¦¦',
'qbspecialpages' => 'বিশেষ পাতাসমূহ',
'faq' => 'সমà§à¦­à¦¾à¦¬à§à¦¯ পà§à¦°à¦¶à§à¦¨à¦¸à¦®à§‚হ',
@@ -238,6 +238,7 @@ $messages = array(
'namespaces' => 'নামসà§à¦¥à¦¾à¦¨',
'variants' => 'বিকলà§à¦ªà¦¸à¦®à§‚হ',
+'navigation-heading' => 'পরিভà§à¦°à¦®à¦£ মেনà§',
'errorpagetitle' => 'তà§à¦°à§à¦Ÿà¦¿',
'returnto' => '$1 শিরোনামের পাতায় ফেরত যান।',
'tagline' => '{{SITENAME}} থেকে',
@@ -478,11 +479,11 @@ $2',
# Login and logout pages
'logouttext' => "'''আপনি à¦à¦‡à¦®à¦¾à¦¤à§à¦° আপনার à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ থেকে পà§à¦°à¦¸à§à¦¥à¦¾à¦¨ করেছেন।'''
-ঠপরিসà§à¦¥à¦¿à¦¤à¦¿à¦¤à§‡ আপনি বেনামে {{SITENAME}} বà§à¦¯à¦¬à¦¹à¦¾à¦° করতে পারেন, কিংবা à¦à¦•à¦‡ বা পৃথক নামে [[Special:UserLogin|আবার পà§à¦°à¦¬à§‡à¦¶ করতে]] পারেন।
+ঠপরিসà§à¦¥à¦¿à¦¤à¦¿à¦¤à§‡ আপনি বেনামে {{SITENAME}} বà§à¦¯à¦¬à¦¹à¦¾à¦° করতে পারেন, কিংবা à¦à¦•à¦‡ বা পৃথক নামে <span class='plainlinks'>[$1 আবার পà§à¦°à¦¬à§‡à¦¶ করতে]</span> পারেন।
লকà§à¦·à§à¦¯ করà§à¦¨ যে, à¦à¦° কোন কোন পাতা à¦à¦–নও à¦à¦®à¦¨à¦­à¦¾à¦¬à§‡ দেখাতে পারে যাতে মনে হবে আপনি আগের অবসà§à¦¥à¦¾à¦¤à§‡à¦‡ আছেন। à¦à¦•à§à¦·à§‡à¦¤à§à¦°à§‡ আপনাকে আপনার বà§à¦°à¦¾à¦“জারের কà§à¦¯à¦¾à¦¶ পরিষà§à¦•à¦¾à¦° (clear browser cache) করে নিতে হবে।",
-'welcomecreation' => '== সà§à¦¬à¦¾à¦—তম $1! ==
-আপনার অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরী হয়েছে।
-আপনার [[Special:Preferences|{{SITENAME}} পছনà§à¦¦à¦¸à¦®à§‚হ]] সà§à¦¥à¦¿à¦° করে নিতে ভà§à¦²à¦¬à§‡à¦¨ না কিনà§à¦¤à§à¥¤',
+'welcomeuser' => 'সà§à¦¬à¦¾à¦—তম, $1!',
+'welcomecreation-msg' => 'আপনার অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরী হয়েছে।
+আপনার [[Special:Preferences|{{SITENAME}} পছনà§à¦¦à¦¸à¦®à§‚হ]] পরিবরà§à¦¤à¦¨ করে নিতে ভà§à¦²à¦¬à§‡à¦¨ না।',
'yourname' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম:',
'yourpassword' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿:',
'yourpasswordagain' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿à¦Ÿà¦¿ (password) আবার লিখà§à¦¨',
@@ -505,7 +506,7 @@ $2',
'gotaccount' => "আপনার কি ইতিমধà§à¦¯à§‡ à¦à¦•à¦Ÿà¦¿ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ তৈরি করা আছে? '''$1''' করà§à¦¨à¥¤",
'gotaccountlink' => 'পà§à¦°à¦¬à§‡à¦¶',
'userlogin-resetlink' => 'আপনার লগইনের বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ তথà§à¦¯à¦¾à¦¦à¦¿ ভà§à¦²à§‡ গেছেন?',
-'createaccountmail' => 'ই-মেইলের মাধà§à¦¯à¦®à§‡',
+'createaccountmail' => 'à¦à¦•à¦Ÿà¦¿ র‌à§à¦¯à¦¾à¦¨à§à¦¡à¦® পাসওয়ারà§à¦¡ নিরà§à¦¬à¦¾à¦šà¦¨ করà§à¦¨ à¦à¦¬à¦‚ নিচের নিরà§à¦§à¦¾à¦°à¦¿à¦¤ ইমেইল ঠিকানায় পাঠিয়ে দিন',
'createaccountreason' => 'কারণ:',
'badretype' => "আপনার পà§à¦°à¦¬à§‡à¦¶ করানো শবà§à¦¦à¦šà¦¾à¦¬à¦¿'টি মিলছেনা।",
'userexists' => 'à¦à¦‡ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নামটি ইতমধà§à¦¯à§‡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করা হয়েছে।
@@ -570,6 +571,7 @@ $2',
# Email sending
'php-mail-error-unknown' => 'পিà¦à¦‡à¦šà¦ªà¦¿ à¦à¦° মেইল () কারà§à¦¯à§‡ অজà§à¦žà¦¾à¦¤ ভà§à¦²',
'user-mail-no-addy' => 'কোনো ইমেইল ঠিকানা ছাড়াই ইমেইল করার চেষà§à¦Ÿà¦¾ করা হয়েছে।',
+'user-mail-no-body' => 'অতà§à¦¯à¦¾à¦¨à§à¦¤ সংকà§à¦·à¦¿à¦ªà§à¦¤ অথবা কোনো তথà§à¦¯ ছাড়াই ইমেইল পাঠানোর চেষà§à¦Ÿà¦¾ করা হয়েছিল।',
# Change password dialog
'resetpass' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ পরিবরà§à¦¤à¦¨',
@@ -634,6 +636,7 @@ $2
'changeemail-oldemail' => 'বরà§à¦¤à¦®à¦¾à¦¨ ই-মেইল ঠিকানা:',
'changeemail-newemail' => 'নতà§à¦¨ ই-মেইল ঠিকানা:',
'changeemail-none' => '(কিছৠনাই)',
+'changeemail-password' => 'আপনার {{SITENAME}} শবà§à¦¦à¦šà¦¾à¦¬à¦¿:',
'changeemail-submit' => 'ই-মেইল পরিবরà§à¦¤à¦¨',
'changeemail-cancel' => 'বাতিল',
@@ -804,7 +807,6 @@ $1 নিষেধাজà§à¦žà¦¾ আরোপ করেছেন। নিষà§
'template-semiprotected' => '(অরà§à¦§-সà§à¦°à¦•à§à¦·à¦¿à¦¤)',
'hiddencategories' => 'ঠপাতাটি যে {{PLURAL:$1|1 লà§à¦•à¦¾à¦¯à¦¼à¦¿à¦¤ বিষয়শà§à¦°à§‡à¦£à§€à¦°|$1 লà§à¦•à¦¾à¦¯à¦¼à¦¿à¦¤ বিষয়শà§à¦°à§‡à¦£à§€à¦¸à¦®à§‚হের}} সদসà§à¦¯:',
'edittools-upload' => '-',
-'nocreatetitle' => 'পাতা তৈরি নিয়নà§à¦¤à§à¦°à¦£ করা হয়েছে',
'nocreatetext' => '{{SITENAME}}-ঠনতà§à¦¨ পাতা সৃষà§à¦Ÿà¦¿ করার কà§à¦·à¦®à¦¤à¦¾ সীমাবদà§à¦§ করা হয়েছে।
আপনি ফিরে গিয়ে ইতিমধà§à¦¯à§‡ বিদà§à¦¯à¦®à¦¾à¦¨ কোন পাতা সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করতে পারেন, অথবা [[Special:UserLogin|অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà§‡ পà§à¦°à¦¬à§‡à¦¶ কিংবা অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ সৃষà§à¦Ÿà¦¿ করতে পারেন]]।',
'nocreate-loggedin' => 'নতà§à¦¨ পাতা তৈরিতে আপনাকে অনà§à¦®à§‹à¦¤à¦¿ দেওয়া হয়নি।',
@@ -829,6 +831,15 @@ $1 নিষেধাজà§à¦žà¦¾ আরোপ করেছেন। নিষà§
'edit-already-exists' => 'নতà§à¦¨ পাতা সৃষà§à¦Ÿà¦¿ করা যায়নি।
পাতাটি ইতিমধà§à¦¯à§‡à¦‡ বিদà§à¦¯à¦®à¦¾à¦¨à¥¤',
'defaultmessagetext' => 'আদি টেকà§à¦¸à¦Ÿ',
+'content-failed-to-parse' => '$1 মডেলের জনà§à¦¯ $2 কনà§à¦Ÿà§‡à¦¨à§à¦Ÿ পারà§à¦¸ করা যাচà§à¦›à§‡ না: $3',
+'invalid-content-data' => 'ভà§à¦² কনà§à¦Ÿà§‡à¦¨à§à¦Ÿ ডাটা',
+'content-not-allowed-here' => '"$1" কনà§à¦Ÿà§‡à¦¨à§à¦Ÿà¦Ÿà¦¿ [[$2]] পাতায় অনà§à¦®à§‹à¦¦à¦¿à¦¤ নয়',
+
+# Content models
+'content-model-wikitext' => 'উইকিটেকà§à¦¸à¦Ÿ',
+'content-model-text' => 'সাধারণ লেখা',
+'content-model-javascript' => 'জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ',
+'content-model-css' => 'সিà¦à¦¸à¦à¦¸',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''সতরà§à¦• হোন:''' à¦à¦‡ পাতাটি অনেক বেশি পরিমাণে à¦à¦•à§à¦¸à¦ªà§‡à¦¨à¦¸à¦¿à¦­ পারà§à¦¸à¦¾à¦° ফাংশন কল রয়েছে।
@@ -1192,9 +1203,9 @@ $1",
'prefs-emailconfirm-label' => 'ই-মেইল নিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£:',
'prefs-textboxsize' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ উইনà§à¦¡à§‹à¦° আকার',
'youremail' => 'ইমেইল *',
-'username' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম:',
-'uid' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নং (ID):',
-'prefs-memberingroups' => '{{PLURAL:$1|দলের|দলসমূহের}} সদসà§à¦¯:',
+'username' => '{{GENDER:$1|বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম}}:',
+'uid' => '{{GENDER:$1|বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€}} নং (ID):',
+'prefs-memberingroups' => '{{PLURAL:$1|দলের|দলসমূহের}} {{GENDER:$2|সদসà§à¦¯}}:',
'prefs-registration' => 'নিবনà§à¦§à§‡à¦° সময়:',
'yourrealname' => 'আসল নাম *',
'yourlanguage' => 'ভাষা:',
@@ -1341,12 +1352,13 @@ $1",
'right-sendemail' => 'অনà§à¦¯ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦•à§‡ ইমেইল পাঠান',
'right-passwordreset' => 'পাসওয়ারà§à¦¡ রিসেট ইমেইল দেখà§à¦¨',
+# Special:Log/newusers
+'newuserlogpage' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সৃষà§à¦Ÿà¦¿à¦° লগ',
+'newuserlogpagetext' => 'à¦à¦Ÿà¦¿ নতà§à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সৃষà§à¦Ÿà¦¿à¦° লগ',
+
# User rights log
'rightslog' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° অধিকার লগ',
'rightslogtext' => 'à¦à¦Ÿà¦¿ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকারে আনা পরিবরà§à¦¤à¦¨à¦—à§à¦²à¦¿à¦° à¦à¦•à¦Ÿà¦¿ লগ।',
-'rightslogentry' => '$1-কে $2 দল থেকে পরিবরà§à¦¤à¦¨ করে $3 দলের সদসà§à¦¯ করা হয়েছে',
-'rightslogentry-autopromote' => 'সয়ংকà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ $2 থেকে $3 উনà§à¦¨à§€à¦¤ হয়েছে',
-'rightsnone' => '(কিছৠনাই)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'à¦à¦‡ পাতাটি পড়à§à¦¨',
@@ -1574,6 +1586,7 @@ $1',
'backend-fail-notsame' => '"$1"-ঠআগে থেকেই অপর à¦à¦•à¦Ÿà¦¿ ফাইল রয়েছে।',
'backend-fail-invalidpath' => '"$1" à¦à¦•à¦Ÿà¦¿ ভà§à¦² সà§à¦Ÿà§‹à¦°à§‡à¦œ পাথ।',
'backend-fail-delete' => '$1 ফাইলটি অপসারণ সমà§à¦­à¦¬ নয়।',
+'backend-fail-describe' => '"$1" ফাইলের মেটাডাটা পরিবরà§à¦¤à¦¨ সমà§à¦­à¦¬ নয়।',
'backend-fail-alreadyexists' => '"$1" নামের à¦à¦•à¦Ÿà¦¿ ফাইল আগে থেকেই রয়েছে।',
'backend-fail-store' => '"$2"-ঠ"$1" ফাইলটি সংরকà§à¦·à¦¨ করা সমà§à¦­à¦¬ নয়।',
'backend-fail-copy' => '"$1" ফাইলটি "$2"-তে কপি করা সমà§à¦­à¦¬ নয়।',
@@ -1807,6 +1820,12 @@ Maybe you want to edit the description on its [$2 file description page] there.'
à¦à¦° পরিবরà§à¦¤à§‡ à¦à¦—à§à¦²à¦¿ থেকে à¦à¦•à¦Ÿà¦¿ উপযà§à¦•à§à¦¤ বিষয়ে সংযোগ থাকা আবশà§à¦¯à¦•à¥¤<br />
যদি কোন পাতায় à¦à¦®à¦¨ কোন টেমপà§à¦²à§‡à¦Ÿ থাকে যেটিতে [[MediaWiki:Disambiguationspage]] থেকে সংযোগ আছে, তবে সেই পাতাটিকে à¦à¦•à¦Ÿà¦¿ দà§à¦¬à§à¦¯à¦°à§à¦¥à¦¤à¦¾ নিরসন পাতা হিসেবে গণà§à¦¯ করা হয়।",
+'pageswithprop' => 'পাতার উপাদান সমà§à¦¬à¦²à¦¿à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
+'pageswithprop-legend' => 'পাতার উপাদান সমà§à¦¬à¦²à¦¿à¦¤ পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ',
+'pageswithprop-text' => 'à¦à¦•à¦Ÿà¦¿ নিরà§à¦¦à¦¿à¦·à§à¦Ÿ পাতার বৈশিষà§à¦Ÿ রয়েছে à¦à¦®à¦¨ পাতাসমূহের তালিকা।',
+'pageswithprop-prop' => 'বৈশিষà§à¦Ÿà§‡à¦° নাম:',
+'pageswithprop-submit' => 'চলো',
+
'doubleredirects' => 'দà§à¦‡à¦¬à¦¾à¦° করা পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦—à§à¦²à¦¿',
'doubleredirectstext' => 'à¦à¦‡ পাতায় à¦à¦®à¦¨ পাতাগà§à¦²à§‹à¦° তালিকা আছে, যেগà§à¦²à§‹ অনà§à¦¯ কোন পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾ পাতায় পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¿à¦¤ হয়েছে। পà§à¦°à¦¤à¦¿à¦Ÿà¦¿ সারিতে পà§à¦°à¦¥à¦® ও দà§à¦¬à¦¿à¦¤à§€à¦¯à¦¼ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦° জনà§à¦¯ সংযোগ আছে à¦à¦¬à¦‚ দà§à¦¬à¦¿à¦¤à§€à¦¯à¦¼ পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦Ÿà¦¿à¦° লকà§à¦·à§à¦¯ সংযোগটিও দেওয়া আছে। à¦à¦‡ লকà§à¦·à§à¦¯ সংযোগটিই সাধারণত "আসল" লকà§à¦·à§à¦¯ পাতা, যেটিতে পà§à¦°à¦¥à¦® পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦Ÿà¦¿ থেকে সংযোগ থাকা উচিত।
<del>কেটে দেওয়া</del> ভà§à¦•à§à¦¤à¦¿à¦—à§à¦²à§‹ ঠিক করা হয়েছে।',
@@ -1960,7 +1979,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
'linksearch-ok' => 'অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨',
'linksearch-text' => '"*.wikipedia.org" à¦à¦° মত ওয়াইলà§à¦¡ কারà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করা যেতে পারে।
নূনà§à¦¯à¦¤à¦® à¦à¦•à¦Ÿà¦¿ টপ লেভেল ডোমেইন পà§à¦°à¦¯à¦¼à§‹à¦œà¦¨, যেমন "*.org".<br />
-যে সকল পà§à¦°à§‹à¦Ÿà§‹à¦•à¦² সমরà§à¦¥à¦¨ করে: <code>$1</code> (পà§à¦°à§‹à¦Ÿà¦•à¦² উলà§à¦²à§‡à¦– করা না হলে http:// ডিফলà§à¦Ÿ হিসাবে বà§à¦¯à¦¬à¦¹à§ƒà¦¤ হবে)।',
+যে সকল {{PLURAL:$2|পà§à¦°à§‹à¦Ÿà§‹à¦•à¦²|পà§à¦°à§‹à¦Ÿà§‹à¦•à¦²à¦¸à¦®à§‚হ}} সমরà§à¦¥à¦¨ করে: <code>$1</code> (পà§à¦°à§‹à¦Ÿà¦•à¦² উলà§à¦²à§‡à¦– করা না হলে http:// ডিফলà§à¦Ÿ হিসাবে বà§à¦¯à¦¬à¦¹à§ƒà¦¤ হবে)।',
'linksearch-line' => '$2 থেকে $1 ঠলিংক করা হয়েছে',
'linksearch-error' => 'হোসà§à¦Ÿ নামের শà§à¦°à§à¦¤à§‡ কেবলমাতà§à¦° ওয়াইলà§à¦¡à¦•à¦¾à¦°à§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করা যায়।',
@@ -1979,10 +1998,6 @@ Maybe you want to edit the description on its [$2 file description page] there.'
'activeusers-hidesysops' => 'পà§à¦°à¦¶à¦¾à¦¸à¦• লà§à¦•à¦¾à¦“',
'activeusers-noresult' => 'কোনো বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ পাওয়া যায়নি।',
-# Special:Log/newusers
-'newuserlogpage' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সৃষà§à¦Ÿà¦¿à¦° লগ',
-'newuserlogpagetext' => 'à¦à¦Ÿà¦¿ নতà§à¦¨ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সৃষà§à¦Ÿà¦¿à¦° লগ',
-
# Special:ListGroupRights
'listgrouprights' => 'দলগত বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অধিকার',
'listgrouprights-summary' => 'à¦à¦‡ উইকির বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦¦à§‡à¦° à¦à¦•à¦Ÿà¦¿ গà§à¦°à§à¦ªà¦—à§à¦²à§‹à¦° তালিকা দেখানো হচà§à¦›à§‡, সাথে গà§à¦°à§à¦ªà§‡à¦° কারà§à¦¯à¦ªà¦°à¦¿à¦§à¦¿à¦“ উলà§à¦²à§‡à¦– করা হয়েছে।
@@ -2078,45 +2093,48 @@ Maybe you want to edit the description on its [$2 file description page] there.'
'enotif_mailer' => '{{SITENAME}} বিজà§à¦žà¦ªà§à¦¤à¦¿ ই-মেইল পà§à¦°à§‡à¦°à¦•',
'enotif_reset' => 'সমসà§à¦¤ পাতা দেখা হয়েছে হিসেবে চিহà§à¦¨à¦¿à¦¤ করà§à¦¨',
-'enotif_newpagetext' => 'à¦à¦Ÿà¦¿ à¦à¦•à¦Ÿà¦¿ নতà§à¦¨ পাতা।',
'enotif_impersonal_salutation' => '{{SITENAME}} বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€',
-'changed' => 'পরিবরà§à¦¤à¦¿à¦¤',
-'created' => 'তৈরী হয়েছিল',
-'enotif_subject' => '{{SITENAME}}-à¦à¦° $PAGETITLE শিরোনামের পাতাটি $PAGEEDITOR করà§à¦¤à§ƒà¦• $CHANGEDORCREATED হয়েছে',
+'enotif_subject_deleted' => '{{SITENAME}} à¦à¦° $1 পাতাটি {{gender:$2|$2}} অপসারণ করেছেন',
+'enotif_subject_created' => '{{SITENAME}} à¦à¦° $1 পাতাটি {{gender:$2|$2}} তৈরী করেছেন',
+'enotif_subject_moved' => '{{SITENAME}} à¦à¦° $1 পাতাটি {{gender:$2|$2}} সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করেছেন',
+'enotif_subject_restored' => '{{SITENAME}} à¦à¦° $1 পাতাটি {{gender:$2|$2}} পà§à¦¨à¦°à¦¾à¦¯à¦¼ ফিরিয়ে à¦à¦¨à§‡à¦›à§‡à¦¨',
+'enotif_subject_changed' => '{{SITENAME}} à¦à¦° $1 পাতাটি {{gender:$2|$2}} পরিবরà§à¦¤à¦¨ করেছেন',
+'enotif_body_intro_deleted' => '{{SITENAME}} à¦à¦° $1 পাতাটি {{gender:$2|$2}} $PAGEEDITDATE তারিখে অপসারণ করেছেন, বিসà§à¦¤à¦¾à¦°à¦¿à¦¤ $3।',
+'enotif_body_intro_created' => '{{SITENAME}} à¦à¦° $1 পাতাটি {{gender:$2|$2}} $PAGEEDITDATE তারিখে তৈরী করেছেন, বরà§à¦¤à¦®à¦¾à¦¨ সংসà§à¦•à¦°à¦£ দেখà§à¦¨ à¦à¦–ানে $3।',
+'enotif_body_intro_moved' => '{{SITENAME}} à¦à¦° $1 পাতাটি {{gender:$2|$2}} $PAGEEDITDATE তারিখে সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦° করেছেন, বরà§à¦¤à¦®à¦¾à¦¨ সংসà§à¦•à¦°à¦£ দেখà§à¦¨ à¦à¦–ানে $3।',
+'enotif_body_intro_restored' => '{{SITENAME}} à¦à¦° $1 পাতাটি {{gender:$2|$2}} $PAGEEDITDATE আগের অবসà§à¦¥à¦¾à¦¯à¦¼ ফিরিয়ে à¦à¦¨à§‡à¦›à§‡à¦¨, বরà§à¦¤à¦®à¦¾à¦¨ সংসà§à¦•à¦°à¦£ দেখà§à¦¨ à¦à¦–ানে $3।',
+'enotif_body_intro_changed' => '{{SITENAME}} à¦à¦° $1 পাতাটি {{gender:$2|$2}} $PAGEEDITDATE তারিখে পরিবরà§à¦¤à¦¨ করেছেন, বরà§à¦¤à¦®à¦¾à¦¨ সংসà§à¦•à¦°à¦£ দেখà§à¦¨ à¦à¦–ানে $3।',
'enotif_lastvisited' => 'আপনার শেষ আগমনের পরে সংঘটিত সমসà§à¦¤ পরিবরà§à¦¤à¦¨à§‡à¦° জনà§à¦¯ $1 দেখà§à¦¨à¥¤',
'enotif_lastdiff' => 'à¦à¦‡ পরিবরà§à¦¤à¦¨à¦Ÿà¦¿ দেখার জনà§à¦¯ $1 দেখà§à¦¨à¥¤',
'enotif_anon_editor' => 'বেনামী বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ $1',
-'enotif_body' => '!পà§à¦°à¦¿à¦¯à¦¼ $WATCHINGUSERNAME,
-
-{{SITENAME}}-à¦à¦° $PAGETITLE শিরোনামের পাতাটি $PAGEEDITDATE তারিখে $PAGEEDITOR $CHANGEDORCREATED করেছেন। পাতাটির বরà§à¦¤à¦®à¦¾à¦¨ সংসà§à¦•à¦°à¦£à§‡à¦° জনà§à¦¯ $PAGETITLE_URL দেখà§à¦¨à¥¤
+'enotif_body' => 'পà§à¦°à¦¿à¦¯à¦¼ $WATCHINGUSERNAME,
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
সমà§à¦ªà¦¾à¦¦à¦•à§‡à¦° সারাংশ: $PAGESUMMARY $PAGEMINOREDIT
সমà§à¦ªà¦¾à¦¦à¦•à§‡à¦° সাথে যোগাযোগের উপায়:
-
-ই-মেইল: $PAGEEDITOR_EMAIL
+ইমেইল: $PAGEEDITOR_EMAIL
উইকি: $PAGEEDITOR_WIKI
-পাতাটির পরবরà§à¦¤à§€ পরিবরà§à¦¤à¦¨à¦—à§à¦²à§‹ জনà§à¦¯ আর কোন বিজà§à¦žà¦ªà§à¦¤à¦¿ পাঠানো হবে না, যতকà§à¦·à¦£ না আপনি à¦à¦‡ পাতায় বà§à¦°à¦¾à¦‰à¦œ করবেন।
-à¦à¦›à¦¾à¦¡à¦¼à¦¾ আপনি আপনার নজরতালিকায় রাখা সবগà§à¦²à¦¿ পাতা জনà§à¦¯ বিজà§à¦žà¦ªà§à¦¤à¦¿ ফà§à¦²à§à¦¯à¦¾à¦— শà§à¦°à§à¦° অবসà§à¦¥à¦¾à¦¯à¦¼ ফিরিয়ে নিতে পারেন।
+পাতাটির পরবরà§à¦¤à§€ পরিবরà§à¦¤à¦¨à¦—à§à¦²à§‹ জনà§à¦¯ আর কোন বিজà§à¦žà¦ªà§à¦¤à¦¿ পাঠানো হবে না, যতকà§à¦·à¦£ না আপনি à¦à¦‡ পাতায় বà§à¦°à¦¾à¦‰à¦œ করবেন। à¦à¦›à¦¾à¦¡à¦¼à¦¾ আপনি আপনার নজরতালিকায় রাখা সবগà§à¦²à¦¿ পাতা জনà§à¦¯ বিজà§à¦žà¦ªà§à¦¤à¦¿ ফà§à¦²à§à¦¯à¦¾à¦— শà§à¦°à§à¦° অবসà§à¦¥à¦¾à¦¯à¦¼ ফিরিয়ে নিতে পারেন।
-
- {{SITENAME}} বিজà§à¦žà¦ªà§à¦¤à¦¿ বà§à¦¯à¦¬à¦¸à§à¦¥à¦¾
+{{SITENAME}} নোটিফিকেশন
--
+ইমেইল নোটিফিকেশন সেটিং পরিবরà§à¦¤à¦¨à§‡à¦° জনà§à¦¯ দেখà§à¦¨
+{{canonicalurl:{{#special:Preferences}}}}
-আপনার নজরতালিকা সেটিংস পরিবরà§à¦¤à¦¨ করতে চাইলে à¦à¦–ানে যান:
+আপনার নজরতালিকা সেটিংস পরিবরà§à¦¤à¦¨ করতে চাইলে দেখà§à¦¨,
{{canonicalurl:{{#special:EditWatchlist}}}}
-
নজরতালিকা থেকে কোন পাতা অপসারণ করতে চাইলে à¦à¦–ানে যান:
$UNWATCHURL
-
পà§à¦°à¦¤à¦¿à¦•à§à¦°à¦¿à¦¯à¦¼à¦¾ জানাতে ও আরও সহযোগিতার জনà§à¦¯:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'তৈরী হয়েছিল',
+'changed' => 'পরিবরà§à¦¤à¦¿à¦¤',
# Delete
'deletepage' => 'পাতাটি মà§à¦›à§‡ ফেলা হোক',
@@ -2187,6 +2205,8 @@ $UNWATCHURL
'prot_1movedto2' => '[[$1]]-কে [[$2]]-ঠসরিয়ে নেওয়া হয়েছে',
'protect-badnamespace-title' => 'নামসà§à¦¥à¦¾à¦¨à¦Ÿà¦¿ সà§à¦°à¦•à§à¦·à¦¿à¦¤ করা সমà§à¦­à¦¬ নয়',
'protect-badnamespace-text' => 'à¦à¦‡ নামসà§à¦¥à¦¾à¦¨à§‡à¦° পাতাগà§à¦²à§‹ সà§à¦°à¦•à§à¦·à¦¿à¦¤ করা সমà§à¦­à¦¬ নয়।',
+'protect-norestrictiontypes-text' => 'à¦à¦‡ পাতাটি সà§à¦°à¦•à§à¦·à¦¿à¦¤ করা যাচà§à¦›à§‡ না কারণ à¦à¦–ানে সà§à¦°à¦•à§à¦·à¦¾à¦° কোনো বেশিষà§à¦Ÿ নেই।',
+'protect-norestrictiontypes-title' => 'সà§à¦°à¦•à§à¦·à¦¾ পà§à¦°à¦¯à§‹à¦œà§à¦¯ নয় à¦à¦®à¦¨ পাতা',
'protect-legend' => 'সà§à¦°à¦•à§à¦·à¦¾ নিশà§à¦šà¦¿à¦¤ করà§à¦¨',
'protectcomment' => 'কারণ:',
'protectexpiry' => 'মেয়াদোতà§à¦¤à§€à¦°à§à¦£ হবে:',
@@ -2266,7 +2286,8 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦° করা হয়েছে',
'undeletedrevisions-files' => '{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} à¦à¦¬à¦‚ {{PLURAL:$2|১টি ফাইল|$2টি ফাইল}} পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦° করা হয়েছে',
'undeletedfiles' => '{{PLURAL:$1|১টি ফাইল|$1টি ফাইল}} পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦° করা হয়েছে',
-'cannotundelete' => 'মà§à¦›à§‡ ফেলা বাতিল করা যায়নি; অনà§à¦¯ কেউ হয়ত আগেই পাতাটি মà§à¦›à§‡ ফেলা বাতিল করেছেন।',
+'cannotundelete' => 'মà§à¦›à§‡ ফেলা বাতিল করা যায়নি:
+$1',
'undeletedpage' => "'''$1 পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦° করা হয়েছে'''
সামà§à¦ªà§à¦°à¦¤à¦¿à¦• মà§à¦›à§‡ ফেলা ও পà§à¦¨à¦°à§à¦¦à§à¦§à¦¾à¦°à§‡à¦° ঘটনাগà§à¦²à¦¿à¦° জনà§à¦¯ [[Special:Log/delete|অবলà§à¦ªà§à¦¤à¦¿ লগ]] দেখà§à¦¨à¥¤",
@@ -2297,7 +2318,7 @@ $1',
'blanknamespace' => '(পà§à¦°à¦§à¦¾à¦¨)',
# Contributions
-'contributions' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° অবদান',
+'contributions' => '{{GENDER:$1|বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦°}} অবদান',
'contributions-title' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€à¦° অবদানসমূহ',
'mycontris' => 'অবদান',
'contribsub2' => '$1 ($2)-à¦à¦° জনà§à¦¯',
@@ -2686,7 +2707,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ পরীকà§à¦·à¦¾',
-'javascripttest-disabled' => 'à¦à¦‡ উইকিতে নিরà§à¦§à¦¾à¦°à¦¿à¦¤ অপশনটি চালৠনেই।',
'javascripttest-title' => '$1 পরীকà§à¦·à¦¾ চলছে',
'javascripttest-pagetext-noframework' => 'à¦à¦‡ পাতাটি জাভাসà§à¦•à§à¦°à¦¿à¦ªà§à¦Ÿ পরীকà§à¦·à¦¾à¦° জনà§à¦¯ সংরকà§à¦·à¦¿à¦¤à¥¤',
'javascripttest-pagetext-unknownframework' => 'পরীকà§à¦·à¦¾à¦° অজানা ফà§à¦°à§‡à¦®à¦“য়ারà§à¦• "$1"।',
@@ -2804,6 +2824,7 @@ $1',
'pageinfo-default-sort' => 'ডিফলà§à¦Ÿ সরà§à¦Ÿ কি',
'pageinfo-length' => 'পাতার দৈরà§à¦˜à§à¦¯ (বাইটে)',
'pageinfo-article-id' => 'পাতার আইডি',
+'pageinfo-language' => 'পাতার তথà§à¦¯à§‡à¦° ভাষা',
'pageinfo-robot-policy' => 'সারà§à¦š ইঞà§à¦œà¦¿à¦¨à§‡à¦° অবসà§à¦¥à¦¾',
'pageinfo-robot-index' => 'ইনডেকà§à¦¸ উপযোগী',
'pageinfo-robot-noindex' => 'ইনডেকà§à¦¸à§‡à¦° অনà§à¦ªà¦¯à§‹à¦—ী',
@@ -2823,6 +2844,16 @@ $1',
'pageinfo-magic-words' => 'মà§à¦¯à¦¾à¦œà¦¿à¦• {{PLURAL:$1|শবà§à¦¦|শবà§à¦¦à¦¸à¦®à§‚হ}} ($1)',
'pageinfo-hidden-categories' => 'লà§à¦•à¦¾à¦¨à§‹ {{PLURAL:$1|বিষয়শà§à¦°à§‡à¦£à§€|বিষয়শà§à¦°à§‡à¦£à§€à¦¸à¦®à§‚হ}} ($1)',
'pageinfo-templates' => 'সংযà§à¦•à§à¦¤ {{PLURAL:$1|টেমপà§à¦²à§‡à¦Ÿ|টেমপà§à¦²à§‡à¦Ÿà¦¸à¦®à§‚হ}} ($1)',
+'pageinfo-toolboxlink' => 'পাতার তথà§à¦¯',
+'pageinfo-redirectsto' => 'পà§à¦¨à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¿à¦¤ হয়েছে',
+'pageinfo-redirectsto-info' => 'তথà§à¦¯',
+'pageinfo-contentpage' => 'তথà§à¦¯ পাতা হিসাবে বিবেচিত হয়েছে',
+'pageinfo-contentpage-yes' => 'হà§à¦¯à¦¾à¦',
+'pageinfo-protect-cascading-yes' => 'হà§à¦¯à¦¾à¦',
+'pageinfo-category-info' => 'বিষয়শà§à¦°à§‡à¦£à§€ তথà§à¦¯',
+'pageinfo-category-pages' => 'পাতার সংখà§à¦¯à¦¾',
+'pageinfo-category-subcats' => 'উপবিষয়শà§à¦°à§‡à¦£à§€à¦° সংখà§à¦¯à¦¾',
+'pageinfo-category-files' => 'ফাইলের সংখà§à¦¯à¦¾',
# Skin names
'skinname-standard' => 'কà§à¦²à¦¾à¦¸à¦¿à¦•',
@@ -2871,6 +2902,7 @@ $1',
'file-nohires' => 'à¦à¦° চেয়ে বেশি রেজোলিউশন লভà§à¦¯ নয়।',
'svg-long-desc' => 'SVG ফাইল, সাধারণত $1 × $2 pixels, ফাইলের আকার: $3',
'svg-long-desc-animated' => 'à¦à¦¨à¦¿à¦®à§‡à¦Ÿà§‡à¦¡ SVG ফাইল, সাধারণত $1 × $2 pixels, ফাইলের আকার: $3',
+'svg-long-error' => 'অবৈধ SVG ফাইল: $1',
'show-big-image' => 'পূরà§à¦£ রেজোলিউশন',
'show-big-image-preview' => 'à¦à¦‡ পà§à¦°à¦¿à¦­à¦¿à¦‰-à¦à¦° আকার: $1।',
'show-big-image-other' => 'অনà§à¦¯à¦¾à¦¨à§à¦¯ {{PLURAL:$2|আকার|আকারসমূহ}}: $1।',
@@ -2901,7 +2933,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 মিনিট|$1 মিনিট}}',
'hours' => '{{PLURAL:$1|$1 ঘণà§à¦Ÿà¦¾|$1 ঘণà§à¦Ÿà¦¾}}',
'days' => '{{PLURAL:$1|$1 দিন|$1 দিন}}',
+'months' => '{{PLURAL:$1|$1 মাস}}',
+'years' => '{{PLURAL:$1|$1 বছর}}',
'ago' => '$1 আগে',
+'just-now' => 'à¦à¦–নই',
# Bad image list
'bad_image_list' => 'ফরমà§à¦¯à¦¾à¦Ÿà¦Ÿà¦¿ à¦à¦°à¦•à¦®:
@@ -3359,6 +3394,7 @@ $4-ঠনিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি মেয়াদোতà§
# Scary transclusion
'scarytranscludedisabled' => '[আনà§à¦¤à¦ƒà¦‰à¦‡à¦•à¦¿ আনà§à¦¤à¦ƒà¦­à§à¦•à§à¦¤à¦¿ নিষà§à¦•à§à¦°à¦¿à¦¯à¦¼]',
'scarytranscludefailed' => '[$1 à¦à¦° জনà§à¦¯ টেমপà§à¦²à§‡à¦Ÿ আনা অসফল হয়েছে]',
+'scarytranscludefailed-httpstatus' => '[$1: HTTP $2 à¦à¦° জনà§à¦¯ টেমপà§à¦²à§‡à¦Ÿ আনা বিফল হয়েছে]',
'scarytranscludetoolong' => '[URL অতিরিকà§à¦¤ দীরà§à¦˜]',
# Delete conflict
@@ -3582,15 +3618,16 @@ $4-ঠনিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি মেয়াদোতà§
# New logging system
'logentry-delete-delete' => '$1 করà§à¦¤à§ƒà¦• $3 পাতাটি অপসারিত হয়েছে',
-'logentry-delete-restore' => '$1 করà§à¦¤à§ƒà¦• $3 পাতাটি ফিরিয়ে আনা হয়েছে',
-'logentry-delete-event' => '$1 {{PLURAL:$5|à¦à¦•à¦Ÿà¦¿ লগ ইভেনà§à¦Ÿà§‡à¦°|$5 লগ ইভেনà§à¦Ÿà¦¸à¦®à§‚হর}} ভিজিবিলিটি পরিবরà§à¦¤à¦¨ করেছেন $3: $4',
-'logentry-delete-revision' => '$1 {{PLURAL:$5|à¦à¦•à¦Ÿà¦¿ সংসà§à¦•à¦°à¦£à§‡à¦°|$5 সংসà§à¦•à¦°à¦£à¦¸à¦®à§‚হর}} ভিজিবিলিটি পরিবরà§à¦¤à¦¨ করেছেন $3: $4',
-'logentry-delete-event-legacy' => '$1 $3টায় লগ ইভেনà§à¦Ÿà¦¸à¦®à§‚হরে ভিজিবিলিটি পরিবরà§à¦¤à¦¨ করেছেন',
-'logentry-delete-revision-legacy' => '$1 $3টায় সংসà§à¦•à¦°à¦£à¦¸à¦®à§‚হরে ভিজিবিলিটি পরিবরà§à¦¤à¦¨ করেছেন',
-'logentry-suppress-event' => '$1 গোপনে {{PLURAL:$5|à¦à¦•à¦Ÿà¦¿ লগ ইভেনà§à¦Ÿà§‡à¦°|$5 লগ ইভেনà§à¦Ÿà¦¸à¦®à§‚হর}} ভিজিবিলিটি পরিবরà§à¦¤à¦¨ করেছেন $3: $4',
-'logentry-suppress-revision' => '$1 গোপনে {{PLURAL:$5|à¦à¦•à¦Ÿà¦¿ সংসà§à¦•à¦°à¦£à§‡à¦°|$5 সংসà§à¦•à¦°à¦£à¦¸à¦®à§‚হর}} ভিজিবিলিটি পরিবরà§à¦¤à¦¨ করেছেন $3: $4',
-'logentry-suppress-event-legacy' => '$1 গোপনে $3টায় লগ ইভেনà§à¦Ÿà¦¸à¦®à§‚হরে ভিজিবিলিটি পরিবরà§à¦¤à¦¨ করেছেন',
-'logentry-suppress-revision-legacy' => '$1 গোপনে $3টায় সংসà§à¦•à¦°à¦£à¦¸à¦®à§‚হরে ভিজিবিলিটি পরিবরà§à¦¤à¦¨ করেছেন',
+'logentry-delete-restore' => '$1 করà§à¦¤à§ƒà¦• $3 পাতাটি {{GENDER:$2|ফিরিয়ে আনা}} হয়েছে',
+'logentry-delete-event' => '$1 {{PLURAL:$5|à¦à¦•à¦Ÿà¦¿ লগ ইভেনà§à¦Ÿà§‡à¦°|$5 লগ ইভেনà§à¦Ÿà¦¸à¦®à§‚হের}} ভিজিবিলিটি {{GENDER:$2|পরিবরà§à¦¤à¦¨}} করেছেন $3: $4',
+'logentry-delete-revision' => '$1 {{PLURAL:$5|à¦à¦•à¦Ÿà¦¿ সংসà§à¦•à¦°à¦£à§‡à¦°|$5 সংসà§à¦•à¦°à¦£à¦¸à¦®à§‚হের}} ভিজিবিলিটি {{GENDER:$2|পরিবরà§à¦¤à¦¨}} করেছেন $3: $4',
+'logentry-delete-event-legacy' => '$1 $3টায় লগ ইভেনà§à¦Ÿà¦¸à¦®à§‚হের ভিজিবিলিটি {{GENDER:$2|পরিবরà§à¦¤à¦¨}} করেছেন',
+'logentry-delete-revision-legacy' => '$1 $3টায় সংসà§à¦•à¦°à¦£à¦¸à¦®à§‚হের ভিজিবিলিটি {{GENDER:$2|পরিবরà§à¦¤à¦¨}} করেছেন',
+'logentry-suppress-delete' => '$1 করà§à¦¤à§ƒà¦• $3 পাতাটি {{GENDER:$2|ফিরিয়ে আনা}} হয়েছে',
+'logentry-suppress-event' => '$1 গোপনে {{PLURAL:$5|à¦à¦•à¦Ÿà¦¿ লগ ইভেনà§à¦Ÿà§‡à¦°|$5 লগ ইভেনà§à¦Ÿà¦¸à¦®à§‚হের}} ভিজিবিলিটি {{GENDER:$2|পরিবরà§à¦¤à¦¨}} করেছেন $3: $4',
+'logentry-suppress-revision' => '$1 গোপনে {{PLURAL:$5|à¦à¦•à¦Ÿà¦¿ সংসà§à¦•à¦°à¦£à§‡à¦°|$5 সংসà§à¦•à¦°à¦£à¦¸à¦®à§‚হের}} ভিজিবিলিটি {{GENDER:$2|পরিবরà§à¦¤à¦¨}} করেছেন $3: $4',
+'logentry-suppress-event-legacy' => '$1 গোপনে $3টায় লগ ইভেনà§à¦Ÿà¦¸à¦®à§‚হের ভিজিবিলিটি {{GENDER:$2|পরিবরà§à¦¤à¦¨}} করেছেন',
+'logentry-suppress-revision-legacy' => '$1 গোপনে $3টায় সংসà§à¦•à¦°à¦£à¦¸à¦®à§‚হের ভিজিবিলিটি {{GENDER:$2|পরিবরà§à¦¤à¦¨}} করেছেন',
'revdelete-content-hid' => 'বিষয়বসà§à¦¤à§ লà§à¦•à¦¾à¦¯à¦¼à¦¿à¦¤',
'revdelete-summary-hid' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ সারাংশ লà§à¦•à¦¾à¦¯à¦¼à¦¿à¦¤',
'revdelete-uname-hid' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম লà§à¦•à¦¾à¦¯à¦¼à¦¿à¦¤',
@@ -3599,17 +3636,20 @@ $4-ঠনিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি মেয়াদোতà§
'revdelete-uname-unhid' => 'বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ নাম পà§à¦°à¦¦à¦°à§à¦¶à¦¿à¦¤',
'revdelete-restricted' => 'à¦à¦‡ সীমাবদà§à¦§à¦¤à¦¾ পà§à¦°à¦¶à¦¾à¦¸à¦•à§‡à¦° কà§à¦·à§‡à¦¤à§à¦°à§‡ পà§à¦°à¦¯à¦¼à§‹à¦— করো',
'revdelete-unrestricted' => 'à¦à¦‡ সীমাবদà§à¦§à¦¤à¦¾ পà§à¦°à¦¶à¦¾à¦¸à¦•à§‡à¦° কà§à¦·à§‡à¦¤à§à¦°à§‡ তà§à¦²à§‡ নাও',
-'logentry-move-move' => '$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-patrol-patrol' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ $3 পাতার $4 নমà§à¦¬à¦° সংসà§à¦•à¦°à¦£ পরীকà§à¦·à¦¿à¦¤ বলে চিহà§à¦¨à¦¿à¦¤ করেছেন',
-'logentry-patrol-patrol-auto' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ $3 পাতার $4 নমà§à¦¬à¦° সংসà§à¦•à¦°à¦£ পরীকà§à¦·à¦¿à¦¤ বলে চিহà§à¦¨à¦¿à¦¤ করেছেন',
-'logentry-newusers-newusers' => '$1 অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦Ÿà¦¿ তৈরি করা হয়েছে',
-'logentry-newusers-create' => '$1 অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦Ÿà¦¿ তৈরী করা হয়েছে',
-'logentry-newusers-create2' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ $3 নামের অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦Ÿà¦¿ তৈরী করেছেন',
-'logentry-newusers-autocreate' => '$1 অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦Ÿà¦¿ সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ তৈরি হয়েছে',
-'newuserlog-byemail' => 'শবà§à¦¦à¦šà¦¾à¦¬à¦¿ ইমেইলের মাধà§à¦¯à¦®à§‡ পাঠানো হয়েছে',
+'logentry-move-move' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ $3 পাতাটিকে $4 শিরোনামে {{GENDER:$2|সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°}} করেছেন',
+'logentry-move-move-noredirect' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ $3 পাতাটিকে $4 শিরোনামে কোনো পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾ ছাড়াই {{GENDER:$2|সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°}} করেছেন',
+'logentry-move-move_redir' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ $3 পাতাটিকে $4 শিরোনামে পà§à¦¨à¦¿à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾à¦° মাধà§à¦¯à¦®à§‡ {{GENDER:$2|সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°}} করেছেন',
+'logentry-move-move_redir-noredirect' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ $3 পাতাটিকে $4 শিরোনামে পà§à¦¨à¦°à§à¦¨à¦¿à¦°à§à¦¦à§‡à¦¶à¦¨à¦¾ ছাড়াই {{GENDER:$2|সà§à¦¥à¦¾à¦¨à¦¾à¦¨à§à¦¤à¦°}} করেছেন',
+'logentry-patrol-patrol' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ $3 পাতার $4 নমà§à¦¬à¦° সংসà§à¦•à¦°à¦£ পরীকà§à¦·à¦¿à¦¤ বলে {{GENDER:$2|চিহà§à¦¨à¦¿à¦¤}} করেছেন',
+'logentry-patrol-patrol-auto' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ $3 পাতার $4 নমà§à¦¬à¦° সংসà§à¦•à¦°à¦£ পরীকà§à¦·à¦¿à¦¤ বলে {{GENDER:$2|চিহà§à¦¨à¦¿à¦¤}} করেছেন',
+'logentry-newusers-newusers' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦Ÿà¦¿ {{GENDER:$2|তৈরি করা}} হয়েছে',
+'logentry-newusers-create' => '$1 অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦Ÿà¦¿ {{GENDER:$2|তৈরী করা}} হয়েছে',
+'logentry-newusers-create2' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€ $3 নামের অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦Ÿà¦¿ {{GENDER:$2|তৈরী}} করেছেন',
+'logentry-newusers-byemail' => '$1, $3 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦°à§€ অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦Ÿà¦¿ {{GENDER:$2|তৈরী করেছেন}} à¦à¦¬à¦‚ পাসওয়ারà§à¦¡ ইমেইলের মাধà§à¦¯à¦®à§‡ পাঠানো হয়েছে',
+'logentry-newusers-autocreate' => '$1 অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦Ÿà¦¿ সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ {{GENDER:$2|তৈরি}} হয়েছে',
+'logentry-rights-rights' => '$1 বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§€, $3 à¦à¦° দলগত সদসà§à¦¯à¦ªà¦¦ $4 থেকে $5 ঠ{{GENDER:$2|পরিবরà§à¦¤à¦¨}} করেছেন',
+'logentry-rights-autopromote' => '$1 সয়ংকà§à¦°à¦¿à¦¯à¦¼à¦­à¦¾à¦¬à§‡ $4 থেকে $5 ঠ{{GENDER:$2|উনà§à¦¨à§€à¦¤}} হয়েছে',
+'rightsnone' => '(কিছৠনাই)',
# Feedback
'feedback-subject' => 'বিষয়:',
@@ -3661,6 +3701,7 @@ $4-ঠনিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি মেয়াদোতà§
'api-error-ok-but-empty' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: সারà§à¦­à¦¾à¦° হতে কোন সাড়া পাওয়া যাচà§à¦›à§‡ না।',
'api-error-overwrite' => 'ইতিমধà§à¦¯à§‡à¦‡ রয়েছে à¦à¦®à¦¨ কোনো ফাইলের পà§à¦°à¦¤à¦¿à¦¸à§à¦¥à¦¾à¦ªà¦¨ গà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ নয়।',
'api-error-stashfailed' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦£ তà§à¦°à§à¦Ÿà¦¿: সারà§à¦­à¦¾à¦° অসà§à¦¥à¦¾à¦¯à¦¼à§€ ফাইলটি সংরকà§à¦·à¦£ করতে বà§à¦¯à¦°à§à¦¥ হয়েছে।',
+'api-error-publishfailed' => 'অভà§à¦¯à¦¨à§à¦¤à¦°à§€à¦¨ তà§à¦°à§à¦Ÿà¦¿: সারà§à¦­à¦¾à¦° অসà§à¦¥à¦¾à¦¯à¦¼à§€ ফাইলটি পà§à¦°à¦•à¦¾à¦¶ করতে বà§à¦¯à¦°à§à¦¥ হয়েছে।',
'api-error-timeout' => 'কাঙà§à¦–িত সময়ের মধà§à¦¯à§‡ সারà§à¦­à¦¾à¦°à§‡à¦° কোন সাড়া পাওয়া যায়নি।',
'api-error-unclassified' => 'à¦à¦•à¦Ÿà¦¿ অজানা তà§à¦°à§à¦Ÿà¦¿ দেখা দিয়েছে',
'api-error-unknown-code' => 'অজানা তà§à¦°à§à¦Ÿà¦¿: "$1"',
@@ -3681,4 +3722,7 @@ $4-ঠনিশà§à¦šà¦¿à¦¤à¦•à¦°à¦£ কোডটি মেয়াদোতà§
'duration-centuries' => '$1 {{PLURAL:$1|শতাবà§à¦¦à§€|শতাবà§à¦¦à§€}}',
'duration-millennia' => '$1 {{PLURAL:$1|সহসà§à¦°à¦¾à¦¬à§à¦¦|সহসà§à¦°à¦¾à¦¬à§à¦¦}}',
+# Image rotation
+'rotate-comment' => 'ছবিটি ঘড়ির কাটার দিকে $1 {{PLURAL:$1|ডিগà§à¦°à¦¿}} ঘà§à¦°à¦¾à¦¨à§‹ হয়েছে',
+
);
diff --git a/languages/messages/MessagesBo.php b/languages/messages/MessagesBo.php
index 8d242fbb..d6ff3db0 100644
--- a/languages/messages/MessagesBo.php
+++ b/languages/messages/MessagesBo.php
@@ -144,7 +144,6 @@ $messages = array(
'qbfind' => 'འཚོལ་བà¼',
'qbedit' => 'རྩོམ་སྒྲིག',
'qbpageoptions' => 'ཤོག་ངོས་འདིà¼',
-'qbpageinfo' => 'འབྲེལ་ཆགསà¼',
'qbmyoptions' => 'ངའི་ཤོག་ངོསà¼',
'qbspecialpages' => 'དམིཊ་བསལ་གྱི་བཟོ་བཅོསà¼',
'faq' => 'རྒྱུན་ལྡན་དྲི་བà¼',
@@ -532,7 +531,6 @@ $messages = array(
# User rights log
'rightslog' => 'སྤྱོད་མིའི་à½à½¼à½–་à½à½„་à¼',
-'rightsnone' => '(སྟོང་པà¼)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ཤོག་ངོས་འདི་ཀློག་པà¼',
@@ -702,9 +700,8 @@ $messages = array(
'unwatching' => 'ལྟ་à½à½¼à¼‹à½£à½¦à¼‹à½ à½‘ོར་བཞིན་པ་་་',
'enotif_reset' => 'ཤོག་ངོས་ཚང་མ་བལྟས་ཟིན་དུ་རྟགས་རྒྱོབà¼',
-'enotif_newpagetext' => 'ཤོག་ངོས་འདི་གསར་བ་རེདà¼',
-'changed' => 'བསྒྱུར་ཟིནà¼',
'created' => 'བཟོས་ཟིནà¼',
+'changed' => 'བསྒྱུར་ཟིནà¼',
# Delete
'deletepage' => 'ཤོག་ངོས་འདོར་བà¼',
@@ -881,4 +878,7 @@ $messages = array(
# Special:SpecialPages
'specialpages' => 'དམིགས་གསལ་ཤོག་ངོསà¼',
+# New logging system
+'rightsnone' => '(སྟོང་པà¼)',
+
);
diff --git a/languages/messages/MessagesBpy.php b/languages/messages/MessagesBpy.php
index b4962209..6b088dba 100644
--- a/languages/messages/MessagesBpy.php
+++ b/languages/messages/MessagesBpy.php
@@ -13,19 +13,6 @@
$fallback = 'bn';
-$digitTransformTable = array(
- '0' => '০',
- '1' => '১',
- '2' => '২',
- '3' => '৩',
- '4' => '৪',
- '5' => '৫',
- '6' => '৬',
- '7' => '৭',
- '8' => '৮',
- '9' => '৯'
-);
-
$namespaceNames = array(
NS_MEDIA => 'মিডিয়া',
NS_SPECIAL => 'বিশেষ',
@@ -45,6 +32,19 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'থাকর_য়à§à¦¯à¦¾à¦°à§€',
);
+$digitTransformTable = array(
+ '0' => '০',
+ '1' => '১',
+ '2' => '২',
+ '3' => '৩',
+ '4' => '৪',
+ '5' => '৫',
+ '6' => '৬',
+ '7' => '৭',
+ '8' => '৮',
+ '9' => '৯'
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'লিঙà§à¦•à¦° তলে দà§à¦°à¦— দিক:',
@@ -190,7 +190,6 @@ $messages = array(
'qbbrowse' => 'বà§à¦²à¦¿à¦¯à¦¼à¦¾ চা',
'qbedit' => 'পতানি',
'qbpageoptions' => 'পাতা à¦à¦¹à¦¾à¦¨à¦° সারà§à¦•',
-'qbpageinfo' => 'পাতা à¦à¦¹à¦¾à¦¨à¦° পৌ',
'qbmyoptions' => 'মর পছন',
'qbspecialpages' => 'বিশেষ পাতাহানি',
'faq' => 'আঙলাক',
@@ -434,10 +433,8 @@ $2',
# Login and logout pages
'logouttext' => "'''তি খানি আগে তর à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦¹à¦¾à¦¤à§à¦¤ নিকà§à¦°à¦¿à¦¸à¦¤à¥¤'''
-ঠপরিসà§à¦¥à¦¿à¦¤à¦¿à¦¤ তি বেনাঙল {{SITENAME}} বà§à¦¯à¦¬à¦¹à¦¾à¦° করানি পারর, নাইলে আরাক নাঙল [[Special:UserLogin|বারো হমানি]] পারর।
+ঠপরিসà§à¦¥à¦¿à¦¤à¦¿à¦¤ তি বেনাঙল {{SITENAME}} বà§à¦¯à¦¬à¦¹à¦¾à¦° করানি পারর, নাইলে আরাক নাঙল <span class='plainlinks'>[$1 বারো হমানি]</span> পারর।
খিয়াল থ, কোন কোন পাতা তি আগর অংতাত আসত বà§à¦²à¦¿à¦¯à¦¼à¦¾ দেখা দিতে পারে। অসারে ইলে তি বà§à¦°à¦¾à¦“জারর কà§à¦¯à¦¾à¦¶ সেঙকরে বেলা (clear browser cache)।",
-'welcomecreation' => '==সমà§à¦­à¦¾à¦·à¦¾, $1! ==
-তর à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦¹à¦¾à¦¨ হঙিল। তর [[Special:Preferences|{{SITENAME}} পছনহান]] সিলানি না পাহà§à¦°à¦¿à¦¸à¥¤',
'yourname' => 'আতাকà§à¦°à¦¾à¦° নাংহান (Username)',
'yourpassword' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿à¦— (password)',
'yourpasswordagain' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿à¦— (password) আরাকমৠইকর',
@@ -696,7 +693,6 @@ $2',
'template-protected' => '(লà§à¦•à¦°à¦¿à¦¸à¦¿)',
'template-semiprotected' => '(আধা-কাচা লà§à¦•à¦°à¦¿à¦¸à¦¿)',
'hiddencategories' => 'ঠপাতা à¦à¦¹à¦¾à¦¨ যে {{PLURAL:$1|১ নাফঙিসে বিষয়থাকর|$1 নাফঙিসে বিষয়থাকহানির}} সদসà§à¦¯:',
-'nocreatetitle' => 'পাতা হঙকরানি নিয়নà§à¦¤à§à¦°à¦£ করানি অসে',
'nocreatetext' => '{{SITENAME}}-à¦à¦°à§‡ নà§à§±à¦¾ পাতা à¦à¦¹à¦¾à¦¨à¦° পতানিহানাত থিতপা আসে।
তি আলথকে গিয়া আসে হের পাতা সিলকরানি পারর, নাইলে [[Special:UserLogin|অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦¹à¦¾à¦¨à¦¾à¦¤ হমানি বারো অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ খà§à¦²à§‡ পারর]]।',
'nocreate-loggedin' => 'তরতা নà§à§±à¦¾ পাতা হঙকরানির য়à§à¦¯à¦¾à¦¥à¦¾à¦‚ নেই।',
@@ -967,9 +963,11 @@ $2',
'grouppage-sysop' => '{{ns:project}}:পà§à¦°à¦¶à¦¾à¦¸à¦•à¦—ি',
+# Special:Log/newusers
+'newuserlogpage' => 'আতাকà§à¦°à¦¾ হঙসে লগহানি',
+
# User rights log
'rightslog' => 'আতাকà§à¦°à¦¾à¦° অধিকারর লগ',
-'rightsnone' => '(নেই)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'পাতা à¦à¦¹à¦¾à¦¨ পাকর',
@@ -1235,9 +1233,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Special:ActiveUsers
'activeusers-noresult' => 'আতাকà§à¦°à¦¾ নাপেইলাং।',
-# Special:Log/newusers
-'newuserlogpage' => 'আতাকà§à¦°à¦¾ হঙসে লগহানি',
-
# Special:ListGroupRights
'listgrouprights-key' => '* <span class="listgrouprights-granted">য়à§à¦¯à¦¾à¦¥à¦¾à¦‚ পাসে অধিকার</span>
* <span class="listgrouprights-revoked">থেপকরানি অসে অধিকার</span>',
@@ -1733,7 +1728,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
# New logging system
'revdelete-restricted' => 'ডানà§à¦¡à¦¿à¦•à¦°à§‡à¦•à§à¦°à¦¾à¦—রাঙ সীমাবদà§à¦§à¦¤à¦¾à¦¹à¦¾à¦¨à¦¿ ফলা',
'revdelete-unrestricted' => 'ডানà§à¦¡à¦¿à¦•à¦°à§‡à¦•à§à¦°à¦¾à¦—রাঙ সীমাবদà§à¦§à¦¤à¦¾à¦¹à¦¾à¦¨à¦¿ নেইকর',
-'newuserlog-byemail' => 'ই-মেইলর মা পেঠাদিয়াসি পাসৱারà§à¦¡à¦—',
+'rightsnone' => '(নেই)',
# Search suggestions
'searchsuggest-search' => 'বিসারা',
diff --git a/languages/messages/MessagesBqi.php b/languages/messages/MessagesBqi.php
index 8b843d03..36cac436 100644
--- a/languages/messages/MessagesBqi.php
+++ b/languages/messages/MessagesBqi.php
@@ -15,6 +15,8 @@
$fallback = 'fa';
+$rtl = true;
+
$messages = array(
# User preference toggles
'tog-underline' => 'لینکهای خط به زیر',
diff --git a/languages/messages/MessagesBr.php b/languages/messages/MessagesBr.php
index e6ce4047..afb1966a 100644
--- a/languages/messages/MessagesBr.php
+++ b/languages/messages/MessagesBr.php
@@ -312,6 +312,7 @@ $messages = array(
'newwindow' => '(digeriñ en ur prenestr nevez)',
'cancel' => 'Nullañ',
'moredotdotdot' => "Ha muioc'h c'hoazh...",
+'morenotlisted' => "Ha muioc'h c'hoazh n'int ket rollet...",
'mypage' => 'Ma zammig pajenn',
'mytalk' => "Ma c'haozeadennoù",
'anontalk' => "Kaozeal gant ar chomlec'h IP-mañ",
@@ -323,7 +324,6 @@ $messages = array(
'qbbrowse' => 'Furchal',
'qbedit' => 'Kemmañ',
'qbpageoptions' => 'Pajenn an dibaboù',
-'qbpageinfo' => 'Pajenn gelaouiñ',
'qbmyoptions' => 'Ma dibaboù',
'qbspecialpages' => 'Pajennoù dibar',
'faq' => 'FAG',
@@ -346,6 +346,7 @@ $messages = array(
'namespaces' => 'Esaouennoù anv',
'variants' => 'Adstummoù',
+'navigation-heading' => 'Lañser merdeiñ',
'errorpagetitle' => 'Fazi',
'returnto' => "Distreiñ d'ar bajenn $1.",
'tagline' => 'Eus {{SITENAME}}',
@@ -583,11 +584,10 @@ Setu amañ perak ''$2''.",
# Login and logout pages
'logouttext' => "'''Digevreet oc'h bremañ.'''
-Gallout a rit kenderc'hel da implijout {{SITENAME}} en un doare dizanv, pe [[Special:UserLogin|kevreañ en-dro]] gant an hevelep anv pe un anv all mar fell deoc'h.
+Gallout a rit kenderc'hel da implijout {{SITENAME}} en un doare dizanv, pe <span class='plainlinks'>[$1 kevreañ en-dro]</span> gant an hevelep anv pe un anv all mar fell deoc'h.
Notit mat e c'hallo pajennoù zo kenderc'hel da vezañ diskwelet evel pa vefec'h kevreet c'hoazh, betek ma vo riñset krubuilh ho merdeer ganeoc'h.",
-'welcomecreation' => '== Degemer mat, $1! ==
-
-Krouet eo bet ho kont implijer.
+'welcomeuser' => 'Degemer mat $1 !',
+'welcomecreation-msg' => 'Krouet eo bet ho kont implijer.
Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}}]].',
'yourname' => 'Anv implijer :',
'yourpassword' => 'Ger-tremen :',
@@ -611,7 +611,7 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
'gotaccount' => "Ur gont zo ganeoc'h dija ? '''$1'''.",
'gotaccountlink' => 'Kevreañ',
'userlogin-resetlink' => "Ha disoñjet eo bet ho titouroù kevreañ ganeoc'h ?",
-'createaccountmail' => 'dre bostel',
+'createaccountmail' => 'Dre bostel',
'createaccountreason' => 'Abeg :',
'badretype' => 'Ne glot ket ar gerioù-tremen an eil gant egile.',
'userexists' => "Implijet eo an anv implijer lakaet ganeoc'h dija.
@@ -737,6 +737,7 @@ Ger-tremen da c'hortoz : $2",
'changeemail-oldemail' => "Chomlec'h postel a-vremañ :",
'changeemail-newemail' => "Chomlec'h postel nevez :",
'changeemail-none' => '(hini ebet)',
+'changeemail-password' => 'Ho ker-tremen war {{SITENAME}}:',
'changeemail-submit' => "Cheñch chomlec'h postel",
'changeemail-cancel' => 'Nullañ',
@@ -916,7 +917,6 @@ Enmont diwezhañ ar marilh a ziskouezer amañ a-is evel dave :",
'template-semiprotected' => '(damwarezet)',
'hiddencategories' => "{{PLURAL:$1|1 rummad kuzhet|$1 rummad kuzhet}} m'emañ rollet ar bajenn-mañ :",
'edittools' => '<!-- Diskouezet e vo an destenn kinniget amañ dindan ar sternioù kemmañ ha kargañ. -->',
-'nocreatetitle' => "Strishaet eo bet ar c'hrouiñ pajennoù",
'nocreatetext' => 'Strishaet eo bet an tu da grouiñ pajennoù nevez war {{SITENAME}}.
Gallout a rit mont war-gil ha lakaat kemmañ ur bajenn zo anezhi dija, pe [[Special:UserLogin|en em enrollañ ha krouiñ ur gont]].',
'nocreate-loggedin' => "N'oc'h ket aotreet da grouiñ pajennoù nevez.",
@@ -941,6 +941,15 @@ Diverket eo bet evit doare.',
'edit-already-exists' => "N'eus ket bet gallet krouiñ ur bajenn nevez.
Krouet e oa bet c'hoazh.",
'defaultmessagetext' => 'Testenn dre ziouer',
+'content-failed-to-parse' => "C'hwitet eo dielfennadur endalc'had $2 evit ar patrom $1: $3",
+'invalid-content-data' => "n'eo ket mat roadennoù an endalc'had",
+'content-not-allowed-here' => 'N\'eo ket aotreet an endalc\'had "$1" er bajenn [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitestenn',
+'content-model-text' => 'testenn blaen',
+'content-model-javascript' => 'Javascript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "Diwallit : Re a c'halvoù koustus e-keñver an arc'hwelioù parser zo gant ar bajenn-mañ.
@@ -1301,8 +1310,8 @@ Setu aze un dalvoudenn ganet dre zegouezh hag a c'hallfec'h implijout : $1",
'prefs-emailconfirm-label' => 'Kadarnaat ar postel :',
'prefs-textboxsize' => 'Ment ar prenestr skridaozañ',
'youremail' => 'Postel :',
-'username' => 'Anv implijer :',
-'uid' => 'Niv. identelezh an implijer :',
+'username' => '{{GENDER:$1|Anv implijer|Anv implijerez}}:',
+'uid' => '{{GENDER:$1|Niv. identelezh an implijer|Niv. identelezh an implijerez}}:',
'prefs-memberingroups' => 'Ezel eus {{PLURAL:$1|ar strollad|ar strolladoù}}:',
'prefs-registration' => 'Deiziad enskrivañ :',
'yourrealname' => 'Anv gwir*',
@@ -1453,12 +1462,13 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
'right-sendemail' => "Kas ur postel d'an implijerien all",
'right-passwordreset' => 'Gwelet ar posteloù assevel gerioù-tremen',
+# Special:Log/newusers
+'newuserlogpage' => "Marilh ar c'hontoù krouet",
+'newuserlogpagetext' => "Marilh krouiñ ar c'hontoù implijer.",
+
# User rights log
'rightslog' => 'Marilh statud an implijerien',
'rightslogtext' => "Setu marilh ar c'hemmoù statud bet c'hoarvezet d'an implijerien.",
-'rightslogentry' => '{{Gender:.|en|he}} deus cheñchet gwirioù an {{Gender:.|implijer|implijerez}} $1 a oa $2 hag a zo bet lakaet da $3',
-'rightslogentry-autopromote' => 'zo bet anvet ent emgefre a $2 da $3',
-'rightsnone' => '(netra)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lenn ar bajenn-mañ',
@@ -1698,6 +1708,7 @@ Ma talc'h ar gudenn, kit e darempred gant [[Special:ListUsers/sysop|merourien ar
'backend-fail-notsame' => "Ur restr disheñvel zo e $1 c'hoazh.",
'backend-fail-invalidpath' => "$1 n'eo ket un hent stokañ reizh.",
'backend-fail-delete' => 'Dibosupl eo diverkañ ar restr $1.',
+'backend-fail-describe' => 'N\'eus ket bet gallet cheñch ar metaroadennoù evit ar restr "$1".',
'backend-fail-alreadyexists' => 'Ar restr "$1" zo anezhi c\'hoazh.',
'backend-fail-store' => 'Dibosupl stokañ ar restr $1 e $2.',
'backend-fail-copy' => 'Dibosupl eilañ ar restr "$1" war-du "$2".',
@@ -1930,6 +1941,9 @@ Marteze a-walc'h e fell deoc'h kemmañ an deskrivadur anezhi war ar [$2 bajenn d
Padal e tlefent kas war-eeun d'an danvez anezho.<br />
Sellet e vez ouzh ur bajenn evel ouzh ur bajenn disheñvelout ma ra gant ur patrom liammet ouzh [[MediaWiki:Disambiguationspage]]",
+'pageswithprop-prop' => 'Anv ar perzh :',
+'pageswithprop-submit' => 'Mont',
+
'doubleredirects' => 'Adkasoù doubl',
'doubleredirectstext' => 'Rollañ a ra ar bajenn-mañ ar pajennoù a adkas da bajennoù adkas all.
War bep linenn ez eus liammoù war-du pajennoù an adkas kentañ hag en eil adkas, hag ivez war-du pajenn-dal an eil adkas zo sañset bezañ ar pal "gwirion" a zlefe an adkas kentañ kas di.
@@ -2084,7 +2098,7 @@ Gwelet ivez ar [[Special:WantedCategories|rummadoù goulennet a vank]].',
'linksearch-ok' => 'Klask',
'linksearch-text' => 'Gallout a reer implijout arouezennoù "joker" evel, da skouer, "*.wikipedia.org".
Rekis eo dezho un domani a-us da nebeutañ evel, da skouer, "*.org".<br />
-Protokoloù skoret : <code>$1</code> (defaults to http:// na lakait hini ebet eus ar re-se en ho klask)',
+{{PLURAL:$2|Protokol|Protokoloù}} skoret : <code>$1</code> (defaults to http:// na lakait hini ebet eus ar re-se en ho klask).',
'linksearch-line' => '$1 gant ul liamm adal $2',
'linksearch-error' => "N'hall an arouezennoù joker bezañ implijet nemet e deroù anv domani an ostiz.",
@@ -2103,10 +2117,6 @@ Protokoloù skoret : <code>$1</code> (defaults to http:// na lakait hini ebet eu
'activeusers-hidesysops' => 'Kuzhat ar verourien',
'activeusers-noresult' => "N'eus bet kavet implijer ebet.",
-# Special:Log/newusers
-'newuserlogpage' => "Marilh ar c'hontoù krouet",
-'newuserlogpagetext' => "Marilh krouiñ ar c'hontoù implijer.",
-
# Special:ListGroupRights
'listgrouprights' => 'Gwirioù ar strolladoù implijer',
'listgrouprights-summary' => 'Da-heul ez eus ur roll eus ar strolladoù implijerien termenet war ar wiki-mañ, gant ar gwirioù moned stag outo.
@@ -2204,11 +2214,7 @@ Amañ e vo rollet ar c\'hemmoù da zont evit ar bajenn-mañ hag ar bajenn gaozea
'enotif_mailer' => 'Posteler Kemenn {{SITENAME}}',
'enotif_reset' => 'Merkañ an holl bajennoù evel gwelet',
-'enotif_newpagetext' => 'Ur bajenn nevez eo homañ.',
'enotif_impersonal_salutation' => 'implijer {{SITENAME}}',
-'changed' => 'kemmet',
-'created' => 'Krouet',
-'enotif_subject' => '$CHANGEDORCREATED eo bet pajenn $PAGETITLE {{SITENAME}} gant $PAGEEDITOR',
'enotif_lastvisited' => 'Sellet ouzh $1 evit gwelet an holl gemmoù abaoe ho selladenn ziwezhañ.',
'enotif_lastdiff' => "Gwelet $1 evit sellet ouzh ar c'hemm-mañ.",
'enotif_anon_editor' => 'implijer dizanv $1',
@@ -2241,6 +2247,8 @@ $UNWATCHURL
Evezhiadennoù ha skoazell pelloc\'h :
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'Krouet',
+'changed' => 'kemmet',
# Delete
'deletepage' => 'Diverkañ ur bajenn',
@@ -2391,7 +2399,8 @@ Ma'z eus bet krouet ur bajenn nevez dezhi an hevelep anv abaoe an diverkadenn, e
'undeletedrevisions' => 'Adsavet {{PLURAL:$1|1 stumm|$1 stumm}}',
'undeletedrevisions-files' => 'Adsavet ez ez eus bet {{PLURAL:$1|1 stumm|$1 stumm}} ha {{PLURAL:$2|1 restr|$2 restr}}',
'undeletedfiles' => '{{PLURAL:$1|1 restr|$1 restr}} adsavet',
-'cannotundelete' => "Dibosupl eo diziverkañ; moarvat eo bet diziverket gant unan bennak all araozoc'h.",
+'cannotundelete' => 'Dibosupl eo diziverkañ:
+$1',
'undeletedpage' => "'''Diziverket eo bet $1'''
Sellit ouzh [[Special:Log/delete|marilh an diverkadennoù]] evit teuler ur sell ouzh an diverkadennoù diwezhañ.",
@@ -2422,7 +2431,7 @@ $1',
'blanknamespace' => '(Pennañ)',
# Contributions
-'contributions' => 'Degasadennoù an implijer',
+'contributions' => 'Degasadennoù an {{GENDER:$1|implijer|implijerez}}',
'contributions-title' => 'Degasadennoù an implijer evit $1',
'mycontris' => 'Ma degasadennoù',
'contribsub2' => 'Evit $1 ($2)',
@@ -2815,7 +2824,6 @@ Enrollit ar bajenn war hoc'h urzhiataer ha kargit anezhi amañ.",
# JavaScriptTest
'javascripttest' => 'Amprouadenn JavaScript',
-'javascripttest-disabled' => "N'eo ket bet gweredekaet an arc'hwel-mañ war ar wiki.",
'javascripttest-title' => 'Emeur o seveniñ $1 amprouadenn',
'javascripttest-pagetext-noframework' => 'Miret eo ar bajenn-mañ evit amprouiñ JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Framm amprouiñ "$1" dianav.',
@@ -2961,11 +2969,13 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
'pageinfo-default-sort' => "Alc'hwez rummañ dre ziouer",
'pageinfo-length' => 'Ment ar bajenn (en oktedoù)',
'pageinfo-article-id' => 'Niverenn ar bajenn',
+'pageinfo-language' => 'Yezh ar bajenn',
'pageinfo-robot-policy' => 'Statud al lusker klask',
'pageinfo-robot-index' => "A c'haller menegeriñ",
'pageinfo-robot-noindex' => "Ne c'haller ket menegeriñ",
'pageinfo-views' => 'Niver a weladennoù',
'pageinfo-watchers' => 'Niver a dud o heuliañ',
+'pageinfo-few-watchers' => "Nebeutoc'h eget $1 {{PLURAL:$1|lenner}}",
'pageinfo-redirects-name' => 'Adkas war-zu ar bajenn-mañ',
'pageinfo-subpages-name' => 'Ispajennoù eus ar bajenn-mañ',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|kasadur|kasadurioù}}; $3 {{PLURAL:$3|nann kasaduri|nann kasadurioù}})',
@@ -2980,6 +2990,16 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
'pageinfo-magic-words' => '{{PLURAL:$1|Ger hud |Gerioù hud}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Rumm kuzh|Rummoù kuzh}} ($1)',
'pageinfo-templates' => "{{PLURAL:$1|Patrom endalc'het|Patromoù endalc'het}} ($1)",
+'pageinfo-transclusions' => '{{PLURAL:$1|Pajenn|Pajennoù}} treuzkludet war ($1)',
+'pageinfo-toolboxlink' => 'Titouroù ar bajenn',
+'pageinfo-redirectsto' => 'Adkas a ra da',
+'pageinfo-redirectsto-info' => 'Titouroù',
+'pageinfo-contentpage-yes' => 'Ya',
+'pageinfo-protect-cascading-yes' => 'Ya',
+'pageinfo-category-info' => 'Titouroù ar rummad',
+'pageinfo-category-pages' => 'Niver a bajennoù',
+'pageinfo-category-subcats' => 'Niver a isrummadoù',
+'pageinfo-category-files' => 'Niver a restroù',
# Skin names
'skinname-standard' => 'Standard',
@@ -3035,6 +3055,7 @@ Ma vez erounezet ganeoc'h e c'hallje tagañ ho reizhiad.",
'file-nohires' => "N'haller ket gwellaat ar pizhder.",
'svg-long-desc' => 'restr SVG file, pizhder $1 × $2 piksel, ment ar restr : $3',
'svg-long-desc-animated' => 'Restr SVG bev, ment $1 × $2 piksel, ment ar restr: $3',
+'svg-long-error' => 'Restr SVG direizh : $1',
'show-big-image' => 'Pizhder leun',
'show-big-image-preview' => 'Ment ar rakweled-mañ : $1.',
'show-big-image-other' => '{{PLURAL:$2|pizhder all|pizhderioù all}} : $1.',
@@ -3064,7 +3085,10 @@ Ma vez erounezet ganeoc'h e c'hallje tagañ ho reizhiad.",
'minutes' => '{{PLURAL:$1|$1 vunutenn|$1 munutenn}}',
'hours' => '{{PLURAL:$1|$1 eurvezh|$1 eurvezh}}',
'days' => '{{PLURAL:$1|$1 deiz|$1 deiz}}',
+'months' => '{{PLURAL:$1|$1 miz|$1 miz}}',
+'years' => '{{PLURAL:$1|$1 bloaz|$1 bloaz}}',
'ago' => '$1 zo',
+'just-now' => 'bremañ diouzhtu',
# Bad image list
'bad_image_list' => "Setu doare ar furmad :
@@ -3560,6 +3584,7 @@ Mont a raio ar c'hod-mañ d'e dermen d'ar \$4.",
# Scary transclusion
'scarytranscludedisabled' => '[Diweredekaet eo an treuzkludañ etrewiki]',
'scarytranscludefailed' => "[N'eus ket bet gallet tapout ar patrom evit $1]",
+'scarytranscludefailed-httpstatus' => "[c'hwitet adtapout ar patrom evit $1: HTTP $2]",
'scarytranscludetoolong' => '[URL re hir]',
# Delete conflict
@@ -3832,7 +3857,8 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
'logentry-newusers-create' => 'Krouet eo bet ar gont implijer $1',
'logentry-newusers-create2' => 'Gant $1 eo bet krouet ar gont implijer $3',
'logentry-newusers-autocreate' => 'Krouet eo bet kont $1 ent emgefre',
-'newuserlog-byemail' => 'ger-tremen kaset dre bostel',
+'logentry-rights-autopromote' => '$1 zo bet anvet ent emgefre a $4 da $5',
+'rightsnone' => '(netra)',
# Feedback
'feedback-bugornote' => "Ma'z oc'h prest da zeskrivañ ur gudenn deknikel dre ar munud e c'hallit [\$1 kemenn un draen].
@@ -3886,6 +3912,7 @@ A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc
'api-error-ok-but-empty' => 'Fazi diabarzh : respont ebet a-berzh ar servijer.',
'api-error-overwrite' => "N'eo ket aotreet frikañ ur restr zo anezhi c'hoazh.",
'api-error-stashfailed' => "Fazi diabarzh : dibosupl d'ar servijer enrollañ ar restr padennek.",
+'api-error-publishfailed' => "Fazi diabarzh : dibosupl d'ar servijer embann ar restr padennek.",
'api-error-timeout' => "N'eo ket bet ar servijer evit respont en termen lakaet.",
'api-error-unclassified' => "C'hoarvezet ez eus ur gudenn dianav.",
'api-error-unknown-code' => 'Fazi dianav : "$1"',
diff --git a/languages/messages/MessagesBrh.php b/languages/messages/MessagesBrh.php
index db3def56..089112cd 100644
--- a/languages/messages/MessagesBrh.php
+++ b/languages/messages/MessagesBrh.php
@@ -331,6 +331,9 @@ Ná radbadal ák deskáne atíko matano.",
'grouppage-sysop' => '{{ns:project}}:Amaldár ák',
+# Special:Log/newusers
+'newuserlogpage' => 'Kárband joŕ kanning ná hisáb',
+
# User rights log
'rightslog' => 'Kárband hakk hisáb',
@@ -434,9 +437,6 @@ Ná radbadal ák deskáne atíko matano.",
# Special:LinkSearch
'linksearch' => 'Darí gańđ',
-# Special:Log/newusers
-'newuserlogpage' => 'Kárband joŕ kanning ná hisáb',
-
# Special:ListGroupRights
'listgrouprights-members' => '(básk átá ridoband)',
diff --git a/languages/messages/MessagesBs.php b/languages/messages/MessagesBs.php
index 1f436b12..705a2012 100644
--- a/languages/messages/MessagesBs.php
+++ b/languages/messages/MessagesBs.php
@@ -115,7 +115,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'NedavneIzmjene' ),
'Recentchangeslinked' => array( 'PovezaneNedavneIzmjene' ),
'Revisiondelete' => array( 'VratiBrisanje' ),
- 'RevisionMove' => array( 'PremjestanjeRevizije' ),
'Search' => array( 'Pretraga' ),
'Shortpages' => array( 'KratkeStranice' ),
'Specialpages' => array( 'SpecijalneStranice' ),
@@ -153,7 +152,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__FORSIRANISADRŽAJ__', '__FORCETOC__' ),
'toc' => array( '0', '__SADRŽAJ__', '__TOC__' ),
'noeditsection' => array( '0', '__BEZ_IZMJENA__', '__BEZIZMJENA__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'TRENUTNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'TRENUTNIMJESEC1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'TRENUTNIMJESECIME', 'CURRENTMONTHNAME' ),
@@ -425,7 +423,6 @@ $messages = array(
'qbbrowse' => 'Prelistajte',
'qbedit' => 'Uredi',
'qbpageoptions' => 'Opcije stranice',
-'qbpageinfo' => 'Informacije o stranici',
'qbmyoptions' => 'Moje opcije',
'qbspecialpages' => 'Posebne stranice',
'faq' => 'ÄŒPP',
@@ -448,6 +445,7 @@ $messages = array(
'namespaces' => 'Imenski prostori',
'variants' => 'Varijante',
+'navigation-heading' => 'Navigacija',
'errorpagetitle' => 'Greška',
'returnto' => 'Povratak na $1.',
'tagline' => 'Izvor: {{SITENAME}}',
@@ -686,10 +684,10 @@ Iz razloga "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Sad ste odjavljeni.'''
-Možete nastaviti da koristite {{SITENAME}} anonimno, ili se ponovo [[Special:UserLogin|prijaviti]] kao isti ili kao drugi korisnik.
+Možete nastaviti da koristite {{SITENAME}} anonimno, ili se ponovo <span class='plainlinks'>[$1 prijaviti]</span> kao isti ili kao drugi korisnik.
Obratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste joÅ¡ uvijek prijavljeni, dok ne oÄistite keÅ¡ svog preglednika.",
-'welcomecreation' => '== Dobro došli, $1 ==
-Vaš nalog je napravljen.
+'welcomeuser' => 'Dobro došli, $1',
+'welcomecreation-msg' => 'Vaš nalog je napravljen.
Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} podešavanja]].',
'yourname' => 'KorisniÄko ime:',
'yourpassword' => 'Å ifra:',
@@ -850,6 +848,7 @@ Privremena Å¡ifra: $2',
'changeemail-oldemail' => 'Trenutna e-mail adresa:',
'changeemail-newemail' => 'Nova e-mail adresa:',
'changeemail-none' => '(ništa)',
+'changeemail-password' => 'Tvoja Å¡ifra/lozinka za {{SITENAME}}:',
'changeemail-submit' => 'Promijeni e-mail',
'changeemail-cancel' => 'Otkaži',
@@ -1039,7 +1038,6 @@ Posljednja stavka zapisnika je prikazana ispod kao referenca:",
'template-semiprotected' => '(polu-zaštićeno)',
'hiddencategories' => 'Ova stranica pripada u {{PLURAL:$1|$1 skrivenu kategoriju|$1 skrivene kategorije|$1 skrivenih kategorija}}:',
'edittools' => '<!-- Ovaj tekst će biti prikazan ispod formi za uređivanje i postavljanje. -->',
-'nocreatetitle' => 'Pravljenje stranica ograniÄeno',
'nocreatetext' => 'Na {{SITENAME}} je zabranjeno postavljanje novih stranica.
Možete se vratiti i ureÄ‘ivati već postojeće stranice ili se [[Special:UserLogin|prijaviti ili otvoriti korisniÄki raÄun]].',
'nocreate-loggedin' => 'Nemate dopuštenje da kreirate nove stranice.',
@@ -1065,6 +1063,11 @@ Izgleda da je obrisana.',
Izgleda da već postoji.',
'defaultmessagetext' => 'UobiÄajeni tekst poruke',
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
# Parser/template warnings
'expensive-parserfunction-warning' => 'Upozorenje: Ova stranica sadrži previše poziva opterećujućih parserskih funkcija.
@@ -1426,9 +1429,9 @@ Ovo se ne može vratiti unazad.',
'prefs-emailconfirm-label' => 'E-mail potvrda:',
'prefs-textboxsize' => 'VeliÄina prozora za ureÄ‘ivanje',
'youremail' => 'E-mail:',
-'username' => 'KorisniÄko ime:',
-'uid' => 'KorisniÄki ID:',
-'prefs-memberingroups' => 'ÄŒlan {{PLURAL:$1|grupe|grupa}}:',
+'username' => '{{GENDER:$1|KorisniÄko}} ime:',
+'uid' => '{{GENDER:$1|KorisniÄki}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|Korisnik|Korisnica}} je Älan {{PLURAL:$1|grupe|grupâ}}:',
'prefs-registration' => 'Vrijeme registracije:',
'yourrealname' => 'Vaše pravo ime:',
'yourlanguage' => 'Jezik:',
@@ -1578,12 +1581,13 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
'right-sendemail' => 'Slanje e-maila drugim korisnicima',
'right-passwordreset' => 'Pogledaj e-mailove za obnavljanje Å¡ifre',
+# Special:Log/newusers
+'newuserlogpage' => 'Zapis novih korisnika',
+'newuserlogpagetext' => 'Ovo je zapis o registraciji novih korisnika.',
+
# User rights log
'rightslog' => 'Zapisnik korisniÄkih prava',
'rightslogtext' => 'Ovo je zapis promjena korisniÄkih prava.',
-'rightslogentry' => 'promjena Älanstva u grupi za $1 sa $2 na $3',
-'rightslogentry-autopromote' => 'je automatski unaprijeđen iz $2 u $3',
-'rightsnone' => '(nema)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'Äitate ovu stranicu',
@@ -2050,6 +2054,8 @@ Prije brisanja provjerite da li druge stranice vode na te Å¡ablone.',
Umjesto toga, one se trebaju povezati sa konkretnim konkretnim stranicom.<br />
Stranica se smatra Ävorom, ukoliko koristi Å¡ablon koji je povezan sa spiskom [[MediaWiki:Disambiguationspage]]",
+'pageswithprop-submit' => 'Idi',
+
'doubleredirects' => 'Dvostruka preusmjerenja',
'doubleredirectstext' => 'Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.
Svaki 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.
@@ -2221,10 +2227,6 @@ Podržani protokoli: <code>$1</code> (ne dodavajte bilo koji od ovih u vašu pre
'activeusers-hidesysops' => 'Sakrij administratore',
'activeusers-noresult' => 'Nije pronađen korisnik.',
-# Special:Log/newusers
-'newuserlogpage' => 'Zapis novih korisnika',
-'newuserlogpagetext' => 'Ovo je zapis o registraciji novih korisnika.',
-
# Special:ListGroupRights
'listgrouprights' => 'Prava korisniÄkih grupa',
'listgrouprights-summary' => 'Slijedi spisak korisniÄkih grupa na ovoj wiki, s njihovim pravima pristupa.
@@ -2321,31 +2323,33 @@ Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti n
'enotif_mailer' => '{{SITENAME}} obaviještenje o pošti',
'enotif_reset' => 'OznaÄi sve strane kao posjećene',
-'enotif_newpagetext' => 'Ovo je novi Älanak.',
'enotif_impersonal_salutation' => '{{SITENAME}} korisnik',
-'changed' => 'promijenjena',
-'created' => 'napravljena',
-'enotif_subject' => '{{SITENAME}} strana $PAGETITLE je bila $CHANGEDORCREATED od strane $PAGEEDITOR',
+'enotif_subject_deleted' => '{{gender:$2|Korisnik|Korisnica}} $2 je {{gender:$2|obrisao|obrisala}} stranicu $1 projekta {{SITENAME}}',
+'enotif_subject_created' => '{{gender:$2|Korisnik|Korisnica}} $2 je {{gender:$2|napravio|napravila}} stranicu $1 projekta {{SITENAME}}',
+'enotif_subject_moved' => '{{gender:$2|Korisnik|Korisnica}} $2 je {{gender:$2|premjestio|premjestila}} stranicu $1 projekta {{SITENAME}}',
+'enotif_subject_restored' => '{{gender:$2|Korisnik|Korisnica}} $2 je {{gender:$2|vratio|vratila}} stranicu $1 projekta {{SITENAME}}',
+'enotif_subject_changed' => '{{gender:$2|Korisnik|Korisnica}} $2 je {{gender:$2|promijenio|promijenila}} stranicu $1 projekta {{SITENAME}}',
+'enotif_body_intro_deleted' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|obrisao|obrisala}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3.',
+'enotif_body_intro_created' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|napravio|napravila}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3 za trenutnu verziju.',
+'enotif_body_intro_moved' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|premjestio|premjestila}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3 za trenutnu verziju.',
+'enotif_body_intro_restored' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|vratio|vratila}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3 za trenutnu verziju.',
+'enotif_body_intro_changed' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|promijenio|promijenila}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3 za trenutnu verziju.',
'enotif_lastvisited' => 'Pogledajte $1 za sve izmjene od vaše posljednje posjete.',
'enotif_lastdiff' => 'Vidi $1 da pregledate ovu promjenu.',
'enotif_anon_editor' => 'anonimni korisnik $1',
'enotif_body' => 'Poštovani $WATCHINGUSERNAME,
-
-Stranica {{SITENAME}} sa naslovom $PAGETITLE je bila $CHANGEDORCREATED dana $PAGEEDITDATE od strane $PAGEEDITOR, pogledajte $PAGETITLE_URL za trenutnu reviziju.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Sažetak urednika: $PAGESUMMARY $PAGEMINOREDIT
Kontaktirajte urednika:
-mail: $PAGEEDITOR_EMAIL
+e-pošta: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Neće biti drugih obavjeÅ¡tenja u sluÄaju daljnjih izmjena osima ako posjetite stranicu.
-Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.
+Neće biti drugih obavjeÅ¡tenja u sluÄaju daljnjih izmjena osima ako posjetite stranicu. TakoÄ‘er možete poniÅ¡titi oznake obavijesti za sve praćene stranice koje imate na vaÅ¡em spisku praćenja.
- Vaš prijateljski {{SITENAME}} sistem obavještavanja
+Vaš prijateljski {{SITENAME}} sistem obavještavanja
--
Za promjenu vaših postavki e-mail obavijesti, posjetite
@@ -2359,6 +2363,8 @@ $UNWATCHURL
Povratne informacije i daljnja pomoć:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'napravljena',
+'changed' => 'promijenjena',
# Delete
'deletepage' => 'Obrišite stranicu',
@@ -2511,8 +2517,8 @@ Možda ste unijeli pogrešan link, ili je revizija vraćena ili uklonjena iz arh
'undeletedrevisions' => '{{PLURAL:$1|$1 revizija vraćena|$1 revizije vraćene|$1 revizija vraćeno}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revizija|$1 revizije|$1 revizija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno',
'undeletedfiles' => '{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}',
-'cannotundelete' => 'Vraćanje nije uspjelo;
-neko drugi je već vratio ovu stranicu.',
+'cannotundelete' => 'Vraćanje nije uspjelo:
+$1',
'undeletedpage' => "'''$1 je vraćena'''
Provjerite [[Special:Log/delete|zapis brisanja]] za zapise najskorijih brisanja i vraćanja.",
@@ -2544,7 +2550,7 @@ $1',
'blanknamespace' => '(Glavno)',
# Contributions
-'contributions' => 'Doprinosi korisnika',
+'contributions' => 'Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}',
'contributions-title' => 'Doprinosi korisnika $1',
'mycontris' => 'Doprinos',
'contribsub2' => 'Za $1 ($2)',
@@ -2950,7 +2956,6 @@ Nedostaje privremeni folder.',
# JavaScriptTest
'javascripttest' => 'Testiranje JavaScript-e',
-'javascripttest-disabled' => 'Ova funkcija je onemogućena na ovom wikiju.',
'javascripttest-title' => 'Pokretanje $1 testova',
'javascripttest-pagetext-noframework' => 'Ova stranica je određena za pokretanje JavaScript testova.',
'javascripttest-pagetext-unknownframework' => 'Nepoznat radni okvir testiranja"$1".',
@@ -3088,6 +3093,7 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
'pageinfo-default-sort' => 'Podrazumijevani kljuÄ sortiranja',
'pageinfo-length' => 'Dužina stranice (u bajtovima)',
'pageinfo-article-id' => 'ID stranice',
+'pageinfo-language' => 'Jezik sadržaja stranice',
'pageinfo-views' => 'Broj pogleda',
'pageinfo-watchers' => 'Broj pratitelja stranice',
'pageinfo-redirects-name' => 'Preusmjeravanja na ovu stranicu',
@@ -3103,6 +3109,13 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
'pageinfo-magic-words' => '{{PLURAL:$1|ÄŒarobna rijeÄ|ÄŒarobne rijeÄi}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|UkljuÄeni Å¡ablon|UkljuÄeni Å¡abloni}} ($1)',
+'pageinfo-toolboxlink' => 'Informacije o stranici',
+'pageinfo-redirectsto' => 'Preusmjerava na',
+'pageinfo-redirectsto-info' => 'Informacije',
+'pageinfo-contentpage' => 'Broji se kao stranica sa sadržajem',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-category-pages' => 'Broj stranica',
# Skin names
'skinname-standard' => 'KlasiÄno',
@@ -3124,6 +3137,8 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
'markedaspatrollederror' => 'Ne može se oznaÄiti kao patrolirano',
'markedaspatrollederrortext' => 'Morate naglasiti reviziju koju treba oznaÄiti kao patroliranu.',
'markedaspatrollederror-noautopatrol' => 'Nije Vam dopuÅ¡teno da vlastite izmjene oznaÄavate patroliranim.',
+'markedaspatrollednotify' => 'Ova izmjena na stranici „$1“ je oznaÄena kao pregledana.',
+'markedaspatrollederrornotify' => 'OznaÄavanje stranice pregledanom nije uspjelo.',
# Patrol log
'patrol-log-page' => 'Zapisnik patroliranja',
@@ -3185,6 +3200,8 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minuta|$1 minute|$1 minuta}}',
'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
+'months' => '{{PLURAL:$1|$1 mjesec|$1 mjeseci}}',
+'years' => '{{PLURAL:$1|$1 godina|$1 godine|$1 godina}}',
'ago' => 'prije $1',
# Bad image list
@@ -3966,8 +3983,17 @@ Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktn
'sqlite-no-fts' => '$1 bez podrške pretrage cijelog teksta',
# New logging system
-'logentry-delete-delete' => '$1 je obrisao stranicu $3',
-'logentry-delete-restore' => '$1 je vratio stranicu $3',
+'logentry-delete-delete' => '$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3',
+'logentry-delete-restore' => '$1 je {{GENDER:$2|vratio|vratila}} stranicu $3',
+'logentry-delete-event' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4',
+'logentry-delete-revision' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4',
+'logentry-delete-event-legacy' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost događaja u evidenciji na $3',
+'logentry-delete-revision-legacy' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost izmjena na stranici $3',
+'logentry-suppress-delete' => '$1 {{GENDER:|je potisnuo|je potisnula}} stranicu $3',
+'logentry-suppress-event' => '$1 je tajno {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4',
+'logentry-suppress-revision' => '$1 je tajno {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4',
+'logentry-suppress-event-legacy' => '$1 je tajno {{GENDER:|promijenio|promijenila}} vidljivost događaja u evidenciji na $3',
+'logentry-suppress-revision-legacy' => '$1 je tajno {{GENDER:|promijenio|promijenila}} vidljivost izmjena na stranici $3',
'revdelete-content-hid' => 'skriveni sadržaj',
'revdelete-summary-hid' => 'sažetak izmjene je sakriven',
'revdelete-uname-hid' => 'sažetak izmjene je sakriven',
@@ -3985,8 +4011,12 @@ Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktn
'logentry-newusers-newusers' => 'KorisniÄki raÄun $1 je napravljen',
'logentry-newusers-create' => 'KorisniÄki raÄun $1 je napravljen',
'logentry-newusers-create2' => '$3 je {{GENDER:$2|napravio|napravila}} korisniÄki raÄun $1',
+'logentry-newusers-byemail' => 'KorisniÄki raÄun $3 je napravio $1 i lozinka/Å¡ifra je poslana putem e-maila',
'logentry-newusers-autocreate' => 'KorisniÄki raÄun $1 je automatski napravljen',
-'newuserlog-byemail' => 'Å¡ifra je poslana putem e-maila',
+'logentry-rights-rights' => '$1 {{GENDER:$1|je promijenio|je promijenila|je promijenio}} Älanstvo grupe za $3 iz $4 u $5',
+'logentry-rights-rights-legacy' => '$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} Älanstvo grupe za $3',
+'logentry-rights-autopromote' => 'KorisniÄkom raÄunu $1 {{GENDER:$1|je automatski promijenjeno Älanstvo|su automatski promijenjena Älanstva}} iz $4 u $5',
+'rightsnone' => '(nema)',
# Feedback
'feedback-bugornote' => 'Ako ste spremni detaljno opisati tehniÄki problem molimo [$1 prijavite "bug" (greÅ¡ku)].
@@ -4040,6 +4070,7 @@ InaÄe, možete ispuniti jednostavan obrazac ispod. VaÅ¡ komentar biti će dodan
'api-error-ok-but-empty' => 'Unutrašnja greška: nema odgovora od servera.',
'api-error-overwrite' => 'Pisanje preko postojeće datoteke nije dopušteno.',
'api-error-stashfailed' => 'Unutrašnja greška: server nije mogao da spremi privremenu datoteku.',
+'api-error-publishfailed' => 'Unutrašnja greška: Server nije uspio objaviti privremenu datoteku.',
'api-error-timeout' => 'Server nije odgovorio unutar oÄekivanog vremena.',
'api-error-unclassified' => 'Desila se nepoznata greška',
'api-error-unknown-code' => 'Nepoznata greška: "$1"',
diff --git a/languages/messages/MessagesBug.php b/languages/messages/MessagesBug.php
index c4003b0d..64eb16bd 100644
--- a/languages/messages/MessagesBug.php
+++ b/languages/messages/MessagesBug.php
@@ -12,7 +12,7 @@
* @author Zaidpjd (on bug.wikipedia.org)
*/
-$fallback = "id";
+$fallback = 'id';
$messages = array(
# Dates
@@ -73,7 +73,6 @@ $messages = array(
'qbbrowse' => 'Berowoso',
'qbedit' => 'Padécéŋ',
'qbpageoptions' => 'Édé leppa',
-'qbpageinfo' => 'Konteks',
'qbmyoptions' => "Leppana iya'",
'qbspecialpages' => 'Leppa spésiala',
'faq' => 'FAQ',
diff --git a/languages/messages/MessagesCa.php b/languages/messages/MessagesCa.php
index 9c1631ce..e7bd3d39 100644
--- a/languages/messages/MessagesCa.php
+++ b/languages/messages/MessagesCa.php
@@ -20,6 +20,7 @@
* @author Jordi Roqué
* @author Juanpabl
* @author Kaganer
+ * @author Marcmpujol
* @author Martorell
* @author McDutchie
* @author Pasqual (ca)
@@ -40,12 +41,6 @@
* @author לערי ריינה×רט
*/
-$bookstoreList = array(
- 'Catàleg Col·lectiu de les Universitats de Catalunya' => 'http://ccuc.cbuc.es/cgi-bin/vtls.web.gateway?searchtype=control+numcard&searcharg=$1',
- 'Totselsllibres.com' => 'http://www.totselsllibres.com/tel/publi/busquedaAvanzadaLibros.do?ISBN=$1',
- 'inherit' => true,
-);
-
$namespaceNames = array(
NS_MEDIA => 'Media',
NS_SPECIAL => 'Especial',
@@ -70,39 +65,6 @@ $namespaceAliases = array(
'Imatge_Discussió' => NS_FILE_TALK,
);
-$separatorTransformTable = array( ',' => '.', '.' => ',' );
-
-$dateFormats = array(
- 'mdy time' => 'H:i',
- 'mdy date' => 'M j, Y',
- 'mdy both' => 'H:i, M j, Y',
-
- 'dmy time' => 'H:i',
- 'dmy date' => 'j M Y',
- 'dmy both' => 'H:i, j M Y',
-
- 'ymd time' => 'H:i',
- 'ymd date' => 'Y M j',
- 'ymd both' => 'H:i, Y M j',
-);
-
-$magicWords = array(
- 'numberofarticles' => array( '1', 'NOMBRED\'ARTICLES', 'NUMBEROFARTICLES' ),
- 'numberoffiles' => array( '1', 'NOMBRED\'ARXIUS', 'NUMBEROFFILES' ),
- 'numberofusers' => array( '1', 'NOMBRED\'USUARIS', 'NUMBEROFUSERS' ),
- 'numberofedits' => array( '1', 'NOMBRED\'EDICIONS', 'NUMBEROFEDITS' ),
- 'pagename' => array( '1', 'NOMDELAPLANA', 'PAGENAME' ),
- 'img_right' => array( '1', 'dreta', 'right' ),
- 'img_left' => array( '1', 'esquerra', 'left' ),
- 'img_border' => array( '1', 'vora', 'border' ),
- 'img_link' => array( '1', 'enllaç=$1', 'link=$1' ),
- 'displaytitle' => array( '1', 'TÃTOL', 'DISPLAYTITLE' ),
- 'language' => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
- 'special' => array( '0', 'especial', 'special' ),
- 'defaultsort' => array( '1', 'ORDENA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'pagesize' => array( '1', 'MIDADELAPLANA', 'PAGESIZE' ),
-);
-
$specialPageAliases = array(
'Activeusers' => array( 'Usuaris_actius' ),
'Allmessages' => array( 'Missatges', 'MediaWiki' ),
@@ -164,7 +126,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Canvis_recents' ),
'Recentchangeslinked' => array( 'Seguiment' ),
'Revisiondelete' => array( 'Esborra_versió' ),
- 'RevisionMove' => array( 'Mou_versió' ),
'Search' => array( 'Cerca' ),
'Shortpages' => array( 'Pàgines_curtes' ),
'Specialpages' => array( 'Pàgines_especials' ),
@@ -194,6 +155,45 @@ $specialPageAliases = array(
'Withoutinterwiki' => array( 'Sense_interwiki' ),
);
+$magicWords = array(
+ 'numberofarticles' => array( '1', 'NOMBRED\'ARTICLES', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NOMBRED\'ARXIUS', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NOMBRED\'USUARIS', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'NOMBRED\'EDICIONS', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'NOMDELAPLANA', 'PAGENAME' ),
+ 'img_right' => array( '1', 'dreta', 'right' ),
+ 'img_left' => array( '1', 'esquerra', 'left' ),
+ 'img_border' => array( '1', 'vora', 'border' ),
+ 'img_link' => array( '1', 'enllaç=$1', 'link=$1' ),
+ 'displaytitle' => array( '1', 'TÃTOL', 'DISPLAYTITLE' ),
+ 'language' => array( '0', '#IDIOMA:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'especial', 'special' ),
+ 'defaultsort' => array( '1', 'ORDENA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'pagesize' => array( '1', 'MIDADELAPLANA', 'PAGESIZE' ),
+);
+
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
+
+$dateFormats = array(
+ 'mdy time' => 'H:i',
+ 'mdy date' => 'M j, Y',
+ 'mdy both' => 'H:i, M j, Y',
+
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j M Y',
+ 'dmy both' => 'H:i, j M Y',
+
+ 'ymd time' => 'H:i',
+ 'ymd date' => 'Y M j',
+ 'ymd both' => 'H:i, Y M j',
+);
+
+$bookstoreList = array(
+ 'Catàleg Col·lectiu de les Universitats de Catalunya' => 'http://ccuc.cbuc.es/cgi-bin/vtls.web.gateway?searchtype=control+numcard&searcharg=$1',
+ 'Totselsllibres.com' => 'http://www.totselsllibres.com/tel/publi/busquedaAvanzadaLibros.do?ISBN=$1',
+ 'inherit' => true,
+);
+
$linkTrail = "/^((?:[a-zàèéíòóúç·ïü]|'(?!'))+)(.*)$/sDu";
$messages = array(
@@ -332,6 +332,7 @@ $messages = array(
'newwindow' => '(obre en una nova finestra)',
'cancel' => 'Cancel·la',
'moredotdotdot' => 'Més...',
+'morenotlisted' => 'Més no en la llista...',
'mypage' => 'Pàgina',
'mytalk' => 'Discussió',
'anontalk' => "Discussió d'aquesta IP",
@@ -343,7 +344,6 @@ $messages = array(
'qbbrowse' => 'Navega',
'qbedit' => 'Modifica',
'qbpageoptions' => 'Opcions de pàgina',
-'qbpageinfo' => 'Informació de pàgina',
'qbmyoptions' => 'Pàgines pròpies',
'qbspecialpages' => 'Pàgines especials',
'faq' => 'PMF',
@@ -366,6 +366,7 @@ $messages = array(
'namespaces' => 'Espais de noms',
'variants' => 'Variants',
+'navigation-heading' => 'Menú de navegació',
'errorpagetitle' => 'Error',
'returnto' => 'Torna cap a $1.',
'tagline' => 'De {{SITENAME}}',
@@ -603,12 +604,11 @@ L\'administrador que l\'ha bloquejat ha donat aquesta explicació: "$3".',
# Login and logout pages
'logouttext' => "'''Heu finalitzat la vostra sessió.'''
-Podeu continuar utilitzant {{SITENAME}} de forma anònima, o podeu [[Special:UserLogin|iniciar una sessió una altra vegada]] amb el mateix o un altre usuari.
+Podeu continuar utilitzant {{SITENAME}} de forma anònima, o podeu <span class='plainlinks'>[$1 iniciar una sessió una altra vegada]</span> amb el mateix o un altre usuari.
Tingueu en compte que algunes pàgines poden continuar mostrant-se com si encara estiguéssiu en una sessió, fins que buideu la memòria cau del vostre navegador.",
-'welcomecreation' => "== Us donem la benvinguda, $1! ==
-
-S'ha creat el vostre compte.
-No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITENAME}}]].",
+'welcomeuser' => 'Benvingut, $1!',
+'welcomecreation-msg' => 'El vostre compte ha estat creat.
+No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITENAME}}]].',
'yourname' => "Nom d'usuari",
'yourpassword' => 'Contrasenya',
'yourpasswordagain' => 'Escriviu una altra vegada la contrasenya',
@@ -631,7 +631,7 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
'gotaccount' => 'Ja teniu un compte? $1.',
'gotaccountlink' => 'Inicia una sessió',
'userlogin-resetlink' => "Heu oblidat les vostres dades d'accés?",
-'createaccountmail' => 'per correu electrònic',
+'createaccountmail' => "Utilitza una contrasenya aleatòria temporal i envia-la a l'adreça de correu electrònic especificat a continuació",
'createaccountreason' => 'Motiu:',
'badretype' => 'Les contrasenyes que heu introduït no coincideixen.',
'userexists' => 'El nom que heu entrat ja és en ús.
@@ -699,6 +699,7 @@ Si us plau, esperi abans de tornar-ho a intentar.",
# Email sending
'php-mail-error-unknown' => 'Error desconegut en la funció mail() de PHP',
'user-mail-no-addy' => "S'ha intentat enviar un missatge de correu electrònic sense adreça.",
+'user-mail-no-body' => 'Vas intentar enviar un correu electrònic amb un cos buit o excessivament curt.',
# Change password dialog
'resetpass' => 'Canvia la contrasenya',
@@ -756,6 +757,7 @@ Contrasenya temporal: $2",
'changeemail-oldemail' => 'Adreça de correu electrònic actual:',
'changeemail-newemail' => 'Nova adreça de correu electrònic:',
'changeemail-none' => '(cap)',
+'changeemail-password' => 'La vostra contrasenya a {{SITENAME}}:',
'changeemail-submit' => 'Canvia de correu electrònic',
'changeemail-cancel' => 'Cancel·la',
@@ -932,7 +934,6 @@ A continuació es mostra la darrera entrada del registre com a referència:",
'template-semiprotected' => '(semiprotegida)',
'hiddencategories' => 'Aquesta pàgina forma part de {{PLURAL:$1|la següent categoria oculta|les següents categories ocultes}}:',
'edittools' => "<!-- Es mostrarà als formularis d'edició i de càrrega el text que hi haja després d'aquesta línia. -->",
-'nocreatetitle' => "S'ha limitat la creació de pàgines",
'nocreatetext' => "El projecte {{SITENAME}} ha restringit la possibilitat de crear noves pàgines.
Podeu modificar les planes ja existents o bé [[Special:UserLogin|entrar en un compte d'usuari]].",
'nocreate-loggedin' => 'No teniu permisos per a crear pàgines noves.',
@@ -957,6 +958,15 @@ Sembla haver estat esborrada.",
'edit-already-exists' => "No s'ha pogut crear una pàgina.
Ja existeix.",
'defaultmessagetext' => 'Missatge per defecte',
+'content-failed-to-parse' => "Ha fallat l'anàlisi del contingut de $2 per al model $1: $3",
+'invalid-content-data' => 'Dades de contingut no vàlides',
+'content-not-allowed-here' => 'No és permés el contingut "$1" a la pàgina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'text net',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "Atenció: Aquesta pàgina conté massa crides a funcions parserfunction complexes.
@@ -1320,9 +1330,9 @@ No es podrà desfer el canvi.',
'prefs-emailconfirm-label' => 'Confirmació de correu electrònic:',
'prefs-textboxsize' => "Mida de la caixa d'edició",
'youremail' => 'Correu electrònic:',
-'username' => "Nom d'usuari:",
-'uid' => "Identificador d'usuari:",
-'prefs-memberingroups' => 'Membre dels {{PLURAL:$1|grup|grups}}:',
+'username' => "{{GENDER:$1|Nom d'usuari}}:",
+'uid' => "{{GENDER:$1|Usuari}} Identificador d'usuari:",
+'prefs-memberingroups' => '{{GENDER:$2|Membre}} {{PLURAL:$1|del grup|dels grups}}:',
'prefs-registration' => 'Hora de registre:',
'yourrealname' => 'Nom real *',
'yourlanguage' => 'Idioma:',
@@ -1470,12 +1480,13 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
'right-sendemail' => 'Enviar missatges de correu electrònic a altres usuaris',
'right-passwordreset' => 'Veure les soŀlicituds de restabliment de contrasenya per correu electrònic',
+# Special:Log/newusers
+'newuserlogpage' => "Registre de creació de l'usuari",
+'newuserlogpagetext' => 'Aquest és un registre de creació de nous usuaris.',
+
# User rights log
'rightslog' => "Registre dels permisos d'usuari",
'rightslogtext' => "Aquest és un registre de canvis dels permisos d'usuari.",
-'rightslogentry' => 'ha modificat els drets de $1 del grup $2 a $3',
-'rightslogentry-autopromote' => 'ha estat promogut automàticament de $2 a $3',
-'rightsnone' => '(cap)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'llegir aquesta pàgina',
@@ -1696,6 +1707,7 @@ $1',
'backend-fail-notsame' => 'Ja existeix un fitxer no idèntic a $1.',
'backend-fail-invalidpath' => "$1 no és un camí d'emmagatzemament vàlid.",
'backend-fail-delete' => "No s'ha pogut suprimir el fitxer $1.",
+'backend-fail-describe' => 'La modificació de les metadades del fitxer "$1" no és possible.',
'backend-fail-alreadyexists' => 'El fitxer $1 ja existeix.',
'backend-fail-store' => "No s'ha pogut emmagatzemar el fitxer $1 a $2.",
'backend-fail-copy' => "No s'ha pogut copiar el fitxer $1 a $2.",
@@ -1927,6 +1939,12 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
És possible que hagin d'enllaçar a una altra pàgina més apropiada.<br />
Una pàgina es tracta com de desambiguació si utilitza una plantilla que està enllaçada a [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Pàgines amb una propietat de pàgina',
+'pageswithprop-legend' => 'Pàgines amb una propietat de pàgina',
+'pageswithprop-text' => 'Aquesta pàgina llista les pàgines que utilitzen una propietat de pàgina en particular.',
+'pageswithprop-prop' => 'Nom de la propietat:',
+'pageswithprop-submit' => 'Vés',
+
'doubleredirects' => 'Redireccions dobles',
'doubleredirectstext' => 'Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.
Cada fila conté enllaços a la primera i segona redireccions, així com el destí de la segona redirecció, què generalment és la pàgina destí "real", a la què hauria d\'apuntar la primera redirecció.
@@ -2078,8 +2096,8 @@ Vegeu també [[Special:WantedCategories|les categories soŀlicitades]].",
'linksearch-ns' => 'Espai de noms:',
'linksearch-ok' => 'Cerca',
'linksearch-text' => 'Es poden utilitzar caràcters comodí com "*.wikipedia.org".
-Necessita com a mínim un domini de primer nivell, per exemple "*.org".<br />
-Protocols admesos: <code>$1</code> (http:// per defecte si no se n\'especifica cap).',
+Es necessita com a mínim un domini de primer nivell, per exemple "*.org".<br />
+{{PLURAL:$2|Protocol admès|Protocols admesos}}: <code>$1</code> (http:// per defecte si no se n\'especifica cap).',
'linksearch-line' => '$1 enllaçat a $2',
'linksearch-error' => "Els caràcters comodí només poden aparèixer a l'inici de l'url.",
@@ -2098,10 +2116,6 @@ Protocols admesos: <code>$1</code> (http:// per defecte si no se n\'especifica c
'activeusers-hidesysops' => 'Amaga administradors',
'activeusers-noresult' => "No s'han trobat usuaris.",
-# Special:Log/newusers
-'newuserlogpage' => "Registre de creació de l'usuari",
-'newuserlogpagetext' => 'Aquest és un registre de creació de nous usuaris.',
-
# Special:ListGroupRights
'listgrouprights' => "Drets dels grups d'usuaris",
'listgrouprights-summary' => "A continuació hi ha una llista dels grups d'usuaris definits en aquest wiki, així com dels seus drets d'accés associats.
@@ -2197,19 +2211,23 @@ S\'hi mostraran els canvis futurs que tinguin lloc en aquesta pàgina i la corre
'enotif_mailer' => 'Sistema de notificació per correl de {{SITENAME}}',
'enotif_reset' => 'Marca totes les pàgines com a visitades',
-'enotif_newpagetext' => 'Aquesta és una nova pàgina.',
'enotif_impersonal_salutation' => 'usuari de la {{SITENAME}}',
-'changed' => 'modificada',
-'created' => 'creada',
-'enotif_subject' => 'La pàgina $PAGETITLE a {{SITENAME}} ha estat $CHANGEDORCREATED per $PAGEEDITOR',
+'enotif_subject_deleted' => 'La pàgina $1 de {{SITENAME}} ha estat suprimida per {{gender:$2|$2}}',
+'enotif_subject_created' => 'La pàgina $1 de {{SITENAME}} ha estat creada per {{gender:$2|$2}}',
+'enotif_subject_moved' => 'La pàgina $1 de {{SITENAME}} ha estat reanomenada per {{gender:$2|$2}}',
+'enotif_subject_restored' => 'La pàgina $1 de {{SITENAME}} ha estat restaurada per {{gender:$2|$2}}',
+'enotif_subject_changed' => 'La pàgina $1 de {{SITENAME}} ha estat canviada per {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'La pàgina $1 de {{SITENAME}} ha estat suprimida el $PAGEEDITDATE per {{gender:$2|$2}}, vegeu $3 .',
+'enotif_body_intro_created' => 'La pàgina $1 de {{SITENAME}} ha estat creada el $PAGEEDITDATE per {{gender:$2|$2}}. Aneu a $3 per veure la revisió actual.',
+'enotif_body_intro_moved' => 'La pàgina $1 de {{SITENAME}} ha estat reanomenada el $PAGEEDITDATE per {{gender:$2|$2}}. Aneu a $3 per veure la revisió actual.',
+'enotif_body_intro_restored' => 'La pàgina $1 de {{SITENAME}} ha estat restaurada el $PAGEEDITDATE per {{gender:$2|$2}}. Aneu a $3 per veure la revisió actual.',
+'enotif_body_intro_changed' => 'La pàgina $1 de {{SITENAME}} ha estat canviada el $PAGEEDITDATE per {{gender:$2|$2}}. Aneu a $3 per veure la revisió actual.',
'enotif_lastvisited' => "Vegeu $1 per a tots els canvis que s'han fet d'ença de la vostra darrera visita.",
'enotif_lastdiff' => 'Consulteu $1 per a visualitzar aquest canvi.',
'enotif_anon_editor' => 'usuari anònim $1',
-'enotif_body' => 'Benvolgut $WATCHINGUSERNAME,
-
-La pàgina $PAGETITLE del projecte {{SITENAME}} ha estat $CHANGEDORCREATED el dia $PAGEEDITDATE per $PAGEEDITOR, vegeu la versió actual a $PAGETITLE_URL.
+'enotif_body' => 'Benvolgut/uda $WATCHINGUSERNAME,
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Resum de l\'editor: $PAGESUMMARY $PAGEMINOREDIT
@@ -2220,7 +2238,7 @@ wiki: $PAGEEDITOR_WIKI
No rebreu més notificacions de futurs canvis si no visiteu la pàgina.
També podeu canviar el mode de notificació de les pàgines que vigileu en la vostra llista de seguiment.
- El servei de notificacions del projecte {{SITENAME}}
+El servei de notificacions del projecte {{SITENAME}}
--
Per a canviar les opcions de notificació per correu electrònic aneu a
@@ -2234,6 +2252,8 @@ $UNWATCHURL
Suggeriments i ajuda:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'creada',
+'changed' => 'modificada',
# Delete
'deletepage' => 'Elimina la pàgina',
@@ -2301,6 +2321,8 @@ Vegeu la [[Special:ProtectedPages|llista de pàgines protegides]] per a la llist
'prot_1movedto2' => '[[$1]] mogut a [[$2]]',
'protect-badnamespace-title' => 'Espai de nom no-protectable',
'protect-badnamespace-text' => 'Les pàgines en aquest espai de nom no pot ser protegit.',
+'protect-norestrictiontypes-text' => 'Aquesta pàgina no es pot protegir ja que no hi ha cap tipus de restricció disponible.',
+'protect-norestrictiontypes-title' => 'Pàgina no protegible',
'protect-legend' => 'Confirmeu la protecció',
'protectcomment' => 'Motiu:',
'protectexpiry' => "Data d'expiració",
@@ -2384,7 +2406,8 @@ al resum a continuació, juntament amb detalls dels usuaris que l'havien editat
'undeletedrevisions' => '{{PLURAL:$1|Una revisió restaurada|$1 revisions restaurades}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Una revisió|$1 revisions}} i {{PLURAL:$2|un fitxer|$2 fitxers}} restaurats',
'undeletedfiles' => '$1 {{PLURAL:$1|fitxer restaurat|fitxers restaurats}}',
-'cannotundelete' => "No s'ha pogut restaurar; algú altre pot estar restaurant la mateixa pàgina.",
+'cannotundelete' => 'Hi ha hagut un error en el procés de restauració:
+$1',
'undeletedpage' => "'''S'ha restaurat «$1»'''
Consulteu el [[Special:Log/delete|registre d'esborraments]] per a veure els esborraments i els restauraments més recents.",
@@ -2415,7 +2438,7 @@ $1",
'blanknamespace' => '(Principal)',
# Contributions
-'contributions' => "Contribucions de l'usuari",
+'contributions' => "Contribucions de {{GENDER:$1|l'usuari|la usuària}}",
'contributions-title' => "Contribucions de l'usuari $1",
'mycontris' => 'Contribucions',
'contribsub2' => 'Per $1 ($2)',
@@ -2693,6 +2716,7 @@ La pàgina de destinació, «[[:$1]]», ja existeix. Voleu eliminar-la per a fer
'immobile-target-namespace-iw' => "No es poden moure pàgines a l'enllaç interwiki",
'immobile-source-page' => 'Aquesta pàgina no es pot moure.',
'immobile-target-page' => 'No es pot moure cap a una destinació amb aquest títol.',
+'bad-target-model' => 'El destí desitjat utilitza un model de contingut diferent. No es pot convertir de $1 a $2.',
'imagenocrossnamespace' => 'No es pot moure la imatge a un espai de noms on no li correspon',
'nonfile-cannot-move-to-file' => 'No es pot moure la imatge a un espai de noms on no li correspon',
'imagetypemismatch' => 'La nova extensió de fitxer no coincideix amb el seu tipus',
@@ -2802,6 +2826,7 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
'import-error-interwiki' => "No s'importa la pàgina «$1» perquè el seu nom està reservat a l'enllaçament extern (interwiki).",
'import-error-special' => "No s'importa la pàgina «$1» perquè el seu nom pertany a l'espai de noms especial que no permet pàgines.",
'import-error-invalid' => "No s'importa la pàgina «$1» perquè el seu nom no és vàlid.",
+'import-error-unserialize' => 'La revisió $2 de la pàgina "$1" no pot ser desserialitzada. La revisió indica que utilitza el model de contingut $3 serialitzat com a $4.',
'import-options-wrong' => '{{PLURAL:$2|Opció equivocada|Opcions equivocades}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'La pàgina arrel donada és un títol no vàlid.',
'import-rootpage-nosubpage' => 'L\'espai de noms "$1" de la pàgina arrel no permet subpàgines.',
@@ -2816,7 +2841,6 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
# JavaScriptTest
'javascripttest' => 'Proves de JavaScript',
-'javascripttest-disabled' => "No s'ha inhabilitat la funció en el wiki.",
'javascripttest-title' => "S'estan executant $1 proves",
'javascripttest-pagetext-noframework' => "Es reserva la pàgina per a l'execució de tests amb JavaScript.",
'javascripttest-pagetext-unknownframework' => "L'entorn de proves «$1» és desconegut.",
@@ -2938,11 +2962,13 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
'pageinfo-default-sort' => "Clau d'ordenació predeterminada",
'pageinfo-length' => 'Mida de la pàgina (en bytes)',
'pageinfo-article-id' => 'ID de la pàgina',
+'pageinfo-language' => 'Llengua del contingut de la pàgina',
'pageinfo-robot-policy' => 'Estat del motor de cerca',
'pageinfo-robot-index' => 'Indexable',
'pageinfo-robot-noindex' => 'No indexable',
'pageinfo-views' => 'Número de visites',
'pageinfo-watchers' => "Número d'usuaris que vigilen la pàgina",
+'pageinfo-few-watchers' => 'Menys de $1 {{PLURAL:$1|observador|observadors}}',
'pageinfo-redirects-name' => 'Redireccions a aquesta pàgina',
'pageinfo-subpages-name' => "Subpàgines d'aquesta pàgina",
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecció|redireccions}}; $3 {{PLURAL:$3|no redireció|no redireccions}})',
@@ -2957,6 +2983,19 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
'pageinfo-magic-words' => '{{PLURAL:$1|Paraula clau|Paraules clau}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categories ocultes}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|plantilla inclosa|plantilles incloses}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pàgina|Pàgines}} incloses en ($1)',
+'pageinfo-toolboxlink' => 'Informació de la pàgina',
+'pageinfo-redirectsto' => 'Redirigeix a',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Comptat com una pàgina de contingut',
+'pageinfo-contentpage-yes' => 'Sí',
+'pageinfo-protect-cascading' => "Proteccions en cascada des d'aquí",
+'pageinfo-protect-cascading-yes' => 'Sí',
+'pageinfo-protect-cascading-from' => 'Proteccions en cascada des de',
+'pageinfo-category-info' => 'Informació de categoria',
+'pageinfo-category-pages' => 'Nombre de pàgines',
+'pageinfo-category-subcats' => 'ombre de subcategories',
+'pageinfo-category-files' => "Nombre d'arxius",
# Skin names
'skinname-standard' => 'Clàssic',
@@ -2973,6 +3012,8 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
'markedaspatrollederror' => 'No es pot marcar com a supervisat',
'markedaspatrollederrortext' => 'Cal que especifiqueu una versió per a marcar-la com a supervisada.',
'markedaspatrollederror-noautopatrol' => 'No podeu marcar les vostres pròpies modificacions com a supervisades.',
+'markedaspatrollednotify' => 'Aquesta modificació a $1 ha estat marcada com a patrullada.',
+'markedaspatrollederrornotify' => 'Ha fallat la marca com a patrullat.',
# Patrol log
'patrol-log-page' => 'Registre de supervisió',
@@ -3006,6 +3047,7 @@ Si l'executeu, podeu comprometre la seguretat del vostre sistema.",
'file-nohires' => 'No hi ha cap versió amb una resolució més gran.',
'svg-long-desc' => 'fitxer SVG, nominalment $1 × $2 píxels, mida del fitxer: $3',
'svg-long-desc-animated' => 'Fitxer SVG animat, nominalment $1 × $2 píxels, mida del fitxer: $3',
+'svg-long-error' => 'El fitxer SVG no és vàlid: $1',
'show-big-image' => 'Imatge en màxima resolució',
'show-big-image-preview' => "Mida d'aquesta previsualització: $1.",
'show-big-image-other' => '{{PLURAL:$2|Altra resolució|Altres resolucions}}: $1.',
@@ -3036,7 +3078,10 @@ Si l'executeu, podeu comprometre la seguretat del vostre sistema.",
'minutes' => '{{PLURAL:$1|$1 minut|$1 minuts}}',
'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
'days' => '{{PLURAL:$1|$1 dia|$1 dies}}',
+'months' => '{{PLURAL:$1|$1 mes|$1 mesos}}',
+'years' => '{{PLURAL:$1|$1 any|$1 anys}}',
'ago' => 'fa $1',
+'just-now' => 'ara mateix',
# Bad image list
'bad_image_list' => "El format ha de ser el següent:
@@ -3538,6 +3583,7 @@ Aquest codi de confirmació caducarà el $4.",
# Scary transclusion
'scarytranscludedisabled' => "[S'ha inhabilitat la transclusió interwiki]",
'scarytranscludefailed' => '[Ha fallat la recuperació de la plantilla per a $1]',
+'scarytranscludefailed-httpstatus' => '[Ha fallat la recuperació de la plantilla per a $1: HTTP $2]',
'scarytranscludetoolong' => "[L'URL és massa llarg]",
# Delete conflict
@@ -3648,6 +3694,7 @@ També podeu [[Special:EditWatchlist|utilitzar l'editor estàndard]].",
'version-license' => 'Llicència',
'version-poweredby-credits' => "El wiki funciona gràcies a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'altres',
+'version-credits-summary' => 'El nostre reconeixement a les següents persones per la seva aportació a [[Special:Version|MediaWiki]]',
'version-license-info' => "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, ja sigui de la seva versió 2 o (a elecció vostra) qualsevol versió posterior.
MediaWiki es distribueix en l'esperança de ser d'utilitat, però SENSE CAP GARANTIA; ni tan sols la garantia implícita de COMERCIALITZACIÓ o ADEQUACIÓ A UNA FINALITAT DETERMINADA. En trobareu més detalls a la Llicència Pública General GNU.
@@ -3762,13 +3809,13 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
'sqlite-no-fts' => '$1, sense supor de búsqueda de text íntegre',
# New logging system
-'logentry-delete-delete' => '$1 ha esborrat la pàgina $3',
-'logentry-delete-restore' => '$1 ha restaurat la pàgina $3',
+'logentry-delete-delete' => '$1 ha esborrat $3',
+'logentry-delete-restore' => '$1 ha restaurat $3',
'logentry-delete-event' => "$1 ha canviat la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
'logentry-delete-revision' => "$1 ha canviat la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
'logentry-delete-event-legacy' => "$1 ha canviat la visibilitat d'esdeveniments al registre de $3",
'logentry-delete-revision-legacy' => '$1 ha canviat la visibilitat de revisions a la pàgina $3',
-'logentry-suppress-delete' => '$1 ha suprimit la pàgina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|ha suprimit}} la pàgina $3',
'logentry-suppress-event' => "$1 secretament ha canviat la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
'logentry-suppress-revision' => "$1 secretament ha canviat la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
'logentry-suppress-event-legacy' => "$1 secretament ha canviat la visibilitat d'esdeveniments al registre de $3",
@@ -3781,17 +3828,21 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
'revdelete-uname-unhid' => "ha revelat un nom d'usuari que era ocult",
'revdelete-restricted' => 'ha aplicat restriccions als administradors',
'revdelete-unrestricted' => 'ha tret les restriccions als administradors',
-'logentry-move-move' => '$1 ha desplaçat la pàgina $3 a $4',
-'logentry-move-move-noredirect' => '$1 ha desplaçat la pàgina $3 a $4 sense deixar cap redirecció',
-'logentry-move-move_redir' => '$1 ha desplaçat la pàgina $3 a $4, on hi havia una redirecció',
+'logentry-move-move' => '$1 ha mogut $3 a $4',
+'logentry-move-move-noredirect' => '$1 ha mogut $3 a $4 sense deixar una redirecció',
+'logentry-move-move_redir' => '$1 ha mogut $3 a $4 sobre una redirecció',
'logentry-move-move_redir-noredirect' => '$1 ha desplaçat la pàgina $3 a $4 on hi havia una redirecció i sense crear una nova redirecció',
-'logentry-patrol-patrol' => '$1 ha marcat la versió $4 de la pàgina $3 com a patrullada',
+'logentry-patrol-patrol' => '1 $ va marcar la revisió $ 4 de "$ 3" com a supervisada',
'logentry-patrol-patrol-auto' => '$1 ha marcat automàticament la versió $4 de la pàgina $3 com a patrullada',
-'logentry-newusers-newusers' => "S'ha creat el compte d'usuari $1",
-'logentry-newusers-create' => "S'ha creat el compte d'usuari $1",
-'logentry-newusers-create2' => "$1 ha creat el compte d'usuari $3",
-'logentry-newusers-autocreate' => "El compte d'usuari $1 ha estat creat de manera automàtica",
-'newuserlog-byemail' => 'contrasenya enviada per correu electrònic',
+'logentry-newusers-newusers' => "El compte d'usuari $1 {{GENDER:$2|ha estat creat}}",
+'logentry-newusers-create' => "El compte d'usuari $1 {{GENDER:$2|ha estat creat}}",
+'logentry-newusers-create2' => "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1",
+'logentry-newusers-byemail' => "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1 i la contrasenya ha estat enviada per correu electrònic",
+'logentry-newusers-autocreate' => "El compte d'usuari $1 {{GENDER:$2|ha estat creat}} automàticament",
+'logentry-rights-rights' => '$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3 de $4 a $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3',
+'logentry-rights-autopromote' => '$1 ha estat {{GENDER:$2|promogut}} automàticament de $4 a $5',
+'rightsnone' => '(cap)',
# Feedback
'feedback-bugornote' => "Si podeu descriure un problema tècnic en detall, [$1 informeu-ne].
@@ -3845,6 +3896,7 @@ Altrament, podeu fer servir un senzill formulari a continuació. El vostre comen
'api-error-ok-but-empty' => 'Error intern: no hi ha resposta del servidor.',
'api-error-overwrite' => 'No està permès sobreescriure un fitxer existent.',
'api-error-stashfailed' => 'Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.',
+'api-error-publishfailed' => 'Error intern: el servidor no ha pogut publicar el fitxer temporal.',
'api-error-timeout' => 'El servidor no ha respost en el temps esperat.',
'api-error-unclassified' => "S'ha produït un error desconegut",
'api-error-unknown-code' => 'Error desconegut: «$1»',
diff --git a/languages/messages/MessagesCbk_zam.php b/languages/messages/MessagesCbk_zam.php
index b58427e2..3273f677 100644
--- a/languages/messages/MessagesCbk_zam.php
+++ b/languages/messages/MessagesCbk_zam.php
@@ -115,8 +115,8 @@ Por favor mira tambien el maga [[Special:WantedCategories|categoria requeridas]]
# Watchlist
'watch' => 'Vicia',
-'changed' => 'cambiao',
'created' => 'creao',
+'changed' => 'cambiao',
# Delete
'actioncomplete' => 'Completo el accion',
diff --git a/languages/messages/MessagesCdo.php b/languages/messages/MessagesCdo.php
index e71899f4..ad17a9d6 100644
--- a/languages/messages/MessagesCdo.php
+++ b/languages/messages/MessagesCdo.php
@@ -215,9 +215,6 @@ For translations, please consider using [//translatewiki.net/wiki/Main_Page?setl
# Login and logout pages
'logouttext' => "'''Nṳ̄ hiêng-câi láuk-chók lÄu.'''
Nṳ̄ â̤-sÄi sÄi mò̤-miàng huÅng-sék gié-sṳ̆k găk {{SITENAME}} gè̤-dÄ“ng láuk, nṳ̄ iâ â̤-sÄi sÄi dè̤ng-iông gì dióng-hô̤ hĕ̤k-ciÄ bÄ•k-nó̤h bÄ­k dióng-hô̤ gái láuk-diÄ“. DiÅh gé lÄ̤, nṳ̄ báuk-lÄng-ké ká̤-chṳ̄ (''browser cache'') nâ mò̤ tĕ̤ng táh gó̤ uâ, ô gì hiÄ•k giăng â̤ hiÄ“ng-sê nṳ̄ gó muôi láuk-chók.",
-'welcomecreation' => '== Huăng-ngìng guÅng-lìng, $1! ==
-
-Nṳ̄ gì dióng-hô̤ Ä«-gÄ­ng kÅ­i hÅ̤ lÄu. DÄng nṳ̄ â̤-sÄi siÅ­-gÄi nṳ̄ găk {{SITENAME}} gì siék-diâng.',
'yourname' => 'Ê̤ṳng-hô-miàng',
'yourpassword' => 'MÄ­k-mÄ',
'yourpasswordagain' => 'Dṳ̀ng-sÄ­ng páh diÄ“ mÄ­k-mÄ',
@@ -412,6 +409,9 @@ Siók-mìng: (dÄng) = gâe̤ng dék sÄ­ng bÄ“ng-buÅng bÄ«-piâng, (sèng) = gÃ
'group-sysop-member' => 'GuÄng-lÄ«-uòng',
'group-bureaucrat-member' => 'Guăng-lièu-cū',
+# Special:Log/newusers
+'newuserlogpage' => 'Kŭi dióng-hô̤ nĭk-cé',
+
# Recent changes
'recentchanges' => 'CÄ«-bÅng gì gÄi-biéng',
'recentchanges-summary' => 'Găk cÄ« hiÄ•k dÅ­i-sùi wiki cÄ«-bÅng dék sÄ­ng gì gÄi-biéng.',
@@ -570,9 +570,6 @@ Siók-mìng: (dÄng) = gâe̤ng dék sÄ­ng bÄ“ng-buÅng bÄ«-piâng, (sèng) = gÃ
# Special:LinkSearch
'linksearch-ok' => 'Sìng-tÅ̤',
-# Special:Log/newusers
-'newuserlogpage' => 'Kŭi dióng-hô̤ nĭk-cé',
-
# Email user
'emailuser' => 'Gié diêng-piĕ ké̤ṳk ĭ',
'emailpage' => 'Gié diêng-piĕ ké̤ṳk ĭ',
@@ -605,8 +602,6 @@ IÅk-sṳ̄ nṳ̄ buóh-siÅng téng nṳ̄ gáng-sê-dăng gà̤-dÄ“ng dṳ̀
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'Gáng-sê...',
-'enotif_newpagetext' => 'Cuòi sê sĭng hiĕk.',
-
# Delete
'deletepage' => 'Chēng hiĕk',
'confirm' => 'Káuk-nêng',
diff --git a/languages/messages/MessagesCe.php b/languages/messages/MessagesCe.php
index 7d226af4..c08ac373 100644
--- a/languages/messages/MessagesCe.php
+++ b/languages/messages/MessagesCe.php
@@ -69,7 +69,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__ТlЕДУЬЛЛУ_ЧУЛÐЦÐМБÐР__', '__ТlЕДУЬЛ_ЧУЛ__', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
'toc' => array( '0', '__ЧУЛÐЦÐÐœ__', '__ЧУЛ__', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
'noeditsection' => array( '0', '__ЦÐМЕГ_РЕДÐККХÐ_ÐГlОÐ__', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__КОЬРТÐ_ЙОЦÐШ__', '__БЕЗ_ЗÐГОЛОВКÐ__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'КÐРÐРÐ_БУТТ', 'КÐРÐРÐ_БУТТ_2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'КÐРÐРÐ_БУТТ_1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'КÐРÐРÐЧУ_БЕТТÐ_ЦlЕ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
@@ -166,7 +165,7 @@ $magicWords = array(
'revisionmonth' => array( '1', 'БЕТТÐ_БÐШХО', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
'revisionyear' => array( '1', 'ШО_БÐШХО', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
'revisiontimestamp' => array( '1', 'КЪÐСТÐÐœ_ХЕÐÐ_БÐШХО', 'ОТМЕТКÐ_ВРЕМЕÐИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'ДЕКЪÐШХОÐ_БÐШХО', 'ВЕРСИЯ_УЧÐСÐИКÐ', 'REVISIONUSER' ),
+ 'revisionuser' => array( '1', 'ДЕКЪÐШХОÐ_БÐШХО', 'ВЕРСИЯ_УЧÐСÐИКÐ', 'ВЕРСИЯ_УЧÐСТÐИКÐ', 'REVISIONUSER' ),
'plural' => array( '0', 'ДУКХÐЛЛИÐ_ТЕРÐХЬ:', 'ÐœÐОЖЕСТВЕÐÐОЕ_ЧИСЛО:', 'PLURAL:' ),
'fullurl' => array( '0', 'ÐœÐЙÐРРÐ_МЕТТИГ:', 'ПОЛÐЫЙ_ÐДРЕС:', 'FULLURL:' ),
'fullurle' => array( '0', 'ÐœÐЙÐРРÐ_МЕТТИГ_2:', 'ПОЛÐЫЙ_ÐДРЕС_2:', 'FULLURLE:' ),
@@ -356,7 +355,6 @@ $messages = array(
'qbbrowse' => 'Хьажар',
'qbedit' => 'ÐиÑйé',
'qbpageoptions' => 'Ðгlо ниÑйар',
-'qbpageinfo' => 'Ðгlонах болу бовзам',
'qbmyoptions' => 'Хьан ниÑдарш',
'qbspecialpages' => 'Леррина агlонаш',
'faq' => 'СиХХ',
@@ -829,6 +827,9 @@ $1',
'grouppage-bureaucrat' => '{{ns:project}}:Даржахой',
'grouppage-suppress' => '{{ns:project}}:ЛевиÑорхой',
+# Special:Log/newusers
+'newuserlogpage' => 'Декъашхой дlабазбина тептар',
+
# User rights log
'rightslog' => 'Декъашхон бакъона тéптар',
@@ -1062,9 +1063,6 @@ PICT # тайп тайпан
# Special:ActiveUsers
'activeusers' => 'Жигар декъашхой могlам',
-# Special:Log/newusers
-'newuserlogpage' => 'Декъашхой дlабазбина тептар',
-
# Special:ListGroupRights
'listgrouprights' => 'Декъашхойн тобанаши бакъонаш',
'listgrouprights-group' => 'Тоба',
@@ -1096,8 +1094,6 @@ PICT # тайп тайпан
'watching' => 'Тергаме мlогаман юкъаÑккха…',
'unwatching' => 'Тергаме мlогаман чура дlайаккха…',
-'enotif_newpagetext' => 'Хlара керла агlо ю.',
-
# Delete
'deletepage' => 'Дlайайá агlо',
'confirm' => 'Къобалде',
diff --git a/languages/messages/MessagesCeb.php b/languages/messages/MessagesCeb.php
index c5c63517..f8910a16 100644
--- a/languages/messages/MessagesCeb.php
+++ b/languages/messages/MessagesCeb.php
@@ -208,7 +208,6 @@ $messages = array(
'qbbrowse' => 'Browse',
'qbedit' => 'Usba',
'qbpageoptions' => 'Kini nga panid',
-'qbpageinfo' => 'Konteksto',
'qbmyoptions' => 'Akong mga panid',
'qbspecialpages' => 'Mga espesyal nga panid',
'faq' => 'FAQ',
@@ -443,10 +442,7 @@ Ang rason nga gihatag mao ang "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Nakabiya ka na.'''
-Mahimo kang magpadayon sa paggamit sa {{SITENAME}} bisan wala ka magpaila o puyde usab nga [[Special:UserLogin|mag-log in ka'g usab]] o isip laing gumagamit. Palihog hinumdomi nga may ubang mga panid nga magpakita sama nga ikaw naka-log in pa; kini tungod kay wala pa nimo malimpiyohi ang cache sa imong brawser.",
-'welcomecreation' => '== Maayong pag-abot, $1! ==
-Nahimo na ang imong akawnt.
-Ayaw kalimot sa pag-usab sa imong [[Special:Preferences|{{SITENAME}} mga preperensiya]].',
+Mahimo kang magpadayon sa paggamit sa {{SITENAME}} bisan wala ka magpaila o puyde usab nga <span class='plainlinks'>[$1 mag-log in ka'g usab]</span> o isip laing gumagamit. Palihog hinumdomi nga may ubang mga panid nga magpakita sama nga ikaw naka-log in pa; kini tungod kay wala pa nimo malimpiyohi ang cache sa imong brawser.",
'yourname' => 'Ngalan sa tiggamit:',
'yourpassword' => 'Pasword:',
'yourpasswordagain' => 'Itayp og usab ang pasword:',
@@ -848,9 +844,12 @@ Kon gipili nimo nga ihatag kini, gamiton kini aron pasidunggan ka sa imong mga t
'grouppage-sysop' => '{{ns:project}}:Mga tigdumala',
+# Special:Log/newusers
+'newuserlogpage' => "Log sa paghimo'g gumagamit",
+'newuserlogpagetext' => "Kini mao ang ''log'' sa bag-ong namugnang mga gumagamit.",
+
# User rights log
'rightslog' => 'Log sa mga katungod sa gumagamit',
-'rightsnone' => '(wala)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'basaha kining panid',
@@ -976,10 +975,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Special:LinkSearch
'linksearch' => 'Mga sumpay sa gawas',
-# Special:Log/newusers
-'newuserlogpage' => "Log sa paghimo'g gumagamit",
-'newuserlogpagetext' => "Kini mao ang ''log'' sa bag-ong namugnang mga gumagamit.",
-
# Special:ListGroupRights
'listgrouprights-members' => '(talaan sa mga miyembro)',
@@ -1253,6 +1248,6 @@ Ang uban default nga nakatago.
# New logging system
'revdelete-restricted' => 'mga na-aplay nga restriksyon sa mga tagdumala',
'revdelete-unrestricted' => 'gitangtang ang mga restriksyon alang sa mga tagdumala',
-'newuserlog-byemail' => "ang pasword gipadala na pinaagi sa ''e-mail''",
+'rightsnone' => '(wala)',
);
diff --git a/languages/messages/MessagesCh.php b/languages/messages/MessagesCh.php
index 2a12ed63..19117a7f 100644
--- a/languages/messages/MessagesCh.php
+++ b/languages/messages/MessagesCh.php
@@ -146,7 +146,6 @@ $messages = array(
'qbbrowse' => 'Atan',
'qbedit' => 'Tulaika',
'qbpageoptions' => 'Este na pahina',
-'qbpageinfo' => 'Kontekstu',
'qbmyoptions' => 'PÃ¥hina-hu siha',
'qbspecialpages' => 'Manespesiat na påhina',
@@ -304,9 +303,6 @@ Ha nå'i i rason ''$2''.",
Siña hao kumontinua manu'usa {{SITENAME}} sin nå'an, pat siña uma'log ta'lo pat siña un usa otra na nå'an muna'sesetbi.
Fanapunta na pålu na påhina siha para u na'annok na ma'log-in hao, asta ki un funas iyo-mu browser cache.",
-'welcomecreation' => "== Bienbenido, $1! ==
-Mafa'tinas i kuenta-mu.
-Munga mamalefa tumulaika ga'ña-mu {{SITENAME}}.",
'yourname' => "NÃ¥'an ni muna'setbi:",
'yourpassword' => 'Password:',
'yourpasswordagain' => "Taip ta'lo i password:",
diff --git a/languages/messages/MessagesChr.php b/languages/messages/MessagesChr.php
index 9867ae2b..845ae8c9 100644
--- a/languages/messages/MessagesChr.php
+++ b/languages/messages/MessagesChr.php
@@ -46,7 +46,6 @@ $messages = array(
'navigation' => 'Ꭰá‚Ꭹáá— á¥á³',
# Cologne Blue skin
-'qbpageinfo' => 'ᎦᎷᎯáá—',
'qbspecialpages' => 'Ꭴá¤áŽµá›',
'help' => 'ᎠᎵáá•áŽ¸á—',
diff --git a/languages/messages/MessagesCkb.php b/languages/messages/MessagesCkb.php
index b9c150ba..600c3ddc 100644
--- a/languages/messages/MessagesCkb.php
+++ b/languages/messages/MessagesCkb.php
@@ -24,21 +24,6 @@ $fallback8bitEncoding = 'windows-1256';
$rtl = true;
-$digitTransformTable = array(
- '0' => 'Ù ', # &#x0660;
- '1' => 'Ù¡', # &#x0661;
- '2' => 'Ù¢', # &#x0662;
- '3' => 'Ù£', # &#x0663;
- '4' => 'Ù¤', # &#x0664;
- '5' => 'Ù¥', # &#x0665;
- '6' => 'Ù¦', # &#x0666;
- '7' => 'Ù§', # &#x0667;
- '8' => 'Ù¨', # &#x0668;
- '9' => 'Ù©', # &#x0669;
- '.' => 'Ù«', # &#x066b; wrong table ?
- ',' => 'Ù¬', # &#x066c;
-);
-
$namespaceNames = array(
NS_MEDIA => 'میدیا',
NS_SPECIAL => 'تایبەت',
@@ -145,6 +130,21 @@ $magicWords = array(
'img_border' => array( '1', 'سنوور', 'border' ),
);
+$digitTransformTable = array(
+ '0' => 'Ù ', # &#x0660;
+ '1' => 'Ù¡', # &#x0661;
+ '2' => 'Ù¢', # &#x0662;
+ '3' => 'Ù£', # &#x0663;
+ '4' => 'Ù¤', # &#x0664;
+ '5' => 'Ù¥', # &#x0665;
+ '6' => 'Ù¦', # &#x0666;
+ '7' => 'Ù§', # &#x0667;
+ '8' => 'Ù¨', # &#x0668;
+ '9' => 'Ù©', # &#x0669;
+ '.' => 'Ù«', # &#x066b; wrong table ?
+ ',' => 'Ù¬', # &#x066c;
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'ھێڵ ھێنان بەژێر بەستەرەکان:',
@@ -281,6 +281,7 @@ $messages = array(
'newwindow' => '(لە پەڕەیەکی نوێدا دەکرێتەوە)',
'cancel' => 'ھەڵیوەشێنەوە',
'moredotdotdot' => 'زیاتر',
+'morenotlisted' => 'درێژەی پێرست...',
'mypage' => 'پەڕه‌',
'mytalk' => 'لێدوان',
'anontalk' => 'وتووێژ بۆ ئەم ئای‌پی یە',
@@ -292,7 +293,6 @@ $messages = array(
'qbbrowse' => 'بگه‌ڕێ',
'qbedit' => 'دەستکاری',
'qbpageoptions' => 'ئەم پەڕەیە',
-'qbpageinfo' => 'زانیاریی په‌ڕه‌',
'qbmyoptions' => 'پەڕەکانم',
'qbspecialpages' => 'پەڕە تایبەتەکان',
'faq' => 'پرسیار و وەڵام (FAQ)',
@@ -315,6 +315,7 @@ $messages = array(
'namespaces' => 'شوێنناوەکان',
'variants' => 'شێوەزارەکان',
+'navigation-heading' => 'مێنۆی ڕێدۆزی',
'errorpagetitle' => 'Ú¾Û•ÚµÛ•',
'returnto' => 'بگەڕێوە بۆ $1.',
'tagline' => 'Ù„Û• {{SITENAME}}',
@@ -552,11 +553,11 @@ $2',
# Login and logout pages
'logouttext' => "'''ئێستا تۆ لە ھەژمارەکەت ھاتوویتە دەرەوە.'''
-دەتوانی بە شێوەی بێناو درێژە بدەی بە بەرکارھێنانی {{SITENAME}}، یان دەتوانی [[Special:UserLogin|دیسانەوە بچیتەوە ژوورەوە]] ھەر بەو ناوە یان بە ناوی بەکارھێنەرییەکی جیاوازەوە.
+دەتوانی بە شێوەی بێناو درێژە بدەی بە بەرکارھێنانی {{SITENAME}}، یان دەتوانی <span class='plainlinks'>[$1 دیسانەوە بچیتەوە ژوورەوە]</span> ھەر بەو ناوە یان بە ناوی بەکارھێنەرییەکی جیاوازەوە.
ئاگادار بە کە ھەتا کاتێک کە کەشی وێبگەڕەکەت دەسڕیتەوە، سەرەڕای چوونەدەرەوەی تۆ ھەندێک لە پەڕەکان ھەر بە شێوەیەک نیشان دەدرێن کە گوایە تۆ ھێشتا لە ژوورەوەیت.",
-'welcomecreation' => '== بەخێربێی، $1! ==
-ھەژمارەکەت دروست کرا.
-لە بیرت نەچێت کە گۆڕانکاری لە [[Special:Preferences|ھەڵبژاردەکانی {{SITENAME}}]]ی تایبەتی خۆت بدەی.',
+'welcomeuser' => 'بەخێربێیت، $1!',
+'welcomecreation-msg' => 'ھەژمارەکەت دروست کرا.
+لە بیرت نەچێت [[Special:Preferences|ھەڵبژاردەکانی {{SITENAME}}]]ت بگۆڕی.',
'yourname' => 'ناوی بەکارھێنەری:',
'yourpassword' => 'تێپەڕوشە:',
'yourpasswordagain' => 'دیسان تێپەڕوشەکە بنووسەوە:',
@@ -701,6 +702,7 @@ $2
'changeemail-oldemail' => 'ئەدرەسی ئیمەیڵی ئێستا:',
'changeemail-newemail' => 'ئەدرەسی ئیمەیڵی نوێ:',
'changeemail-none' => '(ھیچ)',
+'changeemail-password' => 'تێپەڕوشەکەت لە {{SITENAME}}:',
'changeemail-submit' => 'ئەمەیڵ بگۆڕە',
'changeemail-cancel' => 'ھەڵیوەشێنەوە',
@@ -883,7 +885,6 @@ $2
'template-semiprotected' => '(نیوەپارێزراو)',
'hiddencategories' => 'ئەم پەڕە ئەندامێکی {{PLURAL:$1|١ پۆلی شاراوەیە|$1 پۆلی شاراوەیە}}:',
'edittools' => '<!-- دەقی ئێرە Ù„Û• ژێری Ùۆرمی دەستکاری Ùˆ بارکردندا نیشان دەدرێت. -->',
-'nocreatetitle' => 'درووست‌کردنی لاپەڕە سنووردار کراوە',
'nocreatetext' => '{{SITENAME}} توانای درووست‌کردنی لاپەڕە نوێکانی داخستووە.<br />
ئەتوانی بگەڕێتەوە دواوە و یەکێک لەو لاپەڕانەی وا هەن دەستکاری بکەیت ، یان [[Special:UserLogin|بچۆ ژوورەوە یان هەژمارێک درووست‌بکە]]',
'nocreate-loggedin' => 'ئیجازەی دروست کردنی پەڕەی نوێت نیە.',
@@ -908,6 +909,13 @@ $2
'edit-already-exists' => 'تواناییی دروستکردنی پەڕەی نوێ نییە.
ئەمە پەڕەیە پێشتر هەبووە.',
'defaultmessagetext' => 'دەقی پەیامی هەمیشەیی',
+'invalid-content-data' => 'دراوەی ناوەرۆکی نادروست',
+
+# Content models
+'content-model-wikitext' => 'ویکیدەق',
+'content-model-text' => 'دەقی ساکار',
+'content-model-javascript' => 'جاڤاسکریپت',
+'content-model-css' => 'سی ئێس ئێس',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''ئاگاداری:''' ئەم لاپەڕە ژمارەیەکی زۆر بانگ‌کەری ÙÛ•Ù†Ú©Ø´ÛŽÙ†ÛŒ لێک‌کەرەوەی لەخۆ گرتوو.<br /><br />
@@ -1260,9 +1268,9 @@ $1",
'prefs-emailconfirm-label' => 'پشتڕاست کردنەوەی ئیمەیل:',
'prefs-textboxsize' => 'قەبارەی پەنجەرەی دەستکاریکردن',
'youremail' => 'ئیمەیل:',
-'username' => 'ناوی به‌کارھێنەر:',
-'uid' => 'ژمارەی بەکارھێنەر:',
-'prefs-memberingroups' => 'ئەندامی {{PLURAL:$1|گرووپی|گرووپەکانی}}:',
+'username' => '{{GENDER:$1|ناوی به‌کارھێنەر}}:',
+'uid' => 'پێناسەی {{GENDER:$1|به‌کارھێنەر}}:',
+'prefs-memberingroups' => '{{GENDER:$2|ئەندامی}} {{PLURAL:$1|گرووپی|گرووپەکانی}}:',
'prefs-registration' => 'کاتی خۆتۆمارکردن:',
'yourrealname' => 'ناوی ڕاستی:',
'yourlanguage' => 'زمان',
@@ -1407,11 +1415,13 @@ $1",
'right-override-export-depth' => 'هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت',
'right-sendemail' => 'ناردنی ئیمەیل بۆ بەکارھێنەرانی تر',
+# Special:Log/newusers
+'newuserlogpage' => 'لۆگی دروستکردنی بەکارھێنەر',
+'newuserlogpagetext' => 'ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.',
+
# User rights log
'rightslog' => 'Ù„Û†Ú¯ÛŒ ماÙەکانی بەکارھێنەر',
'rightslogtext' => 'ئەمە Ù„Û†Ú¯ÛŒ دەستکاری ماÙەکانی بەکار‌هێنەرە.',
-'rightslogentry' => 'بۆ $1 ئەندامەتی گرووپی $2 گۆڕدرا بۆ $3',
-'rightsnone' => '(ھیچ)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'خوێندنەوەی ئەم پەڕە',
@@ -1796,6 +1806,12 @@ $1',
لەوانەیە لە جیاتی ئەو، بەستەریان ھەبێت بۆ بابەتەکانیی گونجاو.<br />
ئەگەر پەڕەیەک لە داڕێژەیەک کەڵک وەرگرێت کە بەستەری ھەبێت بۆ [[MediaWiki:Disambiguationspage]]، وەک پەڕەی ڕوونکردنەوە لەبەر چاو دەگیرێت.",
+'pageswithprop' => 'پەڕەکان بە تایبەتمەندیی پەڕە',
+'pageswithprop-legend' => 'پەڕەکان بە تایبەتمەندیی پەڕە',
+'pageswithprop-text' => 'ئەم پەڕەیە ئەو پەڕانەی تایبەتمەندییەکی پەرەیەکی دیاریکراو بەکاردەھێنن پێرست دەکا.',
+'pageswithprop-prop' => 'ناوی تایبەتمەندی:',
+'pageswithprop-submit' => 'بڕۆ',
+
'doubleredirects' => 'دووجار ڕەوانەکراوەکان',
'doubleredirectstext' => 'ئەم پەڕە لیستی ئەو پەڕانەیە کە ڕەوانەکراون بۆ پەڕەیەکی ڕەوانەکراوی دیکە.
هەر ڕیزێک، بەستەرەکانی ڕەوانەکردنەوەی یەکەم و دووەم و ھەروەھا ئامانجی ڕەوانەکراوی دووەمی تێدایە کە حاڵەتی ئاساییدا مەبەستی «ڕاستی»ی ڕەوانەکراوی یەکەمیش دەبێ بۆ ئەوێ بێت.
@@ -1963,10 +1979,6 @@ $1',
'activeusers-hidesysops' => 'بەڕێوبەران بشارەوە',
'activeusers-noresult' => 'هیچ بەکارهێنەرێک نەدۆزرایەوە',
-# Special:Log/newusers
-'newuserlogpage' => 'لۆگی دروستکردنی بەکارھێنەر',
-'newuserlogpagetext' => 'ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.',
-
# Special:ListGroupRights
'listgrouprights' => 'ماÙەکانی گرووپی بەکارھێنەر',
'listgrouprights-summary' => 'ئەمە لیستێکە Ù„Û• گرووپەکانی بەکارهێنەر لەسەر ئەم ویکی‌یە، دەگەڵ ماÙەکانی دەست‌پێ‌گەیشتنی هاوپەیوەندیان.
@@ -2057,42 +2069,48 @@ $1',
'enotif_mailer' => 'نامەی ڕاگەیاندنی {{SITENAME}}',
'enotif_reset' => 'ھەموو پەڕەکان وەک بینراو دیاری بکە',
-'enotif_newpagetext' => 'ئەمە پەڕەیەکی تازەیە.',
'enotif_impersonal_salutation' => 'بەکارهێنەری {{SITENAME}}',
-'changed' => 'گۆڕدرا',
-'created' => 'دروستکرا',
-'enotif_subject' => '‫پەڕەی «$PAGETITLE»ی {{SITENAME}} بەدەستی $PAGEEDITOR $CHANGEDORCREATED',
+'enotif_subject_deleted' => 'پەڕەی {{SITENAME}} $1 بە دەستی {{gender:$2|$2}} سڕایەوە.',
+'enotif_subject_created' => 'پەڕەی {{SITENAME}} $1 بە دەستی {{gender:$2|$2}} دروست کرا.',
+'enotif_subject_moved' => 'پەڕەی {{SITENAME}} $1 بە دەستی {{gender:$2|$2}} گوازرایەوە.',
+'enotif_subject_restored' => 'پەڕەی {{SITENAME}} $1 بە دەستی {{gender:$2|$2}} ھێنرایەوە.',
+'enotif_subject_changed' => 'پەڕەی {{SITENAME}} $1 بە دەستی {{gender:$2|$2}} گۆڕا.',
+'enotif_body_intro_deleted' => 'پەڕەی {{SITENAME}} $1 لە $PAGEEDITDATE بە دەستی {{gender:$2|$2}} سڕایەوە، بڕوانە $3.',
+'enotif_body_intro_created' => 'پەڕەی {{SITENAME}} $1 لە $PAGEEDITDATE بە دەستی {{gender:$2|$2}} دروست کرا، بۆ پێداچوونەی ھەنووکە بڕوانە $3.',
+'enotif_body_intro_moved' => 'پەڕەی {{SITENAME}} $1 لە $PAGEEDITDATE بە دەستی {{gender:$2|$2}} گوازرایەوە، بۆ پێداچوونەی ھەنووکە بڕوانە $3.',
+'enotif_body_intro_restored' => 'پەڕەی {{SITENAME}} $1 لە $PAGEEDITDATE بە دەستی {{gender:$2|$2}} ھێنرایەوە، بۆ پێداچوونەی ھەنووکە بڕوانە $3.',
+'enotif_body_intro_changed' => 'پەڕەی {{SITENAME}} $1 لە $PAGEEDITDATE بە دەستی {{gender:$2|$2}} گۆڕا، بۆ پێداچوونەی ھەنووکە بڕوانە $3.',
'enotif_lastvisited' => 'بۆ بینینی ھەموو گۆرانکارییەکانی پاش دوایین سەردانت $1 ببینە.',
'enotif_lastdiff' => 'بۆ بینینی ئەم گۆڕانکارییە $1 ببینە.',
'enotif_anon_editor' => 'بەکارھێنەری نەناسراو $1',
'enotif_body' => '‫$WATCHINGUSERNAMEی بەڕێز،
-پەڕەی «$PAGETITLE»ی {{SITENAME}} لە ڕێکەوتی $PAGEEDITDATE بەدەستی $PAGEEDITOR $CHANGEDORCREATED، بۆ بینینی پیاچوونەوەی ئێستای، $PAGETITLE_URL ببینە.
-$NEWPAGE
+$PAGEINTRO $NEWPAG
-پوختەی دەستکارییەکەی: $PAGESUMMARY $PAGEMINOREDIT
+کورتەی دەستکارییەکەی: $PAGESUMMARY $PAGEMINOREDIT
پەیوەندی لەگەڵ دەستکاریکەر:
نامە: $PAGEEDITOR_EMAIL
ویکی: $PAGEEDITOR_WIKI
-تا سەردانی ئەم پەڕە نەکەیت، گۆڕانکارییەکی دیکەی پەڕەکەت پێ ڕاناگەیەندرێت.
-هەروەھا دەتوانی نیشانەکانی ڕاگەیاندن بۆ هەموو پەڕەکانی لیستی چاودێریت لەسەرەتاوە ڕێکبخەیتەوە.
+تا سەردانی ئەم پەڕەیە نەکەیت، گۆڕانکارییەکانی داھاتووی پەڕەکەت پێ ڕاناگەیێندرێت. هەروەھا دەتوانی ئاڵاکانی ڕاگەیاندن لە پەڕەی چاودێرییەکەتدا لە سەرەتاوە ڕێک بخەیتەوە.
-بە سوپاسەوە، سیستەمی ڕاگەیاندنی {{SITENAME}}
+بە سپاسەوە، سیستەمی ڕاگەیاندنی {{SITENAME}}
--
-بۆ گۆڕینی رێکخستنەکانی ڕاگەیاندن بە ئیمەیل، سەربدە لە
+بۆ گۆڕینی رێکخستنەکانی ڕاگەیاندن بە ئیمەیل، بڕوانە
{{canonicalurl:{{#special:Preferences}}}}
-بۆ گۆڕینی ڕێکخستنەکانی لیستی چاودێرییەکەت، سەربدە لە
+بۆ گۆڕینی ڕێکخستنەکانی پێرستی چاودێرییەکەت، بڕوانە
{{canonicalurl:{{#special:EditWatchlist}}}}
-بۆ سڕینەوەی پەڕەکە لە لیستی چاودێرییەکەت، سەربدە لە
+بۆ سڕینەوەی پەڕەکە لە پێرستی چاودێرییەکەت، بڕوانە
$UNWATCHURL
-رێنوێنیی زۆرتر و دەربڕینی بیروڕا:
+کاردانەوە و یارمەتیی زۆرتر:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'دروستکرا',
+'changed' => 'گۆڕدرا',
# Delete
'deletepage' => 'پەڕە بسڕەوە',
@@ -2244,8 +2262,8 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|1 پێداچوونەوە|$1 پێداچوونەوە}} هێنرایەوە',
'undeletedrevisions-files' => '{{PLURAL:$1|1 پێداچوونەوە|$1 پێداچوونەوە}} و {{PLURAL:$2|1 پەڕگە|$2 پەڕگە}} هێنرایەوە',
'undeletedfiles' => '{{PLURAL:$1|1 پەڕگە|$1 پەڕگە}} هێنرایەوه',
-'cannotundelete' => 'لە سڕین گەڕانەوە سەرکەوتوو نەبوو؛
-کەسێکی دیکە پێش تۆ گەڕاندوویەتەوە.',
+'cannotundelete' => 'ھێنانەوە سەرکەوتوو نەبوو:
+$1',
'undeletedpage' => "'''$1 هێنراوەتەوە'''
بۆ دیتنی پێشینەی دوایین سڕینەوەکان و هێنانەوەکان سەرنجی [[Special:Log/delete|لۆگی سڕینەوە]] بدە.",
@@ -2272,7 +2290,7 @@ $1',
'blanknamespace' => '(سەرەکی)',
# Contributions
-'contributions' => 'بەشدارییەکانی بەکارھێنەر',
+'contributions' => 'بەشدارییەکانی {{GENDER:$1|بەکارھێنەر}}',
'contributions-title' => 'بەشدارییەکانی بەکارھێنەر $1',
'mycontris' => 'بەشدارییەکان',
'contribsub2' => 'بۆ $1 ($2)',
@@ -2750,11 +2768,13 @@ $1',
'pageinfo-default-sort' => 'کلیلی ڕیزکردنی بەرگریمانە',
'pageinfo-length' => 'قەبارەی پەڕە (بایت)',
'pageinfo-article-id' => 'زنجیرەی پەڕە',
+'pageinfo-language' => 'زمانی ناوەرۆکی پەڕە',
'pageinfo-robot-policy' => 'چۆنێتیی مۆتۆڕی گەڕان',
'pageinfo-robot-index' => 'شیاو بۆ پێرستکردن',
'pageinfo-robot-noindex' => 'نەشیاو بۆ پێرستکردن',
'pageinfo-views' => 'ژمارەی بینینەکان',
'pageinfo-watchers' => 'ژمارەی چاودێرانی پەڕە',
+'pageinfo-few-watchers' => 'کەمتر لە $1 {{PLURAL:$1|چاودێر}}',
'pageinfo-redirects-name' => 'ڕەوانەکەرەکان بۆ ئەم پەڕەیە',
'pageinfo-subpages-name' => 'ژێرپەڕەکانی ئەم پەڕەیە',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ڕەوانەکەر}}; $3 {{PLURAL:$3|ڕەوانەنەکەر}})',
@@ -2767,6 +2787,14 @@ $1',
'pageinfo-recent-edits' => 'ژمارەی دوایین دەستکارییەکان (لە $1ی ڕابردوودا)',
'pageinfo-recent-authors' => 'ژمارەی دوایین نووسەرە جیاوازەکان',
'pageinfo-templates' => 'داڕێژە{{PLURAL:$1|ی بەکارگیراو| بەکارگیراوەکان}} ($1)',
+'pageinfo-toolboxlink' => 'زانیاریی پەڕە',
+'pageinfo-redirectsto-info' => 'زانیاری',
+'pageinfo-contentpage' => 'ھەژمارکراو وەک پەڕەی بەناوەرۆک',
+'pageinfo-contentpage-yes' => 'بەڵێ',
+'pageinfo-protect-cascading-yes' => 'بەڵێ',
+'pageinfo-category-pages' => 'ژمارەی پەڕەکان',
+'pageinfo-category-subcats' => 'ژمارەی ژێرپەڕەکان',
+'pageinfo-category-files' => 'ژمارەی پەڕگەکان',
# Skin names
'skinname-standard' => 'کلاسیک',
@@ -2789,6 +2817,8 @@ $1',
'markedaspatrollederror' => 'وه‌ک پاس دراو نیشان نەکرا',
'markedaspatrollederrortext' => 'دەبێ پێداچوونەوەیەک دەستنیشان بکەی ھەتا وەک پاس دراو نیشان بکرێ.',
'markedaspatrollederror-noautopatrol' => 'ناتوانی گۆڕانکارییەکانی خۆت وەک پاس دراو نیشان بکەی.',
+'markedaspatrollednotify' => 'ئەم گۆڕانکارییە لەسەر $1 وەک پاس دراو نیشان کرا.',
+'markedaspatrollederrornotify' => 'نیشانکردن وەک پاس دراو سەرکەوتوو نەبوو.',
# Patrol log
'patrol-log-page' => 'لۆگی پاسدەری',
@@ -2816,6 +2846,7 @@ $1',
'file-info-size' => '$1 × $2 پیکسێل، قەبارەی پەڕگە: $3، جۆری MIME: $4',
'file-nohires' => 'رەزۆلوشنی سەرتر لەمە لە بەردەست دا نیە.',
'svg-long-desc' => 'پەڕگەی SVG، بە ناو $1 × $2 پیکسەڵ، قەبارەی پەڕگە: $3',
+'svg-long-error' => 'پەڕگەی SVGی نادروست: $1',
'show-big-image' => 'گەورەکردنەوە',
'show-big-image-preview' => 'قەبارەی ئەم پێشبینینە: $1.',
'show-big-image-other' => '{{PLURAL:$2|ڕەزەلووشنی|ڕەزەلووشنەکانی}} تر: $1.',
@@ -2844,6 +2875,7 @@ $1',
'hours' => '{{PLURAL:$1|$1 کاتژمێر|$1 کاتژمێر}}',
'days' => '{{PLURAL:$1|$1 Ú•Û†Ú˜|$1 Ú•Û†Ú˜}}',
'ago' => '$1 Ù¾ÛŽØ´',
+'just-now' => 'ھەرئێستا',
# Bad image list
'bad_image_list' => 'Ùۆرمات بەم Ø´ÛŽÙˆÛ•ÛŒ خوارەوەیە:
@@ -3422,10 +3454,10 @@ $5
'htmlform-selectorother-other' => 'دیکە',
# New logging system
-'logentry-delete-delete' => '$1 پەڕەی $3ی سڕییەوە',
-'logentry-delete-restore' => '$1 پەڕەی $3ی ھێنایەوە',
-'logentry-delete-revision' => '$1 دەرکەوتنی {{PLURAL:$5|پێداچوونەوەیەکی|$5 پێداچوونەوەی}} پەڕەی $3ی گۆڕیی: $4',
-'logentry-suppress-delete' => '$1 پەڕەی $3 بەرگری کرد.',
+'logentry-delete-delete' => '$1 پەڕەی $3ی {{GENDER:$2|سڕییەوە}}',
+'logentry-delete-restore' => '$1 پەڕەی $3ی {{GENDER:$2|ھێنایەوە}}',
+'logentry-delete-revision' => '$1 دەرکەوتنی {{PLURAL:$5|پێداچوونەوەیەکی|$5 پێداچوونەوەی}} پەڕەی $3ی {{GENDER:$2|گۆڕیی}}: $4',
+'logentry-suppress-delete' => '$1 پەڕەی $3 {{GENDER:$2|بەرگری کرد}}.',
'revdelete-content-hid' => 'ناوەرۆک شاردراوە',
'revdelete-summary-hid' => 'کورتەی دەستکاری شاردراوە',
'revdelete-uname-hid' => 'ناوی بەکارهێنەری شاراوە',
@@ -3434,15 +3466,17 @@ $5
'revdelete-uname-unhid' => 'ناوی بەکارهێنەری نیشان درا',
'revdelete-restricted' => 'ئەو سنووری بەرگریانەی خستراوەتە سەر بەڕێوبەران',
'revdelete-unrestricted' => 'ئەو سنووری بەرگریانەی لابردراوە لە سەر بەڕێوبەران',
-'logentry-move-move' => '$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-newusers-newusers' => 'ھەژماری بەکارھێنەریی $1 دروست کرا',
-'logentry-newusers-create' => 'ھەژماری بەکارھێنەریی $1 دروست کرا',
-'logentry-newusers-create2' => 'ھەژماری بەکارھێنەریی $3 لە لایەن $1 دروست کرا',
-'logentry-newusers-autocreate' => 'ھەژماری $1 بە شێوەی خۆگەڕ دروستکرا',
-'newuserlog-byemail' => 'تێپەڕوشە بە ئیمەیل نێردرا.',
+'logentry-move-move' => '$1 پەڕەی $3ی {{GENDER:$2|گواستەوە}} بۆ $4',
+'logentry-move-move-noredirect' => '$1 پەڕەی $3 بەبێ بەجێھشتنی ڕەوانەکەرێک {{GENDER:$2|گواستەوە}} بۆ $4',
+'logentry-move-move_redir' => '$1 پەڕەی $3 {{GENDER:$2|گواستەوە}} بۆ $4 کە پێشتر ڕەوانەکەر بوو',
+'logentry-move-move_redir-noredirect' => '$1 پەڕەی $3 بەبێ بەجێھشتنی ڕەوانەکەرێک {{GENDER:$2|گواستەوە}} بۆ $4 کە پێشتر ڕەوانەکەر بوو',
+'logentry-patrol-patrol' => '$1 پێداچوونەوەی $4ی پەڕەی $3 وەک پاس دراو {{GENDER:$2|نیشان کرد}}',
+'logentry-patrol-patrol-auto' => '$1 بە شێوەی خۆگەڕ پێداچوونەوەی $4ی پەڕەی $3 وەک پاس دراو {{GENDER:$2|نیشان کرد}}',
+'logentry-newusers-newusers' => 'ھەژماری بەکارھێنەریی $1 {{GENDER:$2|دروست کرا}}',
+'logentry-newusers-create' => 'ھەژماری بەکارھێنەریی $1 {{GENDER:$2|دروست کرا}}',
+'logentry-newusers-create2' => 'ھەژماری بەکارھێنەریی $3 لە لایەن $1 {{GENDER:$2|دروست کرا}}',
+'logentry-newusers-autocreate' => 'ھەژماری بەکارھێنەریی $1 بە شێوەی خۆگەڕ {{GENDER:$2|دروست کرا}}',
+'rightsnone' => '(ھیچ)',
# Feedback
'feedback-subject' => 'بابەت:',
diff --git a/languages/messages/MessagesCo.php b/languages/messages/MessagesCo.php
index f0a15df8..d54e0306 100644
--- a/languages/messages/MessagesCo.php
+++ b/languages/messages/MessagesCo.php
@@ -83,7 +83,6 @@ $messages = array(
# Cologne Blue skin
'qbpageoptions' => 'Issa pagina',
-'qbpageinfo' => 'Cuntestu',
'qbmyoptions' => 'E mo pagine',
'qbspecialpages' => 'Pagine spiciale',
@@ -201,7 +200,6 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
'yourdiff' => 'Differenze',
'template-protected' => '(prutettu)',
'template-semiprotected' => '(mezu prutettu)',
-'nocreatetitle' => 'Creazione di pagina limitata',
# Account creation failure
'cantcreateaccounttitle' => 'Registramentu micca pussibile',
@@ -373,9 +371,8 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
'watch' => 'Seguità',
'enotif_reset' => 'Marcà tutte e pagine visitate',
-'enotif_newpagetext' => 'Ista hè una pagina nova.',
-'changed' => 'cambiatu',
'created' => 'creatu',
+'changed' => 'cambiatu',
# Delete
'deletepage' => 'Supprimà a pagina',
diff --git a/languages/messages/MessagesCps.php b/languages/messages/MessagesCps.php
index 1b611106..5184de1f 100644
--- a/languages/messages/MessagesCps.php
+++ b/languages/messages/MessagesCps.php
@@ -158,7 +158,6 @@ $messages = array(
'qbbrowse' => 'Pangita-on',
'qbedit' => 'Ilisan',
'qbpageoptions' => 'Mini nga pahina',
-'qbpageinfo' => 'Konteksto',
'qbmyoptions' => 'Akon mga pahina',
'qbspecialpages' => 'Pinasahi nga mga pahina',
'faq' => 'Mga perme napamangkot ("FAQ")',
@@ -408,11 +407,8 @@ Mini ang ginhatag nga kabangdanan "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Nakagwa ka na.'''
-Pwede mo mapadayon usar ang {{SITENAME}}, ukon pwede ka [[Special:UserLogin|lmagsulod liwat]] bilang pareho ukon la-in nga manug-usar.
+Pwede mo mapadayon usar ang {{SITENAME}}, ukon pwede ka <span class='plainlinks'>[$1 lmagsulod liwat]</span> bilang pareho ukon la-in nga manug-usar.
Tandaan nga ang iban nga pahina magapadayon nga ipakita nga nakasulod ka man gyapon kuno abi, asta panason mo ang cache sang imo browser.",
-'welcomecreation' => '==Malipayon nga pag-abot, $1! ==
-Nahimo na ang imo account.
-Indi pagkalimtan nga islan ang imo [[Special:Preferences|mga uyon mo sa {{SITENAME}}]].',
'yourname' => 'Hayo (username):',
'yourpassword' => 'Password:',
'yourpasswordagain' => 'Liwata ka pindot ang password:',
@@ -611,6 +607,9 @@ Tistingan mo i-prefiks ang imo pamangkot upod sang ''tanan:'' para makita mo ang
'grouppage-sysop' => '{{ns:project}}:Mga manugdumala',
+# Special:Log/newusers
+'newuserlogpage' => 'Listahan sang pag-ubra sang manug-usar',
+
# User rights log
'rightslog' => 'Lista sang mga karapatan sang manug-usar',
@@ -718,9 +717,6 @@ Ang paglarawan nga yara sa ibabaw sang [$2 pahina sang paglarawan sang akta] sin
# Special:LinkSearch
'linksearch' => 'Panggwa nga mga link',
-# Special:Log/newusers
-'newuserlogpage' => 'Listahan sang pag-ubra sang manug-usar',
-
# Special:ListGroupRights
'listgrouprights-members' => '(lista sang mga myembro)',
diff --git a/languages/messages/MessagesCrh_cyrl.php b/languages/messages/MessagesCrh_cyrl.php
index 2cdc75a7..fce5ba82 100644
--- a/languages/messages/MessagesCrh_cyrl.php
+++ b/languages/messages/MessagesCrh_cyrl.php
@@ -17,10 +17,6 @@ $fallback = 'ru';
$fallback8bitEncoding = 'windows-1251';
-$separatorTransformTable = array( ',' => '.', '.' => ',' );
-
-$linkTrail = '/^([a-zâçğıñöşüа-Ñё“»]+)(.*)$/sDu';
-
$namespaceNames = array(
NS_MEDIA => 'Медиа',
NS_SPECIAL => 'МахÑуÑ',
@@ -40,8 +36,8 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'КатегориÑ_музакереÑи',
);
-# Aliases to latin namespaces
$namespaceAliases = array(
+ # Aliases of Latin (crh-latn) namespaces
"Media" => NS_MEDIA,
"Mahsus" => NS_SPECIAL,
"Muzakere" => NS_TALK,
@@ -105,6 +101,9 @@ $dateFormats = array(
'ISO 8601 both' => 'xnY.xnm.xnd"T"xnH:xni:xns',
);
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
+$linkTrail = '/^([a-zâçğıñöşüа-Ñё“»]+)(.*)$/sDu';
+
$messages = array(
# User preference toggles
'tog-underline' => 'Багълантыларнынъ тюбюни Ñызув:',
@@ -241,6 +240,7 @@ $messages = array(
'newwindow' => '(Ñнъы бир пенджереде ачылыр)',
'cancel' => 'ЛÑгъу',
'moredotdotdot' => 'Даа...',
+'morenotlisted' => 'Башкъа бир шей ёкъ...',
'mypage' => 'Саифе',
'mytalk' => 'Музакере',
'anontalk' => 'Бу IP-нинъ музакереÑи',
@@ -252,7 +252,6 @@ $messages = array(
'qbbrowse' => 'Бакъып чыкъ',
'qbedit' => 'Денъиштир',
'qbpageoptions' => 'Бу Ñаифе',
-'qbpageinfo' => 'Саифе акъкъында малюмат',
'qbmyoptions' => 'Саифелерим',
'qbspecialpages' => 'МахÑÑƒÑ Ñаифелер',
'faq' => 'Сыкъ берильген Ñуаллер',
@@ -275,6 +274,7 @@ $messages = array(
'namespaces' => 'ИÑим фезалары',
'variants' => 'Вариантлар',
+'navigation-heading' => 'Долашув менюÑи',
'errorpagetitle' => 'Хата',
'returnto' => '$1.',
'tagline' => '{{GRAMMAR:ablative|{{SITENAME}}}}',
@@ -497,10 +497,7 @@ $2',
# Login and logout pages
'logouttext' => "'''Отурымны къапаттынъыз.'''
-Шимди {{SITENAME}} Ñайтыны аноним оларакъ къулланып олаÑынъыз, Ñ Ð´Ð° Ñнъыдан [[Special:UserLogin|отурым ачып]] олаÑынъыз (иÑтер айны къулланыджы адынен, иÑтер башкъа бир къулланыджы адынен). Web браузеринъиз кÑшини темизлегендже базы Ñаифелер Ñанки Ð°Ð»Ñ Ð´Ð°Ð° отурымынъыз ачыкъ Ñкен киби корюнип олур.",
-'welcomecreation' => '== Хош кельдинъиз, $1! ==
-ЭÑабынъыз ачылды.
-Бу Ñайтнынъ [[Special:Preferences|Ñазламаларыны]] шахÑынъызгъа коре денъиштирмеге унутманъыз.',
+Шимди {{SITENAME}} Ñайтыны аноним оларакъ къулланып олаÑынъыз, Ñ Ð´Ð° Ñнъыдан <span class='plainlinks'>[$1 отурым ачып]</span> олаÑынъыз (иÑтер айны къулланыджы адынен, иÑтер башкъа бир къулланыджы адынен). Web браузеринъиз кÑшини темизлегендже базы Ñаифелер Ñанки Ð°Ð»Ñ Ð´Ð°Ð° отурымынъыз ачыкъ Ñкен киби корюнип олур.",
'yourname' => 'Къулланыджы адынъыз',
'yourpassword' => 'Паролинъиз',
'yourpasswordagain' => 'Парольни бир даа Ñзынъыз:',
@@ -741,7 +738,6 @@ $2 къулланыджыÑына вакътынджа <code>$3</code> пароÐ
'template-protected' => '(къорчалав алтында)',
'template-semiprotected' => '(къыÑмен къорчалав алтында)',
'hiddencategories' => 'Бу Ñаифе {{PLURAL:$1|1|$1}} гизли категориÑгъа менÑюптир:',
-'nocreatetitle' => 'Саифе Ñратув Ñынъырлыдыр',
'nocreatetext' => '{{SITENAME}} Ñайтында Ñнъы Ñаифе Ñратув Ñынъырлыдыр.
Кери къайтып мевджут олгъан Ñаифени денъиштире, [[Special:UserLogin|отурым ача Ñ Ð´Ð° Ñнъы бир ÑÑап Ñратып олаÑынъыз]].',
'nocreate-loggedin' => 'Янъы Ñаифелер Ñратмагъа изининъиз ёкътыр.',
@@ -1034,6 +1030,10 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'grouppage-bureaucrat' => '{{ns:project}}:Бюрократлар',
'grouppage-suppress' => '{{ns:project}}:Тефтишчилер',
+# Special:Log/newusers
+'newuserlogpage' => 'Янъы къулланыджы журналы',
+'newuserlogpagetext' => 'Энъ Ñонъки къайд олгъан къулланыджы журналы.',
+
# User rights log
'rightslog' => 'Къулланыджынынъ акълары журналы',
@@ -1386,10 +1386,6 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'listusers-submit' => 'КоÑьтер',
'listusers-noresult' => 'Ич бир къулланыджы тапылмады.',
-# Special:Log/newusers
-'newuserlogpage' => 'Янъы къулланыджы журналы',
-'newuserlogpagetext' => 'Энъ Ñонъки къайд олгъан къулланыджы журналы.',
-
# Special:ListGroupRights
'listgrouprights-members' => '(азалар джедвели)',
@@ -1448,43 +1444,38 @@ $3 мына бу Ñебепни бильдирди: ''$2''",
'enotif_mailer' => '{{SITENAME}} почта ваÑтаÑынен хабер берген хызмет',
'enotif_reset' => 'Джумле Ñаифелерни бакъылгъан оларакъ ишаретле',
-'enotif_newpagetext' => 'Бу Ñнъы бир Ñаифедир.',
'enotif_impersonal_salutation' => '{{SITENAME}} къулланыджыÑÑ‹',
-'changed' => 'денъиштирильди',
-'created' => 'Ñратылды',
-'enotif_subject' => '«{{SITENAME}}» $PAGETITLE ÑаифеÑи $PAGEEDITOR къулланыджы тарафындан $CHANGEDORCREATED',
'enotif_lastvisited' => 'Сонъки зиÑретинъизден берли Ñпылгъан денъиштирмелерни корьмек ичюн $1 бакъынъыз.',
'enotif_anon_editor' => 'адÑыз (аноним) къулланыджы $1',
'enotif_body' => 'Сайгъылы $WATCHINGUSERNAME,
+$PAGEINTRO $NEWPAGE
-{{SITENAME}} Ñайтындаки $PAGETITLE Ñерлевалы Ñаифе $PAGEEDITDATE тарихында $PAGEEDITOR тарафындан $CHANGEDORCREATED. Саифенинъ шимдики алыны $PAGETITLE_URL адреÑинде корип олаÑынъыз.
-
-$NEWPAGE
-
-Денъишменинъ къыÑкъа тарифи: $PAGESUMMARY $PAGEMINOREDIT
+Денъиштирменинъ къыÑкъа тарифи: $PAGESUMMARY $PAGEMINOREDIT
Саифени денъиштирген къулланыджынен багъланмакъ ичюн:
-e-mail адреÑи: $PAGEEDITOR_EMAIL
+Ñ-маиль адреÑи: $PAGEEDITOR_EMAIL
вики ÑаифеÑи: $PAGEEDITOR_WIKI
-Бу Ñаифени зиÑрет ÑтмеÑенъиз, бирев оны бир даа денъиштирÑе, ич бир тенби беÑнаты ёлланмайджакъ. Козетюв джедвелинъиздеки бутюн Ñаифелер ичюн тенби Ñазламаларыны денъиштире билеÑинъиз.
+Бу Ñаифени зиÑрет ÑтмеÑенъиз, бирев оны бир даа денъиштирÑе де, ич бир тенби беÑнаты ёлланмайджакъ. Козетюв джедвелинъиздеки бутюн Ñаифелер ичюн тенби Ñазламаларыны денъиштире билеÑинъиз.
-{{SITENAME}} тенби ÑиÑтемаÑÑ‹.
+{{SITENAME}} бильдирюв ÑиÑтемаÑÑ‹
--
Бильдирюв Ñазламаларыны денъиштирмек ичюн:
{{canonicalurl:{{#special:Preferences}}}}
-Сазламаларны денъиштирмек ичюн:
+Козетюв джедвели Ñазламаларыны денъиштирмек ичюн:
{{canonicalurl:{{#special:EditWatchlist}}}}
-Саифени козетюв джедвелинден ёкъ Ñтмек ичюн:
+Саифени козетюв джедвелинден чыкъармакъ ичюн:
$UNWATCHURL
Ярдым ве теклифлер ичюн:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'Ñратылды',
+'changed' => 'денъиштирильди',
# Delete
'deletepage' => 'Саифени ёкъ ÑÑ‚',
@@ -1576,7 +1567,7 @@ $UNWATCHURL
'blanknamespace' => '(ЭÑаÑ)',
# Contributions
-'contributions' => 'Къулланыджынынъ иÑÑелери',
+'contributions' => '{{GENDER:$1|Къулланыджынынъ}} иÑÑелери',
'contributions-title' => '$1 къулланыджыÑынынъ иÑÑелери',
'mycontris' => 'ИÑÑелер',
'contribsub2' => '$1 ($2)',
@@ -2116,9 +2107,6 @@ $5
# HTML forms
'htmlform-reset' => 'Денъишикликлерни кери ал',
-# New logging system
-'newuserlog-byemail' => 'пароль e-mail ваÑтаÑынен йиберильген',
-
# Search suggestions
'searchsuggest-containing' => 'ичинде бу олгъан...',
diff --git a/languages/messages/MessagesCrh_latn.php b/languages/messages/MessagesCrh_latn.php
index a8bf8e13..e6a763e0 100644
--- a/languages/messages/MessagesCrh_latn.php
+++ b/languages/messages/MessagesCrh_latn.php
@@ -14,8 +14,6 @@
$fallback8bitEncoding = 'windows-1254';
-$separatorTransformTable = array( ',' => '.', '.' => ',' );
-
$namespaceNames = array(
NS_MEDIA => 'Media',
NS_SPECIAL => 'Mahsus',
@@ -35,8 +33,8 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'Kategoriya_muzakeresi',
);
-# Aliases to cyril namespaces
$namespaceAliases = array(
+ # Aliases to Cyrillic (crh-cyrl) namespaces
"Медиа" => NS_MEDIA,
"МахÑуÑ" => NS_SPECIAL,
"Музакере" => NS_TALK,
@@ -57,7 +55,6 @@ $namespaceAliases = array(
'КатегориÑ_музакереÑи' => NS_CATEGORY_TALK
);
-
$datePreferences = array(
'default',
'mdy',
@@ -98,6 +95,7 @@ $dateFormats = array(
'ISO 8601 both' => 'xnY.xnm.xnd"T"xnH:xni:xns',
);
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
$linkTrail = '/^([a-zâçğıñöşüа-Ñё“»]+)(.*)$/sDu';
$messages = array(
@@ -236,6 +234,7 @@ $messages = array(
'newwindow' => '(yañı bir pencerede açılır)',
'cancel' => 'Lâğu',
'moredotdotdot' => 'Daa...',
+'morenotlisted' => 'BaÅŸqa bir ÅŸey yoq...',
'mypage' => 'Saife',
'mytalk' => 'Muzakere',
'anontalk' => 'Bu IP-niñ muzakeresi',
@@ -247,7 +246,6 @@ $messages = array(
'qbbrowse' => 'Baqıp çıq',
'qbedit' => 'Deñiştir',
'qbpageoptions' => 'Bu saife',
-'qbpageinfo' => 'Saife aqqında malümat',
'qbmyoptions' => 'Saifelerim',
'qbspecialpages' => 'Mahsus saifeler',
'faq' => 'Sıq berilgen sualler',
@@ -270,6 +268,7 @@ $messages = array(
'namespaces' => 'İsim fezaları',
'variants' => 'Variantlar',
+'navigation-heading' => 'Dolaşuv menüsi',
'errorpagetitle' => 'Hata',
'returnto' => '$1.',
'tagline' => '{{GRAMMAR:ablative|{{SITENAME}}}}',
@@ -493,10 +492,7 @@ Sebep: ''$2''.",
# Login and logout pages
'logouttext' => "'''Oturımnı qapattıñız.'''
-Şimdi {{SITENAME}} saytını anonim olaraq qullanıp olasıñız, ya da yañıdan [[Special:UserLogin|oturım açıp]] olasıñız (ister aynı qullanıcı adınen, ister başqa bir qullanıcı adınen). Web brauzeriñiz keşini temizlegence bazı saifeler sanki alâ daa oturımıñız açıq eken kibi körünip olur.",
-'welcomecreation' => '== Hoş keldiñiz, $1! ==
-Esabıñız açıldı.
-Bu saytnıñ [[Special:Preferences|sazlamalarını]] şahsıñızğa köre deñiştirmege unutmañız.',
+Şimdi {{SITENAME}} saytını anonim olaraq qullanıp olasıñız, ya da yañıdan <span class='plainlinks'>[$1 oturım açıp]</span> olasıñız (ister aynı qullanıcı adınen, ister başqa bir qullanıcı adınen). Web brauzeriñiz keşini temizlegence bazı saifeler sanki alâ daa oturımıñız açıq eken kibi körünip olur.",
'yourname' => 'Qullanıcı adıñız',
'yourpassword' => 'Paroliñiz',
'yourpasswordagain' => 'Parolni bir daa yazıñız:',
@@ -738,7 +734,6 @@ Jurnalnıñ soñki yazısı aşağıda berilgen:",
'template-protected' => '(qorçalav altında)',
'template-semiprotected' => '(qısmen qorçalav altında)',
'hiddencategories' => 'Bu saife {{PLURAL:$1|1|$1}} gizli kategoriyağa mensüptir:',
-'nocreatetitle' => 'Saife yaratuv sıñırlıdır',
'nocreatetext' => '{{SITENAME}} saytında yañı saife yaratuv sıñırlıdır.
Keri qaytıp mevcut olğan saifeni deñiştire, [[Special:UserLogin|oturım aça ya da yañı bir esap yaratıp olasıñız]].',
'nocreate-loggedin' => 'Yañı saifeler yaratmağa iziniñiz yoqtır.',
@@ -1031,6 +1026,10 @@ Eger bildirseñiz, saifelerdeki deñiştirmelerni kimniñ yapqanını köstermek
'grouppage-bureaucrat' => '{{ns:project}}:Bürokratlar',
'grouppage-suppress' => '{{ns:project}}:Teftişçiler',
+# Special:Log/newusers
+'newuserlogpage' => 'Yañı qullanıcı jurnalı',
+'newuserlogpagetext' => 'Eñ sоñki qayd оlğan qullanıcı jurnalı.',
+
# User rights log
'rightslog' => 'Qullanıcınıñ aqları jurnalı',
@@ -1382,10 +1381,6 @@ Ayrıca [[Special:WantedCategories|talap etilgen kategoriyalarnıñ cedveline]]
'listusers-submit' => 'Köster',
'listusers-noresult' => 'İç bir qullanıcı tapılmadı.',
-# Special:Log/newusers
-'newuserlogpage' => 'Yañı qullanıcı jurnalı',
-'newuserlogpagetext' => 'Eñ sоñki qayd оlğan qullanıcı jurnalı.',
-
# Special:ListGroupRights
'listgrouprights-members' => '(azalar cedveli)',
@@ -1444,21 +1439,14 @@ Bundan soñ, bu saifede ve onıñ muzakere saifesinde yapılacaq deñiştirmeler
'enotif_mailer' => '{{SITENAME}} poçta vastasınen haber bergen hızmet',
'enotif_reset' => 'Cümle saifelerni baqılğan olaraq işaretle',
-'enotif_newpagetext' => 'Bu yañı bir saifedir.',
'enotif_impersonal_salutation' => '{{SITENAME}} qullanıcısı',
-'changed' => 'deñiştirildi',
-'created' => 'yaratıldı',
-'enotif_subject' => '"{{SITENAME}}" $PAGETITLE saifesi $PAGEEDITOR qullanıcı tarafından $CHANGEDORCREATED',
'enotif_lastvisited' => 'Soñki ziyaretiñizden berli yapılğan deñiştirmelerni körmek içün $1 baqıñız.',
'enotif_anon_editor' => 'adsız (anonim) qullanıcı $1',
'enotif_body' => 'Sayğılı $WATCHINGUSERNAME,
+$PAGEINTRO $NEWPAGE
-{{SITENAME}} saytındaki $PAGETITLE saifesi $PAGEEDITDATE künü $PAGEEDITOR tarafından $CHANGEDORCREATED. Saifeniñ şimdiki alını $PAGETITLE_URL adresinde körip olasıñız.
-
-$NEWPAGE
-
-Deñişmeniñ qısqa tarifi: $PAGESUMMARY $PAGEMINOREDIT
+Deñiştirmeniñ qısqa tarifi: $PAGESUMMARY $PAGEMINOREDIT
Saifeni deñiştirgen qullanıcınen bağlanmaq içün:
e-mail adresi: $PAGEEDITOR_EMAIL
@@ -1466,9 +1454,10 @@ viki saifesi: $PAGEEDITOR_WIKI
Bu saifeni ziyaret etmeseñiz, birev onı bir daa deñiştirse de, iç bir tenbi beyanatı yollanmaycaq. Közetüv cedveliñizdeki bütün saifeler içün tenbi sazlamalarını deñiştire bilesiñiz.
-{{SITENAME}} tenbi sisteması.
+{{SITENAME}} bildirüv sisteması
--
+
Bildirüv sazlamalarını deñiştirmek içün:
{{canonicalurl:{{#special:Preferences}}}}
@@ -1480,6 +1469,8 @@ $UNWATCHURL
Yardım ve teklifler içün:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'yaratıldı',
+'changed' => 'deñiştirildi',
# Delete
'deletepage' => 'Saifeni yoq et',
@@ -1571,7 +1562,7 @@ Bu saifeniñ qorçalav seviyesini deñiştirip olasıñız, amma kaskadlı qorç
'blanknamespace' => '(Esas)',
# Contributions
-'contributions' => 'Qullanıcınıñ isseleri',
+'contributions' => '{{GENDER:$1|Qullanıcınıñ}} isseleri',
'contributions-title' => '$1 qullanıcısınıñ isseleri',
'mycontris' => 'Ä°sseler',
'contribsub2' => '$1 ($2)',
@@ -2117,9 +2108,6 @@ Bitirgen soñ "{{int:Watchlistedit-raw-submit}}" yazısına basıñız.
# HTML forms
'htmlform-reset' => 'Deñişikliklerni keri al',
-# New logging system
-'newuserlog-byemail' => 'parol e-mail vastasınen yiberilgen',
-
# Search suggestions
'searchsuggest-containing' => 'içinde bu olğan...',
diff --git a/languages/messages/MessagesCs.php b/languages/messages/MessagesCs.php
index 79266d9d..46c1c3c7 100644
--- a/languages/messages/MessagesCs.php
+++ b/languages/messages/MessagesCs.php
@@ -56,87 +56,112 @@ $namespaceNames = array(
);
$namespaceAliases = array(
- 'Uživatel_diskuse' => NS_USER_TALK, # old literal translation backward compatibility
- 'Uživatelka_diskuse' => NS_USER_TALK, # female complement to old literal translation style
- '$1_diskuse' => NS_PROJECT_TALK, # old literal translation backward compatibility
- 'Soubor_diskuse' => NS_FILE_TALK, # old literal translation backward compatibility
- 'MediaWiki_diskuse' => NS_MEDIAWIKI_TALK, # old literal translation backward compatibility
- 'Å ablona_diskuse' => NS_TEMPLATE_TALK, # old literal translation backward compatibility
- 'Nápověda_diskuse' => NS_HELP_TALK, # old literal translation backward compatibility
- 'Kategorie_diskuse' => NS_CATEGORY_TALK, # old literal translation backward compatibility
+ 'Uživatel_diskuse' => NS_USER_TALK, # old literal translation backward compatibility
+ 'Uživatelka_diskuse' => NS_USER_TALK, # female complement to old literal translation style
+ '$1_diskuse' => NS_PROJECT_TALK, # old literal translation backward compatibility
+ 'Soubor_diskuse' => NS_FILE_TALK, # old literal translation backward compatibility
+ 'MediaWiki_diskuse' => NS_MEDIAWIKI_TALK, # old literal translation backward compatibility
+ 'Å ablona_diskuse' => NS_TEMPLATE_TALK, # old literal translation backward compatibility
+ 'Nápověda_diskuse' => NS_HELP_TALK, # old literal translation backward compatibility
+ 'Kategorie_diskuse' => NS_CATEGORY_TALK, # old literal translation backward compatibility
);
$namespaceGenderAliases = array(
- NS_USER => array( 'male' => 'Uživatel', 'female' => 'Uživatelka' ),
- NS_USER_TALK => array( 'male' => 'Diskuse_s_uživatelem', 'female' => 'Diskuse_s_uživatelkou' ),
+ NS_USER => array( 'male' => 'Uživatel', 'female' => 'Uživatelka' ),
+ NS_USER_TALK => array( 'male' => 'Diskuse_s_uživatelem', 'female' => 'Diskuse_s_uživatelkou' ),
);
-/**
- * Date formats list for Special:Preferences
- * see $dateFormats for definitions
- */
-$datePreferences = array(
- 'ÄŒSN basic dt',
- 'ÄŒSN padded dt',
- 'ÄŒSN basic td',
- 'ÄŒSN padded td',
- 'PÄŒP dt',
- 'PÄŒP td',
- 'ISO dt',
-);
-
-/**
- * Default date format to be used
- */
-$defaultDateFormat = 'ÄŒSN basic dt';
-
-/**
- * Date formats definitions
- *
- * ČSN - Česká státní norma 01 6910 / Czech state norm 01 6910; numeral representation, basic = 1-12(31), padded = 01-12(31)
- * PÄŒP - Pravidla Äeského pravopisu / The rules of Czech ortography (ISBN 80-200-0475-0); verbal representation
- * ISO - ISO 8601:2004 - Data elements and interchange formats -- Information interchange -- Representation of dates and times
- * dt - date, time order
- * td - time, date order
- */
-$dateFormats = array(
- 'ÄŒSN basic dt time' => 'H:i',
- 'ÄŒSN basic dt date' => 'j. n. Y',
- 'ÄŒSN basic dt both' => 'j. n. Y, H:i',
-
- 'ÄŒSN padded dt time' => 'H:i',
- 'ÄŒSN padded dt date' => 'd.m.Y',
- 'ÄŒSN padded dt both' => 'd.m.Y, H:i',
-
- 'ÄŒSN basic td time' => 'H:i',
- 'ÄŒSN basic td date' => 'j. n. Y',
- 'ÄŒSN basic td both' => 'H:i, j. n. Y',
-
- 'ÄŒSN padded td time' => 'H:i',
- 'ÄŒSN padded td date' => 'd.m.Y',
- 'ÄŒSN padded td both' => 'H:i, d.m.Y',
-
- 'PÄŒP dt time' => 'H.i',
- 'PÄŒP dt date' => 'j. xg Y',
- 'PÄŒP dt both' => 'j. xg Y, H.i',
-
- 'PÄŒP td time' => 'H.i',
- 'PÄŒP td date' => 'j. xg Y',
- 'PÄŒP td both' => 'H.i, j. xg Y',
-
- 'ISO dt time' => 'xnH:xni:xns',
- 'ISO dt date' => 'xnY-xnm-xnd',
- 'ISO dt both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
-);
-
-/**
- * Default list of book sources
- * Hledání knihy podle ISBN
- */
-$bookstoreList = array(
- 'Národní knihovna' => 'http://aleph.nkp.cz/F/?func=find-a&find_code=ISN&request=$1',
- 'Státní technická knihovna' => 'http://www.stk.cz/cgi-bin/dflex/CZE/STK/BROWSE?A=01&V=$1',
- 'inherit' => true,
+$specialPageAliases = array(
+ 'Activeusers' => array( 'Aktivní_uživatelé', 'Aktivni_uzivatele' ),
+ 'Allmessages' => array( 'Všechna_hlášení', 'Všechny_zprávy', 'Vsechna_hlaseni', 'Vsechny_zpravy' ),
+ 'Allpages' => array( 'Všechny_stránky', 'Vsechny_stranky' ),
+ 'Ancientpages' => array( 'Nejstarší_stránky', 'Staré_stránky', 'Stare_stranky' ),
+ 'Blankpage' => array( 'Prázdná_stránka' ),
+ 'Block' => array( 'Blokování', 'Blokovani', 'Blokovat_uživatele', 'Blokovat_IP', 'Blokovat_uzivatele' ),
+ 'Blockme' => array( 'Zablokuj_mÄ›', 'Zablokuj_me' ),
+ 'Booksources' => array( 'Zdroje_knih' ),
+ 'BrokenRedirects' => array( 'Přerušená_přesměrování', 'Prerusena_presmerovani' ),
+ 'Categories' => array( 'Kategorie' ),
+ 'ChangeEmail' => array( 'Změna_emailu', 'Zmena_emailu' ),
+ 'ChangePassword' => array( 'Změna_hesla', 'Zmena_hesla', 'Resetovat_heslo' ),
+ 'ComparePages' => array( 'Porovnání_stránek', 'PorovnáníStránek', 'Porovnani_stranek', 'PorovnaniStranek' ),
+ 'Confirmemail' => array( 'Potvrdit_e-mail' ),
+ 'Contributions' => array( 'Příspěvky', 'Prispevky' ),
+ 'CreateAccount' => array( 'VytvoÅ™it_úÄet', 'Vytvorit_ucet' ),
+ 'Deadendpages' => array( 'Slepé_stránky', 'Slepe_stranky' ),
+ 'DeletedContributions' => array( 'Smazané_příspěvky', 'Smazane_prispevky' ),
+ 'Disambiguations' => array( 'Rozcestníky', 'Rozcestniky' ),
+ 'DoubleRedirects' => array( 'Dvojitá_přesměrování', 'Dvojita_presmerovani' ),
+ 'Emailuser' => array( 'E-mail' ),
+ 'Export' => array( 'Exportovat_stránky' ),
+ 'Fewestrevisions' => array( 'Stránky_s_nejménÄ›_editacemi', 'Stranky_s_nejmene_editacemi', 'Stránky_s_nejmenším_poÄtem_editací' ),
+ 'FileDuplicateSearch' => array( 'Hledání_duplicitních_souborů', 'Hledani_duplicitnich_souboru' ),
+ 'Filepath' => array( 'Cesta_k_souboru' ),
+ 'Import' => array( 'Importovat_stránky' ),
+ 'Invalidateemail' => array( 'Zneplatnit_e-mail', 'Zrušit_potvrzení_e-mailu' ),
+ 'BlockList' => array( 'Blokovaní_uživatelé', 'Blokovani_uzivatele' ),
+ 'LinkSearch' => array( 'Hledání_odkazů', 'Hledani_odkazu' ),
+ 'Listadmins' => array( 'Seznam_správců', 'Seznam_spravcu' ),
+ 'Listbots' => array( 'Seznam_botů', 'Seznam_botu' ),
+ 'Listfiles' => array( 'Seznam_souborů', 'Seznam_souboru' ),
+ 'Listgrouprights' => array( 'Seznam_uživatelských_práv', 'Seznam_uzivatelskych_prav' ),
+ 'Listredirects' => array( 'Seznam_přesměrování', 'Seznam_presmerovani' ),
+ 'Listusers' => array( 'Uživatelé', 'Uzivatele', 'Seznam_uživatelů', 'Seznam_uzivatelu' ),
+ 'Lockdb' => array( 'Zamknout_databázi', 'Zamknout_databazi' ),
+ 'Log' => array( 'Protokolovací_záznamy', 'Protokoly', 'Protokol', 'Protokolovaci_zaznamy' ),
+ 'Lonelypages' => array( 'SirotÄí_stránky', 'Sirotci_stranky' ),
+ 'Longpages' => array( 'Nejdelší_stránky', 'Nejdelsi_stranky' ),
+ 'MergeHistory' => array( 'SlouÄení_historie', 'Slouceni_historie', 'SlouÄit_historii' ),
+ 'MIMEsearch' => array( 'Hledání_podle_MIME', 'Hledani_podle_MIME', 'Hledat_podle_MIME_typu' ),
+ 'Mostcategories' => array( 'Stránky_s_nejvíce_kategoriemi', 'Stranky_s_nejvice_kategoriemi', 'Stránky_s_nejvyšším_poÄtem_kategorií' ),
+ 'Mostimages' => array( 'Nejpoužívanější_soubory', 'Nejpouzivanejsi_soubory' ),
+ 'Mostlinked' => array( 'Nejodkazovanější_stránky', 'Nejodkazovanejsi_stranky' ),
+ 'Mostlinkedcategories' => array( 'Nejpoužívanější_kategorie', 'Nejpouzivanejsi_kategorie' ),
+ 'Mostlinkedtemplates' => array( 'Nejpoužívanější_šablony', 'Nejpouzivanejsi_sablony' ),
+ 'Mostrevisions' => array( 'Stránky_s_nejvíce_editacemi', 'Stranky_s_nejvice_editacemi', 'Stránky_s_nejvyšším_poÄtem_editací' ),
+ 'Movepage' => array( 'Přesunout_stránku' ),
+ 'Mycontributions' => array( 'Mé_příspěvky', 'Me_prispevky' ),
+ 'Mypage' => array( 'Moje_stránka', 'Moje_stranka' ),
+ 'Mytalk' => array( 'Moje_diskuse' ),
+ 'Newimages' => array( 'Nové_obrázky', 'Galerie_nových_obrázků', 'Nove_obrazky' ),
+ 'Newpages' => array( 'Nové_stránky', 'Nove_stranky', 'Nejnovější_stránky', 'Nejnovejsi_stranky' ),
+ 'Popularpages' => array( 'Nejnavštěvovanější_stránky', 'Nejnavstevovanejsi_stranky' ),
+ 'Preferences' => array( 'Nastavení', 'Nastaveni' ),
+ 'Protectedpages' => array( 'ZamÄené_stránky', 'Zamcene_stranky' ),
+ 'Protectedtitles' => array( 'ZamÄené_názvy', 'Zamcene_nazvy', 'Stránky_které_nelze_vytvoÅ™it' ),
+ 'Randompage' => array( 'Náhodná_stránka', 'Nahodna_stranka' ),
+ 'Randomredirect' => array( 'Náhodné_přesměrování', 'Nahodne_presmerovani' ),
+ 'Recentchanges' => array( 'Poslední_změny', 'Posledni_zmeny' ),
+ 'Recentchangeslinked' => array( 'Související_změny', 'Souvisejici_zmeny' ),
+ 'Revisiondelete' => array( 'Smazat_revizi' ),
+ 'Search' => array( 'Hledání', 'Hledani' ),
+ 'Shortpages' => array( 'Nejkratší_stránky', 'Nejkratsi_stranky' ),
+ 'Specialpages' => array( 'Speciální_stránky', 'Specialni_stranky' ),
+ 'Statistics' => array( 'Statistika', 'Statistiky' ),
+ 'Tags' => array( 'ZnaÄky', 'Znacky' ),
+ 'Unblock' => array( 'Odblokování', 'Odblokovani' ),
+ 'Uncategorizedcategories' => array( 'Nekategorizované_kategorie', 'Nekategorizovane_kategorie' ),
+ 'Uncategorizedimages' => array( 'Nekategorizované_soubory', 'Nekategorizovane_soubory' ),
+ 'Uncategorizedpages' => array( 'Nekategorizované_stránky', 'Nekategorizovane_stranky' ),
+ 'Uncategorizedtemplates' => array( 'Nekategorizované_šablony', 'Nekategorizovane_sablony' ),
+ 'Undelete' => array( 'Smazané_stránky', 'Smazane_stranky' ),
+ 'Unlockdb' => array( 'Odemknout_databázi', 'Odemknout_databazi' ),
+ 'Unusedcategories' => array( 'Nepoužívané_kategorie', 'Nepouzivane_kategorie' ),
+ 'Unusedimages' => array( 'Nepoužívané_soubory', 'Nepouzivane_soubory' ),
+ 'Unusedtemplates' => array( 'Nepoužívané_šablony', 'Nepouzivane_sablony' ),
+ 'Unwatchedpages' => array( 'Nesledované_stránky' ),
+ 'Upload' => array( 'NaÄíst_soubor', 'Nacist_soubor', 'NaÄíst_obrázek' ),
+ 'Userlogin' => array( 'Přihlásit', 'Prihlasit' ),
+ 'Userlogout' => array( 'Odhlásit', 'Odhlasit' ),
+ 'Userrights' => array( 'Uživatelská_práva', 'Správa_uživatelů', 'Uzivatelska_prava' ),
+ 'Version' => array( 'Verze' ),
+ 'Wantedcategories' => array( 'Chybějící_kategorie', 'Požadované_kategorie', 'Pozadovane_kategorie' ),
+ 'Wantedfiles' => array( 'Chybějící_soubory', 'Požadované_soubory', 'Pozadovane_soubory' ),
+ 'Wantedpages' => array( 'Chybějící_stránky', 'Požadované_stránky', 'Pozadovane_stranky' ),
+ 'Wantedtemplates' => array( 'Chybějící_šablony', 'Požadované_šablony', 'Pozadovane_sablony' ),
+ 'Watchlist' => array( 'Sledované_stránky', 'Sledovane_stranky' ),
+ 'Whatlinkshere' => array( 'Co_odkazuje_na', 'Odkazuje_sem' ),
+ 'Withoutinterwiki' => array( 'Bez_interwiki', 'Stránky_bez_interwiki_odkazů' ),
);
$magicWords = array(
@@ -258,6 +283,74 @@ $magicWords = array(
);
/**
+ * Date formats list for Special:Preferences
+ * see $dateFormats for definitions
+ */
+$datePreferences = array(
+ 'ÄŒSN basic dt',
+ 'ÄŒSN padded dt',
+ 'ÄŒSN basic td',
+ 'ÄŒSN padded td',
+ 'PÄŒP dt',
+ 'PÄŒP td',
+ 'ISO dt',
+);
+
+/**
+ * Default date format to be used
+ */
+$defaultDateFormat = 'ÄŒSN basic dt';
+
+/**
+ * Date formats definitions
+ *
+ * ČSN - Česká státní norma 01 6910 / Czech state norm 01 6910; numeral representation, basic = 1-12(31), padded = 01-12(31)
+ * PÄŒP - Pravidla Äeského pravopisu / The rules of Czech ortography (ISBN 80-200-0475-0); verbal representation
+ * ISO - ISO 8601:2004 - Data elements and interchange formats -- Information interchange -- Representation of dates and times
+ * dt - date, time order
+ * td - time, date order
+ */
+$dateFormats = array(
+ 'ÄŒSN basic dt time' => 'H:i',
+ 'ÄŒSN basic dt date' => 'j. n. Y',
+ 'ÄŒSN basic dt both' => 'j. n. Y, H:i',
+
+ 'ÄŒSN padded dt time' => 'H:i',
+ 'ÄŒSN padded dt date' => 'd.m.Y',
+ 'ÄŒSN padded dt both' => 'd.m.Y, H:i',
+
+ 'ÄŒSN basic td time' => 'H:i',
+ 'ÄŒSN basic td date' => 'j. n. Y',
+ 'ÄŒSN basic td both' => 'H:i, j. n. Y',
+
+ 'ÄŒSN padded td time' => 'H:i',
+ 'ÄŒSN padded td date' => 'd.m.Y',
+ 'ÄŒSN padded td both' => 'H:i, d.m.Y',
+
+ 'PÄŒP dt time' => 'H.i',
+ 'PÄŒP dt date' => 'j. xg Y',
+ 'PÄŒP dt both' => 'j. xg Y, H.i',
+
+ 'PÄŒP td time' => 'H.i',
+ 'PÄŒP td date' => 'j. xg Y',
+ 'PÄŒP td both' => 'H.i, j. xg Y',
+
+ 'ISO dt time' => 'xnH:xni:xns',
+ 'ISO dt date' => 'xnY-xnm-xnd',
+ 'ISO dt both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+);
+
+/**
+ * Default list of book sources
+ * Hledání knihy podle ISBN
+ */
+$bookstoreList = array(
+ 'Národní knihovna' => 'http://aleph.nkp.cz/F/?func=find-a&find_code=ISN&request=$1',
+ 'Státní technická knihovna' => 'http://www.stk.cz/cgi-bin/dflex/CZE/STK/BROWSE?A=01&V=$1',
+ 'inherit' => true,
+);
+
+/**
* Regular expression matching the "link trail", e.g. "ed" in [[Toast]]ed, as
* the first group, and the remainder of the string as the second group.
*/
@@ -266,98 +359,6 @@ $linkTrail = '/^([a-záÄÄéěíňóřšťúůýž]+)(.*)$/sDu';
$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
-$specialPageAliases = array(
- 'Activeusers' => array( 'Aktivní_uživatelé', 'Aktivni_uzivatele' ),
- 'Allmessages' => array( 'Všechna_hlášení', 'Všechny_zprávy', 'Vsechna_hlaseni', 'Vsechny_zpravy' ),
- 'Allpages' => array( 'Všechny_stránky', 'Vsechny_stranky' ),
- 'Ancientpages' => array( 'Nejstarší_stránky', 'Staré_stránky', 'Stare_stranky' ),
- 'Blankpage' => array( 'Prázdná_stránka' ),
- 'Block' => array( 'Blokování', 'Blokovani', 'Blokovat_uživatele', 'Blokovat_IP', 'Blokovat_uzivatele' ),
- 'Blockme' => array( 'Zablokuj_mÄ›', 'Zablokuj_me' ),
- 'Booksources' => array( 'Zdroje_knih' ),
- 'BrokenRedirects' => array( 'Přerušená_přesměrování', 'Prerusena_presmerovani' ),
- 'Categories' => array( 'Kategorie' ),
- 'ChangeEmail' => array( 'Změna_emailu', 'Zmena_emailu' ),
- 'ChangePassword' => array( 'Změna_hesla', 'Zmena_hesla', 'Resetovat_heslo' ),
- 'Confirmemail' => array( 'Potvrdit_e-mail' ),
- 'Contributions' => array( 'Příspěvky', 'Prispevky' ),
- 'CreateAccount' => array( 'VytvoÅ™it_úÄet', 'Vytvorit_ucet' ),
- 'Deadendpages' => array( 'Slepé_stránky', 'Slepe_stranky' ),
- 'DeletedContributions' => array( 'Smazané_příspěvky', 'Smazane_prispevky' ),
- 'Disambiguations' => array( 'Rozcestníky', 'Rozcestniky' ),
- 'DoubleRedirects' => array( 'Dvojitá_přesměrování', 'Dvojita_presmerovani' ),
- 'Emailuser' => array( 'E-mail' ),
- 'Export' => array( 'Exportovat_stránky' ),
- 'Fewestrevisions' => array( 'Stránky_s_nejménÄ›_editacemi', 'Stranky_s_nejmene_editacemi', 'Stránky_s_nejmenším_poÄtem_editací' ),
- 'FileDuplicateSearch' => array( 'Hledání_duplicitních_souborů', 'Hledani_duplicitnich_souboru' ),
- 'Filepath' => array( 'Cesta_k_souboru' ),
- 'Import' => array( 'Importovat_stránky' ),
- 'Invalidateemail' => array( 'Zneplatnit_e-mail', 'Zrušit_potvrzení_e-mailu' ),
- 'BlockList' => array( 'Blokovaní_uživatelé', 'Blokovani_uzivatele' ),
- 'LinkSearch' => array( 'Hledání_odkazů', 'Hledani_odkazu' ),
- 'Listadmins' => array( 'Seznam_správců', 'Seznam_spravcu' ),
- 'Listbots' => array( 'Seznam_botů', 'Seznam_botu' ),
- 'Listfiles' => array( 'Seznam_souborů', 'Seznam_souboru' ),
- 'Listgrouprights' => array( 'Seznam_uživatelských_práv', 'Seznam_uzivatelskych_prav' ),
- 'Listredirects' => array( 'Seznam_přesměrování', 'Seznam_presmerovani' ),
- 'Listusers' => array( 'Uživatelé', 'Uzivatele', 'Seznam_uživatelů', 'Seznam_uzivatelu' ),
- 'Lockdb' => array( 'Zamknout_databázi', 'Zamknout_databazi' ),
- 'Log' => array( 'Protokolovací_záznamy', 'Protokoly', 'Protokol', 'Protokolovaci_zaznamy' ),
- 'Lonelypages' => array( 'SirotÄí_stránky', 'Sirotci_stranky' ),
- 'Longpages' => array( 'Nejdelší_stránky', 'Nejdelsi_stranky' ),
- 'MergeHistory' => array( 'SlouÄení_historie', 'Slouceni_historie', 'SlouÄit_historii' ),
- 'MIMEsearch' => array( 'Hledání_podle_MIME', 'Hledani_podle_MIME', 'Hledat_podle_MIME_typu' ),
- 'Mostcategories' => array( 'Stránky_s_nejvíce_kategoriemi', 'Stranky_s_nejvice_kategoriemi', 'Stránky_s_nejvyšším_poÄtem_kategorií' ),
- 'Mostimages' => array( 'Nejpoužívanější_soubory', 'Nejpouzivanejsi_soubory' ),
- 'Mostlinked' => array( 'Nejodkazovanější_stránky', 'Nejodkazovanejsi_stranky' ),
- 'Mostlinkedcategories' => array( 'Nejpoužívanější_kategorie', 'Nejpouzivanejsi_kategorie' ),
- 'Mostlinkedtemplates' => array( 'Nejpoužívanější_šablony', 'Nejpouzivanejsi_sablony' ),
- 'Mostrevisions' => array( 'Stránky_s_nejvíce_editacemi', 'Stranky_s_nejvice_editacemi', 'Stránky_s_nejvyšším_poÄtem_editací' ),
- 'Movepage' => array( 'Přesunout_stránku' ),
- 'Mycontributions' => array( 'Mé_příspěvky', 'Me_prispevky' ),
- 'Mypage' => array( 'Moje_stránka', 'Moje_stranka' ),
- 'Mytalk' => array( 'Moje_diskuse' ),
- 'Newimages' => array( 'Nové_obrázky', 'Galerie_nových_obrázků', 'Nove_obrazky' ),
- 'Newpages' => array( 'Nové_stránky', 'Nove_stranky', 'Nejnovější_stránky', 'Nejnovejsi_stranky' ),
- 'Popularpages' => array( 'Nejnavštěvovanější_stránky', 'Nejnavstevovanejsi_stranky' ),
- 'Preferences' => array( 'Nastavení', 'Nastaveni' ),
- 'Protectedpages' => array( 'ZamÄené_stránky', 'Zamcene_stranky' ),
- 'Protectedtitles' => array( 'ZamÄené_názvy', 'Zamcene_nazvy', 'Stránky_které_nelze_vytvoÅ™it' ),
- 'Randompage' => array( 'Náhodná_stránka', 'Nahodna_stranka' ),
- 'Randomredirect' => array( 'Náhodné_přesměrování', 'Nahodne_presmerovani' ),
- 'Recentchanges' => array( 'Poslední_změny', 'Posledni_zmeny' ),
- 'Recentchangeslinked' => array( 'Související_změny', 'Souvisejici_zmeny' ),
- 'Revisiondelete' => array( 'Smazat_revizi' ),
- 'Search' => array( 'Hledání', 'Hledani' ),
- 'Shortpages' => array( 'Nejkratší_stránky', 'Nejkratsi_stranky' ),
- 'Specialpages' => array( 'Speciální_stránky', 'Specialni_stranky' ),
- 'Statistics' => array( 'Statistika', 'Statistiky' ),
- 'Tags' => array( 'ZnaÄky', 'Znacky' ),
- 'Unblock' => array( 'Odblokování', 'Odblokovani' ),
- 'Uncategorizedcategories' => array( 'Nekategorizované_kategorie', 'Nekategorizovane_kategorie' ),
- 'Uncategorizedimages' => array( 'Nekategorizované_soubory', 'Nekategorizovane_soubory' ),
- 'Uncategorizedpages' => array( 'Nekategorizované_stránky', 'Nekategorizovane_stranky' ),
- 'Uncategorizedtemplates' => array( 'Nekategorizované_šablony', 'Nekategorizovane_sablony' ),
- 'Undelete' => array( 'Smazané_stránky', 'Smazane_stranky' ),
- 'Unlockdb' => array( 'Odemknout_databázi', 'Odemknout_databazi' ),
- 'Unusedcategories' => array( 'Nepoužívané_kategorie', 'Nepouzivane_kategorie' ),
- 'Unusedimages' => array( 'Nepoužívané_soubory', 'Nepouzivane_soubory' ),
- 'Unusedtemplates' => array( 'Nepoužívané_šablony', 'Nepouzivane_sablony' ),
- 'Unwatchedpages' => array( 'Nesledované_stránky' ),
- 'Upload' => array( 'NaÄíst_soubor', 'Nacist_soubor', 'NaÄíst_obrázek' ),
- 'Userlogin' => array( 'Přihlásit', 'Prihlasit' ),
- 'Userlogout' => array( 'Odhlásit', 'Odhlasit' ),
- 'Userrights' => array( 'Uživatelská_práva', 'Správa_uživatelů', 'Uzivatelska_prava' ),
- 'Version' => array( 'Verze' ),
- 'Wantedcategories' => array( 'Chybějící_kategorie', 'Požadované_kategorie', 'Pozadovane_kategorie' ),
- 'Wantedfiles' => array( 'Chybějící_soubory', 'Požadované_soubory', 'Pozadovane_soubory' ),
- 'Wantedpages' => array( 'Chybějící_stránky', 'Požadované_stránky', 'Pozadovane_stranky' ),
- 'Wantedtemplates' => array( 'Chybějící_šablony', 'Požadované_šablony', 'Pozadovane_sablony' ),
- 'Watchlist' => array( 'Sledované_stránky', 'Sledovane_stranky' ),
- 'Whatlinkshere' => array( 'Co_odkazuje_na', 'Odkazuje_sem' ),
- 'Withoutinterwiki' => array( 'Bez_interwiki', 'Stránky_bez_interwiki_odkazů' ),
-);
-
$messages = array(
# User preference toggles
'tog-underline' => 'Podtrhávat odkazy:',
@@ -493,6 +494,7 @@ $messages = array(
'newwindow' => '(otevře se v novém okně)',
'cancel' => 'Storno',
'moredotdotdot' => 'Další…',
+'morenotlisted' => 'Další neuvedené…',
'mypage' => 'Stránka',
'mytalk' => 'Diskuse',
'anontalk' => 'Diskuse k této IP adrese',
@@ -504,7 +506,6 @@ $messages = array(
'qbbrowse' => 'Listování',
'qbedit' => 'Editování',
'qbpageoptions' => 'Tato stránka',
-'qbpageinfo' => 'Kontext',
'qbmyoptions' => 'Moje volby',
'qbspecialpages' => 'Speciální stránky',
'faq' => 'Často kladené otázky',
@@ -527,6 +528,7 @@ $messages = array(
'namespaces' => 'Jmenné prostory',
'variants' => 'Varianty',
+'navigation-heading' => 'NavigaÄní menu',
'errorpagetitle' => 'Chyba',
'returnto' => 'Návrat na stránku „$1“.',
'tagline' => 'Z {{grammar:2sg|{{SITENAME}}}}',
@@ -765,10 +767,10 @@ Správce serveru, který úložiště zamkl, poskytl toto zdůvodnění: „''$3
# Login and logout pages
'logouttext' => "'''Nyní jste odhlášeni.'''
-Můžete pokraÄovat v anonymním prohlížení a editaci {{grammar:2sg|{{SITENAME}}}}, nebo se můžete [[Special:UserLogin|znovu pÅ™ihlásit]] jako stejný Äi jiný uživatel.
+Můžete pokraÄovat v anonymním prohlížení a editaci {{grammar:2sg|{{SITENAME}}}}, nebo se můžete <span class='plainlinks'>[$1 znovu pÅ™ihlásit]</span> jako stejný Äi jiný uživatel.
UvÄ›domte si, že nÄ›které stránky se mohou i nadále zobrazovat, jako byste byli dosud pÅ™ihlášeni, pokud nevymažete cache prohlížeÄe.",
-'welcomecreation' => '== Vítejte, $1! ==
-Váš úÄet byl úspěšnÄ› vytvoÅ™en.
+'welcomeuser' => 'Vítejte, uživateli $1!',
+'welcomecreation-msg' => 'Váš úÄet byl vytvoÅ™en.
Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SITENAME}}}}]].',
'yourname' => 'Uživatelské jméno:',
'yourpassword' => 'Heslo:',
@@ -792,7 +794,7 @@ Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SI
'gotaccount' => "Už jste registrováni? '''$1'''.",
'gotaccountlink' => 'Přihlaste se',
'userlogin-resetlink' => 'Zapomněli jste přihlašovací údaje?',
-'createaccountmail' => 'pomocí e-mailu',
+'createaccountmail' => 'Použít doÄasné náhodné heslo a odeslat ho na níže uvedenou e-mailovou adresu',
'createaccountreason' => 'Důvod:',
'badretype' => 'Vámi napsaná hesla nesouhlasí.',
'userexists' => 'Zadané uživatelské jméno se již používá.
@@ -862,6 +864,7 @@ PoÄkejte chvíli, než to zkusíte znovu.',
# Email sending
'php-mail-error-unknown' => 'Neznámá chyba v PHP funkci mail()',
'user-mail-no-addy' => 'Pokus o odeslání e-mailu bez e-mailové adresy',
+'user-mail-no-body' => 'Pokus o odeslání prázdného nebo nesmyslně krátkého e-mailu.',
# Change password dialog
'resetpass' => 'Změna hesla',
@@ -924,6 +927,7 @@ DoÄasné heslo: $2',
'changeemail-oldemail' => 'Stávající e-mailová adresa:',
'changeemail-newemail' => 'Nová e-mailová adresa:',
'changeemail-none' => '(žádná)',
+'changeemail-password' => 'Vaše heslo do {{gender:2sg|{{SITENAME}}}}:',
'changeemail-submit' => 'Změnit e-mail',
'changeemail-cancel' => 'Storno',
@@ -1097,7 +1101,6 @@ Níže je pro přehled zobrazen nejnovější protokolovací záznam:",
'template-semiprotected' => '(polozamÄena)',
'hiddencategories' => 'Tato stránka je zařazena {{PLURAL:$1|v jedné skryté kategorii|ve $1 skrytých kategoriích|v $1 skrytých kategoriích}}:',
'edittools' => '<!-- Tento text bude zobrazen pod formuláři pro editaci stránek a naÄítání souborů. -->',
-'nocreatetitle' => 'Vytváření nových stránek je omezeno',
'nocreatetext' => 'Na {{grammar:6sg|{{SITENAME}}}} je možnost vytváření nových stránek omezena.
Můžete se vrátit a editovat již existující stránku, nebo [[Special:UserLogin|se pÅ™ihlásit Äi se registrovat]].',
'nocreate-loggedin' => 'Nemáte povoleno zakládat nové stránky.',
@@ -1120,6 +1123,15 @@ Zřejmě byla smazána.',
'edit-no-change' => 'Vaše editace byla ignorována, protože nedošlo k žádné změně textu.',
'edit-already-exists' => 'Nepodařilo se vytvořit novou stránku, protože již existuje.',
'defaultmessagetext' => 'Výchozí text hlášení',
+'content-failed-to-parse' => 'Nepodařilo se zpracovat data $2 do modelu $1: $3',
+'invalid-content-data' => 'Obsažená data jsou chybná',
+'content-not-allowed-here' => 'Obsah typu $1 není na stránce [[$2]] dovolen.',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'Äistý text',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Varování: Tato stránka obsahuje příliÅ¡ mnoho volání výkonnostnÄ› nároÄných funkcí parseru.
@@ -1484,9 +1496,9 @@ Tuto operaci nelze vrátit zpět.',
'prefs-emailconfirm-label' => 'Ověření e-mailu:',
'prefs-textboxsize' => 'Velikost editaÄního okna',
'youremail' => 'E-mail:',
-'username' => 'Uživatelské jméno:',
-'uid' => 'Uživatelské ID:',
-'prefs-memberingroups' => 'ÄŒlen {{PLURAL:$1|skupiny|skupin}}:',
+'username' => '{{GENDER:$1|Uživatelské jméno}}:',
+'uid' => '{{GENDER:$1|Uživatelské}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|ÄŒlen|ÄŒlenka}} {{PLURAL:$1|skupiny|skupin}}:',
'prefs-registration' => 'ÄŒas registrace:',
'yourrealname' => 'VaÅ¡e skuteÄné jméno:',
'yourlanguage' => 'Jazyk rozhraní:',
@@ -1634,12 +1646,13 @@ Vaše adresa v takovém případě není prozrazena.',
'right-sendemail' => 'Odesílání e-mailů ostatním uživatelům',
'right-passwordreset' => 'Prohlížení e-mailů pro znovunastavení hesla',
+# Special:Log/newusers
+'newuserlogpage' => 'Kniha nových uživatelů',
+'newuserlogpagetext' => 'Toto je záznam nově zaregistrovaných uživatelů.',
+
# User rights log
'rightslog' => 'Kniha práv uživatelů',
'rightslogtext' => 'Toto je záznam změn uživatelských práv.',
-'rightslogentry' => 'změnil pro $1 zařazení ve skupinách z $2 na $3',
-'rightslogentry-autopromote' => 'byl automaticky povýšen z $2 na $3',
-'rightsnone' => '(žádné)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'pÅ™eÄíst tuto stránku',
@@ -1873,6 +1886,7 @@ Kontaktuje prosím [[Special:ListUsers/sysop|správce]].',
'backend-fail-notsame' => 'Odlišný soubor $1 už existuje.',
'backend-fail-invalidpath' => '$1 je neplatná cesta k místu uložení.',
'backend-fail-delete' => 'Soubor $1 nelze smazat.',
+'backend-fail-describe' => 'Nepodařilo se změnit metadata souboru „$1“.',
'backend-fail-alreadyexists' => 'Soubor $1 už existuje.',
'backend-fail-store' => 'Soubor $1 nelze uložit v $2.',
'backend-fail-copy' => 'Soubor $1 nelze kopírovat do $2.',
@@ -2107,6 +2121,12 @@ Vstup: <code>typ obsahu/podtyp</code>, napÅ™. <code>image/jpeg</code>.',
Asi by místo toho měly odkazovat na konkrétnější stránku.<br />
Stránka je považována za rozcestník, pokud používá některou ze šablon odkazovaných na [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Stránky s vlastností',
+'pageswithprop-legend' => 'Stránky s vlastností',
+'pageswithprop-text' => 'Tato stránka obsahuje seznam stránek, které používají zadanou vlastnost stránky.',
+'pageswithprop-prop' => 'Název vlastnosti:',
+'pageswithprop-submit' => 'Provést',
+
'doubleredirects' => 'Dvojitá přesměrování',
'doubleredirectstext' => 'Na této stránce je seznam přesměrování vedoucích na další přesměrování.
Každý řádek obsahuje odkaz na první a druhé pÅ™esmÄ›rování a k tomu cíl druhého pÅ™esmÄ›rování, který obvykle ukazuje jméno „skuteÄné“ cílové stránky, na kterou by mÄ›lo první pÅ™esmÄ›rování odkazovat.
@@ -2259,7 +2279,7 @@ Podívejte se také na [[Special:WantedCategories|žádané kategorie]].',
'linksearch-ok' => 'Hledat',
'linksearch-text' => 'Lze používat zástupné znaky, např. „*.wikipedia.org“.
Povinná je přinejmenším doména nejvyššího řádu, např. „*.org“.<br />
-Podporované protokoly: <code>$1</code> (pokud není protokol uveden, použije se http://).',
+{{PLURAL:$2|Podporovaný protokol|Podporované protokoly}}: <code>$1</code> (pokud není protokol uveden, použije se http://).',
'linksearch-line' => '$2 odkazuje na $1',
'linksearch-error' => 'Zástupné znaky lze použít jen na zaÄátku doménového jména.',
@@ -2278,10 +2298,6 @@ Podporované protokoly: <code>$1</code> (pokud není protokol uveden, použije s
'activeusers-hidesysops' => 'Skrýt správce',
'activeusers-noresult' => 'Nenalezen žádný uživatel.',
-# Special:Log/newusers
-'newuserlogpage' => 'Kniha nových uživatelů',
-'newuserlogpagetext' => 'Toto je záznam nově zaregistrovaných uživatelů.',
-
# Special:ListGroupRights
'listgrouprights' => 'Práva skupin uživatelů',
'listgrouprights-summary' => 'Toto je seznam uživatelských skupin definovaných na této wiki a&nbsp;jejich přístupových práv.
@@ -2377,19 +2393,23 @@ Ve [[Special:Watchlist|sledovaných stránkách]] se tak budou objevovat budoucÃ
'enotif_mailer' => 'ZasílaÄ hlášení {{grammar:2sg|{{SITENAME}}}}',
'enotif_reset' => 'OznaÄit vÅ¡e jako navÅ¡tívené',
-'enotif_newpagetext' => 'Toto je nová stránka.',
'enotif_impersonal_salutation' => 'Uživatel {{grammar:2sg|{{SITENAME}}}}',
-'changed' => 'upravil',
-'created' => 'vytvořil',
-'enotif_subject' => '$PAGEEDITOR upravil stránku $PAGETITLE na {{grammar:6sg|{{SITENAME}}}}.',
+'enotif_subject_deleted' => '$2 {{gender:$2|smazal|smazala}} stránku $1 na {{grammar:6sg|{{SITENAME}}}}',
+'enotif_subject_created' => '$2 {{gender:$2|založil|založila}} stránku $1 na {{grammar:6sg|{{SITENAME}}}}',
+'enotif_subject_moved' => '$2 {{gender:$2|přesunul|přesunula}} stránku $1 na {{grammar:6sg|{{SITENAME}}}}',
+'enotif_subject_restored' => '$2 {{gender:$2|obnovil|obnovila}} stránku $1 na {{grammar:6sg|{{SITENAME}}}}',
+'enotif_subject_changed' => '$2 {{gender:$2|změnil|změnila}} stránku $1 na {{grammar:6sg|{{SITENAME}}}}',
+'enotif_body_intro_deleted' => '$2 {{gender:$2|smazal|smazala}} $PAGEEDITDATE na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte $3.',
+'enotif_body_intro_created' => 'V $PAGEEDITDATE {{gender:$2|založil|založila}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .',
+'enotif_body_intro_moved' => 'V $PAGEEDITDATE {{gender:$2|přesunul|přesunula}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .',
+'enotif_body_intro_restored' => 'V $PAGEEDITDATE {{gender:$2|obnovil|obnovila}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .',
+'enotif_body_intro_changed' => 'V $PAGEEDITDATE {{gender:$2|změnil|změnila}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .',
'enotif_lastvisited' => 'Vizte $1 pro seznam všech změn od minulé návštěvy.',
'enotif_lastdiff' => 'Tuto změnu vizte na $1 .',
'enotif_anon_editor' => 'anonymní uživatel $1',
'enotif_body' => 'Vážený uživateli $WATCHINGUSERNAME,
-Ve $PAGEEDITDATE $CHANGEDORCREATED $PAGEEDITOR stránku $PAGETITLE, vizte aktuální verzi na $PAGETITLE_URL .
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Shrnutí editace: $PAGESUMMARY $PAGEMINOREDIT
@@ -2397,8 +2417,7 @@ Uživatele, který změnu provedl, můžete kontaktovat:
e-mailem: $PAGEEDITOR_EMAIL
na wiki: $PAGEEDITOR_WIKI
-Dokud stránku nenavštívíte, nebudou vám zasílána další oznámení o změnách této stránky.
-Případně si můžete vynulovat příznaky ve svém seznamu sledovaných stránek.
+Dokud stránku nenavštívíte, nebudou vám zasílána další oznámení o změnách této stránky. Případně si můžete vynulovat příznaky ve svém seznamu sledovaných stránek.
S pozdravem váš zasílaÄ hlášení {{grammar:2sg|{{SITENAME}}}}
@@ -2414,6 +2433,8 @@ $UNWATCHURL
Rady a kontakt:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'vytvořil',
+'changed' => 'upravil',
# Delete
'deletepage' => 'Smazat stránku',
@@ -2479,6 +2500,8 @@ Můžete si prohlédnout též [[Special:ProtectedPages|seznam aktuálnÄ› platnÃ
'prot_1movedto2' => 'Stránka [[$1]] přemístěna na stránku [[$2]]',
'protect-badnamespace-title' => 'Nezamykatelný jmenný prostor',
'protect-badnamespace-text' => 'Stránky v tomto jmenném prostoru nelze zamykat.',
+'protect-norestrictiontypes-text' => 'Tuto stránku nelze zamknout, protože nejsou k dispozici žádné typy zámků.',
+'protect-norestrictiontypes-title' => 'Nezamykatelná stránka',
'protect-legend' => 'Potvrdit zamÄení',
'protectcomment' => 'Důvod:',
'protectexpiry' => 'Čas vypršení:',
@@ -2557,7 +2580,8 @@ Pro ÄásteÄné obnovení zaÅ¡krtnÄ›te ÄtvereÄky u obnovovaných revizí a kl
'undeletedrevisions' => '{{PLURAL:$1|Obnovena $1 verze|Obnoveny $1 verze|Obnoveno $1 verzí}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}} a $2 {{PLURAL:$2|soubor|soubory|souborů}}.',
'undeletedfiles' => '{{PLURAL:$1|obnoven $1 soubor|obnoveny $1 soubory|obnoveno $1 souborů}}',
-'cannotundelete' => 'Obnovení se nepovedlo; stránku již pravděpodobně obnovil někdo jiný.',
+'cannotundelete' => 'Obnovení se nezdařilo:
+$1',
'undeletedpage' => "'''$1 byla obnovena'''
Záznam o posledních mazáních a obnoveních najdete v [[Special:Log/delete|knize smazaných stránek]].",
@@ -2588,7 +2612,7 @@ $1',
'blanknamespace' => '(Hlavní)',
# Contributions
-'contributions' => 'Příspěvky uživatele',
+'contributions' => 'Příspěvky {{GENDER:$1|uživatele|uživatelky}}',
'contributions-title' => 'Příspěvky uživatele $1',
'mycontris' => 'Příspěvky',
'contribsub2' => '$1 ($2)',
@@ -2852,6 +2876,7 @@ Cílová stránka „[[:$1]]“ již existuje. Přejete si ji smazat pro uvolně
'immobile-target-namespace-iw' => 'Mezijazykový odkaz není validní cíl při přesouvání stránky.',
'immobile-source-page' => 'Tuto stránku nelze přesouvat.',
'immobile-target-page' => 'Stránku nelze přesunout na zadaný název.',
+'bad-target-model' => 'Požadovaný cíl používá jiný model obsahu. Nelze převést $1 na $2.',
'imagenocrossnamespace' => 'Nelze přesunout mimo jmenný prostor Soubor:',
'nonfile-cannot-move-to-file' => 'Do jmenného prostoru {{ns:file}} nelze přesouvat stránky nepřináležející k souboru',
'imagetypemismatch' => 'Nová přípona souboru neodpovídá jeho typu',
@@ -2961,6 +2986,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
'import-error-interwiki' => 'Stránka „$1“ se neimportuje, protože její název je vyhrazen pro externí odkazy (interwiki).',
'import-error-special' => 'Stránka „$1“ se neimportuje, protože patří do speciálního jmenného prostoru, do kterého stránky nepatří.',
'import-error-invalid' => 'Stránka „$1“ se neimportuje, protože její název je neplatný.',
+'import-error-unserialize' => 'Nepodařilo se deserializovat revizi $2 stránky „$1“. Revize měla používat model obsahu $3 serializovaný jako $4.',
'import-options-wrong' => '{{PLURAL:$2|Chybná volba|Chybné volby}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Zadaný název kořenové stránky je neplatný.',
'import-rootpage-nosubpage' => 'Ve jmenném prostoru „$1“ kořenové stránky nejsou dovoleny podstránky.',
@@ -2975,7 +3001,6 @@ Uložte jej na svůj disk a nahrajte ho sem.',
# JavaScriptTest
'javascripttest' => 'Testování JavaScriptu',
-'javascripttest-disabled' => 'Tato funkce nebyla na této wiki povolena.',
'javascripttest-title' => 'Spouštějí se testy v $1',
'javascripttest-pagetext-noframework' => 'Tato stránka je vyhrazena pro spouštění testů JavaScriptu.',
'javascripttest-pagetext-unknownframework' => 'Neznámá testovací knihovna „$1“.',
@@ -3123,11 +3148,13 @@ Uložte jej na svůj disk a nahrajte ho sem.',
'pageinfo-default-sort' => 'Výchozí klÃ­Ä Å™azení',
'pageinfo-length' => 'Velikost stránky (v bajtech)',
'pageinfo-article-id' => 'ID stránky',
+'pageinfo-language' => 'Jazyk obsahu stránky',
'pageinfo-robot-policy' => 'Nastavení pro vyhledávaÄe',
'pageinfo-robot-index' => 'Indexovatelná',
'pageinfo-robot-noindex' => 'Neindexovatelná',
'pageinfo-views' => 'PoÄet zobrazení',
'pageinfo-watchers' => 'PoÄet sledujících',
+'pageinfo-few-watchers' => 'Méně než $1 {{PLURAL:$1|sledující|sledující|sledujících}}',
'pageinfo-redirects-name' => 'Přesměrování na tuto stránku',
'pageinfo-subpages-name' => 'Podstránky této stránky',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|přesměrování}}; $3 {{PLURAL:$3|nepřesměrování}})',
@@ -3142,6 +3169,19 @@ Uložte jej na svůj disk a nahrajte ho sem.',
'pageinfo-magic-words' => '{{PLURAL:$1|Kouzelné slovo|Kouzelná slova}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Skrytá|Skryté}} kategorie ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Použitá šablona|Použité šablony}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Stránka, do které|Stránky, do kterých}} je tato stránka vložena ($1)',
+'pageinfo-toolboxlink' => 'Informace o stránce',
+'pageinfo-redirectsto' => 'Přesměrovává na',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Stránka se poÄítá do obsahu',
+'pageinfo-contentpage-yes' => 'Ano',
+'pageinfo-protect-cascading' => 'Kaskádový zámek',
+'pageinfo-protect-cascading-yes' => 'Ano',
+'pageinfo-protect-cascading-from' => 'Zámky pocházejí z kaskádových zámků na',
+'pageinfo-category-info' => 'Informace o kategorii',
+'pageinfo-category-pages' => 'PoÄet stránek',
+'pageinfo-category-subcats' => 'PoÄet podkategorií',
+'pageinfo-category-files' => 'PoÄet souborů',
# Skin names
'skinname-standard' => 'Klasický',
@@ -3163,6 +3203,8 @@ Uložte jej na svůj disk a nahrajte ho sem.',
'markedaspatrollederror' => 'Nelze oznaÄit za prověřené',
'markedaspatrollederrortext' => 'Musíte zvolit revizi, která má být oznaÄena jako prověřená.',
'markedaspatrollederror-noautopatrol' => 'Nemáte dovoleno oznaÄovat vlastní editace jako prověřené.',
+'markedaspatrollednotify' => 'Tato zmÄ›na stránky $1 byla oznaÄena jako prověřená.',
+'markedaspatrollederrornotify' => 'NepodaÅ™ilo se oznaÄit jako prověřené.',
# Patrol log
'patrol-log-page' => 'Kniha prověřených editací',
@@ -3197,6 +3239,7 @@ OtevÅ™ením souboru můžete ohrozit svůj poÄítaÄ.",
'file-nohires' => 'Větší rozlišení není k dispozici.',
'svg-long-desc' => 'soubor SVG, nominální rozměr: $1 × $2 pixelů, velikost souboru: $3',
'svg-long-desc-animated' => 'Animovaný soubor SVG, nominální rozměr: $1 × $2 pixelů, velikost souboru: $3',
+'svg-long-error' => 'Neplatný soubor SVG: $1',
'show-big-image' => 'Obrázek ve vyšším rozlišení',
'show-big-image-preview' => 'Velikost tohoto náhledu: $1.',
'show-big-image-other' => '{{PLURAL:$2|Jiné|Jiná}} rozlišení: $1.',
@@ -3226,7 +3269,10 @@ OtevÅ™ením souboru můžete ohrozit svůj poÄítaÄ.",
'minutes' => '{{PLURAL:$1|$1 minuta|$1 minuty|$1 minut}}',
'hours' => '{{PLURAL:$1|$1 hodina|$1 hodiny|$1 hodin}}',
'days' => '{{PLURAL:$1|$1 den|$1 dny|$1 dní}}',
+'months' => '{{PLURAL:$1|$1 měsícem|$1 měsíci}}',
+'years' => '{{PLURAL:$1|$1 rokem|$1 roky}}',
'ago' => 'před $1',
+'just-now' => 'právÄ› teÄ',
# Bad image list
'bad_image_list' => 'Tato stránka má následující formát:
@@ -3718,6 +3764,7 @@ Platnost tohoto potvrzovacího kódu vyprší $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Vkládání šablon mezi wiki je vypnuto]',
'scarytranscludefailed' => '[NepodaÅ™ilo se naÄíst Å¡ablonu pro $1]',
+'scarytranscludefailed-httpstatus' => '[NepodaÅ™ilo se naÄíst Å¡ablonu pro $1: HTTP $2]',
'scarytranscludetoolong' => '[Příliš dlouhé URL]',
# Delete conflict
@@ -3889,6 +3936,7 @@ Seznam editovaných stránek můžete také [[Special:EditWatchlist|editovat ve
'version-license' => 'Licence',
'version-poweredby-credits' => "Tato wiki běží na '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
'version-poweredby-others' => 'další',
+'version-credits-summary' => 'Následujícím lidem bychom rádi poděkovali za jejich příspěvky [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki je svobodný software; můžete jej šířit nebo modifikovat podle podmínek GNU General Public License, vydávané Free Software Foundation; buÄ verze 2 této licence anebo (podle vaÅ¡eho uvážení) kterékoli pozdÄ›jší verze.
MediaWiki je distribuována v nadÄ›ji, že bude užiteÄná, avÅ¡ak BEZ JAKÉKOLI ZÃRUKY; neposkytují se ani odvozené záruky PRODEJNOSTI anebo VHODNOSTI PRO URÄŒITà ÚČEL. Podrobnosti se doÄtete v textu GNU General Public License.
@@ -4004,17 +4052,17 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
'sqlite-no-fts' => '$1 bez podpory plnotextového vyhledávání',
# New logging system
-'logentry-delete-delete' => '$1 smazal stránku $3',
-'logentry-delete-restore' => '$1 obnovil stránku $3',
-'logentry-delete-event' => '$1 změnil viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
-'logentry-delete-revision' => '$1 změnil viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
-'logentry-delete-event-legacy' => '$1 změnil viditelnost protokolovacích záznamů ke stránce $3',
-'logentry-delete-revision-legacy' => '$1 změnil viditelnost revizí na stránce $3',
-'logentry-suppress-delete' => '$1 utajil stránku $3',
-'logentry-suppress-event' => '$1 utajeně změnil viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
-'logentry-suppress-revision' => '$1 utajeně změnil viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
-'logentry-suppress-event-legacy' => '$1 utajeně změnil viditelnost protokolovacích záznamů ke stránce $3',
-'logentry-suppress-revision-legacy' => '$1 utajeně změnil viditelnost revizí na stránce $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|smazal|smazala}} stránku $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|obnovil|obnovila}} stránku $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|změnil|změnila}} viditelnost protokolovacích záznamů ke stránce $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|změnil|změnila}} viditelnost revizí na stránce $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|utajil|utajila}} stránku $3',
+'logentry-suppress-event' => '$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
+'logentry-suppress-revision' => '$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
+'logentry-suppress-event-legacy' => '$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost protokolovacích záznamů ke stránce $3',
+'logentry-suppress-revision-legacy' => '$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost revizí na stránce $3',
'revdelete-content-hid' => 'skryt obsah',
'revdelete-summary-hid' => 'skryto shrnutí editace',
'revdelete-uname-hid' => 'skryto uživatelské jméno',
@@ -4023,17 +4071,21 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
'revdelete-uname-unhid' => 'odkryto uživatelské jméno',
'revdelete-restricted' => 'omezení správců použito',
'revdelete-unrestricted' => 'omezení správců odstraněno',
-'logentry-move-move' => '$1 přesunul stránku $3 na $4',
-'logentry-move-move-noredirect' => '$1 přesunul stránku $3 na $4 bez založení přesměrování',
-'logentry-move-move_redir' => '$1 přesunul stránku $3 na $4 s výměnou přesměrování',
-'logentry-move-move_redir-noredirect' => '$1 přesunul stránku $3 na $4 místo přesměrování bez založení přesměrování',
-'logentry-patrol-patrol' => '$1 oznaÄil revizi $4 stránky $3 jako prověřenou',
-'logentry-patrol-patrol-auto' => '$1 automaticky oznaÄil revizi $4 stránky $3 jako prověřenou',
-'logentry-newusers-newusers' => 'Byl založen uživatelský úÄet $1',
-'logentry-newusers-create' => 'Byl založen uživatelský úÄet $1',
-'logentry-newusers-create2' => '$1 založil uživatelský úÄet $3',
-'logentry-newusers-autocreate' => 'Automaticky byl založen úÄet $1',
-'newuserlog-byemail' => 'heslo zasláno e-mailem',
+'logentry-move-move' => '$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4 bez založení přesměrování',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4 s výměnou přesměrování',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4 místo přesměrování bez založení přesměrování',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|oznaÄil|oznaÄila}} revizi $4 stránky $3 jako prověřenou',
+'logentry-patrol-patrol-auto' => '$1 automaticky {{GENDER:$2|oznaÄil|oznaÄila}} revizi $4 stránky $3 jako prověřenou',
+'logentry-newusers-newusers' => 'Byl {{GENDER:$2|založen}} uživatelský úÄet $1',
+'logentry-newusers-create' => 'Byl {{GENDER:$2|založen}} uživatelský úÄet $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|založil|založila}} uživatelský úÄet $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|založil|založila}} uživatelský úÄet $3, heslo bylo posláno e-mailem',
+'logentry-newusers-autocreate' => 'Automaticky byl {{GENDER:$2|založen}} úÄet $1',
+'logentry-rights-rights' => '$1 {{GENDER:$2|zmÄ›nil|zmÄ›nila}} Älenství $3 ve skupinách z $4 na $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|zmÄ›nil|zmÄ›nila}} Älenství $3 ve skupinách',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|byl automaticky povýšen|byla automaticky povýšena}} z $4 na $5',
+'rightsnone' => '(žádné)',
# Feedback
'feedback-bugornote' => 'Pokud dokážete podrobně popsat technický problém, můžete [$1 nahlásit chybu].
@@ -4087,6 +4139,7 @@ Jinak můžete využít jednoduchý formulář níže. Váš komentář bude př
'api-error-ok-but-empty' => 'Interní chyba: ze serveru nepÅ™iÅ¡la odpovÄ›Ä.',
'api-error-overwrite' => 'Není dovoleno přepsat existující soubor.',
'api-error-stashfailed' => 'VnitÅ™ní chyba: Serveru se nepodaÅ™ilo uložit doÄasný soubor.',
+'api-error-publishfailed' => 'VnitÅ™ní chyba: Serveru se nepodaÅ™ilo zveÅ™ejnit doÄasný soubor.',
'api-error-timeout' => 'Server neodpovÄ›dÄ›l v oÄekávaném Äase.',
'api-error-unclassified' => 'Došlo k neznámé chybě',
'api-error-unknown-code' => 'Neznámá chyba: „$1“',
@@ -4107,4 +4160,7 @@ Jinak můžete využít jednoduchý formulář níže. Váš komentář bude př
'duration-centuries' => '$1 {{PLURAL:$1|století}}',
'duration-millennia' => '$1 {{PLURAL:$1|tisíciletí}}',
+# Image rotation
+'rotate-comment' => 'Obrázek otoÄen o $1 {{PLURAL:$1|stupeň|stupnÄ›|stupňů}} po smÄ›ru hodinových ruÄiÄek',
+
);
diff --git a/languages/messages/MessagesCsb.php b/languages/messages/MessagesCsb.php
index 13beacf3..759a487d 100644
--- a/languages/messages/MessagesCsb.php
+++ b/languages/messages/MessagesCsb.php
@@ -177,7 +177,6 @@ $messages = array(
'qbbrowse' => 'Przezeranié',
'qbedit' => 'Edicëjô',
'qbpageoptions' => 'Òptacëje starnë',
-'qbpageinfo' => 'Ã’ starnie',
'qbmyoptions' => 'Mòje òptacëje',
'qbspecialpages' => 'Specjalné starnë',
'faq' => 'FAQ',
@@ -354,11 +353,8 @@ Przemëszlë dolmaczënié na [//translatewiki.net/wiki/Main_Page?setlang=csb tr
# Login and logout pages
'logouttext' => "'''Jes wëlogòwóny.'''
-Mòżesz robic dali na {{SITENAME}} jakno anonimòwi brëkòwnik abò sã [[Special:UserLogin|wlogòwac]] znowa jakno równy, a bò jinszi brëkòwnik.
+Mòżesz robic dali na {{SITENAME}} jakno anonimòwi brëkòwnik abò sã <span class='plainlinks'>[$1 wlogòwac]</span> znowa jakno równy, a bò jinszi brëkòwnik.
Bôczë, że do czasu wëczëszczenia pòdrãczny pamiãcë przezérnika, niejedné starnë bãdą wëzdrzëc jakbë të bëł wlogòwóny.",
-'welcomecreation' => ' == Witôj, $1! ==
-Twòjé kònto òstało prawie ùsôdzoné.
-Nie zbëjë zmienic swòjich nastôwów na [[Special:Preferences|{{SITENAME}}]].',
'yourname' => 'Miono brëkòwnika',
'yourpassword' => 'Twòja parola',
'yourpasswordagain' => 'Pòwtórzë parolã',
@@ -714,6 +710,9 @@ Mòżesz zezwòlëc jinszim brëkòwniką na łączbã z Tobą przez Twòją sta
'right-autoconfirmed' => 'Edicëjô dzélowò zazychrowónych starnów',
'right-bot' => 'Nacéchòwanié edicëjó jakno aùtomatnych',
+# Special:Log/newusers
+'newuserlogpage' => 'Nowi brëkòwnicë',
+
# User rights log
'rightslog' => 'Prawa brëkòwnika',
@@ -888,9 +887,6 @@ Mòżesz zawãżëc wëszłosc przez wëbranié ôrtu registru, miona brëkòwni
# Special:LinkSearch
'linksearch' => 'Bùtnowé lënczi',
-# Special:Log/newusers
-'newuserlogpage' => 'Nowi brëkòwnicë',
-
# Special:ListGroupRights
'listgrouprights-members' => '(lësta nôlëżników karna)',
@@ -933,8 +929,8 @@ Czej chcesz remôc starnã z lëste ùzéronëch artiklów, klikni ''Òprzestôj
'unwatching' => 'Ju ni ùzéróm...',
'enotif_reset' => 'Òznaczë wszëtczé artiklë jakno òbëzdrzóné',
-'changed' => 'zmienioné',
'created' => 'zrobionô',
+'changed' => 'zmienioné',
# Delete
'deletepage' => 'Rëmôj starnã',
diff --git a/languages/messages/MessagesCu.php b/languages/messages/MessagesCu.php
index 7c2dcad6..89e0d8ff 100644
--- a/languages/messages/MessagesCu.php
+++ b/languages/messages/MessagesCu.php
@@ -14,13 +14,17 @@
* @author ОйЛ
*/
-$separatorTransformTable = array(
- ',' => ".",
- '.' => ','
+$specialPageAliases = array(
+ 'Allpages' => array( 'Ð’ÑŒÑÑ©_Ñтраницѧ' ),
+ 'Categories' => array( 'Катигорїѩ' ),
+ 'Contributions' => array( 'Добродѣꙗниꙗ' ),
+ 'Preferences' => array( 'Строи' ),
+ 'Recentchanges' => array( 'ПоÑлѣдьнѩ_мѣнꙑ' ),
+ 'Search' => array( 'ИÑканиѥ' ),
+ 'Statistics' => array( 'СтатїÑтїка' ),
+ 'Upload' => array( 'Положєниѥ_дѣла' ),
);
-$linkPrefixExtension = true;
-
$namespaceNames = array(
NS_MEDIA => 'СрѣдьÑтва',
NS_SPECIAL => 'Ðарочьна',
@@ -65,6 +69,13 @@ $magicWords = array(
'language' => array( '0', '#ѨꙀê™ÐšÐª:', '#LANGUAGE:' ),
);
+$separatorTransformTable = array(
+ ',' => ".",
+ '.' => ','
+);
+
+$linkPrefixExtension = true;
+
$defaultDateFormat = 'mdy';
$dateFormats = array(
@@ -445,6 +456,9 @@ $messages = array(
'grouppage-sysop' => '{{ns:project}}:Съмотритєлє',
'grouppage-bureaucrat' => '{{ns:project}}:Чинодатєлє',
+# Special:Log/newusers
+'newuserlogpage' => 'новъ мѣÑÑ‚ÑŠ Ñътворѥниꙗ Ñ—Ñторїꙗ',
+
# User rights log
'rightslog' => 'чинодатєльÑтва Ñ—Ñторїꙗ',
@@ -596,9 +610,6 @@ $messages = array(
# Special:ListUsers
'listusers-submit' => 'виждь',
-# Special:Log/newusers
-'newuserlogpage' => 'новъ мѣÑÑ‚ÑŠ Ñътворѥниꙗ Ñ—Ñторїꙗ',
-
# Email user
'emailuser' => 'поÑъли єпїÑтолѫ',
@@ -738,6 +749,9 @@ $messages = array(
'tooltip-minoredit' => 'оê™Ð½Ð°Ñ‡Ð¸ ꙗко малоу мѣноу',
'tooltip-watch' => 'Ñи Ñтраницѧ блюдєниѥ',
+# Info page
+'pageinfo-toolboxlink' => 'Ñтраницѧ плирофорїꙗ',
+
# Media information
'file-info-size' => '$1 × $2 п҃ѯ · дѣла мѣра : $3 · MIME тѷпъ : $4',
'svg-long-desc' => 'дѣло SVG · обꙑчьнъ обраê™ÑŠ : $1 × $2 п҃ѯ · дѣла мѣра : $3',
diff --git a/languages/messages/MessagesCv.php b/languages/messages/MessagesCv.php
index 94edbcc5..4fcdbae3 100644
--- a/languages/messages/MessagesCv.php
+++ b/languages/messages/MessagesCv.php
@@ -17,8 +17,6 @@
$fallback = 'ru';
-$linkPrefixExtension = true;
-
$namespaceNames = array(
NS_MEDIA => 'Медиа',
NS_SPECIAL => 'Ятарлă',
@@ -41,6 +39,7 @@ $namespaceNames = array(
// Remove Russian aliases
$namespaceGenderAliases = array();
+$linkPrefixExtension = true;
$linkTrail = '/^([a-zа-Ñĕçăӳ"»]+)(.*)$/sDu';
$messages = array(
@@ -174,7 +173,6 @@ $messages = array(
'qbbrowse' => 'Курăм',
'qbedit' => 'Тӳрлет',
'qbpageoptions' => 'Страница ĕнерлевĕÑем',
-'qbpageinfo' => 'Страница çинчен',
'qbmyoptions' => 'Сирĕн ĕнĕрлевÑем',
'qbspecialpages' => 'Ятарлӑ ÑтраницӑÑем',
'faq' => 'ЫйХу',
@@ -385,9 +383,6 @@ $1',
Сайт Ñире Ñтпа мар, IP-Ð°Ð´Ñ€ÐµÑ ÑƒÑ€Ð»Äƒ пĕлет.
ЭÑир анонимла, е малтанхи евĕрлĕ çĕнĕ ÑÐµÐ°Ð½Ñ ÑƒÃ§Ñа, е урăх Ñтпа ĕçлеме пултаратăр.
Хăш-пĕр ÑтраницăÑем ÑÑир Ñайта кĕнĕ пек курăнма пултараççĕ, ăна тӳрлетмешкĕн браузер кÑшне çĕнетĕр.',
-'welcomecreation' => '== Ырă ÑунÑа кĕтетпĕр, $1! ==
-ЭÑир пирĕн патăмăрта çырăнтăр.
-[[Special:Preferences|Сайт ĕнĕрлевĕÑене хăвÑамăра кирлĕ пек]] лартма ан манÑа кайăр.',
'yourname' => 'Сирĕн ÑÑ‚',
'yourpassword' => 'Вăрттăн Ñăмах:',
'yourpasswordagain' => 'Вăрттăн Ñăмах тепре çырăр:',
@@ -523,7 +518,6 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
'templatesusedsection' => 'Ку пайра уÑă курнă шаблонÑем:',
'template-protected' => '(Ñыхланă)',
'template-semiprotected' => '(пĕр пайне Ñыхланă)',
-'nocreatetitle' => 'СтраницăÑене хатĕрлеÑÑине чакарнă',
# Parser/template warnings
'expensive-parserfunction-category' => 'Кунта ÑÑир чылай реÑÑƒÑ€Ñ Ñ‹Ð¹Ñ‚Ð°ÐºÐ°Ð½ функциÑемпе нумай ĕçлекен ÑтраницăÑене куратăр',
@@ -666,7 +660,6 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
# User rights log
'rightslogtext' => 'Ку пользовательÑен правиÑене улăштарниÑÑен журналě',
-'rightsnone' => '(çук)',
# Recent changes
'recentchanges' => 'УлшăнуÑем',
@@ -928,10 +921,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'unwatching' => 'Сăнав ÑÑ‚-йышĕнчен кăларÑа пăрахаÑÑи…',
'enotif_reset' => 'Пур ÑтраницăÑене те пăхнă пек палăрт',
-'enotif_newpagetext' => 'Ку çĕнĕ Ñтраница',
-'changed' => 'улăштарнă',
-'created' => 'хатĕрленĕ',
'enotif_anon_editor' => '$1 анонимлă хутшăнакан',
+'created' => 'хатĕрленĕ',
+'changed' => 'улăштарнă',
# Delete
'deletepage' => 'КăларÑа парахнă ÑтатьÑÑем',
@@ -1221,4 +1213,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'specialpages-group-users' => 'ХутшăнаканÑем тата праваÑем',
'specialpages-group-highuse' => 'Ðумай уÑă куракан ÑтраницăÑем',
+# New logging system
+'rightsnone' => '(çук)',
+
);
diff --git a/languages/messages/MessagesCy.php b/languages/messages/MessagesCy.php
index 47516ac3..832f5c52 100644
--- a/languages/messages/MessagesCy.php
+++ b/languages/messages/MessagesCy.php
@@ -38,17 +38,6 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'Sgwrs_Categori',
);
-
-$defaultDateFormat = 'dmy';
-
-$bookstoreList = array(
- "AddALL" => "http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN",
- "PriceSCAN" => "http://www.pricescan.com/books/bookDetail.asp?isbn=$1",
- "Barnes & Noble" => "http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1",
- "Amazon.com" => "http://www.amazon.com/exec/obidos/ISBN=$1",
- "Amazon.co.uk" => "http://www.amazon.co.uk/exec/obidos/ISBN=$1"
-);
-
$magicWords = array(
'redirect' => array( '0', '#ail-cyfeirio', '#ailgyfeirio', '#REDIRECT' ),
'notoc' => array( '0', '__DIMTAFLENCYNNWYS__', '__DIMRHESTRGYNNWYS__', '__DIMRHG__', '__NOTOC__' ),
@@ -115,6 +104,16 @@ $magicWords = array(
'pagesize' => array( '1', 'MAINTTUD', 'PAGESIZE' ),
);
+$defaultDateFormat = 'dmy';
+
+$bookstoreList = array(
+ "AddALL" => "http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN",
+ "PriceSCAN" => "http://www.pricescan.com/books/bookDetail.asp?isbn=$1",
+ "Barnes & Noble" => "http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1",
+ "Amazon.com" => "http://www.amazon.com/exec/obidos/ISBN=$1",
+ "Amazon.co.uk" => "http://www.amazon.co.uk/exec/obidos/ISBN=$1"
+);
+
$linkTrail = "/^([àáâèéêìíîïòóôûŵŷa-z]+)(.*)$/sDu";
$messages = array(
@@ -251,6 +250,7 @@ $messages = array(
'newwindow' => '(yn agor mewn ffenest newydd)',
'cancel' => 'Diddymu',
'moredotdotdot' => 'Rhagor...',
+'morenotlisted' => 'Ni restrir y lleill...',
'mypage' => 'Tudalen defnyddiwr',
'mytalk' => 'Sgwrs',
'anontalk' => 'Sgwrs ar gyfer y cyfeiriad IP hwn',
@@ -262,7 +262,6 @@ $messages = array(
'qbbrowse' => 'Pori',
'qbedit' => 'Golygu',
'qbpageoptions' => 'Y dudalen hon',
-'qbpageinfo' => 'Cyd-destun',
'qbmyoptions' => 'Fy nhudalennau',
'qbspecialpages' => 'Tudalennau arbennig',
'faq' => 'Cwestiynau cyffredin',
@@ -285,6 +284,7 @@ $messages = array(
'namespaces' => 'Parthau',
'variants' => 'Amrywiolion',
+'navigation-heading' => 'Llywio',
'errorpagetitle' => 'Gwall',
'returnto' => 'Dychwelyd at $1.',
'tagline' => 'Oddi ar {{SITENAME}}',
@@ -523,11 +523,10 @@ Y rheswm a roddwyd gan y gweinyddwr a roddodd y ffeil dan glo yw "\'\'$3\'\'".',
# Login and logout pages
'logouttext' => "'''Rydych wedi allgofnodi.'''
-Gallwch ddefnyddio {{SITENAME}} yn anhysbys, neu fe allwch [[Special:UserLogin|fewngofnodi eto]] wrth yr un un enw neu wrth enw arall.
+Gallwch ddefnyddio {{SITENAME}} yn anhysbys, neu fe allwch <span class='plainlinks'>[$1 fewngofnodi eto]</span> wrth yr un un enw neu wrth enw arall.
Sylwer y bydd rhai tudalennau yn parhau i ymddangos fel ag yr oeddent pan oeddech wedi mewngofnodi hyd nes i chi glirio celc eich porwr.",
-'welcomecreation' => "==Croeso, $1!==
-Mae eich cyfrif wedi'i greu.
-Cofiwch osod y [[Special:Preferences|dewisiadau]] sydd fwyaf hwylus i chi ar {{SITENAME}}.",
+'welcomeuser' => 'Croeso, $1!',
+'welcomecreation-msg' => 'Peidiwch ag anghofio newid eich [[Special:Preferences|{{SITENAME}} preferences]].',
'yourname' => 'Eich enw defnyddiwr:',
'yourpassword' => 'Eich cyfrinair:',
'yourpasswordagain' => 'Ail-deipiwch y cyfrinair:',
@@ -550,7 +549,7 @@ Cofiwch osod y [[Special:Preferences|dewisiadau]] sydd fwyaf hwylus i chi ar {{S
'gotaccount' => "Oes cyfrif gennych eisoes? '''$1'''.",
'gotaccountlink' => 'Mewngofnodwch',
'userlogin-resetlink' => 'Ydych chi wedi anghofio eich manylion mewngofnodi?',
-'createaccountmail' => 'trwy e-bost',
+'createaccountmail' => "Defnyddier cyfrinair ar hap dros dro a'i anfon i'r cyfeiriad e-bost isod",
'createaccountreason' => 'Rheswm:',
'badretype' => "Nid yw'r cyfrineiriau'n union yr un fath.",
'userexists' => 'Mae rhywun arall wedi dewis yr enw defnyddiwr hwn.
@@ -615,6 +614,7 @@ Oedwch ychydig cyn mentro eto.',
# Email sending
'php-mail-error-unknown' => 'Gwall anhysbys yng ngweithrediad post() PHP',
'user-mail-no-addy' => 'Wedi ceisio anfon e-bost heb gyfeiriad e-bost',
+'user-mail-no-body' => 'Ceisiwyd anfon e-bost gwag neu e-bost oedd a thestun rhy bwt iddo.',
# Change password dialog
'resetpass' => 'Newid cyfrinair y cyfrif',
@@ -672,6 +672,7 @@ Y cyfrinair dros dro: $2",
'changeemail-oldemail' => 'Y cyfeiriad e-bost presennol:',
'changeemail-newemail' => 'Cyfeiriad e-bost newydd:',
'changeemail-none' => '(dim)',
+'changeemail-password' => 'Eich cyfrinair ar {{SITENAME}}:',
'changeemail-submit' => 'Newidier y cyfeiriad e-bost',
'changeemail-cancel' => 'Dileer',
@@ -847,7 +848,6 @@ Dyma'r cofnod lòg diweddaraf, er gwybodaeth:",
'template-protected' => '(wedi ei diogelu)',
'template-semiprotected' => '(lled-diogelwyd)',
'hiddencategories' => "Mae'r dudalen hon yn aelod o $1 {{PLURAL:$1|categori|categori|gategori|chategori|chategori|categori}} cuddiedig:",
-'nocreatetitle' => 'Cyfyngwyd ar greu tudalennau',
'nocreatetext' => "Mae'r safle hwn wedi cyfyngu'r gallu i greu tudalennau newydd. Gallwch olygu tudalen sydd eisoes yn bodoli, neu [[Special:UserLogin|fewngofnodi, neu greu cyfrif]].",
'nocreate-loggedin' => "Nid yw'r gallu gennych i greu tudalennau.",
'sectioneditnotsupported-title' => 'Dim modd golygu fesul adran',
@@ -871,6 +871,15 @@ Ymddengys iddi gael ei dileu.",
'edit-already-exists' => 'Ni ellid creu tudalen newydd.
Mae ar gael yn barod.',
'defaultmessagetext' => 'Y testun rhagosodedig',
+'content-failed-to-parse' => "Ni lwyddwyd i ddosrannu'r cynnwys sydd ar ffurf $2 yn ôl y model $1: $3",
+'invalid-content-data' => "Data annilys i'r cynnwys",
+'content-not-allowed-here' => 'Nid yw cynnwys ar ffurf "$1" yn cael ei ganiatau ar y dudalen [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'cystrawen wici',
+'content-model-text' => 'testun plaen',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Rhybudd:''' Mae gormod o alwadau ar ffwythiannau dosrannu sy'n dreth ar adnoddau yn y dudalen hon.
@@ -1236,9 +1245,9 @@ Ni allwch ddadwneud y weithred hon.",
'prefs-emailconfirm-label' => "Cadarnhau'r e-bost:",
'prefs-textboxsize' => 'Maint y ffenestr olygu',
'youremail' => 'Eich cyfeiriad e-bost',
-'username' => 'Enw defnyddiwr:',
-'uid' => 'ID Defnyddiwr:',
-'prefs-memberingroups' => "Yn aelod o'r {{PLURAL:$1|grŵp|grŵp|grwpiau}} canlynol:",
+'username' => '{{GENDER:$1|Enw defnyddiwr}}:',
+'uid' => '{{GENDER:$1|ID y defnyddiwr}}:',
+'prefs-memberingroups' => "Yn {{GENDER:$2|aelod}} o'r {{PLURAL:$1|grŵp|grŵp|grwpiau}} canlynol:",
'prefs-registration' => "Amser dechrau'r cyfrif:",
'yourrealname' => 'Eich enw cywir*',
'yourlanguage' => 'Iaith y rhyngwyneb',
@@ -1387,12 +1396,13 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
'right-sendemail' => 'Anfon e-bost at ddefnyddwyr eraill',
'right-passwordreset' => "Gweld e-byst sy'n ailosod cyfrinair",
+# Special:Log/newusers
+'newuserlogpage' => 'Lòg creu cyfrifon defnyddwyr newydd',
+'newuserlogpagetext' => "Dyma restr o'r defnyddwyr newydd sydd wedi ymuno â'r wici.",
+
# User rights log
'rightslog' => 'Lòg galluoedd defnyddiwr',
'rightslogtext' => 'Lòg y newidiadau i alluoedd defnyddwyr yw hwn.',
-'rightslogentry' => "wedi gosod $1 yn aelod o'r grŵp $3 (grŵp cynt $2)",
-'rightslogentry-autopromote' => "wedi ei ddyrchafu'n awtomatig o $2 i $3",
-'rightsnone' => '(dim)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'darllen y dudalen',
@@ -1620,6 +1630,7 @@ Os yw'r broblem yn parhau, cysylltwch â [[Special:ListUsers/sysop|gweinyddwr]].
'backend-fail-notsame' => "Mae ffeil gwahanol a'r enw $1 arni eisoes ar gael.",
'backend-fail-invalidpath' => 'Nid yw $1 yn lwybr dilys i roi ffeil ar gadw.',
'backend-fail-delete' => "Wedi methu dileu'r ffeil $1.",
+'backend-fail-describe' => 'Ni lwyddwyd newid metadata\'r ffeil "$1".',
'backend-fail-alreadyexists' => "Mae'r ffeil $1 ar gael yn barod.",
'backend-fail-store' => "Wedi methu rhoi'r ffeil $1 ar gadw yn $2.",
'backend-fail-copy' => "Wedi methu copïo'r ffeil $1 i $2.",
@@ -1856,6 +1867,12 @@ Cofiwch chwilio am gysylltiadau eraill at nodyn a'u hystyried cyn ei ddileu.",
'disambiguations-text' => "Mae'r tudalennau canlynol yn cynnwys un neu ragor o gysylltau, sydd yn arwain at '''dudalennau gwahaniaethu'''. Hwyrach y byddai'n hwylusach petai'r cyswllt yn arwain yn syth at y dudalen briodol.<br />
Diffinir tudalen yn dudalen gwahaniaethu pan mae'n cynnwys un o'r nodiadau '[[MediaWiki:Disambiguationspage|tudalen gwahaniaethu]]'.",
+'pageswithprop' => 'Tudalennau a chanddynt nodwedd arbennig',
+'pageswithprop-legend' => 'Tudalennau a chanddynt nodwedd arbennig',
+'pageswithprop-text' => "Mae'r dudalen hon yn rhestru tudalennau sydd yn defnyddio nodwedd arbennig yn y dudalen.",
+'pageswithprop-prop' => "Enw'r nodwedd:",
+'pageswithprop-submit' => 'Gwneler',
+
'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.
Gosodwyd <del>llinell</del> drwy'r eitemau sydd eisoes wedi eu datrys.",
@@ -2008,7 +2025,7 @@ Gweler hefyd [[Special:WantedCategories|categorïau sydd eu hangen]].",
'linksearch-ok' => 'Chwilio',
'linksearch-text' => 'Gellir defnyddio cardiau gwyllt megis "*.wikipedia.org".
Mae angen parth lefel-uchaf o leiaf, er enghraifft "*.org".<br />
-Protocoliau sy\'n cael eu cynnal: <code>$1</code> (yn neidio i http:// os na roddir protocol o gwbl).',
+{{PLURAL:$2|Protocol|Protocol|Protocoliau}} sy\'n cael eu cynnal: <code>$1</code> (yn neidio i http:// os na roddir protocol o gwbl).',
'linksearch-line' => 'Mae cysylltiad i gael i $1 oddi wrth $2',
'linksearch-error' => "Dim ond ar ddechrau enw'r gwesteiwr y gallwch osod cardiau gwyllt.",
@@ -2027,10 +2044,6 @@ Protocoliau sy\'n cael eu cynnal: <code>$1</code> (yn neidio i http:// os na rod
'activeusers-hidesysops' => 'Cuddio gweinyddwyr',
'activeusers-noresult' => "Dim defnyddwyr i'w cael.",
-# Special:Log/newusers
-'newuserlogpage' => 'Lòg creu cyfrifon defnyddwyr newydd',
-'newuserlogpagetext' => "Dyma restr o'r defnyddwyr newydd sydd wedi ymuno â'r wici.",
-
# Special:ListGroupRights
'listgrouprights' => 'Galluoedd grwpiau defnyddwyr',
'listgrouprights-summary' => "Dyma restr o'r grwpiau defnyddwyr sydd i'w cael ar y wici hon, ynghyd â galluoedd aelodau'r gwahanol grwpiau. Cewch wybodaeth pellach am y gwahanol alluoedd ar y [[{{MediaWiki:Listgrouprights-helppage}}|dudalen gymorth]].",
@@ -2126,19 +2139,23 @@ Pan fydd y dudalen hon, neu ei thudalen sgwrs, yn newid, fe fyddant yn ymddangos
'enotif_mailer' => 'Sustem hysbysu {{SITENAME}}',
'enotif_reset' => 'Ystyried bod pob tudalen wedi cael ymweliad',
-'enotif_newpagetext' => 'Mae hon yn dudalen newydd.',
'enotif_impersonal_salutation' => 'at ddefnyddiwr {{SITENAME}}',
-'changed' => 'Newidiwyd',
-'created' => 'crëwyd',
-'enotif_subject' => '$CHANGEDORCREATED y dudalen \'$PAGETITLE\' ar {{SITENAME}} gan $PAGEEDITOR',
+'enotif_subject_deleted' => 'Dilewyd y dudalen $1 ar {{SITENAME}} gan {{gender:$2|$2}}',
+'enotif_subject_created' => 'Dechrewyd y dudalen $1 ar {{SITENAME}} gan {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Symudwyd y dudalen $1 ar {{SITENAME}} gan {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Adferwyd y dudalen $1 ar {{SITENAME}} gan {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Newidiwyd y dudalen $1 ar {{SITENAME}} gan {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Dilewyd y dudalen $1 ar {{SITENAME}} ar $PAGEEDITDATE gan {{gender:$2|$2}}, gweler $3.',
+'enotif_body_intro_created' => 'Dechrëwyd y dudalen $1 ar {{SITENAME}} ar $PAGEEDITDATE gan {{gender:$2|$2}}. Gweler y diwygiad cyfredol ohoni ar $3.',
+'enotif_body_intro_moved' => 'Symudwyd y dudalen $1 ar {{SITENAME}} ar $PAGEEDITDATE gan {{gender:$2|$2}}. Gweler y diwygiad cyfredol ar $3.',
+'enotif_body_intro_restored' => 'Adferwyd y dudalen $1 ar {{SITENAME}} ar $PAGEEDITDATE gan {{gender:$2|$2}}. Gweler y diwygiad cyfredol ohoni ar $3.',
+'enotif_body_intro_changed' => 'Newidiwyd y dudalen $1 ar {{SITENAME}} ar $PAGEEDITDATE gan {{gender:$2|$2}}. Gweler y diwygiad cyfredol ohoni ar $3.',
'enotif_lastvisited' => 'Gwelwch $1 am bob newid ers eich ymweliad blaenorol.',
'enotif_lastdiff' => 'Gallwch weld y newid ar $1.',
'enotif_anon_editor' => 'defnyddiwr anhysbys $1',
'enotif_body' => 'Annwyl $WATCHINGUSERNAME,
-$CHANGEDORCREATED y dudalen \'$PAGETITLE\' ar {{SITENAME}} ar $PAGEEDITDATE gan $PAGEEDITOR; gwelir y diwygiad presennol ar $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Crynodeb y golygydd: $PAGESUMMARY $PAGEMINOREDIT
@@ -2146,7 +2163,7 @@ Cysylltu â\'r golygydd:
e-bost: $PAGEEDITOR_EMAIL
wici: $PAGEEDITOR_WIKI
-Os digwydd mwy o olygiadau i\'r dudalen cyn i chi ymweld â hi, ni chewch ragor o negeseuon hysbysu. Nodwn bod modd i chi ailosod y fflagiau hysbysu ar eich rhestr wylio, ar gyfer y tudalennau rydych yn eu gwylio.
+Os bydd mwy o drin a thrafod ar y dudalen cyn i chi ymweld â hi, ni chewch ragor o negeseuon hysbysu. Nodwn bod modd i chi ailosod y fflagiau hysbysu ar eich rhestr wylio, ar gyfer y tudalennau rydych yn eu gwylio.
Sustem hysbysu {{SITENAME}}
@@ -2162,6 +2179,8 @@ $UNWATCHURL
Am fwy o gymorth ac adborth:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'crëwyd',
+'changed' => 'Newidiwyd',
# Delete
'deletepage' => 'Dileer y dudalen',
@@ -2231,6 +2250,8 @@ Mae'r tudalennau sydd wedi eu diogelu ar hyn o bryd wedi eu rhestri ar y [[Speci
'prot_1movedto2' => 'wedi symud [[$1]] i [[$2]]',
'protect-badnamespace-title' => 'Parth na ellir ei ddiogelu',
'protect-badnamespace-text' => 'Ni ellir diogelu tudalennau yn y parth hwn.',
+'protect-norestrictiontypes-text' => 'Ni ellir gwarchod y dudalen hon gan nad oes mathau o gyfyngiadau ar gael iddi.',
+'protect-norestrictiontypes-title' => 'Tudalen na ellir ei gwarchod',
'protect-legend' => "Cadarnháu'r diogelu",
'protectcomment' => 'Rheswm:',
'protectexpiry' => 'Yn dod i ben:',
@@ -2312,8 +2333,8 @@ Mae'n bosibl bod nam ar y cyswllt, neu fod y diwygiad eisoes wedi'i adfer neu we
'undeletedrevisions' => 'wedi adfer $1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}}',
'undeletedrevisions-files' => 'Adferwyd $1 {{PLURAL:$1|fersiwn|fersiwn|fersiwn|fersiwn|fersiwn|fersiwn}} a $2 {{PLURAL:$2|ffeil|ffeil|ffeil|ffeil|ffeil|ffeil}}',
'undeletedfiles' => 'Adferwyd $1 {{PLURAL:$1|ffeil|ffeil|ffeil|ffeil|ffeil|ffeil}}',
-'cannotundelete' => "Mae'r cais i ddad-ddileu wedi'i fethu;
-efallai bod rhywun arall wedi dad-ddileu'r dudalen yn barod.",
+'cannotundelete' => "Mae'r cais i ddad-ddileu wedi methu:
+$1",
'undeletedpage' => "'''Adferwyd $1'''
Ceir cofnod o'r tudalennau a ddilëwyd neu a adferwyd yn ddiweddar ar y [[Special:Log/delete|lòg ddileuon]].",
@@ -2345,7 +2366,7 @@ $1',
'blanknamespace' => '(Prif)',
# Contributions
-'contributions' => "Cyfraniadau'r defnyddiwr",
+'contributions' => "{{GENDER:$1|Cyfraniadau'r defnyddiwr}}",
'contributions-title' => "Cyfraniadau'r defnyddiwr am $1",
'mycontris' => 'Cyfraniadau',
'contribsub2' => 'Dros $1 ($2)',
@@ -2620,6 +2641,7 @@ nid yw'n bosib cyflawnu'r symud.",
'immobile-target-namespace-iw' => 'Nid yw cyswllt rhyngwici yn nod dilys wrth symud tudalen.',
'immobile-source-page' => 'Ni ellir symud y dudalen hon.',
'immobile-target-page' => "Ddim yn gallu symud i'r teitl newydd hwn.",
+'bad-target-model' => "Mae'r cyrchfan dewisedig yn defnyddio model gwahanol i'w chynnwys. Ni ellir trawsnewid o $1 i $2.",
'imagenocrossnamespace' => 'Ni ellir symud ffeil i barth arall',
'nonfile-cannot-move-to-file' => 'Ni ellir symud unrhywbeth heblaw ffeil i barth y ffeiliau',
'imagetypemismatch' => "Nid yw'r estyniad ffeil newydd yn cyfateb i'r math o ffeil",
@@ -2733,6 +2755,7 @@ Mae ffolder dros dro yn eisiau.',
'import-error-interwiki' => 'Ni fewnforwyd y dudalen "$1" oherwydd bod yr enw arni wedi ei neilltuo at ddiben cysylltu\'n allanol (rhyngwici).',
'import-error-special' => 'Ni fewnforiwyd y dudalen "$1" oherwydd ei bod yn perthyn i barth arbennig lle nad oes tudalennau i\'w cael.',
'import-error-invalid' => 'Ni fewnforwyd y dudalen "$1" oherwydd bod yr enw arni yn annilys.',
+'import-error-unserialize' => "Ni allwyd ddad-gyfresu'r diwygiad $2 o'r dudalen '$1'. Adroddwyd bod y diwygiad yn defnyddio'r model cynnwys $3, wedi ei gyfresu fel $4.",
'import-options-wrong' => '{{PLURAL:$2|Dewis|Dewis|Dewisiadau}} annilys: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Mae teitl y dudalen wraidd a roddir yn annilys.',
'import-rootpage-nosubpage' => 'Nid yw\'r parth "$1", sef parth y brif dudalen y mewnforir iddi, yn caniatau is-dudalennau.',
@@ -2747,7 +2770,6 @@ Mae ffolder dros dro yn eisiau.',
# JavaScriptTest
'javascripttest' => 'Profi JavaScript',
-'javascripttest-disabled' => 'Ni alluogwyd y swyddogaeth hon ar y wici hwn.',
'javascripttest-title' => 'Yn cynnal profion $1',
'javascripttest-pagetext-noframework' => 'Neilltuwyd y dudalen hon at gynnal profion JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Ni nabyddwyd y fframwaith profi "$1".',
@@ -2862,11 +2884,13 @@ Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr wahardd
'pageinfo-default-sort' => 'Allwedd trefnu diofyn',
'pageinfo-length' => 'Hyd y dudalen (beitiau)',
'pageinfo-article-id' => 'ID y dudalen',
+'pageinfo-language' => 'Iaith cynnwys y dudalen',
'pageinfo-robot-policy' => 'Statws i beiriannau chwilio',
'pageinfo-robot-index' => 'Gellir ei rhestru gan beiriannau chwilio',
'pageinfo-robot-noindex' => 'Ni ellir ei rhestru gan beiriannau chwilio',
'pageinfo-views' => 'Nifer yr ymweliadau',
'pageinfo-watchers' => 'Nifer gwylwyr y dudalen',
+'pageinfo-few-watchers' => 'Llai na $1 {{PLURAL:$1|gwyliwr|gwyliwr|wyliwr|gwyliwr|o wylwyr}}',
'pageinfo-redirects-name' => "Nifer yr ailgyfeiriadau i'r dudalen hon",
'pageinfo-subpages-name' => "Nifer yr is-dudalennau i'r dudalen hon",
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ailgyfeiriad}}; $3 {{PLURAL:$3|is-dudalen arall}})',
@@ -2881,6 +2905,19 @@ Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr wahardd
'pageinfo-magic-words' => '{{PLURAL:$1|Gair|Gair|Geiriau}} hud ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categori|Categori|Categorïau}} cudd ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Nodyn|Nodyn|Nodiadau}} a drawsgynhwyswyd ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Tudalen|Tudalen|Tudalennau}} y trawsgynhwyswyd y dudalen hon arnynt ($1)',
+'pageinfo-toolboxlink' => 'Gwybodaeth am y dudalen',
+'pageinfo-redirectsto' => 'Yn ailgyfeirio i',
+'pageinfo-redirectsto-info' => 'manylion',
+'pageinfo-contentpage' => 'Ymhlith tudalennau pwnc y wici',
+'pageinfo-contentpage-yes' => 'Ydi',
+'pageinfo-protect-cascading' => "Mae diogelu sgydol yn deillio o'r dudalen hon",
+'pageinfo-protect-cascading-yes' => 'Oes',
+'pageinfo-protect-cascading-from' => "Mae'r diogelu sgydol yn dechrau ar",
+'pageinfo-category-info' => 'Gwybodaeth am y categori',
+'pageinfo-category-pages' => 'Nifer y tudalennau',
+'pageinfo-category-subcats' => 'Nifer yr is-gategorïau',
+'pageinfo-category-files' => 'Nifer y ffeiliau',
# Skin names
'skinname-standard' => 'Safonol',
@@ -2897,6 +2934,8 @@ Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr wahardd
'markedaspatrollederror' => 'Ni ellir gosod marc ymweliad patrôl',
'markedaspatrollederrortext' => "Rhaid nodi'r union olygiad sydd angen marc ymweliad patrôl.",
'markedaspatrollederror-noautopatrol' => "Ni chaniateir i chi farcio'ch newidiadau eich hunan fel rhai derbyniol.",
+'markedaspatrollednotify' => 'Nodwyd bod y newid hwn i $1 wedi derbyn ymweliad patrôl.',
+'markedaspatrollederrornotify' => 'Methwyd rhoi marc ymweliad patrôl arni.',
# Patrol log
'patrol-log-page' => 'Lòg patrolio',
@@ -2930,6 +2969,7 @@ Mae'n bosib y bydd eich cyfrifiadur yn cael ei danseilio wrth ddefnyddio'r ffeil
'file-nohires' => 'Wedi ei chwyddo hyd yr eithaf.',
'svg-long-desc' => 'Ffeil SVG, maint mewn enw $1 × $2 picsel, maint y ffeil: $3',
'svg-long-desc-animated' => 'Ffeil SVG animeiddiedig, maint mewn enw $1 × $2 picsel, maint y ffeil: $3',
+'svg-long-error' => 'Ffeil SVG annilys: $1',
'show-big-image' => 'Maint llawn',
'show-big-image-preview' => 'Maint y rhagolwg: $1.',
'show-big-image-other' => '{{PLURAL:$2|Datrysiad arall|Datrysiad arall|Datrysiadau eraill|Datrysiadau eraill|Datrysiadau eraill|Datrysiadau eraill}}: $1.',
@@ -2962,7 +3002,10 @@ Mae'n bosib y bydd eich cyfrifiadur yn cael ei danseilio wrth ddefnyddio'r ffeil
'minutes' => '{{PLURAL:$1||$1 munud|$1 funud|$1 munud|$1 munud|$1 munud}}',
'hours' => '{{PLURAL:$1|$1 awr}}',
'days' => '{{PLURAL:$1||$1 diwrnod|$1 ddiwrnod|$1 diwrnod|$1 diwrnod|$1 diwrnod}}',
+'months' => '{{PLURAL:$1|$1 mis|mis|deufis|$1 mis}}',
+'years' => '{{PLURAL:$1|$1 blwyddyn|blwyddyn|$1 flynedd|$1 blynedd|$1 blynedd|$1 mlynedd}}',
'ago' => '$1 yn ôl',
+'just-now' => 'nawr',
# Bad image list
'bad_image_list' => "Dyma'r fformat:
@@ -3449,6 +3492,7 @@ Bydd y côd cadarnhau yn dod i ben am $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Analluogwyd cynhwysiad rhyng-wici]',
'scarytranscludefailed' => '[Methwyd nôl y nodyn ar gyfer $1]',
+'scarytranscludefailed-httpstatus' => '[Methwyd nôl y nodyn ar gyfer $1: HTTP $2]',
'scarytranscludetoolong' => "[Mae'r URL yn rhy hir]",
# Delete conflict
@@ -3557,6 +3601,7 @@ Gallwch hefyd [[Special:EditWatchlist|ddefnyddio\'r rhestr arferol]].',
'version-license' => 'Trwydded',
'version-poweredby-credits' => "Mae'r wici hwn wedi'i nerthu gan '''[//www.mediawiki.org/ MediaWiki]''', hawlfraint © 2001 - $1 $2.",
'version-poweredby-others' => 'eraill',
+'version-credits-summary' => 'Hoffem gydnabod cyfraniad y bobl canlynol i [[Special:Version|MediaWiki]].',
'version-license-info' => "Meddalwedd rhydd yw MediaWiki; gallwch ei ddefnyddio a'i addasu yn ôl termau'r GNU General Public License a gyhoeddir gan Free Software Foundation; naill ai fersiwn 2 o'r Drwydded, neu unrhyw fersiwn diweddarach o'ch dewis.
Cyhoeddir MediaWiki yn y gobaith y bydd o ddefnydd, ond HEB UNRHYW WARANT; heb hyd yn oed gwarant ymhlyg o FARCHNADWYEDD nag o FOD YN ADDAS AT RYW BWRPAS ARBENNIG. Gweler y GNU General Public License am fanylion pellach.
@@ -3674,14 +3719,14 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
'logentry-delete-delete' => 'Dileodd $1 y dudalen $3',
'logentry-delete-restore' => 'Adferodd $1 y dudalen $3',
'logentry-delete-event' => 'Newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
-'logentry-delete-revision' => "Newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad|$5 diwygiad|$5 diwygiad}} o'r dudalen $3: $4",
-'logentry-delete-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3',
-'logentry-delete-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3",
-'logentry-suppress-delete' => 'Cuddiodd $1 y dudalen $3',
-'logentry-suppress-event' => 'Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
-'logentry-suppress-revision' => "Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad|$5 diwygiad|$5 diwygiad}} o'r dudalen $3: $4",
-'logentry-suppress-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3, yn y dirgel',
-'logentry-suppress-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3, yn y dirgel",
+'logentry-delete-revision' => "{{GENDER:$2|Newidiodd}} $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-delete-event-legacy' => '{{GENDER:$2|Newidiodd}} $1 welededd cofnodion lòg ar $3',
+'logentry-delete-revision-legacy' => "{{GENDER:$2|Newidiodd}} $1 welededd diwygiadau o'r dudalen $3",
+'logentry-suppress-delete' => '{{GENDER:$2|Cuddiodd}} $1 y dudalen $3',
+'logentry-suppress-event' => 'Yn y dirgel, {{GENDER:$2|newidiodd}} $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
+'logentry-suppress-revision' => "Yn y dirgel, {{GENDER:$2|newidiodd}} $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-suppress-event-legacy' => '{{GENDER:$2|Newidiodd}} $1 welededd cofnodion lòg ar $3, yn y dirgel',
+'logentry-suppress-revision-legacy' => "{{GENDER:$2|Newidiodd}} $1 welededd diwygiadau o'r dudalen $3, yn y dirgel",
'revdelete-content-hid' => 'cuddiwyd y cynnwys',
'revdelete-summary-hid' => 'cuddiwyd y crynodeb golygu',
'revdelete-uname-hid' => 'cuddiwyd yr enw defnyddiwr',
@@ -3690,17 +3735,21 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
'revdelete-uname-unhid' => 'datguddiwyd yr enw defnyddiwr',
'revdelete-restricted' => 'cyfyngwyd ar allu gweinyddwyr i weld',
'revdelete-unrestricted' => 'tynnwyd y cyfyngiadau ar allu gweinyddwyr i weld',
-'logentry-move-move' => 'Symudwyd y dudalen $3 i $4 gan $1',
-'logentry-move-move-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 heb adael dolen ailgyfeirio',
-'logentry-move-move_redir' => 'Symudwyd y dudalen $3 i $4 gan $1 dros y ddolen ailgyfeirio',
+'logentry-move-move' => 'Symudodd $1 y dudalen $3 i $4',
+'logentry-move-move-noredirect' => 'Symudodd $1 y dudalen $3 i $4 heb adael dolen ailgyfeirio',
+'logentry-move-move_redir' => '{{GENDER:$2|Symudwyd}} y dudalen $3 i $4 gan $1 dros y ddolen ailgyfeirio',
'logentry-move-move_redir-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 dros ddolen ailgyfeirio heb adael dolen ailgyfeirio newydd',
-'logentry-patrol-patrol' => "Rhoddodd $1 nod ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
-'logentry-patrol-patrol-auto' => "Rhoddodd $1 nod yn awtomatig ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
-'logentry-newusers-newusers' => 'Dechreuwyd y cyfrif defnyddiwr $1',
+'logentry-patrol-patrol' => "{{GENDER:$2|Rhoddodd}} $1 nod ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
+'logentry-patrol-patrol-auto' => "{{GENDER:$2|Rhoddodd}} $1 nod yn awtomatig ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
+'logentry-newusers-newusers' => '{{GENDER:$2|Dechreuwyd}} y cyfrif defnyddiwr $1',
'logentry-newusers-create' => 'Dechreuwyd y cyfrif defnyddiwr $1',
'logentry-newusers-create2' => 'Dechreuwyd y cyfrif defnyddiwr $3 gan $1',
-'logentry-newusers-autocreate' => 'Crëwyd y cyfrif $1 yn awtomatig',
-'newuserlog-byemail' => 'anfonwyd y cyfrinair trwy e-bost',
+'logentry-newusers-byemail' => '{{GENDER:$2|Dechreuodd}} $1 y cyfrif defnyddiwr $3 ac anfonodd gyfrinair drwy e-bost',
+'logentry-newusers-autocreate' => '{{GENDER:$2|Crëwyd}} y cyfrif $1 yn awtomatig',
+'logentry-rights-rights' => '{{GENDER:$2|Newidiodd}} $1 y grwpiau y mae $3 yn aelod ohonynt o $4 i $5',
+'logentry-rights-rights-legacy' => '{{GENDER:$2|Newidiodd}} $1 y grwpiau y mae $3 yn aelod ohonynt',
+'logentry-rights-autopromote' => '{{GENDER:$2|Dyrchafwyd}} $1 yn awtomatig o $4 i $5',
+'rightsnone' => '(dim)',
# Feedback
'feedback-bugornote' => 'Os ydych yn barod i ddisgrifio problem technegol yn fanwl gallwch [$1 gyflwyno adroddiad am y bỳg]. Fel arall, gallwch ddefnyddio\'r ffurflen syml isod. Fe roddir eich sylwadau ar y dudalen "[$3 $2]", ynghyd â\'ch enw defnyddiwr ac enw\'r gweinydd sydd ar waith gennych.',
@@ -3753,6 +3802,7 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
'api-error-ok-but-empty' => 'Gwall mewnol: dim ymateb gan y gweinydd.',
'api-error-overwrite' => 'Ni chaniateir trosysgrifo ffeil sydd eisoes yn bod.',
'api-error-stashfailed' => "Gwall mewnol: methodd y gweinydd â rhoi'r ffeil dros dro ar gadw.",
+'api-error-publishfailed' => "Gwall mewnol: methodd y gweinydd â chyhoeddi'r ffeil dros dro.",
'api-error-timeout' => 'Ni chafwyd ymateb gan y gweinydd mewn da bryd.',
'api-error-unclassified' => 'Cafwyd gwall anhysbys',
'api-error-unknown-code' => 'Gwall anhysbys: "$1"',
@@ -3773,4 +3823,7 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
'duration-centuries' => '$1 {{PLURAL:$1|canmlwydd|ganmlwydd|ganmlwydd|canmlwydd|chanmlwydd|canmlwydd}}',
'duration-millennia' => '$1 {{PLURAL:$1|milflwydd|filflwydd|filflwydd|milflwydd|milflwydd|milflwydd}}',
+# Image rotation
+'rotate-comment' => "Trowyd y llun $1 {{PLURAL:$1|gradd|radd|radd|gradd}} gyda'r cloc",
+
);
diff --git a/languages/messages/MessagesDa.php b/languages/messages/MessagesDa.php
index 32ef1cbb..1bc689b6 100644
--- a/languages/messages/MessagesDa.php
+++ b/languages/messages/MessagesDa.php
@@ -32,6 +32,7 @@
* @author Morten LJ
* @author Najami
* @author Nghtwlkr
+ * @author Palnatoke
* @author Peter Alberti
* @author Peter Andersen
* @author Purodha
@@ -40,6 +41,7 @@
* @author Sarrus
* @author Sir48
* @author Slomox
+ * @author Steenth
* @author Svip
* @author Søren Løvborg
* @author Tjernobyl
@@ -73,15 +75,6 @@ $namespaceAliases = array(
'Hjælp-diskussion' => NS_HELP_TALK,
);
-$bookstoreList = array(
- "Bibliotek.dk" => "http://bibliotek.dk/vis.php?base=dfa&origin=kommando&field1=ccl&term1=is=$1&element=L&start=1&step=10",
- "Bogguide.dk" => "http://www.bogguide.dk/find_boeger_bog.asp?ISBN=$1",
- 'inherit' => true,
-);
-
-$separatorTransformTable = array( ',' => '.', '.' => ',' );
-$linkTrail = '/^([a-zæøå]+)(.*)$/sDu';
-
$specialPageAliases = array(
'Activeusers' => array( 'Aktive_Brugere' ),
'Allmessages' => array( 'MediaWiki-systemmeddelelser' ),
@@ -125,6 +118,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'MIME-type-søgning' ),
'Mostcategories' => array( 'Sider_med_flest_kategorier' ),
'Mostimages' => array( 'Mest_brugte_filer' ),
+ 'Mostinterwikis' => array( 'Flest_interwikilinks' ),
'Mostlinked' => array( 'Sider_med_flest_henvisninger' ),
'Mostlinkedcategories' => array( 'Kategorier_med_flest_sider' ),
'Mostlinkedtemplates' => array( 'Hyppigst_brugte_skabeloner' ),
@@ -145,7 +139,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Seneste_ændringer' ),
'Recentchangeslinked' => array( 'Relaterede_ændringer' ),
'Revisiondelete' => array( 'Versionssletning' ),
- 'RevisionMove' => array( 'Versionsflytning' ),
'Search' => array( 'Søgning' ),
'Shortpages' => array( 'Korteste_sider' ),
'Specialpages' => array( 'Specialsider' ),
@@ -186,6 +179,15 @@ $dateFormats = array(
'ymd both' => 'Y M j, H:i'
);
+$bookstoreList = array(
+ "Bibliotek.dk" => "http://bibliotek.dk/vis.php?base=dfa&origin=kommando&field1=ccl&term1=is=$1&element=L&start=1&step=10",
+ "Bogguide.dk" => "http://www.bogguide.dk/find_boeger_bog.asp?ISBN=$1",
+ 'inherit' => true,
+);
+
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
+$linkTrail = '/^([a-zæøå]+)(.*)$/sDu';
+
$messages = array(
# User preference toggles
'tog-underline' => 'Understreg henvisninger:',
@@ -321,6 +323,7 @@ $messages = array(
'newwindow' => '(Ã¥bner i et nyt vindue)',
'cancel' => 'Afbryd',
'moredotdotdot' => 'Mere...',
+'morenotlisted' => 'Mere ikke angivet...',
'mypage' => 'Side',
'mytalk' => 'Diskussion',
'anontalk' => 'Diskussionsside for denne IP-adresse',
@@ -332,7 +335,6 @@ $messages = array(
'qbbrowse' => 'Gennemse',
'qbedit' => 'Redigér',
'qbpageoptions' => 'Indstillinger for side',
-'qbpageinfo' => 'Information om side',
'qbmyoptions' => 'Mine indstillinger',
'qbspecialpages' => 'Specielle sider',
'faq' => 'OSS',
@@ -355,6 +357,7 @@ $messages = array(
'namespaces' => 'Navnerum',
'variants' => 'Varianter',
+'navigation-heading' => 'Navigationsmenu',
'errorpagetitle' => 'Fejl',
'returnto' => 'Tilbage til $1.',
'tagline' => 'Fra {{SITENAME}}',
@@ -593,11 +596,11 @@ Administratoren, som skrivebeskyttede den, gav følgende begrundelse: "$3".',
# Login and logout pages
'logouttext' => "'''Du er nu logget af.'''
-Du kan fortsætte med at bruge {{SITENAME}} anonymt, eller du kan [[Special:UserLogin|logge på igen]] som den samme eller en anden bruger.
+Du kan fortsætte med at bruge {{SITENAME}} anonymt, eller du kan <span class='plainlinks'>[$1 logge på igen]</span> som den samme eller en anden bruger.
Bemærk, at nogle sider stadigvæk kan vises som om du var logget på, indtil du tømmer din browsers cache.",
-'welcomecreation' => '== Velkommen, $1! ==
-
-Din konto er blevet oprettet. Glem ikke at personliggøre dine [[Special:Preferences|{{SITENAME}}-indstillinger]].',
+'welcomeuser' => 'Velkommen, $1!',
+'welcomecreation-msg' => 'Din konto er blevet oprettet.
+Glem ikke at ændre dine [[Special:Preferences|{{SITENAME}} indstillinger]].',
'yourname' => 'Dit brugernavn:',
'yourpassword' => 'Din adgangskode:',
'yourpasswordagain' => 'Gentag adgangskode',
@@ -620,7 +623,7 @@ Din konto er blevet oprettet. Glem ikke at personliggøre dine [[Special:Prefere
'gotaccount' => 'Har du allerede en konto? $1.',
'gotaccountlink' => 'Log på',
'userlogin-resetlink' => 'Har du glemt dine login oplysninger?',
-'createaccountmail' => 'via e-mail',
+'createaccountmail' => 'Brug en midlertidig tilfældig adgangskode og send den til e-mailadressen angivet nedenfor',
'createaccountreason' => 'Begrundelse:',
'badretype' => 'De indtastede adgangskoder er ikke ens.',
'userexists' => 'Det brugernavn, du har valgt, er allerede i brug.
@@ -692,6 +695,7 @@ Vent venligst før du prøver igen.',
# Email sending
'php-mail-error-unknown' => "Ukendt fejl i PHP's mail()-funtion",
'user-mail-no-addy' => 'Forsøgte at sende email uden en email-adresse',
+'user-mail-no-body' => 'Forsøgte at sende en e-mail med tomt eller urimeligt kort indhold.',
# Change password dialog
'resetpass' => 'Skift adgangskode',
@@ -749,6 +753,7 @@ Midlertidig adgangskode: $2',
'changeemail-oldemail' => 'Nuværende email-adresse:',
'changeemail-newemail' => 'Ny email-adresse:',
'changeemail-none' => '(ingen)',
+'changeemail-password' => 'Din adgangskode til {{SITENAME}}:',
'changeemail-submit' => 'Ændr email',
'changeemail-cancel' => 'Afbryd',
@@ -932,7 +937,6 @@ Den seneste logpost vises nedenfor:",
'template-semiprotected' => '(delvist beskyttet)',
'hiddencategories' => 'Denne side er i {{PLURAL:$1|en skjult kategori|$1 skjulte kategorier}}:',
'edittools' => '<!-- Denne tekst vises under formularen „Ændre“ samt "Upload". -->',
-'nocreatetitle' => 'Oprettelse af nye sider er begrænset.',
'nocreatetext' => 'Serveren har begrænset oprettelse af nye sider. Bestående sider kan ændres eller [[Special:UserLogin|logge på]].',
'nocreate-loggedin' => 'Du har ikke rettigheder til at oprette nye sider.',
'sectioneditnotsupported-title' => 'Afsnitsredigering understøttes ikke',
@@ -953,6 +957,15 @@ Den ser du til at være slettet.',
'edit-no-change' => 'Din ændring ignoreredes, fordi der ikke var ændring af teksten.',
'edit-already-exists' => 'En ny side kunne ikke oprettes, fordi den allerede findes.',
'defaultmessagetext' => 'Standardtekst',
+'content-failed-to-parse' => 'Kunne ikke fortolke $2-indholdet af $1-modellen: $3',
+'invalid-content-data' => 'Ugyldig indholdsdata',
+'content-not-allowed-here' => '"$1" indhold er ikke tilladt på siden [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'almindelig tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Advarsel: Der er for mange beregningstunge oversætter-funktionskald på denne side.
@@ -1313,9 +1326,9 @@ Det kan ikke gøres om.',
'prefs-emailconfirm-label' => 'Bekræftelse af e-mail:',
'prefs-textboxsize' => 'Størrelse på redigeringsvindue',
'youremail' => 'Din e-mailadresse:',
-'username' => 'Brugernavn:',
-'uid' => 'Brugernummer:',
-'prefs-memberingroups' => 'Medlem af {{PLURAL:$1|gruppen|grupperne}}:',
+'username' => '{{GENDER:$1|Brugernavn}}:',
+'uid' => '{{GENDER:$1|Brugernummer}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Medlem}} af {{PLURAL:$1|gruppen|grupperne}}:',
'prefs-registration' => 'Registreringstidspunkt:',
'yourrealname' => 'Dit rigtige navn:',
'yourlanguage' => 'Sprog:',
@@ -1463,12 +1476,13 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
'right-sendemail' => 'Sende e-mail til andre brugere',
'right-passwordreset' => 'Se emails til nulstilling af adgangskoder',
+# Special:Log/newusers
+'newuserlogpage' => 'Brugeroprettelseslog',
+'newuserlogpagetext' => 'Dette er en log over de senest oprettede brugere.',
+
# User rights log
'rightslog' => 'Rettighedslog',
'rightslogtext' => 'Dette er en log over ændringer i brugeres rettigheder.',
-'rightslogentry' => 'ændrede grupperettigheder for „$1“ fra „$2“ til „$3“.',
-'rightslogentry-autopromote' => 'blev automatisk forfremmet fra $2 til $3',
-'rightsnone' => '(-)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'se denne side',
@@ -1705,6 +1719,7 @@ Informer venligst en [[Special:ListUsers/sysop|systemadministrator]].',
'backend-fail-notsame' => 'En ikke-identisk fil eksisterer allerede som $1.',
'backend-fail-invalidpath' => '$1 er ikke en gyldig lagringssti.',
'backend-fail-delete' => 'Kunne ikke slette filen $1.',
+'backend-fail-describe' => 'Kunne ikke ændre metadata for filen "$1".',
'backend-fail-alreadyexists' => 'Filen $1 findes allerede.',
'backend-fail-store' => 'Kunne ikke gemme filen $1 i $2.',
'backend-fail-copy' => 'Kunne ikke kopiere filen $1 til $2.',
@@ -1939,6 +1954,12 @@ Husk at kontrollere for andre henvisninger til skabelonerne før de slettes.',
De bør henvise direkte til et mere passende emne i stedet.<br />
En side behandles som en side med en flertydig titel hvis den bruger en skabelon som der er henvist til fra [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Sider med en sideegenskab',
+'pageswithprop-legend' => 'Sider med en sideegenskab',
+'pageswithprop-text' => 'Denne side viser en liste over sider, der bruger en bestemt sideegenskaben.',
+'pageswithprop-prop' => 'Egenskabsnavn:',
+'pageswithprop-submit' => 'GÃ¥',
+
'doubleredirects' => 'Dobbelte omdirigeringer',
'doubleredirectstext' => 'Dette er en liste over sider som omdirigerer til andre omdirigeringssider.
Hver linje indeholder henvisninger til den første og den anden omdirigering, såvel som til målet for den anden omdirigering som sædvanligvis er den "rigtige" målside som den første omdirigering burde henvise til.
@@ -2091,7 +2112,7 @@ Se også [[Special:WantedCategories|ønskede kategorier]].',
'linksearch-ok' => 'Søg',
'linksearch-text' => 'Wildcards som "*.wikipedia.org" kan benyttes.
Der skal som minimum angives et topniveau-domæne som f. eks. "*.org".<br />
-Understøttede protokoller: <code>$1</code> (bruger automatisk http:// hvis der ikke er angivet nogen protokol).',
+{{PLURAL:$2|Understøttet protokol|Understøttede protokoller}}: <code>$1</code> (bruger automatisk http:// hvis der ikke er angivet nogen protokol).',
'linksearch-line' => '$2 linker til $1',
'linksearch-error' => 'Wildcards må kun benyttes i starten af hostnavnet.',
@@ -2110,10 +2131,6 @@ Understøttede protokoller: <code>$1</code> (bruger automatisk http:// hvis der
'activeusers-hidesysops' => 'Skjul administratorer',
'activeusers-noresult' => 'Ingen brugere fundet.',
-# Special:Log/newusers
-'newuserlogpage' => 'Brugeroprettelseslog',
-'newuserlogpagetext' => 'Dette er en log over de senest oprettede brugere.',
-
# Special:ListGroupRights
'listgrouprights' => 'Brugergrupperettigheder',
'listgrouprights-summary' => 'Denne side viser de brugergrupper der er defineret på denne wiki og de enkelte gruppers rettigheder.
@@ -2209,19 +2226,23 @@ Fremtidige ændringer af denne side og dens tilknyttede diskussionsside vil bliv
'enotif_mailer' => '{{SITENAME}} informationsmail',
'enotif_reset' => 'Marker alle sider som besøgt',
-'enotif_newpagetext' => 'Dette er en ny side.',
'enotif_impersonal_salutation' => '{{SITENAME}} bruger',
-'changed' => 'ændret',
-'created' => 'oprettet',
-'enotif_subject' => '{{SITENAME}}-siden $PAGETITLE er blevet ændret af $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}} side $1 er blevet slettet af {{gender:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}} side $1 er blevet oprettet af {{gender:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}} side $1 er blevet flyttet af {{gender:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}} side $1 er blevet gendannet af {{gender:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}} side $1 er blevet ændret af {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => '{{SITENAME}}siden $1 er blevet slettet $PAGEEDITDATE af {{gender:$2|$2}}, se $3.',
+'enotif_body_intro_created' => '{{SITENAME}} siden $1 er blevet oprettet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.',
+'enotif_body_intro_moved' => '{{SITENAME}} siden $1 er blevet flyttet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle revision.',
+'enotif_body_intro_restored' => '{{SITENAME}} siden $1 er blevet gendannet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.',
+'enotif_body_intro_changed' => '{{SITENAME}} siden $1 er blevet ændret den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.',
'enotif_lastvisited' => 'Se $1 for alle ændringer siden dit sidste besøg.',
'enotif_lastdiff' => 'Se $1 for at vise denne ændring.',
'enotif_anon_editor' => 'anonym bruger $1',
-'enotif_body' => 'Kære $WATCHINGUSERNAME,
+'enotif_body' => 'Kære $WATCHINGUSERNAME
-{{SITENAME}}-siden $PAGETITLE er blevet $CHANGEDORCREATED den $PAGEEDITDATE af $PAGEEDITOR, se $PAGETITLE_URL for den aktuelle version.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Bidragyderens opsummering: $PAGESUMMARY $PAGEMINOREDIT
@@ -2229,13 +2250,12 @@ Kontakt bidragyderen:
e-mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Du vil ikke modtage flere beskeder om yderligere ændringer medmindre du besøger denne side.
-På din overvågningsliste kan du også nulstille alle markeringer på de sider, du overvåger.
+Du vil ikke modtage flere beskeder om yderligere ændringer medmindre du besøger denne side. På din overvågningsliste kan du også nulstille alle markeringer for de sider, du overvåger.
Med venlig hilsen {{SITENAME}}s informationssystem
--
-For at ændre dine indstillinger for e-mail-notifikationer, besøg
+For at ændre dine indstillinger for e-mail meddelelser, besøg
{{canonicalurl:{{#special:Preferences}}}}
For at ændre indstillingerne for din overvågningsliste, besøg
@@ -2246,6 +2266,8 @@ $UNWATCHURL
Tilbagemelding og yderligere hjælp:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'oprettet',
+'changed' => 'ændret',
# Delete
'deletepage' => 'Slet side',
@@ -2313,6 +2335,8 @@ Se [[Special:ProtectedPages|listen over beskyttede sider]] for listen over sideb
'prot_1movedto2' => '$1 flyttet til $2',
'protect-badnamespace-title' => 'Navnerum, der ikke kan beskyttes',
'protect-badnamespace-text' => 'Sider i dette navnerum kan ikke beskyttes.',
+'protect-norestrictiontypes-text' => 'Denne side kan ikke beskyttes, da der er ikke er nogen tilgængelige begrænsningstyper.',
+'protect-norestrictiontypes-title' => 'Ikke muligt at beskytte side',
'protect-legend' => 'Bekræft beskyttelse',
'protectcomment' => 'Begrundelse:',
'protectexpiry' => 'Udløb',
@@ -2394,7 +2418,8 @@ Teksten i de slettede versioner er kun tilgængelig for administratorer.',
'undeletedrevisions' => '$1 {{PLURAL:$1|version|versioner}} gendannet',
'undeletedrevisions-files' => '$1 {{plural:$1|version|versioner}} og $2 {{plural:$2|fil|filer}} gendannet',
'undeletedfiles' => '$1 {{plural:$1|fil|filer}} gendannet',
-'cannotundelete' => 'Gendannelse mislykkedes; en anden har måske allerede gendannet siden.',
+'cannotundelete' => 'Gendannelse mislykkedes:
+$1',
'undeletedpage' => "'''$1''' blev gendannet.
I [[Special:Log/delete|slette-loggen]] findes en oversigt over de nyligt slettede og gendannede sider.",
@@ -2425,7 +2450,7 @@ $1',
'blanknamespace' => '(Hoved)',
# Contributions
-'contributions' => 'Brugerbidrag',
+'contributions' => '{{GENDER:$1|Brugerbidrag}}',
'contributions-title' => 'Brugerbidrag for $1',
'mycontris' => 'Bidrag',
'contribsub2' => 'For $1 ($2)',
@@ -2691,6 +2716,7 @@ Artiklen "[[:$1]]" eksisterer allerede. Vil du slette den for at gøre plads til
'immobile-target-namespace-iw' => 'En side kan ikke flyttes til en interwiki-henvisning.',
'immobile-source-page' => 'Denne side kan ikke flyttes.',
'immobile-target-page' => 'Kan ikke flytte til det navn.',
+'bad-target-model' => 'Den ønskede destination bruger en anden indholdsmodel. Kan ikke konvertere fra $1 til $2.',
'imagenocrossnamespace' => 'Filer kan ikke flyttes til et navnerum der ikke indeholder filer',
'nonfile-cannot-move-to-file' => 'Kan ikke flytte ikke-filer til fil-navnerummet',
'imagetypemismatch' => 'Den nye filendelse passer ikke til filtypen',
@@ -2801,6 +2827,7 @@ Alle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-logge
'import-error-interwiki' => 'Siden "$1" importeres ikke, da dens navn er reserveret for eksterne henvisninger (interwiki).',
'import-error-special' => 'Siden "$1" importeres ikke, da den tilhører et særligt navnerum, der ikke tillader sider.',
'import-error-invalid' => 'Siden "$1" importeres ikke, da dens navn er ugyldigt.',
+'import-error-unserialize' => 'Ændring $2 af siden "$1" kunne ikke afserialiseres. Ændringen brugte indholdsmodel $3 serialiseret som $4.',
'import-options-wrong' => '{{PLURAL:$2|Ugyldig indstilling|Ugyldige indstillinger}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Den rodside der er angivet har en ugyldig titel.',
'import-rootpage-nosubpage' => 'Navnerummet "$1" tillader ikke undersider af rodsiderne.',
@@ -2815,7 +2842,6 @@ Alle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-logge
# JavaScriptTest
'javascripttest' => 'Test af JavaScript',
-'javascripttest-disabled' => 'Denne funktion er ikke aktiveret på denne wiki.',
'javascripttest-title' => 'Kører $1 test',
'javascripttest-pagetext-noframework' => 'Denne side er reserveret til at teste JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Ukendt testmiljø "$1".',
@@ -2939,11 +2965,13 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
'pageinfo-default-sort' => 'Standardsorteringsnøgle',
'pageinfo-length' => 'Sidelængde (i bytes)',
'pageinfo-article-id' => 'Side-ID',
+'pageinfo-language' => 'Sprog for sideindholdet',
'pageinfo-robot-policy' => 'Søgemaskinestatus',
'pageinfo-robot-index' => 'Indekserbar',
'pageinfo-robot-noindex' => 'Ikke indekserbar',
'pageinfo-views' => 'Antal visninger',
'pageinfo-watchers' => 'Antal brugere, der overvåger siden',
+'pageinfo-few-watchers' => 'Overvåget af færre end $1 {{PLURAL:$1|bruger|brugere}}',
'pageinfo-redirects-name' => 'Omdirigeringer til denne side',
'pageinfo-subpages-name' => 'Undersider til denne side',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|omdirigering|omdirigeringer}}; $3 {{PLURAL:$3|der ikke er en omdirigering|der ikke er omdirigeringer}})',
@@ -2958,6 +2986,19 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
'pageinfo-magic-words' => '{{PLURAL:$1|Magisk|Magiske}} ord ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Transkluderet skabelon|Transkluderede skabeloner}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Side|Sider}} transkluderet på ( $1 )',
+'pageinfo-toolboxlink' => 'Oplysninger om siden',
+'pageinfo-redirectsto' => 'Omdirigerer til',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Talt som en indholdsside',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Kaskadebeskyttelser begynder her',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Kaskadebeskyttelser begynder fra',
+'pageinfo-category-info' => 'Kategorioplysninger',
+'pageinfo-category-pages' => 'Antal sider',
+'pageinfo-category-subcats' => 'Antal underkategorier',
+'pageinfo-category-files' => 'Antal filer',
# Skin names
'skinname-standard' => 'Klassik',
@@ -2979,6 +3020,8 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
'markedaspatrollederror' => 'Markering som „kontrolleret“ ikke mulig.',
'markedaspatrollederrortext' => 'Du skal vælge en sideændring.',
'markedaspatrollederror-noautopatrol' => 'Du må ikke markere dine egne ændringer som kontrolleret.',
+'markedaspatrollednotify' => 'Denne ændring af $1 er blevet markeret som patruljeret.',
+'markedaspatrollederrornotify' => 'Markering som patruljeret mislykkedes.',
# Patrol log
'patrol-log-page' => 'Kontrollog',
@@ -3012,6 +3055,7 @@ Du kan beskadige dit system hvis du udfører den.",
'file-nohires' => 'Ingen højere opløsning fundet.',
'svg-long-desc' => 'SVG fil, basisstørrelse $1 × $2 punkters, størrelse: $3',
'svg-long-desc-animated' => 'Animeret SVG-fil, basisstørrelse $1 × $2 punkter, filstørrelse: $3',
+'svg-long-error' => 'Ugyldig SVG-fil: $1',
'show-big-image' => 'Version i større opløsning',
'show-big-image-preview' => 'Størrelse af denne forhåndsvisning: $1.',
'show-big-image-other' => '{{PLURAL:$2|Anden opløsning|Andre opløsninger}}: $1.',
@@ -3042,7 +3086,10 @@ Du kan beskadige dit system hvis du udfører den.",
'minutes' => '{{PLURAL: $1|$1 minut|$1 minutter}}',
'hours' => '{{PLURAL: $1|$1 time|$1 timer}}',
'days' => '{{PLURAL: $1|$1 dag|$1 dage}}',
+'months' => '{{PLURAL:$1|$1 måned|$1 måneder}}',
+'years' => '{{PLURAL:$1|$1 år}}',
'ago' => '$1 siden',
+'just-now' => 'lige nu',
# Bad image list
'bad_image_list' => 'Formatet er:
@@ -3530,6 +3577,7 @@ Denne bekræftelseskode vil udløbe den $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-tilkobling er deaktiveret]',
'scarytranscludefailed' => '[Hentning af skabelon for $1 mislykkedes]',
+'scarytranscludefailed-httpstatus' => '[Hentning af skabelon for $1 mislykkedes: HTTP $2]',
'scarytranscludetoolong' => "[URL'en er for lang]",
# Delete conflict
@@ -3641,6 +3689,7 @@ Du kan også [[Special:EditWatchlist|bruge standard editoren]].',
'version-license' => 'Licens',
'version-poweredby-credits' => "Denne wiki er drevet af '''[//www.mediawiki.org/ MediaWiki ]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'andre',
+'version-credits-summary' => 'Vi vil gerne anerkende følgende personer for deres bidrag til [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki er fri software; du kan redistribuere det og/eller ændre det under betingelserne i GNU General Public License som offentliggjort af Free Software Foundation; enten version 2 af licensen eller (efter eget valg) enhver senere version.
MediaWiki distribueres i håb om at det vil være nyttigt, men UDEN NOGEN GARANTI; uden selv de underforståede garantier SALGBARHED eller EGNETHED TIL ET BESTEMT FORMÅL. Se GNU General Public License for yderligere detaljer.
@@ -3754,17 +3803,17 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
'sqlite-no-fts' => '$1 uden fuld-tekst søgnings support',
# New logging system
-'logentry-delete-delete' => '$1 slettede siden $3',
-'logentry-delete-restore' => '$1 gendannede siden $3',
-'logentry-delete-event' => '$1 ændrede synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
-'logentry-delete-revision' => '$1 ændrede synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
-'logentry-delete-event-legacy' => '$1 ændrede synligheden af loghændelser for siden $3',
-'logentry-delete-revision-legacy' => '$1 ændrede synligheden af versioner af siden $3',
-'logentry-suppress-delete' => '$1 skjulte hændelser for siden $3',
-'logentry-suppress-event' => '$1 ændrede hemmeligt synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
-'logentry-suppress-revision' => '$1 ændrede hemmeligt synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
-'logentry-suppress-event-legacy' => '$1 ændrede hemmeligt synligheden af loghændelser for siden $3',
-'logentry-suppress-revision-legacy' => '$1 ændrede hemmeligt synligheden af versioner af siden $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|slettede}} siden $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|gendannede}} siden $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|ændrede}} synligheden af loghændelser for siden $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|ændrede}} synligheden af versioner af siden $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|skjulte}} hændelser for siden $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|ændrede}} hemmeligt synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|ændrede}} hemmeligt synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|ændrede}} hemmeligt synligheden af loghændelser for siden $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|ændrede}} hemmeligt synligheden af versioner af siden $3',
'revdelete-content-hid' => 'indhold skjult',
'revdelete-summary-hid' => 'redigeringsbeskrivelse skjult',
'revdelete-uname-hid' => 'brugernavnet er skjult',
@@ -3773,17 +3822,21 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
'revdelete-uname-unhid' => 'brugernavnet er ikke længere skjult',
'revdelete-restricted' => 'tilføjede begrænsninger for administratorer',
'revdelete-unrestricted' => 'fjernede begrænsninger for administratorer',
-'logentry-move-move' => '$1 flyttede siden $3 til $4',
-'logentry-move-move-noredirect' => '$1 flyttede siden $3 til $4 uden at efterlade en omdirigering',
-'logentry-move-move_redir' => '$1 flyttede siden $3 til $4 hen over en omdirigering',
-'logentry-move-move_redir-noredirect' => '$1 flyttede siden $3 til $4 hen over en omdirigering og uden at efterlade en omdirigering',
-'logentry-patrol-patrol' => '$1 markerede version $4 af siden $3 som patruljeret',
-'logentry-patrol-patrol-auto' => '$1 markerede automatisk version $4 af siden $3 som patruljeret',
-'logentry-newusers-newusers' => 'Brugerkontoen $1 blev oprettet',
-'logentry-newusers-create' => 'Brugerkontoen $1 blev oprettet',
-'logentry-newusers-create2' => 'Brugerkontoen $3 blev oprettet af $1',
-'logentry-newusers-autocreate' => 'Kontoen $1 blev automatisk oprettet',
-'newuserlog-byemail' => 'kodeord tilsendt pr. e-mail',
+'logentry-move-move' => '$1 {{GENDER:$2|flyttede}} siden $3 til $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|flyttede}} siden $3 til $4 uden at efterlade en omdirigering',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|flyttede}} siden $3 til $4 hen over en omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|flyttede}} siden $3 til $4 hen over en omdirigering og uden at efterlade en omdirigering',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|markerede}} version $4 af siden $3 som patruljeret',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markerede automatisk}} version $4 af siden $3 som patruljeret',
+'logentry-newusers-newusers' => 'Brugerkontoen $1 blev {{GENDER:$2|oprettet}}',
+'logentry-newusers-create' => 'Brugerkontoen $1 blev {{GENDER:$2|oprettet}}',
+'logentry-newusers-create2' => 'Brugerkontoen $3 blev {{GENDER:$2|oprettet}} af $1',
+'logentry-newusers-byemail' => 'Brugerkontoen $3 blev {{GENDER:$2|oprettet}} af $1, og adgangskoden er sendt via e-mail',
+'logentry-newusers-autocreate' => 'Brugerkontoen $1 blev automatisk {{GENDER:$2|oprettet}}',
+'logentry-rights-rights' => '$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for $3 fra $4 til $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for $3',
+'logentry-rights-autopromote' => '$1 blev automatisk {{GENDER:$2|forfremmet}} fra $4 til $5',
+'rightsnone' => '(-)',
# Feedback
'feedback-bugornote' => 'Hvis du er klar til at beskrive et teknisk problem i detaljer, bedes du [$1 rapportere en fejl].
@@ -3837,6 +3890,7 @@ Ellers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføj
'api-error-ok-but-empty' => 'Intern fejl: intet svar fra serveren.',
'api-error-overwrite' => 'Det er ikke tilladt at overskrive en eksisterende fil.',
'api-error-stashfailed' => 'Intern fejl: serveren kunne ikke gemme midlertidig fil.',
+'api-error-publishfailed' => 'Intern fejl: serveren kunne ikke udgive midlertidig fil.',
'api-error-timeout' => 'Serveren svarede ikke tilbage inden for den forventede tid.',
'api-error-unclassified' => 'En ukendt fejl opstod.',
'api-error-unknown-code' => 'Ukendt fejl: "$1"',
@@ -3857,4 +3911,7 @@ Ellers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføj
'duration-centuries' => '$1 {{PLURAL:$1|Ã¥rhundrede|Ã¥rhundreder}}',
'duration-millennia' => '$1 {{PLURAL:$1|Ã¥rtusind|Ã¥rtusinder}}',
+# Image rotation
+'rotate-comment' => 'Billedet roteres med $1 {{PLURAL:$1| grad|grader}} med uret',
+
);
diff --git a/languages/messages/MessagesDe.php b/languages/messages/MessagesDe.php
index e31dd082..e58037b4 100644
--- a/languages/messages/MessagesDe.php
+++ b/languages/messages/MessagesDe.php
@@ -74,8 +74,6 @@
* @author ✓
*/
-$capitalizeAllNouns = true;
-
$namespaceNames = array(
NS_MEDIA => 'Medium',
NS_SPECIAL => 'Spezial',
@@ -99,22 +97,12 @@ $namespaceAliases = array(
'Bild' => NS_FILE,
'Bild_Diskussion' => NS_FILE_TALK,
);
+
$namespaceGenderAliases = array(
NS_USER => array( 'male' => 'Benutzer', 'female' => 'Benutzerin' ),
NS_USER_TALK => array( 'male' => 'Benutzer_Diskussion', 'female' => 'Benutzerin_Diskussion' ),
);
-$bookstoreList = array(
- 'abebooks.de' => 'http://www.abebooks.de/servlet/BookSearchPL?ph=2&isbn=$1',
- 'amazon.de' => 'http://www.amazon.de/gp/search/field-isbn=$1',
- 'buch.de' => 'http://www.buch.de/shop/home/suche/?sswg=BUCH&sq=$1',
- 'Karlsruher Virtueller Katalog (KVK)' => 'http://www.ubka.uni-karlsruhe.de/kvk.html?SB=$1',
- 'Lehmanns Fachbuchhandlung' => 'http://www.lob.de/cgi-bin/work/suche?flag=new&stich1=$1'
-);
-
-$separatorTransformTable = array( ',' => '.', '.' => ',' );
-$linkTrail = '/^([äöüßa-z]+)(.*)$/sDu';
-
$specialPageAliases = array(
'Activeusers' => array( 'Aktive_Benutzer' ),
'Allmessages' => array( 'MediaWiki-Systemnachrichten', 'Systemnachrichten' ),
@@ -186,7 +174,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Letzte_Änderungen' ),
'Recentchangeslinked' => array( 'Änderungen_an_verlinkten_Seiten' ),
'Revisiondelete' => array( 'Versionslöschung' ),
- 'RevisionMove' => array( 'Version_verschieben' ),
'Search' => array( 'Suche' ),
'Shortpages' => array( 'Kürzeste_Seiten' ),
'Specialpages' => array( 'Spezialseiten' ),
@@ -217,39 +204,6 @@ $specialPageAliases = array(
'Withoutinterwiki' => array( 'Fehlende_Interwikis' ),
);
-$datePreferences = array(
- 'default',
- 'dmyt',
- 'dmyts',
- 'dmy',
- 'ymd',
- 'ISO 8601'
-);
-
-$defaultDateFormat = 'dmy';
-
-$dateFormats = array(
- 'dmyt time' => 'H:i',
- 'dmyt date' => 'j. F Y',
- 'dmyt both' => 'j. M Y, H:i',
-
- 'dmyts time' => 'H:i:s',
- 'dmyts date' => 'j. F Y',
- 'dmyts both' => 'j. M Y, H:i:s',
-
- 'dmy time' => 'H:i',
- 'dmy date' => 'j. F Y',
- 'dmy both' => 'H:i, j. M Y',
-
- 'ymd time' => 'H:i',
- 'ymd date' => 'Y M j',
- 'ymd both' => 'H:i, Y M j',
-
- 'ISO 8601 time' => 'xnH:xni:xns',
- 'ISO 8601 date' => 'xnY-xnm-xnd',
- 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns'
-);
-
$magicWords = array(
'redirect' => array( '0', '#WEITERLEITUNG', '#REDIRECT' ),
'notoc' => array( '0', '__KEIN_INHALTSVERZEICHNIS__', '__KEININHALTSVERZEICHNIS__', '__NOTOC__' ),
@@ -257,14 +211,13 @@ $magicWords = array(
'forcetoc' => array( '0', '__INHALTSVERZEICHNIS_ERZWINGEN__', '__FORCETOC__' ),
'toc' => array( '0', '__INHALTSVERZEICHNIS__', '__TOC__' ),
'noeditsection' => array( '0', '__ABSCHNITTE_NICHT_BEARBEITEN__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__KEINKOPF__', '__KEIN_HEADER__', '__KEIN_KOPF__', '__KEINHEADER__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'JETZIGER_MONAT', 'JETZIGER_MONAT_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'JETZIGER_MONAT_1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'JETZIGER_MONATSNAME', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'JETZIGER_MONATSNAME_GENITIV', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthnamegen' => array( '1', 'JETZIGER_MONATSNAME_GENITIV', 'JETZIGER_MONATSNAME_GEN', 'CURRENTMONTHNAMEGEN' ),
'currentmonthabbrev' => array( '1', 'JETZIGER_MONATSNAME_KURZ', 'CURRENTMONTHABBREV' ),
- 'currentday' => array( '1', 'JETZIGER_KALENDERTAG', 'CURRENTDAY' ),
- 'currentday2' => array( '1', 'JETZIGER_KALENDERTAG_2', 'CURRENTDAY2' ),
+ 'currentday' => array( '1', 'JETZIGER_KALENDERTAG', 'JETZIGER_TAG', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'JETZIGER_KALENDERTAG_2', 'JETZIGER_TAG_2', 'CURRENTDAY2' ),
'currentdayname' => array( '1', 'JETZIGER_WOCHENTAG', 'CURRENTDAYNAME' ),
'currentyear' => array( '1', 'JETZIGES_JAHR', 'CURRENTYEAR' ),
'currenttime' => array( '1', 'JETZIGE_UHRZEIT', 'CURRENTTIME' ),
@@ -272,10 +225,10 @@ $magicWords = array(
'localmonth' => array( '1', 'LOKALER_MONAT', 'LOKALER_MONAT_2', 'LOCALMONTH', 'LOCALMONTH2' ),
'localmonth1' => array( '1', 'LOKALER_MONAT_1', 'LOCALMONTH1' ),
'localmonthname' => array( '1', 'LOKALER_MONATSNAME', 'LOCALMONTHNAME' ),
- 'localmonthnamegen' => array( '1', 'LOKALER_MONATSNAME_GENITIV', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthnamegen' => array( '1', 'LOKALER_MONATSNAME_GENITIV', 'LOKALER_MONATSNAME_GEN', 'LOCALMONTHNAMEGEN' ),
'localmonthabbrev' => array( '1', 'LOKALER_MONATSNAME_KURZ', 'LOCALMONTHABBREV' ),
- 'localday' => array( '1', 'LOKALER_KALENDERTAG', 'LOCALDAY' ),
- 'localday2' => array( '1', 'LOKALER_KALENDERTAG_2', 'LOCALDAY2' ),
+ 'localday' => array( '1', 'LOKALER_KALENDERTAG', 'LOKALER_TAG', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'LOKALER_KALENDERTAG_2', 'LOKALER_TAG_2', 'LOCALDAY2' ),
'localdayname' => array( '1', 'LOKALER_WOCHENTAG', 'LOCALDAYNAME' ),
'localyear' => array( '1', 'LOKALES_JAHR', 'LOCALYEAR' ),
'localtime' => array( '1', 'LOKALE_UHRZEIT', 'LOCALTIME' ),
@@ -304,8 +257,8 @@ $magicWords = array(
'basepagenamee' => array( '1', 'OBERSEITE_URL', 'BASEPAGENAMEE' ),
'talkpagename' => array( '1', 'DISKUSSIONSSEITE', 'DISK', 'TALKPAGENAME' ),
'talkpagenamee' => array( '1', 'DISKUSSIONSSEITE_URL', 'DISK_URL', 'TALKPAGENAMEE' ),
- 'subjectpagename' => array( '1', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
- 'subjectpagenamee' => array( '1', 'HAUPTSEITE_URL', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'subjectpagename' => array( '1', 'HAUPTSEITENNAME', 'VORDERSEITE', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( '1', 'HAUPTSEITENNAME_URL', 'VORDERSEITE_URL', 'HAUPTSEITE_URL', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
'subst' => array( '0', 'ERS:', 'SUBST:' ),
'safesubst' => array( '0', 'SICHER_ERS:', 'SICHERERS:', 'SAFESUBST:' ),
'img_thumbnail' => array( '1', 'miniatur', 'mini', 'thumbnail', 'thumb' ),
@@ -317,7 +270,7 @@ $magicWords = array(
'img_framed' => array( '1', 'gerahmt', 'framed', 'enframed', 'frame' ),
'img_frameless' => array( '1', 'rahmenlos', 'frameless' ),
'img_page' => array( '1', 'seite=$1', 'seite_$1', 'page=$1', 'page $1' ),
- 'img_upright' => array( '1', 'hochkant', 'hochkant=$1', 'hochkant $1', 'upright', 'upright=$1', 'upright $1' ),
+ 'img_upright' => array( '1', 'hochkant', 'hochkant=$1', 'hochkant_$1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'rand', 'border' ),
'img_baseline' => array( '1', 'grundlinie', 'baseline' ),
'img_sub' => array( '1', 'tiefgestellt', 'tief', 'sub' ),
@@ -329,6 +282,7 @@ $magicWords = array(
'img_text_bottom' => array( '1', 'text-unten', 'text-bottom' ),
'img_link' => array( '1', 'verweis=$1', 'link=$1' ),
'img_alt' => array( '1', 'alternativtext=$1', 'alt=$1' ),
+ 'img_class' => array( '1', 'klasse=$1', 'class=$1' ),
'int' => array( '0', 'NACHRICHT:', 'INT:' ),
'sitename' => array( '1', 'PROJEKTNAME', 'SITENAME' ),
'ns' => array( '0', 'NR:', 'NS:' ),
@@ -343,18 +297,18 @@ $magicWords = array(
'gender' => array( '0', 'GESCHLECHT:', 'GENDER:' ),
'notitleconvert' => array( '0', '__KEINE_TITELKONVERTIERUNG__', '__NOTITLECONVERT__', '__NOTC__' ),
'nocontentconvert' => array( '0', '__KEINE_INHALTSKONVERTIERUNG__', '__NOCONTENTCONVERT__', '__NOCC__' ),
- 'currentweek' => array( '1', 'JETZIGE_KALENDERWOCHE', 'CURRENTWEEK' ),
+ 'currentweek' => array( '1', 'JETZIGE_KALENDERWOCHE', 'JETZIGE_WOCHE', 'CURRENTWEEK' ),
'currentdow' => array( '1', 'JETZIGER_WOCHENTAG_ZAHL', 'CURRENTDOW' ),
- 'localweek' => array( '1', 'LOKALE_KALENDERWOCHE', 'LOCALWEEK' ),
+ 'localweek' => array( '1', 'LOKALE_KALENDERWOCHE', 'LOKALE_WOCHE', 'LOCALWEEK' ),
'localdow' => array( '1', 'LOKALER_WOCHENTAG_ZAHL', 'LOCALDOW' ),
- 'revisionid' => array( '1', 'REVISIONSID', 'REVISIONID' ),
- 'revisionday' => array( '1', 'REVISIONSTAG', 'REVISIONDAY' ),
- 'revisionday2' => array( '1', 'REVISIONSTAG2', 'REVISIONDAY2' ),
- 'revisionmonth' => array( '1', 'REVISIONSMONAT', 'REVISIONMONTH' ),
- 'revisionmonth1' => array( '1', 'REVISIONSMONAT1', 'REVISIONMONTH1' ),
- 'revisionyear' => array( '1', 'REVISIONSJAHR', 'REVISIONYEAR' ),
- 'revisiontimestamp' => array( '1', 'REVISIONSZEITSTEMPEL', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'REVISIONSBENUTZER', 'REVISIONUSER' ),
+ 'revisionid' => array( '1', 'REVISIONSID', 'VERSIONSID', 'REVISIONID' ),
+ 'revisionday' => array( '1', 'REVISIONSTAG', 'VERSIONSTAG', 'REVISIONDAY' ),
+ 'revisionday2' => array( '1', 'REVISIONSTAG2', 'VERSIONSTAG2', 'REVISIONDAY2' ),
+ 'revisionmonth' => array( '1', 'REVISIONSMONAT', 'VERSIONSMONAT', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'REVISIONSMONAT1', 'VERSIONSMONAT1', 'REVISIONMONTH1' ),
+ 'revisionyear' => array( '1', 'REVISIONSJAHR', 'VERSIONSJAHR', 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( '1', 'REVISIONSZEITSTEMPEL', 'VERSIONSZEITSTEMPEL', 'REVISIONTIMESTAMP' ),
+ 'revisionuser' => array( '1', 'REVISIONSBENUTZER', 'VERSIONSBENUTZER', 'REVISIONUSER' ),
'fullurl' => array( '0', 'VOLLSTÄNDIGE_URL:', 'FULLURL:' ),
'fullurle' => array( '0', 'VOLLSTÄNDIGE_URL_C:', 'FULLURLE:' ),
'canonicalurl' => array( '0', 'KANONISCHE_URL:', 'CANONICALURL:' ),
@@ -386,10 +340,10 @@ $magicWords = array(
'filepath' => array( '0', 'DATEIPFAD:', 'FILEPATH:' ),
'tag' => array( '0', 'erweiterung', 'tag' ),
'hiddencat' => array( '1', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
- 'pagesincategory' => array( '1', 'SEITEN_IN_KATEGORIE', 'SEITEN_KAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesincategory' => array( '1', 'SEITEN_IN_KATEGORIE', 'SEITEN_KAT', 'SEITENINKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
'pagesize' => array( '1', 'SEITENGRÖSSE', 'PAGESIZE' ),
- 'index' => array( '1', '__INDIZIEREN__', '__INDEX__' ),
- 'noindex' => array( '1', '__NICHT_INDIZIEREN__', '__NOINDEX__' ),
+ 'index' => array( '1', '__INDEXIEREN__', '__INDIZIEREN__', '__INDEX__' ),
+ 'noindex' => array( '1', '__NICHT_INDEXIEREN__', '__KEIN_INDEX__', '__NICHT_INDIZIEREN__', '__NOINDEX__' ),
'numberingroup' => array( '1', 'BENUTZER_IN_GRUPPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
'staticredirect' => array( '1', '__PERMANENTE_WEITERLEITUNG__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'SCHUTZSTATUS', 'PROTECTIONLEVEL' ),
@@ -398,8 +352,57 @@ $magicWords = array(
'url_query' => array( '0', 'ABFRAGE', 'QUERY' ),
'defaultsort_noerror' => array( '0', 'keinfehler', 'noerror' ),
'defaultsort_noreplace' => array( '0', 'keineersetzung', 'noreplace' ),
+ 'pagesincategory_all' => array( '0', 'alle', 'all' ),
+ 'pagesincategory_pages' => array( '0', 'seiten', 'pages' ),
+ 'pagesincategory_subcats' => array( '0', 'unterkategorien', 'unterkats', 'subcats' ),
+ 'pagesincategory_files' => array( '0', 'dateien', 'files' ),
+);
+
+$datePreferences = array(
+ 'default',
+ 'dmyt',
+ 'dmyts',
+ 'dmy',
+ 'ymd',
+ 'ISO 8601'
);
+$defaultDateFormat = 'dmy';
+
+$dateFormats = array(
+ 'dmyt time' => 'H:i',
+ 'dmyt date' => 'j. F Y',
+ 'dmyt both' => 'j. M Y, H:i',
+
+ 'dmyts time' => 'H:i:s',
+ 'dmyts date' => 'j. F Y',
+ 'dmyts both' => 'j. M Y, H:i:s',
+
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j. F Y',
+ 'dmy both' => 'H:i, j. M Y',
+
+ 'ymd time' => 'H:i',
+ 'ymd date' => 'Y M j',
+ 'ymd both' => 'H:i, Y M j',
+
+ 'ISO 8601 time' => 'xnH:xni:xns',
+ 'ISO 8601 date' => 'xnY-xnm-xnd',
+ 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns'
+);
+
+$capitalizeAllNouns = true;
+$bookstoreList = array(
+ 'abebooks.de' => 'http://www.abebooks.de/servlet/BookSearchPL?ph=2&isbn=$1',
+ 'amazon.de' => 'http://www.amazon.de/gp/search/field-isbn=$1',
+ 'buch.de' => 'http://www.buch.de/shop/home/suche/?sswg=BUCH&sq=$1',
+ 'Karlsruher Virtueller Katalog (KVK)' => 'http://www.ubka.uni-karlsruhe.de/kvk.html?SB=$1',
+ 'Lehmanns Fachbuchhandlung' => 'http://www.lob.de/cgi-bin/work/suche?flag=new&stich1=$1'
+);
+
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
+$linkTrail = '/^([äöüßa-z]+)(.*)$/sDu';
+
$imageFiles = array(
'button-bold' => 'de/button_bold.png',
'button-italic' => 'de/button_italic.png',
@@ -540,6 +543,7 @@ $messages = array(
'newwindow' => '(wird in einem neuen Fenster geöffnet)',
'cancel' => 'Abbrechen',
'moredotdotdot' => 'Mehr …',
+'morenotlisted' => 'Weitere, nicht aufgeführte …',
'mypage' => 'Eigene Seite',
'mytalk' => 'Diskussion',
'anontalk' => 'Diskussionsseite dieser IP',
@@ -551,7 +555,6 @@ $messages = array(
'qbbrowse' => 'Durchsuchen',
'qbedit' => 'Bearbeiten',
'qbpageoptions' => 'Seitenoptionen',
-'qbpageinfo' => 'Kontext',
'qbmyoptions' => 'Meine Seiten',
'qbspecialpages' => 'Spezialseiten',
'faq' => 'Häufig gestellte Fragen',
@@ -574,6 +577,7 @@ $messages = array(
'namespaces' => 'Namensräume',
'variants' => 'Varianten',
+'navigation-heading' => 'Navigationsmenü',
'errorpagetitle' => 'Fehler',
'returnto' => 'Zurück zur Seite $1.',
'tagline' => 'Aus {{SITENAME}}',
@@ -815,12 +819,11 @@ Der Administrator, der den Schreibzugriff sperrte, gab folgenden Grund an: „$3
# Login and logout pages
'logouttext' => "'''Du bist nun abgemeldet.'''
-Du kannst {{SITENAME}} jetzt anonym weiternutzen oder dich erneut unter dem selben oder einem anderen Benutzernamen [[Special:UserLogin|anmelden]].
+Du kannst {{SITENAME}} jetzt anonym weiternutzen oder dich erneut unter dem selben oder einem anderen Benutzernamen <span class='plainlinks'>[$1 anmelden]</span>.
Beachte, dass einige Seiten noch anzeigen können, dass du angemeldet bist, solange du nicht deinen Browsercache geleert hast.",
-'welcomecreation' => '== Willkommen, $1! ==
-
-Dein Benutzerkonto wurde soeben eingerichtet.
-Vergiss nicht, deine [[Special:Preferences|Einstellungen]] für dieses Wiki anzupassen.',
+'welcomeuser' => 'Willkommen, $1!',
+'welcomecreation-msg' => 'Dein Benutzerkonto wurde erstellt.
+Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ändern.',
'yourname' => 'Benutzername:',
'yourpassword' => 'Passwort:',
'yourpasswordagain' => 'Passwort wiederholen:',
@@ -843,7 +846,7 @@ Vergiss nicht, deine [[Special:Preferences|Einstellungen]] für dieses Wiki anzu
'gotaccount' => "Du hast bereits ein Benutzerkonto? '''$1'''.",
'gotaccountlink' => 'Anmelden',
'userlogin-resetlink' => 'Die Anmeldedaten vergessen?',
-'createaccountmail' => 'Per E-Mail',
+'createaccountmail' => 'Ein temporäres Zufallspasswort verwenden und an die unten angegebene E-Mail-Adresse versenden',
'createaccountreason' => 'Grund:',
'badretype' => 'Die beiden Passwörter stimmen nicht überein.',
'userexists' => 'Dieser Benutzername ist schon vergeben.
@@ -913,6 +916,7 @@ Bitte warte, bevor du es erneut probierst.',
# Email sending
'php-mail-error-unknown' => 'Unbekannter Fehler mit der Funktion mail() von PHP',
'user-mail-no-addy' => 'Versuchte, eine E-Mail ohne Angabe einer E-Mail-Adresse zu versenden.',
+'user-mail-no-body' => 'Es wurde versucht, eine E-Mail mit einem leeren oder zu kurzen Textkörper zu versenden.',
# Change password dialog
'resetpass' => 'Passwort ändern',
@@ -964,7 +968,7 @@ $2
Temporäres Passwort: $2',
'passwordreset-emailsent' => 'Eine Passwortzurücksetzungs-E-Mail wurde versandt.',
'passwordreset-emailsent-capture' => 'Eine Passwortzurücksetzungs-E-Mail wurde versandt, die unten angezeigt wird.',
-'passwordreset-emailerror-capture' => 'Die unten angezeigte Erinnerungs-E-Mail wurde generiert, allerdings ist der Versand an den Benutzer gescheitert: $1',
+'passwordreset-emailerror-capture' => 'Die unten angezeigte Passwortzurücksetzungs-E-Mail wurde generiert, allerdings ist der Versand an den Benutzer gescheitert: $1',
# Special:ChangeEmail
'changeemail' => 'E-Mail-Adresse ändern',
@@ -974,6 +978,7 @@ Temporäres Passwort: $2',
'changeemail-oldemail' => 'Aktuelle E-Mail-Adresse:',
'changeemail-newemail' => 'Neue E-Mail-Adresse:',
'changeemail-none' => '(keine)',
+'changeemail-password' => 'Dein {{SITENAME}}-Passwort:',
'changeemail-submit' => 'E-Mail-Adresse ändern',
'changeemail-cancel' => 'Abbrechen',
@@ -1152,7 +1157,6 @@ Zur Information folgt der aktuelle Logbucheintrag:",
'template-semiprotected' => '(schreibgeschützt für unangemeldete und neue Benutzer)',
'hiddencategories' => 'Diese Seite ist Mitglied von {{PLURAL:$1|1 versteckter Kategorie|$1 versteckten Kategorien}}:',
'edittools' => '<!-- Dieser Text wird unter dem „Bearbeiten“-Formular sowie dem „Hochladen“-Formular angezeigt. -->',
-'nocreatetitle' => 'Die Erstellung neuer Seiten ist eingeschränkt.',
'nocreatetext' => 'Auf {{SITENAME}} wurde das Erstellen neuer Seiten eingeschränkt. Du kannst bestehende Seiten ändern oder dich [[Special:UserLogin|anmelden]].',
'nocreate-loggedin' => 'Du hast nicht die erforderliche Berechtigung, um neue Seiten erstellen zu können.',
'sectioneditnotsupported-title' => 'Die Bearbeitung von Abschnitten wird nicht unterstützt',
@@ -1174,6 +1178,15 @@ Sie wurde anscheinend gelöscht.',
'edit-no-change' => 'Deine Bearbeitung wurde ignoriert, da keine Änderung an dem Text vorgenommen wurde.',
'edit-already-exists' => 'Die neue Seite konnte nicht erstellt werden, da sie bereits vorhanden ist.',
'defaultmessagetext' => 'Standardtext',
+'content-failed-to-parse' => 'Parsen des Inhalts $2 für Modell $1 fehlgeschlagen: $3',
+'invalid-content-data' => 'Ungültige Inhaltsdaten',
+'content-not-allowed-here' => 'Der Inhalt „$1“ ist auf der Seite [[$2]] nicht erlaubt',
+
+# Content models
+'content-model-wikitext' => 'Wikitext',
+'content-model-text' => 'Klartext',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Achtung''': Diese Seite enthält zu viele Aufrufe aufwändiger Parserfunktionen.
@@ -1534,9 +1547,9 @@ Dies kann nicht mehr rückgängig gemacht werden.',
'prefs-emailconfirm-label' => 'E-Mail-Bestätigung:',
'prefs-textboxsize' => 'Größe des Bearbeitungsfensters',
'youremail' => 'E-Mail-Adresse:',
-'username' => 'Benutzername:',
-'uid' => 'Benutzerkennung:',
-'prefs-memberingroups' => 'Mitglied der {{PLURAL:$1|Gruppe|Gruppen}}:',
+'username' => '{{GENDER:$1|Benutzername}}:',
+'uid' => '{{GENDER:$1|Benutzerkennung}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Mitglied}} der {{PLURAL:$1|Benutzergruppe|Benutzergruppen}}:',
'prefs-memberingroups-type' => '$2',
'prefs-registration' => 'Anmeldezeitpunkt:',
'prefs-registration-date-time' => '$2, $3 Uhr',
@@ -1587,6 +1600,7 @@ Dies kann nicht mehr rückgängig gemacht werden.',
'saveusergroups' => 'Gruppenzugehörigkeit ändern',
'userrights-groupsmember' => 'Mitglied von:',
'userrights-groupsmember-auto' => 'Automatisch Mitglied von:',
+'userrights-groupsmember-type' => '$2',
'userrights-groups-help' => 'Du kannst die Gruppenzugehörigkeit {{GENDER:$1|dieses Benutzers|dieser Benutzerin}} ändern:
* Ein markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} Mitglied dieser Gruppe ist.
* Ein nichtmarkiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} nicht Mitglied dieser Gruppe ist.
@@ -1685,12 +1699,13 @@ Dies kann nicht mehr rückgängig gemacht werden.',
'right-sendemail' => 'E-Mails an andere Benutzer senden',
'right-passwordreset' => 'Passwort eines Benutzers zurücksetzen und die dazu verschickte E-Mail einsehen',
+# Special:Log/newusers
+'newuserlogpage' => 'Neuanmeldungs-Logbuch',
+'newuserlogpagetext' => 'Dies ist ein Logbuch der neu erstellten Benutzerkonten.',
+
# User rights log
'rightslog' => 'Rechte-Logbuch',
'rightslogtext' => 'Dies ist das Logbuch der Änderungen der Benutzerrechte.',
-'rightslogentry' => 'änderte die Benutzerrechte für „$1“ von „$2“ zu „$3“',
-'rightslogentry-autopromote' => 'wurde automatisch von „$2“ zu „$3“ zugeordnet',
-'rightsnone' => '(–)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'die Seite zu lesen',
@@ -1931,6 +1946,7 @@ Wenn das Problem weiter besteht, informiere einen [[Special:ListUsers/sysop|Syst
'backend-fail-notsame' => 'Es ist bereits eine Datei $1 vorhanden, die nicht identisch ist.',
'backend-fail-invalidpath' => '$1 ist kein gültiger Pfad zum Speichern.',
'backend-fail-delete' => 'Die Datei $1 konnte nicht gelöscht werden.',
+'backend-fail-describe' => 'Die Metadaten für die Datei „$1“ konnten nicht geändert werden.',
'backend-fail-alreadyexists' => 'Die Seite $1 ist bereits vorhanden',
'backend-fail-store' => 'Die Datei $1 konnte nicht unter $2 gespeichert werden.',
'backend-fail-copy' => 'Die Datei $1 konnte nicht nach $2 kopiert werden.',
@@ -2163,6 +2179,12 @@ Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungs
Eine Seite gilt als Begriffsklärungsseite, wenn sie mindestens eine der auf der Seite [[MediaWiki:Disambiguationspage|Disambiguationspage]] aufgeführten Vorlagen enthält.",
+'pageswithprop' => 'Seiten mit einer Seiteneigenschaft',
+'pageswithprop-legend' => 'Seiten mit einer Seiteneigenschaft',
+'pageswithprop-text' => 'Diese Spezialseite listet Seiten auf, die eine bestimmte Seiteneigenschaft verwenden.',
+'pageswithprop-prop' => 'Eigenschaftsname:',
+'pageswithprop-submit' => 'Los',
+
'doubleredirects' => 'Doppelte Weiterleitungen',
'doubleredirectstext' => 'Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.
Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel der zweiten Weiterleitung, welches für gewöhnlich die gewünschte Zielseite ist, auf die bereits die erste Weiterleitung zeigen sollte.
@@ -2313,9 +2335,7 @@ Siehe auch die Liste der [[Special:WantedCategories|gewünschten Kategorien]].',
'linksearch-pat' => 'Suchmuster:',
'linksearch-ns' => 'Namensraum:',
'linksearch-ok' => 'Suchen',
-'linksearch-text' => 'Es können Wildcards wie „*.wikipedia.org“ verwendet werden.
-Es muss mindestens eine Top-Level-Domain wie „*.org“ angegeben werden.<br />
-Unterstützte Protokolle: <code>$1</code> (falls kein Protokoll angegeben ist, wird standardmäßig http:// verwendet).',
+'linksearch-text' => 'Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter wie beispielsweise <code>*.beispiel.de</code> benutzt werden. Es muss mindestens eine Top-Level-Domain, z. B. „*.org“. angegeben werden. <br />{{PLURAL:$2|Unterstütztes Protokoll|Unterstützte Protokolle}}: <code>$1</code> (Standard ist http, falls kein Protokoll angegeben ist.)',
'linksearch-line' => '$1 ist verlinkt von $2',
'linksearch-error' => 'Wildcards können nur am Anfang der URL verwendet werden.',
@@ -2334,10 +2354,6 @@ Unterstützte Protokolle: <code>$1</code> (falls kein Protokoll angegeben ist, w
'activeusers-hidesysops' => 'Administratoren ausblenden',
'activeusers-noresult' => 'Keine Benutzer gefunden.',
-# Special:Log/newusers
-'newuserlogpage' => 'Neuanmeldungs-Logbuch',
-'newuserlogpagetext' => 'Dies ist ein Logbuch der neu erstellten Benutzerkonten.',
-
# Special:ListGroupRights
'listgrouprights' => 'Benutzergruppenrechte',
'listgrouprights-summary' => 'Dies ist eine Liste der in diesem Wiki definierten Benutzergruppen und der damit verbundenen Rechte.
@@ -2433,21 +2449,23 @@ Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werde
'enotif_mailer' => '{{SITENAME}}-E-Mail-Benachrichtigungsdienst',
'enotif_reset' => 'Alle Seiten als besucht markieren',
-'enotif_newpagetext' => 'Das ist eine neue Seite.',
'enotif_impersonal_salutation' => '{{SITENAME}}-Benutzer',
-'changed' => 'geändert',
-'created' => 'erstellt',
-'enotif_subject' => '[{{SITENAME}}] Die Seite „$PAGETITLE“ wurde von $PAGEEDITOR $CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}}-Seite $1 wurde von {{GENDER:$2|$2}} gelöscht',
+'enotif_subject_created' => '{{SITENAME}}-Seite $1 wurde von {{GENDER:$2|$2}} erstellt',
+'enotif_subject_moved' => '{{SITENAME}}-Seite $1 wurde von {{GENDER:$2|$2}} verschoben',
+'enotif_subject_restored' => '{{SITENAME}}-Seite $1 wurde von {{GENDER:$2|$2}} wiederhergestellt',
+'enotif_subject_changed' => '{{SITENAME}}-Seite $1 wurde von {{GENDER:$2|$2}} geändert',
+'enotif_body_intro_deleted' => 'Die {{SITENAME}}-Seite $1 wurde am $PAGEEDITDATE von {{GENDER:$2|$2}} gelöscht. Siehe $3.',
+'enotif_body_intro_created' => 'Die {{SITENAME}}-Seite $1 wurde am $PAGEEDITDATE von {{GENDER:$2|$2}} erstellt. Siehe $3 für deren aktuelle Version.',
+'enotif_body_intro_moved' => 'Die {{SITENAME}}-Seite $1 wurde am $PAGEEDITDATE von {{GENDER:$2|$2}} verschoben. Siehe $3 für deren aktuelle Version.',
+'enotif_body_intro_restored' => 'Die {{SITENAME}}-Seite $1 wurde am $PAGEEDITDATE von {{GENDER:$2|$2}} wiederhergestellt. Siehe $3 für deren aktuelle Version.',
+'enotif_body_intro_changed' => 'Die {{SITENAME}}-Seite $1 wurde am $PAGEEDITDATE von {{GENDER:$2|$2}} geändert. Siehe $3 für deren aktuelle Version.',
'enotif_lastvisited' => 'Alle Änderungen auf einen Blick: $1',
'enotif_lastdiff' => 'Siehe $1 nach dieser Änderung.',
'enotif_anon_editor' => 'Anonymer Benutzer $1',
'enotif_body' => 'Hallo $WATCHINGUSERNAME,
-die {{SITENAME}}-Seite „$PAGETITLE“ wurde von $PAGEEDITOR am $PAGEEDITDATE um $PAGEEDITTIME Uhr $CHANGEDORCREATED.
-
-Aktuelle Version: $PAGETITLE_URL
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Zusammenfassung des Bearbeiters: $PAGESUMMARY $PAGEMINOREDIT
@@ -2467,6 +2485,8 @@ Um die Einstellungen deiner Beobachtungsliste anzupassen, besuche {{canonicalurl
Um die Seite von deiner Beobachtungsliste herunterzunehmen, besuche $UNWATCHURL.
Rückmeldungen und weitere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'erstellt',
+'changed' => 'geändert',
# Delete
'deletepage' => 'Seite löschen',
@@ -2532,6 +2552,8 @@ Siehe die [[Special:ProtectedPages|Liste der geschützten Seiten]] für alle akt
'prot_1movedto2' => 'hat „[[$1]]“ nach „[[$2]]“ verschoben',
'protect-badnamespace-title' => 'Nicht-schützbarer Namensraum',
'protect-badnamespace-text' => 'Seiten dieses Namensraums können nicht geschützt werden.',
+'protect-norestrictiontypes-text' => 'Diese Seite kann nicht geschützt werden, da keine Beschränkungstypen verfügbar sind.',
+'protect-norestrictiontypes-title' => 'Nicht schützbare Seite',
'protect-legend' => 'Seitenschutzstatus ändern',
'protectcomment' => 'Grund:',
'protectexpiry' => 'Sperrdauer:',
@@ -2612,7 +2634,8 @@ Der aktuelle Text der gelöschten Seite ist nur Administratoren zugänglich.',
'undeletedrevisions' => '{{PLURAL:$1|1 Version wurde|$1 Versionen wurden}} wiederhergestellt',
'undeletedrevisions-files' => '{{PLURAL:$1|1 Version|$1 Versionen}} und {{PLURAL:$2|1 Datei|$2 Dateien}} wurden wiederhergestellt',
'undeletedfiles' => '{{PLURAL:$1|1 Datei wurde|$1 Dateien wurden}} wiederhergestellt',
-'cannotundelete' => 'Wiederherstellung fehlgeschlagen; jemand anderes hat die Seite bereits wiederhergestellt.',
+'cannotundelete' => 'Die Wiederherstellung ist fehlgeschlagen:
+$1',
'undeletedpage' => "'''„$1“''' wurde wiederhergestellt.
Im [[Special:Log/delete|Lösch-Logbuch]] findest du eine Übersicht der gelöschten und wiederhergestellten Seiten.",
@@ -2643,7 +2666,7 @@ $1',
'blanknamespace' => '(Seiten)',
# Contributions
-'contributions' => 'Benutzerbeiträge',
+'contributions' => '{{GENDER:$1|Benutzerbeiträge}}',
'contributions-title' => 'Benutzerbeiträge von „$1“',
'mycontris' => 'Beiträge',
'contribsub2' => 'Von $1 ($2)',
@@ -2910,6 +2933,7 @@ Eine Seite kann nicht auf sich selbst verschoben werden.',
'immobile-target-namespace-iw' => 'Interwiki-Link ist kein gültiges Ziel für Seitenverschiebungen.',
'immobile-source-page' => 'Diese Seite ist nicht verschiebbar.',
'immobile-target-page' => 'Es kann nicht auf diese Zielseite verschoben werden.',
+'bad-target-model' => 'Die gewünschte Zielseite verwendet ein abweichendes Inhaltsmodell. Das Inhaltsmodell $1 kann nicht in das Inhaltsmodell $2 umgewandelt werden.',
'imagenocrossnamespace' => 'Dateien können nicht aus dem {{ns:file}}-Namensraum heraus verschoben werden',
'nonfile-cannot-move-to-file' => 'Nichtdateien können nicht in den {{ns:file}}-Namensraum hinein verschoben werden',
'imagetypemismatch' => 'Die neue Dateierweiterung ist nicht mit der alten identisch',
@@ -3022,6 +3046,7 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
'import-error-interwiki' => 'Die Seite „$1“ wurde nicht importiert, da deren Name für externe Links (Interwiki) reserviert ist.',
'import-error-special' => 'Die Seite „$1“ wurde nicht importiert, da sie zu einem besonderen Namensraum gehört, in dem keine Seiten möglich sind.',
'import-error-invalid' => 'Seite „$1“ wurde nicht importiert, da deren Name ungültig ist.',
+'import-error-unserialize' => 'Die Version $2 der Seite „$1“ konnte nicht deserialisiert werden. Die Version wurde zur Verwendung des Inhaltsmodells $3 gemeldet, das als $4 serialisiert ist.',
'import-options-wrong' => 'Falsche {{PLURAL:$2|Option|Optionen}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Der angegebene Stammseitenname ist ungültig.',
'import-rootpage-nosubpage' => 'Im Namensraum „$1“ der Stammseite sind keine Unterseiten erlaubt.',
@@ -3036,7 +3061,6 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
# JavaScriptTest
'javascripttest' => 'JavaScript-Test',
-'javascripttest-disabled' => 'Diese Funktion wurde in diesem Wiki nicht aktiviert.',
'javascripttest-title' => '$1-Tests werden durchgeführt',
'javascripttest-pagetext-noframework' => 'Diese Seite ist JavaSkript-Tests vorbehalten.',
'javascripttest-pagetext-unknownframework' => 'Unbekanntes Framework „$1“.',
@@ -3185,11 +3209,13 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
'pageinfo-default-sort' => 'Standardsortierschlüssel',
'pageinfo-length' => 'Seitenlänge (in Bytes)',
'pageinfo-article-id' => 'Seitenkennnummer',
+'pageinfo-language' => 'Seiteninhaltssprache',
'pageinfo-robot-policy' => 'Suchmaschinenstatus',
'pageinfo-robot-index' => 'Indexierbar',
'pageinfo-robot-noindex' => 'Nicht indexierbar',
'pageinfo-views' => 'Anzahl der Seitenaufrufe',
'pageinfo-watchers' => 'Anzahl der Beobachter der Seite',
+'pageinfo-few-watchers' => 'Weniger als {{PLURAL:$1|ein|$1}} Beobachter',
'pageinfo-redirects-name' => 'Weiterleitungen zu dieser Seite',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'Unterseiten dieser Seite',
@@ -3205,6 +3231,19 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
'pageinfo-magic-words' => '{{PLURAL:$1|Magisches Wort|Magische Wörter}} ($1)',
'pageinfo-hidden-categories' => 'Versteckte {{PLURAL:$1|Kategorie|Kategorien}} ($1)',
'pageinfo-templates' => 'Eingebundene {{PLURAL:$1|Vorlage|Vorlagen}} ($1)',
+'pageinfo-transclusions' => 'Eingebunden in {{PLURAL:$1|1 Seite|$1 Seiten}}',
+'pageinfo-toolboxlink' => 'Seiteninformationen',
+'pageinfo-redirectsto' => 'Weiterleitungen nach',
+'pageinfo-redirectsto-info' => 'Information',
+'pageinfo-contentpage' => 'Gezählt als eine Inhaltsseite',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Seiten mit Kaskadenschutz von hier',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Seiten mit Kaskadenschutz von',
+'pageinfo-category-info' => 'Kategorieinformationen',
+'pageinfo-category-pages' => 'Anzahl der Seiten',
+'pageinfo-category-subcats' => 'Anzahl der Unterkategorien',
+'pageinfo-category-files' => 'Anzahl der Dateien',
# Skin names
'skinname-standard' => 'Klassik',
@@ -3227,6 +3266,8 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
'markedaspatrollederror' => 'Markierung als „kontrolliert“ nicht möglich.',
'markedaspatrollederrortext' => 'Du musst eine Seitenänderung auswählen.',
'markedaspatrollederror-noautopatrol' => 'Es ist nicht erlaubt, eigene Bearbeitungen als kontrolliert zu markieren.',
+'markedaspatrollednotify' => 'Diese Änderung an $1 wurde als kontrolliert markiert.',
+'markedaspatrollederrornotify' => 'Der Versuch, die Version als kontrolliert zu markieren, ist fehlgeschlagen.',
# Patrol log
'patrol-log-page' => 'Kontroll-Logbuch',
@@ -3260,6 +3301,7 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
'file-nohires' => 'Keine höhere Auflösung vorhanden.',
'svg-long-desc' => 'SVG-Datei, Basisgröße: $1 × $2 Pixel, Dateigröße: $3',
'svg-long-desc-animated' => 'Animierte SVG-Datei, Basisgröße $1 × $2 Pixel, Dateigröße: $3',
+'svg-long-error' => 'Ungültige SVG-Datei: $1',
'show-big-image' => 'Volle Auflösung',
'show-big-image-preview' => 'Größe dieser Vorschau: $1.',
'show-big-image-other' => 'Weitere {{PLURAL:$2|Auflösung|Auflösungen}}: $1.',
@@ -3289,7 +3331,10 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
'minutes' => '{{PLURAL:$1|$1 Minute|$1 Minuten}}',
'hours' => '{{PLURAL:$1|1 Stunde|$1 Stunden}}',
'days' => '{{PLURAL:$1|$1 Tag|$1 Tage}}',
+'months' => '{{PLURAL:$1|1 Monat|$1 Monate}}',
+'years' => '{{PLURAL:$1|1 Jahr|$1 Jahre}}',
'ago' => 'vor $1',
+'just-now' => 'Gerade eben',
# Bad image list
'bad_image_list' => 'Format:
@@ -3784,6 +3829,7 @@ Dieser Bestätigungscode ist gültig bis $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-Einbindung ist deaktiviert]',
'scarytranscludefailed' => '[Vorlageneinbindung für $1 ist gescheitert]',
+'scarytranscludefailed-httpstatus' => '[Vorlagenabruf fehlgeschlagen für $1: HTTP $2]',
'scarytranscludetoolong' => '[URL ist zu lang]',
# Delete conflict
@@ -3914,6 +3960,7 @@ Du kannst auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benutz
'version-license' => 'Lizenz',
'version-poweredby-credits' => "Diese Website nutzt '''[//www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
'version-poweredby-others' => 'andere',
+'version-credits-summary' => 'Wir danken folgenden Personen für ihre Beiträge zu [[Special:Version|MediaWiki]].',
'version-license-info' => "MediaWiki ist eine Freie Software, d. h. sie kann, gemäß den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.
Die Software MediaWiki wird in der Hoffnung verteilt, dass sie nützlich sein wird, allerdings OHNE JEGLICHE GARANTIE und sogar ohne die implizierte Garantie einer MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.
@@ -4029,17 +4076,17 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
'sqlite-no-fts' => 'Version $1 ohne Unterstützung für die Volltextsuche',
# New logging system
-'logentry-delete-delete' => '$1 löschte Seite $3',
-'logentry-delete-restore' => '$1 stellte Seite $3 wieder her',
-'logentry-delete-event' => '$1 änderte die Sichtbarkeit {{PLURAL:$5|eines Logbucheintrags|von $5 Logbucheinträgen}} auf $3: $4',
-'logentry-delete-revision' => '$1 änderte die Sichtbarkeit {{PLURAL:$5|einer Version|von $5 Versionen}} der Seite $3: $4',
-'logentry-delete-event-legacy' => '$1 änderte die Sichtbarkeit von Logbucheinträgen auf $3',
-'logentry-delete-revision-legacy' => '$1 änderte die Sichtbarkeit von Versionen der Seite $3',
-'logentry-suppress-delete' => '$1 unterdrückte Seite $3',
-'logentry-suppress-event' => '$1 änderte diskret die Sichtbarkeit {{PLURAL:$5|eines Logbucheintrags|von $5 Logbucheinträgen}} auf $3: $4',
-'logentry-suppress-revision' => '$1 änderte diskret die Sichtbarkeit {{PLURAL:$5|einer Version|von $5 Versionen}} der Seite $3: $4',
-'logentry-suppress-event-legacy' => '$1 änderte diskret die Sichtbarkeit von Logbucheinträgen auf $3',
-'logentry-suppress-revision-legacy' => '$1 änderte diskret die Sichtbarkeit von Versionen der Seite $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|löschte}} Seite $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|stellte}} Seite $3 wieder her',
+'logentry-delete-event' => '$1 {{GENDER:$2|änderte}} die Sichtbarkeit {{PLURAL:$5|eines Logbucheintrags|von $5 Logbucheinträgen}} auf $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|änderte}} die Sichtbarkeit {{PLURAL:$5|einer Version|von $5 Versionen}} der Seite $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|änderte}} die Sichtbarkeit von Logbucheinträgen auf $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|änderte}} die Sichtbarkeit von Versionen der Seite $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|unterdrückte}} Seite $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|änderte}} diskret die Sichtbarkeit {{PLURAL:$5|eines Logbucheintrags|von $5 Logbucheinträgen}} auf $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|änderte}} diskret die Sichtbarkeit {{PLURAL:$5|einer Version|von $5 Versionen}} der Seite $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|änderte}} diskret die Sichtbarkeit von Logbucheinträgen auf $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|änderte}} diskret die Sichtbarkeit von Versionen der Seite $3',
'revdelete-content-hid' => 'Inhalt versteckt',
'revdelete-summary-hid' => 'Zusammenfassung versteckt',
'revdelete-uname-hid' => 'Benutzername versteckt',
@@ -4048,17 +4095,21 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
'revdelete-uname-unhid' => 'Benutzername freigegeben',
'revdelete-restricted' => 'Einschränkungen gelten auch für Administratoren',
'revdelete-unrestricted' => 'Einschränkungen für Administratoren aufgehoben',
-'logentry-move-move' => '$1 verschob Seite $3 nach $4',
-'logentry-move-move-noredirect' => '$1 verschob Seite $3 nach $4, ohne dabei eine Weiterleitung anzulegen',
-'logentry-move-move_redir' => '$1 verschob Seite $3 nach $4 und überschrieb dabei eine Weiterleitung',
-'logentry-move-move_redir-noredirect' => '$1 verschob Seite $3 nach $4 und überschrieb dabei eine Weiterleitung ohne selbst eine Weiterleitung anzulegen',
-'logentry-patrol-patrol' => '$1 markierte Version $4 von Seite $3 als kontrolliert',
-'logentry-patrol-patrol-auto' => '$1 markierte automatisch Version $4 von Seite $3 als kontrolliert',
-'logentry-newusers-newusers' => 'Benutzerkonto $1 wurde erstellt',
-'logentry-newusers-create' => 'Benutzerkonto $1 wurde erstellt',
-'logentry-newusers-create2' => 'Benutzerkonto $3 wurde von $1 erstellt',
-'logentry-newusers-autocreate' => 'Benutzerkonto $1 wurde automatisch erstellt',
-'newuserlog-byemail' => 'das Passwort wurde per E-Mail versandt',
+'logentry-move-move' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4, ohne dabei eine Weiterleitung anzulegen',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4 und überschrieb dabei eine Weiterleitung',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4 und überschrieb dabei eine Weiterleitung ohne selbst eine Weiterleitung anzulegen',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|markierte}} Version $4 von Seite $3 als kontrolliert',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markierte}} automatisch Version $4 von Seite $3 als kontrolliert',
+'logentry-newusers-newusers' => 'Benutzerkonto $1 wurde {{GENDER:$2|erstellt}}',
+'logentry-newusers-create' => 'Benutzerkonto $1 wurde {{GENDER:$2|erstellt}}',
+'logentry-newusers-create2' => 'Benutzerkonto $3 wurde von $1 {{GENDER:$2|erstellt}}',
+'logentry-newusers-byemail' => 'Das Benutzerkonto $3 wurde von $1 {{GENDER:$2|erstellt}} und das Passwort wurde per E-Mail zugesandt',
+'logentry-newusers-autocreate' => 'Benutzerkonto $1 wurde automatisch {{GENDER:$2|erstellt}}',
+'logentry-rights-rights' => '$1 {{GENDER:$2|änderte}} die Gruppenzugehörigkeit für $3 von $4 zu $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|änderte}} die Gruppenzugehörigkeit für $3',
+'logentry-rights-autopromote' => '$1 wurde automatisch von $4 zu $5 {{GENDER:$2|zugeordnet}}',
+'rightsnone' => '(–)',
# Feedback
'feedback-bugornote' => 'Sofern du detailliert ein technisches Problem beschreiben möchtest, melde bitte [$1 einen Fehler].
@@ -4112,6 +4163,7 @@ Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kom
'api-error-ok-but-empty' => 'Interner Fehler: Der Server reagiert nicht.',
'api-error-overwrite' => 'Das Ãœberschreiben einer vorhandenen Datei ist nicht erlaubt.',
'api-error-stashfailed' => 'Interner Fehler: Der Server konnte keine temporäre Datei speichern.',
+'api-error-publishfailed' => 'Interner Fehler: Der Server konnte die temporäre Datei nicht veröffentlichen.',
'api-error-timeout' => 'Der Server hat nicht innerhalb der erwarteten Zeit reagiert.',
'api-error-unclassified' => 'Ein unbekannter Fehler ist aufgetreten.',
'api-error-unknown-code' => 'Unbekannter Fehler: „$1“',
@@ -4132,4 +4184,7 @@ Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kom
'duration-centuries' => '$1 {{PLURAL:$1|Jahrhundert|Jahrhunderte}}',
'duration-millennia' => '$1 {{PLURAL:$1|Jahrtausend|Jahrtausende}}',
+# Image rotation
+'rotate-comment' => 'Bild um $1 {{PLURAL:$1|Grad}} im Uhrzeigersinn gedreht',
+
);
diff --git a/languages/messages/MessagesDe_ch.php b/languages/messages/MessagesDe_ch.php
index d720af06..e293a784 100644
--- a/languages/messages/MessagesDe_ch.php
+++ b/languages/messages/MessagesDe_ch.php
@@ -106,6 +106,7 @@ Falls das Benutzerkonto irrtümlich angelegt wurde, kannst du diese Nachricht ig
# Email sending
'user-mail-no-addy' => 'Versuchte ein E-Mail ohne Angabe einer E-Mail-Adresse zu versenden',
+'user-mail-no-body' => 'Es wurde versucht, ein E-Mail mit einem leeren oder zu kurzen Textkörper zu versenden.',
# Change password dialog
'resetpass_announce' => 'Anmeldung mit dem per E-Mail zugesandten Code. Um die Anmeldung abzuschliessen, musst du jetzt ein neues Passwort wählen.',
@@ -229,10 +230,6 @@ Du hast darauf keinen Zugriff.',
'right-override-export-depth' => 'Exportiere Seiten einschliesslich verlinkter Seiten bis zu einer Tiefe von 5',
'right-passwordreset' => 'Passwort eines Benutzers zurücksetzen und das dazu verschickte E-Mail einsehen',
-# User rights log
-'rightslogentry' => 'änderte die Benutzerrechte für «$1» von «$2» auf «$3»',
-'rightslogentry-autopromote' => 'wurde automatisch von «$2» nach «$3» zugeordnet',
-
# Recent changes
'rc_categories' => 'Nur Seiten aus den Kategorien (getrennt mit «|»):',
'rc-old-title' => 'ursprünglich erstellt als «$1»',
@@ -352,7 +349,7 @@ Die Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seite
'allpages-bad-ns' => 'Der Namensraum «$1» ist in {{SITENAME}} nicht vorhanden.',
# Special:LinkSearch
-'linksearch-text' => 'Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter wie beispielsweise <code>*.beispiel.ch</code> benutzt werden. Es muss mindestens eine Top-Level-Domain, z. B. «*.org». angegeben werden. <br />Unterstützte Protokolle: <code>$1</code> (Diese bitte nicht bei der Suchanfrage angeben.)',
+'linksearch-text' => 'Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter wie beispielsweise <code>*.beispiel.ch</code> benutzt werden. Es muss mindestens eine Top-Level-Domain, z. B. «*.org». angegeben werden. <br />{{PLURAL:$2|Unterstütztes Protokoll|Unterstützte Protokolle}}: <code>$1</code> (Standard ist http, falls kein Protokoll angegeben ist.)',
# Email user
'emailpagetext' => 'Du kannst {{GENDER:$1|dem Benutzer|der Benutzerin}} mit dem unten stehenden Formular ein E-Mail senden.
@@ -372,33 +369,6 @@ Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werde
# Displayed when you click the "watch" button and it is in the process of watching
'watcherrortext' => 'Beim Ändern der Beobachtungslisteneinstellungen für «$1» ist ein Fehler aufgetreten.',
-'enotif_body' => 'Hallo $WATCHINGUSERNAME,
-
-die {{SITENAME}}-Seite «$PAGETITLE» wurde von $PAGEEDITOR am $PAGEEDITDATE um $PAGEEDITTIME Uhr $CHANGEDORCREATED.
-
-Aktuelle Version: $PAGETITLE_URL
-
-$NEWPAGE
-
-Zusammenfassung des Bearbeiters: $PAGESUMMARY $PAGEMINOREDIT
-
-Kontakt zum Bearbeiter:
-E-Mail: $PAGEEDITOR_EMAIL
-Wiki: $PAGEEDITOR_WIKI
-
-Bei weiterer Aktivität auf der Seite werden dir so lange keine weiteren Benachrichtigungs-E-Mails gesendet, bis du die Seite wieder besucht hast. Auf deiner Beobachtungsliste kannst du alle Benachrichtigungsmarkierungen zusammen zurücksetzen.
-
-Dein freundliches {{SITENAME}}-Benachrichtigungssystem
-
---
-Um die Einstellungen der E-Mail-Benachrichtigung anzupassen, besuche {{canonicalurl:{{#special:Preferences}}}}.
-
-Um die Einstellungen deiner Beobachtungsliste anzupassen, besuche {{canonicalurl:{{#special:EditWatchlist}}}}.
-
-Um die Seite von deiner Beobachtungsliste herunterzunehmen, besuche $UNWATCHURL.
-
-Rückmeldungen und weitere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
-
# Delete
'excontent' => 'Inhalt war: «$1»',
'excontentauthor' => 'Inhalt war: «$1» (einziger Bearbeiter: [[Special:Contributions/$2|$2]])',
diff --git a/languages/messages/MessagesDe_formal.php b/languages/messages/MessagesDe_formal.php
index 3864cdbc..ad7e1c9f 100644
--- a/languages/messages/MessagesDe_formal.php
+++ b/languages/messages/MessagesDe_formal.php
@@ -71,12 +71,8 @@ Nutzen Sie bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungspro
# Login and logout pages
'logouttext' => "'''Sie sind nun abgemeldet.'''
-Sie können {{SITENAME}} jetzt anonym weiternutzen, oder sich erneut unter demselben oder einem anderen Benutzernamen [[Special:UserLogin|anmelden]].
+Sie können {{SITENAME}} jetzt anonym weiternutzen, oder sich erneut unter demselben oder einem anderen Benutzernamen <span class='plainlinks'>[$1 anmelden]</span>.
Beachten Sie, dass einige Seiten noch anzeigen können, dass Sie angemeldet sind, solange Sie nicht Ihren Browsercache geleert haben.",
-'welcomecreation' => '== Willkommen, $1! ==
-
-Ihr Benutzerkonto wurde soeben eingerichtet.
-Vergessen Sie nicht, Ihre [[Special:Preferences|Einstellungen]] anzupassen.',
'yourdomainname' => 'Ihre Domain:',
'password-change-forbidden' => 'Sie können auf diesem Wiki keine Passwörter ändern.',
'externaldberror' => 'Entweder es liegt ein Fehler bei der externen Authentifizierung vor oder Sie dürfen Ihr externes Benutzerkonto nicht aktualisieren.',
@@ -478,11 +474,7 @@ Spätere Änderungen an dieser Seite und der dazugehörigen Diskussionsseite wer
'enotif_body' => 'Hallo $WATCHINGUSERNAME,
-die {{SITENAME}}-Seite „$PAGETITLE“ wurde von $PAGEEDITOR am $PAGEEDITDATE um $PAGEEDITTIME Uhr $CHANGEDORCREATED.
-
-Aktuelle Version: $PAGETITLE_URL
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Zusammenfassung des Bearbeiters: $PAGESUMMARY $PAGEMINOREDIT
@@ -490,7 +482,8 @@ Kontakt zum Bearbeiter:
E-Mail: $PAGEEDITOR_EMAIL
Wiki: $PAGEEDITOR_WIKI
-Bei weiterer Aktivität auf der Seite werden Ihnen so lange keine weiteren Benachrichtigungs-E-Mails gesendet, bis Sie die Seite wieder besucht haben. Auf Ihrer Beobachtungsliste können Sie alle Benachrichtigungsmarkierungen zusammen zurücksetzen.
+Bei weiterer Aktivität auf der Seite werden Ihnen so lange keine weiteren Benachrichtigungs-E-Mails gesendet, bis Sie die Seite wieder besucht haben.
+Auf Ihrer Beobachtungsliste können Sie alle Benachrichtigungsmarkierungen zusammen zurücksetzen.
Ihr freundliches {{SITENAME}}-Benachrichtigungssystem
diff --git a/languages/messages/MessagesDiq.php b/languages/messages/MessagesDiq.php
index ede4c53e..20ee56f3 100644
--- a/languages/messages/MessagesDiq.php
+++ b/languages/messages/MessagesDiq.php
@@ -53,61 +53,62 @@ $specialPageAliases = array(
'Activeusers' => array( 'KarberêAktivi', 'AktivKarberi' ),
'Allmessages' => array( 'MesaciPêro' ),
'Allpages' => array( 'PeleyPêro' ),
- 'Ancientpages' => array( 'PeleyVerêni' ),
+ 'Ancientpages' => array( 'PeleyKehani' ),
'Badtitle' => array( 'SernameyoXırab' ),
- 'Blankpage' => array( 'PelaVeng', 'VengPela' ),
- 'Block' => array( 'Bloke', 'BlokeIP', 'BlokeKarber' ),
- 'Blockme' => array( 'BlokêMe' ),
+ 'Blankpage' => array( 'PelêVengi' ),
+ 'Block' => array( 'Bloqe', 'BloqeIP', 'BloqeyêKarber' ),
+ 'Blockme' => array( 'BloqeyêMe' ),
'Booksources' => array( 'KıtabeÇıme' ),
'BrokenRedirects' => array( 'HetênayışoXırab' ),
- 'Categories' => array( 'Kategoriye' ),
- 'ChangeEmail' => array( 'EpostaBıvurnê' ),
+ 'Categories' => array( 'Kategoriy' ),
+ 'ChangeEmail' => array( 'EpostaVurnayış' ),
'ChangePassword' => array( 'ParolaBıvurnê', 'ParolaResetke' ),
'ComparePages' => array( 'PelaPêverke' ),
'Confirmemail' => array( 'EpostayAraÅŸtke' ),
- 'Contributions' => array( 'Ä°ÅŸtiraxi' ),
+ 'Contributions' => array( 'Ä°ÅŸtiraqi' ),
'CreateAccount' => array( 'HesabVırazê' ),
- 'Deadendpages' => array( 'PelaBêgıre' ),
- 'DeletedContributions' => array( 'İştıraxêkeBesterneyayê' ),
- 'Disambiguations' => array( 'ManeoBin' ),
- 'DoubleRedirects' => array( 'DıletHeteneayış' ),
- 'EditWatchlist' => array( 'ListeyaSeyriVurnayış' ),
+ 'Deadendpages' => array( 'PelaBıgirê' ),
+ 'DeletedContributions' => array( 'İştıraqêkeBesterneyayê' ),
+ 'Disambiguations' => array( 'Arêzekerdış' ),
+ 'DoubleRedirects' => array( 'HetanayışoDılet' ),
+ 'EditWatchlist' => array( 'ListeyaSeyrkerdışiVurnayış' ),
'Emailuser' => array( 'EpostayaKarberi' ),
'Export' => array( 'Ateberde' ),
'Fewestrevisions' => array( 'TewrtaynRevizyon' ),
'FileDuplicateSearch' => array( 'KopyaydosyaCıgeyrayış', 'DıletdosyaCıgeyrayış' ),
'Filepath' => array( 'RayaDosya', 'HerunaDosya', 'CayêDosya' ),
'Import' => array( 'Azeredê', 'Atewrke' ),
- 'Invalidateemail' => array( 'TesdiqêepostaBıterknê' ),
- 'BlockList' => array( 'ListeyêBLoki', 'IPBloki', 'Blokeyê_IP' ),
+ 'Invalidateemail' => array( 'EpostaAraştkerdışiBıterknê' ),
+ 'BlockList' => array( 'ListeyêBloqi', 'IPBloqi', 'Blokqeyê_IP' ),
'LinkSearch' => array( 'GreCıgeyrayış' ),
- 'Listadmins' => array( 'ListeyêXizmetkaran' ),
- 'Listbots' => array( 'ListeyêBotan' ),
- 'Listfiles' => array( 'ListeyêDosyayan', 'DosyayaListeke', 'ListeyêResiman' ),
- 'Listgrouprights' => array( 'ListeyêHeqêGruban', 'HeqêGrubdeKarberan' ),
- 'Listredirects' => array( 'ListeyêHetanayışi' ),
- 'Listusers' => array( 'ListeyêKarberan', 'KarberaListeke' ),
+ 'Listadmins' => array( 'ListeyaSerkaran' ),
+ 'Listbots' => array( 'ListeyaBotan' ),
+ 'Listfiles' => array( 'ListeyaDosyayan', 'DosyayaListeke', 'ListeyêResiman' ),
+ 'Listgrouprights' => array( 'ListeyaHeqandêGruban', 'HeqêGrubdeKarberan' ),
+ 'Listredirects' => array( 'ListeyaArêzekerdışan' ),
+ 'Listusers' => array( 'ListeyaKarberan', 'KarberaListeke' ),
'Lockdb' => array( 'DBKilitke' ),
'Log' => array( 'Qeyd', 'Qeydi' ),
- 'Lonelypages' => array( 'PeleyêBêkesi' ),
- 'Longpages' => array( 'PeleyeDergi' ),
- 'MergeHistory' => array( 'RavêrdaPêtewrke' ),
+ 'Lonelypages' => array( 'PeleyêBêwayıri' ),
+ 'Longpages' => array( 'PeleyêDergi' ),
+ 'MergeHistory' => array( 'VerênanPêtewrke' ),
'MIMEsearch' => array( 'NIMECıgeyrayış' ),
'Mostcategories' => array( 'TewrvêşiKategoriyıni' ),
'Mostimages' => array( 'DosyeyêkeCırêvêşiGreDeyayo' ),
+ 'Mostinterwikis' => array( 'TewrvêşiTeberwiki' ),
'Mostlinked' => array( 'PeleyêkeCırêvêşiGreDeyayo' ),
'Mostlinkedcategories' => array( 'KategoriyêkeCırêvêşiGreDeyayo' ),
'Mostlinkedtemplates' => array( 'ŞablonêkeCırêvêşiGreDeyayo' ),
'Mostrevisions' => array( 'TewrvêşiRevizyon' ),
- 'Movepage' => array( 'PelaAhuln' ),
- 'Mycontributions' => array( 'İştırakeMe' ),
- 'Mypage' => array( 'PelaMe' ),
- 'Mytalk' => array( 'PersiyeME' ),
+ 'Movepage' => array( 'PelerBerê' ),
+ 'Mycontributions' => array( 'İştıraqêMe' ),
+ 'Mypage' => array( 'PeleyêMe' ),
+ 'Mytalk' => array( 'WerênayışêMe' ),
'Myuploads' => array( 'BarkerdışeMe' ),
'Newimages' => array( 'DosyeyêNewey', 'ResimêNewey' ),
- 'Newpages' => array( 'PeleyeNewey' ),
- 'PasswordReset' => array( 'ParolaReset' ),
- 'PermanentLink' => array( 'DaimiGre' ),
+ 'Newpages' => array( 'PeleyêNewey' ),
+ 'PasswordReset' => array( 'ParolaResetkerdış' ),
+ 'PermanentLink' => array( 'GreyoDaimi' ),
'Popularpages' => array( 'PeleyêPopuleri' ),
'Preferences' => array( 'Tercihi' ),
'Prefixindex' => array( 'SerVerole' ),
@@ -118,26 +119,25 @@ $specialPageAliases = array(
'Recentchanges' => array( 'VurnayışêPeyêni' ),
'Recentchangeslinked' => array( 'GreyêVurnayışêPeyêni' ),
'Revisiondelete' => array( 'RevizyoniBesterne' ),
- 'RevisionMove' => array( 'RewizyoniAhulne' ),
'Search' => array( 'Cıgeyre' ),
'Shortpages' => array( 'PeleyêKılmi' ),
- 'Specialpages' => array( 'PeleyXısusi' ),
+ 'Specialpages' => array( 'PeleyêXısusi' ),
'Statistics' => array( 'Ä°statistiki' ),
'Tags' => array( 'Etiketi' ),
- 'Unblock' => array( 'Bloqiwedarne' ),
+ 'Unblock' => array( 'BloqiWedarne' ),
'Uncategorizedcategories' => array( 'KategoriyêkeKategorinêbiyê' ),
'Uncategorizedimages' => array( 'DosyeyêkeKategorinêbiyê' ),
'Uncategorizedpages' => array( 'PeleyêkeKategorinêbiyê' ),
'Uncategorizedtemplates' => array( 'ŞablonêkeKategorinêbiyê' ),
'Undelete' => array( 'Peyserbiya' ),
- 'Unlockdb' => array( 'DBSırmiake' ),
+ 'Unlockdb' => array( 'DBKılitiAke' ),
'Unusedcategories' => array( 'KategoriyêkeNêkaryayê' ),
'Unusedimages' => array( 'DosyeyêkeNêkaryayê' ),
'Unusedtemplates' => array( 'ŞablonêkeNêkaryayê' ),
'Unwatchedpages' => array( 'PeleyêkeNêweyneyênê' ),
- 'Upload' => array( 'Barke' ),
+ 'Upload' => array( 'Barkerdış' ),
'UploadStash' => array( 'BarkerdışêNımtey' ),
- 'Userlogin' => array( 'KarberDekewtış' ),
+ 'Userlogin' => array( 'KarberCıkewtış' ),
'Userlogout' => array( 'KarberVıcyayış' ),
'Userrights' => array( 'HeqêKarberan', 'SysopKerdış', 'BotKerdış' ),
'Version' => array( 'Versiyon' ),
@@ -145,7 +145,7 @@ $specialPageAliases = array(
'Wantedfiles' => array( 'DosyeyêkeWazênê' ),
'Wantedpages' => array( 'PeleyêkeWazênê' ),
'Wantedtemplates' => array( 'ŞablonêkeWazênê' ),
- 'Watchlist' => array( 'Listeyseyri' ),
+ 'Watchlist' => array( 'ListaSeyri' ),
'Whatlinkshere' => array( 'PelarêGre' ),
'Withoutinterwiki' => array( 'Bêİnterwiki' ),
);
@@ -157,7 +157,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__ESTENZARURET__', '__FORCETOC__' ),
'toc' => array( '0', '__ESTEN__', '__TOC__' ),
'noeditsection' => array( '0', '__TİMARKERDIŞÇINO__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__SERNAMEÇINO__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'AÅžMÄ°YANEWKÄ°', 'MEWCUDAÅžMÄ°2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'AÅžMÄ°YANEWKÄ°1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'NAMEYAÅžMDANEWKÄ°', 'CURRENTMONTHNAME' ),
@@ -304,6 +303,7 @@ $magicWords = array(
'defaultsort_noreplace' => array( '0', 'cewabçıniyo', 'noreplace' ),
'pagesincategory_all' => array( '0', 'pêro', 'all' ),
'pagesincategory_pages' => array( '0', 'peley', 'pages' ),
+ 'pagesincategory_subcats' => array( '0', 'bınkati', 'subcats' ),
'pagesincategory_files' => array( '0', 'dosyey', 'files' ),
);
@@ -446,6 +446,7 @@ $messages = array(
'newwindow' => '(pençereyê newey de beno a)',
'cancel' => 'Bıtexelne',
'moredotdotdot' => 'Vêşi...',
+'morenotlisted' => 'Vêşêri lista nêbi...',
'mypage' => 'Pele',
'mytalk' => 'Werênayış',
'anontalk' => 'Pela werênayışê nê IPy',
@@ -457,7 +458,6 @@ $messages = array(
'qbbrowse' => 'Rovete',
'qbedit' => 'Bıvurne',
'qbpageoptions' => 'Ena pele',
-'qbpageinfo' => 'Gıre',
'qbmyoptions' => 'Pelê mı',
'qbspecialpages' => 'Pelê xısusiy',
'faq' => 'PZP (Persê ke zehf persiyenê)',
@@ -480,6 +480,7 @@ $messages = array(
'namespaces' => 'Cayê namey',
'variants' => 'Varyanti',
+'navigation-heading' => 'Menuya Navigasyoni',
'errorpagetitle' => 'Xırab',
'returnto' => 'Peyser ÅŸo $1.',
'tagline' => '{{SITENAME}} ra',
@@ -725,11 +726,10 @@ Xızmetkarê kılitkerdışi wa bewni ro enay wa çımra ravyarno: "$3".',
# Login and logout pages
'logouttext' => "'''Şıma hesab qefelna.'''
-Nıka kamiyê xo eşkera mekere u siteyê {{SITENAME}} ra eşkeni devam bıkeri, ya zi [[Special:UserLogin|newe ra hesabê xo akere]] (wazeni pey nameyê xo, wazeni pey yewna name).
+Nıka kamiyê xo eşkera mekere u siteyê {{SITENAME}} ra eşkeni devam bıkeri, ya zi <span class='plainlinks'>[$1 newe ra hesabê xo akere]</span> (wazeni pey nameyê xo, wazeni pey yewna name).
Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de hesabe şıma akerde aseno.",
-'welcomecreation' => '== Şıma xeyr amey, $1! ==
-
-Hesabê şıma biyo a.
+'welcomeuser' => 'Xeyr ameyê $1',
+'welcomecreation-msg' => 'Hesabê şıma abiyo.
[[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.',
'yourname' => 'Nameyê karberi:',
'yourpassword' => 'Parola',
@@ -880,6 +880,7 @@ Parola vêrdiye: $2',
'changeemail-oldemail' => 'E-postay şımaya newki:',
'changeemail-newemail' => 'E-posta adresiyo newe:',
'changeemail-none' => '(Çıno)',
+'changeemail-password' => 'Parolaya şımaya {{SITENAME}}i:',
'changeemail-submit' => 'E-postay xo bıvurne',
'changeemail-cancel' => 'Bıtexelne',
@@ -1053,7 +1054,6 @@ Loge peniye cor de este:",
'hiddencategories' => 'Ena per de {{PLURAL:$1|1 kategoriyo nımıte|$1 kategoriyê nımıtey}} muhtewa benê:',
'edittools' => '<!-- Text here will be shown below edit and upload forms. -->',
'edittools-upload' => '-',
-'nocreatetitle' => 'Vıraştışê pele mehcuro',
'nocreatetext' => '{{SITENAME}}, Pelê neweyi vıraştış re destur çino.
şıma eşkeni tepiya şêri u eke şıma qayd biyaye yê [[Special:UserLogin|şıma eşkeni hesab akeri]], eke niye [[Special:UserLogin|şıma eşkeni qayd bıbiy]].',
'nocreate-loggedin' => 'İcaze şıma çino şıma pelo newe akeri.',
@@ -1077,6 +1077,15 @@ Hewna kerde aseno.',
'edit-already-exists' => 'Pelo newe nêvıraziyeno.
Pel ca ra esto.',
'defaultmessagetext' => 'Hesıbyaye metne mesaci',
+'content-failed-to-parse' => 'Qandê madela $3 zereyê $1, $2 sero nêagozyayo',
+'invalid-content-data' => 'Zerrey malumati nêravêrdeyo',
+'content-not-allowed-here' => '"$1" sero per da [[$2]] rê mısade nêdeyêno',
+
+# Content models
+'content-model-wikitext' => 'wikimetin',
+'content-model-text' => 'duz metin',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'HiÅŸyari: No pel de fonksiyoni zaf esti.
@@ -1441,9 +1450,9 @@ Na game tepeya nêerziyena.',
'prefs-emailconfirm-label' => 'Tesdiqiya E-posta:',
'prefs-textboxsize' => 'Ebatê pencerey vurnayışi',
'youremail' => 'E-Mail (mecbur niyo) *:',
-'username' => 'Nameyê karberi:',
-'uid' => 'Namey karberi:',
-'prefs-memberingroups' => 'Ezayê {{PLURAL:$1|grube|gruban}}:',
+'username' => '{{GENDER:$1|Nameyê karberi}}:',
+'uid' => 'Kamiya {{GENDER:$1|karberi}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|gruban}}:',
'prefs-memberingroups-type' => '$1',
'prefs-registration' => 'Wextê qeydbiyayışi',
'prefs-registration-date-time' => '$1',
@@ -1597,12 +1606,13 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
'right-sendemail' => 'Karberanê binî ra e-mail bişirav',
'right-passwordreset' => 'E-postayanê parola reset kerdışa vineno',
+# Special:Log/newusers
+'newuserlogpage' => 'Cıkewtışê hesabvıraştışi',
+'newuserlogpagetext' => 'Ena log de viraştişê karberî esta.',
+
# User rights log
'rightslog' => 'Qeydê heqanê karberi',
'rightslogtext' => 'Ena listeyê loganê ke heqqa karbaranî mucneno.',
-'rightslogentry' => 'eza biyayişê grupî $1 ra $2 rê $3î bivurne',
-'rightslogentry-autopromote' => '$2 otomatikmen gırdkerdışi ra kerd $3.',
-'rightsnone' => '(çino)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ena pela wanayış',
@@ -1840,6 +1850,7 @@ Eke problem dewam kerd [[Special:ListUsers/sysop|serkari]] de irtibat kewe.',
'backend-fail-notsame' => 'Zey $1 ju dosya xora esta.',
'backend-fail-invalidpath' => '$1 rayê da depo kerdışa raştay niya.',
'backend-fail-delete' => '$1 nê besterneyê',
+'backend-fail-describe' => 'Qande dosya da "$1" metadata nêvurêna.',
'backend-fail-alreadyexists' => "Dosyay $1'ya nêwanêna",
'backend-fail-store' => '$1 ra $2 berdışo nê wanêno',
'backend-fail-copy' => '$1 ra $2 kopya kerdışena dosyayo nêbeno',
@@ -2071,6 +2082,11 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
'disambiguationspage' => 'Template:Maneo bin',
'disambiguations-text' => "Peleyê ke satır da sıteyên dı pelanê '''maneo bin'''i rê esteyina zeregri mocnenê. Nara satırda dıdın dı zi <br />tiya de [[MediaWiki:Disambiguationspage|Pelaya Maneo do bini ]] gani heme gıreyê şablonê ciya-manayan re gıre dayış icab keno.",
+'pageswithprop' => 'Peli be yew xısusiyetê pele',
+'pageswithprop-legend' => 'Peli be yew xısusiyetê pele',
+'pageswithprop-prop' => 'Nameyo xısusi:',
+'pageswithprop-submit' => 'Åžo',
+
'doubleredirects' => 'Hetenayışê dıletıni',
'doubleredirectstext' => 'no pel pelê ray motışani liste keno.
gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
@@ -2243,10 +2259,6 @@ Qeydeyê destegbiyayey: <code>$1</code> (qet yew qeydeyo hesabiyaye http:// ke n
'activeusers-hidesysops' => 'İdarekerdoğan bınımne',
'activeusers-noresult' => 'Karberi nêdiyayê.',
-# Special:Log/newusers
-'newuserlogpage' => 'Cıkewtışê hesabvıraştışi',
-'newuserlogpagetext' => 'Ena log de viraştişê karberî esta.',
-
# Special:ListGroupRights
'listgrouprights' => 'heqê grubê karberi',
'listgrouprights-summary' => 'wikiya cêrın a ke tede grubê karberi nişane biyê, listeya heqê cıresayişê inan o.
@@ -2344,15 +2356,21 @@ Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni. Hem zi çı dem
'enotif_mailer' => 'postaya xeberdayiÅŸi {{SITENAME}}',
'enotif_reset' => 'Pela pêro ziyaret kerde deye mor ke',
-'enotif_newpagetext' => 'Ena yew pela newî ya.',
'enotif_impersonal_salutation' => '{{SITENAME}} karber',
-'changed' => 'vurneya',
-'created' => 'viraziya',
-'enotif_subject' => 'pelê {{SITENAME}}i $PAGETITLE, hetê/perrê $PAGEEDITOR $CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} esterıt.',
+'enotif_subject_created' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} vıraşt',
+'enotif_subject_moved' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} berde',
+'enotif_subject_restored' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} timar ke',
+'enotif_subject_changed' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} vurne',
+'enotif_body_intro_deleted' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i esterıt, rewizyonê $3 bıvin.',
+'enotif_body_intro_created' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i vıraşt, rewizyonê $3 bıvin.',
+'enotif_body_intro_moved' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i berd, rewizyonê $3 bıvin.',
+'enotif_body_intro_restored' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i timar ke, rewizyonê $3 bıvin.',
+'enotif_body_intro_changed' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i vurne, rewizyonê $3 bıvin.',
'enotif_lastvisited' => 'ziyareta şıma ye peyini ra nata heme vuryayiş ê ke biyê bıewnê $1i re..',
'enotif_lastdiff' => 'qey vinayişê ney vurnayişi bıewnê pelê $1i',
'enotif_anon_editor' => 'karbero anonim $1',
-'enotif_body' => 'Embazê $WATCHINGUSERNAME,
+'enotif_body' => 'Erciyayê $WATCHINGUSERNAME,
{{SITENAME}} keyepel de no $PAGETITLE pelo sernameyın re $PAGEEDITDATE no tarix de $PAGEEDITOR no karberi $CHANGEDORCREATED. şıma eşkeni bıresi halê no peli re $PAGETITLE_URL na adresi ra.
@@ -2369,14 +2387,19 @@ no pel o ke behs beno heta ziyaret kerdışê yewna heli, mesajê vuriyayiÅŸi nÃ
{{SITENAME}} sistemê hişyariyê keyepeli.
--
-qey vurnayişê eyari:
+Qey vurnayişê eyari:
{{canonicalurl:{{#Special:Watchlist/edit}}}}
-qey wedarayişê ena pele liste xo ra seyr kerdişi, şo
+Qey vurnayişê eyaran de lista seyri:
+{{canonicalurl:{{#special:EditWatchlist}}}}
+
+Qey wedarayişê ena pele liste xo ra seyr kerdişi, şo
$UNWATCHURL
-qey hemkari u pêşniyazi:
+Qey hemkari u pêşniyazi:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'viraziya',
+'changed' => 'vurneya',
# Delete
'deletepage' => 'Pele bestere',
@@ -2530,7 +2553,8 @@ Revizyoni ya hewn a biyê ya arşiw ra veciyayê ya zi cıresayişê şımayi ş
'undeletedrevisions' => 'pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revizyon|$1 revizyon}} u {{PLURAL:$2|1 dosya|$2 dosya}} ameyê halê xo yê verıni',
'undeletedfiles' => '{{PLURAL:$1|1 dosya|$1 dosya}} tepiya anciyayi.',
-'cannotundelete' => 'şıma ya ver yewna ten pel u medya tepiya ard u ê ra tepiya ardışê şıma meqbul niyo.',
+'cannotundelete' => 'Besternayışo nêbeno:
+$1',
'undeletedpage' => "'''$1 pel tepiya anciya'''
qey karê tepiya ardışi u qey karê hewn a kerdışê verıni bıewnê [[Special:Log/delete|qeydê hewn a kerdışi]].",
@@ -2563,7 +2587,7 @@ $1',
'blanknamespace' => '(Ser)',
# Contributions
-'contributions' => 'İştiraqê karberi',
+'contributions' => 'İştıraqê {{GENDER:$1|karber}}i',
'contributions-title' => 'Dekerdenê karber de $1',
'mycontris' => 'İştıraqi',
'contribsub2' => 'Qandê $1 ($2)',
@@ -2836,6 +2860,7 @@ Yewna name bınus.',
'immobile-target-namespace-iw' => 'xetê benatê wikiyan, hedefê pelkırıştış niyo',
'immobile-source-page' => 'nameyê no peli nêvuriyeno',
'immobile-target-page' => 'sernameyê no hedefi re nêkırışiyeno',
+'bad-target-model' => 'Hedefo ke waştiyayo zerreke cı babetna model karneno. Ke nêşeno $1 ra açarno $2.',
'imagenocrossnamespace' => 'Dosya, ca yo ke qey nameyê dosyayan nêbıbo nêkırışiyeno',
'nonfile-cannot-move-to-file' => 'Ekê dosya niyê, cade namande dosyaya nêahulneyênê',
'imagetypemismatch' => 'tipa dosyaya neweyi re pênêgıneno/nêgıneno pê',
@@ -2963,7 +2988,6 @@ dosyaya emaneti vindbiyo',
# JavaScriptTest
'javascripttest' => 'Cerebnayışê JavaScripti',
-'javascripttest-disabled' => 'Na kerdin, na wiki sero aktiv nêbiya.',
'javascripttest-title' => 'Testê $1 gurweyênê',
'javascripttest-pagetext-noframework' => 'Na pela testanê JavaScripta gurweynayışi re abıryaya.',
'javascripttest-pagetext-unknownframework' => 'Çerçeweyê "$1" cerbnayışi xırabo.',
@@ -3082,11 +3106,13 @@ Tı eşkeno yew sebeb bınus.',
'pageinfo-default-sort' => 'Hesıbyaye mırfeyo kılm',
'pageinfo-length' => 'Derdeya pela (bayti heta)',
'pageinfo-article-id' => 'Kamiya pele',
+'pageinfo-language' => 'Zıwanê zerreyê pele',
'pageinfo-robot-policy' => 'Weziyetê motor de cıgeyrayışi',
'pageinfo-robot-index' => 'Ä°Indeksbiyayen',
'pageinfo-robot-noindex' => 'İndeksnêbiyayen',
'pageinfo-views' => 'Amarina mocnayışan',
'pageinfo-watchers' => 'Amariya pela serykeran',
+'pageinfo-few-watchers' => '$1 ra tayê {{PLURAL:$1|seyrker|seyrkeri}}',
'pageinfo-redirects-name' => 'Hetenayışê na pela',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'Bınpelê na pela',
@@ -3102,6 +3128,19 @@ Tı eşkeno yew sebeb bınus.',
'pageinfo-magic-words' => '{{PLURAL:$1|Çekuya|Çekuyê}} ($1) sihırini',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategoriye|Kategoriyan}} ($1) bınımne',
'pageinfo-templates' => '{{PLURAL:$1|Şablono|Şablonê}} ke mocniyenê ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|1 Pele|$1 Pelan}} de bestiya pıra',
+'pageinfo-toolboxlink' => 'Melumatê pele',
+'pageinfo-redirectsto' => 'Beno hetê',
+'pageinfo-redirectsto-info' => 'melumat',
+'pageinfo-contentpage' => 'Zey jû pela zerreki hesebiyena',
+'pageinfo-contentpage-yes' => 'Eya',
+'pageinfo-protect-cascading' => 'Sıtarkerdey tiya cı ra yenê war',
+'pageinfo-protect-cascading-yes' => 'Eya',
+'pageinfo-protect-cascading-from' => 'Sıtarkerdey cı ra yenê war',
+'pageinfo-category-info' => 'Şınasiya kategoriye',
+'pageinfo-category-pages' => 'Amarê pelan',
+'pageinfo-category-subcats' => 'Amarê bınkategoriyan',
+'pageinfo-category-files' => 'Amarê dosyeyan',
# Skin names
'skinname-standard' => 'Klasik',
@@ -3124,6 +3163,8 @@ Tı eşkeno yew sebeb bınus.',
'markedaspatrollederror' => 'NiÅŸan nibeno ke devriye biyo',
'markedaspatrollederrortext' => 'Ti gani revizyon işaret bike ke Nişanê devriye biyo',
'markedaspatrollederror-noautopatrol' => 'Ti nieşkeno ke vurnayişê xo nişan bike ke devriye biyê.',
+'markedaspatrollednotify' => 'Na vurnayışa dewriye deye $1 nışan biyo.',
+'markedaspatrollederrornotify' => 'Nışan kerdışê dewriyey nêbı',
# Patrol log
'patrol-log-page' => 'Logê devriye',
@@ -3158,6 +3199,7 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
'file-nohires' => 'Deha berz agozney cı çıniyo',
'svg-long-desc' => 'Dosyay SVG, zek vanê $1 × $2 piksela, ebatê dosya: $3',
'svg-long-desc-animated' => 'SVG dosya, nominalin $1 × $2 piksela, ebatê dosya: $3',
+'svg-long-error' => "Nêmeqbul dosyaya SVG'i: $1",
'show-big-image' => 'Tam agoznayen',
'show-big-image-preview' => "Verqayd dergiya: $1'i.",
'show-big-image-other' => 'Zewmi{{PLURAL:$2|Vılêşnayış|Vılêşnayışê}}: $1.',
@@ -3192,7 +3234,10 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
'minutes' => 'verdê {{PLURAL:$1|$1 daka|$1 daka}}',
'hours' => 'Verdê {{PLURAL:$1|$1 seata|$1 seata}}',
'days' => 'Verdê {{PLURAL:$1|$1 rocan|$1 rocan}}',
+'months' => '{{PLURAL:$1|aÅŸme|$1 aÅŸmi}}',
+'years' => '{{PLURAL:$1|$1 serre|$1 serri}}',
'ago' => 'Verdê $1',
+'just-now' => 'Hema newke',
# Bad image list
'bad_image_list' => 'Şeklo umumi wınayo:
@@ -3786,6 +3831,7 @@ kodê tesdiqi heta ıney tarixi $4 meqbul o.',
# Scary transclusion
'scarytranscludedisabled' => '[Transcludê înterwîkîyî nihebityeno]',
'scarytranscludefailed' => '[Qe $1 fetch kerdişî nihebitiyeno]',
+'scarytranscludefailed-httpstatus' => '[Qande $1 şablon nêşa bıgêriyo: HTTP $2]',
'scarytranscludetoolong' => '[Ena URL zaf dergo]',
# Delete conflict
@@ -3991,6 +4037,7 @@ Ti hem zi eÅŸkeno [[Special:EditWatchlist|use the standard editor]].',
'version-license' => 'Lisans',
'version-poweredby-credits' => "Ena wiki, dezginda '''[//www.mediawiki.org/ MediaWiki]''' ya piya vıraziyaya, heqê telifi © 2001-$1 $2.",
'version-poweredby-others' => 'Zewmi',
+'version-credits-summary' => 'Ma qayılime ke [[Special:Version|MediaWiki]] rê ke kami destek dayo wa mayê vanime inan bışınasne.',
'version-license-info' => "MediaWiki xoseri jew nuştereno; MediaWiki'yer, weqfê xoseri nuşteren GNU lisansiya merdumi şene ke vıla kerê, bıvurnê u timar kerê.
Nuşterenê MediaWiki merdumi cı ra nahfat bivinê deye êyê mısade danê; feqet ke nêşeno BIROŞO yana XOSERİ VILA KERO qerantiya ney çına. bewni rê lisansta GNU'y.
@@ -4108,17 +4155,17 @@ Ena sita dı newke xırabiya teknik esta.',
'sqlite-no-fts' => '$1 tam-metn bê destegê cı geyrayışi',
# New logging system
-'logentry-delete-delete' => "Karber $1' pelay $3' besternê",
-'logentry-delete-restore' => "Karber $1' pelay $3' peyser grot",
-'logentry-delete-event' => '$1 asaneyaışê {{PLURAL:$5|weqey roceke|$5 weqey rocekan}} kerdi het de $3: $4 vurna',
-'logentry-delete-revision' => '$1 $3: pela da $4 dı {{PLURAL:$5|jew revizyon|$5 revizyon}} asayışê cı vurna',
-'logentry-delete-event-legacy' => '$1 Asayışê vurnayışê $3 dekerde de',
-'logentry-delete-revision-legacy' => '$1 revizyonê pela da $3 asayışê cı vurna',
-'logentry-suppress-delete' => '$1 $3 rê pıloxneyê',
-'logentry-suppress-event' => '$1 asayışê {{PLURAL:$5|weqey rocaka|$5 weqey rocekan}} $3: $4 miyanıki vurna',
-'logentry-suppress-revision' => '$1 $3: pela da $4 dı {{PLURAL:$5|jew revizyon|$5 revizyon}} asayışê cı xısusiye vurna',
-'logentry-suppress-event-legacy' => '$1 Asayışê vurnayışê ciyo xısusiyeta cı $3 dekerde de',
-'logentry-suppress-revision-legacy' => '$1 revizyonê pela da $3 asayışê cıyo xısuiye vurna',
+'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}}',
+'logentry-delete-event-legacy' => '$1 Asayışê {{GENDER:$2|vurnayışê}} $3 dekerde de',
+'logentry-delete-revision-legacy' => '$1 pela $3 de asayışê revizyonan {{GENDER:$2|vurna}}',
+'logentry-suppress-delete' => '$1 Pela $3 {{GENDER:$2|dewosiyayiye}}',
+'logentry-suppress-event' => '$1 pela $3: $4 de dızdêni asayışê {{PLURAL:$5|yew weqeyo rocane|$5 weqeyê rocaney}} {{GENDER:$2|vurnay}}',
+'logentry-suppress-revision' => '$1 pela $3: $4 de asayışê {{PLURAL:$5|yew revizyoni|$5 revizyonan}} dızdêni {{GENDER:$2|vurna}}',
+'logentry-suppress-event-legacy' => '$3 asayışê cıyo xısusi $1 dızdêni {{GENDER:$2|vurna}}',
+'logentry-suppress-revision-legacy' => '$3 asayışê cıyo xısusi $1 dızdêni {{GENDER:$2|vurna}}',
'revdelete-content-hid' => 'zerrek nımıteyo',
'revdelete-summary-hid' => 'xulasaya vurnayışi nımıtiya',
'revdelete-uname-hid' => 'nameyê karberi nımıteyo',
@@ -4127,17 +4174,20 @@ Ena sita dı newke xırabiya teknik esta.',
'revdelete-uname-unhid' => 'nameyê karberi nênımıteyo',
'revdelete-restricted' => 'vergırewtışê ke xızmekaran rê biye',
'revdelete-unrestricted' => 'vergırewtışê ke xızmekaran rê dariyê we',
-'logentry-move-move' => "Karber $1' pelay $3' berd $4",
-'logentry-move-move-noredirect' => "$1'i pelay $3 raçarnayış neker dı u berd $4",
-'logentry-move-move_redir' => '$1 pela $3 pela da $4 sera hetenayış ra ahulnê',
-'logentry-move-move_redir-noredirect' => '$1 hetenayışê qeydê pela da $3 ahulnê $4 sero hetenayış vıraşt',
-'logentry-patrol-patrol' => '$1 revizyonê pela da $4 $3 ke kontrol',
-'logentry-patrol-patrol-auto' => "$1 pelay $3'i rewizyon dê $4 ya kontrol ke",
-'logentry-newusers-newusers' => 'Hesabê karberi $1 vıraziya',
-'logentry-newusers-create' => 'Hesabê karberi $1 vıraziya',
-'logentry-newusers-create2' => 'Hesabê karberi $1 terefê $3 ra vıraziya',
-'logentry-newusers-autocreate' => 'Hesabê $1 Otomatikmen vıraziya',
-'newuserlog-byemail' => 'pê e-mail ra paralo şiravt',
+'logentry-move-move' => '$1 pela $3 {{GENDER:$2|berde}} $4',
+'logentry-move-move-noredirect' => 'Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4',
+'logentry-move-move_redir' => 'Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4',
+'logentry-move-move_redir-noredirect' => 'Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4',
+'logentry-patrol-patrol' => '$1 versiyono $4 ke {{GENDER:$2|niÅŸan biyo}} pela $3 ra qontrol kerd',
+'logentry-patrol-patrol-auto' => 'Çımraviyarnayışê $4 pela $3 ke $1 otomatikman {{GENDER:$2|nişan biyo}} qontrol kerd',
+'logentry-newusers-newusers' => 'Hesabê karberê $1 {{GENDER:$2|vıraziya}}',
+'logentry-newusers-create' => 'Hesabê karberi $1 {{GENDER:$2|vıraziya}}',
+'logentry-newusers-create2' => 'Hesabê karberi $1 terefê $3 ra {{GENDER:$2|vıraziya}}',
+'logentry-newusers-autocreate' => 'Hesabê karberi $1 otomatikmen {{GENDER:$2|vıraşt}}',
+'logentry-rights-rights' => '$1 qandê $3 rê ezayiya grube $4 ra $5 {{GENDER:$2|vuriye}}',
+'logentry-rights-rights-legacy' => '$1 qandê $3 rê ezayiya grube {{GENDER:$2|vuriye}}',
+'logentry-rights-autopromote' => '$1 otomatikmen $4 ra $5 {{GENDER:$2|terfi bi}}',
+'rightsnone' => '(çino)',
# Feedback
'feedback-bugornote' => 'Jew mersela teferruato teknik esta şıma reca malumatê şıma hazıro se [ $1 jew xırab rapor] bıvinê.Zewbi zi, formê cerê xo rê şenê karfiyê. Vatışê xo pela da "[ $3 $2 ]", namey karber dê xoya piya u wasteriya karfiye.',
@@ -4190,6 +4240,7 @@ Ena sita dı newke xırabiya teknik esta.',
'api-error-ok-but-empty' => 'Xırabiya zerrek:Wastero cıwan nêdano.',
'api-error-overwrite' => 'Ser yew dosyayê ke hama esta, ser ey qeyd nibena.',
'api-error-stashfailed' => 'Xırabiya zerrek:Wasteri idari dosyey kerdi vıni.',
+'api-error-publishfailed' => 'Xetaya zerrey: Cıgeyrayoği nêşiya dosyaya rocaniye akero.',
'api-error-timeout' => 'Cıwab dayışê wasteri peyra mend.',
'api-error-unclassified' => 'Yew xeteyê nizanyeni biya.',
'api-error-unknown-code' => "$1'dı jew xeta vıciye",
diff --git a/languages/messages/MessagesDsb.php b/languages/messages/MessagesDsb.php
index 9fee8811..00c9dcbb 100644
--- a/languages/messages/MessagesDsb.php
+++ b/languages/messages/MessagesDsb.php
@@ -23,7 +23,6 @@
$fallback = 'de';
-
$namespaceNames = array(
NS_MEDIA => 'Medija',
NS_SPECIAL => 'Specialne',
@@ -53,20 +52,6 @@ $namespaceGenderAliases = array(
NS_USER_TALK => array( 'male' => 'Diskusija_wužywarja', 'female' => 'Diskusija_wužywarki' ),
);
-$datePreferences = array(
- 'default',
- 'dmy',
- 'ISO 8601',
-);
-
-$defaultDateFormat = 'dmy';
-
-$dateFormats = array(
- 'dmy time' => 'H:i',
- 'dmy date' => 'j. xg Y',
- 'dmy both' => 'j. xg Y, H:i',
-);
-
$specialPageAliases = array(
'Activeusers' => array( 'Aktiwne_wužywarje' ),
'Allmessages' => array( 'Systemowe_powěsći' ),
@@ -158,6 +143,20 @@ $specialPageAliases = array(
'Withoutinterwiki' => array( 'Interwikije_feluju' ),
);
+$datePreferences = array(
+ 'default',
+ 'dmy',
+ 'ISO 8601',
+);
+
+$defaultDateFormat = 'dmy';
+
+$dateFormats = array(
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j. xg Y',
+ 'dmy both' => 'j. xg Y, H:i',
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'Wótkaze pódšmarnuś:',
@@ -292,6 +291,7 @@ $messages = array(
'newwindow' => '(se wótcynijo w nowem woknje)',
'cancel' => 'Pśetergnuś',
'moredotdotdot' => 'Wěcej…',
+'morenotlisted' => 'Dalšne njepódane...',
'mypage' => 'Bok',
'mytalk' => 'Diskusija',
'anontalk' => 'Diskusija z toÅ› teju IP',
@@ -303,7 +303,6 @@ $messages = array(
'qbbrowse' => 'Pśeběraś',
'qbedit' => 'Pśeměniś',
'qbpageoptions' => 'ToÅ› ten bok',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => 'Móje boki',
'qbspecialpages' => 'Specialne boki',
'faq' => 'FAQ (pšašanja a wótegrona)',
@@ -326,6 +325,7 @@ $messages = array(
'namespaces' => 'Mjenjowe rumy',
'variants' => 'Warianty',
+'navigation-heading' => 'Nawigaciski meni',
'errorpagetitle' => 'Zmólka',
'returnto' => 'Slědk k bokoju $1.',
'tagline' => 'Z {{GRAMMAR:genitiw|{{SITENAME}}}}',
@@ -562,11 +562,10 @@ Administrator, kenž jo jen zastajił, jo toś tu pśicynu pódał: "$3".',
# Login and logout pages
'logouttext' => "'''Sy se něnto wótzjawił.'''
-Móžoš {{SITENAME}} anomymnje dalej wužywaś abo móžoš [[Special:UserLogin|se znowego pśizjawiś]] ako samski abo hynakšy wužywaŕ.
+Móžoš {{SITENAME}} anomymnje dalej wužywaś abo móžoš <span class='plainlinks'>[$1 se znowego pśizjawiś]</span> ako samski abo hynakšy wužywaŕ.
Źiwaj na to, až někotare boki se dalej tak zwobraznjuju ako by hyšći pśizjawjeny był, až njewuproznijoš cache swójego wobglědowaka.",
-'welcomecreation' => '== Witaj, $1! ==
-
-Twójo konto jo se załožyło. Njezabydni změniś swóje [[Special:Preferences|nastajenja {{SITENAME}}]].',
+'welcomeuser' => 'Witaj $1',
+'welcomecreation-msg' => 'Twójo konto jo se załožyło. Njezabydni změniś swóje [[Special:Preferences|nastajenja za {{SITENAME}}]].',
'yourname' => 'mě wužywarja',
'yourpassword' => 'šćitne gronidło:',
'yourpasswordagain' => 'Šćitne gronidło hyšći raz zapódaś:',
@@ -589,7 +588,7 @@ Twójo konto jo se załožyło. Njezabydni změniś swóje [[Special:Preferences
'gotaccount' => "Maš južo wužywarske konto? '''$1'''.",
'gotaccountlink' => 'Pśizjawiś se',
'userlogin-resetlink' => 'Sy pśizjawjeńske daty zabył?',
-'createaccountmail' => 'z e-mailku',
+'createaccountmail' => 'Nachylne pśidatne gronidło wužywaś a jo na slědujucu e-mailowu adresu pósłaś',
'createaccountreason' => 'Pśicyna:',
'badretype' => 'Šćitnej gronidle, kótarejž sy zapódał, se njemakajotej.',
'userexists' => 'Wužywarske mě se južo wužywa.
@@ -653,6 +652,7 @@ Móžoš toś te zdźělenje ignorowaś, jolic toś te konto jo se jano zamólnj
# Email sending
'php-mail-error-unknown' => 'Njeznata zmólka w PHP-funkciji mail()',
'user-mail-no-addy' => 'Jo se wopytało, e-mail bźez e-mailoweje adrese pósłaś',
+'user-mail-no-body' => 'Jo se wopytało, e-mail bźez teksta abo z pśekrotkim tekstom pósłaś',
# Change password dialog
'resetpass' => 'Gronidło změniś',
@@ -700,7 +700,7 @@ Ty by měł se něnto pśizjawiś a nowe gronidło wustajiś. Jolic něchten dru
Nachylne gronidło: $2',
'passwordreset-emailsent' => 'E-mail za anulěrowanje gronidła jo se pósłała.',
'passwordreset-emailsent-capture' => 'E-mail za anulěrowanje gronidła jo se pósłała, kótaraž pokazujo se dołojce.',
-'passwordreset-emailerror-capture' => 'Dołojce pokazowana e-mail jo se napóriła, ale jo se njeraźiło ju wužiwarjeju pósłaś: $1',
+'passwordreset-emailerror-capture' => 'E-mail za anulěrowanje gronidła jo se generěrowała, kótaraž pokazujo se dołojce, ale jeje słanje wužywarjeju jo se njeraźiło: $1',
# Special:ChangeEmail
'changeemail' => 'E-mailowu adresu změniś',
@@ -710,6 +710,7 @@ Nachylne gronidło: $2',
'changeemail-oldemail' => 'Aktualna e-mailowa adresa:',
'changeemail-newemail' => 'Nowa e-mailowa adresa:',
'changeemail-none' => '(žedna)',
+'changeemail-password' => 'Twójo gronidło za {{GRAMMAR:akuzatiw|{{SITENAME}}}}',
'changeemail-submit' => 'E-mailowu adresu změniś',
'changeemail-cancel' => 'Pśetergnuś',
@@ -876,7 +877,6 @@ Nejnowšy protokolowy zapisk jo dołojce ako referenca pódany:",
'template-semiprotected' => '(poł šćitane)',
'hiddencategories' => 'ToÅ› ten bok jo jadna z {{PLURAL:$1|1 schowaneje kategorije|$1 schowaneju kategorijow|$1 schowanych kategorijow|$1 schowanych kategorijow}}:',
'edittools' => '<!-- Tekst how buźo wiźeś pód wobźěłowańskimi a upload-formularami. -->',
-'nocreatetitle' => 'Załožowanje nowych bokow jo se wobgranicowało.',
'nocreatetext' => 'Na {{GRAMMAR:lokatiw|{{SITENAME}}}} jo se załoženje nowych bokow wót serwera wobgranicowało. Móžoš hyś slědk a eksistěrujucy bok wobźěłaś, abo se [[Special:UserLogin|pśizjawiś]].',
'nocreate-loggedin' => 'Njamaš pšawo nowe boki napóraś.',
'sectioneditnotsupported-title' => 'Wobźěłowanje wótrězka se njepódpěra',
@@ -899,6 +899,15 @@ Zda sem až jo wulašowany.',
'edit-already-exists' => 'Njejo móžno było nowy bok napóraś.
Eksistěrujo južo.',
'defaultmessagetext' => 'Standardny tekst powěźeńki',
+'content-failed-to-parse' => 'Parsowanje wopśimjeśa $2 za model $1 jo se njeraźiło: $3',
+'invalid-content-data' => 'Njepłaśiwe wopśimjeśowe daty',
+'content-not-allowed-here' => 'Wopśimjeśe "$1" njejo na boku [[$2]] dowólone',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'lutny tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Warnowanje: Toś ten bok wopśimujo pśewjele wołanjow parserowych funkcijow wupominajucych wusoke wugbaśe.
@@ -1260,9 +1269,9 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
'prefs-emailconfirm-label' => 'E-mailowe wobkšuśenje:',
'prefs-textboxsize' => 'Wjelikosć wobźěłowańskego wokna',
'youremail' => 'E-mail:',
-'username' => 'Wužywarske mě:',
-'uid' => 'ID wužywarja:',
-'prefs-memberingroups' => 'Cłonk {{PLURAL:$1|wužywarskeje skupiny|wužywarskeju kupkowu|wužywarskich kupkow|wužiwarskich kupkow}}:',
+'username' => 'Mě {{GENDER:$1|wužywarja|wužywarki}}:',
+'uid' => 'ID {{GENDER:$1|wužywarja|wužywarki}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Cłon|Cłonka}} {{PLURAL:$1|wužywarskeje kupki|wužiwarskeju kupkowu|wužywarskich kupkow}}:',
'prefs-registration' => 'Cas registracije:',
'yourrealname' => 'Realne mÄ› *:',
'yourlanguage' => 'Rěc:',
@@ -1409,12 +1418,13 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
'right-sendemail' => 'Drugim wužywarjam e-mail pósłaś',
'right-passwordreset' => 'E-maile za slědkstajanje gronidłow se woglědaś',
+# Special:Log/newusers
+'newuserlogpage' => 'Protokol nowych wužywarjow',
+'newuserlogpagetext' => 'To jo protokol wó nowych wužywarskich kontow.',
+
# User rights log
'rightslog' => 'Protokol wužywarskich pšawow',
'rightslogtext' => 'To jo protokol wužywarskich pšawow.',
-'rightslogentry' => 'Pśisłušnosć ku kupce jo se za „$1“ změniła wót „$2“ na „$3“.',
-'rightslogentry-autopromote' => 'jo se awtomatiski wót $2 do $3 změnił',
-'rightsnone' => '(nic)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'toÅ› ten bok cytaÅ›',
@@ -1650,6 +1660,7 @@ $1',
'backend-fail-notsame' => 'Njeidentiska dataja $1 južo eksistěrujo.',
'backend-fail-invalidpath' => '$1 njejo płaśiwy puśik za składowanje.',
'backend-fail-delete' => 'Dataja $1 njedajo se wulašowaś.',
+'backend-fail-describe' => 'Metadaty za dataju "$1" njedaju se změniś.',
'backend-fail-alreadyexists' => 'Dataja $1 južo eksistěrujo.',
'backend-fail-store' => 'Dataja $1 njedajo se pód $2 składowaś.',
'backend-fail-copy' => 'Dataja $1 njedajo se pód $2 kopěrowaś.',
@@ -1879,6 +1890,12 @@ Snaź coš wopisanje na jeje [$2 boku datajowego wopisanja] wobźěłaś.',
'disambiguations-text' => 'Slědujuce boki wopśimuju nanejmjenjej jaden wótkaz k bokoju rozjasnjenja zapśimjeśow. Wóne by dejali město togo ku gódnjejšemu bokoju wótkazaś.<br />
Maju bok za bok rozjasnjenja zapśimjeśow, gaž wužywa pśedłogu, na kótaruž wótkazujo se wót [[MediaWiki:Disambiguationspage]].',
+'pageswithprop' => 'Boki z kakosću boka',
+'pageswithprop-legend' => 'Boki z kakosću boka',
+'pageswithprop-text' => 'Toś ten bok nalicyjo boki, kótarež wužywaju wěstu kakosć boka.',
+'pageswithprop-prop' => 'Mě kakosći:',
+'pageswithprop-submit' => 'Wótpósłaś',
+
'doubleredirects' => 'Dwójne dalejpósrědnjenja',
'doubleredirectstext' => 'Toś ten bok nalicujo boki, kótarež dalej pósrědnjaju na druge dalejpósrědnjenja.
Kužda smužka wopśimjejo wótkaze na prědne a druge dalejpósrědnjenje a teke na cel drugego dalejpósrědnjenja, což jo w normalnem paźe "napšawdny" celowy bok, na kótaryž by mógło prědne dalejpósrědnjenje pokazaś. <del>Pśešmarnjone</del> zapiski su južo wobstarane.',
@@ -2030,7 +2047,7 @@ Glědaj teke [[Special:WantedCategories|póžedane kategorije]].',
'linksearch-ok' => 'PytaÅ›',
'linksearch-text' => 'Jo móžno zastupne znamuška kaž "*.wikipedia.org" wužywaś.
Jo nanejmjenjej głowna domena trěbna, na pśikład "*.org"<br />
-Pódpěrane protokole: <code>$1</code> (standard jo http://, jolic žeden protokol njejo pódany).',
+{{PLURAL:$2|Pódpěrany protokol|Pódpěranej protokola|Pódpěrane protokole}}: <code>$1</code> (standard jo http://, jolic žeden protokol njejo pódany).',
'linksearch-line' => '$1 wótkazany z $2',
'linksearch-error' => 'Zasupne znamješko daju se jano na zachopjeńku URL wužywaś.',
@@ -2049,10 +2066,6 @@ Pódpěrane protokole: <code>$1</code> (standard jo http://, jolic žeden protok
'activeusers-hidesysops' => 'Administratorow schowaÅ›',
'activeusers-noresult' => 'Žedne wužywarje namakane.',
-# Special:Log/newusers
-'newuserlogpage' => 'Protokol nowych wužywarjow',
-'newuserlogpagetext' => 'To jo protokol wó nowych wužywarskich kontow.',
-
# Special:ListGroupRights
'listgrouprights' => 'Pšawa wužywarskeje kupki',
'listgrouprights-summary' => 'To jo lisćina wužywarskich kupkow definěrowanych w toś tom wikiju z jich zwězanymi pśistupnymi pšawami. Móžo [[{{MediaWiki:Listgrouprights-helppage}}|pśidatne informacije]] wó jadnotliwych pšawach daś.',
@@ -2146,19 +2159,23 @@ Pózdźejšne změny na toś tom boku a w pśisłušecej diskusiji se tam nalicu
'enotif_mailer' => '{{SITENAME}} e-mailowe powěsći',
'enotif_reset' => 'Wšykne boki ako woglědane markěrowaś',
-'enotif_newpagetext' => 'To jo nowy bok.',
'enotif_impersonal_salutation' => '{{SITENAME}}-wužywaŕ',
-'changed' => 'změnił',
-'created' => 'napórał',
-'enotif_subject' => '[{{SITENAME}}] $PAGEEDITOR jo bok "$PAGETITLE" $CHANGEDORCREATED',
+'enotif_subject_deleted' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se wót {{GENDER:$2|$2}} wulašował',
+'enotif_subject_created' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se wót {{GENDER:$2|$2}} napórał',
+'enotif_subject_moved' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se wót {{GENDER:$2|$2}} pśesunuł',
+'enotif_subject_restored' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se wót {{GENDER:$2|$2}} wótnowił',
+'enotif_subject_changed' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se wót {{GENDER:$2|$2}} změnił',
+'enotif_body_intro_deleted' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se na $PAGEEDITDATE wót {{GENDER:$1|$2}} wulašował, glědaj $3.',
+'enotif_body_intro_created' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se na $PAGEEDITDATE wót {{GENDER:$2|$2}} napórał, glědaj $3 za aktualnu wersiju.',
+'enotif_body_intro_moved' => 'Bok{{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se na $PAGEEDITDATE wót {{GENDER:$1|$2}} pśesunuł, glědaj $3 za aktualnu wersiju.',
+'enotif_body_intro_restored' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se na $PAGEEDITDATE wót {{GENDER:$2|$2}} wótnowił, glědaj $3 za aktualnu wersiju.',
+'enotif_body_intro_changed' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se na $PAGEEDITDATE wót {{GENDER:$2|$2}} změnił, glědaj $3 za aktualnu wersiju.',
'enotif_lastvisited' => 'Wšykne změny na jadno póglědnjenje: $1',
'enotif_lastdiff' => 'Za toś tu změnu glědaj w $1.',
'enotif_anon_editor' => 'anonymny wužywaŕ $1',
'enotif_body' => 'Luby $WATCHINGUSERNAME,
-$PAGEEDITOR jo bok $PAGETITLE na {{GRAMMAR:lokatiw|{{SITENAME}}}} $PAGEEDITDATE $CHANGEDORCREATED, glědaj $PAGETITLE_URL za aktualnu wersiju.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Zespominanje wobźěłarja: $PAGESUMMARY $PAGEMINOREDIT
@@ -2166,10 +2183,9 @@ Kontakt z wobźěłarjom:
E-mail: $PAGEEDITOR_EMAIL
Wiki: $PAGEEDITOR_WIKI
-Njebudu žedne dalšne powěźeńki w paźe dalšnych změnow, snaźkuli woglědujoš se toś ten bok.
-Móźoś teke chórgojcki powěźeńkow za wšykne twóje wobglědowane boki slědk stajiś.
+Njebudu žedne dalšne powěźeńki w paźe dalšnych změnow, snaźkuli woglědujoš se toś ten bok. Móźoś teke chórgojcki powěźeńkow za wšykne twóje wobglědowane boki slědk stajiś.
- Twój pśijaśelny powěsćowy system {{SITENAME}}
+Twój pśijaśelny powěsćowy system {{SITENAME}}
--
Aby swoje nastajenja za e-mailowe zdźělenja změnił, woglědaj
{{canonicalurl:{{#special:Preferences}}}}
@@ -2182,6 +2198,8 @@ $UNWATCHURL
Pšašanja a dalšna pomoc:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'napórał',
+'changed' => 'změnił',
# Delete
'deletepage' => 'Bok wulašowaś',
@@ -2247,6 +2265,8 @@ Pšosym nawroś se na bok, wót kótaregož sy pśišeł a wopytaj hyšći raz.'
'prot_1movedto2' => '„[[$1]]“ pśesunjone na „[[$2]]“',
'protect-badnamespace-title' => 'Nješćitajobny mjenjowy rum',
'protect-badnamespace-text' => 'Boki w toś tom mjenjowem rumje njedaju se šćitaś.',
+'protect-norestrictiontypes-text' => 'Toś ten bok njedajo se šćitaś, dokulaž njestoje žedne wobgranicowanja k dispoziciji.',
+'protect-norestrictiontypes-title' => 'Nješćitajobne boki',
'protect-legend' => 'Šćitanje wobkšuśiś',
'protectcomment' => 'Pśicyna:',
'protectexpiry' => 'cas wótběžy:',
@@ -2325,7 +2345,8 @@ W takich padach dejš nejnowše wulašowane wersije markěroanje abo schowanje w
'undeletedrevisions' => '{{PLURAL:$1|1 wersija jo se nawrośiła|$1 wersiji stej se nawrośiłej|$1 wersije su se nawrośili}}.',
'undeletedrevisions-files' => '{{PLURAL:$1|1 wersija|$1 wersiji|$1 wersije}} a {{PLURAL:$2|1 dataja|$2 dataji|$2 dataje}} {{PLURAL:$2|jo se nawrośiła|stej se nawrośiłej|su se nawrośili}}.',
'undeletedfiles' => '{{PLURAL:$1|1 dataja jo se nawrośiła|$1 dataji stej se nawrośiłej|$1 dataje su se nawrośili}}.',
-'cannotundelete' => 'Nawrośenje njejo se zglucyło; něchten drugi jo bok južo nawrośił.',
+'cannotundelete' => 'Wótnowjenje jo se njeraźiło:
+$1',
'undeletedpage' => "Bok '''$1''' jo se nawrośił.
W [[Special:Log/delete|log-lisćinje wulašowanjow]] namakajoš pśeglěd wulašowanych a nawrośonych bokow.",
@@ -2356,7 +2377,7 @@ $1',
'blanknamespace' => '(Nastawki)',
# Contributions
-'contributions' => 'Wužywarske pśinoski',
+'contributions' => 'Pśinoski {{GENDER:$1|wužywarja|wužywarki}}',
'contributions-title' => 'Wužywarske pśinoski wót $1',
'mycontris' => 'Pśinoski',
'contribsub2' => 'Za $1 ($2)',
@@ -2615,6 +2636,7 @@ Bok „[[:$1]]“ južo eksistěrujo. Coš jen wulašowaś, aby mógał toś ten
'immobile-target-namespace-iw' => 'Interwiki-wótkaz njejo płaśiwy cel za pśesunjenja bokow.',
'immobile-source-page' => 'Toś ten bok njedajo se pśesunuś.',
'immobile-target-page' => 'Njejo móžno na toś ten celowy bok pśesunuś.',
+'bad-target-model' => 'Póžedany cel wužywa drugi wopśimjeśowy model. $1 njedajo se do $2 konwertěrowaś.',
'imagenocrossnamespace' => 'Dataja njedajo se pśesunuś do mjenjowego ruma, kótarež njejo za dataje.',
'nonfile-cannot-move-to-file' => 'Njedataje njedaje se do datajowego mjenjowego ruma pśesunuś',
'imagetypemismatch' => 'Nowy datajowy sufiks swójomu typoju njewótpowědujo',
@@ -2725,6 +2747,7 @@ Wšykne transwiki-importowe akcije protokolěruju se w [[Special:Log/import|log-
'import-error-interwiki' => 'Bok "$1" se njeimportěrujo, dokulaž jogo mě jo za eksterne wótkazowanje (interwiki) wuměnjone.',
'import-error-special' => 'Bok "$1" se njeimportěrujo, dokulaž słuša k wósebnemu mjenjowemu rumoju, kótaryž njedowólujo boki.',
'import-error-invalid' => 'Bok "$1" se njeimportěrujo, dokulaž jogo mě jo njepłaśiwe.',
+'import-error-unserialize' => 'Wersija $2 boka "$1" njedajo se wótserializěrowaś. Wersija jo se za wužywanje wopśimjeśowego $3 k wěsći dała, kótaryž jo ako $4 serializěrowany.',
'import-options-wrong' => '{{PLURAL:$2|Wopacna opcija|Wopacnej opciji|Wopacne opcije|Wopacne opcije}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Pódany kórjenjowy bok jo njepłaśiwy.',
'import-rootpage-nosubpage' => 'Mjenjowy rum "$1" kórjenjowego boka njedowólujo pódboki.',
@@ -2739,7 +2762,6 @@ Wšykne transwiki-importowe akcije protokolěruju se w [[Special:Log/import|log-
# JavaScriptTest
'javascripttest' => 'JavaScriptowy test',
-'javascripttest-disabled' => 'Toś ta funkcija njejo na toś tom wikiju zmóžnjona.',
'javascripttest-title' => 'Testy $1 se pśewjeduju',
'javascripttest-pagetext-noframework' => 'Toś ten bok jo pśewjedowanjeju javascriptowych testow pśewóstajony.',
'javascripttest-pagetext-unknownframework' => 'Njeznaty wobłuk "$1".',
@@ -2861,11 +2883,13 @@ W zespominanju dajo se pśicyna pódaś.',
'pageinfo-default-sort' => 'Standardny sortěrowański kluc',
'pageinfo-length' => 'Dłujkosć boka (w bajtach)',
'pageinfo-article-id' => 'ID boka',
+'pageinfo-language' => 'Rěc bokowego wopśimjeśa',
'pageinfo-robot-policy' => 'Status pytawy',
'pageinfo-robot-index' => 'Indeksěrujobny',
'pageinfo-robot-noindex' => 'Njeindeksěrujobny',
'pageinfo-views' => 'Licba zwobraznjenjow',
'pageinfo-watchers' => 'Licba wobglědowarjow boka',
+'pageinfo-few-watchers' => 'Mjenjej ako $1 {{PLURAL:$1|wobglědowaŕ|wobglědowarja|wobglědowarje|wobglědowarjow}}',
'pageinfo-redirects-name' => 'Dalejpósrědnjenja k toś tomu bokoju',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'Pódboki toś togo boka',
@@ -2881,6 +2905,19 @@ W zespominanju dajo se pśicyna pódaś.',
'pageinfo-magic-words' => '{{PLURAL:$1|Magiske słowo|Magiskej słowje|Magiske słowa|Magiske słowa}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Schowana kategorija|Schowanej kategoriji|Schowane kategorije|Schowane kategorije}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Zapśěgnjona pśedłoga|Zapśěgnjonej pśedłoze|Zapśěgnjone pśedłogi|Zapśěgnjone pśedłogi}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Bok zapśěgnjony|Boka zapśěgnjonej|Boki zapśěgnjone}} do ($1)',
+'pageinfo-toolboxlink' => 'Informacije wó boku',
+'pageinfo-redirectsto' => 'Pósrědnja dalej k',
+'pageinfo-redirectsto-info' => 'Info',
+'pageinfo-contentpage' => 'Licy se ako wopśimjeśowy bok',
+'pageinfo-contentpage-yes' => 'Jo',
+'pageinfo-protect-cascading' => 'Kaskadowy šćit wót how',
+'pageinfo-protect-cascading-yes' => 'Jo',
+'pageinfo-protect-cascading-from' => 'Kaskadowy šćit wót',
+'pageinfo-category-info' => 'Kategorijowe informacije',
+'pageinfo-category-pages' => 'Licba bokow',
+'pageinfo-category-subcats' => 'Licba pódkategorijow',
+'pageinfo-category-files' => 'Licba datajow',
# Skin names
'skinname-standard' => 'Klasiski',
@@ -2902,6 +2939,8 @@ W zespominanju dajo se pśicyna pódaś.',
'markedaspatrollederror' => 'Markěrowanje ako "kontrolěrowane" njejo móžne.',
'markedaspatrollederrortext' => 'Musyš wersiju wuzwóliś.',
'markedaspatrollederror-noautopatrol' => 'Njesmějoš swóje změny ako kontrolěrowane markěrowaś.',
+'markedaspatrollednotify' => 'Toś ta změna do $1 jo se ako doglědowana markěrowała.',
+'markedaspatrollederrornotify' => 'Markěrowanje ako doglědowane jo se njeraźiło.',
# Patrol log
'patrol-log-page' => 'Protokol kontrolow',
@@ -2934,6 +2973,7 @@ $1',
'file-nohires' => 'Wuše wótgranicowanje njeeksistěrujo.',
'svg-long-desc' => 'dataja SVG, nominalnje: $1 × $2 piksele, wjelikosć dataje: $3',
'svg-long-desc-animated' => 'Animěrowana SVG-dataja, zakładnej wótměra $1 × $2 pikselow, datajowa wjelikosć: $3',
+'svg-long-error' => 'Njepłaśiwa SVG-dataja: $1',
'show-big-image' => 'Połne optiske wótgranicowanje.',
'show-big-image-preview' => 'Wjelikosć toś togo pśeglěda: $1.',
'show-big-image-other' => '{{PLURAL:$2|Druge rozeznaśe||Drugej rozeznaśi|Druge rozeznaśa|Druge rozeznaśa}}: $1.',
@@ -2963,7 +3003,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minutu|$1 minutoma|$1 minutami|$1 minutami}}',
'hours' => '{{PLURAL:$1|$1 góźinu|$1 góźinoma|$1 góźinami|$1 góźinami}}',
'days' => '{{PLURAL:$1|$1 dnjom|$1 dnjoma|$1 dnjami|$1 dnjami}}',
+'months' => '{{PLURAL:$1|$1 mjasecom|$1 mjasecoma|$1 mjasecami}}',
+'years' => '{{PLURAL:$1|$1 lětom|$1 lětoma|$1 lětami}}',
'ago' => 'pśed $1',
+'just-now' => 'rowno',
# Bad image list
'bad_image_list' => 'Format jo slědujucy:
@@ -3449,6 +3492,7 @@ Toś ten wobkšuśeński kod płaśi až do $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Pśidawanje interwiki jo deaktiwěrowane]',
'scarytranscludefailed' => '[Zapśěgnjenje pśedłogi za $1 njejo se raźiło]',
+'scarytranscludefailed-httpstatus' => '[Wótwołanje pśedłogi za $1 jo se njeraźiło: HTTP $2]',
'scarytranscludetoolong' => '[URL jo pśedłujki]',
# Delete conflict
@@ -3570,6 +3614,7 @@ Móžoš teke [[Special:EditWatchlist|standardny wobźěłowański bok wužywaś
'version-license' => 'Licenca',
'version-poweredby-credits' => "Toś ten wiki spěchujo se wót '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'druge',
+'version-credits-summary' => 'Źěkujomy se slědujucym wósobam za jich pśinoski k [[Special:Version|MediaWiki]]',
'version-license-info' => 'MediaWiki jo licha softwara: móžoš ju pód wuměnjenjami licence GNU General Public License, wózjawjeneje wót załožby Free Software Foundation, rozdźěliś a/abo změniś: pak pód wersiju 2 licence pak pód někakeju pózdźejšeju wersiju.
MediaWiki rozdźěla se w naźeji, až buźo wužitny, ale BŹEZ GARANTIJE: samo bźez wopśimjoneje garantije PŚEDAWAJOBNOSĆI abo PŚIGÓDNOSĆI ZA WĚSTY ZAMĚR. Glědaj GNU general Public License za dalšne drobnostki.
@@ -3683,17 +3728,17 @@ Wobraze se w połnym wótgranicowanju pokazuju, druge datajowe typy se ze zwěza
'sqlite-no-fts' => 'Wersija $1 bźez pódpěry za połnotekstowe pytanje',
# New logging system
-'logentry-delete-delete' => '$1 jo bok $3 wulašował',
-'logentry-delete-restore' => '$1 jo bok $3 wótnowił',
-'logentry-delete-event' => '$1 jo změnił widobnosć {{PLURAL:$5|protokolowego zapiska|$5 protokoloweju zapiskowu|$5 protokolowych zapiskow|$5 protokolowych zapiskow}} na $3: $4',
-'logentry-delete-revision' => '$1 jo změnił widobnosć {{PLURAL:$5|wersije|$5 wersijowu|$5 wersijow|$5 wersijow}} na boku $3: $4',
-'logentry-delete-event-legacy' => '$1 jo změnił widobnosć protokolowych zapiskow na $3',
-'logentry-delete-revision-legacy' => '$1 jo změnił widobnosć wersijow na boku $3',
-'logentry-suppress-delete' => '$1 jo pódtłocył bok $3',
-'logentry-suppress-event' => '$1 jo kšajźu změnił widobnosć {{PLURAL:$5|protokolowego zapiska|$5 protokoloweju zapiskowu|$5 protokolowych zapiskow|$5 protokolowych zapiskow}} na $3: $4',
-'logentry-suppress-revision' => '$1 jo kšajźu změnił widobnosć {{PLURAL:$5|wersije|$5 wersijowu|$5 wersijow|$5 wersijow}} na boku $3: $4',
-'logentry-suppress-event-legacy' => '$1 jo kšajźu změnił widobnosć protokolowych zapiskow na $3',
-'logentry-suppress-revision-legacy' => '$1 jo kšajźu změnił widobnosć wersijow na boku $3',
+'logentry-delete-delete' => '$1 jo bok $3 {{GENDER:$2|wulašował|wulašowała}}',
+'logentry-delete-restore' => '$1 jo bok $3 {{GENDER:$2|wótnowił|wótnowiła}}',
+'logentry-delete-event' => '$1 jo {{GENDER:$2|změnił|změniła}} widobnosć {{PLURAL:$5|protokolowego zapiska|$5 protokoloweju zapiskowu|$5 protokolowych zapiskow}} na $3: $4',
+'logentry-delete-revision' => '$1 jo {{GENDER:$2|změnił|změniła}} widobnosć {{PLURAL:$5|wersije|$5 wersijowu|$5 wersijow}} na boku $3: $4',
+'logentry-delete-event-legacy' => '$1 jo {{GENDER:$2|změnił|změniła}} widobnosć protokolowych zapiskow na $3',
+'logentry-delete-revision-legacy' => '$1 jo {{GENDER:$2|změnił|změniła}} widobnosć wersijow na boku $3',
+'logentry-suppress-delete' => '$1 jo {{GENDER:$2|pódtłocył|pódtłocyła}} bok $3',
+'logentry-suppress-event' => '$1 jo kšajźu {{GENDER:$2|změnił|změniła}} widobnosć {{PLURAL:$5|protokolowego zapiska|$5 protokoloweju zapiskowu|$5 protokolowych zapiskow}} na $3: $4',
+'logentry-suppress-revision' => '$1 jo kšajźu {{GENDER:$2|změnił|změniła}} widobnosć {{PLURAL:$5|wersije|$5 wersijowu|$5 wersijow}} na boku $3: $4',
+'logentry-suppress-event-legacy' => '$1 jo kšajźu {{GENDER:$2|změnił|změniła}} widobnosć protokolowych zapiskow na $3',
+'logentry-suppress-revision-legacy' => '$1 jo kšajźu {{GENDER:$2|změnił|změniła}} widobnosć wersijow na boku $3',
'revdelete-content-hid' => 'wopśimjeśe schowane',
'revdelete-summary-hid' => 'Zespominanje schowane',
'revdelete-uname-hid' => 'wužywarske mě schowane',
@@ -3702,17 +3747,21 @@ Wobraze se w połnym wótgranicowanju pokazuju, druge datajowe typy se ze zwěza
'revdelete-uname-unhid' => 'wužywarske mě widobne',
'revdelete-restricted' => 'Wobgranicowanja se teke na administratorow nałožuju',
'revdelete-unrestricted' => 'Wobgranicowanja za administratorow wótpórane',
-'logentry-move-move' => '$1 jo pśesunuł bok $3 do $4',
-'logentry-move-move-noredirect' => '$1 jo pśesunuł bok $3 do $4, mimo až jo napórał dalejpósrědnjenje',
-'logentry-move-move_redir' => '$1 jo pśesunuł bok $3 do $4 a jo pśepisał dalejpósrědnjenje',
-'logentry-move-move_redir-noredirect' => '$1 jo pśesunuł bok $3 do $4 a jo pśepisał dalejpósrědnjenje, mimo až jo napórał dalejpósrědnjenje',
-'logentry-patrol-patrol' => '$1 jo markěrował wersiju $4 boka $3 ako doglědowanu',
-'logentry-patrol-patrol-auto' => '$1 jo awtomatiski markěrował wersiju $4 boka $3 ako doglědowanu',
-'logentry-newusers-newusers' => 'Wužywarske konto $1 jo se załožyło',
-'logentry-newusers-create' => 'Wužywarske konto $1 jo se załožyło',
-'logentry-newusers-create2' => '$1 jo załožył wužywarske konto $3',
-'logentry-newusers-autocreate' => 'Konto $1 jo se awtomatiski załožyło',
-'newuserlog-byemail' => 'Pótajne słowo bu pśez e-mail pósłane.',
+'logentry-move-move' => '$1 jo {{GENDER:$2|pśesunuł|pśesunuła}} bok $3 do $4',
+'logentry-move-move-noredirect' => '$1 jo {{GENDER:$2|pśesunuł|pśesunuła}} bok $3 do $4, mimo až jo {{GENDER:$2|napórał|napórała}} dalejpósrědnjenje',
+'logentry-move-move_redir' => '$1 jo {{GENDER:$2|pśesunuł|pśesunuła}} bok $3 do $4 a jo {{GENDER:$2|pśepisał|pśepisała}} dalejpósrědnjenje',
+'logentry-move-move_redir-noredirect' => '$1 jo {{GENDER:$2|pśesunuł|pśesunuła}} bok $3 do $4 a jo {{GENDER:$2|pśepisał|pśepisał}} dalejpósrědnjenje, mimo až jo {{GENDER:$2|napórał|napórała}} dalejpósrědnjenje',
+'logentry-patrol-patrol' => '$1 jo {{GENDER:$2|markěrował|markěrował}} wersiju $4 boka $3 ako doglědowanu',
+'logentry-patrol-patrol-auto' => '$1 jo awtomatiski {{GENDER:$2|markěrował|měrkěrowała}} wersiju $4 boka $3 ako doglědowanu',
+'logentry-newusers-newusers' => 'Wužywarske konto $1 jo se {{GENDER:$2|załožyło}}',
+'logentry-newusers-create' => 'Wužywarske konto $1 jo se {{GENDER:$2|załožyło}}',
+'logentry-newusers-create2' => '$1 jo {{GENDER:$2|załožył|załožyła}} wužywarske konto $3',
+'logentry-newusers-byemail' => '$1 jo wužywarske konto $3 {{GENDER:$2|załožył|załožyła}} a gronidło jo se pśez e-mail pósłało',
+'logentry-newusers-autocreate' => 'Wužywarske konto $1 jo se awtomatiski {{GENDER:$2|załožyło}}',
+'logentry-rights-rights' => '$1 jo kupkowe cłonkojstwo za $3 z $4 do $5 {{GENDER:$2|změnił|změniła}}',
+'logentry-rights-rights-legacy' => '$1 jo kupkowe cłonkojstwo za $3 {{GENDER:$2|změnił|změniła}}',
+'logentry-rights-autopromote' => '$1 jo se awtomatiski wót $4 do $5 {{GENDER:$2|pśirědował|pśirědowała}}',
+'rightsnone' => '(nic)',
# Feedback
'feedback-bugornote' => 'Jolic sy zwólny, techniski problem nadrobnje wopisaś, [$1 daj pšosym zmólku k wěsći].
@@ -3766,6 +3815,7 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
'api-error-ok-but-empty' => 'Nutśikowna zmólka: Žedne wótegrono wót serwera.',
'api-error-overwrite' => 'Pśepisowanje eksistujuceje dataje njejo dowólone.',
'api-error-stashfailed' => 'Nutśikowna zmólka: Serwer njejo mógał temporernu dataju składowaś.',
+'api-error-publishfailed' => 'Nutśkowna zmólka: Serwer njejo mógł nachylnu dataju wozjawiś.',
'api-error-timeout' => 'Serwer njejo we wócakanem casu wótgronił.',
'api-error-unclassified' => 'Njeznata zmólka jo nastała.',
'api-error-unknown-code' => 'Njeznata zmólka: "$1"',
@@ -3786,4 +3836,7 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
'duration-centuries' => '$1 {{PLURAL:$1|stolěśe|stolěśi|stolěśa|stolěśow}}',
'duration-millennia' => '$1 {{PLURAL:$1|lěttysac|lěttysaca|lěttysace|lěttysacow}}',
+# Image rotation
+'rotate-comment' => 'Wobraz wó $1 {{PLURAL:$1|stopjeń|stopnja|stopnje|stopnjow}} ako špěra źo wobwjertnjony',
+
);
diff --git a/languages/messages/MessagesDtp.php b/languages/messages/MessagesDtp.php
index 607a9ece..436c90ab 100644
--- a/languages/messages/MessagesDtp.php
+++ b/languages/messages/MessagesDtp.php
@@ -147,6 +147,7 @@ $messages = array(
'newwindow' => '(ukabai id liligaon wagu)',
'cancel' => 'Kinsilo',
'moredotdotdot' => 'Gumu...',
+'morenotlisted' => 'Susuai poh ii awu nokosurat...',
'mypage' => 'Bolikon',
'mytalk' => 'Pogibabarasan',
'anontalk' => 'Piboros montok diti nantadon IP',
@@ -158,7 +159,6 @@ $messages = array(
'qbbrowse' => 'Pogihum',
'qbedit' => 'Idito',
'qbpageoptions' => 'Bolikon diti',
-'qbpageinfo' => 'Pogiromutan',
'qbmyoptions' => 'Bobolikonku ngawi',
'qbspecialpages' => 'Bobolikon suaikowokon',
'faq' => 'Ponguhatan Koinsoruan om Poninimbar',
@@ -181,6 +181,7 @@ $messages = array(
'namespaces' => 'Ponuratan ngaran',
'variants' => 'Kopogisuaian',
+'navigation-heading' => 'Pipilion usuyon',
'errorpagetitle' => 'Nosilopan',
'returnto' => 'Gumuli hilo $1.',
'tagline' => 'Mantad {{SITENAME}}',
@@ -425,11 +426,11 @@ Mongungulud di minongunsi pinopointalang do kointalangan diti: "$3".',
# Login and logout pages
'logouttext' => "'''Baino nakalabus log ko noh.'''
-Milo ko do monilombus mongoguno {{SITENAME}} poinlisok, toi [[Special:UserLogin|sumuang log koh kawagu]] miagal ngaran di tiinu toi mongoguno ngaran suai.
+Milo ko do monilombus mongoguno {{SITENAME}} poinlisok, toi <span class='plainlinks'>[$1 sumuang log koh kawagu]</span> miagal ngaran di tiinu toi mongoguno ngaran suai.
Birio do kipipiro bolikon popokito do maso poinsuang log koh poh gisom no do opugas nu dangkob do pogigihumnu.",
-'welcomecreation' => '== Kopiwosian, $1! ==
-Nowonsoi no takaunnu.
-Soroho no do mongolon [[Special:Preferences|{{SITENAME}} komoisoonnu]].',
+'welcomeuser' => 'Kotobian dongkorikatan, $1!',
+'welcomecreation-msg' => 'Nowonsoi noh akaunnu.
+Soroho noh do mongolon do [[Special:Preferences|{{SITENAME}} komoisaannu]].',
'yourname' => 'Ngarandait:',
'yourpassword' => 'Kaatalib:',
'yourpasswordagain' => 'Mintaipo kaatalib:',
@@ -452,7 +453,7 @@ Soroho no do mongolon [[Special:Preferences|{{SITENAME}} komoisoonnu]].',
'gotaccount' => 'Kitakaun? $1',
'gotaccountlink' => 'Sumuang log',
'userlogin-resetlink' => 'Nolihuan ahal loginnu?',
-'createaccountmail' => 'Maya surat-i',
+'createaccountmail' => 'Gunoo nunu nopo kaatalib om pootodo id surat-i ii poinsurat id siriba diti',
'createaccountreason' => 'Sabab:',
'badretype' => 'Kaatalib pinosuang awu kopisangai.',
'userexists' => 'Ngaranmoguno pinosuang noguno no.
@@ -530,6 +531,7 @@ Andado poh do toruhai pogulu do minsingumbal kawagu.',
# Email sending
'php-mail-error-unknown' => 'Awu nointutunan kinosilapan id don surat PHP () function',
'user-mail-no-addy' => 'Mogumbal do papaatod surat-i tingaa o paatadan.',
+'user-mail-no-body' => 'Minogumbal koh do papaatod surat-i do ingaa suang toi nadalaan koniba.',
# Change password dialog
'resetpass' => 'Alanai kaatalib',
@@ -739,7 +741,6 @@ Mangakaun ko nogi do sinuratannu iti mopori, toi dinalin iri mantad domin ginumu
'template-protected' => '(tingoligai)',
'template-semiprotected' => '(noumoligan)',
'hiddencategories' => 'Bolikon diti songkoruhang do {{PLURAL:$1|1 katogori poinlisok|$1 kakatogori poinlisok}}:',
-'nocreatetitle' => 'Momonsoi bolikon wagu pinatagal',
'nocreatetext' => '{{SITENAME}} tinagal kasagaan momonsoi bobolikon kawawagu.
Milo ko do gumuli om mongidit di bolikon poinsuang, toi ko [[Special:UserLogin|sumuang log toi momonsoi do takaun.]].',
'nocreate-loggedin' => 'Ingaa kasagaannu do momonsoi bobolikon wagu.',
@@ -1062,6 +1063,9 @@ Imurai no do indik suang diti {{SITENAME}} nopo nga nokolipas.',
'grouppage-sysop' => '{{ns:project}}:Mandur',
+# Special:Log/newusers
+'newuserlogpage' => 'Log pinamansaian momomoguno',
+
# User rights log
'rightslog' => 'Log kasagaan momomoguno',
@@ -1221,9 +1225,6 @@ Kointalangan dilo [$2 kointalangan pail] okito id siriba.',
'linksearch-ok' => 'Ihumo',
'linksearch-line' => '$1 toput mantad $2',
-# Special:Log/newusers
-'newuserlogpage' => 'Log pinamansaian momomoguno',
-
# Special:ListGroupRights
'listgrouprights-members' => '(lis do kinoruhangan)',
diff --git a/languages/messages/MessagesDv.php b/languages/messages/MessagesDv.php
index a80c1e4e..4016edc0 100644
--- a/languages/messages/MessagesDv.php
+++ b/languages/messages/MessagesDv.php
@@ -18,9 +18,12 @@
$rtl = true;
$namespaceNames = array(
+ NS_MEDIA => 'Þ‰Þ©Þ‘Þ¨Þ‡Þ§',
NS_SPECIAL => 'Þ€Þ§Þ‡Þ°ÞžÞ¦',
+ NS_MAIN => '',
NS_TALK => 'ÞšÞ¨Þ”Þ§ÞÞª',
NS_USER => 'Þ‰Þ¬Þ‰Þ°Þ„Þ¦ÞƒÞª',
+ NS_USER_TALK => 'Þ‰Þ¬Þ‰Þ°Þ„Þ¦ÞƒÞªÞŽÞ¬_ÞˆÞ§Þ€Þ¦Þ†Þ¦',
NS_FILE => 'ÞŠÞ¦Þ‡Þ¨ÞÞ°',
NS_FILE_TALK => 'ÞŠÞ¦Þ‡Þ¨ÞÞ°_ÞšÞ¨Þ”Þ§ÞÞª',
NS_MEDIAWIKI => 'Þ‰Þ©Þ‘Þ¨Þ‡Þ§ÞˆÞ¨Þ†Þ©',
@@ -302,8 +305,10 @@ $1',
'ns-specialprotected' => 'ÞšÞ§Þ‡Þ°ÞÞ¦ ޞަފްޙާތަކަÞÞ° އުނިއިތުރު Þ‚ÞªÞŽÞ¬Þ‚Þ°Þ‚Þ¬ÞˆÞ­Þ‚Þ¬Þ‡Þ¬ÞˆÞ¬.',
# Login and logout pages
-'welcomecreation' => '== މަރުހަބާ، $1 ! ==
-ތިޔަބޭފުޅާގެ Þ‰Þ¬Þ‚Þ°Þ„Þ¦ÞƒÞªÞÞ¨Þ•Þ° Þ€Þ¬Þ‹Þ¨Þ‡Þ°Þ–Þ¬Þ‡Þ¬ÞˆÞ¬. ތިޔަ Þ„Þ­ÞŠÞªÞ…Þ§ÞŽÞ¬ ÞˆÞ¨Þ†Þ¨Þ•Þ©Þ‘Þ¨Þ‡Þ§ÞŽÞ¬ ތަރުޖީހުތައް Þ„Þ¦Þ‹Þ¦ÞÞªÞ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ¦Þ‚Þ° Þ€Þ¦Þ‚Þ‹ÞªÞ‰Þ¦ÞŠÞªÞ…Þª Þ„Þ¦Þ€Þ¦Þ‡Þ°Þ“Þ¦ÞˆÞ§ÞÞ¬ÞˆÞ¬.',
+'logouttext' => "'''ތިބޭފުޅާއަÞÞ° Þ„Þ­ÞƒÞ¦ÞÞ° ÞˆÞ¦Þ‘Þ¦Þ‡Þ¨ÞŽÞ¬Þ‚Þ°Þ‚Þ¬ÞˆÞ¨Þ‡Þ°Þ–Þ¬.'''
+
+ތިބޭފުޅާއަÞÞ° {{SITENAME}} Þ„Þ­Þ‚ÞªÞ‚Þ°Þ†ÞªÞƒÞ¬ÞˆÞ­Þ‚Þ¬Þ‡Þ¬ÞˆÞ¬. Þ‚Þ¦Þ‰Þ¦ÞˆÞ¬ÞÞ° Þ‡Þ¬Þ€Þ¬Þ‚Þ° Þ‰Þ¬Þ‰Þ°Þ„Þ¦ÞƒÞ¬Þ‡Þ°ÞŽÞ¬ ގޮތުގައި <span class='plainlinks'>[$1 ÞˆÞ¦Þ‹Þ¬ÞˆÞ¦Þ‘Þ¦Þ‡Þ¨ÞŽÞ¦Þ‚Þ¬ÞˆÞ¨Þ‹Þ§Þ‚Þ¬Þ‡Þ¬ÞˆÞ¬.]</span> ނުވަތަ ތި Þ‰Þ¬Þ‰Þ°Þ„Þ¦ÞƒÞªÞŽÞ¬ ގޮތުގައި ÞˆÞ¦Þ‹Þ¬ÞˆÞ¦Þ‘Þ¦Þ‡Þ¨ÞŽÞ¬Þ‚Þ°Þ‚Þ¬ÞˆÞ­Þ‚Þ¬Þ‡Þ¬ÞˆÞ¬.",
+'welcomeuser' => 'މަރުޙަބާ، $1!',
'yourname' => 'Þ‰Þ¬Þ‚Þ°Þ„Þ¦ÞƒÞªÞŽÞ¬Þ‚Þ¦Þ‚Þ°',
'yourpassword' => 'ÞÞ¨Þ‡Þ°ÞƒÞªÞ„Þ¦ÞÞ°',
'yourpasswordagain' => 'ÞÞ¨Þ‡Þ°ÞƒÞªÞ„Þ¦ÞÞ° Þ‡Þ¦ÞÞªÞ‚Þ°ÞÞ¨Þ”ÞªÞ‡Þ°ÞˆÞ§',
@@ -359,6 +364,7 @@ $1',
'changeemail-header' => 'Þ‡Þ¬Þ†Þ¦Þ‡ÞªÞ‚Þ°Þ“Þ°ÞŽÞ¬ Þ‡Þ©Þ‰Þ¬Þ‡Þ¨ÞÞ° Þ‡Þ¬Þ‘Þ°ÞƒÞ¬ÞÞ° Þ„Þ¦Þ‹Þ¦ÞÞªÞ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ§',
'changeemail-oldemail' => 'Þ‰Þ¨Þ€Þ§ÞƒÞª Þ„Þ­Þ‚ÞªÞ‚Þ°Þ†ÞªÞƒÞ§ Þ‡Þ©Þ‰Þ¬Þ‡Þ¨ÞÞ° Þ‡Þ¬Þ‘Þ°ÞƒÞ¬ÞÞ°:',
'changeemail-newemail' => 'Þ‡Þ¦Þ‡Þª Þ‡Þ©Þ‰Þ¬Þ‡Þ¨ÞÞ° Þ‡Þ¬Þ‘Þ°ÞƒÞ¬ÞÞ°:',
+'changeemail-password' => 'ތިޔަބޭފުޅާގެ {{SITENAME}} ÞÞ¨Þ‡Þ°ÞƒÞªÞ„Þ¦ÞÞ°:',
'changeemail-submit' => 'Þ‡Þ©Þ‰Þ¬Þ‡Þ¨ÞÞ° Þ„Þ¦Þ‹Þ¦ÞÞªÞ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ§',
'changeemail-cancel' => 'Þ‰Þ¦Þ‚Þ°ÞÞ«ÞšÞ°',
@@ -680,7 +686,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'blanknamespace' => '(Þ‰Þ¦Þ‡Þ¨)',
# Contributions
-'contributions' => 'Þ‰Þ¬Þ‚Þ°Þ„Þ¦ÞƒÞª ÞŽÞ¬ Þ€Þ¨Þ‡Þ°ÞÞ§',
+'contributions' => '{{GENDER:$1|Þ‰Þ¬Þ‰Þ°Þ„Þ¦ÞƒÞªÞŽÞ¬}} Þ€Þ¨Þ‡Þ°ÞÞ§',
'mycontris' => 'Þ‰Þ¦ÞŽÞ­ Þ€Þ¨Þ‡Þ°ÞÞ§',
'sp-contributions-talk' => 'ÞˆÞ§Þ€Þ¦Þ†Þ¦',
@@ -781,6 +787,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'tooltip-undo' => '"Þ†ÞªÞƒÞ©ÞŽÞ¬ Þ‚ÞªÞÞ°Þ€Þ§Þ‡Þ¦ÞÞ° Þ„Þ¦Þ‹Þ¦ÞÞªÞ†ÞªÞƒÞ¦Þ‡Þ°ÞˆÞ§" Þ‡Þ¨Þ‚Þ° Þ‰Þ¨ Þ‚ÞªÞÞ°Þ€Þ§ÞŽÞ¬ Þ†ÞªÞƒÞ©ÞŽÞ¦Þ‡Þ¨ Þ‡Þ¨Þ‚Þ° Þ‚ÞªÞÞ°Þ€Þ§Þ‡Þ¦ÞÞ° Þ„Þ¦Þ‹Þ¦ÞÞªÞ†Þ®ÞÞ°Þ‹Þ­Þ‚Þ¬Þ‡Þ¬ÞˆÞ¬. Þ‡Þ¦Þ‹Þ¨ އުނިއިތުރުގެ ÞšÞªÞÞ§ÞÞ§ ÞÞ¨Þ”ÞªÞ‰ÞªÞŽÞ¬ ÞŠÞªÞƒÞªÞަތު Þ‹Þ­Þ‚Þ¬Þ‡Þ¬ÞˆÞ¬.',
'tooltip-summary' => 'Þ†ÞªÞƒÞª ÞšÞªÞÞ§ÞÞ§Þ‡Þ¬Þ‡Þ° ÞÞ¨Þ”ÞªÞ‡Þ°ÞˆÞ§',
+# Info page
+'pageinfo-toolboxlink' => 'ÞÞ¦ÞŠÞ°Þ™Þ§ Þ‡Þ§Þ‡Þ¨ Þ„Þ¬Þ€Þ­ Þ‰Þ¦Þ‡ÞªÞޫމާތު',
+
# Browsing diffs
'previousdiff' => '→ Þ†ÞªÞƒÞ©ÞŽÞ¬ Þ‚ÞªÞÞ°Þ€Þ§',
'nextdiff' => 'ÞŠÞ¦Þ€ÞªÞŽÞ¬ Þ‚ÞªÞÞ°Þ€Þ§ â†',
diff --git a/languages/messages/MessagesEe.php b/languages/messages/MessagesEe.php
index 5be11940..633f5f28 100644
--- a/languages/messages/MessagesEe.php
+++ b/languages/messages/MessagesEe.php
@@ -305,6 +305,9 @@ Zã [[Special:Search|nuwo didi le wiki sia dzi]] kpɔ na axa yeyeawo.',
'group-sysop' => 'Dɔdzikpɔlawo',
'group-all' => '(wokatã)',
+# Special:Log/newusers
+'newuserlogpage' => 'Ŋkɔŋlɔla yeyewo ƒe xexlẽme',
+
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'xlẽ axa sia',
'action-edit' => 'trÉ” asi le axa sia Å‹u',
@@ -406,9 +409,6 @@ Zã [[Special:Search|nuwo didi le wiki sia dzi]] kpɔ na axa yeyeawo.',
# Special:LinkSearch
'linksearch-ok' => 'Dii',
-# Special:Log/newusers
-'newuserlogpage' => 'Ŋkɔŋlɔla yeyewo ƒe xexlẽme',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Hame',
diff --git a/languages/messages/MessagesEgl.php b/languages/messages/MessagesEgl.php
index 07335e9b..ccc01396 100644
--- a/languages/messages/MessagesEgl.php
+++ b/languages/messages/MessagesEgl.php
@@ -390,9 +390,6 @@ Cancellä',
'right-read' => "Legg' pàgin",
'right-edit' => 'Mudifich pàgin',
-# User rights log
-'rightsnone' => '(ansöin)',
-
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => "legg' custa pàgina ché",
'action-edit' => 'mudifch custa pàgina ché',
@@ -479,8 +476,8 @@ Cancellä',
'watchthispage' => 'Vadä custa pàgina ché',
'unwatch' => "N'la vadär piö",
-'changed' => 'mudifegat',
'created' => 'creät',
+'changed' => 'mudifegat',
# Delete
'delete-confirm' => 'Cancellä "$1"',
@@ -684,6 +681,9 @@ Vadä la pàgina dal file',
'htmlform-reset' => 'Turna indré cul la mudifich',
'htmlform-selectorother-other' => 'Ätar',
+# New logging system
+'rightsnone' => '(ansöin)',
+
# Feedback
'feedback-subject' => 'Uggett:',
'feedback-message' => "Messagg':",
diff --git a/languages/messages/MessagesEl.php b/languages/messages/MessagesEl.php
index 414ecc4c..86f759b0 100644
--- a/languages/messages/MessagesEl.php
+++ b/languages/messages/MessagesEl.php
@@ -20,6 +20,7 @@
* @author Demmy
* @author Evropi
* @author Flyax
+ * @author FocalPoint
* @author Geraki
* @author Glavkos
* @author Grondin
@@ -43,7 +44,7 @@
*/
/**
- * Translation by Pasok Internet Volunteers
+ * Initial translation by Pasok Internet Volunteers
* http://forum.pasok.gr
* version 1.0 (initial release)
*
@@ -72,7 +73,7 @@ $namespaceNames = array(
NS_TALK => 'Συζήτηση',
NS_USER => 'ΧÏήστης',
NS_USER_TALK => 'Συζήτηση_χÏήστη',
- NS_PROJECT_TALK => '$1_συζήτηση',
+ NS_PROJECT_TALK => 'Συζήτηση_$1',
NS_FILE => 'ΑÏχείο',
NS_FILE_TALK => 'Συζήτηση_αÏχείου',
NS_MEDIAWIKI => 'MediaWiki',
@@ -86,8 +87,9 @@ $namespaceNames = array(
);
$namespaceAliases = array(
- 'Μέσον' => NS_MEDIA,
- 'Εικόνα' => NS_FILE,
+ 'Μέσον' => NS_MEDIA,
+ '$1_συζήτηση' => NS_PROJECT_TALK,
+ 'Εικόνα' => NS_FILE,
'Συζήτηση_εικόνας' => NS_FILE_TALK,
);
@@ -100,7 +102,7 @@ $specialPageAliases = array(
'Block' => array( 'ΦÏαγή', 'ΦÏαγήIP', 'ΦÏαγήΧÏήστη' ),
'Blockme' => array( 'ΦÏαγήΕμένα' ),
'Booksources' => array( 'ΠηγέςΒιβλίων' ),
- 'BrokenRedirects' => array( 'ΛανθασμένεςΑνακατευθÏνσεις' ),
+ 'BrokenRedirects' => array( 'ΚατεστÏαμμένεςΑνακατευθÏνσεις' ),
'Categories' => array( 'ΚατηγοÏίες' ),
'ChangePassword' => array( 'ΑλλαγήΚωδικοÏ', 'ΑÏχικοποίησηΠάσου', 'ΑÏχικοποίησηΚωδικοÏ' ),
'Confirmemail' => array( 'ΕπιβεβαίωσηEmail' ),
@@ -182,37 +184,6 @@ $specialPageAliases = array(
'Withoutinterwiki' => array( 'ΧωÏίςInterwiki' ),
);
-$fallback8bitEncoding = 'iso-8859-7';
-$separatorTransformTable = array( ',' => '.', '.' => ',' );
-$linkTrail = '/^([a-zαβγδεζηθικλμνξοπÏστυφχψωςΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩάέήίόÏÏŽÏŠÏ‹ÎΰΆΈΉΊΌΎÎΪΫ]+)(.*)$/sDu';
-
-
-$datePreferences = array(
- 'default',
- 'dmy',
- 'ISO 8601',
-);
-
-$defaultDateFormat = 'dmy';
-
-$datePreferenceMigrationMap = array(
- 'default',
- 'dmy',
- 'dmy',
- 'dmy'
-);
-
-$dateFormats = array(
- 'dmy time' => 'H:i',
- 'dmy date' => 'j xg Y',
- 'dmy both' => 'H:i, j xg Y',
-
- 'ISO 8601 time' => 'xnH:xni:xns',
- 'ISO 8601 date' => 'xnY-xnm-xnd',
- 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
-);
-
-
$magicWords = array(
'redirect' => array( '0', '#ΑÎΑΚΑΤΕΥΘΥÎΣΗ', '#REDIRECT' ),
'notoc' => array( '0', '__ΧΩΡΙΣΠΠ__', '__NOTOC__' ),
@@ -220,7 +191,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__ΜΕΠΠ__', '__FORCETOC__' ),
'toc' => array( '0', '__ΠΠ__', '__TOC__' ),
'noeditsection' => array( '0', '__ΧΩΡΙΣΕΠΕΞΕÎΟΤ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__ΧΩΡΙΣΚΕΦΑΛΙΔΑ__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'ΤΡΕΧΩÎΜΗÎΑΣ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'ΤΡΕΧΩÎΜΗÎΑΣ1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'ΤΡΕΧΩÎΜΗÎΑΣΟÎΟΜΑ', 'CURRENTMONTHNAME' ),
@@ -254,6 +224,7 @@ $magicWords = array(
'pagenamee' => array( '1', 'ΟÎΟΜΑΣΕΛΙΔΑΣΚ', 'PAGENAMEE' ),
'namespace' => array( '1', 'ΠΕΡΙΟΧΗ', 'NAMESPACE' ),
'namespacee' => array( '1', 'ΠΕΡΙΟΧΗΚ', 'NAMESPACEE' ),
+ 'namespacenumber' => array( '1', 'ΑΡΙΘΜΟΣΟÎΟΜΑΤΟΣΧΩΡΟΥ', 'NAMESPACENUMBER' ),
'talkspace' => array( '1', 'ΠΕΡΙΟΧΗΣΥΖΗΤΗΣΕΩÎ', 'TALKSPACE' ),
'talkspacee' => array( '1', 'ΠΕΡΙΟΧΗΣΥΖΗΤΗΣΕΩÎΚ', 'TALKSPACEE' ),
'subjectspace' => array( '1', 'ΠΕΡΙΟΧΗΘΕΜΑΤΩÎ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -353,6 +324,35 @@ $magicWords = array(
'protectionlevel' => array( '1', 'ΕΠΙΠΕΔΟΠΡΟΣΤΑΣΙΑΣ', 'PROTECTIONLEVEL' ),
);
+$fallback8bitEncoding = 'iso-8859-7';
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
+$linkTrail = '/^([a-zαβγδεζηθικλμνξοπÏστυφχψωςΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩάέήίόÏÏŽÏŠÏ‹ÎΰΆΈΉΊΌΎÎΪΫ]+)(.*)$/sDu';
+
+$datePreferences = array(
+ 'default',
+ 'dmy',
+ 'ISO 8601',
+);
+
+$defaultDateFormat = 'dmy';
+
+$datePreferenceMigrationMap = array(
+ 'default',
+ 'dmy',
+ 'dmy',
+ 'dmy'
+);
+
+$dateFormats = array(
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j xg Y',
+ 'dmy both' => 'H:i, j xg Y',
+
+ 'ISO 8601 time' => 'xnH:xni:xns',
+ 'ISO 8601 date' => 'xnY-xnm-xnd',
+ 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'ΥπογÏάμμιση συνδέσμων:',
@@ -488,6 +488,7 @@ $messages = array(
'newwindow' => '(ανοίγει σε ξεχωÏιστό παÏάθυÏο)',
'cancel' => 'ΑκÏÏωση',
'moredotdotdot' => 'ΠεÏισσότεÏα...',
+'morenotlisted' => 'ΠεÏισσότεÏα δεν αναφέÏονται...',
'mypage' => 'Σελίδα',
'mytalk' => 'Συζήτηση',
'anontalk' => 'Οι συζητήσεις αυτής της διεÏθυνσης IP',
@@ -499,7 +500,6 @@ $messages = array(
'qbbrowse' => 'ΠεÏιήγηση',
'qbedit' => 'ΕπεξεÏγασία',
'qbpageoptions' => 'Αυτή η σελίδα',
-'qbpageinfo' => 'ΣυμφÏαζόμενα',
'qbmyoptions' => 'Οι σελίδες μου',
'qbspecialpages' => 'Σελίδες λειτουÏγιών',
'faq' => 'Συχνές εÏωτήσεις (FAQ)',
@@ -522,6 +522,7 @@ $messages = array(
'namespaces' => 'ΧώÏοι ονομάτων',
'variants' => 'ΠαÏαλλαγές',
+'navigation-heading' => 'ÎœÎµÎ½Î¿Ï Ï€Î»Î¿Î®Î³Î·ÏƒÎ·Ï‚',
'errorpagetitle' => 'Σφάλμα',
'returnto' => 'ΕπιστÏοφή στη σελίδα $1.',
'tagline' => 'Από {{SITENAME}}',
@@ -760,11 +761,11 @@ $2',
# Login and logout pages
'logouttext' => "'''Έχετε αποσυνδεθεί.'''
-ΜποÏείτε να παÏαμείνετε στο {{SITENAME}} ανώνυμα, ή μποÏείτε [[Special:UserLogin|να συνδεθείτε ξανά]] με το ίδιο ή με διαφοÏετικό (εάν έχετε) όνομα χÏήστη.
+ΜποÏείτε να παÏαμείνετε στο {{SITENAME}} ανώνυμα, ή μποÏείτε <span class='plainlinks'>[$1 να συνδεθείτε ξανά]</span> με το ίδιο ή με διαφοÏετικό (εάν έχετε) όνομα χÏήστη.
Έχετε υπόψη σας πως αÏκετές σελίδες θα συνεχίσουν να εμφανίζονται κανονικά, σαν να μην έχετε αποσυνδεθεί, μέχÏι να καθαÏίσετε τη λανθάνουσα μνήμη του φυλλομετÏητή σας.",
-'welcomecreation' => '== Καλώς ήλθατε, $1! ==
-Ο λογαÏιασμός σας έχει δημιουÏγηθεί.
-Μην ξεχάσετε να Ïυθμίσετε τις [[Special:Preferences|Ï€Ïοτιμήσεις]] σας στο {{SITENAME}}.',
+'welcomeuser' => 'Καλώς οÏίσατε, $1!',
+'welcomecreation-msg' => 'Ο λογαÏιασμός σας έχει δημιουÏγηθεί.
+Μην ξεχάσετε να αλλάξετε τις [[Special:Preferences|{{SITENAME}} Ï€Ïοτιμήσεις]] σας.',
'yourname' => 'Όνομα χÏήστη:',
'yourpassword' => 'Κωδικός:',
'yourpasswordagain' => 'ΠληκτÏολογήστε ξανά τον κωδικό',
@@ -787,7 +788,7 @@ $2',
'gotaccount' => "Έχετε ήδη έναν λογαÏιασμό; '''$1'''.",
'gotaccountlink' => 'Είσοδος',
'userlogin-resetlink' => 'Ξεχάσατε τα στοιχεία σÏνδεσής σας;',
-'createaccountmail' => 'Μέσω ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
+'createaccountmail' => 'ΧÏήση τυχαίου Ï€ÏοσωÏÎ¹Î½Î¿Ï ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης και αποστολή του στη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου που καθοÏίζεται παÏακάτω',
'createaccountreason' => 'Αιτία:',
'badretype' => 'Οι κωδικοί που έχετε δηλώσει δεν συμφωνοÏν Î¼ÎµÏ„Î±Î¾Ï Ï„Î¿Ï…Ï‚.',
'userexists' => 'Το όνομα χÏήστη που εισαγάγατε βÏίσκεται ήδη σε χÏήση.
@@ -853,6 +854,7 @@ $2',
# Email sending
'php-mail-error-unknown' => 'Άγνωστο σφάλμα στη συνάÏτηση mail() της PHP.',
'user-mail-no-addy' => 'ΠÏοσπαθήσατε να στείλετε e-mail χωÏίς μια διεÏθυνση e-mail.',
+'user-mail-no-body' => 'ΠÏοσπάθησε να στείλει e-mail με ένα κενό ή αδικαιολόγητα σÏντομο σώμα.',
# Change password dialog
'resetpass' => 'Αλλαγή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης',
@@ -900,7 +902,7 @@ $2
ΠÏοσωÏινός κωδικός Ï€Ïόσβασης:$2',
'passwordreset-emailsent' => 'Έχει αποσταλεί email επαναφοÏάς κωδικοÏ.',
'passwordreset-emailsent-capture' => 'Έχει αποσταλεί email επαναφοÏάς κωδικοÏ, το οποίο φαίνεται πιο κάτω.',
-'passwordreset-emailerror-capture' => 'Ένα μήνυμα υπενθÏμισης ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου έχει δημιουÏγηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο χÏήστη: $1',
+'passwordreset-emailerror-capture' => 'Ένα email επαναφοÏάς ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î­Ï‡ÎµÎ¹ δημιουÏγηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο χÏήστη: $1',
# Special:ChangeEmail
'changeemail' => 'Αλλαγή της διεÏθυνσης ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
@@ -910,6 +912,7 @@ $2
'changeemail-oldemail' => 'ΤÏέχουσα διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου:',
'changeemail-newemail' => 'Îέα διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου:',
'changeemail-none' => '(κανένα)',
+'changeemail-password' => 'Ο κωδικός Ï€Ïόσβασής σας στο εγχείÏημα {{SITENAME}}:',
'changeemail-submit' => 'Αλλαγή διεÏθυνσης ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
'changeemail-cancel' => 'ΑκÏÏωση',
@@ -1082,7 +1085,6 @@ $2
'template-semiprotected' => '(ημιπÏοστατευμένη)',
'hiddencategories' => 'Αυτή η σελίδα είναι μέλος {{PLURAL:$1|μίας κÏυμμένης κατηγοÏίας|$1 κÏυμμένων κατηγοÏιών}}',
'edittools' => '<!-- Το κείμενο εδώ θα φαίνεται κάτω από τις φόÏμες επεξεÏγασίας και επιφόÏτωσης. -->',
-'nocreatetitle' => 'ΠεÏιοÏισμένη δημιουÏγία σελίδων',
'nocreatetext' => 'Το {{SITENAME}} έχει πεÏιοÏίσει την ικανότητα δημιουÏγίας νέων σελίδων.
ΜποÏείτε να πάτε πίσω και να επεξεÏγαστείτε μια υπάÏχουσα σελίδα, ή να [[Special:UserLogin|συνδεθείτε ή να δημιουÏγήσετε ένα λογαÏιασμό]].',
'nocreate-loggedin' => 'Δεν έχετε άδεια να δημιουÏγήσετε νέες σελίδες.',
@@ -1107,6 +1109,15 @@ $2
'edit-already-exists' => 'Δεν ήταν εφικτό να δημιουÏγηθεί η νέα σελίδα.
ΥπάÏχει ήδη.',
'defaultmessagetext' => 'ΠÏοεπιλεγμένο κείμενο μηνÏματος',
+'content-failed-to-parse' => 'Απέτυχε η ανάλυση πεÏιεχομένου του $2 για το μοντέλο $1:$3',
+'invalid-content-data' => 'Μη έγκυÏα δεδομένα πεÏιεχομένου',
+'content-not-allowed-here' => 'Το πεÏιεχόμενο «$1» δεν επιτÏέπεται στη σελίδα [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'βικικείμενο',
+'content-model-text' => 'απλό κείμενο',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'ΠÏοειδοποίηση: Αυτή η σελίδα πεÏιέχει πάÏα Ï€Î¿Î»Ï Î±ÎºÏιβό αναλυτή λειτουÏγικών κλήσεων.
@@ -1466,9 +1477,9 @@ $1",
'prefs-emailconfirm-label' => 'Επιβεβαίωση e-mail:',
'prefs-textboxsize' => 'Μέγεθος πλαίσιου επεξεÏγασίας',
'youremail' => 'ΗλεκτÏονική διεÏθυνση*',
-'username' => 'Όνομα χÏήστη:',
-'uid' => 'ΑÏιθμός αναγνώÏισης χÏήστη:',
-'prefs-memberingroups' => 'Μέλος {{PLURAL:$1|ομάδας|ομάδων}}:',
+'username' => '{{GENDER:$1|Όνομα χÏήστη}}:',
+'uid' => '{{GENDER:$1|ΑναγνωÏιστικό χÏήστη}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Μέλος}} της {{PLURAL:$1|ομάδας|ομάδων}}:',
'prefs-registration' => 'ΧÏόνος εγγÏαφής:',
'yourrealname' => 'ΠÏαγματικό όνομα:',
'yourlanguage' => 'Γλώσσα:',
@@ -1616,12 +1627,13 @@ $1",
'right-sendemail' => 'Αποστολή ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Î¼Î·Î½Ïματος σε άλλους χÏήστες',
'right-passwordreset' => 'Εμφάνιση email επαναφοÏάς ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης',
+# Special:Log/newusers
+'newuserlogpage' => 'ΑÏχείο δημιουÏγίας χÏηστών',
+'newuserlogpagetext' => 'Αυτή είναι μια καταγÏαφή δημιουÏγίας χÏηστών.',
+
# User rights log
'rightslog' => 'ΑÏχείο καταγÏαφών δικαιωμάτων χÏηστών',
'rightslogtext' => 'ΚαταγÏαφές των αλλαγών στα δικαιώματα χÏηστών.',
-'rightslogentry' => 'η ιδιότητα μέλους ομάδας για τον/την $1 από $2 σε $3 άλλαξε',
-'rightslogentry-autopromote' => 'Ï€Ïοωθήθηκε αυτόματα από $2 σε $3',
-'rightsnone' => '(κανένα)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'να διαβάσετε αυτή τη σελίδα',
@@ -1859,6 +1871,7 @@ $1',
'backend-fail-notsame' => 'Ένα μη-ταυτόσημο αÏχείο υπάÏχει ήδη στο $1.',
'backend-fail-invalidpath' => '$1 δεν είναι έγκυÏη διαδÏομή αποθήκευσης.',
'backend-fail-delete' => 'ΑδÏνατη η διαγÏαφή αÏχείου $1.',
+'backend-fail-describe' => 'Δεν ήταν δυνατή η αλλαγή μεταδεδομένων για το αÏχείο "$1".',
'backend-fail-alreadyexists' => 'Το αÏχείο $1 υπάÏχει ήδη.',
'backend-fail-store' => 'ΑδÏνατη η αποθήκευση του αÏχείου $1 σε $2.',
'backend-fail-copy' => 'ΑδÏνατη η αντιγÏαφή του αÏχείου από $1 σε $2.',
@@ -2084,6 +2097,8 @@ $1',
Αντιθέτως θα έπÏεπε να κατευθÏνουν στο κατάλληλο θέμα.<br />
Μια σελίδα αντιμετωπίζεται ως σελίδα αποσαφήνισης αν χÏησιμοποιεί ένα Ï€Ïότυπο το οποίο συνδέεται από το [[MediaWiki:Disambiguationspage]]",
+'pageswithprop-prop' => 'Όνομα ιδιότητας:',
+
'doubleredirects' => 'Διπλές ανακατευθÏνσεις',
'doubleredirectstext' => 'Αυτή η σελίδα συγκαταλέγει σελίδες οι οποίες ανακατευθÏνουν σε άλλες σελίδες ανακατεÏθυνσης. Κάθε σειÏά πεÏιέχει συνδέσμους Ï€Ïος την Ï€Ïώτη και τη δεÏτεÏη σελίδα ανακατεÏθυνσης, όπως επίσης και την Ï€Ïώτη αÏάδα του κειμένου στη δεÏτεÏη σελίδα ανακατεÏθυνσης η οποία και είναι, κανονικά, ο Ï€Ïαγματικός Ï€ÏοοÏισμός της ανακατεÏθυνσης -εκεί δηλαδή όπου θα έπÏεπε να είχατε οδηγηθεί από την αÏχή. Τα <del>διεγÏαμμένα</del> λήμματα έχουν επιλυθεί.',
'double-redirect-fixed-move' => 'Η [[$1]] έχει μετακινηθεί, Ï„ÏŽÏα είναι ανακατεÏθυνση στην [[$2]]',
@@ -2232,9 +2247,9 @@ $1',
'linksearch-pat' => 'Μοτίβο αναζήτησης:',
'linksearch-ns' => 'ΠεÏιοχή:',
'linksearch-ok' => 'Αναζήτηση',
-'linksearch-text' => 'ΜποÏοÏν να χÏησιμοποιηθοÏν χαÏακτήÏες-Î¼Ï€Î±Î»Î±Î½Ï„Î­Ï ÏŒÏ€Ï‰Ï‚ «*.wikipedia.org».
-ΧÏειάζεται τουλάχιστον ένα domain ανωτάτου επιπέδου, για παÏάδειγμα «*.org».<br />
-ΥποστηÏιζόμενα Ï€Ïωτόκολλα: <code>$1</code> (η Ï€Ïοεπιλογή είναι http:// αν δεν καθοÏίζεται Ï€Ïωτόκολλο).',
+'linksearch-text' => 'ΜποÏοÏν να χÏησιμοποιηθοÏν χαÏακτήÏες Î¼Ï€Î±Î»Î±Î½Ï„Î­Ï ÏŒÏ€Ï‰Ï‚ "*.wikipedia.org".
+ΧÏειάζεται τουλάχιστον μια κατάληξη ανωτάτου επιπέδου, για παÏάδειγμα "*.org".<br />
+{{PLURAL:$2|ΥποστηÏιζόμενο Ï€Ïωτόκολλο|ΥποστηÏιζόμενα Ï€Ïωτόκολλα}}: <code>$1</code> (αν δεν οÏιστεί Ï€Ïωτόκολλο η Ï€Ïοεπιλογή είναι http://).',
'linksearch-line' => 'Η $1 συνδεδεμένη από την $2',
'linksearch-error' => 'Λέξεις-Î¼Ï€Î±Î»Î±Î½Ï„Î­Ï Î¼Ï€Î¿Ïεί να εμφανιστοÏν μόνο στην αÏχή Ï„Î¿Ï Î¿Î½ÏŒÎ¼Î±Ï„Î¿Ï‚ ιστοτόπου (hostname).',
@@ -2253,10 +2268,6 @@ $1',
'activeusers-hidesysops' => 'ΑπόκÏυψη διαχειÏιστών',
'activeusers-noresult' => 'Δεν βÏέθηκε χÏήστης.',
-# Special:Log/newusers
-'newuserlogpage' => 'ΑÏχείο δημιουÏγίας χÏηστών',
-'newuserlogpagetext' => 'Αυτή είναι μια καταγÏαφή δημιουÏγίας χÏηστών.',
-
# Special:ListGroupRights
'listgrouprights' => 'Δικαιώματα ομάδων χÏηστών',
'listgrouprights-summary' => 'Ακόλουθεί μία λίστα με τις ομάδες χÏηστών σε αυτό το wiki καθώς και με τα δικαιώματα Ï€Ïόσβασης αυτών.
@@ -2354,44 +2365,49 @@ $1',
'enotif_mailer' => 'ΣÏστημα ειδοποίησης μέσω αλληλογÏαφίας του {{SITENAME}}',
'enotif_reset' => 'Σημειώστε όλες τις σελίδες ως αναγνωσμένες.',
-'enotif_newpagetext' => 'Αυτή είναι μια νέα σελίδα.',
'enotif_impersonal_salutation' => 'ΧÏήστης του ιστοτόπου "{{SITENAME}}"',
-'changed' => 'έχει αλλάξει',
-'created' => 'δημιουÏγήθηκε',
-'enotif_subject' => 'Η σελίδα $PAGETITLE του εγχειÏήματος {{SITENAME}} $CHANGEDORCREATED από το χÏήστη $PAGEEDITOR',
+'enotif_subject_deleted' => 'Η σελίδα $1 του ιστοχώÏου {{SITENAME}} έχει διαγÏαφεί από {{gender:$2|τον|την}} $2',
+'enotif_subject_created' => 'Η σελίδα $1 του ιστοχώÏου {{SITENAME}} έχει δημιουÏγηθεί από {{gender:$2|τον|την}} $2',
+'enotif_subject_moved' => 'Η σελίδα $1 του ιστοχώÏου {{SITENAME}} έχει μετακινηθεί από {{gender:$2|τον|την}} $2',
+'enotif_subject_restored' => 'Η σελίδα $1 του ιστοχώÏου {{SITENAME}} έχει αποκατασταθεί από {{gender:$2|τον|την}} $2',
+'enotif_subject_changed' => 'Η σελίδα $1 του ιστοχώÏου {{SITENAME}} έχει αλλάξει από {{gender:$2|τον|την}} $2',
+'enotif_body_intro_deleted' => 'Η σελίδα $1 του ιστοχώÏου {{SITENAME}} έχει διαγÏαφεί στις $PAGEEDITDATE από {{gender:$2|τον|την}} $2, βλ. $3.',
+'enotif_body_intro_created' => 'Η σελίδα $1 του ιστοχώÏου {{SITENAME}} έχει δημιουÏγηθεί στις $PAGEEDITDATE από {{gender:$2|τον|την}} $2, βλ. $3 για την Ï„Ïέχουσα αναθεώÏηση.',
+'enotif_body_intro_moved' => 'Η σελίδα $1 του ιστοχώÏου {{SITENAME}} έχει μετακινηθεί στις $PAGEEDITDATE από {{gender:$2|τον|την}} $2, βλ. $3 για την Ï„Ïέχουσα αναθεώÏηση.',
+'enotif_body_intro_restored' => 'Η σελίδα $1 του ιστοχώÏου {{SITENAME}} έχει αποκατασταθεί στις $PAGEEDITDATE από {{gender:$2|τον|την}} $2, βλ. $3 για την Ï„Ïέχουσα αναθεώÏηση.',
+'enotif_body_intro_changed' => 'Η σελίδα $1 του ιστοχώÏου {{SITENAME}} έχει αλλάξει στις $PAGEEDITDATE από {{gender:$2|τον|την}} $2, βλ. $3 για την Ï„Ïέχουσα αναθεώÏηση.',
'enotif_lastvisited' => 'Δείτε το $1 για όλες τις αλλαγές που έγιναν από την τελευταία σας επίσκεψη.',
'enotif_lastdiff' => 'Δείτε το $1 για να εμφανίσετε αυτή την αλλαγή.',
'enotif_anon_editor' => 'ανώνυμος χÏήστης $1',
'enotif_body' => '{{GENDER:$WATCHINGUSERNAME|Αγαπητέ|Αγαπητή}} $WATCHINGUSERNAME,
-Η σελίδα $PAGETITLE του εγχειÏήματος {{SITENAME}} $CHANGEDORCREATED στις $PAGEEDITDATE από {{GENDER:$PAGEEDITOR|τον χÏήστη|την χÏήστη}} $PAGEEDITOR - ακολουθήστε το σÏνδεσμο $PAGETITLE_URL για να δείτε την Ï„Ïέχουσα αναθεώÏηση.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
ΠεÏιγÏαφή επεξεÏγασίας: $PAGESUMMARY $PAGEMINOREDIT
-Επικοινωνήστε με {{GENDER:$PAGEEDITOR|το συγκεκÏιμένο χÏήστη|τη συγκεκÏιμένη χÏήστη}} :
-mail: $PAGEEDITOR_EMAIL
+Επικοινωνία με το χÏήστη που έκανε την επεξεÏγασία:
+ηλεκτÏονική διεÏθυνση: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Δεν θα υπάÏξουν άλλες ειδοποιήσεις για πεÏαιτέÏω αλλαγές αν δεν επισκεφθείτε τη σελίδα.
-ΜποÏείτε επίσης να επαναφέÏετε την επιλογή ειδοποίησης για όλες τις παÏακολουθοÏμενες σελίδες στη λίστα παÏακολοÏθησής σας.
+Δεν θα υπάÏξουν άλλες ειδοποιήσεις σε πεÏίπτωση πεÏαιτέÏω δÏαστηÏιότητας αν δεν επισκεφθείτε τη σελίδα. ΜποÏείτε επίσης να επαναφέÏετε την επιλογή ειδοποίησης για όλες τις παÏακολουθοÏμενες σελίδες στη λίστα παÏακολοÏθησής σας.
Φιλικά,
- Tο σÏστημα ειδοποίησης του εγχειÏήματος {{SITENAME}}
+ Tο σÏστημα ειδοποίησης του ιστοχώÏου {{SITENAME}}
--
-Για να αλλάξετε τις Ï€Ïοτιμήσεις της ειδοποιήσεων email, ακολουθήστε το σÏνδεσμο:
+Για να αλλάξετε τις Ï€Ïοτιμήσεις των ειδοποιήσεων ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου, επισκεφτείτε το
{{canonicalurl:{{#special:Preferences}}}}
-Για να αλλάξετε τις Ï€Ïοτιμήσεις της λίστας παÏακολοÏθησής σας, ακολουθήστε το σÏνδεσμο:
+Για να αλλάξετε τις Ï€Ïοτιμήσεις της λίστας παÏακολοÏθησής σας, επισκεφτείτε το
{{canonicalurl:{{#special:EditWatchlist}}}}
-Για να διαγÏάψετε την σελίδα από την λίστα παÏακολοÏθησής σας:
+Για να διαγÏάψετε την σελίδα από την λίστα παÏακολοÏθησής σας, επισκεφτείτε το
$UNWATCHURL
-ΕÏωτήσεις και πεÏισσότεÏες πληÏοφοÏίες:
+ΠαÏατηÏήσεις και πεÏισσότεÏη βοήθεια:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'δημιουÏγήθηκε',
+'changed' => 'έχει αλλάξει',
# Delete
'deletepage' => 'ΔιαγÏαφή σελίδας',
@@ -2458,6 +2474,8 @@ $UNWATCHURL
'prot_1movedto2' => 'Η [[$1]] μετακινήθηκε στη θέση [[$2]]',
'protect-badnamespace-title' => 'Μη-Ï€Ïοστατευόμενη ομάδα σελίδων',
'protect-badnamespace-text' => 'Οι σελίδες σε αυτόν τον ονοματοχώÏο δεν μποÏοÏν να κλειδωθοÏν.',
+'protect-norestrictiontypes-text' => 'Αυτή η σελίδα δεν μποÏοÏν να Ï€ÏοστατευθοÏν δεδομένου ότι δεν υπάÏχουν διαθέσιμοι Ï„Ïποι κλειδώματος.',
+'protect-norestrictiontypes-title' => 'Μη-Ï€Ïοστατευόμενη σελίδα',
'protect-legend' => 'Επιβεβαίωση κλειδώματος',
'protectcomment' => 'Αιτία:',
'protectexpiry' => 'Λήξη',
@@ -2541,7 +2559,7 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|Ï„Ïοποποίηση|Ï„Ïοποποιήσεις}} αποκαταστάθηκαν',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|αναθεώÏηση|αναθεωÏήσεις}} και $2 {{PLURAL:$2|αÏχείο|αÏχεία}} επαναφέÏθηκαν',
'undeletedfiles' => '$1 {{PLURAL:$1|αÏχείο|αÏχεία}} επαναφέÏθηκαν',
-'cannotundelete' => 'Η επαναφοÏά απέτυχε: κάποιος άλλος μποÏεί να έχει επαναφέÏει τη σελίδα Ï€Ïώτος.',
+'cannotundelete' => 'Η αναίÏεση διαγÏαφής απέτυχε: $1',
'undeletedpage' => "'''Η $1 έχει επαναφεÏθεί'''
Συμβουλευτείτε το [[Special:Log/delete|αÏχείο καταγÏαφής διαγÏαφών]] για ένα μητÏώο των Ï€Ïόσφατων διαγÏαφών και επαναφοÏών.",
@@ -2572,7 +2590,7 @@ $1',
'blanknamespace' => '(ΑÏχική πεÏιοχή)',
# Contributions
-'contributions' => 'ΣυνεισφοÏές χÏήστη',
+'contributions' => 'ΣυνεισφοÏές {{GENDER:$1|χÏήστη}}',
'contributions-title' => 'ΣυνεισφοÏές του χÏήστη $1',
'mycontris' => 'ΣυνεισφοÏές',
'contribsub2' => 'Για τον/την $1 ($2)',
@@ -2964,7 +2982,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'Δοκιμή JavaScript',
-'javascripttest-disabled' => 'Αυτή η λειτουÏγία έχει απενεÏγοποιηθεί.',
'javascripttest-title' => 'ΕκτελοÏνται $1 δοκιμές',
'javascripttest-pagetext-noframework' => 'Αυτή η σελίδα είναι δεσμευμένη για την εκτέλεση δοκιμών σε JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Άγνωστο πλαίσιο δοκιμών " $1 ".',
@@ -3104,11 +3121,13 @@ $1',
'pageinfo-default-sort' => 'ΠÏοεπιλεγμένο κλειδί ταξινόμησης',
'pageinfo-length' => 'Μήκος σελίδας (σε bytes)',
'pageinfo-article-id' => 'ΑναγνωÏιστικό σελίδας',
+'pageinfo-language' => 'Γλώσσα σελίδας πεÏιεχομένου',
'pageinfo-robot-policy' => 'Στάτους μηχανής αναζήτησης',
'pageinfo-robot-index' => 'ΚαταχωÏήσιμο σε ευÏετήÏιο',
'pageinfo-robot-noindex' => 'Μη καταχωÏήσιμο σε ευÏετήÏιο',
'pageinfo-views' => 'ΑÏιθμός Ï€Ïοβολών',
'pageinfo-watchers' => 'ΑÏιθμός παÏατηÏητών σελίδας',
+'pageinfo-few-watchers' => 'ΛιγότεÏοι από $1 {{PLURAL:$1| ακόλουθος|ακόλουθοι}}',
'pageinfo-redirects-name' => 'ΑνακατευθÏνσεις σε αυτή τη σελίδα',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'Υποσελίδες αυτής της σελίδας',
@@ -3124,6 +3143,19 @@ $1',
'pageinfo-magic-words' => '{{PLURAL:$1|Μαγική λέξη|Μαγικές λέξεις}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|ΚÏυφή κατηγοÏία|ΚÏυφές κατηγοÏίες}} ($1)',
'pageinfo-templates' => 'Ενσωματωμένα {{PLURAL:$1|Ï€Ïότυπο|Ï€Ïότυπα}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Η σελίδα ενσωματώνεται|Οι σελίδες ενσωματώνονται}} σε ($1)',
+'pageinfo-toolboxlink' => 'ΠληÏοφοÏίες σελίδας',
+'pageinfo-redirectsto' => 'ΑνακατευθÏνσεις σε',
+'pageinfo-redirectsto-info' => 'πληÏοφοÏίες',
+'pageinfo-contentpage' => 'Υπολογίζονται ως σελίδες πεÏιεχομένου',
+'pageinfo-contentpage-yes' => 'Îαι',
+'pageinfo-protect-cascading' => 'Οι Ï€Ïοστασίες ξεκινοÏν τη διαδοχή τους από εδώ',
+'pageinfo-protect-cascading-yes' => 'Îαι',
+'pageinfo-protect-cascading-from' => 'Οι Ï€Ïοστασίες ξεκινοÏν τη διαδοχή τους από',
+'pageinfo-category-info' => 'ΠληÏοφοÏίες κατηγοÏίας',
+'pageinfo-category-pages' => 'ΑÏιθμός σελίδων',
+'pageinfo-category-subcats' => 'ΑÏιθμός υποκατηγοÏιών',
+'pageinfo-category-files' => 'ΑÏιθμός αÏχείων',
# Skin names
'skinname-standard' => 'Κλασσικό',
@@ -3142,6 +3174,8 @@ $1',
'markedaspatrollederror' => 'Δεν μποÏεί να σημανθεί ως υπό πεÏιπολία',
'markedaspatrollederrortext' => 'ΠÏέπει να οÏίσετε μια αναθεώÏηση για να σημανθεί ως υπό πεÏιπολία',
'markedaspatrollederror-noautopatrol' => 'Δεν επιτÏέπεται να σημάνετε τις δικές σας αλλάγες ως υπό πεÏιπολία.',
+'markedaspatrollednotify' => 'Αυτή η αλλαγή σε $1 έχει επισημανθεί ως ελεγμένη.',
+'markedaspatrollederrornotify' => 'Σήμανση ως ελεγμένη απέτυχε.',
# Patrol log
'patrol-log-page' => 'ΑÏχείο καταγÏαφής πεÏιπολιών',
@@ -3175,6 +3209,7 @@ $1',
'file-nohires' => 'Δεν διατίθεται υψηλότεÏη ανάλυση.',
'svg-long-desc' => "ΑÏχείο SVG, κατ' όνομα $1 × $2 εικονοστοιχεία, μέγεθος αÏχείου: $3",
'svg-long-desc-animated' => 'ΚινοÏμενο αÏχείο SVG, ονομαστικό μέγεθος σε pixels: $1 × $2, μέγεθος αÏχείου: $3',
+'svg-long-error' => 'Μη έγκυÏο αÏχείο SVG: $1',
'show-big-image' => 'ΠλήÏης ανάλυση',
'show-big-image-preview' => 'Μέγεθος αυτής της Ï€Ïοεπισκόπησης: $1 .',
'show-big-image-other' => 'Άλλες {{PLURAL:$2|ανάλυση|αναλÏσεις}}: $1.',
@@ -3204,7 +3239,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 λεπτό|$1 λεπτά}}',
'hours' => '{{PLURAL:$1|$1 ÏŽÏα|$1 ÏŽÏες}}',
'days' => '{{PLURAL:$1|$1 μέÏα|$1 μέÏες}}',
+'months' => '{{PLURAL:$1|$1 μήνας|$1 μήνες}}',
+'years' => '{{PLURAL:$1|$1 έτος|$1 έτη}}',
'ago' => '$1 Ï€Ïιν',
+'just-now' => 'μόλις Ï„ÏŽÏα',
# Bad image list
'bad_image_list' => 'Η σÏνταξη είναι ως εξής:
@@ -3704,6 +3742,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[Η ενσωμάτωση εξωτεÏικών ιστοσελίδων σε αυτό το Wiki είναι απενεÏγοποιημένη.]',
'scarytranscludefailed' => '[Η λήψη Ï€ÏοτÏπου για το $1 απέτυχε.]',
+'scarytranscludefailed-httpstatus' => '[Η λήψη Ï€ÏοτÏπου απέτυχε για το $1: HTTP $2]',
'scarytranscludetoolong' => '[Η διεÏθυνση URL είναι Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î·.]',
# Delete conflict
@@ -3813,6 +3852,7 @@ $5
'version-license' => 'Άδεια χÏήσης',
'version-poweredby-credits' => "Αυτό το wiki λειτουÏγεί με το λογισμικό '''[//www.mediawiki.org/ MediaWiki]''', πνευματική ιδιοκτησία © 2001-$1 $2.",
'version-poweredby-others' => 'άλλοι',
+'version-credits-summary' => 'Θα θέλαμε να αναγνωÏίσουμε τη συμβολή των παÏακάτω Ï€Ïοσώπων στο [[Special:Version|MediaWiki]].',
'version-license-info' => "Το MediaWiki είναι ελεÏθεÏο λογισμικό. ΜποÏείτε να το αναδιανείμετε ή/και να το Ï„Ïοποποιήσετε υπό τους ÏŒÏους της άδειας GNU General Public License όπως αυτή εκδόθηκε από το Free Software Foundation· είτε της δεÏτεÏης έκδοσης της άδειας, είτε (κατ' επιλογή σας) οποιασδήποτε επόμενης έκδοσης.
Το MediaWiki διανέμεται με την ελπίδα ότι θα είναι χÏήσιμο, αλλά ΧΩΡΙΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ· οÏτε καν την σιωπηÏή εγγÏηση ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ή ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΕÎΑ ΣΥΓΚΕΚΡΙΜΕÎΟ ΣΚΟΠΟ. Βλ. GNU General Public License για πεÏισσότεÏες λεπτομέÏειες.
@@ -3927,7 +3967,7 @@ $5
# New logging system
'logentry-delete-delete' => '{{GENDER:$1|Ο|Η}} $1 διέγÏαψε τη σελίδα $3',
-'logentry-delete-restore' => 'Ο/η $1 αποκατέστησε τη σελίδα $3',
+'logentry-delete-restore' => 'Ο/Η $1 αποκατέστησε τη σελίδα $3',
'logentry-delete-event' => '{{GENDER:$1|Ο|Η}} $1 άλλαξε την οÏατότητα σε {{PLURAL:$5|ένα γεγονός καταγÏαφής|$5 log events}} στο $3: $4',
'logentry-delete-revision' => '{{GENDER:$1|Ο|Η}} $1 άλλαξε την οÏατότητα {{PLURAL:$5|μιας έκδοσης|$5 εκδόσεων}} στη σελίδα $3: $4',
'logentry-delete-event-legacy' => '{{GENDER:$2|Ο|Η}} $1 άλλαξε την οÏατότητα των καταγÏαφόμενων συμβάντων στη σελίδα $3',
@@ -3948,14 +3988,18 @@ $5
'logentry-move-move' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4',
'logentry-move-move-noredirect' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4 χωÏίς να αφήσει ανακατεÏθυνση',
'logentry-move-move_redir' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4 πάνω από την ανανακατεÏθυνση',
-'logentry-move-move_redir-noredirect' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε την σελίδα $3 στην $4 πάνω από ανακατεÏθυνση χωÏίς να αφήσει ανακατεÏθυνση',
-'logentry-patrol-patrol' => '{{GENDER:$1|Ο|Η}} $1 σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
+'logentry-move-move_redir-noredirect' => '{{GENDER:$2|Ο|Η}} $1 μετακίνησε την σελίδα $3 στην $4 πάνω από μια ανακατεÏθυνση χωÏίς να αφήσει ανακατεÏθυνση',
+'logentry-patrol-patrol' => '{{GENDER:$2|Ο|Η}} $1 επισήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
'logentry-patrol-patrol-auto' => '{{GENDER:$1|Ο|Η}} $1 αυτόματα σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
-'logentry-newusers-newusers' => 'Ο λογαÏιασμός χÏήστη $1 δημιουÏγήθηκε',
-'logentry-newusers-create' => 'Ο λογαÏιασμός χÏήστη $1 δημιουÏγήθηκε',
-'logentry-newusers-create2' => 'Ο λογαÏιασμός χÏήστη $3 δημιουÏγήθηκε από {{GENDER:$1|τον|την}} $1',
+'logentry-newusers-newusers' => 'Ο λογαÏιασμός χÏήστη $1 {{GENDER:$2|δημιουÏγήθηκε}}',
+'logentry-newusers-create' => 'Ο λογαÏιασμός χÏήστη $1 {{GENDER:$2|δημιουÏγήθηκε}}',
+'logentry-newusers-create2' => 'Ο λογαÏιασμός χÏήστη $3 δημιουÏγήθηκε από {{GENDER:$2|τον|την}} $1',
+'logentry-newusers-byemail' => 'Ο λογαÏιασμός χÏήστη $3 δημιουÏγήθηκε από τον $1 και ο κωδικός Ï€Ïόσβασης εστάλη μέσω ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου',
'logentry-newusers-autocreate' => 'Ο λογαÏιασμός $1 δημιουÏγήθηκε αυτόματα',
-'newuserlog-byemail' => 'ο κωδικός έχει σταλεί μέσω ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Î¼Î·Î½Ïματος',
+'logentry-rights-rights' => '{{GENDER:$1|Ο|Η}} $1 άλλαξε την ιδιότητα μέλους ομάδας για {{GENDER:$3|τον|την}} $3 από $4 σε $5',
+'logentry-rights-rights-legacy' => '{{GENDER:$1|Ο|Η}} $1 άλλαξε την ιδιότητα μέλους ομάδας {{GENDER:$1|του|της}} $3',
+'logentry-rights-autopromote' => '$1 Ï€Ïοωθήθηκε αυτόματα από το $4 στο $5',
+'rightsnone' => '(κανένα)',
# Feedback
'feedback-bugornote' => 'Εάν είστε έτοιμοι να πεÏιγÏάψετε ένα τεχνικό Ï€Ïόβλημα λεπτομεÏÏŽÏ‚ παÏακαλώ [ $1 κάντε μια αναφοÏά σφάλματος].
@@ -4009,6 +4053,7 @@ $5
'api-error-ok-but-empty' => 'ΕσωτεÏικό σφάλμα: δεν υπάÏχει απάντηση από το διακομιστή.',
'api-error-overwrite' => 'Αντικατάσταση ενός υπάÏχοντος αÏχείου δεν επιτÏέπεται.',
'api-error-stashfailed' => 'ΕσωτεÏικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεÏσει το Ï€ÏοσωÏινό αÏχείο.',
+'api-error-publishfailed' => 'ΕσωτεÏικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεÏσει το Ï€ÏοσωÏινό αÏχείο.',
'api-error-timeout' => 'Ο διακομιστής δεν αποκÏίθηκε εντός του αναμενόμενου χÏόνου.',
'api-error-unclassified' => 'ΠÏοέκυψε ένα άγνωστο σφάλμα.',
'api-error-unknown-code' => 'Άγνωστο σφάλμα: "$1"',
@@ -4029,4 +4074,7 @@ $5
'duration-centuries' => '$1 {{PLURAL:$1|αιώνα|αιώνες}}',
'duration-millennia' => '$1 {{PLURAL:$1|χιλιετία|χιλιετίες}}',
+# Image rotation
+'rotate-comment' => 'Η εικόνα πεÏιστÏάφηκε $1 {{PLURAL:$1| μοίÏα|μοίÏες}} δεξιόστÏοφα',
+
);
diff --git a/languages/messages/MessagesEml.php b/languages/messages/MessagesEml.php
index b0fd2ad3..3db105df 100644
--- a/languages/messages/MessagesEml.php
+++ b/languages/messages/MessagesEml.php
@@ -99,6 +99,9 @@ Nutêv ca alcuni pàgini i putrèbber cuntinuèr a cràdder ca vueter a-sîv dis
'yourrealname' => 'Al tô vér nàmm:',
'yourlanguage' => 'Léngua:',
+# Special:Log/newusers
+'newuserlogpage' => 'Regestér di nÅv utèint',
+
# Recent changes
'recentchanges' => 'Ûltem cambiamèint',
'diff' => 'diferèinzi',
@@ -129,9 +132,6 @@ Nutêv ca alcuni pàgini i putrèbber cuntinuèr a cràdder ca vueter a-sîv dis
# Special:AllPages
'allpages' => 'Tôt al pàgin',
-# Special:Log/newusers
-'newuserlogpage' => 'Regestér di nÅv utèint',
-
# Watchlist
'watchlist' => 'Al còsi ca guèrd',
'watch' => 'Tîn a drê',
diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php
index 3a71ce68..50ad98c2 100644
--- a/languages/messages/MessagesEn.php
+++ b/languages/messages/MessagesEn.php
@@ -13,7 +13,7 @@
*/
/**
- * Fallback language, used for all unspecified messages and behaviour. This
+ * Fallback language, used for all unspecified messages and behavior. This
* is English by default, for all files other than this one.
*
* Do NOT set this to false in any other message file! Leave the line out to
@@ -188,7 +188,7 @@ $bookstoreList = array(
/**
* Magic words
- * Customisable syntax for wikitext and elsewhere.
+ * Customizable syntax for wikitext and elsewhere.
*
* IDs must be valid identifiers, they cannot contain hyphens.
* CASE is 0 to match all case variants, 1 for case-sensitive
@@ -322,6 +322,7 @@ $magicWords = array(
'raw' => array( 0, 'RAW:' ),
'displaytitle' => array( 1, 'DISPLAYTITLE' ),
'rawsuffix' => array( 1, 'R' ),
+ 'nocommafysuffix' => array( 0, 'NOSEP' ),
'newsectionlink' => array( 1, '__NEWSECTIONLINK__' ),
'nonewsectionlink' => array( 1, '__NONEWSECTIONLINK__' ),
'currentversion' => array( 1, 'CURRENTVERSION' ),
@@ -429,6 +430,7 @@ $specialPageAliases = array(
'Myuploads' => array( 'MyUploads' ),
'Newimages' => array( 'NewFiles', 'NewImages' ),
'Newpages' => array( 'NewPages' ),
+ 'PagesWithProp' => array( 'PagesWithProp', 'Pageswithprop', 'PagesByProp', 'Pagesbyprop' ),
'PasswordReset' => array( 'PasswordReset' ),
'PermanentLink' => array( 'PermanentLink', 'PermaLink' ),
'Popularpages' => array( 'PopularPages' ),
@@ -441,7 +443,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'RecentChanges' ),
'Recentchangeslinked' => array( 'RecentChangesLinked', 'RelatedChanges' ),
'Revisiondelete' => array( 'RevisionDelete' ),
- 'RevisionMove' => array( 'RevisionMove' ),
'Search' => array( 'Search' ),
'Shortpages' => array( 'ShortPages' ),
'Specialpages' => array( 'SpecialPages' ),
@@ -570,6 +571,7 @@ $preloadedMessages = array(
'searcharticle',
'searchbutton',
'sidebar',
+ 'navigation-heading',
'site-atom-feed',
'sitenotice',
'specialpages',
@@ -773,6 +775,7 @@ XHTML id names.
'newwindow' => '(opens in new window)',
'cancel' => 'Cancel',
'moredotdotdot' => 'More...',
+'morenotlisted' => 'More not listed...',
'mypage' => 'Page',
'mytalk' => 'Talk',
'anontalk' => 'Talk for this IP address',
@@ -784,7 +787,6 @@ XHTML id names.
'qbbrowse' => 'Browse',
'qbedit' => 'Edit',
'qbpageoptions' => 'This page',
-'qbpageinfo' => 'Context',
'qbmyoptions' => 'My pages',
'qbspecialpages' => 'Special pages',
'faq' => 'FAQ',
@@ -809,71 +811,72 @@ XHTML id names.
'namespaces' => 'Namespaces',
'variants' => 'Variants',
-'errorpagetitle' => 'Error',
-'returnto' => 'Return to $1.',
-'tagline' => 'From {{SITENAME}}',
-'help' => 'Help',
-'search' => 'Search',
-'searchbutton' => 'Search',
-'go' => 'Go',
-'searcharticle' => 'Go',
-'history' => 'Page history',
-'history_short' => 'History',
-'updatedmarker' => 'updated since my last visit',
-'printableversion' => 'Printable version',
-'permalink' => 'Permanent link',
-'print' => 'Print',
-'view' => 'View',
-'edit' => 'Edit',
-'create' => 'Create',
-'editthispage' => 'Edit this page',
-'create-this-page' => 'Create this page',
-'delete' => 'Delete',
-'deletethispage' => 'Delete this page',
-'undelete_short' => 'Undelete {{PLURAL:$1|one edit|$1 edits}}',
-'viewdeleted_short' => 'View {{PLURAL:$1|one deleted edit|$1 deleted edits}}',
-'protect' => 'Protect',
-'protect_change' => 'change',
-'protectthispage' => 'Protect this page',
-'unprotect' => 'Change protection',
-'unprotectthispage' => 'Change protection of this page',
-'newpage' => 'New page',
-'talkpage' => 'Discuss this page',
-'talkpagelinktext' => 'Talk',
-'specialpage' => 'Special page',
-'personaltools' => 'Personal tools',
-'postcomment' => 'New section',
-'addsection' => '+', # do not translate or duplicate this message to other languages
-'articlepage' => 'View content page',
-'talk' => 'Discussion',
-'views' => 'Views',
-'toolbox' => 'Toolbox',
-'userpage' => 'View user page',
-'projectpage' => 'View project page',
-'imagepage' => 'View file page',
-'mediawikipage' => 'View message page',
-'templatepage' => 'View template page',
-'viewhelppage' => 'View help page',
-'categorypage' => 'View category page',
-'viewtalkpage' => 'View discussion',
-'otherlanguages' => 'In other languages',
-'redirectedfrom' => '(Redirected from $1)',
-'redirectpagesub' => 'Redirect page',
-'talkpageheader' => '-', # do not translate or duplicate this message to other languages
-'lastmodifiedat' => 'This page was last modified on $1, at $2.',
-'viewcount' => 'This page has been accessed {{PLURAL:$1|once|$1 times}}.',
-'protectedpage' => 'Protected page',
-'jumpto' => 'Jump to:',
-'jumptonavigation' => 'navigation',
-'jumptosearch' => 'search',
-'view-pool-error' => 'Sorry, the servers are overloaded at the moment.
+'navigation-heading' => 'Navigation menu',
+'errorpagetitle' => 'Error',
+'returnto' => 'Return to $1.',
+'tagline' => 'From {{SITENAME}}',
+'help' => 'Help',
+'search' => 'Search',
+'searchbutton' => 'Search',
+'go' => 'Go',
+'searcharticle' => 'Go',
+'history' => 'Page history',
+'history_short' => 'History',
+'updatedmarker' => 'updated since my last visit',
+'printableversion' => 'Printable version',
+'permalink' => 'Permanent link',
+'print' => 'Print',
+'view' => 'View',
+'edit' => 'Edit',
+'create' => 'Create',
+'editthispage' => 'Edit this page',
+'create-this-page' => 'Create this page',
+'delete' => 'Delete',
+'deletethispage' => 'Delete this page',
+'undelete_short' => 'Undelete {{PLURAL:$1|one edit|$1 edits}}',
+'viewdeleted_short' => 'View {{PLURAL:$1|one deleted edit|$1 deleted edits}}',
+'protect' => 'Protect',
+'protect_change' => 'change',
+'protectthispage' => 'Protect this page',
+'unprotect' => 'Change protection',
+'unprotectthispage' => 'Change protection of this page',
+'newpage' => 'New page',
+'talkpage' => 'Discuss this page',
+'talkpagelinktext' => 'Talk',
+'specialpage' => 'Special page',
+'personaltools' => 'Personal tools',
+'postcomment' => 'New section',
+'addsection' => '+', # do not translate or duplicate this message to other languages
+'articlepage' => 'View content page',
+'talk' => 'Discussion',
+'views' => 'Views',
+'toolbox' => 'Toolbox',
+'userpage' => 'View user page',
+'projectpage' => 'View project page',
+'imagepage' => 'View file page',
+'mediawikipage' => 'View message page',
+'templatepage' => 'View template page',
+'viewhelppage' => 'View help page',
+'categorypage' => 'View category page',
+'viewtalkpage' => 'View discussion',
+'otherlanguages' => 'In other languages',
+'redirectedfrom' => '(Redirected from $1)',
+'redirectpagesub' => 'Redirect page',
+'talkpageheader' => '-', # do not translate or duplicate this message to other languages
+'lastmodifiedat' => 'This page was last modified on $1, at $2.',
+'viewcount' => 'This page has been accessed {{PLURAL:$1|once|$1 times}}.',
+'protectedpage' => 'Protected page',
+'jumpto' => 'Jump to:',
+'jumptonavigation' => 'navigation',
+'jumptosearch' => 'search',
+'view-pool-error' => 'Sorry, the servers are overloaded at the moment.
Too many users are trying to view this page.
Please wait a while before you try to access this page again.
$1',
-'pool-timeout' => 'Timeout waiting for the lock',
-'pool-queuefull' => 'Pool queue is full',
-'pool-errorunknown' => 'Unknown error',
+'pool-timeout' => 'Timeout waiting for the lock',
+'pool-queuefull' => 'Pool queue is full',
+'pool-errorunknown' => 'Unknown error',
# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
'aboutsite' => 'About {{SITENAME}}',
@@ -1066,10 +1069,10 @@ The administrator who locked it offered this explanation: "$3".',
# Login and logout pages
'logouttext' => "'''You are now logged out.'''
-You can continue to use {{SITENAME}} anonymously, or you can [[Special:UserLogin|log in again]] as the same or as a different user.
+You can continue to use {{SITENAME}} anonymously, or you can <span class='plainlinks'>[$1 log in again]</span> as the same or as a different user.
Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-'welcomecreation' => '== Welcome, $1! ==
-Your account has been created.
+'welcomeuser' => 'Welcome, $1!',
+'welcomecreation-msg' => 'Your account has been created.
Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
'yourname' => 'Username:',
'yourpassword' => 'Password:',
@@ -1094,7 +1097,7 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
'gotaccount' => 'Already have an account? $1.',
'gotaccountlink' => 'Log in',
'userlogin-resetlink' => 'Forgotten your login details?',
-'createaccountmail' => 'By email',
+'createaccountmail' => 'Use a temporary random password and send it to the email address specified below',
'createaccountreason' => 'Reason:',
'badretype' => 'The passwords you entered do not match.',
'userexists' => 'Username entered already in use.
@@ -1192,6 +1195,7 @@ Please wait before trying again.',
'php-mail-error' => '$1', # do not translate or duplicate this message to other languages
'php-mail-error-unknown' => "Unknown error in PHP's mail() function.",
'user-mail-no-addy' => 'Tried to send email without an email address.',
+'user-mail-no-body' => 'Tried to send email with an empty or unreasonably short body.',
# Change password dialog
'resetpass' => 'Change password',
@@ -1251,7 +1255,7 @@ password.',
Temporary password: $2',
'passwordreset-emailsent' => 'A password reset email has been sent.',
'passwordreset-emailsent-capture' => 'A password reset email has been sent, which is shown below.',
-'passwordreset-emailerror-capture' => 'A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1',
+'passwordreset-emailerror-capture' => 'A password reset email was generated, which is shown below, but sending it to the user failed: $1',
# Special:ChangeEmail
'changeemail' => 'Change email address',
@@ -1262,6 +1266,7 @@ Temporary password: $2',
'changeemail-oldemail' => 'Current email address:',
'changeemail-newemail' => 'New email address:',
'changeemail-none' => '(none)',
+'changeemail-password' => 'Your {{SITENAME}} password:',
'changeemail-submit' => 'Change email',
'changeemail-cancel' => 'Cancel',
@@ -1460,7 +1465,6 @@ The latest log entry is provided below for reference:",
'hiddencategories' => 'This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:',
'edittools' => '<!-- Text here will be shown below edit and upload forms. -->', # only translate this message to other languages if you have to change it
'edittools-upload' => '-', # only translate this message to other languages if you have to change it
-'nocreatetitle' => 'Page creation limited',
'nocreatetext' => '{{SITENAME}} has restricted the ability to create new pages.
You can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]].',
'nocreate-loggedin' => 'You do not have permission to create new pages.',
@@ -1487,6 +1491,15 @@ It already exists.',
'addsection-preload' => '', # do not translate or duplicate this message to other languages
'addsection-editintro' => '', # do not translate or duplicate this message to other languages
'defaultmessagetext' => 'Default message text',
+'content-failed-to-parse' => 'Failed to parse $2 content for $1 model: $3',
+'invalid-content-data' => 'Invalid content data',
+'content-not-allowed-here' => '"$1" content is not allowed on page [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'plain text',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Warning:''' This page contains too many expensive parser function calls.
@@ -1883,9 +1896,9 @@ This cannot be undone.',
'prefs-emailconfirm-label' => 'Email confirmation:',
'prefs-textboxsize' => 'Size of editing window',
'youremail' => 'Email:',
-'username' => 'Username:',
-'uid' => 'User ID:',
-'prefs-memberingroups' => 'Member of {{PLURAL:$1|group|groups}}:',
+'username' => '{{GENDER:$1|Username}}:',
+'uid' => '{{GENDER:$1|User}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|Member}} of {{PLURAL:$1|group|groups}}:',
'prefs-memberingroups-type' => '$1', # only translate this message to other languages if you have to change it
'prefs-registration' => 'Registration time:',
'prefs-registration-date-time' => '$1', # only translate this message to other languages if you have to change it
@@ -1942,6 +1955,7 @@ Your email address is not revealed when other users contact you.',
'saveusergroups' => 'Save user groups',
'userrights-groupsmember' => 'Member of:',
'userrights-groupsmember-auto' => 'Implicit member of:',
+'userrights-groupsmember-type' => '$1', # only translate this message to other languages if you have to change it
'userrights-groups-help' => 'You may alter the groups this user is in:
* A checked box means the user is in that group.
* An unchecked box means the user is not in that group.
@@ -2041,12 +2055,13 @@ Your email address is not revealed when other users contact you.',
'right-sendemail' => 'Send email to other users',
'right-passwordreset' => 'View password reset emails',
+# Special:Log/newusers
+'newuserlogpage' => 'User creation log',
+'newuserlogpagetext' => 'This is a log of user creations.',
+
# User rights log
-'rightslog' => 'User rights log',
-'rightslogtext' => 'This is a log of changes to user rights.',
-'rightslogentry' => 'changed group membership for $1 from $2 to $3',
-'rightslogentry-autopromote' => 'was automatically promoted from $2 to $3',
-'rightsnone' => '(none)',
+'rightslog' => 'User rights log',
+'rightslogtext' => 'This is a log of changes to user rights.',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'read this page',
@@ -2305,6 +2320,7 @@ If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
'backend-fail-notsame' => 'A non-identical file already exists at "$1".',
'backend-fail-invalidpath' => '"$1" is not a valid storage path.',
'backend-fail-delete' => 'Could not delete file "$1".',
+'backend-fail-describe' => 'Could not change metadata for file "$1".',
'backend-fail-alreadyexists' => 'The file "$1" already exists.',
'backend-fail-store' => 'Could not store file "$1" at "$2".',
'backend-fail-copy' => 'Could not copy file "$1" to "$2".',
@@ -2553,6 +2569,13 @@ Remember to check for other links to the templates before deleting them.',
They may have to link to a more appropriate page instead.<br />
A page is treated as a disambiguation page if it uses a template that is linked from [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Pages with a page property',
+'pageswithprop-summary' => '', # do not translate or duplicate this message to other languages
+'pageswithprop-legend' => 'Pages with a page property',
+'pageswithprop-text' => 'This page lists pages that use a particular page property.',
+'pageswithprop-prop' => 'Property name:',
+'pageswithprop-submit' => 'Go',
+
'doubleredirects' => 'Double redirects',
'doubleredirects-summary' => '', # do not translate or duplicate this message to other languages
'doubleredirectstext' => 'This page lists pages that redirect to other redirect pages.
@@ -2748,7 +2771,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'linksearch-ok' => 'Search',
'linksearch-text' => 'Wildcards such as "*.wikipedia.org" may be used.
Needs at least a top-level domain, for example "*.org".<br />
-Supported protocols: <code>$1</code> (defaults to http:// if no protocol is specified).',
+Supported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// if no protocol is specified).',
'linksearch-line' => '$1 is linked from $2',
'linksearch-error' => 'Wildcards may appear only at the start of the hostname.',
@@ -2768,10 +2791,6 @@ Supported protocols: <code>$1</code> (defaults to http:// if no protocol is spec
'activeusers-hidesysops' => 'Hide administrators',
'activeusers-noresult' => 'No users found.',
-# Special:Log/newusers
-'newuserlogpage' => 'User creation log',
-'newuserlogpagetext' => 'This is a log of user creations.',
-
# Special:ListGroupRights
'listgrouprights' => 'User group rights',
'listgrouprights-summary' => 'The following is a list of user groups defined on this wiki, with their associated access rights.
@@ -2871,20 +2890,23 @@ Future changes to this page and its associated talk page will be listed there.',
'enotif_mailer' => '{{SITENAME}} notification mailer',
'enotif_reset' => 'Mark all pages visited',
-'enotif_newpagetext' => 'This is a new page.',
'enotif_impersonal_salutation' => '{{SITENAME}} user',
-'changed' => 'changed',
-'created' => 'created',
-'enotif_subject' => '{{SITENAME}} page $PAGETITLE has been $CHANGEDORCREATED by $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}} page $1 has been {{GENDER:$2|deleted}} by $2',
+'enotif_subject_created' => '{{SITENAME}} page $1 has been {{GENDER:$2|created}} by $2',
+'enotif_subject_moved' => '{{SITENAME}} page $1 has been {{GENDER:$2|moved}} by $2',
+'enotif_subject_restored' => '{{SITENAME}} page $1 has been {{GENDER:$2|restored}} by $2',
+'enotif_subject_changed' => '{{SITENAME}} page $1 has been {{GENDER:$2|changed}} by $2',
+'enotif_body_intro_deleted' => 'The {{SITENAME}} page $1 has been {{GENDER:$2|deleted}} on $PAGEEDITDATE by $2, see $3.',
+'enotif_body_intro_created' => 'The {{SITENAME}} page $1 has been {{GENDER:$2|created}} on $PAGEEDITDATE by $2, see $3 for the current revision.',
+'enotif_body_intro_moved' => 'The {{SITENAME}} page $1 has been {{GENDER:$2|moved}} on $PAGEEDITDATE by $2, see $3 for the current revision.',
+'enotif_body_intro_restored' => 'The {{SITENAME}} page $1 has been {{GENDER:$2|restored}} on $PAGEEDITDATE by $2, see $3 for the current revision.',
+'enotif_body_intro_changed' => 'The {{SITENAME}} page $1 has been {{GENDER:$2|changed}} on $PAGEEDITDATE by $2, see $3 for the current revision.',
'enotif_lastvisited' => 'See $1 for all changes since your last visit.',
'enotif_lastdiff' => 'See $1 to view this change.',
'enotif_anon_editor' => 'anonymous user $1',
'enotif_body' => 'Dear $WATCHINGUSERNAME,
-
-The {{SITENAME}} page $PAGETITLE has been $CHANGEDORCREATED on $PAGEEDITDATE by $PAGEEDITOR, see $PAGETITLE_URL for the current revision.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Editor\'s summary: $PAGESUMMARY $PAGEMINOREDIT
@@ -2908,6 +2930,8 @@ $UNWATCHURL
Feedback and further assistance:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'created', # only translate this message to other languages if you have to change it
+'changed' => 'changed', # only translate this message to other languages if you have to change it
# Delete
'deletepage' => 'Delete page',
@@ -2969,60 +2993,63 @@ this action has been canceled as a precaution against session hijacking.
Go back to the previous page, reload that page and then try again.',
# Protect
-'protectlogpage' => 'Protection log',
-'protectlogtext' => 'Below is a list of changes to page protections.
+'protectlogpage' => 'Protection log',
+'protectlogtext' => 'Below is a list of changes to page protections.
See the [[Special:ProtectedPages|protected pages list]] for the list of currently operational page protections.',
-'protectedarticle' => 'protected "[[$1]]"',
-'modifiedarticleprotection' => 'changed protection level for "[[$1]]"',
-'unprotectedarticle' => 'removed protection from "[[$1]]"',
-'movedarticleprotection' => 'moved protection settings from "[[$2]]" to "[[$1]]"',
-'protect-title' => 'Change protection level for "$1"',
-'protect-title-notallowed' => 'View protection level of "$1"',
-'prot_1movedto2' => '[[$1]] moved to [[$2]]',
-'protect-badnamespace-title' => 'Non-protectable namespace',
-'protect-badnamespace-text' => 'Pages in this namespace cannot be protected.',
-'protect-legend' => 'Confirm protection',
-'protectcomment' => 'Reason:',
-'protectexpiry' => 'Expires:',
-'protect_expiry_invalid' => 'Expiry time is invalid.',
-'protect_expiry_old' => 'Expiry time is in the past.',
-'protect-unchain-permissions' => 'Unlock further protect options',
-'protect-text' => "Here you may view and change the protection level for the page '''$1'''.",
-'protect-locked-blocked' => "You cannot change protection levels while blocked.
+'protectedarticle' => 'protected "[[$1]]"',
+'modifiedarticleprotection' => 'changed protection level for "[[$1]]"',
+'unprotectedarticle' => 'removed protection from "[[$1]]"',
+'movedarticleprotection' => 'moved protection settings from "[[$2]]" to "[[$1]]"',
+'protect-title' => 'Change protection level for "$1"',
+'protect-title-notallowed' => 'View protection level of "$1"',
+'prot_1movedto2' => '[[$1]] moved to [[$2]]',
+'protect-badnamespace-title' => 'Non-protectable namespace',
+'protect-badnamespace-text' => 'Pages in this namespace cannot be protected.',
+'protect-norestrictiontypes-text' => 'This page cannot be protected as there are no restriction types available.',
+'protect-norestrictiontypes-title' => 'Non-protectable page',
+'protect-legend' => 'Confirm protection',
+'protectcomment' => 'Reason:',
+'protectexpiry' => 'Expires:',
+'protect_expiry_invalid' => 'Expiry time is invalid.',
+'protect_expiry_old' => 'Expiry time is in the past.',
+'protect-unchain-permissions' => 'Unlock further protect options',
+'protect-text' => "Here you may view and change the protection level for the page '''$1'''.",
+'protect-locked-blocked' => "You cannot change protection levels while blocked.
Here are the current settings for the page '''$1''':",
-'protect-locked-dblock' => "Protection levels cannot be changed due to an active database lock.
+'protect-locked-dblock' => "Protection levels cannot be changed due to an active database lock.
Here are the current settings for the page '''$1''':",
-'protect-locked-access' => "Your account does not have permission to change page protection levels.
+'protect-locked-access' => "Your account does not have permission to change page protection levels.
Here are the current settings for the page '''$1''':",
-'protect-cascadeon' => "This page is currently protected because it is included in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.
+'protect-cascadeon' => "This page is currently protected because it is included in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.
You can change this page's protection level, but it will not affect the cascading protection.",
-'protect-default' => 'Allow all users',
-'protect-fallback' => 'Allow only users with "$1" permission',
-'protect-level-autoconfirmed' => 'Allow only autoconfirmed users',
-'protect-level-sysop' => 'Allow only administrators',
-'protect-summary-cascade' => 'cascading',
-'protect-expiring' => 'expires $1 (UTC)',
-'protect-expiring-local' => 'expires $1',
-'protect-expiry-indefinite' => 'indefinite',
-'protect-cascade' => 'Protect pages included in this page (cascading protection)',
-'protect-cantedit' => 'You cannot change the protection levels of this page because you do not have permission to edit it.',
-'protect-othertime' => 'Other time:',
-'protect-othertime-op' => 'other time',
-'protect-existing-expiry' => 'Existing expiry time: $3, $2',
-'protect-otherreason' => 'Other/additional reason:',
-'protect-otherreason-op' => 'Other reason',
-'protect-dropdown' => '*Common protection reasons
+'protect-default' => 'Allow all users',
+'protect-fallback' => 'Allow only users with "$1" permission',
+'protect-level-autoconfirmed' => 'Allow only autoconfirmed users',
+'protect-level-sysop' => 'Allow only administrators',
+'protect-summary-desc' => '[$1=$2] ($3)', # only translate this message to other languages if you have to change it
+'protect-summary-cascade' => 'cascading',
+'protect-expiring' => 'expires $1 (UTC)',
+'protect-expiring-local' => 'expires $1',
+'protect-expiry-indefinite' => 'indefinite',
+'protect-cascade' => 'Protect pages included in this page (cascading protection)',
+'protect-cantedit' => 'You cannot change the protection levels of this page because you do not have permission to edit it.',
+'protect-othertime' => 'Other time:',
+'protect-othertime-op' => 'other time',
+'protect-existing-expiry' => 'Existing expiry time: $3, $2',
+'protect-otherreason' => 'Other/additional reason:',
+'protect-otherreason-op' => 'Other reason',
+'protect-dropdown' => '*Common protection reasons
** Excessive vandalism
** Excessive spamming
** Counter-productive edit warring
** High traffic page',
-'protect-edit-reasonlist' => 'Edit protection reasons',
-'protect-expiry-options' => '1 hour:1 hour,1 day:1 day,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,infinite:infinite',
-'restriction-type' => 'Permission:',
-'restriction-level' => 'Restriction level:',
-'minimum-size' => 'Min size',
-'maximum-size' => 'Max size:',
-'pagesize' => '(bytes)',
+'protect-edit-reasonlist' => 'Edit protection reasons',
+'protect-expiry-options' => '1 hour:1 hour,1 day:1 day,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,infinite:infinite',
+'restriction-type' => 'Permission:',
+'restriction-level' => 'Restriction level:',
+'minimum-size' => 'Min size',
+'maximum-size' => 'Max size:',
+'pagesize' => '(bytes)',
# Restrictions (nouns)
'restriction-edit' => 'Edit',
@@ -3067,8 +3094,8 @@ You may have a bad link, or the revision may have been restored or removed from
'undeletedrevisions' => '{{PLURAL:$1|1 revision|$1 revisions}} restored',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored',
'undeletedfiles' => '{{PLURAL:$1|1 file|$1 files}} restored',
-'cannotundelete' => 'Undelete failed;
-someone else may have undeleted the page first.',
+'cannotundelete' => 'Undelete failed:
+$1',
'undeletedpage' => "'''$1 has been restored'''
Consult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.",
@@ -3101,7 +3128,7 @@ $1',
'blanknamespace' => '(Main)',
# Contributions
-'contributions' => 'User contributions',
+'contributions' => '{{GENDER:$1|User}} contributions',
'contributions-summary' => '', # do not translate or duplicate this message to other languages
'contributions-title' => 'User contributions for $1',
'mycontris' => 'Contributions',
@@ -3390,6 +3417,7 @@ cannot move a page over itself.',
'immobile-target-namespace-iw' => 'Interwiki link is not a valid target for page move.',
'immobile-source-page' => 'This page is not movable.',
'immobile-target-page' => 'Cannot move to that destination title.',
+'bad-target-model' => 'The desired destination uses a different content model. Can not convert from $1 to $2.',
'imagenocrossnamespace' => 'Cannot move file to non-file namespace',
'nonfile-cannot-move-to-file' => 'Cannot move non-file to file namespace',
'imagetypemismatch' => 'The new file extension does not match its type',
@@ -3508,6 +3536,7 @@ Please try again.',
'import-error-interwiki' => 'Page "$1" is not imported because its name is reserved for external linking (interwiki).',
'import-error-special' => 'Page "$1" is not imported because it belongs to a special namespace that does not allow pages.',
'import-error-invalid' => 'Page "$1" is not imported because its name is invalid.',
+'import-error-unserialize' => 'Revision $2 of page "$1" could not be unserialized. The revision was reported to use content model $3 serialized as $4.',
'import-options-wrong' => 'Wrong {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Given root page is an invalid title.',
'import-rootpage-nosubpage' => 'Namespace "$1" of the root page does not allow subpages.',
@@ -3523,7 +3552,6 @@ Please try again.',
# JavaScriptTest
'javascripttest' => 'JavaScript testing',
'javascripttest-backlink' => '< $1', # do not translate or duplicate this message to other languages
-'javascripttest-disabled' => 'This function has not been enabled on this wiki.',
'javascripttest-title' => 'Running $1 tests',
'javascripttest-pagetext-noframework' => 'This page is reserved for running JavaScript tests.',
'javascripttest-pagetext-unknownframework' => 'Unknown testing framework "$1".',
@@ -3734,38 +3762,53 @@ This is probably caused by a link to a blacklisted external site.',
'spam_deleting' => 'All revisions contained links to $1, deleting',
# Info page
-'pageinfo-header' => '-', # do not translate or duplicate this message to other languages
-'pageinfo-title' => 'Information for "$1"',
-'pageinfo-not-current' => "Sorry, it's impossible to provide this information for old revisions.",
-'pageinfo-header-basic' => 'Basic information',
-'pageinfo-header-edits' => 'Edit history',
-'pageinfo-header-restrictions' => 'Page protection',
-'pageinfo-header-properties' => 'Page properties',
-'pageinfo-display-title' => 'Display title',
-'pageinfo-default-sort' => 'Default sort key',
-'pageinfo-length' => 'Page length (in bytes)',
-'pageinfo-article-id' => 'Page ID',
-'pageinfo-robot-policy' => 'Search engine status',
-'pageinfo-robot-index' => 'Indexable',
-'pageinfo-robot-noindex' => 'Not indexable',
-'pageinfo-views' => 'Number of views',
-'pageinfo-watchers' => 'Number of page watchers',
-'pageinfo-redirects-name' => 'Redirects to this page',
-'pageinfo-redirects-value' => '$1', # only translate this message to other languages if you have to change it
-'pageinfo-subpages-name' => 'Subpages of this page',
-'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})',
-'pageinfo-firstuser' => 'Page creator',
-'pageinfo-firsttime' => 'Date of page creation',
-'pageinfo-lastuser' => 'Latest editor',
-'pageinfo-lasttime' => 'Date of latest edit',
-'pageinfo-edits' => 'Total number of edits',
-'pageinfo-authors' => 'Total number of distinct authors',
-'pageinfo-recent-edits' => 'Recent number of edits (within past $1)',
-'pageinfo-recent-authors' => 'Recent number of distinct authors',
-'pageinfo-magic-words' => 'Magic {{PLURAL:$1|word|words}} ($1)',
-'pageinfo-hidden-categories' => 'Hidden {{PLURAL:$1|category|categories}} ($1)',
-'pageinfo-templates' => 'Transcluded {{PLURAL:$1|template|templates}} ($1)',
-'pageinfo-footer' => '-', # do not translate or duplicate this message to other languages
+'pageinfo-header' => '-', # do not translate or duplicate this message to other languages
+'pageinfo-title' => 'Information for "$1"',
+'pageinfo-not-current' => "Sorry, it's impossible to provide this information for old revisions.",
+'pageinfo-header-basic' => 'Basic information',
+'pageinfo-header-edits' => 'Edit history',
+'pageinfo-header-restrictions' => 'Page protection',
+'pageinfo-header-properties' => 'Page properties',
+'pageinfo-display-title' => 'Display title',
+'pageinfo-default-sort' => 'Default sort key',
+'pageinfo-length' => 'Page length (in bytes)',
+'pageinfo-article-id' => 'Page ID',
+'pageinfo-language' => 'Page content language',
+'pageinfo-robot-policy' => 'Search engine status',
+'pageinfo-robot-index' => 'Indexable',
+'pageinfo-robot-noindex' => 'Not indexable',
+'pageinfo-views' => 'Number of views',
+'pageinfo-watchers' => 'Number of page watchers',
+'pageinfo-few-watchers' => 'Fewer than $1 {{PLURAL:$1|watcher|watchers}}',
+'pageinfo-redirects-name' => 'Redirects to this page',
+'pageinfo-redirects-value' => '$1', # only translate this message to other languages if you have to change it
+'pageinfo-subpages-name' => 'Subpages of this page',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})',
+'pageinfo-firstuser' => 'Page creator',
+'pageinfo-firsttime' => 'Date of page creation',
+'pageinfo-lastuser' => 'Latest editor',
+'pageinfo-lasttime' => 'Date of latest edit',
+'pageinfo-edits' => 'Total number of edits',
+'pageinfo-authors' => 'Total number of distinct authors',
+'pageinfo-recent-edits' => 'Recent number of edits (within past $1)',
+'pageinfo-recent-authors' => 'Recent number of distinct authors',
+'pageinfo-magic-words' => 'Magic {{PLURAL:$1|word|words}} ($1)',
+'pageinfo-hidden-categories' => 'Hidden {{PLURAL:$1|category|categories}} ($1)',
+'pageinfo-templates' => 'Transcluded {{PLURAL:$1|template|templates}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Page|Pages}} transcluded on ($1)',
+'pageinfo-footer' => '-', # do not translate or duplicate this message to other languages
+'pageinfo-toolboxlink' => 'Page information',
+'pageinfo-redirectsto' => 'Redirects to',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Counted as a content page',
+'pageinfo-contentpage-yes' => 'Yes',
+'pageinfo-protect-cascading' => 'Protections are cascading from here',
+'pageinfo-protect-cascading-yes' => 'Yes',
+'pageinfo-protect-cascading-from' => 'Protections are cascading from',
+'pageinfo-category-info' => 'Category information',
+'pageinfo-category-pages' => 'Number of pages',
+'pageinfo-category-subcats' => 'Number of subcategories',
+'pageinfo-category-files' => 'Number of files',
# Skin names
'skinname-standard' => 'Classic', # only translate this message to other languages if you have to change it
@@ -3789,6 +3832,8 @@ This is probably caused by a link to a blacklisted external site.',
'markedaspatrollederror' => 'Cannot mark as patrolled',
'markedaspatrollederrortext' => 'You need to specify a revision to mark as patrolled.',
'markedaspatrollederror-noautopatrol' => 'You are not allowed to mark your own changes as patrolled.',
+'markedaspatrollednotify' => 'This change to $1 has been marked as patrolled.',
+'markedaspatrollederrornotify' => 'Marking as patrolled failed.',
# Patrol log
'patrol-log-page' => 'Patrol log',
@@ -3823,6 +3868,7 @@ By executing it, your system may be compromised.",
'file-nohires' => 'No higher resolution available.',
'svg-long-desc' => 'SVG file, nominally $1 × $2 pixels, file size: $3',
'svg-long-desc-animated' => 'Animated SVG file, nominally $1 × $2 pixels, file size: $3',
+'svg-long-error' => 'Invalid SVG file: $1',
'show-big-image' => 'Full resolution',
'show-big-image-preview' => 'Size of this preview: $1.',
'show-big-image-other' => 'Other {{PLURAL:$2|resolution|resolutions}}: $1.',
@@ -3857,7 +3903,10 @@ By executing it, your system may be compromised.",
'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
'hours' => '{{PLURAL:$1|$1 hour|$1 hours}}',
'days' => '{{PLURAL:$1|$1 day|$1 days}}',
+'months' => '{{PLURAL:$1|$1 month|$1 months}}',
+'years' => '{{PLURAL:$1|$1 year|$1 years}}',
'ago' => '$1 ago',
+'just-now' => 'just now',
# Bad image list
'bad_image_list' => 'The format is as follows:
@@ -4458,9 +4507,10 @@ This confirmation code will expire at $4.',
'invalidateemail' => 'Cancel email confirmation',
# Scary transclusion
-'scarytranscludedisabled' => '[Interwiki transcluding is disabled]',
-'scarytranscludefailed' => '[Template fetch failed for $1]',
-'scarytranscludetoolong' => '[URL is too long]',
+'scarytranscludedisabled' => '[Interwiki transcluding is disabled]',
+'scarytranscludefailed' => '[Template fetch failed for $1]',
+'scarytranscludefailed-httpstatus' => '[Template fetch failed for $1: HTTP $2]',
+'scarytranscludetoolong' => '[URL is too long]',
# Delete conflict
'deletedwhileediting' => "'''Warning:''' This page was deleted after you started editing!",
@@ -4695,6 +4745,7 @@ You can also [[Special:EditWatchlist|use the standard editor]].',
'version-license' => 'License',
'version-poweredby-credits' => "This wiki is powered by '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'others',
+'version-credits-summary' => 'We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki 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.
MediaWiki 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.
@@ -4817,17 +4868,17 @@ This site is experiencing technical difficulties.',
'sqlite-no-fts' => '$1 without full-text search support',
# New logging system
-'logentry-delete-delete' => '$1 deleted page $3',
-'logentry-delete-restore' => '$1 restored page $3',
-'logentry-delete-event' => '$1 changed visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4',
-'logentry-delete-revision' => '$1 changed visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4',
-'logentry-delete-event-legacy' => '$1 changed visibility of log events on $3',
-'logentry-delete-revision-legacy' => '$1 changed visibility of revisions on page $3',
-'logentry-suppress-delete' => '$1 suppressed page $3',
-'logentry-suppress-event' => '$1 secretly changed visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4',
-'logentry-suppress-revision' => '$1 secretly changed visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4',
-'logentry-suppress-event-legacy' => '$1 secretly changed visibility of log events on $3',
-'logentry-suppress-revision-legacy' => '$1 secretly changed visibility of revisions on page $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|deleted}} page $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|restored}} page $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|changed}} visibility of log events on $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|changed}} visibility of revisions on page $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|suppressed}} page $3',
+'logentry-suppress-event' => '$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4',
+'logentry-suppress-revision' => '$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4',
+'logentry-suppress-event-legacy' => '$1 secretly {{GENDER:$2|changed}} visibility of log events on $3',
+'logentry-suppress-revision-legacy' => '$1 secretly {{GENDER:$2|changed}} visibility of revisions on page $3',
'revdelete-content-hid' => 'content hidden',
'revdelete-summary-hid' => 'edit summary hidden',
'revdelete-uname-hid' => 'username hidden',
@@ -4836,17 +4887,21 @@ This site is experiencing technical difficulties.',
'revdelete-uname-unhid' => 'username unhidden',
'revdelete-restricted' => 'applied restrictions to administrators',
'revdelete-unrestricted' => 'removed restrictions for administrators',
-'logentry-move-move' => '$1 moved page $3 to $4',
-'logentry-move-move-noredirect' => '$1 moved page $3 to $4 without leaving a redirect',
-'logentry-move-move_redir' => '$1 moved page $3 to $4 over redirect',
-'logentry-move-move_redir-noredirect' => '$1 moved page $3 to $4 over a redirect without leaving a redirect',
-'logentry-patrol-patrol' => '$1 marked revision $4 of page $3 patrolled',
-'logentry-patrol-patrol-auto' => '$1 automatically marked revision $4 of page $3 patrolled',
-'logentry-newusers-newusers' => 'User account $1 was created',
-'logentry-newusers-create' => 'User account $1 was created',
-'logentry-newusers-create2' => 'User account $3 was created by $1',
-'logentry-newusers-autocreate' => 'User account $1 was created automatically',
-'newuserlog-byemail' => 'password sent by email',
+'logentry-move-move' => '$1 {{GENDER:$2|moved}} page $3 to $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|moved}} page $3 to $4 without leaving a redirect',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|moved}} page $3 to $4 over redirect',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|moved}} page $3 to $4 over a redirect without leaving a redirect',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|marked}} revision $4 of page $3 patrolled',
+'logentry-patrol-patrol-auto' => '$1 automatically {{GENDER:$2|marked}} revision $4 of page $3 patrolled',
+'logentry-newusers-newusers' => 'User account $1 was {{GENDER:$2|created}}',
+'logentry-newusers-create' => 'User account $1 was {{GENDER:$2|created}}',
+'logentry-newusers-create2' => 'User account $3 was {{GENDER:$2|created}} by $1',
+'logentry-newusers-byemail' => 'User account $3 was {{GENDER:$2|created}} by $1 and password was sent by email',
+'logentry-newusers-autocreate' => 'User account $1 was {{GENDER:$2|created}} automatically',
+'logentry-rights-rights' => '$1 {{GENDER:$2|changed}} group membership for $3 from $4 to $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|changed}} group membership for $3',
+'logentry-rights-autopromote' => '$1 was automatically {{GENDER:$2|promoted}} from $4 to $5',
+'rightsnone' => '(none)',
# For IRC, see bug 34508. Do not change
'revdelete-logentry' => 'changed revision visibility of "[[$1]]"', # do not translate or duplicate this message to other languages
@@ -4870,6 +4925,8 @@ This site is experiencing technical difficulties.',
'newuserlog-create-entry' => 'New user account', # do not translate or duplicate this message to other languages
'newuserlog-create2-entry' => 'created new account $1', # do not translate or duplicate this message to other languages
'newuserlog-autocreate-entry' => 'Account created automatically', # do not translate or duplicate this message to other languages
+'rightslogentry' => 'changed group membership for $1 from $2 to $3', # do not translate or duplicate this message to other languages
+'rightslogentry-autopromote' => 'was automatically promoted from $2 to $3', # do not translate or duplicate this message to other languages
# Feedback
'feedback-bugornote' => 'If you are ready to describe a technical problem in detail please [$1 report a bug].
@@ -4923,6 +4980,7 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
'api-error-ok-but-empty' => 'Internal error: No response from server.',
'api-error-overwrite' => 'Overwriting an existing file is not allowed.',
'api-error-stashfailed' => 'Internal error: Server failed to store temporary file.',
+'api-error-publishfailed' => 'Internal error: Server failed to publish temporary file.',
'api-error-timeout' => 'The server did not respond within the expected time.',
'api-error-unclassified' => 'An unknown error occurred.',
'api-error-unknown-code' => 'Unknown error: "$1".',
@@ -4943,4 +5001,7 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
'duration-centuries' => '$1 {{PLURAL:$1|century|centuries}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+# Image rotation
+'rotate-comment' => 'Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise',
+
);
diff --git a/languages/messages/MessagesEn_gb.php b/languages/messages/MessagesEn_gb.php
index a6a78081..1429a54e 100644
--- a/languages/messages/MessagesEn_gb.php
+++ b/languages/messages/MessagesEn_gb.php
@@ -112,6 +112,9 @@ Please contact your Internet service provider or technical support of your organ
Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
'allmessages-filter' => 'Filter by customisation state:',
+# Special:Import
+'import-error-unserialize' => 'Revision $2 of page "$1" could not be unserialised. The revision was reported to use content model $3 serialised as $4.',
+
# Metadata
'metadata-help' => 'This file contains additional information, probably added from the digital camera or scanner used to create or digitise it.
If the file has been modified from its original state, some details may not fully reflect the modified file.',
@@ -156,6 +159,7 @@ If the file has been modified from its original state, some details may not full
'confirmemail_invalidated' => 'E-mail address confirmation cancelled',
# Special:Version
+'version-credits-summary' => 'We would like to recognise the following persons for their contribution to [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, or (at your option) any later version.
MediaWiki 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 Licence for more details.
diff --git a/languages/messages/MessagesEo.php b/languages/messages/MessagesEo.php
index 99d30b28..d0d12746 100644
--- a/languages/messages/MessagesEo.php
+++ b/languages/messages/MessagesEo.php
@@ -15,6 +15,7 @@
* @author ArnoLagrange
* @author Blahma
* @author Castelobranco
+ * @author Eliovir
* @author Iketsi
* @author Jens Liebenau
* @author Kaganer
@@ -31,6 +32,7 @@
* @author Omnipaedista
* @author Pedroca cerebral
* @author Petrus Adamus
+ * @author Renardo
* @author Smeira
* @author ThomasPusch
* @author Tlustulimu
@@ -145,7 +147,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Lastaj_ÅanÄoj' ),
'Recentchangeslinked' => array( 'Rilataj_ÅanÄoj' ),
'Revisiondelete' => array( 'Forigi_revizion' ),
- 'RevisionMove' => array( 'Movi_revizion' ),
'Search' => array( 'Serĉi' ),
'Shortpages' => array( 'Mallongaj_paÄoj' ),
'Specialpages' => array( 'Specialaj_paÄoj' ),
@@ -183,7 +184,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__FI__', '__FORTUINDEKSON__', '__FT__', '__FORCETOC__' ),
'toc' => array( '0', '__I__', '__T__', '__INDEKSO__', '__TOC__' ),
'noeditsection' => array( '0', '__SRS__', '__NES__', '__SENREDAKTISEKCIOJN__', '__SENREDAKTISEKCION__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__SENTITOLO__', '__NH__', '__ST__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'NUNAMONATO', 'NUNAMONATO2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'NUNAMONATO1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'NUNAMONATNOMO', 'NUNAMONATONOMO', 'NUNAMONATANOMO', 'CURRENTMONTHNAME' ),
@@ -458,7 +458,6 @@ $messages = array(
'qbbrowse' => 'Foliumi',
'qbedit' => 'Redakti',
'qbpageoptions' => 'PaÄagado',
-'qbpageinfo' => 'PaÄinformoj',
'qbmyoptions' => 'Personaĵoj',
'qbspecialpages' => 'Specialaj paÄoj',
'faq' => 'Oftaj demandoj',
@@ -481,6 +480,7 @@ $messages = array(
'namespaces' => 'Nomspacoj',
'variants' => 'Variantoj',
+'navigation-heading' => 'Navigacia menuo',
'errorpagetitle' => 'Eraro',
'returnto' => 'Reiri al $1.',
'tagline' => 'El {{SITENAME}}',
@@ -723,13 +723,13 @@ La administranto kiu Ålosis Äin proponis tiun klarigon: "$3".',
'virus-unknownscanner' => 'nekonata kontraÅ­viruso:',
# Login and logout pages
-'logouttext' => "'''Vi nun estas elsalutita.'''
+'logouttext' => "'''Vi nun estas elsalutinta.'''
-Vi rajtas daÅ­re vikiumi sennome, aÅ­ vi povas [[Special:UserLogin|reensaluti]] kiel la sama aÅ­ kiel alia uzanto.
-Notu ke iuj paÄoj daÅ­re Åajnos kvazaÅ­ vi ankoraÅ­ estas ensalutita, Äis vi refreÅigu vian retumilan kaÅmemoron.",
-'welcomecreation' => '== Bonvenon, $1! ==
-Via konto estas kreita.
-Ne forgesu fari viajn [[Special:Preferences|{{SITENAME}}-preferojn]].',
+Vi rajtas daÅ­re vikiumi sennome, aÅ­ vi povas <span class='plainlinks'>[$1 reensaluti]</span> kiel la sama aÅ­ kiel alia uzanto.
+Notu ke iuj paÄoj daÅ­re Åajnos kvazaÅ­ vi ankoraÅ­ estus ensalutinta, Äis vi refreÅigos kaÅmemoron de via retumilo.",
+'welcomeuser' => 'Bonvenon, $1!',
+'welcomecreation-msg' => 'Via konto estas kreita.
+Ne forgesu ÅanÄi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
'yourname' => 'Salutnomo:',
'yourpassword' => 'Pasvorto:',
'yourpasswordagain' => 'Retajpu pasvorton',
@@ -752,7 +752,7 @@ Ne forgesu fari viajn [[Special:Preferences|{{SITENAME}}-preferojn]].',
'gotaccount' => "Ĉu vi jam havas konton? '''$1'''.",
'gotaccountlink' => 'Ensaluti',
'userlogin-resetlink' => 'Ĉu vi forgesis ensalutajn detalojn?',
-'createaccountmail' => 'retpoÅte',
+'createaccountmail' => 'Uzi provizoran hazardsignan pasvorton kaj sendi Äin al la retpoÅto suben',
'createaccountreason' => 'Kialo:',
'badretype' => 'La pasvortojn kiujn vi tajpis ne egalas.',
'userexists' => 'Salutnomo enigita jam estas uzata.
@@ -823,6 +823,7 @@ Bonvolu Äisatendi antaÅ­ retrovi.',
# Email sending
'php-mail-error-unknown' => 'Nekonata eraro en la funkcio mail() de PHP',
'user-mail-no-addy' => 'Provis sendi retpoÅton sen retpoÅtadreso.',
+'user-mail-no-body' => 'Provo sendi malplenan aŭ sensence mallongan retpošton.',
# Change password dialog
'resetpass' => 'ÅœanÄi pasvorton',
@@ -888,6 +889,7 @@ Provizora pasvorto: $2',
'changeemail-oldemail' => 'Aktuala retpoÅtadreso:',
'changeemail-newemail' => 'Nova retpoÅtadreso:',
'changeemail-none' => '(nenio)',
+'changeemail-password' => 'Via {{SITENAME}}-ensalutado:',
'changeemail-submit' => 'ÅœanÄi retpoÅtadreson',
'changeemail-cancel' => 'Nuligi',
@@ -1070,7 +1072,6 @@ Jen la lasta protokolero por via referenco:",
'template-semiprotected' => '(duone protektita)',
'hiddencategories' => 'Ĉi tiu paÄo estas membro de {{PLURAL:$1|1 kaÅita kategorio|$1 kaÅitaj kategorioj}}:',
'edittools' => '<!-- Teksto ĉi tie estas montrata sub redaktaj kaj alÅutaj formularoj. -->',
-'nocreatetitle' => 'PaÄa kreado estas limigita',
'nocreatetext' => '{{SITENAME}} restriktas la eblecon krei novajn paÄojn. Vi povas reiri kaj redakti faritan paÄon, aÅ­ [[Special:UserLogin|ensaluti aÅ­ krei konton]].',
'nocreate-loggedin' => 'Vi ne rajtas krei novajn paÄojn.',
'sectioneditnotsupported-title' => 'Redaktado de ĉi tiu sekcio ne estas subtenata',
@@ -1094,6 +1095,15 @@ VerÅajne Äi estis forigita.',
'edit-already-exists' => 'Ne eblis krei novan paÄon.
Äœi jam ekzistas.',
'defaultmessagetext' => 'DefaÅ­lta teksto',
+'content-failed-to-parse' => 'Oni malsukcesis analizi $2-entenon laÅ­ la $1-modelo: $3',
+'invalid-content-data' => 'Enhavo estas malvalida',
+'content-not-allowed-here' => 'Enhavo de $1 ne estas permesita en paÄo [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'vikiteksto',
+'content-model-text' => 'ordinara teksto',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Averto: Ĉi tiu paÄo enhavas tro da multekostaj sintaksaj funkcio-vokoj.
@@ -1459,9 +1469,9 @@ Jen hazarde generita valoro por via uzo: $1',
'prefs-emailconfirm-label' => 'RetpoÅta konfirmado:',
'prefs-textboxsize' => 'Grandeco de redakta fenestro',
'youremail' => 'Retadreso:',
-'username' => 'Salutnomo:',
-'uid' => 'Uzant-ID:',
-'prefs-memberingroups' => 'Ano de {{PLURAL:$1|grupo|grupoj}}:',
+'username' => '{{GENDER:$1|Salutnomo}}:',
+'uid' => '{{GENDER:$1|Uzanto}}-identaĵo:',
+'prefs-memberingroups' => '{{GENDER:$2|Ano}} de {{PLURAL:$1|grupo|grupoj}}:',
'prefs-registration' => 'Tempo de registrado:',
'yourrealname' => 'Vera nomo:',
'yourlanguage' => 'Lingvo',
@@ -1609,12 +1619,13 @@ Jen hazarde generita valoro por via uzo: $1',
'right-sendemail' => 'Sendi retpoÅton al aliaj uzantoj',
'right-passwordreset' => 'Vidi retpoÅtojn de pasvorta restarado.',
+# Special:Log/newusers
+'newuserlogpage' => 'Protokolo de uzanto-kreado',
+'newuserlogpagetext' => 'Jen protokolo de lastaj kreadoj de uzantoj.',
+
# User rights log
'rightslog' => 'Protokolo de uzanto-rajtoj',
'rightslogtext' => 'Ĉi tio estas protokolo pri la ÅanÄoj de uzantorajtoj.',
-'rightslogentry' => 'ÅanÄis grupan membrecon por $1 de $2 al $3',
-'rightslogentry-autopromote' => 'estis aÅ­tomate altrangigita de $2 al $3',
-'rightsnone' => '(nenia)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'legi ĉi tiun paÄon',
@@ -1841,6 +1852,7 @@ Se la problemo kontinuas, kontaku [[Special:ListUsers/sysop|sisteman administran
'backend-fail-notsame' => 'Malsama dosiero jam ekzistas ĉe $1.',
'backend-fail-invalidpath' => '$1 ne estas valida pado por konservujo.',
'backend-fail-delete' => 'Ne povis forigi dosieron "$1".',
+'backend-fail-describe' => 'Ne povis ÅanÄi la metadatenon de la dosiero "$1".',
'backend-fail-alreadyexists' => 'La dosiero "$1" jam ekzistas.',
'backend-fail-store' => 'Ne povis konservi dosieron $1 ĉe $2.',
'backend-fail-copy' => 'Ne povis kopii dosieron $1 al $2.',
@@ -2074,6 +2086,9 @@ Bonvolu kontroli aliajn ligilojn al la Åablonoj antaÅ­ ol forigi ilin.',
Ili devus anstataÅ­e alligi la Äustan temon.<br />
PaÄo estas traktata kiel apartigilo se Äi uzas Åablonon kiu estas ligita de [[MediaWiki:Disambiguationspage]]",
+'pageswithprop-prop' => 'Nomo de la atributo:',
+'pageswithprop-submit' => 'Ek',
+
'doubleredirects' => 'Duoblaj alidirektadoj',
'doubleredirectstext' => 'Ĉi tiu paÄo montras paÄojn kiuj alidirektas al aliaj alidirektiloj.
Ĉiu vico enhavas ligilojn ĉe la unua kaj dua alidirektadoj, kaj la unua linio de la dua alidirektado, kiu Äenerale montras la "veran" celpaÄon, kiu celu la unuan alidirektadon.
@@ -2228,7 +2243,7 @@ Vidu ankaÅ­ [[Special:WantedCategories|Dezirataj kategorioj]].',
'linksearch-ns' => 'Nomspaco:',
'linksearch-ok' => 'Serĉi',
'linksearch-text' => 'Regulesprimoj kiel "*.wikipedia.org" povas esti uzataj. Nepre havi almenaÅ­ plej altan domajnon, ekz-e "*.org".<br />
-Subtenataj protokoloj: <code>$1</code> (ne aldonu ĉi tiujn ajn en via serĉo-mendo).',
+Subtenataj {{PLURAL:$2|protokolo|protokoloj}}:: <code>$1</code> (ne aldonu ĉi tiujn ajn en via serĉo-mendo).',
'linksearch-line' => '$1 ligita de $2',
'linksearch-error' => 'Regulesprimoj povas aperi nur ĉe la komenco de la retnoda nomo.',
@@ -2247,10 +2262,6 @@ Subtenataj protokoloj: <code>$1</code> (ne aldonu ĉi tiujn ajn en via serĉo-me
'activeusers-hidesysops' => 'KaÅi administrantojn',
'activeusers-noresult' => 'Neniuj uzantoj trovitaj.',
-# Special:Log/newusers
-'newuserlogpage' => 'Protokolo de uzanto-kreado',
-'newuserlogpagetext' => 'Jen protokolo de lastaj kreadoj de uzantoj.',
-
# Special:ListGroupRights
'listgrouprights' => 'Gruprajtoj de uzantoj',
'listgrouprights-summary' => 'Jen listo de uzanto-grupoj difinitaj en ĉi tiu vikio, kun ties asociaj atingrajtoj.
@@ -2344,19 +2355,26 @@ La retadreso kiun vi enigis en [[Special:Preferences|viaj preferoj]] aperos kiel
'enotif_mailer' => 'Averta retmesaÄo de {{SITENAME}}',
'enotif_reset' => 'Marki ĉiujn paÄojn vizititaj',
-'enotif_newpagetext' => 'Tiu ĉi estas nova paÄo',
'enotif_impersonal_salutation' => 'Uzanto de {{SITENAME}}',
-'changed' => 'ÅanÄita',
-'created' => 'kreita',
-'enotif_subject' => 'la paÄo $PAGETITLE de {{SITENAME}} estis $CHANGEDORCREATED de $PAGEEDITOR',
+'enotif_subject_deleted' => 'La paÄon $1 de {{SITENAME}} forigis {{gender:$2|$2}}',
+'enotif_subject_created' => 'La paÄon $1 de {{SITENAME}} kreis {{gender:$2|$2}}',
+'enotif_subject_moved' => 'La paÄon $1 de {{SITENAME}} movis {{gender:$2|$2}}',
+'enotif_subject_restored' => 'La paÄon $1 de {{SITENAME}} remetis {{gender:$2|$2}}',
+'enotif_subject_changed' => 'La paÄon $1 de {{SITENAME}} ÅanÄis {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'La paÄon $1 de {{SITENAME}} forigis {{gender:$2|$2}} je $PAGEEDITDATE; bonvole vidu $3.',
+'enotif_body_intro_created' => 'La paÄon $1 de {{SITENAME}} kreis {{gender:$2|$2}} je $PAGEEDITDATE; bonvole vidu $3 pri la nuna revizio.',
+'enotif_body_intro_moved' => 'La paÄon $1 de {{SITENAME}} movis {{gender:$2|$2}} je $PAGEEDITDATE; bonvole vidu $3 pri la nuna revizio.',
+'enotif_body_intro_restored' => 'La paÄon $1 de {{SITENAME}} remetis {{gender:$2|$2}} je $PAGEEDITDATE; bonvole vidu $3 pri la nuna revizio.',
+'enotif_body_intro_changed' => 'La paÄon $1 de {{SITENAME}} ÅanÄis {{gender:$2|$2}} je $PAGEEDITDATE; bonvole vidu $3 pri la nuna revizio.',
'enotif_lastvisited' => 'Vidi $1 por ĉiuj ÅanÄoj de post via lasta vizito.',
'enotif_lastdiff' => 'Vidi $1 por rigardi ĉi tiun ÅanÄon.',
'enotif_anon_editor' => 'anonima uzanto $1',
'enotif_body' => 'Kara $WATCHINGUSERNAME,
-La paÄo $PAGETITLE de {{SITENAME}} estis $CHANGEDORCREATED je $PAGEEDITDATE de $PAGEEDITOR; vidu $PAGETITLE_URL por la nuna revizio.
+$PAGEINTRO $NEWPAGE
-$NEWPAGE
+Redaktinta resumo:
+$PAGESUMMARY $PAGEMINOREDIT
Resumo pri la ÅanÄo de la redaktinto: $PAGESUMMARY $PAGEMINOREDIT
@@ -2364,22 +2382,24 @@ Kontaktu la redaktinton:
retpoÅte: $PAGEEDITOR_EMAIL
vikie: $PAGEEDITOR_WIKI
-Ne estos aliaj avertoj kaze de sekvaj ÅanÄoj krom se vi vizitus la paÄon. Vi povas ankaÅ­ malaktivigi la avertsignalon por ĉiuj priatentitaj paÄoj de via atentaro.
+Ne estos aliaj avertoj kaze de sekvaj ÅanÄoj krom se vi vizitus ĉi tiun paÄon. Vi povas ankaÅ­ malaktivigi la avertsignalon por ĉiuj priatentitaj paÄoj de via atentaro.
Sincere via, la avertsistemo de {{SITENAME}}
--
-Por ÅanÄi vian retpoÅtan notigadan preferon, klaku
+Por ÅanÄi vian retpoÅtan avertadajn preferojn, klaku
{{canonicalurl:{{#special:Preferences}}}}
-Por ÅanÄi vian preferon de la atentaro, klaku
+Por ÅanÄi vian preferojn de la atentaro, klaku
{{canonicalurl:{{#special:EditWatchlist}}}}
-Por forigi la paÄon de via atentaro, klaku
+Por forigi ĉi tiun paÄon de via atentaro, klaku
$UNWATCHURL
Komentoj kaj plia helpo:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'kreita',
+'changed' => 'ÅanÄita',
# Delete
'deletepage' => 'Forigi paÄon',
@@ -2447,6 +2467,7 @@ Vidu [[Special:ProtectedPages|liston de protektitaj paÄoj]] por listo de aktual
'prot_1movedto2' => '[[$1]] movita al [[$2]]',
'protect-badnamespace-title' => 'Ne-protektebla nomspaco',
'protect-badnamespace-text' => 'PaÄoj en ĉi tiu datumbazo ne povas esti protektita.',
+'protect-norestrictiontypes-title' => 'Neprotektebla paÄo',
'protect-legend' => 'Konfirmi protektadon',
'protectcomment' => 'Kialo:',
'protectexpiry' => 'EksvalidiÄas:',
@@ -2528,7 +2549,8 @@ Vi verÅajne havas malbonan ligilon, aÅ­ la revizio eble estis restarigita aÅ­ f
'undeletedrevisions' => '{{PLURAL:$1|1 versio restarigita|$1 versioj restarigitaj}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 versio|$1 versioj}} kaj {{PLURAL:$2|1 dosiero|$2 dosieroj}} restarigitaj',
'undeletedfiles' => '{{PLURAL:$1|1 dosiero restarigita|$1 dosieroj restarigitaj}}',
-'cannotundelete' => 'Restarigo malsukcesis; iu eble restarigis la paÄon antaÅ­e.',
+'cannotundelete' => 'Restarigo malsukcesis:
+$1',
'undeletedpage' => "'''$1 estis restarigita'''
Konsultu la [[Special:Log/delete|deletion log]] por protokolo pri la lastatempaj forigoj kaj restarigoj.",
@@ -2560,7 +2582,7 @@ $1',
'blanknamespace' => '(Artikoloj)',
# Contributions
-'contributions' => 'Kontribuoj de uzanto',
+'contributions' => 'Kontribuoj de {{GENDER:$1|uzanto|uzantino}}',
'contributions-title' => 'Kontribuoj de uzanto $1',
'mycontris' => 'Kontribuoj',
'contribsub2' => 'De $1 ($2)',
@@ -2833,6 +2855,7 @@ La celartikolo "[[:$1]]" jam ekzistas. Ĉu vi volas forigi Äin por krei spacon
'immobile-target-namespace-iw' => 'Intervikia ligilo ne estas valida celo por paÄa movo.',
'immobile-source-page' => 'Ĉi tiu paÄo ne estas movebla.',
'immobile-target-page' => 'Ne povas movi al tiu destina titolo.',
+'bad-target-model' => 'La celo dezira uzas malakordan entenmodelon. Ne povas ÅanÄi el $1 al $2.',
'imagenocrossnamespace' => 'Ne povas movi dosieron al nedosiera nomspaco',
'nonfile-cannot-move-to-file' => 'Ne povas movi ne-dosieron al dosiera nomspaco',
'imagetypemismatch' => 'La nova dosierfinaĵo ne kongruas Äian dosiertipon.',
@@ -2945,6 +2968,7 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
'import-error-interwiki' => 'PaÄo "$1" ne estis importita pro sia nomo estas deklarita por ekstera ligado (intervikia).',
'import-error-special' => 'PaÄo "$1" ne estas importata, ĉar Äi apartenas al speciala nomspaco, kiu ne permesas paÄojn.',
'import-error-invalid' => 'PaÄo "$1" ne estas importata, ĉar Äia nomo estas malvalida.',
+'import-error-unserialize' => 'La revizio n-ro $2 de la paÄo nomata "$1" ne povis senseriiÄi. La revizio raportiÄis uzi enhavmodelon n-ro $3, kiu seriiÄis kiel n-ro $4.',
'import-options-wrong' => '{{PLURAL:$2|Erara elekto|Eraraj elektoj}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'La provizita paÄo havas nevalidan titolon.',
'import-rootpage-nosubpage' => 'La nomspaco "$1" de la radikopaÄo ne permesas subpaÄoj.',
@@ -2959,7 +2983,6 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
# JavaScriptTest
'javascripttest' => 'Äœavoskripta testado',
-'javascripttest-disabled' => 'Ĉi tiu funkcio estas malÅaltita en ĉi tiu vikio.',
'javascripttest-title' => 'Irigante $1 testoj',
'javascripttest-pagetext-noframework' => 'Ĉi tiu paÄo estas konservita por funkciigi testojn de JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Nekonta test-framo "$1".',
@@ -3108,11 +3131,13 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
'pageinfo-default-sort' => 'Pravaloro de ordiga Ålosilo',
'pageinfo-length' => 'PaÄgrandeco (en bajtoj)',
'pageinfo-article-id' => 'PaÄa identigo',
+'pageinfo-language' => 'Lingvo de paÄa enhavo',
'pageinfo-robot-policy' => 'Statuso de la serĉilo',
'pageinfo-robot-index' => 'Indeksebla',
'pageinfo-robot-noindex' => 'Ne indeksebla',
'pageinfo-views' => 'Nombro de rigardoj',
'pageinfo-watchers' => 'Nombro de paÄatentantoj',
+'pageinfo-few-watchers' => 'Malpli ol $1 {{PLURAL:$1|atentanto|atentantoj}}',
'pageinfo-redirects-name' => 'Alidirektoj al ĉi tiu paÄo',
'pageinfo-subpages-name' => 'SubpaÄoj de ĉi tiu paÄo',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|alidirektilo|alidirektiloj}}; $3 {{PLURAL:$3|ne-alidirektilo|ne-alidirektiloj}})',
@@ -3127,6 +3152,18 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
'pageinfo-magic-words' => '{{PLURAL:$1|Magia vorto|Magiaj vortoj}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|KaÅita kategorio|KaÅitaj kategorioj}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Inkluzivita Åablono|Inkluzivitaj Åablonoj}} ($1)',
+'pageinfo-toolboxlink' => 'Informoj pri la paÄo',
+'pageinfo-redirectsto' => 'Alidirektas al',
+'pageinfo-redirectsto-info' => 'Informo',
+'pageinfo-contentpage' => 'Kalkulita kiel entenopaÄo',
+'pageinfo-contentpage-yes' => 'Jes',
+'pageinfo-protect-cascading' => 'Protektado kaskade fontas el ĉi tie',
+'pageinfo-protect-cascading-yes' => 'Jes',
+'pageinfo-protect-cascading-from' => 'Protektado kaskade fontas el',
+'pageinfo-category-info' => 'Informo pri kategorio',
+'pageinfo-category-pages' => 'Nombro de paÄoj',
+'pageinfo-category-subcats' => 'Nombro de subkategorioj',
+'pageinfo-category-files' => 'Nombro de dosieroj',
# Skin names
'skinname-standard' => 'Klasiko',
@@ -3149,6 +3186,8 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
'markedaspatrollederror' => 'Ne povas marki kiel patrolitan',
'markedaspatrollederrortext' => 'Vi devas specifi version por marki kiel patrolitan.',
'markedaspatrollederror-noautopatrol' => 'Vi ne rajtas marki viajn proprajn ÅanÄojn kiel patrolitajn.',
+'markedaspatrollednotify' => 'Ĉi tiun ÅanÄon al $1 markis kiel patrolatan.',
+'markedaspatrollederrornotify' => 'Malsukcesis marki la dosieron kiel patrolatan.',
# Patrol log
'patrol-log-page' => 'Protokolo pri patrolado',
@@ -3181,6 +3220,7 @@ $1',
'file-nohires' => 'Nenia pli granda distingivo havebla.',
'svg-long-desc' => 'SVG-dosiero, $1 × $2 rastrumeroj, grandeco de dosiero: $3',
'svg-long-desc-animated' => 'Animata SVG-dosiero, $1 × $2 rastrumeroj, grandeco de dosiero: $3',
+'svg-long-error' => 'Malvalida SVG-dosiero: $1',
'show-big-image' => 'Plena distingivo',
'show-big-image-preview' => 'Grandeco de ĉi antaŭvido: $1.',
'show-big-image-other' => '{{PLURAL:$2|Alia distingivo|Aliaj distingivoj}}: $1.',
@@ -3210,7 +3250,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutoj}}',
'hours' => '{{PLURAL:$1|$1 horo|$1 horoj}}',
'days' => '{{PLURAL:$1|$1 tago|$1 tagoj}}',
+'months' => '{{PLURAL:$1|$1 monato|$1 monatoj}}',
+'years' => '{{PLURAL:$1|$1 jaro|$1 jaroj}}',
'ago' => 'antaÅ­ $1',
+'just-now' => 'ĵus nune',
# Bad image list
'bad_image_list' => 'La formato estas jen:
@@ -3707,6 +3750,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[Intervikia transinkluzivado estas malebligita.]',
'scarytranscludefailed' => '[Akiro de Åablono $1 malsukcesis.]',
+'scarytranscludefailed-httpstatus' => '[Malsukcesis akiri la Åablonon $1 : HTTP $2 ]',
'scarytranscludetoolong' => '[URL-o estas tro longa]',
# Delete conflict
@@ -3873,6 +3917,7 @@ Vi povas ankaÅ­ [[Special:EditWatchlist|redakti norme]].',
'version-license' => 'Permesilo',
'version-poweredby-credits' => "Ĉi tiu vikio funkcias per '''[//www.mediawiki.org/ MediaWiki]''', aŭtorrajto ©&thinsp;2001–$1 $2.",
'version-poweredby-others' => 'aliaj',
+'version-credits-summary' => 'Ni Åatus agnoski la sekvajn personojn pro siaj kontribuoj al [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki estas libera programaro. Vi povas redistribui Äin kaj/aÅ­ modifi Äin sub la kondiĉoj de la GNU General Public Licens (GNU Äœenerala Publika Permesilo) en ties eldono de la Free Software Foundation (Libera Softvara Fondaĵo) - aÅ­ versio 2 de la Permesilo, aÅ­ (laÅ­ via elekto) iu ajn posta versio.
Tiun ĉi verkon ni distribuas esperante, ke Äi utilos, sed SEN IA AJN GARANTIO; eĉ sen la implica garantio de SURMERKATIGEBLECO aÅ­ TAŬGECO POR IA DIFINITA CELO. Vidu GNU General Public License por pliaj detaloj.
@@ -3991,13 +4036,13 @@ Bildoj montriÄas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
'logentry-delete-restore' => '$1 restarigis paÄon $3',
'logentry-delete-event' => '$1 ÅanÄis videblecon de {{PLURAL:$5|protokola evento|$5 protokolaj eventoj}} je $3: $4',
'logentry-delete-revision' => '$1 ÅanÄis videblecon de {{PLURAL:$5|revizio|$5 reviziojn}} je paÄo $3: $4',
-'logentry-delete-event-legacy' => '$1 ÅanÄis vidiblecon de protokolaj eventoj en $3',
-'logentry-delete-revision-legacy' => '$1 ÅanÄis vidiblecon de revizioj en $3',
+'logentry-delete-event-legacy' => '$1 ÅanÄis videblecon de protokolaj eventoj en $3',
+'logentry-delete-revision-legacy' => '$1 ÅanÄis videblecon de revizioj en $3',
'logentry-suppress-delete' => '$1 kaÅis paÄon $3',
'logentry-suppress-event' => '$1 kaÅite ÅanÄis videblecon de {{PLURAL:$5|protokola evento|$5 protokolaj eventoj}} je $3: $4',
'logentry-suppress-revision' => '$1 kaÅite ÅanÄis videblecon de {{PLURAL:$5|revizio|$5 reviziojn}} je paÄo $3: $4',
-'logentry-suppress-event-legacy' => '$1 kaÅite ÅanÄis vidiblecon de protokolaj eventoj en $3',
-'logentry-suppress-revision-legacy' => '$1 kaÅite ÅanÄis vidiblecon de revizioj en paÄo $3',
+'logentry-suppress-event-legacy' => '$1 kaÅite ÅanÄis videblecon de protokolaj eventoj en $3',
+'logentry-suppress-revision-legacy' => '$1 kaÅite ÅanÄis videblecon de revizioj en paÄo $3',
'revdelete-content-hid' => 'enhavo kaÅita',
'revdelete-summary-hid' => 'resumo de redakto kaÅita',
'revdelete-uname-hid' => 'salutnomo kaÅita',
@@ -4007,16 +4052,20 @@ Bildoj montriÄas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
'revdelete-restricted' => 'aplikis limojn al administrantoj',
'revdelete-unrestricted' => 'forigis limojn por administrantoj',
'logentry-move-move' => '$1 movis paÄon $3 al $4',
-'logentry-move-move-noredirect' => '$1 movis paÄon $3 al $4 sen lasante alidirektilon',
+'logentry-move-move-noredirect' => '$1 movis paÄon $3 al $4 ne lasante alidirektilon',
'logentry-move-move_redir' => '$1 movis paÄon $3 al $4 anstataÅ­igante alidirektilon',
-'logentry-move-move_redir-noredirect' => '$1 movis paÄon $3 al $4 anstataÅ­igante alidirektilon sen lasante alidirektilon',
-'logentry-patrol-patrol' => '$1 markis revizion $4 de paÄo $3 kiel patrolita',
-'logentry-patrol-patrol-auto' => '$1 aÅ­tomate markis revizion $4 de paÄo $3 kiel patrolita',
-'logentry-newusers-newusers' => '$1 kreis konton',
-'logentry-newusers-create' => '$1 kreis konton',
-'logentry-newusers-create2' => '$1 kreis uzanton $3',
-'logentry-newusers-autocreate' => 'Konto $1 estis kreita aÅ­tomate',
-'newuserlog-byemail' => 'pasvorto sendita retpoÅte',
+'logentry-move-move_redir-noredirect' => '$1 movis paÄon $3 al $4 anstataÅ­igante alidirektilon ne lasante alidirektilon',
+'logentry-patrol-patrol' => '$1 markis revizion $4 de paÄo $3 patrolita',
+'logentry-patrol-patrol-auto' => '$1 aÅ­tomate markis revizion $4 de paÄo $3 patrolita',
+'logentry-newusers-newusers' => 'Konto de uzanto $1 estis kreita',
+'logentry-newusers-create' => 'Konto de uzanto $1 estis kreita',
+'logentry-newusers-create2' => 'Konto de uzanto $3 estis kreita de $1',
+'logentry-newusers-byemail' => 'Konto de uzanto $3 estis kreita de $1 kaj pasvorto estis sendita per retpoÅto',
+'logentry-newusers-autocreate' => 'Uzantokonto $1 estis kreita aÅ­tomate',
+'logentry-rights-rights' => '$1 ÅanÄis grupan membrecon por $3 de $4 al $5',
+'logentry-rights-rights-legacy' => '$1 ÅanÄis grupan membrecon por $3',
+'logentry-rights-autopromote' => '$1 estis aÅ­tomate {{GENDER:$2|altrangigita}} de $4 al $5',
+'rightsnone' => '(nenia)',
# Feedback
'feedback-bugornote' => 'Se vi pretas priskribi teknikan problemon detale, bonvolu [$1 raporti cimon].
@@ -4070,6 +4119,7 @@ AÅ­ vi povas uzi la facilan formularon sube. Via komento estos aldonita al la pa
'api-error-ok-but-empty' => 'Interna eraro: nenia respondo de la servilo.',
'api-error-overwrite' => 'AnstataÅ­igo de ekzistanta dosiero ne permesatas.',
'api-error-stashfailed' => 'Interna eraro: la servilo malsukcesis stoki provizoran dosieron.',
+'api-error-publishfailed' => 'Interna eraro: Servilo malsukcesis eldoni provizoran dosieron.',
'api-error-timeout' => 'La servilo ne respondis ene de la antaÅ­vidita tempo.',
'api-error-unclassified' => 'Okazis nekonata eraro',
'api-error-unknown-code' => 'Nekonata eraro: "$1"',
diff --git a/languages/messages/MessagesEs.php b/languages/messages/MessagesEs.php
index 4757714a..20b2d588 100644
--- a/languages/messages/MessagesEs.php
+++ b/languages/messages/MessagesEs.php
@@ -42,6 +42,7 @@
* @author Fitoschido
* @author Fluence
* @author Gustronico
+ * @author Gwickwire
* @author Hazard-SJ
* @author Hercule
* @author Icvav
@@ -65,6 +66,7 @@
* @author Omnipaedista
* @author Orgullomoore
* @author Paucabot
+ * @author Penarc
* @author PerroVerd
* @author Pertile
* @author Piolinfax
@@ -78,6 +80,7 @@
* @author Savh
* @author Shirayuki
* @author Spacebirdy
+ * @author Stephensuleeman
* @author Technorum
* @author The Evil IP address
* @author TheBITLINK
@@ -123,7 +126,6 @@ $namespaceGenderAliases = array(
NS_USER_TALK => array( 'male' => 'Usuario_Discusión', 'female' => 'Usuaria_Discusión' ),
);
-
$specialPageAliases = array(
'Activeusers' => array( 'UsuariosActivos' ),
'Allmessages' => array( 'TodosLosMensajes' ),
@@ -193,7 +195,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'CambiosRecientes', 'Cambios_recientes' ),
'Recentchangeslinked' => array( 'CambiosEnEnlazadas', 'Cambios_en_enlazadas' ),
'Revisiondelete' => array( 'BorrarRevisión', 'Borrar_revisión' ),
- 'RevisionMove' => array( 'MoverRevision' ),
'Search' => array( 'Buscar' ),
'Shortpages' => array( 'PáginasCortas', 'Páginas_cortas' ),
'Specialpages' => array( 'PáginasEspeciales', 'Páginas_especiales' ),
@@ -231,7 +232,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__FORZAR_TDC__', '__FORZARTDC__', '__FORZARTOC__', '__FORCETOC__' ),
'toc' => array( '0', '__TDC__', '__TOC__' ),
'noeditsection' => array( '0', '__NO_EDITAR_SECCIÓN__', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__SIN_TÃTULO__', '__SINTÃTULO__', '__NOTÃTULO__', '__NOTITULO__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'MESACTUAL', 'MESACTUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'MESACTUAL1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'MESACTUALCOMPLETO', 'NOMBREMESACTUAL', 'CURRENTMONTHNAME' ),
@@ -327,8 +327,8 @@ $magicWords = array(
'raw' => array( '0', 'SINFORMATO', 'SINPUNTOS', 'RAW:' ),
'displaytitle' => array( '1', 'MOSTRARTÃTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
'rawsuffix' => array( '1', 'SF', 'R' ),
- 'newsectionlink' => array( '1', '__VINCULARANUEVASECCION__', 'VÃNCULARANUEVASECCIÓN__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__NOVINCULARANUEVASECCION__', 'NOVÃNCULARANUEVASECCIÓN__', '__NONEWSECTIONLINK__' ),
+ 'newsectionlink' => array( '1', '__VINCULARANUEVASECCION__', '__ENLACECREARSECCIÓN__', '__NEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__NOVINCULARANUEVASECCION__', '__SINENLACECREARSECCIÓN__', '__NONEWSECTIONLINK__' ),
'currentversion' => array( '1', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
'urlencode' => array( '0', 'CODIFICARURL:', 'URLENCODE:' ),
'currenttimestamp' => array( '1', 'MARCADEHORAACTUAL', 'CURRENTTIMESTAMP' ),
@@ -361,7 +361,7 @@ $dateFormats = array(
'dmy both' => 'H:i j M Y',
);
-$separatorTransformTable = array( ',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
$linkTrail = '/^([a-záéíóúñ]+)(.*)$/sDu';
$messages = array(
@@ -499,6 +499,7 @@ $messages = array(
'newwindow' => '(se abre en una ventana nueva)',
'cancel' => 'Cancelar',
'moredotdotdot' => 'Más...',
+'morenotlisted' => 'Más no en la lista...',
'mypage' => 'Mi página',
'mytalk' => 'Discusión',
'anontalk' => 'Discusión para esta IP',
@@ -510,7 +511,6 @@ $messages = array(
'qbbrowse' => 'Navegar',
'qbedit' => 'Editar',
'qbpageoptions' => 'Opciones de página',
-'qbpageinfo' => 'Información de página',
'qbmyoptions' => 'Mis páginas',
'qbspecialpages' => 'Páginas especiales',
'faq' => 'Preguntas más frecuentes',
@@ -533,6 +533,7 @@ $messages = array(
'namespaces' => 'Espacios de nombres',
'variants' => 'Variantes',
+'navigation-heading' => 'Menú de navegación',
'errorpagetitle' => 'Error',
'returnto' => 'Volver a $1.',
'tagline' => 'De {{SITENAME}}',
@@ -772,12 +773,11 @@ El administrador que lo ha bloqueado ofrece esta explicación: "$3".',
# Login and logout pages
'logouttext' => "'''Ha terminado su sesión.'''
-Puedes continuar usando {{SITENAME}} de forma anónima, o puedes [[Special:UserLogin|iniciar sesión otra vez]] con el mismo u otro usuario.
+Puedes continuar usando {{SITENAME}} de forma anónima, o puedes <span class='plainlinks'>[$1 iniciar sesión otra vez]</span> con el mismo u otro usuario.
Ten en cuenta que las páginas que tengas abiertas en otras ventanas o pestañas pueden verse como si siguieras identificado hasta que las refresques.",
-'welcomecreation' => '== ¡Bienvenido(a), $1! ==
-
-Tu cuenta ha sido creada.
-No olvides personalizar [[Special:Preferences|tus preferencias]].',
+'welcomeuser' => '¡Bienvenido, $1!',
+'welcomecreation-msg' => 'Tu cuenta ha sido creada.
+No olvides cambiar tus [[Special:Preferences|preferencias de {{SITENAME}} ]].',
'yourname' => 'Nombre de usuario:',
'yourpassword' => 'Contraseña:',
'yourpasswordagain' => 'Confirma la contraseña:',
@@ -800,7 +800,7 @@ No olvides personalizar [[Special:Preferences|tus preferencias]].',
'gotaccount' => '¿Ya tienes una cuenta? $1.',
'gotaccountlink' => 'Entrar',
'userlogin-resetlink' => '¿Olvidaste tus datos de acceso?',
-'createaccountmail' => 'por correo electrónico',
+'createaccountmail' => 'Usar una contraseña aleatoria temporal y enviarla a la siguiente dirección de correo electrónico',
'createaccountreason' => 'Motivo:',
'badretype' => 'Las contraseñas no coinciden.',
'userexists' => 'El nombre de usuario indicado ya está en uso.
@@ -874,6 +874,7 @@ Puedes ignorar este mensaje si esta cuenta fue creada por error.',
# Email sending
'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP.',
'user-mail-no-addy' => 'Se ha intentado enviar correo electrónico sin una dirección de correo electrónico.',
+'user-mail-no-body' => 'Trató de enviar un correo electrónico con un cuerpo vacío o excesivamente corto.',
# Change password dialog
'resetpass' => 'Cambiar la contraseña',
@@ -940,6 +941,7 @@ Contraseña temporal: $2',
'changeemail-oldemail' => 'Dirección de correo electrónico actual:',
'changeemail-newemail' => 'Nueva dirección de correo electrónico:',
'changeemail-none' => '(ninguna)',
+'changeemail-password' => 'Tu contraseña en {{SITENAME}}:',
'changeemail-submit' => 'Cambiar correo electrónico',
'changeemail-cancel' => 'Cancelar',
@@ -1117,7 +1119,6 @@ A continuación se muestra la última entrada de registro para referencia:",
'template-semiprotected' => '(semiprotegida)',
'hiddencategories' => 'Esta página es un miembro de {{PLURAL:$1|1 categoría oculta|$1 categorías ocultas}}:',
'edittools' => '<!-- Este texto aparecerá bajo los formularios de edición y subida. -->',
-'nocreatetitle' => 'Creación de páginas limitada',
'nocreatetext' => '{{SITENAME}} ha restringido la posibilidad de crear nuevas páginas.
Puede volver atrás y editar una página existente, [[Special:UserLogin|identificarte o crear una cuenta]].',
'nocreate-loggedin' => 'No tienes permiso para crear páginas nuevas.',
@@ -1142,6 +1143,15 @@ Parece que ha sido borrada.',
'edit-already-exists' => 'No se pudo crear una página nueva.
Ya existe.',
'defaultmessagetext' => 'Texto de mensaje predeterminado',
+'content-failed-to-parse' => 'No se pudo analizar el contenido $2 del modelo $1: $3',
+'invalid-content-data' => 'Datos de contenido inválidos',
+'content-not-allowed-here' => 'El contenido "$1" no está permitido en la página [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'texto wiki',
+'content-model-text' => 'Texto sin formato',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Aviso: Esta página contiene demasiadas llamadas a funciones sintácticas costosas (#ifexist: y similares)
@@ -1508,9 +1518,9 @@ Esto no se puede deshacer.',
'prefs-emailconfirm-label' => 'Confirmación de correo electrónico:',
'prefs-textboxsize' => 'Tamaño de la página de edición',
'youremail' => 'Correo electrónico:',
-'username' => 'Nombre de usuario:',
-'uid' => 'ID de usuario:',
-'prefs-memberingroups' => 'Miembro {{PLURAL:$1|del grupo|de los grupos}}:',
+'username' => '{{GENDER:$1|Nombre de usuario|Nombre de usuaria}}:',
+'uid' => 'ID de {{GENDER:$1|usuario|usuaria}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Miembro}} {{PLURAL:$1|del grupo|de los grupos}}:',
'prefs-registration' => 'Fecha y hora de registro:',
'yourrealname' => 'Nombre real:',
'yourlanguage' => 'Idioma:',
@@ -1658,12 +1668,13 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
'right-sendemail' => 'Enviar un correo electrónico a otros usuarios',
'right-passwordreset' => 'Ver os correos electrónicos de restablecimiento de contraseñas',
+# Special:Log/newusers
+'newuserlogpage' => 'Registro de creación de usuarios',
+'newuserlogpagetext' => 'Este es un registro de creación de usuarios.',
+
# User rights log
'rightslog' => 'Cambios de perfil de usuario',
'rightslogtext' => 'Este es un registro de cambios en los permisos de usuarios.',
-'rightslogentry' => 'modificó los grupos a los que pertenece $1: de $2 a $3',
-'rightslogentry-autopromote' => 'fue promovido automáticamente desde $2 a $3',
-'rightsnone' => '(ninguno)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'leer esta página',
@@ -1901,6 +1912,7 @@ $1',
'backend-fail-notsame' => 'Ya existe un fichero distinto en $1.',
'backend-fail-invalidpath' => '$1 no es una ruta de almacenamiento válida',
'backend-fail-delete' => 'No se pudo borrar el archivo «$1».',
+'backend-fail-describe' => 'No pudieron cambiar los metadatos del archivo "$1".',
'backend-fail-alreadyexists' => 'El archivo $1 ya existe.',
'backend-fail-store' => 'No se pudo almacenar el archivo $1 en $2.',
'backend-fail-copy' => 'No se pudo copiar el archivo $1 a $2.',
@@ -2137,6 +2149,12 @@ Entrada: contenttype/subtype, p. ej. <code>image/jpeg</code>.',
En lugar de ello deberían enlazar a una página más apropiada.<br />
Una página es considerada página de desambiguación si utiliza la plantilla que está enlazada desde [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Páginas con una propiedad de página',
+'pageswithprop-legend' => 'Páginas con una propiedad de página',
+'pageswithprop-text' => 'Esta página muestra las páginas que usan la propiedad de una página en particular',
+'pageswithprop-prop' => 'Nombre de la propiedad',
+'pageswithprop-submit' => 'Ir',
+
'doubleredirects' => 'Redirecciones dobles',
'doubleredirectstext' => 'Esta página contiene una lista de páginas que redirigen a otras páginas de redirección.
Cada fila contiene enlaces a la segunda y tercera redirección, así como la primera línea de la segunda redirección, en la que usualmente se encontrará el artículo «real» al que la primera redirección debería apuntar.
@@ -2289,7 +2307,7 @@ Véase también las [[Special:WantedCategories|categorías requeridas]].',
'linksearch-ok' => 'Buscar',
'linksearch-text' => 'Se pueden usar caracteres comodín como "*.wikipedia.org".
Es necesario, por lo menos, un dominio de alto nivel, por ejemplo "*.org".<br />
-Protocolos soportados: <code>$1</code> (si no se especifica ninguno, el protocolo por defecto es http://).',
+{{PLURAL:$2|Protocolo|Protocolos}} soportados: <code>$1</code> (si no se especifica ninguno, el protocolo por defecto es http://).',
'linksearch-line' => '$1 enlazado desde $2',
'linksearch-error' => 'Los comodines sólo pueden aparecer al principio del nombre de sitio.',
@@ -2308,10 +2326,6 @@ Protocolos soportados: <code>$1</code> (si no se especifica ninguno, el protocol
'activeusers-hidesysops' => 'Ocultar administradores',
'activeusers-noresult' => 'No se encontraron usuarios.',
-# Special:Log/newusers
-'newuserlogpage' => 'Registro de creación de usuarios',
-'newuserlogpagetext' => 'Este es un registro de creación de usuarios.',
-
# Special:ListGroupRights
'listgrouprights' => 'Permisos del grupo de usuarios',
'listgrouprights-summary' => 'La siguiente es una lista de los grupos de usuario definidos en esta wiki y de sus privilegios de acceso asociados.
@@ -2405,31 +2419,33 @@ La dirección de correo electrónico que indicaste en [[Special:Preferences|tus
'enotif_mailer' => 'Notificación por correo de {{SITENAME}}',
'enotif_reset' => 'Marcar todas las páginas como visitadas',
-'enotif_newpagetext' => 'Se trata de una nueva página.',
'enotif_impersonal_salutation' => 'usuario de {{SITENAME}}',
-'changed' => 'modificada',
-'created' => 'creada',
-'enotif_subject' => 'La página $PAGETITLE de {{SITENAME}} ha sido $CHANGEDORCREATED por $PAGEEDITOR',
+'enotif_subject_deleted' => 'La página $1 de {{SITENAME}} ha sido eliminada por {{gender:$2|$2}}',
+'enotif_subject_created' => 'La página $1 de {{SITENAME}} ha sido creada por {{GENDER:$2|$2}}',
+'enotif_subject_moved' => 'La página $1 de {{SITENAME}} ha sido trasladada por {{GENDER:$2|$2}}',
+'enotif_subject_restored' => 'La página $1 de {{SITENAME}} ha sido restaurada por {{GENDER:$2|$2}}',
+'enotif_subject_changed' => 'La página $1 de {{SITENAME}} ha sido cambiada por {{GENDER:$2|$2}}',
+'enotif_body_intro_deleted' => 'La página $1 de {{SITENAME}} ha sido borrada el $PAGEEDITDATE por {{GENDER:$2|$2}}, véase $3.',
+'enotif_body_intro_created' => 'La página $1 de {{SITENAME}} ha sido creada el $PAGEEDITDATE por {{GENDER:$2|$2}}, véase $3 para la revisión actual.',
+'enotif_body_intro_moved' => 'La página $1 de {{SITENAME}} ha sido trasladada el $PAGEEDITDATE por {{GENDER:$2|$2}}, véase $3 para la revisión actual.',
+'enotif_body_intro_restored' => 'La página $1 de {{SITENAME}} ha sido restaurada el $PAGEEDITDATE por {{GENDER:$2|$2}}, véase $3 para la revisión actual.',
+'enotif_body_intro_changed' => 'La página $1 de {{SITENAME}} ha sido cambiada el $PAGEEDITDATE por {{GENDER:$2|$2}}, véase $3 para la revisión actual.',
'enotif_lastvisited' => 'Consulta $1 para ver todos los cambios realizados desde tu última visita.',
'enotif_lastdiff' => 'Consulta $1 para ver este cambio.',
'enotif_anon_editor' => 'usuario anónimo $1',
'enotif_body' => 'Estimado/a $WATCHINGUSERNAME,
-La página de {{SITENAME}} $PAGETITLE ha sido $CHANGEDORCREATED el $PAGEEDITDATE por el usuario $PAGEEDITOR.
-La versión actual se encuentra en $PAGETITLE_URL
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
-El resumen de edición es: $PAGESUMMARY $PAGEMINOREDIT
+Resumen de edición: $PAGESUMMARY $PAGEMINOREDIT
-Contacta al editor:
+Contacta con el editor:
Correo electrónico: $PAGEEDITOR_EMAIL
Wiki: $PAGEEDITOR_WIKI
-No habrá otras notificaciones en caso de cambios adicionales, a menos que visites esta página nuevamente.
-También puedes reestablecer las notificaciones para todas tus páginas vigiladas en tu página de vigilancia.
+No habrá otras notificaciones en caso de cambios adicionales, a menos que visites esta página nuevamente. También puedes reestablecer las notificaciones de todas tus páginas que sigas en tu página de vigilancia.
- El sistema de notificación de {{SITENAME}}.
+El sistema de notificaciones de {{SITENAME}}.
--
Para cambiar las opciones de tu lista de seguimiento, visita:
@@ -2438,8 +2454,10 @@ Para cambiar las opciones de tu lista de seguimiento, visita:
Para borrar la página de tu lista de seguimiento visita:
$UNWATCHURL
-Retroalimentación y asistencia adicional:
+Comentarios y asistencia adicional:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'creada',
+'changed' => 'modificada',
# Delete
'deletepage' => 'Borrar esta página',
@@ -2510,6 +2528,8 @@ Véase [[Special:ProtectedPages|la lista de páginas protegidas]] para ver las p
'prot_1movedto2' => 'heredando la protección al trasladar [[$1]] a [[$2]]',
'protect-badnamespace-title' => 'Espacio de nombres no protegible',
'protect-badnamespace-text' => 'Las páginas de este espacio de nombres no pueden ser protegidas',
+'protect-norestrictiontypes-text' => 'Esta página no se puede proteger ya que no hay ningún tipo de restricción disponible.',
+'protect-norestrictiontypes-title' => 'Página no protegible',
'protect-legend' => 'Confirmar protección',
'protectcomment' => 'Motivo:',
'protectexpiry' => 'Caducidad:',
@@ -2589,8 +2609,8 @@ o a que la revisión haya sido restaurada o eliminada del archivo.',
'undeletedrevisions' => '{{PLURAL:$1|Una edición restaurada|$1 ediciones restauradas}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|ediciones restauradas y $2 archivo restaurado|ediciones y $2 archivos restaurados}}',
'undeletedfiles' => '$1 {{PLURAL:$1|archivo restaurado|archivos restaurados}}',
-'cannotundelete' => 'Ha fallado el deshacer el borrado;
-alguien más puede haber deshecho el borrado antes.',
+'cannotundelete' => 'Hubo un error durante la restauración:
+$1',
'undeletedpage' => "'''Se ha restaurado $1'''
Consulta el [[Special:Log/delete|registro de borrados]] para ver una lista de los últimos borrados y restauraciones.",
@@ -2622,7 +2642,7 @@ $1',
'blanknamespace' => '(Principal)',
# Contributions
-'contributions' => 'Contribuciones {{GENDER:{{BASEPAGENAME}}|del usuario|de la usuaria}}',
+'contributions' => 'Contribuciones {{GENDER:$1|del usuario|de la usuaria}}',
'contributions-title' => 'Contribuciones {{GENDER:$1|del usuario|de la usuaria}} $1',
'mycontris' => 'Contribuciones',
'contribsub2' => '$1 ($2)',
@@ -2890,6 +2910,7 @@ no se puede trasladar una página sobre sí misma.',
'immobile-target-namespace-iw' => 'Un enlace interwiki no es un destino válido para trasladar una página.',
'immobile-source-page' => 'Esta página no se puede renombrar.',
'immobile-target-page' => 'No se puede trasladar a tal título.',
+'bad-target-model' => 'El destino deseado utiliza un modelo diferente de contenido. No se puede realizar la conversión de $1 a $2.',
'imagenocrossnamespace' => 'No se puede trasladar el fichero a otro espacio de nombres',
'nonfile-cannot-move-to-file' => 'No es posible trasladar lo que no es un archivo al espacio de nombres de archivo',
'imagetypemismatch' => 'La nueva extensión de archivo no corresponde con su tipo',
@@ -3003,6 +3024,7 @@ No hay un directorio temporal.',
'import-error-interwiki' => 'La página "$1" no se ha importado porque su nombre está reservado para la vinculación externa (interwikis).',
'import-error-special' => 'La página "$1" no se ha importado porque pertenece a un espacio de nombres especial que no admite páginas.',
'import-error-invalid' => 'La página "$1" no se ha importado porque su nombre no es válido.',
+'import-error-unserialize' => 'La revisión $2 de la página "$1" no pudo dejar de hacerse en serie. Se informó de la revisión para utilizar el modelo de contenidos $3 ejecutado en serie como $4.',
'import-options-wrong' => '{{PLURAL:$2|Opción errónea|Opciones erróneas}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'La página raíz dada es un título inválido.',
'import-rootpage-nosubpage' => 'El espacio de nombres "$1" de la página raíz no permite subpáginas.',
@@ -3017,7 +3039,6 @@ No hay un directorio temporal.',
# JavaScriptTest
'javascripttest' => 'Pruebas de JavaScript',
-'javascripttest-disabled' => 'Esta función no ha sido activada en este wiki.',
'javascripttest-title' => 'Pruebas de $1 en ejecución',
'javascripttest-pagetext-noframework' => 'Esta página está reservada para ejecutar pruebas de JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Marco de pruebas desconocido "$1".',
@@ -3168,11 +3189,13 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
'pageinfo-default-sort' => 'Criterio de ordenación predeterminado',
'pageinfo-length' => 'Longitud de la página (en bytes)',
'pageinfo-article-id' => 'Identificador ID de la página',
+'pageinfo-language' => 'Idioma de la página',
'pageinfo-robot-policy' => 'Estado del motor de búsqueda',
'pageinfo-robot-index' => 'Indexable',
'pageinfo-robot-noindex' => 'No indexable',
'pageinfo-views' => 'Número de vistas',
'pageinfo-watchers' => 'Número de usuarios que vigilan la página',
+'pageinfo-few-watchers' => 'Menos de $1 {{PLURAL:$1|vigilante|vigilantes}}',
'pageinfo-redirects-name' => 'Redirecciones a esta página',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'Subpáginas de esta página',
@@ -3188,6 +3211,19 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
'pageinfo-magic-words' => '{{PLURAL:$1|Palabra mágica|Palabras mágicas}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría oculta|Categorías ocultas}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Plantilla incluida|Plantillas incluidas}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Página incluida|Páginas incluidas}} ($1)',
+'pageinfo-toolboxlink' => 'Información de la página',
+'pageinfo-redirectsto' => 'Redirige a',
+'pageinfo-redirectsto-info' => 'Información',
+'pageinfo-contentpage' => 'Contado como página de contenido',
+'pageinfo-contentpage-yes' => 'Sí',
+'pageinfo-protect-cascading' => 'Protecciones en serie activadas',
+'pageinfo-protect-cascading-yes' => 'Sí',
+'pageinfo-protect-cascading-from' => 'Protecciones en serie activadas',
+'pageinfo-category-info' => 'Información de la categoría',
+'pageinfo-category-pages' => 'Número de páginas',
+'pageinfo-category-subcats' => 'Número de subcategorías',
+'pageinfo-category-files' => 'Número de archivos',
# Skin names
'skinname-standard' => 'Estándar',
@@ -3210,6 +3246,8 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
'markedaspatrollederror' => 'No se puede marcar como patrullada',
'markedaspatrollederrortext' => 'Debes especificar una revisión para marcarla como patrullada.',
'markedaspatrollederror-noautopatrol' => 'No tienes permisos para marcar tus propios cambios como revisados.',
+'markedaspatrollednotify' => 'Este cambio realizado en $1 se ha marcado como revisado.',
+'markedaspatrollederrornotify' => 'Error al marcar como revisado.',
# Patrol log
'patrol-log-page' => 'Registro de revisiones',
@@ -3244,6 +3282,7 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
'file-nohires' => 'No disponible a mayor resolución.',
'svg-long-desc' => 'archivo SVG, nominalmente $1 × $2 píxeles, tamaño de archivo: $3',
'svg-long-desc-animated' => 'Archivo SVG animado, nominalmente de $1 × $2 píxeles, tamaño del archivo: $3',
+'svg-long-error' => 'Archivo SVG no válido: $1',
'show-big-image' => 'Resolución original',
'show-big-image-preview' => 'Tamaño de esta previsualización: $1.',
'show-big-image-other' => '{{PLURAL:$2|Otra resolución|Otras resoluciones}}: $1.',
@@ -3277,7 +3316,10 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
'minutes' => '{{PLURAL:$1|un minuto|$1 minutos}}',
'hours' => '{{PLURAL:$1|una hora|$1 horas}}',
'days' => '{{PLURAL:$1|un día|$1 días}}',
+'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
+'years' => '{{PLURAL:$1|$1 año|$1 años}}',
'ago' => 'hace $1',
+'just-now' => 'Ahora mismo',
# Bad image list
'bad_image_list' => 'El formato es el siguiente:
@@ -3767,6 +3809,7 @@ Este código de confirmación caducará el $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Transclusión interwiki está deshabilitada]',
'scarytranscludefailed' => '[Obtención de plantilla falló para $1]',
+'scarytranscludefailed-httpstatus' => '[Error de recuperación de plantilla para $1: HTTP $2]',
'scarytranscludetoolong' => '[El URL es demasiado largo]',
# Delete conflict
@@ -3881,6 +3924,7 @@ También puedes [[Special:EditWatchlist|usar el editor estándar]].',
'version-license' => 'Licencia',
'version-poweredby-credits' => "Este wiki funciona gracias a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'otros',
+'version-credits-summary' => 'Queremos reconocer a las siguientes personas por su contribución a [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki es software libre; puedes redistribuírlo y/o modificarlo bajo los términos de la Licencia General Pública GNU publicada por la Fundación del Software Libre; ya sea la versión 2 de la licencia, o (a tu elección) cualquier versión posterior.
MediaWiki es distribuído con la esperanza de que será útil, pero SIN NINGUNA GARANTÃA; ni siquiera con la garantía implícita de COMERCIALIZACIÓN ó ADAPTACIÓN A UN PROPÓSITO PARTICULAR. Véase la Licencia Pública General GNU para mayores detalles.
@@ -3998,13 +4042,13 @@ Este sitio está experimentando dificultades técnicas.',
'sqlite-no-fts' => '$1 sin soporte para búsqueda de texto completo',
# New logging system
-'logentry-delete-delete' => '$1 borró la página «$3»',
+'logentry-delete-delete' => '$1 {{GENDER:$2|borró}} la página «$3»',
'logentry-delete-restore' => '$1 restauró la página «$3»',
-'logentry-delete-event' => '$1 modificó la visibilidad de {{PLURAL:$5|un evento del registro|$5 eventos del registro}} en $3: $4',
+'logentry-delete-event' => '$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|un evento|$5 eventos}} del registro en $3: $4',
'logentry-delete-revision' => '$1 modificó la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
'logentry-delete-event-legacy' => '$1 modificó la visibilidad de los eventos del registro en $3',
'logentry-delete-revision-legacy' => '$1 modificó la visibilidad de las ediciones en la página $3',
-'logentry-suppress-delete' => '$1 borró (restricciones para administradores aplicadas) la página $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|borró}}, con restricciones para administradores aplicadas, la página $3',
'logentry-suppress-event' => '$1 modificó secretamente la visibilidad de {{PLURAL:$5|un evento del registro|$5 eventos del registro}} en $3: $4',
'logentry-suppress-revision' => '$1 modificó secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
'logentry-suppress-event-legacy' => '$1 modificó secretamente la visibilidad de los eventos del registro en $3',
@@ -4026,8 +4070,12 @@ Este sitio está experimentando dificultades técnicas.',
'logentry-newusers-newusers' => 'Se ha creado la cuenta de usuario $1',
'logentry-newusers-create' => 'Se ha creado la cuenta de usuario $1',
'logentry-newusers-create2' => '$1 ha creado la cuenta de usuario $3',
+'logentry-newusers-byemail' => '$1 creó la cuenta de usuario $3 y la contraseña se envió por correo electrónico',
'logentry-newusers-autocreate' => 'La cuenta $1 fue creada automáticamente',
-'newuserlog-byemail' => 'contraseña enviada por correo electrónico',
+'logentry-rights-rights' => '$1 modificó los grupos a los que pertenece $3: de $4 a $5',
+'logentry-rights-rights-legacy' => '$1 ha cambiado la pertenencia a grupos de $3',
+'logentry-rights-autopromote' => '$1 fue promocionado automáticamente de $4 a $5',
+'rightsnone' => '(ninguno)',
# Feedback
'feedback-bugornote' => 'Si estás preparado para describir en detalle un problema técnico, [$1 informa de un bug] por favor.
@@ -4082,6 +4130,7 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
'api-error-ok-but-empty' => 'Error interno: No hay respuesta del servidor.',
'api-error-overwrite' => 'No se permite sobrescribir un archivo existente.',
'api-error-stashfailed' => 'Error interno: El servidor no pudo almacenar el archivo temporal.',
+'api-error-publishfailed' => 'Error interno: el servidor no pudo publicar el archivo temporal.',
'api-error-timeout' => 'El servidor no respondió en el plazo previsto.',
'api-error-unclassified' => 'Ocurrió un error desconocido.',
'api-error-unknown-code' => 'Error desconocido: «$1»',
@@ -4102,4 +4151,7 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
'duration-centuries' => '$1 {{PLURAL:$1|siglo|siglos}}',
'duration-millennia' => '$1 {{PLURAL:$1|milenio|milenios}}',
+# Image rotation
+'rotate-comment' => 'Imagen girada por $1 {{PLURAL:$1|grado|grados}} en el sentido de las agujas del reloj',
+
);
diff --git a/languages/messages/MessagesEt.php b/languages/messages/MessagesEt.php
index 57085f2a..976b3e5b 100644
--- a/languages/messages/MessagesEt.php
+++ b/languages/messages/MessagesEt.php
@@ -434,7 +434,6 @@ $messages = array(
'qbbrowse' => 'Sirvi',
'qbedit' => 'Redigeeri',
'qbpageoptions' => 'Lehekülje suvandid',
-'qbpageinfo' => 'Lehekülje andmed',
'qbmyoptions' => 'Minu leheküljed',
'qbspecialpages' => 'Erileheküljed',
'faq' => 'KKK',
@@ -457,6 +456,7 @@ $messages = array(
'namespaces' => 'Nimeruumid',
'variants' => 'Variandid',
+'navigation-heading' => 'Navigeerimismenüü',
'errorpagetitle' => 'Viga',
'returnto' => 'Naase lehele $1',
'tagline' => 'Allikas: {{SITENAME}}',
@@ -697,12 +697,11 @@ Administraator lukustas selle järgmisel põhjusel: "$3".',
# Login and logout pages
'logouttext' => "'''Oled nüüd välja loginud.'''
-Võid jätkata {{GRAMMAR:genitive|{{SITENAME}}}} kasutamist anonüümselt, aga ka sama või mõne teise kasutajana uuesti [[Special:UserLogin|sisse logida]].
+Võid jätkata {{GRAMMAR:genitive|{{SITENAME}}}} kasutamist anonüümselt, aga ka sama või mõne teise kasutajana uuesti <span class='plainlinks'>[$1 sisse logida]</span>.
Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võidakse mõni lehekülg endiselt nii kuvada nagu oleksid ikka sisse logitud.",
-'welcomecreation' => '== Tere tulemast, $1! ==
-
-Sinu konto on loodud.
-Ära unusta oma {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|eelistusi]] seada.',
+'welcomeuser' => 'Tere tulemast, $1!',
+'welcomecreation-msg' => 'Sinu konto on loodud.
+Ära unusta seada oma {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|eelistusi]].',
'yourname' => 'Kasutajanimi:',
'yourpassword' => 'Parool:',
'yourpasswordagain' => 'Sisesta parool uuesti:',
@@ -725,7 +724,7 @@ Sinu konto on loodud.
'gotaccount' => "Kui sul on juba konto, '''$1'''.",
'gotaccountlink' => 'logi sisse',
'userlogin-resetlink' => 'Kas oled unustanud oma sisselogimisandmed?',
-'createaccountmail' => 'E-posti teel',
+'createaccountmail' => 'Kasuta juhuslikku parooli ja saada see allpool määratud e-posti aadressile',
'createaccountreason' => 'Põhjus:',
'badretype' => 'Sisestatud paroolid ei lange kokku.',
'userexists' => 'Sisestatud kasutajanimi on juba kasutusel.
@@ -791,6 +790,7 @@ Palun pea nüüd pisut vahet.',
# Email sending
'php-mail-error-unknown' => 'Tundmatu tõrge PHP funktsioonis mail().',
'user-mail-no-addy' => 'Püüdsid saata e-kirja ilma meiliaadressita.',
+'user-mail-no-body' => 'Püüti saata tühja või ebamõistlikult lühikese sisuosaga e-kirja.',
# Change password dialog
'resetpass' => 'Parooli muutmine',
@@ -850,6 +850,7 @@ Ajutine parool: $2',
'changeemail-oldemail' => 'Praegune e-posti aadress:',
'changeemail-newemail' => 'Uus e-posti aadress:',
'changeemail-none' => '(puudub)',
+'changeemail-password' => 'Sinu parool {{GRAMMAR:inessive|{{SITENAME}}}}:',
'changeemail-submit' => 'Muuda e-posti aadress',
'changeemail-cancel' => 'Loobu',
@@ -1030,7 +1031,6 @@ Allpool on toodud uusim logisissekanne:",
'template-protected' => '(kaitstud)',
'template-semiprotected' => '(osaliselt kaitstud)',
'hiddencategories' => 'See lehekülg kuulub {{PLURAL:$1|1 peidetud kategooriasse|$1 peidetud kategooriasse}}:',
-'nocreatetitle' => 'Lehekülje loomine piiratud',
'nocreatetext' => 'Lehekülje loomise õigus on {{GRAMMAR:inessive|{{SITENAME}}}} piiratud.
Võid pöörduda tagasi ja toimetada olemasolevat lehekülge või [[Special:UserLogin|sisse logida või uue konto luua]].',
'nocreate-loggedin' => 'Sul ei ole luba luua uusi lehekülgi.',
@@ -1054,6 +1054,14 @@ Tundub, et see on kustutatud.',
'edit-already-exists' => 'Ei saanud alustada uut lehekülge.
See on juba olemas.',
'defaultmessagetext' => 'Sõnumi vaiketekst',
+'invalid-content-data' => 'Vigased sisuandmed',
+'content-not-allowed-here' => 'Lehekülg [[$2]] ei või sisaldada $1.',
+
+# Content models
+'content-model-wikitext' => 'vikiteksti',
+'content-model-text' => 'lihtteksti',
+'content-model-javascript' => 'JavaScripti',
+'content-model-css' => 'CSSi',
# Parser/template warnings
'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.",
@@ -1413,9 +1421,9 @@ Toimingut ei saa hiljem tühistada.',
'prefs-emailconfirm-label' => 'E-posti kinnitus:',
'prefs-textboxsize' => 'Toimetamisakna suurus',
'youremail' => 'E-posti aadress:',
-'username' => 'Kasutajanimi:',
-'uid' => 'Kasutaja ID:',
-'prefs-memberingroups' => 'Kuulub {{PLURAL:$1|rühma|rühmadesse}}:',
+'username' => '{{GENDER:$1|Kasutajanimi}}:',
+'uid' => '{{GENDER:$1|Kasutaja}} ID:',
+'prefs-memberingroups' => '{{PLURAL:$1|Järgmise rühma|Järgmiste rühmade}} {{GENDER:$2|liige}}:',
'prefs-registration' => 'Registreerumise aeg:',
'yourrealname' => 'Tegelik nimi:',
'yourlanguage' => 'Keel:',
@@ -1564,12 +1572,13 @@ See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
'right-sendemail' => 'Saata teistele kasutajatele e-kirju',
'right-passwordreset' => 'Vaadata parooli lähtestamise e-kirju',
+# Special:Log/newusers
+'newuserlogpage' => 'Kasutaja loomise logi',
+'newuserlogpagetext' => 'See logi sisaldab infot äsja loodud uute kasutajate kohta.',
+
# User rights log
'rightslog' => 'Kasutaja õiguste logi',
'rightslogtext' => 'See on logi kasutajate õiguste muutuste kohta.',
-'rightslogentry' => 'andis kasutajale $1 järgmised õigused: $3; seni oli ta $2',
-'rightslogentry-autopromote' => 'sai automaatselt järgmised õigused: $3; seni oli ta $2',
-'rightsnone' => '(puudub)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'seda lehekülge lugeda',
@@ -1801,6 +1810,7 @@ Kui probleem ei kao, võta ühendust [[Special:ListUsers/sysop|administraatoriga
'backend-fail-notsame' => 'Asukohas $1 on juba olemas mitteidentne fail.',
'backend-fail-invalidpath' => '$1 pole sobiv talletustee.',
'backend-fail-delete' => 'Faili $1 ei saa kustutada.',
+'backend-fail-describe' => 'Faili "$1" metaandmeid ei saa muuta.',
'backend-fail-alreadyexists' => 'Fail $1 on juba olemas.',
'backend-fail-store' => 'Faili $1 ei saa talletada asukohas $2.',
'backend-fail-copy' => 'Faili $1 ei saa kopeerida asukohta $2.',
@@ -2019,6 +2029,12 @@ Sisesta kujul tüüp/alamtüüp, näiteks <code>image/jpeg</code>.',
Võimalik, et sellised lingid peaks viitama sobivamatele lehekülgedele.
Lehekülg loetakse täpsustusleheküljeks, kui see kasutab malli, millele viitab sõnum [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Leheatribuudiga leheküljed',
+'pageswithprop-legend' => 'Leheatribuudiga leheküljed',
+'pageswithprop-text' => 'Sellel leheküljel on loetletud mõnd leheatribuuti kasutavad leheküljed.',
+'pageswithprop-prop' => 'Atribuudi nimi:',
+'pageswithprop-submit' => 'Mine',
+
'doubleredirects' => 'Kahekordsed ümbersuunamised',
'doubleredirectstext' => 'Käesolev leht esitab loendi lehtedest, mis sisaldavad ümbersuunamisi teistele ümbersuunamislehtedele.
Igal 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.
@@ -2172,7 +2188,7 @@ Vaata ka [[Special:WantedCategories|puuduvaid kategooriaid]].',
'linksearch-ok' => 'Otsi',
'linksearch-text' => 'Metamärgina võib kasutada tärni, näiteks "*.wikipedia.org".
Otsingus peab olema vähemalt tipptaseme domeen, näiteks "*.org".<br />
-Toetatud protokollid: <code>$1</code> (otsingus ära neid kasuta).',
+Toetatud {{PLURAL:$2|protokoll|protokollid}}: <code>$1</code> (määramata protokolli korral vaikimisi http://).',
'linksearch-line' => '$1 on lingitud leheküljelt $2',
'linksearch-error' => 'Metamärk võib olla ainult internetiaadressi alguses.',
@@ -2191,10 +2207,6 @@ Toetatud protokollid: <code>$1</code> (otsingus ära neid kasuta).',
'activeusers-hidesysops' => 'Peida administraatorid',
'activeusers-noresult' => 'Kasutajaid ei leidunud.',
-# Special:Log/newusers
-'newuserlogpage' => 'Kasutaja loomise logi',
-'newuserlogpagetext' => 'See logi sisaldab infot äsja loodud uute kasutajate kohta.',
-
# Special:ListGroupRights
'listgrouprights' => 'Kasutajarühma õigused',
'listgrouprights-summary' => 'Siin on loetletud selle viki kasutajarühmad ja rühmaga seotud õigused.
@@ -2288,19 +2300,23 @@ Edasised muudatused sellel leheküljel ja seotud aruteluleheküljel tuuakse ära
'enotif_mailer' => '{{GRAMMAR:genitive|{{SITENAME}}}} lehekülje muutmise teavitaja',
'enotif_reset' => 'Märgi kõik lehed loetuks',
-'enotif_newpagetext' => 'See on uus lehekülg.',
'enotif_impersonal_salutation' => '{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja',
-'changed' => 'muutnud lehekülge',
-'created' => 'loonud lehekülje',
-'enotif_subject' => '$PAGEEDITOR on {{GRAMMAR:inessive|{{SITENAME}}}} $CHANGEDORCREATED $PAGETITLE',
+'enotif_subject_deleted' => '{{GENDER:$2|$2}} kustutas {{GRAMMAR:genitive|{{SITENAME}}}} lehekülje $1',
+'enotif_subject_created' => '{{GENDER:$2|$2}} alustas {{GRAMMAR:genitive|{{SITENAME}}}} lehekülge $1',
+'enotif_subject_moved' => '{{GENDER:$2|$2}} teisaldas {{GRAMMAR:genitive|{{SITENAME}}}} lehekülje $1',
+'enotif_subject_restored' => '{{GENDER:$2|$2}} taastas {{GRAMMAR:genitive|{{SITENAME}}}} lehekülje $1',
+'enotif_subject_changed' => '{{GENDER:$2|$2}} muutis {{GRAMMAR:genitive|{{SITENAME}}}} lehekülge $1',
+'enotif_body_intro_deleted' => '$2 kustutas {{GRAMMAR:genitive|{{SITENAME}}}} lehekülje $1 kuupäeval $PAGEEDITDATE. Vaata lehekülge aadressil $3.',
+'enotif_body_intro_created' => '$2 alustas {{GRAMMAR:genitive|{{SITENAME}}}} lehekülge $1 kuupäeval $PAGEEDITDATE. Vaata lehekülje praegust redaktsiooni aadressil $3.',
+'enotif_body_intro_moved' => '$2 teisaldas {{GRAMMAR:genitive|{{SITENAME}}}} lehekülje $1 kuupäeval $PAGEEDITDATE. Vaata lehekülje praegust redaktsiooni aadressil $3.',
+'enotif_body_intro_restored' => '$2 taastas {{GRAMMAR:genitive|{{SITENAME}}}} lehekülje $1 kuupäeval $PAGEEDITDATE. Vaata lehekülje praegust redaktsiooni aadressil $3.',
+'enotif_body_intro_changed' => '$2 muutis {{GRAMMAR:genitive|{{SITENAME}}}} lehekülge $1 kuupäeval $PAGEEDITDATE. Vaata lehekülje praegust redaktsiooni aadressil $3.',
'enotif_lastvisited' => 'Kõigi sinu viimase külastuse järel tehtud muudatuste nägemiseks vaata: $1.',
'enotif_lastdiff' => 'Muudatus on leheküljel $1.',
'enotif_anon_editor' => 'anonüümne kasutaja $1',
'enotif_body' => 'Lugupeetud $WATCHINGUSERNAME
-{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja $PAGEEDITOR on kuupäeval $PAGEEDITDATE $CHANGEDORCREATED $PAGETITLE. Lehe praegune redaktsioon on asukohas $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Redigeerija resümee: $PAGESUMMARY $PAGEMINOREDIT
@@ -2308,7 +2324,7 @@ Redigeerijaga ühenduse võtmine:
e-post: $PAGEEDITOR_EMAIL
viki: $PAGEEDITOR_WIKI
-Seni kuni sa seda lehte ei külasta, selle lehe uute muudatuste kohta sulle uusi teavitus-e-kirju ei saadeta.
+Seni kuni sa seda lehte ei külasta, selle lehega seotud toimingute kohta sulle uusi teavitus-e-kirju ei saadeta. Jälgimisloendis saaksid kõigi jälgitavate lehekülgedega seotud teavitussätted ka lähtestada.
Abivalmilt
{{GRAMMAR:genitive|{{SITENAME}}}} teavitussüsteem
@@ -2324,6 +2340,8 @@ Lehekülje kustutamiseks jälgimisloendist mine leheküljele $UNWATCHURL.
Tagasiside ja abi:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'loonud lehekülje',
+'changed' => 'muutnud lehekülge',
# Delete
'deletepage' => 'Kustuta lehekülg',
@@ -2392,6 +2410,8 @@ Mine tagasi eelmisele leheküljele ja taaslaadi see, seejärel proovi uuesti.',
'prot_1movedto2' => 'Lehekülg "[[$1]]" teisaldatud pealkirja "[[$2]]" alla',
'protect-badnamespace-title' => 'Kaitstamatu nimeruum',
'protect-badnamespace-text' => 'Selles nimeruumis olevaid lehekülgi ei saa kaitsta.',
+'protect-norestrictiontypes-text' => 'Seda lehekülge ei saa kaitsta, sest ühtki piirangutüüpi pole saadaval.',
+'protect-norestrictiontypes-title' => 'Kaitstamatu lehekülg',
'protect-legend' => 'Kaitse kinnitamine',
'protectcomment' => 'Põhjus:',
'protectexpiry' => 'Aegub:',
@@ -2476,7 +2496,8 @@ Link võib olla kõlbmatu või redaktsioon võib olla taastatud või arhiivist e
'undeletedrevisions' => '$1 {{PLURAL:$1|redaktsioon|redaktsiooni}} taastatud',
'undeletedrevisions-files' => '{{PLURAL:$1|1 redaktsioon|$1 redaktsiooni}} ja {{PLURAL:$2|1 fail|$2 faili}} taastatud',
'undeletedfiles' => '{{PLURAL:$1|1 fail|$1 faili}} taastatud',
-'cannotundelete' => 'Taastamine ebaõnnestus; keegi teine võis lehe juba taastada.',
+'cannotundelete' => 'Taastamine ebaõnnestus:
+$1',
'undeletedpage' => "'''$1 on taastatud'''
[[Special:Log/delete|Kustutamise logist]] võib leida loendi viimastest kustutamistest ja taastamistest.",
@@ -2508,7 +2529,7 @@ $1',
'blanknamespace' => '(Artiklid)',
# Contributions
-'contributions' => 'Kasutaja kaastöö',
+'contributions' => '{{GENDER:$1|Kasutaja}} kaastöö',
'contributions-title' => 'Kasutaja $1 kaastöö',
'mycontris' => 'Kaastöö',
'contribsub2' => 'Kasutaja $1 ($2) jaoks',
@@ -2909,7 +2930,6 @@ Palun ürita uuesti.',
# JavaScriptTest
'javascripttest' => 'JavaScripti katsetamine',
-'javascripttest-disabled' => 'See funktsioon pole selles vikis lubatud.',
'javascripttest-title' => '$1-katse käitus',
'javascripttest-pagetext-noframework' => 'Seda lehekülge hoitakse JavaScripti katsete jaoks.',
'javascripttest-pagetext-unknownframework' => 'Tundmatu katseraamistik "$1".',
@@ -3032,11 +3052,13 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
'pageinfo-default-sort' => 'Vaikejärjestusvõti',
'pageinfo-length' => 'Lehekülje pikkus (baitides)',
'pageinfo-article-id' => 'Lehekülje identifikaator',
+'pageinfo-language' => 'Lehekülje sisu keel',
'pageinfo-robot-policy' => 'Otsimootori olek',
'pageinfo-robot-index' => 'Indekseeritav',
'pageinfo-robot-noindex' => 'Indekseerimatu',
'pageinfo-views' => 'Vaatamiste arv',
'pageinfo-watchers' => 'Lehekülje jälgijate arv',
+'pageinfo-few-watchers' => 'Alla {{PLURAL:$1|ühe jälgija|$1 jälgija}}',
'pageinfo-redirects-name' => 'Ümbersuunamisi sellele leheküljele',
'pageinfo-subpages-name' => 'Selle lehekülje alamlehekülgi',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ümbersuunamine|ümbersuunamist}}; $3 {{PLURAL:$3|mitteümbersuunamine|mitteümbersuunamist}})',
@@ -3051,6 +3073,18 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
'pageinfo-magic-words' => '{{PLURAL:$1|Võlusõna|Võlusõnad}} ($1)',
'pageinfo-hidden-categories' => 'Peidetud {{PLURAL:$1|kategooria|kategooriad}} ($1)',
'pageinfo-templates' => 'Kasutatud {{PLURAL:$1|mall|mallid}} ($1)',
+'pageinfo-toolboxlink' => 'Lehekülje andmed',
+'pageinfo-redirectsto' => 'Ümber suunatud leheküljele',
+'pageinfo-redirectsto-info' => 'teave',
+'pageinfo-contentpage' => 'Arvestatakse sisuleheküljena',
+'pageinfo-contentpage-yes' => 'Jah',
+'pageinfo-protect-cascading' => 'Siit lähtub kaskaadkaitse',
+'pageinfo-protect-cascading-yes' => 'Jah',
+'pageinfo-protect-cascading-from' => 'Kaskaadkaitse lähtub lehekülgedelt',
+'pageinfo-category-info' => 'Kategooria teave',
+'pageinfo-category-pages' => 'Lehekülgede arv',
+'pageinfo-category-subcats' => 'Alamkategooriate arv',
+'pageinfo-category-files' => 'Failide arv',
# Skin names
'skinname-standard' => 'Algeline',
@@ -3073,6 +3107,8 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
'markedaspatrollederror' => 'Ei saa kontrollituks märkida',
'markedaspatrollederrortext' => 'Vajalik on määrata, milline versioon märkida kontrollituks.',
'markedaspatrollederror-noautopatrol' => 'Enda muudatusi ei saa kontrollituks märkida.',
+'markedaspatrollednotify' => 'See muudatus leheküljel $1 on märgitud kontrollituks.',
+'markedaspatrollederrornotify' => 'Kontrollituks märkimine ebaõnnestus.',
# Patrol log
'patrol-log-page' => 'Kontrollimislogi',
@@ -3106,6 +3142,7 @@ Selle avamine võib su arvutit kahjustada.",
'file-nohires' => 'Sellest suuremat pilti pole.',
'svg-long-desc' => 'SVG-fail, algsuurus $1 × $2 pikslit, faili suurus: $3',
'svg-long-desc-animated' => 'Animeeritud SVG-fail, algsuurus $1 × $2 pikslit, faili suurus: $3',
+'svg-long-error' => 'Vigane SVG-fail: $1',
'show-big-image' => 'Originaalsuurus',
'show-big-image-preview' => 'Selle eelvaate suurus: $1.',
'show-big-image-other' => '{{PLURAL:$2|Teine eraldusvõime|Teised eraldusvõimed}}: $1.',
@@ -3136,7 +3173,10 @@ Järgnevas loendis, mis on sorteeritud $2, on '''$1''' {{PLURAL:$1|fail|faili}}.
'minutes' => '{{PLURAL:$1|üks minut|$1 minutit}}',
'hours' => '{{PLURAL:$1|üks tund|$1 tundi}}',
'days' => '{{PLURAL:$1|üks päev|$1 päeva}}',
+'months' => '{{PLURAL:$1|Ãœks kuu|$1 kuud}}',
+'years' => '{{PLURAL:$1|Ãœks aasta|$1 aastat}}',
'ago' => '$1 tagasi',
+'just-now' => 'just nüüd',
# Bad image list
'bad_image_list' => 'Arvesse võetakse ainult nimekirja ühikud (read, mis algavad sümboliga *).
@@ -3708,6 +3748,7 @@ Sa võid [[Special:EditWatchlist|kasutada ka harilikku tekstiredaktorit]].',
'version-license' => 'Litsents',
'version-poweredby-credits' => "See viki kasutab '''[//www.mediawiki.org/ MediaWiki]''' tarkvara. Autoriõigus © 2001–$1 $2.",
'version-poweredby-others' => 'teised',
+'version-credits-summary' => 'Tahame tunnustada järgmisi inimesi [[Special:Version|MediaWikile]] tehtud kaastöö eest.',
'version-license-info' => "MediaWiki on vaba tarkvara; tohid seda taaslevitada ja/või selle põhjal teisendeid luua vastavalt Vaba Tarkvara Fondi avaldatud GNU Üldise Avaliku Litsentsi versioonis 2 või hilisemas seatud tingimustele.
MediaWiki tarkvara levitatakse lootuses, et see on kasulik, aga '''igasuguse tagatiseta''', ka kaudse tagatiseta teose '''turustatavuse''' või '''müügikõlblikkuse''' kohta. Üksikasjad leiad GNU Üldisest Avalikust Litsentsist.
@@ -3822,17 +3863,17 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
'sqlite-no-fts' => '$1 ilma täistekstiotsingu toeta',
# New logging system
-'logentry-delete-delete' => '$1 kustutas lehekülje $3',
-'logentry-delete-restore' => '$1 taastas lehekülje $3',
-'logentry-delete-event' => '$1 muutis leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
-'logentry-delete-revision' => '$1 muutis leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
-'logentry-delete-event-legacy' => '$1 muutis leheküljel $3 logisündmuste nähtavust',
-'logentry-delete-revision-legacy' => '$1 muutis leheküljel $3 redaktsioonide nähtavust',
-'logentry-suppress-delete' => '$1 varjas lehekülje $3',
-'logentry-suppress-event' => '$1 muutis salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
-'logentry-suppress-revision' => '$1 muutis salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
-'logentry-suppress-event-legacy' => '$1 muutis salaja leheküljel $3 logisündmuste nähtavust',
-'logentry-suppress-revision-legacy' => '$1 muutis salaja leheküljel $3 redaktsioonide nähtavust',
+'logentry-delete-delete' => '$1 {{GENDER:$2|kustutas}} lehekülje $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|taastas}} lehekülje $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|muutis}} leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|muutis}} leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|muutis}} leheküljel $3 logisündmuste nähtavust',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|muutis}} leheküljel $3 redaktsioonide nähtavust',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|varjas}} lehekülje $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|muutis}} salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|muutis}} salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|muutis}} salaja leheküljel $3 logisündmuste nähtavust',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|muutis}} salaja leheküljel $3 redaktsioonide nähtavust',
'revdelete-content-hid' => 'peideti sisu',
'revdelete-summary-hid' => 'peideti resümee',
'revdelete-uname-hid' => 'peideti kasutajanimi',
@@ -3841,17 +3882,17 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
'revdelete-uname-unhid' => 'nähtavaks tehti kasutajanimi',
'revdelete-restricted' => 'kehtestati piirangud administraatoritele',
'revdelete-unrestricted' => 'eemaldati administraatoritelt piirangud',
-'logentry-move-move' => '$1 teisaldas lehekülje $3 pealkirja $4 alla',
-'logentry-move-move-noredirect' => '$1 teisaldas lehekülje $3 pealkirja $4 alla ümbersuunamist maha jätmata',
-'logentry-move-move_redir' => '$1 teisaldas lehekülje $3 ümbersuunamise $4 asemele',
-'logentry-move-move_redir-noredirect' => '$1 teisaldas lehekülje $3 ümbersuunamise $4 asemele ümbersuunamist maha jätmata',
-'logentry-patrol-patrol' => '$1 märkis lehekülje $3 redaktsiooni $4 kontrollituks',
-'logentry-patrol-patrol-auto' => '$1 märkis automaatselt lehekülje $3 redaktsiooni $4 kontrollituks',
-'logentry-newusers-newusers' => 'Loodud kasutajakonto $1',
-'logentry-newusers-create' => 'Loodud kasutajakonto $1',
-'logentry-newusers-create2' => '$1 lõi kasutajakonto $3',
-'logentry-newusers-autocreate' => 'Konto $1 loodi automaatselt',
-'newuserlog-byemail' => 'parool saadetud e-postiga',
+'logentry-move-move' => '$1 {{GENDER:$2|teisaldas}} lehekülje $3 pealkirja $4 alla',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|teisaldas}} lehekülje $3 pealkirja $4 alla ümbersuunamist maha jätmata',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|teisaldas}} lehekülje $3 ümbersuunamise $4 asemele',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|teisaldas}} lehekülje $3 ümbersuunamise $4 asemele ümbersuunamist maha jätmata',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|märkis}} lehekülje $3 redaktsiooni $4 kontrollituks',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|märkis}} automaatselt lehekülje $3 redaktsiooni $4 kontrollituks',
+'logentry-newusers-newusers' => '{{GENDER:$2|Loodud}} kasutajakonto $1',
+'logentry-newusers-create' => '{{GENDER:$2|Loodud}} kasutajakonto $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|lõi}} kasutajakonto $3',
+'logentry-newusers-autocreate' => 'Konto $1 {{GENDER:$2|loodi}} automaatselt',
+'rightsnone' => '(puudub)',
# Feedback
'feedback-bugornote' => 'Kui arvad, et oskad tehnilist probleemi üksikasjalikult kirjeldada, [$1 teata veast].
@@ -3905,6 +3946,7 @@ Kui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajan
'api-error-ok-but-empty' => 'Sisetõrge: Server ei vasta.',
'api-error-overwrite' => 'Olemasolevate failide ülekirjutamine pole lubatud.',
'api-error-stashfailed' => 'Sisetõrge: Serveril ei õnnestunud ajutist faili talletada.',
+'api-error-publishfailed' => 'Sisetõrge: Serveril ebaõnnestus ajutise faili avaldamine.',
'api-error-timeout' => 'Server ei vastanud oodatud aja sees.',
'api-error-unclassified' => 'Ilmnes teadmata tõrge.',
'api-error-unknown-code' => 'Teadmata tõrge: "$1"',
@@ -3925,4 +3967,7 @@ Kui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajan
'duration-centuries' => '$1 {{PLURAL:$1|sajand|sajandit}}',
'duration-millennia' => '$1 {{PLURAL:$1|aastatuhat|aastatuhandet}}',
+# Image rotation
+'rotate-comment' => 'Pilti pööratud $1 {{PLURAL:$1|kraad|kraadi}} päripäeva',
+
);
diff --git a/languages/messages/MessagesEu.php b/languages/messages/MessagesEu.php
index 6bce6c71..896e2aca 100644
--- a/languages/messages/MessagesEu.php
+++ b/languages/messages/MessagesEu.php
@@ -258,6 +258,7 @@ $messages = array(
'newwindow' => '(leiho berrian irekitzen da)',
'cancel' => 'Utzi',
'moredotdotdot' => 'Gehiago...',
+'morenotlisted' => 'Zerrendatu gabeko gehiago...',
'mypage' => 'Orrialdea',
'mytalk' => 'Eztabaida',
'anontalk' => 'IP honen eztabaida',
@@ -269,7 +270,6 @@ $messages = array(
'qbbrowse' => 'Arakatu',
'qbedit' => 'Aldatu',
'qbpageoptions' => 'Orrialde hau',
-'qbpageinfo' => 'Testuingurua',
'qbmyoptions' => 'Nire orrialdeak',
'qbspecialpages' => 'Aparteko orrialdeak',
'faq' => 'Maiz egindako galderak',
@@ -292,6 +292,7 @@ $messages = array(
'namespaces' => 'Izen-tarteak',
'variants' => 'Aldaerak',
+'navigation-heading' => 'Nabigazio menua',
'errorpagetitle' => 'Errorea',
'returnto' => '$1(e)ra itzuli.',
'tagline' => '{{SITENAME}}(e)tik',
@@ -532,11 +533,9 @@ Blokeoa ezarri zuen administratzaileak honako arrazoia eman zuen: "$3".',
# Login and logout pages
'logouttext' => "'''Saioa itxi egin duzu.'''
-Erabiltzaile anonimo bezala jarrai dezakezu {{SITENAME}} erabiltzen, edo [[Special:UserLogin|saioa has dezakezu berriz]] erabiltzaile berdinarekin edo ezberdin batekin.
+Erabiltzaile anonimo bezala jarrai dezakezu {{SITENAME}} erabiltzen, edo <span class='plainlinks'>[$1 saioa has dezakezu berriz]</span> erabiltzaile berdinarekin edo ezberdin batekin.
Kontuan izan orrialde batzuk saioa hasita bazenu bezala ikus ditzakezula nabigatzailearen katxea garbitu arte.",
-'welcomecreation' => '== Ongi etorri, $1! ==
-
-Zure kontua sortu egin da. Ez ahaztu [[Special:Preferences|{{SITENAME}}(e)ko hobespenak]] aldatzea.',
+'welcomeuser' => 'Ongi etorri, $1!',
'yourname' => 'Erabiltzaile izena',
'yourpassword' => 'Pasahitza:',
'yourpasswordagain' => 'Pasahitza berriz',
@@ -558,7 +557,7 @@ Zure kontua sortu egin da. Ez ahaztu [[Special:Preferences|{{SITENAME}}(e)ko hob
'gotaccount' => "Baduzu erabiltzaile kontua? '''$1'''.",
'gotaccountlink' => 'Saioa hasi',
'userlogin-resetlink' => 'Saioa hasteko datuak ahaztu dituzu?',
-'createaccountmail' => 'e-postaz',
+'createaccountmail' => 'Erabili behin-behineko pasahitz ausazko bat eta bidali behean agertzeko den e-posta helbidera',
'createaccountreason' => 'Arrazoia:',
'badretype' => 'Idatzitako pasahitzak ez dira berdinak.',
'userexists' => 'Aukeratutako erabiltzaile izena hartuta dago.
@@ -832,7 +831,6 @@ Azken erregistroko sarrera ematen da azpian erreferentzia gisa:",
'template-semiprotected' => '(erdi-babestua)',
'hiddencategories' => 'Orrialde hau {{PLURAL:$1|kategoria izkutu bateko|$1 kategoria izkutuko}} kide da:',
'edittools' => '<!-- Hemen jarritako testua aldaketa eta igoera formularioen azpian agertuko da. -->',
-'nocreatetitle' => 'Orrialdeak sortzea mugatuta',
'nocreatetext' => 'Gune honek orrialde berriak sortzeko gaitasuna mugatu du. Atzera egin dezakezu existitzen den orrialde bat aldatzeko, edo [[Special:UserLogin|saio hasi edo kontua sortu]].',
'nocreate-loggedin' => 'Ez duzu orri berriak sortzeko baimenik.',
'sectioneditnotsupported-title' => 'Ezin dira atalak aldatu',
@@ -855,6 +853,12 @@ Ez du azalpenik eman.',
'edit-already-exists' => 'Ezin izan da orri berria sortu.
Jada existitzen da.',
+# Content models
+'content-model-wikitext' => 'wikitestua',
+'content-model-text' => 'testu laua',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
# Parser/template warnings
'expensive-parserfunction-warning' => 'Adi: Orrialde honek parser funtzio deialdi oso garesti gehiegi ditu.
@@ -1199,9 +1203,9 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
'prefs-emailconfirm-label' => 'E-posta baieztapena:',
'prefs-textboxsize' => 'Editatze lehioaren tamaina',
'youremail' => 'E-posta:',
-'username' => 'Erabiltzaile izena:',
-'uid' => 'Erabiltzaile zenbakia:',
-'prefs-memberingroups' => '{{PLURAL:$1|Taldeko|taldeetako}} kidea:',
+'username' => '{{GENDER:$1|Erabiltzaile izena}}:',
+'uid' => '{{GENDER:$1|Erabiltzaile}} zenbakia:',
+'prefs-memberingroups' => '{{PLURAL:$1|Taldeko|taldeetako}} {{GENDER:$2|kidea}}:',
'prefs-registration' => 'Erregistratzeko unea:',
'yourrealname' => 'Benetako izena:',
'yourlanguage' => 'Hizkuntza:',
@@ -1346,11 +1350,13 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
'right-override-export-depth' => '5eko sakonerararteko loturiko orrialdeak barne esportatu',
'right-sendemail' => 'Beste erabiltzaileei e-posta bidali',
+# Special:Log/newusers
+'newuserlogpage' => 'Erabiltzaile erregistroa',
+'newuserlogpagetext' => 'Hau azken erabiltzaileen sorreren erregistroa da.',
+
# User rights log
'rightslog' => 'Erabiltzaile eskubideen erregistroa',
'rightslogtext' => 'Erabiltzaile eskubideetan izandako aldaketen erregistroa da hau.',
-'rightslogentry' => '$1(r)en partaidetza aldatu da $2(e)tik $3(e)ra',
-'rightsnone' => '(bat ere ez)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'orrialde hau irakurri',
@@ -1877,10 +1883,6 @@ Baimendutako protokoloak: <code>$1</code> (protokoloa zehazten ez bada http:// h
'activeusers-hidesysops' => 'Ezkutatu administratzaileak',
'activeusers-noresult' => 'Ez da lankiderik aurkitu.',
-# Special:Log/newusers
-'newuserlogpage' => 'Erabiltzaile erregistroa',
-'newuserlogpagetext' => 'Hau azken erabiltzaileen sorreren erregistroa da.',
-
# Special:ListGroupRights
'listgrouprights' => 'Erabiltzaile talde eskumenak',
'listgrouprights-summary' => 'Ondorengo zerrendak wikian dauden lankide taldeak agertzen dira, beraien eskubideekin.
@@ -1967,11 +1969,7 @@ Jarraipen zerrendatik artikulua kentzeko, artikuluan ''ez jarraitu''ri eman.",
'enotif_mailer' => '{{SITENAME}}(e)ko Oharpen Postaria',
'enotif_reset' => 'Orrialde guztiak bisitatu bezala markatu',
-'enotif_newpagetext' => 'Honako hau orrialde berria da.',
'enotif_impersonal_salutation' => '{{SITENAME}} erabiltzailea',
-'changed' => 'aldatu',
-'created' => 'sortu',
-'enotif_subject' => '{{SITENAME}}(e)ko $PAGETITLE orrialdea $PAGEEDITOR(e)k $CHANGEDORCREATED du',
'enotif_lastvisited' => 'Jo $1 orrialdera zure azken bisitaz geroztik izandako aldaketa guztiak ikusteko.',
'enotif_lastdiff' => 'Jo $1(e)ra aldaketa hau ikusteko.',
'enotif_anon_editor' => '$1 erabiltzaile anonimoa',
@@ -2004,6 +2002,8 @@ $UNWATCHURL
Laguntza:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'sortu',
+'changed' => 'aldatu',
# Delete
'deletepage' => 'Orrialdea ezabatu',
@@ -2180,7 +2180,7 @@ $1',
'blanknamespace' => '(Nagusia)',
# Contributions
-'contributions' => 'Lankidearen ekarpenak',
+'contributions' => '{{GENDER:$1|Lankidearen}} ekarpenak',
'contributions-title' => '$1(r)entzat lankidearen ekarpenak',
'mycontris' => 'Ekarpenak',
'contribsub2' => '$1 ($2)',
@@ -2630,6 +2630,7 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.',
'pageinfo-default-sort' => 'Ordenatze irizpide lehenetsia',
'pageinfo-length' => 'Orriaren neurria (byteak)',
'pageinfo-article-id' => 'Orriaren identifikazio zenbakia',
+'pageinfo-language' => 'Orriaren edukiaren hizkuntza',
'pageinfo-robot-policy' => 'Bilaketa motorraren egoera',
'pageinfo-robot-index' => 'Indexagarria',
'pageinfo-robot-noindex' => 'Indexaezina',
@@ -2647,6 +2648,13 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.',
'pageinfo-recent-authors' => 'Oraintsuko egileen kopurua',
'pageinfo-hidden-categories' => 'Ezkutuko {{PLURAL:$1|kategoria|kategoriak}} ($1)',
'pageinfo-templates' => 'Txertatutako {{PLURAL:$1|txantiloia|txantiloiak}} ($1)',
+'pageinfo-toolboxlink' => 'Orri honen datuak',
+'pageinfo-redirectsto-info' => 'Informazioa',
+'pageinfo-contentpage' => 'Eduki-orritzat zenbatua',
+'pageinfo-contentpage-yes' => 'Bai',
+'pageinfo-protect-cascading' => 'Serieko babesa, orri honetatik',
+'pageinfo-protect-cascading-yes' => 'Bai',
+'pageinfo-protect-cascading-from' => 'Serieko babesak aktibatuta. Sorburua:',
# Skin names
'skinname-standard' => 'Lehenetsia',
@@ -3347,17 +3355,19 @@ Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutak
'htmlform-selectorother-other' => 'Beste bat',
# New logging system
-'logentry-delete-delete' => '$1 wikilariak $3 orria ezabatu du',
+'logentry-delete-delete' => '$1 wikilariak «$3» orria ezabatu du',
+'logentry-delete-event' => '$1 wikilariak ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4',
+'logentry-suppress-event' => '$1 wikilariak ezkutuan ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4',
'revdelete-restricted' => 'administratzaileentzako mugak ezarri dira',
'revdelete-unrestricted' => 'administratzaileentzako mugak kendu dira',
'logentry-move-move' => '$1 wikilariak «$3» orria «$4» izenera aldatu du',
'logentry-move-move-noredirect' => '$1 wikilariak «$3» orria «$4» izenera aldatu du, birzuzenketarik utzi gabe',
'logentry-move-move_redir' => '$1 wikilariak «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik',
'logentry-move-move_redir-noredirect' => '$1 wikilariak «$3» orria «$4» izenera aldatu du, birzuzenketa bat gainidatzita, birzuzenketarik utzi gabe',
-'logentry-newusers-newusers' => '$1 wikilariak erabiltzaile kontu bat sortu du',
-'logentry-newusers-create' => '$1 wikilariak erabiltzaile kontu bat sortu du',
-'logentry-newusers-create2' => '$1 wikilariak $3 erabiltzaile kontu bat sortu du',
-'newuserlog-byemail' => 'pasahitza e-postaz bidali da',
+'logentry-newusers-newusers' => '$1 erabiltzaile kontua sortu da',
+'logentry-newusers-create' => '$1 erabiltzaile kontua sortu da',
+'logentry-newusers-create2' => '$1 wikilariak $3 erabiltzaile kontua sortu du',
+'rightsnone' => '(bat ere ez)',
# Feedback
'feedback-subject' => 'Gaia:',
diff --git a/languages/messages/MessagesExt.php b/languages/messages/MessagesExt.php
index 561071df..61a1b3af 100644
--- a/languages/messages/MessagesExt.php
+++ b/languages/messages/MessagesExt.php
@@ -153,7 +153,6 @@ $messages = array(
'qbbrowse' => 'Escrucal',
'qbedit' => 'Eital',
'qbpageoptions' => 'Esta páhina',
-'qbpageinfo' => 'Contestu',
'qbmyoptions' => 'Las mis páhinas',
'qbspecialpages' => 'Páhinas especialis',
'faq' => 'FAQ',
@@ -377,12 +376,8 @@ La razón es la siguienti: ''$2''.",
# Login and logout pages
'logouttext' => "'''Cuenta afechá corretamenti.'''<br />
-Pueis acontinal gastandu {{SITENAME}} de holma anónima, u [[Special:UserLogin|entral ena tu cuenta]] con el mesmu ussuáriu, u con otru.
+Pueis acontinal gastandu {{SITENAME}} de holma anónima, u <span class='plainlinks'>[$1 entral ena tu cuenta]</span> con el mesmu ussuáriu, u con otru.
Dati cuenta que hata que nu esborris el caché del tu escrucaol pué paecel que la tu cuenta acontina abierta n'angunas páginas.",
-'welcomecreation' => "== Bienviniu, $1! ==
-
-La tu cuenta d'ussuáriu á siu criá.
-Alcuerdati de chambal las tus [[Special:Preferences|preferéncias de {{SITENAME}}]].",
'yourname' => "Nombri d'usuáriu:",
'yourpassword' => 'Consínia:',
'yourpasswordagain' => 'Escrebi e nuevu la consínia:',
@@ -616,7 +611,6 @@ Embaju se muestra el rustriju d'acessu cumu referéncia:",
'template-semiprotected' => '(abati-protehiu)',
'hiddencategories' => 'Esta páhina preteneci a {{PLURAL:$1|1 categoria açonchá|$1 categorias açonchás}}:',
'edittools' => '<!-- Esti testu apaicirá embahu los hormulárius d´eición i empuntu. -->',
-'nocreatetitle' => 'Criaeru e páhinas enlimitau',
'nocreatetext' => 'Nu se premiti crial páhinas nuevas a usuárius anónimus.
Pueis gorvel i eital anguna páhina ya desistenti, u [[Special:UserLogin|rustrilti]].',
'nocreate-loggedin' => 'Nu tiés premissu pa crial nuevas páginas.',
@@ -954,11 +948,12 @@ Amás premiti qu'otrus ussuárius contatin contigu pol mé la tu página d'ussuÃ
'right-userrights' => 'Eital los derechus de tolos usuárius',
'right-siteadmin' => 'Atarugal i desatarugal la basi e datus',
+# Special:Log/newusers
+'newuserlogpage' => 'Rustrihu de nuevus usuárius',
+
# User rights log
'rightslog' => 'Rustrihu e derechus de los usuárius',
'rightslogtext' => 'Esti es un rustrihu e chambus enus derechus los usuárius.',
-'rightslogentry' => 'chambó el grupu al que preteneci $1: de $2 a $3',
-'rightsnone' => '(dengunu)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'leyel esta página',
@@ -1345,9 +1340,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'Muestral',
'listusers-noresult' => 'Nu s´alcuentró dengún usuáriu.',
-# Special:Log/newusers
-'newuserlogpage' => 'Rustrihu de nuevus usuárius',
-
# Special:ListGroupRights
'listgrouprights' => "Derechus del grupu d'usuárius",
'listgrouprights-group' => 'Grupu',
@@ -1422,11 +1414,7 @@ Si quieis ehal de vehilal la páhina, pursa sobri \"Ehal de vehilal\".",
'enotif_mailer' => 'Notificaeru pol correu e {{SITENAME}}',
'enotif_reset' => 'Aseñalal tolas páhinas vesitás',
-'enotif_newpagetext' => 'Esta páhina es nueva.',
'enotif_impersonal_salutation' => 'usuáriu e {{SITENAME}}',
-'changed' => 'chambau',
-'created' => 'criá',
-'enotif_subject' => '{{SITENAME}}: la páhina $PAGETITLE á siu $CHANGEDORCREATED pol $PAGEEDITOR',
'enotif_lastvisited' => 'Vai pa $1 pa visoreal tolos chambus hechus dendi la tu úrtima vesita.',
'enotif_lastdiff' => 'Vai pa $1 pa visoreal esti chambu.',
'enotif_anon_editor' => 'usuáriu anónimu $1',
@@ -1453,6 +1441,8 @@ Pa hazel chambus ena tu lista e seguimientu, vesita
Ayua la Güiquipeya:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'criá',
+'changed' => 'chambau',
# Delete
'deletepage' => 'Esborral páhina',
@@ -2414,6 +2404,6 @@ Las imahin se muestran a resolución compreta; las demas crasis d'archivu s'ehec
# New logging system
'revdelete-restricted' => 'las restricionis a los çahorilis án siu apricás',
'revdelete-unrestricted' => 'las restricionis a los çahorilis án siu esborrás',
-'newuserlog-byemail' => 'consínia enviá pol e-mail',
+'rightsnone' => '(dengunu)',
);
diff --git a/languages/messages/MessagesFa.php b/languages/messages/MessagesFa.php
index 80087900..3aacf457 100644
--- a/languages/messages/MessagesFa.php
+++ b/languages/messages/MessagesFa.php
@@ -14,7 +14,9 @@
* @author Baqeri
* @author Behdarvandyani
* @author Dalba
+ * @author E THP
* @author Ebraminio
+ * @author Goudarz
* @author Huji
* @author Ibrahim
* @author Ladsgroup
@@ -41,6 +43,9 @@
* @author محک
*/
+$rtl = true;
+$fallback8bitEncoding = 'windows-1256';
+
$namespaceNames = array(
NS_MEDIA => 'مدیا',
NS_SPECIAL => 'ویژه',
@@ -90,7 +95,7 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'مشارکت‌های_حذÙ_شده' ),
'Disambiguations' => array( 'ابهام‌زدایی' ),
'DoubleRedirects' => array( 'تغییرمسیرهای_دوتایی' ),
- 'EditWatchlist' => array( 'ویرایش_پی‌گیری‌ها' ),
+ 'EditWatchlist' => array( 'ویرایش_Ùهرست_پی‌گیری‌ها' ),
'Emailuser' => array( 'نامه_به_کاربر' ),
'Export' => array( 'برون_بری_صÙحه' ),
'Fewestrevisions' => array( 'کمترین_نسخه' ),
@@ -137,7 +142,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'تغییرات_اخیر' ),
'Recentchangeslinked' => array( 'تغییرات_مرتبط' ),
'Revisiondelete' => array( 'حذÙ_نسخه' ),
- 'RevisionMove' => array( 'انتقال_نسخه' ),
'Search' => array( 'جستجو' ),
'Shortpages' => array( 'صÙحه‌های_کوتاه' ),
'Specialpages' => array( 'صÙحه‌های_ویژه' ),
@@ -169,102 +173,6 @@ $specialPageAliases = array(
'Withoutinterwiki' => array( 'بدون_میان‌ویکی' ),
);
-
-
-$digitTransformTable = array(
- '0' => 'Û°', # &#x06f0;
- '1' => 'Û±', # &#x06f1;
- '2' => 'Û²', # &#x06f2;
- '3' => 'Û³', # &#x06f3;
- '4' => 'Û´', # &#x06f4;
- '5' => 'Ûµ', # &#x06f5;
- '6' => 'Û¶', # &#x06f6;
- '7' => 'Û·', # &#x06f7;
- '8' => 'Û¸', # &#x06f8;
- '9' => 'Û¹', # &#x06f9;
- '%' => 'Ùª', # &#x066a;
- '.' => 'Ù«', # &#x066b; wrong table?
- ',' => 'Ù¬', # &#x066c;
-);
-
-$fallback8bitEncoding = 'windows-1256';
-
-$rtl = true;
-
-
-/**
- * A list of date format preference keys which can be selected in user
- * preferences. New preference keys can be added, provided they are supported
- * by the language class's timeanddate(). Only the 5 keys listed below are
- * supported by the wikitext converter (DateFormatter.php).
- *
- * The special key "default" is an alias for either dmy or mdy depending on
- * $wgAmericanDates
- */
-$datePreferences = array(
- 'default',
- 'mdy',
- 'dmy',
- 'ymd',
- 'persian',
- 'hebrew',
- 'ISO 8601',
-);
-
-/**
- * The date format to use for generated dates in the user interface.
- * This may be one of the above date preferences, or the special value
- * "dmy or mdy", which uses mdy if $wgAmericanDates is true, and dmy
- * if $wgAmericanDates is false.
- */
-$defaultDateFormat = 'dmy or mdy';
-
-/**
- * Associative array mapping old numeric date formats, which may still be
- * stored in user preferences, to the new string formats.
- */
-$datePreferenceMigrationMap = array(
- 'default',
- 'mdy',
- 'dmy',
- 'ymd'
-);
-
-/**
- * These are formats for dates generated by MediaWiki (as opposed to the wikitext
- * DateFormatter). Documentation for the format string can be found in
- * Language.php, search for sprintfDate.
- *
- * This array is automatically inherited by all subclasses. Individual keys can be
- * overridden.
- */
-$dateFormats = array(
- # Please be cautious not to delete the invisible RLM from the beginning of the strings.
- 'mdy time' => 'â€H:i',
- 'mdy date' => 'â€n/j/Y میلادی',
- 'mdy both' => 'â€n/j/Y میلادی، ساعت H:i',
-
- 'dmy time' => 'â€H:i',
- 'dmy date' => 'â€j xg Y',
- 'dmy both' => 'â€j xg YØŒ ساعت H:i',
-
- 'ymd time' => 'â€H:i',
- 'ymd date' => 'â€Y/n/j میلادی',
- 'ymd both' => 'â€Y/n/j میلادی، ساعت H:i',
-
- 'persian time' => 'â€H:i',
- 'persian date' => 'â€xij xiF xiY',
- 'persian both' => 'â€xij xiF xiYØŒ ساعت H:i',
-
- 'hebrew time' => 'â€H:i',
- 'hebrew date' => 'â€xij xjF xjY',
- 'hebrew both' => 'â€H:i, xij xjF xjY',
-
- 'ISO 8601 time' => 'xnH:xni:xns',
- 'ISO 8601 date' => 'xnY-xnm-xnd',
- 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
-);
-
$magicWords = array(
'redirect' => array( '0', '#تغییر_مسیر', '#تغییرمسیر', '#REDIRECT' ),
'notoc' => array( '0', '__بی‌Ùهرست__', '__NOTOC__' ),
@@ -272,7 +180,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__باÙهرست__', '__FORCETOC__' ),
'toc' => array( '0', '__Ùهرست__', '__TOC__' ),
'noeditsection' => array( '0', '__بی‌بخش__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__بی‌عنوان__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'ماه', 'ماه‌کنونی', 'ماه_کنونی', 'ماه‌کنونی۲', 'ماه_کنونی۲', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'ماه۱', 'ماه‌کنونی۱', 'ماه_کنونی۱', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'نام‌ماه', 'نام_ماه', 'نام‌ماه‌کنونی', 'نام_ماه_کنونی', 'CURRENTMONTHNAME' ),
@@ -420,6 +327,95 @@ $magicWords = array(
'defaultsort_noreplace' => array( '0', 'جایگزین‌نکن', 'جایگزین_نکن', 'noreplace' ),
);
+$digitTransformTable = array(
+ '0' => 'Û°', # &#x06f0;
+ '1' => 'Û±', # &#x06f1;
+ '2' => 'Û²', # &#x06f2;
+ '3' => 'Û³', # &#x06f3;
+ '4' => 'Û´', # &#x06f4;
+ '5' => 'Ûµ', # &#x06f5;
+ '6' => 'Û¶', # &#x06f6;
+ '7' => 'Û·', # &#x06f7;
+ '8' => 'Û¸', # &#x06f8;
+ '9' => 'Û¹', # &#x06f9;
+ '%' => 'Ùª', # &#x066a;
+ '.' => 'Ù«', # &#x066b; wrong table?
+ ',' => 'Ù¬', # &#x066c;
+);
+
+/**
+ * A list of date format preference keys which can be selected in user
+ * preferences. New preference keys can be added, provided they are supported
+ * by the language class's timeanddate(). Only the 5 keys listed below are
+ * supported by the wikitext converter (DateFormatter.php).
+ *
+ * The special key "default" is an alias for either dmy or mdy depending on
+ * $wgAmericanDates
+ */
+$datePreferences = array(
+ 'default',
+ 'mdy',
+ 'dmy',
+ 'ymd',
+ 'persian',
+ 'hebrew',
+ 'ISO 8601',
+);
+
+/**
+ * The date format to use for generated dates in the user interface.
+ * This may be one of the above date preferences, or the special value
+ * "dmy or mdy", which uses mdy if $wgAmericanDates is true, and dmy
+ * if $wgAmericanDates is false.
+ */
+$defaultDateFormat = 'dmy or mdy';
+
+/**
+ * Associative array mapping old numeric date formats, which may still be
+ * stored in user preferences, to the new string formats.
+ */
+$datePreferenceMigrationMap = array(
+ 'default',
+ 'mdy',
+ 'dmy',
+ 'ymd'
+);
+
+/**
+ * These are formats for dates generated by MediaWiki (as opposed to the wikitext
+ * DateFormatter). Documentation for the format string can be found in
+ * Language.php, search for sprintfDate.
+ *
+ * This array is automatically inherited by all subclasses. Individual keys can be
+ * overridden.
+ */
+$dateFormats = array(
+ # Please be cautious not to delete the invisible RLM from the beginning of the strings.
+ 'mdy time' => 'â€H:i',
+ 'mdy date' => 'â€n/j/Y میلادی',
+ 'mdy both' => 'â€n/j/Y میلادی، ساعت H:i',
+
+ 'dmy time' => 'â€H:i',
+ 'dmy date' => 'â€j xg Y',
+ 'dmy both' => 'â€j xg YØŒ ساعت H:i',
+
+ 'ymd time' => 'â€H:i',
+ 'ymd date' => 'â€Y/n/j میلادی',
+ 'ymd both' => 'â€Y/n/j میلادی، ساعت H:i',
+
+ 'persian time' => 'â€H:i',
+ 'persian date' => 'â€xij xiF xiY',
+ 'persian both' => 'â€xij xiF xiYØŒ ساعت H:i',
+
+ 'hebrew time' => 'â€H:i',
+ 'hebrew date' => 'â€xij xjF xjY',
+ 'hebrew both' => 'â€H:i, xij xjF xjY',
+
+ 'ISO 8601 time' => 'xnH:xni:xns',
+ 'ISO 8601 date' => 'xnY-xnm-xnd',
+ 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+);
+
# Harakat are intentionally not included in the linkTrail. Their addition should
# take place after enough tests.
$linkTrail = "/^([ابپتثجچحخدذرزژسشصضطظعغÙقکگلمنوهیآأئؤة‌]+)(.*)$/sDu";
@@ -567,6 +563,7 @@ $messages = array(
'newwindow' => '(در پنجرهٔ جدید باز می‌شود)',
'cancel' => 'لغو',
'moredotdotdot' => 'بیشتر...',
+'morenotlisted' => 'ادامه لیست...',
'mypage' => 'صÙحه',
'mytalk' => 'بحث',
'anontalk' => 'بحث برای این آی‌پی',
@@ -578,7 +575,6 @@ $messages = array(
'qbbrowse' => 'مرور',
'qbedit' => 'ویرایش',
'qbpageoptions' => 'این صÙحه',
-'qbpageinfo' => 'محتوا',
'qbmyoptions' => 'صÙحه‌های من',
'qbspecialpages' => 'صÙحه‌های ویژه',
'faq' => 'پرسش‌های متداول',
@@ -601,6 +597,7 @@ $messages = array(
'namespaces' => 'Ùضاهای نام',
'variants' => 'گویش‌ها',
+'navigation-heading' => 'منوی ناوبری',
'errorpagetitle' => 'خطا',
'returnto' => 'بازگشت به $1.',
'tagline' => 'از {{SITENAME}}',
@@ -850,11 +847,11 @@ $2',
# Login and logout pages
'logouttext' => "'''هم‌اکنون از سامانه خارج شدید.'''
-شما می‌توانید به استÙادهٔ گمنام از {{SITENAME}} ادامه دهید، یا با همین حساب کاربری یا حسابی دیگر [[Special:UserLogin|به سامانه وارد شوید]].
+شما می‌توانید به استÙادهٔ گمنام از {{SITENAME}} ادامه دهید، یا با همین حساب کاربری یا حسابی دیگر <span class='plainlinks'>[$1 به سامانه وارد شوید]</span>.
توجه کنید Ú©Ù‡ تا زمانی Ú©Ù‡ میانگیر مرورگرتان را پاک نکنید، بعضی صÙحه‌ها ممکن است به گونه‌ای نمایش یابند Ú©Ù‡ گویی هنوز از سامانه خارج نشده‌اید.",
-'welcomecreation' => '==$1، خوش آمدید!==
-حساب شما ایجاد شد.
-Ùراموش نکنید Ú©Ù‡ [[Special:Preferences|ترجیحات {{SITENAME}}]] را برای خود تغییر دهید.',
+'welcomeuser' => 'خوشامدید، $1!',
+'welcomecreation-msg' => 'حساب کاربری شما ایجاد شده است.
+Ùراموش نکنید Ú©Ù‡ [[Special:Preferences|ترجیحات {{SITENAME}}]] خود را تغییر دهید.',
'yourname' => 'نام کاربری:',
'yourpassword' => 'گذرواژه:',
'yourpasswordagain' => 'تکرار گذرواژه:',
@@ -877,7 +874,7 @@ $2',
'gotaccount' => 'حساب کاربری دارید؟ $1.',
'gotaccountlink' => 'به سامانه وارد شوید',
'userlogin-resetlink' => 'جزئیات ورود را Ùراموش کرده‌اید؟',
-'createaccountmail' => 'با رایانامه',
+'createaccountmail' => 'استÙاده از رمز عبور موقت تصادÙÛŒ Ùˆ ارسال آن به آدرس ایمیل مشخص شده در زیر',
'createaccountreason' => 'دلیل:',
'badretype' => 'گذرواژه‌هایی که وارد کرده‌اید یکسان نیستند.',
'userexists' => 'نام کاربری‌ای Ú©Ù‡ وارد کردید قبلاً استÙاده شده‌است.
@@ -956,6 +953,7 @@ $2',
# Email sending
'php-mail-error-unknown' => 'خطای ناشناخته در تابع mail()‎ پی‌اچ‌پی',
'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس رایانامه.',
+'user-mail-no-body' => 'تلاش برای Ùرستادن پست‌الکترونیک بی‌دلیل کوتاه یا خالی',
# Change password dialog
'resetpass' => 'تغییر گذرواژه',
@@ -1016,6 +1014,7 @@ $2
'changeemail-oldemail' => 'نشانی رایانامهٔ کنونی:',
'changeemail-newemail' => 'نشانی رایانامهٔ جدید:',
'changeemail-none' => '(هیچ)',
+'changeemail-password' => ' {{SITENAME}} رمز عبور شما:',
'changeemail-submit' => 'تغییر رایانامه',
'changeemail-cancel' => 'انصراÙ',
@@ -1204,7 +1203,6 @@ $2
'template-semiprotected' => '(نیمه‌حÙاظت‌شده)',
'hiddencategories' => 'این صÙحه در {{PLURAL:$1|یک ردهٔ پنهان|$1 ردهٔ پنهان}} قرار دارد:',
'edittools' => '<!-- متن این قسمت زیر صÙحه‌های ویرایش Ùˆ بارگذاری نشان داده می‌شود -->',
-'nocreatetitle' => 'ایجاد صÙحه محدود شده‌است',
'nocreatetext' => '{{SITENAME}} قابلیت ایجاد صÙحه‌های جدید را محدود کرده‌است.
می‌توانید بازگردید Ùˆ صÙحه‌ای موجود را ویرایش کنید یا اینکه [[Special:UserLogin|به سامانه وارد شوید یا حساب کاربری ایجاد کنید]].',
'nocreate-loggedin' => 'شما اجازهٔ ایجاد صÙحه‌های جدید را ندارید.',
@@ -1229,6 +1227,15 @@ $2
'edit-already-exists' => 'امکان ساختن صÙحهٔ جدید وجود ندارد.
این صÙحه از قبل وجود داشته‌است.',
'defaultmessagetext' => 'متن پیش‌Ùرض پیغام',
+'content-failed-to-parse' => 'عدم موÙقیت در تجزیه محتوای $2 برای مدل $1: $3',
+'invalid-content-data' => 'داده محتوای نامعتبر',
+'content-not-allowed-here' => 'محتوای «$1» در صÙحهٔ [[$2]] مجاز نیست',
+
+# Content models
+'content-model-wikitext' => 'ویکی‌متن',
+'content-model-text' => 'متنی ساده',
+'content-model-javascript' => 'جاوااسکریپت',
+'content-model-css' => 'سی‌اس‌اس',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''هشدار:''' این صÙحه حاوی تعدادی زیادی Ùراخوانی دستورهای تجزیه‌گر است.
@@ -1595,9 +1602,9 @@ $1",
'prefs-emailconfirm-label' => 'تأیید رایانامه:',
'prefs-textboxsize' => 'اندازهٔ جعبهٔ ویرایش',
'youremail' => 'رایانامه:',
-'username' => 'نام کاربری:',
-'uid' => 'شناسهٔ کاربر:',
-'prefs-memberingroups' => 'عضو این {{PLURAL:$1|گروه|گروه‌ها}}:',
+'username' => '{{GENDER:$1|نام کاربری}}:',
+'uid' => 'شناسهٔ {{GENDER:$1|کاربری}}:',
+'prefs-memberingroups' => '{{GENDER:$2|عضو}} {{PLURAL:$1|گروه|گروه}}:',
'prefs-registration' => 'زمان ثبت‌نام:',
'yourrealname' => 'نام واقعی:',
'yourlanguage' => 'زبان:',
@@ -1749,12 +1756,13 @@ $1",
'right-sendemail' => 'ارسال رایانامه به دیگر کاربران',
'right-passwordreset' => 'مشاهدهٔ نامه‌های تنظیم مجدد گذرواژه',
+# Special:Log/newusers
+'newuserlogpage' => 'سیاههٔ ایجاد کاربر',
+'newuserlogpagetext' => 'این سیاهه‌ای از نام‌های کاربری تازه‌ساخته‌شده است.',
+
# User rights log
'rightslog' => 'سیاههٔ اختیارات کاربر',
'rightslogtext' => 'این سیاههٔ تغییرات اختیارات کاربر است.',
-'rightslogentry' => 'عضویت $1 را از گروه $2 به $3 تغییر داد',
-'rightslogentry-autopromote' => 'به طور خودکار از $2 به $3 ارتقا یاÙت',
-'rightsnone' => '(هیچ)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'خواندن این صÙحه',
@@ -1992,6 +2000,7 @@ $1',
'backend-fail-notsame' => 'پروندهٔ غیریکسانی در $1 وجود دارد.',
'backend-fail-invalidpath' => '$1 مسیر ذخیره‌سازی معتبری نیست.',
'backend-fail-delete' => 'نمی‌توان پروندهٔ $1 را حذ٠کرد.',
+'backend-fail-describe' => 'نمی‌توان Ùرادادهٔ پروندهٔ «$1» را تغییر داد.',
'backend-fail-alreadyexists' => 'پروندهٔ $1 از قبل وجود داشت.',
'backend-fail-store' => 'نمی‌توان پروندهٔ $1 را در $2 ذخیره کرد.',
'backend-fail-copy' => 'نمی‌توان پروندهٔ $1 را به $2 کپی کرد.',
@@ -2230,6 +2239,12 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
این صÙحه‌ها شاید در عوض به موضوعات مرتبط پیوند داده شوند.<br />
یک صÙحه هنگامی صÙحهٔ ابهام‌زدایی در نظر گرÙته می‌شود Ú©Ù‡ در آن از الگویی Ú©Ù‡ به [[MediaWiki:Disambiguationspage]] پیوند دارد استÙاده شده باشد.",
+'pageswithprop' => 'صÙحه‌های دارای خاصیت صÙحه',
+'pageswithprop-legend' => 'صÙحه‌های دارای خاصیت صÙحه',
+'pageswithprop-text' => 'این صÙحه Ùهرستی است از صÙحه‌هایی Ú©Ù‡ از یک خاصیت صÙحهٔ خاص استÙاده می‌کنند.',
+'pageswithprop-prop' => 'نام خاصیت:',
+'pageswithprop-submit' => 'برو',
+
'doubleredirects' => 'تغییرمسیرهای دوتایی',
'doubleredirectstext' => 'این صÙحه Ùهرستی از صÙحه‌های تغییرمسیری را ارائه می‌کند Ú©Ù‡ به صÙحهٔ تغییرمسیر دیگری اشاره می‌کنند.
هر سطر دربردارندهٔ پیوندهایی به تغییرمسیر اول Ùˆ دوم Ùˆ همچنین مقصد تغییرمسیر دوم است، Ú©Ù‡ معمولاً صÙحهٔ مقصد واقعی است Ùˆ نخستین تغییرمسیر باید به آن اشاره کند.
@@ -2383,7 +2398,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'linksearch-ok' => 'جستجو',
'linksearch-text' => 'نشانه‌هایی مانند «‎*.wikipedia.org» را می‌توان استÙاده کرد.
حداقل یک دامنه سطح بالا ، به عنوان مثال "*.org" نیاز دارد.<br />
-پروتکل‌های پشتیبانی‌شده: <code>$1</code> (پیش‌Ùرض برای http:// در صورت مشخص نشدن پروتکل تنظیم شده‌است)',
+{{PLURAL:$2|پروتکل|پروتکل‌های}} پشتیبانی‌شده: <code>$1</code> (پیش‌Ùرض برای http:// در صورت مشخص نشدن پروتکل تنظیم شده‌است).',
'linksearch-line' => '$1 از $2 پیوند دارد',
'linksearch-error' => 'نشانه‌ها Ùقط در ابتدای نام میزبان اینترنتی می‌توانند استÙاده شوند.',
@@ -2402,10 +2417,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'activeusers-hidesysops' => 'نهÙتن مدیران',
'activeusers-noresult' => 'کاربری پیدا نشد.',
-# Special:Log/newusers
-'newuserlogpage' => 'سیاههٔ ایجاد کاربر',
-'newuserlogpagetext' => 'این سیاهه‌ای از نام‌های کاربری تازه‌ساخته‌شده است.',
-
# Special:ListGroupRights
'listgrouprights' => 'اختیارات گروه‌های کاربری',
'listgrouprights-summary' => 'Ùهرست زیر شامل گروه‌های کاربری تعری٠شده در این ویکی Ùˆ اختیارات داده شده به آن‌ها است.
@@ -2500,19 +2511,24 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
'enotif_mailer' => 'رایانامهٔ اطلاع‌رسانی {{SITENAME}}',
'enotif_reset' => 'علامت‌گذاری همهٔ صÙحه‌ها به عنوان بازدید شده',
-'enotif_newpagetext' => 'این یک صÙحهٔ تازه‌است.',
'enotif_impersonal_salutation' => 'کاربر {{SITENAME}}',
-'changed' => 'تغییر یاÙته',
-'created' => 'ایجاد شده',
-'enotif_subject' => 'صÙحهٔ «$PAGETITLE» در {{SITENAME}} به دست $PAGEEDITOR $CHANGEDORCREATED است.',
+'enotif_subject_deleted' => '{{SITENAME}} صÙحهٔ $1 توسط {{gender:$2|$2}} حذ٠شد.',
+'enotif_subject_created' => '{{SITENAME}} صÙحهٔ $1 توسط {{gender:$2|$2}} ایجاد شده.',
+'enotif_subject_moved' => '{{SITENAME}} صÙحهٔ $1 توسط {{gender:$2|$2}} انتقال یاÙت.',
+'enotif_subject_restored' => '{{SITENAME}} صÙحهٔ $1 توسط {{gender:$2|$2}} احیا شد.',
+'enotif_subject_changed' => '{{SITENAME}} صÙحهٔ $1 توسط {{gender:$2|$2}} تغییر کرد.',
+'enotif_body_intro_deleted' => 'صÙحهٔ $1 {{SITENAME}} در تاریخ $PAGEEDITDATE توسط {{gender:$2|$2}} حذ٠شد، $3 را ببینید.',
+'enotif_body_intro_created' => '{{SITENAME}} صÙحهٔ $1 در تاریخ $PAGEEDITDATE توسط {{gender:$2|$2}} ایجاد شد. $3 را برای نسخهٔ کنونی شاهده کنید.',
+'enotif_body_intro_moved' => '{{SITENAME}} صÙحهٔ $1 در تاریخ $PAGEEDITDATE توسط {{gender:$2|$2}} انتقال یاÙت، $3 را برای نسخهٔ کنونی شاهده کنید.',
+'enotif_body_intro_restored' => '{{SITENAME}} صÙحهٔ $1 در تاریخ $PAGEEDITDATE توسط {{gender:$2|$2}} احیا شد، $3 را برای نسخهٔ کنونی شاهده کنید.',
+'enotif_body_intro_changed' => '{{SITENAME}} صÙحهٔ $1 در تاریخ $PAGEEDITDATE توسط {{gender:$2|$2}} تغییر کرد، $3 را برای نسخهٔ کنونی شاهده کنید.',
'enotif_lastvisited' => 'برای دیدن همهٔ تغییرات از آخرین باری که سر زده‌اید $1 را ببینید.',
'enotif_lastdiff' => 'برای نمایش این تغییر $1 را ببینید.',
'enotif_anon_editor' => 'کاربر ناشناس $1',
'enotif_body' => '$WATCHINGUSERNAME گرامی،
-صÙحهٔ «$PAGETITLE» در {{SITENAME}} در $PAGEEDITDATE به‌دست $PAGEEDITOR $CHANGEDORCREATED است. برای دیدن نسخهٔ کنونی $PAGETITLE_URL را ببینید.
+$PAGEINTRO $NEWPAGE
-$NEWPAGE
توضیح ویراستار: $PAGESUMMARY $PAGEMINOREDIT
@@ -2521,7 +2537,7 @@ $NEWPAGE
ویکی: $PAGEEDITOR_WIKI
تا هنگامی Ú©Ù‡ به صÙحه سر نزده‌اید، در صورت رخ‌دادن٠احتمالی٠تغییرات٠بیشتر، اعلانیه‌ای برای شما Ùرستاده نخواهد شد.
-شما همچنین می‌توانید در صÙحهٔ پی‌گیری‌های خود پرچم‌های مربوط به آگاهی‌رسانی را صÙر کنید.
+شما همچنین می‌توانید در صÙحهٔ پی‌گیری‌های خود پرچم‌های مربوط به آگاهی‌رسانی را صÙر کنید همچنین می‌توانید پرچم‌های آگاهی‌سازی را بازنشانی کنید.
دوستدار شما، سامانهٔ آگاهی‌رسانی {{SITENAME}}
@@ -2534,6 +2550,8 @@ $NEWPAGE
بازخورد و کمک بیشتر:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'ایجاد شده',
+'changed' => 'تغییر یاÙته',
# Delete
'deletepage' => 'حذ٠صÙحه',
@@ -2608,6 +2626,8 @@ $NEWPAGE
'prot_1movedto2' => '[[$1]] به [[$2]] منتقل شد',
'protect-badnamespace-title' => 'Ùضای نام بدون محاÙظت',
'protect-badnamespace-text' => 'صÙحه‌های موجود در این Ùضای نام، نمی‌توانند محاÙظت شوند.',
+'protect-norestrictiontypes-text' => 'امکان محاÙظت این صÙحه به علت نبودن نوع محدودیت، مقدور نیست.',
+'protect-norestrictiontypes-title' => 'صÙحهٔ غیرقابل محاÙظت',
'protect-legend' => 'تأیید محاÙظت',
'protectcomment' => 'دلیل:',
'protectexpiry' => 'زمان سرآمدن:',
@@ -2693,8 +2713,8 @@ $NEWPAGE
'undeletedrevisions' => '$1 نسخه احیا {{PLURAL:$1|شد|شدند}}',
'undeletedrevisions-files' => '$1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.',
'undeletedfiles' => '$1 پرونده احیا {{PLURAL:$1|شد|شدند}}.',
-'cannotundelete' => 'احیا ناموÙÙ‚ بود؛
-ممکن است کس دیگری پیشتر این صÙحه را احیا کرده باشد.',
+'cannotundelete' => 'احیا ناموÙÙ‚ بود:
+$1',
'undeletedpage' => "'''$1 احیا شد'''
برای دیدن سیاههٔ حذÙ‌ها Ùˆ احیاهای اخیر به [[Special:Log/delete|سیاههٔ حذÙ]] رجوع کنید.",
@@ -2726,7 +2746,7 @@ $1',
'blanknamespace' => '(اصلی)',
# Contributions
-'contributions' => 'مشارکت‌های کاربری',
+'contributions' => 'مشارکت‌های {{GENDER:$1|کاربر}}',
'contributions-title' => 'مشارکت‌های کاربری $1',
'mycontris' => 'مشارکت‌ها',
'contribsub2' => 'برای $1 ($2)',
@@ -3004,6 +3024,7 @@ $1',
'immobile-target-namespace-iw' => 'پیوند میان‌ویکی هدÙÛŒ مجاز برای انتقال صÙحه نیست.',
'immobile-source-page' => 'این صÙحه قابل انتقال نیست.',
'immobile-target-page' => 'امکان انتقال به این عنوان مقصد وجود ندارد.',
+'bad-target-model' => 'مقصد مورد نظر از مدل محتوایی متÙاوتی استÙاده می‌کند. تبدیل $1 به $2 ممکن نیست.',
'imagenocrossnamespace' => 'امکان انتقال تصویر به Ùضای نام غیر پرونده وجود ندارد',
'nonfile-cannot-move-to-file' => 'امکان انتقال محتوای غیر پرونده به Ùضای نام پرونده وجود ندارد',
'imagetypemismatch' => 'پسوند پرونده جدید با نوع آن سازگار نیست',
@@ -3118,6 +3139,7 @@ $1',
'import-error-interwiki' => 'صÙحه «$1» وارد نشد. چون نام آن برای پیوند خارجی (interwiki) رزرو شده‌است.',
'import-error-special' => 'صÙحه «$1» درون‌ریزی نشد، چرا Ú©Ù‡ متعلق به Ùضای نام غیرمجاز است.',
'import-error-invalid' => 'صÙحه "$1" به دلیل نامعتبر بودن نامش وارد نمی‌شود.',
+'import-error-unserialize' => 'امکان خارج کردن نسخهٔ $2 از صÙحهٔ «$1» از حالت سریال‌شده وجود نداشت. گزارش شد Ú©Ù‡ نسخه از مدل محتوای $3 استÙاده می‌کند Ú©Ù‡ به صورت $4 سریال شده‌است.',
'import-options-wrong' => '{{PLURAL:$2|جزئیات|جزئیات}} اشتباه: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'با توجه به ریشه صÙحه عنوان نامعتبر است.',
'import-rootpage-nosubpage' => 'Ùضای نام "$1" صÙحهٔ مبنا اجازهٔ زیرصÙحه نمی‌دهد.',
@@ -3132,7 +3154,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'آزمایش جاوا اسکریپت',
-'javascripttest-disabled' => 'این عملکرد در این ویکی Ùعال نشده‌است.',
'javascripttest-title' => 'در حال اجرای آزمایش‌های $1',
'javascripttest-pagetext-noframework' => 'این صÙحه برای اجرای آزمایش‌های جاوا اسکریپت کنار گذاشته شده‌است.',
'javascripttest-pagetext-unknownframework' => 'چارچوب آزمایشی ناشناخته «$1».',
@@ -3251,11 +3272,13 @@ $1',
'pageinfo-default-sort' => 'کلید مرتب‌سازی پیش‌Ùرض',
'pageinfo-length' => 'حجم صÙحه (بایت)',
'pageinfo-article-id' => 'شناسهٔ صÙحه',
+'pageinfo-language' => 'زبان محتوای صÙحه',
'pageinfo-robot-policy' => 'وضعیت موتور جستجو',
'pageinfo-robot-index' => 'Ùهرست‌پذیر',
'pageinfo-robot-noindex' => 'عدم Ùهرست‌پذیری',
'pageinfo-views' => 'شمار بازدیدها',
'pageinfo-watchers' => 'شمار پی‌گیری‌کنندگان صÙحه',
+'pageinfo-few-watchers' => 'کمتر از $1 {{PLURAL:$1| پی‌گیر|پی‌گیر}}',
'pageinfo-redirects-name' => 'تغییرمسیرها به این صÙحه',
'pageinfo-subpages-name' => 'زیرصÙحه‌های این صÙحه',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|تغییرمسیر|تغییرمسیر}}; $3 {{PLURAL:$3|غیرتغییرمسیر|غیرتغییرمسیر}})',
@@ -3270,6 +3293,19 @@ $1',
'pageinfo-magic-words' => '{{PLURAL:$1|حرÙ|حروÙ}} جادویی ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1| ردهٔ|ردهٔ}} پنهان ( $1 )',
'pageinfo-templates' => '{{PLURAL:$1|الگو|الگو}} استÙاده‌شده ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|صÙحهٔ|صÙحه‌های}} تراگنجایش‌شده در ($1)',
+'pageinfo-toolboxlink' => 'اطلاعات صÙحه',
+'pageinfo-redirectsto' => 'تغییرمسیر به',
+'pageinfo-redirectsto-info' => 'اطلاعات',
+'pageinfo-contentpage' => 'شمرده شده به عنوان صÙحهٔ محتویی',
+'pageinfo-contentpage-yes' => 'بله',
+'pageinfo-protect-cascading' => 'محاÙظت آبشاری از اینجا',
+'pageinfo-protect-cascading-yes' => 'بله',
+'pageinfo-protect-cascading-from' => 'محاÙظت آبشاری از',
+'pageinfo-category-info' => 'اطلاعات رده',
+'pageinfo-category-pages' => 'تعداد صÙحه‌ها',
+'pageinfo-category-subcats' => 'تعداد زیررده‌ها',
+'pageinfo-category-files' => 'تعداد پرونده‌ها',
# Skin names
'skinname-standard' => 'کلاسیک',
@@ -3292,6 +3328,8 @@ $1',
'markedaspatrollederror' => 'برچسب گشت زده نشد',
'markedaspatrollederrortext' => 'باید یک نسخه را مشخص کنید تا برچسب گشت بخورد.',
'markedaspatrollederror-noautopatrol' => 'شما نمی‌توانید به تغییرات انجام شده توسط خودتان برچسب گشت بزنید.',
+'markedaspatrollednotify' => 'این تغییر روی $1 برچسب گشت خورده است.',
+'markedaspatrollederrornotify' => 'زدن برچسب گشت، ناموÙÙ‚ بود.',
# Patrol log
'patrol-log-page' => 'سیاههٔ گشت',
@@ -3326,6 +3364,7 @@ $1',
'file-nohires' => 'تÙکیک‌پذیری بالاتری در دسترس نیست.',
'svg-long-desc' => 'پروندهٔ اس‌وی‌جی، با ابعاد <span dir="ltr">$1 × $2</span> پیکسل، اندازهٔ پرونده: $3',
'svg-long-desc-animated' => 'پروندهٔ اس‌وی‌جی متحرک، با ابعاد <span dir="ltr">$1 × $2</span> پیکسل، اندازهٔ پرونده: $3',
+'svg-long-error' => 'پرونده SVG غیرمجاز: $1',
'show-big-image' => 'تصویر با تÙکیک‌پذیری بالاتر',
'show-big-image-preview' => 'اندازهٔ این پیش‌نمایش: $1.',
'show-big-image-other' => '{{PLURAL:$2|Ú©ÛŒÙیت|Ú©ÛŒÙیت‌های}} دیگر: $1.',
@@ -3355,7 +3394,10 @@ $1',
'minutes' => '{{PLURAL: $1|دقیقه|دقیقه}}',
'hours' => '{{PLURAL: $1|ساعت|ساعت}}',
'days' => '{{PLURAL: $1|روز|روز}}',
+'months' => '{{PLURAL:$1|$1 ماه|}}',
+'years' => '{{PLURAL:$1|$1 سال|}}',
'ago' => '$1 پیش',
+'just-now' => 'هم‌اکنون',
# Bad image list
'bad_image_list' => 'اطلاعات را باید اینگونه وارد کنید:
@@ -3849,6 +3891,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[تراگنجانش بین‌ویکیانه Ùعال نیست]',
'scarytranscludefailed' => '[Ùراخوانی الگو برای $1 میسر نشد]',
+'scarytranscludefailed-httpstatus' => '[Ùراخوانی الگو برای $1 میسر نشد: خطای اچ‌تی‌تی‌پی $2]',
'scarytranscludetoolong' => '[نشانی اینترنتی مورد نظر (URL) بیش از اندازه بلند بود]',
# Delete conflict
@@ -4026,6 +4069,7 @@ $5
'version-license' => 'اجازه‌نامه',
'version-poweredby-credits' => "این ویکی توسط '''[//www.mediawiki.org/ مدیاویکی]''' پشتیبانی می‌شود، کلیهٔ حقوق محÙوظ است © 2001-$1 $2.",
'version-poweredby-others' => 'دیگران',
+'version-credits-summary' => 'اÙراد زیر را به خاطر ویرایش‌هایش در [[Special:Version|مدیاویکی]] معرÙÛŒ می‌نمائیم.',
'version-license-info' => 'مدیاویکی نرم‌اÙزاری رایگان است؛ می‌توانید آن را تحت شرایط مجوز عمومی همگانی گنو Ú©Ù‡ توسط بنیاد نرم‌اÙزار رایگان منتشر شده‌است، بازنشر کنید؛ یا نسخهٔ Û² از این مجوز، یا (بنا به اختیار) نسخه‌های بعدی.
مدیاویکی به این امید Ú©Ù‡ Ù…Ùید واقع شود منتشر شده‌است، ولی بدون هیچ‌گونه ضمانتی؛ بدون ضمانت ضمنی Ú©Ù‡ تجاری یا برای کار خاصی مناسب باشد. برای اطلاعات بیشتر مجوز گنو جی‌پی‌ال را مشاهده کنید.
@@ -4169,8 +4213,12 @@ $5
'logentry-newusers-newusers' => 'حساب کاربری $1 ایجاد شد',
'logentry-newusers-create' => 'حساب کاربری $1 ایجاد شد',
'logentry-newusers-create2' => 'حساب کاربری $3 توسط $1 ایجاد شد',
+'logentry-newusers-byemail' => 'حساب کاربری $3 توسط $1 ایجاد شد و رمز عبور به وسیلهٔ ایمیل ارسال شد',
'logentry-newusers-autocreate' => 'حساب $1 به شکل خودکار ساخته شد',
-'newuserlog-byemail' => 'گذرواژه بوسیله رایانامه ارسال شد',
+'logentry-rights-rights' => '$1 عضویت $3 را از گروه $4 به $5 تغییر داد',
+'logentry-rights-rights-legacy' => '$1 گروه عضویت $3 را تغییر داد',
+'logentry-rights-autopromote' => '$1 به طور خودکار از $4 به $5 ارتقا یاÙت',
+'rightsnone' => '(هیچ)',
# Feedback
'feedback-bugornote' => 'اگر آماده‌اید تا مشکلی ÙÙ†ÛŒ را با جزئیاتش شرح دهید لطÙاً [$1 یک ایراد گزارش دهید]. در غیر این صورت می‌توانید از Ùرم سادهٔ زیر استÙاده کنید. نظر شما به همراه نام کاربری Ùˆ مرورگرتان به صÙحهٔ «[$2 $3]» اÙزوده خواهد شد.',
@@ -4223,6 +4271,7 @@ $5
'api-error-ok-but-empty' => 'خطای داخلی : پاسخی از سرور دریاÙت نشد.',
'api-error-overwrite' => 'جای نوشتن یک پرونده موجود مجاز نیست.',
'api-error-stashfailed' => 'خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.',
+'api-error-publishfailed' => 'خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.',
'api-error-timeout' => 'کارساز در زمان انتظار هیچ پاسخی نداد.',
'api-error-unclassified' => 'یک خطای ناشناخته رخ داد.',
'api-error-unknown-code' => 'خطای ناشناخته: " $1 "',
@@ -4243,4 +4292,7 @@ $5
'duration-centuries' => '$1 قرن',
'duration-millennia' => '{{PLURAL:$1|هزار سال |$1 هزار سال}}',
+# Image rotation
+'rotate-comment' => 'تصویر به دست $1 {{PLURAL:$1|درجهٔ|درجهٔ}} ساعت‌گرد چرخانده شد',
+
);
diff --git a/languages/messages/MessagesFi.php b/languages/messages/MessagesFi.php
index f00c30eb..cfb2a48c 100644
--- a/languages/messages/MessagesFi.php
+++ b/languages/messages/MessagesFi.php
@@ -32,14 +32,13 @@
* @author Tarmo
* @author Tofu II
* @author Veikk0.ma
+ * @author VezonThunder
* @author Wix
* @author Yaamboo
* @author ZeiP
* @author לערי ריינה×רט
*/
-$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
-
$namespaceNames = array(
NS_MEDIA => 'Media',
NS_SPECIAL => 'Toiminnot',
@@ -64,43 +63,104 @@ $namespaceAliases = array(
'Keskustelu_kuvasta' => NS_FILE_TALK,
);
-
-$datePreferences = array(
- 'default',
- 'fi normal',
- 'fi seconds',
- 'fi numeric',
- 'ISO 8601',
-);
-
-$defaultDateFormat = 'fi normal';
-
-$dateFormats = array(
- 'fi normal time' => 'H.i',
- 'fi normal date' => 'j. F"ta" Y',
- 'fi normal both' => 'j. F"ta" Y "kello" H.i',
-
- 'fi seconds time' => 'H:i:s',
- 'fi seconds date' => 'j. F"ta" Y',
- 'fi seconds both' => 'j. F"ta" Y "kello" H:i:s',
-
- 'fi numeric time' => 'H.i',
- 'fi numeric date' => 'j.n.Y',
- 'fi numeric both' => 'j.n.Y "kello" H.i',
-);
-
-$datePreferenceMigrationMap = array(
- 'default',
- 'fi normal',
- 'fi seconds',
- 'fi numeric',
-);
-
-$bookstoreList = array(
- 'Bookplus' => 'http://www.bookplus.fi/product.php?isbn=$1',
- 'Helsingin yliopiston kirjasto' => 'http://pandora.lib.hel.fi/cgi-bin/mhask/monihask.py?volname=&author=&keyword=&ident=$1&submit=Hae&engine_helka=ON',
- 'Pääkaupunkiseudun kirjastot' => 'http://www.helmet.fi/search*fin/i?SEARCH=$1',
- 'Tampereen seudun kirjastot' => 'http://kirjasto.tampere.fi/Piki?formid=fullt&typ0=6&dat0=$1'
+$specialPageAliases = array(
+ 'Activeusers' => array( 'Aktiiviset_käyttäjät' ),
+ 'Allmessages' => array( 'Järjestelmäviestit' ),
+ 'Allpages' => array( 'Kaikki_sivut' ),
+ 'Ancientpages' => array( 'Kuolleet_sivut' ),
+ 'Badtitle' => array( 'Kelpaamaton_otsikko' ),
+ 'Blankpage' => array( 'Tyhjä_sivu' ),
+ 'Block' => array( 'Estä' ),
+ 'Blockme' => array( 'Estä_minut' ),
+ 'Booksources' => array( 'Kirjalähteet' ),
+ 'BrokenRedirects' => array( 'Virheelliset_ohjaukset', 'Virheelliset_uudelleenohjaukset' ),
+ 'Categories' => array( 'Luokat' ),
+ 'ChangeEmail' => array( 'Muuta_sähköpostiosoite' ),
+ 'ChangePassword' => array( 'Muuta_salasana', 'Alusta_salasana' ),
+ 'ComparePages' => array( 'Vertaa_sivuja' ),
+ 'Confirmemail' => array( 'Varmista_sähköpostiosoite' ),
+ 'Contributions' => array( 'Muokkaukset' ),
+ 'CreateAccount' => array( 'Luo_tunnus' ),
+ 'Deadendpages' => array( 'Linkittömät_sivut' ),
+ 'DeletedContributions' => array( 'Poistetut_muokkaukset' ),
+ 'Disambiguations' => array( 'Täsmennyssivut' ),
+ 'DoubleRedirects' => array( 'Kaksinkertaiset_ohjaukset', 'Kaksinkertaiset_uudelleenohjaukset' ),
+ 'EditWatchlist' => array( 'Muokkaa_tarkkailulistaa' ),
+ 'Emailuser' => array( 'Lähetä_sähköpostia' ),
+ 'Export' => array( 'Vie_sivuja' ),
+ 'Fewestrevisions' => array( 'Vähiten_muokatut_sivut' ),
+ 'FileDuplicateSearch' => array( 'Kaksoiskappaleiden_haku' ),
+ 'Filepath' => array( 'Tiedostopolku' ),
+ 'Import' => array( 'Tuo_sivuja' ),
+ 'Invalidateemail' => array( 'Hylkää_sähköpostiosoite' ),
+ 'BlockList' => array( 'Muokkausestot' ),
+ 'LinkSearch' => array( 'Linkkihaku' ),
+ 'Listadmins' => array( 'Ylläpitäjät' ),
+ 'Listbots' => array( 'Botit' ),
+ 'Listfiles' => array( 'Tiedostoluettelo' ),
+ 'Listgrouprights' => array( 'Käyttäjäryhmien_oikeudet' ),
+ 'Listredirects' => array( 'Ohjaukset', 'Ohjaussivut', 'Uudelleenohjaukset' ),
+ 'Listusers' => array( 'Käyttäjät' ),
+ 'Lockdb' => array( 'Lukitse_tietokanta' ),
+ 'Log' => array( 'Loki', 'Lokit' ),
+ 'Lonelypages' => array( 'Yksinäiset_sivut' ),
+ 'Longpages' => array( 'Pitkät_sivut' ),
+ 'MergeHistory' => array( 'Liitä_muutoshistoria' ),
+ 'MIMEsearch' => array( 'MIME-haku' ),
+ 'Mostcategories' => array( 'Luokitelluimmat_sivut' ),
+ 'Mostimages' => array( 'Viitatuimmat_tiedostot' ),
+ 'Mostinterwikis' => array( 'Eniten_kielilinkkejä' ),
+ 'Mostlinked' => array( 'Viitatuimmat_sivut' ),
+ 'Mostlinkedcategories' => array( 'Viitatuimmat_luokat' ),
+ 'Mostlinkedtemplates' => array( 'Viitatuimmat_mallineet' ),
+ 'Mostrevisions' => array( 'Muokatuimmat_sivut' ),
+ 'Movepage' => array( 'Siirrä_sivu' ),
+ 'Mycontributions' => array( 'Omat_muokkaukset' ),
+ 'Mypage' => array( 'Oma_sivu' ),
+ 'Mytalk' => array( 'Oma_keskustelu' ),
+ 'Myuploads' => array( 'Omat_tiedostot' ),
+ 'Newimages' => array( 'Uudet_tiedostot', 'Uudet_kuvat' ),
+ 'Newpages' => array( 'Uudet_sivut' ),
+ 'PasswordReset' => array( 'Unohtuneen_salasanan_vaihto' ),
+ 'PermanentLink' => array( 'Ikilinkki' ),
+ 'Popularpages' => array( 'Suositut_sivut' ),
+ 'Preferences' => array( 'Asetukset' ),
+ 'Prefixindex' => array( 'Etuliiteluettelo' ),
+ 'Protectedpages' => array( 'Suojatut_sivut' ),
+ 'Protectedtitles' => array( 'Suojatut_sivunimet' ),
+ 'Randompage' => array( 'Satunnainen_sivu' ),
+ 'Randomredirect' => array( 'Satunnainen_ohjaus', 'Satunnainen_uudelleenohjaus' ),
+ 'Recentchanges' => array( 'Tuoreet_muutokset' ),
+ 'Recentchangeslinked' => array( 'Linkitetyt_muutokset' ),
+ 'Revisiondelete' => array( 'Poista_muokkaus' ),
+ 'Search' => array( 'Haku' ),
+ 'Shortpages' => array( 'Lyhyet_sivut' ),
+ 'Specialpages' => array( 'Toimintosivut' ),
+ 'Statistics' => array( 'Tilastot' ),
+ 'Tags' => array( 'Merkinnät' ),
+ 'Unblock' => array( 'Poista_esto' ),
+ 'Uncategorizedcategories' => array( 'Luokittelemattomat_luokat' ),
+ 'Uncategorizedimages' => array( 'Luokittelemattomat_tiedostot' ),
+ 'Uncategorizedpages' => array( 'Luokittelemattomat_sivut' ),
+ 'Uncategorizedtemplates' => array( 'Luokittelemattomat_mallineet' ),
+ 'Undelete' => array( 'Palauta' ),
+ 'Unlockdb' => array( 'Avaa_tietokanta' ),
+ 'Unusedcategories' => array( 'Käyttämättömät_luokat' ),
+ 'Unusedimages' => array( 'Käyttämättömät_tiedostot' ),
+ 'Unusedtemplates' => array( 'Käyttämättömät_mallineet' ),
+ 'Unwatchedpages' => array( 'Tarkkailemattomat_sivut' ),
+ 'Upload' => array( 'Tallenna', 'Lisää_tiedosto' ),
+ 'Userlogin' => array( 'Kirjaudu_sisään' ),
+ 'Userlogout' => array( 'Kirjaudu_ulos' ),
+ 'Userrights' => array( 'Käyttöoikeudet' ),
+ 'Version' => array( 'Versio' ),
+ 'Wantedcategories' => array( 'Halutuimmat_luokat' ),
+ 'Wantedfiles' => array( 'Halutuimmat_tiedostot' ),
+ 'Wantedpages' => array( 'Halutuimmat_sivut' ),
+ 'Wantedtemplates' => array( 'Halutuimmat_mallineet' ),
+ 'Watchlist' => array( 'Tarkkailulista' ),
+ 'Whatlinkshere' => array( 'Tänne_viittaavat_sivut' ),
+ 'Withoutinterwiki' => array( 'Kielilinkittömät_sivut' ),
);
$magicWords = array(
@@ -109,7 +169,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__SISLUETTPAKOTUS__', '__FORCETOC__' ),
'toc' => array( '0', '__SISÄLLYSLUETTELO__', '__TOC__' ),
'noeditsection' => array( '0', '__EIOSIOMUOKKAUSTA__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__EIOTSIKKOA__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'KULUVAKUU', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonthname' => array( '1', 'KULUVAKUUNIMI', 'CURRENTMONTHNAME' ),
'currentmonthnamegen' => array( '1', 'KULUVAKUUNIMIGEN', 'CURRENTMONTHNAMEGEN' ),
@@ -210,104 +269,44 @@ $magicWords = array(
'protectionlevel' => array( '1', 'SUOJAUSTASO', 'PROTECTIONLEVEL' ),
);
-$specialPageAliases = array(
- 'Activeusers' => array( 'Aktiiviset_käyttäjät' ),
- 'Allmessages' => array( 'Järjestelmäviestit' ),
- 'Allpages' => array( 'Kaikki_sivut' ),
- 'Ancientpages' => array( 'Kuolleet_sivut' ),
- 'Badtitle' => array( 'Kelpaamaton_otsikko' ),
- 'Blankpage' => array( 'Tyhjä_sivu' ),
- 'Block' => array( 'Estä' ),
- 'Blockme' => array( 'Estä_minut' ),
- 'Booksources' => array( 'Kirjalähteet' ),
- 'BrokenRedirects' => array( 'Virheelliset_ohjaukset', 'Virheelliset_uudelleenohjaukset' ),
- 'Categories' => array( 'Luokat' ),
- 'ChangeEmail' => array( 'Muuta_sähköpostiosoite' ),
- 'ChangePassword' => array( 'Muuta_salasana', 'Alusta_salasana' ),
- 'ComparePages' => array( 'Vertaa_sivuja' ),
- 'Confirmemail' => array( 'Varmista_sähköpostiosoite' ),
- 'Contributions' => array( 'Muokkaukset' ),
- 'CreateAccount' => array( 'Luo_tunnus' ),
- 'Deadendpages' => array( 'Linkittömät_sivut' ),
- 'DeletedContributions' => array( 'Poistetut_muokkaukset' ),
- 'Disambiguations' => array( 'Täsmennyssivut' ),
- 'DoubleRedirects' => array( 'Kaksinkertaiset_ohjaukset', 'Kaksinkertaiset_uudelleenohjaukset' ),
- 'EditWatchlist' => array( 'Muokkaa_tarkkailulistaa' ),
- 'Emailuser' => array( 'Lähetä_sähköpostia' ),
- 'Export' => array( 'Vie_sivuja' ),
- 'Fewestrevisions' => array( 'Vähiten_muokatut_sivut' ),
- 'FileDuplicateSearch' => array( 'Kaksoiskappaleiden_haku' ),
- 'Filepath' => array( 'Tiedostopolku' ),
- 'Import' => array( 'Tuo_sivuja' ),
- 'Invalidateemail' => array( 'Hylkää_sähköpostiosoite' ),
- 'BlockList' => array( 'Muokkausestot' ),
- 'LinkSearch' => array( 'Linkkihaku' ),
- 'Listadmins' => array( 'Ylläpitäjät' ),
- 'Listbots' => array( 'Botit' ),
- 'Listfiles' => array( 'Tiedostoluettelo' ),
- 'Listgrouprights' => array( 'Käyttäjäryhmien_oikeudet' ),
- 'Listredirects' => array( 'Ohjaukset', 'Ohjaussivut', 'Uudelleenohjaukset' ),
- 'Listusers' => array( 'Käyttäjät' ),
- 'Lockdb' => array( 'Lukitse_tietokanta' ),
- 'Log' => array( 'Loki', 'Lokit' ),
- 'Lonelypages' => array( 'Yksinäiset_sivut' ),
- 'Longpages' => array( 'Pitkät_sivut' ),
- 'MergeHistory' => array( 'Liitä_muutoshistoria' ),
- 'MIMEsearch' => array( 'MIME-haku' ),
- 'Mostcategories' => array( 'Luokitelluimmat_sivut' ),
- 'Mostimages' => array( 'Viitatuimmat_tiedostot' ),
- 'Mostlinked' => array( 'Viitatuimmat_sivut' ),
- 'Mostlinkedcategories' => array( 'Viitatuimmat_luokat' ),
- 'Mostlinkedtemplates' => array( 'Viitatuimmat_mallineet' ),
- 'Mostrevisions' => array( 'Muokatuimmat_sivut' ),
- 'Movepage' => array( 'Siirrä_sivu' ),
- 'Mycontributions' => array( 'Omat_muokkaukset' ),
- 'Mypage' => array( 'Oma_sivu' ),
- 'Mytalk' => array( 'Oma_keskustelu' ),
- 'Myuploads' => array( 'Omat_tiedostot' ),
- 'Newimages' => array( 'Uudet_tiedostot', 'Uudet_kuvat' ),
- 'Newpages' => array( 'Uudet_sivut' ),
- 'PasswordReset' => array( 'Unohtuneen_salasanan_vaihto' ),
- 'PermanentLink' => array( 'Ikilinkki' ),
- 'Popularpages' => array( 'Suositut_sivut' ),
- 'Preferences' => array( 'Asetukset' ),
- 'Prefixindex' => array( 'Etuliiteluettelo' ),
- 'Protectedpages' => array( 'Suojatut_sivut' ),
- 'Protectedtitles' => array( 'Suojatut_sivunimet' ),
- 'Randompage' => array( 'Satunnainen_sivu' ),
- 'Randomredirect' => array( 'Satunnainen_ohjaus', 'Satunnainen_uudelleenohjaus' ),
- 'Recentchanges' => array( 'Tuoreet_muutokset' ),
- 'Recentchangeslinked' => array( 'Linkitetyt_muutokset' ),
- 'Revisiondelete' => array( 'Poista_muokkaus' ),
- 'RevisionMove' => array( 'Versioiden_siirto' ),
- 'Search' => array( 'Haku' ),
- 'Shortpages' => array( 'Lyhyet_sivut' ),
- 'Specialpages' => array( 'Toimintosivut' ),
- 'Statistics' => array( 'Tilastot' ),
- 'Tags' => array( 'Merkinnät' ),
- 'Unblock' => array( 'Poista_esto' ),
- 'Uncategorizedcategories' => array( 'Luokittelemattomat_luokat' ),
- 'Uncategorizedimages' => array( 'Luokittelemattomat_tiedostot' ),
- 'Uncategorizedpages' => array( 'Luokittelemattomat_sivut' ),
- 'Uncategorizedtemplates' => array( 'Luokittelemattomat_mallineet' ),
- 'Undelete' => array( 'Palauta' ),
- 'Unlockdb' => array( 'Avaa_tietokanta' ),
- 'Unusedcategories' => array( 'Käyttämättömät_luokat' ),
- 'Unusedimages' => array( 'Käyttämättömät_tiedostot' ),
- 'Unusedtemplates' => array( 'Käyttämättömät_mallineet' ),
- 'Unwatchedpages' => array( 'Tarkkailemattomat_sivut' ),
- 'Upload' => array( 'Tallenna', 'Lisää_tiedosto' ),
- 'Userlogin' => array( 'Kirjaudu_sisään' ),
- 'Userlogout' => array( 'Kirjaudu_ulos' ),
- 'Userrights' => array( 'Käyttöoikeudet' ),
- 'Version' => array( 'Versio' ),
- 'Wantedcategories' => array( 'Halutuimmat_luokat' ),
- 'Wantedfiles' => array( 'Halutuimmat_tiedostot' ),
- 'Wantedpages' => array( 'Halutuimmat_sivut' ),
- 'Wantedtemplates' => array( 'Halutuimmat_mallineet' ),
- 'Watchlist' => array( 'Tarkkailulista' ),
- 'Whatlinkshere' => array( 'Tänne_viittaavat_sivut' ),
- 'Withoutinterwiki' => array( 'Kielilinkittömät_sivut' ),
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
+
+$datePreferences = array(
+ 'default',
+ 'fi normal',
+ 'fi seconds',
+ 'fi numeric',
+ 'ISO 8601',
+);
+
+$defaultDateFormat = 'fi normal';
+
+$dateFormats = array(
+ 'fi normal time' => 'H.i',
+ 'fi normal date' => 'j. F"ta" Y',
+ 'fi normal both' => 'j. F"ta" Y "kello" H.i',
+
+ 'fi seconds time' => 'H:i:s',
+ 'fi seconds date' => 'j. F"ta" Y',
+ 'fi seconds both' => 'j. F"ta" Y "kello" H:i:s',
+
+ 'fi numeric time' => 'H.i',
+ 'fi numeric date' => 'j.n.Y',
+ 'fi numeric both' => 'j.n.Y "kello" H.i',
+);
+
+$datePreferenceMigrationMap = array(
+ 'default',
+ 'fi normal',
+ 'fi seconds',
+ 'fi numeric',
+);
+
+$bookstoreList = array(
+ 'Bookplus' => 'http://www.bookplus.fi/product.php?isbn=$1',
+ 'Helsingin yliopiston kirjasto' => 'http://pandora.lib.hel.fi/cgi-bin/mhask/monihask.py?volname=&author=&keyword=&ident=$1&submit=Hae&engine_helka=ON',
+ 'Pääkaupunkiseudun kirjastot' => 'http://www.helmet.fi/search*fin/i?SEARCH=$1',
+ 'Tampereen seudun kirjastot' => 'http://kirjasto.tampere.fi/Piki?formid=fullt&typ0=6&dat0=$1'
);
$linkTrail = '/^([a-zäö]+)(.*)$/sDu';
@@ -447,6 +446,7 @@ $messages = array(
'newwindow' => '(avautuu uuteen ikkunaan)',
'cancel' => 'Peruuta',
'moredotdotdot' => 'Lisää...',
+'morenotlisted' => 'Lisää...',
'mypage' => 'Käyttäjäsivu',
'mytalk' => 'Keskustelusivu',
'anontalk' => 'Keskustele tämän IP:n kanssa',
@@ -458,7 +458,6 @@ $messages = array(
'qbbrowse' => 'Selaa',
'qbedit' => 'Muokkaa',
'qbpageoptions' => 'Sivuasetukset',
-'qbpageinfo' => 'Sivun tiedot',
'qbmyoptions' => 'Omat sivut',
'qbspecialpages' => 'Toimintosivut',
'faq' => 'Usein kysytyt kysymykset',
@@ -481,6 +480,7 @@ $messages = array(
'namespaces' => 'Nimiavaruudet',
'variants' => 'Kirjoitusjärjestelmät',
+'navigation-heading' => 'Navigointivalikko',
'errorpagetitle' => 'Virhe',
'returnto' => 'Palaa sivulle $1.',
'tagline' => '{{SITENAME}}',
@@ -715,10 +715,10 @@ Lukituksen asettanut ylläpitäjä on antanut seuraavan syyn toimenpiteelle: $3.
# Login and logout pages
'logouttext' => "'''Olet nyt kirjautunut ulos.'''
-Voit jatkaa {{GRAMMAR:genitive|{{SITENAME}}}} käyttöä nimettömänä, tai [[Special:UserLogin|kirjautua uudelleen sisään]].
+Voit jatkaa {{GRAMMAR:genitive|{{SITENAME}}}} käyttöä nimettömänä, tai <span class='plainlinks'>[$1 kirjautua uudelleen sisään]</span>.
Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut sisään, kunnes tyhjennät selaimen välimuistin.",
-'welcomecreation' => '== Tervetuloa $1! ==
-Käyttäjätunnuksesi on luotu.
+'welcomeuser' => 'Tervetuloa $1!',
+'welcomecreation-msg' => 'Käyttäjätunnuksesi on luotu.
Älä unohda virittää {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|asetuksiasi]].',
'yourname' => 'Käyttäjätunnus',
'yourpassword' => 'Salasana',
@@ -742,7 +742,7 @@ Käyttäjätunnuksesi on luotu.
'gotaccount' => "Jos sinulla on jo tunnus, voit '''$1'''.",
'gotaccountlink' => 'kirjautua sisään',
'userlogin-resetlink' => 'Unohditko salasanasi?',
-'createaccountmail' => 'sähköpostitse',
+'createaccountmail' => 'Käytä satunnaista väliaikaissalasanaa ja lähetä se alla määritettyyn sähköpostiosoitteeseen',
'createaccountreason' => 'Syy',
'badretype' => 'Syöttämäsi salasanat ovat erilaiset.',
'userexists' => 'Pyytämäsi käyttäjänimi on jo käytössä. Valitse toinen käyttäjänimi.',
@@ -801,6 +801,7 @@ Odota ennen kuin yrität uudelleen.',
# Email sending
'php-mail-error-unknown' => 'Tuntematon virhe PHP:n mail()-funktiossa',
'user-mail-no-addy' => 'Yritit lähettää sähköpostia ilman sähköpostiosoitetta.',
+'user-mail-no-body' => 'Sähköpostin sisältö ei ole tarpeeksi pitkä.',
# Change password dialog
'resetpass' => 'Muuta salasana',
@@ -864,6 +865,7 @@ Väliaikainen salasana: $2',
'changeemail-oldemail' => 'Nykyinen sähköpostiosoite',
'changeemail-newemail' => 'Uusi sähköpostiosoite',
'changeemail-none' => '(ei asetettu)',
+'changeemail-password' => 'Salasanasi sivustolla {{SITENAME}}',
'changeemail-submit' => 'Muuta sähköpostiosoite',
'changeemail-cancel' => 'Peruuta',
@@ -1030,7 +1032,6 @@ Alla on viimeisin lokitapahtuma:",
'template-semiprotected' => '(suojattu kirjautumattomilta ja uusilta käyttäjiltä)',
'hiddencategories' => 'Tämä sivu kuuluu {{PLURAL:$1|seuraavaan piilotettuun luokkaan|seuraaviin piilotettuihin luokkiin}}:',
'edittools' => '<!-- Tässä oleva teksti näytetään muokkauskentän alla. -->',
-'nocreatetitle' => 'Sivujen luominen on rajoitettu',
'nocreatetext' => 'Et voi luoda uusia sivuja. Voit muokata olemassa olevia sivuja tai [[Special:UserLogin|luoda käyttäjätunnuksen]].',
'nocreate-loggedin' => 'Sinulla ei ole oikeuksia luoda uusia sivuja.',
'sectioneditnotsupported-title' => 'Osiomuokkaaminen ei ole tuettu.',
@@ -1051,6 +1052,15 @@ Se on ilmeisesti poistettu.',
'edit-already-exists' => 'Uuden sivun luominen ei onnistunut.
Se on jo olemassa.',
'defaultmessagetext' => 'Viestin oletusteksti',
+'content-failed-to-parse' => 'Sisältö tyypiltään $2 ei jäsenny tyypiksi $1: $3',
+'invalid-content-data' => 'Virheellinen sisältö',
+'content-not-allowed-here' => 'Sivun [[$2]] sisältö ei voi olla tyyppiä $1.',
+
+# Content models
+'content-model-wikitext' => 'wikiteksti',
+'content-model-text' => 'teksti',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Tällä sivulla on liian monta hitaiden laajennusfunktioiden kutsua.
@@ -1410,9 +1420,9 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'prefs-emailconfirm-label' => 'Sähköpostin varmistus',
'prefs-textboxsize' => 'Muokkauskentän koko',
'youremail' => 'Sähköpostiosoite',
-'username' => 'Käyttäjätunnus',
-'uid' => 'Tunniste',
-'prefs-memberingroups' => 'Jäsenenä {{PLURAL:$1|ryhmässä|ryhmissä}}',
+'username' => '{{GENDER:$1|Käyttäjätunnus}}',
+'uid' => '{{GENDER:$1|Tunniste}}',
+'prefs-memberingroups' => '{{GENDER:$2|Jäsenenä}} {{PLURAL:$1|ryhmässä|ryhmissä}}',
'prefs-registration' => 'Rekisteröintiaika',
'yourrealname' => 'Oikea nimi',
'yourlanguage' => 'Käyttöliittymän kieli',
@@ -1559,12 +1569,13 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
'right-sendemail' => 'Lähettää sähköpostia muille käyttäjille',
'right-passwordreset' => 'Tarkastella salasanan alustusviestejä',
+# Special:Log/newusers
+'newuserlogpage' => 'Uudet käyttäjät',
+'newuserlogpagetext' => 'Tämä on loki luoduista käyttäjätunnuksista.',
+
# User rights log
'rightslog' => 'Käyttöoikeusloki',
'rightslogtext' => 'Tämä on loki käyttäjien käyttöoikeuksien muutoksista.',
-'rightslogentry' => 'muutti käyttäjän $1 oikeudet ryhmistä $2 ryhmiin $3',
-'rightslogentry-autopromote' => 'muutettiin automaattisesti ryhmistä $2 ryhmiin $3',
-'rightsnone' => '(ei oikeuksia)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lukea tätä sivua',
@@ -1794,6 +1805,7 @@ $1',
'backend-fail-notsame' => 'Epäidenttinen tiedosto on jo olemassa sijainnissa $1.',
'backend-fail-invalidpath' => '$1 ei ole sallittu tallennuspolku.',
'backend-fail-delete' => 'Tiedostoa $1 ei voitu poistaa.',
+'backend-fail-describe' => 'Tiedoston â€$1†metatietojen muuttaminen epäonnistui.',
'backend-fail-alreadyexists' => 'Tiedosto $1 on jo olemassa.',
'backend-fail-store' => 'Tiedostoa $1 ei voitu tallentaa polkuun $2.',
'backend-fail-copy' => 'Tiedostoa ei voitu kopioida kohteesta $1 kohteeseen $2.',
@@ -2023,6 +2035,12 @@ Syöte: sisältötyyppi/alatyyppi, esimerkiksi <code>image/jpeg</code>.',
Täsmennyssivun sijaan ne voisivat linkittää suoraan asianomaiseen aiheeseen.<br />
Sivua kohdellaan täsmennyssivuna, jos se käyttää mallinetta, johon on linkki sivulta [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Sivut sivun ominaisuuden mukaan',
+'pageswithprop-legend' => 'Sivut sivun ominaisuuden mukaan',
+'pageswithprop-text' => 'Tällä sivulla on lueteltu sivut, jotka käyttävät erityistä sivun ominaisuutta.',
+'pageswithprop-prop' => 'Ominaisuuden nimi',
+'pageswithprop-submit' => 'Siirry',
+
'doubleredirects' => 'Kaksinkertaiset ohjaukset',
'doubleredirectstext' => 'Tässä listassa on ohjaussivut, jotka ohjaavat toiseen ohjaussivuun.
Jokaisella 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.
@@ -2174,9 +2192,9 @@ Katso myös [[Special:WantedCategories|halutut luokat]].',
'linksearch-pat' => 'Osoite',
'linksearch-ns' => 'Nimiavaruus',
'linksearch-ok' => 'Etsi',
-'linksearch-text' => 'Tähteä (*) voi käyttää jokerimerkkinä, esimerkiksi â€*.wikipedia.orgâ€.
-Vähintään ylätason verkkotunnus, esimerkiksi "*.org", tarvitaan.<br />
-Tuetut protokollat: <code>$1</code> (oletuksena on <code>http://</code>, jos protokollaa ei määritetä).',
+'linksearch-text' => 'Jokerimerkkejä, kuten "*.wikipedia.org", voidaan käyttää.
+Vaaditaan vähintään ylätason verkkotunnus, esimerkiksi "*.org".<br />
+{{PLURAL:$2|Tuettu protokolla|Tuetut protokollat}}: <code>$1</code> (oletuksena on <code>http://</code>, jos protokollaa ei määritetä).',
'linksearch-line' => '$1 on linkitetty sivulta $2',
'linksearch-error' => 'Jokerimerkkiä voi käyttää ainoastaan osoitteen alussa.',
@@ -2195,10 +2213,6 @@ Tuetut protokollat: <code>$1</code> (oletuksena on <code>http://</code>, jos pro
'activeusers-hidesysops' => 'Piilota ylläpitäjät',
'activeusers-noresult' => 'Käyttäjiä ei löytynyt.',
-# Special:Log/newusers
-'newuserlogpage' => 'Uudet käyttäjät',
-'newuserlogpagetext' => 'Tämä on loki luoduista käyttäjätunnuksista.',
-
# Special:ListGroupRights
'listgrouprights' => 'Käyttäjäryhmien oikeudet',
'listgrouprights-summary' => 'Tämä lista sisältää tämän wikin käyttäjäryhmät sekä ryhmiin liitetyt käyttöoikeudet.
@@ -2292,19 +2306,23 @@ Tulevaisuudessa sivuun ja sen keskustelusivuun tehtävät muutokset listataan tÃ
'enotif_mailer' => '{{GRAMMAR:genitive|{{SITENAME}}}} sivu on muuttunut -ilmoitus',
'enotif_reset' => 'Merkitse kaikki sivut nähdyiksi',
-'enotif_newpagetext' => 'Tämä on uusi sivu.',
'enotif_impersonal_salutation' => '{{GRAMMAR:genitive|{{SITENAME}}}} käyttäjä',
-'changed' => 'muuttanut sivua',
-'created' => 'luonut sivun',
-'enotif_subject' => '$PAGEEDITOR on $CHANGEDORCREATED $PAGETITLE',
+'enotif_subject_deleted' => '{{GENDER:$2|$2}} poisti {{GRAMMAR:elative|{{SITENAME}}}} sivun $1',
+'enotif_subject_created' => '{{GENDER:$2|$2}} loi {{GRAMMAR:illative|{{SITENAME}}}} sivun $1',
+'enotif_subject_moved' => '{{GENDER:$2|$2}} siirsi {{GRAMMAR:inessive|{{SITENAME}}}} sivun $1',
+'enotif_subject_restored' => '{{GENDER:$2|$2}} palautti {{GRAMMAR:inessive|{{SITENAME}}}} sivun $1',
+'enotif_subject_changed' => '{{GENDER:$2|$2}} muutti {{GRAMMAR:inessive|{{SITENAME}}}} sivua $1',
+'enotif_body_intro_deleted' => '{{GENDER:$2|$2}} poisti {{GRAMMAR:elative|{{SITENAME}}}} sivun $1 $PAGEEDITDATE ($3).',
+'enotif_body_intro_created' => '{{GENDER:$2|$2}} loi {{GRAMMAR:inessive|{{SITENAME}}}} sivun $1 $PAGEEDITDATE. Sivun nykyinen versio on osoitteessa $3.',
+'enotif_body_intro_moved' => '{{GENDER:$2|$2}} siirsi {{GRAMMAR:inessive|{{SITENAME}}}} sivun $1 $PAGEEDITDATE. Sivun nykyinen versio on osoitteessa $3.',
+'enotif_body_intro_restored' => '{{GENDER:$2|$2}} palautti {{GRAMMAR:inessive|{{SITENAME}}}} sivun $1 $PAGEEDITDATE. Sivun nykyinen versio on osoitteessa $3.',
+'enotif_body_intro_changed' => '{{GENDER:$2|$2}} muutti {{GRAMMAR:inessive|{{SITENAME}}}} sivua $1 $PAGEEDITDATE. Sivun nykyinen versio on osoitteessa $3.',
'enotif_lastvisited' => 'Osoitteessa $1 on kaikki muutokset viimeisen käyntisi jälkeen.',
'enotif_lastdiff' => 'Muutos on osoitteessa $1.',
'enotif_anon_editor' => 'kirjautumaton käyttäjä $1',
'enotif_body' => '$WATCHINGUSERNAME,
-{{GRAMMAR:genitive|{{SITENAME}}}} käyttäjä $PAGEEDITOR on $CHANGEDORCREATED $PAGETITLE $PAGEEDITDATE. Nykyinen versio on osoitteessa $PAGETITLE_URL .
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Muokkaajan yhteenveto: $PAGESUMMARY $PAGEMINOREDIT
@@ -2328,6 +2346,8 @@ $UNWATCHURL
Palaute ja lisäapu osoitteessa:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'luonut sivun',
+'changed' => 'muuttanut sivua',
# Delete
'deletepage' => 'Poista sivu',
@@ -2391,6 +2411,8 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
'prot_1movedto2' => 'siirsi sivun [[$1]] uudelle nimelle [[$2]]',
'protect-badnamespace-title' => 'Nimiavaruus ei suojattavissa',
'protect-badnamespace-text' => 'Tämän nimiavaruuden sivuja ei voi suojata.',
+'protect-norestrictiontypes-text' => 'Tätä sivua ei voi suojata, koska mitään rajoitusvaihtoehtoja ei ole käytettävissä.',
+'protect-norestrictiontypes-title' => 'Ei suojattavissa oleva sivu',
'protect-legend' => 'Suojaukset',
'protectcomment' => 'Syy',
'protectexpiry' => 'Vanhentuu',
@@ -2467,7 +2489,8 @@ Tässä tilanteessa älä valitse palautettavaksi näkyviin viimeisintä poistet
'undeletedrevisions' => '{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin',
'undeletedrevisions-files' => '{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin',
'undeletedfiles' => '{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin',
-'cannotundelete' => 'Palauttaminen epäonnistui; joku muu on voinut jo palauttaa sivun.',
+'cannotundelete' => 'Palauttaminen epäonnistui:
+$1',
'undeletedpage' => "'''$1 on palautettu.'''
[[Special:Log/delete|Poistolokista]] löydät listan viimeisimmistä poistoista ja palautuksista.",
@@ -2498,7 +2521,7 @@ $1',
'blanknamespace' => '(sivut)',
# Contributions
-'contributions' => 'Käyttäjän muokkaukset',
+'contributions' => '{{GENDER:$1|Käyttäjän}} muokkaukset',
'contributions-title' => 'Käyttäjän $1 muokkaukset',
'mycontris' => 'Omat muokkaukset',
'contribsub2' => 'Käyttäjän $1 ($2) muokkaukset',
@@ -2755,6 +2778,7 @@ $1 {{PLURAL:$1|sivu|sivua}} siirrettiin.',
'immobile-target-namespace-iw' => 'Kielilinkki ei ole kelvollinen kohde sivun siirrolle.',
'immobile-source-page' => 'Tämä sivu ei ole siirrettävissä.',
'immobile-target-page' => 'Kyseiselle kohdenimelle ei voi siirtää.',
+'bad-target-model' => 'Kohde käyttää eri sisältömallia. Sisällön muuttaminen muodosta $1 muotoon $2 ei ole mahdollista.',
'imagenocrossnamespace' => 'Tiedostoja ei voi siirtää pois tiedostonimiavaruudesta.',
'nonfile-cannot-move-to-file' => 'Sivuja ei voi siirtää tiedostonimiavaruuteen.',
'imagetypemismatch' => 'Uusi tiedostopääte ei vastaa tiedoston tyyppiä',
@@ -2880,7 +2904,6 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
# JavaScriptTest
'javascripttest' => 'JavaScriptin testaus',
-'javascripttest-disabled' => 'Tämä toiminto ei ole käytössä tässä wikissä.',
'javascripttest-title' => 'Suoritetaan $1-testejä.',
'javascripttest-pagetext-noframework' => 'Tämä sivu on varattu JavaScript-testien suorittamiseen.',
'javascripttest-pagetext-unknownframework' => 'Tuntematon testausalusta $1.',
@@ -3027,6 +3050,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
'pageinfo-default-sort' => 'Oletuslajitteluavain',
'pageinfo-length' => 'Sivun pituus (tavuina)',
'pageinfo-article-id' => 'Sivun tunniste',
+'pageinfo-language' => 'Sivun sisällön kieli',
'pageinfo-robot-policy' => 'Hakukonemerkinnät',
'pageinfo-robot-index' => 'Indeksoitava',
'pageinfo-robot-noindex' => 'Ei indeksoitava',
@@ -3046,6 +3070,17 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
'pageinfo-magic-words' => '{{PLURAL:$1|Taikasana|Taikasanat}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Piilotettu luokka|Piilotetut luokat}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Sisällytetty malline|Sisällytetyt mallineet}} ($1)',
+'pageinfo-transclusions' => 'Sisällytetty {{PLURAL:$1|sivulle|sivuille}} ($1)',
+'pageinfo-toolboxlink' => 'Sivun tiedot',
+'pageinfo-redirectsto' => 'Ohjaus sivulle',
+'pageinfo-redirectsto-info' => 'tiedot',
+'pageinfo-contentpage' => 'Lasketaan sisältösivuksi',
+'pageinfo-contentpage-yes' => 'Kyllä',
+'pageinfo-protect-cascading-yes' => 'Kyllä',
+'pageinfo-category-info' => 'Luokkatiedot',
+'pageinfo-category-pages' => 'Sivujen määrä',
+'pageinfo-category-subcats' => 'Alaluokkien määrä',
+'pageinfo-category-files' => 'Tiedostojen määrä',
# Skin names
'skinname-standard' => 'Perus',
@@ -3067,6 +3102,8 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
'markedaspatrollederror' => 'Muutoksen merkitseminen tarkastetuksi epäonnistui.',
'markedaspatrollederrortext' => 'Tarkastetuksi merkittävää versiota ei ole määritelty.',
'markedaspatrollederror-noautopatrol' => 'Et voi merkitä omia muutoksiasi tarkastetuiksi.',
+'markedaspatrollednotify' => 'Tämä muutos sivuun $1 on merkitty tarkastetuksi.',
+'markedaspatrollederrornotify' => 'Tarkastetuksi merkitseminen epäonnistui.',
# Patrol log
'patrol-log-page' => 'Muutostentarkastusloki',
@@ -3100,6 +3137,7 @@ Suorittamalla sen järjestelmäsi voi muuttua epäluotettavaksi.",
'file-nohires' => 'Tarkempaa kuvaa ei ole saatavilla.',
'svg-long-desc' => 'SVG-tiedosto; oletustarkkuus $1 × $2 kuvapistettä; tiedostokoko $3',
'svg-long-desc-animated' => 'Animoitu SVG-tiedosto; oletustarkkuus $1 × $2 kuvapistettä; tiedostokoko $3',
+'svg-long-error' => 'Kelvoton SVG-tiedosto: $1',
'show-big-image' => 'Korkeatarkkuuksinen versio',
'show-big-image-preview' => 'Tämän esikatselun koko: $1.',
'show-big-image-other' => '{{PLURAL:$2|Muu resoluutio|Muut resoluutiot}}: $1.',
@@ -3129,7 +3167,10 @@ Suorittamalla sen järjestelmäsi voi muuttua epäluotettavaksi.",
'minutes' => '{{PLURAL:$1|$1 minuutti|$1 minuuttia}}',
'hours' => '{{PLURAL:$1|$1 tunti|$1 tuntia}}',
'days' => '{{PLURAL:$1|$1 päivä|$1 päivää}}',
+'months' => '{{PLURAL:$1|$1 kuukausi|$1 kuukautta}}',
+'years' => '{{PLURAL:$1|$1 vuosi|$1 vuotta}}',
'ago' => '$1 sitten',
+'just-now' => 'juuri nyt',
# Bad image list
'bad_image_list' => 'Listan muoto on seuraava:
@@ -3615,6 +3656,7 @@ Varmennuskoodi vanhenee $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Wikienvälinen sisällytys ei ole käytössä]',
'scarytranscludefailed' => '[Mallineen hakeminen epäonnistui: $1]',
+'scarytranscludefailed-httpstatus' => '[Mallineen hakeminen epäonnistui: $1 HTTP $2]',
'scarytranscludetoolong' => '[Verkko-osoite on liian pitkä]',
# Delete conflict
@@ -3734,6 +3776,7 @@ Voit myös muokata listaa [[Special:EditWatchlist|tavalliseen tapaan]].',
'version-license' => 'Lisenssi',
'version-poweredby-credits' => "Tämä wiki käyttää '''[//www.mediawiki.org/ MediaWikiä]'''. Copyright © 2001–$1 $2.",
'version-poweredby-others' => 'muut',
+'version-credits-summary' => 'Haluaisimme kiittää seuraavia henkilöitä heidän panoksestaan [[Special:Version|MediaWiki-ohjelmistoon]].',
'version-license-info' => 'MediaWiki on vapaa ohjelmisto – voit levittää sitä ja/tai muokata sitä Free Software Foundationin GNU General Public Licensen ehdoilla, joko version 2 tai halutessasi minkä tahansa myöhemmän version mukaisesti.
MediaWikiä levitetään siinä toivossa, että se olisi hyödyllinen, mutta ilman mitään takuuta; ilman edes hiljaista takuuta kaupallisesti hyväksyttävästä laadusta tai soveltuvuudesta tiettyyn tarkoitukseen. Katso GPL-lisenssistä lisää yksityiskohtia.
@@ -3847,17 +3890,17 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyssÃ
'sqlite-no-fts' => '$1, jossa ei ole tukea kokotekstihaulle',
# New logging system
-'logentry-delete-delete' => '$1 poisti sivun $3',
-'logentry-delete-restore' => '$1 palautti sivun $3',
-'logentry-delete-event' => '$1 muutti {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
-'logentry-delete-revision' => '$1 muutti {{PLURAL:$5|version|$5 version}} näkyvyyttä sivulla $3: $4',
-'logentry-delete-event-legacy' => '$1 muutti kohteen $3 lokitapahtumien näkyvyyttä',
-'logentry-delete-revision-legacy' => '$1 muutti sivun $3 versioiden näkyvyyttä',
-'logentry-suppress-delete' => '$1 häivytti sivun $3',
-'logentry-suppress-event' => '$1 muutti salaa {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
-'logentry-suppress-revision' => '$1 muutti salaa {{PLURAL:$5|muutoksen|$5 muutoksen}} näkyvyyttä sivulla $3: $4',
-'logentry-suppress-event-legacy' => '$1 muutti salaa kohteen $3 lokitapahtumien näkyvyyttä',
-'logentry-suppress-revision-legacy' => '$1 muutti salaa sivun $3 versioiden näkyvyyttä',
+'logentry-delete-delete' => '$1 {{GENDER:$2|poisti}} sivun $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|palautti}} sivun $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|muutti}} {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|muutti}} {{PLURAL:$5|version|$5 version}} näkyvyyttä sivulla $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|muutti}} kohteen $3 lokitapahtumien näkyvyyttä',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|muutti}} sivun $3 versioiden näkyvyyttä',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|häivytti}} sivun $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|muutti}} salaa {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|muutti}} salaa {{PLURAL:$5|muutoksen|$5 muutoksen}} näkyvyyttä sivulla $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|muutti}} salaa kohteen $3 lokitapahtumien näkyvyyttä',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|muutti}} salaa sivun $3 versioiden näkyvyyttä',
'revdelete-content-hid' => 'sisältö piilotettu',
'revdelete-summary-hid' => 'muokkausyhteenveto piilotettu',
'revdelete-uname-hid' => 'käyttäjätunnus piilotettu',
@@ -3866,17 +3909,21 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyssÃ
'revdelete-uname-unhid' => 'käyttäjätunnus palautettu näkyviin',
'revdelete-restricted' => 'asetti rajoitukset ylläpitäjille',
'revdelete-unrestricted' => 'poisti rajoitukset ylläpitäjiltä',
-'logentry-move-move' => '$1 siirsi sivun $3 uudelle nimelle $4',
-'logentry-move-move-noredirect' => '$1 siirsi sivun $3 uudelle nimelle $4 luomatta ohjausta',
-'logentry-move-move_redir' => '$1 siirsi sivun $3 ohjauksen $4 päälle',
-'logentry-move-move_redir-noredirect' => '$1 siirsi sivun $3 ohjauksen $4 päälle luomatta ohjausta',
-'logentry-patrol-patrol' => '$1 merkitsi sivun $3 muutoksen $4 tarkastetuksi',
-'logentry-patrol-patrol-auto' => '$1 merkitsi automaattisesti sivun $3 muutoksen $4 tarkastetuksi',
-'logentry-newusers-newusers' => 'Käyttäjätunnus $1 luotiin',
-'logentry-newusers-create' => 'Käyttäjätunnus $1 luotiin',
-'logentry-newusers-create2' => '$1 loi käyttäjätunnuksen $3',
-'logentry-newusers-autocreate' => 'Käyttäjätunnus $1 luotiin automaattisesti',
-'newuserlog-byemail' => 'salasana lähetetty sähköpostitse',
+'logentry-move-move' => '$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4 luomatta ohjausta',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|siirsi}} sivun $3 ohjauksen $4 päälle',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|siirsi}} sivun $3 ohjauksen $4 päälle luomatta ohjausta',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|merkitsi}} sivun $3 muutoksen $4 tarkastetuksi',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|merkitsi}} automaattisesti sivun $3 muutoksen $4 tarkastetuksi',
+'logentry-newusers-newusers' => 'Käyttäjätunnus $1 {{GENDER:$2|luotiin}}',
+'logentry-newusers-create' => 'Käyttäjätunnus $1 {{GENDER:$2|luotiin}}',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|loi}} käyttäjätunnuksen $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|loi}} käyttäjätunnuksen $3 ja salasana lähetettiin sähköpostitse',
+'logentry-newusers-autocreate' => 'Käyttäjätunnus $1 {{GENDER:$2|luotiin}} automaattisesti',
+'logentry-rights-rights' => '$1 {{GENDER:$2|muutti}} käyttäjän $3 oikeudet ryhmistä $4 ryhmiin $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|muutti}} käyttäjän $3 jäsenyyttä ryhmässä',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|muutettiin}} automaattisesti ryhmistä $4 ryhmiin $5',
+'rightsnone' => '(ei oikeuksia)',
# Feedback
'feedback-bugornote' => 'Jos voit kuvailla teknisen ongelman tarkasti – [$1 ilmoita ohjelmointivirheestä].
@@ -3930,6 +3977,7 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
'api-error-ok-but-empty' => 'Sisäinen virhe: palvelimelta ei saatu vastausta.',
'api-error-overwrite' => 'Olemassa olevan tiedoston korvaaminen ei ole sallittua.',
'api-error-stashfailed' => 'Sisäinen virhe: Väliaikaisen tiedoston tallentaminen epäonnistui.',
+'api-error-publishfailed' => 'Sisäinen virhe: Väliaikaisen tiedoston julkaiseminen epäonnistui.',
'api-error-timeout' => 'Palvelin ei vastannut odotetun ajan kuluessa.',
'api-error-unclassified' => 'Tapahtui tuntematon virhe.',
'api-error-unknown-code' => 'Tuntematon virhe: $1',
diff --git a/languages/messages/MessagesFit.php b/languages/messages/MessagesFit.php
index eaf95146..f370e318 100644
--- a/languages/messages/MessagesFit.php
+++ b/languages/messages/MessagesFit.php
@@ -120,7 +120,6 @@ $messages = array(
# Cologne Blue skin
'qbedit' => 'Mookkaa',
'qbpageoptions' => 'Tämä sivu',
-'qbpageinfo' => 'Sisältö',
'qbmyoptions' => 'Minun inställninkit',
'qbspecialpages' => 'Spesiaali sivut',
'faq' => 'Useasti kysytyt kysymykset',
@@ -379,6 +378,9 @@ Merkinät: (nyk.) = eroavaisuuet nykyisheen versuunhiin, (eel.) = eroavaisuuet e
'prefs-help-email' => 'E-postin atressi on vapa, mutta tekkee maholiseks ette lähättää sulle salasanan meilissä, jos unhoutat sen.',
'prefs-help-email-others' => 'Saatat kans antaa muitten käyttäjitten ottaa ottaa yhteyttä sinhuun sähköpostila. Sin atressi ei näy toisen käyttäjän ottaessa sinhuun yhteyttä.',
+# Special:Log/newusers
+'newuserlogpage' => 'Uuitten käyttäjitten loki',
+
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'mookkaa tätä sivua',
@@ -487,9 +489,6 @@ Tiot [$2 fiilin kuvvaussivulta] näkyvät tässä alla.',
# Special:LinkSearch
'linksearch-line' => '$1 on linkattu sivulta $2',
-# Special:Log/newusers
-'newuserlogpage' => 'Uuitten käyttäjitten loki',
-
# Special:ListGroupRights
'listgrouprights-members' => '(jäsenlista)',
diff --git a/languages/messages/MessagesFiu_vro.php b/languages/messages/MessagesFiu_vro.php
deleted file mode 100644
index 9407647f..00000000
--- a/languages/messages/MessagesFiu_vro.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-/** Võro
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
- *
- * @ingroup Language
- * @file
- * @comment Deprecated language code. Falls back to 'vro'.
- */
-
-$fallback = 'vro, et';
diff --git a/languages/messages/MessagesFo.php b/languages/messages/MessagesFo.php
index 16e07846..68242818 100644
--- a/languages/messages/MessagesFo.php
+++ b/languages/messages/MessagesFo.php
@@ -17,11 +17,6 @@
* @author לערי ריינה×רט
*/
-$bookstoreList = array(
- 'Bokasolan.fo' => 'http://www.bokasolan.fo/vleitari.asp?haattur=bok.alfa&Heiti=&Hovindur=&Forlag=&innbinding=Oell&bolkur=Allir&prisur=Allir&Aarstal=Oell&mal=Oell&status=Oell&ISBN=$1',
- 'inherit' => true,
-);
-
$namespaceNames = array(
NS_MEDIA => 'Miðil',
NS_SPECIAL => 'Serstakt',
@@ -53,15 +48,6 @@ $namespaceAliases = array(
'Bólkur_kjak' => NS_CATEGORY_TALK,
);
-
-$datePreferences = false;
-$defaultDateFormat = 'dmy';
-$dateFormats = array(
- 'dmy time' => 'H:i',
- 'dmy date' => 'j. M Y',
- 'dmy both' => 'j. M Y "kl." H:i',
-);
-
$specialPageAliases = array(
'Allmessages' => array( 'Øll kervisboð' ),
'Allpages' => array( 'Allar síður' ),
@@ -109,6 +95,19 @@ $specialPageAliases = array(
'Watchlist' => array( 'Mítt eftirlit' ),
);
+$datePreferences = false;
+$defaultDateFormat = 'dmy';
+$dateFormats = array(
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j. M Y',
+ 'dmy both' => 'j. M Y "kl." H:i',
+);
+
+$bookstoreList = array(
+ 'Bokasolan.fo' => 'http://www.bokasolan.fo/vleitari.asp?haattur=bok.alfa&Heiti=&Hovindur=&Forlag=&innbinding=Oell&bolkur=Allir&prisur=Allir&Aarstal=Oell&mal=Oell&status=Oell&ISBN=$1',
+ 'inherit' => true,
+);
+
$linkTrail = '/^([áðíóúýæøa-z]+)(.*)$/sDu';
$messages = array(
@@ -245,6 +244,7 @@ $messages = array(
'newwindow' => '(kemur í nýggjan glugga)',
'cancel' => 'Ógilda',
'moredotdotdot' => 'Meira...',
+'morenotlisted' => 'Meira, ið ikki verður víst',
'mypage' => 'Síða',
'mytalk' => 'Kjak',
'anontalk' => 'Kjak til hesa ip-adressuna',
@@ -256,7 +256,6 @@ $messages = array(
'qbbrowse' => 'Kaga',
'qbedit' => 'Rætta',
'qbpageoptions' => 'Henda síðan',
-'qbpageinfo' => 'Samanhangur',
'qbmyoptions' => 'Mínar síður',
'qbspecialpages' => 'Serstakar síður',
'faq' => 'OSS',
@@ -279,6 +278,7 @@ $messages = array(
'namespaces' => 'Navnarúm',
'variants' => 'Ymisk sløg',
+'navigation-heading' => 'Navigatiónsskrá',
'errorpagetitle' => 'Villa',
'returnto' => 'Vend aftur til $1.',
'tagline' => 'Frá {{SITENAME}}',
@@ -522,12 +522,11 @@ Umboðsstjórin sum stongdi hana, gav hesa frágreiðing: "$3".',
# Login and logout pages
'logouttext' => "'''Tú hevur nú ritað út.'''
-Tú kanst halda fram at brúka {{SITENAME}} sum dulnevndur, ella kanst tú [[Special:UserLogin|logga á aftur]] sum sami ella sum annar brúkari.
+Tú kanst halda fram at brúka {{SITENAME}} sum dulnevndur, ella kanst tú <span class='plainlinks'>[\$1 logga á aftur]</span> sum sami ella sum annar brúkari.
Legg til merkis, at summar síður framvegis vera vístar, sum um tú enn vart loggaður á, til tú hevur reinsa tín brovsara fyri \"cache\".",
-'welcomecreation' => '== Vælkomin, $1! ==
-
-Tín konta er nú stovnað.
-Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}} innstillingar]].',
+'welcomeuser' => 'Vælkomin, $1!',
+'welcomecreation-msg' => 'Tín konta er nú stovnað.
+Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}}-innstillingar]].',
'yourname' => 'Títt brúkaranavn:',
'yourpassword' => 'Títt loyniorð:',
'yourpasswordagain' => 'Skriva loyniorð umaftur:',
@@ -550,7 +549,7 @@ Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}} innstillingar]].'
'gotaccount' => "Hevur tú longu eina kontu? '''$1'''.",
'gotaccountlink' => 'Rita inn',
'userlogin-resetlink' => 'Hevur tú gloymt tínar logg inn upplýsingar',
-'createaccountmail' => 'eftur t-posti',
+'createaccountmail' => 'Nýt eitt fyribils tilvildarligt loyniorð og send tað til t-post adressuna niðanfyri',
'createaccountreason' => 'Orsøk:',
'badretype' => 'Loyniorðið tú hevur skriva er ikki rætt.',
'userexists' => 'Brúkaranavnið sum tú valdi er longu í nýtslu.
@@ -627,6 +626,7 @@ Vinarliga bíða áðrenn tú roynir aftur.',
# Email sending
'php-mail-error-unknown' => "Ókend villa í PHP'sa teldupost () funktión.",
'user-mail-no-addy' => 'Royndi at senda t-post uttan eina t-post adressu.',
+'user-mail-no-body' => 'Tú royndi at senda ein teldupost við ongum ella órímiliga stuttum innihaldi.',
# Change password dialog
'resetpass' => 'Broyt loyniorð',
@@ -691,6 +691,7 @@ Fyribils loyniorð: $2',
'changeemail-oldemail' => 'Verandi t-post adressa:',
'changeemail-newemail' => 'Nýggj t-post adressa:',
'changeemail-none' => '(ongin)',
+'changeemail-password' => 'Títt {{SITENAME}} loyniorð:',
'changeemail-submit' => 'Broyt t-post',
'changeemail-cancel' => 'Ógilda',
@@ -876,7 +877,6 @@ Tann seinasti posturin í loggfíluni er vístur niðanfyri fyri kelduávísing:
'template-protected' => '(friðað)',
'template-semiprotected' => '(lutvíst vardar)',
'hiddencategories' => 'Henda síðan er í {{PLURAL:$1|1 fjaldum bólki|$1 fjaldum bólkum}}:',
-'nocreatetitle' => 'Upprættan av síðu er avmarkað',
'nocreatetext' => '{{SITENAME}} hevur noktað fyri møguleikanum at upprætta nýggjar síður.
Tú kanst fara aftur og rætta eina síðu sum longu er til, ella [[Special:UserLogin|rita teg inn ella få tær eina konto]].',
'nocreate-loggedin' => 'Tú hevur ikki loyvi til at upprætta nýggjar síður.',
@@ -901,6 +901,13 @@ Tað sær út til at hon er blivin strikað.',
'edit-already-exists' => 'Tað var ikki møguligt at upprætta nýggja síðu.
Síðan er longu til.',
'defaultmessagetext' => 'Standard boðtekstur',
+'invalid-content-data' => 'Ógyldug innihalds dáta',
+'content-not-allowed-here' => '"$1" innihald er ikki loyvt á síðu [[$2]]',
+
+# Content models
+'content-model-text' => 'simpul tekstur',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-category' => 'Síður við ov nógvum dýrum parsara funktiónskallum',
@@ -1203,9 +1210,9 @@ Tú kanst ikki angra, tá tað fyrst er gjørt.',
'prefs-emailconfirm-label' => 'Vátta tína t-post adressu:',
'prefs-textboxsize' => 'Støddin á rættingar vindeyganum',
'youremail' => 'T-postur (sjálvboðið)*:',
-'username' => 'Brúkaranavn:',
-'uid' => 'Brúkara ID:',
-'prefs-memberingroups' => 'Limir í {{PLURAL:$1|bólki|bólkum}}:',
+'username' => '{{GENDER:$1|Brúkaranavn}}:',
+'uid' => '{{GENDER:$1|Brúkari}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|Limur}} í {{PLURAL:$1|bólki|bólkum}}:',
'prefs-registration' => 'Skrásett tíðspunkt:',
'yourrealname' => 'Títt navn*:',
'yourlanguage' => 'Mál til brúkaraflatu:',
@@ -1327,12 +1334,13 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
'right-sendemail' => 'Send t-post til aðrir brúkarar',
'right-passwordreset' => 'Sí teldupostar til nullstilling av loyniorði',
+# Special:Log/newusers
+'newuserlogpage' => 'Brúkara logg',
+'newuserlogpagetext' => 'Hetta er ein listi yvir seinast stovnaðu brúkarar.',
+
# User rights log
'rightslog' => 'Rættindaloggur',
'rightslogtext' => 'Hetta er ein loggur sum vísir broytingar í brúkararættindum.',
-'rightslogentry' => 'broyttar bólka limaskap fyri $1 frá $2 til $3',
-'rightslogentry-autopromote' => 'varð sjálvvirkandi fluttur upp frá $2 til $3',
-'rightsnone' => '(ongin)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'les hesa síðu',
@@ -1734,10 +1742,6 @@ Sí eisini [[Special:WantedCategories|ynsktir bólkar]].',
'activeusers-hidesysops' => 'Fjal umboðsstjórar (administratorar)',
'activeusers-noresult' => 'Ongir brúkarar funnir.',
-# Special:Log/newusers
-'newuserlogpage' => 'Brúkara logg',
-'newuserlogpagetext' => 'Hetta er ein listi yvir seinast stovnaðu brúkarar.',
-
# Special:ListGroupRights
'listgrouprights' => 'Brúkara bólka rættindi',
'listgrouprights-summary' => 'Henda síða vísir ein lista av brúkarabólkum, sum eru útgreinaðir á hesi wiki og rættindini hjá teimum einstøku bólkunum.
@@ -1810,7 +1814,6 @@ Vilt tú flyta síðuna undan tínum eftirliti, kanst tú trýsta á \"Strika ef
'watching' => 'Eftirlitir...',
'unwatching' => 'Strikar eftirlit...',
-'enotif_newpagetext' => 'Hetta er ein nýggj síða.',
'enotif_impersonal_salutation' => '{{SITENAME}}brúkari',
'created' => 'stovnað',
@@ -1902,7 +1905,7 @@ broytti tað aftur til seinastu versjón hjá $2.',
'blanknamespace' => '(Greinir)',
# Contributions
-'contributions' => 'Brúkaraíkast',
+'contributions' => '{{GENDER:$1|Brúkaraíkøst}}',
'contributions-title' => 'Brúkaraíkøst fyri $1',
'mycontris' => 'Ãkøst',
'contribsub2' => 'Eftir $1 ($2)',
@@ -2303,6 +2306,9 @@ Hendan váttanarkoda fer úr gildi tann $4.',
'compare-page1' => 'Síða 1',
'compare-page2' => 'Síða 2',
+# New logging system
+'rightsnone' => '(ongin)',
+
# Search suggestions
'searchsuggest-search' => 'Leita',
diff --git a/languages/messages/MessagesFr.php b/languages/messages/MessagesFr.php
index f529df16..de9950ce 100644
--- a/languages/messages/MessagesFr.php
+++ b/languages/messages/MessagesFr.php
@@ -29,6 +29,7 @@
* @author Enzoreg
* @author Erkethan
* @author Esbardu
+ * @author Fabrice Ferrer
* @author Fryed-peach
* @author Geoleplubo
* @author Giro720
@@ -93,13 +94,6 @@
* @author לערי ריינה×רט
*/
-$bookstoreList = array(
- 'Amazon.fr' => 'http://www.amazon.fr/exec/obidos/ISBN=$1',
- 'alapage.fr' => 'http://www.alapage.com/mx/?tp=F&type=101&l_isbn=$1&donnee_appel=ALASQ&devise=&',
- 'fnac.com' => 'http://www3.fnac.com/advanced/book.do?isbn=$1',
- 'chapitre.com' => 'http://www.chapitre.com/frame_rec.asp?isbn=$1',
-);
-
$namespaceNames = array(
NS_MEDIA => 'Média',
NS_SPECIAL => 'Spécial',
@@ -129,20 +123,99 @@ $namespaceAliases = array(
'Discussion_Catégorie' => NS_CATEGORY_TALK
);
-$linkTrail = '/^([a-zàâçéèêîôûäëïöüùÇÉÂÊÎÔÛÄËÃÖÜÀÈÙ]+)(.*)$/sDu';
-
-$dateFormats = array(
- 'mdy time' => 'H:i',
- 'mdy date' => 'F j, Y',
- 'mdy both' => 'F j, Y à H:i',
-
- 'dmy time' => 'H:i',
- 'dmy date' => 'j F Y',
- 'dmy both' => 'j F Y à H:i',
-
- 'ymd time' => 'H:i',
- 'ymd date' => 'Y F j',
- 'ymd both' => 'Y F j à H:i',
+$specialPageAliases = array(
+ 'Activeusers' => array( 'Utilisateurs_actifs', 'UtilisateursActifs' ),
+ 'Allmessages' => array( 'Messages_système', 'Messages_systeme', 'Messagessystème', 'Messagessysteme' ),
+ 'Allpages' => array( 'Toutes_les_pages', 'ToutesLesPages' ),
+ 'Ancientpages' => array( 'Pages_anciennes', 'PagesAnciennes', 'Anciennes_pages', 'AnciennesPages' ),
+ 'Badtitle' => array( 'MauvaisTitre', 'Mauvais_titre' ),
+ 'Blankpage' => array( 'Page_blanche', 'PageBlanche' ),
+ 'Block' => array( 'Bloquer', 'Blocage' ),
+ 'Blockme' => array( 'Bloquez-moi', 'Bloquezmoi' ),
+ 'Booksources' => array( 'Ouvrages_de_référence', 'Ouvrages_de_reference', 'Ouvragesderéférence', 'Ouvragesdereference', 'Recherche_ISBN', 'Recherche_isbn', 'RechercheISBN', 'Rechercheisbn' ),
+ 'BrokenRedirects' => array( 'Redirections_cassées', 'RedirectionCassées', 'Redirections_cassees', 'RedirectionsCassees' ),
+ 'Categories' => array( 'Catégories' ),
+ 'ChangeEmail' => array( 'ChangerCouriel', 'Changer_courrielw' ),
+ 'ChangePassword' => array( 'Changement_du_mot_de_passe', 'ChangementDuMotDePasse' ),
+ 'Confirmemail' => array( 'Confirmer_l\'adresse_de_contact', 'Confirmer_le_courriel', 'ConfirmerLeCourriel' ),
+ 'CreateAccount' => array( 'Créer_un_compte', 'CréerUnCompte', 'CréerCompte' ),
+ 'Deadendpages' => array( 'Pages_en_impasse', 'PagesEnImpasse' ),
+ 'DeletedContributions' => array( 'Contributions_supprimées', 'ContributionsSupprimées', 'ContributionSupprimees' ),
+ 'Disambiguations' => array( 'Homonymies', 'Homonymie', 'Pages_d\'homonymie' ),
+ 'DoubleRedirects' => array( 'Doubles_redirections', 'DoublesRedirections', 'Redirections_doubles', 'RedirectionsDoubles' ),
+ 'EditWatchlist' => array( 'Éditer_Liste_de_suivi', 'ÉditerListeDeSuivi' ),
+ 'Emailuser' => array( 'Envoyer_un_courriel', 'EnvoyerUnCourriel', 'Courriel', 'Envoyer_un_e-mail', 'EnvoyerUnEMail', 'E-mail', 'EMail' ),
+ 'Export' => array( 'Exporter', 'Exportation' ),
+ 'Fewestrevisions' => array( 'Pages_les_moins_modifiées', 'PagesLesMoinsModifiées', 'Pages_les_moins_modifiees', 'PagesLesMoinsModifiees', 'Les_moins_modifiés', 'LesMoinsModifiés', 'Les_moins_modifies', 'LesMoinsModifies' ),
+ 'FileDuplicateSearch' => array( 'Recherche_fichier_en_double', 'RechercheFichierEnDouble' ),
+ 'Filepath' => array( 'Chemin_du_fichier', 'CheminDuFichier', 'CheminFichier' ),
+ 'Import' => array( 'Importer', 'Importation' ),
+ 'Invalidateemail' => array( 'Invalider_le_courriel', 'Invalider_courriel', 'InvaliderCourriel' ),
+ 'BlockList' => array( 'Liste_des_blocages', 'ListeDesBlocages', 'Blocages', 'Utilisateurs_bloqués', 'UtilisateursBloqués', 'Utilisateurs_bloques', 'UtilisateursBloques', 'IP_bloquées', 'IPBloquees', 'IPBloquées' ),
+ 'LinkSearch' => array( 'Recherche_de_lien', 'Recherche_de_liens' ),
+ 'Listadmins' => array( 'Liste_des_administrateurs', 'Listedesadministrateurs', 'Liste_des_admins', 'Listedesadmins', 'Liste_admins', 'Listeadmins' ),
+ 'Listbots' => array( 'Liste_des_bots', 'ListedesBots' ),
+ 'Listfiles' => array( 'Liste_des_fichiers', 'ListeDesFichiers', 'Liste_des_images', 'ListeDesImages' ),
+ 'Listgrouprights' => array( 'Liste_des_droits_de_groupe', 'ListeDesDroitsDeGroupes' ),
+ 'Listredirects' => array( 'Liste_des_redirections', 'Listedesredirections', 'Liste_des_redirects', 'Listedesredirects', 'Liste_redirections', 'Listeredirections', 'Liste_redirects', 'Listeredirects' ),
+ 'Listusers' => array( 'Liste_des_utilisateurs', 'ListeDesUtilisateurs', 'Utilisateurs' ),
+ 'Lockdb' => array( 'Verrouiller_la_base', 'Verrouillerlabase', 'Verrouiller_base', 'Verrouillerbase', 'Verrouiller_BD', 'VerrouillerBD', 'Verrouiller_bd', 'Verrouillerbd' ),
+ 'Log' => array( 'Journal', 'Journaux' ),
+ 'Lonelypages' => array( 'Pages_orphelines', 'PagesOrphelines' ),
+ 'Longpages' => array( 'Pages_longues', 'PagesLongues' ),
+ 'MergeHistory' => array( 'Fusionner_les_historiques', 'FusionnerHistoriques', 'Fusionner_l\'historique', 'Fusionnerlhistorique' ),
+ 'MIMEsearch' => array( 'Recherche_MIME', 'RechercheMIME', 'Recherche_mime', 'Recherchemime' ),
+ 'Mostcategories' => array( 'Pages_les_plus_catégorisées', 'PagesLesPlusCatégorisées', 'Pages_les_plus_categorisees', 'PagesLesPlusCategorisees', 'Les_plus_catégorisés', 'LesPlusCatégorisés', 'Les_plus_categorises', 'LesPlusCategorises' ),
+ 'Mostimages' => array( 'Fichiers_les_plus_liés', 'FichiersLesPlusLiés', 'Fichiers_les_plus_lies', 'FichiersLesPlusLies', 'Fichiers_les_plus_utilisés', 'FichiersLesPlusUtilisés', 'Fichiers_les_plus_utilises', 'FichiersLesPlusUtilises', 'Images_les_plus_liées', 'ImagesLesPlusLiées', 'Images_les_plus_liees', 'ImagesLesPlusLiees', 'Images_les_plus_utilisées', 'ImagesLesPlusUtilisées', 'Images_les_plus_utilisees', 'ImagesLesPlusUtilisees' ),
+ 'Mostlinked' => array( 'Pages_les_plus_liées', 'PagesLesPlusLiées', 'Pages_les_plus_liees', 'PagesLesPlusLiees', 'Les_plus_liées', 'LesPlusLiées', 'Les_plus_liees', 'LesPlusLiees' ),
+ 'Mostlinkedcategories' => array( 'Catégories_les_plus_liées', 'CatégoriesLesPlusLiées', 'Categories_les_plus_liees', 'CategoriesLesPlusLiees', 'Catégories_les_plus_utilisées', 'CatégoriesLesPlusUtilisées', 'Categories_les_plus_utilisees', 'CategoriesLesPlusUtilisees' ),
+ 'Mostlinkedtemplates' => array( 'Modèles_les_plus_liés', 'ModèlesLesPlusLiés', 'Modeles_les_plus_lies', 'ModelesLesPlusLies', 'Modèles_les_plus_utilisés', 'ModèlesLesPlusUtilisés', 'Modeles_les_plus_utilises', 'ModelesLesPlusUtilises' ),
+ 'Mostrevisions' => array( 'Pages_les_plus_modifiées', 'PagesLesPlusModifiées', 'Pages_les_plus_modifiees', 'PagesLesPlusModifiees', 'Les_plus_modifiés', 'LesPlusModifiés', 'Les_plus_modifies', 'LesPlusModifies' ),
+ 'Movepage' => array( 'Renommer_une_page', 'Renommer', 'Renommage' ),
+ 'Mycontributions' => array( 'Mes_contributions', 'Mescontributions' ),
+ 'Mypage' => array( 'Ma_page', 'Mapage' ),
+ 'Mytalk' => array( 'Mes_discussions', 'Mesdiscussions' ),
+ 'Newimages' => array( 'Nouveaux_fichiers', 'NouveauxFichiers', 'Nouvelles_images', 'NouvellesImages' ),
+ 'Newpages' => array( 'Nouvelles_pages', 'NouvellesPages', 'Pages_récentes', 'PagesRécentes', 'Pages_recentes', 'PagesRecentes' ),
+ 'PasswordReset' => array( 'Réinitialisation_du_mot_de_passe', 'RéinitialisationDuMotDePasse' ),
+ 'PermanentLink' => array( 'LienPermanent', 'Lien_permanent' ),
+ 'Popularpages' => array( 'Pages_les_plus_visitées', 'Pages_les_plus_visitees', 'Pageslesplusvisitées', 'Pageslesplusvisitees' ),
+ 'Preferences' => array( 'Préférences' ),
+ 'Prefixindex' => array( 'Index', 'Préfixes', 'Prefixes' ),
+ 'Protectedpages' => array( 'Pages_protégées', 'PagesProtégées', 'Pages_protegees', 'PagesProtegees' ),
+ 'Protectedtitles' => array( 'Titres_protégés', 'TitresProtégés', 'Titres_proteges', 'TitresProteges' ),
+ 'Randompage' => array( 'Page_au_hasard', 'PageAuHasard', 'Au_hasard', 'AuHasard', 'Aléatoire', 'Aleatoire' ),
+ 'Randomredirect' => array( 'Redirection_au_hasard', 'Redirect_au_hasard', 'Redirectionauhasard', 'Redirectauhasard', 'Redirection_aléatoire', 'Redirect_aléatoire', 'Redirectionaléatoire', 'Redirectaléatoire', 'Redirection_aleatoire', 'Redirect_aleatoire', 'Redirectionaleatoire', 'Redirectaleatoire' ),
+ 'Recentchanges' => array( 'Modifications_récentes', 'Modifications_recentes', 'ModificationsRécentes', 'ModificationsRecentes' ),
+ 'Recentchangeslinked' => array( 'Suivi_des_liens', 'SuiviDesLiens' ),
+ 'Revisiondelete' => array( 'Versions_supprimées', 'Versions_supprimees', 'Versionsupprimées', 'Versionsupprimees' ),
+ 'Search' => array( 'Recherche', 'Rechercher', 'Chercher' ),
+ 'Shortpages' => array( 'Pages_courtes', 'PagesCourtes' ),
+ 'Specialpages' => array( 'Pages_spéciales', 'PagesSpéciales', 'Pages_speciales', 'PagesSpeciales' ),
+ 'Statistics' => array( 'Statistiques', 'Stats' ),
+ 'Tags' => array( 'Balises' ),
+ 'Unblock' => array( 'Débloquer', 'Déblocage' ),
+ 'Uncategorizedcategories' => array( 'Catégories_non_catégorisées', 'CatégoriesNonCatégorisées', 'Categories_non_categorisees', 'CategoriesNonCategorisees', 'Catégories_sans_catégorie', 'CatégoriesSansCatégorie', 'Categories_sans_categorie', 'CategoriesSansCategorie' ),
+ 'Uncategorizedimages' => array( 'Fichiers_non_catégorisés', 'FichiersNonCatégorisés', 'Fichiers_non_categorises', 'FichiersNonCategorises', 'Fichiers_sans_catégorie', 'FichiersSansCatégorie', 'Fichiers_sans_categorie', 'FichiersSansCategorie', 'Images_non_catégorisées', 'ImagesNonCatégorisées', 'Images_non_categorisees', 'ImagesNonCategorisees', 'Images_sans_catégorie', 'ImagesSansCatégorie', 'Images_sans_categorie', 'ImagesSansCategorie' ),
+ 'Uncategorizedpages' => array( 'Pages_non_catégorisées', 'PagesNonCatégorisées', 'Pages_non_categorisees', 'PagesNonCategorisees', 'Pages_sans_catégorie', 'PagesSansCatégorie', 'Pages_sans_categorie', 'PagesSansCategorie' ),
+ 'Uncategorizedtemplates' => array( 'Modèles_non_catégorisés', 'ModèlesNonCatégorisés', 'Modeles_non_categorises', 'ModelesNonCategorises', 'Modèles_sans_catégorie', 'ModèlesSansCatégorie', 'Modeles_sans_catégorie', 'ModelesSansCatégorie' ),
+ 'Undelete' => array( 'Restaurer', 'Restauration' ),
+ 'Unlockdb' => array( 'Déverrouiller_la_base', 'Déverrouillerlabase', 'Deverrouiller_la_base', 'Deverrouillerlabase', 'Déverrouiller_base', 'Déverrouillerbase', 'Deverrouiller_base', 'Deverrouillerbase', 'Déverrouiller_BD', 'DéverrouillerBD', 'Deverrouiller_BD', 'DeverrouillerBD', 'Déverrouiller_bd', 'Déverrouillerbd', 'Deverrouiller_bd', 'Deverrouillerbd' ),
+ 'Unusedcategories' => array( 'Catégories_inutilisées', 'CatégoriesInutilisées', 'Categories_inutilisees', 'CategoriesInutilisees', 'Catégories_non_utilisées', 'CatégoriesNonUtilisées', 'Categories_non_utilisees', 'CategoriesNonUtilisees' ),
+ 'Unusedimages' => array( 'Fichiers_inutilisés', 'FichiersInutilisés', 'Fichiers_inutilises', 'FichiersInutilises', 'Fichiers_non_utilisés', 'FichiersNon_utilisés', 'Fichiers_non_utilises', 'FichiersNon_utilises', 'Images_inutilisées', 'ImagesInutilisées', 'Images_inutilisees', 'ImagesInutilisees', 'Images_non_utilisées', 'ImagesNonUtilisées', 'Images_non_utilisees', 'ImagesNonUtilisees' ),
+ 'Unusedtemplates' => array( 'Modèles_inutilisés', 'Modèlesinutilisés', 'Modeles_inutilises', 'Modelesinutilises', 'Modèles_non_utilisés', 'Modèlesnonutilisés', 'Modeles_non_utilises', 'Modelesnonutilises' ),
+ 'Unwatchedpages' => array( 'Pages_non_suivies', 'Pagesnonsuivies' ),
+ 'Upload' => array( 'Téléverser', 'Televerser', 'Téléversement', 'Televersement', 'Téléchargement', 'Telechargement' ),
+ 'Userlogin' => array( 'Connexion', 'Identification' ),
+ 'Userlogout' => array( 'Déconnexion', 'Deconnexion' ),
+ 'Userrights' => array( 'Permissions', 'Droits', 'Droits_des_utilisateurs' ),
+ 'Wantedcategories' => array( 'Catégories_demandées', 'CatégoriesDemandées', 'Categories_demandees', 'CategoriesDemandees' ),
+ 'Wantedfiles' => array( 'Fichiers_demandés', 'FichiersDemandés', 'Fichiers_demandes', 'FichiersDemandes' ),
+ 'Wantedpages' => array( 'Pages_demandées', 'PagesDemandées', 'Pages_demandees', 'PagesDemandees', 'Liens_brisés', 'LiensBrisés', 'Liens_brises', 'LiensBrises' ),
+ 'Wantedtemplates' => array( 'Modèles_demandés', 'ModèlesDemandés', 'Modeles_demandes', 'ModelesDemandes' ),
+ 'Watchlist' => array( 'Liste_de_suivi', 'ListeDeSuivi', 'Suivi' ),
+ 'Whatlinkshere' => array( 'Pages_liées', 'PagesLiées', 'Pages_liees', 'PagesLiees' ),
+ 'Withoutinterwiki' => array( 'Sans_interwiki', 'Sansinterwiki', 'Sans_interwikis', 'Sansinterwikis' ),
);
$magicWords = array(
@@ -152,7 +225,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
'toc' => array( '0', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
'noeditsection' => array( '0', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__AUCUNENTETE__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
@@ -186,6 +258,7 @@ $magicWords = array(
'pagenamee' => array( '1', 'NOMPAGEX', 'PAGENAMEE' ),
'namespace' => array( '1', 'ESPACENOMMAGE', 'NAMESPACE' ),
'namespacee' => array( '1', 'ESPACENOMMAGEX', 'NAMESPACEE' ),
+ 'namespacenumber' => array( '1', 'NOMBREESPACENOMMAGE', 'NAMESPACENUMBER' ),
'talkspace' => array( '1', 'ESPACEDISCUSSION', 'TALKSPACE' ),
'talkspacee' => array( '1', 'ESPACEDISCUSSIONX', 'TALKSPACEE' ),
'subjectspace' => array( '1', 'ESPACESUJET', 'ESPACEARTICLE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -283,99 +356,31 @@ $magicWords = array(
'protectionlevel' => array( '1', 'NIVEAUDEPROTECTION', 'PROTECTIONLEVEL' ),
'url_path' => array( '0', 'CHEMIN', 'PATH' ),
'url_query' => array( '0', 'QUESTION', 'QUERY' ),
+ 'pagesincategory_all' => array( '0', 'tous', 'all' ),
+ 'pagesincategory_files' => array( '0', 'fichier', 'files' ),
);
-$specialPageAliases = array(
- 'Activeusers' => array( 'Utilisateurs_actifs', 'UtilisateursActifs' ),
- 'Allmessages' => array( 'Messages_système', 'Messages_systeme', 'Messagessystème', 'Messagessysteme' ),
- 'Allpages' => array( 'Toutes_les_pages', 'ToutesLesPages' ),
- 'Ancientpages' => array( 'Pages_anciennes', 'PagesAnciennes', 'Anciennes_pages', 'AnciennesPages' ),
- 'Badtitle' => array( 'MauvaisTitre', 'Mauvais_titre' ),
- 'Blankpage' => array( 'Page_blanche', 'PageBlanche' ),
- 'Block' => array( 'Bloquer', 'Blocage' ),
- 'Blockme' => array( 'Bloquez-moi', 'Bloquezmoi' ),
- 'Booksources' => array( 'Ouvrages_de_référence', 'Ouvrages_de_reference', 'Ouvragesderéférence', 'Ouvragesdereference', 'Recherche_ISBN', 'Recherche_isbn', 'RechercheISBN', 'Rechercheisbn' ),
- 'BrokenRedirects' => array( 'Redirections_cassées', 'RedirectionCassées', 'Redirections_cassees', 'RedirectionsCassees' ),
- 'Categories' => array( 'Catégories' ),
- 'ChangePassword' => array( 'Changement_du_mot_de_passe', 'ChangementDuMotDePasse' ),
- 'Confirmemail' => array( 'Confirmer_l\'adresse_de_contact', 'Confirmer_le_courriel', 'ConfirmerLeCourriel' ),
- 'CreateAccount' => array( 'Créer_un_compte', 'CréerUnCompte', 'CréerCompte' ),
- 'Deadendpages' => array( 'Pages_en_impasse', 'PagesEnImpasse' ),
- 'DeletedContributions' => array( 'Contributions_supprimées', 'ContributionsSupprimées', 'ContributionSupprimees' ),
- 'Disambiguations' => array( 'Homonymies', 'Homonymie', 'Pages_d\'homonymie' ),
- 'DoubleRedirects' => array( 'Doubles_redirections', 'DoublesRedirections', 'Redirections_doubles', 'RedirectionsDoubles' ),
- 'Emailuser' => array( 'Envoyer_un_courriel', 'EnvoyerUnCourriel', 'Courriel', 'Envoyer_un_e-mail', 'EnvoyerUnEMail', 'E-mail', 'EMail' ),
- 'Export' => array( 'Exporter', 'Exportation' ),
- 'Fewestrevisions' => array( 'Pages_les_moins_modifiées', 'PagesLesMoinsModifiées', 'Pages_les_moins_modifiees', 'PagesLesMoinsModifiees', 'Les_moins_modifiés', 'LesMoinsModifiés', 'Les_moins_modifies', 'LesMoinsModifies' ),
- 'FileDuplicateSearch' => array( 'Recherche_fichier_en_double', 'RechercheFichierEnDouble' ),
- 'Filepath' => array( 'Chemin_du_fichier', 'CheminDuFichier', 'CheminFichier' ),
- 'Import' => array( 'Importer', 'Importation' ),
- 'Invalidateemail' => array( 'Invalider_le_courriel', 'Invalider_courriel', 'InvaliderCourriel' ),
- 'BlockList' => array( 'Liste_des_blocages', 'ListeDesBlocages', 'Blocages', 'Utilisateurs_bloqués', 'UtilisateursBloqués', 'Utilisateurs_bloques', 'UtilisateursBloques', 'IP_bloquées', 'IPBloquees', 'IPBloquées' ),
- 'LinkSearch' => array( 'Recherche_de_lien', 'Recherche_de_liens' ),
- 'Listadmins' => array( 'Liste_des_administrateurs', 'Listedesadministrateurs', 'Liste_des_admins', 'Listedesadmins', 'Liste_admins', 'Listeadmins' ),
- 'Listbots' => array( 'Liste_des_bots', 'ListedesBots' ),
- 'Listfiles' => array( 'Liste_des_fichiers', 'ListeDesFichiers', 'Liste_des_images', 'ListeDesImages' ),
- 'Listgrouprights' => array( 'Liste_des_droits_de_groupe', 'ListeDesDroitsDeGroupes' ),
- 'Listredirects' => array( 'Liste_des_redirections', 'Listedesredirections', 'Liste_des_redirects', 'Listedesredirects', 'Liste_redirections', 'Listeredirections', 'Liste_redirects', 'Listeredirects' ),
- 'Listusers' => array( 'Liste_des_utilisateurs', 'ListeDesUtilisateurs', 'Utilisateurs' ),
- 'Lockdb' => array( 'Verrouiller_la_base', 'Verrouillerlabase', 'Verrouiller_base', 'Verrouillerbase', 'Verrouiller_BD', 'VerrouillerBD', 'Verrouiller_bd', 'Verrouillerbd' ),
- 'Log' => array( 'Journal', 'Journaux' ),
- 'Lonelypages' => array( 'Pages_orphelines', 'PagesOrphelines' ),
- 'Longpages' => array( 'Pages_longues', 'PagesLongues' ),
- 'MergeHistory' => array( 'Fusionner_les_historiques', 'FusionnerHistoriques', 'Fusionner_l\'historique', 'Fusionnerlhistorique' ),
- 'MIMEsearch' => array( 'Recherche_MIME', 'RechercheMIME', 'Recherche_mime', 'Recherchemime' ),
- 'Mostcategories' => array( 'Pages_les_plus_catégorisées', 'PagesLesPlusCatégorisées', 'Pages_les_plus_categorisees', 'PagesLesPlusCategorisees', 'Les_plus_catégorisés', 'LesPlusCatégorisés', 'Les_plus_categorises', 'LesPlusCategorises' ),
- 'Mostimages' => array( 'Fichiers_les_plus_liés', 'FichiersLesPlusLiés', 'Fichiers_les_plus_lies', 'FichiersLesPlusLies', 'Fichiers_les_plus_utilisés', 'FichiersLesPlusUtilisés', 'Fichiers_les_plus_utilises', 'FichiersLesPlusUtilises', 'Images_les_plus_liées', 'ImagesLesPlusLiées', 'Images_les_plus_liees', 'ImagesLesPlusLiees', 'Images_les_plus_utilisées', 'ImagesLesPlusUtilisées', 'Images_les_plus_utilisees', 'ImagesLesPlusUtilisees' ),
- 'Mostlinked' => array( 'Pages_les_plus_liées', 'PagesLesPlusLiées', 'Pages_les_plus_liees', 'PagesLesPlusLiees', 'Les_plus_liées', 'LesPlusLiées', 'Les_plus_liees', 'LesPlusLiees' ),
- 'Mostlinkedcategories' => array( 'Catégories_les_plus_liées', 'CatégoriesLesPlusLiées', 'Categories_les_plus_liees', 'CategoriesLesPlusLiees', 'Catégories_les_plus_utilisées', 'CatégoriesLesPlusUtilisées', 'Categories_les_plus_utilisees', 'CategoriesLesPlusUtilisees' ),
- 'Mostlinkedtemplates' => array( 'Modèles_les_plus_liés', 'ModèlesLesPlusLiés', 'Modeles_les_plus_lies', 'ModelesLesPlusLies', 'Modèles_les_plus_utilisés', 'ModèlesLesPlusUtilisés', 'Modeles_les_plus_utilises', 'ModelesLesPlusUtilises' ),
- 'Mostrevisions' => array( 'Pages_les_plus_modifiées', 'PagesLesPlusModifiées', 'Pages_les_plus_modifiees', 'PagesLesPlusModifiees', 'Les_plus_modifiés', 'LesPlusModifiés', 'Les_plus_modifies', 'LesPlusModifies' ),
- 'Movepage' => array( 'Renommer_une_page', 'Renommer', 'Renommage' ),
- 'Mycontributions' => array( 'Mes_contributions', 'Mescontributions' ),
- 'Mypage' => array( 'Ma_page', 'Mapage' ),
- 'Mytalk' => array( 'Mes_discussions', 'Mesdiscussions' ),
- 'Newimages' => array( 'Nouveaux_fichiers', 'NouveauxFichiers', 'Nouvelles_images', 'NouvellesImages' ),
- 'Newpages' => array( 'Nouvelles_pages', 'NouvellesPages', 'Pages_récentes', 'PagesRécentes', 'Pages_recentes', 'PagesRecentes' ),
- 'PasswordReset' => array( 'Réinitialisation_du_mot_de_passe', 'RéinitialisationDuMotDePasse' ),
- 'PermanentLink' => array( 'LienPermanent', 'Lien_permanent' ),
- 'Popularpages' => array( 'Pages_les_plus_visitées', 'Pages_les_plus_visitees', 'Pageslesplusvisitées', 'Pageslesplusvisitees' ),
- 'Preferences' => array( 'Préférences' ),
- 'Prefixindex' => array( 'Index', 'Préfixes', 'Prefixes' ),
- 'Protectedpages' => array( 'Pages_protégées', 'PagesProtégées', 'Pages_protegees', 'PagesProtegees' ),
- 'Protectedtitles' => array( 'Titres_protégés', 'TitresProtégés', 'Titres_proteges', 'TitresProteges' ),
- 'Randompage' => array( 'Page_au_hasard', 'PageAuHasard', 'Au_hasard', 'AuHasard', 'Aléatoire', 'Aleatoire' ),
- 'Randomredirect' => array( 'Redirection_au_hasard', 'Redirect_au_hasard', 'Redirectionauhasard', 'Redirectauhasard', 'Redirection_aléatoire', 'Redirect_aléatoire', 'Redirectionaléatoire', 'Redirectaléatoire', 'Redirection_aleatoire', 'Redirect_aleatoire', 'Redirectionaleatoire', 'Redirectaleatoire' ),
- 'Recentchanges' => array( 'Modifications_récentes', 'Modifications_recentes', 'ModificationsRécentes', 'ModificationsRecentes' ),
- 'Recentchangeslinked' => array( 'Suivi_des_liens', 'SuiviDesLiens' ),
- 'Revisiondelete' => array( 'Versions_supprimées', 'Versions_supprimees', 'Versionsupprimées', 'Versionsupprimees' ),
- 'Search' => array( 'Recherche', 'Rechercher', 'Chercher' ),
- 'Shortpages' => array( 'Pages_courtes', 'PagesCourtes' ),
- 'Specialpages' => array( 'Pages_spéciales', 'PagesSpéciales', 'Pages_speciales', 'PagesSpeciales' ),
- 'Statistics' => array( 'Statistiques', 'Stats' ),
- 'Tags' => array( 'Balises' ),
- 'Unblock' => array( 'Débloquer', 'Déblocage' ),
- 'Uncategorizedcategories' => array( 'Catégories_non_catégorisées', 'CatégoriesNonCatégorisées', 'Categories_non_categorisees', 'CategoriesNonCategorisees', 'Catégories_sans_catégorie', 'CatégoriesSansCatégorie', 'Categories_sans_categorie', 'CategoriesSansCategorie' ),
- 'Uncategorizedimages' => array( 'Fichiers_non_catégorisés', 'FichiersNonCatégorisés', 'Fichiers_non_categorises', 'FichiersNonCategorises', 'Fichiers_sans_catégorie', 'FichiersSansCatégorie', 'Fichiers_sans_categorie', 'FichiersSansCategorie', 'Images_non_catégorisées', 'ImagesNonCatégorisées', 'Images_non_categorisees', 'ImagesNonCategorisees', 'Images_sans_catégorie', 'ImagesSansCatégorie', 'Images_sans_categorie', 'ImagesSansCategorie' ),
- 'Uncategorizedpages' => array( 'Pages_non_catégorisées', 'PagesNonCatégorisées', 'Pages_non_categorisees', 'PagesNonCategorisees', 'Pages_sans_catégorie', 'PagesSansCatégorie', 'Pages_sans_categorie', 'PagesSansCategorie' ),
- 'Uncategorizedtemplates' => array( 'Modèles_non_catégorisés', 'ModèlesNonCatégorisés', 'Modeles_non_categorises', 'ModelesNonCategorises', 'Modèles_sans_catégorie', 'ModèlesSansCatégorie', 'Modeles_sans_catégorie', 'ModelesSansCatégorie' ),
- 'Undelete' => array( 'Restaurer', 'Restauration' ),
- 'Unlockdb' => array( 'Déverrouiller_la_base', 'Déverrouillerlabase', 'Deverrouiller_la_base', 'Deverrouillerlabase', 'Déverrouiller_base', 'Déverrouillerbase', 'Deverrouiller_base', 'Deverrouillerbase', 'Déverrouiller_BD', 'DéverrouillerBD', 'Deverrouiller_BD', 'DeverrouillerBD', 'Déverrouiller_bd', 'Déverrouillerbd', 'Deverrouiller_bd', 'Deverrouillerbd' ),
- 'Unusedcategories' => array( 'Catégories_inutilisées', 'CatégoriesInutilisées', 'Categories_inutilisees', 'CategoriesInutilisees', 'Catégories_non_utilisées', 'CatégoriesNonUtilisées', 'Categories_non_utilisees', 'CategoriesNonUtilisees' ),
- 'Unusedimages' => array( 'Fichiers_inutilisés', 'FichiersInutilisés', 'Fichiers_inutilises', 'FichiersInutilises', 'Fichiers_non_utilisés', 'FichiersNon_utilisés', 'Fichiers_non_utilises', 'FichiersNon_utilises', 'Images_inutilisées', 'ImagesInutilisées', 'Images_inutilisees', 'ImagesInutilisees', 'Images_non_utilisées', 'ImagesNonUtilisées', 'Images_non_utilisees', 'ImagesNonUtilisees' ),
- 'Unusedtemplates' => array( 'Modèles_inutilisés', 'Modèlesinutilisés', 'Modeles_inutilises', 'Modelesinutilises', 'Modèles_non_utilisés', 'Modèlesnonutilisés', 'Modeles_non_utilises', 'Modelesnonutilises' ),
- 'Unwatchedpages' => array( 'Pages_non_suivies', 'Pagesnonsuivies' ),
- 'Upload' => array( 'Téléverser', 'Televerser', 'Téléversement', 'Televersement', 'Téléchargement', 'Telechargement' ),
- 'Userlogin' => array( 'Connexion', 'Identification' ),
- 'Userlogout' => array( 'Déconnexion', 'Deconnexion' ),
- 'Userrights' => array( 'Permissions', 'Droits', 'Droits_des_utilisateurs' ),
- 'Wantedcategories' => array( 'Catégories_demandées', 'CatégoriesDemandées', 'Categories_demandees', 'CategoriesDemandees' ),
- 'Wantedfiles' => array( 'Fichiers_demandés', 'FichiersDemandés', 'Fichiers_demandes', 'FichiersDemandes' ),
- 'Wantedpages' => array( 'Pages_demandées', 'PagesDemandées', 'Pages_demandees', 'PagesDemandees', 'Liens_brisés', 'LiensBrisés', 'Liens_brises', 'LiensBrises' ),
- 'Wantedtemplates' => array( 'Modèles_demandés', 'ModèlesDemandés', 'Modeles_demandes', 'ModelesDemandes' ),
- 'Watchlist' => array( 'Liste_de_suivi', 'ListeDeSuivi', 'Suivi' ),
- 'Whatlinkshere' => array( 'Pages_liées', 'PagesLiées', 'Pages_liees', 'PagesLiees' ),
- 'Withoutinterwiki' => array( 'Sans_interwiki', 'Sansinterwiki', 'Sans_interwikis', 'Sansinterwikis' ),
+$bookstoreList = array(
+ 'Amazon.fr' => 'http://www.amazon.fr/exec/obidos/ISBN=$1',
+ 'alapage.fr' => 'http://www.alapage.com/mx/?tp=F&type=101&l_isbn=$1&donnee_appel=ALASQ&devise=&',
+ 'fnac.com' => 'http://www3.fnac.com/advanced/book.do?isbn=$1',
+ 'chapitre.com' => 'http://www.chapitre.com/frame_rec.asp?isbn=$1',
+);
+
+$linkTrail = '/^([a-zàâçéèêîôûäëïöüùÇÉÂÊÎÔÛÄËÃÖÜÀÈÙ]+)(.*)$/sDu';
+
+$dateFormats = array(
+ 'mdy time' => 'H:i',
+ 'mdy date' => 'F j, Y',
+ 'mdy both' => 'F j, Y à H:i',
+
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j F Y',
+ 'dmy both' => 'j F Y à H:i',
+
+ 'ymd time' => 'H:i',
+ 'ymd date' => 'Y F j',
+ 'ymd both' => 'Y F j à H:i',
);
$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
@@ -515,6 +520,7 @@ $messages = array(
'newwindow' => '(ouvre une nouvelle fenêtre)',
'cancel' => 'Annuler',
'moredotdotdot' => 'Plus...',
+'morenotlisted' => 'Davantage non listé…',
'mypage' => 'Page',
'mytalk' => 'Discussion',
'anontalk' => 'Discussion avec cette adresse IP',
@@ -526,7 +532,6 @@ $messages = array(
'qbbrowse' => 'Parcourir',
'qbedit' => 'Modifier',
'qbpageoptions' => 'Cette page',
-'qbpageinfo' => 'Contexte',
'qbmyoptions' => 'Mes pages',
'qbspecialpages' => 'Pages spéciales',
'faq' => 'FAQ',
@@ -549,6 +554,7 @@ $messages = array(
'namespaces' => 'Espaces de noms',
'variants' => 'Variantes',
+'navigation-heading' => 'Menu de navigation',
'errorpagetitle' => 'Erreur',
'returnto' => 'Revenir à la page $1.',
'tagline' => 'De {{SITENAME}}',
@@ -789,12 +795,11 @@ L’administrateur qui l’a verrouillé a fourni ce motif : « $3 ».',
# Login and logout pages
'logouttext' => "'''Vous êtes à présent déconnecté(e).'''
-Vous pouvez continuer à utiliser {{SITENAME}} de façon anonyme, [[Special:UserLogin|vous reconnecter]] sous le même nom ou un autre.
-Notez que certaines pages peuvent être encore affichées comme si vous étiez toujours connecté(e), jusqu’à ce que vous effaciez le cache de votre navigateur.",
-'welcomecreation' => "== Bienvenue, $1 ! ==
-
-Votre compte a été créé.
-N'oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{SITENAME}}]].",
+Vous pouvez continuer à utiliser {{SITENAME}} de façon anonyme, <span class='plainlinks'>[$1 vous reconnecter]</span> sous le même nom ou un autre.
+Notez que certaines pages peuvent être encore affichées comme si vous étiez toujours connecté(e), jusqu'à ce que vous effaciez le cache de votre navigateur.",
+'welcomeuser' => 'Bienvenue, $1&nbsp;!',
+'welcomecreation-msg' => "Votre compte a été créé.
+N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAME}}]].",
'yourname' => "Nom d'utilisateur :",
'yourpassword' => 'Mot de passe&nbsp;:',
'yourpasswordagain' => 'Confirmez le mot de passe :',
@@ -817,7 +822,7 @@ N'oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{SIT
'gotaccount' => "Vous avez déjà un compte ? '''$1'''.",
'gotaccountlink' => 'Connectez-vous',
'userlogin-resetlink' => 'Vous avez oublié vos détails de connexion ?',
-'createaccountmail' => 'par courriel',
+'createaccountmail' => 'Utiliser un mot de passe aléatoire temporaire et l’envoyer à l’adresse de courriel spécifiée ci-dessous',
'createaccountreason' => 'Motif :',
'badretype' => 'Les mots de passe que vous avez saisis ne correspondent pas.',
'userexists' => "Nom d'utilisateur entré déjà utilisé.
@@ -888,6 +893,7 @@ Veuillez attendre avant d'essayer à nouveau.",
# Email sending
'php-mail-error-unknown' => 'Erreur inconnue dans la fonction mail() de PHP.',
'user-mail-no-addy' => "Tenté d'envoyer un courriel sans adresse de courriel",
+'user-mail-no-body' => "Essai d'envoi d'un courriel avec un corps vide ou déraisonnablement court.",
# Change password dialog
'resetpass' => 'Changer de mot de passe',
@@ -933,7 +939,7 @@ $2
Mot de passe temporaire : $2",
'passwordreset-emailsent' => 'Un courriel de réinitialisation de mot de passe a été envoyé.',
'passwordreset-emailsent-capture' => 'Un courriel de réinitialisation de mot de passe a été envoyé, qui est affiché ci-dessous.',
-'passwordreset-emailerror-capture' => "Un courriel de rappel a été généré, qui est affiché ci-dessous, mais l'envoi à l'utilisateur a échoué : $1",
+'passwordreset-emailerror-capture' => "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'utilisateur a échoué : $1",
# Special:ChangeEmail
'changeemail' => "Changer l'adresse de courriel",
@@ -943,6 +949,7 @@ Mot de passe temporaire : $2",
'changeemail-oldemail' => 'Adresse de courriel actuelle :',
'changeemail-newemail' => 'Nouvelle adresse de courriel :',
'changeemail-none' => '(aucune)',
+'changeemail-password' => 'Votre mot de passe sur {{SITENAME}} :',
'changeemail-submit' => "Changer l'adresse de courriel",
'changeemail-cancel' => 'Annuler',
@@ -1121,7 +1128,6 @@ La dernière entrée du journal est affichée ci-dessous pour référence :",
'template-semiprotected' => '(semi-protégé)',
'hiddencategories' => '{{PLURAL:$1|Catégorie cachée|Catégories cachées}} dont cette page fait partie :',
'edittools' => '<!-- Tout texte entré ici sera affiché sous les boîtes de modification ou les formulaires de téléversement de fichier. -->',
-'nocreatetitle' => 'Création de page limitée',
'nocreatetext' => '{{SITENAME}} a restreint la possibilité de créer de nouvelles pages.
Vous pouvez revenir en arrière et modifier une page existante, ou bien [[Special:UserLogin|vous connecter ou créer un compte]].',
'nocreate-loggedin' => "Vous n'avez pas la permission de créer de nouvelles pages.",
@@ -1144,6 +1150,15 @@ Il semble qu'elle ait été supprimée.",
'edit-already-exists' => "La nouvelle page n'a pas pu être créée.
Elle existe déjà.",
'defaultmessagetext' => 'Message par défaut',
+'content-failed-to-parse' => "Échec de l'analyse du contenu de $2 pour le modèle $1: $3",
+'invalid-content-data' => 'Données du contenu non valides',
+'content-not-allowed-here' => 'Le contenu "$1" n\'est pas autorisé sur la page [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitexte',
+'content-model-text' => 'texte brut',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "Attention : cette page contient de trop nombreux appels à des fonctions coûteuses de l'analyseur syntaxique.
@@ -1502,9 +1517,9 @@ Voici une valeur générée aléatoirement que vous pouvez utiliser : $1',
'prefs-emailconfirm-label' => 'Confirmation du courriel :',
'prefs-textboxsize' => 'Taille de la fenêtre de modification',
'youremail' => 'Courriel :',
-'username' => "Nom d'utilisateur :",
-'uid' => "Numéro d'utilisateur :",
-'prefs-memberingroups' => 'Membre {{PLURAL:$1|du groupe|des groupes}} :',
+'username' => "{{GENDER:$1|Nom d'utilisateur|Nom d'utilisatrice}} :",
+'uid' => "Numéro d'{{GENDER:$1|utilisateur|utilisatrice}}:",
+'prefs-memberingroups' => '{{GENDER:$2|Membre}} {{PLURAL:$1|du groupe|des groupes}}:',
'prefs-registration' => "Date d'inscription :",
'yourrealname' => 'Nom réel :',
'yourlanguage' => 'Langue :',
@@ -1653,12 +1668,13 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
'right-sendemail' => 'Envoyer un courriel aux autres utilisateurs',
'right-passwordreset' => 'Voir les courriels de réinitialisation des mots de passe',
+# Special:Log/newusers
+'newuserlogpage' => 'Journal des créations de comptes utilisateur',
+'newuserlogpagetext' => "Cette page affiche l'historique des créations de comptes utilisateur.",
+
# User rights log
'rightslog' => "Journal des modifications de droits d'utilisateurs",
'rightslogtext' => "Voici l'historique des modifications des droits des utilisateurs.",
-'rightslogentry' => "a modifié les droits de l'utilisateur « $1 » de $2 à $3",
-'rightslogentry-autopromote' => 'a été automatiquement promu de $2 à $3',
-'rightsnone' => '(aucun)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lire cette page',
@@ -1900,6 +1916,7 @@ Si le problème persiste, contactez un [[Special:ListUsers/sysop|administrateur]
'backend-fail-notsame' => 'Un fichier différent existe déjà pour $1 .',
'backend-fail-invalidpath' => "$1 n'est pas un chemin de stockage valide.",
'backend-fail-delete' => 'Impossible de supprimer le fichier $1.',
+'backend-fail-describe' => 'Impossible de modifier les métadonnées du fichier "$1".',
'backend-fail-alreadyexists' => 'Le fichier $1 existe déjà.',
'backend-fail-store' => 'Impossible de stocker le fichier $1 en $2.',
'backend-fail-copy' => 'Impossible de copier le fichier $1 en $2.',
@@ -2136,6 +2153,12 @@ N'oubliez pas de vérifier s'il n'y a pas d'autres liens vers les modèles avant
Elles devraient plutôt pointer vers le bon article.<br />
Une page est considérée comme une page d'homonymie si elle utilise un modèle lié à [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'Pages avec une propriété de page',
+'pageswithprop-legend' => 'Pages avec une propriété de page',
+'pageswithprop-text' => 'Cette page liste les pages qui utilisent une propriété de page particulière.',
+'pageswithprop-prop' => 'Nom de la propriété:',
+'pageswithprop-submit' => 'Aller',
+
'doubleredirects' => 'Doubles redirections',
'doubleredirectstext' => 'Voici une liste des pages qui redirigent vers des pages qui sont elles-mêmes des pages de redirection.
Chaque entrée contient des liens vers la première et la seconde redirections, ainsi que la première ligne de texte de la seconde page, ce qui fournit habituellement la « vraie » page cible, vers laquelle la première redirection devrait rediriger.
@@ -2289,7 +2312,7 @@ Voyez aussi [[Special:WantedCategories|les catégories demandées]].',
'linksearch-ok' => 'Rechercher',
'linksearch-text' => "Des caractères jokers comme « *.wikipedia.org » peuvent être utilisés.
Ils nécessitent au moins un domaine de niveau supérieur, par exemple « *.org ».<br />
-Protocoles reconnus : <code>$1</code> (http:// par défaut si aucun protocole n'est indiqué).",
+{{PLURAL:$2|Protocole reconnu|Protocoles reconnus}}: <code>$1</code> (http:// par défaut si aucun protocole n'est indiqué).",
'linksearch-line' => '$1 est lié depuis $2',
'linksearch-error' => "Les caractères jokers ne peuvent être utilisés qu'au début du nom de domaine de l'hôte.",
@@ -2308,10 +2331,6 @@ Protocoles reconnus : <code>$1</code> (http:// par défaut si aucun protocole n'
'activeusers-hidesysops' => 'Masquer les administrateurs',
'activeusers-noresult' => 'Aucun utilisateur trouvé.',
-# Special:Log/newusers
-'newuserlogpage' => 'Journal des créations de comptes utilisateur',
-'newuserlogpagetext' => "Cette page affiche l'historique des créations de comptes utilisateur.",
-
# Special:ListGroupRights
'listgrouprights' => "Droits des groupes d'utilisateurs",
'listgrouprights-summary' => "Cette page contient une liste des groupes définis sur ce wiki ainsi que les droits d'accès qui leur sont associés.
@@ -2406,19 +2425,23 @@ Les prochaines modifications de cette page et de la page de discussion associée
'enotif_mailer' => 'Système de notification par courriel de {{SITENAME}}',
'enotif_reset' => 'Marquer toutes les pages comme visitées',
-'enotif_newpagetext' => 'Ceci est une nouvelle page.',
'enotif_impersonal_salutation' => 'Utilisateur de {{SITENAME}}',
-'changed' => 'modifiée',
-'created' => 'créée',
-'enotif_subject' => 'La page $PAGETITLE de {{SITENAME}} a été $CHANGEDORCREATED par $PAGEEDITOR',
+'enotif_subject_deleted' => 'La page $1 sur {{SITENAME}} a été supprimée par {{GENDER:$2|$2}}',
+'enotif_subject_created' => 'La page $1 sur {{SITENAME}} a été créée par {{GENDER:$2|$2}}',
+'enotif_subject_moved' => 'La page $1 sur {{SITENAME}} a été renommée par {{GENDER:$2|$2}}',
+'enotif_subject_restored' => 'La page $1 sur {{SITENAME}} a été restaurée par {{GENDER:$2|$2}}',
+'enotif_subject_changed' => 'La page $1 sur {{SITENAME}} a été modifiée par {{GENDER:$2|$2}}',
+'enotif_body_intro_deleted' => 'La page $1 sur {{SITENAME}} a été effacée le $PAGEEDITDATE par {{gender:$2|$2}}, voir $3 pour la révision actuelle.',
+'enotif_body_intro_created' => 'La page $1 sur {{SITENAME}} a été créée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.',
+'enotif_body_intro_moved' => 'La page $1 sur {{SITENAME}} a été renommée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.',
+'enotif_body_intro_restored' => 'La page $1 sur {{SITENAME}} a été restaurée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.',
+'enotif_body_intro_changed' => 'La page $1 sur {{SITENAME}} a été modifiée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.',
'enotif_lastvisited' => 'Voyez $1 pour tous les changements depuis votre dernière visite.',
'enotif_lastdiff' => 'Voyez $1 pour visualiser ces changements.',
'enotif_anon_editor' => 'utilisateur non-enregistré $1',
'enotif_body' => 'Cher $WATCHINGUSERNAME,
-La page « $PAGETITLE » de {{SITENAME}} a été $CHANGEDORCREATED le $PAGEEDITDATE par « $PAGEEDITOR », visitez $PAGETITLE_URL pour visualiser la version actuelle.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Résumé du contributeur : $PAGESUMMARY $PAGEMINOREDIT
@@ -2426,8 +2449,7 @@ Contactez ce contributeur :
courriel : $PAGEEDITOR_EMAIL
wiki : $PAGEEDITOR_WIKI
-Il n’y aura pas d’autres notifications en cas de changements ultérieurs, à moins que vous ne visitiez cette page.
-Vous pouvez aussi réinitialiser les drapeaux de notification pour toutes les pages de votre liste de suivi.
+Il n\'y aura pas d\'autres notifications en cas de changements ultérieurs, à moins que vous ne visitiez cette page. Vous pouvez aussi réinitialiser les drapeaux de notification pour toutes les pages de votre liste de suivi.
Votre système de notification de {{SITENAME}}
@@ -2443,6 +2465,8 @@ $UNWATCHURL
Retour et assistance :
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'créée',
+'changed' => 'modifiée',
# Delete
'deletepage' => 'Supprimer la page',
@@ -2515,6 +2539,8 @@ Consultez la [[Special:ProtectedPages|liste des pages protégées]] pour la list
'prot_1movedto2' => '[[$1]] renommé en [[$2]]',
'protect-badnamespace-title' => 'Espace de noms non protégeable',
'protect-badnamespace-text' => 'Les pages dans cet espace de noms ne peuvent pas être protégées.',
+'protect-norestrictiontypes-text' => "Cette page ne peut pas être protégée car il n'y a pas de type de restriction disponible.",
+'protect-norestrictiontypes-title' => 'Page non protégeable',
'protect-legend' => 'Confirmer la protection',
'protectcomment' => 'Motif :',
'protectexpiry' => "Date d'expiration :",
@@ -2599,8 +2625,8 @@ Vous avez peut-être un mauvais lien, ou la version a pu être restaurée ou sup
'undeletedrevisions' => '$1 {{PLURAL:$1|version restaurée|versions restaurées}}',
'undeletedrevisions-files' => '$1 version{{PLURAL:$1||s}} et $2 fichier{{PLURAL:$2||s}} restauré{{PLURAL:$2||s}}',
'undeletedfiles' => '$1 {{PLURAL:$1|fichier restauré|fichiers restaurés}}',
-'cannotundelete' => 'La restauration a échoué ;
-un autre utilisateur a probablement déjà restauré la page.',
+'cannotundelete' => 'Échec de la restauration:
+$1',
'undeletedpage' => "'''La page $1 a été restaurée.'''
Consultez le [[Special:Log/delete|journal des suppressions]] pour obtenir la liste des récentes suppressions et restaurations.",
@@ -2632,7 +2658,7 @@ $1',
'blanknamespace' => '(Principal)',
# Contributions
-'contributions' => "Contributions de l'utilisateur",
+'contributions' => "Contributions de l'{{GENDER:$1|utilisateur|utilisatrice}}",
'contributions-title' => "Liste des contributions de l'utilisateur $1",
'mycontris' => 'Contributions',
'contribsub2' => 'Pour $1 ($2)',
@@ -2899,6 +2925,7 @@ impossible de renommer une page sur elle-même.",
'immobile-target-namespace-iw' => 'Les destinations interwikis ne sont pas une cible valide pour les déplacements.',
'immobile-source-page' => "Cette page n'est pas renommable.",
'immobile-target-page' => "Il n'est pas possible de renommer la page vers ce titre.",
+'bad-target-model' => 'La destination souhaitée utilise un autre modèle de contenu. Impossible de convertir de $1 vers $2.',
'imagenocrossnamespace' => 'Impossible de renommer un fichier vers un espace de noms autre que fichier.',
'nonfile-cannot-move-to-file' => "Impossible de renommer quelque chose d'autre qu'un fichier vers l'espace de noms fichier.",
'imagetypemismatch' => 'La nouvelle extension de ce fichier ne correspond pas à son type.',
@@ -3012,6 +3039,7 @@ Un dossier temporaire est manquant.",
'import-error-interwiki' => "La page « $1 » n'est pas importée parce que son nom est réservé pour un lien externe (interwiki).",
'import-error-special' => 'La page « $1 » n’est pas importée parce qu’elle appartient à un espace de noms spécial qui n’en autorise aucune.',
'import-error-invalid' => "Page « $1 » n'est pas importée parce que son nom n'est pas valide.",
+'import-error-unserialize' => 'La révision $2 de la page « $1 » ne peut pas être désérialisée. La révision est indiquée comme utilisant le modèle de contenu $3 sérialisé en $4.',
'import-options-wrong' => '{{PLURAL:$2|Mauvaise option|Mauvaises options}} : <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'La page racine fournie est un titre non valide.',
'import-rootpage-nosubpage' => 'L’espace de noms « $1 » de la page racine n’autorise pas les sous-pages.',
@@ -3026,7 +3054,6 @@ Un dossier temporaire est manquant.",
# JavaScriptTest
'javascripttest' => 'Test de JavaScript',
-'javascripttest-disabled' => "Cette fonction n'a pas été activée sur ce wiki.",
'javascripttest-title' => 'Exécution des tests $1',
'javascripttest-pagetext-noframework' => "Cette page est réservée pour l'exécution des tests JavaScript.",
'javascripttest-pagetext-unknownframework' => 'Structure « $1 » inconnue.',
@@ -3177,11 +3204,13 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
'pageinfo-default-sort' => 'Clé de tri par défaut',
'pageinfo-length' => 'Taille de la page (en octets)',
'pageinfo-article-id' => 'Numéro de la page',
+'pageinfo-language' => 'Langue du contenu de la page',
'pageinfo-robot-policy' => 'Statut de moteur de recherche',
'pageinfo-robot-index' => 'Indexable',
'pageinfo-robot-noindex' => 'Non indexable',
'pageinfo-views' => 'Nombre de vues',
'pageinfo-watchers' => 'Nombre de contributeurs ayant la page dans leur liste de suivi',
+'pageinfo-few-watchers' => 'Moins de $1 {{PLURAL:$1|observateur|observateurs}}',
'pageinfo-redirects-name' => 'Redirections vers cette page',
'pageinfo-subpages-name' => 'Sous-pages de cette page',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirection|redirections}}; $3 {{PLURAL:$3|non-redirection|non-redirections}})',
@@ -3196,6 +3225,19 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
'pageinfo-magic-words' => '{{PLURAL:$1|Mot magique|Mots magiques}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Catégorie cachée|Catégories cachées}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Modèle inclu|Modèles inclus}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Page traduite|Pages traduites}} sur ($1)',
+'pageinfo-toolboxlink' => 'Information sur la page',
+'pageinfo-redirectsto' => 'Rediriger vers',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Compté comme page de contenu',
+'pageinfo-contentpage-yes' => 'Oui',
+'pageinfo-protect-cascading' => "Les protections sont déduites d'ici",
+'pageinfo-protect-cascading-yes' => 'Oui',
+'pageinfo-protect-cascading-from' => 'Les protections sont déduites depuis',
+'pageinfo-category-info' => 'Informations sur la catégorie',
+'pageinfo-category-pages' => 'Nombre de pages',
+'pageinfo-category-subcats' => 'Nombre de sous-catégories',
+'pageinfo-category-files' => 'Nombre de fichiers',
# Skin names
'skinname-standard' => 'Standard',
@@ -3218,6 +3260,8 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
'markedaspatrollederror' => 'Ne peut être marquée comme relue',
'markedaspatrollederrortext' => 'Vous devez sélectionner une version pour pouvoir la marquer comme relue.',
'markedaspatrollederror-noautopatrol' => "Vous n'avez pas le droit de marquer vos propres modifications comme relues.",
+'markedaspatrollednotify' => 'Cette modification de $1 a été marquée comme relue.',
+'markedaspatrollederrornotify' => 'Échec du marquage comme contrôlé.',
# Patrol log
'patrol-log-page' => 'Journal des relectures',
@@ -3251,6 +3295,7 @@ Si vous l'exécutez, votre système peut être compromis.",
'file-nohires' => 'Pas de plus haute résolution disponible.',
'svg-long-desc' => 'Fichier SVG, résolution de $1 × $2 pixels, taille : $3',
'svg-long-desc-animated' => 'Fichier SVG animé, taille $1 x $2 pixels, taille du fichier: $3',
+'svg-long-error' => 'Fichier SVG non valide: $1',
'show-big-image' => 'Image en plus haute résolution',
'show-big-image-preview' => 'Taille de cet aperçu : $1.',
'show-big-image-other' => '{{PLURAL:$2|Autre résolution|Autres résolutions}} : $1.',
@@ -3281,7 +3326,10 @@ Si vous l'exécutez, votre système peut être compromis.",
'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
'hours' => '{{PLURAL:$1|$1 heure|$1 heures}}',
'days' => '{{PLURAL:$1|$1 jour|$1 jours}}',
+'months' => '{{PLURAL:$1|$1 mois}}',
+'years' => '{{PLURAL:$1|$1 an|$1 ans}}',
'ago' => 'Il y a $1',
+'just-now' => "à l'instant",
# Bad image list
'bad_image_list' => "Le format est le suivant :
@@ -3787,6 +3835,7 @@ $5",
# Scary transclusion
'scarytranscludedisabled' => '[La transclusion interwiki est désactivée]',
'scarytranscludefailed' => '[La récupération de modèle a échoué pour $1]',
+'scarytranscludefailed-httpstatus' => '[Échec de la récupération du modèle pour $1 : HTTP $2 ]',
'scarytranscludetoolong' => "[L'URL est trop longue]",
# Delete conflict
@@ -3968,6 +4017,7 @@ Vous pouvez aussi [[Special:EditWatchlist|utiliser l'éditeur normal]].",
'version-license' => 'Licence',
'version-poweredby-credits' => "Ce wiki fonctionne grâce à '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'autres',
+'version-credits-summary' => 'Nous tenons à remercier les personnes suivantes pour leur contribution à [[Special:Version|MediaWiki]].',
'version-license-info' => "MediaWiki est un logiciel libre, vous pouvez le redistribuer ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation ; soit la version 2 de la Licence, ou (à votre choix) toute version ultérieure.
MediaWiki est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE, sans même la garantie implicite de COMMERCIALISATION ou D'ADAPTATION À UN USAGE PARTICULIER. Voir la Licence Publique Générale GNU pour plus de détails.
@@ -4084,17 +4134,17 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
'sqlite-no-fts' => '$1 sans recherche en texte intégral supportée',
# New logging system
-'logentry-delete-delete' => '$1 a supprimé la page $3',
-'logentry-delete-restore' => '$1 a restauré la page $3',
-'logentry-delete-event' => "$1 a modifié la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
-'logentry-delete-revision' => '$1 a modifié la visibilité {{PLURAL:$5|d’une révision|de $5 révisions}} sur la page $3&nbsp;: $4',
-'logentry-delete-event-legacy' => '$1 a modifié la visibilité des événements du journal sur $3',
-'logentry-delete-revision-legacy' => '$1 a modifié la visibilité des révisions sur la page $3',
-'logentry-suppress-delete' => '$1 a supprimé la page $3',
-'logentry-suppress-event' => "$1 a secrètement modifié la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
-'logentry-suppress-revision' => "$1 a secrètement modifié la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3: $4",
-'logentry-suppress-event-legacy' => '$1 a secrètement modifié la visibilité des événements du journal sur $3',
-'logentry-suppress-revision-legacy' => '$1 a secrètement modifié la visibilité des révisions sur la page $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|a supprimé}} la page $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|a restauré}} la page $3',
+'logentry-delete-event' => "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
+'logentry-delete-revision' => '$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d’une révision|de $5 révisions}} sur la page $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|a modifié}} la visibilité des événements du journal sur $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|a modifié}} la visibilité des révisions sur la page $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|a supprimé}} la page $3',
+'logentry-suppress-event' => "$1 {{GENDER:$2|a secrètement modifié}} la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
+'logentry-suppress-revision' => "$1 {{GENDER:$2|a secrètement modifié}} la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3: $4",
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|a secrètement modifié}} la visibilité des événements du journal sur $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|a secrètement modifié}} la visibilité des révisions sur la page $3',
'revdelete-content-hid' => 'contenu masqué',
'revdelete-summary-hid' => 'résumé de modification masqué',
'revdelete-uname-hid' => 'nom d’utilisateur masqué',
@@ -4103,17 +4153,21 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
'revdelete-uname-unhid' => 'nom d’utilisateur affiché',
'revdelete-restricted' => 'restrictions appliquées aux administrateurs',
'revdelete-unrestricted' => 'restrictions retirées pour les administrateurs',
-'logentry-move-move' => '$1 a déplacé la page $3 vers $4',
-'logentry-move-move-noredirect' => '$1 a déplacé la page $3 vers $4 sans laisser de redirection',
-'logentry-move-move_redir' => '$1 a déplacé la page $3 vers $4 par-dessus une redirection',
-'logentry-move-move_redir-noredirect' => '$1 a déplacé la page $3 vers $4 par-dessus une redirection sans laisser de redirection',
-'logentry-patrol-patrol' => '$1 a marqué la révision $4 de la page $3 comme relue',
-'logentry-patrol-patrol-auto' => '$1 a automatiquement marqué la révision $4 de la page $3 comme relue',
-'logentry-newusers-newusers' => 'Le compte utilisateur $1 a été créé',
-'logentry-newusers-create' => 'Le compte utilisateur $1 a été créé',
-'logentry-newusers-create2' => 'Le compte utilisateur $3 a été créé par $1',
-'logentry-newusers-autocreate' => 'Le compte $1 a été créé automatiquement',
-'newuserlog-byemail' => 'mot de passe envoyé par courriel',
+'logentry-move-move' => '$1 {{GENDER:$2|a déplacé}} la page $3 vers $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|a déplacé}} la page $3 vers $4 sans laisser de redirection',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|a déplacé}} la page $3 vers $4 par-dessus une redirection',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|a déplacé}} la page $3 vers $4 par-dessus une redirection sans laisser de redirection',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|a marqué}} la révision $4 de la page $3 comme relue',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|a automatiquement marqué}} la révision $4 de la page $3 comme relue',
+'logentry-newusers-newusers' => 'Le compte utilisateur $1 {{GENDER:$2|a été créé}}',
+'logentry-newusers-create' => 'Le compte utilisateur $1 {{GENDER:$2|a été créé}}',
+'logentry-newusers-create2' => 'Le compte utilisateur $3 {{GENDER:$2|a été créé}} par $1',
+'logentry-newusers-byemail' => 'Le compte utilisateur $3 {{GENDER:$2|a été créé}} par $1 et le mot de passe a été envoyé par courriel',
+'logentry-newusers-autocreate' => 'Le compte $1 {{GENDER:$2|a été créé}} automatiquement',
+'logentry-rights-rights' => "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3 de $4 à $5",
+'logentry-rights-rights-legacy' => "$1 {{GENDER:$2|a modifié}} l'appartenance au groupe pour $3",
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|a été promu}} automatiquement de $4 à $5',
+'rightsnone' => '(aucun)',
# Feedback
'feedback-bugornote' => "Si vous êtes prêt à décrire un problème technique en détail, veuillez [$1 signaler un bogue].
@@ -4167,6 +4221,7 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
'api-error-ok-but-empty' => "Erreur interne : Le serveur n'a pas répondu.",
'api-error-overwrite' => "Écraser un fichier existant n'est pas autorisé.",
'api-error-stashfailed' => "Erreur interne : le serveur n'a pas pu enregistrer le fichier temporaire.",
+'api-error-publishfailed' => 'Erreur interne: Le serveur n’a pas pu publier le fichier temporaire.',
'api-error-timeout' => "Le serveur n'a pas répondu dans le délai imparti.",
'api-error-unclassified' => "Une erreur inconnue s'est produite",
'api-error-unknown-code' => 'Erreur inconnue : « $1 »',
@@ -4187,4 +4242,7 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
'duration-centuries' => '$1 siècle{{PLURAL:$1||s}}',
'duration-millennia' => '$1 millénaire{{PLURAL:$1||s}}',
+# Image rotation
+'rotate-comment' => 'Image pivotée de $1 {{PLURAL:$1|degré|degrés}} dans le sens des aiguilles d’une montre',
+
);
diff --git a/languages/messages/MessagesFrc.php b/languages/messages/MessagesFrc.php
index 4a002279..c40e7e79 100644
--- a/languages/messages/MessagesFrc.php
+++ b/languages/messages/MessagesFrc.php
@@ -141,7 +141,6 @@ $messages = array(
'qbbrowse' => 'Regarder',
'qbedit' => 'Changer',
'qbpageoptions' => 'Page de choix',
-'qbpageinfo' => "Page d'information",
'qbmyoptions' => 'Mes options',
'qbspecialpages' => 'Pages espéciales',
'faq' => 'Questions Communes',
@@ -327,9 +326,6 @@ $2',
Vous pouvez continuer à user {{SITENAME}} sans nom ou vous pouvez connecter encore une fois avec le même nom ou un autre nom.
Notez: certaines pages pourriont être vues comme si vous êtes connecté, jusqu'à vous videz l'information de votre navigateur.",
-'welcomecreation' => '== Bonjour, $1! ==
-
-Votre compte a été créé. Oubliez pas de changer votre réglage sus {{SITENAME}}.',
'yourname' => "Nom d'useur:",
'yourpassword' => 'Mot de passe:',
'yourpasswordagain' => 'Mot de passe encore:',
@@ -517,7 +513,6 @@ Il foudra que vous mettez vos changements dans le texte qu'est là asteur.
'template-protected' => '(protégé)',
'template-semiprotected' => '(demi-protégé)',
'edittools' => "<!-- Le texte que vous mettez ici va être montré sous les boëttes de changements ou d'import de dossier. -->",
-'nocreatetitle' => 'Création de page limitée',
'nocreatetext' => "La création des pages est limitée. Vous pouvez changer une page qu'a été déjà créée ou [[Special:UserLogin|connecter ou créer un compte]].",
'nocreate-loggedin' => 'Vous avez pas la permission de créer des nouvelles pages.',
'permissionserrors' => 'Erreur de permissions',
diff --git a/languages/messages/MessagesFrp.php b/languages/messages/MessagesFrp.php
index 41bf9bc1..91c0d7a5 100644
--- a/languages/messages/MessagesFrp.php
+++ b/languages/messages/MessagesFrp.php
@@ -151,7 +151,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__FORCIÉR_LO_SOMÈRO__', '__FORCIÉR_LA_TRÂBLA__', '__FORCERSOMMAIRE__', '__FORCERTDM__', '__FORCETOC__' ),
'toc' => array( '0', '__SOMÈRO__', '__TRÂBLA__', '__SOMMAIRE__', '__TDM__', '__TOC__' ),
'noeditsection' => array( '0', '__SÈCCION_QUE_PÔT_PAS_ÉTRE_CHANGIÊ__', '__SECTIONNONEDITABLE__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__NION_EN_TÉTA__', '__AUCUNENTETE__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'MÊS_D_ORA', 'MÊS_D_ORA_2', 'MOISACTUEL', 'MOIS2ACTUEL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'MÊS_D_ORA_1', 'MOIS1ACTUEL', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'NOM_DU_MÊS_D_ORA', 'NOMMOISACTUEL', 'CURRENTMONTHNAME' ),
@@ -443,6 +442,7 @@ $messages = array(
'newwindow' => '(ôvre na fenétra novèla)',
'cancel' => 'Anular',
'moredotdotdot' => 'Més...',
+'morenotlisted' => 'Més pas listâ...',
'mypage' => 'Pâge',
'mytalk' => 'Discussion',
'anontalk' => 'Discussion avouéc cet’adrèce IP',
@@ -454,7 +454,6 @@ $messages = array(
'qbbrowse' => 'Fâre dèfelar',
'qbedit' => 'Changiér',
'qbpageoptions' => 'Ceta pâge',
-'qbpageinfo' => 'Contèxto',
'qbmyoptions' => 'Mes pâges',
'qbspecialpages' => 'Pâges spèciâles',
'faq' => 'Quèstions sovent posâyes',
@@ -477,6 +476,7 @@ $messages = array(
'namespaces' => 'Èspâços de noms',
'variants' => 'Variantes',
+'navigation-heading' => 'Menu de navigacion',
'errorpagetitle' => 'Fôta',
'returnto' => 'Tornar a la pâge $1.',
'tagline' => 'De {{SITENAME}}',
@@ -719,12 +719,12 @@ L’administrator que l’at vèrrolyê at balyê cet’èxplicacion : « $3 ».
'virus-unknownscanner' => 'antivirus encognu :',
# Login and logout pages
-'logouttext' => "'''Ora vos éte dèbranchiê{{GENDER:||ye|(ye)}}.'''
+'logouttext' => "'''Ora vos éte dèbranchiê{{GENDER:||e|(e)}}.'''
-Vos pouede continuar a empleyér {{SITENAME}} de façon anonima ou ben [[Special:UserLogin|vos tornar branchiér]] desot lo mémo nom ou un ôtro.
-Notâd qu’y at des pâges que pôvont étre oncor fêtes vêre coment se vos érâd adés branchiê{{GENDER:||ye|(ye)}}, tant que vos èfaciéd lo cacho de voutron navigator.",
-'welcomecreation' => '== Benvegnua, $1 ! ==
-Voutron compto est étâ fêt.
+Vos pouede continuar a empleyér {{SITENAME}} de façon anonima ou ben <span class='plainlinks'>[$1 vos tornar branchiér]</span> desot lo mémo nom ou un ôtro.
+Notâd qu’y at des pâges que pôvont étre oncor fêtes vêre coment se vos érâd adés branchiê{{GENDER:||e|(e)}}, tant que vos èfaciéd lo cacho de voutron navigator.",
+'welcomeuser' => 'Benvegnua, $1 !',
+'welcomecreation-msg' => 'Voutron compto est étâ fêt.
Oubliâd pas de changiér voutres [[Special:Preferences|prèferences dessus {{SITENAME}}]].',
'yourname' => 'Nom d’utilisator :',
'yourpassword' => 'Contresegno :',
@@ -748,7 +748,7 @@ Oubliâd pas de changiér voutres [[Special:Preferences|prèferences dessus {{SI
'gotaccount' => "Vos éd ja un compto ? '''$1.'''",
'gotaccountlink' => 'Branchiéd-vos',
'userlogin-resetlink' => 'Vos éd oubliâ voutros dètalys de branchement ?',
-'createaccountmail' => 'per mèssageria èlèctronica',
+'createaccountmail' => 'Empleyér un contresegno temporèro fêt per hasârd et lo mandar a l’adrèce èlèctronica spècifiâye ce-desot',
'createaccountreason' => 'Rêson :',
'badretype' => 'Los contresegnos que vos éd buchiês sont pas pariérs.',
'userexists' => 'Lo nom d’utilisator buchiê est ja empleyê.
@@ -828,6 +828,7 @@ Se vos plét, atende devant que tornar èprovar.',
# Email sending
'php-mail-error-unknown' => 'Fôta encognua dens la fonccion mail() de PHP.',
'user-mail-no-addy' => 'Èprôva de mandar un mèssâjo sen adrèce èlèctronica.',
+'user-mail-no-body' => 'Èprôva de mandar un mèssâjo avouéc un côrp vouedo ou ben dèrêsonâblament côrt.',
# Change password dialog
'resetpass' => 'Changiér lo contresegno',
@@ -895,6 +896,7 @@ Contresegno temporèro : $2',
'changeemail-oldemail' => 'Adrèce èlèctronica d’ora :',
'changeemail-newemail' => 'Novèl’adrèce èlèctronica :',
'changeemail-none' => '(pas yona)',
+'changeemail-password' => 'Voutron contresegno dessus {{SITENAME}} :',
'changeemail-submit' => 'Changiér l’adrèce èlèctronica',
'changeemail-cancel' => 'Anular',
@@ -1085,7 +1087,6 @@ Por refèrence, la dèrriére entrâ du jornal est balyêe ce-desot :",
'template-semiprotected' => '(mié-protègiê)',
'hiddencategories' => '{{PLURAL:$1|Catègorie cachiêe|Catègories cachiêes}} que ceta pâge est avouéc :',
'edittools' => '<!-- Tot tèxto buchiê ique serat montrâ desot les bouètes d’èdicion ou ben los formulèros de tèlèchargement de fichiér. -->',
-'nocreatetitle' => 'Crèacion de pâge limitâ',
'nocreatetext' => '{{SITENAME}} at rètrent la possibilitât de fâre de pâges novèles.
Vos pouede tornar arriér et pués changiér na pâge ègzistenta ou ben [[Special:UserLogin|vos branchiér ou fâre un compto]].',
'nocreate-loggedin' => 'Vos éd pas la pèrmission de fâre de pâges novèles.',
@@ -1110,6 +1111,15 @@ Semble que seye étâye suprimâye.',
'edit-already-exists' => 'Y at pas moyen de fâre na pâge novèla.
Ègziste ja.',
'defaultmessagetext' => 'Mèssâjo per dèfôt',
+'content-failed-to-parse' => 'Falyita de l’analisa du contegnu de $2 por lo modèlo $1 : $3',
+'invalid-content-data' => 'Balyês du contegnu pas justes',
+'content-not-allowed-here' => 'Lo contegnu « $1 » est pas ôtorisâ sur la pâge [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'vouiquitèxto',
+'content-model-text' => 'tèxto bruto',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Atencion :''' cela pâge contint trop d’apèls a des fonccions du parsor que revegnont chieres.
@@ -1480,9 +1490,9 @@ Cen pôt pas étre dèfêt.',
'prefs-emailconfirm-label' => 'Confirmacion de l’adrèce èlèctronica :',
'prefs-textboxsize' => 'Talye de la fenétra de changement',
'youremail' => 'Adrèce èlèctronica :',
-'username' => 'Nom d’usanciér :',
-'uid' => 'Numerô d’usanciér :',
-'prefs-memberingroups' => 'Membro a {{PLURAL:$1|la tropa|les tropes}} :',
+'username' => 'Nom d’utilisat{{GENDER:$1|or|rice}} :',
+'uid' => 'Identifient d’utilisat{{GENDER:$1|or|rice}} :',
+'prefs-memberingroups' => '{{GENDER:$2|Membro}} de l{{PLURAL:$1|a tropa|es tropes}} :',
'prefs-registration' => 'Dâta d’encartâjo :',
'yourrealname' => 'Veré nom :',
'yourlanguage' => 'Lengoua :',
@@ -1633,12 +1643,13 @@ Se vos chouèsésséd de lo balyér, serat empleyê por vos atribuar voutres ôv
'right-sendemail' => 'Mandar un mèssâjo ux ôtros utilisators',
'right-passwordreset' => 'Vêre los mèssâjos de remês’a zérô des contresegnos',
+# Special:Log/newusers
+'newuserlogpage' => 'Jornal de les crèacions d’utilisators',
+'newuserlogpagetext' => 'O est un jornal de les crèacions d’utilisators.',
+
# User rights log
'rightslog' => 'Jornal des drêts d’utilisator',
'rightslogtext' => 'O est un jornal des changements des drêts d’utilisator.',
-'rightslogentry' => 'at changiê los drêts de l’utilisator « $1 » de $2 a $3',
-'rightslogentry-autopromote' => 'est étâ nomâ ôtomaticament de $2 a $3',
-'rightsnone' => '(nion)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'liére cela pâge',
@@ -1890,6 +1901,7 @@ Se lo problèmo continue, veriéd-vos vers un [[Special:ListUsers/sysop|administ
'backend-fail-notsame' => 'Un fichiér pas pariér ègziste ja a « $1 ».',
'backend-fail-invalidpath' => '« $1 » est pas un chemin de stocâjo justo.',
'backend-fail-delete' => 'Y at pas moyen de suprimar lo fichiér « $1 ».',
+'backend-fail-describe' => 'Y at pas moyen de changiér les mètabalyês du fichiér « $1 ».',
'backend-fail-alreadyexists' => 'Lo fichiér « $1 » ègziste ja.',
'backend-fail-store' => 'Y at pas moyen de stocar lo fichiér « $1 » dedens « $2 ».',
'backend-fail-copy' => 'Y at pas moyen de copiyér lo fichiér « $1 » vers « $2 ».',
@@ -2128,6 +2140,12 @@ Oubliâd pas de controlar s’y at gins d’ôtro lim de vers los modèlos devan
Devriant pletout pouentar vers na pâge que vat avouéc.<br />
Na pâge est trètâye coment na pâge d’homonimia s’emplèye un modèlo liyê a [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Pâges avouéc na propriètât de pâge',
+'pageswithprop-legend' => 'Pâges avouéc na propriètât de pâge',
+'pageswithprop-text' => 'Ceta pâge liste les pâges qu’emplèyont na propriètât de pâge particuliére.',
+'pageswithprop-prop' => 'Nom de la propriètât :',
+'pageswithprop-submit' => 'Alar trovar',
+
'doubleredirects' => 'Redirèccions dobles',
'doubleredirectstext' => 'Ceta pâge liste les pâges que redirijont vers d’ôtres pâges de redirèccion.
Châque renche contint des lims de vers la premiére et la seconda redirèccion, et pués la ciba de la seconda redirèccion, cen que balye habituèlament la « veré » pâge ciba, de vers laquinta la premiére redirèccion devrêt pouentar.
@@ -2281,9 +2299,9 @@ Vêde asse-ben les [[Special:WantedCategories|catègories demandâyes]].',
'linksearch-pat' => 'Modèlo de rechèrche :',
'linksearch-ns' => 'Èspâço de noms :',
'linksearch-ok' => 'Rechèrchiér',
-'linksearch-text' => 'Des caractèros j·oquères coment « *.wikipedia.org » pôvont étre utilisâs.
-Ils ont fôta d’u muens un domêno de nivél supèrior, per ègzemplo « *.org ».<br />
-Protocolos recognus : <code>$1</code> (apondéd gins de cetos dedens voutra rechèrche).',
+'linksearch-text' => 'Des caractèros j·oquères coment « *.wikipedia.org » pôvont étre empleyês.
+Ils ant fôta de por lo muens un domêno de nivél de dessus, per ègzemplo « *.org ».<br />
+{{PLURAL:$2|Protocolo recognu|Protocolos recognus}} : <code>$1</code> (http:// per dèfôt se nion protocolo est spècifiâ).',
'linksearch-line' => '$1 est liyê dês $2',
'linksearch-error' => 'Los caractèros j·oquères pôvont étre empleyês ren qu’u comencement du nom de domêno de l’hôto.',
@@ -2302,10 +2320,6 @@ Protocolos recognus : <code>$1</code> (apondéd gins de cetos dedens voutra rech
'activeusers-hidesysops' => 'Cachiér los administrators',
'activeusers-noresult' => 'Nion utilisator trovâ.',
-# Special:Log/newusers
-'newuserlogpage' => 'Jornal de les crèacions d’utilisators',
-'newuserlogpagetext' => 'O est un jornal de les crèacions d’utilisators.',
-
# Special:ListGroupRights
'listgrouprights' => 'Drêts de les tropes d’utilisators',
'listgrouprights-summary' => 'Vê-que na lista de les tropes d’utilisators dèfenies sur ceti vouiqui et pués los sins drêts d’accès.
@@ -2401,20 +2415,23 @@ Los changements que vegnont de ceta pâge et de la sina pâge de discussion y se
'enotif_mailer' => 'Sistèmo de notificacion per mèssageria èlèctronica de {{SITENAME}}',
'enotif_reset' => 'Marcar totes les pâges coment visitâyes',
-'enotif_newpagetext' => 'O est una pâge novèla.',
'enotif_impersonal_salutation' => 'Utilisator de {{SITENAME}}',
-'changed' => 'changiê',
-'created' => 'fêta',
-'enotif_subject' => 'La pâge « $PAGETITLE » de {{SITENAME}} at étâ $CHANGEDORCREATED per $PAGEEDITOR',
+'enotif_subject_deleted' => 'La pâge $1 dessus {{SITENAME}} est étâye suprimâye per {{GENDER:$2|$2}}',
+'enotif_subject_created' => 'La pâge $1 dessus {{SITENAME}} est étâye fêta per {{GENDER:$2|$2}}',
+'enotif_subject_moved' => 'La pâge $1 dessus {{SITENAME}} est étâye dèplaciêe per {{GENDER:$2|$2}}',
+'enotif_subject_restored' => 'La pâge $1 dessus {{SITENAME}} est étâye refêta per {{GENDER:$2|$2}}',
+'enotif_subject_changed' => 'La pâge $1 dessus {{SITENAME}} est étâye changiêe per {{GENDER:$2|$2}}',
+'enotif_body_intro_deleted' => 'La pâge $1 dessus {{SITENAME}} est étâye suprimâye lo $PAGEEDITDATE per {{GENDER:$2|$2}}, vêde $3.',
+'enotif_body_intro_created' => 'La pâge $1 dessus {{SITENAME}} est étâye fêta lo $PAGEEDITDATE per {{GENDER:$2|$2}}, vêde $3 por la vèrsion d’ora.',
+'enotif_body_intro_moved' => 'La pâge $1 dessus {{SITENAME}} est étâye dèplaciêe lo $PAGEEDITDATE per {{GENDER:$2|$2}}, vêde $3 por la vèrsion d’ora.',
+'enotif_body_intro_restored' => 'La pâge $1 dessus {{SITENAME}} est étâye refêta lo $PAGEEDITDATE per {{GENDER:$2|$2}}, vêde $3 por la vèrsion d’ora.',
+'enotif_body_intro_changed' => 'La pâge $1 dessus {{SITENAME}} est étâye changiêe lo $PAGEEDITDATE per {{GENDER:$2|$2}}, vêde $3 por la vèrsion d’ora.',
'enotif_lastvisited' => 'Vêde $1 por tôs los changements dês voutra dèrriére visita.',
'enotif_lastdiff' => 'Vêde $1 por vêre cél changement.',
'enotif_anon_editor' => 'utilisator anonimo $1',
'enotif_body' => 'Chier(a) $WATCHINGUSERNAME,
-
-la pâge « $PAGETITLE » de {{SITENAME}} est étâye $CHANGEDORCREATED lo $PAGEEDITDATE per « $PAGEEDITOR », vêde $PAGETITLE_URL por la vèrsion d’ora.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Rèsumâ du contributor : $PAGESUMMARY $PAGEMINOREDIT
@@ -2422,7 +2439,7 @@ Veriéd-vos vers lo contributor :
mèl. : $PAGEEDITOR_EMAIL
vouiqui : $PAGEEDITOR_WIKI
-Y arat gins d’ôtra notificacion en câs de changements a vegnir, a muens que vos visitâd cela pâge. Vos pouede asse-ben tornar inicialisar los segnalements de notificacion por totes les pâges de voutra lista de survelyence.
+Y arat gins d’ôtra notificacion en câs de changements a vegnir, du muens que vos visiteyâd cela pâge. Vos pouede asse-ben rebetar a zérô los segnalements de notificacion por totes les pâges de voutra lista de siuvu.
Voutron sistèmo de notificacion de {{SITENAME}}
@@ -2430,14 +2447,16 @@ Voutron sistèmo de notificacion de {{SITENAME}}
Por changiér la configuracion de notificacion per mèssageria èlèctronica, visitâd
{{canonicalurl:{{#special:Preferences}}}}
-Por changiér la configuracion de voutra lista de survelyence, visitâd
+Por changiér la configuracion de voutra lista de siuvu, visitâd
{{canonicalurl:{{#special:EditWatchlist}}}}
-Por suprimar la pâge de voutra lista de survelyence, visitâd
+Por suprimar la pâge de voutra lista de siuvu, visitâd
$UNWATCHURL
Avis et assistance de ples :
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'fêta',
+'changed' => 'changiê',
# Delete
'deletepage' => 'Suprimar la pâge',
@@ -2511,6 +2530,8 @@ Vêde la [[Special:ProtectedPages|lista de les pâges protègiêes]] por la list
'prot_1movedto2' => 'at dèplaciê [[$1]] vers [[$2]]',
'protect-badnamespace-title' => 'Èspâço de noms pas protèjâblo',
'protect-badnamespace-text' => 'Les pâges dedens cet’èspâço de noms pôvont pas étre protègiêes.',
+'protect-norestrictiontypes-text' => 'Cela pâge pôt pas étre protègiêe, y at gins de tipo de rèstriccion disponiblo.',
+'protect-norestrictiontypes-title' => 'Pâge pas protèjâbla',
'protect-legend' => 'Confirmar la protèccion',
'protectcomment' => 'Rêson :',
'protectexpiry' => 'Dâta d’èxpiracion :',
@@ -2596,8 +2617,8 @@ Pôt-étre vos éd un crouyo lim ou ben la vèrsion at possu étre refêta ou en
'undeletedrevisions' => '$1 {{PLURAL:$1|vèrsion refêta|vèrsions refêtes}}',
'undeletedrevisions-files' => '$1 vèrsion{{PLURAL:$1||s}} et $2 fichiér{{PLURAL:$2||s}} refêts',
'undeletedfiles' => '$1 {{PLURAL:$1|fichiér refêt|fichiérs refêts}}',
-'cannotundelete' => 'La rèstoracion at pas reussia ;
-un ôtro usanciér at probâblament ja refêt la pâge.',
+'cannotundelete' => 'Falyita de la rèstoracion :
+$1',
'undeletedpage' => "'''$1 est étâye refêta'''
Vêde lo [[Special:Log/delete|jornal de les suprèssions]] por avêr na lista de les novèles suprèssions et rèstoracions.",
@@ -2629,7 +2650,7 @@ $1',
'blanknamespace' => '(Principâl)',
# Contributions
-'contributions' => 'Contribucions a l’usanciér',
+'contributions' => 'Contribucions de l’utilisat{{GENDER:$1|or|rice}}',
'contributions-title' => 'Lista de les contribucions a l’usanciér $1',
'mycontris' => 'Contribucions',
'contribsub2' => 'Por $1 ($2)',
@@ -3034,7 +3055,6 @@ Volyéd tornar èprovar.',
# JavaScriptTest
'javascripttest' => 'Èprôva de JavaScript',
-'javascripttest-disabled' => 'Cela fonccion-que est pas étâye activâye sur ceti vouiqui.',
'javascripttest-title' => 'Èprôves de $1 en cors',
'javascripttest-qunit-intro' => 'Vêde la [$1 documentacion de les èprôves] dessus mediawiki.org.',
'javascripttest-qunit-heading' => 'Suita d’èprôva QUnit de JavaScript dessus MediaWiki',
@@ -3181,6 +3201,7 @@ O est probâblament diu a un lim de vers un seto de defôr qu’aparêt sur la l
'pageinfo-default-sort' => 'Cllâf de tri per dèfôt',
'pageinfo-length' => 'Talye de la pâge (en octèts)',
'pageinfo-article-id' => 'Numerô de la pâge',
+'pageinfo-language' => 'Lengoua du contegnu de la pâge',
'pageinfo-robot-policy' => 'Statut de motor de rechèrche',
'pageinfo-robot-index' => 'Endèxâblo',
'pageinfo-robot-noindex' => 'Pas endèxâblo',
@@ -3200,6 +3221,12 @@ O est probâblament diu a un lim de vers un seto de defôr qu’aparêt sur la l
'pageinfo-magic-words' => '{{PLURAL:$1|Mot magico|Mots magicos}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Catègorie cachiêye|Catègories cachiêyes}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Modèlo encllu|Modèlos encllus}} ($1)',
+'pageinfo-toolboxlink' => 'Enformacions sur la pâge',
+'pageinfo-redirectsto' => 'Redirige vers',
+'pageinfo-redirectsto-info' => 'enfô',
+'pageinfo-contentpage' => 'Comptâ coment pâge de contegnu',
+'pageinfo-contentpage-yes' => 'Ouè',
+'pageinfo-protect-cascading-yes' => 'Ouè',
# Skin names
'skinname-standard' => 'Estandârd',
@@ -3254,6 +3281,7 @@ Se vos l’ègzécutâd, voutron sistèmo pôt étre compromês.",
'file-info-size-pages' => '$1 × $2 pixèls, talye du fichiér : $3, tipo MIME : $4, $5 pâge{{PLURAL:$5||s}}',
'file-nohires' => 'Gins de rèsolucion ples hôta disponibla.',
'svg-long-desc' => 'Fichiér SVG, rèsolucion de $1 × $2 pixèls, talye : $3',
+'svg-long-error' => 'Fichiér SVG envalido : $1',
'show-big-image' => 'Émâge en rèsolucion ples hôta',
'show-big-image-preview' => 'Talye de ceti apèrçu : $1.',
'show-big-image-other' => '{{PLURAL:$2|Ôtra rèsolucion|Ôtres rèsolucions}} : $1.',
@@ -3283,6 +3311,7 @@ Se vos l’ègzécutâd, voutron sistèmo pôt étre compromês.",
'hours' => '$1 hor{{PLURAL:$1|a|es}}',
'days' => '$1 jorn{{PLURAL:$1||s}}',
'ago' => 'cen fât $1',
+'just-now' => 'drêt-ora',
# Bad image list
'bad_image_list' => 'Lo format est ceti :
@@ -4116,7 +4145,10 @@ Les émâges sont montrâs dens lor plêna rèsolucion, los ôtros fichiérs son
'logentry-newusers-create' => 'Lo compto utilisator $1 est étâ fêt',
'logentry-newusers-create2' => 'Lo compto utilisator $3 est étâ fêt per $1',
'logentry-newusers-autocreate' => 'Lo compto $1 at étâ fêt ôtomaticament',
-'newuserlog-byemail' => 'contresegno mandâ per mèssageria èlèctronica',
+'logentry-rights-rights' => '$1 at changiê l’apartegnence a la tropa por « $3 » de $4 a $5',
+'logentry-rights-rights-legacy' => '$1 at changiê l’apartegnence a la tropa por « $3 »',
+'logentry-rights-autopromote' => '$1 est étâ nomâ ôtomaticament de $4 a $5',
+'rightsnone' => '(nion)',
# Feedback
'feedback-bugornote' => 'Se vos éte prèst a dècrire un problèmo tècnico en dètaly, volyéd [$1 signalar una cofierie].
diff --git a/languages/messages/MessagesFrr.php b/languages/messages/MessagesFrr.php
index acc437db..eb387a93 100644
--- a/languages/messages/MessagesFrr.php
+++ b/languages/messages/MessagesFrr.php
@@ -153,6 +153,7 @@ $messages = array(
'newwindow' => '(wårt önj en nai waning ääm mååged)',
'cancel' => 'Oufbreege',
'moredotdotdot' => 'Mör ...',
+'morenotlisted' => 'Öödern, ei apfeerd ...',
'mypage' => 'Sidj',
'mytalk' => 'Diskusjuun',
'anontalk' => 'Diskusjoonssid foon jüdeer IP',
@@ -164,7 +165,6 @@ $messages = array(
'qbbrowse' => 'Bleese',
'qbedit' => 'Änre',
'qbpageoptions' => 'Jüdeer sid',
-'qbpageinfo' => 'Sidedoote',
'qbmyoptions' => 'Min side',
'qbspecialpages' => 'Spetsjåålside',
'faq' => 'FAQ',
@@ -187,6 +187,7 @@ $messages = array(
'namespaces' => 'Noomerüme',
'variants' => 'Fariante',
+'navigation-heading' => 'Nawigatsjuun',
'errorpagetitle' => 'Fäägel',
'returnto' => 'Tubääg tu jü side $1.',
'tagline' => 'Ãœt {{SITENAME}}',
@@ -429,12 +430,11 @@ Di grünj faan di administraator as: „$3“.',
# Login and logout pages
'logouttext' => "'''Dü bast nü oufmälded.'''
-Dü koost {{SITENAME}} nü anonüüm widerbrüke, unti de wider uner diseelew unti en oudern brükernoome [[Special:UserLogin|önjmälde]].
+Dü koost {{SITENAME}} nü anonüüm widerbrüke, unti de wider uner diseelew unti en oudern brükernoome <span class='plainlinks'>[$1 önjmälde]</span>.
Påås aw, dåt hu side nuch wise koone, dåt dü önjmälded bast, sülung dü ai dan browsercache lääsimååged heest.",
-'welcomecreation' => '== Wäljkiimen, $1! ==
-
-Din brükerkonto wörd inruchted.
-Ferjees ai, din [[Special:Preferences|{{SITENAME}}-önjstalinge]] önjtupååsen.',
+'welcomeuser' => 'Welkimen, $1!',
+'welcomecreation-msg' => 'Din brükerkonto as iinracht wurden.
+Ferjid det ei, an aachte üüb din [[Special:Preferences|{{SITENAME}} iinstelangen]].',
'yourname' => 'Brükernoome:',
'yourpassword' => 'Pååsuurd:',
'yourpasswordagain' => 'Schriw pååsuurd nuch iinjsen:',
@@ -457,7 +457,7 @@ Ferjees ai, din [[Special:Preferences|{{SITENAME}}-önjstalinge]] önjtupååsen
'gotaccount' => "Dü hääst ål en brükerkonto? '''$1'''.",
'gotaccountlink' => 'Önjmälde',
'userlogin-resetlink' => 'Heest dü din login dooten ferjiden?',
-'createaccountmail' => 'Auer e-mail',
+'createaccountmail' => 'E-mail tu det adres oner fersjüür mä en tufelag paaswurd',
'createaccountreason' => 'Grün:',
'badretype' => 'Da biise pååsuurde stime ai oueriinj.',
'userexists' => 'Dideer brükernoome as ål ferjääwen.
@@ -531,6 +531,7 @@ Wees sü gödj än täif, bit dü wider ferseechst.',
# Email sending
'php-mail-error-unknown' => 'Ünbekäänd feeler mä det funktsjuun mail() faan PHP.',
'user-mail-no-addy' => 'Köö niinj e-mail schake suner e-mail-adres.',
+'user-mail-no-body' => 'Dü wulst en e-mail saner tekst wechsjüür.',
# Change password dialog
'resetpass' => 'Pååsuurd änre',
@@ -587,6 +588,7 @@ Tidwis paasuurd: $2',
'changeemail-oldemail' => 'Aktuel e-mail adres',
'changeemail-newemail' => 'Nei e-mail adres',
'changeemail-none' => '(niin)',
+'changeemail-password' => 'Din {{SITENAME}} paaswurd:',
'changeemail-submit' => 'E-mail adres feranre',
'changeemail-cancel' => 'Ufbreeg',
@@ -767,7 +769,6 @@ Uun't logbuk stäänt muar diartu:",
'template-protected' => '(seekert)',
'template-semiprotected' => '(hualew-seekert)',
'hiddencategories' => 'Jüdeer sid as lasmoot foon {{PLURAL:$1|1 ferstäägen kategorii|$1 ferstäägene kategoriie}}:',
-'nocreatetitle' => 'Det maagin faan nei sidjen as ei saner aanj mögelk.',
'nocreatetext' => 'Aw {{SITENAME}} wörd dåt måågen foon naie side begränsed.
Dü koost bestönjene side änre unti de [[Special:UserLogin|önjmälde unti mååg en account]].',
'nocreate-loggedin' => 'Dü heest niinj beruchtiging, naie side tu måågen.',
@@ -790,6 +791,15 @@ Jü wörd önjscheened sleeked.',
'edit-already-exists' => 'Köö niinj nai sid mååge.
Dåt bestöö ål.',
'defaultmessagetext' => 'Standard tekst',
+'content-failed-to-parse' => "Parsing faan $2 för't model $1 ging skiaf: $3",
+'invalid-content-data' => 'Diar stäänt wat uun, wat diar ei hen hiart',
+'content-not-allowed-here' => '„$1“ mut ei skrewen wurd üüb sidj [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'normool tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Woorschauing: Jüdeer sid önjthålt tu fool apteele foon widluftie parserfunksjoone.
@@ -1149,9 +1159,9 @@ Do san jo ual iinstelangen wech.',
'prefs-emailconfirm-label' => 'E-Mail gudkäänd:',
'prefs-textboxsize' => "Grate faan't wönang tu bewerkin",
'youremail' => 'E-mail:',
-'username' => 'Brükernööm:',
-'uid' => 'Brüker ID:',
-'prefs-memberingroups' => 'Lasmoot faan {{PLURAL:$1|brükerskööl|brükersköölen}}:',
+'username' => '{{GENDER:$1|Brükernööm}}:',
+'uid' => '{{GENDER:$1|Brükerkäänang}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Lasmoot}} faan {{PLURAL:$1|brükerskööl|brükersköölen}}:',
'prefs-registration' => 'Uunmelde-tidj',
'yourrealname' => 'Rocht nööm:',
'yourlanguage' => 'Spräke:',
@@ -1265,9 +1275,11 @@ Do san jo ual iinstelangen wech.',
'right-browsearchive' => 'Sjük stregen sidjen',
'right-sendemail' => 'E-mails tu oudere brükere schake',
+# Special:Log/newusers
+'newuserlogpage' => 'Nai-önjmäldings-logbök',
+
# User rights log
'rightslog' => 'Ruchte-logbök',
-'rightsnone' => '(-)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'jüdeer sid leese',
@@ -1434,9 +1446,6 @@ Det beskriiwang faan't [$2 beskriiwangssidj] woort oner uunwiset.",
'linksearch-ok' => 'Säk',
'linksearch-line' => '$2 ferwiset üüb $1',
-# Special:Log/newusers
-'newuserlogpage' => 'Nai-önjmäldings-logbök',
-
# Special:ListGroupRights
'listgrouprights-members' => '(lasmoote-list)',
@@ -1555,7 +1564,8 @@ Di tekst faan det stregen sidj fu bluas administratooren uunwiset.',
'undeletedrevisions' => '{{PLURAL:$1|1 wersjuun|$1 wersjuunen}} weder iinsteld',
'undeletedrevisions-files' => '{{PLURAL:$1|1 wersjuun|$1 wersjuunen}} an {{PLURAL:$2|1 datei|$2 datein}} weder iinsteld',
'undeletedfiles' => '{{PLURAL:$1|1 datei|$1 datein }} weder iinsteld',
-'cannotundelete' => 'Weder iinstelen hää ei loket; ferlicht hää hoker ööders det al weder iinsteld.',
+'cannotundelete' => 'Weder iinstelen hää ei loket:
+$1',
'undeletedpage' => "'''„$1“''' as weder iinsteld wurden.
Uun't [[Special:Log/delete|logbuk faan stregen sidjen]] stun a stregen an weder iinsteld sidjen.",
'undelete-header' => "Luke uun't [[Special:Log/delete|logbuk för stregen sidjen]] efter stregen sidjen faan a leetst tidj.",
@@ -1580,7 +1590,7 @@ $1",
'blanknamespace' => '(Side)',
# Contributions
-'contributions' => 'Brüker bidracher',
+'contributions' => '{{GENDER:$1|Brüker}} bidracher',
'contributions-title' => 'Brükertujeefte foon "$1"',
'mycontris' => 'Bidracher',
'contribsub2' => 'For $1 ($2)',
@@ -1862,25 +1872,29 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
'htmlform-selectorother-other' => 'Oudere',
# New logging system
-'logentry-delete-delete' => '$1 hää det sidj $3 stregen',
-'logentry-delete-restore' => '$1 hää det sidj $3 weder iinsteld',
-'logentry-delete-event' => '$1 hää det uunlukin feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
-'logentry-delete-revision' => '$1 hää det uunlukin feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
-'logentry-delete-event-legacy' => '$1 hää det uunlukin feranert faan logbuk iindracher üüb $3',
-'logentry-delete-revision-legacy' => '$1 hää det uunlukin feranert faan wersjuunen faan det sidj $3',
-'logentry-suppress-delete' => '$1 hää det sidj $3 wechtrakt',
-'logentry-suppress-event' => '$1 hää stalswigin det uunlukin feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
-'logentry-suppress-revision' => '$1 hää stalswigin det uunlukin feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
-'logentry-suppress-event-legacy' => '$1 hää stalswigin det uunlukin fernanert faan logbuk iindracher üüb $3',
-'logentry-suppress-revision-legacy' => '$1 hää stalswigin det uunlukin feranert faan wersjuunen faan det sidj $3',
+'logentry-delete-delete' => '$1 {{Gender:$2}} hää det sidj $3 stregen',
+'logentry-delete-restore' => '$1 {{GENDER:$2}} hää det sidj $3 weder iinsteld',
+'logentry-delete-event' => '$1 {{GENDER:$2}} hää det uunsicht feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2}} hää det uunsicht feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2}} hää det uunsicht feranert faan logbuk iindracher üüb $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2}} hää det uunsicht feranert faan wersjuunen faan det sidj $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2}} hää det sidj $3 wechtrakt',
+'logentry-suppress-event' => '$1 {{GENDER:$2}} hää stalswigin det uunsicht feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2}} hää stalswigin det uunsicht feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2}} hää stalswigin det uunsicht feranert faan logbuk iindracher üüb $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2}} hää stalswigin det uunlukin feranert faan wersjuunen faan det sidj $3',
'revdelete-uname-hid' => 'brükernoome ferstäägen',
'revdelete-uname-unhid' => 'brükernoome frijääwen',
'revdelete-restricted' => 'gränse jüle uk for administratoore',
'revdelete-unrestricted' => 'gränse for administratoore wächnümen',
-'logentry-move-move' => '$1 hää det sidj $3 efter $4 fersköwen.',
-'logentry-move-move-noredirect' => '$1 hää det sidj $3 efter $4 saner widjerfeerang fersköwen.',
-'logentry-move-move_redir' => '$1 hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen.',
-'logentry-move-move_redir-noredirect' => '$1 hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen saner salew en widjerfeerang uuntuleien.',
+'logentry-move-move' => '$1 {{GENDER:$2}} hää det sidj $3 efter $4 fersköwen.',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2}} hää det sidj $3 efter $4 saner widjerfeerang fersköwen.',
+'logentry-move-move_redir' => '$1 {{GENDER:$2}} hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen.',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2}} hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen saner salew en widjerfeerang uuntuleien.',
+'logentry-newusers-newusers' => 'Brükerkonto $1 as {{GENDER:$2|iinracht}} wurden',
+'logentry-newusers-create2' => 'Brükerkonto $3 as faan $1 {{GENDER:$2|iinracht}} wurden',
+'logentry-newusers-autocreate' => 'Brükerkonto $1 as automaatisk {{GENDER:$2|iinracht}} wurden',
+'rightsnone' => '(-)',
# Search suggestions
'searchsuggest-search' => 'Sjük',
diff --git a/languages/messages/MessagesFur.php b/languages/messages/MessagesFur.php
index 9336b820..bbd2d613 100644
--- a/languages/messages/MessagesFur.php
+++ b/languages/messages/MessagesFur.php
@@ -239,7 +239,6 @@ $messages = array(
'qbbrowse' => 'Sgarfe',
'qbedit' => 'Cambie',
'qbpageoptions' => 'Cheste pagjine',
-'qbpageinfo' => 'Contest',
'qbmyoptions' => 'Mês pagjinis',
'qbspecialpages' => 'Pagjinis speciâls',
'faq' => 'Domandis plui frecuentis',
@@ -410,11 +409,8 @@ Al podarès vê dentri caratars che no podin jessi doprâts tai titui.',
# Login and logout pages
'logouttext' => "'''Tu sâs cumò lât fûr.'''
-Tu puedis continuâ a doprâ {{SITENAME}} come anonim, o tu puedis [[Special:UserLogin|jentrâ di gnûf]] cul stes o cuntun altri non utent.
+Tu puedis continuâ a doprâ {{SITENAME}} come anonim, o tu puedis <span class='plainlinks'>[$1 jentrâ di gnûf]</span> cul stes o cuntun altri non utent.
Considere che cualchi pagjine e pues mostrâti ancjemò come jentrât tal sît fin cuant che no tu netis la memorie cache dal sgarfadôr.",
-'welcomecreation' => '== Mandi e benvignût $1! ==
-La tô identitât e je stade creade.
-No stâ dismenteâti di gambiâ lis [[Special:Preferences|preferencis di {{SITENAME}}]].',
'yourname' => 'Non utent',
'yourpassword' => 'Peraule clâf',
'yourpasswordagain' => 'Torne a scrivile',
@@ -579,7 +575,6 @@ L'aministradôr che al à blocât la base di dâts al à ufiert chest spiegazion
'template-protected' => '(protezût)',
'template-semiprotected' => '(semi-protezût)',
'hiddencategories' => 'Cheste pagjine e je {{PLURAL:$1|intune categorie platade|in $1 categoriis platadis}}:',
-'nocreatetitle' => 'Creazion des pagjinis limitade',
'nocreatetext' => '{{SITENAME}} al à limitât la pussibilitât di creâ gnovis pagjinis ai utents regjistrâts. Tu puedis tornâ indaûr e cambiâ une pagjine che e esist o se no [[Special:UserLogin|jentrâ o creâ une gnove identitât]].',
'nocreate-loggedin' => 'No tu âs i permès che a coventin par creâ gnovis pagjinis.',
'permissionserrors' => 'Erôr tai permès',
@@ -820,6 +815,10 @@ La tô direzion di pueste no ven mostrade cuant che i utents ti contatin.',
'grouppage-sysop' => '{{ns:project}}:Aministradôrs',
+# Special:Log/newusers
+'newuserlogpage' => 'Regjistri dai gnûfs utents',
+'newuserlogpagetext' => 'Ca sot tu cjatis un regjistri dai gnûfs utents creâts.',
+
# User rights log
'rightslog' => 'Regjistri dai dirits dai utents',
@@ -1118,10 +1117,6 @@ Cjale ancje lis [[Special:WantedCategories|categoriis desideradis]].',
'activeusers-hidesysops' => 'Plate i aministradôrs',
'activeusers-noresult' => 'Nissun utent cjatât.',
-# Special:Log/newusers
-'newuserlogpage' => 'Regjistri dai gnûfs utents',
-'newuserlogpagetext' => 'Ca sot tu cjatis un regjistri dai gnûfs utents creâts.',
-
# Special:ListGroupRights
'listgrouprights' => 'Dirits dai grups di utents',
'listgrouprights-group' => 'Grup',
@@ -1178,9 +1173,9 @@ e la pagjine e sarà '''gruessute''' te [[Special:RecentChanges|liste dai ultins
'enotif_mailer' => 'Sisteme di notifiche par pueste eletroniche di {{SITENAME}}',
'enotif_reset' => 'Segne dutis lis pagjinis come visitadis',
'enotif_impersonal_salutation' => 'Utent di {{SITENAME}}',
-'changed' => 'cambiade',
-'created' => 'creade',
'enotif_anon_editor' => 'utent anonim $1',
+'created' => 'creade',
+'changed' => 'cambiade',
# Delete
'deletepage' => 'Elimine pagjine',
@@ -1260,7 +1255,7 @@ Tu puedis cambiâ il nivel di protezion di cheste pagjine, ma chest nol varà ef
'blanknamespace' => '(Principâl)',
# Contributions
-'contributions' => 'Contribûts dal utent',
+'contributions' => 'Contribûts {{GENDER:$1|dal utent|de utente}}',
'contributions-title' => 'Contribûts di $1',
'mycontris' => 'Contribûts',
'contribsub2' => 'Par $1 ($2)',
@@ -1697,9 +1692,6 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
'htmlform-submit' => 'Invie',
'htmlform-selectorother-other' => 'Altris',
-# New logging system
-'newuserlog-byemail' => 'peraule clâf mandade par pueste eletroniche',
-
# Search suggestions
'searchsuggest-search' => 'Ricercje',
'searchsuggest-containing' => 'che al à dentri...',
diff --git a/languages/messages/MessagesFy.php b/languages/messages/MessagesFy.php
index 50988227..a2ac05e2 100644
--- a/languages/messages/MessagesFy.php
+++ b/languages/messages/MessagesFy.php
@@ -281,7 +281,6 @@ $messages = array(
'qbbrowse' => 'Blêdzje',
'qbedit' => 'Bewurkje',
'qbpageoptions' => 'Side-opsjes',
-'qbpageinfo' => 'Side-ynfo',
'qbmyoptions' => 'Myn Opsjes',
'qbspecialpages' => 'Bysûndere siden',
'faq' => 'FAQ (faak stelde fragen)',
@@ -504,10 +503,8 @@ De oanfierde reden is ''$2''.",
# Login and logout pages
'logouttext' => "'''Jo binne no ôfmeld.'''
-Jo kinne de {{SITENAME}} fierders anonym brûke, of jo op 'e [[Special:UserLogin|nij oanmelde]] ûnder deselde of in oare namme.
+Jo kinne de {{SITENAME}} fierders anonym brûke, of jo op 'e <span class='plainlinks'>[$1 nij oanmelde]</span> ûnder deselde of in oare namme.
Mûglik wurdt noch in tal siden werjûn as wiene Jo oanmeld, oant Jo de cache fan Jo browser leegje.",
-'welcomecreation' => '<h2>Wolkom, $1!</h2><p>Jo ynstellings binne oanmakke.
-Ferjit net se oan jo foarkar oan te passen.',
'yourname' => 'Jo meidochnamme:',
'yourpassword' => 'Jo wachtwurd',
'yourpasswordagain' => 'Jo wachtwurd (nochris)',
@@ -740,7 +737,6 @@ In behearder hat de database blokkearre om de folgjende reden: $1",
'hiddencategories' => 'Dizze side falt yn de folgjende ferburgen
{{PLURAL:$1|kategory|kategoryen}}:',
'edittools' => '<!-- Tekst hjir stiet ûnder bewurkingsfjilden en oanbringfjilden. -->',
-'nocreatetitle' => 'It oanmeitsjen fan siden is beheind',
'nocreatetext' => '{{SITENAME}} hat de mûglikheid beheind om nije siden te meitsjen.
Jo kinne al besteande siden feroarje of jo kinne [[Special:UserLogin|jo oanmelde of in brûker oanmeitsje]].',
'nocreate-loggedin' => 'Jo meie gjin nije siden meitsje',
@@ -1158,11 +1154,13 @@ Jo kinne ek oaren de mûglikheid jaan kontakt mei jo op te nimmen troch in ferwi
'right-siteadmin' => 'De database blokkearje en wer frij jaan',
'right-override-export-depth' => 'Alle siden oant en mei in keppelingsdjipte fan fiif fuortskriuwe',
+# Special:Log/newusers
+'newuserlogpage' => 'Ynskriuwingsloch',
+'newuserlogpagetext' => "Dit is in loch fan meidoggers dy't de lêste tiid ynskreaun binne.",
+
# User rights log
'rightslog' => 'Rjochten-loch',
'rightslogtext' => 'Dit is in loch fan feroarings fan meidoggerrjochten.',
-'rightslogentry' => 'groep foar $1 feroare fan $2 yn $3',
-'rightsnone' => '(gjin)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'dizze side besjen',
@@ -1647,10 +1645,6 @@ Stipe protokollen: <code>$1</code>',
'activeusers' => 'Aktive meidoggers',
'activeusers-noresult' => 'Gjin meidoggers fûn.',
-# Special:Log/newusers
-'newuserlogpage' => 'Ynskriuwingsloch',
-'newuserlogpagetext' => "Dit is in loch fan meidoggers dy't de lêste tiid ynskreaun binne.",
-
# Special:ListGroupRights
'listgrouprights' => 'Rjochten fan brûkersgroepen',
'listgrouprights-summary' => 'Op dizze side steane de brûkersgroepen yn dizze wiki beskreaun, mei har derby hearrende rjochten.
@@ -1715,10 +1709,7 @@ At jo letter in side net mear folgje wolle, dan brûke jo op dy side de keppelin
'watching' => "Dwaande mei op'e folchlist te setten ...",
'unwatching' => "Dwaande mei fan'e folchlist ôf te heljen ...",
-'enotif_newpagetext' => 'Dit is in nije side.',
'enotif_impersonal_salutation' => 'meidogger fan {{SITENAME}}',
-'changed' => 'feroare',
-'created' => 'oanmakke',
'enotif_body' => 'Bêste $WATCHINGUSERNAME,
De {{SITENAME}}side \'$PAGETITLE\' is op $PAGEEDITDATE $CHANGEDORCREATED troch meidogger $PAGEEDITOR;
@@ -1742,6 +1733,8 @@ om jo folchlistynstellings te feroarjen.
Reaksjes en fierdere help:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'oanmakke',
+'changed' => 'feroare',
# Delete
'deletepage' => 'Wisk side',
@@ -2362,6 +2355,6 @@ Wolle jo de side wier op 'e nij skriuwe?",
# New logging system
'revdelete-restricted' => 'hat beheinings oplein oan behearders',
'revdelete-unrestricted' => 'hat beheinings foar behearders goedmakke',
-'newuserlog-byemail' => 'wachtwurd is ferstjoerd oer e-mail',
+'rightsnone' => '(gjin)',
);
diff --git a/languages/messages/MessagesGa.php b/languages/messages/MessagesGa.php
index 27fca7fc..71390335 100644
--- a/languages/messages/MessagesGa.php
+++ b/languages/messages/MessagesGa.php
@@ -237,7 +237,6 @@ $messages = array(
'qbbrowse' => 'Brabhsáil',
'qbedit' => 'Cuir in eagar',
'qbpageoptions' => 'An leathanach seo',
-'qbpageinfo' => 'Comhthéacs',
'qbmyoptions' => 'Mo chuid leathanaigh',
'qbspecialpages' => 'Leathanaigh speisialta',
'faq' => 'Ceisteanna Coiteanta',
@@ -476,11 +475,8 @@ An fáth ná ''$2''.",
# Login and logout pages
'logouttext' => "'''Tá tú logáilte amach anois.'''
-Is féidir leat an {{SITENAME}} a úsáid fós gan ainm, nó is féidir leat [[Special:UserLogin|logáil isteach arís]] mar an úsáideoir céanna, nó mar úsáideoir eile.
+Is féidir leat an {{SITENAME}} a úsáid fós gan ainm, nó is féidir leat <span class='plainlinks'>[$1 logáil isteach arís]</span> mar an úsáideoir céanna, nó mar úsáideoir eile.
Tabhair faoi deara go taispeáinfear roinnt leathanaigh mar atá tú logáilte isteach fós, go dtí go ghlanfá amach do taisce líonleitheora.",
-'welcomecreation' => '== Tá fáilte romhat, $1! ==
-
-Cruthaíodh do chuntas. Ná déan dearmad athrú a dhéanamh ar do chuid [[Special:Preferences|sainroghanna {{GRAMMAR:genitive|{{SITENAME}}}}]].',
'yourname' => "D'ainm úsáideora",
'yourpassword' => "D'fhocal faire",
'yourpasswordagain' => "Athiontráil d'fhocal faire",
@@ -956,6 +952,9 @@ do chuid dreachtaí a chur i leith tusa.',
'right-undelete' => 'Díscrios leathanach',
'right-userrights' => 'Cur gach cearta usáideoira in eagar',
+# Special:Log/newusers
+'newuserlogpage' => 'Log cruthú úsáideoira',
+
# User rights log
'rightslog' => 'Log cearta úsáideoira',
@@ -1250,9 +1249,6 @@ Féach freisin ar [[Special:WantedCategories|catagóirí faoi iarraidh]].',
# Special:ListUsers
'listusers-submit' => 'Taispeáin',
-# Special:Log/newusers
-'newuserlogpage' => 'Log cruthú úsáideoira',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Ghrúpa',
'listgrouprights-rights' => 'Cearta',
@@ -1317,11 +1313,7 @@ taobh istigh den tréimhse atá roghnaithe agat.',
'enotif_mailer' => 'Fógrasheoltóir as {{SITENAME}}',
'enotif_reset' => 'Marcáil gach leathanach bheith tadhlaithe',
-'enotif_newpagetext' => 'Is leathanach nua é seo.',
'enotif_impersonal_salutation' => 'úsáideoir {{SITENAME}}',
-'changed' => "D'athraigh",
-'created' => 'Chruthaigh',
-'enotif_subject' => ' $CHANGEDORCREATED $PAGEEDITOR an leathanach $PAGETITLE ag {{SITENAME}}.',
'enotif_lastvisited' => 'Féach ar $1 le haghaidh gach athrú a rinneadh ó thús na cuairte seo caite a rinne tú.',
'enotif_anon_editor' => 'úsáideoir gan ainm $1',
'enotif_body' => 'A $WATCHINGUSERNAME, a chara,
@@ -1351,6 +1343,8 @@ $UNWATCHURL
Aiseolas agus a thuilleadh cabhrach:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'Chruthaigh',
+'changed' => "D'athraigh",
# Delete
'deletepage' => 'Scrios an leathanach',
@@ -1467,7 +1461,7 @@ Is an téacs as na leagan scriosta seo ar fáil do riarthóirí amháin.',
'blanknamespace' => '(Gnáth)',
# Contributions
-'contributions' => 'Dréachtaí úsáideora',
+'contributions' => 'Dréachtaí {{GENDER:$1|úsáideora}}',
'contributions-title' => 'Dréachtaí úsáideora do $1',
'mycontris' => 'Dréachtaí',
'contribsub2' => 'Do $1 ($2)',
diff --git a/languages/messages/MessagesGag.php b/languages/messages/MessagesGag.php
index 8fb47df9..c736abdc 100644
--- a/languages/messages/MessagesGag.php
+++ b/languages/messages/MessagesGag.php
@@ -218,7 +218,6 @@ $messages = array(
'qbbrowse' => 'Taramaa',
'qbedit' => 'DiiÅŸtir',
'qbpageoptions' => 'Bu sayfa',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => 'Sayfalarım',
'qbspecialpages' => 'Maasus sayfalar',
'faq' => 'SSS',
@@ -375,11 +374,8 @@ Yalvarêrız benneyiniz URL - i hem raport ediniz bunu bir [[Special:ListUsers/s
'viewsourcetext' => 'Var nicä görmää hem kopiya etmää bu yapraa gelinirini:',
# Login and logout pages
-'logouttext' => 'Sessiyayı kapattınız.
-Şindi var nicä devam etmää kullanmaa {{SITENAME}} saytını kimlik göstermedän yaki [[Special:UserLogin|enidän sessiya açmaa]] (ister hep o kullanıcı adıylan, ister başka bir kullanıcı adıylan). O zamana kadar ani web brauzerinizin keşi temizlenecek bir takım sayfalar var nicä görünsün sansın sessiya hep açık.',
-'welcomecreation' => '== HoÅŸ geldiniz $1! ==
-
-Esapınız açıldı. Unutmayın [[Special:Preferences|{{SITENAME}} preferences]] seçimnerin diiştirmää.',
+'logouttext' => "Sessiyayı kapattınız.
+Şindi var nicä devam etmää kullanmaa {{SITENAME}} saytını kimlik göstermedän yaki <span class='plainlinks'>[$1 enidän sessiya açmaa]</span> (ister hep o kullanıcı adıylan, ister başka bir kullanıcı adıylan). O zamana kadar ani web brauzerinizin keşi temizlenecek bir takım sayfalar var nicä görünsün sansın sessiya hep açık.",
'yourname' => 'Kullanıcı adınız',
'yourpassword' => 'Parol',
'yourpasswordagain' => 'Parolu enidän yaz',
@@ -620,6 +616,9 @@ Aaramaanızın önünä ''all:'' prefiksini koyun da deneyin hepsi içlii aarama
'grouppage-sysop' => '{{ns:project}}:Önderciler',
+# Special:Log/newusers
+'newuserlogpage' => 'Eni kullanıcı bennemäkleri',
+
# User rights log
'rightslog' => 'Kullanıcı hakları jurnalı',
@@ -795,9 +794,6 @@ Sizin bakmaa [[Special:Watchlist|listasındaki]] sayfalar verildi '''kalın''' b
# Special:LinkSearch
'linksearch' => 'İç baalantlar',
-# Special:Log/newusers
-'newuserlogpage' => 'Eni kullanıcı bennemäkleri',
-
# Special:ListGroupRights
'listgrouprights-members' => '(azaların listası)',
diff --git a/languages/messages/MessagesGan.php b/languages/messages/MessagesGan.php
index 64c800e6..778b3f66 100644
--- a/languages/messages/MessagesGan.php
+++ b/languages/messages/MessagesGan.php
@@ -20,7 +20,7 @@ $namespaceNames = array(
NS_TALK => '談詑',
NS_USER => '用戶',
NS_USER_TALK => '用戶・談詑',
- NS_PROJECT_TALK => '$1_談詑',
+ NS_PROJECT_TALK => '$1・談詑',
NS_FILE => '文檔',
NS_FILE_TALK => '文檔・談詑',
NS_MEDIAWIKI_TALK => 'MediaWiki・談詑',
@@ -32,6 +32,10 @@ $namespaceNames = array(
NS_CATEGORY_TALK => '分類・談詑',
);
+$namespaceAliases = array(
+ '$1_談詑' => NS_PROJECT_TALK,
+);
+
$messages = array(
# Variants for Gan language
'variantname-gan-hans' => '简体',
diff --git a/languages/messages/MessagesGan_hans.php b/languages/messages/MessagesGan_hans.php
index 1703781b..983559c8 100644
--- a/languages/messages/MessagesGan_hans.php
+++ b/languages/messages/MessagesGan_hans.php
@@ -176,7 +176,6 @@ $messages = array(
'qbbrowse' => '查看',
'qbedit' => '编写',
'qbpageoptions' => '个页',
-'qbpageinfo' => '个页信æ¯',
'qbmyoptions' => 'å¶ð ®¶é€‰é¡¹',
'qbspecialpages' => '特殊页',
'faq' => 'FAQ',
@@ -401,10 +400,7 @@ $2',
# Login and logout pages
'logouttext' => "'''æ±é€€å‡ºæ­£å“©ã€‚'''
-接到æ±å¾—匿å使用{{SITENAME}},或[[Special:UserLogin|登入过]]。除éžæ±åˆ å¥æµè§ˆå™¨ç¼“存,åªæŠŠå­é¡µé¢å¯èƒ½ä¼šæŽ¥åˆ°è¯æ±ç³»ç™»å…¥çŠ¶æ€ã€‚",
-'welcomecreation' => '== 欢迎, $1! ==
-
-建正哩æ±ð ®¶å¸æˆ·ï¼ŒèŽ«ð«§è®°è®¾ç½® [[Special:Preferences|{{SITENAME}}𠮶个人å‚æ•°]]。',
+接到æ±å¾—匿å使用{{SITENAME}},或<span class='plainlinks'>[$1 登入过]</span>。除éžæ±åˆ å¥æµè§ˆå™¨ç¼“存,åªæŠŠå­é¡µé¢å¯èƒ½ä¼šæŽ¥åˆ°è¯æ±ç³»ç™»å…¥çŠ¶æ€ã€‚",
'yourname' => '用户å:',
'yourpassword' => '密ç ï¼š',
'yourpasswordagain' => '输过é“密ç ï¼š',
@@ -608,7 +604,6 @@ $2',
'template-semiprotected' => '(åŠä¿æŠ¤ï¼‰',
'hiddencategories' => '个åªç‰ˆé¢ç³»å±žäºŽ$1åªéšè—类𠮶æˆå‘˜ï¼š',
'edittools' => '<!--个首𠮶文本会到下底𠮶编辑åŒä¸Šä¼ åˆ—表里å¨æ˜¾ç¤ºã€‚ -->',
-'nocreatetitle' => '新建页é¢æ‹–é™åˆ¶',
'nocreatetext' => '个åªç½‘ç«™é™åˆ¶æ–°å»ºé¡µé¢ð ®¶åŠŸèƒ½ã€‚倷å¯ä»¥å›žå¤´åŽ»ç¼–辑有嘞𠮶页é¢ï¼Œæˆ–者[[Special:UserLogin|登入或新开å¸æˆ·]]。',
'nocreate-loggedin' => '倷到 {{SITENAME}} 冇æƒæ–°å¼€é¡µé¢ã€‚',
'permissionserrors' => 'æƒé™é”™è¯¯',
@@ -872,11 +867,12 @@ $2',
'grouppage-sysop' => '{{ns:project}}:æ“作员',
'grouppage-bureaucrat' => '{{ns:project}}:行政员',
+# Special:Log/newusers
+'newuserlogpage' => '新开户𠮶人åå•',
+
# User rights log
'rightslog' => '用户æƒé™æ—¥å¿—',
'rightslogtext' => '底下记到用户æƒé™ð ®¶æ›´æ”¹è®°å½•ã€‚',
-'rightslogentry' => 'æ‹¿ $1 𠮶æƒé™ä»Ž $2 改到 $3',
-'rightsnone' => '(冇)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => '编辑个页',
@@ -1234,9 +1230,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => '显示',
'listusers-noresult' => '寻伓到用户。',
-# Special:Log/newusers
-'newuserlogpage' => '新开户𠮶人åå•',
-
# Special:ListGroupRights
'listgrouprights-members' => '(æˆå‘˜åå•ï¼‰',
@@ -1294,11 +1287,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'enotif_mailer' => '{{SITENAME}}邮件报告员',
'enotif_reset' => '拿全部文章标æˆå·²è¯»',
-'enotif_newpagetext' => '个系新开𠮶页é¢ã€‚',
'enotif_impersonal_salutation' => '{{SITENAME}}用户',
-'changed' => '改åŸå˜ž',
-'created' => '建正嘞',
-'enotif_subject' => '{{SITENAME}}æœ‰é¡µé¢ $PAGETITLEæ‹–$PAGEEDITOR $CHANGEDORCREATED',
'enotif_lastvisited' => '眵倷上回访问åŽð ®¶å…¨éƒ¨æ”¹åŠ¨è¯·åŽ»$1。',
'enotif_lastdiff' => '想眵改动请去$1。',
'enotif_anon_editor' => '匿å用户$1',
@@ -1315,6 +1304,8 @@ $NEWPAGE
{{SITENAME}}通知系统 – 会改åŸå€·ð ®¶ç›‘视列表设置,请去 {{canonicalurl:{{#special:EditWatchlist}}}}
回馈åŒåˆ°åˆ«ð ®¶è¯´æ˜Ž: {{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => '建正嘞',
+'changed' => '改åŸå˜ž',
# Delete
'deletepage' => '删åŸé¡µé¢',
@@ -2269,6 +2260,9 @@ $3
# Special:Tags
'tag-filter' => '[[Special:Tags|标签]]过滤器:',
+# New logging system
+'rightsnone' => '(冇)',
+
# Search suggestions
'searchsuggest-search' => '寻å–',
diff --git a/languages/messages/MessagesGan_hant.php b/languages/messages/MessagesGan_hant.php
index a386bfc2..95b292c8 100644
--- a/languages/messages/MessagesGan_hant.php
+++ b/languages/messages/MessagesGan_hant.php
@@ -198,7 +198,6 @@ $messages = array(
'qbbrowse' => '查看',
'qbedit' => '編寫',
'qbpageoptions' => '箇é ',
-'qbpageinfo' => '箇é ä¿¡æ¯',
'qbmyoptions' => '我嗰é é¢',
'qbspecialpages' => '特殊é ',
'faq' => 'FAQ',
@@ -423,10 +422,7 @@ $2',
# Login and logout pages
'logouttext' => "'''æ±é€€å‡ºæ­£å“©ã€‚'''
-接到æ±å¾—匿å使用{{SITENAME}},或[[Special:UserLogin|登入éŽ]]。除éžæ±åˆªå¥ç€è¦½å™¨ç·©å­˜ï¼Œéš»æŠŠå­é é¢å¯èƒ½æœƒæŽ¥åˆ°è©±æ±ä¿‚登入狀態。",
-'welcomecreation' => '== æ­¡è¿Ž, $1! ==
-
-建正哩æ±å—°å¸³æˆ¶ï¼ŒèŽ«èªºè¨˜è¨­ç½® [[Special:Preferences|{{SITENAME}}嗰個人åƒæ•¸]]。',
+接到æ±å¾—匿å使用{{SITENAME}},或<span class='plainlinks'>[$1 登入éŽ]</span>。除éžæ±åˆªå¥ç€è¦½å™¨ç·©å­˜ï¼Œéš»æŠŠå­é é¢å¯èƒ½æœƒæŽ¥åˆ°è©±æ±ä¿‚登入狀態。",
'yourname' => '用戶å:',
'yourpassword' => '密碼:',
'yourpasswordagain' => '輸éŽé“密碼:',
@@ -630,7 +626,6 @@ $2',
'template-semiprotected' => '(åŠä¿è­·ï¼‰',
'hiddencategories' => '箇隻版é¢ä¿‚屬於$1隻隱è—é¡žå—°æˆå“¡ï¼š',
'edittools' => '<!--箇首嗰文本會到下底嗰編輯åŒä¸Šå‚³åˆ—表裡å¨é¡¯ç¤ºã€‚ -->',
-'nocreatetitle' => '新建é é¢æ‹•é™åˆ¶',
'nocreatetext' => '箇隻網站é™åˆ¶æ–°å»ºé é¢å—°åŠŸèƒ½ã€‚倷å¯ä»¥å›žé ­åŽ»ç·¨è¼¯æœ‰å˜žå—°é é¢ï¼Œæˆ–者[[Special:UserLogin|登入或新開帳戶]]。',
'nocreate-loggedin' => '倷到 {{SITENAME}} 冇權新開é é¢ã€‚',
'permissionserrors' => '許å¯æ¬ŠéŒ¯èª¤',
@@ -894,11 +889,12 @@ $2',
'grouppage-sysop' => '{{ns:project}}:æ“作員',
'grouppage-bureaucrat' => '{{ns:project}}:行政員',
+# Special:Log/newusers
+'newuserlogpage' => '新開戶嗰人åå–®',
+
# User rights log
'rightslog' => '用戶許å¯æ¬Šæ—¥èªŒ',
'rightslogtext' => '底下記到用戶許å¯æ¬Šå—°æ›´æ”¹è¨˜éŒ„。',
-'rightslogentry' => 'æ‹¿ $1 嗰許å¯æ¬Šå¾ž $2 改到 $3',
-'rightsnone' => '(冇)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => '編輯箇é ',
@@ -1256,9 +1252,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => '顯示',
'listusers-noresult' => '尋伓到用戶。',
-# Special:Log/newusers
-'newuserlogpage' => '新開戶嗰人åå–®',
-
# Special:ListGroupRights
'listgrouprights-members' => '(æˆå“¡å單)',
@@ -1316,11 +1309,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'enotif_mailer' => '{{SITENAME}}郵件報告員',
'enotif_reset' => '拿全部文章標æˆå·²è®€',
-'enotif_newpagetext' => '箇係新開嗰é é¢ã€‚',
'enotif_impersonal_salutation' => '{{SITENAME}}用戶',
-'changed' => '改åŸå˜ž',
-'created' => '建正嘞',
-'enotif_subject' => '{{SITENAME}}有é é¢ $PAGETITLEæ‹•$PAGEEDITOR $CHANGEDORCREATED',
'enotif_lastvisited' => '眵倷上回訪å•å¾Œå—°å…¨éƒ¨æ”¹å‹•è«‹åŽ»$1。',
'enotif_lastdiff' => '想眵改動請去$1。',
'enotif_anon_editor' => '匿å用戶$1',
@@ -1337,6 +1326,8 @@ $NEWPAGE
{{SITENAME}}通知系統 – 會改åŸå€·å—°ç›£è¦–列表設置,請去 {{canonicalurl:{{#special:EditWatchlist}}}}
回饋åŒåˆ°åˆ¥å—°èª¬æ˜Ž: {{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => '建正嘞',
+'changed' => '改åŸå˜ž',
# Delete
'deletepage' => '刪åŸé é¢',
@@ -2291,6 +2282,9 @@ $3
# Special:Tags
'tag-filter' => '[[Special:Tags|標籤]]éŽæ¿¾å™¨ï¼š',
+# New logging system
+'rightsnone' => '(冇)',
+
# Search suggestions
'searchsuggest-search' => 'å°‹å–',
diff --git a/languages/messages/MessagesGd.php b/languages/messages/MessagesGd.php
index 653a1944..b98db6cb 100644
--- a/languages/messages/MessagesGd.php
+++ b/languages/messages/MessagesGd.php
@@ -49,7 +49,7 @@ $messages = array(
'tog-editsection' => 'Cuir am comas deasachadh earainn le ceanglaichean [deasaich]',
'tog-editsectiononrightclick' => "Cuir an comas deasachadh earainn le briogadh deas air tiotal de dh'earrainn (feumaidh seo JavaScript)",
'tog-showtoc' => 'Seall an clàr-innse (air duilleagan air a bheil barrachd air 3 ceann-sgrìobhaidhean)',
-'tog-rememberpassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|latha|latha|làithean|latha}})",
+'tog-rememberpassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|làithean|latha}})",
'tog-watchcreations' => "Cuir duilleagan a chruthaicheas mi air a' chlàr-fhaire agam",
'tog-watchdefault' => "Cuir duilleagan a dheasaicheas mi air a' chlàr-fhaire agam",
'tog-watchmoves' => "Cuir duilleagan a ghluaiseas mi air a' chlàr-fhaire agam",
@@ -145,19 +145,19 @@ $messages = array(
'dec' => 'Dùbh',
# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Roinn-seòrsa|Roinn-seòrsa|Roinn-seòrsa|Roinn-seòrsa|Roinnean-seòrsa|Roinn-seòrsa}}',
+'pagecategories' => '{{PLURAL:$1|Roinn-seòrsa|Roinn-seòrsa|Roinnean-seòrsa|Roinn-seòrsa}}',
'category_header' => 'Duilleagan sa roinn "$1"',
'subcategories' => 'Fo-roinnean',
'category-media-header' => 'Meadhanan sa roinn "$1"',
'category-empty' => "''Chan eil duilleagan no meadhanan san roinn seo an-dràsta.''",
-'hidden-categories' => '{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte|Roinn-seòrsa fhalaichte}}',
+'hidden-categories' => '{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte|Roinn-seòrsa fhalaichte}}',
'hidden-category-category' => 'Roinnean falaichte',
-'category-subcat-count' => '{{PLURAL:$2|Chan eil san roinn-seòrsa ach an fho-roinn-seòrsa a leanas.|Tha {{PLURAL:$1|an fho-roinn-seòrsa|an $1 fho-roinn-seòrsa|an fho-roinn-seòrsa|an $1 fho-roinn-seòrsa|na $1 fo-roinnean-seòrsa|na $1 fo-roinn-seòrsa}}, aig an roinn-seòrsa a leanas, a-mach à $2 uile gu lèir.}}',
-'category-subcat-count-limited' => 'Tha {{PLURAL:$1|am fo-roinn-seòrsa|$1 na fo-roinntean-seòrsa|$1 na fo-roinntean-seòrsa|$1 na fo-roinntean-seòrsa|$1 na fo-roinntean-seòrsa|$1 na fo-roinntean-seòrsa}} a leanas sa roinn-seòrsa seo.',
-'category-article-count' => '{{PLURAL:$2|Chan eil ach an duilleag a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}',
-'category-article-count-limited' => 'Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag| an $1 duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa làithreach.',
-'category-file-count' => '{{PLURAL:$2|Chan eil ach am faidhle a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}',
-'category-file-count-limited' => 'Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle| an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.',
+'category-subcat-count' => '{{PLURAL:$2|Chan eil san roinn-seòrsa ach an fho-roinn-seòrsa a leanas.|Tha {{PLURAL:$1|an fho-roinn-seòrsa|an $1 fho-roinn-seòrsa|na $1 fo-roinnean-seòrsa|na $1 fo-roinn-seòrsa}}, aig an roinn-seòrsa a leanas, a-mach à $2 uile gu lèir.}}',
+'category-subcat-count-limited' => 'Tha {{PLURAL:$1|an fho-roinn-seòrsa|na fo-roinntean-seòrsa}} a leanas sa roinn-seòrsa seo.',
+'category-article-count' => '{{PLURAL:$2|Chan eil ach an duilleag a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}',
+'category-article-count-limited' => 'Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa làithreach.',
+'category-file-count' => '{{PLURAL:$2|Chan eil ach am faidhle a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}',
+'category-file-count-limited' => 'Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.',
'listingcontinuesabbrev' => 'leant.',
'index-category' => "Duilleagan air a' chlàr-innse",
'noindex-category' => "Duilleagan nach eil air a' chlàr-innse",
@@ -168,6 +168,7 @@ $messages = array(
'newwindow' => "(a' fosgladh ann an uinneag ùr)",
'cancel' => 'Sguir dheth',
'moredotdotdot' => 'Barrachd...',
+'morenotlisted' => 'Barrachd nach eil air an liosta...',
'mypage' => 'Duilleag',
'mytalk' => 'Deasbaireachd',
'anontalk' => 'Conaltradh airson an IP seo',
@@ -179,7 +180,6 @@ $messages = array(
'qbbrowse' => 'Brabhsaich',
'qbedit' => 'Deasaich',
'qbpageoptions' => 'An duilleag seo',
-'qbpageinfo' => 'Co-theacs',
'qbmyoptions' => 'Na duilleagan agam',
'qbspecialpages' => 'Duilleagan sònraichte',
'faq' => 'CÀBHA',
@@ -202,6 +202,7 @@ $messages = array(
'namespaces' => 'Namespaces',
'variants' => 'Tionndaidhean',
+'navigation-heading' => 'Clàr-taice na seòladaireachd',
'errorpagetitle' => 'Mearachd',
'returnto' => 'Till dhan duilleag a leanas: $1',
'tagline' => 'O {{SITENAME}}',
@@ -223,8 +224,8 @@ $messages = array(
'create-this-page' => 'Cruthaich an duilleag seo',
'delete' => 'Sguab às',
'deletethispage' => 'Sguab às an duilleag seo',
-'undelete_short' => "Neo-dhèan sguabadh às de {{PLURAL:$1|dh'aon deasachadh|$1 dheasachadh|$1 deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}}",
-'viewdeleted_short' => 'Seall {{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às',
+'undelete_short' => "Neo-dhèan sguabadh às de {{PLURAL:$1|dh'aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}}",
+'viewdeleted_short' => 'Seall {{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às',
'protect' => 'Dìon',
'protect_change' => 'mùth',
'protectthispage' => 'Dìon an duilleag seo',
@@ -252,7 +253,7 @@ $messages = array(
'redirectedfrom' => '(Air ath-sheòladh o $1)',
'redirectpagesub' => 'Ath-sheòl an duilleag',
'lastmodifiedat' => 'Chaidh an duilleag seo a mhùthadh $1 aig $2 turas mu dheireadh.',
-'viewcount' => 'Chaidh inntrigeadh a dhèanam dhan duilleag seo {{PLURAL:$1|aon turas|$1 thuras|$1 turas|$1 turais|$1 turas}}.',
+'viewcount' => 'Chaidh inntrigeadh a dhèanamh dhan duilleag seo {{PLURAL:$1|aon turas|$1 thuras|$1 turais|$1 turas}}.',
'protectedpage' => 'Duilleag fo dhìon',
'jumpto' => 'Gearr leum gu:',
'jumptonavigation' => 'seòladh',
@@ -281,7 +282,7 @@ $1",
'mainpage' => 'Prìomh dhuilleag',
'mainpage-description' => 'Prìomh dhuilleag',
'policy-url' => 'Project:Poileasaidh',
-'portal' => 'Doras na Coimhearsnachd',
+'portal' => 'Doras na coimhearsnachd',
'portal-url' => 'Project:Doras na coimhearsnachd',
'privacy' => 'Am polasaidh prìobhaideachd',
'privacypage' => 'Project:Am polasaidh prìobhaideachd',
@@ -299,10 +300,10 @@ Seall air [[Special:Version|duilleag an tionndaidh]].',
'youhavenewmessages' => 'Tha $1 ($2) agad.',
'newmessageslink' => 'teachdaireachdan ùra',
'newmessagesdifflink' => 'mùthadh mu dheireadh',
-'youhavenewmessagesfromusers' => 'Tha $1 o {{PLURAL:$3|aon chleachdaiche|$3 chleachdaiche|$3 chleachdaiche|$3 chleachdaiche|$3 cleachdaichean|$3 cleachdaiche}} agad ($2).',
+'youhavenewmessagesfromusers' => 'Tha $1 o {{PLURAL:$3|aon chleachdaiche|$3 chleachdaiche|$3 cleachdaichean|$3 cleachdaiche}} agad ($2).',
'youhavenewmessagesmanyusers' => 'Tha $1 agad o iomadh cleachdaiche ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|aon teachdaireachd ùr|$1 theachdaireachd ùr|$1 teachdaireachd ùr|$1 theachdaireachd ùr|$1 teachdaireachdan ùra|$1 teachdaireachd ùr}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|am mùthadh|an $1 mhùthadh|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|na $1 mùthadh}} mu dheireadh',
+'newmessageslinkplural' => '{{PLURAL:$1|aon teachdaireachd ùr|$1 theachdaireachd ùr|$1 teachdaireachdan ùra|$1 teachdaireachd ùr}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|am mùthadh|an $1 mhùthadh|na $1 mùthaidhean|na $1 mùthadh}} mu dheireadh',
'youhavenewmessagesmulti' => 'Tha teachdaireachdan ùra agad ann an $1',
'editsection' => 'deasaich',
'editold' => 'deasaich',
@@ -317,7 +318,7 @@ Seall air [[Special:Version|duilleag an tionndaidh]].',
'collapsible-expand' => 'Leudaich',
'thisisdeleted' => 'Seall no aisig $1?',
'viewdeleted' => 'Seall $1?',
-'restorelink' => '{{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às',
+'restorelink' => '{{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às',
'feedlinks' => 'Inbhir:',
'feed-invalid' => "Seòrsa mì-dhligheach de dh'fho-sgrìobhadh inbhir.",
'feed-unavailable' => 'Chan eil inbhirean co-bhanntachd ri fhaighinn',
@@ -401,8 +402,8 @@ Cha deach adhbhar a thoirt seachad.',
'badtitle' => 'Droch thiotal',
'badtitletext' => "Bha an duilleag a dh'iarr thu mì-dhligheach, falamh no le tiotal eadar-chànanach no eadar-uici air a dhroch cheangal.
Faodaidh gu bheil aon no barrachd charactairean ann nach urrainn dhut a chleachdadh ann an tiotalan.",
-'perfcached' => "Chaidh an dàta a leanas a thasgadh 's faodaidh gu bheil e air dheireadh. Tha {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
-'perfcachedts' => "Chaidh an dàta a leanas a thasgadh agus chaidh ùradhadh $1 turas mu dheireadh. Tha {{PLURAL:$4|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
+'perfcached' => "Chaidh an dàta a leanas a thasgadh 's faodaidh gu bheil e air dheireadh. Tha {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
+'perfcachedts' => "Chaidh an dàta a leanas a thasgadh agus chaidh ùrachadh $1 turas mu dheireadh. Tha {{PLURAL:$4|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
'querypage-no-updates' => 'Tha ùrachadh air a chur à comas air an duilleag seo an-dràsta.
Cha dèid an dàta an-seo ùrachadh aig an àm seo.',
'wrong_wfQuery_params' => 'Paramatairean mì-cheart airson wfQuery()<br />
@@ -443,15 +444,15 @@ Thug an rianaire a ghlais e seachad an t-adhbhar a leanas: "$3".',
# Login and logout pages
'logouttext' => "'''Chaidh do logadh a-mach.'''
-'S urrainn dhut leantainn air adhart a' cleachdadh {{SITENAME}} a chleachdadh gun urra no 's urrainn dhut [[Special:UserLogin|logadh a-steach a-rithist]] mar an dearbh-chleachdaiche no mar chleachdaiche eile.
+'S urrainn dhut leantainn air adhart a' cleachdadh {{SITENAME}} a chleachdadh gun urra no 's urrainn dhut <span class='plainlinks'>[$1 logadh a-steach a-rithist]</span> mar an dearbh-chleachdaiche no mar chleachdaiche eile.
Thoir an aire gum bi coltas air cuide dhe na duilleagan mar gum biodh tu air logadh a-steach gus am falamhaich thu tasgadan a' bhrabhsair agad.",
-'welcomecreation' => '== Fàilte ort, $1! ==
-Chaidh an cunntas agad a chruthachadh.
+'welcomeuser' => 'Fàilte ort, $1',
+'welcomecreation-msg' => 'Chaidh an cunntas agad a chruthachadh.
Na dìochuimhnich na [[Special:Preferences|roghainnean agad air {{SITENAME}}]] a ghleusadh dhut fhèin.',
'yourname' => 'Ainm-cleachdaiche:',
'yourpassword' => 'Am facal-faire agad',
'yourpasswordagain' => 'Ath-sgrìobh facal-faire',
-'remembermypassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|làithean}})",
+'remembermypassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|làithean|latha}})",
'securelogin-stick-https' => 'Glèidh an ceangal ri HTTPS as dèidh logadh a-steach',
'yourdomainname' => 'An àrainn-lìn agad:',
'password-change-forbidden' => 'Chan urrainn dhut faclan-faire atharrachadh air an uicipeid seo.',
@@ -470,7 +471,7 @@ Na dìochuimhnich na [[Special:Preferences|roghainnean agad air {{SITENAME}}]] a
'gotaccount' => 'A bheil cunntas agad mu thràth? $1.',
'gotaccountlink' => 'Log a-steach',
'userlogin-resetlink' => "Na dhìochuimhnich thu d' ainm is facal-faire?",
-'createaccountmail' => 'Le post-d',
+'createaccountmail' => "Cleachd facal-faire sealach air thuaiream agus cuir e dhan phost-d a tha 'ga shònrachadh gu h-ìosal",
'createaccountreason' => 'Adhbhar:',
'badretype' => "Chan eil an dà fhacal-faire a chuir thu a-steach a' freagairt ri chèile.",
'userexists' => "Tha an t-ainm-cleachdaiche a chuir thu a-steach 'ga chleachdadh mu thràth.
@@ -500,15 +501,14 @@ Cuir sùil air an litreachadh.',
Am feuch thu ris a-rithist?',
'wrongpasswordempty' => 'Cha do chuir thu a-steach facal-faire.
Feuch ris a-rithist.',
-'passwordtooshort' => "Feumaidh faclan-faire a bhith {{PLURAL:$1|$1 charactar|$1 charactar|$1 caractaran|$1 charactar|$1 charactar|$1 caractaran|$1 caractar}} a dh'fhaid air a' char as lugha.",
+'passwordtooshort' => "Feumaidh faclan-faire a bhith {{PLURAL:$1|$1 charactar|$1 charactar|$1 caractaran|$1 caractar}} a dh'fhaid air a' char as lugha.",
'password-name-match' => "Chan fhaod am facal-faire 's an t-ainm-cleachdaiche agad a bhith co-ionnann.",
'password-login-forbidden' => "Tha an t-ainm-cleachdaiche 's am facal-faire seo toirmisgte.",
'mailmypassword' => "Cuir facal-faire ùr thugam air a' phost-dealain",
'passwordremindertitle' => 'Facal-faire sealach ùr airson {{SITENAME}}',
-'passwordremindertext' => 'Dh\'iarr cuideigin (\'s mathaid gun do dh\'iarr thusa seo on t-seòladh IP $1) facal-fair ùr airson
-{{SITENAME}} ($4). Chaidh facal-faire sealach a chruthachadh airson "$2" a tha \'na "$3".
+'passwordremindertext' => 'Dh\'iarr cuideigin (\'s mathaid gun do dh\'iarr thusa seo on t-seòladh IP $1) facal-faire ùr airson {{SITENAME}} ($4). Chaidh facal-faire sealach a chruthachadh airson "$2" a tha \'na "$3".
Ma bha sin fa-near dhut, bidh agad ri clàradh a-steach agus facal-faire ùr a thaghadh
-an-dràsta fhèin. Falbhaidh an ùine air an fhacal-fhaire sealach agad ann an {{PLURAL:$5|$5 latha|$5 latha|$5 làithean|$5 latha|$5 latha|$5 làithean|$5 latha}}.
+an-dràsta fhèin. Falbhaidh an ùine air an fhacal-fhaire sealach agad ann an {{PLURAL:$5|$5 latha|$5 latha|$5 làithean|$5 latha}}.
Ma dh\'iarr cuideigin eile seo no ma chuimhnich thu am facal-faire agad \'s mur eil thu
airson atharrachadh tuilleadh, \'s urrainn dhut an teachdaireachd seo a leigeil seachad
@@ -520,10 +520,10 @@ Clàraich a-steach a-rithist nuair a gheibh thu e.',
'blocked-mailpassword' => "Chaidh bacadh a chur air an t-seòladh IP agad 's chan eil cead deasachaidh agad agus chan urrainn dhut an gleus a chum aiseag an fhacail-fhaire a chleachdadh gus casg a chur air mì-ghnàthachadh.",
'eauthentsent' => 'Chaidh post-d dearbhaidh a chur dhan phost-d a chaidh ainmeachadh.
Mus dèid post-d sam bith eile a chur dhan chunntas, feumaidh tu leantainn ris an treòrachadh sa phost-d mar dhearbhadh gur ann agadsa a tha an cunntas.',
-'throttled-mailpassword' => 'Chaidh cuimhneachan facail-fhaire a chur mu thràth san {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair|$1 uair|$1 uairean|$1 uair}} a thìde.
-Gus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair|$1 uair|$1 uairean|$1 uair}} a thìde.',
+'throttled-mailpassword' => 'Chaidh post-d a chur airson ath-shuidheachadh facail-fhaire mu thràth {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde air ais.
+Gus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde.',
'mailerror' => "Mearachd a' cur post: $1",
-'acct_creation_throttle_hit' => "Chruthaich na h-aoighean air an Uici seo {{PLURAL:$1|chunntas|chunntas|chunntas|chunntas|cunntasan|cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
+'acct_creation_throttle_hit' => "Chruthaich na h-aoighean air an Uici seo {{PLURAL:$1|1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
'emailauthenticated' => 'Chaidh an seòladh puist-dhealain agad a dhearbhadh $2 aig $3.',
'emailnotauthenticated' => 'Cha deach am post-d agad a dhearbhadh fhathast.
Cha dèid post-d a chur airson gin dhe na feartan a leanas.',
@@ -547,9 +547,10 @@ Fuirich ort mus feuch thu ris a-rithist.",
'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.",
-# E-mail sending
+# Email sending
'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.',
# Change password dialog
'resetpass' => 'Atharraich am facal-faire',
@@ -572,7 +573,7 @@ Saoil an do dh'atharraich thu am facal-faire agad mu thràth no an do dh'iarr th
# Special:PasswordReset
'passwordreset' => 'Ath-shuidhich am facal-faire',
-'passwordreset-text' => "Lìon am foirm seo gus post-d fhaighinn sa bheil mion-fhiosrachadh a' chunntais agad.",
+'passwordreset-text' => 'Lìon am foirm seo gus am facal-faire agad ath-shuidheachadh.',
'passwordreset-legend' => 'Ath-shuidhich am facal-faire',
'passwordreset-disabled' => 'Chaidh ath-shuidheachadh nam faclan-faire a chur à comas air an uicipeid seo.',
'passwordreset-pretext' => '{{PLURAL:$1||Cuir a-steach aon dhe na pìosan dàta gu h-ìosal}}',
@@ -582,22 +583,22 @@ Saoil an do dh'atharraich thu am facal-faire agad mu thràth no an do dh'iarr th
'passwordreset-capture-help' => 'Ma chuireas tu cromag sa bhogsa seo, chì thusa am post-d (leis an fhacal-fhaire sealach) agus gheibh an cleachdaiche e cuideachd.',
'passwordreset-email' => 'Seòladh puist-d:',
'passwordreset-emailtitle' => "Dàta a' chunntais air {{SITENAME}}",
-'passwordreset-emailtext-ip' => "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas|an dà chunntas|na cunntasan|na cunntasan|na cunntasan|na cunntasan}} a leanas co-cheangailte ris a' phost-d seo:
+'passwordreset-emailtext-ip' => "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) am facal-faire airson {{SITENAME}} ($4) ath-shuidheachadh. Tha {{PLURAL:$3|an cunntas|an dà chunntas|na $3 cunntasan|na $3 cunntas}} a leanas co-cheangailte ris a' phost-d seo:
$2
-Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an dà fhacal-faire|na faclan-faire|na faclan-faire|na faclan-faire|na faclan-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 latha|$5 latha|$5 làithean|$5 latha}}.
+Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.
Bu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
-'passwordreset-emailtext-user' => "Dh'iarr an cleachdaiche $1 air {{SITENAME}} cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas agad air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an dà chunntas-cleachdaiche|na cunntasan-cleachdaiche|na cunntasan-cleachdaiche|na cunntasan-cleachdaiche|na cunntasan-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:
+'passwordreset-emailtext-user' => "Dh'iarr an cleachdaiche $1 air {{SITENAME}} ath-shuidheachadh an fhacail-fhaire air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an $3 chunntas-cleachdaiche|na $3 cunntasan-cleachdaiche|na $3 cunntas-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:
$2
-Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an dà fhacal-faire|na faclan-faire|na faclan-faire|na faclan-faire|na faclan-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 latha|$5 latha|$5 làithean|$5 latha}}.
+Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.
Bu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
'passwordreset-emailelement' => 'Ainm-cleachdaiche: $1
Facal-faire sealach: $2',
-'passwordreset-emailsent' => "Chaidh cuimhneachan a chur air a' phost-d.",
-'passwordreset-emailsent-capture' => "Chaidh cuimhneachan a chur air a' phost-d agus chì thu sin gu h-ìosal.",
+'passwordreset-emailsent' => 'Chaidh post-d airson ath-shuidheachadh an fhacail-fhaire a chur.',
+'passwordreset-emailsent-capture' => 'Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a chur agus chì thu sin gu h-ìosal.',
'passwordreset-emailerror-capture' => "Chaidh cuimhneachan a chur air a' phost-d agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
# Special:ChangeEmail
@@ -608,6 +609,7 @@ Facal-faire sealach: $2',
'changeemail-oldemail' => 'An seòladh puist-d làithreach:',
'changeemail-newemail' => 'An seòladh puist-d ùr:',
'changeemail-none' => '(chan eil gin)',
+'changeemail-password' => 'Am facal-faire agad air {{SITENAME}}:',
'changeemail-submit' => 'Atharraich am post-d',
'changeemail-cancel' => 'Sguir dheth',
@@ -778,9 +780,9 @@ Tha thu a' toirt geall cuideachd gun do sgrìobh thu fhèin seo no gun do rinn t
Mur eil thu ag iarraidh an sgrìobhaidh agad a dheasaichear is a sgaoilear le càch, na cuir e.<br />
Ma dh'fhoilleachas tu rudeigin an seo, bidh tu a' dearbhadh gun do sgrìobh thu fhèin e, no gur ann às an raon phòballach a thàinig e; thoir aire '''nach eil''' sin a' gabhail a-staigh duilleagan-lìn mar as àbhaist (seall $1 airson barrachd fiosrachaidh). <br />
'''NA CLEACHDAIBH SAOTHAIR FO DHLIGHE-SGRÃŒOBHAIDH GUN CHEAD!'''",
-'longpageerror' => "'''Mearachd: Tha an teacsa a chur thu thugainn {{PLURAL:$1 kilobyte|$1 kilobyte|$1 kilobyte|$1 kilobyte|$1 kilobyte|$1 kilobyte|}} a dh'fhaid is tha sin nas fhaide na tha ceadaichte ({{PLURAL:$1 kilobyte|$2 kilobyte|$2 kilobyte|$2 kilobyte|$2 kilobyte|$2 kilobyte|}}).'''
+'longpageerror' => "Mearachd: Tha an teacsa a chur thu thugainn {{PLURAL:$1 kilobyte|$1 kilobytes}} a dh'fhaid is tha sin nas fhaide na tha ceadaichte ({{PLURAL:$2 kilobyte|$2 kilobytes}}).'''
Cha ghabh a shàbhaladh.",
-'readonlywarning' => "'''Rabhadh: Chaidh an stòr-dàta a ghlasadh a chum obair-ghlèidhidh agus chan urrainn dhut na còraichean-deasachaidh agad a chur gu feum an-dràsta fhèin.'''
+'readonlywarning' => "'''Rabhadh: Chaidh an stòr-dàta a ghlasadh a chum obair-ghlèidhidh agus chan urrainn dhut na dheasaich thu a shàbhaladh an-dràsta fhèin.'''
'S mathaid gum b' fheairrde dhut lethbhreac a dhèanamh dhen teacsa agus a shàbhaladh ann am faidhle ach an urrainn dhut a chleachdadh as a dhèidh seo.
Seo am mìneachadh a thug an rianaire a ghlais e: $1",
@@ -791,21 +793,20 @@ Seo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
'cascadeprotectedwarning' => "'''Rabhadh:''' Chaidh an duilleag seo a dhìon 's chan fhaod ach rianairean a dheasachadh a chionn 's gun robh e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a tha cascade-protected.",
'titleprotectedwarning' => "'''Rabhadh: Chaidh an duilleag seo a dhìon 's feumar [[Special:ListGroupRights|còraichean sònraichte]] gus a dheasachadh.'''
Seo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
-'templatesused' => "Tha {{PLURAL:$1|teamplaid|theamplaid||teamplaid|theamplaid|teamplaidean|teamplaid}} 'gan cleachdadh air an duilleag seo:",
-'templatesusedpreview' => "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh}} san ro-shealladh seo:",
-'templatesusedsection' => "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh|teamplaidean 'gan cleachdadh}} san earrann seo:",
+'templatesused' => "Tha {{PLURAL:$1|teamplaid|theamplaid|teamplaidean|teamplaid}} 'gan cleachdadh air an duilleag seo:",
+'templatesusedpreview' => "Tha {{PLURAL:$1|1 teamplaid 'ga cleachdadh|$1 theamplaid 'gan cleachdadh|$1 teamplaidean 'gan cleachdadh|$1 teamplaid 'gan cleachdadh}} san ro-shealladh seo:",
+'templatesusedsection' => "Tha {{PLURAL:$1|$1 teamplaid 'ga cleachdadh|$1 theamplaid 'gan cleachdadh|$1 teamplaidean 'gan cleachdadh|$1 teamplaid 'gan cleachdadh}} san earrann seo:",
'template-protected' => '(air a dhìon)',
'template-semiprotected' => '(air a leth-dhìon)',
-'hiddencategories' => "Tha an duilleag seo 'na ball de {{PLURAL:$1|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|$1 roinnean-seòrsa falaichte|$1 roinn-seòrsa fhalaichte}}:",
-'nocreatetitle' => 'Tha cruthachadh dhuilleagan cuingichte',
+'hiddencategories' => "Tha an duilleag seo 'na ball de {{PLURAL:$1|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|$1 roinnean-seòrsa falaichte|$1 roinn-seòrsa fhalaichte}}:",
'nocreatetext' => "Chuir {{SITENAME}} bacadh air cruthachadh de dhuilleagan ùra.
'S urrainn dhut tilleadh is duilleag a tha ann mu thràth a dheasachadh no [[Special:UserLogin|clàradh a-steach no cunntas a chruthachadh]].",
'nocreate-loggedin' => 'Chan eil cead agad duilleagan ùra a chruthachadh.',
'sectioneditnotsupported-title' => 'Chan eil taic ri deasachadh earrannan',
'sectioneditnotsupported-text' => 'Chan eil taic ri deasachadh earrannan air an duilleag seo.',
'permissionserrors' => "Meareachd leis a' chead",
-'permissionserrorstext' => 'Chan eil cead agad sin a dhèanamh air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan|an adhbhair|nan adhbharan|nan adhbharan}} a leanas:',
-'permissionserrorstext-withaction' => 'Chan eil cead agad airson "$2" air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan|an adhbhair|nan adhbharan|nan adhbharan}} a leanas:',
+'permissionserrorstext' => 'Chan eil cead agad sin a dhèanamh air sgàth {{PLURAL:$1|an adhbhair|an $1 adhbhar|nan $1 adhbharan|nan $1 adhbhar}} a leanas:',
+'permissionserrorstext-withaction' => 'Chan eil cead agad airson "$2" air sgàth {{PLURAL:$1|an $1 adhbhair|an $1 adhbhar|nan $1 adhbharan|nan $1 adhbhar}} a leanas:',
'recreate-moveddeleted-warn' => "'''Rabhadh: Tha thu gu bhith ath-chruthachadh duilleag a chaidh a sguabadh às roimhe.'''
Saoil am bu chòir dhut leantainn air adhart le deasachadh na duilleige?.
@@ -822,6 +823,15 @@ Tha coltas gun deach a sguabadh às.",
'edit-already-exists' => "Cha b' urrainn dhuinn an duilleag ùr a chruthachadh.
Tha e ann mu thràth.",
'defaultmessagetext' => 'Teacsa bunaiteach na teachdaireachd',
+'content-failed-to-parse' => "Dh'fhàillig parsadh susbaint $2 airson modail $1: $3",
+'invalid-content-data' => 'Dàta susbaint a tha mì-dhligheach',
+'content-not-allowed-here' => 'Chan eil susbaint "$1" ceadaichte air an duilleag [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'teacsa lom',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Rabhadh:''' Tha cus expensive parser function calls san duilleag seo.
@@ -861,7 +871,7 @@ Mìneachadh: '''({{int:cur}})''' = an diofar eadar e 's am mùthadh as ùire, ''
'history-show-deleted' => 'Na chaidh sguabadh às a-mhàin',
'histfirst' => 'As sine',
'histlast' => 'As ùire',
-'historysize' => '({{PLURAL:$1|1 bhaidt|$1 bhaidht|$1 bhaidht|$1 bhaidht|$1 baidht|$1 baidht}})',
+'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
'historyempty' => '(falamh)',
# Revision feed
@@ -878,10 +888,18 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
'rev-deleted-event' => '(chaidh gnìomh an loga a thoirt air falbh)',
'rev-delundel' => 'seall/falaich',
'rev-showdeleted' => 'seall',
+'revdelete-selected' => "'''{{PLURAL:$2|Lèirmheas|Lèirmheasan}} de [[:$1]] a thagh thu:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|An tachartas loga|Na tachartasan loga}} a thagh thu:'''",
'revdelete-hide-user' => 'Falaich ainm-cleachdaiche/seòladh IP an deasaiche',
+'revdelete-radio-same' => '(na atharraich)',
+'revdelete-radio-set' => 'Dèan seo',
+'revdelete-radio-unset' => 'Na dèan seo',
+'revdelete-log' => 'Adhbhar:',
+'revdelete-submit' => 'Cuir air {{PLURAL:$1|an lèirmheas|na lèirmheasan}} a thagh thu',
'revdel-restore' => 'mùth follaiseachd',
'revdel-restore-deleted' => 'mùthaidhean a chaidh a sguabadh às',
'revdel-restore-visible' => 'mùthaidhean faicsinneach',
+'pagehist' => 'Eachdraidh na duilleige',
'revdelete-otherreason' => 'Adhbhar eile/a bharrachd:',
'revdelete-reasonotherlist' => 'Adhbhar eile',
'revdelete-edit-reasonlist' => 'Deasaich adhbharan an sguabaidh às',
@@ -896,10 +914,13 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
# Diffs
'history-title' => 'Eachdraidh nam mùthaidhean aig "$1"',
+'difference-multipage' => '(An diofar eadar na duilleagan)',
'lineno' => 'Loidhne $1:',
'compareselectedversions' => 'Dèan coimeas eadar na mùthaidhean a thagh thu',
+'showhideselectedversions' => 'Seall/Falaich na lèirmheasan a thagh thu',
'editundo' => 'neo-dhèan',
-'diff-multi' => '({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
+'diff-multi' => '({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
# Search results
'searchresults' => 'Toraidhean rannsachaidh',
@@ -907,17 +928,21 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
'searchresulttext' => 'Airson barrachd fiosrachaidh mu rannsachadh {{SITENAME}}, cuir sùil air [[{{MediaWiki:Helppage}}|{{int:help}}]].',
'searchsubtitle' => 'Lorg thu \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|gach duilleag a tha a\' tòiseachadh le "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|gach duilleag a tha a\' ceangal ri "$1"]])',
'searchsubtitleinvalid' => "Lorg thu airson '''$1'''",
+'toomanymatches' => 'Fhuaras cus thoraidhean, feuch ceist eile',
+'titlematches' => "Tiotalan dhuilleagan a tha a' maidseadh",
'notitlematches' => "Chan eil tiotal de dhuilleag sam bith a' freagairt ris",
'notextmatches' => "Chan eil tiotal de dhuilleag sam bith a' freagairt ris",
-'prevn' => 'an {{PLURAL:$1|$1}} mu dheireadh',
+'prevn' => 'an {{PLURAL:$1|$1}} roimhe',
'nextn' => 'an ath {{PLURAL:$1|$1}}',
-'prevn-title' => '$1 {{PLURAL:$1|toradh|thoradh|toradh|thoradh|toraidhean|toradh}} roimhe',
-'nextn-title' => 'An ath $1 {{PLURAL:$1|toradh|thoradh|toradh|thoradh|toraidhean|toradh}}',
-'shown-title' => 'Seall $1 {{PLURAL:$1|toradh|thoradh|thoradh|toradh|toraidhean|toradh}} air gach duilleag',
+'prevn-title' => '$1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} roimhe',
+'nextn-title' => 'An ath $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}}',
+'shown-title' => 'Seall $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} air gach duilleag',
'viewprevnext' => 'Seall ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-legend' => 'Roghainnean luirg',
'searchmenu-exists' => "'''Tha duilleag air a bheil \"[[:\$1]]\" air an uicipeid seo.'''",
'searchmenu-new' => "'''Cruthaich an duilleag \"[[:\$1]]\" air an uicipeid seo!'''",
'searchhelp-url' => 'Help:Cuideachadh',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Rùraich duilleagan aig a bheil an ro-leasachan seo]]',
'searchprofile-articles' => 'Duilleagan susbainte',
'searchprofile-project' => "Duilleagan nan cobharach 's nam pròiseactan",
'searchprofile-images' => 'Ioma-mheadhanan',
@@ -928,8 +953,9 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
'searchprofile-images-tooltip' => 'Lorg faidhlichean',
'searchprofile-everything-tooltip' => "Lorg am broinn susbaint sam bith (a' gabhail a-steach nan duilleagan deasbaireachd)",
'searchprofile-advanced-tooltip' => 'Lorg am broinn ainm-spàsan gnàthaichte',
-'search-result-size' => '$1 ({{PLURAL:$2|1 fhacal|$2 fhacal|1 fhacal|$2 fhacal|$2 faclan|$2 facal}})',
-'search-result-category-size' => '{{PLURAL:$1|1 bhall|$1 bhall|$1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|1 fho-roinn|$2 fho-roinn|$2 fho-roinn|$2 fho-roinn|$2 fo-roinnean|$2 fo-roinn}}, {{PLURAL:$3|1 fhaidhle|$3 fhaidhle|$3 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})',
+'search-result-size' => '$1 ({{PLURAL:$2 fhacal|$2 fhacal|$2 faclan|$2 facal}})',
+'search-result-category-size' => '{{PLURAL:$1|1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|1 fho-roinn|$2 fho-roinn|$2 fo-roinnean|$2 fo-roinn}}, {{PLURAL:$3|1 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})',
+'search-result-score' => 'Buntainneas: $1%',
'search-redirect' => '(ag ath-sheòladh $1)',
'search-section' => '(earrann $1)',
'search-suggest' => 'An e na leanas a bha fa-near dhut: $1',
@@ -937,10 +963,12 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
'search-interwiki-default' => 'Toraidhean $1:',
'search-interwiki-more' => '(barrachd)',
'search-relatedarticle' => 'Co-cheangailte',
+'mwsuggest-disable' => 'Cuir na molaidhean luirg à comas',
+'searcheverything-enable' => 'Seall anns na namespaces air fad',
'searchrelated' => 'co-cheangailte',
'searchall' => 'a h-uile',
-'showingresults' => "A' nochdadh suas gu $1 {{PLURAL:$1|toradh|thoradh|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
-'showingresultsnum' => "A' nochdadh '''$3''' {{PLURAL:$3|toradh|thoradh|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
+'showingresults' => "A' nochdadh suas gu $1 {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
+'showingresultsnum' => "A' nochdadh '''$3''' {{PLURAL:$3|$3 toradh|$3 thoradh|$3 toraidhean|$3 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
'showingresultsheader' => "{{PLURAL:$5|Toradh '''$1''' à '''$3'''|Toraidhean '''$1 - $2''' of '''$3'''}} airson '''$4'''",
'nonefound' => "'''Aire''': Chan dèid ach cuid dhe na namespaces a lorg a ghnàth.
Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèanamh am broinn na susbainte gu lèir (a' gabhail a-steach nan duilleagan conaltraidh, teamplaidean is msaa), no cleachd an namespace a bha thu ag iarraidh mar ro-leasachan.",
@@ -950,22 +978,42 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
'powersearch-ns' => 'Lorg ann an namespaces:',
'powersearch-redir' => 'Seall ath-sheòlaidhean',
'powersearch-field' => 'Lorg',
+'powersearch-togglelabel' => 'Sgrùd:',
+'powersearch-toggleall' => 'Na h-uile',
+'powersearch-togglenone' => 'Chan eil gin',
+'search-external' => 'Lorg air an taobh a-muigh',
+'searchdisabled' => "Tha lorg air {{SITENAME}} à comas.
+'S urrainn dhut lorg a dhèanamh air Google san eadar-àm.
+Faodaidh gum bi inneacsan susbaint {{SITENAME}} tuilleadh 's sean ge-tà.",
# Quickbar
+'qbsettings' => 'Grad-bhàr',
'qbsettings-none' => 'Chan eil gin',
+'qbsettings-fixedleft' => 'Socraichte air an taobh chlì',
+'qbsettings-fixedright' => 'Socraichte air an taobh deas',
+'qbsettings-floatingleft' => 'Air fleòd air an taobh chlì',
+'qbsettings-floatingright' => 'Air fleòd air an taobh deas',
+'qbsettings-directionality' => 'Socraichte a-rèir comhair sgriobt do chànain',
# Preferences page
'preferences' => 'Roghainnean',
'mypreferences' => 'Na roghainnean agam',
+'prefs-edits' => 'Co mheud deasachadh:',
+'prefsnologin' => 'Chan eil thu air clàradh a-steach',
+'prefsnologintext' => 'Feumaidh tu <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} clàradh a-steach]</span> mus urrainn dhut roghainnean cleachdaiche a chur air gleus.',
'changepassword' => 'Atharraich facal-faire',
'prefs-skin' => 'Bian',
'skin-preview' => 'Ro-shealladh',
+'datedefault' => 'Gun roghainnean',
'prefs-beta' => 'Feartan Beta',
'prefs-datetime' => 'Ceann-là is àm',
'prefs-labs' => 'Feartan nan deuchainn-lannan',
+'prefs-user-pages' => "Duilleagan a' chleachdaiche",
'prefs-personal' => "Pròifil a' chleachdaiche",
'prefs-rc' => 'Mùthaidhean ùra',
'prefs-watchlist' => 'An clàr-faire',
+'prefs-watchlist-days' => "Co mheud latha a sheallar air a' chlàr-fhaire:",
+'prefs-watchlist-days-max' => "{{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
'prefs-resetpass' => 'Atharraich am facal-faire',
'prefs-changeemail' => 'Atharraich am post-d',
'prefs-setemail' => 'Suidhich seòladh puist-d',
@@ -994,13 +1042,30 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
'timezoneregion-europe' => 'An Roinn-Eòrpa',
'timezoneregion-indian' => 'An Cuan Innseanach',
'timezoneregion-pacific' => 'An Cuan Sèimh',
+'prefs-namespaces' => 'Namespaces',
'default' => 'an roghainn bhunaiteach',
+'prefs-files' => 'Faidhlichean',
'prefs-custom-css' => 'CSS gnàthaichte',
+'prefs-custom-js' => 'JavaScript gnàthaichte',
+'prefs-common-css-js' => 'CSS/JavaScript ann an coitcheann do gach craiceann:',
+'prefs-reset-intro' => "'S urrainn dhut bun-roghainnean na làraich ath-shuidheachadh air an duilleag seo. Cha ghabh seo a neo-dhèanamh.",
+'prefs-emailconfirm-label' => 'Dearbhadh puist-d:',
+'prefs-textboxsize' => 'Meud na h-uinneige deasachaidh',
'youremail' => 'Post-dealain:',
-'username' => 'Ainm-cleachdaiche:',
+'username' => '{{GENDER:$1|Ainm-cleachdaiche}}:',
+'uid' => "ID {{GENDER:$1|a' chleachdaiche}}:",
+'prefs-memberingroups' => '{{GENDER:$2|Ball}} ann an {{PLURAL:$1|bhuidheann|bhuidheann|buidhnean|buidheann}}:',
+'prefs-registration' => 'Àm clàraidh:',
'yourrealname' => "An dearbh ainm a th' ort:",
'yourlanguage' => 'Cànan:',
+'yourvariant' => 'Eug-samhail cànan na susbaint:',
+'prefs-help-variant' => 'Do roghainn eug-samhail sgrìobhaidh a thèid duilleagan na h-uicipeid seo a shealltainn innte.',
'yournick' => 'Earr-sgrìobhadh ùr:',
+'prefs-help-signature' => "Bu chòir dhut d' ainm a chur ri beachdan air duilleagan deasbaireachd le \"<nowiki>~~~~</nowiki>\" agus chithear d' ainm agus stampa ama 'na àite an uairsin.",
+'badsig' => 'Tha co-chàradh an t-soidhnidh mì-dhligheach.
+Thoir sùil air na tagaichean HTML.',
+'badsiglength' => 'Tha an t-earr-sgrìobhadh agad ro fhada.
+Chan fhaod e a bhith nas fhaide na $1 {{PLURAL:$1|charactar|charactar|caractaran|caractar}}.',
'yourgender' => 'Gnè:',
'gender-unknown' => 'Gun innse',
'gender-male' => 'Fireann',
@@ -1009,17 +1074,48 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
'prefs-help-email' => "Chan leig thu leas post-dealain a chur ann ach bidh feum air ma dhìochuimhnicheas tu am facal-faire agad 's ma dh'iarras tu fear ùr.",
'prefs-help-email-others' => "'S urrainn dhut leigeil le daoine eile post-dealain a chur thugad tro cheangal air an duilleag agad.
Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.",
+'prefs-help-email-required' => 'Tha feum air seòladh puist-d.',
+'prefs-info' => 'Fiosrachadh bunasach',
+'prefs-i18n' => 'Cànan',
+'prefs-signature' => 'Earr-sgrìobhadh',
+'prefs-dateformat' => "Fòrmat a' chinn-là",
+'prefs-timeoffset' => 'Diofar ama',
'prefs-advancedediting' => 'Roghainnean adhartach',
'prefs-advancedrc' => 'Roghainnean adhartach',
'prefs-advancedrendering' => 'Roghainnean adhartach',
'prefs-advancedsearchoptions' => 'Roghainnean adhartach',
'prefs-advancedwatchlist' => 'Roghainnean adhartach',
+'prefs-displayrc' => 'Roghainnean taisbeanaidh',
+'prefs-displaysearchoptions' => 'Roghainnean taisbeanaidh',
+'prefs-displaywatchlist' => 'Roghainnean taisbeanaidh',
+'prefs-diffs' => 'Diffs',
+
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'Tha coltas gu bheil am post-d dligheach',
+'email-address-validity-invalid' => 'Cuir a-steach post-d dligheach',
# User rights
+'userrights' => "Stiùireadh ceadan a' chleachdaiche",
+'userrights-lookup-user' => 'Stiùirich na buidhnean chleachdaichean',
+'userrights-user-editname' => 'Cuir a-steach ainm-cleachdaiche:',
+'editusergroup' => 'Deasaich na buidhnean chleachdaichean',
+'editinguser' => "Ag atharrachadh ceadan a' chleachdaiche '''[[User:$1|$1]]''' $2",
+'userrights-editusergroup' => 'Deasaich na buidhnean chleachdaichean',
+'saveusergroups' => 'Sàbhail na buidhnean chleachdaichean',
+'userrights-groupsmember' => 'Ball de:',
+'userrights-groupsmember-auto' => 'Ball fèin-obrachail de:',
+'userrights-reason' => 'Adhbhar:',
+'userrights-no-interwiki' => 'Chan eil cead agad ceadan chleachdaichean a dheasachadh air uicipeidean eile.',
+'userrights-nodatabase' => 'Chan eil an stòr-dàta $1 ann no chan e fear ionadail a tha ann.',
'userrights-changeable-col' => 'Buidhnean as urrainn dhut atharrachadh',
# Groups
+'group' => 'Buidheann:',
+'group-user' => 'Cleachdaichean',
+'group-bot' => 'Bots',
'group-sysop' => 'Rianadairean',
+'group-bureaucrat' => 'Biurocratan',
+'group-all' => '(na h-uile)',
'group-user-member' => '{{GENDER:$1|cleachdaiche}}',
'group-bot-member' => '{{GENDER:$1|bot}}',
@@ -1027,18 +1123,37 @@ Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.
'group-bureaucrat-member' => '{{GENDER:$1|biùrocrat}}',
'grouppage-user' => '{{ns:project}}:Cleachdaichean',
+'grouppage-autoconfirmed' => '{{ns:project}}:Cleachdaichean fèin-dearbhte',
+'grouppage-bot' => '{{ns:project}}:Bots',
'grouppage-sysop' => '{{ns:project}}:Rianadairean',
+'grouppage-bureaucrat' => '{{ns:project}}:Biurocratan',
+
+# Rights
+'right-read' => 'Cead-leughaidh',
+'right-edit' => 'Cead-deasachaidh',
+'right-createpage' => "Cead-cruthachaidh (de dhuilleagan nach eil 'nan duilleagan deasbaireachd)",
+'right-createtalk' => 'Cead duilleagan deasbaireachd a chruthachadh',
+'right-createaccount' => 'Cead cunntasan ùra a chruthachadh',
+'right-move' => 'Cead duilleagan a ghluasad',
+'right-move-subpages' => 'Cead duilleagan a ghluasad leis na fo-dhuilleagan aca',
+'right-move-rootuserpages' => 'Cead duilleagan chleachdaichean root a ghluasad',
+'right-movefile' => 'Cead faidhlichean a ghluasad',
+'right-upload' => 'Cead faidhlichean a luchdadh suas',
+'right-reupload' => 'Cead sgrìobhadh thairis air duilleagan a tha ann',
+'right-upload_by_url' => 'Faidhlichean a luchdadh suas o URL',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Loga cruthachaidh de chleachdaichean',
# User rights log
'rightslog' => "Loga còraichean a' chleachdaiche",
-'rightsnone' => '(chan eil gin)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'deasaich an duilleag seo',
'action-move' => 'gluais an duilleag seo',
# Recent changes
-'nchanges' => '{{PLURAL:$1|mhùthadh|mhùthadh|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}',
+'nchanges' => '{{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}',
'recentchanges' => 'Mùthaidhean ùra',
'recentchanges-legend' => 'Roghainnean nam mùthaidhean ùra',
'recentchanges-summary' => 'Cum sùil air na mùthaidhean as ùire a nithear air an uici air an duilleag seo.',
@@ -1047,7 +1162,7 @@ Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.
'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',
-'rcnote' => 'Tha {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|na $1 mùthadh}} mu dheireadh anns na $2 {{PLURAL:$2|latha|latha|latha|latha|làithean|latha}} mu dheireadh, mar a bha iad $5, $4.',
+'rcnote' => 'Tha {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|na $1 mùthadh}} mu dheireadh anns na $2 {{PLURAL:$2|latha|latha|làithean|latha}} mu dheireadh, mar a bha iad $5, $4.',
'rcnotefrom' => "Gheibhear na mùthaidhean a-mach o '''$2''' (gu ruige '''$1''') gu h-ìosal.",
'rclistfrom' => 'Seall na mùthaidhean ùra a-mach o $1',
'rcshowhideminor' => '$1 mùthaidhean beaga',
@@ -1095,6 +1210,7 @@ Tha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean '''tr
'license' => 'Ceadachadh:',
'license-header' => 'Ceadachadh',
+'nolicense' => 'Cha deach gin a thaghadh',
# Special:ListFiles
'listfiles' => 'Liosta nan ìomhaigh',
@@ -1106,13 +1222,13 @@ Tha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean '''tr
'filehist-revert' => 'till',
'filehist-current' => 'làithreach',
'filehist-datetime' => 'Ceann-là/Àm',
-'filehist-thumb' => 'Meabh-dhealbh',
+'filehist-thumb' => 'Meanbh-dhealbh',
'filehist-thumbtext' => 'Meanbh-dhealbh airson an tionndaidh on $1',
'filehist-user' => 'Neach-cleachdaidh',
'filehist-dimensions' => 'Meud',
'filehist-comment' => 'Beachd',
'imagelinks' => 'Cleachdadh an fhaidhle',
-'linkstoimage' => "Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas a' ceangal ris an fhaidhle seo:",
+'linkstoimage' => "Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas a' ceangal ris an fhaidhle seo:",
'nolinkstoimage' => "Chan eil duilleag sam bith a' ceangal an-seo.",
'sharedupload' => 'Tha am faidhle seo o $1 agus faodaidh pròiseactan eile a chleachdadh.',
'sharedupload-desc-here' => "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.
@@ -1137,9 +1253,9 @@ Chithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu
'brokenredirects' => 'Ath-stiùireidhean briste',
# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|bhaidht|bhaidht|bhaidht|bhaidht|baidht|baidht}}',
-'nmembers' => '$1 {{PLURAL:$1|bhall|bhall|bhall|bhall|buill|ball}}',
-'nviews' => '$1 {{PLURAL:$1|sealladh|shealladh|sealladh|shealladh|seallaidhean|sealladh}}',
+'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
+'nmembers' => '$1 {{PLURAL:$1|bhall|bhall|buill|ball}}',
+'nviews' => '$1 {{PLURAL:$1|sealladh|shealladh|seallaidhean|sealladh}}',
'uncategorizedpages' => 'Duilleagan gun roinn-seòrsa',
'uncategorizedcategories' => 'Roinnean-seòrsa gun roinn-seòrsa',
'unusedimages' => 'Faidhlichean gun chleachdadh',
@@ -1152,17 +1268,19 @@ Chithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu
'ancientpages' => 'Duilleagan as sìne',
'move' => 'Gluais',
'movethispage' => 'Gluais an duilleag seo',
-'pager-newer-n' => '{{PLURAL:$1|1 nas ùire|$1 nas ùire|1 nas ùire|$1 nas ùire|$1 nas ùire|$1 nas ùire}}',
-'pager-older-n' => '{{PLURAL:$1|1 nas sine|$1 nas sine|1 nas sine|$1 nas sine|$1 nas sine|$1 nas sine}}',
+'pager-newer-n' => '{{PLURAL:$1|1 nas ùire|$1 nas ùire}}',
+'pager-older-n' => '{{PLURAL:$1|1 nas sine|$1 nas sine}}',
# Book sources
'booksources' => "Tùsan a tha 'nan leabhraichean",
'booksources-search-legend' => "Lorg tùsan a tha 'nan leabhraichean",
-'booksources-go' => 'Rach',
+'booksources-go' => 'Siuthad',
# Special:Log
'log' => 'Logaichean',
'all-logs-page' => 'A h-uile loga poblach',
+'logempty' => "Chan eil rud sam bith san loga a tha 'ga mhaidseadh.",
+'showhideselectedlogentries' => 'Seall/Falaich innteartan an loga a thagh thu',
# Special:AllPages
'allpages' => 'A h-uile duilleag',
@@ -1176,22 +1294,25 @@ Chithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu
# Special:Categories
'categories' => 'Roinnean-seòrsa',
-'categoriespagetext' => "Tha duilleagan no meadhan {{PLURAL:$1|san roinn-seòrsa|san roinn-seòrsa|san roinn-seòrsa|san roinn-seòrsa|sna roinntean-seòrsa|san roinn-seòrsa}} a leanas.
+'categoriespagetext' => "Tha duilleagan no meadhan {{PLURAL:$1|san roinn-seòrsa|sna roinntean-seòrsa|}} a leanas.
Chan fhaicear [[Special:UnusedCategories|roinntean-seòrsa gun chleachdadh an-seo]].
Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan iarraidh cuideachd]].",
+# Special:DeletedContributions
+'deletedcontributions' => "Obair a' chleachdaiche a chaidh a sguabadh às",
+
# Special:LinkSearch
-'linksearch' => 'Ceanglaichean dhan taobh a-muigh',
+'linksearch' => 'Lorg sna ceanglaichean dhan taobh a-muigh',
+'linksearch-ns' => 'Namespace:',
'linksearch-line' => "Tha $1 a' ceangal an-seo o $2",
-# Special:Log/newusers
-'newuserlogpage' => 'Loga cruthachaidh de chleachdaichean',
-
# Special:ListGroupRights
'listgrouprights-members' => '(liosta de bhuill)',
-# E-mail user
+# Email user
'emailuser' => 'Cuir post-dealain dhan chleachdaiche seo',
+'emailusername' => 'Ainm-cleachdaiche:',
+'emailusernamesubmit' => 'Air adhart',
'emailfrom' => 'O:',
'emailto' => 'Gu:',
'emailsubject' => 'Cuspair:',
@@ -1199,22 +1320,27 @@ Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan i
'emailsend' => 'Cuir',
# Watchlist
-'watchlist' => 'Mo chlàr-faire',
+'watchlist' => 'An clàr-faire',
'mywatchlist' => 'An clàr-faire',
-'watchlistfor2' => 'Do $1 $2',
+'watchlistfor2' => 'aig $1 $2',
'nowatchlist' => "Chan eil rud sam bith air a' chlàr-fhaire agad.",
-'addedwatchtext' => "Chaidh an duilleag \"[[:\$1]]\" a chur ri [[Special:Watchlist|do chlàr-faire]].
-Nochdaidh mùthaidhean a nithear air an duilleag seo 's air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd agus nochdaidh an duilleag ann an litrichean '''troma''' ann an [[Special:RecentChanges|liosta nam mùthaidhean ùra]] gum bi e furasta ri fhaicinn.",
+'addwatch' => "Cuir air a' chlàr-fhaire",
+'addedwatchtext' => 'Chaidh an duilleag "[[:$1]]" a chur ri [[Special:Watchlist|do chlàr-faire]].
+Nochdaidh mùthaidhean a nithear air an duilleag seo \'s air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd.',
+'removewatch' => 'Thoir air falbh on chlàr-fhaire',
'removedwatchtext' => 'Chaidh an duilleag "[[:$1]]" a thoirt air falbh o [[Special:Watchlist|do chlàr-faire]].',
'watch' => 'Cum sùil air',
'watchthispage' => 'Cum sùil air an duilleag seo',
'unwatch' => 'Na cum sùil tuilleadh',
+'unwatchthispage' => 'Na cum sùil tuilleadh',
+'notanarticle' => 'Chan e duilleag susbaint a tha ann',
'watchnochange' => "Cha deach na duilleagan air d' fhaire a dheasachadh anns a' chuairt ùine taisbeanta.",
-'watchlist-details' => 'Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag||$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air do chlàr-faire, gun luaidh air na duilleagan deasbaireachd.',
+'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.",
'watchmethod-recent' => "A' sgrùdadh deasachaidhean ùra airson duilleagan air d' fhaire",
'watchmethod-list' => "A' sgrùdadh duilleagan air d' fhaire airson deasachaidhean ùra",
-'watchlistcontains' => 'Tha $1 {{PLURAL:$1|duilleag|dhuilleag|duilleag|dhuilleag|duilleagan|duilleag}} air do chlàr-faire.',
-'wlnote' => 'Seo $1 {{PLURAL:$1|mhùthadh mu dheireadh|mhùthadh mu dheireadh|na mùthaidhean mu dheireadh|mùthadh mu dheireadh}} anns na $2 {{PLURAL:$2|uair|uair|uairean|uair}} mu dheireadh.',
+'watchlistcontains' => 'Tha $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}} air do chlàr-faire.',
+'wlnote' => 'Seo {{PLURAL:$1|an $1 mhùthadh|$1 mhùthadh|na $1 mùthaidhean|$1 mùthadh}} mu dheireadh san {{PLURAL:$2|$2 uair a thìde|$2 uair a thìde|$2 uairean a thìde|$2 uair a thìde}} mu dheireadh, mar a bha e $3, $4.',
'wlshowlast' => 'Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh $3',
'watchlist-options' => 'Roghainnean mo chlàir-faire',
@@ -1249,17 +1375,18 @@ Seall air $2 airson clàr de dhuilleagan a chaidh a sguabadh às o chionn ghoiri
# Rollback
'rollbacklink' => 'roilig air ais',
'editcomment' => "Seo gearr-chunntas an deasachaidh: \"''\$1''\".",
-'revertpage' => 'Deasachaidhean a chaidh a thilleadh le [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]',
+'revertpage' => 'Deasachaidhean a chaidh a thilleadh le [[Special:Contributions/$2|$2]] ([[User talk:$2|deasbaireachd]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]',
# Protect
'protectlogpage' => 'Loga an dìon',
-'protectlogtext' => "Tha liosta na chaidh a dhìon 's a neo-dhìon gu h-ìosal.
-Cuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson liosta na fheadhainn a tha fo dhìon an-dràsta fhèin.",
+'protectlogtext' => 'Tha liosta na chaidh a dhìon gu h-ìosal.
+Cuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson liosta na fheadhainn a tha fo dhìon an-dràsta fhèin.',
'protectedarticle' => '"[[$1]]" air a dhìon',
'modifiedarticleprotection' => 'a dh\'atharraich an ìre dìon de "[[$1]]"',
'unprotectedarticle' => 'a neo-dhìon "[[$1]]"',
'protect-title' => 'A\' dìonadh "$1"',
'prot_1movedto2' => '[[$1]] gluaiste ri [[$2]]',
+'protect-norestrictiontypes-title' => 'Cha ghabh an duilleag seo a dhìon',
'protect-legend' => 'Daingnich dìonadh',
'protectcomment' => 'Adhbhar:',
'protectexpiry' => 'Falbhaidh an ùine air:',
@@ -1268,31 +1395,36 @@ Cuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson
'protect-text' => "Chì thu an ìre dìon dhen duilleag '''$1''' an-seo agus is urrainn dhut atharrachadh an-seo.",
'protect-locked-access' => "Chan eil cead aig a' chunntas agad an ìre dìon de dhuilleag atharrachadh.
Seo roghainnean làithreach na duilleige '''$1''':",
-'protect-cascadeon' => "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|san duilleag|sna duilleagan|san duilleag|sna duilleagan|san duilleag|sna duilleagan}} a leanas aig a bheil dìon easach air.
+'protect-cascadeon' => "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} a leanas aig a bheil dìon easach air.
'S urrainn dhut ìre dìon na duilleige seo atharrachadh ach cha bhi buaidh air an dìon easach.",
'protect-default' => 'Ceadaich a h-uile cleachdaiche',
-'protect-fallback' => 'Iarr cead "$1"',
-'protect-level-autoconfirmed' => 'Cuir bacadh air cleachdaichean ùra is feadhainn gun chlàrachadh',
-'protect-level-sysop' => 'Rianadairean a-mhàin',
+'protect-fallback' => 'Na ceadaich ach do chleachdaichean aig a bheil cead "$1"',
+'protect-level-autoconfirmed' => 'Na ceadaich ach cleachdaichean a chaidh an dearbhadh gu fèin-obrachail',
+'protect-level-sysop' => 'Na ceadaich ach rianadairean',
'protect-summary-cascade' => 'mar eas',
'protect-expiring' => 'falbhaidh an ùine air $1 (UTC)',
+'protect-expiring-local' => 'falbhaidh an ùine air $1',
+'protect-expiry-indefinite' => 'buan',
'protect-cascade' => "Dìon duilleagan a tha 'gan gabhail a-steach san duilleag seo (dìon mar eas)",
'protect-cantedit' => "Chan urrainn dhut ìre dìon na duilleige seo atharrachadh a chionn 's nach eil cead deasachaidh agad air.",
+'protect-othertime' => 'Àm eile:',
+'protect-othertime-op' => 'àm eile',
'restriction-type' => 'Cead:',
'restriction-level' => 'ÃŒre bacaidh:',
# Undelete
-'undeleterevisions' => 'Chaidh $1 {{PLURAL:$1|leth-bhreac|leth-bhreac|leth-bhreac|leth-bhreac|leth-bhreacan|leth-bhreac}} a chur san tasg-lann',
+'undeleterevisions' => 'Chaidh {{PLURAL:$1|$1 leth-bhreac|$1 leth-bhreac|$1 leth-bhreacan|$1 leth-bhreac}} a chur san tasg-lann',
'undeletelink' => 'seall/aisig',
'undeleteviewlink' => 'seall',
# Namespace form on various pages
'namespace' => 'Namespace:',
'invert' => 'Cuir na thagh mi bun os cionn',
+'namespace_association' => 'Namespace co-cheangailte ris',
'blanknamespace' => '(Prìomh)',
# Contributions
-'contributions' => 'Mùthaidhean an neach-chleachdaidh',
+'contributions' => "Mùthaidhean a' {{GENDER:$1|chleachdaiche}}",
'contributions-title' => 'Mùthaidhean a rinn $1',
'mycontris' => 'Mùthaidhean',
'contribsub2' => 'Do $1 ($2)',
@@ -1319,8 +1451,8 @@ Seo roghainnean làithreach na duilleige '''$1''':",
'isredirect' => 'duilleag ath-sheòlaidh',
'istemplate' => 'transclusion',
'isimage' => 'ceangal faidhle',
-'whatlinkshere-prev' => '{{PLURAL:$1|roimhe|$1 roimhe|roimhe|$1 roimhe|$1 roimhe|$1 roimhe}}',
-'whatlinkshere-next' => '{{PLURAL:$1|an ath|an ath $1|an ath|an ath $1|an ath $1|an ath $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|roimhe|$1 roimhe}}',
+'whatlinkshere-next' => '{{PLURAL:$1|an ath|an ath $1|na ath $1|an ath $1}}',
'whatlinkshere-links' => '↠ceanglaichean',
'whatlinkshere-hideredirs' => '$1 ath-sheòlaidhean',
'whatlinkshere-hidetrans' => '$1 transclusions',
@@ -1335,8 +1467,8 @@ Seo roghainnean làithreach na duilleige '''$1''':",
'ipboptions' => '2 uair a thìde:2 hours, 1 latha:1 day, 3 làithean:3 days, 1 seachdain:1 week, 2 sheachdain:2 weeks, 1 mhìos:1 month, 3 mìosan:3 months, 6 mìosan:6 months, 1 bhliadhna:1 year,neo-chrìochnach:infinite',
'badipaddress' => "Chan eil an seòladh IP aig a' cleachdair seo iomchaidh",
'blockipsuccesssub' => "Shoirbhich leat leis a' bhacadh",
-'blockipsuccesstext' => "Tha [[Special:Contributions/$1|$1]] air a bhacadh.
-<br />Faic [[Special:BlockList|Liosta nan IP baicte]] na bacaidhean a dh'ath-sgrùdadh.",
+'blockipsuccesstext' => 'Chaidh [[Special:Contributions/$1|$1]] a bhacadh.
+<br />Faic [[Special:BlockList|liosta nan IP bacte]] gus sùile a thoirt air na bacaidhean.',
'unblockip' => 'Neo-bhac an cleachdaiche',
'ipusubmit' => 'Thoir air falbh am bacadh seo',
'ipblocklist' => 'Cleachdaichean a chaidh a bhacadh',
@@ -1363,7 +1495,7 @@ Seo roghainnean làithreach na duilleige '''$1''':",
'movepagetext' => "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.
Bidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.
'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.
-Mura dèan thu sin, dèan cinntach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.
+Mura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.
'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.
Thoir an aire '''nach dèid''' an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.
@@ -1371,7 +1503,7 @@ Thoir an aire '''nach dèid''' an duilleag a ghluasad ma tha duilleag air an tio
'''Rabhadh!'''
Faodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;
-dèan cinntach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
+dèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
'movepagetalktext' => "Thèid an duilleag deasbaireachd a tha co-cheangailte ris a ghluasad 'na cois '''ach:'''
*Ma tha duilleag deasbaireachd nach eil falamh aig an ainm ùr mu thràth, no
*Ma bheir thu air falbh a' chromag on bhogsa gu h-ìosal
@@ -1471,11 +1603,11 @@ Tadhail air [//www.mediawiki.org/wiki/Localisation Ionadaileadh MediaWiki] is [/
'tooltip-summary' => 'Cuir a-steach gearr-chunntas',
# Attribution
-'anonymous' => '{{PLURAL:$1|Cleachdaiche|Cleachdaichean|Cleachdaichean|Cleachdaichean|Cleachdaichean|Cleachdaichean}} gun ainm o {{SITENAME}}',
+'anonymous' => '{{PLURAL:$1|cleachdaiche|cleachdaichean}} gun ainm o {{SITENAME}}',
'siteuser' => 'cleachdaiche {{SITENAME}} $1',
'othercontribs' => 'Stèidhichte air obair le $1.',
'others' => 'eile',
-'siteusers' => '{{PLURAL:$2|chleachdaiche|chleachdaiche|chleachdaiche|chleachdaiche|cleachdaichean|cleachdaiche}} {{SITENAME}} $1',
+'siteusers' => '{{PLURAL:$2|cleachdaiche|cleachdaichean}} {{SITENAME}} $1',
# Browsing diffs
'previousdiff' => '↠Mùthadh nas sine',
@@ -1558,7 +1690,10 @@ Bidh an fheadhainn eile falaichte a ghnàth.
#Cuir gach mì regex os cionn na loidhne seo. Fàg an loidhne seo dìreach mar a tha e</pre>",
# Special:Tags
-'tag-filter' => 'Criathrag [[Special:Tags|Tag]]:',
+'tag-filter' => 'Criathrag [[Special:Tags|thagaichean]]:',
+
+# New logging system
+'rightsnone' => '(chan eil gin)',
# Search suggestions
'searchsuggest-containing' => 'anns a bheil...',
diff --git a/languages/messages/MessagesGl.php b/languages/messages/MessagesGl.php
index af7156fa..d5ef0f9e 100644
--- a/languages/messages/MessagesGl.php
+++ b/languages/messages/MessagesGl.php
@@ -8,6 +8,7 @@
* @file
*
* @author Alma
+ * @author Dferg
* @author Elisardojm
* @author Gallaecio
* @author Gustronico
@@ -60,7 +61,7 @@ $defaultDateFormat = 'dmy';
$dateFormats = array(
'dmy time' => 'H:i',
'dmy date' => 'j \d\e F \d\e Y',
- 'dmy both' => 'H:i\,\ j \d\e F \d\e Y',
+ 'dmy both' => 'j \d\e F \d\e Y "ás" H:i',
);
$specialPageAliases = array(
@@ -132,7 +133,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Cambios_recentes' ),
'Recentchangeslinked' => array( 'Cambios_relacionados' ),
'Revisiondelete' => array( 'Revisións_borradas' ),
- 'RevisionMove' => array( 'Traslado_de_revisión' ),
'Search' => array( 'Procurar' ),
'Shortpages' => array( 'Páxinas_curtas' ),
'Specialpages' => array( 'Páxinas_especiais' ),
@@ -170,7 +170,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__FORZAROÃNDICE__', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÃRIO__', '__FORCETOC__' ),
'toc' => array( '0', '__ÃNDICE__', '__TDC__', '__SUMÃRIO__', '__SUMARIO__', '__TOC__' ),
'noeditsection' => array( '0', '__SECCIÓNSNONEDITABLES__', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__NAOEDITARSECAO__', '__SEMEDITARSECAO__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '___SENCABECEIRA__', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÃTULO__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'MESACTUAL', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'MESACTUAL1', 'MESATUAL1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'NOMEDOMESACTUAL', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
@@ -179,6 +178,7 @@ $magicWords = array(
'currentday2' => array( '1', 'DÃAACTUAL2', 'DIAATUAL2', 'CURRENTDAY2' ),
'currentdayname' => array( '1', 'NOMEDODÃAACTUAL', 'NOMEDODIAATUAL', 'CURRENTDAYNAME' ),
'currentyear' => array( '1', 'ANOACTUAL', 'ANOATUAL', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'DATAEHORAACTUAIS', 'HORARIOATUAL', 'CURRENTTIME' ),
'currenthour' => array( '1', 'HORAACTUAL', 'HORAATUAL', 'CURRENTHOUR' ),
'localmonth' => array( '1', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
'localmonth1' => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
@@ -188,26 +188,46 @@ $magicWords = array(
'localday2' => array( '1', 'DÃALOCAL2', 'DIALOCAL2', 'LOCALDAY2' ),
'localdayname' => array( '1', 'NOMEDODÃALOCAL', 'NOMEDODIALOCAL', 'LOCALDAYNAME' ),
'localyear' => array( '1', 'ANOLOCAL', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'DATAEHORALOCAIS', 'HORARIOLOCAL', 'LOCALTIME' ),
'localhour' => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
'numberofpages' => array( '1', 'NÚMERODEPÃXINAS', 'NUMERODEPAGINAS', 'NÚMERODEPÃGINAS', 'NUMBEROFPAGES' ),
'numberofarticles' => array( '1', 'NÚMERODEARTIGOS', 'NUMERODEARTIGOS', 'NUMBEROFARTICLES' ),
'numberoffiles' => array( '1', 'NÚMERODEFICHEIROS', 'NUMERODEARQUIVOS', 'NÚMERODEARQUIVOS', 'NUMBEROFFILES' ),
'numberofusers' => array( '1', 'NÚMERODEUSUARIOS', 'NUMERODEUSUARIOS', 'NÚMERODEUSUÃRIOS', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NÚMERODEUSUARIOSACTIVOS', 'NUMERODEUSUARIOSATIVOS', 'NÚMERODEUSUÃRIOSATIVOS', 'NUMBEROFACTIVEUSERS' ),
'numberofedits' => array( '1', 'NÚMERODEEDICIÓNS', 'NUMERODEEDICOES', 'NÚMERODEEDIÇÕES', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NÚMERODEVISITAS', 'NUMERODEEXIBICOES', 'NÚMERODEEXIBIÇÕES', 'NUMBEROFVIEWS' ),
'pagename' => array( '1', 'NOMEDAPÃXINA', 'NOMEDAPAGINA', 'NOMEDAPÃGINA', 'PAGENAME' ),
'namespace' => array( '1', 'ESPAZODENOMES', 'DOMINIO', 'DOMÃNIO', 'ESPACONOMINAL', 'ESPAÇONOMINAL', 'NAMESPACE' ),
'fullpagename' => array( '1', 'NOMECOMPLETODAPÃXINA', 'NOMECOMPLETODAPAGINA', 'NOMECOMPLETODAPÃGINA', 'FULLPAGENAME' ),
'subpagename' => array( '1', 'NOMEDASUBPÃXINA', 'NOMEDASUBPAGINA', 'NOMEDASUBPÃGINA', 'SUBPAGENAME' ),
'basepagename' => array( '1', 'NOMEDAPÃXINABASE', 'NOMEDAPAGINABASE', 'NOMEDAPÃGINABASE', 'BASEPAGENAME' ),
'talkpagename' => array( '1', 'NOMEDAPÃXINADECONVERSA', 'NOMEDAPAGINADEDISCUSSAO', 'NOMEDAPÃGINADEDISCUSSÃO', 'TALKPAGENAME' ),
- 'img_manualthumb' => array( '1', 'miniatura=$1', 'miniaturadaimagem=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_thumbnail' => array( '1', 'miniatura', 'miniaturadaimaxe', 'miniaturadaimagem', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'miniatura=$1', 'miniaturadaimaxe=$1', 'miniaturadaimagem=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'dereita', 'direita', 'right' ),
'img_left' => array( '1', 'esquerda', 'left' ),
'img_none' => array( '1', 'ningún', 'nenhum', 'none' ),
'img_center' => array( '1', 'centro', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'conmarco', 'conbordo', 'marco', 'commoldura', 'comborda', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'senmarco', 'senbordo', 'semmoldura', 'semborda', 'frameless' ),
'img_page' => array( '1', 'páxina=$1', 'páxina $1', 'página=$1', 'página $1', 'page=$1', 'page $1' ),
'img_border' => array( '1', 'bordo', 'borda', 'border' ),
+ 'img_top' => array( '1', 'arriba', 'acima', 'top' ),
+ 'img_text_top' => array( '1', 'texto-arriba', 'text-top' ),
+ 'img_middle' => array( '1', 'medio', 'meio', 'middle' ),
+ 'img_bottom' => array( '1', 'abaixo', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'texto-abaixo', 'text-bottom' ),
+ 'img_link' => array( '1', 'ligazón=$1', 'ligação=$1', 'link=$1' ),
+ 'img_class' => array( '1', 'clase=$1', 'class=$1' ),
+ 'sitename' => array( '1', 'NOMEDOSITIO', 'NOMEDOSITE', 'NOMEDOSÃTIO', 'SITENAME' ),
+ 'localurl' => array( '0', 'URLLOCAL', 'LOCALURL:' ),
+ 'articlepath' => array( '0', 'RUTADOARTIGO', 'ARTICLEPATH' ),
+ 'pageid' => array( '0', 'IDDAPÃXINA', 'PAGEID' ),
+ 'server' => array( '0', 'SERVIDOR', 'SERVER' ),
+ 'servername' => array( '0', 'NOMEDOSERVIDOR', 'SERVERNAME' ),
'grammar' => array( '0', 'GRAMÃTICA:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'SEXO:', 'GENERO', 'GÊNERO', 'GENDER:' ),
'displaytitle' => array( '1', 'AMOSAROTÃTULO', 'EXIBETITULO', 'EXIBETÃTULO', 'DISPLAYTITLE' ),
'newsectionlink' => array( '1', '__LIGAZÓNDANOVASECCIÓN__', '__LINKDENOVASECAO__', '__LINKDENOVASEÇÃO__', '__LIGACAODENOVASECAO__', '__LIGAÇÃODENOVASEÇÃO__', '__NEWSECTIONLINK__' ),
'language' => array( '0', '#LINGUA:', '#IDIOMA:', '#LANGUAGE:' ),
@@ -218,6 +238,11 @@ $magicWords = array(
'hiddencat' => array( '1', '__CATEGORÃAOCULTA__', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
'pagesincategory' => array( '1', 'PÃXINASNACATEGORÃA', 'PAGINASNACATEGORIA', 'PÃGINASNACATEGORIA', 'PAGINASNACAT', 'PÃGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
'pagesize' => array( '1', 'TAMAÑODAPÃXINA', 'TAMANHODAPAGINA', 'TAMANHODAPÃGINA', 'PAGESIZE' ),
+ 'url_path' => array( '0', 'RUTA', 'PATH' ),
+ 'pagesincategory_all' => array( '0', 'todos', 'all' ),
+ 'pagesincategory_pages' => array( '0', 'páxinas', 'pages' ),
+ 'pagesincategory_subcats' => array( '0', 'subcategorías', 'subcats' ),
+ 'pagesincategory_files' => array( '0', 'ficheiros', 'files' ),
);
$separatorTransformTable = array( ',' => '.', '.' => ',' );
@@ -357,6 +382,7 @@ $messages = array(
'newwindow' => '(abre unha ventá nova)',
'cancel' => 'Cancelar',
'moredotdotdot' => 'Máis...',
+'morenotlisted' => 'Máis que non están na lista...',
'mypage' => 'Páxina',
'mytalk' => 'Conversa',
'anontalk' => 'Conversa con este enderezo IP',
@@ -368,7 +394,6 @@ $messages = array(
'qbbrowse' => 'Navegar',
'qbedit' => 'Editar',
'qbpageoptions' => 'Esta páxina',
-'qbpageinfo' => 'Contexto',
'qbmyoptions' => 'As miñas páxinas',
'qbspecialpages' => 'Páxinas especiais',
'faq' => 'Preguntas máis frecuentes',
@@ -391,6 +416,7 @@ $messages = array(
'namespaces' => 'Espazos de nomes',
'variants' => 'Variantes',
+'navigation-heading' => 'Menú de navegación',
'errorpagetitle' => 'Erro',
'returnto' => 'Volver a "$1".',
'tagline' => 'De {{SITENAME}}',
@@ -633,10 +659,10 @@ O administrador que bloqueou o repositorio achegou este motivo: "$3".',
# Login and logout pages
'logouttext' => "'''Agora está fóra do sistema.'''
-Pode continuar usando {{SITENAME}} de xeito anónimo, ou pode [[Special:UserLogin|acceder de novo]] co mesmo nome de usuario ou con outro.
+Pode continuar usando {{SITENAME}} de xeito anónimo, ou pode <span class='plainlinks'>[$1 acceder de novo]</span> co mesmo nome de usuario ou con outro.
Teña en conta que mentres non se limpa a memoria caché do seu navegador algunhas páxinas poden continuar aparecendo como se aínda estivese dentro do sistema.",
-'welcomecreation' => '== Reciba a nosa benvida, $1! ==
-A súa conta foi creada correctamente.
+'welcomeuser' => 'Reciba a nosa benvida, $1!',
+'welcomecreation-msg' => 'A súa conta foi creada correctamente.
Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENAME}}]].',
'yourname' => 'Nome de usuario:',
'yourpassword' => 'Contrasinal:',
@@ -660,7 +686,7 @@ Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENA
'gotaccount' => 'Xa ten unha conta? $1.',
'gotaccountlink' => 'Acceda ao sistema',
'userlogin-resetlink' => 'Esqueceu os seus datos de rexistro?',
-'createaccountmail' => 'Por correo electrónico',
+'createaccountmail' => 'Utilizar un contrasinal aleatorio temporal e envialo ao enderezo de correo electrónico especificado embaixo',
'createaccountreason' => 'Motivo:',
'badretype' => 'Os contrasinais que inseriu non coinciden.',
'userexists' => 'O nome de usuario que inseriu xa está en uso.
@@ -741,6 +767,7 @@ Por favor, agarde antes de probar outra vez.',
# Email sending
'php-mail-error-unknown' => 'Erro descoñecido na función mail() do PHP.',
'user-mail-no-addy' => 'Intentou enviar un correo sen enderezo de correo electrónico.',
+'user-mail-no-body' => 'Intentou enviar un correo baleiro ou cun corpo curto de máis.',
# Change password dialog
'resetpass' => 'Cambiar o contrasinal',
@@ -806,6 +833,7 @@ Contrasinal temporal: $2',
'changeemail-oldemail' => 'Enderezo de correo electrónico actual:',
'changeemail-newemail' => 'Novo enderezo de correo electrónico:',
'changeemail-none' => '(ningún)',
+'changeemail-password' => 'O seu contrasinal en {{SITENAME}}:',
'changeemail-submit' => 'Cambiar o correo electrónico',
'changeemail-cancel' => 'Cancelar',
@@ -988,7 +1016,6 @@ Velaquí está a última entrada no rexistro, por se quere consultala:",
'template-semiprotected' => '(semiprotexido)',
'hiddencategories' => 'Esta páxina forma parte {{PLURAL:$1|dunha categoría oculta|de $1 categorías ocultas}}:',
'edittools' => '<!-- O texto que apareza aquí mostrarase por debaixo dos formularios de edición e envío. -->',
-'nocreatetitle' => 'Limitada a creación de páxinas',
'nocreatetext' => '{{SITENAME}} ten restrinxida a posibilidade de crear páxinas novas.
Pode volver e editar unha páxina que xa existe ou, se non, [[Special:UserLogin|rexistrarse ou crear unha conta]].',
'nocreate-loggedin' => 'Non dispón dos permisos necesarios para crear páxinas novas.',
@@ -1013,6 +1040,15 @@ Semella que foi borrada.',
'edit-already-exists' => 'Non se pode crear a nova páxina.
Esta xa existe.',
'defaultmessagetext' => 'Texto predeterminado',
+'content-failed-to-parse' => 'Erro ao analizar o contido de "$2" para o modelo de $1: $3',
+'invalid-content-data' => 'Datos de contido inválidos',
+'content-not-allowed-here' => 'O contido "$1" non está permitido na páxina "[[$2]]"',
+
+# Content models
+'content-model-wikitext' => 'texto wiki',
+'content-model-text' => 'texto simple',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Aviso:''' Esta páxina contén demasiados analizadores de funcións de chamadas.
@@ -1380,9 +1416,9 @@ Este cambio non se poderá desfacer.',
'prefs-emailconfirm-label' => 'Confirmación do correo:',
'prefs-textboxsize' => 'Tamaño da caixa de edición',
'youremail' => 'Correo electrónico:',
-'username' => 'Nome de usuario:',
-'uid' => 'ID de usuario:',
-'prefs-memberingroups' => 'Membro {{PLURAL:$1|do grupo|dos grupos}}:',
+'username' => 'Nome de {{GENDER:$1|usuario|usuaria}}:',
+'uid' => 'ID de {{GENDER:$1|usuario|usuaria}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:',
'prefs-registration' => 'Data e hora de rexistro:',
'yourrealname' => 'Nome real:',
'yourlanguage' => 'Lingua:',
@@ -1530,12 +1566,13 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
'right-sendemail' => 'Enviar correos electrónicos a outros usuarios',
'right-passwordreset' => 'Ver os correos electrónicos de restablecemento de contrasinais',
+# Special:Log/newusers
+'newuserlogpage' => 'Rexistro de creación de usuarios',
+'newuserlogpagetext' => 'Este é un rexistro de creación de contas de usuario.',
+
# User rights log
'rightslog' => 'Rexistro de dereitos de usuario',
'rightslogtext' => 'Este é un rexistro dos cambios nos permisos de usuario.',
-'rightslogentry' => 'cambiou o grupo ao que pertence $1 de $2 a $3',
-'rightslogentry-autopromote' => 'foi promovido automaticamente de $2 a $3',
-'rightsnone' => '(ningún)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ler esta páxina',
@@ -1782,6 +1819,7 @@ Se o problema persiste, póñase en contacto cun [[Special:ListUsers/sysop|admin
'backend-fail-notsame' => 'Xa existe un ficheiro chamado "$1", con contidos diferentes.',
'backend-fail-invalidpath' => '"$1" non é unha ruta de almacenamento válida.',
'backend-fail-delete' => 'Non se deu borrado o ficheiro "$1".',
+'backend-fail-describe' => 'Non se puideron cambiar os metadatos do ficheiro "$1".',
'backend-fail-alreadyexists' => 'O ficheiro "$1" xa existe.',
'backend-fail-store' => 'Non se deu almacenado o ficheiro "$1" en "$2".',
'backend-fail-copy' => 'Non se deu copiado o ficheiro "$1" en "$2".',
@@ -2020,6 +2058,12 @@ Lembre verificar outras ligazóns cara aos modelos antes de borralos.',
No canto de ligar cos homónimos deben apuntar cara á páxina apropiada.<br />
Unha páxina trátase como páxina de homónimos cando nela se usa un modelo que está ligado desde [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Páxinas cunha propiedade de páxina',
+'pageswithprop-legend' => 'Páxinas cunha propiedade de páxina',
+'pageswithprop-text' => 'Esta páxina lista aquelas páxinas que utilizan unha propiedade de páxina determinada.',
+'pageswithprop-prop' => 'Nome da propiedade:',
+'pageswithprop-submit' => 'Mostrar',
+
'doubleredirects' => 'Redireccións dobres',
'doubleredirectstext' => 'Esta lista contén as páxinas que redirixen cara a outras páxinas de redirección.
Cada ringleira contén ligazóns cara á primeira e segunda redireccións, así como a primeira liña de texto da segunda páxina, que é frecuentemente o artigo "real", á que a primeira redirección debera apuntar.
@@ -2172,8 +2216,8 @@ Olle tamén as [[Special:WantedCategories|categorías requiridas]].',
'linksearch-ns' => 'Espazo de nomes:',
'linksearch-ok' => 'Procurar',
'linksearch-text' => 'Pódense usar caracteres comodín como "*.wikipedia.org".
-Cómpre, polo menos, un dominio de nivel superior, por exemplo "*.org".<br />
-Protocolos soportados: <code>$1</code> (úsase http:// como predeterminado se non se especifica ningún protocolo).',
+Cómpre, polo menos, un dominio de nivel superior; por exemplo, "*.org".<br />
+{{PLURAL:$2|Protocolo soportado|Protocolos soportados}}: <code>$1</code> (úsase http:// como predeterminado se non se especifica ningún protocolo).',
'linksearch-line' => '$1 está ligado desde a páxina "$2"',
'linksearch-error' => 'Os caracteres comodín só poden aparecer ao principio do nome do servidor.',
@@ -2192,10 +2236,6 @@ Protocolos soportados: <code>$1</code> (úsase http:// como predeterminado se no
'activeusers-hidesysops' => 'Agochar os administradores',
'activeusers-noresult' => 'Non se atopou ningún usuario.',
-# Special:Log/newusers
-'newuserlogpage' => 'Rexistro de creación de usuarios',
-'newuserlogpagetext' => 'Este é un rexistro de creación de contas de usuario.',
-
# Special:ListGroupRights
'listgrouprights' => 'Dereitos dun usuario segundo o seu grupo',
'listgrouprights-summary' => 'A seguinte lista mostra os grupos de usuario definidos neste wiki, cos seus dereitos de acceso asociados.
@@ -2290,20 +2330,23 @@ Os cambios futuros nesta páxina e na súa páxina de conversa asociada serán l
'enotif_mailer' => 'Sistema de notificacións por correo de {{SITENAME}}',
'enotif_reset' => 'Marcar todas as páxinas como visitadas',
-'enotif_newpagetext' => 'Esta é unha páxina nova.',
'enotif_impersonal_salutation' => 'Usuario de {{SITENAME}}',
-'changed' => 'modificada',
-'created' => 'creada',
-'enotif_subject' => 'A páxina de {{SITENAME}} chamada "$PAGETITLE" foi $CHANGEDORCREATED por $PAGEEDITOR',
+'enotif_subject_deleted' => '{{GENDER:$2|$2}} borrou a páxina chamada "$1" en {{SITENAME}}',
+'enotif_subject_created' => '{{GENDER:$2|$2}} creou a páxina chamada "$1" en {{SITENAME}}',
+'enotif_subject_moved' => '{{GENDER:$2|$2}} trasladou a páxina chamada "$1" en {{SITENAME}}',
+'enotif_subject_restored' => '{{GENDER:$2|$2}} restaurou a páxina chamada "$1" en {{SITENAME}}',
+'enotif_subject_changed' => '{{GENDER:$2|$2}} modificou a páxina chamada "$1" en {{SITENAME}}',
+'enotif_body_intro_deleted' => '{{GENDER:$2|$2}} borrou a páxina chamada "$1" en {{SITENAME}} o $PAGEEDITDATE. Consulte $3.',
+'enotif_body_intro_created' => '{{GENDER:$2|$2}} creou a páxina chamada "$1" en {{SITENAME}} o $PAGEEDITDATE. Consulte $3 para ver a revisión actual.',
+'enotif_body_intro_moved' => '{{GENDER:$2|$2}} trasladou a páxina chamada "$1" en {{SITENAME}} o $PAGEEDITDATE. Consulte $3 para ver a revisión actual.',
+'enotif_body_intro_restored' => '{{GENDER:$2|$2}} restaurou a páxina chamada "$1" en {{SITENAME}} o $PAGEEDITDATE. Consulte $3 para ver a revisión actual.',
+'enotif_body_intro_changed' => '{{GENDER:$2|$2}} modificou a páxina chamada "$1" en {{SITENAME}} o $PAGEEDITDATE. Consulte $3 para ver a revisión actual.',
'enotif_lastvisited' => 'Consulte $1 para comprobar todos os cambios feitos desde a súa última visita.',
'enotif_lastdiff' => 'Consulte $1 para ver esta modificación.',
'enotif_anon_editor' => 'usuario anónimo $1',
-'enotif_body' => 'Estimado $WATCHINGUSERNAME:
-
-
-A páxina de {{SITENAME}} "$PAGETITLE" foi $CHANGEDORCREATED o $PAGEEDITDATE por $PAGEEDITOR, olle $PAGETITLE_URL para comprobar a versión actual.
+'enotif_body' => 'Boas, $WATCHINGUSERNAME:
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Resumo de edición: $PAGESUMMARY $PAGEMINOREDIT
@@ -2311,10 +2354,9 @@ Pode contactar co editor:
por correo electrónico: $PAGEEDITOR_EMAIL
no wiki: $PAGEEDITOR_WIKI
-Non se producirán novas notificacións cando haxa novos cambios ata que vostede visite a páxina.
-Pode borrar os indicadores de aviso de notificación para o conxunto das páxinas marcadas na súa lista de vixilancia.
+Non se producirán novas notificacións cando haxa novos cambios ata que vostede visite a páxina. Pode borrar os indicadores de aviso de notificación para o conxunto das páxinas marcadas na súa lista de vixilancia.
- O sistema de aviso de {{SITENAME}}
+ O sistema de avisos de {{SITENAME}}
--
Para cambiar as notificacións por correo electrónico, visite
@@ -2329,6 +2371,8 @@ $UNWATCHURL
Axuda:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'creada',
+'changed' => 'modificada',
# Delete
'deletepage' => 'Borrar a páxina',
@@ -2400,6 +2444,8 @@ Vexa a [[Special:ProtectedPages|lista de páxinas protexidas]] se quere obter a
'prot_1movedto2' => 'moveu "[[$1]]" a "[[$2]]"',
'protect-badnamespace-title' => 'Espazo de nomes que non se pode protexer',
'protect-badnamespace-text' => 'As páxinas presentes neste espazo de nomes non se poden protexer.',
+'protect-norestrictiontypes-text' => 'Esta páxina non se pode protexer porque non hai dispoñible ningún tipo de restrición.',
+'protect-norestrictiontypes-title' => 'Páxina non protexible',
'protect-legend' => 'Confirmar a protección',
'protectcomment' => 'Motivo:',
'protectexpiry' => 'Caducidade:',
@@ -2483,7 +2529,8 @@ O texto destas revisións eliminadas só está á disposición dos administrador
'undeletedrevisions' => '$1 {{PLURAL:$1|revisión restaurada|revisións restauradas}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|revisión|revisións}} e $2 {{PLURAL:$2|ficheiro restaurado|ficheiros restaurados}}',
'undeletedfiles' => '$1 {{PLURAL:$1|ficheiro restaurado|ficheiros restaurados}}',
-'cannotundelete' => 'Non se restaurou a páxina porque alguén xa o fixo antes.',
+'cannotundelete' => 'Houbo un erro durante a restauración:
+$1',
'undeletedpage' => "'''A páxina \"\$1\" foi restaurada'''
Comprobe o [[Special:Log/delete|rexistro de borrados]] para ver as entradas recentes no rexistro de páxinas eliminadas e restauradas.",
@@ -2515,7 +2562,7 @@ $1',
'blanknamespace' => '(Principal)',
# Contributions
-'contributions' => 'Contribucións {{GENDER:{{BASEPAGENAME}}|do usuario|da usuaria}}',
+'contributions' => 'Contribucións {{GENDER:$1|do usuario|da usuaria}}',
'contributions-title' => 'Contribucións de $1',
'mycontris' => 'Contribucións',
'contribsub2' => 'De $1 ($2)',
@@ -2786,6 +2833,7 @@ Quérea borrar para deixar sitio para facer o traslado?',
'immobile-target-namespace-iw' => 'A ligazón interwiki non é válida para o movemento da páxina.',
'immobile-source-page' => 'Esta páxina non se pode mover.',
'immobile-target-page' => 'Non se pode mover a ese título.',
+'bad-target-model' => 'O destino desexado utiliza un modelo de contido diferente. Non se pode facer a conversión entre $1 e $2.',
'imagenocrossnamespace' => 'Non se pode mover o ficheiro a un espazo de nomes que non o admite',
'nonfile-cannot-move-to-file' => 'Non se pode mover algo que non é un ficheiro ao espazo de nomes reservado aos ficheiros',
'imagetypemismatch' => 'A nova extensión do fiheiro non coincide co seu tipo',
@@ -2897,6 +2945,7 @@ Gárdeo no seu disco duro e cárgueo aquí.',
'import-error-interwiki' => 'Non se pode importar a páxina "$1" porque o seu nome está reservado para unha ligazón externa (interwiki).',
'import-error-special' => 'Non se pode importar a páxina "$1" porque pertence a un espazo de nomes especial que non o permite.',
'import-error-invalid' => 'Non se pode importar a páxina "$1" porque o seu nome non é válido.',
+'import-error-unserialize' => 'Non se puido deserializar a revisión $2 da páxina "$1". Informouse de que a revisión usa o modelo de contido $3 serializado como $4.',
'import-options-wrong' => '{{PLURAL:$2|Opción incorrecta|Opcións incorrectas}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'A páxina raíz dada é un título non válido.',
'import-rootpage-nosubpage' => 'O espazo de nomes "$1" da páxina raíz non permite as subpáxinas.',
@@ -2911,7 +2960,6 @@ Gárdeo no seu disco duro e cárgueo aquí.',
# JavaScriptTest
'javascripttest' => 'Proba de JavaScript',
-'javascripttest-disabled' => 'Esta función está desactivada neste wiki.',
'javascripttest-title' => 'Executando probas de $1',
'javascripttest-pagetext-noframework' => 'Esta páxina está reservada para executar probas do JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Descoñécese a infraestrutura dixital "$1" de probas.',
@@ -3061,11 +3109,13 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
'pageinfo-default-sort' => 'Clave de ordenación por defecto',
'pageinfo-length' => 'Lonxitude da páxina (en bytes)',
'pageinfo-article-id' => 'ID da páxina',
+'pageinfo-language' => 'Lingua do contido da páxina',
'pageinfo-robot-policy' => 'Estado do motor de procuras',
'pageinfo-robot-index' => 'Indexable',
'pageinfo-robot-noindex' => 'Non indexable',
'pageinfo-views' => 'Número de visitas',
'pageinfo-watchers' => 'Número de vixiantes da páxina',
+'pageinfo-few-watchers' => 'Menos de $1 {{PLURAL:$1|vixiante|vixiantes}}',
'pageinfo-redirects-name' => 'Redireccións cara a esta páxina',
'pageinfo-subpages-name' => 'Subpáxinas desta páxina',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirección|redireccións}}; $3 {{PLURAL:$3|non-redirección|non-redireccións}})',
@@ -3080,6 +3130,19 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
'pageinfo-magic-words' => '{{PLURAL:$1|Palabra máxica|Palabras máxicas}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoría agochada|Categorías agochadas}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Modelo incluído|Modelos incluídos}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Páxina incluída|Páxinas incluídas}} ($1)',
+'pageinfo-toolboxlink' => 'Información da páxina',
+'pageinfo-redirectsto' => 'Redirixe cara a',
+'pageinfo-redirectsto-info' => 'información',
+'pageinfo-contentpage' => 'Cóntase como páxina de contido?',
+'pageinfo-contentpage-yes' => 'Si',
+'pageinfo-protect-cascading' => 'Protección en serie activada',
+'pageinfo-protect-cascading-yes' => 'Si',
+'pageinfo-protect-cascading-from' => 'Protección en serie activada',
+'pageinfo-category-info' => 'Información da categoría',
+'pageinfo-category-pages' => 'Número de páxinas',
+'pageinfo-category-subcats' => 'Número de subcategorías',
+'pageinfo-category-files' => 'Número de ficheiros',
# Skin names
'skinname-standard' => 'Clásica',
@@ -3101,6 +3164,8 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
'markedaspatrollederror' => 'Non se pode marcar como revisada',
'markedaspatrollederrortext' => 'É preciso especificar unha revisión para marcala como revisada.',
'markedaspatrollederror-noautopatrol' => 'Non está permitido que un mesmo marque as propias edicións como revisadas.',
+'markedaspatrollednotify' => 'A modificación feita en "$1" marcouse como revisada.',
+'markedaspatrollederrornotify' => 'Erro ao marcar como revisada.',
# Patrol log
'patrol-log-page' => 'Rexistro de revisións',
@@ -3134,6 +3199,7 @@ O seu sistema pode quedar comprometido se o executa.",
'file-nohires' => 'Non se dispón dunha resolución máis grande.',
'svg-long-desc' => 'ficheiro SVG; resolución de $1 × $2 píxeles; tamaño do ficheiro: $3',
'svg-long-desc-animated' => 'ficheiro SVG animado; resolución de $1 × $2 píxeles; tamaño do ficheiro: $3',
+'svg-long-error' => 'Ficheiro SVG non válido: $1',
'show-big-image' => 'Imaxe na máxima resolución',
'show-big-image-preview' => 'Tamaño desta vista previa: $1.',
'show-big-image-other' => '{{PLURAL:$2|Outra resolución|Outras resolucións}}: $1.',
@@ -3164,7 +3230,10 @@ O seu sistema pode quedar comprometido se o executa.",
'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
'days' => '{{PLURAL:$1|$1 día|$1 días}}',
+'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
+'years' => '{{PLURAL:$1|$1 ano|$1 anos}}',
'ago' => 'hai $1',
+'just-now' => 'agora mesmo',
# Bad image list
'bad_image_list' => 'O formato é o seguinte:
@@ -3665,6 +3734,7 @@ O código de confirmación caduca o $6 ás $7.',
# Scary transclusion
'scarytranscludedisabled' => '[A transclusión interwiki está desactivada]',
'scarytranscludefailed' => '[Fallou a busca do modelo "$1"]',
+'scarytranscludefailed-httpstatus' => '[Fallou a busca do modelo "$1": HTTP $2]',
'scarytranscludetoolong' => '[O enderezo URL é demasiado longo]',
# Delete conflict
@@ -3780,6 +3850,7 @@ Tamén pode [[Special:EditWatchlist|empregar o editor normal]].',
'version-license' => 'Licenza',
'version-poweredby-credits' => "Este wiki está desenvolvido por '''[//www.mediawiki.org/wiki/MediaWiki/gl MediaWiki]''', dereitos de autor © 2001-$1 $2.",
'version-poweredby-others' => 'outros',
+'version-credits-summary' => 'Queremos recoñecer as seguintes persoas polas súas achegas a [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki é software libre; pode redistribuílo e/ou modificalo segundo os termos da licenza pública xeral GNU publicada pola Free Software Foundation; versión 2 ou (na súa escolla) calquera outra posterior.
MediaWiki distribúese coa esperanza de que poida ser útil, pero SEN GARANTÃA NINGUNHA; nin sequera a garantía implícita de COMERCIALIZACIÓN ou ADECUACIÓN A UNHA FINALIDADE ESPECÃFICA. Olle a licenza pública xeral GNU para obter máis detalles.
@@ -3895,17 +3966,17 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros inÃ
'sqlite-no-fts' => '$1 sen soporte para procuras de texto completo',
# New logging system
-'logentry-delete-delete' => '$1 borrou a páxina "$3"',
-'logentry-delete-restore' => '$1 restaurou a páxina "$3"',
-'logentry-delete-event' => '$1 mudou a visibilidade {{PLURAL:$5|dunha entrada|de $5 entradas}} do rexistro de "$3": $4',
-'logentry-delete-revision' => '$1 mudou a visibilidade {{PLURAL:$5|dunha revisión|de $5 revisións}} da páxina "$3": $4',
-'logentry-delete-event-legacy' => '$1 mudou a visibilidade de entradas do rexistro de "$3"',
-'logentry-delete-revision-legacy' => '$1 mudou a visibilidade de revisións da páxina "$3"',
-'logentry-suppress-delete' => '$1 suprimiu a páxina "$3"',
-'logentry-suppress-event' => '$1 mudou de xeito secreto a visibilidade {{PLURAL:$5|dunha entrada|de $5 entradas}} do rexistro de "$3": $4',
-'logentry-suppress-revision' => '$1 mudou de xeito secreto a visibilidade {{PLURAL:$5|dunha revisión|de $5 revisións}} da páxina "$3": $4',
-'logentry-suppress-event-legacy' => '$1 mudou de xeito secreto a visibilidade de entradas do rexistro de "$3"',
-'logentry-suppress-revision-legacy' => '$1 mudou de xeito secreto a visibilidade de revisións da páxina "$3"',
+'logentry-delete-delete' => '$1 {{GENDER:$2|borrou}} a páxina "$3"',
+'logentry-delete-restore' => '$1 {{GENDER:$2|restaurou}} a páxina "$3"',
+'logentry-delete-event' => '$1 {{GENDER:$2|mudou}} a visibilidade {{PLURAL:$5|dunha entrada|de $5 entradas}} do rexistro de $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|mudou}} a visibilidade {{PLURAL:$5|dunha revisión|de $5 revisións}} da páxina "$3": $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|mudou}} a visibilidade de entradas do rexistro de $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|mudou}} a visibilidade de revisións da páxina "$3"',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|suprimiu}} a páxina "$3"',
+'logentry-suppress-event' => '$1 {{GENDER:$2|mudou}} de xeito secreto a visibilidade {{PLURAL:$5|dunha entrada|de $5 entradas}} do rexistro de $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|mudou}} de xeito secreto a visibilidade {{PLURAL:$5|dunha revisión|de $5 revisións}} da páxina "$3": $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|mudou}} de xeito secreto a visibilidade de entradas do rexistro de $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|mudou}} de xeito secreto a visibilidade de revisións da páxina "$3"',
'revdelete-content-hid' => 'agochou contidos',
'revdelete-summary-hid' => 'agochou o resumo de edición',
'revdelete-uname-hid' => 'agochou o nome de usuario',
@@ -3914,17 +3985,21 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros inÃ
'revdelete-uname-unhid' => 'descubriu o nome de usuario',
'revdelete-restricted' => 'aplicou restricións aos administradores',
'revdelete-unrestricted' => 'eliminou restricións aos administradores',
-'logentry-move-move' => '$1 moveu a páxina "$3" a "$4"',
-'logentry-move-move-noredirect' => '$1 moveu a páxina "$3" a "$4" sen deixar unha redirección',
-'logentry-move-move_redir' => '$1 moveu a páxina "$3" a "$4" sobre unha redirección',
-'logentry-move-move_redir-noredirect' => '$1 moveu a páxina "$3" a "$4" sobre unha redirección sen deixar unha redirección',
-'logentry-patrol-patrol' => '$1 marcou a revisión $4 da páxina "$3" como patrullada',
-'logentry-patrol-patrol-auto' => '$1 marcou automaticamente a revisión $4 da páxina "$3" como patrullada',
-'logentry-newusers-newusers' => 'Creouse a conta de usuario $1',
-'logentry-newusers-create' => 'Creouse a conta de usuario $1',
-'logentry-newusers-create2' => '$1 creou a conta de usuario $3',
-'logentry-newusers-autocreate' => 'A conta de usuario $1 creouse automaticamente',
-'newuserlog-byemail' => 'contrasinal enviado por correo electrónico',
+'logentry-move-move' => '$1 {{GENDER:$2|moveu}} a páxina "$3" a "$4"',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|moveu}} a páxina "$3" a "$4" sen deixar unha redirección',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|moveu}} a páxina "$3" a "$4" sobre unha redirección',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|moveu}} a páxina "$3" a "$4" sobre unha redirección sen deixar unha redirección',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|marcou}} a revisión $4 da páxina "$3" como patrullada',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|marcou}} automaticamente a revisión $4 da páxina "$3" como patrullada',
+'logentry-newusers-newusers' => 'Creouse a conta de {{GENDER:$2|usuario|usuaria}} $1',
+'logentry-newusers-create' => 'Creouse a conta de {{GENDER:$2|usuario|usuaria}} $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|creou}} a conta de usuario $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|creou}} a conta de usuario $3; o contrasinal enviouse por correo electrónico',
+'logentry-newusers-autocreate' => 'A conta de {{GENDER:$2|usuario|usuaria}} $1 creouse automaticamente',
+'logentry-rights-rights' => '$1 {{GENDER:$2|cambiou}} o grupo ao que pertence $3 de $4 a $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|cambiou}} o grupo ao que pertence $3',
+'logentry-rights-autopromote' => '$1 foi {{GENDER:$2|promovido|promovida}} automaticamente de $4 a $5',
+'rightsnone' => '(ningún)',
# Feedback
'feedback-bugornote' => 'Se está listo para describir un problema técnico en detalle, [$1 informe do erro].
@@ -3978,6 +4053,7 @@ En caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario
'api-error-ok-but-empty' => 'Erro interno: Non hai resposta do servidor.',
'api-error-overwrite' => 'Non está permitido sobrescribir un ficheiro existente.',
'api-error-stashfailed' => 'Erro interno: O servidor non puido almacenar o ficheiro temporal.',
+'api-error-publishfailed' => 'Erro interno: O servidor non puido publicar o ficheiro temporal.',
'api-error-timeout' => 'O servidor non respondeu no tempo esperado.',
'api-error-unclassified' => 'Houbo un erro descoñecido.',
'api-error-unknown-code' => 'Erro descoñecido: "$1"',
@@ -3998,4 +4074,7 @@ En caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario
'duration-centuries' => '$1 {{PLURAL:$1|século|séculos}}',
'duration-millennia' => '$1 {{PLURAL:$1|milenio|milenios}}',
+# Image rotation
+'rotate-comment' => 'Imaxe rotada $1 {{PLURAL:$1|grao|graos}} en sentido horario',
+
);
diff --git a/languages/messages/MessagesGlk.php b/languages/messages/MessagesGlk.php
index 511a535d..2a377925 100644
--- a/languages/messages/MessagesGlk.php
+++ b/languages/messages/MessagesGlk.php
@@ -14,6 +14,8 @@
$fallback = 'fa';
+$rtl = true;
+
$messages = array(
'moredotdotdot' => 'ویشتر...',
'mypage' => 'می هنه‌شر',
diff --git a/languages/messages/MessagesGrc.php b/languages/messages/MessagesGrc.php
index b10ebe1a..bd030445 100644
--- a/languages/messages/MessagesGrc.php
+++ b/languages/messages/MessagesGrc.php
@@ -180,7 +180,6 @@ $messages = array(
'qbbrowse' => 'Ἀλάου',
'qbedit' => 'ΜεταγÏάφειν',
'qbpageoptions' => 'Ἥδε ἡ δέλτος',
-'qbpageinfo' => 'Συγκείμενον',
'qbmyoptions' => 'Οἱ δέλτοι μου',
'qbspecialpages' => 'Εἰδικαὶ δέλτοι',
'faq' => 'Τὰ πολλάκις αἰτηθέντα',
@@ -413,11 +412,8 @@ $2',
# Login and logout pages
'logouttext' => "'''Îῦν Î³á½°Ï á¼€Ï€Î¿ÏƒÏ…Î½Î´ÎµÎ´ÎµÎ¼Î­Î½Î¿Ï‚ εἰ.'''
-Ἔξεστί σοι χÏῆσθαι Ï„á¿· {{SITENAME}} ἀνωνÏμως, á¼¢ ἔξεστί σοι [[Special:UserLogin|συνδεῖσθαι πάλιν]] ὡς ὠαá½Ï„ὸς á¼¢ ὡς ἄλλος χÏώμενος.
+Ἔξεστί σοι χÏῆσθαι Ï„á¿· {{SITENAME}} ἀνωνÏμως, á¼¢ ἔξεστί σοι <span class='plainlinks'>[$1 συνδεῖσθαι πάλιν]</span> ὡς ὠαá½Ï„ὸς á¼¢ ὡς ἄλλος χÏώμενος.
Δέλτοι τινὲς δέ, á¼Î½Î´ÎµÏ‡Î¿Î¼Î­Î½Ï‰Ï‚, δειχθήσονται ὡς ἂν ἀκμὴν συνδεδεμένος á¾–Ï‚, μέχÏι ὅτε καθαίÏῃς τὴν λανθάνουσαν μνήμην τοῦ Ï€ÏογÏάμματος πλοηγήσεώς σου.",
-'welcomecreation' => '== Ὡς εὖ παÏέστης, $1! ==
-
-Λογισμός σὸς πεποίηται. Μέμνησο μεταβάλλειν Ï„á½°Ï‚ τοῦ [[Special:Preferences|{{SITENAME}} Ï€ÏοαιÏέσεις σου]].',
'yourname' => 'Ὄνομα χÏωμένου:',
'yourpassword' => 'Σῆμα:',
'yourpasswordagain' => 'Ἀνατυπῶσαι σÏνθημα:',
@@ -624,7 +620,6 @@ $2',
'template-protected' => '(φυλλάττεται)',
'template-semiprotected' => '(ἡμιπεφυλαγμένη)',
'hiddencategories' => 'Ἥδε ἡ δέλτος μέλος á¼ÏƒÏ„ὶ {{PLURAL:$1|1 τῆς κεκÏυμμένης κατηγοÏίας|$1 τῶν κεκÏυμμένων κατηγοÏιῶν}}:',
-'nocreatetitle' => 'Ποίησις δέλτων πεÏιωÏισμένη',
'nocreatetext' => "{{SITENAME}} οὠσ'á¼á¾· νέας δέλτους ποιεῖν.
Ἐᾷ σε δέλτον ἢδη οὖσαν μεταβάλλειν ἢ [[Special:UserLogin|συνδεῖσθαι ἢ λογισμὸν ποιεῖν]].",
'nocreate-loggedin' => 'Οá½Îº ἔξεστι σοι νέας δέλτους ποιεῖν.',
@@ -1050,11 +1045,13 @@ $1",
'right-siteadmin' => 'ΦÏάττειν καὶ ἀποφÏάττειν τὴν βάσιν δεδομένων',
'right-override-export-depth' => 'Ἐξάγειν δέλτους πεÏιλαμβανομένων συνδεδεμένων δέλτων ἕως βάθος τι 5 á¼Ï€Î¹Ï€Î­Î´Ï‰Î½',
+# Special:Log/newusers
+'newuserlogpage' => 'Κατάλογος ποιήσεων λογισμῶν.',
+'newuserlogpagetext' => 'á½Î´Îµ á¼ÏƒÏ„ὶν κατάλογος τις τῶν ποιήσεων λογισμῶν.',
+
# User rights log
'rightslog' => 'Κατάλογος δικαιωμάτων χÏωμένων',
'rightslogtext' => 'Κατάλογος ἀλλαγῶν τῶν δικαιωμάτων χÏωμένων.',
-'rightslogentry' => 'Μετεβλήθη ἡ μελότης (δικαιώματα μέλους) διὰ τὸν $1 á¼Îº τῆς $2 εἰς τὴν $3',
-'rightsnone' => '(Οá½Î´Î­Î½)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ἀναγιγνώσκειν τήνδε τὴν δέλτον',
@@ -1488,10 +1485,6 @@ $1",
'activeusers-hidesysops' => 'ΚÏÏπτειν á¼Ï€Î¹Ï„Ïόπους',
'activeusers-noresult' => 'Οá½Î´Îµá½¶Ï‚ χÏώμενος εὑÏέθη.',
-# Special:Log/newusers
-'newuserlogpage' => 'Κατάλογος ποιήσεων λογισμῶν.',
-'newuserlogpagetext' => 'á½Î´Îµ á¼ÏƒÏ„ὶν κατάλογος τις τῶν ποιήσεων λογισμῶν.',
-
# Special:ListGroupRights
'listgrouprights' => 'Δικαιώματα á½Î¼Î¬Î´Î¿Ï‚ χÏωμένου',
'listgrouprights-group' => 'Ὁμάς',
@@ -1566,11 +1559,7 @@ $1",
'enotif_mailer' => 'ΣÏστημα εἰδήσεως τοῦ {{SITENAME}} μέσῳ á¼Ï€Î¹ÏƒÏ„ολῶν',
'enotif_reset' => 'Σημαίνειν á¼Ï€Î¬ÏƒÎ±Ï‚ Ï„á½°Ï‚ á¼Ï€ÎµÏƒÎºÎ¿Ï€Î·Î¼Î­Î½Î±Ï‚ δέλτους',
-'enotif_newpagetext' => 'Ἥδε νέα δέλτος á¼ÏƒÏ„ίν.',
'enotif_impersonal_salutation' => 'ΧÏώμενος Ï„á¿· {{SITENAME}}',
-'changed' => 'ἠλλαγμένη',
-'created' => 'ποιηθέν',
-'enotif_subject' => 'Ἡ τοῦ {{SITENAME}} δέλτος $PAGETITLE á¼Ï€Î¿Î¹á¼ Î¸Î· $CHANGEDORCREATED ὑπὸ τὸν $PAGEEDITOR',
'enotif_lastvisited' => 'Ἴδε $1 διὰ á¼Ï€Î¬ÏƒÎ±Ï‚ Ï„á½°Ï‚ ἀλλαγὰς á¼Îº τῆς ὑστάτης á¼Ï€Î¹ÏƒÎºÎ­ÏˆÎµÏŽÏ‚ σου.',
'enotif_lastdiff' => 'Ἴδε $1 διὰ τὸ á½Ïᾶν τήνδε τὴν ἀλλαγήν.',
'enotif_anon_editor' => 'ἀνώνυμος χÏώμενος $1',
@@ -1597,6 +1586,8 @@ $NEWPAGE
ἈνάδÏασις καὶ πεÏαιτέÏω βοήθεια:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'ποιηθέν',
+'changed' => 'ἠλλαγμένη',
# Delete
'deletepage' => 'ΔιαγÏάφειν τὴν δέλτον',
@@ -2710,7 +2701,7 @@ $5
# New logging system
'revdelete-restricted' => 'á¼Ï†Î·Ïμοσμένοι πεÏιοÏισμοὶ διὰ τοὺς á¼Ï€Î¹Ï„Ïόπους',
'revdelete-unrestricted' => 'αἱÏεθέντες πεÏιοÏισμοὶ διὰ τοὺς á¼Ï€Î¹Ï„Ïόπους',
-'newuserlog-byemail' => 'σÏνθημα ἀπεσταλμένον μέσῳ ἠλ-ταχυδÏομείου',
+'rightsnone' => '(Οá½Î´Î­Î½)',
# Feedback
'feedback-cancel' => 'ἈκυÏοῦν',
diff --git a/languages/messages/MessagesGsw.php b/languages/messages/MessagesGsw.php
index f28e001a..e38cb958 100644
--- a/languages/messages/MessagesGsw.php
+++ b/languages/messages/MessagesGsw.php
@@ -96,7 +96,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Letschti_Änderige' ),
'Recentchangeslinked' => array( 'Änderige_an_verlinkte_Syte' ),
'Revisiondelete' => array( 'Versionsleschig' ),
- 'RevisionMove' => array( 'Version_verschiebe' ),
'Search' => array( 'Suech' ),
'Shortpages' => array( 'Churzi_Syte' ),
'Specialpages' => array( 'Spezialsyte' ),
@@ -278,7 +277,6 @@ $messages = array(
'qbbrowse' => 'Blättre',
'qbedit' => 'Ändere',
'qbpageoptions' => 'Sytenoptione',
-'qbpageinfo' => 'Sytedate',
'qbmyoptions' => 'Ystellige',
'qbspecialpages' => 'Spezialsytene',
'faq' => 'Froge, wo vilmol gstellt wäre',
@@ -536,12 +534,9 @@ Dr Administrator, wu dr Schrybzuegriff gsperrt het, het dää Grund aagee: „$3
# Login and logout pages
'logouttext' => "'''Du bisch jetz abgmäldet.'''
-Du chasch {{SITENAME}} wyter anonym bruche, oder Du chasch di [[Special:UserLogin|wider aamälde]] mit em glyche oder eme andere Benutzername.
+Du chasch {{SITENAME}} wyter anonym bruche, oder Du chasch di <span class='plainlinks'>[$1 wider aamälde]</span> mit em glyche oder eme andere Benutzername.
Ochat: s cha syy, ass bstimmti Syte eso aazeigt wäre, wie wänn Du allno aagmäldet wärsch, bis Du dr Zwischespycher vu Dyym Browser glescht hesch.",
-'welcomecreation' => '==Willcho, $1!==
-Dyy Benutzerkonto isch aaglait wore.
-Vergiss nid, dyni [[Special:Preferences|{{SITENAME}}-Yystellige]] aazpasse.',
'yourname' => 'Dyy Benutzername',
'yourpassword' => 'Passwort:',
'yourpasswordagain' => 'Passwort no mol yygee:',
@@ -873,7 +868,6 @@ As Referänz wird do dr letscht Logbuechyytrag aagee:",
'template-semiprotected' => '(schrybgschitzt fir Benutzer, wo nit aagmäldet oder nei sin)',
'hiddencategories' => 'Die Syte ghert zue {{PLURAL:$1|einere versteckte Kategori|$1 versteckte Kategorie}}:',
'edittools' => '<!-- Dää Text wird unter em "Ändere"-Formular un bim "Uffelade"-Formular aagzeigt. -->',
-'nocreatetitle' => 'S Aalege vu neje Syte isch yygschränkt.',
'nocreatetext' => "Uf {{SITENAME}} isch d Erstellig vo nöue Syten ygschränkt.
Du chasch nur Syten ändere, wo's scho git, oder muesch di [[Special:UserLogin|amälde]].",
'nocreate-loggedin' => 'Du bisch nid berächtigt, neji Syte aazlege.',
@@ -896,6 +890,15 @@ Si isch schyns glescht wore.',
'edit-no-change' => 'Dyyni Bearbeitig isch ignoriert wore, wel kei Änderig am Täxt gmacht woren isch.',
'edit-already-exists' => 'Di nej Syte het nid chenne aaglait wäre, wel s si scho git.',
'defaultmessagetext' => 'Standardtext',
+'content-failed-to-parse' => 'Parse vum Inhalt $2 fir Modell $1 fählgschlaa: $3',
+'invalid-content-data' => 'Uugiltigi Inhaltsdate',
+'content-not-allowed-here' => 'Dr Inhalt „$1“ isch uf dr Syte [[$2]] nit erlaubt',
+
+# Content models
+'content-model-wikitext' => 'Wikitext',
+'content-model-text' => 'Klartext',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Achtig: In däre Syte het s z vyyl Ufruef vu ufwändige Parserfunktione.
@@ -1402,12 +1405,13 @@ Des cha nimmi ruckgängig gmacht wäre.',
'right-sendemail' => 'E-Mail an anderi Benutzer schicke',
'right-passwordreset' => 'Passwort vun eme Benutzer zruggsetze',
+# Special:Log/newusers
+'newuserlogpage' => 'Nejaamäldigs-Logbuech',
+'newuserlogpagetext' => 'Des isch e Logbuech fir nej aagleiti Benutzerchonte.',
+
# User rights log
'rightslog' => 'Benutzerrächt-Logbuech',
'rightslogtext' => 'Des ischs Logbuech vun de Änderunge on Bnutzerrechte.',
-'rightslogentry' => 'het d Benutzerrächt fir „$1“ vu „$2“ uf „$3“ gänderet',
-'rightslogentry-autopromote' => 'd Zueornig zue dr Benutzergruppe isch automatisch vu $2 in $3 gänderet wore',
-'rightsnone' => '(keini)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'die Syte z läse',
@@ -2034,10 +2038,6 @@ Lueg au d Lischt vu dr [[Special:WantedCategories|gwinschte Kategorie]].',
'activeusers-hidesysops' => 'Ammanne (Administratore) uusblände',
'activeusers-noresult' => 'Kei Benutzer gfunde.',
-# Special:Log/newusers
-'newuserlogpage' => 'Nejaamäldigs-Logbuech',
-'newuserlogpagetext' => 'Des isch e Logbuech fir nej aagleiti Benutzerchonte.',
-
# Special:ListGroupRights
'listgrouprights' => 'Benutzergruppe-Rächt',
'listgrouprights-summary' => 'Des isch e Liste vu dr Benutzergruppe, wu in däm Wiki definiert sin, un dr Rächt, wu dermit verbunde sin.
@@ -2134,11 +2134,7 @@ Wänn Du d Syte speter wider vu dr Lischt witt stryyche, deno druck eifach uf â€
'enotif_mailer' => '{{SITENAME}} E-Mail-Benochrichtigungsdienscht',
'enotif_reset' => 'Alli Syte as aagluegt markiere',
-'enotif_newpagetext' => 'Des isch e neiji Syte.',
'enotif_impersonal_salutation' => '{{SITENAME}}-Benutzer',
-'changed' => 'gänderet',
-'created' => 'aagleit',
-'enotif_subject' => 'D {{SITENAME}} Syte $PAGETITLE isch vum $PAGEEDITOR $CHANGEDORCREATED wore.',
'enotif_lastvisited' => '$1 zeigt alli Änderige uf s Mol.',
'enotif_lastdiff' => 'Lueg $1 no däre Änderig.',
'enotif_anon_editor' => 'Anonyme Benutzer $1',
@@ -2168,6 +2164,8 @@ Go d Yystellige vu Dyyre Beobachtigslischte ändere, gang uf {{canonicalurl:{{#s
Go d Syte us Dyyre Beobachtigslischte uuseneh, gang uf $UNWATCHURL
Ruckmäldig un wyteri Hilf: {{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'aagleit',
+'changed' => 'gänderet',
# Delete
'deletepage' => 'Syte lösche',
@@ -2314,7 +2312,9 @@ In däm Fall darf di neijscht Version nit markiert wäre oder ihre Status muess
'undeletedrevisions' => '{{PLURAL:$1|ei Revision|$1 Revisione}} wider zruckgholt.',
'undeletedrevisions-files' => '{{PLURAL:$1|1 Version|$1 Versione}} un {{PLURAL:$2|1 Datei|$2 Dateie}} sin widerhärgstellt wore',
'undeletedfiles' => '{{PLURAL:$1|1 Datei isch|$1 Dateie sin}} widerhärgstellt wore',
-'cannotundelete' => 'Widerhärstellig isch nit gange; eber ander het villicht d Syte scho widerhärgstellt.',
+'cannotundelete' => 'D Widerhärstellig isch nit gange:
+
+$1',
'undeletedpage' => "'''„$1“''' isch widerhärgstellt wore.
Im [[Special:Log/delete|Lesch-Logbuech]] findsch e Ibersicht vu dr gleschte un widerhärgstellte Syte.",
@@ -2345,7 +2345,7 @@ $1',
'blanknamespace' => '(Haupt-)',
# Contributions
-'contributions' => 'Benutzer-Byträg',
+'contributions' => '{{GENDER:$1|Benutzer-Byträg}}',
'contributions-title' => 'Benutzerbyytreg vu „$1“',
'mycontris' => 'Myyni Byyträg',
'contribsub2' => 'Für $1 ($2)',
@@ -2597,6 +2597,7 @@ D Syte „[[:$1]]“ gits scho. Wottsch du si lösche, zume Platz zum verschiebe
'immobile-target-namespace-iw' => 'E Interwiki-Link isch kei gültigs Ziil für e Syteverschiebig.',
'immobile-source-page' => 'Die Syte cha nüt verschobe werde.',
'immobile-target-page' => 'Uf die Ziilsyte cha nüt verschobe werde.',
+'bad-target-model' => 'Di gwinsche Ziilsyte brucht e ander Inhaltsmodell. S Inhaltsmodell $1 cha nit in s Inhaltsmodell $2 umgwandlet wäre.',
'imagenocrossnamespace' => 'Dateie chönne nüt ussem {{ns:file}}-Namensruum use verschobe werde',
'nonfile-cannot-move-to-file' => 'Nit-Dateie chenne nit in dr Datei-Namensruum verschobe wäre',
'imagetypemismatch' => 'D nöii Dateierwiiterig passt nüt zu sym Typ',
@@ -2719,7 +2720,6 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
# JavaScriptTest
'javascripttest' => 'JavaScript-Tescht',
-'javascripttest-disabled' => 'Die Funktion isch in däm Wiki nit aktiviert wore.',
'javascripttest-title' => '$1-Tescht wäre durgfiert',
'javascripttest-pagetext-noframework' => 'Die Syte isch reserviert fir JavaSkript-Tescht.',
'javascripttest-pagetext-unknownframework' => 'Nit bekannt Framework „$1“.',
@@ -2832,6 +2832,7 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
'pageinfo-default-sort' => 'Standardsortierkriterium',
'pageinfo-length' => 'Sytelengi (in Byte)',
'pageinfo-article-id' => 'Syten-ID',
+'pageinfo-language' => 'Syteninhaltssproch',
'pageinfo-robot-policy' => 'Suechmaschinestatus',
'pageinfo-robot-index' => 'Indexierbar',
'pageinfo-robot-noindex' => 'Nit indexierbar',
@@ -2851,6 +2852,14 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
'pageinfo-magic-words' => '{{PLURAL:$1|Magischs Wort|Magischi Werter}} ($1)',
'pageinfo-hidden-categories' => 'Versteckti {{PLURAL:$1|Kategori|Kategorie}} ($1)',
'pageinfo-templates' => 'Yybundeni {{PLURAL:$1|Vorlag|Vorlage}} ($1)',
+'pageinfo-toolboxlink' => 'Informatione zue dr Syte',
+'pageinfo-redirectsto' => 'Weiterleitung nach',
+'pageinfo-redirectsto-info' => 'Information',
+'pageinfo-contentpage' => 'Zellt as Inhaltssyte',
+'pageinfo-contentpage-yes' => 'Jo',
+'pageinfo-protect-cascading' => 'Syte mit Kaskadeschutz vu do',
+'pageinfo-protect-cascading-yes' => 'Jo',
+'pageinfo-protect-cascading-from' => 'Syte mit Kaskadeschutz vu',
# Patrolling
'markaspatrolleddiff' => 'Als patrulyrt markyre',
@@ -2862,6 +2871,7 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
'markedaspatrollederror' => 'Markierig as „kontrolliert“ nit megli.',
'markedaspatrollederrortext' => 'Du muesch e Syteänderig uswehle.',
'markedaspatrollederror-noautopatrol' => 'S isch nit erlaubt, eigeni Bearbeitige as kontrolliert z markiere.',
+'markedaspatrollednotify' => 'Die Änderig an $1 isch as kontrolliert markiert wore.',
# Patrol log
'patrol-log-page' => 'Kontroll-Logbuech',
@@ -3420,6 +3430,7 @@ Dää Bstetigungscode isch giltig bis am $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-Yybindig isch deaktiviert]',
'scarytranscludefailed' => '[Vorlage-Yybindig fir $1 isch gescheitert]',
+'scarytranscludefailed-httpstatus' => '[Vorlagenabruef fählgschlaa fir $1: HTTP $2]',
'scarytranscludetoolong' => '[URL isch z lang]',
# Delete conflict
@@ -3527,6 +3538,7 @@ Du chasch au d [[Special:EditWatchlist|Standard-Bearbeitigssyte]] bruuche.',
'version-license' => 'Lizänz',
'version-poweredby-credits' => "Die Websyte nutzt '''[//www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
'version-poweredby-others' => 'anderi',
+'version-credits-summary' => 'Mir danke däne Lyt fir ihri Bytreg zue [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki isch e freji Software, d. h. s cha, no dr Bedingige vu dr GNU General Public-Lizänz, wu vu dr Free Software Foundation vereffentligt woren isch, wyterverteilt un/oder modifiziert wäre. Doderbyy cha d Version 2, oder no eigenem Ermässe, jedi nejeri Version vu dr Lizänz brucht wäre.
Des Programm wird in dr Hoffnig verteilt, ass es nitzli isch, aber OHNI JEDI GARANTI un sogar ohni di impliziert Garanti vun ere MÄRTGÄNGIGKEIT oder EIGNIG FIR E BSTIMMTE ZWÄCK. Doderzue git meh Hiiwys in dr GNU General Public-Lizänz.
@@ -3669,7 +3681,10 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
'logentry-newusers-create' => 'Benutzerkonto $1 isch aagleit wore.',
'logentry-newusers-create2' => 'Benutzerkonto $3 isch aalgeit wore vu $1',
'logentry-newusers-autocreate' => 'S Benutzerchonto $1 isch automatisch erstellt worde',
-'newuserlog-byemail' => 's Passwort isch per E-Mail gschickt wore',
+'logentry-rights-rights' => '$1 het d Gruppezuegherigkeit fir $3 vu $4 uf $5 gänderet',
+'logentry-rights-rights-legacy' => '$1 het d Gruppezuegherigkeit fir $3 gänderet',
+'logentry-rights-autopromote' => '$1 isch automatisch vu $4 zue $5 zuegordnet wore',
+'rightsnone' => '(keini)',
# Feedback
'feedback-bugornote' => 'Wän Du detailliert e tächnisch Probläm witt bschryybe, no mäld bitte [$1 ne Fähler].
diff --git a/languages/messages/MessagesGu.php b/languages/messages/MessagesGu.php
index f4020dfe..815c109f 100644
--- a/languages/messages/MessagesGu.php
+++ b/languages/messages/MessagesGu.php
@@ -285,6 +285,7 @@ $messages = array(
'newwindow' => '(નવા પાનામાં ખà«àª²àª¶à«‡)',
'cancel' => 'રદ કરો',
'moredotdotdot' => 'વધારે...',
+'morenotlisted' => 'વધૠયાદી કરેલી નથી...',
'mypage' => 'પાનà«àª‚',
'mytalk' => 'ચરà«àªšàª¾',
'anontalk' => 'આ IP માટેનà«àª‚ ચરà«àªšàª¾ પાનà«àª‚',
@@ -296,7 +297,6 @@ $messages = array(
'qbbrowse' => 'બà«àª°àª¾àª‰àª',
'qbedit' => 'ફેરફાર કરો',
'qbpageoptions' => 'આ પાનà«àª‚',
-'qbpageinfo' => 'સંદરà«àª­',
'qbmyoptions' => 'મારાં પાનાં',
'qbspecialpages' => 'ખાસ પાનાં',
'faq' => 'FAQ
@@ -320,6 +320,7 @@ $messages = array(
'namespaces' => 'નામાવકાશો',
'variants' => 'ભિનà«àª¨ રૂપો',
+'navigation-heading' => 'દિશાશોધન મેનà«',
'errorpagetitle' => 'તà«àª°à«àªŸàª¿',
'returnto' => '$1 પર પાછા જાઓ.',
'tagline' => '{{SITENAME}}થી',
@@ -564,10 +565,10 @@ $2',
# Login and logout pages
'logouttext' => "'''તમે (લોગ આઉટ કરીને) બહાર નિકળી ચà«àª•à«àª¯àª¾ છો.'''
-તમે અનામી તરીકે {{SITENAME}} વાપરવાનà«àª‚ ચાલૠરાખી શકો છો, કે પછી તેના તે જ કે અલગ સભà«àª¯ તરીકે [[Special:UserLogin|ફરી પà«àª°àªµà«‡àª¶]] કરી શકો છો.
+તમે અનામી તરીકે {{SITENAME}} વાપરવાનà«àª‚ ચાલૠરાખી શકો છો, કે પછી તેના તે જ કે અલગ સભà«àª¯ તરીકે <span class='plainlinks'>[$1 ફરી પà«àª°àªµà«‡àª¶]</span> કરી શકો છો.
ધà«àª¯àª¾àª¨ રાખો કે જà«àª¯àª¾àª‚ સà«àª§à«€ તમે તમારા બà«àª°àª¾àª‰àªàª°àª¨à«‹ કૅશ સાફ નહીં કરો તà«àª¯àª¾àª‚ સà«àª§à«€ કેટલાક પાનાં તમે પà«àª°àªµà«‡àª¶à«€ ચà«àª•à«àª¯àª¾ છો તેમ બતાવશે.",
-'welcomecreation' => '== તમારૂં સà«àªµàª¾àª—ત છે $1! ==
-તમારૂં ખાતà«àª‚ બની ગયà«àª‚ છે.
+'welcomeuser' => 'સà«àª¸à«àªµàª¾àª—તમà«, $1!',
+'welcomecreation-msg' => 'તમારૂં ખાતà«àª‚ ખà«àª²à«€ ગયà«àª‚ છે.
તમારી [[Special:Preferences|{{SITENAME}} પસંદ]] બદલવાનà«àª‚ ભૂલશો નહીં.',
'yourname' => 'સભà«àª¯ નામ:',
'yourpassword' => 'ગà«àªªà«àª¤ સંજà«àªžàª¾:',
@@ -591,7 +592,7 @@ $2',
'gotaccount' => "પહેલેથી ખાતà«àª‚ ખોલેલà«àª‚ છે? '''$1'''.",
'gotaccountlink' => 'પà«àª°àªµà«‡àª¶ કરો',
'userlogin-resetlink' => 'પોતાની પà«àª°àªµà«‡àª¶ માહિતી ભૂલી ગયા છો?',
-'createaccountmail' => 'ઇ-મેઇલ દà«àªµàª¾àª°àª¾',
+'createaccountmail' => 'કામચલાઉ ગમે-તેમ પાસવરà«àª¡ વાપરો અને તેને નીચે આપેલ ઇમેલ સરનામા પર મોકલો',
'createaccountreason' => 'કારણ:',
'badretype' => 'તમે દાખલ કરેલ ગà«àªªà«àª¤àª¸àª‚જà«àªžàª¾ મળતી આવતી નથી.',
'userexists' => 'દાખલ કરેલà«àª‚ સભà«àª¯ નૠનામ વપરાશમાં છે.</br>
@@ -730,6 +731,7 @@ $2
'changeemail-oldemail' => 'હાલ નà«àª‚ ઈ મેલ ખાતà«:',
'changeemail-newemail' => 'નવà«àª‚ ઈ-મેલ સરનામà«àª‚',
'changeemail-none' => '(કંઈ નહી)',
+'changeemail-password' => 'તમારો {{SITENAME}} પાસવરà«àª¡:',
'changeemail-submit' => 'ઈ મેલ બદલો',
'changeemail-cancel' => 'રદ કરો',
@@ -911,7 +913,6 @@ $2
'template-protected' => '(સà«àª°àª•à«àª·àª¿àª¤)',
'template-semiprotected' => '(અરà«àª§ સà«àª°àª•à«àª·àª¿àª¤)',
'hiddencategories' => 'આ પાનà«àª‚ {{PLURAL:$1|૧ છà«àªªà«€ શà«àª°à«‡àª£à«€|$1 છà«àªªà«€ શà«àª°à«‡àª£à«€àª“}}નà«àª‚ સભà«àª¯ છે:',
-'nocreatetitle' => 'પાનà«àª‚ બનાવવૌં મરà«àª¯àª¾àª¦àª¿àª¤ છે',
'nocreatetext' => '{{SITENAME}}માં નવà«àª‚ પાનૠબનાવવા ઉપર નિયંતà«àª°àª£ આવી ગયà«àª‚ છે.
<br />આપ પાછા જઇને હયાત પાનામાં ફેરફાર કરી શકો છો, નહિતર [[Special:UserLogin|પà«àª°àªµà«‡àª¶ કરો કે નવà«àª‚ ખાતà«àª‚ ખોલો]].',
'nocreate-loggedin' => 'તમને નવાં પાનાં બનાવવાની પરવાનગી નથી.',
@@ -936,6 +937,13 @@ $2
'edit-already-exists' => 'નવà«àª‚ પાનà«àª‚ બનાવી ન શકાયà«àª‚
તે પહેલેથી હાજર છે.',
'defaultmessagetext' => 'મૂળભૂત સંદેશ લખાણ',
+'invalid-content-data' => 'અયોગà«àª¯ વિગત માહિતી',
+
+# Content models
+'content-model-wikitext' => 'વિકિલખાણ',
+'content-model-text' => 'સાદà«àª‚ લખાણ',
+'content-model-javascript' => 'જાવાસà«àª•à«àª°àª¿àªªà«àªŸ',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''ચેતવણી:''' આ પાનà«àª‚ ખૂબ ખરà«àªšàª¾àª³ પદચà«àª›à«‡àª¦ સૂતà«àª° ધરાવે છે.
@@ -1295,9 +1303,9 @@ $1",
'prefs-emailconfirm-label' => 'ઇ-મેલ પà«àª·à«àªŸà«€',
'prefs-textboxsize' => 'ફેરફાર ફલકનà«àª‚ માપ',
'youremail' => 'ઇ-મેઇલ:',
-'username' => 'સભà«àª¯ નામ:',
-'uid' => 'સભà«àª¯ નામ',
-'prefs-memberingroups' => '{{PLURAL:$1|સમà«àª¹|સમà«àª¹à«‹}}ના સભà«àª¯:',
+'username' => '{{GENDER:$1|સભà«àª¯ નામ}}:',
+'uid' => '{{GENDER:$1|સભà«àª¯}} ઓળખ:',
+'prefs-memberingroups' => '{{PLURAL:$1|સમà«àª¹|સમà«àª¹à«‹}}ના {{GENDER:$2|સભà«àª¯}}:',
'prefs-registration' => 'નોંધણી સમય',
'yourrealname' => 'સાચà«àª‚ નામ:',
'yourlanguage' => 'ભાષા',
@@ -1447,12 +1455,13 @@ HTML નાકà«àª‚ ચકાસો',
'right-sendemail' => ' અનà«àª¯ સભà«àª¯à«‹àª¨à«‡ ઈ-મેલ મોકલો',
'right-passwordreset' => 'પાસવરà«àª¡ રીસેટ ઇ-મેઇલà«àª¸ જà«àª“',
+# Special:Log/newusers
+'newuserlogpage' => 'નવા બનેલા સભà«àª¯à«‹àª¨à«‹ લૉગ',
+'newuserlogpagetext' => 'આ સભà«àª¯à«‹àª¨à«€ રચનાનો લોગ છે.',
+
# User rights log
'rightslog' => 'સભà«àª¯ હકà«àª• માહિતિ પતà«àª°àª•',
'rightslogtext' => 'સભà«àª¯àª¨àª¾ બદલાયેલ હકà«àª•à«‹àª¨à«€ આ સંપાદન યાદિ છે .',
-'rightslogentry' => '$2 થી $3 સà«àª§à«€ $1 માટે બદલાયેલà«àª‚ સમૂહ સભà«àª¯àªªàª¦',
-'rightslogentry-autopromote' => 'આપોઆપ $2 માં થી $3 માં બઢતી થઇ',
-'rightsnone' => '(કંઈ નહી)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'આ પાનà«àª‚ વાંચો.',
@@ -1913,6 +1922,11 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
તેઓ વધૠયોગà«àª¯ પાનાં સાથે જોડાયેલા હોવા જોઇàª.<br />
પાનાને સંદિગà«àª§ વાકà«àª¯à«‹ વાળà«àª‚ પાનà«àª‚ તà«àª¯àª¾àª°à«‡ કહી શકાય જà«àª¯àª¾àª°à«‡ તે [[MediaWiki:Disambiguationspage]] નામના માળખા સાથે જોડાયેલà«àª‚ હોય.",
+'pageswithprop' => 'પાનાં ગà«àª£àª§àª°à«àª® સાથેનાં પાનાંઓ',
+'pageswithprop-legend' => 'પાનાં ગà«àª£àª§àª°à«àª® સાથેનાં પાનાંઓ',
+'pageswithprop-prop' => 'ગà«àª£àª§àª°à«àª® નામ:',
+'pageswithprop-submit' => 'જાઓ',
+
'doubleredirects' => 'બમણà«àª‚ દિશાનિરà«àª¦à«‡àª¶àª¨',
'doubleredirectstext' => 'આ પાનà«àª‚ દિશા નિરà«àª¦à«‡àª¶àª¿àª¤ પાના પર થયેલા દિશા નિરà«àª¦à«‡àª¶àª¿àª¤ પાનાની યાદિ બતાવે છે.
દરેક લિટીમાં પાના પà«àª°àª¥àª® અને દà«àªµà«€àª¤à«€àª¯ દિશા નિરà«àª¦à«‡àª¶àª¨ કà«àª¡à«€ બતાવે છે, તે સિવાય દà«àªµà«€àª¤à«€àª¯ દિશા નિરà«àª¦à«‡àª¶àª¨àª¨à«àª‚ લકà«àª·à«àª¯ પણ બતાવે છે કે મોટે ભાગે મૂળ પાનà«àª‚ હોઇ શકે છેૢ જેના પર પà«àª°àª¥àª® દિશા નિરà«àª¦à«‡àª¶àª¨ લકà«àª·àª¿àª¤ છે. <del>Crossed out</del> લિટીઓ નો ઉતà«àª¤àª° મેળવાયો છે.',
@@ -2062,9 +2076,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'linksearch-pat' => 'શોધ આલેખ',
'linksearch-ns' => 'નામાવકાશ:',
'linksearch-ok' => 'શોધ',
-'linksearch-text' => '"*.wikipedia.org" જેવા વાઈલà«àª¡àª¾àª•àª¾àª°à«àª¡ અહીં વાપરà«àª¯àª¾ હોઈ શકે છે.
+'linksearch-text' => 'વાઇલà«àª¡ કારà«àª¡ જેવા કે "*.wikipedia.org" અહીં વપરાયા હોઈ શકે છે.
ઓછામાં ઓછà«àª‚ ઉચà«àªšàª¸à«àª¤àª°àª¨à«àª‚ ડોમેઇન જરૂરી છે, દા.ત. \'\'*.org".<br />
-માનà«àª¯ પà«àª°à«‹àªŸà«‹àª•à«‹àª² : <code>$1</code> (આમાનà«àª‚ àªàª•à«‡àª¯ તમારી શોધમાં ના ઉમેરશો).',
+માનà«àª¯ {{PLURAL:$2|પà«àª°à«‹àªŸà«‹àª•à«‹àª²|પà«àª°à«‹àªŸà«‹àª•à«‹àª²à«àª¸}}: <code>$1</code> (જો કોઇ પà«àª°à«‹àªŸà«‹àª•à«‹àª² આપેલ નહી હોય તો http:// ઠમૂળભૂત ગણાશે).',
'linksearch-line' => '$1 ઠ$2થી જોડાયેલ છે',
'linksearch-error' => 'યજમાન નામની શરૂઆતમાં જ વાઈલà«àª¡àª•àª¾àª°à«àª¡ પà«àª°àª•àªŸ થશે',
@@ -2083,10 +2097,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'activeusers-hidesysops' => 'પà«àª°àª¬àª‚ધકો છà«àªªàª¾àªµà«‹',
'activeusers-noresult' => 'કોઇ સકà«àª°à«€àª¯ સભà«àª¯ ન મળà«àª¯à«‹',
-# Special:Log/newusers
-'newuserlogpage' => 'નવા બનેલા સભà«àª¯à«‹àª¨à«‹ લૉગ',
-'newuserlogpagetext' => 'આ સભà«àª¯à«‹àª¨à«€ રચનાનો લોગ છે.',
-
# Special:ListGroupRights
'listgrouprights' => 'સભà«àª¯ જૂથ ના હકà«àª•à«‹',
'listgrouprights-summary' => 'નીચે આ વિકિ પર વà«àª¯àª¾àª–à«àª¯àª¾àª¯àª¿àª¤ સભà«àª¯ જૂથોની યાદી, તેમની સાથે સંકળાયેલા હકà«àª•à«‹ સાથે આપી છે.
@@ -2181,26 +2191,28 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જà«àª“',
'enotif_mailer' => '{{SITENAME}} સૂચના ઈ-મેલ પà«àª°à«‡àª·àª•',
'enotif_reset' => 'બધા પાનાને મà«àª²àª¾àª•àª¾àª¤ લેવાયેલા અંકિત કરો',
-'enotif_newpagetext' => 'આ નવà«àª‚ પાનà«àª‚ છે.',
'enotif_impersonal_salutation' => '{{SITENAME}} સભà«àª¯',
-'changed' => 'બદલà«àª¯à«àª‚',
-'created' => 'બનાવà«àª¯à«àª‚',
-'enotif_subject' => '{{SITENAME}} નà«àª‚ પાનà«àª‚ $PAGETITLE $PAGEEDITOR દà«àªµàª¾àª°àª¾ $CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}} પૃષà«àª  $1 {{gender:$2|$2}}ઠદૂર કરà«àª¯à«àª‚ છે',
+'enotif_subject_created' => '{{SITENAME}}માં {{gender:$2|$2}}ઠપૃષà«àª  $1 બનાવà«àª¯à«àª‚ છે',
+'enotif_subject_moved' => '{{SITENAME}} પૃષà«àª  $1ને {{gender:$2|$2}}ઠખસેડà«àª¯à«àª‚ છે',
+'enotif_subject_restored' => '{{SITENAME}} પૃષà«àª  $1 {{gender:$2|$2}}ઠપà«àª¨:સà«àª¥àª¾àªªàª¿àª¤ કરà«àª¯à«àª‚ છે',
+'enotif_subject_changed' => '{{SITENAME}} પૃષà«àª  $1માં {{gender:$2|$2}}ઠફેરફાર કરà«àª¯à«‹ છે',
+'enotif_body_intro_deleted' => '{{SITENAME}} પાનà«àª‚ $1 $PAGEEDITDATEના રોજ {{gender:$2|$2}}ઠદૂર કરà«àª¯à«àª‚ છે, જà«àª“ $3.',
+'enotif_body_intro_created' => '{{SITENAME}}નà«àª‚ પાનà«àª‚ $1 $PAGEEDITDATEના રોજ {{gender:$2|$2}} દà«àªµàª¾àª°àª¾ બનાવવામાં આવà«àª¯à«àª‚ છે, હાલની આવૃતà«àª¤àª¿ માટે $3 જà«àª“.',
+'enotif_body_intro_moved' => '{{SITENAME}} પૃષà«àª  $1ને {{gender:$2|$2}}ઠ$PAGEEDITDATEના રોજ દિશાનિરà«àª¦à«‡àª¶àª¨ આપà«àª¯à«àª‚ છે, હાલની આવૃતà«àª¤àª¿ માટે જà«àª“: $3.',
+'enotif_body_intro_changed' => '{{SITENAME}} પૃષà«àª  $1ને {{gender:$2|$2}}ઠ$PAGEEDITDATEના રોજ બદલà«àª¯à«àª‚ છે, હાલની આવૃતà«àª¤àª¿ માટે જà«àª“: $3.',
'enotif_lastvisited' => 'તમારી પાછલી મà«àª²àª¾àª•àª¾àª¤ પછી થયેલા બધા ફેરફારો માટે $1 જà«àª“',
'enotif_lastdiff' => 'આ ફેરફાર જોવા $1 જà«àª“',
'enotif_anon_editor' => 'અનામિ સભà«àª¯ $1',
'enotif_body' => 'પà«àª°àª¿àª¯ $WATCHINGUSERNAME,
-
-{{SITENAME}}નà«àª‚ પાનà«àª‚ $PAGETITLE સભà«àª¯ $PAGEEDITORઠ$PAGEEDITDATEના રોજ $CHANGEDORCREATED છે, હાલની આવૃતà«àª¤àª¿ માટે $PAGETITLE_URL જà«àª“.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
ફેરફારોનો સારાંશ: $PAGESUMMARY $PAGEMINOREDIT
સંપાદકનો સંપરà«àª• :
-mail: $PAGEEDITOR_EMAIL
-wiki: $PAGEEDITOR_WIKI
+ઇ-મેલ: $PAGEEDITOR_EMAIL
+વિકિ: $PAGEEDITOR_WIKI
જà«àª¯àª¾àª‚ સà«àª§à«€ તમે આ પાનાની મà«àª²àª¾àª•àª¾àª¤ નહી લો તà«àª¯àª¾àª‚ સà«àª§à«€ તેમાં ભવિષà«àª¯àª®àª¾àª‚ થનાર કોઇ પણ ફેરફારની સૂચના તમને મળશે નહિ.
તમે તમારી ધà«àª¯àª¾àª¨ સૂચિમાં તમે જોયેલા પાના સંબંધી સૂચનાને લાગતા વિલપોમાં ફેરફાર કરી શકો છો.
@@ -2219,6 +2231,8 @@ $UNWATCHURL
મંતવà«àª¯à«‹ અને વધૠમદદ માટે
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'બનાવà«àª¯à«àª‚',
+'changed' => 'બદલà«àª¯à«àª‚',
# Delete
'deletepage' => 'પાનà«àª‚ હટાવો',
@@ -2295,6 +2309,7 @@ Deleting it may disrupt database operations of {{SITENAME}};',
'prot_1movedto2' => '[[$1]]નà«àª‚ નામ બદલીને [[$2]] કરવામાં આવà«àª¯à«àª‚ છે.',
'protect-badnamespace-title' => 'સંરકà«àª·àª¿àª¤ ન કરી શકાતà«àª‚ નામસà«àª¥àª³',
'protect-badnamespace-text' => 'આ નામસà«àª¥àª³àª®àª¾àª‚ પાના સà«àª°àª•à«àª·àª¿àª¤ કરી શકાતા નથી.',
+'protect-norestrictiontypes-title' => 'અસà«àª°àª•à«àª·àª¿àª¤ પાનà«àª‚',
'protect-legend' => 'સંરકà«àª·àª£ બહાલી આપો',
'protectcomment' => 'કારણ:',
'protectexpiry' => 'સમાપà«àª¤àª¿:',
@@ -2381,8 +2396,8 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'undeletedrevisions' => '{{PLURAL:$1|૧ સંપાદન|$1 સંપાદનો}} પà«àª¨ સà«àª¥àª¾àªªàª¿àª¤ કરાયા',
'undeletedrevisions-files' => '{{PLURAL:$1|1 ફેરફાર|$1 ફેરફારો}} અને {{PLURAL:$2|1 ફાઈલા|$2 ફાઈલો}} પà«àª¨àªƒàª¸à«àª¥àª¾àªªàª¿àª¤',
'undeletedfiles' => '{{PLURAL:$1|1 ફાઇલ|$1 ફાઇલો}} પà«àª¨àªƒàª¸à«àª¥àª¾àªªàª¿àª¤',
-'cannotundelete' => 'પà«àª¨àª°à«àªœà«€àªµàª¿àª¤ કરવાનà«àª‚ કારà«àª¯ અસફળ;
-કોઇકે આ પાનાને પહેલેથી પà«àª¨àª°à«àªœà«€àªµàª¿àª¤ કરà«àª¯à«àª‚ હોઈ શકે.',
+'cannotundelete' => 'પà«àª¨àª°à«àªœà«€àªµàª¿àª¤ કરવાનà«àª‚ કારà«àª¯ અસફળ:
+$1',
'undeletedpage' => "'''$1 પà«àª¨àªƒàª¸à«àª¥àª¾àªªàª¿àª¤ કરાયા'''
તાજેતરમાં હટાવેલા કે પà«àª¨àªƒàª¸à«àª¥àª¾àªªàª¿àª¤ થયેલા ફેરફારની નોંધ નો સંદરà«àª­ અહીં ઉપà«àª²àª¬à«àª§ [[Special:Log/delete|deletion log]].",
@@ -2412,7 +2427,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'blanknamespace' => '(મà«àª–à«àª¯)',
# Contributions
-'contributions' => 'સભà«àª¯àª¨à«àª‚ યોગદાન',
+'contributions' => '{{GENDER:$1|સભà«àª¯}}નà«àª‚ યોગદાન',
'contributions-title' => 'સભà«àª¯ $1નà«àª‚ યોગદાન',
'mycontris' => 'યોગદાન',
'contribsub2' => '$1 માટે ($2)',
@@ -2819,7 +2834,6 @@ To perform a selective restoration, check the boxes corresponding to the revisio
# JavaScriptTest
'javascripttest' => 'જાવા સà«àª•à«àª°à«€àªªà«àªŸ પરીકà«àª·àª£',
-'javascripttest-disabled' => 'આ સૂતà«àª° (ફંકશન) આ વિકિ પર કારà«àª¯àª°àª¤ કરાયેલà«àª‚ નથી.',
'javascripttest-title' => '$1 પરીકà«àª·àª£ જારી',
'javascripttest-pagetext-noframework' => 'આ પાનà«àª‚ જાવા સà«àª•à«àª°à«€àªªà«àªŸ ચલાવવા આરકà«àª·àª¿àª¤ છે.',
'javascripttest-pagetext-unknownframework' => 'અજાણ ચકાસણી ફà«àª°à«‡àª®àªµàª°à«àª• "$1".',
@@ -2932,6 +2946,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'pageinfo-default-sort' => 'મૂળભૂત ગોઠવણી કળ',
'pageinfo-length' => 'પૃષà«àª àª¨à«€ લંબાઇ (બાઇટમાં)',
'pageinfo-article-id' => 'પાનાં ઓળખ',
+'pageinfo-language' => 'પાનાંની વિગતની ભાષા',
'pageinfo-robot-policy' => 'શોધ àªàª¨à«àªœàª¿àª¨ સà«àª¥àª¿àª¤àª¿',
'pageinfo-robot-index' => 'અનà«àª•à«àª°àª®àª¿àª¯',
'pageinfo-robot-noindex' => 'અનà«àª•à«àª°àª®àª¿àª¯ નહી',
@@ -2947,6 +2962,14 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'pageinfo-recent-edits' => 'તાજા ફેરફારોની સંખà«àª¯àª¾ (છેલà«àª²àª¾ $1 દરમà«àª¯àª¾àª¨)',
'pageinfo-hidden-categories' => 'છà«àªªà«€ {{PLURAL:$1|શà«àª°à«‡àª£à«€|શà«àª°à«‡àª£à«€àª“}} ($1)',
'pageinfo-templates' => 'પà«àª°àª¯à«àª•à«àª¤ {{PLURAL:$1|ઢાંચો|ઢાંચાઓ}} ($1)',
+'pageinfo-toolboxlink' => 'પૃષà«àª àª®àª¾àª¹àª¿àª¤à«€',
+'pageinfo-redirectsto-info' => 'માહિતી',
+'pageinfo-contentpage-yes' => 'હા',
+'pageinfo-protect-cascading-yes' => 'હા',
+'pageinfo-category-info' => 'શà«àª°à«‡àª£à«€ માહિતી',
+'pageinfo-category-pages' => 'પાનાંઓની સંખà«àª¯àª¾',
+'pageinfo-category-subcats' => 'ઉપશà«àª°à«‡àª£à«€àª“ની સંખà«àª¯àª¾',
+'pageinfo-category-files' => 'ફાઇલà«àª¸àª¨à«€ સંખà«àª¯àª¾',
# Patrolling
'markaspatrolleddiff' => 'નિરીકà«àª·à«€àª¤ અંકિત કરો',
@@ -2988,6 +3011,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'file-info-size-pages' => '$1 × $2 પીકà«àª¸àª², ફાઈલ કદ: $3, MIME પà«àª°àª•àª¾àª°: $4, $5 {{PLURAL:$5|પાનà«àª‚|પાના}}',
'file-nohires' => 'આથી વધૠઆવરà«àª¤àª¨ ઉપલબà«àª§ નથી.',
'svg-long-desc' => 'SVG ફાઇલ, માતà«àª° $1 × $2 પીકà«àª¸àª², ફાઇલનà«àª‚ કદ: $3',
+'svg-long-error' => 'અયોગà«àª¯ SVG ફાઇલ: $1',
'show-big-image' => 'મહતà«àª¤àª® આવરà«àª¤àª¨',
'show-big-image-preview' => 'આ મહાવરા દà«àª°àª¶à«àª¯àª¨à«àª‚ માપ: $1.',
'show-big-image-other' => 'અનà«àª¯ {{PLURAL:$2|આવરà«àª¤àª¨|આવરà«àª¤àª¨à«‹}}: $1.',
@@ -3016,6 +3040,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
'hours' => '{{PLURAL:$1|$1 કલાક|$1 કલાકો}}',
'days' => '{{PLURAL:$1|$1 દિવસ|$1 દિવસો}}',
'ago' => '$1 પહેલાં',
+'just-now' => 'હમણાં',
# Bad image list
'bad_image_list' => 'ફોરà«àª®à«‡àªŸ નીચે મà«àªœàª¬ છે:
@@ -3734,8 +3759,8 @@ $5
'sqlite-no-fts' => '$1 પૂરà«àª£ શબà«àª¦ શોધ વિકલà«àªª વગર',
# New logging system
-'logentry-delete-delete' => '$1 દà«àªµàª¾àª°àª¾ પાનà«àª‚ $3 દૂર કરવામાં આવà«àª¯à«àª‚',
-'logentry-delete-restore' => '$1 પà«àª¨àªƒàª¸àª‚ગà«àª°àª¹ પાનà«àª‚ $3',
+'logentry-delete-delete' => '$1 દà«àªµàª¾àª°àª¾ પાનà«àª‚ $3 {{GENDER:$2|દૂર કરવામાં આવà«àª¯à«àª‚}}',
+'logentry-delete-restore' => '$1 {{GENDER:$2|પà«àª¨àªƒàª¸àª‚ગà«àª°àª¹}} પાનà«àª‚ $3',
'logentry-delete-event' => '$1 બદલાઈ ના દૃશà«àª¯àª¤àª¾ {{PLURAL: $5 | લોગ ઘટના | $5 લોગ}} $3 ઘટનાઓ પર $4',
'logentry-delete-revision' => '$1 બદલાઈ ના દૃશà«àª¯àª¤àª¾ {{PLURAL: $5 | સà«àª§àª¾àª°àª£àª¾ | $5 આવૃતà«àª¤àª¿àª“}} $3 પાનાં પર: $4',
'logentry-delete-event-legacy' => '$1 બદલાઈ $3 પર લોગ ઘટનાઓ દૃશà«àª¯àª¤àª¾',
@@ -3759,11 +3784,11 @@ $5
'logentry-move-move_redir-noredirect' => '$1ઠદિશાનિરà«àª¦à«‡àª¶àª¨ કરીને પાના $3ને $4 પર વાળà«àª¯à«àª‚ પણ પાછળ દિશાનિરà«àª¦à«‡àª¶àª¨ છોડà«àª¯à«àª‚ નહી',
'logentry-patrol-patrol' => '$1 આવૃતà«àª¤àª¿ ચિહà«àª¨àª¿àª¤ થયેલ પાનાં $4 $3 ચોકી કરવા ફરવા નીકળવà«àª‚',
'logentry-patrol-patrol-auto' => '$1 આપોઆપ ચિહà«àª¨àª¿àª¤ ચોકી પહેરો કરવા લાગà«àª¯àª¾ આવૃતà«àª¤àª¿ પાનà«àª‚ $4 $3',
-'logentry-newusers-newusers' => 'સભà«àª¯ ખાતà«àª‚ $1 બનાવવામાં આવà«àª¯à«àª‚',
-'logentry-newusers-create' => 'સભà«àª¯ ખાતà«àª‚ $1 બનાવવામાં આવà«àª¯à«àª‚',
-'logentry-newusers-create2' => 'સભà«àª¯ ખાતà«àª‚ $3 $1 વડે બનાવવામાં આવà«àª¯à«àª‚',
-'logentry-newusers-autocreate' => 'àªàª•àª¾àª‰àª¨à«àªŸ $1 બનાવનાર આપોઆપ',
-'newuserlog-byemail' => 'ગà«àªªà«àª¤ સંજà«àªžàª¾ ઇ-મેલ દà«àªµàª¾àª°àª¾ મોકલાઇ છે.',
+'logentry-newusers-newusers' => 'સભà«àª¯ ખાતà«àª‚ $1 {{GENDER:$2|બનાવવામાં આવà«àª¯à«àª‚}}',
+'logentry-newusers-create' => 'સભà«àª¯ ખાતà«àª‚ $1 {{GENDER:$2|બનાવવામાં આવà«àª¯à«àª‚}}',
+'logentry-newusers-create2' => 'સભà«àª¯ ખાતà«àª‚ $3 $1 વડે {{GENDER:$2|બનાવવામાં આવà«àª¯à«àª‚ હતà«àª‚}}',
+'logentry-newusers-autocreate' => 'વપરાશકરà«àª¤àª¾ ખાતà«àª‚ $1 આપમેળે {{GENDER:$2|બનાવવામાં આવà«àª¯à«àª‚ હતà«àª‚}}',
+'rightsnone' => '(કંઈ નહી)',
# Feedback
'feedback-bugornote' => 'જો તમે તકનીકી સમસà«àª¯àª¾ વરà«àª£àªµàªµàª¾ માંગતા હોય તો કૃપયા [$1 report a bug] ઠબગ અહીં નોંધાવો.
@@ -3816,6 +3841,7 @@ $5
'api-error-ok-but-empty' => 'આંતરીક તà«àª°à«àªŸà«€: સરà«àªµàª° તરફથી કોઈ પà«àª°àª¤à«àª¯à«àª¤à«àª¤àª° નથી',
'api-error-overwrite' => 'વિહરમાન ફાઇલ પર પà«àª¨àª°à«àª²à«‡àª–ન કરવાની પરવાનગી નથી',
'api-error-stashfailed' => 'આંતરીક કà«àª·àª¤àª¿: હંગામી ફાઈલ સંચયમાં સરà«àªµàª° નિષà«àª«àª³',
+'api-error-publishfailed' => 'આંતરીક કà«àª·àª¤àª¿: હંગામી ફાઈલ સંચયમાં સરà«àªµàª° નિષà«àª«àª³.',
'api-error-timeout' => 'અપેકà«àª·àª¿àª¤ સમય સà«àª§à«€ સરà«àªµàª°à«‡ પà«àª°àª¤à«àª¯à«àª¤à«àª¤àª° ન આપà«àª¯à«‹.',
'api-error-unclassified' => 'અજà«àªžàª¾àª¤ ચૂક થઈ.',
'api-error-unknown-code' => 'અજà«àªžàª¾àª¤ કà«àª·àª¤àª¿: "$1".',
diff --git a/languages/messages/MessagesGv.php b/languages/messages/MessagesGv.php
index 1861f059..e94c0db0 100644
--- a/languages/messages/MessagesGv.php
+++ b/languages/messages/MessagesGv.php
@@ -164,7 +164,6 @@ $messages = array(
'qbbrowse' => 'Ronsee',
'qbedit' => 'Reagh',
'qbpageoptions' => 'Yn duillag shoh',
-'qbpageinfo' => 'Co-hecks',
'qbmyoptions' => 'My ghuillagyn',
'qbspecialpages' => 'Duillagyn er lheh',
'faq' => 'FC',
@@ -343,9 +342,6 @@ Cur coontey jeh da [[Special:ListUsers/sysop|reireyder]], as goaill stiagh yn UR
'virus-unknownscanner' => 'ronseyder noi-veerys gyn enney',
# Login and logout pages
-'welcomecreation' => '== Failt ort, $1! ==
-Ta dty choontys crooit nish.<br />
-Ny jean jarrood dty [[Special:Preferences|hosheeaghtyn {{SITENAME}}]] y chaghlaa.',
'yourname' => "Dt'ennym ymmydeyr:",
'yourpassword' => 'Fockle yn arrey:',
'yourpasswordagain' => "Aascreeu d'ockle arrey:",
@@ -496,7 +492,6 @@ Chammah as shen, t’ou gialdyn dooin dy screeu oo hene eh, ny ren oo coip jeh n
'template-protected' => '(glast)',
'template-semiprotected' => '(lieh-ghlast)',
'hiddencategories' => "Ta'n duillag shoh ayns {{PLURAL:$1|ronney follit|ronney follit|ronney follit|ronnaghyn follit}}",
-'nocreatetitle' => 'Crooaght duillag jeorit',
'nocreatetext' => "Ta ablid duillagyn noa y chroo lhiettalit ec {{SITENAME}}.<br />
Foddee shiu goll er ash as reaghey duillag t'ayn nish, ny [[Special:UserLogin|loggal stiagh ny croo coontys]].",
'nocreate-loggedin' => 'Cha nel kied ayd duillagyn noa y chroo er {{SITENAME}}.',
@@ -712,9 +707,11 @@ My bailliu eh y chiarail, bee eh ymmydit son cur gys lieh y chur dhyt er son yn
'right-upload' => 'Laadey neese coadanyn',
'right-delete' => 'Duillag y scryssey',
+# Special:Log/newusers
+'newuserlogpage' => 'Lioar chooishyn ny h-ymmydeyryn noa',
+
# User rights log
'rightslog' => 'Lioar chooishyn kiartyn ymmydeyr',
-'rightsnone' => '(veg)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'y duillag shoh y lhaih',
@@ -958,9 +955,6 @@ Ta duillagyn er [[Special:Watchlist|dty rolley arrey]] ayns '''clou trome'''.",
# Special:ListUsers
'listusers-submit' => 'Taishbyn',
-# Special:Log/newusers
-'newuserlogpage' => 'Lioar chooishyn ny h-ymmydeyryn noa',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Possan',
'listgrouprights-rights' => 'Kiartyn',
@@ -1000,10 +994,7 @@ Bee caghlaaghyn jeant er y duillag shoh as e ghuillag resoonaght ry-akin ayns y
'watching' => 'Jannoo arrey...',
'unwatching' => 'Stap y chur er arrey...',
-'enotif_newpagetext' => 'She duillag noa eh shoh.',
'enotif_impersonal_salutation' => '{{SITENAME}} ymmydeyr',
-'changed' => 'ceaghlit',
-'created' => 'crooit',
'enotif_anon_editor' => 'ymmydeyr $1 neuenmyssit',
'enotif_body' => '$WATCHINGUSERNAME veen,
@@ -1036,6 +1027,8 @@ $UNWATCHURL
Aaveaghey as cooney s\'odjey:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'crooit',
+'changed' => 'ceaghlit',
# Delete
'deletepage' => 'Scryss y duillag',
@@ -1475,6 +1468,9 @@ Bee adsyn elley follit dy seyr-obbragh.<br />
# Special:Tags
'tags-edit' => 'reaghey',
+# New logging system
+'rightsnone' => '(veg)',
+
# Search suggestions
'searchsuggest-search' => 'Ronsaghey',
'searchsuggest-containing' => 'goaill stiagh...',
diff --git a/languages/messages/MessagesHa.php b/languages/messages/MessagesHa.php
index bac6c4aa..3e82212b 100644
--- a/languages/messages/MessagesHa.php
+++ b/languages/messages/MessagesHa.php
@@ -374,6 +374,9 @@ Ku gwada tare da amfani da \"all:\" don bincikar duka shafunan (har da shafunan
'grouppage-sysop' => '{{ns:project}}:Masu hukunci',
+# Special:Log/newusers
+'newuserlogpage' => 'Rajistan sabbin akwantoci',
+
# User rights log
'rightslog' => "Rajistan bayar da izini ga ma'aikata",
@@ -483,9 +486,6 @@ Ku gwada tare da amfani da \"all:\" don bincikar duka shafunan (har da shafunan
# Special:ListUsers
'listusers-submit' => 'Nuna',
-# Special:Log/newusers
-'newuserlogpage' => 'Rajistan sabbin akwantoci',
-
# Special:ListGroupRights
'listgrouprights-members' => '(jerin mambobi)',
diff --git a/languages/messages/MessagesHak.php b/languages/messages/MessagesHak.php
index c4d3b064..897af3e3 100644
--- a/languages/messages/MessagesHak.php
+++ b/languages/messages/MessagesHak.php
@@ -148,7 +148,6 @@ ke $1 ke tóng-on,khiung-yû $2 ke tóng-on.}}',
'qbbrowse' => 'Chhà-khon',
'qbedit' => 'Phiên-siá',
'qbpageoptions' => 'Vùn-chông sién-hong',
-'qbpageinfo' => 'Vùn-chông chṳ̂-liau',
'qbmyoptions' => 'Ngô-ke sién-hong',
'qbspecialpages' => 'ThiÌt-sû hong-mien',
'faq' => 'Sòng-kien mun-thì kié-tap',
@@ -353,7 +352,6 @@ For translations, please consider using [//translatewiki.net/wiki/Main_Page?setl
'logouttext' => "'''Ngì hien-chhai yí-kîn thui-chhut.'''
Ngì khó-yî ki-siuÌk yî ngiaÌk-miàng fông-sá¹³t sá¹³Ì-yung {{SITENAME}}, feÌt-chá chai-chhá¹³ yî siông-thùng feÌt-he mò-thùng yung-fu sṳ̂n-fun tên-ngiÌp.",
-'welcomecreation' => '<h2>Fôn-ngiàng, $1!</h2><p>Ngì-ke chong-ho yí-kîn kien-liÌp, put-yeu mong-ki sat-chá¹³ {{SITENAME}} ke-ngìn chhâm-sá¹³.</p>',
'yourname' => 'Yung-fu-miàng',
'yourpassword' => 'MeÌt-ma:',
'yourpasswordagain' => 'Chai-chhá¹³ sû-ngiÌp meÌt-ma:',
@@ -531,7 +529,6 @@ Ngì thùng-sṳ̀ ya-yeu hiong Wikimedia pó-chṳn ngì só thì-kâu ke nui-y
'template-semiprotected' => '(pan-pó-fu)',
'hiddencategories' => 'Liá-yaÌp he suÌk-yî $1-ke yún-chhòng fûn-lui ke sṳ̀n-yèn:',
'edittools' => '<!-- Chhá¹³Ì-chhu ke vùn-sá¹³ chiông-voi pûn hién-sá¹³ chhai yî-ha phiên-cho lâu song-chhòn péu-tân chûng. -->',
-'nocreatetitle' => 'Chhóng-kien vùn-chông su han-chṳ',
'nocreatetext' => 'Chhá¹³Ì mióng-chham han-chá¹³ chhóng-chho sîn hong-mien ke kûng-yung. ngì khó-yî fán-fì pin phiên-cho yí-kîn yû ke hong-mien, feÌt-chá [[Special:UserLogin|tên-liuÌk feÌt-he chhóng-kien sîn chong-fu]].',
'nocreate-loggedin' => 'Ngì chhai liá-ke wiki-tsûng hàn-mò hí-khó-khièn kien-liÌp sîn vùn-tsông.',
'permissionserrors' => 'Khièn-han Tsho-ngu',
@@ -787,11 +784,13 @@ Tshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.',
'grouppage-bot' => '{{ns:project}}:Kî-hi-ngìn',
'grouppage-sysop' => '{{ns:project}}:Kón-lî-yèn',
+# Special:Log/newusers
+'newuserlogpage' => 'Sîn-chin yung-fu miàng-chhak',
+'newuserlogpagetext' => 'Liá-he yit-ke chui-khiun pûn chhóng-kien yung-fu ke ngit-ki.',
+
# User rights log
'rightslog' => 'Yung-fu khièn-han ngit-ki',
'rightslogtext' => 'Yî-ha ki-liuÌk yung-fu khièn-han ke kiên-kói ki-liuÌk.',
-'rightslogentry' => 'Chiong $1 ke khièn-han chhiùng $2 kói-vi $3',
-'rightsnone' => '(mò)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'phiên-siá pún-chông',
@@ -1085,10 +1084,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'Hién-sṳ',
'listusers-noresult' => 'Cháu put-to yung-fu.',
-# Special:Log/newusers
-'newuserlogpage' => 'Sîn-chin yung-fu miàng-chhak',
-'newuserlogpagetext' => 'Liá-he yit-ke chui-khiun pûn chhóng-kien yung-fu ke ngit-ki.',
-
# Special:ListGroupRights
'listgrouprights-members' => '(sṳ̀n-yèn chhîn-tân)',
@@ -1145,15 +1140,13 @@ Also see [[Special:WantedCategories|wanted categories]].',
'enotif_mailer' => '{{SITENAME}} email thûng-tî-hi',
'enotif_reset' => 'Chiông só-yû hong-mien phêu-vi yí-kîn thuÌk-ko.',
-'enotif_newpagetext' => 'Liá-he sîn-kien vùn-chông.',
'enotif_impersonal_salutation' => '{{SITENAME}} yung-fu',
-'changed' => 'siû-kói liáu',
-'created' => 'Yí-kîn kien-liÌp',
-'enotif_subject' => '{{SITENAME}} yû vùn-chông $PAGETITLE pûn $PAGEEDITOR $CHANGEDORCREATED',
'enotif_lastvisited' => 'Kiám-sṳ ngì song-chhṳ fóng-mun heu ke só-yû kiên-kói chhián chhâm-siòng $1.',
'enotif_lastdiff' => 'Kiám-chhà kiên-kói chhiáng chhâm-siòng $1.',
'enotif_anon_editor' => 'ngiaÌk-miàng yung-fu $1',
'enotif_body' => 'Chhîn-oi ke $WATCHINGUSERNAME, $PAGEEDITOR yí-kîn chhai $PAGEEDITDATE $CHANGEDORCREATED{{SITENAME}} ke $PAGETITLE vùn-chông, chhiáng-to $PAGETITLE_URL kiám-sá¹³ siên-chhièn pán-pún. $NEWPAGE phiên-siÌp chak-yeu: $PAGESUMMARY $PAGEMINOREDIT lièn-kiê chhá¹³Ì phiên-siÌp-chá: email: $PAGEEDITOR_EMAIL pún-chham: $PAGEEDITOR_WIKI chhai ngì fóng-mun chhá¹³Ì-chông chṳ̂-chhièn, chiông-lòi ke kiên-kói vù-nèn hiong ngì thûng-tî. Ngì khó-yî chhûng-sat ngì só-yû kam-sá¹³ vùn-chông ke thûng-tî phêu-ki. {{SITENAME}} thûng-tî ne-thúng -- yeu kói-pien ngì-ke kam-sá¹³ lieÌt-péu sat-thin, chhiáng chhâm-siòng {{canonicalurl:{{#special:EditWatchlist}}}} chin-yit-phu ke pông-chhu: {{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'Yí-kîn kien-liÌp',
+'changed' => 'siû-kói liáu',
# Delete
'deletepage' => 'Chhù-thet hong-mien',
@@ -1270,7 +1263,7 @@ Chhiáng chhâm-kháu [[Special:Log/delete|chhù-hi ngit-ki]] lòi chhà-chhut c
'blanknamespace' => '(Chú)',
# Contributions
-'contributions' => 'Yung-fu kung-hien',
+'contributions' => '{{GENDER:$1|Yung-fu}} kung-hien',
'contributions-title' => '$1-ke yung-fu kung-hien',
'mycontris' => 'Phiên-siû ki-liuÌk',
'contribsub2' => '$1 ($2) ke kung-hien',
@@ -1778,5 +1771,6 @@ sû-ngiÌp chang-kûi péu-thaÌt-sá¹³t
# New logging system
'revdelete-restricted' => 'yí-kîn yin-yung han-tsṳ tsṳ tshâu-tsok-yèn',
'revdelete-unrestricted' => 'yí-kîn yì-tshù yû-kûan tshâu-tsok-yè ke han-tsṳ',
+'rightsnone' => '(mò)',
);
diff --git a/languages/messages/MessagesHaw.php b/languages/messages/MessagesHaw.php
index 3a82fb64..d3f835d5 100644
--- a/languages/messages/MessagesHaw.php
+++ b/languages/messages/MessagesHaw.php
@@ -192,7 +192,6 @@ $messages = array(
'qbfind' => 'Loa‘a',
'qbedit' => 'E ho‘ololi',
'qbpageoptions' => 'Kēia ‘ao‘ao',
-'qbpageinfo' => 'PÅ‘aiapili',
'qbmyoptions' => 'Ka‘u mau ‘ao‘ao',
'qbspecialpages' => 'NÄ â€˜ao‘ao kÅ«ikawÄ',
@@ -324,9 +323,6 @@ $2',
'ns-specialprotected' => '‘A‘ole hiki ke ho‘opololei i nÄ â€˜ao‘ao kÅ«ikawÄ',
# Login and logout pages
-'welcomecreation' => '== E komo mai, $1! ==
-Ua hoÊ»okumu Ê»ia kÄu moÊ»okÄki.
-Mai poina e hoÊ»ololi i [[Special:Preferences|kÄu makemake ma {{SITENAME}}]].',
'yourname' => "Inoa mea ho'ohana",
'yourpassword' => 'ʻŌlelo hÅ«nÄ:',
'yourpasswordagain' => "Hua'Ålelo huna hou",
diff --git a/languages/messages/MessagesHe.php b/languages/messages/MessagesHe.php
index 0dcf2e48..95d0b12a 100644
--- a/languages/messages/MessagesHe.php
+++ b/languages/messages/MessagesHe.php
@@ -12,6 +12,7 @@
* @author Drorsnir
* @author Hoo
* @author Ijon
+ * @author Inkbug
* @author Ofekalef
* @author Ofrahod
* @author Rotem Dan (July 2003)
@@ -28,43 +29,133 @@ $rtl = true;
$linkTrail = '/^([a-z×-ת]+)(.*)$/sDu';
$fallback8bitEncoding = 'windows-1255';
-
-$datePreferences = array(
- 'default',
- 'mdy',
- 'dmy',
- 'ymd',
- 'hebrew',
- 'ISO 8601',
+$namespaceNames = array(
+ NS_MEDIA => 'מדיה',
+ NS_SPECIAL => 'מיוחד',
+ NS_MAIN => '',
+ NS_TALK => 'שיחה',
+ NS_USER => 'משתמש',
+ NS_USER_TALK => 'שיחת_משתמש',
+ NS_PROJECT_TALK => 'שיחת_$1',
+ NS_FILE => 'קובץ',
+ NS_FILE_TALK => 'שיחת_קובץ',
+ NS_MEDIAWIKI => 'מדיה_ויקי',
+ NS_MEDIAWIKI_TALK => 'שיחת_מדיה_ויקי',
+ NS_TEMPLATE => 'תבנית',
+ NS_TEMPLATE_TALK => 'שיחת_תבנית',
+ NS_HELP => 'עזרה',
+ NS_HELP_TALK => 'שיחת_עזרה',
+ NS_CATEGORY => 'קטגוריה',
+ NS_CATEGORY_TALK => 'שיחת_קטגוריה',
);
-
-$dateFormats = array(
- 'mdy time' => 'H:i',
- 'mdy date' => 'xg j, Y',
- 'mdy both' => 'H:i, xg j, Y',
-
- 'dmy time' => 'H:i',
- 'dmy date' => 'j xg Y',
- 'dmy both' => 'H:i, j xg Y',
-
- 'ymd time' => 'H:i',
- 'ymd date' => 'Y xg j',
- 'ymd both' => 'H:i, Y xg j',
-
- 'hebrew time' => 'H:i',
- 'hebrew date' => 'xhxjj xjx xhxjY',
- 'hebrew both' => 'H:i, xhxjj xjx xhxjY',
-
- 'ISO 8601 time' => 'xnH:xni:xns',
- 'ISO 8601 date' => 'xnY-xnm-xnd',
- 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+$namespaceAliases = array(
+ 'תמונה' => NS_FILE,
+ 'שיחת_תמונה' => NS_FILE_TALK,
+);
+$namespaceGenderAliases = array(
+ NS_USER => array( 'male' => 'משתמש', 'female' => 'משתמשת' ),
+ NS_USER_TALK => array( 'male' => 'שיחת_משתמש', 'female' => 'שיחת_משתמשת' ),
);
-$bookstoreList = array(
- 'מיתוס' => 'http://www.mitos.co.il/',
- 'iBooks' => 'http://www.ibooks.co.il/',
- 'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
- 'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+$specialPageAliases = array(
+ 'Activeusers' => array( 'משתמשי×_פעילי×' ),
+ 'Allmessages' => array( 'הודעות_המערכת' ),
+ 'Allpages' => array( 'כל_הדפי×' ),
+ 'Ancientpages' => array( 'דפי×_מוזנחי×' ),
+ 'Badtitle' => array( 'כותרת_שגויה' ),
+ 'Blankpage' => array( 'דף_ריק' ),
+ 'Block' => array( 'חסימה', 'חסימת_כתובת', 'חסימת_משתמש' ),
+ 'Blockme' => array( 'חסו×_×ותי' ),
+ 'Booksources' => array( 'מש×בי_ספרות', 'מש×בי_ספרות_חיצוניי×' ),
+ 'BrokenRedirects' => array( 'הפניות_ל×_תקינות', 'הפניות_שבורות' ),
+ 'Categories' => array( 'קטגוריות', 'רשימת_קטגוריות' ),
+ 'ChangeEmail' => array( 'שינוי_דו×ר_×לקטרוני', 'שינוי_דו×ל' ),
+ 'ChangePassword' => array( 'שינוי_סיסמה' ),
+ 'ComparePages' => array( 'השוו×ת_דפי×' ),
+ 'Confirmemail' => array( '×ימות_כתובת_דו×ר' ),
+ 'Contributions' => array( 'תרומות', 'תרומות_המשתמש' ),
+ 'CreateAccount' => array( 'הרשמה_לחשבון' ),
+ 'Deadendpages' => array( 'דפי×_לל×_קישורי×' ),
+ 'DeletedContributions' => array( 'תרומות_מחוקות' ),
+ 'Disambiguations' => array( 'פירושוני×', 'דפי_פירושוני×' ),
+ 'DoubleRedirects' => array( 'הפניות_כפולות' ),
+ 'EditWatchlist' => array( 'עריכת_רשימת_המעקב' ),
+ 'Emailuser' => array( 'שליחת_דו×ר_למשתמש' ),
+ 'Export' => array( 'ייצו×', 'ייצו×_דפי×' ),
+ 'Fewestrevisions' => array( 'הגרס×ות_המעטות_ביותר', 'הדפי×_בעלי_מספר_העריכות_הנמוך_ביותר' ),
+ 'FileDuplicateSearch' => array( 'חיפוש_קבצי×_כפולי×' ),
+ 'Filepath' => array( 'נתיב_לקובץ' ),
+ 'Import' => array( 'ייבו×', 'ייבו×_דפי×' ),
+ 'Invalidateemail' => array( 'ביטול_דו×ר' ),
+ 'JavaScriptTest' => array( 'בדיקת_JavaScript' ),
+ 'BlockList' => array( 'רשימת_חסומי×', 'רשימת_משתמשי×_חסומי×', 'משתמשי×_חסומי×' ),
+ 'LinkSearch' => array( 'חיפוש_קישורי×_חיצוניי×' ),
+ 'Listadmins' => array( 'רשימת_מפעילי×' ),
+ 'Listbots' => array( 'רשימת_בוטי×' ),
+ 'Listfiles' => array( 'רשימת_קבצי×', 'רשימת_תמונות', 'קבצי×', 'תמונות' ),
+ 'Listgrouprights' => array( 'רשימת_הרש×ות_לקבוצה' ),
+ 'Listredirects' => array( 'רשימת_הפניות', 'הפניות' ),
+ 'Listusers' => array( 'רשימת_משתמשי×', 'משתמשי×' ),
+ 'Lockdb' => array( 'נעילת_בסיס_הנתוני×' ),
+ 'Log' => array( 'יומני×' ),
+ 'Lonelypages' => array( 'דפי×_יתומי×' ),
+ 'Longpages' => array( 'דפי×_×רוכי×' ),
+ 'MergeHistory' => array( 'מיזוג_גרס×ות' ),
+ 'MIMEsearch' => array( 'חיפוש_MIME' ),
+ 'Mostcategories' => array( 'הקטגוריות_הרבות_ביותר', 'הדפי×_מרובי-הקטגוריות_ביותר' ),
+ 'Mostimages' => array( 'הקבצי×_המקושרי×_ביותר', 'התמונות_המקושרות_ביותר' ),
+ 'Mostlinked' => array( 'הדפי×_המקושרי×_ביותר', 'המקושרי×_ביותר' ),
+ 'Mostlinkedcategories' => array( 'הקטגוריות_המקושרות_ביותר' ),
+ 'Mostlinkedtemplates' => array( 'התבניות_המקושרות_ביותר' ),
+ 'Mostrevisions' => array( 'הגרס×ות_הרבות_ביותר', 'הדפי×_בעלי_מספר_העריכות_הגבוה_ביותר' ),
+ 'Movepage' => array( 'העברת_דף', 'העברה' ),
+ 'Mycontributions' => array( 'התרומות_שלי' ),
+ 'Mypage' => array( 'הדף_שלי', 'דף_המשתמש_שלי' ),
+ 'Mytalk' => array( 'השיחה_שלי', 'דף_השיחה_שלי' ),
+ 'Myuploads' => array( 'ההעל×ות_שלי' ),
+ 'Newimages' => array( 'קבצי×_חדשי×', 'תמונות_חדשות', 'גלריית_קבצי×_חדשי×', 'גלריית_תמונות_חדשות' ),
+ 'Newpages' => array( 'דפי×_חדשי×' ),
+ 'PasswordReset' => array( '×יפוס_סיסמה' ),
+ 'PermanentLink' => array( 'קישור_קבוע' ),
+ 'Popularpages' => array( 'הדפי×_הנצפי×_ביותר', 'דפי×_פופולריי×' ),
+ 'Preferences' => array( 'העדפות', 'ההעדפות_שלי' ),
+ 'Prefixindex' => array( 'דפי×_המתחילי×_ב' ),
+ 'Protectedpages' => array( 'דפי×_מוגני×' ),
+ 'Protectedtitles' => array( 'כותרות_מוגנות' ),
+ 'Randompage' => array( '×קר××™', 'דף_×קר××™' ),
+ 'Randomredirect' => array( 'הפניה_×קר×ית' ),
+ 'Recentchanges' => array( 'שינויי×_×חרוני×' ),
+ 'Recentchangeslinked' => array( 'שינויי×_בדפי×_המקושרי×' ),
+ 'Revisiondelete' => array( 'מחיקת_ושחזור_גרס×ות' ),
+ 'Search' => array( 'חיפוש' ),
+ 'Shortpages' => array( 'דפי×_קצרי×' ),
+ 'Specialpages' => array( 'דפי×_מיוחדי×' ),
+ 'Statistics' => array( 'סטטיסטיקות' ),
+ 'Tags' => array( 'תגיות' ),
+ 'Unblock' => array( 'שחרור_חסימה' ),
+ 'Uncategorizedcategories' => array( 'קטגוריות_חסרות_קטגוריה' ),
+ 'Uncategorizedimages' => array( 'קבצי×_חסרי_קטגוריה', 'תמונות_חסרות_קטגוריה' ),
+ 'Uncategorizedpages' => array( 'דפי×_חסרי_קטגוריה' ),
+ 'Uncategorizedtemplates' => array( 'תבניות_חסרות_קטגוריות' ),
+ 'Undelete' => array( 'צפייה_בדפי×_מחוקי×' ),
+ 'Unlockdb' => array( 'שחרור_בסיס_הנתוני×' ),
+ 'Unusedcategories' => array( 'קטגוריות_ש×ינן_בשימוש' ),
+ 'Unusedimages' => array( 'קבצי×_ש××™× ×_בשימוש', 'תמונות_ש×ינן_בשימוש' ),
+ 'Unusedtemplates' => array( 'תבניות_ש×ינן_בשימוש' ),
+ 'Unwatchedpages' => array( 'דפי×_ש××™× ×_במעקב' ),
+ 'Upload' => array( 'העל××”', 'העל×ת_קובץ_לשרת' ),
+ 'UploadStash' => array( 'מ×גר_העל×ות' ),
+ 'Userlogin' => array( 'כניסה_לחשבון', 'כניסה', 'כניסה_/_הרשמה_לחשבון' ),
+ 'Userlogout' => array( 'יצי××”_מהחשבון', 'יצי××”' ),
+ 'Userrights' => array( 'ניהול_הרש×ות_משתמש', 'הפיכת_משתמש_למפעיל_מערכת', 'הענקת_×ו_ביטול_הרש×ת_בוט' ),
+ 'Version' => array( 'גרסה', 'גרסת_התוכנה' ),
+ 'Wantedcategories' => array( 'קטגוריות_מבוקשות' ),
+ 'Wantedfiles' => array( 'קבצי×_מבוקשי×' ),
+ 'Wantedpages' => array( 'דפי×_מבוקשי×' ),
+ 'Wantedtemplates' => array( 'תבניות_מבוקשות' ),
+ 'Watchlist' => array( 'רשימת_המעקב', 'רשימת_מעקב', 'רשימת_המעקב_שלי' ),
+ 'Whatlinkshere' => array( 'דפי×_המקושרי×_לכ×ן' ),
+ 'Withoutinterwiki' => array( 'דפי×_לל×_קישורי_שפה' ),
);
$magicWords = array(
@@ -74,7 +165,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__חייב_תוכן_×¢× ×™×™× ×™×__', '__חייב_תוכן__', '__FORCETOC__' ),
'toc' => array( '0', '__תוכן_×¢× ×™×™× ×™×__', '__תוכן__', '__TOC__' ),
'noeditsection' => array( '0', '__לל×_עריכה__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__לל×_כותרת__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'חודש נוכחי', 'חודש נוכחי 2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'חודש נוכחי 1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', '×©× ×—×•×“×© נוכחי', 'CURRENTMONTHNAME' ),
@@ -222,134 +312,42 @@ $magicWords = array(
'defaultsort_noreplace' => array( '0', '×œ×œ× ×”×—×œ×¤×”', 'noreplace' ),
);
-$specialPageAliases = array(
- 'Activeusers' => array( 'משתמשי×_פעילי×' ),
- 'Allmessages' => array( 'הודעות_המערכת' ),
- 'Allpages' => array( 'כל_הדפי×' ),
- 'Ancientpages' => array( 'דפי×_מוזנחי×' ),
- 'Badtitle' => array( 'כותרת_שגויה' ),
- 'Blankpage' => array( 'דף_ריק' ),
- 'Block' => array( 'חסימה', 'חסימת_כתובת', 'חסימת_משתמש' ),
- 'Blockme' => array( 'חסו×_×ותי' ),
- 'Booksources' => array( 'מש×בי_ספרות', 'מש×בי_ספרות_חיצוניי×' ),
- 'BrokenRedirects' => array( 'הפניות_ל×_תקינות', 'הפניות_שבורות' ),
- 'Categories' => array( 'קטגוריות', 'רשימת_קטגוריות' ),
- 'ChangeEmail' => array( 'שינוי_דו×ר_×לקטרוני', 'שינוי_דו×ל' ),
- 'ChangePassword' => array( 'שינוי_סיסמה' ),
- 'ComparePages' => array( 'השוו×ת_דפי×' ),
- 'Confirmemail' => array( '×ימות_כתובת_דו×ר' ),
- 'Contributions' => array( 'תרומות', 'תרומות_המשתמש' ),
- 'CreateAccount' => array( 'הרשמה_לחשבון' ),
- 'Deadendpages' => array( 'דפי×_לל×_קישורי×' ),
- 'DeletedContributions' => array( 'תרומות_מחוקות' ),
- 'Disambiguations' => array( 'פירושוני×', 'דפי_פירושוני×' ),
- 'DoubleRedirects' => array( 'הפניות_כפולות' ),
- 'EditWatchlist' => array( 'עריכת_רשימת_המעקב' ),
- 'Emailuser' => array( 'שליחת_דו×ר_למשתמש' ),
- 'Export' => array( 'ייצו×', 'ייצו×_דפי×' ),
- 'Fewestrevisions' => array( 'הגרס×ות_המעטות_ביותר', 'הדפי×_בעלי_מספר_העריכות_הנמוך_ביותר' ),
- 'FileDuplicateSearch' => array( 'חיפוש_קבצי×_כפולי×' ),
- 'Filepath' => array( 'נתיב_לקובץ' ),
- 'Import' => array( 'ייבו×', 'ייבו×_דפי×' ),
- 'Invalidateemail' => array( 'ביטול_דו×ר' ),
- 'JavaScriptTest' => array( 'בדיקת_JavaScript' ),
- 'BlockList' => array( 'רשימת_חסומי×', 'רשימת_משתמשי×_חסומי×', 'משתמשי×_חסומי×' ),
- 'LinkSearch' => array( 'חיפוש_קישורי×_חיצוניי×' ),
- 'Listadmins' => array( 'רשימת_מפעילי×' ),
- 'Listbots' => array( 'רשימת_בוטי×' ),
- 'Listfiles' => array( 'רשימת_קבצי×', 'רשימת_תמונות', 'קבצי×', 'תמונות' ),
- 'Listgrouprights' => array( 'רשימת_הרש×ות_לקבוצה' ),
- 'Listredirects' => array( 'רשימת_הפניות', 'הפניות' ),
- 'Listusers' => array( 'רשימת_משתמשי×', 'משתמשי×' ),
- 'Lockdb' => array( 'נעילת_בסיס_הנתוני×' ),
- 'Log' => array( 'יומני×' ),
- 'Lonelypages' => array( 'דפי×_יתומי×' ),
- 'Longpages' => array( 'דפי×_×רוכי×' ),
- 'MergeHistory' => array( 'מיזוג_גרס×ות' ),
- 'MIMEsearch' => array( 'חיפוש_MIME' ),
- 'Mostcategories' => array( 'הקטגוריות_הרבות_ביותר', 'הדפי×_מרובי-הקטגוריות_ביותר' ),
- 'Mostimages' => array( 'הקבצי×_המקושרי×_ביותר', 'התמונות_המקושרות_ביותר' ),
- 'Mostlinked' => array( 'הדפי×_המקושרי×_ביותר', 'המקושרי×_ביותר' ),
- 'Mostlinkedcategories' => array( 'הקטגוריות_המקושרות_ביותר' ),
- 'Mostlinkedtemplates' => array( 'התבניות_המקושרות_ביותר' ),
- 'Mostrevisions' => array( 'הגרס×ות_הרבות_ביותר', 'הדפי×_בעלי_מספר_העריכות_הגבוה_ביותר' ),
- 'Movepage' => array( 'העברת_דף', 'העברה' ),
- 'Mycontributions' => array( 'התרומות_שלי' ),
- 'Mypage' => array( 'הדף_שלי', 'דף_המשתמש_שלי' ),
- 'Mytalk' => array( 'השיחה_שלי', 'דף_השיחה_שלי' ),
- 'Myuploads' => array( 'ההעל×ות_שלי' ),
- 'Newimages' => array( 'קבצי×_חדשי×', 'תמונות_חדשות', 'גלריית_קבצי×_חדשי×', 'גלריית_תמונות_חדשות' ),
- 'Newpages' => array( 'דפי×_חדשי×' ),
- 'PasswordReset' => array( '×יפוס_סיסמה' ),
- 'PermanentLink' => array( 'קישור_קבוע' ),
- 'Popularpages' => array( 'הדפי×_הנצפי×_ביותר', 'דפי×_פופולריי×' ),
- 'Preferences' => array( 'העדפות', 'ההעדפות_שלי' ),
- 'Prefixindex' => array( 'דפי×_המתחילי×_ב' ),
- 'Protectedpages' => array( 'דפי×_מוגני×' ),
- 'Protectedtitles' => array( 'כותרות_מוגנות' ),
- 'Randompage' => array( '×קר××™', 'דף_×קר××™' ),
- 'Randomredirect' => array( 'הפניה_×קר×ית' ),
- 'Recentchanges' => array( 'שינויי×_×חרוני×' ),
- 'Recentchangeslinked' => array( 'שינויי×_בדפי×_המקושרי×' ),
- 'Revisiondelete' => array( 'מחיקת_ושחזור_גרס×ות' ),
- 'RevisionMove' => array( 'העברת_גרס×ות' ),
- 'Search' => array( 'חיפוש' ),
- 'Shortpages' => array( 'דפי×_קצרי×' ),
- 'Specialpages' => array( 'דפי×_מיוחדי×' ),
- 'Statistics' => array( 'סטטיסטיקות' ),
- 'Tags' => array( 'תגיות' ),
- 'Unblock' => array( 'שחרור_חסימה' ),
- 'Uncategorizedcategories' => array( 'קטגוריות_חסרות_קטגוריה' ),
- 'Uncategorizedimages' => array( 'קבצי×_חסרי_קטגוריה', 'תמונות_חסרות_קטגוריה' ),
- 'Uncategorizedpages' => array( 'דפי×_חסרי_קטגוריה' ),
- 'Uncategorizedtemplates' => array( 'תבניות_חסרות_קטגוריות' ),
- 'Undelete' => array( 'צפייה_בדפי×_מחוקי×' ),
- 'Unlockdb' => array( 'שחרור_בסיס_הנתוני×' ),
- 'Unusedcategories' => array( 'קטגוריות_ש×ינן_בשימוש' ),
- 'Unusedimages' => array( 'קבצי×_ש××™× ×_בשימוש', 'תמונות_ש×ינן_בשימוש' ),
- 'Unusedtemplates' => array( 'תבניות_ש×ינן_בשימוש' ),
- 'Unwatchedpages' => array( 'דפי×_ש××™× ×_במעקב' ),
- 'Upload' => array( 'העל××”', 'העל×ת_קובץ_לשרת' ),
- 'UploadStash' => array( 'מ×גר_העל×ות' ),
- 'Userlogin' => array( 'כניסה_לחשבון', 'כניסה', 'כניסה_/_הרשמה_לחשבון' ),
- 'Userlogout' => array( 'יצי××”_מהחשבון', 'יצי××”' ),
- 'Userrights' => array( 'ניהול_הרש×ות_משתמש', 'הפיכת_משתמש_למפעיל_מערכת', 'הענקת_×ו_ביטול_הרש×ת_בוט' ),
- 'Version' => array( 'גרסה', 'גרסת_התוכנה' ),
- 'Wantedcategories' => array( 'קטגוריות_מבוקשות' ),
- 'Wantedfiles' => array( 'קבצי×_מבוקשי×' ),
- 'Wantedpages' => array( 'דפי×_מבוקשי×' ),
- 'Wantedtemplates' => array( 'תבניות_מבוקשות' ),
- 'Watchlist' => array( 'רשימת_המעקב', 'רשימת_מעקב', 'רשימת_המעקב_שלי' ),
- 'Whatlinkshere' => array( 'דפי×_המקושרי×_לכ×ן' ),
- 'Withoutinterwiki' => array( 'דפי×_לל×_קישורי_שפה' ),
+$datePreferences = array(
+ 'default',
+ 'mdy',
+ 'dmy',
+ 'ymd',
+ 'hebrew',
+ 'ISO 8601',
);
-$namespaceNames = array(
- NS_MEDIA => 'מדיה',
- NS_SPECIAL => 'מיוחד',
- NS_MAIN => '',
- NS_TALK => 'שיחה',
- NS_USER => 'משתמש',
- NS_USER_TALK => 'שיחת_משתמש',
- NS_PROJECT_TALK => 'שיחת_$1',
- NS_FILE => 'קובץ',
- NS_FILE_TALK => 'שיחת_קובץ',
- NS_MEDIAWIKI => 'מדיה_ויקי',
- NS_MEDIAWIKI_TALK => 'שיחת_מדיה_ויקי',
- NS_TEMPLATE => 'תבנית',
- NS_TEMPLATE_TALK => 'שיחת_תבנית',
- NS_HELP => 'עזרה',
- NS_HELP_TALK => 'שיחת_עזרה',
- NS_CATEGORY => 'קטגוריה',
- NS_CATEGORY_TALK => 'שיחת_קטגוריה',
-);
-$namespaceAliases = array(
- 'תמונה' => NS_FILE,
- 'שיחת_תמונה' => NS_FILE_TALK,
+$dateFormats = array(
+ 'mdy time' => 'H:i',
+ 'mdy date' => 'xg j, Y',
+ 'mdy both' => 'H:i, xg j, Y',
+
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j xg Y',
+ 'dmy both' => 'H:i, j xg Y',
+
+ 'ymd time' => 'H:i',
+ 'ymd date' => 'Y xg j',
+ 'ymd both' => 'H:i, Y xg j',
+
+ 'hebrew time' => 'H:i',
+ 'hebrew date' => 'xhxjj xjx xhxjY',
+ 'hebrew both' => 'H:i, xhxjj xjx xhxjY',
+
+ 'ISO 8601 time' => 'xnH:xni:xns',
+ 'ISO 8601 date' => 'xnY-xnm-xnd',
+ 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
);
-$namespaceGenderAliases = array(
- NS_USER => array( 'male' => 'משתמש', 'female' => 'משתמשת' ),
- NS_USER_TALK => array( 'male' => 'שיחת_משתמש', 'female' => 'שיחת_משתמשת' ),
+
+$bookstoreList = array(
+ 'מיתוס' => 'http://www.mitos.co.il/',
+ 'iBooks' => 'http://www.ibooks.co.il/',
+ 'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
+ 'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
);
$messages = array(
@@ -487,6 +485,7 @@ $messages = array(
'newwindow' => '(נפתח בחלון חדש)',
'cancel' => 'ביטול',
'moredotdotdot' => 'עוד…',
+'morenotlisted' => 'עוד ×¤×¨×™×˜×™× ×©××™× × ×‘×¨×©×™×ž×”â€¦',
'mypage' => 'דף משתמש',
'mytalk' => 'שיחה',
'anontalk' => 'השיחה עבור IP זה',
@@ -498,7 +497,6 @@ $messages = array(
'qbbrowse' => 'דפדוף',
'qbedit' => 'עריכה',
'qbpageoptions' => '×פשרויות דף',
-'qbpageinfo' => 'מידע על הדף',
'qbmyoptions' => '×”×פשרויות שלי',
'qbspecialpages' => '×“×¤×™× ×ž×™×•×—×“×™×',
'faq' => 'ש×לות ותשובות',
@@ -521,6 +519,7 @@ $messages = array(
'namespaces' => 'מרחבי ש×',
'variants' => 'גרס×ות שפה',
+'navigation-heading' => 'תפריט הניווט',
'errorpagetitle' => 'שגי××”',
'returnto' => 'חזרה לדף $1.',
'tagline' => 'מתוך {{SITENAME}}',
@@ -764,10 +763,10 @@ $2',
# Login and logout pages
'logouttext' => "'''יצ××ª× ×–×” עתה מהחשבון.'''
-ב××¤×©×¨×•×ª×›× ×œ×”×ž×©×™×š ולעשות שימוש ב{{grammar:תחילית|{{SITENAME}}}} ב×ופן ×נונימי, ×ו [[Special:UserLogin|לשוב ולהיכנס ל×תר]] ×¢× ×©× ×ž×©×ª×ž×© ×–×”×” ×ו ×חר.
+ב××¤×©×¨×•×ª×›× ×œ×”×ž×©×™×š ולעשות שימוש ב{{grammar:תחילית|{{SITENAME}}}} ב×ופן ×נונימי, ×ו <span class='plainlinks'>[$1 לשוב ולהיכנס ל×תר]</span> ×¢× ×©× ×ž×©×ª×ž×© ×–×”×” ×ו ×חר.
שימו לב ×›×™ ייתכן ×©×“×¤×™× ××—×“×™× ×™×ž×©×™×›×• להיות ×ž×•×¦×’×™× ×›×ילו ××ª× ×¢×“×™×™×Ÿ ×ž×—×•×‘×¨×™× ×œ×—×©×‘×•×Ÿ עד שתנקו ×ת המטמון של הדפדפן שלכ×.",
-'welcomecreation' => '== ברוך בו×ך, $1! ==
-חשבונך נוצר.
+'welcomeuser' => 'ברוך בו×ך, $1!',
+'welcomecreation-msg' => 'חשבונך נוצר.
× × ×œ× ×œ×©×›×•×— להת××™× ×ת [[Special:Preferences|העדפות המשתמש]] שלך ב{{grammar:תחילית|{{SITENAME}}}}.',
'yourname' => '×©× ×ž×©×ª×ž×©:',
'yourpassword' => 'סיסמה:',
@@ -791,7 +790,7 @@ $2',
'gotaccount' => 'כבר נרשמת×? $1.',
'gotaccountlink' => 'כניסה לחשבון',
'userlogin-resetlink' => 'שכחת ×ת פרטי הכניסה?',
-'createaccountmail' => 'ב×מצעות דו×"ל',
+'createaccountmail' => 'שימוש בסיסמה זמנית ×קר×ית ושליחתה לכתובת הדו×"ל המצוינת להלן',
'createaccountreason' => 'סיבה:',
'badretype' => 'הסיסמ×ות ×©×”×–× ×ª× ×ינן מת×ימות.',
'userexists' => '×©× ×”×ž×©×ª×ž×© ×©×‘×—×¨×ª× ×›×‘×¨ × ×ž×¦× ×‘×©×™×ž×•×©.
@@ -869,6 +868,7 @@ $2',
# Email sending
'php-mail-error-unknown' => 'שגי××” ×œ× ×™×“×•×¢×” בפונקציה mail()‎ של PHP',
'user-mail-no-addy' => 'ניסיון לשלוח דו×"ל ×œ×œ× ×›×ª×•×‘×ª דו×"ל.',
+'user-mail-no-body' => 'ניסיון לשלוח דו×"ל ×¢× ×ª×•×›×Ÿ ריק ×ו קצר מ×וד.',
# Change password dialog
'resetpass' => 'שינוי סיסמה',
@@ -924,7 +924,7 @@ $2
סיסמה זמנית: $2',
'passwordreset-emailsent' => 'נשלח דו×ר ×לקטרוני ל×יפוס הסיסמה.',
'passwordreset-emailsent-capture' => 'נשלח דו×ר ×לקטרוני ל×יפוס הסיסמה, ×•×”×•× ×ž×•×¦×’ להלן.',
-'passwordreset-emailerror-capture' => 'נוצר דו×ר ×לקטרוני ×¢× ×ª×–×›×•×¨×ª, ×•×”×•× ×ž×•×¦×’ להלן, ×ך שליחתו למשתמש נכשלה: $1',
+'passwordreset-emailerror-capture' => 'נוצר דו×ר ×לקטרוני ל×יפוס הסיסמה, ×•×”×•× ×ž×•×¦×’ להלן, ×ך שליחתו למשתמש נכשלה: $1',
# Special:ChangeEmail
'changeemail' => 'שינוי כתובת דו×"ל',
@@ -934,6 +934,7 @@ $2
'changeemail-oldemail' => 'כתובת דו×"ל נוכחית:',
'changeemail-newemail' => 'כתובת דו×"ל חדשה:',
'changeemail-none' => '(×ין)',
+'changeemail-password' => 'סיסמה ב{{grammar:תחילית|{{SITENAME}}}}:',
'changeemail-submit' => 'שינוי כתובת הדו×"ל',
'changeemail-cancel' => 'ביטול',
@@ -1111,7 +1112,6 @@ $2
'template-semiprotected' => '(מוגנת חלקית)',
'hiddencategories' => 'דף ×–×” כלול ב{{PLURAL:$1|קטגוריה מוסתרת ×חת|Ö¾$1 קטגוריות מוסתרות}}:',
'edittools' => '<!-- הטקסט הנכתב ×›×ן יוצג מתחת לטופסי עריכת ×“×¤×™× ×•×”×¢×œ×ת קבצי×, ולפיכך ניתן לכתוב להציג בו ×ª×•×•×™× ×§×©×™× ×œ×›×ª×™×‘×”, ×§×˜×¢×™× ×ž×•×›× ×™× ×©×œ טקסט ועוד. -->',
-'nocreatetitle' => 'יצירת ×”×“×¤×™× ×”×•×’×‘×œ×”',
'nocreatetext' => '×תר ×–×” מגביל ×ת ×”×פשרות ליצור ×“×¤×™× ×—×“×©×™×. ב××¤×©×¨×•×ª×›× ×œ×—×–×•×¨ ×חורה ולערוך דף קיי×, ×ו [[Special:UserLogin|להיכנס לחשבון]].',
'nocreate-loggedin' => '××™× ×›× ×ž×•×¨×©×™× ×œ×™×¦×•×¨ ×“×¤×™× ×—×“×©×™×.',
'sectioneditnotsupported-title' => 'עריכת פסק×ות ××™× ×” נתמכת',
@@ -1135,6 +1135,15 @@ $2
'edit-already-exists' => '×œ× × ×™×ª×Ÿ ליצור דף חדש.
×”×•× ×›×‘×¨ קיי×.',
'defaultmessagetext' => 'טקסט ההודעה המקורי',
+'content-failed-to-parse' => 'פענוח $2 כתוכן מסוג $1 נכשל: $3',
+'invalid-content-data' => 'מידע שגוי על התוכן',
+'content-not-allowed-here' => 'תוכן מסוג "$1" ×ינו מותר בדף [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'טקסט ויקי',
+'content-model-text' => 'טקסט פשוט',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''×זהרה:''' דף ×–×” כולל יותר מדי קרי×ות לפונקציות מפענח שגוזלות מש×בי×.
@@ -1500,9 +1509,9 @@ $1",
'prefs-emailconfirm-label' => '×ימות כתובת דו×"ל:',
'prefs-textboxsize' => 'גודל חלון העריכה',
'youremail' => 'דו×ר ×לקטרוני:',
-'username' => '×©× ×ž×©×ª×ž×©:',
-'uid' => 'מספר סידורי:',
-'prefs-memberingroups' => 'חבר {{PLURAL:$1|בקבוצה|בקבוצות}}:',
+'username' => '×©× {{GENDER:$1|המשתמש|המשתמשת}}:',
+'uid' => 'המספר הסידורי של {{GENDER:$1|המשתמש|המשתמשת}}:',
+'prefs-memberingroups' => '{{GENDER:$2|חבר|חברה}} {{PLURAL:$1|בקבוצה|בקבוצות}}:',
'prefs-registration' => 'זמן ההרשמה:',
'yourrealname' => '×©× ×מיתי:',
'yourlanguage' => 'שפת הממשק:',
@@ -1653,12 +1662,13 @@ $1",
'right-sendemail' => 'שליחת דו×ר ×לקטרוני ×œ×ž×©×ª×ž×©×™× ×חרי×',
'right-passwordreset' => 'צפייה בדו×ר ×לקטרוני של ×יפוס סיסמה',
+# Special:Log/newusers
+'newuserlogpage' => 'יומן ×¨×™×©×•× ×ž×©×ª×ž×©×™×',
+'newuserlogpagetext' => 'זהו יומן המכיל הרשמות של משתמשי×.',
+
# User rights log
'rightslog' => 'יומן תפקידי×',
'rightslogtext' => 'זהו יומן ×”×©×™× ×•×™×™× ×‘×ª×¤×§×™×“×™ המשתמשי×.',
-'rightslogentry' => 'שינה ×ת ההרש×ות של $1 מ$2 ל$3',
-'rightslogentry-autopromote' => '×§×•×“× ×וטומטית מ$2 ל$3',
-'rightsnone' => '(כלו×)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => '×œ×§×¨×•× ×“×£ ×–×”',
@@ -1902,6 +1912,7 @@ $1',
'backend-fail-notsame' => 'כבר ×§×™×™× ×§×•×‘×¥ ×œ× ×–×”×” ב־"$1".',
'backend-fail-invalidpath' => '"$1" ×ינו נתיב ×חסון תקין.',
'backend-fail-delete' => '×œ× ×”×™×™×ª×” ×פשרות למחוק ×ת הקובץ "$1".',
+'backend-fail-describe' => '×œ× ×”×™×™×ª×” ×פשרות לשנות ×ת המידע הנוסף על הקובץ "$1".',
'backend-fail-alreadyexists' => 'הקובץ "$1" כבר קיי×.',
'backend-fail-store' => '×œ× ×”×™×™×ª×” ×פשרות ל×חסן ×ת הקובץ "$1" ב־"$2".',
'backend-fail-copy' => '×œ× ×”×™×™×ª×” ×פשרות להעתיק ×ת הקובץ "$1" ל־"$2".',
@@ -2137,6 +2148,12 @@ $1',
ייתכן ×©×¢×œ×™×”× ×œ×§×©×¨ ×‘×ž×§×•× ×–×ת לדף מת××™× ×™×•×ª×¨.<br />
דף נחשב לדף ×¤×™×¨×•×©×•× ×™× ×× ×”×•× ×ž×©×ª×ž×© בתבנית המקושרת מהדף [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => '×“×¤×™× ×¢× ×ž×פיין דף',
+'pageswithprop-legend' => '×“×¤×™× ×¢× ×ž×פיין דף',
+'pageswithprop-text' => 'בדף ×–×” מופיעה רשימת ×“×¤×™× ×©×ž×©×ª×ž×©×™× ×‘×ž×פיין דף מסוי×.',
+'pageswithprop-prop' => '×©× ×”×ž×פיין:',
+'pageswithprop-submit' => 'הצגה',
+
'doubleredirects' => 'הפניות כפולות',
'doubleredirectstext' => 'בדף ×”×–×” מופיעה רשימת דפי הפניה ×©×ž×¤× ×™× ×œ×“×¤×™ הפניה ×חרי×.
כל שורה מכילה קישור לשתי ההפניות הר×שונות, וכן ×ת היעד של ההפניה השנייה, ×©×”×™× ×œ×¨×•×‘ היעד ×”"×מיתי" של ההפניה, שההפניה הר×שונה ×מורה להצביע ×ליו.
@@ -2291,7 +2308,7 @@ $1',
'linksearch-ok' => 'חיפוש',
'linksearch-text' => 'ניתן להשתמש ×‘×ª×•×•×™× ×›×œ×œ×™×™×, לדוגמה <span dir="ltr">"*.wikipedia.org"</span>.
נדרשת לפחות סיומת ×ינטרנט (TLD), למשל <span dir="ltr">"*.org"</span>.<br />
-×¤×¨×•×˜×•×§×•×œ×™× × ×ª×ž×›×™×: <code dir="ltr">$1</code> (ברירת המחדל ×”×™× <span dir="ltr">http://</span> ×× ×œ× ×¦×•×™×Ÿ פרוטוקול).',
+{{PLURAL:$2|פרוטוקול נתמך|×¤×¨×•×˜×•×§×•×œ×™× × ×ª×ž×›×™×}}: <code dir="ltr">$1</code> (ברירת המחדל ×”×™× <span dir="ltr">http://</span> ×× ×œ× ×¦×•×™×Ÿ פרוטוקול).',
'linksearch-line' => '$1 מקושר מהדף $2',
'linksearch-error' => '×ª×•×•×™× ×›×œ×œ×™×™× ×™×›×•×œ×™× ×œ×”×•×¤×™×¢ רק בתחילת ×©× ×”×©×¨×ª.',
@@ -2310,10 +2327,6 @@ $1',
'activeusers-hidesysops' => 'הסתרת מפעילי מערכת',
'activeusers-noresult' => '×œ× × ×ž×¦×ו משתמשי×.',
-# Special:Log/newusers
-'newuserlogpage' => 'יומן ×¨×™×©×•× ×ž×©×ª×ž×©×™×',
-'newuserlogpagetext' => 'זהו יומן המכיל הרשמות של משתמשי×.',
-
# Special:ListGroupRights
'listgrouprights' => 'רשימת הרש×ות לקבוצה',
'listgrouprights-summary' => 'זוהי רשימה של קבוצות המשתמש המוגדרות ב×תר ×–×”, ×¢× ×”×”×¨×©×ות של כל ×חת.
@@ -2408,19 +2421,23 @@ $1',
'enotif_mailer' => 'הודעות {{SITENAME}}',
'enotif_reset' => 'סימון כל ×”×“×¤×™× ×›×ילו נצפו',
-'enotif_newpagetext' => 'זהו דף חדש.',
'enotif_impersonal_salutation' => 'משתמש של {{SITENAME}}',
-'changed' => 'שונה',
-'created' => 'נוצר',
-'enotif_subject' => 'הדף $PAGETITLE ב{{grammar:תחילית|{{SITENAME}}}} $CHANGEDORCREATED על ידי $PAGEEDITOR',
+'enotif_subject_deleted' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נמחק על ידי $2',
+'enotif_subject_created' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נוצר על ידי $2',
+'enotif_subject_moved' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} הועבר על ידי $2',
+'enotif_subject_restored' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שוחזר על ידי $2',
+'enotif_subject_changed' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שונה על ידי $2',
+'enotif_body_intro_deleted' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נמחק ב־$PAGEEDITDATE על ידי $2, ר×ו $3.',
+'enotif_body_intro_created' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נוצר ב־$PAGEEDITDATE על ידי $2, ר×ו $3 לגרסה הנוכחית.',
+'enotif_body_intro_moved' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} הועבר ב־$PAGEEDITDATE על ידי $2, ר×ו $3 לגרסה הנוכחית.',
+'enotif_body_intro_restored' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שוחזר ב־$PAGEEDITDATE על ידי $2, ר×ו $3 לגרסה הנוכחית.',
+'enotif_body_intro_changed' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שונה ב־$PAGEEDITDATE על ידי $2, ר×ו $3 לגרסה הנוכחית.',
'enotif_lastvisited' => 'ר×ו $1 לכל ×”×©×™× ×•×™×™× ×ž××– ×‘×™×§×•×¨×›× ×”×חרון.',
'enotif_lastdiff' => 'ר×ו $1 לשינוי ×–×”.',
'enotif_anon_editor' => 'משתמש ×נונימי $1',
'enotif_body' => 'לכבוד $WATCHINGUSERNAME,
-הדף $PAGETITLE ב{{grammar:תחילית|{{SITENAME}}}} $CHANGEDORCREATED ב־$PAGEEDITDATE על ידי $PAGEEDITOR, ר×ו $PAGETITLE_URL לגרסה הנוכחית.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
תקציר העריכה: $PAGESUMMARY $PAGEMINOREDIT
@@ -2428,7 +2445,7 @@ $NEWPAGE
בדו×ר ×”×לקטרוני: $PAGEEDITOR_EMAIL
ב×תר: $PAGEEDITOR_WIKI
-×œ× ×ª×”×™×™× ×” הודעות על ×©×™× ×•×™×™× × ×•×¡×¤×™× ×¢×“ שתבקרו ×ת הדף. ב××¤×©×¨×•×ª×›× ×’× ×œ×פס ×ת דגלי ההודעות בכל ×”×“×¤×™× ×©×‘×¨×©×™×ž×ª המעקב.
+×œ× ×ª×”×™×™× ×” הודעות על פעולות נוספות עד שתבקרו בדף. ב××¤×©×¨×•×ª×›× ×’× ×œ×פס ×ת דגלי ההודעות בכל ×”×“×¤×™× ×©×‘×¨×©×™×ž×ª המעקב.
מערכת ההודעות של {{SITENAME}}
@@ -2444,6 +2461,8 @@ $UNWATCHURL
למשוב ולעזרה נוספת:
{{canonicalurl::{{MediaWiki:Helppage}}}}',
+'created' => 'נוצר',
+'changed' => 'שונה',
# Delete
'deletepage' => 'מחיקה',
@@ -2513,6 +2532,8 @@ $UNWATCHURL
'prot_1movedto2' => '[[$1]] הועבר ×œ×©× [[$2]]',
'protect-badnamespace-title' => 'מרחב ×©× ×©×‘×• ×œ× × ×™×ª×Ÿ להגן על דפי×',
'protect-badnamespace-text' => '×œ× × ×™×ª×Ÿ להגן על ×“×¤×™× ×‘×ž×¨×—×‘ ×©× ×–×”.',
+'protect-norestrictiontypes-text' => '×œ× × ×™×ª×Ÿ להגן על דף ×–×” ×›×™ ×ין סוגי ×”×’× ×” זמיני×.',
+'protect-norestrictiontypes-title' => 'דף ×©×œ× × ×™×ª×Ÿ להגן עליו',
'protect-legend' => '×ישור הפעלת ×”×”×’× ×”',
'protectcomment' => 'סיבה:',
'protectexpiry' => 'פקיעת ההגנה:',
@@ -2593,7 +2614,8 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|שוחזרה גרסה ×חת|שוחזרו $1 גרס×ות}}',
'undeletedrevisions-files' => '{{PLURAL:$1|גרסה ×חת|$1 גרס×ות}} ו{{PLURAL:$2|קובץ ×חד|Ö¾$2 קבצי×}} שוחזרו',
'undeletedfiles' => '{{PLURAL:$1|שוחזר קובץ ×חד|שוחזרו $1 קבצי×}}',
-'cannotundelete' => 'השחזור נכשל; ייתכן שמישהו ×חר כבר שחזר ×ת הדף.',
+'cannotundelete' => 'השחזור נכשל:
+$1',
'undeletedpage' => "'''הדף $1 שוחזר בהצלחה.'''
ר×ו ×ת [[Special:Log/delete|יומן המחיקות]] לרשימה של מחיקות ×•×©×—×–×•×¨×™× ×חרוני×.",
@@ -2624,7 +2646,7 @@ $1',
'blanknamespace' => '(ר×שי)',
# Contributions
-'contributions' => 'תרומות המשתמש',
+'contributions' => 'תרומות {{GENDER:$1|המשתמש|המשתמשת}}',
'contributions-title' => 'תרומות של המשתמש $1',
'mycontris' => 'תרומות',
'contribsub2' => 'עבור $1 ($2)',
@@ -2896,6 +2918,7 @@ $1',
'immobile-target-namespace-iw' => 'קישור בינוויקי ×ינו יעד תקין להעברת דף.',
'immobile-source-page' => 'דף ×–×” ×ינו ניתן להעברה.',
'immobile-target-page' => '×œ× × ×™×ª×Ÿ להעביר ×ל כותרת יעד זו.',
+'bad-target-model' => 'היעד המבוקש משתמש בסוג תוכן שונה. ×œ× × ×™×ª×Ÿ להמיר $1 ל{{grammar:תחילית|$2}}.',
'imagenocrossnamespace' => '×œ× × ×™×ª×Ÿ להעביר קובץ למרחב ×©× ×חר',
'nonfile-cannot-move-to-file' => '×œ× × ×™×ª×Ÿ להעביר דף ש×ינו קובץ למרחב קובץ',
'imagetypemismatch' => 'סיומת הקובץ החדשה ××™× ×” מת×ימה לסוג הקובץ',
@@ -3010,6 +3033,7 @@ $1',
'import-error-interwiki' => '×œ× × ×™×ª×Ÿ ×œ×™×™×‘× ×ת הדף "$1" כיוון ששמו שמור לקישור חיצוני (בין־ויקי).',
'import-error-special' => '×œ× × ×™×ª×Ÿ ×œ×™×™×‘× ×ת הדף "$1" כיוון ×©×”×•× ×©×™×™×š למרחב ×©× ×ž×™×•×—×“ ×©×œ× ×™×›×•×œ להכיל דפי×.',
'import-error-invalid' => '×œ× × ×™×ª×Ÿ ×œ×™×™×‘× ×ת הדף "$1" כיוון ששמו ×ינו תקין.',
+'import-error-unserialize' => '×œ× × ×™×ª×Ÿ ×”×™×” לפענח ×ת הגרסה $2 של הדף "$1". הגרסה מסומנת ×›×ילו ×”×™× ×ž×©×ª×ž×©×ª במודל התוכן $3, ×ך קודדה ×›{{GRAMMAR:תחילית|$4}}.',
'import-options-wrong' => '{{PLURAL:$2|×פשרות שגויה|×פשרויות שגויות}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'לדף הבסיס שניתן יש כותרת ×œ× ×ª×§×™× ×”.',
'import-rootpage-nosubpage' => 'מרחב ×”×©× "$1" של דף הבסיס ×ינו מ×פשר דפי־משנה.',
@@ -3024,7 +3048,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'בדיקת JavaScript',
-'javascripttest-disabled' => 'תכונה זו ×œ× ×”×•×¤×¢×œ×” ב×תר הוויקי ×”×–×”.',
'javascripttest-title' => 'הרצת בדיקות $1',
'javascripttest-pagetext-noframework' => 'דף זה שמור להרצת בדיקות JavaScript.',
'javascripttest-pagetext-unknownframework' => 'סביבת הבדיקות "$1" ××™× ×” ידועה.',
@@ -3174,11 +3197,13 @@ $1',
'pageinfo-default-sort' => 'מפתח המיון הרגיל',
'pageinfo-length' => '×ורך הדף (בבתי×)',
'pageinfo-article-id' => 'מזהה הדף',
+'pageinfo-language' => 'שפת התוכן של הדף',
'pageinfo-robot-policy' => 'מצב מנוע חיפוש',
'pageinfo-robot-index' => 'יכול להי×סף למפתחות חיפוש',
'pageinfo-robot-noindex' => '×œ× ×™×›×•×œ להי×סף למפתחות חיפוש',
'pageinfo-views' => 'מספר הצפיות',
'pageinfo-watchers' => 'מספר ×”×¢×•×§×‘×™× ×חר הדף',
+'pageinfo-few-watchers' => 'פחות מ{{PLURAL:$1|עוקב ×חד|Ö¾$1 עוקבי×}}',
'pageinfo-redirects-name' => 'הפניות לדף זה',
'pageinfo-subpages-name' => 'דפי־משנה של דף זה',
'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|הפניה ×חת|$2 הפניות}}; {{PLURAL:$3|דף רגיל ×חד|$3 ×“×¤×™× ×¨×’×™×œ×™×}})',
@@ -3193,6 +3218,19 @@ $1',
'pageinfo-magic-words' => '{{PLURAL:$1|מילת קס×|מילות קס×}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|קטגוריה מוסתרת|קטגוריות מוסתרות}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|תבנית מוכללת|תבניות מוכללות}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|דף|דפי×}} שמוכלל ×‘×”× ($1)',
+'pageinfo-toolboxlink' => 'מידע על הדף',
+'pageinfo-redirectsto' => 'מפנה ×ל',
+'pageinfo-redirectsto-info' => 'מידע',
+'pageinfo-contentpage' => 'נספר כדף תוכן',
+'pageinfo-contentpage-yes' => 'כן',
+'pageinfo-protect-cascading' => 'מופעלת ×”×’× ×” מדורגת מכ×ן',
+'pageinfo-protect-cascading-yes' => 'כן',
+'pageinfo-protect-cascading-from' => 'דף זה מוגן בגלל הגנה מדורגת על',
+'pageinfo-category-info' => 'מידע על הקטגוריה',
+'pageinfo-category-pages' => 'מספר הדפי×',
+'pageinfo-category-subcats' => 'מספר קטגוריות המשנה',
+'pageinfo-category-files' => 'מספר הקבצי×',
# Skin names
'skinname-standard' => 'קל×סי',
@@ -3215,6 +3253,8 @@ $1',
'markedaspatrollederror' => '×œ× × ×™×ª×Ÿ לסמן כבדוק',
'markedaspatrollederrortext' => '×¢×œ×™×›× ×œ×¦×™×™×Ÿ גרסה שתציינו כבדוקה.',
'markedaspatrollederror-noautopatrol' => '××™× ×›× ×ž×•×¨×©×™× ×œ×¡×ž×Ÿ ×ת ×”×©×™× ×•×™×™× ×©×œ ×¢×¦×ž×›× ×›×‘×“×•×§×™×.',
+'markedaspatrollednotify' => 'שינוי זה ל"$1" סומן כבדוק.',
+'markedaspatrollederrornotify' => 'סימון השינוי כבדוק נכשל.',
# Patrol log
'patrol-log-page' => 'יומן ×©×™× ×•×™×™× ×‘×“×•×§×™×',
@@ -3248,6 +3288,7 @@ $1',
'file-nohires' => '×ין גרסה ברזולוציה גבוהה יותר.',
'svg-long-desc' => 'קובץ SVG, הגודל המקורי: <span dir="ltr">$1 × $2</span> פיקסלי×, גודל הקובץ: $3',
'svg-long-desc-animated' => 'קובץ SVG מונפש, הגודל המקורי: <span dir="ltr">$1 × $2</span> פיקסלי×, גודל הקובץ: $3',
+'svg-long-error' => 'קובץ SVG ×œ× ×ª×§×™×Ÿ: $1',
'show-big-image' => 'תמונה ברזולוציה גבוהה יותר',
'show-big-image-preview' => 'גודל תצוגה זו: $1.',
'show-big-image-other' => '{{PLURAL:$2|רזולוציה ×חרת|רזולוציות ×חרות}}: $1.',
@@ -3281,7 +3322,10 @@ $1',
'minutes' => '{{PLURAL:$1|דקה|$1 דקות}}',
'hours' => '{{PLURAL:$1|שעה|שעתיי×|$1 שעות}}',
'days' => '{{PLURAL:$1|יו×|יומיי×|$1 ימי×}}',
+'months' => '{{PLURAL:$1|חודש|חודשיי×|$1 חודשי×}}',
+'years' => '{{PLURAL:$1|שנה|שנתיי×|$1 שני×}}',
'ago' => 'לפני $1',
+'just-now' => 'לפני זמן קצר',
# Bad image list
'bad_image_list' => 'דרך הכתיבה בהודעה ×”×™× ×›×ž×ª×•×ר להלן:
@@ -3773,6 +3817,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[הכללת ×“×¤×™× ×‘×™×Ÿ ××ª×¨×™× ×ž×‘×•×˜×œ×ª]',
'scarytranscludefailed' => '[×חזור התבנית נכשל עבור $1]',
+'scarytranscludefailed-httpstatus' => '[×חזור התבנית נכשל עבור $1&rlm;: HTTP $2]',
'scarytranscludetoolong' => '[כתובת ×”Ö¾URL ×רוכה מדי]',
# Delete conflict
@@ -3952,6 +3997,7 @@ $5
'version-license' => 'רישיון',
'version-poweredby-credits' => "×תר הוויקי ×”×–×” מופעל על ידי '''[//www.mediawiki.org/ מדיה־ויקי]''', © 2001–$1 $2.",
'version-poweredby-others' => '×חרי×',
+'version-credits-summary' => '×נו ×¨×•×¦×™× ×œ×”×•×“×•×ª ל×× ×©×™× ×”×‘××™× ×¢×œ ×ª×¨×•×ž×ª× ×œ[[Special:Version|מדיה־ויקי]].',
'version-license-info' => "מדיה־ויקי ×”×™× ×ª×•×›× ×” חופשית; ב××¤×©×¨×•×ª×›× ×œ×”×¤×™×¥ ×ותה מחדש ו/×ו לשנות ×ותה לפי תנ××™ הרישיון הציבורי הכללי של גנו ×”×ž×¤×•×¨×¡× ×¢×œ ידי המוסד לתוכנה חופשית: גרסה 2 של רישיון ×–×”, ×ו (לפי בחירתכ×) כל גרסה מ×וחרת יותר.
מדיה־ויקי מופצת בתקווה ×©×”×™× ×ª×”×™×” שימושית, ×ך '''×œ×œ× ×›×œ הבטחה ל×חריות'''; ×פילו ×œ× ×חריות משתמעת של '''יכולת להיסחר''' ×ו '''הת×מה למטרה מסוימת'''. ר×ו ×ת הרישיון הציבורי הכללי של גנו ×œ×¤×¨×˜×™× × ×•×¡×¤×™×.
@@ -4065,17 +4111,17 @@ $5
'sqlite-no-fts' => '$1 ×œ×œ× ×ª×ž×™×›×” בחיפוש בטקסט מל×',
# New logging system
-'logentry-delete-delete' => '$1 מחק ×ת הדף $3',
-'logentry-delete-restore' => '$1 שחזר ×ת הדף $3',
-'logentry-delete-event' => '$1 שינה ×ת מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4',
-'logentry-delete-revision' => '$1 שינה ×ת מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרס×ות}} של הדף $3: $4',
-'logentry-delete-event-legacy' => '$1 שינה ×ת מצב התצוגה של פעולות יומן של $3',
-'logentry-delete-revision-legacy' => '$1 שינה ×ת מצב התצוגה של גרס×ות בדף $3',
-'logentry-suppress-delete' => '$1 הסתיר לחלוטין ×ת הדף $3',
-'logentry-suppress-event' => '$1 שינה בסודיות ×ת מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4',
-'logentry-suppress-revision' => '$1 שינה בסודיות ×ת מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרס×ות}} של הדף $3: $4',
-'logentry-suppress-event-legacy' => '$1 שינה בסודיות ×ת מצב התצוגה של פעולות יומן של $3',
-'logentry-suppress-revision-legacy' => '$1 שינה בסודיות ×ת מצב התצוגה של גרס×ות של הדף $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|מחק|מחקה}} ×ת הדף $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|שחזר|שחזרה}} ×ת הדף $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|שינה|שינתה}} ×ת מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|שינה|שינתה}} ×ת מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרס×ות}} של הדף $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|שינה|שינתה}} ×ת מצב התצוגה של פעולות יומן של $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|שינה|שינתה}} ×ת מצב התצוגה של גרס×ות בדף $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|הסתיר|הסתירה}} לחלוטין ×ת הדף $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|שינה|שינתה}} בסודיות ×ת מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|שינה|שינתה}} בסודיות ×ת מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרס×ות}} של הדף $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|שינה|שינתה}} בסודיות ×ת מצב התצוגה של פעולות יומן של $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|שינה|שינתה}} בסודיות ×ת מצב התצוגה של גרס×ות של הדף $3',
'revdelete-content-hid' => 'התוכן הוסתר',
'revdelete-summary-hid' => 'תקציר העריכה הוסתר',
'revdelete-uname-hid' => '×©× ×”×ž×©×ª×ž×© הוסתר',
@@ -4084,17 +4130,21 @@ $5
'revdelete-uname-unhid' => 'הסתרת ×©× ×”×ž×©×ª×ž×© בוטלה',
'revdelete-restricted' => 'נוספו הגבלות למפעילי מערכת',
'revdelete-unrestricted' => 'הוסרו הגבלות ממפעילי מערכת',
-'logentry-move-move' => '$1 העביר ×ת הדף $3 ל$4',
-'logentry-move-move-noredirect' => '$1 העביר ×ת הדף $3 ל{{GRAMMAR:תחילית|$4}} בלי להש×יר הפניה',
-'logentry-move-move_redir' => '$1 העביר ×ת הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה',
-'logentry-move-move_redir-noredirect' => '$1 העביר ×ת הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה ובלי להש×יר הפניה',
-'logentry-patrol-patrol' => '$1 סימן ×ת הגרסה $4 בדף $3 כבדוקה',
-'logentry-patrol-patrol-auto' => '$1 סימן ×וטומטית ×ת הגרסה $4 בדף $3 כבדוקה',
-'logentry-newusers-newusers' => 'חשבון המשתמש $1 נוצר',
-'logentry-newusers-create' => 'חשבון המשתמש $1 נוצר',
+'logentry-move-move' => '$1 {{GENDER:$2|העביר|העבירה}} ×ת הדף $3 ל$4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|העביר|העבירה}} ×ת הדף $3 ל{{GRAMMAR:תחילית|$4}} בלי להש×יר הפניה',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|העביר|העבירה}} ×ת הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|העביר|העבירה}} ×ת הדף $3 ל{{GRAMMAR:תחילית|$4}} תוך דריסת הפניה ובלי להש×יר הפניה',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|סימן|סימנה}} ×ת הגרסה $4 בדף $3 כבדוקה',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|סימן|סימנה}} ×וטומטית ×ת הגרסה $4 בדף $3 כבדוקה',
+'logentry-newusers-newusers' => 'חשבון המשתמש $1 {{GENDER:$2|נוצר}}',
+'logentry-newusers-create' => 'חשבון המשתמש $1 {{GENDER:$2|נוצר}}',
'logentry-newusers-create2' => 'חשבון המשתמש $3 נוצר על ידי $1',
-'logentry-newusers-autocreate' => 'חשבון המשתמש $1 נוצר ×וטומטית',
-'newuserlog-byemail' => 'הסיסמה נשלחה בדו×"ל',
+'logentry-newusers-byemail' => 'חשבון המשתמש $3 נוצר על ידי $1 והסיסמה נשלחה בדו×"ל',
+'logentry-newusers-autocreate' => 'חשבון המשתמש $1 {{GENDER:$2|נוצר}} ×וטומטית',
+'logentry-rights-rights' => '$1 {{GENDER:$2|שינה|שינתה}} ×ת ההרש×ות של $3 מ$4 ל$5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|שינה|שינתה}} ×ת ההרש×ות של $3',
+'logentry-rights-autopromote' => '$1 ×§×•×“× ×וטומטית מ$4 ל$5',
+'rightsnone' => '(כלו×)',
# Feedback
'feedback-bugornote' => '×× ××ª× ×ž×•×›× ×™× ×œ×ª×ר בעיה טכנית בפרטי×, ×× × [$1 דווחו ב××’].
@@ -4148,6 +4198,7 @@ $5
'api-error-ok-but-empty' => 'שגי××” פנימית: ×ין תשובה מהשרת.',
'api-error-overwrite' => '×œ× ×ž×•×ª×¨×ª החלפת קובץ קיי×.',
'api-error-stashfailed' => 'שגי××” פנימית: השרת נכשל ב×חסון הקובץ הזמני.',
+'api-error-publishfailed' => 'שגי××” פנימית: השרת נכשל ×‘×¤×¨×¡×•× ×”×§×•×‘×¥ הזמני.',
'api-error-timeout' => 'השרת ×œ× ×”×©×™×‘ בזמן המצופה.',
'api-error-unclassified' => '×ירעה שגי××” בלתי ידועה.',
'api-error-unknown-code' => 'שגי××” בלתי ידועה: "$1".',
@@ -4168,4 +4219,7 @@ $5
'duration-centuries' => '{{PLURAL:$1|מ××” שנה|מ××ª×™×™× ×©× ×”|$1 מ×ות שני×}}',
'duration-millennia' => '{{PLURAL:$1|×לף שנה|××œ×¤×™×™× ×©× ×”|$1 ×לפי שני×}}',
+# Image rotation
+'rotate-comment' => 'התמונה סובבה {{PLURAL:$1|במעלה ×חת|ב֫־$1 מעלות}} בכיוון השעון',
+
);
diff --git a/languages/messages/MessagesHi.php b/languages/messages/MessagesHi.php
index 4139420b..a7a4085c 100644
--- a/languages/messages/MessagesHi.php
+++ b/languages/messages/MessagesHi.php
@@ -7,6 +7,7 @@
* @ingroup Language
* @file
*
+ * @author Aapkamanoj
* @author Abhishrut
* @author Akansha
* @author Aksi great
@@ -77,7 +78,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'सभी_सनà¥à¤¦à¥‡à¤¶', 'सभी_संदेश' ),
'Allpages' => array( 'सभी_पृषà¥à¤ ', 'सभी_पनà¥à¤¨à¥‡' ),
'Ancientpages' => array( 'पà¥à¤°à¤¾à¤¨à¥‡_पृषà¥à¤ ', 'पà¥à¤°à¤¾à¤¨à¥‡_पनà¥à¤¨à¥‡' ),
- 'Badtitle' => array( 'खराब_शीरà¥à¤·à¤•' ),
+ 'Badtitle' => array( 'ख़राब_शीरà¥à¤·à¤•' ),
'Blankpage' => array( 'रिकà¥à¤¤_पृषà¥à¤ ', 'खाली_पृषà¥à¤ ' ),
'Block' => array( 'अवरोधन', 'आइ_पी_अवरोधन', 'सदसà¥à¤¯_अवरोधन' ),
'Blockme' => array( 'सà¥à¤µà¤¾à¤µà¤°à¥‹à¤§à¤¨', 'सà¥à¤µ_अवरोधन', 'मà¥à¤à¥‡_रोकिये' ),
@@ -102,6 +103,7 @@ $specialPageAliases = array(
'Filepath' => array( 'फ़ाइल_पथ', 'फाइल_पथ', 'संचिका_पथ' ),
'Import' => array( 'आयात' ),
'Invalidateemail' => array( 'अपà¥à¤°à¤®à¤¾à¤£à¤¿à¤¤_ईमेल', 'अमानà¥à¤¯_ईमेल', 'ईमेल_अमानà¥à¤¯_करें' ),
+ 'JavaScriptTest' => array( 'जावा_सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ_परीकà¥à¤·à¤¾' ),
'BlockList' => array( 'अवरोध_सूची', 'अवरोधित_सदसà¥à¤¯_सूची', 'अवरोधित_आइ_पी_सूची' ),
'LinkSearch' => array( 'बाहरी_कड़ी_खोज' ),
'Listadmins' => array( 'पà¥à¤°à¤¬à¤¨à¥à¤§à¤•_सूची', 'पà¥à¤°à¤¬à¤‚धक_सूची' ),
@@ -118,6 +120,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'माइम_खोज' ),
'Mostcategories' => array( 'सरà¥à¤µà¤¾à¤§à¤¿à¤•_शà¥à¤°à¥‡à¤£à¥€à¤•à¥ƒà¤¤', 'सरà¥à¤µà¤¾à¤§à¤¿à¤•_शà¥à¤°à¥‡à¤£à¤¿à¤¯à¤¾à¤' ),
'Mostimages' => array( 'सरà¥à¤µà¤¾à¤§à¤¿à¤•_पà¥à¤°à¤¯à¥à¤•à¥à¤¤_फ़ाइलें', 'सरà¥à¤µà¤¾à¤§à¤¿à¤•_पà¥à¤°à¤¯à¥à¤•à¥à¤¤_फाइलें' ),
+ 'Mostinterwikis' => array( 'ज़à¥à¤¯à¤¾à¤¦à¤¾_इंटेरà¥à¤µà¤¿à¤•à¤¿à¤¯à¤¾à¤' ),
'Mostlinked' => array( 'सरà¥à¤µà¤¾à¤§à¤¿à¤•_जà¥à¤¡à¤¼à¥‡_पृषà¥à¤ ' ),
'Mostlinkedcategories' => array( 'सरà¥à¤µà¤¾à¤§à¤¿à¤•_पà¥à¤°à¤¯à¥à¤•à¥à¤¤_शà¥à¤°à¥‡à¤£à¤¿à¤¯à¤¾à¤' ),
'Mostlinkedtemplates' => array( 'सरà¥à¤µà¤¾à¤§à¤¿à¤•_पà¥à¤°à¤¯à¥à¤•à¥à¤¤_साà¤à¤šà¥‡' ),
@@ -163,6 +166,10 @@ $specialPageAliases = array(
'Withoutinterwiki' => array( 'अनà¥à¤¤à¤°à¤µà¤¿à¤•à¤¿_रहित', 'अंतरविकि_रहित' ),
);
+$magicWords = array(
+ 'redirect' => array( '0', '#अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤', '#REDIRECT' ),
+);
+
$digitTransformTable = array(
'0' => '०', # &#x0966;
'1' => '१', # &#x0967;
@@ -324,7 +331,6 @@ $messages = array(
'qbbrowse' => 'बà¥à¤°à¤¾à¤‰à¤œà¤¼',
'qbedit' => 'बदलें',
'qbpageoptions' => 'यह पृषà¥à¤ ',
-'qbpageinfo' => 'पृषà¥à¤  जानकारी',
'qbmyoptions' => 'मेरे पृषà¥à¤ ',
'qbspecialpages' => 'विशेष पृषà¥à¤ ',
'faq' => 'बहà¥à¤§à¤¾ पूछित पà¥à¤°à¤¶à¥à¤¨',
@@ -347,6 +353,7 @@ $messages = array(
'namespaces' => 'नामसà¥à¤¥à¤¾à¤¨',
'variants' => 'संसà¥à¤•à¤°à¤£',
+'navigation-heading' => 'दिकà¥à¤šà¤¾à¤²à¤¨ सूची',
'errorpagetitle' => 'तà¥à¤°à¥à¤Ÿà¤¿',
'returnto' => '$1 को लौटें।',
'tagline' => '{{SITENAME}} से',
@@ -586,10 +593,11 @@ $2',
# Login and logout pages
'logouttext' => "'''अब आपका सतà¥à¤°à¤¾à¤‚त हो चà¥à¤•à¤¾ है।'''
-आप बेनामी हो के {{SITENAME}} का पà¥à¤°à¤¯à¥‹à¤— जारी रख सकते हैं, या उसी या किसी और सदसà¥à¤¯ के तौर पर [[Special:UserLogin|फिर से सतà¥à¤°à¤¾à¤°à¤‚भ]] कर सकते हैं।
+आप बेनामी हो के {{SITENAME}} का पà¥à¤°à¤¯à¥‹à¤— जारी रख सकते हैं, या उसी या किसी और सदसà¥à¤¯ के तौर पर <span class='plainlinks'>[$1 फिर से सतà¥à¤°à¤¾à¤°à¤‚भ]</span> कर सकते हैं।
धà¥à¤¯à¤¾à¤¨ दें कि जब तक आप अपनी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° कैशे खाली नहीं करते हैं, कà¥à¤› पृषà¥à¤  अब भी à¤à¤¸à¥‡ दिख सकते हैं जैसे कि आपका सतà¥à¤° अभी भी चल रहा हो।",
-'welcomecreation' => '== आपका सà¥à¤µà¤¾à¤—त है, $1 ! ==
-आपका खाता बनाया जा चà¥à¤•à¤¾ है। अपनी [[Special:Preferences|{{SITENAME}} वरीयताà¤à¤]] परिवरà¥à¤¤à¤¿à¤¤ करना न भूलिà¤à¤—ा।',
+'welcomeuser' => 'आपका सà¥à¤µà¤¾à¤—त है, $1!',
+'welcomecreation-msg' => 'आपका खाता बना दिया गया है।
+अपनी [[Special:Preferences|{{SITENAME}} वरीयताà¤à¤]] बदलना ना भूलियेगा।',
'yourname' => 'सदसà¥à¤¯à¤¨à¤¾à¤®:',
'yourpassword' => 'कूटशबà¥à¤¦:',
'yourpasswordagain' => 'कूटशबà¥à¤¦ दà¥à¤¬à¤¾à¤°à¤¾ लिखें:',
@@ -745,6 +753,7 @@ $2
'changeemail-oldemail' => 'वरà¥à¤¤à¤®à¤¾à¤¨ ई-मेल पता:',
'changeemail-newemail' => 'नया ई-मेल पता:',
'changeemail-none' => '(कोई नहीं)',
+'changeemail-password' => 'आपका {{SITENAME}} पासवरà¥à¤¡:',
'changeemail-submit' => 'ई-मेल बदलें',
'changeemail-cancel' => 'रदà¥à¤¦ करें',
@@ -931,7 +940,6 @@ $2
'template-semiprotected' => '(अरà¥à¤§-सà¥à¤°à¤•à¥à¤·à¤¿à¤¤)',
'hiddencategories' => 'यह पृषà¥à¤  निमà¥à¤¨à¤²à¤¿à¤–ित $1 छà¥à¤ªà¤¾à¤ˆ हà¥à¤ˆ {{PLURAL:$1|शà¥à¤°à¥‡à¤£à¥€|शà¥à¤°à¥‡à¤£à¤¿à¤¯à¥‹à¤‚}} में शà¥à¤°à¥‡à¤£à¥€à¤¬à¤¦à¥à¤§ है:',
'edittools' => '<!-- यहाठदिया हà¥à¤† पाठ संपादन और अपलोड फ़ॉरà¥à¤® के नीचे दरà¥à¤¶à¤¾à¤¯à¤¾ जायेगा। -->',
-'nocreatetitle' => 'लेख निरà¥à¤®à¤¾à¤£ में पà¥à¤°à¤¤à¤¿à¤¬à¤‚ध',
'nocreatetext' => '{{SITENAME}} पर नये पृषà¥à¤  बनाने के लिये मनाई की गई है।
आप पीछे जाकर किसी वरà¥à¤¤à¤®à¤¾à¤¨ पृषà¥à¤  को संपादित कर सकते हैं, अथवा [[Special:UserLogin|नया ख़ाता खोलें / पà¥à¤°à¤µà¥‡à¤¶ करें]] ।',
'nocreate-loggedin' => 'नये पृषà¥à¤  बनाने का आपको अधिकार नहीं है।',
@@ -957,6 +965,10 @@ $2
यह पहले से मौजूद है।',
'defaultmessagetext' => 'संदेश का डिफ़ॉलà¥à¤Ÿ पाठ',
+# Content models
+'content-model-wikitext' => 'विकिटेकà¥à¤¸à¥à¤Ÿ',
+'content-model-javascript' => 'जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ',
+
# Parser/template warnings
'expensive-parserfunction-warning' => "'''चेतावनी:''' इस पृषà¥à¤  पर बहà¥à¤¤ अधिक संखà¥à¤¯à¤¾ में कीमती पारà¥à¤¸à¤° फ़ंकà¥à¤¶à¤¨à¥‹à¤‚ का पà¥à¤°à¤¯à¥‹à¤— किया गया है।
@@ -1464,12 +1476,13 @@ HTML टैग की जाà¤à¤š करें।',
'right-sendemail' => 'अनà¥à¤¯ सदसà¥à¤¯à¥‹à¤‚ को ई-मेल भेजें',
'right-passwordreset' => 'कूटशबà¥à¤¦ रीसेट ई-मेल देखें',
+# Special:Log/newusers
+'newuserlogpage' => 'सदसà¥à¤¯ खाता निरà¥à¤®à¤¾à¤£ लॉग',
+'newuserlogpagetext' => 'यह सदसà¥à¤¯ खातों के निरà¥à¤®à¤¾à¤£ का लॉग है।',
+
# User rights log
'rightslog' => 'सदसà¥à¤¯ अधिकार सूची',
'rightslogtext' => 'यह सदसà¥à¤¯ अधिकारों में हà¥à¤ बदलावों की सूची है।',
-'rightslogentry' => '$1 की समूह सदसà¥à¤¯à¤¤à¤¾ $2 से $3 को बदली',
-'rightslogentry-autopromote' => 'सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से $2 से $3 को पदोनà¥à¤¨à¤¤ हà¥à¤† था',
-'rightsnone' => '(कोई नहीं)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'इस पृषà¥à¤  को पढ़ने',
@@ -2102,7 +2115,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'linksearch-ok' => 'खोजें',
'linksearch-text' => '"*.wikipedia.org" जैसे वाईलà¥à¤¡-कारà¥à¤¡à¥à¤¸ पà¥à¤°à¤¯à¥‹à¤— किये जा सकते हैं।
कम-से-कम ".org" जैसे किसी top-level डोमेन की आवशà¥à¤¯à¤•à¤¤à¤¾ है।<br />
-सà¥à¤µà¥€à¤•à¤¾à¤°à¥à¤¯ पà¥à¤°à¥‹à¤Ÿà¥‹à¤•à¥‰à¤²: <code>$1</code> (इनमें से कोई भी अपनी खोज में न जोड़ें)',
+सà¥à¤µà¥€à¤•à¤¾à¤°à¥à¤¯ {{PLURAL:$2|पà¥à¤°à¥‹à¤Ÿà¥‹à¤•à¥‰à¤²}}: <code>$1</code> (यदि कोई पà¥à¤°à¥‹à¤Ÿà¥‹à¤•à¥‰à¤² ना दिया जाठतो http:// का पà¥à¤°à¤¯à¥‹à¤— किया जाता है)',
'linksearch-line' => '$2 में से $1 जà¥à¤¡à¤¾ हà¥à¤† हैं',
'linksearch-error' => 'वाईलà¥à¤¡à¤•à¤¾à¤°à¥à¤¡à¥à¤¸ होसà¥à¤Ÿà¤¨à¤¾à¤® के सिरà¥à¤« शà¥à¤°à¥‚ में आ सकते हैं।',
@@ -2121,10 +2134,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'activeusers-hidesysops' => 'पà¥à¤°à¤¬à¤‚धक छà¥à¤ªà¤¾à¤à¤',
'activeusers-noresult' => 'कोई सदसà¥à¤¯ नहीं मिले।',
-# Special:Log/newusers
-'newuserlogpage' => 'सदसà¥à¤¯ खाता निरà¥à¤®à¤¾à¤£ लॉग',
-'newuserlogpagetext' => 'यह सदसà¥à¤¯ खातों के निरà¥à¤®à¤¾à¤£ का लॉग है।',
-
# Special:ListGroupRights
'listgrouprights' => 'सदसà¥à¤¯ समूह अधिकार',
'listgrouprights-summary' => 'नीचे इसे विकि के लिठपरिभाषित सदसà¥à¤¯ समूहों की सूची है, साथ में हर समूह से जà¥à¤¡à¤¼à¥‡ अधिकार भी वरà¥à¤£à¤¿à¤¤ हैं।
@@ -2219,20 +2228,23 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
'enotif_mailer' => '{{SITENAME}} सूचना इ-मेल करà¥à¤¤à¤¾',
'enotif_reset' => 'सभी पृषà¥à¤  देखे हà¥à¤ दरà¥à¤¶à¤¾à¤à¤',
-'enotif_newpagetext' => 'यह नया पृषà¥à¤  है।',
'enotif_impersonal_salutation' => '{{SITENAME}} सदसà¥à¤¯',
-'changed' => 'परिवरà¥à¤¤à¤¿à¤¤ किया',
-'created' => 'बनाया',
-'enotif_subject' => '{{SITENAME}} पृषà¥à¤  $PAGETITLE $PAGEEDITOR ने $CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}} पृषà¥à¤  $1 को {{gender:$2|$2}} ने हटा दिया है',
+'enotif_subject_created' => '{{SITENAME}} पृषà¥à¤  $1 को {{gender:$2|$2}} ने बना दिया है',
+'enotif_subject_moved' => '{{SITENAME}} पृषà¥à¤  $1 को {{gender:$2|$2}} ने सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित कर दिया है',
+'enotif_subject_restored' => '{{SITENAME}} पृषà¥à¤  $1 को {{gender:$2|$2}} ने पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ कर दिया है',
+'enotif_subject_changed' => '{{SITENAME}} पृषà¥à¤  $1 को {{gender:$2|$2}} ने परिवरà¥à¤¤à¤¿à¤¤ किया है',
+'enotif_body_intro_deleted' => '{{SITENAME}} पृषà¥à¤  $1 को {{gender:$2|$2}} ने $PAGEEDITDATE को हटा दिया है, देखें $3।',
+'enotif_body_intro_created' => '{{SITENAME}} पृषà¥à¤  $1 को {{gender:$2|$2}} ने $PAGEEDITDATE को बनाया है, वरà¥à¤¤à¤®à¤¾à¤¨ अवतरण के लिठ$3 देखें।',
+'enotif_body_intro_moved' => '{{SITENAME}} पृषà¥à¤  $1 को {{gender:$2|$2}} ने $PAGEEDITDATE को सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित किया है, वरà¥à¤¤à¤®à¤¾à¤¨ अवतरण के लिठ$3 देखें।',
+'enotif_body_intro_restored' => '{{SITENAME}} पृषà¥à¤  $1 को {{gender:$2|$2}} ने $PAGEEDITDATE को पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ किया है, वरà¥à¤¤à¤®à¤¾à¤¨ अवतरण के लिठ$3 देखें।',
+'enotif_body_intro_changed' => '{{SITENAME}} पृषà¥à¤  $1 को {{gender:$2|$2}} ने $PAGEEDITDATE को परिवरà¥à¤¤à¤¿à¤¤ किया है, वरà¥à¤¤à¤®à¤¾à¤¨ अवतरण के लिठ$3 देखें।',
'enotif_lastvisited' => 'आपकी आखिरी भेंट के बाद हà¥à¤ बदलाव देखने के लिये $1 देखें।',
'enotif_lastdiff' => 'इस बदलाव को देखने के लिये $1 देखें।',
'enotif_anon_editor' => 'अनामक सदसà¥à¤¯ $1',
'enotif_body' => 'पà¥à¤°à¤¿à¤¯ $WATCHINGUSERNAME जी,
-
-{{SITENAME}} का $PAGETITLE पृषà¥à¤  $PAGEEDITDATE को $PAGEEDITOR दà¥à¤µà¤¾à¤°à¤¾ $CHANGEDORCREATED गया, कृपया ताज़े अवतरण के लिठ$PAGETITLE_URL देखें।
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
समà¥à¤ªà¤¾à¤¦à¤¨ सारांश: $PAGESUMMARY $PAGEMINOREDIT
@@ -2257,6 +2269,8 @@ $UNWATCHURL
राय देने या अधिक सहायता पाने के लिà¤:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'बनाया',
+'changed' => 'परिवरà¥à¤¤à¤¿à¤¤ किया',
# Delete
'deletepage' => 'पृषà¥à¤  हटाà¤à¤',
@@ -2414,8 +2428,8 @@ $2 दà¥à¤µà¤¾à¤°à¤¾ संपादित अनà¥à¤¤à¤¿à¤® अवतरण à
'undeletedrevisions' => '{{PLURAL:$1|à¤à¤• रूपानà¥à¤¤à¤° वापस लाया गया|$1 रूपानà¥à¤¤à¤° वापस लाये गये}} है',
'undeletedrevisions-files' => '{{PLURAL:$1|1 अवतरण|$1 अवतरण}} और {{PLURAL:$2|1 फ़ाईल|$2 फ़ाइलें}} पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ कर दियें',
'undeletedfiles' => '{{PLURAL:$1|1 फ़ाईल|$1 फ़ाईलें}} पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤',
-'cannotundelete' => 'पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ नहीं कर सकें;
-किसी और ने पहले ही पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ कर दिया हों।',
+'cannotundelete' => 'पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ नहीं कर सके:
+$1',
'undeletedpage' => "'''$1 को पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ कर दिया गया है'''
हाल में हटाये गये तथा पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ किये गठपनà¥à¤¨à¥‹à¤‚ की जानकारी के लिये [[Special:Log/delete|हटाने की लॉग]] देखें।",
@@ -2447,7 +2461,7 @@ $1',
'blanknamespace' => '(मà¥à¤–à¥à¤¯)',
# Contributions
-'contributions' => 'सदसà¥à¤¯ योगदान',
+'contributions' => '{{GENDER:$1|सदसà¥à¤¯}} योगदान',
'contributions-title' => '$1 के योगदान',
'mycontris' => 'योगदान',
'contribsub2' => '$1 के लिये ($2)',
@@ -2963,6 +2977,7 @@ $1 को बाधà¥à¤¯ करने का कारण है: "$2"',
'pageinfo-default-sort' => 'डिफ़ॉलà¥à¤Ÿ सॉरà¥à¤Ÿ की',
'pageinfo-length' => 'पृषà¥à¤  आकार (बाइटà¥à¤¸ में)',
'pageinfo-article-id' => 'पृषà¥à¤  आइ॰डी',
+'pageinfo-language' => 'पृषà¥à¤  सामगà¥à¤°à¥€ भाषा',
'pageinfo-views' => 'दरà¥à¤¶à¤¾à¤µ की संखà¥à¤¯à¤¾',
'pageinfo-watchers' => 'पृषà¥à¤  पर नज़र रखने वालों की संखà¥à¤¯à¤¾',
'pageinfo-redirects-name' => 'इस पृषà¥à¤  को पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶',
@@ -2977,6 +2992,16 @@ $1 को बाधà¥à¤¯ करने का कारण है: "$2"',
'pageinfo-magic-words' => 'जादà¥à¤ˆ {{PLURAL:$1|शबà¥à¤¦}} ($1)',
'pageinfo-hidden-categories' => 'छà¥à¤ªà¥€ {{PLURAL:$1|शà¥à¤°à¥‡à¤£à¥€|शà¥à¤°à¥‡à¤£à¤¿à¤¯à¤¾à¤}} ($1)',
'pageinfo-templates' => 'पà¥à¤°à¤¯à¥à¤•à¥à¤¤ {{PLURAL:$1|साà¤à¤šà¤¾|साà¤à¤šà¥‡}} ($1)',
+'pageinfo-toolboxlink' => 'इस पृषà¥à¤  पर जानकारी',
+'pageinfo-redirectsto' => 'पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ लकà¥à¤·à¥à¤¯',
+'pageinfo-redirectsto-info' => 'जानकारी',
+'pageinfo-contentpage' => 'सामगà¥à¤°à¥€ पृषà¥à¤ à¥‹à¤‚ में गिना जाता है',
+'pageinfo-contentpage-yes' => 'हाà¤',
+'pageinfo-protect-cascading-yes' => 'हाà¤',
+'pageinfo-category-info' => 'शà¥à¤°à¥‡à¤£à¥€ जानकारी',
+'pageinfo-category-pages' => 'पृषà¥à¤  संखà¥à¤¯à¤¾',
+'pageinfo-category-subcats' => 'उपशà¥à¤°à¥‡à¤£à¤¿à¤¯à¥‹à¤‚ की संखà¥à¤¯à¤¾',
+'pageinfo-category-files' => 'फ़ाइलों की संखà¥à¤¯à¤¾',
# Patrolling
'markaspatrolleddiff' => 'देख लिया à¤à¤¸à¤¾ मारà¥à¤• करें',
@@ -2988,6 +3013,8 @@ $1 को बाधà¥à¤¯ करने का कारण है: "$2"',
'markedaspatrollederror' => 'देख लिया à¤à¤¸à¤¾ मारà¥à¤• नहीं कर पायें',
'markedaspatrollederrortext' => 'नजर रखने के लिये आपको à¤à¤• अवतरणको चà¥à¤¨à¤¨à¤¾ होगा।',
'markedaspatrollederror-noautopatrol' => 'आप खà¥à¤¦ अपने बदलावोंपर नजर नहीं रख सकतें हैं।',
+'markedaspatrollednotify' => '$1 पृषà¥à¤  में किया गया ये बदलाव जाà¤à¤šà¤¾ हà¥à¤† चिनà¥à¤¹à¤¿à¤¤ कर दिया गया है।',
+'markedaspatrollederrornotify' => 'जाà¤à¤šà¤¾ हà¥à¤† चिनà¥à¤¹à¤¿à¤¤ करना असफल रहा।',
# Patrol log
'patrol-log-page' => 'नजर रखनेकी सूची',
@@ -3046,7 +3073,9 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
'hours' => '{{PLURAL:$1|$1 hour|$1 hours}}',
'days' => '{{PLURAL:$1|$1 day|$1 days}}',
+'months' => '{{PLURAL:$1|महीना|महीने}}',
'ago' => '$1 पहले',
+'just-now' => 'अभी-अभी',
# Bad image list
'bad_image_list' => 'पà¥à¤°à¤¾à¤°à¥‚प इस पà¥à¤°à¤•à¤¾à¤° है:
@@ -3825,7 +3854,10 @@ $5
'logentry-newusers-create' => 'सदसà¥à¤¯ खाता $1 बनाया गया',
'logentry-newusers-create2' => 'सदसà¥à¤¯ खाता $3 $1 दà¥à¤µà¤¾à¤°à¤¾ बनाया गया था',
'logentry-newusers-autocreate' => 'खाते $1 सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से बनाया गया',
-'newuserlog-byemail' => 'कूटशबà¥à¤¦ इ-मेल दà¥à¤µà¤¾à¤°à¤¾ भेजा गया हैं',
+'logentry-rights-rights' => '$1 ने $3 के सदसà¥à¤¯ समूह $4 से बदलकर $5 किये',
+'logentry-rights-rights-legacy' => '$1 ने $3 के सदसà¥à¤¯ समूह बदले',
+'logentry-rights-autopromote' => '$1 के सदसà¥à¤¯ समूह सà¥à¤µà¤¤à¤ƒ $4 से बदलकर $5 किये गà¤',
+'rightsnone' => '(कोई नहीं)',
# Feedback
'feedback-bugornote' => 'यदि आप किसी तकनीकी परेशानी को विसà¥à¤¤à¤¾à¤° से समà¤à¤¾à¤¨à¥‡ के लिये तैयार हैं तो कृपया [$1 बग फ़ाइल करें]।
diff --git a/languages/messages/MessagesHif_latn.php b/languages/messages/MessagesHif_latn.php
index 0f781ef5..0925fce7 100644
--- a/languages/messages/MessagesHif_latn.php
+++ b/languages/messages/MessagesHif_latn.php
@@ -179,7 +179,6 @@ $messages = array(
'qbbrowse' => 'Browse karo',
'qbedit' => 'Badlo',
'qbpageoptions' => 'Ii panna',
-'qbpageinfo' => 'Vishay',
'qbmyoptions' => 'Hamar panna',
'qbspecialpages' => 'Khaas panna',
'faq' => 'Sab time puchhe waala sawal',
@@ -202,6 +201,7 @@ $messages = array(
'namespaces' => 'Naam',
'variants' => 'Antar',
+'navigation-heading' => 'Navigate kare waala menu',
'errorpagetitle' => 'Galti',
'returnto' => '$1 pe lauto.',
'tagline' => '{{SITENAME}} se',
@@ -441,10 +441,10 @@ Jon administrator iske lock karis hae, koi kaaran nai diis hae: "$3"',
# Login and logout pages
'logouttext' => "'''Aap abhi logged out hai.'''
-Aap bina naam ke {{SITENAME}} ke kaam me lae sakta hai, nai to aap wahi sadasya ke naam se nai to duusra sadasya ke naam se [[Special:UserLogin|log in kare sakta hai]].
+Aap bina naam ke {{SITENAME}} ke kaam me lae sakta hai, nai to aap wahi sadasya ke naam se nai to duusra sadasya ke naam se <span class='plainlinks'>[$1 log in kare sakta hai]</span>.
Yaad rakhna ki kuch panna wahi rakam se dekhai jaise ki aap log in bhaya hai, jab tak ki browser ke cache safaa nai hoe jaae.",
-'welcomecreation' => '== Swagat, $1! ==
-Aap ke account banae dewa gais hai.
+'welcomeuser' => 'Swagat, $1!',
+'welcomecreation-msg' => 'Aap ke account banae dewa gais hai.
Aapan [[Special:Preferences|{{SITENAME}} pasand]] ke badle nai bhulna.',
'yourname' => 'Username:',
'yourpassword' => 'Password:',
@@ -468,7 +468,7 @@ Aapan [[Special:Preferences|{{SITENAME}} pasand]] ke badle nai bhulna.',
'gotaccount' => "Aap ke pas pahile se account hai ki nai? '''$1'''.",
'gotaccountlink' => 'Log in',
'userlogin-resetlink' => 'Ka aap aapan login kare waala jaankari ke bhulae gaya hae?',
-'createaccountmail' => 'e-mail se',
+'createaccountmail' => 'Ek temporary password ke kaam me laao aur iske niche dekhawa gais Email pe bhej do',
'createaccountreason' => 'Kaaran:',
'badretype' => 'Jon duuno password aap likha hai uu ek rakam nai hae.',
'userexists' => 'Ii sadasya ke naam aur koi ke hae.
@@ -543,6 +543,7 @@ Thora deri baad fir se kosis karna.',
# Email sending
'php-mail-error-unknown' => 'PHP ke mail() function me koi anjaan kharaabi hae',
'user-mail-no-addy' => 'Bina e-mail address rahe pe bhi e-mail bheje ke kosis karaa gais hae.',
+'user-mail-no-body' => 'Ek khaali, nai to kaafi chhota email bheje ke kosis kara rahaa.',
# Change password dialog
'resetpass' => 'Password ke badlo',
@@ -601,6 +602,7 @@ Kuchh din ke khatir password: $2',
'changeemail-oldemail' => 'Abhi ke E-mail address:',
'changeemail-newemail' => 'Nawaa E-mail address:',
'changeemail-none' => '(kuchh nai)',
+'changeemail-password' => 'Aap ke {{SITENAME}} password:',
'changeemail-submit' => 'E-mail badlo',
'changeemail-cancel' => 'Kaat do',
@@ -787,7 +789,6 @@ Aap ke jaankari ke khatir sab se nawaa suchi niche dewa gais hae:",
'template-semiprotected' => '(aadha-surakchhit)',
'hiddencategories' => 'Ii panna {{PLURAL:$1|1 hidden category|$1 hidden categories}} ke member hai:',
'edittools' => '<!-- Hian ke text edit aur upload forms ke niche dekhai. -->',
-'nocreatetitle' => 'Panna ke banae pe rukawat hai',
'nocreatetext' => '{{SITENAME}} me nawaa panna banae ke rukawat hai.
Aap pichhe jaae ke, ek panna jon hai, ke sampadan kare sakta hai, nai to [[Special:UserLogin|log in or create an account]].',
'nocreate-loggedin' => 'Aap ke nawaa panna banaae ke ijaajat nai hai.',
@@ -812,6 +813,15 @@ Janae hai ki iske koi mitae dii hai.',
'edit-already-exists' => 'Nawaa panna nai banae sakaa hai.
Ii naam ke panna abhi hai.',
'defaultmessagetext' => 'Default message text',
+'content-failed-to-parse' => '$1 model ke khatir $2 ke parse nai kare sakaa hae: $3',
+'invalid-content-data' => 'Panna me likha gais chij right nai hae',
+'content-not-allowed-here' => 'Panna [[$2]] me "$1" likhe ke ijaajat nai hae',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'plain text',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Chetauni''': Ii panna me bahut jaada expensive parser function calls hai.
@@ -1179,9 +1189,9 @@ Iske pahile jaise nai karaa jaawe sake hai.',
'prefs-emailconfirm-label' => 'E-mail ke confirm karaa jaawe hai:',
'prefs-textboxsize' => 'editing window ke size',
'youremail' => 'E-mail:',
-'username' => 'Sadasya ke naam:',
-'uid' => 'Sadasya ke pahchaan:',
-'prefs-memberingroups' => '{{PLURAL:$1|group|groups}} ke member:',
+'username' => '{{GENDER:$1|Sadasya ke naam}}:',
+'uid' => '{{GENDER:$1|Sadasya}} ID:',
+'prefs-memberingroups' => '{{PLURAL:$1|group|groups}} ke {{GENDER:$2|Member}}:',
'prefs-registration' => 'Registration kare ke time:',
'yourrealname' => 'Asli naam:',
'yourlanguage' => 'Bhasa:',
@@ -1329,12 +1339,13 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
'right-sendemail' => 'Duusra sadasya ke lage e-mail bhejo',
'right-passwordreset' => 'Password ke badle waala e-mail ke dekho',
+# Special:Log/newusers
+'newuserlogpage' => 'Sadasya ke banae waala log',
+'newuserlogpagetext' => 'Ii sadasya ke banae waala log hai.',
+
# User rights log
'rightslog' => 'Sadasya adhikar suchi',
'rightslogtext' => 'Ii sadasya ke adhikar ke badlao ke suchi hai.',
-'rightslogentry' => '$1 ke group ke membership ke $2 se $3 badal dia hai',
-'rightslogentry-autopromote' => 'ke apne se $2 se $3 ke promotion dewa gais',
-'rightsnone' => '(koi nai hai)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ii panna ke parrho',
@@ -1565,6 +1576,7 @@ Agar jo problem fir nai khatam hoe tab [[Special:ListUsers/sysop|administrator]]
'backend-fail-notsame' => 'Ek duusra file $1 pe hae.',
'backend-fail-invalidpath' => '$1, valid storage path nai hae.',
'backend-fail-delete' => 'File $1 ke nai mitae sakaa hae.',
+'backend-fail-describe' => '"$1" ke metadata ke badle nai sakaa hae.',
'backend-fail-alreadyexists' => '$1 naam ke ek file abhi hae.',
'backend-fail-store' => '$2 pe file $1 ke nai bachae sakaa hae.',
'backend-fail-copy' => 'File $1 ke $2 me nai copy kare sakaa hae',
@@ -1954,8 +1966,9 @@ Is me ek nai to jaada akchhar hai jiske title me nai kaam me lawa jaae sake hai.
'linksearch-pat' => 'Khoje ke pattern:',
'linksearch-ns' => 'Namespace:',
'linksearch-ok' => 'Khojo',
-'linksearch-text' => 'Wildcard jaise ki "*.wikipedia.org" ke kaam me lawa jaae sake hai.<br />
-Support karaa gais protocol: <code>$1</code>',
+'linksearch-text' => 'Wildcard jaise ki "*.wikipedia.org" ke kaam me lawa jaae sake hai.
+Iske khatir ek top-level domain, jaise ki "*.org" ke jaruri hae.<br />
+Support karaa gais protocol: <code>$1</code> (defaults to http:// if no protocol is specified).',
'linksearch-line' => '$1, $2 se jurraa hai',
'linksearch-error' => 'Wildcards khaali hostname ke suruu me hoe ke chaahi.',
@@ -1974,10 +1987,6 @@ Support karaa gais protocol: <code>$1</code>',
'activeusers-hidesysops' => 'Administrator log ke lukao',
'activeusers-noresult' => 'koi sadasya ke pawa nai gais hai.',
-# Special:Log/newusers
-'newuserlogpage' => 'Sadasya ke banae waala log',
-'newuserlogpagetext' => 'Ii sadasya ke banae waala log hai.',
-
# Special:ListGroupRights
'listgrouprights' => 'Sadasya ke group adhikar',
'listgrouprights-summary' => 'Niche likha hai ek suchi hai groups ke jon ki ii wiki me defined hai, aapan associated access rights ke saathe
@@ -2072,27 +2081,32 @@ Ii panna ke aage ke badlao aur usse jurra baat waala panna ki suchi hian pe hae.
'enotif_mailer' => '{{SITENAME}} Suchna de waala Mailer',
'enotif_reset' => 'Sab panna ke visited mark karo',
-'enotif_newpagetext' => 'Ii ek nawaa panna hai.',
'enotif_impersonal_salutation' => '{{SITENAME}} sadasya',
-'changed' => 'badal dewa gais hai',
-'created' => 'banae dewa gais hai',
-'enotif_subject' => '$PAGEEDITOR {{SITENAME}} panna $PAGETITLE ke badal $CHANGEDORCREATED diis hai',
+'enotif_subject_deleted' => '{{gender:$2|$2}} {{SITENAME}} panna $1 ke mitais hae',
+'enotif_subject_created' => '{{gender:$2|$2}}, {{SITENAME}} panna $1 ke banais hae',
+'enotif_subject_moved' => '{{gender:$2|$2}}, {{SITENAME}} panna $1 ke hatais hae',
+'enotif_subject_restored' => '{{gender:$2|$2}}, {{SITENAME}} panna $1 ke restore karis hae',
+'enotif_subject_changed' => '{{gender:$2|$2}}, {{SITENAME}} panna $1 ke badlis hae',
+'enotif_body_intro_deleted' => '{{gender:$2|$2}}, {{SITENAME}} panna $1 ke $PAGEEDITDATE ke roj mitais hae, $3 dekho.',
+'enotif_body_intro_created' => '{{gender:$2|$2}}, {{SITENAME}} panna $1 ke $PAGEEDITDATE ke roj banais hae, abhi ke revision ke khatir $3 ke dekho.',
+'enotif_body_intro_moved' => '{{gender:$2|$2}}, {{SITENAME}} panna $1 ke $PAGEEDITDATE ke roj hatais hae, abhi ke revision ke khatir $3 ke dekho.',
+'enotif_body_intro_restored' => '{{gender:$2|$2}}, {{SITENAME}} panna $1 ke $PAGEEDITDATE ke roj restore karis hae, abhi ke revision ke khatir $3 ke dekho.',
+'enotif_body_intro_changed' => '{{gender:$2|$2}}, {{SITENAME}} panna $1 ke $PAGEEDITDATE ke roj badlis hae, abhi ke revision ke khatir $3 ke dekho.',
'enotif_lastvisited' => 'Aap ke pichhla visit ke baad ke badlao ke khatir $1 ke dekho.',
'enotif_lastdiff' => 'Ii badlao ke dekhe ke khatir $1 ke dekho.',
'enotif_anon_editor' => 'bina naam ke sadasya $1',
'enotif_body' => 'Priye $WATCHINGUSERNAME,
+$PAGEINTRO $NEWPAGE
-{{SITENAME}} panna $PAGETITLE ke $CHANGEDORCREATED kar dewa gais hai $PAGEEDITDATE ke din, $PAGEEDITOR ke dwara, abhi ke version ke khatir $PAGETITLE_URL ke dekho.
-
-$NEWPAGE
+Editor\'s summary: $PAGESUMMARY $PAGEMINOREDIT
-Sampadak ke summary: $PAGESUMMARY $PAGEMINOREDIT
-
-Editor ke contact karo:
+Contact the editor:
mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
+
+
Aur koi notifications nai rahii, kahe ki koi aur badlao hoe sake hai, jab talak aap ii panna ke visit nai karta hai.
Aap aapan dhyan suchi me sab dhyan me rakha gais panna pe notification flags ke reset kare sakta hai.
@@ -2112,6 +2126,8 @@ $UNWATCHURL
Aapan bichar de ke khatir aur aage ke sahaeta:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'banae dewa gais hai',
+'changed' => 'badal dewa gais hai',
# Delete
'deletepage' => 'Pana ke delete karo',
@@ -2272,8 +2288,8 @@ Sait aap ke kharaab link hoi, nai to badlao ke sait pahile jaise kar dewa gais h
'undeletedrevisions' => '{{PLURAL:$1|1 badlao|$1 badlao}} ke pahile jaise kar dewa gais hai',
'undeletedrevisions-files' => '{{PLURAL:$1|1 badlao|$1 badlao}} aur {{PLURAL:$2|1 file|$2 files}} ke pahile jaise kar dewa gais hai',
'undeletedfiles' => '{{PLURAL:$1|1 file|$1 files}} ke pahile jaise kar dewa gais hai',
-'cannotundelete' => 'Pahile jaise nai kare sakaa;
-saait aur koi panna ke pahile jaise kar diis hai.',
+'cannotundelete' => 'Undelete failed:
+$1',
'undeletedpage' => "'''$1 ke pahile jaise kar dewa gais hai'''
Nawaa mitawa gais aur badlao ke ulta karaa gais panna ke dekhe ke khatir [[Special:Log/delete|deletion log]] ke dekho.",
@@ -2305,7 +2321,7 @@ $1',
'blanknamespace' => '(Pahila)',
# Contributions
-'contributions' => 'Sadasya ke yogdaan',
+'contributions' => '{{GENDER:$1|Sadasya}} ke yogdaan',
'contributions-title' => '$1 ke yogdaan',
'mycontris' => 'Yogdaan',
'contribsub2' => '$1 ($2) ke khatir',
@@ -2583,6 +2599,7 @@ panna ke wahi ke uppar nai save karaa jaae sake hai.',
'immobile-target-namespace-iw' => 'Interwiki link panna ke hatae ke valid target nai hai.',
'immobile-source-page' => 'Ii panna ke naam nai badla jaawe sake hai.',
'immobile-target-page' => 'Uu jagah pe nai move kare sakta hai.',
+'bad-target-model' => 'Maange waala destination, different content model ke use kare hae. $1 se $2 convert nai kare saktaa hae',
'imagenocrossnamespace' => 'File ke non-file namespace me hatae ke nai kare sakta hai',
'nonfile-cannot-move-to-file' => 'Ek chij jon ki file nai hae ke file waala jagha pe nai kare sakta hae',
'imagetypemismatch' => 'Nawaa file extension uske type se nai match kare hai.',
@@ -2699,6 +2716,7 @@ Meharbani kar ke, fir se kosis karo.',
'import-error-interwiki' => 'Panna "$1" ke import nai kara gais kaahe ki ii panna ke external linking (interwiki) ke khatir reserve karaa gais hae.',
'import-error-special' => 'Panna "$1" ke import nai karaa gais hae kaaheki ii ek khaas namespace hae jisme panna nai banawa jaae sake hae.',
'import-error-invalid' => 'Panna "$1" ke import nai karaa gais hae kaaheki iske naam kharaab hae.',
+'import-error-unserialize' => 'Panna "$1" ke $2 badlao ke unserialize kare nai sakaa hae. Ii badlao me content model $3 serialized as $4 ke kaam me lawa gais hae.',
'import-options-wrong' => 'Galat {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Derwa gais root panna ek kharaab title hae',
'import-rootpage-nosubpage' => 'Root panna ke namespace "$1" sub panna ke nai allow kare hae.',
@@ -2827,11 +2845,13 @@ Ii saait ii kaaran se hoi ki panna ke ek jorr koi blacklisted external site se h
'pageinfo-default-sort' => 'Default sort key',
'pageinfo-length' => 'Panna ke lambai (bytes me)',
'pageinfo-article-id' => 'Panna ke ID',
+'pageinfo-language' => 'Panna ke bhasa',
'pageinfo-robot-policy' => 'Search engine ke status',
'pageinfo-robot-index' => 'Indexable',
'pageinfo-robot-noindex' => 'Indexable nai hae',
'pageinfo-views' => 'Ketna dafe dekha gais hae',
'pageinfo-watchers' => 'Ketnaa jane panna ke dekhe hae',
+'pageinfo-few-watchers' => '$1 {{PLURAL:$1|watcher|watchers}} se kamtii log hae',
'pageinfo-redirects-name' => 'Ii panna pe redirect karo',
'pageinfo-subpages-name' => 'Ii panna ke subpage',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})',
@@ -2846,6 +2866,14 @@ Ii saait ii kaaran se hoi ki panna ke ek jorr koi blacklisted external site se h
'pageinfo-magic-words' => 'Magic {{PLURAL:$1|sabd}} ($1)',
'pageinfo-hidden-categories' => 'Lukawa gais {{PLURAL:$1|category|categories}} ($1)',
'pageinfo-templates' => 'Transcluded {{PLURAL:$1|template|templates}} ($1)',
+'pageinfo-toolboxlink' => 'Panna ke jaankari',
+'pageinfo-redirectsto' => 'Redirects to',
+'pageinfo-redirectsto-info' => 'jaankari',
+'pageinfo-contentpage' => 'Iske content panna jaise gina gais hae',
+'pageinfo-contentpage-yes' => 'Haan',
+'pageinfo-protect-cascading' => 'Protections hian se cascade hoe hae',
+'pageinfo-protect-cascading-yes' => 'Haan',
+'pageinfo-protect-cascading-from' => 'Protections isse cascade hoe hae',
# Patrolling
'markaspatrolleddiff' => 'Mark karo ke pahraa dewa jaawe hai',
@@ -2857,6 +2885,8 @@ Ii saait ii kaaran se hoi ki panna ke ek jorr koi blacklisted external site se h
'markedaspatrollederror' => 'Ispe pahraa nai dewa jaawe sake hai',
'markedaspatrollederrortext' => 'Aap ke ek badlao ke mark kare ke chaahi jispe pahraa dewa jaawe sake hai',
'markedaspatrollederror-noautopatrol' => 'Aap ke aapan badlao pe pahraa dewe ke ijajat nai hai.',
+'markedaspatrollednotify' => '$1 ke ii badalo ke patrolled mark karaa gais hae',
+'markedaspatrollederrornotify' => 'Patrolled mark kare ke kosis fail hoe gais hae.',
# Patrol log
'patrol-log-page' => 'Pahraa de waala suchi',
@@ -2890,6 +2920,7 @@ Iske execute kare se aap ke system me garrbarr hoe sake hae.",
'file-nohires' => 'Aur achchha resolution nai hai.',
'svg-long-desc' => 'SVG file, naam kare ke khatir $1 × $2 pixels, file size: $3',
'svg-long-desc-animated' => 'Animated SVG file, naam kare ke khatir $1 × $2 pixels, file size: $3',
+'svg-long-error' => 'SCG file valid nai hae: $1',
'show-big-image' => 'Puura resolution',
'show-big-image-preview' => 'Ii preview ke size: $1',
'show-big-image-other' => 'Duusra {{PLURAL:$2|resolution|resolutions}}: $1',
@@ -2920,6 +2951,7 @@ Iske execute kare se aap ke system me garrbarr hoe sake hae.",
'hours' => '{{PLURAL:$1|$1 ghanta}}',
'days' => '{{PLURAL:$1|$1 din}}',
'ago' => '$1 pahile',
+'just-now' => 'ekdam abhi',
# Bad image list
'bad_image_list' => 'Format ii rakam hai:
@@ -3209,7 +3241,10 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
# New logging system
'revdelete-restricted' => 'sysops pe llabu restrictions',
'revdelete-unrestricted' => 'sysops se hatawa gae rukawat',
-'newuserlog-byemail' => 'password ke e-mail se bheja gais hai',
+'logentry-rights-rights' => '$1 $3 ke group ke membership ke $4 se badal ke $5 kar dia hae',
+'logentry-rights-rights-legacy' => '$1 $3 ke group membership ke badal dia hae',
+'logentry-rights-autopromote' => '$1 ke apne se $2 se $3 ke promotion dewa gais',
+'rightsnone' => '(koi nai hai)',
# Search suggestions
'searchsuggest-search' => 'Khojo',
diff --git a/languages/messages/MessagesHil.php b/languages/messages/MessagesHil.php
index 769343c7..7b38419a 100644
--- a/languages/messages/MessagesHil.php
+++ b/languages/messages/MessagesHil.php
@@ -151,6 +151,7 @@ $messages = array(
'newwindow' => '(gabukas sa bag-o nga bintana)',
'cancel' => 'Kanselahon',
'moredotdotdot' => 'Madamo pa...',
+'morenotlisted' => 'Madamu pa ang wala nalista...',
'mypage' => 'Akon Panid',
'mytalk' => 'Paghisayranay',
'anontalk' => 'Paghisayranay sang sining IP address',
@@ -162,7 +163,6 @@ $messages = array(
'qbbrowse' => 'Magbasa-basa',
'qbedit' => 'Ilisan',
'qbpageoptions' => 'Ining panid',
-'qbpageinfo' => 'Kahulugan/Konteksto',
'qbmyoptions' => 'Akon mga panid',
'qbspecialpages' => 'Pinasahi nga mga panid',
'faq' => 'Mga masami pamangkoton',
@@ -185,6 +185,7 @@ $messages = array(
'namespaces' => 'Ngalan-espasyo',
'variants' => 'Mga nagkalain-lain',
+'navigation-heading' => 'Menu sang nabigasyon',
'errorpagetitle' => 'Sala/Eror',
'returnto' => 'Balik sa $1.',
'tagline' => 'Halin sa {{SITENAME}}',
@@ -428,11 +429,11 @@ Ang administrador nga nag-kandado sini naghatag sang paathag nga: "$3".',
# Login and logout pages
'logouttext' => "'''Naka-guha ka na.'''
-Makapadayon ka sa gihapon sa paggamit sang {{SITENAME}} nga indi makilal-an, ukon mahimo ka man [[Special:UserLogin|magsulod liwat]] bilang amo sa gihapon ukon lain nga nga manug-gamit.
+Makapadayon ka sa gihapon sa paggamit sang {{SITENAME}} nga indi makilal-an, ukon mahimo ka man <span class='plainlinks'>[$1 magsulod liwat]</span> bilang amo sa gihapon ukon lain nga nga manug-gamit.
Tandaan nga may mga panid nga mahimo ma-display sa gihapon nga daw nakasulod ka sa gihapon, hasta mapanas mo na ang tinago sang imo brawser.",
-'welcomecreation' => '== Pagtamyaw, $1! ==
-Ang imo account nahimo na.
-Indi pagkalimti ang pag-ilis sang imo mga [[Special:Preferences|{{SITENAME}} pagpasulabi]].',
+'welcomeuser' => 'Malipayon nga pag-abot. $1!',
+'welcomecreation-msg' => 'Nahimo na ang imo nga account.
+Indi pagkalimtan ang pag-ilis sa imo nga [[Special:Preferences|{{SITENAME}} pagpasulabi]].',
'yourname' => 'Ngalan sang Manog-gamit:',
'yourpassword' => 'Kontra-senyas:',
'yourpasswordagain' => 'Suliton ang kontra-senyas:',
@@ -537,6 +538,7 @@ Palihog maghulat anay bag-o tilawan liwat.',
# Email sending
'php-mail-error-unknown' => 'Wala nahibaluan nga sala sa kapuslanan nga sulat() sang PHP.',
'user-mail-no-addy' => 'Gintilawan nga magpadala sang e-mail biskan wala sang e-mail adres.',
+'user-mail-no-body' => 'Nakatilaw magpadala sang email nga waay unod ukon malip-ot katama ang unod sang mensahe.',
# Change password dialog
'resetpass' => 'Ilisan ang pasword',
@@ -602,6 +604,7 @@ Temporaryo nga pasword: $2',
'changeemail-oldemail' => 'E-mail adres sa subong:',
'changeemail-newemail' => 'Bag-o nga e-mail adres:',
'changeemail-none' => '(wala)',
+'changeemail-password' => 'Ang imong {{SITENAME}} nga password:',
'changeemail-submit' => 'Ilisan and E-mail',
'changeemail-cancel' => 'Kanselahon',
@@ -790,7 +793,6 @@ Ang pinaka-ulihi nga log ginbutang sa idalom agod nga imo mahibaluan:",
'template-protected' => '(protektado)',
'template-semiprotected' => '(medyo-protektado)',
'hiddencategories' => 'Ini nga pahina ay membro sang {{PLURAL:$1|1 tago nga kategorya|$1 mga tago nga kategorya}}:',
-'nocreatetitle' => 'Ginalimitahan ang pagbuhat sang panid',
'nocreatetext' => 'Ang {{SITENAME}} nagapuggong sang abilidad nga magtuga sang mga bag-o nga panid.
Mahimo ka nga magbalik kag mag-ilis sang naga-eksister nga panid, ukon[[Special:UserLogin|magsulod ukon maghimo sang akawnt]].',
'nocreate-loggedin' => 'Wala ka sang lisensya sa pagbuhat sang bag-o nga mga panid.',
@@ -815,6 +817,15 @@ Ini nagapakita nga gindula na.',
'edit-already-exists' => 'Indi mahimo ang bag-o nga panid.
Naga-eksister na ini.',
'defaultmessagetext' => 'Teksto sang mensahe nga wala pa ma-ilisan',
+'content-failed-to-parse' => 'Di matuman ang pag-parse $2 nga unod para sa $1 nga modelo: $3',
+'invalid-content-data' => 'May ara sala sa data.',
+'content-not-allowed-here' => '"$1" nga sulod indi pwede sa panid [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'tekstong wiki',
+'content-model-text' => 'tekstong ordinaryo',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Pahibalo:''' Ang ini nga panid may yara sang madamo nga mahal nga pagtawag sang kapusalanan parser.
@@ -1337,10 +1348,13 @@ Ang imo adres sang e-mail wala ginapakita kon kontakon ka sang iban.',
'right-sendemail' => 'Magpadala sang email sa iban nga naga-usar',
'right-passwordreset' => 'Tan-awa ang mga email sang password reset',
+# Special:Log/newusers
+'newuserlogpage' => 'Naga-usar nga ginhimo log',
+'newuserlogpagetext' => 'Ini ang isa ka log sang mga ginhimo sang naga-usar',
+
# User rights log
'rightslog' => 'Karapatan sang naga-usar log',
'rightslogtext' => 'Ini ang lista sang mga ginbag-o nga mga kinamatarong sang naga-usar.',
-'rightsnone' => '(wala)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'Basahon ang ini nga panid',
@@ -1551,10 +1565,6 @@ Ang gusto nga {{PLURAL:\$3|tipo sang file amo|mga tipo sang file amo ang}} \$2."
'linksearch-ok' => 'Pangita-a',
'linksearch-line' => '$1 amo nakasugpon sa $2',
-# Special:Log/newusers
-'newuserlogpage' => 'Naga-usar nga ginhimo log',
-'newuserlogpagetext' => 'Ini ang isa ka log sang mga ginhimo sang naga-usar',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Grupo',
'listgrouprights-members' => '(lista sang mga membro)',
@@ -1638,7 +1648,7 @@ Pwede mo mabag-o ang lebel sang proteksiyon sang pahina, pero indi ini ma apektu
'blanknamespace' => '(Mayor)',
# Contributions
-'contributions' => 'Naga-usar nga mga kontribusyon',
+'contributions' => 'Mga kontribusyon sang {{GENDER:$1|naga-usar}}',
'contributions-title' => 'Mga Kontribusyon sang Naga-Usar para $1',
'mycontris' => 'Kontribusyon',
'contribsub2' => 'Para $1 ($2)',
@@ -1957,5 +1967,6 @@ Ang iban ay pagataguon sang default.
# New logging system
'revdelete-restricted' => 'ginapatuman nga pagbawal sa mga administrador',
'revdelete-unrestricted' => 'ginkakas nga pagbawal sa mga administrador',
+'rightsnone' => '(wala)',
);
diff --git a/languages/messages/MessagesHr.php b/languages/messages/MessagesHr.php
index e90d9e49..fe271234 100644
--- a/languages/messages/MessagesHr.php
+++ b/languages/messages/MessagesHr.php
@@ -157,7 +157,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__UKLJUČISADRŽAJ__', '__FORCETOC__' ),
'toc' => array( '0', '__SADRŽAJ__', '__TOC__' ),
'noeditsection' => array( '0', '__BEZUREÄIVANJAODLOMAKA__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__BEZZAGLAVLJA__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'TRENUTAÄŒNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'TRENUTAÄŒNIMJESEC1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'TRENUTAÄŒNIMJESECIME', 'CURRENTMONTHNAME' ),
@@ -458,7 +457,6 @@ $messages = array(
'qbbrowse' => 'Pregledaj',
'qbedit' => 'Uredi',
'qbpageoptions' => 'Postavke stranice',
-'qbpageinfo' => 'O stranici',
'qbmyoptions' => 'Moje stranice',
'qbspecialpages' => 'Posebne stranice',
'faq' => 'NajÄešća pitanja',
@@ -481,6 +479,7 @@ $messages = array(
'namespaces' => 'Imenski prostori',
'variants' => 'InaÄice',
+'navigation-heading' => 'Navigacijski izbornik',
'errorpagetitle' => 'Pogrješka',
'returnto' => 'Vrati se na $1.',
'tagline' => 'Izvor: {{SITENAME}}',
@@ -717,12 +716,11 @@ Administrator koji je zakljuÄao spremiÅ¡te naveo je sljedeći razlog: "$3".',
# Login and logout pages
'logouttext' => "'''Odjavili ste se.'''
-Možete nastaviti s korištenjem {{SITENAME}} neprijavljeni, ili se možete ponovo [[Special:UserLogin|prijaviti]] pod istim ili drugim imenom.
+Možete nastaviti s korištenjem {{SITENAME}} neprijavljeni, ili se možete ponovo <span class='plainlinks'>[$1 prijaviti]</span> pod istim ili drugim imenom.
Neke se stranice mogu prikazivati kao da ste joÅ¡ uvijek prijavljeni, sve dok ne oÄistite meÄ‘uspremnik svog preglednika.",
-'welcomecreation' => '== Dobrodošli, $1! ==
-VaÅ¡ je suradniÄki raÄun otvoren.
-
-Ne zaboravite prilagoditi [[Special:Preferences|{{SITENAME}} postavke]].',
+'welcomeuser' => 'Dobrodošli, $1!',
+'welcomecreation-msg' => 'VaÅ¡ je suradniÄki raÄun otvoren.
+Ne zaboravite prilagoditi Vaše [[Special:Preferences|{{SITENAME}} postavke]].',
'yourname' => 'SuradniÄko ime',
'yourpassword' => 'Lozinka:',
'yourpasswordagain' => 'Ponovno upišite lozinku',
@@ -879,6 +877,7 @@ Privremena lozinka: $2',
'changeemail-oldemail' => 'Trenutna E-mail adresa:',
'changeemail-newemail' => 'Nova E-mail adresa:',
'changeemail-none' => '(ništa)',
+'changeemail-password' => 'Zaporka za {{SITENAME}}:',
'changeemail-submit' => 'Promijeni E-mail',
'changeemail-cancel' => 'Odustani',
@@ -1050,7 +1049,6 @@ Posljednja stavka u evidenciji navedena je niže kao napomena:",
'template-protected' => '(zaštićen)',
'template-semiprotected' => '(djelomiÄno zaÅ¡tićen)',
'hiddencategories' => 'Ova stranica je Älan {{PLURAL:$1|1 skrivene kategorija|$1 skrivene kategorije|$1 skrivenih kategorija}}:',
-'nocreatetitle' => 'Otvaranje novih stranica ograniÄeno',
'nocreatetext' => 'Na ovom je projektu ograniÄeno otvaranje novih stranica.
Možete se vratiti i ureÄ‘ivati već postojeće stranice ili se [[Special:UserLogin|prijaviti ili otvoriti suradniÄki raÄun]].',
'nocreate-loggedin' => 'Nemate ovlasti za stvaranje novih stranica.',
@@ -1075,6 +1073,15 @@ Razlog nije ponuđen.',
'edit-already-exists' => 'Neuspješno stvaranje nove stranice.
Stranica već postoji.',
'defaultmessagetext' => 'Prvotni tekst poruke',
+'content-failed-to-parse' => "Obrada (''parsiranje'') formata $2 za model $1 nije uspjela: $3",
+'invalid-content-data' => 'Nevaljani sadržaj',
+'content-not-allowed-here' => 'Sadržaj napisan u obliku "$1"-a nije dozvoljen na stranici [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'obiÄni tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Upozorenje: Ova stranica sadrži previše opterećujućih poziva parserskih funkcija
@@ -1433,9 +1440,9 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
'prefs-emailconfirm-label' => 'Potvrda e-mail adrese:',
'prefs-textboxsize' => 'VeliÄina prozora za ureÄ‘ivanje',
'youremail' => 'Vaša elektronska pošta *',
-'username' => 'SuradniÄko ime:',
-'uid' => 'SuradniÄki ID-broj:',
-'prefs-memberingroups' => 'ÄŒlan {{PLURAL:$1|skupine|skupina}}:',
+'username' => 'Ime {{GENDER:$1|suradnika|suradnice}}:',
+'uid' => 'ID-broj {{GENDER:$1|suradnika|suradnice}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Suradnik|Suradnica}} je Älan {{PLURAL:$1|sljedeće skupine|sljedećih skupina}}:',
'prefs-registration' => 'Vrijeme prijave:',
'yourrealname' => 'Pravo ime (nije obvezno)*',
'yourlanguage' => 'Jezik:',
@@ -1583,12 +1590,13 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
'right-sendemail' => 'Slanje e-maila drugim korisnicima',
'right-passwordreset' => 'Vidi poruku e-pošte o ponovnom postavljanju lozinke',
+# Special:Log/newusers
+'newuserlogpage' => 'Evidencija novih suradnika',
+'newuserlogpagetext' => 'Ispod je popis nedavno otvorenih suradniÄkih imena.',
+
# User rights log
'rightslog' => 'Evidencija suradniÄkih prava',
'rightslogtext' => 'Ovo je evidencija promjena suradniÄkih prava.',
-'rightslogentry' => 'promijenjena suradniÄka prava za $1 iz $2 u $3',
-'rightslogentry-autopromote' => 'je automatski unaprijeđen s $2 na $3',
-'rightsnone' => '(suradnik)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'Äitanje ove stranice',
@@ -1810,6 +1818,7 @@ Ako se problem ponovi, javite to [[Special:ListUsers/sysop|administratoru]].',
'backend-fail-notsame' => 'Na lokaciji $1 već postoji datoteka koja se razlikuje.',
'backend-fail-invalidpath' => "$1 nije valjana priÄuvna putanja (''path'').",
'backend-fail-delete' => 'Ne mogu obrisati datoteku $1.',
+'backend-fail-describe' => 'Ne mogu promijeniti metapodatke datoteke "$1".',
'backend-fail-alreadyexists' => 'Datoteka $1 već postoji.',
'backend-fail-store' => 'Nije uspjelo spremanje datoteke $1 na $2.',
'backend-fail-copy' => 'Nije uspjelo kopiranje datoteke "$1" u "$2".',
@@ -2194,7 +2203,7 @@ Također pogledajte [[Special:WantedCategories|tražene kategorije]].',
'linksearch-ok' => 'Traži',
'linksearch-text' => 'Možete koristiti džoker znakove poput "*.wikipedia.org".
Potrebno je navesti osnovnu domenu (TLD), npr. "*.org".<br />
-Podržani su protokoli: <code>$1</code> (ne stavljajte ih u vaše pretraživanje).',
+Podržani {{PLURAL:$2|protokol|protokoli}}: <code>$1</code> (default je http:// ako nijedan protokol nije naveden).',
'linksearch-line' => '$1 poveznica s Älanka $2',
'linksearch-error' => 'Džoker znakovi se mogu rabiti samo na poÄetku imena poslužitelja.',
@@ -2213,10 +2222,6 @@ Podržani su protokoli: <code>$1</code> (ne stavljajte ih u vaše pretraživanje
'activeusers-hidesysops' => 'Sakrij administratore',
'activeusers-noresult' => 'Niti jedan suradnik nije nađen.',
-# Special:Log/newusers
-'newuserlogpage' => 'Evidencija novih suradnika',
-'newuserlogpagetext' => 'Ispod je popis nedavno otvorenih suradniÄkih imena.',
-
# Special:ListGroupRights
'listgrouprights' => 'Prava suradniÄkih skupina',
'listgrouprights-summary' => 'Ovo je popis suradniÄkih skupina odreÄ‘enih na ovoj wiki, s njihovim pripadajućim pravima.
@@ -2314,32 +2319,38 @@ Promjene na toj stranici i njenoj stranici za razgovor bit će prikazane na popi
'enotif_mailer' => '{{SITENAME}} - izvješća o promjenama',
'enotif_reset' => 'OznaÄi sve stranice kao već posjećene',
-'enotif_newpagetext' => 'Ovo je nova stranica.',
'enotif_impersonal_salutation' => '{{SITENAME}} suradnik',
-'changed' => 'promijenio',
-'created' => 'stvorio',
-'enotif_subject' => '{{SITENAME}}: Stranicu $PAGETITLE je $CHANGEDORCREATED suradnik $PAGEEDITOR',
+'enotif_subject_deleted' => '{{gender:$2|Suradnik|Suradnica}} $2 {{gender:$2|je obrisao|je obrisala}} stranicu $1 projekta {{SITENAME}}',
+'enotif_subject_created' => '{{gender:$2|Suradnik|Suradnica}} $2 {{gender:$2|je stvorio|je stvorila}} stranicu $1 projekta {{SITENAME}}',
+'enotif_subject_moved' => '{{gender:$2|Suradnik|Suradnica}} $2 {{gender:$2|je premjestio|je premjestila}} stranicu $1 projekta {{SITENAME}}',
+'enotif_subject_restored' => '{{gender:$2|Suradnik|Suradnica}} $2 {{gender:$2|je vratio|je vratila}} stranicu $1 projekta {{SITENAME}}',
+'enotif_subject_changed' => '{{gender:$2|Suradnik|Suradnica}} $2 {{gender:$2|je uredio|je uredila}} stranicu $1 projekta {{SITENAME}}',
+'enotif_body_intro_deleted' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|obrisao|obrisala}} je dana $PAGEEDITDATE {{GENDER:$2|suradnik|suradnica}} $2, vidi $3.',
+'enotif_body_intro_created' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|stvorio|stvorila}} je dana $PAGEEDITDATE {{GENDER:$2|suradnik|suradnica}} $2, vidi $3 za trenutaÄnu inaÄicu stranice.',
+'enotif_body_intro_moved' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|premjestio|premjestila}} je dana $PAGEEDITDATE {{GENDER:$2|suradnik|suradnica}} $2, vidi $3 za trenutaÄnu inaÄicu stranice.',
+'enotif_body_intro_restored' => 'Stranica $1 projekta {{SITENAME}} {{GENDER:$2|vratio|vratila}} je dana $PAGEEDITDATE {{GENDER:$2|suradnik|suradnica}} $2, vidi $3 za trenutaÄnu inaÄicu stranice.',
+'enotif_body_intro_changed' => 'Stranica $1 projekta {{SITENAME}} {{GENDER:$2|promijenio|promijenila}} je dana $PAGEEDITDATE {{GENDER:$2|suradnik|suradnica}} $2, vidi $3 za trenutaÄnu inaÄicu stranice.',
'enotif_lastvisited' => 'Pogledaj $1 za promjene od zadnjeg posjeta.',
'enotif_lastdiff' => 'Pogledajte $1 kako biste mogli vidjeti tu izmjenu.',
'enotif_anon_editor' => 'neprijavljeni suradnik $1',
'enotif_body' => 'Poštovani $WATCHINGUSERNAME,
-stranica na projektu {{SITENAME}} s naslovom $PAGETITLE je dana $PAGEEDITDATE $CHANGEDORCREATED suradnik $PAGEEDITOR, pogledajte $PAGETITLE_URL za trenutaÄnu inaÄicu.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Sažetak urednika: $PAGESUMMARY $PAGEMINOREDIT
-Možete se javiti uredniku:
+Možete kontaktirati suradnika koji je zadnji uređivao stranicu:
mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Do Vašeg ponovnog posjeta stranici nećete dobivati nove obavijesti.
-Postavke za izvješćivanje možete resetirati za sve praćene stranice svog popisa praćenja.
+Do Vašeg ponovnog posjeta stranici nećete dobivati nove obavijesti. Postavke za izvješćivanje možete resetirati za sve praćene stranice svog popisa praćenja.
- Vaš sustav izvješćivanja {{SITENAME}}.
+Vaš sustav izvješćivanja {{SITENAME}}.
--
+Za promjene postavki izvješćivanja putem e-pošte, posjetite
+{{canonicalurl:{{#special:Preferences}}}}
+
Za promjene svog popisa praćenja, posjetite
{{canonicalurl:{{#special:EditWatchlist}}}}
@@ -2348,6 +2359,8 @@ $UNWATCHURL
Za povratne informacije i pomoć posjetite:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'stvorio',
+'changed' => 'promijenio',
# Delete
'deletepage' => 'Izbriši stranicu',
@@ -2497,7 +2510,8 @@ ili je promjena vraćena ili uklonjena iz arhive.',
'undeletedrevisions' => '{{PLURAL:$1|$1 inaÄica vraćena|$1 inaÄice vraćene|$1 inaÄica vraćeno}}',
'undeletedrevisions-files' => '{{PLURAL:$1|$1 promjena|$1 promjene|$1 promjena}} i {{PLURAL:$2|$2 datoteka vraćena|$2 datototeke vraćene|$2 datoteka vraćeno}}',
'undeletedfiles' => '{{PLURAL:$1|$1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}',
-'cannotundelete' => 'Vraćanje obrisane inaÄice nije uspjelo; netko drugi je stranicu već vratio.',
+'cannotundelete' => 'Vraćanje obrisane inaÄice nije uspjelo:
+$1',
'undeletedpage' => "'''$1 je vraćena'''
Pogledajte [[Special:Log/delete|evidenciju brisanja]] za zapise nedavnih brisanja i vraćanja.",
@@ -2528,7 +2542,7 @@ $1',
'blanknamespace' => '(Glavni)',
# Contributions
-'contributions' => 'Doprinosi suradnika',
+'contributions' => 'Doprinosi {{GENDER:$1|suradnika|suradnice}}',
'contributions-title' => 'SuradniÄki doprinosi za $1',
'mycontris' => 'Moji doprinosi',
'contribsub2' => 'Za $1 ($2)',
@@ -2800,6 +2814,7 @@ OdrediÅ¡ni Älanak "[[:$1]]" već postoji. Želite li ga obrisati da biste napra
'immobile-target-namespace-iw' => 'Međuwiki poveznica nije valjano odredište za premještanje stranice.',
'immobile-source-page' => 'Ova stranica je se ne može premjestiti.',
'immobile-target-page' => 'Ne mogu premjestiti na željeni naslov.',
+'bad-target-model' => 'Željeno odrediÅ¡te rabi drugaÄiji tip sadržaja. Ne mogu pretvoriti $1 u $2.',
'imagenocrossnamespace' => 'Datoteka ne može biti premještena u imenski prostor koji nije za datoteke',
'nonfile-cannot-move-to-file' => 'Ne mogu premjestiti nešto što nije datoteka u imenski prostor za datoteke',
'imagetypemismatch' => 'Ekstenzija nove datoteke se ne poklapa sa svojim tipom.',
@@ -2910,6 +2925,7 @@ Snimite je na svoje raÄunalo i postavite je ovdje.',
'import-error-interwiki' => 'Stranica "$1" nije uvezena jer je njen naziv rezerviran za vanjsko povezivanje (međuwiki poveznice).',
'import-error-special' => 'Stranica "$1" nije uvezena jer pripada posebnom imenskom prostoru u koji se stranice ne uvoze.',
'import-error-invalid' => 'Stranica "$1" nije uvezena jer je njen naziv nevaljan.',
+'import-error-unserialize' => 'InaÄica $2 stranice "$1" ne može biti proÄitana/uvezena. Zapisano je da inaÄica rabi $3 tip sadržaja u $4 formatu.',
'import-options-wrong' => '{{PLURAL:$2|Pogrješna opcija|Pogrješne opcije}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Zadana poÄetna stranica ima nevaljan naslov.',
'import-rootpage-nosubpage' => 'Imenski prostor "$1" poÄetne stranice ne dopuÅ¡ta podstranice.',
@@ -2924,7 +2940,6 @@ Snimite je na svoje raÄunalo i postavite je ovdje.',
# JavaScriptTest
'javascripttest' => 'Testiranje JavaScripta',
-'javascripttest-disabled' => 'Ova funkcija nije omogućena na ovom wikiprojektu.',
'javascripttest-title' => 'Izvršavaju se $1 testovi',
'javascripttest-pagetext-noframework' => 'Ova je stranica rezervirana za izvršavanje JavaScript testova.',
'javascripttest-pagetext-unknownframework' => 'Nepoznata testna okolina "$1".',
@@ -3046,6 +3061,7 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
'pageinfo-default-sort' => 'Podrazumijevano sortiranje',
'pageinfo-length' => 'Dužina stranice (u bajtovima)',
'pageinfo-article-id' => 'ID stranice',
+'pageinfo-language' => 'Jezik stranice',
'pageinfo-robot-policy' => 'Status tražilice',
'pageinfo-robot-index' => 'Stranicu je moguće indeksirati',
'pageinfo-robot-noindex' => 'Indeksiranje stranice onemogućeno',
@@ -3065,6 +3081,14 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
'pageinfo-magic-words' => '{{PLURAL:$1|MagiÄna rijeÄ - varijabla|MagiÄne rijeÄi - varijable}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Postoji|Postoje|Postoji}} $1 {{PLURAL:$1|skrivena kategorija|skrivene kategorije|skrivenih kategorija}}',
'pageinfo-templates' => '{{PLURAL:$1|Rabi|Rabe|Rabi}} se $1 {{PLURAL:$1|predložak|predloška|predložaka}}',
+'pageinfo-toolboxlink' => 'Podatci o stranici',
+'pageinfo-redirectsto' => 'Preusmjerava na',
+'pageinfo-redirectsto-info' => 'podatci',
+'pageinfo-contentpage' => 'Broji se kao stranica sa sadržajem',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading' => 'Prenosiva zaÅ¡tita poÄinje od ove stranice',
+'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-protect-cascading-from' => 'Prenosiva zaÅ¡tita poÄinje od',
# Skin names
'skinname-standard' => 'Standardna',
@@ -3084,6 +3108,8 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
'markedaspatrollederror' => 'Ne mogu oznaÄiti za pregledano',
'markedaspatrollederrortext' => 'Morate odabrati inaÄicu koju treba oznaÄiti za pregledanu.',
'markedaspatrollederror-noautopatrol' => 'Ne možete vlastite promjene oznaÄiti patroliranima.',
+'markedaspatrollednotify' => 'UreÄ‘ivanje stranice $1 oznaÄeno je pregledanim.',
+'markedaspatrollederrornotify' => 'OznaÄavanje stranice pregledanom nije uspjelo.',
# Patrol log
'patrol-log-page' => 'Evidencija pregledavanja promjena',
@@ -3117,6 +3143,7 @@ Njegovim izvršavanjem mogli biste oštetiti svoj sustav.",
'file-nohires' => 'Viša rezolucija nije dostupna.',
'svg-long-desc' => 'SVG datoteka, nominalno $1 × $2 piksela, veliÄina datoteke: $3',
'svg-long-desc-animated' => 'Animirana SVG datoteka, veliÄine $1 × $2 piksela, veliÄina datoteke: $3',
+'svg-long-error' => 'Nevaljana SVG datoteka: $1',
'show-big-image' => 'Vidi sliku u punoj veliÄini (rezoluciji)',
'show-big-image-preview' => 'VeliÄina ovog prikaza: $1.',
'show-big-image-other' => '{{PLURAL:$2|Druga rezolucija|Ostale rezolucije}}: $1.',
@@ -3147,6 +3174,7 @@ Njegovim izvršavanjem mogli biste oštetiti svoj sustav.",
'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
'ago' => 'prije $1',
+'just-now' => 'upravo',
# Bad image list
'bad_image_list' => "Rabi se sljedeći format:
@@ -3645,6 +3673,7 @@ Valjanost ovog potvrdnog koda istjeÄe u $4',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki transkluzija iskljuÄena]',
'scarytranscludefailed' => '[Dobava predloška nije uspjela za $1]',
+'scarytranscludefailed-httpstatus' => '[Preuzimanje predloška nije uspjelo za $1: HTTP $2]',
'scarytranscludetoolong' => '[URL je predug]',
# Delete conflict
@@ -3811,6 +3840,7 @@ Također možete koristiti [[Special:EditWatchlist|standardni editor]].',
'version-license' => 'Licencija',
'version-poweredby-credits' => "Ovaj wiki pogoni '''[//www.mediawiki.org/ MediaWiki]''', autorska prava © 2001-$1 $2.",
'version-poweredby-others' => 'ostali',
+'version-credits-summary' => 'Željeli bismo se zahvaliti sljedećim suradnicima na njihovom doprinosu [[Special:Version|MediaWikiju]].',
'version-license-info' => 'MediaWiki je slobodni softver; možete ga distribuirati i/ili mijenjati pod uvjetima GNU opće javne licencije u obliku u kojem ju je objavila Free Software Foundation; bilo verzije 2 licencije, ili (Vama na izbor) bilo koje kasnije verzije.
MediaWiki je distribuiran u nadi da će biti koristan, no BEZ IKAKVOG JAMSTVA; Äak i bez impliciranog jamstva MOGUĆNOSTI PRODAJE ili PRIKLADNOSTI ZA ODREÄENU NAMJENU. Pogledajte GNU opću javnu licenciju za viÅ¡e detalja.
@@ -3953,7 +3983,10 @@ Slike se na taj naÄin prikazuju u punoj rezoluciji, a drugi tipovi datoteka se
'logentry-newusers-create' => 'SuradniÄki raÄun $1 je otvoren.',
'logentry-newusers-create2' => '$1 je {{GENDER:$2|otvorio|otvorila}} suradniÄki raÄun $3',
'logentry-newusers-autocreate' => 'SuradniÄki raÄun $1 je automatski stvoren',
-'newuserlog-byemail' => 'lozinka poslana e-poštom',
+'logentry-rights-rights' => '$1 {{GENDER:$2|je promijenio|je promijenila}} suradniÄka prava raÄuna $3 iz $4 u $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|je promijenio|je promijenila|je promijenio}} Älanstvo grupe suradniÄkog raÄuna $3',
+'logentry-rights-autopromote' => 'SuradniÄkom raÄunu $1 {{GENDER:$1|je automatski promijenjeno Älanstvo|su automatski promijenjena Älanstva}} iz $4 u $5',
+'rightsnone' => '(suradnik)',
# Feedback
'feedback-bugornote' => 'Ako ste spremni detaljno opisati tehniÄki problem molimo [$1 prijavite "bug"].
diff --git a/languages/messages/MessagesHsb.php b/languages/messages/MessagesHsb.php
index 13359137..e87b4157 100644
--- a/languages/messages/MessagesHsb.php
+++ b/languages/messages/MessagesHsb.php
@@ -287,6 +287,7 @@ $messages = array(
'newwindow' => '(woÄinja so w nowym woknje)',
'cancel' => 'Přetorhnyć',
'moredotdotdot' => 'Wjace…',
+'morenotlisted' => 'Dalše njepodate...',
'mypage' => 'Strona',
'mytalk' => 'Diskusija',
'anontalk' => 'Diskusijna strona tuteje IP.adresy',
@@ -298,7 +299,6 @@ $messages = array(
'qbbrowse' => 'Přepytować',
'qbedit' => 'Wobdźěłać',
'qbpageoptions' => 'Tuta strona',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => 'Moje strony',
'qbspecialpages' => 'Specialne strony',
'faq' => 'Husto stajene prašenja (FAQ)',
@@ -321,6 +321,7 @@ $messages = array(
'namespaces' => 'Mjenowe rumy',
'variants' => 'Warianty',
+'navigation-heading' => 'Nawigaciski meni',
'errorpagetitle' => 'Zmylk',
'returnto' => 'Wróćo k stronje $1.',
'tagline' => 'z {{GRAMMAR:genitiw|{{SITENAME}}}}',
@@ -558,11 +559,11 @@ Administrator, kiž je jón zawrěł, je tule pÅ™iÄinu podaÅ‚: "$3".',
# Login and logout pages
'logouttext' => "'''{{GENDER:|Sy|Sy}} nětko {{GENDER:|wotzjewjeny|wotzjewjena}}.'''
-Móžeš {{GRAMMAR:akuzatiw|{{SITENAME}}}} nětko anonymnje dale wužiwać abo so ze samsnym abo druhim wužiwarskim mjenom [[Special:UserLogin|zaso přizjewić]].
+Móžeš {{GRAMMAR:akuzatiw|{{SITENAME}}}} nětko anonymnje dale wužiwać abo so ze samsnym abo druhim wužiwarskim mjenom <span class='plainlinks'>[$1 zaso přizjewić]</span>.
Wobkedźbuj, zo so někotre strony dale jewja, kaž by hišće přizjewjeny był, doniž pufrowak swojeho wobhladowaka njewuprózdnješ.",
-'welcomecreation' => '== Witaj, $1! ==
-
-Twoje konto bu wutworjene. Njezabudź swoje nastajenja za [[Special:Preferences|{{GRAMMAR:akuzatiw|{{SITENAME}}}}]] změnić.',
+'welcomeuser' => 'Witaj $1',
+'welcomecreation-msg' => 'Twoje konto bu wutworjene.
+Njezabudź swoje [[Special:Preferences|nastajenja za {{GRAMMAR:akuzatiw|{{SITENAME}}}}]] změnić.',
'yourname' => 'Wužiwarske mjeno:',
'yourpassword' => 'Hesło:',
'yourpasswordagain' => 'Hesło znowa zapodać:',
@@ -585,7 +586,7 @@ Twoje konto bu wutworjene. Njezabudź swoje nastajenja za [[Special:Preferences|
'gotaccount' => 'Maš hižo wužiwarske konto? $1.',
'gotaccountlink' => 'Přizjewić',
'userlogin-resetlink' => 'Přizjewjenske daty zabył?',
-'createaccountmail' => 'z mejlku',
+'createaccountmail' => 'Nachwilne přidatne hesło wužiwać a jo na slědowacu e-mejlowu adresu pósłać',
'createaccountreason' => 'PÅ™iÄina:',
'badretype' => 'Hesle, kotrejž sy zapodał, so njekryjetej.',
'userexists' => 'Wužiwarske mjeno, kotrež sy zapodał, so hižo wužiwa.
@@ -649,6 +650,7 @@ MóžeÅ¡ tutu zdźělenku ignorować, jeli so wužiwarske konto zmylnje wutworiÅ
# Email sending
'php-mail-error-unknown' => 'Njeznaty zmylk w PHP-funkciji mail()',
'user-mail-no-addy' => 'Je so spytało e-mejl bjez e-mejloweje adresy słać.',
+'user-mail-no-body' => 'Je so spytało, e-mejl bjez teksta abo z překrótkim tekstom pósłać',
# Change password dialog
'resetpass' => 'Hesło změnić',
@@ -696,7 +698,7 @@ Ty měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tut
Nachwilne hesło: $2',
'passwordreset-emailsent' => 'E-mejl za anulowanje hesło je so pósłała.',
'passwordreset-emailsent-capture' => 'E-mejl za anulowanje hesła je so pósłała, kotraž so deleka pokazuje.',
-'passwordreset-emailerror-capture' => 'Deleka pokazana dopomnjenska e-mejl je so wutworiła, ale słanje wužiwarjej je so njeporadźiło: $1',
+'passwordreset-emailerror-capture' => 'E-mejl za anulowanje hesła je so wutworiła, kotraž so deleka pokazuje, ale słanje wužiwarjej je so njeporadźiło: $1',
# Special:ChangeEmail
'changeemail' => 'E-mejlowu adresu změnić',
@@ -706,6 +708,7 @@ Nachwilne hesło: $2',
'changeemail-oldemail' => 'Aktualna e-mejlowa adresa:',
'changeemail-newemail' => 'Nowa e-mejlowa adresa:',
'changeemail-none' => '(žana)',
+'changeemail-password' => 'Twoje hesło za {{GRAMMAR:akuzatiw|{{SITENAME}}}}',
'changeemail-submit' => 'E-mejlowu adresu změnić',
'changeemail-cancel' => 'Přetorhnyć',
@@ -876,7 +879,6 @@ Najnowši protokolowy zapisk je deleka jako referenca podaty:",
'template-semiprotected' => '(Å¡kitana za njepÅ™izjewjenych wužiwarjow a nowaÄkow)',
'hiddencategories' => 'Tuta strona je ÄÅ‚on w {{PLURAL:$1|1 schowanej kategoriji|$1 schowanymaj kategorijomaj|$1 schowanych kategorijach|$1 schowanych kategorijach}}:',
'edittools' => '<!-- Tutón tekst so spody wobdźěłowanskich a nahrawanskich formularow pokazuje. -->',
-'nocreatetitle' => 'Wutworjenje stron je wobmjezowane.',
'nocreatetext' => 'Na {{GRAMMAR:lokatiw|{{SITENAME}}}} bu wutworjenje nowych stronow wobmjezowane. Móžeš wobstejace strony wobdźěłać abo [[Special:UserLogin|so přizjewić abo wužiwarske konto wutworić]].',
'nocreate-loggedin' => 'Nimaš prawo, zo by nowe strony wutworił.',
'sectioneditnotsupported-title' => 'Wobdźěłowanje wotrězka so njepodpěruje',
@@ -899,6 +901,15 @@ Zda so, zo je hîžo wušmórnjena.',
'edit-already-exists' => 'Njebě móžno nowu stronu wutworić.
Eksistuje hižo.',
'defaultmessagetext' => 'Standardny tekst zdźělenki',
+'content-failed-to-parse' => 'Parsowanje wobsaha $2 za model $1 je so njeporadźiło: $3',
+'invalid-content-data' => 'Njepłaćiwe wobsahowe daty',
+'content-not-allowed-here' => 'Wobsah "$1" njeje na stronje [[$2]] dowoleny',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'luty tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Warnowanje: Tuta strona wobsahuje přewjele parserowych wołanjow.
@@ -1259,9 +1270,9 @@ Móžeš tutu stronu wužiwać, zo by swoje nastajenja na standardne hódnoty sy
'prefs-emailconfirm-label' => 'E-mejlowe wobkrućenje:',
'prefs-textboxsize' => 'Wulkosć wobdźěłowanskeho wokna',
'youremail' => 'E-mejl:',
-'username' => 'Wužiwarske mjeno:',
-'uid' => 'ID wužiwarja:',
-'prefs-memberingroups' => 'Čłon {{PLURAL:$1|skupiny|skupinow}}:',
+'username' => 'Mjeno {{GENDER:$1|wužiwarja|wužiwarki}}:',
+'uid' => 'ID {{GENDER:$1|wužiwarja|wužiwarki}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Čłon|Čłonka}} {{PLURAL:$1|wužiwarskeje skupiny|wužiwarskeju skupinow|wužiwarskich skupinow}}:',
'prefs-registration' => 'ÄŒas registracije:',
'yourrealname' => 'Woprawdźite mjeno:',
'yourlanguage' => 'RÄ›Ä:',
@@ -1409,12 +1420,13 @@ SmÄ› mjenje haÄ $1 {{PLURAL:$1|znamjeÅ¡ko|znamjeÅ¡ce|znamjeÅ¡ka|znamjeÅ¡kow}} d
'right-sendemail' => 'Druhim wužiwarjam e-mejl pósłać',
'right-passwordreset' => 'E-mejlki za wróćostajenje hesłow sej wobhladać',
+# Special:Log/newusers
+'newuserlogpage' => 'Protokol nowych wužiwarjow',
+'newuserlogpagetext' => 'To je protokol wutworjenja nowych wužiwarskich kontow.',
+
# User rights log
'rightslog' => 'Protokol zrjadowanja wužiwarskich prawow',
'rightslogtext' => 'To je protokol změnow wužiwarskich prawow.',
-'rightslogentry' => 'zmÄ›ni skupinske ÄÅ‚onstwo za $1 z $2 do $3',
-'rightslogentry-autopromote' => 'je so awtomatisce wot $2 do $3 změnił',
-'rightsnone' => '(niÄo)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'tutu stronu Äitać',
@@ -1653,6 +1665,7 @@ $1',
'backend-fail-notsame' => 'Dataja, kotraž identiska njeje, hižo pola $1 eksistuje.',
'backend-fail-invalidpath' => '$1 płaćiwy pućik za składowanje njeje.',
'backend-fail-delete' => 'Dataja $1 njeda so zhašeć.',
+'backend-fail-describe' => 'Metadaty za dataju "$1" njedadźa so změnić.',
'backend-fail-alreadyexists' => 'Dataja $1 hižo eksistuje.',
'backend-fail-store' => 'Dataja $1 njeda so pod $2 składować',
'backend-fail-copy' => 'Dataja $1 njeda so do $2 kopěrować',
@@ -1881,6 +1894,12 @@ Snano chceš wopisanje na jeje [$2 stronje datajoweho wopisanja] wobdźěłać.'
'disambiguationspage' => 'Template:Wjacezmyslnosć',
'disambiguations-text' => "Slědowace strony wobsahuja znajmjeńša jedyn wotkaz k stronje '''rozjasnjenja wjacezmyslnosće'''. Měli město toho na poprawnu stronu wotkazać.<br />Maja stronu za stronu rozjasnjenja wjacezmyslnosće, jeli předłohu wužiwa, na kotruž so wot [[MediaWiki:Disambiguationspage]] wotkazuje.",
+'pageswithprop' => 'Strony z kajkosću strony',
+'pageswithprop-legend' => 'Strony z kajkosću strony',
+'pageswithprop-text' => 'Tuta strona nalistuje strony, kotrež wěstu kajkosć strony wužiwaja.',
+'pageswithprop-prop' => 'Mjeno kajkosće:',
+'pageswithprop-submit' => 'Wotpósłać',
+
'doubleredirects' => 'Dwójne daleposrědkowanja',
'doubleredirectstext' => 'Tuta strona nalistuje strony, kotrež k druhim daleposrědkowanskim stronam dale posrědkuja.
Kóž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.',
@@ -2031,7 +2050,7 @@ Hlej tež [[Special:WantedCategories|požadane kategorije]].',
'linksearch-ok' => 'Pytać',
'linksearch-text' => 'Zastupniske znamješka kaž "*.wikipedia.org" móža so wužiwać.
Znajmjeńša hłowna domena je trěbna, na přikład "*.org".<br />
-Podpěrowane protokole: <code>$1</code> (standard je http://, jeli žadyn protokol njeje podaty).',
+{{PLURAL:$2|Podpěrowany protokol|Podpěrowanej protokolej|Podpěrowane protokole}}: <code>$1</code> (standard je http://, jeli žadyn protokol njeje podaty).',
'linksearch-line' => '$1 je z $2 wotkazany.',
'linksearch-error' => 'Zastupniske znamjenja dadźa so jenož na spoÄatku URL wužiwać.',
@@ -2050,10 +2069,6 @@ Podpěrowane protokole: <code>$1</code> (standard je http://, jeli žadyn protok
'activeusers-hidesysops' => 'Administratorow schować',
'activeusers-noresult' => 'Žani wužiwarjo namakani.',
-# Special:Log/newusers
-'newuserlogpage' => 'Protokol nowych wužiwarjow',
-'newuserlogpagetext' => 'To je protokol wutworjenja nowych wužiwarskich kontow.',
-
# Special:ListGroupRights
'listgrouprights' => 'Prawa wužiwarskeje skupiny',
'listgrouprights-summary' => 'Slěduje lisćina wužiwarskich skupinow na tutej wikiju z jich wotpowědnymi přistupnymi prawami. Tu móžeš [[{{MediaWiki:Listgrouprights-helppage}}|dalše informacije]] wo jednotliwych prawach namakać.',
@@ -2147,20 +2162,24 @@ Přichodne změny tuteje strony a přisłušneje diskusijneje strony budu so tam
'enotif_mailer' => '{{SITENAME}} E-mejlowe zdźělenje',
'enotif_reset' => 'Wšě strony jako wopytane woznamjenić',
-'enotif_newpagetext' => 'To je nowa strona.',
'enotif_impersonal_salutation' => 'wužiwar {{GRAMMAR:genitiw|{{SITENAME}}}}',
-'changed' => 'změnjena',
-'created' => 'wutworjena',
-'enotif_subject' => '[{{SITENAME}}] Strona „$PAGETITLE†bu přez wužiwarja $PAGEEDITOR $CHANGEDORCREATED.',
+'enotif_subject_deleted' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so wot {{GENDER:$2|$2}} zhašała',
+'enotif_subject_created' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so wot {{GENDER:$2|$2}} wutworiła',
+'enotif_subject_moved' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so wot {{GENDER:$2|$2}} přesunyła',
+'enotif_subject_restored' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so wot {{GENDER:$2|$2}} wobnowiła',
+'enotif_subject_changed' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so wot {{GENDER:$2|$2}} změniła',
+'enotif_body_intro_deleted' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so na $PAGEEDITDATE wot {{GENDER:$1|$2}} zhašała, hlej $3.',
+'enotif_body_intro_created' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so na $PAGEEDITDATE wot {{GENDER:$2|$2}} wutworiła, hlej $3 za aktualnu wersiju',
+'enotif_body_intro_moved' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so na $PAGEEDITDATE wot {{GENDER:$2|$2}} přesunyła, hlej $3 za aktualnu wersiju',
+'enotif_body_intro_restored' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so na $PAGEEDITDATE wot {{GENDER:$2|$2}} wobnowiła, hlej $3 za aktualnu wersiju',
+'enotif_body_intro_changed' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so na $PAGEEDITDATE wot {{GENDER:$2|$2}} změniła, hlej $3 za aktualnu wersiju',
'enotif_lastvisited' => 'Hlej $1 za wšě změny po twojim poslednim wopyće.',
'enotif_lastdiff' => 'Hlej $1 za tutu změnu.',
'enotif_anon_editor' => 'anonymny wužiwar $1',
'enotif_body' => 'Luby $WATCHINGUSERNAME,
+$PAGEINTRO $NEWPAGE
-Strona we {{GRAMMAR:lokatiw|{{SITENAME}}}} z mjenom $PAGETITLE bu dnja $PAGEEDITDATE wot $PAGEEDITOR $CHANGEDORCREATED, hlej $PAGETITLE_URL za aktualnu wersiju.
-
-$NEWPAGE
Zjeće wobdźěłarja: $PAGESUMMARY $PAGEMINOREDIT
@@ -2171,7 +2190,7 @@ wiki: $PAGEEDITOR_WIKI
Njebudu žane druhe zdźělenki w padźe dalšich změnow, chibazo wopytaš tutu stronu.
Móžeš tež zdźělenske marki za wšě swoje wobkedźbowane strony we swojich wobkedźbowankach wróćo stajić.
- Twój přećelny zdźělenski system {{GRAMMAR:genitiw|{{SITENAME}}}}
+Twój přećelny zdźělenski system {{GRAMMAR:genitiw|{{SITENAME}}}}
--
Zo by swoje nastajenja za e-mejlowe zdźělenja změnił, wopytaj
@@ -2186,6 +2205,8 @@ $UNWATCHURL
Wotmołwy a dalša pomoc:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'wutworjena',
+'changed' => 'změnjena',
# Delete
'deletepage' => 'Stronu zhašeć',
@@ -2250,6 +2271,8 @@ Hlej [[Special:ProtectedPages|lisćinu škitanych stronow]] za lisćinu tuchwilu
'prot_1movedto2' => 'je [[$1]] pod hesło [[$2]] přesunył',
'protect-badnamespace-title' => 'Nješkitajomny mjenowy rum',
'protect-badnamespace-text' => 'Strony w tutym mjenowym rumje njehodźa so škitać.',
+'protect-norestrictiontypes-text' => 'Tuta strona njeda so škitać, dokelž žane wobmjezowanja k dispoziciji njesteja.',
+'protect-norestrictiontypes-title' => 'Nješkitajomna strona',
'protect-legend' => 'Škit wobkrućić',
'protectcomment' => 'PÅ™iÄina:',
'protectexpiry' => 'ÄŒas Å¡kita:',
@@ -2327,7 +2350,8 @@ W tutym padźe dyrbiÅ¡ najnowÅ¡u wuÅ¡mórnjenu wersiju znjemóžnić abo pokazaÄ
'undeletedrevisions' => '$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} {{PLURAL:$1|wobnowjena|wobnowjenej|wobnowjene|wobnowjene}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} a $2 {{PLURAL:$2|dataja|dataji|dataje|datajow}} {{PLURAL:$2|wobnowjena|wobnowjenej|wobnowjene|wobnowjene}}',
'undeletedfiles' => '$1 {{PLURAL:$1|dataja|dataji|dataje|datajow}} {{PLURAL:$1|wobnowjena|wobnowjenej|wobnowjene|wobnowjene}}.',
-'cannotundelete' => 'Wobnowjenje zwrěšćiło; něchtó druhi je stronu prjedy wobnowił.',
+'cannotundelete' => 'Wobnowjenje zwrěšćiło:
+$1',
'undeletedpage' => "'''Strona $1 bu z wuspěchom wobnowjena.'''
Hlej [[Special:Log/delete|protokol]] za lisćinu aktualnych wušmórnjenjow a wobnowjenjow.",
@@ -2358,7 +2382,7 @@ $1',
'blanknamespace' => '(Nastawki)',
# Contributions
-'contributions' => 'Přinoški wužiwarja',
+'contributions' => 'Přinoški {{GENDER:$1|wužiwarja|wužiwarki}}',
'contributions-title' => 'Wužiwarske přinoški wot „$1“',
'mycontris' => 'Přinoški',
'contribsub2' => 'za wužiwarja $1 ($2)',
@@ -2613,6 +2637,7 @@ Cilowa strona „[[:$1]]†hižo eksistuje. ChceÅ¡ ju wuÅ¡mórnyć, zo by so pÅ
'immobile-target-namespace-iw' => 'Interwiki-wotkaz njeje płaćiwy cil za přesunjenja stronow.',
'immobile-source-page' => 'Strona njeda so přesunyć.',
'immobile-target-page' => 'Njemóžno do teje ciloweje strony přesunyć.',
+'bad-target-model' => 'Požadany cil wužiwa druhi wobsahowy model. $1 njeda so do $2 konwertować.',
'imagenocrossnamespace' => 'Wobraz njeda so do druheho mjenoweho ruma haÄ wobraz pÅ™esunyć',
'nonfile-cannot-move-to-file' => 'Njedataje njedadźa so do datajoweho mjenoweho ruma přesunyć',
'imagetypemismatch' => 'Nowa dataja swojemu typej njewotpowěduje',
@@ -2720,6 +2745,7 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
'import-error-interwiki' => 'Strona "$1" so njeimportuje, dokelž jeje mjeno je za eksterne wotkazowanje (interwiki) wuměnjene.',
'import-error-special' => 'Strona "$1" so njeimportuje, dokelž k wosebitemu mjenowemu rumej słuša, kotryž strony njedowola.',
'import-error-invalid' => 'Strona "$1" so njeimportuje, dokelž jeje mjeno je njepłaćiwe.',
+'import-error-unserialize' => 'Wersija $2 strony "$1" njeda so wotserializować. Wersija je so zdźěliła za wužiwanje wobsahoweho modela $3, kotryž je jako $4 serializowany.',
'import-options-wrong' => '{{PLURAL:$2|WopaÄna opcija|WopaÄnej opciji|WopaÄne opcije|WopaÄne opcije}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Podata korjenjowa strona je njepłaćiwa.',
'import-rootpage-nosubpage' => 'Mjenowy rum "$1" korjenjoweje strony njedowola podstrony.',
@@ -2734,7 +2760,6 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
# JavaScriptTest
'javascripttest' => 'JavaScriptowy test',
-'javascripttest-disabled' => 'Tuta funkcija njeje na tutym wikiju zmóžnjena.',
'javascripttest-title' => 'Testy $1 so přewjedu',
'javascripttest-pagetext-noframework' => 'Tuta strona je za přewjedźenje javascriptowych testow přewostajena.',
'javascripttest-pagetext-unknownframework' => 'Njeznaty wobłuk "$1".',
@@ -2855,11 +2880,13 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
'pageinfo-default-sort' => 'Standardny sortÄ›rowanski kluÄ',
'pageinfo-length' => 'Dołhosć strony (w bajtach)',
'pageinfo-article-id' => 'ID strony',
+'pageinfo-language' => 'RÄ›Ä wobsaha strony',
'pageinfo-robot-policy' => 'Status pytawy',
'pageinfo-robot-index' => 'Indeksujomny',
'pageinfo-robot-noindex' => 'Njeindeksujomny',
'pageinfo-views' => 'LiÄba zwobraznjenjow',
'pageinfo-watchers' => 'LiÄba wobkedźbowarjow strony',
+'pageinfo-few-watchers' => 'Mjenje haÄ $1 {{PLURAL:$1|wobkedźbowar|wobkedźbowarjej|wobkedźbowarje|wobkedźbowarjow}}',
'pageinfo-redirects-name' => 'Dalesposrědkowanja k tutej stronje',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'Podstrony tuteje strony',
@@ -2875,6 +2902,19 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
'pageinfo-magic-words' => '{{PLURAL:$1|Magiske słowo|Magiskej słowje|Magiske słowa|Magiske słowa}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Schowana kategorija|Schowanej kategoriji|Schowane kategorije|Schowane kategorije}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Zapřijata předłoha|Zapřijatej předłoze|Zapřijate předłohi|Zapřijate předłohi}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Strona zapřijata|Stronje zapřijatej|Strony zapřijate}} do ($1)',
+'pageinfo-toolboxlink' => 'Informacije wo stronje',
+'pageinfo-redirectsto' => 'Sposrědkuje k',
+'pageinfo-redirectsto-info' => 'Info',
+'pageinfo-contentpage' => 'LiÄi so jako wobsahowa strona',
+'pageinfo-contentpage-yes' => 'Haj',
+'pageinfo-protect-cascading' => 'Kaskadowy Å¡kit wottud',
+'pageinfo-protect-cascading-yes' => 'Haj',
+'pageinfo-protect-cascading-from' => 'Kaskadowy Å¡kit wot',
+'pageinfo-category-info' => 'Kategorijowe informacije',
+'pageinfo-category-pages' => 'LiÄba rÄ›kow',
+'pageinfo-category-subcats' => 'LiÄba podkategorijow',
+'pageinfo-category-files' => 'LiÄba datajow',
# Skin names
'skinname-standard' => 'Klasiski',
@@ -2896,6 +2936,8 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
'markedaspatrollederror' => 'Njemóžno jako přepruwowanu woznamjenić.',
'markedaspatrollederrortext' => 'Dyrbiš wersiju podać, kotraž so ma jako přepruwowana woznamjenić.',
'markedaspatrollederror-noautopatrol' => 'Njesměš swoje změny jako přepruwowane woznamjenjeć.',
+'markedaspatrollednotify' => 'Tuta změna do $1 je so jako dohladowana markěrowała.',
+'markedaspatrollederrornotify' => 'Markěrowanje jako dohladowane je so njeporadźiło.',
# Patrol log
'patrol-log-page' => 'Protokol přepruwowanjow',
@@ -2929,6 +2971,7 @@ $1',
'file-nohires' => 'Za tutu dataju žane wyše rozeznaće njeje.',
'svg-long-desc' => 'SVG-dataja, zakładna wulkosć: $1 × $2 pikselow, datajowa wulkosć: $3',
'svg-long-desc-animated' => 'Animěrowana SVG-dataja, zakładnej wotměraj $1 × $2 pikselow, datajowa wulkosć: $3',
+'svg-long-error' => 'Njepłaćiwa SVG-dataja: $1',
'show-big-image' => 'Wersija z wyšim rozeznaćom',
'show-big-image-preview' => 'Wulkosć tutoho přehlada: $1.',
'show-big-image-other' => '{{PLURAL:$2|Druhe rozeznaće|Druhej rozeznaći|Druhe rozeznaća|Druhe rozeznaća}}: $1.',
@@ -2958,7 +3001,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 mjeńšinu|$1 mjeńšinomaj|$1 mjeńšinami|$1 mjeńšinami}}',
'hours' => '{{PLURAL:$1|$1 hodźinu|$1 hodźinomaj|$1 hodźinami|$1 hodźinami}}',
'days' => '{{PLURAL:$1|$1 dnjom|$1 dnjomaj|$1 dnjemi|$1 dnjemi}}',
+'months' => '{{PLURAL:$1|$1 měsacom|$1 měsacomaj|$1 měsacami}}',
+'years' => '{{PLURAL:$1|$1 lětom|$1 lětomaj|$1 lětami}}',
'ago' => 'před $1',
+'just-now' => 'runje',
# Bad image list
'bad_image_list' => 'Format:
@@ -3443,6 +3489,7 @@ Tutón wobkrućenski kod spadnje $4.',
# Scary transclusion
'scarytranscludedisabled' => '[ZapÅ™ijeće mjezyrÄ›Änych wotkazow je znjemóžnjene]',
'scarytranscludefailed' => '[Zapřijimanje předłohi za $1 je so njeporadźiło]',
+'scarytranscludefailed-httpstatus' => '[Wotwołanje předłohi za $1 je so njeporadźiło: HTTP $2]',
'scarytranscludetoolong' => '[URL je předołhi]',
# Delete conflict
@@ -3558,6 +3605,7 @@ Móžeš tež [[Special:EditWatchlist|standardnu wobdźěłowansku stronu]] wuž
'version-license' => 'Licenca',
'version-poweredby-credits' => "Tutón wiki so wot '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2 podpěruje.",
'version-poweredby-others' => 'druzy',
+'version-credits-summary' => 'Dźakujemy so slědowacym wosobam za jich přinoški k [[Special:Version|MediaWiki]]',
'version-license-info' => 'MediaWiki je swobodna softwara: móžeš ju pod wuměnjenjemi licency GNU General Public License, wozjewjeneje wot załožby Free Software Foundation, rozdźělić a/abo změnić: pak pod wersiju 2 licency pak pod někajkej pozdźišej wersiju.
MediaWiki so w nadźiji rozdźěla, zo budźe wužitny, ale BJEZ GARANTIJU: samo bjez wobsahowaneje garantije PŘEDAWAJOMNOSĆE abo PŘIHÓDNOSĆE ZA WĚSTY ZAMĚR. Hlej GNU general Public License za dalše podrobnosće.
@@ -3672,17 +3720,17 @@ Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym prog
'sqlite-no-fts' => '$1 połnotekstowe pytanje njepodpěruje',
# New logging system
-'logentry-delete-delete' => '$1 je stronu $3 zhašał',
-'logentry-delete-restore' => '$1 je stronu $3 wobnowił',
-'logentry-delete-event' => '$1 změni widźomnosć {{PLURAL:$5|protokoloweho zapiska|$5 protokoloweju zapiskow|$5 protokolowych zapiskow|$5 protokolowych zapiskow}} na $3: $4',
-'logentry-delete-revision' => '$1 změni widźomnosć {{PLURAL:$5|jedneje wersije|$5 wersijow|$5 wersijow|$5 wersijow}} na $3: $4',
-'logentry-delete-event-legacy' => '$1 změni widźomnosć protokolowych zapiskow na $3',
-'logentry-delete-revision-legacy' => '$1 změni widźomnosć wersijow na stronje $3',
-'logentry-suppress-delete' => '$1 je stronu $3 potłóÄiÅ‚',
-'logentry-suppress-event' => '$1 změni skradźu widźomnosć {{PLURAL:$5|protokoloweho zapiska|$5 protokoloweju zapiskow|$5 protokolowych zapiskow|$5 protokolowych zapiskow}} na $3: $4',
-'logentry-suppress-revision' => '$1 změni skradźu widźomnosć {{PLURAL:$5|jedneje wersije|$5 wersijow|$5 wersijow|$5 wersijow}} na stronje $3: $4',
-'logentry-suppress-event-legacy' => '$1 změni skradźu widźomnosć protokolowych zapiskow na $3',
-'logentry-suppress-revision-legacy' => '$1 změni skradźu widźomnosć wersijow na stronje $3',
+'logentry-delete-delete' => '$1 je stronu $3 {{GENDER:$1|zhašał|zhašała}}',
+'logentry-delete-restore' => '$1 je stronu $3 {{GENDER:$1wobnowił|wobnowiła}}',
+'logentry-delete-event' => '$1 je widźomnosć {{PLURAL:$5|protokoloweho zapiska|$5 protokoloweju zapiskow|$5 protokolowych zapiskow}} na $3 {{GENDER:$2|změnił|změniła}}: $4',
+'logentry-delete-revision' => '$1 je widźomnosć {{PLURAL:$5|jedneje wersije|$5 wersijow}} na $3 {{GENDER:$2|změnił|změniła}}: $4',
+'logentry-delete-event-legacy' => '$1 je widźomnosć protokolowych zapiskow na $3 {{GENDER:$2|změnił|změniła}}',
+'logentry-delete-revision-legacy' => '$1 je widźomnosć wersijow na stronje $3 {{GENDER:$2|změnił|změniła}}',
+'logentry-suppress-delete' => '$1 je stronu $3 {{GENDER:$2|potłóÄiÅ‚|potłóÄiÅ‚a}}',
+'logentry-suppress-event' => '$1 je skradźu widźomnosć {{PLURAL:$5|protokoloweho zapiska|$5 protokoloweju zapiskow|$5 protokolowych zapiskow}} na $3 {{GENDER:$2|změnił|změniła}}: $4',
+'logentry-suppress-revision' => '$1 je skradźu widźomnosć {{PLURAL:$5|jedneje wersije|$5 wersijow}} na stronje $3 {{GENDER:$2|změnił|změniła}}: $4',
+'logentry-suppress-event-legacy' => '$1 je skradźu widźomnosć protokolowych zapiskow na $3 {{GENDER:$2|změnił|změniła}}',
+'logentry-suppress-revision-legacy' => '$1 je skradźu widźomnosć wersijow na stronje $3 {{GENDER:$2|změnił|změniła}}',
'revdelete-content-hid' => 'wobsah schowany',
'revdelete-summary-hid' => 'Zjeće schowane',
'revdelete-uname-hid' => 'wužiwarske mjeno schowane',
@@ -3691,17 +3739,21 @@ Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym prog
'revdelete-uname-unhid' => 'wužiwarske mjeno widźomne',
'revdelete-restricted' => 'na administratorow nałožene wobmjezowanja',
'revdelete-unrestricted' => 'Wobmjezowanja za administratorow wotstronjene',
-'logentry-move-move' => '$1 je stronu $3 do $4 přesunył',
-'logentry-move-move-noredirect' => '$1 přesuny stronu $3 do $4, bjeztoho zo by dalesposrědkowanje wutworił',
-'logentry-move-move_redir' => '$1 přesuny stronu $3 do $4 přepisujo dalesposrědkowanje',
-'logentry-move-move_redir-noredirect' => '$1 přesuny stronu $3 do $4 přepisujo dalesposrědkowanje, bjeztoho zo by dalesposrědkowanje wutworił',
-'logentry-patrol-patrol' => '$1 markěrowaše wersiju $4 strony $3 jako skontrolowanu',
-'logentry-patrol-patrol-auto' => '$1 awtomatisce markěrowaše wersiju $4 strony $3 jako skontrolowanu',
-'logentry-newusers-newusers' => 'Wužiwarske konto $1 je so załožiło',
-'logentry-newusers-create' => 'Wužiwarske konto $1 je so załožiło',
-'logentry-newusers-create2' => '$1 załoži wužiwarske konto $3',
-'logentry-newusers-autocreate' => 'Konto $1 je so awtomatisce załožiło',
-'newuserlog-byemail' => 'Hesło z e-mejlku pósłane',
+'logentry-move-move' => '$1 je stronu $3 do $4 {{GENDER:$2|přesunył|přesunyła}}',
+'logentry-move-move-noredirect' => '$1 je stronu $3 do $4 {{GENDER:$2|přesunył|přesunyła}}, bjeztoho zo by dalesposrědkowanje {{GENDER:$2|wutworił|wutworiła}}',
+'logentry-move-move_redir' => '$1 je stronu $3 do $4 {{GENDER:$2|přesunył|přesunyła}} přepisujo dalesposrědkowanje',
+'logentry-move-move_redir-noredirect' => '$1 je stronu $3 do $4 {{GENDER:$2|přesunył|přesunyła}} přepisujo dalesposrědkowanje, bjeztoho zo by dalesposrědkowanje {{GENDER:$2|wutworił|wutworiła}}',
+'logentry-patrol-patrol' => '$1 je wersiju $4 strony $3 jako dohladowanu {{GENDER:$2|markěrował|markěrowała}}',
+'logentry-patrol-patrol-auto' => '$1 je wersiju $4 strony $3 awtomatisce jako dohladowanu {{GENDER:$2|markěrował|markěrowała}}',
+'logentry-newusers-newusers' => 'Wužiwarske konto $1 je so {{GENDER:$2|załožiło}}',
+'logentry-newusers-create' => 'Wužiwarske konto $1 je so {{GENDER:$2|załožiło}}',
+'logentry-newusers-create2' => '$1 je wužiwarske konto $3 {{GENDER:$2|załožił|załožiła}}',
+'logentry-newusers-byemail' => '$1 je wužiwarske konto $3 {{GENDER:$2|załožił|załožiła}} a hesło je so přez e-mejl pósłało.',
+'logentry-newusers-autocreate' => 'Wužiwarske konto $1 je so awtomatisce {{GENDER:$2|załožiło}}',
+'logentry-rights-rights' => '$1 je skupinske ÄÅ‚onstwo za $3 z $4 do $5 {{GENDER:$2|zmÄ›niÅ‚|zmÄ›niÅ‚a}}',
+'logentry-rights-rights-legacy' => '$1 je skupinske ÄÅ‚onstwo za $3 {{GENDER:$2|zmÄ›niÅ‚|zmÄ›niÅ‚a}}',
+'logentry-rights-autopromote' => '$1 je so awtomatisce wot $4 do $5 {{GENDER:$2|přirjadował|přirjadowała}}',
+'rightsnone' => '(niÄo)',
# Feedback
'feedback-bugornote' => 'Jeli sy zwólniwy, techniski problem nadrobnje wopisać, [$1 zdźěl prošu zmylk].
@@ -3755,6 +3807,7 @@ Hewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so s
'api-error-ok-but-empty' => 'Nutřkowny zmylk: žana wotmołwa wot serwera.',
'api-error-overwrite' => 'Přepisowanje eksistowaceje dataje njeje dowolene.',
'api-error-stashfailed' => 'Nutřkowny zmylk: Serwer njemóžeše nachwilnu dataju składować.',
+'api-error-publishfailed' => 'Nutřkowny zmylk: Serwer njemóžeše nachwilnu dataju wozjewić.',
'api-error-timeout' => 'Serwer njeje znutÅ™ka woÄakowaneho Äasa wotmoÅ‚wiÅ‚.',
'api-error-unclassified' => 'Njeznaty zmylk je wustupił.',
'api-error-unknown-code' => 'Njeznaty zmylk: "$1"',
@@ -3775,4 +3828,7 @@ Hewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so s
'duration-centuries' => '$1 {{PLURAL:$1|lětstotk|lětstotkaj|lětstotki|lětstotkow}}',
'duration-millennia' => '$1 {{PLURAL:$1|lěttysac|lěttysacaj|lěttysacy|lěttysacow}}',
+# Image rotation
+'rotate-comment' => 'Wobraz wo $1 {{PLURAL:$1|stopjeÅ„|stopnjej|stopnje|stopnjow}} w smÄ›rje Äasnika wjerćany',
+
);
diff --git a/languages/messages/MessagesHt.php b/languages/messages/MessagesHt.php
index 273f17bc..ef8f3eb9 100644
--- a/languages/messages/MessagesHt.php
+++ b/languages/messages/MessagesHt.php
@@ -107,7 +107,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'ChanjmanResan' ),
'Recentchangeslinked' => array( 'LyenChanjmanResan', 'ChanjmanAk' ),
'Revisiondelete' => array( 'RevizyonSiprime' ),
- 'RevisionMove' => array( 'DeplaseRevizyon' ),
'Search' => array( 'Chache', 'Fouye' ),
'Shortpages' => array( 'PajKout' ),
'Specialpages' => array( 'PajEspesyal' ),
@@ -285,7 +284,6 @@ $messages = array(
'qbbrowse' => 'Bouske',
'qbedit' => 'Modifye',
'qbpageoptions' => 'Paj sa a',
-'qbpageinfo' => 'Kontèks',
'qbmyoptions' => 'Paj mwen yo',
'qbspecialpages' => 'Paj espesyal',
'faq' => 'FAQ',
@@ -525,11 +523,8 @@ Rezon li bay yo se « ''$2'' ».",
# Login and logout pages
'logouttext' => "'''Ou dekonekte kounye a.'''
-Ou mèt kontinye itilize {{SITENAME}} san ou pa idantifye, oubyen ou ka [[Special:UserLogin|rekonekte]] w ankò ak menm non an oubyen yon lòt.
+Ou mèt kontinye itilize {{SITENAME}} san ou pa idantifye, oubyen ou ka <span class='plainlinks'>[$1 rekonekte]</span> w ankò ak menm non an oubyen yon lòt.
Note ke kèk paj gendwa afiche tankou ou te toujou konekte tank ou pa efase kach nan navigatè ou.",
-'welcomecreation' => '== Byenvini, $1 ! ==
-
-Kont ou an kreye. Pa bliye pèsonalize l nan [[Special:Preferences|preferans ou an sou paj sa {{SITENAME}}]].',
'yourname' => 'Non itilizatè ou an :',
'yourpassword' => 'Mopas ou an :',
'yourpasswordagain' => 'Mete mopas ou an ankò :',
@@ -776,7 +771,6 @@ Dènye ekriti nan jounal la parèt pi bas kòm referans:",
'template-protected' => '(pwoteje)',
'template-semiprotected' => '(semi-pwoteje)',
'hiddencategories' => 'Paj sa ap fè pati {{PLURAL:$1|Kategori kache|Kategori yo ki kache}} :',
-'nocreatetitle' => 'Kreyasyon paj yo limite',
'nocreatetext' => '{{SITENAME}} anpeche kreyasyon nouvo paj sou li. Ou mèt ritounen nan navigatè ou epi modifye yon paj ki deja egziste oubyen [[Special:UserLogin|konekte ou oubyen kreye yon kont]].',
'nocreate-loggedin' => 'Ou pa gen pèmisyon pou ou kapab kreye nouvo paj nan wiki sa.',
'sectioneditnotsupported-title' => 'Modifikasyon seksyon pa kapab fèt',
@@ -938,6 +932,10 @@ Si ou mete li, n ap itilize li pou nou ka nonmen ou pou kontribisyon ou yo.',
'grouppage-sysop' => '{{ns:project}}:Administratè',
+# Special:Log/newusers
+'newuserlogpage' => 'Jounal pou kreyasyon kont itilizatè yo',
+'newuserlogpagetext' => 'Men jounal, istorik kreyasyon kont itilizatè yo.',
+
# User rights log
'rightslog' => 'Jounal modifikasyon estati itilizatè yo',
@@ -1099,10 +1097,6 @@ Gade tou [[Special:WantedCategories|kategori moun mande]].',
# Special:LinkSearch
'linksearch' => 'Lyen andeyò',
-# Special:Log/newusers
-'newuserlogpage' => 'Jounal pou kreyasyon kont itilizatè yo',
-'newuserlogpagetext' => 'Men jounal, istorik kreyasyon kont itilizatè yo.',
-
# Special:ListGroupRights
'listgrouprights-members' => '(lis manm yo)',
@@ -1390,6 +1384,5 @@ Nenpòt lòt lyen nan menm liy nan konsidere kòm yon eksèpsyon, i.e. paj kote
# New logging system
'revdelete-restricted' => 'aplike restriksyon sa yo pou administratè yo',
-'newuserlog-byemail' => 'mopas an voye pa imèl',
);
diff --git a/languages/messages/MessagesHu.php b/languages/messages/MessagesHu.php
index 4196bba1..cb4e350b 100644
--- a/languages/messages/MessagesHu.php
+++ b/languages/messages/MessagesHu.php
@@ -138,7 +138,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Friss_változtatások' ),
'Recentchangeslinked' => array( 'Kapcsolódó_változtatások' ),
'Revisiondelete' => array( 'Változat_törlése' ),
- 'RevisionMove' => array( 'Változat_áthelyezése' ),
'Search' => array( 'Keresés' ),
'Shortpages' => array( 'Rövid_lapok' ),
'Specialpages' => array( 'Speciális_lapok' ),
@@ -447,6 +446,7 @@ $messages = array(
'newwindow' => '(új ablakban nyílik meg)',
'cancel' => 'Mégse',
'moredotdotdot' => 'Tovább…',
+'morenotlisted' => 'Tovább…',
'mypage' => 'Lapom',
'mytalk' => 'Vitalap',
'anontalk' => 'Az IP-címhez tartozó vitalap',
@@ -458,7 +458,6 @@ $messages = array(
'qbbrowse' => 'Böngészés',
'qbedit' => 'Szerkesztés',
'qbpageoptions' => 'Lapbeállítások',
-'qbpageinfo' => 'Lapinformáció',
'qbmyoptions' => 'Lapjaim',
'qbspecialpages' => 'Speciális lapok',
'faq' => 'GyIK',
@@ -481,6 +480,7 @@ $messages = array(
'namespaces' => 'Névterek',
'variants' => 'Változatok',
+'navigation-heading' => 'Navigációs menü',
'errorpagetitle' => 'Hiba',
'returnto' => 'Vissza a(z) $1 laphoz.',
'tagline' => 'A {{SITENAME}} wikiből',
@@ -717,11 +717,11 @@ A lezárást végrehajtó rendszergazda az alábbi indoklást adta meg: "$3".',
# Login and logout pages
'logouttext' => "'''Sikeresen kijelentkeztél.'''
-Folytathatod névtelenül a(z) {{SITENAME}} használatát, vagy [[Special:UserLogin|ismét bejelentkezhetsz]] ugyanezzel, vagy egy másik névvel.
+Folytathatod névtelenül a(z) {{SITENAME}} használatát, vagy <span class='plainlinks'>[$1 ismét bejelentkezhetsz]</span> ugyanezzel, vagy egy másik névvel.
Lehetséges, hogy néhány oldalon továbbra is azt látod, be vagy jelentkezve, mindaddig, amíg nem üríted a böngésződ gyorsítótárát.",
-'welcomecreation' => '== Köszöntünk, $1! ==
-A felhasználói fiókodat létrehoztuk.
-Ne felejtsd el átnézni a [[Special:Preferences|személyes beállításaidat]].',
+'welcomeuser' => 'Üdvözlünk, $1!',
+'welcomecreation-msg' => 'A felhasználói fiókod elkészült.
+Ne felejtsd el módosítani a [[Special:Preferences|{{SITENAME}} beállításaidat]].',
'yourname' => 'Szerkesztőneved:',
'yourpassword' => 'Jelszavad:',
'yourpasswordagain' => 'Jelszavad ismét:',
@@ -744,7 +744,7 @@ Ne felejtsd el átnézni a [[Special:Preferences|személyes beállításaidat]].
'gotaccount' => "Ha már korábban regisztráltál, '''$1'''.",
'gotaccountlink' => 'Bejelentkezés',
'userlogin-resetlink' => 'Elfelejtetted a bejelentkezési adataidat?',
-'createaccountmail' => 'e-mailben',
+'createaccountmail' => 'Ãtmeneti, véletlenszerű jelszó használata és kiküldése az alábbi e-mail címre',
'createaccountreason' => 'Indoklás:',
'badretype' => 'A megadott jelszavak nem egyeznek.',
'userexists' => 'A megadott felhasználónév már foglalt.
@@ -815,6 +815,7 @@ Várj egy kicsit, mielőtt újra próbálkozol.',
# Email sending
'php-mail-error-unknown' => 'Ismeretlen hiba a PHP mail() függvényében',
'user-mail-no-addy' => 'E-mail üzenetet próbáltál küldeni e-mail cím megadása nélkül.',
+'user-mail-no-body' => 'Üres vagy nagyon rövid email-t próbáltál küldeni.',
# Change password dialog
'resetpass' => 'Jelszó módosítása',
@@ -870,6 +871,7 @@ Ideiglenes jelszó: $2',
'changeemail-oldemail' => 'Jelenlegi e-mail cím:',
'changeemail-newemail' => 'Új e-mail cím:',
'changeemail-none' => '(nincs)',
+'changeemail-password' => 'A {{SITENAME}} jelszavad:',
'changeemail-submit' => 'E-mail cím megváltoztatása',
'changeemail-cancel' => 'Mégse',
@@ -1047,7 +1049,6 @@ A legutolsó ide vonatkozó naplóbejegyzés alább látható:",
'template-semiprotected' => '(félig védett)',
'hiddencategories' => 'Ez a lap {{PLURAL:$1|egy|$1}} rejtett kategóriába tartozik:',
'edittools' => '<!-- Ez a szöveg a szerkesztés és a feltöltés űrlap alatt lesz látható. -->',
-'nocreatetitle' => 'Az oldallétrehozás korlátozva van',
'nocreatetext' => 'A(z) {{SITENAME}} wikin korlátozták az új oldalak létrehozásának lehetőségét.
Visszamehetsz és szerkeszthetsz egy létező lapot, valamint [[Special:UserLogin|bejelentkezhetsz vagy készíthetsz egy felhasználói fiókot]].',
'nocreate-loggedin' => 'Nincs jogosultságod új lapokat létrehozni.',
@@ -1071,6 +1072,15 @@ Nem lett magyarázat csatolva.',
'edit-already-exists' => 'Az új lap nem készíthető el.
Már létezik.',
'defaultmessagetext' => 'Alapértelmezett szöveg',
+'content-failed-to-parse' => 'Hiba történt a $2 tartalom $1 modellre történő konvertálása során: $3',
+'invalid-content-data' => 'Érvénytelen tartalom adat',
+'content-not-allowed-here' => '"$1" tartalom nem engedélyezett a [[$2]] oldalon',
+
+# Content models
+'content-model-wikitext' => 'wikiszöveg',
+'content-model-text' => 'egyszerű szöveg',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Figyelem: ezen a lapon túl sok erőforrásigényes elemzőfüggvény-hívás található.
@@ -1428,9 +1438,9 @@ A műveletet nem lehet visszavonni.',
'prefs-emailconfirm-label' => 'E-mail cím megerősítése:',
'prefs-textboxsize' => 'A szerkesztőablak mérete',
'youremail' => 'Az e-mail címed:',
-'username' => 'Szerkesztőnév:',
-'uid' => 'Azonosító:',
-'prefs-memberingroups' => '{{PLURAL:$1|Csoporttagság|Csoporttagságok}}:',
+'username' => '{{GENDER:$1|Szerkesztőnév}}:',
+'uid' => '{{GENDER:$1|Azonosító}}:',
+'prefs-memberingroups' => '{{GENDER:$2|{{PLURAL:$1|Csoporttagság|Csoporttagságok}}}}:',
'prefs-registration' => 'Regisztráció ideje:',
'yourrealname' => 'Valódi neved:',
'yourlanguage' => 'A felület nyelve:',
@@ -1577,12 +1587,13 @@ A műveletet nem lehet visszavonni.',
'right-sendemail' => 'e-mail küldése más felhasználóknak',
'right-passwordreset' => 'Jelszó visszaállítási emailek megtekintése',
+# Special:Log/newusers
+'newuserlogpage' => 'Új szerkesztők naplója',
+'newuserlogpagetext' => 'Ez a napló az újonnan regisztrált szerkesztők listáját tartalmazza.',
+
# User rights log
'rightslog' => 'Szerkesztői jogosultságok naplója',
'rightslogtext' => 'Ez a rendszernapló a felhasználó jogosultságok változásait mutatja.',
-'rightslogentry' => 'megváltoztatta $1 szerkesztő felhasználó jogait (régi: $2; új: $3)',
-'rightslogentry-autopromote' => 'automatikusan $2 helyett $3 jogokat kapott',
-'rightsnone' => '(semmi)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lap olvasása',
@@ -1821,6 +1832,7 @@ Kérjük, hogy lépj kapcsolatba egy [[Special:ListUsers/sysop|adminisztrátorr
'backend-fail-notsame' => 'Egy nem azonos fájl már létezik $1 néven.',
'backend-fail-invalidpath' => '$1 nem érvényes tárolási útvonal.',
'backend-fail-delete' => 'Nem sikerült törölni ezt a fájlt: $1 .',
+'backend-fail-describe' => 'Nem lehet megváltoztatna a "$1" fájl metaadatát.',
'backend-fail-alreadyexists' => 'Ez a fájl már létezik: $1 .',
'backend-fail-store' => 'Nem sikerült a(z) $1 fájl tárolása $2 helyen.',
'backend-fail-copy' => 'Nem sikerült a(z) $1 fájl másolása $2 helyre.',
@@ -2200,8 +2212,9 @@ Lásd még a [[Special:WantedCategories|keresett kategóriák]] listáját.',
'linksearch-pat' => 'Keresett minta:',
'linksearch-ns' => 'Névtér:',
'linksearch-ok' => 'keresés',
-'linksearch-text' => 'Helyettesítő karaktereket is lehet használni, például "*.wikipedia.org". Legalább egy felső szintű tartománynak lennie kell, például "*.org"<br />
-Támogatott protokollok: <code>$1</code> (http:// az alapértelmezett, ha nincs protokoll megadva).',
+'linksearch-text' => 'Helyettesítő karaktereket is lehet használni, például "*.wikipedia.org".
+Legalább egy felső szintű tartománynak lennie kell, például "*.org"<br />
+Támogatott {{PLURAL:$2|protokoll|protokollok}}: <code>$1</code> (http:// az alapértelmezett, ha nincs protokoll megadva).',
'linksearch-line' => '$1 hivatkozva innen: $2',
'linksearch-error' => 'Helyettesítő karakterek csak a cím elején szerepelhetnek.',
@@ -2220,10 +2233,6 @@ Támogatott protokollok: <code>$1</code> (http:// az alapértelmezett, ha nincs
'activeusers-hidesysops' => 'Adminisztrátorok elrejtése',
'activeusers-noresult' => 'Nem található ilyen szerkesztő.',
-# Special:Log/newusers
-'newuserlogpage' => 'Új szerkesztők naplója',
-'newuserlogpagetext' => 'Ez a napló az újonnan regisztrált szerkesztők listáját tartalmazza.',
-
# Special:ListGroupRights
'listgrouprights' => 'Szerkesztői csoportok jogai',
'listgrouprights-summary' => 'Lenn láthatóak a wikiben létező szerkesztői csoportok, valamint az azokhoz tartozó jogok.
@@ -2318,20 +2327,22 @@ Ezután minden, a lapon vagy annak vitalapján történő változást ott fogsz
'enotif_mailer' => '{{SITENAME}} Értesítéspostázó',
'enotif_reset' => 'Az összes lap megjelölése felkeresettként',
-'enotif_newpagetext' => 'Ez egy új lap.',
'enotif_impersonal_salutation' => '{{SITENAME}} felhasználó',
-'changed' => 'megváltoztatta',
-'created' => 'létrehozta',
-'enotif_subject' => 'A(z) {{SITENAME}} $PAGETITLE című oldalát $CHANGEDORCREATED $PAGEEDITOR',
+'enotif_subject_deleted' => '$2 törölte a $1 {{SITENAME}} oldalt.',
+'enotif_subject_moved' => '$2 átmozgatta a $1 {{SITENAME}} oldalt.',
+'enotif_subject_restored' => '$2 visszaállította a $1 {{SITENAME}} oldalt.',
+'enotif_subject_changed' => '$2 megváltoztatta a $1 {{SITENAME}} oldalt.',
+'enotif_body_intro_deleted' => '$2 törölte a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd $3.',
+'enotif_body_intro_created' => '$2 létrehozta a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd az aktuális verziót itt: $3.',
+'enotif_body_intro_moved' => '$2 átmozgatta a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd az aktuális verziót itt: $3.',
+'enotif_body_intro_restored' => '$2 visszaállította a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd az aktuális verziót itt: $3.',
+'enotif_body_intro_changed' => '$2 megváltoztatta a $1 {{SITENAME}} oldalt $PAGEEDITDATE-kor, lásd az aktuális verziót itt: $3.',
'enotif_lastvisited' => 'Lásd a $1 lapot az utolsó látogatásod óta történt változtatásokért.',
'enotif_lastdiff' => 'Lásd a $1 lapot ezen változtatás megtekintéséhez.',
'enotif_anon_editor' => '$1 névtelen felhasználó',
'enotif_body' => 'Kedves $WATCHINGUSERNAME!
-
-$PAGEEDITOR $PAGEEDITDATE-kor $CHANGEDORCREATED a(z) $PAGETITLE című lapot a(z) {{SITENAME}} wikin; a jelenlegi verziót a $PAGETITLE_URL webcímen találod.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
A szerkesztési összefoglaló a következő volt: $PAGESUMMARY $PAGEMINOREDIT
@@ -2355,6 +2366,8 @@ $UNWATCHURL címet
Visszajelzés és további segítség:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'létrehozta',
+'changed' => 'megváltoztatta',
# Delete
'deletepage' => 'Lap törlése',
@@ -2510,7 +2523,7 @@ változatot visszaállították vagy eltávolították az archívumból.',
'undeletedrevisions' => '{{PLURAL:$1|egy|$1}} változat helyreállítva',
'undeletedrevisions-files' => '{{PLURAL:$1|egy|$1}} változat és {{PLURAL:$2|egy|$2}} fájl visszaállítva',
'undeletedfiles' => '{{PLURAL:$1|egy|$1}} fájl visszaállítva',
-'cannotundelete' => 'Nem lehet a lapot visszaállítani; lehet, hogy azt már valaki visszaállította.',
+'cannotundelete' => 'Lap visszaállítása sikertelen: $1',
'undeletedpage' => "'''$1 helyreállítva'''
Lásd a [[Special:Log/delete|törlési naplót]] a legutóbbi törlések és helyreállítások listájához.",
@@ -2541,7 +2554,7 @@ $1',
'blanknamespace' => '(FÅ‘)',
# Contributions
-'contributions' => 'Szerkesztő közreműködései',
+'contributions' => '{{GENDER:$1|Szerkesztő}} közreműködései',
'contributions-title' => '$1 közreműködései',
'mycontris' => 'Közreműködések',
'contribsub2' => '$1 ($2)',
@@ -2810,6 +2823,7 @@ Az átnevezés céljaként megadott „[[:$1]]†szócikk már létezik. Ha az
'immobile-target-namespace-iw' => 'Wikiközi hivatkozás nem lehet a lap új neve.',
'immobile-source-page' => 'Ez a lap nem nevezhető át.',
'immobile-target-page' => 'A lap nem helyezhető át a megadott címre.',
+'bad-target-model' => 'A kívánt célhely eltérő tartalom modellt használ. Nem lehet $1 modellről $2 modellre konvertálni.',
'imagenocrossnamespace' => 'A fájlok nem helyezhetőek át más névtérbe',
'nonfile-cannot-move-to-file' => 'Nem fájlok nem nevezhetők át fájlnévtérbe',
'imagetypemismatch' => 'Az új kiterjesztés nem egyezik meg a fájl típusával',
@@ -2940,7 +2954,6 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
# JavaScriptTest
'javascripttest' => 'JavaScript tesztelés',
-'javascripttest-disabled' => 'Ez a funkció nincs engedélyezve ebben a wikiben.',
'javascripttest-title' => '$1 tesztek futtatása',
'javascripttest-pagetext-noframework' => 'Ez az oldal JavaStript tesztek futtatására van fenntartva.',
'javascripttest-pagetext-unknownframework' => 'Ismeretlen teszt keretrendszer: $1.',
@@ -3089,11 +3102,13 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr
'pageinfo-default-sort' => 'Alapértelmezett rendezési kulcs',
'pageinfo-length' => 'Lap hossza (bájtokban)',
'pageinfo-article-id' => 'Lapazonosító',
+'pageinfo-language' => 'Laptartalom nyelve',
'pageinfo-robot-policy' => 'Kereső motor státusz',
'pageinfo-robot-index' => 'Indexelhető',
'pageinfo-robot-noindex' => 'Nem indexelhető',
'pageinfo-views' => 'Megtekintések száma',
'pageinfo-watchers' => 'Figyelők száma',
+'pageinfo-few-watchers' => 'Kevesebb mint $1 szerkesztő figyeli',
'pageinfo-redirects-name' => 'Ãtirányítások erre a lapra',
'pageinfo-subpages-name' => 'A lap allapjai',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|átirányítás}}; $3 {{PLURAL:$3|nem átirányítás}})',
@@ -3108,6 +3123,16 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr
'pageinfo-magic-words' => 'Varázs{{PLURAL:$1|szó|szavak}} ($1)',
'pageinfo-hidden-categories' => 'Rejtett {{PLURAL:$1|kategória|kategóriák}} ($1)',
'pageinfo-templates' => 'Felhasznált {{PLURAL:$1|sablon|sablonok}} ($1)',
+'pageinfo-toolboxlink' => 'Lapinformációk',
+'pageinfo-redirectsto' => 'Ãtirányítás ide',
+'pageinfo-redirectsto-info' => 'infó',
+'pageinfo-contentpage' => 'Tartalmi lapnak számít',
+'pageinfo-contentpage-yes' => 'Igen',
+'pageinfo-protect-cascading-yes' => 'Igen',
+'pageinfo-category-info' => 'Kategória információk',
+'pageinfo-category-pages' => 'Lapok száma',
+'pageinfo-category-subcats' => 'Alkategóriák száma',
+'pageinfo-category-files' => 'Fájlok száma',
# Skin names
'skinname-standard' => 'Klasszikus',
@@ -3129,6 +3154,8 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr
'markedaspatrollederror' => 'Nem lehet ellenőrzöttnek jelölni',
'markedaspatrollederrortext' => 'Meg kell adnod egy ellenőrzöttként megjelölt változatot.',
'markedaspatrollederror-noautopatrol' => 'A saját változtatásaid megjelölése ellenőrzöttként nem engedélyezett.',
+'markedaspatrollednotify' => '$1 változtatása ellenőrzöttnek lett jelölve.',
+'markedaspatrollederrornotify' => 'Nem sikerült ellenőrzöttnek jelölni.',
# Patrol log
'patrol-log-page' => 'Ellenőrzési napló (patrol)',
@@ -3162,6 +3189,7 @@ A futtatása során kárt tehet a számítógépedben.",
'file-nohires' => 'Nem érhető el nagyobb felbontású változat.',
'svg-long-desc' => 'SVG fájl, névlegesen $1 × $2 képpont, fájlméret: $3',
'svg-long-desc-animated' => 'Animált SVG fájl, névlegesen $1 × $2 képpont, fájlméret: $3',
+'svg-long-error' => 'Érvénytelen SVG-fájl: $1',
'show-big-image' => 'A kép nagyfelbontású változata',
'show-big-image-preview' => 'Az előnézet mérete: $1',
'show-big-image-other' => 'További {{PLURAL:$2|felbontás|felbontások}}: $1.',
@@ -3191,7 +3219,10 @@ A futtatása során kárt tehet a számítógépedben.",
'minutes' => '{{PLURAL:$1|egy|$1}} perccel',
'hours' => '{{PLURAL:$1|egy|$1}} órával',
'days' => '{{PLURAL:$1|egy|$1}} nappal',
+'months' => '{{PLURAL:$1|$1 hónap|$1 hónap}}',
+'years' => '{{PLURAL:$1|$1 év|$1 év}}',
'ago' => '$1 ezelőtt',
+'just-now' => 'épp most',
# Bad image list
'bad_image_list' => 'A formátum a következő:
@@ -3687,6 +3718,7 @@ Ez a megerősítő e-mail $4-ig érvényes.',
# Scary transclusion
'scarytranscludedisabled' => '[Wikiközi beillesztés le van tiltva]',
'scarytranscludefailed' => '[$1 sablon letöltése sikertelen]',
+'scarytranscludefailed-httpstatus' => ' [Nem sikerült betölteni a(z) $1 sablont: HTTP $2]',
'scarytranscludetoolong' => '[Az URL túl hosszú]',
# Delete conflict
@@ -3798,6 +3830,7 @@ minden egyes sor egy figyelt lap címe. Ha kész vagy, kattints a lista alatt ta
'version-license' => 'Licenc',
'version-poweredby-credits' => "Ez a wiki '''[//www.mediawiki.org/ MediaWiki]''' szoftverrel működik, copyright © 2001-$1 $2.",
'version-poweredby-others' => 'mások',
+'version-credits-summary' => 'Szeretnénk elismerni a következő személyek hozzájárulását a [[Special:Version|MediaWiki]] szoftverhez.',
'version-license-info' => 'A MediaWiki szabad szoftver, terjeszthető és / vagy módosítható a GNU General Public License alatt, amit a Free Software Foundation közzétett; vagy a 2-es verziójú licenc, vagy (az Ön választása alapján) bármely későbbi verzió szerint.
A MediaWikit abban a reményben terjesztjük, hogy hasznos lesz, de GARANCIA NÉLKÃœL, anélkül, hogy PIACKÉPES vagy HASZNÃLHATÓ LENNE EGY ADOTT CÉLRA. Lásd a GNU General Public License-t a további részletekért.
@@ -3913,14 +3946,14 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozzÃ
# New logging system
'logentry-delete-delete' => '$1 törölte a következő lapot: $3',
'logentry-delete-restore' => '$1 helyreállította a következő lapot: $3',
-'logentry-delete-event' => '$1 megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát $3 lapon: $4',
+'logentry-delete-event' => '$1 megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát a(z) $3 című lapon: $4',
'logentry-delete-revision' => '$1 módosította a(z) $3 című lap {{PLURAL:$5|egy|$1}} lapváltozatának láthatóságát: $4',
'logentry-delete-event-legacy' => '$1 módosította a(z) $3 című lap naplóbejegyzéseinek láthatóságát',
'logentry-delete-revision-legacy' => '$1 módosította a(z) $3 című lap lapváltozatainak láthatóságát',
'logentry-suppress-delete' => '$1 elrejtette a következő lapot: $3',
-'logentry-suppress-event' => '$1 rejtetten megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát $3 lapon: $4',
-'logentry-suppress-revision' => '$1 rejtetten megváltoztatta {{PLURAL:$5|egy változat|$5 változat}} láthatóságát $3 lapon: $4',
-'logentry-suppress-event-legacy' => '$1 rejtetten megváltoztatta napló bejegyzések láthatóságát a(z) $3 lapon',
+'logentry-suppress-event' => '$1 rejtetten megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát a(z) $3 című lapon: $4',
+'logentry-suppress-revision' => '$1 rejtetten megváltoztatta {{PLURAL:$5|egy változat|$5 változat}} láthatóságát a(z) $3 című lapon: $4',
+'logentry-suppress-event-legacy' => '$1 rejtetten megváltoztatta napló bejegyzések láthatóságát a(z) $3 című lapon',
'logentry-suppress-revision-legacy' => '$1 rejtetten megváltoztatta változatok láthatóságát a(z) $3 lapon',
'revdelete-content-hid' => 'tartalom elrejtve',
'revdelete-summary-hid' => 'szerkesztési összefoglaló elrejtve',
@@ -3939,8 +3972,12 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozzÃ
'logentry-newusers-newusers' => '$1 felhasználói fiók létrehozva',
'logentry-newusers-create' => '$1 felhasználói fiók létrehozva',
'logentry-newusers-create2' => '$1 létrehozta $3 felhasználói fiókját',
+'logentry-newusers-byemail' => 'Szerkesztői lap $3 néven létrehozva $1 által, jelszó kiküldve emailben.',
'logentry-newusers-autocreate' => '$1 fiók automatikusan létrehozva',
-'newuserlog-byemail' => 'a jelszót kiküldtük a megadott e-mail címre',
+'logentry-rights-rights' => '$1 megváltoztatta $3 csoporttagságát erről: $4 erre: $5',
+'logentry-rights-rights-legacy' => '$1 megváltoztatta $3 csoporttagságát',
+'logentry-rights-autopromote' => '$1 automatikusan előléptetve erről: $4 erre: $5',
+'rightsnone' => '(semmi)',
# Feedback
'feedback-bugornote' => 'Ha kész technikai problémát részletesen leírni, akkor kérjük [$1 jelents egy hibát]. Egyébként használd az alábbi űrlapot. A hozzászólásod a „[$3 $2]†laphoz kerül felvételre, a szerkesztő neveddel és böngésződ típusával együtt.',
@@ -3993,6 +4030,7 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozzÃ
'api-error-ok-but-empty' => 'Belső hiba: nem érkezett válasz a kiszolgálótól.',
'api-error-overwrite' => 'Létező fájlok felülírására nem engedélyezett.',
'api-error-stashfailed' => 'Belső hiba: a kiszolgálünak nem sikerült eltárolni az ideiglenes fájlt.',
+'api-error-publishfailed' => 'Belső hiba: a kiszolgálónak nem sikerült közzétennie az ideiglenes fájlt.',
'api-error-timeout' => 'A kiszolgáló nem adott választ a várt időn belül.',
'api-error-unclassified' => 'Ismeretlen hiba történt',
'api-error-unknown-code' => 'Ismeretlen hiba: „$1â€',
@@ -4013,4 +4051,7 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozzÃ
'duration-centuries' => '{{PLURAL:$1|egy|$1}} évszázad',
'duration-millennia' => '{{PLURAL:$1|egy|$1}} évezred',
+# Image rotation
+'rotate-comment' => 'Elforgattam a képet $1 fokkal, az óramutató járásával megegyező irányban',
+
);
diff --git a/languages/messages/MessagesHy.php b/languages/messages/MessagesHy.php
index 973782ed..d1ab9720 100644
--- a/languages/messages/MessagesHy.php
+++ b/languages/messages/MessagesHy.php
@@ -202,7 +202,7 @@ $specialPageAliases = array(
'Allmessages' => array( 'Ô²Õ¸Õ¬Õ¸Ö€Õ¸Ö‚Õ²Õ¥Ö€Õ±Õ¶Õ¥Ö€Õ¨' ),
'Allpages' => array( 'Ô²Õ¸Õ¬Õ¸Ö€Õ§Õ»Õ¥Ö€Õ¨' ),
'Ancientpages' => array( 'Ô±Õ´Õ¥Õ¶Õ¡Õ°Õ«Õ¶Õ§Õ»Õ¥Ö€Õ¨' ),
- 'Block' => array( 'Ô±Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬ip' ),
+ 'Block' => array( 'Ô±Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬ Õ¡ÕµÖƒÕ«Õ¶' ),
'Blockme' => array( 'Ô±Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬' ),
'Booksources' => array( 'Ô³Ö€Ö„Õ¡ÕµÕ«Õ¶Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¶Õ¥Ö€Õ¨' ),
'BrokenRedirects' => array( 'Ô¿Õ¸Õ¿Ö€Õ¾Õ¡Õ®Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨' ),
@@ -216,7 +216,7 @@ $specialPageAliases = array(
'Export' => array( 'Ô±Ö€Õ¿Õ¡Õ°Õ¡Õ¶Õ¥Õ¬Õ§Õ»Õ¥Ö€Õ¨' ),
'FileDuplicateSearch' => array( 'Ô¿Ö€Õ¯Õ¶Ö…Ö€Õ«Õ¶Õ¡Õ¯Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ«Õ¸Ö€Õ¸Õ¶Õ¸Ö‚Õ´' ),
'Import' => array( 'Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¥Õ¬' ),
- 'BlockList' => array( 'Ô±Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ®IPÕ¶Õ¥Ö€Õ¨' ),
+ 'BlockList' => array( 'Ô±Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ¡ÕµÖƒÕ« Õ¶Õ¥Ö€Õ¨' ),
'Listadmins' => array( 'Ô±Õ¤Õ´Õ«Õ¶Õ¶Õ¥Ö€Õ«ÖÕ¡Õ¶Õ¯Õ¨' ),
'Listfiles' => array( 'ÕŠÕ¡Õ¿Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ«ÖÕ¡Õ¶Õ¯Õ¨' ),
'Listredirects' => array( 'Õ‘Õ¸Ö‚ÕµÖÕ¿Õ¡Õ¬Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨' ),
@@ -417,7 +417,6 @@ $messages = array(
'qbbrowse' => 'Ô¹Õ¥Ö€Õ©Õ¥Õ¬',
'qbedit' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬',
'qbpageoptions' => 'Ô±ÕµÕ½ Õ§Õ»Õ¨',
-'qbpageinfo' => 'Õ€Õ¸Õ¤Õ¾Õ¡Õ®Õ« Õ´Õ¡Õ½Õ«Õ¶',
'qbmyoptions' => 'Ô»Õ´ Õ§Õ»Õ¥Ö€Õ¨',
'qbspecialpages' => 'ÕÕºÕ¡Õ½Õ¡Ö€Õ¯Õ¸Õ² Õ§Õ»Õ¥Ö€',
'faq' => 'Õ€ÕÕ€',
@@ -439,6 +438,7 @@ $messages = array(
'namespaces' => 'Ô±Õ¶Õ¾Õ¡Õ¶Õ¡Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¶Õ¥Ö€',
'variants' => 'ÕÕ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€',
+'navigation-heading' => 'Õ†Õ¡Õ¾Õ«Õ£Õ¡ÖÕ«Õ¸Õ¶ ÖÕ¡Õ¶Õ¯',
'errorpagetitle' => 'ÕÕ­Õ¡Õ¬',
'returnto' => 'ÕŽÕ¥Ö€Õ¡Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬ $1Ö‰',
'tagline' => '{{SITENAME}}ÕµÕ«Ö',
@@ -667,10 +667,10 @@ $2',
# Login and logout pages
'logouttext' => "'''Ô´Õ¸Ö‚Ö„ Õ¤Õ¸Ö‚Ö€Õ½ Õ¥Õ¯Õ¡Ö„ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ«ÖÖ‰'''
-Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ {{SITENAME}} Õ¯Õ¡ÕµÖ„Õ¨ Õ¡Õ¶Õ¡Õ¶Õ¸Ö‚Õ¶, Õ¯Õ¡Õ´ [[Special:UserLogin|Õ¯Ö€Õ¯Õ«Õ¶ Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£]] Õ¶Õ¸Ö‚ÕµÕ¶ Õ¯Õ¡Õ´ Õ´Õ¥Õ¯ Õ¡ÕµÕ¬ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¡Õ¶Õ¾Õ¡Õ´Õ¢Ö‰ Ô» Õ¶Õ¯Õ¡Õ¿Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¥Ö„, Õ¸Ö€ Õ¸Ö€Õ¸Õ· Õ§Õ»Õ¥Ö€ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¾Õ¥Õ¬ Õ¡ÕµÕ¶ÕºÕ¥Õ½Õ Õ«Õ¶Õ¹ÕºÕ¥Õ½ Õ¥Õ©Õ¥ Õ¤Õ¥Õ¼ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¸Ö‚Õ´ Õ¬Õ«Õ¶Õ¥Õ«Ö„ Õ´Õ«Õ¶Õ¹Ö‡ Õ¸Ö€ Õ¹Õ»Õ¶Õ»Õ¥Ö„ Õ±Õ¥Ö€ Õ¦Õ¶Õ¶Õ¡Ö€Õ¯Õ«Õ¹Õ« Õ°Õ«Õ·Õ¡ÕºÕ¡Õ°Õ¥Õ½Õ¿Õ¨Ö‰",
-'welcomecreation' => '== Ô²Õ¡Ö€Õ«Õ› Õ£Õ¡Õ¬Õ¸Ö‚Õ½Õ¿, $1 ==
-ÕÕ¥Ö€ Õ°Õ¡Õ·Õ«Õ¾Õ¨ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¡Õ® Õ§Ö‰
-Õ‰Õ´Õ¸Õ¼Õ¡Õ¶Õ¡Ö„ Õ¡Õ¶Õ±Õ¶Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ Õ±Õ¥Ö€ [[Special:Preferences|Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨]]Ö‰',
+Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ {{SITENAME}} Õ¯Õ¡ÕµÖ„Õ¨ Õ¡Õ¶Õ¡Õ¶Õ¸Ö‚Õ¶, Õ¯Õ¡Õ´ <span class='plainlinks'>[$1 Õ¯Ö€Õ¯Õ«Õ¶ Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£]</span> Õ¶Õ¸Ö‚ÕµÕ¶ Õ¯Õ¡Õ´ Õ´Õ¥Õ¯ Õ¡ÕµÕ¬ Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¡Õ¶Õ¾Õ¡Õ´Õ¢Ö‰ Ô» Õ¶Õ¯Õ¡Õ¿Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¥Ö„, Õ¸Ö€ Õ¸Ö€Õ¸Õ· Õ§Õ»Õ¥Ö€ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¾Õ¥Õ¬ Õ¡ÕµÕ¶ÕºÕ¥Õ½Õ Õ«Õ¶Õ¹ÕºÕ¥Õ½ Õ¥Õ©Õ¥ Õ¤Õ¥Õ¼ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¸Ö‚Õ´ Õ¬Õ«Õ¶Õ¥Õ«Ö„ Õ´Õ«Õ¶Õ¹Ö‡ Õ¸Ö€ Õ¹Õ»Õ¶Õ»Õ¥Ö„ Õ±Õ¥Ö€ Õ¦Õ¶Õ¶Õ¡Ö€Õ¯Õ«Õ¹Õ« Õ°Õ«Õ·Õ¡ÕºÕ¡Õ°Õ¥Õ½Õ¿Õ¨Ö‰",
+'welcomeuser' => 'Բարի գալո՜ւստ, $1',
+'welcomecreation-msg' => 'ÕÕ¥Ö€ Õ°Õ¡Õ·Õ«Õ¾Õ¶ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¡Õ® Õ§Ö‰
+Õ‰Õ´Õ¸Õ¼Õ¡Õ¶Õ¡Ö„ ÖƒÕ¸ÖƒÕ¸Õ­Õ¥Õ¬ Õ±Õ¥Ö€ [[Special:Preferences|Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨]]Ö‰',
'yourname' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¡Õ¶Õ¸Ö‚Õ¶Õ',
'yourpassword' => 'Ô³Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ',
'yourpasswordagain' => 'Ô¿Ö€Õ¯Õ¶Õ¥Ö„ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨',
@@ -791,6 +791,7 @@ $2',
'changeemail-oldemail' => 'Õ†Õ¥Ö€Õ¯Õ¡ էլ․ Õ°Õ¡Õ½Öե․',
'changeemail-newemail' => 'Õ†Õ¸Ö€ էլ․ Õ°Õ¡Õ½Öե․',
'changeemail-none' => '(Õ¸Õ¹ Õ´Õ«)',
+'changeemail-password' => 'Õ”Õ¸ {{SITENAME}} Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨Õ',
'changeemail-submit' => 'Õ“Õ¸Õ­Õ¥Õ¬ էլ․ Õ°Õ¡Õ½ÖÕ¥Õ¶',
'changeemail-cancel' => 'Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬',
@@ -988,7 +989,6 @@ $2',
<charinsert>Ù¼ Ú… Ú Ú‰ Ú“ Ú– Úš Ú« Ú¼ ؤ ÙŠ Û Û Ø¦ </charinsert>
<charinsert>{{{+}}} {{+}} {{subst:+}} <noinclude>+</noinclude></charinsert>
</p></div>',
-'nocreatetitle' => 'Ô·Õ»Õ¥Ö€Õ« Õ½Õ¿Õ¥Õ²Õ®Õ¸Ö‚Õ´Õ¨ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§',
'nocreatetext' => '{{SITENAME}} Õ¯Õ¡ÕµÖ„Õ¸Ö‚Õ´ Õ§Õ»Õ¥Ö€Õ« Õ½Õ¿Õ¥Õ²Õ®Õ´Õ¡Õ¶ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¡ÖƒÕ¡Õ¯Õ¾Õ¡Õ® Õ§Ö‰
Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¾Õ¥Ö€Õ¡Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬ Ö‡ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Õ£Õ¸ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ¥ÖÕ¸Õ² Õ§Õ» Õ¯Õ¡Õ´ Õ§Õ¬ [[Special:UserLogin|Õ£Ö€Õ¡Õ¶ÖÕ¾Õ¥Õ¬ Õ¯Õ¡Õ´ Õ´Õ¿Õ¶Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£]]Ö‰',
'nocreate-loggedin' => 'Ô´Õ¸Ö‚Ö„ Õ¹Õ¸Ö‚Õ¶Õ¥Ö„ Õ¶Õ¸Ö€ Õ§Õ»Õ¥Ö€ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬Õ¸Ö‚ Õ©Õ¸Ö‚ÕµÕ¬Õ¿Õ¾Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Ö‰',
@@ -1005,6 +1005,10 @@ $2',
'edit-no-change' => 'ÕÕ¥Ö€ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¨ Õ¡Õ¶Õ¿Õ¥Õ½Õ¾Õ¥Õ¬ Õ§, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ¸Õ¹ Õ´Õ« ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¹Õ« Õ¯Õ¡Õ¿Õ¡Ö€Õ¾Õ¥Õ¬ Õ¿Õ¥Ö„Õ½Õ¿Õ« Õ´Õ¥Õ»Ö‰',
'defaultmessagetext' => 'Ô¼Õ¼Õ¥Õ¬ÕµÕ¡Õ¶ Õ¿Õ¥Ö„Õ½Õ¿Õ¨',
+# Content models
+'content-model-wikitext' => 'Õ¾Õ«Ö„Õ«Õ¿Õ¥Ö„Õ½Õ¿',
+'content-model-javascript' => 'Õ‹Õ¡Õ¾Õ¡ÕÕ¯Ö€Õ«ÕºÕ¿',
+
# "Undo" feature
'undo-success' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ°Õ¥Õ¿ Õ·Ö€Õ»Õ¾Õ¥Õ¬Ö‰ ÕÕ¿Õ¸Ö‚Õ£Õ¥Ö„ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¥Õ´Õ¡Õ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ½Õ¿Õ¸Ö€Ö‡, Õ¸Ö€ÕºÕ¥Õ½Õ¦Õ« Õ°Õ¡Õ´Õ¸Õ¦Õ¾Õ¥Ö„, Õ¸Ö€ Õ¤Õ¡ Õ§ Õ±Õ¥Õ¦ Õ°Õ¥Õ¿Õ¡Ö„Ö€Ö„Ö€Õ¸Õ² ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Ö‡ Õ´Õ¡Õ¿Õ¶Õ¡Õ°Õ¡Ö€Õ¥Ö„ «Հիշել Õ§Õ»Õ¨Â»Õ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶ Õ¡Õ¾Õ¡Ö€Õ¿Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
'undo-failure' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¨ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ°Õ¥Õ¿ Õ·Ö€Õ»Õ¾Õ¥Õ¬ Õ´Õ«Õ»Õ¡Õ¶Õ¯ÕµÕ¡Õ¬ Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« Õ¨Õ¶Õ¤Õ°Õ¡Ö€Õ´Õ¡Õ¶ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¸Õ¾Ö‰',
@@ -1258,9 +1262,9 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'prefs-emailconfirm-label' => 'Ô·Õ¬-ÖƒÕ¸Õ½Õ¿Õ« Õ¾Õ¡Õ¾Õ¥Ö€Õ¡Öում․',
'prefs-textboxsize' => 'Ô½Õ´Õ¢Õ¡Õ£Ö€Õ´Õ¡Õ¶ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ« Õ¹Õ¡ÖƒÕ¨',
'youremail' => 'Ô·Õ¬Õ¥Õ¯Õ¿Ö€Õ¸Õ¶Õ¡ÕµÕ«Õ¶ ÖƒÕ¸Õ½Õ¿.',
-'username' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¡Õ¶Õ¸Ö‚Õ¶Õ',
-'uid' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ«Õ¤Õ¥Õ¶Õ¿Õ«Ö†Õ«Õ¯Õ¡Õ¿Õ¸Ö€Õ',
-'prefs-memberingroups' => 'Ô±Õ¶Õ¤Õ¡Õ´Õ¡Õ¯ÖÕ¸Ö‚Õ©ÕµÕ¡Õ¶ {{PLURAL:$1|Õ­Õ¸Ö‚Õ´Õ¢|Õ­Õ´Õ¢Õ¥Ö€}}Õ',
+'username' => '{{GENDER:$1|Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¡Õ¶Õ¸Ö‚Õ¶}}Õ',
+'uid' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ«Õ¤Õ¥Õ¶Õ¿Õ«Ö†Õ«Õ¯Õ¡Õ¿Õ¸Ö€.',
+'prefs-memberingroups' => 'Ô±Õ¶Õ¤Õ¡Õ´Õ¡Õ¯ÖÕ¸Ö‚Õ©ÕµÕ¡Õ¶ {{PLURAL:$1|Õ­Õ¸Ö‚Õ´Õ¢|Õ­Õ´Õ¢Õ¥Ö€}}.',
'prefs-registration' => 'Ô³Ö€Õ¡Õ¶ÖÕ´Õ¡Õ¶ ամսաթիվը․',
'yourrealname' => 'ÕÕ¥Ö€ Õ«Ö€Õ¡Õ¯Õ¡Õ¶ Õ¡Õ¶Õ¸Ö‚Õ¶Õ¨.',
'yourlanguage' => 'Ô»Õ¶Õ¿Õ¥Ö€Ö†Õ¥ÕµÕ½Õ« Õ¬Õ¥Õ¦Õ¸Ö‚Õ¶.',
@@ -1349,11 +1353,13 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
'right-upload_by_url' => 'Ô²Õ¥Õ¼Õ¶Õ¥Õ¬ Õ¶Õ«Õ·Ö„Õ¥Ö€ Õ«Õ¶Õ¿Õ¥Ö€Õ¶Õ¥Õ¿Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ½ÖÕ¥Õ«Ö',
'right-delete' => 'Ô·Õ»Õ¥Ö€Õ« Õ»Õ¶Õ»Õ¸Ö‚Õ´',
+# Special:Log/newusers
+'newuserlogpage' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ£Ö€Õ¡Õ¶ÖÕ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶',
+'newuserlogpagetext' => 'ÕÕ¡ Õ¶Õ¸Ö€ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ£Ö€Õ¡Õ¶ÖÕ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¶ Õ§.',
+
# User rights log
'rightslog' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ«Ö€Õ¡Õ¾Õ¸Ö‚Õ¶Ö„Õ¶Õ¥Ö€Õ« Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶',
'rightslogtext' => 'ÕÕ¡ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ«Ö€Õ¡Õ¾Õ¸Ö‚Õ¶Ö„Õ¶Õ¥Ö€Õ« ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¶ Õ§Ö‰',
-'rightslogentry' => '$1 Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¡Õ¶Õ¤Õ¡Õ´Õ¡Õ¯ÖÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ ÖƒÕ¸Õ­Õ¾Õ¥Õ¬ Õ§ $2-Õ«Ö $3',
-'rightsnone' => '(Õ¸Õ¹ Õ´Õ«)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'Õ­Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ¨',
@@ -1617,6 +1623,8 @@ $3 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ¿Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨. ''$2''",
Õ“Õ¸Õ­Õ¡Ö€Õ¥Õ¶Õ¨ Õ¶Ö€Õ¡Õ¶Ö„, Õ°Õ¡Õ¾Õ¡Õ¶Õ¡Õ¢Õ¡Ö€, ÕºÕ¥Õ¿Ö„ Õ§ Õ°Õ²Õ¥Õ¶ Õ°Õ¡Õ´Õ¡ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶ Õ©Õ¥Õ´Õ¡ÕµÕ«Õ¶Ö‰<br />
Ô·Õ»Õ¨ Õ°Õ¡Õ´Õ¡Ö€Õ¾Õ¸Ö‚Õ´ Õ§ Õ¥Ö€Õ¯Õ«Õ´Õ¡Õ½Õ¿Õ¸Ö‚Õ©ÕµÕ¡Õ¶ ÖƒÕ¡Ö€Õ¡Õ¿Õ´Õ¡Õ¶ Õ§Õ», Õ¥Õ©Õ¥ Õ¡ÕµÕ¶ ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ§ [[MediaWiki:Disambiguationspage]] Õ§Õ»Õ¸Ö‚Õ´ Õ¨Õ¶Õ¤Õ£Ö€Õ¯Õ¾Õ¡Õ® Õ¯Õ¡Õ²Õ¡ÕºÕ¡Ö€Õ¶Õ¥Ö€Õ«Ö Õ¸Ö€Ö‡Õ§ Õ´Õ¥Õ¯Õ¨Ö‰',
+'pageswithprop-submit' => 'Ô±Õ¶ÖÕ¶Õ¥Õ¬',
+
'doubleredirects' => 'Ô¿Ö€Õ¯Õ¶Õ¡Õ¯Õ« Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¸Ö‚Õ´Õ¶Õ¥Ö€',
'doubleredirectstext' => 'Ô±ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´ Õ¢Õ¥Ö€Õ¾Õ¡Õ® Õ¥Õ¶ Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ´Õ¡Õ¶ Õ§Õ»Õ¥Ö€Õ«Õ¶ Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¸Õ² Õ§Õ»Õ¥Ö€Õ¨Ö‰ Õ…Õ¸Ö‚Ö€Õ¡Ö„Õ¡Õ¶Õ¹ÕµÕ¸Ö‚Ö€ Õ¿Õ¸Õ² ÕºÕ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ§ Õ°Õ²Õ¸Ö‚Õ´Õ¶Õ¥Ö€ Õ¤Õ¥ÕºÕ« Õ¡Õ¼Õ¡Õ»Õ«Õ¶ Ö‡ Õ¥Ö€Õ¯Ö€Õ¸Ö€Õ¤ Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨, Õ«Õ¶Õ¹ÕºÕ¥Õ½ Õ¶Õ¡Ö‡ Õ¥Ö€Õ¯Ö€Õ¸Ö€Õ¤ Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ´Õ¡Õ¶ Õ¶ÕºÕ¡Õ¿Õ¡Õ¯Õ¡ÕµÕ«Õ¶ Õ§Õ»Õ« Õ¡Õ¼Õ¡Õ»Õ«Õ¶ Õ¿Õ¸Õ²Õ¨, Õ¸Ö€Õ¸Ö‚Õ´ Õ½Õ¸Õ¾Õ¸Ö€Õ¡Õ¢Õ¡Ö€ Õ¶Õ·Õ¾Õ¡Õ® Õ§ Õ§Õ»Õ« Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¨, Õ¸Ö€Õ«Õ¶ ÕºÕ¥Õ¿Ö„ Õ§ Õ°Õ²Õ« Õ¶Õ¡Ö‡ Õ¡Õ¼Õ¡Õ»Õ«Õ¶ Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¸Ö‚Õ´Õ¨Ö‰',
'double-redirect-fixed-move' => '«[[$1]]» էջը վերանվանված է և այժմ վերահղում է «[[$2]]» էջին։',
@@ -1751,10 +1759,6 @@ $1-Õ¨ Õ°Õ²Õ¾Õ¥Õ¬ Õ§ $2 Õ«Ö',
'activeusers' => 'Ô±Õ¯Õ¿Õ«Õ¾ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯',
'activeusers-noresult' => 'Ô±ÕµÕ¤ÕºÕ«Õ½Õ« Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€ Õ¹Õ¥Õ¶ Õ£Õ¿Õ¶Õ¾Õ¥Õ¬Ö‰',
-# Special:Log/newusers
-'newuserlogpage' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ£Ö€Õ¡Õ¶ÖÕ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶',
-'newuserlogpagetext' => 'ÕÕ¡ Õ¶Õ¸Ö€ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¶Õ¥Ö€Õ« Õ£Ö€Õ¡Õ¶ÖÕ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶Õ¶ Õ§.',
-
# Special:ListGroupRights
'listgrouprights-members' => '(Õ¡Õ¶Õ¤Õ¡Õ´Õ¶Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯)',
'listgrouprights-addgroup' => 'Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¥Õ¬ {{PLURAL:$2|Õ­Õ¸Ö‚Õ´Õ¢|Õ­Õ´Õ¢Õ¥Ö€}}Õ $1',
@@ -1825,11 +1829,11 @@ $1-Õ¨ Õ°Õ²Õ¾Õ¥Õ¬ Õ§ $2 Õ«Ö',
'enotif_mailer' => '{{grammar:genitive|{{SITENAME}}}} ÕÕ¥Õ²Õ¥Õ¯Õ¡ÖÕ´Õ¡Õ¶ Õ®Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶',
'enotif_reset' => 'Õ†Õ·Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ§Õ»Õ¥Ö€Õ¨ Õ¡ÕµÖÕ¥Õ¬Õ¾Õ¡Õ®',
-'enotif_newpagetext' => 'ÕÕ¡ Õ¶Õ¸Ö€ Õ§Õ» Õ§Ö‰',
'enotif_impersonal_salutation' => '{{grammar:genitive|{{SITENAME}}}} Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«Ö',
-'changed' => 'ÖƒÕ¸ÖƒÕ¸Õ­Õ¾Õ¡Õ® Õ§',
-'created' => 'Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¡Õ® Õ§',
-'enotif_subject' => '{{grammar:genitive|{{SITENAME}}}} «$PAGETITLE» Õ§Õ»Õ¨ $CHANGEDORCREATED $PAGEEDITOR Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¯Õ¸Õ²Õ´Õ«Ö',
+'enotif_subject_deleted' => '{{SITENAME}} Õ§Õ»Õ¨ $1 {{GENDER:$2|Õ»Õ¶Õ»Õ¾Õ¥Õ¬ Õ§}} $2-Õ« Õ¯Õ¸Õ²Õ´Õ«Ö',
+'enotif_subject_created' => '{{SITENAME}} Õ§Õ»Õ¨ $1 {{GENDER:$2|Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¬ Õ§}} $2-Õ« Õ¯Õ¸Õ²Õ´Õ«Ö',
+'enotif_subject_moved' => '{{SITENAME}} Õ§Õ»Õ¨ $1 {{GENDER:$2|Õ¾Õ¥Ö€Õ¡Õ°Õ²Õ¾Õ¥Õ¬ Õ§}} $2-Õ« Õ¯Õ¸Õ²Õ´Õ«Ö',
+'enotif_body_intro_created' => '{{SITENAME}} Õ§Õ»Õ¨ $1 {{GENDER:$2|Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Õ¬ Õ§}} ÕªÕ¡Õ´Õ¨ $PAGEEDITDATE-Õ«Õ¶ $2-Õ« Õ¯Õ¸Õ²Õ´Õ«Ö, Õ¶Õ¡ÕµÕ«Ö€ $3 Õ¨Õ¶Õ¤Õ¡ÖÕ«Õ¯ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¨:',
'enotif_lastvisited' => 'ÕÕ¥Õ½ $1Õ Õ±Õ¥Ö€ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¡ÕµÖÕ«Ö Õ« Õ¾Õ¥Ö€ Õ¯Õ¡Õ¿Õ¡Ö€Õ¾Õ¡Õ® ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€Ö‰',
'enotif_lastdiff' => 'ÕÕ¥Õ½ $1Õ Õ¡ÕµÕ½ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¤Õ«Õ¿Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
'enotif_anon_editor' => 'Õ¡Õ¶Õ¡Õ¶Õ¸Ö‚Õ¶ Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«Ö $1',
@@ -1855,6 +1859,8 @@ $NEWPAGE
Õ€Õ¥Õ¿Õ¡Õ¤Õ¡Ö€Õ± Õ¯Õ¡Õº Ö‡ Ö…Õ£Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¡Õ® Õ§',
+'changed' => 'ÖƒÕ¸ÖƒÕ¸Õ­Õ¾Õ¡Õ® Õ§',
# Delete
'deletepage' => 'Õ‹Õ¶Õ»Õ¥Õ¬ Õ§Õ»Õ¨',
@@ -2016,7 +2022,7 @@ $1',
'blanknamespace' => '(Ô³Õ¬Õ­Õ¡Õ¾Õ¸Ö€)',
# Contributions
-'contributions' => 'Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¶Õ¥Ö€Õ¤Ö€Õ¸Ö‚Õ´',
+'contributions' => ' {{GENDER:$1|Õ„Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ«}} Õ¶Õ¥Ö€Õ¤Ö€Õ¸Ö‚Õ´',
'contributions-title' => '$1 Õ´Õ¡Õ½Õ¶Õ¡Õ¯ÖÕ« Õ¶Õ¥Ö€Õ¤Ö€Õ¸Ö‚Õ´Õ¨',
'mycontris' => 'Õ†Õ¥Ö€Õ¤Ö€Õ¸Ö‚Õ´',
'contribsub2' => '$1-Õ« Õ¶Õ¥Ö€Õ¤Ö€Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ ($2)',
@@ -2406,6 +2412,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
'pageinfo-default-sort' => 'Ô¼Õ¼Õ¥Õ¬Õ¡ÕµÕ¶ Õ¿Õ¥Õ½Õ¡Õ¯Õ¡Õ¾Õ¸Ö€Õ´Õ¡Õ¶ Õ¢Õ¡Õ¶Õ¡Õ¬Õ«',
'pageinfo-length' => 'Ô¾Õ¡Õ¾Õ¡Õ¬ (Õ¢Õ¡ÕµÕ©Õ¥Ö€Õ¸Õ¾)',
'pageinfo-article-id' => 'Ô·Õ»Õ« N',
+'pageinfo-language' => 'Ô²Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¬Õ¥Õ¦Õ¸Ö‚',
'pageinfo-robot-policy' => 'Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¨ Õ¸Ö€Õ¸Õ¶Õ¸Õ²Õ¡Õ¯Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ¥Ö€Õ¸Ö‚Õ´',
'pageinfo-robot-index' => 'Õ«Õ¶Õ¤Õ¥Ö„Õ½Õ¡Õ¾Õ¸Ö€Õ¾Õ¸Õ²',
'pageinfo-robot-noindex' => 'Õ«Õ¶Õ¤Õ¥Ö„Õ½Õ¡Õ¾Õ¸Ö€Õ¾Õ¸Õ² Õ¹Õ§',
@@ -2425,6 +2432,12 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
'pageinfo-magic-words' => 'Õ„Õ¸Õ£Õ¡Õ¯Õ¡Õ¶ {{PLURAL:$1|Õ¢Õ¡Õ¼|Õ¢Õ¡Õ¼Õ¥Ö€}} ($1)',
'pageinfo-hidden-categories' => 'Ô¹Õ¡Ö„Õ¶Õ¾Õ¡Õ® {{PLURAL:$1|Õ¯Õ¡Õ²Õ¡ÕºÕ¡Ö€|Õ¯Õ¡Õ²Õ¡ÕºÕ¡Ö€Õ¶Õ¥Ö€}} ($1)',
'pageinfo-templates' => 'Õ•Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ¡Õ® {{PLURAL:$1|Õ¯Õ¡Õ²Õ¡ÕºÕ¡Ö€|Õ¯Õ¡Õ²Õ¡ÕºÕ¡Ö€Õ¶Õ¥Ö€}} ($1)',
+'pageinfo-toolboxlink' => 'Ô·Õ»Õ« Õ¾Õ«Õ³Õ¡Õ¯Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶',
+'pageinfo-redirectsto' => 'ÕŽÕ¥Ö€Õ¡Õ°Õ²Õ¸Ö‚Õ´ Õ§ Õ¤Õ¥ÕºÕ«',
+'pageinfo-redirectsto-info' => 'Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€',
+'pageinfo-contentpage' => 'Õ€Õ¡Õ·Õ¾Õ¡Õ¼Õ¾Õ¡Õ® Õ¸Ö€ÕºÕ¥Õ½ Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¡ÕµÕ«Õ¶ Õ§Õ»',
+'pageinfo-contentpage-yes' => 'Ô±ÕµÕ¸',
+'pageinfo-protect-cascading-yes' => 'Ô±ÕµÕ¸',
# Skin names
'skinname-standard' => 'Ô´Õ¡Õ½Õ¡Õ¯Õ¡Õ¶',
@@ -2447,6 +2460,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
'markedaspatrollederror' => 'Õ‰Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Ö Õ¶Õ·Õ¥Õ¬ Õ¸Ö€ÕºÕ¥Õ½ Õ½Õ¿Õ¸Ö‚Õ£Õ¾Õ¡Õ®',
'markedaspatrollederrortext' => 'Ô±Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ§ Õ¨Õ¶Õ¿Ö€Õ¥Õ¬ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ Õ¸Ö€ÕºÕ¥Õ½ Õ½Õ¿Õ¸Ö‚Õ£Õ¾Õ¡Õ® Õ¶Õ·Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Ö‰',
'markedaspatrollederror-noautopatrol' => 'ÕÕ¥Õ¦ Õ¹Õ« Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¾Õ¸Ö‚Õ´ Õ±Õ¥Ö€ Õ¯Õ¡Õ¿Õ¡Ö€Õ¡Õ® ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ¶Õ·Õ¥Õ¬ Õ¸Ö€ÕºÕ¥Õ½ Õ½Õ¿Õ¸Ö‚Õ£Õ¾Õ¡Õ®Ö‰',
+'markedaspatrollednotify' => 'Ô±ÕµÕ½ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ $1 Õ§Õ»Õ¸Ö‚Õ´ Õ¶Õ·Õ¾Õ¥Õ¬ Õ§ Õ½Õ¿Õ¸Ö‚Õ£Õ¾Õ¡Õ®',
+'markedaspatrollederrornotify' => 'ÕÕ¿Õ¸Ö‚Õ£Õ¾Õ¡Õ® Õ¶Õ·Õ¥Õ¬ Õ¹Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥ÖÖ‰',
# Patrol log
'patrol-log-page' => 'ÕŠÕ¡Ö€Õ¥Õ¯Õ´Õ¡Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡Õ´Õ¡Õ¿ÕµÕ¡Õ¶',
@@ -2752,7 +2767,7 @@ $3
'logentry-newusers-newusers' => '$1 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ½Õ¿Õ¥Õ²Õ®Õ¥Ö Õ¶Õ¸Ö€ Õ°Õ¡Õ·Õ«Õ¾',
'logentry-newusers-create' => '$1 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ«ÖÕ¨ Õ½Õ¿Õ¥Õ²Õ®Õ¥Ö Õ¶Õ¸Ö€ Õ°Õ¡Õ·Õ«Õ¾',
'logentry-newusers-create2' => '$1 ÕÕ¿Õ¥Õ²Õ®Õ¥Ö Õ¶Õ¸Ö€ Õ°Õ¡Õ·Õ«Õ¾ $3',
-'newuserlog-byemail' => 'Գաղտնաբառն ուղարկված է էլ․ փոստով',
+'rightsnone' => '(Õ¸Õ¹ Õ´Õ«)',
# Feedback
'feedback-subject' => 'Ô¹Õ¥Õ´Õ¡.',
diff --git a/languages/messages/MessagesIa.php b/languages/messages/MessagesIa.php
index bf5117bf..be7a3ce8 100644
--- a/languages/messages/MessagesIa.php
+++ b/languages/messages/MessagesIa.php
@@ -111,7 +111,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Modificationes_recente' ),
'Recentchangeslinked' => array( 'Modificationes_recente_ligate', 'Modificationes_connexe' ),
'Revisiondelete' => array( 'Deletion_de_versiones' ),
- 'RevisionMove' => array( 'Displaciar_versiones' ),
'Search' => array( 'Recerca' ),
'Shortpages' => array( 'Paginas_curte' ),
'Specialpages' => array( 'Paginas_special' ),
@@ -277,6 +276,7 @@ $messages = array(
'newwindow' => '(se aperi in un nove fenestra)',
'cancel' => 'Cancellar',
'moredotdotdot' => 'Plus...',
+'morenotlisted' => 'Alteres non listate…',
'mypage' => 'Pagina',
'mytalk' => 'Discussion',
'anontalk' => 'Discussion pro iste adresse IP',
@@ -288,7 +288,6 @@ $messages = array(
'qbbrowse' => 'Foliar',
'qbedit' => 'Modificar',
'qbpageoptions' => 'Iste pagina',
-'qbpageinfo' => 'Contexto',
'qbmyoptions' => 'Mi paginas',
'qbspecialpages' => 'Paginas special',
'faq' => 'FAQ',
@@ -311,6 +310,7 @@ $messages = array(
'namespaces' => 'Spatios de nomines',
'variants' => 'Variantes',
+'navigation-heading' => 'Menu de navigation',
'errorpagetitle' => 'Error',
'returnto' => 'Retornar a $1.',
'tagline' => 'De {{SITENAME}}',
@@ -553,10 +553,10 @@ Le administrator qui lo blocava offereva iste explication: "$3".',
# Login and logout pages
'logouttext' => "'''Tu ha claudite le session.'''
-Tu pote continuar a usar {{SITENAME}} anonymemente, o tu pote [[Special:UserLogin|aperir un nove session]] con le mesme nomine de usator o con un altere.
+Tu pote continuar a usar {{SITENAME}} anonymemente, o tu pote <span class='plainlinks'>[$1 aperir un nove session]</span> con le mesme nomine de usator o con un altere.
Nota que alcun paginas pote continuar a apparer como si tu esserea ancora authenticate. Pro remediar isto, tu pote vacuar le cache de tu navigator.",
-'welcomecreation' => '== Benvenite, $1! ==
-Tu conto ha essite create.
+'welcomeuser' => 'Benvenite, $1!',
+'welcomecreation-msg' => 'Tu conto ha essite create.
Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].',
'yourname' => 'Nomine de usator:',
'yourpassword' => 'Contrasigno:',
@@ -580,7 +580,7 @@ Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].
'gotaccount' => "Tu jam ha un conto? '''$1'''.",
'gotaccountlink' => 'Aperir session',
'userlogin-resetlink' => 'Datos de authentication oblidate?',
-'createaccountmail' => 'per e-mail',
+'createaccountmail' => 'Usar un contrasigno aleatori temporari e inviar lo al adresse de e-mail specificate hic infra',
'createaccountreason' => 'Motivo:',
'badretype' => 'Le duo contrasignos que tu scribeva non es identic.',
'userexists' => 'Iste nomine de usator es jam in uso.
@@ -661,6 +661,7 @@ Per favor attende ante de probar lo novemente.',
# Email sending
'php-mail-error-unknown' => 'Error incognite in le function mail() de PHP',
'user-mail-no-addy' => 'Tentava inviar e-mail sin adresse de e-mail.',
+'user-mail-no-body' => 'Tentava inviar e-mail con texto vacue o multo curte.',
# Change password dialog
'resetpass' => 'Cambiar contrasigno',
@@ -728,6 +729,7 @@ Contrasigno temporari: $2',
'changeemail-oldemail' => 'Adresse de e-mail actual:',
'changeemail-newemail' => 'Adresse de e-mail nove:',
'changeemail-none' => '(nulle)',
+'changeemail-password' => 'Contrasigno de {{SITENAME}}:',
'changeemail-submit' => 'Cambiar e-mail',
'changeemail-cancel' => 'Cancellar',
@@ -917,7 +919,6 @@ Le administrator qui ha blocate le base de datos ha fornite iste explication: $1
'template-semiprotected' => '(semi-protegite)',
'hiddencategories' => 'Iste pagina es membro de {{PLURAL:$1|1 categoria|$1 categorias}} celate:',
'edittools' => '<!-- Iste texto se monstrara sub le formularios de modificar articulos e de incargar files. -->',
-'nocreatetitle' => 'Creation de paginas limitate',
'nocreatetext' => '{{SITENAME}} ha restringite le possibilitate de crear nove paginas.
Tu pote retornar e modificar un pagina existente, o [[Special:UserLogin|aperir un session, o crear un conto]].',
'nocreate-loggedin' => 'Tu non ha le permission de crear nove paginas.',
@@ -942,6 +943,15 @@ Pare que illo ha essite delite.',
'edit-already-exists' => 'Non poteva crear un nove pagina.
Illo existe ja.',
'defaultmessagetext' => 'Texto predefinite del message',
+'content-failed-to-parse' => 'Impossibile processar le contento $2 pro le modello $1: $3',
+'invalid-content-data' => 'Datos de contento invalide',
+'content-not-allowed-here' => 'Le contento "$1" non es permittite in le pagina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitexto',
+'content-model-text' => 'texto simple',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Attention: Iste pagina contine troppo de appellos costose al functiones del analysator syntactic.
@@ -1313,9 +1323,9 @@ Le operation non pote esser disfacite.',
'prefs-emailconfirm-label' => 'Confirmation del e-mail:',
'prefs-textboxsize' => 'Dimension del fenestra de modification',
'youremail' => 'E-mail:',
-'username' => 'Nomine de usator:',
-'uid' => 'ID del usator:',
-'prefs-memberingroups' => 'Membro de {{PLURAL:$1|gruppo|gruppos}}:',
+'username' => '{{GENDER:$1|Nomine de usator}}:',
+'uid' => 'ID del {{GENDER:$1|usator}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Membro}} de {{PLURAL:$1|gruppo|gruppos}}:',
'prefs-registration' => 'Data de registration:',
'yourrealname' => 'Nomine real:',
'yourlanguage' => 'Lingua:',
@@ -1464,12 +1474,13 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
'right-sendemail' => 'Inviar e-mail a altere usatores',
'right-passwordreset' => 'Vider le e-mails pro reinitialisar le contrasigno',
+# Special:Log/newusers
+'newuserlogpage' => 'Registro de creation de usatores',
+'newuserlogpagetext' => 'Isto es un registro de creation de usatores.',
+
# User rights log
'rightslog' => 'Registro de derectos de usator',
'rightslogtext' => 'Isto es un registro de cambios in derectos de usator.',
-'rightslogentry' => 'cambiava le gruppos del quales $1 es membro de $2 a $3',
-'rightslogentry-autopromote' => 'ha essite automaticamente promovite de $2 a $3',
-'rightsnone' => '(nulle)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'leger iste pagina',
@@ -1716,6 +1727,7 @@ Si le problema persiste, contacta un [[Special:ListUsers/sysop|administrator]].'
'backend-fail-notsame' => 'Un file non identic jam existe a $1.',
'backend-fail-invalidpath' => '$1 non es un cammino valide de immagazinage.',
'backend-fail-delete' => 'Impossibile deler file $1.',
+'backend-fail-describe' => 'Impossibile cambiar le metadatos pro le file "$1".',
'backend-fail-alreadyexists' => 'Le file $1 jam existe.',
'backend-fail-store' => 'Non poteva immagazinar le file $1 a $2',
'backend-fail-copy' => 'Impossibile copiar file $1 a $2',
@@ -1954,6 +1966,12 @@ Template:Disambiguation',
Istes debe forsan ligar directemente al articulo sur le thema in question.<br />
Un pagina se tracta como pagina de disambiguation si illo usa un patrono que es ligate ab [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Paginas con un proprietate de pagina',
+'pageswithprop-legend' => 'Paginas con un proprietate de pagina',
+'pageswithprop-text' => 'Iste pagina lista le paginas que usa un certe proprietate de pagina.',
+'pageswithprop-prop' => 'Nomine del proprietate:',
+'pageswithprop-submit' => 'Va',
+
'doubleredirects' => 'Redirectiones duple',
'doubleredirectstext' => 'Iste pagina lista paginas de redirection verso altere paginas de redirection.
Cata linea contine ligamines al prime e al secunde redirection, con le destination del secunde redirection. Iste es normalmente le "ver" pagina de destination, al qual le prime redirection tamben deberea punctar.
@@ -2108,7 +2126,7 @@ Vide etiam le [[Special:WantedCategories|categorias desirate]].',
'linksearch-ok' => 'Cercar',
'linksearch-text' => 'Es possibile usar metacharacteres como in "*.wikipedia.org".
Isto necessita specificar al minus le dominio de nivello superior, per exemplo "*.org".<br />
-Protocollos supportate: <code>$1</code> (http:// es assumite si nulle protocollo es specificate).',
+{{PLURAL:$2|Le protocollo|Protocollos}} supportate: <code>$1</code> (http:// es assumite si nulle protocollo es specificate).',
'linksearch-line' => '$1 ligate ab $2',
'linksearch-error' => 'Le metacharacteres pote apparer solmente al initio del nomine de host.',
@@ -2127,10 +2145,6 @@ Protocollos supportate: <code>$1</code> (http:// es assumite si nulle protocollo
'activeusers-hidesysops' => 'Celar administratores',
'activeusers-noresult' => 'Nulle usator trovate.',
-# Special:Log/newusers
-'newuserlogpage' => 'Registro de creation de usatores',
-'newuserlogpagetext' => 'Isto es un registro de creation de usatores.',
-
# Special:ListGroupRights
'listgrouprights' => 'Derectos del gruppos de usatores',
'listgrouprights-summary' => 'Lo sequente es un lista de gruppos de usatores definite in iste wiki, con lor derectos de accesso associate.
@@ -2228,31 +2242,33 @@ Le modificationes futur in iste pagina e in le pagina de discussion associate es
'enotif_mailer' => 'Systema de notification via e-mail de {{SITENAME}}',
'enotif_reset' => 'Marcar tote le paginas como visitate',
-'enotif_newpagetext' => 'Isto es un nove pagina.',
'enotif_impersonal_salutation' => 'Usator de {{SITENAME}}',
-'changed' => 'modificate',
-'created' => 'create',
-'enotif_subject' => 'Le pagina $PAGETITLE de {{SITENAME}} ha essite $CHANGEDORCREATED per $PAGEEDITOR',
+'enotif_subject_deleted' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|delite}} per $2',
+'enotif_subject_created' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|create}} per $2',
+'enotif_subject_moved' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|renominate}} per $2',
+'enotif_subject_restored' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|restaurate}} per $2',
+'enotif_subject_changed' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|modificate}} per $2',
+'enotif_body_intro_deleted' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|delite}} le $PAGEEDITDATE per $2, vide $3.',
+'enotif_body_intro_created' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|create}} le $PAGEEDITDATE per $2, vide $3 pro le version actual.',
+'enotif_body_intro_moved' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|renominate}} le $PAGEEDITDATE per $2, vide $3 pro le version actual.',
+'enotif_body_intro_restored' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|restaurate}} le $PAGEEDITDATE per $2, vide $3 pro le version actual.',
+'enotif_body_intro_changed' => 'Le pagina $1 de {{SITENAME}} ha essite {{GENDER:$2|modificate}} le $PAGEEDITDATE per $2, vide $3 pro le version actual.',
'enotif_lastvisited' => 'Vide $1 pro tote le modificationes depost tu ultime visita.',
'enotif_lastdiff' => 'Vide $1 pro revider iste modification.',
'enotif_anon_editor' => 'usator anonyme $1',
'enotif_body' => 'Car $WATCHINGUSERNAME,
-
-Le pagina de {{SITENAME}} titulate $PAGETITLE ha essite $CHANGEDORCREATED le $PAGEEDITDATE per $PAGEEDITOR. Vide $PAGETITLE_URL pro le version actual.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Summario del redactor: $PAGESUMMARY $PAGEMINOREDIT
Pro contactar le redactor:
-e-mail: $PAGEEDITOR_EMAIL
+mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Si tu non visita iste pagina, tu non recipera altere notificationes in caso de modificationes ulterior.
-Como alternativa tu pote reinitialisar le optiones de notification pro tote le paginas in tu observatorio.
+Tu non recipera altere notificationes de activitate si tu non visita iste pagina. Tu pote anque reinitialisar le optiones de notification pro tote le paginas in tu observatorio.
- Le systema de notification de {{SITENAME}}, a tu servicio
+Le systema de notification de {{SITENAME}}, a tu servicio
--
Pro configurar le notification per e-mail, visita
@@ -2266,6 +2282,8 @@ $UNWATCHURL
Feedback e ulterior assistentia:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'create',
+'changed' => 'modificate',
# Delete
'deletepage' => 'Deler pagina',
@@ -2340,6 +2358,8 @@ Vide le [[Special:ProtectedPages|lista de paginas protegite]] pro le lista de pr
'prot_1movedto2' => 'displaciava [[$1]] verso [[$2]]',
'protect-badnamespace-title' => 'Spatio de nomines non protegibile',
'protect-badnamespace-text' => 'Le paginas in iste spatio de nomines non pote esser protegite.',
+'protect-norestrictiontypes-text' => 'Iste pagina non pote esser protegite perque il non ha alcun typo de restriction disponibile.',
+'protect-norestrictiontypes-title' => 'Pagina non protegibile',
'protect-legend' => 'Confirmar protection',
'protectcomment' => 'Motivo:',
'protectexpiry' => 'Expiration:',
@@ -2426,8 +2446,8 @@ Es possibile que le adresse URL es invalide, o que le version ha essite restaura
'undeletedrevisions' => '{{PLURAL:$1|1 version|$1 versiones}} restaurate',
'undeletedrevisions-files' => '{{PLURAL:$1|1 version|$1 versiones}} e {{PLURAL:$2|1 file|$2 files}} restaurate',
'undeletedfiles' => '$1 {{PLURAL:$1|archivo|archivos}} restaurate',
-'cannotundelete' => 'Le restauration ha fallite;
-es possibile que un altere persona ha ja restaurate le pagina.',
+'cannotundelete' => 'Le restauration ha fallite:
+$1',
'undeletedpage' => "'''$1 ha essite restaurate'''
Consulta le [[Special:Log/delete|registro de deletiones]] pro un lista de deletiones e restaurationes recente.",
@@ -2459,7 +2479,7 @@ $1',
'blanknamespace' => '(Principal)',
# Contributions
-'contributions' => 'Contributiones del usator',
+'contributions' => 'Contributiones del {{GENDER:$1|usator}}',
'contributions-title' => 'Contributiones del usator $1',
'mycontris' => 'Contributiones',
'contribsub2' => 'Pro $1 ($2)',
@@ -2742,6 +2762,7 @@ non pote renominar un pagina al mesme titulo.',
'immobile-target-namespace-iw' => 'Un ligamine interwiki non es un destination valide pro le renomination de un pagina.',
'immobile-source-page' => 'Iste pagina non es renominabile.',
'immobile-target-page' => 'Non pote renominar a iste titulo de destination.',
+'bad-target-model' => 'Le destination desirate usa un altere modello de contento. Non es possibile converter de $1 a $2.',
'imagenocrossnamespace' => 'Impossibile renominar un file verso un spatio de nomines non-file',
'nonfile-cannot-move-to-file' => 'Impossibile renominar un non-file verso le spatio de nomines file',
'imagetypemismatch' => 'Le nove extension del nomine del file non corresponde al typo del file',
@@ -2852,6 +2873,7 @@ Salveguarda lo in tu computator e incarga lo hic.',
'import-error-interwiki' => 'Le pagina "$1" non es importate perque su nomine es reservate pro ligation externe (interwiki).',
'import-error-special' => 'Le pagina "$1" non es importate perque illo pertine a un spatio de nomines special que non permitte paginas.',
'import-error-invalid' => 'Le pagina "$1" non es importate perque su nomine es invalide.',
+'import-error-unserialize' => 'Le version $2 del pagina "$1" non pote esser disserialisate. Il ha essite reportate que iste version usa le modello de contento $3 serialisate como $4.',
'import-options-wrong' => 'Mal {{PLURAL:$2|option|optiones}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Le pagina radice specificate es un titulo invalide.',
'import-rootpage-nosubpage' => 'Le spatio de nomines "$1" del pagina radice non permitte subpaginas.',
@@ -2866,7 +2888,6 @@ Salveguarda lo in tu computator e incarga lo hic.',
# JavaScriptTest
'javascripttest' => 'Test de JavaScript',
-'javascripttest-disabled' => 'Iste function non ha essite activate in iste wiki.',
'javascripttest-title' => 'Execution de $1 tests',
'javascripttest-pagetext-noframework' => 'Iste pagina es reservate pro le execution de tests de JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Structura de test "$1" incognite.',
@@ -3008,11 +3029,13 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
'pageinfo-default-sort' => 'Clave de ordination predefinite',
'pageinfo-length' => 'Dimension del pagina (in bytes)',
'pageinfo-article-id' => 'ID del pagina',
+'pageinfo-language' => 'Lingua del contento del pagina',
'pageinfo-robot-policy' => 'Stato del motor de recerca',
'pageinfo-robot-index' => 'Indexabile',
'pageinfo-robot-noindex' => 'Non indexabile',
'pageinfo-views' => 'Numero de visitas',
'pageinfo-watchers' => 'Numero de observatores del pagina',
+'pageinfo-few-watchers' => 'Minus de $1 {{PLURAL:$1|observator|observatores}}',
'pageinfo-redirects-name' => 'Redirectiones verso iste pagina',
'pageinfo-subpages-name' => 'Subpaginas de iste pagina',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirection|redirectiones}}; $3 {{PLURAL:$3|non-redirection|non-redirectiones}})',
@@ -3027,6 +3050,19 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
'pageinfo-magic-words' => '{{PLURAL:$1|Parola|Parolas}} magic ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria|Categorias}} celate ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Patrono|Patronos}} transcludite ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pagina|Paginas}} in que iste pagina es transcludite ($1)',
+'pageinfo-toolboxlink' => 'Information sur le pagina',
+'pageinfo-redirectsto' => 'Redirige a',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Contate como pagina de contento',
+'pageinfo-contentpage-yes' => 'Si',
+'pageinfo-protect-cascading' => 'Protection in cascada a partir de hic',
+'pageinfo-protect-cascading-yes' => 'Si',
+'pageinfo-protect-cascading-from' => 'Protection in cascada a partir de',
+'pageinfo-category-info' => 'Information de categoria',
+'pageinfo-category-pages' => 'Numero de paginas',
+'pageinfo-category-subcats' => 'Numero de subcategorias',
+'pageinfo-category-files' => 'Numero de files',
# Skin names
'skinname-standard' => 'Classic',
@@ -3048,6 +3084,8 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
'markedaspatrollederror' => 'Impossibile marcar como patruliate',
'markedaspatrollederrortext' => 'Tu debe specificar un version a marcar como patruliate.',
'markedaspatrollederror-noautopatrol' => 'Tu non es permittite a marcar tu proprie modificationes como patruliate.',
+'markedaspatrollednotify' => 'Iste modification de $1 ha essite marcate como patruliate.',
+'markedaspatrollederrornotify' => 'Le marcar como patruliate ha fallite.',
# Patrol log
'patrol-log-page' => 'Registro de patrulia',
@@ -3081,6 +3119,7 @@ Le execution de illo pote compromitter le securitate de tu systema.",
'file-nohires' => 'Non disponibile in resolution plus alte.',
'svg-long-desc' => 'File SVG, dimensiones nominal: $1 × $2 pixels, grandor del file: $3',
'svg-long-desc-animated' => 'File SVG animate, dimensiones nominal: $1 × $2 pixels, grandor del file: $3',
+'svg-long-error' => 'File SVG invalide: $1',
'show-big-image' => 'Plen resolution',
'show-big-image-preview' => ' Dimension de iste previsualisation: $1.',
'show-big-image-other' => 'Altere {{PLURAL:$2|resolution|resolutiones}}: $1.',
@@ -3110,7 +3149,10 @@ Le execution de illo pote compromitter le securitate de tu systema.",
'minutes' => '{{PLURAL:$1|$1 minuta|$1 minutas}}',
'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
'days' => '{{PLURAL:$1|$1 die|$1 dies}}',
+'months' => '{{PLURAL:$1|$1 mense|$1 menses}}',
+'years' => '{{PLURAL:$1|$1 anno|$1 annos}}',
'ago' => '$1 retro',
+'just-now' => 'Justo nunc',
# Bad image list
'bad_image_list' => 'Le formato es como seque:
@@ -3613,6 +3655,7 @@ Iste codice de confirmation expirara a $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Le transclusion interwiki es disactivate]',
'scarytranscludefailed' => '[Falleva de obtener le patrono pro $1]',
+'scarytranscludefailed-httpstatus' => '[Obtention de patrono fallite pro $1: HTTP $2]',
'scarytranscludetoolong' => '[URL es troppo longe]',
# Delete conflict
@@ -3722,6 +3765,7 @@ Tu pote etiam [[Special:EditWatchlist|usar le editor standard]].',
'version-license' => 'Licentia',
'version-poweredby-credits' => "Iste wiki es actionate per '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'alteres',
+'version-credits-summary' => 'Nos vole recognoscer le sequente personas pro lor contribution a [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki es software libere; vos pote redistribuer lo e/o modificar lo sub le conditiones del Licentia Public General de GNU publicate per le Free Software Foundation; version 2 del Licentia, o (a vostre option) qualcunque version posterior.
Iste programma es distribuite in le sperantia que illo sia utile, ma SIN GARANTIA; sin mesmo le implicite garantia de COMMERCIALISATION o APTITUDE PRO UN PROPOSITO PARTICULAR. Vide le Licentia Public General de GNU pro plus detalios.
@@ -3866,8 +3910,12 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
'logentry-newusers-newusers' => 'Le conto de usator $1 ha essite create',
'logentry-newusers-create' => 'Le conto de usator $1 ha essite create',
'logentry-newusers-create2' => 'Le conto de usator $3 ha essite create per $1',
+'logentry-newusers-byemail' => 'Le conto de usator $3 ha essite create per $1 e le contrasigno ha essite inviate per e-mail',
'logentry-newusers-autocreate' => 'Le conto $1 ha essite create automaticamente',
-'newuserlog-byemail' => 'contrasigno inviate per e-mail',
+'logentry-rights-rights' => '$1 cambiava le appertinentia a gruppos pro $3 de $4 a $5',
+'logentry-rights-rights-legacy' => '$1 cambiava le appertinentia a gruppos pro $3',
+'logentry-rights-autopromote' => '$1 ha essite automaticamente promovite de $4 a $5',
+'rightsnone' => '(nulle)',
# Feedback
'feedback-bugornote' => 'Si tu es preste a describer un problema technic in detalio, per favor [$1 reporta un falta].
@@ -3921,6 +3969,7 @@ Si non, tu pote usar le formulario facile hic infra. Tu commento essera addite a
'api-error-ok-but-empty' => 'Error interne: nulle responsa del servitor.',
'api-error-overwrite' => 'Superscriber un file existente non es permittite.',
'api-error-stashfailed' => 'Error interne: le servitor non poteva immagazinar le file temporari.',
+'api-error-publishfailed' => 'Error interne: le servitor non poteva publicar le file temporari.',
'api-error-timeout' => 'Le servitor non ha respondite intra le tempore expectate.',
'api-error-unclassified' => 'Un error incognite ha occurrite.',
'api-error-unknown-code' => 'Error incognite: "$1"',
@@ -3941,4 +3990,7 @@ Si non, tu pote usar le formulario facile hic infra. Tu commento essera addite a
'duration-centuries' => '$1 {{PLURAL:$1|seculo|seculos}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennio|millennios}}',
+# Image rotation
+'rotate-comment' => 'Imagine rotate de $1 {{PLURAL:$1|grado|grados}} in senso horologic',
+
);
diff --git a/languages/messages/MessagesId.php b/languages/messages/MessagesId.php
index 32bf93c1..0fa873f5 100644
--- a/languages/messages/MessagesId.php
+++ b/languages/messages/MessagesId.php
@@ -27,6 +27,7 @@
* @author Mahali syarifuddin
* @author McDutchie
* @author Meursault2004
+ * @author Naval Scene
* @author Remember the dot
* @author Rex
* @author Urhixidur
@@ -82,7 +83,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__PAKSADAFTARISI__', '__PAKSADASI__', '__FORCETOC__' ),
'toc' => array( '0', '__DAFTARISI__', '__DASI__', '__TOC__' ),
'noeditsection' => array( '0', '__TANPASUNTINGANBAGIAN__', '__NIRSUBA__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__TANPAKEPALA__', '__NIRLA__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'BULANKINI', 'BULANKINI2', 'BUKIN', 'BUKIN2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'BULANKINI1', 'BUKIN1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'NAMABULANKINI', 'NAMBUKIN', 'CURRENTMONTHNAME' ),
@@ -285,7 +285,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Perubahan_terbaru', 'PerubahanTerbaru', 'RC', 'PT' ),
'Recentchangeslinked' => array( 'Perubahan_terkait', 'PerubahanTerkait' ),
'Revisiondelete' => array( 'Hapus_revisi', 'HapusRevisi' ),
- 'RevisionMove' => array( 'Revisi_pemindahan', 'RevisiPemindahan' ),
'Search' => array( 'Pencarian', 'Cari' ),
'Shortpages' => array( 'Halaman_pendek', 'HalamanPendek' ),
'Specialpages' => array( 'Halaman_istimewa', 'HalamanIstimewa' ),
@@ -475,6 +474,7 @@ $messages = array(
'newwindow' => '(buka di jendela baru)',
'cancel' => 'Batalkan',
'moredotdotdot' => 'Lainnya...',
+'morenotlisted' => 'Selanjutnya...',
'mypage' => 'Halaman',
'mytalk' => 'Pembicaraan',
'anontalk' => 'Pembicaraan IP ini',
@@ -486,7 +486,6 @@ $messages = array(
'qbbrowse' => 'Navigasi',
'qbedit' => 'Sunting',
'qbpageoptions' => 'Halaman ini',
-'qbpageinfo' => 'Konteks halaman',
'qbmyoptions' => 'Halaman saya',
'qbspecialpages' => 'Halaman istimewa',
'faq' => 'FAQ',
@@ -509,6 +508,7 @@ $messages = array(
'namespaces' => 'Ruang nama',
'variants' => 'Varian',
+'navigation-heading' => 'Menu navigasi',
'errorpagetitle' => 'Kesalahan',
'returnto' => 'Kembali ke $1.',
'tagline' => 'Dari {{SITENAME}}',
@@ -747,11 +747,10 @@ Administrator yang terkunci menawarkan penjelasan ini: " $3 ".',
# Login and logout pages
'logouttext' => "'''Anda telah keluar log dari sistem.'''
-Anda dapat terus menggunakan {{SITENAME}} secara anonim, atau Anda dapat [[Special:UserLogin|masuk log lagi]] sebagai pengguna yang sama atau pengguna yang lain.
+Anda dapat terus menggunakan {{SITENAME}} secara anonim, atau Anda dapat <span class='plainlinks'>[$1 masuk log lagi]</span> sebagai pengguna yang sama atau pengguna yang lain.
Perhatikan bahwa beberapa halaman mungkin masih terus menunjukkan bahwa Anda masih masuk log sampai Anda membersihkan singgahan penjelajah web Anda",
-'welcomecreation' => '== Selamat datang, $1! ==
-
-Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] Anda.',
+'welcomeuser' => 'Selamat datang, $1 !',
+'welcomecreation-msg' => 'Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] Anda.',
'yourname' => 'Nama pengguna:',
'yourpassword' => 'Kata sandi:',
'yourpasswordagain' => 'Ulangi kata sandi:',
@@ -774,7 +773,7 @@ Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi [[Special:Preferences|p
'gotaccount' => "Sudah terdaftar sebagai pengguna? '''$1'''.",
'gotaccountlink' => 'Masuk log',
'userlogin-resetlink' => 'Lupa detail info masuk Anda?',
-'createaccountmail' => 'melalui surel',
+'createaccountmail' => 'Gunakan kata sandi acak sementara dan kirimkan ke surel yang tercantum di bawah',
'createaccountreason' => 'Alasan:',
'badretype' => 'Kata sandi yang Anda masukkan salah.',
'userexists' => 'Nama pengguna yang dimasukkan telah digunakan.
@@ -842,6 +841,7 @@ Silakan menunggu sebelum mencoba lagi.',
# Email sending
'php-mail-error-unknown' => 'Kesalahan yang tidak dikenal dalam fungsi mail() PHP',
'user-mail-no-addy' => 'Mencoba mengirimkan surel tanpa alamat surel.',
+'user-mail-no-body' => 'Mencoba untuk mengirim surel kosong atau terlalu pendek.',
# Change password dialog
'resetpass' => 'Ganti kata sandi',
@@ -906,6 +906,7 @@ Sandi sementara: $2',
'changeemail-oldemail' => 'Alamat surel saat ini:',
'changeemail-newemail' => 'Alamat surel baru:',
'changeemail-none' => '(tidak ada)',
+'changeemail-password' => 'Sandi {{SITENAME}} Anda:',
'changeemail-submit' => 'Ubah surel',
'changeemail-cancel' => 'Batalkan',
@@ -1083,7 +1084,6 @@ Entri catatan terakhir disediakan di bawah untuk referensi:",
'hiddencategories' => 'Halaman ini adalah anggota dari {{PLURAL:$1|1 kategori tersembunyi|$1 kategori tersembunyi}}:',
'edittools' => '<!-- Teks di sini akan dimunculkan di bawah isian suntingan dan pemuatan.-->',
'edittools-upload' => '-',
-'nocreatetitle' => 'Pembuatan halaman baru dibatasi',
'nocreatetext' => '{{SITENAME}} telah membatasi pembuatan halaman-halaman baru.
Anda dapat kembali dan menyunting halaman yang telah ada, atau silakan [[Special:UserLogin|masuk log atau membuat akun]].',
'nocreate-loggedin' => 'Anda tak memiliki hak akses untuk membuat halaman baru.',
@@ -1108,6 +1108,15 @@ Halaman kemungkinan telah dihapus.',
'edit-already-exists' => 'Tidak dapat membuat halaman baru
karena telah ada.',
'defaultmessagetext' => 'Teks baku',
+'content-failed-to-parse' => 'Gagal menjabarkan konten $2 untuk model $1: $3',
+'invalid-content-data' => 'Data konten tidak sah',
+'content-not-allowed-here' => 'Konten "$1" tidak diizinkan di halaman [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'teks wiki',
+'content-model-text' => 'teks polos',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Peringatan: Halaman ini mengandung terlalu banyak panggilan fungsi parser.
@@ -1470,9 +1479,9 @@ Pengembalian preferensi tidak dapat dibatalkan.',
'prefs-emailconfirm-label' => 'Konfirmasi surel:',
'prefs-textboxsize' => 'Ukuran kotak suntingan',
'youremail' => 'Surel:',
-'username' => 'Nama pengguna:',
-'uid' => 'ID pengguna:',
-'prefs-memberingroups' => 'Anggota {{PLURAL:$1|kelompok|kelompok}}:',
+'username' => '{{GENDER:$1|Nama pengguna}}:',
+'uid' => 'ID {{GENDER:$1|pengguna}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Anggota}} {{PLURAL:$1|kelompok|kelompok}}:',
'prefs-memberingroups-type' => '$1',
'prefs-registration' => 'Waktu pendaftaran:',
'prefs-registration-date-time' => '$1',
@@ -1525,6 +1534,7 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
'saveusergroups' => 'Simpan kelompok pengguna',
'userrights-groupsmember' => 'Anggota dari:',
'userrights-groupsmember-auto' => 'Anggota implisit dari:',
+'userrights-groupsmember-type' => '$1',
'userrights-groups-help' => 'Anda dapat mengubah kelompok pengguna ini:
* Kotak dengan tanda cek merupakan kelompok pengguna yang bersangkutan
* Kotak tanpa tanda cek berarti pengguna ini bukan anggota kelompok tersebut
@@ -1624,12 +1634,13 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
'right-sendemail' => 'Mengirim surel ke pengguna lain',
'right-passwordreset' => 'Lihat surel pengaturulangan kata sandi',
+# Special:Log/newusers
+'newuserlogpage' => 'Log pengguna baru',
+'newuserlogpagetext' => 'Di bawah ini adalah log pendaftaran pengguna baru',
+
# User rights log
'rightslog' => 'Log perubahan hak akses',
'rightslogtext' => 'Di bawah ini adalah log perubahan terhadap hak-hak pengguna.',
-'rightslogentry' => 'mengganti keanggotaan kelompok untuk $1 dari $2 menjadi $3',
-'rightslogentry-autopromote' => 'secara otomatis dipromosikan dari $2 ke $3',
-'rightsnone' => '(tidak ada)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'membaca halaman ini',
@@ -1867,6 +1878,7 @@ Silakan hubungi salah seorang [[Special:ListUsers/sysop|pengurus]].',
'backend-fail-notsame' => 'Berkas nonidentik telah ada di $1.',
'backend-fail-invalidpath' => '$1 bukanlah lintasan penyimpanan yang valid.',
'backend-fail-delete' => 'Tidak dapat menghapus berkas $1.',
+'backend-fail-describe' => 'Gagal mengubah metadata untuk berkas "$1".',
'backend-fail-alreadyexists' => 'Berkas $1 sudah ada.',
'backend-fail-store' => 'Tidak dapat menyimpan berkas $1 di $2.',
'backend-fail-copy' => 'Tidak dapat menyalin berkas $1 ke $2.',
@@ -2102,6 +2114,12 @@ Cek dahulu pranala lain ke templat tersebut sebelum menghapusnya.',
Halaman-halaman tersebut seharusnya berpaut ke topik-topik yang sesuai.<br />
Suatu halaman dianggap sebagai halaman disambiguasi apabila halaman tersebut menggunakan templat yang terhubung ke [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Halaman dengan halaman properti',
+'pageswithprop-legend' => 'Halaman dengan halaman properti',
+'pageswithprop-text' => 'Halaman ini berisi daftar halaman yang menggunakan properti halaman tertentu.',
+'pageswithprop-prop' => 'Nama properti:',
+'pageswithprop-submit' => 'Pergi',
+
'doubleredirects' => 'Pengalihan ganda',
'doubleredirectstext' => 'Halaman ini memuat daftar halaman yang dialihkan ke halaman pengalihan yang lain.
Setiap baris memuat pranala ke pengalihan pertama dan pengalihan kedua serta target dari pengalihan kedua yang umumnya adalah halaman yang "sebenarnya". Halaman peralihan pertama seharusnya dialihkan ke halaman yang bukan merupakan halaman peralihan.
@@ -2253,9 +2271,9 @@ Lihat pula [[Special:WantedCategories|kategori yang diinginkan]].',
'linksearch-pat' => 'Pola pencarian:',
'linksearch-ns' => 'Ruang nama:',
'linksearch-ok' => 'Cari',
-'linksearch-text' => 'Kartu liar seperti "*.wikipedia.org" dapat digunakan.
+'linksearch-text' => 'Tanda bintang seperti "*.wikipedia.org" dapat digunakan.
Perlu sedikitnya satu domain tingkat atas, misalnya "*.org".<br />
-Protokol yang didukung: <code>$1</code> (menggunakan http:// bila protokol tidak ditentukan)',
+{{PLURAL:$2|Protokol|Protokol}} yang didukung: <code>$1</code> (menggunakan http:// bila protokol tidak ditentukan)',
'linksearch-line' => '$1 memiliki pranala dari $2',
'linksearch-error' => "''Wildcards'' hanya dapat digunakan di bagian awal dari nama host.",
@@ -2274,10 +2292,6 @@ Protokol yang didukung: <code>$1</code> (menggunakan http:// bila protokol tidak
'activeusers-hidesysops' => 'Sembunyikan pengurus',
'activeusers-noresult' => 'Pengguna tidak ditemukan.',
-# Special:Log/newusers
-'newuserlogpage' => 'Log pengguna baru',
-'newuserlogpagetext' => 'Di bawah ini adalah log pendaftaran pengguna baru',
-
# Special:ListGroupRights
'listgrouprights' => 'Daftar kelompok pengguna',
'listgrouprights-summary' => 'Berikut adalah daftar kelompok pengguna yang terdapat di wiki ini, dengan daftar hak akses mereka masing-masing. Informasi lebih lanjut mengenai hak masing-masing dapat ditemukan di [[{{MediaWiki:Listgrouprights-helppage}}|halaman bantuan hak pengguna]].',
@@ -2374,20 +2388,23 @@ Perubahan-perubahan berikutnya pada halaman tersebut dan halaman pembicaraan ter
'enotif_mailer' => 'Pengirim Notifikasi {{SITENAME}}',
'enotif_reset' => 'Tandai semua halaman sebagai telah dikunjungi',
-'enotif_newpagetext' => 'Ini adalah halaman baru.',
'enotif_impersonal_salutation' => 'Pengguna {{SITENAME}}',
-'changed' => 'diubah',
-'created' => 'dibuat',
-'enotif_subject' => 'Halaman $PAGETITLE di {{SITENAME}} telah $CHANGEDORCREATED oleh $PAGEEDITOR',
+'enotif_subject_deleted' => 'Halaman $1 di {{SITENAME}} telah dihapus oleh {{gender:$2|$2}}',
+'enotif_subject_created' => 'Halaman $1 di {{SITENAME}} telah dibuat oleh {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Halaman $1 di {{SITENAME}} telah dipindahkan oleh {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Halaman $1 di {{SITENAME}} telah dikembalikan oleh {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Halaman $1 di {{SITENAME}} telah diubah oleh {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Halaman $1 di {{SITENAME}} telah dihapus pada $PAGEEDITDATE oleh {{gender:$2|$2}}, lihat $3.',
+'enotif_body_intro_created' => 'Halaman $1 di {{SITENAME}} telah dibuat pada $PAGEEDITDATE oleh {{gender:$2|$2}}, lihat $3 untuk revisi terkini.',
+'enotif_body_intro_moved' => 'Halaman $1 di {{SITENAME}} telah dipindahkan pada $PAGEEDITDATE oleh {{gender:$2|$2}}, lihat $3 untuk revisi terkini.',
+'enotif_body_intro_restored' => 'Halaman $1 di {{SITENAME}} telah dikembalikan pada $PAGEEDITDATE oleh {{gender:$2|$2}}, lihat $3 untuk revisi terkini.',
+'enotif_body_intro_changed' => 'Halaman $1 di {{SITENAME}} telah diubah pada $PAGEEDITDATE oleh {{gender:$2|$2}}, lihat $3 untuk revisi terkini.',
'enotif_lastvisited' => 'Lihat $1 untuk semua perubahan sejak kunjungan terakhir Anda.',
'enotif_lastdiff' => 'Kunjungi $1 untuk melihat perubahan ini.',
'enotif_anon_editor' => 'pengguna anonim $1',
'enotif_body' => 'Halo $WATCHINGUSERNAME,
-
-Halaman $PAGETITLE di {{SITENAME}} telah $CHANGEDORCREATED pada $PAGEEDITDATE oleh $PAGEEDITOR, lihat $PAGETITLE_URL untuk revisi terakhir.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Ringkasan suntingan: $PAGESUMMARY $PAGEMINOREDIT
@@ -2398,7 +2415,7 @@ wiki: $PAGEEDITOR_WIKI
Kami tidak akan mengirim pemberitahuan lain bila ada perubahan lebih lanjut sampai Anda mengunjungi halaman ini.
Anda juga dapat menyetel ulang tanda pemberitahuan untuk semua halaman pantauan pada daftar pantauan Anda.
- Sistem pemberitahuan situs {{SITENAME}}
+Sistem pemberitahuan situs {{SITENAME}}
--
Untuk mengubah setelan pemberitahuan surel, kunjungi
@@ -2412,6 +2429,8 @@ $UNWATCHURL
Umpan balik dan bantuan lebih lanjut:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'dibuat',
+'changed' => 'diubah',
# Delete
'deletepage' => 'Hapus halaman',
@@ -2479,6 +2498,8 @@ Lihat [[Special:ProtectedPages|daftar halaman terlindungi]] untuk daftar perlind
'prot_1movedto2' => '[[$1]] dipindahkan ke [[$2]]',
'protect-badnamespace-title' => 'Ruang nama yang tidak dapat dilindungi',
'protect-badnamespace-text' => 'Halaman dalam ruang nama ini tidak dapat dilindungi.',
+'protect-norestrictiontypes-text' => 'Halaman ini tidak dapat dilindungi karena tidak ada tipe pembatasan yang tersedia.',
+'protect-norestrictiontypes-title' => 'Halaman tak-dilindungi',
'protect-legend' => 'Konfirmasi pelindungan',
'protectcomment' => 'Alasan:',
'protectexpiry' => 'Kedaluwarsa:',
@@ -2494,6 +2515,7 @@ Lihat [[Special:ProtectedPages|daftar halaman terlindungi]] untuk daftar perlind
'protect-fallback' => 'Hanya untuk pengguna dengan izin "$1"',
'protect-level-autoconfirmed' => 'Hanya untuk pengguna terdaftar otomatis',
'protect-level-sysop' => 'Hanya untuk pengurus',
+'protect-summary-desc' => '[$1=$2] ($3)',
'protect-summary-cascade' => 'runtun',
'protect-expiring' => 'kedaluwarsa $1 (UTC)',
'protect-expiring-local' => 'kedaluwarsa $1',
@@ -2556,7 +2578,8 @@ Alasan penghapusan diberikan pada ringkasan di bawah ini, berikut rincian penggu
'undeletedrevisions' => '$1 {{PLURAL:$1|revisi|revisi}} telah dikembalikan',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|revisi|revisi}} and $2 berkas dikembalikan',
'undeletedfiles' => '$1 {{PLURAL:$1|berkas|berkas}} dikembalikan',
-'cannotundelete' => 'Pembatalan penghapusan gagal; mungkin ada orang lain yang telah terlebih dahulu melakukan pembatalan.',
+'cannotundelete' => 'Pembatalan penghapusan gagal:
+$1',
'undeletedpage' => "'''$1 berhasil dikembalikan'''
Lihat [[Special:Log/delete|log penghapusan]] untuk data penghapusan dan pengembalian.",
@@ -2588,7 +2611,7 @@ $1',
'blanknamespace' => '(Utama)',
# Contributions
-'contributions' => 'Kontribusi pengguna',
+'contributions' => 'Kontribusi {{GENDER:$1|pengguna}}',
'contributions-title' => 'Kontribusi pengguna untuk $1',
'mycontris' => 'Kontribusi',
'contribsub2' => 'Untuk $1 ($2)',
@@ -2855,6 +2878,7 @@ Halaman yang dituju, "[[:$1]]", telah mempunyai isi. Apakah Anda hendak menghapu
'immobile-target-namespace-iw' => 'Pranala interwiki bukanlah target yang valid untuk pemindahan halaman.',
'immobile-source-page' => 'Halaman ini tidak dapat dipindahkan.',
'immobile-target-page' => 'Tidak dapat memindahkan ke judul tujuan tersebut.',
+'bad-target-model' => 'Tujuan yang diinginkan menggunakan model konten yang berbeda. Tidak dapat mengkonversi dari $1 untuk $2 .',
'imagenocrossnamespace' => 'Tidak dapat memindahkan berkas ke ruang nama non-berkas',
'nonfile-cannot-move-to-file' => 'Tidak dapat memindahkan non-berkas ke ruang nama berkas',
'imagetypemismatch' => 'Ekstensi yang diberikan tidak cocok dengan tipe berkas',
@@ -2968,6 +2992,7 @@ Simpan ke komputer Anda dan unggah ke sini.',
'import-error-interwiki' => 'Halaman " $1 " tidak diimpor karena namanya dicadangkan untuk pranala eksternal (interwiki).',
'import-error-special' => 'Halaman " $1 " tidak diimpor karena milik ruang nama khusus yang tidak mengizinkan adanya halaman.',
'import-error-invalid' => 'Halaman "$1" tidak diimpor karena namanya tidak valid.',
+'import-error-unserialize' => 'Revisi $2 halaman " $1 " tidak bisa diurutkan. Revisi dilaporkan untuk menggunakan konten model $3 urutan sebagai $4 .',
'import-options-wrong' => '{{PLURAL:$2|Opsi|Opsi}} salah: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Halaman turunan yang diberikan adalah judul yang salah.',
'import-rootpage-nosubpage' => 'Ruang nama "$1" di halaman turunan tidak mengizinkan subhalaman.',
@@ -2982,7 +3007,6 @@ Simpan ke komputer Anda dan unggah ke sini.',
# JavaScriptTest
'javascripttest' => 'Pengujian JavaScript',
-'javascripttest-disabled' => 'Fungsi ini belum diaktifkan di wiki ini.',
'javascripttest-title' => '$1 pengujian sedang berjalan',
'javascripttest-pagetext-noframework' => 'Halaman ini disediakan untuk pengujian JavaScript yang sedang berjalan.',
'javascripttest-pagetext-unknownframework' => 'Pengujian kerangka kerja "$1" tidak diketahui',
@@ -3131,11 +3155,13 @@ Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hit
'pageinfo-default-sort' => 'Kunci urut baku',
'pageinfo-length' => 'Panjang halaman (dalam bita)',
'pageinfo-article-id' => 'ID Halaman',
+'pageinfo-language' => 'Bahasa isi halaman',
'pageinfo-robot-policy' => 'Status mesin pencari',
'pageinfo-robot-index' => 'Dapat diindeks',
'pageinfo-robot-noindex' => 'Tidak dapat diindeks',
'pageinfo-views' => 'Jumlah penampilan',
'pageinfo-watchers' => 'Jumlah pemantau halaman',
+'pageinfo-few-watchers' => 'Kurang dari $1 {{PLURAL:$1|pengunjung}}',
'pageinfo-redirects-name' => 'Pengalihan ke halaman ini',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'Subhalaman halaman ini',
@@ -3151,6 +3177,19 @@ Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hit
'pageinfo-magic-words' => '{{PLURAL:$1|Kata|Kata}} ajaib ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategori|Kategori}} tersembunyi ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Templat|Templat}} yang ditransklusi ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Halaman}} ditransklusikan pada ($1)',
+'pageinfo-toolboxlink' => 'Informasi halaman',
+'pageinfo-redirectsto' => 'Beralih ke',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Dihitung sebagai halaman konten',
+'pageinfo-contentpage-yes' => 'Ya',
+'pageinfo-protect-cascading' => 'Perlindungan berurutan dari sini',
+'pageinfo-protect-cascading-yes' => 'Ya',
+'pageinfo-protect-cascading-from' => 'Perlindungan mulai dari',
+'pageinfo-category-info' => 'Kategori informasi',
+'pageinfo-category-pages' => 'Jumlah halaman',
+'pageinfo-category-subcats' => 'Jumlah subkategori',
+'pageinfo-category-files' => 'Jumlah berkas',
# Skin names
'skinname-standard' => 'Klasik',
@@ -3173,6 +3212,8 @@ Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hit
'markedaspatrollederror' => 'Tidak dapat menandai telah dipatroli',
'markedaspatrollederrortext' => 'Anda harus menentukan satu revisi untuk ditandai sebagai yang dipatroli.',
'markedaspatrollederror-noautopatrol' => 'Anda tidak diizinkan menandai suntingan Anda sendiri dipatroli.',
+'markedaspatrollednotify' => 'Perubahan ini untuk $1 telah ditandai terpatroli.',
+'markedaspatrollederrornotify' => 'Menandai sebagai terpatroli gagal.',
# Patrol log
'patrol-log-page' => 'Log patroli',
@@ -3207,6 +3248,7 @@ Jika dijalankan, sistem Anda akan berisiko terserang.",
'file-nohires' => 'Tak tersedia resolusi yang lebih tinggi.',
'svg-long-desc' => 'Berkas SVG, nominal $1 × $2 piksel, besar berkas: $3',
'svg-long-desc-animated' => 'Berkas SVG animasi, biasanya $1 x $2 piksel, ukuran gambar: $3',
+'svg-long-error' => 'Berkas SVG tidak sah: $1',
'show-big-image' => 'Resolusi penuh',
'show-big-image-preview' => 'Ukuran pratayang ini: $1.',
'show-big-image-other' => '{{PLURAL:$2|Resolusi|Resolusi}} lain: $1.',
@@ -3241,7 +3283,10 @@ Jika dijalankan, sistem Anda akan berisiko terserang.",
'minutes' => '{{PLURAL:$1|$1 menit|$1 menit}}',
'hours' => '{{PLURAL:$1|$1 jam|$1 jam}}',
'days' => '{{PLURAL:$1|$1 hari|$1 hari}}',
+'months' => '{{PLURAL:$1|$1 bulan|$1 bulan}}',
+'years' => '{{PLURAL:$1|$1 tahun|$1 tahun}}',
'ago' => '$1 yang lalu',
+'just-now' => 'baru saja',
# Bad image list
'bad_image_list' => 'Formatnya sebagai berikut:
@@ -3809,6 +3854,7 @@ Kode konfirmasi ini akan kedaluwarsa pada $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Transklusi interwiki dimatikan]',
'scarytranscludefailed' => '[Pengambilan templat $1 gagal]',
+'scarytranscludefailed-httpstatus' => '[Pengambilan templat $1 gagal: HTTP $2]',
'scarytranscludetoolong' => '[URL terlalu panjang]',
# Delete conflict
@@ -3974,6 +4020,7 @@ Anda juga dapat [[Special:EditWatchlist|menggunakan penyunting standar Anda]].',
'version-license' => 'Lisensi',
'version-poweredby-credits' => "Wiki ini didukung oleh '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
'version-poweredby-others' => 'lainnya',
+'version-credits-summary' => 'Kami ingin mengakui orang-orang berikut atas kontribusinya terhadap [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki adalah perangkat lunak bebas; Anda diperbolehkan untuk mendistribusikan dan/atau memodfikasinya dengan persyaratan Lisensi Publik Umum GNU yang diterbitkan oleh Free Software Foundation; versi 2 atau terbaru.
MediaWiki didistribusikan dengan harapan dapat digunakan, tetapi TANPA JAMINAN APA PUN; tanpa jaminan PERDAGANGAN atau KECOCOKAN UNTUK TUJUAN TERTENTU. Lihat Lisensi Publik Umum GNU untuk informasi lebih lanjut.
@@ -4089,17 +4136,17 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
'sqlite-no-fts' => '$1 tanpa dukungan pencarian teks lengkap',
# New logging system
-'logentry-delete-delete' => '$1 menghapus halaman $3',
-'logentry-delete-restore' => '$1 mengembalikan halaman $3',
-'logentry-delete-event' => '$1 mengubah ketertampilan {{PLURAL:$5||}} $5 log peristiwa di $3: $4',
-'logentry-delete-revision' => '$1 mengubah ketertampilan {{PLURAL:$5||}} $5 revisi di halaman $3: $4',
-'logentry-delete-event-legacy' => '$1 mengubah ketertampilan log peristiwa pada $3',
-'logentry-delete-revision-legacy' => '$1 mengubah ketertampilan revisi pada halaman $3',
-'logentry-suppress-delete' => '$1 mensupresi halaman $3',
-'logentry-suppress-event' => '$1 secara diam-diam mengubah ketertampilan {{PLURAL:$5||}} $5 log peristiwa di $3: $4',
-'logentry-suppress-revision' => '$1 diam-diam mengubah ketertampilan {{PLURAL:$5||}} $5 revisi di halaman $3: $4',
-'logentry-suppress-event-legacy' => '$1 diam-diam mengubah ketertampilan log peristiwa pada $3',
-'logentry-suppress-revision-legacy' => '$1 diam-diam mengubah ketertampilan revisi pada halaman $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|menghapus}} halaman $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|mengembalikan}} halaman $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|mengubah}} tampilan {{PLURAL:$5|$5 log peristiwa}} di $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|mengubah}} tampilan {{PLURAL:$5|$5 revisi}} di halaman $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|mengubah}} tampilan log peristiwa pada $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|mengubah}} tampilan revisi pada halaman $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|menimpa}} halaman $3',
+'logentry-suppress-event' => '$1 secara diam-diam {{GENDER:$2|mengubah}} tampilan {{PLURAL:$5|$5 log peristiwa}} di $3: $4',
+'logentry-suppress-revision' => '$1 diam-diam {{GENDER:$2|mengubah}} tampilan {{PLURAL:$5|$5 revisi}} di halaman $3: $4',
+'logentry-suppress-event-legacy' => '$1 diam-diam {{GENDER:$2|mengubah}} tampilan log peristiwa pada $3',
+'logentry-suppress-revision-legacy' => '$1 diam-diam {{GENDER:$2|mengubah}} tampilan revisi pada halaman $3',
'revdelete-content-hid' => 'konten disembunyikan',
'revdelete-summary-hid' => 'ringkasan suntingan disembunyikan',
'revdelete-uname-hid' => 'nama pengguna disembunyikan',
@@ -4108,17 +4155,21 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
'revdelete-uname-unhid' => 'nama pengguna tidak disembunyikan',
'revdelete-restricted' => 'akses telah dibatasi untuk opsis',
'revdelete-unrestricted' => 'pembatasan akses opsis dihapuskan',
-'logentry-move-move' => '$1 memindahkan halaman $3 ke $4',
-'logentry-move-move-noredirect' => '$1 memindahkan halaman $3 ke $4 tanpa membuat pengalihan',
-'logentry-move-move_redir' => '$1 memindahkan halaman $3 ke $4 menimpa pengalihan lama',
-'logentry-move-move_redir-noredirect' => '$1 memindahkan halaman $3 ke $4 menimpa pengalihan lama tanpa membuat pengalihan',
-'logentry-patrol-patrol' => '$1 menandai revisi $4 dari halaman $3 terpatroli',
-'logentry-patrol-patrol-auto' => '$1 secara otomatis menandai revisi $4 dari halaman $3 terpatroli',
-'logentry-newusers-newusers' => 'Akun pengguna $1 telah dibuat',
-'logentry-newusers-create' => '$1 membuat akun pengguna',
-'logentry-newusers-create2' => '$1 membuat akun pengguna $3',
-'logentry-newusers-autocreate' => 'Akun $1 dibuat secara otomatis',
-'newuserlog-byemail' => 'kata sandi dikirim melalui surel',
+'logentry-move-move' => '$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4 tanpa membuat pengalihan',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4 menimpa pengalihan lama',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4 menimpa pengalihan lama tanpa membuat pengalihan',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|menandai}} revisi $4 dari halaman $3 terpatroli',
+'logentry-patrol-patrol-auto' => '$1 otomatis {{GENDER:$2|menandai}} revisi $4 dari halaman $3 terpatroli',
+'logentry-newusers-newusers' => 'Akun pengguna $1 telah {{GENDER:$2|dibuat}}',
+'logentry-newusers-create' => '$1 {{GENDER:$2|membuat}} akun pengguna',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|membuat}} akun pengguna $3',
+'logentry-newusers-byemail' => 'Akun pengguna $3 {{GENDER:$2|dibuat}} oleh $1 dan password dikirim melalui surel',
+'logentry-newusers-autocreate' => 'Akun $1 {{GENDER:$2|dibuat}} secara otomatis',
+'logentry-rights-rights' => '$1 {{GENDER:$2|mengubah}} keanggotaan grup $3 dari $4 menjadi $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|mengubah}} keanggotaan grup $3',
+'logentry-rights-autopromote' => '$1 secara otomatis {{GENDER:$2|dipromosikan}} dari $4 menjadi $5',
+'rightsnone' => '(tidak ada)',
# Feedback
'feedback-bugornote' => 'Jika Anda sudah siap untuk mendeskripsikan masalah teknis secara rinci silakan [$1 melaporkan bug].
@@ -4172,6 +4223,7 @@ Jika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda ak
'api-error-ok-but-empty' => 'Kesalahan internal: tidak ada tanggapan dari peladen.',
'api-error-overwrite' => 'Tidak diizinkan untuk menimpa berkas yang sudah ada.',
'api-error-stashfailed' => 'Kesalahan internal: server gagal menyimpan berkas sementara.',
+'api-error-publishfailed' => 'Kesalahan internal: server gagal menyimpan berkas sementara.',
'api-error-timeout' => 'Peladen tidak merespons dalam waktu yang diharapkan.',
'api-error-unclassified' => 'Terjadi galat yang tidak diketahui',
'api-error-unknown-code' => 'Kesalahan tidak dikenal: "$1"',
@@ -4192,4 +4244,7 @@ Jika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda ak
'duration-centuries' => '{{PLURAL:$1||}}$1 abad',
'duration-millennia' => '{{PLURAL:$1||}}$1 milenium',
+# Image rotation
+'rotate-comment' => 'Gambar diputar $1 {{PLURAL:$1|derajat}} searah jarum jam',
+
);
diff --git a/languages/messages/MessagesIe.php b/languages/messages/MessagesIe.php
index e6b0272a..281987db 100644
--- a/languages/messages/MessagesIe.php
+++ b/languages/messages/MessagesIe.php
@@ -102,7 +102,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Nov_changes' ),
'Recentchangeslinked' => array( 'Changes_referet', 'Changes_relatet' ),
'Revisiondelete' => array( 'Deleter_revision' ),
- 'RevisionMove' => array( 'Mover_revision' ),
'Search' => array( 'Serchar' ),
'Shortpages' => array( 'Págines_curt' ),
'Specialpages' => array( 'Págines_special' ),
@@ -263,7 +262,6 @@ $messages = array(
'qbfind' => 'Constatar',
'qbedit' => 'Redacter',
'qbpageoptions' => 'Págine de optiones',
-'qbpageinfo' => 'Págine de information',
'qbmyoptions' => 'Mi optiones',
'qbspecialpages' => 'Págines special',
'faq' => 'FAQ',
@@ -422,11 +420,8 @@ Li motive dat es "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Vu ha terminat vor session.'''
-Vu posse continuar usar {{SITENAME}} anonimimen, o vu posse [[Special:UserLogin|aperter un session denov]] quam li sam usator o quam un diferent usator.
+Vu posse continuar usar {{SITENAME}} anonimimen, o vu posse <span class='plainlinks'>[$1 aperter un session denov]</span> quam li sam usator o quam un diferent usator.
Nota que alcun págines posse continuar esser monstrat quam si vu esset registrat, til que vu vacua li cache de tui navigator.",
-'welcomecreation' => '== Benevenit, $1! ==
-Tui conto hat esset creat.
-Ne oblivia de mutar tui [[Special:Preferences|preferenties de {{SITENAME}}]].',
'yourname' => 'Nómine de usator:',
'yourpassword' => 'Parol-clave:',
'yourpasswordagain' => 'Parol-clave denov:',
@@ -720,9 +715,11 @@ Tui adresse de e-mail ne es revelat quande altri usatores contacter vu.',
'grouppage-bureaucrat' => '{{ns:project}}:Burócrates',
'grouppage-suppress' => '{{ns:project}}:Vigilatores',
+# Special:Log/newusers
+'newuserlogpage' => 'Diarium de creation de usator',
+
# User rights log
'rightslog' => 'Diarium de jures de usator',
-'rightsnone' => '(null)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'redacter ti págine',
@@ -972,9 +969,6 @@ Li descrition es in li [$2 págine de descrition del file] ta e es monstrat in i
'linksearch-ns' => 'Spacie de nómine:',
'linksearch-line' => '$1 es ligat de $2',
-# Special:Log/newusers
-'newuserlogpage' => 'Diarium de creation de usator',
-
# Special:ListGroupRights
'listgrouprights-members' => '(liste de membres)',
@@ -1419,4 +1413,7 @@ Vu posse anc [[Special:EditWatchlist|usar li redactor uniform]].',
'tags-edit' => 'redacter',
'tags-hitcount' => '$1 {{PLURAL:$1|change|changes}}',
+# New logging system
+'rightsnone' => '(null)',
+
);
diff --git a/languages/messages/MessagesIg.php b/languages/messages/MessagesIg.php
index 9224c2f9..04e00f7f 100644
--- a/languages/messages/MessagesIg.php
+++ b/languages/messages/MessagesIg.php
@@ -218,7 +218,6 @@ $messages = array(
'qbbrowse' => 'Garia',
'qbedit' => 'Mèzi',
'qbpageoptions' => 'Ihü nka',
-'qbpageinfo' => 'Abwátà nka',
'qbmyoptions' => 'Ihüm',
'qbspecialpages' => 'Ihü mkpà',
'faq' => 'FAQ',
@@ -439,11 +438,8 @@ Maka ikuwaria na asụsụ nke ozor, biko chetu I ji [//translatewiki.net/wiki/M
# Login and logout pages
'logouttext' => "'''I fwuóla ubwá.'''
-I nwèríkí jíwá {{SITENAME}} na nke ẹnwéghi áhà, mànà à nwèríkí [[Special:UserLogin|bátá òzá»r]] na áhà à shị fwüo ma áhà ozá»r.
+I nwèríkí jíwá {{SITENAME}} na nke ẹnwéghi áhà, mànà à nwèríkí <span class='plainlinks'>[$1 bátá òzá»r]</span> na áhà à shị fwüo ma áhà ozá»r.
Màkwá na o dị ihü gi zi kà à nor kwa ímé, o gi kwüshí mgbe à sáfùrù cache ihe ishi a gá intanet gi.",
-'welcomecreation' => '== Nnöö, $1! ==
-Okíkè buwa gi a guchala.
-E chefụkwạlạ I gbanwere [[Special:Preferences|{{SITENAME}} iheichá»rá»]].',
'yourname' => "Ãhà á»'bànifé:",
'yourpassword' => 'Okwúngáfè:',
'yourpasswordagain' => 'Detuari mkpurụ okwu ejị a gafẹ:',
@@ -605,7 +601,6 @@ Ndetu banyéré nkè ogẹ nso di na okpúrụ màkà ádịamámá:",
'template-protected' => '(cẹdoluecẹdo)',
'template-semiprotected' => '(cẹdolu-ntakiri)',
'hiddencategories' => 'Ihü a dị nà nke ótù {{PLURAL:$1|ébéoná»r zá»nàrì nke 1|ébéoná»r zá»nàrì nke $1}}:',
-'nocreatetitle' => 'à ké ihü nwèrè ùbe',
'nocreate-loggedin' => 'à nwéghi á»dà à ké ihü ohụrụ.',
'permissionserrors' => 'Nsobgu na á»dà',
'permissionserrorstext-withaction' => 'à nwéghi á»dà à $2, {{PLURAL:$1|màkà|màkà}} ihe ha detùrù na àlà nga:',
@@ -615,6 +610,9 @@ Ndetu banyéré nkè ogẹ nso di na okpúrụ màkà ádịamámá:",
'edit-already-exists' => 'Ènwéghịkị ké ihü nke á»húrù.
Ọ di kwa.',
+# Content models
+'content-model-wikitext' => 'wikitext',
+
# Parser/template warnings
'parser-template-loop-warning' => 'Etemete àtụ dị: [[$1]]',
@@ -859,9 +857,11 @@ Nwàné ótù okwu íshí na ihe à nè tú jí ''háníle:'' à tuó ihe nílé
'right-bigdelete' => 'Kàcha ihü nwéré ákíkó mbu dí ógólógó',
'right-undelete' => 'Ãgbakashia ótù ihü',
+# Special:Log/newusers
+'newuserlogpage' => "Ndétu nchétá ihe á»'bànifé kèrè",
+
# User rights log
'rightslog' => "Ndetu échìchè íwú á»'bànifé",
-'rightsnone' => '(efù)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'guwa ihüá',
@@ -1108,9 +1108,6 @@ Ubwa, o na ga [[$2]].',
'activeusers-hidesysops' => 'Zonari ndi íshí',
'activeusers-noresult' => "Ọ hügị á»'bànifé.",
-# Special:Log/newusers
-'newuserlogpage' => "Ndétu nchétá ihe á»'bànifé kèrè",
-
# Special:ListGroupRights
'listgrouprights-group' => 'Ọtú',
'listgrouprights-rights' => 'Nkwènyé',
@@ -1149,10 +1146,9 @@ Ihe gi gbanwe na ógè gi bya nà ihüá na ihü okwu ya gi di ndétu ngáhù, n
'unwatching' => 'O mele ka o na á hü kwagi...',
'enotif_impersonal_salutation' => "á»'bànifé {{SITENAME}}",
-'changed' => 'gbanwere',
-'created' => 'kèrè',
-'enotif_subject' => 'Ihü {{SITENAME}} $PAGETITLE à gálá $CHANGEDORCREATED nà áká $PAGEEDITOR',
'enotif_anon_editor' => "á»'bànifé ézíghị ihu $1",
+'created' => 'kèrè',
+'changed' => 'gbanwere',
# Delete
'deletepage' => 'Kàchafu ihü',
@@ -1471,6 +1467,9 @@ Biko meríáríá ozor.',
'pageinfo-header-edits' => 'Mèzí ịta',
'pageinfo-length' => 'Ogologo ihü (na baitusu)',
'pageinfo-article-id' => 'ID Ihü',
+'pageinfo-redirectsto-info' => 'á»Ìmárí',
+'pageinfo-contentpage-yes' => 'Eeh',
+'pageinfo-protect-cascading-yes' => 'Eeh',
# Image deletion
'filedeleteerror-short' => 'Nsògbú í kàcha usòrò: $1',
@@ -1493,6 +1492,9 @@ Biko meríáríá ozor.',
'ilsubmit' => 'Chá»wa',
'bydate' => 'shi afá»',
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'just-now' => 'ùgbú ùgbúa',
+
# Bad image list
'bad_image_list' => 'Ọtụ ȯ dị détùrù ngá:
@@ -1751,6 +1753,7 @@ Nke ozor gí zonari na áká onwe ha.
# New logging system
'revdelete-content-hid' => 'ihe zá»Ì€nàri',
+'rightsnone' => '(efù)',
# Feedback
'feedback-message' => 'Ozi:',
diff --git a/languages/messages/MessagesIke_cans.php b/languages/messages/MessagesIke_cans.php
index 1de85c96..95f36016 100644
--- a/languages/messages/MessagesIke_cans.php
+++ b/languages/messages/MessagesIke_cans.php
@@ -143,8 +143,6 @@ $messages = array(
'editinginterface' => "'''áƒá“‚ᖅᑎᕈᑎ—''' á‹á•¼áŠ ᓱá–ᓯᖅṠáƒá‘­áŠá–… ᒪᑉá±á‘•á–… áŠá‘áƒá“ᓇᓯᕗᖅ á„ᔭᑦᓴᖅ ᖃᕋᓴá…á”­á–… á‘•á–…á“´á“•á–…á¹ áƒá‘­áŠá–… áŠá•¿á‘¦á‘á–… ᖃᕆᑕá…á”­á…ᑉ á‘Žá‘Žá•‹á•á••á–“. áŠá“¯áŠá™³á‘á–… áƒá‘­áŠá–… ᒪᑉá±á‘•á–… áƒá“„ᒃᑎá‘ᑦ á…áƒá‘­á±á‘ŽáŠ áŠá“ªá“šá–‘á–…á‘áŠá–… ᓇᑭᒪᖅá³á–… ᖃᑕᙳᑎ.",
# Login and logout pages
-'welcomecreation' => "== áŠá•†á…ᙵáƒá¹, $1! ==
-á±á’‹á•—á–… ᖃᑕᙳᑎ á…áƒá‘­á±á‘ŽáŠ ᑮᓇá…á”­á–á‘Žá–ƒá•á••á’ƒ áƒá“±áƒá“ªá“•á–“áƒá‘¦á”­á¹. áƒá–…á‘‘ ᓱá–ᓯᖅṠ{{SITENAME}} áƒá“á“‚áŠá‘á–… «''á“‚á± áŠá’¥''»",
'yourname' => 'á…áƒá‘­á±á‘ŽáŠ áŠá‘Žá–…',
'yourpassword' => 'á…áƒá‘­á±á‘ŽáŠ á¸á“šá™µá“´á…á‘Ž',
'yourpasswordagain' => 'á‘•á’ªá‘ᒪᓃᖅṠáƒá’ƒá“¯á’á–…á‘á–… á…áƒá‘­á±á‘ŽáŠ á¸á“šá™µá“´á…á‘Ž',
diff --git a/languages/messages/MessagesIke_latn.php b/languages/messages/MessagesIke_latn.php
index 791ed2f7..79fe8922 100644
--- a/languages/messages/MessagesIke_latn.php
+++ b/languages/messages/MessagesIke_latn.php
@@ -127,8 +127,6 @@ $messages = array(
'editinginterface' => "'''iniqtiruti—''' aaha suqusiqpaa iqiak mappitaq atuinnasivuq iijatsaq qarasaujaq taqsaliqpaa ikiaq aqittuq qaritaujaup titirarvinga. asiaNngutuq ikiaq mappitaq inuktitut uikipitia allanguqtuaq nakimaqpuq qatannguti.",
# Login and logout pages
-'welcomecreation' => "== ariunngaipaa, $1! ==
-pigivuq qatannguti uikipitia kiinaujaqutiqarvik isuillingaitjapaa. iqtuu suqusiqpa{{SITENAME}} inniatuq—«''nipi ami''»",
'yourname' => 'uikipitia atiq',
'yourpassword' => 'uikipitia palanngasauti',
'yourpasswordagain' => 'tamatumaniiqpaa iksigaqtuq uikipitia palanngasauti',
diff --git a/languages/messages/MessagesIlo.php b/languages/messages/MessagesIlo.php
index c1432476..ed666125 100644
--- a/languages/messages/MessagesIlo.php
+++ b/languages/messages/MessagesIlo.php
@@ -168,6 +168,7 @@ $messages = array(
'newwindow' => '(aglukat iti sabali a tawa)',
'cancel' => 'Ukasen',
'moredotdotdot' => 'Adu pay...',
+'morenotlisted' => 'Adu a saan a nailista...',
'mypage' => 'Panid',
'mytalk' => 'Tungtungan',
'anontalk' => 'Tungtungan para iti daytoy a pagtaengan ti IP',
@@ -179,7 +180,6 @@ $messages = array(
'qbbrowse' => 'Agbasabasa',
'qbedit' => 'Urnosen',
'qbpageoptions' => 'Daytoy a panid',
-'qbpageinfo' => 'Linaon',
'qbmyoptions' => 'Pampanidko',
'qbspecialpages' => 'Espesial a pampanid',
'faq' => 'FAQ',
@@ -202,6 +202,7 @@ $messages = array(
'namespaces' => 'Nagan ti lug-lugar',
'variants' => 'Sab-sabali a pagsasao',
+'navigation-heading' => 'Pagpilian ti pagdaliasatan',
'errorpagetitle' => 'Biddut',
'returnto' => 'Agsubli idiay $1.',
'tagline' => 'Naggapo idiay {{SITENAME}}',
@@ -446,10 +447,10 @@ Ti administrador a nagserra ket nagited iti daytoy a panagilawlawag "\'\'$3\'\'"
# Login and logout pages
'logouttext' => "'''Nakaruarkan.'''
-Mabalinmo nga ituloy ti agusar iti {{SITENAME}} a di am-ammo, wenno [[Special:UserLogin|sumrek ka manen]] iti sigud wenno sabali nga agar-aramat.
+Mabalinmo nga ituloy ti agusar iti {{SITENAME}} a di am-ammo, wenno <span class='plainlinks'>[\$1 sumrek ka manen]</span> iti sigud wenno sabali nga agar-aramat.
Laglagipem a sumagmamano a pampanid ti mabalin a nakaparang latta a kasla nakaserrekka pay laeng, aginggana no dalusam ti \"cache\" ti panagbasabasam.",
-'welcomecreation' => '== Naragsak nga isasangbay, $1! ==
-Naaramiden ti pakabilangam.
+'welcomeuser' => 'Naragsak nga isasangbay, $1!',
+'welcomecreation-msg' => 'Naaramiden ti pakabilangam.
Dimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITENAME}} kakaykayatan]].',
'yourname' => 'Nagan ti agar-aramat:',
'yourpassword' => 'Kontrasenias:',
@@ -473,7 +474,7 @@ Dimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITE
'gotaccount' => "Addaanka kadin ti pakabilangam? '''$1'''.",
'gotaccountlink' => 'Sumrek',
'userlogin-resetlink' => 'Nalipatam dagiti salaysay ti pagserrek mo?',
-'createaccountmail' => 'Babaen ti e-surat',
+'createaccountmail' => 'Agusar ti maysa a temporario a pugto a kontrasenias ken ipatulod idiay esurat a pagtaengan a nainaganan dita baba',
'createaccountreason' => 'Rason:',
'badretype' => 'Saan nga agpada dagiti impanmo a kontrasenias.',
'userexists' => 'Maus-usaren ti nagan a kayatmo.
@@ -555,6 +556,7 @@ Pangaasi nga agurayka sakbay nga agipadas manen.',
# Email sending
'php-mail-error-unknown' => 'Di am-ammo a biddut iti surat ti PHP () a pamay-an.',
'user-mail-no-addy' => 'Pinadas nga inpatulod ti esurat nga awan ti esurat a pagtaengan.',
+'user-mail-no-body' => 'Nangpadaska a nangipatulod ti esurat nga awan linaonna wenno ababa laeng a bagi.',
# Change password dialog
'resetpass' => 'Sukatan ti kontrasenias',
@@ -611,7 +613,7 @@ agtuloykan nga agusar ti daan a kontraseniasmo.',
Temporario a kontrasenias: $2',
'passwordreset-emailsent' => 'Ti maysa nga esurat ti panangidisso manen ti kontrasenias ket naipatuloden.',
'passwordreset-emailsent-capture' => 'Ti maysa nga esurat ti panangidisso manen ti kontrasenias ket naipatuloden, a napaikita dita baba.',
-'passwordreset-emailerror-capture' => 'Naaramid ti palagip nga e-surat, a napaikita dita baba, ngem napaay a napaitulod iti agar-aramat: $1',
+'passwordreset-emailerror-capture' => 'Ti maysa nga esurat ti panangidisso manen ti kontrasenias ket naaramiden, a napaikita dita baba, ngem napaay a napaitulod iti agar-aramat: $1',
# Special:ChangeEmail
'changeemail' => 'Sukatan ti esurat a pagtaengan',
@@ -621,6 +623,7 @@ Temporario a kontrasenias: $2',
'changeemail-oldemail' => 'Agdama nga esurat a pagtaengam:',
'changeemail-newemail' => 'Baro nga esurat a pagtaengan:',
'changeemail-none' => '(awan)',
+'changeemail-password' => 'Ti bukodmo a kontrasenias ti {{SITENAME}}:',
'changeemail-submit' => 'Sukatan ti esurat',
'changeemail-cancel' => 'Ukasen',
@@ -809,7 +812,6 @@ Ti kinaudi a naikabil iti listaan ket naikabil dita baba tapno usaren a reperens
'template-protected' => '(nasalakniban)',
'template-semiprotected' => '(nasalakniban-bassit)',
'hiddencategories' => 'Daytoy a panid ket kameng {{PLURAL:$1|ti 1 a nailemmeng a kategoria|dagiti $1 a nailemmeng a kategoria}}:',
-'nocreatetitle' => 'Napatinggaan ti panagaramid iti panid',
'nocreatetext' => 'Pinaritan ti {{SITENAME}} ti kabaelan a panagaramid iti kabarbaro a pampanid.
Mabalinmo ti agsubli ken urnosen ti adda a panid, wenno [[Special:UserLogin|sumrek wenno agaramid ti pakabilangan]].',
'nocreate-loggedin' => 'Awan ti pammalubosmo nga agpartuat kadagiti baro a panid.',
@@ -834,6 +836,15 @@ Kasla met naikkaten.',
'edit-already-exists' => 'Saan a makaaramid ti baro a panid.
Adda met daytoyen.',
'defaultmessagetext' => 'Kasisigud a testo ti mensahe',
+'content-failed-to-parse' => 'Napaay a nausig ti $2 a linaon para iti $1 a modelo: $3',
+'invalid-content-data' => 'Imbalido a datos ti linaon',
+'content-not-allowed-here' => 'Ti "$1" a linaon ket saan a maipalubos idiay [[$2]] a panid',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'naranas a testo',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Ballaag:''' Daytoy a panid ket adu unay kadagiti nangina a parser a pamay-an a panagtawtawag.
@@ -1204,9 +1215,9 @@ Ngem saanto a mabalinen nga ipasubli.',
'prefs-emailconfirm-label' => 'Pammasingked ti esurat:',
'prefs-textboxsize' => 'Ti kadakkel ti pagurnosan a tawa',
'youremail' => 'Esurat:',
-'username' => 'Nagan ti agar-aramat:',
-'uid' => 'ID ti agar-aramat:',
-'prefs-memberingroups' => 'Kameng iti {{PLURAL:$1|a bunggoy| a bungbunggoy}}:',
+'username' => '{{GENDER:$1|Nagan ti agar-aramat}}:',
+'uid' => 'ID ti {{GENDER:$1|Agar-aramat}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Kameng}} ti {{PLURAL:$1|a grupo|a grupgrupo}}:',
'prefs-registration' => 'Oras a nagrehistro:',
'yourrealname' => 'Pudno a nagan:',
'yourlanguage' => 'Pagsasao:',
@@ -1358,12 +1369,13 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
'right-sendemail' => 'Agpatulod ti esurat kadagiti sabali nga agar-aramat',
'right-passwordreset' => 'Kitaen dagiti esurat a panagidisso manen ti kontrasenias',
+# Special:Log/newusers
+'newuserlogpage' => 'Listaan dagiti naaramid nga agar-aramat',
+'newuserlogpagetext' => 'Listaan dagiti panakaramid ti agar-aramat.',
+
# User rights log
'rightslog' => 'Listaan dagiti karbengan ti agar-aramat',
'rightslogtext' => 'Listaan daytoy kadagiti sinukatan a karbengan ti agar-aramat.',
-'rightslogentry' => 'sinukatan ti panagkameng iti bunggoy ti $1 manipud $2 iti $3',
-'rightslogentry-autopromote' => 'naautomatiko a naipangato a naggapo iti $2 idiay $3',
-'rightsnone' => '(awan)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'basaen datoy a panid',
@@ -1600,6 +1612,7 @@ No ti parikut ket agsubli latta, kontaken ti [[Special:ListUsers/sysop|administr
'backend-fail-notsame' => 'Addaan ti saan a kapada ti papeles idiay $1.',
'backend-fail-invalidpath' => '$1 ket imbalido a pagnaan ti pagidulinan.',
'backend-fail-delete' => 'Saan a maikkat ti papeles $1.',
+'backend-fail-describe' => 'Saam a mabaliwan ti metadata para iti papeles ti "$1".',
'backend-fail-alreadyexists' => 'Ti papeles $1 ket addan.',
'backend-fail-store' => 'Saan a maidulin ti papeles $1 idiay $2.',
'backend-fail-copy' => 'Saan a makopia ti papeles $1 idiay $2.',
@@ -1836,6 +1849,12 @@ Laglagipem ti agkita kadagiti sabsabali a panilpo ti plantilia sakbay nga ikkate
Dagitoy ket embes a nasken a maisilpoda kadagiti maitutop a panid.<br />
Ti panid ket matrato a kas panangilawlawag a panid no agusar ti plantilia a nakasilpo manipud idiay [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Pampanid nga adda maysa a tagikua ti panid',
+'pageswithprop-legend' => 'Pampanid nga adda maysa a tagikua ti panid',
+'pageswithprop-text' => 'Daytoy a panid ket ilistana ti pampanid nga agus-usar ti naisangayan a tagikua ti panid.',
+'pageswithprop-prop' => 'Nagan ti tagikua:',
+'pageswithprop-submit' => 'Inkan',
+
'doubleredirects' => 'Dagiti namindua a naibaw-ing',
'doubleredirectstext' => 'Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabsabali a baw-ing a pampanid.
Iti tunggal maysa nga aray ket adda nagyanna kadagiti panilpo iti umuna ken maikadua a baw-ing, ken iti puntaan iti maikadua a baw-ing, nga isu ti "pudno" a puntaan ti panid, nga ti umuna a baw-ing ket isu ti ipatudona.
@@ -1987,9 +2006,9 @@ Kitaen met [[Special:WantedCategories|dagiti makidkiddaw a kategoria]].',
'linksearch-pat' => 'Alagad ti panagbiruk:',
'linksearch-ns' => 'Nagan ti lugar:',
'linksearch-ok' => 'Biruken',
-'linksearch-text' => 'Ti naataap a tarheta a kas "*.wikipedia.org" ket mabalin nga usaren.
+'linksearch-text' => 'Ti naataap a tarheta a kas ti "*.wikipedia.org" ket mabalin nga usaren.
Masapul ti kangatuan a pagturayan, a kaspagarigan "*.org".<br />
-Dagiti nasuportaran a protokol: <code>$1</code> (naipakasigud ti http:// no awan ti protokol a nainaganan).',
+{{PLURAL:$2|Ti protokol|Dagiti protokol}} a nasuportaran: <code>$1</code> (naipakasigud ti http:// no awan ti protokol a nainaganan).',
'linksearch-line' => 'Ti $1 ket nakasilpo idiay $2',
'linksearch-error' => 'Ti naatap a tarheta ket agparang laeng iti pinagrugi ti nagan ti agsangaili.',
@@ -2008,10 +2027,6 @@ Dagiti nasuportaran a protokol: <code>$1</code> (naipakasigud ti http:// no awan
'activeusers-hidesysops' => 'Ilemmeng dagiti administrador',
'activeusers-noresult' => 'Awan ti nasarakan nga agar-aramat.',
-# Special:Log/newusers
-'newuserlogpage' => 'Listaan dagiti naaramid nga agar-aramat',
-'newuserlogpagetext' => 'Listaan dagiti panakaramid ti agar-aramat.',
-
# Special:ListGroupRights
'listgrouprights' => 'Dagiti karbengan ti grupo ti agar-aramat',
'listgrouprights-summary' => 'Dagiti sumaganad a listaan ti bunggoy ti agar-aramat a naipalawag iti daytoy a wiki, a nairaman dagiti karbengan ti panagserrekda.
@@ -2106,20 +2121,23 @@ Dagiti masakbayan a panagsukat iti daytoy a panid ken dagiti mainaig a tungtunga
'enotif_mailer' => 'Agipatulod ti pakiammo ti {{SITENAME}}',
'enotif_reset' => 'Markaan amin a pampanid a kas nasarungkaranen',
-'enotif_newpagetext' => 'Baro daytoy a panid.',
'enotif_impersonal_salutation' => '{{SITENAME}} agar-aramat',
-'changed' => 'nasukatan',
-'created' => 'naaramid',
-'enotif_subject' => 'Ti {{SITENAME}} a panid a $PAGETITLE ket $CHANGEDORCREATED ni $PAGEEDITOR',
+'enotif_subject_deleted' => 'Ti {{SITENAME}} a panid ti $1 ket inikkat idin babaen ni {{gender:$2|$2}}',
+'enotif_subject_created' => 'Ti {{SITENAME}} a panid ti $1 ket napartuat idin babaen ni {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Ti {{SITENAME}} panid ti $1 ket naiyalis idin babaen ni {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Ti {{SITENAME}} a panid ti $1 ket naipasubli idin babaen ni {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Ti {{SITENAME}} a panid ti $1 ket nasukatan idin babaen ni {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Ti {{SITENAME}} a panid tie $1 ket {{GENDER:$2|naikkaten}} idiay $PAGEEDITDATE babaen ni $2, kitaen ti $3.',
+'enotif_body_intro_created' => 'Ti {{SITENAME}} a panid ti $1 ket napartuat idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
+'enotif_body_intro_moved' => 'Ti {{SITENAME}} a panid ti $1 ket naiyalis idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
+'enotif_body_intro_restored' => 'Ti {{SITENAME}} a panid ti $1 ket naipasubli idi idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
+'enotif_body_intro_changed' => 'Ti {{SITENAME}} a panid ti $1 ket nasukatan idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
'enotif_lastvisited' => 'Kitaen ti $1 para iti am-amin a panagsukat sipud ti naudi nga isasarungkarmo.',
'enotif_lastdiff' => 'Kitaen ti $1 tapno mabuya daytoy a panagsukat.',
'enotif_anon_editor' => 'di am-ammo nga agar-aramat $1',
'enotif_body' => 'Nadungngo a $WATCHINGUSERNAME,
-
-Ti {{SITENAME}} a panid $PAGETITLE ket $CHANGEDORCREATED idi $PAGEEDITDATE ni $PAGEEDITOR, kitaen ti $PAGETITLE_URL ti agdama a panagbaliw.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Pakabuklan ti mannurat: $PAGESUMMARY $PAGEMINOREDIT
@@ -2127,13 +2145,12 @@ Kontaken ti mannurat:
surat: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Awanen iti sabali pay a paka-ammo a maipatulod kenka no adda pay dagiti masukatan inggana laeng no sarungkaram daytoy a panid.
-Mabalin met nga ipasadiwa dagiti bandera ti paka-ammom para amin kadagiti buybuyaem a panid idiay bambantayam.
+Awanen ti sabali pay a paka-ammo a maipatulod kenka no adda pay dagiti masukatan inggana laeng no sarungkaram daytoy a panid. Mabalin met nga ipasadiwa dagiti bandera ti paka-ammom para amin kadagiti buybuyaem a panid idiay bambantayam.
- Ti gayyem mo iti {{SITENAME}} a sistema ti pagpa-ammo
+Ti gayyemmo ti {{SITENAME}} a sistema ti pagpa-ammo
--
-Ti panagsukat ti kasasaad ti e-surat a pagpa-ammom, sarungkaram ti
+Ti panagsukat ti kasasaad ti esurat a pagpa-ammom, sarungkaram ti
{{canonicalurl:{{#special:Preferences}}}}
Ti panagsukat kadagiti kasasaad ti bambantayam, sarungkaram ti
@@ -2144,6 +2161,8 @@ $UNWATCHURL
Ti makunkunam ken no masapulmo pay ti tulong:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'naaramid',
+'changed' => 'nasukatan',
# Delete
'deletepage' => 'Ikkaten ti panid',
@@ -2217,6 +2236,8 @@ Kitaen ti [[Special:ProtectedPages|listaan kadagiti nasalakniban a panid]] ti li
'prot_1movedto2' => '[[$1]] naiyalis iti [[$2]]',
'protect-badnamespace-title' => 'Saan a mabalin a salakniban a nagan ti lugar',
'protect-badnamespace-text' => 'Dagiti panid ditoy a nagan ti lugar ket saan a mabalin a masalakniban.',
+'protect-norestrictiontypes-text' => 'Daytoy a panid ket saan a mabalin a masalakniban gaputa awan dagiti maiparit a kita a magun-od.',
+'protect-norestrictiontypes-title' => 'Di masalakniban a panid',
'protect-legend' => 'Pasingkedan ti panagsalaknib',
'protectcomment' => 'Rason:',
'protectexpiry' => 'Agpaso:',
@@ -2302,8 +2323,8 @@ Addaan ka ngata ti madi a panilpo, wenno ti panagbaliw ket naipasubli wenno naik
'undeletedrevisions' => '{{PLURAL:$1|1 a binaliwan|dagiti $1 a binaliwan}} ti naisubli',
'undeletedrevisions-files' => '{{PLURAL:$1|1 a binaliwan|dagiti $1 a binaliwan}} ken {{PLURAL:$2|1 a papeles|dagiti $2 a papeles}} ti naisubli',
'undeletedfiles' => '{{PLURAL:$1|1 a papeles|dagiti $1 a papeles}} ti naisubli',
-'cannotundelete' => 'Napaay ti panagikkat;
-adda ngata immuna a nagikkat ti panid.',
+'cannotundelete' => 'Napaay ti panagikkat:
+$1',
'undeletedpage' => "'''Naisublin ti $1'''
Binsiren ti [[Special:Log/delete|listaan ti naik-ikkat]] para iti listaan dagiti naudi a naik-ikkat ken naisubsubli.",
@@ -2335,7 +2356,7 @@ $1',
'blanknamespace' => '(Umuna)',
# Contributions
-'contributions' => 'Naaramidan dagiti agar-aramat',
+'contributions' => 'Naar-aramid ti {{GENDER:$1|Agar-aramat}}',
'contributions-title' => 'Naaramidan ni $1',
'mycontris' => 'Naar-aramid',
'contribsub2' => 'Para iti $1 ($2)',
@@ -2613,6 +2634,7 @@ saanmo a maiyalis ti panid ti isu met laeng a panid.',
'immobile-target-namespace-iw' => 'Ti panilpo nga interwiki ket saan na mabalin nga iyalis.',
'immobile-source-page' => 'Saan a mabalin nga iyalis daytoy a panid.',
'immobile-target-page' => 'Saan a maiyalis dita a papananna a titulo.',
+'bad-target-model' => 'Ti kinaykayat a pagipanan ket agus-usar ti sabali a modelo ti linaon. Saan a maipabalin manipud ti $1 iti $2.',
'imagenocrossnamespace' => 'Saan a maiyalis ti papeles idiay saan a papeles a nagan ti lugar',
'nonfile-cannot-move-to-file' => 'Saan a maiyalis ti saan a papeles idiay papeles a nagan a lugar',
'imagetypemismatch' => 'Ti baro a pagpaatiddog ti papeles ket saan nga agpada ti kita na',
@@ -2728,6 +2750,7 @@ Pangngaasi a padasem manen.',
'import-error-interwiki' => 'Ti panid ti "$1" ket saan a naala ngamin ket ti nagan ket nailasin para iti ruar a panagsilpo (interwiki).',
'import-error-special' => 'Ti panid ti "$1" ket saan a naala ngamin ket bukod ti espesial a nagan a lugar a saan nga agpalubos ti pampanid.',
'import-error-invalid' => 'Ti panid ti "$1" ket saan a naala ngamin ket ti nagan ket imbalido.',
+'import-error-unserialize' => 'Ti panagbaliw ti $2 iti panid ti "$1" ket di maipagsasaruno. Ti panagbalbaliw ket naireporta idi nga agus-usar ti modelo ti $3 a naipagsasaruno a kas $4.',
'import-options-wrong' => 'Saan a husto {{PLURAL:$2|a pagpilian|a pagpilpilian}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Ti naited a ramut ti panid ket imbalido a titulo.',
'import-rootpage-nosubpage' => 'Ti nagan ti lugar ti "$1" iti ramut ti panid ket saan amangpalubos kadagiti apo ti panid.',
@@ -2742,7 +2765,6 @@ Pangngaasi a padasem manen.',
# JavaScriptTest
'javascripttest' => 'Subsubokan ti JavaScript',
-'javascripttest-disabled' => 'Daytoy a pamay-an ket saan pay a napakabaelan iti daytoy a wiki.',
'javascripttest-title' => 'Agpatpataray ti $1 a subsubokan',
'javascripttest-pagetext-noframework' => 'Daytoy a panid ket nailasin para iti panagpataray ti subsubokan a JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Di amamo a pagsubsubokan a tabas "$1".',
@@ -2857,11 +2879,13 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
'pageinfo-default-sort' => 'Kasisigud a kangrunaan a panagilasin',
'pageinfo-length' => 'Kaatiddog ti panid (kadagiti byte)',
'pageinfo-article-id' => 'ID ti panid',
+'pageinfo-language' => 'Pagsasao ti naglaon a panid',
'pageinfo-robot-policy' => 'Kasasaad ti panagbiruk a makina',
'pageinfo-robot-index' => 'Mabalin a maipasurotan',
'pageinfo-robot-noindex' => 'Saan a mabalin a maipasurotan',
'pageinfo-views' => 'Bilang dagiti panagkita',
'pageinfo-watchers' => 'Bilang dagiti agbuybuya ti panid',
+'pageinfo-few-watchers' => 'Basbassit ngem $1 {{PLURAL:$1|ti agbuybuya|dagiti agbuybuya}}',
'pageinfo-redirects-name' => 'Maibaw-ing ti daytoy a panid',
'pageinfo-subpages-name' => 'Apo dagiti panid ti daytoy a panid',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|baw-ing|bawbaw-ing}}; $3 {{PLURAL:$3|saan a baw-ing|saan a bawbaw-ing}})',
@@ -2876,6 +2900,19 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
'pageinfo-magic-words' => 'Salamangka {{PLURAL:$1|a balikas|a balbalikas}} ($1)',
'pageinfo-hidden-categories' => 'Nailemmeng {{PLURAL:$1|a kategoria|a katkategoria}} ($1)',
'pageinfo-templates' => 'Nailak-am {{PLURAL:$1|a plantilia|a planplantilia}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|A panid|A pampanid}} ti nailak-an=m idiay ($1)',
+'pageinfo-toolboxlink' => 'Pakaammo ti panid',
+'pageinfo-redirectsto' => 'Maibaw-ing idiay',
+'pageinfo-redirectsto-info' => 'pakaammo',
+'pageinfo-contentpage' => 'Naibilang a kas naglaon a panid',
+'pageinfo-contentpage-yes' => 'Wen',
+'pageinfo-protect-cascading' => 'Dagiti panagsalaknib ket agsariap manipud ditoy',
+'pageinfo-protect-cascading-yes' => 'Wen',
+'pageinfo-protect-cascading-from' => 'Dagiti panagsalaknib ket agsariap manipud idiay',
+'pageinfo-category-info' => 'Pakaammo ti kategoria',
+'pageinfo-category-pages' => 'Bilang dagiti panid',
+'pageinfo-category-subcats' => 'Bilang dagiti subkategoria',
+'pageinfo-category-files' => 'Bilang dagiti papeles',
# Patrolling
'markaspatrolleddiff' => 'Markaan a kas napatruliaan',
@@ -2887,6 +2924,8 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
'markedaspatrollederror' => 'Madi a mamarkaan a kas napatruliaan',
'markedaspatrollederrortext' => 'Nasken a naganam ti maysa a rebision tapno mamarkaan a kas napatruliaan.',
'markedaspatrollederror-noautopatrol' => 'Saanmo a mabalin a markaan dagita sinukatam a kas napatruliaan.',
+'markedaspatrollednotify' => 'Daytoy a panagbaliw ti $1 ket namarkaanen a kas napatruliaan.',
+'markedaspatrollederrornotify' => 'Ti panagmarka a kas napatruliaan ket napaay.',
# Patrol log
'patrol-log-page' => 'Listaan ti napatruliaan',
@@ -2920,6 +2959,7 @@ No usarem daytoy, baka makompromiso ti sistema.",
'file-nohires' => 'Awan ti mabalin a nangatngato a resolusion.',
'svg-long-desc' => 'SVG a papeles, babassit ngem $1 × $2 pixels, kadakkel ti papeles: $3',
'svg-long-desc-animated' => 'Naanimado nga SVG a papeles, babassit ngem $1 × $2 pixels, kadakkel ti papeles: $3',
+'svg-long-error' => 'Saan nga umisu a papeles ti SVG: $1',
'show-big-image' => 'Sibubukel a resolusion',
'show-big-image-preview' => 'Kadakkel na daytoy a pagpadas: $1.',
'show-big-image-other' => 'Sabali {{PLURAL:$2|a resolusion|kadagiti resolusion}}: $1.',
@@ -2949,7 +2989,10 @@ No usarem daytoy, baka makompromiso ti sistema.",
'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
'hours' => '{{PLURAL:$1|$1 oras$1 oras}}',
'days' => '{{PLURAL:$1|$1 aldaw|$1 al-aldaw}}',
+'months' => '{{PLURAL:$1|$1 a bulan|$1 a bulbulan}}',
+'years' => '{{PLURAL:$1|$1 a tawen|$1 a tawtawen}}',
'ago' => '$1 nagtapos',
+'just-now' => 'tatta laeng',
# Bad image list
'bad_image_list' => 'Ti kinabuklan ket kas iti sumaganad:
@@ -3446,6 +3489,7 @@ Daytoy a kodigo a pasingkedan ket agpaso iti $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Nabaldado ti Interwiki panagiraman]',
'scarytranscludefailed' => '[Napaay ti panagala ti plantilia para iti $1]',
+'scarytranscludefailed-httpstatus' => '[Napaay ti panagala ti plantilia para iti $1: HTTP $2]',
'scarytranscludetoolong' => '[Atiddog unay ti URL]',
# Delete conflict
@@ -3556,6 +3600,7 @@ Mabalinmo pay nga [[Special:EditWatchlist|usaren ti dati a panagurnos]].',
'version-license' => 'Lisensia',
'version-poweredby-credits' => "Daytoy a wiki ket pinaandar ti '''[//www.mediawiki.org/ MediaWiki]''', karbengan a kopia © 2001-$1 $2.",
'version-poweredby-others' => 'dadduma pay',
+'version-credits-summary' => 'Kayatmi koma a pammadayawan dagiti sumaganad a tao para kadagiti inparawadda iti [[Special:Version|MediaWiki]].',
'version-license-info' => 'Ti MediaWiki ket nawaya a sopwer; maiwarasmo ken/wenno mabaliwam babaen ti banag iti GNU General Public License a naipablaak babaen ti Free Software Foundation; nupay iti bersion 2 iti Lisensia, wenno (ti panagpilim) ti aniaman a bersion.
Ti MediaWiki ket naiwarwaras nga adda ti namnama a makatulong, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANAKAILAKO wenno KALAINGAN NA ITI DAYTOY A PANGGEP. Kitaen ti GNU Sapasap a Publiko a Lisensia para kadagiti adu pay a salaysay.
@@ -3671,17 +3716,17 @@ Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
'sqlite-no-fts' => '$1 awan ti suporta ti napno a testo ti panagbiruk',
# New logging system
-'logentry-delete-delete' => 'Inikkat ni $1 ti panid ti $3',
-'logentry-delete-restore' => 'Insubli ni $1 ti panid ti $3',
-'logentry-delete-event' => 'Sinukatan ni $1 ti panagkita {{PLURAL:$5|iti listaan ti pasamak |dagiti $5 a listaan ti pasamak }} iti $3: $4',
-'logentry-delete-revision' => 'Sinukatan ni $1 ti panagkita {{PLURAL:$5|iti panagbaliw |dagiti $5 a panagbaliw}} iti panid $3: $4',
-'logentry-delete-event-legacy' => 'Sinukatan ni $1 ti panagkita ti listaan dagiti pasamak idiay $3',
-'logentry-delete-revision-legacy' => 'Sinukatan ni $1 ti panagkita dagiti panagbaliw idiay panid $3',
-'logentry-suppress-delete' => 'Pinasardeng ni $1 ti panid ti $3',
-'logentry-suppress-event' => 'Sekreto a sinukatan ni $1 ti panagkita {{PLURAL:$5|iti listaan ti pasamak |dagiti $5 a listaan ti pasamak }} iti $3: $4',
-'logentry-suppress-revision' => 'Sekreto a sinukatan ni $1 ti panagkita {{PLURAL:$5|iti panagbaliw |dagiti $5 a panagbaliw}} iti panid $3: $4',
-'logentry-suppress-event-legacy' => 'Sekreto a sinukatan ni $1 ti panagkita ti listaan dagiti pasamak idiay $3',
-'logentry-suppress-revision-legacy' => 'Sekreto a sinukatan ni $1 ti panagkita dagiti panagbaliw idiay panid $3',
+'logentry-delete-delete' => 'Ni $1 ket {{GENDER:$2|inikkatna}} ti panid ti $3',
+'logentry-delete-restore' => 'Ni $1 ket {{GENDER:$2|insublina}} ti panid ti $3',
+'logentry-delete-event' => 'Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita {{PLURAL:$5|iti listaan ti pasamak |dagiti $5 a listaan ti pasamak }} iti $3: $4',
+'logentry-delete-revision' => 'Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita {{PLURAL:$5|iti panagbaliw |dagiti $5 a panagbaliw}} iti panid $3: $4',
+'logentry-delete-event-legacy' => 'Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita ti listaan dagiti pasamak idiay $3',
+'logentry-delete-revision-legacy' => 'Ni $1 ket {{GENDER:$2|binaliwanna}} ti panagkita dagiti panagbaliw idiay panid $3',
+'logentry-suppress-delete' => 'Ni $1 ket {{GENDER:$2|pinasardengna}} ti panid ti $3',
+'logentry-suppress-event' => 'Ni $1 ket sekreto a {{GENDER:$2|binaliwanna}} ti panagkita {{PLURAL:$5|iti listaan ti pasamak |dagiti $5 a listaan ti pasamak }} iti $3: $4',
+'logentry-suppress-revision' => 'Ni $1 ket sekreto a {{GENDER:$2|binaliwanna}} ti panagkita {{PLURAL:$5|iti panagbaliw |dagiti $5 a panagbaliw}} iti panid $3: $4',
+'logentry-suppress-event-legacy' => 'Ni $1 ket sekreto a {{GENDER:$2|binaliwanna}} ti panagkita ti listaan dagiti pasamak idiay $3',
+'logentry-suppress-revision-legacy' => 'Ni $1 ket sekreto a {{GENDER:$2|binaliwanna}} ti panagkita dagiti panagbaliw idiay panid $3',
'revdelete-content-hid' => 'nailemmeng ti nagyan na',
'revdelete-summary-hid' => 'nailemmeng ti pakabuklan a naurnos',
'revdelete-uname-hid' => 'nailemmeng ti nagan ti agar-aramat',
@@ -3690,17 +3735,21 @@ Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
'revdelete-uname-unhid' => 'saan a nailemmeng ti nagan ti agar-aramat',
'revdelete-restricted' => 'naipakat dagiti pammarit kadagiti administrador',
'revdelete-unrestricted' => 'naikkat dagiti pammarit para kadagiti administrador',
-'logentry-move-move' => 'Inyalis ni $1 daytoy panid $3 idiay $4',
-'logentry-move-move-noredirect' => 'Inyalis ni $1 ti panid ti $3 idiay $4 a saan a nangibati ti baw-ing',
-'logentry-move-move_redir' => 'Inyalis ni $1 ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing',
-'logentry-move-move_redir-noredirect' => 'Inyalis ni $1 ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing a saan a nangibati ti baw-ing',
-'logentry-patrol-patrol' => 'Minarkaan ni $1 ti panagbaliw a $4 ti panid ti $3 a napatruliaan',
-'logentry-patrol-patrol-auto' => 'Automatiko a minarkaan ni $1 ti panagbaliw a $4 ti panid ti $3 a napatruliaan',
-'logentry-newusers-newusers' => 'Nagpartuat idi ti $1 a pakabilangan ti agar-aramat',
-'logentry-newusers-create' => 'Nagpartuat idi ti $1 a pakabilangan ti agar-aramat',
-'logentry-newusers-create2' => 'Nagpartuat ni ti $3 a pakabilangan ti agar-aramat babaen ni $1',
-'logentry-newusers-autocreate' => 'Ti pakabilangan ni $1 ket automatiko a napartuat',
-'newuserlog-byemail' => 'naipatulod ti kontrasenias ti e-surat',
+'logentry-move-move' => 'Ni $1 ket {{GENDER:$2|inyalisna}}ti panid $3 idiay $4',
+'logentry-move-move-noredirect' => 'Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 idiay $4 a saan a nangibati ti baw-ing',
+'logentry-move-move_redir' => 'Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing',
+'logentry-move-move_redir-noredirect' => 'Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing a saan a nangibati ti baw-ing',
+'logentry-patrol-patrol' => 'Ni $1 ket {{GENDER:$2|minarkaanna}} ti panagbaliw a $4 ti panid ti $3 a napatruliaan',
+'logentry-patrol-patrol-auto' => 'Ni $1 ket automatiko a {{GENDER:$2|minarkaanna}} ti panagbaliw a $4 ti panid ti $3 a napatruliaan',
+'logentry-newusers-newusers' => 'Ti pakabilangan idi ni $1 ket {{GENDER:$2|napartuat}}',
+'logentry-newusers-create' => 'Ti pakabilangan idi ni $1 ket {{GENDER:$2|napartuat}}',
+'logentry-newusers-create2' => 'Ti pakabilangan ti agar-aramat $3 ket {{GENDER:$2|napartuat}} idi babaen ni $1',
+'logentry-newusers-byemail' => 'Ti pakabilangan a $3 ket {{GENDER:$2|pinartuat}} idi babaen ni $1 ken ti kontrasenias ket naipatulod idi babaen ti esurat',
+'logentry-newusers-autocreate' => 'Ti pakabilangan ti agar-aramat ni $1 ket automatiko a {{GENDER:$2|napartuat}}',
+'logentry-rights-rights' => 'Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3 manipud ti $4 iti $5',
+'logentry-rights-rights-legacy' => 'Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3',
+'logentry-rights-autopromote' => 'Ni $1 ket automatiko idi a {{GENDER:$2|naipangato}} manipud ti $4 iti $5',
+'rightsnone' => '(awan)',
# Feedback
'feedback-bugornote' => 'No agsagana kan nga agibaga ti teknikal a pakirut a naisalaysay pangngaasi nga [$1 ireporta ti kiteb].
@@ -3754,6 +3803,7 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
'api-error-ok-but-empty' => 'Kinauneg a biddut: Awan ti sungbat manipud idiay server.',
'api-error-overwrite' => 'Saan a mabalin a suratan manen iti papeles nga adda ditan.',
'api-error-stashfailed' => 'Kinauneg a biddut: Napaay ti server ti agidulin ti temporario a papeles',
+'api-error-publishfailed' => 'Kinauneg a biddut: Napaay ti server a nagipablaak ti temporario a papeles.',
'api-error-timeout' => 'Saan a simmungbat ti server iti nanamnama nga oras.',
'api-error-unclassified' => 'Adda di amammo a biddut a rumsua.',
'api-error-unknown-code' => 'Di am-ammo a biddut: "$1".',
@@ -3774,4 +3824,7 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
'duration-centuries' => '$1 {{PLURAL:$1|siglo|sig-siglo}}',
'duration-millennia' => '$1 {{PLURAL:$1|milenio|mil-milenio}}',
+# Image rotation
+'rotate-comment' => 'Ti ladawan ket napusipos babaen ti $1 {{PLURAL:$1|a degrado|a degdegrado}} nga agpakanawan',
+
);
diff --git a/languages/messages/MessagesInh.php b/languages/messages/MessagesInh.php
index 79bcd5af..67be2693 100644
--- a/languages/messages/MessagesInh.php
+++ b/languages/messages/MessagesInh.php
@@ -157,7 +157,6 @@ $messages = array(
'qbbrowse' => 'БӀаргтаÑÑа',
'qbedit' => 'Хувца',
'qbpageoptions' => 'ОагӀува оттамаш',
-'qbpageinfo' => 'ОагӀува тохкам',
'qbmyoptions' => 'Са оттамаш',
'qbspecialpages' => 'ГӀулакхий оагӀувнаш',
'faq' => 'КаÑÑ‚-каÑта хаттараш',
@@ -634,9 +633,11 @@ $messages = array(
'right-move' => 'ОагIувний цIи хувца',
'right-movefile' => 'Паьлий цIи хувца',
+# Special:Log/newusers
+'newuserlogpage' => 'Дакъалаьцархоший дIаÑзбeнна таптар',
+
# User rights log
'rightslog' => 'Дакъалаьцархочунна бокъона тептар',
-'rightsnone' => '(а)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'Укх оагIуви дешам',
@@ -793,9 +794,6 @@ $messages = array(
'linksearch-ok' => 'Лаха',
'linksearch-line' => '$1 тIа Iинк $2 юкъера',
-# Special:Log/newusers
-'newuserlogpage' => 'Дакъалаьцархоший дIаÑзбeнна таптар',
-
# Special:ListGroupRights
'listgrouprights-members' => '(тоабий дагарче)',
@@ -874,7 +872,7 @@ $messages = array(
'blanknamespace' => '(Корта)',
# Contributions
-'contributions' => 'Дакъалаьцархочунна къахьегам',
+'contributions' => '{{GENDER:$1|Дакъалаьцархочунна}} къахьегам',
'contributions-title' => '$1 дакъалаьцархочунна къахьегам',
'mycontris' => 'Са къахьегам',
'contribsub2' => '$1 ($2) баь болх',
@@ -1183,4 +1181,7 @@ $messages = array(
'htmlform-reset' => 'Хувцамаш юхадаккха',
'htmlform-selectorother-other' => 'Кхыдола',
+# New logging system
+'rightsnone' => '(а)',
+
);
diff --git a/languages/messages/MessagesIo.php b/languages/messages/MessagesIo.php
index 054f960e..bc583950 100644
--- a/languages/messages/MessagesIo.php
+++ b/languages/messages/MessagesIo.php
@@ -234,7 +234,6 @@ $messages = array(
'qbfind' => 'Trovez',
'qbedit' => 'Redaktar',
'qbpageoptions' => 'Ica pagino',
-'qbpageinfo' => 'Kuntexto',
'qbmyoptions' => 'Mea pagini',
'qbspecialpages' => 'Specala pagini',
@@ -409,11 +408,8 @@ nekorekta interlinguale od interwikale ligilo.',
# Login and logout pages
'logouttext' => "'''Vu nun esas nun ek {{SITENAME}}.'''
-Vu povas durar uzante {{SITENAME}} anonimale, o vu povas [[Special:UserLogin|enirar itere]] kom la sama o diferenta uzanto.
+Vu povas durar uzante {{SITENAME}} anonimale, o vu povas <span class='plainlinks'>[$1 enirar itere]</span> kom la sama o diferenta uzanto.
Atencez ke kelka pagini posible duras montresar semblante ke vu ne ekirus, til vu vakuigas la tempala-magazino di vua navigilo.",
-'welcomecreation' => '== Bonveno, $1! ==
-Vua konto kreesis.
-Voluntez, ne obliviez chanjor vua [[Special:Preferences|preferaji en {{SITENAME}}]].',
'yourname' => 'Vua uzantonomo:',
'yourpassword' => 'Pasovorto:',
'yourpasswordagain' => 'Riskribez la pasovorto:',
@@ -577,7 +573,6 @@ Publikigante vua skribajo hike, vu asertas ke olu skribesis da vu ipsa o kopiesi
'template-protected' => '(protektita)',
'template-semiprotected' => '(mi-protektita)',
'hiddencategories' => 'Ca pagino esas membro di {{PLURAL:$1|1 celita kategorio|$1 celita kategorii}}:',
-'nocreatetitle' => 'Kreado di pagini limitita',
'permissionserrorstext-withaction' => 'Vu ne darfas $2, pro la {{PLURAL:$1|kauzo|kauzi}} sequanta:',
'moveddeleted-notice' => 'Ca pagino efacesabas.
La efaco-registraro e movo-registraro dil pagino provizesar sequante por refero.',
@@ -792,9 +787,11 @@ Ol mustas ne havar plu kam $1 {{PLURAL:$1|litero|literi}}.',
'right-browsearchive' => 'Serchar pagini efacita',
'right-rollback' => 'Rapide retrorular la redakti da la lasta uzanto qua redaktis specigita pagino',
+# Special:Log/newusers
+'newuserlogpage' => 'Uzanto-kreo-registro',
+
# User rights log
'rightslog' => 'Uzanto-yuri-registraro',
-'rightsnone' => '(nula)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lektar ca pagino',
@@ -1034,9 +1031,6 @@ Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
# Special:ActiveUsers
'activeusers-noresult' => 'Nula uzanto trovesis.',
-# Special:Log/newusers
-'newuserlogpage' => 'Uzanto-kreo-registro',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Grupo',
'listgrouprights-members' => '(listo di membri)',
@@ -1084,7 +1078,6 @@ Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
'watching' => 'Surveyanta…',
'unwatching' => 'Cesanta surveyar…',
-'enotif_newpagetext' => 'Ico esas nula pagino.',
'enotif_impersonal_salutation' => 'Uzanto di {{SITENAME}}',
'enotif_anon_editor' => 'anonima uzanto $1',
@@ -1554,6 +1547,9 @@ Vu darfos adjuntar kauso en la rezumo.',
'htmlform-reset' => 'Desfacar chanji',
'htmlform-selectorother-other' => 'Altra',
+# New logging system
+'rightsnone' => '(nula)',
+
# Search suggestions
'searchsuggest-search' => 'Serchez',
'searchsuggest-containing' => 'quan kontenas...',
diff --git a/languages/messages/MessagesIs.php b/languages/messages/MessagesIs.php
index 30375ac5..41ef9f90 100644
--- a/languages/messages/MessagesIs.php
+++ b/languages/messages/MessagesIs.php
@@ -367,6 +367,7 @@ $messages = array(
'newwindow' => '(opnast í nýjum glugga)',
'cancel' => 'Hætta við',
'moredotdotdot' => 'Meira...',
+'morenotlisted' => 'fleiri ekki skráð...',
'mypage' => 'Síða',
'mytalk' => 'Spjall',
'anontalk' => 'Spjallsíða þessa vistfangs.',
@@ -378,7 +379,6 @@ $messages = array(
'qbbrowse' => 'Flakka',
'qbedit' => 'Breyta',
'qbpageoptions' => 'Þessi síða',
-'qbpageinfo' => 'Samhengi',
'qbmyoptions' => 'Mínar síður',
'qbspecialpages' => 'Kerfissíður',
'faq' => 'Algengar spurningar',
@@ -401,6 +401,7 @@ $messages = array(
'namespaces' => 'Nafnrými',
'variants' => 'Útgáfur',
+'navigation-heading' => 'Leiðsagnarval',
'errorpagetitle' => 'Villa',
'returnto' => 'Aftur á: $1.',
'tagline' => 'Úr {{SITENAME}}',
@@ -641,11 +642,11 @@ Möppudýrið sem læsti skránni gaf þessa ástæðu: "\'\'$3\'\'".',
# Login and logout pages
'logouttext' => "'''Þú hefur verið skráð(ur) út.'''
-Þú getur haldið áfram að nota {{SITENAME}} óþekkt(ur), eða þú getur [[Special:UserLogin|skráð þig inn aftur]] sem sami eða annar notandi.
+Þú getur haldið áfram að nota {{SITENAME}} óþekkt(ur), eða þú getur <span class='plainlinks'>[$1 skráð þig inn aftur]</span> sem sami eða annar notandi.
Athugaðu að sumar síður kunna að birtast líkt og þú sért ennþá skráð(ur) inn, þangað til að þú hreinsar skyndiminnið í vafranum þínum.",
-'welcomecreation' => '== Velkomin(n), $1! ==
-Aðgangurinn þinn hefur verið búinn til.
-Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}}-stillingunum]] þínum.',
+'welcomeuser' => 'Velkomin(n), $1!',
+'welcomecreation-msg' => 'Aðgangurinn þinn hefur verið búinn til.
+Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}} stillingunum]] þínum.',
'yourname' => 'Notandanafn:',
'yourpassword' => 'Lykilorð:',
'yourpasswordagain' => 'Endurrita lykilorð:',
@@ -668,7 +669,7 @@ Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}}-stillingunum]] þínum
'gotaccount' => "Nú þegar með notandanafn? '''$1'''.",
'gotaccountlink' => 'Skráðu þig inn',
'userlogin-resetlink' => 'Gleymdir þú notendaupplýsingunum þínum?',
-'createaccountmail' => 'með tölvupósti',
+'createaccountmail' => 'Nota handahófsvalið bráðabirgðalykilorð og senda það á netfangið sem er tilgreint hér fyrir neðan',
'createaccountreason' => 'Ãstæða:',
'badretype' => 'Lykilorðin sem þú skrifaðir eru ekki eins.',
'userexists' => 'Þetta notandanafn er þegar í notkun.
@@ -742,6 +743,7 @@ Vinsamlegast reynið aftur síðar.',
# Email sending
'php-mail-error-unknown' => 'Óþekkt villa í PHP mail() aðgerð.',
'user-mail-no-addy' => 'Gat ekki sent tölvupóst því ekkert tölvupóstfang fannst.',
+'user-mail-no-body' => 'Reyndi að senda tölvupóst með engu eða verulega stuttu meginmáli.',
# Change password dialog
'resetpass' => 'Breyta lykilorði',
@@ -803,6 +805,7 @@ Tímabundið lykilorð: $2',
'changeemail-oldemail' => 'Núverandi netfang:',
'changeemail-newemail' => 'Nýtt netfang:',
'changeemail-none' => '(ekkert)',
+'changeemail-password' => '{{SITENAME}} lykilorðið þitt:',
'changeemail-submit' => 'Breyta netfangi',
'changeemail-cancel' => 'Hætta við',
@@ -980,7 +983,6 @@ Verndunarskrá síðunnar er gefin fyrir neðan til tilvísunar.",
'template-protected' => '(vernduð)',
'template-semiprotected' => '(hálfvernduð)',
'hiddencategories' => 'Þessi síða er meðlimur í {{PLURAL:$1|1 földum flokki|$1 földum flokkum}}:',
-'nocreatetitle' => 'Síðugerð takmörkuð',
'nocreatetext' => '{{SITENAME}} hefur takmarkað eiginleikann að gera nýjar síður.
Þú getur farið til baka og breytt núverandi síðum, eða [[Special:UserLogin|skráð þið inn eða búið til aðgang]].',
'nocreate-loggedin' => 'Þú hefur ekki leyfi til að skapa nýjar síður.',
@@ -1005,6 +1007,15 @@ Svo virðist sem henni hafi verið eytt.',
'edit-already-exists' => 'Gat ekki skapað nýja síðu.
Hún er nú þegar til.',
'defaultmessagetext' => 'Sjálfgefinn skilaboða texti',
+'content-failed-to-parse' => 'Gat ekki þáttað $2 efni samkvæmt $1 líkani: $3',
+'invalid-content-data' => 'Ógild efnisgögn.',
+'content-not-allowed-here' => '„$1“ efni er ekki leyfilegt á síðunni [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wiki-texti',
+'content-model-text' => 'hreinn texti',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Viðvörun:''' Þessi síða inniheldur of mörg vinnslufrek aðgerðar þáttunar köll.
@@ -1372,9 +1383,9 @@ Ekki er hægt að taka þessa breytingu til baka.',
'prefs-emailconfirm-label' => 'Staðfesting netfangs:',
'prefs-textboxsize' => 'Stærð breytingarglugga',
'youremail' => 'Netfang:',
-'username' => 'Notandanafn:',
-'uid' => 'Raðnúmer:',
-'prefs-memberingroups' => 'Meðlimur {{PLURAL:$1|hóps|hópa}}:',
+'username' => '{{Gender:$1|Notandanafn}}:',
+'uid' => 'Raðnúmer {{GENDER:$1|notanda}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Meðlimur}} {{PLURAL:$1|hóps|hópa}}:',
'prefs-registration' => 'Nýskráningartími:',
'yourrealname' => 'Fullt nafn:',
'yourlanguage' => 'Viðmótstungumál:',
@@ -1524,12 +1535,13 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband viÃ
'right-sendemail' => 'Senda tölvupóst til annara notenda',
'right-passwordreset' => 'Skoða tölvupósta um endurstillingu lykilorðs',
+# Special:Log/newusers
+'newuserlogpage' => 'Skrá yfir nýja notendur',
+'newuserlogpagetext' => 'Þetta er skrá yfir nýskráða notendur.',
+
# User rights log
'rightslog' => 'Réttindaskrá notenda',
'rightslogtext' => 'Þetta er skrá yfir breytingar á réttindum notenda.',
-'rightslogentry' => 'breytti réttindum $1 frá $2 í $3',
-'rightslogentry-autopromote' => 'fékk sjálfvirkt aukin réttindi frá $2 til $3',
-'rightsnone' => '(engum)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lesa þessa síðu',
@@ -1762,6 +1774,7 @@ Ef vandamálið lagast ekki, hafðu samband við [[Special:ListUsers/sysop|stjó
'backend-fail-notsame' => 'Ólík skrá er þegar til á $1.',
'backend-fail-invalidpath' => '$1 er ekki gildur geymslustaður.',
'backend-fail-delete' => 'Mistókst að eyða skránni $1.',
+'backend-fail-describe' => 'Mistókst að breyta lýsisgögnum skráarinnar „$1“.',
'backend-fail-alreadyexists' => 'Skráin $1 er þegar til.',
'backend-fail-store' => 'Mistókst að vista skrá $1 á $2.',
'backend-fail-copy' => 'Mistókst að afrita skjal $1 á $2.',
@@ -2151,9 +2164,9 @@ Sjá einnig [[Special:WantedCategories|eftirsótta flokka]].',
'linksearch-pat' => 'Leitarmynstur:',
'linksearch-ns' => 'Nafnrými:',
'linksearch-ok' => 'Leita',
-'linksearch-text' => 'Algildistafir eins og "*.wikipedia.org" eru leyfðir.<br />
-Stafurinn þarf í minnsta kosti að innihalda rótarlén, eins og "*.org"
-Studdar samskiptareglur: <code>$1</code> (ekki bæta neinum af þessum í leitina)',
+'linksearch-text' => 'Algildisleit eins og "*.wikipedia.org" er leyfð.<br />
+Leitin þarf að minnsta kosti að innihalda rótarlén, eins og "*.org"
+{{PLURAL:$2|Studd samskiptaregla|Studdar samskiptareglur}}: <code>$1</code> (http:// sjálfgefið ef engin regla er valin).',
'linksearch-line' => 'Tengt er í $1 á síðunni $2',
'linksearch-error' => 'Algildistafir mega engöngu birtast í upphafi vefslóðarinnar.',
@@ -2172,10 +2185,6 @@ Studdar samskiptareglur: <code>$1</code> (ekki bæta neinum af þessum í leitin
'activeusers-hidesysops' => 'Fela möppudýr',
'activeusers-noresult' => 'Enginn notandi fannst.',
-# Special:Log/newusers
-'newuserlogpage' => 'Skrá yfir nýja notendur',
-'newuserlogpagetext' => 'Þetta er skrá yfir nýskráða notendur.',
-
# Special:ListGroupRights
'listgrouprights' => 'Notandahópréttindi',
'listgrouprights-summary' => 'Hér er listi yfir notendahópa á þessum wiki, með þeirra réttindum.
@@ -2270,11 +2279,17 @@ Frekari breytingar á henni eða spallsíðu hennar munu verða sýndar þar.',
'enotif_mailer' => '{{SITENAME}} tilkynningasendill',
'enotif_reset' => 'Merkja allar síður sem skoðaðar',
-'enotif_newpagetext' => 'Þetta er ný síða.',
'enotif_impersonal_salutation' => '{{SITENAME}}notandi',
-'changed' => 'breytt',
-'created' => 'búin til',
-'enotif_subject' => '$PAGETITLE á {{SITENAME}} hefur verið $CHANGEDORCREATED af $PAGEEDITOR',
+'enotif_subject_deleted' => '$1 á {{SITENAME}} hefur verið eytt af {{gender:$2|$2}}',
+'enotif_subject_created' => '$1 á {{SITENAME}} hefur verið búin til af {{gender:$2|$2}}',
+'enotif_subject_moved' => '$1 á {{SITENAME}} hefur verið færð af {{gender:$2|$2}}',
+'enotif_subject_restored' => '$1 á {{SITENAME}} hefur verið endurvakin af {{gender:$2|$2}}',
+'enotif_subject_changed' => '$1 á {{SITENAME}} hefur verið breytt af {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Síðan „$1†sem þú hefur beðið um að fylgjast með á {{SITENAME}} hefur verið eytt $PAGEEDITDATE af {{gender:$2|$2}}. Þetta er tengill á síðuna: $3.',
+'enotif_body_intro_created' => 'Síðan „$1†sem þú hefur beðið um að fylgjast með á {{SITENAME}} hefur verið búin til $PAGEEDITDATE af {{gender:$2|$2}}. Þetta er tengill á síðuna: $3.',
+'enotif_body_intro_moved' => 'Síðan „$1†sem þú hefur beðið um að fylgjast með á {{SITENAME}} hefur verið færð $PAGEEDITDATE af {{gender:$2|$2}}. Þetta er tengill á síðuna: $3.',
+'enotif_body_intro_restored' => 'Síðan „$1†sem þú hefur beðið um að fylgjast með á {{SITENAME}} hefur verið endurvakin $PAGEEDITDATE af {{gender:$2|$2}}. Þetta er tengill á síðuna: $3.',
+'enotif_body_intro_changed' => 'Síðan „$1†sem þú hefur beðið um að fylgjast með á {{SITENAME}} hefur verið breytt $PAGEEDITDATE af {{gender:$2|$2}}. Þetta er tengill á síðuna: $3.',
'enotif_lastvisited' => 'Heimsóttu eftirfarandi tengil til að sjá allar breytingar síðan
þú heimsóttir síðuna síðast:
$1',
@@ -2283,15 +2298,7 @@ Frekari breytingar á henni eða spallsíðu hennar munu verða sýndar þar.',
'enotif_anon_editor' => 'ónefndum notanda $1',
'enotif_body' => 'Kæri $WATCHINGUSERNAME,
-Síðan „$PAGETITLE†sem þú hefur beðið um að fylgjast með á {{SITENAME}} hefur verið $CHANGEDORCREATED $PAGEEDITDATE af
-$PAGEEDITOR. Breytingarágripið var:
-
- $PAGESUMMARY
-
-Þetta er tengill á síðuna:
-
- $PAGETITLE_URL
-
+$PAGEINTRO
$NEWPAGE
Til þess að hafa samband við $PAGEEDITOR, smelltu á:
@@ -2314,6 +2321,8 @@ Til þess að breyta stillingum um hvenær þú færð sendar tilkynningar, smel
Til þess að hætta að fylgjast með „$PAGETITLEâ€, smelltu á:
$UNWATCHURL',
+'created' => 'búin til',
+'changed' => 'breytt',
# Delete
'deletepage' => 'Eyða',
@@ -2384,6 +2393,8 @@ Sjáðu [[Special:ProtectedPages|Verndunarskrá]] fyrir núverandi lista yfir ve
'prot_1movedto2' => '[[$1]] færð á [[$2]]',
'protect-badnamespace-title' => 'Óverndanlegt nafnrými',
'protect-badnamespace-text' => 'Síður í þessu nafnrými geta ekki verið verndaðar.',
+'protect-norestrictiontypes-text' => 'Ekki er hægt að vernda síðuna þar sem skilgreind verndunarstig eru ekki til staðar.',
+'protect-norestrictiontypes-title' => 'Óverndanleg síða',
'protect-legend' => 'Verndunarstaðfesting',
'protectcomment' => 'Ãstæða:',
'protectexpiry' => 'Rennur út:',
@@ -2468,7 +2479,8 @@ Innihald greinarinnar er einungis aðgengilegt möppudýrum.',
'undeletedrevisions' => '$1 {{PLURAL:$1|breyting endurvakin|breytingar endurvaktar}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|breyting|breytingar}} og $2 {{PLURAL:$2|skrá|skrár}} endurvaktar',
'undeletedfiles' => '{{PLURAL:$1|Ein skrá endurvakin|$1 skrár endurvaktar}}',
-'cannotundelete' => 'Ekki var hægt að afturkalla síðuna. (Líklega hefur einhver gert það á undan þér.)',
+'cannotundelete' => 'Ekki var hægt að afturkalla eyðingu.
+$1',
'undeletedpage' => "'''$1 var endurvakin'''
Skoðaðu [[Special:Log/delete|eyðingaskrána]] til að skoða eyðingar og endurvakningar.",
@@ -2500,7 +2512,7 @@ $1',
'blanknamespace' => '(Aðalnafnrýmið)',
# Contributions
-'contributions' => 'Framlög notanda',
+'contributions' => 'Framlög {{GENDER:$1|notanda}}',
'contributions-title' => 'Framlög notanda $1',
'mycontris' => 'Framlög',
'contribsub2' => 'Eftir $1 ($2)',
@@ -2770,6 +2782,7 @@ Síðan „[[:$1]]“ er þegar til. Viltu eyða henni til þess að rýma til f
'immobile-target-namespace-iw' => 'Óheimilt er að færa síðu með tungumálatengli.',
'immobile-source-page' => 'Þessi síða er ekki færanleg.',
'immobile-target-page' => 'Get ekki fært á áætlaðan titil.',
+'bad-target-model' => 'Markstaðurinn sem þú valdir notast við annað innihaldslíkan. Get ekki umbreytt frá $1 í $2.',
'imagenocrossnamespace' => 'Get ekki fært skrá í skrálaust nafnrými',
'nonfile-cannot-move-to-file' => 'Get ekki fært annað en skrár í nafnrými skráa.',
'imagetypemismatch' => 'Nýi nafnaukinn passar ekki við tegund hennar',
@@ -2887,6 +2900,7 @@ Vinsamlegast reyndu aftur.',
'import-error-interwiki' => 'Síðan "$1" var ekki flutt inn því nafn hennar er frátekið fyrir ytri tengla (tungumálatengla).',
'import-error-special' => 'Síðan "$1" var ekki flutt inn því hún tilheyrir ákveðnu nafnrými sem leyfir ekki síður.',
'import-error-invalid' => 'Síðan "$1" var ekki flutt inn því nafn hennar er ógilt.',
+'import-error-unserialize' => 'Ekki unnt að afraða útgáfu $2 af síðunni „$1“. Útgáfan var sögð nota innihaldslíkan $3 raðað sem $4.',
'import-options-wrong' => '{{PLURAL:$2|Rangur möguleiki|Rangir möguleikar}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Uppgefin móðursíða hefur ógildan titil.',
'import-rootpage-nosubpage' => 'Nafnrými „$1“ móðursíðunnar leyfir ekki undirsíður.',
@@ -2901,7 +2915,6 @@ Vinsamlegast reyndu aftur.',
# JavaScriptTest
'javascripttest' => 'JavaScript prófun',
-'javascripttest-disabled' => 'Þessi möguleiki hefur ekki verið virkjaður á þessum wiki.',
'javascripttest-title' => 'Keyri $1 prófun',
'javascripttest-pagetext-noframework' => 'Þessi síða er frátekin fyrir JavaScript prófanir.',
'javascripttest-pagetext-unknownframework' => 'Óþekktur prófunarrammi „$1“.',
@@ -3021,11 +3034,13 @@ Vinsamlegast reyndu aftur.',
'pageinfo-default-sort' => 'Sjálfgefinn röðunarlykill',
'pageinfo-length' => 'Lengd síðunnar (í bætum)',
'pageinfo-article-id' => 'Einkennisnúmer síðunnar',
+'pageinfo-language' => 'Tungumál síðunnar',
'pageinfo-robot-policy' => 'Leitarvélastaða',
'pageinfo-robot-index' => 'Skráanleg',
'pageinfo-robot-noindex' => 'Óskráanleg',
'pageinfo-views' => 'Fjöldi innlita',
'pageinfo-watchers' => 'Fjöldi notenda, sem vakta síðuna',
+'pageinfo-few-watchers' => 'Vöktuð af færri en $1 {{PLURAL:$1|notanda|notendum}}',
'pageinfo-redirects-name' => 'Tilvísanir til þessarar síðu',
'pageinfo-subpages-name' => 'Undirsíður þessarar síðu',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|tilvísun|tilvísanir}}; $3 {{PLURAL:$3|ekki tilvísun|ekki tilvísanir}})',
@@ -3040,6 +3055,19 @@ Vinsamlegast reyndu aftur.',
'pageinfo-magic-words' => 'Töfra {{PLURAL:$1|orð}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Falinn flokkur|Faldir flokkar}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Innifalið snið|Innifalin snið}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Síða|Síður}} innfelldar á ($1)',
+'pageinfo-toolboxlink' => 'Síðuupplýsingar',
+'pageinfo-redirectsto' => 'Vísar til',
+'pageinfo-redirectsto-info' => 'upplýsingar',
+'pageinfo-contentpage' => 'Talin sem efnissíða',
+'pageinfo-contentpage-yes' => 'Já',
+'pageinfo-protect-cascading' => 'Keðjuvörn hefst hér',
+'pageinfo-protect-cascading-yes' => 'Já',
+'pageinfo-protect-cascading-from' => 'Keðjuvörn stafar frá',
+'pageinfo-category-info' => 'Flokkaupplýsingar',
+'pageinfo-category-pages' => 'Fjöldi síðna',
+'pageinfo-category-subcats' => 'Fjöldi undirflokka',
+'pageinfo-category-files' => 'Fjöldi skráa',
# Skin names
'skinname-standard' => 'Sígilt',
@@ -3061,6 +3089,8 @@ Vinsamlegast reyndu aftur.',
'markedaspatrollederror' => 'Get ekki merkt sem yfirfarið',
'markedaspatrollederrortext' => 'Þú verður að velja breytingu til að merkja sem yfirfarið.',
'markedaspatrollederror-noautopatrol' => 'Þú hefur ekki réttindi til að merkja eigin breytingar sem yfirfarnar.',
+'markedaspatrollednotify' => 'Þessi breyting á $1 hefur verið merkt sem yfirfarin.',
+'markedaspatrollederrornotify' => 'Mistókst að merkja síðuna sem yfirfarna.',
# Patrol log
'patrol-log-page' => 'Yfirferðarskrá',
@@ -3091,6 +3121,7 @@ Vinsamlegast reyndu aftur.',
'file-nohires' => 'Það er engin hærri upplausn til.',
'svg-long-desc' => 'SVG-skrá, að nafni til $1 × $2 dílar, skráarstærð: $3',
'svg-long-desc-animated' => 'SVG-hreyfimynd, að nafni til $1 × $2 dílar, skráarstærð: $3',
+'svg-long-error' => 'Ógild SVG skrá: $1',
'show-big-image' => 'Mesta upplausn',
'show-big-image-preview' => 'Stærð þessarar forskoðunar: $1',
'show-big-image-other' => '{{PLURAL:$2|Önnur upplausn|Aðrar upplausnir}}: $1.',
@@ -3120,7 +3151,10 @@ Vinsamlegast reyndu aftur.',
'minutes' => '{{PLURAL:$1|einni mínútu|$1 mínútum}}',
'hours' => '{{PLURAL:$1|einum klukkutíma|$1 klukkutímum}}',
'days' => '{{PLURAL:$1|einum degi|$1 dögum}}',
+'months' => '{{PLURAL:$1|$1 mánuði|$1 mánuðum}}',
+'years' => '{{PLURAL:$1|$1 ári|$1 árum}}',
'ago' => '$1 síðan',
+'just-now' => 'akkúrat núna',
# Bad image list
'bad_image_list' => 'Sniðið er eftirfarandi:
@@ -3789,17 +3823,17 @@ Tæknilegir örðugleikar eru á þessari síðu.',
'sqlite-no-fts' => '$1 án fullum texta leitar stuðningi',
# New logging system
-'logentry-delete-delete' => '$1 eyddi síðunni $3',
-'logentry-delete-restore' => '$1 endurvakti $3',
-'logentry-delete-event' => '$1 breytti sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
-'logentry-delete-revision' => '$1 breytti sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
-'logentry-delete-event-legacy' => '$1 breytti sýnileika færslna á $3',
-'logentry-delete-revision-legacy' => '$1 breytti sýnileika útgáfna á $3',
-'logentry-suppress-delete' => '$1 bældi niður síðuna $3',
-'logentry-suppress-event' => '$1 breytti leynilega sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
-'logentry-suppress-revision' => '$1 breytti leynilega sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
-'logentry-suppress-event-legacy' => '$1 breytti leynilega sýnileika færslna á $3',
-'logentry-suppress-revision-legacy' => '$1 breytti leynilega sýnileika útgáfna á $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|eyddi}} síðunni $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|endurvakti}} $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|breytti}} sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|breytti}} sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|breytti}} sýnileika færslna á $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|breytti}} sýnileika útgáfna á $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|bældi niður}} síðuna $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|breytti}} leynilega sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|breytti}} leynilega sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|breytti}} leynilega sýnileika færslna á $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|breytti}} leynilega sýnileika útgáfna á $3',
'revdelete-content-hid' => 'efni falið',
'revdelete-summary-hid' => 'breytingarágrip falið',
'revdelete-uname-hid' => 'notandanafn falið',
@@ -3808,17 +3842,21 @@ Tæknilegir örðugleikar eru á þessari síðu.',
'revdelete-uname-unhid' => 'notandanafn birt',
'revdelete-restricted' => 'hömlur settar á stjórnendur',
'revdelete-unrestricted' => 'fjarlægja hömlur á stjórnendur',
-'logentry-move-move' => '$1 færði $3 á $4',
-'logentry-move-move-noredirect' => '$1 færði $3 á $4 án þess að skilja eftir tilvísun',
-'logentry-move-move_redir' => '$1 færði $3 á $4 yfir tilvísun',
-'logentry-move-move_redir-noredirect' => '$1 færði $3 á $4 yfir tilvísun, án þess að skilja eftir tilvísun',
-'logentry-patrol-patrol' => '$1 merkti útgáfu $3 frá $4 sem yfirfarna',
-'logentry-patrol-patrol-auto' => '$1 merkti sjálfvirkt útgáfu $3 frá $4 sem yfirfarna',
-'logentry-newusers-newusers' => 'Notandaaðgangurinn $1 var stofnaður',
-'logentry-newusers-create' => 'Notandaaðgangurinn $1 var stofnaður',
-'logentry-newusers-create2' => '$1 stofnaði notandaaðganginn $3',
-'logentry-newusers-autocreate' => 'Aðgangurinn $1 var stofnaður sjálfvirkt',
-'newuserlog-byemail' => 'lykilorð sent með tölvupósti',
+'logentry-move-move' => '$1 {{GENDER:$2|færði}} $3 á $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|færði}} $3 á $4 án þess að skilja eftir tilvísun',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|færði}} $3 á $4 yfir tilvísun',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|færði}} $3 á $4 yfir tilvísun, án þess að skilja eftir tilvísun',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|merkti}} útgáfu $3 frá $4 sem yfirfarna',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|merkti}} sjálfvirkt útgáfu $3 frá $4 sem yfirfarna',
+'logentry-newusers-newusers' => 'Notandaaðgangurinn $1 var {{GENDER:$2|stofnaður}}',
+'logentry-newusers-create' => 'Notandaaðgangurinn $1 var {{GENDER:$2|stofnaður}}',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|stofnaði}} notandaaðganginn $3',
+'logentry-newusers-byemail' => 'Notandaaðgangurinn $3 var {{GENDER:$2|búinn til}} af $1 og lykilorðið var sent með tölvupósti',
+'logentry-newusers-autocreate' => 'Aðgangurinn $1 var {{GENDER:$2|stofnaður}} sjálfvirkt',
+'logentry-rights-rights' => '$1 {{GENDER:$2|breytti}} réttindum $3 frá $4 í $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|breytti}} réttindum $3',
+'logentry-rights-autopromote' => '$1 fékk sjálfvirkt {{GENDER:$2|aukin}} réttindi frá $4 til $5',
+'rightsnone' => '(engum)',
# Feedback
'feedback-bugornote' => 'Ef þú ert reiðubúinn að lýsa tæknilegri villu í smáatriðum, vinsamlegast [$1 tilkynntu villu].
@@ -3872,6 +3910,7 @@ Ef ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemd
'api-error-ok-but-empty' => 'Innri villa: ekkert svar frá vefþjón.',
'api-error-overwrite' => 'Óheimilt er að skrifa yfir skrá sem er þegar til.',
'api-error-stashfailed' => 'Innri villa: Vefþjónninn gat ekki geymt tímabundna skrá.',
+'api-error-publishfailed' => 'Innri villa: Vefþjónninn gat ekki gefið út bráðabirgðaskrá.',
'api-error-timeout' => 'Vefþjónninn svaraði ekki á tilætluðum tíma.',
'api-error-unclassified' => 'Óþekkt villa kom upp.',
'api-error-unknown-code' => 'Óþekkt villa: "$1"',
@@ -3892,4 +3931,7 @@ Ef ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemd
'duration-centuries' => '$1 {{PLURAL:$1|öld|aldir}}',
'duration-millennia' => '$1 {{PLURAL:$1|árþúsund}}',
+# Image rotation
+'rotate-comment' => 'Myndinni var snúið um $1 {{PLURAL:$1|gráðu|gráður}} réttsælis',
+
);
diff --git a/languages/messages/MessagesIt.php b/languages/messages/MessagesIt.php
index 76ed206a..c4cfe43a 100644
--- a/languages/messages/MessagesIt.php
+++ b/languages/messages/MessagesIt.php
@@ -55,6 +55,7 @@
* @author Rippitippi
* @author S.Örvarr.S
* @author SabineCretella
+ * @author Sannita
* @author Stefano-c
* @author Tonyfroio
* @author Trixt
@@ -138,6 +139,7 @@ $specialPageAliases = array(
'Filepath' => array( 'Percorso' ),
'Import' => array( 'Importa' ),
'Invalidateemail' => array( 'InvalidaEMail' ),
+ 'JavaScriptTest' => array( 'TestJavaScript' ),
'BlockList' => array( 'IPBloccati', 'ElencoBlocchi', 'Blocchi' ),
'LinkSearch' => array( 'CercaCollegamenti', 'CercaLink' ),
'Listadmins' => array( 'Amministratori', 'ElencoAmministratori', 'Admin', 'Sysop', 'Cricca' ),
@@ -154,6 +156,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'RicercaMIME' ),
'Mostcategories' => array( 'PagineConPiùCategorie' ),
'Mostimages' => array( 'ImmaginiPiùRichiamate' ),
+ 'Mostinterwikis' => array( 'InterwikiPiùRichiamati' ),
'Mostlinked' => array( 'PaginePiùRichiamate' ),
'Mostlinkedcategories' => array( 'CategoriePiùRichiamate' ),
'Mostlinkedtemplates' => array( 'TemplatePiùRichiamati' ),
@@ -248,14 +251,24 @@ $magicWords = array(
'img_left' => array( '1', 'sinistra', 'left' ),
'img_none' => array( '1', 'nessuno', 'none' ),
'img_center' => array( '1', 'centro', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'riquadrato', 'incorniciato', 'originale', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'senza_cornice', 'frameless' ),
'img_page' => array( '1', 'pagina=$1', 'pagina_$1', 'page=$1', 'page $1' ),
+ 'img_upright' => array( '1', 'verticale', 'verticale=$1', 'verticale_$1', 'upright', 'upright=$1', 'upright $1' ),
'img_border' => array( '1', 'bordo', 'border' ),
+ 'img_sub' => array( '1', 'pedice', 'sub' ),
+ 'img_top' => array( '1', 'sopra', 'top' ),
+ 'img_text_top' => array( '1', 'testo-sopra', 'text-top' ),
+ 'img_middle' => array( '1', 'metà', 'middle' ),
+ 'img_bottom' => array( '1', 'sotto', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'testo-sotto', 'text-bottom' ),
'sitename' => array( '1', 'NOMESITO', 'SITENAME' ),
'servername' => array( '0', 'NOMESERVER', 'SERVERNAME' ),
'gender' => array( '0', 'GENERE:', 'GENDER:' ),
'currentweek' => array( '1', 'SETTIMANACORRENTE', 'CURRENTWEEK' ),
'localweek' => array( '1', 'SETTIMANALOCALE', 'LOCALWEEK' ),
'plural' => array( '0', 'PLURALE:', 'PLURAL:' ),
+ 'displaytitle' => array( '1', 'MOSTRATITOLO', 'DISPLAYTITLE' ),
'language' => array( '0', '#LINGUA', '#LANGUAGE:' ),
'numberofadmins' => array( '1', 'NUMEROADMIN', 'NUMBEROFADMINS' ),
'special' => array( '0', 'speciale', 'special' ),
@@ -265,6 +278,9 @@ $magicWords = array(
'index' => array( '1', '__INDICE__', '__INDEX__' ),
'noindex' => array( '1', '__NOINDICE__', '__NOINDEX__' ),
'protectionlevel' => array( '1', 'LIVELLOPROTEZIONE', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'formatodata', 'formatdate', 'dateformat' ),
+ 'pagesincategory_pages' => array( '0', 'pagine', 'pages' ),
+ 'pagesincategory_files' => array( '0', 'file', 'files' ),
);
$linkTrail = '/^([a-zàéèíîìóòúù]+)(.*)$/sDu';
@@ -404,6 +420,7 @@ $messages = array(
'newwindow' => '(si apre in una nuova finestra)',
'cancel' => 'Annulla',
'moredotdotdot' => 'Altro...',
+'morenotlisted' => 'Altro...',
'mypage' => 'Pagina',
'mytalk' => 'discussioni',
'anontalk' => 'Discussioni per questo IP',
@@ -415,7 +432,6 @@ $messages = array(
'qbbrowse' => 'Sfoglia',
'qbedit' => 'Modifica',
'qbpageoptions' => 'Opzioni pagina',
-'qbpageinfo' => 'Informazioni pagina',
'qbmyoptions' => 'Le mie pagine',
'qbspecialpages' => 'Pagine speciali',
'faq' => 'Domande frequenti',
@@ -438,6 +454,7 @@ $messages = array(
'namespaces' => 'Namespace',
'variants' => 'Varianti',
+'navigation-heading' => 'Menu di navigazione',
'errorpagetitle' => 'Errore',
'returnto' => 'Torna a $1.',
'tagline' => 'Da {{SITENAME}}.',
@@ -678,11 +695,11 @@ L\'amministratore che lo ha bloccato ha fornito questa motivazione: "$3".',
# Login and logout pages
'logouttext' => "'''Logout effettuato.'''
-Si può continuare ad usare {{SITENAME}} come utente anonimo oppure [[Special:UserLogin|eseguire un nuovo accesso]], con lo stesso nome utente o un nome diverso.
+Si può continuare ad usare {{SITENAME}} come utente anonimo oppure <span class='plainlinks'>[$1 eseguire un nuovo accesso]</span>, con lo stesso nome utente o un nome diverso.
Nota che alcune pagine potrebbero continuare ad apparire come se il logout non fosse avvenuto finché non viene pulita la cache del proprio browser.",
-'welcomecreation' => "== Benvenuto, $1! ==
-
-L'account è stato creato correttamente. Non dimenticare di personalizzare le [[Special:Preferences|preferenze di {{SITENAME}}]].",
+'welcomeuser' => 'Benvenuto, $1!',
+'welcomecreation-msg' => "L'account è stato creato correttamente.
+Non dimenticare di personalizzare le [[Special:Preferences|preferenze di {{SITENAME}}]].",
'yourname' => 'Nome utente:',
'yourpassword' => 'Password:',
'yourpasswordagain' => 'Ripeti la password:',
@@ -705,7 +722,7 @@ L'account è stato creato correttamente. Non dimenticare di personalizzare le [[
'gotaccount' => 'Hai già un accesso? $1.',
'gotaccountlink' => 'Entra',
'userlogin-resetlink' => 'Hai dimenticato i tuoi dati di accesso?',
-'createaccountmail' => 'Tramite email',
+'createaccountmail' => "Usa una password casuale temporanea e inviala all'indirizzo e-mail specificato sotto",
'createaccountreason' => 'Motivo:',
'badretype' => 'Le password inserite non coincidono tra loro.',
'userexists' => 'Il nome utente inserito è già utilizzato.
@@ -772,6 +789,7 @@ Riprovare più tardi.',
# Email sending
'php-mail-error-unknown' => 'Errore sconosciuto nella funzione PHP mail()',
'user-mail-no-addy' => 'Hai cercato di inviare una e-mail senza un indirizzo.',
+'user-mail-no-body' => 'Tentato di inviare una e-mail con un testo vuoto o estremamente breve.',
# Change password dialog
'resetpass' => 'Cambia la password',
@@ -833,6 +851,7 @@ Password temporanea: $2',
'changeemail-oldemail' => 'Indirizzo e-mail attuale:',
'changeemail-newemail' => 'Nuovo indirizzo e-mail:',
'changeemail-none' => '(nessuno)',
+'changeemail-password' => 'La password su {{SITENAME}}:',
'changeemail-submit' => 'Modifica e-mail',
'changeemail-cancel' => 'Annulla',
@@ -1003,7 +1022,6 @@ L'ultimo elemento del registro è riportato di seguito per informazione:",
'template-semiprotected' => '(semiprotetto)',
'hiddencategories' => 'Questa pagina appartiene a {{PLURAL:$1|una categoria nascosta|$1 categorie nascoste}}:',
'edittools' => '<!-- Testo che appare al di sotto del modulo di modifica e di upload. -->',
-'nocreatetitle' => 'Creazione delle pagine limitata',
'nocreatetext' => 'La possibilità di creare nuove pagine su {{SITENAME}} è stata limitata ai soli utenti registrati. È possibile tornare indietro e modificare una pagina esistente, oppure [[Special:UserLogin|entrare o registrarsi]].',
'nocreate-loggedin' => 'Non si dispone dei permessi necessari a creare nuove pagine.',
'sectioneditnotsupported-title' => 'Modifica delle sezioni non supportata',
@@ -1026,6 +1044,15 @@ Sembra che sia stata cancellata.',
'edit-already-exists' => 'Impossibile creare una nuova pagina.
Esiste già.',
'defaultmessagetext' => 'Testo predefinito',
+'content-failed-to-parse' => 'Impossibile analizzare $2 per il modello $1: $3',
+'invalid-content-data' => 'Dati contenuti non validi',
+'content-not-allowed-here' => 'Contenuto in "$1" non consentito nella pagine [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitesto',
+'content-model-text' => 'testo normale',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Attenzione:''' Questa pagina contiene troppe chiamate alle parser functions.
@@ -1381,9 +1408,9 @@ L'operazione non può essere annullata.",
'prefs-emailconfirm-label' => "Conferma dell'e-mail:",
'prefs-textboxsize' => 'Dimensione della finestra di modifica',
'youremail' => 'Indirizzo e-mail:',
-'username' => 'Nome utente:',
-'uid' => 'ID utente:',
-'prefs-memberingroups' => 'Membro {{PLURAL:$1|del gruppo|dei gruppi}}:',
+'username' => '{{GENDER:$1|Nome utente}}:',
+'uid' => '{{GENDER:$1|ID utente}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Membro}} {{PLURAL:$1|del gruppo|dei gruppi}}:',
'prefs-registration' => 'Data di registrazione:',
'yourrealname' => 'Nome vero:',
'yourlanguage' => "Lingua dell'interfaccia:",
@@ -1531,12 +1558,13 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
'right-sendemail' => 'Invia e-mail ad altri utenti',
'right-passwordreset' => 'Vede i messaggi di reimpostazione della password',
+# Special:Log/newusers
+'newuserlogpage' => 'Nuovi utenti',
+'newuserlogpagetext' => 'Di seguito sono elencate le utenze di nuova creazione.',
+
# User rights log
'rightslog' => 'Diritti degli utenti',
'rightslogtext' => 'Di seguito sono elencate le modifiche ai diritti assegnati agli utenti.',
-'rightslogentry' => "ha modificato l'appartenenza di $1 dal gruppo $2 al gruppo $3",
-'rightslogentry-autopromote' => 'è stato/a automaticamente promosso/a da $2 a $3',
-'rightsnone' => '(nessuno)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'leggere questa pagina',
@@ -1765,6 +1793,7 @@ $1',
'backend-fail-notsame' => 'Esiste già un file non identico a $1 .',
'backend-fail-invalidpath' => '$1 non è un percorso di archiviazione valido.',
'backend-fail-delete' => 'Impossibile cancellare il file $1.',
+'backend-fail-describe' => 'Impossibile modificare i metadati del file "$1".',
'backend-fail-alreadyexists' => 'Il file $1 esiste già.',
'backend-fail-store' => 'Impossibilie memorizzare file $1 in $2 .',
'backend-fail-copy' => 'Impossibile copiare il file $1 in $2 .',
@@ -1998,6 +2027,12 @@ Probabilmente vuoi modificare la descrizione presente nella [$2 pagina di descri
Esse potrebbero dover puntare a una pagina più appropriata.<br />
Vengono considerate pagine di disambiguazione tutte quelle che contengono i template elencati in [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Pagine con una proprietà di pagina',
+'pageswithprop-legend' => 'Pagine con una proprietà di pagina',
+'pageswithprop-text' => 'Questa pagina elenca le pagine che utilizzano una particolare proprietà di pagina.',
+'pageswithprop-prop' => 'Nome proprietà:',
+'pageswithprop-submit' => 'Vai',
+
'doubleredirects' => 'Redirect doppi',
'doubleredirectstext' => 'In questa pagina sono elencate pagine che reindirizzano ad altre pagine di redirect.
Ciascuna riga contiene i collegamenti al primo ed al secondo redirect, oltre alla prima riga di testo del secondo redirect che di solito contiene la pagina di destinazione "corretta" alla quale dovrebbe puntare anche il primo redirect.
@@ -2149,9 +2184,9 @@ Vedi anche le [[Special:WantedCategories|categorie richieste]].',
'linksearch-pat' => 'Pattern di ricerca:',
'linksearch-ns' => 'Namespace:',
'linksearch-ok' => 'Cerca',
-'linksearch-text' => 'È possibile fare uso di metacaratteri, ad esempio "*.wikipedia.org".<br />
+'linksearch-text' => 'È possibile fare uso di metacaratteri, ad esempio "*.wikipedia.org".
È necessario almeno un dominio di primo livello, ad esempio "*.org".<br />
-Protocolli supportati: <code>$1</code> (predefinito http:// se nessun protocollo è specificato).',
+{{PLURAL:$2|Protocollo supportato|Protocolli supportati}}: <code>$1</code> (predefinito http:// se nessun protocollo è specificato).',
'linksearch-line' => '$1 presente nella pagina $2',
'linksearch-error' => "I metacaratteri possono essere usati solo all'inizio dell'indirizzo.",
@@ -2170,10 +2205,6 @@ Protocolli supportati: <code>$1</code> (predefinito http:// se nessun protocollo
'activeusers-hidesysops' => 'Nascondi gli amministratori',
'activeusers-noresult' => 'Nessun utente risponde ai criteri impostati.',
-# Special:Log/newusers
-'newuserlogpage' => 'Nuovi utenti',
-'newuserlogpagetext' => 'Di seguito sono elencate le utenze di nuova creazione.',
-
# Special:ListGroupRights
'listgrouprights' => 'Diritti del gruppo utente',
'listgrouprights-summary' => "Di seguito sono elencati i gruppi utente definiti per questo sito, con i diritti d'accesso loro associati.
@@ -2268,32 +2299,36 @@ D\'ora in poi, le modifiche apportate alla pagina e alla sua discussione verrann
'enotif_mailer' => 'Sistema di notifica via e-mail di {{SITENAME}}',
'enotif_reset' => 'Segna tutte le pagine come già visitate',
-'enotif_newpagetext' => 'Questa è una nuova pagina.',
'enotif_impersonal_salutation' => 'Utente di {{SITENAME}}',
-'changed' => 'modificata',
-'created' => 'creata',
-'enotif_subject' => 'La pagina $PAGETITLE di {{SITENAME}} è stata $CHANGEDORCREATED da $PAGEEDITOR',
+'enotif_subject_deleted' => 'La pagina $1 di {{SITENAME}} è stata cancellata da {{gender:$2|$2}}',
+'enotif_subject_created' => 'La pagina $1 di {{SITENAME}} è stata creata da {{gender:$2|$2}}',
+'enotif_subject_moved' => 'La pagina $1 di {{SITENAME}} è stata spostata da {{gender:$2|$2}}',
+'enotif_subject_restored' => 'La pagina $1 di {{SITENAME}} è stata ripristinata da {{gender:$2|$2}}',
+'enotif_subject_changed' => 'La pagina $1 di {{SITENAME}} è stata modificata da {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'La pagina $1 di {{SITENAME}} è stata cancellata da {{gender:$2|$2}} il $PAGEEDITDATE (vedi $3 per la versione attuale).',
+'enotif_body_intro_created' => 'La pagina $1 di {{SITENAME}} è stata creata da {{gender:$2|$2}} il $PAGEEDITDATE, vedi $3 per la versione attuale.',
+'enotif_body_intro_moved' => 'La pagina $1 di {{SITENAME}} è stata spostata da {{gender:$2|$2}} il $PAGEEDITDATE, vedi $3 per la versione attuale.',
+'enotif_body_intro_restored' => 'La pagina $1 di {{SITENAME}} è stata ripristinata da {{gender:$2|$2}} il $PAGEEDITDATE, vedi $3 per la versione attuale.',
+'enotif_body_intro_changed' => 'La pagina $1 di {{SITENAME}} è stata modificata da {{gender:$2|$2}} il $PAGEEDITDATE, vedi $3 per la versione attuale.',
'enotif_lastvisited' => "Visita $1 per vedere tutte le modifiche dall'ultima visita.",
'enotif_lastdiff' => 'Visita $1 per vedere la modifica.',
'enotif_anon_editor' => 'utente anonimo $1',
'enotif_body' => 'Gentile $WATCHINGUSERNAME,
-la pagina $PAGETITLE di {{SITENAME}} è stata $CHANGEDORCREATED in data $PAGEEDITDATE da $PAGEEDITOR; la versione attuale si trova all\'indirizzo $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
-Oggetto della modifica, inserito dall\'autore: $PAGESUMMARY $PAGEMINOREDIT
+Oggetto dell\'intervento, inserito dall\'autore: $PAGESUMMARY $PAGEMINOREDIT
-Contatta l\'autore della modifica:
-via e-mail: $PAGEEDITOR_EMAIL
+Contatta l\'autore:
+via posta elettronica: $PAGEEDITOR_EMAIL
sul sito: $PAGEEDITOR_WIKI
-Non verranno inviate altre notifiche in caso di ulteriori cambiamenti, a meno che tu non visiti la pagina. Inoltre, è possibile reimpostare l\'avviso di notifica per tutte le pagine nella lista degli osservati speciali.
+Non verranno inviate altre notifiche in caso di ulteriori attività, se non visiti la pagina. Inoltre, è possibile modificare le impostazioni di notifica per tutte le pagine nella lista degli osservati speciali.
Il sistema di notifica di {{SITENAME}}, al tuo servizio
--
-Per modificare le impostazioni delle notifiche via e-mail, visita
+Per modificare le impostazioni delle notifiche via posta elettronica, visita
{{canonicalurl:{{#special:Preferences}}}}
Per modificare la lista degli osservati speciali, visita
@@ -2304,6 +2339,8 @@ $UNWATCHURL
Per commentare e ricevere aiuto:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'creata',
+'changed' => 'modificata',
# Delete
'deletepage' => 'Cancella pagina',
@@ -2368,6 +2405,8 @@ Vedi la [[Special:ProtectedPages|lista delle pagine protette]] per l'elenco dell
'prot_1movedto2' => 'ha spostato [[$1]] a [[$2]]',
'protect-badnamespace-title' => 'Namespace non suscettibile di protezione',
'protect-badnamespace-text' => 'Le pagine di questo namespace non possono essere protette.',
+'protect-norestrictiontypes-text' => 'Questa pagina non può essere protetta poiché non vi è alcun tipo di restrizione disponibile.',
+'protect-norestrictiontypes-title' => 'Pagina non proteggibile',
'protect-legend' => 'Conferma la protezione',
'protectcomment' => 'Motivo:',
'protectexpiry' => 'Scadenza:',
@@ -2448,7 +2487,8 @@ Il testo contenuto nelle revisioni cancellate è disponibile solo agli amministr
'undeletedrevisions' => '{{PLURAL:$1|Una revisione recuperata|$1 revisioni recuperate}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Una revisione|$1 revisioni}} e $2 file recuperati',
'undeletedfiles' => '{{PLURAL:$1|Un file recuperato|$1 file recuperati}}',
-'cannotundelete' => 'Ripristino non riuscito; è possibile che la pagina sia già stata recuperata da un altro utente.',
+'cannotundelete' => 'Ripristino non riuscito:
+$1',
'undeletedpage' => "'''La pagina $1 è stata recuperata'''
Consultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cancellazioni e i recuperi più recenti.",
@@ -2479,7 +2519,7 @@ $1',
'blanknamespace' => '(Principale)',
# Contributions
-'contributions' => 'Contributi utente',
+'contributions' => 'Contributi {{GENDER:$1|utente}}',
'contributions-title' => 'Contributi di $1',
'mycontris' => 'contributi',
'contribsub2' => 'Per $1 ($2)',
@@ -2736,6 +2776,7 @@ La pagina specificata come destinazione "[[:$1]]" esiste già. Vuoi cancellarla
'immobile-target-namespace-iw' => 'Un collegamento interwiki non è una destinazione valida per spostare la pagina.',
'immobile-source-page' => 'Questa pagina non può essere spostata.',
'immobile-target-page' => 'Non è possibile spostare sul titolo indicato.',
+'bad-target-model' => 'La destinazione desiderata utilizza un modello di contenuti diverso. Non è possibile convertire da $1 a $2.',
'imagenocrossnamespace' => 'Non è possibile spostare un file fuori dal relativo namespace.',
'nonfile-cannot-move-to-file' => 'Non è possibile spostare un file fuori dal relativo namespace.',
'imagetypemismatch' => 'La nuova estensione del file non corrisponde al tipo dello stesso',
@@ -2846,6 +2887,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
'import-error-interwiki' => 'La pagina "$1" non viene importata perché il suo nome è riservato per il collegamento esterno (interwiki).',
'import-error-special' => 'La pagina "$1" non viene importata perché appartiene a un namespace speciale che non permette pagine.',
'import-error-invalid' => 'La pagina "$1" non viene importata perché il suo nome non è valido.',
+'import-error-unserialize' => 'La versione $2 della pagina "$1" non può essere de-serializzata. La versione è stata segnalata per utilizzare il modello di contenuto $3 serializzato come $4.',
'import-options-wrong' => '{{PLURAL:$2|Opzione sbagliata|Opzioni sbagliate}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'La pagina principale fornita non è un titolo valido.',
'import-rootpage-nosubpage' => 'Il namespace "$1" della pagina principale non permette di avere sottopagine.',
@@ -2860,7 +2902,6 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
# JavaScriptTest
'javascripttest' => 'Sperimentazione JavaScript',
-'javascripttest-disabled' => 'Questa funzione non è abilitata su questo wiki.',
'javascripttest-title' => 'In esecuzione test per $1',
'javascripttest-pagetext-noframework' => "Questa pagina è riservata all'esecuzione di test di JavaScript.",
'javascripttest-pagetext-unknownframework' => 'Framework di test sconosciuto "$1".',
@@ -3008,11 +3049,13 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
'pageinfo-default-sort' => 'Criterio di ordinamento predefinito',
'pageinfo-length' => 'Lunghezza della pagina (in byte)',
'pageinfo-article-id' => 'ID della pagina',
+'pageinfo-language' => 'Lingua del contenuto della pagina',
'pageinfo-robot-policy' => 'Stato per i motori di ricerca',
'pageinfo-robot-index' => 'Indicizzabile',
'pageinfo-robot-noindex' => 'Non indicizzabile',
'pageinfo-views' => 'Numero di visualizzazioni',
'pageinfo-watchers' => 'Numero di utenti che hanno la pagina nei loro osservati speciali',
+'pageinfo-few-watchers' => 'Meno di $1 {{PLURAL:$1|osservatore|osservatori}}',
'pageinfo-redirects-name' => 'Redirect a questa pagina',
'pageinfo-subpages-name' => 'Sottopagine di questa pagina',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirect}}; $3 {{PLURAL:$3|non redirect}})',
@@ -3027,6 +3070,19 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
'pageinfo-magic-words' => '{{PLURAL:$1|Parola magica|Parole magiche}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria nascosta|Categorie nascoste}} ($1)',
'pageinfo-templates' => 'Template {{PLURAL:$1|incluso|inclusi}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pagina|Pagine}} in cui è incluso ($1)',
+'pageinfo-toolboxlink' => 'Informazioni sulla pagina',
+'pageinfo-redirectsto' => 'Reindirizza a',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Conteggiata come una pagina di contenuto',
+'pageinfo-contentpage-yes' => 'Sì',
+'pageinfo-protect-cascading' => 'Protezione ricorsiva da qui',
+'pageinfo-protect-cascading-yes' => 'Sì',
+'pageinfo-protect-cascading-from' => 'Protezione ricorsiva ereditata da',
+'pageinfo-category-info' => 'Informazioni sulla categoria',
+'pageinfo-category-pages' => 'Numero di pagine',
+'pageinfo-category-subcats' => 'Numero di sottocategorie',
+'pageinfo-category-files' => 'Numero di file',
# Skin names
'skinname-nostalgia' => 'Nostalgia',
@@ -3041,6 +3097,8 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
'markedaspatrollederror' => 'Impossibile contrassegnare la voce come verificata',
'markedaspatrollederrortext' => 'Occorre specificare una modifica da contrassegnare come verificata.',
'markedaspatrollederror-noautopatrol' => 'Non si dispone dei permessi necessari per segnare le proprie modifiche come verificate.',
+'markedaspatrollednotify' => 'La modifica a $1 è stata contrassegnata come verificata.',
+'markedaspatrollederrornotify' => 'Errore durante la verifica.',
# Patrol log
'patrol-log-page' => 'Modifiche verificate',
@@ -3073,6 +3131,7 @@ $1',
'file-nohires' => 'Non sono disponibili versioni a risoluzione più elevata.',
'svg-long-desc' => 'file in formato SVG, dimensioni nominali $1 × $2 pixel, dimensione del file: $3',
'svg-long-desc-animated' => 'file in formato SVG animato, dimensioni nominali $1 × $2 pixel, dimensione del file: $3',
+'svg-long-error' => 'File SVG non valido: $1',
'show-big-image' => 'Versione ad alta risoluzione',
'show-big-image-preview' => 'Dimensioni di questa anteprima: $1.',
'show-big-image-other' => '{{PLURAL:$2|Altra risoluzione|Altre risoluzioni}}: $1.',
@@ -3106,7 +3165,10 @@ $1',
'minutes' => '{{PLURAL:$1|un minuto|$1 minuti}}',
'hours' => "{{PLURAL:$1|un'ora|$1 ore}}",
'days' => '{{PLURAL:$1|$1 giorno|$1 giorni}}',
+'months' => '{{PLURAL:$1|$1 mese|$1 mesi}}',
+'years' => '{{PLURAL:$1|$1 anno|$1 anni}}',
'ago' => '$1 fa',
+'just-now' => 'proprio ora',
# Bad image list
'bad_image_list' => "Il formato è il seguente:
@@ -3608,6 +3670,7 @@ Questo codice di conferma scadrà automaticamente alle $4.',
# Scary transclusion
'scarytranscludedisabled' => "[L'inclusione di pagine tra siti wiki non è attiva]",
'scarytranscludefailed' => '[Errore: Impossibile ottenere il template $1]',
+'scarytranscludefailed-httpstatus' => '[Errore: impossibile ottenere il template $1: HTTP $2]',
'scarytranscludetoolong' => '[Errore: URL troppo lunga]',
# Delete conflict
@@ -3728,6 +3791,7 @@ Si noti che è anche possibile [[Special:EditWatchlist|modificare la lista con l
'version-license' => 'Licenza',
'version-poweredby-credits' => "Questo wiki è realizzato con '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'altri',
+'version-credits-summary' => 'Siamo lieti di riconoscere le seguenti persone per aver contribuito a [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki è un software libero; puoi redistribuirlo e/o modificarlo secondo i termini della GNU General Public License, come pubblicata dalla Free Software Foundation; o la versione 2 della Licenza o (a propria scelta) qualunque versione successiva.
MediaWiki è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita di NEGOZIABILITÀ o di APPLICABILITÀ PER UN PARTICOLARE SCOPO. Si veda la GNU General Public License per maggiori dettagli.
@@ -3844,17 +3908,17 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
'sqlite-no-fts' => '$1 senza la possibilità di ricerca completa nel testo',
# New logging system
-'logentry-delete-delete' => '$1 ha cancellato la pagina $3',
-'logentry-delete-restore' => '$1 ha ripristinato "$3"',
-'logentry-delete-event' => '$1 ha modificato la visibilità di {{PLURAL:$5|un\'azione del registro|$5 azioni del registro}} di "$3": $4',
-'logentry-delete-revision' => '$1 ha modificato la visibilità per {{PLURAL:$5|una revisione|$5 revisioni}} della pagina $3: $4',
-'logentry-delete-event-legacy' => '$1 ha modificato la visibilità di alcune azioni del registro di "$3"',
-'logentry-delete-revision-legacy' => '$1 ha modificato la visibilità per le revisioni della pagina $3',
-'logentry-suppress-delete' => '$1 ha nascosto la pagina "$3"',
-'logentry-suppress-event' => '$1 ha segretamente modificato la visibilità di {{PLURAL:$5|un\'azione del registro|$5 azioni del registro}} di "$3": $4',
-'logentry-suppress-revision' => '$1 ha segretamente modificato la visibilità di {{PLURAL:$5|una versione|$5 versioni}} di "$3": $4',
-'logentry-suppress-event-legacy' => '$1 ha segretamente modificato la visibilità di alcune azioni del registro di "$3"',
-'logentry-suppress-revision-legacy' => '$1 ha segretamente modificato la visibilità di alcune versioni di "$3"',
+'logentry-delete-delete' => '$1 {{GENDER:$2|ha cancellato}} la pagina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|ha ripristinato}} la pagina "$3"',
+'logentry-delete-event' => '$1 {{GENDER:$2|ha modificato}} la visibilità di {{PLURAL:$5|un\'azione del registro|$5 azioni del registro}} di "$3": $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ha modificato}} la visibilità per {{PLURAL:$5|una versione|$5 versioni}} della pagina $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|ha modificato}} la visibilità di alcune azioni del registro di $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|ha modificato}} la visibilità per le versioni della pagina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|ha nascosto}} la pagina $3',
+'logentry-suppress-event' => "$1 {{GENDER:$2|ha segretamente modificato}} la visibilità di {{PLURAL:$5|un'azione del registro|$5 azioni del registro}} di $3: $4",
+'logentry-suppress-revision' => '$1 {{GENDER:$2|ha segretamente modificato}} la visibilità di {{PLURAL:$5|una versione|$5 versioni}} della pagina $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|ha segretamente modificato}} la visibilità di alcune azioni del registro di $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|ha segretamente modificato}} la visibilità di alcune versioni della pagina $3',
'revdelete-content-hid' => 'contenuto nascosto',
'revdelete-summary-hid' => 'oggetto della modifica nascosto',
'revdelete-uname-hid' => 'nome utente nascosto',
@@ -3863,17 +3927,21 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
'revdelete-uname-unhid' => 'nome utente ripristinato',
'revdelete-restricted' => 'limitazioni ai soli amministratori attivate',
'revdelete-unrestricted' => 'limitazioni ai soli amministratori rimosse',
-'logentry-move-move' => '$1 ha spostato la pagina $3 a $4',
-'logentry-move-move-noredirect' => '$1 ha spostato la pagina $3 a $4 senza lasciare redirect',
-'logentry-move-move_redir' => '$1 ha spostato la pagina $3 a $4 tramite redirect',
-'logentry-move-move_redir-noredirect' => '$1 ha spostato la pagina $3 a $4 al posto di un redirect senza lasciare redirect',
-'logentry-patrol-patrol' => '$1 ha segnato la versione $4 della pagina $3 come verificata',
-'logentry-patrol-patrol-auto' => '$1 ha segnato automaticamente la versione $4 della pagina $3 come verificata',
-'logentry-newusers-newusers' => "L'utenza $1 è stata creata",
-'logentry-newusers-create' => "L'utenza $1 è stata creata",
-'logentry-newusers-create2' => "L'utenza $3 è stata creata da $1",
-'logentry-newusers-autocreate' => "L'utenza $1 è stata creata automaticamente",
-'newuserlog-byemail' => 'password inviata via mail',
+'logentry-move-move' => '$1 {{GENDER:$2|ha spostato}} la pagina $3 a $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|ha spostato}} la pagina $3 a $4 senza lasciare redirect',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|ha spostato}} la pagina $3 a $4 tramite redirect',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|ha spostato}} la pagina $3 a $4 al posto di un redirect senza lasciare redirect',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|ha segnato}} la versione $4 della pagina $3 come verificata',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|ha segnato}} automaticamente la versione $4 della pagina $3 come verificata',
+'logentry-newusers-newusers' => "L'utenza $1 è stata {{GENDER:$2|creata}}",
+'logentry-newusers-create' => "L'utenza $1 è stata {{GENDER:$2|creata}}",
+'logentry-newusers-create2' => "L'utenza $3 è stata {{GENDER:$2|creata}} da $1",
+'logentry-newusers-byemail' => "L'utenza $3 è stata {{GENDER:$2|creata}} da $1 e la password è stata inviata via email",
+'logentry-newusers-autocreate' => "L'utenza $1 è stata {{GENDER:$2|creata}} automaticamente",
+'logentry-rights-rights' => "$1 {{GENDER:$2|ha modificato}} l'appartenenza di $3 dal gruppo $4 al gruppo $5",
+'logentry-rights-rights-legacy' => "$1 {{GENDER:$2|ha modificato}} l'appartenenza a gruppi di $3",
+'logentry-rights-autopromote' => '$1 è {{GENDER:$2|stato promosso|stata promossa|stato/a promosso/a}} automaticamente da $4 a $5',
+'rightsnone' => '(nessuno)',
# Feedback
'feedback-bugornote' => 'Se si è in grado di descrivere il problema tecnico riscontrato in maniera precisa, [$1 segnalate il bug]. In alternativa, si può usare il modulo semplificato sottostante. Il commento inserito sarà aggiunto alla pagina "[$3 $2]", insieme al proprio nome utente e al browser in uso.',
@@ -3926,6 +3994,7 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
'api-error-ok-but-empty' => 'Errore interno: nessuna risposta dal server.',
'api-error-overwrite' => 'Sovrascrivere un file esistente non è consentito.',
'api-error-stashfailed' => 'Errore interno: il server non è riuscito a memorizzare il documento temporaneo.',
+'api-error-publishfailed' => 'Errore interno: il server non è riuscito a pubblicare il documento temporaneo.',
'api-error-timeout' => 'Il server non ha risposto entro il tempo previsto.',
'api-error-unclassified' => 'Si è verificato un errore sconosciuto.',
'api-error-unknown-code' => 'Errore sconosciuto: "$1"',
@@ -3946,4 +4015,7 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
'duration-centuries' => '$1 {{PLURAL:$1|secolo|secoli}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennio|millenni}}',
+# Image rotation
+'rotate-comment' => 'Immagine ruotata di $1 {{PLURAL:$1|grado|gradi}} in senso orario',
+
);
diff --git a/languages/messages/MessagesJa.php b/languages/messages/MessagesJa.php
index b9bffb6c..df503600 100644
--- a/languages/messages/MessagesJa.php
+++ b/languages/messages/MessagesJa.php
@@ -43,6 +43,7 @@
* @author Muttley
* @author Mzm5zbC3
* @author Ohgi
+ * @author Ort43v
* @author Penn Station
* @author Reedy
* @author Schu
@@ -179,7 +180,6 @@ $specialPageAliases = array(
'Recentchanges' => array( '最近ã®æ›´æ–°', '最近更新ã—ãŸãƒšãƒ¼ã‚¸' ),
'Recentchangeslinked' => array( '関連ページã®æ›´æ–°çŠ¶æ³', 'リンク先ã®æ›´æ–°çŠ¶æ³' ),
'Revisiondelete' => array( '版指定削除', '特定版削除' ),
- 'RevisionMove' => array( '版移動' ),
'Search' => array( '検索' ),
'Shortpages' => array( '短ã„ページ' ),
'Specialpages' => array( '特別ページ一覧' ),
@@ -218,7 +218,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__目次強制__', '__目次強制__', '__FORCETOC__' ),
'toc' => array( '0', '__目次__', '__目次__', '__TOC__' ),
'noeditsection' => array( '0', '__節編集éžè¡¨ç¤º__', '__セクション編集éžè¡¨ç¤º__', '__セクション編集éžè¡¨ç¤ºï¼¿ï¼¿', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__見出ã—éžè¡¨ç¤º__', '__見出ã—éžè¡¨ç¤ºï¼¿ï¼¿', '__NOHEADER__' ),
'currentmonth' => array( '1', 'ç¾åœ¨ã®æœˆ', 'å”定月', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'ç¾åœ¨ã®æœˆ1', 'å”定月1', 'å”定月1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'ç¾åœ¨ã®æœˆå', 'å”定月å', 'CURRENTMONTHNAME' ),
@@ -292,7 +291,7 @@ $magicWords = array(
'img_text_bottom' => array( '1', '文下端', 'text-bottom' ),
'img_link' => array( '1', 'リンク=$1', 'link=$1' ),
'img_alt' => array( '1', '代替文=$1', 'alt=$1' ),
- 'int' => array( '0', 'インターフェース:', 'インタ:', 'インターフェース:', 'インタ:', 'INT:' ),
+ 'int' => array( '0', 'インターフェース:', 'インタ:', 'インターフェース:', 'インタ:', 'インターフェイス:', 'インターフェイス:', 'INT:' ),
'sitename' => array( '1', 'サイトå', 'サイトãƒãƒ¼ãƒ ', 'SITENAME' ),
'ns' => array( '0', 'åå‰ç©ºé–“:', 'åå‰ç©ºé–“:', 'å空:', 'å空:', 'NS:' ),
'nse' => array( '0', 'åå‰ç©ºé–“E:', 'NSE:' ),
@@ -359,7 +358,7 @@ $magicWords = array(
'formatdate' => array( '0', '日付整形', 'formatdate', 'dateformat' ),
'url_path' => array( '0', 'パス', 'PATH' ),
'url_wiki' => array( '0', 'ウィキ', 'WIKI' ),
- 'url_query' => array( '0', 'クエリー', 'QUERY' ),
+ 'url_query' => array( '0', 'クエリ', 'クエリー', 'QUERY' ),
);
$messages = array(
@@ -497,6 +496,7 @@ $messages = array(
'newwindow' => '(æ–°ã—ã„ウィンドウã§é–‹ãã¾ã™)',
'cancel' => '中止',
'moredotdotdot' => '続ã...',
+'morenotlisted' => 'ãã®ä»–...',
'mypage' => 'ページ',
'mytalk' => 'トーク',
'anontalk' => 'ã“ã®IPアドレスã®ãƒˆãƒ¼ã‚¯',
@@ -508,7 +508,6 @@ $messages = array(
'qbbrowse' => '閲覧',
'qbedit' => '編集',
'qbpageoptions' => 'ã“ã®ãƒšãƒ¼ã‚¸ã«ã¤ã„ã¦',
-'qbpageinfo' => '関連情報',
'qbmyoptions' => '自分ã®ãƒšãƒ¼ã‚¸',
'qbspecialpages' => '特別ページ',
'faq' => 'よãã‚る質å•ã¨å›žç­”',
@@ -531,6 +530,7 @@ $messages = array(
'namespaces' => 'åå‰ç©ºé–“',
'variants' => '変種',
+'navigation-heading' => '案内メニュー',
'errorpagetitle' => 'エラー',
'returnto' => '$1 ã«æˆ»ã‚‹ã€‚',
'tagline' => 'æä¾›: {{SITENAME}}',
@@ -777,10 +777,10 @@ $2',
# Login and logout pages
'logouttext' => "'''ログアウトã—ã¾ã—ãŸã€‚'''
-ã“ã®ã¾ã¾åŒ¿åã§{{SITENAME}}ã®ä½¿ç”¨ã‚’続行ã§ãã¾ã™ã€‚åŒã˜ã¾ãŸã¯åˆ¥ã®åˆ©ç”¨è€…ã¨ã—ã¦[[Special:UserLogin|ã‚‚ã†ä¸€åº¦ãƒ­ã‚°ã‚¤ãƒ³]]ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ã“ã®ã¾ã¾åŒ¿åã§{{SITENAME}}ã®ä½¿ç”¨ã‚’続行ã§ãã¾ã™ã€‚åŒã˜ã¾ãŸã¯åˆ¥ã®åˆ©ç”¨è€…ã¨ã—ã¦<span class='plainlinks'>[$1 ã‚‚ã†ä¸€åº¦ãƒ­ã‚°ã‚¤ãƒ³]</span>ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
ãªãŠã€ãƒšãƒ¼ã‚¸ã«ã‚ˆã£ã¦ã¯ã€ãƒ–ラウザーã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’クリアã™ã‚‹ã¾ã§ã€ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ã‚‹ã‹ã®ã‚ˆã†ã«è¡¨ç¤ºã•ã‚Œç¶šã‘ã‚‹å ´åˆãŒã‚ã‚‹ãŸã‚ã”注æ„ãã ã•ã„。",
-'welcomecreation' => '== よã†ã“ãã€$1 ã•ã‚“! ==
-アカウントãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚
+'welcomeuser' => 'よã†ã“ãã€$1ã•ã‚“!',
+'welcomecreation-msg' => 'アカウントãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚
[[Special:Preferences|{{SITENAME}}ã®å€‹äººè¨­å®š]]ã®å¤‰æ›´ã‚‚忘れãªã„よã†ã«ã—ã¦ãã ã•ã„。',
'yourname' => '利用者å:',
'yourpassword' => 'パスワード:',
@@ -804,7 +804,7 @@ $2',
'gotaccount' => 'アカウントを既ã«æŒã£ã¦ã„ã‚‹å ´åˆã€$1。',
'gotaccountlink' => 'ログインã—ã¦ãã ã•ã„',
'userlogin-resetlink' => 'ログイン情報をãŠå¿˜ã‚Œã§ã™ã‹?',
-'createaccountmail' => 'メールã§é€ä¿¡',
+'createaccountmail' => '一時的ã§ãƒ©ãƒ³ãƒ€ãƒ ãªãƒ‘スワードを生æˆã—ã¦ã€ä»¥ä¸‹ã«æŒ‡å®šã—ãŸãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«é€ä¿¡ã™ã‚‹',
'createaccountreason' => 'ç†ç”±:',
'badretype' => '入力ã—ãŸãƒ‘スワードãŒä¸€è‡´ã—ã¾ã›ã‚“。',
'userexists' => '入力ã•ã‚ŒãŸåˆ©ç”¨è€…åã¯æ—¢ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚
@@ -886,6 +886,7 @@ Cookieを有効ã«ã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ã€ã“ã®ãƒšãƒ¼ã‚¸ã‚’å†èª­è¾
# Email sending
'php-mail-error-unknown' => 'PHPã®mail()関数ã§ã®ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ã§ã™ã€‚',
'user-mail-no-addy' => 'メールアドレスãªã—ã§ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—よã†ã¨ã—ã¾ã—ãŸã€‚',
+'user-mail-no-body' => '本文ãŒç©ºã€ã¾ãŸã¯ã‚ã¾ã‚Šã«ã‚‚短ã„メールã¯é€ä¿¡ã§ãã¾ã›ã‚“。',
# Change password dialog
'resetpass' => 'パスワードã®å¤‰æ›´',
@@ -945,7 +946,7 @@ $2
仮パスワード: $2',
'passwordreset-emailsent' => 'パスワードå†è¨­å®šãƒ¡ãƒ¼ãƒ«ã‚’ãŠé€ã‚Šã—ã¾ã—ãŸã€‚',
'passwordreset-emailsent-capture' => '下記ã®å†…容ã®ã€ãƒ‘スワードå†è¨­å®šãƒ¡ãƒ¼ãƒ«ã‚’ãŠé€ã‚Šã—ã¾ã—ãŸã€‚',
-'passwordreset-emailerror-capture' => '以下ã®å†…容ã®ç¢ºèªãƒ¡ãƒ¼ãƒ«ã‚’生æˆã—ã¾ã—ãŸãŒã€åˆ©ç”¨è€…ã¸ã®é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ: $1',
+'passwordreset-emailerror-capture' => '以下ã®å†…容ã®ãƒ‘スワードå†è¨­å®šãƒ¡ãƒ¼ãƒ«ã‚’生æˆã—ã¾ã—ãŸãŒã€åˆ©ç”¨è€…ã¸ã®é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ: $1',
# Special:ChangeEmail
'changeemail' => 'メールアドレスã®å¤‰æ›´',
@@ -955,6 +956,7 @@ $2
'changeemail-oldemail' => 'ç¾åœ¨ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹:',
'changeemail-newemail' => 'æ–°ã—ã„メールアドレス:',
'changeemail-none' => '(ãªã—)',
+'changeemail-password' => '{{SITENAME}}ã®ãƒ‘スワード:',
'changeemail-submit' => 'メールアドレスを変更',
'changeemail-cancel' => '中止',
@@ -1145,7 +1147,6 @@ $1ã¾ãŸã¯ä»–ã®[[{{MediaWiki:Grouppage-sysop}}|管ç†è€…]]ã«ã“ã®ãƒ–ロッã‚
'template-semiprotected' => '(åŠä¿è­·)',
'hiddencategories' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¯ {{PLURAL:$1|$1 個ã®éš ã—カテゴリ}}ã«å±žã—ã¦ã„ã¾ã™:',
'edittools' => '<!-- ã“ã“ã«æ›¸ã„ãŸãƒ†ã‚­ã‚¹ãƒˆã¯ç·¨é›†åŠã³ã‚¢ãƒƒãƒ—ロードã®ãƒ•ã‚©ãƒ¼ãƒ ã®ä¸‹ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ -->',
-'nocreatetitle' => 'ページã®ä½œæˆãŒåˆ¶é™ã•ã‚Œã¦ã„ã¾ã™',
'nocreatetext' => '{{SITENAME}}ã§ã¯ãƒšãƒ¼ã‚¸ã®æ–°è¦ä½œæˆã‚’制é™ã—ã¦ã„ã¾ã™ã€‚
å…ƒã®ãƒšãƒ¼ã‚¸ã«æˆ»ã£ã¦æ—¢å­˜ã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã‹ã€[[Special:UserLogin|ログインã¾ãŸã¯ã‚¢ã‚«ã‚¦ãƒ³ãƒˆä½œæˆ]]ã‚’ã—ã¦ãã ã•ã„。',
'nocreate-loggedin' => 'æ–°ã—ã„ページを作æˆã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。',
@@ -1170,6 +1171,15 @@ $1ã¾ãŸã¯ä»–ã®[[{{MediaWiki:Grouppage-sysop}}|管ç†è€…]]ã«ã“ã®ãƒ–ロッã‚
'edit-already-exists' => 'æ–°ã—ã„ページを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
ãã®ãƒšãƒ¼ã‚¸ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚',
'defaultmessagetext' => '既定ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸æ–‡',
+'content-failed-to-parse' => '$2ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’$1モデルã¨ã—ã¦æ§‹æ–‡è§£æžã§ãã¾ã›ã‚“ã§ã—ãŸ: $3',
+'invalid-content-data' => '本文データãŒç„¡åŠ¹ã§ã™',
+'content-not-allowed-here' => 'ページ [[$2]] ã§ã¯ã€ã€Œ$1ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“',
+
+# Content models
+'content-model-wikitext' => 'ウィキテキスト',
+'content-model-text' => 'プレーンテキスト',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''警告:''' ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€é«˜è² è·ãªãƒ‘ーサー関数ã®å‘¼ã³å‡ºã—回数ãŒå¤šéŽãŽã¾ã™ã€‚
@@ -1539,9 +1549,9 @@ $1",
'prefs-emailconfirm-label' => 'メールアドレスã®ç¢ºèª:',
'prefs-textboxsize' => '編集画é¢ã®å¤§ãã•',
'youremail' => 'メールアドレス:',
-'username' => '利用者å:',
-'uid' => '利用者 ID:',
-'prefs-memberingroups' => '所属{{PLURAL:$1|グループ}}:',
+'username' => '{{GENDER:$1|利用者å}}:',
+'uid' => '{{GENDER:$1|利用者}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|所属}}{{PLURAL:$1|グループ}}:',
'prefs-memberingroups-type' => '$1',
'prefs-registration' => '登録日時:',
'prefs-registration-date-time' => '$1',
@@ -1597,6 +1607,7 @@ $1 {{PLURAL:$1|文字}}以下ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'saveusergroups' => '利用者グループをä¿å­˜',
'userrights-groupsmember' => '所属グループ:',
'userrights-groupsmember-auto' => '自動的ã«ä»˜ä¸Žã•ã‚Œã‚‹æ¨©é™:',
+'userrights-groupsmember-type' => '$1',
'userrights-groups-help' => 'ã“ã®åˆ©ç”¨è€…ãŒå±žã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—を変更ã§ãã¾ã™ã€‚
* ãƒã‚§ãƒƒã‚¯ãŒå…¥ã£ã¦ã„るボックスã¯ã€ã“ã®åˆ©ç”¨è€…ãŒãã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å±žã—ã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚
* ãƒã‚§ãƒƒã‚¯ãŒå…¥ã£ã¦ã„ãªã„ボックスã¯ã€ã“ã®åˆ©ç”¨è€…ãŒãã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å±žã—ã¦ã„ãªã„ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚
@@ -1696,12 +1707,13 @@ $1 {{PLURAL:$1|文字}}以下ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'right-sendemail' => 'ä»–ã®åˆ©ç”¨è€…ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡',
'right-passwordreset' => 'パスワードå†è¨­å®šãƒ¡ãƒ¼ãƒ«ã‚’閲覧',
+# Special:Log/newusers
+'newuserlogpage' => 'アカウント作æˆè¨˜éŒ²',
+'newuserlogpagetext' => '以下ã¯ã‚¢ã‚«ã‚¦ãƒ³ãƒˆä½œæˆã®è¨˜éŒ²ã§ã™ã€‚',
+
# User rights log
'rightslog' => '利用者権é™å¤‰æ›´è¨˜éŒ²',
'rightslogtext' => '以下ã¯åˆ©ç”¨è€…権é™ã®å¤‰æ›´è¨˜éŒ²ã§ã™ã€‚',
-'rightslogentry' => '$1 ã®æ‰€å±žã‚°ãƒ«ãƒ¼ãƒ—ã‚’ $2 ã‹ã‚‰ $3 ã«å¤‰æ›´ã—ã¾ã—ãŸ',
-'rightslogentry-autopromote' => '$2 ã‹ã‚‰ $3 ã«è‡ªå‹•çš„ã«æ˜‡æ ¼ã—ã¾ã—ãŸ',
-'rightsnone' => '(ãªã—)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ã“ã®ãƒšãƒ¼ã‚¸ã®é–²è¦§',
@@ -1956,6 +1968,7 @@ $1',
'backend-fail-notsame' => 'ç•°ãªã‚‹å†…容ã®ãƒ•ã‚¡ã‚¤ãƒ«ã€Œ$1ã€ãŒæ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚',
'backend-fail-invalidpath' => '「$1ã€ã¯æœ‰åŠ¹ãªã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãƒ‘スã§ã¯ã‚ã‚Šã¾ã›ã‚“。',
'backend-fail-delete' => 'ファイル「$1ã€ã‚’削除ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'backend-fail-describe' => 'ファイル「$1ã€ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’変更ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
'backend-fail-alreadyexists' => 'ファイル「$1ã€ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚',
'backend-fail-store' => 'ファイル「$1ã€ã‚’「$2ã€ã«æ ¼ç´ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
'backend-fail-copy' => 'ファイル「$1ã€ã‚’「$2ã€ã«è¤‡è£½ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
@@ -2195,6 +2208,12 @@ contenttype/subtypeã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„ (例: <code>image/jpeg</
ã“れらã®ãƒªãƒ³ã‚¯ã¯ã€ã‚ˆã‚Šé©åˆ‡ãªãƒšãƒ¼ã‚¸ã¸ã®ãƒªãƒ³ã‚¯ã«å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚<br />
[[MediaWiki:Disambiguationspage]] ã«ãƒªãƒ³ã‚¯ãŒã‚るテンプレートを使用ã—ã¦ã„るページをã€æ›–昧ã•å›žé¿ãƒšãƒ¼ã‚¸ã¨è¦‹ãªã—ã¾ã™ã€‚",
+'pageswithprop' => 'ページプロパティãŒã‚るページ',
+'pageswithprop-legend' => 'ページプロパティãŒã‚るページ',
+'pageswithprop-text' => 'ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€ç‰¹å®šã®ãƒšãƒ¼ã‚¸ãƒ—ロパティをæŒã¤ãƒšãƒ¼ã‚¸ã‚’列挙ã—ã¾ã™ã€‚',
+'pageswithprop-prop' => 'プロパティå:',
+'pageswithprop-submit' => '実行',
+
'doubleredirects' => '二é‡è»¢é€',
'doubleredirectstext' => 'ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€è»¢é€ãƒšãƒ¼ã‚¸ã¸ã®è»¢é€ãƒšãƒ¼ã‚¸ã‚’列挙ã—ã¾ã™ã€‚
最åˆã®è»¢é€ãƒšãƒ¼ã‚¸ã€ãã®è»¢é€å…ˆã«ã‚る転é€ãƒšãƒ¼ã‚¸ã€ã•ã‚‰ã«ãã®è»¢é€å…ˆã«ã‚るページã€ãã‚Œãžã‚Œã¸ã®ãƒªãƒ³ã‚¯ã‚’å„è¡Œã«è¡¨ç¤ºã—ã¦ã„ã¾ã™ã€‚多ãã®å ´åˆã¯æœ€çµ‚çš„ãªè»¢é€å…ˆãŒã€Œæ­£ã—ã„ã€è»¢é€å…ˆã§ã‚ã‚Šã€æœ€åˆã®è»¢é€ãƒšãƒ¼ã‚¸ã®è»¢é€å…ˆã¯æœ€çµ‚çš„ãªè»¢é€å…ˆã«ç›´æŽ¥å‘ã‘ã‚‹ã¹ãã§ã™ã€‚
@@ -2350,7 +2369,7 @@ contenttype/subtypeã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„ (例: <code>image/jpeg</
'linksearch-ok' => '検索',
'linksearch-text' => '「*.wikipedia.orgã€ã®ã‚ˆã†ã«ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰ã‚’使用ã§ãã¾ã™ã€‚
å°‘ãªãã¨ã‚‚「*.orgã€ã®ã‚ˆã†ãªãƒˆãƒƒãƒ—レベルドメインãŒå¿…è¦ã§ã™ã€‚<br />
-対応プロトコル: <code>$1</code> (プロトコルをçœç•¥ã—ãŸå ´åˆã®æ—¢å®šå€¤ã¯ http:// )。',
+対応{{PLURAL:$2|プロトコル}}: <code>$1</code> (プロトコルをçœç•¥ã—ãŸå ´åˆã®æ—¢å®šå€¤ã¯ http:// )。',
'linksearch-line' => '$1 ㌠$2 ã‹ã‚‰ãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„ã¾ã™',
'linksearch-error' => 'ワイルドカードã¯ãƒ›ã‚¹ãƒˆåã®å…ˆé ­ã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™ã€‚',
@@ -2369,10 +2388,6 @@ contenttype/subtypeã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„ (例: <code>image/jpeg</
'activeusers-hidesysops' => '管ç†è€…ã‚’éš ã™',
'activeusers-noresult' => '利用者ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚',
-# Special:Log/newusers
-'newuserlogpage' => 'アカウント作æˆè¨˜éŒ²',
-'newuserlogpagetext' => '以下ã¯ã‚¢ã‚«ã‚¦ãƒ³ãƒˆä½œæˆã®è¨˜éŒ²ã§ã™ã€‚',
-
# Special:ListGroupRights
'listgrouprights' => '利用者グループã®æ¨©é™',
'listgrouprights-summary' => '以下ã¯ã€ã“ã®ã‚¦ã‚£ã‚­ã«ç™»éŒ²ã•ã‚Œã¦ã„る利用者グループã¨ã€ãã‚Œãžã‚Œã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„る権é™ã®ä¸€è¦§ã§ã™ã€‚
@@ -2469,19 +2484,23 @@ contenttype/subtypeã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„ (例: <code>image/jpeg</
'enotif_mailer' => '{{SITENAME}} 通知メール',
'enotif_reset' => 'ã™ã¹ã¦ã®ãƒšãƒ¼ã‚¸ã‚’訪å•æ¸ˆã¿ã«ã™ã‚‹',
-'enotif_newpagetext' => 'ã“ã‚Œã¯æ–°ã—ã„ページã§ã™ã€‚',
'enotif_impersonal_salutation' => '{{SITENAME}}ã®åˆ©ç”¨è€…',
-'changed' => '変更',
-'created' => '作æˆ',
-'enotif_subject' => '{{SITENAME}}ã®ãƒšãƒ¼ã‚¸ã€Œ$PAGETITLEã€ãŒ$PAGEEDITORã«ã‚ˆã£ã¦$CHANGEDORCREATEDã•ã‚Œã¾ã—ãŸ',
+'enotif_subject_deleted' => '{{SITENAME}} ページ $1 ã‚’ $2 ãŒ{{GENDER:$2|削除ã—ã¾ã—ãŸ}}',
+'enotif_subject_created' => '{{SITENAME}} ページ $1 ã‚’ $2 ãŒ{{GENDER:$2|作æˆã—ã¾ã—ãŸ}}',
+'enotif_subject_moved' => '{{SITENAME}} ページ $1 ã‚’ $2 ãŒ{{GENDER:$2|移動ã—ã¾ã—ãŸ}}',
+'enotif_subject_restored' => '{{SITENAME}} ページ $1 ã‚’ $2 ãŒ{{GENDER:$2|復元ã—ã¾ã—ãŸ}}',
+'enotif_subject_changed' => '{{SITENAME}} ページ $1 ã‚’ $2 ãŒ{{GENDER:$2|変更ã—ã¾ã—ãŸ}}',
+'enotif_body_intro_deleted' => '{{SITENAME}}ã®ãƒšãƒ¼ã‚¸ã€Œ$1ã€ãŒ$PAGEEDITDATEã«ã€$2 ã«ã‚ˆã£ã¦{{GENDER:$2|削除}}ã•ã‚Œã¾ã—ãŸã€‚$3 ã‚’ã”覧ãã ã•ã„。',
+'enotif_body_intro_created' => '{{SITENAME}}ã®ãƒšãƒ¼ã‚¸ã€Œ$1ã€ãŒ$PAGEEDITDATEã«ã€$2 ã«ã‚ˆã£ã¦{{GENDER:$2|作æˆ}}ã•ã‚Œã¾ã—ãŸã€‚ç¾åœ¨ã®ç‰ˆã¯ $3 ã§é–²è¦§ã§ãã¾ã™ã€‚',
+'enotif_body_intro_moved' => '{{SITENAME}}ã®ãƒšãƒ¼ã‚¸ã€Œ$1ã€ãŒ$PAGEEDITDATEã«ã€$2 ã«ã‚ˆã£ã¦{{GENDER:$2|移動}}ã•ã‚Œã¾ã—ãŸã€‚ç¾åœ¨ã®ç‰ˆã¯ $3 ã§é–²è¦§ã§ãã¾ã™ã€‚',
+'enotif_body_intro_restored' => '{{SITENAME}}ã®ãƒšãƒ¼ã‚¸ã€Œ$1ã€ãŒ$PAGEEDITDATEã«ã€$2 ã«ã‚ˆã£ã¦{{GENDER:$2|復元}}ã•ã‚Œã¾ã—ãŸã€‚ç¾åœ¨ã®ç‰ˆã¯ $3 ã§é–²è¦§ã§ãã¾ã™ã€‚',
+'enotif_body_intro_changed' => '{{SITENAME}}ã®ãƒšãƒ¼ã‚¸ã€Œ$1ã€ãŒ$PAGEEDITDATEã«ã€$2 ã«ã‚ˆã£ã¦{{GENDER:$2|変更}}ã•ã‚Œã¾ã—ãŸã€‚ç¾åœ¨ã®ç‰ˆã¯ $3 ã§é–²è¦§ã§ãã¾ã™ã€‚',
'enotif_lastvisited' => '最終訪å•ä»¥é™ã®ã™ã¹ã¦ã®å¤‰æ›´ã¯ $1 ã‚’ã”覧ãã ã•ã„。',
'enotif_lastdiff' => 'ã“ã®å¤‰æ›´å†…容を表示ã™ã‚‹ã«ã¯ $1 ã‚’ã”覧ãã ã•ã„。',
'enotif_anon_editor' => '匿å利用者「$1ã€',
'enotif_body' => '$WATCHINGUSERNAMEã•ã‚“
-{{SITENAME}}ã®ãƒšãƒ¼ã‚¸ã€Œ$PAGETITLEã€ãŒ$PAGEEDITDATEã«ã€$PAGEEDITORã«ã‚ˆã£ã¦$CHANGEDORCREATEDã•ã‚Œã¾ã—ãŸã€‚ç¾åœ¨ã®ç‰ˆã‚’見るã«ã¯ $PAGETITLE_URL ã‚’ã”覧ãã ã•ã„。
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
編集内容ã®è¦ç´„: $PAGESUMMARY ($PAGEMINOREDIT)
@@ -2489,8 +2508,7 @@ $NEWPAGE
メール: $PAGEEDITOR_EMAIL
ウィキ: $PAGEEDITOR_WIKI
-ã“ã®ãƒšãƒ¼ã‚¸ã‚’訪れãªã„é™ã‚Šã€ã“れ以上ã®å¤‰æ›´ã«å¯¾ã™ã‚‹é€šçŸ¥ã¯é€ä¿¡ã•ã‚Œã¾ã›ã‚“。
-ウォッãƒãƒªã‚¹ãƒˆå†…ã®ã™ã¹ã¦ã®ãƒšãƒ¼ã‚¸ã«ã¤ã„ã¦ã€é€šçŸ¥ã‚’å†è¨­å®šã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ã“ã®ãƒšãƒ¼ã‚¸ã‚’訪れãªã„é™ã‚Šã€ã“れ以上ã®æ´»å‹•ã«å¯¾ã™ã‚‹é€šçŸ¥ã¯é€ä¿¡ã•ã‚Œã¾ã›ã‚“。ウォッãƒãƒªã‚¹ãƒˆå†…ã®ã™ã¹ã¦ã®ãƒšãƒ¼ã‚¸ã«ã¤ã„ã¦ã€é€šçŸ¥ã‚’å†è¨­å®šã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
{{SITENAME}}通知システム
@@ -2506,6 +2524,8 @@ $UNWATCHURL
ã”æ„見ã€ãŠå•ã„åˆã‚ã›:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => '作æˆ',
+'changed' => '変更',
# Delete
'deletepage' => 'ページを削除',
@@ -2579,6 +2599,8 @@ $2ã«ã‚ˆã‚‹ç›´å‰ã®ç‰ˆã¸å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚',
'prot_1movedto2' => '[[$1]] ã‚’ [[$2]] ã¸ç§»å‹•',
'protect-badnamespace-title' => 'ä¿è­·ä¸å¯èƒ½ãªåå‰ç©ºé–“',
'protect-badnamespace-text' => 'ã“ã®åå‰ç©ºé–“ã®ãƒšãƒ¼ã‚¸ã¯ä¿è­·ã§ãã¾ã›ã‚“。',
+'protect-norestrictiontypes-text' => '利用ã§ãる制é™ã®ç¨®é¡žãŒãªã„ãŸã‚ã€ã“ã®ãƒšãƒ¼ã‚¸ã¯ä¿è­·ã§ãã¾ã›ã‚“。',
+'protect-norestrictiontypes-title' => 'ä¿è­·ã§ããªã„ページ',
'protect-legend' => 'ä¿è­·ã®ç¢ºèª',
'protectcomment' => 'ç†ç”±:',
'protectexpiry' => '有効期é™:',
@@ -2598,6 +2620,7 @@ $2ã«ã‚ˆã‚‹ç›´å‰ã®ç‰ˆã¸å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚',
'protect-fallback' => '「$1ã€æ¨©é™ã‚’æŒã¤åˆ©ç”¨è€…ã®ã¿ã«è¨±å¯',
'protect-level-autoconfirmed' => '自動承èªã•ã‚ŒãŸåˆ©ç”¨è€…ã®ã¿ã«è¨±å¯',
'protect-level-sysop' => '管ç†è€…ã®ã¿ã«è¨±å¯',
+'protect-summary-desc' => '[$1=$2] ($3)',
'protect-summary-cascade' => 'カスケード',
'protect-expiring' => '$1(UTC)ã§è‡ªå‹•çš„ã«è§£é™¤',
'protect-expiring-local' => 'æœŸé™ $1',
@@ -2664,8 +2687,8 @@ $2ã«ã‚ˆã‚‹ç›´å‰ã®ç‰ˆã¸å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚',
'undeletedrevisions' => '{{PLURAL:$1|$1版}}を復元ã—ã¾ã—ãŸ',
'undeletedrevisions-files' => '{{PLURAL:$1|$1版}}ã¨{{PLURAL:$2|$2ファイル}}を復元ã—ã¾ã—ãŸ',
'undeletedfiles' => '{{PLURAL:$1|$1ファイル}}を復元ã—ã¾ã—ãŸ',
-'cannotundelete' => '復元ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
-ä»–ã®èª°ã‹ãŒã“ã®ãƒšãƒ¼ã‚¸ã‚’æ—¢ã«å¾©å…ƒã—ãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚',
+'cannotundelete' => '復元ã«å¤±æ•—ã—ã¾ã—ãŸ:
+$1',
'undeletedpage' => "'''$1を復元ã—ã¾ã—ãŸã€‚'''
最近ã®å‰Šé™¤ã¨å¾©å…ƒã®è¨˜éŒ²ã«ã¤ã„ã¦ã¯[[Special:Log/delete|削除記録]]ã‚’å‚ç…§ã—ã¦ãã ã•ã„。",
@@ -2697,7 +2720,7 @@ $1',
'blanknamespace' => '(標準)',
# Contributions
-'contributions' => '利用者ã®æŠ•ç¨¿è¨˜éŒ²',
+'contributions' => '{{GENDER:$1|利用者}}ã®æŠ•ç¨¿è¨˜éŒ²',
'contributions-title' => '$1ã®æŠ•ç¨¿è¨˜éŒ²',
'mycontris' => '投稿記録',
'contribsub2' => '利用者: $1 ($2)',
@@ -2976,6 +2999,7 @@ $1 ã®ãƒ–ロックã®ç†ç”±ã¯ã€Œ''$2''ã€ã§ã™ã€‚",
'immobile-target-namespace-iw' => 'ウィキ間リンクã¯ã€ãƒšãƒ¼ã‚¸ã®ç§»å‹•å…ˆã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“。',
'immobile-source-page' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¯ç§»å‹•ã§ãã¾ã›ã‚“。',
'immobile-target-page' => '指定ã—ãŸãƒšãƒ¼ã‚¸åã«ã¯ç§»å‹•ã§ãã¾ã›ã‚“。',
+'bad-target-model' => '指定ã—ãŸç§»å‹•å…ˆã§ã¯ã€ç•°ãªã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ モデルを使用ã—ã¦ã„ã¾ã™ã€‚$1ã‹ã‚‰$2ã«ã¯å¤‰æ›ã§ãã¾ã›ã‚“。',
'imagenocrossnamespace' => 'ファイルをã€ãƒ•ã‚¡ã‚¤ãƒ«åå‰ç©ºé–“以外ã«ç§»å‹•ã•ã›ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“',
'nonfile-cannot-move-to-file' => 'ファイル以外ã®ã‚‚ã®ã‚’ã€ãƒ•ã‚¡ã‚¤ãƒ«åå‰ç©ºé–“ã«ç§»å‹•ã•ã›ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“',
'imagetypemismatch' => 'æ–°ã—ã„ファイルã®æ‹¡å¼µå­ãŒãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¿ã‚¤ãƒ—ã¨ä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“',
@@ -3092,6 +3116,7 @@ MediaWiki 全般ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚º (地域化) ã«è²¢çŒ®ã—ãŸã„å ´åˆã¯ã€
'import-error-interwiki' => 'ページåãŒå¤–部リンク (ウィキ間リンク) ã«äºˆç´„ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ãƒšãƒ¼ã‚¸ã€Œ$1ã€ã‚’å–ã‚Šè¾¼ã¿ã¾ã›ã‚“ã§ã—ãŸã€‚',
'import-error-special' => 'ページ「$1ã€ã¯ã€ãƒšãƒ¼ã‚¸ãŒè¨±å¯ã•ã‚Œãªã„特別åå‰ç©ºé–“ã«å±žã—ã¦ã„ã‚‹ãŸã‚å–ã‚Šè¾¼ã¿ã¾ã›ã‚“。',
'import-error-invalid' => 'åå‰ãŒæ­£ã—ããªã„ãŸã‚ã€ãƒšãƒ¼ã‚¸ã€Œ$1ã€ã‚’å–ã‚Šè¾¼ã¿ã¾ã›ã‚“ã§ã—ãŸã€‚',
+'import-error-unserialize' => 'ページ「$1ã€ã®ç‰ˆ $2 ã¯ç›´åˆ—化復元ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã®ç‰ˆã¯ $4 ã¨ã—ã¦ç›´åˆ—化ã•ã‚ŒãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„モデル $3 を使用ã—ã¦ã„ã‚‹ã¨å ±å‘Šã•ã‚Œã¦ã„ã¾ã™ã€‚',
'import-options-wrong' => 'é–“é•ã£ãŸ{{PLURAL:$2|オプション}}ã§ã™: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => '入力ã—ãŸãƒ«ãƒ¼ãƒˆãƒšãƒ¼ã‚¸ã®åå‰ã¯ç„¡åŠ¹ã§ã™ã€‚',
'import-rootpage-nosubpage' => 'ルートページã®åå‰ç©ºé–“「$1ã€ã§ã¯ã€ä¸‹ä½ãƒšãƒ¼ã‚¸ãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
@@ -3106,7 +3131,6 @@ MediaWiki 全般ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚º (地域化) ã«è²¢çŒ®ã—ãŸã„å ´åˆã¯ã€
# JavaScriptTest
'javascripttest' => 'JavaScript をテスト中',
-'javascripttest-disabled' => 'ã“ã®æ©Ÿèƒ½ã¯ã“ã®ã‚¦ã‚£ã‚­ã§ã¯æœ‰åŠ¹ã«ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
'javascripttest-title' => '$1 ã®ãƒ†ã‚¹ãƒˆã®å®Ÿè¡Œ',
'javascripttest-pagetext-noframework' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¯ JavaScript ã®ãƒ†ã‚¹ãƒˆã‚’実行ã™ã‚‹ãŸã‚ã«äºˆç´„ã•ã‚Œã¦ã„ã¾ã™ã€‚',
'javascripttest-pagetext-unknownframework' => 'テストフレームワーク「$1ã€ã¯ä¸æ˜Žã§ã™ã€‚',
@@ -3256,11 +3280,13 @@ MediaWiki 全般ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚º (地域化) ã«è²¢çŒ®ã—ãŸã„å ´åˆã¯ã€
'pageinfo-default-sort' => '既定ã®ã‚½ãƒ¼ãƒˆã‚­ãƒ¼',
'pageinfo-length' => 'ページã®é•·ã• (ãƒã‚¤ãƒˆå˜ä½)',
'pageinfo-article-id' => 'ページ ID',
+'pageinfo-language' => 'ページ本文ã®è¨€èªž',
'pageinfo-robot-policy' => '検索エンジンã®çŠ¶æ…‹',
'pageinfo-robot-index' => '検索エンジンã«åŽé›†ã•ã‚Œã‚‹',
'pageinfo-robot-noindex' => '検索エンジンã«åŽé›†ã•ã‚Œãªã„',
'pageinfo-views' => '閲覧回数',
'pageinfo-watchers' => 'ページをウォッãƒãƒªã‚¹ãƒˆã«å…¥ã‚Œã¦ã„る人数',
+'pageinfo-few-watchers' => 'ウォッãƒã—ã¦ã„る利用者 $1 {{PLURAL:$1|人未満}}',
'pageinfo-redirects-name' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆæ•°',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'ã“ã®ãƒšãƒ¼ã‚¸ã®ä¸‹ä½ãƒšãƒ¼ã‚¸æ•°',
@@ -3276,6 +3302,19 @@ MediaWiki 全般ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚º (地域化) ã«è²¢çŒ®ã—ãŸã„å ´åˆã¯ã€
'pageinfo-magic-words' => 'マジック {{PLURAL:$1|ワード}} ($1)',
'pageinfo-hidden-categories' => 'éš ã—{{PLURAL:$1|カテゴリ}} ($1)',
'pageinfo-templates' => 'ã“ã®ãƒšãƒ¼ã‚¸ãŒå‚照読ã¿è¾¼ã¿ã—ã¦ã„ã‚‹{{PLURAL:$1|テンプレート}} ($1)',
+'pageinfo-transclusions' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’å‚照読ã¿è¾¼ã¿ã—ã¦ã„ã‚‹{{PLURAL:$1|ページ}} ($1)',
+'pageinfo-toolboxlink' => 'ページ情報',
+'pageinfo-redirectsto' => '転é€å…ˆ',
+'pageinfo-redirectsto-info' => '情報',
+'pageinfo-contentpage' => '本文ページã¨ã—ã¦æ•°ãˆã‚‹',
+'pageinfo-contentpage-yes' => 'ã¯ã„',
+'pageinfo-protect-cascading' => 'カスケードä¿è­·ã•ã‚Œã¦ã„ã‚‹',
+'pageinfo-protect-cascading-yes' => 'ã¯ã„',
+'pageinfo-protect-cascading-from' => 'カスケードä¿è­·ã®èµ·ç‚¹',
+'pageinfo-category-info' => 'カテゴリ情報',
+'pageinfo-category-pages' => 'ページ数',
+'pageinfo-category-subcats' => '下ä½ã‚«ãƒ†ã‚´ãƒªæ•°',
+'pageinfo-category-files' => 'ファイル数',
# Skin names
'skinname-standard' => 'クラシック',
@@ -3298,6 +3337,8 @@ MediaWiki 全般ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚º (地域化) ã«è²¢çŒ®ã—ãŸã„å ´åˆã¯ã€
'markedaspatrollederror' => '巡回済ã¿ã«ã§ãã¾ã›ã‚“',
'markedaspatrollederrortext' => '巡回済ã¿ã«ã™ã‚‹ã«ã¯ã€ç‰ˆã‚’指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'markedaspatrollederror-noautopatrol' => 'ã‚ãªãŸã«ã¯è‡ªåˆ†ã®ç·¨é›†ã‚’巡回済ã¿ã«ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。',
+'markedaspatrollednotify' => '$1 ã¸ã®ã“ã®å¤‰æ›´ã‚’巡回済ã¿ã«ã—ã¾ã—ãŸã€‚',
+'markedaspatrollederrornotify' => '巡回済ã¿ã«ã™ã‚‹ã®ã«å¤±æ•—ã—ã¾ã—ãŸã€‚',
# Patrol log
'patrol-log-page' => '巡回記録',
@@ -3332,6 +3373,7 @@ $1',
'file-nohires' => '高解åƒåº¦ç‰ˆã¯ã‚ã‚Šã¾ã›ã‚“。',
'svg-long-desc' => 'SVG ファイルã€$1 × $2 ピクセルã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º: $3',
'svg-long-desc-animated' => 'アニメーション SVG ファイルã€$1 × $2 ピクセルã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º: $3',
+'svg-long-error' => '無効㪠SVG ファイル: $1',
'show-big-image' => '高解åƒåº¦ã§ã®ç”»åƒ',
'show-big-image-preview' => 'ã“ã®ãƒ—レビューã®ã‚µã‚¤ã‚º: $1。',
'show-big-image-other' => 'ãã®ä»–ã®{{PLURAL:$2|解åƒåº¦}}: $1。',
@@ -3366,7 +3408,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 分}}',
'hours' => '{{PLURAL:$1|$1 時間}}',
'days' => '{{PLURAL:$1|$1 æ—¥}}',
+'months' => '{{PLURAL:$1|$1 ã‹æœˆ}}',
+'years' => '{{PLURAL:$1|$1 å¹´}}',
'ago' => '$1å‰',
+'just-now' => 'ã¡ã‚‡ã†ã©ä»Š',
# Bad image list
'bad_image_list' => '書å¼ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:
@@ -3923,6 +3968,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[ウィキ間ã®å‚照読ã¿è¾¼ã¿ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™]',
'scarytranscludefailed' => '[$1ã«å¯¾ã—ã¦ãƒ†ãƒ³ãƒ—レートã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ]',
+'scarytranscludefailed-httpstatus' => '[$1ã«å¯¾ã—ã¦ãƒ†ãƒ³ãƒ—レートã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ: HTTP $2]',
'scarytranscludetoolong' => '[URLãŒé•·ã™ãŽã¾ã™]',
# Delete conflict
@@ -4111,6 +4157,7 @@ $5
'version-license' => 'ライセンス',
'version-poweredby-credits' => "ã“ã®ã‚¦ã‚£ã‚­ã¯ã€'''[//www.mediawiki.org/ MediaWiki]'''(copyright © 2001-$1 $2)ã§å‹•ä½œã—ã¦ã„ã¾ã™ã€‚",
'version-poweredby-others' => 'ãã®ä»–',
+'version-credits-summary' => '[[Special:Version|MediaWiki]] ã«è²¢çŒ®ã—ãŸä»¥ä¸‹ã®äººãŸã¡ã«æ„Ÿè¬ã—ã¾ã™ã€‚',
'version-license-info' => 'MediaWikiã¯ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™ã€‚ã‚ãªãŸã¯ã€ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢è²¡å›£ã®ç™ºè¡Œã™ã‚‹GNU一般公衆利用許諾書 (GNU General Public License) (ãƒãƒ¼ã‚¸ãƒ§ãƒ³2ã€ã¾ãŸã¯ãれ以é™ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹) ã®è¦ç´„ã«åŸºã¥ãã€ã“ã®ãƒ©ã‚¤ãƒ–ラリをå†é…布ãŠã‚ˆã³æ”¹å¤‰ã§ãã¾ã™ã€‚
MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€å•†ç”¨ã‚ã‚‹ã„ã¯ç‰¹å®šã®ç›®çš„ã«é©ã™ã‚‹ã‹ã©ã†ã‹ã‚‚å«ã‚ã¦ã€æš—黙的ã«ã‚‚ã€ä¸€åˆ‡ä¿è¨¼ã•ã‚Œã¾ã›ã‚“。詳ã—ãã¯ã€GNU一般公衆利用許諾書をã”覧ãã ã•ã„。
@@ -4227,17 +4274,17 @@ MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€
'sqlite-no-fts' => '$1 (全文検索ãªã—)',
# New logging system
-'logentry-delete-delete' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’削除ã—ã¾ã—ãŸ',
-'logentry-delete-restore' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’復元ã—ã¾ã—ãŸ',
-'logentry-delete-event' => '$1 ãŒ$3ã®{{PLURAL:$5|記録項目$5件}}ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’変更ã—ã¾ã—ãŸï¼š$4',
-'logentry-delete-revision' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®{{PLURAL:$5|$5版}}ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’変更ã—ã¾ã—ãŸï¼š$4',
-'logentry-delete-event-legacy' => '$1 ãŒã€Œ$3ã€ã®è¨˜éŒ²é …ç›®ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’変更ã—ã¾ã—ãŸ',
-'logentry-delete-revision-legacy' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®ç‰ˆã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’変更ã—ã¾ã—ãŸ',
-'logentry-suppress-delete' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’隠蔽ã—ã¾ã—ãŸ',
-'logentry-suppress-event' => '$1 ãŒ$3ã®{{PLURAL:$5|記録項目$5件}}ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’見ãˆãªã„å½¢ã§å¤‰æ›´ã—ã¾ã—ãŸï¼š$4',
-'logentry-suppress-revision' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®{{PLURAL:$5|$5版}}ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’見ãˆãªã„å½¢ã§å¤‰æ›´ã—ã¾ã—ãŸï¼š$4',
-'logentry-suppress-event-legacy' => '$1 ãŒ$3ã§è¨˜éŒ²é …ç›®ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’見ãˆãªã„å½¢ã§å¤‰æ›´ã—ã¾ã—ãŸ',
-'logentry-suppress-revision-legacy' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®ç‰ˆã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’見ãˆãªã„å½¢ã§å¤‰æ›´ã—ã¾ã—ãŸ',
+'logentry-delete-delete' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’{{GENDER:$2|削除ã—ã¾ã—ãŸ}}',
+'logentry-delete-restore' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’{{GENDER:$2|復元ã—ã¾ã—ãŸ}}',
+'logentry-delete-event' => '$1 ãŒ$3ã®{{PLURAL:$5|記録項目$5件}}ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’{{GENDER:$2|変更ã—ã¾ã—ãŸ}}: $4',
+'logentry-delete-revision' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®{{PLURAL:$5|$5版}}ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’{{GENDER:$2|変更ã—ã¾ã—ãŸ}}: $4',
+'logentry-delete-event-legacy' => '$1 ãŒã€Œ$3ã€ã®è¨˜éŒ²é …ç›®ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’{{GENDER:$2|変更ã—ã¾ã—ãŸ}}',
+'logentry-delete-revision-legacy' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®ç‰ˆã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’{{GENDER:$2|変更ã—ã¾ã—ãŸ}}',
+'logentry-suppress-delete' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’{{GENDER:$2|隠蔽ã—ã¾ã—ãŸ}}',
+'logentry-suppress-event' => '$1 ãŒ$3ã®{{PLURAL:$5|記録項目$5件}}ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’見ãˆãªã„å½¢ã§{{GENDER:$2|変更ã—ã¾ã—ãŸ}}: $4',
+'logentry-suppress-revision' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®{{PLURAL:$5|$5版}}ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’見ãˆãªã„å½¢ã§{{GENDER:$2|変更ã—ã¾ã—ãŸ}}: $4',
+'logentry-suppress-event-legacy' => '$1 ãŒ$3ã§è¨˜éŒ²é …ç›®ã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’見ãˆãªã„å½¢ã§{{GENDER:$2|変更ã—ã¾ã—ãŸ}}',
+'logentry-suppress-revision-legacy' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®ç‰ˆã®é–²è¦§ãƒ¬ãƒ™ãƒ«ã‚’見ãˆãªã„å½¢ã§{{GENDER:$2|変更ã—ã¾ã—ãŸ}}',
'revdelete-content-hid' => '本文ã®ä¸å¯è¦–化',
'revdelete-summary-hid' => '編集è¦ç´„ã®ä¸å¯è¦–化',
'revdelete-uname-hid' => '利用者åã®ä¸å¯è¦–化',
@@ -4246,17 +4293,21 @@ MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€
'revdelete-uname-unhid' => '利用者åã®å¯è¦–化',
'revdelete-restricted' => '管ç†è€…ã«å¯¾ã™ã‚‹åˆ¶é™ã®é©ç”¨',
'revdelete-unrestricted' => '管ç†è€…ã«å¯¾ã™ã‚‹åˆ¶é™ã®é™¤åŽ»',
-'logentry-move-move' => '$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-patrol-patrol' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®ç‰ˆ $4 を巡回済ã¿ã¨ã—ã¾ã—ãŸ',
-'logentry-patrol-patrol-auto' => '$1 ãŒè‡ªå‹•çš„ã«ãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®ç‰ˆ $4 を巡回済ã¿ã¨ã—ã¾ã—ãŸ',
-'logentry-newusers-newusers' => '利用者アカウント $1 ãŒä½œæˆã•ã‚Œã¾ã—ãŸ',
-'logentry-newusers-create' => '利用者アカウント $1 ãŒä½œæˆã•ã‚Œã¾ã—ãŸ',
-'logentry-newusers-create2' => '利用者アカウント $3 ㌠$1 ã«ã‚ˆã‚Šä½œæˆã•ã‚Œã¾ã—ãŸ',
-'logentry-newusers-autocreate' => '利用者アカウント $1 ãŒè‡ªå‹•çš„ã«ä½œæˆã•ã‚Œã¾ã—ãŸ',
-'newuserlog-byemail' => 'パスワードをメールã§é€ä¿¡ã—ã¾ã—ãŸ',
+'logentry-move-move' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’「$4ã€ã«{{GENDER:$2|移動ã—ã¾ã—ãŸ}}',
+'logentry-move-move-noredirect' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’「$4ã€ã«ã€ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’残ã•ãšã«{{GENDER:$2|移動ã—ã¾ã—ãŸ}}',
+'logentry-move-move_redir' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’リダイレクトã®ã€Œ$4ã€ã«{{GENDER:$2|移動ã—ã¾ã—ãŸ}}',
+'logentry-move-move_redir-noredirect' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã‚’リダイレクトã®ã€Œ$4ã€ã«ã€ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’残ã•ãšã«{{GENDER:$2|移動ã—ã¾ã—ãŸ}}',
+'logentry-patrol-patrol' => '$1 ãŒãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®ç‰ˆ $4 を巡回済ã¿ã¨{{GENDER:$2|ã—ã¾ã—ãŸ}}',
+'logentry-patrol-patrol-auto' => '$1 ãŒè‡ªå‹•çš„ã«ãƒšãƒ¼ã‚¸ã€Œ$3ã€ã®ç‰ˆ $4 を巡回済ã¿ã¨{{GENDER:$2|ã—ã¾ã—ãŸ}}',
+'logentry-newusers-newusers' => '利用者アカウント $1 ãŒ{{GENDER:$2|作æˆã•ã‚Œã¾ã—ãŸ}}',
+'logentry-newusers-create' => '利用者アカウント $1 ãŒ{{GENDER:$2|作æˆã•ã‚Œã¾ã—ãŸ}}',
+'logentry-newusers-create2' => '利用者アカウント $3 ㌠$1 ã«ã‚ˆã‚Š{{GENDER:$2|作æˆã•ã‚Œã¾ã—ãŸ}}',
+'logentry-newusers-byemail' => '利用者アカウント $3 ㌠$1 ã«ã‚ˆã£ã¦{{GENDER:$2|作æˆã•ã‚Œ}}ã€ãã®ãƒ‘スワードãŒãƒ¡ãƒ¼ãƒ«ã§é€ä¿¡ã•ã‚Œã¾ã—ãŸ',
+'logentry-newusers-autocreate' => '利用者アカウント $1 ãŒè‡ªå‹•çš„ã«{{GENDER:$2|作æˆã•ã‚Œã¾ã—ãŸ}}',
+'logentry-rights-rights' => '$1 ㌠$3 ã®æ‰€å±žã‚°ãƒ«ãƒ¼ãƒ—ã‚’ $4 ã‹ã‚‰ $5 ã«{{GENDER:$2|変更ã—ã¾ã—ãŸ}}',
+'logentry-rights-rights-legacy' => '$1 ㌠$3 ã®æ‰€å±žã‚°ãƒ«ãƒ¼ãƒ—ã‚’{{GENDER:$2|変更ã—ã¾ã—ãŸ}}',
+'logentry-rights-autopromote' => '$1 ㌠$4 ã‹ã‚‰ $5 ã«è‡ªå‹•çš„ã«{{GENDER:$2|昇格ã—ã¾ã—ãŸ}}',
+'rightsnone' => '(ãªã—)',
# Feedback
'feedback-bugornote' => '技術的ãªå•é¡Œã®è©³ç´°ã‚’説明ã™ã‚‹æº–å‚™ãŒã§ãã¦ã„ã‚‹å ´åˆã¯ã€[$1 ãƒã‚°å ±å‘Š]ã‚’ãŠé¡˜ã„ã—ã¾ã™ã€‚
@@ -4310,6 +4361,7 @@ MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€
'api-error-ok-but-empty' => '内部エラー: サーãƒãƒ¼ã‹ã‚‰ã®å¿œç­”ãŒã‚ã‚Šã¾ã›ã‚“。',
'api-error-overwrite' => '既存ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ä¸Šæ›¸ãã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
'api-error-stashfailed' => '内部エラー: サーãƒãƒ¼ã¯ä¸€æ™‚ファイルを格ç´ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'api-error-publishfailed' => '内部エラー: サーãƒãƒ¼ã¯ä¸€æ™‚ファイルを発行ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
'api-error-timeout' => 'サーãƒãƒ¼ãŒæ±ºã‚られãŸæ™‚間内ã«å¿œç­”ã—ã¾ã›ã‚“ã§ã—ãŸã€‚',
'api-error-unclassified' => 'ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
'api-error-unknown-code' => 'ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼:「$1ã€',
@@ -4330,4 +4382,7 @@ MediaWikiã¯ã€æœ‰ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦é…布ã•ã‚Œã¦ã„ã¾ã™ãŒã€
'duration-centuries' => '$1 {{PLURAL:$1|世紀}}',
'duration-millennia' => '$1{{PLURAL:$1|,000 å¹´}}',
+# Image rotation
+'rotate-comment' => 'ç”»åƒã‚’時計回り㫠$1 {{PLURAL:$1|度}}回転',
+
);
diff --git a/languages/messages/MessagesJam.php b/languages/messages/MessagesJam.php
index 365920b9..a9ecb163 100644
--- a/languages/messages/MessagesJam.php
+++ b/languages/messages/MessagesJam.php
@@ -156,7 +156,6 @@ Lef aaf dif afta pofaamin ruolbak',
'qbbrowse' => 'Brouz',
'qbedit' => 'Edit',
'qbpageoptions' => 'Dis piej',
-'qbpageinfo' => 'Kantex',
'qbmyoptions' => 'Mi piejdem',
'qbspecialpages' => 'Peshal piejdem',
'faq' => 'FAK',
@@ -403,11 +402,8 @@ Di riizn dehn gi a "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Yu nou lag out.'''
-Yu kiahn kantiniu yuuz {{SITENAME}} ananimosli, ar yu kiahn [[Special:UserLogin|lag iin agen]] az di siem ar az difrant yuuza.
+Yu kiahn kantiniu yuuz {{SITENAME}} ananimosli, ar yu kiahn <span class='plainlinks'>[$1 lag iin agen]</span> az di siem ar az difrant yuuza.
Nuot se som piej maita kantiniu fi displie laik se yu stil log iin, antel yu klier yu brouza kiash.",
-'welcomecreation' => '== Welkom, $1! ==
-Yu akount don kriet.
-No figat fi chienj yu [[Special:Preferences|{{SITENAME}} prefransdem]].',
'yourname' => 'Yuuzaniem:',
'yourpassword' => 'Paaswod:',
'yourpasswordagain' => 'Ritaip paaswod:',
@@ -668,7 +664,6 @@ Yu de pramis wi alzwel se a yu rait dis yuself, ar kapi'i frahn a poblik domien
'template-protected' => '(protek)',
'template-semiprotected' => '(semi-protek)',
'hiddencategories' => 'Dis piej a memb a {{PLURAL:$1|1 idn kiatigari|$1 idn kiatigari}}:',
-'nocreatetitle' => 'Piej krieshan limit',
'permissionserrors' => 'Permishan herro',
'permissionserrorstext-withaction' => 'Yu no ab no poermishan fi $2, fi di falarin {{PLURAL:$1|riizn|riizndem}}:',
'edit-conflict' => 'Hedit kanflik: $1',
@@ -740,6 +735,9 @@ Chrai priifix yu kwieri wid ''all:'' fi saach aal kantent (inkluudn taak piej, t
'grouppage-sysop' => '{{ns:project}}:Adminischrieta',
+# Special:Log/newusers
+'newuserlogpage' => 'Yuuza krieshan lag',
+
# User rights log
'rightslog' => 'Yuuza raits lag',
@@ -830,9 +828,6 @@ Piej pahn [[Special:Watchlist|yu wachlis]] dem '''buol'''.",
# Special:LinkSearch
'linksearch' => 'Extoernal lingk',
-# Special:Log/newusers
-'newuserlogpage' => 'Yuuza krieshan lag',
-
# Special:ListGroupRights
'listgrouprights-members' => '(lis a memba)',
diff --git a/languages/messages/MessagesJut.php b/languages/messages/MessagesJut.php
index ecb39938..85cf804b 100644
--- a/languages/messages/MessagesJut.php
+++ b/languages/messages/MessagesJut.php
@@ -136,7 +136,6 @@ $messages = array(
'qbbrowse' => 'Gennemse',
'qbedit' => 'Redigær',
'qbpageoptions' => 'Endstellenger før side',
-'qbpageinfo' => "Informåsje side'm",
'qbmyoptions' => 'Miine endstellenger',
'qbspecialpages' => 'Sonst sider',
'faq' => 'VSF',
@@ -455,6 +454,10 @@ hersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre Ã
'grouppage-sysop' => '{{ns:project}}:Administråtorer',
+# Special:Log/newusers
+'newuserlogpage' => 'Brugeråprettelseslog',
+'newuserlogpagetext' => "Dett'er en log åver de senest åprettede brugere.",
+
# User rights log
'rightslog' => 'Rettigheds-logbÃ¥Ä',
@@ -606,10 +609,6 @@ hersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre Ã
'linksearch-line' => '$2 linker til $1',
'linksearch-error' => "Wildkårter må ken benyttes i'n stårt åf håstnavnet.",
-# Special:Log/newusers
-'newuserlogpage' => 'Brugeråprettelseslog',
-'newuserlogpagetext' => "Dett'er en log åver de senest åprettede brugere.",
-
# Email user
'emailuser' => 'E-mail til denne bruger',
@@ -854,7 +853,4 @@ Kun endholtet åf æ liste (lenjer startende ve *) bliver brugt. Den første hen
# Special:SpecialPages
'specialpages' => 'Sonst sider',
-# New logging system
-'newuserlog-byemail' => 'kodeort tilsend via e-mail',
-
);
diff --git a/languages/messages/MessagesJv.php b/languages/messages/MessagesJv.php
index c862c9a3..77ef44ab 100644
--- a/languages/messages/MessagesJv.php
+++ b/languages/messages/MessagesJv.php
@@ -186,6 +186,7 @@ $messages = array(
'newwindow' => '(buka ing jendhéla anyar)',
'cancel' => 'Batalna',
'moredotdotdot' => 'Liyané...',
+'morenotlisted' => 'Isih ana...',
'mypage' => 'Kaca',
'mytalk' => 'Wicara',
'anontalk' => 'Dhiskusi IP puniki',
@@ -197,7 +198,6 @@ $messages = array(
'qbbrowse' => 'Navigasi',
'qbedit' => 'Sunting',
'qbpageoptions' => 'Kaca iki',
-'qbpageinfo' => 'Kontèks kaca',
'qbmyoptions' => 'Opsiku',
'qbspecialpages' => 'Kaca-kaca astaméwa',
'faq' => 'FAQ (Pitakonan sing kerep diajokaké)',
@@ -220,6 +220,7 @@ $messages = array(
'namespaces' => 'Ruang jeneng',
'variants' => 'Varian',
+'navigation-heading' => 'Menu navigasi',
'errorpagetitle' => 'Kasalahan',
'returnto' => 'Bali menyang $1.',
'tagline' => 'Saka {{SITENAME}}',
@@ -450,12 +451,11 @@ Pangurus sing ngopèni kuwi ngawedharaké: "$3".',
# Login and logout pages
'logouttext' => "'''Sampéyan wis metu log'''
-Sampéyan bisa nganggo {{SITENAME}} sacara anonim, utawa bisa [[Special:UserLogin|mlebu log manèh]] kanthi jeneng panganggo sing padha utawa beda.
+Sampéyan bisa nganggo {{SITENAME}} sacara anonim, utawa bisa <span class='plainlinks'>[$1 mlebu log manèh]</span> kanthi jeneng panganggo sing padha utawa beda.
Cathet yèn sapérangan kaca mungkin isih nampilaké tulisan yèn Sampéyan isih nèng njero log, kuwi bisa ilang yèn Sampéyan ngresiki ''cache'' pramban Sampéyan.",
-'welcomecreation' => '== Sugeng rawuh, $1! ==
-
-Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] panjenengan.',
+'welcomeuser' => 'Sugeng Rawuh, $1!',
+'welcomecreation-msg' => 'Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] panjenengan.',
'yourname' => 'Asma pangangeman',
'yourpassword' => 'Tembung sandhi:',
'yourpasswordagain' => 'Balènana tembung sandhi',
@@ -478,7 +478,7 @@ Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|pr
'gotaccount' => "Wis kagungan akun? '''$1'''.",
'gotaccountlink' => 'Mlebu',
'userlogin-resetlink' => 'Lali rincian mlebu log Sampéyan?',
-'createaccountmail' => 'liwat layang e-mail',
+'createaccountmail' => 'Nganggoa sandi sembarang lan kirimna liwat layang e-mail ing ngisor iki',
'createaccountreason' => 'Alesan:',
'badretype' => 'Sandhi panjenengan ora gathuk',
'userexists' => 'Jeneng panganggo sing dilebokaké lagi dianggo.
@@ -541,6 +541,7 @@ Tulung nunggu dhisik sadurungé njajal manèh.',
# Email sending
'php-mail-error-unknown' => 'Kasalahan ora dingertèni nèng piguna mail() PHP.',
'user-mail-no-addy' => 'Njajal ngirim layang èlèktronik tanpa alamat layang èlèktronik.',
+'user-mail-no-body' => 'Nyoba ngirim layang e-mail, tapi isine kosong.',
# Change password dialog
'resetpass' => 'Ganti tembung sandi',
@@ -598,6 +599,7 @@ Tembung sandhi sawetara: $2',
'changeemail-oldemail' => 'Alamat layang èlèktronik saiki:',
'changeemail-newemail' => 'Alamat layang èlèktronik anyar:',
'changeemail-none' => '(ora ana)',
+'changeemail-password' => 'Sandi {{SITENAME}} panjenengan:',
'changeemail-submit' => 'Ganti layang èlèktronik',
'changeemail-cancel' => 'Batal',
@@ -765,7 +767,6 @@ Entri cathetan pungkasan disadiakake ing ngisor kanggo referensi:",
'template-semiprotected' => '(semi-pangreksan)',
'hiddencategories' => 'Kaca iki sawijining anggota saka {{PLURAL:$1|1 kategori ndelik|$1 kategori-kategori ndelik}}:',
'edittools' => '<!-- Tèks ing ngisor iki bakal ditudhuhaké ing ngisoring isènan suntingan lan pangemotan.-->',
-'nocreatetitle' => 'Panggawéan kaca anyar diwatesi',
'nocreatetext' => 'Situs iki ngwatesi kemampuan kanggo nggawé kaca anyar. Panjenengan bisa bali lan nyunting kaca sing wis ana, utawa mangga [[Special:UserLogin|mlebua log utawa ndaftar]]',
'nocreate-loggedin' => 'Panjenengan ora kagungan idin kanggo nggawé kaca anyar.',
'sectioneditnotsupported-title' => 'Panyuntingan bagéyan ora kasengkuyungan',
@@ -789,6 +790,15 @@ Katoné kaca iki wis dibusak.',
'edit-already-exists' => 'Ora bisa nggawé kaca anyar.
Amerga wis ana.',
'defaultmessagetext' => 'Tèks layang gawan',
+'content-failed-to-parse' => 'Gagal menjabarkan konten $2 untuk model $1: $3',
+'invalid-content-data' => 'Data konten ora sah',
+'content-not-allowed-here' => 'Konten "$1" ora oleh ing kaca [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'teks wiki',
+'content-model-text' => 'teks polos',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "Pènget: Kaca iki ngandhut kakèhan panggunan fungsi ''parser'' sing larang.
@@ -1148,9 +1158,9 @@ Pembalikan ora bisa dibatalaké.',
'prefs-emailconfirm-label' => 'Konfirmasi layang-e:',
'prefs-textboxsize' => 'Ukuran kothak suntingan',
'youremail' => 'Layang élèktronik (E-mail):',
-'username' => 'Asma panganggo:',
-'uid' => 'ID panganggo:',
-'prefs-memberingroups' => 'Anggota {{PLURAL:$1|klompok|klompok-klompok}}:',
+'username' => '{{GENDER:$1|Asma panganggo}}:',
+'uid' => '{{GENDER:$1|ID panganggo}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Anggota}} {{PLURAL:$1|klompok|klompok-klompok}}:',
'prefs-registration' => 'Wektu régistrasi:',
'yourrealname' => 'Asma sajatiné :',
'yourlanguage' => 'Basa sing dianggo:',
@@ -1300,12 +1310,13 @@ Alamat layang èlèktronik Sampéyan ora dituduhaké nalika wong liya ngubungi S
'right-sendemail' => 'Ngirim layang listrik (e-mail) menyang panganggo liya',
'right-passwordreset' => 'Delok layang èlèktronik panyetèlulangan tembung sandhi',
+# Special:Log/newusers
+'newuserlogpage' => 'Log panganggo anyar',
+'newuserlogpagetext' => 'Ing ngisor iki kapacak log pandaftaran panganggo anyar.',
+
# User rights log
'rightslog' => 'Log pangowahan hak aksès',
'rightslogtext' => 'Ing ngisor iki kapacak log pangowahan marang hak-hak panganggo.',
-'rightslogentry' => 'ngganti kaanggotan kelompok kanggo $1 saka $2 dadi $3',
-'rightslogentry-autopromote' => 'otomatis ditawakaké saka $2 nèng $3',
-'rightsnone' => '(ora ana)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'maca kaca iki',
@@ -1527,6 +1538,7 @@ Mangga kontak [[Special:ListUsers/sysop|pangurus]].',
'backend-fail-notsame' => 'Berkas nonidèntik wis ana nèng "$1".',
'backend-fail-invalidpath' => '"$1" dudu jurusan nyimpen sing sah.',
'backend-fail-delete' => 'Ora bisa mbusak berkas "$1".',
+'backend-fail-describe' => 'Gagal mengubah metadata untuk berkas "$1".',
'backend-fail-alreadyexists' => 'Berkas "$1" wis ana.',
'backend-fail-store' => 'Ora bisa nyèlèhaké berkas "$1" nèng "$2".',
'backend-fail-copy' => 'Ora bisa nyalin berkas "$1" nèng "$2".',
@@ -1763,6 +1775,12 @@ Priksanen dhisik pranala-pranala menyang cithakan iki sadurungé mbusak.',
Mungkin kuduné diubungaké nèng kaca sing luwih pantes.<br />
Kaca kaanggep kaca disambiguasi yèn kuwi nganggo templat sing kaubung saka [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Kaca-kaca mawa ubarampé',
+'pageswithprop-legend' => 'Kaca-kaca mawa ubarampé',
+'pageswithprop-text' => 'Kaca iki njlèntèhaké kaca-kaca sing nganggo ubarampé astamiwa.',
+'pageswithprop-prop' => 'Arané ubarampé:',
+'pageswithprop-submit' => 'Nuju',
+
'doubleredirects' => 'Pangalihan dobel',
'doubleredirectstext' => 'Kaca iki ngandhut daftar kaca sing ngalih ing kaca pangalihan liyané.
Saben baris ngandhut pranala menyang pangalihan kapisan lan kapindho, sarta tujuan saka pangalihan kapindho, sing biasané kaca tujuan sing "sajatiné", yakuwi pangalihan kapisan kuduné dialihaké menyang kaca tujuan iku.
@@ -1913,7 +1931,9 @@ Deleng uga [[Special:WantedCategories|kategori sing diperlokaké]].',
'linksearch-pat' => 'Pola panggolèkan:',
'linksearch-ns' => 'Bilik nama:',
'linksearch-ok' => 'Golèk',
-'linksearch-text' => "''Wildcards'' kaya ta \"*.wikipedia.org\" bisa dienggo.<br />Protokol sing disengkuyung: <code>\$1</code>",
+'linksearch-text' => 'Tanda bintang seperti "*.wikipedia.org" dapat digunakan.
+Perlu sedikitnya satu domain tingkat atas, misalnya "*.org".<br />
+{{PLURAL:$2|Protokol|Protokol}} yang didukung: <code>$1</code> (menggunakan http:// bila protokol tidak ditentukan)',
'linksearch-line' => '$1 disambung saka $2',
'linksearch-error' => "''Wildcards'' namung bisa dienggo ing bagéyan awal saka jeneng host.",
@@ -1932,10 +1952,6 @@ Deleng uga [[Special:WantedCategories|kategori sing diperlokaké]].',
'activeusers-hidesysops' => 'Delikna pangurus',
'activeusers-noresult' => 'Panganggo ora ditemokaké.',
-# Special:Log/newusers
-'newuserlogpage' => 'Log panganggo anyar',
-'newuserlogpagetext' => 'Ing ngisor iki kapacak log pandaftaran panganggo anyar.',
-
# Special:ListGroupRights
'listgrouprights' => 'Hak-hak grup panganggo',
'listgrouprights-summary' => 'Ing ngisor iki kapacak dhaftar grup panganggo sing didéfinisi ing wiki iki, kanthi hak-hak aksès gandhèngané.
@@ -2030,11 +2046,17 @@ Owah-owahan sing dumadi ing tembé ing kaca iku lan kaca dhiskusi sing kagandhè
'enotif_mailer' => 'Pangirim Notifikasi {{SITENAME}}',
'enotif_reset' => 'Tandhanana kabèh kaca sing wis ditiliki',
-'enotif_newpagetext' => 'Iki sawijining kaca anyar.',
'enotif_impersonal_salutation' => 'Panganggo {{SITENAME}}',
-'changed' => 'kaubah',
-'created' => 'kadamel',
-'enotif_subject' => 'Kaca $PAGETITLE ing {{SITENAME}} wis $CHANGEDORCREATED déning $PAGEEDITOR',
+'enotif_subject_deleted' => 'Halaman $1 di {{SITENAME}} telah dihapus oleh {{gender:$2|$2}}',
+'enotif_subject_created' => 'Halaman $1 di {{SITENAME}} telah dibuat oleh {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Halaman $1 di {{SITENAME}} telah dipindahkan oleh {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Halaman $1 di {{SITENAME}} telah dikembalikan oleh {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Halaman $1 di {{SITENAME}} telah diubah oleh {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Halaman $1 di {{SITENAME}} telah dihapus pada $PAGEEDITDATE oleh {{gender:$2|$2}}, lihat $3.',
+'enotif_body_intro_created' => 'Halaman $1 di {{SITENAME}} telah dibuat pada $PAGEEDITDATE oleh {{gender:$2|$2}}, lihat $3 untuk revisi terkini.',
+'enotif_body_intro_moved' => 'Halaman $1 di {{SITENAME}} telah dipindahkan pada $PAGEEDITDATE oleh {{gender:$2|$2}}, lihat $3 untuk revisi terkini.',
+'enotif_body_intro_restored' => 'Halaman $1 di {{SITENAME}} telah dikembalikan pada $PAGEEDITDATE oleh {{gender:$2|$2}}, lihat $3 untuk revisi terkini.',
+'enotif_body_intro_changed' => 'Halaman $1 di {{SITENAME}} telah diubah pada $PAGEEDITDATE oleh {{gender:$2|$2}}, lihat $3 untuk revisi terkini.',
'enotif_lastvisited' => 'Deleng $1 kanggo kabèh owah-owahan wiwit pungkasan panjenengan niliki.',
'enotif_lastdiff' => 'Tilikana $1 kanggo mirsani owah-owahan iki.',
'enotif_anon_editor' => 'panganggo anonim $1',
@@ -2060,6 +2082,8 @@ Kanggo ngowahi préferènsi ing daftar pangawasan panjenengan, mangga mirsani
Umpan balik lan pitulung sabanjuré:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'kadamel',
+'changed' => 'kaubah',
# Delete
'deletepage' => 'Busak kaca',
@@ -2127,6 +2151,8 @@ Delok [[Special:ProtectedPages|daptar kaca sing dijaga]] kanggo daptar panjagan
'prot_1movedto2' => '$1 dialihaké menyang $2',
'protect-badnamespace-title' => 'Bilik jeneng sing ora bisa dijagani',
'protect-badnamespace-text' => 'Kaca nèng bilik jeneng iki ora bisa dijagani.',
+'protect-norestrictiontypes-text' => 'Kaca iki ora isa diproteksi.',
+'protect-norestrictiontypes-title' => 'Kaca sing ora bisa diproteksi',
'protect-legend' => 'Konfirmasi pangreksan',
'protectcomment' => 'Alesan:',
'protectexpiry' => 'Kadaluwarsa:',
@@ -2212,7 +2238,7 @@ Panjenengan mbokmenawa ngetutaké pranala sing salah, utawa revisi iku wis dipul
'undeletedrevisions-files' => '$1 {{PLURAL:$1|révisi|révisi}} lan $2 berkas dibalèkaké',
'undeletedfiles' => '$1 {{PLURAL:$1|berkas|berkas}} dibalèkaké',
'cannotundelete' => 'Olèhé mbatalaké pambusakan gagal;
-mbokmenawa wis ana wong liya sing luwih dhisik nglakoni pambatalan.',
+$1',
'undeletedpage' => "'''$1 bisa dibalèkaké'''
Delengen [[Special:Log/delete|log pambusakan]] kanggo data pambusakan lan pambalèkan.",
@@ -2244,7 +2270,7 @@ $1',
'blanknamespace' => '(Utama)',
# Contributions
-'contributions' => 'Sumbangan panganggo',
+'contributions' => 'Sumbangan {{GENDER:$1|panganggo}}',
'contributions-title' => 'Kontribusi panganggo kanggo $1',
'mycontris' => 'Kontribusi',
'contribsub2' => 'Kanggo $1 ($2)',
@@ -2511,6 +2537,7 @@ Apa panjenengan kersa mbusak iku supaya kacané bisa dialihaké?',
'immobile-target-namespace-iw' => 'Pranala interwiki dudu target sing sah kanggo pamindhahan kaca.',
'immobile-source-page' => 'Kaca iki ora bisa dipindhahaké.',
'immobile-target-page' => 'Ora bisa mindhahaké menyang irah-irahan tujuan kasebut.',
+'bad-target-model' => 'Halaman yang dituju menggunakan model isi yang berbeda. Tidak dapat mengonversi $1 ke $2.',
'imagenocrossnamespace' => 'Ora bisa mindhahaké gambar menyang bilik nama non-gambar',
'nonfile-cannot-move-to-file' => 'Ora bisa mindhahaké non-berkas nèng bilik jeneng berkas',
'imagetypemismatch' => 'Èkstènsi anyar berkas ora cocog karo jenisé',
@@ -2622,6 +2649,7 @@ Simpen nèng komputer Sampéyan lan unggaha nèng kéné.',
'import-error-interwiki' => 'Kaca "$1" ora diimpor amarga jenengé dicadhangaké kango pranala njaba (interwiki).',
'import-error-special' => 'Kaca "$1" ora diimpor amarga kuwi kalebu nèng bilik jeneng kusus sing ora nglilakaké anané kaca.',
'import-error-invalid' => 'Kaca "$1" ora diimpor amarga jenengé ora sah.',
+'import-error-unserialize' => 'Revisi $2 dari halaman "$1" tidak dapat di-\'\'unserialized\'\'. Revisi tersebut dilaporkan menggunakan model konten $3 diserialisasi sebagai $4.',
'import-options-wrong' => '{{PLURAL:$2|Opsi|Opsi}} salah: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Halaman turunan yang diberikan adalah judul yang salah.',
'import-rootpage-nosubpage' => 'Ruang nama "$1" di halaman turunan tidak mengizinkan subhalaman.',
@@ -2636,7 +2664,6 @@ Simpen nèng komputer Sampéyan lan unggaha nèng kéné.',
# JavaScriptTest
'javascripttest' => 'Panjajalan JavaScript',
-'javascripttest-disabled' => 'Fungsi iki durung diurubaké nèng wiki iki.',
'javascripttest-title' => 'Nglakokaké pangujian $1',
'javascripttest-pagetext-noframework' => 'Kaca iki disadhiyakaké kanggo nglakokaké panjajalan JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Rangka kerja panjajalan ora dingertèni "$1".',
@@ -2750,11 +2777,13 @@ Mbokmanawa iki disebabaké anané pranala jaba sing klebu daftar ireng.',
'pageinfo-default-sort' => 'Kunci urut baku',
'pageinfo-length' => 'Panjang halaman (dalam bita)',
'pageinfo-article-id' => 'ID kaca',
+'pageinfo-language' => 'Bahasa isi halaman',
'pageinfo-robot-policy' => 'Status mesin pencari',
'pageinfo-robot-index' => 'Dapat diindeks',
'pageinfo-robot-noindex' => 'Tidak dapat diindeks',
'pageinfo-views' => 'Cacahing delokan',
'pageinfo-watchers' => 'Cacahé pangawas kaca',
+'pageinfo-few-watchers' => 'Kurang seka $1 {{PLURAL:$1|wong tilik|wong tilik}}',
'pageinfo-redirects-name' => 'Pengalihan ke halaman ini',
'pageinfo-subpages-name' => 'Subhalaman halaman ini',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|pengalihan|pengalihan}}; $3 {{PLURAL:$3|non-pengalihan|non-pengalihan}})',
@@ -2769,6 +2798,19 @@ Mbokmanawa iki disebabaké anané pranala jaba sing klebu daftar ireng.',
'pageinfo-magic-words' => '{{PLURAL:$1|Tembung|Tembung}} mujarab ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Katégori|Katégori}} kadhelikaké ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Templat|Templat}} yang ditransklusi ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Kaca|Kaca}} sing ditransklusi ing ($1)',
+'pageinfo-toolboxlink' => 'Informasi kaca',
+'pageinfo-redirectsto' => 'Dialihaké dhateng',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Diétung minangka satunggaling kaca isi',
+'pageinfo-contentpage-yes' => 'Iya',
+'pageinfo-protect-cascading' => 'Proteksi runtun',
+'pageinfo-protect-cascading-yes' => 'Iya',
+'pageinfo-protect-cascading-from' => 'Proteksi runtun saking',
+'pageinfo-category-info' => 'Informasi kategori',
+'pageinfo-category-pages' => 'Cacahing kaca',
+'pageinfo-category-subcats' => 'Jumlah subkategori',
+'pageinfo-category-files' => 'Cacahing gambar',
# Patrolling
'markaspatrolleddiff' => 'Tandhanana wis dipatroli',
@@ -2780,6 +2822,8 @@ Mbokmanawa iki disebabaké anané pranala jaba sing klebu daftar ireng.',
'markedaspatrollederror' => 'Ora bisa awèh tandha wis dipatroli',
'markedaspatrollederrortext' => 'Panjenengan kudu nentokaké sawijining révisi kanggo ditandhani minangka sing dipatroli.',
'markedaspatrollederror-noautopatrol' => 'Panjenengan ora pareng nandhani suntingan panjenengan dhéwé minangka dipatroli.',
+'markedaspatrollednotify' => 'Perubahan $1 telah dipatroli.',
+'markedaspatrollederrornotify' => 'Penanda patroli gagal dibuat.',
# Patrol log
'patrol-log-page' => 'Log patroli',
@@ -2813,6 +2857,7 @@ Yèn dilakokaké, sistem Sampéyan bisa kaserang.",
'file-nohires' => 'Ora ana résolusi sing luwih dhuwur.',
'svg-long-desc' => 'Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3',
'svg-long-desc-animated' => 'Berkas SVG, nominal $1 × $2 piksel, gedhené berkas: $3',
+'svg-long-error' => 'Berkas SVG ora sah: $1',
'show-big-image' => 'Résolusi kebak',
'show-big-image-preview' => 'Gedhéné pratayang iki: $1',
'show-big-image-other' => '{{PLURAL:$2|Résolusi|Résolusi}} liya: $1.',
@@ -2842,7 +2887,10 @@ Yèn dilakokaké, sistem Sampéyan bisa kaserang.",
'minutes' => '{{PLURAL:$1|$1 menit|$1 menit}}',
'hours' => '{{PLURAL:$1|$1 jam|$1 jam}}',
'days' => '{{PLURAL:$1|$1 dina|$1 dina}}',
+'months' => '{{PLURAL:$1|$1 sasi|$1 sasi}}',
+'years' => '{{PLURAL:$1|$1 taun|$1 taun}}',
'ago' => '$1 kapungkur',
+'just-now' => 'baru saja',
# Bad image list
'bad_image_list' => "Formaté kaya mengkéné:
@@ -3325,6 +3373,7 @@ Konfirmasi iki bakal kadaluwarsa ing $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Transklusi cithakan interwiki dipatèni]',
'scarytranscludefailed' => '[Olèhé njupuk cithakan $1 gagal]',
+'scarytranscludefailed-httpstatus' => '[Pengambilan templat $1 gagal: HTTP $2]',
'scarytranscludetoolong' => '[URL-é kedawan]',
# Delete conflict
@@ -3434,6 +3483,7 @@ Panjenengan uga bisa [[Special:EditWatchlist|nganggo éditor standar panjenengan
'version-license' => 'Lisènsi',
'version-poweredby-credits' => "Wiki iki disengkuyung déning '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
'version-poweredby-others' => 'liyané',
+'version-credits-summary' => 'Kami ingin mengakui orang-orang berikut atas kontribusinya terhadap [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki adalah perangkat lunak bebas; Anda diperbolehkan untuk mendistribusikan dan/atau memodfikasinya dengan persyaratan Lisensi Publik Umum GNU yang diterbitkan oleh Free Software Foundation; versi 2 atau terbaru.
MediaWiki didistribusikan dengan harapan dapat digunakan, tetapi TANPA JAMINAN APA PUN; tanpa jaminan PERDAGANGAN atau KECOCOKAN UNTUK TUJUAN TERTENTU. Lihat Lisensi Publik Umum GNU untuk informasi lebih lanjut.
@@ -3546,9 +3596,9 @@ Gambar dituduhaké mawa résolusi kebak lan tipe liyané berkas bakal dibuka lan
'sqlite-no-fts' => '$1 tanpa sengkuyungan golèkan tèks jangkep',
# New logging system
-'logentry-delete-delete' => '$1 mbusak kaca $3',
-'logentry-delete-restore' => '$1 mbalèkaké kaca $3',
-'logentry-delete-event' => '$1 ngganti patampilan {{PLURAL:$5|sak kadadéan log|$5 kadadéan log}} nèng $3: $4',
+'logentry-delete-delete' => '$1 {{GENDER:$2|mbusak}} kaca $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|mbalèkaké}} kaca $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|ngganti}} parupané {{PLURAL:$5|sak prastawa log|$5 prastawa log}} ana ing $3: $4',
'logentry-delete-revision' => '$1 ngganti patampilan {{PLURAL:$5|sak pambenahan|$5 pambenahan}} nèng kaca $3: $4',
'logentry-delete-event-legacy' => '$1 ngganti patampilan saka kadadéan log nèng $3',
'logentry-delete-revision-legacy' => '$1 ngganti patampilan saka pambenahan nèng kaca $3',
@@ -3569,13 +3619,17 @@ Gambar dituduhaké mawa résolusi kebak lan tipe liyané berkas bakal dibuka lan
'logentry-move-move-noredirect' => '$1 mindhahaké kaca $3 nèng $4 tanpa nginggalaké pangalihan',
'logentry-move-move_redir' => '$1 mindhahaké kaca $3 nèng $4 ngliwati pangalihan',
'logentry-move-move_redir-noredirect' => '$1 mindhahaké kaca $3 nèng $4 ngliwati pangalihan tanpa nginggalaké pangalihan',
-'logentry-patrol-patrol' => '$1 nandhai benahan $4 saka kaca $3 kaawasi',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|nengeri}} rèvisi $4 saka kaca $3 sing diawasi',
'logentry-patrol-patrol-auto' => '$1 otomatis nandhai benahan $4 saka kaca $3 kaawasai',
'logentry-newusers-newusers' => 'Akun panganggo $1 digawé',
'logentry-newusers-create' => 'Akun panganggo $1 digawé',
'logentry-newusers-create2' => 'Akun panganggo $3 digawé déning $1',
+'logentry-newusers-byemail' => 'Akun pengguna $3 dibuat oleh $1 dan kata sandi dikirim melalui e-mail',
'logentry-newusers-autocreate' => 'Akun $1 digawé otomatis',
-'newuserlog-byemail' => 'tembung sandhi wis dikirim liwat e-mail',
+'logentry-rights-rights' => 'ngganti kaanggotan kelompok kanggo $3 saka $4 dadi $5',
+'logentry-rights-rights-legacy' => '$1 mengubah keanggotaan grup $3',
+'logentry-rights-autopromote' => 'otomatis ditawakaké saka $4 nèng $5',
+'rightsnone' => '(ora ana)',
# Feedback
'feedback-bugornote' => 'Yèn Sampéyan siap njelasaké masalah tèhnis kanthi rinci mangga [$1 laporaké bug].
@@ -3629,6 +3683,7 @@ Utawa, Sampéyan bisa nganggo pormulir gampang ngisor. Tanggepan Sampéyan bakal
'api-error-ok-but-empty' => 'Kasalahan njero: Ora ana tanggepan saka sasana.',
'api-error-overwrite' => 'Nibani berkas sing wis ana ora dililakaké.',
'api-error-stashfailed' => 'Kasalahan njero: Sasana gagal nyèlèhaké berkas sawetara.',
+'api-error-publishfailed' => 'Kasalahan njero: Sasana gagal nyèlèhaké berkas sawetara.',
'api-error-timeout' => 'Sasana ora nanggepi nèng wektu sing karepaké.',
'api-error-unclassified' => 'Ana masalah sing ora dingertèni.',
'api-error-unknown-code' => 'Kasalahan ora dingertèni: "$1".',
@@ -3649,4 +3704,7 @@ Utawa, Sampéyan bisa nganggo pormulir gampang ngisor. Tanggepan Sampéyan bakal
'duration-centuries' => '$1 {{PLURAL:$1|abad|abad}}',
'duration-millennia' => '$1 {{PLURAL:$1|milénium|milénium}}',
+# Image rotation
+'rotate-comment' => 'Gambar diubengaké $1 {{PLURAL:$1|drajat|drajat}} sak arah domé jam',
+
);
diff --git a/languages/messages/MessagesKa.php b/languages/messages/MessagesKa.php
index d09d2e13..3b83c421 100644
--- a/languages/messages/MessagesKa.php
+++ b/languages/messages/MessagesKa.php
@@ -304,6 +304,7 @@ $messages = array(
'newwindow' => '(áƒáƒ®áƒáƒš ფáƒáƒœáƒ¯áƒáƒ áƒáƒ¨áƒ˜)',
'cancel' => 'გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
'moredotdotdot' => 'ვრცლáƒáƒ“...',
+'morenotlisted' => 'მეტი áƒáƒ  áƒáƒ áƒ˜áƒ¡ ნáƒáƒ©áƒ•áƒ”ნები...',
'mypage' => 'გვერდი',
'mytalk' => 'გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ',
'anontalk' => 'áƒáƒ› IP-ს გáƒáƒœáƒ®áƒ˜áƒšáƒ•áƒ',
@@ -315,7 +316,6 @@ $messages = array(
'qbbrowse' => 'გáƒáƒ“áƒáƒ®áƒ”დე',
'qbedit' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
'qbpageoptions' => 'ეს გვერდი',
-'qbpageinfo' => 'კáƒáƒœáƒ¢áƒ”ქსტი',
'qbmyoptions' => 'ჩემი გვერდები',
'qbspecialpages' => 'სპეციáƒáƒšáƒ£áƒ áƒ˜ გვერდები',
'faq' => 'ხშირი შეკითხვები',
@@ -338,6 +338,7 @@ $messages = array(
'namespaces' => 'სáƒáƒ®áƒ”ლთრსივრცე',
'variants' => 'ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ”ბი',
+'navigation-heading' => 'სáƒáƒœáƒáƒ•áƒ˜áƒ’áƒáƒªáƒ˜áƒ მენიუ',
'errorpagetitle' => 'შეცდáƒáƒ›áƒ',
'returnto' => 'დáƒáƒ‘რუნდი $1-ზე.',
'tagline' => '{{SITENAME}} გვერდიდáƒáƒœ',
@@ -585,10 +586,10 @@ $2',
'logouttext' => "'''თქვენ áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ სისტემიდáƒáƒœ გáƒáƒ¡áƒ£áƒšáƒ˜ ხáƒáƒ áƒ—.'''
შეგიძლიáƒáƒ— გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— {{SITENAME}} áƒáƒœáƒáƒœáƒ˜áƒ›áƒ£áƒ áƒáƒ“, áƒáƒœ შეგიძლიáƒáƒ—
-[[Special:UserLogin|შეხვიდეთ ისევ]] რáƒáƒ’áƒáƒ áƒª იგივე áƒáƒœ სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი.
+<span class='plainlinks'>[$1 შეხვიდეთ ისევ]</span> რáƒáƒ’áƒáƒ áƒª იგივე áƒáƒœ სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი.
შენიშნეთ, რáƒáƒ› ზáƒáƒ’იერთ გვერდზე შესáƒáƒ«áƒšáƒáƒ ისევ უჩვენებდეს რáƒáƒ› შესული ხáƒáƒ áƒ— სáƒáƒœáƒáƒ› თქვენი ბრáƒáƒ£áƒ–ერის მეხსიერებáƒáƒ¡ áƒáƒ  გáƒáƒ¬áƒ›áƒ”ნდთ.",
-'welcomecreation' => '== მáƒáƒ’ესáƒáƒšáƒ›áƒ”ბით, $1! ==
-თქვენი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ შექმნილიáƒ.
+'welcomeuser' => 'მáƒáƒ’ესáƒáƒšáƒ›áƒ”ბით, $1!',
+'welcomecreation-msg' => 'თქვენი áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ შექმნილიáƒ.
áƒáƒ  დáƒáƒ’áƒáƒ•áƒ˜áƒ¬áƒ§áƒ“ეთ თქვენი [[Special:Preferences|{{SITENAME}}-ის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡]] შეცვლáƒ.',
'yourname' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი:',
'yourpassword' => 'პáƒáƒ áƒáƒšáƒ˜:',
@@ -612,7 +613,7 @@ $2',
'gotaccount' => "უკვე რეგისტრირებული ხáƒáƒ áƒ—? '''$1'''",
'gotaccountlink' => 'შესვლáƒ',
'userlogin-resetlink' => 'áƒáƒ•áƒ¢áƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მები დáƒáƒ’áƒáƒ•áƒ˜áƒ¬áƒ§áƒ“áƒáƒ—?',
-'createaccountmail' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ—',
+'createaccountmail' => 'გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ შემთხვევითáƒáƒ‘ის მეთáƒáƒ“ით შერჩეული დრáƒáƒ”ბითი პáƒáƒ áƒáƒšáƒ˜ დრმისი გáƒáƒ’ზáƒáƒ•áƒœáƒ ქვემáƒáƒ— მითითებულ ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ზე:',
'createaccountreason' => 'მიზეზი:',
'badretype' => 'თქვენს მიერ შეყვáƒáƒœáƒ˜áƒšáƒ˜ პáƒáƒ áƒáƒšáƒ”ბი ერთმáƒáƒœáƒ”თს áƒáƒ  ემთხვევáƒ.',
'userexists' => 'ეს სáƒáƒ®áƒ”ლი უკვე გáƒáƒ›áƒáƒ§áƒ”ნებულიáƒ.
@@ -687,6 +688,7 @@ $2',
# Email sending
'php-mail-error-unknown' => 'áƒáƒ›áƒáƒ£áƒªáƒœáƒáƒ‘ი შეცდáƒáƒ›áƒ PHP-ის mail() ფუნქციáƒáƒ¨áƒ˜',
'user-mail-no-addy' => 'ცდილáƒáƒ‘დრელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒáƒ¡ ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის გáƒáƒ áƒ”შე.',
+'user-mail-no-body' => 'ცდილáƒáƒ‘დრცáƒáƒ áƒ˜áƒ”ლი áƒáƒœ უáƒáƒ–რáƒáƒ“ მáƒáƒ™áƒšáƒ” შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ელექტრáƒáƒœáƒ£áƒšáƒ˜ წერილის გáƒáƒ’ზáƒáƒ•áƒœáƒáƒ¡.',
# Change password dialog
'resetpass' => 'შეცვáƒáƒšáƒ”თ პáƒáƒ áƒáƒšáƒ˜',
@@ -754,6 +756,7 @@ $2
'changeemail-oldemail' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელი მისáƒáƒ›áƒáƒ áƒ—ი:',
'changeemail-newemail' => 'áƒáƒ®áƒáƒšáƒ˜ ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი:',
'changeemail-none' => '(áƒáƒ áƒáƒ¤áƒ”რი)',
+'changeemail-password' => 'თქვენი პáƒáƒ áƒáƒšáƒ˜ პრáƒáƒ”ქტში {{SITENAME}}:',
'changeemail-submit' => 'ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ შეცვლáƒ',
'changeemail-cancel' => 'გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ',
@@ -936,7 +939,6 @@ $2
'hiddencategories' => 'ეს გვერდი გáƒáƒ”რთიáƒáƒœáƒ”ბულირ$1 დáƒáƒ›áƒáƒšáƒ£áƒš კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒáƒ¨áƒ˜.',
'edittools' => '<!-- áƒáƒ¥ გáƒáƒœáƒ—áƒáƒ•áƒ¡áƒ”ბული ტექსტი ნáƒáƒ©áƒ•áƒ”ნები იქნებრრედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბისრდრáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის ფáƒáƒ áƒ›áƒ”ბის ქვეშ. -->',
'edittools-upload' => '-',
-'nocreatetitle' => 'გვერდის შექმნრლიმიტირებულიáƒ',
'nocreatetext' => 'áƒáƒ› გვერდზე შეუძლებელირáƒáƒ®áƒáƒšáƒ˜ გვერდის შექმნრáƒáƒ áƒ¡áƒ”ბული áƒáƒ™áƒ áƒ«áƒáƒšáƒ•áƒ˜áƒ¡ გáƒáƒ›áƒ. თქვენ შეგიძლიáƒáƒ— უკáƒáƒœ დáƒáƒ‘რუნებრდრáƒáƒ áƒ¡áƒ”ბული გვერდის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრáƒáƒœ [[სპეციáƒáƒšáƒ£áƒ áƒ˜:Userlogin|შესვლრდრáƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ შექმნáƒ]]',
'nocreate-loggedin' => 'თქვენ áƒáƒ  გáƒáƒ¥áƒ•áƒ— áƒáƒ®áƒáƒšáƒ˜ გვერდების შექმნის უფლებáƒ.',
'sectioneditnotsupported-title' => 'სექციის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბრვერ ხერხდებáƒ',
@@ -960,6 +962,15 @@ $2
'edit-already-exists' => 'áƒáƒ®áƒáƒšáƒ˜ გვერდის შექმნრáƒáƒ  მáƒáƒ®áƒ”რხდáƒ.
ის უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს.',
'defaultmessagetext' => 'შეტყáƒáƒ‘ინების სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ ტექსტი',
+'content-failed-to-parse' => '$2-ის შინáƒáƒáƒ áƒ¡áƒ˜ áƒáƒ  შეესáƒáƒ‘áƒáƒ›áƒ”ბრ$1-ის ტიპს: $3.',
+'invalid-content-data' => 'დáƒáƒ£áƒ¨áƒ•áƒ”ბელი მáƒáƒœáƒáƒªáƒ”მები',
+'content-not-allowed-here' => '„$1“-ის შინáƒáƒáƒ áƒ¡áƒ˜ დáƒáƒ£áƒ¨áƒ•áƒ”ბელირ[[$2]] გვერდზე',
+
+# Content models
+'content-model-wikitext' => 'ვიკიტექსტი',
+'content-model-text' => 'უბრáƒáƒšáƒ ტექსტი',
+'content-model-javascript' => 'ჯáƒáƒ•áƒáƒ¡áƒ™áƒ áƒ˜áƒžáƒ¢áƒ˜',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'ყურáƒáƒ“ღებáƒ. მáƒáƒªáƒ”მული გვერდი შეიცáƒáƒ•áƒ¡ ძáƒáƒšáƒ˜áƒáƒœ ბევრ მძიმე ფუნქციáƒáƒ¡.
@@ -1323,9 +1334,9 @@ $1",
'prefs-emailconfirm-label' => 'ელ–ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ:',
'prefs-textboxsize' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ზáƒáƒ›áƒ',
'youremail' => 'ელექტრáƒáƒœáƒ£áƒšáƒ˜ ფáƒáƒ¡áƒ¢áƒ:',
-'username' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი:',
-'uid' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის იდენტიფიკáƒáƒªáƒ˜áƒ:',
-'prefs-memberingroups' => '{{PLURAL:$1|ჯგუფის|ჯგუფების}} წევრი:',
+'username' => '{{GENDER:$1|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი}}:',
+'uid' => '{{GENDER:$1|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის}} იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜:',
+'prefs-memberingroups' => '{{PLURAL:$1|ჯგუფის|ჯგუფების}} {{GENDER:$2|წევრი}}:',
'prefs-memberingroups-type' => '$1',
'prefs-registration' => 'რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ თáƒáƒ áƒ˜áƒ¦áƒ˜',
'prefs-registration-date-time' => '$1',
@@ -1378,6 +1389,7 @@ $1",
'saveusergroups' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრჯგუფების შენáƒáƒ®áƒ•áƒ',
'userrights-groupsmember' => 'ჯგუფის წევრი:',
'userrights-groupsmember-auto' => 'ნáƒáƒ’ულისხმევი წევრი:',
+'userrights-groupsmember-type' => '$1',
'userrights-groups-help' => 'თქვენ შეგიძლიáƒáƒ— შეცვáƒáƒšáƒáƒ— ჯგუფები, რáƒáƒ›áƒ”ლშიც შედის ეს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი.
* თუ ჯგუფის სáƒáƒ®áƒ”ლწáƒáƒ“ებáƒáƒ¡áƒ—áƒáƒœ გáƒáƒ™áƒ”თებულირნიშნული, ე.ი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი შედის áƒáƒ› ჯგუფში.
* თუ ნიშნული áƒáƒ  áƒáƒ áƒ˜áƒ¡ – მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ  გáƒáƒœáƒ”კუთვნებრáƒáƒ áƒ¡áƒ”ბულ ჯგუფს.
@@ -1477,12 +1489,13 @@ $1",
'right-sendemail' => 'გáƒáƒ’უგზáƒáƒ•áƒœáƒ” ელექტრáƒáƒœáƒ£áƒšáƒ˜ ფáƒáƒ¡áƒ¢áƒ სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს',
'right-passwordreset' => 'ელ.ფáƒáƒ¡áƒ¢áƒ˜áƒ¡ ნáƒáƒ®áƒ•áƒ პáƒáƒ áƒáƒšáƒ˜áƒ¡ შეცვლით',
+# Special:Log/newusers
+'newuserlogpage' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ ჟურნáƒáƒšáƒ˜',
+'newuserlogpagetext' => 'ბáƒáƒšáƒ დრáƒáƒ¡ დáƒáƒ áƒ”გისტრირებულ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრსიáƒ',
+
# User rights log
'rightslog' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებების ჟურნáƒáƒšáƒ˜',
'rightslogtext' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრუფლებების ცვლილებáƒáƒ—რჟურბáƒáƒšáƒ˜',
-'rightslogentry' => 'შესწáƒáƒ áƒ“რმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ჯგუფები $1 $2-დáƒáƒœ $3-ზე',
-'rightslogentry-autopromote' => 'áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ იქნრგáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜ $2–დáƒáƒœ $3–ში',
-'rightsnone' => '(áƒáƒ áƒªáƒ”რთი)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'áƒáƒ› გვერდის კითხვáƒ',
@@ -1709,6 +1722,7 @@ $1',
'backend-fail-notsame' => 'უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს ფáƒáƒ˜áƒšáƒ˜ $1, რáƒáƒ›áƒ”ლიც áƒáƒ áƒáƒ იდენტური.',
'backend-fail-invalidpath' => '$1 áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს შენáƒáƒ®áƒ•áƒ˜áƒ¡ ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ› გზáƒáƒ¡.',
'backend-fail-delete' => 'ფáƒáƒ˜áƒšáƒ˜ $1-ის წáƒáƒ¨áƒšáƒ ვერ მáƒáƒ®áƒ”რხდáƒ.',
+'backend-fail-describe' => 'შეუძლებელირმეტáƒáƒ›áƒáƒœáƒáƒªáƒ”მების შეცვლრფáƒáƒ˜áƒšáƒ˜áƒ¡áƒáƒ—ვის „$1“',
'backend-fail-alreadyexists' => 'ფáƒáƒ˜áƒšáƒ˜ $1 უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს.',
'backend-fail-store' => 'ფáƒáƒ˜áƒšáƒ˜ $1-ის შენáƒáƒ®áƒ•áƒ $2-ზე ვერ მáƒáƒ®áƒ”რხდáƒ.',
'backend-fail-copy' => 'ფáƒáƒ˜áƒšáƒ˜ $1-ის კáƒáƒžáƒ˜áƒ áƒ”ბრ$2-ში ვერ მáƒáƒ®áƒ”რხდáƒ.',
@@ -1946,6 +1960,12 @@ $1',
áƒáƒ›áƒ˜áƒ¡ ნáƒáƒªáƒ•áƒšáƒáƒ“, სáƒáƒ•áƒáƒ áƒáƒ£áƒ“áƒáƒ“, ისისნი უნდრმიუთითებდნენ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡ კáƒáƒœáƒ™áƒ áƒ”ტულ სტáƒáƒ¢áƒ˜áƒáƒ–ე.<br />
გვერდი ითვლებრმრáƒáƒ•áƒáƒ›áƒœáƒ˜áƒ¨áƒ•áƒœáƒ”ლáƒáƒ•áƒœáƒáƒ“, თუ მáƒáƒ¡áƒ¨áƒ˜ გáƒáƒœáƒ—áƒáƒ•áƒ¡áƒ”ბულირთáƒáƒ áƒ’ი, რáƒáƒ›áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლიც მითითებულირგვერდზე [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'გვერდები გáƒáƒœáƒ¡áƒáƒ–ღვრული თვისებით',
+'pageswithprop-legend' => 'გვერდები გáƒáƒœáƒ¡áƒáƒ–ღვრული თვისებით',
+'pageswithprop-text' => 'áƒáƒ¥ მáƒáƒªáƒ”მულირგვერდები, რáƒáƒ›áƒ”ლთáƒáƒª ხელით გáƒáƒœáƒ”სáƒáƒ–ღვრáƒáƒ— გáƒáƒ áƒ™áƒ•áƒ”ული თვისებები.',
+'pageswithprop-prop' => 'თვისების სáƒáƒ®áƒ”ლი:',
+'pageswithprop-submit' => 'მიდი',
+
'doubleredirects' => 'áƒáƒ áƒ›áƒáƒ’ი გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒ',
'doubleredirectstext' => 'áƒáƒ› გვერდზე ჩáƒáƒ›áƒáƒ—ვლილირგვერდები, რáƒáƒ›áƒšáƒ”ბიც გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებულირსხვრგáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ების გვერდებზე.
ყáƒáƒ•áƒ”ლი მწკრივი შეიცáƒáƒ•áƒ¡ ბმულებს პირველ დრმეáƒáƒ áƒ” გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒáƒ–ე, áƒáƒ’რეთვე მეáƒáƒ áƒ” გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ების ტექსტის პირველ სტრიქáƒáƒœáƒ¡, რáƒáƒ›áƒ”ლშიც ჩვეულებრივ მითითებულირრეáƒáƒšáƒ£áƒ áƒ˜ „სáƒáƒ›áƒ˜áƒ–ნე“ გვერდის სáƒáƒ—áƒáƒ£áƒ áƒ˜. სáƒáƒ­áƒ˜áƒ áƒáƒ, რáƒáƒ› პირველი გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒáƒª უთითებდეს áƒáƒ› გვერდზე.
@@ -2101,7 +2121,7 @@ $1',
'linksearch-ok' => 'ძიებáƒ',
'linksearch-text' => 'შესáƒáƒ«áƒšáƒ”ბელირგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— ქვეხáƒáƒ–áƒáƒ•áƒáƒœáƒ˜ სიმბáƒáƒšáƒáƒ”ბი, მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, "*.wikipedia.org".
უკიდურეს შემთხვევáƒáƒ¨áƒ˜ სáƒáƒ­áƒ˜áƒ áƒáƒ ზედრდáƒáƒœáƒ˜áƒ¡ დáƒáƒ›áƒ”ნი, მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“ "*.org"<br />
-მხáƒáƒ áƒ“áƒáƒ›áƒ­áƒ”რი პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ”ბი: <code>$1</code> (სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒáƒ“ http:// თუკი პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜ áƒáƒ  áƒáƒ áƒ˜áƒ¡ მითითებული)',
+მხáƒáƒ áƒ“áƒáƒ›áƒ­áƒ”რი {{PLURAL:$2|პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜|პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ”ბი}}: <code>$1</code> (სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒáƒ“ http:// თუკი პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜ áƒáƒ  áƒáƒ áƒ˜áƒ¡ მითითებული)',
'linksearch-line' => 'ბმულები $1-ზე $2-დáƒáƒœ',
'linksearch-error' => 'წáƒáƒ áƒ›áƒáƒ“გენილი სიმბáƒáƒšáƒáƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრშესáƒáƒ«áƒšáƒ”ბელირმხáƒáƒšáƒáƒ“ მისáƒáƒ›áƒáƒ áƒ—ის დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ¨áƒ˜.',
@@ -2120,10 +2140,6 @@ $1',
'activeusers-hidesysops' => 'áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ”ბის დáƒáƒ›áƒáƒšáƒ•áƒ',
'activeusers-noresult' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლები áƒáƒ  áƒáƒ áƒ˜áƒáƒœ ნáƒáƒžáƒáƒ•áƒœáƒ˜.',
-# Special:Log/newusers
-'newuserlogpage' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ ჟურნáƒáƒšáƒ˜',
-'newuserlogpagetext' => 'ბáƒáƒšáƒ დრáƒáƒ¡ დáƒáƒ áƒ”გისტრირებულ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრსიáƒ',
-
# Special:ListGroupRights
'listgrouprights' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრჯგუფების უფლებები',
'listgrouprights-summary' => 'ქვემáƒáƒ— წáƒáƒ áƒ›áƒáƒ“გენილირáƒáƒ› ვიკიში გáƒáƒ áƒ™áƒ•áƒ”ულ ჯგუფთრსირდრმáƒáƒ—ი უფლებები.
@@ -2222,19 +2238,23 @@ $1',
'enotif_mailer' => '{{SITENAME}}. ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ— შეტყáƒáƒ‘ინების სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ˜',
'enotif_reset' => 'áƒáƒ¦áƒœáƒ˜áƒ¨áƒœáƒ” ყველრგვერდი, რáƒáƒ’áƒáƒ áƒª გáƒáƒ“áƒáƒ¡áƒ˜áƒœáƒ¯áƒ£áƒšáƒ˜',
-'enotif_newpagetext' => 'ეს áƒáƒ áƒ˜áƒ¡ áƒáƒ®áƒáƒšáƒ˜ გვერდი.',
'enotif_impersonal_salutation' => 'ვიკიპედიის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი',
-'changed' => 'შეცვლილი',
-'created' => 'შექმნილიáƒ',
-'enotif_subject' => '{{SITENAME}}: გვერდი $PAGETITLE $CHANGEDORCREATED იქნრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის $PAGEEDITOR მიერ',
+'enotif_subject_deleted' => 'გვერდი პრáƒáƒ”ქტიდáƒáƒœ „{{SITENAME}}“ სáƒáƒ®áƒ”ლწáƒáƒ“ებით „$1“ წáƒáƒ¨áƒáƒšáƒ {{gender:$2|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმáƒ}} $2',
+'enotif_subject_created' => 'გვერდი პრáƒáƒ”ქტიდáƒáƒœ „{{SITENAME}}“ სáƒáƒ®áƒ”ლწáƒáƒ“ებით „$1“ შექმნრ{{gender:$2|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმáƒ}} $2',
+'enotif_subject_moved' => 'გვერდი პრáƒáƒ”ქტიდáƒáƒœ „{{SITENAME}}“ სáƒáƒ®áƒ”ლწáƒáƒ“ებით „$1“ გáƒáƒ“áƒáƒ˜áƒ¢áƒáƒœáƒ {{gender:$2|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმáƒ}} $2',
+'enotif_subject_restored' => 'გვერდი პრáƒáƒ”ქტიდáƒáƒœ „{{SITENAME}}“ სáƒáƒ®áƒ”ლწáƒáƒ“ებით „$1“ áƒáƒ¦áƒáƒ“გინრ{{gender:$2|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმáƒ}} $2',
+'enotif_subject_changed' => 'გვერდი პრáƒáƒ”ქტიდáƒáƒœ „{{SITENAME}}“ სáƒáƒ®áƒ”ლწáƒáƒ“ებით „$1“ შეცვáƒáƒšáƒ {{gender:$2|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმáƒ}} $2',
+'enotif_body_intro_deleted' => '$PAGEEDITDATE {{gender:$2|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმáƒ}} $2 წáƒáƒ¨áƒáƒšáƒ გვერდი პრáƒáƒ”ქტიდáƒáƒœ „{{SITENAME}}“ სáƒáƒ®áƒ”ლწáƒáƒ“ებით „$1“, იხილეთ $3.',
+'enotif_body_intro_created' => '$PAGEEDITDATE {{gender:$2|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმáƒ}} $2 შექმნრგვერდი პრáƒáƒ”ქტიდáƒáƒœ „{{SITENAME}}“ სáƒáƒ®áƒ”ლწáƒáƒ“ებით „$1“, მიმდინáƒáƒ áƒ” ვერსირიხილიეთ ბმულზე: $3',
+'enotif_body_intro_moved' => '$PAGEEDITDATE {{gender:$2|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმáƒ}} $2 გáƒáƒ“áƒáƒ˜áƒ¢áƒáƒœáƒ გვერდი პრáƒáƒ”ქტიდáƒáƒœ „{{SITENAME}}“ სáƒáƒ®áƒ”ლწáƒáƒ“ებით „$1“, მიმდინáƒáƒ áƒ” ვერსირიხილიეთ ბმულზე: $3',
+'enotif_body_intro_restored' => '$PAGEEDITDATE {{gender:$2|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმáƒ}} $2 áƒáƒ¦áƒáƒ“გინრგვერდი პრáƒáƒ”ქტიდáƒáƒœ „{{SITENAME}}“ სáƒáƒ®áƒ”ლწáƒáƒ“ებით „$1“, მიმდინáƒáƒ áƒ” ვერსირიხილიეთ ბმულზე: $3',
+'enotif_body_intro_changed' => '$PAGEEDITDATE {{gender:$2|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმáƒ}} $2 შეცვáƒáƒšáƒ გვერდი პრáƒáƒ”ქტიდáƒáƒœ „{{SITENAME}}“ სáƒáƒ®áƒ”ლწáƒáƒ“ებით „$1“, მიმდინáƒáƒ áƒ” ვერსირიხილიეთ ბმულზე: $3',
'enotif_lastvisited' => 'იხ. $1 ყველრცვლილებისთვის თქვენი ბáƒáƒšáƒ შემáƒáƒ¡áƒ•áƒšáƒ˜áƒ¡ შემდეგ.',
'enotif_lastdiff' => 'იხილეთ $1 áƒáƒ› ცვლილების სáƒáƒœáƒáƒ®áƒáƒ•áƒáƒ“.',
'enotif_anon_editor' => 'áƒáƒœáƒáƒœáƒ˜áƒ›áƒ£áƒ áƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი $1',
-'enotif_body' => 'პáƒáƒ¢áƒ˜áƒ•áƒªáƒ”მულრ$WATCHINGUSERNAME,
+'enotif_body' => 'ძვირფáƒáƒ¡áƒ $WATCHINGUSERNAME,
-პრáƒáƒ”ქტ "{{SITENAME}}"-ის გვერდი $PAGETITLE შეიცვáƒáƒšáƒ $CHANGEDORCREATED $PAGEEDITDATE მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელ $PAGEEDITOR-ის მიერ, მინდინáƒáƒ áƒ” ვერსიის სáƒáƒœáƒáƒ®áƒáƒ•áƒáƒ“ იხილეთ $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
ცვლილების მáƒáƒ™áƒšáƒ” áƒáƒ¦áƒ¬áƒ”რáƒ: $PAGESUMMARY $PAGEMINOREDIT
@@ -2242,10 +2262,9 @@ $NEWPAGE
ელ.ფáƒáƒ¡áƒ¢áƒ: $PAGEEDITOR_EMAIL
ვიკი: $PAGEEDITOR_WIKI
-შემდგáƒáƒ›áƒ˜ ცვლილებების შესáƒáƒ®áƒ”ბ შეტყáƒáƒ‘ინებების მისáƒáƒ¦áƒ”ბáƒáƒ“ áƒáƒ› გვერდს კვლáƒáƒ• უნდრესტუმრáƒáƒ—.
-áƒáƒ’რეთვე შეგიძლიáƒáƒ— áƒáƒ¦áƒáƒ“გინáƒáƒ— შეტყáƒáƒ‘ინებáƒáƒ—რპáƒáƒ áƒáƒ›áƒ”ტრები თქვენს კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒáƒ¨áƒ˜ შეტáƒáƒœáƒ˜áƒšáƒ˜ ყველრსáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ გვერდისáƒáƒ—ვის.
+შემდგáƒáƒ›áƒ˜ ცვლილებების შესáƒáƒ®áƒ”ბ შეტყáƒáƒ‘ინებების მისáƒáƒ¦áƒ”ბáƒáƒ“ áƒáƒ› გვერდს კვლáƒáƒ• უნდრესტუმრáƒáƒ—. თქვენ áƒáƒ’რეთვე შეგიძლიáƒáƒ— თქვენ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სიáƒáƒ¨áƒ˜ გáƒáƒ—იშáƒáƒ— შეტყáƒáƒ‘ინების ფუნქცირყველრგვერდისáƒáƒ—ვის.
- {{SITENAME}} შეტყáƒáƒ‘ინებáƒáƒ—რსისტემáƒ
+ {{SITENAME}} შეტყáƒáƒ‘ინებáƒáƒ—რსისტემáƒ
--
შეტყáƒáƒ‘ინების პáƒáƒ áƒáƒ›áƒ”ტრების ცვლილებáƒ
@@ -2259,6 +2278,8 @@ $UNWATCHURL
დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'შექმნილიáƒ',
+'changed' => 'შეცვლილი',
# Delete
'deletepage' => 'გვერდის წáƒáƒ¨áƒšáƒ',
@@ -2329,6 +2350,8 @@ $UNWATCHURL
'prot_1movedto2' => '[[$1]] გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜áƒ გვერდზე [[$2]]',
'protect-badnamespace-title' => 'დáƒáƒ£áƒªáƒ•áƒ”ლი სáƒáƒ®áƒ”ლთრსივრცე',
'protect-badnamespace-text' => 'áƒáƒ› სáƒáƒ®áƒ”ლთრსივრცის გვერდების დáƒáƒªáƒ•áƒ შეუძლებელიáƒ.',
+'protect-norestrictiontypes-text' => 'áƒáƒ› გვერდის დáƒáƒªáƒ•áƒ შეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ მისთვის áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ დáƒáƒªáƒ•áƒ˜áƒ¡ ტიპი.',
+'protect-norestrictiontypes-title' => 'დáƒáƒ£áƒªáƒ•áƒ”ლი გვერდი',
'protect-legend' => 'დáƒáƒªáƒ•áƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ',
'protectcomment' => 'მიზეზი:',
'protectexpiry' => 'ვáƒáƒ“áƒ',
@@ -2347,6 +2370,7 @@ $UNWATCHURL
'protect-fallback' => 'ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜áƒ მხáƒáƒšáƒáƒ“ „$1-ის“ უფლების მქáƒáƒœáƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებისáƒáƒ—ვის',
'protect-level-autoconfirmed' => 'ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜áƒ მხáƒáƒšáƒáƒ“ áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბული მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებისáƒáƒ—ვის',
'protect-level-sysop' => 'მხáƒáƒšáƒáƒ“ áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ”ბი',
+'protect-summary-desc' => '[$1=$2] ($3)',
'protect-summary-cascade' => 'იერáƒáƒ áƒ¥áƒ˜áƒ£áƒšáƒ˜',
'protect-expiring' => 'ვáƒáƒ“რგáƒáƒ¡áƒ“ის: $1 (UTC)',
'protect-expiring-local' => 'ვáƒáƒ“ის გáƒáƒ¡áƒ•áƒšáƒ˜áƒ¡ თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ $1',
@@ -2410,8 +2434,8 @@ $UNWATCHURL
'undeletedrevisions' => '$1 ვერსირáƒáƒ¦áƒ“გენილიáƒ',
'undeletedrevisions-files' => '$1 ვერსირდრ$2 ფáƒáƒ˜áƒšáƒ˜ áƒáƒ¦áƒ“გენილიáƒ',
'undeletedfiles' => '$1 ფáƒáƒ˜áƒšáƒ˜ áƒáƒ¦áƒ“გენილიáƒ',
-'cannotundelete' => 'წáƒáƒ¨áƒšáƒ˜áƒ¡ გáƒáƒ£áƒ¥áƒ›áƒ”ბრვერ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდáƒ;
-შესáƒáƒ«áƒšáƒáƒ თქვენáƒáƒ›áƒ“ე სხვáƒáƒ› უკვე გáƒáƒáƒ£áƒ¥áƒ›áƒ წáƒáƒ¨áƒšáƒ.',
+'cannotundelete' => 'წáƒáƒ¨áƒšáƒ˜áƒ¡ გáƒáƒ£áƒ¥áƒ›áƒ”ბრვერ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდáƒ:
+$1',
'undeletedpage' => "'''$1 áƒáƒ¦áƒ“გენილიáƒ'''
უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი წáƒáƒ¨áƒšáƒ˜áƒšáƒ—რდრáƒáƒ¦áƒ“გენის სირშეგიძლიáƒáƒ— ნáƒáƒ®áƒáƒ— [[Special:Log/delete|წáƒáƒ¨áƒšáƒ˜áƒšáƒ—რსიáƒáƒ¨áƒ˜]].",
@@ -2443,7 +2467,7 @@ $1',
'blanknamespace' => '(მთáƒáƒ•áƒáƒ áƒ˜)',
# Contributions
-'contributions' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის წვლილი',
+'contributions' => '{{GENDER:$1|მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი}} წვლილი',
'contributions-title' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის წვლილი $1',
'mycontris' => 'წვლილი',
'contribsub2' => '$1 ($2) თვის',
@@ -2712,6 +2736,7 @@ $1',
'immobile-target-namespace-iw' => 'ინტერვიკის ბმული შეუძლებელირგáƒáƒ›áƒáƒ§áƒ”ნებული იქნáƒáƒ¡ გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვისთვის.',
'immobile-source-page' => 'áƒáƒ› გვეერდის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ შეუძლებელიáƒ.',
'immobile-target-page' => 'შეუძლებელირმáƒáƒªáƒ”მულ სáƒáƒ®áƒ”ლზე გáƒáƒ“áƒáƒ¢áƒáƒœáƒ.',
+'bad-target-model' => 'შეუძლებელირ$1-ის გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ $2-ზე: მáƒáƒœáƒáƒªáƒ”მების შეუსáƒáƒ‘áƒáƒ›áƒ მáƒáƒ“ელი.',
'imagenocrossnamespace' => 'შეუძლებელირფáƒáƒ˜áƒšáƒ¡ მიეცეს სáƒáƒ®áƒ”ლი სáƒáƒ®áƒ”ლთრსხვრსივრციდáƒáƒœ',
'nonfile-cannot-move-to-file' => 'შეუძლებელირáƒáƒ áƒáƒ¤áƒáƒ˜áƒšáƒ”ბის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლთრსივრცეში',
'imagetypemismatch' => 'ფáƒáƒ˜áƒšáƒ¡ áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრáƒáƒ  შეესáƒáƒ‘áƒáƒ›áƒ”ბრმის ტიპს',
@@ -2822,6 +2847,7 @@ $1',
'import-error-interwiki' => 'გვერდი „$1“ áƒáƒ  იქნრიმპáƒáƒ áƒ¢áƒ˜áƒ áƒ”ბული, რáƒáƒ“გáƒáƒœáƒáƒª მისი სáƒáƒ®áƒ”ლი დáƒáƒ áƒ”გისტრირებულირგáƒáƒ áƒ” ბმულებისáƒáƒ—ვის (interwiki).',
'import-error-special' => 'გვერდი „$1“ áƒáƒ  იქნრიმპáƒáƒ áƒ¢áƒ˜áƒ áƒ”ბული, რáƒáƒ“გáƒáƒœáƒáƒª ის გáƒáƒœáƒ”კუთვნებრგáƒáƒœáƒ¡áƒáƒ™áƒ£áƒ—რებულ სáƒáƒ®áƒ”ლთრსივრცეს, რáƒáƒ›áƒ”ლიც კრძáƒáƒšáƒáƒ•áƒ¡ გვერდების შექმნáƒáƒ¡.',
'import-error-invalid' => 'გვერდი "$1" იმპáƒáƒ áƒ¢áƒ˜áƒ áƒ”ბრáƒáƒ  მáƒáƒ®áƒ“რმიუღებელი სáƒáƒ®áƒ”ლის გáƒáƒ›áƒ.',
+'import-error-unserialize' => 'ვერსირ$2 გვერდისáƒáƒ—ვის „$1“ áƒáƒ  შეიძლებრიყáƒáƒ¡ სტრუქტურირებული (დესერიáƒáƒšáƒ˜áƒ–ებული). მიღებულირშეტყáƒáƒ‘ინებáƒ, რáƒáƒ› áƒáƒ› ვერსიáƒáƒ¨áƒ˜ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრ$3 შემცველი მáƒáƒ“ელი, სერიáƒáƒšáƒ˜áƒ–ებული ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜ $4.',
'import-options-wrong' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ {{PLURAL:$2|პáƒáƒ áƒáƒ›áƒ”ტრი|პáƒáƒ áƒáƒ›áƒ”ტრი}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'ძირეული გვერდის მითითებული სáƒáƒ®áƒ”ლი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ.',
'import-rootpage-nosubpage' => 'სáƒáƒ®áƒ”ლტრსივრცეში მითითებულ ძირეულ გვერდში „$1“ ქვეგვერდები დáƒáƒ£áƒ¨áƒ•áƒ”ბელიáƒ.',
@@ -2836,7 +2862,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'JavaScript-ის ტესტირებáƒ',
-'javascripttest-disabled' => 'ეს ფუნქცირáƒáƒ› ვიკიში áƒáƒ  ჩáƒáƒ áƒ—ულáƒ.',
'javascripttest-title' => 'მიმდინáƒáƒ áƒ”áƒáƒ‘ს $1-ის ტესტირებáƒ',
'javascripttest-pagetext-noframework' => 'ეს გვერდი დáƒáƒ áƒ”გისტრირებულირJavaScript-ის ტესტების გáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბáƒáƒ“.',
'javascripttest-pagetext-unknownframework' => '„$1-ის“ ტესტირების უცნáƒáƒ‘ი გáƒáƒ áƒ”მáƒ.',
@@ -2969,11 +2994,13 @@ $1',
'pageinfo-default-sort' => 'სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ სáƒáƒ áƒ¢áƒ˜áƒ áƒ”ბის გáƒáƒ¡áƒáƒ¦áƒ”ბი',
'pageinfo-length' => 'გვერდის სიგრძე (ბáƒáƒ˜áƒ¢áƒ”ბში)',
'pageinfo-article-id' => 'გვერდის ID',
+'pageinfo-language' => 'გვერდის შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ენáƒ',
'pageinfo-robot-policy' => 'სáƒáƒ«áƒ˜áƒ”ბრსისტემის სტáƒáƒ¢áƒ£áƒ¡áƒ˜',
'pageinfo-robot-index' => 'ინდექსირდებáƒ',
'pageinfo-robot-noindex' => 'áƒáƒ  ინდექსირდებáƒ',
'pageinfo-views' => 'ხილვების რáƒáƒáƒ“ენáƒáƒ‘áƒ',
'pageinfo-watchers' => 'გვერდის დáƒáƒ›áƒ™áƒ•áƒ˜áƒ áƒ•áƒ”ბელთრრáƒáƒáƒ“ენáƒáƒ‘áƒ',
+'pageinfo-few-watchers' => 'სულ მცირე $1 {{PLURAL:$1|დáƒáƒ›áƒ™áƒ•áƒ˜áƒ áƒ•áƒ”ბელი|დáƒáƒ›áƒ™áƒ•áƒ˜áƒ áƒ•áƒ”ბელი}}',
'pageinfo-redirects-name' => 'გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებრáƒáƒ› გვერდზე',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'áƒáƒ› გვერდის ქვეგვერდები',
@@ -2989,6 +3016,19 @@ $1',
'pageinfo-magic-words' => 'ჯáƒáƒ“áƒáƒ¡áƒœáƒ£áƒ áƒ˜ {{PLURAL:$1|სიტყვáƒ|სიტყვáƒ}} ($1)',
'pageinfo-hidden-categories' => 'დáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜ {{PLURAL:$1|კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ|კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ}} ($1)',
'pageinfo-templates' => 'ინტეგრირებულირ{{PLURAL:$1|თáƒáƒ áƒ’ი|თáƒáƒ áƒ’ი}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|ჩáƒáƒ áƒ—ული გვერდი|ჩáƒáƒ áƒ—ული გვერდი}} ($1)',
+'pageinfo-toolboxlink' => 'გვერდის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ',
+'pageinfo-redirectsto' => 'გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒ',
+'pageinfo-redirectsto-info' => 'ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ',
+'pageinfo-contentpage' => 'ითვლებრრáƒáƒ’áƒáƒ áƒª შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ გვერდი',
+'pageinfo-contentpage-yes' => 'დიáƒáƒ®',
+'pageinfo-protect-cascading' => 'კáƒáƒ¡áƒ™áƒáƒ“ური დáƒáƒªáƒ•áƒ áƒáƒ¥áƒ”დáƒáƒœ',
+'pageinfo-protect-cascading-yes' => 'დიáƒáƒ®',
+'pageinfo-protect-cascading-from' => 'კáƒáƒ¡áƒ™áƒáƒ“ური დáƒáƒªáƒ•áƒ',
+'pageinfo-category-info' => 'ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ',
+'pageinfo-category-pages' => 'გვერდების რáƒáƒáƒ“ენáƒáƒ‘áƒ',
+'pageinfo-category-subcats' => 'ქვეკáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘áƒ',
+'pageinfo-category-files' => 'ფáƒáƒ˜áƒšáƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘áƒ',
# Skin names
'skinname-standard' => 'კლáƒáƒ¡áƒ˜áƒ™áƒ£áƒ áƒ˜',
@@ -3011,6 +3051,8 @@ $1',
'markedaspatrollederror' => 'შეუძლებელირáƒáƒ› სტáƒáƒ¢áƒ˜áƒ˜áƒ¡ მáƒhttp://translatewiki.net/w/i.php?title=MediaWiki:Markedaspatrollederror/ka&action=edit&loadgroup=core&loadtask=untranslatedნიშნვნრპáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბულáƒáƒ“.',
'markedaspatrollederrortext' => 'თქვენ უნდრმáƒáƒœáƒ˜áƒ¨áƒœáƒáƒ— ვერსიáƒ, რáƒáƒ›áƒ”ლიც პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბულáƒáƒ“ ჩáƒáƒ˜áƒ—ვლებáƒ.',
'markedaspatrollederror-noautopatrol' => 'თქვენ ვერ მáƒáƒœáƒ˜áƒ¨áƒœáƒáƒ•áƒ— თქვენივე შესწáƒáƒ áƒ”ბებს პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბულáƒáƒ“.',
+'markedaspatrollednotify' => 'ეს ცვლილებრგვერდზე $1 პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბულáƒáƒ“ მáƒáƒ˜áƒœáƒ˜áƒ¨áƒœáƒ.',
+'markedaspatrollederrornotify' => 'პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბულáƒáƒ“ მáƒáƒœáƒ˜áƒ¨áƒ•áƒœáƒ ვერ მáƒáƒ®áƒ”რხდáƒ.',
# Patrol log
'patrol-log-page' => 'პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბის ჟურნáƒáƒšáƒ˜',
@@ -3045,6 +3087,7 @@ $1',
'file-nohires' => 'უფრრმáƒáƒ¦áƒáƒšáƒ˜ გáƒáƒ áƒ©áƒ”ვáƒáƒ“áƒáƒ‘რáƒáƒ  áƒáƒ áƒ˜áƒ¡ შესáƒáƒ«áƒšáƒ”ბელი.',
'svg-long-desc' => 'ფáƒáƒ˜áƒšáƒ˜ SVG, ნáƒáƒ›áƒ˜áƒœáƒáƒšáƒ£áƒ áƒáƒ“ $1 × $2 პიქსელი, ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ: $3',
'svg-long-desc-animated' => 'áƒáƒœáƒ˜áƒ›áƒ˜áƒ áƒ”ბული SVG ფáƒáƒ˜áƒšáƒ˜, ნáƒáƒ›áƒ˜áƒœáƒáƒšáƒ£áƒ áƒ˜ $1 × $2 პიქსელი, ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ: $3',
+'svg-long-error' => 'áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ SVG ფáƒáƒ˜áƒšáƒ˜: $1',
'show-big-image' => 'სრული გáƒáƒ áƒ©áƒ”ვáƒáƒ“áƒáƒ‘áƒ',
'show-big-image-preview' => 'ზáƒáƒ›áƒ წინáƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ“áƒáƒ®áƒ”დვისáƒáƒ¡: $1.',
'show-big-image-other' => 'სხვრ{{PLURAL:$2|გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒ|გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒ}}: $1.',
@@ -3079,7 +3122,10 @@ $1',
'minutes' => '$1 წუთის',
'hours' => '$1 სáƒáƒáƒ—ის',
'days' => '$1 დღის',
+'months' => '{{PLURAL:$1|$1 თვე|$1 თვე}}',
+'years' => '{{PLURAL:$1|$1 წელი|$1 წელი}}',
'ago' => '$1 წინ',
+'just-now' => 'áƒáƒ®áƒšáƒáƒ®áƒáƒœáƒ¡',
# Bad image list
'bad_image_list' => 'ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შემდეგიáƒ:
@@ -3615,6 +3661,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[«Interwiki transcluding» გáƒáƒ—იშულიáƒ]',
'scarytranscludefailed' => '[$1-თáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ]',
+'scarytranscludefailed-httpstatus' => '[ვერ მáƒáƒ®áƒ”რხდრთáƒáƒ áƒ’ის ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრ$1-თვის: HTTP $2]',
'scarytranscludetoolong' => '[URL ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ]',
# Delete conflict
@@ -3763,6 +3810,7 @@ $5
'version-license' => 'ლიცენზიáƒ',
'version-poweredby-credits' => "ეს ვიკი მუშáƒáƒáƒ‘ს '''[//www.mediawiki.org/ MediaWiki]'''-ს ძრáƒáƒ•áƒ–ე, copyright © 2001-$1 $2.",
'version-poweredby-others' => 'სხვები',
+'version-credits-summary' => 'გვინდრმáƒáƒ“ლáƒáƒ‘რგáƒáƒ“áƒáƒ•áƒ£áƒ®áƒáƒ“áƒáƒ— შემდეგ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს მáƒáƒ—ი წვლილისáƒáƒ—ვის [[Special:Version|მედიáƒáƒ•áƒ˜áƒ™áƒ˜áƒ¡]] გáƒáƒœáƒ•áƒ˜áƒ—áƒáƒ áƒ”ბáƒáƒ¨áƒ˜.',
'version-license-info' => 'MediaWiki áƒáƒ áƒ˜áƒ¡ თáƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒáƒšáƒ˜ პრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ უზრუნველყáƒáƒ¤áƒ; შეგიძლიáƒáƒ— მისი გáƒáƒ•áƒ áƒªáƒ”ლებრáƒáƒœ/დრმáƒáƒ“იფიცირებრGNU General Public License ლიცენზიის პირáƒáƒ‘ების შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒáƒ“. რáƒáƒ’áƒáƒ áƒª გáƒáƒ›áƒáƒ¥áƒ•áƒ”ყნებულირთáƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒáƒšáƒ˜ პრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ უზრუნველყáƒáƒ¤áƒ˜áƒ¡ ფáƒáƒœáƒ“ის მიერ; áƒáƒœ ლიცენზიის მეáƒáƒ áƒ” ვერსიáƒáƒ¨áƒ˜, áƒáƒœ (თქვენი áƒáƒ–რით) უფრრáƒáƒ®áƒáƒšáƒ¨áƒ˜.
MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› ის სáƒáƒ¡áƒáƒ áƒ’ებლრიქნებáƒ, მáƒáƒ’რáƒáƒ› გáƒáƒ áƒáƒœáƒ¢áƒ˜áƒ˜áƒ¡ გáƒáƒ áƒ”შე; კáƒáƒ›áƒ”რციული ღირებულების ნáƒáƒ’ულისხმევი გáƒáƒ áƒáƒœáƒ¢áƒ˜áƒ˜áƒ¡ გáƒáƒ áƒ”შეც კი áƒáƒœ რáƒáƒ˜áƒ›áƒ” მიზნისთვის სáƒáƒ áƒ’ებლის მისáƒáƒ¦áƒ”ბáƒáƒ“. მეტი დეტáƒáƒšáƒ£áƒ áƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის, იხილეთ GNU General Public License.
@@ -3875,17 +3923,17 @@ MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› იáƒ
'sqlite-no-fts' => '$1 სრული ტექსტის ძიების მხáƒáƒ áƒ“áƒáƒ­áƒ”რის გáƒáƒ áƒ”შე',
# New logging system
-'logentry-delete-delete' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 წáƒáƒ¨áƒáƒšáƒ გვერდი: „$3“',
-'logentry-delete-restore' => '$1 áƒáƒ¦áƒáƒ“გინრგვერდი $3',
-'logentry-delete-event' => '$1 შეცვáƒáƒšáƒ {{PLURAL:$5|ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რის|$5 ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რების}} ხილვáƒáƒ“áƒáƒ‘რ$3-ზე: $4',
-'logentry-delete-revision' => '$1 შეცვáƒáƒšáƒ {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვáƒáƒ“áƒáƒ‘რგვერდისáƒáƒ—ვის $3: $4',
-'logentry-delete-event-legacy' => '$1 შეცვáƒáƒšáƒ ჩáƒáƒœáƒáƒ¬áƒ”რების ჟურნáƒáƒšáƒ˜áƒ¡ ხილვáƒáƒ“áƒáƒ‘რ$3-ზე',
-'logentry-delete-revision-legacy' => '$1 შეცვáƒáƒšáƒ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜ გვერდზე $3',
-'logentry-suppress-delete' => '$1 ჩáƒáƒáƒ®áƒ¨áƒ $3 გვერდი',
-'logentry-suppress-event' => '$1 ფáƒáƒ áƒ£áƒšáƒáƒ“ შეცვáƒáƒšáƒ {{PLURAL:$5|ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რის|$5 ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რების}} ხილვáƒáƒ“áƒáƒ‘რ$3-ზე: $4',
-'logentry-suppress-revision' => '$1 ფáƒáƒ áƒ£áƒšáƒáƒ“ შეცვáƒáƒšáƒ {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვáƒáƒ“áƒáƒ‘რ$3 გვერდზე: $4',
-'logentry-suppress-event-legacy' => '$1 ფáƒáƒ áƒ£áƒšáƒáƒ“ შეცვáƒáƒšáƒ $3 ჩáƒáƒœáƒáƒ¬áƒ”რების ჟურნáƒáƒšáƒ˜áƒ¡ ხილვáƒáƒ“áƒáƒ‘áƒ',
-'logentry-suppress-revision-legacy' => '$1 ფáƒáƒ áƒ£áƒšáƒáƒ“ შეცვáƒáƒšáƒ ვერსიის ხილვáƒáƒ“áƒáƒ‘რ$3 გვერდზე',
+'logentry-delete-delete' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 {{GENDER:$2|წáƒáƒ¨áƒáƒšáƒ}} გვერდი: „$3“',
+'logentry-delete-restore' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 {{GENDER:$2|áƒáƒ¦áƒáƒ“გინáƒ}} გვერდი $3',
+'logentry-delete-event' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 {{GENDER:$2|შეცვáƒáƒšáƒ}} {{PLURAL:$5|ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რის|$5 ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რების}} ხილვáƒáƒ“áƒáƒ‘რ$3-ზე: $4',
+'logentry-delete-revision' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 {{GENDER:$2|შეცვáƒáƒšáƒ}} {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვáƒáƒ“áƒáƒ‘რგვერდისáƒáƒ—ვის $3: $4',
+'logentry-delete-event-legacy' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 {{GENDER:$2|შეცვáƒáƒšáƒ}} ჩáƒáƒœáƒáƒ¬áƒ”რების ჟურნáƒáƒšáƒ˜áƒ¡ ხილვáƒáƒ“áƒáƒ‘რ$3-ზე',
+'logentry-delete-revision-legacy' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 {{GENDER:$2|შეცვáƒáƒšáƒ}} რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜ გვერდზე $3',
+'logentry-suppress-delete' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 {{GENDER:$2|ჩáƒáƒáƒ®áƒ¨áƒ}} $3 გვერდი',
+'logentry-suppress-event' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 ფáƒáƒ áƒ£áƒšáƒáƒ“ {{GENDER:$2|შეცვáƒáƒšáƒ}} {{PLURAL:$5|ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რის|$5 ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რების}} ხილვáƒáƒ“áƒáƒ‘რ$3-ზე: $4',
+'logentry-suppress-revision' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 ფáƒáƒ áƒ£áƒšáƒáƒ“ {{GENDER:$2|შეცვáƒáƒšáƒ}} {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვáƒáƒ“áƒáƒ‘რ$3 გვერდზე: $4',
+'logentry-suppress-event-legacy' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 ფáƒáƒ áƒ£áƒšáƒáƒ“ {{GENDER:$2|შეცვáƒáƒšáƒ}} $3 ჩáƒáƒœáƒáƒ¬áƒ”რების ჟურნáƒáƒšáƒ˜áƒ¡ ხილვáƒáƒ“áƒáƒ‘áƒ',
+'logentry-suppress-revision-legacy' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 ფáƒáƒ áƒ£áƒšáƒáƒ“ {{GENDER:$2|შეცვáƒáƒšáƒ}} ვერსიის ხილვáƒáƒ“áƒáƒ‘რ$3 გვერდზე',
'revdelete-content-hid' => 'შინáƒáƒáƒ áƒ¡áƒ˜ დáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜áƒ',
'revdelete-summary-hid' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბის áƒáƒ¦áƒ¬áƒ”რრდáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜áƒ',
'revdelete-uname-hid' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი დáƒáƒ¤áƒáƒ áƒ£áƒšáƒ˜áƒ',
@@ -3894,17 +3942,21 @@ MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› იáƒ
'revdelete-uname-unhid' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი გáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜áƒ',
'revdelete-restricted' => 'შეზღუდვრáƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ—áƒáƒ—ვის',
'revdelete-unrestricted' => 'áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ—áƒáƒ—ვის შეზღუდვები მáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜áƒ',
-'logentry-move-move' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$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-patrol-patrol' => '$1 გáƒáƒáƒ™áƒ”თრგვერდის „$3“ $4 ვერსიის პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბáƒ',
-'logentry-patrol-patrol-auto' => '$1 áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒáƒ™áƒ”თრგვერდის „$3“ $4 ვერსიის პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბáƒ',
-'logentry-newusers-newusers' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ $1 შექმნილიáƒ',
-'logentry-newusers-create' => 'შეიქმნრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ $1',
-'logentry-newusers-create2' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ $3 შექმნრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1',
-'logentry-newusers-autocreate' => 'áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ შეიქმნრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ $1',
-'newuserlog-byemail' => 'პáƒáƒ áƒáƒšáƒ˜ ელ-ფáƒáƒ¡áƒ¢áƒ˜áƒ—áƒáƒ გáƒáƒ›áƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜',
+'logentry-move-move' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 გვერდი „$3“ {{GENDER:$2|გáƒáƒ“áƒáƒ˜áƒ¢áƒáƒœáƒ}} გვერდზე „$4“',
+'logentry-move-move-noredirect' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 გვერდი „$3“ {{GENDER:$2|გáƒáƒ“áƒáƒ˜áƒ¢áƒáƒœáƒ}} გვერდზე „$4“ გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ების დáƒáƒ¢áƒáƒ•áƒ”ბის გáƒáƒ áƒ”შე',
+'logentry-move-move_redir' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 გვერდი „$3“ {{GENDER:$2|გáƒáƒ“áƒáƒ˜áƒ¢áƒáƒœáƒ}} გვერდზე „$4“ გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებáƒáƒ–ე',
+'logentry-move-move_redir-noredirect' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 {{GENDER:$2|გáƒáƒ“áƒáƒ˜áƒ¢áƒáƒœáƒ}} გვერდი $3 $4-ში გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ების დáƒáƒ¢áƒáƒ•áƒ”ბის გáƒáƒ áƒ”შე',
+'logentry-patrol-patrol' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 {{GENDER:$2|გáƒáƒáƒ™áƒ”თáƒ}} გვერდის „$3“ $4 ვერსიის პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბáƒ',
+'logentry-patrol-patrol-auto' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ {{GENDER:$2|გáƒáƒáƒ™áƒ”თáƒ}} გვერდის „$3“ $4 ვერსიის პáƒáƒ¢áƒ áƒ£áƒšáƒ˜áƒ áƒ”ბáƒ',
+'logentry-newusers-newusers' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ $1 {{GENDER:$2|შექმნილიáƒ}}',
+'logentry-newusers-create' => '{{GENDER:$2|შეიქმნáƒ}} მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ $1',
+'logentry-newusers-create2' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ $3 {{GENDER:$2|შექმნáƒ}} მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1',
+'logentry-newusers-byemail' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ $3 {{GENDER:$2|შექმნáƒ}} მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 დრპáƒáƒ áƒáƒšáƒ˜ გáƒáƒ’ზáƒáƒ•áƒœáƒ ელ. ფáƒáƒ¡áƒ¢áƒ˜áƒ—',
+'logentry-newusers-autocreate' => 'áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ {{GENDER:$2|შეიქმნáƒ}} მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜ $1',
+'logentry-rights-rights' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 {{GENDER:$2|შეცვáƒáƒšáƒ}} ჯგუფის წევრáƒáƒ‘რ$3-თვის $4-დáƒáƒœ $5-ზე',
+'logentry-rights-rights-legacy' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელმრ$1 {{GENDER:$2|შეცვáƒáƒšáƒ}} ჯგუფის წევრáƒáƒ‘რ$3-თვის',
+'logentry-rights-autopromote' => 'მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი $1 áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ იქნრ{{GENDER:$2|გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜}} $4–დáƒáƒœ $5–ში',
+'rightsnone' => '(áƒáƒ áƒªáƒ”რთი)',
# Feedback
'feedback-bugornote' => 'თუ თქვენ მზáƒáƒ“ ხáƒáƒ áƒ— დეტáƒáƒšáƒ£áƒ áƒáƒ“ áƒáƒ¦áƒ¬áƒ”რáƒáƒ— ტექნიკური პრáƒáƒ‘ლემáƒ, გთხáƒáƒ•áƒ—, [$1 შეგვáƒáƒ¢áƒ§áƒáƒ‘ინეთ შეცდáƒáƒ›áƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ].
@@ -3958,6 +4010,7 @@ MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› იáƒ
'api-error-ok-but-empty' => 'შიდრშეცდáƒáƒ›áƒ. სერვერს áƒáƒ  დáƒáƒ£áƒ‘რუნებირინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒáƒ“ი ფáƒáƒ˜áƒšáƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ.',
'api-error-overwrite' => 'áƒáƒ áƒ¡áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ შეცვლრმიუღებელიáƒ.',
'api-error-stashfailed' => 'შიდრშეცდáƒáƒ›áƒ: სერვერმრვერ შეძლრდრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ შენáƒáƒ®áƒ•áƒ.',
+'api-error-publishfailed' => 'შიდრშეცდáƒáƒ›áƒ: სერვერმრვერ შეძლრდრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ შენáƒáƒ®áƒ•áƒ.',
'api-error-timeout' => 'სერვერმრáƒáƒ  მáƒáƒáƒ®áƒ“ინრრეáƒáƒ’ირებრმáƒáƒ¡áƒáƒšáƒáƒ“ნელ დრáƒáƒ¨áƒ˜.',
'api-error-unclassified' => 'áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირუცნáƒáƒ‘ი შეცდáƒáƒ›áƒ.',
'api-error-unknown-code' => 'უცნáƒáƒ‘ი შეცდáƒáƒ›áƒ : „$1“',
@@ -3978,4 +4031,7 @@ MediaWiki ვრცელდებრიმ იმედით, რáƒáƒ› იáƒ
'duration-centuries' => '$1 {{PLURAL:$1|სáƒáƒ£áƒ™áƒ£áƒœáƒ”|სáƒáƒ£áƒ™áƒ£áƒœáƒ”}}',
'duration-millennia' => '$1 {{PLURAL:$1|áƒáƒ—áƒáƒ¡áƒ¬áƒšáƒ”ული|áƒáƒ—áƒáƒ¡áƒ¬áƒšáƒ”ული}}',
+# Image rotation
+'rotate-comment' => 'სურáƒáƒ—ი მáƒáƒ¢áƒ áƒ˜áƒáƒšáƒ”ბულირ$1 {{PLURAL:$1|გრáƒáƒ“უსით|გრáƒáƒ“უსით}} სáƒáƒáƒ—ის ისრის მიმáƒáƒ áƒ—ულებით',
+
);
diff --git a/languages/messages/MessagesKaa.php b/languages/messages/MessagesKaa.php
index c753e412..37e4005e 100644
--- a/languages/messages/MessagesKaa.php
+++ b/languages/messages/MessagesKaa.php
@@ -285,7 +285,6 @@ $messages = array(
'qbbrowse' => "Ko'riw",
'qbedit' => "O'zgertiw",
'qbpageoptions' => 'Usı bet',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => "Menin' betlerim",
'qbspecialpages' => 'Arnawlı betler',
'faq' => 'KBS',
@@ -511,12 +510,8 @@ Keltirilgen sebep: ''$2''.",
'logouttext' => "'''Siz endi sayttan shıqtın'ız.'''
Siz {{SITENAME}} saytınan anonim halda paydalanıwın'ız mu'mkin.
-Yamasa siz ja'ne ha'zirgi yaki basqa paydalanıwshı atı menen [[Special:UserLogin|qaytadan sistemag'a kiriwin'izge]] boladı.
+Yamasa siz ja'ne ha'zirgi yaki basqa paydalanıwshı atı menen <span class='plainlinks'>[$1 qaytadan sistemag'a kiriwin'izge]</span> boladı.
Sonı este saqlan', ayrım betler sizin' brauzerin'izdin' keshi tazalanbag'anlıg'ı sebebli sistemada kirgenin'izdey ko'riniste dawam ettire beriwi mu'mkin.",
-'welcomecreation' => "== Xosh keldin'iz, $1! ==
-
-Akkauntın'ız jaratıldı.
-[[Special:Preferences|{{SITENAME}} sazlawların'ızdı]] o'zgertiwdi umıtpan'.",
'yourname' => 'Paydalanıwshı atı:',
'yourpassword' => 'Parol:',
'yourpasswordagain' => "Paroldi qayta kiritin':",
@@ -706,7 +701,6 @@ To'mende en' aqırg'ı jurnal mag'lıwmatları berilgen.",
'template-protected' => "(qorg'alg'an)",
'template-semiprotected' => "(yarım-qorg'alg'an)",
'hiddencategories' => "Bul bet {{PLURAL:$1|1 jasırın kategoriyasının'|$1 jasırın kategoriyalarının'}} ag'zası:",
-'nocreatetitle' => 'Bet jaratıw sheklengen',
'nocreatetext' => "{{SITENAME}} saytında taza betlerdi jaratıw sheklengen.
Arqag'a qaytıp bar betti o'zgertiwin'izge yamasa [[Special:UserLogin|kiriwin'izge / akkaunt jaratıwın'ızg'a]] boladı.",
'nocreate-loggedin' => "Taza betler jaratıwın'ızg'a ruxsatın'ız joq.",
@@ -1020,11 +1014,13 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
'right-userrights-interwiki' => "Basqa wikilerdegi paydalanıwshının' huquqların o'zgertiw",
'right-siteadmin' => "Mag'lıwmatlar bazasın qulıplaw ha'm qulıplawın o'shiriw",
+# Special:Log/newusers
+'newuserlogpage' => 'Paydalanıwshılardı esapqa alıw jurnalı',
+'newuserlogpagetext' => 'Bul paydalanıwshılardı esapqa alıw jurnalı',
+
# User rights log
'rightslog' => 'Paydalanıwshı huquqları jurnalı',
'rightslogtext' => "Bul paydalanıwshı huquqların o'zgertiw jurnalı.",
-'rightslogentry' => "$1 paydalanıwshısının' ag'za bolg'an toparları $2 degennen $3 degenge o'zgertti",
-'rightsnone' => '(hesh qanday)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'bul betti oqıw',
@@ -1371,10 +1367,6 @@ Ja'nede [[Special:WantedCategories|kerekli kategoriyalardı]] qarap ko'rin'.",
'listusers-submit' => "Ko'rset",
'listusers-noresult' => 'Paydalanıwshı tabılmadı.',
-# Special:Log/newusers
-'newuserlogpage' => 'Paydalanıwshılardı esapqa alıw jurnalı',
-'newuserlogpagetext' => 'Bul paydalanıwshılardı esapqa alıw jurnalı',
-
# Special:ListGroupRights
'listgrouprights' => 'Paydalanıwshılar toparı huqıqları',
'listgrouprights-group' => 'Topar',
@@ -1432,14 +1424,12 @@ Eger siz bul betti baqlaw dizimin'izden o'shirmekshi bolsan'ız bettin' joqarg'Ä
'enotif_mailer' => '{{SITENAME}} eskertiw xatın jiberiw xızmeti',
'enotif_reset' => "Barlıq betti ko'rip shıg'ıldı dep belgile",
-'enotif_newpagetext' => 'Bul taza bet.',
'enotif_impersonal_salutation' => '{{SITENAME}} paydalanıwshısı',
-'changed' => "o'zgertilgen",
-'created' => "jaratılg'an",
-'enotif_subject' => '{{SITENAME}} proektindegi $PAGEEDITOR $PAGETITLE atamalı betti $CHANGEDORCREATED',
'enotif_lastvisited' => "Son'g'ı kirwin'izden beri bolg'an o'zgerisler ushın $1 degendi ko'rin'iz.",
'enotif_lastdiff' => "Usı o'zgeris ushın $1 degendi ko'rin'iz.",
'enotif_anon_editor' => 'anonim paydalanıwshı $1',
+'created' => "jaratılg'an",
+'changed' => "o'zgertilgen",
# Delete
'deletepage' => "Betti o'shir",
@@ -1952,6 +1942,6 @@ Bul tastıyıqlaw kodının' pitetug'ın waqtı: $4.",
# New logging system
'revdelete-restricted' => "administratorlarg'a qollanılg'an sheklewler",
'revdelete-unrestricted' => "administratorlardan alıp taslang'an sheklewler",
-'newuserlog-byemail' => 'parol e-mail arqalı jiberildi',
+'rightsnone' => '(hesh qanday)',
);
diff --git a/languages/messages/MessagesKab.php b/languages/messages/MessagesKab.php
index 4908a31e..33a9490a 100644
--- a/languages/messages/MessagesKab.php
+++ b/languages/messages/MessagesKab.php
@@ -187,7 +187,6 @@ $messages = array(
'qbbrowse' => 'Ẓer isebtar',
'qbedit' => 'Beddel',
'qbpageoptions' => 'Asebter-agi',
-'qbpageinfo' => 'Asatal',
'qbmyoptions' => 'isebtar inu',
'qbspecialpages' => 'isebtar usligen',
'faq' => 'Isteqsiyen',
@@ -444,12 +443,8 @@ Anedbal i tid sekkweṛen yefkad taɣẓint agi : « $3 ».',
# Login and logout pages
'logouttext' => "'''Tura tesensereá¸.'''
-TzemreḠad tesseqdceḠ{{SITENAME}} d udrig, [[Special:UserLogin|ad tkecmeḠdaÉ£en]] s yisem n wemseqdac inek (neÉ£ nniá¸en).
+TzemreḠad tesseqdceḠ{{SITENAME}} d udrig, <span class='plainlinks'>[$1 ad tkecmeḠdaÉ£en]</span> s yisem n wemseqdac inek (neÉ£ nniá¸en).
Kra n isebtar zemren ad sskanen belli mazal-ik s yisem n wemseqdac inek armi temḥuḠlkac.",
-'welcomecreation' => '== Aná¹£uf yisek (yisem), $1 ! ==
-
-Amiá¸an ik (im) yesnulfad.
-Ur tettuḠara ad tbeddleḠ[[Special:Preferences|isemyifiyen inek (inem) ɣef {{SITENAME}}]].',
'yourname' => 'Isem n wemseqdac',
'yourpassword' => 'Awal n tbaá¸nit',
'yourpasswordagain' => 'Æiwed ssekcem awal n tbaá¸nit',
@@ -761,7 +756,6 @@ Asekcem aneggaru n uɣmis yella ddaw-agi :",
'template-semiprotected' => '(nnefṣ-yettwaḥrez)',
'hiddencategories' => 'Asebter agi yella deg {{PLURAL:$1|Taggayt i ffren|Tiggayin i ffren}} agi :',
'edittools' => '<!-- Aá¸ris yettbanen-d seddaw talÉ£a n ubeddil d uzen. -->',
-'nocreatetitle' => 'Axleq n isebtar meḥdud',
'nocreatetext' => '{{SITENAME}} yekref iẓubaẓ n usnulfu n isebtar imaynuten.
TzemreḠad uÉ£aleḠar deffir dÉ£a ad beddeleḠasebter yellan yakan, naÉ£ [[Special:UserLogin|ad qqeneḠnaÉ£ ad snulfuḠamiá¸an]].',
'nocreate-loggedin' => 'Ur tesɛiḠara turagt i usnulfu n isebtar imaynuten.',
@@ -784,6 +778,15 @@ Ahat yetwemḥa.',
'edit-already-exists' => 'Asebter amaynut ur d yesnufu ara.
Yella yakan.',
'defaultmessagetext' => 'Izen s lexá¹£as',
+'content-failed-to-parse' => 'Tasleṭ n ugbur n $2 i talɣa $1 texseṛ : $3',
+'invalid-content-data' => 'Isefka n ugbur ur ɣbelen ara',
+'content-not-allowed-here' => 'Agbur "$1" ur yesɛa ara turagt ɣef usebter [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikiaá¸ris',
+'content-model-text' => 'aá¸ris afraray',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Ɣur-wet :''' Asebter agi yesɛa aṭas n tiɣriwin ar tiseɣnin ɣlayen n umsisleḠtaseddast.
@@ -1294,12 +1297,13 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
'right-sendemail' => 'CeggaÉ› tirawt i iseqdacen nniá¸en',
'right-passwordreset' => 'Ẓeṛ tira n uwennez n awalen uɛaddi',
+# Special:Log/newusers
+'newuserlogpage' => 'AÉ£mis n isnulfan n imiá¸anen n imseqdacen',
+'newuserlogpagetext' => 'Asebter agi yebeqqeḠamezruy n usnulfu n imiá¸anen n iseqdacen.',
+
# User rights log
'rightslog' => 'AÉ£mis n yizerfan n wemseqdac',
'rightslogtext' => 'Wagi d aɣmis n yibeddlen n yizerfan n wemseqdac',
-'rightslogentry' => 'Yettubeddel izerfan n wemseqdac $1 seg $2 ar $3',
-'rightslogentry-autopromote' => 'yesnerna s uwurman seg $2 ar $3',
-'rightsnone' => '(ulaḥedd)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'É£aá¹› asebter agi',
@@ -1927,10 +1931,6 @@ Ineggafen imazdayen : <code>$1</code> (ur d-renu acemma deg unadi inek/inem)',
'activeusers-hidesysops' => 'Ffer inedbalen',
'activeusers-noresult' => 'Ur yufi aseqdac.',
-# Special:Log/newusers
-'newuserlogpage' => 'AÉ£mis n isnulfan n imiá¸anen n imseqdacen',
-'newuserlogpagetext' => 'Asebter agi yebeqqeḠamezruy n usnulfu n imiá¸anen n iseqdacen.',
-
# Special:ListGroupRights
'listgrouprights' => 'Izerfan n igrawen n iseqdacen',
'listgrouprights-summary' => 'Asebter agi yesɛa yiwen umuɣ n igrawen i sengelen deg wiki agi dɣa izerfan n wadduf i qqenen.
@@ -2029,11 +2029,7 @@ Ma tebɣiḠad tekkseḠasebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
'enotif_mailer' => 'Email n talɣut n {{SITENAME}}',
'enotif_reset' => 'Rcem akk isebtar mmeẓren',
-'enotif_newpagetext' => 'Wagi d asebter amaynut.',
'enotif_impersonal_salutation' => 'Amseqdac n {{SITENAME}}',
-'changed' => 'yettubeddel',
-'created' => 'yettwaxleq',
-'enotif_subject' => 'Asebter $PAGETITLE n {{SITENAME}} $CHANGEDORCREATED sɣur $PAGEEDITOR',
'enotif_lastvisited' => 'Ẓer $1 i akk ibeddlen segwasmi tkecmeḠtikelt taneggarut.',
'enotif_lastdiff' => 'Ẓer $1 akken ad tmuqleḠabeddel.',
'enotif_anon_editor' => 'aseqdac ur i siggezen ara $1',
@@ -2066,6 +2062,8 @@ $UNWATCHURL
Tuɣalin d tadhelt :
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'yettwaxleq',
+'changed' => 'yettubeddel',
# Delete
'deletepage' => 'Mḥu asebter',
@@ -2489,6 +2487,8 @@ Anda tebɣiḠtesmimeḠ"[[:$1]]" yella yagi. tebɣiḠad temḥuḠiwakken
'pageinfo-views' => 'Amá¸an n timuÉ£liwin',
'pageinfo-watchers' => 'Amá¸an n imttekkiyen yesÉ›an asebter agi deg umuÉ£ nsen n uÉ›assi',
'pageinfo-subpages-name' => 'Adu-isebtar n usebter agi',
+'pageinfo-contentpage-yes' => 'Ih',
+'pageinfo-protect-cascading-yes' => 'Ih',
# Patrolling
'markaspatrolleddiff' => 'Rcem "yettwassenqden"',
@@ -2539,6 +2539,7 @@ Lukan a t-tesseqdceḠyezmer ad yexsser aselkim inek/inem.",
'hours' => '{{PLURAL:$1|$1 asrag|$1 isragen}}',
'days' => '{{PLURAL:$1|$1 ass|$1 ussan}}',
'ago' => '$1 aya',
+'just-now' => 'Tura kan',
# Bad image list
'bad_image_list' => 'Amasal d-wagi :
@@ -3002,6 +3003,9 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḠad tɛiwedeḠaxlaq n usebter-ag
# Special:Tags
'tag-filter' => 'Astay n [[Special:Tags|ticraá¸]] :',
+# New logging system
+'rightsnone' => '(ulaḥedd)',
+
# Feedback
'feedback-subject' => 'Asentel :',
'feedback-message' => 'Izen :',
diff --git a/languages/messages/MessagesKbd_cyrl.php b/languages/messages/MessagesKbd_cyrl.php
index 8529c445..85b046d3 100644
--- a/languages/messages/MessagesKbd_cyrl.php
+++ b/languages/messages/MessagesKbd_cyrl.php
@@ -16,6 +16,43 @@
# $fallback = 'ru'; // bug 27785
+$namespaceNames = array(
+ NS_MEDIA => 'Медиа',
+ NS_SPECIAL => 'СлужебнаÑ',
+ NS_TALK => 'ТепÑÑлъÑхьыгъуÑ',
+ NS_USER => 'ЦӀыхухÑÑ‚',
+ NS_USER_TALK => 'ЦӀыхухÑÑ‚_тепÑÑлъÑхьыгъуÑ',
+ NS_PROJECT_TALK => '$1_тепÑÑлъÑхьыгъуÑ',
+ NS_FILE => 'Файл',
+ NS_FILE_TALK => 'Файл_тепÑÑлъÑхьыгъуÑ',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWiki_тепÑÑлъÑхьыгъуÑ',
+ NS_TEMPLATE => 'Шаблон',
+ NS_TEMPLATE_TALK => 'Шаблон_тепÑÑлъÑхьыгъуÑ',
+ NS_HELP => 'ДÑÓ€ÑпыкъуÑгъуÑ',
+ NS_HELP_TALK => 'ДÑÓ€ÑпыкъуÑгъуÑ_тепÑÑлъÑхьыгъуÑ',
+ NS_CATEGORY => 'КатегориÑ',
+ NS_CATEGORY_TALK => 'КатегориÑ_тепÑÑлъÑхьыгъуÑ',
+);
+
+$namespaceAliases = array(
+ # Russian namespaces
+ 'ОбÑуждение' => NS_TALK,
+ 'УчаÑтник' => NS_USER,
+ 'ОбÑуждение_учаÑтника' => NS_USER_TALK,
+ 'ОбÑуждение_{{GRAMMAR:genitive|$1}}' => NS_PROJECT_TALK,
+ 'ОбÑуждение_файла' => NS_FILE_TALK,
+ 'ОбÑуждение_MediaWiki' => NS_MEDIAWIKI_TALK,
+ 'ОбÑуждение_шаблона' => NS_TEMPLATE_TALK,
+ 'Справка' => NS_HELP,
+ 'ОбÑуждение_Ñправки' => NS_HELP_TALK,
+ 'КатегориÑ' => NS_CATEGORY,
+ 'ОбÑуждение_категории' => NS_CATEGORY_TALK,
+);
+
+// Remove Russian gender aliases
+$namespaceGenderAliases = array();
+
$messages = array(
# User preference toggles
'tog-underline' => 'ТехьÑпӀÑÑ…ÑÑ€ щӀÑÑ‚Ñ…ÑŠÑн:',
@@ -161,7 +198,6 @@ $messages = array(
'qbbrowse' => 'Ð¥ÑплъÑн',
'qbedit' => 'ГъÑÑ‚ÑÑ€Ñзын',
'qbpageoptions' => 'ÐапÑкӀуÑцӀым и зÑгъÑзÑхуÑгъуÑÑ€',
-'qbpageinfo' => 'ÐапÑкIуÑцIым теухуауÑ',
'qbmyoptions' => 'Уи зÑгъÑзÑхуÑгъуÑÑ…ÑÑ€',
'qbspecialpages' => 'Специал напÑкӀуÑцӀхÑÑ€',
'faq' => 'FAQ',
@@ -408,11 +444,8 @@ $2',
# Login and logout pages
'logouttext' => "'''ДжыпÑту ÑƒÐ¸ÐºÓ€Ñ‹Ð¶Ð°ÑƒÑ Ñ‰Ñ‹Ñ‚.'''
-УихьÑжьыфыну {{grammar:genitive|{{SITENAME}}}} зыкъумгъÑцӀыху Ð¸Ñ [[Special:UserLogin|зыкъегъÑцӀыхун аргуÑру]] уи цӀÑÐ¼ÐºÓ€Ñ Ð¸Ñ Ð½ÑмыщӀымкӀÑ.
+УихьÑжьыфыну {{grammar:genitive|{{SITENAME}}}} зыкъумгъÑцӀыху Ð¸Ñ <span class='plainlinks'>[$1 зыкъегъÑцӀыхун аргуÑру]</span> уи цӀÑÐ¼ÐºÓ€Ñ Ð¸Ñ Ð½ÑмыщӀымкӀÑ.
ÐапÑкӀуÑцӀ гуÑÑ€ÑÑ…ÑÑ€ ÑпÑми хуÑду къикӀыфынухÑ, ÑиÑтемÑм уимыкӀыжьа хуÑду. ÐпхуÑду щымытын щхьÑÐºÓ€Ñ Ð±Ñ€Ð°ÑƒÐ·ÑÑ€ кÑшыр къÑгъÑщӀырыщӀын хуÑй.",
-'welcomecreation' => '== КъеблагъÑ, $1! ==
-Уи аккаунтыр Ñ…ÑŒÑзырщ.
-ЗыщумгъÑÐ³ÑŠÑƒÐ¿ÑˆÑ Ñайтым уи [[Special:Preferences|перÑонал зÑгъÑзÑхуÑгъуÑ]] быщӀын.',
'yourname' => 'Уи цӀÑÑ€:',
'yourpassword' => 'ПÑролыр:',
'yourpasswordagain' => 'Иджыри Ð·Ñ Ð¿Ñролыр:',
@@ -690,7 +723,6 @@ $2',
'template-protected' => '(теубыдащ)',
'template-semiprotected' => '(иныкъуÑÑ€ теубыдащ)',
'hiddencategories' => 'Мы напÑкӀуÑцӀыр зхÑÑ…ÑŒÑÑ€ $1 {{PLURAL:$1|1 ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð·ÑхуÑща|$1 ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð·ÑхуÑщахÑÑ€}}:',
-'nocreatetitle' => 'ÐапÑкӀуÑцӀ щӀыныр тубыдащ',
'nocreatetext' => 'Мы Ñайтым деж ныпÑкӀуÑцӀ щӀÑÑƒÑ Ñ‰Ó€Ñ‹Ð½Ñ…Ñм щхьÑÐºÓ€Ñ Ñ‚ÐµÑƒÐ±Ñ‹Ð´Ñ‹Ð³ÑŠÑƒÑ Ñ‰Ñ‹Ó€Ñщ.
БгъÑзÑжу, напÑкӀуÑцӀ щыӀÑÑ€ бгъÑÑ‚ÑÑ€Ñзыфынущ, [[Special:UserLogin|ÑиÑтемÑÐ¼Ñ Ð·Ñ‹ÐºÑŠÐµÐ³ÑŠÑцӀыхун Ð¸Ñ Ñ‰Ó€ÑÑƒÑ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚ щӀын]].',
'nocreate-loggedin' => 'ÐапÑкӀуÑÑ†Ó€Ñ‹Ñ‰Ó€Ñ Ð¿Ñ‰Ó€Ñ‹Ð½Ñƒ Ñ…ÑƒÐ¸Ñ‚Ñ‹Ð½Ñ‹Ð³ÑŠÑ ÑƒÐ¸Ó€Ñкъым.',
@@ -980,6 +1012,9 @@ $1",
'grouppage-sysop' => '{{ns:project}}:ТхьÑмадÑÑ…ÑÑ€',
+# Special:Log/newusers
+'newuserlogpage' => 'ЦӀыхухÑÑ‚Ñ…Ñм Ñ Ñ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
+
# User rights log
'rightslog' => 'Ð¥Ñтым Ð¿Ó€Ð°Ð»ÑŠÑ Ð¸Ó€ÑÑ…Ñм Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
@@ -1076,9 +1111,6 @@ $1",
# Special:LinkSearch
'linksearch' => 'КІуÑцІ техьÑпІÑÑ…ÑÑ€',
-# Special:Log/newusers
-'newuserlogpage' => 'ЦӀыхухÑÑ‚Ñ…Ñм Ñ Ñ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ‚Ñ…Ñ‹Ð»ÑŠ',
-
# Special:ListGroupRights
'listgrouprights-members' => '(гупым и тхылъ)',
diff --git a/languages/messages/MessagesKhw.php b/languages/messages/MessagesKhw.php
index 84a98f46..b8a1b062 100644
--- a/languages/messages/MessagesKhw.php
+++ b/languages/messages/MessagesKhw.php
@@ -159,7 +159,6 @@ $messages = array(
'qbbrowse' => 'Browse/تصÙّح',
'qbedit' => 'ترمیم',
'qbpageoptions' => 'Ú¾ÛŒÛ ØµÙØ­Û',
-'qbpageinfo' => 'Ù…ÙÛوم',
'qbmyoptions' => 'Ù…Û ØµÙحات',
'qbspecialpages' => 'خاص صÙحات',
'faq' => 'عام معلومات',
@@ -394,10 +393,7 @@ MySQL جواب٠خطاء پرائے "$3: $4"',
# Login and logout pages
'logouttext' => "'''ھنیسے تو خارج بیتی آسوس'''<br />
-تو Ø®ÙÛŒ الاسم {{SITENAME}} استعمال جاری لاکھیکو بوس، یا Ø¯ÙˆØ¨Ø§Ø±Û Ú¾ÛŒÛ Ù†Ø§Ù…Ùˆ یا مختل٠نامان سورا داخل دی بیکو بوس۔ Ú¾ÛŒÛ ÛŒØ§Ø¯ آوری کورے Ú©Û Ø§ÛŒ کما صÙحات ھش [[Special:UserLogin|دوباری لاگن بوس]] غیچھی گونی Ú©Û ØªÙˆ ھنیسے خارج نو بیتی آسوس، Ú©Ù„Û Ù¾Øª Ú©Û ØªÙˆ تان تÙØµØ­Û (براؤزرو) ابطن (cache) صا٠نوکوروس۔\",",
-'welcomecreation' => '== رحمت عزیز چترالی تتے خوشان گیے ریران، $1 ! ==
-
-ØªÛ Ú©Ú¾Ø§ØªÛ Ø³Ø§ÙˆØ²ÛŒÙ†Ùˆ بیتی شیر تو تان [[Special:Preferences|{{SITENAME}} ترجیحات]]Ù† مرتب کوریکو مو روخڅے.',
+تو Ø®ÙÛŒ الاسم {{SITENAME}} استعمال جاری لاکھیکو بوس، یا Ø¯ÙˆØ¨Ø§Ø±Û Ú¾ÛŒÛ Ù†Ø§Ù…Ùˆ یا مختل٠نامان سورا داخل دی بیکو بوس۔ Ú¾ÛŒÛ ÛŒØ§Ø¯ آوری کورے Ú©Û Ø§ÛŒ کما صÙحات ھش <span class='plainlinks'>[\$1 دوباری لاگن بوس]</span> غیچھی گونی Ú©Û ØªÙˆ ھنیسے خارج نو بیتی آسوس، Ú©Ù„Û Ù¾Øª Ú©Û ØªÙˆ تان تÙØµØ­Û (براؤزرو) ابطن (cache) صا٠نوکوروس۔\",",
'yourname' => 'اسم٠رکنیت',
'yourpassword' => 'کلمۂ شناخت(پاسورڈ)',
'yourpasswordagain' => 'کلمۂ شناخت(پاسورڈو)Ø¯ÙˆØ¨Ø§Ø±Û Ù†ÛŒÙˆÛŒØ´Û’',
@@ -570,6 +566,9 @@ MySQL جواب٠خطاء پرائے "$3: $4"',
'moveddeleted-notice' => 'Ú¾ÛŒÛ Ø§ÛŒ Ø­Ø°Ù Ø´Ø¯Û ØµÙØ­Û Ø´ÛŒØ±.
صÙحو نوشتۂ حذ٠شدگی Ùˆ منتقلی ذیلا Ø¨Ø·ÙˆØ±Ù Ø­ÙˆØ§Ù„Û Ø¯ÛŒÙˆÙ†Ùˆ بویان.',
+# Content models
+'content-model-javascript' => 'جاوا اسکرپٹ',
+
# Parser/template warnings
'post-expand-template-inclusion-warning' => "'''خبردار:''' سانچو سایز بو لوٹ شیر.
بعضی Ø³Ø§Ù†Ú†Û Ø´Ø§Ù…Ù„ نو بونی.",
@@ -702,9 +701,11 @@ HTML tags لوڑے.',",
'right-upload' => 'Ùائل انÚاوے',
'right-delete' => 'صÙحان ضائع کورے',
+# Special:Log/newusers
+'newuserlogpage' => 'نوشتۂ آمد صارÙ',
+
# User rights log
'rightslog' => 'یوزروت مختص Ø´Ø¯Û Ø­Ù‚ÙˆÙ‚',
-'rightsnone' => '(نو)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'Ú¾ÛŒÛ ØµÙحا ایڈیٹنگ کورے',
@@ -852,9 +853,6 @@ HTML tags لوڑے.',",
'linksearch-ok' => 'Search/تلاش',
'linksearch-line' => '$1 مربوط شیر $2 ری',
-# Special:Log/newusers
-'newuserlogpage' => 'نوشتۂ آمد صارÙ',
-
# Special:ListGroupRights
'listgrouprights-members' => 'ممبارانن Ùھرست',
@@ -922,7 +920,7 @@ HTML tags لوڑے.',",
'blanknamespace' => '(مرکز)',
# Contributions
-'contributions' => 'صارÙÙˆ حصÛ',
+'contributions' => ' $1 صارÙÙˆ حصÛ',
'contributions-title' => '$1 صارÙÙˆ حصÛ',
'mycontris' => 'Ù…Û Ø­ØµÛ',
'contribsub2' => 'براۓ $1 ($2)',
@@ -1144,6 +1142,9 @@ HTML tags لوڑے.',",
# Special:ComparePages
'compare-page1' => 'صÙØ­Û 1',
+# New logging system
+'rightsnone' => '(نو)',
+
# Feedback
'feedback-message' => 'پیغام',
diff --git a/languages/messages/MessagesKiu.php b/languages/messages/MessagesKiu.php
index 5158484d..9c378808 100644
--- a/languages/messages/MessagesKiu.php
+++ b/languages/messages/MessagesKiu.php
@@ -198,7 +198,6 @@ $messages = array(
'qbbrowse' => 'Çım ra viarne',
'qbedit' => 'Bıvurne',
'qbpageoptions' => 'Na pele',
-'qbpageinfo' => 'Gire',
'qbmyoptions' => 'Pelê mı',
'qbspecialpages' => 'Pelê xısusiy',
'faq' => 'PZP (Persê ke zaf perşinê)',
@@ -447,11 +446,8 @@ Sebebê ho ''$2'' dero.",
# Login and logout pages
'logouttext' => "'''Sıma nıka cı ra veciyê.'''
-Sıma şikinê dızdêni {{SITENAME}} de dewam kerê, ya jê eyni karberi ya ki jê jüyê de bini [[Special:UserLogin|oncia cıkuyê]].
+Sıma şikinê dızdêni {{SITENAME}} de dewam kerê, ya jê eyni karberi ya ki jê jüyê de bini <span class='plainlinks'>[$1 oncia cıkuyê]</span>.
Beno ke taê peli sıma hona cıkote asnenê, hata ke sıma ''browser cache''ê ho kerd pak.",
-'welcomecreation' => '== Xêr amê, $1! ==
-Hesabê sıma vıraciya.
-Vurnaena [[Special:Preferences|melumatanê {{SITENAME}}]] ho vira mekerê.',
'yourname' => 'Namê karberi:',
'yourpassword' => 'Parola:',
'yourpasswordagain' => 'Parola tekrar ke:',
@@ -848,8 +844,8 @@ Diqet kerê, beno ke tedeestê {{SITENAME}} uza endi rozane niyê.",
'prefs-files' => 'Dosyey',
'youremail' => 'E-poste:',
'username' => 'Namê karberi:',
-'uid' => 'Kamiya karberi:',
-'prefs-memberingroups' => 'Ezaê de {{PLURAL:$1|gruba|grubunê}}:',
+'uid' => 'Kamiya {{GENDER:$1|karberi}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|grubu}}:',
'yourrealname' => 'Namo rastıkên:',
'yourlanguage' => 'Zon:',
'yourvariant' => 'Varyant:',
@@ -909,11 +905,12 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
'right-delete' => 'Pelu bestere',
'right-undelete' => 'Esterıtena na pele peyser bıcê',
+# Special:Log/newusers
+'newuserlogpage' => 'Qeydê karberiê newey',
+
# User rights log
'rightslog' => 'Qeydê hequnê karberi',
'rightslogtext' => 'No jü qeydê vurnaisê hequnê karberio.',
-'rightslogentry' => 'selahiyetê $1i $2 ra vurniya be $3i',
-'rightsnone' => '(qet jü)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'na pele bıwane',
@@ -1131,9 +1128,6 @@ Cêr [$2 pela arezekerdena dosya de] arezekerdene asnina.',
# Special:ActiveUsers
'activeusers' => 'Lista karberunê fealu',
-# Special:Log/newusers
-'newuserlogpage' => 'Qeydê karberiê newey',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Kome',
'listgrouprights-rights' => 'Heqi',
@@ -1258,7 +1252,7 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
'blanknamespace' => '(Ser)',
# Contributions
-'contributions' => 'İştırakê karberi',
+'contributions' => 'İştıraqê {{GENDER:$1|karber}}i',
'contributions-title' => '$1 de iştırakê karberi',
'mycontris' => 'İştıraqi',
'contribsub2' => 'Serba $1 ($2)',
@@ -1607,4 +1601,7 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
'compare-page1' => 'Pele 1',
'compare-page2' => 'Pele 2',
+# New logging system
+'rightsnone' => '(qet jü)',
+
);
diff --git a/languages/messages/MessagesKk_arab.php b/languages/messages/MessagesKk_arab.php
index 86eca65a..8db1e092 100644
--- a/languages/messages/MessagesKk_arab.php
+++ b/languages/messages/MessagesKk_arab.php
@@ -520,7 +520,6 @@ $messages = array(
'qbbrowse' => 'شولۋ',
'qbedit' => 'وڭدەۋ',
'qbpageoptions' => 'بۇل بەت',
-'qbpageinfo' => 'اينالا',
'qbmyoptions' => 'بەتتەرىم',
'qbspecialpages' => 'ارنايى بەتتەر',
'faq' => 'ٴجىيى قويىلعان ساۋالدار',
@@ -727,9 +726,6 @@ $2',
جۇيەگە كىرمەستەن {{SITENAME}} جوباسىن پايدالانۋىن جالعاستىرا الاسىز, نەمەسە ٴدال سول نە وزگە قاتىسۋشى بوپ قايتا كرۋىڭىز مۇمكىن.
اڭعارتپا: كەيبىر بەتتەر شولعىشىڭىزدىڭ بۇركەمەسىن تازارتقانشا دەيىن ٴالى دە كىرپ قالعانىڭىزداي كورىنۋى مۇمكىن.",
-'welcomecreation' => '== قوش كەلدىڭىز, $1! ==
-جاڭا تىركەلگىڭىز جاسالدى.
-{{SITENAME}} باپتالىمدارىڭىزدى وزگەرتۋىن ۇمىتپاڭىز.',
'yourname' => 'قاتىسۋشى اتىڭىز:',
'yourpassword' => 'قۇپىييا ٴسوزىڭىز:',
'yourpasswordagain' => 'قۇپىييا ٴسوزدى قايتالاڭىز:',
@@ -962,7 +958,6 @@ IP مەكەنجايىڭىز بۇل بەتتىڭ تۇزەتۋ تارىيحىندØ
'template-protected' => '(قورعالعان)',
'template-semiprotected' => '(جارتىلاي قورعالعان)',
'hiddencategories' => 'بۇل بەت $1 جاسىرىن ساناتتىڭ مۇشەسى:',
-'nocreatetitle' => 'بەتتى باستاۋ شەكتەلگەن',
'nocreatetext' => '{{SITENAME}} جوباسىندا جاڭا بەت باستاۋى شەكتەلگەن.
كەرى قايتىپ بار بەتتى وڭدەۋىڭىزگە بولادى, نەمەسە [[Special:UserLogin|كىرۋىڭىزگە نە تىركەلۋىڭىزگە]] بولادى.',
'nocreate-loggedin' => '{{SITENAME}} جوباسىندا جاڭا بەت باستاۋ رۇقساتىڭىز جوق.',
@@ -1308,11 +1303,13 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
'right-userrights-interwiki' => 'باسقا ۇىيكىيلەردەگى قاتىسۋشىلاردىڭ قۇقىقتارىن وڭدەۋ',
'right-siteadmin' => 'دەرەكقوردى قۇلىپتاۋ جانە قۇلىپتاۋىن ٴوشىرۋ',
+# Special:Log/newusers
+'newuserlogpage' => 'تىركەلۋ جۋرنالى',
+'newuserlogpagetext' => 'بۇل قاتىسۋشى تىركەلگى جاساۋ جۋرنالى',
+
# User rights log
'rightslog' => 'قاتىسۋشى قۇقىقتارى جۋرنالى',
'rightslogtext' => 'بۇل قاتىسۋشى قۇقىقتارىن وزگەرتۋ جۋرنالى.',
-'rightslogentry' => '$1 كىرگەن توپتارىن $2 دەگەننەن $3 دەگەنگە وزگەرتتى',
-'rightsnone' => '(ەشقانداي)',
# Recent changes
'nchanges' => '$1 وزگەرىس',
@@ -1687,10 +1684,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'كورسەت',
'listusers-noresult' => 'قاتىسۋشى تابىلعان جوق.',
-# Special:Log/newusers
-'newuserlogpage' => 'تىركەلۋ جۋرنالى',
-'newuserlogpagetext' => 'بۇل قاتىسۋشى تىركەلگى جاساۋ جۋرنالى',
-
# Special:ListGroupRights
'listgrouprights' => 'قاتىسۋشى توبى قۇقىقتارى',
'listgrouprights-summary' => 'كەلەسى تىزىمدە بۇل ۋىيكىيدە تاعايىندالعان قاتىسۋشى قۇقىقتارى (بايلانىستى قاتىناۋ قۇقىقتارىمەن بىرگە) كورسەتىلەدى.
@@ -1754,11 +1747,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'enotif_mailer' => '{{SITENAME}} ەسكەرتۋ حات جىبەرۋ قىزمەتى',
'enotif_reset' => 'بارلىق بەت كەلىپ-كەتىلدى دەپ بەلگىلە',
-'enotif_newpagetext' => 'مىناۋ جاڭا بەت.',
'enotif_impersonal_salutation' => '{{SITENAME}} قاتىسۋشىسى',
-'changed' => 'وزگەرتتى',
-'created' => 'باستادى',
-'enotif_subject' => '{{SITENAME}} جوباسىندا $PAGEEDITOR $PAGETITLE اتاۋلى بەتتى $CHANGEDORCREATED',
'enotif_lastvisited' => 'سوڭعى كەلىپ-كەتۋىڭىزدەن بەرى بولعان وزگەرىستەر ٴۇشىن $1 دەگەندى قاراڭىز.',
'enotif_lastdiff' => 'وسى وزگەرىس ٴۇشىن $1 دەگەندى قاراڭىز.',
'enotif_anon_editor' => 'تىركەلگىسىز قاتىسۋشى $1',
@@ -1786,6 +1775,8 @@ $NEWPAGE
سىن-پىكىر بەرۋ جانە بىلايعى جاردەم الۋ ٴۇشىن:
{{canonicalurl:{{{{ns:mediawiki}}:Helppage}}}}',
+'created' => 'باستادى',
+'changed' => 'وزگەرتتى',
# Delete
'deletepage' => 'بەتتى جويۋ',
@@ -2905,5 +2896,6 @@ $5
# New logging system
'revdelete-restricted' => 'اكىمشىلەرگە تىيىمدار قولدادى',
'revdelete-unrestricted' => 'اكىمشىلەردەن تىيىمداردى الاستادى',
+'rightsnone' => '(ەشقانداي)',
);
diff --git a/languages/messages/MessagesKk_cyrl.php b/languages/messages/MessagesKk_cyrl.php
index 35e7635f..3dd54eb3 100644
--- a/languages/messages/MessagesKk_cyrl.php
+++ b/languages/messages/MessagesKk_cyrl.php
@@ -503,7 +503,6 @@ $messages = array(
'qbbrowse' => 'Шолу',
'qbedit' => 'Өңдеу',
'qbpageoptions' => 'Бұл бет',
-'qbpageinfo' => 'Ðйнала',
'qbmyoptions' => 'Беттерім',
'qbspecialpages' => 'Ðрнайы беттер',
'faq' => 'Жиі қойылған Ñауалдар',
@@ -756,11 +755,8 @@ $2',
# Login and logout pages
'logouttext' => "'''Жүйеден шықтыңыз.'''
-Жүйеге кірмеÑтен де {{SITENAME}} жобаÑын пайдалана алаÑыз, немеÑе баÑÒ“Ñ‹ не өзге қатыÑушы ретінде жүйеге [[Special:UserLogin|қайта кіруіңізге]] болады.
+Жүйеге кірмеÑтен де {{SITENAME}} жобаÑын пайдалана алаÑыз, немеÑе баÑÒ“Ñ‹ не өзге қатыÑушы ретінде жүйеге <span class='plainlinks'>[$1 қайта кіруіңізге]</span> болады.
Ðңғартпа: Кейбір беттер шолғышыңыздың кÑшін тазартқанша әлі де жүйеге кіріп отырғаныңыздай көрінуі мүмкін.",
-'welcomecreation' => '== Қош келдіңіз, $1! ==
-Жаңа тіркелгіңіз жаÑалды.
-Өзіңіздің [[Special:Preferences|жеке баптауларыңызды]] өзгертуді ұмытпаңыз.',
'yourname' => 'ҚатыÑушы аты:',
'yourpassword' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөз:',
'yourpasswordagain' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзді қайталаңыз:',
@@ -1057,7 +1053,6 @@ IP-мекенжайыңыз бұл беттің түзету тарихында
'template-protected' => '(қорғалған)',
'template-semiprotected' => '(жартылай қорғалған)',
'hiddencategories' => 'Бұл бет $1 жаÑырын Ñанаттың мүшеÑÑ–:',
-'nocreatetitle' => 'Бетті баÑтау шектелген',
'nocreatetext' => '{{SITENAME}} жобаÑында жаңа бет баÑтауы шектелген.
Кері қайтып бар бетті өңдеуіңізге болады, немеÑе [[Special:UserLogin|кіруіңізге не тіркелуіңізге]] болады.',
'nocreate-loggedin' => 'Жаңа бет баÑтауға Ñ€Ò±Ò›Ñатыңыз жоқ.',
@@ -1496,11 +1491,13 @@ $3 келтірілген Ñебебі: ''$2''",
'right-userrights-interwiki' => 'БаÑқа үикилердегі қатыÑушылардың құқықтарын өңдеу',
'right-siteadmin' => 'Дерекқорды құлыптау және құлыптауын өшіру',
+# Special:Log/newusers
+'newuserlogpage' => 'Тіркелу журналы',
+'newuserlogpagetext' => 'Бұл қатыÑушы тіркелгі жаÑау журналы',
+
# User rights log
'rightslog' => 'ҚатыÑушы құқықтары журналы',
'rightslogtext' => 'Бұл қатыÑушы құқықтарын өзгерту журналы.',
-'rightslogentry' => '$1 кірген топтарын $2 дегеннен $3 дегенге өзгертті',
-'rightsnone' => '(ешқандай)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ОÑÑ‹ бетті оқу',
@@ -1921,10 +1918,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'КөрÑет',
'listusers-noresult' => 'ҚатыÑушы табылған жоқ.',
-# Special:Log/newusers
-'newuserlogpage' => 'Тіркелу журналы',
-'newuserlogpagetext' => 'Бұл қатыÑушы тіркелгі жаÑау журналы',
-
# Special:ListGroupRights
'listgrouprights' => 'ҚатыÑушы тобы құқықтары',
'listgrouprights-summary' => 'КелеÑÑ– тізімде бұл уикиде тағайындалған қатыÑушы құқықтары (байланыÑÑ‚Ñ‹ қатынау құқықтарымен бірге) көрÑетіледі.
@@ -1991,11 +1984,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'enotif_mailer' => '{{SITENAME}} еÑкерту хат жіберу қызметі',
'enotif_reset' => 'Барлық бет келіп-кетілді деп белгіле',
-'enotif_newpagetext' => 'Мынау жаңа бет.',
'enotif_impersonal_salutation' => '{{SITENAME}} қатыÑушыÑÑ‹',
-'changed' => 'өзгертті',
-'created' => 'баÑтады',
-'enotif_subject' => '{{SITENAME}} жобаÑында $PAGEEDITOR $PAGETITLE атаулы бетті $CHANGEDORCREATED',
'enotif_lastvisited' => 'Соңғы келіп-кетуіңізден бері болған өзгеріÑтер үшін $1 дегенді қараңыз.',
'enotif_lastdiff' => 'ОÑÑ‹ Ó©Ð·Ð³ÐµÑ€Ñ–Ñ Ò¯ÑˆÑ–Ð½ $1 дегенді қараңыз.',
'enotif_anon_editor' => 'тіркелгіÑіз қатыÑушы $1',
@@ -2023,6 +2012,8 @@ $NEWPAGE
Сын-пікір беру және былайғы жәрдем алу үшін:
{{canonicalurl:{{{{ns:mediawiki}}:Helppage}}}}',
+'created' => 'баÑтады',
+'changed' => 'өзгертті',
# Delete
'deletepage' => 'Бетті жою',
@@ -3189,7 +3180,7 @@ $5
'logentry-newusers-create' => '$1 жаңадан аккаунт тіркеді',
'logentry-newusers-create2' => '$1 $3 деген аккаунт тіркеді',
'logentry-newusers-autocreate' => '$1 аккаунты автоматты түрде тіркелді',
-'newuserlog-byemail' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөз e-mail арқылы жіберілді',
+'rightsnone' => '(ешқандай)',
# Search suggestions
'searchsuggest-search' => 'Іздеу',
diff --git a/languages/messages/MessagesKk_latn.php b/languages/messages/MessagesKk_latn.php
index ede8e6a3..608ad71f 100644
--- a/languages/messages/MessagesKk_latn.php
+++ b/languages/messages/MessagesKk_latn.php
@@ -483,7 +483,6 @@ $messages = array(
'qbbrowse' => 'Åžolw',
'qbedit' => 'Öñdew',
'qbpageoptions' => 'Bul bet',
-'qbpageinfo' => 'Aýnala',
'qbmyoptions' => 'Betterim',
'qbspecialpages' => 'Arnaýı better',
'faq' => 'Jïi qoýılğan sawaldar',
@@ -690,9 +689,6 @@ Keltirilgen sebebi: ''$2''.",
Jüýege kirmesten {{SITENAME}} jobasın paýdalanwın jalğastıra alasız, nemese däl sol ne özge qatıswşı bop qaýta krwiñiz mümkin.
Añğartpa: Keýbir better şolğışıñızdıñ bürkemesin tazartqanşa deýin äli de kirp qalğanıñızdaý körinwi mümkin.",
-'welcomecreation' => '== Qoş keldiñiz, $1! ==
-Jaña tirkelgiñiz jasaldı.
-{{SITENAME}} baptalımdarıñızdı özgertwin umıtpañız.',
'yourname' => 'Qatıswşı atıñız:',
'yourpassword' => 'Qupïya söziñiz:',
'yourpasswordagain' => 'Qupïya sözdi qaýtalañız:',
@@ -925,7 +921,6 @@ Keýin qoldanw üşin mätändi qýıp alıp jäne qoýıp, mätin faýlına saq
'template-protected' => '(qorÄŸalÄŸan)',
'template-semiprotected' => '(jartılaý qorğalğan)',
'hiddencategories' => 'Bul bet $1 jasırın sanattıñ müşesi:',
-'nocreatetitle' => 'Betti bastaw ÅŸektelgen',
'nocreatetext' => '{{SITENAME}} jobasında jaña bet bastawı şektelgen.
Keri qaýtıp bar betti öñdewiñizge boladı, nemese [[{{#special:Userlogin}}|kirwiñizge ne tirkelwiñizge]] boladı.',
'nocreate-loggedin' => '{{SITENAME}} jobasında jaña bet bastaw ruqsatıñız joq.',
@@ -1271,11 +1266,13 @@ Eger bunı jetistirwdi tañdasañız, bul tüzetwiñizdiñ awtorlığın anıqta
'right-userrights-interwiki' => 'Basqa üïkïlerdegi qatıswşılardıñ quqıqtarın öñdew',
'right-siteadmin' => 'Derekqordı qulıptaw jäne qulıptawın öşirw',
+# Special:Log/newusers
+'newuserlogpage' => 'Tirkelw jwrnalı',
+'newuserlogpagetext' => 'Bul qatıswşı tirkelgi jasaw jwrnalı',
+
# User rights log
'rightslog' => 'Qatıswşı quqıqtarı jwrnalı',
'rightslogtext' => 'Bul qatıswşı quqıqtarın özgertw jwrnalı.',
-'rightslogentry' => '$1 kirgen toptarın $2 degennen $3 degenge özgertti',
-'rightsnone' => '(eşqandaý)',
# Recent changes
'nchanges' => '$1 özgeris',
@@ -1650,10 +1647,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'Körset',
'listusers-noresult' => 'Qatıswşı tabılğan joq.',
-# Special:Log/newusers
-'newuserlogpage' => 'Tirkelw jwrnalı',
-'newuserlogpagetext' => 'Bul qatıswşı tirkelgi jasaw jwrnalı',
-
# Special:ListGroupRights
'listgrouprights' => 'Qatıswşı tobı quqıqtarı',
'listgrouprights-summary' => 'Kelesi tizimde bul wïkïde tağaýındalğan qatıswşı quqıqtarı (baýlanıstı qatınaw quqıqtarımen birge) körsetiledi.
@@ -1717,11 +1710,7 @@ Bul bettiñ jäne baýlanıstı talqılaw betiniñ keleşektegi özgeristeri mı
'enotif_mailer' => '{{SITENAME}} eskertw xat jiberw qızmeti',
'enotif_reset' => 'Barlıq bet kelip-ketildi dep belgile',
-'enotif_newpagetext' => 'Mınaw jaña bet.',
'enotif_impersonal_salutation' => '{{SITENAME}} qatıswşısı',
-'changed' => 'özgertti',
-'created' => 'bastadı',
-'enotif_subject' => '{{SITENAME}} jobasında $PAGEEDITOR $PAGETITLE atawlı betti $CHANGEDORCREATED',
'enotif_lastvisited' => 'Soñğı kelip-ketwiñizden beri bolğan özgerister üşin $1 degendi qarañız.',
'enotif_lastdiff' => 'Osı özgeris üşin $1 degendi qarañız.',
'enotif_anon_editor' => 'tirkelgisiz qatıswşı $1',
@@ -1749,6 +1738,8 @@ Baqılaw tizimiñizdiñ baptawlırın özgertw üşin, mında kelip-ketiñiz:
Sın-pikir berw jäne bılaýğı järdem alw üşin:
{{canonicalurl:{{{{ns:mediawiki}}:Helppage}}}}',
+'created' => 'bastadı',
+'changed' => 'özgertti',
# Delete
'deletepage' => 'Betti joyw',
@@ -2864,5 +2855,6 @@ Swretter tolıq ajıratılımdığımen körsetiledi, basqa faýl türlerine qat
# New logging system
'revdelete-restricted' => 'äkimşilerge tïımdar qoldadı',
'revdelete-unrestricted' => 'äkimşilerden tïımdardı alastadı',
+'rightsnone' => '(eşqandaý)',
);
diff --git a/languages/messages/MessagesKm.php b/languages/messages/MessagesKm.php
index 82417e5e..5598a9c1 100644
--- a/languages/messages/MessagesKm.php
+++ b/languages/messages/MessagesKm.php
@@ -195,7 +195,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__បង្ážáŸ†áž˜áž¶ážáž·áž€áž¶__', '__បង្ážáŸ†áž”ញ្ជីអážáŸ’ážáž”áž‘__', '__បង្ážáŸ†áž¢áŸ„យបង្ហាញមាážáž·áž€áž¶__', '__FORCETOC__' ),
'toc' => array( '0', '__មាážáž·áž€áž¶__', '__បញ្ជីអážáŸ’ážáž”áž‘__', '__TOC__' ),
'noeditsection' => array( '0', '__ផ្នែកមិនážáŸ’រូវកែប្រែ__', '__មិនមានផ្នែកកែប្រែ__', '__លាក់ផ្នែកកែប្រែ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__លាក់បឋមកážáž¶__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'ážáŸ‚áž“áŸáŸ‡', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonthname' => array( '1', 'ឈ្មោះážáŸ‚áž“áŸáŸ‡', 'CURRENTMONTHNAME' ),
'currentday' => array( '1', 'ážáŸ’ងៃនáŸáŸ‡', 'CURRENTDAY' ),
@@ -409,7 +408,6 @@ $messages = array(
'qbbrowse' => 'រាវរក',
'qbedit' => 'កែប្រែ',
'qbpageoptions' => 'ទំពáŸážšáž“áŸáŸ‡',
-'qbpageinfo' => 'áž–áŸážáŸŒáž˜áž¶áž“ទំពáŸážš',
'qbmyoptions' => 'ទំពáŸážšážšáž”ស់ážáŸ’ញុំ',
'qbspecialpages' => 'ទំពáŸážšáž–ិសáŸážŸáŸ—',
'faq' => 'សំណួរដែលសួរញឹកញាប់',
@@ -669,12 +667,11 @@ $2',
# Login and logout pages
'logouttext' => "'''ឥឡូវនáŸáŸ‡áž›áŸ„កអ្នកបានកážáŸ‹ážˆáŸ’មោះចáŸáž‰áž–ីគណនីរបស់លោកអ្នកហើយ។'''
-អ្នកអាចបន្ážáž”្រើប្រាស់{{SITENAME}}ក្នុងភាពអនាមិក ឬ [[Special:UserLogin|កážáŸ‹ážˆáŸ’មោះចូលម្ដងទៀáž]]ក្នុងនាមជាអ្នកប្រើប្រាស់ដដែលឬផ្សáŸáž„ទៀážáŸ”
+អ្នកអាចបន្ážáž”្រើប្រាស់{{SITENAME}}ក្នុងភាពអនាមិក ឬ <span class='plainlinks'>[$1 កážáŸ‹ážˆáŸ’មោះចូលម្ដងទៀáž]</span>ក្នុងនាមជាអ្នកប្រើប្រាស់ដដែលឬផ្សáŸáž„ទៀážáŸ”
-សូមកážáŸ‹ážŸáž˜áŸ’គាល់ážáž¶áž‘ំពáŸážšáž˜áž½áž™áž…ំនួនប្រហែលជានៅážáŸ‚បង្ហាញដូចពáŸáž›áž›áŸ„កអ្នកកážáŸ‹ážˆáŸ’មោះចូលក្នុងគណនីរបស់លោកអ្នកដដែល។ ប្រសិនបើមានករណីនáŸáŸ‡áž€áž¾ážáž¡áž¾áž„ សូមសំអាហសážáž·áž—្ជាប់នៃកម្មវិធីរុករករបស់លោកអ្នក។",
-'welcomecreation' => '== សូមស្វាគមន០$1! ==
-
-គណនីរបស់អ្នកážáŸ’រូវបានបង្កើážáž áž¾áž™áŸ”
+សូមកážáŸ‹ážŸáŸ†áž‚ាល់ážáž¶áž‘ំពáŸážšáž˜áž½áž™áž…ំនួនប្រហែលជានៅážáŸ‚បង្ហាញដូចពáŸáž›áž›áŸ„កអ្នកកážáŸ‹ážˆáŸ’មោះចូលក្នុងគណនីរបស់លោកអ្នកដដែល។ ប្រសិនបើមានករណីនáŸáŸ‡áž€áž¾ážáž¡áž¾áž„ សូមសំអាហសážáž·áž—្ជាប់នៃកម្មវិធីរុករករបស់លោកអ្នក។",
+'welcomeuser' => 'សូមស្វាគមន០$1!',
+'welcomecreation-msg' => 'គណនីរបស់អ្នកážáŸ’រូវបានបង្កើážáž áž¾áž™áŸ”
កុំភ្លáŸáž…ផ្លាស់ប្ដូរ[[Special:Preferences|ចំណង់ចំណូលចិážáŸ’áž{{SITENAME}}]]របស់អ្នក។',
'yourname' => 'អážáŸ’ážáž“ាម៖',
'yourpassword' => 'ពាក្យសម្ងាážáŸ‹áŸ–',
@@ -699,7 +696,7 @@ $2',
'gotaccount' => "បើលោកអ្នកមានគណនីសម្រាប់ប្រើហើយ សូម'''$1'''។",
'gotaccountlink' => 'កážáŸ‹ážˆáŸ’មោះចូល',
'userlogin-resetlink' => 'ážáž¾áž¢áŸ’នកភ្លáŸáž…áž–áŸážáŸŒáž˜áž¶áž“លម្អិážážŸáž˜áŸ’រាប់កážáŸ‹ážˆáŸ’មោះចូលហើយ?',
-'createaccountmail' => 'ážáž¶áž˜ážšáž™áŸˆáž¢áŸŠáž¸áž˜áŸ‚áž›',
+'createaccountmail' => 'ប្រើប្រាស់ពាក្យសំងាážáŸ‹áž–្រៀងបណ្ដោះអាសនុ្ន រួចផ្ញើវាទៅកាន់អាសយដ្ឋានអ៊ីមែលážáž¶áž„ក្រោម',
'createaccountreason' => 'មូលហáŸážáž»áŸ–',
'badretype' => 'ពាក្យសម្ងាážáŸ‹ážŠáŸ‚លអ្នកបានវាយបញ្ចូលនោះ គឺមិនស៊ីគ្នាទáŸáŸ”',
'userexists' => 'អážáŸ’ážáž“ាមដែលអ្នកបានវាយបញ្ចូលមានគáŸáž”្រើហើយ។
@@ -858,6 +855,7 @@ $2
'changeemail-oldemail' => 'អាសយដ្ឋានអ៊ីមែលបច្ចុប្បន្ន៖',
'changeemail-newemail' => 'អាសយដ្ឋានអ៊ីមែលážáŸ’មី៖',
'changeemail-none' => '(គ្មាន​)',
+'changeemail-password' => 'ពាក្យសំងាážáŸ‹{{SITENAME}}របស់អ្នក:',
'changeemail-submit' => 'ផ្លាស់ប្ដូរអ៊ីមែល',
'changeemail-cancel' => 'បោះបង់',
@@ -1051,7 +1049,6 @@ $2
'template-protected' => '(ážáŸ’រូវបានការពារ)',
'template-semiprotected' => '(ážáŸ’រូវបានការពារពាក់កណ្ážáž¶áž›)',
'hiddencategories' => 'ទំពáŸážšáž“áŸáŸ‡ážŸáŸ’ážáž·ážáž“ៅក្នុង {{PLURAL:$1|ចំណាážáŸ‹ážáŸ’នាក់ក្រុមដែលážáŸ’រូវបានបិទបាំងមួយ|ចំណាážáŸ‹ážáŸ’នាក់ក្រុមដែលážáŸ’រូវបានបិទបាំងចំនួន$1}}:',
-'nocreatetitle' => 'ការបង្កើážáž‘ំពáŸážšâ€‹ážáŸ’រូវបានកម្រិáž',
'nocreatetext' => '{{SITENAME}} បានដាក់កំហិážáž›áž‘្ធភាពបង្កើážáž‘ំពáŸážšážáŸ’មី ។
អ្នកអាចážáŸ’រឡប់ក្រោយ áž“áž·áž„ កែប្រែទំពáŸážšáž˜áž¶áž“ស្រាប់ ឬ [[Special:UserLogin|កážáŸ‹ážˆáŸ’មោះចូលឬបង្កើážáž‚ណនី]]។',
'nocreate-loggedin' => 'អ្នកគ្មានការអនុញ្ញាážâ€‹áž±áŸ’យបង្កើážáž‘ំពáŸážšážáŸ’មី​ទáŸáŸ”',
@@ -1077,6 +1074,10 @@ $2
ទំពáŸážšáž“áŸáŸ‡áž˜áž¶áž“រួចហើយ។',
'defaultmessagetext' => 'អážáŸ’ážáž”ទសារážáž¶áž˜áž›áŸ†áž“ាំដើម',
+# Content models
+'content-model-wikitext' => 'អážáŸ’ážáž”ទវិគី',
+'content-model-text' => 'អážáŸ’ážáž”ទសុទ្ធ',
+
# Parser/template warnings
'expensive-parserfunction-warning' => "'''ប្រយáŸážáŸ’ន៖''' ទំពáŸážšáž“áŸáŸ‡áž˜áž¶áž“ប្រើអនុគមនáŸáž‰áŸ‚កច្រើនពáŸáž€áž áž¾áž™áŸ”
@@ -1422,9 +1423,9 @@ $1",
'prefs-emailconfirm-label' => 'បញ្ជាក់ទទួលស្គាល់អ៊ីមែល៖',
'prefs-textboxsize' => 'ទំហំរបស់ផ្ទាំងកែប្រែទំពáŸážš',
'youremail' => 'អ៊ីមែល៖',
-'username' => 'អážáŸ’ážáž“ាម៖',
-'uid' => 'អážáŸ’ážáž›áŸážáŸ–',
-'prefs-memberingroups' => 'សមាជិកក្នុង{{PLURAL:$1|ក្រុម|ក្រុម}}៖',
+'username' => '{{GENDER:$1|អážáŸ’ážáž“ាម}}៖',
+'uid' => 'អážáŸ’ážáž›áŸáž{{GENDER:$1|អ្នកប្រើប្រាស់}}៖',
+'prefs-memberingroups' => '{{GENDER:$2|សមាជិក}}ក្នុង{{PLURAL:$1|ក្រុម|ក្រុម}}៖',
'prefs-registration' => 'កាលបរិច្ឆáŸáž‘ចុះឈ្មោះ៖',
'yourrealname' => 'ឈ្មោះពិážáŸ–',
'yourlanguage' => 'ភាសា៖',
@@ -1570,12 +1571,13 @@ $1",
'right-sendemail' => 'ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើដទៃ',
'right-passwordreset' => 'មើលអ៊ីមែលសំរាប់កំណážáŸ‹áž–ាក្យសម្ងាážáŸ‹áž¡áž¾áž„វិញ',
+# Special:Log/newusers
+'newuserlogpage' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការបង្កើážáž‚ណនី',
+'newuserlogpagetext' => 'áž“áŸáŸ‡áž‡áž¶áž€áŸ†ážŽážáŸ‹áž áŸážáž»áž“ៃការបង្កើážáž¢áŸ’នកប្រើប្រាស់។',
+
# User rights log
'rightslog' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការប្ážáž¼ážšážŸáž·áž‘្ធិអ្នកប្រើប្រាស់',
'rightslogtext' => 'áž“áŸáŸ‡â€‹áž‡áž¶â€‹áž€áŸ†ážŽážáŸ‹áž áŸážáž»áž“ៃបំលាស់ប្ដូរចំពោះកាប្ដូរក្រុមសមាជិកភាព​របស់​អ្នកប្រើប្រាស់។',
-'rightslogentry' => 'បានប្ដូរក្រុមសមាជិកភាពសម្រាប់ $1 ពី $2 ទៅ $3',
-'rightslogentry-autopromote' => 'ážáŸ’រូវបានážáŸ†áž›áž¾áž„ážáŸ†ážŽáŸ‚ងដោយស្វáŸáž™áž”្រវážáŸ’ážáž·áž–ី $2 ទៅជា $3',
-'rightsnone' => '(áž‘áž‘áŸ)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'អានទំពáŸážšáž“áŸáŸ‡',
@@ -2169,9 +2171,9 @@ $1',
'linksearch-pat' => 'ស្វែងរកគំរូ៖',
'linksearch-ns' => 'លំហឈ្មោះ៖',
'linksearch-ok' => 'ស្វែងរក',
-'linksearch-text' => 'កូដពិសáŸážŸážŠáž¼áž…ជា "*.wikipedia.org" អាចប្រើបាន។
-ážáž˜áŸ’រូវអោយមានយ៉ាងហោចណាស់អោយមានដូម៉ែនកំរិážáž›áž¾áž‚០ឧទាហារណ០"*.org"។<br />
-ប្រូážáž¼ážáž¼áž›áž”្រើបាន៖ <code>$1</code> (កុំបន្ážáŸ‚មវាទាំងនáŸáŸ‡áž‘ៅក្នុងការស្វែងរករបស់អ្នកអោយសោះ)។',
+'linksearch-text' => 'Wildcards ដូចជា "*.wikipedia.org" អាចប្រើបាន។
+ážáŸ†ážšáž¼ážœáž¢áŸ„យមានយ៉ាងហោចណាស់អោយមានដូម៉ែនកំរិážáž›áž¾áž‚០ឧទាហរណ០"*.org"។<br />
+{{PLURAL:$2ប្រូážáž¼ážáž¼áž›|ប្រូážáž¼ážáž¼áž›}}ប្រើបាន៖ <code>$1</code> (ážáž¶áž˜áž›áŸ†áž“ាំដើមជា http:// ប្រសិនបើគ្មានបញ្ជាក់ប្រូážáž¼ážáž¼áž›)។',
'linksearch-line' => '$1បានážáž—្ជាប់ពី$2',
# Special:ListUsers
@@ -2189,10 +2191,6 @@ $1',
'activeusers-hidesysops' => 'លាក់អភិបាល',
'activeusers-noresult' => 'អ្នកប្រើប្រាស់​រកមិនឃើញ​។​',
-# Special:Log/newusers
-'newuserlogpage' => 'កំណážáŸ‹áž áŸážáž»áž“ៃការបង្កើážáž‚ណនី',
-'newuserlogpagetext' => 'áž“áŸáŸ‡áž‡áž¶áž€áŸ†ážŽážáŸ‹áž áŸážáž»áž“ៃការបង្កើážáž¢áŸ’នកប្រើប្រាស់។',
-
# Special:ListGroupRights
'listgrouprights' => 'សិទ្ធិនិងក្រុមអ្នកប្រើប្រាស់',
'listgrouprights-summary' => 'ážáž¶áž„ក្រោមនáŸáŸ‡áž‡áž¶áž”ញ្ជីរាយឈ្មោះក្រុមអ្នកប្រើប្រាស់ដែលបានកំណážáŸ‹áž‡áž¶áž˜áž½áž™áž“ឹងសិទ្ធិរបស់គáŸáž“ៅលើវិគីនáŸáŸ‡áŸ” មាន[[{{MediaWiki:Listgrouprights-helppage}}|áž–áŸážáŸŒáž˜áž¶áž“បន្ážáŸ‚ម]] អំពីសិទ្ធិផ្ទាល់ážáŸ’លួន។',
@@ -2285,11 +2283,7 @@ $1',
'enotif_mailer' => 'ភ្នាក់ងារផ្ញើអ៊ីមែលផ្ដល់ដំណឹងរបស់ {{SITENAME}}',
'enotif_reset' => 'កážáŸ‹ážŸáž˜áŸ’គាល់រាល់គ្រប់ទំពáŸážšážŠáŸ‚លបានចូលមើល',
-'enotif_newpagetext' => 'áž“áŸáŸ‡áž‡áž¶áž‘ំពáŸážšážáŸ’មី។',
'enotif_impersonal_salutation' => 'អ្នកប្រើប្រាស់ {{SITENAME}}',
-'changed' => 'បានផ្លាស់ប្ážáž¼ážš',
-'created' => 'បានបង្កើáž',
-'enotif_subject' => 'ទំពáŸážš $PAGETITLE នៃ {{SITENAME}} ážáŸ’រូវបាន $CHANGEDORCREATED ដោយ $PAGEEDITOR',
'enotif_lastvisited' => 'áž–áž·áž“áž·ážáŸ’áž™ $1 សម្រាប់គ្រប់បន្លាស់ប្ážáž¼ážšážáž¶áŸ†áž„ពីពáŸáž›áž…ូលមើលចុងក្រោយ។',
'enotif_lastdiff' => 'សូមពិនិážáŸ’áž™ $1 ដើម្បីមើលបំលាស់ប្ážáž¼ážšáž“áŸáŸ‡áŸ”',
'enotif_anon_editor' => 'អ្នកប្រើប្រាស់អនាមិក $1',
@@ -2327,6 +2321,8 @@ $UNWATCHURL
មážáž·â€‹áž™áŸ„បល់​និងជំនួយបន្ážáŸ‚ម ៖
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'បានបង្កើáž',
+'changed' => 'បានផ្លាស់ប្ážáž¼ážš',
# Delete
'deletepage' => 'លុបទំពáŸážšáž…ោល',
@@ -2516,7 +2512,7 @@ $1',
'blanknamespace' => '(ទូទៅ)',
# Contributions
-'contributions' => 'ការរួមចំណែក​របស់អ្នកប្រើប្រាស់',
+'contributions' => 'ការរួមចំណែក​របស់{{GENDER:$1|អ្នកប្រើប្រាស់}}',
'contributions-title' => 'ការរួមចំណែករបស់អ្នកប្រើប្រាស់ $1',
'mycontris' => 'ការរួមចំណែក',
'contribsub2' => 'សម្រាប់ $1 ($2)',
@@ -2969,6 +2965,7 @@ $1',
'pageinfo-default-sort' => 'ពាក្យគន្លឺះសំរាប់ážáŸ†ážšáŸ€áž”',
'pageinfo-length' => 'ប្រវែងទំពáŸážš (áž‚áž·ážáž‡áž¶áž”ៃ)',
'pageinfo-article-id' => 'អážáŸ’ážáž›áŸážáž‘ំពáŸážš',
+'pageinfo-language' => 'ភាសារបស់ážáŸ’លឹមសារទំពáŸážš',
'pageinfo-robot-policy' => 'ស្ážáž¶áž“ភាពម៉ាស៊ីនស្វែងរក',
'pageinfo-robot-index' => 'អាចដាក់ក្នុងលិបិក្រម',
'pageinfo-robot-noindex' => 'មិនអាចដាក់ក្នុងលិបិក្រម',
@@ -2988,6 +2985,14 @@ $1',
'pageinfo-magic-words' => '{{PLURAL:$1|ពាក្យ|ពាក្យ}} ážœáŸáž‘មន្ហ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|ចំណាážáŸ‹ážáŸ’នាក់ក្រុម|ចំណាážáŸ‹ážáŸ’នាក់ក្រុម}}ដែលបានលាក់ ($1)',
'pageinfo-templates' => '{{PLURAL:$1|ទំពáŸážšáž‚ំរូ|ទំពáŸážšáž‚ំរូ}}ដែលទាញមកបញ្ចូល ($1)',
+'pageinfo-toolboxlink' => 'áž–áŸážáŸŒáž˜áž¶áž“អំពីទំពáŸážšáž“áŸáŸ‡',
+'pageinfo-redirectsto' => 'បញ្ជូនបន្ážáž‘ៅកាន់',
+'pageinfo-redirectsto-info' => 'áž–áŸážáŸŒáž˜áž¶áž“​',
+'pageinfo-contentpage' => 'រាប់ជាទំពáŸážšážŠáŸ‚លមានážáŸ’លឹមសារនៅážáž¶áž„ក្នុង',
+'pageinfo-contentpage-yes' => 'បាទ/ចាស',
+'pageinfo-protect-cascading' => 'ការការពារážáŸ’រូវបានដាក់ជាážáŸ’នាក់ពីទីនáŸáŸ‡áž‘ៅ',
+'pageinfo-protect-cascading-yes' => 'បាទ/ចាស',
+'pageinfo-protect-cascading-from' => 'ការការពារážáŸ’រូវបានដាក់ជាážáŸ’នាក់ពី',
# Skin names
'skinname-standard' => 'បុរាណ',
@@ -3068,6 +3073,7 @@ $1',
'hours' => '{{PLURAL:$1|$1 ម៉ោង|$1 ម៉ោង}}',
'days' => '{{PLURAL:$1|$1 ážáŸ’ងៃ|$1 ážáŸ’ងៃ}}',
'ago' => '$1 មុន',
+'just-now' => 'អំបាញ់មិញនáŸáŸ‡',
# Bad image list
'bad_image_list' => 'ទម្រង់ ដូចážáž‘ៅ ៖
@@ -3657,7 +3663,10 @@ $5
'logentry-newusers-create' => 'បានបង្កើážáž‚ណនីអ្នកប្រើប្រាស់ $1',
'logentry-newusers-create2' => ' $3 បានបង្កើážáž‚ណនីអ្នកប្រើប្រាស់ $1',
'logentry-newusers-autocreate' => 'គណនី $1 ážáŸ’រូវបានបង្កើážážŠáŸ„យស្វáŸáž™áž”្រវážáŸ’ážáž·',
-'newuserlog-byemail' => 'ពាក្យសំងាážáŸ‹ážáŸ’រូវបានផ្ញើážáž¶áž˜áž¢áŸŠáž¸áž˜áŸ‚áž›',
+'logentry-rights-rights' => '$1 បានផ្លាស់ប្ដូរសមាជិកភាពរបស់ $3 ពី $4 ទៅជា $5',
+'logentry-rights-rights-legacy' => '$1បានផ្លាស់ប្ដូរសមាជិកភាពរបស់ $3',
+'logentry-rights-autopromote' => '$1 ážáŸ’រូវបានážáŸ†áž›áž¾áž„សមាជិកភាពពី $4 ជា $5',
+'rightsnone' => '(áž‘áž‘áŸ)',
# Feedback
'feedback-subject' => 'កម្មវážáŸ’ážáž» ៖',
diff --git a/languages/messages/MessagesKn.php b/languages/messages/MessagesKn.php
index 3e680566..a1752680 100644
--- a/languages/messages/MessagesKn.php
+++ b/languages/messages/MessagesKn.php
@@ -208,7 +208,6 @@ $messages = array(
'qbbrowse' => 'ವಿಹರಿಸà³',
'qbedit' => 'ಸಂಪಾದಿಸà³',
'qbpageoptions' => 'ಈ ಪà³à²Ÿ',
-'qbpageinfo' => 'ಸನà³à²¨à²¿à²µà³‡à²¶',
'qbmyoptions' => 'ನನà³à²¨ ಪà³à²Ÿà²—ಳà³',
'qbspecialpages' => 'ವಿಶೇಷ ಪà³à²Ÿà²—ಳà³',
'faq' => 'ಸಾಮಾನà³à²¯à²µà²¾à²—ಿ ಕೇಳಲಾಗà³à²µ ಪà³à²°à²¶à³à²¨à³†à²—ಳà³',
@@ -449,11 +448,10 @@ $2',
# Login and logout pages
'logouttext' => "'''ನೀವೠಈಗ ಲಾಗೠಔಟೠಆಗಿರà³à²µà²¿à²°à²¿.'''
-ನೀವೠ{{SITENAME}} ಅನà³à²¨à³ ಅನಾಮಧೇಯವಾಗಿ ಉಪಯೋಗಿಸಬಹà³à²¦à³, ಅಥವ ಮತà³à²¤à³† ಇದೇ ಹೆಸರಿನಲà³à²²à²¿ ಅಥವ ಬೇರೆ ಹೆಸರಿನಲà³à²²à²¿ [[Special:UserLogin|ಲಾಗೠಇನà³]] ಆಗಬಹà³à²¦à³.
+ನೀವೠ{{SITENAME}} ಅನà³à²¨à³ ಅನಾಮಧೇಯವಾಗಿ ಉಪಯೋಗಿಸಬಹà³à²¦à³, ಅಥವ ಮತà³à²¤à³† ಇದೇ ಹೆಸರಿನಲà³à²²à²¿ ಅಥವ ಬೇರೆ ಹೆಸರಿನಲà³à²²à²¿ <span class='plainlinks'>[$1 ಲಾಗೠಇನà³]</span> ಆಗಬಹà³à²¦à³.
ಗಮನಿಸಿ: ನಿಮà³à²® ಬà³à²°à³Œà²¸à²°à³â€à²¨ cache ಅನà³à²¨à³ ಅಳಿಸà³à²µà²µà²°à³†à²—ೂ ಕೆಲವೠಪà³à²Ÿà²—ಳೠನೀವಿನà³à²¨à³‚ ಲಾಗೠಇನೠಆಗಿರà³à²µà²‚ತೆ ಪà³à²°à²¦à²°à³à²¶à²¿à²¤à²µà²¾à²—ಬಹà³à²¦à³.",
-'welcomecreation' => '== ಸà³à²¸à³à²µà²¾à²—ತ, $1! ==
-ನಿಮà³à²® ಅಕೌಂಟನà³à²¨à³ ಸೃಷà³à²Ÿà²¿à²¸à²²à²¾à²—ಿದೆ.
-ನಿಮà³à²® [[Special:Preferences|{{SITENAME}} ಪà³à²°à²¾à²¶à²¸à³à²¤à³à²¯à²—ಳನà³à²¨à³]] ಬದಲಾಯಿಸà³à²µà³à²¦à²¨à³à²¨à³ ಮರೆಯಬೇಡಿ.',
+'welcomeuser' => 'ಸà³à²¸à³à²µà²¾à²—ತ,$1!',
+'welcomecreation-msg' => 'ನಿಮà³à²® ಖಾತೆ ತೆರೆಯಲಾಗಿದೆ.ನಿಮà³à²® [[Special:Preferences|{{SITENAME}} preferences]]ಬದಲಾಯಿಸಲೠಮರೆಯಬೇಡಿ.',
'yourname' => 'ನಿಮà³à²® ಬಳಕೆಯ ಹೆಸರà³',
'yourpassword' => 'ನಿಮà³à²® ಪà³à²°à²µà³‡à²¶à²ªà²¦',
'yourpasswordagain' => 'ಪà³à²°à²µà³‡à²¶ ಪದ ಮತà³à²¤à³Šà²®à³à²®à³† ಟೈಪೠಮಾಡಿ',
@@ -692,7 +690,6 @@ $2',
'template-protected' => '(ಸಂರಕà³à²·à²¿à²¤)',
'template-semiprotected' => '(ಅರೆ-ಸಂರಕà³à²·à²¿à²¤)',
'hiddencategories' => 'ಈ ಪà³à²Ÿà²µà³ {{PLURAL:$1|೧ ಗà³à²ªà³à²¤ ವರà³à²—ಕà³à²•à³†|$1 ಗà³à²ªà³à²¤ ವರà³à²—ಗಳಿಗೆ}} ಸೇರಿದೆ:',
-'nocreatetitle' => 'ಪà³à²Ÿà²µà²¨à³à²¨à³ ಸೃಷà³à²Ÿà²¿à²¸à³à²µà³à²¦à²¨à³à²¨à³ ನಿಯಮಿಸಲಾಗಿದೆ',
'nocreatetext' => '{{SITENAME}} ಅಲà³à²²à²¿ ಹೊಸ ಪà³à²Ÿà²—ಳನà³à²¨à³ ಸೃಷà³à²Ÿà²¿à²¸à²²à³ ಕೆಲವೠನಿಬಂಧನೆಗಳಿವೆ.
ನೀವೠಹಿಂದಿರà³à²—ಿ ಆಗಲೇ ಅಸà³à²¥à²¿à²¤à³à²µà²¦à²²à³à²²à²¿à²°à³à²µ ಪà³à²Ÿà²µà³Šà²‚ದನà³à²¨à³ ಸಂಪಾದಿಸಿ, ಅಥವ [[Special:UserLogin|ಲಾಗೠಇನೠಆಗಿ ಅಥವ ಹೊಸ ಸದಸà³à²¯à²°à²¾à²—ಿ]].',
'nocreate-loggedin' => 'ಹೊಸ ಪà³à²Ÿà²—ಳನà³à²¨à³ ಸೃಷà³à²Ÿà²¿à²¸à²²à³ ನಿಮಗೆ ಅನà³à²®à²¤à²¿ ಇಲà³à²².',
@@ -1045,12 +1042,12 @@ $2',
'right-sendemail' => 'ಇತರ ಬಳಕೆದಾರರಿಗೆ ಇಮೇಲೠಕಳà³à²¹à²¿à²¸à²¿',
'right-passwordreset' => 'ಪಾಸà³à²µà²°à³à²¡à³ ಮತà³à²¤à³† ಜೋಡಿಸಲà³à²ªà²Ÿà³à²Ÿ ಇಮೇಲೠಗಳನà³à²¨à³ ವೀಕà³à²·à²¿à²¸à²¿',
+# Special:Log/newusers
+'newuserlogpage' => 'ಸದಸà³à²¯à²¤à³à²µ ಸೃಷà³à²Ÿà²¿à²—ಳ ದಾಖಲೆ',
+
# User rights log
'rightslog' => 'ಸದಸà³à²¯à²° ಹಕà³à²•à³à²—ಳ ದಾಖಲೆಗಳà³',
'rightslogtext' => 'ಇದೠಬಳಕೆದಾರ ಹಕà³à²•à³à²—ಳ ಬದಲಾವಣೆಗಳ ದಾಖಲೆ.',
-'rightslogentry' => '$1 ಅವರ ಗà³à²‚ಪೠಸದಸà³à²¯à²¤à³à²µà²µà²¨à³à²¨à³ $2 ಇಂದ $3 ಗೆ ಬದಲಾಯಿಸಲಾಯಿತà³',
-'rightslogentry-autopromote' => 'ಸà³à²µà²¯à²‚ಚಾಲಿತವಾಗಿ $2 ರಿಂದ $3 ಬಡà³à²¤à²¿ ನೀಡಲಾಯಿತà³',
-'rightsnone' => '(ಯಾವೂ ಇಲà³à²²)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ಈ ಪà³à²Ÿà²µà²¨à³à²¨à³ ಓದಿ',
@@ -1445,9 +1442,6 @@ $2',
'activeusers' => 'ಸಕà³à²°à²¿à²¯ ಸದಸà³à²¯à²° ಪಟà³à²Ÿà²¿',
'activeusers-noresult' => 'ಯಾವ ಬಳಕೆದಾರರೂ ಸಿಗಲಿಲà³à²².',
-# Special:Log/newusers
-'newuserlogpage' => 'ಸದಸà³à²¯à²¤à³à²µ ಸೃಷà³à²Ÿà²¿à²—ಳ ದಾಖಲೆ',
-
# Special:ListGroupRights
'listgrouprights' => 'ಬಳಕೆದಾರ ಗà³à²‚ಪೠಹಕà³à²•à³à²—ಳà³',
'listgrouprights-summary' => 'ಈ ವಿಕಿಯಲà³à²²à²¿ ಪà³à²°à²šà²²à²¿à²¤à²µà²¾à²—ಿರà³à²µ ಬಳಕೆದಾರ ಗà³à²‚ಪà³à²—ಳೠಮತà³à²¤à³ ಆ ಗà³à²‚ಪà³à²—ಳಿಗೆ ಅನà³à²µà²¯à²¿à²¸à³à²µ ಹಕà³à²•à³à²—ಳೠಈ ಕೆಳಗಿನಂತಿದೆ.',
@@ -1506,12 +1500,11 @@ $2',
'unwatching' => 'ವೀಕà³à²·à²£à³†à²¯à²¿à²‚ದ ತೆಗೆಯಲಾಗà³à²¤à³à²¤à²¿à²¦à³†...',
'enotif_reset' => 'ಭೇಟಿಯಿತà³à²¤ ಎಲà³à²²à²¾ ಪà³à²Ÿà²—ಳನà³à²¨à³ ಗà³à²°à³à²¤à³ ಮಾಡಿ',
-'enotif_newpagetext' => 'ಇದೊಂದೠಹೊಸ ಪà³à²Ÿ.',
'enotif_impersonal_salutation' => '{{SITENAME}} ಸದಸà³à²¯',
-'changed' => 'ಬದಲಾಯಿಸಲಾಗಿದೆ',
-'created' => 'ಸೃಷà³à²Ÿà²¿à²¸à²²à³à²ªà²Ÿà³à²Ÿà²¿à²¦à³†',
'enotif_lastvisited' => 'ನಿಮà³à²® ಕಳೆದ ಭೇಟಿಯ ನಂತರದ ಎಲà³à²²à²¾ ಬದಲಾವಣೆಗಳಿಗೆ $1 ನೋಡಿ.',
'enotif_anon_editor' => 'ಅನಾಮಧೇಯ ಸದಸà³à²¯ $1',
+'created' => 'ಸೃಷà³à²Ÿà²¿à²¸à²²à³à²ªà²Ÿà³à²Ÿà²¿à²¦à³†',
+'changed' => 'ಬದಲಾಯಿಸಲಾಗಿದೆ',
# Delete
'deletepage' => 'ಪà³à²Ÿà²µà²¨à³à²¨à³ ಅಳಿಸಿ',
@@ -1888,6 +1881,10 @@ $2',
'siteusers' => '{{SITENAME}} {{PLURAL:$2|ಸದಸà³à²¯|ಸದಸà³à²¯à²°à³}} $1',
'creditspage' => 'ಪà³à²Ÿà²¦ ಗೌರವಗಳà³',
+# Info page
+'pageinfo-toolboxlink' => 'ಪà³à²Ÿà²¦ ಮಾಹಿತಿ',
+'pageinfo-redirectsto' => 'ಪà³à²¨à²°à³à²¨à²¿à²°à³à²¦à³‡à²¶à²¨:',
+
# Image deletion
'deletedrevision' => 'ಹಳೆ ಆವೃತà³à²¤à²¿ $1 ಅನà³à²¨à³ ಅಳಿಸಲಾಗಿದೆ',
'filedeleteerror-short' => 'ಈ ಫೈಲನà³à²¨à³ ಅಳಿಸà³à²µà³à²¦à²°à²²à³à²²à²¿ ದೋಷ: $1',
@@ -2196,6 +2193,7 @@ $5
# New logging system
'revdelete-restricted' => 'ನಿರà³à²µà²¾à²¹à²•à²°à²¿à²—ೆ ನಿಬಂಧನೆಗಳನà³à²¨à³ ಅನà³à²µà²¯à²¿à²¸à²²à²¾à²¯à²¿à²¤à³',
'revdelete-unrestricted' => 'ನಿರà³à²µà²¾à²¹à²•à²° ನಿಬಂಧನೆಗಳನà³à²¨à³ ತೆಗೆಯಲಾಯಿತà³',
+'rightsnone' => '(ಯಾವೂ ಇಲà³à²²)',
# Durations
'duration-seconds' => '$1 {{PLURAL:$1|ಕà³à²·à²£|ಕà³à²·à²£à²—ಳà³}}',
diff --git a/languages/messages/MessagesKo.php b/languages/messages/MessagesKo.php
index 1e61ca2f..bc0be3de 100644
--- a/languages/messages/MessagesKo.php
+++ b/languages/messages/MessagesKo.php
@@ -26,6 +26,7 @@
* @author Kaganer
* @author Klutzy
* @author Kwj2772
+ * @author LFM
* @author Mintz0223
* @author Pi.C.Noizecehx
* @author PuzzletChung
@@ -68,10 +69,10 @@ $specialPageAliases = array(
'Allmessages' => array( '모든메시지' ),
'Allpages' => array( '모든문서' ),
'Ancientpages' => array( '오래ëœë¬¸ì„œ' ),
- 'Badtitle' => array( '잘못ëœì´ë¦„', 'ì¸ì‹ë¶ˆê°€ì´ë¦„', '잘못ëœì œëª©', 'ì¸ì‹ë¶ˆê°€ì œëª©' ),
+ 'Badtitle' => array( '잘못ëœì œëª©', 'ì¸ì‹ë¶ˆê°€ì œëª©', '잘못ëœì´ë¦„', 'ì¸ì‹ë¶ˆê°€ì´ë¦„' ),
'Blankpage' => array( '빈문서' ),
- 'Block' => array( '차단' ),
- 'Blockme' => array( 'ìžê°€ì°¨ë‹¨' ),
+ 'Block' => array( '차단', 'IP차단', '사용ìžì°¨ë‹¨' ),
+ 'Blockme' => array( 'ìžê¸°ì°¨ë‹¨', 'ìžê°€ì°¨ë‹¨' ),
'Booksources' => array( '책찾기' ),
'BrokenRedirects' => array( 'ëŠê¸´ë„˜ê²¨ì£¼ê¸°' ),
'Categories' => array( '분류' ),
@@ -95,7 +96,7 @@ $specialPageAliases = array(
'Invalidateemail' => array( 'ì´ë©”ì¼ì¸ì¦ì·¨ì†Œ', 'ì´ë©”ì¼ì¸ì¦í•´ì œ' ),
'JavaScriptTest' => array( 'ìžë°”스í¬ë¦½íŠ¸ì‹œí—˜' ),
'BlockList' => array( '차단ëœì‚¬ìš©ìž', '차단목ë¡' ),
- 'LinkSearch' => array( '외부ë§í¬ì°¾ê¸°', '외부ë§í¬ê²€ìƒ‰' ),
+ 'LinkSearch' => array( 'ë§í¬ì°¾ê¸°', 'ë§í¬ê²€ìƒ‰' ),
'Listadmins' => array( '관리ìž', '관리ìžëª©ë¡' ),
'Listbots' => array( 'ë´‡', '봇목ë¡' ),
'Listfiles' => array( '파ì¼', '그림', '파ì¼ëª©ë¡', '그림목ë¡' ),
@@ -128,13 +129,12 @@ $specialPageAliases = array(
'Preferences' => array( '환경설정' ),
'Prefixindex' => array( 'ì ‘ë‘어찾기' ),
'Protectedpages' => array( '보호ëœë¬¸ì„œ' ),
- 'Protectedtitles' => array( 'ìƒì„±ë³´í˜¸ëœë¬¸ì„œ', '만들기보호ëœë¬¸ì„œ' ),
+ 'Protectedtitles' => array( '만들기보호ëœë¬¸ì„œ', 'ìƒì„±ë³´í˜¸ëœë¬¸ì„œ' ),
'Randompage' => array( 'ìž„ì˜ë¬¸ì„œ' ),
'Randomredirect' => array( 'ìž„ì˜ë„˜ê²¨ì£¼ê¸°' ),
'Recentchanges' => array( '최근바뀜' ),
'Recentchangeslinked' => array( 'ë§í¬ìµœê·¼ë°”뀜' ),
'Revisiondelete' => array( '특정íŒì‚­ì œ' ),
- 'RevisionMove' => array( '특정íŒì´ë™' ),
'Search' => array( '찾기', '검색' ),
'Shortpages' => array( '짧ì€ë¬¸ì„œ' ),
'Specialpages' => array( '특수문서', '특수기능' ),
@@ -151,11 +151,11 @@ $specialPageAliases = array(
'Unusedimages' => array( '안쓰는파ì¼', '안쓰는그림', 'ì“°ì´ì§€ì•ŠëŠ”파ì¼', 'ì“°ì´ì§€ì•ŠëŠ”그림' ),
'Unusedtemplates' => array( '안쓰는틀', 'ì“°ì´ì§€ì•ŠëŠ”í‹€' ),
'Unwatchedpages' => array( '주시안ë˜ëŠ”문서' ),
- 'Upload' => array( '올리기', '파ì¼ì˜¬ë¦¬ê¸°', '그림올리기' ),
+ 'Upload' => array( '올리기', '파ì¼ì˜¬ë¦¬ê¸°', '그림올리기', '업로드' ),
'UploadStash' => array( '올린비공개파ì¼' ),
'Userlogin' => array( '로그ì¸' ),
'Userlogout' => array( '로그아웃' ),
- 'Userrights' => array( '권한조정' ),
+ 'Userrights' => array( '권한조정', '관리ìží•˜ê¸°', '봇하기' ),
'Version' => array( '버전' ),
'Wantedcategories' => array( '필요한분류' ),
'Wantedfiles' => array( '필요한파ì¼', '필요한그림' ),
@@ -172,8 +172,7 @@ $magicWords = array(
'nogallery' => array( '0', '__화랑숨김__', '__갤러리숨김__', '__NOGALLERY__' ),
'forcetoc' => array( '0', '__목차보임__', '__목차표시__', '__FORCETOC__' ),
'toc' => array( '0', '__목차__', '__TOC__' ),
- 'noeditsection' => array( '0', '__단ë½íŽ¸ì§‘숨김__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__머릿글숨김__', '__í—¤ë”숨김__', '__NOHEADER__' ),
+ 'noeditsection' => array( '0', '__부분편집숨김__', '__문단편집숨김__', '__단ë½íŽ¸ì§‘숨김__', '__NOEDITSECTION__' ),
'currentmonth' => array( '1', '현재월', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', '현재월1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', '현재월ì´ë¦„', 'CURRENTMONTHNAME' ),
@@ -248,6 +247,7 @@ $magicWords = array(
'img_text_bottom' => array( '1', '글ìžì•„래', 'í…스트아래', 'text-bottom' ),
'img_link' => array( '1', 'ë§í¬=$1', 'link=$1' ),
'img_alt' => array( '1', '대체글=$1', 'alt=$1' ),
+ 'img_class' => array( '1', 'í´ëž˜ìŠ¤=$1', 'class=$1' ),
'int' => array( '0', '정수:', 'INT:' ),
'sitename' => array( '1', '사ì´íŠ¸ì´ë¦„', 'SITENAME' ),
'ns' => array( '0', 'ì´ë¦„:', 'ì´ë¦„공간:', 'NS:' ),
@@ -478,6 +478,7 @@ $messages = array(
'newwindow' => '(새 창으로 열림)',
'cancel' => '취소',
'moredotdotdot' => 'ë” ë³´ê¸°...',
+'morenotlisted' => '다른 항목 ë” ë³´ê¸°...',
'mypage' => '문서',
'mytalk' => '토론',
'anontalk' => 'ìµëª… ì‚¬ìš©ìž í† ë¡ ',
@@ -489,7 +490,6 @@ $messages = array(
'qbbrowse' => 'íƒìƒ‰',
'qbedit' => '편집',
'qbpageoptions' => '문서 기능',
-'qbpageinfo' => '문서 정보',
'qbmyoptions' => 'ë‚´ ì‚¬ìš©ìž ë¬¸ì„œ',
'qbspecialpages' => '특수 문서',
'faq' => 'ìžì£¼ 묻는 질문',
@@ -512,6 +512,7 @@ $messages = array(
'namespaces' => 'ì´ë¦„공간',
'variants' => '변수',
+'navigation-heading' => '둘러보기 메뉴',
'errorpagetitle' => '오류',
'returnto' => '$1 문서로 ëŒì•„갑니다.',
'tagline' => '{{SITENAME}}',
@@ -755,10 +756,10 @@ $2',
# Login and logout pages
'logouttext' => "'''{{SITENAME}}ì—ì„œ 로그아웃했습니다.'''
-ì´ëŒ€ë¡œ ì´ë¦„ ì—†ì´ {{SITENAME}}ì„(를) ì´ìš©í•˜ê±°ë‚˜, 방금 ì‚¬ìš©í–ˆë˜ ê³„ì •ì´ë‚˜ 다른 계정으로 다시 [[Special:UserLogin|로그ì¸]]í•´ì„œ ì´ìš©í•  수 있습니다.
+ì´ëŒ€ë¡œ ì´ë¦„ ì—†ì´ {{SITENAME}}ì„(를) ì´ìš©í•˜ê±°ë‚˜, 방금 ì‚¬ìš©í–ˆë˜ ê³„ì •ì´ë‚˜ 다른 계정으로 다시 <span class='plainlinks'>[$1 로그ì¸]</span>í•´ì„œ ì´ìš©í•  수 있습니다.
웹 브ë¼ìš°ì €ì˜ ìºì‹œë¥¼ 지우지 않으면 몇몇 문서ì—ì„œ 로그ì¸ì´ ë˜ì–´ 있는 것처럼 ë³´ì¼ ìˆ˜ 있다는 ì ì„ 유ì˜í•´ 주세요.",
-'welcomecreation' => '== $1님, 환ì˜í•©ë‹ˆë‹¤! ==
-ê³„ì •ì´ ë§Œë“¤ì–´ì¡ŒìŠµë‹ˆë‹¤.
+'welcomeuser' => '$1, 환ì˜í•©ë‹ˆë‹¤!',
+'welcomecreation-msg' => 'ê³„ì •ì´ ë§Œë“¤ì–´ì¡ŒìŠµë‹ˆë‹¤.
[[Special:Preferences|{{SITENAME}} ì‚¬ìš©ìž í™˜ê²½ 설정]]ì„ ë°”ê¿€ 수 있습니다.',
'yourname' => 'ì‚¬ìš©ìž ì´ë¦„:',
'yourpassword' => '비밀번호:',
@@ -782,7 +783,7 @@ $2',
'gotaccount' => 'ê³„ì •ì´ ì´ë¯¸ 있다면, $1.',
'gotaccountlink' => '로그ì¸í•˜ì„¸ìš”',
'userlogin-resetlink' => 'ì‚¬ìš©ìž ì´ë¦„ì´ë‚˜ 비밀번호를 잊으셨나요?',
-'createaccountmail' => 'ì´ë©”ì¼ë¡œ 보내기',
+'createaccountmail' => 'ìž„ì‹œ ìž„ì˜ ë¹„ë°€ë²ˆí˜¸ë¥¼ ì•„ëž˜ì— ì§€ì •í•œ ì´ë©”ì¼ë¡œ 보내기',
'createaccountreason' => 'ì´ìœ :',
'badretype' => '입력한 비밀번호가 ì¼ì¹˜í•˜ì§€ 않습니다.',
'userexists' => '입력하신 ì‚¬ìš©ìž ì´ë¦„ì´ ì´ë¯¸ 등ë¡ë˜ì–´ 있습니다.
@@ -862,6 +863,7 @@ $2',
# Email sending
'php-mail-error-unknown' => 'PHPì˜ mail() 함수ì—ì„œ ì•Œ 수 없는 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
'user-mail-no-addy' => '받는ì´ì˜ ì´ë©”ì¼ ì£¼ì†Œê°€ 없으면 ì´ë©”ì¼ì„ 보낼 수 없습니다.',
+'user-mail-no-body' => '비어 있거나 지나치게 ì§§ì€ ë³¸ë¬¸ìœ¼ë¡œ ì´ë©”ì¼ì„ 보내려고 했습니다.',
# Change password dialog
'resetpass' => '비밀번호 바꾸기',
@@ -917,7 +919,7 @@ $2
임시 비밀번호: $2',
'passwordreset-emailsent' => '비밀번호 재설정 ì´ë©”ì¼ì„ 보냈습니다.',
'passwordreset-emailsent-capture' => '비밀번호 재설정 ì´ë©”ì¼ì´ 발송ë˜ì—ˆìœ¼ë©°, ì•„ëž˜ì— ë‚˜íƒ€ë‚˜ 있습니다.',
-'passwordreset-emailerror-capture' => '비밀번호 찾기 ì´ë©”ì¼ì´ 만들어져 ì•„ëž˜ì— ë‚˜íƒ€ë‚¬ì§€ë§Œ 발송하는 ë°ì—는 실패했습니다: $1',
+'passwordreset-emailerror-capture' => '비밀번호 재설정 ì´ë©”ì¼ì´ 만들어져 ì•„ëž˜ì— ë‚˜íƒ€ë‚¬ì§€ë§Œ 발송하는 ë°ì—는 실패했습니다: $1',
# Special:ChangeEmail
'changeemail' => 'ì´ë©”ì¼ ì£¼ì†Œ 바꾸기',
@@ -927,6 +929,7 @@ $2
'changeemail-oldemail' => '현재 ì´ë©”ì¼ ì£¼ì†Œ :',
'changeemail-newemail' => '새 ì´ë©”ì¼ ì£¼ì†Œ:',
'changeemail-none' => '(ì—†ìŒ)',
+'changeemail-password' => '{{SITENAME}} 비밀번호:',
'changeemail-submit' => 'ì´ë©”ì¼ ì£¼ì†Œ 바꾸기',
'changeemail-cancel' => '취소',
@@ -1115,7 +1118,6 @@ IP 주소는 여러 사용ìžê°€ 공유할 수 있습니다.
'template-semiprotected' => '(준보호ë¨)',
'hiddencategories' => 'ì´ ë¬¸ì„œëŠ” ë‹¤ìŒ {{PLURAL:$1|ìˆ¨ì€ ë¶„ë¥˜ 1ê°œ|ìˆ¨ì€ ë¶„ë¥˜ $1ê°œ}}ì— ì†í•´ 있습니다:',
'edittools' => '<!-- ì´ ë¬¸ì„œëŠ” 편집 창과 íŒŒì¼ ì˜¬ë¦¬ê¸° ì°½ì— ì¶œë ¥ë©ë‹ˆë‹¤. -->',
-'nocreatetitle' => '문서 만들기 제한',
'nocreatetext' => '{{SITENAME}}ì—ì„œ 새로운 문서를 만드는 ê²ƒì€ ì œí•œë˜ì–´ 있습니다.
ì´ë¯¸ 존재하는 다른 문서를 편집하거나, [[Special:UserLogin|로그ì¸í•˜ê±°ë‚˜ ê³„ì •ì„ ë§Œë“¤ 수 있습니다]].',
'nocreate-loggedin' => '새 문서를 만들 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤.',
@@ -1140,6 +1142,15 @@ IP 주소는 여러 사용ìžê°€ 공유할 수 있습니다.
'edit-already-exists' => '새 문서를 만들 수 없습니다.
문서가 ì´ë¯¸ 존재합니다.',
'defaultmessagetext' => '기본 메세지 내용',
+'content-failed-to-parse' => '$1 모ë¸ì— 대한 $2 ë‚´ìš©ì„ êµ¬ë¬¸ 분ì„하는 ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤: $3',
+'invalid-content-data' => 'ìž˜ëª»ëœ ë‚´ìš© ë°ì´í„°ìž…니다',
+'content-not-allowed-here' => '"$1" ë‚´ìš©ì€ [[$2]] 문서예 허용하지 않습니다',
+
+# Content models
+'content-model-wikitext' => '위키í…스트',
+'content-model-text' => 'ì¼ë°˜ í…스트',
+'content-model-javascript' => 'ìžë°”스í¬ë¦½íŠ¸',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''경고:''' ì´ ë¬¸ì„œëŠ” 너무 ë§Žì€ íŒŒì„œ 함수를 í¬í•¨í•˜ê³  있습니다.
@@ -1508,9 +1519,9 @@ $1",
'prefs-emailconfirm-label' => 'ì´ë©”ì¼ ì¸ì¦:',
'prefs-textboxsize' => 'íŽ¸ì§‘ì°½ì˜ í¬ê¸°',
'youremail' => 'ì´ë©”ì¼:',
-'username' => 'ì‚¬ìš©ìž ì´ë¦„:',
-'uid' => 'ì‚¬ìš©ìž ID:',
-'prefs-memberingroups' => 'ì†Œì† {{PLURAL:$1|그룹}}:',
+'username' => '{{GENDER:$1|ì‚¬ìš©ìž ì´ë¦„}}:',
+'uid' => '{{GENDER:$1|사용ìž}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|소ì†}} {{PLURAL:$1|그룹}}:',
'prefs-registration' => 'ë“±ë¡ ì¼ì‹œ:',
'yourrealname' => '실명:',
'yourlanguage' => '언어:',
@@ -1662,12 +1673,13 @@ HTML 태그를 확ì¸í•˜ì„¸ìš”.',
'right-sendemail' => '다른 사용ìžì—게 ì´ë©”ì¼ ë³´ë‚´ê¸°',
'right-passwordreset' => '비밀번호 재설정 ì´ë©”ì¼ì„ 보기',
+# Special:Log/newusers
+'newuserlogpage' => 'ì‚¬ìš©ìž ë“±ë¡ ê¸°ë¡',
+'newuserlogpagetext' => 'ì‚¬ìš©ìž ë“±ë¡ ê¸°ë¡ìž…니다.',
+
# User rights log
'rightslog' => 'ì‚¬ìš©ìž ê¶Œí•œ 기ë¡',
'rightslogtext' => 'ì‚¬ìš©ìž ê¶Œí•œ ì¡°ì • 기ë¡ìž…니다.',
-'rightslogentry' => '사용ìžê°€ $1ì˜ ê¶Œí•œì„ $2ì—ì„œ $3으로 바꾸었습니다',
-'rightslogentry-autopromote' => '사용ìžì˜ ê¶Œí•œì´ ìžë™ì ìœ¼ë¡œ $2ì—ì„œ $3으로 바뀌었습니다.',
-'rightsnone' => '(ì—†ìŒ)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ì´ ë¬¸ì„œë¥¼ ì½ê¸°',
@@ -1917,6 +1929,7 @@ URLì´ ì˜¬ë°”ë¥´ê³  ì ‘ê·¼ 가능한지를 확ì¸í•˜ê³  다시 ì‹œë„하세요.
'backend-fail-notsame' => '$1 파ì¼ê³¼ ê°™ì€ ì´ë¦„ì„ ê°€ì§„ 다른 파ì¼ì´ 존재합니다.',
'backend-fail-invalidpath' => '$1 경로가 유효하지 않습니다.',
'backend-fail-delete' => '$1 파ì¼ì„ 삭제할 수 없습니다.',
+'backend-fail-describe' => '"$1" 파ì¼ì— 대한 메타ë°ì´í„°ë¥¼ 바꿀 수 없습니다.',
'backend-fail-alreadyexists' => '$1 파ì¼ì´ ì´ë¯¸ 존재합니다.',
'backend-fail-store' => '$1 파ì¼ì„ $2 ê²½ë¡œì— ì €ìž¥í•˜ì§€ 못했습니다.',
'backend-fail-copy' => '$1 파ì¼ì„ $2 ê²½ë¡œì— ë³µì‚¬í•˜ì§€ 못했습니다.',
@@ -2156,6 +2169,12 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
ê·¸ ë§í¬ëŠ” 다른 ì ì ˆí•œ 문서로 ì—°ê²°í•  필요가 있습니다.<br />
[[MediaWiki:Disambiguationspage]]ì—ì„œ ë§í¬ëœ í‹€ì„ ì‚¬ìš©í•˜ëŠ” 문서를 ë™ìŒì´ì˜ 문서로 간주합니다.",
+'pageswithprop' => '문서 ì†ì„±ì´ 있는 문서',
+'pageswithprop-legend' => '문서 ì†ì„±ì´ 있는 문서',
+'pageswithprop-text' => 'ì´ ë¬¸ì„œëŠ” 특정 문서 ì†ì„±ì„ 사용한 문서를 나타냅니다.',
+'pageswithprop-prop' => 'ì†ì„± ì´ë¦„:',
+'pageswithprop-submit' => '가기',
+
'doubleredirects' => 'ì´ì¤‘ 넘겨주기 목ë¡',
'doubleredirectstext' => 'ì´ ë¬¸ì„œëŠ” 다른 넘겨주기 문서로 넘겨주고 있는 ë¬¸ì„œì˜ ëª©ë¡ìž…니다.
매 줄ì—는 첫 번째 문서와 ë‘ ë²ˆì§¸ ë¬¸ì„œì˜ ë§í¬ê°€ 있습니다. 그리고 보통 첫 번째 문서가 넘겨주어야 í•  "실제" ë¬¸ì„œì¸ ë‘ ë²ˆì§¸ ë„˜ê²¨ì£¼ê¸°ì˜ ëŒ€ìƒì´ 있습니다.
@@ -2311,7 +2330,7 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'linksearch-ok' => '찾기',
'linksearch-text' => '"*.wikipedia.org"와 ê°™ì´ ì™€ì¼ë“œ 카드를 사용할 수 있습니다.
ì ì–´ë„ "*.org"와 ê°™ì´ ìµœìƒìœ„ ë„ë©”ì¸ì„ 입력해야 합니다.<br />
-지ì›í•˜ëŠ” 프로토콜: <code>$1</code> (í”„ë¡œí† ì½œì„ ì§€ì •í•˜ì§€ ì•Šì„ ë•Œ ê¸°ë³¸ê°’ì€ http://)',
+지ì›í•˜ëŠ” {{PLURAL:$2|프로토콜}}: <code>$1</code> (í”„ë¡œí† ì½œì„ ì§€ì •í•˜ì§€ ì•Šì„ ë•Œ ê¸°ë³¸ê°’ì€ http://)',
'linksearch-line' => '$2ì—ì„œ $1 ì„ ë§í¬í•˜ê³  있습니다.',
'linksearch-error' => '와ì¼ë“œì¹´ë“œëŠ” ì£¼ì†Œì˜ ì²˜ìŒ ë¶€ë¶„ì—만 ì‚¬ìš©ë  ìˆ˜ 있습니다.',
@@ -2330,10 +2349,6 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'activeusers-hidesysops' => '관리ìžë¥¼ 숨기기',
'activeusers-noresult' => '사용ìžê°€ 없습니다.',
-# Special:Log/newusers
-'newuserlogpage' => 'ì‚¬ìš©ìž ë“±ë¡ ê¸°ë¡',
-'newuserlogpagetext' => 'ì‚¬ìš©ìž ë“±ë¡ ê¸°ë¡ìž…니다.',
-
# Special:ListGroupRights
'listgrouprights' => 'ì‚¬ìš©ìž ê¶Œí•œ 목ë¡',
'listgrouprights-summary' => '다ìŒì€ ì´ ìœ„í‚¤ì— ìžˆëŠ” ì‚¬ìš©ìž ê¶Œí•œ ê·¸ë£¹ì˜ ëª©ë¡ìž…니다.
@@ -2429,19 +2444,23 @@ URLì´ ë§žê³  해당 웹사ì´íŠ¸ê°€ ìž‘ë™í•˜ëŠ”지 확ì¸í•´ì£¼ì„¸ìš”.',
'enotif_mailer' => '{{SITENAME}} ìžë™ 알림 ë©”ì¼',
'enotif_reset' => '모든 문서를 방문한 것으로 표시하기',
-'enotif_newpagetext' => 'ì´ ë¬¸ì„œëŠ” 새 문서입니다.',
'enotif_impersonal_salutation' => '{{SITENAME}} 사용ìž',
-'changed' => '바꾸었',
-'created' => '만들었',
-'enotif_subject' => '{{SITENAME}} $PAGETITLE 문서를 $PAGEEDITOR 사용ìžê°€ $CHANGEDORCREATED습니다.',
+'enotif_subject_deleted' => '{{SITENAME}} $1 문서를 $2 사용ìžê°€ {{GENDER:$2|삭제했습니다}}',
+'enotif_subject_created' => '{{SITENAME}} $1 문서를 $2 사용ìžê°€ {{GENDER:$2|만들었습니다}}',
+'enotif_subject_moved' => '{{SITENAME}} $1 문서를 $2 사용ìžê°€ {{GENDER:$2|옮겼습니다}}',
+'enotif_subject_restored' => '{{SITENAME}} $1 문서를 $2 사용ìžê°€ {{GENDER:$2|ë˜ì‚´ë ¸ìŠµë‹ˆë‹¤}}',
+'enotif_subject_changed' => '{{SITENAME}} $1 문서를 $2 사용ìžê°€ {{GENDER:$2|바꾸었습니다}}',
+'enotif_body_intro_deleted' => '{{SITENAME}} $1 문서를 $PAGEEDITDATEì— $2 사용ìžê°€ {{GENDER:$2|삭제했으며}} $3 ì—ì„œ ë³¼ 수 있습니다.',
+'enotif_body_intro_created' => '{{SITENAME}} $1 문서를 $PAGEEDITDATEì— $2 사용ìžê°€ {{GENDER:$2|만들었으며}} 현재 íŒì€ $3 ì—ì„œ ë³¼ 수 있습니다.',
+'enotif_body_intro_moved' => '{{SITENAME}} $1 문서를 $PAGEEDITDATEì— $2 사용ìžê°€ {{GENDER:$2|옮겼으며}} 현재 íŒì€ $3 ì—ì„œ ë³¼ 수 있습니다.',
+'enotif_body_intro_restored' => '{{SITENAME}} $1 문서를 $PAGEEDITDATEì— $2 사용ìžê°€ {{GENDER:$2|ë˜ì‚´ë ¸ìœ¼ë©°}} 현재 íŒì€ $3 ì—ì„œ ë³¼ 수 있습니다.',
+'enotif_body_intro_changed' => '{{SITENAME}} $1 문서를 $PAGEEDITDATEì— $2 사용ìžê°€ {{GENDER:$2|바꾸었으며}} 현재 íŒì€ $3 ì—ì„œ ë³¼ 수 있습니다.',
'enotif_lastvisited' => '마지막으로 방문한 ë’¤ ìƒê¸´ 모든 ë°”ë€œì„ ë³´ë ¤ë©´ $1 ì„ ë³´ì„¸ìš”.',
'enotif_lastdiff' => 'ì´ ë°”ë€œì„ ë³´ë ¤ë©´ $1 ì„ ë³´ì„¸ìš”.',
'enotif_anon_editor' => 'ìµëª… ì‚¬ìš©ìž $1',
'enotif_body' => '$WATCHINGUSERNAME님,
-{{SITENAME}} $PAGETITLE 문서를 $PAGEEDITDATEì— $PAGEEDITOR 사용ìžê°€ $CHANGEDORCREATED습니다. 현재 íŒì€ $PAGETITLE_URL ì—ì„œ ë³¼ 수 있습니다.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
편집 요약: $PAGESUMMARY $PAGEMINOREDIT
@@ -2465,6 +2484,8 @@ $UNWATCHURL
ë„ì›€ì„ ì–»ê±°ë‚˜ 피드백 하기:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => '만들었',
+'changed' => '바꾸었',
# Delete
'deletepage' => '문서 삭제하기',
@@ -2537,6 +2558,8 @@ $UNWATCHURL
'prot_1movedto2' => '[[$1]] 문서를 [[$2]] 문서로 옮김',
'protect-badnamespace-title' => '보호할 수 없는 ì´ë¦„공간',
'protect-badnamespace-text' => 'ì´ ì´ë¦„ê³µê°„ì— ìžˆëŠ” 문서는 보호할 수 없습니다.',
+'protect-norestrictiontypes-text' => 'ì´ ë¬¸ì„œëŠ” 제한 ìœ í˜•ì„ ì‚¬ìš©í•  수 ì—†ìŒìœ¼ë¡œ 보호할 수 없습니다.',
+'protect-norestrictiontypes-title' => '보호할 수 없는 문서',
'protect-legend' => '보호 확ì¸',
'protectcomment' => 'ì´ìœ :',
'protectexpiry' => '보호 기간:',
@@ -2622,8 +2645,8 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|íŒ 1ê°œ|íŒ $1ê°œ}}를 ë˜ì‚´ë ¸ìŠµë‹ˆë‹¤',
'undeletedrevisions-files' => '{{PLURAL:$1|íŒ 1ê°œ|íŒ $1ê°œ}}와 {{PLURAL:$2|íŒŒì¼ 1ê°œ|íŒŒì¼ $2ê°œ}}를 ë˜ì‚´ë ¸ìŠµë‹ˆë‹¤',
'undeletedfiles' => '{{PLURAL:$1|íŒŒì¼ 1ê°œ|íŒŒì¼ $1ê°œ}}를 ë˜ì‚´ë ¸ìŠµë‹ˆë‹¤',
-'cannotundelete' => 'ë˜ì‚´ë¦¬ê¸°ì— 실패했습니다.
-다른 사용ìžê°€ ì´ë¯¸ ë˜ì‚´ë ¸ì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.',
+'cannotundelete' => 'ë˜ì‚´ë¦¬ëŠ” ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤:
+$1',
'undeletedpage' => "'''$1 문서를 ë˜ì‚´ë ¸ìŠµë‹ˆë‹¤.'''
[[Special:Log/delete|ì‚­ì œ 기ë¡]]ì—ì„œ ìµœê·¼ì˜ ì‚­ì œì™€ ë˜ì‚´ë¦¬ê¸° 기ë¡ì„ ë³¼ 수 있습니다.",
@@ -2655,7 +2678,7 @@ $1',
'blanknamespace' => '(ì¼ë°˜)',
# Contributions
-'contributions' => 'ì‚¬ìš©ìž ê¸°ì—¬',
+'contributions' => '{{GENDER:$1|사용ìž}} 기여',
'contributions-title' => '$1 사용ìžì˜ 기여 목ë¡',
'mycontris' => '기여 목ë¡',
'contribsub2' => '$1($2)ì˜ ê¸°ì—¬',
@@ -2933,6 +2956,7 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
'immobile-target-namespace-iw' => 'ì¸í„°ìœ„키 ë§í¬ë¥¼ 넘어 문서를 옮길 수 없습니다.',
'immobile-source-page' => 'ì´ ë¬¸ì„œëŠ” 옮길 수 없습니다.',
'immobile-target-page' => '새 ì´ë¦„으로 옮길 수 없습니다.',
+'bad-target-model' => 'ì›í•˜ëŠ” 대ìƒì€ 다른 ë‚´ìš© 모ë¸ì„ 사용합니다. $1ì—ì„œ $2ë¡œ 변환할 수 없습니다.',
'imagenocrossnamespace' => '파ì¼ì„ 파ì¼ì´ ì•„ë‹Œ ì´ë¦„공간으로 옮길 수 없습니다.',
'nonfile-cannot-move-to-file' => '파ì¼ì´ ì•„ë‹Œ 문서를 íŒŒì¼ ì´ë¦„공간으로 옮길 수 없습니다.',
'imagetypemismatch' => '새 파ì¼ì˜ 확장ìžê°€ ì›ëž˜ì˜ 확장ìžì™€ ì¼ì¹˜í•˜ì§€ 않습니다.',
@@ -3048,6 +3072,7 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
'import-error-interwiki' => '"$1" 문서는 ì œëª©ì´ ë°”ê¹¥ ë§í¬(ì¸í„°ìœ„키)용으로 할당ë˜ì–´ 있기 ë•Œë¬¸ì— ê°€ì ¸ì˜¤ì§€ 않습니다.',
'import-error-special' => '"$1" 문서는 특수 ë¬¸ì„œì— ì†í•´ 있기 ë•Œë¬¸ì— ê°€ì ¸ì˜¤ì§€ 않습니다.',
'import-error-invalid' => '"$1" 문서는 ì œëª©ì´ ìž˜ëª»ë˜ì—ˆê¸° ë•Œë¬¸ì— ê°€ì ¸ì˜¤ì§€ 않습니다.',
+'import-error-unserialize' => '"$1" ë¬¸ì„œì˜ $2 íŒì´ ì¼ë ¬ì ì´ì§€ 않습니다. $3 콘í…츠 모ë¸ì„ 사용하여 $4 형ì‹ìœ¼ë¡œ ì¼ë ¬í™”ë˜ë„ë¡ íŒì„ 보고했습니다.',
'import-options-wrong' => 'ìž˜ëª»ëœ {{PLURAL:$2|ì„ íƒ ì‚¬í•­}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => '주어진 루트 문서는 ìž˜ëª»ëœ ì œëª©ìž…ë‹ˆë‹¤.',
'import-rootpage-nosubpage' => '루트 ë¬¸ì„œì˜ "$1" ì´ë¦„ê³µê°„ì€ í•˜ìœ„ 문서를 허용하지 않습니다.',
@@ -3062,7 +3087,6 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
# JavaScriptTest
'javascripttest' => 'ìžë°”스í¬ë¦½íŠ¸ 테스트',
-'javascripttest-disabled' => 'ì´ ê¸°ëŠ¥ì€ ë¹„í™œì„±ë˜ì–´ 있습니다.',
'javascripttest-title' => '$1 테스트 실행',
'javascripttest-pagetext-noframework' => 'ì´ ë¬¸ì„œëŠ” ìžë°”스í¬ë¦½íŠ¸ 테스트를 실행하기 위한 ìš©ë„ë¡œ 할당ë˜ì–´ 있습니다.',
'javascripttest-pagetext-unknownframework' => '실험용 í”„ë ˆìž„ì›Œí¬ "$1"를 ì•Œ 수 없습니다.',
@@ -3212,11 +3236,13 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
'pageinfo-default-sort' => '기본 정렬 키',
'pageinfo-length' => '문서 ê¸¸ì´ (ë°”ì´íŠ¸)',
'pageinfo-article-id' => '문서 ID',
+'pageinfo-language' => '문서 내용 언어',
'pageinfo-robot-policy' => '검색 엔진 통계',
'pageinfo-robot-index' => 'ìƒ‰ì¸ ê°€ëŠ¥',
'pageinfo-robot-noindex' => 'ìƒ‰ì¸ ë¶ˆê°€ëŠ¥',
'pageinfo-views' => 'ì½ì€ 수',
'pageinfo-watchers' => '문서를 주시하는 ì‚¬ìš©ìž ìˆ˜',
+'pageinfo-few-watchers' => '{{PLURAL:$1|주시하는 사용ìž}} $1명 미만',
'pageinfo-redirects-name' => 'ì´ ë¬¸ì„œë¡œ 넘겨주기',
'pageinfo-redirects-value' => '$1개',
'pageinfo-subpages-name' => 'ì´ ë¬¸ì„œì˜ í•˜ìœ„ 문서',
@@ -3232,6 +3258,19 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
'pageinfo-magic-words' => '특수 {{PLURAL:$1|명령}} ($1개)',
'pageinfo-hidden-categories' => 'ìˆ¨ì€ {{PLURAL:$1|분류}} ($1ê°œ)',
'pageinfo-templates' => 'í¬í•¨í•œ {{PLURAL:$1|í‹€}} ($1ê°œ)',
+'pageinfo-transclusions' => 'í¬í•¨í•œ {{PLURAL:$1|문서}} ($1ê°œ)',
+'pageinfo-toolboxlink' => '문서 정보',
+'pageinfo-redirectsto' => '넘겨주기 대ìƒ',
+'pageinfo-redirectsto-info' => 'ì •ë³´',
+'pageinfo-contentpage' => '내용 문서로 집계',
+'pageinfo-contentpage-yes' => '예',
+'pageinfo-protect-cascading' => 'ì—¬ê¸°ì„œì˜ ì—°ì‡„ì  ë³´í˜¸',
+'pageinfo-protect-cascading-yes' => '예',
+'pageinfo-protect-cascading-from' => 'ì—°ì‡„ì  ë³´í˜¸í•œ 기ì ',
+'pageinfo-category-info' => '분류 정보',
+'pageinfo-category-pages' => '문서 수',
+'pageinfo-category-subcats' => '하위 분류 수',
+'pageinfo-category-files' => 'íŒŒì¼ ìˆ˜',
# Skin names
'skinname-standard' => 'í´ëž˜ì‹',
@@ -3254,6 +3293,8 @@ $1 사용ìžê°€ ì°¨ë‹¨ëœ ì´ìœ ëŠ” 다ìŒê³¼ 같습니다: "$2"',
'markedaspatrollederror' => '검토한 것으로 표시할 수 없습니다.',
'markedaspatrollederrortext' => '검토한 것으로 표시할 íŒì„ 지정해야 합니다.',
'markedaspatrollederror-noautopatrol' => 'ìžì‹ ì˜ íŽ¸ì§‘ì€ ìŠ¤ìŠ¤ë¡œ 검토할 수 없습니다.',
+'markedaspatrollednotify' => '$1ì— ëŒ€í•œ ë°”ë€œì„ ê²€í† í•œ 것으로 표시했습니다.',
+'markedaspatrollederrornotify' => '검토한 것으로 표시를 실패했습니다.',
# Patrol log
'patrol-log-page' => '검토 기ë¡',
@@ -3287,6 +3328,7 @@ $1',
'file-nohires' => '최대 í•´ìƒë„입니다.',
'svg-long-desc' => 'SVG 파ì¼, 실제 í¬ê¸° $1 × $2 픽셀, íŒŒì¼ í¬ê¸°: $3',
'svg-long-desc-animated' => '애니메ì´ì…˜ SVG 파ì¼, 실제 í¬ê¸° $1 × $2 픽셀, íŒŒì¼ í¬ê¸°: $3',
+'svg-long-error' => 'ìž˜ëª»ëœ SVG 파ì¼: $1',
'show-big-image' => '최대 í•´ìƒë„',
'show-big-image-preview' => '미리 보기 í¬ê¸°: $1',
'show-big-image-other' => '다른 {{PLURAL:$2|í•´ìƒë„}}: $1',
@@ -3316,7 +3358,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1분}}',
'hours' => '{{PLURAL:$1|$1시간}}',
'days' => '{{PLURAL:$1|$1ì¼}}',
+'months' => '{{PLURAL:$1|$1ì›”}}',
+'years' => '{{PLURAL:$1|$1ë…„}}',
'ago' => '$1 ì „',
+'just-now' => '방금',
# Bad image list
'bad_image_list' => '형ì‹ì€ 아래와 같습니다.
@@ -3830,6 +3875,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[ì¸í„°ìœ„키가 비활성ë˜ì–´ 있습니다]',
'scarytranscludefailed' => '[$1 í‹€ì„ ë¶ˆëŸ¬ì˜¤ëŠ” ë°ì— 실패했습니다]',
+'scarytranscludefailed-httpstatus' => '[$1 í‹€ì„ ê°€ì ¸ì˜¤ëŠ” ë° ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤: HTTP $2]',
'scarytranscludetoolong' => '[URLì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤]',
# Delete conflict
@@ -3941,6 +3987,7 @@ $5
'version-license' => 'ë¼ì´ì„ ìŠ¤',
'version-poweredby-credits' => "ì´ ìœ„í‚¤ëŠ” '''[//www.mediawiki.org/ MediaWiki]'''를 기반으로 ìž‘ë™í•©ë‹ˆë‹¤. Copyright © 2001-$1 $2.",
'version-poweredby-others' => 'ê·¸ 외 다른 개발ìž',
+'version-credits-summary' => '[[Special:Version|미디어위키]]ì— ê¸°ì—¬í•œ ë‹¤ìŒ ì‚¬ëžŒí•œí…Œ ê°ì‚¬ë“œë¦½ë‹ˆë‹¤.',
'version-license-info' => "미디어위키는 ìžìœ  소프트웨어입니다. ë‹¹ì‹ ì€ ìžìœ  소프트웨어 ìž¬ë‹¨ì´ ë°œí‘œí•œ GNU ì¼ë°˜ 공중 사용 허가서 버전 2나 ê·¸ ì´í›„ ë²„ì „ì— ë”°ë¼ ì´ íŒŒì¼ì„ 재배í¬í•˜ê±°ë‚˜ 수정할 수 있습니다.
미디어위키가 유용하게 ì‚¬ìš©ë  ìˆ˜ 있기를 ë°”ë¼ì§€ë§Œ '''ìƒìš©ìœ¼ë¡œ 사용'''ë˜ê±°ë‚˜ '''특정 목ì ì— ë§žì„ ê²ƒ'''ì´ë¼ëŠ” ê²ƒì„ '''ë³´ì¦í•˜ì§€ 않습니다'''. ìžì„¸í•œ ë‚´ìš©ì€ GNU ì¼ë°˜ 공중 사용 허가서 ì „ë¬¸ì„ ì°¸ê³ í•˜ì‹­ì‹œì˜¤.
@@ -4057,17 +4104,17 @@ $5
'sqlite-no-fts' => '$1 (ë³¸ë¬¸ì€ ì°¾ê¸°ì—ì„œ 제외)',
# New logging system
-'logentry-delete-delete' => '$1 사용ìžê°€ $3 문서를 삭제했습니다.',
-'logentry-delete-restore' => '$1 사용ìžê°€ $3 문서를 복구했습니다.',
-'logentry-delete-event' => '$1 사용ìžê°€ $3ì˜ ê¸°ë¡ $5ê°œì— ëŒ€í•´ ë³´ì´ê¸° ì„¤ì •ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤: $4',
-'logentry-delete-revision' => '$1 사용ìžê°€ $3 ë¬¸ì„œì˜ {{PLURAL:$5|$5ê°œ 편집}}ì˜ ì„¤ì •ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤: $4',
-'logentry-delete-event-legacy' => '$1 사용ìžê°€ $3 문서 기ë¡ì˜ ë³´ì´ê¸° ì„¤ì •ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤.',
-'logentry-delete-revision-legacy' => '$1 사용ìžê°€ $3 문서 íŽ¸ì§‘ì˜ ë³´ì´ê¸° ì„¤ì •ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤.',
-'logentry-suppress-delete' => '$1 사용ìžê°€ $3 문서를 숨겼습니다.',
-'logentry-suppress-event' => '$1 사용ìžê°€ 비공개ì ìœ¼ë¡œ $3ì˜ {{PLURAL:$5|ê¸°ë¡ $5ê°œ}}ì— ëŒ€í•´ ë³´ì´ê¸° ì„¤ì •ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤: $4',
-'logentry-suppress-revision' => '$1 사용ìžê°€ 비공개ì ìœ¼ë¡œ $3 ë¬¸ì„œì˜ {{PLURAL:$5|íŒ $5ê°œ}}ì— ëŒ€í•´ ë³´ì´ê¸° ì„¤ì •ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤: $4',
-'logentry-suppress-event-legacy' => '$1 사용ìžê°€ 비공개ì ìœ¼ë¡œ $3ì˜ í•­ëª©ì— ëŒ€í•œ ë³´ì´ê¸° ì„¤ì •ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤.',
-'logentry-suppress-revision-legacy' => '$1 사용ìžê°€ 비공개ì ìœ¼ë¡œ $3 ë¬¸ì„œì˜ íŠ¹ì • íŒì— 대한 ë³´ì´ê¸° ì„¤ì •ì„ ë°”ê¾¸ì—ˆìŠµë‹ˆë‹¤.',
+'logentry-delete-delete' => '$1 사용ìžê°€ $3 문서를 {{GENDER:$2|삭제했습니다}}',
+'logentry-delete-restore' => '$1 사용ìžê°€ $3 문서를 {{GENDER:$2|ë˜ì‚´ë ¸ìŠµë‹ˆë‹¤}}',
+'logentry-delete-event' => '$1 사용ìžê°€ $3ì˜ {{PLURAL:$1|ê¸°ë¡ $5ê°œ}}ì— ëŒ€í•´ ë³´ì´ê¸° ì„¤ì •ì„ {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-delete-revision' => '$1 사용ìžê°€ $3 ë¬¸ì„œì˜ {{PLURAL:$5|$5ê°œ 편집}}ì˜ ì„¤ì •ì„ {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-delete-event-legacy' => '$1 사용ìžê°€ $3 문서 기ë¡ì˜ ë³´ì´ê¸° ì„¤ì •ì„ {{GENDER:$2|바꾸었습니다}}',
+'logentry-delete-revision-legacy' => '$1 사용ìžê°€ $3 문서 íŽ¸ì§‘ì˜ ë³´ì´ê¸° ì„¤ì •ì„ {{GENDER:$2|바꾸었습니다}}',
+'logentry-suppress-delete' => '$1 사용ìžê°€ $3 문서를 {{GENDER:$2|숨겼습니다}}',
+'logentry-suppress-event' => '$1 사용ìžê°€ 비공개ì ìœ¼ë¡œ $3ì˜ {{PLURAL:$5|ê¸°ë¡ $5ê°œ}}ì— ëŒ€í•´ ë³´ì´ê¸° ì„¤ì •ì„ {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-suppress-revision' => '$1 사용ìžê°€ 비공개ì ìœ¼ë¡œ $3 ë¬¸ì„œì˜ {{PLURAL:$5|íŒ $5ê°œ}}ì— ëŒ€í•´ ë³´ì´ê¸° ì„¤ì •ì„ {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-suppress-event-legacy' => '$1 사용ìžê°€ 비공개ì ìœ¼ë¡œ $3ì˜ í•­ëª©ì— ëŒ€í•œ ë³´ì´ê¸° ì„¤ì •ì„ {{GENDER:$2|바꾸었습니다}}',
+'logentry-suppress-revision-legacy' => '$1 사용ìžê°€ 비공개ì ìœ¼ë¡œ $3 ë¬¸ì„œì˜ íŠ¹ì • íŒì— 대한 ë³´ì´ê¸° ì„¤ì •ì„ {{GENDER:$2|바꾸었습니다}}',
'revdelete-content-hid' => 'ë‚´ìš© 숨겨ì§',
'revdelete-summary-hid' => '편집 요약 숨겨ì§',
'revdelete-uname-hid' => 'ì‚¬ìš©ìž ì´ë¦„ 숨겨ì§',
@@ -4076,17 +4123,21 @@ $5
'revdelete-uname-unhid' => 'ì‚¬ìš©ìž ì´ë¦„ 숨김 í•´ì œë¨',
'revdelete-restricted' => '관리ìžì—게 ì œí•œì„ ì ìš©í•¨',
'revdelete-unrestricted' => '관리ìžì— 대한 ì œí•œì„ í•´ì œí•¨',
-'logentry-move-move' => '$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-patrol-patrol' => '$1 사용ìžê°€ $3 ë¬¸ì„œì˜ $4íŒì„ 검토한 것으로 표시했습니다.',
-'logentry-patrol-patrol-auto' => '$1 사용ìžê°€ ìžë™ì ìœ¼ë¡œ $3 ë¬¸ì„œì˜ $4íŒì„ 검토한 것으로 표시했습니다.',
-'logentry-newusers-newusers' => '$1 ì‚¬ìš©ìž ê³„ì •ì„ ë§Œë“¤ì—ˆìŠµë‹ˆë‹¤.',
-'logentry-newusers-create' => '$1 ì‚¬ìš©ìž ê³„ì •ì„ ë§Œë“¤ì—ˆìŠµë‹ˆë‹¤.',
-'logentry-newusers-create2' => '$1 사용ìžê°€ $3 ì‚¬ìš©ìž ê³„ì •ì„ ë§Œë“¤ì—ˆìŠµë‹ˆë‹¤.',
-'logentry-newusers-autocreate' => '$1 ì‚¬ìš©ìž ê³„ì •ì„ ìžë™ì ìœ¼ë¡œ 만들었습니다.',
-'newuserlog-byemail' => 'ì´ë©”ì¼ë¡œ 보낸 비밀번호',
+'logentry-move-move' => '$1 사용ìžê°€ $3 문서를 $4 문서로 {{GENDER:$2|옮겼습니다}}',
+'logentry-move-move-noredirect' => '$1 사용ìžê°€ $3 문서를 넘겨주기를 만들지 ì•Šê³  $4 문서로 {{GENDER:$2|옮겼습니다}}',
+'logentry-move-move_redir' => '$1 사용ìžê°€ $3 문서를 $4 문서로 {{GENDER:$2|옮기면서}} 넘겨주기를 ë®ì–´ì¼ìŠµë‹ˆë‹¤',
+'logentry-move-move_redir-noredirect' => '$1 사용ìžê°€ $3 문서를 $4 문서로 넘겨주기를 남기지 않으면서 {{GENDER:$2|옮기면서}} 옮길 대ìƒì— ìžˆë˜ ë„˜ê²¨ì£¼ê¸°ë¥¼ ë®ì–´ì¼ìŠµë‹ˆë‹¤',
+'logentry-patrol-patrol' => '$1 사용ìžê°€ $3 ë¬¸ì„œì˜ $4íŒì„ 검토한 것으로 {{GENDER:$2|표시했습니다}}',
+'logentry-patrol-patrol-auto' => '$1 사용ìžê°€ ìžë™ì ìœ¼ë¡œ $3 ë¬¸ì„œì˜ $4íŒì„ 검토한 것으로 {{GENDER:$2|표시했습니다}}',
+'logentry-newusers-newusers' => '$1 ì‚¬ìš©ìž ê³„ì •ì„ {{GENDER:$2|만들었습니다}}',
+'logentry-newusers-create' => '$1 ì‚¬ìš©ìž ê³„ì •ì„ {{GENDER:$2|만들었습니다}}',
+'logentry-newusers-create2' => '$1 사용ìžê°€ $3 ì‚¬ìš©ìž ê³„ì •ì„ {{GENDER:$2|만들었습니다}}',
+'logentry-newusers-byemail' => '$3 ì‚¬ìš©ìž ê³„ì •ì´ $1ì— {{GENDER:$2|만들어졌고}} 비밀번호는 ì´ë©”ì¼ë¡œ 보냈습니다',
+'logentry-newusers-autocreate' => '$1 ì‚¬ìš©ìž ê³„ì •ì„ ìžë™ì ìœ¼ë¡œ {{GENDER:$2|만들었습니다}}',
+'logentry-rights-rights' => '$1 사용ìžê°€ $3 사용ìžì˜ ê¶Œí•œì„ $4ì—ì„œ $5으로 {{GENDER:$2|바꾸었습니다}}',
+'logentry-rights-rights-legacy' => '$1 사용ìžê°€ $3 사용ìžì˜ ê¶Œí•œì„ {{GENDER:$2|바꾸었습니다}}',
+'logentry-rights-autopromote' => '$1 사용ìžì˜ ê¶Œí•œì„ ìžë™ì ìœ¼ë¡œ $4ì—ì„œ $5으로 {{GENDER:$2|바꾸었습니다}}',
+'rightsnone' => '(ì—†ìŒ)',
# Feedback
'feedback-bugornote' => 'ê¸°ìˆ ì  ë¬¸ì œë¥¼ 구체ì ìœ¼ë¡œ 설명할 준비가 ë˜ì—ˆë‹¤ë©´ [$1 버그를 ì‹ ê³ ]í•´ 주세요.
@@ -4140,6 +4191,7 @@ $5
'api-error-ok-but-empty' => '내부 오류: 서버ì—ì„œ ì‘ë‹µì´ ì—†ìŠµë‹ˆë‹¤.',
'api-error-overwrite' => 'ì´ë¯¸ 있는 파ì¼ì„ ë®ì–´ì“¸ 수 없습니다.',
'api-error-stashfailed' => '내부 오류: 서버가 ìž„ì‹œ 파ì¼ì„ 저장하지 못했습니다.',
+'api-error-publishfailed' => '내부 오류: 서버가 ìž„ì‹œ 파ì¼ì„ 게시하지 못했습니다.',
'api-error-timeout' => '서버가 ì œ 시간 ë‚´ì— ì‘답하지 않았습니다.',
'api-error-unclassified' => 'ì•Œ 수 없는 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.',
'api-error-unknown-code' => '알 수 없는 오류: "$1".',
@@ -4160,4 +4212,7 @@ $5
'duration-centuries' => '$1{{PLURAL:$1|세기}}',
'duration-millennia' => '$1{{PLURAL:$1|천년}}',
+# Image rotation
+'rotate-comment' => 'ê·¸ë¦¼ì„ ì‹œê³„ 방향으로 $1{{PLURAL:$1|ë„}}ë¡œ 회전함',
+
);
diff --git a/languages/messages/MessagesKoi.php b/languages/messages/MessagesKoi.php
index 00be8d81..4b61931c 100644
--- a/languages/messages/MessagesKoi.php
+++ b/languages/messages/MessagesKoi.php
@@ -385,6 +385,9 @@ $messages = array(
'grouppage-sysop' => '{{ns:project}}:ВеÑькöтлiÑÑез',
+# Special:Log/newusers
+'newuserlogpage' => 'УджкериÑьö гижöтчан журнал',
+
# User rights log
'rightslog' => 'УджкериÑьлö позÑннÑз Ñьöртi журнал',
@@ -489,9 +492,6 @@ $messages = array(
# Special:LinkSearch
'linksearch' => 'Вики Ñайöдз Ñ‹ÑтöттÑз',
-# Special:Log/newusers
-'newuserlogpage' => 'УджкериÑьö гижöтчан журнал',
-
# Special:ListGroupRights
'listgrouprights-members' => '(уджкериÑÑезлöн нимлёдз)',
diff --git a/languages/messages/MessagesKrc.php b/languages/messages/MessagesKrc.php
index 10f143a3..8e4ef847 100644
--- a/languages/messages/MessagesKrc.php
+++ b/languages/messages/MessagesKrc.php
@@ -39,6 +39,34 @@ $namespaceNames = array(
// Remove Russian aliases
$namespaceGenderAliases = array();
+$specialPageAliases = array(
+ 'Activeusers' => array( 'Тири_къошулуучула' ),
+ 'Allmessages' => array( 'СиÑтеманы_билдириулери' ),
+ 'Allpages' => array( 'Бютеу_бетле' ),
+ 'Blankpage' => array( 'Бош_бет' ),
+ 'Block' => array( 'Блокла' ),
+ 'Blockme' => array( 'Мени_блокла' ),
+ 'Booksources' => array( 'Китабланы_къайнакълары' ),
+ 'BrokenRedirects' => array( 'Джыртылгъан_редиректле' ),
+ 'Categories' => array( 'КатегориÑла' ),
+ 'ChangeEmail' => array( 'E-mail_ауушдур' ),
+ 'ChangePassword' => array( 'Пароль_ауушдур' ),
+ 'ComparePages' => array( 'Бетлени_тенглешдириу' ),
+ 'Confirmemail' => array( 'E-mail_тюзлюгюн_бегит' ),
+ 'Contributions' => array( 'Къошум' ),
+ 'CreateAccount' => array( 'Тергеу_джазыуну_къура', 'Къошулуучуну_къура', 'ЗарегиÑтрироватьÑÑ' ),
+ 'Deadendpages' => array( 'Чыкъмазча_бетле' ),
+ 'DeletedContributions' => array( 'Кетерилген_къошум' ),
+ 'Disambiguations' => array( 'Кёб_магъаналы' ),
+ 'DoubleRedirects' => array( 'Экили_редирект' ),
+);
+
+$magicWords = array(
+ 'redirect' => array( '0', '#джибериу', '#редирект', '#перенаправление', '#перенапр', '#REDIRECT' ),
+ 'notoc' => array( '0', '__БÐШЛÐСЫЗ__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '_ГÐЛЛЕРЕЯСЫЗ__', '__БЕЗ_ГÐЛЕРЕИ__', '__NOGALLERY__' ),
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'Джибериулени черт:',
@@ -173,6 +201,7 @@ $messages = array(
'newwindow' => '(джангы терезеде ачылады)',
'cancel' => 'Ызына алыу',
'moredotdotdot' => 'Баргъаны…',
+'morenotlisted' => 'Энди джукъ джокъду...',
'mypage' => 'Бет',
'mytalk' => 'Сюзюу',
'anontalk' => 'Бу IP-адреÑге Ñюзюу бет',
@@ -184,7 +213,6 @@ $messages = array(
'qbbrowse' => 'Къарау',
'qbedit' => 'Тюрлендир',
'qbpageoptions' => 'Бу бет',
-'qbpageinfo' => 'Бетни ÑŽÑюнден',
'qbmyoptions' => 'Бетлерим',
'qbspecialpages' => 'Къуллукъчу бетле',
'faq' => 'FAQ',
@@ -207,6 +235,7 @@ $messages = array(
'namespaces' => 'Ðтланы аламы',
'variants' => 'Вариантла',
+'navigation-heading' => 'ÐÐ°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ Ð¼ÐµÐ½ÑŽ',
'errorpagetitle' => 'Халат',
'returnto' => '«$1» бетге къайт',
'tagline' => '{{SITENAME}} Ñайтдан',
@@ -445,11 +474,11 @@ $2',
# Login and logout pages
'logouttext' => "'''Ðккаунтугъуздан чыкъдыгъыз.'''
-Сиз {{SITENAME}} Ñайтда аноним халда къалыргъа боллкъÑуз. неда [[Special:UserLogin|джангыдан кирирге]].
+Сиз {{SITENAME}} Ñайтда аноним халда къалыргъа боллкъÑуз. неда <span class='plainlinks'>[$1 джангыдан кирирге]</span>.
Талай бетле Ñиз тергеу джазыу (аккаунт) бла киргенча кёрюнюрге боллукъдула, аны кетерир ючюн кÑшни джангыртыгъыз.",
-'welcomecreation' => '== Хош келигиз, $1! ==
-Сизни тергеу джазыуугъуз (аккаунтугъуз) къуралды.
-Сайтны [[Special:Preferences|перÑонал джарашдырыуларыны]] къараргъа унутмагъыз.',
+'welcomeuser' => 'Сау кел, $1!',
+'welcomecreation-msg' => 'Сизни тергеу джазыуугъуз (аккаунтугъуз) къуралды.
+{{SITENAME}} Ñайтда [[Special:Preferences|джарашдырыуларыгъызны]] тюрлендирирге унутмагъыз.',
'yourname' => 'Къошулуучуну аты',
'yourpassword' => 'Паролюгъуз:',
'yourpasswordagain' => 'Паролну джангыдан джаз:',
@@ -472,7 +501,7 @@ $2',
'gotaccount' => 'Тергеу джазыуугъуз (аккаунтугъуз) Ñнди бармыды? $1.',
'gotaccountlink' => 'Кириу',
'userlogin-resetlink' => 'Кирир ючюн билгилеригизни унутхан ÑтгенмиÑиз?',
-'createaccountmail' => 'e-mail бла',
+'createaccountmail' => 'ЭÑде болмагъанлай Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñтилген болджаллы паролну хайырландыр Ñм тюбюрекде берилген Ñлектрон почта адреÑге ий:',
'createaccountreason' => 'Чурум:',
'badretype' => 'Джазгъан паролларыгъыз бир-бирине келишмейдиле.',
'userexists' => 'Джазылгъан ат хайырландырылады.
@@ -750,7 +779,6 @@ $2',
'template-semiprotected' => '(джарты джакъланыбды)',
'hiddencategories' => 'Бу бет $1 {{PLURAL:$1|1 джашырылыннган категориÑгъа|$1 джашырылыннган категориÑлагъа}} киреди:',
'edittools' => '<!-- Былайда орналгъан текÑÑ‚ тюрлениу Ñмда джюклениу формада кёрюннюкдю. -->',
-'nocreatetitle' => 'Бетле къурау чекленибди',
'nocreatetext' => 'Бу Ñайтда джангы бет къуралыу тыйылгъанды.
Ызына къайтыб болгъан бетни тюрлендирирге боллукъÑуз, [[Special:UserLogin|ÑиÑтемагъа кеÑигизни танытыргъа неда джангы тергеу джазыу (аккаунт) къураргъа]].',
'nocreate-loggedin' => 'Джангы бетле къураргъа Ñркинлигигиз джокъду.',
@@ -775,6 +803,15 @@ $2',
'edit-already-exists' => 'Джангы бет къураргъа боллукъ тюлдю.
ÐлайÑызда барды бу атлы бет.',
'defaultmessagetext' => 'Тынгылау бла текÑÑ‚',
+'content-failed-to-parse' => '$2 контент $1 типге келишмейди: $3',
+'invalid-content-data' => 'Джаламагъан билгиле',
+'content-not-allowed-here' => '[[$2]] бетни ичинде "$1" контент джарамайды',
+
+# Content models
+'content-model-wikitext' => 'вики-текÑÑ‚',
+'content-model-text' => 'тюз текÑÑ‚',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''ЭÑгериу:''' Бу бетде аÑыры кёб къайнакълы Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±Ð°Ñ€Ð´Ñ‹.
@@ -1295,12 +1332,13 @@ $1 {{PLURAL:$1|Ñимволдан|Ñимволладан}} кеб болургъ
'right-sendemail' => 'Башха къошулуучулагъа Ñлектрон почта джиберирге',
'right-passwordreset' => "пароль тюрлениуле бла e-mail'леге къарау",
+# Special:Log/newusers
+'newuserlogpage' => 'Къошулуучуланы региÑтрациÑларыны журналы',
+'newuserlogpagetext' => 'Кёб болмай региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñтген къошулуучуланы тизмеÑи.',
+
# User rights log
'rightslog' => 'Къошулуучуну хакъларыны журналы',
'rightslogtext' => 'Бу къошулуучуну хакъларыны тюрлениуюню журналыды',
-'rightslogentry' => '$1-ни къауумлада членлиги $2-ден $3-ге тюрленнгенди',
-'rightslogentry-autopromote' => '$2 къауумдан автомат халда $3 къауумгъа кёчюрюлдю',
-'rightsnone' => '(джокъ)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'бу бетни окъуу',
@@ -1885,10 +1923,6 @@ URL-ни тюз , Ñайтны ачыкъ болгъанына ишекÑиз б
'activeusers-hidesysops' => 'ÐдминиÑтраторланы джашыр',
'activeusers-noresult' => 'Къошлуучу табылмады.',
-# Special:Log/newusers
-'newuserlogpage' => 'Къошулуучуланы региÑтрациÑларыны журналы',
-'newuserlogpagetext' => 'Кёб болмай региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñтген къошулуучуланы тизмеÑи.',
-
# Special:ListGroupRights
'listgrouprights' => 'Къошулуучуланы къауумуну хакълары',
'listgrouprights-summary' => 'Тюбюндеги бу викиде танылгъан къошулуучу къауумланы Ñмда аланы хакъларыны тизмеÑи.
@@ -1983,11 +2017,7 @@ URL-ни тюз , Ñайтны ачыкъ болгъанына ишекÑиз б
'enotif_mailer' => '{{SITENAME}} Билдириу Почта',
'enotif_reset' => 'Бютеу бетлени къаралгъанча белгиле',
-'enotif_newpagetext' => 'Бу джангы бетди',
'enotif_impersonal_salutation' => '{{SITENAME}} къошулуучу',
-'changed' => 'тюрленди',
-'created' => 'къуралды',
-'enotif_subject' => '{{SITENAME}} бет $PAGETITLE, $PAGEEDITOR джанындан $CHANGEDORCREATED Ñтилгенди.',
'enotif_lastvisited' => 'ÐÑ…Ñ‹Ñ€ кириуюгюзден бу кереге дери болгъан бютеу тюрлениулени кёрюр ючюн $1-ге къара.',
'enotif_lastdiff' => 'Бу тюрлениуню кёрюр ючюн, $1 бетге къарагъыз.',
'enotif_anon_editor' => 'аноним къошулуучу $1',
@@ -2003,20 +2033,22 @@ $NEWPAGE
Ñл. почта: $PAGEEDITOR_EMAIL
вики: $PAGEEDITOR_WIKI
-Бу бетге киргинчигизге дери бу бет бла байламлы башха тюрлендириулени ÑŽÑюнден хапар джибериллик тюлдю. Санчыкълау ÑпиÑогугъуздагъу бютеу бетлени билдириу джибериу опциÑларын джукълаталлыкъÑыз.
+Бу бетге киргинчигизге дери бу бет бла байламлы башха тюрлендириулени ÑŽÑюнден хапар джибериллик тюлдю. Кёзде тургъан тизмегиздеги бютеу бетлени билдириу джибериу опциÑларын джукълаталлыкъÑыз.
{{SITENAME}} Ñайтны билдириу ÑиÑтемаÑÑ‹.
--
Джарашдырыуланы тюрлендирир ючюн:
-{{canonicalurl:Special:Watchlist/edit}}
+{{fullurl:{{#special:Watchlist}}/edit}}
Кёзде тургъан тизмеден кетерир ючюн:
$UNWATCHURL
Болушлукъ Ñм теджеуле ючюн:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'къуралды',
+'changed' => 'тюрленди',
# Delete
'deletepage' => 'Бетни кетер',
@@ -2664,6 +2696,7 @@ MediaWiki локализациÑÑына юлюш къошаргъа излей
'pageinfo-default-sort' => 'Тынгылау бла Ñортлауну ачхычы',
'pageinfo-length' => 'Бетни узунлугъу (байтла бла)',
'pageinfo-article-id' => 'Бетни идентификатору',
+'pageinfo-language' => 'Бетни ичиндегиÑини тили',
'pageinfo-robot-policy' => 'Излеу къуллукъла бла индекÑациÑ',
'pageinfo-robot-index' => 'ИндекÑÐ°Ñ†Ð¸Ñ Ñтиледи',
'pageinfo-robot-noindex' => 'ИндекÑÐ°Ñ†Ð¸Ñ Ñтилмейди',
@@ -2674,6 +2707,11 @@ MediaWiki локализациÑÑына юлюш къошаргъа излей
'pageinfo-lastuser' => 'ÐÑ…Ñ‹Ñ€ редактор',
'pageinfo-edits' => 'Бютеу тюрлендириулени Ñаны',
'pageinfo-authors' => 'Тюрлю-тюрлю авторланы Ñаны',
+'pageinfo-toolboxlink' => 'Бетни ÑŽÑюнден',
+'pageinfo-redirectsto' => 'Башха бетге редиректди —',
+'pageinfo-redirectsto-info' => 'билги',
+'pageinfo-contentpage-yes' => 'Хоу',
+'pageinfo-protect-cascading-yes' => 'Хоу',
# Skin names
'skinname-standard' => 'Стандарт',
@@ -2696,6 +2734,7 @@ MediaWiki локализациÑÑына юлюш къошаргъа излей
'markedaspatrollederror' => 'Сыналмаганды',
'markedaspatrollederrortext' => 'Сыналгъан кибик белгилер ючюн верÑÐ¸Ñ Ð±ÐµÐ»Ð³Ð¸Ð»ÐµÑ€Ð³Ðµ керекÑиз.',
'markedaspatrollederror-noautopatrol' => 'КеÑигизни тюрлендириулеригизни, Ñыналгъан кибик белгилерге Ñркинлигигиз джокъду.',
+'markedaspatrollednotify' => '«$1» бетдеги бу тюрлениу тинтиб къаралгъанча белгиленди.',
# Patrol log
'patrol-log-page' => 'Патруль Ñтиуню журналы',
@@ -3512,16 +3551,19 @@ MediaWiki хайырлы боллукъду деген умут бла джайÑ
'revdelete-restricted' => 'админиÑтраторла ючюн Ñтилген чеклениуле',
'revdelete-unrestricted' => 'админиÑтратолра ючюн Ñтилген чеклениуле къоратылгъандыла',
'logentry-move-move' => '$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-noredirect' => '$1, $3 бетни атын $4 деб {{GENDER:$2|тюрлендирди}} (редирект къоймагъанлай)',
+'logentry-move-move_redir' => '$1, $3 бетни атын $4 деб {{GENDER:$2|тюрлендирди}} (редиректни башы бла)',
+'logentry-move-move_redir-noredirect' => '$1, $3 бетни атын $4 деб {{GENDER:$2|тюрлендирди}} (редиректни башы бла Ñм редирект къурамай)',
'logentry-patrol-patrol' => '$1, $3 бетни $4 верÑиÑын партруль Ñтиб чыкъды',
'logentry-patrol-patrol-auto' => '$1, $3 бетни $4 верÑиÑÑын автомат халда тинтиб чыкъды',
-'logentry-newusers-newusers' => '$1 тергеу джазыу (аккаунт) къуралды',
+'logentry-newusers-newusers' => '$1 тергеу джазыу (аккаунт) {{GENDER:$2|къуралды}}',
'logentry-newusers-create' => '$1 тергеу джазыу (аккаунт) къуралды',
'logentry-newusers-create2' => '$1, $3 тергеу джазыуну къурады',
'logentry-newusers-autocreate' => '$1 тергеу джазыу автомат халда къуралды',
-'newuserlog-byemail' => 'пароль Ñлектрон почта бла джиберилгенди',
+'logentry-rights-rights' => '$1 къошулуучу, $3 къошулуучуну членлигин $4 къауумдан $5 къауумгъа {{GENDER:$2|кёчюрдю}}',
+'logentry-rights-rights-legacy' => '$1 къошулуучу, $3 къушулуучуну къауумлада членлигин тюрлендирди',
+'logentry-rights-autopromote' => '$1 къошулуучу, $4 къауумдан автомат халда $5 къауумгъа {{GENDER:$2|кёчюрюлдю}}',
+'rightsnone' => '(джокъ)',
# Feedback
'feedback-subject' => 'Тема:',
diff --git a/languages/messages/MessagesKrj.php b/languages/messages/MessagesKrj.php
index c917147c..ab7c9c64 100644
--- a/languages/messages/MessagesKrj.php
+++ b/languages/messages/MessagesKrj.php
@@ -112,7 +112,6 @@ $messages = array(
'qbbrowse' => 'Bilid',
'qbedit' => 'Iislan',
'qbpageoptions' => 'Dya nga Pahina',
-'qbpageinfo' => 'Konteksto',
'qbspecialpages' => 'Manga espesyal nga pahina',
'faq' => 'FAQ',
'faqpage' => 'Project:FAQ',
diff --git a/languages/messages/MessagesKs_arab.php b/languages/messages/MessagesKs_arab.php
index 1f1e0c9f..3241a78b 100644
--- a/languages/messages/MessagesKs_arab.php
+++ b/languages/messages/MessagesKs_arab.php
@@ -14,6 +14,26 @@
$rtl = true;
+$namespaceNames = array(
+ NS_MEDIA => 'میڈیا',
+ NS_SPECIAL => 'خاص',
+ NS_MAIN => '',
+ NS_TALK => 'بَحَژ',
+ NS_USER => 'رÙÚ©ÙÙ†',
+ NS_USER_TALK => 'رÙÚ©ÙÙ†_بَحَژ',
+ NS_PROJECT_TALK => '$1_بَحَژ',
+ NS_FILE => 'ÙÙŽÛŒÙÙ„',
+ NS_FILE_TALK => 'ÙÙŽÛŒÙÙ„_بَحَژ',
+ NS_MEDIAWIKI => 'میڈیاوکی',
+ NS_MEDIAWIKI_TALK => 'میڈیاوکی_بَحَژ',
+ NS_TEMPLATE => 'Ùرما',
+ NS_TEMPLATE_TALK => 'Ùرما_بَحَژ',
+ NS_HELP => 'پَلزÙÙ†',
+ NS_HELP_TALK => 'پَلزÙÙ†_بَحَژ',
+ NS_CATEGORY => 'زٲژ',
+ NS_CATEGORY_TALK => 'زٲژ_بَحَژ',
+);
+
$digitTransformTable = array(
'0' => 'Ù ', # &#x0660;
'1' => 'Ù¡', # &#x0661;
diff --git a/languages/messages/MessagesKs_deva.php b/languages/messages/MessagesKs_deva.php
index f19a9c78..c4ae7fcb 100644
--- a/languages/messages/MessagesKs_deva.php
+++ b/languages/messages/MessagesKs_deva.php
@@ -11,6 +11,25 @@
* @author VibhasKS
*/
+$namespaceNames = array(
+ NS_MEDIA => 'मीडिया',
+ NS_SPECIAL => 'खास',
+ NS_TALK => 'बहज़',
+ NS_USER => 'रà¥à¤•à¥à¤¨',
+ NS_USER_TALK => 'रà¥à¤•à¥à¤¨_बहज़',
+ NS_PROJECT_TALK => '$1_बहज़',
+ NS_FILE => 'फ़ाइल',
+ NS_FILE_TALK => 'फ़ाइल_बहज़',
+ NS_MEDIAWIKI => 'मीडियाविकि',
+ NS_MEDIAWIKI_TALK => 'मीडियाविकि_बहज़',
+ NS_TEMPLATE => 'नमॆना',
+ NS_TEMPLATE_TALK => 'नमॆना_बहज़',
+ NS_HELP => 'म॒दत',
+ NS_HELP_TALK => 'म॒दत_बहज़',
+ NS_CATEGORY => 'ज़ॉज़',
+ NS_CATEGORY_TALK => 'ज़ॉज़_बहज़',
+);
+
$digitTransformTable = array(
'0' => '०', # &#x0966;
'1' => '१', # &#x0967;
diff --git a/languages/messages/MessagesKsh.php b/languages/messages/MessagesKsh.php
index 35480592..3227f0da 100644
--- a/languages/messages/MessagesKsh.php
+++ b/languages/messages/MessagesKsh.php
@@ -165,7 +165,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Neuste_Änderunge', 'Änderunge' ),
'Recentchangeslinked' => array( 'Änderungen_an_verlinkte_Sigge' ),
'Revisiondelete' => array( 'Version_fottschmieße' ),
- 'RevisionMove' => array( 'VersioneÖmnänne', 'Versione_Ömnänne', 'VersioneÖmnenne', 'Versione_Ömnenne' ),
'Search' => array( 'Sök', 'Söök', 'Söke', 'Sööke' ),
'Shortpages' => array( 'Koote_Atikelle' ),
'Specialpages' => array( 'Sondersigge', 'Söndersigge' ),
@@ -345,6 +344,7 @@ $messages = array(
'newwindow' => '(Mäht e neu Finster op, wann Dinge Brauser dat kann)',
'cancel' => 'Stopp! Avbreche!',
'moredotdotdot' => 'Mieh&nbsp;…',
+'morenotlisted' => 'Et jeiht noch wigger&nbsp;&hellip;',
'mypage' => 'Metmaachersigg',
'mytalk' => 'Klaafsigg',
'anontalk' => 'Klaaf för de IP-Adress',
@@ -356,7 +356,6 @@ $messages = array(
'qbbrowse' => 'Aanluure',
'qbedit' => 'Ändere',
'qbpageoptions' => 'Sigge Enstellunge',
-'qbpageinfo' => 'Ãœvver de Sigg',
'qbmyoptions' => 'Ming Sigge',
'qbspecialpages' => 'Spezial Sigge',
'faq' => 'FAQ',
@@ -379,6 +378,7 @@ $messages = array(
'namespaces' => 'Appachtemangs',
'variants' => 'Variante',
+'navigation-heading' => 'Menü för et Navijeere',
'errorpagetitle' => 'Fähler',
'returnto' => 'Jangk widder noh: „$1“.',
'tagline' => 'Us {{GRAMMAR:Dative|{{SITENAME}}}}',
@@ -635,12 +635,11 @@ Dä Wiki_Köbes dovun hät beim Deeschmaache als Jrond aanjejovve: „$3“',
# Login and logout pages
'logouttext' => "'''Jetz bes de usjelogg'''
-Do künnts heh em Wiki wigger maache, als ene namelose Metmaacher. Do kanns De ävver och [[Special:UserLogin|widder enlogge]], als däselve oder och ene andere Metmaacher.
+Do künnts heh em Wiki wigger maache, als ene namelose Metmaacher. Do kanns De ävver och <span class='plainlinks'>[\$1 widder enlogge]</span>, als däselve oder och ene andere Metmaacher.
Künnt sin, dat De de ein oder ander Sigg immer wigger aanjezeich kriss, wie wann de noch enjelogg wörs. Dun Dingem Brauser singe <i lang=\"en\">Cache</i> fottschmieße oder leddich maache, öm us dä Nummer erus ze kumme!",
-'welcomecreation' => '== Dach, $1! ==
-Dinge Zojang för heh es do.
-Do bes jetz aanjemeldt.
-Denk dran, Do künnts Der [[Special:Preferences|Ding Enstellunge heh för {{GRAMMAR:Akk|{{SITENAME}}}} zeräächmaache]].',
+'welcomeuser' => 'Wellkumme $1!',
+'welcomecreation-msg' => 'Dinge Zohjang es enjerescht.
+Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].',
'yourname' => 'Metmaacher_Naame:',
'yourpassword' => 'Paßwoot:',
'yourpasswordagain' => 'Noch ens dat Passwood',
@@ -663,7 +662,7 @@ Denk dran, Do künnts Der [[Special:Preferences|Ding Enstellunge heh för {{GRAM
'gotaccount' => "Do bes ald aanjemeldt {{GRAMMAR:en|{{SITENAME}}}}? Dann jangk nohm '''$1'''.",
'gotaccountlink' => 'Enlogge',
'userlogin-resetlink' => 'Häß De Ding Daate för et Enlogge verjäße?',
-'createaccountmail' => 'Scheck mer en E-Mail met Passwood',
+'createaccountmail' => 'Scheck mer en E-Mail met enem neu ußjedachte Passwood op Zick',
'createaccountreason' => 'Jrond:',
'badretype' => 'Ding zwëij ennjejovve Paßßwööter sinn nit ejaal. Do muss De Dich för ein entscheide.',
'userexists' => 'Ene Metmaacher met däm Name jidd et ald.
@@ -771,6 +770,7 @@ Et süht us, wi wann ene kappodde Brauser udder <i lang=\"en\">proxy</i>ẞööv
# Email sending
'php-mail-error-unknown' => 'Nit bekannte Fähler met dä Funxjohn <code lang="en">mail()</code> vum PHP',
'user-mail-no-addy' => 'Do häs versöhg en <i lang="en">e-mail</i> der ohne en Adräß ze verschecke',
+'user-mail-no-body' => 'En dä <i lang="en">e-mail</i> schteiht nix udder zoh winnisch dren.',
# Change password dialog
'resetpass' => 'Passwood tuusche udder neu ußjävve',
@@ -842,6 +842,7 @@ Do moß Ding Paßwoot enjävve, öm Ding Änderong ze bschtäätejje.',
'changeemail-oldemail' => 'Ding Address för de <i lang="en">e-mail</i> es jäz:',
'changeemail-newemail' => 'Ding neue Address för de <i lang="en">e-mail</i> sull wääde:',
'changeemail-none' => '(kein)',
+'changeemail-password' => 'Ding Passwoot {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}}:',
'changeemail-submit' => 'Lohß jonn!',
'changeemail-cancel' => 'Ophüre',
@@ -1072,7 +1073,6 @@ Heh kütt der neuste Enndrach em Logbooch doh drövver:",
'template-semiprotected' => '(halfjeschöz - tabu för neu Metmaacher un ohne Enlogge)',
'hiddencategories' => 'Die Sigg heh is en {{PLURAL:$1|dä verstoche Saachjrupp: |dä $1 verstoche Saachjruppe: |keij verstoche Saachjruppe dren.}}',
'edittools' => '<!-- Dä Tex hee zeich et Wiki unger däm Texfeld zom „Ändere/Bearbeide“ un beim Texfeld vum „Huhlade“. -->',
-'nocreatetitle' => 'Neu Sigge Aanläje eß nit einfach esu möjjelesch.',
'nocreatetext' => 'Sigge neu aanläje es nor müjjelich, wann de [[Special:UserLogin|enjelogg]] bes. Der ohne kanns De ävver Sigge ändere, die ald do sin.',
'nocreate-loggedin' => 'Do häs nit dat Rääch, neu Sigge aanzelääje.',
'sectioneditnotsupported-title' => 'Afschnedde Ändere is nit zohjelohße',
@@ -1092,6 +1092,15 @@ Ene Jrond weße mer nit.',
'edit-no-change' => 'Do häs ja nix aan dä Sigg jeändert, do dom_mer och nix domet.',
'edit-already-exists' => 'Kunnt kei neu Sigg aanlääje. Di Sigg jidd_et ald.',
'defaultmessagetext' => 'Dä standaadmäßije Tex',
+'content-failed-to-parse' => 'Et wohr nit müjjelesch, dä Enhalld met däm <i lang="en">MIME-Typ</i> $2 för en Dattei met $1 dren ze verwooschte: $3.',
+'invalid-content-data' => 'Di Daate en dä Sigg sen onjöltesch.',
+'content-not-allowed-here' => 'Ene Enhalld vun dä Zoot „$1“ es op dä Sigg „[[$2]]“ nit zohjelohße.',
+
+# Content models
+'content-model-wikitext' => 'Wikitäx',
+'content-model-text' => 'Eijnfache Tex',
+'content-model-javascript' => 'JavaSkrepp',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Opjepaß:''' Die Sigg heh määt zovill Opwand met Paaser-Funkßjohne.
@@ -1465,9 +1474,9 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'prefs-emailconfirm-label' => 'Beshtätejung övver <i lang="en">e-mail</i>:',
'prefs-textboxsize' => 'Wi jruuß sull dat Feld för et Afschnedde un Sigge ändere sin',
'youremail' => 'E-Mail *',
-'username' => 'Metmaacher Name:',
-'uid' => 'Metmaacher Nommer:',
-'prefs-memberingroups' => 'Bes en {{PLURAL:$1|de Metmaacherjrupp:|<strong>$1</strong> Metmaacherjruppe:|keijn Metmaacherjruppe.}}',
+'username' => '{{GENDER:$1|Metmaacher|MetmaacherÄ—nne|Metmaacher|MetmaacherÄ—nne|Metmaacher}} Name:',
+'uid' => '{{GENDER:$1|Metmaacher|MetmaacherÄ—nne|Metmaacher|MetmaacherÄ—nne|Metmaacher}} Nommer:',
+'prefs-memberingroups' => '{{GENDER:$2|Bes}} en {{PLURAL:$1|de Metmaacherjrupp:|$1 Metmaacherjruppe:|keijn Metmaacherjruppe.}}',
'prefs-registration' => 'Aanjemeldt zick',
'prefs-registration-date-time' => 'dem $2 öm $3 Uhr',
'yourrealname' => 'Dinge richtije Name *',
@@ -1616,12 +1625,13 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
'right-sendemail' => '<i lang="en">e-mail</i> aan ander Metmaacher schecke',
'right-passwordreset' => 'De <i lang="en">e-mails</i> vum Paßwoot neu Säze aanloore',
+# Special:Log/newusers
+'newuserlogpage' => 'Logboch för neu Metmaachere',
+'newuserlogpagetext' => 'He sin de Metmaacher opjelėßß, di sesh nöü aanjemäldt han.',
+
# User rights log
'rightslog' => 'Logboch för Änderunge aan Metmaacher-Räächde',
'rightslogtext' => 'Hee sin de Änderunge an Metmaacher ehre Räächde opjeliss. Op de Sigge üvver Metmaacher, Wiki-Köbesse, Bürrokrade, Stewards, un esu, kanns De nohlese, wat domet es.',
-'rightslogentry' => 'hät däm Metmaacher „$1“ sing Räächde vun „$2“ op „$3“ ömjestallt.',
-'rightslogentry-autopromote' => 'wood automattesch vun $2 zohm $3 jemaat.',
-'rightsnone' => '(nix)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'di Sigg ze lesse',
@@ -1885,6 +1895,7 @@ Wann et nit flupp, verzäll et enem [[Special:ListUsers/sysop|Wiki-Köbes]].',
'backend-fail-notsame' => 'En Dattei mem Name $1 jidd et ald, di es ävver ongerscheidlesch.',
'backend-fail-invalidpath' => '„$1“ es keine jölteje Pahd för et Speischere.',
'backend-fail-delete' => 'Mer kunnte di Dattei $1 nit fottschmiiße.',
+'backend-fail-describe' => 'Mer kunnte de Metta_Daate för di Dattei $1 nit ändere.',
'backend-fail-alreadyexists' => 'En Dattei $1 jidd et ald.',
'backend-fail-store' => 'Mer kunnte di Dattei $1 nit onger $2 affschpeischere.',
'backend-fail-copy' => 'Mer kunnte di Dattei $1 nit noh $2 koppÄ—Ä—ere.',
@@ -2130,6 +2141,12 @@ Esu en Links sollte eijentlesch op en Sigg jon, di tirek jemeint es.
Ene Atikel weed als en „(Watt ėßß datt?)“-Sigg jezallt, wann dä en Schablohn opröhf, op di ene Lenk en dä Sigg [[MediaWiki:Disambiguationspage]] dren es.',
+'pageswithprop' => 'Sigge med en beschtemmpte Eijeschaff',
+'pageswithprop-legend' => 'Sigge med en Eijeschaff',
+'pageswithprop-text' => 'Heh di Sigg zeisch Sigge, di en beschtemmpte Eijeschaf han',
+'pageswithprop-prop' => 'Dä name vun dä Eijeschaff:',
+'pageswithprop-submit' => 'Lohß Jonn!',
+
'doubleredirects' => 'Ömleitunge op Ömleitunge',
'doubleredirectstext' => 'Hee fings De en jede Reih ene Link op de iertste un de zweite Ömleitung, donoh ene Link op de Sigg, wo de
zweite Ömleitung hin jeiht. För jewöhnlich es dat dann och de richtije Sigg, wo de iertste Ömleitung ald hen jonn sullt.
@@ -2303,11 +2320,9 @@ eins vun all däm op eimol.',
'linksearch-pat' => 'Sök noh:',
'linksearch-ns' => 'Appachtemang:',
'linksearch-ok' => 'Söhke',
-'linksearch-text' => 'Di {{int:nstab-special}} heh mäd_et müjjelesch noh Sigge ze söke, woh beshtemmpte Links op Websigge dren enthallde sin.
-
-Beim Söke künnd_Er Schtäänsche aanjevve för e Schtöcksche fun ennem Name, wo mer nit jenou weiß, wi et heiß udder wat me nit kenne deit, zem Beishpöll esu: <code>http://*.example.com</code> un ene bövverschte Name för en Domain moß aanjejovve sin, zem Beishpöll esu: <code>http://*.org</code>
+'linksearch-text' => 'Beim Söke künnd_Er Schtäänsche aanjevve för e Schtöcksche fun ennem Naame, wo mer nit jenou weiß, wi et heiß udder wat me nit kenne deit, zem Beishpöll esu: <code>http://*.example.com</code> un ene bövverschte Name för en Domain moß aanjejovve sin, zem Beishpöll esu: <code>http://*.org</code>
-De Brauserprotokolle, di beim Söke aanjejovve wäde künne, sen: <code>$1</code> un der Schtandatt es <code>http://</code> wann nix aanjejovve es.',
+{{PLURAL:$2|Dat Brauserprotokoll, wat|De Brauserprotokolle, di|Kein Brauserprotokolle, di}} mer beim Söhke aanjävve kann, sin: <code>$1</code>, un der Schtandatt es <code>http://</code> wann nix aanjejovve es.',
'linksearch-line' => '„$2“ hät ene Link op $1',
'linksearch-error' => 'Shternshe kam_mer nor aam Aanfang fum Domain-Name bruche.',
@@ -2326,10 +2341,6 @@ De Brauserprotokolle, di beim Söke aanjejovve wäde künne, sen: <code>$1</code
'activeusers-hidesysops' => 'De Wiki_Köbesse fott lohße',
'activeusers-noresult' => 'Kein Metmaacher jefonge.',
-# Special:Log/newusers
-'newuserlogpage' => 'Logboch för neu Metmaachere',
-'newuserlogpagetext' => 'He sin de Metmaacher opjelėßß, di sesh nöü aanjemäldt han.',
-
# Special:ListGroupRights
'listgrouprights' => 'Metmaacher-Jruppe-Rääschte',
'listgrouprights-summary' => 'Hee kütt de Liss met dä Medmaacher-Jruppe, di dat Wiki hee kennt, un denne ier Rääschte.
@@ -2431,19 +2442,23 @@ Wann di Sigg udder ier Klaafsigg verändert weed, kütt dat af jäz heh en di Op
'enotif_mailer' => '{{ucfirst:{{GRAMMAR:Genitive singe male|{{SITENAME}}}}}} Nohreechte-Versand',
'enotif_reset' => 'Setz all Änderunge op „Aanjeluurt“ un Erledich.',
-'enotif_newpagetext' => 'Dat es en neu aanjelahte Sigg.',
'enotif_impersonal_salutation' => 'Metmaacher {{GRAMMAR:Genitiv vun|{{SITENAME}}}}',
-'changed' => 'jeändert',
-'created' => 'neu aanjelaht',
-'enotif_subject' => 'De Sigg "$PAGETITLE" wood $CHANGEDORCREATED vum "$PAGEEDITOR" {{GRAMMAR:em|{{SITENAME}}}}',
+'enotif_subject_deleted' => '{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} fott jeschmeße.',
+'enotif_subject_created' => '{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} aanjelaat.',
+'enotif_subject_moved' => '{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} ömjenannt.',
+'enotif_subject_restored' => '{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} zeröck jehollt.',
+'enotif_subject_changed' => '{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} verändert.',
+'enotif_body_intro_deleted' => '{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} aam $PAGEEDITDATE fott jeschmeße, loor op $3.',
+'enotif_body_intro_created' => '{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} aam $PAGEEDITDATE aanjelaat. Op $3 fengks De der aktoälle Schtand dervun.',
+'enotif_body_intro_moved' => '{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} aam $PAGEEDITDATE ömjenannt. Op $3 fengks De der aktoälle Schtand vun dä Sigg.',
+'enotif_body_intro_restored' => '{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} aam $PAGEEDITDATE zerökjehollt. Op $3 fengks De der aktoälle Schtand vun dä Sigg.',
+'enotif_body_intro_changed' => '{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} aam $PAGEEDITDATE verändert. Op $3 fengks De der aktoälle Schtand vun dä Sigg.',
'enotif_lastvisited' => 'Luur unger „$1“ - do fings de all die Änderunge zick Dingem letzte Besoch hee.',
'enotif_lastdiff' => 'Loor op $1 för heh di Änderung aan_ze_loore.',
'enotif_anon_editor' => 'Dä namelose Metmaacher $1',
'enotif_body' => 'Leeven $WATCHINGUSERNAME,
-{{GRAMMAR:em|{{SITENAME}}}} wood die Sigg „$PAGETITLE“ am $PAGEEDITDATE {{GENDER:$PAGEEDITOR|vum|vum|vum_Metmaacher|vun dä|vum}} „$PAGEEDITOR“ $CHANGEDORCREATED, unger $PAGETITLE_URL fings Do de neuste Version.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
{{int:summary}} „$PAGESUMMARY“ $PAGEMINOREDIT
@@ -2452,8 +2467,8 @@ Do kanns dä Metmaacher „$PAGEEDITOR“ aanspreche:
* Em Wiki: $PAGEEDITOR_WIKI
Do kriss vun jetz aan kein e-mail mieh, bes dat Do Der di Sigg aanjeluurt häs,
-och wann se norr_ens verändert weed.
-Do kanns ävver och all die Merker för e-mail för die Sigge en Dinger Oppassliss op eimol ändere.
+och wann se norr_ens verändert weed. Do kanns ävver och all die Merker för
+e-mail för die Sigge en Dinger Oppassliss op eimol ändere.
Ene schöne Jroß {{GRAMMAR:vun|{{SITENAME}}}}.
@@ -2469,6 +2484,8 @@ $UNWATCHURL
Do kanns hee noh Hölp luure:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'neu aanjelaht',
+'changed' => 'jeändert',
# Delete
'deletepage' => 'Schmieß die Sigg jetz fott',
@@ -2533,6 +2550,8 @@ En Leß met de [[Special:ProtectedPages|em Momang jeschözde Sigge]] ham_mer och
'prot_1movedto2' => 'hät de Sigg vun „[[$1]]“ en „[[$2]]“ ömjenannt.',
'protect-badnamespace-title' => 'Appachtemang nit schözbaa.',
'protect-badnamespace-text' => 'En dämm Appachtemang kam_mer kein Sigge schöze.',
+'protect-norestrictiontypes-text' => 'Heh di Sigg kam_mer nit schöze, weil et jaa_kein Zoote vun Schoz em Wiki jitt.',
+'protect-norestrictiontypes-title' => 'Di Sigg es nit schözbaa.',
'protect-legend' => 'Sigg schötze',
'protectcomment' => 'Aanlaß odder Jrund:',
'protectexpiry' => 'Duur, wi lang:',
@@ -2616,7 +2635,9 @@ Versione för die neu Sigg enjerich. Die neu Sigg weed nit ersetz.',
'undeletedrevisions' => '{{PLURAL:$1|ein Version|$1 Versione}} zeröckjehollt',
'undeletedrevisions-files' => 'Zesammejenomme {{PLURAL:$1|Ein Version|<strong>$1</strong> Versione|<strong>Kein</strong> Version}} vun {{PLURAL:$2|eine Datei|<strong>$2</strong> Dateie|<strong>nix</strong>}} zeröckjehollt',
'undeletedfiles' => '{{PLURAL:$1|Ein Datei|<strong>$1</strong> Dateie|<strong>Kein</strong> Dateie}} zeröckjehollt',
-'cannotundelete' => '<strong>Dä.</strong> Dat Zeröckholle jing donevve. Mach sinn, dat ene andere Metmaacher flöcker wor, un et ald et eets jedon hät, un jetz es die Sigg ald widder do jewäse.',
+'cannotundelete' => '<strong>Dä.</strong> Et Zeröckholle jing donävve.
+
+$1',
'undeletedpage' => '<strong>De Sigg „$1“ es jetz widder do</strong>
Luur Der et [[Special:Log/delete|Logboch met de fottjeschmesse Sigge]] aan, do häs De de Neuste fottjeschmesse
un widder herjehollte Sigge.',
@@ -2647,7 +2668,7 @@ $1',
'blanknamespace' => '(Atikkele)',
# Contributions
-'contributions' => 'Däm Metmaacher sing Beidräch',
+'contributions' => '{{GENDER:$1|Däm Metmaacher|Däm|Däm Metmaacher|Dä Metmaacherėn|Däm}} $1 {{GENDER:$1|singe|singe|singe|iere|singe}} Beidräch',
'contributions-title' => 'Beidräsch fum $1',
'mycontris' => 'Beidrähch',
'contribsub2' => 'För dä Metmaacher: $1 ($2)',
@@ -2929,6 +2950,7 @@ Di Sigg „[[:$1]]“ jitt et ald. Wollts De se fottschmieße, öm heh di Sigg Ã
'immobile-target-namespace-iw' => 'Ene Ingerwikilink es nix, woh mer en Sigg hen ömnenne künnt!',
'immobile-source-page' => 'Di Sigg kann nit ömjenannt wääde.',
'immobile-target-page' => 'Op dä Tittel kann kei Sigg ömjenannt wääde.',
+'bad-target-model' => 'De Zielsigg moß uß en ander Zoot Daate beschtonn, un vun „$1“ noh „$2“ künne mer nit ömwandele.',
'imagenocrossnamespace' => 'Dateije kam_mer nor in et Appachtemang „{{ns:file}}“ donn, noh woanders hen kam_mer se och nit ömnemme!',
'nonfile-cannot-move-to-file' => 'Mer kann nix uußer Datteije esu ömnänne, dat et em Appachtemang „{{ns:file}}“ landt',
'imagetypemismatch' => 'De neu Datei-Endong moß met däm Datei-Tüp zesamme passe',
@@ -3045,6 +3067,7 @@ Bes esu joot, un versök et noch ens.',
'import-error-interwiki' => 'Di Sigg „$1“ weed nit empoteet, weil dä iehre Name för et Verlengke noh ußerhallef, pä Engerwiki-Lengk, jebruch weed.',
'import-error-special' => 'Di Sigg „$1“ weed nit empoteet, weil dä iehre Name en enem besöndere Appachtemang litt, woh kein Sigge dren zohjelohße sin.',
'import-error-invalid' => 'Di Sigg „$1“ weed nit empoteet, weil dä iehre Name nit jöltesch es.',
+'import-error-unserialize' => 'De Väsjohn $2 vun dä Sigg „$1“ kunnt nit von serijäll ußjepack wääde. De Väsjohn sull Daate vun dä Zoot „$3“ änthallde un ußjepack „$4“ jävve.',
'import-options-wrong' => '{{PLURAL:$2|En verkiehrte Aanjab|Verkiehrte Aanjabe|Kein verkiehrte Aanjabe}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Di aanjejovve Aanfangssigg hät keine jölteje Tittel.',
'import-rootpage-nosubpage' => 'Em Appachtemang „$1“ vun dä Aanfangssig sin kein Ongersigge zohjelohße.',
@@ -3059,7 +3082,6 @@ Bes esu joot, un versök et noch ens.',
# JavaScriptTest
'javascripttest' => ' JavaSkrepte ußprobeere.',
-'javascripttest-disabled' => 'Di Funxjon es en heh dämm Wiki ußjeschalldt.',
'javascripttest-title' => 'De Prööfunge „$1“ loufe.',
'javascripttest-pagetext-noframework' => 'Heh di Sigg es för JavaSkrepte ußzeprobeere.',
'javascripttest-pagetext-unknownframework' => 'Dä Prööfrahme „$1“ es onbikannt.',
@@ -3209,11 +3231,13 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
'pageinfo-default-sort' => 'Shtandattmääßesch zottiere met däm Schlößel',
'pageinfo-length' => 'Bytes en dä Sigg',
'pageinfo-article-id' => 'Dä Sigg ier Nommer en dä Daatebangk',
+'pageinfo-language' => 'De Schprooch vum Sigge-Enhallt',
'pageinfo-robot-policy' => 'Eijeschaffte för de Söhkmaschiine',
'pageinfo-robot-index' => 'kammer opnämme',
'pageinfo-robot-noindex' => 'kammer nit opnämme',
'pageinfo-views' => 'De Aanzahl Affroofe',
'pageinfo-watchers' => 'De Aanzahl Oppaßer för di Sigg',
+'pageinfo-few-watchers' => 'Et jidd_er winnijer wi {{PLURAL:$1|eine|$1|keine}} Oppaßer.',
'pageinfo-redirects-name' => 'Ömleidong(e) op heh di Sigg',
'pageinfo-subpages-name' => 'Ongersigg(e) vun heh dä Sigg',
'pageinfo-subpages-value' => '$1 (dovun {{PLURAL:$2|ein Ömleidong|$2 Ömleidonge|kein Ömleidong}} un {{PLURAL:$3|ein nomaale Sigg|$3 nomaale Sigge|kein nomaale Sigg}})',
@@ -3228,6 +3252,19 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
'pageinfo-magic-words' => '{{PLURAL:$1|Ei Zauberwoot|$1 Zauberwööter|Kein Zauberwööter}}',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Ein verstoche Saachjropp|$1 verstoche Saachjroppe|Kein verstoche Saachjropp}}',
'pageinfo-templates' => '{{PLURAL:$1|Ein Schablohn|$1 Schablohne|Kein Schablohn}} opjerohfe',
+'pageinfo-transclusions' => 'En {{PLURAL:$1|ein Sigk|$1 Sigge|kein Sigk}} enjeföösch',
+'pageinfo-toolboxlink' => 'Övver heh di Sigg',
+'pageinfo-redirectsto' => 'Leidt öm op',
+'pageinfo-redirectsto-info' => 'Aanjaabe övver di Sigg',
+'pageinfo-contentpage' => 'Zällt als en Sigg vom Enhalld vum Wiki',
+'pageinfo-contentpage-yes' => 'Joh',
+'pageinfo-protect-cascading' => 'Ene Siggeschoz weed vun heh verärf',
+'pageinfo-protect-cascading-yes' => 'Joh',
+'pageinfo-protect-cascading-from' => 'Ene Siggeschoz weed jeärf vun',
+'pageinfo-category-info' => 'Aanjaabe övver Saachjroppe',
+'pageinfo-category-pages' => 'De Aanzahl Sigge',
+'pageinfo-category-subcats' => 'De Aanzahl Ongerjroppe',
+'pageinfo-category-files' => 'De Aanzahl Dateie',
# Skin names
'skinname-standard' => 'Klassesch',
@@ -3250,6 +3287,8 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
'markedaspatrollederror' => 'Dat Kennzeiche „Nohjeluurt“ kunnt ich nit avspeichere.',
'markedaspatrollederrortext' => 'Do muss en bestemmte Version ussöke.',
'markedaspatrollederror-noautopatrol' => 'Do darrefs Ding eije Änderunge nit op „Nohjeloort“ setze!',
+'markedaspatrollednotify' => 'Di Änderong an $1 es jäz nohjekik.',
+'markedaspatrollederrornotify' => 'Dat di Sigg nohjekik es, kunnte mer nit faßhalde.',
# Patrol log
'patrol-log-page' => 'Logboch vun de nohjeloorte Änderunge',
@@ -3282,6 +3321,7 @@ $1',
'file-nohires' => 'Mer han kein hüütere Oplösung vun däm Beld.',
'svg-long-desc' => 'SVG-Datei, de Basis es {{PLURAL:$1|ei Pixel|$1 Pixelle|kei Pixel}} breed × {{PLURAL:$2|ei Pixel|$2 Pixelle|kei Pixel}} huh, dä Dateiömfang es $3',
'svg-long-desc-animated' => 'SVG-Datei met Bewääjong, de Basis es {{PLURAL:$1|ei Pixel|$1 Pixelle|kei Pixel}} breed × {{PLURAL:$2|ei Pixel|$2 Pixelle|kei Pixel}} huh, dä Dateiömfang es $3',
+'svg-long-error' => 'En kapodde <i lang="en">SVG</i>-Dattei: $1',
'show-big-image' => 'Jröößer Oplöösung',
'show-big-image-preview' => 'Heh di Vör_Aanseesch es $1 jruuß.',
'show-big-image-other' => '{{PLURAL:$2|Ander Oplühsung|Ander Oplühsunge|kein ander Oplühsunge}}: $1.',
@@ -3314,7 +3354,10 @@ $1',
'minutes' => '{{PLURAL:$1|eine Menutt|$1 Menutte|keine Menutt}}',
'hours' => '{{PLURAL:$1|ein Schtundt|$1 Schtunde|kein Schtundt}}',
'days' => '{{PLURAL:$1|einem Daach|$1 Dääsch|keinem Daach}}',
+'months' => '{{PLURAL:$1|Eine&nbsp;Monhnd|$1&nbsp;Mohnde|Keine&nbsp;Monhnd}}',
+'years' => '{{PLURAL:$1|Ein&nbsp;Jonhr|$1&nbsp;Johre|Kei&nbsp;Jonhr}}',
'ago' => 'vür $1',
+'just-now' => 'jraad äävens',
# Bad image list
'bad_image_list' => '<strong>Fomat:</strong>
@@ -3838,6 +3881,7 @@ Domet deiß De tirek sare, dat De di Adress nit bestätije wells.',
# Scary transclusion
'scarytranscludedisabled' => '[Et Enbinge per Interwiki es avjeschalt]',
'scarytranscludefailed' => '[De Schablon „$1“ enzebenge hät nit jeflupp]',
+'scarytranscludefailed-httpstatus' => '[De Schablon „$1“ enzebenge hät nit jeflupp. Dä HTTP-Fähler es: $2]',
'scarytranscludetoolong' => '[Schad, de URL es ze lang]',
# Delete conflict
@@ -3999,6 +4043,7 @@ Dä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlöße
'version-license' => 'Lėzänz',
'version-poweredby-credits' => "Dat Wiki heh löp met '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
'version-poweredby-others' => 'sönß wää',
+'version-credits-summary' => 'Mer bedanke ons för iehr Beidrähsch zom [[Special:Version|MediaWiki]] bei:',
'version-license-info' => 'MediaWiki es e frei Projramm. Mer kann et unmolesteet wigger verdeile, un mer kann et verändere, wi mer löstich es, wam_mer sesch dobei aan de <i lang="en">GNU General Public License</i> (jenerälle öffentlesche Lizänz noh GNU) hallde deiht, wi se vun der <i lang="en">Free Software Foundation</i> (Steftung för frei Soffwäer) veröffentlesch woode es. Dobei kam_mer sesch ußsöhke of mer sesch aan de Version 2 dovun hallde deiht, udder öhnz en späädere Fassung.
MediaWiki weed verdeilt met dä Hoffnung, dat et för jet jood es, ävver <span style="text-transform:uppercase">der ohne jeede Jarantie</span>, un esujaa ohne ene unjesaate Jedangke, et künnt <span style="text-transform:uppercase">ze verkoufe</span> sin udder <span style="text-transform:uppercase;">för öhndsene bestemmpte Zweck ze jebruche</span>. Loor Der de jenannte Lizänz aan, wann De mieh Einzelheite weße wells.
@@ -4115,17 +4160,17 @@ die De häs han welle. Se künnt jet ällder un nit mieh aktoäll sin.',
'sqlite-no-fts' => 'Version $1 (kann ävver nit en janze Täxte söhke)',
# New logging system
-'logentry-delete-delete' => 'Dä $1 hät di Sigg „$3“ fottjeschmeße.',
-'logentry-delete-restore' => 'Dä $1 hät di vörmohls fottjeschmeße Sigg „$3“ wider zeröck jehollt..',
-'logentry-delete-event' => 'Dä $1 hät för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}} vun dä Sigg „$3“ $4.',
-'logentry-delete-revision' => 'Dä $1 hät för {{PLURAL:$5|ein Version|$5 Versione|kein Version}} vun dä Sigg „$3“ $4.',
-'logentry-delete-event-legacy' => 'Dä $1 hät de Seeschbakeit vun Enndrääje en Logbööscher vun dä Sigg „$3“ verändert.',
-'logentry-delete-revision-legacy' => 'Dä $1 hät de Seeschbakeit ällder Väsjohne vun dä Sigg „$3“ verändert.',
-'logentry-suppress-delete' => 'Dä $1 hät di Sigg „$3“ ongerdröck.',
-'logentry-suppress-event' => 'Dä $1 hät heimlesh för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}} vun dä Sigg „$3“ $4.',
-'logentry-suppress-revision' => 'Dä $1 hät heimlesh för {{PLURAL:$5|ein Version|$5 Versione|kein Version}} vun dä Sigg „$3“ $4.',
-'logentry-suppress-event-legacy' => 'Dä $1 hät de Seeschbakeit vun Enndrääje en Logbööscher vun dä Sigg „$3“ heimlesch verändert.',
-'logentry-suppress-revision-legacy' => 'Dä $1 hät de Seeschbakeit ällder Väsjohne vun dä Sigg „$3“ heimlesch verändert.',
+'logentry-delete-delete' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ fottjeschmeße.',
+'logentry-delete-restore' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di vörmohls fottjeschmeße Sigg „$3“ wider zeröck jehollt.',
+'logentry-delete-event' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}} vun dä Sigg „$3“ $4.',
+'logentry-delete-revision' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät för {{PLURAL:$5|ein Version|$5 Versione|kein Version}} vun dä Sigg „$3“ $4.',
+'logentry-delete-event-legacy' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Seeschbakeit vun Enndrääje en de Logbööscher vun dä Sigg „$3“ verändert.',
+'logentry-delete-revision-legacy' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Seeschbakeit vun älldere Väsjohne vun dä Sigg „$3“ verändert.',
+'logentry-suppress-delete' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ ongerdröck.',
+'logentry-suppress-event' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät heimlesh för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}} en dä Sigg „$3“ $4.',
+'logentry-suppress-revision' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät heimlesch för {{PLURAL:$5|ein Version|$5 Versione|kein Version}} vun dä Sigg „$3“ $4.',
+'logentry-suppress-event-legacy' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Seeschbakeit vun Enndrääje en dä Logbööscher op dä Sigg „$3“ heimlesch verändert.',
+'logentry-suppress-revision-legacy' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Seeschbakeit vun älldere Väsjohne vun dä Sigg „$3“ heimlesch verändert.',
'revdelete-content-hid' => 'der Enhalt verstoche',
'revdelete-summary-hid' => 'dat Fäld „{{int:summary}}“ vershtoche',
'revdelete-uname-hid' => 'der Name vum Metmaacher verstoche',
@@ -4134,17 +4179,31 @@ die De häs han welle. Se künnt jet ällder un nit mieh aktoäll sin.',
'revdelete-uname-unhid' => 'der Name vum Metmaacher öffentlesh jemaat',
'revdelete-restricted' => ', och för de Wiki-Köbesse',
'revdelete-unrestricted' => ', och för de Wiki-Köbesse',
-'logentry-move-move' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt.',
-'logentry-move-move-noredirect' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei kein Ömleidong aanjelaat.',
-'logentry-move-move_redir' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleingungssigg fottjeschmeße.',
-'logentry-move-move_redir-noredirect' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleidongssigg fottjeschmeße un kein neue Ömliedongssig aanjelaat.',
-'logentry-patrol-patrol' => 'Dä $1 hät di Version $4 vun dä Sigg „$3“ nohjeloort.',
-'logentry-patrol-patrol-auto' => 'Dä $1 hät di Version $4 vun dä Sigg „$3“ automattesch nohjeloort.',
-'logentry-newusers-newusers' => 'Dä neue Metmaacher $1 wood aanjelaat.',
-'logentry-newusers-create' => 'Dä neue Metmaacher $1 wood aanjelaat.',
-'logentry-newusers-create2' => 'Dä $1 hät dä $3 als ene neue Metmaacher aanjelaat.',
-'logentry-newusers-autocreate' => 'Dä $1 wood automattesch als Metmaacher aanjelaat.',
-'newuserlog-byemail' => 'dat Passwood wood med de e-mail loßjescheck',
+'logentry-move-move' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt.',
+'logentry-move-move-noredirect' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei kein Ömleidong aanjelaat.',
+'logentry-move-move_redir' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleindongßsigg fottjeschmeße.',
+'logentry-move-move_redir-noredirect' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleidongßsigg fottjeschmeße un kein neue Ömleidongßsig aanjelaat.',
+'logentry-patrol-patrol' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Version $4 vun dä Sigg „$3“ nohjeloort.',
+'logentry-patrol-patrol-auto' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Version $4 vun dä Sigg „$3“ automattesch nohjeloort.',
+'logentry-newusers-newusers' => '{{GENDER:$2
+|Dä neue Metmaacher $1 wood
+|Dat $1 wood als ene neue MetmaacherÄ—n
+|Dä neue Metmaacher $1 wood
+|De $1 wood als en neue MetmaacherÄ—n
+|Dat $1 wood als ene neue Metmaacher}} aanjelaat.',
+'logentry-newusers-create' => '{{GENDER:$4
+|Dä neue Metmaacher $1 wood
+|Dat $1 wood als ene neue MetmaacherÄ—n
+|Dä neue Metmaacher $1 wood
+|De $1 wood als en neue MetmaacherÄ—n
+|Dat $1 wood als ene neue Metmaacher}} aanjelaat.',
+'logentry-newusers-create2' => '{{GENDER:$4|Dä|Dat|Dä Metmaacher|De|Dat}} $3 wood {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} $1 aanjelaat.',
+'logentry-newusers-byemail' => '{{GENDER:$4|Dä|Dat|Dä Metmaacher|De|Dat}} $1 wood {{GENDER:$4|als Metmaacher|als Metmaacher||als Metmaacher|als Metmaacher}} aanjelaat un {{GENDER:$4|sing|em sing|däm sing|dä iehr|däm sing}} Paßwoot met der <i lang="en>e-mail</i> verscheck.',
+'logentry-newusers-autocreate' => '{{GENDER:$4|Dä|Dat|Dä Metmaacher|De|Dat}} $1 wood automattesch {{GENDER:$4|als Metmaacher|als Metmaacher||als Metmaacher|als Metmaacher}} {{GENDER:$2|vum|vum|vumm Metmaacher|vun dä|vum}} $1 aanjelaat.',
+'logentry-rights-rights' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} „$1“ hät däm Metmaacher „$3“ sing Jroppe-Räächde vun „$4“ op „$5“ ömjestallt.',
+'logentry-rights-rights-legacy' => '{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 hät däm Metmaacher $3 sing Räääschte-Jroppe verändert.',
+'logentry-rights-autopromote' => '{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 wood automattesch vum $4 zom $5 jemaat.',
+'rightsnone' => '(nix)',
# Feedback
'feedback-bugornote' => 'Wann de em Bejreff bes, övver e täschesch Probleem ze schrieve, bes esu jood un donn dat als en [$1 Fählermäldong].
@@ -4199,6 +4258,7 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
'api-error-ok-but-empty' => 'Fähler: Mer krijje kein Antwoot vum ẞööver.',
'api-error-overwrite' => 'En Dattei ze övverschrieve es nit zohjelohße.',
'api-error-stashfailed' => 'Fähler: Dä ẞööver hät kein Datteije zweschejeschpeischert.',
+'api-error-publishfailed' => 'Ene Fähler es em ẞööver opjetrodde. En zweschejescheischerte Dattei kunnt nit öffentlesch jemaat wääde.',
'api-error-timeout' => 'Dä ẞööver hät en dä jewennde Zick nit jeantwoot.',
'api-error-unclassified' => 'Ene Fähler es opjetrodde, der mer nit kenne.',
'api-error-unknown-code' => 'Nit bekannte Fähler: „$1“',
@@ -4219,4 +4279,7 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
'duration-centuries' => '{{PLURAL:$1|e&nbsp;Johhondert|$1&nbsp;Johhonderte|kei&nbsp;Johhondert}}',
'duration-millennia' => '{{PLURAL:$1|e&nbsp;Johdousend|$1&nbsp;Johdousende|kei&nbsp;Johdousend}}',
+# Image rotation
+'rotate-comment' => 'Dat Beld wood öm {{PLURAL:$1|$1 Jraad}} esu eröm jedrieht, wi der Ohrzeijer leuf.',
+
);
diff --git a/languages/messages/MessagesKu_arab.php b/languages/messages/MessagesKu_arab.php
index a17741fa..9680f2a7 100644
--- a/languages/messages/MessagesKu_arab.php
+++ b/languages/messages/MessagesKu_arab.php
@@ -13,10 +13,10 @@
* @author Marmzok
*/
-$rtl = true;
-
$fallback = 'ckb';
+$rtl = true;
+
$digitTransformTable = array(
'0' => 'Ù ', # &#x0660;
'1' => 'Ù¡', # &#x0661;
diff --git a/languages/messages/MessagesKu_latn.php b/languages/messages/MessagesKu_latn.php
index 9bf1d4da..af81a774 100644
--- a/languages/messages/MessagesKu_latn.php
+++ b/languages/messages/MessagesKu_latn.php
@@ -51,6 +51,8 @@ $namespaceAliases = array(
'Kategorî_nîqaş' => NS_CATEGORY_TALK,
);
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
+
$specialPageAliases = array(
'Categories' => array( 'Dara_kategoriyan' ),
'DoubleRedirects' => array( 'Redirect\'ên_ducarî' ),
@@ -74,7 +76,6 @@ $magicWords = array(
'notoc' => array( '0', '_NAVEROKTUNE_', '__NOTOC__' ),
'nogallery' => array( '0', '_GALERÃŽTUNE_', '__NOGALLERY__' ),
'toc' => array( '0', '_NAVEROK_', '__TOC__' ),
- 'noheader' => array( '0', '_SERÃŽTUNE_', '__NOHEADER__' ),
'currentmonth1' => array( '1', 'MEHANIHA1', 'CURRENTMONTH1' ),
'currentday' => array( '1', 'ROJA_NIHA', 'CURRENTDAY' ),
'currentday2' => array( '1', 'ROJA_NIHA2', 'CURRENTDAY2' ),
@@ -88,7 +89,7 @@ $magicWords = array(
'subpagename' => array( '1', 'BINRÛPEL', 'SUBPAGENAME' ),
'img_right' => array( '1', 'rast', 'right' ),
'img_left' => array( '1', 'çep', 'left' ),
- 'img_link' => array( '1', 'girêdan=$', 'link=$1' ),
+ 'img_link' => array( '1', 'girêdan=$1', 'link=$1' ),
'sitename' => array( '1', 'NAVÊ_PROJEYÊ', 'SITENAME' ),
'grammar' => array( '0', 'RÊZIMAN.', 'GRAMMAR:' ),
'gender' => array( '0', 'ZAYEND.', 'GENDER:' ),
@@ -238,7 +239,6 @@ $messages = array(
'qbbrowse' => 'Bigere',
'qbedit' => 'Biguherîne',
'qbpageoptions' => 'Ev rûpel',
-'qbpageinfo' => 'Naverok',
'qbmyoptions' => 'Rûpelên min',
'qbspecialpages' => 'Rûpelên taybet',
'faq' => 'PGP',
@@ -455,11 +455,8 @@ $2',
# Login and logout pages
'logouttext' => "'''Tu niha derketî.'''
-Tu dikarî {{SITENAME}} niha weke bikarhênerekî nediyarkirî bikarbînî, yan jî tu dikarî dîsa bi vî navê xwe yan navekî din wek bikarhêner [[Special:UserLogin|dîsa têkevî]].
+Tu dikarî {{SITENAME}} niha weke bikarhênerekî nediyarkirî bikarbînî, yan jî tu dikarî dîsa bi vî navê xwe yan navekî din wek bikarhêner <span class='plainlinks'>[$1 dîsa têkevî]</span>.
Bila di bîra te de be ku gengaz e hin rûpel mîna ku tu hîn bi navê xwe qeyd kiriyî werin nîşandan, heta ku tu nîşanên çavlêgerandina (browser) xwe jênebî.",
-'welcomecreation' => '== Tu bi xêr hatî, $1! ==
-
-Hesabê te hate afirandin. Tu dikarî niha [[Special:Preferences|tercîhên xwe di {{SITENAME}}]] de biguherînî.',
'yourname' => 'Navê bikarhêner:',
'yourpassword' => 'Şîfre:',
'yourpasswordagain' => 'Şîfreyê dîsa binivîse:',
@@ -1006,11 +1003,12 @@ Sedema qedexekirina $3 ev e: ''$2''",
'right-userrights' => 'Hemû mafên bikarhêner biguherîne',
'right-sendemail' => 'Ji bikarhênerên di re e-name bişîne',
+# Special:Log/newusers
+'newuserlogpage' => 'çêkirina hesabê nû',
+
# User rights log
'rightslog' => 'guhertina mafê bikarhêneriyê',
'rightslogtext' => 'Ev guhertineke ji bo mafên bikarhêneriyê ye.',
-'rightslogentry' => 'grûpa bikarhêneran ji bo $1 ji $2 guherande $3',
-'rightsnone' => '(tune)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'vê rûpelê bixwîne',
@@ -1359,9 +1357,6 @@ Li [[Special:WantedCategories|kategoriyên xwestî]] binêre.',
'activeusers-hidesysops' => 'Rêveberan veşêre',
'activeusers-noresult' => 'Tu bikarhêner nehate dîtin.',
-# Special:Log/newusers
-'newuserlogpage' => 'çêkirina hesabê nû',
-
# Special:ListGroupRights
'listgrouprights' => 'Mafên koma bikarhêner',
'listgrouprights-group' => 'Kom',
@@ -1427,11 +1422,7 @@ Gava tu bixwazî wê rûpelê ji nav lîsteya xwe ya şopandinê derbixî, li se
'unwatching' => 'Neşopîne…',
'enotif_reset' => 'Hemû rûpelan wek lêsekirî nîşanbide',
-'enotif_newpagetext' => 'Ev rûpeleke nû ye.',
'enotif_impersonal_salutation' => 'Bikarhênerî {{SITENAME}}',
-'changed' => 'hate guhertin',
-'created' => 'hate afirandin',
-'enotif_subject' => '[{{SITENAME}}] Rûpelê "$PAGETITLE" ji $PAGEEDITOR hate $CANGEDORCREATED',
'enotif_anon_editor' => 'Bikarhênerê/a neqeydkirî $1',
'enotif_body' => 'Birêz $WATCHINGUSERNAME,
@@ -1454,6 +1445,8 @@ Heke tu dixwazî lîsteya xwe ya şopandinê biguherînî, li
Paşagahîdan û alîkaraya din:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'hate afirandin',
+'changed' => 'hate guhertin',
# Delete
'deletepage' => 'Rûpelê jê bibe',
@@ -1878,6 +1871,12 @@ Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
'pageinfo-views' => 'Hejmara dîtinê',
'pageinfo-watchers' => 'Hejmara kesên dişopînin',
'pageinfo-edits' => 'Hejmara guherandinan',
+'pageinfo-toolboxlink' => 'Agahiya rûpelê',
+'pageinfo-redirectsto-info' => 'agahî',
+'pageinfo-contentpage-yes' => 'Erê',
+'pageinfo-protect-cascading-yes' => 'Erê',
+'pageinfo-category-pages' => 'hejmara rûpelan',
+'pageinfo-category-subcats' => 'Hejmara binkategoriyan',
# Patrolling
'markaspatrolleddiff' => 'Wek serrastkirî nîşan bide',
@@ -2157,7 +2156,7 @@ Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
'logentry-move-move_redir' => '$1 navê $3 guherand û kir $4',
'logentry-newusers-newusers' => '$1 hesabekî bikarhêneriyê çêkir',
'logentry-newusers-create' => '$1 hesabekî bikarhêneriyê çêkir',
-'newuserlog-byemail' => 'şîfre bi e-nameyê hate şandin',
+'rightsnone' => '(tune)',
# Feedback
'feedback-subject' => 'Mijar:',
diff --git a/languages/messages/MessagesKw.php b/languages/messages/MessagesKw.php
index f843e28c..245c0032 100644
--- a/languages/messages/MessagesKw.php
+++ b/languages/messages/MessagesKw.php
@@ -12,6 +12,7 @@
* @author MF-Warburg
* @author Malafaya
* @author Mongvras
+ * @author Nemo bis
* @author Nicky.ker
* @author Nrowe
* @author Scryfer
@@ -59,52 +60,150 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'Allmessages' => array( 'OllMessajow' ),
- 'Allpages' => array( 'OllFolednow' ),
- 'Ancientpages' => array( 'FolednowKoth' ),
+ 'Activeusers' => array( 'DevnydhyoryonBew' ),
+ 'Allmessages' => array( 'OllMessajys' ),
+ 'Allpages' => array( 'OllFolennow' ),
+ 'Ancientpages' => array( 'FolennowCoth' ),
'Badtitle' => array( 'TitelDrog' ),
'Blankpage' => array( 'FolenWag' ),
- 'Block' => array( 'Lettya' ),
- 'Booksources' => array( 'PednfentynyowLyver' ),
- 'Categories' => array( 'Klassys' ),
+ 'Block' => array( 'Difen' ),
+ 'Blockme' => array( 'DifenVy' ),
+ 'Booksources' => array( 'PennfentynyowLyver' ),
+ 'BrokenRedirects' => array( 'DaswedyansowTerrys' ),
+ 'Categories' => array( 'Classys' ),
'ChangeEmail' => array( 'ChanjyaEbost' ),
'ChangePassword' => array( 'ChanjyaGerTremena' ),
+ 'ComparePages' => array( 'KehevelyFolennow' ),
+ 'Confirmemail' => array( 'AfydhyaEbost' ),
'Contributions' => array( 'Kevrohow' ),
- 'CreateAccount' => array( 'FormyaAkont' ),
+ 'CreateAccount' => array( 'FormyaAcont' ),
+ 'Deadendpages' => array( 'FolennowFordhDhall' ),
'DeletedContributions' => array( 'KevrohowDiles' ),
- 'EditWatchlist' => array( 'ChanjyaRolGolyas' ),
+ 'Disambiguations' => array( 'Diamstyryansow' ),
+ 'DoubleRedirects' => array( 'DaswedyansowDewblek' ),
+ 'EditWatchlist' => array( 'ChanjyaOwRolGolyas' ),
'Emailuser' => array( 'EbostyaDevnydhyer' ),
- 'Export' => array( 'Esperthi' ),
- 'Import' => array( 'Ymperthi' ),
- 'MIMEsearch' => array( 'HwilansMIME' ),
+ 'Export' => array( 'Esperthy' ),
+ 'Fewestrevisions' => array( 'AnLyhaAmendyansow' ),
+ 'Filepath' => array( 'HensAnFolen' ),
+ 'Import' => array( 'Ymperthy' ),
+ 'Invalidateemail' => array( 'DigomposaEbost' ),
+ 'JavaScriptTest' => array( 'PrevyansJavaScript' ),
+ 'BlockList' => array( 'RolDhifen' ),
+ 'LinkSearch' => array( 'WhilasKevrennow' ),
+ 'Listadmins' => array( 'RolyaMenystroryon' ),
+ 'Listbots' => array( 'RolyaBottys' ),
+ 'Listfiles' => array( 'RolyaRestrennow' ),
+ 'Listgrouprights' => array( 'RolyaGwiryowBagas' ),
+ 'Listredirects' => array( 'RolyaDaswedyansow' ),
+ 'Listusers' => array( 'RolyaDevnydhyoryon' ),
+ 'Lockdb' => array( 'AlwhedhaDB' ),
+ 'Log' => array( 'Covnoten', 'Covnotennow' ),
+ 'Lonelypages' => array( 'FolennowDigoweth' ),
+ 'Longpages' => array( 'FolennowHir' ),
+ 'MergeHistory' => array( 'IstoryKesunya' ),
+ 'MIMEsearch' => array( 'WhilasMIME' ),
+ 'Mostcategories' => array( 'AnMoyhaClassys' ),
+ 'Mostimages' => array( 'AnMoyhaRestrennowKevennys' ),
+ 'Mostinterwikis' => array( 'AnMoyhaInterwikis' ),
+ 'Mostlinked' => array( 'AnMoyhaFolennowKevrennys' ),
+ 'Mostlinkedcategories' => array( 'AnMoyhaClassysKevrennys' ),
+ 'Mostlinkedtemplates' => array( 'AnMoyhaScantlynsKevrennys' ),
+ 'Mostrevisions' => array( 'AnMoyhaAmendyansow' ),
'Movepage' => array( 'GwayaFolen' ),
'Mycontributions' => array( 'OwHevrohow' ),
'Mypage' => array( 'OwFolen' ),
- 'Mytalk' => array( 'OwHows' ),
- 'Myuploads' => array( 'OwUghkargansow' ),
- 'Newimages' => array( 'RestrednowNowyth' ),
- 'Newpages' => array( 'FolednowNowyth' ),
+ 'Mytalk' => array( 'OwHescows' ),
+ 'Myuploads' => array( 'OwUghcargansow' ),
+ 'Newimages' => array( 'RestrennowNowyth' ),
+ 'Newpages' => array( 'FolennowNowyth' ),
'PasswordReset' => array( 'DassetyaGerTremena' ),
+ 'PermanentLink' => array( 'KevrenFast' ),
+ 'Popularpages' => array( 'FolennowGerysDa' ),
'Preferences' => array( 'Dowisyansow' ),
+ 'Prefixindex' => array( 'MenegvaRagerow' ),
+ 'Protectedpages' => array( 'FolennowDifresys' ),
+ 'Protectedtitles' => array( 'TitlysDifres' ),
'Randompage' => array( 'FolenDreJons' ),
+ 'Randomredirect' => array( 'DaswedyansDreJons' ),
'Recentchanges' => array( 'Chanjyow_a-dhiwedhes' ),
- 'Search' => array( 'Hwilas' ),
- 'Specialpages' => array( 'FolednowArbednek' ),
- 'Uncategorizedcategories' => array( 'KlassysHebKlass' ),
- 'Uncategorizedimages' => array( 'RestrednowHebKlass' ),
- 'Uncategorizedpages' => array( 'FolednowHebKlass' ),
- 'Uncategorizedtemplates' => array( 'SkantlynsHebKlass' ),
- 'Upload' => array( 'Ughkarga' ),
- 'Userlogin' => array( 'Omgelmi' ),
- 'Userlogout' => array( 'Digelmi' ),
+ 'Recentchangeslinked' => array( 'ChanjyowKelmys' ),
+ 'Revisiondelete' => array( 'DileaAmendyans' ),
+ 'Search' => array( 'Whilas' ),
+ 'Shortpages' => array( 'FolennowCot' ),
+ 'Specialpages' => array( 'FolennowArbennek' ),
+ 'Statistics' => array( 'Statystygyon' ),
+ 'Unblock' => array( 'DiswulDifennans' ),
+ 'Uncategorizedcategories' => array( 'ClassysHebClass' ),
+ 'Uncategorizedimages' => array( 'RestrennowHebClass' ),
+ 'Uncategorizedpages' => array( 'FolennowHebClass' ),
+ 'Uncategorizedtemplates' => array( 'ScantlynsHebClass' ),
+ 'Undelete' => array( 'DiswulDileans' ),
+ 'Unlockdb' => array( 'DialwhedhaDB' ),
+ 'Unusedcategories' => array( 'ClassysHebDevnydh' ),
+ 'Unusedimages' => array( 'RestrennowHebDevnydh' ),
+ 'Unusedtemplates' => array( 'ScantlynsHebDevnydh' ),
+ 'Unwatchedpages' => array( 'FolennowHebAgaHolyas' ),
+ 'Upload' => array( 'Ughcarga' ),
+ 'Userlogin' => array( 'Omgelmy' ),
+ 'Userlogout' => array( 'Digelmy' ),
'Userrights' => array( 'GwiryowDevnydhyer' ),
'Version' => array( 'Versyon' ),
- 'Wantedcategories' => array( 'KlassysHwansus' ),
- 'Wantedfiles' => array( 'RestrednowHwansus' ),
- 'Wantedpages' => array( 'FolednowHwansus' ),
- 'Wantedtemplates' => array( 'SkantlynsHwansus' ),
+ 'Wantedcategories' => array( 'ClassysWhansus' ),
+ 'Wantedfiles' => array( 'RestrennowWhansus' ),
+ 'Wantedpages' => array( 'FolennowWhansus' ),
+ 'Wantedtemplates' => array( 'ScantlynsWhansus' ),
'Watchlist' => array( 'Rol_golyas' ),
- 'Whatlinkshere' => array( 'OwKevrednaObma' ),
+ 'Whatlinkshere' => array( 'OwKevrennaOmma' ),
+ 'Withoutinterwiki' => array( 'HebInterwiki' ),
+);
+
+$magicWords = array(
+ 'redirect' => array( '0', '#DASWEDYANS', '#REDIRECT' ),
+ 'numberofpages' => array( '1', 'NIVERAFOLENNOW', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'NIVERAERTHYGLOW', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'NIVERARESTRENNOW', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'NIVERADHEVNYDHYORYON', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'NIVERADHEVNYDHYORYONVEW', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'NIVERAJANJYOW', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'NIVERAWELOW', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'HANOWANFOLEN', 'PAGENAME' ),
+ 'fullpagename' => array( '1', 'HANOWLEUNANFOLEN', 'FULLPAGENAME' ),
+ 'img_thumbnail' => array( '1', 'skeusennik', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'skeusennik=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'dyhow', 'right' ),
+ 'img_left' => array( '1', 'cledh', 'left' ),
+ 'img_none' => array( '1', 'nagonan', 'none' ),
+ 'img_center' => array( '1', 'cresel', 'center', 'centre' ),
+ 'img_framed' => array( '1', 'fremys', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', 'hebfram', 'frameless' ),
+ 'img_page' => array( '1', 'folen=$1', 'folen_$1', 'page=$1', 'page $1' ),
+ 'img_top' => array( '1', 'gwartha', 'top' ),
+ 'img_text_top' => array( '1', 'text-gwartha', 'text-top' ),
+ 'img_middle' => array( '1', 'cres', 'middle' ),
+ 'img_bottom' => array( '1', 'goles', 'bottom' ),
+ 'img_text_bottom' => array( '1', 'text-goles', 'text-bottom' ),
+ 'img_link' => array( '1', 'kevren=$1', 'link=$1' ),
+ 'sitename' => array( '1', 'HANOWANWIASVA', 'SITENAME' ),
+ 'pageid' => array( '0', 'IDANFOLEN', 'PAGEID' ),
+ 'server' => array( '0', 'SERVYER', 'SERVER' ),
+ 'servername' => array( '0', 'HANOWANSERVYER', 'SERVERNAME' ),
+ 'grammar' => array( '0', 'GRAMASEK:', 'GRAMMAR:' ),
+ 'fullurl' => array( '0', 'URLLEUN:', 'FULLURL:' ),
+ 'displaytitle' => array( '1', 'DISQWEDHESANTITEL', 'DISPLAYTITLE' ),
+ 'language' => array( '0', '#YETH:', '#LANGUAGE:' ),
+ 'numberofadmins' => array( '1', 'NIVERAVENYSTRORYON', 'NUMBEROFADMINS' ),
+ 'special' => array( '0', 'arbennek', 'special' ),
+ 'filepath' => array( '0', 'HENSANFOLEN:', 'FILEPATH:' ),
+ 'hiddencat' => array( '1', '__CLASSCUDHYS__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'RESTRENNOWYNCLASS', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'MENSANRESTREN', 'PAGESIZE' ),
+ 'index' => array( '1', '__MENEGVA__', '__INDEX__' ),
+ 'noindex' => array( '1', '__HEBMENEGVA__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', 'NIVERYNBAGAS', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'url_path' => array( '0', 'HENS', 'PATH' ),
+ 'pagesincategory_all' => array( '0', 'oll', 'all' ),
+ 'pagesincategory_pages' => array( '0', 'folennow', 'pages' ),
);
$messages = array(
@@ -239,6 +338,7 @@ $messages = array(
'namespaces' => 'Spasys hanow',
'variants' => 'Dyffransow',
+'navigation-heading' => 'Rol lewyans',
'errorpagetitle' => 'Gwall',
'returnto' => 'Dewheles dhe $1.',
'tagline' => 'Dhyworth {{SITENAME}}',
@@ -381,8 +481,12 @@ $1',
'viewsource' => 'Gweles an bennfenten',
# Login and logout pages
-'welcomecreation' => '== Dynnargh, $1! ==
-Gwruthys yw agas acont.
+'logouttext' => "'''Digelmys owgh why lemmyn.'''
+
+Why a yll pesya usya {{SITENAME}} heb hanow, po why a yll <span class='plainlinks'>[$1 omgelmy arta]</span> avel an keth devnydhyer po avel devnydhyer aral.
+Notyowgh: Neb folennow a alsa bos disqwedhys kepar del owgh why omgelmys whath, erna wryllowgh why clerhe cache agas peurel.",
+'welcomeuser' => 'Dynnargh, $1!',
+'welcomecreation-msg' => 'Gwruthys yw agas acont.
Na wrewgh ankevy dhe janjya agas [[Special:Preferences|dowisyansow {{SITENAME}}]].',
'yourname' => 'Hanow usyer:',
'yourpassword' => 'Ger tremena:',
@@ -756,6 +860,9 @@ Nyns yw disqwedhys agas trigva ebost pan wrella devnydhyoryon erel kestava dhywg
'right-upload' => 'Ughcarga restrennow',
'right-delete' => 'Dilea folennow',
+# Special:Log/newusers
+'newuserlogpage' => 'Covnoten formya acontow devnydhyer',
+
# User rights log
'rightslog' => 'Covnoten wiryow an devnydhyer',
@@ -948,9 +1055,6 @@ Yma'n descrifans war y [$2 folen dhescrifans] disqwedhys a-woles.",
# Special:ListUsers
'listusers-submit' => 'Disqwedhes',
-# Special:Log/newusers
-'newuserlogpage' => 'Covnoten formya acontow devnydhyer',
-
# Special:ListGroupRights
'listgrouprights-members' => '(rol esely)',
@@ -1182,6 +1286,9 @@ Why a yll gweles hy fennfenten.',
'lastmodifiedatby' => 'An folen-ma a veu kens chanjys dhe $2, $1 gans $3.',
'siteusers' => '{{PLURAL:$2|devnydhyer|devnydhyoryon}} {{SITENAME}} $1',
+# Info page
+'pageinfo-toolboxlink' => 'Kedhlow an folen',
+
# Browsing diffs
'previousdiff' => '↠Chanj cottha',
'nextdiff' => 'Chanj nowettha →',
diff --git a/languages/messages/MessagesKy.php b/languages/messages/MessagesKy.php
index d8e60b5b..356b857e 100644
--- a/languages/messages/MessagesKy.php
+++ b/languages/messages/MessagesKy.php
@@ -175,7 +175,6 @@ $messages = array(
'qbbrowse' => 'Карап чыгуу',
'qbedit' => 'Оңдоо',
'qbpageoptions' => 'Бул барак',
-'qbpageinfo' => 'КонтекÑÑ‚',
'qbmyoptions' => 'Барактарым',
'qbspecialpages' => 'Кызмат барактары',
'faq' => 'КБС',
@@ -198,6 +197,7 @@ $messages = array(
'namespaces' => 'Ðталыштар мейкиндиги',
'variants' => 'Варианттар',
+'navigation-heading' => 'ÐÐ°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ñ Ð¼ÐµÐ½ÑŽÑу',
'errorpagetitle' => 'Ката',
'returnto' => '$1 барагына кайтуу.',
'tagline' => '{{SITENAME}} дан',
@@ -388,9 +388,9 @@ $1',
'virus-unknownscanner' => 'белгиÑиз антивируÑ:',
# Login and logout pages
-'welcomecreation' => '== Кош келиңиз, $1! ==
-
-Сиз катоодон өттүңүз. {{SITENAME}} түзөө киргизүүнү унутпаңыз.',
+'welcomeuser' => 'Кош келиңиз, $1!',
+'welcomecreation-msg' => 'Сиздин ÑÑеп жазууңуз жаратылды.
+{{SITENAME}} Ñайтынын [[Special:Preferences|ыраÑтоолорун]] өзгөртүүнү унутпаңыз.',
'yourname' => 'ЭÑеп жазууÑунун аты:',
'yourpassword' => 'СырÑөз:',
'yourpasswordagain' => 'СырÑөздү кайта терүү:',
@@ -484,6 +484,7 @@ $1',
'changeemail-oldemail' => 'Кезектеги e-mail дарек:',
'changeemail-newemail' => 'Жаңы e-mail дарек:',
'changeemail-none' => '(жок)',
+'changeemail-password' => '«{{SITENAME}}» долбоору үчүн Ñиздин ÑÑ‹Ñ€Ñөзүңүз:',
'changeemail-submit' => "E-mail'ди өзгөртүү",
'changeemail-cancel' => 'Жокко чыгаруу',
@@ -557,7 +558,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
'template-protected' => '(корголгон)',
'template-semiprotected' => '(жарым-жартылай корголгон)',
'hiddencategories' => 'Бул барак {{PLURAL:$1|1 жашыруун категориÑнын|$1 жашыруун категориÑлардын}} мүчөÑÒ¯:',
-'nocreatetitle' => 'Барактарды жаратуу чектелген',
'nocreate-loggedin' => 'Жаңы барактарды жаратууга Ñизде урукÑат жок.',
'permissionserrors' => 'Кирүү укуктарынын каталары',
'permissionserrorstext-withaction' => 'Сизге $2, төмөнкү {{PLURAL:$1|Ñебеп|Ñебеп}} менен урукÑат жок:',
@@ -572,6 +572,12 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
'edit-already-exists' => 'Жаңы барак түзүү мүмкүн ÑмеÑ. Мындай барак бар',
'defaultmessagetext' => 'ЖарыÑланбаÑча текÑÑ‚',
+# Content models
+'content-model-wikitext' => 'уики-текÑÑ‚',
+'content-model-text' => 'жөнөкөй текÑÑ‚',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
# Parser/template warnings
'post-expand-template-inclusion-warning' => "'''ЭÑкертүү:''' Камтылган калыптардын өлчөмү Ó©Ñ‚Ó© чоң.
КÑÑ Ð±Ð¸Ñ€ калыптар камтылбайт.",
@@ -781,8 +787,9 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
'prefs-emailconfirm-label' => 'Эл. почтаны аныктоо:',
'prefs-textboxsize' => 'Редакторлоо терезеÑинин өлчөмү',
'youremail' => 'Электрондук дарек:',
-'username' => 'Колдонуучунун аты:',
-'uid' => 'Колдонуучунун ID Ñи:',
+'username' => '{{GENDER:$1|Катышуучу аты}}:',
+'uid' => '{{GENDER:$1|Катышуучунун}} коду:',
+'prefs-memberingroups' => '{{GENDER:$2|МүчөÑÒ¯}} болгон {{PLURAL:$1|топ|топтор}}:',
'prefs-registration' => 'Каттоо убагы:',
'yourrealname' => 'Ðнык атыңыз:',
'yourlanguage' => 'Тил:',
@@ -865,8 +872,8 @@ HTML-тегдеринин тууралыгын текшериңиз.',
'right-suppressionlog' => 'Жеке журналдарды көрүү',
'right-userrights' => 'Бүт катышуучулардын укуктарын оңдоо',
-# User rights log
-'rightsnone' => '(жок)',
+# Special:Log/newusers
+'newuserlogpage' => 'Катышуучулардын каттоо журналы',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'бул баракты окуу',
@@ -1098,9 +1105,6 @@ HTML-тегдеринин тууралыгын текшериңиз.',
'activeusers-hidesysops' => 'ÐдминиÑтраторлорду жашыруу',
'activeusers-noresult' => 'Катышуучулар табылган жок.',
-# Special:Log/newusers
-'newuserlogpage' => 'Катышуучулардын каттоо журналы',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Топ',
'listgrouprights-rights' => 'Укуктар',
@@ -1129,8 +1133,8 @@ HTML-тегдеринин тууралыгын текшериңиз.',
'wlshowlast' => 'Соңку $1 Ñаат $2 күн $3 көрÑÓ©Ñ‚Ò¯Ò¯.',
'watchlist-options' => 'Көзөмөл тизменин ыраÑтоолору',
-'changed' => 'өзгөртүлдү',
'created' => 'түзүлдү',
+'changed' => 'өзгөртүлдү',
# Delete
'deletepage' => 'Баракты өчүрүү',
@@ -1179,7 +1183,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
'blanknamespace' => '(Ðегизги)',
# Contributions
-'contributions' => 'Колдонуучунун Ñалымдары',
+'contributions' => '{{GENDER:$1|Катышуучунун}} Ñалымдары',
'contributions-title' => '$1 үчүн катышуучунун Ñалымдары',
'mycontris' => 'Салымдар',
'contribsub2' => '$1 үчүн ($2)',
@@ -1421,6 +1425,10 @@ HTML-тегдеринин тууралыгын текшериңиз.',
'pageinfo-redirects-name' => 'Бул баракка багыттоолор',
'pageinfo-firstuser' => 'Барактын жаратуучуÑу',
'pageinfo-lastuser' => 'Ðкыркы редактор',
+'pageinfo-toolboxlink' => 'Барак жөнүндө маалымат',
+'pageinfo-redirectsto-info' => 'маалыматтар',
+'pageinfo-contentpage-yes' => 'Ооба',
+'pageinfo-protect-cascading-yes' => 'Ооба',
# Patrol log
'patrol-log-page' => 'Патрулдоо журналы',
@@ -1433,6 +1441,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
'file-info-size' => '$1 × $2 пикÑель, файлдын көлөмү: $3, MIME түрү: $4',
'file-nohires' => 'Мындан чоңураак чечим жок.',
'svg-long-desc' => 'SVG файл, шарттуу түрдө $1 × $2 пикÑел, файлдын көлөмү: $3',
+'svg-long-error' => 'туура ÑÐ¼ÐµÑ SVG-файл: $1',
'show-big-image' => 'Толук чечими',
# Special:NewFiles
@@ -1450,6 +1459,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
'hours' => '{{PLURAL:$1|$1 Ñаат}}',
'days' => '{{PLURAL:$1|$1 күн}}',
'ago' => '$1 мурун',
+'just-now' => 'азыр Ñле',
# Bad image list
'bad_image_list' => 'Төмөнкү калыпта болуш керек:
@@ -1741,7 +1751,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
'logentry-newusers-create' => '$1 ÑÑеп жазууÑу жаратылды',
'logentry-newusers-create2' => '$1 ÑÑеп жазууÑун жаратты',
'logentry-newusers-autocreate' => 'Ðвтоматтуу түрдө $1 ÑÑеп жазууÑу жаратылды',
-'newuserlog-byemail' => 'ÑÑ‹Ñ€Ñөз Ñл. почта аркылуу жөнөтүлдү',
+'rightsnone' => '(жок)',
# Feedback
'feedback-subject' => 'Тема:',
diff --git a/languages/messages/MessagesLa.php b/languages/messages/MessagesLa.php
index e5910760..c27377ea 100644
--- a/languages/messages/MessagesLa.php
+++ b/languages/messages/MessagesLa.php
@@ -13,6 +13,7 @@
* @author Esteban97
* @author Kaganer
* @author LeighvsOptimvsMaximvs
+ * @author MF-Warburg
* @author McDutchie
* @author MissPetticoats
* @author Omnipaedista
@@ -293,7 +294,6 @@ $messages = array(
'qbbrowse' => 'Perspicere',
'qbedit' => 'Recensere',
'qbpageoptions' => 'Optiones paginae',
-'qbpageinfo' => 'Contextus',
'qbmyoptions' => 'Paginae meae',
'qbspecialpages' => 'Paginae speciales',
'faq' => 'Quaestiones frequentes',
@@ -497,10 +497,10 @@ Ratio data est "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Conventum tuum conclusum est.'''
-Ignote continues {{grammar:ablative|{{SITENAME}}}} uti, aut conventum novum vel sub eodem vel novo nomine [[Special:UserLogin|aperias]].
+Ignote continues {{grammar:ablative|{{SITENAME}}}} uti, aut conventum novum vel sub eodem vel novo nomine <span class='plainlinks'>[$1 aperias]</span>.
Nota bene paginas fortasse videantur quasi tuum conventum esset apertum, priusquam navigatrum purgaveris.",
-'welcomecreation' => '== Salve, $1! ==
-Ratio tua creata est.
+'welcomeuser' => 'Salve, $1!',
+'welcomecreation-msg' => 'Ratio tua creata est.
Noli oblivisci [[Special:Preferences|praeferentias]] tuas apud {{grammar:accusative|{{SITENAME}}}} mutare.',
'yourname' => 'Nomen usoris:',
'yourpassword' => 'Tessera:',
@@ -521,7 +521,7 @@ Noli oblivisci [[Special:Preferences|praeferentias]] tuas apud {{grammar:accusat
'gotaccount' => "Habesne iam rationem? '''$1'''.",
'gotaccountlink' => 'Conventum aperi',
'userlogin-resetlink' => 'Num tesserae tuae oblitus es?',
-'createaccountmail' => 'ab inscriptione electronica',
+'createaccountmail' => 'Use a temporary random password and send it to the email address specified below',
'createaccountreason' => 'Causa:',
'badretype' => 'Tesserae quas scripsisti inter se non congruunt.',
'userexists' => 'Nomen usoris quod selegisti iam est.
@@ -705,7 +705,6 @@ Nobis etiam spondes te esse ipsum horum verborum scriptorem primum, aut ex opere
'template-protected' => '(protecta)',
'template-semiprotected' => '(semi-protecta)',
'hiddencategories' => 'Haec pagina ad {{PLURAL:$1|unam categoriam celatam|$1 categorias celatas}} pertinet:',
-'nocreatetitle' => 'Creatio paginarum coercita',
'nocreate-loggedin' => 'Tibi non licet paginas novas creare.',
'permissionserrors' => 'Errores permissionis',
'permissionserrorstext-withaction' => 'Tibi non licet $2, ex {{PLURAL:$1|ratione|rationibus}}:',
@@ -1042,10 +1041,13 @@ Si vis id dare, opera tua tibi ascribentur.',
'right-userrights-interwiki' => 'Potestates usorum aliis in vicis recensere',
'right-siteadmin' => 'Basem datorum obstruere vel deobstruere',
+# Special:Log/newusers
+'newuserlogpage' => 'Index rationum novarum creatarum',
+'newuserlogpagetext' => 'Hic est index rationum novarum creatarum.',
+
# User rights log
'rightslog' => 'Index mutationum iuribus usorum',
'rightslogtext' => 'Haec est index mutationum iuribus usorum.',
-'rightsnone' => '(nullus)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'hanc paginam legere',
@@ -1424,10 +1426,6 @@ Vide etiam [[Special:WantedCategories|categorias desideratas]].',
'activeusers-hidesysops' => 'Celare magistratus',
'activeusers-noresult' => 'Nullus usor inventus.',
-# Special:Log/newusers
-'newuserlogpage' => 'Index rationum novarum creatarum',
-'newuserlogpagetext' => 'Hic est index rationum novarum creatarum.',
-
# Special:ListGroupRights
'listgrouprights' => 'Gregum usorum potestates',
'listgrouprights-group' => 'Grex',
@@ -1498,11 +1496,7 @@ Mutationes posthac huic paginae et paginae disputationis ibi notabuntur.',
'unwatching' => 'Decustodiens...',
'enotif_reset' => 'Indicare omnes paginas visitatas',
-'enotif_newpagetext' => 'Haec pagina nova est.',
'enotif_impersonal_salutation' => 'Usor {{grammar:genitive|{{SITENAME}}}}',
-'changed' => 'mutata',
-'created' => 'creata',
-'enotif_subject' => 'Pagina {{grammar:genitive|{{SITENAME}}}} $PAGETITLE ab $PAGEEDITOR $CHANGEDORCREATED est',
'enotif_lastdiff' => 'Vide $1 ad hanc recensionem inspiciendum.',
'enotif_anon_editor' => 'usor ignotus $1',
'enotif_body' => '
@@ -1529,6 +1523,8 @@ To change your watchlist settings, visit
Feedback and further assistance:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'creata',
+'changed' => 'mutata',
# Delete
'deletepage' => 'Delere paginam',
@@ -1659,7 +1655,7 @@ Si pagina nova cum ipso nomine post deletionem creata est, emendationes restitut
'blanknamespace' => '(principale)',
# Contributions
-'contributions' => 'Conlationes usoris',
+'contributions' => 'Conlationes {{GENDER:$1|usoris}}',
'contributions-title' => 'Conlationes usoris $1',
'mycontris' => 'Conlationes',
'contribsub2' => 'Pro $1 ($2)',
@@ -1983,11 +1979,13 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
'pageinfo-display-title' => 'Titulus ut in pagina ipsa monstratur',
'pageinfo-length' => 'Magnitudo paginae (octeti)',
'pageinfo-article-id' => 'Identificatio paginis',
+'pageinfo-language' => 'Lingua verborum in pagina',
'pageinfo-firstuser' => 'Creator paginae',
'pageinfo-firsttime' => 'Dies et tempus creationis paginae',
'pageinfo-lastuser' => 'Usor qui ultimam recensionem fecit',
'pageinfo-lasttime' => 'Dies ultimae emendationis',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria celata|Categoriae celatae}} ($1)',
+'pageinfo-toolboxlink' => 'De hac pagina',
# Skin names
'skinname-standard' => 'Norma',
@@ -2394,8 +2392,8 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
'logentry-newusers-newusers' => 'Ratio usoris $1 creata est',
'logentry-newusers-create' => 'Ratio usoris $1 creata est',
'logentry-newusers-create2' => 'Ratio usoris $3 creata est ab usore $1',
-'logentry-newusers-autocreate' => 'Ratio $1 automatice creata est',
-'newuserlog-byemail' => 'tessera missa litteris electronicis',
+'logentry-newusers-autocreate' => 'Ratio usoris $1 automatice creata est',
+'rightsnone' => '(nullus)',
# Search suggestions
'searchsuggest-search' => 'Quaerere',
diff --git a/languages/messages/MessagesLad.php b/languages/messages/MessagesLad.php
index 4bdd6585..71f6e9fc 100644
--- a/languages/messages/MessagesLad.php
+++ b/languages/messages/MessagesLad.php
@@ -140,7 +140,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'TrocamientosFreskos' ),
'Recentchangeslinked' => array( 'TrocamientosÈnterassados' ),
'Revisiondelete' => array( 'EfassarRēvizyón' ),
- 'RevisionMove' => array( 'TaxireaRēvizyón' ),
'Search' => array( 'Buscar' ),
'Shortpages' => array( 'HojasKurtas' ),
'Specialpages' => array( 'HojasEspesyales' ),
@@ -326,7 +325,6 @@ $messages = array(
'qbbrowse' => 'Navigar',
'qbedit' => 'Trocar',
'qbpageoptions' => 'Esta hoja',
-'qbpageinfo' => 'Enformasyón de hoja',
'qbmyoptions' => 'Mis hojas',
'qbspecialpages' => 'Hojas especiales',
'faq' => 'DAD',
@@ -751,6 +749,9 @@ Las búsquedas producen más o munco a buscar biervos comunes como «la» o «de
'right-minoredit' => 'Marcar trocamientos como "chiquiticos"',
'right-delete' => 'Efassar hojas',
+# Special:Log/newusers
+'newuserlogpage' => 'Registro de creación de usuarios',
+
# User rights log
'rightslog' => 'Trocamientos de profil de usuario',
@@ -884,9 +885,6 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
'linksearch' => 'Linkes eksternos',
'linksearch-line' => 'Atamiento para $1 en la ója $2',
-# Special:Log/newusers
-'newuserlogpage' => 'Registro de creación de usuarios',
-
# Special:ListGroupRights
'listgrouprights-members' => '(ver los miembros de este grupo)',
@@ -968,7 +966,7 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
'blanknamespace' => '(Principal)',
# Contributions
-'contributions' => 'Ajustamientos del empleador',
+'contributions' => 'Ajustamientos {{GENDER:$1|del usador|de la usadora}}',
'contributions-title' => 'Ajustamientos {{GENDER:$1|del usuario|de la usuaria}} $1',
'mycontris' => 'Mis dados',
'contribsub2' => '$1 ($2)',
@@ -1281,7 +1279,6 @@ Los otros campos se van a guardar por defecto.
# New logging system
'logentry-newusers-autocreate' => 'El cuento $1 fue crîado otomatika mente',
-'newuserlog-byemail' => 'kóddiche mandado con letral',
# Feedback
'feedback-subject' => 'Sujeto',
diff --git a/languages/messages/MessagesLb.php b/languages/messages/MessagesLb.php
index f644e7f3..5fa9b27a 100644
--- a/languages/messages/MessagesLb.php
+++ b/languages/messages/MessagesLb.php
@@ -11,6 +11,7 @@
* @author Kaffi
* @author Kaganer
* @author Les Meloures
+ * @author MF-Warburg
* @author Purodha
* @author Reedy
* @author Robby
@@ -92,6 +93,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'No_MIME-Zorte_sichen' ),
'Mostcategories' => array( 'Säite_mat_de_meeschte_Kategorien' ),
'Mostimages' => array( 'Dacks_benotzte_Biller' ),
+ 'Mostinterwikis' => array( 'Meescht_Interwikien' ),
'Mostlinked' => array( 'Dacks_verlinkte_Säiten' ),
'Mostlinkedcategories' => array( 'Dacks_benotzte_Kategorien' ),
'Mostlinkedtemplates' => array( 'Dacks_benotzte_Schablounen' ),
@@ -115,7 +117,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Rezent_Ännerungen' ),
'Recentchangeslinked' => array( 'Ännerungen_op_verlinkte_Säiten' ),
'Revisiondelete' => array( 'Versioun_läschen' ),
- 'RevisionMove' => array( 'Versioun_réckelen' ),
'Search' => array( 'Sichen' ),
'Shortpages' => array( 'Kuerz_Säiten' ),
'Specialpages' => array( 'Spezialsäiten' ),
@@ -156,7 +157,7 @@ $magicWords = array(
'pagename' => array( '1', 'Säitennumm', 'SEITENNAME', 'PAGENAME' ),
'namespace' => array( '1', 'Nummraum', 'NAMENSRAUM', 'NAMESPACE' ),
'subjectspace' => array( '1', 'Haaptnummraum', 'HAUPTNAMENSRAUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
- 'subjectpagename' => array( '1', 'Haaptsäit', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagename' => array( '1', 'Haaptsäit', 'HAUPTSEITE', 'HAUPTSEITENNAME', 'VORDERSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
'img_thumbnail' => array( '1', 'Miniatur', 'miniatur', 'mini', 'thumbnail', 'thumb' ),
'img_right' => array( '1', 'riets', 'rechts', 'right' ),
'img_left' => array( '1', 'lénks', 'links', 'left' ),
@@ -175,8 +176,8 @@ $magicWords = array(
'formatnum' => array( '0', 'ZUELEFORMAT', 'ZAHLENFORMAT', 'FORMATNUM' ),
'special' => array( '0', 'spezial', 'special' ),
'hiddencat' => array( '1', '__VERSTOPPT_KATEGORIE__', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
- 'pagesincategory_pages' => array( '0', 'Säiten', 'pages' ),
- 'pagesincategory_files' => array( '0', 'Fichieren', 'files' ),
+ 'pagesincategory_pages' => array( '0', 'Säiten', 'seiten', 'pages' ),
+ 'pagesincategory_files' => array( '0', 'Fichieren', 'dateien', 'files' ),
);
$messages = array(
@@ -314,6 +315,7 @@ $messages = array(
'newwindow' => '(geet an enger neier Fënster op)',
'cancel' => 'Zréck',
'moredotdotdot' => 'Méi …',
+'morenotlisted' => 'Méi, déi hei net stinn...',
'mypage' => 'Säit',
'mytalk' => 'Diskussioun',
'anontalk' => 'Diskussioun fir dës IP Adress',
@@ -325,7 +327,6 @@ $messages = array(
'qbbrowse' => 'Duerchsichen',
'qbedit' => 'Änneren',
'qbpageoptions' => 'Säitenoptiounen',
-'qbpageinfo' => 'Kontext',
'qbmyoptions' => 'Meng Säiten',
'qbspecialpages' => 'Spezialsäiten',
'faq' => 'FAQ',
@@ -348,6 +349,7 @@ $messages = array(
'namespaces' => 'Nummraim',
'variants' => 'Varianten',
+'navigation-heading' => 'Navigatiounsmenü',
'errorpagetitle' => 'Feeler',
'returnto' => 'Zréck op $1.',
'tagline' => 'Vu {{SITENAME}}',
@@ -589,12 +591,12 @@ Den Administrateur den d\'Schreiwe gespaart huet, huet dës Erklärung uginn: "$
# Login and logout pages
'logouttext' => "'''Dir sidd elo ausgeloggt.'''
-Dir kënnt {{SITENAME}} elo anonym benotzen, oder Iech [[Special:UserLogin|erëm aloggen]].
+Dir kënnt {{SITENAME}} elo anonym benotzen, oder Iech <span class='plainlinks'>[$1 erëm aloggen]</span>.
Opgepasst: Op verschiddene Säite kann et nach esou aus gesinn, wéi wann Dir nach ageloggt wiert, bis Dir Ärem Browser säin Tëschespäicher (cache) eidel maacht.",
-'welcomecreation' => '== Wëllkomm, $1! ==
-Äre Kont gouf kreéiert.
-Denkt drun, Är [[Special:Preferences|{{SITENAME}}-Astellungen]] unzepassen.',
+'welcomeuser' => 'Wëllkomm $1!',
+'welcomecreation-msg' => "Äre Benotzerkont gouf ugeluecht.
+Vergiesst net fir Är [[Special:Preferences|{{SITENAME}} Astellungen]] z'änneren",
'yourname' => 'Benotzernumm:',
'yourpassword' => 'Passwuert:',
'yourpasswordagain' => 'Passwuert nach eemol antippen:',
@@ -617,7 +619,7 @@ Denkt drun, Är [[Special:Preferences|{{SITENAME}}-Astellungen]] unzepassen.',
'gotaccount' => "Dir hutt schonn e Benotzerkont? '''$1'''.",
'gotaccountlink' => 'Umellen',
'userlogin-resetlink' => "Hutt Dir d'Detailer vun Ärem Login vergiess?",
-'createaccountmail' => 'Via E-Mail',
+'createaccountmail' => 'En temporäert Passwuert benotzen an et per E-Mail un déi E-Mailadress schécken déi hei drënner steet',
'createaccountreason' => 'Grond:',
'badretype' => 'Är Passwierder stëmmen net iwwerdeneen.',
'userexists' => 'De Benotzernumm deen agi gouf gëtt scho benotzt.
@@ -692,6 +694,7 @@ Waart w.e.g. ier Dir et nach eng Kéier versicht.",
# Email sending
'php-mail-error-unknown' => 'Onbekannte Feeler an der PHP-Mail-Fonctioun',
'user-mail-no-addy' => 'Huet versicht eng Mail ouni Mailadress ze schécken',
+'user-mail-no-body' => 'Et gouf probéiert eng E-Mail ouni Text oder mat engem ze kuerzen Text ze schécken.',
# Change password dialog
'resetpass' => 'Passwuert änneren',
@@ -753,6 +756,7 @@ Temporärt Passwuert: $2',
'changeemail-oldemail' => 'Aktuell Mailadress:',
'changeemail-newemail' => 'Nei Mailadress:',
'changeemail-none' => '(keng)',
+'changeemail-password' => 'Ärt {{SITENAME}}-Passwuert:',
'changeemail-submit' => 'Mailadress änneren',
'changeemail-cancel' => 'Ofbriechen',
@@ -934,7 +938,6 @@ Den Administrateur den d'Datebank gespaart huet, huet dës Erklärung ginn: $1",
'template-semiprotected' => '(gespaart fir net-ugemellten an nei Benotzer)',
'hiddencategories' => 'Dës Säit gehéiert zu {{PLURAL:$1|1 verstoppter Kategorie|$1 verstoppte Kategorien}}:',
'edittools' => '<!-- Dësen Text gëtt ënnert dem "Ännere"-Formulair esouwéi dem "Eropluede"-Formulair ugewisen. -->',
-'nocreatetitle' => "D'Uleeë vun neie Säiten ass limitéiert.",
'nocreatetext' => "Op {{SITENAME}} gouf d'Schafe vun neie Säite limitéiert. Dir kënnt Säiten déi scho bestinn änneren oder Iech [[Special:UserLogin|umellen]].",
'nocreate-loggedin' => 'Dir hutt keng Berechtigung fir nei Säiten unzeleeën.',
'sectioneditnotsupported-title' => 'Ännere vum Abschnitt gëtt net ënnerstëtzt',
@@ -956,6 +959,14 @@ Si gouf anscheinend geläscht.",
'edit-no-change' => 'Är ännerung gouf ignoréiert, well Dir näischt um Text geännert hutt.',
'edit-already-exists' => 'Déi nei Säit konnt net ugeluecht ginn, well et se scho gëtt.',
'defaultmessagetext' => 'Standardtext',
+'invalid-content-data' => 'Donnéeë vum Inhalt sinn net valabel',
+'content-not-allowed-here' => '"$1"-Inhalt ass op der Säit [[$2]] net erlaabt',
+
+# Content models
+'content-model-wikitext' => 'Wikitext',
+'content-model-text' => 'Kloertext',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Opgepasst:'' Dës Säit huet ze vill Ufroe vu komplexe Parserfunktiounen.
@@ -1317,9 +1328,9 @@ Dëst kann net réckgängeg gemaach ginn.",
'prefs-emailconfirm-label' => 'E-Mail Confirmatioun:',
'prefs-textboxsize' => 'Gréisst vun der Ännerungsfënster',
'youremail' => 'E-Mailadress:',
-'username' => 'Benotzernumm:',
-'uid' => 'Benotzer ID:',
-'prefs-memberingroups' => 'Member vun {{PLURAL:$1|der Benotzergrupp|de Benotzergruppen}}:',
+'username' => '{{GENDER:$1|Benotzernumm}}:',
+'uid' => '{{GENDER:$1|Benotzer}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|Member}} vun {{PLURAL:$1|der Benotzergrupp|de Benotzergruppen}}:',
'prefs-registration' => 'Zäitpunkt vum Opmaache vum Benotzerkont:',
'yourrealname' => 'Richtegen Numm:',
'yourlanguage' => 'Sprooch:',
@@ -1467,12 +1478,13 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
'right-sendemail' => 'Anere Benotzer E-Maile schécken',
'right-passwordreset' => 'Maile vum Zrécksetze vum Passwuert weisen',
+# Special:Log/newusers
+'newuserlogpage' => 'Logbuch vun den neien Umeldungen',
+'newuserlogpagetext' => "Dëst ass d'Lescht vun de Benotzernimm déi ugeluecht goufen.",
+
# User rights log
'rightslog' => 'Logbuch vun de Benotzerrechter',
'rightslogtext' => "Dëst ass d'Lëscht vun den Ännerunge vu Benotzerrechter.",
-'rightslogentry' => "huet d'Benotzerrechter vum $1 vun $2 op $3 geännert.",
-'rightslogentry-autopromote' => 'gouf automatesch aus dem Grupp $2 an de Grupp $3 gesat',
-'rightsnone' => '(keen)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'dës Säit ze liesen',
@@ -1700,6 +1712,7 @@ Wann de Problem weider besteet, dann un de [[Special:ListUsers/sysop|Administrat
'backend-fail-notsame' => 'Et gëtt schonn en net-identesche Fichier op $1.',
'backend-fail-invalidpath' => '$1 ass keng valabel Plaz fir ze späicheren.',
'backend-fail-delete' => 'De Fichier $1 konnt net geläscht ginn.',
+'backend-fail-describe' => 'D\'Metadate fir de Fichier "$1" konten net geännert ginn.',
'backend-fail-alreadyexists' => 'De Fichier $1 gëtt et schonn.',
'backend-fail-store' => 'De Fichier $1 konnt net op $2 gespäichert ginn.',
'backend-fail-copy' => 'De Fichier $1 konnt net op $2 kopéiert ginn.',
@@ -1926,6 +1939,12 @@ Dir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <code>image/jpeg</code>.",
Si sollte am beschten op déi eigentlech gemengte Säit verlinkt sinn.<br />
Eng Säite gëtt als Homonymie-Säit behandelt, wa si eng Schabloun benotzt déi vu [[MediaWiki:Disambiguationspage]] verlinkt ass.",
+'pageswithprop' => 'Säite mat enger Säiten-Eegeschaft',
+'pageswithprop-legend' => 'Säite mat enger Säiten-Eegeschaft',
+'pageswithprop-text' => 'Op dëser Säit sti Säiten déi eng speziell Säiteneegeschaft benotzen.',
+'pageswithprop-prop' => 'Numm vun der Eegeschaft:',
+'pageswithprop-submit' => 'Lass',
+
'doubleredirects' => 'Duebel Viruleedungen',
'doubleredirectstext' => 'Op dëser Säit stinn déi Säiten déi op aner Viruleedungssäite viruleeden.
An 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.
@@ -2078,7 +2097,7 @@ Kuckt och [[Special:WantedCategories|Gewënscht Kategorien]].',
'linksearch-ok' => 'Sichen',
'linksearch-text' => '"Wildcards" wéi zum Beispill "*.example.com" kënne benotzt ginn.
Et muss mindestens en Top-Level-Domaine ugi ginn, wéi z. Bsp. ".org".<br />
-Ënnerstëtzte Protekoller: <code>$1</code> (http:// gëtt benotzt wann näischt spezifizéiert gëtt).',
+Ënnerstëtzte {{PLURAL:$2|Protokoll|Protekoller}}: <code>$1</code> (http:// gëtt benotzt wann näischt spezifizéiert gëtt).',
'linksearch-line' => '$1 verlinkt vun $2',
'linksearch-error' => 'Wildcards (*,?) kënnen nëmmen am Ufank vum Host-Numm benotzt ginn.',
@@ -2097,10 +2116,6 @@ Et muss mindestens en Top-Level-Domaine ugi ginn, wéi z. Bsp. ".org".<br />
'activeusers-hidesysops' => 'Administrateure verstoppen',
'activeusers-noresult' => 'Keng Benotzer fonnt.',
-# Special:Log/newusers
-'newuserlogpage' => 'Logbuch vun den neien Umeldungen',
-'newuserlogpagetext' => "Dëst ass d'Lescht vun de Benotzernimm déi ugeluecht goufen.",
-
# Special:ListGroupRights
'listgrouprights' => 'Rechter vun de Benotzergruppen',
'listgrouprights-summary' => 'Dëst ass eng Lëscht vun den op dëser Wiki definéierte Benotzergruppen an den domat verbonnene Rechter.
@@ -2195,19 +2210,20 @@ All weider Ännerungen op dëser Säit an der assoziéierter Diskussiounssäit g
'enotif_mailer' => '{{SITENAME}} E-Mail-Informatiounssystem',
'enotif_reset' => 'All Säiten als besicht markéieren',
-'enotif_newpagetext' => 'Dëst ass eng nei Säit.',
'enotif_impersonal_salutation' => '{{SITENAME}}-Benotzer',
-'changed' => 'geännert',
-'created' => 'gemaach',
-'enotif_subject' => '[{{SITENAME}}] D\'Säit "$PAGETITLE" gouf vum $PAGEEDITOR $CHANGEDORCREATED',
+'enotif_subject_deleted' => "D'{{SITENAME}}-Säit $1 gouf vum {{gender:$2|$2}} geläscht",
+'enotif_subject_created' => "D'{{SITENAME}}-Säit $1 gouf vum {{gender:$2|$2}} ugeluecht",
+'enotif_subject_moved' => "D'{{SITENAME}}-Säit $1 gouf vum {{gender:$2|$2}} geréckelt",
+'enotif_subject_restored' => "D'{{SITENAME}}-Säit $1 gouf vum {{gender:$2|$2}} restauréiert",
+'enotif_subject_changed' => "D'{{SITENAME}}-Säit $1 gouf vum {{gender:$2|$2}} geännert",
+'enotif_body_intro_deleted' => 'D\'{{SITENAME}}-Säit $1 gouf de(n) $PAGEEDITDATE {{gender:$2|vum $2|vun der $2}} geläscht, kuckt $3.',
+'enotif_body_intro_created' => 'D\'{{SITENAME}}-Säit $1 gouf den $PAGEEDITDATE vum $2 {{GENDER:$2|ugeluecht}}, kuckt $3 fir déi aktuell Versioun.',
'enotif_lastvisited' => 'All Ännerungen op ee Bléck: $1',
'enotif_lastdiff' => 'Kuckt $1 fir dës Ännerung.',
'enotif_anon_editor' => 'Anonyme Benotzer $1',
'enotif_body' => 'Léiwe $WATCHINGUSERNAME,
-D\'{{SITENAME}}-Säit "$PAGETITLE" gouf vum $PAGEEDITOR den $PAGEEDITDATE $CHANGEDORCREATED. Aktuell Versioun: $PAGETITLE_URL
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Resumé vum Mataarbechter: $PAGESUMMARY $PAGEMINOREDIT
@@ -2216,26 +2232,29 @@ E-Mail: $PAGEEDITOR_EMAIL
Wiki: $PAGEEDITOR_WIKI
Et gi soulaang keng weider Maile geschéckt, bis Dir d\'Säit nees emol besicht hutt.
-Op Ärer Iwwerwaachungslëscht kënnt Dir all Benoorichtigungsmarkeren zesummen zrécksetzen.
+Op Ärer Iwwerwaachungslëscht kënnt Dir all Benoorichtigungsmarkeren zesummen zErécksetzen.
- Äre frëndleche {{SITENAME}} Benoriichtigungssystem
+Äre frëndleche {{SITENAME}} Benoriichtigungssystem
--
-Fir d\'Astellungen op ären E-Mailbenoriichtigungen z\'änneren, besicht w.e.g.
+Fir d\'Astellungen op Ären E-Mailbenoriichtigungen z\'änneren, besicht w.e.g.
{{canonicalurl:{{#special:Preferences}}}}
-Fir d\'Astellungen vun ärer Iwwerwaachungslëscht z\'änneren, besicht w.e.g.
+Fir d\'Astellungen vun Ärer Iwwerwaachungslëscht z\'änneren, besicht w.e.g.
{{canonicalurl:Special:Watchlist/edit}}
-
+Feedback a weider Hëllef:
+{{canonicalurl:{{MediaWiki:Helppage}}}}
Fir d\'Säit vun Ärer Iwwerwaachungslëscht erofzehuelen, gitt w.e.g. op
$UNWATCHURL
Reaktiounen a méi Hëllef:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'gemaach',
+'changed' => 'geännert',
# Delete
'deletepage' => 'Säit läschen',
@@ -2306,6 +2325,7 @@ Kuckt d'[[Special:ProtectedPages|Lëscht vun de gespaarte Säite]] fir eng Lësc
'prot_1movedto2' => '[[$1]] gouf op [[$2]] geréckelt',
'protect-badnamespace-title' => 'Nummraum deen net gespaart ka ginn',
'protect-badnamespace-text' => 'Säiten an dësem Nummraum kënnen net gespaart ginn.',
+'protect-norestrictiontypes-title' => 'Säit kann net gespaart ginn',
'protect-legend' => "Confirméiert d'Protectioun",
'protectcomment' => 'Grond:',
'protectexpiry' => 'Dauer vun der Spär:',
@@ -2386,7 +2406,8 @@ An esou Fäll däerf déi neiste Versioun net markéiert ginn oder déi neiste g
'undeletedrevisions' => '$1 {{PLURAL:$1|Versioun gouf|$1 Versioune goufe}} restauréiert',
'undeletedrevisions-files' => '{{PLURAL:$1|1 Versioun|$1 Versiounen}} a(n) {{PLURAL:$2|1 Fichier|$2 Fichiere}} goufe restauréiert',
'undeletedfiles' => '$1 {{PLURAL:$1|Fichier gouf|Fichiere goufe}} restauréiert',
-'cannotundelete' => "D'Restauratioun huet net fonktionéiert. Een anere Benotzer huet déi Säit warscheinlech scho virun iech restauréiert.",
+'cannotundelete' => "D'Restauratioun huet net fonctionnéiert:
+$1",
'undeletedpage' => "'''$1''' gouf restauréiert.
Am [[Special:Log/delete|Läsch-Logbuch]] fannt Dir déi geläscht a restauréiert Säiten.",
@@ -2417,7 +2438,7 @@ $1',
'blanknamespace' => '(Haapt)',
# Contributions
-'contributions' => 'Kontributioune vum Benotzer',
+'contributions' => '{{GENDER:$1|Benotzer}}kontributiounen',
'contributions-title' => 'Kontributioune vum $1',
'mycontris' => 'Kontributiounen',
'contribsub2' => 'Fir $1 ($2)',
@@ -2797,6 +2818,7 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
'import-error-interwiki' => 'D\'Säit "$1" gouf net importéiert well deen Numm fir extern Linken (Interwiki) reservéiert ass.',
'import-error-special' => 'D\'Säit "$1" gouf net importéiert well se zu engem speziellen Nummraum gehéiert an deem et keng Säite gëtt.',
'import-error-invalid' => 'D\'Säit "$1" gouf net importéiert well hiren Numm net valabel ass.',
+'import-error-unserialize' => 'D\'Versioun $2 vun der Säit "$1" konnt net deserialiséiert ginn. Et gouf uginn datt déi Versioun den Inhaltsmodell $3 benotzt deen als $4 serialiséiert ass.',
'import-options-wrong' => 'Falsch {{PLURAL:$2|Optioun|Optiounen}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Déi Basis-Säit déi Dir uginn hutt ass kee valabelen Titel.',
'import-rootpage-nosubpage' => 'Am Nummraum "$1" vun der Basis-Säit si keng Ënnersäiten erlaabt.',
@@ -2811,7 +2833,6 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
# JavaScriptTest
'javascripttest' => 'JavaScript-Test',
-'javascripttest-disabled' => 'Dës Funktioun gouf an dëser Wiki net aktivéiert.',
'javascripttest-title' => '$1-Tester ginn elo gemaach',
'javascripttest-pagetext-noframework' => 'Dës Säit ass fir Java-Script-Tester reservéiert.',
'javascripttest-pagetext-unknownframework' => 'Onbekannten Test-Framework "$1".',
@@ -2940,11 +2961,13 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
'pageinfo-default-sort' => 'Standard-Zortéierschlëssel',
'pageinfo-length' => 'Gréisst vun der Säit (a Bytes)',
'pageinfo-article-id' => 'ID (Nummer) vun der Säit',
+'pageinfo-language' => 'Sprooch vum Inhalt vun der Säit',
'pageinfo-robot-policy' => 'Sichmaschinnestatus',
'pageinfo-robot-index' => 'Indexéierbar',
'pageinfo-robot-noindex' => 'Net indexéierbar',
'pageinfo-views' => 'Zuel vun de Kéieren déi dës Säit gekuckt gouf',
'pageinfo-watchers' => "Zuel vun de Benotzer déi d'Säit iwwerwaachen",
+'pageinfo-few-watchers' => 'Manner wéi $1 {{PLURAL:$1|Benotzer deen iwwerwaacht|Benotzer déi iwwerwaachen}}',
'pageinfo-redirects-name' => 'Viruleedungen op dës Säit',
'pageinfo-subpages-name' => 'Ënnersäite vun dëser Säit',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|Viruleedung|Viruleedungen}}; $3 {{PLURAL:$3|Ënnersäit|Ënnersäiten}})',
@@ -2959,6 +2982,19 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
'pageinfo-magic-words' => '{{PLURAL:$1|Magescht Wuert|Magesch Wierder}} ($1)',
'pageinfo-hidden-categories' => 'Verstoppte {{PLURAL:$1|Kategorie|Kategorien}} ($1)',
'pageinfo-templates' => 'Agebonne {{PLURAL:$1|Schabloun|Schabloune}} ($1)',
+'pageinfo-transclusions' => 'Agebonnen {{PLURAL:$1|an eng Säit|a(n) $1 Säiten}}',
+'pageinfo-toolboxlink' => "Informatiounen iwwert d'Säit",
+'pageinfo-redirectsto' => 'Viruleedung op',
+'pageinfo-redirectsto-info' => 'Informatioun',
+'pageinfo-contentpage' => 'Als Säit mat Inhalt gezielt',
+'pageinfo-contentpage-yes' => 'Jo',
+'pageinfo-protect-cascading' => 'Säite mat Kaskadespär vun hei aus',
+'pageinfo-protect-cascading-yes' => 'Jo',
+'pageinfo-protect-cascading-from' => 'Säite mat Kaskadespär vu(n)',
+'pageinfo-category-info' => "Informatiounen iwwer d'Kategorie",
+'pageinfo-category-pages' => 'Zuel vun de Säiten',
+'pageinfo-category-subcats' => 'Zuel vun den Ënnerkategorien',
+'pageinfo-category-files' => 'Zuel vun de Fichieren',
# Skin names
'skinname-standard' => 'Klassesch',
@@ -2980,6 +3016,8 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
'markedaspatrollederror' => 'Kann net als "nogekuckt" markéiert ginn.',
'markedaspatrollederrortext' => 'Dir musst eng Säitenännerung auswielen.',
'markedaspatrollederror-noautopatrol' => 'Dir däerft Är eegen Ännerungen net als nogekuckt markéieren.',
+'markedaspatrollednotify' => 'Dës Ännerung vu(n) $1 gouf als nogekuckt markéiert.',
+'markedaspatrollederrornotify' => 'Markéieren als kontrolléiert huet net fonctionnéiert.',
# Patrol log
'patrol-log-page' => 'Logbuch vun den iwwerkuckte Versiounen',
@@ -3013,6 +3051,7 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
'file-nohires' => 'Et gëtt keng méi héich Opléisung.',
'svg-long-desc' => 'SVG-Fichier, Basisgréisst: $1 × $2 Pixel, Gréisst vum Fichier: $3',
'svg-long-desc-animated' => 'Animéierten SVG-Fichier, Basisgréisst $1 x $2 Pixel, Gréisst vum Fichier: $3',
+'svg-long-error' => 'Ongëltegen SVG-Fichier: $1',
'show-big-image' => 'Voll Opléisung',
'show-big-image-preview' => 'Gréisst vun dësem Preview: $1.',
'show-big-image-other' => 'Aner {{PLURAL:$2|Opléisung|Opléisungen}}: $1.',
@@ -3041,7 +3080,10 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
'minutes' => '{{PLURAL:$1|enger Minutt|$1 Minutten}}',
'hours' => '{{PLURAL:$1|enger Stonn|$1 Stonnen}}',
'days' => '{{PLURAL:$1|engem Dag|$1 Deeg}}',
+'months' => '{{PLURAL:$1|ee Mount|$1 Méint}}',
+'years' => '{{PLURAL:$1|ee Joer|$1 Joer}}',
'ago' => 'viru(n) $1',
+'just-now' => 'grad elo',
# Bad image list
'bad_image_list' => 'Format:
@@ -3520,6 +3562,7 @@ Dëse Confirmatiouns-Code leeft den $4 of.',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-Abannung ass ausgeschalt]',
'scarytranscludefailed' => "[D'Siche no der Schabloun fir $1 huet net funktionéiert]",
+'scarytranscludefailed-httpstatus' => "[D'Oprufe vun der Schabloun $1: HTTP $2 huet net fonctionnéiert]",
'scarytranscludetoolong' => "[D'URL ass ze laang]",
# Delete conflict
@@ -3627,6 +3670,7 @@ Dir kënnt och [[Special:EditWatchlist|de Standard Editeur benotzen]].",
'version-license' => 'Lizenz',
'version-poweredby-credits' => "Dës Wiki fonctionnéiert mat '''[//www.mediawiki.org/ MediaWiki]''', Copyright © 2001-$1 $2.",
'version-poweredby-others' => 'anerer',
+'version-credits-summary' => "Mir soen dëse Persoune 'Merci' fir hir Mataarbecht u [[Special:Version|MediaWiki]].",
'version-license-info' => "MediaWiki ass fräi Software; Dir kënnt se weiderginn an/oder s'änneren ënnert de Bedingungen vun der GNU-General Public License esou wéi se vun der Free Softare Foundation publizéiert ass; entweder ënner der Versioun 2 vun der Lizenz, oder (no Ärem Choix) enger spéiderer Versioun.
MediaWiki gëtt verdeelt an der Hoffnung datt se nëtzlech ass, awer OUNI IERGENDENG GARANTIE; ouni eng implizit Garantie vu Commercialisatioun oder Eegnung fir e bestëmmte Gebrauch. Kuckt d'GPU Geral Public License fir méi Informatiounen.
@@ -3741,14 +3785,14 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
'sqlite-no-fts' => "$1 ënnerstëtzt d'Volltextsich net",
# New logging system
-'logentry-delete-delete' => "$1 huet d'Säit $3 geläscht",
-'logentry-delete-restore' => "$1 huet d'Säit $3 restauréiert",
-'logentry-delete-event' => "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 geännert",
-'logentry-delete-event-legacy' => "$1 huet d'Visibilitéit vun Elementer am Log op $3 geännert",
-'logentry-delete-revision-legacy' => "$1 huet d'Visibilitéit vu Versioune vun der Säit $3 geännert",
-'logentry-suppress-delete' => "$1 huet d'Säit $3 ewechgeholl",
-'logentry-suppress-event-legacy' => "$1 huet diskret d'Visibilitéit vun Elementer am Log op $3 geännert",
-'logentry-suppress-revision-legacy' => "$1 huet diskret d'Visibilitéit vu Versioune vun der Säit $3 geännert",
+'logentry-delete-delete' => "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht",
+'logentry-delete-restore' => "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert",
+'logentry-delete-event' => "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 {{GENDER:$2|geännert}}",
+'logentry-delete-event-legacy' => "$1 huet d'Visibilitéit vun Elementer am Log op $3 {{GENDER:$2|geännert}}",
+'logentry-delete-revision-legacy' => "$1 huet d'Visibilitéit vu Versioune vun der Säit $3 {{GENDER:$2|geännert}}",
+'logentry-suppress-delete' => "$1 {{GENDER:$2|huet}} d'Säit $3 ewechgeholl",
+'logentry-suppress-event-legacy' => "$1 {{GENDER:$2|huet}} diskret d'Visibilitéit vun Elementer am Log op $3 geännert",
+'logentry-suppress-revision-legacy' => "$1 huet diskret d'Visibilitéit vu Versioune vun der Säit $3 {{GENDER:$2|geännert}}",
'revdelete-content-hid' => 'Inhalt verstoppt',
'revdelete-summary-hid' => 'Resumé vun der Ännerung verstoppt',
'revdelete-uname-hid' => 'Benotzernumm verstoppt',
@@ -3757,17 +3801,21 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
'revdelete-uname-unhid' => 'Benotzernumm net verstoppt',
'revdelete-restricted' => 'Limitatioune fir Administrateuren ageschalt',
'revdelete-unrestricted' => 'Limitatioune fir Administrateuren opgehuewen',
-'logentry-move-move' => "$1 huet d'Säit $3 op $4 geréckelt",
-'logentry-move-move-noredirect' => "$1 huet d'Säit $3 op $4 geréckelt ouni eng Viruleedung unzeleeën",
-'logentry-move-move_redir' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen",
-'logentry-move-move_redir-noredirect' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen an et et gouf keng nei Viruleedung ugeluecht",
-'logentry-patrol-patrol' => "$1 huet d'Versioun $4 vun der Säit $3 als nogekuckt markéiert",
-'logentry-patrol-patrol-auto' => "$1 huet d'Versioun $4 vun der Säit $3 automatesch als nogekuckt markéiert",
-'logentry-newusers-newusers' => 'De Benotzerkont $1 gouf ugeluecht',
-'logentry-newusers-create' => 'De Benotzerkont $1 gouf ugeluecht',
-'logentry-newusers-create2' => 'De Benotzerkont $3 gouf vum $1 ugeluecht',
-'logentry-newusers-autocreate' => 'De Benotzerkont $1 gouf automatesch ugeluecht',
-'newuserlog-byemail' => "d'Passwuert gouf per E-Mail geschéckt",
+'logentry-move-move' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}}",
+'logentry-move-move-noredirect' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} ouni eng Viruleedung unzeleeën",
+'logentry-move-move_redir' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} an dobäi gouf eng Viruleedung iwwerschriwwen",
+'logentry-move-move_redir-noredirect' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} an dobäi gouf eng Viruleedung iwwerschriwwen an et et gouf keng nei Viruleedung ugeluecht",
+'logentry-patrol-patrol' => "$1 huet d'Versioun $4 vun der Säit $3 als nogekuckt {{GENDER:$2|markéiert}}",
+'logentry-patrol-patrol-auto' => "$1 huet d'Versioun $4 vun der Säit $3 automatesch als nogekuckt {{GENDER:$2|markéiert}}",
+'logentry-newusers-newusers' => 'De Benotzerkont $1 gouf {{GENDER:$2|ugeluecht}}',
+'logentry-newusers-create' => 'De Benotzerkont $1 gouf {{GENDER:$2|ugeluecht}}',
+'logentry-newusers-create2' => 'De Benotzerkont $3 gouf vum $1 {{GENDER:$2|ugeluecht}}',
+'logentry-newusers-byemail' => "De Benotzerkont $3 gouf vum $1 {{GENDER:$2|ugeluecht}} an d'Passwuert gouf per E-Mail geschéckt.",
+'logentry-newusers-autocreate' => 'De Benotzerkont $1 gouf automatesch {{GENDER:$2|ugeluecht}}',
+'logentry-rights-rights' => "$1 {{GENDER:$2|huet}} d'Gruppen zou deenen de Benotzer $3 gehéiert vu(n) $4 op $5 geännert",
+'logentry-rights-rights-legacy' => "$1 {{GENDER:$2|huet}} d'Gruppen zou deenen de Benotzer $3 gehéiert geännert",
+'logentry-rights-autopromote' => "De Benotzer $1 {{GENDER:$2|krut}} d'Benotzerrechter automatesch vu(n) $4 op $5 geännert",
+'rightsnone' => '(keen)',
# Feedback
'feedback-bugornote' => 'Wann Dir bereet sidd fir en technesche Problem am Detail ze beschreiwen da [$1 mellt w.e.g. e Feeler (Bug)].
@@ -3821,6 +3869,7 @@ Soss kënnt Dir den einfache Formulär hei drënner benotzen. Är Bemierkung gë
'api-error-ok-but-empty' => 'Interne Feeler: keng Äntwert vum Server.',
'api-error-overwrite' => "D'Iwwerschreiwe vun engem Fichier ass net erlaabt.",
'api-error-stashfailed' => 'Interne Feeler: de Server konnt den temporäre Fichier net späicheren.',
+'api-error-publishfailed' => 'Interne Feeler: de Server konnt den temporäre Fichier net publizéieren.',
'api-error-timeout' => 'De Server huet net bannen där Zäit geäntwert déi virgesinn ass.',
'api-error-unclassified' => 'En onbekannte Feeler ass geschitt',
'api-error-unknown-code' => 'Onbekannte Feeler: "$1"',
@@ -3841,4 +3890,7 @@ Soss kënnt Dir den einfache Formulär hei drënner benotzen. Är Bemierkung gë
'duration-centuries' => '$1 {{PLURAL:$1|Joerhonnert|Joerhonnerten}}',
'duration-millennia' => '$1 {{PLURAL:$1|Millenaire|Millenairen}}',
+# Image rotation
+'rotate-comment' => 'Bild ëm $1 {{PLURAL:$1|Grad}} an der Richtung vun der Auer gedréint',
+
);
diff --git a/languages/messages/MessagesLez.php b/languages/messages/MessagesLez.php
index 5e21ba2e..306e60de 100644
--- a/languages/messages/MessagesLez.php
+++ b/languages/messages/MessagesLez.php
@@ -149,7 +149,6 @@ $messages = array(
'qbbrowse' => 'Килигун',
'qbedit' => 'Дегишарун',
'qbpageoptions' => 'Ччинин низамарунар',
-'qbpageinfo' => 'Ччиникай малумат',
'qbmyoptions' => 'Зи ччинар',
'qbspecialpages' => 'КьетӀен хъувун',
'faq' => 'Фад-фад гузвай жузунар (ФГЖ)',
@@ -692,9 +691,11 @@ $messages = array(
'right-browsearchive' => 'Ðлуднавай ччинар жугъурун',
'right-undelete' => 'Ðлуднавай ччинар туькIуьр хъувун',
+# Special:Log/newusers
+'newuserlogpage' => 'Уртахар региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð°Ð²ÑƒÐ½Ð¸Ð½ журнал',
+
# User rights log
'rightslog' => 'ЭхтиÑÑ€ Ишлемишчидин дафтlар',
-'rightsnone' => '(Ñадни)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'И ччин кIелун',
@@ -921,9 +922,6 @@ $messages = array(
'listusers-noresult' => 'ИштиракчиÑÑ€ жагъуриз хьанвач',
'listusers-blocked' => '(блокарнава)',
-# Special:Log/newusers
-'newuserlogpage' => 'Уртахар региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð°Ð²ÑƒÐ½Ð¸Ð½ журнал',
-
# Special:ListGroupRights
'listgrouprights-group' => 'КIеретI',
'listgrouprights-members' => '(уьзвийрин ÑиÑгь)',
@@ -955,8 +953,8 @@ $messages = array(
'watching' => 'Килигун...',
'unwatching' => 'Ðмма клигнай',
-'changed' => 'дегишнава',
'created' => 'туькIуьрнава',
+'changed' => 'дегишнава',
# Delete
'deletepage' => 'Къакъудун хъувун',
@@ -1327,6 +1325,14 @@ CиÑгьда авай анжах (* лишандихъ галаз ÑгечIза
# Special:ComparePages
'compare-page1' => 'Чар 1',
+# New logging system
+'logentry-move-move' => '$3 макъаладин тӀвар $4 -диз маÑакӀа хъувуна',
+'logentry-move-move-noredirect' => '$3 макъаладин тӀвар, ракъурунин винелай $4 -диз маÑакӀа хъувуна',
+'logentry-move-move_redir' => '$3 макъаладин тӀвар, ракъурун тун тавуна $4 -диз маÑакӀа хъувуна',
+'logentry-move-move_redir-noredirect' => '$3 макъаладин тӀвар, ракъурун тун тавуна ва ракъурунин винелай $4 -диз маÑакӀа хъувуна',
+'logentry-newusers-autocreate' => 'Уртахдин $1 учётдин кхьин автоматиквилели туькӀуьр хьанва',
+'rightsnone' => '(Ñадни)',
+
# Feedback
'feedback-subject' => 'Тема:',
'feedback-message' => 'Чар:',
diff --git a/languages/messages/MessagesLfn.php b/languages/messages/MessagesLfn.php
index a51be868..d7138b2f 100644
--- a/languages/messages/MessagesLfn.php
+++ b/languages/messages/MessagesLfn.php
@@ -152,7 +152,6 @@ $messages = array(
'qbbrowse' => 'Surfa',
'qbedit' => 'Edita',
'qbpageoptions' => 'Esta paje',
-'qbpageinfo' => 'Situa',
'qbmyoptions' => 'Me pajes',
'qbspecialpages' => 'Pajes spesial',
@@ -688,7 +687,6 @@ Si tu vole sutrae la paje de tu lista de pajes oservada en la futur, clica a \"n
'watching' => 'Oserva...',
'unwatching' => 'No oserva...',
-'enotif_newpagetext' => 'Esta es un paje nova',
'created' => 'Creada',
# Delete
diff --git a/languages/messages/MessagesLg.php b/languages/messages/MessagesLg.php
index a77a512b..d951f6e5 100644
--- a/languages/messages/MessagesLg.php
+++ b/languages/messages/MessagesLg.php
@@ -400,11 +400,8 @@ Ensonga gy\'awadde eri nti "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Kati ovuddemu.'''
-Osobola okusigala nga okozesa {{SITENAME}} nga at'eyanjudde, ate osobola [[Special:UserLogin|n'okuddamu okuyingira]] nga bw'obadde oba nga okozesezza ery'obwa memba eddala.
+Osobola okusigala nga okozesa {{SITENAME}} nga at'eyanjudde, ate osobola <span class='plainlinks'>[$1 n'okuddamu okuyingira]</span> nga bw'obadde oba nga okozesezza ery'obwa memba eddala.
Wekkaanye, empapula ezimu ziyinza okukweyolekera nga bwe zibadde nga oyingidde - okutuusa lw'okunkumula eggwanika ezzibizi erya kalambula-neti yo.",
-'welcomecreation' => "== $1 tukwanirizza! == <br />
-Akawunti yo ekoledwa.<br />
-Tewerabira kwetereereza [[Special:Preferences|enteekateeka yo ey'oku {{SITENAME}}]].",
'yourname' => "Ery'obwa memba",
'yourpassword' => 'Ekigambo ekikuumi',
'yourpasswordagain' => 'Ddamu ekigambo ekikuumi',
@@ -731,7 +728,6 @@ Ekyasemba okuyingizibwa mu lukalala olw'ebifuddeyo lwa lwo bibino okwongera okuk
'template-protected' => '(luno lusibidwa)',
'template-semiprotected' => '(ebimu ku lupapula luno bisibidwa)',
'hiddencategories' => 'Olupapula luno lusangibwa mu {{PLURAL:$1|ttuluba erikise limu|matuluba amakise $1}}:',
-'nocreatetitle' => 'Okukolawo empapula kuliko obukwakkulizo',
'nocreatetext' => "Ku {{SITENAME}} tosobola okukolawo empapula mpya nga tokozesa buyinza obw'obwamemba. Kati oyinza kugenda n'okyusamu olupapula olulala olwakolebwa dda, oba oyinza [[Special:UserLogin|okufuna obuyinza obw'obwamemba]].",
'nocreate-loggedin' => 'Tolina buyinza bwa kukolawo empapula mpya.',
'sectioneditnotsupported-title' => 'Okukyusa mu bitundu tekukkirizibwa',
@@ -903,6 +899,9 @@ W'owandikira by'onoonya bw'osoosawo akagambo ''all:'', okunoonya kubuna Wikipedi
'grouppage-sysop' => '{{ns:project}}:Abateesiteesi',
+# Special:Log/newusers
+'newuserlogpage' => "Olukalala olw'ebifudeyo mu kukolawo akawunti empya",
+
# User rights log
'rightslog' => "Olukalala lw'ebifudeyo ku by'endukusa za bamemba",
@@ -1020,9 +1019,6 @@ W'owandikira by'onoonya bw'osoosawo akagambo ''all:'', okunoonya kubuna Wikipedi
'linksearch-ns' => 'Kuŋaanyizo:',
'linksearch-ok' => 'Noonya',
-# Special:Log/newusers
-'newuserlogpage' => "Olukalala olw'ebifudeyo mu kukolawo akawunti empya",
-
# Special:ListGroupRights
'listgrouprights-members' => '(lukalala lwa bamemba)',
diff --git a/languages/messages/MessagesLi.php b/languages/messages/MessagesLi.php
index 40eff7c4..d7d50bb5 100644
--- a/languages/messages/MessagesLi.php
+++ b/languages/messages/MessagesLi.php
@@ -301,7 +301,6 @@ $messages = array(
'qbbrowse' => 'Bladere',
'qbedit' => 'Bewirke',
'qbpageoptions' => 'Pagina-opties',
-'qbpageinfo' => 'Pagina-informatie',
'qbmyoptions' => 'mien opties',
'qbspecialpages' => "Speciaal pagina's",
'faq' => 'FAQ (väölgesjtèlde vraoge)',
@@ -558,11 +557,8 @@ d\'n Opgegaeve raej vanne sloetendje admin waar "\'\'$3\'\'".',
# Login and logout pages
'logouttext' => "'''De bis noe aafgemeld.'''
-De kèns {{SITENAME}} noe anoniem (mit vermeljing van IP-adres) gebroeke, of [[Special:UserLogin|opnuuj aanmelde]] ónger dezelfde of 'ne angere naam.
+De kèns {{SITENAME}} noe anoniem (mit vermeljing van IP-adres) gebroeke, of <span class='plainlinks'>[$1 opnuuj aanmelde]</span> ónger dezelfde of 'ne angere naam.
Mäögelik waert nog 'n deil pagina's getuind esofs te nog aangemeld bis pès te de cache van diene browser laeg maaks.",
-'welcomecreation' => '== Wèlkóm, $1! ==
-Diene gebroeker is noe vaerdig.
-Vergaet neet dien [[Special:Preferences|veurkäöre veur {{SITENAME}}]] aan te passe.',
'yourname' => 'Diene gebroekersnaam',
'yourpassword' => 'Die wachwaord',
'yourpasswordagain' => 'Wachwaord opnuuj intype',
@@ -873,7 +869,6 @@ De lèste logbookregel vólg hier:",
'template-protected' => '(besjirmp)',
'template-semiprotected' => '(semi-besjörmp)',
'hiddencategories' => 'Dees pagina vélt in de volgende verborge {{PLURAL:$1|categorie|categorië}}:',
-'nocreatetitle' => "'t Aanmake van pagina's is beperk",
'nocreatetext' => "{{SITENAME}} haet de mäögelikheid óm nuuj pagina's te make beperk.
De kans al besjtaonde pagina's verangere, of de kans [[Special:UserLogin|dich aanmelde of 'n gebroekersaccount aanmake]].",
'nocreate-loggedin' => "De höbs gein rechte óm nuuj pagina's te make.",
@@ -1411,12 +1406,13 @@ Deze informatie is zichbaar veur angere gebroekers.',
'right-sendemail' => 'Versjik e-mail aan anger gebroekers',
'right-passwordreset' => 'Bekiek e-mails van ópnuuj ingestèldje wachwäörd',
+# Special:Log/newusers
+'newuserlogpage' => 'Logbook nuuj gebroekers',
+'newuserlogpagetext' => 'Hiej ónger saton de nuuj ingesjreve gebroekers.',
+
# User rights log
'rightslog' => 'Gebroekersrechtelogbook',
'rightslogtext' => 'Hiej onger staon de wieziginge in gebroekersrechte.',
-'rightslogentry' => 'wiezigde de gebroekersrechte veur $1 van $2 nao $3',
-'rightslogentry-autopromote' => 'is autematis gepromoveerdj vanne groep "$2" nao de groep "$3"',
-'rightsnone' => '(gein)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'dees pagina te bekieke',
@@ -2041,10 +2037,6 @@ Haet mèndestes e toepleveldomein, wie beveurbeildj "*.org".<br />
'activeusers-hidesysops' => 'Verberg admins',
'activeusers-noresult' => 'Gein gebroekers gevónje.',
-# Special:Log/newusers
-'newuserlogpage' => 'Logbook nuuj gebroekers',
-'newuserlogpagetext' => 'Hiej ónger saton de nuuj ingesjreve gebroekers.',
-
# Special:ListGroupRights
'listgrouprights' => 'Rechte van gebroekersgróppe',
'listgrouprights-summary' => 'Op dees pazjena sjtaon de gebroekersgróppe in deze wiki besjreve, mit zien biebehurende rechte.
@@ -2137,11 +2129,7 @@ Toekomstige verangeringe aan dees pagina en de biebehurende euverlèkpagina weur
'enotif_mailer' => '{{SITENAME}} notificatiemail',
'enotif_reset' => "Mèrk alle bezochde pazjena's aan.",
-'enotif_newpagetext' => "DIt is 'n nuuj pazjena.",
'enotif_impersonal_salutation' => '{{SITENAME}} gebroeker',
-'changed' => 'verangerd',
-'created' => 'aangemaak',
-'enotif_subject' => 'De {{SITENAME}}pagina $PAGETITLE is $CHANGEDORCREATED door $PAGEEDITOR',
'enotif_lastvisited' => 'Zuug $1 veur al verangeringe saer dien lèste bezeuk.',
'enotif_lastdiff' => 'Zuug $1 om deze wieziging te zeen.',
'enotif_anon_editor' => 'anonieme gebroeker $1',
@@ -2170,6 +2158,8 @@ $UNWATCHURL
Commentaar en wiejer assistentie:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'aangemaak',
+'changed' => 'verangerd',
# Delete
'deletepage' => 'Pagina ewegsjaffe',
@@ -2728,7 +2718,6 @@ Slaon de oetveur op dien eige systeem op, en voeg dae dao nao hiej toe.',
# JavaScriptTest
'javascripttest' => 'Tes JavaScript',
-'javascripttest-disabled' => 'Dees funksje steit oet op deze wiki.',
'javascripttest-title' => 'Veur tes oet veur $1',
'javascripttest-pagetext-noframework' => "Dees pagina is gerizzerveerd veur 't oetveure van JavaScriptteste.",
'javascripttest-pagetext-unknownframework' => 'Ónbekèndje testframework "$1".',
@@ -3658,7 +3647,7 @@ Aafbeildinge waere in häör vollejige resolutie getoeandj. Anger bestandjstypes
'logentry-newusers-create' => "$1 haet 'ne gebroeker aangemaak",
'logentry-newusers-create2' => "$1 haet 'ne gebroeker $3 aangemaak",
'logentry-newusers-autocreate' => 'De gebroeker $1 is autematis aangemaak',
-'newuserlog-byemail' => 'wachwaord is versjik per e-mail',
+'rightsnone' => '(gein)',
# Feedback
'feedback-bugornote' => 'Es se zewied bös óm e technisch perbleem in détail te besjrieve, [$1 rapperteer \'ne bug].
diff --git a/languages/messages/MessagesLij.php b/languages/messages/MessagesLij.php
index b1fe60b7..cf77edcc 100644
--- a/languages/messages/MessagesLij.php
+++ b/languages/messages/MessagesLij.php
@@ -250,6 +250,7 @@ $messages = array(
'newwindow' => "(O s'arve inte 'n âtro barcon)",
'cancel' => 'Scancella',
'moredotdotdot' => 'De ciû...',
+'morenotlisted' => 'Atro...',
'mypage' => 'Paggina',
'mytalk' => 'Discuscioin',
'anontalk' => 'Discuscion pe questo indirisso IP',
@@ -261,7 +262,6 @@ $messages = array(
'qbbrowse' => 'Navvega',
'qbedit' => 'Cangia',
'qbpageoptions' => "Opsioîn de 'sta paggina",
-'qbpageinfo' => 'Informassion inscia paggina',
'qbmyoptions' => 'E mæ paggine',
'qbspecialpages' => 'Pagine speçiä',
'faq' => 'Domande frequenti',
@@ -283,6 +283,7 @@ $messages = array(
'namespaces' => 'Namespaces',
'variants' => 'Diferense',
+'navigation-heading' => 'Menu de navegaçion',
'errorpagetitle' => 'Erô',
'returnto' => 'Torna a $1.',
'tagline' => 'Da {{SITENAME}}',
@@ -458,9 +459,6 @@ A raxon a l'è: ''$2''.",
'virus-unknownscanner' => 'antivirus sconosciuo:',
# Login and logout pages
-'welcomecreation' => "== Benvegnûo, $1! ==
-
-O teu account o l'è stæto creòu bén. No te ascordâ de cangiâ e teu {{SITENAME}}.[[Special:Preferences|preferençe de {{SITENAME}}]].",
'yourname' => 'Nomme',
'yourpassword' => 'Pòula segretta:',
'yourpasswordagain' => 'Riscrivi a pòula segrétta:',
@@ -760,6 +758,9 @@ Legenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a ve
'grouppage-sysop' => '{{ns:project}}:Amministratoî',
+# Special:Log/newusers
+'newuserlogpage' => 'Nêuvi utenti',
+
# User rights log
'rightslog' => "Diritti d'ûtente",
@@ -973,9 +974,6 @@ Ti te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un ut
'listusers-submit' => 'Fanni vedde',
'listusers-noresult' => 'Utente non trovöo.',
-# Special:Log/newusers
-'newuserlogpage' => 'Nêuvi utenti',
-
# Special:ListGroupRights
'listgrouprights-members' => '(Elenco di membri)',
@@ -1013,8 +1011,8 @@ Ti te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un ut
'watching' => 'Inti osservæ speçiâli...',
'unwatching' => 'Scassâ da-i osservæ speçiâli',
-'changed' => 'cangiâ',
'enotif_anon_editor' => 'ûtente anònnimo $1',
+'changed' => 'cangiâ',
# Delete
'deletepage' => 'Scassa a paggina',
@@ -1091,7 +1089,7 @@ $1',
'blanknamespace' => '(Prinçipâ)',
# Contributions
-'contributions' => "Contribussioìn de l'utente",
+'contributions' => 'Contribuçioin {{GENDER:$1|utente}}',
'contributions-title' => 'Contribuçioìn de $1',
'mycontris' => 'Contribuçioin',
'contribsub2' => 'Pe $1 ($2)',
diff --git a/languages/messages/MessagesLiv.php b/languages/messages/MessagesLiv.php
index b6587225..e99297ee 100644
--- a/languages/messages/MessagesLiv.php
+++ b/languages/messages/MessagesLiv.php
@@ -373,6 +373,9 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
'grouppage-sysop' => '{{ns:project}}:AdministrÄtord',
+# Special:Log/newusers
+'newuserlogpage' => 'Kȭlbatijizt lūomiz log',
+
# User rights log
'rightslog' => 'Kȭlbatijiz õigõmt log',
@@ -489,9 +492,6 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
'linksearch' => 'Uļļizt siḑīmõd',
'linksearch-line' => '$1 um sidtõd līedst $2',
-# Special:Log/newusers
-'newuserlogpage' => 'Kȭlbatijizt lūomiz log',
-
# Special:ListGroupRights
'listgrouprights-members' => '(nõtkõmd nimkēra)',
@@ -561,7 +561,7 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
'blanknamespace' => '(Kēratõkst)',
# Contributions
-'contributions' => 'Kȭlbatijiz kubsõtīe',
+'contributions' => '{{GENDER:$1|Kȭlbatijiz}} kubsõtīe',
'contributions-title' => 'Kȭlbatijiz $1 kubsõtīe',
'mycontris' => 'Min kubsõtīed',
'contribsub2' => 'KÈ­lbatiji $1 ($2) pierÄst',
diff --git a/languages/messages/MessagesLmo.php b/languages/messages/MessagesLmo.php
index e1bfd2e9..883f5255 100644
--- a/languages/messages/MessagesLmo.php
+++ b/languages/messages/MessagesLmo.php
@@ -235,7 +235,6 @@ süi titul dai sezziún (JavaScript)',
'qbbrowse' => 'Sföja',
'qbedit' => 'Mudifega',
'qbpageoptions' => 'Opzión de la pagina',
-'qbpageinfo' => 'Infurmazión revard a la pagina',
'qbmyoptions' => 'I mè paginn',
'qbspecialpages' => 'Paginn special',
'faq' => 'FAQ',
@@ -420,10 +419,8 @@ Per piasè, fa raport a 'n'[[Special:ListUsers/sysop|aministradur]], cun la nota
# Login and logout pages
'logouttext' => "'''Adess a sii descuness.'''
-A pudé andà inanz a druvà la {{SITENAME}} in manera anònima, o a pudé [[Special:UserLogin|cunètev anmò]] cun l'istess suranomm o cun un suranomm diferent.
+A pudé andà inanz a druvà la {{SITENAME}} in manera anònima, o a pudé <span class='plainlinks'>[$1 cunètev anmò]</span> cun l'istess suranomm o cun un suranomm diferent.
Tegné cünt che certi paginn pödass che i seguiten a vedess tant 'me se a füdìssuv anmò cuness, fin quand che hii nò vudaa 'l ''cache'' del voster browser.",
-'welcomecreation' => "== Benvegnüü, $1! ==
-'L to cünt l'è staa pruntaa. Desmenteghet mía de mudifegà i to [[Special:Preferences|preferenz de {{SITENAME}}]].",
'yourname' => 'El to suranóm:',
'yourpassword' => "Parola d'urdin",
'yourpasswordagain' => "Mett dent ammò la parola d'urdin",
@@ -726,9 +723,11 @@ Pröa a giuntagh denanz a la tò ricerca ''all:'' per cercà in tücc i namespac
'right-edit' => 'Edita pàgini',
'right-createaccount' => 'Crea cünt de dovratt bej-e növ',
+# Special:Log/newusers
+'newuserlogpage' => 'Rrgister di druvat növ',
+
# User rights log
'rightslog' => 'Dirit di druvat',
-'rightslogentry' => "l'ha mudifegaa $1 dal grüp $2 al grüp $3",
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'mudifega quela pagina chì',
@@ -942,9 +941,6 @@ La descrizión sura la sua [$2 pagina de descrizión del file] l'è mustrada chÃ
# Special:ActiveUsers
'activeusers-from' => 'Fàm vedè i dupradur a partì da:',
-# Special:Log/newusers
-'newuserlogpage' => 'Rrgister di druvat növ',
-
# Special:ListGroupRights
'listgrouprights' => 'Dirit del grüp di druvat',
'listgrouprights-members' => '(Lista di member)',
@@ -975,9 +971,6 @@ i vegnarann segnalaa chichinscì e la pagina la se vedarà cun caràter '''grev'
'watching' => "Giuntà ai pagin da ten d'ögg...",
'unwatching' => "Eliminà dai pagin da ten d'ögg...",
-'enotif_newpagetext' => "Chesta-chí l'è una pàgina növa.",
-'changed' => 'cambiaa',
-'enotif_subject' => 'La pagina $PAGETITLE de {{SITENAME}} l\'è stada $CHANGEDORCREATED da $PAGEEDITOR',
'enotif_lastvisited' => 'Varda $1 per vedè tüt i mudifegh da la tua ültema vìsita.',
'enotif_body' => 'Cara $WATCHINGUSERNAME,
@@ -1002,6 +995,7 @@ Per mudifegà l\'impustazión de la lista di paginn che te tegn d\'ögg, varda
Per fà di cumünicazion de servizzi e per cercà jüt:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'changed' => 'cambiaa',
# Delete
'deletepage' => 'Scancela la pagina',
diff --git a/languages/messages/MessagesLn.php b/languages/messages/MessagesLn.php
index 748594c4..87be9733 100644
--- a/languages/messages/MessagesLn.php
+++ b/languages/messages/MessagesLn.php
@@ -101,7 +101,6 @@ $messages = array(
'qbbrowse' => 'Kolúka',
'qbedit' => 'Kobɔngisa',
'qbpageoptions' => 'Lonkásá óyo',
-'qbpageinfo' => 'Context',
'qbmyoptions' => 'Lonkásá na ngáí',
'qbspecialpages' => 'Nkásá gudi',
'faq' => 'Mitúná Mizóngelaka (MM)',
@@ -238,6 +237,7 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
'viewsource' => 'KomÉ”Ìnisa mosólo',
# Login and logout pages
+'welcomeuser' => 'MbÉ”ÌtÉ› na Wikipedia, $1',
'yourname' => 'Nkómbó ya mosáleli:',
'yourpassword' => 'Banda nayó:',
'yourpasswordagain' => 'Banda naíno:',
@@ -306,6 +306,10 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
'template-protected' => '(na bobáteli)',
'template-semiprotected' => '(na bobáteli ya ndámbo)',
+# Content models
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
# History pages
'viewpagelogs' => 'KomÉ”Ìnisa zuluná ya lonkásá loye',
'currentrev' => 'Lizóngeli na mosálá',
@@ -399,7 +403,7 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
'timezoneregion-pacific' => 'Pasifíki (lombú monÉ›ÌnÉ›)',
'allowemail' => 'Enable mokánda from other users',
'youremail' => 'Mokandá (e-mail) *',
-'username' => 'Nkómbó ya mosáleli :',
+'username' => 'Nkómbó ya mosáleli:',
'yourrealname' => 'nkómbó ya sɔ̂lÉ”Ì',
'yourlanguage' => 'Lokótá',
'email' => 'Mokánda',
@@ -409,6 +413,9 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
'group-sysop-member' => 'Moyángeli',
+# Special:Log/newusers
+'newuserlogpage' => 'Zuluná ya bokeli bwa konti ya mosáleli',
+
# User rights log
'rightslog' => 'Zuluná ya makokí ma basáleli',
@@ -519,9 +526,6 @@ Ezalí listÉ›Ì ya nkásá gudi bizalí na [[Special:SpecialPages|{{int:special
# Special:Categories
'categories' => 'Ndéngé',
-# Special:Log/newusers
-'newuserlogpage' => 'Zuluná ya bokeli bwa konti ya mosáleli',
-
# Email user
'emailuser' => 'Kotíndela yÄ› mÉ›ÌlÉ›',
'defemailsubject' => '{{SITENAME}} mokánda',
diff --git a/languages/messages/MessagesLo.php b/languages/messages/MessagesLo.php
index dbf925c4..7ca5cdea 100644
--- a/languages/messages/MessagesLo.php
+++ b/languages/messages/MessagesLo.php
@@ -345,9 +345,6 @@ $messages = array(
ທ່ານ ສາມາດສືບຕà»à»ˆà»ƒàºŠà»‰ {{SITENAME}} à»àºšàºšàºšà»à»ˆàºªàº°à»àº”ງຊື່, ຫຼື ທ່ານ ສາມາດ ເຊັນເຂົ້າ ອີຠໂດຠຊື່ຜູ້ໃຊ້ ເàºàº»à»ˆàº² ຫຼື ໃà»à»ˆ àºà»à»ˆà»„ດ້.
àºàº°àº¥àº¸àº™àº² ຮັບຊາບວ່າ ບາງໜ້າ ອາດຈະສືບຕà»à»ˆ ສະà»àº”ງ ຄືວ່າ ທ່ານ àºàº±àº‡à»€àºŠàº±àº™à»€àº‚ົ້າຢູ່ ຈົນàºàº§à»ˆàº² ທ່ານ ຂà»à»‰àº¡àº¹àº™àºšàº±àº™àº—ຶàºàºŠàº»à»ˆàº§àº„າວ ໃນ ໂປຣà»àºàº£àº¡àº—່ອງເວັບ ຂອງ ທ່ານ ຈະຖືàºàº¥àº¶àºš.",
-'welcomecreation' => '== àºàº´àº™àº”ີຕ້ອນຮັບ, $1! ==
-
-ບັນຊີ ຂອງທ່ານ ຖືàºàºªà»‰àº²àº‡àº‚ຶ້ນà»àº¥à»‰àº§. ຢ່າລືມ ຕັ້ງຄ່າ ທ່ານ ຢູ່ {{SITENAME}}.',
'yourname' => 'ຊື່ຜູ້ໃຊ້',
'yourpassword' => 'ລະຫັດຜ່ານ',
'yourpasswordagain' => 'ພິມລະຫັດຜ່ານອີàº',
@@ -538,6 +535,10 @@ $messages = array(
# User rights
'editinguser' => 'ຜູ້ໃຊ້ <b>$1</b> ພວມດັດà»àºà»‰ ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])',
+# Special:Log/newusers
+'newuserlogpage' => 'ບັນທຶàºàºàº²àº™àºªà»‰àº²àº‡àºšàº±àº™àºŠàºµàºœàº¹à»‰à»ƒàºŠà»‰',
+'newuserlogpagetext' => 'ນີ້à»àº¡à»ˆàº™ ບັນທຶàºàºàº²àº™àºªà»‰àº²àº‡ ບັນຊີຜູ້ໃຊ້ໃà»à»ˆ',
+
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|àºàº²àº™àº›à»ˆàº½àº™à»àº›àº‡|àºàº²àº™àº›à»ˆàº½àº™à»àº›àº‡}}',
'recentchanges' => 'àºàº²àº™àº”ັດà»àºà»‰àº«àº¼à»‰àº²àºªàº¸àº”',
@@ -686,10 +687,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Special:ListUsers
'listusers-submit' => 'ສະà»àº”ງ',
-# Special:Log/newusers
-'newuserlogpage' => 'ບັນທຶàºàºàº²àº™àºªà»‰àº²àº‡àºšàº±àº™àºŠàºµàºœàº¹à»‰à»ƒàºŠà»‰',
-'newuserlogpagetext' => 'ນີ້à»àº¡à»ˆàº™ ບັນທຶàºàºàº²àº™àºªà»‰àº²àº‡ ບັນຊີຜູ້ໃຊ້ໃà»à»ˆ',
-
# Email user
'emailuser' => 'ສົ່ງອີເມລ ຫາ ຜູ້ໃຊ້ນີ້',
'emailpage' => 'ສົ່ງອີເມລ ຫາ ຜູ້ໃຊ້',
@@ -724,10 +721,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'watching' => 'ພວມຕິດຕາມ...',
'unwatching' => 'ພວມເຊົາຕິດຕາມ...',
-'enotif_newpagetext' => 'ນີ້à»àº¡à»ˆàº™à»œà»‰àº²à»ƒà»à»ˆ.',
-'changed' => 'ປ່ຽນà»àº¥à»‰àº§',
-'created' => 'ສ້າງà»àº¥à»‰àº§',
'enotif_lastvisited' => 'ເບິ່ງ $1 ເພື່ອ ທຸàºà»†àºàº²àº™àº›à»ˆàº½àº™à»àº›àº‡ ຕັ້ງà»àº•à»ˆà»€àº—ື່ອສຸດທ້າຠທີ່ ທ່ານເຂົ້າຫາ.',
+'created' => 'ສ້າງà»àº¥à»‰àº§',
+'changed' => 'ປ່ຽນà»àº¥à»‰àº§',
# Delete
'confirm' => 'ຢືນຢັນ',
diff --git a/languages/messages/MessagesLoz.php b/languages/messages/MessagesLoz.php
index 33048e3f..06299138 100644
--- a/languages/messages/MessagesLoz.php
+++ b/languages/messages/MessagesLoz.php
@@ -124,7 +124,6 @@ $messages = array(
'qbbrowse' => 'Nepile',
'qbedit' => "Hloli ye ng'i",
'qbpageoptions' => 'Bye petulo',
-'qbpageinfo' => 'Petulo tuto',
'qbmyoptions' => 'Zwa petulona',
'qbspecialpages' => 'Petulo zwenti',
'faq' => 'Alabile',
@@ -505,7 +504,6 @@ Informasi: (bye) = petuho a nca selt,
# User rights log
'rightslog' => 'Desu di petuhoni kwa sebelu',
-'rightsnone' => '(ni)',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|petuho|petuho}}',
@@ -734,10 +732,9 @@ A sa afi kulobala di zwa mukoloko di kentezi, tampi \"ngambu kentezi\".",
'watching' => 'Kentezi...',
'unwatching' => 'Dikentezi...',
-'enotif_newpagetext' => 'Bye sa nca petulo.',
'enotif_impersonal_salutation' => '{{SITENAME}} sebelu',
-'changed' => 'petuhoni',
'created' => 'hlolini',
+'changed' => 'petuhoni',
# Delete
'deletepage' => 'Afi kulobala petulo',
@@ -1082,4 +1079,7 @@ Xete ling'ki kwa lina sa konsidisize desepo. Petulo dimedi inlinenikusize.",
# Special:SpecialPages
'specialpages' => 'Petulo zwenti',
+# New logging system
+'rightsnone' => '(ni)',
+
);
diff --git a/languages/messages/MessagesLt.php b/languages/messages/MessagesLt.php
index 9276f460..bc7f5884 100644
--- a/languages/messages/MessagesLt.php
+++ b/languages/messages/MessagesLt.php
@@ -316,6 +316,7 @@ $messages = array(
'newwindow' => '(atsidaro naujame lange)',
'cancel' => 'Atšaukti',
'moredotdotdot' => 'Daugiau...',
+'morenotlisted' => 'Daugiau nÄ—ra',
'mypage' => 'Naudotojo puslapis',
'mytalk' => 'Mano aptarimas',
'anontalk' => 'Å io IP aptarimas',
@@ -327,7 +328,6 @@ $messages = array(
'qbbrowse' => 'Naršymas',
'qbedit' => 'Taisyti',
'qbpageoptions' => 'Å is puslapis',
-'qbpageinfo' => 'Kontekstas',
'qbmyoptions' => 'Mano puslapiai',
'qbspecialpages' => 'Specialieji puslapiai',
'faq' => 'DUK',
@@ -350,6 +350,7 @@ $messages = array(
'namespaces' => 'Vardų sritys',
'variants' => 'Variantai',
+'navigation-heading' => 'Naršymo meniu',
'errorpagetitle' => 'Klaida',
'returnto' => 'Grįžti į $1.',
'tagline' => 'IÅ¡ {{SITENAME}}.',
@@ -589,11 +590,11 @@ Ją užrakinęs administratorius pateikė šį paaiškinimą: "$3".',
# Login and logout pages
'logouttext' => "'''Dabar jūs esate atsijungęs.'''
-Galite toliau naudoti {{SITENAME}} anonimiÅ¡kai arba [[Special:UserLogin|prisijunkite]] iÅ¡ naujo tuo paÄiu ar kitu naudotoju.
+Galite toliau naudoti {{SITENAME}} anonimiÅ¡kai arba <span class='plainlinks'>[$1 prisijunkite]</span> iÅ¡ naujo tuo paÄiu ar kitu naudotoju.
Pastaba: kai kuriuose puslapiuose ir toliau gali rodyti, kad esate prisijungęs iki tol, kol išvalysite savo naršyklės podėlį.",
-'welcomecreation' => '== Sveiki, $1! ==
-
-Jūsų paskyra buvo sukurta. Nepamirškite pakeisti savo [[Special:Preferences|{{SITENAME}} nustatymų]].',
+'welcomeuser' => 'Sveiki, $1 !',
+'welcomecreation-msg' => 'Jūsų paskyra buvo sukurta.
+Nepamirškite pakeisti savo [[Special:Preferences|{{SITENAME}} nustatymų]].',
'yourname' => 'Naudotojo vardas:',
'yourpassword' => 'Slaptažodis:',
'yourpasswordagain' => 'Pakartokite slaptažodį:',
@@ -616,7 +617,7 @@ Jūsų paskyra buvo sukurta. Nepamirškite pakeisti savo [[Special:Preferences|{
'gotaccount' => "Jau turite paskyrÄ…? '''$1'''.",
'gotaccountlink' => 'Prisijunkite',
'userlogin-resetlink' => 'Pamiršote savo prisijungimo duomenis?',
-'createaccountmail' => 'el. paštu',
+'createaccountmail' => 'Naudokite laikiną atsitiktinį slaptažodį ir nusiųskite jį į elektroninį paštą, nurodytą žemiau.',
'createaccountreason' => 'Priežastis:',
'badretype' => 'Įvesti slaptažodžiai nesutampa.',
'userexists' => 'Įvestasis naudotojo vardas jau naudojamas.
@@ -692,6 +693,7 @@ Palaukite prieš bandant vėl.',
# Email sending
'php-mail-error-unknown' => 'Nežinoma klaida PHP mail() funkcijoje',
'user-mail-no-addy' => 'Bandyta išsiųsti elektroninį laišką be el. pašto adreso.',
+'user-mail-no-body' => 'MÄ—ginta siųsti tuÅ¡Äia ar pernelyg trumpÄ… E-paÅ¡to žinutÄ—.',
# Change password dialog
'resetpass' => 'Keisti slaptažodį',
@@ -746,6 +748,7 @@ Laikinas slaptažodis: $2',
'changeemail-oldemail' => 'Dabartinis el. pašto adresas:',
'changeemail-newemail' => 'Naujas el. pašto adresas:',
'changeemail-none' => '(nÄ—ra)',
+'changeemail-password' => 'Jūsų {{SITENAME}} slaptažodis:',
'changeemail-submit' => 'Keisti el. pašto adresą',
'changeemail-cancel' => 'Atšaukti',
@@ -917,7 +920,6 @@ Naujausias įrašas žurnale yra pateiktas žemiau:",
'template-semiprotected' => '(pusiau apsaugotas)',
'hiddencategories' => 'Šis puslapis priklauso $1 {{PLURAL:$1|paslėptai kategorijai|paslėptoms kategorijoms|paslėptų kategorijų}}:',
'edittools' => '<!-- Šis tekstas bus rodomas po redagavimo ir įkėlimo formomis. -->',
-'nocreatetitle' => 'Puslapių kūrimas apribotas',
'nocreatetext' => '{{SITENAME}} apribojo galimybÄ™ kurti naujus puslapius.
Jūs galite grįžti ir redaguoti jau esantį puslapį, arba [[Special:UserLogin|prisijungti arba sukurti paskyrą]].',
'nocreate-loggedin' => 'JÅ«s neturite teisÄ—s kurti puslapius.',
@@ -942,6 +944,14 @@ GreiÄiausiai jis yra iÅ¡trintas.',
'edit-already-exists' => 'Negalima sukurti naujo puslapio.
Jis jau egzistuoja.',
'defaultmessagetext' => 'Numatytasis pranešimo tekstas',
+'invalid-content-data' => 'Neleistinas turinys.',
+'content-not-allowed-here' => 'Turinys "$1" puslapyje [[$2]] nÄ—ra leistinas.',
+
+# Content models
+'content-model-wikitext' => 'wikitekstas',
+'content-model-text' => 'paprastasis tekstas',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Ä®spÄ—jimas: Å iame puslapyje yra per daug užtrunkanÄių analizatoriaus funkcijų Å¡aukinių.
@@ -1449,12 +1459,13 @@ teisÄ—s",
'right-sendemail' => 'Siųsti el. laišką kitiems naudotojams',
'right-passwordreset' => 'Peržiūrėti slaptažodžio pakeitimo e-mail laiškus',
+# Special:Log/newusers
+'newuserlogpage' => 'PrisiregistravÄ™ naudotojai',
+'newuserlogpagetext' => 'Tai naudotojų kūrimo sąrašas.',
+
# User rights log
'rightslog' => 'Naudotojų teisių pakeitimai',
'rightslogtext' => 'Pateikiamas naudotojų teisių pakeitimų sąrašas.',
-'rightslogentry' => 'pakeista $1 grupės narystė iš $2 į $3',
-'rightslogentry-autopromote' => 'buvo automatiškai paaukštintas iš $2 į $3',
-'rightsnone' => '(jokių)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'skaityti šį puslapį',
@@ -1678,6 +1689,7 @@ Prašome susisiekti su [[Special:ListUsers/sysop|sistemos administratoriumi]].',
'backend-fail-notsame' => 'Jau egzistuoja neidentiškas failas $1.',
'backend-fail-invalidpath' => '$1 yra neteisinga saugojimo nuoroda.',
'backend-fail-delete' => 'Negalima panaikinti failo $1.',
+'backend-fail-describe' => 'Nepavyko pakeisti failo metaduomenis "$1".',
'backend-fail-alreadyexists' => 'Failas $1 jau egzistuoja.',
'backend-fail-store' => 'Negalima išsaugoti failo $1 kaip $2.',
'backend-fail-copy' => 'Negalima nukopijuoti failo $1 į $2.',
@@ -2065,10 +2077,6 @@ Palaikomi protokolai: <code>$1</code> (nei vieno iš jų nenurodykite paieškoje
'activeusers-hidesysops' => 'SlÄ—pti administratorius',
'activeusers-noresult' => 'Nerasta jokių naudotojų.',
-# Special:Log/newusers
-'newuserlogpage' => 'PrisiregistravÄ™ naudotojai',
-'newuserlogpagetext' => 'Tai naudotojų kūrimo sąrašas.',
-
# Special:ListGroupRights
'listgrouprights' => 'Naudotojų grupių teisės',
'listgrouprights-summary' => 'Žemiau pateiktas naudotojų grupių, apibrėžtų šioje wiki, ir su jomis susijusių teisių sąrašas.
@@ -2164,11 +2172,17 @@ taip pat bus '''paryškinti''' [[Special:RecentChanges|naujausių keitimų sąra
'enotif_mailer' => '{{SITENAME}} Pranešimų sistema',
'enotif_reset' => 'Pažymėti visus puslapius kaip aplankytus',
-'enotif_newpagetext' => 'Tai naujas puslapis.',
'enotif_impersonal_salutation' => '{{SITENAME}} naudotojau',
-'changed' => 'pakeitÄ—',
-'created' => 'sukurÄ—',
-'enotif_subject' => '{{SITENAME}} projekte $PAGEEDITOR $CHANGEDORCREATED $PAGETITLE',
+'enotif_subject_deleted' => '{{GENDER:$2|Naudotojas}} ištrynė puslapį $1, priklausantį projektui {{SITENAME}}',
+'enotif_subject_created' => '{{GENDER:$2|Naudotojas}} sukūrė puslapį $1, priklausantį projektui {{SITENAME}}',
+'enotif_subject_moved' => '{{GENDER:$2|Naudotojas}} pervardino puslapį $1, priklausantį projektui {{SITENAME}}',
+'enotif_subject_restored' => '{{GENDER:$2|Naudotojas}} atstatė puslapį $1, priklausantį projektui {{SITENAME}}',
+'enotif_subject_changed' => '{{GENDER:$2|Naudotojas}} redagavo puslapį $1, priklausantį projektui {{SITENAME}}',
+'enotif_body_intro_deleted' => '$PAGEEDITDATE {{GENDER:$2|Naudotojas}} ištrynė puslapį $1, priklausantį projektui {{SITENAME}}, žr. $3.',
+'enotif_body_intro_created' => '$PAGEEDITDATE {{GENDER:$2|Naudotojas}} sukūrė puslapį $1, priklausantį projektui {{SITENAME}}. Dabartinė versija matoma $3.',
+'enotif_body_intro_moved' => '$PAGEEDITDATE {{GENDER:$2|Naudotojas}} pervardino puslapį $1, priklausantį projektui {{SITENAME}}. Dabartinė versija matoma $3.',
+'enotif_body_intro_restored' => '$PAGEEDITDATE {{GENDER:$2|Naudotojas}} atstatė puslapį $1, priklausantį projektui {{SITENAME}}. Dabartinė versija matoma $3.',
+'enotif_body_intro_changed' => '$PAGEEDITDATE {{GENDER:$2|Naudotojas}} redagavo puslapį $1, priklausantį projektui {{SITENAME}}. Dabartinė versija matoma $3.',
'enotif_lastvisited' => 'Užeikite į $1, jei norite matyti pakeitimus nuo paskutiniojo apsilankymo.',
'enotif_lastdiff' => 'Užeikite į $1, jei norite pamatyti šį pakeitimą.',
'enotif_anon_editor' => 'anoniminis naudotojas $1',
@@ -2202,6 +2216,8 @@ $UNWATCHURL
Atsiliepimai ir pagalba:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'sukurÄ—',
+'changed' => 'pakeitÄ—',
# Delete
'deletepage' => 'Trinti puslapį',
@@ -2270,6 +2286,8 @@ Dabar veikianÄių puslapių apsaugų sÄ…raÅ¡Ä… rasite [[Special:ProtectedPages|
'prot_1movedto2' => '[[$1]] pervadintas į [[$2]]',
'protect-badnamespace-title' => 'Neapsaugota vardų sritis',
'protect-badnamespace-text' => 'Puslapiai šioje vardų srityje negali būti apsaugoti.',
+'protect-norestrictiontypes-text' => 'Šis puslapis negali būti apsaugotas nes neturi galimų apribojimų tipų.',
+'protect-norestrictiontypes-title' => 'Neapsaugomas puslapis',
'protect-legend' => 'Užrakinimo patvirtinimas',
'protectcomment' => 'Priežastis:',
'protectexpiry' => 'Baigia galioti:',
@@ -2791,7 +2809,6 @@ IÅ¡saugokite jį savo kompiuteryje ir įkelkite jį Äia.',
# JavaScriptTest
'javascripttest' => 'JavaScript testavimas',
-'javascripttest-disabled' => 'Ši funkcija šiame wiki projekte neįjungta.',
'javascripttest-title' => 'Vykdomas $1 testavimas',
'javascripttest-pagetext-noframework' => 'Å is puslapis yra skirtas vykdyti JavaScript testavimus.',
'javascripttest-pagetext-unknownframework' => 'Nežinoma "$1" testavimo struktūra.',
@@ -2913,6 +2930,7 @@ Leidžia pridėti atmetimo priežastį komentaruose',
'pageinfo-default-sort' => 'Numatytasis rūšiavimo raktas',
'pageinfo-length' => 'Puslapio ilgis (baitais)',
'pageinfo-article-id' => 'Puslapio ID',
+'pageinfo-language' => 'Puslapio turinio kalba',
'pageinfo-robot-policy' => 'Paieškos variklio būsena',
'pageinfo-robot-index' => 'Indeksuotas',
'pageinfo-robot-noindex' => 'Neindeksuotas',
@@ -2929,6 +2947,16 @@ Leidžia pridėti atmetimo priežastį komentaruose',
'pageinfo-authors' => 'Skirtingų autorių skaiÄius',
'pageinfo-recent-edits' => 'Paskutinųjų keitimų skaiÄius (per $1 laikotarpį)',
'pageinfo-recent-authors' => 'Pastarųjų skirtingų redaguotojų skaiÄius',
+'pageinfo-toolboxlink' => 'Puslapio informacija',
+'pageinfo-redirectsto' => 'Nukreipimai į',
+'pageinfo-redirectsto-info' => 'informacija',
+'pageinfo-contentpage' => 'Priskirtas turinio puslapiams',
+'pageinfo-contentpage-yes' => 'Taip',
+'pageinfo-protect-cascading-yes' => 'Taip',
+'pageinfo-category-info' => 'Informacija apie kategorijÄ…',
+'pageinfo-category-pages' => 'Puslapių skaiÄius',
+'pageinfo-category-subcats' => 'Dukterinių kategorijų skaiÄius',
+'pageinfo-category-files' => 'Failų skaiÄius',
# Skin names
'skinname-standard' => 'KlasikinÄ—',
@@ -2951,6 +2979,8 @@ Leidžia pridėti atmetimo priežastį komentaruose',
'markedaspatrollederror' => 'Negalima pažymėti, kad patikrinta',
'markedaspatrollederrortext' => 'Jums reikia nurodyti versiją, kurią pažymėti kaip patikrintą.',
'markedaspatrollederror-noautopatrol' => 'Jums neleidžiama pažymėti savo paties keitimų kaip patikrintų.',
+'markedaspatrollednotify' => '$1 keitimas pažymėtas patikrintu.',
+'markedaspatrollederrornotify' => 'Nepavyko pažymėti kaip patikrinto.',
# Patrol log
'patrol-log-page' => 'Patikrinimų sąrašas',
@@ -2983,6 +3013,7 @@ Jį paleidus jūsų sistema gali būti pažeista.",
'file-info-size-pages' => '$1 × $2 taškų, failo dydis: $3, MIME tipas: $4, $5 {{PLURAL:$5|page|pages}}',
'file-nohires' => 'Geresnė raiška negalima.',
'svg-long-desc' => 'SVG failas, formaliai $1 × $2 taškų, failo dydis: $3',
+'svg-long-error' => 'Neleistinas SVG failas: $1',
'show-big-image' => 'Pilna raiška',
'show-big-image-preview' => 'Sumažintos iliustracijos dydis: $1 .',
'show-big-image-other' => '{{PLURAL:$2|Kita rezoliucija|Kitos $2 rezoliucijos|Kitų $2 rezoliucijų}}: $1 .',
@@ -3011,6 +3042,7 @@ Jį paleidus jūsų sistema gali būti pažeista.",
'hours' => '{{PLURAL:$1|$1 valandą|$1 valandas|$1 valandų}}',
'days' => '{{PLURAL:$1|$1 dieną|$1 dienas|$1 dienų}}',
'ago' => 'prieš $1',
+'just-now' => 'tik dabar',
# Bad image list
'bad_image_list' => 'Formatas yra toks:
@@ -3623,6 +3655,7 @@ Jūs taip pat galite [[Special:EditWatchlist|naudoti standartinį redaktorių]].
'version-license' => 'Licencija',
'version-poweredby-credits' => "Šis projektas naudoja '''[//www.mediawiki.org/ MediaWiki]''', autorystės teisės © 2001-$1 $2.",
'version-poweredby-others' => 'kiti',
+'version-credits-summary' => 'Už indėlį kuriant [[Special:Version|MediaWiki]] dėkojame',
'version-license-info' => 'MediaWiki yra nemokama programinė įranga; galite ją platinti ir/arba modifikuoti pagal GNU General Public License, kurią publikuoja Free Software Foundation; taikoma 2-oji licenzijos versija arba (Jūsų pasirinkimu) bet kuri vėlesnė versija.
MediaWiki yra platinama su viltimi, kad ji bus naudinga, bet BE JOKIOS GARANTIJOS; be jokios numanomos PARDAVIMO arba TINKAMUMO TAM TIKRAM TIKSLUI garantijos. Daugiau informacijos galite sužinoti GNU General Public License.
@@ -3765,8 +3798,12 @@ Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogi
'logentry-newusers-newusers' => '$1 sukūrė naudotojo paskyrą',
'logentry-newusers-create' => '$1 sukūrė naudotojo paskyrą',
'logentry-newusers-create2' => '$1 sukūrė naudotojo paskyrą $3',
+'logentry-newusers-byemail' => 'Naudotojas $1 sukūrė paskyrą $3, slaptažodis išsiųstas E-paštu.',
'logentry-newusers-autocreate' => 'Paskyra $1 buvo sukurta automatiškai',
-'newuserlog-byemail' => 'slaptažodis nusiųstas elektroniniu paštu',
+'logentry-rights-rights' => '$1 pakeista narystė grupėje $3 iš $4 į $5',
+'logentry-rights-rights-legacy' => '$1 pakeista narystÄ— grupÄ—je $3',
+'logentry-rights-autopromote' => '$1 buvo automatiškai pervestas iš $4 į $5',
+'rightsnone' => '(jokių)',
# Feedback
'feedback-bugornote' => 'Jei jūs esate pasirengę aprašyti techninę problemą išsamiau, [$1 praneškite apie programinę klaidą].
diff --git a/languages/messages/MessagesLtg.php b/languages/messages/MessagesLtg.php
index 922ac7d8..751e7b47 100644
--- a/languages/messages/MessagesLtg.php
+++ b/languages/messages/MessagesLtg.php
@@ -453,9 +453,11 @@ n = nasvareigs lobuojums.',
'right-upload_by_url' => 'Īsyuteit failu nu URL adresa',
'right-delete' => 'Iztreit puslopys',
+# Special:Log/newusers
+'newuserlogpage' => 'Jaunūs lītuotuoju registrs',
+
# User rights log
'rightslog' => 'Lītuotuoju tīseibu registrs',
-'rightsnone' => '(navÄ)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'skaiteit itū puslopu',
@@ -589,9 +591,6 @@ Lopys, kas ir tovÄ [[Special:Watchlist|puorraugamÅ«s rokstu sarokstÄ]] ir '''r
# Special:ListUsers
'listusers-submit' => 'Paruodeit',
-# Special:Log/newusers
-'newuserlogpage' => 'Jaunūs lītuotuoju registrs',
-
# Special:ListGroupRights
'listgrouprights-members' => '(dalinīku saroksts)',
'listgrouprights-addgroup' => 'Dalikt {{PLURAL:$2|grupu|grupys}}: $1',
@@ -902,4 +901,7 @@ Puorejī lauki, piec nūklusiejuma, byus nūglobuoti.
# Special:SpecialPages
'specialpages' => 'Specialuos puslopys',
+# New logging system
+'rightsnone' => '(navÄ)',
+
);
diff --git a/languages/messages/MessagesLus.php b/languages/messages/MessagesLus.php
index c09329eb..f895dfe7 100644
--- a/languages/messages/MessagesLus.php
+++ b/languages/messages/MessagesLus.php
@@ -145,6 +145,7 @@ $messages = array(
'newwindow' => '(Tukverh tharah a inhawng ang)',
'cancel' => 'Sûtna',
'moredotdotdot' => 'Chhunzawmna...',
+'morenotlisted' => 'Tarlan loh dang...',
'mypage' => 'Phêk',
'mytalk' => 'Sawihona',
'anontalk' => 'He chenhmun-IP tana sawihona',
@@ -156,7 +157,6 @@ $messages = array(
'qbbrowse' => 'Fangvêl rawh',
'qbedit' => 'Siamá¹­hatna',
'qbpageoptions' => 'He phêk hi',
-'qbpageinfo' => 'Thukhawchang',
'qbmyoptions' => 'Ka phêkte',
'qbspecialpages' => 'Phêk vohbîkte',
'faq' => 'Zawhzin',
@@ -179,6 +179,7 @@ $messages = array(
'namespaces' => 'Hminghmun',
'variants' => 'Zedang',
+'navigation-heading' => 'Fankualna',
'errorpagetitle' => 'Dik lo',
'returnto' => '$1 phekah kir leh rawh.',
'tagline' => '{{SITENAME}} aá¹­angin',
@@ -400,11 +401,11 @@ $2',
# Login and logout pages
'logouttext' => "'''I chhuak fel ta.'''
-Inziaklût kher lovin {{SITENAME}} hi i hmang chhunzawm thei ang, a nih loh vëk pawhin hmangtu hming pangngai emaw, a hming dang emawin [[Special:UserLogin|lût leh]] thei ang.
+Inziaklût kher lovin {{SITENAME}} hi i hmang chhunzawm thei ang, a nih loh vëk pawhin hmangtu hming pangngai emaw, a hming dang emawin <span class='plainlinks'>[$1 lût leh]</span> thei ang.
I fangtu cache i thenfai hma chu phêk ţhenkhat intar lang a awm reng mai thei, i la chhuak lo emaw tih mai tùrin.",
-'welcomecreation' => '==Kan lo lawm a che, $1!==
-I siangchan siam a ni ta.
-I [[Special:Preferences|{{SITENAME}}duhdàn]] siam danglam theihnghilh suh ang che.',
+'welcomeuser' => 'Chibai, $1!',
+'welcomecreation-msg' => 'I siangchan siam fel a ni ta.
+[[Special:Preferences|{{SITENAME}}-a i duhphung]] thlâk theihnghilh suh ang che.',
'yourname' => 'Hmangtuhming:',
'yourpassword' => 'Thurûk:',
'yourpasswordagain' => 'Thurûk ziak nawn leh rawh le:',
@@ -523,6 +524,7 @@ Thurûk lailâwk: $2',
'changeemail-oldemail' => 'Tùna i e-chenhmun:',
'changeemail-newemail' => 'E-chenhmun thar:',
'changeemail-none' => '(pakhat mah)',
+'changeemail-password' => 'I {{SITENAME}} thurûk:',
'changeemail-submit' => 'E-chenhmun thlâk rawh',
'changeemail-cancel' => 'Sûtna',
@@ -621,7 +623,6 @@ I ràwn tùrin siam danglamna chanchin ziaka kan dahţhat thạr ber a hnuaiah k
'template-protected' => '(vènhim)',
'template-semiprotected' => '(hual)',
'hiddencategories' => 'He phêk hi {{PLURAL:$1| pawl thuhrûk 1|pawl thuhrûk $1}}-a tel a ni.',
-'nocreatetitle' => 'Phêk siam theih chin bithliah',
'nocreate-loggedin' => 'Phêk thar siam phalna i nei lo.',
'sectioneditnotsupported-title' => 'Hlawm siamţhat bing theih loh',
'sectioneditnotsupported-text' => 'He phêkah hian hlawm siamţhat bing theih a ni lo.',
@@ -641,6 +642,13 @@ Nuaibo a ni tawh a nih hmèl.',
'edit-already-exists' => 'Phêk thar siam theih a ni lo.
A awm tawh sa.',
'defaultmessagetext' => 'Thuthawn tùr ziahsa',
+'invalid-content-data' => 'Kentel phal loh thil',
+
+# Content models
+'content-model-wikitext' => 'wikithü',
+'content-model-text' => 'thutluang',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'post-expand-template-inclusion-warning' => "'''Vaukhanna:''' Siamsa telh a lian leh lutuk.
@@ -970,6 +978,10 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
'right-hideuser' => 'Hmangtu hming dangbet rawh, vantlang laka thupin',
'right-unblockself' => 'Mahnia dalna inphelh',
+# Special:Log/newusers
+'newuserlogpage' => 'Hmangtu siamna chanchin-ziak',
+'newuserlogpagetext' => 'Hei hi hmangtu siangchan siam chhinchhiahna a ni.',
+
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'he phêk hi chhiar rawh',
'action-edit' => 'phek siamá¹­hat',
@@ -1378,10 +1390,6 @@ Hetah hian [[Special:UnusedCategories|pawl hman lohho]] pholan tel a ni lo.
'activeusers-hidesysops' => 'Roreltu thupna',
'activeusers-noresult' => 'Hmangtu awm lo.',
-# Special:Log/newusers
-'newuserlogpage' => 'Hmangtu siamna chanchin-ziak',
-'newuserlogpagetext' => 'Hei hi hmangtu siangchan siam chhinchhiahna a ni.',
-
# Special:ListGroupRights
'listgrouprights' => 'Hmangtu pawl dikna-chanvote',
'listgrouprights-key' => '* <span class="listgrouprights-granted">Dikna-chanvo phalsak</span>
@@ -1440,14 +1448,12 @@ Hetah hian [[Special:UnusedCategories|pawl hman lohho]] pholan tel a ni lo.
'watchlist-options' => 'Ralvèn duhdàn',
'enotif_reset' => 'Phêk zawng zawng tlawh tawh vek angin chhinchhiah rawh.',
-'enotif_newpagetext' => 'Hei hi phêk thar a ni.',
'enotif_impersonal_salutation' => '{{SITENAME}} hmangtu',
-'changed' => 'tihdanglam a ni ta',
-'created' => 'siam a ni ta',
-'enotif_subject' => '{{SITENAME}} phêk $PAGETITLE tih hi $CHANGEDORCREATED, $PAGEEDITOR bultum a ni.',
'enotif_lastvisited' => 'I tlawh hnuhnùn ber hnu lama tihdanglam zawng zawng en i duh chuan $1 en rawh.',
'enotif_lastdiff' => 'Hë tihdanglamna hi en tùrin $1 thlír rawh.',
'enotif_anon_editor' => 'hmangtu hriat loh $1',
+'created' => 'siam a ni ta',
+'changed' => 'tihdanglam a ni ta',
# Delete
'deletepage' => 'Hë phêk hi paih rawh',
@@ -1565,7 +1571,7 @@ $2-in a awmphung ngäiah a dahlêt leh.',
'blanknamespace' => '(Phekpui)',
# Contributions
-'contributions' => 'Hmangtu kutthawhnate',
+'contributions' => '{{GENDER:$1|Hmangtu}} kutthawhnate',
'contributions-title' => '$1 kutthawhnate',
'mycontris' => 'Kutthawhnate',
'contribsub2' => '$1 tan ($2) .',
@@ -1949,7 +1955,6 @@ A bak zawng chu thuhrûk sa vek a ni ang.
'logentry-newusers-create' => '$1 hian hmangtu siangchan a siam.',
'logentry-newusers-create2' => '$1 hian hmangtu siangchan $3 a siam.',
'logentry-newusers-autocreate' => 'Siangchan $1 hi amahin a insiam.',
-'newuserlog-byemail' => 'thurûk e-lehkha hmanga thawn a ni.',
# Feedback
'feedback-subject' => 'Thupui:',
diff --git a/languages/messages/MessagesLv.php b/languages/messages/MessagesLv.php
index 155ddbd1..c20908b0 100644
--- a/languages/messages/MessagesLv.php
+++ b/languages/messages/MessagesLv.php
@@ -195,7 +195,6 @@ $messages = array(
'qbbrowse' => 'NavigÄcija',
'qbedit' => 'Izmainīšana',
'qbpageoptions' => 'Å Ä« lapa',
-'qbpageinfo' => 'Konteksts',
'qbmyoptions' => 'Manas lapas',
'qbspecialpages' => 'ĪpaÅ¡Äs lapas',
'faq' => 'BUJ',
@@ -218,6 +217,7 @@ $messages = array(
'namespaces' => 'VÄrdtelpas',
'variants' => 'Varianti',
+'navigation-heading' => 'NavigÄcijas izvÄ“lne',
'errorpagetitle' => 'Kļūda',
'returnto' => 'Atgriezties: $1.',
'tagline' => "No ''{{grammar:ģenitīvs|{{SITENAME}}}}''",
@@ -431,11 +431,9 @@ NorÄdÄ«tais iemesls bija ''$2''.",
# Login and logout pages
'logouttext' => "'''Tu esi izgÄjis no {{grammar:Ä£enitÄ«vs|{{SITENAME}}}}.'''
-Vari turpinÄt to izmantot anonÄ«mi, vari [[Special:UserLogin|atgriezties]] kÄ cits lietotÄjs vai varbÅ«t tas pats.
+Vari turpinÄt to izmantot anonÄ«mi, vari <span class='plainlinks'>[$1 atgriezties]</span> kÄ cits lietotÄjs vai varbÅ«t tas pats.
Å…em vÄ“rÄ, ka arÄ« pÄ“c izieÅ¡anas, dažas lapas var tikt parÄdÄ«tas tÄ, it kÄ tu vÄ“l bÅ«tu iekÅ¡Ä, lÄ«dz tiks iztÄ«rÄ«ta pÄrlÅ«ka keÅ¡atmiņa.",
-'welcomecreation' => '== Laipni lūdzam, $1! ==
-
-Tavs lietotÄja konts ir izveidots. Neaizmirsti, ka ir iespÄ“jams mainÄ«t [[Special:Preferences|{{grammar:Ä£enitÄ«vs|{{SITENAME}}}} izmantoÅ¡anas izvÄ“les]].',
+'welcomeuser' => 'Laipni lūgts, $1!',
'yourname' => 'Tavs lietotÄjvÄrds',
'yourpassword' => 'Tava parole:',
'yourpasswordagain' => 'AtkÄrto paroli',
@@ -458,7 +456,7 @@ Tavs lietotÄja konts ir izveidots. Neaizmirsti, ka ir iespÄ“jams mainÄ«t [[Spec
'gotaccount' => "Tev jau ir lietotÄjvÄrds? '''$1'''!",
'gotaccountlink' => 'Dodies iekÅ¡Ä',
'userlogin-resetlink' => 'Esat aizmirsis savu pieslÄ“gÅ¡anÄs informÄciju?',
-'createaccountmail' => 'Pa e-pastu',
+'createaccountmail' => 'pa e-pastu',
'createaccountreason' => 'Iemesls:',
'badretype' => 'Tevis ievadÄ«tÄs paroles nesakrÄ«t.',
'userexists' => 'IevadÄ«tais lietotÄjvÄrds jau ir aizņemts.
@@ -727,7 +725,6 @@ PÄ“dÄ“jais reÄ£istra ieraksts ir apskatÄms zemÄk:",
'template-protected' => '(aizsargÄta)',
'template-semiprotected' => '(daļēji aizsargÄta)',
'hiddencategories' => 'Å Ä« lapa ietilpst {{PLURAL:$1|1 slÄ“ptajÄ kategorijÄ|$1 slÄ“ptajÄs kategorijÄs}}:',
-'nocreatetitle' => 'Lapu veidošana ierobežota',
'nocreatetext' => '{{grammar:lokatīvs|{{SITENAME}}}} ir atslēgta iespēja izveidot jauinas lapas.
Tu vari atgriezties atpakaļ un izmainīt esošu lapu, vai arī [[Special:UserLogin|ielogoties, vai izveidot kontu]].',
'nocreate-loggedin' => 'Tev nav atļaujas veidot jaunas lapas.',
@@ -752,6 +749,11 @@ IzskatÄs, ka lapa ir dzÄ“sta.',
'edit-already-exists' => 'Nevar izveidot jaunu lapu.
TÄ jau eksistÄ“.',
'defaultmessagetext' => 'Noklusētais ziņojuma teksts',
+'invalid-content-data' => 'Nederīgi satura dati',
+
+# Content models
+'content-model-javascript' => 'JavaScript kods',
+'content-model-css' => 'CSS stils',
# Parser/template warnings
'expensive-parserfunction-category' => 'Lapas ar pÄrÄk daudz laikietilpÄ«giem apstrÄdes funkciju izsaukumiem',
@@ -1044,7 +1046,7 @@ Ja vēlies, tu vari izmantot šo nejauši uzģenerēto kodu: $1',
'prefs-emailconfirm-label' => 'E-pasta statuss:',
'prefs-textboxsize' => 'Rediģēšanas loga izmērs',
'youremail' => 'Tava e-pasta adrese:',
-'username' => 'LietotÄjvÄrds:',
+'username' => '{{GENDER:$1|LietotÄjvÄrds}}:',
'uid' => 'LietotÄja ID:',
'prefs-memberingroups' => 'Pieder {{PLURAL:$1|grupai|grupÄm}}:',
'prefs-registration' => 'ReÄ£istrÄ“Å¡anÄs datums:',
@@ -1187,11 +1189,13 @@ Ja tu izvÄ“lies to norÄdÄ«t, tas tiks izmantots, lai identificÄ“tu tavu darbu (
'right-sendemail' => 'SÅ«tÄ«t e-pastu citiem lietotÄjiem',
'right-passwordreset' => 'Apskatīt paroles atiestatīšanas e-pasta ziņojumus',
+# Special:Log/newusers
+'newuserlogpage' => 'Jauno lietotÄju reÄ£istrs',
+'newuserlogpagetext' => 'Jauno lietotÄjvÄrdu reÄ£istrs.',
+
# User rights log
'rightslog' => 'LietotÄju tiesÄ«bu reÄ£istrs',
'rightslogtext' => 'Å is ir lietotÄju tiesÄ«bu izmaiņu reÄ£istrs.',
-'rightslogentry' => 'izmainīja $1 grupas no $2 uz $3',
-'rightsnone' => '(nav)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lasīt šo lapu',
@@ -1737,10 +1741,6 @@ SkatÄ«t arÄ« [[Special:WantedCategories|''sarkanÄs'' kategorijas]].",
'activeusers-hidesysops' => 'Paslēpt administratorus',
'activeusers-noresult' => 'Neviens lietotÄjs nav atrasts.',
-# Special:Log/newusers
-'newuserlogpage' => 'Jauno lietotÄju reÄ£istrs',
-'newuserlogpagetext' => 'Jauno lietotÄjvÄrdu reÄ£istrs.',
-
# Special:ListGroupRights
'listgrouprights' => 'LietotÄju grupu tiesÄ«bas',
'listgrouprights-summary' => 'Å is ir Å¡ajÄ wiki definÄ“to lietotÄju grupu uskaitÄ«jums, kopÄ ar tÄm atbilstoÅ¡ajÄm piekļuves tiesÄ«bÄm.
@@ -1825,11 +1825,7 @@ Ja vÄ“lÄk pÄrdomÄsi un nevÄ“lÄ“sies vairs uzraudzÄ«t Å¡o lapu, klikÅ¡Ä·ini uz
'enotif_mailer' => '{{SITENAME}} paziņojumu izsūtīšana',
'enotif_reset' => 'AtzÄ«mÄ“t visas lapas kÄ apskatÄ«tas',
-'enotif_newpagetext' => 'Å Ä« ir jauna lapa.',
'enotif_impersonal_salutation' => '{{SITENAME}} lietotÄjs',
-'changed' => 'izmainīja',
-'created' => 'izveidoja',
-'enotif_subject' => '{{grammar:Ä£enitÄ«vs|{{SITENAME}}}} lapu $PAGETITLE $CHANGEDORCREATED lietotÄjs $PAGEEDITOR',
'enotif_lastvisited' => '$1 lai apskatÄ«tos visas izmaiņas kopÅ¡ tava pÄ“dÄ“jÄ apmeklÄ“juma.',
'enotif_lastdiff' => '$1 lai apskatītos šo izmaiņu.',
'enotif_anon_editor' => 'anonÄ«ms lietotÄjs $1',
@@ -1860,6 +1856,8 @@ $UNWATCHURL
PapildinformÄcija:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'izveidoja',
+'changed' => 'izmainīja',
# Delete
'deletepage' => 'Dzēst lapu',
@@ -2023,7 +2021,7 @@ $1',
'blanknamespace' => '(Pamatlapa)',
# Contributions
-'contributions' => 'LietotÄja devums',
+'contributions' => '{{GENDER:$1|LietotÄja|LietotÄjas|LietotÄja}} devums',
'contributions-title' => 'LietotÄja $1 devums',
'mycontris' => 'Devums',
'contribsub2' => 'LietotÄjs: $1 ($2)',
@@ -2465,6 +2463,7 @@ To visticamÄk izraisÄ«ja ÄrÄ“ja saite uz melnajÄ sarakstÄ esoÅ¡u interneta v
'pageinfo-header-properties' => 'Lapas parametri',
'pageinfo-length' => 'Lapas garums (baitos)',
'pageinfo-article-id' => 'Lapas ID',
+'pageinfo-language' => 'Lappuses satura valoda',
'pageinfo-views' => 'Skatījumu skaits',
'pageinfo-watchers' => 'UzraudzÄ«tÄju skaits',
'pageinfo-redirects-name' => 'PÄradresÄcijas uz Å¡o lapu',
@@ -2472,6 +2471,10 @@ To visticamÄk izraisÄ«ja ÄrÄ“ja saite uz melnajÄ sarakstÄ esoÅ¡u interneta v
'pageinfo-lastuser' => 'PÄ“dÄ“jais labotÄjs',
'pageinfo-edits' => 'Izmaiņu skaits',
'pageinfo-authors' => 'Atsevišķu autoru skaits',
+'pageinfo-toolboxlink' => 'Lapas informÄcija',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage-yes' => 'JÄ',
+'pageinfo-protect-cascading-yes' => 'JÄ',
# Patrolling
'markaspatrolleddiff' => 'AtzÄ«mÄ“t kÄ pÄrbaudÄ«tu',
@@ -2512,6 +2515,7 @@ $1',
'file-info-size-pages' => '$1 × $2 pikseļi, faila izmērs: $3, MIME tips: $4, $5 {{PLURAL:$5|lapa|lapas}}',
'file-nohires' => 'AugstÄka izÅ¡Ä·irtspÄ“ja nav pieejama.',
'svg-long-desc' => 'SVG fails, definētais izmērs $1 × $2 pikseļi, faila izmērs: $3',
+'svg-long-error' => 'Nederīgs SVG fails: $1',
'show-big-image' => 'PilnÄ izmÄ“rÄ',
'show-big-image-preview' => 'Šī priekšskata izmērs: $1.',
'show-big-image-other' => '{{PLURAL:$2|Cits izmērs|Citi izmēri}}: $1.',
@@ -3117,7 +3121,7 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
'logentry-newusers-create' => 'LietotÄja konts $1 tika izveidots',
'logentry-newusers-create2' => 'LietotÄja kontu $3 izveidoja $1',
'logentry-newusers-autocreate' => 'Konts $1 tika izveidots automÄtiski',
-'newuserlog-byemail' => 'parole nosūtīta pa e-pastu',
+'rightsnone' => '(nav)',
# Feedback
'feedback-subject' => 'Temats:',
diff --git a/languages/messages/MessagesLzh.php b/languages/messages/MessagesLzh.php
index d171cf51..271d9387 100644
--- a/languages/messages/MessagesLzh.php
+++ b/languages/messages/MessagesLzh.php
@@ -292,7 +292,6 @@ $messages = array(
'qbbrowse' => '覽',
'qbedit' => '纂',
'qbpageoptions' => 'æ­¤é ',
-'qbpageinfo' => '內文',
'qbmyoptions' => 'å¾å¥½',
'qbspecialpages' => 'éžå‡¡',
'faq' => '頻答å•',
@@ -526,10 +525,12 @@ $2',
# Login and logout pages
'logouttext' => "'''å­åŽ»ç°¿çŸ£'''
-å­å¯åŒ¿å還覽{{SITENAME}},或[[Special:UserLogin|復登]]åŒç°¿ã€ç•°ç°¿ã€‚
+å­å¯åŒ¿å還覽{{SITENAME}},或<span class='plainlinks'>[$1 復登]</span>åŒç°¿ã€ç•°ç°¿ã€‚
未清謄本,覽器文舊,且慎之。",
-'welcomecreation' => '== $1大駕光臨! ==
-å­ç°¿å¢žçŸ£ï¼Œæ•¬æ›´[[Special:Preferences|簿註]]。',
+'welcomeuser' => '$1居,惠迎ï¼',
+'welcomecreation-msg' => 'å­ç°¿å»ºçŸ£ã€‚
+
+請更簿註乎[[Special:Preferences|此]]。',
'yourname' => 'å',
'yourpassword' => '符節',
'yourpasswordagain' => '復核節',
@@ -763,7 +764,6 @@ $2',
'template-protected' => '(錮)',
'template-semiprotected' => '(åŠéŒ®ï¼‰',
'hiddencategories' => 'æ­¤é å±¬éš±é¡žä¹‹å“¡æœ‰$1:',
-'nocreatetitle' => 'æ–°é¡Œè¬ç„‰',
'nocreatetext' => '舊題å¯ä¿®ï¼Œæ–°é¡Œè¬ç„‰ã€‚[[Special:UserLogin|登簿ã€å¢žç°¿]]以逮權也。',
'nocreate-loggedin' => 'å­æ¬Šæœªé€®ï¼Œæ–°é è¬ç„‰ã€‚',
'sectioneditnotsupported-title' => 'ä¸çº‚æŒç¯€',
@@ -1254,9 +1254,12 @@ $1",
'right-override-export-depth' => '出有五層深之é ',
'right-sendemail' => '擬書傳予他簿',
+# Special:Log/newusers
+'newuserlogpage' => '誌簿',
+'newuserlogpagetext' => '此為誌簿之記也',
+
# User rights log
'rightslog' => 'è·æ¬Šå¿—',
-'rightsnone' => '(凡)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => '閱此é ',
@@ -1760,10 +1763,6 @@ $1',
'activeusers-hidesysops' => 'è—有秩',
'activeusers-noresult' => '無簿矣。',
-# Special:Log/newusers
-'newuserlogpage' => '誌簿',
-'newuserlogpagetext' => '此為誌簿之記也',
-
# Special:ListGroupRights
'listgrouprights' => '權任一覽',
'listgrouprights-summary' => '此所列述,諸è·æ‰€å¸ä¹Ÿï¼Œå„有異åŒã€‚欲知其詳,請閱[[{{MediaWiki:Listgrouprights-helppage}}|此文]]。',
@@ -1847,11 +1846,7 @@ $1',
'enotif_mailer' => '{{SITENAME}}å ±',
'enotif_reset' => '令為盡閱',
-'enotif_newpagetext' => 'æ–°ç¶',
'enotif_impersonal_salutation' => '貴客',
-'changed' => '易',
-'created' => 'æ’°',
-'enotif_subject' => '{{SITENAME}}ç°¿{$PAGEEDITOR}{$CHANGEDORCREATED}{$PAGETITLE}',
'enotif_lastvisited' => '自å­å‡ºç°¿ï¼Œæœ‰æ˜“見$1。',
'enotif_lastdiff' => '欲閱此易,見$1。',
'enotif_anon_editor' => 'éŽå®¢$1',
@@ -1874,6 +1869,8 @@ $NEWPAGE
欲刪之é ï¼Œæƒ è¨ª$UNWATCHURL
饋助之,惠訪{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'æ’°',
+'changed' => '易',
# Delete
'deletepage' => '刪é ',
@@ -2846,6 +2843,6 @@ MediaWiki乃為用之發,無擔之責也;亦無售目之默擔也。åƒGNUé€
# New logging system
'revdelete-restricted' => '應é™è‡³æœ‰ç§©',
'revdelete-unrestricted' => '除é™è‡ªæœ‰ç§©',
-'newuserlog-byemail' => '號發自電郵',
+'rightsnone' => '(凡)',
);
diff --git a/languages/messages/MessagesLzz.php b/languages/messages/MessagesLzz.php
index c805731c..264a1bbe 100644
--- a/languages/messages/MessagesLzz.php
+++ b/languages/messages/MessagesLzz.php
@@ -401,9 +401,11 @@ Ogoruşi dudis '''all:''' pʼrefiksi okʼatute doloçʼareli na ren iri şeyi (o
# Rights
'right-delete' => 'Am sayfape jili',
+# Special:Log/newusers
+'newuserlogpage' => 'Ağani maxmareş kʼayitʼepe',
+
# User rights log
'rightslog' => 'Maxmareş hakʼişi kʼayitʼepe',
-'rightsnone' => '(Va ren)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => "am sayfa ik'itxi",
@@ -503,9 +505,6 @@ Ogoruşi dudis '''all:''' pʼrefiksi okʼatute doloçʼareli na ren iri şeyi (o
# Special:LinkSearch
'linksearch' => 'Galeni kʼontaktʼepe',
-# Special:Log/newusers
-'newuserlogpage' => 'Ağani maxmareş kʼayitʼepe',
-
# Special:ListGroupRights
'listgrouprights-members' => '(makʼaturepeşi listʼe)',
@@ -777,4 +776,7 @@ Ukʼaçxe na mulunan kʼontʼaktʼepe istʼisna oqʼopinot kʼabuli ixvenen. Mes
# Special:SpecialPages
'specialpages' => 'Doxmeli butʼkʼape',
+# New logging system
+'rightsnone' => '(Va ren)',
+
);
diff --git a/languages/messages/MessagesMai.php b/languages/messages/MessagesMai.php
index 9d05a2a1..f0034097 100644
--- a/languages/messages/MessagesMai.php
+++ b/languages/messages/MessagesMai.php
@@ -171,7 +171,6 @@ $messages = array(
'qbbrowse' => 'गवेषण करू',
'qbedit' => 'समà¥à¤ªà¤¾à¤¦à¤¨ करू',
'qbpageoptions' => 'ई पनà¥à¤¨à¤¾',
-'qbpageinfo' => 'विषय',
'qbmyoptions' => 'हमर पनà¥à¤¨à¤¾ सभ',
'qbspecialpages' => 'विशेष पनà¥à¤¨à¤¾ सभ',
'faq' => 'तà¥à¤µà¤°à¤¿à¤¤ पà¥à¤°à¤¶à¥à¤¨à¥‹à¤¤à¥à¤¤à¤°à¥€',
@@ -423,11 +422,8 @@ $2',
# Login and logout pages
'logouttext' => "'''अहाठनिषà¥à¤•à¥à¤°à¤®à¤£ कऽ गेल छी।'''
-अहाठ{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पà¥à¤°à¤¯à¥‹à¤— अनाम भऽ कऽ सकै छी, वा अहाठ[[Special:UserLogin|log in again]] वà¤à¤¹ आकि कोनो आन पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• रूपमे सेहू पà¥à¤°à¤¯à¥‹à¤• कऽ सकै छी।
+अहाठ{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पà¥à¤°à¤¯à¥‹à¤— अनाम भऽ कऽ सकै छी, वा अहाठ<span class='plainlinks'>[$1 log in again]</span> वà¤à¤¹ आकि कोनो आन पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾à¤• रूपमे सेहू पà¥à¤°à¤¯à¥‹à¤• कऽ सकै छी।
ई मोन राखू जे किछॠपनà¥à¤¨à¤¾ à¤à¤¨à¤¾ देखा पड़ि सकैठजेना अहाठअखनो समà¥à¤ªà¥à¤°à¤µà¥‡à¤¶à¤¿à¤¤ होइ, जावत अहाठअपन गवेषकक उपसà¥à¤®à¥ƒà¤¤à¤¿ मेटा नै दै छी।",
-'welcomecreation' => '== सà¥à¤µà¤¾à¤—त अछि, $1! ==
-अहाà¤à¤• खाता खà¥à¤œà¤¿ गेल अछि।
-अपन [[Special:Preferences|{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} preferences]] बदलब नै बिसरू।',
'yourname' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾:',
'yourpassword' => 'कूटशबà¥à¤¦:',
'yourpasswordagain' => 'कूटशबà¥à¤¦ फेरसठटाइप करू:',
@@ -754,7 +750,6 @@ $2
'template-semiprotected' => '(अरà¥à¤§-रकà¥à¤·à¤¿à¤¤)',
'hiddencategories' => 'ई पनà¥à¤¨à¤¾ सदसà¥à¤¯ अछि {{PLURAL:$1|1 नà¥à¤•à¤¾à¤à¤² संवरà¥à¤—|$1 नà¥à¤•à¤¾à¤à¤² संवरà¥à¤— सभ}}:',
'edittools-upload' => '-',
-'nocreatetitle' => 'पनà¥à¤¨à¤¾ निरà¥à¤®à¤¾à¤£ सीमित',
'nocreatetext' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} नव पनà¥à¤¨à¤¾ निरà¥à¤®à¤¾à¤£à¤• कà¥à¤·à¤®à¤¤à¤¾à¤•à¥‡à¤ सीमित कऽ देने अछि।
अहाठआपस जा सकै छी आ कोनो पनà¥à¤¨à¤¾à¤•à¥‡à¤ समà¥à¤ªà¤¾à¤¦à¤¿à¤¤ कऽ सकै छी, वा [[Special:UserLogin|log in or create an account]]',
'nocreate-loggedin' => 'अहाà¤à¤•à¥‡à¤ नव पनà¥à¤¨à¤¾ बनेबाक अधिकार नै अछि।',
@@ -1285,12 +1280,13 @@ $3 दà¥à¤µà¤¾à¤°à¤¾ देल कारण अछि ''$2''",
'right-sendemail' => 'ई-पतà¥à¤° दोसर पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ लोकनिकेठपठाउ',
'right-passwordreset' => 'कूटशबà¥à¤¦ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤§à¤¾à¤°à¤£ ई-पतà¥à¤° देखू',
+# Special:Log/newusers
+'newuserlogpage' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ रचना वृतà¥à¤¤à¤²à¥‡à¤–',
+'newuserlogpagetext' => 'ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ निरà¥à¤®à¤¾à¤£à¤• वृतà¥à¤¤à¤²à¥‡à¤– अछि।',
+
# User rights log
'rightslog' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकार वृतà¥à¤¤à¤²à¥‡à¤–',
'rightslogtext' => 'ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ अधिकार परिवरà¥à¤¤à¤¨ सभक वृतलेख छी।',
-'rightslogentry' => 'वरà¥à¤—क सदसà¥à¤¯à¤¤à¤¾ बदलल गेल $1 लेल $2 सठ$3',
-'rightslogentry-autopromote' => 'सà¥à¤µà¤¯à¤‚चालित रूपमे $2 सठ$3 मे पदोनà¥à¤¨à¤¤ भेल',
-'rightsnone' => '(कोनो नै)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ई पनà¥à¤¨à¤¾ पढ़ू',
@@ -1873,10 +1869,6 @@ $1',
'activeusers-hidesysops' => 'संचालक नà¥à¤•à¤¾à¤‰',
'activeusers-noresult' => 'कोनो पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ नै भेटल',
-# Special:Log/newusers
-'newuserlogpage' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ रचना वृतà¥à¤¤à¤²à¥‡à¤–',
-'newuserlogpagetext' => 'ई पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ निरà¥à¤®à¤¾à¤£à¤• वृतà¥à¤¤à¤²à¥‡à¤– अछि।',
-
# Special:ListGroupRights
'listgrouprights' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ संवरà¥à¤— अधिकार',
'listgrouprights-summary' => 'ई सभ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ संवरà¥à¤—क à¤à¤•à¤Ÿà¤¾ सूची अछि जे ठविकीपरपरिभाषित अछि ओकर संसरà¥à¤—ित पà¥à¤°à¤µà¥‡à¤¶ अधिकारक संग।
@@ -1970,11 +1962,7 @@ $1',
'enotif_mailer' => '{{जालसà¥à¤¥à¤²}} सूचना पतà¥à¤°à¤•',
'enotif_reset' => 'सभ पनà¥à¤¨à¤¾à¤•à¥‡à¤ देखल चिनà¥à¤¹à¤¿à¤¤ करू',
-'enotif_newpagetext' => 'ई à¤à¤•à¤Ÿà¤¾ नव पनà¥à¤¨à¤¾ छी।',
'enotif_impersonal_salutation' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾',
-'changed' => 'बदलल गेल',
-'created' => 'बनाà¤à¤² गेल',
-'enotif_subject' => '{{अनà¥à¤¤à¤°à¥à¤œà¤¾à¤²}} पनà¥à¤¨à¤¾ $PAGETITLE भेल $CHANGEDORCREATED दà¥à¤µà¤¾à¤°à¤¾ $PAGEEDITOR',
'enotif_lastvisited' => 'देखू $1 अपन अनà¥à¤¤à¤¿à¤® बेर अà¤à¤²à¤¾à¤• बादक परिवरà¥à¤¤à¤¨ लेल।',
'enotif_lastdiff' => 'ठपरिवरà¥à¤¤à¤¨à¤•à¥‡à¤ देखबा लेल $1 देखू।',
'enotif_anon_editor' => 'गà¥à¤ªà¥à¤¤ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ $1',
@@ -2007,6 +1995,8 @@ $UNWATCHURL
अपन अनà¥à¤­à¤µ बतेबा वा कोनो सहायता लेल:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'बनाà¤à¤² गेल',
+'changed' => 'बदलल गेल',
# Delete
'deletepage' => 'पनà¥à¤¨à¤¾ मेटाउ',
@@ -3536,7 +3526,7 @@ $5
'logentry-newusers-create' => '$1 {{लिंग:$2|बनाà¤à¤²}} à¤à¤•à¤Ÿà¤¾ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता',
'logentry-newusers-create2' => '$1 {{लिंग:$2|बनाà¤à¤²}} {{लिंग:$4|à¤à¤•à¤Ÿà¤¾ पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ खाता}} $3',
'logentry-newusers-autocreate' => 'खाता $1 छल {{लिंग:$2|बनाà¤à¤²}} सà¥à¤µà¤¤à¤ƒ',
-'newuserlog-byemail' => 'कूटशबà¥à¤¦ ई-पतà¥à¤° दà¥à¤µà¤¾à¤°à¤¾ पठाà¤à¤² गेल',
+'rightsnone' => '(कोनो नै)',
# API errors
'api-error-badaccess-groups' => 'अहि विकी सें अहां कोनो पà¥à¤°à¤¾à¤°à¥‚प लोड नहि क सकब.',
diff --git a/languages/messages/MessagesMap_bms.php b/languages/messages/MessagesMap_bms.php
index c5102939..c57fa662 100644
--- a/languages/messages/MessagesMap_bms.php
+++ b/languages/messages/MessagesMap_bms.php
@@ -160,7 +160,6 @@ $messages = array(
'qbbrowse' => 'Jelajahi',
'qbedit' => 'Sunting',
'qbpageoptions' => 'Kaca kiye',
-'qbpageinfo' => 'Konteks kaca',
'qbmyoptions' => 'Kaca-ne inyong',
'qbspecialpages' => 'Kaca-kaca astamiwa',
'faq' => 'FAQ (Pitakonan sing sering ditakokna)',
@@ -183,6 +182,7 @@ $messages = array(
'namespaces' => 'Bilik jeneng',
'variants' => 'Varian',
+'navigation-heading' => 'Menu navigasi',
'errorpagetitle' => 'Kasalahan',
'returnto' => 'Bali maring $1.',
'tagline' => 'Sekang {{SITENAME}}',
@@ -414,11 +414,8 @@ Alesane yakuwe "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Rika uwis metu log sekang sistem.'''
-Rika teyeng terus nggunakna {{SITENAME}} kanthi anonim, utawa Rika teyeng [[Special:UserLogin|mlebu log maning]] nganggo jeneng panganggo sing padha utawa sejene.
+Rika teyeng terus nggunakna {{SITENAME}} kanthi anonim, utawa Rika teyeng <span class='plainlinks'>[$1 mlebu log maning]</span> nganggo jeneng panganggo sing padha utawa sejene.
Digatekna ya, nek ana kaca sing esih terus nidokna nek rika esih mlebu log nnganti Rika mbusak singgahan nang panjelajah web-e Rika.",
-'welcomecreation' => '== Sugeng rawuh, $1! ==
-
-Akun Rika uwis digawe. Aja kelalen nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] Rika.',
'yourname' => 'Jeneng panganggo:',
'yourpassword' => 'Tembung sandhi:',
'yourpasswordagain' => 'Balèni tembung sandhi:',
@@ -676,7 +673,6 @@ Entri cathetan pungkasan disadiakna nang ngisor kanggo referensi:",
'template-protected' => '(direksa)',
'template-semiprotected' => '(semi-pangreksan)',
'hiddencategories' => 'Kaca kiye kuwe anggota sekang {{PLURAL:$1|1 kategori sing diumpetna|$1 kategori-kategori sing diumpetna}}:',
-'nocreatetitle' => 'Panggawéan kaca anyar diwatesi',
'nocreatetext' => '{{SITENAME}} wis mbatesi panggawean kaca anyar.
Rika teyeng mbalik lan nyunting kaca sing wis ana, utawa [[Special:UserLogin|mlebu utawa gawe akun]]',
'nocreate-loggedin' => 'Rika ora duwe hak akses nggo gawe kaca anyar.',
@@ -1146,12 +1142,12 @@ Aja kuatir, alamat imele Rika ora ditidokna dong pangganggo sejen ngontak Rika.'
'right-override-export-depth' => "Ekspor kaca sisan karo kaca sing kagandheng gutul lapisan (''depth'') kaping 5",
'right-sendemail' => 'Ngirim imel maring panganggo liyane',
+# Special:Log/newusers
+'newuserlogpage' => 'Log panganggo anyar',
+
# User rights log
'rightslog' => 'Log pangowahan hak akses panganggo',
'rightslogtext' => 'Kiye log pangowahan maring hak-hak panganggo.',
-'rightslogentry' => 'Ngganti kaanggotaan kelompok nggo $1 sekang $2 dadi $3',
-'rightslogentry-autopromote' => 'otomatis dipromosikna sekang $2 dadi $3',
-'rightsnone' => '(ora ana)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'maca kaca kiye',
@@ -1455,9 +1451,6 @@ Rika teyeng mbatesi tampilan kanthi milih jinis log, jeneng panganggo (sensitif
# Special:LinkSearch
'linksearch-line' => '$1 duwe pranala sekang $2',
-# Special:Log/newusers
-'newuserlogpage' => 'Log panganggo anyar',
-
# Special:ListGroupRights
'listgrouprights-members' => '(daftar anggota)',
@@ -1581,7 +1574,7 @@ Rika teyeng ngowaih tingkat pangreksan nggo kaca kiye, ningen perkara iku ora aw
'blanknamespace' => '(Utama)',
# Contributions
-'contributions' => 'Tulisan anggota',
+'contributions' => 'Kontribusi {{GENDER:$1|panganggo}}',
'contributions-title' => 'Kontribusi panganggo kanggo $1',
'mycontris' => 'Kontribusi',
'contribsub2' => 'Kanggo $1 ($2)',
@@ -1820,4 +1813,7 @@ Sing liyane bakal diumpetna sacara ''default''.
# Special:Tags
'tag-filter' => 'Filter [[Special:Tags|Tag]]:',
+# New logging system
+'rightsnone' => '(ora ana)',
+
);
diff --git a/languages/messages/MessagesMdf.php b/languages/messages/MessagesMdf.php
index 51bc37a8..e96b2558 100644
--- a/languages/messages/MessagesMdf.php
+++ b/languages/messages/MessagesMdf.php
@@ -287,7 +287,6 @@ $messages = array(
'qbbrowse' => 'Ванондома',
'qbedit' => 'Петнема',
'qbpageoptions' => 'Ð¢Ñ Ð»Ð¾Ð¿Ð°ÑÑŒ',
-'qbpageinfo' => 'КонтекÑÑ‚ÑÑŒ',
'qbmyoptions' => 'Монь лопане',
'qbspecialpages' => 'Башка тевонь лопат',
'faq' => 'СидеÑта Кеподеви КизефкÑне',
@@ -547,11 +546,8 @@ $2',
# Login and logout pages
'logouttext' => "'''Тон лиÑеть.'''
-Тондейть ули кода Ð°Ñ‰ÐµÐ¼Ñ {{SITENAME}}Ñа апак Ñодак Ñли [[Special:UserLogin|Ñувак тага веÑÑ‚ÑŒ]] кода ÑÑка Ñли Ð¸Ð»Ñ Ñ‚Ð¸Ð¸ÑÑŒ.
+Тондейть ули кода Ð°Ñ‰ÐµÐ¼Ñ {{SITENAME}}Ñа апак Ñодак Ñли <span class='plainlinks'>[$1 Ñувак тага веÑÑ‚ÑŒ]</span> кода ÑÑка Ñли Ð¸Ð»Ñ Ñ‚Ð¸Ð¸ÑÑŒ.
Кой-кона лопатне илÑдÑÑ‚ÑŒ ÑÑ‚Ð°Ð¼ÐºÑ ÐºÐ¾Ð´Ð°Ð¼ÐºÑ Ñинь ульÑÑ‚ÑŒ тонь лиÑемада инголе мъзÑÑ€Ñ Ñ‚Ð¾Ð½ÑŒ интернет полаткÑце изь аруÑфтов ÑÑÑŒ ванфневи файлхнень Ñзда.",
-'welcomecreation' => '== Сувак, $1! ==
-
-Тонь Ñёрматфтомаце анок. ТÑÑ‚ юкÑта Ð¿Ð¾Ð»Ð°Ñ„Ð½ÐµÐ¼Ñ ÑÑÑŒ [[Special:Preferences|{{SITENAME}} латцематне]].',
'yourname' => 'Тиить лемоц:',
'yourpassword' => 'Сувама валце:',
'yourpasswordagain' => 'Сёрматк Ñувама валце омбоцекÑ:',
@@ -822,7 +818,6 @@ $2',
'template-protected' => '(аралаф)',
'template-semiprotected' => '(пÑлеÑ-аралаф)',
'hiddencategories' => 'Ð¢Ñ Ð»Ð¾Ð¿Ð°ÑÑŒ {{PLURAL:$1|1 кÑшф катериень|$1 кÑшф категориень}} полаец:',
-'nocreatetitle' => 'Лопань тиемац оторонзаф',
'nocreatetext' => '{{SITENAME}}-Ñа од лопатнень тиемац оторонзаф.
Тондейть ули кода Ð¼ÑŠÑ€Ð´Ð°Ð¼Ñ Ð¼ÐµÐºÐ¸ ди Ð¿ÐµÑ‚Ð½ÐµÐ¼Ñ Ñ‚Ð¸Ñ„ ни лопать, Ñли [[Special:UserLogin|ÑÑƒÐ²Ð°Ð¼Ñ Ñли ÑÑ‘Ñ€Ð¼Ð°Ñ‚Ñ„Ñ‚Ð¾Ð¼Ñ Ð¾Ð´ÑƒÐºÑ]].',
'nocreate-loggedin' => 'Тон аф мÑрьговат Ñ‚Ð¸ÐµÐ¼Ñ Ð¾Ð´ лопат.',
@@ -843,6 +838,7 @@ $2',
'edit-no-change' => 'Тонь петнемацень Ñ‚ÐµÐ²Ñ Ð¸Ð·ÑŒ нолда, ÑÑÑ Ð¼ÐµÑ Ñ‚Ð¾Ð½ текÑÑ‚Ñ‚ÑŒ ашеть полафта.',
'edit-already-exists' => 'Ðш кода од лопа ушедомÑ.
Ð¢Ñ Ð»Ð¾Ð¿Ð°ÑÑŒ ульÑÑŒ ни.',
+'content-failed-to-parse' => 'Ðш кода $2 Ñёрматфть Ð½Ð¾Ð»Ð´Ð°Ð¼Ñ Ñ‚ÐµÐ²Ñ $1 моделень корÑÑ: $3',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Инголе кардама: Ð¢Ñ Ð»Ð¾Ð¿Ð°Ñа пÑк лама питни ÑинтакÑонь анализаторхнень Ñ‚ÑшкÑта.
@@ -1229,11 +1225,13 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'right-userrights-interwiki' => 'ÐŸÐµÑ‚Ð½ÐµÐ¼Ñ Ñ‚Ð¸Ð¸Ñ…Ð½ÐµÐ½ÑŒ видекÑнон Ð¸Ð»Ñ Ð²Ð¸ÐºÐ¸Ñ‚ÑŒ лопаÑонза',
'right-siteadmin' => 'ПÑкÑÑ‚Ð°Ð¼Ñ Ñди Ð¿Ð°Ð½Ð¶ÐµÐ¼Ñ Ð´Ð°Ñ‚Ð°Ð±Ð°Ð·Ð°Ñ‚ÑŒ',
+# Special:Log/newusers
+'newuserlogpage' => 'Тиинь ушедоманзон лувомаÑна',
+'newuserlogpagetext' => 'Ð¢Ñ Ñ‚Ð¸Ð¸Ð½ÑŒ ушедоманзон лувомаÑна.',
+
# User rights log
'rightslog' => 'Тиить видекÑонза лувомаÑÑŒ',
'rightslogtext' => 'Тиить видекÑонзон полафнемаÑна лувомаÑÑŒ.',
-'rightslogentry' => '$1-нь полгац полафтÑÑŒ $2-Ñта $3-Ñ',
-'rightsnone' => '(аш)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'Ñ‚Ñ Ð»Ð¾Ð¿Ð°Ñ‚ÑŒ морафтома',
@@ -1674,10 +1672,6 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'listusers-submit' => 'ÐÑфтемÑ',
'listusers-noresult' => 'Тиихть иÑÑ‚ÑŒ мув.',
-# Special:Log/newusers
-'newuserlogpage' => 'Тиинь ушедоманзон лувомаÑна',
-'newuserlogpagetext' => 'Ð¢Ñ Ñ‚Ð¸Ð¸Ð½ÑŒ ушедоманзон лувомаÑна.',
-
# Special:ListGroupRights
'listgrouprights' => 'Тиихнень полгаÑнон видекÑонза',
'listgrouprights-summary' => 'ТÑÑа тиихнень полгаÑна конатне ÑувÑихть Ñ‚Ñ Ð’Ð¸ÐºÐ¸Ñ Ñинь Ñувама видекÑÑнон мархта.
@@ -1754,11 +1748,7 @@ $3 макÑÑÑŒ туфталÑÑŒ - ''$2''",
'enotif_mailer' => '{{SITENAME}} Пачфнематнень Кучи',
'enotif_reset' => 'ÐŸÑƒÑ‚Ð¾Ð¼Ñ Ñ‚ÑÑˆÐºÑ Ñембе Ñуваф лопатнень лангÑ',
-'enotif_newpagetext' => 'Ð¢Ñ Ð¾Ð´ лопа.',
'enotif_impersonal_salutation' => '{{SITENAME}} тииÑÑŒ',
-'changed' => 'полафтÑÑŒ',
-'created' => 'тиф',
-'enotif_subject' => '{{SITENAME}} page $PAGETITLE has been $CHANGEDORCREATED by $PAGEEDITOR',
'enotif_lastvisited' => 'Ванк $1 тонь мекольце Ñамдот меле Ñембе поланематнень нÑфтеманкÑа.',
'enotif_lastdiff' => 'Ванк $1 Ñ‚Ñ Ð¿Ð¾Ð»Ð°Ñ„Ð½ÐµÐ¼Ð°Ñ‚ÑŒ нÑфтеманкÑа.',
'enotif_anon_editor' => 'лемфтома тииÑÑŒ $1',
@@ -1788,6 +1778,8 @@ $UNWATCHURL
Ðзома мекпÑли ди Ð¸Ð»Ñ Ð»ÐµÐ·ÐºÑ:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'тиф',
+'changed' => 'полафтÑÑŒ',
# Delete
'deletepage' => 'ÐÐ°Ñ€Ð´Ð°Ð¼Ñ Ð»Ð¾Ð¿Ð°Ñ‚ÑŒ',
@@ -2895,6 +2887,6 @@ $5
# New logging system
'revdelete-restricted' => 'нолдаф Ñ‚ÐµÐ²Ñ ÐºÐ°Ñ€Ð´Ð°Ñ„ÐºÑне ÑиÑтемонь вÑтикÑненди',
'revdelete-unrestricted' => 'ÑиÑтемонь вÑтикÑненди кардафкÑне валхтфт',
-'newuserlog-byemail' => 'Ñувама валце кучф Ñлектрононь ÑёрмаÑа',
+'rightsnone' => '(аш)',
);
diff --git a/languages/messages/MessagesMg.php b/languages/messages/MessagesMg.php
index d0eb444e..b20619c6 100644
--- a/languages/messages/MessagesMg.php
+++ b/languages/messages/MessagesMg.php
@@ -186,7 +186,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Fanovàna_farany' ),
'Recentchangeslinked' => array( 'Fanarahana_ny_rohy' ),
'Revisiondelete' => array( 'Santiôna_voafafa' ),
- 'RevisionMove' => array( 'Fanalana_santiôna' ),
'Search' => array( 'Fikarohana' ),
'Shortpages' => array( 'Pejy_fohy' ),
'Specialpages' => array( 'Pejy_manokana' ),
@@ -362,7 +361,6 @@ $messages = array(
'qbbrowse' => 'Tadiavina',
'qbedit' => 'Hanova',
'qbpageoptions' => 'Ity pejy ity',
-'qbpageinfo' => 'Pejy fanoroana',
'qbmyoptions' => 'Ny pejiko',
'qbspecialpages' => 'Pejy manokana',
'faq' => 'FMM',
@@ -628,12 +626,8 @@ Ny antony nomen\'ny mpandrindra nanidy azy: "$3".',
# Login and logout pages
'logouttext' => "'''Tafavoaka ianao ankehitriny.'''
-Mbola afaka mampiasa ny {{SITENAME}} ianao na dia ef anivoaka aza, na afaka [[Special:UserLogin|miverina mihiditra]] ianao ambanin'ny anaranao na anaram-pikambana hafa.
+Mbola afaka mampiasa ny {{SITENAME}} ianao na dia ef anivoaka aza, na afaka <span class='plainlinks'>[$1 miverina mihiditra]</span> ianao ambanin'ny anaranao na anaram-pikambana hafa.
Fantaro fa ny endriky ny pejy sasany dia mety mitovy amin'ny endrika nahitanao azy tamin' ianao mbola niditra tato, ho toy izany ny endri-pejy raha tsy nofafanao ny cache.",
-'welcomecreation' => '== Tonga soa, $1! ==
-
-Voaforona soa aman-tsara ny kaontinao.
-Aza hadino ny manova ny [[Special:Preferences|safidinao]]',
'yourname' => 'Solonanarana',
'yourpassword' => 'Tenimiafina',
'yourpasswordagain' => 'Avereno ampidirina eto ny tenimiafina',
@@ -967,7 +961,6 @@ Ny mpandrindra nanidy ny banky angona dia nanome ny antony : <br />$1",
'template-protected' => '(voaaro)',
'template-semiprotected' => '(voaaro an-tàpany)',
'hiddencategories' => '{{PLURAL:$1|anaty sokajy|anaty sokajy}} nasitrika $1 ity pejy ity',
-'nocreatetitle' => 'Voafetra ny famoronana pejy',
'nocreatetext' => " Voafetra ihany ny fahafahana mamorona pejy eto amin'ity sehatra ity. Ny pejy efa misy no azonao ovaina, na [[Special:UserLogin|midira na mamoròna kaonty]].",
'nocreate-loggedin' => 'Tsy mahazo ataonao no manamboatra pejy vao.',
'sectioneditnotsupported-title' => 'Fanovana fizarana tsy zaka',
@@ -990,6 +983,7 @@ Mety voafafa angamba izy.',
'edit-already-exists' => 'Tsy afaka amboarina ilay pejy vaovao.
Efa misy izy.',
'defaultmessagetext' => 'Hafatra raha tsy misy',
+'invalid-content-data' => "Data anaty votoatiny tsy miady amin'ny fepetra",
# Parser/template warnings
'expensive-parserfunction-warning' => 'Tandremo : Betsaka loatra ny fanantsoana ny tao parser.
@@ -1353,9 +1347,9 @@ Fenoy araka ny datin'ny solosainan'ny mpitsidika",
'prefs-emailconfirm-label' => 'Famarinana ny imailaka :',
'prefs-textboxsize' => "Hangezan'ny varavarankely fanovana",
'youremail' => 'Imailaka:',
-'username' => 'Solonanarana:',
-'uid' => "Laharan'ny mpikambana:",
-'prefs-memberingroups' => "mpikamban'ny gropy{{PLURAL:}} $1 :",
+'username' => '{{GENDER:$1}}Anaram-pikambana :',
+'uid' => '{{GENDER:$1}}mpikambana :',
+'prefs-memberingroups' => "mpikambana{{GENDER:$2}} ao amin'ny vondrona{{PLURAL:$1}} :",
'prefs-registration' => 'Daty fidirana :',
'yourrealname' => 'Tena anarana marina:',
'yourlanguage' => 'Tenim-pirenena:',
@@ -1504,12 +1498,13 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
'right-sendemail' => "Mandefa imailaka any amin'ny mpikambana hafa",
'right-passwordreset' => 'Hijery ny imailaka famerenana ny tenimiafina',
+# Special:Log/newusers
+'newuserlogpage' => 'Tatitr’asan’ny fanokafana kaontim-pikambana',
+'newuserlogpagetext' => "Ity pejy ity dia maneho ny tantaran'asan'ny fampidirana mpikambana vaovao.",
+
# User rights log
'rightslog' => 'Tatitr’asa momban’ny fanovana satam-pikambana',
'rightslogtext' => "Ity ny laogy momban'ny fanovana ny zom-pikambana.",
-'rightslogentry' => "nanova ny fahefan'ny mpikambana « $1 », avy amin'ny $2 izy lasa $3",
-'rightslogentry-autopromote' => '$2 navadika $3 ho azy',
-'rightsnone' => '(tsy misy)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'mamaky ity pejy ity',
@@ -2110,10 +2105,6 @@ Protokoly zaka <code>$1</code> aza ampiana ao amin'ny karokao izy ireo.",
'activeusers-hidesysops' => 'Asitriho ny mpandrindra',
'activeusers-noresult' => 'Tsy nahitana mpikambana.',
-# Special:Log/newusers
-'newuserlogpage' => 'Tatitr’asan’ny fanokafana kaontim-pikambana',
-'newuserlogpagetext' => "Ity pejy ity dia maneho ny tantaran'asan'ny fampidirana mpikambana vaovao.",
-
# Special:ListGroupRights
'listgrouprights' => "Fahefan'ny vondrom-pikambana",
'listgrouprights-summary' => "Ity pejy ity dia ahitana ny lisitry ny vondrom-pikambana voafaritra ato amin'ity wiki ity ary ny zo ananany. Mety misy [[{{MediaWiki:Listgrouprights-helppage}}|fampahalalana fanampiny]] mikasika ny zo manokana.",
@@ -2206,37 +2197,39 @@ na tsy maniry handray imailaka avy amin'ny mpikambana hafa izy.",
'enotif_mailer' => "Fomba fampandrenesana amin'ny alalan'ny imailaka an'i {{SITENAME}}",
'enotif_reset' => 'Marihana ho efa voavaky ny pejy rehetra',
-'enotif_newpagetext' => 'Pejy vaovao ity pejy ity.',
'enotif_impersonal_salutation' => "Mpikamban'i {{SITENAME}}",
-'changed' => 'voaova',
-'created' => 'voaforona',
-'enotif_subject' => '$CHANGEDORCREATED $PAGEEDITOR ny pejy $PAGETITLE tao amin\'ny {{SITENAME}}',
'enotif_lastvisited' => "Jereo eto $1 ny niova rehetra hatramin'ny fitsidihanao farany.",
'enotif_lastdiff' => 'Jereo $1 mba ahitana ireo fanovana ireo.',
'enotif_anon_editor' => 'mpikambana tsy nisoratra anarana $1',
-'enotif_body' => '$WATCHINGUSERNAME,
-
-$CHANGEDORCREATED $PAGEEDITOR tamin\'ny $PAGEEDITDATE ny pejy $PAGETITLE tao amin\'ny sehatra {{SITENAME}}. Jereo eto $PAGETITLE_URL ny votoatiny ankehitriny.
+'enotif_body' => 'Tompoko $WATCHINGUSERNAME,
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
-Fanazavana tsotsotra: $PAGESUMMARY $PAGEMINOREDIT
+Ambangovangon\'ny mpikambana nanova : $PAGESUMMARY $PAGEMINOREDIT
-Fifandraisana amin\'ny nanova ny pejy:
-imailaka: $PAGEEDITOR_EMAIL
-wiki: $PAGEEDITOR_WIKI
+Ifandraisana amin\'io mpikambana io :
+mailaka : $PAGEEDITOR_EMAIL
+wiki : $PAGEEDITOR_WIKI
-Tsy handefasana fampahafantarana intsony aloha ianao momba io pejy io na dia misy manova aza izy mandra-pitsidikao azy.
-Azonao atao koa ny manajanona ny fampahafantarana anao aloha na misy manova aza ny pejy iray ao amin\'ny lisitry ny pejy arahinao maso.
+Tsy hisy fampandrenesana hafa raha misy mpikambana manova aorian\'ny nandefasana ity mailaka ity, raha tsy hoe mitsidika ilay pejy ianao. Azonao atao koa ny mamerina ho aotra ny flag fampandrenesana ho an\'ny pejy rehetra ao amin\'ny lisitry ny pejy arahanao.
- Ny fitaovana fampahafantarana eto amin\'ny {{SITENAME}}
+ Ny rafitr\'i {{SITENAME}} mampandre anao.
--
-Raha hanova ny fandehan\'ny momba ny lisitry ny pejy arahi-maso, jereo
+Rehefa hanova ny parametatra mikasika ny fampandrenesana amin\'ny alalan\'ny mailaka, tsidiho
+{{canonicalurl:{{#special:Preferences}}}}
+
+
+Rehefa tia hanova ny parametatray ny lisitry ny pejy arahanao, tsidiho
{{canonicalurl:{{#special:EditWatchlist}}}}
-Hevitrao sy fanampiana:
+Rehefa tsy hanaraka ilay pejy intsony ianao dia tsidiho
+$UNWATCHURL
+
+Verindrohy ary fanampiana:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'voaforona',
+'changed' => 'voaova',
# Delete
'deletepage' => 'Hamafa ny pejy',
@@ -3334,8 +3327,11 @@ Aseho amin'ny tena habeny ny sary aseho, ny hafa dia alefa miaraka amin'ny rindr
'logentry-newusers-newusers' => 'Noforonina ny kaontim-pikambana $1',
'logentry-newusers-create' => 'Noforonina ny kaontim-pikambana $1',
'logentry-newusers-create2' => "Noforonin'i $1 ny kaomtim-pikambana $3",
-'logentry-newusers-autocreate' => 'Noforonina ho azy ny kaontim-pikambana $&',
-'newuserlog-byemail' => "tenimiafina nalefa tamin'ny imailaka",
+'logentry-newusers-autocreate' => 'Noforonina ho azy ny kaontim-pikambana $1',
+'logentry-rights-rights' => "$1 dia nanova ny sokajim-pikambana isian'i $3 avy amin'ny $4 lasa $5",
+'logentry-rights-rights-legacy' => "$1 nanova ny vonodrom-pikambana isian'i $3",
+'logentry-rights-autopromote' => 'Lasa $5 ho azy i $1 izay $4 taloha',
+'rightsnone' => '(tsy misy)',
# Feedback
'feedback-subject' => 'Lohahevitra:',
diff --git a/languages/messages/MessagesMhr.php b/languages/messages/MessagesMhr.php
index 511c3c28..82899ba4 100644
--- a/languages/messages/MessagesMhr.php
+++ b/languages/messages/MessagesMhr.php
@@ -615,6 +615,9 @@ $messages = array(
'grouppage-bot' => '{{ns:project}}:Бот-влак',
'grouppage-sysop' => '{{ns:project}}:Сайтвиктарыше-влак',
+# Special:Log/newusers
+'newuserlogpage' => 'У пайдаланыше региÑтрацийым Ñртарыме журнал',
+
# User rights log
'rightslog' => 'Пайдаланышын кертыж нерген журнал',
@@ -792,9 +795,6 @@ $messages = array(
'activeusers-hidebots' => 'Бот-влакым шылташ',
'activeusers-hidesysops' => 'Сайтвиктарыше-влакым шылташ',
-# Special:Log/newusers
-'newuserlogpage' => 'У пайдаланыше региÑтрацийым Ñртарыме журнал',
-
# Special:ListGroupRights
'listgrouprights-members' => '(тӱшкаште улшо-влак)',
@@ -821,8 +821,6 @@ $messages = array(
'watching' => 'ЭÑкерымаш лӱмерыш ешарымаш...',
'unwatching' => 'ЭÑкерымаш лӱмер гыч шӧрымаш...',
-'enotif_newpagetext' => 'Тиде у лаштык.',
-
# Delete
'deletepage' => 'Лаштыкым шӧраш',
'delete-confirm' => 'Шӧраш "$1"',
diff --git a/languages/messages/MessagesMin.php b/languages/messages/MessagesMin.php
index 7dfdbaf2..8458822e 100644
--- a/languages/messages/MessagesMin.php
+++ b/languages/messages/MessagesMin.php
@@ -18,6 +18,11 @@
$fallback = 'id';
+$namespaceNames = array(
+ NS_FILE => 'Berkas',
+ NS_TEMPLATE => 'Templat',
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'Garih bawahi tautan:',
@@ -152,6 +157,7 @@ $messages = array(
'newwindow' => '(bukak di jendela baru)',
'cancel' => 'Batalkan',
'moredotdotdot' => 'Lainnyo...',
+'morenotlisted' => 'Salabiahnyo...',
'mypage' => 'Laman',
'mytalk' => 'Maota',
'anontalk' => 'Diskusi IP ko',
@@ -163,7 +169,6 @@ $messages = array(
'qbbrowse' => 'Jalajah',
'qbedit' => 'Suntiang',
'qbpageoptions' => 'Laman ko',
-'qbpageinfo' => 'Konteks',
'qbmyoptions' => 'Laman denai',
'qbspecialpages' => 'Laman istimewa',
'faq' => 'FAQ',
@@ -186,6 +191,7 @@ $messages = array(
'namespaces' => 'Ruang namo',
'variants' => 'Variasi',
+'navigation-heading' => 'Menu navigasi',
'errorpagetitle' => 'Kasalahan',
'returnto' => 'Baliak ka $1',
'tagline' => 'Dari {{SITENAME}}',
@@ -423,11 +429,10 @@ Pangurus nan manguncinyo manawarkan panjalehan: "$3"',
# Login and logout pages
'logouttext' => "'''Sanak alah kalua log dari sistem.'''
-Sanak dapek taruih manggunoan {{SITENAME}} sacaro anonim, atau Sanak dapek [[Special:UserLogin|masuak log liak]] sabagai pangguno nan samo atau pangguno nan lain.
+Sanak dapek taruih manggunoan {{SITENAME}} sacaro anonim, atau Sanak dapek <span class='plainlinks'>[$1 masuak log liak]</span> sabagai pangguno nan samo atau pangguno nan lain.
Parhatian bahawa bara laman mungkin masih taruih manunjukkan bahawa Sanak masih masuak log sampai Sanak mambarasihan singgahan panjelajah web Sanak.",
-'welcomecreation' => '== Salamaik datang, $1! ==
-
-Akun Sanak alah dibuek. Jan lupo mangatua setelan [[Special:Preferences|pangaturan {{SITENAME}}]] Sanak.',
+'welcomeuser' => 'Salamaik datang, $1!',
+'welcomecreation-msg' => 'Akun Sanak alah dibuek. Jan lupo maubah [[Special:Preferences|pangaturan {{SITENAME}}]] Sanak.',
'yourname' => 'Namo pangguno:',
'yourpassword' => 'Kato sandi:',
'yourpasswordagain' => 'Ulang baliak kato sandi:',
@@ -450,7 +455,7 @@ Akun Sanak alah dibuek. Jan lupo mangatua setelan [[Special:Preferences|pangatur
'gotaccount' => "Alah tadaftar sabagai pangguno? '''$1'''.",
'gotaccountlink' => 'Masuak log',
'userlogin-resetlink' => 'Lupo rincian info masuak Sanak?',
-'createaccountmail' => 'malalui surel',
+'createaccountmail' => 'Pakai kato sandi sumbarang samantaro, lalu kirim ka alamaik surel nan di bawah ko',
'createaccountreason' => 'Alasan:',
'badretype' => 'Kato sandi nan Sanak masuakan salah.',
'userexists' => 'Namo pangguno nan dipiliah alah tapakai.
@@ -522,6 +527,7 @@ Tunggulah sabanta sabalun mancubo baliak.',
# Email sending
'php-mail-error-unknown' => 'Kasalahan nan indak jaleh dalam fungsi mail() PHP',
'user-mail-no-addy' => 'Mancubo mangirim surel tanpa alamaik surel.',
+'user-mail-no-body' => 'Mancubo mangirim surel kosong atau pasan talalu pendek',
# Change password dialog
'resetpass' => 'Tuka kato sandi',
@@ -581,6 +587,7 @@ Sandi samantaro: $2',
'changeemail-oldemail' => 'Alamat surel kini:',
'changeemail-newemail' => 'Alamat surel baru:',
'changeemail-none' => '(indak ado)',
+'changeemail-password' => 'Sandi {{SITENAME}} Sanak:',
'changeemail-submit' => 'Ganti surel.',
'changeemail-cancel' => 'Batalkan',
@@ -758,7 +765,6 @@ Entri catatan tarakhir disadioan di bawah untuak referensi:",
'template-protected' => '(dilinduangi)',
'template-semiprotected' => '(palinduangan semi)',
'hiddencategories' => 'Laman ko marupokan kalompok dari {{PLURAL:$1|$1 kategori tapandam}}:',
-'nocreatetitle' => 'Pambuekan laman baharu dibatasi',
'nocreatetext' => '{{SITENAME}} lah mambatasi pambuekan laman-laman baru.
Sanak dapek baliak dan manyuntiang laman nan alah ado, atau [[Special:UserLogin|masuak log - mambuek akun]].',
'nocreate-loggedin' => 'Sanak ndak mampunyoi hak akses untuak mambuek laman baharu.',
@@ -783,6 +789,15 @@ Mungkin alah dihapuih.',
'edit-already-exists' => 'Indak dapek mambuek aman baru.
Nyo alah ado.',
'defaultmessagetext' => 'Teks baku.',
+'content-failed-to-parse' => 'Gagal manjabarkan konten $2 untuak model $1: $3',
+'invalid-content-data' => 'Data kanduangan indak valid.',
+'content-not-allowed-here' => 'Konten "$1" indak diizinan di laman [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'Teks wiki',
+'content-model-text' => 'Teks kosong',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Paringatan:''' Laman ko manganduang talalu banyak panggilan fungsi parser.
@@ -1072,9 +1087,9 @@ Pangambalian pangaturan indak dapek dibatalan.',
'prefs-emailconfirm-label' => 'Surel konfirmasi:',
'prefs-textboxsize' => 'Ukuran kotak suntiang',
'youremail' => 'Surel:',
-'username' => 'Namo pangguno:',
-'uid' => 'ID pangguno:',
-'prefs-memberingroups' => 'Anggota {{PLURAL:$1|kalompok}}:',
+'username' => '{{GENDER:$1|Namo pangguno}}:',
+'uid' => 'ID {{GENDER:$1|pangguno}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Anggota}} {{PLURAL:$1|kalompok}}:',
'prefs-registration' => 'Wakatu pandaftaran:',
'yourrealname' => 'Namo asli:',
'yourlanguage' => 'Bahaso',
@@ -1179,6 +1194,10 @@ Alamaik surel Sanak indakkan tau dek urang nan manghubuangi sanak tu.',
'right-reupload-own' => 'Manimpo berkas nan dimuek surang',
'right-suppressionlog' => 'Mancaliak log privat',
+# Special:Log/newusers
+'newuserlogpage' => 'Log pangguno baru',
+'newuserlogpagetext' => 'Di bawah ko log pandaftaran pangguno baru',
+
# User rights log
'rightslog' => 'Log parubahan hak akses',
@@ -1414,6 +1433,11 @@ Pariso dulu "pautan baliak" ka templat tasabuik sabalun manghapuihnyo.',
Laman tasabuik saharuihnyo bapauik ka topik-topik nan sasuai.<br />
Laman nan dianggap sabagai laman disambiguasi jikok laman tasabuik manggunoan templat nan tahubuang ka [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Laman jo laman properti',
+'pageswithprop-legend' => 'Laman jo laman properti',
+'pageswithprop-text' => 'Laman ko barisi daftar laman nan manggunoan properti laman tatantu.',
+'pageswithprop-prop' => 'Namo properti:',
+
'doubleredirects' => 'Pangaliahan gando',
'doubleredirectstext' => 'Laman ko mamuek daftar laman nan dialiahkan ka laman pangaliahan nan lain.
Satiok barih mamuek pautan ka pangaliahan partamo dan pangaliahan kadua sarato target dari pangaliahan kadua nan umumnyo adolah laman nan "sabananyo". Laman pangaliahan partamo saharuihnyo dialiahkan ka laman nan bukan marupoan laman pangaliahan.
@@ -1556,10 +1580,6 @@ Lihek pulo [[Special:WantedCategories|kategori nan diinginan]].',
'activeusers-hidesysops' => 'Suruakan panguruih',
'activeusers-noresult' => 'Pangguno indak basobok',
-# Special:Log/newusers
-'newuserlogpage' => 'Log pangguno baru',
-'newuserlogpagetext' => 'Di bawah ko log pandaftaran pangguno baru',
-
# Special:ListGroupRights
'listgrouprights' => 'Daftar kalompok pangguno',
'listgrouprights-summary' => 'Barikuik ko adolah daftar kalompok pangguno nan ado di wiki ko, jo daftar hak aksesnyo masiang-masiang. Informasi labih lanjuik masalah hak masiang-masiang dapek dijumpoi di [[{{MediaWiki:Listgrouprights-helppage}}|laman bantuan hak pangguno]].',
@@ -1710,7 +1730,7 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
'blanknamespace' => '(Utamo)',
# Contributions
-'contributions' => 'Jariah pangguno',
+'contributions' => 'Jariah {{GENDER:$1|pangguno}}',
'contributions-title' => 'Jariah pangguno untuak $1',
'mycontris' => 'Jariah',
'contribsub2' => 'Untuak $1 ($2)',
@@ -2024,11 +2044,13 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
'pageinfo-default-sort' => 'Kunci uruik baku',
'pageinfo-length' => 'Panjang laman (dalam bita)',
'pageinfo-article-id' => 'ID Laman',
+'pageinfo-language' => 'Bahaso isi laman',
'pageinfo-robot-policy' => 'Statuih masin pancari',
'pageinfo-robot-index' => 'Dapek di indeks',
'pageinfo-robot-noindex' => 'Indak dapek di indeks',
'pageinfo-views' => 'Bara kali dibaco',
'pageinfo-watchers' => 'Bara urang nan mambaco',
+'pageinfo-few-watchers' => 'Kurang dari $1 {{PLURAL:$1|pambaco}}',
'pageinfo-redirects-name' => 'Pangaliahan ka laman ko',
'pageinfo-subpages-name' => 'Sublaman dari laman ko',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|pangaliahan}}; $3 {{PLURAL:$3|bukan pangaliahan}})',
@@ -2043,6 +2065,19 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
'pageinfo-magic-words' => '{{PLURAL:$1|Kato}} ajaib ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategori}} tasuruak ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Templat}} nan ditransklusi ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Laman}} ditransklusi pado ($1)',
+'pageinfo-toolboxlink' => 'Informasi laman',
+'pageinfo-redirectsto' => 'Dialiahkan ka',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Dihituang sabagai laman konten',
+'pageinfo-contentpage-yes' => 'Yo',
+'pageinfo-protect-cascading' => 'Palinduangan baruruik dari siko',
+'pageinfo-protect-cascading-yes' => 'Yo',
+'pageinfo-protect-cascading-from' => 'Palinduangan baruruik dari',
+'pageinfo-category-info' => 'Kategori informasi',
+'pageinfo-category-pages' => 'Jumlah laman',
+'pageinfo-category-subcats' => 'Jumlah subkategori',
+'pageinfo-category-files' => 'Jumlah berkas',
# Skin names
'skinname-standard' => 'Klasik',
@@ -2081,6 +2116,7 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
'file-nohires' => 'Indak tasadio resolusi nan labiah gadang.',
'svg-long-desc' => 'Berkas SVG, $1 × $2 piksel, ukuran berkas: $3',
'svg-long-desc-animated' => 'Berkas anmasi SVG, $1 × $2 piksel, ukuran berkas: $3',
+'svg-long-error' => 'Berkas SVG indak sah: $1',
'show-big-image' => 'Resolusi panuah',
'show-big-image-preview' => 'Ukuran pratonton ko: $1',
'show-big-image-other' => '{{PLURAL:$2|Resolusi}} lainnyo: $1.',
@@ -2111,7 +2147,10 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
'minutes' => '{{PLURAL:$1|$1 minik}}',
'hours' => '{{PLURAL:$1|$1 jam}}',
'days' => '{{PLURAL:$1|$1 hari}}',
+'months' => '{{PLURAL:$1|$1 bulan}}',
+'years' => '{{PLURAL:$1|$1 taun}}',
'ago' => '$1 nan lalu',
+'just-now' => 'sabanta ko',
# Bad image list
'bad_image_list' => 'Formatnyo adolah sabagai barikuik:
@@ -2325,7 +2364,10 @@ Situs ko mangalami masalah teknis.',
'htmlform-required' => 'Nilai ko diparaluan',
# New logging system
-'newuserlog-byemail' => 'kato sandi dikirim malalui surel',
+'logentry-newusers-newusers' => 'Akun pangguno $1 lah dibuek',
+'logentry-newusers-create' => '$1 mambuek akun pangguno',
+'logentry-newusers-create2' => 'Akun pangguno $3 dibuek jo $1',
+'logentry-newusers-autocreate' => 'Akun $1 dibuek sacaro otomatis',
# Search suggestions
'searchsuggest-search' => 'Cari',
diff --git a/languages/messages/MessagesMk.php b/languages/messages/MessagesMk.php
index 63bbae2b..a7cd59b4 100644
--- a/languages/messages/MessagesMk.php
+++ b/languages/messages/MessagesMk.php
@@ -163,7 +163,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'СкорешниПромени' ),
'Recentchangeslinked' => array( 'ПоврзаниПромени' ),
'Revisiondelete' => array( 'БришењеРевизија' ),
- 'RevisionMove' => array( 'ПремеÑтиРевизија' ),
'Search' => array( 'Барај' ),
'Shortpages' => array( 'КраткиСтраници' ),
'Specialpages' => array( 'СпецијалниСтраници' ),
@@ -202,7 +201,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__СОСОДРЖИÐÐ__', '__FORCETOC__' ),
'toc' => array( '0', '__СОДРЖИÐÐ__', '__TOC__' ),
'noeditsection' => array( '0', '__БЕЗ_УРЕДУВÐЊЕ_ÐÐ_ПОДÐÐСЛОВИ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__БЕЗÐÐСЛОВ__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'ТЕКОВЕÐМЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'ТЕКОВЕÐМЕСЕЦ1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'ТЕКОВЕÐМЕСЕЦИМЕ', 'CURRENTMONTHNAME' ),
@@ -241,6 +239,7 @@ $magicWords = array(
'basepagename' => array( '1', 'ИМЕÐÐОСÐОВÐÐСТРÐÐИЦÐ', 'BASEPAGENAME' ),
'talkpagename' => array( '1', 'СТРÐÐИЦÐЗÐРÐЗГОВОР', 'TALKPAGENAME' ),
'subjectpagename' => array( '1', 'ИМЕÐÐСТÐТИЈÐ', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'msg' => array( '0', 'ПОР:', 'MSG:' ),
'subst' => array( '0', 'ЗÐМЕÐИ:', 'SUBST:' ),
'safesubst' => array( '0', 'БЕЗБЗÐМЕÐИ', 'SAFESUBST:' ),
'msgnw' => array( '0', 'ИЗВЕШТNW:', 'MSGNW:' ),
@@ -294,6 +293,9 @@ $magicWords = array(
'revisionuser' => array( '1', 'КОРИСÐИКÐÐÐÐРЕВИЗИЈÐ', 'REVISIONUSER' ),
'plural' => array( '0', 'ÐœÐОЖИÐÐ:', 'PLURAL:' ),
'fullurl' => array( '0', 'ПОЛÐÐURL:', 'FULLURL:' ),
+ 'fullurle' => array( '0', 'ПОЛÐÐURLE:', 'FULLURLE:' ),
+ 'canonicalurl' => array( '0', 'КÐÐОÐСКÐURL:', 'CANONICALURL:' ),
+ 'canonicalurle' => array( '0', 'КÐÐОÐСКÐURLE:', 'CANONICALURLE:' ),
'lcfirst' => array( '0', 'ПРВОМБ', 'LCFIRST:' ),
'ucfirst' => array( '0', 'ПРВОГБ', 'UCFIRST:' ),
'lc' => array( '0', 'МБ', 'LC:' ),
@@ -328,7 +330,7 @@ $magicWords = array(
'numberingroup' => array( '1', 'БРОЈВОГРУПÐ', 'NUMBERINGROUP', 'NUMINGROUP' ),
'staticredirect' => array( '1', '__СТÐТИЧÐОПРЕÐÐСОЧУВÐЊЕ__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'ÐИВОÐÐЗÐШТИТÐ', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'форматнадатум', 'formatdate', 'dateformat' ),
+ 'formatdate' => array( '0', 'форматдатум', 'formatdate', 'dateformat' ),
'url_path' => array( '0', 'ПÐТЕКÐ', 'PATH' ),
'url_wiki' => array( '0', 'ВИКИ', 'WIKI' ),
'url_query' => array( '0', 'БÐРÐЊЕ', 'QUERY' ),
@@ -480,6 +482,7 @@ $messages = array(
'newwindow' => '(Ñе отвора во нов прозорец)',
'cancel' => 'Откажи',
'moredotdotdot' => 'Повеќе...',
+'morenotlisted' => 'Повеќе (вон ÑпиÑокот)...',
'mypage' => 'Страница',
'mytalk' => 'Разговор',
'anontalk' => 'Разговор за оваа IP-адреÑа',
@@ -491,7 +494,6 @@ $messages = array(
'qbbrowse' => 'ПрелиÑтај',
'qbedit' => 'Уреди',
'qbpageoptions' => 'Оваа Ñтраница',
-'qbpageinfo' => 'Содржина на Ñтраница',
'qbmyoptions' => 'Мои Ñтраници',
'qbspecialpages' => 'Специјални Ñтраници',
'faq' => 'ЧПП',
@@ -514,6 +516,7 @@ $messages = array(
'namespaces' => 'ИменÑки проÑтори',
'variants' => 'Варијанти',
+'navigation-heading' => 'Ðавигационо мени',
'errorpagetitle' => 'Грешка',
'returnto' => 'Ðазад на $1.',
'tagline' => 'Од {{SITENAME}}',
@@ -761,11 +764,11 @@ $2',
# Login and logout pages
'logouttext' => "'''Сега Ñте одјавени.'''
-Можете да продолжите Ñо кориÑтење на {{SITENAME}} анонимно или можете [[Special:UserLogin|повторно да Ñе најавите]] под иÑто или различно кориÑничко име.
+Можете да продолжите Ñо кориÑтење на {{SITENAME}} анонимно или можете <span class='plainlinks'>[$1 повторно да Ñе најавите]</span> под иÑто или различно кориÑничко име.
Да напоменеме дека некои Ñтраници може да продолжат да Ñе прикажуваат како да Ñте најавени, Ñе додека не го иÑчиÑтите кешот на вашиот прелиÑтувач.",
-'welcomecreation' => '== Добредојдовте, $1! ==
-Вашата кориÑничка Ñметка е Ñоздадена.
-Ðе заборавајте да ги измените вашите [[Special:Preferences|нагодувања]].',
+'welcomeuser' => 'Добр едојдовте, $1!',
+'welcomecreation-msg' => 'Вашата кориÑничка Ñметка е Ñоздадена.
+Ðе заборавајте да ги измените вашите [[Special:Preferences|{{SITENAME}} нагодувања]].',
'yourname' => 'КориÑничко име:',
'yourpassword' => 'Лозинка:',
'yourpasswordagain' => 'Повторете ја лозинката:',
@@ -788,7 +791,7 @@ $2',
'gotaccount' => "Веќе имате кориÑничка Ñметка? '''$1'''.",
'gotaccountlink' => 'Ðајавете Ñе',
'userlogin-resetlink' => 'Си ги заборавивте податоците за најава?',
-'createaccountmail' => 'по е-пошта',
+'createaccountmail' => 'Дај привремена произволна лозинка и иÑпрати ја на долунаведената адреÑа',
'createaccountreason' => 'Причина:',
'badretype' => 'ВнеÑените лозинки не Ñе Ñовпаѓаат.',
'userexists' => 'КориÑничкото име што го внеÑовте е зафатено.
@@ -866,6 +869,7 @@ $2',
# Email sending
'php-mail-error-unknown' => 'Ðепозната грешка во функцијата mail() на PHP',
'user-mail-no-addy' => 'Се обидовте да иÑпратите порака без да внеÑете адреÑа',
+'user-mail-no-body' => 'Се обидовте да иÑпратите пиÑмо кое е празно или Ñо неразумно куÑа Ñодржина.',
# Change password dialog
'resetpass' => 'Промена на лозинка',
@@ -921,7 +925,7 @@ $2
Привремена лозинка: $2',
'passwordreset-emailsent' => 'ИÑпратено е пиÑмо за измена на лозинката.',
'passwordreset-emailsent-capture' => 'ИÑпратено е пиÑмо за измена на лозинката (прикажано подолу).',
-'passwordreset-emailerror-capture' => 'Создадено е пиÑмо за измена на лозинката (прикажано подолу), но не уÑпеав да го иÑпратам на {{GENDER:$2|кориÑникот}}: $1',
+'passwordreset-emailerror-capture' => 'Создадено е пиÑмо за измена на лозинката (прикажано подолу), но не уÑпеав да го иÑпратам на кориÑникот: $1',
# Special:ChangeEmail
'changeemail' => 'Смени е-пошта',
@@ -931,6 +935,7 @@ $2
'changeemail-oldemail' => 'Тековна е-пошта:',
'changeemail-newemail' => 'Ðова е-пошта:',
'changeemail-none' => '(нема)',
+'changeemail-password' => 'Вашата лозинка на {{SITENAME}}:',
'changeemail-submit' => 'Смени е-пошта',
'changeemail-cancel' => 'Откажи',
@@ -1118,7 +1123,6 @@ $2
'template-semiprotected' => '(полузаштитен)',
'hiddencategories' => 'Оваа Ñтраница припаѓа на {{PLURAL:$1|1 Ñкриена категорија|$1 Ñкриени категории}}:',
'edittools' => '<!-- Овој текÑÑ‚ ќе Ñе прикаже под обраÑците за уредување и подигање. -->',
-'nocreatetitle' => 'Создавањето на нови Ñтраници е ограничено',
'nocreatetext' => '{{SITENAME}} ја има ограничено можноÑта за Ñоздавање нови Ñтраници.
Можете да Ñе вратите назад и да уредувате поÑтоечка Ñтраница или [[Special:UserLogin|најавете Ñе или Ñоздајте нова кориÑничка Ñметка]].',
'nocreate-loggedin' => 'Ðемате дозвола да Ñоздавате нови Ñтраници.',
@@ -1143,6 +1147,15 @@ $2
'edit-already-exists' => 'Ðе може да Ñе Ñоздаде нова Ñтраница.
ИÑтата веќе поÑтои.',
'defaultmessagetext' => 'ТекÑÑ‚ на пораката по оÑновно',
+'content-failed-to-parse' => 'Ðе уÑпеав да ја предадам Ñодржината од типот $2 за моделот $1: $3',
+'invalid-content-data' => 'Ðеважечки податоци од Ñодржината',
+'content-not-allowed-here' => 'Содржините од моделот „$1“ не Ñе допуштени на Ñтраницата [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'викитекÑÑ‚',
+'content-model-text' => 'проÑÑ‚ текÑÑ‚',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Предупредување: Оваа Ñтраница кориÑти премногу повикувања на parser функции.
@@ -1506,9 +1519,9 @@ $1",
'prefs-emailconfirm-label' => 'Потврда на е-пошта:',
'prefs-textboxsize' => 'Големина на полето за уредување',
'youremail' => 'Е-пошта:',
-'username' => 'КориÑничко име:',
-'uid' => 'КориÑнички број:',
-'prefs-memberingroups' => 'Член на {{PLURAL:$1|групата|групите}}:',
+'username' => '{{GENDER:$1|КориÑничко име}}:',
+'uid' => '{{GENDER:$1|КориÑнички бр.}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Член}} на {{PLURAL:$1|групата|групите}}:',
'prefs-registration' => 'Време на региÑтрација:',
'yourrealname' => 'ВиÑтинÑко име:',
'yourlanguage' => 'Јазик:',
@@ -1660,12 +1673,13 @@ $1",
'right-sendemail' => 'ИÑпраќање на е-пошта до други кориÑници',
'right-passwordreset' => 'Преглед на пораки по е-пошта за промена на лозинка',
+# Special:Log/newusers
+'newuserlogpage' => 'Дневник на региÑтрирања на кориÑници',
+'newuserlogpagetext' => 'Ова е дневник на региÑтрирани кориÑници.',
+
# User rights log
'rightslog' => 'Дневник на кориÑничките права',
'rightslogtext' => 'Ова е дневник на промени на кориÑнички права.',
-'rightslogentry' => 'Променето членÑтво во група за $1 од $2 во $3',
-'rightslogentry-autopromote' => 'е автоматÑки унапреден од $2 во $3',
-'rightsnone' => '(нема)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'читање на оваа Ñтраница',
@@ -1912,6 +1926,7 @@ $1',
'backend-fail-notsame' => 'Веќе поÑтои неиÑтоветна податотека - $1.',
'backend-fail-invalidpath' => '$1 не е важечка патека за Ñкладирање.',
'backend-fail-delete' => 'Ðе можев да ја избришам податотеката $1.',
+'backend-fail-describe' => 'Ðе можев да ги изменам метаподатоците за податотеката „$1“.',
'backend-fail-alreadyexists' => 'Податотеката $1 веќе поÑтои.',
'backend-fail-store' => 'Ðе можев да ја Ñкладирам податотеката $1 во $2.',
'backend-fail-copy' => 'Ðе можев да ја иÑкопирам податотеката $1 во $2.',
@@ -2151,6 +2166,12 @@ $1',
ÐамеÑто тоа, може да имаат врÑка до поÑоодветна Ñтраница.<br />
Една Ñтраница Ñе Ñмета за појаÑнителна ако го кориÑти шаблонот што води од [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'Страници Ñо ÑвојÑтво',
+'pageswithprop-legend' => 'Страници Ñо ÑвојÑтво',
+'pageswithprop-text' => 'Ðа Ñтраницава Ñе наведени Ñтраници што кориÑтат дадено ÑвојÑтво.',
+'pageswithprop-prop' => 'Име на ÑвојÑтвото:',
+'pageswithprop-submit' => 'Оди',
+
'doubleredirects' => 'Двојни пренаÑочувања',
'doubleredirectstext' => 'Оваа Ñтраница ги прикажува пренаÑочувачките Ñтраници до други пренаÑочувачки Ñтраници.
Секој ред Ñодржи врÑки кон првото и второто пренаÑочување, како и целта на второто пренаÑочување, кое обично ја поÑочува <i>виÑтинÑката</i> целна Ñтраница кон која првото пренаÑочување би требало да наÑочува.
@@ -2306,7 +2327,7 @@ $1',
'linksearch-ok' => 'Барај',
'linksearch-text' => 'Може да Ñе кориÑтат џокери, како на „*.wikipedia.org“.
Бара барем највиÑок домен, како на пр. „*.org“.<br />
-Поддржани протоколи: <code>$1</code> (задава http:// ако не укажете протокол).',
+{{PLURAL:$2|Поддржан протокол|Поддржани протоколи}}: <code>$1</code> (задава http:// ако не укажете протокол).',
'linksearch-line' => '$1 врÑка во $2',
'linksearch-error' => 'Ðокер-знаците може да Ñе кориÑтат Ñамо на почетокот во името на домаќинот.',
@@ -2325,10 +2346,6 @@ $1',
'activeusers-hidesysops' => 'Скриј админиÑтратори',
'activeusers-noresult' => 'Ðема пронајдено кориÑници.',
-# Special:Log/newusers
-'newuserlogpage' => 'Дневник на региÑтрирања на кориÑници',
-'newuserlogpagetext' => 'Ова е дневник на региÑтрирани кориÑници.',
-
# Special:ListGroupRights
'listgrouprights' => 'Права на кориÑнички групи',
'listgrouprights-summary' => 'Следи ÑпиÑок на кориÑнички групи утврдени на ова вики, заедно Ñо нивните придружни права на приÑтап.
@@ -2423,18 +2440,23 @@ $1',
'enotif_mailer' => '{{SITENAME}} СиÑтем за извеÑтување',
'enotif_reset' => 'Означи ги Ñите Ñтраници како поÑетени',
-'enotif_newpagetext' => 'Ова е нова Ñтраница.',
'enotif_impersonal_salutation' => 'Википедија кориÑник',
-'changed' => 'изменета',
-'created' => 'Ñоздадена',
-'enotif_subject' => 'Страницата $PAGETITLE на {{SITENAME}} беше $CHANGEDORCREATED од $PAGEEDITOR',
+'enotif_subject_deleted' => 'Страницата $1 на {{SITENAME}} е избришана од {{gender:$2|$2}}',
+'enotif_subject_created' => 'Страницата $1 на {{SITENAME}} е Ñоздадена од {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Страницата $1 на {{SITENAME}} е премеÑтена од {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Страницата $1 на {{SITENAME}} е повратена од {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Страницата $1 на {{SITENAME}} е изменета од {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Страницата $1 на {{SITENAME}} е избришана на $PAGEEDITDATE од {{gender:$2|$2}}. Погл. $3.',
+'enotif_body_intro_created' => 'Страницата $1 на {{SITENAME}} е Ñоздадена на $PAGEEDITDATE од {{gender:$2|$2}}. Тековната ревизија ќе ја најдете на $3.',
+'enotif_body_intro_moved' => 'Страницата $1 на {{SITENAME}} е премеÑтена на $PAGEEDITDATE од {{gender:$2|$2}}. Тековната ревизија ќе ја најдете на $3.',
+'enotif_body_intro_restored' => 'Страницата $1 на {{SITENAME}} е повратена на $PAGEEDITDATE од {{gender:$2|$2}}. Тековната ревизија ќе ја најдете на $3.',
+'enotif_body_intro_changed' => 'Страницата $1 на {{SITENAME}} е изменета на $PAGEEDITDATE од {{gender:$2|$2}}. Тековната ревизија ќе ја најдете на $3.',
'enotif_lastvisited' => 'Видете $1 за Ñите промени од вашата поÑледна поÑета.',
'enotif_lastdiff' => 'Видете $1 за да ја видите оваа промена.',
'enotif_anon_editor' => 'анонимен кориÑник $1',
'enotif_body' => 'Почитуван(а) $WATCHINGUSERNAME,
-
-Ðа $PAGEEDITDATE е $CHANGEDORCREATED Ñтраницата „$PAGETITLE“ на проектот {{SITENAME}}. Измената ја изврши $PAGEEDITOR. Погледајте ја тековната верзија на $PAGETITLE_URL.
+$PAGEINTRO $NEWPAGE
$NEWPAGE
@@ -2447,7 +2469,7 @@ $NEWPAGE
Повеќе нема да добивате извеÑтувања во Ñлучај на други понатамошни промени, оÑвен ако не ја поÑетите оваа Ñтраница.
Можете и да ги поништите ознаките за извеÑтување за Ñите набљудувани Ñтраници на вашиот ÑпиÑок на набљудувања.
- СиÑтемот за извеÑтување на {{SITENAME}}
+ИзвеÑтителниот ÑиÑтем на {{SITENAME}}
--
Ðко Ñакате да ги измените нагодувањата за извеÑтување по е-пошта, поÑетете ја Ñтраницата
@@ -2459,8 +2481,10 @@ $NEWPAGE
За да ја избришете Ñтраницата од ÑпиÑокот на набљудувања, поÑетете ја Ñтраницата
$UNWATCHURL
-Повратни информации и помош:
+Ваши миÑлења, прашања и повеќе помош:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'Ñоздадена',
+'changed' => 'изменета',
# Delete
'deletepage' => 'Избриши Ñтраница',
@@ -2532,6 +2556,8 @@ $UNWATCHURL
'prot_1movedto2' => '[[$1]] премеÑтена како [[$2]]',
'protect-badnamespace-title' => 'Ðезаштитлив именÑки проÑтор',
'protect-badnamespace-text' => 'Страниците во овој именÑки проÑтор не можат да Ñе заштитуваат.',
+'protect-norestrictiontypes-text' => 'Страницава не може да Ñе заштити бидејќи нема раÑположиви типови на ограничување.',
+'protect-norestrictiontypes-title' => 'Ðезаштитливи Ñтраници',
'protect-legend' => 'Потврдете ја заштитата',
'protectcomment' => 'Причина:',
'protectexpiry' => 'ИÑтекува:',
@@ -2618,7 +2644,8 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|1 измена е обновена|$1 измени Ñе обновени}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 измена|$1 измени}} и {{PLURAL:$2|1 податотека|$2 податотеки}} Ñе вратени',
'undeletedfiles' => '{{PLURAL:$1|1 податотека е вратена|$1 податотеки Ñе вратени}}',
-'cannotundelete' => 'Враќањето не уÑпеа. Можеби некој друг веќе ја вратил Ñтраницата.',
+'cannotundelete' => 'Враќањето не уÑпеа:
+$1',
'undeletedpage' => "'''$1 беше обновена'''
Погледнете го [[Special:Log/delete|дневникот на бришења]] за Ð¿Ð¾Ð¿Ð¸Ñ Ð½Ð° претходни бришења и обновувања.",
@@ -2650,7 +2677,7 @@ $1',
'blanknamespace' => '(Главен)',
# Contributions
-'contributions' => 'КориÑнички придонеÑи',
+'contributions' => '{{GENDER:$1|КориÑнички}} придонеÑи',
'contributions-title' => 'ПридонеÑи на кориÑникот $1',
'mycontris' => 'придонеÑи',
'contribsub2' => 'За $1 ($2)',
@@ -2927,6 +2954,7 @@ $1',
'immobile-target-namespace-iw' => 'Меѓувики-врÑка не може да Ñе кориÑти за преименување на Ñтраници.',
'immobile-source-page' => 'Оваа Ñтраница не може да Ñе премеÑтува.',
'immobile-target-page' => 'Ðе може да Ñе премеÑти под бараниот наÑлов.',
+'bad-target-model' => 'Саканата одредница кориÑти друг ÑодржинÑки модел. Ðе можам да претворам од $1 во $2.',
'imagenocrossnamespace' => 'Ðе може да Ñе премеÑти податотека во неподатотечен именÑки проÑтор',
'nonfile-cannot-move-to-file' => 'Ðе можам да премеÑтам неподатотека во податотечен именÑки проÑтор',
'imagetypemismatch' => 'Ðовата наÑтавка на податотеката не ÑоодветÑтвува на нејзиниот тип',
@@ -3042,6 +3070,7 @@ $1',
'import-error-interwiki' => 'Страницата „$1“ не е увезена бидејќи името е резервирано за надворешни врÑки (меѓувики).',
'import-error-special' => 'Страницата „$1“ не е увезена бидејќи припаѓа на поÑебен именÑки проÑтор што не дозволува Ñтраници.',
'import-error-invalid' => 'Страницата „$1“ не е увезена бидејќи името Ñ Ðµ неважечко.',
+'import-error-unserialize' => 'Ревизијата $2 на Ñтраницата „$1“ не може да Ñе отÑеријализира. Утврдено е дека кориÑти ÑодржинÑкиот модел $3 што е Ñеријализиран како $4.',
'import-options-wrong' => '{{PLURAL:$2|Погрешна можноÑÑ‚|Погрешни можноÑти}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Укажаната оÑновна Ñтраница е неважечки наÑлов.',
'import-rootpage-nosubpage' => 'ИменÑкиот проÑтор „$1“ на оÑновната Ñтраница не допушта потÑтраници.',
@@ -3056,7 +3085,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'Проба на JavaScript',
-'javascripttest-disabled' => 'Функцијата не е овозможена на ова вики.',
'javascripttest-title' => 'Вршам $1 проби',
'javascripttest-pagetext-noframework' => 'Оваа Ñтраница е резервирана за вршење на проби Ñо JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Ðепозната рамка „$1“.',
@@ -3205,11 +3233,13 @@ $1',
'pageinfo-default-sort' => 'ОÑновен подредбен клуч',
'pageinfo-length' => 'Должина на Ñтраницата (во бајти)',
'pageinfo-article-id' => 'Ðазнака на Ñтраницата',
+'pageinfo-language' => 'Јазик на Ñодржината на Ñтраницата',
'pageinfo-robot-policy' => 'Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð½Ð° прелиÑтувачот',
'pageinfo-robot-index' => 'Се индекÑира',
'pageinfo-robot-noindex' => 'Ðе Ñе индекÑира',
'pageinfo-views' => 'Број на поÑети',
'pageinfo-watchers' => 'Број на набљудувачи',
+'pageinfo-few-watchers' => 'Помалку од $1 {{PLURAL:$1|набљудувач|набљудувачи}}',
'pageinfo-redirects-name' => 'ПренаÑочувања кон Ñтраницата',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'ПотÑтраници на Ñтраницата',
@@ -3225,6 +3255,19 @@ $1',
'pageinfo-magic-words' => '{{PLURAL:$1|Волшебен збор|Волшебни зборови}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Скриена категорија|Скриени категории}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Превметнат шаблон|Превметнати шаблони}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Превметната Ñтраница|Превметнати Ñтраници}} на ($1)',
+'pageinfo-toolboxlink' => 'Информации за Ñтраницата',
+'pageinfo-redirectsto' => 'ПренаÑочува кон',
+'pageinfo-redirectsto-info' => 'инфо',
+'pageinfo-contentpage' => 'Се вбројува во ÑодржинÑки Ñтраници',
+'pageinfo-contentpage-yes' => 'Да',
+'pageinfo-protect-cascading' => 'КаÑкадната заштита на Ñтраниците важи од тука',
+'pageinfo-protect-cascading-yes' => 'Да',
+'pageinfo-protect-cascading-from' => 'Страници Ñо каÑкадна заштита од',
+'pageinfo-category-info' => 'Информации за категоријата',
+'pageinfo-category-pages' => 'Број на Ñтраници',
+'pageinfo-category-subcats' => 'Број на поткатегории',
+'pageinfo-category-files' => 'Број на податотеки',
# Skin names
'skinname-standard' => 'КлаÑично',
@@ -3247,6 +3290,8 @@ $1',
'markedaspatrollederror' => 'Ðе можам да означам како проверена',
'markedaspatrollederrortext' => 'Морате да внеÑете верзија за да ја означите како проверена.',
'markedaspatrollederror-noautopatrol' => 'Ðе можете да ги означите Ñвоите промени како проверени.',
+'markedaspatrollednotify' => 'Оваа измена на $1 е означена како иÑпатролирана.',
+'markedaspatrollederrornotify' => 'Означувањето како иÑпатролирано не уÑпеа.',
# Patrol log
'patrol-log-page' => 'Дневник на патролирања',
@@ -3281,6 +3326,7 @@ $1',
'file-nohires' => 'Ðе е доÑтапна поголема резолуција.',
'svg-long-desc' => 'SVG податотека, номинално $1 × $2 пикÑели, големина: $3',
'svg-long-desc-animated' => 'Ðнимирана SVG-податотека, номинално: $1 × $2 пикÑели, големина: $3',
+'svg-long-error' => 'Ðеважечка SVG-податотека: $1',
'show-big-image' => 'ВиÑтинÑка големина',
'show-big-image-preview' => 'Големина на овој преглед: $1.',
'show-big-image-other' => '{{PLURAL:$2|Друга резолуција|Други резолуции}}: $1.',
@@ -3315,7 +3361,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 минута|$1 минути}}',
'hours' => '{{PLURAL:$1|$1 чаÑ|$1 чаÑа}}',
'days' => '{{PLURAL:$1|$1 ден|$1 дена}}',
+'months' => '{{PLURAL:$1|$1 меÑец|$1 меÑеци}}',
+'years' => '{{PLURAL:$1|$1 година|$1 години}}',
'ago' => 'пред $1',
+'just-now' => 'Штотуку',
# Bad image list
'bad_image_list' => 'Форматот е Ñледниот:
@@ -3876,6 +3925,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[Превметнувањето помеѓу викијата е оневозможено]',
'scarytranscludefailed' => '[Преземањето на шаблонот за $1 не уÑпеа]',
+'scarytranscludefailed-httpstatus' => '[Преземањето на шаблонот не уÑпеа за $1: HTTP $2]',
'scarytranscludetoolong' => '[Премногу долго URL]',
# Delete conflict
@@ -4074,6 +4124,7 @@ $5
'version-license' => 'Лиценца',
'version-poweredby-credits' => "Ова вики работи на '''[//www.mediawiki.org/ МедијаВики]''', авторÑки права © 2001-$1 $2.",
'version-poweredby-others' => 'други',
+'version-credits-summary' => 'Би Ñакале да им Ñе заблагодариме на Ñледниве лица за нивните придонеÑи кон [[Special:Version|МедијаВики]].',
'version-license-info' => 'МедијаВики е Ñлободна програмÑка опрема; можете да ја редиÑтрибуирате и/или менувате под уÑловите на ГÐУ-овата општа јавна лиценца на Фондацијата за Ñлободна програмÑка опрема; или верзија 2 на Лиценцата, или некоја понова верзија (по ваш избор).
МедијаВики Ñе нуди Ñо надеж дека ќе биде од кориÑÑ‚, но БЕЗ БИЛО КÐКВРГÐРÐÐЦИЈÐ; дури и без подразбраната гаранција за ПРОДÐЖÐРВРЕДÐОСТ или ПОГОДÐОСТ ЗРДÐДЕÐРЦЕЛ. За повеќе информации, погледајте ја ГÐУ-овата општа јавна лиценца.
@@ -4189,17 +4240,17 @@ $5
'sqlite-no-fts' => '$1 без поддршка за пребарување по цели текÑтови',
# New logging system
-'logentry-delete-delete' => '$1 ја избриша Ñтраницата $3',
-'logentry-delete-restore' => '$1 ја возобнови Ñтраницата $3',
-'logentry-delete-event' => '$1 ја измени видливоÑта на {{PLURAL:$5|наÑтан во дневникот|$5 наÑтани во дневникот}} на $3: $4',
-'logentry-delete-revision' => '$1 ја измени видливоÑта на {{PLURAL:$5|ревизија|$5 ревизии}} на Ñтраницата $3: $4',
-'logentry-delete-event-legacy' => '$1 ја измени видливоÑта на наÑтани во дневникот на $3',
-'logentry-delete-revision-legacy' => '$1 ја измени видливоÑта на ревизии на Ñтраницата $3',
-'logentry-suppress-delete' => '$1 ја притаи Ñтраницата $3',
-'logentry-suppress-event' => '$1 потајно ја измени видливоÑта на {{PLURAL:$5|наÑтан во дневниот|$5 наÑтани во дневниот}} on $3: $4',
-'logentry-suppress-revision' => '$1 потајно ја измени видливоÑта на {{PLURAL:$5|ревизија|$5 ревизии}} на Ñтраницата $3: $4',
-'logentry-suppress-event-legacy' => '$1 потајно ја измени видливоÑта на наÑтани во дневникот на $3',
-'logentry-suppress-revision-legacy' => '$1 потајно ја измени видливоÑта на ревизии на Ñтраницата $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|ја избриша}} Ñтраницата $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|ја возобнови}} Ñтраницата $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|ја измени}} видливоÑта на {{PLURAL:$5|наÑтан во дневникот|$5 наÑтани во дневникот}} на $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ја измени}} видливоÑта на {{PLURAL:$5|ревизија|$5 ревизии}} на Ñтраницата $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|ја измени}} видливоÑта на наÑтаните во дневникот на $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|ја измени}} видливоÑта на ревизии на Ñтраницата $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|ја притаи}} Ñтраницата $3',
+'logentry-suppress-event' => '$1 потајно {{GENDER:$2|ја измени}} видливоÑта на {{PLURAL:$5|наÑтан во дневникот|$5 наÑтани во дневникот}} на $3: $4',
+'logentry-suppress-revision' => '$1 потајно {{GENDER:$2|ја измени}} видливоÑта на {{PLURAL:$5|ревизија|$5 ревизии}} на Ñтраницата $3: $4',
+'logentry-suppress-event-legacy' => '$1 потајно {{GENDER:$2|ја измени}} видливоÑта на наÑтани во дневникот на $3',
+'logentry-suppress-revision-legacy' => '$1 потајно {{GENDER:$2|ја измени}} видливоÑта на ревизии на Ñтраницата $3',
'revdelete-content-hid' => 'Ñодржината е Ñкриена',
'revdelete-summary-hid' => 'опиÑот на уредувањето е Ñкриен',
'revdelete-uname-hid' => 'кориÑничкото име е Ñкриено',
@@ -4208,17 +4259,21 @@ $5
'revdelete-uname-unhid' => 'кориÑничкото име е Ñкриено',
'revdelete-restricted' => 'применети ограничувања на админиÑтратори',
'revdelete-unrestricted' => 'отÑтранети ограничувања за ÑиÑтем оператори',
-'logentry-move-move' => '$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-patrol-patrol' => '$1 ја означи ревизијата $4 на Ñтраницата $3 како иÑпатролирана',
-'logentry-patrol-patrol-auto' => '$1 автоматÑки ја означи ревизијата $4 на Ñтраницата $3 како иÑпатролирана',
-'logentry-newusers-newusers' => 'Ðаправена е кориÑничката Ñметка $1',
-'logentry-newusers-create' => 'Ðаправена е кориÑничката Ñметка $1',
-'logentry-newusers-create2' => 'Ðаправена е кориÑничката Ñметка $3; Ñоздавач: $1',
-'logentry-newusers-autocreate' => 'Сметката $1 е Ñоздадена автоматÑки',
-'newuserlog-byemail' => 'иÑпратена лозинка по е-пошта',
+'logentry-move-move' => '$1 {{GENDER:$2|ја премеÑти}} Ñтраницата $3 на $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|ја премеÑти}} Ñтраницата $3 на $4 без да оÑтави пренаÑочување',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|ја премеÑти}} Ñтраницата $3 на $4 презапишувајќи врз пренаÑочување',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|ја премеÑти}} Ñтраницата $3 на $4 презапишувајќи врз пренаÑочување без да оÑтави пренаÑочување',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|ја означи}} ревизијата $4 на Ñтраницата $3 како иÑпатролирана',
+'logentry-patrol-patrol-auto' => '$1 автоматÑки {{GENDER:$2|ја означи}} ревизијата $4 на Ñтраницата $3 како иÑпатролирана',
+'logentry-newusers-newusers' => '{{GENDER:$2|Ðаправена}} кориÑничката Ñметка $1',
+'logentry-newusers-create' => '{{GENDER:$2|Ðаправена}} кориÑничката Ñметка $1',
+'logentry-newusers-create2' => '{{GENDER:$2|Ðаправена}} кориÑничката Ñметка $3 од $1',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|ја направи}} кориÑничката Ñметка $3. Лозинката ви ја иÑпративме по е-пошта',
+'logentry-newusers-autocreate' => 'ÐвтоматÑки {{GENDER:$2|Ñоздадена}} кориÑничката Ñметка $1',
+'logentry-rights-rights' => '$1 {{GENDER:$2|го измени}} групното членÑтво на $3 од $4 во $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|го измени}} групното членÑтво во $3',
+'logentry-rights-autopromote' => '$1 автоматÑки {{GENDER:$2|унапреден|унапредена}} од $4 во $5',
+'rightsnone' => '(нема)',
# Feedback
'feedback-bugornote' => 'Ðко Ñте Ñпремни подробно да го опишете техничкиот проблем, тогаш [$1 пријавете грешка].
@@ -4272,6 +4327,7 @@ $5
'api-error-ok-but-empty' => 'Внатрешна грешка: опÑлужувачот не одговара.',
'api-error-overwrite' => 'Презапишувањето врз поÑтоечки податотеки не е дозволено.',
'api-error-stashfailed' => 'Внатрешна грешка: ОпÑлужувачот не уÑпеа да ја Ñкладира привремената податотека.',
+'api-error-publishfailed' => 'Внатрешна грешка: ОпÑлужувачот не уÑпеа да ја објави привремената податотека.',
'api-error-timeout' => 'ОпÑлужувачот не одговори во очекуваното време.',
'api-error-unclassified' => 'Се појави непозната грешка.',
'api-error-unknown-code' => 'Ðепозната грешка: „$1“',
@@ -4292,4 +4348,7 @@ $5
'duration-centuries' => '$1 {{PLURAL:$1|век|века}}',
'duration-millennia' => '$1 {{PLURAL:$1|милениум|милениуми}}',
+# Image rotation
+'rotate-comment' => 'Сликата е завртена за $1 {{PLURAL:$1|Ñтепен|Ñтепени}} вдеÑно',
+
);
diff --git a/languages/messages/MessagesMl.php b/languages/messages/MessagesMl.php
index d58b48b5..2116c900 100644
--- a/languages/messages/MessagesMl.php
+++ b/languages/messages/MessagesMl.php
@@ -121,12 +121,13 @@ $specialPageAliases = array(
'Listusers' => array( 'ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ†_പടàµà´Ÿà´¿à´•' ),
'Lockdb' => array( 'à´¡à´¿.ബി.ബനàµà´§à´¿à´•àµà´•àµà´•' ),
'Log' => array( 'രേഖ', 'രേഖകൾ' ),
- 'Lonelypages' => array( 'അനാഥ_താളàµà´•àµ¾' ),
- 'Longpages' => array( 'വലിയ_താളàµà´•àµ¾' ),
+ 'Lonelypages' => array( 'അനാഥതാളàµà´•àµ¾' ),
+ 'Longpages' => array( 'വലിയതാളàµà´•àµ¾' ),
'MergeHistory' => array( 'നാൾവഴിലയിപàµà´ªà´¿à´•àµà´•àµà´•' ),
'MIMEsearch' => array( 'മൈംതിരയൽ' ),
'Mostcategories' => array( 'കൂടàµà´¤àµ½_വർഗàµà´—à´™àµà´™àµ¾' ),
'Mostimages' => array( 'കൂടàµà´¤àµ½_à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³_à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾', 'കൂടàµà´¤àµ½_à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾', 'കൂടàµà´¤àµ½_à´šà´¿à´¤àµà´°à´™àµà´™àµ¾' ),
+ 'Mostinterwikis' => array( 'à´à´±àµà´±à´µàµà´®à´§à´¿à´•à´®à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿à´•àµ¾' ),
'Mostlinked' => array( 'കൂടàµà´¤àµ½_à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³_താളàµà´•àµ¾', 'കൂടàµà´¤àµ½_à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³à´µ' ),
'Mostlinkedcategories' => array( 'കൂടàµà´¤àµ½_à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³_വർഗàµà´—à´™àµà´™àµ¾', 'കൂടàµà´¤àµ½_ഉപയോഗിചàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³_വർഗàµà´—à´™àµà´™àµ¾' ),
'Mostlinkedtemplates' => array( 'കൂടàµà´¤àµ½_à´•à´£àµà´£à´¿à´•à´³àµà´³àµà´³_ഫലകങàµà´™àµ¾', 'കൂടàµà´¤àµ½_ഉപയോഗിചàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³_ഫലകങàµà´™àµ¾' ),
@@ -150,7 +151,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'സമീപകാലമാറàµà´±à´™àµà´™àµ¾' ),
'Recentchangeslinked' => array( 'ബനàµà´§à´ªàµà´ªàµ†à´Ÿàµà´Ÿ_മാറàµà´±à´™àµà´™àµ¾' ),
'Revisiondelete' => array( 'നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ_മായàµà´•àµà´•àµ½' ),
- 'RevisionMove' => array( 'നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´®à´¾à´±àµà´±àµ½' ),
'Search' => array( 'à´…à´¨àµà´µàµ‡à´·à´£à´‚' ),
'Shortpages' => array( 'ചെറിയ_താളàµà´•àµ¾' ),
'Specialpages' => array( 'à´ªàµà´°à´¤àµà´¯àµ‡à´•à´¤à´¾à´³àµà´•àµ¾' ),
@@ -189,7 +189,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__ഉളàµà´³à´Ÿà´•àµà´•à´‚ഇടàµà´•__', '__FORCETOC__' ),
'toc' => array( '0', '__ഉളàµà´³à´Ÿà´•àµà´•à´‚__', '__TOC__' ),
'noeditsection' => array( '0', '__സംശോധികàµà´•àµ‡à´£àµà´Ÿ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__തലകàµà´•àµ†à´Ÿàµà´Ÿàµà´µàµ‡à´£àµà´Ÿ__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'ഈമാസം', 'ഈമാസം2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'ഈമാസം1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'ഈമാസതàµà´¤à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµâ€Œ', 'CURRENTMONTHNAME' ),
@@ -264,11 +263,13 @@ $magicWords = array(
'img_text_bottom' => array( '1', 'à´Žà´´àµà´¤àµà´¤àµ-താഴെ', 'text-bottom' ),
'img_link' => array( '1', 'à´•à´£àµà´£à´¿=$1', 'link=$1' ),
'img_alt' => array( '1', 'പകരം=$1', 'alt=$1' ),
+ 'img_class' => array( '1', 'à´¶àµà´°àµ‡à´£à´¿=$1', 'class=$1' ),
'sitename' => array( '1', 'സൈറàµà´±à´¿à´¨àµà´±àµ†à´ªàµ‡à´°àµ', 'SITENAME' ),
'ns' => array( '0', 'നാമേ:', 'NS:' ),
'localurl' => array( '0', 'ലോകàµà´•àµ½à´¯àµà´†àµ¼à´Žàµ½:', 'LOCALURL:' ),
'localurle' => array( '0', 'ലോകàµà´•àµ½à´¯àµà´†àµ¼à´Žàµ½à´‡:', 'LOCALURLE:' ),
'articlepath' => array( '0', 'ലേഖനപഥം', 'ARTICLEPATH' ),
+ 'pageid' => array( '0', 'താൾà´â€Œà´¡à´¿', 'PAGEID' ),
'server' => array( '0', 'സെർവർ', 'SERVER' ),
'servername' => array( '0', 'സെർവറിനàµà´±àµ†à´ªàµ‡à´°àµ', 'SERVERNAME' ),
'scriptpath' => array( '0', 'à´¸àµà´•àµà´°à´¿à´ªàµà´±àµà´±àµà´ªà´¥à´‚', 'SCRIPTPATH' ),
@@ -308,9 +309,10 @@ $magicWords = array(
'padleft' => array( '0', 'ഇടതàµà´¤àµà´¨à´¿à´±à´•àµà´•àµà´•', 'PADLEFT' ),
'padright' => array( '0', 'വലതàµà´¤àµà´¨à´¿à´±à´•àµà´•àµà´•', 'PADRIGHT' ),
'special' => array( '0', 'à´ªàµà´°à´¤àµà´¯àµ‡à´•à´‚', 'special' ),
+ 'speciale' => array( '0', 'സവിശേഷം', 'speciale' ),
'defaultsort' => array( '1', 'à´¸àµà´µà´¤à´µàµ‡à´¯àµà´³àµà´³à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'à´¸àµà´µà´¤à´µàµ‡à´¯àµà´³àµà´³à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½à´šà´¾à´µà´¿:', 'à´¸àµà´µà´¤à´µàµ‡à´¯àµà´³àµà´³à´µàµ¼à´—àµà´—à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
'filepath' => array( '0', 'à´ªàµà´°à´®à´¾à´£à´ªà´¥à´‚:', 'FILEPATH:' ),
- 'tag' => array( '0', 'à´±àµà´±à´¾à´—àµ', 'tag' ),
+ 'tag' => array( '0', 'à´±àµà´±à´¾à´—àµ', 'ടാഗàµ', 'tag' ),
'hiddencat' => array( '1', '‌‌__മറഞàµà´žà´¿à´°à´¿à´•àµà´•àµà´‚വർഗàµà´—à´‚__', '__HIDDENCAT__' ),
'pagesincategory' => array( '1', 'വർഗàµà´—à´¤àµà´¤à´¿à´²àµà´³àµà´³à´¤à´¾à´³àµà´•àµ¾', 'PAGESINCATEGORY', 'PAGESINCAT' ),
'pagesize' => array( '1', 'താൾവലിപàµà´ªà´‚', 'PAGESIZE' ),
@@ -324,6 +326,10 @@ $magicWords = array(
'url_query' => array( '0', 'à´•àµà´µà´±à´¿', 'QUERY' ),
'defaultsort_noerror' => array( '0', 'പിഴവിലàµà´²', 'noerror' ),
'defaultsort_noreplace' => array( '0', 'മാറàµà´±àµ‡à´£àµà´Ÿà´¤à´¿à´²àµà´²', 'noreplace' ),
+ 'pagesincategory_all' => array( '0', 'à´Žà´²àµà´²à´¾à´‚', 'all' ),
+ 'pagesincategory_pages' => array( '0', 'താളàµà´•àµ¾', 'pages' ),
+ 'pagesincategory_subcats' => array( '0', 'ഉപവർഗàµà´—à´™àµà´™àµ¾', 'subcats' ),
+ 'pagesincategory_files' => array( '0', 'à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾', 'files' ),
);
$digitGroupingPattern = "##,##,###";
@@ -462,6 +468,7 @@ $messages = array(
'newwindow' => '(à´ªàµà´¤à´¿à´¯ ജാലകതàµà´¤à´¿àµ½ à´¤àµà´±à´¨àµà´¨àµ വരàµà´‚)',
'cancel' => 'റദàµà´¦à´¾à´•àµà´•àµà´•',
'moredotdotdot' => 'കൂടàµà´¤àµ½...',
+'morenotlisted' => 'ബാകàµà´•à´¿ പടàµà´Ÿà´¿à´•à´¯à´¿àµ½ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²...',
'mypage' => 'താൾ',
'mytalk' => 'സംവാദതàµà´¤à´¾àµ¾',
'anontalk' => 'à´ˆ à´.പി.à´¯àµà´Ÿàµ† സം‌വാദം താൾ',
@@ -473,7 +480,6 @@ $messages = array(
'qbbrowse' => 'à´¬àµà´°àµ—à´¸àµ',
'qbedit' => 'തിരàµà´¤àµà´¤àµà´•',
'qbpageoptions' => 'ഈ താൾ',
-'qbpageinfo' => 'സനàµà´¦àµ¼à´­à´‚',
'qbmyoptions' => 'à´Žà´¨àµà´±àµ† താളàµà´•àµ¾',
'qbspecialpages' => 'à´ªàµà´°à´¤àµà´¯àµ‡à´• താളàµà´•àµ¾',
'faq' => 'പതിവàµà´šàµ‹à´¦àµà´¯à´™àµà´™àµ¾',
@@ -496,6 +502,7 @@ $messages = array(
'namespaces' => 'നാമമേഖല',
'variants' => 'രൂപഭേദങàµà´™àµ¾',
+'navigation-heading' => 'ഗമന വഴികാടàµà´Ÿà´¿',
'errorpagetitle' => 'പിഴവàµ',
'returnto' => '$1 à´Žà´¨àµà´¨ താളിലേകàµà´•àµ തിരിചàµà´šàµà´ªàµ‹à´µàµà´•.',
'tagline' => '{{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ നിനàµà´¨àµ',
@@ -737,11 +744,11 @@ $2',
'logouttext' => "'''താങàµà´•àµ¾ ഇപàµà´ªàµ‹àµ¾ {{SITENAME}} സംരംഭതàµà´¤à´¿àµ½à´¨à´¿à´¨àµà´¨àµà´‚ ലോഗൗടàµà´Ÿàµ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ'''
à´…à´œàµà´žà´¾à´¤à´®à´¾à´¯à´¿à´°àµà´¨àµà´¨àµ കൊണàµà´Ÿàµ {{SITENAME}} സം‌രംഭം താങàµà´•àµ¾à´•àµà´•àµ à´¤àµà´Ÿàµ¼à´¨àµà´¨àµà´‚ ഉപയോഗികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµâ€Œ.
-à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ [[Special:UserLogin|ലോഗിൻ സൗകരàµà´¯à´‚ ഉപയോഗിചàµà´šàµ]] വീണàµà´Ÿàµà´‚ ലോഗിൻ ചെയàµà´¯à´¾à´µàµà´¨àµà´¨à´¤àµà´‚ ആണàµâ€Œ.
+à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ <span class='plainlinks'>[$1 ലോഗിൻ സൗകരàµà´¯à´‚ ഉപയോഗിചàµà´šàµ]</span> വീണàµà´Ÿàµà´‚ ലോഗിൻ ചെയàµà´¯à´¾à´µàµà´¨àµà´¨à´¤àµà´‚ ആണàµâ€Œ.
താങàµà´•àµ¾ വെബൠബàµà´°àµŒà´¸à´±à´¿à´¨àµà´±àµ† à´•àµà´¯à´¾à´·àµ† ശൂനàµà´¯à´®à´¾à´•àµà´•à´¿à´¯à´¿à´Ÿàµà´Ÿà´¿à´²àµà´²àµ†à´™àµà´•à´¿àµ½ à´šà´¿à´² താളàµà´•à´³à´¿àµ½ താങàµà´•àµ¾ ലോഗിൻ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¾à´¯à´¿ കാണികàµà´•à´¾àµ» സാധàµà´¯à´¤à´¯àµà´£àµà´Ÿàµ.",
-'welcomecreation' => '== à´¸àµà´µà´¾à´—തം, $1! ==
-താങàµà´•à´³àµà´Ÿàµ† à´…à´‚à´—à´¤àµà´µà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
-താങàµà´•à´³àµà´Ÿàµ† [[Special:Preferences|{{SITENAME}} à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³à´¿àµ½]] ആവശàµà´¯à´®à´¾à´¯ മാറàµà´±à´‚ വരàµà´¤àµà´¤àµà´µà´¾àµ» മറകàµà´•à´°àµà´¤àµ‡.',
+'welcomeuser' => 'à´¸àµà´µà´¾à´—തം, $1!',
+'welcomecreation-msg' => 'താങàµà´•à´³àµà´Ÿàµ† à´…à´‚à´—à´¤àµà´µà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
+താങàµà´•à´³àµà´Ÿàµ† [[Special:Preferences|{{SITENAME}} à´•àµà´°à´®àµ€à´•à´°à´£à´™àµà´™à´³à´¿àµ½]] മാറàµà´±à´‚ വരàµà´¤àµà´¤à´¾àµ» മറകàµà´•à´°àµà´¤àµ.',
'yourname' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚:',
'yourpassword' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ:',
'yourpasswordagain' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´’à´°à´¿à´•àµà´•àµ½à´•àµà´•àµ‚à´Ÿà´¿:',
@@ -764,7 +771,7 @@ $2',
'gotaccount' => "താങàµà´•àµ¾à´•àµà´•àµ à´…à´‚à´—à´¤àµà´µà´®àµà´£àµà´Ÿàµ‹? '''$1'''.",
'gotaccountlink' => 'à´ªàµà´°à´µàµ‡à´¶à´¿à´•àµà´•àµà´•',
'userlogin-resetlink' => 'താങàµà´•à´³àµà´Ÿàµ† ലോഗിൻ വിവരങàµà´™àµ¾ മറനàµà´¨àµ പോയോ?',
-'createaccountmail' => 'ഇമെയിൽ വഴി',
+'createaccountmail' => 'താതàµà´•à´¾à´²à´¿à´•à´®à´¾à´¯ à´•àµà´°à´®à´°à´¹à´¿à´¤ രഹസàµà´¯à´µà´¾à´•àµà´•àµ ഉപയോഗികàµà´•à´¾à´¨à´¨àµà´µà´¾à´¦à´‚ നൽകàµà´•à´¯àµà´‚ അതൠതാഴെ à´µàµà´¯à´•àµà´¤à´®à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ ഇമെയിൽ വിലാസതàµà´¤à´¿à´²àµ‡à´¯àµà´•àµà´•àµ അയകàµà´•àµà´•à´¯àµà´‚ ചെയàµà´¯àµà´•',
'createaccountreason' => 'കാരണം:',
'badretype' => 'താങàµà´•àµ¾ നൽകിയ രഹസàµà´¯à´µà´¾à´•àµà´•àµà´•àµ¾ സമമലàµà´².',
'userexists' => 'നൽകിയ ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ à´®àµà´®àµà´ªàµ‡ നിലവിലàµà´£àµà´Ÿàµ.
@@ -828,6 +835,7 @@ $2',
# Email sending
'php-mail-error-unknown' => 'പി.à´Žà´šàµà´šàµ.പി.à´¯àµà´Ÿàµ† main() à´«à´™àµà´·à´¨à´¿àµ½ അപരിചിതമായ പിഴവàµ',
'user-mail-no-addy' => 'ഇമെയിൽ വിലാസം ഇലàµà´²à´¾à´¤àµ†à´¯à´¾à´£àµ ഇമെയിൽ അയയàµà´•àµà´•à´¾àµ» à´¶àµà´°à´®à´¿à´šàµà´šà´¤àµ',
+'user-mail-no-body' => 'ശൂനàµà´¯à´®à´¾à´¯à´¤àµ‹ അസാമാനàµà´¯à´®à´¾à´¯à´¿ ചെറàµà´¤àµ‹ ആയ ഉളàµà´³à´Ÿà´•àµà´•à´®àµà´³àµà´³ ഇമെയിൽ അയയàµà´•àµà´•à´¾àµ» à´¶àµà´°à´®à´¿à´šàµà´šàµ.',
# Change password dialog
'resetpass' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ മാറàµà´±àµà´•',
@@ -887,6 +895,7 @@ $2
'changeemail-oldemail' => 'ഇപàµà´ªàµ‹à´´à´¤àµà´¤àµ† ഇമെയിൽ വിലാസം:',
'changeemail-newemail' => 'à´ªàµà´¤à´¿à´¯ ഇമെയിൽ വിലാസം:',
'changeemail-none' => '(à´’à´¨àµà´¨àµà´®à´¿à´²àµà´²)',
+'changeemail-password' => 'താങàµà´•à´³àµà´Ÿàµ† {{SITENAME}} രഹസàµà´¯à´µà´¾à´•àµà´•àµ:',
'changeemail-submit' => 'ഇമെയിലിൽ മാറàµà´±à´‚വരàµà´¤àµà´¤àµà´•',
'changeemail-cancel' => 'റദàµà´¦à´¾à´•àµà´•àµà´•',
@@ -1053,7 +1062,6 @@ $1 ആണൠഈ തടയൽ നടതàµà´¤à´¿à´¯à´¤àµ. ''$2'' à´Žà´¨àµà´¨à´
'template-semiprotected' => '(അർദàµà´§à´¸à´‚‌രകàµà´·à´¿à´¤à´‚)',
'hiddencategories' => 'à´ˆ താൾ {{PLURAL:$1|മറഞàµà´žà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ ഒരൠവർഗàµà´—à´¤àµà´¤à´¿àµ½|മറഞàµà´žà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ $1 വർഗàµà´—à´™àµà´™à´³à´¿àµ½}} അംഗമാണàµàµâ€Œ:',
'edittools' => '<!-- തിരàµà´¤àµà´¤àµà´µà´¾à´¨àµà´³àµà´³à´¤à´¿à´¨àµà´‚ à´…à´ªàµâ€Œâ€Œà´²àµ‹à´¡àµ ചെയàµà´¯àµà´¨àµà´¨à´¤à´¿à´¨àµà´®àµà´³àµà´³ ഫോമàµà´•àµ¾à´•àµà´•à´Ÿà´¿à´¯à´¿àµ½ ഇവിടെ നൽകàµà´¨àµà´¨ à´Žà´´àµà´¤àµà´¤àµà´•àµ¾ വരàµà´¨àµà´¨à´¤à´¾à´£àµ. -->',
-'nocreatetitle' => 'താളàµà´•àµ¾ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´¨àµà´¨à´¤àµ പരിമിതപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'nocreatetext' => '{{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ à´ªàµà´¤à´¿à´¯ താളàµà´•àµ¾ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´µà´¾à´¨àµà´³àµà´³ അവകാശം നിയനàµà´¤àµà´°à´¿à´¤à´®à´¾à´£àµâ€Œ.
താങàµà´•àµ¾ ദയവായി തിരിചàµà´šàµà´šàµ†à´¨àµà´¨àµ നിലവിലàµà´³àµà´³ ഒരൠതാൾ തിരàµà´¤àµà´¤àµà´•à´¯àµ‹, അഥവാ [[Special:UserLogin|ലോഗിൻ ചെയàµà´¯àµà´•à´¯àµ‹ ഒരൠഅംഗതàµà´µà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´•à´¯àµ‹]] ചെയàµà´¯à´¾àµ» à´…à´­àµà´¯àµ¼à´¤àµà´¥à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'nocreate-loggedin' => 'à´ªàµà´¤à´¿à´¯ താളàµà´•àµ¾ സൃഷàµà´Ÿà´¿à´•àµà´•àµà´µà´¾à´¨àµà´³àµà´³ à´…à´¨àµà´µà´¾à´¦à´‚ താങàµà´•àµ¾à´•àµà´•à´¿à´²àµà´².',
@@ -1077,6 +1085,15 @@ $1 ആണൠഈ തടയൽ നടതàµà´¤à´¿à´¯à´¤àµ. ''$2'' à´Žà´¨àµà´¨à´
'edit-already-exists' => 'à´ªàµà´¤à´¿à´¯ താൾ സൃഷàµà´Ÿà´¿à´•àµà´•à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´².
താൾ ഇപàµà´ªàµ‹àµ¾ തനàµà´¨àµ† നിലവിലàµà´£àµà´Ÿàµ.',
'defaultmessagetext' => 'à´¸àµà´µà´¤àµ‡à´¯àµà´³àµà´³ സനàµà´¦àµ‡à´¶ à´Žà´´àµà´¤àµà´¤àµ',
+'content-failed-to-parse' => '$2 ഉളàµà´³à´Ÿà´•àµà´•à´‚ $1 മാതൃകയിൽ പാഴàµà´¸àµ ചെയàµà´¯àµ½ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ: $3',
+'invalid-content-data' => 'അസാധàµà´µà´¾à´¯ ഉളàµà´³à´Ÿà´•àµà´• ഡേറàµà´±',
+'content-not-allowed-here' => '"$1" ഉളàµà´³à´Ÿà´•àµà´•à´‚ [[$2]] താളിൽ à´…à´¨àµà´µà´¦à´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´²',
+
+# Content models
+'content-model-wikitext' => 'വികàµà´•à´¿à´Žà´´àµà´¤àµà´¤àµ',
+'content-model-text' => 'വെറàµà´‚ à´Žà´´àµà´¤àµà´¤àµ',
+'content-model-javascript' => 'ജാവാസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ',
+'content-model-css' => 'സി.à´Žà´¸àµ.à´Žà´¸àµ.',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµ:''' à´ˆ താളിൽ വളരെകàµà´•àµ‚à´Ÿàµà´¤àµ½ പാഴàµà´¸àµ¼ à´«à´™àµà´·à´¨àµà´•àµ¾ വിളിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
@@ -1441,9 +1458,9 @@ $1",
'prefs-emailconfirm-label' => 'ഇമെയിൽ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´£à´‚:',
'prefs-textboxsize' => 'തിരàµà´¤àµà´¤à´¾à´¨àµà´³àµà´³ ജാലകതàµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚',
'youremail' => 'ഇമെയിൽ:',
-'username' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚:',
-'uid' => 'ഉപയോകàµà´¤àµƒ à´.à´¡à´¿:',
-'prefs-memberingroups' => 'à´…à´‚à´—à´¤àµà´µà´®àµà´³àµà´³ {{PLURAL:$1|സംഘം|സംഘങàµà´™àµ¾}}:',
+'username' => '{{GENDER:$1|ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚}}:',
+'uid' => '{{GENDER:$1|ഉപയോകàµà´¤àµƒ}} à´.à´¡à´¿.:',
+'prefs-memberingroups' => '{{GENDER:$2|à´…à´‚à´—à´¤àµà´µà´®àµà´³àµà´³}} {{PLURAL:$1|സംഘം|സംഘങàµà´™àµ¾}}:',
'prefs-registration' => 'à´…à´‚à´—à´¤àµà´µà´‚ à´Žà´Ÿàµà´¤àµà´¤à´¤àµ:',
'yourrealname' => 'യഥാർതàµà´¥ പേരàµâ€Œ:',
'yourlanguage' => 'ഭാഷ:',
@@ -1593,12 +1610,13 @@ $1",
'right-sendemail' => 'മറàµà´±àµà´ªà´¯àµ‹à´•àµà´¤à´¾à´•àµà´•àµ¾à´•àµà´•àµ ഇമെയിൽ അയയàµà´•àµà´•àµà´•',
'right-passwordreset' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•à´¾à´¨àµà´³àµà´³ ഇമെയിലàµà´•àµ¾ കാണàµà´•',
+# Special:Log/newusers
+'newuserlogpage' => 'ഉപയോകàµà´¤àµƒ സൃഷàµà´Ÿà´¿à´¯àµà´Ÿàµ† രേഖ',
+'newuserlogpagetext' => 'à´ªàµà´¤à´¿à´¯à´¤à´¾à´¯à´¿ à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´¤àµà´¤ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• താഴെ കാണാം.',
+
# User rights log
'rightslog' => 'ഉപയോകàµà´¤àµƒ അവകാശ രേഖ',
'rightslogtext' => 'à´ˆ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°àµ‡à´– ഉപയോകàµà´¤àµƒ അവകാശങàµà´™àµ¾à´•àµà´•àµà´£àµà´Ÿà´¾à´¯ മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ‡à´¤à´¾à´£àµ.',
-'rightslogentry' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† സംഘ à´…à´‚à´—à´¤àµà´µà´‚ $2 à´Žà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµ $3 à´Žà´¨àµà´¨à´¤à´¿à´²àµ‡à´•àµà´•àµ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'rightslogentry-autopromote' => '$2 à´Žà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµ $3 à´Žà´¨àµà´¨à´¤à´¿à´²àµ‡à´¯àµà´•àµà´•àµ à´¸àµà´µà´¯à´‚ ഉയർതàµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'rightsnone' => '(à´’à´¨àµà´¨àµà´®à´¿à´²àµà´²)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'à´ˆ താൾ വായികàµà´•àµà´•',
@@ -1826,6 +1844,7 @@ $1',
'backend-fail-notsame' => '$1 à´Žà´¨àµà´¨àµ സമാനമലàµà´²à´¾à´¤àµà´¤ ഒരൠപàµà´°à´®à´¾à´£à´‚ നിലവിലàµà´£àµà´Ÿàµ.',
'backend-fail-invalidpath' => '$1 à´Žà´¨àµà´¨à´¤àµ സാധàµà´µà´¾à´¯ ഒരൠശേഖരണ പഥം à´…à´²àµà´².',
'backend-fail-delete' => '$1 à´Žà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´‚ മായàµà´•àµà´•à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´².',
+'backend-fail-describe' => '"$1" à´Žà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† മെറàµà´±à´¡àµ‡à´±àµà´± മാറàµà´±à´¾àµ» കഴിയിലàµà´².',
'backend-fail-alreadyexists' => '$1 à´Žà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´‚ നിലവിലàµà´£àµà´Ÿàµ.',
'backend-fail-store' => '$1 à´Žà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´‚ $2 à´Žà´¨àµà´¨à´¤à´¿àµ½ ശേഖരികàµà´•à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´².',
'backend-fail-copy' => '$1 à´Žà´¨àµà´¨ à´ªàµà´°à´®à´¾à´£à´‚ $2 à´Žà´¨àµà´¨à´¤à´¿à´²àµ‡à´¯àµà´•àµà´•àµ പകർതàµà´¤à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´².',
@@ -2062,6 +2081,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'disambiguations-text' => "താഴെകàµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³à´¿àµ½ '''വിവകàµà´·à´¿à´¤à´™àµà´™àµ¾ താളിലേയàµà´•àµà´•àµ''' à´•àµà´±à´žàµà´žà´¤àµ ഒരൠകണàµà´£à´¿à´¯àµà´£àµà´Ÿàµ. à´…à´µ à´…à´¨àµà´¯àµ‹à´œàµà´¯à´®à´¾à´¯ താളിലേയàµà´•àµà´•àµ à´•à´£àµà´£à´¿à´šàµ‡àµ¼à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµ‡à´£àµà´Ÿà´¤à´¾à´µà´¾à´‚. <br />
[[MediaWiki:Disambiguationspage]] à´Žà´¨àµà´¨ താളിൽ à´•à´£àµà´£à´¿ ചേർതàµà´¤à´¿à´Ÿàµà´Ÿàµà´³àµà´³ ഫലകം ഉപയോഗികàµà´•àµà´¨àµà´¨ താളàµà´•à´³àµ† വിവകàµà´·à´¿à´¤à´™àµà´™àµ¾ താളായി കണകàµà´•à´¾à´•àµà´•àµà´¨àµà´¨àµ.",
+'pageswithprop' => 'താളിനàµà´±àµ† സവിശേഷതകളàµà´³àµà´³ താളàµà´•àµ¾',
+'pageswithprop-legend' => 'ഒരൠതാൾ സവിശേഷതയàµà´³àµà´³ താളàµà´•àµ¾',
+'pageswithprop-submit' => 'പോകൂ',
+
'doubleredirects' => 'ഇരടàµà´Ÿ തിരിചàµà´šàµà´µà´¿à´Ÿà´²àµà´•àµ¾',
'doubleredirectstext' => 'à´ˆ താളിൽ ഒരൠതിരിചàµà´šàµà´µà´¿à´Ÿà´²à´¿àµ½ നിനàµà´¨àµà´‚ മറàµà´±àµ തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ താളàµà´•à´³à´¿à´²àµ‡à´¯àµà´•àµà´•àµ പോകàµà´¨àµà´¨ താളàµà´•àµ¾ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ. ഓരോ വരിയിലàµà´‚ à´’à´¨àµà´¨à´¾à´®à´¤àµà´¤àµ‡à´¯àµà´‚ à´°à´£àµà´Ÿà´¾à´®à´¤àµà´¤àµ‡à´¯àµà´‚ തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ താളിലേകàµà´•àµà´³àµà´³ à´•à´£àµà´£à´¿à´•à´³àµà´‚, à´°à´£àµà´Ÿà´¾à´®à´¤àµà´¤àµ† തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ താളിൽ നിനàµà´¨àµ ശരിയായ ലകàµà´·àµà´¯à´¤à´¾à´³à´¿à´²àµ‡à´•àµà´•àµà´³àµà´³ à´•à´£àµà´£à´¿à´•à´³àµà´‚ ഉൾകàµà´•àµŠà´³àµà´³àµà´¨àµà´¨àµ.
<del>വെടàµà´Ÿà´¿à´•àµà´•àµŠà´Ÿàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´µ</del> ശരിയാകàµà´•à´¿à´¯à´µà´¯à´¾à´£àµ.',
@@ -2215,7 +2238,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'linksearch-ok' => 'തിരയൂ',
'linksearch-text' => '"*.wikipedia.org" പോലàµà´³àµà´³ വൈൽഡൠകാർഡàµà´•àµ¾ ഉപയോഗികàµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµâ€Œ.
à´•àµà´±à´žàµà´žà´¤àµ "*.org" പോലàµà´³àµà´³ ഒരൠടോപàµ-ലെവൽ ഡൊമൈൻ à´Žà´™àµà´•à´¿à´²àµà´‚ ഉണàµà´Ÿà´¾à´¯à´¿à´°à´¿à´•àµà´•à´£à´‚.<br />
-പിനàµà´¤àµà´£à´¯àµà´³àµà´³ à´ªàµà´°àµ‹à´Ÿàµà´Ÿàµ‹à´•àµà´•àµ‹à´³àµà´•àµ¾: <code>$1</code> (à´’à´¨àµà´¨àµà´‚ നൽകിയിലàµà´²àµ†à´™àµà´•à´¿àµ½ à´¸àµà´µà´¤àµ‡à´¯àµà´³àµà´³ http:// ഉപയോഗികàµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ).',
+പിനàµà´¤àµà´£à´¯àµà´³àµà´³ {{PLURAL:$2|à´ªàµà´°àµ‹à´Ÿàµà´Ÿàµ‹à´•àµà´•àµ‹àµ¾|à´ªàµà´°àµ‹à´Ÿàµà´Ÿàµ‹à´•àµà´•àµ‹à´³àµà´•àµ¾}}: <code>$1</code> (à´’à´¨àµà´¨àµà´‚ നൽകിയിലàµà´²àµ†à´™àµà´•à´¿àµ½ à´¸àµà´µà´¤àµ‡à´¯àµà´³àµà´³ http:// ഉപയോഗികàµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ).',
'linksearch-line' => '$1, $2ൽ നിനàµà´¨àµ à´•à´£àµà´£à´¿ ചേർകàµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
'linksearch-error' => 'ഹോസàµà´±àµà´±àµà´¨àµ†à´¯à´¿à´®à´¿à´¨àµà´±àµ† à´¤àµà´Ÿà´•àµà´•à´¤àµà´¤à´¿àµ½ മാതàµà´°à´®àµ‡ വൈൽഡൠകാർഡàµà´•àµ¾ വരാവൂ.',
@@ -2234,10 +2257,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'activeusers-hidesysops' => 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•à´°àµ† മറയàµà´•àµà´•àµà´•',
'activeusers-noresult' => 'ഉപയോകàµà´¤à´¾à´•àµà´•à´³à´¿à´²àµà´²',
-# Special:Log/newusers
-'newuserlogpage' => 'ഉപയോകàµà´¤àµƒ സൃഷàµà´Ÿà´¿à´¯àµà´Ÿàµ† രേഖ',
-'newuserlogpagetext' => 'à´ªàµà´¤à´¿à´¯à´¤à´¾à´¯à´¿ à´…à´‚à´—à´¤àµà´µà´®àµ†à´Ÿàµà´¤àµà´¤ ഉപയോകàµà´¤à´¾à´•àµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• താഴെ കാണാം.',
-
# Special:ListGroupRights
'listgrouprights' => 'ഉപയോകàµà´¤àµƒà´µà´¿à´­à´¾à´—à´¤àµà´¤à´¿à´¨àµà´±àµ† അവകാശങàµà´™àµ¾',
'listgrouprights-summary' => 'à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ നിർവàµà´µà´šà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ ഉപയോകàµà´¤àµƒà´¸à´‚ഘങàµà´™à´³àµ†à´¯àµà´‚, à´† സംഘങàµà´™àµ¾à´•àµà´•àµ à´ªàµà´°à´¾à´ªàµà´¤à´®à´¾à´¯à´¿à´Ÿàµà´Ÿàµà´³àµà´³ അവകാശങàµà´™à´³àµ‡à´¯àµà´‚ താഴെ à´•àµà´±à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.
@@ -2331,16 +2350,23 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണàµà´•.',
'enotif_mailer' => '{{SITENAME}} വിജàµà´žà´¾à´ªà´¨ മെയിലർ',
'enotif_reset' => 'à´Žà´²àµà´²à´¾ താളàµà´•à´³àµà´‚ സനàµà´¦àµ¼à´¶à´¿à´šàµà´šà´¤à´¾à´¯à´¿ രേഖപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´•',
-'enotif_newpagetext' => 'ഇതൊരൠപàµà´¤à´¿à´¯ താളാണàµâ€Œ',
'enotif_impersonal_salutation' => '{{SITENAME}} ഉപയോകàµà´¤à´¾à´µàµ',
-'changed' => 'മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'created' => 'സൃഷàµà´Ÿà´¿à´šàµà´šàµ',
-'enotif_subject' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† $PAGETITLE à´Žà´¨àµà´¨ താൾ $PAGEEDITOR $CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† $1 à´Žà´¨àµà´¨ താൾ {{gender:$2|$2}} മായàµà´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'enotif_subject_created' => '{{SITENAME}} സംരംഭതàµà´¤à´¿l $1 à´Žà´¨àµà´¨ താൾ {{gender:$2|$2}} സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'enotif_subject_moved' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† $1 à´Žà´¨àµà´¨ താൾ {{gender:$2|$2}} മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'enotif_subject_restored' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† $1 à´Žà´¨àµà´¨ താൾ {{gender:$2|$2}} à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'enotif_subject_changed' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† $1 à´Žà´¨àµà´¨ താളിൽ {{gender:$2|$2}} മാറàµà´±à´‚ വരàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'enotif_body_intro_deleted' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† $1 à´Žà´¨àµà´¨ താൾ $PAGEEDITDATE-നൠ{{gender:$2|$2}} മായàµà´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ, $3 കാണàµà´•.',
+'enotif_body_intro_created' => '{{SITENAME}} സംരംഭതàµà´¤à´¿àµ½ $1 à´Žà´¨àµà´¨ താൾ $PAGEEDITDATE-നൠ{{gender:$2|$2}} സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ, ഇപàµà´ªàµ‹à´´à´¤àµà´¤àµ† നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨à´¾à´¯à´¿ $3 കാണàµà´•.',
+'enotif_body_intro_moved' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† $1 à´Žà´¨àµà´¨ താൾ $PAGEEDITDATE-നൠ{{gender:$2|$2}} മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ, ഇപàµà´ªàµ‹à´´à´¤àµà´¤àµ† നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨à´¾à´¯à´¿ $3 കാണàµà´•.',
+'enotif_body_intro_restored' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† $1 à´Žà´¨àµà´¨ താൾ $PAGEEDITDATE-നൠ{{gender:$2|$2}} à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ, ഇപàµà´ªàµ‹à´´à´¤àµà´¤àµ† നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨à´¾à´¯à´¿ $3 കാണàµà´•.',
+'enotif_body_intro_changed' => '{{SITENAME}} സംരംഭതàµà´¤à´¿à´²àµ† $1 à´Žà´¨àµà´¨ താളിൽ $PAGEEDITDATE-നൠ{{gender:$2|$2}} മാറàµà´±à´‚ വരàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ, ഇപàµà´ªàµ‹à´´à´¤àµà´¤àµ† നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨à´¾à´¯à´¿ $3 കാണàµà´•.',
'enotif_lastvisited' => 'താങàµà´•à´³àµà´Ÿàµ† അവസാന സനàµà´¦àµ¼à´¶à´¨à´¤àµà´¤à´¿à´¨àµ ശേഷമàµà´£àµà´Ÿà´¾à´¯ മാറàµà´±à´™àµà´™àµ¾ കാണàµà´µà´¾àµ» $1 സനàµà´¦àµ¼à´¶à´¿à´•àµà´•àµà´•.',
'enotif_lastdiff' => 'à´ˆ മാറàµà´±à´‚ കാണാൻ $1 കാണàµà´•.',
'enotif_anon_editor' => 'à´…à´œàµà´žà´¾à´¤ ഉപയോകàµà´¤à´¾à´µàµ $1',
'enotif_body' => 'à´ªàµà´°à´¿à´¯ $WATCHINGUSERNAME,
+$PAGEINTRO $NEWPAGE
{{SITENAME}} സം‌രംഭതàµà´¤à´¿à´²àµ† $PAGETITLE à´Žà´¨àµà´¨ താൾ $PAGEEDITDATE-ൽ $PAGEEDITOR à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ $CHANGEDORCREATED, ഇപàµà´ªàµ‹à´´àµà´³àµà´³ പതിപàµà´ªà´¿à´¨à´¾à´¯à´¿ $PAGETITLE_URL കാണàµà´•.
@@ -2352,8 +2378,7 @@ $NEWPAGE
മെയിൽ: $PAGEEDITOR_EMAIL
വികàµà´•à´¿: $PAGEEDITOR_WIKI
-താങàµà´•àµ¾ à´ˆ താൾ സനàµà´¦àµ¼à´¶à´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´²à´™àµà´•à´¿àµ½ മറàµà´±àµ അറിയിപàµà´ªàµà´•àµ¾ à´’à´¨àµà´¨àµà´®àµà´£àµà´Ÿà´¾à´•àµà´¨àµà´¨à´¤à´²àµà´².
-à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• സനàµà´¦àµ¼à´¶à´¿à´šàµà´šàµà´‚ ഉൾപàµà´ªàµ†à´Ÿàµà´Ÿ താളàµà´•à´³à´¿à´²àµ† അറിയിപàµà´ªàµ à´®àµà´¦àµà´°à´•àµ¾ താങàµà´•àµ¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµâ€Œ.
+താങàµà´•àµ¾ à´ˆ താൾ സനàµà´¦àµ¼à´¶à´¿à´•àµà´•àµà´¨àµà´¨à´¿à´²àµà´²à´™àµà´•à´¿àµ½ മറàµà´±àµ അറിയിപàµà´ªàµà´•àµ¾ à´’à´¨àµà´¨àµà´®àµà´£àµà´Ÿà´¾à´•àµà´¨àµà´¨à´¤à´²àµà´². à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨ താളàµà´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´• സനàµà´¦àµ¼à´¶à´¿à´šàµà´šàµà´‚ ഉൾപàµà´ªàµ†à´Ÿàµà´Ÿ താളàµà´•à´³à´¿à´²àµ† അറിയിപàµà´ªàµ à´®àµà´¦àµà´°à´•àµ¾ താങàµà´•àµ¾à´•àµà´•àµ à´ªàµà´¨à´ƒà´•àµà´°à´®àµ€à´•à´°à´¿à´•àµà´•à´¾à´µàµà´¨àµà´¨à´¤à´¾à´£àµâ€Œ.
താങàµà´•à´³àµà´Ÿàµ† {{SITENAME}} à´¸àµà´¹àµƒà´¦àµ അറിയിപàµà´ªàµ സജàµà´œàµ€à´•à´°à´£à´‚
--
@@ -2368,6 +2393,8 @@ $UNWATCHURL
à´…à´­à´¿à´ªàµà´°à´¾à´¯à´‚ അറിയികàµà´•à´¾à´¨àµà´‚ മറàµà´±àµ സഹായങàµà´™àµ¾à´•àµà´•àµà´‚:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'സൃഷàµà´Ÿà´¿à´šàµà´šàµ',
+'changed' => 'മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
# Delete
'deletepage' => 'താൾ മായàµà´•àµà´•àµà´•',
@@ -2433,6 +2460,8 @@ $UNWATCHURL
'prot_1movedto2' => '[[$1]] à´Žà´¨àµà´¨ താളിനàµà´±àµ† പേർ [[$2]] à´Žà´¨àµà´¨à´¾à´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'protect-badnamespace-title' => 'സംരകàµà´·à´¿à´•àµà´•à´¾à´¨à´¾à´µà´¾à´¤àµà´¤ നാമമേഖല',
'protect-badnamespace-text' => 'à´ˆ നാമമേഖലയിലെ താളàµà´•àµ¾ സംരകàµà´·à´¿à´•àµà´•à´¾à´¨à´¾à´µà´¿à´²àµà´².',
+'protect-norestrictiontypes-text' => 'പരിധി നിർണàµà´£à´¯à´¿à´•àµà´•à´¾à´¨àµà´³àµà´³ വിധം ഇലàµà´²à´¾à´¤àµà´¤à´¤à´¿à´¨à´¾àµ½ à´ˆ താൾ സംരകàµà´·à´¿à´•àµà´•à´¾à´¨à´¾à´µà´¿à´²àµà´².',
+'protect-norestrictiontypes-title' => 'സംരകàµà´·à´¿à´•àµà´•à´¾à´¨à´¾à´µà´¾à´¤àµà´¤ താൾ',
'protect-legend' => 'സം‌രകàµà´·à´£à´‚ à´¸àµà´¥à´¿à´°àµ€à´•à´°à´¿à´•àµà´•àµà´•',
'protectcomment' => 'കാരണം:',
'protectexpiry' => 'സംരകàµà´·à´£ കാലാവധി:',
@@ -2516,7 +2545,8 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|ഒരൠപതിപàµà´ªàµ|$1 പതിപàµà´ªàµà´•àµ¾}} à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'undeletedrevisions-files' => '{{PLURAL:$1|ഒരൠപതിപàµà´ªàµà´‚|$1 പതിപàµà´ªàµà´•à´³àµà´‚}} {{PLURAL:$2|ഒരൠപàµà´°à´®à´¾à´£à´µàµà´‚|$2 à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´‚}} à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'undeletedfiles' => '{{PLURAL:$1|ഒരൠപàµà´°à´®à´¾à´£à´‚|$1 à´ªàµà´°à´®à´¾à´£à´™àµà´™àµ¾}} à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šàµ',
-'cannotundelete' => 'മായàµà´•àµà´•àµ½ തിരസàµà´•àµà´•à´°à´¿à´•àµà´•à´¾à´¨àµà´³àµà´³ à´¶àµà´°à´®à´‚ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ. മറàµà´±à´¾à´°àµ†à´™àµà´•à´¿à´²àµà´‚ ഇതിനൠമàµàµ»à´ªàµ മായàµà´•àµà´•àµ½ തിരസàµà´•àµà´•à´°à´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•à´¾à´‚.',
+'cannotundelete' => 'മായàµà´•àµà´•àµ½ തിരസàµà´•à´°à´£à´‚ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ:
+$1',
'undeletedpage' => "'''$1 à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ'''
à´ªàµà´¤à´¿à´¯à´¤à´¾à´¯à´¿ നടനàµà´¨ ഒഴിവാകàµà´•à´²àµà´•à´³àµà´Ÿàµ‡à´¯àµà´‚ à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¨à´™àµà´™à´³àµà´Ÿàµ‡à´¯àµà´‚ വിവരങàµà´™àµ¾ കാണാൻ [[Special:Log/delete|മായàµà´•àµà´•àµ½ ലോഗàµ]] കാണàµà´•.",
@@ -2547,7 +2577,7 @@ $1',
'blanknamespace' => '(à´®àµà´–àµà´¯à´‚)',
# Contributions
-'contributions' => 'ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† സംഭാവനകൾ',
+'contributions' => '{{GENDER:$1|ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ†}} സംഭാവനകൾ',
'contributions-title' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† സംഭാവനകൾ',
'mycontris' => 'സംഭാവനകൾ',
'contribsub2' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† $2.',
@@ -2821,6 +2851,7 @@ $1',
'immobile-target-namespace-iw' => 'à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ à´•à´£àµà´£à´¿ താൾ മാറàµà´±à´¾à´¨àµà´³àµà´³ സാധàµà´µà´¾à´¯ ലകàµà´·àµà´¯à´®à´²àµà´².',
'immobile-source-page' => 'à´ˆ താൾ മാറàµà´±à´¾àµ» സാദàµà´§àµà´¯à´®à´²àµà´²',
'immobile-target-page' => 'ലകàµà´·àµà´¯à´®à´¾à´•àµà´•à´¿à´¯ തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿à´²àµ‡à´•àµà´•àµ മാറàµà´±à´¾àµ» സാധികàµà´•à´¿à´²àµà´².',
+'bad-target-model' => 'ആഗàµà´°à´¹à´¿à´•àµà´•àµà´¨àµà´¨ ലകàµà´·àµà´¯à´‚ മറàµà´±àµŠà´°àµ ഉളàµà´³à´Ÿà´•àµà´• മാതൃകയാണൠഉപയോഗികàµà´•àµà´¨àµà´¨à´¤àµ. $1 à´Žà´¨àµà´¨à´¤à´¿à´¨àµ† $2 ആകàµà´•à´¿ മാറàµà´±à´¾àµ» കഴിയിലàµà´².',
'imagenocrossnamespace' => 'à´ªàµà´°à´®à´¾à´£à´‚ അതിനായി à´…à´²àµà´²à´¾à´¤àµà´¤ നാമമേഖലയിലേയàµà´•àµà´•àµ മാറàµà´±à´¾àµ» കഴിയിലàµà´²',
'nonfile-cannot-move-to-file' => 'à´ªàµà´°à´®à´¾à´£à´®à´²àµà´²à´¾à´¤àµà´¤à´µ à´ªàµà´°à´®à´¾à´£à´‚ നാമമേഖലയിലേയàµà´•àµà´•àµ മാറàµà´±à´¾àµ» കഴിയിലàµà´².',
'imagetypemismatch' => 'à´ªàµà´¤à´¿à´¯ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† à´Žà´•àµà´¸àµà´±àµà´±àµ†àµ»à´·àµ» അതിനàµà´±àµ† തരവàµà´®à´¾à´¯à´¿ à´’à´¤àµà´¤àµà´ªàµ‹à´•àµà´¨àµà´¨à´¿à´²àµà´².',
@@ -2948,7 +2979,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'ജാവാസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ പരീകàµà´·à´£à´‚',
-'javascripttest-disabled' => 'à´ˆ വികàµà´•à´¿à´¯à´¿àµ½ à´ˆ à´ªàµà´°à´•àµà´°à´¿à´¯ സജàµà´œà´®à´¾à´•àµà´•à´¿à´¯à´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
'javascripttest-title' => '$1 പരീകàµà´·à´£à´™àµà´™àµ¾ നടകàµà´•àµà´¨àµà´¨àµà´£àµà´Ÿàµ',
'javascripttest-pagetext-noframework' => 'à´ˆ താൾ ജാവാസàµà´•àµà´°à´¿à´ªàµà´±àµà´±àµ പരീകàµà´·à´£à´™àµà´™àµ¾ നടതàµà´¤à´¾à´¨à´¾à´¯à´¿ മാറàµà´±à´¿à´µàµ†à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ.',
'javascripttest-pagetext-unknownframework' => 'അപരിചിതമായ പരീകàµà´·à´£ à´šà´Ÿàµà´Ÿà´•àµà´•àµ‚ടൠ"$1".',
@@ -3087,11 +3117,13 @@ $1',
'pageinfo-default-sort' => 'à´¸àµà´µà´¤àµ‡à´¯àµà´³àµà´³ à´•àµà´°à´®à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½ ചാവി',
'pageinfo-length' => 'താളിനàµà´±àµ† നീളം (ബൈറàµà´±à´¿àµ½)',
'pageinfo-article-id' => 'താളിനàµà´±àµ† à´.à´¡à´¿.',
+'pageinfo-language' => 'താളിനàµà´±àµ† ഉളàµà´³à´Ÿà´•àµà´•à´¤àµà´¤à´¿à´¨àµà´±àµ† ഭാഷ',
'pageinfo-robot-policy' => 'തിരചàµà´šà´¿àµ½ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´¤àµà´¤à´¿à´¨àµà´±àµ† à´¸àµà´¥à´¿à´¤à´¿',
'pageinfo-robot-index' => 'സൂചികാവതàµà´•à´°à´¿à´•àµà´•à´¾à´µàµà´¨àµà´¨à´¤àµ',
'pageinfo-robot-noindex' => 'സൂചികാവതàµà´•à´°à´¿à´•àµà´•à´¾à´¨à´¾à´µà´¾à´¤àµà´¤à´¤àµ',
'pageinfo-views' => 'à´Žà´Ÿàµà´¤àµà´¤àµà´¨àµ‹à´•àµà´•à´²àµà´•à´³àµà´Ÿàµ† à´Žà´£àµà´£à´‚',
'pageinfo-watchers' => 'താൾ à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µà´°àµà´Ÿàµ† à´Žà´£àµà´£à´‚',
+'pageinfo-few-watchers' => '{{PLURAL:$1|à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´¯à´¾à´³àµà´Ÿàµ†|à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´¨àµà´¨à´µà´°àµà´Ÿàµ†}} à´Žà´£àµà´£à´‚ $1 à´Žà´£àµà´£à´¤àµà´¤à´¿à´²àµà´‚ à´•àµà´±à´µà´¾à´£àµ',
'pageinfo-redirects-name' => 'à´ˆ താളിലേകàµà´•àµà´³àµà´³ തിരിചàµà´šàµà´µà´¿à´Ÿà´²àµà´•àµ¾',
'pageinfo-subpages-name' => 'à´ˆ താളിനàµà´±àµ† ഉപതാളàµà´•àµ¾',
'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|ഒരൠതിരിചàµà´šàµà´µà´¿à´Ÿàµ½|$2 തിരിചàµà´šàµà´µà´¿à´Ÿà´²àµà´•àµ¾}}; {{PLURAL:$3|തിരിചàµà´šàµà´µà´¿à´Ÿà´²à´²àµà´²à´¾à´¤àµà´¤ ഒരെണàµà´£à´‚|തിരിചàµà´šàµà´µà´¿à´Ÿà´²à´²àµà´²à´¾à´¤àµà´¤ $3}})',
@@ -3106,6 +3138,19 @@ $1',
'pageinfo-magic-words' => 'മാനàµà´¤àµà´°à´¿à´•{{PLURAL:$1|വാകàµà´•àµ|വാകàµà´•àµà´•àµ¾}} ($1)',
'pageinfo-hidden-categories' => 'മറഞàµà´žà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨ {{PLURAL:$1|വർഗàµà´—à´‚|വർഗàµà´—à´™àµà´™àµ¾}} ($1)',
'pageinfo-templates' => 'ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´Ÿàµà´Ÿàµà´³àµà´³ {{PLURAL:$1|ഫലകം|ഫലകങàµà´™àµ¾}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|താൾ|താളàµà´•àµ¾}} ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´Ÿàµà´Ÿàµà´£àµà´Ÿàµ ($1 à´Žà´£àµà´£à´‚)',
+'pageinfo-toolboxlink' => 'താളിനàµà´±àµ† വിവരങàµà´™àµ¾',
+'pageinfo-redirectsto' => 'തിരിചàµà´šàµà´µà´¿à´Ÿàµà´¨àµà´¨àµ',
+'pageinfo-redirectsto-info' => 'വിവരം',
+'pageinfo-contentpage' => 'ഉളàµà´³à´Ÿà´•àµà´• താളായി à´Žà´£àµà´£àµà´¨àµà´¨à´µ',
+'pageinfo-contentpage-yes' => 'അതെ',
+'pageinfo-protect-cascading' => 'സംരകàµà´·à´£à´™àµà´™àµ¾ ഇവിടെ നിനàµà´¨àµ നിർà´à´°à´¿à´¤à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´¨àµà´¨àµ',
+'pageinfo-protect-cascading-yes' => 'അതെ',
+'pageinfo-protect-cascading-from' => 'സംരകàµà´·à´£à´™àµà´™àµ¾ നിർà´à´°à´¿à´¤à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´¨àµà´¨à´¤àµ',
+'pageinfo-category-info' => 'വർഗàµà´—à´¤àµà´¤à´¿à´¨àµà´±àµ† വിവരങàµà´™àµ¾',
+'pageinfo-category-pages' => 'താളàµà´•à´³àµà´Ÿàµ† à´Žà´£àµà´£à´‚',
+'pageinfo-category-subcats' => 'ഉപവർഗàµà´—à´™àµà´™à´³àµà´Ÿàµ† à´Žà´£àµà´£à´‚',
+'pageinfo-category-files' => 'à´ªàµà´°à´®à´¾à´£à´™àµà´™à´³àµà´Ÿàµ† à´Žà´£àµà´£à´‚',
# Skin names
'skinname-standard' => 'സാർവതàµà´°à´¿à´•à´‚',
@@ -3128,6 +3173,8 @@ $1',
'markedaspatrollederror' => 'റോനàµà´¤àµà´šàµà´±àµà´±à´¿à´¯à´¤à´¾à´¯à´¿ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´• സാധàµà´¯à´®à´²àµà´²',
'markedaspatrollederrortext' => 'റോനàµà´¤àµà´šàµà´±àµà´±à´¿à´¯à´¤à´¾à´¯à´¿ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ‡à´£àµà´Ÿ നാൾപàµà´ªà´¤à´¿à´ªàµà´ª താങàµà´•àµ¾ à´µàµà´¯à´•àµà´¤à´®à´¾à´•àµà´•àµ‡à´£àµà´Ÿà´¤à´¾à´£àµ.',
'markedaspatrollederror-noautopatrol' => 'à´¸àµà´µà´¨àµà´¤à´‚ മാറàµà´±à´™àµà´™àµ¾ റോനàµà´¤àµà´šàµà´±àµà´±à´¿à´¯à´¤à´¾à´¯à´¿ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµà´• à´…à´¨àµà´µà´¦à´¨àµ€à´¯à´®à´²àµà´².',
+'markedaspatrollednotify' => '$1 à´Žà´¨àµà´¨ താളിൽ നടതàµà´¤à´¿à´¯ à´ˆ മാറàµà´±à´‚ റോനàµà´¤àµà´šàµà´±àµà´±à´¿à´¯à´¤à´¾à´¯à´¿ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ.',
+'markedaspatrollederrornotify' => 'റോനàµà´¤àµà´šàµà´±àµà´±à´¿à´¯à´¤àµ†à´¨àµà´¨àµ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ.',
# Patrol log
'patrol-log-page' => 'റോനàµà´¤àµà´šàµà´±àµà´±àµ½ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨à´°àµ‡à´–',
@@ -3160,6 +3207,7 @@ $1',
'file-nohires' => 'കൂടàµà´¤àµ½ à´µàµà´¯à´•àµà´¤à´¤à´¯àµà´³àµà´³ à´šà´¿à´¤àµà´°à´‚ ലഭàµà´¯à´®à´²àµà´².',
'svg-long-desc' => 'à´Žà´¸àµ.വി.ജി. à´ªàµà´°à´®à´¾à´£à´‚, നാമമാതàµà´°à´®à´¾à´¯ $1 × $2 പികàµà´¸à´²àµà´•àµ¾, à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚: $3',
'svg-long-desc-animated' => 'ചലികàµà´•àµà´¨àµà´¨ à´Žà´¸àµ.വി.ജി. à´ªàµà´°à´®à´¾à´£à´‚, നാമമാതàµà´°à´®à´¾à´¯ $1 × $2 പികàµà´¸à´²àµà´•àµ¾, à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† വലിപàµà´ªà´‚: $3',
+'svg-long-error' => 'അസാധàµà´µà´¾à´¯ à´Žà´¸àµ.വി.ജി. à´ªàµà´°à´®à´¾à´£à´‚: $1',
'show-big-image' => 'പൂർണàµà´£ റെസലൂഷൻ',
'show-big-image-preview' => 'à´ˆ à´ªàµà´°à´¿à´µàµà´¯àµ‚വിനàµà´±àµ† വലിപàµà´ªà´‚: $1.',
'show-big-image-other' => 'കൂടàµà´¤àµ½ {{PLURAL:$2|റെസലൂഷൻ}}: $1.',
@@ -3193,7 +3241,10 @@ $1',
'minutes' => '{{PLURAL:$1|ഒരൠമിനിറàµà´±àµ|$1 മിനിറàµà´±àµ}}',
'hours' => '{{PLURAL:$1|ഒരൠമണികàµà´•àµ‚ർ|$1 മണികàµà´•àµ‚ർ}}',
'days' => '{{PLURAL:$1|ഒരൠദിവസം|$1 ദിവസം}}',
+'months' => '{{PLURAL:$1|ഒരൠമാസം|$1 മാസം}}',
+'years' => '{{PLURAL:$1|ഒരൠവർഷം|$1 വർഷം}}',
'ago' => '$1 à´®àµà´®àµà´ªàµ',
+'just-now' => 'ഇപàµà´ªàµ‹àµ¾',
# Bad image list
'bad_image_list' => 'à´Žà´´àµà´¤àµà´¤àµ രീതി താഴെ കൊടàµà´¤àµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ:
@@ -3676,6 +3727,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[à´…à´¨àµà´¤àµ¼à´µà´¿à´•àµà´•à´¿ ഉൾപàµà´ªàµ†à´Ÿàµà´¤àµà´¤àµ½ സജàµà´œà´®à´²àµà´²]',
'scarytranscludefailed' => '[$1-നൠഫലകം à´•à´£àµà´Ÿàµà´ªà´¿à´Ÿà´¿à´•àµà´•à´¾àµ» പറàµà´±à´¿à´¯à´¿à´²àµà´²]',
+'scarytranscludefailed-httpstatus' => '[$1-നൠഫലകം à´Žà´Ÿàµà´•àµà´•à´¾àµ» à´•à´´à´¿à´žàµà´žà´¿à´²àµà´²: à´Žà´šàµà´šàµ.à´±àµà´±à´¿.à´±àµà´±à´¿.പി. $2]',
'scarytranscludetoolong' => '[വളരെ നീളകàµà´•àµ‚à´Ÿàµà´¤à´²àµà´³àµà´³ യൂ.ആർ.എൽ.]',
# Delete conflict
@@ -3798,6 +3850,7 @@ $5
'version-license' => 'à´…à´¨àµà´®à´¤à´¿',
'version-poweredby-credits' => "à´ˆ വികàµà´•à´¿ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¿à´•àµà´•à´¾àµ» '''[//www.mediawiki.org/ മീഡിയവികàµà´•à´¿]''' ഉപയോഗികàµà´•àµà´¨àµà´¨àµ. പകർപàµà´ªà´µà´•à´¾à´¶à´‚ © 2001-$1 $2.",
'version-poweredby-others' => 'മറàµà´±àµà´³àµà´³à´µàµ¼',
+'version-credits-summary' => '[[Special:Version|മീഡിയവികàµà´•à´¿à´¯àµà´•àµà´•àµ]] നൽകിയ സംഭാവനകളàµà´Ÿàµ† പേരിൽ താഴെകàµà´•àµŠà´Ÿàµà´•àµà´•àµà´¨àµà´¨à´µàµ¼à´•àµà´•àµ à´žà´™àµà´™àµ¾ നനàµà´¦à´¿ പറയàµà´¨àµà´¨àµ.',
'version-license-info' => 'മീഡിയവികàµà´•à´¿ ഒരൠസàµà´µà´¤à´¨àµà´¤àµà´° സോഫàµà´±àµà´±àµâ€Œà´µàµ‡à´±à´¾à´£àµ; à´¸àµà´µà´¤à´¨àµà´¤àµà´° സോഫàµà´±àµà´±àµâ€Œà´µàµ‡àµ¼ ഫൗണàµà´Ÿàµ‡à´·àµ» à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿàµà´³àµà´³ à´—àµà´¨àµ സാർവàµà´µà´œà´¨à´¿à´• à´…à´¨àµà´µà´¾à´¦à´ªà´¤àµà´°à´¤àµà´¤à´¿à´¨àµà´±àµ† പതിപàµà´ªàµ 2 à´ªàµà´°à´•à´¾à´°à´®àµ‹, à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ (താങàµà´•à´³àµà´Ÿàµ† ഇചàµà´›à´¾à´¨àµà´¸à´°à´£à´‚) പിനàµà´¨àµ€à´Ÿàµ à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´šàµà´š à´à´¤àµ†à´™àµà´•à´¿à´²àµà´‚ പതിപàµà´ªàµ à´ªàµà´°à´•à´¾à´°à´®àµ‹ താങàµà´•àµ¾à´•àµà´•à´¿à´¤àµ à´ªàµà´¨àµ¼à´µà´¿à´¤à´°à´£à´‚ ചെയàµà´¯à´¾à´¨àµà´‚ à´’à´ªàµà´ªà´‚/à´…à´²àµà´²àµ†à´™àµà´•à´¿àµ½ മാറàµà´±à´™àµà´™àµ¾ വരàµà´¤àµà´¤à´¾à´¨àµà´‚ സാധികàµà´•àµà´¨àµà´¨à´¤à´¾à´£àµ.
മീഡിയവികàµà´•à´¿ താങàµà´•àµ¾à´•àµà´•àµà´ªà´•à´°à´¿à´•àµà´•àµà´®àµ†à´¨àµà´¨ à´ªàµà´°à´¤àµ€à´•àµà´·à´¯àµ‹à´Ÿàµ†à´¯à´¾à´£àµ വിതരണം ചെയàµà´¯àµà´¨àµà´¨à´¤àµ, പകàµà´·àµ‡ യാതൊരൠഗàµà´£à´®àµ‡à´¨àµà´®àµ‹à´¤àµà´¤à´°à´µà´¾à´¦à´¿à´¤àµà´¤à´µàµà´‚ വഹികàµà´•àµà´¨àµà´¨à´¿à´²àµà´²; à´µàµà´¯à´¾à´ªà´¾à´°à´¯àµ‹à´—àµà´¯à´®àµ†à´¨àµà´¨àµ‹ à´ªàµà´°à´¤àµà´¯àµ‡à´• ഉപയോഗതàµà´¤à´¿à´¨àµ à´…à´¨àµà´¯àµ‹à´œàµà´¯à´®àµ†à´¨àµà´¨àµ‹ ഉളàµà´³ യാതൊരൠഗàµà´£à´®àµ‡à´¨àµà´®àµ‹à´¤àµà´¤à´°à´µà´¾à´¦à´¿à´¤àµà´¤à´µàµà´‚ ഇതൠഉൾകàµà´•àµŠà´³àµà´³àµà´¨àµà´¨à´¿à´²àµà´². കൂടàµà´¤àµ½ വിവരങàµà´™àµ¾à´•àµà´•àµ à´—àµà´¨àµ സാർവàµà´µà´œà´¨à´¿à´• à´…à´¨àµà´µà´¾à´¦à´ªà´¤àµà´°à´‚ കാണàµà´•.
@@ -3915,17 +3968,17 @@ $5
'sqlite-no-fts' => 'പൂർണàµà´£-à´Žà´´àµà´¤àµà´¤àµ തിരചàµà´šà´¿àµ½ പിനàµà´¤àµà´£à´¯à´¿à´²àµà´²à´¾à´¤àµà´¤ $1',
# New logging system
-'logentry-delete-delete' => '$3 à´Žà´¨àµà´¨ താൾ $1 മായàµà´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-delete-restore' => '$3 à´Žà´¨àµà´¨ താൾ $1 à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-delete-event' => '$3 à´Žà´¨àµà´¨ {{PLURAL:$5|രേഖയിലെ മാറàµà´±à´¤àµà´¤à´¿à´¨àµà´±àµ†|രേഖയിലെ $5 മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ†}} ദർശനീയത $1 മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ: $4',
-'logentry-delete-revision' => '$3 à´Žà´¨àµà´¨ താളിലെ {{PLURAL:$5|നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨àµà´±àµ†|$5 നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ†}} ദർശനീയത $1 മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ: $4',
-'logentry-delete-event-legacy' => '$3 à´Žà´¨àµà´¨ രേഖയിലെ മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† ദർശനീയത $1 മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-delete-revision-legacy' => '$3 à´Žà´¨àµà´¨ താളിലെ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ† ദർശനീയത $1 മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-suppress-delete' => '$3 à´Žà´¨àµà´¨ താൾ $1 à´’à´¤àµà´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-suppress-event' => '$3 à´Žà´¨àµà´¨ {{PLURAL:$5|രേഖയിലെ മാറàµà´±à´¤àµà´¤à´¿à´¨àµà´±àµ†|രേഖയിലെ $5 മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ†}} ദർശനീയത $1 രഹസàµà´¯à´®à´¾à´¯à´¿ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ: $4',
-'logentry-suppress-revision' => '$3 à´Žà´¨àµà´¨ താളിലെ {{PLURAL:$5|നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨àµà´±àµ†|$5 നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ†}} ദർശനീയത $1 രഹസàµà´¯à´®à´¾à´¯à´¿ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ: $4',
-'logentry-suppress-event-legacy' => '$3 à´Žà´¨àµà´¨ രേഖയിലെ മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† ദർശനീയത $1 രഹസàµà´¯à´®à´¾à´¯à´¿ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-suppress-revision-legacy' => '$3 à´Žà´¨àµà´¨ താളിലെ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ† ദർശനീയത $1 രഹസàµà´¯à´®à´¾à´¯à´¿ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-delete-delete' => '$3 à´Žà´¨àµà´¨ താൾ $1 {{GENDER:$2|മായàµà´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-delete-restore' => '$3 à´Žà´¨àµà´¨ താൾ $1 {{GENDER:$2|à´ªàµà´¨à´ƒà´¸àµà´¥à´¾à´ªà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-delete-event' => '$3 à´Žà´¨àµà´¨ {{PLURAL:$5|രേഖയിലെ മാറàµà´±à´¤àµà´¤à´¿à´¨àµà´±àµ†|രേഖയിലെ $5 മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ†}} ദർശനീയത $1 {{GENDER:$2|മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}: $4',
+'logentry-delete-revision' => '$3 à´Žà´¨àµà´¨ താളിലെ {{PLURAL:$5|നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨àµà´±àµ†|$5 നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ†}} ദർശനീയത $1 {{GENDER:$2|മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}: $4',
+'logentry-delete-event-legacy' => '$3 à´Žà´¨àµà´¨ രേഖയിലെ മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† ദർശനീയത $1 {{GENDER:$2|മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-delete-revision-legacy' => '$3 à´Žà´¨àµà´¨ താളിലെ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ† ദർശനീയത $1 {{GENDER:$2|മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-suppress-delete' => '$3 à´Žà´¨àµà´¨ താൾ $1 {{GENDER:$2|à´’à´¤àµà´•àµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-suppress-event' => '$3 à´Žà´¨àµà´¨ {{PLURAL:$5|രേഖയിലെ മാറàµà´±à´¤àµà´¤à´¿à´¨àµà´±àµ†|രേഖയിലെ $5 മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ†}} ദർശനീയത $1 രഹസàµà´¯à´®à´¾à´¯à´¿ {{GENDER:$2|മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}: $4',
+'logentry-suppress-revision' => '$3 à´Žà´¨àµà´¨ താളിലെ {{PLURAL:$5|നാൾപàµà´ªà´¤à´¿à´ªàµà´ªà´¿à´¨àµà´±àµ†|$5 നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ†}} ദർശനീയത $1 രഹസàµà´¯à´®à´¾à´¯à´¿ {{GENDER:$2|മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}: $4',
+'logentry-suppress-event-legacy' => '$3 à´Žà´¨àµà´¨ രേഖയിലെ മാറàµà´±à´™àµà´™à´³àµà´Ÿàµ† ദർശനീയത $1 രഹസàµà´¯à´®à´¾à´¯à´¿ {{GENDER:$2|മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-suppress-revision-legacy' => '$3 à´Žà´¨àµà´¨ താളിലെ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµà´•à´³àµà´Ÿàµ† ദർശനീയത $1 രഹസàµà´¯à´®à´¾à´¯à´¿ {{GENDER:$2|മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
'revdelete-content-hid' => 'ഉളàµà´³à´Ÿà´•àµà´•à´‚ മറയàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'revdelete-summary-hid' => 'തിരàµà´¤àµà´¤à´²à´¿à´¨àµà´±àµ† à´šàµà´°àµà´•àµà´•à´‚ മറയàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'revdelete-uname-hid' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ മറയàµà´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
@@ -3934,17 +3987,21 @@ $5
'revdelete-uname-unhid' => 'ഉപയോകàµà´¤àµƒà´¨à´¾à´®à´‚ മറചàµà´šà´¤àµ ഒഴിവാകàµà´•à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'revdelete-restricted' => 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•àµ¼à´•àµà´•àµ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨ അതിരàµà´•àµ¾ à´àµ¼à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'revdelete-unrestricted' => 'കാരàµà´¯à´¨à´¿àµ¼à´µà´¾à´¹à´•àµ¼à´•àµà´•àµ à´àµ¼à´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯ à´ªàµà´°à´µàµ¼à´¤àµà´¤à´¨ അതിരàµà´•àµ¾ നീകàµà´•à´‚ ചെയàµà´¤à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-move-move' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ $3 à´Žà´¨àµà´¨ താൾ $4 à´Žà´¨àµà´¨à´¾à´•àµà´•à´¿ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-move-move-noredirect' => '$3 à´Žà´¨àµà´¨ താൾ $4 à´Žà´¨àµà´¨ തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿à´²àµ‡à´¯àµà´•àµà´•àµ തിരിചàµà´šàµà´µà´¿à´Ÿà´²à´¿à´²àµà´²à´¾à´¤àµ† $1 മാറàµà´±à´¿',
-'logentry-move-move_redir' => '$1, $3 à´Žà´¨àµà´¨ താൾ $4 à´Žà´¨àµà´¨ താളിനൠമàµà´•à´³à´¿à´²àµ‡à´¯àµà´•àµà´•àµ മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-move-move_redir-noredirect' => '$1, $3 à´Žà´¨àµà´¨ താൾ $4 à´Žà´¨àµà´¨ താളിനàµà´®àµà´•à´³à´¿à´²àµ‡à´¯àµà´•àµà´•àµ, തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ ഇലàµà´²à´¾à´¤àµ† മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-patrol-patrol' => '$3 à´Žà´¨àµà´¨ താളിനàµà´±àµ† $4 à´Žà´¨àµà´¨ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ റോനàµà´¤àµà´šàµà´±àµà´±à´¿à´¯à´¤à´¾à´¯à´¿ $1 അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-patrol-patrol-auto' => '$3 à´Žà´¨àµà´¨ താളിനàµà´±àµ† $4 à´Žà´¨àµà´¨ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ റോനàµà´¤àµà´šàµà´±àµà´±à´¿à´¯à´¤à´¾à´¯à´¿ $1 à´¸àµà´µà´¤àµ‡ അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-newusers-newusers' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤àµƒ à´…à´‚à´—à´¤àµà´µà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-newusers-create' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤àµƒ à´…à´‚à´—à´¤àµà´µà´‚ സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-newusers-create2' => '$3 à´Žà´¨àµà´¨ ഉപയോകàµà´¤àµƒ à´…à´‚à´—à´¤àµà´µà´‚ $1 സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'logentry-newusers-autocreate' => '$1 à´Žà´¨àµà´¨ à´…à´‚à´—à´¤àµà´µà´‚ à´¸àµà´µà´¯à´‚ സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
-'newuserlog-byemail' => 'രഹസàµà´¯à´µà´¾à´•àµà´•àµ à´‡-മെയിൽ വഴി അയചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
+'logentry-move-move' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ $3 à´Žà´¨àµà´¨ താൾ $4 à´Žà´¨àµà´¨à´¾à´•àµà´•à´¿ {{GENDER:$2|മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-move-move-noredirect' => '$3 à´Žà´¨àµà´¨ താൾ $4 à´Žà´¨àµà´¨ തലകàµà´•àµ†à´Ÿàµà´Ÿà´¿à´²àµ‡à´¯àµà´•àµà´•àµ തിരിചàµà´šàµà´µà´¿à´Ÿà´²à´¿à´²àµà´²à´¾à´¤àµ† $1 {{GENDER:$2|മാറàµà´±à´¿}}',
+'logentry-move-move_redir' => '$3 à´Žà´¨àµà´¨ താൾ $4 à´Žà´¨àµà´¨ താളിനൠമàµà´•à´³à´¿à´²àµ‡à´¯àµà´•àµà´•àµ, $1 {{GENDER:$2|മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-move-move_redir-noredirect' => '$3 à´Žà´¨àµà´¨ താൾ $4 à´Žà´¨àµà´¨ താളിനàµà´®àµà´•à´³à´¿à´²àµ‡à´¯àµà´•àµà´•àµ, $1 തിരിചàµà´šàµà´µà´¿à´Ÿàµ½ ഇലàµà´²à´¾à´¤àµ† {{GENDER:$2|മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-patrol-patrol' => '$3 à´Žà´¨àµà´¨ താളിനàµà´±àµ† $4 à´Žà´¨àµà´¨ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ റോനàµà´¤àµà´šàµà´±àµà´±à´¿à´¯à´¤à´¾à´¯à´¿ $1 {{GENDER:$2|അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-patrol-patrol-auto' => '$3 à´Žà´¨àµà´¨ താളിനàµà´±àµ† $4 à´Žà´¨àµà´¨ നാൾപàµà´ªà´¤à´¿à´ªàµà´ªàµ റോനàµà´¤àµà´šàµà´±àµà´±à´¿à´¯à´¤à´¾à´¯à´¿ $1 à´¸àµà´µà´¤àµ‡ {{GENDER:$2|അടയാളപàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-newusers-newusers' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤àµƒ à´…à´‚à´—à´¤àµà´µà´‚ {{GENDER:$2|സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-newusers-create' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤àµƒ à´…à´‚à´—à´¤àµà´µà´‚ {{GENDER:$2|സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-newusers-create2' => '$3 à´Žà´¨àµà´¨ ഉപയോകàµà´¤àµƒ à´…à´‚à´—à´¤àµà´µà´‚ $1 {{GENDER:$2|സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-newusers-byemail' => '$3 à´Žà´¨àµà´¨ ഉപയോകàµà´¤àµƒ à´…à´‚à´—à´¤àµà´µà´‚ $1 {{GENDER:$2|സൃഷàµà´Ÿà´¿à´šàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}, രഹസàµà´¯à´µà´¾à´•àµà´•àµ ഇമെയിൽ വഴി അയചàµà´šàµ',
+'logentry-newusers-autocreate' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤àµƒ à´…à´‚à´—à´¤àµà´µà´‚ à´¸àµà´µà´¯à´‚ {{GENDER:$2|സൃഷàµà´Ÿà´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-rights-rights' => '$3 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† സംഘ à´…à´‚à´—à´¤àµà´µà´‚, $4 à´Žà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµ $5 à´Žà´¨àµà´¨à´¤à´¿à´²àµ‡à´•àµà´•àµ, $1 {{GENDER:$2|മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-rights-rights-legacy' => '$3 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µà´¿à´¨àµà´±àµ† സംഘ à´…à´‚à´—à´¤àµà´µà´‚ $1 {{GENDER:$2|മാറàµà´±à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'logentry-rights-autopromote' => '$1 à´Žà´¨àµà´¨ ഉപയോകàµà´¤à´¾à´µàµ $4 à´Žà´¨àµà´¨à´¤à´¿àµ½ നിനàµà´¨àµà´‚ $5 à´Žà´¨àµà´¨à´¤à´¿à´²àµ‡à´¯àµà´•àµà´•àµ à´¸àµà´µà´¯à´®àµ‡à´µ {{GENDER:$2|ഉയർതàµà´¤à´ªàµà´ªàµ†à´Ÿàµà´Ÿà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ}}',
+'rightsnone' => '(à´’à´¨àµà´¨àµà´®à´¿à´²àµà´²)',
# Feedback
'feedback-bugornote' => 'സാങàµà´•àµ‡à´¤à´¿à´• à´ªàµà´°à´¶àµà´¨à´‚ à´Žà´¨àµà´¤à´¾à´£àµ†à´¨àµà´¨àµ വിവരിചàµà´šàµ†à´´àµà´¤à´¾àµ» താങàµà´•àµ¾ തയàµà´¯à´¾à´±à´¾à´£àµ†à´™àµà´•à´¿àµ½ [$1 ബഗൠഅറിയികàµà´•àµà´•].
@@ -3998,6 +4055,7 @@ $5
'api-error-ok-but-empty' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: സെർവറിൽ നിനàµà´¨àµ à´ªàµà´°à´¤à´¿à´•à´°à´£à´®àµŠà´¨àµà´¨àµà´‚ ലഭികàµà´•àµà´¨àµà´¨à´¿à´²àµà´².',
'api-error-overwrite' => 'നിലവിലàµà´³àµà´³ à´ªàµà´°à´®à´¾à´£à´¤àµà´¤à´¿à´¨àµà´±àµ† à´®àµà´•à´³à´¿àµ½ à´¸àµà´¥à´¾à´ªà´¿à´•àµà´•àµ½ à´…à´¨àµà´µà´¦à´¿à´šàµà´šà´¿à´Ÿàµà´Ÿà´¿à´²àµà´².',
'api-error-stashfailed' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: à´ªàµà´°à´®à´¾à´£à´‚ താതàµà´•à´¾à´²à´¿à´•à´®à´¾à´¯à´¿ സംഭരികàµà´•àµà´¨àµà´¨à´¤à´¿àµ½ സെർവർ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ.',
+'api-error-publishfailed' => 'ആനàµà´¤à´°à´¿à´• പിഴവàµ: താതàµà´•à´¾à´²à´¿à´• à´ªàµà´°à´®à´¾à´£à´‚ à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´•àµà´•àµà´¨àµà´¨à´¤à´¿àµ½ സെർവർ പരാജയപàµà´ªàµ†à´Ÿàµà´Ÿàµ.',
'api-error-timeout' => 'à´ªàµà´°à´¤àµ€à´•àµà´·à´¿à´•àµà´•à´ªàµà´ªàµ†à´Ÿàµà´Ÿ കാലാവധികàµà´•àµà´³àµà´³à´¿àµ½ സെർവർ à´ªàµà´°à´¤à´¿à´•à´°à´¿à´šàµà´šà´¿à´²àµà´².',
'api-error-unclassified' => 'അപരിചിതമായ പിഴവൠസംഭവിചàµà´šà´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ',
'api-error-unknown-code' => 'അപരിചിതമായ പിഴവàµ: "$1"',
@@ -4018,4 +4076,7 @@ $5
'duration-centuries' => '{{PLURAL:$1|ഒരൠനൂറàµà´±à´¾à´£àµà´Ÿàµ|$1 നൂറàµà´±à´¾à´£àµà´Ÿàµ}}',
'duration-millennia' => '{{PLURAL:$1|ഒരൠസഹസàµà´°à´¾à´¬àµà´¦à´‚|$1 സഹസàµà´°à´¾à´¬àµà´¦à´‚}}',
+# Image rotation
+'rotate-comment' => 'à´šà´¿à´¤àµà´°à´‚ à´ªàµà´°à´¦à´•àµà´·à´¿à´£à´¦à´¿à´¶à´¯à´¿àµ½ {{PLURAL:$1|ഒരൠഡിഗàµà´°à´¿|$1 à´¡à´¿à´—àµà´°à´¿}} തിരിചàµà´šàµ',
+
);
diff --git a/languages/messages/MessagesMn.php b/languages/messages/MessagesMn.php
index b91a9b92..92299dc4 100644
--- a/languages/messages/MessagesMn.php
+++ b/languages/messages/MessagesMn.php
@@ -186,7 +186,6 @@ $messages = array(
'qbbrowse' => 'ДÑлгÑÑ…',
'qbedit' => 'ЗаÑварлах',
'qbpageoptions' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ',
-'qbpageinfo' => 'Ðгуулга',
'qbmyoptions' => 'Миний хуудÑууд',
'qbspecialpages' => 'ТуÑгай хуудÑууд',
'faq' => 'Тогтмол тавигддаг аÑуултууд',
@@ -209,6 +208,7 @@ $messages = array(
'namespaces' => 'ÐÑрний зайнууд',
'variants' => 'Хувилбарууд',
+'navigation-heading' => 'Хажуугийн цÑÑ',
'errorpagetitle' => 'Aлдаа',
'returnto' => '$1 руу буцах.',
'tagline' => '{{SITENAME}}-Ñ',
@@ -450,11 +450,11 @@ $2',
# Login and logout pages
'logouttext' => "'''Та одоо гарлаа.'''
-Та Ñмар нÑг Ñ…ÑÑ€ÑглÑгчийн бүртгÑлгүйгÑÑÑ€ {{SITENAME}}-г ашиглах боломжтой, ÑÑвÑл ÑаÑынхаа болон Ó©Ó©Ñ€ Ñ…ÑÑ€ÑглÑгчийн бүртгÑлÑÑ Ð°ÑˆÐ¸Ð³Ð»Ð°Ð½ [[Special:UserLogin|дахин нÑвтÑрч]] болно.
+Та Ñмар нÑг Ñ…ÑÑ€ÑглÑгчийн бүртгÑлгүйгÑÑÑ€ {{SITENAME}}-г ашиглах боломжтой, ÑÑвÑл ÑаÑынхаа болон Ó©Ó©Ñ€ Ñ…ÑÑ€ÑглÑгчийн бүртгÑлÑÑ Ð°ÑˆÐ¸Ð³Ð»Ð°Ð½ <span class='plainlinks'>[$1 дахин нÑвтÑрч]</span> болно.
Броузерийнхаа хийÑвÑÑ€ Ñанах ойг цÑвÑрлÑÑ… хүртÑл зарим нÑг хуудÑууд нь таны холбогдÑон байдлаар харагдаж болзошгүйг анхааруулъÑ.",
-'welcomecreation' => '= $1, тавтай морилно уу! ==
-Та амжилттай бүртгÑгдлÑÑ.
-[[Special:Preferences|{{SITENAME}}-н тохиргоогоо]] өөрчлөхөө мартуузай.',
+'welcomeuser' => '$1, та тавтай морил!',
+'welcomecreation-msg' => 'Таны бүртгÑл хийгдÑÑн байна.
+Та өөрийн [[Special:Preferences|{{SITENAME}}-н тохиргоогоо]] өөрчлөхөө бүү мартаарай.',
'yourname' => 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€:',
'yourpassword' => 'Ðууц үг:',
'yourpasswordagain' => 'Ðууц үгÑÑ Ð´Ð°Ñ…Ð¸Ð½ оруулах:',
@@ -616,6 +616,7 @@ $2
'changeemail-oldemail' => 'Одоогийн цахим шуудан:',
'changeemail-newemail' => 'Ð¨Ð¸Ð½Ñ Ñ†Ð°Ñ…Ð¸Ð¼ шуудангийн хаÑг:',
'changeemail-none' => '(байхгүй)',
+'changeemail-password' => '{{SITENAME}} дахь таны нууц үг:',
'changeemail-submit' => 'Цахим шуудан Ñолих',
'changeemail-cancel' => 'Цуцал',
@@ -794,7 +795,6 @@ $2
'template-semiprotected' => '(хагаÑ-хамгаалагдÑан)',
'hiddencategories' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ Ð½ÑŒ $1 нуугдÑан ангилалд багтаж байна:',
'edittools' => '<!-- Энд бичÑÑн текÑÑ‚ заÑварлах болоод аплоудын тавцангийн доор гарна. -->',
-'nocreatetitle' => 'ХуудаÑны Ò¯Ò¯ÑгÑл Ñ…ÑзгаарлагдÑан байна',
'nocreatetext' => '{{SITENAME}} нь ÑˆÐ¸Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ Ò¯Ò¯ÑгÑÑ… Ñвдлыг хааÑан байна.
Та буцаад хуучин байÑан хуудÑыг заÑварлах, ÑÑвÑл [[Special:UserLogin|нÑвтÑрч орох буюу бүртгүүлж болно]].',
'nocreate-loggedin' => 'Таньд ÑˆÐ¸Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ Ò¯Ò¯ÑгÑÑ… Ñрх байхгүй байна.',
@@ -819,6 +819,13 @@ $2
'edit-already-exists' => 'Ð¨Ð¸Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ Ò¯Ò¯ÑгÑж чадÑангүй.
Өмнө Ò¯Ò¯ÑгÑгдÑÑн байна.',
'defaultmessagetext' => 'ҮндÑÑн меÑÑеж текÑÑ‚',
+'content-failed-to-parse' => '$2 гÑÑÑн агуулгыг $1 модел дÑÑÑ€ авч чадÑангүй: $3',
+
+# Content models
+'content-model-wikitext' => 'вики бичвÑÑ€',
+'content-model-text' => 'Ñнгийн бичвÑÑ€',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Ðнхаар:''' Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñанд Ñ…ÑÑ‚ олон парÑер функцийн дуудлагууд байна.
@@ -1177,9 +1184,9 @@ $1",
'prefs-emailconfirm-label' => 'ÐœÑйлийн баталгаажуулалт:',
'prefs-textboxsize' => 'ЗаÑварлах талбарын Ñ…ÑмжÑÑ',
'youremail' => 'ÐœÑйл хаÑг:',
-'username' => 'Ð¥ÑÑ€ÑглÑгчийн нÑÑ€:',
-'uid' => 'Ð¥ÑÑ€ÑглÑгчийн ID:',
-'prefs-memberingroups' => 'Дараах {{PLURAL:$1|бүлгийн|бүлгүүдийн}} гишүүн:',
+'username' => '{{GENDER:$1|Ð¥ÑÑ€ÑглÑгчийн нÑÑ€}}:',
+'uid' => '{{GENDER:$1|Ð¥ÑÑ€ÑглÑгчийн}} ID:',
+'prefs-memberingroups' => '{{PLURAL:$1|грүпийн|грүпийн}} {{GENDER:$2|гишүүн}} :',
'prefs-registration' => 'БүртгүүлÑÑн цаг:',
'yourrealname' => 'ЖинхÑÐ½Ñ Ð½ÑÑ€:',
'yourlanguage' => 'Ð¥Ñл:',
@@ -1328,12 +1335,13 @@ $1 Ñ‚ÑмдÑгтÑÑÑ Ð±Ð¾Ð³Ð¸Ð½Ð¾ байх Ñ‘Ñтой.',
'right-sendemail' => 'БуÑад Ñ…ÑÑ€ÑглÑгчид руу и-мÑйл Ñвуулах',
'right-passwordreset' => 'Цахим шуудангийн нууц үгийг ÑÑргÑÑн харах',
+# Special:Log/newusers
+'newuserlogpage' => 'Ð¥ÑÑ€ÑглÑгч Ò¯Ò¯ÑгÑлтийн лог',
+'newuserlogpagetext' => 'Ð­Ð½Ñ Ð½ÑŒ Ñ…ÑÑ€ÑглÑгч Ò¯Ò¯ÑгÑлтийн лог юм.',
+
# User rights log
'rightslog' => 'Ð¥ÑÑ€ÑглÑгчдийн Ñрхийн лог',
'rightslogtext' => 'Ð­Ð½Ñ Ð±Ð¾Ð» Ñ…ÑÑ€ÑглÑгчдийн ÑрхÑд учруулÑан өөрчлөлтүүдийн лог юм.',
-'rightslogentry' => '$1-н бүлгийн гишүүнчлÑлийг $2-Ñ $3 болгож өөрчиллөө',
-'rightslogentry-autopromote' => '$2 -Ð¾Ð¾Ñ $3 -руу автоматаар шилжив',
-'rightsnone' => '(байхгүй)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ÑÐ½Ñ Ñ…ÑƒÑƒÐ´Ñыг унших',
@@ -1581,6 +1589,7 @@ URL нь хүчинтÑй, мөн түүн руу орж болж байгаа Ñ
'backend-fail-notsame' => '$1 дÑÑÑ€ Ñлгаатай файл аль Ñрт Ò¯Ò¯ÑÑÑн байна.',
'backend-fail-invalidpath' => '$1 хадгалах зам хуурамч байна.',
'backend-fail-delete' => '$1 файлыг уÑтгаж чадÑангүй.',
+'backend-fail-describe' => '"$1" файлын метадатаг Ñольж чадÑангүй.',
'backend-fail-alreadyexists' => '$1 файл аль Ñ…Ñдийн байж байна.',
'backend-fail-store' => '$2 дахь $1 файлыг хадгалж чадÑангүй.',
'backend-fail-copy' => '$1 файлыг $2-руу хуулж чадÑангүй.',
@@ -1961,10 +1970,6 @@ URL нь зөв болон Ñайт ажиллагаатай байгаа ÑÑÑ
'activeusers-hidesysops' => 'ÐдминиÑтраторуудыг нуух',
'activeusers-noresult' => 'Ð¥ÑÑ€ÑглÑгч олдÑонгүй.',
-# Special:Log/newusers
-'newuserlogpage' => 'Ð¥ÑÑ€ÑглÑгч Ò¯Ò¯ÑгÑлтийн лог',
-'newuserlogpagetext' => 'Ð­Ð½Ñ Ð½ÑŒ Ñ…ÑÑ€ÑглÑгч Ò¯Ò¯ÑгÑлтийн лог юм.',
-
# Special:ListGroupRights
'listgrouprights' => 'Ð¥ÑÑ€ÑглÑгчийн бүлгийн Ñрхүүд',
'listgrouprights-summary' => 'Дараах нь ÑÐ½Ñ Ð²Ð¸ÐºÐ¸ дÑÑрх Ñ…ÑÑ€ÑглÑгчийн бүлгүүд болон Ñ‚ÑдгÑÑрийн Ñрх, зөвшөөрлүүдийн жагÑаалт юм.
@@ -2058,11 +2063,7 @@ URL нь зөв болон Ñайт ажиллагаатай байгаа ÑÑÑ
'enotif_mailer' => '{{SITENAME}}-н мÑйл Ñонордуулга',
'enotif_reset' => 'Бүх хуудÑыг үзÑÑн гÑж Ñ‚ÑмдÑглÑÑ…',
-'enotif_newpagetext' => 'Ð­Ð½Ñ Ð±Ð¾Ð» ÑˆÐ¸Ð½Ñ Ñ…ÑƒÑƒÐ´Ð°Ñ.',
'enotif_impersonal_salutation' => '{{SITENAME}}-н Ñ…ÑÑ€ÑглÑгч',
-'changed' => 'өөрчлөгдÑөн',
-'created' => 'Ò¯Ò¯ÑгÑÑÑн',
-'enotif_subject' => '{{SITENAME}}-н $PAGETITLE хуудÑыг $PAGEEDITOR нь $CHANGEDORCREATED',
'enotif_lastvisited' => '$1-н хамгийн Ñүүлд зочилÑÐ½Ð¾Ð¾Ñ Ñ…Ð¾Ð¹ÑˆÐ¸Ñ… өөрчлөлтүүдийг харуул.',
'enotif_lastdiff' => '$1-г харж ÑÐ½Ñ Ó©Ó©Ñ€Ñ‡Ð»Ó©Ð»Ñ‚Ð¸Ð¹Ð³ Ò¯Ð·Ð½Ñ Ò¯Ò¯.',
'enotif_anon_editor' => '$1 бүртгÑлгүй Ñ…ÑÑ€ÑглÑгч',
@@ -2098,6 +2099,8 @@ $UNWATCHURL
Санал ÑÑтгÑгдÑл болон тулгарÑан бÑрхшÑÑлÑÑ :
{{canonicalurl:{{MediaWiki:Helppage}}}} хаÑгаар орж Ð±Ð¸Ñ‡Ð½Ñ Ò¯Ò¯',
+'created' => 'Ò¯Ò¯ÑгÑÑÑн',
+'changed' => 'өөрчлөгдÑөн',
# Delete
'deletepage' => 'ХуудÑыг уÑтга',
@@ -2248,7 +2251,8 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|1 хувилбар|$1 хувилбар}} ÑÑргÑÑгдлÑÑ',
'undeletedrevisions-files' => '{{PLURAL:$1|1 заÑвар|$1 заÑвар}} ба {{PLURAL:$2|1 файл|$2 файл}} ÑÑргÑÑгдлÑÑ',
'undeletedfiles' => '{{PLURAL:$1|1 файл|$1 файл}} ÑÑргÑÑгдлÑÑ',
-'cannotundelete' => 'УÑтгаÑан хуудÑыг буцааж ÑÑргÑÑÑ… үйлдÑл амжилтгүй боллоо. Ð¥Ñн нÑгÑн уг хуудÑыг Ó©Ñ€Ñөж ÑÑргÑÑÑÑн байх боломжтой.',
+'cannotundelete' => 'УÑтгал ÑÑргÑÑлт хийж чадÑангүй:
+$1',
'undeletedpage' => "'''$1 ÑÑргÑÑгдÑв'''
Сүүлийн үед уÑтгагдÑан ба ÑÑргÑÑгдÑÑн зүйлүүдийн жагÑаалтыг [[Special:Log/delete|уÑтгалын бүртгÑл]] дÑÑÑ€ÑÑÑ Ñ…Ð°Ñ€Ð½Ð° уу.",
@@ -2277,7 +2281,7 @@ $1',
'blanknamespace' => '(Гол)',
# Contributions
-'contributions' => 'Ð¥ÑÑ€ÑглÑгчийн хувь нÑмÑÑ€',
+'contributions' => '{{GENDER:$1|Ð¥ÑÑ€ÑглÑгчийн }} оруулÑан хувь нÑмÑÑ€',
'contributions-title' => '$1 Ñ…ÑÑ€ÑглÑгчийн хувь нÑмÑÑ€',
'mycontris' => 'ОруулÑан хувь нÑмÑÑ€',
'contribsub2' => 'Ð¥ÑÑ€ÑглÑгч: $1 ($2)',
@@ -2536,6 +2540,7 @@ $1',
'immobile-target-namespace-iw' => 'Интервики Ñ…Ð¾Ð»Ð±Ð¾Ð¾Ñ Ð½ÑŒ Ñ…ÑƒÑƒÐ´Ð°Ñ Ð·Ó©Ó©Ð»Ñ‚Ð¸Ð¹Ð½ зорьÑон газар болох боломжгүй.',
'immobile-source-page' => 'Ð­Ð½Ñ Ñ…ÑƒÑƒÐ´Ñыг зөөх боломжгүй.',
'immobile-target-page' => 'Ð­Ð½Ñ Ð·Ð¾Ñ€ÑŒÑон гарчиг руу зөөх боломжгүй.',
+'bad-target-model' => 'Уг хаÑгт Ó©Ó©Ñ€ агуулгын модель ашиглаж Ð±Ð°Ð¹Ð³Ð°Ð°Ð³Ð°Ð°Ñ $1 ÑÑÑ $2 руу хөрвүүлж болохгүй байна..',
'imagenocrossnamespace' => 'Файлыг Ñ„Ð°Ð¹Ð»Ð°Ð°Ñ Ó©Ó©Ñ€ нÑрний зай руу зөөх боломжгүй',
'nonfile-cannot-move-to-file' => 'Файлын нÑрний зай руу файл биш зүйлийг зөөх боломжгүй.',
'imagetypemismatch' => 'Ð¨Ð¸Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ‹Ð½ өргөтгөл төрөлтÑй нь таарахгүй байна',
@@ -2776,6 +2781,10 @@ $1',
'pageinfo-authors' => 'Ðийт зохиогчидын тоо',
'pageinfo-recent-edits' => 'Сүүлд хийÑÑн нийт заÑварууд (Ñүүлийн $1 -Ñ‚)',
'pageinfo-hidden-categories' => '($1) {{PLURAL:$1|ангиллыг|ангилалуудыг}} нууÑан',
+'pageinfo-toolboxlink' => 'ХуудаÑны мÑдÑÑлÑл',
+'pageinfo-redirectsto-info' => 'мÑдÑÑлÑл',
+'pageinfo-contentpage-yes' => 'Тийм',
+'pageinfo-protect-cascading-yes' => 'Тийм',
# Patrolling
'markaspatrolleddiff' => 'Ð¥Ñналтанд авъÑ',
@@ -2817,6 +2826,7 @@ $1',
'file-info-size' => '$1 × $2 пикÑел, файлын Ñ…ÑмжÑÑ: $3, MIME төрөл: $4',
'file-nohires' => 'Илүү чанартай хувилбар байхгүй байна.',
'svg-long-desc' => 'SVG файл, $1 × $2 пикÑÑл, файлын Ñ…ÑмжÑÑ: $3',
+'svg-long-error' => '$1 : Буруу SVG файл',
'show-big-image' => 'Хамгийн Ñайн чанартай хувилбар',
'show-big-image-preview' => 'ҮзлÑгийн Ñ…ÑмжÑÑ : $1',
'show-big-image-other' => 'БуÑад {{PLURAL:$2|зургын нÑгтрал|зургын нÑгтрал}}: $1.',
@@ -2845,6 +2855,7 @@ $1',
'hours' => '{{PLURAL:$1|$1 цаг|$1 цаг}}',
'days' => '{{PLURAL:$1|$1 өдөр|$1 өдөр}}',
'ago' => '$1 -ын өмнө',
+'just-now' => 'дөнгөж ÑаÑ',
# Bad image list
'bad_image_list' => 'Формат дараах байдлаар байна:
@@ -3473,7 +3484,10 @@ $5
'logentry-delete-restore' => '$3 хуудÑыг $1 ÑÑтгÑÑÑÑн',
'revdelete-restricted' => 'ÑиÑтемийн операторуудад тавигдÑан Ñ…Ñзгаарлалтууд',
'revdelete-unrestricted' => 'ÑиÑтемийн Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€ÑƒÑƒÐ´Ð°Ð°Ñ Ð°Ð²Ñ‡ хаÑÑан Ñ…Ñзгаарлалтууд',
-'newuserlog-byemail' => 'мÑйлÑÑÑ€ ÑвуулÑан нууц үг',
+'logentry-rights-rights' => '$1 $3 дахь грүпийн гишүүнчлÑлÑÑ $4 ÑÑÑ $5 руу шилжүүллÑÑ',
+'logentry-rights-rights-legacy' => '$1 $3 дÑÑ…ÑŒ грүпийн гишүүнчлÑлÑÑ ÑольÑон',
+'logentry-rights-autopromote' => '$1 $4 Ð°Ð°Ñ $5 руу автоматаар дÑвшигдлÑÑ',
+'rightsnone' => '(байхгүй)',
# Feedback
'feedback-cancel' => 'Болих',
diff --git a/languages/messages/MessagesMo.php b/languages/messages/MessagesMo.php
index b1ea9e11..b05ccc4b 100644
--- a/languages/messages/MessagesMo.php
+++ b/languages/messages/MessagesMo.php
@@ -274,6 +274,9 @@ $messages = array(
'grouppage-sysop' => '{{ns:project}}:ÐдминиÑтраторь',
+# Special:Log/newusers
+'newuserlogpage' => 'Журнал утилизаторь ной',
+
# User rights log
'rightslog' => 'Журнал дрептурь де утилизатор',
@@ -363,9 +366,6 @@ $messages = array(
# Special:LinkSearch
'linksearch' => 'ЛегÑтурь екÑтерне',
-# Special:Log/newusers
-'newuserlogpage' => 'Журнал утилизаторь ной',
-
# Special:ListGroupRights
'listgrouprights-members' => '(лиÑÑ‚Ñ Ð´Ðµ мембрь)',
diff --git a/languages/messages/MessagesMr.php b/languages/messages/MessagesMr.php
index 588d2399..32a84820 100644
--- a/languages/messages/MessagesMr.php
+++ b/languages/messages/MessagesMr.php
@@ -174,7 +174,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾à¤¹à¤µà¥€à¤š__', '__FORCETOC__' ),
'toc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾__', '__TOC__' ),
'noeditsection' => array( '0', '__असंपादनकà¥à¤·à¤®__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__शीरà¥à¤·à¤•à¤¨à¤¾à¤¹à¥€__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾à¥¨', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾à¥§', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'सदà¥à¤¯à¤®à¤¹à¤¿à¤¨à¤¾à¤¨à¤¾à¤µ', 'CURRENTMONTHNAME' ),
@@ -458,6 +457,7 @@ $messages = array(
'newwindow' => '(नवीन खिडकीत उघडते.)',
'cancel' => 'खोडा',
'moredotdotdot' => 'अजून...',
+'morenotlisted' => 'आणखी यादीत नाही...',
'mypage' => 'माà¤à¥‡ पान',
'mytalk' => 'चरà¥à¤šà¤¾',
'anontalk' => 'या अंकपतà¥à¤¤à¥à¤¯à¤¾à¤šà¥‡ चरà¥à¤šà¤¾ पान उघडा',
@@ -469,7 +469,6 @@ $messages = array(
'qbbrowse' => 'नà¥à¤¯à¤¾à¤¹à¤¾à¤³à¤¾',
'qbedit' => 'संपादन',
'qbpageoptions' => 'हे पान',
-'qbpageinfo' => 'सामगà¥à¤°à¥€',
'qbmyoptions' => 'माà¤à¥€ पाने',
'qbspecialpages' => 'विशेष पाने',
'faq' => 'नेहमीची पà¥à¤°à¤¶à¥à¤¨à¤¾à¤µà¤²à¥€',
@@ -492,6 +491,7 @@ $messages = array(
'namespaces' => 'नामविशà¥à¤µà¥‡',
'variants' => 'असà¥à¤¥à¤¿à¤°',
+'navigation-heading' => 'दिकà¥à¤šà¤¾à¤²à¤¨ यादी',
'errorpagetitle' => 'चूक',
'returnto' => '$1 कडे परत चला.',
'tagline' => '{{SITENAME}} कडून',
@@ -719,11 +719,10 @@ $2',
# Login and logout pages
'logouttext' => "'''तà¥à¤®à¥à¤¹à¥€ आता अदाखल à¤à¤¾à¤²à¤¾(logout)आहात.'''
-तà¥à¤®à¥à¤¹à¥€ अनामिकपणे {{SITENAME}}चा उपयोग करत राहू शकता, किंवा तà¥à¤¯à¤¾à¤š अथवा वेगळà¥à¤¯à¤¾ सदसà¥à¤¯ नावाने [[Special:UserLogin| पà¥à¤¨à¥à¤¹à¤¾ दाखल होऊ शकता]].
+तà¥à¤®à¥à¤¹à¥€ अनामिकपणे {{SITENAME}}चा उपयोग करत राहू शकता, किंवा तà¥à¤¯à¤¾à¤š अथवा वेगळà¥à¤¯à¤¾ सदसà¥à¤¯ नावाने <span class='plainlinks'>[$1 पà¥à¤¨à¥à¤¹à¤¾ दाखल होऊ शकता]</span>.
आपण सà¥à¤µà¤¤:चà¥à¤¯à¤¾ नà¥à¤¯à¤¾à¤¹à¤¾à¤³à¤•à¤¾à¤šà¥€ सय (cache) रिकामी करत नाही तो परà¥à¤¯à¤‚त काही पाने आपण अजून दाखल आहात, असे नà¥à¤¸à¤¤à¥‡à¤š दाखवत राहू शकतील.",
-'welcomecreation' => '== सà¥à¤¸à¥à¤µà¤¾à¤—तम, $1! ==
-
-तà¥à¤®à¤šà¥‡ खाते उघडणà¥à¤¯à¤¾à¤¤ आले आहे.
+'welcomeuser' => 'सà¥à¤µà¤¾à¤—त, $1!',
+'welcomecreation-msg' => 'तà¥à¤®à¤šà¥‡ खाते उघडणà¥à¤¯à¤¾à¤¤ आले आहे.
आपलà¥à¤¯à¤¾ [[Special:Preferences|{{SITENAME}} पसंती]] बदलणà¥à¤¯à¤¾à¤¸ विसरू नका.',
'yourname' => 'तà¥à¤®à¤šà¥‡ नाव',
'yourpassword' => 'तà¥à¤®à¤šà¤¾ परवलीचा शबà¥à¤¦',
@@ -865,6 +864,7 @@ $2',
'changeemail-oldemail' => 'सधà¥à¤¯à¤¾à¤šà¤¾ ईमेल पतà¥à¤¤à¤¾ :',
'changeemail-newemail' => 'नवा ईमेल पतà¥à¤¤à¤¾:',
'changeemail-none' => '(दिलेला नाही)',
+'changeemail-password' => 'तà¥à¤®à¤šà¤¾ {{SITENAME}} संकेतांक:',
'changeemail-submit' => 'ईमेल बदला',
'changeemail-cancel' => 'रदà¥à¤¦ करा',
@@ -1016,7 +1016,6 @@ $2',
'template-protected' => '(सà¥à¤°à¤•à¥à¤·à¤¿à¤¤)',
'template-semiprotected' => '(अरà¥à¤§-सà¥à¤°à¤•à¥à¤·à¥€à¤¤)',
'hiddencategories' => 'हे पान खालील {{PLURAL:$1|à¤à¤•à¤¾ लपविलेलà¥à¤¯à¤¾ वरà¥à¤—ामधà¥à¤¯à¥‡|$1 लपविलेलà¥à¤¯à¤¾ वरà¥à¤—ांमधà¥à¤¯à¥‡}} आहे:',
-'nocreatetitle' => 'पान निरà¥à¤®à¤¿à¤¤à¥€à¤¸ मरà¥à¤¯à¤¾à¤¦à¤¾',
'nocreatetext' => '{{SITENAME}}वर नवीन लेख लिहिणà¥à¤¯à¤¾à¤¸ मजà¥à¤œà¤¾à¤µ करणà¥à¤¯à¤¾à¤¤ आलेला आहे. आपण परत जाऊन असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ असलेलà¥à¤¯à¤¾ लेखांचे संपादन करू शकता अथवा [[Special:UserLogin|नवीन सदसà¥à¤¯à¤¤à¥à¤µ घà¥à¤¯à¤¾/ पà¥à¤°à¤µà¥‡à¤¶ करा]].',
'nocreate-loggedin' => 'येथे तà¥à¤®à¥à¤¹à¤¾à¤²à¤¾ नवीन पाने बनवणà¥à¤¯à¤¾à¤šà¥€ परवानगी नाही.',
'sectioneditnotsupported-title' => 'विभाग संपादन समरà¥à¤¥à¤¿à¤¤ नाही.',
@@ -1039,6 +1038,13 @@ $2',
'edit-already-exists' => 'नवीन पान तयार करता येऊ शकले नाही.
या नावाचे पान आधीच असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ आहे.',
'defaultmessagetext' => 'कसूर पाठà¥à¤¯ मजकूर',
+'invalid-content-data' => 'अवैध माहिती',
+
+# Content models
+'content-model-wikitext' => 'विकिमजकूर',
+'content-model-text' => 'सामानà¥à¤¯ मजकूर',
+'content-model-javascript' => 'जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ',
+'content-model-css' => 'सीà¤à¤¸à¤à¤¸',
# Parser/template warnings
'expensive-parserfunction-warning' => 'â€â€™à¤‡à¤¶à¤¾à¤°à¤¾:â€â€™ या पानावर खूप सारे खरà¥à¤šà¥€à¤• पृथकà¥à¤•à¤°à¤£ कà¥à¤°à¤¿à¤¯à¤¾ कॉलà¥à¤¸ आहेत.
@@ -1544,12 +1550,13 @@ $1",
'right-sendemail' => 'इतर सदसà¥à¤¯à¤¾à¤‚ना विपतà¥à¤°à¥‡ पाठवा',
'right-passwordreset' => 'परवलीचा शबà¥à¤¦ (पासवरà¥à¤¡) पà¥à¤¨:सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ केलà¥à¤¯à¤¾à¤šà¥€ इ मेल पहा.',
+# Special:Log/newusers
+'newuserlogpage' => 'नवीन सदसà¥à¤¯à¤¾à¤‚ची नोंद',
+'newuserlogpagetext' => 'ही नवीन सदसà¥à¤¯à¤¾à¤‚ची नोंद यादी आहे.',
+
# User rights log
'rightslog' => 'सदसà¥à¤¯ आधिकार नोंद',
'rightslogtext' => 'ही सदसà¥à¤¯ अधिकारांमधà¥à¤¯à¥‡ à¤à¤¾à¤²à¥‡à¤²à¥à¤¯à¤¾ बदलांची यादी आहे.',
-'rightslogentry' => '$1 चे गà¥à¤°à¥à¤ª सदसà¥à¤¯à¤¤à¥à¤µ $2 पासून $3 ला बदलणà¥à¤¯à¤¾à¤¤ आलेले आहे',
-'rightslogentry-autopromote' => '$2 ते $3 आपोआप नियà¥à¤•à¥à¤¤à¥€ à¤à¤¾à¤²à¥€.',
-'rightsnone' => '(काहीही नाही)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'हे पान वाचा',
@@ -1766,6 +1773,7 @@ $1',
'backend-fail-notsame' => ' $1 येथे यापेकà¥à¤·à¤¾ विभिनà¥à¤¨ असलेली संचिका पूरà¥à¤µà¥€à¤š विदà¥à¤¯à¤®à¤¾à¤¨ आहे',
'backend-fail-invalidpath' => '$1 हा वैध संगà¥à¤°à¤¾à¤¹à¤•-पथ नाही.',
'backend-fail-delete' => '$1 ही संचिका (फाईल) बनवता आली नाही.',
+'backend-fail-describe' => '"$1" या संचिकेसाठी आपण मेटाडाटा बदलू शकत नाही.',
'backend-fail-alreadyexists' => '$1 ही संचिका अगोदरच असà¥à¤¤à¤¿à¤¤à¥à¤µà¤¾à¤¤ आहे.',
'backend-fail-store' => '$1 ही संचिका $2मधे साठवू शकत नाही.',
'backend-fail-copy' => '"$1" संचिकेची "$2" ही पà¥à¤°à¤¤ करता आली नाही.',
@@ -2156,10 +2164,6 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
'activeusers-hidesysops' => 'पà¥à¤°à¤šà¤¾à¤²à¤• लपवा',
'activeusers-noresult' => 'à¤à¤•à¤¹à¥€ सदसà¥à¤¯ सापडला नाही.',
-# Special:Log/newusers
-'newuserlogpage' => 'नवीन सदसà¥à¤¯à¤¾à¤‚ची नोंद',
-'newuserlogpagetext' => 'ही नवीन सदसà¥à¤¯à¤¾à¤‚ची नोंद यादी आहे.',
-
# Special:ListGroupRights
'listgrouprights' => 'सदसà¥à¤¯ गट अधिकार',
'listgrouprights-summary' => 'खाली या विकिवर दिलेली सदसà¥à¤¯ गटांची यादी तà¥à¤¯à¤¾à¤‚चà¥à¤¯à¤¾ अधिकारांसकट दरà¥à¤¶à¤µà¤¿à¤²à¥‡à¤²à¥€ आहे. पà¥à¤°à¤¤à¥à¤¯à¥‡à¤•à¤¾à¤šà¥à¤¯à¤¾ अधिकारांची अधिक माहिती [[{{MediaWiki:Listgrouprights-helppage}}|इथे]] दिलेली आहे.',
@@ -2253,11 +2257,12 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
'enotif_mailer' => '{{SITENAME}} सूचना विपतà¥à¤°',
'enotif_reset' => 'सरà¥à¤µ पानास भेट दिलà¥à¤¯à¤¾à¤šà¥‡ नमूद करा',
-'enotif_newpagetext' => 'हे नवीन पान आहे.',
'enotif_impersonal_salutation' => '{{SITENAME}} सदसà¥à¤¯',
-'changed' => 'बदलले',
-'created' => 'तयार केले',
-'enotif_subject' => '{{SITENAME}} पान $PAGETITLE $PAGEEDITOR ने $CHANGEDORCREATED आहे',
+'enotif_subject_deleted' => '{{SITENAME}} पानाला $1 {{gender:$2|$2}} ने वगळले',
+'enotif_subject_created' => '{{SITENAME}} पान $1 {{gender:$2|$2}} ने तयार केले',
+'enotif_subject_moved' => '{{SITENAME}}पान $1 {{gender:$2|$2}} ने हलविले',
+'enotif_subject_restored' => '{{SITENAME}} पान $1 {{gender:$2|$2}} ने पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ केले',
+'enotif_subject_changed' => '{{SITENAME}} पान $1 {{gender:$2|$2}} ने बदलले',
'enotif_lastvisited' => 'तà¥à¤®à¤šà¥à¤¯à¤¾ शेवटचà¥à¤¯à¤¾ भेटीनंतरचे बदल बघणयासाठी पहा - $1.',
'enotif_lastdiff' => 'हा बदल पहाणà¥à¤¯à¤¾à¤•à¤°à¤¿à¤¤à¤¾ $1 पहा.',
'enotif_anon_editor' => 'अनामिक उपयोगकरà¥à¤¤à¤¾ $1',
@@ -2287,6 +2292,8 @@ $UNWATCHURL
पà¥à¤¢à¥€à¤² साहायà¥à¤¯ आणि पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'तयार केले',
+'changed' => 'बदलले',
# Delete
'deletepage' => 'पान वगळा',
@@ -2352,6 +2359,8 @@ $UNWATCHURL
'prot_1movedto2' => '"[[$1]]" हे पान "[[$2]]" मथळà¥à¤¯à¤¾à¤–ाली सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरित केले.',
'protect-badnamespace-title' => 'असà¥à¤°à¤•à¥à¤·à¤£à¥€à¤¯ नामविशà¥à¤µ',
'protect-badnamespace-text' => 'या नामविशà¥à¤µà¤¾à¤¤à¥€à¤² पाने सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करता येत नाहीत',
+'protect-norestrictiontypes-text' => 'हे पान सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ होऊ शकत नाही कारण कोणताही सà¥à¤°à¤•à¥à¤·à¤¾à¤ªà¤¾à¤¤à¤³à¥€ पà¥à¤°à¤•à¤¾à¤° उपलबà¥à¤§ नाही.',
+'protect-norestrictiontypes-title' => 'सà¥à¤°à¤•à¥à¤·à¤¾à¤ªà¤¾à¤¤à¤³à¥€ नसलेले पान',
'protect-legend' => 'सà¥à¤°à¤•à¥à¤·à¤¾à¤ªà¤¾à¤¤à¤³à¥€à¤¤à¥€à¤² बदल निरà¥à¤§à¤¾à¤°à¤¿à¤¤ करा',
'protectcomment' => 'कारण:',
'protectexpiry' => 'संपणà¥à¤¯à¤¾à¤šà¤¾ कालावधी:',
@@ -2853,7 +2862,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'जावा सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ तपासणी',
-'javascripttest-disabled' => 'हे कारà¥à¤¯ अवरूदà¥à¤§ केले आहे.',
'javascripttest-title' => '$1 टेसà¥à¤Ÿ चालू आहेत',
'javascripttest-pagetext-noframework' => 'हे पान जावा सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ तपासणी साठी सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ केले आहे',
'javascripttest-pagetext-unknownframework' => 'अजà¥à¤žà¤¾à¤¤ तपासणीचे ठिकाण $1',
@@ -2966,6 +2974,7 @@ $1',
'pageinfo-header-properties' => 'पानाची माहिती',
'pageinfo-display-title' => 'दृशà¥à¤¯ शीरà¥à¤·à¤•',
'pageinfo-length' => 'पानाचा आकार (बाइटà¥à¤¸à¤®à¤§à¥à¤¯à¥‡)',
+'pageinfo-language' => 'पानाचà¥à¤¯à¤¾ मजकूराची भाषा',
'pageinfo-robot-index' => 'आनà¥à¤•à¥à¤°à¤®à¤¾à¤¨à¥€à¤¤',
'pageinfo-robot-noindex' => 'आनà¥à¤•à¥à¤°à¤®à¤¾à¤¨à¥€à¤¤ करू शकत नाही',
'pageinfo-views' => 'अभिपà¥à¤°à¤¾à¤¯à¤¾à¤‚ची संखà¥à¤¯à¤¾',
@@ -2977,6 +2986,14 @@ $1',
'pageinfo-lasttime' => 'अलीकडिल संपादनाचा दिनांक',
'pageinfo-edits' => 'संपादनांची संखà¥à¤¯à¤¾',
'pageinfo-authors' => 'वेगळà¥à¤¯à¤¾ लेखकांची संखà¥à¤¯à¤¾',
+'pageinfo-toolboxlink' => 'पानाची माहिती',
+'pageinfo-redirectsto-info' => 'माहिती',
+'pageinfo-contentpage-yes' => 'होय',
+'pageinfo-protect-cascading-yes' => 'होय',
+'pageinfo-category-info' => 'वरà¥à¤— माहिती',
+'pageinfo-category-pages' => 'पानांची संखà¥à¤¯à¤¾',
+'pageinfo-category-subcats' => 'उपवरà¥à¤—ांची संखà¥à¤¯à¤¾',
+'pageinfo-category-files' => 'संचिकांची संखà¥à¤¯à¤¾',
# Skin names
'skinname-standard' => 'अभिजात',
@@ -3030,6 +3047,7 @@ $1',
'file-info-size-pages' => '$1 × $2 पिकà¥à¤¸à¥‡à¤², संचिका आकारमान: $3, à¤à¤®à¤†à¤¯à¤à¤®à¤ˆ पà¥à¤°à¤•à¤¾à¤°: $4, $5 {{PLURAL:$5|पान|पाने}}',
'file-nohires' => 'यापेकà¥à¤·à¤¾ मोठे चितà¥à¤° उपलबà¥à¤§ नाही.',
'svg-long-desc' => 'SVG संचिका, साधारणपणे $1 × $2 pixels, संचिकेचा आकार: $3',
+'svg-long-error' => 'अयोगà¥à¤¯ SVG पà¥à¤°à¤•à¤¾à¤°à¤¾à¤¤à¥€à¤² संचिका: $1',
'show-big-image' => 'संपूरà¥à¤£ रिजोलà¥à¤¯à¥‚शन',
'show-big-image-preview' => 'या à¤à¤²à¤•à¥‡à¤šà¤¾ आकार: $1. पिकà¥à¤¸à¥‡à¤²',
'show-big-image-other' => 'इतर {{PLURAL:$2|resolution|resolutions}}: $1.',
@@ -3061,7 +3079,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 मिनिट|$1 मिनिट}}',
'hours' => '{{PLURAL:$1|$1 तास|$1 तास}}',
'days' => '{{PLURAL:$1|$1 दिवस|$1 दिवस}}',
+'months' => '{{PLURAL:$1|$1 महिना|$1 महिने}}',
+'years' => '{{PLURAL:$1|$1 वरà¥à¤·|$1 वरà¥à¤·à¥‡}}',
'ago' => '$1 पूरà¥à¤µà¥€',
+'just-now' => 'लगेच',
# Bad image list
'bad_image_list' => 'रूपरेषा खालीलपà¥à¤°à¤®à¤¾à¤£à¥‡ आहे:
@@ -3792,7 +3813,7 @@ $5
'revdelete-unrestricted' => 'पà¥à¤°à¤¬à¤‚धकांची बंधने काढली',
'logentry-move-move' => ' $3पान $4 कडे $1 सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत',
'logentry-move-move-noredirect' => '$1 ने $3 हे पान पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¥€à¤¤ न करता $4 येथे सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत केले',
-'logentry-move-move_redir' => '$1 यांनी $3 हे पान पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ लावà¥à¤¨ $4 येथे हलवले',
+'logentry-move-move_redir' => '$1 यांनी $3 हे पान पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨ लावून $4 येथे हलवले',
'logentry-move-move_redir-noredirect' => '$1 ने $3 हे पान पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¥€à¤¤ न करता $4 येथे पà¥à¤°à¥à¤¨à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¨à¤¾à¤µà¤° सà¥à¤¥à¤¾à¤¨à¤¾à¤‚तरीत केले',
'logentry-patrol-patrol' => ' $3 पानाचà¥à¤¯à¤¾ $1 सà¥à¤šà¤µà¤²à¥‡à¤²à¥à¤¯à¤¾ $4 आवृतà¥à¤¤à¥€à¤¸ गसà¥à¤¤ घातली',
'logentry-patrol-patrol-auto' => ' $3 पानाचà¥à¤¯à¤¾ $1 सà¥à¤šà¤µà¤²à¥‡à¤²à¥à¤¯à¤¾ $4 आवृतà¥à¤¤à¥€à¤¸ सà¥à¤µà¤¯à¤‚चलित गसà¥à¤¤ घातली',
@@ -3800,7 +3821,8 @@ $5
'logentry-newusers-create' => 'à¤à¤• सदसà¥à¤¯à¤–ाते $1 तयार केले',
'logentry-newusers-create2' => '$1 ने सदसà¥à¤¯ खाते $3 निरà¥à¤®à¤¿à¤¤ केले आहे.',
'logentry-newusers-autocreate' => '$1 खाते सà¥à¤µà¤¯à¤®à¥‡à¤µ निरà¥à¤®à¤¿à¤¤ à¤à¤¾à¤²à¥‡ आहे.',
-'newuserlog-byemail' => 'परवलीचा शबà¥à¤¦ ई-मेल मारà¥à¤«à¤¤ पाठविलेला आहे',
+'logentry-rights-rights-legacy' => '$1 ने $3 चे गà¥à¤°à¥à¤ª सदसà¥à¤¯à¤¤à¥à¤µ बदलले',
+'rightsnone' => '(काहीही नाही)',
# Feedback
'feedback-bugornote' => 'जर आपण तांतà¥à¤°à¤¿à¤• पà¥à¤°à¤¶à¥à¤¨ विसà¥à¤¤à¥ƒà¤¤à¤ªà¤£à¥‡ मांडणà¥à¤¯à¤¾à¤¸ तयार असाल तर कृपया ($1 गणकदोष वृतांत) पाठवा. नपेकà¥à¤·à¤¾, खाली देणà¥à¤¯à¤¾à¤¤ आलेले सोपे आवेदनपतà¥à¤° वापरा. आपली टिपà¥à¤ªà¤£à¥€ "[ $3, $2]" या पानास आपले सदसà¥à¤¯à¤¨à¤¾à¤µ व आपण कोणता बà¥à¤°à¤¾à¤‰à¤œà¤° वापरता यासह जोडणà¥à¤¯à¤¾à¤¤ येईल.',
diff --git a/languages/messages/MessagesMrj.php b/languages/messages/MessagesMrj.php
index 3f069928..d5d0ae6f 100644
--- a/languages/messages/MessagesMrj.php
+++ b/languages/messages/MessagesMrj.php
@@ -387,6 +387,9 @@ $messages = array(
'grouppage-sysop' => '{{ns:project}}:ÐдминиÑтраторвлӓ',
+# Special:Log/newusers
+'newuserlogpage' => 'Сирӹшӹвлӓм региÑтрируйышы журнал',
+
# User rights log
'rightslog' => 'Сирӹшӹн прававлӓжӹм анжыктышы журнал',
@@ -480,9 +483,6 @@ $messages = array(
# Special:LinkSearch
'linksearch' => 'Тӱнӹш ажедмӓшвлӓ',
-# Special:Log/newusers
-'newuserlogpage' => 'Сирӹшӹвлӓм региÑтрируйышы журнал',
-
# Special:ListGroupRights
'listgrouprights-members' => '(группын ÑпиÑокшы)',
diff --git a/languages/messages/MessagesMs.php b/languages/messages/MessagesMs.php
index d40a81b7..9902fbea 100644
--- a/languages/messages/MessagesMs.php
+++ b/languages/messages/MessagesMs.php
@@ -160,7 +160,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Perubahan_terkini' ),
'Recentchangeslinked' => array( 'Perubahan_berkaitan' ),
'Revisiondelete' => array( 'Hapus_semakan' ),
- 'RevisionMove' => array( 'Pindah_semakan' ),
'Search' => array( 'Gelintar' ),
'Shortpages' => array( 'Laman_pendek' ),
'Specialpages' => array( 'Laman_khas' ),
@@ -327,6 +326,7 @@ $messages = array(
'newwindow' => '(dibuka di tetingkap baru)',
'cancel' => 'Batal',
'moredotdotdot' => 'Lagi...',
+'morenotlisted' => 'Lain-lain yang tidak tersenarai...',
'mypage' => 'Halaman',
'mytalk' => 'Perbualan',
'anontalk' => 'Perbualan bagi IP ini',
@@ -338,7 +338,6 @@ $messages = array(
'qbbrowse' => 'Semak imbas',
'qbedit' => 'Sunting',
'qbpageoptions' => 'Laman ini',
-'qbpageinfo' => 'Konteks',
'qbmyoptions' => 'Laman-laman saya',
'qbspecialpages' => 'Laman khas',
'faq' => 'Soalan Lazim',
@@ -361,6 +360,7 @@ $messages = array(
'namespaces' => 'Ruang nama',
'variants' => 'Kelainan',
+'navigation-heading' => 'Menu pandu arah',
'errorpagetitle' => 'Ralat',
'returnto' => 'Kembali ke $1.',
'tagline' => 'Daripada {{SITENAME}}.',
@@ -603,10 +603,10 @@ Pentadbir yang menguncinya memberikan penjelasan yang berikut: "$3".',
# Login and logout pages
'logouttext' => "'''Anda telah log keluar.'''
-Anda boleh terus menggunakan {{SITENAME}} sebagai pengguna tanpa nama, atau anda boleh [[Special:UserLogin|log masuk sekali lagi]] sebagai pengguna lain. Anda boleh membersihkan cache pelayar web anda sekiranya terdapat laman yang memaparkan seolah-olah anda masih log masuk.",
-'welcomecreation' => '== Selamat datang, $1! ==
-
-Akaun anda telah dibuka. Jangan lupa untuk mengubah [[Special:Preferences|keutamaan {{SITENAME}}]] anda.',
+Anda boleh terus menggunakan {{SITENAME}} sebagai pengguna tanpa nama, atau anda boleh <span class='plainlinks'>[$1 log masuk sekali lagi]</span> sebagai pengguna lain. Anda boleh membersihkan cache pelayar web anda sekiranya terdapat laman yang memaparkan seolah-olah anda masih log masuk.",
+'welcomeuser' => 'Selamat datang, $1!',
+'welcomecreation-msg' => 'Akaun anda telah dibuka.
+Jangan lupa untuk mengubah [[Special:Preferences|keutamaan anda di {{SITENAME}}]].',
'yourname' => 'Nama pengguna:',
'yourpassword' => 'Kata laluan:',
'yourpasswordagain' => 'Ulangi kata laluan:',
@@ -629,7 +629,7 @@ Akaun anda telah dibuka. Jangan lupa untuk mengubah [[Special:Preferences|keutam
'gotaccount' => "Sudah mempunyai akaun? '''$1'''.",
'gotaccountlink' => 'Log masuk',
'userlogin-resetlink' => 'Lupa nama pengguna/kata laluan anda?',
-'createaccountmail' => 'melalui e-mel',
+'createaccountmail' => 'Gunakan kata laluan rawak yang sementara dan hantarnya ke alamat e-mel yang dinyatakan di bawah',
'createaccountreason' => 'Sebab:',
'badretype' => 'Sila ulangi kata laluan dengan betul.',
'userexists' => 'Nama pengguna yang diisikan telah pun digunakan.
@@ -699,6 +699,7 @@ Sila tunggu sebentar dan cuba lagi.',
# Email sending
'php-mail-error-unknown' => 'Ralat tak diketahui dalam fungsi mail() PHP',
'user-mail-no-addy' => 'E-eml cuba dihantar tanpa alamat e-mel',
+'user-mail-no-body' => 'Anda telah cuba menghantar e-mel dengan isi yang kosong atau terlampau ringkas.',
# Change password dialog
'resetpass' => 'Tukar kata laluan',
@@ -756,6 +757,7 @@ Kata laluan sementara: $2',
'changeemail-oldemail' => 'Alamat e-mel sekarang:',
'changeemail-newemail' => 'Alamat e-mel baru:',
'changeemail-none' => '(tiada)',
+'changeemail-password' => 'Kata laluan anda di {{SITENAME}}:',
'changeemail-submit' => 'Tukar E-mel',
'changeemail-cancel' => 'Batalkan',
@@ -932,7 +934,6 @@ Masukan log terakhir ditunjukkan di bawah untuk rujukan:",
'hiddencategories' => 'Laman ini terdapat dalam $1 kategori tersembunyi:',
'edittools' => '<!-- Teks di sini akan ditunjukkan bawah borang sunting dan muat naik. -->',
'edittools-upload' => '-',
-'nocreatetitle' => 'Penciptaan laman dihadkan',
'nocreatetext' => 'Penciptaan laman baru dihadkan pada {{SITENAME}}.
Anda boleh berundur dan menyunting laman yang sedia ada, atau [[Special:UserLogin|log masuk]].',
'nocreate-loggedin' => 'Anda tidak mempunyai keizinan untuk mencipta laman baru.',
@@ -954,6 +955,15 @@ Log penghapusan bagi laman ini dilampirkan di bawah untuk rujukan.',
'edit-no-change' => 'Suntingan anda diabaikan kerana tiada perubahan dibuat pada teks tersebut.',
'edit-already-exists' => 'Tidak dapat mencipta laman baru kerana ia telah wujud.',
'defaultmessagetext' => 'Teks mesej asal',
+'content-failed-to-parse' => 'Kandungan $2 tidak dapat dihuraikan untuk model $1: $3',
+'invalid-content-data' => 'Data kandungan tidak sah',
+'content-not-allowed-here' => 'Kandungan "$1" tidak dibenarkan di halaman [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikiteks',
+'content-model-text' => 'teks biasa',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Amaran: Laman ini mengandungi terlalu banyak panggilan fungsi penghurai yang intensif.
@@ -1320,9 +1330,9 @@ Tindakan ini tidak boleh dibatalkan.',
'prefs-emailconfirm-label' => 'Pengesahan e-mel:',
'prefs-textboxsize' => 'Saiz tetingkap penyuntingan',
'youremail' => 'E-mel:',
-'username' => 'Nama pengguna:',
-'uid' => 'ID pengguna:',
-'prefs-memberingroups' => 'Ahli {{PLURAL:$1|kumpulan|kumpulan}}:',
+'username' => '{{GENDER:$1|Nama pengguna}}:',
+'uid' => 'ID {{GENDER:$1|Pengguna}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Ahli}} {{PLURAL:$1|kumpulan|kumpulan-kumpulan}}:',
'prefs-memberingroups-type' => '$1',
'prefs-registration' => 'Waktu pendaftaran:',
'prefs-registration-date-time' => '$1',
@@ -1472,12 +1482,13 @@ Tindakan ini tidak boleh dibatalkan.',
'right-sendemail' => 'Mengirim e-mel kepada pengguna-pengguna lain',
'right-passwordreset' => 'Lihat e-mel set semula kata laluan',
+# Special:Log/newusers
+'newuserlogpage' => 'Log akaun baru',
+'newuserlogpagetext' => 'Yang berikut ialah log penciptaan pengguna.',
+
# User rights log
'rightslog' => 'Log hak pengguna',
'rightslogtext' => 'Ini ialah log perubahan terhadap hak pengguna.',
-'rightslogentry' => 'menukar keahlian kumpulan bagi $1 daripada $2 kepada $3',
-'rightslogentry-autopromote' => 'dinaik pangkat secara automatik dari $2 ke $3',
-'rightsnone' => '(tiada)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'membaca laman ini',
@@ -1712,6 +1723,7 @@ Sila hubungi [[Special:ListUsers/sysop|pentadbir sistem]].',
'backend-fail-notsame' => 'Satu fail yang tidak seiras sudah wujud di $1.',
'backend-fail-invalidpath' => '$1 bukan laluan storan yang sah.',
'backend-fail-delete' => 'Fail $1 tidak dapat dihapuskan.',
+'backend-fail-describe' => 'Metadata untuk fail "$1" tidak dapat diubah.',
'backend-fail-alreadyexists' => 'Fail $1 sudah wujud.',
'backend-fail-store' => 'Fail $1 tidak dapat distorkan di $2.',
'backend-fail-copy' => 'Fail $1 tidak dapat disalin ke $2.',
@@ -1946,6 +1958,12 @@ Mungkin anda ingin menyunting keterangan pada [$2 laman penerangan failnya] di s
Pautan ini sepatutnya ditujukan ke topik yang sepatutnya.<br />
Sesebuah laman dianggap sebagai laman penyahkekaburan jika ia menggunakan templat yang dipaut dari [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'Halaman dengan sifat halaman',
+'pageswithprop-legend' => 'Halaman dengan sifat halaman',
+'pageswithprop-text' => 'Halaman ini menyenaraikan halaman-halaman yang menggunakan sifat halaman yang tertentu.',
+'pageswithprop-prop' => 'Nama sifat:',
+'pageswithprop-submit' => 'Pergi',
+
'doubleredirects' => 'Lencongan berganda',
'doubleredirectstext' => 'Yang berikut ialah senarai laman yang melencong ke laman lencongan lain. Setiap baris mengandungi pautan ke laman lencongan pertama dan kedua, serta baris pertama bagi teks lencongan kedua, lazimnya merupakan laman sasaran "sebenar", yang sepatutnya ditujui oleh lencongan pertama.
Masukan yang <del>dipotong</del> telah diselesaikan.',
@@ -2097,7 +2115,7 @@ Lihat juga [[Special:WantedCategories|kategori yang dikehendaki]].',
'linksearch-ok' => 'Cari',
'linksearch-text' => 'Kad bebas seperti "*.wikipedia.org" dibenarkan.<br />
Memerlukan sekurang-kurangnya satu domain peringkat tinggi, cth. "*.org".<br />
-Protokol yang disokong: <code>$1</code> (menjadi http:// jika tiada protokol dinyatakan).',
+{{PLURAL:$2|Protokol|Protokol-protokol}} yang disokong: <code>$1</code> (menjadi http:// jika tiada protokol dinyatakan).',
'linksearch-line' => '$1 dipaut dari $2',
'linksearch-error' => 'Kad bebas hanya boleh digunakan pada permulaan nama hos.',
@@ -2116,10 +2134,6 @@ Protokol yang disokong: <code>$1</code> (menjadi http:// jika tiada protokol din
'activeusers-hidesysops' => 'Sorokkan pentadbir',
'activeusers-noresult' => 'Tiada pengguna dijumpai.',
-# Special:Log/newusers
-'newuserlogpage' => 'Log akaun baru',
-'newuserlogpagetext' => 'Yang berikut ialah log penciptaan pengguna.',
-
# Special:ListGroupRights
'listgrouprights' => 'Hak kumpulan pengguna',
'listgrouprights-summary' => 'Yang berikut ialah senarai kumpulan pengguna yang ditubuhkan di wiki ini dengan hak-hak masing-masing.
@@ -2217,44 +2231,48 @@ Perubahan-perubahan pada halaman ini dan halaman perbualannya pada masa akan dat
'enotif_mailer' => 'Sistem Pemberitahuan {{SITENAME}}',
'enotif_reset' => 'Tandakan semua laman sebagai telah dikunjungi',
-'enotif_newpagetext' => 'Ini adalah sebuah laman baru.',
'enotif_impersonal_salutation' => 'Pengguna {{SITENAME}}',
-'changed' => 'diubah',
-'created' => 'dicipta',
-'enotif_subject' => 'Laman $PAGETITLE di {{SITENAME}} telah $CHANGEDORCREATED oleh $PAGEEDITOR',
+'enotif_subject_deleted' => 'Halaman $1 di {{SITENAME}} telah dihapuskan oleh {{gender:$2|$2}}',
+'enotif_subject_created' => 'Halaman $1 di {{SITENAME}} telah diwujudkan oleh {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Halaman $1 di {{SITENAME}} telah dipindahkan oleh {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Halaman $1 di {{SITENAME}} telah dipulihkan oleh {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Halaman $1 di {{SITENAME}} telah disunting oleh {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Halaman $1 di {{SITENAME}} telah dihapuskan oleh {{gender:$2|$2}} pada $PAGEEDITDATE, sila rujuk $3.',
+'enotif_body_intro_created' => 'Halaman $1 di {{SITENAME}} telah diwujudkan oleh {{gender:$2|$2}} pada $PAGEEDITDATE, sila rujuk $3 untuk semakan terkini.',
+'enotif_body_intro_moved' => 'Halaman $1 di {{SITENAME}} telah dipindahkan oleh {{gender:$2|$2}} pada $PAGEEDITDATE, sila rujuk $3 untuk semakan terkini.',
+'enotif_body_intro_restored' => 'Halaman $1 di {{SITENAME}} telah dipulihkan oleh {{gender:$2|$2}} pada $PAGEEDITDATE, sila rujuk $3 untuk semakan terkini.',
+'enotif_body_intro_changed' => 'Halaman $1 di {{SITENAME}} telah disunting oleh {{gender:$2|$2}} pada $PAGEEDITDATE, sila rujuk $3 untuk semakan terkini.',
'enotif_lastvisited' => 'Lihat $1 untuk semua perubahan sejak kunjungan terakhir anda.',
'enotif_lastdiff' => 'Rujuk $1 untuk melihat perubahan ini.',
'enotif_anon_editor' => 'pengguna tanpa nama $1',
'enotif_body' => '$WATCHINGUSERNAME,
-
-Laman $PAGETITLE di {{SITENAME}} telah $CHANGEDORCREATED pada $PAGEEDITDATE oleh $PAGEEDITOR; sila lihat $PAGETITLE_URL untuk semakan terkini.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Ringkasan penyunting: $PAGESUMMARY $PAGEMINOREDIT
-Hubungi penyunting tersebut:
+Hubungi penyunting:
mel: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Tiada pemberitahuan lain akan dikirim berkaitan perubahan selanjutnya melainkan anda mengunjungi laman tersebut.
-Anda juga boleh menetapkan semula penanda pemberitahuan bagi semua laman dalam senarai pantau anda.
+Tiada lagi pemberitahuan lanjut sekiranya terdapat suntingan selanjutnya melainkan anda mengunjungi halaman berkenaan. Anda juga boleh menetapkan semula tanda-tanda pemberitahuan untuk kesemua halaman dalam senarai pantau anda.
- Sistem pemberitahuan {{SITENAME}} anda yang ramah mesra
+ Sistem pemberitahuan {{SITENAME}} yang mesra
--
-Untuk mengubah tetapan pemberitahuan e-mel anda, lawati
+Untuk mengubah tetapan pemberitahuan melalui e-mel anda, kunjungi
{{canonicalurl:{{#special:Preferences}}}}
-Untuk mengubah tetapan senarai pantau anda, lawati
+Untuk mengubah tetapan senarai pantau anda, kunjungi
{{canonicalurl:{{#special:EditWatchlist}}}}
-Untuk menghapuskan laman ini dari senarai pantau anda, lawati
+Untuk menggugurkan halaman ini daripada senarai pantau anda, kunjungi
$UNWATCHURL
-Maklum balas dan bantuan:
+Maklum balas dan bantuan selanjutnya:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'dicipta',
+'changed' => 'diubah',
# Delete
'deletepage' => 'Hapus laman',
@@ -2323,6 +2341,8 @@ Lihat [[Special:ProtectedPages|senarai laman terlindung]] untuk senarai laman-la
'prot_1movedto2' => '[[$1]] dipindahkan ke [[$2]]',
'protect-badnamespace-title' => 'Ruang nama yang tidak boleh dilindungi',
'protect-badnamespace-text' => 'Laman-laman dalam ruang nama ini tidak boleh dilindungi.',
+'protect-norestrictiontypes-text' => 'Halaman ini tidak boleh dilindungi kerana tiadanya jenis-jenis sekatan yang disediakan.',
+'protect-norestrictiontypes-title' => 'Halaman tak terlindung',
'protect-legend' => 'Sahkan perlindungan',
'protectcomment' => 'Sebab:',
'protectexpiry' => 'Sehingga:',
@@ -2405,7 +2425,7 @@ atau semakan tersebut telah dipulihkan atau dibuang daripada arkib.',
'undeletedrevisions' => '$1 semakan dipulihkan',
'undeletedrevisions-files' => '$1 semakan dan $2 fail dipulihkan',
'undeletedfiles' => '$1 fail dipulihkan',
-'cannotundelete' => 'Penyahhapusan gagal; mungkin orang lain telah pun mengnyahhapuskannya.',
+'cannotundelete' => 'Penyahhapusan gagal: $1',
'undeletedpage' => "'''$1 telah dipulihkan'''
Sila rujuk [[Special:Log/delete|log penghapusan]] untuk rekod penghapusan terkini.",
@@ -2436,7 +2456,7 @@ $1',
'blanknamespace' => '(Utama)',
# Contributions
-'contributions' => 'Sumbangan pengguna',
+'contributions' => 'Sumbangan {{GENDER:$1|pengguna}}',
'contributions-title' => 'Sumbangan oleh $1',
'mycontris' => 'Sumbangan',
'contribsub2' => 'Oleh $1 ($2)',
@@ -2714,6 +2734,7 @@ Laman destinasi "[[:$1]]" telah pun wujud. Adakah anda mahu menghapuskannya supa
'immobile-target-namespace-iw' => 'Pautan interwiki tidak boleh dijadikan sasaran untuk pemindahan laman.',
'immobile-source-page' => 'Anda tidak boleh memindahkan laman ini.',
'immobile-target-page' => 'Anda tidak boleh memindahkan laman ke tajuk itu.',
+'bad-target-model' => 'Destinasi yang dikehendaki menggunakan model kandungan yang berlainan. $1 tidak dapat ditukar kepada $2.',
'imagenocrossnamespace' => 'Anda tidak boleh memindahkan fail ke ruang nama bukan fail',
'nonfile-cannot-move-to-file' => 'Laman bukan fail tidak boleh dipindahkan ke ruang nama fail',
'imagetypemismatch' => 'Sambungan baru fail tersebut tidak sepadan dengan jenisnya',
@@ -2825,6 +2846,7 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
'import-error-interwiki' => 'Laman "$1" tidak diimport kerana namanya ditempah untuk pemautan luaran (antara wiki).',
'import-error-special' => 'Laman "$1" tidak diimport kerana ia tergolong dalam ruang nama khas yang tidak membenarkan laman.',
'import-error-invalid' => 'Laman "$1" tidak diimport kerana namanya tidak sah.',
+'import-error-unserialize' => 'Semakan $2 dari halaman "$1" tidak dapat dinyahsirikan. Semakan ini dilaporkan telah menggunakan model kandungan $3 yang disirikan sebagai $4.',
'import-options-wrong' => '{{PLURAL:$2|Pilihan|Pilihan-pilihan}} salah: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Halaman akar yang dinyatakan adalah tidak sah.',
'import-rootpage-nosubpage' => 'Ruang nama "$1" halaman akar tidak membenarkan subhalaman.',
@@ -2839,7 +2861,6 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
# JavaScriptTest
'javascripttest' => 'Ujian JavaScript',
-'javascripttest-disabled' => 'Fungsi ini belum dapat dihidupkan di wki ini.',
'javascripttest-title' => 'Ujian $1 sedang dijalankan',
'javascripttest-pagetext-noframework' => 'Laman ini ditempah untuk menjalankan ujian JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Kerangka "$1" tidak dikenali.',
@@ -2964,11 +2985,13 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
'pageinfo-default-sort' => 'Kunci isih azali',
'pageinfo-length' => 'Kepanjangan halaman (bait)',
'pageinfo-article-id' => 'ID halaman',
+'pageinfo-language' => 'Bahasa isi kandungan halaman',
'pageinfo-robot-policy' => 'Status enjin pencarian',
'pageinfo-robot-index' => 'Boleh diindekskan',
'pageinfo-robot-noindex' => 'Tidak boleh diindekskan',
'pageinfo-views' => 'Bilangan kunjungan',
'pageinfo-watchers' => 'Bilangan pemantau halaman',
+'pageinfo-few-watchers' => 'Kurang daripada $1 orang pemantau',
'pageinfo-redirects-name' => 'Lencongan ke halaman ini',
'pageinfo-subpages-name' => 'Subhalaman untuk halaman ini',
'pageinfo-subpages-value' => '$1 ($2 lencongan; $3 bukan lencongan)',
@@ -2983,6 +3006,19 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
'pageinfo-magic-words' => 'Kata sakti ($1)',
'pageinfo-hidden-categories' => 'Kategori tersembunyi ($1)',
'pageinfo-templates' => 'Templat tertransklusi ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Halaman|Halaman-halaman}} yang tertransklusi pada ($1)',
+'pageinfo-toolboxlink' => 'Maklumat halaman',
+'pageinfo-redirectsto' => 'Melencong ke',
+'pageinfo-redirectsto-info' => 'maklumat',
+'pageinfo-contentpage' => 'Dikira sebagai halaman kandungan',
+'pageinfo-contentpage-yes' => 'Ya',
+'pageinfo-protect-cascading' => 'Perlindungan sedang melata dari sini',
+'pageinfo-protect-cascading-yes' => 'Ya',
+'pageinfo-protect-cascading-from' => 'Perlindungan sedang melata dari',
+'pageinfo-category-info' => 'Keterangan kategori',
+'pageinfo-category-pages' => 'Bilangan halaman',
+'pageinfo-category-subcats' => 'Bilangan subkategori',
+'pageinfo-category-files' => 'Bilangan fail',
# Skin names
'skinname-standard' => 'Klasik',
@@ -3005,6 +3041,8 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
'markedaspatrollederror' => 'Tidak boleh menanda ronda',
'markedaspatrollederrortext' => 'Anda perlu menyatakan semakan untuk ditanda ronda.',
'markedaspatrollederror-noautopatrol' => 'Anda tidak dibenarkan menanda ronda perubahan anda sendiri.',
+'markedaspatrollednotify' => 'Perubahan pada $1 ini telah ditandai sebagai dironda.',
+'markedaspatrollederrornotify' => 'Penandaan sebagai dironda gagal.',
# Patrol log
'patrol-log-page' => 'Log pemeriksaan',
@@ -3039,6 +3077,7 @@ Dengan menjalankannya, komputer anda mungkin akan terjejas.",
'file-nohires' => 'Tiada leraian lebih besar.',
'svg-long-desc' => 'Fail SVG, ukuran dasar $1 × $2 piksel, saiz fail: $3',
'svg-long-desc-animated' => 'Fail SVG animasi, ukuran dasar $1 × $2 piksel, saiz fail: $3',
+'svg-long-error' => 'Fail SVG tidak sah: $1',
'show-big-image' => 'Leraian penuh',
'show-big-image-preview' => 'Saiz pralihat ini: $1.',
'show-big-image-other' => '{{PLURAL:$2|Leraian|Leraian-leraian}} lain: $1.',
@@ -3071,7 +3110,10 @@ Dengan menjalankannya, komputer anda mungkin akan terjejas.",
'minutes' => '$1 minit',
'hours' => '$1 jam',
'days' => '$1 hari',
+'months' => '$1 bulan',
+'years' => '$1 tahun',
'ago' => '$1 yang lalu',
+'just-now' => 'tadi',
# Bad image list
'bad_image_list' => 'Berikut adalah format yang digunakan:
@@ -3562,6 +3604,7 @@ Kod pengesahan ini akan luput pada $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Penyertaan pautan interwiki dilumpuhkan]',
'scarytranscludefailed' => '[Gagal mendapatkan templat $1]',
+'scarytranscludefailed-httpstatus' => '[Ambilan templat gagal untuk $1: HTTP $2]',
'scarytranscludetoolong' => '[URL terlalu panjang]',
# Delete conflict
@@ -3684,6 +3727,7 @@ Anda juga boleh [[Special:EditWatchlist|menggunakan penyunting piawai]].',
'version-license' => 'Lesen',
'version-poweredby-credits' => "Wiki ini dikuasakan oleh '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
'version-poweredby-others' => 'penyumbang-penyumbang lain',
+'version-credits-summary' => 'Kami ingin mengucapkan sekalung budi kepada mereka yang berikut atas sumbangan mereka keada [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki adalah perisian bebas; anda boleh mengedarkannya semula dan/atau mengubah suainya di bawah terma-terma Lesen Awam GNU sebagai mana yang telah diterbitkan oleh Yayasan Perisian Bebas, sama ada versi 2 bagi Lesen tersebut, atau (berdasarkan pilihan anda) mana-mana versi selepasnya.
MediaWiki diedarkan dengan harapan bahawa ia berguna, tetapi TANPA SEBARANG WARANTI; hatta waranti yang tersirat bagi KEBOLEHDAGANGAN mahupun KESESUAIAN UNTUK TUJUAN TERTENTU. Sila lihat Lesen Awam GNU untuk butiran lanjut.
@@ -3800,17 +3844,17 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
'sqlite-no-fts' => '$1 tanpa sokongan carian teks penuh',
# New logging system
-'logentry-delete-delete' => '$1 menghapuskan laman $3',
-'logentry-delete-restore' => '$1 memulihkan laman $3',
-'logentry-delete-event' => '$1 mengubah keterlihatan {{PLURAL:$5|satu peristiwa log|$5 peristiwa log}} di $3: $4',
-'logentry-delete-revision' => '$1 mengubah keterlihatan {{PLURAL:$5|satu semakan|$5 semakan}} di $3: $4',
-'logentry-delete-event-legacy' => '$1 mengubah keterlihatan peristiwa-peristiwa log di $3',
-'logentry-delete-revision-legacy' => '$1 mengubah keterlihatan semakan-semakan di $3',
-'logentry-suppress-delete' => '$1 menyekat laman $3',
-'logentry-suppress-event' => '$1 mengubah keterlihatan {{PLURAL:$5|satu peristiwa log|$5 peristiwa log}} di $3 secara rahsia: $4',
-'logentry-suppress-revision' => '$1 mengubah keterlihatan {{PLURAL:$5|satu semakan|$5 semakan}} di $3 secara rahsia: $4',
-'logentry-suppress-event-legacy' => '$1 mengubah keterlihatan peristiwa-peristiwa log di $3 secara rahsia',
-'logentry-suppress-revision-legacy' => '$1 mengubah keterlihatan semakan-semakan di $3 secara rahsia',
+'logentry-delete-delete' => '$1 telah {{GENDER:$2|menghapuskan}} halaman $3',
+'logentry-delete-restore' => '$1 telah {{GENDER:$2|memulihkan}} halaman $3',
+'logentry-delete-event' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 peristiwa log di $3: $4',
+'logentry-delete-revision' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 semakan di halaman $3: $4',
+'logentry-delete-event-legacy' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan peristiwa log di $3',
+'logentry-delete-revision-legacy' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan semakan di halaman $3',
+'logentry-suppress-delete' => '$1 telah {{GENDER:$2|menyekat}} halaman $3',
+'logentry-suppress-event' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 peristiwa log di $3 secara senyap: $4',
+'logentry-suppress-revision' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 semakan di halaman $3 secara senyap: $4',
+'logentry-suppress-event-legacy' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan peristiwa log di $3 secara senyap',
+'logentry-suppress-revision-legacy' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan semakan di halaman $3 secara senyap',
'revdelete-content-hid' => 'kandungan tersorok',
'revdelete-summary-hid' => 'ringkasan suntingan tersorok',
'revdelete-uname-hid' => 'nama pengguna tersorok',
@@ -3819,17 +3863,21 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
'revdelete-uname-unhid' => 'nama pengguna terdedah',
'revdelete-restricted' => 'mengenakan sekatan pada penyelia',
'revdelete-unrestricted' => 'menarik sekatan daripada penyelia',
-'logentry-move-move' => '$1 memindahkan laman $3 ke $4',
-'logentry-move-move-noredirect' => '$1 mengalihkan laman $3 ke $4 tanpa meninggalkan lencongan',
-'logentry-move-move_redir' => '$1 mengalihkan laman $3 ke $4 pada lencongan',
-'logentry-move-move_redir-noredirect' => '$1 mengalihkan laman $3 ke $4 pada satu lencongan tanpa meninggalkan lencongan',
-'logentry-patrol-patrol' => '$1 menandakan semakan $4 daripada laman $3 sebagai dironda',
-'logentry-patrol-patrol-auto' => '$1 menandakan semakan $4 daripada laman $3 sebagai dironda secara automatik',
-'logentry-newusers-newusers' => 'Akaun pengguna $1 dibuka',
-'logentry-newusers-create' => 'Akaun pengguna $1 dibuka',
-'logentry-newusers-create2' => 'Akaun pengguna $3 dibuka oleh $1',
-'logentry-newusers-autocreate' => 'Akaun $1 dibuka secara automatik',
-'newuserlog-byemail' => 'kata laluan dihantar melalui e-mel',
+'logentry-move-move' => '$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4',
+'logentry-move-move-noredirect' => '$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 tanpa meninggalkan lencongan',
+'logentry-move-move_redir' => '$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 melalui lencongan',
+'logentry-move-move_redir-noredirect' => '$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 melalui lencongan tanpa meninggalkan lencongan',
+'logentry-patrol-patrol' => '$1 telah {{GENDER:$2|menanda}} semakan $4 di halaman $3 sebagai dironda',
+'logentry-patrol-patrol-auto' => '$1 telah {{GENDER:$2|menanda}} semakan $4 di halaman $3 sebagai dironda secara automatik',
+'logentry-newusers-newusers' => 'Akaun pengguna $1 telah {{GENDER:$2|dibuka}}',
+'logentry-newusers-create' => 'Akaun pengguna $1 telah {{GENDER:$2|dibuka}}',
+'logentry-newusers-create2' => 'Akaun pengguna $3 telah {{GENDER:$2|dibuka}} oleh $1',
+'logentry-newusers-byemail' => 'Akaun pengguna $3 telah {{GENDER:$2|dibuka}} oleh $1 dan kata laluannya dihantar melalui e-mel',
+'logentry-newusers-autocreate' => 'Akaun pengguna $1 telah {{GENDER:$2|dibuka}} secara automatik',
+'logentry-rights-rights' => '$1 telah {{GENDER:$2|menukar}} keahlian kumpulan untuk $3 dari $4 ke $5',
+'logentry-rights-rights-legacy' => '$1 telah {{GENDER:$2|menukar}} keahlian kumpulan untuk $3',
+'logentry-rights-autopromote' => '$1 telah {{GENDER:$2|dinaik pangkat}} secara automatik dari $4 ke $5',
+'rightsnone' => '(tiada)',
# Feedback
'feedback-bugornote' => 'Jika anda bersedia untuk menerangkan masalah teknikal secara terperinci, sila [$1 laporkan pepijat].
@@ -3883,6 +3931,7 @@ Ataupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dic
'api-error-ok-but-empty' => 'Ralat dalaman: tiada gerak balas dari pelayan.',
'api-error-overwrite' => 'Menulis ganti fail yang telah wujud adalah tidak dibenarkan.',
'api-error-stashfailed' => 'Ralat dalaman: pelayan tidak dapat menyimpan fail sementara.',
+'api-error-publishfailed' => 'Ralat dalaman: Pelayan tidak dapat menerbitkan fail sementara.',
'api-error-timeout' => 'Pelayan tidak bergerak balas dalam tempoh yang diharapkan.',
'api-error-unclassified' => 'Berlakunya ralat yang tidak diketahui',
'api-error-unknown-code' => 'Ralat tidak diketahui: "$1"',
@@ -3903,4 +3952,7 @@ Ataupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dic
'duration-centuries' => '$1 abad',
'duration-millennia' => '$1 alaf',
+# Image rotation
+'rotate-comment' => 'Imej diputar sebanyak $1 {{PLURAL:$1|darjah|darjah}} mengikut arah jam',
+
);
diff --git a/languages/messages/MessagesMt.php b/languages/messages/MessagesMt.php
index 5287ce80..e5cc31b0 100644
--- a/languages/messages/MessagesMt.php
+++ b/languages/messages/MessagesMt.php
@@ -418,7 +418,6 @@ $messages = array(
'qbbrowse' => 'Qalleb',
'qbedit' => 'Immodifika',
'qbpageoptions' => 'Din il-paġna',
-'qbpageinfo' => 'Kuntest',
'qbmyoptions' => 'Il-paġni tiegħi',
'qbspecialpages' => 'Paġni speċjali',
'faq' => 'Mistoqsijiet komuni',
@@ -441,6 +440,7 @@ $messages = array(
'namespaces' => 'Spazji tal-isem',
'variants' => 'Varjanti',
+'navigation-heading' => "Menu ta' navigazzjoni",
'errorpagetitle' => 'Problema',
'returnto' => "Erġa' lura lejn $1.",
'tagline' => 'Minn {{SITENAME}}',
@@ -664,11 +664,8 @@ Ir-raġuni li ġiet mogħtija kienet ''$2''.",
# Login and logout pages
'logouttext' => "'''Bħalissa tinsab barra mill-kont tiegħek.'''
-Tista' tkompli tuża' {{SITENAME}} bħala utent anonimu, jew tista' terġa [[Special:UserLogin|tidħol]] bħala l-istess utent jew wieħed differenti.
+Tista' tkompli tuża' {{SITENAME}} bħala utent anonimu, jew tista' terġa <span class='plainlinks'>[$1 tidħol]</span> bħala l-istess utent jew wieħed differenti.
Kun af li ċerti paġni jistgħu jkomplu jidhru bħallikieku l-illogjar 'l barra mill-kont qatt ma seħħ, sakemm ma tħassarx il-cache tal-browser.",
-'welcomecreation' => "== Merħba, $1! ==
-Il-kont tiegħek ġie maħluq.<br />
-Tinsiex tippersonalizza l-[[Special:Preferences|preferenzi]] ta' {{SITENAME}}.",
'yourname' => 'Isem tal-utent:',
'yourpassword' => 'Password:',
'yourpasswordagain' => "Erġa' ikteb il-password:",
@@ -993,7 +990,6 @@ L-aħħar daħla fir-reġistru hija disponibbli hawn taħt għar-referenza:",
'template-semiprotected' => '(semi-protetta)',
'hiddencategories' => "Din il-paġna hija membru ta' {{PLURAL:$1|1 kategorija moħbija|$1 kategoriji moħbija}}:",
'edittools' => '<!-- Kliem hawnhekk jidher taħt l-formuli tal-modifika u postjar. -->',
-'nocreatetitle' => 'Il-ħolqien tal-paġna ġie miżmum',
'nocreatetext' => "{{SITENAME}} limitat l-abbilitá tal-ħolqien ta' paġni ġodda.
Tista' tmur lura u tagħmel modifiki ta' paġni eżistenti, inkella [[Special:UserLogin|idħol jew oħloq kont ġdid]].",
'nocreate-loggedin' => "M'għandekx permess li toħloq paġni ġodda.",
@@ -1017,6 +1013,12 @@ Jidher li din ġiet imħassra.',
'edit-already-exists' => 'Ma tistax tinħoloq din il-paġna.
Din teżisti diġà.',
+# Content models
+'content-model-wikitext' => 'test tal-wiki',
+'content-model-text' => 'test normali',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Twissija:''' Din il-paġna għandha ħafna sejħiet għall-funzjonijiet parser.
@@ -1365,9 +1367,9 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
'prefs-emailconfirm-label' => 'Konferma tal-ittra-e:',
'prefs-textboxsize' => 'Daqs tat-tieqa tal-modifika',
'youremail' => 'E-mail:',
-'username' => 'Isem tal-utent:',
-'uid' => 'L-ID tal-utent:',
-'prefs-memberingroups' => 'Membru tal-{{PLURAL:$1|grupp|gruppi}}:',
+'username' => '{{GENDER:$1|Isem tal-utent}}:',
+'uid' => '{{GENDER:$1|ID tal-utent}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Membru}} tal-{{PLURAL:$1|grupp|gruppi}}:',
'prefs-memberingroups-type' => '$1',
'prefs-registration' => "Ħin ta' reġistrazzjoni:",
'yourrealname' => 'Isem proprju:',
@@ -1515,12 +1517,13 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
'right-sendemail' => 'Jibgħat ittri-e lil utenti oħra',
'right-passwordreset' => 'Jara l-messaġġi tal-impostazzjoni mill-ġdid tal-password',
+# Special:Log/newusers
+'newuserlogpage' => 'Utenti Ä¡odda',
+'newuserlogpagetext' => "Dan hu reġistru tal-kreazzjoni ta' kontijiet ġodda.",
+
# User rights log
'rightslog' => 'Drittijiet tal-utenti',
'rightslogtext' => "Dan huwa r-reġistru tal-modifiki ta' drittijiet tal-utenti.",
-'rightslogentry' => "biddel is-sħubija ta' $1 minn $2 għal $3",
-'rightslogentry-autopromote' => 'ġie awtomatikament promoss minn $2 għal $3',
-'rightsnone' => '(xejn)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'aqra din il-paġna',
@@ -2101,8 +2104,9 @@ Ara wkoll il-[[Special:WantedCategories|kategoriji rikjesti]].',
'linksearch-pat' => "Mudell ta' tfittxija:",
'linksearch-ns' => 'Spazju tal-isem:',
'linksearch-ok' => 'Fittex',
-'linksearch-text' => 'Huwa possibbli li tagħmel użu minn metakarattri, per eżempju "*.wikipedia.org".<br />
-Protokolli aċċettati: <code>$1</code>',
+'linksearch-text' => 'Tista\' tagħmel użu minn metakarattri, per eżempju "*.wikipedia.org".<br />
+Huwa neċessarju minn tal-inqas dominju tal-ewwel livell, per eżempju "*.org".<br />
+Protokolli aċċettati: <code>$1</code> (jekk ma jiġi speċifikat l-ebda protokol, dan jiġi awtomatikament definit bħala http://).',
'linksearch-line' => '$1 hija marbuta mill-paġna $2',
'linksearch-error' => 'Il-metakarattri jistgħu jintużaw biss fil-bidu tal-indirizz.',
@@ -2121,10 +2125,6 @@ Protokolli aċċettati: <code>$1</code>',
'activeusers-hidesysops' => 'Aħbi amministraturi',
'activeusers-noresult' => 'L-ebda utent ma nstab.',
-# Special:Log/newusers
-'newuserlogpage' => 'Utenti Ä¡odda',
-'newuserlogpagetext' => "Dan hu reġistru tal-kreazzjoni ta' kontijiet ġodda.",
-
# Special:ListGroupRights
'listgrouprights' => 'Drittijiet tal-grupp tal-utenti',
'listgrouprights-summary' => "Hawn taħt hawn elenkati l-gruppi tal-utenti għal din il-wiki, bid-drittijiet ta' aċċess rispettiv.
@@ -2218,42 +2218,48 @@ Kwalunkwe modifika li ssir fil-futur, kemm fuq din il-paġna u fil-paġna ta\' d
'enotif_mailer' => "Sistema ta' notifikazzjoni bl-użu tal-posta elettronika fuq {{SITENAME}}",
'enotif_reset' => 'Immarka l-paġni kollha bħala diġà viżitati',
-'enotif_newpagetext' => 'Din hija paġna ġdida.',
'enotif_impersonal_salutation' => "Utent ta' {{SITENAME}}",
-'changed' => 'modifikata',
-'created' => 'inħolqot',
-'enotif_subject' => 'Il-Paġna $PAGETITLE ta\' {{SITENAME}} ġiet $CHANGEDORCREATED minn $PAGEEDITOR',
+'enotif_subject_deleted' => "Il-paġna $1 ta' {{SITENAME}} ġiet imħassra minn {{gender:$2|$2}}",
+'enotif_subject_created' => "Il-paġna $1 ta' {{SITENAME}} ġiet maħluqa minn {{gender:$2|$2}}",
+'enotif_subject_moved' => "Il-paġna $1 ta' {{SITENAME}} tmexxiet minn {{gender:$2|$2}}",
+'enotif_subject_restored' => "Il-paġna $1 ta' {{SITENAME}} ġiet irkuprata minn {{gender:$2|$2}}",
+'enotif_subject_changed' => "Il-paġna $1 ta' {{SITENAME}} ġiet mibdula minn {{gender:$2|$2}}",
+'enotif_body_intro_deleted' => 'Il-paġna $1 ta\' {{SITENAME}} ġiet imħassra minn {{gender:$2|$2}} nhar il-$PAGEEDITDATE (ara $3 għar-reviżjoni attwali).',
+'enotif_body_intro_created' => 'Il-paġna $1 ta\' {{SITENAME}} ġiet maħluqa minn {{gender:$2|$2}} nhar il-$PAGEEDITDATE, ara $3 għar-reviżjoni attwali.',
+'enotif_body_intro_moved' => 'Il-paġna $1 ta\' {{SITENAME}} tmexxiet minn {{gender:$2|$2}} nhar il-$PAGEEDITDATE, ara $3 għar-reviżjoni attwali.',
+'enotif_body_intro_restored' => 'Il-paġna $1 ta\' {{SITENAME}} ġiet irkuprata minn {{gender:$2|$2}} nhar il-$PAGEEDITDATE, ara $3 għar-reviżjoni attwali.',
+'enotif_body_intro_changed' => 'Il-paġna $1 ta\' {{SITENAME}} ġiet mibdula minn {{gender:$2|$2}} nhar il-$PAGEEDITDATE, ara $3 għar-reviżjoni attwali.',
'enotif_lastvisited' => 'Ara $1 għal modifiki kollha mill-aħħar żjara.',
'enotif_lastdiff' => 'Ara $1 biex tara din l-modifika.',
'enotif_anon_editor' => 'utent anonimu $1',
-'enotif_body' => 'Għażiż $WATCHINGUSERNAME,
-
-Il-paġna $PAGETITLE ta\' {{SITENAME}} ġiet $CHANGEDORCREATED nhar il-$PAGEEDITDATE minn $PAGEEDITOR; il-verżjoni kurrenti tinsab fl-indirizz $PAGETITLE_URL.
+'enotif_body' => 'Għażiż/a $WATCHINGUSERNAME,
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Taqsira tal-editur: $PAGESUMMARY $PAGEMINOREDIT
Ikkuntatja lill-editur:
-ittra-e: $PAGEEDITOR_EMAIL
+ittre: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Mhux se jiġu mibgħuta notifiki oħra f\'każ ta\' aktar modifiki sakemm ma żżurx din il-paġna. Huwa possibbli li terġa\' tpoġġi l-avviż mill-ġdid għal paġni kollha fil-lista ta\' osservazzjonijiet.
+Mhux se jkun hemm iktar notifiki oħra f\'każ ta\' aktar modifiki sakemm ma żżurx din il-paġna. Huwa possibbli li tippersonalizza s-sistema ta\' notifikazzjoni għall-paġni kollha fil-lista ta\' osservazzjoni tiegħek.
-Is-sistema ta\' notifika ta\' {{SITENAME}}, fis-servizz tiegħek
+Is-sistema ta\' notifika ta\' {{SITENAME}}
--
Biex tbiddel it-tqegħid tan-notifiki permezz tal-posta elettronika, żur
-{{fullurl:{{#special:Preferences}}}}
+{{canonicalurl:{{#special:Preferences}}}}
Biex tbiddel t-tqegħid tal-lista ta\' osservazzjonijiet, żur
-{{fullurl:{{#special:Preferences}}}}
+{{canonicalurl:{{#special:EditWatchlist}}}}
Biex tħassar il-paġna minn fuq il-lista ta\' osservazzjonijiet, żur
$UNWATCHURL
-Biex tgħaddi l-kummenti tiegħek u biex tikseb aktar għajnuna:
-{{fullurl:{{MediaWiki:Helppage}}}}',
+Biex tgħaddi kumment u biex tikseb iktar għajnuna:
+{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'inħolqot',
+'changed' => 'modifikata',
# Delete
'deletepage' => 'Ħassar il-paġna',
@@ -2396,8 +2402,8 @@ Int jista' jkollhok link ħażin, jew jista' jkun li ir-reviżjoni ġie rkuprat
'undeletedrevisions' => '{{PLURAL:$1|reviżjoni irkuprata|$1 reviżjonijiet irkuprati}}',
'undeletedrevisions-files' => '{{PLURAL:$1|reviżjoni waħda|$1 reviżjonijiet}} u {{PLURAL:$2|fajl wieħed irkuprat|$2 fajls irkuprati}}',
'undeletedfiles' => '{{PLURAL:$1|file wieħed|$1 fajls}} irkuprati',
-'cannotundelete' => "L-irkuprar ma rnexxiex;
-jista' jkun li xi ħadd ieħor irkupra l-paġna qabel.",
+'cannotundelete' => 'L-irkuprar ma rnexxiex:
+$1',
'undeletedpage' => "'''$1 Ä¡ie irkuprat'''
Ikkonsulta r-[[Special:Log/delete|reġistru tat-tħassir]] biex tara t-tħassir u l-irkuprar ta' paġni l-aktar riċenti.",
@@ -2429,7 +2435,7 @@ $1',
'blanknamespace' => '(Prinċipali)',
# Contributions
-'contributions' => 'Kontribuzzjonijiet tal-utent',
+'contributions' => 'Kontribuzzjonijiet tal-{{GENDER:$1|utent}}',
'contributions-title' => 'Kontribuzzjonijiet tal-utent għal $1',
'mycontris' => 'Kontribuzzjonijiet',
'contribsub2' => 'Għal $1 ($2)',
@@ -2809,7 +2815,6 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
# JavaScriptTest
'javascripttest' => 'Testjar tal-JavaScript',
-'javascripttest-disabled' => 'Din il-funzjoni ma Ä¡ietx abilitata fuq din il-wiki.',
'javascripttest-pagetext-noframework' => 'Din il-paġna hi riservata għall-eżekuzzjoni tat-testijiet tal-JavaScript.',
'javascripttest-pagetext-frameworks' => 'Jekk jogħġbok agħżel wieħed mill-oqsma tal-ittestjar: $1',
'javascripttest-pagetext-skins' => 'Agħżel aspett grafiku fuq liema tesegwixxi testijiet:',
@@ -2939,6 +2944,7 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
'pageinfo-display-title' => 'Titlu muri',
'pageinfo-length' => "Daqs tal-paġna (f'bytes)",
'pageinfo-article-id' => 'ID tal-paġna',
+'pageinfo-language' => 'Lingwa tal-kontenut tal-paġna',
'pageinfo-robot-policy' => 'Stat għall-muturi tat-tfittxija',
'pageinfo-robot-index' => 'Indiċjabbli',
'pageinfo-robot-noindex' => 'Mhux indiċjabbli',
@@ -2958,6 +2964,14 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
'pageinfo-magic-words' => '{{PLURAL:$1|Kelma maġika|Kliem maġiku}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategorija|Kategoriji}} moħbija ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Mudell inkluż|Mudelli inklużi}} ($1)',
+'pageinfo-toolboxlink' => 'Informazzjoni fuq il-paġna',
+'pageinfo-redirectsto' => 'Tirrindirizza lejn',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => "Magħduda bħala paġna ta' kontenut",
+'pageinfo-contentpage-yes' => 'Iva',
+'pageinfo-protect-cascading' => 'Protezzjoni li tintiret minn hawnhekk',
+'pageinfo-protect-cascading-yes' => 'Iva',
+'pageinfo-protect-cascading-from' => 'Protezzjoni li tintiret minn',
# Skin names
'skinname-standard' => 'Classic',
@@ -2979,6 +2993,8 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
'markedaspatrollederror' => 'Ma jistax jiġi markat bħalha verifikat',
'markedaspatrollederrortext' => 'Int trid tispeċifika r-reviżjoni li trida tkun verifikata.',
'markedaspatrollederror-noautopatrol' => "Int m'għandhekx id-drittijiet neċessarji biex timmarka l-modifiki tiegħek bħala verifikati.",
+'markedaspatrollednotify' => 'Din il-bidla fuq $1 ġiet immarkata bħala verifikata.',
+'markedaspatrollederrornotify' => 'L-ivverifikar tal-modifika falla.',
# Patrol log
'patrol-log-page' => 'Modifiki verifikati',
@@ -3789,7 +3805,10 @@ Stampi huwa mogħrija b'risoluzzjoni sħiħa, tipi tal-fajl oħrajn jibdew bil-p
'logentry-newusers-create' => 'Il-kont $1 ġie maħluq',
'logentry-newusers-create2' => 'Il-kont $3 ġie maħluq minn $1',
'logentry-newusers-autocreate' => 'Il-kont $1 ġie maħluq awtomatikament',
-'newuserlog-byemail' => "il-password intbagħtet permezz ta' posta elettronika",
+'logentry-rights-rights' => "$1 {{GENDER:$2|biddel|biddlet}} is-sħubija ta' $3 minn $4 għal $5",
+'logentry-rights-rights-legacy' => "$1 {{GENDER:$2|biddel|biddlet}} is-sħubija fil-gruppi ta' $3",
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|ġie|ġiet}} awtomatikament {{GENDER:$2|promoss|promossa}} minn $4 għal $5',
+'rightsnone' => '(xejn)',
# Feedback
'feedback-subject' => 'Suġġett:',
diff --git a/languages/messages/MessagesMwl.php b/languages/messages/MessagesMwl.php
index fe592f65..a0f38323 100644
--- a/languages/messages/MessagesMwl.php
+++ b/languages/messages/MessagesMwl.php
@@ -211,7 +211,6 @@ $messages = array(
'qbbrowse' => 'Nabegar',
'qbedit' => 'Eiditar',
'qbpageoptions' => 'Esta páigina',
-'qbpageinfo' => 'Cuntesto',
'qbmyoptions' => 'Mies páiginas',
'qbspecialpages' => 'Páiginas speciales',
'faq' => 'FAQ',
@@ -640,9 +639,11 @@ Causo l çponiblizes, este será outelizado pa te dar crédito pul tou trabalho.
'right-move' => 'Arrastrar páiginas',
'right-movefile' => 'Arrastrar fexeiros',
+# Special:Log/newusers
+'newuserlogpage' => 'Registro de criaçon de outelizadores',
+
# User rights log
'rightslog' => 'Registro de dreitos de l outelizador',
-'rightsnone' => '(nanhun)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lher esta páigina',
@@ -847,9 +848,6 @@ Páiginas que steian ne ls [[Special:Watchlist|tous begiados]] son amostradas an
# Special:ListUsers
'listusers-submit' => 'Amostrar',
-# Special:Log/newusers
-'newuserlogpage' => 'Registro de criaçon de outelizadores',
-
# Special:ListGroupRights
'listgrouprights-rights' => 'Dreitos',
'listgrouprights-members' => '(lista de nembros)',
@@ -876,8 +874,8 @@ Altaraçones feturas na tal páigina i páiginas de çcusson a eilha associadas
'watching' => 'A begiar...',
'unwatching' => 'A deixar de begiar...',
-'changed' => 'demudada',
'created' => 'criada',
+'changed' => 'demudada',
# Delete
'deletepage' => 'Botar fuora páigina',
@@ -1234,4 +1232,7 @@ Causo l fexeiro tenga sido demudado a partir de l sou stado oureginal, alguns de
'tags-title' => 'Eitiquetas',
'tags-edit' => 'eiditar',
+# New logging system
+'rightsnone' => '(nanhun)',
+
);
diff --git a/languages/messages/MessagesMy.php b/languages/messages/MessagesMy.php
index 4b92b47b..8056de4f 100644
--- a/languages/messages/MessagesMy.php
+++ b/languages/messages/MessagesMy.php
@@ -191,7 +191,6 @@ $messages = array(
'qbbrowse' => 'ရှာဖွေလှန်လှောရန်',
'qbedit' => 'ပြင်​ဆင်​ရန်​',
'qbpageoptions' => 'ဤစာမျက်နှာ',
-'qbpageinfo' => 'မာá€á€­á€€á€¬',
'qbmyoptions' => 'ကျွန်ုပ် စာမျက်နှာများ',
'qbspecialpages' => 'အ​ထူး​စာ​မျက်​နှာ​',
'faq' => 'မေးလေ့ရှိကြသည်များ',
@@ -376,12 +375,9 @@ $1',
'virus-unknownscanner' => 'အမည်မသိအန်á€á€®á€—ိုင်းရပ်စ် -',
# Login and logout pages
-'logouttext' => 'သင်သည် လော့ဂ်အောက် လုပ်လိုက်ပြီဖြစ်သည်á‹
-သင့်အနေနှင့် ဤ {{SITENAME}} á€á€€á€ºá€˜á€ºá€†á€­á€¯á€€á€ºá€’်ကို အမည်မသိ အသုံးပြုသူ အနေနှင့် ဆက်လက် အသုံးပြုနိုင်သည်ዠသို့မဟုá€á€º ယá€á€„် အသုံးပြုသူ အမည် သို့ အသုံးပြုသူ အá€á€¼á€¬á€¸á€¡á€™á€Šá€ºá€á€…်á€á€¯á€–ြင့် [[Special:UserLogin|နောက်á€á€…်ကြိမ် လော့ဂ်အင်ပြန်á€á€„်]] နိုင်သည်á‹
-သင်á ဘရောက်ဆာမှ cache ကို ရှင်းလင်းသည့် အá€á€»á€­á€”် အထိ အá€á€»á€­á€¯á€·á€žá€±á€¬ စာမျက်နှာ များသည် သင် လော့ဂ်အင် á€á€„်ထားစဉ်က အá€á€­á€¯á€„်းပင် ဆက်လက် ပြသနေမည်ဖြစ်သည်á‹',
-'welcomecreation' => '== မင်္ဂလာပါ $1! ==
-သင့်အကောင့်ကို ဖန်á€á€®á€¸á€•á€¼á€®á€¸á€•á€«á€•á€¼á€®á‹
-[[Special:Preferences|{{SITENAME}} စိá€á€ºâ€‹á€€á€¼á€­á€¯á€€á€ºâ€‹á€›á€½á€±á€¸á€á€»á€šá€ºá€…ရာá€á€­á€¯á€·]]ကို ပြောင်းရန် မမေ့ပါနှင့်á‹',
+'logouttext' => "သင်သည် လော့ဂ်အောက် လုပ်လိုက်ပြီဖြစ်သည်á‹
+သင့်အနေနှင့် ဤ {{SITENAME}} á€á€€á€ºá€˜á€ºá€†á€­á€¯á€€á€ºá€’်ကို အမည်မသိ အသုံးပြုသူ အနေနှင့် ဆက်လက် အသုံးပြုနိုင်သည်ዠသို့မဟုá€á€º ယá€á€„် အသုံးပြုသူ အမည် သို့ အသုံးပြုသူ အá€á€¼á€¬á€¸á€¡á€™á€Šá€ºá€á€…်á€á€¯á€–ြင့် <span class='plainlinks'>[$1 နောက်á€á€…်ကြိမ် လော့ဂ်အင်ပြန်á€á€„်]</span> နိုင်သည်á‹
+သင်á ဘရောက်ဆာမှ cache ကို ရှင်းလင်းသည့် အá€á€»á€­á€”် အထိ အá€á€»á€­á€¯á€·á€žá€±á€¬ စာမျက်နှာ များသည် သင် လော့ဂ်အင် á€á€„်ထားစဉ်က အá€á€­á€¯á€„်းပင် ဆက်လက် ပြသနေမည်ဖြစ်သည်á‹",
'yourname' => 'အသုံးပြုသူအမည် -',
'yourpassword' => 'စကားá€á€¾á€€á€º -',
'yourpasswordagain' => 'စကားá€á€¾á€€á€º ပြန်​ရိုက်​ပါ -',
@@ -898,11 +894,13 @@ Your e-mail address is not revealed when other users contact you.
'right-userrights-interwiki' => 'အá€á€¼á€¬á€¸á€á€®á€€á€®á€™á€»á€¬á€¸á€™á€¾ အသုံးပြုသူများá အသုံးပြုသူအá€á€½á€„့်အရေးများကို á€á€Šá€ºá€¸á€–ြá€á€ºá€›á€”်',
'right-sendemail' => 'အá€á€¼á€¬á€¸á€¡á€žá€¯á€¶á€¸á€•á€¼á€¯á€žá€°á€™á€»á€¬á€¸á€€á€­á€¯ အီးမေးပို့ရန်',
+# Special:Log/newusers
+'newuserlogpage' => 'အသုံးပြုသူအသစ်ရောက်လာá€á€¼á€„်း မှá€á€ºá€á€™á€ºá€¸',
+'newuserlogpagetext' => 'ဤသည်မှာ အသုံးပြုသူအသစ် ဖá€á€ºá€á€®á€¸á€™á€¾á€¯ မှá€á€ºá€á€™á€ºá€¸ ဖြစ်သည်á‹',
+
# User rights log
'rightslog' => 'အသုံးပြုသူá အá€á€½á€„့်အရေးများ မှá€á€ºá€á€™á€ºá€¸',
'rightslogtext' => 'ဤသည်မှာ အသုံးပြုသူအá€á€½á€„့်အရေးများá ပြောင်းလဲမှုများမှá€á€ºá€á€™á€ºá€¸á€–ြစ်သည်á‹',
-'rightslogentry' => '$1 အá€á€½á€€á€º အုပ်စုအသင်á€á€„်ဖြစ်မှုကို အုပ်စု $2 မှ အုပ်စု $3 သို့ ပြောင်းလဲပြီး',
-'rightsnone' => '(ဘာမှမရှိ)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ဤစာမျက်နှာကို ဖá€á€ºá€›á€”်',
@@ -1265,10 +1263,6 @@ Your e-mail address is not revealed when other users contact you.
'activeusers-hidesysops' => 'အက်ဒမင်များကို á€á€¾á€€á€ºá€›á€”်',
'activeusers-noresult' => 'အသုံးပြုသူ မá€á€½á€±á€·á€•á€«á‹',
-# Special:Log/newusers
-'newuserlogpage' => 'အသုံးပြုသူအသစ်ရောက်လာá€á€¼á€„်း မှá€á€ºá€á€™á€ºá€¸',
-'newuserlogpagetext' => 'ဤသည်မှာ အသုံးပြုသူအသစ် ဖá€á€ºá€á€®á€¸á€™á€¾á€¯ မှá€á€ºá€á€™á€ºá€¸ ဖြစ်သည်á‹',
-
# Special:ListGroupRights
'listgrouprights' => 'အသုံးပြုသူအုပ်စု အá€á€½á€„့်အရေးများ',
'listgrouprights-group' => 'အုပ်စု',
@@ -1322,11 +1316,10 @@ Your e-mail address is not revealed when other users contact you.
'watching' => 'စောင့်ကြည့်လျက်ရှိ...',
'unwatching' => 'စောင့်မကြည့်á€á€±á€¬á€·...',
-'enotif_newpagetext' => 'ဤသည်မှာ စာမျက်နှာအသစ်ဖြစ်သည်á‹',
'enotif_impersonal_salutation' => '{{SITENAME}} အသုံးပြုသူ',
-'changed' => 'ပြောင်းလဲလိုက်သည်',
-'created' => 'ဖန်á€á€®á€¸á€œá€­á€¯á€€á€ºá€žá€Šá€º',
'enotif_anon_editor' => 'အမည်မသိ အသုံးပြုသူ $1',
+'created' => 'ဖန်á€á€®á€¸á€œá€­á€¯á€€á€ºá€žá€Šá€º',
+'changed' => 'ပြောင်းလဲလိုက်သည်',
# Delete
'deletepage' => 'စာမျက်နှာကိုဖျက်ပါ',
@@ -1915,7 +1908,7 @@ Your e-mail address is not revealed when other users contact you.
# New logging system
'revdelete-restricted' => 'အက်ဒမင်များသို့ ကန့်သá€á€ºá€á€»á€€á€ºá€™á€»á€¬á€¸ သက်ရောက်ရန်',
'revdelete-unrestricted' => 'အက်ဒမင်များအá€á€½á€€á€º ကန့်သá€á€ºá€á€»á€€á€ºá€™á€»á€¬á€¸á€€á€­á€¯ ဖယ်ရှားရန်',
-'newuserlog-byemail' => 'စကားá€á€¾á€€á€ºá€€á€­á€¯ အီးမေးဖြင့် ပို့လိုက်ပါပြီá‹',
+'rightsnone' => '(ဘာမှမရှိ)',
# API errors
'api-error-filename-tooshort' => 'ဖိုင်အမည်သည် á€á€­á€¯á€œá€½á€”်းသည်á‹',
diff --git a/languages/messages/MessagesMyv.php b/languages/messages/MessagesMyv.php
index 9ac08f86..ea9c1e88 100644
--- a/languages/messages/MessagesMyv.php
+++ b/languages/messages/MessagesMyv.php
@@ -329,7 +329,6 @@ $messages = array(
'qbbrowse' => 'Ваномо-тееме',
'qbedit' => 'Витнеме-петнеме',
'qbpageoptions' => 'Те лопаÑÑŒ',
-'qbpageinfo' => 'КоÑо-зÑрдо',
'qbmyoptions' => 'Монь лопан',
'qbspecialpages' => 'Башка тевень лопат',
'faq' => 'СеедьÑÑ‚Ñ ÐºÐµÐ¿ÐµÐ´ÐµÐ½ÑŒ кевкÑтемат',
@@ -527,9 +526,7 @@ $messages = array(
'virus-unknownscanner' => 'апак Ñодань антивируÑ:',
# Login and logout pages
-'welcomecreation' => '== Совак, инеÑькеть, $1! ==
-Совамотаркат теезь.
-Ð˜Ð»Ñ Ñтувто Ð¿Ð¾Ð»Ð°Ð²Ñ‚Ð½ÐµÐ¼Ñ ÑÑеть [[Special:Preferences|{{SITENAME}} ладÑематнень]].',
+'welcomeuser' => 'Совак, $1, инеÑькеть!',
'yourname' => 'ТеицÑнь лем:',
'yourpassword' => 'Салава валот:',
'yourpasswordagain' => 'Омбоцеде Ñёрмадык кирдицÑнь леметь:',
@@ -551,7 +548,7 @@ $messages = array(
'gotaccount' => "Совамотаркат ули? '''$1'''.",
'gotaccountlink' => 'СовамÑ',
'userlogin-resetlink' => 'Совамо ÑÑ€ÑвикÑтнÑнь Ñтувтыть?',
-'createaccountmail' => 'е-ÑёрмаÑо',
+'createaccountmail' => 'Тейть кодамо понгÑÑŒ Ñалавань вал, кучик ÑÐ¾Ð½Ð·Ñ Ð°Ð»Ð¾ макÑозь е-Ñёрмапаргонтень',
'createaccountreason' => 'ТувталоÑÑŒ:',
'badretype' => 'Сёрмадыть Ñалава валот кавкÑÑ‚ÑŒ: Ñынь аволь вейкеть.',
'userexists' => 'Те лемеÑÑŒ уш Ñаезь.
@@ -627,6 +624,7 @@ $messages = array(
'changeemail-oldemail' => 'Ðеень е-Ñёрмапаргот:',
'changeemail-newemail' => 'Од е-Ñёрмапаргот:',
'changeemail-none' => '(араÑÑŒ мезе невтемÑ)',
+'changeemail-password' => '«{{SITENAME}}» проектÑнь Ñалававалот:',
'changeemail-submit' => 'ÐŸÐ¾Ð»Ð°Ð²Ñ‚Ð¾Ð¼Ñ Ðµ-Ñёрмапаргот',
'changeemail-cancel' => 'Ð¡Ð°ÐµÐ¼Ñ Ð¼ÐµÐºÐµÐ²',
@@ -726,7 +724,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'template-protected' => '(ванÑтозь)',
'template-semiprotected' => '(Ð¿ÐµÐ»ÑŒÑ Ð²Ð°Ð½Ñтозь)',
'hiddencategories' => 'Те лопаÑÑŒ Ñовавтови {{PLURAL:$1|кекшень 1 категориÑÑ|кекшень $1 категориÑÑ}}:',
-'nocreatetitle' => 'Лопань теемаÑÑŒ аволь певтеме',
'nocreatetext' => 'Те {{SITENAME}} лопаÑонть пирÑзь од лопань теемаÑÑŒ. Тонь ули мелеть велÑÐ²Ñ‚Ð¾Ð¼Ñ ÑƒÐ´Ð°Ð»Ð¾Ð² ды питнемензе-витнемензе ÑƒÐ»Ð¸Ñ†Ñ Ð»Ð¾Ð¿Ð°Ð½Ñ‚ÑŒ, али [[Special:UserLogin|ÑÐ¾Ð²Ð°Ð¼Ñ Ð°Ð»Ð¸ Ñ‚ÐµÐµÐ¼Ñ Ð¾Ð´ Ñовама]].',
'nocreate-loggedin' => 'Тонеть а мерить теемÑ-ÑˆÐºÐ°Ð¼Ñ Ð¾Ð´ лопат.',
'permissionserrorstext' => 'Тонеть а мерить Ñ‚ÐµÐµÐ¼Ñ Ñ‚ÐµÐ½ÑŒ, вана {{PLURAL:$1|тувталоÑÑŒ|тувталтнÑ}}:',
@@ -1047,9 +1044,12 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'right-siteadmin' => 'Датабазань Ñёлгомо ды панжомо',
'right-passwordreset' => 'Ð’Ð°Ð½Ð¾Ð¼Ñ Ñ‚ÐµÐ¸Ñ†Ñнь Ñалава валонь полавтома е-Ñёрмат',
+# Special:Log/newusers
+'newuserlogpage' => 'ТеицÑнь шкамодо-теемадо конёв',
+'newuserlogpagetext' => 'Те теицÑнь шкавкÑто журнал',
+
# User rights log
'rightslog' => 'УÑькетеицÑнть видечинть кемекÑтома',
-'rightsnone' => '(араÑÑ‚ÑŒ)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'те лопань ловномо',
@@ -1419,10 +1419,6 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'activeusers-hidesysops' => 'ÐšÐµÐºÑˆÐµÐ¼Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑтратортнÑнь',
'activeusers-noresult' => 'ЯкинзÑ-Ð¿Ð°ÐºÐ¸Ð½Ð·Ñ Ð°Ñ€Ð°ÑÑ‚ÑŒ',
-# Special:Log/newusers
-'newuserlogpage' => 'ТеицÑнь шкамодо-теемадо конёв',
-'newuserlogpagetext' => 'Те теицÑнь шкавкÑто журнал',
-
# Special:ListGroupRights
'listgrouprights' => 'Ð¢ÐµÐ¸Ñ†Ñ ÐºÑƒÑ€Ð¾Ð½Ñ‚ÑŒ видечинзÑ',
'listgrouprights-group' => 'Куро',
@@ -1471,12 +1467,11 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'watching' => 'Ванома...',
'unwatching' => 'Ðванома...',
-'enotif_newpagetext' => 'Те од лопа.',
'enotif_impersonal_salutation' => '{{SITENAME}} теицÑÑÑŒ',
-'changed' => 'полавтозь',
-'created' => 'теезь-шказь',
'enotif_lastdiff' => 'Те полавтоманть ваномга вант $1.',
'enotif_anon_editor' => 'лемтеме Ñ‚ÐµÐ¸Ñ†Ñ $1',
+'created' => 'теезь-шказь',
+'changed' => 'полавтозь',
# Delete
'deletepage' => 'ÐÐ°Ñ€Ð´Ð°Ð¼Ñ Ð»Ð¾Ð¿Ð°Ð½Ñ‚ÑŒ',
@@ -1581,7 +1576,7 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'blanknamespace' => '(ПрÑвкÑ)',
# Contributions
-'contributions' => 'ТеицÑнть-кирдицÑнть путовкÑозо',
+'contributions' => '{{GENDER:$1|ТеицÑнть}} путовкÑонзо',
'contributions-title' => 'ТеицÑнть путовкÑонзо $1 таркантень',
'mycontris' => 'Монь путовкÑтнÑ',
'contribsub2' => '$1 ($2) туртов',
@@ -2241,7 +2236,7 @@ IP-тешкÑÑ‚ÑÑ‚ÑŒ — $3, ÑÐ°Ð¹Ð¼Ð°Ñ Ñовавтоманть ID-ÑÑŒ —
'htmlform-selectorother-other' => 'ЛиÑ',
# New logging system
-'newuserlog-byemail' => 'Ñалава валот кучозь е-ÑёрмаÑо',
+'rightsnone' => '(араÑÑ‚ÑŒ)',
# Feedback
'feedback-subject' => 'Мезде:',
diff --git a/languages/messages/MessagesMzn.php b/languages/messages/MessagesMzn.php
index e4e138a3..146a7ee3 100644
--- a/languages/messages/MessagesMzn.php
+++ b/languages/messages/MessagesMzn.php
@@ -80,7 +80,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__باÙهرست__', '__FORCETOC__' ),
'toc' => array( '0', '__Ùهرست__', '__TOC__' ),
'noeditsection' => array( '0', '__بی‌بخش__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', 'بی‌عنوان__', '__بی‌عنوان__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'ماه', 'ماه‌کنونی', 'ماه_کنونی', 'ماه‌کنونی۲', 'ماه_اسایی۲', 'ماه_کنونی۲', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'ماه۱', 'ماه‌کنونی۱', 'ماه_کنونی۱', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'نام‌ماه', 'نام_ماه', 'نام‌ماه‌کنونی', 'نام_ماه_کنونی', 'CURRENTMONTHNAME' ),
@@ -271,7 +270,6 @@ $messages = array(
'qbbrowse' => 'چأرخه‌سه‌ن',
'qbedit' => 'دچی‌ین',
'qbpageoptions' => 'این صÙحه',
-'qbpageinfo' => 'باÙت',
'qbmyoptions' => 'مه صÙحه‌ئون',
'qbspecialpages' => 'شا صÙحه‌ئون',
'faq' => 'معمولی سوالا',
@@ -506,9 +504,6 @@ $2، $1',
'sqlhidden' => '(دستور اس‌کیوال دپوشنی‌یه بیّه)',
# Login and logout pages
-'welcomecreation' => '==$1ØŒ Ø®ÙØ´ بمونی!==
-Ø´Ùمه حساب بساته بیّه.
-Ùراموش نکانین Ú©Ù‡ [[Special:Preferences|شه ترجیحات {{SITENAME}}]] ره تنظیم هاکنین.',
'yourname' => 'شمه کاروری‌نوم:',
'yourpassword' => 'شمه پسورد',
'yourpasswordagain' => 'پسورد ره دÙباره بنویس',
@@ -716,7 +711,6 @@ $2، $1',
# User rights log
'rightslog' => 'سیاهه اختیارای کاروری',
'rightslogtext' => 'اینتا سیاهه تغییرای اختیارای کاروری هسته.',
-'rightsnone' => '(هچّی)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'این صÙحه ره دچی‌ین',
@@ -866,12 +860,10 @@ $2، $1',
'watching' => 'ده‌مـبـال هـه‌کـارده‌ن...',
'unwatching' => 'ده‌مـبـال نـه‌کـارده‌ن...',
-'enotif_newpagetext' => 'این صÙحه نوبساته هسته',
-'created' => 'بساته بیّه',
-'enotif_subject' => 'صÙحه‌ی «$PAGETITLE» {{SITENAME}} به‌دست $PAGEEDITOR $CHANGEDORCREATED‌هسته.',
'enotif_lastvisited' => 'بدی‌ین همه‌ی تغییرات از آخرین باری که سر بزونی وسّه $1 ره هارشین.',
'enotif_lastdiff' => 'هارشائن این تغییر وسّه $1 ره بزنین.',
'enotif_anon_editor' => 'نشناسی‌یه کارور $1',
+'created' => 'بساته بیّه',
# Delete
'deletepage' => 'صÙحه پاک هاکردن',
@@ -1094,6 +1086,7 @@ $5
'logentry-move-move_redir-noredirect' => '$1 ، $3 ره بدون اینکه مسیر تغییری درس بوه به $4 که مسیر تغییر بیه منتقل هاکرده',
'logentry-newusers-newusers' => '$1 بساتن اتا حساب کاروری',
'logentry-newusers-create' => '$1 بساتن اتا حساب کاروری',
+'rightsnone' => '(هچّی)',
# Feedback
'feedback-subject' => 'موضوع:',
diff --git a/languages/messages/MessagesNah.php b/languages/messages/MessagesNah.php
index ba237fcb..d7cd514b 100644
--- a/languages/messages/MessagesNah.php
+++ b/languages/messages/MessagesNah.php
@@ -203,7 +203,6 @@ $messages = array(
'qbbrowse' => 'TitlatÄ“mÅz',
'qbedit' => 'TicpatlÄz',
'qbpageoptions' => 'InÄ«n zÄzanilli',
-'qbpageinfo' => 'TlahcuilÅltechcopa',
'qbmyoptions' => 'NozÄzanil',
'qbspecialpages' => 'Nònkuâkìskàtlaìxtlapaltìn',
'faq' => 'Zan īc tētlatlanīliztli',
@@ -377,11 +376,6 @@ Hueliz quimpiya tlahtÅl tlein ahmo mohuelÄ«tih motequitiltia tÅcÄpan.',
'virus-unknownscanner' => 'ahmatic antivirus:',
# Login and logout pages
-'welcomecreation' => '== ¡XimopanÅlti, $1! ==
-
-Mocuentah ÅmochÄ«uh.
-
-Ye tihuelīti titēchihtoa [[Special:Preferences|motlaēlēhuiliz]].',
'yourname' => 'MotlatequitiltilÄ«ltÅca:',
'yourpassword' => 'MotlahtÅlichtacÄyo',
'yourpasswordagain' => 'MotlahtÅlichtacÄyo occeppa',
@@ -400,7 +394,7 @@ Ye tihuelīti titēchihtoa [[Special:Preferences|motlaēlēhuiliz]].',
'createaccount' => 'TicchÄ«huÄz cÄ“ cuentah',
'gotaccount' => "¿Ye ticpiya cē cuentah? '''$1'''.",
'gotaccountlink' => 'Ximocalaqui',
-'createaccountmail' => 'e-mailcopa',
+'createaccountmail' => 'TicnemÄ«tÄ«z ahmo cemihcac zÄzoichtacÄtlahtÅlli nÅ moÄ“hualtÄ«z in maltzinteyÅtl netitlanizyeyÄntli',
'createaccountreason' => 'Tlèka:',
'badretype' => 'Ahneneuhqui motlahtÅlichtacÄyo.',
'userexists' => 'In tlatequitiltilÄ«ltÅcÄitl in Åquipehpen ye ia.
@@ -677,9 +671,9 @@ Hueliz Åmopolo huiqui nozo Åmozacac.
'default' => 'ic default',
'prefs-files' => 'TlahcuilÅlli',
'youremail' => 'MaltzinteyÅtl netitlanizyeyÄntli:',
-'username' => 'TlatequitiltilÄ«ltÅcÄitl:',
-'uid' => 'Tlatequitiltilīlli ID:',
-'prefs-memberingroups' => 'TlÄcatl {{PLURAL:$1|olÅlco|olÅlco}}:',
+'username' => '{{GENDER:$1|TlatequitiltilÄ«ltÅcÄitl}}:',
+'uid' => '{{GENDER:$1|Tlatequitiltilīlli}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|TlacotÅncayÅtl}} in {{PLURAL:$1|tÄ“olÅlolli|tÄ“olÅloltin}}',
'yourrealname' => 'MelÄhuac motÅcÄ:',
'yourlanguage' => 'Tlâtòlli:',
'yournick' => 'MotÅcÄtlaliz:',
@@ -745,7 +739,6 @@ IntlÄ ticnequi, tlÄcah quimatÄ«zqueh motequi.',
# User rights log
'rightslog' => 'TlatequitiltilÄ«lli huelÄ«tiliztli tlahcuilÅlloh',
-'rightsnone' => 'ahtlein',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ticpÅhuÄz inÄ«n zÄzanilli',
@@ -1035,38 +1028,36 @@ Nò mà má»ta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlà
'watching' => 'Tlachiyacah...',
'unwatching' => 'Ahtlachiyacah...',
-'enotif_newpagetext' => 'InÄ«n cah yancuÄ«c zÄzanilli.',
'enotif_impersonal_salutation' => 'tlatequitiltilīlli īpan {{SITENAME}}',
-'changed' => 'Åmotlacuep',
-'created' => 'ÅmochÄ«uh',
'enotif_anon_editor' => 'ahtÅcÄtlatequitiltilÄ«lli $1',
-'enotif_body' => 'MÄhuizzoh $WATCHINGUSERNAME,
+'enotif_body' => 'MÄhuiztic $WATCHINGUSERNAME,
-In {{SITENAME}} Ämatl "$PAGETITLE" $CHANGEDORCREATED in tlatequitiltilÄ«lli $PAGEEDITOR Ä«pan $PAGEEDITDATE.
-In ÄxcÄn tlachiyaliztli onca Ä«pan $PAGETITLE_URL
+$PAGEINTRO $NEWPAGE
-$NEWPAGE
+Tlapatlani Ä«tlahtÅlpehuallo: $PAGESUMMARY $PAGEMINOREDIT
-In tlapatlaliztli Ä«xtlamatiliztli cah: $PAGESUMMARY $PAGEMINOREDIT
-
XicnotzÄz in tlapatlani:
-Correo electrónico: {{canonicalurl:Special:Emailuser|target=$PAGEEDITOR}}
-Huiqui: {{canonicalurl:User:$PAGEEDITOR}}
+Ä«netitlanizyeyÄn:$PAGEEDITOR_EMAIL
+Ä«huiqui:$PAGEEDITOR_WIKI
+
+Ahmo occÄ“ppa mitztlamachiztÄ«z intlÄ yancuÄ«c tlapatlaliztli, zÄ mÄ tiquittaz inÄ«n Ämatl. Tihueliti ticcencahulÄ«z in tÄ“machiztÄ«lizpÄmitl in mochintin motlachixÄmatl in motlachiyaliz.
-Ahmo onyez occÄ“ tÄ“machitÄ«liztli Ä«tech occÄ“ tlapatlaliztli, zan mÄ tiquihitta inÄ«n Ämoxtli yancuÄ«cÄn.
-NÅ tihuelÄ«ti quitlahtlÄlÄ«z, in tÄ“machitÄ«liztli in mochi tlachixqui mozÄzanilhuÄ«c in motlachiyaliz Ämatl.
+In {{SITENAME}} icnīuhtīliztica motēmachiztīliztlacentetilīz.
- In {{SITENAME}} tēmachitīliztli sistema.
+IntlÄ ticnequi ticpatlaz in maltzinteyÅtl monetitlanizyeyÄn, xiquihitta:
+{{canonicalurl:{{#special:Preferences}}}}
---
-Ic ticpatlaz in tlachiyaliztli motlapÅhualÄma, xiquihitta:
+
+IntlÄ ticnequi ticpatlaz in motlachiyaliz tlaÄ“lÄ“huiliztli, xiquihitta:
{{canonicalurl:{{#special:EditWatchlist}}}}
-Ic ticpolÅz in Ämatl in tlachiyaliztli motlapÅhualÄma, xiquihitta:
+IntlÄ ticnequi ticpolÅz in Ämatl Ä«tech motlachiyaliz, xiquihitta:
$UNWATCHURL
-TÄ“tlamachÄ«tÄ«liztli Ä«huÄn oc yeh tÄ“palehuiliztli:
+MotlahtÅlcaquiliztÄ«lÅni Ä«huÄn ocachi tÄ“palÄ“huiliztli, xiquihitta:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'ÅmochÄ«uh',
+'changed' => 'Åmotlacuep',
# Delete
'deletepage' => 'TicpolÅz inÄ«n zÄzanilli',
@@ -1129,7 +1120,7 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
'blanknamespace' => '(TÄchcÄuh)',
# Contributions
-'contributions' => 'ĪtlahcuilÅl',
+'contributions' => 'In {{GENDER:$1|tlatequitiltilÄ«lli}} Ä«tlahcuilÅl',
'contributions-title' => 'TlatequitiltilÄ«lli $1 Ä«tlahcuilÅl',
'mycontris' => 'NotlahcuilÅl',
'contribsub2' => '$1 ($2)',
@@ -1512,6 +1503,9 @@ Niman tihuelÄ«ti [[Special:UserLogin|timocalaqui]] auh ticpactiÄz huiquitica.',
# HTML forms
'htmlform-selectorother-other' => 'Occē',
+# New logging system
+'rightsnone' => 'ahtlein',
+
# Search suggestions
'searchsuggest-search' => 'Tlatēmoliztli',
diff --git a/languages/messages/MessagesNan.php b/languages/messages/MessagesNan.php
index 797323cb..bd01e659 100644
--- a/languages/messages/MessagesNan.php
+++ b/languages/messages/MessagesNan.php
@@ -18,8 +18,8 @@ $datePreferences = array(
$defaultDateFormat = 'nan';
$dateFormats = array(
'nan time' => 'H:i',
- 'nan date' => 'Y-"nî" n-"goeÌh" j-"já¼°t" (l)',
- 'nan both' => 'Y-"nî" n-"goeÌh" j-"já¼°t" (D) H:i',
+ 'nan date' => 'Y-"nî" n-"goeÌh" j-"jiÌt" (l)',
+ 'nan both' => 'Y-"nî" n-"goeÌh" j-"jiÌt" (D) H:i',
);
$messages = array(
@@ -167,7 +167,6 @@ $messages = array(
'qbbrowse' => 'Liū-lám',
'qbedit' => 'Siu-kái',
'qbpageoptions' => 'Chit iaÌh',
-'qbpageinfo' => 'BoÌk-loÌk',
'qbmyoptions' => 'Goá ê iaÌh',
'qbspecialpages' => 'TeÌk-sû-iaÌh',
'faq' => 'BÅ«n-tah',
@@ -396,8 +395,6 @@ $2',
Lí Ä“-sái mài kì-miâ kè-siok sú-iÅng {{SITENAME}}, mÄ Ä“-sái iÅng kÄng-ê aÌh-sÄ« paÌt-ê sin-hÅ«n têng teng-jiÌp.
Chhiaâ¿ chù-ì: Å«-kóa iaÌh Å« khó-lêng khoàâ¿-tioÌh bÄ“-su lí iû-goân teng-jiÌp tiong; che chi-iàu pià⿠tiÄu lí ê browser ê cache chiÅ« Ä“ chèng-siông.",
-'welcomecreation' => '==Hoan-gêng $1!==
-Ã-keng khui hó lí ê kháu-chÅ. MÌ„-hó bÄ“-kì-tit chhiâu lí ê iÅng-chiá siat-tÄ“ng.',
'yourname' => 'Lí ê iÅng-chiá miâ-chheng:',
'yourpassword' => 'Lí ê biÌt-bé:',
'yourpasswordagain' => 'Têng phah biÌt-bé:',
diff --git a/languages/messages/MessagesNap.php b/languages/messages/MessagesNap.php
index be64d303..3e045834 100644
--- a/languages/messages/MessagesNap.php
+++ b/languages/messages/MessagesNap.php
@@ -149,7 +149,6 @@ $messages = array(
'qbfind' => 'Truòva',
'qbedit' => 'Càgna',
'qbpageoptions' => 'Chesta paggena',
-'qbpageinfo' => "Nfrummazzione ncopp'â paggena",
'qbmyoptions' => "'E ppaggene mie",
'qbspecialpages' => 'Pàggene speciàle',
'faq' => 'FAQ',
@@ -270,9 +269,7 @@ $messages = array(
'logouttext' => "'''Site asciùte.'''
Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putite trasì n'ata vota, cu 'o stesso nomme o cu n'ato nomme.",
-'welcomecreation' => "== Bemmenuto, $1! ==
-
-'O cunto è stato criato currettamente. Nun scurdà 'e perzonalizzà 'e ppreferenze 'e {{SITENAME}}.",
+'welcomeuser' => 'Bemmenuto, $1!',
'yourname' => 'Nomme utente',
'yourpassword' => 'Password:',
'remembermypassword' => 'Allicuordate d"a password (for a maximum of $1 {{PLURAL:$1|day|days}})',
@@ -389,9 +386,6 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
'username' => 'Nomme utente',
'yourlanguage' => 'Lengua:',
-# User rights log
-'rightsnone' => '(nisciuno)',
-
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'càgna chesta paggena',
@@ -495,7 +489,6 @@ Also see [[Special:WantedCategories|wanted categories]].",
'unwatch' => 'Nun segui',
'notanarticle' => 'Chesta paggena nun è na voce',
-'enotif_newpagetext' => 'Chesta è na paggena nòva.',
'changed' => 'cagnata',
# Delete
@@ -529,7 +522,7 @@ Also see [[Special:WantedCategories|wanted categories]].",
'blanknamespace' => '(Prencepale)',
# Contributions
-'contributions' => 'Contribbute utente',
+'contributions' => 'Contribbute {{GENDER:$1|utente}}',
'mycontris' => "'E ffatiche d''e mmeje",
'uctop' => '(ultima ppe a paggena)',
@@ -666,4 +659,7 @@ Also see [[Special:WantedCategories|wanted categories]].",
# Special:SpecialPages
'specialpages' => 'Paggene speciale',
+# New logging system
+'rightsnone' => '(nisciuno)',
+
);
diff --git a/languages/messages/MessagesNb.php b/languages/messages/MessagesNb.php
index 2038d1d1..7eccc238 100644
--- a/languages/messages/MessagesNb.php
+++ b/languages/messages/MessagesNb.php
@@ -164,7 +164,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Siste_endringer' ),
'Recentchangeslinked' => array( 'Relaterte_endringer' ),
'Revisiondelete' => array( 'Revisjonssletting' ),
- 'RevisionMove' => array( 'Revisjonsflytting' ),
'Search' => array( 'Søk' ),
'Shortpages' => array( 'Korte_sider' ),
'Specialpages' => array( 'Spesialsider' ),
@@ -450,6 +449,7 @@ $messages = array(
'newwindow' => '(Ã¥pnes i et nytt vindu)',
'cancel' => 'Avbryt',
'moredotdotdot' => 'Mer …',
+'morenotlisted' => 'Mer som ikke er oppført&nbsp;…',
'mypage' => 'Min brukerside',
'mytalk' => 'Min diskusjonsside',
'anontalk' => 'Brukerdiskusjon for denne IP-adressen',
@@ -461,7 +461,6 @@ $messages = array(
'qbbrowse' => 'Bla gjennom',
'qbedit' => 'Rediger',
'qbpageoptions' => 'Sideinnstillinger',
-'qbpageinfo' => 'Sideinformasjon',
'qbmyoptions' => 'Egne innstillinger',
'qbspecialpages' => 'Spesialsider',
'faq' => 'Ofte stilte spørsmål',
@@ -484,6 +483,7 @@ $messages = array(
'namespaces' => 'Navnerom',
'variants' => 'Varianter',
+'navigation-heading' => 'Navigasjonsmeny',
'errorpagetitle' => 'Feil',
'returnto' => 'Tilbake til $1.',
'tagline' => 'Fra {{SITENAME}}',
@@ -724,11 +724,11 @@ Administrators nærmere begrunnelse: «$3».',
# Login and logout pages
'logouttext' => "'''Du er nå logget ut.'''
-Du kan fortsette å bruke {{SITENAME}} anonymt, eller [[Special:UserLogin|logge inn igjen]] som samme eller en annen bruker.
+Du kan fortsette å bruke {{SITENAME}} anonymt, eller <span class='plainlinks'>[$1 logge inn igjen]</span> som samme eller en annen bruker.
Merk at noen sider kan vise at du fortsatt er logget inn fram til du tømmer mellomlageret i nettleseren.",
-'welcomecreation' => '==Velkommen, $1!==
-Brukerkontoen din har blitt opprettet.
-Ikke glem å endre [[Special:Preferences|innstillingene]] dine.',
+'welcomeuser' => 'Velkommen, $1!',
+'welcomecreation-msg' => 'Kontoen din har blitt opprettet.
+Ikke glem å endre [[Special:Preferences|innstillingene dine]] på {{SITENAME}}.',
'yourname' => 'Brukernavn:',
'yourpassword' => 'Passord:',
'yourpasswordagain' => 'Gjenta passord',
@@ -751,7 +751,7 @@ Ikke glem å endre [[Special:Preferences|innstillingene]] dine.',
'gotaccount' => 'Har du allerede en konto? $1.',
'gotaccountlink' => 'Logg inn',
'userlogin-resetlink' => 'Har du glemt påloggingsdetaljene dine?',
-'createaccountmail' => 'per e-post',
+'createaccountmail' => 'Bruk et midlertidig tilfeldig passord, og send det til e-postadressen nedenfor',
'createaccountreason' => 'Ã…rsak:',
'badretype' => 'Passordene samsvarte ikke.',
'userexists' => 'Brukernavnet er allerede i bruk.
@@ -820,6 +820,7 @@ Du kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.',
# Email sending
'php-mail-error-unknown' => 'Ukjent feil i PHPs mail()-funksjon',
'user-mail-no-addy' => 'Forsøkte å sende e-post uten e-postadresse',
+'user-mail-no-body' => 'Prøvde å sende e-post med tom eller for kort brødtekst.',
# Change password dialog
'resetpass' => 'Endre passord',
@@ -885,6 +886,7 @@ Midlertidig passord: $2',
'changeemail-oldemail' => 'Nåværende e-postadresse:',
'changeemail-newemail' => 'Ny e-postadresse:',
'changeemail-none' => '(ingen)',
+'changeemail-password' => 'Ditt passord på {{SITENAME}}:',
'changeemail-submit' => 'Endre e-post',
'changeemail-cancel' => 'Avbryt',
@@ -1069,7 +1071,6 @@ Det siste loggelementet er oppgitt under som referanse:",
'template-semiprotected' => '(halvbeskyttet)',
'hiddencategories' => 'Denne siden er medlem av {{PLURAL:$1|1 skjult kategori|$1 skjulte kategorier}}:',
'edittools' => '<!-- Teksten her vil vises under redigerings- og opplastingsboksene. -->',
-'nocreatetitle' => 'Sideoppretting er begrenset',
'nocreatetext' => '{{SITENAME}} har begrensede muligheter for oppretting av nye sider. Du kan gå tilbake og redigere en eksisterende side, eller [[Special:UserLogin|logge inn eller opprette en ny konto]].',
'nocreate-loggedin' => 'Du har ikke tillatelse til å opprette sider.',
'sectioneditnotsupported-title' => 'Seksjonsredigering støttes ikke',
@@ -1090,6 +1091,15 @@ Slette- og flytteloggen vises nedenfor.',
'edit-no-change' => 'Redigeringen din ble ignorert fordi det ikke var noen endringer.',
'edit-already-exists' => 'Kunne ikke opprette ny side fordi den finnes fra før.',
'defaultmessagetext' => 'Standard meldingstekst',
+'content-failed-to-parse' => 'Klarte ikke å tolke innholdet $2 for innholdsmodellen $1: $3',
+'invalid-content-data' => 'Ugyldig innhold',
+'content-not-allowed-here' => 'Innholdsmodellen «$1» er ikke tillatt på siden [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'WikiTekst',
+'content-model-text' => 'Ren tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Advarsel: Denne siden inneholder for mange prosesskrevende parserfunksjoner.
@@ -1453,9 +1463,9 @@ Dette kan ikke tilbakestilles.',
'prefs-emailconfirm-label' => 'E-postbekreftelse:',
'prefs-textboxsize' => 'Størrelse på redigeringsvindu',
'youremail' => 'E-post:',
-'username' => 'Brukernavn:',
-'uid' => 'Bruker-ID:',
-'prefs-memberingroups' => 'Medlem i følgende {{PLURAL:$1|gruppe|grupper}}:',
+'username' => '{{GENDER:$1|Brukernavn}}:',
+'uid' => '{{GENDER:$1|Bruker-ID}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Medlem}} i følgende {{PLURAL:$1|gruppe|grupper}}:',
'prefs-registration' => 'Registreringstid:',
'yourrealname' => 'Virkelig navn:',
'yourlanguage' => 'Språk:',
@@ -1604,12 +1614,13 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
'right-sendemail' => 'Send e-post til andre brukere',
'right-passwordreset' => 'Vis e-poster over tilbakestilte passord',
+# Special:Log/newusers
+'newuserlogpage' => 'Brukeropprettelseslogg',
+'newuserlogpagetext' => 'Dette er en logg over brukeropprettelser.',
+
# User rights log
'rightslog' => 'Brukerrettighetslogg',
'rightslogtext' => 'Dette er en logg over endringer av brukerrettigheter.',
-'rightslogentry' => 'endret gruppe for $1 fra $2 til $3',
-'rightslogentry-autopromote' => 'ble automatisk forfremmet fra $2 til $3',
-'rightsnone' => '(ingen)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'se denne siden',
@@ -1847,6 +1858,7 @@ Om problemet fortsetter, kontakt en [[Special:ListUsers/sysop|administrator]].',
'backend-fail-notsame' => 'En ikke-identisk fil finnes allerede på $1.',
'backend-fail-invalidpath' => '$1 er ikke en gyldig lagringsbane.',
'backend-fail-delete' => 'Kunne ikke slette filen $1.',
+'backend-fail-describe' => 'Kunne ikke endre metadata for filen «$1».',
'backend-fail-alreadyexists' => 'Filen $1 finnes allerede.',
'backend-fail-store' => 'Kunne ikke lagre filen $1 på $2.',
'backend-fail-copy' => 'Kunne ikke kopiere filen $1 til $2.',
@@ -2079,6 +2091,12 @@ Kanskje du vil redigere beskrivelsen på dens [$2 filbeskrivelsesside].',
De burde i stedet lenke til en passende innholdsside.<br />
En side anses om en pekerside om den inneholder en mal som det lenkes til fra [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Sider med sideverdi',
+'pageswithprop-legend' => 'Sider med en sideverdi',
+'pageswithprop-text' => 'Denne siden lister opp sider som bruker en viss sideverdi.',
+'pageswithprop-prop' => 'Verdinavn:',
+'pageswithprop-submit' => 'GÃ¥',
+
'doubleredirects' => 'Doble omdirigeringer',
'doubleredirectstext' => 'Denne siden lister opp de sidene som er omdirigeringer til andre omdirigeringssider.
Hver rad inneholder lenker til første og andre omdirigering, samt målet for den andre omdirigeringen, som vanligvis er den «virkelige» målsiden som den første omdirigeringen burde peke til.
@@ -2231,7 +2249,7 @@ Se også [[Special:WantedCategories|ønskede kategorier]].',
'linksearch-ok' => 'Søk',
'linksearch-text' => 'Jokertegn slik som i «*.wikipedia.org» kan brukes.
Det kreves at det oppgis minst et toppnivådomene, for eksempel «*.org».<br />
-Støttede protokoller: <code>$1</code> (ikke legg til noen av disse i søket ditt).',
+{{PLURAL:$2|Støttede protokoller}}: <code>$1</code> (ikke legg til noen av disse i søket ditt).',
'linksearch-line' => '$1 lenkes fra $2',
'linksearch-error' => 'Jokertegn kan kun brukes foran tjenernavnet.',
@@ -2250,10 +2268,6 @@ Støttede protokoller: <code>$1</code> (ikke legg til noen av disse i søket dit
'activeusers-hidesysops' => 'Skjul administratorer',
'activeusers-noresult' => 'Ingen brukere funnet.',
-# Special:Log/newusers
-'newuserlogpage' => 'Brukeropprettelseslogg',
-'newuserlogpagetext' => 'Dette er en logg over brukeropprettelser.',
-
# Special:ListGroupRights
'listgrouprights' => 'Rettigheter for brukergrupper',
'listgrouprights-summary' => 'Følgende er en liste over brukergrupper som er definert på denne wikien, og hvilke rettigheter de har.
@@ -2348,20 +2362,23 @@ Fremtidige endringer til denne siden og den tilhørende diskusjonssiden blir lis
'enotif_mailer' => '{{SITENAME}}s påminnelsessystem',
'enotif_reset' => 'Merk alle sider som besøkt',
-'enotif_newpagetext' => 'Dette er en ny side.',
'enotif_impersonal_salutation' => '{{SITENAME}}-bruker',
-'changed' => 'endret',
-'created' => 'opprettet',
-'enotif_subject' => '{{SITENAME}}-siden $PAGETITLE har blitt $CHANGEDORCREATED av $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}}-siden $1 har blitt slettet av {{gender:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}}-siden $1 har blitt opprettet av {{gender:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}}-siden $1 har blitt flyttet av {{gender:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}}-siden $1 har blitt gjenopprettet av {{gender:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}}-siden $1 har blitt endret av {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => '{{SITENAME}}-siden $1 ble slettet $PAGEEDITDATE av {{gender:$2|$2}}; se $3.',
+'enotif_body_intro_created' => '{{SITENAME}}-siden $1 ble opprettet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.',
+'enotif_body_intro_moved' => '{{SITENAME}}-siden $1 ble flyttet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.',
+'enotif_body_intro_restored' => '{{SITENAME}}-siden $1 ble gjenopprettet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.',
+'enotif_body_intro_changed' => '{{SITENAME}}-siden $1 ble endret $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.',
'enotif_lastvisited' => 'Se $1 for alle endringer siden ditt forrige besøk.',
'enotif_lastdiff' => 'Se $1 for å se denne endringen.',
'enotif_anon_editor' => 'anonym bruker $1',
'enotif_body' => 'Kjære $WATCHINGUSERNAME,
-
-{{SITENAME}}-siden $PAGETITLE har blitt $CHANGEDORCREATED den $PAGEEDITDATE av $PAGEEDITOR, se $PAGETITLE_URL for den nåværende revisjonen.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Redigeringssammendrag: $PAGESUMMARY $PAGEMINOREDIT
@@ -2386,6 +2403,8 @@ $UNWATCHURL
Tilbakemelding og videre assistanse:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'opprettet',
+'changed' => 'endret',
# Delete
'deletepage' => 'Slett side',
@@ -2451,6 +2470,8 @@ Se [[Special:ProtectedPages|listen over beskyttede sider]] for listen over gjeld
'prot_1movedto2' => '[[$1]] flyttet til [[$2]]',
'protect-badnamespace-title' => 'Navnerom som ikke kan beskyttes',
'protect-badnamespace-text' => 'Sider i dette navnerommet kan ikke beskyttes.',
+'protect-norestrictiontypes-text' => 'Denne siden kan ikke beskyttes fordi det ikke er noen tilgjengelige begrensningstyper.',
+'protect-norestrictiontypes-title' => 'Ubeskyttbar side',
'protect-legend' => 'Bekreft låsing',
'protectcomment' => 'Ã…rsak:',
'protectexpiry' => 'Utløper:',
@@ -2529,7 +2550,8 @@ Dersom en ny side ved samme navn har blitt oprettet etter slettingen, vil de gje
'undeletedrevisions' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}} gjenopprettet',
'undeletedrevisions-files' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}} og {{PLURAL:$2|én fil|$2 filer}} gjenopprettet',
'undeletedfiles' => '{{PLURAL:$1|Én fil|$1 filer}} gjenopprettet',
-'cannotundelete' => 'Kunne ikke gjenopprette siden (den kan være gjenopprettet av noen andre).',
+'cannotundelete' => 'Gjennoppretting feilet:
+$1',
'undeletedpage' => "'''$1 ble gjenopprettet'''
Sjekk [[Special:Log/delete|slettingsloggen]] for en liste over nylige slettinger og gjenopprettelser.",
@@ -2560,7 +2582,7 @@ $1',
'blanknamespace' => '(Hoved)',
# Contributions
-'contributions' => 'Brukerbidrag',
+'contributions' => '{{GENDER:$1|Brukerbidrag}}',
'contributions-title' => 'Brukerbidrag av $1',
'mycontris' => 'Bidrag',
'contribsub2' => 'For $1 ($2)',
@@ -2830,6 +2852,7 @@ Målsiden «[[:$1]]» finnes allerede. Vil du slette den så denne siden kan fly
'immobile-target-namespace-iw' => 'Du kan ikke flytte en side til et navn som er en interwikilenke.',
'immobile-source-page' => 'Denne siden kan ikke flyttes.',
'immobile-target-page' => 'Kan ikke flytte til det navnet.',
+'bad-target-model' => 'Det ønskede målet bruker en annen innholdsmodell. Kan ikke konvertere fra $1 til $2.',
'imagenocrossnamespace' => 'Kan ikke flytte filer til andre navnerom enn filnavnerommet',
'nonfile-cannot-move-to-file' => 'Kan ikke flytte ikke-filer til filnavnerom',
'imagetypemismatch' => 'Den nye filendelsen tilsvarer ikke filtypen',
@@ -2940,6 +2963,7 @@ Lagre den på din egen datamaskin og last den opp her.',
'import-error-interwiki' => 'Siden «$1» ble ikke importert fordi navnet er reservert for ekstern lenking (interwiki).',
'import-error-special' => 'Siden «$1» ble ikke importert fordi den tilhører et spesialnavnerom som ikke tillater sider.',
'import-error-invalid' => 'Siden «$1» ble ikke importert fordi navnet er ugyldig.',
+'import-error-unserialize' => 'Revisjon $2 av siden «$1» kunne ikke serialiseres. Det ble rapportert at revisjonen bruker innholdsmodellen $3 serialisert som $4.',
'import-options-wrong' => 'Feil {{PLURAL:$2|opsjon|opsjoner}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Den angitte grunnsiden har en ugyldig tittel.',
'import-rootpage-nosubpage' => 'Navnerommet "$1" til grunnsiden tillater ikke undersider.',
@@ -2954,7 +2978,6 @@ Lagre den på din egen datamaskin og last den opp her.',
# JavaScriptTest
'javascripttest' => 'JavaScript-testing',
-'javascripttest-disabled' => 'Denne funksjonen er ikke aktivert på denne wikien.',
'javascripttest-title' => 'Kjører $1 tester',
'javascripttest-pagetext-noframework' => 'Denne siden er reservert for å kjøre JavaScript-tester.',
'javascripttest-pagetext-unknownframework' => 'Ukjent testerammeverk "$1".',
@@ -3091,11 +3114,13 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
'pageinfo-default-sort' => 'Standardsorteringsnøkkel',
'pageinfo-length' => 'Sidelengde (i bytes)',
'pageinfo-article-id' => 'Side-ID',
+'pageinfo-language' => 'Språk for sideinnholdet',
'pageinfo-robot-policy' => 'Søkemotorstatus',
'pageinfo-robot-index' => 'Indekserbar',
'pageinfo-robot-noindex' => 'Ikke indekserbar',
'pageinfo-views' => 'Antall visninger',
'pageinfo-watchers' => 'Antall overvåkere av siden',
+'pageinfo-few-watchers' => 'Færre enn $1 {{PLURAL:$1|overvåker|overvåkere}}',
'pageinfo-redirects-name' => 'Omdirigeringer til siden',
'pageinfo-subpages-name' => 'Undersider av siden',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|omdirigering|omdirigeringer}}; $3 {{PLURAL:$3|ikke-omdirigering|ikke-omdirigeringer}})',
@@ -3110,6 +3135,19 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
'pageinfo-magic-words' => '{{PLURAL:$1|Magisk|Magiske}} ord ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}} ($1)',
'pageinfo-templates' => 'Transkluderte {{PLURAL:$1|mal|maler}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Sider}} transkludert på ($1)',
+'pageinfo-toolboxlink' => 'Sideinformasjon',
+'pageinfo-redirectsto' => 'Omdirigerer til',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Talt som innholdsside',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Dypbeskyttelse starter herfra',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Dypbeskyttelse fra',
+'pageinfo-category-info' => 'Kategoriinformasjon',
+'pageinfo-category-pages' => 'Antall sider',
+'pageinfo-category-subcats' => 'Antall underkategorier',
+'pageinfo-category-files' => 'Antall filer',
# Skin names
'skinname-standard' => 'Standard',
@@ -3130,6 +3168,8 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
'markedaspatrollederror' => 'Kan ikke merke som godkjent',
'markedaspatrollederrortext' => 'Du må spesifisere en versjon å merke som godkjent.',
'markedaspatrollederror-noautopatrol' => 'Du kan ikke merke dine egne endringer som godkjente.',
+'markedaspatrollednotify' => 'Denne endringen av $1 har blitt patruljert.',
+'markedaspatrollederrornotify' => 'Patruljering feilet.',
# Patrol log
'patrol-log-page' => 'Godkjenningslogg',
@@ -3163,6 +3203,7 @@ Ved å åpne den kan systemet ditt kompromitteres.",
'file-nohires' => 'Ingen høyere oppløsning tilgjengelig.',
'svg-long-desc' => 'SVG-fil, standardstørrelse $1 × $2 piksler, filstørrelse: $3',
'svg-long-desc-animated' => 'Animert SVG-fil, standardstørrelse $1 × $2 piksler, filstørrelse: $3',
+'svg-long-error' => 'Ugyldig SVG-fil: $1',
'show-big-image' => 'Full oppløsning',
'show-big-image-preview' => 'Størrelse på denne forhåndsvisningen: $1.',
'show-big-image-other' => '{{PLURAL:$2|Annen oppløsning|Andre oppløsninger}}: $1.',
@@ -3193,7 +3234,10 @@ Ved å åpne den kan systemet ditt kompromitteres.",
'minutes' => '{{PLURAL:$1|$1 minutt|$1 minutter}}',
'hours' => '{{PLURAL:$1|$1 time|$1 timer}}',
'days' => '{{PLURAL:$1|$1 dag|$1 dager}}',
+'months' => '{{PLURAL:$1|$1 måned|$1 måneder}}',
+'years' => '{{PLURAL:$1|$1 år}}',
'ago' => '$1 siden',
+'just-now' => 'nettopp',
# Bad image list
'bad_image_list' => 'Formatet er som følger:
@@ -3684,6 +3728,7 @@ Denne bekreftelseskoden går ut på dato $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-transkludering er slått av]',
'scarytranscludefailed' => '[Malen kunne ikke hentes for $1]',
+'scarytranscludefailed-httpstatus' => '[Henting av mal for $1 feilet: HTTP $2]',
'scarytranscludetoolong' => '[URL-en er for lang]',
# Delete conflict
@@ -3822,6 +3867,7 @@ Du kan også [[Special:EditWatchlist|bruke standardverktøyet]].',
'version-license' => 'Lisens',
'version-poweredby-credits' => "Denne wikien er drevet av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'andre',
+'version-credits-summary' => 'Vi ønsker å takke følgende personer for deres bidrag til [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki er fri programvare; du kan redistribuere det og/eller modifisere det under betingelsene i GNU General Public License som publisert av Free Software Foundation; enten versjon 2 av lisensen, eller (etter eget valg) enhver senere versjon.
MediaWiki er distribuert i håp om at det vil være nyttig, men UTEN NOEN GARANTI; ikke engang implisitt garanti av SALGBARHET eller EGNETHET FOR ET BESTEMT FORMÅL. Se GNU General Public License for flere detaljer.
@@ -3936,17 +3982,17 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
'sqlite-no-fts' => '$1 uten støtte for fulltekstsøk',
# New logging system
-'logentry-delete-delete' => '$1 slettet siden $3',
-'logentry-delete-restore' => '$1 gjenopprettet siden $3',
-'logentry-delete-event' => '$1 endret skjult synligheten av {{PLURAL:$5|en logget hendelse|$5 loggede hendelser}} på $3: $4',
-'logentry-delete-revision' => '$1 endret synlighet av {{PLURAL:$5|en revisjon|$5 revisjoner}} på side $3: $4',
-'logentry-delete-event-legacy' => '$1 endret synlighet av loggede hendelser på $3',
-'logentry-delete-revision-legacy' => '$1 endret synlighet av revisjoner på side $3',
-'logentry-suppress-delete' => '$1 skjult side $3',
-'logentry-suppress-event' => '$1 endret skjult synligheten av {{PLURAL:$5|en logget hendelse|$5 loggede hendelser}} på $3: $4',
-'logentry-suppress-revision' => '$1 endret skjult synligheten av {{PLURAL:$5|en logget hendelse|$5 loggede hendelser}} på $3: $4',
-'logentry-suppress-event-legacy' => '$1 endret skjult synligheten av loggede hendelser på $3',
-'logentry-suppress-revision-legacy' => '$1 endret skjult synligheten av revisjoner på side $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|slettet}} siden $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|gjenopprettet}} siden $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en revisjon|$5 revisjoner}} på side $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|endret}} synligheten av logghendelser på $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|endret}} synligheten av revisjoner på siden $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|skjulte}} siden $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|endret}} diskré synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|endret}} diskré synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|endret}} diskré synligheten av logghendelser på $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|endret}} diskré synligheten av revisjoner på siden $3',
'revdelete-content-hid' => 'innhold skjult',
'revdelete-summary-hid' => 'redigeringsbeskrivelse skjult',
'revdelete-uname-hid' => 'brukernavn skjult',
@@ -3955,17 +4001,21 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
'revdelete-uname-unhid' => 'brukernavn synlig',
'revdelete-restricted' => 'begrensninger gjelder også administratorer',
'revdelete-unrestricted' => 'fjernet begrensninger for administratorer',
-'logentry-move-move' => '$1 flyttet siden $3 til $4',
-'logentry-move-move-noredirect' => '$1 flyttet siden $3 til $4 uten å etterlate en omdirigering',
-'logentry-move-move_redir' => '$1 flyttet siden $3 til $4 over en omdirigering',
-'logentry-move-move_redir-noredirect' => '$1 flyttet siden $3 til $4 over en omdirigering uten å etterlate en omdirigering',
-'logentry-patrol-patrol' => '$1 markerte revisjon $4 av siden $3 som patruljert',
-'logentry-patrol-patrol-auto' => '$1 markerte automatisk revisjon $4 av siden $3 som patruljert',
-'logentry-newusers-newusers' => 'Kontoen $1 ble opprettet',
-'logentry-newusers-create' => 'Kontoen $1 ble opprettet',
-'logentry-newusers-create2' => 'Kontoen $3 ble opprettet av $1',
-'logentry-newusers-autocreate' => 'Konto $1 ble opprettet automatisk',
-'newuserlog-byemail' => 'passord sendt på e-post',
+'logentry-move-move' => '$1 {{GENDER:$2|flyttet}} siden $3 til $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|flyttet}} siden $3 til $4 uten å etterlate en omdirigering',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|flyttet}} siden $3 til $4 over en omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|flyttet}} siden $3 til $4 over en omdirigering uten å etterlate en omdirigering',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|markerte}} revisjon $4 av siden $3 som patruljert',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markerte}} automatisk revisjon $4 av siden $3 som patruljert',
+'logentry-newusers-newusers' => 'Brukerkontoen $1 ble {{GENDER:$2|opprettet}}',
+'logentry-newusers-create' => 'Brukerkontoen $1 ble {{GENDER:$2|opprettet}}',
+'logentry-newusers-create2' => 'Brukerkontoen $3 ble {{GENDER:$2|opprettet}} av $1',
+'logentry-newusers-byemail' => 'Brukerkontoen $3 ble {{GENDER:$2|opprettet}} av $1 og passordet ble sendt per e-post',
+'logentry-newusers-autocreate' => 'Brukerkontoen $1 ble automatisk {{GENDER:$2|opprettet}}',
+'logentry-rights-rights' => '$1 {{GENDER:$2|endret}} gruppemedlemskap for $3 fra $4 til $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|endret}} gruppemedlemskap for $3',
+'logentry-rights-autopromote' => '$1 ble automatisk {{GENDER:$2|forfremmet}} fra $4 til $5',
+'rightsnone' => '(ingen)',
# Feedback
'feedback-bugornote' => 'Hvis du er klar til å sende inn en detaljert feilrapport, vennligst [$1 rapporter en feil].
@@ -4019,6 +4069,7 @@ Om det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. K
'api-error-ok-but-empty' => 'Intern feil: ingen svar fra server.',
'api-error-overwrite' => 'Det er ikke tillatt å overskrive eksisterende filer.',
'api-error-stashfailed' => 'Internal error: tjeneren greide ikke å lagre midlertidig fil.',
+'api-error-publishfailed' => 'Intern feil: Tjeneren greide ikke å publisere midlertidig fil.',
'api-error-timeout' => 'Serveren svarte ikke innenfor forventet tid.',
'api-error-unclassified' => 'En ukjent feil har oppstått',
'api-error-unknown-code' => 'Ukjent feil: "$1"',
@@ -4039,4 +4090,7 @@ Om det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. K
'duration-centuries' => '$1 {{PLURAL:$1|Ã¥rhundre|Ã¥rhundrer}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennier}}',
+# Image rotation
+'rotate-comment' => 'Bildet snudd $1{{PLURAL:°}} med klokka',
+
);
diff --git a/languages/messages/MessagesNds.php b/languages/messages/MessagesNds.php
index bf9a6ab0..344d3831 100644
--- a/languages/messages/MessagesNds.php
+++ b/languages/messages/MessagesNds.php
@@ -64,8 +64,8 @@ $magicWords = array(
'noeditsection' => array( '0', '__KEENÄNNERNLINK__', '__ABSCHNITTE_NICHT_BEARBEITEN__', '__NOEDITSECTION__' ),
'currentmonth' => array( '1', 'AKTMAAND', 'JETZIGER_MONAT', 'JETZIGER_MONAT_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonthname' => array( '1', 'AKTMAANDNAAM', 'JETZIGER_MONATSNAME', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'AKTMAANDNAAMGEN', 'JETZIGER_MONATSNAME_GENITIV', 'CURRENTMONTHNAMEGEN' ),
- 'currentday' => array( '1', 'AKTDAG', 'JETZIGER_KALENDERTAG', 'CURRENTDAY' ),
+ 'currentmonthnamegen' => array( '1', 'AKTMAANDNAAMGEN', 'JETZIGER_MONATSNAME_GENITIV', 'JETZIGER_MONATSNAME_GEN', 'CURRENTMONTHNAMEGEN' ),
+ 'currentday' => array( '1', 'AKTDAG', 'JETZIGER_KALENDERTAG', 'JETZIGER_TAG', 'CURRENTDAY' ),
'currentdayname' => array( '1', 'AKTDAGNAAM', 'JETZIGER_WOCHENTAG', 'CURRENTDAYNAME' ),
'currentyear' => array( '1', 'AKTJOHR', 'JETZIGES_JAHR', 'CURRENTYEAR' ),
'currenttime' => array( '1', 'AKTTIED', 'JETZIGE_UHRZEIT', 'CURRENTTIME' ),
@@ -360,7 +360,6 @@ $messages = array(
'qbbrowse' => 'Blädern',
'qbedit' => 'Ännern',
'qbpageoptions' => 'Disse Sied',
-'qbpageinfo' => 'Sietendaten',
'qbmyoptions' => 'Instellen',
'qbspecialpages' => 'Spezialsieten',
'faq' => 'Faken stellte Fragen',
@@ -607,11 +606,8 @@ As Grund is angeven: ''$2''.",
# Login and logout pages
'logouttext' => "'''Du büst nu afmellt.'''
-Du kannst {{SITENAME}} nu anonym wiederbruken oder di ünner dissen oder en annern Brukernaam wedder [[Special:UserLogin|anmellen]].
+Du kannst {{SITENAME}} nu anonym wiederbruken oder di ünner dissen oder en annern Brukernaam wedder <span class='plainlinks'>[$1 anmellen]</span>.
Denk dor an, dat welk Sieden ünner Ümstänn noch jümmer so wiest warrn köönt, as wenn du anmellt weerst. Dat ännert sik, wenn du den Cache vun dien Browser leddig maakst.",
-'welcomecreation' => '== Willkamen, $1! ==
-Dien Brukerkonto is nu inricht.
-Vergeet nich, de Sied för di persönlich [[Special:Preferences|intostellen]].',
'yourname' => 'Dien Brukernaam',
'yourpassword' => 'Dien Passwoort',
'yourpasswordagain' => 'Passwoort nochmal ingeven',
@@ -884,7 +880,6 @@ Bruker mit Sysop-Rechten doran arbeiden könnt.'''",
'template-semiprotected' => '(half-schuult)',
'hiddencategories' => 'Disse Siet steiht in {{PLURAL:$1|ene verstekene Kategorie|$1 verstekene Kategorien}}:',
'edittools' => '<!-- Disse Text warrt ünner de Finstern för dat Ännern un Hoochladen wiest. -->',
-'nocreatetitle' => 'Opstellen vun ne’e Sieden is inschränkt.',
'nocreatetext' => '{{SITENAME}} verlööft di dat Opstellen vun ne’e Sieden nich. Du kannst blot Sieden ännern, de al dor sünd, oder du musst di [[Special:UserLogin|anmellen]].',
'nocreate-loggedin' => 'Du hest keen Verlööf, ne’e Sieden antoleggen.',
'permissionserrors' => 'Fehlers mit de Rechten',
@@ -903,6 +898,11 @@ Schient so, as wenn se wegdaan worrn is.',
'edit-no-change' => 'Dien Ännern is nich afspiekert worrn, denn dor hett sik nix an’n Text ännert.',
'edit-already-exists' => 'Kunn keen ne’e Sied opstellen, dat gifft ehr al.',
+# Content models
+'content-model-wikitext' => 'Wikitext',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
# Parser/template warnings
'expensive-parserfunction-warning' => 'Wohrschau: Disse Sied bruukt to veel opwännige Parserfunkschonen.
@@ -1352,11 +1352,13 @@ Dat kann nich wedder ungeschehn maakt warrn.',
'right-siteadmin' => 'Datenbank sperren un wedder apen maken',
'right-override-export-depth' => 'Exporteer Sieden, lenkt Sieden inslaten bet to en Deepd vun 5',
+# Special:Log/newusers
+'newuserlogpage' => 'Ne’e-Bruker-Logbook',
+'newuserlogpagetext' => 'Dit is dat Logbook för nee opstellte Brukerkonten.',
+
# User rights log
'rightslog' => 'Brukerrechten-Logbook',
'rightslogtext' => 'In dit Logbook staht Ännern an de Brukerrechten.',
-'rightslogentry' => 'Grupp bi $1 vun $2 op $3 ännert.',
-'rightsnone' => '(kene)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'de Sied to lesen',
@@ -1666,6 +1668,8 @@ Denk dor an, natokieken, wat nich noch annere Sieden na de Vörlagen wiest, ehrd
'disambiguationspage' => 'Template:Mehrdüdig_Begreep',
'disambiguations-text' => 'Disse Sieden wist na Sieden för mehrdüdige Begrepen. Se schöölt lever op de Sieden wiesen, de egentlich meent sünd.<br />Ene Siet warrt as Siet för en mehrdüdigen Begreep ansehn, wenn [[MediaWiki:Disambiguationspage]] na ehr wiest.<br />Lenken ut annere Naamrüüm sünd nich mit in de List.',
+'pageswithprop-submit' => 'Los',
+
'doubleredirects' => 'Dubbelte Wiederleiden',
'doubleredirectstext' => '<b>Wohrscho:</b> Disse List kann „falsche Positive“ bargen.
Dat passeert denn, wenn en Wiederleiden blangen de Wiederleiden-Verwies noch mehr Text mit annere Verwiesen hett.
@@ -1820,10 +1824,6 @@ Kiek ok bi de [[Special:WantedCategories|wünschten Kategorien]].',
'activeusers-hidesysops' => 'Administraters nich wiesen',
'activeusers-noresult' => 'Keen Brukers funnen.',
-# Special:Log/newusers
-'newuserlogpage' => 'Ne’e-Bruker-Logbook',
-'newuserlogpagetext' => 'Dit is dat Logbook för nee opstellte Brukerkonten.',
-
# Special:ListGroupRights
'listgrouprights' => 'Brukergruppen-Rechten',
'listgrouprights-summary' => 'Dit is en List vun de Brukergruppen, de in dit Wiki defineert sünd, un de Rechten, de dor mit verbunnen sünd.
@@ -1911,11 +1911,7 @@ Mehr Informatschonen över enkelte Rechten staht ünner [[{{MediaWiki:Listgroupr
'enotif_mailer' => '{{SITENAME}} E-Mail-Bescheedgeevdeenst',
'enotif_reset' => 'All Sieden as besöcht marken',
-'enotif_newpagetext' => 'Dit is en ne’e Siet.',
'enotif_impersonal_salutation' => '{{SITENAME}}-Bruker',
-'changed' => 'ännert',
-'created' => 'opstellt',
-'enotif_subject' => '[{{SITENAME}}] De Siet „$PAGETITLE“ is vun $PAGEEDITOR $CHANGEDORCREATED worrn',
'enotif_lastvisited' => 'All Ännern siet dien letzten Besöök op een Blick: $1',
'enotif_lastdiff' => 'Kiek bi $1 för dit Ännern.',
'enotif_anon_editor' => 'Anonymen Bruker $1',
@@ -1939,6 +1935,8 @@ Du kriggst solang keen Bescheedgeev-E-Mails mehr, bet dat du de Siet wedder besÃ
--
De Instellungen vun dien Oppasslist to ännern, gah na: {{canonicalurl:Special:Watchlist/edit}}',
+'created' => 'opstellt',
+'changed' => 'ännert',
# Delete
'deletepage' => 'Siet wegsmieten',
@@ -2522,6 +2520,12 @@ All Transwiki-Import-Akschonen staht later ok in dat [[Special:Log/import|Import
# Info page
'pageinfo-title' => 'Informatschoon för "$1"',
'pageinfo-article-id' => 'Sied-ID',
+'pageinfo-redirectsto-info' => 'Info',
+'pageinfo-contentpage-yes' => 'Jo',
+'pageinfo-protect-cascading-yes' => 'Jo',
+'pageinfo-category-info' => 'Kategorieinformatschoon',
+'pageinfo-category-pages' => 'Tall vun Sied',
+'pageinfo-category-subcats' => 'TAll vun Ãœnnerkategorien',
# Skin names
'skinname-standard' => 'Klassik',
@@ -3149,6 +3153,6 @@ Geev den Dateinaam ahn den Tosatz „{{ns:file}}:“ an.',
# New logging system
'revdelete-restricted' => 'Inschränkungen för Administraters instellt',
'revdelete-unrestricted' => 'Inschränkungen för Administraters rutnahmen',
-'newuserlog-byemail' => 'Passwoord per E-Mail toschickt',
+'rightsnone' => '(kene)',
);
diff --git a/languages/messages/MessagesNds_nl.php b/languages/messages/MessagesNds_nl.php
index 55ae8c24..fb79f2c3 100644
--- a/languages/messages/MessagesNds_nl.php
+++ b/languages/messages/MessagesNds_nl.php
@@ -80,7 +80,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__FORSEERONDERWARPEN__', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
'toc' => array( '0', '__ONDERWARPEN__', '__INHOUD__', '__TOC__' ),
'noeditsection' => array( '0', '__GIENBEWARKSEKSIE__', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__GIENKOPJEN__', '__GEENKOP__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'DISSEMAOND', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonthname' => array( '1', 'DISSEMAONDNAAM', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
'currentmonthnamegen' => array( '1', 'DISSEMAONDGEN', 'HUIDIGEMAANDGEN', 'CURRENTMONTHNAMEGEN' ),
@@ -147,7 +146,7 @@ $magicWords = array(
'img_middle' => array( '1', 'midden', 'middle' ),
'img_bottom' => array( '1', 'benejen', 'beneden', 'bottom' ),
'img_text_bottom' => array( '1', 'tekste-benejen', 'tekst-beneden', 'text-bottom' ),
- 'img_link' => array( '1', 'verwiezing=$', 'verwijzing=$1', 'link=$1' ),
+ 'img_link' => array( '1', 'verwiezing=$1', 'verwijzing=$1', 'link=$1' ),
'sitename' => array( '1', 'WEBSTEENAAM', 'SITENAAM', 'SITENAME' ),
'ns' => array( '0', 'NR:', 'NS:' ),
'localurl' => array( '0', 'LOKALEURL', 'LOCALURL:' ),
@@ -274,7 +273,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Leste_wiezigingen' ),
'Recentchangeslinked' => array( 'Volg_verwiezingen' ),
'Revisiondelete' => array( 'Versie_vortdoon' ),
- 'RevisionMove' => array( 'Versie_verplaotsen' ),
'Search' => array( 'Zeuken' ),
'Shortpages' => array( 'Korte_artikels' ),
'Specialpages' => array( 'Spesiale_pagina\'s' ),
@@ -442,6 +440,7 @@ $messages = array(
'newwindow' => '(niej vienster)',
'cancel' => 'Aofbreken',
'moredotdotdot' => 'Meer...',
+'morenotlisted' => 'Meer niet in de lieste...',
'mypage' => 'Gebrukerszied',
'mytalk' => 'Mien overleg',
'anontalk' => 'Overlegzied veur dit IP-adres',
@@ -453,7 +452,6 @@ $messages = array(
'qbbrowse' => 'Blaojen',
'qbedit' => 'Bewark',
'qbpageoptions' => 'Disse zied',
-'qbpageinfo' => 'Ziedinformasie',
'qbmyoptions' => 'Veurkeuren',
'qbspecialpages' => 'Spesiale ziejen',
'faq' => 'Vragen die vake esteld wörden',
@@ -476,6 +474,7 @@ $messages = array(
'namespaces' => 'Naamruumtes',
'variants' => 'Variaanten',
+'navigation-heading' => 'Navigasiemenu',
'errorpagetitle' => 'Foutmelding',
'returnto' => 'Weerumme naor $1.',
'tagline' => 'Van {{SITENAME}}',
@@ -714,11 +713,9 @@ De beheerder gaf hierveur de volgende reden: "$3".',
# Login and logout pages
'logouttext' => "'''Je bin noen aofemeld.'''
-Je kunnen {{SITENAME}} noen anoniem gebruken of je eigen [[Special:UserLogin|opniej anmelden]] onder disse of n aandere gebrukersnaam.
+Je kunnen {{SITENAME}} noen anoniem gebruken of je eigen <span class='plainlinks'>[$1 opniej anmelden]</span> onder disse of n aandere gebrukersnaam.
t Kan ween dat der wat ziejen bin die weeregeven wörden asof je an-emeld bin totda'j t tussengeheugen van joew webkieker leegmaken.",
-'welcomecreation' => '== Welkom, $1! ==
-Joew gebrukersnaam is an-emaakt.
-Vergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] in te stellen.',
+'welcomeuser' => 'Welkom, $1!',
'yourname' => 'Gebrukersnaam',
'yourpassword' => 'Wachtwoord',
'yourpasswordagain' => 'Opniej invoeren',
@@ -741,7 +738,7 @@ Vergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] in te ste
'gotaccount' => "Stao'j al in-eschreven? '''$1'''.",
'gotaccountlink' => 'Anmelden',
'userlogin-resetlink' => "Bi'j de anmeldgegevens kwiet?",
-'createaccountmail' => 'per netpost',
+'createaccountmail' => 'Gebruuk n tiejelik wachtwoord dat joe netzelde is en stuur t naor t netpostadres dat hieronder steet',
'createaccountreason' => 'Reden:',
'badretype' => "De wachtwoorden die'j in-etikt hebben bin niet liek alleens.",
'userexists' => 'Disse gebrukersnaam is al gebruuk.
@@ -1053,7 +1050,6 @@ De leste logboekregel steet hieronder:",
'template-semiprotected' => '(half-beveiligd)',
'hiddencategories' => 'Disse zied völt in de volgende verbörgen {{PLURAL:$1|kategorie|kategorieën}}:',
'edittools' => '<!-- Disse tekste steet onder de bewarkings- en bestaandinlaodformulieren. -->',
-'nocreatetitle' => 't Anmaken van nieje ziejen is beteund',
'nocreatetext' => 'Disse webstee hef de meugelikheid um nieje ziejen an te maken beteund. Je kunnen ziejen die al bestaon wiezigen of je kunnen je [[Special:UserLogin|anmelden of n gebrukerszied anmaken]].',
'nocreate-loggedin' => 'Je hebben gien toestemming um nieje ziejen an te maken.',
'sectioneditnotsupported-title' => 't Bewarken van seksies wörden niet ondersteund',
@@ -1078,6 +1074,12 @@ t Schient dat t vortedaon is.',
t Besteet al.',
'defaultmessagetext' => 'Standardtekste',
+# Content models
+'content-model-wikitext' => 'wikitekste',
+'content-model-text' => 'tekste zonder opmaak',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
# Parser/template warnings
'expensive-parserfunction-warning' => 'Waorschuwing: disse zied gebruukt te veule kostbaore parserfunksies.
@@ -1434,8 +1436,8 @@ Disse haandeling kan niet ongedaonemaakt wörden.',
'prefs-emailconfirm-label' => 'Netpostbevestiging:',
'prefs-textboxsize' => 'Aofmetingen bewarkingsscharm',
'youremail' => 'Netpostadres (niet verplicht) *',
-'username' => 'Gebrukersnaam:',
-'uid' => 'Gebrukersnummer:',
+'username' => '{{GENDER:$1|Gebrukersnaam}}:',
+'uid' => '{{GENDER:$1|Gebrukersnummer}}:',
'prefs-memberingroups' => 'Lid van {{PLURAL:$1|groep|groepen}}:',
'prefs-registration' => 'Registrasiedaotum:',
'yourrealname' => 'Echte naam (niet verplicht)',
@@ -1585,12 +1587,13 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
'right-sendemail' => 'Bericht versturen naor aandere gebrukers',
'right-passwordreset' => 'Bekiek netpostberichten veur t opniej instellen van joew wachtwoord',
+# Special:Log/newusers
+'newuserlogpage' => 'Logboek mit anwas',
+'newuserlogpagetext' => 'Hieronder staon de niej in-eschreven gebrukers',
+
# User rights log
'rightslog' => 'Gebrukersrechtenlogboek',
'rightslogtext' => 'Dit is n logboek mit veraanderingen van gebrukersrechten',
-'rightslogentry' => 'Gebrukersrechten veur $1 ewiezigd van $2 naor $3',
-'rightslogentry-autopromote' => 'was automaties umhoge egaon van $2 naor $3',
-'rightsnone' => '(gien)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'disse zied lezen',
@@ -2050,6 +2053,8 @@ Vergeet niet de verwiezingen nao te kieken veurda\'j de mal vortdoon.',
Feitelik mutten ze rechtstreeks verwiezen naor t juuste onderwarp.<br />
Ziejen wörden ezien as n deurverwieszied, as de mal gebruukt wörden die vermeld steet op [[MediaWiki:Disambiguationspage]].",
+'pageswithprop-submit' => 'Zeuk',
+
'doubleredirects' => 'Dubbele deurverwiezingen',
'doubleredirectstext' => 'Op disse lieste staon alle ziejen die deurverwiezen naor aandere deurverwiezingen.
Op elke regel steet de eerste en de tweede deurverwiezing, daorachter steet de doelzied van de tweede deurverwiezing.
@@ -2224,10 +2229,6 @@ Ondersteunde protokollen: <code>$1</code> (zet t niet in joew zeukopdrachte).',
'activeusers-hidesysops' => 'Beheerders verbargen',
'activeusers-noresult' => 'Gien aktieve gebrukers evunnen.',
-# Special:Log/newusers
-'newuserlogpage' => 'Logboek mit anwas',
-'newuserlogpagetext' => 'Hieronder staon de niej in-eschreven gebrukers',
-
# Special:ListGroupRights
'listgrouprights' => 'Rechten van gebrukersgroepen',
'listgrouprights-summary' => "Op disse zied staon de gebrukersgroepen van disse wiki beschreven, mit de biebeheurende rechten.
@@ -2323,11 +2324,7 @@ Toekomstige wiezigingen op disse zied en de overlegzied zullen hier vermeld wör
'enotif_mailer' => '{{SITENAME}}-berichgevingssysteem',
'enotif_reset' => 'Markeer alle ziejen as bezöcht.',
-'enotif_newpagetext' => 'Dit is n nieje zied.',
'enotif_impersonal_salutation' => '{{SITENAME}}-gebruker',
-'changed' => 'ewiezigd',
-'created' => 'an-emaakt',
-'enotif_subject' => '{{SITENAME}}-zied $PAGETITLE is $CHANGEDORCREATED deur $PAGEEDITOR',
'enotif_lastvisited' => 'Zie $1 veur alle wiezigingen sinds joew leste bezeuk.',
'enotif_lastdiff' => 'Zie $1 um disse wieziging te bekieken.',
'enotif_anon_editor' => 'anonieme gebruker $1',
@@ -2360,6 +2357,8 @@ $UNWATCHURL
Opmarkingen en veerdere hulpe:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'an-emaakt',
+'changed' => 'ewiezigd',
# Delete
'deletepage' => 'Vortdoon',
@@ -2539,7 +2538,7 @@ $1',
'blanknamespace' => '(Heufdnaamruumte)',
# Contributions
-'contributions' => 'Biedragen van disse gebruker',
+'contributions' => '{{GENDER:$1|Biedragen van disse gebruker}}',
'contributions-title' => 'Biedragen van $1',
'mycontris' => 'Mien biedragen',
'contribsub2' => 'Veur $1 ($2)',
@@ -2933,7 +2932,6 @@ De tiedelike map is niet anwezig.',
# JavaScriptTest
'javascripttest' => 'JavaScript testen',
-'javascripttest-disabled' => 'Disse funksie steet niet an op disse wiki.',
'javascripttest-title' => 'Tests uutvoeren veur $1',
'javascripttest-pagetext-noframework' => 'Disse zied is ereserveerd veur t uutvoeren van JavaScript-testen.',
'javascripttest-pagetext-unknownframework' => 'Onbekend testraamwark "$1".',
@@ -3066,6 +3064,11 @@ Meestentieds kömp dit deur n uutgaonde verwiezing die op de zwarte lieste steet
'pageinfo-magic-words' => '{{PLURAL:$1|Magies woord|Magiese woorden}} ($1)',
'pageinfo-hidden-categories' => 'Verbörgen {{PLURAL:$1|kategorie|kategorieën}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Gebruukten mal|Gebruukten mallen}} ($1)',
+'pageinfo-toolboxlink' => 'Informasie over disse zied',
+'pageinfo-redirectsto' => 'Verwis deur naor',
+'pageinfo-redirectsto-info' => 'informasie',
+'pageinfo-contentpage' => 'Eteld as zied mit inhoud',
+'pageinfo-contentpage-yes' => 'Ja',
# Skin names
'skinname-standard' => 'Klassiek',
@@ -3150,6 +3153,7 @@ $1',
'hours' => '{{PLURAL:$1|$1 ure|$1 uren}}',
'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
'ago' => '$1 eleen',
+'just-now' => 'onderlest',
# Bad image list
'bad_image_list' => 'De opmaak is as volgt:
@@ -3896,7 +3900,7 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
'logentry-newusers-create' => '$1 hef n gebruker an-emaakt',
'logentry-newusers-create2' => '$1 hef n gebruker $3 an-emaakt',
'logentry-newusers-autocreate' => 'De gebruker $1 is automaties an-emaakt',
-'newuserlog-byemail' => 'wachtwoord is verstuurd via de netpost',
+'rightsnone' => '(gien)',
# Feedback
'feedback-bugornote' => 'A\'j zovere bin um n technies probleem nauwkeurig te beschrieven, [$1 meld dan n programmafout].
diff --git a/languages/messages/MessagesNe.php b/languages/messages/MessagesNe.php
index 61cb0f59..3eb03d13 100644
--- a/languages/messages/MessagesNe.php
+++ b/languages/messages/MessagesNe.php
@@ -189,6 +189,7 @@ $messages = array(
'newwindow' => '(नयाठविनà¥à¤¡à¥‹à¤®à¤¾ खà¥à¤²à¥à¤›)',
'cancel' => 'रदà¥à¤¦',
'moredotdotdot' => 'थप...',
+'morenotlisted' => 'थप जानकारी दिइà¤à¤•à¥‹ छैन',
'mypage' => 'पृषà¥à¤ ',
'mytalk' => 'वारà¥à¤¤à¤¾',
'anontalk' => 'यस IP को वारेमा वारà¥à¤¤à¤¾à¤²à¤¾à¤ª गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
@@ -200,7 +201,6 @@ $messages = array(
'qbbrowse' => 'बà¥à¤°à¤¾à¤‰à¤œ गरà¥à¤¨à¥‡',
'qbedit' => 'समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¥‡',
'qbpageoptions' => 'यो पेज',
-'qbpageinfo' => 'सनà¥à¤¦à¤°à¥à¤­',
'qbmyoptions' => 'मेरो पेज',
'qbspecialpages' => 'विशेष पृषà¥à¤ à¤¹à¤°à¥',
'faq' => 'धैरै सोधिà¤à¤•à¤¾ पà¥à¤°à¤¶à¥à¤¨à¤¹à¤°à¥',
@@ -223,6 +223,7 @@ $messages = array(
'namespaces' => 'नेमसà¥à¤ªà¥‡à¤¸',
'variants' => 'बहà¥à¤°à¥à¤ªà¤¹à¤°à¥',
+'navigation-heading' => 'नेविगेशन मेनू',
'errorpagetitle' => 'तà¥à¤°à¥à¤Ÿà¤¿',
'returnto' => '$1 मा फरà¥à¤•à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'tagline' => '{{SITENAME}}बाट',
@@ -459,10 +460,9 @@ $2',
# Login and logout pages
'logouttext' => "'''तपाईं अहिले बाहिर निसà¥à¤•à¤¨à¥ भà¤à¤•à¥‹ छ।'''
-तपाईंले नाम/खाताविनै पनि {{SITENAME}}मा पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤›, अथवा अघिकै वा अरà¥à¤•à¥ˆ कà¥à¤¨à¥ˆ नामको खाताबाट [[Special:UserLogin|फेरि पà¥à¤°à¤µà¥‡à¤¶ गरà¥à¤¨]] पनि सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤›à¥¤
+तपाईंले नाम/खाताविनै पनि {{SITENAME}}मा पà¥à¤°à¤¯à¥‹à¤— गरà¥à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤›, अथवा अघिकै वा अरà¥à¤•à¥ˆ कà¥à¤¨à¥ˆ नामको खाताबाट <span class='plainlinks'>[$1 फेरि पà¥à¤°à¤µà¥‡à¤¶ गरà¥à¤¨]</span> पनि सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤›à¥¤
याद राखà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ तपाईंले बà¥à¤°à¤¾à¤‰à¤œà¤°à¤•à¥‹ सà¥à¤®à¤°à¤£ भणà¥à¤¡à¤¾à¤° खालि नगरà¥à¤¦à¤¾à¤¸à¤®à¥à¤® कà¥à¤¨à¥ˆ पृषà¥à¤ à¤¹à¤°à¥‚मा तपाईं अà¤à¥ˆ पà¥à¤°à¤µà¥‡à¤¶ गरिराखेको देखाउन सकà¥à¤›à¥¤",
-'welcomecreation' => '== सà¥à¤µà¤¾à¤—तमॠ, $1! ==
-तपाà¤à¤ˆà¤•à¥‹ खाता खोलिà¤à¤•à¥‹ छ। [[Special:Preferences|{{SITENAME}} preferences]]मा आफà¥à¤¨à¤¾ अभिरà¥à¤šà¤¿à¤¹à¤°à¥‚ परिवरà¥à¤¤à¤¨ गरà¥à¤¨ नबिरà¥à¤¸à¤¿à¤¨à¥à¤¹à¥‹à¤²à¤¾à¥¤',
+'welcomeuser' => '$1जी सà¥à¤µà¤¾à¤—त छ!',
'yourname' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ नाम:',
'yourpassword' => 'पासवरà¥à¤¡',
'yourpasswordagain' => 'पासवरà¥à¤¡ फेरि टाईप गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
@@ -789,7 +789,6 @@ $2
'hiddencategories' => 'यो पृषà¥à¤  निमà¥à¤¨ {{PLURAL:$1|1 लà¥à¤•à¤¾à¤‡à¤à¤•à¥‹ शà¥à¤°à¥‡à¤£à¥€|$1 लà¥à¤•à¤¾à¤‡à¤à¤•à¤¾ शà¥à¤°à¥‡à¤£à¥€à¤¹à¤°à¥}}को सदसà¥à¤¯ हो :',
'edittools' => '<!-- Text here will be shown below edit and upload forms. -->',
'edittools-upload' => '-',
-'nocreatetitle' => 'पृषà¥à¤  सृजना सीमित गरिà¤à¤•à¥‹',
'nocreatetext' => '{{SITENAME}} ले नयाठपृषà¥à¤  सृजना गरà¥à¤¨ सकà¥à¤¨à¥‡ कà¥à¤·à¤®à¤¤à¤¾à¤®à¤¾ रोक लगाà¤à¤•à¥‹ छ।
तपाईठपछाडि जानॠभइ रहिआà¤à¤•à¥‹ पृषà¥à¤  समà¥à¤ªà¤¾à¤¦à¤¨ गरà¥à¤¨à¤¸à¤•à¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› , अथवा [[Special:UserLogin|पà¥à¤°à¤µà¥‡à¤¶ गरà¥à¤¨à¥à¤¹à¥‹à¤¸ या नयाठखाता सृजना गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ]]।',
'nocreate-loggedin' => 'नयाठपृषà¥à¤  सृजनागरà¥à¤¨à¤•à¥‹ लागि तपाईà¤à¤²à¤¾à¤ˆ अनà¥à¤®à¤¤à¤¿ छैन ।',
@@ -1307,12 +1306,12 @@ HTML टà¥à¤¯à¤¾à¤—हरॠजाà¤à¤šà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ ।',
'right-sendemail' => 'अनà¥à¤¯ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥à¤²à¤¾à¤ˆ इमेल गरà¥à¤¨à¥‡',
'right-passwordreset' => 'पासवरà¥à¤¡ परिवरà¥à¤¤à¤¨ गरà¥à¤¨à¥‡ ईमेलहरॠहेरà¥à¤¨à¥à¤¹à¥‹à¤¸',
+# Special:Log/newusers
+'newuserlogpage' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शà¥à¤°à¥ƒà¤œà¤¨à¤¾ लग',
+
# User rights log
'rightslog' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ अधिकार लग',
'rightslogtext' => 'यो पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ अधिकारहरà¥à¤•à¥‹ परिवरà¥à¤¤à¤¨ लग हो ।',
-'rightslogentry' => '$1 समूह सदसà¥à¤¯à¤¾à¤¤à¤¾ $2 बाट $3 मा परिवरà¥à¤¤à¤¨ गरिà¤à¤•à¥‹ छ',
-'rightslogentry-autopromote' => ' $2 बाट $3 मा सà¥à¤µà¤¤: बढà¥à¤µà¤¾ गरिà¤à¤•à¥‹ छ',
-'rightsnone' => '(कà¥à¤¨à¥ˆà¤ªà¤¨à¤¿ होइन)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'यो पृषà¥à¤  पढà¥à¤¨à¥‡',
@@ -1814,9 +1813,6 @@ $1',
'activeusers-hidesysops' => 'पà¥à¤°à¤¬à¤¨à¥à¤§à¤•à¤¹à¤°à¥ लà¥à¤•à¤¾à¤‰à¤¨à¥‡',
'activeusers-noresult' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾à¤¹à¤°à¥ भेटिà¤à¤¨à¤¨à¥à¥¤',
-# Special:Log/newusers
-'newuserlogpage' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ शà¥à¤°à¥ƒà¤œà¤¨à¤¾ लग',
-
# Special:ListGroupRights
'listgrouprights' => 'पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ समूह अधिकार',
'listgrouprights-summary' => 'निमà¥à¤¨ सूची यस विकिमा परिभाषित समूहहरॠर तिनीहरà¥à¤²à¥‡ पà¥à¤°à¤¯à¥‹à¤—गरà¥à¤¨ सकà¥à¤¨à¥‡ संबदà¥à¤§ अधिकारहरà¥à¤•à¥‹ हो।
@@ -1907,11 +1903,7 @@ $1',
'enotif_mailer' => '{{SITENAME}} जानकारी पà¥à¤°à¥‡à¤·à¤•',
'enotif_reset' => 'सबै पृषà¥à¤ à¤¹à¤°à¥ भनी दाग दिने',
-'enotif_newpagetext' => 'यो नयाठपृषà¥à¤  हो।',
'enotif_impersonal_salutation' => '{{SITENAME}} पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾',
-'changed' => 'परिवरà¥à¤¤à¤¨ भइसकेको',
-'created' => 'बनाइà¤à¤•à¥‹',
-'enotif_subject' => '$PAGEEDITORदà¥à¤µà¤¾à¤°à¤¾ {{SITENAME}} पृषà¥à¤  $PAGETITLE $CHANGEDORCREATED गरिà¤à¤•à¥‹',
'enotif_lastvisited' => 'अघिलà¥à¤²à¥‹ हेराइपछिका सबै परिवरà¥à¤¤à¤¨à¤¹à¤°à¥à¤•à¥‹ निमà¥à¤¤à¤¿ हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥: $1',
'enotif_lastdiff' => 'यस परिवरà¥à¤¤à¤¨à¤•à¥‹ निमà¥à¤¤à¤¿ यो $1 हेरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
'enotif_anon_editor' => 'अजà¥à¤žà¤¾à¤¤ पà¥à¤°à¤¯à¥‹à¤—करà¥à¤¤à¤¾ $1',
@@ -1945,6 +1937,8 @@ $UNWATCHURL
पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾ र अनà¥à¤¯ सहयोगको निमà¥à¤¤à¤¿:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'बनाइà¤à¤•à¥‹',
+'changed' => 'परिवरà¥à¤¤à¤¨ भइसकेको',
# Delete
'deletepage' => 'पृषà¥à¤  मेटà¥à¤¨à¥à¤¹à¥‹à¤¸à¥',
@@ -3439,7 +3433,7 @@ $5
'revdelete-restricted' => 'पà¥à¤°à¤¬à¤¨à¥à¤§à¤•à¤¹à¤°à¥à¤®à¤¾à¤¥à¤¿ सीमितता लागू गरियो',
'revdelete-unrestricted' => 'पà¥à¤°à¤µà¤¨à¥à¤§à¤•à¤•à¥‹à¤²à¤¾à¤—ि निषेधहरॠहटाइयो ।',
'logentry-move-move' => '$1 दà¥à¤µà¤¾à¤°à¤¾ $3 पृषà¥à¤ à¤²à¤¾à¤ˆ $4 मा सारियो',
-'newuserlog-byemail' => 'इ मेलबाट पठाइà¤à¤•à¥‹ पà¥à¤°à¤µà¥‡à¤¶à¤¶à¤µà¥à¤¦',
+'rightsnone' => '(कà¥à¤¨à¥ˆà¤ªà¤¨à¤¿ होइन)',
# Feedback
'feedback-subject' => 'विषय:',
diff --git a/languages/messages/MessagesNew.php b/languages/messages/MessagesNew.php
index bfeed487..0c1e4790 100644
--- a/languages/messages/MessagesNew.php
+++ b/languages/messages/MessagesNew.php
@@ -290,9 +290,7 @@ MySQL नं इरर "<tt>$3: $4</tt>" कà¥à¤¯à¤‚गॠदà¥à¥¤',
'viewsource' => 'सà¥à¤°à¥‹à¤¤ सà¥à¤µà¤¯à¤¾à¤¦à¤¿à¤¸à¤',
# Login and logout pages
-'welcomecreation' => '== लसकà¥à¤¸, $1! ==
-छिगॠखाता चायेके धà¥à¤‚कल।
-छिगॠ[[Special:Preferences|{{SITENAME}} पà¥à¤°à¤¾à¤¥à¤®à¤¿à¤•à¤¤à¤¾]] हिलिगॠलà¥à¤®à¤‚कादिसà¤à¥¤',
+'welcomeuser' => 'लसकà¥à¤¸, $1जà¥!',
'yourname' => 'छà¥à¤¯à¥â€Œà¤²à¤¾à¤®à¤¿ नां:',
'yourpassword' => 'दà¥à¤¥à¤–à¤à¤—à¥à¤µà¤ƒ (पासवरà¥à¤¦):',
'yourpasswordagain' => 'दà¥à¤¥à¤–à¤à¤—à¥à¤µà¤ƒ हानं तियादिसà¤:',
@@ -349,6 +347,9 @@ MySQL नं इरर "<tt>$3: $4</tt>" कà¥à¤¯à¤‚गॠदà¥à¥¤',
'yourtext' => 'छिगॠआखः',
'storedversion' => 'सà¥à¤µà¤¥à¤¨à¤¾à¤¤à¤—ॠसंसà¥à¤•à¤°à¤£',
+# Content models
+'content-model-text' => 'सादा आखः',
+
# History pages
'revisionasof' => '$1 तकà¥à¤•à¤¯à¤¾ संसà¥à¤•à¤°à¤£',
'previousrevision' => 'â†à¤ªà¥à¤²à¤¾à¤‚गॠसंसà¥à¤•à¤°à¤£',
diff --git a/languages/messages/MessagesNiu.php b/languages/messages/MessagesNiu.php
index bc490677..eaa2d499 100644
--- a/languages/messages/MessagesNiu.php
+++ b/languages/messages/MessagesNiu.php
@@ -102,9 +102,6 @@ $messages = array(
'viewsource' => 'Kitekite ke mouaga',
# Login and logout pages
-'welcomecreation' => '== Fakalofa atu, kua fiafia ke hu mai $1 ==
-Kua talaga e haau a poko.
-Ua nimo ke hiki e haau tau [[Special:Preferences|manako {{SITENAME}}]].',
'yourname' => 'Matahigoa he tagata:',
'yourpassword' => 'Kupu fufu:',
'yourpasswordagain' => 'Liu lolomi e kupu fufu:',
diff --git a/languages/messages/MessagesNl.php b/languages/messages/MessagesNl.php
index adac5114..25be8693 100644
--- a/languages/messages/MessagesNl.php
+++ b/languages/messages/MessagesNl.php
@@ -43,6 +43,7 @@
* @author Trijnstel
* @author Troefkaart
* @author Tvdm
+ * @author Wiki13
* @author לערי ריינה×רט
*/
@@ -102,7 +103,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__INHOUD_DWINGEN__', '__FORCEERINHOUD__', '__FORCETOC__' ),
'toc' => array( '0', '__INHOUD__', '__TOC__' ),
'noeditsection' => array( '0', '__NIETBEWERKBARESECTIE__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__GEENKOP__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'HUIDIGEMAAND', 'HUIDIGEMAAND2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'HUIDIGEMAAND1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'HUIDIGEMAANDNAAM', 'CURRENTMONTHNAME' ),
@@ -172,7 +172,7 @@ $magicWords = array(
'img_middle' => array( '1', 'midden', 'middle' ),
'img_bottom' => array( '1', 'beneden', 'bottom' ),
'img_text_bottom' => array( '1', 'tekst-beneden', 'text-bottom' ),
- 'img_link' => array( '1', 'verwijzing=$1', 'link=$1' ),
+ 'img_link' => array( '1', 'koppeling=$1', 'verwijzing=$1', 'link=$1' ),
'sitename' => array( '1', 'SITENAAM', 'SITENAME' ),
'ns' => array( '0', 'NR:', 'NS:' ),
'nse' => array( '0', 'NRE:', 'NSE:' ),
@@ -212,7 +212,7 @@ $magicWords = array(
'displaytitle' => array( '1', 'WEERGEGEVENTITEL', 'TOONTITEL', 'DISPLAYTITLE' ),
'rawsuffix' => array( '1', 'V', 'R' ),
'newsectionlink' => array( '1', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
- 'nonewsectionlink' => array( '1', '__GEENNIEUWESECTIELINK__', '__GEENNIEUWKOPJEVERWIJZING__', '__NONEWSECTIONLINK__' ),
+ 'nonewsectionlink' => array( '1', '__GEENNIEUWKOPJEKOPPELING__', '__GEENNIEUWESECTIELINK__', '__GEENNIEUWKOPJEVERWIJZING__', '__NONEWSECTIONLINK__' ),
'currentversion' => array( '1', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
'urlencode' => array( '0', 'URLCODEREN', 'CODEERURL', 'URLENCODE:' ),
'anchorencode' => array( '0', 'ANKERCODEREN', 'CODEERANKER', 'ANCHORENCODE' ),
@@ -243,6 +243,10 @@ $magicWords = array(
'url_query' => array( '0', 'ZOEKOPDRACHT', 'QUERY' ),
'defaultsort_noerror' => array( '0', 'geenfout', 'noerror' ),
'defaultsort_noreplace' => array( '0', 'nietvervangen', 'noreplace' ),
+ 'pagesincategory_all' => array( '0', 'alle', 'all' ),
+ 'pagesincategory_pages' => array( '0', 'paginas', 'pages' ),
+ 'pagesincategory_subcats' => array( '0', 'ondercategorieen', 'subcats' ),
+ 'pagesincategory_files' => array( '0', 'bestanden', 'files' ),
);
$specialPageAliases = array(
@@ -315,7 +319,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'RecenteWijzigingen' ),
'Recentchangeslinked' => array( 'RecenteWijzigingenGelinkt', 'VerwanteWijzigingen' ),
'Revisiondelete' => array( 'VersieVerwijderen', 'HerzieningVerwijderen', 'RevisieVerwijderen' ),
- 'RevisionMove' => array( 'VersieVerplaatsen' ),
'Search' => array( 'Zoeken' ),
'Shortpages' => array( 'KortePaginas', 'KortePagina’s', 'KortePagina\'s' ),
'Specialpages' => array( 'SpecialePaginas', 'SpecialePagina’s', 'SpecialePagina\'s' ),
@@ -484,6 +487,7 @@ $messages = array(
'newwindow' => '(opent in een nieuw venster)',
'cancel' => 'Annuleren',
'moredotdotdot' => 'Meer…',
+'morenotlisted' => 'Meer niet in de lijst...',
'mypage' => 'Gebruikerspagina',
'mytalk' => 'Overleg',
'anontalk' => 'Overlegpagina voor dit IP-adres',
@@ -495,7 +499,6 @@ $messages = array(
'qbbrowse' => 'Bladeren',
'qbedit' => 'Bewerken',
'qbpageoptions' => 'Deze pagina',
-'qbpageinfo' => 'Pagina-informatie',
'qbmyoptions' => "Mijn pagina's",
'qbspecialpages' => 'Speciale pagina’s',
'faq' => 'Veel gestelde vragen',
@@ -518,6 +521,7 @@ $messages = array(
'namespaces' => 'Naamruimten',
'variants' => 'Varianten',
+'navigation-heading' => 'Navigatiemenu',
'errorpagetitle' => 'Fout',
'returnto' => 'Terug naar $1.',
'tagline' => 'Uit {{SITENAME}}',
@@ -763,10 +767,10 @@ De opgegeven reden is "\'\'$3\'\'".',
# Login and logout pages
'logouttext' => "'''U bent nu afgemeld.'''
-U kunt {{SITENAME}} nu anoniem gebruiken of weer [[Special:UserLogin|aanmelden]] als dezelfde of een andere gebruiker.
+U kunt {{SITENAME}} nu anoniem gebruiken of weer <span class='plainlinks'>[$1 aanmelden]</span> als dezelfde of een andere gebruiker.
Mogelijk worden nog een aantal pagina's weergegeven alsof u aangemeld bent totdat u de cache van uw browser leegt.",
-'welcomecreation' => '== Welkom, $1! ==
-Uw gebruiker is geregistreerd.
+'welcomeuser' => 'Welkom, $1!',
+'welcomecreation-msg' => 'Uw gebruiker is aangemaakt.
Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te passen.',
'yourname' => 'Gebruikersnaam:',
'yourpassword' => 'Wachtwoord:',
@@ -790,7 +794,7 @@ Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te pass
'gotaccount' => 'Hebt u al een gebruikersnaam? $1.',
'gotaccountlink' => 'Aanmelden',
'userlogin-resetlink' => 'Bent u uw aanmeldgegevens vergeten?',
-'createaccountmail' => 'Per e-mail',
+'createaccountmail' => 'Gebruik een tijdelijk willekeurig wachtwoord en stuur het naar het e-mailadres dat hieronder is vermeld',
'createaccountreason' => 'Reden:',
'badretype' => 'De ingevoerde wachtwoorden verschillen van elkaar.',
'userexists' => 'De gekozen gebruikersnaam is al in gebruik.
@@ -876,6 +880,7 @@ Wacht even voordat u het opnieuw probeert.',
# Email sending
'php-mail-error-unknown' => 'Er is een onbekende fout opgetreden in de mail()-functie van PHP',
'user-mail-no-addy' => 'Geprobeerd een e-mail te verzenden zonder een e-mailadres.',
+'user-mail-no-body' => 'Er is geprobeerd een e-mail te verzenden zonder inhoud of met een hele korte inhoud.',
# Change password dialog
'resetpass' => 'Wachtwoord wijzigen',
@@ -924,7 +929,7 @@ Meld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan
Tijdelijk wachtwoord: $2',
'passwordreset-emailsent' => 'Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden.',
'passwordreset-emailsent-capture' => 'Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden. Deze wordt hieronder weergegeven.',
-'passwordreset-emailerror-capture' => 'Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de {{GENDER:$2|gebruiker}} is mislukt om de volgende reden: $1',
+'passwordreset-emailerror-capture' => 'Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de gebruiker is mislukt om de volgende reden: $1',
# Special:ChangeEmail
'changeemail' => 'E-mailadres wijzigen',
@@ -934,6 +939,7 @@ Tijdelijk wachtwoord: $2',
'changeemail-oldemail' => 'Huidig e-mailadres:',
'changeemail-newemail' => 'Nieuw e-mailadres:',
'changeemail-none' => '(geen)',
+'changeemail-password' => 'Uw wachtwoord voor {{SITENAME}}:',
'changeemail-submit' => 'E-mailadres wijzigen',
'changeemail-cancel' => 'Annuleren',
@@ -1125,7 +1131,6 @@ De laatste logboekregel staat hieronder:",
'template-semiprotected' => '(semibeveiligd)',
'hiddencategories' => 'Deze pagina valt in de volgende verborgen {{PLURAL:$1|categorie|categorieën}}:',
'edittools' => '<!-- Deze tekst wordt weergegeven onder bewerkings- en uploadformulieren. -->',
-'nocreatetitle' => "Het aanmaken van pagina's is beperkt",
'nocreatetext' => "{{SITENAME}} heeft de mogelijkheid om nieuwe pagina's te maken beperkt.
U kunt reeds bestaande pagina's wijzigen of u kunt [[Special:UserLogin|zich aanmelden of registreren]].",
'nocreate-loggedin' => "U hebt geen rechten om nieuwe pagina's te maken.",
@@ -1150,6 +1155,15 @@ Deze lijkt verwijderd te zijn.',
'edit-already-exists' => 'De pagina is niet aangemaakt.
Deze bestaat al.',
'defaultmessagetext' => 'Standaardinhoud',
+'content-failed-to-parse' => 'Het was niet mogelijk de inhoud van het MIME-type $2 voor het model $1 te verwerken: $3.',
+'invalid-content-data' => 'Ongeldige inhoudsgegevens',
+'content-not-allowed-here' => 'De inhoud "$1" is niet toegestaan op pagina [[$2]].',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'tekst zonder opmaak',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Waarschuwing:''' deze pagina gebruikt te veel kostbare parserfuncties.
@@ -1521,9 +1535,9 @@ Deze handeling kan niet ongedaan gemaakt worden.',
'prefs-emailconfirm-label' => 'E-mailbevestiging:',
'prefs-textboxsize' => 'Afmetingen bewerkingsscherm',
'youremail' => 'Uw e-mailadres:',
-'username' => 'Gebruikersnaam:',
-'uid' => 'Gebruikersnummer:',
-'prefs-memberingroups' => 'Lid van {{PLURAL:$1|groep|groepen}}:',
+'username' => '{{GENDER:$1|Gebruikersnaam}}:',
+'uid' => '{{GENDER:$1|Gebruikersnummer}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepen}}:',
'prefs-registration' => 'Registratiedatum:',
'yourrealname' => 'Uw echte naam:',
'yourlanguage' => 'Taal:',
@@ -1674,12 +1688,13 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
'right-sendemail' => 'E-mail versturen aan andere gebruikers',
'right-passwordreset' => 'E-mails voor wachtwoord opnieuw instellen bekijken',
+# Special:Log/newusers
+'newuserlogpage' => 'Logboek nieuwe gebruikers',
+'newuserlogpagetext' => 'Hieronder staan de nieuw ingeschreven gebruikers',
+
# User rights log
'rightslog' => 'Gebruikersrechtenlogboek',
'rightslogtext' => 'Hieronder staan de wijzigingen in gebruikersrechten.',
-'rightslogentry' => 'heeft de gebruikersrechten voor $1 gewijzigd van $2 naar $3',
-'rightslogentry-autopromote' => 'is automatisch gepromoveerd van de groepen "$2" naar de groepen "$3"',
-'rightsnone' => '(geen)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'deze pagina te bekijken',
@@ -1933,6 +1948,7 @@ Als het probleem aanhoudt, neem dan contact op met een [[Special:ListUsers/sysop
'backend-fail-notsame' => 'Er staat al een niet-identiek bestand op de plaats $1.',
'backend-fail-invalidpath' => '$1 is geen geldig opslagpad.',
'backend-fail-delete' => 'Het bestand $1 kon niet verwijderd worden.',
+'backend-fail-describe' => 'Het was niet mogelijk de metadata aan te passen voor het bestand "$1".',
'backend-fail-alreadyexists' => 'Het bestand $1 bestaat al.',
'backend-fail-store' => 'Het was niet mogelijk het bestand $1 op te slaan op locatie $2.',
'backend-fail-copy' => 'Het was niet mogelijk het bestand $1 te kopiëren naar $2.',
@@ -2172,6 +2188,12 @@ Vergeet niet de "Koppelingen naar deze pagina" te controleren alvorens deze sjab
Deze horen waarschijnlijk direct naar een meer toepasselijke pagina te verwijzen.<br />
Een pagina wordt gezien als doorverwijspagina als er een sjabloon op staat dat opgenomen is op [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => "Pagina's met een pagina-eigenschap",
+'pageswithprop-legend' => "Pagina's met een pagina-eigenschap",
+'pageswithprop-text' => "Op deze pagina worden pagina's weergegeven met een bepaalde pagina-eigenschap.",
+'pageswithprop-prop' => 'Naam van de eigenschap:',
+'pageswithprop-submit' => 'OK',
+
'doubleredirects' => 'Dubbele doorverwijzingen',
'doubleredirectstext' => "Deze lijst bevat pagina's die doorverwijzen naar andere doorverwijspagina's.
Elke rij bevat koppelingen naar de eerste en de tweede doorverwijspagina en een koppeling naar de doelpagina van de tweede doorverwijspagina.
@@ -2329,7 +2351,7 @@ Zie ook [[Special:WantedCategories|niet-bestaande categorieën met koppelingen]]
'linksearch-ok' => 'Zoeken',
'linksearch-text' => 'Wildcards zoals "*.wikipedia.org" of "*.org" zijn toegestaan.
Heeft tenminste een topleveldomein nodig, zoals bijvoorbeeld "*.org".<br />
-Ondersteunde protocollen: <code>$1</code> (wordt "http://"als er geen protocol wordt opgegeven).',
+{{PLURAL:$2|Ondersteund protocol|Ondersteunde protocollen}}: <code>$1</code> (wordt "http://"als er geen protocol wordt opgegeven).',
'linksearch-line' => '$1 heeft een koppeling in $2',
'linksearch-error' => 'Wildcards zijn alleen toegestaan aan het begin van een hostnaam.',
@@ -2348,10 +2370,6 @@ Ondersteunde protocollen: <code>$1</code> (wordt "http://"als er geen protocol w
'activeusers-hidesysops' => 'Beheerders verbergen',
'activeusers-noresult' => 'Geen actieve gebruikers gevonden.',
-# Special:Log/newusers
-'newuserlogpage' => 'Logboek nieuwe gebruikers',
-'newuserlogpagetext' => 'Hieronder staan de nieuw ingeschreven gebruikers',
-
# Special:ListGroupRights
'listgrouprights' => 'Rechten van gebruikersgroepen',
'listgrouprights-summary' => 'Op deze pagina staan de gebruikersgroepen in deze wiki beschreven, met hun bijbehorende rechten.
@@ -2447,19 +2465,23 @@ Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden
'enotif_mailer' => '{{SITENAME}}-berichtensysteem',
'enotif_reset' => "Alle pagina's markeren als bezocht",
-'enotif_newpagetext' => 'Dit is een nieuwe pagina.',
'enotif_impersonal_salutation' => 'gebruiker van {{SITENAME}}',
-'changed' => 'gewijzigd',
-'created' => 'aangemaakt',
-'enotif_subject' => 'Pagina $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED door $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}}: pagina $1 is verwijderd door {{GENDER:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}}: pagina $1 is aangemaakt door {{GENDER:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}}: pagina $1 is hernoemd door {{GENDER:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}}: pagina $1 is teruggeplaatst door {{GENDER:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}}: pagina $1 is bewerkt door {{GENDER:$2|$2}}',
+'enotif_body_intro_deleted' => 'De pagina $1 op {{SITENAME}} is verwijderd door {{gender:$2|$2}} op $PAGEEDITDATE. Zie $3 voor de huidige versie.',
+'enotif_body_intro_created' => 'De pagina $1 op {{SITENAME}} is aangemaakt door {{GENDER:$2|$2}} op $PAGEEDITDATE. Zie $3 voor de huidige versie.',
+'enotif_body_intro_moved' => 'De pagina $1 op {{SITENAME}} is hernoemd door {{GENDER:$2|$2}} op $PAGEEDITDATE. Zie $3 voor de huidige versie.',
+'enotif_body_intro_restored' => 'De pagina $1 op {{SITENAME}} is teruggeplaatst door {{GENDER:$2|$2}} op $PAGEEDITDATE. Zie $3 voor de huidige versie.',
+'enotif_body_intro_changed' => 'De pagina $1 op {{SITENAME}} is bewerkt door {{GENDER:$2|$2}} op $PAGEEDITDATE. Zie $3 voor de huidige versie.',
'enotif_lastvisited' => 'Zie $1 voor alle wijzigingen sinds uw laatste bezoek.',
'enotif_lastdiff' => 'Ga naar $1 om deze wijziging te bekijken.',
'enotif_anon_editor' => 'anonieme gebruiker $1',
'enotif_body' => 'Beste $WATCHINGUSERNAME,
-De pagina $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED op $PAGEEDITDATE door $PAGEEDITOR. Zie $PAGETITLE_URL voor de huidige versie.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Samenvatting van de wijziging: $PAGESUMMARY $PAGEMINOREDIT
@@ -2483,6 +2505,8 @@ $UNWATCHURL
Terugkoppeling en verdere assistentie:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'aangemaakt',
+'changed' => 'gewijzigd',
# Delete
'deletepage' => 'Pagina verwijderen',
@@ -2555,6 +2579,8 @@ Zie de [[Special:ProtectedPages|lijst met beveiligde pagina's]] voor alle beveil
'prot_1movedto2' => '[[$1]] is hernoemd naar [[$2]]',
'protect-badnamespace-title' => 'Niet te beveiligen naamruimte',
'protect-badnamespace-text' => "Pagina's in deze naamruimte kunnen niet beveiligd worden.",
+'protect-norestrictiontypes-text' => 'Deze pagina kan niet beveiligd worden omdat er geen beperkingstypen beschikbaar zijn.',
+'protect-norestrictiontypes-title' => 'Niet te beveiligen pagina',
'protect-legend' => 'Beveiliging bevestigen',
'protectcomment' => 'Reden:',
'protectexpiry' => 'Duur:',
@@ -2639,8 +2665,8 @@ Mogelijk hebt u een verkeerde koppeling of is de versie hersteld of verwijderd u
'undeletedrevisions' => '$1 {{PLURAL:$1|versie|versies}} teruggeplaatst',
'undeletedrevisions-files' => '{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestand|$2 bestanden}} teruggeplaatst',
'undeletedfiles' => '{{PLURAL:$1|1 bestand|$1 bestanden}} teruggeplaatst',
-'cannotundelete' => 'Het terugplaatsen is mislukt.
-Misschien heeft een andere gebruiker de pagina al teruggeplaatst.',
+'cannotundelete' => 'Het terugplaatsen is mislukt:
+$1',
'undeletedpage' => "'''$1 is teruggeplaatst'''
In het [[Special:Log/delete|verwijderingslogboek]] staan recente verwijderingen en herstelhandelingen.",
@@ -2672,7 +2698,7 @@ $1',
'blanknamespace' => '(Hoofdnaamruimte)',
# Contributions
-'contributions' => 'Gebruikersbijdragen',
+'contributions' => '{{GENDER:$1|Gebruikersbijdragen}}',
'contributions-title' => 'Bijdragen van $1',
'mycontris' => 'Bijdragen',
'contribsub2' => 'Voor $1 ($2)',
@@ -2950,6 +2976,7 @@ Wilt u deze verwijderen om plaats te maken voor de te hernoemen pagina?',
'immobile-target-namespace-iw' => 'Een interwikikoppeling is geen geldige bestemming voor het hernoemen van een pagina.',
'immobile-source-page' => 'Deze pagina kan niet hernoemd worden.',
'immobile-target-page' => 'Het is niet mogelijk te hernoemen naar die paginanaam.',
+'bad-target-model' => 'De gewenste bestemming gebruikt een ander inhoudsmodel. Het is niet mogelijk om te zetten van $1 naar $2.',
'imagenocrossnamespace' => 'Een mediabestand kan niet naar een andere naamruimte verplaatst worden',
'nonfile-cannot-move-to-file' => 'Het is niet mogelijk te hernoemen van en naar de bestandsnaamruimte',
'imagetypemismatch' => 'De nieuwe bestandsextensie is niet gelijk aan het bestandstype',
@@ -3066,6 +3093,7 @@ Een tijdelijke map is niet aanwezig.',
'import-error-interwiki' => 'De pagina "$1" is niet geïmporteerd omdat deze naam is gereserveerd voor externe koppelingen (interwiki).',
'import-error-special' => 'Pagina "$1" is niet geïmporteerd omdat deze is geplaatst in een speciale naamruimte waar geen pagina\'s in geplaatst kunnen worden.',
'import-error-invalid' => 'De pagina" "$1" is niet geïmporteerd omdat de naam ongeldig is.',
+'import-error-unserialize' => 'Versie $2 van de pagina "$1" kon niet verwerkt worden. De versie hoort contentmodel $3 te gebruiken met een serialisatie als $4.',
'import-options-wrong' => 'Verkeerde {{PLURAL:$2|optie|opties}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'De opgegeven basispagina is ongeldig.',
'import-rootpage-nosubpage' => 'In de naamruimte "$1" van de basispagina is het aanmaken van subpagina\'s niet mogelijk.',
@@ -3080,7 +3108,6 @@ Een tijdelijke map is niet aanwezig.',
# JavaScriptTest
'javascripttest' => 'JavaScript testen',
-'javascripttest-disabled' => 'Deze functie is uitgeschakeld in deze wiki.',
'javascripttest-title' => 'Tests uitvoeren voor $1',
'javascripttest-pagetext-noframework' => 'Deze pagina is gereserveerd voor het uitvoeren van JavaScripttesten.',
'javascripttest-pagetext-unknownframework' => 'Onbekend testframework "$1".',
@@ -3230,11 +3257,13 @@ Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.',
'pageinfo-default-sort' => 'Standaard sorteerwijze',
'pageinfo-length' => 'Paginalengte (in bytes)',
'pageinfo-article-id' => 'Paginanummer',
+'pageinfo-language' => 'Taal voor de pagina',
'pageinfo-robot-policy' => 'Status voor de zoekmachine',
'pageinfo-robot-index' => 'Indexeerbaar',
'pageinfo-robot-noindex' => 'Niet indexeerbaar',
'pageinfo-views' => 'Aantal weergaven',
'pageinfo-watchers' => 'Aantal paginavolgers',
+'pageinfo-few-watchers' => 'Minder dan {{PLURAL:$1|één volger|$1 volgers}}',
'pageinfo-redirects-name' => 'Doorverwijzingen naar deze pagina',
'pageinfo-subpages-name' => "Subpagina's van deze pagina",
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|doorverwijzing|doorverwijzingen}}; $3 {{PLURAL:$3|niet-doorverwijzing|niet-doorverwijzingen}})',
@@ -3249,6 +3278,19 @@ Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.',
'pageinfo-magic-words' => '{{PLURAL:$1|Magisch woord|Magische woorden}} ($1)',
'pageinfo-hidden-categories' => 'Verborgen {{PLURAL:$1|categorie|categorieën}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Gebruikt sjabloon|Gebruikte sjablonen}} ($1)',
+'pageinfo-transclusions' => "{{PLURAL:$1|Pagina|Pagina's}} getranscludeerd op ($1)",
+'pageinfo-toolboxlink' => 'Paginagegevens',
+'pageinfo-redirectsto' => 'Verwijst door naar',
+'pageinfo-redirectsto-info' => 'informatie',
+'pageinfo-contentpage' => 'Geteld als pagina met inhoud',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Beveiligingen werken vanaf hier door',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Pagina is beveiligd vanuit een andere pagina',
+'pageinfo-category-info' => 'Categoriegegevens',
+'pageinfo-category-pages' => "Aantal pagina's",
+'pageinfo-category-subcats' => 'Aantal subcategorieën',
+'pageinfo-category-files' => 'Aantal bestanden',
# Skin names
'skinname-standard' => 'Klassiek',
@@ -3271,6 +3313,8 @@ Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.',
'markedaspatrollederror' => 'Kan niet als gecontroleerd worden aangemerkt',
'markedaspatrollederrortext' => 'Selecteer een versie om als gecontroleerd aan te merken.',
'markedaspatrollederror-noautopatrol' => 'U kunt uw eigen wijzigingen niet als gecontroleerd markeren.',
+'markedaspatrollednotify' => 'Deze bewerking op $1 is gemarkeerd als gecontroleerd.',
+'markedaspatrollederrornotify' => 'Markeren als gecontroleerd mislukt.',
# Patrol log
'patrol-log-page' => 'Markeerlogboek',
@@ -3304,6 +3348,7 @@ $1',
'file-nohires' => 'Geen hogere resolutie beschikbaar.',
'svg-long-desc' => 'SVG-bestand, nominaal $1 × $2 pixels, bestandsgrootte: $3',
'svg-long-desc-animated' => 'Bewegend SVG-bestand, nominaal $1 × $2 pixels, bestandsgrootte: $3',
+'svg-long-error' => 'Ongeldig SVG-bestand: $1',
'show-big-image' => 'Volledige resolutie',
'show-big-image-preview' => 'Grootte van deze voorvertoning: $1.',
'show-big-image-other' => 'Andere {{PLURAL:$2|resolutie|resoluties}}: $1.',
@@ -3334,7 +3379,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minuut|$1 minuten}}',
'hours' => '{{PLURAL:$1|$1 uur|$1 uur}}',
'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
+'months' => '{{PLURAL:$1|één maand|$1 maanden}}',
+'years' => '{{PLURAL:$1|één jaar|$1 jaar}}',
'ago' => '$1 geleden',
+'just-now' => 'Daarnet',
# Bad image list
'bad_image_list' => "De opmaak is als volgt:
@@ -3831,6 +3879,7 @@ De bevestigingscode vervalt op $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-invoeging van sjablonen is uitgeschakeld]',
'scarytranscludefailed' => '[De sjabloon $1 kon niet opgehaald worden]',
+'scarytranscludefailed-httpstatus' => '[De sjabloon $1 kon niet opgehaald worden: HTTP $2]',
'scarytranscludetoolong' => '[De URL is te lang]',
# Delete conflict
@@ -3961,6 +4010,7 @@ U kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].',
'version-license' => 'Licentie',
'version-poweredby-credits' => "Deze wiki wordt aangedreven door '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'anderen',
+'version-credits-summary' => 'We erkennen graag de volgende personen voor hun bijdrage aan [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki is vrije software; u kunt MediaWiki verspreiden en/of aanpassen onder de voorwaarden van de GNU General Public License zoals gepubliceerd door de Free Software Foundation; ofwel versie 2 van de Licentie, of - naar uw wens - enige latere versie.
MediaWiki wordt verspreid in de hoop dat het nuttig is, maar ZONDER ENIGE GARANTIE; zonder zelfs de impliciete garantie van VERKOOPBAARHEID of GESCHIKTHEID VOOR ENIG DOEL IN HET BIJZONDER. Zie de GNU General Public License voor meer informatie.
@@ -4078,17 +4128,17 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
'sqlite-no-fts' => 'Versie $1 zonder ondersteuning voor "full-text" zoeken',
# New logging system
-'logentry-delete-delete' => '$1 heeft de pagina $3 verwijderd',
-'logentry-delete-restore' => '$1 heeft de pagina $3 teruggeplaatst',
-'logentry-delete-event' => '$1 heeft de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4',
-'logentry-delete-revision' => '$1 heeft de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4',
-'logentry-delete-event-legacy' => '$1 heeft de zichtbaarheid van logboekregels van $3 gewijzigd',
-'logentry-delete-revision-legacy' => '$1 heeft de zichtbaarheid van versies van de pagina $3 gewijzigd',
-'logentry-suppress-delete' => '$1 heeft de pagina $3 onderdrukt',
-'logentry-suppress-event' => '$1 heeft heimelijk de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4',
-'logentry-suppress-revision' => '$1 heeft heimelijk de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4',
-'logentry-suppress-event-legacy' => '$1 heeft heimelijk de zichtbaarheid van logboekregels van $3 gewijzigd',
-'logentry-suppress-revision-legacy' => '$1 heeft heimelijk de zichtbaarheid van versies van de pagina $3 gewijzigd.',
+'logentry-delete-delete' => '$1 {{GENDER:$2|heeft}} de pagina $3 verwijderd',
+'logentry-delete-restore' => '$1 {{GENDER:$2|heeft}} de pagina $3 teruggeplaatst',
+'logentry-delete-event' => '$1 {{GENDER:$2|heeft}} de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|heeft}} de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|heeft}} de zichtbaarheid van logboekregels van $3 gewijzigd',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|heeft}} de zichtbaarheid van versies van de pagina $3 gewijzigd',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|heeft}} de pagina $3 onderdrukt',
+'logentry-suppress-event' => '$1 {{GENDER:$2|heeft}} heimelijk de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|heeft}} heimelijk de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|heeft}} heimelijk de zichtbaarheid van logboekregels van $3 gewijzigd',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|heeft}} heimelijk de zichtbaarheid van versies van de pagina $3 gewijzigd.',
'revdelete-content-hid' => 'inhoud verborgen',
'revdelete-summary-hid' => 'bewerkingssamenvatting verborgen',
'revdelete-uname-hid' => 'gebruikersnaam verborgen',
@@ -4097,17 +4147,21 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
'revdelete-uname-unhid' => 'gebruikersnaam zichtbaar gemaakt',
'revdelete-restricted' => 'heeft beperkingen aan beheerders opgelegd',
'revdelete-unrestricted' => 'heeft beperkingen voor beheerders opgeheven',
-'logentry-move-move' => '$1 heeft pagina $3 naar $4 hernoemd',
-'logentry-move-move-noredirect' => '$1 heeft de pagina $3 hernoemd naar $4 zonder een doorverwijzing achter te laten',
-'logentry-move-move_redir' => '$1 heeft pagina $3 hernoemd naar $4 over een doorverwijzing',
-'logentry-move-move_redir-noredirect' => '$1 heeft pagina $3 naar $4 hernoemd over een doorverwijzing zonder een doorverwijzing achter te laten',
-'logentry-patrol-patrol' => '$1 heeft versie $4 van pagina $3 als gecontroleerd gemarkeerd',
-'logentry-patrol-patrol-auto' => '$1 heeft versie $4 van pagina $3 automatisch als gecontroleerd gemarkeerd',
-'logentry-newusers-newusers' => 'Gebruiker $1 is aangemaakt',
-'logentry-newusers-create' => 'Gebruiker $1 is aangemaakt',
-'logentry-newusers-create2' => 'Gebruiker $3 is aangemaakt door $1',
-'logentry-newusers-autocreate' => 'De gebruiker $1 is automatisch aangemaakt',
-'newuserlog-byemail' => 'wachtwoord is verzonden per e-mail',
+'logentry-move-move' => '$1 {{GENDER:$2|heeft}} pagina $3 hernoemd naar $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|heeft}} de pagina $3 hernoemd naar $4 zonder een doorverwijzing achter te laten',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|heeft}} pagina $3 hernoemd naar $4 over een doorverwijzing',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|heeft}} pagina $3 naar $4 hernoemd over een doorverwijzing zonder een doorverwijzing achter te laten',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|heeft}} versie $4 van pagina $3 gemarkeerd als gecontroleerd',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|heeft}} versie $4 van pagina $3 automatisch gemarkeerd als gecontroleerd',
+'logentry-newusers-newusers' => 'Gebruiker $1 {{GENDER:$2|is}} aangemaakt',
+'logentry-newusers-create' => 'Gebruiker $1 {{GENDER:$2|is}} aangemaakt',
+'logentry-newusers-create2' => 'Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1',
+'logentry-newusers-byemail' => 'Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1 en het wachtwoord is per e-mail verzonden',
+'logentry-newusers-autocreate' => 'De gebruiker $1 {{GENDER:$2|is}} automatisch aangemaakt',
+'logentry-rights-rights' => '$1 {{GENDER:$2|heeft}} groepslidmaatschap voor $3 gewijzigd van $4 naar $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|heeft}} het groepslidmaatschap gewijzigd voor $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|is}} automatisch gepromoveerd van $4 naar $5',
+'rightsnone' => '(geen)',
# Feedback
'feedback-bugornote' => 'Als u zover bent om een technisch probleem in detail te beschrijven, [$1 rapporteer dan een bug].
@@ -4161,6 +4215,7 @@ Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt
'api-error-ok-but-empty' => 'Interne fout: de server heeft geen gegevens teruggeleverd.',
'api-error-overwrite' => 'Het overschrijven van een bestand bestand is niet toegestaan.',
'api-error-stashfailed' => 'Interne fout: de server kon het tijdelijke bestand niet opslaan.',
+'api-error-publishfailed' => 'Interne fout: de server kon het tijdelijke bestand niet publiceren.',
'api-error-timeout' => 'De server heeft niet binnen de verwachte tijd geantwoord.',
'api-error-unclassified' => 'Er is een onbekende fout opgetreden',
'api-error-unknown-code' => 'Interne fout: "$1"',
@@ -4181,4 +4236,7 @@ Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt
'duration-centuries' => '$1 {{PLURAL:$1|eeuw|eeuwen}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+# Image rotation
+'rotate-comment' => 'Afbeelding gedraaid, $1 {{PLURAL:$1|graad|graden}} met de klok mee',
+
);
diff --git a/languages/messages/MessagesNl_informal.php b/languages/messages/MessagesNl_informal.php
index 5a4b4aa2..cd813fea 100644
--- a/languages/messages/MessagesNl_informal.php
+++ b/languages/messages/MessagesNl_informal.php
@@ -59,10 +59,9 @@ Gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaW
# Login and logout pages
'logouttext' => "'''Je bent nu afgemeld.'''
-Je kunt {{SITENAME}} nu anoniem gebruiken of weer [[Special:UserLogin|aanmelden]] als dezelfde of een andere gebruiker.
+Je kunt {{SITENAME}} nu anoniem gebruiken of weer <span class='plainlinks'>[$1 aanmelden]</span> als dezelfde of een andere gebruiker.
Mogelijk worden nog een aantal pagina's weergegeven alsof je aangemeld bent totdat je de cache van uw browser leegt.",
-'welcomecreation' => '== Welkom, $1! ==
-Je gebruiker is geregistreerd.
+'welcomecreation-msg' => 'Je gebruiker is aangemaakt.
Vergeet niet je [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te passen.',
'yourpasswordagain' => 'Geef je wachtwoord opnieuw in:',
'yourdomainname' => 'Je domein:',
@@ -148,6 +147,7 @@ Meld je aan en wijzig het wachtwoord nu. Als je dit verzoek niet zelf hebt gedaa
# Special:ChangeEmail
'changeemail-text' => 'Vul dit formulier in om je e-mailadres te wijzigen. Je moet je wachtwoord invoeren om deze wijziging te bevestigen.',
'changeemail-no-info' => 'Je moet aangemeld zijn om rechtstreeks toegang te hebben tot deze pagina.',
+'changeemail-password' => 'Jouw wachtwoord voor {{SITENAME}}:',
# Edit page toolbar
'sig_tip' => 'Je handtekening met datum en tijd',
@@ -475,11 +475,9 @@ Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden
'watcherrortext' => 'Er is een fout opgetreden tijdens het wijzigen van je volglijstinstellingen voor "$1".',
'enotif_lastvisited' => 'Zie $1 voor alle wijzigingen sinds je laatste bezoek.',
-'enotif_body' => 'Beste $WATCHINGUSERNAME,
+'enotif_body' => 'Hoi $WATCHINGUSERNAME,
-De pagina $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED op $PAGEEDITDATE door $PAGEEDITOR. Zie $PAGETITLE_URL voor de huidige versie.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Samenvatting van de wijziging: $PAGESUMMARY $PAGEMINOREDIT
diff --git a/languages/messages/MessagesNn.php b/languages/messages/MessagesNn.php
index 443764e9..acd7aeb0 100644
--- a/languages/messages/MessagesNn.php
+++ b/languages/messages/MessagesNn.php
@@ -19,6 +19,7 @@
* @author Guttorm Flatabø
* @author H92
* @author Harald Khan
+ * @author Jeblad
* @author Jon Harald Søby
* @author Jorunn
* @author Kaganer
@@ -448,6 +449,7 @@ $messages = array(
'newwindow' => '(vert opna i eit nytt vindauge)',
'cancel' => 'Avbryt',
'moredotdotdot' => 'Meir …',
+'morenotlisted' => 'Meir som ikkje er lista opp …',
'mypage' => 'Sida mi',
'mytalk' => 'Diskusjon',
'anontalk' => 'Diskusjonside for denne IP-adressa',
@@ -459,7 +461,6 @@ $messages = array(
'qbbrowse' => 'Bla gjennom',
'qbedit' => 'Endre',
'qbpageoptions' => 'Denne sida',
-'qbpageinfo' => 'Samanheng',
'qbmyoptions' => 'Sidene mine',
'qbspecialpages' => 'Spesialsider',
'faq' => 'OSS',
@@ -482,6 +483,7 @@ $messages = array(
'namespaces' => 'Namnerom',
'variants' => 'Variantar',
+'navigation-heading' => 'Navigasjonsmeny',
'errorpagetitle' => 'Feil',
'returnto' => 'Attende til $1.',
'tagline' => 'Frå {{SITENAME}}',
@@ -711,11 +713,11 @@ Administratoren som låste filsamlinga oppgav den fylgjande årsaka: «$3».',
# Login and logout pages
'logouttext' => "'''Du er no utlogga.'''
-Du kan no halde fram å bruke {{SITENAME}} anonymt, eller du kan [[Special:UserLogin|logge inn att]] med same kontoen eller ein annan brukar kan logge inn.
+Du kan no halde fram å bruke {{SITENAME}} anonymt, eller du kan <span class='plainlinks'>[$1 logge inn att]</span> med same kontoen eller ein annan brukar kan logge inn.
Ver merksam på at nokre sider framleis kan visast fram som om du er innlogga fram til du slettar mellomlageret til nettlesaren din.",
-'welcomecreation' => '== Hjarteleg velkommen til {{SITENAME}}, $1! ==
-Brukarkontoen din er oppretta.
-Hugs at du kan endre på [[Special:Preferences|innstillingane]] dine.',
+'welcomeuser' => 'Velkomen, $1!',
+'welcomecreation-msg' => 'Brukarkontoen din er oppretta.
+Gløym ikkje å endra [[Special:Preferences|innstillingane dine for {{SITENAME}}]].',
'yourname' => 'Brukarnamn:',
'yourpassword' => 'Passord:',
'yourpasswordagain' => 'Skriv opp att passordet',
@@ -738,7 +740,7 @@ Hugs at du kan endre på [[Special:Preferences|innstillingane]] dine.',
'gotaccount' => "Har du ein brukarkonto? '''$1'''.",
'gotaccountlink' => 'Logg inn',
'userlogin-resetlink' => 'Har du gløymd påloggingsopplysingane dine?',
-'createaccountmail' => 'over e-post',
+'createaccountmail' => 'Bruk eit mellombels tilfeldig passord og send det til e-postadressa som er oppgjeven under',
'createaccountreason' => 'Ã…rsak:',
'badretype' => 'Passorda du skreiv inn er ikkje like.',
'userexists' => 'Brukarnamnet er alt i bruk. Vel eit anna brukarnamn.',
@@ -801,6 +803,7 @@ Du kan sjå bort frå denne meldinga dersom kontoen vart oppretta med eit uhell.
# Email sending
'php-mail-error-unknown' => 'Ukjend feil i PHPs mail()-funksjon',
'user-mail-no-addy' => '↓Prøvde å senda e-post utan e-postadresse',
+'user-mail-no-body' => 'Freista å senda e-post med tom eller urimeleg stutt brødtekst.',
# Change password dialog
'resetpass' => 'Endra passord',
@@ -858,6 +861,7 @@ Mellombels passord: $2',
'changeemail-oldemail' => '↓Noverande e-postadresse:',
'changeemail-newemail' => 'Ny e-postadresse:',
'changeemail-none' => '↓(ingen)',
+'changeemail-password' => '{{SITENAME}}-passordet ditt:',
'changeemail-submit' => '↓Endre e-post',
'changeemail-cancel' => '↓Avbryt',
@@ -1028,7 +1032,6 @@ Det siste loggelementet er oppgjeve under som referanse:",
'template-semiprotected' => '(delvis verna)',
'hiddencategories' => 'Denne sida er med i {{PLURAL:$1|éin gøymd kategori|$1 gøymde kategoriar}}:',
'edittools' => '<!-- Teksten her vert vist mellom tekstboksen og «Lagre»-knappen når ein endrar ei side. -->',
-'nocreatetitle' => 'Avgrensa sideoppretting',
'nocreatetext' => '{{SITENAME}} har avgrensa tilgang til å opprette nye sider.
Du kan gå attende og endre ei eksisterande side, [[Special:UserLogin|logge inn eller opprette ein brukarkonto]].',
'nocreate-loggedin' => 'Du har ikkje tilgang til å opprette nye sider.',
@@ -1050,6 +1053,15 @@ Det ser ut til at ho er sletta.',
'edit-no-change' => 'Redigeringa di vart ignorert fordi det ikkje vart gjort endringar i teksten.',
'edit-already-exists' => 'Kunne ikkje opprette ny side fordi ho alt eksisterer.',
'defaultmessagetext' => 'Standard meldingstekst',
+'content-failed-to-parse' => 'Klarte ikkje å tolke innhaldet «$2» for innhaldsmodellen «$1»: $3',
+'invalid-content-data' => 'Ugyldig innhald',
+'content-not-allowed-here' => 'Innhaldsmodellen «$1» er ikkje tillaten på sida [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'WikiTekst',
+'content-model-text' => 'Rein tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Ã…tvaring: Denne sida inneheld for mange prosesskrevande parserfunksjonar.
@@ -1412,9 +1424,9 @@ Dette kan ikkje tilbakestillast.',
'prefs-emailconfirm-label' => 'Stadfesting av e-post:',
'prefs-textboxsize' => 'Storleiken til redigeringsvindauga',
'youremail' => 'E-post:',
-'username' => 'Brukarnamn:',
-'uid' => 'Brukar-ID:',
-'prefs-memberingroups' => 'Medlem av {{PLURAL:$1|denne gruppa|desse gruppene}}:',
+'username' => '{{GENDER:$1|Brukarnamn}}:',
+'uid' => '{{GENDER:$1|Brukar-ID}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Medlem}} av {{PLURAL:$1|gruppa|gruppene}}:',
'prefs-registration' => 'Registreringstid:',
'yourrealname' => 'Verkeleg namn:',
'yourlanguage' => 'Språk:',
@@ -1561,12 +1573,13 @@ Dette kan ikkje tilbakestillast.',
'right-sendemail' => 'Senda e-post til andre brukarar',
'right-passwordreset' => 'Sjå e-postar for passord som er stilte attende',
+# Special:Log/newusers
+'newuserlogpage' => 'Brukaropprettingslogg',
+'newuserlogpagetext' => 'Dette er ein logg over oppretta brukarkontoar.',
+
# User rights log
'rightslog' => 'Brukartilgangslogg',
'rightslogtext' => 'Dette er ein logg over endringar av brukartilgang.',
-'rightslogentry' => 'endra brukartilgangen til $1 frå $2 til $3',
-'rightslogentry-autopromote' => '↓vart automatisk forfremja frå $2 til $3',
-'rightsnone' => '(ingen)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'sjå denne sida',
@@ -1799,6 +1812,7 @@ $1',
'backend-fail-notsame' => 'Ein ikkje-identisk fil finst alt på «$1».',
'backend-fail-invalidpath' => '$1 er ikkje ein gyldig lagringsstig.',
'backend-fail-delete' => 'Kunne ikkje sletta fila «$1».',
+'backend-fail-describe' => 'Kunne ikkje endra metadataa for fila «$1».',
'backend-fail-alreadyexists' => 'Fila $1 finst frå før.',
'backend-fail-store' => 'Kunne ikkje lagra fila «$1» på «$2».',
'backend-fail-copy' => 'Kunne ikkje kopiera fila «$1» til «$2».',
@@ -2031,6 +2045,12 @@ Du vil kan henda endra skildringa på [$2 filskildringssida] hennar der.',
Dei bør kan henda lenkja til ei meir passande side i staden.<br />
Ei side vert handsama som ei fleirtydingsside om ho nyttar ein mal som er lenkja til frå [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Sider med ein sideeigenskap',
+'pageswithprop-legend' => 'Sider med ein sideeigenskap',
+'pageswithprop-text' => 'Denne sida listar opp sider som nyttar ein viss sideeigenskap.',
+'pageswithprop-prop' => 'Namn på eigenskap:',
+'pageswithprop-submit' => 'GÃ¥',
+
'doubleredirects' => 'Doble omdirigeringar',
'doubleredirectstext' => 'Kvar line inneheld lenkjer til den første og den andre omdirigeringa, og den første lina frå den andre omdirigeringsteksten. Det gjev som regel den «rette» målartikkelen, som den første omdirigeringa skulle ha peikt på. <del>Overstrykne</del> liner har vorte retta på.',
'double-redirect-fixed-move' => '[[$1]] har blitt flytta, og er no ei omdirigering til [[$2]]',
@@ -2180,7 +2200,7 @@ Sjå òg [[Special:WantedCategories|ønska kategoriar]].',
'linksearch-ok' => 'Søk',
'linksearch-text' => 'Jokerteikn som «*.wikipedia.org» kan nyttast.
Det er påkravt med eit toppnivådomene, til dømes «*.org».<br />
-Støtta protokollar: <code>$1</code> (nyttar http:// som standard om ingen protokoll er oppgjeven)',
+{{PLURAL:$2|Stødd protokoll|Stødde protokollar}}: <code>$1</code> (nyttar http:// som standard om ingen protokoll er oppgjeven)',
'linksearch-line' => '$2 lenkjer til $1',
'linksearch-error' => 'Jokerteikn kan berre nyttast føre tenarnamnet.',
@@ -2199,10 +2219,6 @@ Støtta protokollar: <code>$1</code> (nyttar http:// som standard om ingen proto
'activeusers-hidesysops' => 'Skjul administratorar',
'activeusers-noresult' => 'Ingen brukarar funne.',
-# Special:Log/newusers
-'newuserlogpage' => 'Brukaropprettingslogg',
-'newuserlogpagetext' => 'Dette er ein logg over oppretta brukarkontoar.',
-
# Special:ListGroupRights
'listgrouprights' => 'Rettar for brukargrupper',
'listgrouprights-summary' => 'Detter ei liste som viser brukargruppene som er definerte på wikien, og kva rettar dei har. Det kan finnast [[{{MediaWiki:Listgrouprights-helppage}}|meir informasjon]] om dei ulike rettane.',
@@ -2295,20 +2311,23 @@ E-postadressa du har sett i [[Special:Preferences|innstillingane dine]] vil dukk
'enotif_mailer' => '{{SITENAME}}-endringsmeldingssendar',
'enotif_reset' => 'Merk alle sidene som vitja',
-'enotif_newpagetext' => 'Dette er ei ny side.',
'enotif_impersonal_salutation' => '{{SITENAME}}-brukar',
-'changed' => 'endra',
-'created' => 'oppretta',
-'enotif_subject' => '{{SITENAME}}-sida $PAGETITLE har vorte $CHANGEDORCREATED av $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}}-sida $1 har vorte sletta av {{gender:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}}-sida $1 har vorte oppretta av {{gender:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}}-sida $1 har vorte flytta av {{gender:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}}-sida $1 har vorte attoppretta av {{gender:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}}-sida $1 har vorte endra av {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => '{{SITENAME}}-sida $1 vart sletta $PAGEEDITDATE av {{gender:$2|$2}}, sjå $3.',
+'enotif_body_intro_created' => '{{SITENAME}}-sida $1 vart oppretta $PAGEEDITDATE av {{gender:$2|$2}}, sjå $3 for den gjeldande versjonen.',
+'enotif_body_intro_moved' => '{{SITENAME}}-sida $1 vart flytt $PAGEEDITDATE av {{gender:$2|$2}}, sjå $3 for den gjeldande versjonen.',
+'enotif_body_intro_restored' => '{{SITENAME}}-sida $1 vart attoppretta $PAGEEDITDATE av {{gender:$2|$2}}, sjå $3 for den gjeldande versjonen.',
+'enotif_body_intro_changed' => '{{SITENAME}}-sida $1 vart endra $PAGEEDITDATE av {{gender:$2|$2}}, sjå $3 for den gjeldande versjonen.',
'enotif_lastvisited' => 'Sjå $1 for alle endringane sidan siste vitjing.',
'enotif_lastdiff' => 'Sjå $1 for å sjå denne endringa.',
'enotif_anon_editor' => 'anonym brukar $1',
'enotif_body' => 'Kjære $WATCHINGUSERNAME,
-
-{{SITENAME}}-sida $PAGETITLE er vorten $CHANGEDORCREATED $PAGEEDITDATE av $PAGEEDITOR, sjå $PAGETITLE_URL for den gjeldande versjonen.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Endringssamandraget var: $PAGESUMMARY $PAGEMINOREDIT
@@ -2316,8 +2335,7 @@ Kontakt brukaren:
e-post: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Du får ikkje fleire endringsvarsel minder du vitjar sida på nytt.
-Du kan dessutan nullstilla varselflagga for alle sidene på overvakingslista di.
+Du får ikkje fleire endringsvarsel før du vitjar sida på nytt. Du kan dessutan nullstilla varselflagga for alle sidene på overvakingslista di.
Helsing det venlege meldingssystemet ditt for {{SITENAME}}
@@ -2328,11 +2346,13 @@ For å endra innstillingane dine for e-postvarsling, vitja
For å endra innstillingane for overvakingslista di, vitja
{{canonicalurl:{{#special:EditWatchlist}}}}
-For å fjerna sita frå overvakingslista di, vitja
+For å fjerna sida frå overvakingslista di, vitja
$UNWATCHURL
Attendemelding og hjelp:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'oppretta',
+'changed' => 'endra',
# Delete
'deletepage' => 'Slett sida',
@@ -2396,6 +2416,8 @@ Sjå [[Special:ProtectedPages|lista over verna sider]] for lista over vern som n
'prot_1movedto2' => '«[[$1]]» flytt til «[[$2]]»',
'protect-badnamespace-title' => 'Namnerommet kan ikkje vernast',
'protect-badnamespace-text' => 'Sider i dette namnerommet kan ikkje vernast.',
+'protect-norestrictiontypes-text' => 'Sida kan ikkje vernast sidan det ikkje finst tilgjengelege restriksjonstypar.',
+'protect-norestrictiontypes-title' => 'Side som ikkje kan vernast',
'protect-legend' => 'Stadfest vern',
'protectcomment' => 'Grunngjeving:',
'protectexpiry' => 'Endar:',
@@ -2474,7 +2496,8 @@ Innhaldet i dei sletta versjonane er berre tilgjengeleg for administratorar.',
'undeletedrevisions' => '{{PLURAL:$1|Éin versjon|$1 versjonar}} attoppretta.',
'undeletedrevisions-files' => '{{PLURAL:$1|Éin versjon|$1 versjonar}} og {{PLURAL:$2|éi fil|$2 filer}} er attoppretta',
'undeletedfiles' => '{{PLURAL:$1|Éi fil|$1 filer}} er attoppretta',
-'cannotundelete' => 'Feil ved attoppretting, andre kan allereie ha attoppretta sida.',
+'cannotundelete' => 'Attopprettinga gjekk ikkje:
+$1',
'undeletedpage' => "'''$1 er attoppretta'''
Sjå [[Special:Log/delete|sletteloggen]] for eit oversyn over sider som nyleg er sletta eller attoppretta.",
@@ -2505,7 +2528,7 @@ $1',
'blanknamespace' => '(hovud)',
# Contributions
-'contributions' => 'Brukarbidrag',
+'contributions' => '{{GENDER:$1|Brukarbidrag}}',
'contributions-title' => 'Bidrag av $1',
'mycontris' => 'Bidrag',
'contribsub2' => 'For $1 ($2)',
@@ -2762,6 +2785,7 @@ Målsida «[[:$1]]» finst allereie. Vil du slette ho for å gje rom for flyttin
'immobile-target-namespace-iw' => 'Interwikilenkja er ikkje eit gyldig mål for flytting av sider.',
'immobile-source-page' => 'Denne sida kan ikkje flyttast.',
'immobile-target-page' => 'Kan ikkje flytte til det målnamnet.',
+'bad-target-model' => 'Det ynskte målet nyttar ein annan innhaldsmodell. Kan ikkje konvertera frå $1 til $2.',
'imagenocrossnamespace' => 'Kan ikkje flytte bilete til andre namnerom enn biletnamnerommet',
'nonfile-cannot-move-to-file' => 'Kan ikkje flytta ikkje-filer til filnamnerommet.',
'imagetypemismatch' => 'Den nye filendinga høver ikkje til filtypen',
@@ -2871,6 +2895,7 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
'import-error-interwiki' => 'Sida «$1» vart ikkje importert sidan namnet hennar er reservert for ekstern lenking (interwiki).',
'import-error-special' => 'Sida «$1» vart ikkje importert sidan ho høyrer til eit spesialnamnerom som ikkje tillèt sider.',
'import-error-invalid' => 'Sida «$1» vart ikkje importert sidan namnet er ugildt.',
+'import-error-unserialize' => 'Versjonen $2 av sida «$1» kunne ikkje avserialiserast. Versjonen var rapportert å nytta innhaldsmodellen $3 serialisert som $4.',
'import-options-wrong' => '{{PLURAL:$2|Galt val|Gale val}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Den oppgjevne rotsida er ein ugild tittel',
'import-rootpage-nosubpage' => 'Namnerommet «$1» til rotsida tillèt ikkje undersider.',
@@ -2885,7 +2910,6 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
# JavaScriptTest
'javascripttest' => 'JavaScript-utrøyning',
-'javascripttest-disabled' => 'Funksjonen er ikkje påslegen på wikien.',
'javascripttest-title' => 'Køyrer $1-utrøyningar',
'javascripttest-pagetext-noframework' => 'Sida er reservert for køyring av JavaScript-utrøyningar.',
'javascripttest-pagetext-unknownframework' => 'Ukjent utrøyningsrammeverk: «$1».',
@@ -3022,11 +3046,13 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
'pageinfo-default-sort' => 'Standard sorteringsnykel',
'pageinfo-length' => 'Sidelengd (i byte)',
'pageinfo-article-id' => 'Side-ID',
+'pageinfo-language' => 'Sideinnhaldsspråk',
'pageinfo-robot-policy' => 'Søkjemotorstode',
'pageinfo-robot-index' => 'Kan indekserast',
'pageinfo-robot-noindex' => 'Kan ikkje indekserast',
'pageinfo-views' => 'Tal på visningar',
'pageinfo-watchers' => 'Tal på overvakarar av sida',
+'pageinfo-few-watchers' => 'Færre enn $1 {{PLURAL:$1|som overvakar}}',
'pageinfo-redirects-name' => 'Omdirigeringar til sida',
'pageinfo-subpages-name' => 'Undersider av sida',
'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|éi omdirigering|$2 omdirigeringar}}; {{PLURAL:$3|éi ikkje-omdirigering|$3 ikkje-omdirigeringar}})',
@@ -3041,6 +3067,19 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
'pageinfo-magic-words' => '{{PLURAL:$1|Trylleord}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Løynd kategori|Løynde kategoriar}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Inkludert mal|Inkluderte malar}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Side inkludert|Sider inkluderte}} på ($1)',
+'pageinfo-toolboxlink' => 'Sideinformasjon',
+'pageinfo-redirectsto' => 'Omdirigerer til',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Tald som ei innhaldsside',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Djupvern byrjar her',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Djupvern byrjar i',
+'pageinfo-category-info' => 'Kategoriinformasjon',
+'pageinfo-category-pages' => 'Tal sider',
+'pageinfo-category-subcats' => 'Tal underkategoriar',
+'pageinfo-category-files' => 'Tal filer',
# Skin names
'skinname-standard' => 'Klassisk',
@@ -3062,6 +3101,8 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
'markedaspatrollederror' => 'Kan ikkje merke sida som patruljert',
'markedaspatrollederrortext' => 'Du må markere ein versjon for å kunne godkjenne.',
'markedaspatrollederror-noautopatrol' => 'Ein har ikkje høve til å merkje sine eigne endringar som godkjende.',
+'markedaspatrollednotify' => 'Denne endringa på $1 har vorte merkt som patruljert.',
+'markedaspatrollederrornotify' => 'Det gjekk ikkje å merkja endringa som patruljert.',
# Patrol log
'patrol-log-page' => 'Patruljeringslogg',
@@ -3094,6 +3135,7 @@ $1',
'file-nohires' => 'Høgare oppløysing er ikkje tilgjengeleg.',
'svg-long-desc' => 'SVG-fil, standardoppløysing: $1 × $2 pikslar, filstorleik: $3',
'svg-long-desc-animated' => 'Animert SVG-fil, standardoppløysing $1 × $2 pikslar, filstorleik: $3',
+'svg-long-error' => 'Ugild SVG-fil: $1',
'show-big-image' => 'Full oppløysing',
'show-big-image-preview' => 'Storleik på førehandsvising: $1.',
'show-big-image-other' => '{{PLURAL:$2|Anna oppløysing|Andre oppløysingar}}: $1.',
@@ -3123,7 +3165,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 minutt|$1 minutt}}',
'hours' => '{{PLURAL:$1|$1 time|$1 timar}}',
'days' => '{{PLURAL:$1|$1 dag|$1 dagar}}',
+'months' => '{{PLURAL:$1|éin månad|$1 månader}}',
+'years' => '{{PLURAL:$1|éitt år|$1 år}}',
'ago' => '$1 sidan',
+'just-now' => 'akkurat no',
# Bad image list
'bad_image_list' => 'Formatet er slik:
@@ -3618,6 +3663,7 @@ Denne stadfestingskoden vert forelda $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-tilkopling er slått av]',
'scarytranscludefailed' => '[Henting av mal for $1 gjekk ikkje]',
+'scarytranscludefailed-httpstatus' => '[Henting av mal for $1 gjekk ikkje: HTTP $2]',
'scarytranscludetoolong' => '[URL-en er for lang]',
# Delete conflict
@@ -3727,6 +3773,7 @@ Du kan òg [[Special:EditWatchlist|nytte standardverktøyet]].',
'version-license' => 'Lisens',
'version-poweredby-credits' => "Denne wikien er driven av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'andre',
+'version-credits-summary' => 'Me ynskjer godskriva desse personane for tilskotet deira til [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki er fri programvare; du kan redistribuera det og/eller modifisera det under krava i GNU General Public License som publisert av Free Software Foundation; anten versjon 2 av lisensen, eller (om du ynskjer det) ein kvar seinare versjon.
MediaWiki er distribuert i håp om at det vil vera nyttig, men UTAN NOKON GARANTI; ikkje eingong ein implisitt garanti for at det KAN SELJAST eller at det EIGNAR SEG TIL EIT VISST FØREMÅL. Sjå GNU General Public License for fleire detaljar.
@@ -3840,17 +3887,17 @@ Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei t
'sqlite-no-fts' => '$1 utan støtte for fulltekstsøk',
# New logging system
-'logentry-delete-delete' => '$1 sletta sida $3',
-'logentry-delete-restore' => '$1 attoppretta sida $3',
-'logentry-delete-event' => '$1 endra synlegdomen av {{PLURAL:$5|éi loggoppføring|$5 loggoppføringar}} på $3: $4',
-'logentry-delete-revision' => '$1 endra synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
-'logentry-delete-event-legacy' => '$1 endra synlegdomen til loggoppføringar på $3',
-'logentry-delete-revision-legacy' => '$1 endra synlegdomen til versjonar på sida $3',
-'logentry-suppress-delete' => '$1 gøymde sida $3',
-'logentry-suppress-event' => '$1 endra i løyndom synlegdomen til {{PLURAL:$5|éi logghending|$5 logghendingar}} på $3: $4',
-'logentry-suppress-revision' => '$1 endra i løyndom synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
-'logentry-suppress-event-legacy' => '$1 endra i løyndom synlegdomen til logghendingar på $3',
-'logentry-suppress-revision-legacy' => '$1 endra i løyndom synlegdomen til versjonar på sida $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|sletta}} sida $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|attoppretta}} sida $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|endra}} synlegdomen av {{PLURAL:$5|éi loggoppføring|$5 loggoppføringar}} på $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|endra}} synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|endra}} synlegdomen til loggoppføringar på $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|endra}} synlegdomen til versjonar på sida $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|løynde}} sida $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|endra}} i løyndom synlegdomen til {{PLURAL:$5|éi logghending|$5 logghendingar}} på $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|endra}} i løyndom synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|endra}} i løyndom synlegdomen til logghendingar på $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|endra}} i løyndom synlegdomen til versjonar på sida $3',
'revdelete-content-hid' => 'innhald gøymt',
'revdelete-summary-hid' => 'endringsamandrag gøymt',
'revdelete-uname-hid' => 'brukarnamn gøymt',
@@ -3859,17 +3906,21 @@ Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei t
'revdelete-uname-unhid' => 'brukarnamn gjort synleg',
'revdelete-restricted' => 'la til avgrensingar for administratorar',
'revdelete-unrestricted' => 'fjerna avgrensingar for administratorar',
-'logentry-move-move' => '$1 flytte sida $3 til $4',
-'logentry-move-move-noredirect' => '$1 flytte sida $3 til $4 utan å lata etter ei omdirigering',
-'logentry-move-move_redir' => '$1 flytte sida $3 til $4 over ei omdirigering',
-'logentry-move-move_redir-noredirect' => '$1 flytte sida $3 til $4 over ei omdirigering utan å lata etter ei omdirigering',
-'logentry-patrol-patrol' => '$1 merkte versjon $4 av sida $3 som patruljert',
-'logentry-patrol-patrol-auto' => '$1 merkte automatisk versjon $4 av sida $3 som patruljert',
-'logentry-newusers-newusers' => 'Brukarkontoen $1 vart oppretta',
-'logentry-newusers-create' => 'Brukarkontoen $1 vart oppretta',
-'logentry-newusers-create2' => 'Brukarkontoen $3 vart oppretta av $1',
-'logentry-newusers-autocreate' => 'Kontoen $1 vart oppretta av seg sjølv',
-'newuserlog-byemail' => 'passordet er sendt på e-post',
+'logentry-move-move' => '$1 {{GENDER:$2|flytte}} sida $3 til $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|flytte}} sida $3 til $4 utan å lata etter ei omdirigering',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|flytte}} sida $3 til $4 over ei omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|flytte}} sida $3 til $4 over ei omdirigering utan å lata etter ei omdirigering',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|merkte}} versjon $4 av sida $3 som patruljert',
+'logentry-patrol-patrol-auto' => '$1{{GENDER:$2| merkte}} automatisk versjon $4 av sida $3 som patruljert',
+'logentry-newusers-newusers' => 'Brukarkontoen $1 vart {{GENDER:$2|oppretta}}',
+'logentry-newusers-create' => 'Brukarkontoen $1 vart {{GENDER:$2|oppretta}}',
+'logentry-newusers-create2' => 'Brukarkontoen $3 vart {{GENDER:$2|oppretta}} av $1',
+'logentry-newusers-byemail' => 'Brukarkontoen $3 vart {{GENDER:$2|oppretta}} av $1 og passord vart sendt med e-post',
+'logentry-newusers-autocreate' => 'Brukarkontoen $1 vart {{GENDER:$2|oppretta}} av seg sjølv',
+'logentry-rights-rights' => '$1 {{GENDER:$2|endra}} gruppemedlemskap for $3 frå $4 til $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|endra}} gruppemedlemskap for $3',
+'logentry-rights-autopromote' => '$1 vart automatisk {{GENDER:$2|forfremja}} frå $4 til $5',
+'rightsnone' => '(ingen)',
# Feedback
'feedback-bugornote' => 'Er du klar til å skildra ein teknisk vanske i detalj, gjer vel å [$1 rapportera inn ein feil].
@@ -3923,6 +3974,7 @@ Om ikkje kan du nytta det enkle skjemaet under. Merknaden din vert lagd til på
'api-error-ok-but-empty' => 'Intern feil: ikkje noko svar frå tenaren.',
'api-error-overwrite' => 'Det er ikkje tillate å skriva over filer som alt finst.',
'api-error-stashfailed' => 'Intern feil: tenaren greidde ikkje å lagra ei mellombels fil.',
+'api-error-publishfailed' => 'Intern feil: tenaren greidde ikkje å publisera mellombels fil.',
'api-error-timeout' => 'Tenaren svara ikkje innan tida svar var venta.',
'api-error-unclassified' => 'Det oppstod ein ukjend feil.',
'api-error-unknown-code' => 'Ukjend feil: «$1»',
@@ -3943,4 +3995,7 @@ Om ikkje kan du nytta det enkle skjemaet under. Merknaden din vert lagd til på
'duration-centuries' => '$1 {{PLURAL:$1|hundreår|hundreår}}',
'duration-millennia' => '$1 {{PLURAL:$1|tusenår|tusenår}}',
+# Image rotation
+'rotate-comment' => 'Biletet vart dreitt $1{{PLURAL:$1|°}} med klokka',
+
);
diff --git a/languages/messages/MessagesNo.php b/languages/messages/MessagesNo.php
deleted file mode 100644
index ca3f1b80..00000000
--- a/languages/messages/MessagesNo.php
+++ /dev/null
@@ -1,3407 +0,0 @@
-<?php
-/** Norwegian (bokmål)‬ (‪norsk (bokmål)‬)
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
- *
- * @ingroup Language
- * @file
- *
- * @author Jeblad
- */
-
-$fallback = 'nb';
-
-$messages = array(
-# User preference toggles
-'tog-underline' => 'Strek under lenker:',
-'tog-justify' => 'Blokkjusterte avsnitt',
-'tog-hideminor' => 'Skjul mindre redigeringer i siste endringer',
-'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' => 'Forbedret siste endringer (krever JavaScript)',
-'tog-numberheadings' => 'Autonummerer overskrifter',
-'tog-showtoolbar' => 'Vis verktøylinje (JavaScript)',
-'tog-editondblclick' => 'Rediger sider ved å dobbeltklikke (JavaScript)',
-'tog-editsection' => 'Rediger avsnitt ved hjelp av [rediger]-lenke',
-'tog-editsectiononrightclick' => 'Rediger avsnitt ved å høyreklikke på avsnittsoverskrift (JavaScript)',
-'tog-showtoc' => 'Vis innholdsfortegnelse (for sider med flere enn tre avsnitt)',
-'tog-rememberpassword' => 'Husk meg i denne nettleseren (i høyst $1 {{PLURAL:$1|dag|dager}})',
-'tog-watchcreations' => 'Overvåk sider jeg oppretter',
-'tog-watchdefault' => 'Overvåk alle sider jeg redigerer',
-'tog-watchmoves' => 'Overvåk sider jeg flytter',
-'tog-watchdeletion' => 'Overvåk sider jeg sletter',
-'tog-minordefault' => 'Merk i utgangspunktet alle redigeringer som mindre',
-'tog-previewontop' => 'Flytt forhåndsvisningen foran redigeringsboksen',
-'tog-previewonfirst' => 'Bruk forhåndsvisning ved første redigering av en side',
-'tog-nocache' => 'Deaktiver nettlesermellomlagring av sider («caching»)',
-'tog-enotifwatchlistpages' => 'Send meg en e-post når sider på overvåkningslisten blir endret',
-'tog-enotifusertalkpages' => 'Send meg en e-post ved endringer av brukerdiskusjonssiden min',
-'tog-enotifminoredits' => 'Send meg en e-post også ved mindre sideendringer',
-'tog-enotifrevealaddr' => 'Vis min e-postadresse i utgående meldinger',
-'tog-shownumberswatching' => 'Vis antall overvåkende brukere',
-'tog-oldsig' => 'Nåværende signatur:',
-'tog-fancysig' => 'Signatur som wikitekst uten automatisk lenke',
-'tog-externaleditor' => 'Bruk ekstern behandler som standard (kun for viderekomne, krever spesielle innstillinger på din datamaskin. [//www.mediawiki.org/wiki/Manual:External_editors Mer informasjon.])',
-'tog-externaldiff' => 'Bruk ekstern differanse som standard (kun for viderekomne, krever spesielle innstillinger på din datamaskin. [//www.mediawiki.org/wiki/Manual:External_editors Mer informasjon.])',
-'tog-showjumplinks' => 'Slå på «gå til»-lenker',
-'tog-uselivepreview' => 'Bruk levende forhåndsvisning (eksperimentell JavaScript)',
-'tog-forceeditsummary' => 'Advar meg når jeg ikke gir noen redigeringsforklaring',
-'tog-watchlisthideown' => 'Skjul egne endringer fra overvåkningslisten',
-'tog-watchlisthidebots' => 'Skjul robotendringer fra overvåkningslisten',
-'tog-watchlisthideminor' => 'Skjul mindre endringer fra overvåkningslisten',
-'tog-watchlisthideliu' => 'Skjul endringer av innloggede brukere fra overvåkningslisten',
-'tog-watchlisthideanons' => 'Skjul endringer av anonyme brukere fra overvåkningslisten',
-'tog-watchlisthidepatrolled' => 'Skjul patruljerte endringer fra overvåkningslisten',
-'tog-nolangconversion' => 'Slå av variantkonvertering',
-'tog-ccmeonemails' => 'Send meg kopier av e-poster jeg sender til andre brukere',
-'tog-diffonly' => 'Ikke vis sideinnhold under differ',
-'tog-showhiddencats' => 'Vis skjulte kategorier',
-'tog-norollbackdiff' => 'Ikke vis diff etter tilbakestilling',
-
-'underline-always' => 'Alltid',
-'underline-never' => 'Aldri',
-'underline-default' => 'Bruk nettleserstandard',
-
-# Font style option in Special:Preferences
-'editfont-style' => 'Endre stilen for skrifttypen i området:',
-'editfont-default' => 'Nettleserstandard',
-'editfont-monospace' => 'Skrift med fast bredde',
-'editfont-sansserif' => 'Sans-serif',
-'editfont-serif' => 'Serif',
-
-# Dates
-'sunday' => 'søndag',
-'monday' => 'mandag',
-'tuesday' => 'tirsdag',
-'wednesday' => 'onsdag',
-'thursday' => 'torsdag',
-'friday' => 'fredag',
-'saturday' => 'lørdag',
-'sun' => 'søn',
-'mon' => 'man',
-'tue' => 'tir',
-'wed' => 'ons',
-'thu' => 'tor',
-'fri' => 'fre',
-'sat' => 'lør',
-'january' => 'januar',
-'february' => 'februar',
-'march' => 'mars',
-'april' => 'april',
-'may_long' => 'mai',
-'june' => 'juni',
-'july' => 'juli',
-'august' => 'august',
-'september' => 'september',
-'october' => 'oktober',
-'november' => 'november',
-'december' => 'desember',
-'january-gen' => 'januar',
-'february-gen' => 'februar',
-'march-gen' => 'mars',
-'april-gen' => 'april',
-'may-gen' => 'mai',
-'june-gen' => 'juni',
-'july-gen' => 'juli',
-'august-gen' => 'august',
-'september-gen' => 'september',
-'october-gen' => 'oktober',
-'november-gen' => 'november',
-'december-gen' => 'desember',
-'jan' => 'jan',
-'feb' => 'feb',
-'mar' => 'mar',
-'apr' => 'apr',
-'may' => 'mai',
-'jun' => 'jun',
-'jul' => 'jul',
-'aug' => 'aug',
-'sep' => 'sep',
-'oct' => 'okt',
-'nov' => 'nov',
-'dec' => 'des',
-
-# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategori|Kategorier}}',
-'category_header' => 'Sider i kategorien «$1»',
-'subcategories' => 'Underkategorier',
-'category-media-header' => 'Filer i kategorien «$1»',
-'category-empty' => "''Denne kategorien inneholder for tiden ingen artikler eller filer.''",
-'hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}}',
-'hidden-category-category' => 'Skjulte kategorier',
-'category-subcat-count' => '{{PLURAL:$2|Denne kategorien har kun den følgende underkategorien.|Denne kategorien har følgende {{PLURAL:$1|underkategori|$1 underkategorier}}, av totalt $2.}}',
-'category-subcat-count-limited' => 'Kategorien har følgende {{PLURAL:$1|underkategori|$1 underkategorier}}.',
-'category-article-count' => '{{PLURAL:$2|Denne kategorien inneholder kun den følgende siden.|Følgende {{PLURAL:$1|side|$1 sider}} er i denne kategorien, av totalt $2.}}',
-'category-article-count-limited' => 'Følgende {{PLURAL:$1|side|$1 sider}} er i denne kategorien.',
-'category-file-count' => '{{PLURAL:$2|Denne kategorien inneholder kun den følgende filen.|Følgende {{PLURAL:$1|fil|$1 filer}} er i denne kategorien, av totalt $2.}}',
-'category-file-count-limited' => 'Følgende {{PLURAL:$1|fil|$1 filer}} er i denne kategorien.',
-'listingcontinuesabbrev' => 'forts.',
-'index-category' => 'Indekserte sider',
-'noindex-category' => 'Ikke-indekserte sider',
-'broken-file-category' => 'Sider med brutte fillenker',
-
-'about' => 'Om',
-'article' => 'Innholdsside',
-'newwindow' => '(Ã¥pnes i et nytt vindu)',
-'cancel' => 'Avbryt',
-'moredotdotdot' => 'Mer …',
-'mypage' => 'Min side',
-'mytalk' => 'Min diskusjonsside',
-'anontalk' => 'Brukerdiskusjon for denne IP-adressen',
-'navigation' => 'Navigasjon',
-'and' => '&#32;og',
-
-# Cologne Blue skin
-'qbfind' => 'Finn',
-'qbbrowse' => 'Bla gjennom',
-'qbedit' => 'Rediger',
-'qbpageoptions' => 'Sideinnstillinger',
-'qbpageinfo' => 'Sideinformasjon',
-'qbmyoptions' => 'Egne innstillinger',
-'qbspecialpages' => 'Spesialsider',
-'faq' => 'Ofte stilte spørsmål',
-'faqpage' => 'Project:Ofte stilte spørsmål',
-
-# Vector skin
-'vector-action-addsection' => 'Nytt emne',
-'vector-action-delete' => 'Slett',
-'vector-action-move' => 'Flytt',
-'vector-action-protect' => 'Beskytt',
-'vector-action-undelete' => 'Gjenopprett',
-'vector-action-unprotect' => 'Endre beskyttelse',
-'vector-simplesearch-preference' => 'Aktiver forbedrede søkeforslag (kun for drakten Vector)',
-'vector-view-create' => 'Opprett',
-'vector-view-edit' => 'Rediger',
-'vector-view-history' => 'Vis historikk',
-'vector-view-view' => 'Les',
-'vector-view-viewsource' => 'Vis kilden',
-'actions' => 'Handlinger',
-'namespaces' => 'Navnerom',
-'variants' => 'Varianter',
-
-'errorpagetitle' => 'Feil',
-'returnto' => 'Tilbake til $1.',
-'tagline' => 'Fra {{SITENAME}}',
-'help' => 'Hjelp',
-'search' => 'Søk',
-'searchbutton' => 'Søk',
-'go' => 'GÃ¥',
-'searcharticle' => 'GÃ¥',
-'history' => 'Sidehistorikk',
-'history_short' => 'Historikk',
-'updatedmarker' => 'oppdatert siden mitt forrige besøk',
-'printableversion' => 'Utskriftsvennlig versjon',
-'permalink' => 'Permanent lenke',
-'print' => 'Skriv ut',
-'view' => 'Vis',
-'edit' => 'Rediger',
-'create' => 'Opprett',
-'editthispage' => 'Rediger siden',
-'create-this-page' => 'Opprett denne siden',
-'delete' => 'Slett',
-'deletethispage' => 'Slett denne siden',
-'undelete_short' => 'Gjenopprett {{PLURAL:$1|én revisjon|$1 revisjoner}}',
-'viewdeleted_short' => 'Vis {{PLURAL:$1|en slettet redigering|$1 slettede redigeringer}}',
-'protect' => 'Beskytt',
-'protect_change' => 'endre',
-'protectthispage' => 'LÃ¥s siden',
-'unprotect' => 'Endre beskyttelse',
-'unprotectthispage' => 'Endre beskyttelsen av denne siden',
-'newpage' => 'Ny side',
-'talkpage' => 'Diskuter denne siden',
-'talkpagelinktext' => 'Diskusjon',
-'specialpage' => 'Spesialside',
-'personaltools' => 'Personlige verktøy',
-'postcomment' => 'Ny seksjon',
-'articlepage' => 'Vis innholdsside',
-'talk' => 'Diskusjon',
-'views' => 'Visninger',
-'toolbox' => 'Verktøy',
-'userpage' => 'Vis brukerside',
-'projectpage' => 'Vis prosjektside',
-'imagepage' => 'Vis filside',
-'mediawikipage' => 'Vis beskjedside',
-'templatepage' => 'Vis mal',
-'viewhelppage' => 'Vis hjelpeside',
-'categorypage' => 'Vis kategoriside',
-'viewtalkpage' => 'Vis diskusjon',
-'otherlanguages' => 'På andre språk',
-'redirectedfrom' => '(Omdirigert fra $1)',
-'redirectpagesub' => 'Omdirigeringsside',
-'lastmodifiedat' => 'Denne siden ble sist endret $1 kl. $2.',
-'viewcount' => 'Denne siden er vist $1 {{PLURAL:$1|gang|ganger}}.',
-'protectedpage' => 'LÃ¥st side',
-'jumpto' => 'GÃ¥ til:',
-'jumptonavigation' => 'navigasjon',
-'jumptosearch' => 'søk',
-'view-pool-error' => 'Beklager, serverne er overbelastet for øyeblikket.
-For mange brukere forsøker å se denne siden.
-Vennligst vent en stund før du prøver å besøke denne siden på nytt.
-
-$1',
-'pool-timeout' => 'Tidsavbudd mens man ventet på låsing',
-'pool-queuefull' => 'Køen er full',
-'pool-errorunknown' => 'Ukjent feil',
-
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Om {{SITENAME}}',
-'aboutpage' => 'Project:Om',
-'copyright' => 'Innholdet er tilgjengelig under $1.',
-'copyrightpage' => '{{ns:project}}:Opphavsrett',
-'currentevents' => 'Aktuelt',
-'currentevents-url' => 'Project:Aktuelt',
-'disclaimers' => 'Forbehold',
-'disclaimerpage' => 'Project:Generelle forbehold',
-'edithelp' => 'Redigeringshjelp',
-'edithelppage' => 'Help:Redigering',
-'helppage' => 'Help:Innhold',
-'mainpage' => 'Hovedside',
-'mainpage-description' => 'Hovedside',
-'policy-url' => 'Project:Retningslinjer',
-'portal' => 'Prosjektportal',
-'portal-url' => 'Project:Prosjektportal',
-'privacy' => 'Personvern',
-'privacypage' => 'Project:Personvern',
-
-'badaccess' => 'Rettighetsfeil',
-'badaccess-group0' => 'Du har ikke tilgang til å utføre handlingen du prøvde på.',
-'badaccess-groups' => 'Handlingen du prøvde å utføre kan kun utføres av brukere i {{PLURAL:$2|gruppa|gruppene}} $1.',
-
-'versionrequired' => 'Versjon $1 av MediaWiki påtrengt',
-'versionrequiredtext' => 'Versjon $1 av MediaWiki er nødvendig for å bruke denne siden. Se [[Special:Version|versjonsiden]]',
-
-'ok' => 'OK',
-'retrievedfrom' => 'Hentet fra «$1»',
-'youhavenewmessages' => 'Du har $1 ($2).',
-'newmessageslink' => 'nye meldinger',
-'newmessagesdifflink' => 'siste endring',
-'youhavenewmessagesmulti' => 'Du har nye beskjeder på $1',
-'editsection' => 'rediger',
-'editold' => 'rediger',
-'viewsourceold' => 'vis kilde',
-'editlink' => 'rediger',
-'viewsourcelink' => 'vis kilde',
-'editsectionhint' => 'Rediger avsnitt: $1',
-'toc' => 'Innhold',
-'showtoc' => 'vis',
-'hidetoc' => 'skjul',
-'collapsible-collapse' => 'skjul',
-'collapsible-expand' => 'vis',
-'thisisdeleted' => 'Se eller gjenopprett $1?',
-'viewdeleted' => 'Vis $1?',
-'restorelink' => '{{PLURAL:$1|én slettet revisjon|$1 slettede revisjoner}}',
-'feedlinks' => 'Mating:',
-'feed-invalid' => 'Ugyldig matingstype.',
-'feed-unavailable' => 'Abonnementskilder er ikke tilgjengelig',
-'site-rss-feed' => '$1 RSS-mating',
-'site-atom-feed' => '$1 Atom-mating',
-'page-rss-feed' => '«$1» RSS-mating',
-'page-atom-feed' => '«$1» Atom-mating',
-'red-link-title' => '$1 (siden finnes ikke)',
-'sort-descending' => 'Sorter i synkende rekkefølge',
-'sort-ascending' => 'Sorter i stigende rekkefølge',
-
-# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Side',
-'nstab-user' => 'Brukerside',
-'nstab-media' => 'Mediaside',
-'nstab-special' => 'Spesialside',
-'nstab-project' => 'Prosjektside',
-'nstab-image' => 'Fil',
-'nstab-mediawiki' => 'Melding',
-'nstab-template' => 'Mal',
-'nstab-help' => 'Hjelp',
-'nstab-category' => 'Kategori',
-
-# Main script and global functions
-'nosuchaction' => 'Funksjonen finnes ikke',
-'nosuchactiontext' => 'Handlingen spesifisert i URL-en er ugyldig.
-Du kan ha skrevet URL-en feil, eller fulgt en link som var feil.
-Det kan også være en bug i {{SITENAME}}.',
-'nosuchspecialpage' => 'En slik spesialside finnes ikke',
-'nospecialpagetext' => 'Du ba om en ugyldig spesialside; en liste over gyldige spesialsider finnes på [[Special:SpecialPages|{{int:specialpages}}]].',
-
-# General errors
-'error' => 'Feil',
-'databaseerror' => 'Databasefeil',
-'dberrortext' => 'Det har oppstått en syntaksfeil i en databaseforespørsel.
-Dette kan tyde på en feil i programvaren.
-Forrige databaseforespørsel var:
-<blockquote><tt>$1</tt></blockquote>
-fra funksjonen «<tt>$2</tt>».
-Databasen returnerte feilen «<tt>$3: $4</tt>».',
-'dberrortextcl' => 'Det oppsto en syntaksfeil i en databaseforespørsel.
-Forrige databaseforespørsel var:
-«$1»
-fra funksjonen «$2».
-Databasen returnerte feilen «$3: $4».',
-'laggedslavemode' => 'Advarsel: Dette kan være en eldre versjon av siden.',
-'readonly' => 'Databasen er skrivebeskyttet',
-'enterlockreason' => 'Skriv en begrunnelse for skrivebeskyttelsen, inkludert et estimat for når den blir opphevet',
-'readonlytext' => 'Databasen er for øyeblikket skrivebeskyttet, sannsynligvis på grunn av rutinemessig vedlikehold.
-
-Administratoren som låste databasen ga forklaringen: $1',
-'missing-article' => 'Databasen fant ikke teksten på siden som den burde ha funnet, med navnet «$1» $2.
-
-Dette skyldes vanligvis at man følger en utdatert diff- eller historikklenke til en side som har blitt slettet.
-
-Om dette ikke er tilfellet kan du ha oppdaget en feil i programvaren.
-Vennligst rapporter dette til en [[Special:ListUsers/sysop|administrator]], oppgi da nettadressen.',
-'missingarticle-rev' => '(revisjon#: $1)',
-'missingarticle-diff' => '(diff: $1, $2)',
-'readonly_lag' => 'Databasen er automatisk skrivebeskyttet så slavetjenerne kan ta igjen mestertjeneren',
-'internalerror' => 'Intern feil',
-'internalerror_info' => 'Intern feil: $1',
-'fileappenderrorread' => 'Klarte ikke å lese «$1» når data skulle tilføyes.',
-'fileappenderror' => 'Kunne ikke legge "$1" til "$2".',
-'filecopyerror' => 'Klarte ikke å kopiere filen «$1» til «$2».',
-'filerenameerror' => 'Klarte ikke å døpe om filen «$1» til «$2».',
-'filedeleteerror' => 'Klarte ikke å slette filen «$1».',
-'directorycreateerror' => 'Klarte ikke å opprette mappe «$1».',
-'filenotfound' => 'Klarte ikke å finne filen «$1».',
-'fileexistserror' => 'Klarte ikke å skrive til filen «$1»: filen finnes fra før',
-'unexpected' => 'Uventet verdi: «$1»=«$2».',
-'formerror' => 'Feil: klarte ikke å sende skjema',
-'badarticleerror' => 'Handlingen kan ikke utføres på denne siden.',
-'cannotdelete' => 'Kunne ikke slette filen «$1». Den kan ha blitt slettet av noen andre.',
-'badtitle' => 'Ugyldig tittel',
-'badtitletext' => 'Den ønskede tittelen var ugyldig, tom eller feilaktig lenket fra en annen wiki.
-Det kan inneholder en eller flere tegn som ikke kan brukes i titler.',
-'querypage-no-updates' => 'Oppdateringer for denne siden er slått av. Data her blir ikke gjenoppfrisket.',
-'wrong_wfQuery_params' => 'Gale paramtere til wfQuery()<br />
-Funksjon: $1<br />
-Spørring: $2',
-'viewsource' => 'Vis kildetekst',
-'actionthrottled' => 'Handlingsgrense overskredet',
-'actionthrottledtext' => 'For å beskytte mot spam, kan du ikke utføre denne handlingen for mange ganger i løpet av et kort tidssrom, og du har overskredet denne grensen. Prøv igjen om noen minutter.',
-'protectedpagetext' => 'Denne siden har blitt låst for redigeringer.',
-'viewsourcetext' => 'Du kan se og kopiere kilden til denne siden:',
-'protectedinterface' => 'Denne siden viser brukergrensesnittet for programvaren, og er låst for å hindre misbruk.',
-'editinginterface' => "'''Advarsel:''' Du redigerer en side som brukes i grensesnittet for programvaren. Endringer på denne siden vil påvirke hvordan grensesnittet vil se ut. For oversettelser er det best om du bruker [//translatewiki.net/wiki/Main_Page?setlang=no translatewiki.net], prosjektet for oversettelse av MediaWiki.",
-'sqlhidden' => '(SQL-spørring skjult)',
-'cascadeprotected' => 'Denne siden er låst for redigering fordi den inkluderes på følgende sider som har dypbeskyttelse slått på:<!--{{PLURAL:$1}}-->
-$2',
-'namespaceprotected' => "Du har ikke tillatelse til å redigere sider i navnerommet '''$1'''.",
-'customcssprotected' => 'Du har ikke tillatelse til å redigere denne CSS-siden fordi den inneholder en annen brukers personlige innstillinger.',
-'customjsprotected' => 'Du har ikke tillatelse til å redigere denne JavaScript-siden fordi den inneholder en annen brukers personlige innstillinger.',
-'ns-specialprotected' => 'Sier i navnerommet {{ns:special}} kan ikke redigeres.',
-'titleprotected' => "Denne tittelen har blitt låst for oppretting av [[User:$1|$1]].
-Den angitte grunnen er ''$2''.",
-
-# Virus scanner
-'virus-badscanner' => "DÃ¥rlig konfigurasjon: ukjent virusskanner: ''$1''",
-'virus-scanfailed' => 'skanning mislyktes (kode $1)',
-'virus-unknownscanner' => 'ukjent antivirusprogram:',
-
-# Login and logout pages
-'logouttext' => "'''Du er nå logget ut.'''
-
-Du kan fortsette å bruke {{SITENAME}} anonymt, eller [[Special:UserLogin|logge inn igjen]] som samme eller annen bruker.
-Merk at noen sider kan vise at du fortsatt er logget inn fram til du tømmer mellomlageret i nettleseren.",
-'welcomecreation' => '==Velkommen, $1!==
-Brukerkontoen din har blitt opprettet.
-Ikke glem å endre [[Special:Preferences|innstillingene]] dine.',
-'yourname' => 'Brukernavn:',
-'yourpassword' => 'Passord:',
-'yourpasswordagain' => 'Gjenta passord',
-'remembermypassword' => 'Husk meg på denne datamaskinen (i maks $1 {{PLURAL:$1|dag|dager}})',
-'securelogin-stick-https' => 'Vær fortsatt koblet til HTTPS etter innlogging',
-'yourdomainname' => 'Ditt domene',
-'externaldberror' => 'Det var en ekstern autentifiseringsfeil, eller du kan ikke oppdatere din eksterne konto.',
-'login' => 'Logg inn',
-'nav-login-createaccount' => 'Logg inn eller opprett en konto',
-'loginprompt' => 'Du må ha slått på informasjonskapsler for å logge in på {{SITENAME}}.',
-'userlogin' => 'Logg inn eller opprett en konto',
-'userloginnocreate' => 'Logg inn',
-'logout' => 'Logg ut',
-'userlogout' => 'Logg ut',
-'notloggedin' => 'Ikke logget inn',
-'nologin' => "Er du ikke registrert? '''$1'''.",
-'nologinlink' => 'Opprett en konto',
-'createaccount' => 'Opprett konto',
-'gotaccount' => "Har du allerede et brukernavn? '''$1'''.",
-'gotaccountlink' => 'Logg inn',
-'userlogin-resetlink' => 'Har du glemt påloggingsdetaljene dine?',
-'createaccountmail' => 'per e-post',
-'createaccountreason' => 'Ã…rsak:',
-'badretype' => 'Passordene samsvarte ikke.',
-'userexists' => 'Brukernavnet er allerede i bruk.
-Velg et annet brukernavn.',
-'loginerror' => 'Innloggingsfeil',
-'createaccounterror' => 'Kunne ikke opprette konto: $1',
-'nocookiesnew' => 'Din brukerkonto er nå opprettet, men du har ikke logget på. {{SITENAME}} bruker informasjonskapsler («cookies») for å logge brukere på og du har slått dem av. Slå dem på for å kunne logge på med ditt nye brukernavn og passord.',
-'nocookieslogin' => '{{SITENAME}} bruker informasjonskapsler («cookies») for å logge brukere på og du har slått dem av. Slå dem på og prøv igjen.',
-'nocookiesfornew' => 'Brukerkontoen ble ikke opprettet siden vi ikke kunne bekrefte dens kilde.
-Kontroller at du har aktivert informasjonskapsler, oppdater siden og prøv igjen.',
-'noname' => 'Du har ikke oppgitt et gyldig brukernavn.',
-'loginsuccesstitle' => 'Du er nå logget inn',
-'loginsuccess' => 'Du er nå logget inn på {{SITENAME}} som «$1».',
-'nosuchuser' => 'Det eksisterer ingen bruker ved navn «$1».
-Merk at det skilles mellom store og små bokstaver.
-Sjekk stavemåten eller [[Special:UserLogin/signup|opprett en ny konto]].',
-'nosuchusershort' => 'Det finnes ingen bruker ved navn «$1». Kontroller stavemåten.',
-'nouserspecified' => 'Du må oppgi et brukernavn.',
-'login-userblocked' => 'Brukeren er blokkert. Innlogging er ikke tillatt.',
-'wrongpassword' => 'Du har oppgitt et ugyldig passord. Prøv igjen.',
-'wrongpasswordempty' => 'Du oppga ikke noe passord. Prøv igjen.',
-'passwordtooshort' => 'Passord må ha minst {{PLURAL:$1|ett tegn|$1 tegn}}.',
-'password-name-match' => 'Passordet ditt må være anderledes enn brukernavnet.',
-'password-login-forbidden' => 'Bruken av disse brukernavn og passord har blitt forbudt.',
-'mailmypassword' => 'Send nytt passord',
-'passwordremindertitle' => 'Nytt midlertidig passord fra {{SITENAME}}',
-'passwordremindertext' => 'Noen (antagelig deg, fra IP-adressen $1) ba oss sende deg et nytt
-passord til {{SITENAME}} ($4). Et midlertidig passord for «$2» har
-blitt laget og er satt til «$3». Om det var det du ville, må du logge inn
-og velge et nytt passord nå. Det midlertidige passordet vil utgå om {{PLURAL:$5|én dag|$5 dager}}.
-
-Dersom denne forespørselen ble utført av noen andre, eller om du kom på passordet
-og ikke lenger ønsker å endre det, kan du ignorere denne beskjeden
-og fortsette å bruke det gamle passordet.',
-'noemail' => 'Det er ikke registrert noen e-postadresse for brukeren «$1».',
-'noemailcreate' => 'De må oppgi en gyldig e-postadresse.',
-'passwordsent' => 'Et nytt passord har blitt sendt til e-postadressen registrert på bruker «$1». Logg inn når du har mottatt det nye passordet.',
-'blocked-mailpassword' => 'IP-adressen din er blokkert fra å redigere, og for å forhindre misbruk kan du heller ikke bruke funksjonen som gir deg nytt passord.',
-'eauthentsent' => 'En bekreftelsesmelding ble sendt til gitte e-postadresse. Før andre e-poster kan sendes til kontoen må du følge instruksjonene i e-posten for å bekrefte at kontoen faktisk er din.',
-'throttled-mailpassword' => 'En passordpåminnelse ble sendt for mindre enn {{PLURAL:$1|en time|$1 timer}} siden.
-For å forhindre misbruk kan kun én passordpåminnelse sendes per {{PLURAL:$1|time|$1 timer}}.',
-'mailerror' => 'Feil under sending av e-post: $1',
-'acct_creation_throttle_hit' => 'Gjester med samme IP-adresse som deg har opprettet {{PLURAL:$1|én konto|$1 kontoer}} det siste døgnet, og det er ikke tillatt å opprette flere.
-Som et resultat kan det ikke opprettes flere kontoer fra denne IP-adressen.',
-'emailauthenticated' => 'Din e-postadresse ble bekreftet $2 $3.',
-'emailnotauthenticated' => 'Din e-postadresse er ikke bekreftet. Du vil ikke kunne motta e-post for noen av følgende egenskaper.',
-'noemailprefs' => 'Oppgi en e-postadresse for at disse funksjonene skal fungere.',
-'emailconfirmlink' => 'Bekreft e-postadressen din.',
-'invalidemailaddress' => 'Din e-postadresse kan ikke aksepteres, fordi den er ugyldig formatert.
-Skriv inn en fungerende e-postadresse eller tøm feltet.',
-'accountcreated' => 'Konto opprettet',
-'accountcreatedtext' => 'Brukerkonto for $1 har blitt opprettet.',
-'createaccount-title' => 'Kontooppretting på {{SITENAME}}',
-'createaccount-text' => 'Noen opprettet en konto for din e-postadresse på {{SITENAME}} ($4) med navnet «$2», med «$3» som passord. Du burde logge inn og endre passordet nå.
-
-Du kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.',
-'usernamehasherror' => 'Brukernavn kan ikke inneholde nummertegn.',
-'login-throttled' => 'Du har prøvd å logge inn med denne kontoen for mange ganger. Vent før du prøver igjen.',
-'login-abort-generic' => 'Innleggingen ble avbrutt.',
-'loginlanguagelabel' => 'Språk: $1',
-'suspicious-userlogout' => 'Din forespørsel om å logge ut ble nektet fordi den så ut til å ha bli sendt av en ødelagt nettleser eller en mellomtjener.',
-
-# E-mail sending
-'php-mail-error-unknown' => 'Ukjent feil i PHPs mail()-funksjon',
-
-# Change password dialog
-'resetpass' => 'Endre passord',
-'resetpass_announce' => 'Du logget inn med en midlertidig e-postkode. For å fullføre innloggingen må du oppgi et nytt passord her:',
-'resetpass_text' => '<!-- Legg til tekst her -->',
-'resetpass_header' => 'Endre passord',
-'oldpassword' => 'Gammelt passord:',
-'newpassword' => 'Nytt passord:',
-'retypenew' => 'Gjenta nytt passord:',
-'resetpass_submit' => 'Angi passord og logg inn',
-'resetpass_success' => 'Passordet ditt ble endret! Logger inn&nbsp;…',
-'resetpass_forbidden' => 'Passord kan ikke endres',
-'resetpass-no-info' => 'Du må være logget inn for å gå til denne siden direkte',
-'resetpass-submit-loggedin' => 'Endre passord',
-'resetpass-submit-cancel' => 'Avbryt',
-'resetpass-wrong-oldpass' => 'Feil midlertidig eller nåværende passord.
-Du kan ha allerede byttet passordet, eller bedt om et nytt midlertidig passord.',
-'resetpass-temp-password' => 'Midlertidig passord:',
-
-# Special:PasswordReset
-'passwordreset' => 'Passordresetting',
-'passwordreset-text' => 'Fyll ut dette skjemaet for å motta en påminnelse om kontoopplysningene dine i en e-post.',
-'passwordreset-legend' => 'Tilbakestill passord',
-'passwordreset-disabled' => 'Tilbakestilling av passord har blitt deaktivert på denne wikien.',
-'passwordreset-pretext' => '{{PLURAL:$1||Angi en av datadelene nedenfor}}',
-'passwordreset-username' => 'Brukernavn:',
-'passwordreset-domain' => 'Domene:',
-'passwordreset-email' => 'E-postadresse:',
-'passwordreset-emailtitle' => 'Kontodetaljer på {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Noen (sannsynligvis deg fra IP-adressen $1) ba om en påminnelse om dine
-kontodetaljer for {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er
-tilknyttet denne e-postadressen:
-
-$2
-
-{{PLURAL:$3|Dette midlertidige passordet|Disse midlertidige passordene}} utløper om {{PLURAL:$5|én dag|$5 dager}}.
-Du bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne
-forespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger
-ønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle
-passord.',
-'passwordreset-emailtext-user' => 'Brukeren $1 på {{SITENAME}} ba om en påminnelse om kontodetaljene dine for {{SITENAME}}
-($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er tilknyttet denne e-postadressen:
-
-$2
-
-{{PLURAL:$3|Dette midlertidige passordet|Disse midlertidige passordene}} utløper om {{én dag|$5 dager}}.
-Du bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne
-forespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger
-ønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle
-passord.',
-'passwordreset-emailelement' => 'Brukernavn: $1
-Midlertidig passord: $2',
-'passwordreset-emailsent' => 'En påminnelse har blitt sendt på e-post.',
-
-# Edit page toolbar
-'bold_sample' => 'Fet tekst',
-'bold_tip' => 'Fet tekst',
-'italic_sample' => 'Kursiv tekst',
-'italic_tip' => 'Kursiv tekst',
-'link_sample' => 'Lenketittel',
-'link_tip' => 'Intern lenke',
-'extlink_sample' => 'http://www.example.com lenketittel',
-'extlink_tip' => 'Ekstern lenke (husk prefikset http://)',
-'headline_sample' => 'Overskriftstekst',
-'headline_tip' => 'Overskrift, nivå 2',
-'nowiki_sample' => 'Sett inn uformatert tekst her',
-'nowiki_tip' => 'Ignorer wikiformatering',
-'image_sample' => 'Eksempel.jpg',
-'image_tip' => 'Innebygd fil',
-'media_sample' => 'Eksempel.ogg',
-'media_tip' => 'Fillenke',
-'sig_tip' => 'Din signatur med dato',
-'hr_tip' => 'Horisontal linje (bruk sparsomt)',
-
-# Edit pages
-'summary' => 'Redigeringsforklaring:',
-'subject' => 'Emne/overskrift:',
-'minoredit' => 'Dette er en mindre endring',
-'watchthis' => 'Overvåk denne siden',
-'savearticle' => 'Lagre siden',
-'preview' => 'Forhåndsvisning',
-'showpreview' => 'Forhåndsvisning',
-'showlivepreview' => 'Levende forhåndsvisning',
-'showdiff' => 'Vis endringer',
-'anoneditwarning' => "'''Advarsel:''' Du er ikke logget inn.
-IP-adressen din blir bevart i sidens redigeringshistorikk.",
-'anonpreviewwarning' => "''Du er ikke logget inn. Lagring vil registrere din IP-adresse i sidens redigeringshistorikk.''",
-'missingsummary' => "'''PÃ¥minnelse:''' Du har ikke lagt inn en redigeringsforklaring.
-Velger du ''Lagre siden'' en gang til blir endringene lagret uten forklaring.",
-'missingcommenttext' => 'Vennligst legg inn en kommentar under.',
-'missingcommentheader' => "'''PÃ¥minnelse:''' Du har ikke angitt et emne/overskrift for denne kommentaren.
-Om du trykker «{{int:savearticle}}» igjen vil redigeringen din bli lagret uten forklaring.",
-'summary-preview' => 'Forhåndsvisning av redigeringsforklaring:',
-'subject-preview' => 'Forhåndsvisning av emne/overskrift:',
-'blockedtitle' => 'Brukeren er blokkert',
-'blockedtext' => "'''Ditt brukernavn eller din IP-adresse har blitt blokkert.'''
-
-Blokkeringen ble utført av $1. Grunnen som ble oppgitt var ''$2''.
-
-* Blokkeringen begynte: $8
-* Blokkeringen utgår: $6
-* Blokkering ment på: $7
-
-Du kan kontakte $1 eller en annen [[{{MediaWiki:Grouppage-sysop}}|administrator]] for å diskutere blokkeringen.
-Du kan ikke bruke «E-post til denne brukeren»-funksjonen med mindre du har oppgitt en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]] og du ikke er blokkert fra å sende e-post.
-Din nåværende IP-adresse er $3, og blokkerings-ID-en er #$5.
-Vennligst ta all denne informasjonen ved henvendelser.",
-'autoblockedtext' => "Din IP-adresse har blitt automatisk blokkert fordi den ble brukt av en annen bruker som ble blokkert av $1.
-Den oppgitte grunnen var:
-
-:'''$2'''
-
-* Blokkeringen begynte: $8
-* Blokkeringen utgår: $6
-* Blokkeringen er ment for: $7
-
-Du kan kontakte $1 eller en av de andre [[{{MediaWiki:Grouppage-sysop}}|administratorene]] for å diskutere blokkeringen.
-
-Merk at du ikke kan bruke «E-post til denne brukeren»-funksjonen med mindre du har registrert en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]].
-
-Din IP-adresse er $3, og blokkerings-ID-en er #$5.
-Vennligst ta med all denne informasjonen ved henvendelser.",
-'blockednoreason' => 'ingen grunn gitt',
-'whitelistedittext' => 'Du må $1 for å redigere artikler.',
-'confirmedittext' => 'Du må bekrefte e-postadressen din før du kan redigere sider. Vennligst oppgi og bekreft e-postadressen din via [[Special:Preferences|innstillingene dine]].',
-'nosuchsectiontitle' => 'Finner ikke avsnittet',
-'nosuchsectiontext' => 'Du prøvde å redigere et avsnitt som ikke eksisterer.
-Det kan ha blitt flyttet eller slettet mens du så på siden.',
-'loginreqtitle' => 'Innlogging kreves',
-'loginreqlink' => 'logge inn',
-'loginreqpagetext' => 'Du må $1 for å se andre sider.',
-'accmailtitle' => 'Passord sendt.',
-'accmailtext' => 'Et tilfeldig passord for [[User talk:$1|$1]] har blitt sendt til $2.
-
-Passordet for denne nye kontoen [[Special:ChangePassword|kan endres]] når du logger inn.',
-'newarticle' => '(Ny)',
-'newarticletext' => "Du har fulgt en lenke til en side som ikke finnes ennå.
-For å opprette siden, begynn å skrive i boksen under (se [[{{MediaWiki:Helppage}}|hjelpesiden]] for mer informasjon).
-Om du havnet her ved en feil, trykk '''tilbake''' i nettleseren.",
-'anontalkpagetext' => "----
-''Dette er en diskusjonsside for en uregistrert bruker som ikke har opprettet konto eller ikke er logget inn.
-Vi er derfor nødt til å bruke den numeriske IP-adressen til å identifisere ham eller henne.
-En IP-adresse kan være delt mellom flere brukere.
-Hvis du er en uregistrert bruker og synes at du har fått irrelevante kommentarer på en slik side, [[Special:UserLogin/signup|opprett en konto]] eller [[Special:UserLogin|logg inn]] så vi unngår fremtidige forvekslinger med andre uregistrerte brukere.''",
-'noarticletext' => 'Det er for tiden ingen tekst på denne siden.
-Du kan [[Special:Search/{{PAGENAME}}|søke etter denne sidetittelen]] på andre sider,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} søke i relaterte logger],
-eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} opprette siden]</span>.',
-'noarticletext-nopermission' => 'Det er ingen tekst på denne siden.
-Du kan [[Special:Search/{{PAGENAME}}|søke etter sidens tittel]] i andre sider, eller <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} søke i relevante logger]</span>.',
-'userpage-userdoesnotexist' => 'Brukerkontoen «<nowiki>$1</nowiki>» er ikke registrert. Sjekk om du ønsker å opprette/redigere denne siden.',
-'userpage-userdoesnotexist-view' => 'Kontoen «$1» er ikke registrert.',
-'blocked-notice-logextract' => 'Denne brukeren er for tiden blokkert.
-Siste blokkeringsloggelement kan sees nedenfor.',
-'clearyourcache' => "'''Merk:''' Etter lagring vil det kanskje være nødvendig at nettleseren sletter hurtiglageret sitt for at endringene skal tre i kraft.
-* '''Firefox / Safari:''' hold ''Shift'' mens du klikker på ''Oppdater'' eller trykk ''Ctrl-F5'' eller ''Ctrl-R'' (''Command-R'' på en Mac)
-* '''Google Chrome:''' trykk ''Ctrl-Shift-R'' (''Command-Shift-R'' på en Mac)
-* '''Internet Explorer:''' hold ''Ctrl'' mens du klikker på ''Oppdater'' eller trykk ''Ctrl-F5''
-* '''Konqueror:''' klikk ''Oppdater'' eller trykk ''F5''
-* '''Opera:''' tøm hurtiglageret i ''Verktøy → Innstillinger''",
-'usercssyoucanpreview' => "'''Tips:''' Bruk '{{int:showpreview}}'-knappen for å teste din nye CSS før du lagrer.",
-'userjsyoucanpreview' => "'''Tips:''' Bruk '{{int:showpreview}}'-knappen for å teste ditt nye JS før du lagrer.",
-'usercsspreview' => "'''Husk at dette bare er en forhåndsvisning av din bruker-CSS og at den ikke er lagret!'''",
-'userjspreview' => "'''Husk at dette bare er en test eller forhåndsvisning av ditt bruker-JavaScript, og det ikke er lagret!'''",
-'sitecsspreview' => "'''Husk at du bare forhåndsviser denne CSS.'''
-'''Den har ikke blitt lagret ennå!'''",
-'sitejspreview' => "'''Husk at du bare forhåndsviser denne JavaScript-koden.'''
-'''Den har ikke blitt lagret ennå!'''",
-'userinvalidcssjstitle' => "'''Advarsel:''' Det finnes ikke noe utseende ved navn «$1». Husk at .css- og .js-sider bruker titler i små bokstaver, for eksempel {{ns:user}}:Eksempel/vector.css, ikke {{ns:user}}:Eksempel/Vector.css",
-'updated' => '(Oppdatert)',
-'note' => "'''Merk:'''",
-'previewnote' => "'''Husk at dette bare er en forhåndsvisning.'''
-Endringene dine har ikke blitt lagret ennå!",
-'previewconflict' => 'Slik vil teksten i redigeringsvinduet se ut dersom du lagrer den.',
-'session_fail_preview' => "'''Beklager! Klarte ikke å lagre redigeringen din. Prøv igjen. Om det fortsetter å gå galt, prøv å [[Special:UserLogout|logge ut]] og så inn igjen.'''",
-'session_fail_preview_html' => "'''Beklager! Klarte ikke å lagre redigeringen din på grunn av tap av øktdata.'''
-
-''Fordi {{SITENAME}} har rå HTML slått på, er forhåndsvisningen skjult for å forhindre JavaScript-angrep.''
-
-'''Om dette er et legitimt redigeringsforsøk, prøv igjen. Om det da ikke fungerer, prøv å [[Special:UserLogout|logge ut]] og logge inn igjen.'''",
-'token_suffix_mismatch' => "'''Redigeringen din har blitt avvist fordi klienten din ikke hadde punktasjonstegn i redigeringsteksten. Redigeringen har blitt avvist for å hindre ødeleggelse av artikkelteksten. Dette forekommer av og til når man bruker vevbaserte anonyme proxytjenester.'''",
-'edit_form_incomplete' => "'''Deler av redigeringsskjemaet nådde ikke tjeneren; dobbelsjekk at redigeringen er korrekt og prøv igjen.'''",
-'editing' => 'Redigerer $1',
-'editingsection' => 'Redigerer $1 (avsnitt)',
-'editingcomment' => 'Redigerer $1 (ny seksjon)',
-'editconflict' => 'Redigeringskonflikt: $1',
-'explainconflict' => "Noen andre har endret teksten siden du begynte å redigere.
-Den øverste boksen inneholder den nåværende tekst.
-Dine endringer vises i den nederste boksen.
-Du er nødt til å flette dine endringer sammen med den nåværende teksten.
-'''Kun''' teksten i den øverste tekstboksen blir lagret når du trykker «{{int:savearticle}}».",
-'yourtext' => 'Din tekst',
-'storedversion' => 'Den lagrede versjonen',
-'nonunicodebrowser' => "'''ADVARSEL: Nettleseren din har ikke støtte for Unicode. Skru det på før du begynner å redigere artikler.'''",
-'editingold' => "'''ADVARSEL:
-Du redigerer en gammel versjon av denne siden.
-Hvis du lagrer den, vil alle endringer foretatt siden denne versjonen bli overskrevet.'''",
-'yourdiff' => 'Forskjeller',
-'copyrightwarning' => "Merk at alle bidrag til {{SITENAME}} anses som utgitt under $2 (se $1 for detaljer).
-Om du ikke vil at dine bidrag skal kunne redigeres og distribuert fritt etter andres forgodtbefinnende, ikke legg det til her.<br />
-Du lover også at du har skrevet dette selv, eller kopiert det fra en ressurs som samsvarer med vilkårene eller ikke er vernet av opphavsrett.
-'''Ikke legg til opphavsbeskyttet materiale uten tillatelse!'''",
-'copyrightwarning2' => "Vennligst merk at alle bidrag til {{SITENAME}} kan bli redigert, endret eller fjernet av andre bidragsytere. Om du ikke vil at dine bidrag skal kunne redigeres fritt, ikke legg det til her.<br />
-Du lover også at du har skrevet dette selv, eller kopiert det fra en ressurs som er i public domain eller lignende (se $1 for detaljer). '''IKKE LEGG TIL OPPHAVSBESKYTTET MATERIALE UTEN TILLATELSE!'''",
-'readonlywarning' => "'''ADVARSEL: Databasen er låst på grunn av vedlikehold,
-så du kan ikke lagre dine endringer akkurat nå. Det kan være en god idé å
-kopiere teksten din til en tekstfil, så du kan lagre den til senere.'''
-
-Systemadministratoren som låste databasen oppga følgende årsak: $1",
-'protectedpagewarning' => "'''Advarsel: Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den.'''
-Det siste loggelementet er oppgitt under som referanse:",
-'semiprotectedpagewarning' => "'''Merk:''' Denne siden har blitt låst slik at kun registrerte brukere kan endre den.
-Det siste loggelementet er oppgitt under som referanse:",
-'cascadeprotectedwarning' => "'''Advarsel:''' Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan redigere den, fordi den inkluderes på følgende dypbeskyttede sider:<!--{{PLURAL:$1}}-->",
-'titleprotectedwarning' => "'''Advarsel: Denne siden har blitt låst slik at [[Special:ListGroupRights|spesielle rettigheter]] kreves for å opprette den.'''
-Det siste loggelementet er oppgitt under som referanse:",
-'templatesused' => '{{PLURAL:$1|Mal|Maler}} som brukes på denne siden:',
-'templatesusedpreview' => '{{PLURAL:$1|Mal|Maler}} brukt i denne forhåndsvisningen:',
-'templatesusedsection' => '{{PLURAL:$1|Mal|Maler}} brukt i denne seksjonen:',
-'template-protected' => '(beskyttet)',
-'template-semiprotected' => '(halvbeskyttet)',
-'hiddencategories' => 'Denne siden er medlem av {{PLURAL:$1|1 skjult kategori|$1 skjulte kategorier}}:',
-'edittools' => '<!-- Teksten her vil vises under redigerings- og opplastingsboksene. -->',
-'nocreatetitle' => 'Sideoppretting er begrenset',
-'nocreatetext' => '{{SITENAME}} har begrensede muligheter for oppretting av nye sider. Du kan gå tilbake og redigere en eksisterende side, eller [[Special:UserLogin|logge inn eller opprette en ny konto]].',
-'nocreate-loggedin' => 'Du har ikke tillatelse til å opprette sider.',
-'sectioneditnotsupported-title' => 'Seksjonsredigering støttes ikke',
-'sectioneditnotsupported-text' => 'Seksjonsredigering støttes ikke på denne siden.',
-'permissionserrors' => 'Tilgangsfeil',
-'permissionserrorstext' => 'Du har ikke tillatelse til å utføre dette, av følgende {{PLURAL:$1|grunn|grunner}}:',
-'permissionserrorstext-withaction' => 'Du har ikke tillatelse til å $2 {{PLURAL:$1|på grunn av|av følgende grunner}}:',
-'recreate-moveddeleted-warn' => "Advarsel: Du er i ferd med å opprette en side som tidligere har blitt slettet.'''
-
-Du bør vurdere om det er passende å fortsette å redigere denne siden.
-Slette- og flytteloggen for denne siden gjengis her:",
-'moveddeleted-notice' => 'Denne siden har blitt slettet.
-Slette- og flytteloggen vises nedenfor.',
-'log-fulllog' => 'Vis fullstendig logg',
-'edit-hook-aborted' => 'Redigering avbrutt av en funksjon, uten forklaring.',
-'edit-gone-missing' => 'Kunne ikke oppdatere siden fordi den har blitt slettet.',
-'edit-conflict' => 'Redigeringskonflikt.',
-'edit-no-change' => 'Redigeringen din ble ignorert fordi det ikke var noen endringer.',
-'edit-already-exists' => 'Kunne ikke opprette ny side fordi den finnes fra før.',
-
-# Parser/template warnings
-'expensive-parserfunction-warning' => 'Advarsel: Denne siden inneholder for mange prosesskrevende parserfunksjoner.
-
-Det burde være mindre enn {{PLURAL:$2|$2|$2}}, men er nå {{PLURAL:$1|$1|$1}}..',
-'expensive-parserfunction-category' => 'Sider med for mange prosesskrevende parserfunksjoner',
-'post-expand-template-inclusion-warning' => 'Advarsel: Størrelsen på inkluderte maler er for stor.
-Noen maler vil ikke bli inkludert.',
-'post-expand-template-inclusion-category' => 'Sider som inneholder for store maler',
-'post-expand-template-argument-warning' => 'Advarsel: Siden inneholder ett eller flere malparametere som blir for lange når de utvides.
-Disse parameterne har blitt utelatt.',
-'post-expand-template-argument-category' => 'Sider med utelatte malparametere',
-'parser-template-loop-warning' => 'Mal-loop oppdaget: [[$1]]',
-'parser-template-recursion-depth-warning' => 'Mal er brukt for mange ganger ($1)',
-'language-converter-depth-warning' => 'Dybdegrense for språkkonvertering overskredet ($1)',
-
-# "Undo" feature
-'undo-success' => 'Redigeringen kan omgjøres. Sjekk sammenligningen under for å bekrefte at du vil gjøre dette, og lagre endringene for å fullføre omgjøringen.',
-'undo-failure' => 'Redigeringen kunne ikke omgjøres på grunn av konflikterende etterfølgende redigeringer.',
-'undo-norev' => 'Redigeringen kunne ikke fjernes fordi den ikke eksisterer eller ble slettet',
-'undo-summary' => 'Fjerner revisjon $1 av [[Special:Contributions/$2]] ([[User talk:$2|diskusjon]] | [[Special:Contributions/$2|{{int:contribslink}}]])',
-
-# Account creation failure
-'cantcreateaccounttitle' => 'Kan ikke opprette konto',
-'cantcreateaccount-text' => "Kontooppretting fra denne IP-adressen ('''$1''') har blitt blokkert av [[User:$3|$3]].
-
-Grunnen som ble oppgitt av $3 er ''$2''",
-
-# History pages
-'viewpagelogs' => 'Vis logger for denne siden',
-'nohistory' => 'Denne siden har ingen historikk.',
-'currentrev' => 'Nåværende versjon',
-'currentrev-asof' => 'Nåværende revisjon fra $1',
-'revisionasof' => 'Revisjonen fra $1',
-'revision-info' => 'Revisjon per $1 av $2',
-'previousrevision' => '↠Eldre revisjon',
-'nextrevision' => 'Nyere revisjon →',
-'currentrevisionlink' => 'Nåværende revisjon',
-'cur' => 'nå',
-'next' => 'neste',
-'last' => 'forrige',
-'page_first' => 'første',
-'page_last' => 'siste',
-'histlegend' => "Valg av diff: merk i radioboksene de revisjonene du ønsker å sammenligne og trykk linjeskift eller knappen nederst på siden.<br />
-Forklaring: '''({{int:cur}})''' = forskjell fra nåværende revisjon, '''({{int:last}})''' = forskjell fra foregående revisjon, '''{{int:minoreditletter}}''' = mindre endring.",
-'history-fieldset-title' => 'Bla i historikken',
-'history-show-deleted' => 'Kun slettede',
-'histfirst' => 'Første',
-'histlast' => 'Siste',
-'historysize' => '({{PLURAL:$1|1 byte|$1 byte}})',
-'historyempty' => '(tom)',
-
-# Revision feed
-'history-feed-title' => 'Revisjonshistorikk',
-'history-feed-description' => 'Revisjonshistorikk for denne siden',
-'history-feed-item-nocomment' => '$1 på $2',
-'history-feed-empty' => 'Den etterspurte siden finnes ikke. Den kan ha blitt slettet fra wikien, eller fått et nytt navn. Prøv å [[Special:Search|søke]] etter beslektede sider.',
-
-# Revision deletion
-'rev-deleted-comment' => '(redigeringskommentar fjernet)',
-'rev-deleted-user' => '(brukernavn fjernet)',
-'rev-deleted-event' => '(fjernet loggoppføring)',
-'rev-deleted-user-contribs' => '[brukernavn eller IP-adresse fjernet – redigeringen vises ikke blant bidragene]',
-'rev-deleted-text-permission' => "Denne revisjonen har blitt '''slettet'''.
-Det kan være detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} slettingsloggen].",
-'rev-deleted-text-unhide' => "Denne siderevisjonen har blitt '''slettet'''.
-Se etter detaljer i slettingsloggen: [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].
-Som administrator kan du fortsatt [$1 se revisjonen] om du ønsker det.",
-'rev-suppressed-text-unhide' => "Denne siderevisjonen har blitt '''skjult'''.
-Informasjon om dette kan finnes i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} skjulingsloggen].
-Som administrator kan du fortsatt [$1 se revisjonen] om du ønsker det.",
-'rev-deleted-text-view' => "Denne siderevisjonen har blitt '''slettet'''.
-Som administrator kan du fortsatt se den. Detaljer finnes i slettingsloggen: [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].",
-'rev-suppressed-text-view' => "!Denne siderevisjonen har blitt '''skjult'''.
-Som administrator kan du se den; detaljer kan finnes i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} skjulingsloggen].",
-'rev-deleted-no-diff' => "Du kan ikke vise forskjellen fordi en av versjonene har blitt '''slettet'''.
-Det kan finnes flere detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} slettingsloggen].",
-'rev-suppressed-no-diff' => "Du kanne ikke se revisjonsforskjellen fordi en av revisjonene har blitt '''slettet'''.",
-'rev-deleted-unhide-diff' => "Én av revisjonene i denne diffen har blitt '''slettet'''.
-Det finnes flere detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} slettingsloggen].
-Som administrator kan du fortsatt [$1 se diffen] om du ønsker å gå videre.",
-'rev-suppressed-unhide-diff' => "En av siderevisjonene i denne diffen har blitt '''skjult'''.
-Det kan være detaljer i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} skjulingsloggen].
-Som administrator kan du fortsatt [$1 se diffen] om du ønsker å gå videre.",
-'rev-deleted-diff-view' => "En av revisjonene i denne diffen har blitt '''slettet'''.
-Som administrator kan du se diffen; det kan finnes detaljer i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
-'rev-suppressed-diff-view' => "En av revisjonene i denne diffen har blitt '''skjult'''.
-Som administrator kan du se denne diffen; det kan finnes detaljer i [{{fullurl:{{#Special:Log}}/suppcess|page={{FULLPAGENAMEE}}}} skjulingsloggen].",
-'rev-delundel' => 'vis/skjul',
-'rev-showdeleted' => 'vis',
-'revisiondelete' => 'Slett/gjenopprett revisjoner',
-'revdelete-nooldid-title' => 'Ugyldig målversjon',
-'revdelete-nooldid-text' => 'Du har ikke angitt en målversjon for denne funksjonen, den angitte versjonen finnes ikke, eller du forsøker å skjule den nåværende versjonen.',
-'revdelete-nologtype-title' => 'Ingen loggtype spesifisert',
-'revdelete-nologtype-text' => 'Du har ikke spesifisert en loggtype å utføre denne handlingen på.',
-'revdelete-nologid-title' => 'Ugyldig loggelement',
-'revdelete-nologid-text' => 'Du har enten ikke spesifisert ett loggelement å utføre på denne funksjonen, eller spesifisert element finnes ikke.',
-'revdelete-no-file' => 'Den spesifiserte filen finnes ikke.',
-'revdelete-show-file-confirm' => 'Er du sikker på at du ønsker å vise en slettet versjon av filen «<nowiki>$1</nowiki>» fra den $2 klokken $3?',
-'revdelete-show-file-submit' => 'Ja',
-'revdelete-selected' => "'''{{PLURAL:$2|Valgt revisjon|Valgte revisjoner}} av [[:$1]]:'''",
-'logdelete-selected' => "'''{{PLURAL:$1|Valgt loggoppføring|Valgte loggoppføringer}}:'''",
-'revdelete-text' => "'''Slettede versjoner og oppføringer vil fortsatt vises i sidehistorikken og loggene, men deler av innholdet vil ikke lenger bli offentliggjort.'''
-Andre administratorer på {{SITENAME}} vil fortsatt kunne se det skjulte innholdet, og kan gjenopprette det, med mindre videre begrensninger blir gitt av sideoperatørene.",
-'revdelete-confirm' => 'Bekreft at du ønsker å gjøre dette, at du forstår konsekvensene, og at du gjør det i samsvar med [[{{MediaWiki:Policy-url}}|retningslinjene]].',
-'revdelete-suppress-text' => "Skjuling bør '''kun''' brukes i følgende tilfeller:
-* Mulig injurierende utsagn
-* Upassende personlige opplysninger, herunder
-*: ''privatadresser og -telefonnumre, fødselsnumre og lignende''",
-'revdelete-legend' => 'Fastsett synlighetsbegrensninger',
-'revdelete-hide-text' => 'Skjul revisjonstekst',
-'revdelete-hide-image' => 'Skjul filinnhold',
-'revdelete-hide-name' => 'Skjul handling og mål',
-'revdelete-hide-comment' => 'Skjul redigeringsforklaring',
-'revdelete-hide-user' => 'Skjul bidragsyters brukernavn eller IP',
-'revdelete-hide-restricted' => 'La disse begrensningene gjelde for administratorer også, og steng dette grensesnittet',
-'revdelete-radio-same' => '(ikke endre)',
-'revdelete-radio-set' => 'Ja',
-'revdelete-radio-unset' => 'Nei',
-'revdelete-suppress' => 'Skjul informasjon også fra administratorer',
-'revdelete-unsuppress' => 'Fjern betingelser på gjenopprettede revisjoner',
-'revdelete-log' => 'Ã…rsak:',
-'revdelete-submit' => 'Utfør på {{PLURAL:$1|valgt revisjon|valgte revisjoner}}',
-'revdelete-success' => "'''Versjonssynlighet vellykket oppdatert.'''",
-'revdelete-failure' => "'''Kunne ikke endre versjonssynligheten:'''
-$1",
-'logdelete-success' => "'''Hendelsessynlighet satt.'''",
-'logdelete-failure' => "'''Loggens synlighet kunne ikke bli stilt inn:'''
-$1",
-'revdel-restore' => 'endre synlighet',
-'revdel-restore-deleted' => 'slettede revisjoner',
-'revdel-restore-visible' => 'synlige revisjoner',
-'pagehist' => 'Sidehistorikk',
-'deletedhist' => 'Slettet historikk',
-'revdelete-hide-current' => 'Feil under skjuling av objektet datert $2, $1: dette er den gjeldende revisjonen.
-Den kan ikke skjules.',
-'revdelete-show-no-access' => 'Feil under visning av objekt datert $2, $1: dette objektet har blitt markert "begrenset".
-Du har ikke tilgang til det.',
-'revdelete-modify-no-access' => 'Feil under endring av objekt datert $2, $1: dette objektet har blitt markert "begrenset".
-Du har ikke tilgang til det.',
-'revdelete-modify-missing' => 'Feil under endring av objekt ID $1: det mangler i databasen!',
-'revdelete-no-change' => "'''Advarsel:''' objektet datert $2 $1 hadde allerede synlighetsinnstillingene du forespurte.",
-'revdelete-concurrent-change' => 'Feil under endring av objektet datert $2, $1: dets status ser ut til å ha blitt endret av noen andre mens du prøvde å endre det.
-Vennligst sjekk loggen.',
-'revdelete-only-restricted' => 'Feil ved gjemming av objekt datert $2, $1: du kan ikke skjule objekt fra å vises for administratorer uten også å velge en av de andre visningsalternativene.',
-'revdelete-reason-dropdown' => '*Vanlige slettingsgrunner
-** Opphavsrettsbrudd
-** Upassende personopplysninger
-** Mulig falskt sladder',
-'revdelete-otherreason' => 'Annen/ytterligere årsak:',
-'revdelete-reasonotherlist' => 'Annen årsak',
-'revdelete-edit-reasonlist' => 'Rediger begrunnelser for sletting',
-'revdelete-offender' => 'Forfatter av denne versjonen:',
-
-# Suppression log
-'suppressionlog' => 'Sideskjulingslogg',
-'suppressionlogtext' => 'Under er en liste over sider som er slettet eller blokkert med innhold skjult fra administratorer.
-Se [[Special:BlockList|IP-blokkeringsliste]] for oversikt over aktuelle utelukkelser og blokkeringer.',
-
-# History merging
-'mergehistory' => 'Flett sidehistorikker',
-'mergehistory-header' => 'Denne siden lar deg flette historikken til to sider.
-Forsikre deg om at denne endringen vil opprettholde historisk sidekontinuitet.',
-'mergehistory-box' => 'Flett historikken til to sider:',
-'mergehistory-from' => 'Kildeside:',
-'mergehistory-into' => 'MÃ¥lside:',
-'mergehistory-list' => 'Flettbar redigeringshistorikk',
-'mergehistory-merge' => 'Følgende revisjoner av [[:$1]] kan flettes til [[:$2]]. Du kan velge å flette kun de revisjonene som kom før tidspunktet gitt i tabellen. Merk at bruk av navigasjonslenkene vil resette denne kolonnen.',
-'mergehistory-go' => 'Vis flettbare redigeringer',
-'mergehistory-submit' => 'Flett revisjoner',
-'mergehistory-empty' => 'Ingen revisjoner kan flettes.',
-'mergehistory-success' => '{{PLURAL:$3|Én revisjon|$3 revisjoner}} av [[:$1]] ble flettet til [[:$2]].',
-'mergehistory-fail' => 'Klarte ikke å utføre historikkfletting; sjekk siden og tidsparameterne igjen.',
-'mergehistory-no-source' => 'Kildesiden $1 finnes ikke.',
-'mergehistory-no-destination' => 'MÃ¥lsiden $1 finnes ikke.',
-'mergehistory-invalid-source' => 'Kildesiden må ha en gyldig tittel.',
-'mergehistory-invalid-destination' => 'Målsiden må ha en gyldig tittel.',
-'mergehistory-autocomment' => 'Flettet [[:$1]] inn i [[:$2]]',
-'mergehistory-comment' => 'Flettet [[:$1]] inn i [[:$2]]: $3',
-'mergehistory-same-destination' => 'Kilde- og målside kan ikke være den samme.',
-'mergehistory-reason' => 'Ã…rsak:',
-
-# Merge log
-'mergelog' => 'Flettingslogg',
-'pagemerge-logentry' => 'flettet [[$1]] til [[$2]] (revisjoner fram til $3)',
-'revertmerge' => 'Omgjør fletting',
-'mergelogpagetext' => 'Nedenfor er en liste over de nyligste flettingene av sidehistorikker.',
-
-# Diffs
-'history-title' => 'Revisjonshistorikk for «$1»',
-'difference-multipage' => '(Forskjell mellom sider)',
-'lineno' => 'Linje $1:',
-'compareselectedversions' => 'Sammenlign valgte revisjoner',
-'showhideselectedversions' => 'Vis/skjul valgte versjoner',
-'editundo' => 'angre',
-'diff-multi' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av {{PLURAL:$2|én bruker|$2 brukere}} vises ikke)',
-'diff-multi-manyusers' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av mer enn $2 {{PLURAL:$2|bruker|brukere}} vises ikke)',
-
-# Search results
-'searchresults' => 'Søkeresultat',
-'searchresults-title' => 'Søkeresultat for «$1»',
-'searchresulttext' => 'For mer informasjon om søking i {{SITENAME}}, se [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => "Du søkte etter '''[[:$1]]''' ([[Special:Prefixindex/$1|alle sider som begynner med «$1»]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle sider som lenker til «$1»]])",
-'searchsubtitleinvalid' => "Du søkte etter '''$1'''",
-'toomanymatches' => 'For mange mulige svar, prøv med en annen spørring',
-'titlematches' => 'Artikkeltitler med treff på forespørselen',
-'notitlematches' => 'Ingen sidetitler samsvarte med søket',
-'textmatches' => 'Artikkeltekster med treff på forespørselen',
-'notextmatches' => 'Inden sidetekst samsvarte med søket',
-'prevn' => 'forrige {{PLURAL:$1|$1}}',
-'nextn' => 'neste {{PLURAL:$1|$1}}',
-'prevn-title' => 'Forrige $1 {{PLURAL:$1|resultat|resultater}}',
-'nextn-title' => 'Neste $1 {{PLURAL:$1|resultat|resultater}}',
-'shown-title' => 'Vis $1 {{PLURAL:$1|resultat|resultater}} per side',
-'viewprevnext' => 'Vis ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-legend' => 'Søkeinnstillinger',
-'searchmenu-exists' => "* Siden '''[[$1]]'''",
-'searchmenu-new' => "'''Opprett siden ''[[:$1]]'' på denne wikien.'''",
-'searchhelp-url' => 'Help:Hjelp',
-'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Vis alle sider som begynner med dette]]',
-'searchprofile-articles' => 'Innholdssider',
-'searchprofile-project' => 'Hjelp- og prosjektsider',
-'searchprofile-images' => 'Multimedia',
-'searchprofile-everything' => 'Alt',
-'searchprofile-advanced' => 'Avansert',
-'searchprofile-articles-tooltip' => 'Søk i $1',
-'searchprofile-project-tooltip' => 'Søk i $1',
-'searchprofile-images-tooltip' => 'Søk etter filer',
-'searchprofile-everything-tooltip' => 'Søk i alt innhold (inkldert diskusjonssider)',
-'searchprofile-advanced-tooltip' => 'Søk i visse navnerom',
-'search-result-size' => '$1 ({{PLURAL:$2|ett|$2}} ord)',
-'search-result-category-size' => '{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})',
-'search-result-score' => 'Relevans: $1&nbsp;%',
-'search-redirect' => '(omdirigering $1)',
-'search-section' => '(avsnitt $1)',
-'search-suggest' => 'Mente du: $1',
-'search-interwiki-caption' => 'Søsterprosjekt',
-'search-interwiki-default' => '$1-resultat:',
-'search-interwiki-more' => '(mer)',
-'search-mwsuggest-enabled' => 'med forslag',
-'search-mwsuggest-disabled' => 'ingen forslag',
-'search-relatedarticle' => 'Relatert',
-'mwsuggest-disable' => 'Slå av AJAX-forslag',
-'searcheverything-enable' => 'Søk i alle navnerom',
-'searchrelated' => 'relatert',
-'searchall' => 'alle',
-'showingresults' => "Nedenfor vises opptil {{PLURAL:$1|'''ett''' resultat|'''$1''' resultater}} fra og med nummer <b>$2</b>.",
-'showingresultsnum' => "Nedenfor vises {{PLURAL:$3|'''ett''' resultat|'''$3''' resultater}} fra og med nummer '''$2'''.",
-'showingresultsheader' => "{{PLURAL:$5|Resultat '''$1''' av '''$3'''|Resultat '''$1 - $2''' av '''$3'''}} for '''$4'''",
-'nonefound' => "'''Merk''': Som standard søkes det kun i enkelte navnerom.
-For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler, osv), eller bruk det ønskede navnerommet som prefiks.",
-'search-nonefound' => 'Det var ingen resultater som passet til søket.',
-'powersearch' => 'Avansert søk',
-'powersearch-legend' => 'Avansert søk',
-'powersearch-ns' => 'Søk i navnerom:',
-'powersearch-redir' => 'Vis omdirigeringer',
-'powersearch-field' => 'Søk etter',
-'powersearch-togglelabel' => 'Merk:',
-'powersearch-toggleall' => 'Alle',
-'powersearch-togglenone' => 'Ingen',
-'search-external' => 'Eksternt søk',
-'searchdisabled' => 'Søkefunksjonen er slått av. Du kan søke via Google i mellomtiden. Merk at Googles indeksering av {{SITENAME}} muligens er utdatert.',
-
-# Quickbar
-'qbsettings' => 'Brukerinnstillinger for hurtigmeny.',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Fast venstre',
-'qbsettings-fixedright' => 'Fast høyre',
-'qbsettings-floatingleft' => 'Flytende venstre',
-'qbsettings-floatingright' => 'Flytende til høyre',
-'qbsettings-directionality' => '"Låst", f. eks. i posisjon "låst til venstre eller til høyre". For venstre-mot-høyre-språk vil hurtigvelgeren være satt til venstre, for høyre-mot-venstre-språk til høyre.',
-
-# Preferences page
-'preferences' => 'Innstillinger',
-'mypreferences' => 'Innstillinger',
-'prefs-edits' => 'Antall redigeringer:',
-'prefsnologin' => 'Ikke logget inn',
-'prefsnologintext' => 'Du må være <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} logget inn]</span> for å endre brukerinnstillingene.',
-'changepassword' => 'Endre passord',
-'prefs-skin' => 'Utseende',
-'skin-preview' => 'Forhåndsvisning',
-'datedefault' => 'Ingen foretrukket',
-'prefs-beta' => 'Betafunksjoner',
-'prefs-datetime' => 'Dato og tid',
-'prefs-labs' => 'Lab-funksjoner',
-'prefs-personal' => 'Brukerdata',
-'prefs-rc' => 'Siste endringer',
-'prefs-watchlist' => 'Overvåkningsliste',
-'prefs-watchlist-days' => 'Dager som skal vises i overvåkningslisten:',
-'prefs-watchlist-edits' => 'Antall redigeringer som skal vises i utvidet overvåkningsliste:',
-'prefs-watchlist-edits-max' => 'Maksimum antall: 1000',
-'prefs-watchlist-token' => 'Nøkkel for overvåkningsliste',
-'prefs-misc' => 'Diverse',
-'prefs-resetpass' => 'Endre passord',
-'prefs-email' => 'Alternativer for e-post',
-'prefs-rendering' => 'Utseende',
-'saveprefs' => 'Lagre',
-'resetprefs' => 'Tilbakestill ulagrede endringer',
-'restoreprefs' => 'Tilbakestill til standardinnstillinger overalt',
-'prefs-editing' => 'Redigering',
-'prefs-edit-boxsize' => 'Størrelse på redigeringsvinduet.',
-'rows' => 'Rader:',
-'columns' => 'Kolonner',
-'searchresultshead' => 'Søk',
-'resultsperpage' => 'Resultater per side:',
-'stub-threshold' => 'Grense for <span class="mw-stub-example">stubblenkeformatering</span>:',
-'stub-threshold-disabled' => 'Deaktivert',
-'recentchangesdays' => 'Antall dager som skal vises i siste endringer:',
-'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|dag|dager}})',
-'recentchangescount' => 'Antall redigeringer som skal vises som standard:',
-'prefs-help-recentchangescount' => 'Dette inkluderer nylige endringer, sidehistorikk og logger.',
-'prefs-help-watchlist-token' => 'Om du fyller ut dette feltet med et hemmelig tall, vil det lages en RSS-liste for overvåkningslisten din.
-Alle som vet det rette tallet vil være i stand til å lese overvåkningslisten din, så velg en sikker verdi.
-Her er et tilfeldig tall du kan bruke: $1',
-'savedprefs' => 'Innstillingene ble lagret.',
-'timezonelegend' => 'Tidssone:',
-'localtime' => 'Lokaltid:',
-'timezoneuseserverdefault' => 'Bruk wikistandard ($1)',
-'timezoneuseoffset' => 'Annet (spesifiser forskjell)',
-'timezoneoffset' => 'Forskjell¹:',
-'servertime' => 'Serverens tid er nå:',
-'guesstimezone' => 'Hent tidssone fra nettleseren',
-'timezoneregion-africa' => 'Afrika',
-'timezoneregion-america' => 'Amerika',
-'timezoneregion-antarctica' => 'Antarktis',
-'timezoneregion-arctic' => 'Arktis',
-'timezoneregion-asia' => 'Asia',
-'timezoneregion-atlantic' => 'Atlanterhavet',
-'timezoneregion-australia' => 'Australia',
-'timezoneregion-europe' => 'Europe',
-'timezoneregion-indian' => 'Det indiske hav',
-'timezoneregion-pacific' => 'Stillehavet',
-'allowemail' => 'Tillat andre å sende meg e-post',
-'prefs-searchoptions' => 'Søkealternativ',
-'prefs-namespaces' => 'Navnerom',
-'defaultns' => 'Søk ellers i disse navnerommene:',
-'default' => 'standard',
-'prefs-files' => 'Filer',
-'prefs-custom-css' => 'Personlig CSS',
-'prefs-custom-js' => 'Personlig Javascript',
-'prefs-common-css-js' => 'Delt CSS/JS for alle drakter:',
-'prefs-reset-intro' => 'Du kan bruke denne siden til å tilbakestille innstillingene dine til standardinnstillingene.
-Dette kan ikke tilbakestilles.',
-'prefs-emailconfirm-label' => 'E-postbekreftelse:',
-'prefs-textboxsize' => 'Størrelse på redigeringsvindu',
-'youremail' => 'E-post:',
-'username' => 'Brukernavn:',
-'uid' => 'Bruker-ID:',
-'prefs-memberingroups' => 'Medlem i følgende {{PLURAL:$1|gruppe|grupper}}:',
-'prefs-registration' => 'Registreringstid:',
-'yourrealname' => 'Virkelig navn:',
-'yourlanguage' => 'Språk:',
-'yourvariant' => 'Språkvariant for innhold:',
-'yournick' => 'Signatur:',
-'prefs-help-signature' => 'Kommentarer på diskusjonssider bør alltid signeres med «<nowiki>~~~~</nowiki>», som vil bli konvertert til din signatur med tidspunkt.',
-'badsig' => 'Ugyldig råsignatur; sjekk HTML-elementer.',
-'badsiglength' => 'Signaturen er for lang.
-Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
-'yourgender' => 'Kjønn:',
-'gender-unknown' => 'Uspesifisert',
-'gender-male' => 'Mann',
-'gender-female' => 'Kvinne',
-'prefs-help-gender' => 'Valgfritt: brukes for kjønnskorrekt tekst av programvaren. Denne informasjonen vil være offentlig.',
-'email' => 'E-post',
-'prefs-help-realname' => '* Virkelig navn (valgfritt): dersom du velger å oppgi navnet, vil det bli brukt til å kreditere deg for ditt arbeid.',
-'prefs-help-email' => 'Å angi e-postadresse er valgfritt, men er nødvendig for å få tilsendt nytt passord om du skulle glemme det gamle.',
-'prefs-help-email-others' => 'Du kan også velge å la andre brukere kontakte deg via brukersiden din uten å røpe identiteten din.',
-'prefs-help-email-required' => 'E-postadresse er påkrevd.',
-'prefs-info' => 'Grunnleggende informasjon',
-'prefs-i18n' => 'Internasjonalisering',
-'prefs-signature' => 'Signatur',
-'prefs-dateformat' => 'Datoformat',
-'prefs-timeoffset' => 'Tidsforskyvning',
-'prefs-advancedediting' => 'Avanserte alternativ',
-'prefs-advancedrc' => 'Avanserte alternativ',
-'prefs-advancedrendering' => 'Avanserte alternativ',
-'prefs-advancedsearchoptions' => 'Avanserte alternativ',
-'prefs-advancedwatchlist' => 'Avanserte alternativ',
-'prefs-displayrc' => 'Visningsalternativ',
-'prefs-displaysearchoptions' => 'Visningsalternativer',
-'prefs-displaywatchlist' => 'Visningsalternativer',
-'prefs-diffs' => 'Forskjeller',
-
-# User preference: e-mail validation using jQuery
-'email-address-validity-valid' => 'E-postadressen ser gyldig ut',
-'email-address-validity-invalid' => 'Skriv inn en gyldig e-postadresse',
-
-# User rights
-'userrights' => 'Brukerrettighetskontroll',
-'userrights-lookup-user' => 'Ordne brukergrupper',
-'userrights-user-editname' => 'Skriv inn et brukernavn:',
-'editusergroup' => 'Endre brukergrupper',
-'userrights-editusergroup' => 'Rediger brukergrupper',
-'saveusergroups' => 'Lagre brukergrupper',
-'userrights-groupsmember' => 'Medlem av:',
-'userrights-groupsmember-auto' => 'Implisitt medlem av:',
-'userrights-groups-help' => 'Du kan endre hvilke grupper denne brukeren er medlem av.
-* En avkrysset boks betyr at brukeren er medlem av gruppen.
-* En uavkrysset boks betyr at brukeren ikke er medlem av gruppen.
-* En * betyr at du ikke kan fjerne gruppemedlemskapet når du har lagt det til, eller vice versa.',
-'userrights-reason' => 'Ã…rsak:',
-'userrights-no-interwiki' => 'Du har ikke tillatelse til å endre brukerrettigheter på andre wikier.',
-'userrights-nodatabase' => 'Databasen $1 finnes ikke, eller er ikke lokal.',
-'userrights-nologin' => 'Du må [[Special:UserLogin|logge inn]] med en administratorkonto for å endre brukerrettigheter.',
-'userrights-notallowed' => 'Kontoen din har ikke tillatelse til å legge til eller fjerne brukerrettigheter.',
-'userrights-changeable-col' => 'Grupper du kan endre',
-'userrights-unchangeable-col' => 'Grupper du ikke kan endre',
-'userrights-irreversible-marker' => '$1 *',
-
-# Groups
-'group' => 'Gruppe:',
-'group-user' => 'Brukere',
-'group-autoconfirmed' => 'Autobekreftede brukere',
-'group-bot' => 'Roboter',
-'group-sysop' => 'Administratorer',
-'group-bureaucrat' => 'Byråkrater',
-'group-suppress' => 'Sidefjernere',
-'group-all' => '(alle)',
-
-'group-user-member' => 'bruker',
-'group-autoconfirmed-member' => 'autobekreftet bruker',
-'group-bot-member' => 'robot',
-'group-sysop-member' => 'administrator',
-'group-bureaucrat-member' => 'byråkrat',
-'group-suppress-member' => 'revisjonsfjerner',
-
-'grouppage-user' => '{{ns:project}}:Brukere',
-'grouppage-autoconfirmed' => '{{ns:project}}:Autobekreftede brukere',
-'grouppage-bot' => '{{ns:project}}:Roboter',
-'grouppage-sysop' => '{{ns:project}}:Administratorer',
-'grouppage-bureaucrat' => '{{ns:project}}:Byråkrater',
-'grouppage-suppress' => '{{ns:project}}:Historikkrydding',
-
-# Rights
-'right-read' => 'Se sider',
-'right-edit' => 'Redigere sider',
-'right-createpage' => 'Opprette sider (som ikke er diskusjonssider)',
-'right-createtalk' => 'Opprette diskusjonssider',
-'right-createaccount' => 'Opprette nye kontoer',
-'right-minoredit' => 'Marker endringer som mindre',
-'right-move' => 'Flytte sider',
-'right-move-subpages' => 'Flytte sider med undersider',
-'right-move-rootuserpages' => 'Flytte hovedbrukersider',
-'right-movefile' => 'Flytte filer',
-'right-suppressredirect' => 'Behøver ikke å opprette omdirigeringer ved sideflytting',
-'right-upload' => 'Laste opp filer',
-'right-reupload' => 'Skrive over eksisterende filer',
-'right-reupload-own' => 'Skrive over egne filer',
-'right-reupload-shared' => 'Skrive over delte filer lokalt',
-'right-upload_by_url' => 'Laste opp en fil via URL',
-'right-purge' => 'Rense mellomlageret for sider',
-'right-autoconfirmed' => 'Redigere halvlåste sider',
-'right-bot' => 'Bli behandlet som en automatisk prosess',
-'right-nominornewtalk' => 'Får ikke «Du har nye meldinger»-beskjeden ved mindre endringer på diskusjonsside',
-'right-apihighlimits' => 'Bruke API med høyere grenser',
-'right-writeapi' => 'Redigere via API',
-'right-delete' => 'Slette sider',
-'right-bigdelete' => 'Slette sider med stor historikk',
-'right-deleterevision' => 'Slette og gjenopprette enkeltrevisjoner av sider',
-'right-deletedhistory' => 'Se slettet sidehistorikk uten tilhørende sidetekst',
-'right-deletedtext' => 'Vis slettet tekst og endringer mellom slettede versjoner',
-'right-browsearchive' => 'Søke i slettede sider',
-'right-undelete' => 'Gjenopprette sider',
-'right-suppressrevision' => 'Se og gjenopprette skjulte siderevisjoner',
-'right-suppressionlog' => 'Se private logger',
-'right-block' => 'Blokkere andre brukere fra å redigere',
-'right-blockemail' => 'Blokkere brukere fra å sende e-post',
-'right-hideuser' => 'Blokkere et brukernavn og skjule det fra det offentlige',
-'right-ipblock-exempt' => 'Kan redigere fra blokkerte IP-adresser',
-'right-proxyunbannable' => 'Kan redigere fra blokkerte proxyer',
-'right-unblockself' => 'Fjern blokkering av seg selv',
-'right-protect' => 'Endre beskyttelsesnivåer',
-'right-editprotected' => 'Redigere beskyttede sider',
-'right-editinterface' => 'Redigere brukergrensesnittet',
-'right-editusercssjs' => 'Redigere andre brukeres CSS- og JS-filer',
-'right-editusercss' => 'Redigere andre brukeres CSS-filer',
-'right-edituserjs' => 'Redigere andre brukeres JS-filer',
-'right-rollback' => 'Raskt tilbakestille den siste brukeren som har redigert en gitt side',
-'right-markbotedits' => 'Markere tilbakestillinger som robotredigeringer',
-'right-noratelimit' => 'PÃ¥virkes ikke av hastighetsgrenser',
-'right-import' => 'Importere sider fra andre wikier',
-'right-importupload' => 'Importere sider via opplasting',
-'right-patrol' => 'Markere redigeringer som patruljerte',
-'right-autopatrol' => 'FÃ¥r sine egne redigeringer merket som patruljerte',
-'right-patrolmarks' => 'Bruke patruljeringsfunksjoner i siste endringer',
-'right-unwatchedpages' => 'Se listen over uovervåkede sider',
-'right-mergehistory' => 'Flette sidehistorikker',
-'right-userrights' => 'Redigere alle brukerrettigheter',
-'right-userrights-interwiki' => 'Redigere rettigheter for brukere på andre wikier',
-'right-siteadmin' => 'Låse og låse opp databasen',
-'right-override-export-depth' => 'Eksporter sider inkludert lenkede sider til en dypde på 5',
-'right-sendemail' => 'Send e-post til andre brukere',
-
-# User rights log
-'rightslog' => 'Brukerrettighetslogg',
-'rightslogtext' => 'Dette er en logg over forandringer i brukerrettigheter.',
-'rightslogentry' => 'endret gruppe for $1 fra $2 til $3',
-'rightslogentry-autopromote' => 'ble automatisk forfremmet fra $2 til $3',
-'rightsnone' => '(ingen)',
-
-# Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'se denne siden',
-'action-edit' => 'redigere denne siden',
-'action-createpage' => 'opprette sider',
-'action-createtalk' => 'opprette diskusjonssider',
-'action-createaccount' => 'opprette denne kontoen',
-'action-minoredit' => 'merke denne redigeringen som mindre',
-'action-move' => 'flytte denne siden',
-'action-move-subpages' => 'flytte denne siden og dens undersider',
-'action-move-rootuserpages' => 'flytte hovedbrukersider',
-'action-movefile' => 'flytte denne filen',
-'action-upload' => 'laste opp denne filen',
-'action-reupload' => 'overskrive den nåværende filen',
-'action-reupload-shared' => 'overskrive denne filen på fellesdatabasen',
-'action-upload_by_url' => 'laste opp denne filen fra en URL',
-'action-writeapi' => 'bruke skrive-API-en',
-'action-delete' => 'slette denne siden',
-'action-deleterevision' => 'slette denne revisjonen',
-'action-deletedhistory' => 'se denne sidens slettede historikk',
-'action-browsearchive' => 'søke i slettede sider',
-'action-undelete' => 'gjenopprette denne siden',
-'action-suppressrevision' => 'se og gjenopprette denne skjulte revisjonen',
-'action-suppressionlog' => 'se denne private loggen',
-'action-block' => 'blokkere denne brukeren fra å redigere',
-'action-protect' => 'endre denne sidens beskyttelsesnivåer',
-'action-import' => 'importere denne siden fra en annen wiki',
-'action-importupload' => 'importere denne siden fra en opplastet fil',
-'action-patrol' => 'merke andre brukeres redigeringer som patruljert',
-'action-autopatrol' => 'merke redigeringene dine som patruljert',
-'action-unwatchedpages' => 'vise listen over uovervåkede sider',
-'action-mergehistory' => 'flette sidens historikk',
-'action-userrights' => 'redigere alle brukerrettigheter',
-'action-userrights-interwiki' => 'endre brukerrettigheter for brukere på andre wikier',
-'action-siteadmin' => 'låse eller låse opp databasen',
-
-# Recent changes
-'nchanges' => '$1 {{PLURAL:$1|endring|endringer}}',
-'recentchanges' => 'Siste endringer',
-'recentchanges-legend' => 'Alternativ for siste endringer',
-'recentchanges-summary' => 'Vis de siste endringene til denne siden',
-'recentchanges-feed-description' => 'Følg med på siste endringer i denne wikien med denne matingen.',
-'recentchanges-label-newpage' => 'Denne redigeringen opprettet en ny side',
-'recentchanges-label-minor' => 'Dette er en mindre endring',
-'recentchanges-label-bot' => 'Denne redigeringen ble gjort av en bot',
-'recentchanges-label-unpatrolled' => 'Denne redigeringen har ikke blitt patruljert ennå',
-'rcnote' => "Nedenfor vises {{PLURAL:$1|'''1''' endring|de siste '''$1''' endringene}} fra {{PLURAL:$2|det siste døgnet|de siste '''$2''' døgnene}}, per $5 $4.",
-'rcnotefrom' => "Nedenfor er endringene fra '''$2''' (opp til '''$1''' vises).",
-'rclistfrom' => 'Vis nye endringer med start fra $1',
-'rcshowhideminor' => '$1 mindre endringer',
-'rcshowhidebots' => '$1 roboter',
-'rcshowhideliu' => '$1 innloggede brukere',
-'rcshowhideanons' => '$1 anonyme brukere',
-'rcshowhidepatr' => '$1 godkjente endringer',
-'rcshowhidemine' => '$1 mine endringer',
-'rclinks' => 'Vis siste $1 endringer i de siste $2 dagene<br />$3',
-'diff' => 'diff',
-'hist' => 'hist',
-'hide' => 'Skjul',
-'show' => 'Vis',
-'minoreditletter' => 'm',
-'newpageletter' => 'N',
-'boteditletter' => 'b',
-'number_of_watching_users_pageview' => '[$1 overvåkende {{PLURAL:$1|bruker|brukere}}]',
-'rc_categories' => 'Begrens til kategorier (skilletegn: «|»)',
-'rc_categories_any' => 'Alle',
-'newsectionsummary' => '/* $1 */ ny seksjon',
-'rc-enhanced-expand' => 'Vis detaljer (krever JavaScript)',
-'rc-enhanced-hide' => 'Skjul detaljer',
-
-# Recent changes linked
-'recentchangeslinked' => 'Relaterte endringer',
-'recentchangeslinked-feed' => 'Relaterte endringer',
-'recentchangeslinked-toolbox' => 'Relaterte endringer',
-'recentchangeslinked-title' => 'Endringer relatert til «$1»',
-'recentchangeslinked-noresult' => 'Ingen endringer på lenkede sider i den gitte perioden.',
-'recentchangeslinked-summary' => "Dette er en liste over de siste endringene på sidene lenket fra en spesifisert side (eller til meldlemmer av en spesifisert kategori).
-Sider på [[Special:Watchlist|overvåkningslisten din]] er i '''fet skrift'''.",
-'recentchangeslinked-page' => 'Sidenavn:',
-'recentchangeslinked-to' => 'Vis endringer på sider som lenker til den gitte siden istedet',
-
-# Upload
-'upload' => 'Last opp fil',
-'uploadbtn' => 'Last opp fil',
-'reuploaddesc' => 'Avbryt opplasting og gå tilbake til opplastingsskjemaet',
-'upload-tryagain' => 'Send inn endret filbeskrivelse',
-'uploadnologin' => 'Ikke logget inn',
-'uploadnologintext' => 'Du må være [[Special:UserLogin|logget inn]] for å kunne laste opp filer.',
-'upload_directory_missing' => 'Oppplastingsmappen ($1) mangler og kunne ikke opprettes av tjeneren.',
-'upload_directory_read_only' => 'Opplastingsmappa ($1) er ikke skrivbar for tjeneren.',
-'uploaderror' => 'Feil under opplasting av fil',
-'upload-recreate-warning' => "'''Advarsel: En fil med det navnet har blitt slettet eller flyttet.'''
-
-Slette- og flytteloggen for denne siden gjengis her:",
-'uploadtext' => "Bruk skjemaet nedenfor for å laste opp filer.
-For å se eller søke i eksisterende filer, gå til [[Special:FileList|listen over filer]]. Opplastinger lagres også i [[Special:Log/upload|opplastingsloggen]].
-
-For å inkludere en fil på en side, bruk en slik lenke:
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}:Filnavn.jpg<nowiki>]]</nowiki></tt>''' for å bruke bildet i opprinnelig form
-*'''<tt><nowiki>[[</nowiki>{{ns:file}}:Filnavn.png|200px|thumb|left|Alternativ tekst<nowiki>]]</nowiki></tt>''' for å bruke bildet med en bredde på 200&nbsp;piksler, venstrestilt og med «Alternativ tekst» som beskrivelse
-*'''<tt><nowiki>[[</nowiki>{{ns:media}}:Filnavn.ogg<nowiki>]]</nowiki></tt>''' for å lenke direkte til filen uten å vise den",
-'upload-permitted' => 'Tillatte filtyper: $1.',
-'upload-preferred' => 'Foretrukne filtyper: $1',
-'upload-prohibited' => 'Forbudte filtyper: $1.',
-'uploadlog' => 'opplastingslogg',
-'uploadlogpage' => 'Opplastingslogg',
-'uploadlogpagetext' => 'Her er en liste over de siste opplastede filene.
-Se [[Special:NewFiles|galleriet over nye filer]] for en mer visuell visning',
-'filename' => 'Filnavn',
-'filedesc' => 'Beskrivelse',
-'fileuploadsummary' => 'Beskrivelse:',
-'filereuploadsummary' => 'Filendringer:',
-'filestatus' => 'Opphavsrettsstatus:',
-'filesource' => 'Kilde:',
-'uploadedfiles' => 'Filer som er lastet opp',
-'ignorewarning' => 'Ignorer advarselen og lagre filen likevel',
-'ignorewarnings' => 'Ignorer eventuelle advarsler',
-'minlength1' => 'Filnavn må være på minst én bokstav.',
-'illegalfilename' => 'Filnavnet «$1» inneholder ugyldige tegn. Gi filen et nytt navn og prøv igjen.',
-'badfilename' => 'Navnet på filen er blitt endret til «$1».',
-'filetype-mime-mismatch' => 'Filendelsen «.$1» tilsvarer ikke MIME-typen som oppgis i filen ($2).',
-'filetype-badmime' => 'Filer av typen «$1» kan ikke lastes opp.',
-'filetype-bad-ie-mime' => 'Kan ikke laste opp denne filen fordi Internet Explorer ville detektert denne som «$1», noe som er ikke er tillatt, og en potensielt farlig filtype.',
-'filetype-unwanted-type' => "'''«.$1»''' er en uønsket filtype.
-{{PLURAL:$3|Foretrukken filtype|Foretrukne filtyper}} er $2.",
-'filetype-banned-type' => "{{PLURAL:$4|Filtypen|Filtypene}} '''«.$1»''' er ikke {{PLURAL:$4|tillatt|tillatte}}.
-{{PLURAL:$3|Tillatt filtype|Tillatte filtyper}} er $2.",
-'filetype-missing' => 'Filen har ingen endelse (som «.jpg»).',
-'empty-file' => 'Filen du sendte inn var tom.',
-'file-too-large' => 'Filen du sendte inn var for stor.',
-'filename-tooshort' => 'Filnavnet er for kort.',
-'filetype-banned' => 'Denne filtypen er forbudt.',
-'verification-error' => 'Denne filen bestod ikke filbekreftelsen.',
-'hookaborted' => 'Endringene du prøvde å gjøre ble avbrutt av en utvidelseskrok.',
-'illegal-filename' => 'Filnavnet er ikke tillatt.',
-'overwrite' => 'Overskriving av eksisterende filer er ikke tillatt.',
-'unknown-error' => 'En ukjent feil oppsto.',
-'tmp-create-error' => 'Kunne ikke opprette midlertidig fil.',
-'tmp-write-error' => 'Feil ved skriving av midlertidig fil.',
-'large-file' => 'Det er anbefalt at filen ikke er større enn $1; denne filen er $2.',
-'largefileserver' => 'Denne filen er større enn det tjeneren er satt opp til å tillate.',
-'emptyfile' => 'Filen du lastet opp ser ut til å være tom. Dette kan komme av en skrivefeil i filnavnet. Sjekk om du virkelig vil laste opp denne filen.',
-'windows-nonascii-filename' => 'Denne wikien støtter ikke filnavn med spesialtegn.',
-'fileexists' => "Ei fil med dette navnet finnes allerede.
-Sjekk '''<tt>[[:$1]]</tt>''' hvis du ikke er sikker på at du vil forandre den.
-[[$1|thumb]]",
-'filepageexists' => "Beskrivelsessiden for denne filen finnes allerede på '''<tt>[[:$1]]</tt>''', men ingen filer med dette navnet finnes. Sammendraget du skruver inn vil ikke vises på beskrivelsessiden. For at det skal dukke opp der må du skrive det inn manuelt etter å da lastet opp filen.
-[[$1|thumb]]",
-'fileexists-extension' => "En fil med et lignende navn finnes: [[$2|thumb]]
-* Navnet på din fil: '''<tt>[[:$1]]</tt>'''
-* Navn på eksisterende fil: '''<tt>[[:$2]]</tt>'''
-Velg et annet filnavn.",
-'fileexists-thumbnail-yes' => "Filen ser ut til å være et bilde av redusert størrelse. [[$1|thumb]]
-Vennligst sjekk filen '''<tt>[[:$1]]</tt>'''.
-Om filen du sjekket er det samme bildet, men i opprinnelig størrelse, er det ikke nødvendig å laste opp en ekstra fil.",
-'file-thumbnail-no' => "Filnavnet begynner med '''<tt>$1</tt>'''.
-Det virker som om det er et bilde av redusert størrelse ''(miniatyrbilde)''.
-Om du har dette bildet i stor utgave, last opp det, eller endre filnavnet på denne filen.",
-'fileexists-forbidden' => 'En fil med dette navnet finnes fra før, og kan ikke erstattes.
-Om du fortsatt ønsker å laste opp filen, gå tilbake og last den opp under et nytt navn. [[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'Ei fil med dette navnet finnes fra før i det delte fillageret.
-Om du fortsatt ønsker å laste opp filen, gå tilbake og last den opp under et nytt navn. [[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'Denne filen er en dublett av følgende {{PLURAL:$1|fil|filer}}:',
-'file-deleted-duplicate' => 'En fil identisk med denne filen ([[:$1]]) har tidligere blitt slettet. Du bør sjekke denne filens slettehistorikk før du prøver å laste den opp på nytt.',
-'uploadwarning' => 'Opplastingsadvarsel',
-'uploadwarning-text' => 'Vennligst endre filbeskrivelsen nedenfor og prøv igjen.',
-'savefile' => 'Lagre fil',
-'uploadedimage' => 'lastet opp «[[$1]]»',
-'overwroteimage' => 'last opp en ny versjon av «[[$1]]»',
-'uploaddisabled' => 'Opplastingsfunksjonen er slått av',
-'copyuploaddisabled' => 'Opplasting via nettadresse deaktivert.',
-'uploadfromurl-queued' => 'Opplastingen din har blitt satt i kø.',
-'uploaddisabledtext' => 'Opplasting er slått av.',
-'php-uploaddisabledtext' => 'PHP-filopplasting er deaktivert. Sjekk innstillingen for file_uploads.',
-'uploadscripted' => 'Denne filen inneholder HTML eller skripting som kan feiltolkes av en nettleser.',
-'uploadvirus' => 'Denne filen inneholder virus! Detaljer: $1',
-'uploadjava' => 'Filen er en ZIP-fil som inneholder en Java-fil av typen .class.
-Det er ikke tillatt å laste opp Java-filer, fordi de kan omgå sikkerhetsrestriksjoner.',
-'upload-source' => 'Kildefil',
-'sourcefilename' => 'Velg en fil:',
-'sourceurl' => 'Kildens URL:',
-'destfilename' => 'Ønsket filnavn:',
-'upload-maxfilesize' => 'Maksimal filstørrelse: $1',
-'upload-description' => 'Filbeskrivelse',
-'upload-options' => 'Opplastingsvalg',
-'watchthisupload' => 'Overvåk denne filen',
-'filewasdeleted' => 'Ei fil ved dette navnet har blitt lastet opp tidligere, og så slettet. Sjekk $1 før du forsøker å laste det opp igjen.',
-'filename-bad-prefix' => "Navnet på filen du laster opp begynner med '''«$1»''', hvilket er et ikke-beskrivende navn som vanligvis brukes automatisk av digitalkameraer. Vennligst bruk et mer beskrivende navn på filen.",
-'filename-prefix-blacklist' => ' #<!-- leave this line exactly as it is --> <pre>
-# Syntaksen er som følger:
-# * Alt fra tegnet «#» til slutten av linja er en kommentar
-# * Alle linjer som ikke er blanke er et prefiks som vanligvis brukes automatisk av digitale kameraer
-CIMG # Casio
-DSC_ # Nikon
-DSCF # Fuji
-DSCN # Nikon
-DUW # noen mobiltelefontyper
-IMG # generisk
-JD # Jenoptik
-MGP # Pentax
-PICT # div.
- #</pre> <!-- leave this line exactly as it is -->',
-'upload-success-subj' => 'Opplastingen er gjennomført',
-'upload-success-msg' => 'Din opplasting fra [$2] var vellykket. Den er tilgjengelig her: [[:{{ns:file}}:$1]]',
-'upload-failure-subj' => 'Opplastingsproblem',
-'upload-failure-msg' => 'Det oppsto et problem med opplastingen din fra [$2]:
-
-$1',
-'upload-warning-subj' => 'Opplastingsadvarsel',
-'upload-warning-msg' => 'Det oppsto et problem med opplastingen din fra [$2]. Du kan gå tilbake til [[Special:Upload/stash/$1|opplastingsskjemaet]] for å løse dette problemet.',
-
-'upload-proto-error' => 'Gal protokoll',
-'upload-proto-error-text' => 'Fjernopplasting behøver adresser som begynner med <code>http://</code> eller <code>ftp://</code>.',
-'upload-file-error' => 'Intern feil',
-'upload-file-error-text' => 'En intern feil oppsto under forsøk på å lage en midlertidig fil på tjeneren. Vennligst kontakt en [[Special:ListUsers/sysop|administrator]].',
-'upload-misc-error' => 'Ukjent opplastingsfeil',
-'upload-misc-error-text' => 'En ukjent feil forekom under opplastingen.
-Bekreft at adressen er gyldig og tilgjengelig, og prøv igjen.
-Om problemet fortsetter, kontakt en [[Special:ListUsers/sysop|administrator]].',
-'upload-too-many-redirects' => 'URL-en inneholdt for mange omdirigeringer',
-'upload-unknown-size' => 'Ukjent størrelse',
-'upload-http-error' => 'En HTTP-feil oppstod: $1',
-
-# ZipDirectoryReader
-'zip-file-open-error' => 'Det oppsto en feil under åpning av filen for ZIP-sjekking.',
-'zip-wrong-format' => 'Den angitte filen var ikke en ZIP-fil.',
-'zip-bad' => 'Filen er en skadd eller på annen måte uleselig ZIP-fil.
-Den kan ikke sikkerhetskontrolleres.',
-'zip-unsupported' => 'Filen er en ZIP-fil som bruker funksjoner som ikke støttes av MediaWiki.
-Den kan ikke sikkerhetskontrolleres.',
-
-# Special:UploadStash
-'uploadstash' => 'Last opp stash',
-'uploadstash-summary' => 'Denne siden gir tilgang til filer som har blitt lastet opp (eller er i ferd med å bli lastet opp) men som ennå ikke er publisert til wikien. Disse filene er ikke synlige for andre enn brukeren som lastet dem opp.',
-'uploadstash-clear' => 'Fjern stashede filer',
-'uploadstash-nofiles' => 'Du har ingen stashede filer.',
-'uploadstash-badtoken' => 'Utføringen av den handlingen var mislykket, kanskje fordi dine redigeringsrettigheter har utløpt. Prøv igjen.',
-'uploadstash-errclear' => 'Fjerning av filene var mislykket.',
-'uploadstash-refresh' => 'Oppdater listen over filer',
-
-# img_auth script messages
-'img-auth-accessdenied' => 'Ingen tilgang',
-'img-auth-nopathinfo' => 'Manglende PATH_INFO.
-Tjeneren din er ikke satt opp til å gi denne informasjonen.
-Den er kanskje CGI-basert og støtter ikke img_auth.
-[//www.mediawiki.org/wiki/Manual:Image_Authorization Se bildeautorisasjon.]',
-'img-auth-notindir' => 'Den ønskede stien finnes ikke i den oppsatte opplastingsmappa.',
-'img-auth-badtitle' => 'Kunne ikke lage en gyldig tittel ut fra «$1».',
-'img-auth-nologinnWL' => 'Du er ikke logget inn, og «$1» er ikke på hvitelista.',
-'img-auth-nofile' => 'Filen «$1» finnes ikke.',
-'img-auth-isdir' => 'Du prøver å få tilgang til mappa «$1».
-Kun filtilgang tillates.',
-'img-auth-streaming' => 'Sender «$1».',
-'img-auth-public' => 'Funksjonen til img_auth.php er å lage filer fra en privat wiki.
-Denne wikien er satt opp som en offentlig wiki.
-For best mulig sikkerhet er img_auth.php slått av.',
-'img-auth-noread' => 'Brukeren har ikke tilgang til å lese «$1».',
-'img-auth-bad-query-string' => 'URL-en har en ugyldig spørrestreng.',
-
-# HTTP errors
-'http-invalid-url' => 'Ugyldig internettadresse: $1',
-'http-invalid-scheme' => 'Internettadresser med «$1»-formen støttes ikke',
-'http-request-error' => 'HTTP-forespørselen feilet på grunn av en ukjent feil.',
-'http-read-error' => 'HTTP-lesefeil.',
-'http-timed-out' => 'Tidsavbrudd på HTTP-forespørsel.',
-'http-curl-error' => 'Feil under henting av adresse: $1',
-'http-host-unreachable' => 'Kunne ikke nå adressen.',
-'http-bad-status' => 'Det var et problem under HTTP-forespørselen: $1 $2',
-
-# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
-'upload-curl-error6' => 'Kunne ikke nå adressen',
-'upload-curl-error6-text' => 'Adressen kunne ikke nås. Vennligst dobbelsjekk at adressen er korrekt og at siden er oppe.',
-'upload-curl-error28' => 'Opplastingstimeout',
-'upload-curl-error28-text' => 'Siden brukte for lang tid på å reagere. Vennligst sjekk at siden er oppe, og vent en kort stund for du prøver igjen. Vurder å prøve på en mindre hektisk tid.',
-
-'license' => 'Lisens:',
-'license-header' => 'Lisensiering',
-'nolicense' => 'Ingen spesifisert',
-'license-nopreview' => '(Forhåndsvisning ikke tilgjengelig)',
-'upload_source_url' => ' (en gyldig, offentlig tilgjengelig adresse)',
-'upload_source_file' => ' (en fil på din datamaskin)',
-
-# Special:ListFiles
-'listfiles-summary' => 'Denne spesialsiden viser alle opplastede filer.
-NÃ¥r den filtreres av en bruker, vises bare de sist opplastede versjonene av filen.',
-'listfiles_search_for' => 'Søk etter filnavn:',
-'imgfile' => 'fil',
-'listfiles' => 'Filliste',
-'listfiles_thumb' => 'Miniatyrbilde',
-'listfiles_date' => 'Dato',
-'listfiles_name' => 'Navn',
-'listfiles_user' => 'Bruker',
-'listfiles_size' => 'Størrelse (bytes)',
-'listfiles_description' => 'Beskrivelse',
-'listfiles_count' => 'Versjoner',
-
-# File description page
-'file-anchor-link' => 'Fil',
-'filehist' => 'Filhistorikk',
-'filehist-help' => 'Klikk på en dato/klokkeslett for å se filen slik den var da.',
-'filehist-deleteall' => 'slett alt',
-'filehist-deleteone' => 'slett',
-'filehist-revert' => 'tilbakestill',
-'filehist-current' => 'nåværende',
-'filehist-datetime' => 'Dato/tid',
-'filehist-thumb' => 'Miniatyrbilde',
-'filehist-thumbtext' => 'Miniatyrbilde av versjonen fra $1',
-'filehist-nothumb' => 'Intet miniatyrbilde',
-'filehist-user' => 'Bruker',
-'filehist-dimensions' => 'Dimensjoner',
-'filehist-filesize' => 'Filstørrelse',
-'filehist-comment' => 'Kommentar',
-'filehist-missing' => 'Fil mangler',
-'imagelinks' => 'Filbruk',
-'linkstoimage' => 'Følgende {{PLURAL:$1|side|$1 sider}} har lenker til denne filen:',
-'linkstoimage-more' => 'Mer enn $1 {{PLURAL:$1|side|sider}} lenker til denne filen.
-Følgende liste viser {{PLURAL:$1|den første siden|de $1 første sidene}}.
-En [[Special:WhatLinksHere/$2|fullstendig liste]] er tilgjengelig.',
-'nolinkstoimage' => 'Det er ingen sider som bruker denne filen.',
-'morelinkstoimage' => 'Vis [[Special:WhatLinksHere/$1|flere lenker]] til denne filen.',
-'linkstoimage-redirect' => '$1 (filomdirigering) $2',
-'duplicatesoffile' => 'Følgende {{PLURAL:$1|fil er en dublett|filer er dubletter}} av denne filen ([[Special:FileDuplicateSearch/$2|fler detaljer]]):',
-'sharedupload' => 'Denne filen er fra $1 og kan bli brukt av andre prosjekter.',
-'sharedupload-desc-there' => 'Denne filen er fra $1 og kan brukes på andre prosjekter.
-Se [$2 filbeskrivelsessida] for mer informasjon.',
-'sharedupload-desc-here' => 'Denne filen er fra $1 og kan brukes av andre prosjekter.
-Beskrivelsen fra [$2 filbeskrivelsessida] vises nedenfor.',
-'filepage-nofile' => 'Det finnes ingen fil med dette navnet.',
-'filepage-nofile-link' => 'Ingen fil med dette navnet eksisterer, men du kan [$1 laste den opp].',
-'uploadnewversion-linktext' => 'Last opp en ny versjon av denne filen',
-'shared-repo-from' => 'fra $1',
-'shared-repo' => 'et delt fillager',
-
-# File reversion
-'filerevert' => 'Tilbakestill $1',
-'filerevert-legend' => 'Tilbakestill fil',
-'filerevert-intro' => "Du tilbakestiller '''[[Media:$1|$1]]''' til [$4 versjonen à $2, $3].",
-'filerevert-comment' => 'Ã…rsak:',
-'filerevert-defaultcomment' => 'Tilbakestilte til versjonen à $1, $2',
-'filerevert-submit' => 'Tilbakestill',
-'filerevert-success' => "'''[[Media:$1|$1]]''' ble tilbakestilt til [$4 versjonen à $2, $3].",
-'filerevert-badversion' => 'Det er ingen tidligere lokal versjon av denne filen med det gitte tidstrykket.',
-
-# File deletion
-'filedelete' => 'Slett $1',
-'filedelete-legend' => 'Slett fil',
-'filedelete-intro' => "Du er i ferd med å slette filen '''[[Media:$1|$1]]''' sammen med hele dens historikk.",
-'filedelete-intro-old' => "Du sletter versjonen av '''[[Media:$1|$1]]''' à [$4 $3, $2].",
-'filedelete-comment' => 'Ã…rsak:',
-'filedelete-submit' => 'Slett',
-'filedelete-success' => "'''$1''' ble slettet.",
-'filedelete-success-old' => "Versjonen av '''[[Media:$1|$1]]''' à $3, $2 ble slettet.",
-'filedelete-nofile' => "'''$1''' finnes ikke.",
-'filedelete-nofile-old' => "Det er ingen arkivert versjon av '''$1''' med de gitte attributtene.",
-'filedelete-otherreason' => 'Annen/utdypende grunn:',
-'filedelete-reason-otherlist' => 'Annen grunn',
-'filedelete-reason-dropdown' => '*Vanlige slettingsgrunner
-** Opphavsrettsbrudd
-** Duplikatfil',
-'filedelete-edit-reasonlist' => 'Rediger begrunnelser for sletting',
-'filedelete-maintenance' => 'Sletting og gjenoppretting av filer er midlertidig slått av på grunn av vedlikehold.',
-
-# MIME search
-'mimesearch' => 'MIME-søk',
-'mimesearch-summary' => 'Denne siden muliggjør filtrering av filer per MIME-type. Skriv inn: innholdstype/undertype, for eksempel <tt>image/jpeg</tt>.',
-'mimetype' => 'MIME-type:',
-'download' => 'last ned',
-
-# Unwatched pages
-'unwatchedpages' => 'Sider som ikke er overvåket',
-
-# List redirects
-'listredirects' => 'Liste over omdirigeringer',
-
-# Unused templates
-'unusedtemplates' => 'Ubrukte maler',
-'unusedtemplatestext' => 'Denne siden lister opp alle sider i malnavnerommet ({{ns:template}}:) som ikke er inkludert på en annen side. Husk å sjekke for andre slags lenker til malen før du sletter den.',
-'unusedtemplateswlh' => 'andre lenker',
-
-# Random page
-'randompage' => 'Tilfeldig side',
-'randompage-nopages' => 'Det er ingen sider i {{PLURAL:$2|det følgende navnrommet|de følgende navnrommene}}: $1.',
-
-# Random redirect
-'randomredirect' => 'Tilfeldig omdirigering',
-'randomredirect-nopages' => 'Det er ingen omdirigeringer i navnerommet $1.',
-
-# Statistics
-'statistics' => 'Statistikk',
-'statistics-header-pages' => 'Sidestatistikk',
-'statistics-header-edits' => 'Redigeringsstatistikk',
-'statistics-header-views' => 'Visningsstatistikk',
-'statistics-header-users' => 'Brukerstatistikk',
-'statistics-header-hooks' => 'Øvrig statistikk',
-'statistics-articles' => 'Innholdssider',
-'statistics-pages' => 'Sider',
-'statistics-pages-desc' => 'Alle sider på wikien, inkludert diskusjonssider, omdirigeringer o.l.',
-'statistics-files' => 'Opplastede filer',
-'statistics-edits' => 'Redigeringer siden {{SITENAME}} ble opprettet',
-'statistics-edits-average' => 'Gjennomsnittlig antall redigeringer per side',
-'statistics-views-total' => 'Totalt antall visninger',
-'statistics-views-total-desc' => 'Visninger av ikke-eksisterende sider og spesielsider inkluderes ikke',
-'statistics-views-peredit' => 'Visninger per redigering',
-'statistics-users' => 'Registrerte [[Special:ListUsers|brukere]]',
-'statistics-users-active' => 'Aktive brukere',
-'statistics-users-active-desc' => 'Brukere som har utført handlinger {{PLURAL:$1|det siste døgnet|de siste $1 dagene}}',
-'statistics-mostpopular' => 'Mest viste sider',
-
-'disambiguations' => 'Sider som lenker til artikler med flertydige titler',
-'disambiguationspage' => 'Template:Peker',
-'disambiguations-text' => "Følgende sider lenker til en '''pekerside'''.
-De burde i stedet lenke til en passende innholdsside.<br />
-En side anses om en pekerside om den inneholder en mal som det lenkes til fra [[MediaWiki:Disambiguationspage]]",
-
-'doubleredirects' => 'Doble omdirigeringer',
-'doubleredirectstext' => 'Denne siden lister opp de sidene som er omdirigeringer til andre omdirigeringssider.
-Hver rad inneholder lenker til første og andre omdirigering, samt målet for den andre omdirigeringen, som vanligvis er den «virkelige» målsiden som den første omdirigeringen burde peke til.
-<del>Gjennomstrøkne</del> sider har blitt fikset.',
-'double-redirect-fixed-move' => '[[$1]] har blitt flyttet, og er nå en omdirigering til [[$2]]',
-'double-redirect-fixed-maintenance' => 'Fikser dobbel omdirigering fra [[$1]] til [[$2]].',
-'double-redirect-fixer' => 'Omdirigeringsfikser',
-
-'brokenredirects' => 'Brutte omdirigeringer',
-'brokenredirectstext' => 'Følgende omdirigeringer peker til ikkeeksisterende sider:',
-'brokenredirects-edit' => 'rediger',
-'brokenredirects-delete' => 'slett',
-
-'withoutinterwiki' => 'Sider uten språklenker',
-'withoutinterwiki-summary' => 'Følgende sider lenker ikke til andre språkversjoner:',
-'withoutinterwiki-legend' => 'Prefiks',
-'withoutinterwiki-submit' => 'Vis',
-
-'fewestrevisions' => 'Artikler med færrest revisjoner',
-
-# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
-'ncategories' => '$1 {{PLURAL:$1|kategori|kategorier}}',
-'nlinks' => '$1 {{PLURAL:$1|lenke|lenker}}',
-'nmembers' => '$1 {{PLURAL:$1|medlem|medlemmer}}',
-'nrevisions' => '$1 {{PLURAL:$1|revisjon|revisjoner}}',
-'nviews' => '$1 {{PLURAL:$1|visning|visninger}}',
-'nimagelinks' => 'Brukt på $1 {{PLURAL:$1|side|sider}}',
-'ntransclusions' => 'brukt på $1 {{PLURAL:$1|side|sider}}',
-'specialpage-empty' => 'Denne siden er tom.',
-'lonelypages' => 'Foreldreløse sider',
-'lonelypagestext' => 'Følgende sider blir ikke lenket til eller brukt på andre sider på {{SITENAME}}.',
-'uncategorizedpages' => 'Ukategoriserte sider',
-'uncategorizedcategories' => 'Ukategoriserte kategorier',
-'uncategorizedimages' => 'Ukategoriserte filer',
-'uncategorizedtemplates' => 'Ukategoriserte maler',
-'unusedcategories' => 'Ubrukte kategorier',
-'unusedimages' => 'Ubrukte filer',
-'popularpages' => 'Populære sider',
-'wantedcategories' => 'Ønskede kategorier',
-'wantedpages' => 'Etterspurte sider',
-'wantedpages-badtitle' => 'Ugyldig tittel i resultatene: $1',
-'wantedfiles' => 'Ønskede filer',
-'wantedtemplates' => 'Etterspurte maler',
-'mostlinked' => 'Sider med flest lenker til seg',
-'mostlinkedcategories' => 'Kategorier med flest sider',
-'mostlinkedtemplates' => 'Mest brukte maler',
-'mostcategories' => 'Sider med flest kategorier',
-'mostimages' => 'Mest brukte filer',
-'mostrevisions' => 'Artikler med flest revisjoner',
-'prefixindex' => 'Alle sider med prefiks',
-'shortpages' => 'Korte sider',
-'longpages' => 'Lange sider',
-'deadendpages' => 'Blindveisider',
-'deadendpagestext' => 'Følgende sider lenker ikke til andre sider på {{SITENAME}}.',
-'protectedpages' => 'LÃ¥ste sider',
-'protectedpages-indef' => 'Kun beskyttelser på ubestemt tid',
-'protectedpages-cascade' => 'Kun dypbeskyttelse',
-'protectedpagestext' => 'Følgende sider er låst for flytting eller redigering',
-'protectedpagesempty' => 'Ingen sider er for øyeblikket låst med disse paramterne.',
-'protectedtitles' => 'Beskyttede titler',
-'protectedtitlestext' => 'Følgende titler er beskyttet fra opprettelse',
-'protectedtitlesempty' => 'Ingen titler beskyttes med disse parameterne for øyeblikket.',
-'listusers' => 'Brukerliste',
-'listusers-editsonly' => 'Vis bare brukere med redigeringer',
-'listusers-creationsort' => 'Sorter etter opprettelsesdato',
-'usereditcount' => '{{PLURAL:$1|én redigering|$1 redigeringer}}',
-'newpages' => 'Nye sider',
-'newpages-username' => 'Brukernavn:',
-'ancientpages' => 'Eldste sider',
-'move' => 'Flytt',
-'movethispage' => 'Flytt denne siden',
-'unusedimagestext' => 'Følgende filer eksisterer men er ikke innlagt på noen sider.
-Merk at andre sider kanskje lenker til en fil med en direkte lenke, så filen listes her selv om den faktisk er i bruk.',
-'unusedcategoriestext' => 'Følgende kategorier finnes, men det er ingen sider i dem.',
-'notargettitle' => 'Intet mål',
-'notargettext' => 'Du oppga ikke en målside eller bruker å utføre denne funksjonen på.',
-'nopagetitle' => 'MÃ¥lsiden finnes ikke',
-'nopagetext' => 'Siden du ville flytte finnes ikke.',
-'pager-newer-n' => '{{PLURAL:$1|1 nyere|$1 nyere}}',
-'pager-older-n' => '{{PLURAL:$1|1 eldre|$1 eldre}}',
-'suppress' => 'Historikkrydding',
-'querypage-disabled' => 'Denne spesialsiden er deaktivert av ytelsesårsaker.',
-
-# Book sources
-'booksources' => 'Bokkilder',
-'booksources-search-legend' => 'Søk etter bokkilder',
-'booksources-go' => 'GÃ¥',
-'booksources-text' => 'Under er en liste over lenker til andre sider som selger nye og brukte bøker, og kan også ha videre informasjon om bøker du leter etter:',
-'booksources-invalid-isbn' => 'Det gitte ISBN-nummeret er ugyldig; sjekk om du har angitt det riktig.',
-
-# Special:Log
-'specialloguserlabel' => 'Bruker:',
-'speciallogtitlelabel' => 'Tittel:',
-'log' => 'Logger',
-'all-logs-page' => 'Alle offentlige logger',
-'alllogstext' => 'Kombinert visning av alle loggene på {{SITENAME}}.
-Du kan minske antallet resultater ved å velge loggtype, brukernavn eller den siden som er påvirket (husk å skille mellom store og små bokstaver).',
-'logempty' => 'Ingen elementer i loggen.',
-'log-title-wildcard' => 'Søk i titler som starter med denne teksten',
-
-# Special:AllPages
-'allpages' => 'Alle sider',
-'alphaindexline' => '$1 til $2',
-'nextpage' => 'Neste side ($1)',
-'prevpage' => 'Forrige side ($1)',
-'allpagesfrom' => 'Vis sider fra og med:',
-'allpagesto' => 'Vis sider som slutter på:',
-'allarticles' => 'Alle sider',
-'allinnamespace' => 'Alle sider i $1-navnerommet',
-'allnotinnamespace' => 'Alle sider (ikke i $1-navnerommet)',
-'allpagesprev' => 'Forrige',
-'allpagesnext' => 'Neste',
-'allpagessubmit' => 'GÃ¥',
-'allpagesprefix' => 'Vis sider med prefikset:',
-'allpagesbadtitle' => 'Den angitte sidetittelen var ugyldig eller hadde et interwiki-prefiks. Den kan inneholde ett eller flere tegn som ikke kan brukes i titler.',
-'allpages-bad-ns' => '{{SITENAME}} har ikke navnerommet «$1».',
-
-# Special:Categories
-'categories' => 'Kategorier',
-'categoriespagetext' => 'Følgende {{PLURAL:$1|kategori|kategorier}} inneholder sider eller media.
-[[Special:UnusedCategories|Ubrukte kategorier]] vises ikke her.
-Se også [[Special:WantedCategories|ønskede kategorier]].',
-'categoriesfrom' => 'Vis kategorier fra og med:',
-'special-categories-sort-count' => 'soter etter antall',
-'special-categories-sort-abc' => 'sorter alfabetisk',
-
-# Special:DeletedContributions
-'deletedcontributions' => 'Slettede brukerbidrag',
-'deletedcontributions-title' => 'Slettede brukerbidrag',
-'sp-deletedcontributions-contribs' => 'bidrag',
-
-# Special:LinkSearch
-'linksearch' => 'Søk i eksterne lenker',
-'linksearch-pat' => 'Søkemønster:',
-'linksearch-ns' => 'Navnerom:',
-'linksearch-ok' => 'Søk',
-'linksearch-text' => 'Jokertegn som «*.wikipedia.org» kan brukes.<br />Støttede protokoller: <tt>$1</tt>',
-'linksearch-line' => '$1 lenkes fra $2',
-'linksearch-error' => 'Jokertegn kan kun brukes foran tjenernavnet.',
-
-# Special:ListUsers
-'listusersfrom' => 'Vis brukere fra og med:',
-'listusers-submit' => 'Vis',
-'listusers-noresult' => 'Ingen bruker funnet.',
-'listusers-blocked' => '(konto blokkert)',
-
-# Special:ActiveUsers
-'activeusers' => 'Liste over aktive brukere',
-'activeusers-intro' => 'Dette er en liste over brukere som har hatt en eller annen form for aktivitet innenfor {{PLURAL:$1|den siste dagen|de siste dagene}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|endring|endringer}} {{PLURAL:$3|det siste døgnet|de siste $3 dagene}}',
-'activeusers-from' => 'Vis brukere fra og med:',
-'activeusers-hidebots' => 'Skjul roboter',
-'activeusers-hidesysops' => 'Skjul administratorer',
-'activeusers-noresult' => 'Ingen brukere funnet.',
-
-# Special:Log/newusers
-'newuserlogpage' => 'Brukeropprettelseslogg',
-'newuserlogpagetext' => 'Dette er en logg over brukeropprettelser.',
-
-# Special:ListGroupRights
-'listgrouprights' => 'Rettigheter for brukergrupper',
-'listgrouprights-summary' => 'Følgende er en liste over brukergrupper som er definert på denne wikien, og hvilke rettigheter de har.
-Mer informasjon om de enkelte rettighetstypene kan finnes [[{{MediaWiki:Listgrouprights-helppage}}|her]].',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">Innvilget rettighet</span>
-* <span class="listgrouprights-granted">Tilbaketrukket rettighet</span>',
-'listgrouprights-group' => 'Gruppe',
-'listgrouprights-rights' => 'Rettigheter',
-'listgrouprights-helppage' => 'Help:Grupperettigheter',
-'listgrouprights-members' => '(liste over medlemmer)',
-'listgrouprights-addgroup' => 'Kan legge til {{PLURAL:$2|gruppa|gruppene}}: $1',
-'listgrouprights-removegroup' => 'Kan fjerne {{PLURAL:$2|gruppa|gruppene}}: $1',
-'listgrouprights-addgroup-all' => 'Kan legge til alle grupper',
-'listgrouprights-removegroup-all' => 'Kan fjerne alle grupper',
-'listgrouprights-addgroup-self' => 'Kan legge til {{PLURAL:$2|gruppe|gruppene}} til egen konto: $1',
-'listgrouprights-removegroup-self' => 'Kan ta vekk {{PLURAL:$2|gruppe|grupper}} fra egen konto: $1',
-'listgrouprights-addgroup-self-all' => 'Kan legge til alle grupper til egen konto',
-'listgrouprights-removegroup-self-all' => 'Kan ta bort alle grupper fra egen konto',
-
-# E-mail user
-'mailnologin' => 'Ingen avsenderadresse',
-'mailnologintext' => 'Du må være [[Special:UserLogin|logget inn]] og ha en gyldig e-postadresse satt i [[Special:Preferences|brukerinnstillingene]] for å sende e-post til andre brukere.',
-'emailuser' => 'E-post til denne brukeren',
-'emailpage' => 'E-post til bruker',
-'emailpagetext' => 'Du kan bruke skjemaet nedenfor for å sende en e-post til denne brukeren.
-Den e-postadressen du har satt i [[Special:Preferences|innstillingene dine]] vil dukke opp i «fra»-feltet på denne e-posten, så mottakeren er i stand til å svare.',
-'usermailererror' => 'E-postobjekt returnerte feilen:',
-'usermaildisabled' => 'Brukerepost deaktivert',
-'usermaildisabledtext' => 'Du kan ikke sende epost til andre brukere på denne wikien',
-'noemailtitle' => 'Ingen e-postadresse',
-'noemailtext' => 'Dene brukeren har ikke oppgitt en gyldig e-postadresse.',
-'nowikiemailtitle' => 'Ingen e-post tillatt',
-'nowikiemailtext' => 'Denne brukeren har valgt å ikke motta e-post fra andre brukere.',
-'emailnotarget' => 'Ikke-eksisterende eller ugyldig brukernavn for mottaker.',
-'emailtarget' => 'Skriv inn brukernavnet på mottakeren',
-'emailusername' => 'Brukernavn:',
-'emailusernamesubmit' => 'Send',
-'email-legend' => 'Send en e-post til en annen {{SITENAME}}-bruker',
-'emailfrom' => 'Fra:',
-'emailto' => 'Til:',
-'emailsubject' => 'Emne:',
-'emailmessage' => 'Beskjed:',
-'emailsend' => 'Send',
-'emailccme' => 'Send meg en kopi av beskjeden min.',
-'emailccsubject' => 'Kopi av din beskjed til $1: $2',
-'emailsent' => 'E-post sendt',
-'emailsenttext' => 'E-postbeskjeden er sendt',
-'emailuserfooter' => 'E-posten ble sendt av $1 til $2 via «Send e-post»-funksjonen på {{SITENAME}}.',
-
-# User Messenger
-'usermessage-summary' => 'Etterlater en systembeskjed.',
-'usermessage-editor' => 'Systembudbringer',
-
-# Watchlist
-'watchlist' => 'Overvåkningsliste',
-'mywatchlist' => 'Overvåkningsliste',
-'watchlistfor2' => 'For $1 $2',
-'nowatchlist' => 'Du har ingenting i overvåkningslisten.',
-'watchlistanontext' => 'Vennligst $1 for å vise eller redigere sider på overvåkningslisten din.',
-'watchnologin' => 'Ikke logget inn',
-'watchnologintext' => 'Du må være [[Special:UserLogin|logget inn]] for å kunne endre overvåkningslisten.',
-'addwatch' => 'Legg til i overvåkningslisten',
-'addedwatchtext' => "Siden «[[:$1]]» er lagt til [[Special:Watchlist|overvåkningslisten]].
-Fremtidige endringer til denne siden og den tilhørende diskusjonssiden blir listet opp her, og siden vil fremstå '''uthevet''' i [[Special:RecentChanges|listen over siste endringer]] for å gjøre det lettere å finne den.",
-'removewatch' => 'Fjern fra overvåkningslisten',
-'removedwatchtext' => 'Siden «[[:$1]]» er fjernet fra [[Special:Watchlist|overvåkningslisten din]].',
-'watch' => 'Overvåk',
-'watchthispage' => 'Overvåk denne siden',
-'unwatch' => 'Avslutt overvåkning',
-'unwatchthispage' => 'Fjerner overvåkning',
-'notanarticle' => 'Ikke en artikkel',
-'notvisiblerev' => 'Revisjonen er slettet',
-'watchnochange' => 'Ingen av sidene i overvåkningslisten er endret i den valgte perioden.',
-'watchlist-details' => '{{PLURAL:$1|Én side|$1 sider}} på din overvåkningsliste, teller ikke diskusjonssider.',
-'wlheader-enotif' => '* E-postnotifikasjon er slått på.',
-'wlheader-showupdated' => "* Sider som har blitt forandret siden du sist besøkte dem vises i '''fet tekst'''",
-'watchmethod-recent' => 'sjekker siste endringer for sider i overvåkningslisten',
-'watchmethod-list' => 'sjekker siste endringer for sider i overvåkningslisten',
-'watchlistcontains' => 'Overvåkningslisten inneholder $1 {{PLURAL:$1|side|sider}}.',
-'iteminvalidname' => 'Problem med «$1», ugyldig navn&nbsp;…',
-'wlshowlast' => 'Vis siste $1 timer $2 dager $3',
-'watchlist-options' => 'Alternativ for overvåkningslisten',
-
-# Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Overvåker…',
-'unwatching' => 'Fjerner fra overvåkningsliste…',
-'watcherrortext' => 'Det oppsto en feil under endring av overvåkningsinnstillingene dine for «$1».',
-
-'enotif_mailer' => '{{SITENAME}}s påminnelsessystem',
-'enotif_reset' => 'Merk alle sider som besøkt',
-'enotif_newpagetext' => 'Dette er en ny side.',
-'enotif_impersonal_salutation' => '{{SITENAME}}-bruker',
-'changed' => 'endret',
-'created' => 'opprettet',
-'enotif_subject' => '{{SITENAME}}-siden $PAGETITLE har blitt $CHANGEDORCREATED av $PAGEEDITOR',
-'enotif_lastvisited' => 'Se $1 for alle endringer siden ditt forrige besøk.',
-'enotif_lastdiff' => 'Se $1 for å se denne endringen.',
-'enotif_anon_editor' => 'anonym bruker $1',
-'enotif_body' => 'Kjære $WATCHINGUSERNAME,
-
-
-{{SITENAME}}-siden $PAGETITLE har blitt $CHANGEDORCREATED den $PAGEEDITDATE av $PAGEEDITOR, se $PAGETITLE_URL for den nåværende revisjonen.
-
-$NEWPAGE
-
-Redigeringssammendrag: $PAGESUMMARY $PAGEMINOREDIT
-
-Kontakt brukeren:
-e-post: $PAGEEDITOR_EMAIL
-wiki: $PAGEEDITOR_WIKI
-
-Det vil ikke komme flere varsler om endringer på denne siden med mindre du besøker den.
-Du kan også fjerne varslingsflagg for alle overvåkede sider i overvåkningslisten din.
-
- Ditt vennlige varslingssystem for {{SITENAME}}
-
---
-For å endre innstillingene for e-postvarsler, se
-{{canonicalurl:{{#special:Preferences}}}}
-
-For å endre innstillingene for overvåkningslisten, se
-{{canonicalurl:{{#special:EditWatchlist}}}}
-
-For å slette en side fra overvåkningssiden, se
-$UNWATCHURL
-
-Tilbakemelding og videre assistanse:
-{{canonicalurl:{{MediaWiki:Helppage}}}}',
-
-# Delete
-'deletepage' => 'Slett side',
-'confirm' => 'Bekreft',
-'excontent' => 'Innholdet var: «$1»',
-'excontentauthor' => 'innholdet var «$1» (og eneste bidragsyter var [[Special:Contributions/$2|$2]])',
-'exbeforeblank' => 'innholdet før siden ble tømt var: «$1»',
-'exblank' => 'siden var tom',
-'delete-confirm' => 'Slett «$1»',
-'delete-legend' => 'Slett',
-'historywarning' => 'Advarsel: Siden du er i ferd med å slette har en historikk med omtrent {{PLURAL:$1|én revisjon|$1 revisjoner}}:',
-'confirmdeletetext' => 'Du holder på å slette en side sammen med historikken.
-Bekreft at du virkelig vil slette denne siden, at du forstår konsekvensene og at du gjør det i samsvar med [[{{MediaWiki:Policy-url}}|retningslinjene]].',
-'actioncomplete' => 'Gjennomført',
-'actionfailed' => 'Handling mislyktes',
-'deletedtext' => '«$1» er slettet.
-Se $2 for en oversikt over de siste slettingene.',
-'dellogpage' => 'Slettingslogg',
-'dellogpagetext' => 'Under er ei liste over nylige slettinger.',
-'deletionlog' => 'slettingslogg',
-'reverted' => 'Gjenopprettet en tidligere versjon',
-'deletecomment' => 'Ã…rsak:',
-'deleteotherreason' => 'Annen/utdypende grunn:',
-'deletereasonotherlist' => 'Annen grunn',
-'deletereason-dropdown' => '* Vanlige grunner for sletting
-** På forfatters forespørsel
-** Opphavsrettsbrudd
-** Vandalisme',
-'delete-edit-reasonlist' => 'Rediger begrunnelser for sletting',
-'delete-toobig' => 'Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Muligheten til å slette slike sider er begrenset for å unngå utilsiktet forstyrring av {{SITENAME}}.',
-'delete-warning-toobig' => 'Denne siden har en stor redigeringshistorikk, med over {{PLURAL:$1|$1&nbsp;revisjon|$1&nbsp;revisjoner}}. Sletting av denne siden kan forstyrre databasen til {{SITENAME}}; vær varsom.',
-
-# Rollback
-'rollback' => 'Fjern redigeringer',
-'rollback_short' => 'Tilbakestill',
-'rollbacklink' => 'tilbakestill',
-'rollbackfailed' => 'Kunne ikke tilbakestille',
-'cantrollback' => 'Kan ikke fjerne redigering; den siste brukeren er den eneste forfatteren.',
-'alreadyrolled' => 'Kan ikke fjerne den siste redigeringen på [[$1]] av [[User:$2|$2]] ([[User talk:$2|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); en annen har allerede redigert siden eller fjernet redigeringen.
-
-Den siste redigeringen ble foretatt av [[User:$3|$3]] ([[User talk:$3|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
-'editcomment' => "Redigeringskommentaren var: «''$1''»",
-'revertpage' => 'Tilbakestilte endring av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]]) til siste versjon av [[User:$1|$1]]',
-'revertpage-nouser' => 'Tilbakestilte endringer av (fjernet brukernavn) til siste versjon av [[User:$1|$1]]',
-'rollback-success' => 'Tilbakestilte endringer av $1; endret til siste versjon av $2.',
-
-# Edit tokens
-'sessionfailure-title' => 'Sesjonsfeil',
-'sessionfailure' => "Det ser ut til å være et problem med innloggingen din, og den ble avbrutt av sikkerhetshensyn. Trykk ''Tilbake'' i nettleseren din, oppdater siden og prøv igjen.",
-
-# Protect
-'protectlogpage' => 'Beskyttelseslogg',
-'protectlogtext' => 'Nedenfor er en liste over endringer av sidebeskyttelser.
-Se [[Special:ProtectedPages|listen over beskyttede sider]] for listen over gjeldende sidebeskyttelser.',
-'protectedarticle' => 'beskyttet «[[$1]]»',
-'modifiedarticleprotection' => 'endret beskyttelsesnivå for «[[$1]]»',
-'unprotectedarticle' => 'fjernet beskyttelse av «[[$1]]»',
-'movedarticleprotection' => 'flyttet beskyttelsesinnstillinger fra «[[$2]]» til «[[$1]]»',
-'protect-title' => 'Låser «$1»',
-'prot_1movedto2' => '[[$1]] flyttet til [[$2]]',
-'protect-legend' => 'Bekreft låsing',
-'protectcomment' => 'Ã…rsak:',
-'protectexpiry' => 'Utløper:',
-'protect_expiry_invalid' => 'Utløpstiden er ugyldig.',
-'protect_expiry_old' => 'Utløpstiden har allerede vært.',
-'protect-unchain-permissions' => 'LÃ¥s opp flere beskyttelsesinnstillinger',
-'protect-text' => "Du kan se og endre beskyttelsesnivået for siden '''$1''' her.",
-'protect-locked-blocked' => "Du kan ikke endre beskyttelsesnivåer mens du er blokkert. Dette er de nåværende innstillingene for siden '''$1''':",
-'protect-locked-dblock' => "Beskyttelsesnivåer kan ikke endres under en aktiv databasebeskyttelse. Dette er de nåværende innstillingene for siden '''$1''':",
-'protect-locked-access' => "Kontoen din har ikke tillatelse til å endre sidebeskyttelsesnivå.
-Dette er de nåværende innstillingene for siden '''$1''':",
-'protect-cascadeon' => 'Denne siden er for tiden beskyttet fordi den er inkludert på følgende {{PLURAL:$1|side|sider}} som har dypbeskyttelse slått på.
-Du kan endre sidens beskyttelsesnivå, men det vil ikke påvirke dypbeskyttelsen.',
-'protect-default' => 'Tillat alle brukere',
-'protect-fallback' => 'Må ha «$1»-tillatelse',
-'protect-level-autoconfirmed' => 'Eastte anonyma ja ođđa geavaheddjiid',
-'protect-level-sysop' => 'Kun administratorer',
-'protect-summary-cascade' => 'dypbeskyttelse',
-'protect-expiring' => 'utløper $1 (UTC)',
-'protect-expiry-indefinite' => 'ubestemt',
-'protect-cascade' => 'Beskytt sider som er inkludert på denne siden (dypbeskyttelse)',
-'protect-cantedit' => 'Du kan ikke endre beskyttelsesnivået til denne siden fordi du ikke har tillatelse til å redigere den.',
-'protect-othertime' => 'Annen tid:',
-'protect-othertime-op' => 'annen tid',
-'protect-existing-expiry' => 'Gjeldende utløpstid: $3 $2',
-'protect-otherreason' => 'Annen/utdypende grunn:',
-'protect-otherreason-op' => 'Annen grunn',
-'protect-dropdown' => '*Vanlige låsingsårsaker
-** Gjentatt hærverk
-** Gjentatt spam
-** Redigeringskrig
-** Side med mange besøkende',
-'protect-edit-reasonlist' => 'Rediger låsingsgrunner',
-'protect-expiry-options' => '1 time:1 hour,1 dag:1 day,1 uke:1 week,2 uker:2 weeks,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year,uendelig:infinite',
-'restriction-type' => 'Tillatelse:',
-'restriction-level' => 'Restriksjonsnivå:',
-'minimum-size' => 'Minimumstørrelse',
-'maximum-size' => 'Maksimumstørrelse:',
-'pagesize' => '(byte)',
-
-# Restrictions (nouns)
-'restriction-edit' => 'Redigering',
-'restriction-move' => 'Flytting',
-'restriction-create' => 'Opprett',
-'restriction-upload' => 'Last opp',
-
-# Restriction levels
-'restriction-level-sysop' => 'fullstendig låst',
-'restriction-level-autoconfirmed' => 'halvlåst',
-'restriction-level-all' => 'alle nivåer',
-
-# Undelete
-'undelete' => 'Vis slettede sider',
-'undeletepage' => 'Se og gjenopprett slettede sider',
-'undeletepagetitle' => "'''Følgende innhold er slettede revisjoner av [[:$1]].'''",
-'viewdeletedpage' => 'Vis slettede sider',
-'undeletepagetext' => 'Følgende {{PLURAL:$1|side|sider}} er slettet, men finnes fortsatt i arkivet og kan gjenopprettes. Arkivet blir periodevis slettet.',
-'undelete-fieldset-title' => 'Gjenopprett revisjoner',
-'undeleteextrahelp' => "For å gjenopprette hele sidens historikk, la alle boksene være tomme og klikk '''''{{int:undeletebtn}}'''''.
-For å gjenopprette kun deler, kryss av boksene for revisjonene du vil gjenopprette og klikk '''''{{int:undeletebtn}}'''''.",
-'undeleterevisions' => '{{PLURAL:$1|Én versjon arkivert|$1 versjoner arkiverte}}',
-'undeletehistory' => 'Om du gjenoppretter siden vil alle revisjoner gjenopprettes i historikken.
-Dersom en ny side ved samme navn har blitt oprettet etter slettingen, vil de gjenopprettede revisjonene dukke opp før denne i redigeringshistorikken.',
-'undeleterevdel' => 'Gjenoppretting kan ikke utføres dersom det resulterer i at den øverste revisjonen blir delvis slettet. I slike tilfeller må du fjerne merkingen av den nyeste slettede revisjonen.',
-'undeletehistorynoadmin' => 'Denne artikkelen har blitt slettet. Grunnen for slettingen vises i oppsummeringen nedenfor, sammen med detaljer om brukerne som redigerte siden før den ble slettet. Teksten i disse slettede revisjonene er kun tilgjengelig for administratorer.',
-'undelete-revision' => 'Slettet revisjon av $1 (per $4 $5) av $3:',
-'undeleterevision-missing' => 'Ugyldig eller manglende revisjon. Du kan ha en ødelagt lenke, eller revisjonen har blitt fjernet fra arkivet.',
-'undelete-nodiff' => 'Ingen tidligere revisjoner funnet.',
-'undeletebtn' => 'Gjenopprett',
-'undeletelink' => 'vis/gjenopprett',
-'undeleteviewlink' => 'vis',
-'undeletereset' => 'Nullstill',
-'undeleteinvert' => 'Inverter valg',
-'undeletecomment' => 'Ã…rsak:',
-'undeletedrevisions' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}} gjenopprettet',
-'undeletedrevisions-files' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}} og {{PLURAL:$2|én fil|$2 filer}} gjenopprettet',
-'undeletedfiles' => '{{PLURAL:$1|Én fil|$1 filer}} gjenopprettet',
-'cannotundelete' => 'Kunne ikke gjenopprette siden (den kan være gjenopprettet av noen andre).',
-'undeletedpage' => "'''$1 ble gjenopprettet'''
-
-Sjekk [[Special:Log/delete|slettingsloggen]] for en liste over nylige slettinger og gjenopprettelser.",
-'undelete-header' => 'Se [[Special:Log/delete|slettingsloggen]] for nylig slettede sider.',
-'undelete-search-box' => 'Søk i slettede sider',
-'undelete-search-prefix' => 'Vis sider som starter med:',
-'undelete-search-submit' => 'Søk',
-'undelete-no-results' => 'Ingen passende sider funnet i slettingsarkivet.',
-'undelete-filename-mismatch' => 'Kan ikke gjenopprette filrevisjon med tidstrykk $1: ikke samsvarende filnavn',
-'undelete-bad-store-key' => 'Kan ikke gjenopprette filrevisjon med tidstrykk $1: fil manglet før sletting',
-'undelete-cleanup-error' => 'Feil i sletting av ubrukt arkivfil «$1».',
-'undelete-missing-filearchive' => 'Klarte ikke å gjenopprette filarkivet med ID $1 fordi det ikke er i databasen. Det kan ha blitt gjenopprettet tidligere.',
-'undelete-error-short' => 'Feil under filgjenoppretting: $1',
-'undelete-error-long' => 'Feil oppsto under filgjenoppretting:
-
-$1',
-'undelete-show-file-confirm' => 'Er du sikker på at du vil vise en slettet versjon av filen «<nowiki>$1</nowiki>» fra den $2 klokken $3?',
-'undelete-show-file-submit' => 'Ja',
-
-# Namespace form on various pages
-'namespace' => 'Navnerom:',
-'invert' => 'Inverter valg',
-'tooltip-invert' => 'Kryss av denne boksen for å skjule endringer på sider i det valgte navnerommet (og tilhørende navnerom hvis de er avkrysset også)',
-'namespace_association' => 'Tilknyttet navnerom',
-'tooltip-namespace_association' => 'Kryss av denne boksen for å også inkludere diskusjons- eller emnenavnerommet som er tilknyttet det valgte navnerommet',
-'blanknamespace' => '(Hoved)',
-
-# Contributions
-'contributions' => 'Brukerbidrag',
-'contributions-title' => 'Brukerbidrag av $1',
-'mycontris' => 'Egne bidrag',
-'contribsub2' => 'For $1 ($2)',
-'nocontribs' => 'Ingen endringer er funnet som passer disse kriteriene.',
-'uctop' => '(siste)',
-'month' => 'Fra måned (og tidligere):',
-'year' => 'Fra år (og tidligere):',
-
-'sp-contributions-newbies' => 'Vis kun bidrag fra nye kontoer',
-'sp-contributions-newbies-sub' => 'For nybegynnere',
-'sp-contributions-newbies-title' => 'Bidrag av nye kontoer',
-'sp-contributions-blocklog' => 'blokkeringslogg',
-'sp-contributions-deleted' => 'slettede brukerbidrag',
-'sp-contributions-uploads' => 'opplastinger',
-'sp-contributions-logs' => 'logger',
-'sp-contributions-talk' => 'diskusjon',
-'sp-contributions-userrights' => 'brukerrettighetskontroll',
-'sp-contributions-blocked-notice' => 'Denne brukeren er for tiden blokkert.
-Siste blokkeringsloggelement kan sees nedenfor.',
-'sp-contributions-blocked-notice-anon' => 'Denne IP-adressen er for tiden blokkert.
-Den siste oppføringen i blokkeringsloggen er vist nedenfor som referanse:',
-'sp-contributions-search' => 'Søk etter bidrag',
-'sp-contributions-username' => 'IP-adresse eller brukernavn:',
-'sp-contributions-toponly' => 'Vis kun endringer som er gjeldende revisjoner',
-'sp-contributions-submit' => 'Søk',
-
-# What links here
-'whatlinkshere' => 'Lenker hit',
-'whatlinkshere-title' => 'Sider som lenker til «$1»',
-'whatlinkshere-page' => 'Side:',
-'linkshere' => "Følgende sider lenker til '''[[:$1]]''':",
-'nolinkshere' => "Ingen sider lenker til '''[[:$1]]'''.",
-'nolinkshere-ns' => "Ingen sider lenker til '''[[:$1]]''' i valgte navnerom.",
-'isredirect' => 'omdirigeringsside',
-'istemplate' => 'transklusjon',
-'isimage' => 'fillenke',
-'whatlinkshere-prev' => '{{PLURAL:$1|forrige|forrige $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|neste|neste $1}}',
-'whatlinkshere-links' => '↠lenker',
-'whatlinkshere-hideredirs' => '$1 omdirigeringer',
-'whatlinkshere-hidetrans' => '$1 transkluderinger',
-'whatlinkshere-hidelinks' => '$1 lenker',
-'whatlinkshere-hideimages' => '$1 fillenker',
-'whatlinkshere-filters' => 'Filtre',
-
-# Block/unblock
-'autoblockid' => 'Autoblokker #$1',
-'block' => 'Blokker bruker',
-'unblock' => 'Fjern blokkering av bruker',
-'blockip' => 'Blokker bruker',
-'blockip-title' => 'Blokker bruker',
-'blockip-legend' => 'Blokker bruker',
-'blockiptext' => 'Bruk skjemaet under for å blokkere en IP-adresses tilgang til å redigere artikler. Dette må kun gjøres for å forhindre hærverk, og i overensstemmelse med [[{{MediaWiki:Policy-url}}|retningslinjene]]. Fyll ut en spesiell begrunnelse under.',
-'ipadressorusername' => 'IP-adresse eller brukernavn',
-'ipbexpiry' => 'Varighet:',
-'ipbreason' => 'Ã…rsak:',
-'ipbreasonotherlist' => 'Annen grunn',
-'ipbreason-dropdown' => '*Vanlige blokkeringsgrunner
-** Legger inn feilinformasjon
-** Fjerner innhold fra sider
-** Lenkespam
-** Legger inn vås
-** Truende oppførsel
-** Misbruk av flere kontoer
-** Uakseptabelt brukernavn',
-'ipb-hardblock' => 'Hindre innloggede brukere i å redigere fra denne IP-adressen',
-'ipbcreateaccount' => 'Hindre kontoopprettelse',
-'ipbemailban' => 'Forhindre brukeren fra å sende e-post',
-'ipbenableautoblock' => 'Blokker forrige IP-adresse brukt av denne brukeren automatisk, samt alle IP-adresser brukeren forsøker å redigere med i framtiden',
-'ipbsubmit' => 'Blokker denne brukeren',
-'ipbother' => 'Annen tid',
-'ipboptions' => '2 timer:2 hours,1 dag:1 day,3 dager:3 days,1 uke:1 week,2 uker:2 weeks,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year,uendelig:infinite',
-'ipbotheroption' => 'annet',
-'ipbotherreason' => 'Annen/utdypende grunn:',
-'ipbhidename' => 'Skjul brukernavn fra endringer og lister',
-'ipbwatchuser' => 'Overvåk brukerens brukerside og diskusjonsside',
-'ipb-disableusertalk' => 'Hindre denne brukeren i å redigere sin egen diskusjonsside mens han/hun er blokkert',
-'ipb-change-block' => 'Blokker brukeren på nytt med disse innstillingene',
-'ipb-confirm' => 'Bekreft blokkering',
-'badipaddress' => 'Ugyldig IP-adresse.',
-'blockipsuccesssub' => 'Blokkering utført',
-'blockipsuccesstext' => '­«[[Special:Contributions/$1|$1]]» har blitt blokkert.<br />
-Se [[Special:IPBlockList|blokkeringslisten]] for alle blokkeringer.',
-'ipb-blockingself' => 'Du er i ferd med å blokkere deg selv! Er du sikker på at du vil gjøre det?',
-'ipb-confirmhideuser' => 'Du er i ferd med å blokkere en bruker med «skjul bruker» aktivert. Dette vil skjule brukerens navn i alle lister og loggoppføringer. Er du sikker på at du vil gjøre dette?',
-'ipb-edit-dropdown' => 'Rediger blokkeringsgrunner',
-'ipb-unblock-addr' => 'Avblokker $1',
-'ipb-unblock' => 'Avblokker et brukernavn eller en IP-adresse',
-'ipb-blocklist' => 'Vis gjeldende blokkeringer',
-'ipb-blocklist-contribs' => 'Bidrag fra $1',
-'unblockip' => 'Opphev blokkering',
-'unblockiptext' => 'Bruk skjemaet under for å gjenopprette skriveadgangen for en tidligere blokkert adresse eller bruker.',
-'ipusubmit' => 'Opphev blokkering',
-'unblocked' => '[[User:$1|$1]] ble avblokkert',
-'unblocked-range' => '$1 har fått løftet blokkeringen',
-'unblocked-id' => 'Blokkering $1 ble fjernet',
-'blocklist' => 'Blokkerte brukere',
-'ipblocklist' => 'Blokkerte IP-adresser og brukernavn',
-'ipblocklist-legend' => 'Finn en blokkert bruker',
-'blocklist-userblocks' => 'Skjul kontoblokkeringer',
-'blocklist-tempblocks' => 'Skjul midlertidige blokkeringer',
-'blocklist-addressblocks' => 'Skjul individuelle IP-blokkeringer',
-'blocklist-timestamp' => 'Tidsstempel',
-'blocklist-target' => 'MÃ¥l',
-'blocklist-expiry' => 'Utløper',
-'blocklist-by' => 'Blokkerende admin',
-'blocklist-params' => 'Blokkeringsparametre',
-'blocklist-reason' => 'Ã…rsak',
-'ipblocklist-submit' => 'Søk',
-'ipblocklist-localblock' => 'Lokal blokkering',
-'ipblocklist-otherblocks' => '{{PLURAL:$1|Annen blokkering|Andre blokkeringer}}',
-'infiniteblock' => 'uendelig',
-'expiringblock' => 'utgår den $1 kl $2',
-'anononlyblock' => 'kun uregistrerte',
-'noautoblockblock' => 'autoblokkering slått av',
-'createaccountblock' => 'kontooppretting blokkert',
-'emailblock' => 'e-post blokkert',
-'blocklist-nousertalk' => 'kan ikke redigere sin egen diskusjonsside',
-'ipblocklist-empty' => 'Blokkeringslisten er tom.',
-'ipblocklist-no-results' => 'Den angitte IP-adressen eller brukeren er ikke blokkert.',
-'blocklink' => 'blokker',
-'unblocklink' => 'opphev blokkering',
-'change-blocklink' => 'endre blokkering',
-'contribslink' => 'bidrag',
-'autoblocker' => 'Du ble automatisk blokkert fordi du deler IP-adresse med «[[User:$1|$1]]». Grunnen som ble gitt til at «$1» ble blokkert var: «$2».',
-'blocklogpage' => 'Blokkeringslogg',
-'blocklog-showlog' => 'Denne brukeren har blitt blokkert før.
-Blokkeringsloggen vises nedenfor.',
-'blocklog-showsuppresslog' => 'Denne brukeren har tidligere blitt blokkert og skjult.
-Skjulingsloggen vises nedenfor.',
-'blocklogentry' => 'blokkerte [[$1]] med en varighet på $2 $3',
-'reblock-logentry' => 'endret blokkeringsinnstillinger for [[$1]] med en varighet på $2 $3',
-'blocklogtext' => 'Dette er en logg som viser hvilke brukere som har blitt blokkert og avblokkert. Automatisk blokkerte IP-adresser vises ikke. Se [[Special:BlockList|blokkeringslisten]] for en liste over IP-adresser som er blokkert akkurat nå.',
-'unblocklogentry' => 'opphevet blokkeringen av $1',
-'block-log-flags-anononly' => 'kun uregistrerte brukere',
-'block-log-flags-nocreate' => 'kontooppretting deaktivert',
-'block-log-flags-noautoblock' => 'autoblokkering slått av',
-'block-log-flags-noemail' => 'e-post blokkert',
-'block-log-flags-nousertalk' => 'kan ikke redigere egen diskusjonsside',
-'block-log-flags-angry-autoblock' => 'utvidet autoblokkering aktivert',
-'block-log-flags-hiddenname' => 'brukernavn skjult',
-'range_block_disabled' => 'Muligheten til å blokkere flere IP-adresser om gangen er slått av.',
-'ipb_expiry_invalid' => 'Ugyldig utløpstid.',
-'ipb_expiry_temp' => 'For å skjule brukernavnet må blokkeringen være permanent.',
-'ipb_hide_invalid' => 'Kan ikke skjule denne kontoen. Den kan ha for mange redigeringer.',
-'ipb_already_blocked' => '«$1» er allerede blokkert',
-'ipb-needreblock' => '$1 er blokkert fra før. Vil du endre innstillingene?',
-'ipb-otherblocks-header' => '{{PLURAL:$1|Annen blokkering|Andre blokkeringer}}',
-'unblock-hideuser' => 'Du kan ikke løfte blokkeringen av denne brukeren siden dens brukernavn har blitt skjult.',
-'ipb_cant_unblock' => 'Feil: Blokk-ID $1 ikke funnet. Kan ha blitt avblokkert allerede.',
-'ipb_blocked_as_range' => 'Feil: IP-en $1 er ikke blokkert direkte, og kan ikke avblokkeres. Den er imidlertid blokkert som del av blokkeringa av IP-rangen $2, som kan avblokkeres.',
-'ip_range_invalid' => 'Ugyldig IP-rad.',
-'ip_range_toolarge' => 'Blokkering av IP-serier større enn /$1 er ikke tillatt.',
-'blockme' => 'Blokker meg',
-'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Denne funksjonen er slått av.',
-'proxyblockreason' => 'IP-adressen din ble blokkert fordi den er en åpen proxy. Kontakt internettleverandøren din eller teknisk støtte og informer dem om dette alvorlige sikkerhetsproblemet.',
-'proxyblocksuccess' => 'Utført.',
-'sorbsreason' => 'Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}.',
-'sorbs_create_account_reason' => 'Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}. Du kan ikke opprette en konto',
-'cant-block-while-blocked' => 'Du kan ikke blokkere andre mens du selv er blokkert.',
-'cant-see-hidden-user' => 'Brukeren du prøver å blokkere har allerede blitt blokkert og skjult. Ettersom du ikke har rett til å skjule brukere (hideuser), kan du ikke se eller endre brukerens blokkering.',
-'ipbblocked' => 'Du kan ikke blokkere eller avblokkere andre brukere, siden du selv er blokkert',
-'ipbnounblockself' => 'Du har ikke tillatelse til å avblokkere deg selv',
-
-# Developer tools
-'lockdb' => 'LÃ¥s database',
-'unlockdb' => 'Ã…pne database',
-'lockdbtext' => 'Å låse databasen vil avbryte alle brukere fra å kunne
-redigere sider, endre deres innstillinger, redigere deres
-overvåkningsliste, og andre ting som krever endringer i databasen.
-Bekreft at du har til hensikt å gjøre dette, og at du vil
-låse opp databasen når vedlikeholdet er utført.',
-'unlockdbtext' => 'Å låse opp databasen vil si at alle brukere igjen
-kan redigere sider, endre sine innstillinger, redigere sin
-overvåkningsliste, og andre ting som krever endringer i databasen.
-Bekreft at du har til hensikt å gjøre dette.',
-'lockconfirm' => 'Ja, jeg vil virkelig låse databasen.',
-'unlockconfirm' => 'Ja, jeg vil virkelig låse opp databasen.',
-'lockbtn' => 'LÃ¥s databasen',
-'unlockbtn' => 'Ã…pne databasen',
-'locknoconfirm' => 'Du har ikke bekreftet handlingen.',
-'lockdbsuccesssub' => 'Databasen er nå låst',
-'unlockdbsuccesssub' => 'Databasen er nå lås opp',
-'lockdbsuccesstext' => 'Databasen er låst.<br />Husk å [[Special:UnlockDB|låse den opp]] når du er ferdig med vedlikeholdet.',
-'unlockdbsuccesstext' => 'Databasen er låst opp.',
-'lockfilenotwritable' => 'Kan ikke skrive til databasen. For å låse eller åpne databasen, må denne kunne skrives til av tjeneren.',
-'databasenotlocked' => 'Databasen er ikke låst.',
-'lockedbyandtime' => '(av $1 den $2, kl $3)',
-
-# Move page
-'move-page' => 'Flytt $1',
-'move-page-legend' => 'Flytt side',
-'movepagetext' => "Når du bruker skjemaet nedenfor døper du om en side og flytter hele historikken til det nye navnet.
-Den gamle tittelen blir en omdirigeringsside til den nye tittelen.
-Du kan oppdatere omdirigeringer som peker til den opprinnelige tittelen automatisk.
-Om du velger å ikke gjøre det, sjekk at flyttingen ikke fører til [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].
-Du er ansvarlig for at lenker fortsetter å peke til de sidene de er ment å peke til.
-
-Legg merke til at siden '''ikke''' kan flyttes hvis det allerede finnes en side med den nye tittelen, med mindre den er tom eller er en omdirigeringsside uten historikk.
-Det betyr at du kan flytte en side tilbake dit den kom fra hvis du gjør en feil, og du kan ikke overskrive eksisterende sider ved et uhell.
-
-'''Advarsel!'''
-Dette kan være en drastisk og uventet endring for en populær side;
-vær sikker på at du forstår konsekvensene av dette før du fortsetter.",
-'movepagetext-noredirectfixer' => "Skjemaet nedenfor vil gi en side ny tittel og flytte historikken dens til det nye navnet.
-Den gamle tittelen vil bli en omdirigering til den nye.
-Sjekk om det blir [[Special:DoubleRedirects|doble]] eller [[Special:BrokenRedirects|ødelagte omdirigeringer]].
-Du er ansvarlig for å sjekke at lenker fortsetter å gå dit de skal.
-
-Merk at sider '''ikke''' blir flyttet om det allerede finnes en side med den tittelen, med mindre siden er tom eller en omdirigering og ikke har noen redigeringshistorikk.
-Dette betyr at du kan endre tittelen til en tittel siden hadde tidligere, og at du ikke kan skrive over en eksisterende side.
-
-'''Advarsel!'''
-Dette kan være en drastisk og uventen endring for en populær side;
-vær sikker på at du forstår konsekvensene av dette før du fortsetter.",
-'movepagetalktext' => "Den tilhørende diskusjonssiden vil automatisk bli flyttet sammen med siden '''med mindre:'''
-*Det allerede finnes en diskusjonsside som ikke er tom under det nye navnet, eller
-*Du fjerner markeringen i boksen nedenfor.
-
-I disse tilfellene er du nødt til å flytte eller flette siden manuelt, om ønskelig.",
-'movearticle' => 'Flytt side:',
-'moveuserpage-warning' => "'''Advarsel:''' Du er i ferd med å flytte en brukerside. Merk at kun siden vil bli flyttet; brukernavnet vil ''ikke'' bli endret.",
-'movenologin' => 'Ikke logget inn',
-'movenologintext' => 'Du må være registrert bruker og være [[Special:UserLogin|logget på]] for å flytte en side.',
-'movenotallowed' => 'Du har ikke tillatelse til å flytte sider.',
-'movenotallowedfile' => 'Du har ikke tillatelse til å flytte filer.',
-'cant-move-user-page' => 'Du har ikke tillatelse til å flytte brukersider (bortsett fra undersider).',
-'cant-move-to-user-page' => 'Du har ikke tillatelse til å flytte brukersider (bortsett fra undersider).',
-'newtitle' => 'Til ny tittel:',
-'move-watch' => 'Overvåk kilde- og målsiden',
-'movepagebtn' => 'Flytt side',
-'pagemovedsub' => 'Flytting gjennomført',
-'movepage-moved' => "'''«$1» ble flyttet til «$2»'''",
-'movepage-moved-redirect' => 'En omdirigering har blitt opprettet.',
-'movepage-moved-noredirect' => 'Det ble ikke opprettet en omdirigering.',
-'articleexists' => 'En side med det navnet finnes allerede eller det valgte navn er ugyldig.
-Velg et annet navn.',
-'cantmove-titleprotected' => 'Du kan ikke flytte en side til dette navnet, fordi den nye tittelen er beskyttet fra opprettelse.',
-'talkexists' => "'''Siden ble flyttet korrekt, men den tilhørende diskusjonssiden kunne ikke flyttes fordi det allerede finnes en under den nye tittelen.
-Du er nødt til å flette dem manuelt.'''",
-'movedto' => 'flyttet til',
-'movetalk' => 'Flytt tilhørende diskusjonsside.',
-'move-subpages' => 'Flytt alle undersider (opp til $1)',
-'move-talk-subpages' => 'Flytt alle undersider av diskusjonssiden (opp til $1)',
-'movepage-page-exists' => 'Siden $1 finnes allerede og kan ikke overskrives automatisk.',
-'movepage-page-moved' => 'Siden $1 har blitt flyttet til $2.',
-'movepage-page-unmoved' => 'Siden $1 kunne ikke flyttes til $2.',
-'movepage-max-pages' => 'Grensen på {{PLURAL:$1|én side|$1 sider}} er nådd; ingen flere sider vil bli flyttet automatisk.',
-'movelogpage' => 'Flyttelogg',
-'movelogpagetext' => 'Her er ei liste over sider som har blitt flyttet.',
-'movesubpage' => '{{PLURAL:$1|Underside|Undersider}}',
-'movesubpagetext' => 'Denne siden har {{PLURAL:$1|én underside|$1 undersider}} som vises nedenfor.',
-'movenosubpage' => 'Denne siden har ingen undersider.',
-'movereason' => 'Ã…rsak:',
-'revertmove' => 'tilbakestill',
-'delete_and_move' => 'Slett og flytt',
-'delete_and_move_text' => '==Sletting nødvendig==
-Målsiden «[[:$1]]» finnes allerede. Vil du slette den så denne siden kan flyttes dit?',
-'delete_and_move_confirm' => 'Ja, slett siden',
-'selfmove' => 'Kilde- og destinasjonstittel er den samme; kan ikke flytte siden.',
-'immobile-source-namespace' => 'Kan ikke flytte sider i navnerommet «$1»',
-'immobile-target-namespace' => 'Kan ikke flytte sider til navnerommet «$1»',
-'immobile-target-namespace-iw' => 'Du kan ikke flytte en side til et navn som er en interwikilenke.',
-'immobile-source-page' => 'Denne siden kan ikke flyttes.',
-'immobile-target-page' => 'Kan ikke flytte til det navnet.',
-'imagenocrossnamespace' => 'Kan ikke flytte filer til andre navnerom enn filnavnerommet',
-'nonfile-cannot-move-to-file' => 'Kan ikke flytte ikke-filer til filnavnerom',
-'imagetypemismatch' => 'Den nye filendelsen tilsvarer ikke filtypen',
-'imageinvalidfilename' => 'MÃ¥lnavnet er ugyldig',
-'fix-double-redirects' => 'Oppdater omdirigeringer som fører til den gamle tittelen',
-'move-leave-redirect' => 'La det være igjen en omdirigering',
-'protectedpagemovewarning' => "'''Advarsel:''' Denne siden har blitt låst slik at kun brukere med administratorrettigheter kan flytte den.
-Det siste loggelementet er oppgitt under som referanse:",
-'semiprotectedpagemovewarning' => "'''Merk:''' Denne siden har blitt låst slik at kun registrerte brukere kan flytte den.
-Det siste loggelementet er oppgitt under som referanse:",
-'move-over-sharedrepo' => '== Filen finnes ==
-[[:$1]] finnes på en delt kilde. Dersom du flytter en fil til dette navnet, vil du overstyre den delte filen.',
-'file-exists-sharedrepo' => 'Det valgte filnavnet er allerede i bruk på en delt kilde.
-Vennligst velg et annet navn.',
-
-# Export
-'export' => 'Eksporter sider',
-'exporttext' => 'Du kan eksportere teksten og redigeringshistorikken for en bestemt side eller en gruppe sider i XML.
-Dette kan senere importeres til en annen wiki som bruker MediaWiki ved hjelp av [[Special:Import|importsiden]].
-
-For å eksportere sider, skriv inn titler i tekstboksen under, én tittel per linje, og velg om du vil ha kun nåværende versjon, eller alle versjoner i historikken.
-
-Dersom du bare vil ha nåværende versjon, kan du også bruke en lenke, for eksempel [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for siden «[[{{MediaWiki:Mainpage}}]]».',
-'exportcuronly' => 'Ta bare med den nåværende versjonen, ikke hele historikken.',
-'exportnohistory' => "----
-'''Merk:''' Eksportering av hele historikken gjennom dette skjemaet har blitt slått av av ytelsesgrunner.",
-'export-submit' => 'Eksporter',
-'export-addcattext' => 'Legg til sider fra kategori:',
-'export-addcat' => 'Legg til',
-'export-addnstext' => 'Legg til sider fra navnerom:',
-'export-addns' => 'Legg til',
-'export-download' => 'Lagre som fil',
-'export-templates' => 'Ta med maler',
-'export-pagelinks' => 'Inkluder lenkede sider med en dybde på:',
-
-# Namespace 8 related
-'allmessages' => 'Systemmeldinger',
-'allmessagesname' => 'Navn',
-'allmessagesdefault' => 'Standardtekst',
-'allmessagescurrent' => 'Nåværende tekst',
-'allmessagestext' => 'Dette er en liste over tilgjengelige systemmeldinger i MediaWiki-navnerommet.
-Besøk [//translatewiki.net translatewiki.net] om du ønsker å bidra med oversettelse av MediaWiki.',
-'allmessagesnotsupportedDB' => "''{{ns:special}}:Allmessages'' kan ikke brukes fordi '''\$wgUseDatabaseMessages''' er slått av.",
-'allmessages-filter-legend' => 'Filtrér',
-'allmessages-filter' => 'Filtrér etter tilpassningsgrad',
-'allmessages-filter-unmodified' => 'Uendret',
-'allmessages-filter-all' => 'Alle',
-'allmessages-filter-modified' => 'Endret',
-'allmessages-prefix' => 'Filtrer etter prefiks:',
-'allmessages-language' => 'Språk:',
-'allmessages-filter-submit' => 'GÃ¥',
-
-# Thumbnails
-'thumbnail-more' => 'Forstørr',
-'filemissing' => 'Filen mangler',
-'thumbnail_error' => 'Feil under oppretting av miniatyrbilde: $1',
-'djvu_page_error' => 'DjVu-side ute av rekkevidde',
-'djvu_no_xml' => 'Klarte ikke å hente XML for DjVu-fil',
-'thumbnail_invalid_params' => 'Ugyldige miniatyrparametere, eller PNG-fil med flere piksler enn 12,5 millioner.',
-'thumbnail_dest_directory' => 'Klarte ikke å opprette målmappe',
-'thumbnail_image-type' => 'Bildetypen støttes ikke',
-'thumbnail_gd-library' => 'Ufullstendig konfigurering av GD library: mangler funksjonen $1',
-'thumbnail_image-missing' => 'Filen ser ut til å mangle: $1',
-
-# Special:Import
-'import' => 'Importer sider',
-'importinterwiki' => 'Transwiki-importering',
-'import-interwiki-text' => 'Velg en wiki og en side å importere. Revisjonsdatoer og bidragsyteres navn blir bevart. Alle transwiki-importeringer listes i [[Special:Log/import|importloggen]].',
-'import-interwiki-source' => 'Kildewiki/side:',
-'import-interwiki-history' => 'Kopier all historikk for denne siden',
-'import-interwiki-templates' => 'Inkluder alle maler',
-'import-interwiki-submit' => 'Importer',
-'import-interwiki-namespace' => 'MÃ¥lnavnerom:',
-'import-upload-filename' => 'Filnavn:',
-'import-comment' => 'Kommentar:',
-'importtext' => 'Importer filen fra kildewikien med [[Special:Export|eksporteringsverktøyet]].
-Lagre den på din egen datamaskin og last den opp her.',
-'importstart' => 'Importerer sider&nbsp;…',
-'import-revision-count' => '({{PLURAL:$1|Én revisjon|$1 revisjoner}})',
-'importnopages' => 'Ingen sider å importere.',
-'imported-log-entries' => 'Importerte $1 {{PLURAL:$1|loggoppføring|loggoppføringer}}.',
-'importfailed' => 'Importering mislyktes: $1',
-'importunknownsource' => 'Ukjent importkildetype',
-'importcantopen' => 'Kunne ikke åpne importfil',
-'importbadinterwiki' => 'Ugyldig interwikilenke',
-'importnotext' => 'Tom eller ingen tekst',
-'importsuccess' => 'Importering ferdig.',
-'importhistoryconflict' => 'Motstridende revisjoner finnes (siden kan ha blitt importert tidligere)',
-'importnosources' => 'Ingen transwikiimportkilder er angitt, og direkte historikkimporteringer er slått av.',
-'importnofile' => 'Ingen importfil opplastet.',
-'importuploaderrorsize' => 'Importfilopplasting mislyktes. Filen er større enn tillatt opplastingsstørrelse.',
-'importuploaderrorpartial' => 'Importfilopplasting mislyktes. Filen ble kun delvis opplastet.',
-'importuploaderrortemp' => 'Importfilopplasting mislyktes. En midlertidig mappe mangler.',
-'import-parse-failure' => 'Tolkningsfeil ved XML-import',
-'import-noarticle' => 'Ingen side å importere!',
-'import-nonewrevisions' => 'Alle revisjoner var importert fra før.',
-'xml-error-string' => '$1 på linje $2, kolonne $3 (byte: $4): $5',
-'import-upload' => 'Last opp XML-data',
-'import-token-mismatch' => 'Sesjonsdata mistet. Venligst prøv igjen.',
-'import-invalid-interwiki' => 'Kan ikke importere fra angitt wiki.',
-
-# Import log
-'importlogpage' => 'Importlogg',
-'importlogpagetext' => 'Administrativ import av sider med redigeringshistorikk fra andre wikier.',
-'import-logentry-upload' => 'importerte [[$1]] ved opplasting',
-'import-logentry-upload-detail' => 'Importerte {{PLURAL:$1|én revisjon|$1 revisjoner}}',
-'import-logentry-interwiki' => 'transwikiimporterte $1',
-'import-logentry-interwiki-detail' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}} fra $2',
-
-# Tooltip help for the actions
-'tooltip-pt-userpage' => 'Din brukerside',
-'tooltip-pt-anonuserpage' => 'Brukersiden for IP-adressen du redigerer fra',
-'tooltip-pt-mytalk' => 'Din diskusjonsside',
-'tooltip-pt-anontalk' => 'Diskusjon om redigeringer fra denne IP-adressen',
-'tooltip-pt-preferences' => 'Dine innstillinger',
-'tooltip-pt-watchlist' => 'Liste over sider du overvåker for endringer.',
-'tooltip-pt-mycontris' => 'Liste over dine bidrag',
-'tooltip-pt-login' => 'Du oppfordres til å logge inn, men det er ikke obligatorisk',
-'tooltip-pt-anonlogin' => 'Du oppfordres til å logge inn, men det er ikke obligatorisk.',
-'tooltip-pt-logout' => 'Logg ut',
-'tooltip-ca-talk' => 'Diskusjon om innholdssiden',
-'tooltip-ca-edit' => 'Du kan redigere denne siden. Vennligst bruk forhåndsvisningsknappen før du lagrer.',
-'tooltip-ca-addsection' => 'Start et nytt avsnitt',
-'tooltip-ca-viewsource' => 'Denne siden er beskyttet.
-Du kan se på kildeteksten',
-'tooltip-ca-history' => 'Tidligere revisjoner av denne siden',
-'tooltip-ca-protect' => 'Beskytt denne siden',
-'tooltip-ca-unprotect' => 'Endre beskyttelsen av denne siden',
-'tooltip-ca-delete' => 'Slett denne siden',
-'tooltip-ca-undelete' => 'Gjenopprett redigerenge som ble gjort på denne siden før den ble slettet.',
-'tooltip-ca-move' => 'Flytt denne siden',
-'tooltip-ca-watch' => 'Legg denne siden til overvåkningslisten din',
-'tooltip-ca-unwatch' => 'Fjern denne siden fra din overvåkningsliste',
-'tooltip-search' => 'Søk i {{SITENAME}}',
-'tooltip-search-go' => 'GÃ¥ til en side med dette navnet om den finnes',
-'tooltip-search-fulltext' => 'Søk etter sider som innholder denne teksten',
-'tooltip-p-logo' => 'Hovedside',
-'tooltip-n-mainpage' => 'GÃ¥ til hovedsiden',
-'tooltip-n-mainpage-description' => 'GÃ¥ til hovedsiden',
-'tooltip-n-portal' => 'Om prosjektet, hva du kan gjøre, hvor du kan finne ting',
-'tooltip-n-currentevents' => 'Finn bakgrunnsinformasjon om aktuelle hendelser',
-'tooltip-n-recentchanges' => 'Liste over siste endringer på wikien.',
-'tooltip-n-randompage' => 'Vis en tilfeldig side',
-'tooltip-n-help' => 'Stedet for å få hjelp',
-'tooltip-t-whatlinkshere' => 'Liste over alle wikisider som lenker hit',
-'tooltip-t-recentchangeslinked' => 'Siste endringer i sider som blir lenket fra denne siden',
-'tooltip-feed-rss' => 'RSS-mating for denne siden',
-'tooltip-feed-atom' => 'Atom-mating for denne siden',
-'tooltip-t-contributions' => 'Vis liste over bidrag fra denne brukeren',
-'tooltip-t-emailuser' => 'Send en e-post til denne brukeren',
-'tooltip-t-upload' => 'Last opp filer',
-'tooltip-t-specialpages' => 'Liste over alle spesialsider',
-'tooltip-t-print' => 'Utskriftsvennlig versjon av denne siden',
-'tooltip-t-permalink' => 'Permanent lenke til denne revisjonen av siden',
-'tooltip-ca-nstab-main' => 'Vis innholdssiden',
-'tooltip-ca-nstab-user' => 'Vis brukersiden',
-'tooltip-ca-nstab-media' => 'Vis mediasiden',
-'tooltip-ca-nstab-special' => 'Dette er en spesialside og kan ikke redigeres',
-'tooltip-ca-nstab-project' => 'Vis prosjektsiden',
-'tooltip-ca-nstab-image' => 'Vis filsiden',
-'tooltip-ca-nstab-mediawiki' => 'Vis systembeskjeden',
-'tooltip-ca-nstab-template' => 'Vis malen',
-'tooltip-ca-nstab-help' => 'Vis hjelpesiden',
-'tooltip-ca-nstab-category' => 'Vis kategorisiden',
-'tooltip-minoredit' => 'Merk dette som en mindre endring',
-'tooltip-save' => 'Lagre endringene dine',
-'tooltip-preview' => 'Forhåndsvis endringene dine, vennligst gjør dette før du lagrer!',
-'tooltip-diff' => 'Vis hvilke endringer du har gjort på teksten',
-'tooltip-compareselectedversions' => 'Se forskjellen mellom de to valgte revisjonene av denne siden',
-'tooltip-watch' => 'Legg denne siden til overvåkningslisten din',
-'tooltip-recreate' => 'Gjenopprett siden til tross for at den har blitt slettet',
-'tooltip-upload' => 'Start opplasting',
-'tooltip-rollback' => '«Tilbakestill»-knappen tilbakestiller den siste bidragsyterens endring(er) på denne siden med ett klikk',
-'tooltip-undo' => '«Angre» tilbakestiller denne endringen og åpner redigeringsskjemaet i forhåndsvisningsmodus. Det tillater en å legge til en begrunnelse i redigeringsforklaringen.',
-'tooltip-preferences-save' => 'Lagre innstillinger',
-'tooltip-summary' => 'Skriv et kort sammendrag',
-
-# Stylesheets
-'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utseender. */',
-'standard.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Standard */',
-'nostalgia.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Nostalgia */',
-'cologneblue.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Kølnerblå */',
-'monobook.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Monobook */',
-'myskin.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta MySkin */',
-'chick.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Chick */',
-'simple.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Simple */',
-'modern.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Modern */',
-
-# Scripts
-'common.js' => '/* Javascript i denne fila vil gjelde for alle drakter. */',
-'standard.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Standard */',
-'nostalgia.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Nostalgia */',
-'cologneblue.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Kølnerblå */',
-'monobook.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Monobook */',
-'myskin.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta MySkin */',
-'chick.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Chick */',
-'simple.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Simple */',
-'modern.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Modern */',
-
-# Metadata
-'notacceptable' => 'Tjeneren har ingen mulige måter å vise data i din nettleser.',
-
-# Attribution
-'anonymous' => '{{PLURAL:$1|Anonym bruker|Anonyme brukere}} av {{SITENAME}}',
-'siteuser' => '{{SITENAME}}-bruker $1',
-'anonuser' => '{{SITENAME}}s anonyme bruker $1',
-'lastmodifiedatby' => 'Denne siden ble sist redigert $1 kl. $2 av $3.',
-'othercontribs' => 'Basert på arbeid av $1.',
-'others' => 'andre',
-'siteusers' => '{{SITENAME}}-{{PLURAL:$2|bruker|brukere}} $1',
-'anonusers' => '{{SITENAME}}s {{PLURAL:$2|anonyme bruker|anonyme brukere}} $1',
-'creditspage' => 'Sidekrediteringer',
-'nocredits' => 'Ingen krediteringer er tilgjengelig for denne siden.',
-
-# Spam protection
-'spamprotectiontitle' => 'Søppelpostfilter',
-'spamprotectiontext' => 'Siden du ønsket å lagre ble blokkert av spamfilteret.
-Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nettsted.',
-'spamprotectionmatch' => 'Følgende tekst er det som aktiverte spamfilteret: $1',
-'spambot_username' => 'MediaWikis spamopprydning',
-'spam_reverting' => 'Tilbakestiller til siste versjon uten lenke til $1',
-'spam_blanking' => 'Alle revisjoner inneholdt lenke til $1, tømmer siden',
-
-# Info page
-'pageinfo-title' => 'Informasjon om «$1»',
-'pageinfo-header-edits' => 'Redigeringer',
-'pageinfo-header-watchlist' => 'Overvåkningsliste',
-'pageinfo-header-views' => 'Visninger',
-'pageinfo-subjectpage' => 'Side',
-'pageinfo-talkpage' => 'Diskusjonsside',
-'pageinfo-watchers' => 'Antall overvåkere',
-'pageinfo-edits' => 'Antall redigeringer',
-'pageinfo-authors' => 'Antall forskjellige forfattere',
-'pageinfo-views' => 'Antall visninger',
-'pageinfo-viewsperedit' => 'Visninger per redigering',
-
-# Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Nostalgi',
-'skinname-cologneblue' => 'Kølnerblå',
-'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Eget utseende',
-'skinname-simple' => 'Enkel',
-'skinname-modern' => 'Moderne',
-
-# Patrolling
-'markaspatrolleddiff' => 'Godkjenn endringen',
-'markaspatrolledtext' => 'Godkjenn denne siden',
-'markedaspatrolled' => 'Merket som godkjent',
-'markedaspatrolledtext' => 'Den valgte revisjonen av [[:$1]] har blitt markert som patruljert.',
-'rcpatroldisabled' => 'Siste endringer-patruljering er slått av',
-'rcpatroldisabledtext' => 'Siste endringer-patruljeringsfunksjonen er slått av.',
-'markedaspatrollederror' => 'Kan ikke merke som godkjent',
-'markedaspatrollederrortext' => 'Du må spesifisere en versjon å merke som godkjent.',
-'markedaspatrollederror-noautopatrol' => 'Du kan ikke merke dine egne endringer som godkjente.',
-
-# Patrol log
-'patrol-log-page' => 'Godkjenningslogg',
-'patrol-log-header' => 'Dette er en logg over patruljerte sideversjoner.',
-'log-show-hide-patrol' => '$1 patruljeringslogg',
-
-# Image deletion
-'deletedrevision' => 'Slettet gammel revisjon $1.',
-'filedeleteerror-short' => 'Feil under filsletting: $1',
-'filedeleteerror-long' => 'Feil oppsto under filsletting:
-
-$1',
-'filedelete-missing' => 'Filen «$1» kan ikke slettes fordi den ikke finnes.',
-'filedelete-old-unregistered' => 'Filrevisjonen «$1» finnes ikke i databasen.',
-'filedelete-current-unregistered' => 'Filen «$1» finnes ikke i databasen.',
-'filedelete-archive-read-only' => 'Arkivmappa «$1» kan ikke skrives av tjeneren.',
-
-# Browsing diffs
-'previousdiff' => '↠Forrige endring',
-'nextdiff' => 'Neste endring →',
-
-# Media information
-'mediawarning' => "'''Advarsel''': Denne filen kan inneholde farlig kode.
-Ved å åpne den kan systemet ditt kompromitteres.",
-'imagemaxsize' => "Bildestørrelsesgrense:<br />''(for filbeskrivelsessider)''",
-'thumbsize' => 'Miniatyrbildestørrelse:',
-'widthheightpage' => '$1×$2, {{PLURAL:$3|én side|$3 sider}}',
-'file-info' => 'filstørrelse: $1, MIME-type: $2',
-'file-info-size' => '$1 × $2 piksler, filstørrelse: $3, MIME-type: $4',
-'file-info-size-pages' => '$1 × $2 piksler, filstørrelse: $3, MIME-type: $4, $5 {{PLURAL:$5|side|sider}}',
-'svg-long-desc' => 'SVG-fil, standardoppløsning $1 × $2 piksler, filstørrelse: $3',
-'show-big-image' => 'Full oppløsning',
-'show-big-image-size' => '$1 × $2 piksler',
-'file-info-gif-looped' => 'gjentas',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|ramme|rammer}}',
-'file-info-png-looped' => 'loopet',
-'file-info-png-repeat' => 'avspilt $1 {{PLURAL:$1|gang|ganger}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|bilde|bilder}}',
-
-# Special:NewFiles
-'newimages' => 'Galleri over nye filer',
-'imagelisttext' => "Dete er en liste med '''$1''' {{PLURAL:$1|fil|filer}} sortert $2.",
-'newimages-summary' => 'Denne spesialsiden viser de sist opplastede filene.',
-'newimages-legend' => 'Filnavn',
-'newimages-label' => 'Filnavn (helt eller delvis):',
-'showhidebots' => '($1 roboter)',
-'noimages' => 'Ingenting å se.',
-'ilsubmit' => 'Søk',
-'bydate' => 'etter dato',
-'sp-newimages-showfrom' => 'Vis nye filer fra og med $2 $1',
-
-# Bad image list
-'bad_image_list' => 'Formatet er som følger:
-
-Kun listeelementer (linjer som starter med *) tas med.
-Den første lenken på en linje må være en lenke til en dårlig fil.
-Alle andre lenker på samme linje anses for å være unntak, altså sider der filen kan opptre.',
-
-# Metadata
-'metadata' => 'Metadata',
-'metadata-help' => 'Denne filen inneholder tilleggsinformasjon, antagligvis lagt til av digitalkameraet eller skanneren brukt til å lage eller digitalisere det.
-Hvis filen har blitt forandret fra utgangspunktet, kan enkelte detaljer være unøyaktige.',
-'metadata-expand' => 'Vis utvidede detaljer',
-'metadata-collapse' => 'Skjul utvidede detaljer',
-'metadata-fields' => 'Bildemetadatafelt listet i denne meldingen inkluderes på bildesiden når metadatatabellen er slått sammen.
-Andre vil skjules som standard.
-* make
-* model
-* datetimeoriginal
-* exposuretime
-* fnumber
-* isospeedratings
-* focallength
-* artist
-* copyright
-* imagedescription
-* gpslatitude
-* gpslongitude
-* gpsaltitude',
-
-# EXIF tags
-'exif-imagewidth' => 'Bredde',
-'exif-imagelength' => 'Høyde',
-'exif-bitspersample' => 'Bits per komponent',
-'exif-compression' => 'Kompresjonsskjema',
-'exif-photometricinterpretation' => 'Pixelsammensetning',
-'exif-orientation' => 'Retning',
-'exif-samplesperpixel' => 'Antall komponenter',
-'exif-planarconfiguration' => 'Dataarrangement',
-'exif-ycbcrsubsampling' => 'Subsamplingsforhold mellom Y og C',
-'exif-ycbcrpositioning' => 'Y- og C-posisjonering',
-'exif-xresolution' => 'Horisontal oppløsning',
-'exif-yresolution' => 'Vertikal oppløsning',
-'exif-stripoffsets' => 'Plassering for bildedata',
-'exif-rowsperstrip' => 'Antall rader per stripe',
-'exif-stripbytecounts' => 'Antall byte per kompresserte stripe',
-'exif-jpeginterchangeformat' => 'Offset til JPEG SOI',
-'exif-jpeginterchangeformatlength' => 'Byte med JPEG-data',
-'exif-whitepoint' => 'Hvitpunktkromatisitet',
-'exif-primarychromaticities' => 'Primærfargenes renhet',
-'exif-ycbcrcoefficients' => 'Koeffisienter fr fargeromstransformasjonsmatrise',
-'exif-referenceblackwhite' => 'Par av svarte og hvite referanseverdier',
-'exif-datetime' => 'Dato og tid for filendring',
-'exif-imagedescription' => 'Bildetittel',
-'exif-make' => 'Kameraprodusent',
-'exif-model' => 'Kameramodell',
-'exif-software' => 'Programvare brukt',
-'exif-artist' => 'Skaper',
-'exif-copyright' => 'Opphavsbeskyttelse tilhører',
-'exif-exifversion' => 'Exif-versjon',
-'exif-flashpixversion' => 'Støttet Flashpix-versjon',
-'exif-colorspace' => 'Fargerom',
-'exif-componentsconfiguration' => 'Betydning av hver komponent',
-'exif-compressedbitsperpixel' => 'Bildekompresjonsmodus',
-'exif-pixelydimension' => 'Bildebredde',
-'exif-pixelxdimension' => 'Bildehøyde',
-'exif-usercomment' => 'Brukerkommentarer',
-'exif-relatedsoundfile' => 'Relatert lydfil',
-'exif-datetimeoriginal' => 'Dato og tid for datagenerering',
-'exif-datetimedigitized' => 'Dato og tid for digitalisering',
-'exif-subsectime' => 'Endringstidspunkt, sekunddeler',
-'exif-subsectimeoriginal' => 'Eksponeringstidspunkt, sekunddeler',
-'exif-subsectimedigitized' => 'Digitaliseringstidspunkt, sekunddeler',
-'exif-exposuretime' => 'Eksponeringstid',
-'exif-exposuretime-format' => '$1 sek ($2)',
-'exif-fnumber' => 'F-nummer',
-'exif-exposureprogram' => 'Eksponeringsprogram',
-'exif-spectralsensitivity' => 'Spektralsensitivitet',
-'exif-isospeedratings' => 'Filmhastighet (ISO)',
-'exif-shutterspeedvalue' => 'APEX lukkerhastighet',
-'exif-aperturevalue' => 'APEX blenderåpning',
-'exif-brightnessvalue' => 'APEX lysstyrke',
-'exif-exposurebiasvalue' => 'Eksponeringsbias',
-'exif-maxaperturevalue' => 'Maksimal blender',
-'exif-subjectdistance' => 'Avstand til subjekt',
-'exif-meteringmode' => 'MÃ¥lingsmodus',
-'exif-lightsource' => 'Lyskilde',
-'exif-flash' => 'Blits',
-'exif-focallength' => 'Linsens brennvidde',
-'exif-subjectarea' => 'Motivområde',
-'exif-flashenergy' => 'Blitsenergi',
-'exif-focalplanexresolution' => 'Oppløsning i fokalplan X',
-'exif-focalplaneyresolution' => 'Oppløsning i fokalplan Y',
-'exif-focalplaneresolutionunit' => 'Enhet for oppløsning i fokalplan',
-'exif-subjectlocation' => 'Motivets beliggenhet',
-'exif-exposureindex' => 'Eksponeringsindeks',
-'exif-sensingmethod' => 'Avkjenningsmetode',
-'exif-filesource' => 'Filkilde',
-'exif-scenetype' => 'Scenetype',
-'exif-customrendered' => 'Tilpasset bildebehandling',
-'exif-exposuremode' => 'Eksponeringsmodus',
-'exif-whitebalance' => 'Hvit balanse',
-'exif-digitalzoomratio' => 'Digitalt zoomomfang',
-'exif-focallengthin35mmfilm' => 'Brennvidde på 35 mm-film',
-'exif-scenecapturetype' => 'Motivprogram',
-'exif-gaincontrol' => 'Scenekontroll',
-'exif-contrast' => 'Kontrast',
-'exif-saturation' => 'Metning',
-'exif-sharpness' => 'Skarphet',
-'exif-devicesettingdescription' => 'Beskrivelse av apparatets innstilling',
-'exif-subjectdistancerange' => 'Avstandsintervall til motiv',
-'exif-imageuniqueid' => 'Unik bilde-ID',
-'exif-gpsversionid' => 'Versjon for GPS-tagger',
-'exif-gpslatituderef' => 'nordlig eller sørlig breddegrad',
-'exif-gpslatitude' => 'Breddegrad',
-'exif-gpslongituderef' => 'Østlig eller vestlig breddegrad',
-'exif-gpslongitude' => 'Lengdegrad',
-'exif-gpsaltituderef' => 'Høydereferanse',
-'exif-gpsaltitude' => 'Høyde',
-'exif-gpstimestamp' => 'GPS-tid (atomklokke)',
-'exif-gpssatellites' => 'Satelitter brukt i måling',
-'exif-gpsstatus' => 'Mottakerstatus',
-'exif-gpsmeasuremode' => 'MÃ¥lingsmodus',
-'exif-gpsdop' => 'MÃ¥lingspresisjon',
-'exif-gpsspeedref' => 'Fartsenhet',
-'exif-gpsspeed' => 'GPS-mottakerens hastighet',
-'exif-gpstrackref' => 'Referanse for bevegelsesretning',
-'exif-gpstrack' => 'Bevegelsesretning',
-'exif-gpsimgdirectionref' => 'Referanse for bilderetning',
-'exif-gpsimgdirection' => 'Bilderetning',
-'exif-gpsmapdatum' => 'Brukt geodetisk data',
-'exif-gpsdestlatituderef' => 'Referanse for målbreddegrad',
-'exif-gpsdestlatitude' => 'MÃ¥lbreddegrad',
-'exif-gpsdestlongituderef' => 'Referanse for mållengdegrad',
-'exif-gpsdestlongitude' => 'MÃ¥llengdegrad',
-'exif-gpsdestbearingref' => 'Referanse for retning mot målet',
-'exif-gpsdestbearing' => 'Retning mot målet',
-'exif-gpsdestdistanceref' => 'Referanse for lengde til mål',
-'exif-gpsdestdistance' => 'Lengde til mål',
-'exif-gpsprocessingmethod' => 'Navn på GPS-prosesseringsmetode',
-'exif-gpsareainformation' => 'Navn på GPS-område',
-'exif-gpsdatestamp' => 'GPS-dato',
-'exif-gpsdifferential' => 'Differentiell GPS-korreksjon',
-'exif-jpegfilecomment' => 'JPEG-filkommentar',
-'exif-keywords' => 'Nøkkelord',
-'exif-worldregioncreated' => 'Verdensregionen som bildet ble tatt i',
-'exif-countrycreated' => 'Landet som bildet ble tatt i',
-'exif-countrycodecreated' => 'Landskoden som bildet ble tatt i',
-'exif-provinceorstatecreated' => 'Provinsen eller delstaten som bildet ble tatt i',
-'exif-citycreated' => 'Byen som bildet ble tatt i',
-'exif-sublocationcreated' => 'Bydelen som bildet ble tatt i',
-'exif-worldregiondest' => 'Verdensregionen vises',
-'exif-countrydest' => 'Landet vises',
-'exif-countrycodedest' => 'Landskoden vises',
-'exif-provinceorstatedest' => 'Provinsen eller delstaten vises',
-'exif-citydest' => 'Byen vises',
-'exif-sublocationdest' => 'Bydelen vises',
-'exif-objectname' => 'Kort tittel',
-'exif-specialinstructions' => 'Spesielle instruksjoner',
-'exif-headline' => 'Overskrift',
-'exif-credit' => 'Kreditt/Leverandør',
-'exif-source' => 'Kilde',
-'exif-editstatus' => 'Bildets redaksjonelle status',
-'exif-urgency' => 'Prioritet',
-'exif-fixtureidentifier' => 'Fiksturnavn',
-'exif-locationdest' => 'Avbildet plass',
-'exif-locationdestcode' => 'Avbildet plasseringskode',
-'exif-objectcycle' => 'Tid på dagen mediet er ment for',
-'exif-contact' => 'Kontaktinformasjon',
-'exif-writer' => 'Forfatter',
-'exif-languagecode' => 'Språk',
-'exif-iimversion' => 'IIM-versjon',
-'exif-iimcategory' => 'Kategori',
-'exif-iimsupplementalcategory' => 'Tilleggskategorier',
-'exif-datetimeexpires' => 'Ikke bruk etter',
-'exif-datetimereleased' => 'Utgitt den',
-'exif-originaltransmissionref' => 'Opprinnelig lokasjonskode for transmisjon',
-'exif-identifier' => 'Identifikator',
-'exif-lens' => 'Objektiv',
-'exif-serialnumber' => 'Kameraets serienummer',
-'exif-cameraownername' => 'Kameraets eier',
-'exif-label' => 'Etikett',
-'exif-datetimemetadata' => 'Dato metadata sist ble endret',
-'exif-nickname' => 'Bildets uformelle navn',
-'exif-rating' => 'Vurdering (av 5)',
-'exif-rightscertificate' => 'Rettighetsforvaltningssertifikat',
-'exif-copyrighted' => 'Opphavsrettsstatus',
-'exif-copyrightowner' => 'Opphavsrettsinnehaver',
-'exif-usageterms' => 'Bruksvilkår',
-'exif-webstatement' => 'Opphavsrettserklæring på internett',
-'exif-originaldocumentid' => 'Unik ID for originaldokumentet',
-'exif-licenseurl' => 'URL for opphavsrettslisens',
-'exif-morepermissionsurl' => 'Alternativ lisensieringsinformasjon',
-'exif-attributionurl' => 'Ved gjenbruk av dette arbeidet, vennligst inkluder en lenke til',
-'exif-preferredattributionname' => 'Ved gjenbruk av dette arbeidet, vennligst gi kreditt til',
-'exif-pngfilecomment' => 'PNG-filkommentar',
-'exif-disclaimer' => 'Ansvarsfraskrivelse',
-'exif-contentwarning' => 'Innholdsadvarsel',
-'exif-giffilecomment' => 'GIF-filkommentar',
-'exif-intellectualgenre' => 'Elementtype',
-'exif-subjectnewscode' => 'Emnekode',
-'exif-scenecode' => 'IPTC-scenekode',
-'exif-event' => 'Avbildet hendelse',
-'exif-organisationinimage' => 'Avbildet organisasjon',
-'exif-personinimage' => 'Avbildet person',
-'exif-originalimageheight' => 'Høyde på bildet før det ble beskåret',
-'exif-originalimagewidth' => 'Bredde på bildet før det ble beskåret',
-
-# EXIF attributes
-'exif-compression-1' => 'Ukomprimert',
-'exif-compression-2' => 'CCITT Gruppe 3 1-dimensjonal modifisert Huffman-kjørelengdekoding',
-'exif-compression-3' => 'CCITT Gruppe 3 faks-koding',
-'exif-compression-4' => 'CCITT Gruppe 4 faks-koding',
-
-'exif-copyrighted-true' => 'Opphavsrettsbeskyttet',
-'exif-copyrighted-false' => 'Ikke beskyttet av opphavsrett',
-
-'exif-unknowndate' => 'Ukjent dato',
-
-'exif-orientation-1' => 'Normal',
-'exif-orientation-2' => 'Snudd horisontalt',
-'exif-orientation-3' => 'Rotert 180°',
-'exif-orientation-4' => 'Snudd vertikalt',
-'exif-orientation-5' => 'Rotated 90° CCW and flipped vertically
-
-Rotert 90° mot klokka og vridd vertikalt',
-'exif-orientation-6' => 'Rotert 90° mot klokka',
-'exif-orientation-7' => 'Rotert 90° med klokka og vridd vertikalt',
-'exif-orientation-8' => 'Rotert 90° med klokka',
-
-'exif-planarconfiguration-1' => 'chunkformat',
-'exif-planarconfiguration-2' => 'planærformat',
-
-'exif-colorspace-65535' => 'Ukalibrert',
-
-'exif-componentsconfiguration-0' => 'finnes ikke',
-
-'exif-exposureprogram-0' => 'Ikke angitt',
-'exif-exposureprogram-1' => 'Manuell',
-'exif-exposureprogram-2' => 'Normalt program',
-'exif-exposureprogram-3' => 'Blenderprioritet',
-'exif-exposureprogram-4' => 'Slutterprioritet',
-'exif-exposureprogram-5' => 'Kunstnerlig program (prioriterer skarphetsdyp)',
-'exif-exposureprogram-6' => 'Bevegelsesprogram (prioriterer kortere sluttertid)',
-'exif-exposureprogram-7' => 'Portrettmodus (for nærbilder med ufokusert bakgrunn)',
-'exif-exposureprogram-8' => 'Landskapsmodus (for landskapsbilder med fokusert bakgrunn)',
-
-'exif-subjectdistance-value' => '$1 meter',
-
-'exif-meteringmode-0' => 'Ukjent',
-'exif-meteringmode-1' => 'Gjennomsnitt',
-'exif-meteringmode-2' => 'Sentrumsveid gjennomsnitt',
-'exif-meteringmode-3' => 'Spot',
-'exif-meteringmode-4' => 'Multispot',
-'exif-meteringmode-5' => 'Mønster',
-'exif-meteringmode-6' => 'Delvis',
-'exif-meteringmode-255' => 'Annet',
-
-'exif-lightsource-0' => 'Ukjent',
-'exif-lightsource-1' => 'Dagslys',
-'exif-lightsource-2' => 'Lysrør',
-'exif-lightsource-3' => 'Glødelampe',
-'exif-lightsource-4' => 'Blits',
-'exif-lightsource-9' => 'Fint vær',
-'exif-lightsource-10' => 'Overskyet',
-'exif-lightsource-11' => 'Skygge',
-'exif-lightsource-12' => 'Dagslyslysrør (D 5700 – 7100K)',
-'exif-lightsource-13' => 'Dagshvitt lysrør (N 4600 – 5400K)',
-'exif-lightsource-14' => 'Kaldhvitt lysrør (W 3900 – 4500K)',
-'exif-lightsource-15' => 'Hvitt lysrør (WW 3200 – 3700K)',
-'exif-lightsource-17' => 'Standardlys A',
-'exif-lightsource-18' => 'Standardlys B',
-'exif-lightsource-19' => 'Standardlys C',
-'exif-lightsource-24' => 'ISO studiobelysning',
-'exif-lightsource-255' => 'Annen lyskilde',
-
-# Flash modes
-'exif-flash-fired-0' => 'Blitz ikke utløst',
-'exif-flash-fired-1' => 'Blitz utløst',
-'exif-flash-return-0' => 'ingen funksjon for oppdaing av strobelys',
-'exif-flash-return-2' => 'strobelys ikke oppdaget',
-'exif-flash-return-3' => 'strobelys oppdaget',
-'exif-flash-mode-1' => 'tvunget blitzutløsning',
-'exif-flash-mode-2' => 'tvunget blitzløs',
-'exif-flash-mode-3' => 'automatisk modus',
-'exif-flash-function-1' => 'Ingen blitzfunksjon',
-'exif-flash-redeye-1' => 'røde-øyne-redusering',
-
-'exif-focalplaneresolutionunit-2' => 'tommer',
-
-'exif-sensingmethod-1' => 'Ikke angitt',
-'exif-sensingmethod-2' => 'Énchipsfargesensor',
-'exif-sensingmethod-3' => 'Tochipsfargesensor',
-'exif-sensingmethod-4' => 'Trechipsfargesensor',
-'exif-sensingmethod-5' => 'Fargesekvensiell områdesensor',
-'exif-sensingmethod-7' => 'Trilineær sensor',
-'exif-sensingmethod-8' => 'Fargesekvensiell linær sensor',
-
-'exif-filesource-3' => 'Digitalt stillbildekamera',
-
-'exif-scenetype-1' => 'Direktefotografert bilde',
-
-'exif-customrendered-0' => 'Normal prosess',
-'exif-customrendered-1' => 'Tilpasset prosess',
-
-'exif-exposuremode-0' => 'Automatisk eksponering',
-'exif-exposuremode-1' => 'Manuell eksponering',
-'exif-exposuremode-2' => 'Automatisk alternativeksponering',
-
-'exif-whitebalance-0' => 'Automatisk hvitbalanse',
-'exif-whitebalance-1' => 'Manuell hvitbalanse',
-
-'exif-scenecapturetype-0' => 'Standard',
-'exif-scenecapturetype-1' => 'Landskap',
-'exif-scenecapturetype-2' => 'Portrett',
-'exif-scenecapturetype-3' => 'Nattscene',
-
-'exif-gaincontrol-0' => 'Ingen',
-'exif-gaincontrol-1' => 'Økning av lavnivåforsterkning',
-'exif-gaincontrol-2' => 'Økning av høynivåforsterkning',
-'exif-gaincontrol-3' => 'Senkning av lavnivåforsterkning',
-'exif-gaincontrol-4' => 'Senkning av høynivåforsterkning',
-
-'exif-contrast-0' => 'Normal',
-'exif-contrast-1' => 'Myk',
-'exif-contrast-2' => 'Hard',
-
-'exif-saturation-0' => 'Normal',
-'exif-saturation-1' => 'Lav metningsgrad',
-'exif-saturation-2' => 'Høy metningsgrad',
-
-'exif-sharpness-0' => 'Normal',
-'exif-sharpness-1' => 'Myk',
-'exif-sharpness-2' => 'Hard',
-
-'exif-subjectdistancerange-0' => 'Ukjent',
-'exif-subjectdistancerange-1' => 'Makro',
-'exif-subjectdistancerange-2' => 'Nærbilde',
-'exif-subjectdistancerange-3' => 'Fjernbilde',
-
-# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
-'exif-gpslatitude-n' => 'Nordlig breddegrad',
-'exif-gpslatitude-s' => 'Sørlig breddegrad',
-
-# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
-'exif-gpslongitude-e' => 'Østlig lengdegrad',
-'exif-gpslongitude-w' => 'Vestlig lengdegrad',
-
-# Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => '{{PLURAL:$1|Én|$1}} meter over havet',
-'exif-gpsaltitude-below-sealevel' => '{{PLURAL:$1|Én|$1}} meter under havet',
-
-'exif-gpsstatus-a' => 'Måling pågår',
-'exif-gpsstatus-v' => 'MÃ¥lingsinteroperabilitet',
-
-'exif-gpsmeasuremode-2' => 'todimensjonell måling',
-'exif-gpsmeasuremode-3' => 'tredimensjonell måling',
-
-# Pseudotags used for GPSSpeedRef
-'exif-gpsspeed-k' => 'Kilometer per time',
-'exif-gpsspeed-m' => 'Miles per time',
-'exif-gpsspeed-n' => 'Knop',
-
-# Pseudotags used for GPSDestDistanceRef
-'exif-gpsdestdistance-k' => 'Kilometer',
-'exif-gpsdestdistance-m' => 'Miles',
-'exif-gpsdestdistance-n' => 'Nautiske mil',
-
-'exif-gpsdop-excellent' => 'Utmerket ($1)',
-'exif-gpsdop-good' => 'God ($1)',
-'exif-gpsdop-moderate' => 'Moderat ($1)',
-'exif-gpsdop-fair' => 'Middelmådig ($1)',
-'exif-gpsdop-poor' => 'DÃ¥rlig ($1)',
-
-'exif-objectcycle-a' => 'Kun morgen',
-'exif-objectcycle-p' => 'Kun kveld',
-'exif-objectcycle-b' => 'BÃ¥de morgen og kveld',
-
-# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
-'exif-gpsdirection-t' => 'Sann retning',
-'exif-gpsdirection-m' => 'Magnetisk retning',
-
-'exif-ycbcrpositioning-1' => 'Sentrert',
-'exif-ycbcrpositioning-2' => 'Co-lokalisert',
-
-'exif-dc-contributor' => 'Bidragsytere',
-'exif-dc-coverage' => 'Romlig eller timelig omfang av mediet',
-'exif-dc-date' => 'Dato(er)',
-'exif-dc-publisher' => 'Utgiver',
-'exif-dc-relation' => 'Relaterte media',
-'exif-dc-rights' => 'Rettigheter',
-'exif-dc-source' => 'Mediakilde',
-'exif-dc-type' => 'Mediatype',
-
-'exif-rating-rejected' => 'Avvist',
-
-'exif-isospeedratings-overflow' => 'Større enn 65535',
-
-'exif-iimcategory-ace' => 'Kunst, kultur og underholdning',
-'exif-iimcategory-clj' => 'Kriminalitet og jura',
-'exif-iimcategory-dis' => 'Katastrofer og ulykker',
-'exif-iimcategory-fin' => 'Økonomi og næringsliv',
-'exif-iimcategory-edu' => 'Utdanning',
-'exif-iimcategory-evn' => 'Miljø',
-'exif-iimcategory-hth' => 'Helse',
-'exif-iimcategory-hum' => 'Menneskelig interesse',
-'exif-iimcategory-lab' => 'Arbeidskraft',
-'exif-iimcategory-lif' => 'Livsstil og fritid',
-'exif-iimcategory-pol' => 'Politikk',
-'exif-iimcategory-rel' => 'Religion og livssyn',
-'exif-iimcategory-sci' => 'Vitenskap og teknologi',
-'exif-iimcategory-soi' => 'Sosiale problemer',
-'exif-iimcategory-spo' => 'Sport',
-'exif-iimcategory-war' => 'Krig, konflikt og uro',
-'exif-iimcategory-wea' => 'Vær',
-
-'exif-urgency-normal' => 'Normal ($1)',
-'exif-urgency-low' => 'Lav ($1)',
-'exif-urgency-high' => 'Høy ($1)',
-'exif-urgency-other' => 'Brukerdefinert prioritet ($1)',
-
-# External editor support
-'edit-externally' => 'Rediger denne filen med et eksternt program',
-'edit-externally-help' => '(Se [//www.mediawiki.org/wiki/Manual:External_editors oppsettsinstruksjonene] for mer informasjon)',
-
-# 'all' in various places, this might be different for inflected languages
-'watchlistall2' => 'alle',
-'namespacesall' => 'alle',
-'monthsall' => 'alle',
-'limitall' => 'alle',
-
-# E-mail address confirmation
-'confirmemail' => 'Bekreft e-postadresse',
-'confirmemail_noemail' => 'Du har ikke oppgitt en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]].',
-'confirmemail_text' => 'Du må bekrefte e-postadressen din før du kan benytte deg av e-posttjenester på {{SITENAME}}. Trykk på knappen under for å sende en bekreftelsesmelding til e-postadressen din. Meldingen vil inneholde en lenke med en kode; følg lenken for å bekrefte at e-postadressen er gyldig.',
-'confirmemail_pending' => 'En bekreftelseskode har allerede blitt sendt til deg på e-post; om du nylig opprettet kontoen din, kan du ønske å vente noen minutter før du spør om ny kode.',
-'confirmemail_send' => 'Send en bekreftelseskode.',
-'confirmemail_sent' => 'Bekreftelsesmelding sendt.',
-'confirmemail_oncreate' => 'En bekreftelseskode ble sendt til din e-postadresse. Denne koden er ikke nødvendig for å logge inn, men er nødvendig for å slå på e-postbaserte tjenester i denne wikien.',
-'confirmemail_sendfailed' => '{{SITENAME}} klarte ikke å sende bekreftelseskode.
-Sjekk e-postadressen for ugyldige tegn.
-
-E-postsenderen ga følgende melding: $1',
-'confirmemail_invalid' => 'Ugyldig bekreftelseskode. Koden kan ha utløpt.',
-'confirmemail_needlogin' => 'Du må $1 for å bekrefte e-postadressen din.',
-'confirmemail_success' => 'Din e-postadresse er nå bekreftet. Du kan nå logge inn og nyte wikien.',
-'confirmemail_loggedin' => 'E-postadressen din er bekreftet.',
-'confirmemail_error' => 'Noe gikk galt under lagringen av din bekreftelse.',
-'confirmemail_subject' => 'Bekreftelsesmelding fra {{SITENAME}}',
-'confirmemail_body' => 'Noen, antageligvis deg, har registrert kontoen «$2» på {{SITENAME}}, fra IP-adressen $1.
-
-For å bekrefte at denne kontoen tilhører deg og for å aktivere e-posttjenester på {{SITENAME}}, åpne følgende lenke i nettleseren din:
-
-$3
-
-Om du *ikke* registrerte kontoen, følg denne lenken for å avbryte bekreftelse av e-postadresse:
-
-$5
-
-Denne bekreftelseskoden utgår $4.',
-'confirmemail_body_changed' => 'Noen, antageligvis deg, fra IP-adresse $1,
-har endret e-postadressen til kontoen «$2» til denne adressen på {{SITENAME}}.
-
-For å bekrefte at denne kontoen virkelig er din og for å reaktivere e-postegenskaper på {{SITENAME}}, åpne denne lenken i nettleseren din:
-
-$3
-
-Dersom denne kontoen *ikke* tilhører deg, følg denne lenken
-for å avbryte e-postbekreftelsen:
-
-$5
-
-Denne bekreftelseskoden vil løpe ut $4.',
-'confirmemail_body_set' => 'Noen, trolig deg, har satt e-postadressen for kontoen «$2» til denne adressen på {{SITENAME}}, fra IP-adressen $1.
-
-For å bekrefte at denne kontoen tilhører deg og for å slå på e-posttjenestene på {{SITENAME}}, åpne denne lenka i nettleseren din:
-
-$3
-
-Om kontoen *ikke* tilhører deg, følg denne lenka for å avbryte bekreftelsen:
-
-$5
-
-Denne bekreftelseskoden går ut på dato $4.',
-'confirmemail_invalidated' => 'Bekreftelse av e-postadresse avbrutt',
-'invalidateemail' => 'Avbryt bekreftelse av e-postadresse',
-
-# Scary transclusion
-'scarytranscludedisabled' => '[Interwiki-transkludering er slått av]',
-'scarytranscludefailed' => '[Malen kunne ikke hentes for $1]',
-'scarytranscludetoolong' => '[URL-en er for lang]',
-
-# Delete conflict
-'deletedwhileediting' => "'''Advarsel:''' Denne siden har blitt slettet etter at du begynte å redigere den!",
-'confirmrecreate' => '«[[User:$1|$1]]» ([[User talk:$1|diskusjon]]) slettet siden etter at du begynte å redigere den, med begrunnelsen «$2». Vennligst bekreft at du vil gjenopprette siden.',
-'confirmrecreate-noreason' => 'Brukeren [[User:$1|$1]] ([[User talk:$1|diskusjon]]) slettet denne siden etter at du begynte å redigere. Bekreft at du virkelig ønsker å gjenopprette denne siden.',
-'recreate' => 'Gjenopprett',
-
-# action=purge
-'confirm_purge_button' => 'OK',
-'confirm-purge-top' => "Vil du slette tjenerens mellomlagrede versjon (''cache'') av denne siden?",
-'confirm-purge-bottom' => 'Rensing av en side sletter mellomlageret og tvinger frem den nyeste versjonen.',
-
-# action=watch/unwatch
-'confirm-watch-button' => 'OK',
-'confirm-watch-top' => 'Legg denne siden til overvåkningslisten din?',
-'confirm-unwatch-button' => 'OK',
-'confirm-unwatch-top' => 'Fjern denne siden fra overvåkningslisten din?',
-
-# Multipage image navigation
-'imgmultipageprev' => '↠forrige side',
-'imgmultipagenext' => 'neste side &rarr;',
-'imgmultigo' => 'GÃ¥!',
-'imgmultigoto' => 'GÃ¥ til siden $1',
-
-# Table pager
-'ascending_abbrev' => 'stig.',
-'descending_abbrev' => 'synk.',
-'table_pager_next' => 'Neste side',
-'table_pager_prev' => 'Forrige side',
-'table_pager_first' => 'Første side',
-'table_pager_last' => 'Siste side',
-'table_pager_limit' => 'Vis $1 elementer per side',
-'table_pager_limit_label' => 'Element per side:',
-'table_pager_limit_submit' => 'GÃ¥',
-'table_pager_empty' => 'Ingen resultater',
-
-# Auto-summaries
-'autosumm-blank' => 'Tømmer siden',
-'autosumm-replace' => 'Erstatter siden med «$1»',
-'autoredircomment' => 'Omdirigerer til [[$1]]',
-'autosumm-new' => 'Ny side: $1',
-
-# Live preview
-'livepreview-loading' => 'Laster…',
-'livepreview-ready' => 'Laster&nbsp;… Klar!',
-'livepreview-failed' => 'Levende forhåndsvisning mislyktes. Prøv vanlig forhåndsvisning.',
-'livepreview-error' => 'Tilkobling mislyktes: $1 «$2»
-Prøv vanlig forhåndsvisning.',
-
-# Friendlier slave lag warnings
-'lag-warn-normal' => 'Endringer nyere enn $1 {{PLURAL:$1|sekund|sekunder}} vises muligens ikke i denne listen.',
-'lag-warn-high' => 'PÃ¥ grunn av stor databaseforsinkelse, vil ikke endringer som er nyere enn $1 {{PLURAL:$1|sekund|sekunder}} vises i denne listen.',
-
-# Watchlist editor
-'watchlistedit-numitems' => 'Overvåkningslisten din inneholder {{PLURAL:$1|én tittel|$1 titler}}, ikke inkludert diskusjonssider.',
-'watchlistedit-noitems' => 'Overvåkningslisten din inneholder ingen titler.',
-'watchlistedit-normal-title' => 'Rediger overvåkningsliste',
-'watchlistedit-normal-legend' => 'Fjern titler fra overvåkninglisten',
-'watchlistedit-normal-explain' => 'Titler på overvåkningslisten din vises nedenfor.
-For å fjerne en tittel, merk av boksen ved siden av den og klikk på «{{int:Watchlistedit-normal-submit}}».
-Du kan også [[Special:EditWatchlist/raw|redigere den rå overvåkningslisten]].',
-'watchlistedit-normal-submit' => 'Fjern titler',
-'watchlistedit-normal-done' => '{{PLURAL:$1|Én tittel|$1 titler}} ble fjernet fra overvåkningslisten din:',
-'watchlistedit-raw-title' => 'Rediger rå overvåkningsliste',
-'watchlistedit-raw-legend' => 'Rediger rå overvåkningsliste',
-'watchlistedit-raw-explain' => 'Titler på overvåkningslisten din vises nedenunder, og kan redigeres ved å legge til eller fjerne fra listen;
-én tittel per linje.
-Når du er ferdig, trykk «{{int:Watchlistedit-raw-submit}}».
-Du kan også [[Special:EditWatchlist|bruke standardverktøyet]].',
-'watchlistedit-raw-titles' => 'Titler:',
-'watchlistedit-raw-submit' => 'Oppdater overvåkningsliste',
-'watchlistedit-raw-done' => 'Overvåkningslisten din er oppdatert.',
-'watchlistedit-raw-added' => '{{PLURAL:$1|Én tittel|$1 titler}} ble lagt til:',
-'watchlistedit-raw-removed' => '{{PLURAL:$1|Én tittel|$1 titler}} ble fjernet:',
-
-# Watchlist editing tools
-'watchlisttools-view' => 'Vis relevante endringer',
-'watchlisttools-edit' => 'Vis og rediger overvåkningsliste',
-'watchlisttools-raw' => 'Rediger rå overvåkningsliste',
-
-# Hebrew month names
-'hebrew-calendar-m1' => 'Tisjri',
-'hebrew-calendar-m2' => 'Hesjván',
-'hebrew-calendar-m3' => 'Kislév',
-'hebrew-calendar-m4' => 'Tebét',
-'hebrew-calendar-m5' => 'Sjebát',
-'hebrew-calendar-m6' => 'Adár',
-'hebrew-calendar-m6a' => 'Adár I',
-'hebrew-calendar-m6b' => 'Adár II',
-'hebrew-calendar-m7' => 'Nisán',
-'hebrew-calendar-m8' => 'Ijár',
-'hebrew-calendar-m9' => 'Siván',
-'hebrew-calendar-m10' => 'Tammúz',
-'hebrew-calendar-m11' => 'Ab',
-'hebrew-calendar-m12' => 'Elúl',
-'hebrew-calendar-m1-gen' => 'Tisjri',
-'hebrew-calendar-m2-gen' => 'Hesjván',
-'hebrew-calendar-m3-gen' => 'Kislév',
-'hebrew-calendar-m4-gen' => 'Tebét',
-'hebrew-calendar-m5-gen' => 'Sjebát',
-'hebrew-calendar-m6-gen' => 'Adár',
-'hebrew-calendar-m6a-gen' => 'Adár I',
-'hebrew-calendar-m6b-gen' => 'Adár II',
-'hebrew-calendar-m7-gen' => 'Nisán',
-'hebrew-calendar-m8-gen' => 'Ijár',
-'hebrew-calendar-m9-gen' => 'Siván',
-'hebrew-calendar-m10-gen' => 'Tammúz',
-'hebrew-calendar-m11-gen' => 'Ab',
-'hebrew-calendar-m12-gen' => 'Elúl',
-
-# Core parser functions
-'unknown_extension_tag' => 'Ukjent tilleggsmerking «$1»',
-'duplicate-defaultsort' => 'Advarsel: Standardsorteringen «$2» tar over for den tidligere sorteringen «$1».',
-
-# Special:Version
-'version' => 'Versjon',
-'version-extensions' => 'Installerte utvidelser',
-'version-specialpages' => 'Spesialsider',
-'version-parserhooks' => 'Parsertillegg',
-'version-variables' => 'Variabler',
-'version-antispam' => 'Søppelpostforebygging',
-'version-skins' => 'Drakter',
-'version-other' => 'Annet',
-'version-mediahandlers' => 'Mediahåndterere',
-'version-hooks' => 'Haker',
-'version-extension-functions' => 'Tilleggsfunksjoner',
-'version-parser-extensiontags' => 'Tilleggstagger',
-'version-parser-function-hooks' => 'Parserfunksjoner',
-'version-hook-name' => 'Navn',
-'version-hook-subscribedby' => 'Brukes av',
-'version-version' => '(versjon $1)',
-'version-license' => 'Lisens',
-'version-poweredby-credits' => "Denne wikien er drevet av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
-'version-poweredby-others' => 'andre',
-'version-license-info' => 'MediaWiki er fri programvare; du kan redistribuere det og/eller modifisere det under betingelsene i GNU General Public License som publisert av Free Software Foundation; enten versjon 2 av lisensen, eller (etter eget valg) enhver senere versjon.
-
-MediaWiki er distribuert i håp om at det vil være nyttig, men UTEN NOEN GARANTI; ikke engang implisitt garanti av SALGBARHET eller EGNETHET FOR ET BESTEMT FORMÅL. Se GNU General Public License for flere detaljer.
-
-Du skal ha mottatt [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi av GNU General Public License] sammen med dette programmet; hvis ikke, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [//www.gnu.org/licenses/old-licenses/gpl-2.0.html les det på nettet].',
-'version-software' => 'Installert programvare',
-'version-software-product' => 'Produkt',
-'version-software-version' => 'Versjon',
-
-# Special:FilePath
-'filepath' => 'Filsti',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'GÃ¥',
-'filepath-summary' => 'Denne spesialsiden returnerer den fullstendige stien for en fil.
-Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom sine tilknyttede programmer.',
-
-# Special:FileDuplicateSearch
-'fileduplicatesearch' => 'Søk etter duplikatfiler',
-'fileduplicatesearch-summary' => 'Søk etter duplikatfiler basert på dets hash-verdi.',
-'fileduplicatesearch-legend' => 'Søk etter en duplikatfil',
-'fileduplicatesearch-filename' => 'Filnavn:',
-'fileduplicatesearch-submit' => 'Søk',
-'fileduplicatesearch-info' => '$1 × $2 piksler<br />Filstørrelse: $3<br />MIME-type: $4',
-'fileduplicatesearch-result-1' => 'Det er ingen duplikater av «$1».',
-'fileduplicatesearch-result-n' => 'Det er {{PLURAL:$2|ett duplikat|$2 duplikater}} av «$1».',
-'fileduplicatesearch-noresults' => 'Ingen ved navn «$1» funnet.',
-
-# Special:SpecialPages
-'specialpages' => 'Spesialsider',
-'specialpages-group-maintenance' => 'Vedlikeholdsrapporter',
-'specialpages-group-other' => 'Andre spesialsider',
-'specialpages-group-login' => 'Innlogging / registrering',
-'specialpages-group-changes' => 'Siste endringer og logger',
-'specialpages-group-media' => 'Mediarapporter og opplastinger',
-'specialpages-group-users' => 'Brukere og rettigheter',
-'specialpages-group-highuse' => 'Ofte brukte sider',
-'specialpages-group-pages' => 'Sidelister',
-'specialpages-group-pagetools' => 'Sideverktøy',
-'specialpages-group-wiki' => 'Informasjon og verktøy for wikien',
-'specialpages-group-redirects' => 'Omdirigerende spesialsider',
-'specialpages-group-spam' => 'Spamverktøy',
-
-# Special:BlankPage
-'blankpage' => 'Tom side',
-'intentionallyblankpage' => 'Denne siden er tom med vilje',
-
-# External image whitelist
-'external_image_whitelist' => '#La denne linja være som den er<pre>
-#Skriv fragmenter av regulære uttrykk (delen som går mellom //) nedenfor
-#Disse vil sjekkes mot adresser til bilder fra eksterne sider
-#De som blir godkjent vil vises, ellers vil det gis en lenke til bildet
-#Linjer som begynner med # anses som kommentarer
-#Det skilles ikke mellom store og små bokstaver
-
-#Skriv alle fragmenter av regulære uttrykk over denne lina. La denne linja være som den er</pre>',
-
-# Special:Tags
-'tags' => 'Gyldige endringstagger',
-'tag-filter' => 'Filter for [[Special:Tags|tagger]]:',
-'tag-filter-submit' => 'Filtrer',
-'tags-title' => 'Tagger',
-'tags-intro' => 'Denne siden lister opp taggene programvaren kan merke en endring med, og hva de betyr.',
-'tags-tag' => 'Taggnavn',
-'tags-display-header' => 'Utseende på endringslister',
-'tags-description-header' => 'Fullstendig betydning',
-'tags-hitcount-header' => 'Taggede endringer',
-'tags-edit' => 'rediger',
-'tags-hitcount' => '{{PLURAL:$1|én endring|$1 endringer}}',
-
-# Special:ComparePages
-'comparepages' => 'Sammenlign sider',
-'compare-selector' => 'Sammenlign siderevisjoner',
-'compare-page1' => 'Side 1',
-'compare-page2' => 'Side 2',
-'compare-rev1' => 'Revisjon 1',
-'compare-rev2' => 'Revisjon 2',
-'compare-submit' => 'Sammenlign',
-
-# Database error messages
-'dberr-header' => 'Wikien har et problem',
-'dberr-problems' => 'Siden har tekniske problemer.',
-'dberr-again' => 'Prøv å oppdatere siden om noen minutter.',
-'dberr-info' => '(Kan ikke kontakte databasetjeneren: $1)',
-'dberr-usegoogle' => 'Du kan prøve å søke via Google imens.',
-'dberr-outofdate' => 'Merk at deres indeks over våre sider kan være utdatert.',
-'dberr-cachederror' => 'Følgende er en mellomlagret kopi av den etterspurte siden, og kan være foreldet.',
-
-# HTML forms
-'htmlform-invalid-input' => 'Det er problemer med noen av inndatene dine',
-'htmlform-select-badoption' => 'Verdien du valgte er ikke et gyldig alternativ.',
-'htmlform-int-invalid' => 'Verdien du valgte er ikke et heltall.',
-'htmlform-float-invalid' => 'Verdien du valgte er ikke et tall.',
-'htmlform-int-toolow' => 'Verdien du valgte er mindre enn minimum på $1',
-'htmlform-int-toohigh' => 'Verdien du valgte er over det mulige $1',
-'htmlform-required' => 'Denne verdien er påkrevd',
-'htmlform-submit' => 'Lagre',
-'htmlform-reset' => 'Omgjør endringer',
-'htmlform-selectorother-other' => 'Andre',
-
-# SQLite database support
-'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
-'sqlite-no-fts' => '$1 uten støtte for fulltekstsøk',
-
-# New logging system
-'revdelete-restricted' => 'begrensninger gjelder også administratorer',
-'revdelete-unrestricted' => 'fjernet begrensninger for administratorer',
-'newuserlog-byemail' => 'passord sendt på e-post',
-
-);
diff --git a/languages/messages/MessagesNov.php b/languages/messages/MessagesNov.php
index 5a67f1f2..b00d31cf 100644
--- a/languages/messages/MessagesNov.php
+++ b/languages/messages/MessagesNov.php
@@ -358,8 +358,8 @@ Si vu voli plu tardim ekarta li pagine fro vun observa-liste, klikta \"Desobserv
'unwatch' => 'Desobserva',
'unwatchthispage' => 'Des-observa disi pagine',
-'changed' => 'chanjati',
'enotif_lastvisited' => 'Regarda $1 por vida omni chanjes depos vun lasti visite.',
+'changed' => 'chanjati',
# Delete
'confirm' => 'Konfirma',
diff --git a/languages/messages/MessagesNso.php b/languages/messages/MessagesNso.php
index f9e86ba1..eed1ac13 100644
--- a/languages/messages/MessagesNso.php
+++ b/languages/messages/MessagesNso.php
@@ -319,9 +319,6 @@ Bega se go [[Special:ListUsers/sysop|administrator]], o fana ka URL.',
'namespaceprotected' => "Ga ona tokelo ya go fetola matlakala go '''$1''' .",
# Login and logout pages
-'welcomecreation' => "Oa amogelwa, $1! ==
-
-Tšhupaleloko (''account'') ya gago e tlhodilwe. O seke wa lebala go fetola [[Special:Preferences|{{SITENAME}} dikgetho/thato tša gago]].",
'yourname' => 'Leina la mošomiši:',
'yourpassword' => 'Ditlhaka-tša-siphiri:',
'yourpasswordagain' => 'Tlanya ditlhaka-tša-siphiri gape:',
@@ -650,6 +647,9 @@ Ga re fane ka e-poso ya gago go bašumiši ba bangwe ge ba polela le wena ka yon
'right-edit' => 'Fetola matlakala',
'right-move' => 'Huduša matlakala',
+# Special:Log/newusers
+'newuserlogpage' => '"Log" yago hlola mošumiši',
+
# User rights log
'rightslog' => "''log'' ya ditumello tša mošomiši",
@@ -866,9 +866,6 @@ Matlakala ago ba [[Special:Watchlist|lenanong la gago la matlakala ditlhapetšo]
# Special:ListUsers
'listusers-submit' => 'Bontšha',
-# Special:Log/newusers
-'newuserlogpage' => '"Log" yago hlola mošumiši',
-
# Special:ListGroupRights
'listgrouprights-members' => '(Lenano la ditho)',
@@ -906,13 +903,11 @@ Ga eba o nyaka go hloša letlaka le go lenano la ditlhapetšo tša gago, šomiš
'unwatching' => 'Tlhapetšo eya tlošwa ...',
'enotif_reset' => 'Swaya matlakala kamoka awe oa etetšego',
-'enotif_newpagetext' => 'Le, ke letlakala le lempsha.',
'enotif_impersonal_salutation' => '{{SITENAME}} mošumiši',
-'changed' => 'fetotšwe',
-'created' => 'tlhodilwe',
-'enotif_subject' => '{{SITENAME}} letkalala $PAGETITLE le $CHANGEDORCREATED ke $PAGEEDITOR',
'enotif_lastvisited' => 'Lebelela $1 go bona diphetogo ka moka gotloga ge go tsena la mafelelo.',
'enotif_lastdiff' => 'Bona $1 go nyakorela phetogo ye.',
+'created' => 'tlhodilwe',
+'changed' => 'fetotšwe',
# Delete
'deletepage' => 'Phumula letlakala',
diff --git a/languages/messages/MessagesOc.php b/languages/messages/MessagesOc.php
index 1070e1b7..477e2b0d 100644
--- a/languages/messages/MessagesOc.php
+++ b/languages/messages/MessagesOc.php
@@ -153,7 +153,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__FORÇARTAULA__', '__FORÇARSOMARI__', '__FORÇARTDM__', '__FORCETOC__' ),
'toc' => array( '0', '__TAULA__', '__SOMARI__', '__TDM__', '__TOC__' ),
'noeditsection' => array( '0', '__SECCIONNONEDITABLA__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__PASCAPDENTÈSTA__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'MESCORRENT', 'MESACTUAL', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonthname' => array( '1', 'NOMMESCORRENT', 'NOMMESACTUAL', 'CURRENTMONTHNAME' ),
'currentmonthnamegen' => array( '1', 'NOMGENMESCORRENT', 'NOMGENMESACTUAL', 'CURRENTMONTHNAMEGEN' ),
@@ -426,6 +425,7 @@ $messages = array(
'newwindow' => '(dobrís una fenèstra novèla)',
'cancel' => 'Anullar',
'moredotdotdot' => 'E mai...',
+'morenotlisted' => 'Mai pas listat…',
'mypage' => 'Pagina',
'mytalk' => 'Discussion',
'anontalk' => 'Discussion amb aquesta adreça IP',
@@ -437,7 +437,6 @@ $messages = array(
'qbbrowse' => 'Far desfilar',
'qbedit' => 'Modificar',
'qbpageoptions' => 'Opcions de la pagina',
-'qbpageinfo' => 'Pagina d’entresenhas',
'qbmyoptions' => 'Mas opcions',
'qbspecialpages' => 'Paginas especialas',
'faq' => 'FAQ',
@@ -460,6 +459,7 @@ $messages = array(
'namespaces' => 'Espacis de noms',
'variants' => 'Variantas',
+'navigation-heading' => 'Menú de navigacion',
'errorpagetitle' => 'Error de títol',
'returnto' => 'Tornar a la pagina $1.',
'tagline' => 'Un article de {{SITENAME}}.',
@@ -692,11 +692,11 @@ Lo motiu avançat es « ''$2'' ».",
# Login and logout pages
'logouttext' => "'''Ara, sètz desconnect{{GENDER:||at|ada}}..'''
-Podètz contunhar d'utilizar {{SITENAME}} anonimament, o vos podètz [[Special:UserLogin|tornar connectar]] jol meteis nom o amb un autre nom.
+Podètz contunhar d'utilizar {{SITENAME}} anonimament, o vos podètz <span class='plainlinks'>[$1 tornar connectar]</span> jol meteis nom o amb un autre nom.
Notatz que d'unas paginas pòdon èsser encara afichadas coma s'eratz encara connect{{GENDER:||at|ada}}, fins al moment qu'escafaretz l'amagatal de vòstre navigador.",
-'welcomecreation' => "== Benvenguda, $1 ! ==
-Vòstre compte d'utilizaire es estat creat.
-Doblidetz pas de personalizar vòstras [[Special:Preferences|{{SITENAME}} preferéncias]].",
+'welcomeuser' => 'Benvenguda, $1&nbsp;!',
+'welcomecreation-msg' => "Vòstre compte d'utilizaire es estat creat.
+Doblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SITENAME}}]].",
'yourname' => "Nom d'utilizaire :",
'yourpassword' => 'Vòstre senhal :',
'yourpasswordagain' => 'Confirmar lo senhal :',
@@ -719,7 +719,7 @@ Doblidetz pas de personalizar vòstras [[Special:Preferences|{{SITENAME}} prefer
'gotaccount' => "Ja avètz un compte ? '''$1'''.",
'gotaccountlink' => 'Identificatz-vos',
'userlogin-resetlink' => 'Avètz doblidat vòstres detalhs de connexion ?',
-'createaccountmail' => 'per corrièr electronic',
+'createaccountmail' => 'Utilizar un senhal aleatòri temporari e lo mandar a l’adreça de corrièl especificada çaijós',
'createaccountreason' => 'Motiu :',
'badretype' => "Los senhals qu'avètz picats son pas identics.",
'userexists' => "Lo nom d'utilizaire qu'avètz picat ja es utilizat.
@@ -982,7 +982,6 @@ Aquesta proteccion es estada facha perque aquesta pagina es inclusa dins {{PLURA
'template-semiprotected' => '(semiprotegit)',
'hiddencategories' => "{{PLURAL:$1|Categoria amagada|Categorias amagadas}} qu'aquesta pagina ne fa partida :",
'edittools' => '<!-- Tot tèxte picat aicí serà afichat jos las bóstias de modificacion o d’impòrt de fichièr. -->',
-'nocreatetitle' => 'Creacion de pagina limitada',
'nocreatetext' => '{{SITENAME}} a restrencha la possibilitat de crear de paginas novèlas.
Podètz tonar en rèire e modificar una pagina existenta, [[Special:UserLogin|vos connectar o crear un compte]].',
'nocreate-loggedin' => 'Avètz pas la permission de crear de paginas novèlas.',
@@ -1008,6 +1007,12 @@ Sembla que siá estada suprimida.',
Existís ja.',
'defaultmessagetext' => 'Messatge per defaut',
+# Content models
+'content-model-wikitext' => 'wikitèxte',
+'content-model-text' => 'tèxte brut',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
# Parser/template warnings
'expensive-parserfunction-warning' => 'Atencion : Aquesta pagina conten tròp d’apèls dispendioses de foncions del parser.
@@ -1353,9 +1358,9 @@ Vaquí una valor generada aleatòriament que podètz utilizar : $1',
'prefs-emailconfirm-label' => 'Confirmacion del corrièr electronic :',
'prefs-textboxsize' => 'Talha de la fenèstra de modificacion',
'youremail' => 'Adreça de corrièr electronic :',
-'username' => "Nom de l'utilizaire :",
-'uid' => 'Numèro de l’utilizaire :',
-'prefs-memberingroups' => 'Membre {{PLURAL:$1|del grop|dels gropes}} :',
+'username' => "{{GENDER:$1|Nom d'utilizaire|Nom d'utilizaira}}:",
+'uid' => "Numèro d'{{GENDER:$1|utilizaire|utilizaira}}:",
+'prefs-memberingroups' => '{{GENDER:$2|Membre|Membra}} {{PLURAL:$1|del grop|dels gropes}}:',
'prefs-registration' => 'Data de creacion del compte :',
'yourrealname' => 'Nom vertadièr :',
'yourlanguage' => "Lenga de l'interfàcia :",
@@ -1502,11 +1507,13 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
'right-sendemail' => 'Mandar un corrièl als autres utilizaires',
'right-passwordreset' => 'Tòrna inicializar lo senhal d’un utilizaire ([[Special:PasswordReset|pagina especiala]])',
+# Special:Log/newusers
+'newuserlogpage' => 'Istoric de las creacions de comptes',
+'newuserlogpagetext' => "Jornal de las creacions de comptes d'utilizaires.",
+
# User rights log
'rightslog' => "Istoric de las modificacions d'estatut",
'rightslogtext' => "Aquò es un jornal dels cambiaments d'estatut d’utilizaire.",
-'rightslogentry' => 'a modificat los dreches de l’utilizaire « $1 » de $2 a $3',
-'rightsnone' => '(cap)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'legir aquesta pagina',
@@ -2079,10 +2086,6 @@ Vejatz tanben [[Special:WantedCategories|las categorias demandadas]].',
'activeusers-hidesysops' => 'Amagar los administrators',
'activeusers-noresult' => "Cap d'utilizaire pas trobat.",
-# Special:Log/newusers
-'newuserlogpage' => 'Istoric de las creacions de comptes',
-'newuserlogpagetext' => "Jornal de las creacions de comptes d'utilizaires.",
-
# Special:ListGroupRights
'listgrouprights' => "Dreches dels gropes d'utilizaires",
'listgrouprights-summary' => "Aquesta pagina conten una tièra de gropes definits sus aqueste wiki e mai los dreches d'accès qu'i son associats.
@@ -2177,11 +2180,12 @@ Las modificacions venentas d\'aquesta pagina e de la pagina de discussion associ
'enotif_mailer' => 'Sistèma d’expedicion de notificacion de {{SITENAME}}',
'enotif_reset' => 'Marcar totas las paginas coma visitadas',
-'enotif_newpagetext' => 'Aquò es una pagina novèla.',
'enotif_impersonal_salutation' => 'Utilizaire de {{SITENAME}}',
-'changed' => 'modificada',
-'created' => 'creada',
-'enotif_subject' => 'La pagina $PAGETITLE de {{SITENAME}} es estada $CHANGEDORCREATED per $PAGEEDITOR',
+'enotif_subject_deleted' => 'La pagina $1 sus {{SITENAME}} es estada suprimida per {{GENDER:$2|$2}}',
+'enotif_subject_created' => 'La pagina $1 sus {{SITENAME}} es estada creada per {{GENDER:$2|$2}}',
+'enotif_subject_moved' => 'La pagina $1 sus {{SITENAME}} es estada renomenada per {{GENDER:$2|$2}}',
+'enotif_subject_restored' => 'La pagina $1 sus {{SITENAME}} es estada restablida per {{GENDER:$2|$2}}',
+'enotif_subject_changed' => 'La pagina $1 sus {{SITENAME}} es estada modificada per {{GENDER:$2|$2}}',
'enotif_lastvisited' => 'Consultatz $1 per totes los cambiaments dempuèi vòstra darrièra visita.',
'enotif_lastdiff' => 'Consultatz $1 per veire aquesta modificacion.',
'enotif_anon_editor' => 'utilizaire anonim $1',
@@ -2211,6 +2215,8 @@ $UNWATCHURL
Retorn e assisténcia :
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'creada',
+'changed' => 'modificada',
# Delete
'deletepage' => 'Suprimir la pagina',
@@ -2386,7 +2392,7 @@ $1",
'blanknamespace' => '(Principal)',
# Contributions
-'contributions' => "Contribucions d'aqueste contributor",
+'contributions' => "Contribucions de l'{{GENDER:$1|utilizaire|utilizaira}}",
'contributions-title' => 'Tièra de las contribucions de l’utilizaire $1',
'mycontris' => 'Contribucions',
'contribsub2' => 'Lista de las contribucions de $1 ($2). Las paginas que son estadas escafadas son pas afichadas.',
@@ -2890,6 +2896,15 @@ Aquò es probablament causat per un ligam sus lista negra que punta cap a un sit
'pageinfo-magic-words' => '{{PLURAL:$1|Mot magic|Mots magics}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria amagada|Categorias amagadas}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Modèl inclús|Modèls incluses}} ($1)',
+'pageinfo-toolboxlink' => 'Informacion sus la pagina',
+'pageinfo-redirectsto' => 'Redirigir cap a',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage-yes' => 'Ã’c',
+'pageinfo-protect-cascading-yes' => 'Ã’c',
+'pageinfo-category-info' => 'Informacions sus la categoria',
+'pageinfo-category-pages' => 'Nombre de paginas',
+'pageinfo-category-subcats' => 'Nombre de soscategorias',
+'pageinfo-category-files' => 'Nombre de fichièrs',
# Skin names
'skinname-standard' => 'Estandard',
@@ -2972,6 +2987,7 @@ Se l'executatz, vòstre sistèma pòt èsser compromés.",
'hours' => '{{PLURAL:$1|$1 ora|$1 oras}}',
'days' => '{{PLURAL:$1|$1 jorn|$1 jorns}}',
'ago' => 'I a $1',
+'just-now' => 'sulpic',
# Bad image list
'bad_image_list' => "Lo format es lo seguent :
@@ -3657,6 +3673,8 @@ Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son
'htmlform-selectorother-other' => 'Autre',
# New logging system
+'logentry-delete-delete' => '$1 a suprimit la pagina $3',
+'logentry-delete-restore' => '$1 a restablit la pagina $3',
'revdelete-content-hid' => 'contengut amagat',
'revdelete-summary-hid' => 'resumit de modificacion amagat',
'revdelete-uname-hid' => 'nom d’utilizaire amagat',
@@ -3673,7 +3691,7 @@ Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son
'logentry-newusers-create' => "Lo compte d'utilizaire $1 es estat creat",
'logentry-newusers-create2' => "Lo compte d'utilizaire $3 es estat creat per $1",
'logentry-newusers-autocreate' => 'Lo compte $1 es estat creat automaticament',
-'newuserlog-byemail' => 'senhal mandat per corrièr electronic',
+'rightsnone' => '(cap)',
# Feedback
'feedback-subject' => 'Subjècte :',
diff --git a/languages/messages/MessagesOr.php b/languages/messages/MessagesOr.php
index cf7cdf31..2d45c869 100644
--- a/languages/messages/MessagesOr.php
+++ b/languages/messages/MessagesOr.php
@@ -141,7 +141,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'ନଗଦବଦଳ' ),
'Recentchangeslinked' => array( 'ଜୋଡ଼ାଥିବାନଗଦବଦଳ', 'ପାଖାପାଖିବଦଳ' ),
'Revisiondelete' => array( 'ସଙà­à¬•à¬³à¬¨à¬²à¬¿à¬­à¬¾à¬‡à¬¦à¬¿à¬…ଦେବେ' ),
- 'RevisionMove' => array( 'ସଙà­à¬•à¬³à¬¨' ),
'Search' => array( 'ଖୋଜନà­à¬¤à­' ),
'Shortpages' => array( 'ଛୋଟପୃଷà­à¬ à¬¾' ),
'Specialpages' => array( 'ବିଶେଷପୃଷà­à¬ à¬¾' ),
@@ -390,6 +389,7 @@ $messages = array(
'newwindow' => '(à¬à¬¹à¬¾ ନୂଆ ଉଇଣà­à¬¡à­‹à¬°à­‡ ଖୋଲିବ)',
'cancel' => 'ନାକଚ',
'moredotdotdot' => 'ଅଧିକ...',
+'morenotlisted' => 'ଆଉ ଅଧିକ ତାଲିକାଭà­à¬•à­à¬¤ ହୋଇନାହିà¬...',
'mypage' => 'ପୃଷà­à¬ à¬¾',
'mytalk' => 'ଆଲୋଚନା',
'anontalk' => 'à¬à¬¹à¬¿ ଆଇ.ପି. ଠିକଣା ଉପରେ ଆଲୋଚନା',
@@ -401,7 +401,6 @@ $messages = array(
'qbbrowse' => 'ଖୋଜିବା',
'qbedit' => 'à¬à¬¹à¬¾à¬•à­ ବଦଳାନà­à¬¤à­',
'qbpageoptions' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿',
-'qbpageinfo' => 'ଭିତର ଚିଜ',
'qbmyoptions' => 'ମୋ ପୃଷà­à¬ à¬¾à¬—à­à¬¡à¬¼à¬¿à¬•',
'qbspecialpages' => 'ବିଶେଷ ପୃଷà­à¬ à¬¾',
'faq' => 'ବାରମà­à¬¬à¬¾à¬° ପଚରାଯାଉଥିବା ପà­à¬°à¬¶à­à¬¨',
@@ -424,6 +423,7 @@ $messages = array(
'namespaces' => 'ନେମସà­à¬ªà­‡à¬¸',
'variants' => 'ନିଆରା',
+'navigation-heading' => 'ଦିଗବାରେଣି ମେନà­',
'errorpagetitle' => 'ଭà­à¬²',
'returnto' => '$1କୠଫେରିଯାନà­à¬¤à­ ।',
'tagline' => '{{SITENAME}} ରà­',
@@ -664,10 +664,11 @@ $2',
# Login and logout pages
'logouttext' => "'''ଆପଣ ଲଗାଆଉଟ କରିଦେଲେ'''
-ଆପଣ ଅଜଣା ଭାବରେ {{SITENAME}}କୠଯାଇପାରିବେ, କିମà­à¬¬à¬¾ [[Special:UserLogin|ଆଉଥରେ]] ଆଗର ଇଉଜର ନାଆà¬à¬°à­‡/ଅଲଗା ନାଆà¬à¬°à­‡ ଲଗଇନ କରିପାରିବେ ।
+ଆପଣ ଅଜଣା ଭାବରେ {{SITENAME}}କୠଯାଇପାରିବେ, କିମà­à¬¬à¬¾ <span class='plainlinks'>[$1 ଆଉଥରେ]</span> ଆଗର ଇଉଜର ନାଆà¬à¬°à­‡/ଅଲଗା ନାଆà¬à¬°à­‡ ଲଗଇନ କରିପାରିବେ ।
ଜାଣିରଖନà­à¬¤à­, କିଛି ପୃଷà­à¬ à¬¾ ଲଗାଆଉଟ କଲାପରେ ବି ଆଗପରି ଦେଖାଯାଇପାରେ, ଆପଣ ବà­à¬°à¬¾à¬‰à¬œà¬° କାସକୠହଟାଇଲା ଯାà¬à¬ à¬à¬¹à¬¾ à¬à¬®à¬¿à¬¤à¬¿ ରହିବ ।",
-'welcomecreation' => '== $1!, ଆପଣଙà­à¬• ଖାତାଟି ତିଆରି ହୋଇଗଲା==
-ତେବେ, ନିଜର [[Special:Preferences|{{SITENAME}} ପସନà­à¬¦à¬¸à¬¬à­à¬•à­]] ବଦଳାଇବାକୠଭà­à¬²à¬¿à¬¬à­‡ ନାହିଠ।',
+'welcomeuser' => 'ସà­à¬µà¬¾à¬—ତ, $1!',
+'welcomecreation-msg' => 'ଆପଣଙà­à¬• ଖାତାଟି ଖୋଲାଗଲା
+ନିଜର [[Special:Preferences|{{SITENAME}} ପସନà­à¬¦à¬¸à¬¬à­à¬•à­]] ବଦଳାଇବାକୠଭà­à¬²à¬¿à¬¬à­‡ ନାହିଠ।',
'yourname' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ନାମ:',
'yourpassword' => 'ପାସୱାରà­à¬¡à¬¼',
'yourpasswordagain' => 'ପାସୱାରà­à¬¡à¬¼ ଆଉଥରେ:',
@@ -690,7 +691,7 @@ $2',
'gotaccount' => 'ଆଗରୠଖାତାଟିଠଅଛି କି? $1.',
'gotaccountlink' => 'ଲଗ ଇନ',
'userlogin-resetlink' => 'ଲଗଇନ ତଥà­à­Ÿ ସବୠଭà­à¬²à¬¿à¬—େଲେକି?',
-'createaccountmail' => 'ଇ-ମେଲ ରà­',
+'createaccountmail' => 'ଗୋଟିଠସାମୟିକ ଜାହିତାହି ପାସୱାରà­à¬¡ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରନà­à¬¤à­ à¬à¬¬à¬‚ à¬à¬¹à¬¾à¬•à­ ତଳେ ଦିଆଯାଇଥିବା ଇ-ମେଲ ଠିକଣାକୠପଠେଇ ଦିଅନà­à¬¤à­',
'createaccountreason' => 'କାରଣ:',
'badretype' => 'ଆପଣ ଦେଇଥିବା ପାସବାରà­à¬¡à¬¼à¬Ÿà¬¿ ମେଳଖାଉନାହିଠ।',
'userexists' => 'ଆପଣ ଦେଇଥିବା ଇଉଜର ନାମ ଆଗରୠଅଛି ।
@@ -771,6 +772,7 @@ continue using your old password.',
# Email sending
'php-mail-error-unknown' => 'PHP ର ମେଲ() କାମରେ ଅଜଣା ଅସà­à¬¬à¬¿à¬§à¬¾ ।',
'user-mail-no-addy' => 'à¬à¬• ଇ-ମେଲ ଠିକଣା ବିନା ଇ-ମେଲ ପଠାଇବାକୠଚେଷà­à¬Ÿà¬¾ କଲà­à¬ ।',
+'user-mail-no-body' => 'à¬à¬• ଖାଲି କିମà­à¬¬à¬¾ ଅଦରକାରୀ ଛୋଟ ଲେଖା ଥିବା ମେଲ ପଠେଇବାକୠଚେଷà­à¬Ÿà¬¾ କରିଥିଲେ',
# Change password dialog
'resetpass' => 'ପାସୱାରà­à¬¡à¬¼ ବଦଳାନà­à¬¤à­',
@@ -824,7 +826,7 @@ $2
ଅସà­à¬¥à¬¾à­Ÿà­€ ପାସୱାରà­à¬¡à¬¼: $2',
'passwordreset-emailsent' => 'à¬à¬• ପାସୱାରà­à¬¡à¬¼ ପà­à¬¨à¬ƒà¬¸à­à¬¥à¬¾à¬ªà¬¨ ଇମେଲ ପଠାଇଦିଆଯାଇଅଛି ।',
'passwordreset-emailsent-capture' => 'ତଳେ ଦେଖାଯାଉଥିବା ଭଳି, ପାସୱାରà­à¬¡à¬¼ ପà­à¬¨à¬ƒà¬¸à­à¬¥à¬¾à¬ªà¬¨ ଇମେଲଟିଠପଠାଇଦିଆଯାଇଛି ।',
-'passwordreset-emailerror-capture' => 'ଗୋଟିଠସବିଶେଷ à¬à¬®à­‡à¬²à¬Ÿà¬¿à¬ ବାହାରିଛି, ଯାହାକି ତଳେ ଅଛି, କିନà­à¬¤à­ à¬à¬¹à¬¾à¬•à­ ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬•à­ ପଠାଇବାରେ ଅସଫଳ ହେଲା :$1',
+'passwordreset-emailerror-capture' => 'ଗୋଟିଠମନେପକାଇବା ଇ-ମେଲ ତିଆରି କରାଯାଇଥିଲା, ଯାହାକି ତଳେ ଅଛି, କିନà­à¬¤à­ à¬à¬¹à¬¾à¬•à­ ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬•à­ ପଠାଇବାରେ ଅସଫଳ ହେଲା :$1',
# Special:ChangeEmail
'changeemail' => 'ଇ-ମେଲ ଠିକଣା ବଦଳାଇବେ',
@@ -834,6 +836,7 @@ $2
'changeemail-oldemail' => 'à¬à¬¬à­‡à¬•à¬¾à¬° ଇ-ମେଲ ଠିକଣା:',
'changeemail-newemail' => 'ନୂଆ ଇ-ମେଲ ଠିକଣା:',
'changeemail-none' => '(କିଛି ନାହିà¬)',
+'changeemail-password' => 'ଆପଣଙà­à¬• {{SITENAME}} ପାସୱାରà­à¬¡',
'changeemail-submit' => 'ଇ-ମେଲ ପରିରà­à¬¬à¬¤à­à¬¤à¬¨ କରନà­à¬¤à­',
'changeemail-cancel' => 'ନାକଚ',
@@ -1023,7 +1026,6 @@ $1 ଦà­à¬µà¬¾à¬°à¬¾ ପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରାଯାଇଛି
'template-protected' => '(କିଳାଯାଇଥିବା)',
'template-semiprotected' => '(ଅଧା କିଳାଯାଇଥିବା)',
'hiddencategories' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ {{PLURAL:$1|ଲà­à¬šà¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ଶà­à¬°à­‡à¬£à­€|$1ଟି ଲà­à¬šà¬¾à¬¯à¬¾à¬‡à¬¥à¬¿à¬¬à¬¾ ଶà­à¬°à­‡à¬£à­€à¬¸à¬®à­‚ହ}} ଭିତରୠଗୋଟିà¬:',
-'nocreatetitle' => 'ପୃଷà­à¬ à¬¾ ଗଢ଼ିବାକୠସୀମିତ କରାଯାଇଅଛି',
'nocreatetext' => '{{SITENAME}} ନୂଆ ପୃଷà­à¬ à¬¾ ତିଆରି କରିବାକୠବାରଣ କରିଅଛନà­à¬¤à¬¿ ।
ଆପଣ ପଛକୠଫେରି ଆଗରୠଥିବା ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬à¬° ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ କରିପାରିବେ କିମà­à¬¬à¬¾ [[Special:UserLogin|ଲଗ ଇନ କରିପାରିବେ ବା ନୂଆ ଖାତାଟିଠତିଆରି କରିପାରିବେ]] ।',
'nocreate-loggedin' => 'ଆପଣଙà­à¬•à­ ନୂଆ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬ ତିଆରିବା ନିମନà­à¬¤à­‡ ଅନà­à¬®à¬¤à¬¿ ମିଳି ନାହିଠ।',
@@ -1048,6 +1050,15 @@ $1 ଦà­à¬µà¬¾à¬°à¬¾ ପà­à¬°à¬¤à¬¿à¬°à­‹à¬§ କରାଯାଇଛି
'edit-already-exists' => 'ନୂଆ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬ ତିଆରି କରିପାରିଲà­à¬ ନାହିଠ।
à¬à¬¹à¬¾ ଆଗରୠଅଛି ।',
'defaultmessagetext' => 'ଡିଫଲà­à¬Ÿ ମେସେଜ ଲେଖାଗà­à¬¡à¬¿à¬•',
+'content-failed-to-parse' => '$1 ପà­à¬°à¬•à¬¾à¬° ପାଇଠ$2 ଲେଖାକୠବରà­à¬£à­à¬£à¬¨à¬¾ କରିପାରିଲା ନାହିà¬: $3',
+'invalid-content-data' => 'ଅବୈଧ ଆଧାର ତଥà­à­Ÿ',
+'content-not-allowed-here' => '"$1" ବିଷୟଗà­à¬¡à¬¿à¬• [[$2]]ପୃଷà­à¬ à¬¾à¬°à­‡ ରହିପାରିବ ନାହିà¬',
+
+# Content models
+'content-model-wikitext' => 'ଉଇକିଟେକà­à¬¸à¬Ÿ',
+'content-model-text' => 'ଖାଲି ଲେଖା',
+'content-model-javascript' => 'ଜାଭାସà­à¬•à­à¬°à¬¿à¬ªà­à¬Ÿ',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''ଚେତାବନୀ:''' à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬°à­‡ ଅନେକ ଗà­à¬¡à¬¼à¬¿à¬ ମୂଲà­à­Ÿà¬¬à¬¾à¬¨ ପାରà­à¬¸à¬° ଫଙà­à¬•à¬¸à¬¨ କଲ ଅଛି ।
@@ -1416,9 +1427,9 @@ $1",
'prefs-emailconfirm-label' => 'ଇ-ମେଲ ସଜାଣି:',
'prefs-textboxsize' => 'ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾ ଘରର ଆକାର',
'youremail' => 'ଇ-ମେଲ:',
-'username' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ନାମ:',
-'uid' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ ଆଇଡ଼ି:',
-'prefs-memberingroups' => '{{PLURAL:$1|ଗୋଠ|ଗୋଠ ସମୂହ}}ର ସଭà­à­Ÿ:',
+'username' => '{{GENDER:$1|Username}}:',
+'uid' => '{{GENDER:$1|User}} ID:',
+'prefs-memberingroups' => '{{PLURAL:$1|group|groups}}:ର {{GENDER:$2|Member}}',
'prefs-registration' => 'ନାମଲେଖା ବେଳା:',
'yourrealname' => 'ପà­à¬°à¬•à­ƒà¬¤ ନାମ:',
'yourlanguage' => 'ଭାଷା:',
@@ -1570,12 +1581,13 @@ HTML ଟାଗ ପରଖିନିଅନà­à¬¤à­ ।',
'right-sendemail' => 'ବାକି ସଭà­à­Ÿ ମାନଙà­à¬•à­ ଇ-ମେଲ ପଠାଇବେ',
'right-passwordreset' => 'ପାସୱାରà­à¬¡à¬¼ ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ ଇମେଲ କରିବେ',
+# Special:Log/newusers
+'newuserlogpage' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ ତିଆରି ଲଗ',
+'newuserlogpagetext' => 'ସଭà­à­Ÿà¬™à­à¬•à¬° ଖାତା ଗଠନ ପାଇଠà¬à¬• ଇତିହାସ ଅଛି ।',
+
# User rights log
'rightslog' => 'ସଭà­à­Ÿà¬™à­à¬• ଅଧିକାରର ଲଗ',
'rightslogtext' => 'ସଭà­à­Ÿà¬™à­à¬• ଅଧିକାର ବଦଳର à¬à¬¹à¬¾ à¬à¬• ଇତିହାସ ।',
-'rightslogentry' => '$1 ପାଇଠଗୋଠ ସଭà­à­Ÿà¬ªà¬¦à¬° ଅବସà­à¬¥à¬¾ $2 ରୠ$3କୠବଦଳାଇଦିଆଗଲା',
-'rightslogentry-autopromote' => '$2 ରୠ$3କୠଆପେଆପେ ଉନà­à¬¨à­€à¬¤ କରାଗଲା',
-'rightsnone' => '(କିଛି ନାହିà¬)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ପଢ଼ିବେ',
@@ -1812,6 +1824,7 @@ $1',
'backend-fail-notsame' => '$1 ଠାରେ à¬à¬• ଅସମ ଫାଇଲ ଆଗରୠଅଛି ।',
'backend-fail-invalidpath' => '$1 à¬à¬• ବୈଧ ସାଇତିବା ପଥ ନà­à¬¹à­‡à¬ ।',
'backend-fail-delete' => '$1 ଫାଇଲଟି ଲିଭାଇ ପାରିବେ ନାହିଠ।',
+'backend-fail-describe' => '"$1" ଫାଇଲ ପାଇଠମେଟାଡାଟା ବଦଳାଯାଇପାରିଲା ନାହିଠ।',
'backend-fail-alreadyexists' => '$1 ଫାଇଲଟି ଆଗରୠଅଛି ।',
'backend-fail-store' => '$2 ଠାରେ $1 ଫାଇଲଟି ସାଇତାଯାଇ ପାରିଲା ନାହିଠ।',
'backend-fail-copy' => '$1 ଫାଇଲଟିରୠ$2 କୠଫାଇଲ ନକଲ କରାଯାଇପାରିବ ନାହିଠ।',
@@ -2049,6 +2062,8 @@ URLଟି ଠିକ ଅଚିକି କି ନାଠଓ ସାଇଟଟି ସà
ସେସବୠଅଧିକ ଉପଯà­à¬•à­à¬¤ ପà­à¬°à¬¸à¬™à­à¬— ସହ ଯୋଡ଼ାହେବା ଉଚିତ ।<br />
[[MediaWiki:Disambiguationspage]] ସହ ଯୋଡ଼ାଥିବା ଛାଞà­à¬š ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରà­à¬¥à¬¿à¬²à­‡ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬à¬•à­ ବହà­à¬¬à¬¿à¬•à¬³à­à¬ª ପୃଷà­à¬ à¬¾ ବୋଲି କà­à¬¹à¬¾à¬¯à¬¾à¬",
+'pageswithprop-submit' => 'ଯିବା',
+
'doubleredirects' => 'ଯୋଡ଼ା ପà­à¬¨à¬ªà­à¬°à­‡à¬°à¬£',
'doubleredirectstext' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾ ବାକି ବହà­à¬¬à¬¿à¬•à¬³à­à¬ª ପୃଷà­à¬ à¬¾à¬®à¬¾à¬¨à¬™à­à¬• ସହ ଯୋଡ଼ିଥାଠ।
ପà­à¬°à¬¤à­à­Ÿà­‡à¬• ଧାଡ଼ିରେ ପà­à¬°à¬¥à¬® ଓ ଶେଷ ପà­à¬¨à¬ªà­à¬°à­‡à¬°à¬£ ସହ ଯୋଡ଼ିବା ଲିଙà­à¬• ରହିଥାà¬, ଆହà­à¬°à¬¿ ମଧà­à­Ÿ à¬à¬¥à¬¿à¬°à­‡ ଦà­à¬µà¬¿à¬¤à­€à­Ÿ ପà­à¬¨à¬ªà­à¬°à­‡à¬°à¬£à¬° ଲକà­à¬· ସହ ଯୋଡ଼ିବାର ଲିଙà­à¬• ଥାଠ, ଯାହାକି ସାଧାରଣତ "ପà­à¬°à¬•à­ƒà¬¤" ଲକà­à¬· ପୃଷà­à¬ à¬¾ ହୋଇଥାà¬, ଯାହାକୠପà­à¬°à¬¥à¬® ପà­à¬¨à¬ªà­à¬°à­‡à¬°à¬£ ପୃଷà­à¬ à¬¾ ଯୋଡ଼ିଥାଠ।
@@ -2203,7 +2218,7 @@ URLଟି ଠିକ ଅଚିକି କି ନାଠଓ ସାଇଟଟି ସà
'linksearch-ok' => 'ଖୋଜିବା',
'linksearch-text' => '"*.wikipedia.org" ପରି ୱାଇଲà­à¬¡à¬•à¬¾à¬°à­à¬¡à¬¼à¬° ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରାଯାଇଥାଇ ପାରେ ।
à¬à¬• ଉଚà­à¬šà¬•à­‹à¬Ÿà­€à¬° ଡୋମେନ ଲୋଡ଼ା, ଯଥା "*.org".<br />
-ଅନà­à¬®à­‹à¬¦à¬¿à¬¤ ପà­à¬°à¬Ÿà­‹à¬•à¬²: <code>$1</code> (ନିଜର ଖୋଜିବାରେ à¬à¬¹à¬¾à¬•à­ ରଖନà­à¬¤à­ ନାହିà¬) ।',
+ଅନà­à¬®à­‹à¬¦à¬¿à¬¤ {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (ଯଦି କୌଣସି ପà­à¬°à­‹à¬Ÿà­‹à¬•à¬² ଦିଆଯାଇନଥାଠତେବେ ଆପେ ଆପେ http:// ହୋଇଯାଇଥାà¬) ।',
'linksearch-line' => '$1 ଟି $2ରୠଯୋଡ଼ାଯାଇଅଛି ।',
'linksearch-error' => 'କେବଳ ହୋଷà­à¬Ÿ ନାମର ଆରମà­à¬­à¬°à­‡ ୱାଇଲà­à¬¡à¬•à¬¾à¬°à­à¬¡à¬¼ ଦେଖାଯିବ ।',
@@ -2222,10 +2237,6 @@ URLଟି ଠିକ ଅଚିକି କି ନାଠଓ ସାଇଟଟି ସà
'activeusers-hidesysops' => 'ପରିଚାଳକମାନଙà­à¬•à­ ଲà­à¬šà¬¾à¬‡à¬¬à­‡',
'activeusers-noresult' => 'ଜଣେ ବି ସଭà­à­Ÿ ମିଳିଲେ ନାହିଠ।',
-# Special:Log/newusers
-'newuserlogpage' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ ତିଆରି ଲଗ',
-'newuserlogpagetext' => 'ସଭà­à­Ÿà¬™à­à¬•à¬° ଖାତା ଗଠନ ପାଇଠà¬à¬• ଇତିହାସ ଅଛି ।',
-
# Special:ListGroupRights
'listgrouprights' => 'ସଭà­à­Ÿ ଗୋଠ ଅଧିକାରସମୂହ',
'listgrouprights-summary' => 'ତଳେ ଉଇକି ସà­à¬¥à¬¿à¬° କରାଯାଇଥିବା à¬à¬• à¬à¬• ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ ଗୋଠର ତାଲିକା ଦିଆଯାଇଛି, ସେଥିରେ ସେମାନଙà­à¬• ବà­à­Ÿà¬¬à¬¹à¬¾à¬° ଅଧିକାର ବାବଦରେ ମଧà­à­Ÿ ଦିଆଯାଇଛି ।
@@ -2320,16 +2331,23 @@ URLଟି ଠିକ ଅଚିକି କି ନାଠଓ ସାଇଟଟି ସà
'enotif_mailer' => '{{SITENAME}} ସୂଚନା ମେଲ ପà­à¬°à­‡à¬°à¬•',
'enotif_reset' => 'ସବà­à¬¯à¬¾à¬• ଦେଖାଯାଇଥିବା ପୃଷà­à¬ à¬¾à¬•à­ ଚିହà­à¬¨à¬¿à¬¤ କରିବେ',
-'enotif_newpagetext' => 'à¬à¬¹à¬¾ à¬à¬• ନୂଆ ପୃଷà­à¬ à¬¾ ।',
'enotif_impersonal_salutation' => '{{SITENAME}} ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€',
-'changed' => 'ବଦଳାଗଲା',
-'created' => 'ତିଆରି କରାଗଲା',
-'enotif_subject' => ' $PAGEEDITORଙà­à¬• ଦେଇ {{SITENAME}} ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ $PAGETITLE $CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}} $1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ {{gender:$2|$2}}ଦà­à¬µà¬¾à¬°à¬¾ ଲିଭାଯାଇଛି',
+'enotif_subject_created' => '{{SITENAME}} $1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ {{gender:$2|$2}}ଦà­à¬µà¬¾à¬°à¬¾ ତିଆରି କରାଯାଇଛି',
+'enotif_subject_moved' => '{{SITENAME}} $1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ {{gender:$2|$2}}ଦà­à¬µà¬¾à¬°à¬¾ ଘà­à¬žà­à¬šà¬¾à¬¯à¬¾à¬‡à¬›à¬¿',
+'enotif_subject_restored' => '{{SITENAME}} $1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ {{gender:$2|$2}}ଦà­à¬µà¬¾à¬°à¬¾ ପà­à¬¨à¬ƒà¬¸à­à¬¥à¬¾à¬ªà¬¨ କରାଯାଇଛି',
+'enotif_subject_changed' => '{{SITENAME}} $1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ {{gender:$2|$2}}ଦà­à¬µà¬¾à¬°à¬¾ ବଦଳାଯାଇଛି',
+'enotif_body_intro_deleted' => '{{SITENAME}} $1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ {{gender:$2|$2}}ଦà­à¬µà¬¾à¬°à¬¾ $PAGEEDITDATEରେ ଲିଭାଯାଇଛି, $3 ଦେଖନà­à¬¤à­ ।',
+'enotif_body_intro_created' => '{{SITENAME}} $1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ {{gender:$2|$2}}ଦà­à¬µà¬¾à¬°à¬¾ $PAGEEDITDATEରେ ତିଆରି କରାଯାଇଛି, ପà­à¬¨à¬°à¬¾à¬¬à­ƒà¬¤à¬¿ ପାଇଠ$3 ଦେଖନà­à¬¤à­ ।',
+'enotif_body_intro_moved' => '{{SITENAME}} $1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ {{gender:$2|$2}}ଦà­à¬µà¬¾à¬°à¬¾ $PAGEEDITDATEରେ ଘà­à¬žà­à¬šà¬¾à¬¯à¬¾à¬‡à¬›à¬¿, à¬à¬¬à­‡à¬•à¬¾à¬° ପà­à¬¨à¬°à¬¾à¬¬à­ƒà¬¤à¬¿ ପାଇଠ$3 ଦେଖନà­à¬¤à­ ।',
+'enotif_body_intro_restored' => '{{SITENAME}} $1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ {{gender:$2|$2}}ଦà­à¬µà¬¾à¬°à¬¾ $PAGEEDITDATEରେ ପà­à¬¨à¬ƒà¬¸à­à¬¥à¬¾à¬ªà¬¨ କରାଯାଇଛି, à¬à¬¬à­‡à¬•à¬¾à¬° ପà­à¬¨à¬°à¬¾à¬¬à­ƒà¬¤à¬¿ ପାଇଠ$3 ଦେଖନà­à¬¤à­ ।',
+'enotif_body_intro_changed' => '{{SITENAME}} $1 ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ {{gender:$2|$2}}ଦà­à¬µà¬¾à¬°à¬¾ $PAGEEDITDATEରେ ବଦଳାଯାଇଛି, à¬à¬¬à­‡à¬•à¬¾à¬° ପà­à¬¨à¬°à¬¾à¬¬à­ƒà¬¤à¬¿ ପାଇଠ$3 ଦେଖନà­à¬¤à­ ।',
'enotif_lastvisited' => 'ଆପଣଙà­à¬• ଶେଷ ଦେଖଣା ପରେ ହୋଇଥିବା ବଦଳସବà­à¬•à­ ଦେଖିବା ନିମନà­à¬¤à­‡ $1 ଦେଖନà­à¬¤à­ ।',
'enotif_lastdiff' => 'à¬à¬¹à¬¿ ବଦଳ ଦେଖିବା ପାଇଠ$1 ଦେଖନà­à¬¤à­ ।',
'enotif_anon_editor' => 'ବେନାମି ସଭà­à­Ÿ $1',
'enotif_body' => 'ପà­à¬°à¬¿à­Ÿ $WATCHINGUSERNAME,
+$PAGEINTRO $NEWPAGE
à¬à¬¹à¬¿ {{SITENAME}} $PAGETITLE ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ $PAGEEDITOR ଙà­à¬• ଦେଇ $PAGEEDITDATE ବେଳେ $CHANGEDORCREATE, ନଗଦ ସଂସà­à¬•à¬°à¬£ ପାଇଠ$PAGETITLE_URL ଦେଖନà­à¬¤à­ ।
@@ -2341,23 +2359,15 @@ $NEWPAGE
mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-ଆପଣ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ଯାଇ ନ ଦେଖିଲେ କିଛି ବି ସୂଚନା ରହିବ ନାହିଠ।
-ଆପଣା ଦେଖଣାତାଲିକାରୠଆପଣ ସବà­à¬¯à¬¾à¬• ସୂଚନା ଫଳକକୠମୂଳ ଅବସà­à¬¥à¬¾à¬•à­ ଫେରାଇ ଦେଇପାରିବେ ।
+ଭବିଷà­à­Ÿà¬¤à¬°à­‡ ଆପଣ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ ନ ଦେଖିବା ଯାଠଆଉ କିଛି ବି ସୂଚନା ରହିବ ନାହିଠ।ଆପଣା ଦେଖଣାତାଲିକାରୠଆପଣ ସବà­à¬¯à¬¾à¬• ସୂଚନା ଫଳକକୠମୂଳ ଅବସà­à¬¥à¬¾à¬•à­ ଫେରାଇ ଦେଇପାରିବେ ।
ଆପଣଙà­à¬•à¬° ହିତକାରୀ {{SITENAME}} ସୂଚନା ପà­à¬°à¬£à¬¾à¬³à­€
--
ଆପଣା ଇ-ମେଲ ସୂଚନା ସଜାଣି ଦେଖିବା ନିମନà­à¬¤à­‡
-{{canonicalurl:{{#special:Preferences}}}} ଦେଖନà­à¬¤à­
-
-ଆପଣା ଦେଖଣାତାଲିକା ସଜାଣି ବଦଳାଇବା ନିମନà­à¬¤à­‡,
-{{canonicalurl:{{#special:EditWatchlist}}}} ଦେଖନà­à¬¤à­
-
-ଆପଣା ଦେଖଣାତାଲିକାରୠà¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଲିଭାଇବା ନିମନà­à¬¤à­‡,
-$UNWATCHURL ଦେଖନà­à¬¤à­
-
-ମତାମତ ଓ ଅଧିକ ସହଯୋଗ:
-{{canonicalurl:{{MediaWiki:Helppage}}}}',
+{{canonicalurl:{{#special:Preferences}}}} ଦେଖନà­à¬¤à­',
+'created' => 'ତିଆରି କରାଗଲା',
+'changed' => 'ବଦଳାଗଲା',
# Delete
'deletepage' => 'ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଲିଭାଇଦେବେ',
@@ -2431,6 +2441,8 @@ $2ଙà­à¬• ଦେଇ ଶେଷଥର ହୋଇଥିବା ସଂସà­à¬•à¬°à¬
'prot_1movedto2' => '[[$1]] ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ [[$2]] କୠଘà­à¬žà­à¬šà¬¾à¬‡ ଦିଆଗଲା',
'protect-badnamespace-title' => 'କିଳାହୋଇନଥିବା ନେମସà­à¬ªà­‡à¬¸',
'protect-badnamespace-text' => 'à¬à¬¹à¬¿ ନେମସà­à¬ªà­‡à¬¸à¬¥à¬¿à¬¬à¬¾ ପୃଷà­à¬ à¬¾à¬¸à¬¬à­à¬•à­ ସାଇତାଯାଇପାରିବ ନାହିଠ।',
+'protect-norestrictiontypes-text' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿à¬•à­ କିଳାଯାଇପାରିବ ନାହିଠକାରଣ à¬à¬¹à¬¾à¬° କୌଣସି ସà­à¬°à¬•à­à¬·à¬¾ ପà­à¬°à¬•à¬¾à¬° ନାହିଠ।',
+'protect-norestrictiontypes-title' => 'କିଳାଯାଇପାରà­à¬¨à¬¥à¬¿à¬¬à¬¾ ପୃଷà­à¬ à¬¾',
'protect-legend' => 'କିଳଣାକୠଥୟ କରିବେ',
'protectcomment' => 'କାରଣ:',
'protectexpiry' => 'ଅଚଳ ହେବ:',
@@ -2517,7 +2529,7 @@ $2ଙà­à¬• ଦେଇ ଶେଷଥର ହୋଇଥିବା ସଂସà­à¬•à¬°à¬
'undeletedrevisions-files' => '{{PLURAL:$1|ଗୋଟିଠସଂସà­à¬•à¬°à¬£|$1 ଗୋଟି ସଂସà­à¬•à¬°à¬£}} ଓ {{PLURAL:$2|ଗୋଟିଠଫାଇଲ|$2 ଗୋଟି ଫାଇଲ}} ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କରାଗଲା',
'undeletedfiles' => '{{PLURAL:$1|ଗୋଟିଠଫାଇଲ|$1 ଗୋଟି ଫାଇଲ}} ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କରାଗଲା',
'cannotundelete' => 'ଲିଭାଇବାରୠରୋକିବା ବିଫଳ ହେଲା;
-à¬à¬¹à¬¾à¬•à­ ଆଗରୠକେହି ଜଣେ ଲିଭାଇବାରୠରୋକି ସାରିଅଛି ।',
+$1',
'undeletedpage' => "'''$1ର ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ କରାଗଲା'''
ନଗଦ ଲିଭାଇବା ଓ ପà­à¬¨à¬¸à­à¬¥à¬¾à¬ªà¬¨ ପାଇଠ[[Special:Log/delete|ଲିଭାଇବା ଇତିହାସ]] ଦେଖନà­à¬¤à­ ।",
@@ -2549,7 +2561,7 @@ $1',
'blanknamespace' => '(ମୂଳ)',
# Contributions
-'contributions' => 'ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ଦାନ',
+'contributions' => '{{GENDER:$1|User}}ଙà­à¬• ଅବଦାନ',
'contributions-title' => '$1 ପାଇଠବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€à¬™à­à¬• ଦାନ',
'mycontris' => 'ଅବଦାନ',
'contribsub2' => '$1 ($2) ପାଇà¬',
@@ -2828,6 +2840,7 @@ $1ର ଅଟକ ପାଇଠଦିଆଯାଇଥିବା କାରଣଟି à
'immobile-target-namespace-iw' => 'ଇଣà­à¬Ÿà¬°à¬‰à¬‡à¬•à¬¿ ଲିଙà­à¬• ପୃଷà­à¬ à¬¾ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¬à¬¾ ନିମନà­à¬¤à­‡ à¬à¬• ବୈଧ ଲକà­à¬·à¬¸à­à¬¥à¬³ ନà­à¬¹à­‡à¬ ।',
'immobile-source-page' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଘà­à¬žà­à¬šà¬¾à¬¯à­‹à¬—à­à­Ÿ ନà­à¬¹à­‡à¬ ।',
'immobile-target-page' => 'ଦେହି ମà­à¬•à¬¾à¬® ନାମକୠଘà­à¬žà­à¬šà¬¾à¬‡à¬¹à­‡à¬¬ ନାହିଠ।',
+'bad-target-model' => 'ଆଶାକରାଯାଇଥିବା ଲକà­à¬·à¬¸à­à¬¥à¬³à­€à¬Ÿà¬¿ ଅଲଗା ପà­à¬°à¬•à¬¾à¬° ଶୈଳୀ ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରà­à¬›à¬¿ । $1ରୠ$2କୠବଦଳାଇ ପାରିବ ନାହିଠ।',
'imagenocrossnamespace' => 'ଫାଇଲଟିକୠଅଣ-ଫାଇଲ ନେମସà­à¬ªà­‡à¬¸à¬•à­ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¹à­‡à¬¬ ନାହିà¬',
'nonfile-cannot-move-to-file' => 'ଅଣ-ଫାଇଲଟିକୠଫାଇଲ ନେମସà­à¬ªà­‡à¬¸à¬•à­ ଘà­à¬žà­à¬šà¬¾à¬‡à¬¹à­‡à¬¬ ନାହିà¬',
'imagetypemismatch' => 'ନୂଆ ଫାଇଲ à¬à¬•à­à¬¸à¬Ÿà­‡à¬¨à¬¸à¬¨ à¬à¬¹à¬¾à¬° ପà­à¬°à¬•à¬¾à¬° ସାଙà­à¬—ରେ ମେଳ ଖାଉନାହିà¬',
@@ -2944,6 +2957,7 @@ MediaWiki ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି [[Special:Import|ପୃଷà­à¬ à¬¾ à¬
'import-error-interwiki' => '"$1"ପୃଷà­à¬ à¬¾à¬•à­ ଆମଦାନୀ କରିହେଲାନି କାରଣ à¬à¬¹à¬¾à¬° ନାମ ବାହାରଲିଙà­à¬•à¬°à­‡ ଆଗରୠଅଛି(ଉଇକିଗà­à¬¡à¬¿à¬• ମଧà­à­Ÿà¬°à­‡) ।',
'import-error-special' => '"$1"ପୃଷà­à¬ à¬¾à¬•à­ ଆମଦାନୀ କରିହେଲାନି କାରଣ à¬à¬¹à¬¾ à¬à¬• ବିଶେଷ ନେମସà­à¬ªà­‡à¬¸à¬°à­‡ ଅଛି ଯାହା ପୃଷà­à¬ à¬¾à¬—à­à¬¡à¬¿à¬•à­ ଅନà­à¬®à¬¤à¬¿ ଦିଠନାହିଠ।',
'import-error-invalid' => '"$1"ପୃଷà­à¬ à¬¾à¬•à­ ଆମଦାନୀ କରିହେଲାନି କାରଣ à¬à¬¹à¬¾à¬° ନାମଟି ଅବୈଧ ।',
+'import-error-unserialize' => '"$1"ପୃଷà­à¬ à¬¾à¬° $2 ପà­à¬¨à¬°à¬¾à¬¬à­ƒà¬¤à¬¿à¬Ÿà¬¿ ଅଣତାଲିକାଭà­à¬•à­à¬¤ କରାଯାଇପାରିବ ନାହିଠ। ପà­à¬¨à¬°à¬¾à¬¬à­ƒà¬¤à¬¿à¬Ÿà¬¿ $3 ପà­à¬°à¬•à¬¾à¬° ବà­à­Ÿà¬¬à¬¾à¬¹à¬° କରିବା ପାଇଠ$4ରେ ତାଲିକାଭà­à¬•à­à¬¤ ହୋଇଛି ।',
'import-options-wrong' => 'ଭà­à¬² {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'ଦିଆଯାଇଥିବା ମୂଳ ପୃଷà­à¬ à¬¾à¬° ଶୀରà­à¬·à¬•à¬Ÿà¬¿ ଅବୈଧ ଅଟେ ।',
'import-rootpage-nosubpage' => 'ମୂଳ ପୃଷà­à¬ à¬¾à¬° "$1" ନେମସà­à¬ªà­‡à¬¸ ଉପପୃଷà­à¬ à¬¾à¬° ଅନà­à¬®à¬¤à¬¿ ଦିà¬à¬¨à¬¾à¬¹à¬¿à¬ ।',
@@ -2958,7 +2972,6 @@ MediaWiki ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି [[Special:Import|ପୃଷà­à¬ à¬¾ à¬
# JavaScriptTest
'javascripttest' => 'ଜାଭାସà­à¬•à­à¬°à¬¿à¬ªà­à¬Ÿ ପରଖ',
-'javascripttest-disabled' => 'à¬à¬¹à¬¿ ଉଇକିରେ à¬à¬¹à¬¿ ବà­à­Ÿà¬¬à¬¸à­à¬¥à¬¾à¬Ÿà¬¿à¬•à­ ସଚଳ କରାଯାଇନାହି ।',
'javascripttest-title' => 'ଚାଲà­à¬¥à¬¿à¬¬à¬¾ $1 ପରଖଗà­à¬¡à¬¿à¬•',
'javascripttest-pagetext-noframework' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬Ÿà¬¿ ଜାଭାସà­à¬•à­à¬°à¬¿à¬ªà­à¬Ÿ ପରଖ ପାଇଠସଂରକà­à¬·à¬£ କରି ରଖାଯାଇଛି ।',
'javascripttest-pagetext-unknownframework' => '"$1" ଅଜଣା ପରଖ ଗତିବିଧି ।',
@@ -3073,11 +3086,13 @@ MediaWiki ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି [[Special:Import|ପୃଷà­à¬ à¬¾ à¬
'pageinfo-default-sort' => 'ପୂରà­à¬¬à¬°à­à¬¥à¬¿à¬¬à¬¾ ସଜାଇବା ଚାବି',
'pageinfo-length' => 'ପୃଷà­à¬ à¬¾ ଲମà­à¬¬(ବାଇଟରେ)',
'pageinfo-article-id' => 'ପୃଷà­à¬ à¬¾ ଆଇଡ଼ି',
+'pageinfo-language' => 'ପୃଷà­à¬ à¬¾ ବିଷୟବସà­à¬¤à­à¬° ଭାଷା',
'pageinfo-robot-policy' => 'ଖୋଜିବା ଇଞà­à¬œà¬¿à¬¨ ସà­à¬¥à¬¿à¬¤à¬¿',
'pageinfo-robot-index' => 'ସୂଚୀପତà­à¬° କରିହେଉଥିବା',
'pageinfo-robot-noindex' => 'ସୂଚୀପତà­à¬° କରିହେଉନଥିବା',
'pageinfo-views' => 'ଦେଖଣା ସଂଖà­à­Ÿà¬¾',
'pageinfo-watchers' => 'ପୃଷà­à¬ à¬¾ ଦେଖଣାହାରି ସଂଖà­à­Ÿà¬¾',
+'pageinfo-few-watchers' => '$1ରୠକମ {{PLURAL:$1|ଦେଖଣାକାରୀ|ଦେଖଣାକାରୀଗଣ}}',
'pageinfo-redirects-name' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬•à­ ଲେଉଟାଣି ଅଛି',
'pageinfo-subpages-name' => 'à¬à¬¹à¬¿ ପୃଷà­à¬ à¬¾à¬°à­‡ ଥିବା ଉପପୃଷà­à¬ à¬¾',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})',
@@ -3092,6 +3107,19 @@ MediaWiki ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି [[Special:Import|ପୃଷà­à¬ à¬¾ à¬
'pageinfo-magic-words' => 'ଚମତà­à¬•à¬¾à¬° {{PLURAL:$1|word|words}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|category|categories}} ($1) ଲà­à¬šà¬¾à¬—ଲା',
'pageinfo-templates' => '{{PLURAL:$1|template|templates}} ($1) ଯୋଡିହେଇଥିବା',
+'pageinfo-transclusions' => '{{PLURAL:$1|Page|Pages}} ($1)ରେ ଯୋଡାଗଲା',
+'pageinfo-toolboxlink' => 'ପୃଷà­à¬ à¬¾ ସୂଚନା',
+'pageinfo-redirectsto' => 'କୠଲେଉଟାଣି',
+'pageinfo-redirectsto-info' => 'ସୂଚନା',
+'pageinfo-contentpage' => 'ବିଷୟବସà­à¬¤à­ ପୃଷà­à¬ à¬¾à¬­à¬¾à¬¬à­‡ ଗଣା ହେଲା',
+'pageinfo-contentpage-yes' => 'ହà¬',
+'pageinfo-protect-cascading' => 'ସà­à¬°à¬•à­à¬·à¬¾à¬—à­à¬¡à¬¿à¬• à¬à¬ à¬¾à¬°à­ ଲାଗିଲାଗି ଅଛି',
+'pageinfo-protect-cascading-yes' => 'ହà¬',
+'pageinfo-protect-cascading-from' => 'ରୠସà­à¬°à¬•à­à¬·à¬¾à¬—à­à¬¡à¬¿à¬• ଲାଗିଲାଗି ଅଛି',
+'pageinfo-category-info' => 'ଶà­à¬°à­‡à¬£à­€à¬¸à¬®à­à¬ªà¬°à­à¬•à­€à­Ÿ ତଥà­à­Ÿ',
+'pageinfo-category-pages' => 'ପୃଷà­à¬ à¬¾ ସଂଖà­à­Ÿà¬¾',
+'pageinfo-category-subcats' => 'ଉପବିଭାଗଗà­à¬¡à¬¿à¬•à¬° ସଂଖà­à­Ÿà¬¾',
+'pageinfo-category-files' => 'ଫାଇଲ ସଂଖà­à­Ÿà¬¾',
# Patrolling
'markaspatrolleddiff' => 'ଜଗାଯାଇଅଛି ବୋଲି ଚିହà­à¬¨à¬¿à¬¤ କରାଗଲା',
@@ -3103,6 +3131,8 @@ MediaWiki ବà­à­Ÿà¬¬à¬¹à¬¾à¬° କରି [[Special:Import|ପୃଷà­à¬ à¬¾ à¬
'markedaspatrollederror' => 'ଜଗାଯାଇଅଛି ବୋଲି ଚିହà­à¬¨à¬¿à¬¤ କରିପାରà­à¬²à­à¬ ନାହିà¬',
'markedaspatrollederrortext' => 'ଜଗାଯାଇଅଛି ବୋଲି ଚିହà­à¬¨à¬¿à¬¤ କରିବା ନିମନà­à¬¤à­‡ ଆପଣଙà­à¬•à­ à¬à¬• ସଂସà­à¬•à¬°à¬£ ଦେବାକୠପଡ଼ିବ ।',
'markedaspatrollederror-noautopatrol' => 'ଆପଣ ନିଜର ସମà­à¬ªà¬¾à¬¦à¬¨à¬¾à¬¸à¬¬à­à¬•à­ ଜଗାଯାଇଅଛି ବୋଲି ଚିହà­à¬¨à¬¿à¬¤ କରିପାରିବେ ନାହିଠ।',
+'markedaspatrollednotify' => '$1 ପାଇଠà¬à¬¹à¬¿ ବଦଳଟିକୠଶà­à¬°à­‡à¬£à­€à¬—ତ ବୋଲି ଚିହà­à¬¨à¬Ÿ କରାଯାଇଛି ।',
+'markedaspatrollederrornotify' => 'ଶà­à¬°à­‡à¬£à­€à¬¬à¬¿à¬­à¬¾à¬— କରିହେଲାନି ।',
# Patrol log
'patrol-log-page' => 'ଜଗିବା ଇତିହାସ',
@@ -3136,6 +3166,7 @@ $1',
'file-nohires' => 'ବଡ଼ ରେଜୋଲà­à¬¸à¬¨ ନାହିଠ।',
'svg-long-desc' => 'SVG ଫାଇଲ, ସାଧାରଣ ମାପ $1 × $2 ପିକà­à¬¸à­‡à¬², ଫାଇଲ ଆକାର: $3',
'svg-long-desc-animated' => 'Animated SVG ଫାଇଲ, ସାଧାରଣ ମାପ $1 × $2 ପିକà­à¬¸à­‡à¬², ଫାଇଲ ଆକାର: $3',
+'svg-long-error' => 'ଅବୈଧ SVG ଫାଇଲ: $1',
'show-big-image' => 'ପà­à¬°à¬¾ ବଡ଼ ଆକାରରେ',
'show-big-image-preview' => 'à¬à¬¹à¬¿ ଦେଖଣାର ଆକାର: $1 ।',
'show-big-image-other' => 'ବାକି {{PLURAL:$2|ରେଜୋଲà­à¬¸à¬¨|ରେଜୋଲà­à¬¸à¬¨}}: $1.',
@@ -3165,7 +3196,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 ମିନିଟ|$1 ମିନିଟ}}',
'hours' => '{{PLURAL:$1|$1 ଘଣà­à¬Ÿà¬¾|$1 ଘଣà­à¬Ÿà¬¾}}',
'days' => '{{PLURAL:$1|$1 ଦିନ|$1 ଦିନ}}',
+'months' => '{{PLURAL:$1|$1 month|$1 months}}',
+'years' => '{{PLURAL:$1|$1 year|$1 years}}',
'ago' => '$1 ଆଗରà­',
+'just-now' => 'à¬à¬¬à­‡ à¬à¬¬à­‡',
# Bad image list
'bad_image_list' => 'ଗଢ଼ଣଟି à¬à¬®à¬¿à¬¤à¬¿ ହେବ:
@@ -3661,6 +3695,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[ଉଇକି-ଉଇକି ଭିତରେ ଟà­à¬°à¬¾à¬¨à­à¬¸à¬•à­à¬²à­à¬¡à¬¼à¬¿à¬™à­à¬— ଅଚଳ କରାଯାଇଛି]',
'scarytranscludefailed' => '[$1 ପାଇଠଛାଞà­à¬šà¬•à­ ପାଇବା ସମà­à¬­à¬¬ ହେଲାନାହିà¬]',
+'scarytranscludefailed-httpstatus' => '[Template fetch failed for $1: HTTP $2]',
'scarytranscludetoolong' => '[URLଟି ଖà­à¬¬ ଲମà­à¬¬à¬¾]',
# Delete conflict
@@ -3772,6 +3807,7 @@ $5
'version-license' => 'ଲାଇସେନà­à¬¸',
'version-poweredby-credits' => "à¬à¬¹à¬¿ ଉଇକିଟି '''[//www.mediawiki.org/ ମିଡ଼ିଆଉଇକି]''' ଦେଇ ପରିଚାଳିତ, ସତà­à¬µà¬¾à¬§à¬¿à¬•à¬¾à¬° © ୨୦୦୧-$1 $2 ।",
'version-poweredby-others' => 'ବାକିସବà­',
+'version-credits-summary' => 'ଆମେ à¬à¬¹à¬¿ ଲୋକମାନଙà­à¬•à­ [[Special:Version|MediaWiki]]ରେ ସେମାନକର ଅବଦାନ ପାଇଠଚିହà­à¬¨à¬¿à¬¬à¬¾à¬•à­ ଚାହà­à¬à¬›à­ ।',
'version-license-info' => 'MediaWiki à¬à¬• ମାଗଣା ସଫà­à¬Ÿà­±à¬¾à¬°; ଆପଣ à¬à¬¹à¬¾à¬•à­ ପà­à¬¨à¬¬à¬£à­à¬Ÿà¬¨ କରିପାରିବେ ବା GNU ଜେନେରାଲ ପବà­à¬²à¬¿à¬• ଲାଇସେନà­à¬¸ ଅଧିନରେ ବଦଳାଇପାରିବେ ଯାହା ଫà­à¬°à¬¿ ସଫà­à¬Ÿà­±à¬¾à¬° ଫାଉଣà­à¬¡à­‡à¬¸à¬¨ ଦେଇ ପà­à¬°à¬•à¬¾à¬¶à¬¿à¬¤ ହୋଇଥିବ।
MediaWiki ଉପଯୋଗୀ ହେବା ଲକà­à¬·à¬°à­‡ ବଣà­à¬Ÿà¬¾à¬¯à¬¾à¬‡à¬¥à¬¾à¬, କିନà­à¬¤à­ à¬à¬¹à¬¾ କୌଣସି ଲିଖିତ ପଟା ସହ ଆସିନଥାà¬; à¬à¬¹à¬¾ ବିକà­à¬°à­Ÿà¬¯à­‹à¬—à­à­Ÿà¬¤à¬¾ ବା à¬à¬• ନିରà­à¬¦à¬¿à¬·à­à¬Ÿ କାମପାଇଠବାଧà­à­Ÿà¬¤à¬¾à¬®à­‚ଳକ ପଟା ସହ ଆସିନଥାଠ। ଅଧିକ ଜାଣିବା ନିମନà­à¬¤à­‡ ଦୟାକରି GNU ଜେନେରାଲ ପବà­à¬²à¬¿à¬• ଲାଇସେନà­à¬¸ ଦେଖନà­à¬¤à­ ।
@@ -3914,8 +3950,12 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକà­à¬·à¬°à­‡ ବଣà­à¬Ÿà¬¾à¬¯à
'logentry-newusers-newusers' => 'ସଭà­à­Ÿ ଖାତା $1 ତିଆରି କରାଗଲା',
'logentry-newusers-create' => 'ସଭà­à­Ÿ ଖାତା $1 ତିଆରି କରାଗଲା',
'logentry-newusers-create2' => 'ସଭà­à­Ÿ ଖାତା $3ଟି $1 ଦà­à¬µà¬¾à¬°à¬¾ ତିଆରି କରାଗଲା',
+'logentry-newusers-byemail' => '$1ଙà­à¬• ଦà­à¬µà¬¾à¬°à¬¾ $3 ବà­à­Ÿà¬¬à¬¹à¬¾à¬°à¬•à¬¾à¬°à­€ ଖାତାଟି ଖୋଳାଗଲା à¬à¬¬à¬‚ ପାସୱାରà­à¬¡à¬Ÿà¬¿ ଇ-ମେଲ ଦà­à¬µà¬¾à¬°à¬¾ ପଠାଗଲା',
'logentry-newusers-autocreate' => '$1 ଖାତାଟି ଆପେଆପେ ତିଆରିହେଲା',
-'newuserlog-byemail' => 'ଇ-ମେଲରେ ପାସୱାରà­à¬¡à¬¼ ପଠାଇଦିଆଗଲା',
+'logentry-rights-rights' => '$1, $3 ପାଇଠ$4ରୠ$5କୠସଭà­à­Ÿà¬ªà¬¦ ବଦଳାଇଲେ',
+'logentry-rights-rights-legacy' => '$1, $3 ପାଇଠଗୋଷà­à¬ à­€ ସଭà­à­Ÿà¬ªà¬¦ ବଦଳାଇଛି',
+'logentry-rights-autopromote' => '$1 ଆପେ ଆପେ $4ରୠ$5କୠଗଲେ',
+'rightsnone' => '(କିଛି ନାହିà¬)',
# Feedback
'feedback-bugornote' => 'ଦୟାକରି ଆପଣ à¬à¬• କାରିଗରି ଅସà­à¬¬à¬¿à¬§à¬¾à¬Ÿà¬¿à¬ ଜଣାଇବା ପାଇଠଚାହà­à¬à¬¥à¬¿à¬²à­‡ ଦୟାକରି [$1 à¬à¬ à¬¾à¬°à­‡ ଅସà­à¬¬à¬¿à¬§à¬¾à¬Ÿà¬¿ ଜଣାନà­à¬¤à­] ।
@@ -3970,6 +4010,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକà­à¬·à¬°à­‡ ବଣà­à¬Ÿà¬¾à¬¯à
'api-error-ok-but-empty' => 'ଭିତର ଅସà­à¬¬à¬¿à¬§à¬¾: ସରà­à¬­à¬° ଠାରୠକିଛି ଖବର ନାହିଠ।',
'api-error-overwrite' => 'ଆଗରà­à¬¥à¬¿à¬¬à¬¾ à¬à¬• ଫାଇଲ ଉପରେ ମଡ଼ାଇବା ଅନà­à¬®à­‹à¬¦à¬¿à¬¤ ନà­à¬¹à­‡à¬ ।',
'api-error-stashfailed' => 'ଭିତର ଅସà­à¬¬à¬¿à¬§à¬¾: ସରà­à¬­à¬° ଅସà­à¬¥à¬¾à­Ÿà­€ ଫାଇଲକୠସାଇତି ପାରିଲା ନାହିଠ।',
+'api-error-publishfailed' => 'ଭିତର ଅସà­à¬¬à¬¿à¬§à¬¾: ସରà­à¬­à¬° ଅସà­à¬¥à¬¾à­Ÿà­€ ଫାଇଲକୠପà­à¬°à¬•à¬¾à¬¶ କରିପାରିଲା ନାହିଠ।',
'api-error-timeout' => 'ସରà­à¬­à¬° à¬à¬• ସୀମିତ କାଳ ଭିତରେ ଉତà­à¬¤à¬° ଦେଲାନାହିଠ।',
'api-error-unclassified' => 'à¬à¬• ଅଜଣା ଅସà­à¬¬à¬¿à¬§à¬¾ ଘଟିଲା ।',
'api-error-unknown-code' => 'ଅଜଣା ତୃଟି: "$1"',
diff --git a/languages/messages/MessagesOs.php b/languages/messages/MessagesOs.php
index 48bdf430..3a6e5452 100644
--- a/languages/messages/MessagesOs.php
+++ b/languages/messages/MessagesOs.php
@@ -27,8 +27,8 @@ $namespaceNames = array(
NS_FILE_TALK => 'Файлы_тæрхон',
NS_MEDIAWIKI => 'MediaWiki',
NS_MEDIAWIKI_TALK => 'MediaWiki-йы_тæрхон',
- NS_TEMPLATE => 'Шаблон',
- NS_TEMPLATE_TALK => 'Шаблоны_тæрхон',
+ NS_TEMPLATE => 'Хуызæг',
+ NS_TEMPLATE_TALK => 'Хуызæджы_тæрхон',
NS_HELP => 'ÆххуыÑ',
NS_HELP_TALK => 'ÆххуыÑÑ‹_тæрхон',
NS_CATEGORY => 'Категори',
@@ -44,6 +44,8 @@ $namespaceAliases = array(
'Ðывы_тыххæй_диÑкуÑÑи' => NS_FILE_TALK,
'ДиÑкуÑÑи_MediaWiki' => NS_MEDIAWIKI_TALK,
'Тæрхон_MediaWiki' => NS_MEDIAWIKI_TALK,
+ 'Шаблон' => NS_TEMPLATE,
+ 'Шаблоны_тæрхон' => NS_TEMPLATE_TALK,
'Шаблоны_тыххæй_диÑкуÑÑи' => NS_TEMPLATE_TALK,
'ÆххуыÑÑ‹_тыххæй_диÑкуÑÑи' => NS_HELP_TALK,
'Категорийы_тыххæй_диÑкуÑÑи' => NS_CATEGORY_TALK,
@@ -53,6 +55,8 @@ $specialPageAliases = array(
'Activeusers' => array( 'ÐктивонÐрхайджытæ' ),
'Allmessages' => array( 'ФыÑтæджытæИууылдæр' ),
'Allpages' => array( 'ФæрÑтæИууылдæр' ),
+ 'Ancientpages' => array( 'ЗæрондФæрÑтæ' ),
+ 'Badtitle' => array( 'Æвзæрном' ),
'Blankpage' => array( 'ÐфтидФарÑ' ),
'Block' => array( 'Блок' ),
'Blockme' => array( 'ÐыблокМæКæн' ),
@@ -65,25 +69,117 @@ $specialPageAliases = array(
'Confirmemail' => array( 'EmailБæлвырдКæнын' ),
'Contributions' => array( 'Бавæрд' ),
'CreateAccount' => array( 'ÐккаунтСкæнын' ),
+ 'Deadendpages' => array( 'ХæдбарФæрÑтæ' ),
'DeletedContributions' => array( 'ХафтБавæрд' ),
+ 'Disambiguations' => array( 'БирæныÑаниуæгджынтæ' ),
+ 'DoubleRedirects' => array( 'ДывæрÆрвыÑтытæ' ),
+ 'EditWatchlist' => array( 'ЦæÑтдардИвын' ),
+ 'Emailuser' => array( 'ÐрхайæгмæEmail' ),
+ 'Export' => array( 'ЭкÑпорт' ),
+ 'Fewestrevisions' => array( 'ЦъуÑдæрФæлтæртæ' ),
+ 'FileDuplicateSearch' => array( 'ФайлыДубликатÐгурын' ),
+ 'Filepath' => array( 'ФайлмæФæт' ),
+ 'Import' => array( 'Импорт' ),
+ 'Invalidateemail' => array( 'EmailРабæлвырдКæнын' ),
+ 'JavaScriptTest' => array( 'JavaScriptТеÑÑ‚' ),
+ 'BlockList' => array( 'Блокты_Ðомхыгъд' ),
+ 'LinkSearch' => array( 'ÆрвитæнÐгурын' ),
+ 'Listadmins' => array( 'РадгæÑÑ‚Ñ‹Ðомхыгъд' ),
+ 'Listbots' => array( 'БоттыÐомхыгъд' ),
+ 'Listfiles' => array( 'ÐывтыÐомхыгъд' ),
+ 'Listgrouprights' => array( 'ÐрхайджытыБартыÐомхыгъд' ),
+ 'Listredirects' => array( 'ÆрвыÑÑ‚Ñ‹Ñ‚Ñ‹Ðомхыгъд' ),
+ 'Listusers' => array( 'ÐрхайджытыÐомхыгъд' ),
+ 'Lockdb' => array( 'РДСæхгæнын' ),
+ 'Log' => array( 'Логтæ' ),
+ 'Lonelypages' => array( 'ИунæгФæрÑтæ' ),
+ 'Longpages' => array( 'ДаргъФæрÑтæ' ),
+ 'MergeHistory' => array( 'ИÑторитæБаиуКæнын' ),
+ 'MIMEsearch' => array( 'MIMEÐгурын' ),
+ 'Mostcategories' => array( 'ФылдæрКатегоритæ' ),
+ 'Mostimages' => array( 'ÆппæтыÐрхайдФайлтæ' ),
+ 'Mostinterwikis' => array( 'ФылдæрИнтервикитæ' ),
+ 'Mostlinked' => array( 'ФылдæрБаÑтФæрÑтæ' ),
+ 'Mostlinkedcategories' => array( 'ФылдæрБаÑтКатегоритæ' ),
+ 'Mostlinkedtemplates' => array( 'ФылдæрБаÑтХуызæгтæ' ),
+ 'Mostrevisions' => array( 'ФылдæрФæлтæртæ' ),
+ 'Movepage' => array( 'ФарÑХæÑÑын' ),
'Mycontributions' => array( 'МæБавæрд' ),
'Mypage' => array( 'МæФарÑ' ),
'Mytalk' => array( 'МæÐыхаÑ' ),
'Myuploads' => array( 'МæБавгæд' ),
'Newimages' => array( 'ÐогФайлтæ' ),
'Newpages' => array( 'ÐогФæрÑтæ' ),
- 'Preferences' => array( 'Фадæттæ' ),
+ 'PasswordReset' => array( 'ПарольÐогКæнын' ),
+ 'PermanentLink' => array( 'УдгаÑÆрвитæн' ),
+ 'Popularpages' => array( 'ÐрæхФæрÑтæ' ),
+ 'Preferences' => array( 'Уагæвæрдтæ' ),
+ 'Prefixindex' => array( 'РазæфтуантыИндекÑ' ),
+ 'Protectedpages' => array( 'ÆхгæдФæрÑтæ' ),
+ 'Protectedtitles' => array( 'ÆхгæдÐæмттæ' ),
'Randompage' => array( 'ÆрхаугæФарÑ' ),
+ 'Randomredirect' => array( 'ÆрхаугæРарвыÑÑ‚' ),
'Recentchanges' => array( 'ФæÑтагИвдтытæ' ),
+ 'Recentchangeslinked' => array( 'БаÑтИвдтытæ' ),
+ 'Revisiondelete' => array( 'ИвдХафын' ),
'Search' => array( 'Ðгурын' ),
+ 'Shortpages' => array( 'ЦыбырФæрÑтæ' ),
+ 'Specialpages' => array( 'СæрмагондФæрÑтæ' ),
+ 'Statistics' => array( 'СтатиÑтикæ' ),
+ 'Tags' => array( 'Тегтæ' ),
+ 'Unblock' => array( 'РаблокКæнын' ),
+ 'Uncategorizedcategories' => array( 'ÆнæКатегориКатегоритæ' ),
+ 'Uncategorizedimages' => array( 'ÆнæКатегориФайлтæ' ),
+ 'Uncategorizedpages' => array( 'ÆнæКатегориФæрÑтæ' ),
+ 'Uncategorizedtemplates' => array( 'ÆнæКатегориХуызæгтæ' ),
+ 'Undelete' => array( 'Рацаразын' ),
+ 'Unlockdb' => array( 'РДРаблокКæнын' ),
+ 'Unusedcategories' => array( 'ÆнæÐрхайдКатегоритæ' ),
+ 'Unusedimages' => array( 'ÆнæÐрхайдФайлтæ' ),
+ 'Unusedtemplates' => array( 'ÆнæÐрхайдХуызæгтæ' ),
+ 'Unwatchedpages' => array( 'ÆнæЦæÑтдардФæрÑтæ' ),
+ 'Upload' => array( 'Æвгæнын' ),
+ 'Userlogin' => array( 'Бахизын' ),
+ 'Userlogout' => array( 'Рахизын' ),
+ 'Userrights' => array( 'ÐрхайæджыБартæ' ),
+ 'Version' => array( 'Фæлтæр' ),
+ 'Wantedcategories' => array( 'ХъæугæКатегоритæ' ),
+ 'Wantedfiles' => array( 'ХъæугæФайлтæ' ),
+ 'Wantedpages' => array( 'ХъæугæФæрÑтæ' ),
+ 'Wantedtemplates' => array( 'ХъæугæХуызæгтæ' ),
'Watchlist' => array( 'ЦæÑтдард' ),
+ 'Whatlinkshere' => array( 'ÐрдæмЦыÆрвиты' ),
+ 'Withoutinterwiki' => array( 'ÆнæИнтервики' ),
);
$magicWords = array(
- 'redirect' => array( '0', '#РÐРВЫСТ', '#перенаправление', '#перенапр', '#REDIRECT' ),
+ 'redirect' => array( '0', '#ÆРВИТÆÐ', '#ÆРВЫСТ', '#РÐРВЫСТ', '#перенаправление', '#перенапр', '#REDIRECT' ),
+ 'notoc' => array( '0', '__ÆÐÆСÆР__', '__БЕЗ_ОГЛÐВЛЕÐИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__ÆÐÆГÐЛЕРЕЙ__', '__БЕЗ_ГÐЛЕРЕИ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__СÆРТИМÆ__', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__СÆРТÆ__', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__ÆÐÆХÐЙИВЫÐÆЙ__', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'ÐЦЫМÆЙ', 'ÐЦЫМÆЙ2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ÐЦЫМÆЙ1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ÐЦЫМÆЙЫÐОМ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'ÐЦЫМÆЙЫÐОМГУЫР', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_РОД', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'ÐЦЫМÆЙЫÐОМЦЫБ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ_ÐБР', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'ÐБОÐ', 'ТЕКУЩИЙ_ДЕÐЬ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ÐБОÐ2', 'ТЕКУЩИЙ_ДЕÐЬ_2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ÐБОÐЫБОÐЫÐОМ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_ДÐЯ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ÐЦЫÐЗ', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ÐЫРЫРÆСТÆГ', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ÐЫРЫСÐÐ¥ÐТ', 'ТЕКУЩИЙ_ЧÐС', 'CURRENTHOUR' ),
+ 'numberofpages' => array( '1', 'ФÆРСТЫÐЫМÆЦ', 'КОЛИЧЕСТВО_СТРÐÐИЦ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'УÐЦТЫÐЫМÆЦ', 'КОЛИЧЕСТВО_СТÐТЕЙ', 'NUMBEROFARTICLES' ),
+ 'pagename' => array( '1', 'ФÐРСЫÐОМ', 'ÐÐЗВÐÐИЕ_СТРÐÐИЦЫ', 'PAGENAME' ),
+ 'img_thumbnail' => array( '1', 'къаддæргонд', 'къаддæр', 'мини', 'миниатюра', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', 'къаддæргонд=$1', 'къаддæр=$1', 'мини=$1', 'миниатюра=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'рахиз', 'Ñправа', 'right' ),
'img_left' => array( '1', 'галиу', 'Ñлева', 'left' ),
+ 'img_none' => array( '1', 'æнæ', 'без', 'none' ),
+ 'img_center' => array( '1', 'аÑтæу', 'центр', 'center', 'centre' ),
);
$linkTrail = '/^((?:[a-z]|а|æ|б|в|г|д|е|Ñ‘|ж|з|и|й|к|л|м|н|о|п|Ñ€|Ñ|Ñ‚|у|Ñ„|Ñ…|ц|ч|ш|щ|ÑŠ|Ñ‹|ÑŒ|Ñ|ÑŽ|Ñ|“|»)+)(.*)$/sDu';
@@ -223,6 +319,7 @@ $messages = array(
'newwindow' => '(кæны ног рудзынджы)',
'cancel' => 'Ðыууадзын',
'moredotdotdot' => 'Фылдæр…',
+'morenotlisted' => 'Фылдæр æнææвдыÑÑ‚...',
'mypage' => 'ФарÑ',
'mytalk' => 'ÐыхаÑ',
'anontalk' => 'Ðцы IP-адриÑÑ‹ тæрхон',
@@ -234,7 +331,6 @@ $messages = array(
'qbbrowse' => 'Фен',
'qbedit' => 'Ивын',
'qbpageoptions' => 'Ðцы фарÑ',
-'qbpageinfo' => 'ФарÑÑ‹ контекÑÑ‚',
'qbmyoptions' => 'Мæ фæрÑтæ',
'qbspecialpages' => 'Сæрмагонд фæрÑтæ',
'faq' => 'FAQ',
@@ -257,6 +353,7 @@ $messages = array(
'namespaces' => 'Ðомдæттæ',
'variants' => 'Варианттæ',
+'navigation-heading' => 'Ðавигацион меню',
'errorpagetitle' => 'Рæдыд',
'returnto' => 'ФæÑтæмæ $1 фарÑмæ.',
'tagline' => '{{grammar:ablative|{{SITENAME}}}}',
@@ -502,10 +599,10 @@ $2',
# Login and logout pages
'logouttext' => "'''ÐÑ‹Ñ€ дæ æддæмæ хызт.'''
-Дæ бон у дарддæр архайай {{grammar:genitive|{{SITENAME}}}} æнæномæй, æви та [[Special:UserLogin|фæÑтæмæ бахизын]] раздæры номæй кæнæ та æндæр номæй.
+Дæ бон у дарддæр архайай {{grammar:genitive|{{SITENAME}}}} æнæномæй, æви та <span class='plainlinks'>[$1 фæÑтæмæ бахизын]</span> раздæры номæй кæнæ та æндæр номæй.
Дæ Ñæры дар æмæ иуæй иу фæрÑтæ гæнæн Ð¸Ñ Ã¦Ð²Ð´Ñ‹ÑÑ‚ цæуой афтæ, цымæ нырмæ дæр нæ рахызтæ. Уый тыххæй дæ браузеры кеш Ñафтид кæн.",
-'welcomecreation' => '== Ó”Ð³Ð°Ñ Ñ†Ñƒ, $1! ==
-Дæ аккаунт арæзт æрцыдиÑ.
+'welcomeuser' => 'Ã†Ð³Ð°Ñ Ñ†Ñƒ, $1!',
+'welcomecreation-msg' => 'Дæ аккаунт арæзт æрцыдиÑ.
Ма дæ ферох уæт æркæÑын дæ [[Special:Preferences|{{grammar:genitive|{{SITENAME}}}} уагæвæрдтæм]].',
'yourname' => 'ФæÑномыг:',
'yourpassword' => 'Пароль:',
@@ -664,6 +761,7 @@ $2
'changeemail-oldemail' => 'Ðырыккон e-mail адриÑ:',
'changeemail-newemail' => 'Ðог e-mail адриÑ:',
'changeemail-none' => '(нæй)',
+'changeemail-password' => 'Дæ {{grammar:genitive|{{SITENAME}}}} пароль:',
'changeemail-submit' => 'E-mail фæивын',
'changeemail-cancel' => 'Ðыууадзын',
@@ -793,6 +891,12 @@ $2
'edit-conflict' => 'Ивдтыты конфликт.',
'edit-already-exists' => 'Ðог Ñ„Ð°Ñ€Ñ Ñкæнæн нæй. Ðхæм Ñ„Ð°Ñ€Ñ Ð¸Ñ.',
+# Content models
+'content-model-wikitext' => 'викитекÑÑ‚',
+'content-model-text' => 'хуымæтæг текÑÑ‚',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
# Parser/template warnings
'post-expand-template-inclusion-warning' => "'''Сындæг: ''' Хуызæджы бавæрд бæрц æгæр ÑÑ‚Ñ‹Ñ€ у.
Кæцыдæр хуызæгтæ нæ бавæд уыдзыÑÑ‚Ñ‹.",
@@ -1031,8 +1135,8 @@ $2
'right-delete' => 'ФæрÑтæ хафын',
'right-bigdelete' => 'Стыр иÑториимæ фæрÑтæ хафын',
-# User rights log
-'rightsnone' => '(нæй)',
+# Special:Log/newusers
+'newuserlogpage' => 'Ðрхайджыты фæзындты лог',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ацы Ñ„Ð°Ñ€Ñ ÐºÃ¦Ñын',
@@ -1257,9 +1361,6 @@ $3',
# Special:ListUsers
'listusers-submit' => 'РавдиÑын',
-# Special:Log/newusers
-'newuserlogpage' => 'Ðрхайджыты фæзындты лог',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Къорд',
'listgrouprights-rights' => 'Бартæ',
@@ -1292,9 +1393,8 @@ $3',
'watching' => 'ЦæÑтдард фæрÑÑ‚Ñ‹ номхыгъдмæ афтауын...',
'unwatching' => 'ЦæÑтдард фæрÑÑ‚Ñ‹ номхыгъдæй Ð°Ð¸ÑƒÐ²Ð°Ñ€Ñ ÐºÃ¦Ð½Ñ‹Ð½...',
-'enotif_newpagetext' => 'Ðй у нæуæг фарÑ.',
-'changed' => 'ивд æрцыд',
'enotif_anon_editor' => 'ÑуÑæг архайæг $1',
+'changed' => 'ивд æрцыд',
# Delete
'deletepage' => 'Схаф фарÑ',
@@ -1338,7 +1438,7 @@ $3',
'blanknamespace' => '(Сæйраг)',
# Contributions
-'contributions' => 'Ðрхайæджы бавæрд',
+'contributions' => '{{GENDER:$1|Ðрхайæджы}} бавæрд',
'contributions-title' => 'Ðрхайæджы бавæрд: $1',
'mycontris' => 'Бавæрд',
'contribsub2' => 'Ðрхайæг: $1 ($2)',
@@ -1691,6 +1791,7 @@ $3',
# New logging system
'logentry-delete-delete' => '$1 Ñхафта Ñ„Ð°Ñ€Ñ $3',
'logentry-delete-restore' => '$1 рацарæзта Ñ„Ð°Ñ€Ñ $3',
+'rightsnone' => '(нæй)',
# Feedback
'feedback-subject' => 'Сæр:',
diff --git a/languages/messages/MessagesPa.php b/languages/messages/MessagesPa.php
index c9a1f10d..bf1d97e8 100644
--- a/languages/messages/MessagesPa.php
+++ b/languages/messages/MessagesPa.php
@@ -61,10 +61,114 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'Activeusers' => array( 'ਸਰਗਰਮ_ਵਰਤੌਂਕਾਰ' ),
- 'Blankpage' => array( 'ਖਾਲੀ_ਸਫ਼ਾ' ),
- 'Block' => array( 'ਪਾਬੰਦੀ_ਲਾਉਣਾ', 'ਪਾਬੰਦੀ_ਸ਼à©à¨¦à¨¾_ਆਈ_ਪੀ', 'ਪਾਬੰਦੀ_ਸ਼à©à¨¦à¨¾_ਵਰਤੌਂਕਾਰ' ),
- 'Listusers' => array( 'ਵਰਤੌਂਕਾਰਾਂ_ਦੀ_ਸੂਚੀ' ),
+ 'Activeusers' => array( 'ਸਰਗਰਮ_ਮੈਂਬਰ' ),
+ 'Allmessages' => array( 'ਸਾਰੇ_ਸਨੇਹੇ' ),
+ 'Allpages' => array( 'ਸਾਰੇ_ਪੰਨੇ' ),
+ 'Ancientpages' => array( 'ਪà©à¨°à¨¾à¨£à©‡_ਪੰਨੇ' ),
+ 'Badtitle' => array( 'ਖਰਾਬ_ਸਿਰਲੇਖ' ),
+ 'Blankpage' => array( 'ਖਾਲੀ_ਪੰਨਾ' ),
+ 'Block' => array( 'ਪਾਬੰਦੀ_ਲਾਓ', 'IP_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ', 'ਮੈਂਬਰ_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ' ),
+ 'Blockme' => array( 'ਮੇਰੇ_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ' ),
+ 'Booksources' => array( 'ਕਿਤਾਬ_ਸਰੋਤ' ),
+ 'BrokenRedirects' => array( 'ਟà©à©±à¨Ÿà©‡_ਰੀਡਿਰੈਕਟ' ),
+ 'Categories' => array( 'ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚' ),
+ 'ChangeEmail' => array( 'ਈ-ਮੇਲ_ਬਦਲੋ' ),
+ 'ChangePassword' => array( 'ਪਾਸਵਰਡ_ਬਦਲੋ', 'ਪਾਸਵਰਡ_ਰੀਸੈੱਟ_ਕਰੋ' ),
+ 'ComparePages' => array( 'ਪੰਨਿਆਂ_ਦੀ_ਤà©à¨²à¨¨à¨¾_ਕਰੋ' ),
+ 'Confirmemail' => array( 'ਈ-ਮੇਲ_ਤਸਦੀਕ_ਕਰੋ' ),
+ 'Contributions' => array( 'ਯੋਗਦਾਨ' ),
+ 'CreateAccount' => array( 'ਖਾਤਾ_ਬਣਾਓ' ),
+ 'Deadendpages' => array( 'ਬੰਦ_ਪੰਨੇ' ),
+ 'DeletedContributions' => array( 'ਮਿਟਾà¨_ਯੋਗਦਾਨ' ),
+ 'Disambiguations' => array( 'ਗà©à©°à¨à¨²à¨–ੋਲà©à¨¹' ),
+ 'DoubleRedirects' => array( 'ਦੂਹਰੇ_ਰੀਡਿਰੈਕਟ' ),
+ 'EditWatchlist' => array( 'ਨਿਗਰਾਨੀ-ਲਿਸਟ_ਸੋਧੋ' ),
+ 'Emailuser' => array( 'ਮੈਂਬਰ_ਨੂੰ_ਈ-ਮੇਲ_ਕਰੋ' ),
+ 'Export' => array( 'ਨਿਰਯਾਤ' ),
+ 'Fewestrevisions' => array( 'ਸਭ_ਤੋਂ_ਘੱਟ_ਰੀਵਿਜ਼ਨਾਂ' ),
+ 'FileDuplicateSearch' => array( 'ਨਕਲੀ_ਫ਼ਾਈਲ_ਖੋਜੋ' ),
+ 'Filepath' => array( 'ਫ਼ਾਈਲ_ਪਥ' ),
+ 'Import' => array( 'ਆਯਾਤ' ),
+ 'Invalidateemail' => array( 'ਗਲਤ_ਈ-ਮੇਲ_ਪਤਾ' ),
+ 'JavaScriptTest' => array( 'ਜਾਵਾਸਕà©à¨°à¨¿à¨ªà¨Ÿ_ਪਰਖ' ),
+ 'BlockList' => array( 'ਪਾਬੰਦੀਆਂ_ਦੀ_ਸੂਚੀ' ),
+ 'LinkSearch' => array( 'ਲਿੰਕ_ਖੋਜੋ' ),
+ 'Listadmins' => array( 'ਪà©à¨°à¨¬à©°à¨§à¨•à¨¾à¨‚_ਦੀ_ਸੂਚੀ' ),
+ 'Listbots' => array( 'ਬੋਟਾਂ_ਦੀ_ਸੂਚੀ' ),
+ 'Listfiles' => array( 'ਫ਼ਾਈਲਾਂ_ਦੀ_ਸੂਚੀ' ),
+ 'Listgrouprights' => array( 'ਵਰਤੋਂਕਾਰ_ਹੱਕ_ਸੂਚੀ' ),
+ 'Listredirects' => array( 'ਰੀਡਿਰੈਕਟਾਂ_ਦੀ_ਸੂਚੀ' ),
+ 'Listusers' => array( 'ਵਰਤੋਂਕਾਰਾਂ_ਦੀ_ਸੂਚੀ' ),
+ 'Lockdb' => array( 'ਡੈਟਾਬੇਸ_’ਤੇ_ਤਾਲਾ_ਲਗਾਓ' ),
+ 'Log' => array( 'ਚਿੱਠਾ', 'ਚਿੱਠੇ' ),
+ 'Lonelypages' => array( 'ਇਕੱਲੇ_ਪੰਨੇ' ),
+ 'Longpages' => array( 'ਲੰਬੇ_ਪੰਨੇ' ),
+ 'MergeHistory' => array( 'ਰਲਾਉਣ_ਦਾ_ਅਤੀਤ' ),
+ 'MIMEsearch' => array( 'MIME_ਖੋਜੋ' ),
+ 'Mostcategories' => array( 'ਸਭ_ਤੋਂ_ਵੱਧ_ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚' ),
+ 'Mostimages' => array( 'ਸਭ_ਤੋਂ_ਵੱਧ_ਜà©à©œà©€à¨†à¨‚_ਫ਼ਾਈਲਾਂ' ),
+ 'Mostinterwikis' => array( 'ਸਭ_ਤੋਂ_ਵੱਧ_ਇੰਟਰਵਿਕੀ' ),
+ 'Mostlinked' => array( 'ਸਭ_ਤੋਂ_ਵੱਧ_ਜà©à©œà©‡_ਪੰਨੇ' ),
+ 'Mostlinkedcategories' => array( 'ਸਭ_ਤੋਂ_ਵੱਧ_ਜà©à©œà©€à¨†à¨‚_ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚' ),
+ 'Mostlinkedtemplates' => array( 'ਸਭ_ਤੋਂ_ਵੱਧ_ਜà©à©œà©‡_ਫਰਮੇ' ),
+ 'Mostrevisions' => array( 'ਸਭ_ਤੋਂ_ਵੱਧ_ਰੀਵਿਜ਼ਨ' ),
+ 'Movepage' => array( 'ਸਿਰਲੇਖ_ਬਦਲੋ' ),
+ 'Mycontributions' => array( 'ਮੇਰੇ_ਯੋਗਦਾਨ' ),
+ 'Mypage' => array( 'ਮੇਰਾ_ਪੰਨਾ' ),
+ 'Mytalk' => array( 'ਮੇਰੀ_ਚਰਚਾ' ),
+ 'Myuploads' => array( 'ਮੇਰੇ_ਅੱਪਲੋਡ' ),
+ 'Newimages' => array( 'ਨਵੀਆਂ_ਫ਼ਾਈਲਾਂ' ),
+ 'Newpages' => array( 'ਨਵੇਂ_ਪੰਨੇ' ),
+ 'PasswordReset' => array( 'ਪਾਸਵਰਡ_ਰੀਸੈੱਟ' ),
+ 'PermanentLink' => array( 'ਪੱਕਾ_ਲਿੰਕ' ),
+ 'Popularpages' => array( 'ਮਸ਼ਹੂਰ_ਪੰਨੇ' ),
+ 'Preferences' => array( 'ਪਸੰਦਾਂ' ),
+ 'Prefixindex' => array( 'ਅਗੇਤਰ_ਤਤਕਰਾ' ),
+ 'Protectedpages' => array( 'ਸà©à¨°à©±à¨–ਿਅਤ_ਪੰਨੇ' ),
+ 'Protectedtitles' => array( 'ਸà©à¨°à©±à¨–ਿਅਤ_ਸਿਰਲੇਖ' ),
+ 'Randompage' => array( 'ਰਲਵਾਂ_ਪੰਨਾ' ),
+ 'Randomredirect' => array( 'ਸà©à¨°à©±à¨–ਿਅਤ_ਰੀਡਿਰੈਕਟ' ),
+ 'Recentchanges' => array( 'ਹਾਲ_\'ਚ_ਹੋਈਆਂ_ਤਬਦੀਲੀਆਂ' ),
+ 'Recentchangeslinked' => array( 'ਜà©à©œà©€à¨†à¨‚_ਤਾਜ਼ਾ_ਤਬਦੀਲੀਆਂ' ),
+ 'Revisiondelete' => array( 'ਰੀਵਿਜਨ_ਮਿਟਾਓ' ),
+ 'Search' => array( 'ਖੋਜੋ' ),
+ 'Shortpages' => array( 'ਛੋਟੇ_ਪੰਨੇ' ),
+ 'Specialpages' => array( 'ਖਾਸ_ਪੰਨੇ' ),
+ 'Statistics' => array( 'ਅੰਕੜੇ' ),
+ 'Tags' => array( 'ਟੈਗ' ),
+ 'Unblock' => array( 'ਪਾਬੰਦੀ_ਹਟਾਓ' ),
+ 'Uncategorizedcategories' => array( 'ਸ਼à©à¨°à©‡à¨£à©€à¨¹à©€à¨£_ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚' ),
+ 'Uncategorizedimages' => array( 'ਸ਼à©à¨°à©‡à¨£à©€à¨¹à©€à¨£_ਫ਼ਾਈਲਾਂ' ),
+ 'Uncategorizedpages' => array( 'ਸ਼à©à¨°à©‡à¨£à©€à¨¹à©€à¨£_ਪੰਨੇ' ),
+ 'Uncategorizedtemplates' => array( 'ਸ਼à©à¨°à©‡à¨£à©€à¨¹à©€à¨£_ਸਾਂਚੇ' ),
+ 'Undelete' => array( 'ਅਣ-ਹਟਾਓਣ' ),
+ 'Unlockdb' => array( 'ਡੈਟਾਬੇਸ_ਖੋਲà©à¨¹à©‹' ),
+ 'Unusedcategories' => array( 'ਅਣਵਰਤੀਆਂ_ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚' ),
+ 'Unusedimages' => array( 'ਅਣਵਰਤੀਆਂ_ਫ਼ਾਈਲਾਂ' ),
+ 'Unusedtemplates' => array( 'ਅਣਵਰਤੇ_ਫਰਮੇ' ),
+ 'Unwatchedpages' => array( 'ਬੇ-ਨਿਗਰਾਨ_ਪੰਨੇ' ),
+ 'Upload' => array( 'ਅੱਪਲੋਡ' ),
+ 'Userlogin' => array( 'ਮੈਂਬਰ_ਲਾਗਇਨ' ),
+ 'Userlogout' => array( 'ਮੈਂਬਰ_ਲਾਗਆਊਟ' ),
+ 'Userrights' => array( 'ਮੈਂਬਰ_ਹੱਕ', 'ਪà©à¨°à¨¬à©°à¨§à¨•_ਬਣਾਓ', 'ਬੋਟ_ਬਣਾਓ' ),
+ 'Version' => array( 'ਰੂਪ' ),
+ 'Wantedcategories' => array( 'ਚਾਹੀਦੀਆਂ_ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚' ),
+ 'Wantedfiles' => array( 'ਚਾਹੀਦੀਆਂ_ਫ਼ਾਈਲਾਂ' ),
+ 'Wantedpages' => array( 'ਚਾਹੀਦੇ_ਪੰਨੇ', 'ਟà©à©±à¨Ÿà©‡_ਜੋੜ' ),
+ 'Wantedtemplates' => array( 'ਚਾਹੀਦੇ_ਫਰਮੇ' ),
+ 'Watchlist' => array( 'ਨਿਗਰਾਨੀ-ਲਿਸਟ' ),
+ 'Whatlinkshere' => array( 'ਕਿਹੜੇ_ਪੰਨੇ_ਇੱਥੇ_ਜੋੜਦੇ_ਹਨ' ),
+ 'Withoutinterwiki' => array( 'ਬਿਨਾਂ_ਇੰਟਰਵਿਕੀਆਂ_ਵਾਲੇ' ),
+);
+
+$magicWords = array(
+ 'redirect' => array( '0', '#ਰੀਡਿਰੈਕਟ', '#REDIRECT' ),
+ 'url_wiki' => array( '0', 'ਵਿਕੀ', 'WIKI' ),
+ 'defaultsort_noerror' => array( '0', 'ਗਲਤੀ_ਨਹੀਂ', 'noerror' ),
+ 'pagesincategory_all' => array( '0', 'ਸਬ', 'all' ),
+ 'pagesincategory_pages' => array( '0', 'ਪੰਨੇ', 'pages' ),
+ 'pagesincategory_subcats' => array( '0', 'ਉਪਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚', 'subcats' ),
+ 'pagesincategory_files' => array( '0', 'ਫ਼ਾਈਲਾਂ', 'files' ),
);
$digitTransformTable = array(
@@ -224,6 +328,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
'newwindow' => '(ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਖà©à©±à¨²à©à¨¹à¨¦à©€ ਹੈ)',
'cancel' => 'ਰੱਦ ਕਰੋ',
'moredotdotdot' => '...ਹੋਰ',
+'morenotlisted' => '....ਹੋਰ ਸੂਚੀਬੱਧ ਨਹੀਂ',
'mypage' => 'ਮੇਰਾ ਪੰਨਾ',
'mytalk' => 'ਚਰਚਾ',
'anontalk' => 'ਇਸ IP ਲਈ ਗੱਲ-ਬਾਤ',
@@ -235,7 +340,6 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
'qbbrowse' => 'à¨à¨²à¨•',
'qbedit' => 'ਸੰਪਾਦਨ',
'qbpageoptions' => 'ਇਹ ਪੰਨਾ',
-'qbpageinfo' => 'ਭਾਗ',
'qbmyoptions' => 'ਮੇਰੇ ਪੰਨੇ',
'qbspecialpages' => 'ਵਿਸ਼ੇਸ਼ ਪੰਨੇ',
'faq' => 'ਅਕਸਰ ਪà©à©±à¨›à©‡ ਜਾਣ ਵਾਲੇ ਪà©à¨°à¨¸à¨¼à¨¨',
@@ -258,6 +362,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
'namespaces' => 'ਨਾਮਸਥਾਨ',
'variants' => 'ਬਦਲ',
+'navigation-heading' => 'ਦਿਕਚਾਲਨ ਸੂਚੀ',
'errorpagetitle' => 'ਗਲਤੀ',
'returnto' => '$1 ’ਤੇ ਵਾਪਸ ਜਾਓ।',
'tagline' => '{{SITENAME}} ਤੋਂ',
@@ -483,9 +588,8 @@ $2',
You can continue to use {{SITENAME}} anonymously, or you can log in again as the same or as a different user.
Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-'welcomecreation' => '== ਜੀ ਆਇਆਂ ਨੂੰ, $1! ==
-
-ਤà©à¨¹à¨¾à¨¡à¨¾ ਖਾਤਾ ਬਣ ਚà©à©±à¨•à¨¾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦਾਂ]] ਬਦਲਣੀਆਂ ਨਾ ਭà©à©±à¨²à©‹à¥¤',
+'welcomeuser' => '$1 ਜੀ ਆਇਆਂ ਨੂੰ!',
+'welcomecreation-msg' => 'ਤà©à¨¹à¨¾à¨¡à¨¾ ਖਾਤਾ ਬਣ ਚà©à©±à¨•à¨¾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦ]] ਬਦਲਣੀ ਨਾ ਭà©à©±à¨²à©‹à¥¤',
'yourname' => 'ਯੂਜ਼ਰ-ਨਾਂ:',
'yourpassword' => 'ਪਾਸਵਰਡ:',
'yourpasswordagain' => 'ਪਾਸਵਰਡ ਮà©à©œ ਲਿਖੋ:',
@@ -507,7 +611,7 @@ Note that some pages may continue to be displayed as if you were still logged in
'gotaccount' => 'ਖਾਤਾ ਪਹਿਲਾਂ ਹੀ ਹੈ? $1',
'gotaccountlink' => 'ਲਾਗ ਇਨ',
'userlogin-resetlink' => 'ਆਪਣੀ ਲਾਗਇਨ ਜਾਣਕਾਰੀ ਭà©à©±à¨² ਗਠਹੋ?',
-'createaccountmail' => 'ਈ-ਮੇਲ ਜ਼ਰੀà¨',
+'createaccountmail' => 'ਆਰਜ਼ੀ ਰਲਵਾਂ ਪਾਸਵਰਡ ਵਰਤੋਂ ਅਤੇ ਇਸ ਨੂੰ ਹੇਠ ਦਿੱਤੇ ਈਮੇਲ ਸਿਰਨਾਵੇਂ ਉੱਤੇ ਭੇਜ ਦਿਉ',
'createaccountreason' => 'ਕਾਰਨ:',
'badretype' => 'ਤà©à¨¹à¨¾à¨¡à©‡ ਵਲੋਂ ਦਿੱਤੇ ਪਾਸਵਰਡ ਮਿਲਦੇ ਨਹੀਂ ਹਨ।',
'userexists' => 'ਇਹ ਮੈਂਬਰ-ਨਾਮ ਪਹਿਲਾਂ ਹੀ ਵਰਤੋਂ ’ਚ ਹੈ।
@@ -619,6 +723,7 @@ $2
'changeemail-oldemail' => 'ਮੌਜੂਦਾ ਈਮੇਲ ਸਿਰਨਾਵਾਂ:',
'changeemail-newemail' => 'ਨਵਾਂ ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ:',
'changeemail-none' => '(ਕੋਈ ਨਹੀਂ)',
+'changeemail-password' => 'ਤà©à¨¹à¨¾à¨¡à¨¾ {{SITENAME}} ਪਾਸਵਰਡ:',
'changeemail-submit' => 'ਈ-ਮੇਲ ਬਦਲੋ',
'changeemail-cancel' => 'ਰੱਦ ਕਰੋ',
@@ -744,7 +849,6 @@ sysop}}|administrator]] ਨਾਲ ਰਾਬਤਾ ਕਰ ਸਕਦੇ ਹੋ।
'template-semiprotected' => '(ਨੀਮ-ਸà©à¨°à©±à¨–ਿਅਤ)',
'hiddencategories' => 'ਇਹ ਪੰਨਾ {{PLURAL:$1|੧ ਲà©à¨•à¨µà©€à¨‚ ਸ਼à©à¨°à©‡à¨£à©€|
$1 ਲà©à¨•à¨µà©€à¨†à¨‚ ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚}} ਦਾ ਮੈਂਬਰ ਹੈ:',
-'nocreatetitle' => 'ਸਫ਼ਾ ਬਣਾਉਣ ਦੀ ਹੱਦ ਹੈ',
'nocreatetext' => '{{SITENAME}} ਨੇ ਨਵੇਂ ਸਫ਼ੇ ਬਣਾਉਣ ਤੇ ਰੋਕ ਲਾਈ ਹੋਈ ਹੈ।
ਤà©à¨¸à©€à¨‚ ਵਾਪਸ ਜਾ ਕੇ ਮੌਜੂਦਾ ਸਫ਼ੇ ਸੋਧ ਸਕਦੇ ਹੋ ਜਾਂ [[Special:UserLogin|ਲਾਗਇਨ ਜਾਂ ਖਾਤਾ ਬਣਾ]] ਸਕਦੇ ਹੋ।',
'nocreate-loggedin' => 'ਤà©à¨¹à¨¾à¨¨à©‚à©° ਨਵੇਂ ਸਫ਼ੇ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
@@ -765,6 +869,12 @@ $1 ਲà©à¨•à¨µà©€à¨†à¨‚ ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚}} ਦਾ ਮੈਂਬਰ à¨
'edit-already-exists' => 'ਨਵਾਂ ਸਫ਼ਾ ਨਹੀਂ ਬਣਾਇਆ ਜਾ ਸਕਿਆ।
ਇਹ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।',
+# Content models
+'content-model-wikitext' => 'ਵਿਕਿਟੈਕਸਟ',
+'content-model-text' => 'ਆਮ ਟੈਕਸਟ',
+'content-model-javascript' => 'ਜਾਵਾਸਕà©à¨°à¨¿à¨ªà¨Ÿ',
+'content-model-css' => 'ਸੀà¨à¨¸à¨à¨¸',
+
# Parser/template warnings
'post-expand-template-inclusion-warning' => "'''ਖਬਰਦਾਰ:''' ਸਾਂਚਾ ਦਾ ਅਕਾਰ ਬਹà©à¨¤ ਵੱਡਾ ਹੈ। ਕà©à¨ ਟੈਂਪਲੇਟ ਸ਼ਾਮਲ ਨਹੀਂ ਹੋਣਗੇ।",
'post-expand-template-inclusion-category' => 'ਓਹ ਪੰਨੇ ਜਿੱਥੇ ਟੈਂਪਲੇਟਾਂ ਦੇ ਸ਼ਾਮਲ ਕਰਨ ਦਾ ਅਕਾਰ ਹੱਦੋਂ ਵਧ ਗਿਆ ਹੈ',
@@ -1044,8 +1154,8 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
'prefs-emailconfirm-label' => 'ਈ-ਮੇਲ ਪà©à¨¸à¨¼à¨Ÿà©€:',
'prefs-textboxsize' => 'ਸੋਧ ਖਿੜਕੀ ਦਾ ਅਕਾਰ',
'youremail' => 'ਈ-ਮੇਲ:',
-'username' => 'ਯੂਜ਼ਰ ਨਾਂ:',
-'uid' => 'ਯੂਜ਼ਰ ID:',
+'username' => '{{GENDER:$1|ਯੂਜ਼ਰਨਾਂ}}:',
+'uid' => '{{GENDER:$1|User}} ਆਈਡੀ:',
'prefs-memberingroups' => '{{PLURAL:$1|ਗਰà©à©±à¨ª|ਗਰà©à©±à¨ªà¨¾à¨‚}} ਦਾ ਮੈਂਬਰ:',
'prefs-registration' => 'ਰਜਿਸਟਰੇਸ਼ਨ ਸਮਾਂ:',
'yourrealname' => 'ਅਸਲੀ ਨਾਮ:',
@@ -1137,11 +1247,13 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
'right-sendemail' => 'ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣਾ',
'right-passwordreset' => 'ਪਾਸਵਰਡ ਮà©à©œ-ਸੈੱਟ ਈਮੇਲ ਵੇਖੋ',
+# Special:Log/newusers
+'newuserlogpage' => 'ਬਣਾਠਖਾਤਿਆਂ ਦਾ ਚਿੱਠਾ',
+'newuserlogpagetext' => 'ਇਹ ਬਣੇ ਮੈਂਬਰਾਂ ਦਾ ਚਿੱਠਾ ਹੈ।',
+
# User rights log
'rightslog' => 'ਮੈਂਬਰ ਹੱਕਾਂ ਦਾ ਚਿੱਠਾ',
'rightslogtext' => 'ਇਹ ਮੈਂਬਰ ਹੱਕਾਂ ਵਿਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਦਾ ਚਿੱਠਾ ਹੈ।',
-'rightslogentry-autopromote' => '$2 ਤੋਂ ਆਪਣੇ ਆਪ $3 ਤੱਕ ਤਰੱਕੀ ਕਰੀ',
-'rightsnone' => '(ਕੋਈ ਨਹੀਂ)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ਇਹ ਪੰਨਾ ਪੜà©à¨¹à¨¨',
@@ -1417,6 +1529,8 @@ to upload files.',
'disambiguationspage' => 'Template:ਗà©à©°à¨à¨² ਖੋਲà©à¨¹',
+'pageswithprop-submit' => 'ਜਾਉ',
+
'doubleredirects' => 'ਦੋਹਰੇ ਰੀਡਿਰੈਕਟ',
'brokenredirectstext' => 'ਇਹ ਰਿਡਿਰੈਕਟ ਨਾ-ਮੌਜੂਦ ਸਫ਼ਿਆਂ ’ਤੇ ਜੋੜਦੇ ਹਨ:',
@@ -1534,10 +1648,6 @@ to upload files.',
'activeusers-hidesysops' => 'à¨à¨¡à¨®à¨¨à¨¿à¨¸à¨Ÿà©à¨°à©‡à¨Ÿà¨° ਲà©à¨•à¨¾à¨“',
'activeusers-noresult' => 'ਕੋਈ ਮੈਂਬਰ ਨਹੀਂ ਲੱਭਿਆ।',
-# Special:Log/newusers
-'newuserlogpage' => 'ਬਣਾਠਖਾਤਿਆਂ ਦਾ ਚਿੱਠਾ',
-'newuserlogpagetext' => 'ਇਹ ਬਣੇ ਮੈਂਬਰਾਂ ਦਾ ਚਿੱਠਾ ਹੈ।',
-
# Special:ListGroupRights
'listgrouprights-group' => 'ਗਰà©à©±à¨ª',
'listgrouprights-rights' => 'ਹੱਕ',
@@ -1607,13 +1717,12 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆà¨
'watching' => 'ਨਿਗà©à¨¹à¨¾ (ਵਾਚ) ਰੱਖੀ ਜਾ ਰਹੀ ਹੈ...',
'unwatching' => 'ਨਿਗà©à¨¹à¨¾ ਰੱਖਣੀ (ਵਾਚ) ਬੰਦ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..',
-'enotif_newpagetext' => 'ਇਹ ਨਵਾਂ ਪੇਜ ਹੈ।',
'enotif_impersonal_salutation' => '{{SITENAME}} ਯੂਜ਼ਰ',
-'changed' => 'ਬਦਲਿਆ',
-'created' => 'ਬਣਾਇਆ',
'enotif_lastvisited' => 'ਤà©à¨¹à¨¾à¨¡à©€ ਆਖ਼ਰੀ ਆਮਦ ਤੋਂ ਲੈ ਕੇ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਵੇਖਣ ਲਈ $1 ਵੇਖੋ।',
'enotif_lastdiff' => 'ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਵੇਖਣ ਲਈ $1 ਵੇਖੋ।',
'enotif_anon_editor' => 'ਅਗਿਆਤ ਯੂਜ਼ਰ $1',
+'created' => 'ਬਣਾਇਆ',
+'changed' => 'ਬਦਲਿਆ',
# Delete
'deletepage' => 'ਸਫ਼ਾ ਹਟਾਓ',
@@ -1720,7 +1829,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
'blanknamespace' => '(ਮà©à©±à¨–)',
# Contributions
-'contributions' => 'ਮੈਂਬਰ ਯੋਗਦਾਨ',
+'contributions' => '{{GENDER:$1|ਮੈਂਬਰ}} ਯੋਗਦਾਨ',
'contributions-title' => '$1 ਦੇ ਯੋਗਦਾਨ',
'mycontris' => 'ਯੋਗਦਾਨ',
'contribsub2' => '$1 ($2) ਲਈ',
@@ -2164,6 +2273,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
'logentry-newusers-newusers' => 'ਮੈਂਬਰ ਖਾਤਾ $1 ਬਣਾਇਆ ਗਿਆ',
'logentry-newusers-create' => 'ਵਰਤੋਂਕਾਰ ਖਾਤਾ $1 ਬਣਾਇਆ ਗਿਆ',
'logentry-newusers-create2' => 'ਵਰਤੋਂਕਾਰ ਖਾਤਾ $3 $1 ਦà©à¨†à¨°à¨¾ ਬਣਾਇਆ ਗਿਆ ਸੀ',
+'rightsnone' => '(ਕੋਈ ਨਹੀਂ)',
# Feedback
'feedback-subject' => 'ਵਿਸ਼ਾ:',
diff --git a/languages/messages/MessagesPag.php b/languages/messages/MessagesPag.php
index 8e1ffa63..c986956e 100644
--- a/languages/messages/MessagesPag.php
+++ b/languages/messages/MessagesPag.php
@@ -262,9 +262,8 @@ No labay mon ekalen may bolong diad listaan na babantayan, tapik mo labat so \"e
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'Babantayan...',
-'enotif_newpagetext' => 'Balo yan bolong.',
-'changed' => 'asalatan',
'created' => 'agawa',
+'changed' => 'asalatan',
# Delete
'deletepage' => 'Buralen so bolong',
diff --git a/languages/messages/MessagesPam.php b/languages/messages/MessagesPam.php
index bff77faf..5c5ba097 100644
--- a/languages/messages/MessagesPam.php
+++ b/languages/messages/MessagesPam.php
@@ -147,7 +147,6 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
'qbbrowse' => 'Bation (browse)',
'qbedit' => 'Mag-edit',
'qbpageoptions' => 'Ining bulung',
-'qbpageinfo' => 'Kontekstu/kabilian',
'qbmyoptions' => 'Deng kakung bulung',
'qbspecialpages' => 'Bulung a makabukud',
'faq' => 'Maralas a Kukutang (MAK)',
@@ -369,9 +368,6 @@ Iti ing binie nang sangkan: ''$2''.",
Malyari mung isundu ing pamangamit mu king {{SITENAME}} a e ka papakilala, o malyari kang mag login pasibayu anting pareu o aliwang talagamit.
Apansingan mung mapalyaring makalto la pa murin deng aliwang bulung a bala mu maka login ka pa murin, anggang e me lilinisan (clear) ing kekang browser cache.",
-'welcomecreation' => '== Malaus ka, $1! ==
-
-Melalang ne ing kekang account. E mo kakalingwan alilan deng kekang piniling {{SITENAME}}',
'yourname' => 'Lagyung talagamit (Username):',
'yourpassword' => 'Kekang password:',
'yourpasswordagain' => 'Pakisulat meng pasibayu ing password:',
@@ -604,7 +600,6 @@ Maliari meng i-\"cut-n-paste\" ing sinulat mu king metung a text file, at i-save
'template-protected' => '(protektadu)',
'template-semiprotected' => '(maki dakeng protektadu)',
'hiddencategories' => 'Kayabe ya ing bulung a ini king/karing {{PLURAL:$1|1 makasalikut a kategoriya|$1 makasalikut a kategoriya}}:',
-'nocreatetitle' => 'Maki angganan (limitadu) ing pamangawang bulung',
'nocreatetext' => 'Lilimitan ning {{SITENAME}} ing pamangawa kareng bayung bulung.
Malyari kang magbalik at mag-edit king bulung a atyu na, o makapag[[Special:UserLogin|log in ka at maglalang account]].',
'nocreate-loggedin' => 'Ala kang paintulut a maglalang bayung bulung king {{SITENAME}}.',
@@ -955,11 +950,12 @@ Nung ibie me, magamit ya bang kilalanan ing kekang ambag.',
'right-userrights-interwiki' => 'I-edit la reng katulirang talagamit (user rights) da reng talagamit kareng aliwang karinan a wiki',
'right-siteadmin' => 'Isara ya ampong ibusni ing database',
+# Special:Log/newusers
+'newuserlogpage' => "Tala ning pamaglalang talagamit (''User creation log'')",
+
# User rights log
'rightslog' => 'Tala da reng katulirang talagamit (user rights log)',
'rightslogtext' => 'Ini tala de reng miyalilan king katulirang talagamit (user rights).',
-'rightslogentry' => 'miyalilan ya ing grupu nung nu ya kayanib i $1 manibat king $2 paras king $3',
-'rightsnone' => '(ala)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'i-edit/alilan ya ing bulung a ini',
@@ -1327,9 +1323,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'Pakit',
'listusers-noresult' => 'Alang meyakit a talagamit.',
-# Special:Log/newusers
-'newuserlogpage' => "Tala ning pamaglalang talagamit (''User creation log'')",
-
# Special:ListGroupRights
'listgrouprights' => 'Katuliran da reng grupung talagamit (user group rights)',
'listgrouprights-summary' => 'Ing makatuki tala (list) de reng grupung talagamit a mituldu kening wiki, ampo reng karelang katuliran king pamaglub (access rights). Ating karagdagang impormasiun tungkul king katuliran ning balang metung [[{{MediaWiki:Listgrouprights-helppage}}|keni]].',
@@ -1395,11 +1388,7 @@ click me ing \"Tuknangan ing pamagbante\" (Unwatch) king gilid na ning bulung.",
'unwatching' => 'E ne babanten...',
'enotif_reset' => 'Dinan lang tanda deng eganaganang bulung a pintalan mu',
-'enotif_newpagetext' => 'Bayu yang bulung ini.',
'enotif_impersonal_salutation' => 'talagamit king {{SITENAME}}',
-'changed' => 'miyalilan',
-'created' => 'melalang',
-'enotif_subject' => 'Ining bulung ning {{SITENAME}} a $PAGETITLE me$CHANGEDORCREATED ya kapamilatan nang $PAGEEDITOR',
'enotif_lastvisited' => 'Lon me ing $1 para kareng eganaganang miyalilan
manibat anyang tawli kang linabas.',
'enotif_lastdiff' => 'Lon me ing $1 ba meng akit ining miyalilan.',
@@ -1427,6 +1416,8 @@ Ba mong ayalilan deng pakatuldu king kekang tala ring babanten (watchlist settin
Keni ka magparalang puna/komentu at maniad karagdagang saup:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'melalang',
+'changed' => 'miyalilan',
# Delete
'deletepage' => 'Buran ya ing bulung',
@@ -2354,5 +2345,6 @@ Mayari/mapasu ya ining confirmation code keng $4.',
# New logging system
'revdelete-restricted' => 'ipairal la reng limitasiun kareng sysop',
'revdelete-unrestricted' => 'ilako la reng makabawal kareng sysops',
+'rightsnone' => '(ala)',
);
diff --git a/languages/messages/MessagesPap.php b/languages/messages/MessagesPap.php
index 11de8e8c..2c6f751c 100644
--- a/languages/messages/MessagesPap.php
+++ b/languages/messages/MessagesPap.php
@@ -164,9 +164,6 @@ Bo por haña un lista di tur [[Special:SpecialPages|{{int:specialpages}}]].',
'viewsource' => 'Wak fuente',
# Login and logout pages
-'welcomecreation' => '== Bon bini, $1! ==
-Bo kuenta ta trahá.
-No lubidá di kambia bo [[Special:Preferences|{{SITENAME}} preferensianan]].',
'yourname' => 'Nòmber di uzadó',
'yourpassword' => 'Kontraseña',
'yourpasswordagain' => 'Hinka kontraseña atrobe',
@@ -309,8 +306,8 @@ Si despues bo ke kita e página for di bo lista di observashon, primi \"Stop di
'watchlistcontains' => 'Bo lista di observashon tin $1 {{PLURAL:$1|página|páginanan}}.',
'wlshowlast' => 'Mustra último $1 oranan $2 dianan $3',
-'changed' => 'kambiá',
'created' => 'trahá',
+'changed' => 'kambiá',
# Delete
'confirm' => 'Konfirmá',
diff --git a/languages/messages/MessagesPcd.php b/languages/messages/MessagesPcd.php
index 4ecfa229..46dc98f9 100644
--- a/languages/messages/MessagesPcd.php
+++ b/languages/messages/MessagesPcd.php
@@ -140,7 +140,6 @@ $messages = array(
'qbbrowse' => 'Trifouille',
'qbedit' => 'Editer',
'qbpageoptions' => 'Chol pache-lo',
-'qbpageinfo' => 'Conteske',
'qbmyoptions' => 'Mes paches',
'qbspecialpages' => 'Espéciales paches',
'faq' => 'FAQ',
@@ -315,10 +314,6 @@ Si s'n'est poin ch'cas-lo, pététe éq ch'est un bogue din ch'businkillache. <b
'virus-unknownscanner' => 'intivirus poin connu:',
# Login and logout pages
-'welcomecreation' => "== Binv'nute, $1 ! ==
-
-Vote compte o té créé.
-N'obliez poin d'parsonnaliser vos [[Special:Preferences|préférinches édseur {{SITENAME}}]].",
'yourname' => "nom d'uzeu:",
'yourpassword' => "Mot d'passe:",
'yourpasswordagain' => "Intrer à nouvieu ch'mot d'passe:",
@@ -530,7 +525,7 @@ Léginde : ({{MediaWiki:Cur}}) = différinches aveuc el vérchon à ch'momint-ch
'youremail' => 'Imèle:',
'username' => "Nom d'uzeu:",
'uid' => 'ID dech uzeu:',
-'prefs-memberingroups' => 'Mimbe éd {{PLURAL:$1|groupe|groupes}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Mimbe}} {{PLURAL:$1|du groupe|des groupes}}:',
'yourrealname' => 'Vrai nom:',
'yourlanguage' => 'Langache:',
'badsiglength' => 'Vote signature est gramint longue.
@@ -556,6 +551,9 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
'grouppage-sysop' => '{{ns:project}}:Aménistrateus',
+# Special:Log/newusers
+'newuserlogpage' => "Jornal éd chés créachons d'comptes d'uzeu",
+
# User rights log
'rightslog' => "Jornal d'chés droés dechl uzeu",
@@ -753,9 +751,6 @@ Vir l'pache [$2 édseur Commons].",
# Special:ActiveUsers
'activeusers' => 'Lisse des ouvreus uzeus',
-# Special:Log/newusers
-'newuserlogpage' => "Jornal éd chés créachons d'comptes d'uzeu",
-
# Special:ListGroupRights
'listgrouprights-summary' => "L'pache-lo ch'est ène lisse d'chés groupes d'uzeus définis édseur ech wiki aveuc chés drouots d'intrèe achuchonnés.<br />I put y avoèr ichi d'eutes [[MediaWiki:Listgrouprights-helppage|informacions]] édseur chés drouots individuèls. ([[{{MediaWiki:Listgrouprights-helppage}}|vir]])",
'listgrouprights-members' => '(lisse éd chés mimbes)',
@@ -994,6 +989,9 @@ Os pouvez vir l'source",
'tooltip-preferences-save' => 'Warder chés préférinches.',
'tooltip-summary' => 'Intrer un tiot résumè',
+# Info page
+'pageinfo-toolboxlink' => "Informacions édseur l'page",
+
# Browsing diffs
'previousdiff' => '↠Pu vieille édition',
'nextdiff' => 'Nouvèle édichon →',
diff --git a/languages/messages/MessagesPdc.php b/languages/messages/MessagesPdc.php
index 0e2ba33a..4c7ae01b 100644
--- a/languages/messages/MessagesPdc.php
+++ b/languages/messages/MessagesPdc.php
@@ -147,7 +147,6 @@ $messages = array(
'qbfind' => 'Finne',
'qbedit' => 'Ennere',
'qbpageoptions' => 'Des Blatt',
-'qbpageinfo' => 'Daade vun dem Blatt',
'qbmyoptions' => 'Mei Bledder',
'qbspecialpages' => 'Besunnere Bledder',
'faq' => 'FAQ',
@@ -488,8 +487,8 @@ Paesswatt fer nau: $2',
'right-writeapi' => 'Yuus vun write API',
'right-delete' => 'Bledder lesche',
-# User rights log
-'rightsnone' => '(ken)',
+# Special:Log/newusers
+'newuserlogpage' => 'Logbuch vun neie Yuuser',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'es Blatt zu lese',
@@ -669,9 +668,6 @@ Paesswatt fer nau: $2',
'activeusers-hidebots' => 'Waddefresser verschwinne losse',
'activeusers-hidesysops' => 'Verwalter verschwinne losse',
-# Special:Log/newusers
-'newuserlogpage' => 'Logbuch vun neie Yuuser',
-
# Special:ListGroupRights
'listgrouprights' => 'Rechte vun Yuuser-Druppe',
'listgrouprights-group' => 'Druppe',
@@ -707,7 +703,6 @@ Paesswatt fer nau: $2',
'watching' => 'Watsche…',
'unwatching' => 'Nimmi watsche...',
-'enotif_newpagetext' => 'Sell iss en neies Blatt.',
'enotif_impersonal_salutation' => '{{SITENAME}}-Yuuser',
'changed' => 'gennert',
@@ -1015,6 +1010,9 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
'htmlform-reset' => 'Enneringe losmache',
'htmlform-selectorother-other' => 'Annere',
+# New logging system
+'rightsnone' => '(ken)',
+
# Feedback
'feedback-message' => 'Melding:',
diff --git a/languages/messages/MessagesPfl.php b/languages/messages/MessagesPfl.php
index 6901c661..dd6e13d7 100644
--- a/languages/messages/MessagesPfl.php
+++ b/languages/messages/MessagesPfl.php
@@ -16,6 +16,44 @@
$fallback = 'de';
+$namespaceNames = array(
+ NS_MEDIA => 'Medium',
+ NS_SPECIAL => 'Schbezial',
+ NS_TALK => 'Babble',
+ NS_USER => 'Benudzer',
+ NS_USER_TALK => 'Benudzer_Dischbediere',
+ NS_PROJECT_TALK => '$1_Dischbediere',
+ NS_FILE => 'Dadai',
+ NS_FILE_TALK => 'Dadai_Dischbediere',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWiki_Dischbediere',
+ NS_TEMPLATE => 'Vorlach',
+ NS_TEMPLATE_TALK => 'Vorlach_Dischbediere',
+ NS_HELP => 'Hilf',
+ NS_HELP_TALK => 'Hilf_Dischbediere',
+ NS_CATEGORY => 'Kadegorie',
+ NS_CATEGORY_TALK => 'Kadegorie_Dischbediere',
+);
+
+$namespaceAliases = array(
+ # German namespaces
+ 'Medium' => NS_MEDIA,
+ 'Spezial' => NS_SPECIAL,
+ 'Diskussion' => NS_TALK,
+ 'Benutzer' => NS_USER,
+ 'Benutzer_Diskussion' => NS_USER_TALK,
+ '$1_Diskussion' => NS_PROJECT_TALK,
+ 'Datei' => NS_FILE,
+ 'Datei_Diskussion' => NS_FILE_TALK,
+ 'MediaWiki_Diskussion' => NS_MEDIAWIKI_TALK,
+ 'Vorlage' => NS_TEMPLATE,
+ 'Vorlage_Diskussion' => NS_TEMPLATE_TALK,
+ 'Hilfe' => NS_HELP,
+ 'Hilfe_Diskussion' => NS_HELP_TALK,
+ 'Kategorie' => NS_CATEGORY,
+ 'Kategorie_Diskussion' => NS_CATEGORY_TALK,
+);
+
$messages = array(
# User preference toggles
'tog-showtoolbar' => "Werkzaich zum Bearwaide zaische (dodezu brauchd's JavaScript)",
@@ -386,9 +424,11 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
'grouppage-sysop' => '{{ns:project}}:Adminischtratore',
+# Special:Log/newusers
+'newuserlogpage' => 'Naiaameldungs-Logbuch',
+
# User rights log
'rightslog' => 'Benutzerrecht-Logbuch',
-'rightsnone' => '(-)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'die Said bearwaide',
@@ -508,9 +548,6 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
# Special:LinkSearch
'linksearch' => 'Externe Links',
-# Special:Log/newusers
-'newuserlogpage' => 'Naiaameldungs-Logbuch',
-
# Special:ListGroupRights
'listgrouprights-members' => '(Midgliederlischd)',
@@ -597,7 +634,7 @@ Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uf
'blanknamespace' => '(Haaptsaid)',
# Contributions
-'contributions' => 'Was der gemacht hot',
+'contributions' => '{{GENDER:$1|Wasa gemachd hod}}',
'contributions-title' => 'Benutzerbaidräch vun $1',
'mycontris' => 'Baidräsch',
'contribsub2' => 'Fer $1 ($2)',
@@ -821,6 +858,9 @@ Annere Medadaade sinn noamalawais verschdegld.
# Special:Tags
'tags-edit' => 'bearwaide',
+# New logging system
+'rightsnone' => '(-)',
+
# Feedback
'feedback-close' => 'Erledischd',
diff --git a/languages/messages/MessagesPl.php b/languages/messages/MessagesPl.php
index 7b1d3d0f..224004b3 100644
--- a/languages/messages/MessagesPl.php
+++ b/languages/messages/MessagesPl.php
@@ -35,6 +35,7 @@
* @author Mikołka
* @author Nux
* @author Odder
+ * @author Odie2
* @author Olgak85
* @author Przemub
* @author Reedy
@@ -157,6 +158,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'Wyszukiwanie_MIME' ),
'Mostcategories' => array( 'Najwięcej_kategorii' ),
'Mostimages' => array( 'Najczęściej_linkowane_pliki' ),
+ 'Mostinterwikis' => array( 'Najwięcej_interwiki' ),
'Mostlinked' => array( 'Najczęściej_linkowane' ),
'Mostlinkedcategories' => array( 'Najczęściej_linkowane_kategorie' ),
'Mostlinkedtemplates' => array( 'Najczęściej_linkowane_szablony' ),
@@ -178,9 +180,8 @@ $specialPageAliases = array(
'Randompage' => array( 'Losowa_strona', 'Losowa' ),
'Randomredirect' => array( 'Losowe_przekierowanie' ),
'Recentchanges' => array( 'Ostatnie_zmiany', 'OZ' ),
- 'Recentchangeslinked' => array( 'Zmiany_w_linkujÄ…cych' ),
+ 'Recentchangeslinked' => array( 'Zmiany_w_linkowanych', 'Zmiany_w_linkujÄ…cych' ),
'Revisiondelete' => array( 'Usuń_wersję' ),
- 'RevisionMove' => array( 'Przenoszenie_wersji' ),
'Search' => array( 'Szukaj' ),
'Shortpages' => array( 'Najkrótsze_strony' ),
'Specialpages' => array( 'Strony_specjalne' ),
@@ -216,10 +217,9 @@ $magicWords = array(
'redirect' => array( '0', '#PATRZ', '#PRZEKIERUJ', '#TAM', '#REDIRECT' ),
'notoc' => array( '0', '__BEZSPISU__', '__NOTOC__' ),
'nogallery' => array( '0', '__BEZGALERII__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__ZESPISEM__', '__FORCETOC__' ),
+ 'forcetoc' => array( '0', '__ZESPISEM__', '__WYMUÅšSPIS__', '__FORCETOC__' ),
'toc' => array( '0', '__SPIS__', '__TOC__' ),
'noeditsection' => array( '0', '__BEZEDYCJISEKCJI__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__BEZNAGÅÓWKA__', '__NOHEADER__' ),
'currentday' => array( '1', 'AKTUALNYDZIEŃ', 'CURRENTDAY' ),
'currentdayname' => array( '1', 'NAZWADNIA', 'CURRENTDAYNAME' ),
'currentyear' => array( '1', 'AKTUALNYROK', 'CURRENTYEAR' ),
@@ -434,6 +434,7 @@ $messages = array(
'newwindow' => '(otwiera siÄ™ w nowym oknie)',
'cancel' => 'Anuluj',
'moredotdotdot' => 'Więcej...',
+'morenotlisted' => 'I inne...',
'mypage' => 'Strona',
'mytalk' => 'Dyskusja',
'anontalk' => 'Dyskusja tego IP',
@@ -445,7 +446,6 @@ $messages = array(
'qbbrowse' => 'PrzeglÄ…danie',
'qbedit' => 'Edycja',
'qbpageoptions' => 'Ta strona',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => 'Moje strony',
'qbspecialpages' => 'strony specjalne',
'faq' => 'FAQ',
@@ -468,6 +468,7 @@ $messages = array(
'namespaces' => 'Przestrzenie nazw',
'variants' => 'Warianty',
+'navigation-heading' => 'Menu nawigacyjne',
'errorpagetitle' => 'BÅ‚Ä…d',
'returnto' => 'Wróć do strony $1.',
'tagline' => 'Z {{GRAMMAR:D.lp|{{SITENAME}}}}',
@@ -709,11 +710,11 @@ Administrator blokujący go podał następujący powód "\'\'$3\'\'".',
# Login and logout pages
'logouttext' => "'''Nie jesteś już zalogowany.'''
-Możesz kontynuować pracę w {{GRAMMAR:MS.lp|{{SITENAME}}}} jako niezarejestrowany użytkownik albo [[Special:UserLogin|zalogować się ponownie]] jako ten sam lub inny użytkownik.
+Możesz kontynuować pracę w {{GRAMMAR:MS.lp|{{SITENAME}}}} jako niezarejestrowany użytkownik albo <span class='plainlinks'>[$1 zalogować się ponownie]</span> jako ten sam lub inny użytkownik.
Zauważ, że do momentu wyczyszczenia pamięci podręcznej przeglądarki niektóre strony mogą wyglądać tak, jakbyś wciąż był zalogowany.",
-'welcomecreation' => '== Witaj, $1! ==
-Twoje konto zostało utworzone.
-Nie zapomnij dostosować [[Special:Preferences|preferencji dla {{GRAMMAR:D.lp|{{SITENAME}}}}]].',
+'welcomeuser' => 'Witaj, $1!',
+'welcomecreation-msg' => 'Twoje konto zostało utworzone.
+Nie zapomnij dostosować [[Special:Preferences|preferencji]].',
'yourname' => 'Nazwa {{GENDER:|użytkownika|użytkowniczki}}',
'yourpassword' => 'Hasło',
'yourpasswordagain' => 'Powtórz hasło',
@@ -736,7 +737,7 @@ Nie zapomnij dostosować [[Special:Preferences|preferencji dla {{GRAMMAR:D.lp|{{
'gotaccount' => "Masz już konto? '''$1'''.",
'gotaccountlink' => 'Zaloguj siÄ™',
'userlogin-resetlink' => 'Zapomniałeś danych do zalogowania się?',
-'createaccountmail' => 'poprzez eâ€mail',
+'createaccountmail' => 'Użyj tymczasowego hasła wygenerowanego losowo i wyślij je na podany poniżej adres e-mail',
'createaccountreason' => 'Powód',
'badretype' => 'Wprowadzone hasła różnią się między sobą.',
'userexists' => 'Wybrana przez Ciebie nazwa użytkownika jest już zajęta.
@@ -814,6 +815,7 @@ Odczekaj chwilę zanim ponowisz próbę.',
# Email sending
'php-mail-error-unknown' => 'Wystąpił nieznany błąd w funkcji PHP mail()',
'user-mail-no-addy' => 'Próba wysÅ‚ania eâ€maila bez adresu odbiorcy',
+'user-mail-no-body' => 'Próbowano wysłać e-mail o psutej lub krótkiej treści.',
# Change password dialog
'resetpass' => 'Zmień hasło',
@@ -872,6 +874,7 @@ Tymczasowe hasło – $2',
'changeemail-oldemail' => 'Obecny adres eâ€mail',
'changeemail-newemail' => 'Nowy adres e-mail',
'changeemail-none' => '(brak)',
+'changeemail-password' => 'Hasło {{SITENAME}}:',
'changeemail-submit' => 'Zapisz nowy',
'changeemail-cancel' => 'Anuluj',
@@ -1056,7 +1059,6 @@ Ostatni wpis z rejestru jest pokazany poniżej.",
'template-semiprotected' => '(częściowo zabezpieczony)',
'hiddencategories' => 'Ta strona jest w {{PLURAL:$1|jednej ukrytej kategorii|$1 ukrytych kategoriach}}:',
'edittools' => '<!-- Znajdujący się tutaj tekst zostanie pokazany pod polem edycji i formularzem przesyłania plików. -->',
-'nocreatetitle' => 'Ograniczono możliwość tworzenia nowych stron',
'nocreatetext' => 'W {{GRAMMAR:MS.lp|{{SITENAME}}}} ograniczono możliwość tworzenia nowych stron.
Możesz edytować istniejące strony bądź też [[Special:UserLogin|zalogować się lub utworzyć konto]].',
'nocreate-loggedin' => 'Nie masz uprawnień do tworzenia nowych stron.',
@@ -1081,6 +1083,15 @@ Zdaje się, że została skasowana.',
'edit-already-exists' => 'Nie udało się stworzyć nowej strony.
Strona już istnieje.',
'defaultmessagetext' => 'Domyślny tekst komunikatu',
+'content-failed-to-parse' => 'Format zawartości typu $2 (dla modelu: $1) nieprawidłowy: $3',
+'invalid-content-data' => 'Zawartość strony zawiera nieprawidłowe dane',
+'content-not-allowed-here' => 'Zawartość tego typu ($1) nie jest dozwolona na stronie [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'zwykły tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Uwaga! Ta strona zawiera zbyt wiele wywołań złożonych obliczeniowo funkcji parsera.
@@ -1445,9 +1456,9 @@ Tej operacji nie można później cofnąć.',
'prefs-emailconfirm-label' => 'Potwierdzenie adresu eâ€mail',
'prefs-textboxsize' => 'Rozmiar okna edycji',
'youremail' => 'Twój adres eâ€mail',
-'username' => 'Nazwa użytkownika',
-'uid' => 'ID użytkownika',
-'prefs-memberingroups' => 'Należy do {{PLURAL:$1|grupy|grup}}',
+'username' => '{{GENDER:$1|Nazwa użytkownika}}:',
+'uid' => '{{GENDER:$1|Identyfikator użytkownika}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Członek}} {{PLURAL:$1|grupy|grup}}:',
'prefs-registration' => 'Data rejestracji',
'yourrealname' => 'ImiÄ™ i nazwisko',
'yourlanguage' => 'Język interfejsu',
@@ -1596,12 +1607,13 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
'right-sendemail' => 'WysyÅ‚anie eâ€maili do innych użytkowników',
'right-passwordreset' => 'Sprawdzanie treÅ›ci eâ€maila o resetowaniu hasÅ‚a',
+# Special:Log/newusers
+'newuserlogpage' => 'Nowi użytkownicy',
+'newuserlogpagetext' => 'To jest rejestr ostatnio utworzonych kont użytkowników',
+
# User rights log
'rightslog' => 'Uprawnienia',
'rightslogtext' => 'Rejestr zmian uprawnień użytkowników.',
-'rightslogentry' => '{{GENDER:$2|zmienił|zmieniła}} przynależność $1 do grup ($2 → $3)',
-'rightslogentry-autopromote' => 'automatycznie zmienił przynależność ($2 → $3)',
-'rightsnone' => 'brak',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'przeglÄ…dania tej strony',
@@ -1847,6 +1859,7 @@ Jeśli problem będzie się powtarzał, skontaktuj się z [[Special:ListUsers/sy
'backend-fail-notsame' => 'Plik o podobnej nazwie już istnieje w $1.',
'backend-fail-invalidpath' => '$1nie jest poprawną ścieżką zapisu.',
'backend-fail-delete' => 'Nie można usunąć pliku $1.',
+'backend-fail-describe' => 'Nie udało się zmienić metadanych pliku "$1".',
'backend-fail-alreadyexists' => 'Plik „$1†już istnieje',
'backend-fail-store' => 'Nie może zapisać pliku $1 w $2 .',
'backend-fail-copy' => 'Nie może skopiować pliku $1 do $2.',
@@ -2083,6 +2096,12 @@ Sprawdź inne linki do szablonów, zanim usuniesz tę stronę.',
a powinny odwoływać się bezpośrednio do stron treści.<br />
Strona uznawana jest za ujednoznaczniającą, jeśli zawiera szablon linkowany przez stronę [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => 'Strony z właściwościami',
+'pageswithprop-legend' => 'Strony z właściwościami',
+'pageswithprop-text' => 'Ta strona zawiera listę stron korzystających z właściwości.',
+'pageswithprop-prop' => 'Nazwa właściwości:',
+'pageswithprop-submit' => 'Pokaż',
+
'doubleredirects' => 'Podwójne przekierowania',
'doubleredirectstext' => 'Lista zawiera strony z przekierowaniami do stron, które przekierowują do innej strony.
Każ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.
@@ -2235,7 +2254,7 @@ Zobacz również [[Special:WantedCategories|brakujące kategorie]].',
'linksearch-ok' => 'Szukaj',
'linksearch-text' => 'Można użyć symboli wieloznacznych jak „*.wikipedia.orgâ€.
Wymaga podania co najmniej domeny najwyższego poziomu np. „*.orgâ€.<br />
-Obsługiwane protokoły: <code>$1</code> (jeśli nie podano, domyślny to http://).',
+{{PLURAL:$2|Obsługiwany protokół|Obsługiwane protokoły}}: <code>$1</code> (jeśli nie podano, domyślny to http://).',
'linksearch-line' => '$1 link na stronie $2',
'linksearch-error' => 'Symbolu wieloznacznego można użyć wyłącznie na początku nazwy hosta.',
@@ -2254,10 +2273,6 @@ Obsługiwane protokoły: <code>$1</code> (jeśli nie podano, domyślny to http:/
'activeusers-hidesysops' => 'Ukryj administratorów',
'activeusers-noresult' => 'Nie odnaleziono żadnego użytkownika.',
-# Special:Log/newusers
-'newuserlogpage' => 'Nowi użytkownicy',
-'newuserlogpagetext' => 'To jest rejestr ostatnio utworzonych kont użytkowników',
-
# Special:ListGroupRights
'listgrouprights' => 'Uprawnienia grup użytkowników',
'listgrouprights-summary' => 'Poniżej znajduje się spis zdefiniowanych na tej wiki grup użytkowników, z wyszczególnieniem przydzielonych im uprawnień.
@@ -2352,19 +2367,23 @@ Każda zmiana treści tej strony lub związanej z nią strony dyskusji zostanie
'enotif_mailer' => 'Powiadomienie z {{GRAMMAR:D.lp|{{SITENAME}}}}',
'enotif_reset' => 'Zaznacz wszystkie strony jako odwiedzone',
-'enotif_newpagetext' => 'To jest nowa strona.',
'enotif_impersonal_salutation' => 'użytkownik {{GRAMMAR:D.lp|{{SITENAME}}}}',
-'changed' => 'zmieniona',
-'created' => 'utworzona',
-'enotif_subject' => 'Strona $PAGETITLE w {{GRAMMAR:MS.lp|{{SITENAME}}}} została $CHANGEDORCREATED przez użytkownika $PAGEEDITOR',
+'enotif_subject_deleted' => 'Strona projektu {{SITENAME}} o nazwie $1 została usunięta przez {{gender:$2|$2}}',
+'enotif_subject_created' => 'Strona projektu {{SITENAME}} o nazwie $1 została stworzona przez {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Strona projektu {{SITENAME}} o nazwie $1 została przeniesiona przez {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Strona projektu {{SITENAME}} o nazwie $1 została przywrócona przez {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Strona projektu {{SITENAME}} o nazwie $1 została zmieniona przez {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Strona projektu {{SITENAME}} o nazwie $1 została usunięta $PAGEEDITDATE przez {{gender:$2|$2}}, zobacz: $3',
+'enotif_body_intro_created' => 'Strona projektu {{SITENAME}} o nazwie $1 została stworzona $PAGEEDITDATE przez {{gender:$2|$2}}, zobacz aktualną wersję na: $3',
+'enotif_body_intro_moved' => 'Strona projektu {{SITENAME}} o nazwie $1 została przeniesiona $PAGEEDITDATE przez {{gender:$2|$2}}, zobacz aktualną wersję na: $3',
+'enotif_body_intro_restored' => 'Strona projektu {{SITENAME}} o nazwie $1 została przywrócona $PAGEEDITDATE przez {{gender:$2|$2}}, zobacz aktualną wersję na: $3',
+'enotif_body_intro_changed' => 'Strona projektu {{SITENAME}} o nazwie $1 została zmieniona $PAGEEDITDATE przez {{gender:$2|$2}}, zobacz aktualną wersję na: $3',
'enotif_lastvisited' => 'Zobacz na stronie $1 wszystkie zmiany od Twojej ostatniej wizyty.',
'enotif_lastdiff' => 'Zobacz na stronie $1 tÄ™ zmianÄ™.',
'enotif_anon_editor' => 'użytkownik anonimowy $1',
'enotif_body' => 'Szanowny $WATCHINGUSERNAME,
-strona $PAGETITLE w {{GRAMMAR:MS.lp|{{SITENAME}}}} została $CHANGEDORCREATED $PAGEEDITDATE przez użytkownika $PAGEEDITOR. Zobacz na stronie $PAGETITLE_URL aktualną wersję.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Opis zmiany: $PAGESUMMARY $PAGEMINOREDIT
@@ -2372,8 +2391,7 @@ Kontakt do autora:
mail – $PAGEEDITOR_EMAIL
wiki – $PAGEEDITOR_WIKI
-W przypadku kolejnych zmian nowe powiadomienia nie zostaną wysłane, dopóki nie odwiedzisz tej strony.
-Możesz także zresetować wszystkie flagi powiadomień na swojej liście stron obserwowanych.
+W przypadku kolejnych zmian nowe powiadomienia nie zostaną wysłane, dopóki nie odwiedzisz tej strony. Możesz także zresetować wszystkie flagi powiadomień na swojej liście stron obserwowanych.
Wiadomość z systemu powiadomień {{GRAMMAR:D.lp|{{SITENAME}}}}
@@ -2386,6 +2404,8 @@ $UNWATCHURL
Pomoc
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'utworzona',
+'changed' => 'zmieniona',
# Delete
'deletepage' => 'Usuń stronę',
@@ -2457,6 +2477,8 @@ Wszystkie aktywne zabezpieczenia odnajdziesz na liście [[Special:ProtectedPages
'prot_1movedto2' => 'stronę [[$1]] przeniósł do [[$2]]',
'protect-badnamespace-title' => 'Przestrzeń nazw, w której nie można zabezpieczać stron',
'protect-badnamespace-text' => 'Stron w tej przestrzeni nazw nie można zabezpieczać.',
+'protect-norestrictiontypes-text' => 'Ta strona nie może być chroniona, gdyż nie ma dla niej żadnych dostępnych typów ograniczeń.',
+'protect-norestrictiontypes-title' => 'Nieblokowalna strona',
'protect-legend' => 'Potwierdź zabezpieczenie',
'protectcomment' => 'Powód',
'protectexpiry' => 'Czas wygaśnięcia',
@@ -2539,8 +2561,8 @@ Możesz mieć zły link lub wersja mogła zostać odtworzona lub usunięta z arc
'undeletedrevisions' => 'odtworzono {{PLURAL:$1|1 wersjÄ™|$1 wersje|$1 wersji}}',
'undeletedrevisions-files' => 'odtworzono $1 {{PLURAL:$1|wersję|wersje|wersji}} i $2 {{PLURAL:$2|plik|pliki|plików}}',
'undeletedfiles' => 'odtworzył $1 {{PLURAL:$1|plik|pliki|plików}}',
-'cannotundelete' => 'Odtworzenie nie powiodło się.
-Ktoś inny prawdopodobnie odtworzył już tę stronę.',
+'cannotundelete' => 'Odtworzenie nie powiodło się:
+$1',
'undeletedpage' => "'''Odtworzono stronÄ™ $1.'''
Zobacz [[Special:Log/delete|rejestr usunięć]], jeśli chcesz przejrzeć ostatnie operacje usuwania i odtwarzania stron.",
@@ -2572,7 +2594,7 @@ $1',
'blanknamespace' => '(Główna)',
# Contributions
-'contributions' => 'Wkład użytkownika',
+'contributions' => 'Wkład {{GENDER:$1|użytkownika|użytkowniczki}}',
'contributions-title' => 'Wkład {{GENDER:$1|użytkownika|użytkowniczki}} $1',
'mycontris' => 'Edycje',
'contribsub2' => 'Dla użytkownika $1 ($2)',
@@ -2846,6 +2868,7 @@ Strony nie można przenieść na nią samą.',
'immobile-target-namespace-iw' => 'Link interwiki jest nieprawidłowym tytułem, pod który miałaby być przeniesiona strona.',
'immobile-source-page' => 'Tej strony nie można przenieść.',
'immobile-target-page' => 'Nie można przenieść pod wskazany tytuł.',
+'bad-target-model' => 'Strona docelowa używa innego modelu zawartości. Konwersja $1 → $2 nie jest możliwa.',
'imagenocrossnamespace' => 'Nie można przenieść grafiki do przestrzeni nazw nie przeznaczonej dla grafik',
'nonfile-cannot-move-to-file' => 'Nie można przenieść obiektu nie będącego plikiem do przestrzeni nazw „{{ns:file}}“',
'imagetypemismatch' => 'Nowe rozszerzenie nazwy pliku jest innego typu niż zawartość',
@@ -2959,6 +2982,7 @@ Brak katalogu dla plików tymczasowych.',
'import-error-interwiki' => 'Strona „$1†nie została zaimportowana, ponieważ jej nazwa jest zarezerwowana do linków zewnętrznych (interwiki).',
'import-error-special' => 'Strona „$1†nie została zaimportowana, ponieważ należy do specjalnej przestrzeni nazw, która nie zezwala na strony.',
'import-error-invalid' => 'Strona „$1†nie została zaimportowana, ponieważ jej nazwa jest nieprawidłowa.',
+'import-error-unserialize' => 'Wersja $2 strony "$1" nie może zostać odserializowana. Wersja używa modelu treści $3 zserializowanego jako $4',
'import-options-wrong' => '{{PLURAL:$2|Niepoprawna opcja|Niepoprawne opcje}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Wskazana strona główna jest niepoprawna.',
'import-rootpage-nosubpage' => 'Przestrzeń nazw "$1" strony głównej nie dopuszcza stron podrzędnych.',
@@ -2973,7 +2997,6 @@ Brak katalogu dla plików tymczasowych.',
# JavaScriptTest
'javascripttest' => 'Testowanie JavaScript',
-'javascripttest-disabled' => 'Ta funkcja nie została włączona na tej wiki.',
'javascripttest-title' => 'Uruchamianie testów $1',
'javascripttest-pagetext-noframework' => 'Ta strona jest zarezerwowana dla wykonywania testów JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Nieznany framework testowania „$1â€.',
@@ -3119,11 +3142,13 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
'pageinfo-default-sort' => 'Domyślny klucz sortowania',
'pageinfo-length' => 'Długość strony (w bajtach)',
'pageinfo-article-id' => 'Identyfikator strony',
+'pageinfo-language' => 'Język zawartości strony',
'pageinfo-robot-policy' => 'Status w wyszukiwarce',
'pageinfo-robot-index' => 'Indeksowalne',
'pageinfo-robot-noindex' => 'Nieindeksowalne',
'pageinfo-views' => 'Odsłon',
'pageinfo-watchers' => 'Liczba obserwujÄ…cych',
+'pageinfo-few-watchers' => 'Mniej niż $1 {{PLURAL:$1|obserwujący|obserwujących}}',
'pageinfo-redirects-name' => 'Liczba przekierowań do tej strony',
'pageinfo-subpages-name' => 'Liczba podstron tej strony',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|przekierowanie|przekierowania|przekierowań}}; $3 {{PLURAL:$3|bez przekierowania|bez przekierowań|bez przekierowań}})',
@@ -3138,6 +3163,19 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
'pageinfo-magic-words' => 'Magiczne {{PLURAL:$1|słowo|słowa|słowa}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Ukryta kategoria|Ukryte kategorie|Ukryte kategorie}} ($1)',
'pageinfo-templates' => 'Wykorzystywan{{PLURAL:$1|y szablon|e szablony}} ($1)',
+'pageinfo-transclusions' => 'Dołączona na {{PLURAL:$1|stronie|stronach}} ($1)',
+'pageinfo-toolboxlink' => 'Informacje o tej stronie',
+'pageinfo-redirectsto' => 'Przekierowuje na',
+'pageinfo-redirectsto-info' => 'informacje',
+'pageinfo-contentpage' => 'Liczona jako artykuł',
+'pageinfo-contentpage-yes' => 'Tak',
+'pageinfo-protect-cascading' => 'Zabezpieczona z włączoną opcją dziedziczenia',
+'pageinfo-protect-cascading-yes' => 'Tak',
+'pageinfo-protect-cascading-from' => 'Zabezpieczenie dziedziczone z',
+'pageinfo-category-info' => 'Informacje o kategorii',
+'pageinfo-category-pages' => 'Liczba stron',
+'pageinfo-category-subcats' => 'Liczba podkategorii',
+'pageinfo-category-files' => 'Liczba plików',
# Skin names
'skinname-standard' => 'Standardowa',
@@ -3160,6 +3198,8 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
'markedaspatrollederror' => 'Nie można oznaczyć jako „sprawdzoneâ€',
'markedaspatrollederrortext' => 'Musisz wybrać wersjÄ™ żeby oznaczyć jÄ… jako „sprawdzonÄ…â€.',
'markedaspatrollederror-noautopatrol' => 'Nie masz uprawnieÅ„ wymaganych do oznaczania swoich edycji jako „sprawdzoneâ€.',
+'markedaspatrollednotify' => 'Ta zmiana na stronie «$1» została oznaczona jako sprawdzona.',
+'markedaspatrollederrornotify' => 'Oznaczenie strony jako sprawdzonej nie powiodło się.',
# Patrol log
'patrol-log-page' => 'Rejestr patrolowania',
@@ -3193,6 +3233,7 @@ Jeśli go otworzysz, możesz zarazić swój system.",
'file-nohires' => 'Grafika w wyższej rozdzielczości nie jest dostępna.',
'svg-long-desc' => 'Plik SVG, nominalnie $1 × $2 pikseli, rozmiar pliku: $3',
'svg-long-desc-animated' => 'Animowany plik SVG, nominalnie $1 × $2 pikseli, rozmiar pliku: $3',
+'svg-long-error' => 'Nieprawidłowy plik SVG:$1',
'show-big-image' => 'Pełna rozdzielczość',
'show-big-image-preview' => 'Rozmiar podglądu – $1.',
'show-big-image-other' => '{{PLURAL:$2|Inna rozdzielczość|Inne rozdzielczości}}: $1.',
@@ -3225,7 +3266,10 @@ Jeśli go otworzysz, możesz zarazić swój system.",
'minutes' => '{{PLURAL:$1|$1 minuta|$1 minuty|$1 minut}}',
'hours' => '{{PLURAL:$1|$1 godzina|$1 godziny|$1 godzin}}',
'days' => '{{PLURAL:$1|$1 dzień|$1 dni}}',
+'months' => '{{PLURAL:$1|$1 miesiąc|$1 miesiące|$1 miesięcy}}',
+'years' => '{{PLURAL:$1|$1 rok|$1 lata|$1 lat}}',
'ago' => '$1 temu',
+'just-now' => 'przed chwilÄ…',
# Bad image list
'bad_image_list' => 'Dane należy wprowadzić w formacie:
@@ -3733,6 +3777,7 @@ Kod zawarty w linku straci ważność $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Transkluzja przez interwiki jest wyłączona]',
'scarytranscludefailed' => '[Pobranie szablonu dla $1 nie powiodło się]',
+'scarytranscludefailed-httpstatus' => '[Pobranie szablonu dla $1 nie powiodło się: HTTP $2]',
'scarytranscludetoolong' => '[zbyt długi adres URL]',
# Delete conflict
@@ -3890,6 +3935,7 @@ Możesz także użyć [[Special:EditWatchlist|standardowego edytora obserwowanyc
'version-license' => 'Licencja',
'version-poweredby-credits' => "To wiki korzysta z oprogramowania '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001â€$1 $2.",
'version-poweredby-others' => 'inni',
+'version-credits-summary' => 'Następujące osoby wniosły istotny wkład w rozwój oprogramowania [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki jest wolnym oprogramowaniem – możesz je dystrybuować i modyfikować zgodnie z warunkami licencji GNU General Public License opublikowanej przez Free Software Foundation w wersji 2 tej licencji lub (jeśli wolisz) dowolnej późniejszej.
MediaWiki jest dystrybuowane w nadziei, że okaże się użyteczne ale BEZ JAKIEJKOLWIEK GWARANCJI – nawet bez domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ lub PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. Więcej szczegółów znajdziesz w treści licencji GNU General Public License.
@@ -4007,13 +4053,13 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
'logentry-delete-restore' => '$1 {{GENDER:$2|odtworzył|odtworzyła}} stronę $3',
'logentry-delete-event' => '$1 {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|zdarzenia|$5 zdarzeń}} w rejestrze $3, wykonano następujące operacje: $4',
'logentry-delete-revision' => '$1 {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4',
-'logentry-delete-event-legacy' => '$1 {{GENDER:$2|zmienił|zmieniła}} widoczność zdarzeń w rejestrze $3',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|zmienił|zmieniła}} widoczność zdarzeń w rejestrze strony $3',
'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|zmienił|zmieniła}} widoczność wersji strony $3',
-'logentry-suppress-delete' => '$1 ukrywa stronÄ™ $3',
-'logentry-suppress-event' => '$1 potajemnie zmienia widoczność {{PLURAL:$5|zdarzenia|$5 zdarzeń}} w $3, wykonano następujące operacje: $4',
-'logentry-suppress-revision' => '$1 potajemnie zmienia widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4',
-'logentry-suppress-event-legacy' => '$1 potajemnie zmienia widoczność zdarzenia w rejestrze $3',
-'logentry-suppress-revision-legacy' => '$1 potajemnie zmienia widoczność wersji strony $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|ukrył|ukryła}} stronę $3',
+'logentry-suppress-event' => '$1 potajemnie {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|zdarzenia|$5 zdarzeń}} w $3, wykonano następujące operacje: $4',
+'logentry-suppress-revision' => '$1 potajemnie {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4',
+'logentry-suppress-event-legacy' => '$1 potajemnie {{GENDER:$2|zmienił|zmieniła}} widoczność zdarzenia w rejestrze dla strony $3',
+'logentry-suppress-revision-legacy' => '$1 potajemnie {{GENDER:$2|zmienił|zmieniła}} widoczność wersji strony $3',
'revdelete-content-hid' => 'treść została ukryta',
'revdelete-summary-hid' => 'opis zmian został ukryty',
'revdelete-uname-hid' => 'nazwa użytkownika została ukryta',
@@ -4026,13 +4072,17 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
'logentry-move-move-noredirect' => '$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 na $4, bez pozostawienia przekierowania pod starym tytułem',
'logentry-move-move_redir' => '$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 na $4 w miejsce przekierowania',
'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 na $4 w miejsce przekierowania i bez pozostawienia przekierowania pod starym tytułem',
-'logentry-patrol-patrol' => '$1 {{GENDER:$2|odznaczył|odznaczyła}} wersję $4 strony $3 jako sprawdzoną',
-'logentry-patrol-patrol-auto' => '$1 automatycznie {{GENDER:$2|odznaczył|odznaczyła}} wersję $4 strony $3 jako sprawdzoną',
-'logentry-newusers-newusers' => 'Konto użytkownika $1 zostało utworzone',
-'logentry-newusers-create' => 'Konto użytkownika $1 zostało utworzone',
-'logentry-newusers-create2' => 'Konto użytkownika $3 zostało utworzone przez użytkownika $1',
-'logentry-newusers-autocreate' => '$1 automatycznie tworzy konto użytkownika',
-'newuserlog-byemail' => 'hasÅ‚o zostaÅ‚o wysÅ‚ane eâ€mailem',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|oznaczył|oznaczyła}} wersję $4 strony $3 jako sprawdzoną',
+'logentry-patrol-patrol-auto' => '$1 automatycznie {{GENDER:$2|oznaczył|oznaczyła}} wersję $4 strony $3 jako sprawdzoną',
+'logentry-newusers-newusers' => 'Konto {{GENDER:$2|użytkownika|użytkowniczki}} $1 zostało utworzone',
+'logentry-newusers-create' => 'Konto {{GENDER:$2|użytkownika|użytkowniczki}} $1 zostało utworzone',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|utworzył|utworzyła}} konto użytkownika $3',
+'logentry-newusers-byemail' => 'Konto $3 zostało utworzone przez użytkownika $1, hasło wysłano e-mailem',
+'logentry-newusers-autocreate' => '$1 automatycznie {{GENDER:$2|utworzył|utworzyła|utworzył}} konto użytkownika',
+'logentry-rights-rights' => '$1 {{GENDER:$2|zmienił|zmieniła}} przynależność $3 do grup ($4 → $5)',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|zmienił|zmieniła}} przynależność $3 do grup',
+'logentry-rights-autopromote' => '$1 automatycznie {{GENDER:$2|zmienił|zmieniła}} przynależność ($4 → $5)',
+'rightsnone' => 'brak',
# Feedback
'feedback-bugornote' => 'Jeśli jesteś {{GENDER:|gotów|gotowa}} szczegółowo opisać problem techniczny, proszę [$1 zgłoś błąd].
@@ -4086,6 +4136,7 @@ W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zosta
'api-error-ok-but-empty' => 'Błąd wewnętrzny – brak odpowiedzi od serwera.',
'api-error-overwrite' => 'Nadpisanie istniejÄ…cego pliku nie jest dopuszczalne.',
'api-error-stashfailed' => 'Błąd wewnętrzny – serwer nie mógł zapisać pliku tymczasowego.',
+'api-error-publishfailed' => 'Błąd wewnętrzny: serwer nie mógł zapisać pliku tymczasowego.',
'api-error-timeout' => 'Serwer nie odpowiedział w oczekiwanym czasie.',
'api-error-unclassified' => 'Wystąpił nieznany błąd',
'api-error-unknown-code' => 'BÅ‚Ä…d nieznany – „$1â€',
@@ -4106,4 +4157,7 @@ W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zosta
'duration-centuries' => '$1 {{PLURAL:$1|stulecie|stulecia|stuleci}}',
'duration-millennia' => '$1 {{PLURAL:$1|tysiÄ…clecie|tysiÄ…clecia|tysiÄ…cleci}}',
+# Image rotation
+'rotate-comment' => 'Obraz został odwrócony o $1 {{PLURAL:$1|stopień|stopnie|stopni}} (w kierunku zgodnym z ruchem wskazówek zegara)',
+
);
diff --git a/languages/messages/MessagesPms.php b/languages/messages/MessagesPms.php
index 31d9a714..5b1c13cc 100644
--- a/languages/messages/MessagesPms.php
+++ b/languages/messages/MessagesPms.php
@@ -175,6 +175,7 @@ $messages = array(
'newwindow' => '(as deurb ant na fnestra neuva)',
'cancel' => 'Scancela',
'moredotdotdot' => 'Dë pì...',
+'morenotlisted' => 'Autr pa listà...',
'mypage' => 'Pàgina',
'mytalk' => 'Ciaciarade',
'anontalk' => "Ciaciarade për st'adrëssa IP-sì",
@@ -186,7 +187,6 @@ $messages = array(
'qbbrowse' => 'Sfeuja',
'qbedit' => 'Modìfica',
'qbpageoptions' => 'Opsion dla pàgina',
-'qbpageinfo' => 'Anformassion rësguard a la pàgina',
'qbmyoptions' => 'Mie opsion',
'qbspecialpages' => 'Pàgine speciaj',
'faq' => 'Chestion frequente',
@@ -209,6 +209,7 @@ $messages = array(
'namespaces' => 'Spassi nominaj',
'variants' => 'Variant',
+'navigation-heading' => 'Lista ëd navigassion',
'errorpagetitle' => 'Eror',
'returnto' => 'Torna andré a $1.',
'tagline' => 'Da {{SITENAME}}.',
@@ -445,12 +446,12 @@ L'aministrator ch'a l'ha blocalo a l'ha lassà sta spiegassion: «$3».",
'virus-unknownscanner' => 'antivìrus nen conossù:',
# Login and logout pages
-'logouttext' => "'''A l'é sortù da 'nt ël sistema.'''
+'logouttext' => "'''A l'é surtì da 'nt ël sistema.'''
-A peul tiré anans a dovré {{SITENAME}} coma Utent anonim, ò pura a peul [[Special:UserLogin|rintré torna ant ël sistema]] con l'istess stranòm che a dovrava prima, ò con un diferent.
-Ch'a nòta che chèich pàgine a peulo continué a esse visualisà com s'a fussa ancó ant ël sistema, fin ch'a scancela pa la cache ëd sò navigador.",
-'welcomecreation' => '==Bin ëvnù, $1!==
-Sò cont a l\'é stàit creà.
+A peul tiré anans a dovré {{SITENAME}} coma Utent anònim, ò pura a peul <span class='plainlinks'>[$1 rintré torna ant ël sistema]</span> con l'istess stranòm che a dovrava prima, ò con un diferent.
+Ch'a nòta che chèiche pàgine a peulo continué a esse visualisà com s'a fussa ancor ant ël sistema, fin ch'a scancela nen la memòria local ëd sò navigador.",
+'welcomeuser' => 'Bin ëvnù, $1!',
+'welcomecreation-msg' => 'Sò cont a l\'é stàit creà.
Che as dësmentia pa ëd cambié ij [[Special:Preferences|"sò gust" an {{SITENAME}}]].',
'yourname' => 'Sò stranòm',
'yourpassword' => 'Soa ciav',
@@ -547,6 +548,7 @@ Për piasì speta prima ëd prové torna.",
# Email sending
'php-mail-error-unknown' => 'Eror pa conossù ant la funsion PHP mail()',
'user-mail-no-addy' => 'Provà a spedì un mëssagi sensa adrëssa ëd pòsta eletrònica.',
+'user-mail-no-body' => 'Preuva a mandé un corel con un còrp veuid o motobin curt.',
# Change password dialog
'resetpass' => 'Cambia la ciav',
@@ -605,6 +607,7 @@ Ciav a temp: $2',
'changeemail-oldemail' => 'Adrëssa ëd pòsta eletrònica atual:',
'changeemail-newemail' => 'Adrëssa ëd pòsta eletrònica neuva:',
'changeemail-none' => '(gnun)',
+'changeemail-password' => 'Toa ciav ëd {{SITENAME}}:',
'changeemail-submit' => "Cangé l'adrëssa ëd pòsta eletrònica",
'changeemail-cancel' => 'Scancela',
@@ -781,7 +784,6 @@ L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
'template-semiprotected' => '(mes-protet)',
'hiddencategories' => 'Sta pàgina-sì a fa part ëd {{PLURAL:$1|na categorìa|$1 categorìe}} stërmà:',
'edittools' => "<!-- Test ch'a së s-ciàira sot a ij mòduj ëd mòdifica e 'd càrich d'archivi. -->",
-'nocreatetitle' => 'Creassion ëd pàgine limità',
'nocreatetext' => "Cost sit-sì a l'ha limità la possibilità ëd creé dle pàgine neuve.
A peul torné andaré e modifiché na pàgina che a-i é già, ò pura [[Special:UserLogin|rintré ant ël sistema ò deurb-se un cont]].",
'nocreate-loggedin' => "A l'ha pa ij përmess për creé dle pàgine neuve.",
@@ -806,6 +808,15 @@ A smija che a sia stàita scancelà.',
'edit-already-exists' => 'As peul nen creesse la pàgina.
A esist già.',
'defaultmessagetext' => "Test che a-i sarìa se a-i fusso pa 'd modìfiche",
+'content-failed-to-parse' => "Faliment ëd l'anàlisi dël contnù ëd $2 për ël model $1: $3",
+'invalid-content-data' => 'Dat dël contnù pa bon',
+'content-not-allowed-here' => "Ël contnù «$1» a l'é nen autorisà an sla pàgina [[$2]]",
+
+# Content models
+'content-model-wikitext' => 'test wiki',
+'content-model-text' => 'mach test',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Atension:''' Costa pàgina a l'ha tròpe ciamà costose a le fonsions ëd parser.
@@ -1170,9 +1181,9 @@ Sòn a peul pa esse anulà.',
'prefs-emailconfirm-label' => "Conferma dl'adrëssa ëd pòsta eletrònica:",
'prefs-textboxsize' => 'Dimension ëd la fnestra ëd modìfica',
'youremail' => 'Soa adrëssa ëd pòsta eletrònica:',
-'username' => 'Stranòm:',
-'uid' => "ID dl'utent:",
-'prefs-memberingroups' => 'Mèmber {{PLURAL:$1|dla partìa|dle partìe}}:',
+'username' => '{{GENDER:$1|Stranòm}}:',
+'uid' => "Identificativ dl'{{GENDER:$1|utent}}:",
+'prefs-memberingroups' => '{{GENDER:$2|Mèmber}} {{PLURAL:$1|dla partìa|dle partìe}}:',
'prefs-memberingroups-type' => '$1',
'prefs-registration' => 'Data ëd registrassion:',
'prefs-registration-date-time' => '$1',
@@ -1324,12 +1335,13 @@ Costa anformassion a sarà pùblica.",
'right-sendemail' => "Mandé un mëssagi an pòsta eletrònica a j'àutri utent",
'right-passwordreset' => 'Vëdde ij mëssagi ëd pòsta eletrònica ëd riampostassion dle ciav',
+# Special:Log/newusers
+'newuserlogpage' => "Registr dla creassion dj'utent",
+'newuserlogpagetext' => "Sossì a l'é un registr andova ch'as marco le creassion dj'utent.",
+
# User rights log
'rightslog' => "Argistr dij drit ëd j'utent",
'rightslogtext' => "Costa a l'é na lista dij cambiament aj drit ëd j'utent.",
-'rightslogentry' => "a l'ha tramudà $1 da 'nt la partìa $2 a la partìa $3",
-'rightslogentry-autopromote' => "a l'é stàit automaticament promovù da $2 a $3",
-'rightsnone' => '(gnun)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lese sta pàgina-sì',
@@ -1573,6 +1585,7 @@ Se a-i riva sossì n'àotra vira, ch'as buta an comunicassion con n'[[Special:Li
'backend-fail-notsame' => "N'archivi nen idéntich a esist già a $1.",
'backend-fail-invalidpath' => "$1 a l'é pa un përcors ëd memorisassion bon.",
'backend-fail-delete' => "As peul pa scanselesse l'archivi $1.",
+'backend-fail-describe' => "Impossìbil cangé ij metadat për l'archivi «$1».",
'backend-fail-alreadyexists' => 'L\'archivi "$1" a esist già.',
'backend-fail-store' => "As peul pa memorisesse l'archivi $1 a $2.",
'backend-fail-copy' => "As peul pa copiesse l'archivi $1 su $2.",
@@ -1960,7 +1973,7 @@ Ch'a bèica ëdcò [[Special:WantedCategories|le categorìe domandà]].",
'linksearch-ok' => 'Sërché',
'linksearch-text' => 'As peulo dovresse dij ciapatut com "*.wikipedia.org".
A-i é dabzògn almanch d\'un domini a livel pi àut, për esempi "*.org".<br />
-Protocòj ch\'as peulo dovresse: <code>$1</code> (predefinì http:// se gnun protocòj a son specificà).',
+{{PLURAL:$2|Protocòl|Protocòj}} ch\'as peulo dovresse: <code>$1</code> (predefinì http:// se gnun protocòl a l\'é specificà).',
'linksearch-line' => "$1 a l'ha n'anliura ch'a-j riva dzora da $2",
'linksearch-error' => 'Ij ciapatut as peulo butesse mach an prinsipi dël nòm dël sërvent.',
@@ -1979,10 +1992,6 @@ Protocòj ch\'as peulo dovresse: <code>$1</code> (predefinì http:// se gnun pro
'activeusers-hidesysops' => "Stërmé j'aministrator",
'activeusers-noresult' => 'Pa gnun utent trovà.',
-# Special:Log/newusers
-'newuserlogpage' => "Registr dla creassion dj'utent",
-'newuserlogpagetext' => "Sossì a l'é un registr andova ch'as marco le creassion dj'utent.",
-
# Special:ListGroupRights
'listgrouprights' => "Drit dël grup d'utent",
'listgrouprights-summary' => "Ambelessì a-i é na lista dle partìe d'utent definìe ansima a costa wiki, con ij sò drit d'acess associà.
@@ -2079,19 +2088,23 @@ Le modìfiche che a-i saran ant costa pàgina-sì e ant soa pàgina ëd discussi
'enotif_mailer' => '{{SITENAME}} - Servissi ëd Notìfica Postal',
'enotif_reset' => 'Marché tute le pàgine tanme visità',
-'enotif_newpagetext' => "Costa-sì a l'é na pàgina neuva",
'enotif_impersonal_salutation' => 'utent ëd {{SITENAME}}',
-'changed' => 'modificà',
-'created' => 'creà',
-'enotif_subject' => 'La pàgina $PAGETITLE ëd {{SITENAME}} a l\'é staita $CHANGEDORCREATED da $PAGEEDITOR',
+'enotif_subject_deleted' => "La pàgina $1 ëd {{SITENAME}} a l'é stàita scancelà da {{gender:$2|$2}}",
+'enotif_subject_created' => "La pàgina $1 ëd {{SITENAME}} a l'é stàita creà da {{gender:$2|$2}}",
+'enotif_subject_moved' => "La pàgina $1 ëd {{SITENAME}} a l'é stàita tramudà da {{gender:$2|$2}}",
+'enotif_subject_restored' => "La pàgina $1 ëd {{SITENAME}} a l'é stàita ripristinà da {{gender:$2|$2}}",
+'enotif_subject_changed' => "La pàgina $1 ëd {{SITENAME}} a l'é stàita modificà da {{gender:$2|$2}}",
+'enotif_body_intro_deleted' => 'La pàgina $1 ëd {{SITENAME}} a l\'é stàita scancelà da {{gender:$2|$2}} ël $PAGEEDITDATE, vëdde $3.',
+'enotif_body_intro_created' => 'La pàgina $1 ëd {{SITENAME}} a l\'é stàita creà da {{gender:$2|$2}} ël $PAGEEDITDATE, vëdde $3 për la revision corenta.',
+'enotif_body_intro_moved' => 'La pàgina $1 ëd {{SITENAME}} a l\'é stàita tramudà da {{gender:$2|$2}} ël $PAGEEDITDATE, vëdde $3 për la revision corenta.',
+'enotif_body_intro_restored' => 'La pàgina $1 ëd {{SITENAME}} a l\'é stàita ripristinà da {{gender:$2|$2}} ël $PAGEEDITDATE, vëdde $3 për la revision corenta.',
+'enotif_body_intro_changed' => 'La pàgina $1 ëd {{SITENAME}} a l\'é stàita modificà da {{gender:$2|$2}} ël $PAGEEDITDATE, vëdde $3 për la revision corenta.',
'enotif_lastvisited' => "Che as varda $1 për ës-ciaré tute le modìfiche da 'nt l'ùltima vira che a l'é passà.",
'enotif_lastdiff' => "Ch'a varda $1 për visioné sta modìfica.",
'enotif_anon_editor' => 'utent anònim $1',
'enotif_body' => 'Car $WATCHINGUSERNAME,
-La pàgina $PAGETITLE dël sit {{SITENAME}} a l\'é stàita $CHANGEDORCREATED ël $PAGEEDITDATE da $PAGEEDITOR, che a varda $PAGETITLE_URL për la version corenta.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Resumé dl\'editor: $PAGESUMMARY $PAGEMINOREDIT
@@ -2115,6 +2128,8 @@ $UNWATCHURL
Comunicassion ëd servissi e pì d\'agiut:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'creà',
+'changed' => 'modificà',
# Delete
'deletepage' => 'Scancelé la pàgina',
@@ -2184,6 +2199,8 @@ Ch'a varda la [[Special:ProtectedPages|Lista dle pàgine protegiùe]] për la li
'prot_1movedto2' => '[[$1]] tramudà a [[$2]]',
'protect-badnamespace-title' => 'Spassi nominal pa protegìbil',
'protect-badnamespace-text' => 'Le pàgine an cost ëspassi nominal-sì a peulo pa esse protegiùe.',
+'protect-norestrictiontypes-text' => 'Sta pagina a peul pa esse protegiùa përchè a-i son gnun-e sòrt ëd restrission disponìbij.',
+'protect-norestrictiontypes-title' => 'Pagina pa protegìbila',
'protect-legend' => 'Che an conferma la protession',
'protectcomment' => 'Rason:',
'protectexpiry' => 'Scadensa:',
@@ -2266,7 +2283,8 @@ l'avìa travajaje ansima anans che a la scancelèisso.
'undeletedrevisions' => '{{PLURAL:$1|Na revision pijàita|$1 revision pijàite}} andré',
'undeletedrevisions-files' => "{{PLURAL:$1|Na|$1}} revision e {{PLURAL:$2|n'|$2&nbsp;}}archivi pijàit andré",
'undeletedfiles' => "{{PLURAL:$1|N'|$1&nbsp;}}archivi pijàit andaré",
-'cannotundelete' => "Riprìstin falì; a peul esse che i fusse antra doi a felo ant l'istess temp e l'àutr a sia riva prima.",
+'cannotundelete' => 'Riprìstin falì:
+$1',
'undeletedpage' => "'''$1 a l'é stàit pijait andaré'''
Che as varda ël [[Special:Log/delete|Registr djë scancelament]] për ës-ciairé j'ùltim scancelament e arcuperassion.",
@@ -2297,7 +2315,7 @@ $1",
'blanknamespace' => '(Prinsipal)',
# Contributions
-'contributions' => "Contribussion dë st'Utent-sì",
+'contributions' => "Contribussion dë st'{{GENDER:$1|utent}}-sì",
'contributions-title' => 'Contribussion ëd $1',
'mycontris' => 'Contribussion',
'contribsub2' => 'Për $1 ($2)',
@@ -2570,6 +2588,7 @@ L'artìcol ëd destinassion «[[:$1]]» a-i é già. Veul-lo scancelelo për avÃ
'immobile-target-namespace-iw' => "Na liura interwiki a l'é pa na destinassion vàlida për tramudé na pàgina.",
'immobile-source-page' => 'Sta pàgina-sì as peul pa tramudesse.',
'immobile-target-page' => 'As peul pa tramudesse vers cost tìtol ëd destinassion.',
+'bad-target-model' => 'La destinassion vorsùa a deuvra un model ëd contnù diferent. As peul pa convertisse da $1 a $2.',
'imagenocrossnamespace' => "As peul pa tramudesse n'archivi a në spassi nominal diferent",
'nonfile-cannot-move-to-file' => "As peul nen tramudesse lòn ch'a l'é pa n'archivi a lë spassi nominal dj'archivi",
'imagetypemismatch' => "La neuva estension ëd l'archivi a corispond pa a sò tipo",
@@ -2686,6 +2705,7 @@ Për piasì, ch'a preuva torna.",
'import-error-interwiki' => "La pàgina «$1» a l'é pa amportà përchè sò nòm a l'é arzervà për na liura esterna (antërwiki).",
'import-error-special' => "La pàgina «$1» a l'é pa amportà përchè a ponta a në spassi nominal ch'a përmët pa dle pàgine.",
'import-error-invalid' => "La pàgina «$1» a l'é pa amportà përchè sò nòm a l'é pa bon.",
+'import-error-unserialize' => "La revision $2 dla pagina «$1» a peul pa esse desserialisà. La revision a l'era arportà përchè a deuvra ël model ëd contnù $3 serialisà com $4.",
'import-options-wrong' => '{{PLURAL:$2|Opsion|Opsion}} sbalià: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => "La pàgina prinsipal dàita a l'é un tìtol pa bon.",
'import-rootpage-nosubpage' => 'Lë spassi nominal «$1» ëd la pàgina prinsipal a përmët pa dle sot-pagine.',
@@ -2700,7 +2720,6 @@ Për piasì, ch'a preuva torna.",
# JavaScriptTest
'javascripttest' => 'Preuva ëd JavaScript',
-'javascripttest-disabled' => "Sta funsion-sì a l'é pa stàita abilità ansima a costa wiki.",
'javascripttest-title' => 'Fé dle preuve $1',
'javascripttest-pagetext-noframework' => "Costa pàgina a l'é arservà për fé dle preuve JavaScript.",
'javascripttest-pagetext-unknownframework' => 'Strutura ëd preuva pa conossùa «$1».',
@@ -2824,6 +2843,7 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
'pageinfo-default-sort' => "ciav d'ordinament për sòlit",
'pageinfo-length' => 'Longheur ëd la pàgina (an byte)',
'pageinfo-article-id' => 'Identificativ ëd la pàgina',
+'pageinfo-language' => 'Lenga dël contnù dla pàgina',
'pageinfo-robot-policy' => "Stat dël motor d'arserca",
'pageinfo-robot-index' => 'Indesàbil',
'pageinfo-robot-noindex' => 'Nen indesàbil',
@@ -2843,6 +2863,19 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
'pageinfo-magic-words' => '{{PLURAL:$1|Paròla màgica|Paròle màgiche}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorìa|Categorìe}} stërmà ($1)',
'pageinfo-templates' => '{{PLURAL:$1|stamp contnù|stamp contnù}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pagina|Pagine}} transcludùe dzor ($1)',
+'pageinfo-toolboxlink' => 'Anformassion an sla pàgina',
+'pageinfo-redirectsto' => 'Ridiression-a a',
+'pageinfo-redirectsto-info' => 'anformassion',
+'pageinfo-contentpage' => 'Contà com na pagina ëd contnù',
+'pageinfo-contentpage-yes' => 'É!',
+'pageinfo-protect-cascading' => 'Le protession a son a cascada da sì',
+'pageinfo-protect-cascading-yes' => 'É!',
+'pageinfo-protect-cascading-from' => 'Le protession a son a cascada da',
+'pageinfo-category-info' => 'Anformassion ëd categorìa',
+'pageinfo-category-pages' => 'Nùmer ëd pàgine',
+'pageinfo-category-subcats' => 'Nùmer ëd sotcategorìe',
+'pageinfo-category-files' => "Nùmer d'archivi",
# Patrolling
'markaspatrolleddiff' => 'Marché coma verificà',
@@ -2854,6 +2887,8 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
'markedaspatrollederror' => 'As peul pa marché coma verificà',
'markedaspatrollederrortext' => 'A venta che a spessìfica che version che a veul marchè coma verificà.',
'markedaspatrollederror-noautopatrol' => "A l'ha nen ël përmess dë marchesse soe modìfiche coma «controlà».",
+'markedaspatrollednotify' => "Ës cambi a $1 a l'é stàit marcà com verificà.",
+'markedaspatrollederrornotify' => 'Marcadura com verificà falìa.',
# Patrol log
'patrol-log-page' => 'Registr dij contròj',
@@ -2887,6 +2922,7 @@ An fasend-lo marcé ansima a sò ordinator chiel a podrìa porteje ëd dann a sÃ
'file-nohires' => 'Gnun-a risolussion pì bela disponìbil.',
'svg-long-desc' => "archivi an forma SVG, amzure nominaj $1 × $2 pontin, amzura dl'archivi: $3",
'svg-long-desc-animated' => "Archivi SVG animà, dimension $1 × $2 pontin, amzura dl'archivi: $3",
+'svg-long-error' => 'Archivi SVG nen bon: $1',
'show-big-image' => 'Version a arzolussion pien-a',
'show-big-image-preview' => 'Amzure dë sta preuva: $1.',
'show-big-image-other' => '{{PLURAL:$2|Àutra arzolussion|Àutre arzolussion}}: $1.',
@@ -2916,7 +2952,10 @@ An fasend-lo marcé ansima a sò ordinator chiel a podrìa porteje ëd dann a sÃ
'minutes' => '{{PLURAL:$1|$1 minuta|$1 minute}}',
'hours' => '{{PLURAL:$1|$1 ora|$1 ore}}',
'days' => '{{PLURAL:$1|$1 di|$1 di}}',
+'months' => '{{PLURAL:$1|$1 mèis}}',
+'years' => '{{PLURAL:$1|$1 ann|$1 agn}}',
'ago' => '$1 fa',
+'just-now' => 'pròpi adess',
# Bad image list
'bad_image_list' => "La forma a l'é costa-sì:
@@ -3424,6 +3463,7 @@ Cost còdes ëd conferma a scad ai $4.",
# Scary transclusion
'scarytranscludedisabled' => "[L'inclusion ëd pàgine antra wiki diferente a l'é nen abilità]",
'scarytranscludefailed' => "[Darmagi, ma lë stamp $1 a l'é pa podusse carié]",
+'scarytranscludefailed-httpstatus' => '[Letura dlë stamp falìa për $1: HTTP $2]',
'scarytranscludetoolong' => "[L'adrëssa dl'aragnà a l'é tròp longa]",
# Delete conflict
@@ -3553,6 +3593,7 @@ As peul ëdcò [[Special:EditWatchlist|dovré l'editor sòlit]].",
'version-license' => 'Licensa',
'version-poweredby-credits' => "Costa wiki-sì a marcia mersì a '''[//www.mediawiki.org/ MediaWiki]''', licensa © 2001-$1 $2.",
'version-poweredby-others' => 'àutri',
+'version-credits-summary' => 'I tnoma a aringrassié le përson-e sì-dapress për soa contribussion a [[Special:Version|MediaWiki]].',
'version-license-info' => "MediaWiki a l'é un programa lìber; a peul passelo an gir o modifichelo sota le condission dla Licensa Pùblica General GNU coma publicà da la Free Software Foundation; o la version 2 dla licensa o (a soa decision) qualsëssìa version apress.
MediaWiki a l'é distribuì ant la speransa che a sia ùtil, ma SENSA GNUN-A GARANSÌA; sensa gnanca la garansìa implìcita ëd COMERSIABILITA' o d'ADATAMENT A UN BUT PARTICOLAR. Ch'a lesa la Licensa General Pùblica GNU per pi 'd detaj.
@@ -3698,7 +3739,10 @@ Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite
'logentry-newusers-create' => "Ël cont utent $1 a l'é stàit creà",
'logentry-newusers-create2' => "Ël cont utent $3 a l'é stàit creà da $1",
'logentry-newusers-autocreate' => "Ël cont $1 a l'é stàit creà an automàtich",
-'newuserlog-byemail' => 'ciav spedìa për pòsta eletrònica',
+'logentry-rights-rights' => "$1 a l'ha tramudà l'apartenesa a la partìa për $3 da $4 a $5",
+'logentry-rights-rights-legacy' => "$1 a l'ha tramudà l'apartenensa a la partìa për $3",
+'logentry-rights-autopromote' => "$1 a l'é stàit automaticament promovù da $4 a $5",
+'rightsnone' => '(gnun)',
# Feedback
'feedback-bugornote' => "S'a l'é pront a descrive un problema técnich an detaj, për piasì ch'a [$1 signala un bigat].
diff --git a/languages/messages/MessagesPnb.php b/languages/messages/MessagesPnb.php
index 39866c2b..28ae9087 100644
--- a/languages/messages/MessagesPnb.php
+++ b/languages/messages/MessagesPnb.php
@@ -166,7 +166,6 @@ $messages = array(
'qbbrowse' => 'لبو',
'qbedit' => 'Ù„Ú©Ú¾Ùˆ',
'qbpageoptions' => 'اے صÙÛ',
-'qbpageinfo' => 'محول',
'qbmyoptions' => 'میرے صÙÛ’',
'qbspecialpages' => 'خاص صÙÛ’',
'faq' => 'FAQ',
@@ -411,12 +410,9 @@ $messages = array(
# Login and logout pages
'logouttext' => "'''تسی لاگ آؤٹ ÛÙˆÚ¯Û“ او.'''
-تسی {{SITENAME}} نوں گمنامی Ú† ورت سکدے او یا تسی [[Special:UserLogin|لاگ ان دوبارÛ]] Ûوجاؤ اوسے ناں توں یا وکھرے ورتن والے توں۔ اے Ú¯Ù„ چیتے رکھنا جے کج صÙیاں تے تسی لاگ ان دسے جاؤگے جدوں تک تسی اپنے براؤزر دے کاشے نوں صا٠ناں کرلو۔
-You can continue to use {{SITENAME}} anonymously, or you can [[Special:UserLogin|log in again]] as the same or as a different user.
+تسی {{SITENAME}} نوں گمنامی Ú† ورت سکدے او یا تسی <span class='plainlinks'>[$1 لاگ ان دوبارÛ]</span> Ûوجاؤ اوسے ناں توں یا وکھرے ورتن والے توں۔ اے Ú¯Ù„ چیتے رکھنا جے کج صÙیاں تے تسی لاگ ان دسے جاؤگے جدوں تک تسی اپنے براؤزر دے کاشے نوں صا٠ناں کرلو۔
+You can continue to use {{SITENAME}} anonymously, or you can <span class='plainlinks'>[$1 log in again]</span> as the same or as a different user.
Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-'welcomecreation' => '== جی آیاں نوں, $1! ==
-تواڈا کھاتا بن گیا اے۔
-اپنیاں [[Special:Preferences|{{SITENAME}} تانگاں]] بدلنا نا پلنا۔',
'yourname' => 'ورتن والÛ:',
'yourpassword' => 'کنجی:',
'yourpasswordagain' => 'کنجی Ø¯ÙˆØ¨Ø§Ø±Û Ù„Ú©Ú¾Ùˆ:',
@@ -739,7 +735,6 @@ Custom .css تے .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.cs
'template-protected' => '(بچایا گیا)',
'template-semiprotected' => '(کج بچایا Ûویا)',
'hiddencategories' => 'اے صÙÛ {{PLURAL:$1|1 Ú†Ú¾Ù¾ÛŒ Ú¯Ù¹Ú¾|$1 Ú†Ù¾Ú¾ÛŒ گٹھیاں}} دا رکن اے:',
-'nocreatetitle' => 'صÙØ­Û Ø¨Ù†Ø§Ù†Û’ دی حد اے',
'nocreatetext' => '{{SITENAME}} Ù†Û’ Ù†Û“ صÙØ­Û’ بنانے تے پابندی لائی اے۔<br />
تسی واپس جا Ú©Û’ Ù¾Ûلاں توں موجود صÙحیاں تے Ù„Ú©Ú¾ سکدے او یا Ùیر [[Special:UserLogin|اندر آؤ یا نواں Ú©Ú¾Ø§ØªÛ Ú©Ú¾ÙˆÙ„ÙˆÛ”]]',
'nocreate-loggedin' => 'توانوں نواں صÙØ­Û Ø¨Ù†Ø§Ù†Û’ دی اجازت نئیں۔',
@@ -1266,12 +1261,13 @@ $1",
'right-sendemail' => 'دوجے ورتن والیاں نوں ای-میل کرو',
'right-passwordreset' => 'کنجی بدلی ای-میلاں نوں وکھاؤ',
+# Special:Log/newusers
+'newuserlogpage' => 'ورتاوا بنان آلی لاگ',
+'newuserlogpagetext' => 'اے ورتن والا بنان دی لاگ اے۔',
+
# User rights log
'rightslog' => 'ورتن والے دے حقاں دی لاگ',
'rightslogtext' => 'ورتن حقاں چ تبدیلیاں دی اے لاگ اے۔',
-'rightslogentry' => 'ٹولی ممرشپ $1 لئی $2 توں $3 تک بدلو۔',
-'rightslogentry-autopromote' => '$2 توں اپنے آپ $3 تک ودایا گیا۔',
-'rightsnone' => '(کوئی وی نئیں)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'اس صÙØ­Û’ نوں Ù¾Ú‘Ú¾Ùˆ',
@@ -1894,10 +1890,6 @@ $1",
'activeusers-hidesysops' => 'مکھۓ لکاؤ',
'activeusers-noresult' => 'کوئی ورتن والا نئیں لبیا۔',
-# Special:Log/newusers
-'newuserlogpage' => 'ورتاوا بنان آلی لاگ',
-'newuserlogpagetext' => 'اے ورتن والا بنان دی لاگ اے۔',
-
# Special:ListGroupRights
'listgrouprights' => 'ورتن ٹرلی حق',
'listgrouprights-summary' => 'تھلے اک لسٹ اے ورتن ٹولیاں دی ای وکی تے، اپنے رلدے حقاں نال۔
@@ -1991,11 +1983,7 @@ $1",
'enotif_mailer' => '{{سائٹ ناں}} نوٹینیکیشن میلر',
'enotif_reset' => 'سارے ویکھے Ú¯Û“ صÙحیاں تے نشان لاؤ',
-'enotif_newpagetext' => 'اے نواں صÙÛ Ø§Û’Û”',
'enotif_impersonal_salutation' => '{{SITENAME}} ورتن والا',
-'changed' => 'بدلیا',
-'created' => 'بن گیا',
-'enotif_subject' => '{{سائیٹتھاں}} صÙÛ $صÙÛ Ø³Ø±Ø®ÛŒ $تبدیلی بنائی $صÙÛ Ù„Ú©Ú¾Ø§Ø±ÛŒ',
'enotif_lastvisited' => '$1 تبدیلیاں ویکھو اپنے آخری واری آن مکروں',
'enotif_lastdiff' => '$1 ویکھو ایس تبدیلی نون ویکھن لئی۔',
'enotif_anon_editor' => 'گم نام ورتن آلا $1',
@@ -2031,6 +2019,8 @@ $UNWATCHURL
Ùیڈبیک تے Ûور مدد لئی:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'بن گیا',
+'changed' => 'بدلیا',
# Delete
'deletepage' => 'صÙÛ Ù…Ù¹Ø§Ø¤',
@@ -2614,7 +2604,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'JavaScript ٹیسٹنگ',
-'javascripttest-disabled' => 'ایس ÙˆÚ©ÛŒ تے Ø§ÛŒÛ Ú©Ù… نئیں چلدا۔',
'javascripttest-title' => 'ٹیسٹ $1 چلدا اے۔',
'javascripttest-pagetext-noframework' => 'Ø§ÛŒÛ ØµÙÛ JavaScript ٹیسٹاں لئی بچایا گیا اے۔',
'javascripttest-pagetext-unknownframework' => '"$1" انجانا ٹیسٹنگ Ùریمورک۔',
@@ -3542,7 +3531,7 @@ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
'logentry-newusers-create' => '$1 {{جنس:$2|بنایا}} اک ورتن والا کھاتÛ',
'logentry-newusers-create2' => '$1 {{جنس:$2|بنایا}} {{جنس:$4|اک ورتن کھاتÛ}} $3',
'logentry-newusers-autocreate' => 'Ú©Ú¾Ø§ØªÛ $1 اپنے آپ ای {{جنس:$2|بنایا گیا}} بنایا گیا۔',
-'newuserlog-byemail' => 'کنجی ای-میل Ø±Ø§Û Ù¾ÛŒØ¬ دتی گئی۔',
+'rightsnone' => '(کوئی وی نئیں)',
# Feedback
'feedback-bugornote' => 'اگر تسیں اک تکنیکی مسلے نوں پوری طراں دسن لئی تیار او تے Ùیر Ù…Ûربانی کرکے [$1 بگ بارے دسو]Û” ںئیں تے تسیں تھلے دتا گیا Ùارم ورتو۔ تواڈی Ú¯Ù„ صÙÛ "[$3 $2]" تے جڑے گی، تواڈے ورتن والے ناں تے براؤزر جیÛڑا تسیں ورت رۓ او۔',
diff --git a/languages/messages/MessagesPnt.php b/languages/messages/MessagesPnt.php
index a9c58bf6..84691d93 100644
--- a/languages/messages/MessagesPnt.php
+++ b/languages/messages/MessagesPnt.php
@@ -160,7 +160,6 @@ $messages = array(
'qbbrowse' => 'Πλοήγησην',
'qbedit' => 'Άλλαξον',
'qbpageoptions' => 'Ατή η σελίδαν',
-'qbpageinfo' => 'ΣυμφÏαζόμενα',
'qbmyoptions' => "Τ' εμά τα σελίδας",
'qbspecialpages' => 'Ειδικά σελίδας',
'faq' => 'Πολλά εÏωτήσεις (FAQ)',
@@ -338,9 +337,6 @@ $messages = array(
'virus-unknownscanner' => 'αναγνώÏιμον αντιικόν:',
# Login and logout pages
-'welcomecreation' => "== Καλώς έÏθετεν, $1! ==
-Η λογαÏίαν εσουν εγέντον.
-Τ' άλλαγμαν τη [[Special:Preferences|{{SITENAME}} Ï€Ïοτιμησίων]] εσουν μη νεσπάλετε.",
'yourname' => 'Όνεμαν χÏήστε:',
'yourpassword' => 'Σημάδι:',
'yourpasswordagain' => "Ξαν' γÏάψτεν το σημάδι:",
@@ -708,9 +704,11 @@ $messages = array(
'right-import' => "Έμπαζμαν σελιδίων ασ' άλλα βίκι",
'right-siteadmin' => 'Ασπάλισον κι άνοιξον τη βάση δογμενίων',
+# Special:Log/newusers
+'newuserlogpage' => 'ΑÏχείον ποισιματίων λογαÏίων χÏήστε',
+
# User rights log
'rightslog' => 'ΑÏχείον δικαιωματίων',
-'rightsnone' => '(τιδέν)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'δεάβασον αβοÏτεν την σελίδαν',
@@ -945,9 +943,6 @@ $messages = array(
# Special:ListUsers
'listusers-submit' => 'Δείξον',
-# Special:Log/newusers
-'newuserlogpage' => 'ΑÏχείον ποισιματίων λογαÏίων χÏήστε',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Ομάδαν',
'listgrouprights-rights' => 'Δικαιώματα',
@@ -981,9 +976,9 @@ $messages = array(
'unwatching' => "'κ ωÏιάζω...",
'enotif_impersonal_salutation' => '{{SITENAME}} χÏήστες',
-'changed' => 'ελλάγεν',
-'created' => 'έντον',
'enotif_anon_editor' => 'ανώνυμον χÏήστες $1',
+'created' => 'έντον',
+'changed' => 'ελλάγεν',
# Delete
'deletepage' => 'Σβήσον τη σελίδαν',
@@ -1443,6 +1438,9 @@ $messages = array(
'htmlform-reset' => "Κλώσον τ'αλλαγάς",
'htmlform-selectorother-other' => 'Άλλον',
+# New logging system
+'rightsnone' => '(τιδέν)',
+
# Search suggestions
'searchsuggest-search' => 'ΑÏάεμαν',
diff --git a/languages/messages/MessagesPrg.php b/languages/messages/MessagesPrg.php
index a50e0a14..20ec925d 100644
--- a/languages/messages/MessagesPrg.php
+++ b/languages/messages/MessagesPrg.php
@@ -152,7 +152,6 @@ PÄusai en kategÅrijai "$1"',
'qbbrowse' => 'Pradirēis',
'qbedit' => 'Redigīs',
'qbpageoptions' => 'Å in pÄusan',
-'qbpageinfo' => 'KÅnteksts',
'qbmyoptions' => 'MajÄi pÄusai',
'qbspecialpages' => 'SpeciÄlai pÄusai',
'faq' => 'Ukadeznai prasīsenei',
@@ -376,11 +375,8 @@ Drēudisnas pagrintinsna: "$2".',
# Login and logout pages
'logouttext' => "'''Tū assei teinū izgūbun.'''
-TÅ« mazzi Ä“mpirsin sadÄ«ntun tÄ“rpautun {{SITENAME}} kÄigi niengÅ«buns tÄ“rpautajs, anga [[Special:UserLogin|enÄ“itwei etkÅ«mps]] kÄigi Å¡is sÅ«bs anga kits tÄ“rpautajs.
+TÅ« mazzi Ä“mpirsin sadÄ«ntun tÄ“rpautun {{SITENAME}} kÄigi niengÅ«buns tÄ“rpautajs, anga <span class='plainlinks'>[$1 enÄ“itwei etkÅ«mps]</span> kÄigi Å¡is sÅ«bs anga kits tÄ“rpautajs.
EndirÄ“is, kÄi ainuntai pÄusai mazzi bÅ«twei waidÄ«ntan ikÄigi tÅ« bÅ«lai ainatÄ«ngi engÅ«bun, Ä“rgi tÅ« wÄ«rst skistinnuns lasÄtlas rÄnkas minÄ«snan.",
-'welcomecreation' => '== Kaīls, $1! ==
-TwÄjs rekkens pastÄi teÄ«ktan.
-Ni izmīrstais kitawīdintun Twajjans [[Special:Preferences|pirminiskwans per {{SITENAME}}]].',
'yourname' => 'TwajÄ tÄ“rpautajas pabilisnÄ:',
'yourpassword' => 'TwÄjs kliptaswÄ«rds:',
'yourpasswordagain' => 'Āntrinais kliptaswīrdan',
@@ -628,7 +624,6 @@ Teksts ni mazzi bÅ«twei enpeisÄtan.",
'template-protected' => '(pakūnstan)',
'template-semiprotected' => '(delīkiskai pakūnstan)',
'hiddencategories' => 'Å in pÄusan ast en {{PLURAL:$1|ainassei kliptan kategÅrijan|$1 kliptan kategÅrijan}}:',
-'nocreatetitle' => 'KÄnkÄ“ di mazÄ«ngiskwan stesses segÄ«snan stÄ“isan nÄunan pÄusan',
'nocreatetext' => 'NÄunan pÄusan teÄ«ksnas mazÄ«ngisku en {{SITENAME}} pastÄi arÄikintan.
TÅ« mazzi redigÄ«tun ekzistÄ«ntins pÄusans anga [[Special:UserLogin|enÄ“itwei anga teÄ«ktun nÄunan rekkenan]].',
'nocreate-loggedin' => 'TÅ« ni turri preiwÄ“rpsenin, kÄi teÄ«klai nÄunans pÄusans.',
@@ -1045,11 +1040,13 @@ TÅ« mazzi dÄ«gi etrÄ«nktun dÄtun kitÄ“imans drÄugautwei sen tin pra tÄ“rpautaj
'right-override-export-depth' => 'EkspÅrtis pÄusans Ä“mpiri sen pÄusans prei kawÄ«dans tenÄ“i autenginna, Ä“rgi gilluwan stÄ“isan 5 autengÄ«nsenin',
'right-sendemail' => 'Tenginnais e-mailin kitēimans tērpautajans',
+# Special:Log/newusers
+'newuserlogpage' => 'NÄunai tÄ“rpautajai',
+'newuserlogpagetext' => 'Sta ast registerin stÄ“isan nÄunai teÄ«katan rekkenan stÄ“isan tÄ“rpautajan',
+
# User rights log
'rightslog' => 'Registerin stēisan tērpautajan enwarīnsenin',
'rightslogtext' => 'Sta ast registerin stēisan tērpautajan ewarīnsenin kitawīdinsnan.',
-'rightslogentry' => 'ast kitawÄ«dinuns(si) $1 perlÄnksnan prei gruppins ($2 → $3)',
-'rightsnone' => '(nisÄtausna)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'skaitÄtun Å¡in pÄusan',
@@ -1530,10 +1527,6 @@ EbÅ¡lÅ«zitai prÅtokulai: <code>$1</code>',
'activeusers-hidesysops' => 'Kliptinais perwaldītajans',
'activeusers-noresult' => 'Ni aupalÄ di tÄ“rpautajans',
-# Special:Log/newusers
-'newuserlogpage' => 'NÄunai tÄ“rpautajai',
-'newuserlogpagetext' => 'Sta ast registerin stÄ“isan nÄunai teÄ«katan rekkenan stÄ“isan tÄ“rpautajan',
-
# Special:ListGroupRights
'listgrouprights' => 'Tērpautajan gruppin enwarīnsenei',
'listgrouprights-summary' => 'Zemmais ast listi stÄ“isan tÄ“rpautajan gruppin definÄ«tan en Å¡issei wiki sen enwarÄ«nsenins preipeisÄtan tenÄ“imans.
@@ -1610,14 +1603,12 @@ EraÄ«na Å¡isse pÄusas Ä“nturas kitawÄ«dinsna anga diskusiÅnis pÄusas sÄ“itan
'enotif_mailer' => 'Pawakīsenis iz {{SITENAME}}',
'enotif_reset' => 'Ebzentlis wissans pÄusans per kÄimalukitans',
-'enotif_newpagetext' => 'Sta ast nÄunan pÄusan.',
'enotif_impersonal_salutation' => 'tērpautajs stesse {{SITENAME}}',
-'changed' => 'kitawīdintan',
-'created' => 'teīktan',
-'enotif_subject' => 'PÄusan $PAGETITLE en {{SITENAME}} pastÄi $CHANGEDORCREATED pra $PAGEEDITOR',
'enotif_lastvisited' => 'WÄ«dais en $1 wissans kitawÄ«dinsnans ezze Twajjai panzdauman kÄimalukisenin.',
'enotif_lastdiff' => 'Wīdais en $1 šan kitawīdisnan.',
'enotif_anon_editor' => 'anÅnims tÄ“rpautajs $1',
+'created' => 'teīktan',
+'changed' => 'kitawīdintan',
# Delete
'deletepage' => 'Ä€upausinais pÄusan',
@@ -2716,6 +2707,6 @@ EnpeisÄis zÅ«rbrukes pabilÄ«snan Å¡lÄit "{{ns:file}}:" prefiksan.',
# New logging system
'revdelete-restricted' => 'ensadinnais arÄikinsenins per perwaldÄ«tajans',
'revdelete-unrestricted' => 'Äupausinais arÄikinsenins per perwaldÄ«tajans',
-'newuserlog-byemail' => 'kliptaswīrds tengīntan pra e-mail',
+'rightsnone' => '(nisÄtausna)',
);
diff --git a/languages/messages/MessagesPs.php b/languages/messages/MessagesPs.php
index d40e92aa..20209510 100644
--- a/languages/messages/MessagesPs.php
+++ b/languages/messages/MessagesPs.php
@@ -12,6 +12,8 @@
* @author Umherirrender
*/
+$rtl = true;
+
$namespaceNames = array(
NS_MEDIA => 'رسنÛ',
NS_SPECIAL => 'Úانګړی',
@@ -155,8 +157,6 @@ $magicWords = array(
'protectionlevel' => array( '1', 'ژغورکچه', 'PROTECTIONLEVEL' ),
);
-$rtl = true;
-
$messages = array(
# User preference toggles
'tog-underline' => 'Ú©Ø±ÚšÙ†Û ØªÚ“Ù†Û:',
@@ -300,7 +300,6 @@ $messages = array(
'qbbrowse' => 'سپړل',
'qbedit' => 'سمول',
'qbpageoptions' => 'همدا مخ',
-'qbpageinfo' => 'متن',
'qbmyoptions' => 'زما پاڼÛ',
'qbspecialpages' => 'Úانګړي مخونه',
'faq' => 'Ú‰-Ú-Ù¾',
@@ -323,6 +322,7 @@ $messages = array(
'namespaces' => 'نوم-تشيالونه',
'variants' => 'ډولونه',
+'navigation-heading' => 'ګرÚښت غورنÛ',
'errorpagetitle' => 'تÛروتنه',
'returnto' => 'بÛرته $1 ته وګرÚÙ‡.',
'tagline' => 'د {{SITENAME}} لخوا',
@@ -533,11 +533,9 @@ $1',
# Login and logout pages
'logouttext' => "'''ØªØ§Ø³Û Ø§ÙˆØ³ د غونډال نه ووتلی.'''
-ØªØ§Ø³Û Ú©ÙˆÙ„Ø§ÛŒ Ø´ÛŒ Ú†Û Ø¯ کارن-نوم نه پرته په ورکنومي توګه {{SITENAME}} وکاروی، او يا هم په Ù‡Ù…Ø¯Û Ø§Ùˆ يا کوم بل کارن-نوم، يو ÚÙ„ [[Special:UserLogin|بيا غونډال ته ورننوÚÛ]].
+ØªØ§Ø³Û Ú©ÙˆÙ„Ø§ÛŒ Ø´ÛŒ Ú†Û Ø¯ کارن-نوم نه پرته په ورکنومي توګه {{SITENAME}} وکاروی، او يا هم په Ù‡Ù…Ø¯Û Ø§Ùˆ يا کوم بل کارن-نوم، يو ÚÙ„ <span class='plainlinks'>[$1 بيا غونډال ته ورننوÚÛ]</span>.
دا په پام Ú©Û ÙˆØ³Ø§ØªÛ Ú†Û ØªØ± Ú…Ùˆ ØªØ§Ø³Û Ø¯ خپل کتنمل حاÙظه نه وي سپينه Ú©Ú“ÛØŒ نو ÚÙŠÙ†Û Ù…Ø®ÙˆÙ†Ùˆ Ú©Û Ø¨Ù‡ لا تر اوسه Ù¾ÙˆØ±Û Ù¾Ù‡ غونډال Ú©Û Ù†Ù†ÙˆØªÙŠ ښکارÛ.",
-'welcomecreation' => '==$1 ÚšÙ‡ راغلÛ! ==
-
-Ø³ØªØ§Ø³Û Ú«Ú¼ÙˆÙ† جوړ شو. لطÙاً د خپلو [[Special:Preferences|{{SITENAME}} غوره توبونو]] ټاکل مو مه Ù‡Ûروی.',
+'welcomeuser' => '$1ØŒ ÚšÙ‡ راغلÛ!',
'yourname' => 'کارن-نوم:',
'yourpassword' => 'پټنوم:',
'yourpasswordagain' => 'پټنوم بيا وليکه',
@@ -558,7 +556,7 @@ $1',
'gotaccount' => 'آيا وار Ø¯Ù…Ø®Û ÙŠÙˆ ګڼون لری؟ $1.',
'gotaccountlink' => 'ننوتل',
'userlogin-resetlink' => 'د ننوتلو مالومات مو Ù‡Ûر شوي؟',
-'createaccountmail' => 'د برÛښليک له مخÛ',
+'createaccountmail' => 'يو لنډمهاله ناټاکلی پټنوم کارول او په Ù„Ø§Ù†Ø¯Û ÙˆØ±Ú©Ú“Ù„ Ø´ÙˆÛ Ø¨Ø±Ûښليک پته Ú©Û ÙˆØ±Ù„ÛÚ–Ù„',
'createaccountreason' => 'سبب:',
'badretype' => 'دا پټنوم Ú†Û ØªØ§Ø³Û Ù„ÙŠÚ©Ù„ÛŒ د مخکني پټنوم سره ورته نه دی.',
'userexists' => 'کوم کارن نوم Ú†Û ØªØ§Ø³Û ÙˆØ±Ú©Ú“ÛŒ هغه بل چا کارولی.
@@ -668,6 +666,7 @@ $1',
'changeemail-oldemail' => 'Ø§ÙˆØ³Ù†Û Ø¨Ø±Ûښليک پته:',
'changeemail-newemail' => 'Ù†ÙˆÛ Ø¨Ø±Ûښليک پته:',
'changeemail-none' => '(Ù‡ÛÚ…)',
+'changeemail-password' => 'Ø³ØªØ§Ø³Û Ø¯{{SITENAME}} پټنوم:',
'changeemail-submit' => 'برÛښليک بدلول',
'changeemail-cancel' => 'ناګارل',
@@ -799,7 +798,6 @@ $1',
'template-protected' => '(ژغورلی)',
'template-semiprotected' => '(نيم-ژغورلی)',
'hiddencategories' => 'دا مخ د {{PLURAL:$1|1 Ù¾Ù¼Û ÙˆÛشنيزÛ|$1 پټو ÙˆÛشنيزو}} يو غړی دی:',
-'nocreatetitle' => 'د مخ جوړول بريد ټاکلی دی',
'nocreatetext' => '{{SITENAME}} د نوو مخونو د جوړولو وړتيا محدوده Ú©Ú“Û.
تاسو بÛرته پر شا تللای Ø´ÛŒ او په شته مخونو Ú©Û Ø³Ù…ÙˆÙ†Û ØªØ±Ø³Ø±Ù‡ کولای شی، او يا هم [[Special:UserLogin|غونډال ته ننوتلای او يو ګڼون جوړولای Ø´ÛŒ]].',
'nocreate-loggedin' => 'ØªØ§Ø³Û Ø¯ نوو مخونو د جوړولو پرÛښله نلرÛ.',
@@ -823,6 +821,12 @@ $1',
Ù¾Ø¯Û Ù†ÙˆÙ… د پخوا نه يو مخ شته.',
'defaultmessagetext' => 'تلواليزه پيغام متن',
+# Content models
+'content-model-wikitext' => 'ويکي متن',
+'content-model-text' => 'ساده متن',
+'content-model-javascript' => 'جاواسکرÛپټ',
+'content-model-css' => 'CSS',
+
# Parser/template warnings
'post-expand-template-inclusion-warning' => "'''ګواښنه:''' دا Ú©ÙŠÙ†Ú‰Û Ø¯ خپل ټاکلي بريد نه Ú‰Ûره لويه ده.
ÚÙŠÙ†Û Ú©ÙŠÙ†Ú‰Û Ø¨Ù‡ په Ú©Û Ú«Ú‰Û Ù†Ù‡ شي.",
@@ -1063,9 +1067,9 @@ $1',
'prefs-emailconfirm-label' => 'د برÛښليک باورتيا:',
'prefs-textboxsize' => 'د سمون Ú©Ú“Ú©Û Ú©Ú†Ù‡',
'youremail' => 'برÛښليک *',
-'username' => 'کارن-نوم:',
-'uid' => 'د کارن Ù¾Ûژندنه:',
-'prefs-memberingroups' => 'د {{PLURAL:$1|Ú‰Ù„Û|ډلو}} غړی:',
+'username' => '{{GENDER:$1|کارن نوم}}:',
+'uid' => '{{GENDER:$1|کارن}} Ù¾Ûژندنه:',
+'prefs-memberingroups' => 'د {{PLURAL:$1|ډله|Ú‰Ù„Û}} {{GENDER:$2|غړی}}:',
'prefs-registration' => 'د Ù†ÙˆÙ…Ù„ÙŠÚ©Ù†Û ÙˆØ®Øª:',
'yourrealname' => 'اصلي نوم:',
'yourlanguage' => 'ژبه:',
@@ -1168,10 +1172,13 @@ $1',
'right-userrights-interwiki' => 'په نورو ويکي ګانو د نورو کارنانو کارن-Ø±ÚšØªÛ Ø³Ù…ÙˆÙ„',
'right-sendemail' => 'نورو کارنانو ته برÛښليک Ù„ÛÚ–Ù„',
+# Special:Log/newusers
+'newuserlogpage' => 'د کارن-نوم د جوړÛدو يادښت',
+'newuserlogpagetext' => 'دا د کارن-نوم د جوړÛدو يادښت دی',
+
# User rights log
'rightslog' => 'د کارن د رښتو يادښت',
'rightslogtext' => 'دا د کارن رښتو د بدلونونو يو يادښت دی',
-'rightsnone' => '(Ù‡ÛÚ…)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'همدا مخ لوستل',
@@ -1456,6 +1463,8 @@ $1',
'disambiguations' => 'د مبهمو مخونو سره تړلي مخونه',
'disambiguationspage' => 'Template:ناجوت',
+'pageswithprop-submit' => 'ورÚÙ‡',
+
'doubleredirects' => 'دوه Úلي ورګرÚÛدنÛ',
'brokenredirects' => 'Ù…Ø§ØªÛ ÙˆØ±Ú«Ø±ÚÛدنÛ',
@@ -1594,10 +1603,6 @@ $1',
'activeusers-hidesysops' => 'پازوالان پټول',
'activeusers-noresult' => 'کارن و نه موندل شو.',
-# Special:Log/newusers
-'newuserlogpage' => 'د کارن-نوم د جوړÛدو يادښت',
-'newuserlogpagetext' => 'دا د کارن-نوم د جوړÛدو يادښت دی',
-
# Special:ListGroupRights
'listgrouprights' => 'د کارن ډلو رښتÛ',
'listgrouprights-group' => 'ډله',
@@ -1677,11 +1682,17 @@ $1',
'enotif_mailer' => 'د {{SITENAME}} خبرتيايي برÛښليک',
'enotif_reset' => 'ټول مخونه کتل شوي نخښه کول',
-'enotif_newpagetext' => 'دا يوه Ù†ÙˆÛ Ù¾Ø§Ú¼Ù‡ ده.',
'enotif_impersonal_salutation' => '{{SITENAME}} کارن',
-'changed' => 'بدلÛدلی',
-'created' => 'جوړ شو',
-'enotif_subject' => 'د {{SITENAME}} مخ $PAGETITLE د $PAGEEDITOR لخوا $CHANGEDORCREATED',
+'enotif_subject_deleted' => 'د {{SITENAME}} مخ $1 د {{gender:$2|$2}} لخوا ړنګ شوی',
+'enotif_subject_created' => 'د {{SITENAME}} مخ $1 د {{gender:$2|$2}} لخوا جوړ شوی',
+'enotif_subject_moved' => 'د {{SITENAME}} مخ $1 د {{gender:$2|$2}} لخوا Ù„Ûږدول شوی',
+'enotif_subject_restored' => 'د {{SITENAME}} مخ $1 د {{gender:$2|$2}} لخوا بيازÛرمل شوی',
+'enotif_subject_changed' => 'د {{SITENAME}} مخ $1 د {{gender:$2|$2}} لخوا بدل شوی',
+'enotif_body_intro_deleted' => 'د {{SITENAME}} مخ $1 په $ د {{gender:$2|$2}} لخوا Ú“Ù†Ú« شوی، $3 وګورÛ.',
+'enotif_body_intro_created' => 'د {{SITENAME}} مخ $1 په $PAGEEDITDATE د {{gender:$2|$2}} لخوا جوړ شوی، د Ø§ÙˆØ³Ù†Û Ø¨Ú¼Û Ú©ØªÙ„Ùˆ لپاره $3 وګورÛ.',
+'enotif_body_intro_moved' => 'د {{SITENAME}} مخ $1 په $PAGEEDITDATE د {{gender:$2|$2}} لخوا Ù„Ûږدول شوی، د Ø§ÙˆØ³Ù†Û Ø¨Ú¼Û Ú©ØªÙ„Ùˆ لپاره $3 وګورÛ.',
+'enotif_body_intro_restored' => 'د {{SITENAME}} مخ $1 په $PAGEEDITDATE د {{gender:$2|$2}} لخوا بيازÛرمل شوی، د Ø§ÙˆØ³Ù†Û Ø¨Ú¼Û Ú©ØªÙ„Ùˆ لپاره $3 وګورÛ.',
+'enotif_body_intro_changed' => 'د {{SITENAME}} مخ $1 په $PAGEEDITDATE د {{gender:$2|$2}} لخوا بدل شوی، د Ø§ÙˆØ³Ù†Û Ø¨Ú¼Û Ú©ØªÙ„Ùˆ لپاره $3 وګورÛ.',
'enotif_lastvisited' => 'د ټولو هغو بدلونونو د کتلو لپاره Ú†Û Ø³ØªØ§Ø³Ùˆ د وروستي ÚÙ„ راتګ نه وروسته Ù¾ÛÚšÛ Ø´ÙˆÙŠØŒ $1 وګورÛ.',
'enotif_lastdiff' => 'د همدغه بدلون د کتلو لپاره $1 وګورÛ.',
'enotif_anon_editor' => 'ورکنومی کارن $1',
@@ -1714,6 +1725,8 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
انګÛØ±Ù†Û Ø§Ùˆ Ù†ÙˆØ±Û Ù…Ø±Ø³ØªÛ:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'جوړ شو',
+'changed' => 'بدلÛدلی',
# Delete
'deletepage' => 'مخ ړنګول',
@@ -1824,7 +1837,7 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'blanknamespace' => '(آرنی)',
# Contributions
-'contributions' => 'د کارن ونډÛ',
+'contributions' => '{{GENDER:$1|کارن}} ونډÛ',
'contributions-title' => 'د $1 کارن ونډÛ',
'mycontris' => 'ونډÛ',
'contribsub2' => 'د $1 لپاره ($2)',
@@ -2151,6 +2164,7 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'pageinfo-display-title' => 'ښکارÛدونکی سرليک',
'pageinfo-length' => 'مخ اوږدوالی (په بايټونو)',
'pageinfo-article-id' => 'د مخ Ù¾Ûژند',
+'pageinfo-language' => 'د مخ د Ù…ÛÙ†ÚÙ¾Ø§Ù†Ú«Û Ú˜Ø¨Ù‡',
'pageinfo-robot-policy' => 'د پلټن ماشين دريÚ',
'pageinfo-robot-index' => 'ليکلړوړ',
'pageinfo-robot-noindex' => 'ليکلړوړ نه',
@@ -2162,6 +2176,11 @@ $UNWATCHURL نه ليدنه ÙˆÚ©Ú“Û
'pageinfo-firsttime' => 'د مخ جوړÛØ¯Ù†Û Ù†Ûټه',
'pageinfo-lastuser' => 'وروستنی سمونګر',
'pageinfo-edits' => 'د ټولو سمونونو شمÛر',
+'pageinfo-toolboxlink' => 'د مخ مالومات',
+'pageinfo-redirectsto-info' => 'مالومات',
+'pageinfo-contentpage' => 'Ù…ÛÙ†Úپانګيز مخ Ú©Û Ø´Ù…Ûرل شوی',
+'pageinfo-contentpage-yes' => 'هو',
+'pageinfo-protect-cascading-yes' => 'هو',
# Skin names
'skinname-standard' => 'کلاسيک',
@@ -2666,16 +2685,16 @@ $5
'htmlform-selectorother-other' => 'بل',
# New logging system
-'logentry-delete-delete' => '$1 د $3 مخ ړنګ کړ',
+'logentry-delete-delete' => '$1 د $3 مخ {{GENDER:$2|ړنګ کړ}}',
'revdelete-content-hid' => 'Ù…ÛÙ†Úپانګه پټÛدلÛ',
'revdelete-uname-hid' => 'کارن نوم پټ شوی',
'revdelete-content-unhid' => 'Ù…ÛÙ†Úپانګه ښکاره شوی',
'revdelete-uname-unhid' => 'ښکاره کارن-نوم',
-'logentry-move-move' => '$1 د $3 مخ $4 ته ولÛږداوه',
-'logentry-newusers-newusers' => 'د $1 کارن ګڼون جوړ شو',
-'logentry-newusers-create' => 'د $1 کارن ګڼون جوړ شو',
-'logentry-newusers-autocreate' => 'د $1 ګڼون په اتوماتيک ډول جوړ شو',
-'newuserlog-byemail' => 'پټنوم مو برÛښليک ته درولÛÚ–Ù‡',
+'logentry-move-move' => '$1 د $3 مخ $4 ته {{GENDER:$2|ولÛږداوه}}',
+'logentry-newusers-newusers' => 'د $1 کارن ګڼون {{GENDER:$2|جوړ شو}}',
+'logentry-newusers-create' => 'د $1 کارن ګڼون {{GENDER:$2|جوړ شو}}',
+'logentry-newusers-autocreate' => 'د $1 ګڼون په اتوماتيک ډول {{GENDER:$2|جوړ شو}}',
+'rightsnone' => '(Ù‡ÛÚ…)',
# Feedback
'feedback-subject' => 'سکالو:',
diff --git a/languages/messages/MessagesPt.php b/languages/messages/MessagesPt.php
index 749d6aac..21aa249f 100644
--- a/languages/messages/MessagesPt.php
+++ b/languages/messages/MessagesPt.php
@@ -157,6 +157,7 @@ $specialPageAliases = array(
'Mytalk' => array( 'Minha_discussão' ),
'Newimages' => array( 'Ficheiros_novos', 'Imagens_novas', 'Arquivos_novos' ),
'Newpages' => array( 'Páginas_novas', 'Artigos_novos' ),
+ 'PermanentLink' => array( 'Ligação_permanente', 'Link_permanente' ),
'Popularpages' => array( 'Páginas_populares', 'Artigos_populares' ),
'Preferences' => array( 'Preferências' ),
'Prefixindex' => array( 'Ãndice_por_prefixo', 'Ãndice_de_prefixo' ),
@@ -204,7 +205,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÃRIO__', '__FORCETOC__' ),
'toc' => array( '0', '__TDC__', '__SUMÃRIO__', '__SUMARIO__', '__TOC__' ),
'noeditsection' => array( '0', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__NAOEDITARSECAO__', '__SEMEDITARSECAO__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÃTULO__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'MESATUAL1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
@@ -446,6 +446,7 @@ $messages = array(
'newwindow' => '(abre numa janela nova)',
'cancel' => 'Cancelar',
'moredotdotdot' => 'Mais...',
+'morenotlisted' => 'Mais não listadas...',
'mypage' => 'Página',
'mytalk' => 'Discussão',
'anontalk' => 'Discussão para este IP',
@@ -457,7 +458,6 @@ $messages = array(
'qbbrowse' => 'Navegar',
'qbedit' => 'Editar',
'qbpageoptions' => 'Esta página',
-'qbpageinfo' => 'Contexto',
'qbmyoptions' => 'Minhas páginas',
'qbspecialpages' => 'Páginas especiais',
'faq' => 'FAQ',
@@ -480,6 +480,7 @@ $messages = array(
'namespaces' => 'Espaços nominais',
'variants' => 'Variantes',
+'navigation-heading' => 'Menu de navegação',
'errorpagetitle' => 'Erro',
'returnto' => 'Voltar para $1.',
'tagline' => 'Da {{SITENAME}}',
@@ -720,11 +721,11 @@ O administrador que efetuou o bloqueio deu a seguinte explicação: "$3".',
# Login and logout pages
'logouttext' => "'''Já não está autenticado.'''
-Pode continuar a utilizar a {{SITENAME}} anonimamente, ou pode [[Special:UserLogin|autenticar-se novamente]] com o mesmo nome de utilizador ou com um nome de utilizador diferente.
+Pode continuar a utilizar a {{SITENAME}} anonimamente, ou pode <span class='plainlinks'>[$1 autenticar-se novamente]</span> com o mesmo nome de utilizador ou com um nome de utilizador diferente.
Tenha em atenção que algumas páginas poderão continuar a ser apresentadas como se ainda estivesse autenticado até limpar a cache do seu browser.",
-'welcomecreation' => '== Bem-vindo, $1! ==
-A sua conta foi criada.
-Não se esqueça de personalizar as suas [[Special:Preferences|preferências na {{SITENAME}}]].',
+'welcomeuser' => 'Bem-vindo, $1!',
+'welcomecreation-msg' => 'A sua conta foi criada.
+Não se esqueça de personalizar as suas [[Special:Preferences|preferências]].',
'yourname' => 'Nome de utilizador:',
'yourpassword' => 'Palavra-chave:',
'yourpasswordagain' => 'Repita a palavra-chave:',
@@ -747,7 +748,7 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências na
'gotaccount' => "Já possui uma conta? '''$1'''.",
'gotaccountlink' => 'Autentique-se',
'userlogin-resetlink' => 'Esqueceu-se do seu nome de utilizador ou da palavra-chave?',
-'createaccountmail' => 'por correio electrónico',
+'createaccountmail' => 'Usar uma palavra passe aleatória e temporária e enviar para o endereço de e-mail especificado abaixo',
'createaccountreason' => 'Motivo:',
'badretype' => 'As palavras-chave que introduziu não são iguais.',
'userexists' => 'O nome de utilizador introduzido já existe.
@@ -1069,7 +1070,6 @@ Para referência, é apresentada abaixo a última entrada do registo:",
'template-semiprotected' => '(semi-protegida)',
'hiddencategories' => 'Esta página pertence a {{PLURAL:$1|uma categoria oculta|$1 categorias ocultas}}:',
'edittools' => '<!-- O texto colocado aqui será mostrado abaixo dos formulários de edição e de envio de ficheiros. -->',
-'nocreatetitle' => 'A criação de páginas encontra-se limitada',
'nocreatetext' => 'A {{SITENAME}} restringe a criação de páginas novas por utilizadores anónimos.
Pode voltar atrás e editar uma página já existente, ou [[Special:UserLogin|autenticar-se ou criar uma conta]].',
'nocreate-loggedin' => 'Não possui permissão para criar novas páginas.',
@@ -1094,6 +1094,13 @@ Ela parece ter sido eliminada.',
'edit-already-exists' => 'Não foi possível criar uma página nova.
Ela já existia.',
'defaultmessagetext' => 'Texto da mensagem padrão',
+'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitexto',
+'content-model-text' => 'texto simples',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Aviso: Esta página contém demasiadas chamadas de funções exigentes do analisador sintáctico.
@@ -1467,9 +1474,9 @@ Esta operação não pode ser desfeita.',
'prefs-emailconfirm-label' => 'Confirmação do endereço:',
'prefs-textboxsize' => 'Tamanho da janela de edição',
'youremail' => 'Correio electrónico:',
-'username' => 'Nome de utilizador:',
+'username' => 'Nome de {{GENDER:$1|utilizador|utilizadora}}:',
'uid' => 'Número de identificação:',
-'prefs-memberingroups' => 'Membro {{PLURAL:$1|do grupo|dos grupos}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:',
'prefs-registration' => 'Hora de registo:',
'yourrealname' => 'Nome verdadeiro:',
'yourlanguage' => 'Língua:',
@@ -1618,12 +1625,13 @@ Esta informação será pública.',
'right-sendemail' => 'Enviar correio electrónico a outros utilizadores',
'right-passwordreset' => 'Ver emails de reposição de palavras-chave',
+# Special:Log/newusers
+'newuserlogpage' => 'Registo de criação de utilizadores',
+'newuserlogpagetext' => 'Este é um registo de novas contas de utilizador',
+
# User rights log
'rightslog' => 'Registo de privilégios de utilizador',
'rightslogtext' => 'Este é um registo de mudanças nos privilégios dos utilizadores.',
-'rightslogentry' => 'alterou grupos de $1 (de $2 para $3)',
-'rightslogentry-autopromote' => 'foi automaticamente promovido de $2 para $3',
-'rightsnone' => '(nenhum)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ler esta página',
@@ -2257,9 +2265,9 @@ Veja também as [[Special:WantedCategories|categorias desejadas]].',
'linksearch-pat' => 'Padrão de busca:',
'linksearch-ns' => 'Espaço nominal:',
'linksearch-ok' => 'Prosseguir',
-'linksearch-text' => 'É possível usar caracteres de substituição \'\'(wildcards)\'\', como por exemplo: "*.wikipedia.org".
+'linksearch-text' => 'É possível usar caracteres de substituição \'\'(wildcards)\'\', tais como "*.wikipedia.org".
É necessário, pelo menos, um domínio de topo, por exemplo "*.org".<br />
-Protocolos suportados: <code>$1</code> (não adicione nenhum destes na sua pesquisa).',
+{{PLURAL:$2|Protocolo suportado|Protocolos suportados}}: <code>$1</code> (será utilizado http:// se não for especificado um protocolo).',
'linksearch-line' => 'Link para $1 na página $2',
'linksearch-error' => "Caracteres de substituição ''(wildcards)'' só podem ser usados no início do endereço.",
@@ -2278,10 +2286,6 @@ Protocolos suportados: <code>$1</code> (não adicione nenhum destes na sua pesqu
'activeusers-hidesysops' => 'Esconder administradores',
'activeusers-noresult' => 'Nenhum utilizador encontrado.',
-# Special:Log/newusers
-'newuserlogpage' => 'Registo de criação de utilizadores',
-'newuserlogpagetext' => 'Este é um registo de novas contas de utilizador',
-
# Special:ListGroupRights
'listgrouprights' => 'Privilégios dos grupos de utilizadores',
'listgrouprights-summary' => 'A seguinte lista contém os grupos de utilizadores definidos nesta wiki, com os respectivos privilégios de acesso.
@@ -2376,20 +2380,13 @@ O nome desta página passará a aparecer a '''negrito''' na lista de [[Special:R
'enotif_mailer' => 'Gerador de Notificações da {{SITENAME}}',
'enotif_reset' => 'Marcar todas as páginas como visitadas',
-'enotif_newpagetext' => 'Esta é uma página nova.',
'enotif_impersonal_salutation' => 'Utilizador da "{{SITENAME}}"',
-'changed' => 'alterada',
-'created' => 'criada',
-'enotif_subject' => '{{SITENAME}}: A página $PAGETITLE foi $CHANGEDORCREATED por $PAGEEDITOR',
'enotif_lastvisited' => 'Consulte $1 para todas as alterações efectuadas desde a sua última visita.',
'enotif_lastdiff' => 'Consulte $1 para ver esta alteração.',
'enotif_anon_editor' => 'utilizador anónimo $1',
-'enotif_body' => 'Caro(a) $WATCHINGUSERNAME,
-
-
-A página $PAGETITLE da {{SITENAME}} foi $CHANGEDORCREATED a $PAGEEDITDATE por $PAGEEDITOR; consulte $PAGETITLE_URL para ver a versão actual.
+'enotif_body' => '{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}},
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Resumo da edição: $PAGESUMMARY $PAGEMINOREDIT
@@ -2414,6 +2411,8 @@ $UNWATCHURL
Para comentários e pedidos de ajuda:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'criada',
+'changed' => 'alterada',
# Delete
'deletepage' => 'Eliminar página',
@@ -2567,7 +2566,8 @@ Pode ter usado um link incorrecto ou talvez a revisão tenha sido restaurada ou
'undeletedrevisions' => '$1 {{PLURAL:$1|edição restaurada|edições restauradas}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$2|edição restaurada|edições restauradas}} e $2 {{PLURAL:$2|ficheiro restaurado|ficheiros restaurados}}',
'undeletedfiles' => '{{PLURAL:$1|ficheiro restaurado|$1 ficheiros restaurados}}',
-'cannotundelete' => 'Restauração falhada; alguém talvez já restaurou a página.',
+'cannotundelete' => 'Restauração falhada:
+$1',
'undeletedpage' => "'''$1 foi restaurada'''
Consulte o [[Special:Log/delete|registo de eliminações]] para um registo das eliminações e restaurações mais recentes.",
@@ -2598,7 +2598,7 @@ $1',
'blanknamespace' => '(Principal)',
# Contributions
-'contributions' => 'Contribuições do utilizador',
+'contributions' => 'Contribuições {{GENDER:$1|do utilizador|da utilizadora}}',
'contributions-title' => 'Contribuições {{GENDER:$1|do utilizador|da utilizadora}} $1',
'mycontris' => 'Contribuições',
'contribsub2' => 'Para $1 ($2)',
@@ -2870,6 +2870,7 @@ não é possível mover uma página para ela mesma.',
'immobile-target-namespace-iw' => 'Um link interwikis não é um destino válido para uma movimentação de página.',
'immobile-source-page' => 'Esta página não pode ser movida.',
'immobile-target-page' => 'Não é possível mover para esse título de destino.',
+'bad-target-model' => 'O destino pretendido usa um modelo de conteúdo diferente. Não é possível converter de $1 para $2.',
'imagenocrossnamespace' => 'Não é possível mover imagem para espaço nominal que não de imagens',
'nonfile-cannot-move-to-file' => 'Não é possível mover algo que não é um ficheiro para o espaço nominal de ficheiros',
'imagetypemismatch' => 'A extensão do novo ficheiro não corresponde ao seu tipo',
@@ -2995,7 +2996,6 @@ Não há um directório temporário.',
# JavaScriptTest
'javascripttest' => 'Teste de JavaScript',
-'javascripttest-disabled' => 'Esta função está desabilitada neste wiki.',
'javascripttest-title' => 'Executando os testes $1',
'javascripttest-pagetext-noframework' => 'Esta página é reservada para a execução de testes de JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Estrutura de testes "$1" desconhecido.',
@@ -3136,6 +3136,7 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
'pageinfo-display-title' => 'Exibir título',
'pageinfo-length' => 'Tamanho da página (em bytes)',
'pageinfo-article-id' => 'ID da página',
+'pageinfo-language' => 'Idioma do conteúdo da página',
'pageinfo-robot-policy' => 'Status do mecanismo de pesquisa',
'pageinfo-robot-index' => 'Indexável',
'pageinfo-robot-noindex' => 'Não indexável',
@@ -3154,6 +3155,16 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
'pageinfo-recent-authors' => 'Número recente de autores distintos',
'pageinfo-magic-words' => '{{PLURAL:$1|Palavra mágica|Palavras mágicas}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categorias ocultas}} ($1)',
+'pageinfo-toolboxlink' => 'Informações da página',
+'pageinfo-redirectsto' => 'Redireciona para',
+'pageinfo-redirectsto-info' => 'informação',
+'pageinfo-contentpage' => 'Contada como página de conteúdo',
+'pageinfo-contentpage-yes' => 'Sim',
+'pageinfo-protect-cascading-yes' => 'Sim',
+'pageinfo-category-info' => 'Informações da categoria',
+'pageinfo-category-pages' => 'Número de páginas',
+'pageinfo-category-subcats' => 'Número de subcategorias',
+'pageinfo-category-files' => 'Número de ficheiros',
# Skin names
'skinname-standard' => 'Clássico',
@@ -3209,6 +3220,7 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
'file-nohires' => 'Sem resolução maior disponível.',
'svg-long-desc' => 'ficheiro SVG, de $1 × $2 pixels, tamanho: $3',
'svg-long-desc-animated' => 'ficheiro SVG animado, de $1 × $2 pixels, tamanho: $3',
+'svg-long-error' => 'Ficheiro SVG inválido: $1',
'show-big-image' => 'Resolução completa',
'show-big-image-preview' => 'Tamanho desta antevisão: $1.',
'show-big-image-other' => '{{PLURAL:$2|Outra resolução|Outras resoluções}}: $1.',
@@ -3238,7 +3250,10 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
'minutes' => '{{PLURAL:$1|um minuto|$1 minutos}}',
'hours' => '{{PLURAL:$1|uma hora|$1 horas}}',
'days' => '{{PLURAL:$1|um dia|$1 dias}}',
+'months' => '{{PLURAL:$1|1 mês|$1 meses}}',
+'years' => '{{PLURAL:$1|1 ano|$1 anos}}',
'ago' => '$1 atrás',
+'just-now' => 'agora mesmo',
# Bad image list
'bad_image_list' => 'O formato é o seguinte:
@@ -3996,7 +4011,9 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
'logentry-newusers-create' => 'A conta de utilizador $1 foi criada',
'logentry-newusers-create2' => 'A conta de utilizador $3 foi criada por $1',
'logentry-newusers-autocreate' => 'A conta $1 foi criada automaticamente',
-'newuserlog-byemail' => 'palavra-chave enviada por correio-electrónico',
+'logentry-rights-rights' => '$1 modificou os privilégios do utilizador $3 de $4 para $5',
+'logentry-rights-autopromote' => '$1 foi automaticamente {{GENDER:$2|promovido|promovida}} de $4 a $5',
+'rightsnone' => '(nenhum)',
# Feedback
'feedback-bugornote' => 'Se está pronto para descrever um problema técnico em detalhe, por favor, [$1 comunique o defeito].
diff --git a/languages/messages/MessagesPt_br.php b/languages/messages/MessagesPt_br.php
index 11de3117..4be2cbea 100644
--- a/languages/messages/MessagesPt_br.php
+++ b/languages/messages/MessagesPt_br.php
@@ -43,6 +43,7 @@
* @author ManoDbo
* @author McDutchie
* @author MetalBrasil
+ * @author MisterSanderson
* @author Opraco
* @author Pedroca cerebral
* @author Ppena
@@ -161,6 +162,7 @@ $specialPageAliases = array(
'Mytalk' => array( 'Minha_discussão' ),
'Newimages' => array( 'Arquivos_novos', 'Imagens_novas', 'Ficheiros_novos' ),
'Newpages' => array( 'Páginas_novas', 'Artigos_novos' ),
+ 'PermanentLink' => array( 'Ligação_permanente', 'Link_permanente' ),
'Popularpages' => array( 'Páginas_populares', 'Artigos_populares' ),
'Preferences' => array( 'Preferências' ),
'Prefixindex' => array( 'Ãndice_de_prefixo', 'Ãndice_por_prefixo' ),
@@ -208,7 +210,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÃRIO__', '__FORCETOC__' ),
'toc' => array( '0', '__TDC__', '__SUMARIO__', '__SUMÃRIO__', '__TOC__' ),
'noeditsection' => array( '0', '__NAOEDITARSECAO__', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__SEMEDITARSECAO__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÃTULO__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'MESATUAL1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'NOMEDOMESATUAL', 'CURRENTMONTHNAME' ),
@@ -451,6 +452,7 @@ $messages = array(
'newwindow' => '(abre em uma nova janela)',
'cancel' => 'Cancelar',
'moredotdotdot' => 'Mais...',
+'morenotlisted' => 'Outros não listados...',
'mypage' => 'Página',
'mytalk' => 'Discussão',
'anontalk' => 'Discussão para este IP',
@@ -462,7 +464,6 @@ $messages = array(
'qbbrowse' => 'Navegar',
'qbedit' => 'Editar',
'qbpageoptions' => 'Esta página',
-'qbpageinfo' => 'Contexto',
'qbmyoptions' => 'Minhas páginas',
'qbspecialpages' => 'Páginas especiais',
'faq' => 'FAQ',
@@ -485,6 +486,7 @@ $messages = array(
'namespaces' => 'Espaços nominais',
'variants' => 'Variantes',
+'navigation-heading' => 'Menu de navegação',
'errorpagetitle' => 'Erro',
'returnto' => 'Retornar para $1.',
'tagline' => 'De {{SITENAME}}',
@@ -729,10 +731,10 @@ O administrador que bloqueou ofereceu a seguinte explicação: "$3".',
# Login and logout pages
'logouttext' => "'''Agora você encontra-se desautenticado.'''
-É possível continuar usando {{SITENAME}} anonimamente ou [[Special:UserLogin|autenticar-se novamente]] com o mesmo nome de usuário ou com um nome diferente.
+É possível continuar usando {{SITENAME}} anonimamente ou <span class='plainlinks'>[$1 autenticar-se novamente]</span> com o mesmo nome de usuário ou com um nome diferente.
Note que algumas páginas podem continuar sendo exibidas como se você ainda estivesse autenticado até que você limpe a ''cache'' do seu navegador.",
-'welcomecreation' => '== Bem-vindo(a), $1! ==
-A sua conta foi criada.
+'welcomeuser' => 'Bem-vindo, $1!',
+'welcomecreation-msg' => 'A sua conta foi criada.
Não se esqueça de personalizar as suas [[Special:Preferences|preferências no wiki {{SITENAME}}]].',
'yourname' => 'Nome de usuário:',
'yourpassword' => 'Senha:',
@@ -756,7 +758,7 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências no
'gotaccount' => "Já possui uma conta? '''$1'''.",
'gotaccountlink' => 'Autenticar-se',
'userlogin-resetlink' => 'Esqueceu-se do seu nome de usuário ou da senha?',
-'createaccountmail' => 'por e-mail',
+'createaccountmail' => 'Usar uma senha aleatória e temporária que será enviada ao endereço de e-mail especificado a seguir',
'createaccountreason' => 'Razão:',
'badretype' => 'As senhas que você digitou não são iguais.',
'userexists' => 'O nome de usuário fornecido já está em uso.
@@ -827,6 +829,7 @@ Por favor aguarde antes de tentar novamente.',
# Email sending
'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
'user-mail-no-addy' => 'Tentou enviar uma mensagem sem um endereço de e-mail.',
+'user-mail-no-body' => 'Você tentou enviar com o campo de e-mail vazio ou com poucos caracteres.',
# Change password dialog
'resetpass' => 'Alterar senha',
@@ -888,6 +891,7 @@ Senha temporária: $2',
'changeemail-oldemail' => 'Endereço de e-mail atual:',
'changeemail-newemail' => 'Novo endereço de e-mail:',
'changeemail-none' => '(nenhum)',
+'changeemail-password' => 'Sua senha para o wiki {{SITENAME}}:',
'changeemail-submit' => 'Alterar e-mail',
'changeemail-cancel' => 'Cancelar',
@@ -1070,7 +1074,6 @@ A última entrada no histórico é fornecida abaixo como referência:",
'template-semiprotected' => '(semi-protegida)',
'hiddencategories' => 'Esta página pertence a {{PLURAL:$1|uma categoria oculta|$1 categorias ocultas}}:',
'edittools' => '<!-- O texto aqui disponibilizado será exibido abaixo dos formulários de edição e de envio de arquivos. -->',
-'nocreatetitle' => 'A criação de páginas se encontra limitada',
'nocreatetext' => '{{SITENAME}} tem restringida a habilidade de criar novas páginas.
Volte à tela anterior e edite uma página já existente, ou [[Special:UserLogin|autentique-se ou crie uma conta]].',
'nocreate-loggedin' => 'Você não possui permissão para criar novas páginas.',
@@ -1095,6 +1098,15 @@ Ela parece ter sido eliminada.',
'edit-already-exists' => 'Não foi possível criar uma nova página.
Ela já existia.',
'defaultmessagetext' => 'Texto da mensagem padrão',
+'content-failed-to-parse' => 'Falha ao analisar o conteúdo $2 para o modelo $1: $3',
+'invalid-content-data' => 'Dados de conteúdo inválidos',
+'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitexto',
+'content-model-text' => 'texto simples',
+'content-model-javascript' => 'Javascript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Aviso: Esta página contém muitas chamadas a funções do analisador "parser".
@@ -1460,9 +1472,9 @@ Esta ação não pode ser desfeita.',
'prefs-emailconfirm-label' => 'Confirmação do e-mail:',
'prefs-textboxsize' => 'Tamanho da janela de edição',
'youremail' => 'Seu e-mail:',
-'username' => 'Nome de usuário:',
-'uid' => 'Número de identificação:',
-'prefs-memberingroups' => 'Membro {{PLURAL:$1|do grupo|dos grupos}}:',
+'username' => 'Nome de {{GENDER:$1|usuário|usuária}}:',
+'uid' => 'ID de {{GENDER:$1|usuário|usuária}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:',
'prefs-registration' => 'Hora de registro:',
'yourrealname' => 'Nome verdadeiro:',
'yourlanguage' => 'Língua:',
@@ -1611,12 +1623,13 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
'right-sendemail' => 'Enviar email a outros usuários',
'right-passwordreset' => 'Ver todos os e-mails de reposição de senhas',
+# Special:Log/newusers
+'newuserlogpage' => 'Registro de criação de usuários',
+'newuserlogpagetext' => 'Este é um registro de novas contas de usuário',
+
# User rights log
'rightslog' => 'Registro de privilégios de usuário',
'rightslogtext' => 'Este é um registro de mudanças nos privilégios de usuários.',
-'rightslogentry' => 'alterou os grupos de privilégios {{GENDER:$1|do usuário|da usuária|de usuário para}} $1 (de $2 para $3)',
-'rightslogentry-autopromote' => 'foi automaticamente promovido de $2 para $3',
-'rightsnone' => '(nenhum)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ler esta página',
@@ -1869,6 +1882,7 @@ Caso o problema persista, procure um [[Special:ListUsers/sysop|administrador]].'
'backend-fail-notsame' => 'Já existe um arquivo não idêntico em $1 .',
'backend-fail-invalidpath' => '$1 não é um caminho válido de armazenamento.',
'backend-fail-delete' => 'Não foi possível excluir o arquivo $1.',
+'backend-fail-describe' => 'Não foi possível alterar os metadados do arquivo "$1".',
'backend-fail-alreadyexists' => 'O arquivo $1 já existe.',
'backend-fail-store' => 'Não foi possível armazenar o arquivo $1 em $2.',
'backend-fail-copy' => 'Não foi possível copiar o arquivo $1 para $2.',
@@ -2103,6 +2117,12 @@ Talvez você deseje editar a descrição na sua [$2 página de descrição de ar
Talvez fosse melhor que possuissem links para uma página mais específica.</br>
Uma página é considerada como de desambiguação se utilizar uma predefinição que esteja definida em [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Páginas com uma propriedade de página',
+'pageswithprop-legend' => 'Páginas com uma propriedade de página',
+'pageswithprop-text' => 'Esta página lista as páginas que usam uma determinada propriedade de página.',
+'pageswithprop-prop' => 'Nome da propriedade:',
+'pageswithprop-submit' => 'Ir',
+
'doubleredirects' => 'Redirecionamentos duplos',
'doubleredirectstext' => 'Esta página lista as páginas que redirecionam para outros redirecionamentos.
Cada linha contém links para o primeiro e o segundo redirecionamentos, juntamente com o alvo do segundo redirecionamento, que é geralmente a verdadeira página de destino, para a qual o primeiro redirecionamento deveria apontar.
@@ -2253,9 +2273,9 @@ Veja também [[Special:WantedCategories|categorias pedidas]].',
'linksearch-pat' => 'Procurar padrão:',
'linksearch-ns' => 'Espaço nominal:',
'linksearch-ok' => 'Pesquisar',
-'linksearch-text' => 'É possível usar caracteres curinga, como "*.wikipedia.org".
-É necessário, pelo menos, um domínio de nível superior, por exemplo "*.org".<br />
-Protocolos suportados: <code>$1</code> (não adicionado nenhum desses em sua pesquisa).',
+'linksearch-text' => 'É possível usar caracteres coringa, como "*.wikipedia.org".
+Necessário no mínimo um domínio de nível superior, por exemplo "*.org".<br />
+{{PLURAL:$2|Protocolo suportado|Protocolos suportados}}: <code>$1</code> (caso nenhum seja especificado, o protocolo http:// será selecionado automaticamente).',
'linksearch-line' => '$2 possui links para $1',
'linksearch-error' => "\"Caracteres mágicos\" (''wildcards'') só podem ser usados no início do endereço.",
@@ -2274,10 +2294,6 @@ Protocolos suportados: <code>$1</code> (não adicionado nenhum desses em sua pes
'activeusers-hidesysops' => 'Esconder administradores',
'activeusers-noresult' => 'Nenhum usuário encontrado.',
-# Special:Log/newusers
-'newuserlogpage' => 'Registro de criação de usuários',
-'newuserlogpagetext' => 'Este é um registro de novas contas de usuário',
-
# Special:ListGroupRights
'listgrouprights' => 'Privilégios de grupo de usuários',
'listgrouprights-summary' => 'O que segue é uma lista dos grupos de usuários definidos neste wiki, com os seus privilégios de acessos associados.
@@ -2372,22 +2388,25 @@ Futuras modificações em tal página e páginas de discussão relacionadas serÃ
'enotif_mailer' => '{{SITENAME}} Email de Notificação',
'enotif_reset' => 'Marcar todas páginas como visitadas',
-'enotif_newpagetext' => 'Esta é uma página nova.',
'enotif_impersonal_salutation' => 'Usuário do projeto "{{SITENAME}}"',
-'changed' => 'alterada',
-'created' => 'criada',
-'enotif_subject' => '{{SITENAME}}: A página $PAGETITLE foi $CHANGEDORCREATED por $PAGEEDITOR',
+'enotif_subject_deleted' => 'A página $1 da {{SITENAME}} foi eliminada por {{gender:$2|$2}}',
+'enotif_subject_created' => 'A página $1 da {{SITENAME}} foi criada por {{gender:$2|$2}}',
+'enotif_subject_moved' => 'A página $1 da {{SITENAME}} foi movida por {{gender:$2|$2}}',
+'enotif_subject_restored' => 'A página $1 da {{SITENAME}} foi restaurada por {{gender:$2|$2}}',
+'enotif_subject_changed' => 'A página $1 da {{SITENAME}} foi alterada por {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'A página $1 do wiki {{SITENAME}} foi eliminada em $PAGEEDITDATE por {{gender:$2|$2}}. Veja $3.',
+'enotif_body_intro_created' => 'A página $1 da {{SITENAME}} foi criada em $PAGEEDITDATE por {{gender:$2|$2}}, acesse $3 para ver a versão atual.',
+'enotif_body_intro_moved' => 'A página $1 da {{SITENAME}} foi movida em $PAGEEDITDATE por {{gender:$2|$2}}, acesse $3 para ver a versão atual.',
+'enotif_body_intro_restored' => 'A página $1 da {{SITENAME}} foi restaurada em $PAGEEDITDATE por {{gender:$2|$2}}, acesse $3 para ver a versão atual.',
+'enotif_body_intro_changed' => 'A página $1 da {{SITENAME}} foi alterada em $PAGEEDITDATE por {{gender:$2|$2}}, acesse $3 para ver a versão atual.',
'enotif_lastvisited' => 'Consulte $1 para todas as alterações efetuadas desde a sua última visita.',
'enotif_lastdiff' => 'Acesse $1 para ver esta alteração.',
'enotif_anon_editor' => 'usuário anônimo $1',
-'enotif_body' => 'Caro(a) $WATCHINGUSERNAME,
-
-
-A página $PAGETITLE da {{SITENAME}} foi $CHANGEDORCREATED a $PAGEEDITDATE por $PAGEEDITOR; consulte $PAGETITLE_URL para ver a versão atual.
+'enotif_body' => '{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}},
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
-Resumo da edição: $PAGESUMMARY $PAGEMINOREDIT
+Resumo do editor: $PAGESUMMARY $PAGEMINOREDIT
Contate o editor:
e-mail: $PAGEEDITOR_EMAIL
@@ -2399,7 +2418,7 @@ Você pode também reativar as notificações para todas páginas na sua lista d
O seu sistema de notificação amigável da {{SITENAME}}
--
-Para alterar as suas preferências das notificações por correio electrónico, visite
+Para alterar as suas preferências das notificações por correio electrônico, visite
{{canonicalurl:{{#special:Preferences}}}}
Para alterar as suas preferências das páginas vigiadas, visite
@@ -2410,6 +2429,8 @@ $UNWATCHURL
Para comentários e pedidos de ajuda:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'criada',
+'changed' => 'alterada',
# Delete
'deletepage' => 'Eliminar página',
@@ -2481,6 +2502,8 @@ Consulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as p
'prot_1movedto2' => '[[$1]] foi movido para [[$2]]',
'protect-badnamespace-title' => 'Espaço de nomes não-protegidos',
'protect-badnamespace-text' => 'As páginas presentes nesse espaço de nomes não se pode proteger',
+'protect-norestrictiontypes-text' => 'Esta página não pode ser protegida, pois não há nenhum tipo de restrição disponível.',
+'protect-norestrictiontypes-title' => 'Página com proteção indisponível',
'protect-legend' => 'Confirmar proteção',
'protectcomment' => 'Motivo:',
'protectexpiry' => 'Expiração',
@@ -2561,7 +2584,8 @@ Em tais casos, deverá desselecionar ou reverter a ocultação da versão apagad
'undeletedrevisions' => '$1 {{PLURAL:$1|edição restaurada|edições restauradas}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$2|edição restaurada|edições restauradas}} e $2 {{PLURAL:$2|arquivo restaurado|arquivos restaurados}}',
'undeletedfiles' => '{{PLURAL:$1|arquivo restaurado|$1 arquivos restaurados}}',
-'cannotundelete' => 'Restauração falhada; alguém talvez já restaurou a página.',
+'cannotundelete' => 'Falha ao restaurar:
+$1',
'undeletedpage' => "'''$1 foi restaurada'''
Consulte o [[Special:Log/delete|registro de eliminações]] para um registro das eliminações e restaurações mais recentes.",
@@ -2592,7 +2616,7 @@ $1',
'blanknamespace' => '(Principal)',
# Contributions
-'contributions' => 'Contribuições {{GENDER:{{BASEPAGENAME}}|do usuário|da usuária}}',
+'contributions' => 'Contribuições {{GENDER:$1|do usuário|da usuária}}',
'contributions-title' => 'Contribuições {{GENDER:$1|do usuário|da usuária}} $1',
'mycontris' => 'Contribuições',
'contribsub2' => 'Para $1 ($2)',
@@ -2859,6 +2883,7 @@ A página de destino ("[[:$1]]") já existe. Deseja eliminá-la de modo a poder
'immobile-target-namespace-iw' => 'Uma ligação interwiki não é um destino válido para uma movimentação de página.',
'immobile-source-page' => 'Esta página não pode ser movida.',
'immobile-target-page' => 'Não é possível mover para esse título de destino.',
+'bad-target-model' => 'O destino especificado usa um modelo de conteúdo diferente. Não é possível converter $1 para $2.',
'imagenocrossnamespace' => 'Não é possível mover imagem para espaço nominal que não de imagens',
'nonfile-cannot-move-to-file' => 'Não é possível mover não arquivos para espaço nominal de arquivos',
'imagetypemismatch' => 'A extensão do novo arquivo não corresponde ao seu tipo',
@@ -2971,6 +2996,7 @@ Salve o arquivo no seu computador e importe-o aqui.',
'import-error-interwiki' => 'A página "$1" não pôde ser importada pois seu nome está reservado para um link interwik.',
'import-error-special' => 'A página "$1" não pôde ser importada porque ela pertence a um espaço nominal especial que não suporta páginas.',
'import-error-invalid' => 'A página "$1" não pôde ser importada por seu nome ser inválido.',
+'import-error-unserialize' => 'Revisão $2 da página " $1 " não pôde ser desserializada. A revisão foi relatada para usar o modelo de conteúdo $3 serializado como $4',
'import-options-wrong' => '{{PLURAL:$2|Opção com erro|Opções com erros}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'A página raiz dada é um título inválido.',
'import-rootpage-nosubpage' => 'O espaço nominal $1 da página principal não permite subpáginas.',
@@ -2985,7 +3011,6 @@ Salve o arquivo no seu computador e importe-o aqui.',
# JavaScriptTest
'javascripttest' => 'Teste de JavaScript',
-'javascripttest-disabled' => 'Essa função não foi habilitada neste wiki.',
'javascripttest-title' => 'Executando testes para $1',
'javascripttest-pagetext-noframework' => 'Esta página é exclusiva para testes de JavaScript.',
'javascripttest-pagetext-unknownframework' => 'A estrutura de testes "$1" é desconhecida.',
@@ -3117,11 +3142,13 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
'pageinfo-default-sort' => 'Chave de ordenação padrão',
'pageinfo-length' => 'Tamanho da página (em bytes)',
'pageinfo-article-id' => 'ID da página',
+'pageinfo-language' => 'Idioma do conteúdo da página',
'pageinfo-robot-policy' => 'Status do mecanismo de pesquisa',
'pageinfo-robot-index' => 'Indexável',
'pageinfo-robot-noindex' => 'Não indexável',
'pageinfo-views' => 'Número de visitas',
'pageinfo-watchers' => 'Número de vigilantes da página',
+'pageinfo-few-watchers' => 'Menos de $1 {{PLURAL:$1|vigilante|vigilantes}}',
'pageinfo-redirects-name' => 'Redirecionamentos para esta página',
'pageinfo-subpages-name' => 'Subpáginas desta página',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecionamento|redirecionamentos}}; $3 {{PLURAL:$3|não redirecionamento|não redirecionamentos}})',
@@ -3136,6 +3163,19 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
'pageinfo-magic-words' => '{{PLURAL:$1|Palavra mágica|Palavras mágicas}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categorias ocultas}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Predefinição transcluída|Predefinições transcluídas ($1)}}',
+'pageinfo-transclusions' => '{{PLURAL:$1|Página em que é transcluída|Páginas em que é transcluída ($1)}}',
+'pageinfo-toolboxlink' => 'Informações da página',
+'pageinfo-redirectsto' => 'Redireciona para',
+'pageinfo-redirectsto-info' => 'informações',
+'pageinfo-contentpage' => 'Contado como uma página de conteúdo',
+'pageinfo-contentpage-yes' => 'Sim',
+'pageinfo-protect-cascading' => 'Proteção em cascata ativada',
+'pageinfo-protect-cascading-yes' => 'Sim',
+'pageinfo-protect-cascading-from' => 'Proteções herdadas de',
+'pageinfo-category-info' => 'Informações da categoria',
+'pageinfo-category-pages' => 'Número de páginas',
+'pageinfo-category-subcats' => 'Número de subcategorias',
+'pageinfo-category-files' => 'Número de arquivos',
# Skin names
'skinname-standard' => 'Clássico',
@@ -3157,6 +3197,8 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
'markedaspatrollederror' => 'Não é possível marcar como verificado',
'markedaspatrollederrortext' => 'Você precisa de especificar uma revisão para poder marcar como verificado.',
'markedaspatrollederror-noautopatrol' => 'Você não está autorizado a marcar suas próprias edições como edições patrulhadas.',
+'markedaspatrollednotify' => 'Esta alteração em $1 foi marcada como patrulhada.',
+'markedaspatrollederrornotify' => 'Falha ao marcar como patrulhada.',
# Patrol log
'patrol-log-page' => 'Registro de edições patrulhadas',
@@ -3190,6 +3232,7 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
'file-nohires' => 'Sem resolução maior disponível.',
'svg-long-desc' => 'arquivo SVG, de $1 × $2 pixels, tamanho: $3',
'svg-long-desc-animated' => 'arquivo SVG animado, de $1 × $2 pixels e de tamanho: $3',
+'svg-long-error' => 'Arquivo SVG inválido: $1',
'show-big-image' => 'Resolução original',
'show-big-image-preview' => 'Tamanho desta previsualização: $1.',
'show-big-image-other' => '{{PLURAL:$2|Outra resolução|Outras resoluções}}: $1.',
@@ -3219,7 +3262,10 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
'minutes' => '{{PLURAL:$1|um minuto|$1 minutos}}',
'hours' => '{{PLURAL:$1|uma hora|$1 horas}}',
'days' => '{{PLURAL:$1|um dia|$1 dias}}',
+'months' => '{{PLURAL:$1|$1 mês|$1 meses}}',
+'years' => '{{PLURAL:$1|$1 ano|$1 anos}}',
'ago' => '$1 atrás',
+'just-now' => 'agora mesmo',
# Bad image list
'bad_image_list' => 'O formato é o seguinte:
@@ -3722,6 +3768,7 @@ Este código de confirmação irá expirar em $4.',
# Scary transclusion
'scarytranscludedisabled' => '[A transclusão de páginas de outros wikis encontra-se desabilitada]',
'scarytranscludefailed' => '[Não foi possível obter a predefinição a partir de $1]',
+'scarytranscludefailed-httpstatus' => '[Não foi possível obter a predefinição a partir de $1: erro HTTP $2]',
'scarytranscludetoolong' => '[URL longa demais]',
# Delete conflict
@@ -3832,6 +3879,7 @@ Você também pode [[Special:EditWatchlist|editar a lista da maneira convenciona
'version-license' => 'Licença',
'version-poweredby-credits' => "Este é um wiki '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'outros',
+'version-credits-summary' => 'Gostaríamos de agradecer às seguintes pessoas por suas contribuições no [[Special:Version|MediaWiki]]',
'version-license-info' => 'O MediaWiki é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.
O MediaWiki é distribuído na esperança de que seja útil, mas SEM QUALQUER GARANTIA; inclusive, sem a garantia implícita da POSSIBILIDADE DE SER COMERCIALIZADO ou de ADEQUAÇÂO PARA QUALQUER FINALIDADE ESPECÃFICA. Consulte a licença GNU General Public License para mais detalhes.
@@ -3948,14 +3996,14 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
'logentry-delete-delete' => '$1 apagou a página $3',
'logentry-delete-restore' => '$1 restaurou a página $3',
'logentry-delete-event' => '$1 alterou a visibilidade {{PLURAL:$5|de uma entrada|de $5 entradas}} do registro $3: $4',
-'logentry-delete-revision' => '$1 alterou a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} em $3: $4',
-'logentry-delete-event-legacy' => '$1 alterou a visibilidade de uma entrada em $3',
-'logentry-delete-revision-legacy' => '$1 alterou a visibilidade de uma revisão em $3',
+'logentry-delete-revision' => '$1 alterou a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} na página $3: $4',
+'logentry-delete-event-legacy' => '$1 alterou a visibilidade de eventos de log em $3',
+'logentry-delete-revision-legacy' => '$1 alterou a visibilidade de revisões na página $3',
'logentry-suppress-delete' => '$1 suprimiu a página $3',
'logentry-suppress-event' => '$1 alterou secretamente a visibilidade {{PLURAL:$5|de uma entrada|das $5 entradas}} em $3: $4',
'logentry-suppress-revision' => '$1 alterou secretamente a visibilidade {{PLURAL:$5|de uma revisão|das $5 revisões}} em $3: $4',
'logentry-suppress-event-legacy' => '$1 alterou secretamente a visibilidade das entradas em $3',
-'logentry-suppress-revision-legacy' => '$1 alterou secretamente a visibilidade das revisões em $3',
+'logentry-suppress-revision-legacy' => '$1 alterou secretamente a visibilidade de revisões na página $3',
'revdelete-content-hid' => 'conteúdo oculto',
'revdelete-summary-hid' => 'sumário de edição oculto',
'revdelete-uname-hid' => 'nome de usuário oculto',
@@ -3970,11 +4018,15 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
'logentry-move-move_redir-noredirect' => '$1 moveu a página $3 para $4 sem um redirecionamento',
'logentry-patrol-patrol' => '$1 marcou a revisão $4 da página $3 como patrulhada',
'logentry-patrol-patrol-auto' => '$1 marcou automaticamente a revisão $4 da página $3 como patrulhada',
-'logentry-newusers-newusers' => 'A conta de usuário $1 foi criada',
+'logentry-newusers-newusers' => 'A conta de usuário $1 foi {{GENDER:$2|criada}}',
'logentry-newusers-create' => 'A conta de usuário $1 foi criada',
'logentry-newusers-create2' => 'A conta de usuário $3 foi criada por $1',
-'logentry-newusers-autocreate' => 'A conta $1 foi criada automaticamente',
-'newuserlog-byemail' => 'senha enviada por correio-eletrônico',
+'logentry-newusers-byemail' => 'A conta de usuário $3 foi criada por $1, com a senha sendo enviada por e-mail',
+'logentry-newusers-autocreate' => 'A conta de usuário $1 foi criada automaticamente',
+'logentry-rights-rights' => '$1 alterou os grupos de usuário de $3 de $4 para $5',
+'logentry-rights-rights-legacy' => '$1 alterou os grupos de $3',
+'logentry-rights-autopromote' => '$1 foi promovido automaticamente de $4 a $5',
+'rightsnone' => '(nenhum)',
# Feedback
'feedback-bugornote' => 'Se você está preparado para descrever detalhadamente um problema técnico, [$1 relate um bug].
@@ -4028,6 +4080,7 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com
'api-error-ok-but-empty' => 'Erro interno: não há resposta do servidor.',
'api-error-overwrite' => 'Não é permitido sobrescrever um arquivo já existente.',
'api-error-stashfailed' => 'Erro interno: o servidor não conseguiu armazenar o arquivo temporário.',
+'api-error-publishfailed' => 'Erro interno: O servidor falhou ao publicar o arquivo temporário.',
'api-error-timeout' => 'O servidor não respondeu dentro do tempo esperado.',
'api-error-unclassified' => 'Ocorreu um erro desconhecido',
'api-error-unknown-code' => 'Erro desconhecido: "$1"',
diff --git a/languages/messages/MessagesQqq.php b/languages/messages/MessagesQqq.php
index 87c10cbe..c78cba34 100644
--- a/languages/messages/MessagesQqq.php
+++ b/languages/messages/MessagesQqq.php
@@ -76,6 +76,7 @@
* @author Meno25
* @author Metalhead64
* @author MichaelFrey
+ * @author Mido
* @author Mihai
* @author Minh Nguyen
* @author Mormegil
@@ -91,6 +92,7 @@
* @author Octahedron80
* @author Od1n
* @author Onecountry
+ * @author Opraco
* @author OsamaK
* @author PhiLiP
* @author Piangpha
@@ -131,6 +133,7 @@
* @author Usarker
* @author Verdy p
* @author Vinhtantran
+ * @author Vivaelcelta
* @author Waldir
* @author Whym
* @author Yekrats
@@ -367,6 +370,11 @@ Message shown below the edit form, and if you click on it, you stop with editing
Similar to {{msg-mw|morenotlisted}}.
{{Identical|More...}}',
+'morenotlisted' => 'An indication that more of a templates list is not shown.
+
+Used as "More..." link for {{msg-mw|pageinfo-templates}} field.
+
+Similar to {{msg-mw|moredotdotdot}}.',
'mypage' => "A text for the link to the user's user page in the links at the top of the page.
{{Identical|Page}}",
'mytalk' => 'In the personal URLs page section - right upper corner.
@@ -435,6 +443,7 @@ This can also appear in the credits page if the credits feature is enabled,for e
'namespaces' => '{{Identical|Namespace}}',
'variants' => 'Used by the Vector skin.',
+'navigation-heading' => 'Heading shown above the navigation menu (sidebar) for screen-readers (or in non-standard skins).',
'errorpagetitle' => 'Message shown in browser title bar when encountering error operation.
{{Identical|Error}}',
@@ -1026,8 +1035,10 @@ Parameters:
'virus-unknownscanner' => 'Used as error message. This message is followed by the virus scanner name.',
# Login and logout pages
-'logouttext' => 'Log out message',
-'welcomecreation' => 'The welcome message users see after registering a user account. $1 is the username of the new user.',
+'logouttext' => 'Log out message. Parameters:
+* $1 - an URL to [[Special:Userlogin]] containing <code>returnto</code> and <code>returntoquery</code> parameters',
+'welcomeuser' => 'Text for a welcome heading that users see after registering a user account. $1 is the username of the new user. See [[bugzilla:42215]]',
+'welcomecreation-msg' => 'A welcome message users see after registering a user account, following a welcomeuser heading. $1 is the username of the new user. Replaces welcomecreation in 1.21wmf5,see [[bugzilla:42215]]',
'yourname' => "{{doc-important|<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.}}
In user preferences.
{{Identical|Username}}",
@@ -1087,7 +1098,9 @@ It is also used on the top of the page for logged out users, where it appears ne
'gotaccountlink' => 'Text of the link to the log in form. Before that link, the message {{msg-mw|Gotaccount}} appears.
{{Identical|Log in}}',
'userlogin-resetlink' => 'Used on the login page.',
-'createaccountmail' => 'Button text for creating a new account and sending the new password to the specified e-mail address directly, as used on [[Special:UserLogin/signup]] if creating accounts by e-mail is allowed.',
+'createaccountmail' => 'Used as label for the checkbox for creating a new account and sending the new password to the specified e-mail address directly, as used on [[Special:UserLogin/signup]] if creating accounts by e-mail is allowed.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
'createaccountreason' => '{{Identical|Reason}}',
'badretype' => 'Used as error message when the new password and its retype do not match.',
'userexists' => 'Used as error message in creating a user account.',
@@ -1186,6 +1199,7 @@ See also:
# Email sending
'php-mail-error-unknown' => 'Used as error message when <code>mail()</code> returned empty error message.',
'user-mail-no-addy' => 'This is the error message in case an e-mail could not be sent because there was no e-mail address to send it to.',
+'user-mail-no-body' => 'This is the error message in case an e-mail has an empty or unreasonably short body',
# Change password dialog
'resetpass' => 'The caption of [[Special:ChangePassword]]
@@ -1270,6 +1284,7 @@ See also:
'changeemail-none' => "Probably appears in 'Current E-mail address' field when no address held, in [[Special:ChangeEmail]].
{{Identical|None}}",
+'changeemail-password' => 'Label for password field in [[Special:ChangeEmail]].',
'changeemail-submit' => 'Submit button on [[Special:ChangeEmail]]',
'changeemail-cancel' => 'Cancel button on [[Special:ChangeEmail]]
@@ -1584,6 +1599,36 @@ See also:
* {{msg-mw|edit-conflict}}
* {{msg-mw|edit-no-change}}',
'defaultmessagetext' => 'Caption above the default message text shown on the left-hand side of a diff displayed after clicking "Show changes" when creating a new page in the MediaWiki: namespace',
+'content-failed-to-parse' => "Error message indicating that the page's content can not be saved because it is syntactically invalid. This may occurr for content types using serialization or a strict markup syntax.
+*$1 – content model ({{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}})
+*$2 – content format as MIME type (e.g. <tt>text/css</tt>)
+*$3 – specific error message",
+'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.
+* $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}}
+* $2 - the title of the page in question',
+
+# Content models
+'content-model-wikitext' => 'Name for the wikitext content model, used when decribing what type of content a page contains.
+
+This message is substituted in:
+*{{msg-mw|Bad-target-model}}
+*{{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.
+
+This message is substituted in:
+*{{msg-mw|Bad-target-model}}
+*{{msg-mw|Content-not-allowed-here}}',
+'content-model-javascript' => 'Name for the JavaScript content model, used when decribing what type of content a page contains.
+
+This message is substituted in:
+*{{msg-mw|Bad-target-model}}
+*{{msg-mw|Content-not-allowed-here}}',
+'content-model-css' => 'Name for the CSS content model, used when decribing what type of content a page contains.
+
+This message is substituted in:
+*{{msg-mw|Bad-target-model}}
+*{{msg-mw|Content-not-allowed-here}}',
# Parser/template warnings
'expensive-parserfunction-warning' => 'On some (expensive) [[MetaWikipedia:Help:ParserFunctions|parser functions]] (e.g. <code><nowiki>{{#ifexist:}}</nowiki></code>) there is a limit of how many times it may be used. This is an error message shown when the limit is exceeded.
@@ -2432,9 +2477,13 @@ This option lets your time zone setting use the one that is used on the wiki (of
Also used on create account form.
{{Identical|E-mail}}',
-'username' => '{{Identical|Username}}',
-'uid' => '{{Identical|User ID}}',
-'prefs-memberingroups' => 'This message is shown on [[Special:Preferences]], first tab. See also {{msg-mw|prefs-memberingroups-type}}.',
+'username' => 'Username field in [[Special:Preferences]]. $1 is the current user name for GENDER distinction (depends on sex setting).
+
+{{Identical|Username}}',
+'uid' => 'User ID field in [[Special:Preferences]]. $1 is the current user name for GENDER distinction (depends on sex setting).
+
+{{Identical|User ID}}',
+'prefs-memberingroups' => 'This message is shown on [[Special:Preferences]], first tab. See also {{msg-mw|prefs-memberingroups-type}}. $2 is the user name for GENDER.',
'prefs-memberingroups-type' => '{{optional}}
Parameters:
* $1 is list of group names
@@ -2551,6 +2600,10 @@ Parameters:
Parameters
* $1 - the number of items in the list following the message, for PLURAL
* $2 - the user name, for GENDER',
+'userrights-groupsmember-type' => '{{optional}}
+Parameters:
+* $1 is list of group names.
+* $2 is list of group member names. Used with labels {{msg-mw|userrights-groupsmember}} and {{msg-mw|userrights-groupsmember-auto}}',
'userrights-groups-help' => 'Instructions displayed on [[Special:UserRights]]. Parameters:
* $1 is a username - optional, can be used for GENDER',
'userrights-reason' => 'Text beside log field when editing user groups
@@ -2744,27 +2797,17 @@ The rate limits have no effect on the groups that have this right. Rate limits i
'right-sendemail' => '{{doc-right|sendemail}}',
'right-passwordreset' => '{{doc-right|passwordreset}}',
+# Special:Log/newusers
+'newuserlogpage' => '{{doc-logpage}}
+
+Part of the "Newuserlog" extension. It is both the title of [[Special:Log/newusers]] and the link you can see in [[Special:RecentChanges]].',
+'newuserlogpagetext' => 'Part of the "Newuserlog" extension. It is the description you can see on [[Special:Log/newusers]].',
+
# User rights log
'rightslog' => '{{doc-logpage}}
In [[Special:Log]]',
'rightslogtext' => 'Text in [[Special:Log/rights]].',
-'rightslogentry' => 'This message is displayed in the [[Special:Log/rights|User Rights Log]] when a bureaucrat changes the user groups for a user.
-
-* Parameter $1 is the username
-* Parameters $2 and $3 are lists of user groups or {{msg-mw|Rightsnone}}
-
-The name of the bureaucrat who did this task appears before this message.
-
-Similar to {{msg-mw|Gur-rightslog-entry}}',
-'rightslogentry-autopromote' => 'This message is displayed in the [[Special:Log/rights|User Rights Log]] when a user is automatically promoted to a user group.
-
-Parameters:
-* $2 is a comma separated list of old user groups or {{msg-mw|Rightsnone}}
-* $3 is a comma separated list of new user groups',
-'rightsnone' => 'Default rights for registered users.
-
-{{Identical|None}}',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => '{{Doc-action|read}}',
@@ -3391,6 +3434,8 @@ See also:
* $1 is a storage path.',
'backend-fail-delete' => 'Parameters:
* $1 is a file path.',
+'backend-fail-describe' => 'Parameters:
+* $1 is a file path.',
'backend-fail-alreadyexists' => 'Parameters:
* $1 is a filename.',
'backend-fail-store' => 'Parameters:
@@ -3875,6 +3920,16 @@ This block of text is shown on [[:Special:Disambiguations]].
\'\'\'Background information:\'\'\' Beyond telling about links going to disambiguation pages, that they are generally bad, it should explain which pages in the article namespace are seen as disambiguations: [[MediaWiki:Disambiguationspage]] usually holds a list of disambiguation templates of the local wiki. Pages linking to one of them (by transclusion) will count as disambiguation pages. Pages linking to these disambiguation pages, instead to the disambiguated article itself, are listed on [[:Special:Disambiguations]].',
+'pageswithprop' => '{{doc-special|PagesWithProp}}
+{{Identical|Page with page property}}',
+'pageswithprop-legend' => 'Legend for the input form on [[Special:PagesWithProp]].
+{{Identical|Page with page property}}',
+'pageswithprop-text' => 'Introductory text for the input form on [[Special:PagesWithProp]]',
+'pageswithprop-prop' => 'Label for the property name input field on [[Special:PagesWithProp]].
+{{Identical|Property name}}',
+'pageswithprop-submit' => 'Label for the submit button on [[Special:PagesWithProp]].
+{{Identical|Go}}',
+
'doubleredirects' => '{{doc-special|DoubleRedirects}}',
'doubleredirectstext' => 'Shown on top of [[Special:Doubleredirects]]',
'double-redirect-fixed-move' => 'This is the message in the log when the software (under the username {{msg|double-redirect-fixer}}) updates the redirects after a page move. See also {{msg|fix-double-redirects}}.',
@@ -4170,12 +4225,6 @@ See also:
* {{msg-mw|activeusers-hidebots|label for checkbox}}',
'activeusers-noresult' => 'identical with {{msg-mw|listusers-noresult}}',
-# Special:Log/newusers
-'newuserlogpage' => '{{doc-logpage}}
-
-Part of the "Newuserlog" extension. It is both the title of [[Special:Log/newusers]] and the link you can see in [[Special:RecentChanges]].',
-'newuserlogpagetext' => 'Part of the "Newuserlog" extension. It is the description you can see on [[Special:Log/newusers]].',
-
# Special:ListGroupRights
'listgrouprights' => 'The name of the special page [[Special:ListGroupRights]].',
'listgrouprights-summary' => 'The description used on [[Special:ListGroupRights]].',
@@ -4414,17 +4463,39 @@ See also:
* {{msg-mw|Watchlist-options|fieldset}}
* {{msg-mw|Watchlist-details|watchlist header}}
* {{msg-mw|Wlheader-enotif|watchlist header}}",
-'enotif_newpagetext' => 'Part of text of a notification e-mail sent when a watched page has been created. See [[MediaWiki:Enotif body]] and screenshot [[File:Screenshot_MediaWiki_e-mail_notifier.PNG|150px|right]]',
'enotif_impersonal_salutation' => 'Used for impersonal e-mail notifications, suitable for bulk mailing.',
-'changed' => '{{Optional}}
-Possible value for $CHANGEDORCREATED in the following messages:
-* {{msg|enotif_subject}}
-* {{msg|enotif_body}}',
-'created' => '{{Optional}}
-Possible value for $CHANGEDORCREATED in the following messages:
-* {{msg-mw|enotif_subject}}
-* {{msg-mw|enotif_body}}',
-'enotif_subject' => '$CHANGEDORCREATED can be one of {{msg|changed}} and {{msg|created}}. Can also be {{msg-wikia|blog-added}} or {{msg-wikia|blog-edited}} from Wikia.',
+'enotif_subject_deleted' => 'Email notification subject for deleted pages,
+* $1 - page title
+* $2 - page editor',
+'enotif_subject_created' => 'Email notification subject for new pages,
+* $1 - page title
+* $2 - page editor',
+'enotif_subject_moved' => 'Email notification subject for pages that get moved,
+* $1 - page title
+* $2 - page editor',
+'enotif_subject_restored' => 'Email notification subject for pages that get restored,
+* $1 - page title
+* $2 - page editor',
+'enotif_subject_changed' => 'Email notification subject for pages that get changed.
+* $1 - page title
+* $2 - page editor',
+'enotif_body_intro_deleted' => 'Email notification body intro text for deleted pages.
+* $1 - the page title
+* $2 - the page editor
+* $3 - page URL',
+'enotif_body_intro_created' => 'Email notification body intro text for new pages.
+* $1 - the page title
+* $2 - the page editor
+* $3 - page URL',
+'enotif_body_intro_moved' => 'Email notification body intro for pages that get moved.
+* $1 - the page title
+* $2 - the page editor
+* $3 - page URL',
+'enotif_body_intro_restored' => 'Email notification body intro for pages that get restored.
+* $1 - the page title
+* $2 - the page editor
+* $3 - page URL',
+'enotif_body_intro_changed' => 'Email notification body intro for pages that get changed, $1 is the page title, $2 is the page editor, $3 is page url.',
'enotif_lastvisited' => '$1 is a URL address.',
'enotif_lastdiff' => 'E-mail notification text to the latest page differences. Parameters:
* $1 is a link to a diff, shown as a plain link.',
@@ -4432,7 +4503,36 @@ Possible value for $CHANGEDORCREATED in the following messages:
* $1 is the anonymous user name (i.e. an IP address).',
'enotif_body' => 'Text of a notification e-mail sent when a watched page has been edited or deleted.[[File:Screenshot_MediaWiki_e-mail_notifier.PNG|150px|right]]
-* <tt>$CHANGEDORCREATED</tt> can be one of {{msg-mw|changed}}, {{msg-mw|created}}, or {{msg-mw|deleted}}. Can also be {{msg-wikia|blog-added}} or {{msg-wikia|blog-edited}} from Wikia.',
+*$WATCHINGUSERNAME is the username of the user receiving the notification.
+*$PAGEINTRO is the first line of the message, saying what happened. It currently can be either of:
+**{{msg-mw|enotif body intro deleted}}
+**{{msg-mw|enotif body intro created}}
+**{{msg-mw|enotif body intro moved}}
+**{{msg-mw|enotif body intro restored}}
+**{{msg-mw|enotif body intro changed}} (for all the other cases).
+*$NEWPAGE consists of either
+**if the page is new (in older releases), {{msg-mw|enotif newpagetext}}
+**if the page has a previous revision,
+***{{msg-mw|enotif lastdiff}}
+***a newline
+***{{msg-mw|enotif lastvisited}}
+*$PAGEEDITOR_EMAIL and $PAGEEDITOR_WIKI are links respectively to the e-mail user special page and user page for the user who performed the action.
+*$PAGEEDITOR is the username of the user who performed the action.
+
+The subject of the e-mail is one of the following messages:
+*{{msg-mw|enotif subject deleted}}
+*{{msg-mw|enotif subject created}}
+*{{msg-mw|enotif subject moved}}
+*{{msg-mw|enotif subject restored}}
+*{{msg-mw|enotif subject changed}}',
+'created' => '{{Optional}}
+Possible value for $CHANGEDORCREATED in the following messages:
+* {{msg-mw|enotif_subject}}
+* {{msg-mw|enotif_body}}',
+'changed' => '{{Optional}}
+Possible value for $CHANGEDORCREATED in the following messages:
+* {{msg|enotif_subject}}
+* {{msg|enotif_body}}',
# Delete
'deletepage' => 'Used as Submit button text.
@@ -4564,6 +4664,8 @@ Example:
'prot_1movedto2' => 'Message description: [[mw:Manual:Interface/1movedto2]]',
'protect-badnamespace-title' => 'Title of error page when trying to access action=protect on a non-protectable namespace (currently this only for the MediaWiki: namespace).',
'protect-badnamespace-text' => 'Content of the error page that goes with {{msg-mw|protect-badnamespace-title}}.',
+'protect-norestrictiontypes-text' => "Content of the error page in case there aren't any restriction types (like edit or create) available.",
+'protect-norestrictiontypes-title' => "Page title in case there aren't any restriction types (like edit or create) available ($1 represents the page title).",
'protect-legend' => 'Legend of the fieldset around the input form of the protection form.',
'protectcomment' => '{{Identical|Reason}}',
'protectexpiry' => '{{Identical|Expires}}',
@@ -4591,6 +4693,11 @@ See example: {{canonicalurl:Main_Page|action=info}}',
'protect-level-sysop' => 'Used as protect level.
See example: {{canonicalurl:Main_Page|action=info}}',
+'protect-summary-desc' => '{{Optional}}
+Used in edit summary for description of a protecting restriction.
+* $1 is action, taken from restriction-*
+* $2 is restriction, taken from protect-level-*
+* $3 is {{msg-mw|protect-expiring}} or {{msg-mw|protect-expiry-indefinite}}',
'protect-summary-cascade' => 'Used in edit summary when cascade protecting a page. Appears in protection log. See [[Special:Log]] and [[m:Special:Log]].
Also used in [[Special:ProtectedPages]] when a page is cascade protected. See example: [[m:Special:ProtectedPages]].<br />
@@ -4743,7 +4850,8 @@ See also:
See also:
* {{msg-mw|Undeletedrevisions-files}}
* {{msg-mw|Undeletedrevisions}}',
-'cannotundelete' => 'Used as error message in [[Special:Undelete]].',
+'cannotundelete' => 'Message shown when undeletion failed for some reason. Parameters:
+* $1 - the combined wikitext of messages for all errors that caused the failure',
'undeletedpage' => '* $1 - page title',
'undelete-header' => 'Used in [[Special:Undelete]].',
'undelete-search-title' => 'Page title when showing the search form in [[Special:Undelete]].
@@ -4818,7 +4926,12 @@ This message has a tooltip {{msg-mw|tooltip-namespace association}}',
'blanknamespace' => 'Name for main namespace (blank namespace) in drop-down menus at [[Special:RecentChanges]] and other special pages.',
# Contributions
-'contributions' => "Display name for the 'User contributions', shown in the sidebar menu of all user pages and user talk pages. Also the page name of the target page. The target page shows an overview of the most recent contributions by a user.",
+'contributions' => "Display name for the 'User contributions', shown in the sidebar menu of all user pages and user talk pages. Also the page name of the target page. The target page shows an overview of the most recent contributions by a user.
+
+See also:
+* {{msg-mw|Contributions}}
+* {{msg-mw|Accesskey-t-contributions}}
+* {{msg-mw|Tooltip-t-contributions}}",
'contributions-title' => 'The page title in your browser bar, but not the page title. See also {{msg|contributions}}. Parameter $1 is the username.
{{Gender}}',
@@ -5730,6 +5843,14 @@ See also:
* {{msg-mw|Immobile-source-page}}
* {{msg-mw|Immobile-target-namespace}}
* {{msg-mw|Immobile-target-page}}',
+'bad-target-model' => 'This message is shown when attempting to move a page, but the move would change the page\'s content model.
+This may be the case when [[mw:Manual:$wgContentHandlerUseDB|$wgContentHandlerUseDB]] is set to false, because then a page\'s content model is derived from the page\'s title.
+
+Parameters:
+* $1 - The localized name of the original page\'s content model:
+**{{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
+* $2 - The localized name of the content model used by the destination title:
+**{{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}',
'imagenocrossnamespace' => 'Used as error message.
See also:
@@ -6052,6 +6173,15 @@ See also:
'import-error-interwiki' => '* $1 - page title',
'import-error-special' => '* $1 - page title',
'import-error-invalid' => '* $1 - page title',
+'import-error-unserialize' => 'Import error message displayed when a revision could not be unserialized.
+
+This may happen if the content got corrupted or the serialization format is mis-reported.
+
+Parameters:
+* $1 - the name of the page the offending revision belongs to
+* $2 - the ID of the offending revision, as reported in the dump that is being imported
+* $3 - the content model reported for the offending revision in the dump that is being imported
+* $4 - the serialization format reported for the offending revision in the dump that is being imported',
'import-options-wrong' => 'Used on [[Special:Import]], when one of the options has an error.',
'import-rootpage-invalid' => 'Used on [[Special:Import]], when the root page is invalid.',
'import-rootpage-nosubpage' => 'Used on [[Special:Import]], when the import namespace does not support subpages. Parameters:
@@ -6074,7 +6204,6 @@ See also:
* {{msg-mw|Javascripttest|title}}
* {{msg-mw|Javascripttest-pagetext-noframework|summary}}
* {{msg-mw|Javascripttest-pagetext-unknownframework|error message}}',
-'javascripttest-disabled' => 'Message displayed on [[Special:JavaScriptTest]] if this feature is disabled (it is disabled by default).',
'javascripttest-title' => 'Title of the special page when running a test suite. Parameters:
* $1 is the name of the framework, for example QUnit.',
'javascripttest-pagetext-noframework' => 'Used as summary when no framework specified.
@@ -6647,6 +6776,7 @@ See also:
'pageinfo-default-sort' => 'The key by which the page is sorted in categories by default.',
'pageinfo-length' => 'The length of the page, in bytes.',
'pageinfo-article-id' => 'The numeric identifier of the page.',
+'pageinfo-language' => 'Language in which the page content is written.',
'pageinfo-robot-policy' => 'The search engine status of the page.
*{{msg-mw|Pageinfo-robot-index}}
*{{msg-mw|Pageinfo-robot-noindex}}',
@@ -6654,6 +6784,7 @@ See also:
'pageinfo-robot-noindex' => 'An indication that the page is not indexable (that is, is not listed on the results page of a search engine).',
'pageinfo-views' => 'The number of times the page has been viewed.',
'pageinfo-watchers' => 'The number of users watching the page.',
+'pageinfo-few-watchers' => 'Message displayed when there are fewer than $wgUnwatchedPageThreshold watchers. $1 is the value of $wgUnwatchedPageThreshold.',
'pageinfo-redirects-name' => "The number of redirects to the page.
Used as link text, linked to '{{int:Whatlinkshere-title}}' page ([[Special:WhatLinksHere]]).",
@@ -6685,6 +6816,33 @@ This message is followed by the total number of times the page has been edited.'
* $1 is the number of templates transcluded within the current page.
See also:
* {{msg-mw|Pageinfo-transclusions}}',
+'pageinfo-transclusions' => 'The list of pages on which this page is transcluded. Parameters:
+* $1 is the number of pages the current page is transcluded on.
+See also:
+* {{msg-mw|Pageinfo-templates}}',
+'pageinfo-toolboxlink' => "Information link for the page (like 'What links here', but to action=info for the current page instead)",
+'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.
+{{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]]',
+'pageinfo-contentpage-yes' => 'Yes, this page is a content page',
+'pageinfo-protect-cascading' => 'Key for the row which shows whether this page has cascading protection enabled
+*{{msg-mw|Pageinfo-protect-cascading}}
+*{{msg-mw|Pageinfo-protect-cascading-yes}}',
+'pageinfo-protect-cascading-yes' => 'Yes, protections are cascading from here
+*{{msg-mw|Pageinfo-protect-cascading}}
+*{{msg-mw|Pageinfo-protect-cascading-yes}}',
+'pageinfo-protect-cascading-from' => 'Key for a list of pages where protections are cascading from',
+'pageinfo-category-info' => 'Showed on the page displaying information about the current page (add "?action=info" to the URL)',
+'pageinfo-category-pages' => 'See also:
+* {{msg-mw|Pageinfo-category-subcats}}
+* {{msg-mw|Pageinfo-category-files}}',
+'pageinfo-category-subcats' => 'See also:
+* {{msg-mw|Pageinfo-category-pages}}
+* {{msg-mw|Pageinfo-category-files}}',
+'pageinfo-category-files' => 'See also:
+* {{msg-mw|Pageinfo-category-pages}}
+* {{msg-mw|Pageinfo-category-subcats}}',
# Skin names
'skinname-standard' => '{{optional}}
@@ -6730,6 +6888,14 @@ The title for this error message is {{msg-mw|Markedaspatrollederror}}.
The title for this error message is {{msg-mw|Markedaspatrollederror}}.
{{Related|Markedaspatrolled}}',
+'markedaspatrollednotify' => 'Notification shown after the user has marked a change as patrolled successfully. Parameters:
+* $1 - the page title
+See also:
+* {{msg-mw|Markedaspatrollederrornotify}} - error message on failure',
+'markedaspatrollederrornotify' => 'Notification shown after the user has failed to mark a change as patrolled.
+
+See also:
+* {{msg-mw|Markedaspatrollednotify}} - notification on success',
# Patrol log
'patrol-log-page' => '{{doc-logpage}}',
@@ -6807,6 +6973,10 @@ Start with a lowercase letter, unless the first word is "SVG".',
* $2 - the height in pixels
* $3 - the file size including a unit (for example "10 KB")
Non-animated images use {{msg-mw|svg-long-desc}}.',
+'svg-long-error' => 'Displayed for invalid SVG file metadata. Parameters:
+* $1 - the error message
+See also:
+* {{msg-mw|Thumbnail error}}',
'show-big-image' => 'Displayed under an image at the image description page, when it is displayed smaller there than it was uploaded.',
'show-big-image-preview' => 'Message shown under the image description page thumbnail, next to {{msg-mw|show-big-image-other}}.',
'show-big-image-other' => 'Message shown under the image description page thumbnail, next to {{msg-mw|show-big-image-preview}}, if the image is in high resolution.',
@@ -6888,6 +7058,12 @@ See also {{msg-mw|Days-abbrev}}
Part of variable $1 in {{msg-mw|Ago}}
{{Identical|Day}}',
+'months' => 'Full word for "months". $1 is the number of months.
+
+Part of variable $1 in {{msg-mw|Ago}}',
+'years' => 'Full word for "years". $1 is the number of years.
+
+Part of variable $1 in {{msg-mw|Ago}}',
'ago' => 'Phrase for indicating how long ago something happened. $1 is something like "3 days 10 hours", taken from these messages:
*{{msg-mw|Seconds}}
*{{msg-mw|Minutes}}
@@ -6895,6 +7071,7 @@ Part of variable $1 in {{msg-mw|Ago}}
*{{msg-mw|Days}}
*{{msg-mw|Months}}
*{{msg-mw|Years}}',
+'just-now' => 'Phrase for indicating something happened just now.',
# Bad image list
'bad_image_list' => 'This message only appears to guide administrators to add links with the right format. This will not appear anywhere else in MediaWiki.',
@@ -7943,6 +8120,10 @@ See also [[MediaWiki:Confirmemail_body_changed]].
* {{msg-mw|Scarytranscludefailed}}
* {{msg-mw|Scarytranscludefailed-httpstatus}}',
+'scarytranscludefailed-httpstatus' => 'Identical to {{msg-mw|scarytranscludefailed}}, but shows the HTTP error which was received.
+
+* {{msg-mw|Scarytranscludefailed}}
+* {{msg-mw|Scarytranscludefailed-httpstatus}}',
'scarytranscludetoolong' => 'The URL was too long.',
# Delete conflict
@@ -8308,6 +8489,7 @@ This is being used in [[Special:Version]], preceeding the subversion revision nu
* $1 - the current year
* $2 - a list of selected MediaWiki authors',
'version-poweredby-others' => 'Used at the very end of {{msg-mw|version-poweredby-credits}} on [[Special:Version]]. First, there\'s a long list of selected MediaWiki authors, then the word "and" (from {{msg-mw|and}}) follows and then this translation, which is supposed to credit the many other people than developer helping with MediaWiki.',
+'version-credits-summary' => 'Summary of the [[Special:Version/Credits]] sub page, which lists all developers etc. who contributed to MediaWiki. Shown at the top.',
'version-license-info' => '[[wikipedia:GNU GPL|GNU GPL]] notice shown at [[Special:Version]]. See //www.gnu.org/licenses/old-licenses/gpl-2.0-translations.html for available translations.',
'version-software' => 'Message shown on [[Special:Version]].
This message is followed by the list of installed software (MediaWiki, PHP and MySQL).',
@@ -8522,17 +8704,17 @@ Parameters:
* $1 - version',
# New logging system
-'logentry-delete-delete' => '{{Logentry}}',
-'logentry-delete-restore' => '{{Logentry}}',
-'logentry-delete-event' => '{{Logentry}}
+'logentry-delete-delete' => '{{Logentry|[[Special:Log/delete]]}}',
+'logentry-delete-restore' => '{{Logentry|[[Special:Log/delete]]}}',
+'logentry-delete-event' => '{{Logentry|[[Special:Log/delete]]}}
{{Logentryparam}}
-* $3 is the name of the log page inside parenthesis',
-'logentry-delete-revision' => '{{Logentry}}
+* $3 - the name of the log page inside parenthesis',
+'logentry-delete-revision' => '{{Logentry|[[Special:Log/delete]]}}
{{Logentryparam}}
-* $5 is the number of affected revisions of the page $3.',
-'logentry-delete-event-legacy' => '{{Logentry}}
-$3 is the name of the log page inside parenthesis',
-'logentry-delete-revision-legacy' => '{{Logentry}}',
+* $5 - the number of affected revisions of the page $3.',
+'logentry-delete-event-legacy' => '{{Logentry|[[Special:Log/delete]]}}
+* $3 - the name of the log page inside parenthesis',
+'logentry-delete-revision-legacy' => '{{Logentry|[[Special:Log/delete]]}}',
'logentry-suppress-delete' => "{{Logentry}}
'Hid' is a possible alternative to 'suppressed' in this message.",
@@ -8541,7 +8723,7 @@ $3 is the name of the log page inside parenthesis',
$3 is the name of the log page inside parenthesis',
'logentry-suppress-revision' => '{{Logentry}}
{{Logentryparam}}
-* $5 is the number of affected revisions of the page $3.',
+* $5 - the number of affected revisions of the page $3.',
'logentry-suppress-event-legacy' => '{{Logentry}}
$3 is the name of the log page inside parenthesis',
'logentry-suppress-revision-legacy' => '{{Logentry}}',
@@ -8585,31 +8767,54 @@ $3 is the name of the log page inside parenthesis',
* {{msg-mw|logentry-delete-revision}}
* {{msg-mw|logentry-suppress-event}}
* {{msg-mw|logentry-suppress-event}}',
-'logentry-move-move' => '{{Logentry}}
+'logentry-move-move' => '{{Logentry|[[Special:Log/move]]}}
Parameter $4, the target page, is also not visible to parser functions.',
-'logentry-move-move-noredirect' => '{{Logentry}}
+'logentry-move-move-noredirect' => '{{Logentry|[[Special:Log/move]]}}
Parameter $4, the target page, is also not visible to parser functions.',
-'logentry-move-move_redir' => '{{Logentry}}
+'logentry-move-move_redir' => '{{Logentry|[[Special:Log/move]]}}
Parameter $4, the target page, is also not visible to parser functions.',
-'logentry-move-move_redir-noredirect' => '{{Logentry}}
+'logentry-move-move_redir-noredirect' => '{{Logentry|[[Special:Log/move]]}}
Parameter $4, the target page, is also not visible to parser functions.',
-'logentry-patrol-patrol' => '{{Logentry}}
-* $4 is a formatted revision number, maybe linked to the diff.',
-'logentry-patrol-patrol-auto' => '{{Logentry}}
-* $4 is a formatted revision number, maybe linked to the diff.
+'logentry-patrol-patrol' => '{{Logentry|[[Special:Log/patrol]]}}
+* $4 - a formatted revision number, maybe linked to the diff.',
+'logentry-patrol-patrol-auto' => '{{Logentry|[[Special:Log/patrol]]}}
+* $4 - a formatted revision number, maybe linked to the diff.
"Automatically" refers to users with autopatrol right who mark revisions automatically patrolled when editing.',
-'logentry-newusers-newusers' => 'Parameters:
-* $1 - user name',
-'logentry-newusers-create' => '{{Logentry}}
+'logentry-newusers-newusers' => '{{Logentry|[[Special:Log/newusers]]}}',
+'logentry-newusers-create' => '{{Logentry|[[Special:Log/newusers]]}}
$4 is the gender of the target user.',
-'logentry-newusers-create2' => '{{Logentry}}
+'logentry-newusers-create2' => '{{Logentry|[[Special:Log/newusers]]}}
$4 is the name of the user that was created.',
-'logentry-newusers-autocreate' => '{{Logentry}}
+'logentry-newusers-byemail' => '{{Logentry|[[Special:Log/newusers]]}}
+
+$4 is the name of the user that was created.',
+'logentry-newusers-autocreate' => '{{Logentry|[[Special:Log/newusers]]}}
$4 is the gender of the target user.',
-'newuserlog-byemail' => 'Used as reason in [[Special:Log/newusers]].',
+'logentry-rights-rights' => '* $1 - username
+* $2 - (see below)
+* $3 - username
+* $4 - list of user groups or {{msg-mw|Rightsnone}}
+* $5 - list of user groups or {{msg-mw|Rightsnone}}
+----
+{{Logentry|[[Special:Log/rights]]}}',
+'logentry-rights-rights-legacy' => '* $1 - username
+* $2 - (see below)
+* $3 - username
+----
+{{Logentry|[[Special:Log/rights]]}}',
+'logentry-rights-autopromote' => '* $1 - username
+* $2 - (see below)
+* $3 - (see below)
+* $4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}
+* $5 - comma separated list of new user groups
+----
+{{Logentry|[[Special:Log/rights]]}}',
+'rightsnone' => 'Default rights for registered users.
+
+{{Identical|None}}',
# Feedback
'feedback-bugornote' => 'When feedback dialog box is opened, this introductory message in small print explains the options to report a bug or add simple feedback. We expect that people in a hurry will not read this.',
@@ -8679,6 +8884,7 @@ $4 is the gender of the target user.',
'api-error-ok-but-empty' => 'API error message that can be used for client side localisation of API errors.',
'api-error-overwrite' => 'API error message that can be used for client side localisation of API errors.',
'api-error-stashfailed' => 'API error message that can be used for client side localisation of API errors.',
+'api-error-publishfailed' => 'API error message that can be used for client side localisation of API errors.',
'api-error-timeout' => 'API error message that can be used for client side localisation of API errors.',
'api-error-unclassified' => 'API error message that can be used for client side localisation of API errors.',
'api-error-unknown-code' => 'API error message that can be used for client side localisation of API errors. Parameters:
@@ -8703,4 +8909,7 @@ $4 is the gender of the target user.',
'duration-centuries' => '{{Related|Duration}}',
'duration-millennia' => '{{Related|Duration}}',
+# Image rotation
+'rotate-comment' => 'Edit summary for the act of rotating an image.',
+
);
diff --git a/languages/messages/MessagesQu.php b/languages/messages/MessagesQu.php
index 9c7345a9..9471c384 100644
--- a/languages/messages/MessagesQu.php
+++ b/languages/messages/MessagesQu.php
@@ -131,12 +131,11 @@ $specialPageAliases = array(
$magicWords = array(
'redirect' => array( '0', '#PUSAPUNA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
- 'notoc' => array( '0', '__YUYARINANNAQ__', '__NOTDC__', '__NOTOC__' ),
- 'nogallery' => array( '0', '__RIKCHASUYUNNAQ__', '__NOGALERÃA__', '__NOGALERIA__', '__NOGALLERY__' ),
- 'forcetoc' => array( '0', '__YUYARINATAATIPACHIY__', '__FORZARTDC__', '__FORZARTOC__', '__FORCETOC__' ),
+ 'notoc' => array( '0', '__YUYARINANNAQ__', '__NOTDC__', '__SIN_TDC__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__RIKCHASUYUNNAQ__', '__NOGALERÃA__', '__NOGALERIA__', '__SIN_GALERÃA__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__YUYARINATAATIPACHIY__', '__FORZARTDC__', '__FORZARTOC__', '__FORZAR_TDC__', '__FORCETOC__' ),
'toc' => array( '0', '__YUYARINA__', '__TDC__', '__TOC__' ),
- 'noeditsection' => array( '0', '__AMARAKITAHUKCHAYCHU__', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__UMANNAQ__', '__NOTÃTULO__', '__NOTITULO__', '__NOHEADER__' ),
+ 'noeditsection' => array( '0', '__AMARAKITAHUKCHAYCHU__', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NO_EDITAR_SECCIÓN__', '__NOEDITSECTION__' ),
'currentmonth' => array( '1', 'KUNANKILLA', 'MESACTUAL', 'MES_ACTUAL', 'MESACTUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonthname' => array( '1', 'KUNANKILLASUTI', 'NOMBREMESACTUAL', 'NOMBRE_MES_ACTUAL', 'MESACTUALCOMPLETO', 'CURRENTMONTHNAME' ),
'currentmonthnamegen' => array( '1', 'KUNANKILLASUTIP', 'GENERADORNOMBREMESACTUAL', 'MESACTUALGENITIVO', 'CURRENTMONTHNAMEGEN' ),
@@ -183,7 +182,7 @@ $magicWords = array(
'subjectpagename' => array( '1', 'QILLQAPANQASUTI', 'NOMBREDEPAGINADETEMA', 'NOMBREDEPÃGINADETEMA', 'NOMBREDEPÃGINADEASUNTO', 'NOMBREDEPAGINADEASUNTO', 'NOMBREDEPAGINADEARTICULO', 'NOMBREDEPÃGINADEARTÃCULO', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
'subjectpagenamee' => array( '1', 'QILLQAPANQASUTIE', 'NOMBREDEPAGINADETEMAC', 'NOMBREDEPÃGINADETEMAC', 'NOMBREDEPÃGINADEASUNTOC', 'NOMBREDEPAGINADEASUNTOC', 'NOMBREDEPAGINADEARTICULOC', 'NOMBREDEPÃGINADEARTÃCULOC', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
'msg' => array( '0', 'WILLA:', 'MSJ:', 'MSG:' ),
- 'subst' => array( '0', 'WAKCHAY:', 'SUBST:' ),
+ 'subst' => array( '0', 'WAKCHAY:', 'SUST:', 'FIJAR:', 'SUBST:' ),
'msgnw' => array( '0', 'WILLAMUSUQ:', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'rikchacha', 'miniaturadeimagen', 'miniatura', 'mini', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'rikchacha=$1', 'miniaturadeimagen=$1', 'miniatura=$1', 'thumbnail=$1', 'thumb=$1' ),
@@ -236,7 +235,7 @@ $magicWords = array(
'ucfirst' => array( '0', 'HATUNÑAWPAQ:', 'HATUNNAWPAQ:', 'PRIMEROMAYUS;', 'PRIMEROMAYÚS:', 'UCFIRST:' ),
'lc' => array( '0', 'UCHUY:', 'MINUS:', 'MINÚS:', 'LC:' ),
'uc' => array( '0', 'HATUN:', 'MAYUS:', 'MAYÚS:', 'UC:' ),
- 'raw' => array( '0', 'CHAWA:', 'RAW:' ),
+ 'raw' => array( '0', 'CHAWA:', 'SINFORMATO', 'SINPUNTOS', 'RAW:' ),
'displaytitle' => array( '1', 'SUTITARIKUCHIY', 'MOSTRARTÃTULO', 'MOSTRARTITULO', 'DISPLAYTITLE' ),
'currentversion' => array( '1', 'KUNANMUSUQCHASQA', 'REVISIÓNACTUAL', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
'urlencode' => array( '0', 'URLLLAWICHAY', 'URL-LLAWICHAY', 'CODIFICAR', 'CODIFICARURL:', 'URLENCODE:' ),
@@ -246,7 +245,7 @@ $magicWords = array(
'directionmark' => array( '1', 'PURIRIYSANANCHA', 'DIRECTIONMARK', 'DIRMARK' ),
'language' => array( '0', '#RIMAY:', '#IDIOMA:', '#LANGUAGE:' ),
'contentlanguage' => array( '1', 'SAMIQRIMAY', 'IDIOMADELCONTENIDO', 'IDIOMADELCONT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
- 'pagesinnamespace' => array( '1', 'SUTIKITIPIPANQAKUNA:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'pagesinnamespace' => array( '1', 'SUTIKITIPIPANQAKUNA:', 'PÃGINASENESPACIO', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
'numberofadmins' => array( '1', 'HAYKAKAMACHIQ', 'NÚMEROADMINISITRADORES', 'NÚMEROADMINS', 'NUMEROADMINS', 'NUMEROADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMERODEADMINS', 'NÚMERODEADMINISTRADORES', 'NÚMERODEADMINS', 'NÚMEROADMINIISTRADORES', 'NUMBEROFADMINS' ),
'formatnum' => array( '0', 'YUPAYRIKCHAKUY', 'FORMATONÚMERO', 'FORMATONUMERO', 'FORMATNUM' ),
'padleft' => array( '0', 'PADLLUQI', 'PADICHUQ', 'PADLEFT' ),
@@ -400,6 +399,7 @@ $messages = array(
'newwindow' => '(Musuq wintanam kichakun)',
'cancel' => 'Ama niy',
'moredotdotdot' => 'Aswan...',
+'morenotlisted' => 'Aswanqa sutisuyupi manam kanchu...',
'mypage' => "P'anqay",
'mytalk' => 'Rimachinay',
'anontalk' => 'Kay IP huchhapaq rimanakuy',
@@ -411,7 +411,6 @@ $messages = array(
'qbbrowse' => 'Maskapuy',
'qbedit' => "Llamk'apuy",
'qbpageoptions' => "P'anqap akllanankuna",
-'qbpageinfo' => "P'anqamanta willay",
'qbmyoptions' => 'Akllanaykuna',
'qbspecialpages' => "Sapaq p'anqakuna",
'faq' => 'Pasaq tapuykuna',
@@ -434,6 +433,7 @@ $messages = array(
'namespaces' => "Suti k'itikuna",
'variants' => "Ñawra rikch'akuykuna",
+'navigation-heading' => "Wamp'una last'a",
'errorpagetitle' => 'Pantasqa',
'returnto' => '$1-man kutimuy.',
'tagline' => '{{SITENAME}}manta',
@@ -673,10 +673,10 @@ Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".',
# Login and logout pages
'logouttext' => "'''Llamk'apuy tiyayniykiqa puchukasqañam.'''
-Sutinnaq kaspaykipas {{SITENAME}}pi wamp'uytam atinki. Mana hinataq munaspaykiqa, [[Special:UserLogin|musuqmanta yaykuy]] ñawpaq icha huk sutiwan. Huk p'anqakunaqa kaqllam rikch'akunqa, ''cache'' nisqa pakasqa hallch'ata mana ch'usaqchaptiykiqa.",
-'welcomecreation' => '== Allinmi hamusqayki $1! ==
-Rakiqunaykiqa kicharisqañam.
-Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] kikinchayta.',
+Sutinnaq kaspaykipas {{SITENAME}}pi wamp'uytam atinki. Mana hinataq munaspaykiqa, <span class='plainlinks'>[$1 musuqmanta yaykuy]</span> ñawpaq icha huk sutiwan. Huk p'anqakunaqa kaqllam rikch'akunqa, ''cache'' nisqa pakasqa hallch'ata mana ch'usaqchaptiykiqa.",
+'welcomeuser' => 'Allinmi hamusqayki, $1!',
+'welcomecreation-msg' => 'Rakiqunaykiqa kamarisqañam.
+Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] hukchayta.',
'yourname' => 'Ruraq sutiyki:',
'yourpassword' => 'Yaykuna rimayki',
'yourpasswordagain' => 'Yaykuna rimaykita kutipayay',
@@ -699,7 +699,7 @@ Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] kikinch
'gotaccount' => "Rakiqunaykiñachu kachkan? '''$1'''.",
'gotaccountlink' => 'Rakiqunaykita willaway',
'userlogin-resetlink' => 'Yaykuna willayniykikunatari qunqarqankichu?',
-'createaccountmail' => 'chaskipaq',
+'createaccountmail' => "Kikinmanta tukusqa mit'alla yaykuna rimata llamk'achispa kay qatiqpi kaq e-chaski imamaytaman kachay",
'createaccountreason' => 'Kayrayku:',
'badretype' => 'Qusqayki yaykuna rimakunaqa manam kaqllachu.',
'userexists' => 'Munasqayki ruraqpa sutiykiqa kachkanñam.
@@ -763,6 +763,7 @@ Kay willay pantasqa kaptinqa, qhawarparillay.',
# Email sending
'php-mail-error-unknown' => 'Mana riqsisqa pantasqa PHP mail() rurananpi',
'user-mail-no-addy' => 'Mana chaskiqniyuq e-chaskita kachayta munarqanki.',
+'user-mail-no-body' => 'Mana kurkuyuq icha ancha pisilla kurkuyuq e-chaskita kachayta munarqanki.',
# Change password dialog
'resetpass' => 'Ruraqpa yaykuna rimanta hukchay',
@@ -828,6 +829,7 @@ Mit'alla yaykuna rima: $2",
'changeemail-oldemail' => 'Kunan kachkaq e-chaski imamayta:',
'changeemail-newemail' => 'Musuq e-chaski imamayta:',
'changeemail-none' => '(mana ima)',
+'changeemail-password' => '{{SITENAME}} yaykuna rimayki:',
'changeemail-submit' => 'E-chaskita wakinchay',
'changeemail-cancel' => 'Ama niy',
@@ -991,7 +993,6 @@ Hallch'api qhipaq kaq yaykuchisqataqa kay qatiqpim rikunki willasunaykipaq:",
'template-protected' => '(amachasqa)',
'template-semiprotected' => '(rakilla amachasqa)',
'hiddencategories' => "Kay p'anqaqa {{PLURAL:$1|1 pakasqa katiguriya|$1 pakasqa katiguriyakuna}}manmi kapun:",
-'nocreatetitle' => "P'anqa kamariyqa saywachasqam",
'nocreatetext' => "{{SITENAME}}piqa saywachasqam musuq p'anqakunata kamariy. Ñawpaqman kutiytam atinkiman kachkaqña p'anqata llamk'apuspa. Astawantaq, [[Special:UserLogin|yaykuy icha musuq rakiqunata kichariy]].",
'nocreate-loggedin' => "Manam saqillasunkichu musuq p'anqakunata kamariyta.",
'sectioneditnotsupported-title' => "Raki allichayqa manam q'imisqachu",
@@ -1015,6 +1016,14 @@ Qullusqachá.",
'edit-already-exists' => "Manam atinichu musuq p'anqata kamariyta.
Kachkañam.",
'defaultmessagetext' => 'Ñawpaq qillqa',
+'invalid-content-data' => 'Samiqmanta willaykunaqa manam allinchu',
+'content-not-allowed-here' => '"$1" nisqa samiqqa [[$2]] sutiyuq p\'anqapi manam saqillasqachu',
+
+# Content models
+'content-model-wikitext' => 'wiki qillqa',
+'content-model-text' => 'qillqalla',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "Paqtataq: Kay p'anqaqa nisyu achka qullqipaq t'ikrana rurana qayayniyuqmi.
@@ -1375,9 +1384,9 @@ Chaytataq manam kutichiyta atinkichu.",
'prefs-emailconfirm-label' => 'E-chaskita takyachiy:',
'prefs-textboxsize' => "Llamk'apuna wintanap chhikan kaynin",
'youremail' => 'E-chaski imamaytayki',
-'username' => 'Ruraqpa sutin:',
-'uid' => 'Ruraqpa ID-nin:',
-'prefs-memberingroups' => 'Kay {{PLURAL:$1|huñuman|huñukunaman}} kapuq:',
+'username' => '{{GENDER:$1|Ruraqpa sutin}}:',
+'uid' => '{{GENDER:$1|Ruraqpa}} ID-nin:',
+'prefs-memberingroups' => 'Kay {{PLURAL:$1|huñuman|huñukunaman}} {{GENDER:$2|kapuq}}:',
'prefs-registration' => "Hallch'ay pacha:",
'yourrealname' => 'Chiqap sutiyki*',
'yourlanguage' => 'Rimay:',
@@ -1525,12 +1534,13 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
'right-sendemail' => 'Huk ruraqkunaman e-chaskita kachay',
'right-passwordreset' => 'Yaykuna rima kutichina e-chaskikunata qhaway',
+# Special:Log/newusers
+'newuserlogpage' => "Rakiquna kamariy hallch'a",
+'newuserlogpagetext' => "Kayqa ruraqkunap rakiqunankunata kamariymanta hallch'am.",
+
# User rights log
'rightslog' => 'Ruraqpa hayñinkunap hukyasqankuna',
'rightslogtext' => "Kayqa hayñi hukchasqa hallch'aymi.",
-'rightslogentry' => 'hukchan $1-pa hayñinkunata $2-manta $3-man',
-'rightslogentry-autopromote' => 'kikinmanta $2-manta $3-manmi ñawpanchisqa',
-'rightsnone' => '(-)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => "kay p'anqata ñawiriy",
@@ -1745,6 +1755,7 @@ $1',
'backend-fail-notsame' => '$1 nisqapiqa mana kaqlla willañiqim kachkanña.',
'backend-fail-invalidpath' => '$1 nisqaqa manam allin pirwa ñanchu.',
'backend-fail-delete' => 'Manam atinichu $1 sutiyuq willañiqita qulluyta.',
+'backend-fail-describe' => '"$1" sutiyuq p\'anqapaq metadatata manam hukchayta atinichu.',
'backend-fail-alreadyexists' => '$1 sutiyuq willañiqiqa kachkanñam.',
'backend-fail-store' => 'Manam atinichu $1 sutiyuq willañiqita $2-pi pirwayta.',
'backend-fail-copy' => 'Manam atinichu willañiqita $1-manta $2-man iskaychayta.',
@@ -1977,6 +1988,12 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
Chay rantiqa chiqap, hukchanasqa p'anqamanmi t'inkichun.<br />
P'anqa [[MediaWiki:Disambiguationspage]] plantillayuq kaspaqa sut'ichana qillqam kanqa.",
+'pageswithprop' => "Kaqninniyuq p'anqakuna",
+'pageswithprop-legend' => "Kaqninniyuq p'anqakuna",
+'pageswithprop-text' => "Kay p'anqapiqa sapaq kaqninniyuq p'anqakunatam sutisuyupi rikunki.",
+'pageswithprop-prop' => 'Kaqninpa sutin:',
+'pageswithprop-submit' => 'Riy',
+
'doubleredirects' => 'Iskaylla pusapunakuna',
'doubleredirectstext' => "Kay p'anqapiqa huk pusapuna p'anqaman pusapuq p'anqakunap sutinkunatam rikunki. Sapa sinrupiqa ñawpaq ñiqin, iskay ñiqinpas pusapunaman t'inkikunam, iskay ñiqin pusapunap taripananpa qallariyninpas, sapsilla \"chiqap\" allin taripana qillqam, maymanchus ñawpaq ñiqin pusapuna p'anqa pusachun.
<del>Chakapusqa</del> taripasqakunaqa paskasqañam.",
@@ -2128,7 +2145,7 @@ Rikuyniykitaqa k'ullkuchaytam atinki hallch'a layata, ruraqpa sutinta (uchuy ich
'linksearch-ok' => 'Maskay',
'linksearch-text' => 'Ima rantipas sananchawanpas maskayta saqillasunkim, ahinataq "*.wikipedia.org".
Hawa kaq duminyullapas kanam, ahinataq "*.org".<br />
-Q\'imichisqa tantari qillqa: <code>$1</code> (maskaspaykiqa kaykunamanta ama mayqintapas yapaychu).',
+Q\'imichisqa tantari {{PLURAL:$2|qillqa|qillqakuna}}: <code>$1</code> (mana mayqintapas akllaptiykiqa, http:// nisqam kanqa).',
'linksearch-line' => "$1-man $2-manta t'inkimusqa",
'linksearch-error' => 'Ima rantipas sananchaqa (* ?) tiyaypa qallariyninpim kanman chaylla.',
@@ -2147,10 +2164,6 @@ Q\'imichisqa tantari qillqa: <code>$1</code> (maskaspaykiqa kaykunamanta ama may
'activeusers-hidesysops' => 'Kamachiqkunata pakay',
'activeusers-noresult' => 'Ruraqkunataqa manam tarinichu.',
-# Special:Log/newusers
-'newuserlogpage' => "Rakiquna kamariy hallch'a",
-'newuserlogpagetext' => "Kayqa ruraqkunap rakiqunankunata kamariymanta hallch'am.",
-
# Special:ListGroupRights
'listgrouprights' => 'Ruraq huñup hayñinkuna',
'listgrouprights-summary' => "Kay qatiq sutisuyupiqa kay wikipi sut'ichasqa ruraq huñukunatam, kikinpa chayamuna hayñinkunatawan rikunki.
@@ -2244,19 +2257,23 @@ Qampa [[Special:Preferences|allinkachinaykikunapi]] qillqakamachisqayki imamayta
'enotif_mailer' => '{{SITENAME}}pa chaski musyachina sirwiqnin',
'enotif_reset' => "Tukuy p'anqakunata watukusqakama sananchay",
-'enotif_newpagetext' => "Musuq p'anqam.",
'enotif_impersonal_salutation' => '{{SITENAME}}pa ruraqnin',
-'changed' => 'hukchasqa',
-'created' => 'kamarirqan',
-'enotif_subject' => '{{SITENAME}}pi $PAGETITLE sutiyuq p\'anqaqa $PAGEEDITOR-pa $CHANGEDORCREATED-nñam',
+'enotif_subject_deleted' => "{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p'anqatam qullurqañam",
+'enotif_subject_created' => "{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p'anqatam kamarirqañam",
+'enotif_subject_moved' => "{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p'anqatam astarqañam",
+'enotif_subject_restored' => "{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p'anqatam qullusqamanta paqarichirqañam",
+'enotif_subject_changed' => "{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p'anqatam hukcharqañam",
+'enotif_body_intro_deleted' => '{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p\'anqatam $PAGEEDITDATE p\'unchawpi qullurqañam, kaypi qhaway: $3.',
+'enotif_body_intro_created' => '{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p\'anqatam $PAGEEDITDATE p\'unchawpi kamarirqañam, kunan musuqchasqatataq kaypi qhaway: $3.',
+'enotif_body_intro_moved' => '{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p\'anqatam $PAGEEDITDATE p\'unchawpi astarqañam, kunan musuqchasqatataq kaypi qhaway: $3.',
+'enotif_body_intro_restored' => '{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p\'anqatam qullusqamanta $PAGEEDITDATE p\'unchawpi paqarichirqañam, kunan musuqchasqatataq kaypi qhaway: $3.',
+'enotif_body_intro_changed' => '{{gender:$2|$2}} sutiyuq ruraqqa {{SITENAME}} nisqapi kaq $1 nisqa p\'anqatam $PAGEEDITDATE p\'unchawpi hukcharqañam, kunan musuqchasqatataq kaypi qhaway: $3.',
'enotif_lastvisited' => "$1 sutiyuq p'anqata qhaway qayna watukamusqaykimantapacha tukuy hukchasqakunata rikunaykipaq.",
'enotif_lastdiff' => "$1 sutiyuq p'anqata qhaway kay hukchasqata rikunaykipaq.",
'enotif_anon_editor' => 'sutinnaq ruraq $1',
'enotif_body' => 'Munakusqa $WATCHINGUSERNAME,
-{{SITENAME}}pi $PAGETITLE sutiyuq p\'anqataqa $PAGEEDITOR sutiyuq ruraqmi $CHANGEDORCREATED $PAGEEDITDATE pachapi, $PAGETITLE_URL sutiyuq p\'anqata qhaway kunan hukchasqata rikunaykipaq.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Llamk\'apuqpa willasqan: $PAGESUMMARY $PAGEMINOREDIT
@@ -2264,7 +2281,7 @@ Llamk\'apuqta tapuy:
e-chaski: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Kay p\'anqata mana musuqmanta watukamuptiykiqa, manam huk hukchasqakunamanta willasqaykichu. Tukuy watiqasqayki p\'anqakunapaq musyachina sananchakunatapas kutichiytam atinkiman.
+Kay p\'anqata mana musuqmanta watukamuptiykiqa, manam huk ruraykunamanta willasqaykichu. Tukuy watiqasqayki p\'anqakunapaq musyachina sananchakunatapas kutichiytam atinkiman.
Tukuy sunquwan, {{SITENAME}}pa e-chaski musyachina llikan
@@ -2280,6 +2297,8 @@ $UNWATCHURL
Yanapasunaykipaq:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'kamarirqan',
+'changed' => 'hukchasqa',
# Delete
'deletepage' => "Kay p'anqata qulluy",
@@ -2346,6 +2365,8 @@ Ama hina kaspa, llika wamp'unaykipi \"Ñawpaqman\" (\"Back\") ñit'ispa ñawpaq
'prot_1movedto2' => '«[[$1]]» «[[$2]]»-man astasqa',
'protect-badnamespace-title' => "Mana amachanalla suti k'iti",
'protect-badnamespace-text' => "Kay suti k'iti kaq p'anqakunaqa manam amachanallachu.",
+'protect-norestrictiontypes-text' => "Kay p'anqaqa manam amachanapaqchu, saywachana rikch'aqkuna (llamk'apuna icha kamarina hina) mana kaptinmi.",
+'protect-norestrictiontypes-title' => "Mana amachana p'anqa",
'protect-legend' => 'Amachayta takyachiy',
'protectcomment' => 'Kayrayku:',
'protectexpiry' => 'Amachaypa puchukaynin',
@@ -2423,7 +2444,7 @@ Huklla llamk'apusqakunata paqarichinaykipaqqa, munasqayki llamk'apusqakunata akl
'undeletedrevisions' => "{{PLURAL:$1|Huk paqarichisqa llamk'apusqa|$1 paqarichisqa llamk'apusqakuna}}",
'undeletedrevisions-files' => "{{PLURAL:$1|1 llamk'apusqaqa|$1 llamk'apusqakunaqa}} {{PLURAL:$2|1 willañiqipas|$2 willañiqikunapas}} paqarichisqam",
'undeletedfiles' => '{{PLURAL:$1|1 willañiqiqa|$1 willañiqikunaqa}} paqarichisqam',
-'cannotundelete' => 'Manam atinichu qullusqata paqarichiyta; huk runachá ñawpaqtaña qullusqata paqarichirqan.',
+'cannotundelete' => 'Manam atinichu qullusqata paqarichiyta: $1',
'undeletedpage' => "'''$1 nisqaqa paqarichisqañam'''
[[Special:Log/delete|Qulluy hallch'api]] qhaway ñaqha qullusqakunata paqarichisqakunatapas rikunaykipaq.",
@@ -2454,7 +2475,7 @@ $1',
'blanknamespace' => '(Uma)',
# Contributions
-'contributions' => "Ruraqpa llamk'apusqankuna",
+'contributions' => "{{GENDER:$1|Ruraqpa}} llamk'apusqankuna",
'contributions-title' => "$1 sutiyuq ruraqpa llamk'apusqankuna",
'mycontris' => "Llamk'apusqaykuna",
'contribsub2' => '$1 ($2)',
@@ -2711,6 +2732,7 @@ Tukuna p\'anqaqa ("[[:$1]]") kachkañam. Astanapaq qulluyta munankichu?',
'immobile-target-namespace-iw' => "Wikipura t'inkiqa p'anqa astanapaq manam allin taripanachu.",
'immobile-source-page' => "Kay p'anqaqa manam astanallachu.",
'immobile-target-page' => 'Manam atinichu chay taripana sutiman astayta.',
+'bad-target-model' => "Munakusqa taripanaqa wakin samiq qatillanayuqmi. Manam atinichu $1-manta $2-man t'ikrayta.",
'imagenocrossnamespace' => "Manam atinichu p'anqata astayta mana willañiqipaq suti k'itiman",
'nonfile-cannot-move-to-file' => "Manam atinichu mana willañiqi kaqta astayta willañiqipaq suti k'itiman",
'imagetypemismatch' => "Willañiqip musuq mast'arinanqa kay layapaq manam allinchu",
@@ -2835,7 +2857,6 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
# JavaScriptTest
'javascripttest' => 'JavaScript llanchiy',
-'javascripttest-disabled' => 'Kay ruranaqa kay wikipi manam atichisqachu.',
'javascripttest-title' => '$1 llanchiykunam richkan',
'javascripttest-pagetext-noframework' => "Kay p'anqaqa JavaScript llanchina purichinallapaqmi kachun.",
'javascripttest-pagetext-unknownframework' => 'Mana riqsisqa "$1" nisqa llanchina inchu ruray',
@@ -2972,11 +2993,13 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
'pageinfo-default-sort' => 'Kikinmanta ñiqichana llawi',
'pageinfo-length' => "P'anqap chhikan (byte)",
'pageinfo-article-id' => "P'anqap ID-nin",
+'pageinfo-language' => "P'anqap rimaynin",
'pageinfo-robot-policy' => 'Maskana kuyuchinap kachkaynin',
'pageinfo-robot-index' => 'Maskana yuyarinapaqpas',
'pageinfo-robot-noindex' => 'Mana maskana yuyarinapaq',
'pageinfo-views' => "Hayk'a qhawaykuna",
'pageinfo-watchers' => "P'anqata hayk'a watiqaqkuna",
+'pageinfo-few-watchers' => '$1-manta aswan pisi {{PLURAL:$1|qhawaq|qhawaqkuna}}',
'pageinfo-redirects-name' => "Kay p'anqaman pusampuqkuna",
'pageinfo-subpages-name' => "Kay p'anqap urin p'anqankuna",
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|pusapuna|pusapunakuna}}; $3 {{PLURAL:$3|mana pusapuna|mana pusapunakuna}})',
@@ -2991,6 +3014,19 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
'pageinfo-magic-words' => 'Layqa {{PLURAL:$1|simi|simikuna}} ($1)',
'pageinfo-hidden-categories' => 'Pakasqa {{PLURAL:$1|katiguriya|katiguriyakuna}} ($1)',
'pageinfo-templates' => "Ch'aqtasqa {{PLURAL:$1|plantilla|plantillakuna}} ($1)",
+'pageinfo-transclusions' => "Kaypi ch'aqtasqa {{PLURAL:$1|p'anqa|p'anqakuna}} ($1)",
+'pageinfo-toolboxlink' => "P'anqamanta willakuna",
+'pageinfo-redirectsto' => 'Kayman pusampun:',
+'pageinfo-redirectsto-info' => 'willachikuy',
+'pageinfo-contentpage' => "Samiqniyuq p'anqa hinam chaninchasqa",
+'pageinfo-contentpage-yes' => 'Arí',
+'pageinfo-protect-cascading' => "Amachaykunaqa kaymanta ch'aqtakunmi",
+'pageinfo-protect-cascading-yes' => 'Arí',
+'pageinfo-protect-cascading-from' => "Amachaykunaqa kaymanta ch'aqtakunmi:",
+'pageinfo-category-info' => 'Katiguriyamanta willaykuna',
+'pageinfo-category-pages' => "Hayk'a p'anqakuna",
+'pageinfo-category-subcats' => "Hayk'a urin katiguriyakuna",
+'pageinfo-category-files' => "Hayk'a willañiqikuna",
# Patrolling
'markaspatrolleddiff' => 'Qhawakipasqaman sananchay',
@@ -3002,6 +3038,8 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
'markedaspatrollederror' => 'Manam atinichu qhawakipasqaman sananchayta',
'markedaspatrollederrortext' => "Huk llamk'apusqata akllanaykim tiyan qhawakipasqaman sananchanaykipaq.",
'markedaspatrollederror-noautopatrol' => "Manam saqillasunkichu qampa llamk'apusqaykikunata qhawakipasqaman sananchayta.",
+'markedaspatrollednotify' => "Kay $1 sutiyuq p'anqapi hukchasqaqa qhawakipasqa nisqa sananchasqañam.",
+'markedaspatrollederrornotify' => 'Qhawakipasqa niyqa manam aypanchu.',
# Patrol log
'patrol-log-page' => "Qhawakipay hallch'a",
@@ -3035,6 +3073,7 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
'file-nohires' => 'Manam kanchu aswan huyakuyuq rikcha.',
'svg-long-desc' => 'SVG willañiqi, rimasqakama $1 × $2 iñuyuq, willañiqip chhikan kaynin: $3',
'svg-long-desc-animated' => 'Kuyuchisqa SVG willañiqi, rimasqakama $1 × $2 iñuyuq, willañiqip chhikan kaynin: $3',
+'svg-long-error' => 'Mana allin SVG willañiqi: $1',
'show-big-image' => 'Qallariy huyaku',
'show-big-image-preview' => 'Kay ñawpaq qhawariypa chhikan kaynin: $1.',
'show-big-image-other' => 'Huk {{PLURAL:$2|huyaku|huyakukuna}}: $1.',
@@ -3064,7 +3103,10 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
'minutes' => '{{PLURAL:$1|huk minutu|$1 minutu}}',
'hours' => '{{PLURAL:$1|huk ura|$1 ura}}',
'days' => "{{PLURAL:$1|huk p'unchaw|$1 p'unchaw}}",
+'months' => '{{PLURAL:$1|huk killa|$1 killa}}',
+'years' => '{{PLURAL:$1|huk wata|$1 wata}}',
'ago' => '$1 ñaqha',
+'just-now' => 'kunallan',
# Bad image list
'bad_image_list' => "Chantaqa kay hinam:
@@ -3550,6 +3592,7 @@ Kay takyachina tuyruqa $4 pachapim puchukanqa.',
# Scary transclusion
'scarytranscludedisabled' => "[Interwiki ch'aqtayman ama nisqa]",
'scarytranscludefailed' => '[$1-paq plantillataqa manam chaskiyta atinchu]',
+'scarytranscludefailed-httpstatus' => '[$1-paq plantillataqa manam chaskiyta atinchu: HTTP $2]',
'scarytranscludetoolong' => '[URL tiyayqa nisyu hatunmi]',
# Delete conflict
@@ -3656,6 +3699,7 @@ Sapsilla ñawpaq qhawariyta tukuykachay.',
'version-license' => 'Saqillay',
'version-poweredby-credits' => "Kay wikitaqa '''[//www.mediawiki.org/ MediaWiki-m]''' atichin, copyright © 2001-$1 $2.",
'version-poweredby-others' => 'hukkuna',
+'version-credits-summary' => "Kay qatiqpi runakunatam [[Special:Version|MediaWiki]] nisqapaq llamk'apusqankunapaq riqsichiyta munayku.",
'version-license-info' => "MediaWiki llamp'u kaqqa qispim; mast'ariytam icha wakinchaytam atinki GNU General Public License nisqa saqillaypa kamachisqankama, Free Software Foundation nisqap uyaychasqan; saqillaypa iskay ñiqin musuqchasqan, munaspaykiqa aswan musuq musuqchasqan.
MediaWikitaqa mast'ariyku runakunata yanapanapaqmi, ichataq MANAM FIYAKUYTA ATIYKUCHU; manapas ch'aqtasqa RURANALLA FIYAKUYTACHU manapas ima SAPAQ TUKUYNINPAQCHU. GNU General Public License nisqa saqillayta qhaway aswan yuyaykunapaq.
@@ -3769,17 +3813,17 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
'sqlite-no-fts' => "$1 mana hunt'a qillqa maskana yanapawan",
# New logging system
-'logentry-delete-delete' => "$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullun",
-'logentry-delete-restore' => "$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullusqamanta paqarichin",
-'logentry-delete-event' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta wakinchan $3 p'anqapi: $4",
-'logentry-delete-revision' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta wakinchan $3 p'anqapi: $4",
-'logentry-delete-event-legacy' => "$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta wakinchan $3 p'anqapi",
-'logentry-delete-revision-legacy' => "$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta wakinchan $3 p'anqapi",
-'logentry-suppress-delete' => "$1 sutiyuq ruraqqa $3 nisqa p'anqatam ñit'ipan",
-'logentry-suppress-event' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
-'logentry-suppress-revision' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
-'logentry-suppress-event-legacy' => "$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
-'logentry-suppress-revision-legacy' => "$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
+'logentry-delete-delete' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullun",
+'logentry-delete-restore' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullusqamanta paqarichin",
+'logentry-delete-event' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta wakinchan $3 p'anqapi: $4",
+'logentry-delete-revision' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta wakinchan $3 p'anqapi: $4",
+'logentry-delete-event-legacy' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta wakinchan $3 p'anqapi",
+'logentry-delete-revision-legacy' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta wakinchan $3 p'anqapi",
+'logentry-suppress-delete' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqatam ñit'ipan",
+'logentry-suppress-event' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
+'logentry-suppress-revision' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
+'logentry-suppress-event-legacy' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
+'logentry-suppress-revision-legacy' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
'revdelete-content-hid' => 'samiq pakasqa',
'revdelete-summary-hid' => "llamk'apuypa pisichaynin pakasqa",
'revdelete-uname-hid' => 'ruraqpa sutin pakasqa',
@@ -3788,17 +3832,21 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
'revdelete-uname-unhid' => 'ruraqpa sutin rikuchisqa',
'revdelete-restricted' => "kamachiqkunaman llamk'achisqa saywachanakuna",
'revdelete-unrestricted' => 'kamachiqkunamanta qichusqa saywachanakuna',
-'logentry-move-move' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man",
-'logentry-move-move-noredirect' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man mana pusapunata saqispa",
-'logentry-move-move_redir' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa",
-'logentry-move-move_redir-noredirect' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa mana pusapunata saqispa",
-'logentry-patrol-patrol' => "$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam patrullasqa nispa sananchan",
-'logentry-patrol-patrol-auto' => "$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam kikinmanta patrullasqa nispa sananchan",
-'logentry-newusers-newusers' => '$1 sutiyuq rakiquna kamarisqañam',
-'logentry-newusers-create' => '$1 sutiyuq rakiquna kamarisqañam',
-'logentry-newusers-create2' => '$1 sutiyuq ruraqqa $3 sutiyuq rakiqunatam kamarirqanñam',
-'logentry-newusers-autocreate' => '$1 sutiyuq rakiqunaqa kikinmanta kamarisqam',
-'newuserlog-byemail' => 'e-chaskiwan kachasqa yaykuna rima',
+'logentry-move-move' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man",
+'logentry-move-move-noredirect' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man mana pusapunata saqispa",
+'logentry-move-move_redir' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa",
+'logentry-move-move_redir-noredirect' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa mana pusapunata saqispa",
+'logentry-patrol-patrol' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam patrullasqa nispa sananchan",
+'logentry-patrol-patrol-auto' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam kikinmanta patrullasqa nispa sananchan",
+'logentry-newusers-newusers' => '{{GENDER:$2|}}$1 sutiyuq rakiquna kamarisqañam',
+'logentry-newusers-create' => '{{GENDER:$2|}}$1 sutiyuq rakiquna kamarisqañam',
+'logentry-newusers-create2' => '{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 sutiyuq rakiqunatam kamarirqanñam',
+'logentry-newusers-byemail' => '$3 sutiyuq rakiqunataqa $1 {{GENDER:$2|kamarirqañam}}, yaykuna rimataq kachasqañam.',
+'logentry-newusers-autocreate' => '{{GENDER:$2|}}$1 sutiyuq rakiqunaqa kikinmanta kamarisqam',
+'logentry-rights-rights' => '{{GENDER:$2|}}$1 sutiyuq ruraqqa $3-pa huñuman kapuyninta hukchan $4-manta $5-man',
+'logentry-rights-rights-legacy' => '{{GENDER:$2|}}$1 sutiyuq ruraqqa $3-pa huñuman kapuyninta hukchan',
+'logentry-rights-autopromote' => '{{GENDER:$2|}}$1 sutiyuq ruraqqa kikinmantam ñawparikun $4-manta $5-man',
+'rightsnone' => '(-)',
# Feedback
'feedback-bugornote' => "Allwiyapi sasachakuymanta imaymanachanta willayta munaspaykiqa, [\$1 pantasqamanta willay].
@@ -3852,6 +3900,7 @@ Mana chayqa, kay qatiqpi kaq hunt'ana p'anqatam llamk'achiyta atinki. Willapuyni
'api-error-ok-but-empty' => 'Ukhupi pantasqa: Sirwiqqa manam kutipanchu.',
'api-error-overwrite' => 'Kachkaqña willañiqita huknachayqa manam saqillasqachu.',
'api-error-stashfailed' => "Ukhupi pantasqa: Sirwiqqa mit'alla willañiqita manam hallch'ayta atinchu.",
+'api-error-publishfailed' => "Ukhupi pantasqa: Sirwiqqa mit'alla willañiqita manam uyanchayta atinchu.",
'api-error-timeout' => "Suyakusqa mit'apiqa sirwiq manam kutiparqanchu.",
'api-error-unclassified' => 'Mana riqsisqa pantasqam tukurqan.',
'api-error-unknown-code' => 'Mana riqsisqa pantasqa: "$1".',
@@ -3872,4 +3921,7 @@ Mana chayqa, kay qatiqpi kaq hunt'ana p'anqatam llamk'achiyta atinki. Willapuyni
'duration-centuries' => '{{PLURAL:$1|pachakwata|pachakwatakuna}}',
'duration-millennia' => '{{PLURAL:$1|waranqawata|waranqawatakuna}}',
+# Image rotation
+'rotate-comment' => "Rikch'aqa pacha rikuchiqwan $1 {{PLURAL:$1|k'atma}} muyusqam",
+
);
diff --git a/languages/messages/MessagesQug.php b/languages/messages/MessagesQug.php
index 48a5f999..0544c246 100644
--- a/languages/messages/MessagesQug.php
+++ b/languages/messages/MessagesQug.php
@@ -163,7 +163,6 @@ $messages = array(
'qbbrowse' => 'Maskana',
'qbedit' => 'Killkana',
'qbpageoptions' => 'Pankapak akllanakuna',
-'qbpageinfo' => 'Pankamanta willaykuna',
'qbmyoptions' => 'Ñukapak pankakuna',
'qbspecialpages' => 'mans shukkunashina pankakuna',
'faq' => 'Ashtawan tapushkaka tapunakuna',
@@ -354,6 +353,7 @@ Shina kakpika, shuk rurakka ña pankata pichankacha.',
'protectedinterface' => 'Kay pankaka kapak willaykunata charinmi, ama nalli runakunaka kaypi killkankapak harkashkami kapan.',
# Login and logout pages
+'welcomeuser' => '¡Alli shamushka, $1!',
'yourname' => 'Rurak shuti:',
'yourpassword' => 'Yaykunkapak rimay:',
'yourpasswordagain' => 'Yaykunapak rimayta kutin killkapay:',
@@ -526,6 +526,9 @@ Shuk rurakkunaka kikinpa e-chaski ''dirección''ta mana yachankachu.",
'grouppage-sysop' => '{{ns:project}}:Kamachik',
+# Special:Log/newusers
+'newuserlogpage' => 'Rurakkununata kamaykunapa kamu',
+
# User rights log
'rightslog' => 'Rurakpa hayñikunapa kamu',
@@ -641,9 +644,6 @@ Shuk rurakkunaka kikinpa e-chaski ''dirección''ta mana yachankachu.",
'linksearch' => 'hawaman tinkikunata maskana',
'linksearch-line' => '$1 pankaka $2-manta tinkishkami kan',
-# Special:Log/newusers
-'newuserlogpage' => 'Rurakkununata kamaykunapa kamu',
-
# Special:ListGroupRights
'listgrouprights-members' => '(Kay tantanakuypa rurakkunapa shutikuna)',
@@ -703,7 +703,7 @@ $2 rikpika, ima pankakunaka pichashkami kan yachakupanki.',
'blanknamespace' => 'Kapak',
# Contributions
-'contributions' => 'Kay rurakpa killkaykuna',
+'contributions' => '{{GENDER:$1|Kay rurakpa}} killkaykuna',
'contributions-title' => '$1 shutiyuq rurakpa killkaykuna',
'mycontris' => 'Nukapak killkaykuna',
'contribsub2' => '$1 ($2)',
diff --git a/languages/messages/MessagesRgn.php b/languages/messages/MessagesRgn.php
index b8437233..354c9842 100644
--- a/languages/messages/MessagesRgn.php
+++ b/languages/messages/MessagesRgn.php
@@ -157,7 +157,6 @@ $messages = array(
'qbbrowse' => 'Sföja',
'qbedit' => 'Mudèfica',
'qbpageoptions' => 'Upziòn dla pàgina',
-'qbpageinfo' => 'Infurmaziòn sora la pàgina',
'qbmyoptions' => 'Al mi pàgin',
'qbspecialpages' => 'Pàgin particulèri',
'faq' => 'Question frequenti',
@@ -380,6 +379,9 @@ Lezenda: '''({{int:cur}})''' = difarenzi cun la versiòn d'adès; '''({{int:last
'grouppage-sysop' => '{{ns:project}}:Aministradór',
+# Special:Log/newusers
+'newuserlogpage' => "Regèstar d'j nov",
+
# User rights log
'rightslog' => "Dirètt d'j navigador",
@@ -471,9 +473,6 @@ $1 {{PLURAL:$1|elemént|elemént}}',
# Special:LinkSearch
'linksearch' => 'Ghènz int ê web',
-# Special:Log/newusers
-'newuserlogpage' => "Regèstar d'j nov",
-
# Special:ListGroupRights
'listgrouprights-members' => "(Lèsta d'j mèmbar)",
diff --git a/languages/messages/MessagesRm.php b/languages/messages/MessagesRm.php
index eaa5413a..8890581f 100644
--- a/languages/messages/MessagesRm.php
+++ b/languages/messages/MessagesRm.php
@@ -186,7 +186,6 @@ $messages = array(
'qbbrowse' => 'Sfegliar',
'qbedit' => 'Modifitgar',
'qbpageoptions' => 'Questa pagina',
-'qbpageinfo' => 'Context',
'qbmyoptions' => 'Mia pagina',
'qbspecialpages' => 'paginas spezialas',
'faq' => 'FAQ',
@@ -209,6 +208,7 @@ $messages = array(
'namespaces' => 'Tip da pagina',
'variants' => 'Variantas',
+'navigation-heading' => 'Menu da navigaziun',
'errorpagetitle' => 'Errur',
'returnto' => 'Enavos tar $1.',
'tagline' => 'Ord {{SITENAME}}',
@@ -453,10 +453,10 @@ L\'administratur che ha bloccà l\'access da scriva ha dà suandanta explicaziun
# Login and logout pages
'logouttext' => "'''Sortì cun success.'''
-Ti pos cuntinuar cun utilisar {{SITENAME}} anonimamain, u che ti pos [[Special:UserLogin|t'annunziar]] sco medem u in'auter utilisader. Resguarda che entginas paginas pon anc vesair or tuttina sco sche ti eras annunzià enfin che ti has stizzà il cache da tes navigatur.",
-'welcomecreation' => '==Bainvegni, $1! ==
-Tes conto è vegni creà.
-Betg emblida da midar tias [[Special:Preferences|preferenzas da {{SITENAME}}]].',
+Ti pos cuntinuar cun utilisar {{SITENAME}} anonimamain, u che ti pos <span class='plainlinks'>[$1 t'annunziar]</span> sco medem u in'auter utilisader. Resguarda che entginas paginas pon anc vesair or tuttina sco sche ti eras annunzià enfin che ti has stizzà il cache da tes navigatur.",
+'welcomeuser' => 'Bainvegni, $1!',
+'welcomecreation-msg' => "Tes conto è vegnì creà.
+N'emblida betg da midar tias [[Special:Preferences|{{SITENAME}} preferenzas]].",
'yourname' => "Num d'utilisader",
'yourpassword' => 'pled-clav',
'yourpasswordagain' => 'repeter pled-clav',
@@ -612,6 +612,7 @@ Pled-clav temporar: $2",
'changeemail-oldemail' => 'Adressa dad e-mail actuala:',
'changeemail-newemail' => ' Nova adressa dad e-mail',
'changeemail-none' => '(nagina)',
+'changeemail-password' => 'Tes pled-clav da {{SITENAME}}:',
'changeemail-submit' => "Midar l'adressa dad e-mail",
'changeemail-cancel' => 'Interrumper',
@@ -796,7 +797,6 @@ L'ultima endataziun dal log vegn mussada sco referenza:",
'template-protected' => '(bloccà)',
'template-semiprotected' => '(mez protegidas)',
'hiddencategories' => 'Quest artitgel è commember da {{PLURAL:$1|1 categoria zuppentada|$1 categorias zuppentadas}}:',
-'nocreatetitle' => 'La creaziun da novas paginas è limitada',
'nocreatetext' => "{{SITENAME}} ha restrinschì las pussaivladas da crear novas paginas.
Ti pos ir anavos e modifitgar ina pagina existenta, u [[Special:UserLogin|t'annunziar u registrar]].",
'nocreate-loggedin' => "Ti n'has betg la lubientscha da crear novas paginas.",
@@ -820,6 +820,15 @@ I para sco sch'ella fiss vegnida stizzada.",
'edit-no-change' => 'Tia modificaziun è vegnida ignorada perquai che naginas midadas èn vegnidas fatgas en il text.',
'edit-already-exists' => "Betg pussaivel da crear ina nova pagina perquai ch'ella exista gia.",
'defaultmessagetext' => 'Text da standard',
+'content-failed-to-parse' => 'Impussibel dad elavurar il cuntegn $2 per il model $1: $3',
+'invalid-content-data' => 'Data da cuntegn nunvalida',
+'content-not-allowed-here' => 'Il cuntegn "$1" n\'è betg lubì sin la pagina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'text senza formataziun',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Attenziun:''' Questa pagina cuntegna memia bleras funcziuns dal parser cumplitgadas.
@@ -1191,9 +1200,9 @@ Questa operaziun na po betg vegnir revocada.',
'prefs-emailconfirm-label' => 'Confirmaziun per e-mail:',
'prefs-textboxsize' => 'Grondezza da la fanestra da modifitgar',
'youremail' => 'Adressa dad e-mail:',
-'username' => "Num d'utilisader:",
-'uid' => "ID da l'utilisader:",
-'prefs-memberingroups' => 'Commember {{PLURAL:$1|da la gruppa|da las gruppas}}:',
+'username' => "{{GENDER:$1|Num d'utilisader|Num da l'utilisadra}}:",
+'uid' => "ID da l'{{GENDER:$1|utilisader|utilisadra}}:",
+'prefs-memberingroups' => '{{GENDER:$2|Commember|Commembra}} da {{PLURAL:$1|la gruppa|las gruppas}}:',
'prefs-registration' => 'Temp da registraziun:',
'yourrealname' => 'Num real:',
'yourlanguage' => 'Lingua:',
@@ -1344,12 +1353,13 @@ Tia adressa dad e-mail na vegn betg mussada sche auters utilisaders ta contactes
'right-sendemail' => 'Trametter e-mails ad auters utilisaders',
'right-passwordreset' => "Vesair l'e-mail per redefinir pleds-clav",
+# Special:Log/newusers
+'newuserlogpage' => "Log d'utilisaders creads",
+'newuserlogpagetext' => "Quai è il log dals contos d'utilisader ch'èn vegnids creads.",
+
# User rights log
'rightslog' => "Log dals dretgs d'utilisader",
'rightslogtext' => "Quai è il log da las midadas en ils dretgs d'utilisaders.",
-'rightslogentry' => 'midar la commembranza da $1 davent da $2 a $3',
-'rightslogentry-autopromote' => 'è vegnì promovì automaticamain da $2 $3',
-'rightsnone' => '(nagins)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'leger questa pagina',
@@ -1583,6 +1593,7 @@ Sch'il problem exista anc adina, contactescha in [[Special:ListUsers/sysop|admin
'backend-fail-notsame' => 'Ina datoteca betg identica exista gia sin $1.',
'backend-fail-invalidpath' => "$1 n'è betg in percus valida per memorisar.",
'backend-fail-delete' => 'Impussibel da stizzar la datoteca $1.',
+'backend-fail-describe' => 'Impussibel da midar las datas meta per la datoteca "$1".',
'backend-fail-alreadyexists' => 'La datoteca $1 exista gia.',
'backend-fail-store' => 'Impussibel da memorisar la datoteca $1 en $2.',
'backend-fail-copy' => 'Impussibel da copiar la datoteca $1 a $2.',
@@ -1974,7 +1985,7 @@ Guarda era las [[Special:WantedCategories|categorias giavischadas]].',
'linksearch-ok' => 'Tschertgar',
'linksearch-text' => 'Tegnaplazzas sco "*.wikipedia.org" pon vegnir utilisads.
Dovra almain ina top-level domain, per exempel "*.org".<br />
-Protocols sustegnids: <code>$1</code> (n\'agiunta betg quels a tia tschertga).',
+{{PLURAL:$2|Protocol sustegnì|Protocols sustegnids}}: <code>$1</code> (standard è http:// sche nagin protocol è specifitgà).',
'linksearch-line' => '$1 è collià davent da la pagina $2',
'linksearch-error' => "Wildcards pon esser be a l'entschatta dal num da host.",
@@ -1993,10 +2004,6 @@ Protocols sustegnids: <code>$1</code> (n\'agiunta betg quels a tia tschertga).',
'activeusers-hidesysops' => 'Zuppentar administraturs',
'activeusers-noresult' => 'Chattà nagins utilisaders.',
-# Special:Log/newusers
-'newuserlogpage' => "Log d'utilisaders creads",
-'newuserlogpagetext' => "Quai è il log dals contos d'utilisader ch'èn vegnids creads.",
-
# Special:ListGroupRights
'listgrouprights' => "Dretgs da las gruppas d'utilisaders",
'listgrouprights-summary' => "Sutvart vegn mussada ina glista da las gruppas d'utilisaders sin questa wiki cun ils dretgs d'access associads.
@@ -2091,19 +2098,23 @@ Midadas futuras vid questa pagina e la pagina da discussiun appertegnenta vegnan
'enotif_mailer' => "Servetsch d'infurmaziun per e-mail da {{SITENAME}}",
'enotif_reset' => 'Marcar tut las paginas sco visitadas.',
-'enotif_newpagetext' => 'Quaii è ina nova pagina.',
'enotif_impersonal_salutation' => 'Utilisader da {{SITENAME}}',
-'changed' => 'midada',
-'created' => 'creada',
-'enotif_subject' => 'La pagina $PAGETITLE da {{SITENAME}} è vegnida $CHANGEDORCREATED da $PAGEEDITOR',
+'enotif_subject_deleted' => 'La pagina $1 da {{SITENAME}} è vegnida stizzada da {{GENDER:$2|$2}}',
+'enotif_subject_created' => 'La pagina $1 da {{SITENAME}} è vegnida creada da {{GENDER:$2|$2}}',
+'enotif_subject_moved' => 'La pagina $1 da {{SITENAME}} è vegnida spustada da {{GENDER:$2|$2}}',
+'enotif_subject_restored' => 'La pagina $1 da {{SITENAME}} è vegnida restaurada da {{GENDER:$2|$2}}',
+'enotif_subject_changed' => 'La pagina $1 da {{SITENAME}} è vegnida midada da {{GENDER:$2|$2}}',
+'enotif_body_intro_deleted' => 'La pagina $1 da {{SITENAME}} è vegnida stizzada ils $PAGEEDITDATE da {{GENDER:$2|$2}}, vesair $3.',
+'enotif_body_intro_created' => 'La pagina $1 da {{SITENAME}} è vegnida creada ils $PAGEEDITDATE da {{GENDER:$2|$2}}. $3 mussa la versiun actuala.',
+'enotif_body_intro_moved' => 'La pagina $1 da {{SITENAME}} è vegnida spustada ils $PAGEEDITDATE da {{GENDER:$2|$2}}. $3 mussa la versiun actuala.',
+'enotif_body_intro_restored' => 'La pagina $1 da {{SITENAME}} è vegnida restaurada ils $PAGEEDITDATE da {{GENDER:$2|$2}}. $3 mussa la versiun actuala.',
+'enotif_body_intro_changed' => 'La pagina $1 da {{SITENAME}} è vegnida midada ils $PAGEEDITDATE da {{GENDER:$2|$2}}. $3 mussa la versiun actuala.',
'enotif_lastvisited' => 'Visita $1 per vesair tut las midadas dapi tia ultima visita.',
'enotif_lastdiff' => 'Guarda $1 per vesair questa midada.',
'enotif_anon_editor' => 'utilisader anonim $1',
'enotif_body' => 'Olla $WATCHINGUSERNAME,
-La pagina $PAGETITLE sin {{SITENAME}} è vegnida $CHANGEDORCREATED ils $PAGEEDITDATE da $PAGEEDITOR, guarda $PAGETITLE_URL per la versiun actuala.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Resumaziun dal contribuent: $PAGESUMMARY $PAGEMINOREDIT
@@ -2111,8 +2122,7 @@ Contactar il contribuent:
mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Ti na retschaivas betg ulteriurs avis en cass dad ulteriuras midadas sche ti na visitas betg questa pagina.
-Ti has era la pussaivladad da redefinir tut ils flags d\'avis per tut las paginas sin tia glista d\'observaziun.
+Ti na retschaivas betg ulteriurs avis en cass dad ulteriuras activitads sche ti na visitas betg questa pagina. Ti has era la pussaivladad da redefinir tut ils flags d\'avis per tut las paginas sin tia glista d\'observaziun.
Cun amiaivels salids,
il sistem d\'avis da {{SITENAME}}
@@ -2129,6 +2139,8 @@ $UNWATCHURL
Resuns ed agid chattas qua:
{{fullurl:{{MediaWiki:Helppage}}}}',
+'created' => 'creada',
+'changed' => 'midada',
# Delete
'deletepage' => 'Stizzar la pagina',
@@ -2287,8 +2299,8 @@ Eventualmain es ti suandà ina colliaziun faussa u la versiun è vegnida restaur
'undeletedrevisions' => 'Restituì {{PLURAL:$1|1 versiun|$1 versiuns}}',
'undeletedrevisions-files' => 'Restituì {{PLURAL:$1|1 versiun|$1 versiuns}} e {{PLURAL:$2|1 datoteca|$2 datotecas}}',
'undeletedfiles' => 'Restituì {{PLURAL:$1|1 datoteca|$1 datotecas}}',
-'cannotundelete' => 'Errur durant restaurar la pagina;
-eventualmain ha gia insatgi la restaurà.',
+'cannotundelete' => 'Errur cun restaurar:
+$1',
'undeletedpage' => "'''$1 è vegnì restaurà'''
Consultescha il [[Special:Log/delete|protocol da stizzar]] per retschaiver ina survista da las ultimas paginas stizzadas u restauradas.",
@@ -2320,7 +2332,7 @@ $1',
'blanknamespace' => '(principal)',
# Contributions
-'contributions' => "Contribuziuns da l'utilisader",
+'contributions' => "Contribuziuns {{GENDER:$1|dal utilisader|da l'utilisadra}}",
'contributions-title' => "Contribuziuns d'utilisader da $1",
'mycontris' => 'Contribuziuns',
'contribsub2' => 'Per $1 ($2)',
@@ -2597,6 +2609,7 @@ betg pussaivel da spustar ina pagina en il medem lieu.',
'immobile-target-namespace-iw' => "Ina colliaziun dad interwiki n'è betg ina destinaziun valida per spustar.",
'immobile-source-page' => 'Questa pagina na po betg vegnir spustada.',
'immobile-target-page' => 'Betg pussaivel da spustar a quest titel da destinaziun.',
+'bad-target-model' => 'La destinaziun desiderada utilisescha in auter model da cuntegn. Impussibel da convertar $1 a $2.',
'imagenocrossnamespace' => 'Betg pussaivel da spustar ina datoteca ad in tip da pagina betg da datoteca',
'nonfile-cannot-move-to-file' => "Betg pussaivel da spustar in element che n'è nagina datoteca al tip da pagina datoteca",
'imagetypemismatch' => 'La nova extensiun da datoteca na correspunda betg al tip da datoteca',
@@ -2713,6 +2726,7 @@ Emprova danovamain.',
'import-error-interwiki' => 'La pagina "$1" n\'è betg vegnida importada perquai ch\'il num è reservà per colliaziuns externas (interwiki).',
'import-error-special' => 'La pagina "$1" n\'è betg vegnida importada perquai ch\'ella fa part dad in tip da pagina spezial che na lubescha naginas pagina.',
'import-error-invalid' => 'La pagina "$1" n\'è betg vegnida importada perquai ch\'il num n\'è betg valid.',
+'import-error-unserialize' => 'La versiun $2 da la pagina "$1" na po betg vegnir deserialisada. I è vegnì rapportà che la versiun utilisescha il model da cuntegn $3 serialisà sco $4.',
'import-options-wrong' => '{{PLURAL:$2|Opziun nuncorrecta|Opziuns nuncorrectas}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'La pagina principala inditgada è in titel nunvalid.',
'import-rootpage-nosubpage' => 'Il tip da pagina "$1" da la pagina principala na lubescha naginas sutpaginas.',
@@ -2727,7 +2741,6 @@ Emprova danovamain.',
# JavaScriptTest
'javascripttest' => 'Test da JavaScript',
-'javascripttest-disabled' => 'Questa funcziun è deactivada.',
'javascripttest-title' => 'Exequir tests da $1',
'javascripttest-pagetext-noframework' => 'Questa pagina è reservada per exequir tests da JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Framework da test nunenconuschent "$1".',
@@ -2850,6 +2863,7 @@ Probablamien è quai capità pervia dad in link ad ina pagina externa ch'è sin
'pageinfo-default-sort' => 'Criteri da zavrar da standard',
'pageinfo-length' => 'Lunghezza da la pagina (en bytes)',
'pageinfo-article-id' => 'ID da la pagina',
+'pageinfo-language' => 'Lingua dal cuntegn da la pagina',
'pageinfo-robot-policy' => 'Status per maschinas da tschertgar',
'pageinfo-robot-index' => 'Indexabel',
'pageinfo-robot-noindex' => 'Betg indexabel',
@@ -2869,6 +2883,14 @@ Probablamien è quai capità pervia dad in link ad ina pagina externa ch'è sin
'pageinfo-magic-words' => '{{PLURAL:$1|Pled magic|Pleds magics}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria zuppentada|Categorias zuppentadas}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Template integrà|Templates integrads}} ($1)',
+'pageinfo-toolboxlink' => 'Infurmaziuns da la pagina',
+'pageinfo-redirectsto' => 'Renviescha a',
+'pageinfo-redirectsto-info' => 'infurmaziun',
+'pageinfo-contentpage' => 'Contemplada sco pagina da cuntegn',
+'pageinfo-contentpage-yes' => 'Gea',
+'pageinfo-protect-cascading' => 'Protecziuns vegnan ertadas davent da qua',
+'pageinfo-protect-cascading-yes' => 'Gea',
+'pageinfo-protect-cascading-from' => 'Las protecziuns vegnan ertadas davent da',
# Patrolling
'markaspatrolleddiff' => 'Marcar sco controllà',
@@ -2880,6 +2902,8 @@ Probablamien è quai capità pervia dad in link ad ina pagina externa ch'è sin
'markedaspatrollederror' => 'Betg pussaivel da marcar sco controllà',
'markedaspatrollederrortext' => 'Ti stos specifitgar ina versiun per marcar sco controllada.',
'markedaspatrollederror-noautopatrol' => 'Ti na dastgas betg marcar tias atgnas midadas sco controlladas.',
+'markedaspatrollednotify' => 'Questa midada vid $1 è vegnida marcada sco controllada.',
+'markedaspatrollederrornotify' => 'Sbagl durant marcar sco controllà.',
# Patrol log
'patrol-log-page' => 'Log da controlla',
@@ -2913,6 +2937,7 @@ Cun exequir questa datoteca po tes sistem vegnir donnegià.",
'file-nohires' => 'Nagina resuluziun pli auta disponibla.',
'svg-long-desc' => 'datoteca da SVG, grondezza da basa $1 × $2 pixels, grondezza da datoteca: $3',
'svg-long-desc-animated' => 'Datoteca da SVG animada, dimensiun normala $1 x $2 pixels, grondezza da datoteca: $3',
+'svg-long-error' => 'Datoteca da SVG nundalida: $1',
'show-big-image' => 'Resoluziun cumplaina',
'show-big-image-preview' => 'Grondezza da questa prevista: $1.',
'show-big-image-other' => 'Other {{PLURAL:$2|resoluziun|resoluziuns}}: $1.',
@@ -2943,6 +2968,7 @@ Cun exequir questa datoteca po tes sistem vegnir donnegià.",
'hours' => '{{PLURAL:$1|$1 ura|$1 uras}}',
'days' => '{{PLURAL:$1|$1 di|$1 dis}}',
'ago' => 'avant $1',
+'just-now' => 'gist ussa',
# Bad image list
'bad_image_list' => "Il format è sco suonda:
@@ -3443,6 +3469,7 @@ Quai code da confermaziun vegn a scrudar ils $4.',
# Scary transclusion
'scarytranscludedisabled' => "[L'integraziun interwiki è deactivada]",
'scarytranscludefailed' => "[Betg reussì d'integrar in model per $1]",
+'scarytranscludefailed-httpstatus' => '[Errur durant chargiar il model per $1: HTTP $2]',
'scarytranscludetoolong' => '[URL è memia lunga]',
# Delete conflict
@@ -3552,6 +3579,7 @@ Ti pos era utilisar [[Special:EditWatchlist|la pagina da standard]].',
'version-license' => 'Licenza',
'version-poweredby-credits' => "Questa wiki utilisescha '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'auters',
+'version-credits-summary' => 'Nus vulain engraziar a suandantas persunas per lur contribuziun a [[Special:Version|MediaWiki]].',
'version-license-info' => "MediaWiki è software liba; ti la pos redistribuir e/u la modifitgar tenor ils terms da la GNU General Public License sco ch'ella vegn publitgada da la Free Software Foundation; ti pos utilisar la versiun 2 da la licenza u (sche ti vul) mintga versiun che succeda.
MediaWiki vegn distribuì en la speranza che questa software saja utila, dentant SENZA MINTGA GARANZIA; era senza garanzia implizita da NEGOZIABILITAD u ADDATAZIUN PER IN INTENT SPECIAL. Guarda la GNU General Public License per ulteriurs detagls.
@@ -3698,7 +3726,10 @@ Questa pagina ha actualmain difficultads tecnicas.',
'logentry-newusers-create' => 'Il conto $1 è vegnì creà',
'logentry-newusers-create2' => 'Il conto $3 è vegnì creà da $1',
'logentry-newusers-autocreate' => 'Il conto $1 è vegnì creà automaticamain',
-'newuserlog-byemail' => 'tramess il pled-clav per e-mail',
+'logentry-rights-rights' => '$1 ha midà la commembranza da gruppas per $3 da $4 a $5',
+'logentry-rights-rights-legacy' => '$1 ha midà la commembranza da gruppas per $3',
+'logentry-rights-autopromote' => '$1 è vegnì promovì automaticamain da $4 a $5',
+'rightsnone' => '(nagins)',
# Feedback
'feedback-bugornote' => 'Sche ti vuls descriver detagliadamain in problem techic, lura [$1 rapporta in bug].
diff --git a/languages/messages/MessagesRmy.php b/languages/messages/MessagesRmy.php
index 53309b48..9cae704e 100644
--- a/languages/messages/MessagesRmy.php
+++ b/languages/messages/MessagesRmy.php
@@ -84,7 +84,6 @@ $messages = array(
# Cologne Blue skin
'qbedit' => 'Editisar',
-'qbpageinfo' => 'Patrinyake janglimata',
'qbspecialpages' => 'Uzalutne patrya',
'errorpagetitle' => 'Dosh',
@@ -169,9 +168,6 @@ $messages = array(
'logouttext' => "'''Akana san avryal i {{SITENAME}}.'''
Shai te labyares {{SITENAME}} sar ekh bijanglo jeno vai shai te prinjares tut palem sar o jeno le kadale navesa vai le aver navesa.",
-'welcomecreation' => '== Mishto avilyan, $1! ==
-
-Akana si tuke ekh akont. Te na bistares te paruves, kana trebul tuke, tire kamimata kai {{SITENAME}}.',
'yourname' => 'Tiro anav',
'yourpassword' => 'O nakhavipnasko lav',
'yourpasswordagain' => 'O nakhavipnasko lav de nevo',
@@ -391,7 +387,6 @@ Kana kamesa te khoses kadaya patrin andar tiri lista le patryange so arakhes len
'wlnote' => 'Tele si le palutne $1 paruvimata ande palutne <b>$2</b> ore.',
'enotif_reset' => 'Thov semno kai patrya so dikhlem',
-'enotif_newpagetext' => 'Kadaya si ek nevi patrin.',
# Delete
'deletepage' => 'Khos i patrin',
diff --git a/languages/messages/MessagesRo.php b/languages/messages/MessagesRo.php
index 050fd4f7..a8668aec 100644
--- a/languages/messages/MessagesRo.php
+++ b/languages/messages/MessagesRo.php
@@ -37,7 +37,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__FORTEAZACUPRINS__', '__FORCETOC__' ),
'toc' => array( '0', '__CUPRINS__', '__TOC__' ),
'noeditsection' => array( '0', '__FARAEDITSECTIUNE__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__FARAANTET__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'NUMARLUNACURENTA', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'LUNACURENTA1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'NUMELUNACURENTA', 'CURRENTMONTHNAME' ),
@@ -209,7 +208,7 @@ $specialPageAliases = array(
'Contributions' => array( 'Contribuții' ),
'CreateAccount' => array( 'ÃŽnregistrare' ),
'Deadendpages' => array( 'Pagini_fără_legături' ),
- 'DeletedContributions' => array( 'Contibuții_șterse' ),
+ 'DeletedContributions' => array( 'Contribuții_șterse' ),
'Disambiguations' => array( 'Dezambiguizări' ),
'DoubleRedirects' => array( 'Redirectări_duble' ),
'Emailuser' => array( 'Email_utilizator' ),
@@ -435,6 +434,7 @@ pe titlul secțiunii (JavaScript)',
'newwindow' => '(se deschide într-o fereastră nouă)',
'cancel' => 'Revocare',
'moredotdotdot' => 'Mai mult…',
+'morenotlisted' => 'Mai multe nu sunt enumerate...',
'mypage' => 'Pagină',
'mytalk' => 'Discuții',
'anontalk' => 'Discuția pentru această adresă IP',
@@ -446,7 +446,6 @@ pe titlul secțiunii (JavaScript)',
'qbbrowse' => 'Răsfoiește',
'qbedit' => 'Modificare',
'qbpageoptions' => 'Opțiuni ale paginii',
-'qbpageinfo' => 'Informații ale paginii',
'qbmyoptions' => 'Paginile mele',
'qbspecialpages' => 'Pagini speciale',
'faq' => 'Întrebări frecvente',
@@ -469,6 +468,7 @@ pe titlul secțiunii (JavaScript)',
'namespaces' => 'Spații de nume',
'variants' => 'Variante',
+'navigation-heading' => 'Meniu de navigare',
'errorpagetitle' => 'Eroare',
'returnto' => 'ÃŽnapoi la $1.',
'tagline' => 'De la {{SITENAME}}',
@@ -711,11 +711,11 @@ Administratorul care a efectuat blocarea a furnizat explicaÈ›ia: „$3â€.',
# Login and logout pages
'logouttext' => "'''Acum sunteți deconectat.'''
-Sesiunea dumneavoastră la {{SITENAME}} a fost închisă. Puteți continua să folosiți {{SITENAME}} ca utilizator anonim, sau puteți să vă [[Special:UserLogin|reautentificați]] ca același sau ca alt utilizator.
+Sesiunea dumneavoastră la {{SITENAME}} a fost închisă. Puteți continua să folosiți {{SITENAME}} ca utilizator anonim, sau puteți să vă <span class='plainlinks'>[$1 reautentificați]</span> ca același sau ca alt utilizator.
Țineți minte că anumite pagini pot fi în continuare afișate ca și când ați fi autentificat până când curățați memoria cache a navigatorului.",
-'welcomecreation' => '==Bun venit, $1!==
-
-Contul dumneavoatră a fost creat. Nu uitați să vă modificați [[Special:Preferences|preferințele]] în {{SITENAME}}.',
+'welcomeuser' => 'Bun venit, $1!',
+'welcomecreation-msg' => 'Contul dumneavoastră a fost creat.
+Nu uitați să vă modificați [[Special:Preferences|preferințele]] pentru {{SITENAME}}.',
'yourname' => 'Nume de utilizator:',
'yourpassword' => 'Parolă:',
'yourpasswordagain' => 'Repetați parola:',
@@ -738,7 +738,7 @@ Contul dumneavoatră a fost creat. Nu uitați să vă modificați [[Special:Pref
'gotaccount' => "Aveți deja un cont de utilizator? '''$1'''.",
'gotaccountlink' => 'Autentificați-vă',
'userlogin-resetlink' => 'Ați uitat datele de autentificare?',
-'createaccountmail' => 'Prin e-mail',
+'createaccountmail' => 'Utilizează o parolă temporară aleasă la întâmplare și o trimite la adresa de e-mail indicată mai jos',
'createaccountreason' => 'Motiv:',
'badretype' => 'Parolele pe care le-ați introdus diferă.',
'userexists' => 'Numele de utilizator pe care l-ați introdus este deja folosit.
@@ -807,6 +807,7 @@ Vă rugăm să așteptați până să mai încercați.',
# Email sending
'php-mail-error-unknown' => 'Eroare necunoscută în funcția PHP mail()',
'user-mail-no-addy' => 'S-a încercat trimiterea e-mailului fără o adresă de e-mail.',
+'user-mail-no-body' => 'S-a încercat trimiterea unui e-mail fără conținut sau nejustificat de scurt.',
# Change password dialog
'resetpass' => 'Modifică parola',
@@ -858,7 +859,7 @@ Ar trebui să vă autentificați și să alegeți acum o nouă parolă. Dacă al
Parolă temporară: $2',
'passwordreset-emailsent' => 'A fost trimis un e-mail de resetare a parolei.',
'passwordreset-emailsent-capture' => 'Un mesaj de resetare a parolei a fost trimis, fiind afișat mai jos.',
-'passwordreset-emailerror-capture' => 'Un mesaj de reamintire a fost generat (fiind afișat mai jos), dar trimiterea sa către utilizator a eșuat: $1',
+'passwordreset-emailerror-capture' => 'Un mesaj de resetare a parolei a fost generat (fiind afișat mai jos), dar trimiterea sa către utilizator a eșuat: $1',
# Special:ChangeEmail
'changeemail' => 'Modificare adresă de e-mail',
@@ -868,6 +869,7 @@ Parolă temporară: $2',
'changeemail-oldemail' => 'Adresa de e-mail actuală:',
'changeemail-newemail' => 'Noua adresă de e-mail:',
'changeemail-none' => '(niciuna)',
+'changeemail-password' => 'Parola dumneavoastră la {{SITENAME}}:',
'changeemail-submit' => 'Modifică adresa de e-mail',
'changeemail-cancel' => 'Revocare',
@@ -1051,7 +1053,6 @@ Ultima intrare în jurnal este afișată mai jos pentru referință:",
'template-semiprotected' => '(semiprotejat)',
'hiddencategories' => 'Această pagină este membrul {{PLURAL:$1|unei categorii ascunse|a $1 categorii ascunse}}:',
'edittools' => '<!-- Acest text va apărea după caseta de editare și formularele de trimitere fișier. -->',
-'nocreatetitle' => 'Creare de pagini limitată',
'nocreatetext' => '{{SITENAME}} a restricționat abilitatea de a crea pagini noi.
Puteți edita o pagină deja existentă sau puteți să vă [[Special:UserLogin|autentificați/creați]] un cont de utilizator.',
'nocreate-loggedin' => 'Nu ai permisiunea să creezi pagini noi.',
@@ -1076,6 +1077,15 @@ Se pare că a fost ștearsă.',
'edit-already-exists' => 'Pagina nouă nu a putut fi creată.
Ea există deja.',
'defaultmessagetext' => 'Textul implicit',
+'content-failed-to-parse' => 'Nu s-a putut analiza conținutul de tip $2 pentru modelul $1: $3',
+'invalid-content-data' => 'Date de conținut invalide',
+'content-not-allowed-here' => 'Conținutul de tip „$1†nu este permis pe pagina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'text simplu',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Atenție: Această pagină conține prea multe apelări costisitoare ale funcțiilor parser.
@@ -1439,9 +1449,9 @@ Acțiunea nu este reversibilă.',
'prefs-emailconfirm-label' => 'Confirmare e-mail:',
'prefs-textboxsize' => 'Mărime căsuță de modificare',
'youremail' => 'Adresă de e-mail:',
-'username' => 'Nume de utilizator:',
-'uid' => 'ID utilizator:',
-'prefs-memberingroups' => 'Membru în {{PLURAL:$1|grupul|grupurile}}:',
+'username' => '{{GENDER:$1|Nume de utilizator}}:',
+'uid' => 'ID {{GENDER:$1|utilizator|utilizatoare}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Membru|Membră}} în {{PLURAL:$1|grupul|grupurile}}:',
'prefs-registration' => 'Data înregistrării:',
'yourrealname' => 'Nume real:',
'yourlanguage' => 'Interfață în limba:',
@@ -1591,12 +1601,13 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
'right-sendemail' => 'Trimite e-mail altor utilizatori',
'right-passwordreset' => 'Vizualizează e-mailurile de reinițializare a parolelor',
+# Special:Log/newusers
+'newuserlogpage' => 'Jurnal utilizatori noi',
+'newuserlogpagetext' => 'Acesta este jurnalul creărilor conturilor de utilizator.',
+
# User rights log
'rightslog' => 'Jurnal permisiuni de utilizator',
'rightslogtext' => 'Acest jurnal cuprinde modificările permisiunilor utilizatorilor.',
-'rightslogentry' => 'a schimbat permisiunile pentru $1 de la $2 la $3',
-'rightslogentry-autopromote' => 'a fost promovat în mod automat de la $2 la $3',
-'rightsnone' => '(niciunul)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'citiți această pagină',
@@ -1825,6 +1836,7 @@ Dacă problema persistă, contactați un [[Special:ListUsers/sysop|administrator
'backend-fail-notsame' => 'Un fișier diferit există deja pentru $1.',
'backend-fail-invalidpath' => '$1 nu este o cale validă de stocare.',
'backend-fail-delete' => 'Imposibil de șters fișierul $1.',
+'backend-fail-describe' => 'Imposibil de modificat metadatele pentru fiÈ™ierul „$1â€.',
'backend-fail-alreadyexists' => 'Fișierul $1 există deja.',
'backend-fail-store' => 'Imposibil de stocat fișierul $1 în $2.',
'backend-fail-copy' => 'Imposibil de copiat fișierul $1 în $2.',
@@ -2073,6 +2085,12 @@ Lista tipurilor MIME recunoscute de MediaWiki poate fi găsită la [http://svn.w
Acestea ar trebui să conțină legături către un articol mai potrivit.<br />
O pagină este considerată o pagină de dezambiguizare dacă folosește formate care apar la [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Pagini cu o proprietate de pagină',
+'pageswithprop-legend' => 'Pagini cu o proprietate de pagină',
+'pageswithprop-text' => 'Această pagină listează paginile care utilizează o anumită proprietate de pagină.',
+'pageswithprop-prop' => 'Numele proprietății:',
+'pageswithprop-submit' => 'Du-te',
+
'doubleredirects' => 'Redirecționări duble',
'doubleredirectstext' => 'Această listă conține pagini care redirecționează la alte pagini de redirecționare.
Fiecare 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ă.
@@ -2225,7 +2243,7 @@ Vedeți și [[Special:WantedCategories|categoriile dorite]].',
'linksearch-ok' => 'Caută',
'linksearch-text' => 'Pot fi folosite metacaractere precum „*.wikipedia.orgâ€.
Necesită cel puÈ›in un domeniu de nivel superior, cum ar fi „*.orgâ€.<br />
-Protocoale suportate: <code>$1</code> (se trece implicit la http:// dacă nu este specificat niciun protocol).',
+{{PLURAL:$2|Protocol suportat|Protocoale suportate}}: <code>$1</code> (se trece implicit la http:// dacă nu este specificat niciun protocol).',
'linksearch-line' => '$1 este legat de $2',
'linksearch-error' => 'Metacaracterele pot să apară doar la începutul hostname-ului.',
@@ -2244,10 +2262,6 @@ Protocoale suportate: <code>$1</code> (se trece implicit la http:// dacă nu est
'activeusers-hidesysops' => 'Ascunde administratorii',
'activeusers-noresult' => 'Niciun utilizator găsit.',
-# Special:Log/newusers
-'newuserlogpage' => 'Jurnal utilizatori noi',
-'newuserlogpagetext' => 'Acesta este jurnalul creărilor conturilor de utilizator.',
-
# Special:ListGroupRights
'listgrouprights' => 'Permisiuni grupuri de utilizatori',
'listgrouprights-summary' => 'Mai jos se află o listă a grupurilor de utilizatori definite în acest wiki, împreună cu permisiunile de acces asociate.
@@ -2342,19 +2356,22 @@ Modificările viitoare efectuate asupra acestei pagini dar și asupra paginii de
'enotif_mailer' => 'Sistemul de notificare {{SITENAME}}',
'enotif_reset' => 'Marchează toate paginile vizitate',
-'enotif_newpagetext' => 'Aceasta este o pagină nouă.',
'enotif_impersonal_salutation' => 'Utilizator {{SITENAME}}',
-'changed' => 'modificată',
-'created' => 'creată',
-'enotif_subject' => 'Pagina $PAGETITLE de la {{SITENAME}} a fost $CHANGEDORCREATED de $PAGEEDITOR',
+'enotif_subject_deleted' => 'Pagina $1 de la {{SITENAME}} a fost ștearsă de către {{gender:$2|$2}}',
+'enotif_subject_created' => 'Pagina $1 de la {{SITENAME}} a fost creată de către {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Pagina $1 de la {{SITENAME}} a fost redenumită de către {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Pagina $1 de la {{SITENAME}} a fost restaurată de către {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Pagina $1 de la {{SITENAME}} a fost modificată de către {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Pagina $1 de la {{SITENAME}} a fost ștearsă la $PAGEEDITDATE de către {{gender:$2|$2}}; vedeți $3.',
+'enotif_body_intro_created' => 'Pagina $1 de la {{SITENAME}} a fost creată la $PAGEEDITDATE de către {{gender:$2|$2}}; vedeți $3 pentru versiunea actuală.',
+'enotif_body_intro_moved' => 'Pagina $1 de la {{SITENAME}} a fost redenumită la $PAGEEDITDATE de către {{gender:$2|$2}}; vedeți $3 pentru versiunea actuală.',
+'enotif_body_intro_restored' => 'Pagina $1 de la {{SITENAME}} a fost restaurată la $PAGEEDITDATE de către {{gender:$2|$2}}; vedeți $3 pentru versiunea actuală.',
+'enotif_body_intro_changed' => 'Pagina $1 de la {{SITENAME}} a fost modificată la $PAGEEDITDATE de către {{gender:$2|$2}}; vedeți $3 pentru versiunea actuală.',
'enotif_lastvisited' => 'Vedeți $1 pentru toate modificările de la ultima dvs. vizită.',
'enotif_lastdiff' => 'Apasă $1 pentru a vedea această schimbare.',
'enotif_anon_editor' => 'utilizator anonim $1',
'enotif_body' => 'Domnule/Doamnă $WATCHINGUSERNAME,
-
-Pagina $PAGETITLE de la {{SITENAME}} a fost $CHANGEDORCREATED în data de $PAGEEDITDATE de către $PAGEEDITOR. Vedeți la $PAGETITLE_URL versiunea curentă.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Descrierea lăsată de utilizator: $PAGESUMMARY $PAGEMINOREDIT
@@ -2362,8 +2379,7 @@ Puteți contacta utilizatorul:
e-mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Nu veți mai primi notificări în cazul unor viitoare modificări până când nu veți vizitați pagina.
-Puteți de asemenea reseta notificările pentru toate pagini pe care le urmăriți.
+Nu veți mai primi notificări în cazul unor viitoare modificări până când nu veți vizitați pagina. Puteți de asemenea reseta notificările pentru toate pagini pe care le urmăriți.
Al dumneavoastră amic, sistemul de notificare de la {{SITENAME}}
@@ -2379,6 +2395,8 @@ $UNWATCHURL
Asistență și suport:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'creată',
+'changed' => 'modificată',
# Delete
'deletepage' => 'Șterge pagina',
@@ -2447,6 +2465,8 @@ Consultați [[Special:ProtectedPages|indexul paginilor protejate]] pentru o list
'prot_1movedto2' => 'a mutat [[$1]] la [[$2]]',
'protect-badnamespace-title' => 'Spațiu de nume neprotejabil',
'protect-badnamespace-text' => 'Paginile din acest spațiu de nume nu pot fi protejate.',
+'protect-norestrictiontypes-text' => 'Această pagină nu poate fi protejată întrucât nu există niciun tip de restricție disponibil.',
+'protect-norestrictiontypes-title' => 'Pagină neprotejabilă',
'protect-legend' => 'Confirmă protejare',
'protectcomment' => 'Motiv:',
'protectexpiry' => 'Expiră:',
@@ -2528,8 +2548,8 @@ S-ar putea ca legătura să fie greșită, ori versiunea să fi fost restaurată
'undeletedrevisions' => '{{PLURAL:$1|o versiune restaurată|$1 versiuni restaurate|$1 de versiuni restaurate}}',
'undeletedrevisions-files' => '{{PLURAL:$1|O versiune|$1 versiuni|$1 de versiuni}} și {{PLURAL:$2|un fișier|$2 fișiere|$2 de fișiere}} recuperate',
'undeletedfiles' => '{{PLURAL:$1|O versiune recuperată|$1 versiuni recuperate|$1 de versiuni recuperate}}',
-'cannotundelete' => 'Recuperarea a eșuat;
-este posibil ca altcineva să fi recuperat pagina deja.',
+'cannotundelete' => 'Recuperarea a eșuat:
+$1',
'undeletedpage' => "'''$1 a fost recuperat'''
Consultați [[Special:Log/delete|jurnalul ștergerilor]] pentru a vedea toate ștergerile și recuperările recente.",
@@ -2561,7 +2581,7 @@ $1',
'blanknamespace' => 'Articole',
# Contributions
-'contributions' => 'Contribuții utilizator',
+'contributions' => 'Contribuții {{GENDER:$1|utilizator}}',
'contributions-title' => 'Contribuțiile utilizatorului $1',
'mycontris' => 'Contribuții',
'contribsub2' => 'Pentru $1 ($2)',
@@ -2840,6 +2860,7 @@ Pagina destinație „[[:$1]]†există deja. Doriți să o ștergeți pentru a
'immobile-target-namespace-iw' => 'Legătura interwiki nu este o țintă validă pentru redenumire.',
'immobile-source-page' => 'Această pagină nu poate fi redenumită.',
'immobile-target-page' => 'Imposibil de redenumit pagina la acel titlu.',
+'bad-target-model' => 'Destinația dorită folosește un alt model de conținut. Nu se poate converti $1 în $2.',
'imagenocrossnamespace' => 'Fișierul nu poate fi mutat la un spațiu de nume care nu este destinat fișierelor',
'nonfile-cannot-move-to-file' => 'Entitatea (care nu este un fișier) nu poate fi mutată în spațiul de nume destinat fișierelor',
'imagetypemismatch' => 'Extensia nouă a fișierului nu se potrivește cu tipul acestuia',
@@ -2952,6 +2973,7 @@ Un dosar temporar lipsește.',
'import-error-interwiki' => 'Pagina „$1†nu poate fi importată deoarece numele acesteia este rezervat pentru legături externe (interwiki).',
'import-error-special' => 'Pagina „$1†nu poate fi importată deoarece aparține unui spațiu de nume special care nu admite pagini.',
'import-error-invalid' => 'Pagina „$1†nu poate fi importată deoarece numele acesteia este invalid.',
+'import-error-unserialize' => 'Versiunea $2 a paginii „$1†nu poate fi deserializată. Versiunea a fost raportată ca utilizând modelul de conținut $3 serializat ca $4.',
'import-options-wrong' => '{{PLURAL:$2|Opțiune eronată|Opțiuni eronate}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Pagina rădăcină furnizată este un titlu nevalid.',
'import-rootpage-nosubpage' => 'Spațiul de nume „$1†al paginii rădăcină nu permite subpagini.',
@@ -2966,7 +2988,6 @@ Un dosar temporar lipsește.',
# JavaScriptTest
'javascripttest' => 'Testare JavaScript',
-'javascripttest-disabled' => 'Această funcție nu a fost activată pe acest wiki.',
'javascripttest-title' => 'Rulare teste pentru $1',
'javascripttest-pagetext-noframework' => 'Această pagină este rezervată rulării testelor JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Cadru de testare „$1†necunoscut.',
@@ -3093,11 +3114,13 @@ Permite adăugarea unui motiv în descrierea modificărilor',
'pageinfo-default-sort' => 'Cheie de sortare implicită',
'pageinfo-length' => 'Lungimea paginii (în octeți)',
'pageinfo-article-id' => 'ID pagină',
+'pageinfo-language' => 'Limba conținutului paginii',
'pageinfo-robot-policy' => 'Statut pentru motorul de căutare',
'pageinfo-robot-index' => 'Indexabilă',
'pageinfo-robot-noindex' => 'Neindexabilă',
'pageinfo-views' => 'Număr de vizualizări',
'pageinfo-watchers' => 'Număr de utilizatori care urmăresc pagina',
+'pageinfo-few-watchers' => 'Mai puțin de {{PLURAL:$1|un urmăritor|$1 urmăritori|$1 de urmăritori}}',
'pageinfo-redirects-name' => 'Redirecționări către această pagină',
'pageinfo-subpages-name' => 'Subpagini ale acestei pagini',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecționare|redirecționări|de redirecționări}}; $3 {{PLURAL:$3|non-redirecționare|non-redirecționări|de non-redirecționări}})',
@@ -3112,6 +3135,19 @@ Permite adăugarea unui motiv în descrierea modificărilor',
'pageinfo-magic-words' => '{{PLURAL:$1|Cuvânt magic|Cuvinte magice}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorie ascunsă|Categorii ascunse}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Format inclus|Formate incluse}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pagină transclusă|Pagini transcluse}} din ($1)',
+'pageinfo-toolboxlink' => 'Informații despre pagină',
+'pageinfo-redirectsto' => 'Redirecționează către',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Numărată ca pagină cu conținut',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading' => 'Protecțiile provin în cascadă de aici',
+'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-protect-cascading-from' => 'Protecțiile provin în cascadă de la',
+'pageinfo-category-info' => 'Informații despre categorie',
+'pageinfo-category-pages' => 'Număr de pagini',
+'pageinfo-category-subcats' => 'Număr de subcategorii',
+'pageinfo-category-files' => 'Număr de fișiere',
# Skin names
'skinname-standard' => 'Clasic',
@@ -3134,6 +3170,8 @@ Permite adăugarea unui motiv în descrierea modificărilor',
'markedaspatrollederror' => 'Nu se poate marca ca verificat',
'markedaspatrollederrortext' => 'Trebuie să specificați o versiune care să fie marcată ca verificată.',
'markedaspatrollederror-noautopatrol' => 'Nu puteți marca propriile modificări ca verificate.',
+'markedaspatrollednotify' => 'Această modificare la $1 a fost marcată ca patrulată.',
+'markedaspatrollederrornotify' => 'Marcarea ca patrulată a eșuat.',
# Patrol log
'patrol-log-page' => 'Jurnal verificări',
@@ -3168,6 +3206,7 @@ Executându-l, sistemul dvs. poate fi compromis.",
'file-nohires' => 'Rezoluții mai mari nu sunt disponibile.',
'svg-long-desc' => 'Fișier SVG, cu dimensiunea nominală de $1 × $2 pixeli, mărime fișier: $3',
'svg-long-desc-animated' => 'Fișier SVG animat, cu dimensiunea nominală de $1 × $2 pixeli, mărime fișier: $3',
+'svg-long-error' => 'Fișier SVG invalid: $1',
'show-big-image' => 'Rezoluție maximă',
'show-big-image-preview' => 'Mărimea acestei previzualizări: $1.',
'show-big-image-other' => '{{PLURAL:$2|Altă rezoluție|Alte rezoluții}}: $1.',
@@ -3197,7 +3236,10 @@ Executându-l, sistemul dvs. poate fi compromis.",
'minutes' => '{{PLURAL:$1|un minut|$1 minute|$1 de minute}}',
'hours' => '{{PLURAL:$1|o oră|$1 ore|$1 de ore}}',
'days' => '{{PLURAL:$1|o zi|$1 zile|$1 de zile}}',
+'months' => '{{PLURAL:$1|$1 lună|$1 luni|$1 de luni}}',
+'years' => '{{PLURAL:$1|$1 an|$1 ani|$1 de ani}}',
'ago' => '$1 în urmă',
+'just-now' => 'Chiar acum',
# Bad image list
'bad_image_list' => 'Formatul este următorul:
@@ -3691,6 +3733,7 @@ Acest cod de confirmare va expira la $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Transcluderea interwiki este dezactivată]',
'scarytranscludefailed' => '[Șiretlicul formatului a dat greș pentru $1]',
+'scarytranscludefailed-httpstatus' => '[Șiretlicul formatului a dat greș pentru $1: HTTP $2]',
'scarytranscludetoolong' => '[URL-ul este prea lung]',
# Delete conflict
@@ -3800,6 +3843,7 @@ Puteți folosi în schimb [[Special:EditWatchlist|editorul standard]].',
'version-license' => 'Licență',
'version-poweredby-credits' => "Acest wiki este dezvoltat de '''[//www.mediawiki.org/ MediaWiki]''', drepturi de autor © 2001-$1 $2.",
'version-poweredby-others' => 'alții',
+'version-credits-summary' => 'Am dori să amintim următoarele persoane pentru contribuțiile aduse proiectului [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki este un software liber pe care îl puteți redistribui și/sau modifica sub termenii Licenței Publice Generale GNU publicată de Free Software Foundation – fie a doua versiune a acesteia, fie, la alegerea dumneavoastră, orice altă versiune ulterioară.
MediaWiki este distribuit în speranța că va fi folositor, dar FĂRĂ VREO GARANȚIE, nici măcar cea implicită de COMERCIALIZARE sau de ADAPTARE PENTRU UN UN SCOP ANUME. Vedeți Licența Publică Generală GNU pentru mai multe detalii.
@@ -3914,17 +3958,17 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
'sqlite-no-fts' => '$1 fără suport de căutare în tot textul',
# New logging system
-'logentry-delete-delete' => '$1 a șters pagina $3',
-'logentry-delete-restore' => '$1 a restaurat pagina $3',
-'logentry-delete-event' => '$1 a schimbat vizibilitatea {{PLURAL:$5|unui eveniment din jurnal|a $5 evenimente din jurnal|a $5 de evenimente din jurnal}} în $3: $4',
-'logentry-delete-revision' => '$1 a schimbat vizibilitatea {{PLURAL:$5|unei modificări|a $5 modificări|a $5 de modificări}} din pagina $3: $4',
-'logentry-delete-event-legacy' => '$1 a modificat vizibilitatea evenimentelor din jurnal în $3',
-'logentry-delete-revision-legacy' => '$1 a modificat vizibilitatea modificărilor de pe pagina $3',
-'logentry-suppress-delete' => '$1 a suprimat pagina $3',
-'logentry-suppress-event' => '$1 a modificat în mod secret vizibilitatea {{PLURAL:$5|unui eveniment din jurnal|a $5 evenimente din jurnal|a $5 de evenimente din jurnal}} în $3: $4',
-'logentry-suppress-revision' => '$1 a modificat în mod secret vizibilitatea {{PLURAL:$5|unei modificări|a $5 modificări|a $5 de modificări}} din pagina $3: $4',
-'logentry-suppress-event-legacy' => '$1 a modificat în mod secret vizibilitatea evenimentelor din jurnal în $3',
-'logentry-suppress-revision-legacy' => '$1 a modificat în mod secret vizibilitatea modificărilor de pe pagina $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|a șters}} pagina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|a restaurat}} pagina $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|a schimbat}} vizibilitatea {{PLURAL:$5|unui eveniment din jurnal|a $5 evenimente din jurnal|a $5 de evenimente din jurnal}} pentru $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|a schimbat}} vizibilitatea {{PLURAL:$5|unei versiuni|a $5 versiuni|a $5 de versiuni}} pentru pagina $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|a modificat}} vizibilitatea evenimentelor din jurnal pentru $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|a modificat}} vizibilitatea unor versiuni ale paginii $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|a suprimat}} pagina $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|a modificat}} în mod secret vizibilitatea {{PLURAL:$5|unui eveniment din jurnal|a $5 evenimente din jurnal|a $5 de evenimente din jurnal}} pentru $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|a schimbat}} în mod secret vizibilitatea {{PLURAL:$5|unei versiuni|a $5 versiuni|a $5 de versiuni}} pentru pagina $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|a modificat}} în mod secret vizibilitatea evenimentelor din jurnal pentru $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|a modificat}} în mod secret vizibilitatea versiunilor pentru pagina $3',
'revdelete-content-hid' => 'conținut ascuns',
'revdelete-summary-hid' => 'descrierea modificării ascunsă',
'revdelete-uname-hid' => 'nume de utilizator ascuns',
@@ -3933,17 +3977,21 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
'revdelete-uname-unhid' => 'numele de utilizator afișat',
'revdelete-restricted' => 'restricții aplicate administratorilor',
'revdelete-unrestricted' => 'restricții eliminate pentru administratori',
-'logentry-move-move' => '$1 a redenumit pagina $3 în $4',
-'logentry-move-move-noredirect' => '$1 a redenumit pagina $3 în $4 fără a lăsa o redirecționare în loc',
-'logentry-move-move_redir' => '$1 a redenumit pagina $3 în $4 înlocuind redirecționarea',
-'logentry-move-move_redir-noredirect' => '$1 a redenumit pagina $3 în $4 înlocuind redirecționarea și fără a lăsa o redirecționare în loc',
-'logentry-patrol-patrol' => '$1 a marcat versiunea $4 a paginii $3 ca patrulată',
-'logentry-patrol-patrol-auto' => '$1 a marcat automat versiunea $4 a paginii $3 ca patrulată',
-'logentry-newusers-newusers' => 'Contul de utilizator $1 a fost creat',
-'logentry-newusers-create' => 'Contul de utilizator $1 a fost creat',
-'logentry-newusers-create2' => 'Contul de utilizator $3 a fost creat de către $1',
-'logentry-newusers-autocreate' => 'Contul $1 a fost creat în mod automat',
-'newuserlog-byemail' => 'parola trimisă prin e-mail',
+'logentry-move-move' => '$1 {{GENDER:$2|a redenumit}} pagina $3 în $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|a redenumit}} pagina $3 în $4 fără a lăsa o redirecționare în loc',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|a redenumit}} pagina $3 în $4 înlocuind redirecționarea',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|a redenumit}} pagina $3 în $4 înlocuind redirecționarea și fără a lăsa o redirecționare în loc',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|a marcat}} versiunea $4 a paginii $3 ca patrulată',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|a marcat}} automat versiunea $4 a paginii $3 ca patrulată',
+'logentry-newusers-newusers' => 'Contul de utilizator $1 a fost {{GENDER:$2|creat}}',
+'logentry-newusers-create' => 'Contul de utilizator $1 a fost {{GENDER:$2|creat}}',
+'logentry-newusers-create2' => 'Contul de utilizator $3 a fost {{GENDER:$2|creat}} de către $1',
+'logentry-newusers-byemail' => 'Contul de utilizator $3 a fost {{GENDER:$2|creat}} de către $1, iar parola a fost trimisă prin e-mail',
+'logentry-newusers-autocreate' => 'Contul de utilizator $1 a fost {{GENDER:$2|creat}} în mod automat',
+'logentry-rights-rights' => '$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru $3 de la $4 la $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|a schimbat}} apartenența la grup pentru $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|a fost promovat|a fost promovată}} în mod automat de la $4 la $5',
+'rightsnone' => '(niciunul)',
# Feedback
'feedback-bugornote' => 'Dacă sunteți pregătit să descrieți o problemă tehnică în detaliu vă rugăm să [$1 raportați un bug].
@@ -3997,6 +4045,7 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
'api-error-ok-but-empty' => 'Eroare internă: niciun răspuns de la server.',
'api-error-overwrite' => 'Nu este permisă suprascrierea unui fișier existent.',
'api-error-stashfailed' => 'Eroare internă: serverul nu a putut stoca fișierul temporar.',
+'api-error-publishfailed' => 'Eroare internă: serverul nu a putut publica fișierul temporar.',
'api-error-timeout' => 'Serverul nu a răspuns în timp util.',
'api-error-unclassified' => 'A apărut o eroare necunoscută.',
'api-error-unknown-code' => 'Eroare necunoscută: „$1â€',
@@ -4017,4 +4066,7 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
'duration-centuries' => '$1 {{PLURAL:$1|secol|secole|de secole}}',
'duration-millennia' => '$1 {{PLURAL:$1|mileniu|milenii|de milenii}}',
+# Image rotation
+'rotate-comment' => 'Imagine rotită în sensul acelor de ceasornic cu $1 {{PLURAL:$1|grad|grade|de grade}}',
+
);
diff --git a/languages/messages/MessagesRoa_rup.php b/languages/messages/MessagesRoa_rup.php
deleted file mode 100644
index d05aa0cf..00000000
--- a/languages/messages/MessagesRoa_rup.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-/** Aromanian (Armãneashce)
- *
- * ISO 639-3 code 'rup' should be used. This is code is maintained for backward
- * compatilibity.
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
- *
- * @ingroup Language
- * @file
- *
- */
-
-$fallback = 'rup';
diff --git a/languages/messages/MessagesRoa_tara.php b/languages/messages/MessagesRoa_tara.php
index 4355ee10..ec98e2ac 100644
--- a/languages/messages/MessagesRoa_tara.php
+++ b/languages/messages/MessagesRoa_tara.php
@@ -10,6 +10,7 @@
* @author Joetaras
* @author Kaganer
* @author McDutchie
+ * @author Reder
*/
$specialPageAliases = array(
@@ -162,6 +163,7 @@ $messages = array(
'newwindow' => "(iapre jndr'à 'na fenestra nova)",
'cancel' => 'Scangìlle',
'moredotdotdot' => 'De cchiù...',
+'morenotlisted' => "Otre non jndr'à l'elenghe...",
'mypage' => "'A pàgena meje",
'mytalk' => "'Ngazzaminde mie",
'anontalk' => "'Ngazzaminde pe quiste IP",
@@ -173,7 +175,6 @@ $messages = array(
'qbbrowse' => 'Sfoglie',
'qbedit' => 'Cange',
'qbpageoptions' => 'Pàgene currende',
-'qbpageinfo' => 'Condeste',
'qbmyoptions' => 'Pàggene mije',
'qbspecialpages' => 'Pàggene speciale',
'faq' => 'FAQ',
@@ -196,6 +197,7 @@ $messages = array(
'namespaces' => 'Namespace',
'variants' => 'Variande',
+'navigation-heading' => 'Menu de navegazione',
'errorpagetitle' => 'Errore',
'returnto' => 'Tuerne a $1.',
'tagline' => 'Da {{SITENAME}}',
@@ -444,12 +446,12 @@ L\'amministratore ca l\'ha bloccate dèje sta spiegazione: "$3".',
'virus-unknownscanner' => 'antivirus scanusciute:',
# Login and logout pages
-'logouttext' => "'''Tu tè scollegate.'''
+'logouttext' => "'''Tu tè scolleghete.'''
-Tu puè condinuà a ausà {{SITENAME}} in mode anonime, o tu puè [[Special:UserLogin|collegarte 'n'otra vote]] cumme 'u stesse utende o cumme 'n'otre utende.
-Note Bbuène ca certe pàggene ponne condinuà a essere viste cumme ce tu ste angore collegate, fine a quanne 'a cache d'u browser no se sdeveche.",
-'welcomecreation' => "== Bovegne, $1! ==
-'U cunde tue ha state ccrejete.
+Tu puè condinuà a ausà {{SITENAME}} in mode anonime, o tu puè <span class='plainlinks'>[$1 collegarte 'n'otra vote]</span> cumme 'u stesse utende o cumme 'n'otre utende.
+Note Bbuene ca certe pàggene ponne condinuà a essere viste cumme ce tu ste angore colleghete, fine a quanne a cache d'u browser no se sdeveche.",
+'welcomeuser' => 'Bovègne, $1!',
+'welcomecreation-msg' => "'U cunde tue ha state ccrejete.
No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze tue]].",
'yourname' => 'Nome utende:',
'yourpassword' => 'Passuord:',
@@ -473,7 +475,7 @@ No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze
'gotaccount' => "Tine già 'nu cunde? '''$1'''.",
'gotaccountlink' => 'Tràse',
'userlogin-resetlink' => "T'è scurdate le dettaglie pe trasè?",
-'createaccountmail' => 'pe e-mail',
+'createaccountmail' => 'Pe e-mail',
'createaccountreason' => 'Mutive:',
'badretype' => 'Le passuord ca è scritte non ge sonde uguale.',
'userexists' => "'U nome de l'utende ca è scritte jè già ausate.
@@ -555,6 +557,7 @@ Pe piacere vide c'aspitte 'nu picche de timbe apprime de pruvà 'n'otra vote.",
# Email sending
'php-mail-error-unknown' => "Errore scanusciute jndr'à funzione PHP mail()",
'user-mail-no-addy' => "E' pruvate a mannà 'na mail senze 'u 'ndirizze mail",
+'user-mail-no-body' => "Pruvate a mannà 'na mail cu 'nu cuèrpe vacande o troppe curte.",
# Change password dialog
'resetpass' => "Cange 'a password",
@@ -604,7 +607,7 @@ Tu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta
Passuord temboranèe: $2',
'passwordreset-emailsent' => "'N'e-mail pe arrecurdarte ha state mannate.",
'passwordreset-emailsent-capture' => "'Na e-mail pe azzeramende d'a passuord ha state mannate, ca jè fatte vedè aqquà sotte.",
-'passwordreset-emailerror-capture' => "'Na e-mail de promemorie ha state generate, ca jè fatte vedè aqquà sotte, ma 'u 'nvie a l'utende ha fallite: $1",
+'passwordreset-emailerror-capture' => "'Na e-mail de azzeramende d'a passuord ha state generate, ca jè fatte vedè aqquà sotte, ma 'u 'nvie a l'utende ha fallite: $1",
# Special:ChangeEmail
'changeemail' => "Cange 'u 'ndirizze e-mail",
@@ -614,6 +617,7 @@ Passuord temboranèe: $2',
'changeemail-oldemail' => 'Indirizze e-mail de mò:',
'changeemail-newemail' => 'Indirizze e-mail nuève:',
'changeemail-none' => '(ninde)',
+'changeemail-password' => "'A passuord tue de {{SITENAME}}:",
'changeemail-submit' => 'Cange e-mail',
'changeemail-cancel' => 'Annulle',
@@ -805,7 +809,6 @@ L'urteme archivije de le trasute jè provviste sotte pe referimende:",
'hiddencategories' => 'Sta pàgene jè membre de {{PLURAL:$1|1 categorja|$1 categorije}} scunnute:',
'edittools' => "<!-- 'U teste aqquà avène fatte vedè sotte a le module de le cangiaminde e de le carecaminde- -->",
'edittools-upload' => '-',
-'nocreatetitle' => "Ccreazione d'a pàgene limitete",
'nocreatetext' => "{{SITENAME}} ha restritte l'abilità de ccrejà pàggene nuéve.
Tu puè turnà rrete e cangià 'na pàgene ca già esiste, oppure puè [[Special:UserLogin|trasè o ccrejà n'utende nuéve]].",
'nocreate-loggedin' => 'Non ge tine le permesse pe ccreja pàggene nuève.',
@@ -829,6 +832,15 @@ Pare proprie ca l'onne scangellete.",
'edit-no-change' => "'U cangiamende ca p fatte, avène scettate purcè 'u teste non g'à cangete manghe de 'na virgola.",
'edit-already-exists' => "Non ge puè ccrejà 'na pàgene nove purcè esiste già!",
'defaultmessagetext' => 'Messàgge de teste de base',
+'content-failed-to-parse' => "L'analise d'u condenute $2 pu modelle $1 ha fallite: $3",
+'invalid-content-data' => "Condenute d'u date invalide",
+'content-not-allowed-here' => '"$1" condenute non g\'è permesse sus \'a pàgene [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'Uicchiteste',
+'content-model-text' => 'teste semblice',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "Fà attenziò: Sta vosce tène 'nu sbuenne de funziune de chiamate a l'analizzatore.
@@ -1200,9 +1212,9 @@ Quiste non ge pò essere annullate.",
'prefs-emailconfirm-label' => "Conferme de l'e-mail:",
'prefs-textboxsize' => "Dimenzione d'a finestre de le cangiaminde",
'youremail' => 'Poste:',
-'username' => "Nome de l'utende:",
-'uid' => 'ID Utende:',
-'prefs-memberingroups' => "Membre {{PLURAL:$1|d'u gruppe|de le gruppe}}:",
+'username' => "{{GENDER:$1|Nome de l'utende}}:",
+'uid' => '{{GENDER:$1|ID Utende}}:',
+'prefs-memberingroups' => "{{GENDER:$2|Membre}} {{PLURAL:$1|d'u gruppe|de le gruppe}}:",
'prefs-memberingroups-type' => '$1',
'prefs-registration' => 'Orarie de reggistrazzione:',
'prefs-registration-date-time' => '$1',
@@ -1355,12 +1367,13 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
'right-sendemail' => "Manne 'a mail a otre utinde",
'right-passwordreset' => "Vide l'e-mail de azzeramende d'a passuord",
+# Special:Log/newusers
+'newuserlogpage' => 'Archivije de ccreazione de le utinde',
+'newuserlogpagetext' => "Quiste ète l'archivije de le creazziune de l'utinde.",
+
# User rights log
'rightslog' => "Archivie de le diritte de l'utende",
'rightslogtext' => "Quiste jè 'n'archivije pe le cangiaminde de le deritte de l'utinde.",
-'rightslogentry' => "membre d'u gruppe cangete pe $1 da $2 a $3",
-'rightslogentry-autopromote' => 'ha state promosse automaticamende da $2 a $3',
-'rightsnone' => '(ninde)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ligge sta pàgene',
@@ -1610,6 +1623,7 @@ Ce 'u probbleme angore jè presende, condatte 'n'[[Special:ListUsers/sysop|ammin
'backend-fail-notsame' => "'Nu file non-indendiche esiste già cumme $1.",
'backend-fail-invalidpath' => "$1 non g'è 'nu percorse de memorizzazzione valide.",
'backend-fail-delete' => 'Non ge pozze scangellà \'u file "$1".',
+'backend-fail-describe' => 'Non ge pozze cangià le metadata pu file "$1".',
'backend-fail-alreadyexists' => "'U file $1 già esiste.",
'backend-fail-store' => "Non ge pozze reggistrà 'u file $1 sus a $2.",
'backend-fail-copy' => "Non ge pozze cupià 'u file $1 jndr'à $2.",
@@ -1849,6 +1863,12 @@ Arrecuèrdete de condrollà pe otre collegaminde a le template apprime de scange
'Nvece avessere appondà a 'a temateca appropriate.<br />
'Na pàgene jè trattate cumme pàgene de disambiguazione ce tu ause 'nu template ca è appundate da [[MediaWiki:Disambiguationspage]]",
+'pageswithprop' => "Pàggene cu 'na probbietà d'a pàgene",
+'pageswithprop-legend' => "Pàggene cu 'na probbietà d'a pàgene",
+'pageswithprop-text' => "Sta pàgene elenghe le pàggene ca ausane 'na particolare probbietà d'a pàgene.",
+'pageswithprop-prop' => "Nome d'a probbietà:",
+'pageswithprop-submit' => 'Véje',
+
'doubleredirects' => 'Ridirezionaminde a doppie',
'doubleredirectstext' => "Sta pàgene elenghe le pàggene ca se ridirezionane sus a otre pàggene de ridirezionaminde.
Ogne righe condene 'nu collegamende a 'u prime e a 'u seconde ridirezionamende pe fà vedè addò arrive 'u seconde ridirezionamende, 'u quale jè normalmende 'a pàgena de destinaziona \"rèale\", addò 'u prime ridirezionamende avesse appondà.
@@ -2003,8 +2023,8 @@ Vide pure [[Special:WantedCategories|Categorije cercate]].",
'linksearch-ns' => 'Neimspeise:',
'linksearch-ok' => 'Cirche',
'linksearch-text' => 'Le wildcard cumme a "*.wikipedia.org" ponne essere ausate.<br />
-Onne abbesogne almede de \'nu dominie de levèlle ierte, pe esembie "*.org". <br />
-Protocolle supportate: <code>$1</code> (no sce aggiungenne nisciune de chiste jndr\'à recerca toje).',
+Onne abbesogne almene de \'nu dominie de levèlle ierte, pe esembie "*.org". <br />
+{{PLURAL:$2|Protocolle}} supportate: <code>$1</code> (\'u valore de base jè http:// ce \'u protocolle non g\'è specificate).',
'linksearch-line' => '$1 jè pundete da $2',
'linksearch-error' => "Le wildcard ponne essere ausate sulamende a l'inzie de l'hostname.",
@@ -2023,10 +2043,6 @@ Protocolle supportate: <code>$1</code> (no sce aggiungenne nisciune de chiste jn
'activeusers-hidesysops' => 'Scunne le amministrature',
'activeusers-noresult' => 'Nisciune utende acchiate.',
-# Special:Log/newusers
-'newuserlogpage' => 'Archivije de ccreazione de le utinde',
-'newuserlogpagetext' => "Quiste ète l'archivije de le creazziune de l'utinde.",
-
# Special:ListGroupRights
'listgrouprights' => 'Deritte de le gruppe utinde',
'listgrouprights-summary' => "'A liste ca ste vide ète 'na liste de le gruppe utinde ccreiate sus a sta Uicchi, cu le lore deritte d'accesse associate.
@@ -2124,44 +2140,49 @@ Le cangiaminde future a sta pàgene e 'a pàgene de le 'ngazzaminde associete le
'enotif_mailer' => '{{SITENAME}} Notificatore de email',
'enotif_reset' => 'Signe tutte le pàggene cumme visitete',
-'enotif_newpagetext' => "Queste è 'na pàgena nove.",
'enotif_impersonal_salutation' => 'Utende de {{SITENAME}}',
-'changed' => 'cangete',
-'created' => 'ccrejete',
-'enotif_subject' => '\'A pàgene de {{SITENAME}} $PAGETITLE ha state $CHANGEDORCREATED da $PAGEEDITOR',
+'enotif_subject_deleted' => "'A pàgene $1 de {{SITENAME}} ha state scangellate da {{gender:$2|$2}}",
+'enotif_subject_created' => "'A pàgene $1 de {{SITENAME}} ha state crejete da {{gender:$2|$2}}",
+'enotif_subject_moved' => "'A pàgene $1 de {{SITENAME}} ha state spustate da {{gender:$2|$2}}",
+'enotif_subject_restored' => "'A pàgene $1 de {{SITENAME}} ha state repristenate da {{gender:$2|$2}}",
+'enotif_subject_changed' => "'A pàgene $1 de {{SITENAME}} ha state cangiate da {{gender:$2|$2}}",
+'enotif_body_intro_deleted' => '\'A pàgene $1 de {{SITENAME}} ha state scangellate suse a $PAGEEDITDATE da {{gender:$2|$2}}, vide $3.',
+'enotif_body_intro_created' => '\'A pàgene $1 de {{SITENAME}} ha state crejete suse a $PAGEEDITDATE da {{gender:$2|$2}}, vide $3 p\'a revisione corrende.',
+'enotif_body_intro_moved' => '\'A pàgene $1 de {{SITENAME}} ha state spustate suse a $PAGEEDITDATE da {{gender:$2|$2}}, vide $3 p\'a revisione corrende.',
+'enotif_body_intro_restored' => '\'A pàgene $1 de {{SITENAME}} ha state repristenate suse a $PAGEEDITDATE da {{gender:$2|$2}}, vide $3 p\'a revisione corrende.',
+'enotif_body_intro_changed' => '\'A pàgene $1 de {{SITENAME}} ha state cangiate suse a $PAGEEDITDATE da {{gender:$2|$2}}, vide $3 p\'a revisione corrende.',
'enotif_lastvisited' => "Vide $1 pe tutte le cangiaminde da l'urtema visita toje.",
'enotif_lastdiff' => 'Vide $1 pe vedè stu cangiamende.',
'enotif_anon_editor' => 'Utende anonime $1',
-'enotif_body' => 'Care $WATCHINGUSERNAME,
-
-
-\'A pàgene $PAGETITLE de {{SITENAME}} ha state $CHANGEDORCREATED \'u $PAGEEDITDATE da $PAGEEDITOR, vide $PAGETITLE_URL pa revisione corrende.
+'enotif_body' => "Care \$WATCHINGUSERNAME,
-$NEWPAGE
+\$PAGEINTRO \$NEWPAGE
-Riepileghe de le cangiaminde: $PAGESUMMARY $PAGEMINOREDIT
+Riepileghe de le cangiaminde: \$PAGESUMMARY \$PAGEMINOREDIT
-Condatte l\'editore:
-mail: $PAGEEDITOR_EMAIL
-uicchi: $PAGEEDITOR_WIKI
+Condatte l'editore:
+mail: \$PAGEEDITOR_EMAIL
+uicchi: \$PAGEEDITOR_WIKI
-Non ge stonne otre notifiche ce tu face otre cangiaminde senza ca tu visite sta pàgene.
-Tu puè pure azzerà \'a spunde de le notifiche pe tutte le pàggene condrollate jndr\'à lista toje.
+Non ge stonne otre notifiche ce tu face otre attivitate senze ca tu visite sta pàgene.
+Tu puè pure azzerà 'a spunde de le notifiche pe tutte le pàggene condrollate jndr'à lista toje.
- Statte Bbuene, \'u sisteme de notificaziune de {{SITENAME}}
+ Statte Bbuene, 'u sisteme de notificaziune de {{SITENAME}}
--
-Pe cangià le \'mbostaziune de notifeche de l\'email toje, vè vide
+Pe cangià le 'mbostaziune de notifeche de l'email toje, vè vide
{{canonicalurl:{{#special:Preferences}}}}
-Pe cangià le \'mbostaziune de l\'elenghe de le pàggene condrollate tune, vè vide
+Pe cangià le 'mbostaziune de l'elenghe de le pàggene condrollate tune, vè vide
{{canonicalurl:{{#special:EditWatchlist}}}}
-Pe scangellà \'a pàgene da \'a liste de le pàggene condrollate, vè vide
-$UNWATCHURL
+Pe scangellà 'a pàgene da 'a liste de le pàggene condrollate, vè vide
+\$UNWATCHURL
Segnalaziune e otre assistenze:
-{{canonicalurl:{{MediaWiki:Helppage}}}}',
+{{canonicalurl:{{MediaWiki:Helppage}}}}",
+'created' => 'ccrejete',
+'changed' => 'cangete',
# Delete
'deletepage' => "Scangille 'a pàgene",
@@ -2235,6 +2256,8 @@ Vide 'a [[Special:ProtectedPages|liste de le pàggene prutette]] pa liste de le
'prot_1movedto2' => "[[$1]] spustete jndr'à [[$2]]",
'protect-badnamespace-title' => 'Namespace none proteggibbele',
'protect-badnamespace-text' => "Le pàggene jndr'à stu namespace non ge ponne essere prutette.",
+'protect-norestrictiontypes-text' => 'Sta pàggene non ge pò essere protette purcé non ge stonne tipe de restriziune disponibbile.',
+'protect-norestrictiontypes-title' => 'Pàgene non proteggibbele',
'protect-legend' => "Conferme 'a protezione",
'protectcomment' => 'Mutive:',
'protectexpiry' => 'More:',
@@ -2320,8 +2343,8 @@ Tu puè avè 'nu collegamende sbagliate o 'a revisione pò essere ca ha state re
'undeletedrevisions' => '{{PLURAL:$1|1 revisione|$1 revisiune}} ripristinete',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revisione|$1 revisiune}} e {{PLURAL:$2|1 file|$2 file}} ripristinete',
'undeletedfiles' => '{{PLURAL:$1|1 file|$1 file}} ripristinete',
-'cannotundelete' => "Repristine fallite;
-quaccheotre pò essere ca ha repristinate 'a pàgene apprime.",
+'cannotundelete' => 'Repristine fallite:
+$1',
'undeletedpage' => "'''$1 ha state repristinate'''
Ligge l'[[Special:Log/delete|archivije de le scangellaminde]] pe 'nu report de le urteme scangellaminde e repristinaminde.",
@@ -2355,7 +2378,7 @@ $1",
'blanknamespace' => '(Prengepàle)',
# Contributions
-'contributions' => "Condrebbute de l'utende",
+'contributions' => "Condrebbute de l'{{GENDER:$1|utende}}",
'contributions-title' => "Condrebbute de l'utende pe $1",
'mycontris' => 'Condrebbute mie',
'contribsub2' => 'Pe $1 ($2)',
@@ -2634,6 +2657,7 @@ non ge se pò movere 'na pàgene sus a sè stesse.",
'immobile-target-namespace-iw' => "'U collegamende InderUicchi non ge tène 'na destinaziona valide purcè 'a pàgene ha state spustate.",
'immobile-source-page' => 'Sta pàgene non ge se pò spustà.',
'immobile-target-page' => 'Non ge puè spustà sus a stu titele de destinazione.',
+'bad-target-model' => "'A destinazione desiderate ause 'nu modelle de le condenute diverse. Non ge se pò convertì da $1 a $2.",
'imagenocrossnamespace' => "Non ge pozze spustà 'nu file jndr'à 'nu namespace senza file",
'nonfile-cannot-move-to-file' => "Non ge pozze spustà 'nu file jndr'à 'nu namespace senza file",
'imagetypemismatch' => "L'estenziona nove d'u file non ge se accocchie cu 'u tipe sue",
@@ -2749,6 +2773,7 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
'import-error-interwiki' => 'Pagene "$1" non g\'ha state \'mbortate purcé \'u nome sue jè riservate pe collegaminde esterne (interuicchi).',
'import-error-special' => "'A pagena \"\$1\" non g'ha state 'mbortate purcé apponde a 'nu namespace speciale ca non g'è permesse a le pàggene normale.",
'import-error-invalid' => "'A pàgene \"\$1\" non g'ha state 'mbortate purcé 'u nome jè invalide.",
+'import-error-unserialize' => '\'A revisione $2 d\'a pàgene "$1" non ge pò essere deserializzate. \'A revisione ha state reportate pe ausà \'u modelle d\'u condenute $3 serializzate cumme $4.',
'import-options-wrong' => '{{PLURAL:$2|opzione|opziune}} sbagliate: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => "'A pàgene radice date tène 'nu titole invalide.",
'import-rootpage-nosubpage' => 'Namespace "$1" d\'a pàgene prengepàle non ge permette le sottopàggene.',
@@ -2763,7 +2788,6 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
# JavaScriptTest
'javascripttest' => 'Test de JavaScript',
-'javascripttest-disabled' => "Sta funzione non g'à state abbilitate sus a sta Uicchi.",
'javascripttest-title' => 'Stoche a esegue $1 test',
'javascripttest-pagetext-noframework' => 'Sta pàgene jè riservate pe le esecuziune de le test de Javascript.',
'javascripttest-pagetext-unknownframework' => 'Ambiende de teste scanusciute "$1".',
@@ -2914,11 +2938,13 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
'pageinfo-default-sort' => 'Chiave de ordenamende de base',
'pageinfo-length' => "Lunghezze d'a pàgene (in byte)",
'pageinfo-article-id' => "ID d'a pàgene",
+'pageinfo-language' => "Lènga d'a pàgene de condenute",
'pageinfo-robot-policy' => "State d'u motore de ricerche",
'pageinfo-robot-index' => 'Indicizzabbele',
'pageinfo-robot-noindex' => 'None indicizzabbele',
'pageinfo-views' => 'Numere de visite',
'pageinfo-watchers' => "Numere de visitature d'a pàgene",
+'pageinfo-few-watchers' => 'Mene de $1 {{PLURAL:$1|visitatore|visitature}}',
'pageinfo-redirects-name' => 'Redirezionaminde a sta pàgene',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'Sottopàggene de sta pàgene',
@@ -2934,6 +2960,19 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
'pageinfo-magic-words' => '{{PLURAL:$1|Parole|Parole}} maggiche ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorije|Categorije}} scunnute ($1)',
'pageinfo-templates' => 'Esclude {{PLURAL:$1|template|template}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pàgene|Pàggene}} escluse sus a ($1)',
+'pageinfo-toolboxlink' => "'Mbormaziune d'a pagene",
+'pageinfo-redirectsto' => 'Reinderizze a',
+'pageinfo-redirectsto-info' => "'Mbormazione",
+'pageinfo-contentpage' => "Cundate cumme 'na vôsce",
+'pageinfo-contentpage-yes' => 'Sine',
+'pageinfo-protect-cascading' => 'Protezziune vonne a cascate da aqquà',
+'pageinfo-protect-cascading-yes' => 'Sine',
+'pageinfo-protect-cascading-from' => 'Le protezziune sò a cascate da',
+'pageinfo-category-info' => "'Mbormaziune sus a 'a categorije",
+'pageinfo-category-pages' => 'Numere de pàggene',
+'pageinfo-category-subcats' => 'Numere de sottocategorije',
+'pageinfo-category-files' => 'Numere de file',
# Skin names
'skinname-standard' => 'Classeche',
@@ -2956,6 +2995,8 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
'markedaspatrollederror' => 'Non ge se pò signà cumme condrollate',
'markedaspatrollederrortext' => "Tu è abbesogne de specificà 'na revisione da signà cumme condrollate.",
'markedaspatrollederror-noautopatrol' => 'Tu non ge puè signà le cangiaminde tue cumme condrollate.',
+'markedaspatrollednotify' => 'Stu cangiamende a $1 ha state signate cumme condrollate.',
+'markedaspatrollederrornotify' => 'Signate cumme condrollate fallite.',
# Patrol log
'patrol-log-page' => 'Archivije de le condrolle',
@@ -2990,6 +3031,7 @@ Ce l'esegue sus a 'u sisteme tue pò essere ca se combromette.",
'file-nohires' => "Manghe 'a risoluzione ierta.",
'svg-long-desc' => "Fail SVG, nominalmende sonde $1 × $2 pixel, dimenzione d'u fail: $3",
'svg-long-desc-animated' => "File SVG animate, nominalmende sonde $1 × $2 pixel, dimenzione d'u file: $3",
+'svg-long-error' => 'File SVG invalide: $1',
'show-big-image' => 'Risoluzione chiena chiena',
'show-big-image-preview' => 'Dimenziune de sta andeprime: $1.',
'show-big-image-other' => 'Otre {{PLURAL:$2|resoluzione|resoluziune}}: $1.',
@@ -3024,7 +3066,10 @@ Ce l'esegue sus a 'u sisteme tue pò essere ca se combromette.",
'minutes' => '{{PLURAL:$1|$1 minute|$1 minute}}',
'hours' => '{{PLURAL: $1|$1ore|$1 ore}}',
'days' => '{{PLURAL: $1|$1 sciurne|$1 sciurne}}',
+'months' => '{{PLURAL:$1|$1 mese|$1 mise}}',
+'years' => '{{PLURAL:$1|$1 anne}}',
'ago' => '$1 fà',
+'just-now' => 'mò mò',
# Bad image list
'bad_image_list' => "'U formete jè 'u seguende:
@@ -3617,6 +3662,7 @@ Stu codece de conferme scade 'u \$4.",
# Scary transclusion
'scarytranscludedisabled' => "[Collegaminde 'mbrà InterUicchi disabbilitate]",
'scarytranscludefailed' => "[L'analisi d'u template ha fallite pe $1]",
+'scarytranscludefailed-httpstatus' => "[Analise d'u template fallite pe $1: HTTP $2]",
'scarytranscludetoolong' => '[URL jè troppe longhe]',
# Delete conflict
@@ -3824,6 +3870,7 @@ Tu puè pure [[Special:EditWatchlist|ausà 'u cangiatore standàrd]].",
'version-license' => 'Licenze',
'version-poweredby-credits' => "Sta Uicchi jè fatte da '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'otre',
+'version-credits-summary' => 'Nuje vulesseme acchià le persone seguende pe le lore condrebbute a [[Special:Version|MediaUicchi]].',
'version-license-info' => "MediaUicchi jè 'nu softuare libbere, tu 'u puè redestribbuì e/o cangiarle sotte le termine d'a GNU (Licenze Pubbleche Generale) cumme pubblecate da 'a Free Software Foundation; endrambe le versiune 2 d'a Licenze, o (a scelta toje) 'le versiune cchiù nnove.
Mediauicchi jè destribbuite cu 'a speranze ca jè utile, ma SENZE NISCIUNA GARANZIE; senze nemmanghe 'a garanzie imblicite de COMMERCIABBELETÀ o IDONIETÀ PE 'NU SCOPE PARTICOLARE. Vatte a vide 'a GNU (Licenze Pubbleche Generale) pe cchiù 'mbormaziune.
@@ -3938,17 +3985,17 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
'sqlite-no-fts' => "$1 senze 'u supporte d'a ricerche full-text",
# New logging system
-'logentry-delete-delete' => '$1 pàgena scangellate $3',
-'logentry-delete-restore' => '$1 pàgena repristinate $3',
-'logentry-delete-event' => "$1 cangiate 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
-'logentry-delete-revision' => "$1 cangiate 'a vesibbilità {{PLURAL:$5|d'a revisione|$5 de le revisiune}} sus 'a pàgene $3: $4",
-'logentry-delete-event-legacy' => "$1 cangiate 'a vesibbilità d'u archivije de le fatte sus 'a $3",
-'logentry-delete-revision-legacy' => "$1 cangiate 'a vesibbilità de le revisiune sus 'a pàgene $3",
-'logentry-suppress-delete' => '$1 pàgena soppresse $3',
-'logentry-suppress-event' => "$1 a scunnute cangiate 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
-'logentry-suppress-revision' => "$1 a scunnute cangiate 'a vesibbilità {{PLURAL:$5|d'a revisione|$5 de le revisiune}} sus 'a pàgene $3: $4",
-'logentry-suppress-event-legacy' => "$1 a scunnute cangiate 'a vesibbilità d'u archivije de le fatte sus 'a $3",
-'logentry-suppress-revision-legacy' => "$1 a scunnute cangiate 'a vesibbilità de le revisiune sus 'a pàgene $3",
+'logentry-delete-delete' => '$1 pàgena {{GENDER:$2|scangellate}} $3',
+'logentry-delete-restore' => '$1 pàgena {{GENDER:$2|repristinate}} $3',
+'logentry-delete-event' => "$1 {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
+'logentry-delete-revision' => "$1 {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|d'a revisione|$5 de le revisiune}} sus 'a pàgene $3: $4",
+'logentry-delete-event-legacy' => "$1 {{GENDER:$2|cangiate}} 'a vesibbilità d'u archivije de le fatte sus 'a $3",
+'logentry-delete-revision-legacy' => "$1 {{GENDER:$2|cangiate}} 'a vesibbilità de le revisiune sus 'a pàgene $3",
+'logentry-suppress-delete' => '$1 pàgena {{GENDER:$2|soppresse}} $3',
+'logentry-suppress-event' => "$1 a scunnute {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
+'logentry-suppress-revision' => "$1 a scunnute {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|d'a revisione|$5 de le revisiune}} sus 'a pàgene $3: $4",
+'logentry-suppress-event-legacy' => "$1 a scunnute {{GENDER:$2|cangiate}} 'a vesibbilità d'u archivije de le fatte sus 'a $3",
+'logentry-suppress-revision-legacy' => "$1 a scunnute {{GENDER:$2|cangiate}} 'a vesibbilità de le revisiune sus 'a pàgene $3",
'revdelete-content-hid' => 'condenute scunnute',
'revdelete-summary-hid' => "riepileghe d'u cangiamende scunnute",
'revdelete-uname-hid' => "nome de l'utende scunnute",
@@ -3957,17 +4004,21 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
'revdelete-uname-unhid' => "nome de l'utende fatte vedè",
'revdelete-restricted' => 'appliche le restriziune a le SysOps',
'revdelete-unrestricted' => 'live le restriziune a le SysOps',
-'logentry-move-move' => '$1 pàgena spustate $3 a $4',
-'logentry-move-move-noredirect' => "$1 pàgena spustate $3 a $4 senze lassà 'nu redirezionamende",
-'logentry-move-move_redir' => "$1 pàgena spustate $3 a $4 cu 'u redirezionamende",
-'logentry-move-move_redir-noredirect' => "$1 pàgena spustate $3 a $4 sus a 'nu redirezionamende senze lassà 'nu redirezionamende",
-'logentry-patrol-patrol' => '$1 revisione marcate $4 de pàgene condrollate $3',
-'logentry-patrol-patrol-auto' => '$1 automaticamende revisione marcate $4 de pàgene condrollate $3',
-'logentry-newusers-newusers' => "'U cunde utende $1 ha state ccrejate",
-'logentry-newusers-create' => "'U cunde utende $1 ha state ccrejate",
-'logentry-newusers-create2' => "$1 {{GENDER:$2|ccrejate}} {{GENDER:$4|'nu cunde utende}} $3",
-'logentry-newusers-autocreate' => "'U cunde utende $1 ha state ccrejate automaticamende",
-'newuserlog-byemail' => 'password mannete pe e-mail',
+'logentry-move-move' => '$1 pàgena {{GENDER:$2|spustate}} $3 a $4',
+'logentry-move-move-noredirect' => "$1 pàgena {{GENDER:$2|spustate}} $3 a $4 senze lassà 'nu redirezionamende",
+'logentry-move-move_redir' => "$1 pàgena {{GENDER:$2|spustate}} $3 a $4 cu 'u redirezionamende",
+'logentry-move-move_redir-noredirect' => "$1 pàgena {{GENDER:$2|spustate}} $3 a $4 sus a 'nu redirezionamende senze lassà 'nu redirezionamende",
+'logentry-patrol-patrol' => '$1 revisione {{GENDER:$2|signate}} $4 de pàgene condrollate $3',
+'logentry-patrol-patrol-auto' => '$1 automaticamende revisione {{GENDER:$2|signate}} $4 de pàgene condrollate $3',
+'logentry-newusers-newusers' => "'U cunde utende $1 ha state {{GENDER:$2|ccrejate}}",
+'logentry-newusers-create' => "'U cunde utende $1 ha state {{GENDER:$2|ccrejate}}",
+'logentry-newusers-create2' => "'U cunde utende $3 ha state {{GENDER:$2|ccrejate}} da $1",
+'logentry-newusers-byemail' => "'U cunde utende $3 ha state {{GENDER:$2|ccrejate}} da $1 e 'a passuord ha state mannate pe e-mail",
+'logentry-newusers-autocreate' => "'U cunde utende $1 ha state {{GENDER:$2|ccrejate}} automaticamende",
+'logentry-rights-rights' => "$1 membre d'u gruppe {{GENDER:$2|cangiate}} pe $3 da $4 a $5",
+'logentry-rights-rights-legacy' => "$1 ave {{GENDER:$2|cangiate}} 'u membre d'u gruppe pe $3",
+'logentry-rights-autopromote' => '$1 ha state {{GENDER:$2|promosse}} automaticamende da $4 a $5',
+'rightsnone' => '(ninde)',
# Feedback
'feedback-bugornote' => "Ce tu si pronde a descrivere 'nu probbleme tecniche cu le dettaglie pe piacere [\$1 manne 'nu bug].
@@ -4021,6 +4072,7 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
'api-error-ok-but-empty' => "Errore inderne: Nisciune resposte da 'u server.",
'api-error-overwrite' => "'A sovrascritture de 'nu file ca esiste non ge se pò fà.",
'api-error-stashfailed' => "Errore inderne: 'U server ha fallite 'a reggistrazione de le file temboranèe.",
+'api-error-publishfailed' => "Errore inderne: 'U server ha fallite 'a pubblecazione d'u file temboranèe.",
'api-error-timeout' => "'U server non g'ave resposte jndr'à 'u tiembe ca 'u spettave.",
'api-error-unclassified' => "'N'errore scanusciute s'a verificate",
'api-error-unknown-code' => 'Errore scanusciute: "$1"',
@@ -4041,4 +4093,7 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
'duration-centuries' => '$1 {{PLURAL:$1|sechele|sechele}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennie|millennie}}',
+# Image rotation
+'rotate-comment' => 'Immaggine rotate de $1 {{PLURAL:$1|grade}} in sienze orarie',
+
);
diff --git a/languages/messages/MessagesRu.php b/languages/messages/MessagesRu.php
index 40264af0..49103322 100644
--- a/languages/messages/MessagesRu.php
+++ b/languages/messages/MessagesRu.php
@@ -17,8 +17,10 @@
* @author Alexandr Efremov
* @author Amikeco
* @author Amire80
+ * @author Anonim.one
* @author Askarmuk
* @author Assele
+ * @author Biathlon
* @author Bouron
* @author Chilin
* @author Claymore
@@ -43,6 +45,7 @@
* @author Huuchin
* @author Ignatus
* @author Illusion
+ * @author Iltever
* @author Incnis Mrsi
* @author Iniquity
* @author Innv
@@ -57,6 +60,7 @@
* @author Lockal
* @author MaxBioHazard
* @author MaxSem
+ * @author NBS
* @author Ola
* @author Ole Yves
* @author Putnik
@@ -202,7 +206,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
'toc' => array( '0', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
'noeditsection' => array( '0', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__БЕЗ_ЗÐГОЛОВКÐ__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
@@ -534,6 +537,7 @@ $messages = array(
'newwindow' => '(в новом окне)',
'cancel' => 'Отменить',
'moredotdotdot' => 'Далее…',
+'morenotlisted' => 'Больше ничего нету...',
'mypage' => 'Страница',
'mytalk' => 'ОбÑуждение',
'anontalk' => 'ОбÑуждение Ð´Ð»Ñ Ñтого IP-адреÑа',
@@ -545,7 +549,6 @@ $messages = array(
'qbbrowse' => 'ПроÑмотреть',
'qbedit' => 'Править',
'qbpageoptions' => 'ÐаÑтройки Ñтраницы',
-'qbpageinfo' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Ñтранице',
'qbmyoptions' => 'Ваши наÑтройки',
'qbspecialpages' => 'Специальные Ñтраницы',
'faq' => 'ЧаВО',
@@ -568,6 +571,7 @@ $messages = array(
'namespaces' => 'ПроÑтранÑтва имён',
'variants' => 'Варианты',
+'navigation-heading' => 'ÐавигациÑ',
'errorpagetitle' => 'Ошибка',
'returnto' => 'Возврат к Ñтранице $1.',
'tagline' => 'Материал из {{grammar:genitive|{{SITENAME}}}}',
@@ -809,10 +813,10 @@ $2',
# Login and logout pages
'logouttext' => "'''Ð’Ñ‹ завершили ÑÐµÐ°Ð½Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹.'''
-Ð’Ñ‹ можете продолжить учаÑтие в {{grammar:genitive|{{SITENAME}}}} анонимно или [[Special:UserLogin|предÑтавитьÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾]] под тем же или другим именем.
+Ð’Ñ‹ можете продолжить учаÑтие в {{grammar:genitive|{{SITENAME}}}} анонимно или <span class='plainlinks'>[$1 предÑтавитьÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾]</span> под тем же или другим именем.
Ðекоторые Ñтраницы могут продолжать отображатьÑÑ Ð² том виде, как будто вы вÑÑ‘ ещё предÑтавлены ÑиÑтеме. Ð”Ð»Ñ Ð±Ð¾Ñ€ÑŒÐ±Ñ‹ Ñ Ñтим Ñвлением обновите кÑш браузера.",
-'welcomecreation' => '== Добро пожаловать, $1! ==
-Ваша ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ñоздана.
+'welcomeuser' => 'Добро пожаловать, $1!',
+'welcomecreation-msg' => 'Ваша ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ñоздана.
Ðе забудьте провеÑти [[Special:Preferences|перÑональную наÑтройку]] Ñайта {{SITENAME}}.',
'yourname' => 'Ð˜Ð¼Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи:',
'yourpassword' => 'Пароль:',
@@ -836,7 +840,7 @@ $2',
'gotaccount' => "Ð’Ñ‹ уже зарегиÑтрированы? '''$1'''.",
'gotaccountlink' => 'ПредÑтавьтеÑÑŒ',
'userlogin-resetlink' => 'Забыли данные Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð°?',
-'createaccountmail' => 'Ð’Ñ‹Ñлать пароль по Ñл. почте',
+'createaccountmail' => 'ИÑпользовать Ñгенерированный Ñлучайным образом временный пароль и выÑлать мне его на указанный ниже Ð°Ð´Ñ€ÐµÑ Ñлектронной почты:',
'createaccountreason' => 'Причина:',
'badretype' => 'Введённые вами пароли не Ñовпадают.',
'userexists' => 'Введённое Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника уже иÑпользуетÑÑ.
@@ -911,6 +915,7 @@ $2',
# Email sending
'php-mail-error-unknown' => 'ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в PHP-функции mail()',
'user-mail-no-addy' => 'ПыталÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ Ñлектронное пиÑьмо без адреÑа Ñлектронной почты',
+'user-mail-no-body' => 'ПыталÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ Ñлектронное пиÑьмо Ñ Ð¿ÑƒÑтым или беÑÑмыÑленно коротким Ñодержанием.',
# Change password dialog
'resetpass' => 'Изменение паролÑ',
@@ -974,6 +979,7 @@ $2
'changeemail-oldemail' => 'Текущий Ð°Ð´Ñ€ÐµÑ Ñлектронной почты:',
'changeemail-newemail' => 'Ðовый Ð°Ð´Ñ€ÐµÑ Ñлектронной почты:',
'changeemail-none' => '(нет)',
+'changeemail-password' => 'Ваш пароль Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð° «{{SITENAME}}»:',
'changeemail-submit' => 'Изменить адреÑ',
'changeemail-cancel' => 'Отмена',
@@ -1157,7 +1163,6 @@ $2
'template-semiprotected' => '(чаÑтично защищено)',
'hiddencategories' => 'Эта Ñтраница отноÑитÑÑ Ðº $1 {{PLURAL:$1|Ñкрытой категории|Ñкрытым категориÑм}}:',
'edittools' => '<!-- РаÑположенный здеÑÑŒ текÑÑ‚ будет показыватьÑÑ Ð¿Ð¾Ð´ формой Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ формой загрузки. -->',
-'nocreatetitle' => 'Создание Ñтраниц ограничено',
'nocreatetext' => 'Ðа Ñтом Ñайте ограничена возможноÑÑ‚ÑŒ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ñ‹Ñ… Ñтраниц.
Ð’Ñ‹ можете вернутьÑÑ Ð½Ð°Ð·Ð°Ð´ и отредактировать ÑущеÑтвующую Ñтраницу, [[Special:UserLogin|предÑтавитьÑÑ ÑиÑтеме или Ñоздать новую учётную запиÑÑŒ]].',
'nocreate-loggedin' => 'У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñоздавать новые Ñтраницы.',
@@ -1182,6 +1187,15 @@ $2
'edit-already-exists' => 'Ðевозможно Ñоздать новую Ñтраницу.
Она уже ÑущеÑтвует.',
'defaultmessagetext' => 'ТекÑÑ‚ по умолчанию',
+'content-failed-to-parse' => 'Содержимое $2 не ÑоответÑтвует типу $1: $3.',
+'invalid-content-data' => 'ÐедопуÑтимые данные',
+'content-not-allowed-here' => 'Содержимое "$1" недопуÑтимо на Ñтранице [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'вики-текÑÑ‚',
+'content-model-text' => 'обычный текÑÑ‚',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Внимание!''' Эта Ñтраница Ñодержит Ñлишком много вызовов реÑурÑоёмких функций.
@@ -1544,9 +1558,9 @@ $1",
'prefs-emailconfirm-label' => 'Подтверждение Ñлектронной почты:',
'prefs-textboxsize' => 'Размер окна редактированиÑ',
'youremail' => 'Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°:',
-'username' => 'Ð˜Ð¼Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи:',
-'uid' => 'Идентификатор учаÑтника:',
-'prefs-memberingroups' => 'Член {{PLURAL:$1|группы|групп}}:',
+'username' => '{{GENDER:$1|Ð˜Ð¼Ñ ÑƒÑ‡Ð°Ñтника|Ð˜Ð¼Ñ ÑƒÑ‡Ð°Ñтницы}}:',
+'uid' => 'Код {{GENDER:$1|учаÑтника|учаÑтницы}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Член|Член}} {{PLURAL:$1|группы|групп}}:',
'prefs-registration' => 'Ð’Ñ€ÐµÐ¼Ñ Ñ€ÐµÐ³Ð¸Ñтрации:',
'yourrealname' => 'ÐаÑтоÑщее имÑ:',
'yourlanguage' => 'Язык интерфейÑа:',
@@ -1696,12 +1710,13 @@ $1",
'right-sendemail' => 'отправлÑÑ‚ÑŒ Ñлектронную почту другим учаÑтникам',
'right-passwordreset' => 'проÑмотр Ñлектронных пиÑем Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸ÐµÐ¼ паролÑ',
+# Special:Log/newusers
+'newuserlogpage' => 'Журнал региÑтрации учаÑтников',
+'newuserlogpagetext' => 'СпиÑок недавно зарегиÑтрировавшихÑÑ ÑƒÑ‡Ð°Ñтников',
+
# User rights log
'rightslog' => 'Журнал прав учаÑтника',
'rightslogtext' => 'Это журнал изменений прав учаÑтника.',
-'rightslogentry' => 'изменил членÑтво в группах Ð´Ð»Ñ $1 Ñ $2 на $3',
-'rightslogentry-autopromote' => 'был автоматичеÑки переведён из $2 в $3',
-'rightsnone' => '(нет)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'чтение Ñтой Ñтраницы',
@@ -1941,6 +1956,7 @@ $1',
'backend-fail-notsame' => 'Уже еÑÑ‚ÑŒ неидентичный файл $1.',
'backend-fail-invalidpath' => '$1 не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым путём хранениÑ.',
'backend-fail-delete' => 'Ðе удалоÑÑŒ удалить файл $1.',
+'backend-fail-describe' => 'Ðе удалоÑÑŒ изменить метаданные файла «$1».',
'backend-fail-alreadyexists' => 'Файл $1 уже ÑущеÑтвует.',
'backend-fail-store' => 'Ðе удалоÑÑŒ Ñохранить файл $1 на $2 .',
'backend-fail-copy' => 'Ðе удалоÑÑŒ Ñкопировать файл $1 в $2 .',
@@ -2175,6 +2191,12 @@ $1',
ВмеÑто Ñтого они, вероÑтно, должны указывать на ÑоответÑтвующую конкретную Ñтраницу.<br />
Страница ÑчитаетÑÑ Ð¼Ð½Ð¾Ð³Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ð¹, еÑли на ней размещён шаблон, Ð¸Ð¼Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ указано на Ñтранице [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Страницы Ñ Ð¿ÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ð¼Ð¸ ÑвойÑтвами',
+'pageswithprop-legend' => 'Страницы Ñ Ð¿ÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ð¼Ð¸ ÑвойÑтвами',
+'pageswithprop-text' => 'ЗдеÑÑŒ перечиÑлены Ñтраницы, у которых были вручную переопределены отдельные ÑвойÑтва.',
+'pageswithprop-prop' => 'Ðазвание ÑвойÑтва:',
+'pageswithprop-submit' => 'Ðайти',
+
'doubleredirects' => 'Двойные перенаправлениÑ',
'doubleredirectstext' => 'Ðа Ñтой Ñтранице предÑтавлен ÑпиÑок перенаправлений на другие перенаправлениÑ.
ÐšÐ°Ð¶Ð´Ð°Ñ Ñтрока Ñодержит ÑÑылки на первое и второе перенаправлениÑ, а также целевую Ñтраницу второго перенаправлениÑ, в которой обычно указываетÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ Ñтраницы, куда должно ÑÑылатьÑÑ Ð¿ÐµÑ€Ð²Ð¾Ðµ перенаправление.
@@ -2328,7 +2350,7 @@ $1',
'linksearch-ok' => 'Ðайти',
'linksearch-text' => 'Можно иÑпользовать подÑтановочные Ñимволы, например, <code>*.wikipedia.org</code>.
Ðеобходим по крайней мере домен верхнего уровнÑ, например <code>*.org</code><br />
-Поддерживаемые протоколы: <code>$1</code> (по умолчанию подÑтавлÑетÑÑ http://, еÑли протокол Ñвно не задан).',
+Поддерживаемые {{PLURAL:$2|протокол|протоколы}}: <code>$1</code> (по умолчанию подÑтавлÑетÑÑ http://, еÑли протокол Ñвно не задан).',
'linksearch-line' => 'СÑылка на $1 из $2',
'linksearch-error' => 'ПодÑтановочные Ñимволы могут иÑпользоватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в начале адреÑов.',
@@ -2347,10 +2369,6 @@ $1',
'activeusers-hidesysops' => 'Скрыть админиÑтраторов',
'activeusers-noresult' => 'Ðе найдено учаÑтников.',
-# Special:Log/newusers
-'newuserlogpage' => 'Журнал региÑтрации учаÑтников',
-'newuserlogpagetext' => 'СпиÑок недавно зарегиÑтрировавшихÑÑ ÑƒÑ‡Ð°Ñтников',
-
# Special:ListGroupRights
'listgrouprights' => 'Права групп учаÑтников',
'listgrouprights-summary' => 'Ðиже предÑтавлен ÑпиÑок определённых в Ñтой вики групп учаÑтников, указаны ÑоответÑтвующие им права доÑтупа.
@@ -2447,19 +2465,23 @@ $1',
'enotif_mailer' => '{{SITENAME}} Служба извещений по почте',
'enotif_reset' => 'Отметить вÑе Ñтраницы как проÑмотренные',
-'enotif_newpagetext' => 'Это Ð½Ð¾Ð²Ð°Ñ Ñтраница.',
'enotif_impersonal_salutation' => 'УчаÑтник {{grammar:genitive|{{SITENAME}}}}',
-'changed' => 'изменена',
-'created' => 'Ñоздана',
-'enotif_subject' => 'Страница проекта «{{SITENAME}}» $PAGETITLE была $CHANGEDORCREATED учаÑтником $PAGEEDITOR',
+'enotif_subject_deleted' => 'Страница проекта «{{SITENAME}}» Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «$1» была удалена {{gender:$2|учаÑтником|учаÑтницей}} $2',
+'enotif_subject_created' => 'Страница проекта «{{SITENAME}}» Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «$1» была Ñоздана {{gender:$2|учаÑтником|учаÑтницей}} $2',
+'enotif_subject_moved' => 'Страница проекта «{{SITENAME}}» Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «$1» была переименована {{gender:$2|учаÑтником|учаÑтницей}} $2',
+'enotif_subject_restored' => 'Страница проекта «{{SITENAME}}» Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «$1» была воÑÑтановлена {{gender:$2|учаÑтником|учаÑтницей}} $2',
+'enotif_subject_changed' => 'Страница проекта «{{SITENAME}}» Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «$1» была изменена {{gender:$2|учаÑтником|учаÑтницей}} $2',
+'enotif_body_intro_deleted' => '$PAGEEDITDATE {{gender:$2|учаÑтником|учаÑтницей}} $2 была удалена Ñтраница проекта «{{SITENAME}}» Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «$1», Ñм. $3.',
+'enotif_body_intro_created' => '$PAGEEDITDATE {{gender:$2|учаÑтником|учаÑтницей}} $2 была Ñоздана Ñтраница проекта «{{SITENAME}}» Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «$1», Ñм. текущую верÑию по ÑÑылке: $3',
+'enotif_body_intro_moved' => '$PAGEEDITDATE {{gender:$2|учаÑтником|учаÑтницей}} $2 была переименована Ñтраница проекта «{{SITENAME}}» Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «$1», Ñм. текущую верÑию по ÑÑылке: $3',
+'enotif_body_intro_restored' => '$PAGEEDITDATE {{gender:$2|учаÑтником|учаÑтницей}} $2 была воÑÑтановлена Ñтраница проекта «{{SITENAME}}» Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «$1», Ñм. текущую верÑию по ÑÑылке: $3',
+'enotif_body_intro_changed' => '$PAGEEDITDATE {{gender:$2|учаÑтником|учаÑтницей}} $2 была изменена Ñтраница проекта «{{SITENAME}}» Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «$1», Ñм. текущую верÑию по ÑÑылке: $3',
'enotif_lastvisited' => 'См. $1 Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра вÑех изменений, произошедших Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ поÑледнего поÑещениÑ.',
'enotif_lastdiff' => 'См. $1 Ð´Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸ÐµÐ¼.',
'enotif_anon_editor' => 'анонимный учаÑтник $1',
-'enotif_body' => 'Уважаемый(аÑ) $WATCHINGUSERNAME,
+'enotif_body' => 'ЗдравÑтвуйте, $WATCHINGUSERNAME!
-$PAGEEDITDATE Ñтраница проекта «{{SITENAME}}» $PAGETITLE была $CHANGEDORCREATED учаÑтником $PAGEEDITOR, Ñм. $PAGETITLE_URL Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра текущей верÑии.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Краткое опиÑание изменениÑ: $PAGESUMMARY $PAGEMINOREDIT
@@ -2467,8 +2489,7 @@ $NEWPAGE
Ñл. почта: $PAGEEDITOR_EMAIL
вики: $PAGEEDITOR_WIKI
-ЕÑли вы не поÑетите Ñту Ñтраницу, то в Ñлучае её дальнейших изменений уведомлений больше не будет.
-Ð’Ñ‹ можете также отключить опцию ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ñех Ñтраниц в вашем ÑпиÑке наблюдениÑ.
+ЕÑли вы не поÑетите Ñту Ñтраницу, то в Ñлучае её дальнейших изменений уведомлений больше не будет. Ð’Ñ‹ можете также отключить опцию ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ñех Ñтраниц в вашем ÑпиÑке наблюдениÑ.
СиÑтема Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ {{grammar:genitive|{{SITENAME}}}}
@@ -2484,6 +2505,8 @@ $UNWATCHURL
ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ ÑвÑзь и помощь
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'Ñоздана',
+'changed' => 'изменена',
# Delete
'deletepage' => 'Удалить Ñтраницу',
@@ -2554,6 +2577,8 @@ $UNWATCHURL
'prot_1movedto2' => '[[$1]] переименована в [[$2]]',
'protect-badnamespace-title' => 'Ðезащищаемое проÑтранÑтво имён',
'protect-badnamespace-text' => 'Страницы в Ñтом проÑтранÑтве имён не могут быть защищены.',
+'protect-norestrictiontypes-text' => 'Эта Ñтраница не может быть защищена, как как Ð´Ð»Ñ Ð½ÐµÑ‘ нет доÑтупных типов ограничений.',
+'protect-norestrictiontypes-title' => 'ÐÐµÐ·Ð°Ñ‰Ð¸Ñ‰Ð°ÐµÐ¼Ð°Ñ Ñтраница',
'protect-legend' => 'Подтвердите уÑтановку защиты Ñтраницы',
'protectcomment' => 'Причина:',
'protectexpiry' => 'ИÑтекает:',
@@ -2634,7 +2659,8 @@ $UNWATCHURL
'undeletedrevisions' => '$1 {{PLURAL:$1|изменение|изменениÑ|изменений}} воÑÑтановлено',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|верÑиÑ|верÑии|верÑий}} и $2 {{PLURAL:$2|файл|файла|файлов}} воÑÑтановлено',
'undeletedfiles' => '$1 {{PLURAL:$1|файл воÑÑтановлен|файла воÑÑтановлено|файлов воÑÑтановлено}}',
-'cannotundelete' => 'Ошибка воÑÑтановлениÑ. Возможно, кто-то другой уже воÑÑтановил Ñтраницу.',
+'cannotundelete' => 'Ошибка воÑÑтановлениÑ:
+$1',
'undeletedpage' => "'''Страница «$1» была воÑÑтановлена.'''
Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра ÑпиÑка поÑледних удалений и воÑÑтановлений Ñм. [[Special:Log/delete|журнал удалений]].",
@@ -2665,7 +2691,7 @@ $1',
'blanknamespace' => '(оÑновное)',
# Contributions
-'contributions' => 'Вклад учаÑтника',
+'contributions' => 'Вклад {{GENDER:$1|учаÑтника|учаÑтницы}}',
'contributions-title' => 'Вклад {{GENDER:$1|учаÑтника|учаÑтницы}} $1',
'mycontris' => 'Вклад',
'contribsub2' => 'Вклад $1 ($2)',
@@ -2938,6 +2964,7 @@ $1',
'immobile-target-namespace-iw' => 'СÑылка интервики не может быть иÑпользована Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ.',
'immobile-source-page' => 'Эту Ñтраницу Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ñ‚ÑŒ.',
'immobile-target-page' => 'ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ñвоить Ñтранице Ñто имÑ.',
+'bad-target-model' => 'Ðевозможно преобразовать $1 в $2: неÑовмеÑтимые модели данных.',
'imagenocrossnamespace' => 'Ðевозможно дать файлу Ð¸Ð¼Ñ Ð¸Ð· другого проÑтранÑтва имён',
'nonfile-cannot-move-to-file' => 'Ðевозможно переименовывать Ñтраницы в файлы',
'imagetypemismatch' => 'Ðовое раÑширение файла не ÑоответÑтвует его типу',
@@ -3048,6 +3075,7 @@ $1',
'import-error-interwiki' => 'Страница «$1» не была импортирована, так как её название зарезервировано Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ñ… ÑÑылок (интервики).',
'import-error-special' => 'Страница «$1» не была импортирована, так как она отноÑитÑÑ Ðº оÑобому проÑтранÑтву имён, не позволÑющему Ñоздавать Ñтраницы.',
'import-error-invalid' => 'Страница «$1» не была импортирована из-за недопуÑтимого названиÑ.',
+'import-error-unserialize' => 'ВерÑÐ¸Ñ $2 Ñтраницы «$1» не может быть Ñтруктурирована (деÑериализована). Получено Ñообщение, что в Ñтой верÑии иÑпользована модель Ñодержимого $3, ÑÐµÑ€Ð¸Ð°Ð»Ð¸Ð·ÑƒÐµÐ¼Ð°Ñ Ð² формате $4.',
'import-options-wrong' => '{{PLURAL:$2|ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ|Ðеверные опции}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Указанное название корневой Ñтраницы некорректно.',
'import-rootpage-nosubpage' => 'Ð’ проÑтранÑтве имён указанной корневой Ñтраницы «$1» подÑтраницы запрещены.',
@@ -3062,7 +3090,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'Проверка JavaScript',
-'javascripttest-disabled' => 'Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð° в Ñтой вики.',
'javascripttest-title' => 'ПроводитÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° $1',
'javascripttest-pagetext-noframework' => 'Эта Ñтраница зарезервирована Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка JavaScript-теÑтов.',
'javascripttest-pagetext-unknownframework' => 'ÐеизвеÑÑ‚Ð½Ð°Ñ Ñреда теÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Â«$1».',
@@ -3212,11 +3239,13 @@ The wiki server can't provide data in a format your client can read.",
'pageinfo-default-sort' => 'Ключ Ñортировки по умолчанию',
'pageinfo-length' => 'Длина Ñтраницы (в байтах)',
'pageinfo-article-id' => 'Идентификатор Ñтраницы',
+'pageinfo-language' => 'Язык Ñтраницы',
'pageinfo-robot-policy' => 'ИндекÑÐ°Ñ†Ð¸Ñ Ð¿Ð¾Ð¸Ñковыми Ñлужбами',
'pageinfo-robot-index' => 'ИндекÑируетÑÑ',
'pageinfo-robot-noindex' => 'Ðе индекÑируетÑÑ',
'pageinfo-views' => 'КоличеÑтво проÑмотров',
'pageinfo-watchers' => 'ЧиÑло наблюдающих',
+'pageinfo-few-watchers' => 'Менее $1 {{PLURAL:$1|ÑледÑщего|ÑледÑщих}}',
'pageinfo-redirects-name' => 'ÐŸÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° Ñту Ñтраницу',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'ПодÑтраницы данной Ñтраницы',
@@ -3232,6 +3261,19 @@ The wiki server can't provide data in a format your client can read.",
'pageinfo-magic-words' => '{{PLURAL:$1|МагичеÑкое Ñлово|МагичеÑкие Ñлова}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Ð¡ÐºÑ€Ñ‹Ñ‚Ð°Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ|Скрытых категорий}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Шаблон|Шаблонов}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Включаемые Ñтраницы|Включаемых Ñтраниц}} ($1)',
+'pageinfo-toolboxlink' => 'Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Ñтранице',
+'pageinfo-redirectsto' => 'Перенаправление',
+'pageinfo-redirectsto-info' => 'ÑведениÑ',
+'pageinfo-contentpage' => 'УчитываетÑÑ Ñчётчиком как ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñтраница',
+'pageinfo-contentpage-yes' => 'Да',
+'pageinfo-protect-cascading' => 'КаÑÐºÐ°Ð´Ð½Ð°Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð° отÑюда',
+'pageinfo-protect-cascading-yes' => 'Да',
+'pageinfo-protect-cascading-from' => 'КаÑÐºÐ°Ð´Ð½Ð°Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð° от',
+'pageinfo-category-info' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ категории',
+'pageinfo-category-pages' => 'КоличеÑтво Ñтраниц',
+'pageinfo-category-subcats' => 'КоличеÑтво подкатегорий',
+'pageinfo-category-files' => 'КоличеÑтво файлов',
# Skin names
'skinname-standard' => 'КлаÑÑичеÑкое',
@@ -3253,6 +3295,8 @@ The wiki server can't provide data in a format your client can read.",
'markedaspatrollederror' => 'Ðевозможно отметить как проверенную',
'markedaspatrollederrortext' => 'Ð’Ñ‹ должны указать верÑию, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ отмечена как провереннаÑ.',
'markedaspatrollederror-noautopatrol' => 'Вам не разрешено отмечать ÑобÑтвенные правки как проверенные.',
+'markedaspatrollednotify' => 'Это изменение на Ñтранице «$1» было отмечено как проверенное.',
+'markedaspatrollederrornotify' => 'Отметить изменение как проверенное не удалоÑÑŒ.',
# Patrol log
'patrol-log-page' => 'Журнал патрулированиÑ',
@@ -3287,6 +3331,7 @@ $1',
'file-nohires' => 'Ðет верÑии Ñ Ð±Ð¾Ìльшим разрешением.',
'svg-long-desc' => 'SVG-файл, номинально $1 × $2 {{PLURAL:$2|пикÑель|пикÑелÑ|пикÑелей}}, размер файла: $3',
'svg-long-desc-animated' => 'Ðнимированный SVG-файл, номинально $1 × $2 {{PLURAL:$2|пикÑель|пикÑелÑ|пикÑелей}}, размер файла: $3',
+'svg-long-error' => 'неправильный SVG-файл: $1',
'show-big-image' => 'Изображение в более выÑоком разрешении',
'show-big-image-preview' => 'Размер при предпроÑмотре: $1.',
'show-big-image-other' => '{{PLURAL:$2|Другое разрешение|Другие разрешениÑ}}: $1.',
@@ -3321,7 +3366,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 минута|$1 минуты|$1 минут}}',
'hours' => '{{PLURAL:$1|$1 чаÑ|$1 чаÑа|$1 чаÑов}}',
'days' => '{{PLURAL:$1|$1 день|$1 днÑ|$1 дней}}',
+'months' => '{{PLURAL:$1|$1 меÑÑц|$1 меÑÑца|$1 меÑÑцев}}',
+'years' => '{{PLURAL:$1|$1 год|$1 года|$1 лет}}',
'ago' => '$1 назад',
+'just-now' => 'только что',
# Bad image list
'bad_image_list' => 'Формат должен быть Ñледующим:
@@ -3826,6 +3874,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[Интервики-включение отключено]',
'scarytranscludefailed' => '[Ошибка Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº шаблону $1]',
+'scarytranscludefailed-httpstatus' => '[Ðе удалоÑÑŒ загрузить шаблон Ð´Ð»Ñ $1: HTTP $2]',
'scarytranscludetoolong' => '[Слишком длинный URL]',
# Delete conflict
@@ -4011,6 +4060,7 @@ $5
'version-license' => 'ЛицензиÑ',
'version-poweredby-credits' => "Эта вики работает на движке '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'другие',
+'version-credits-summary' => 'Хотим поблагодарить Ñледующих учаÑтников за их вклад в развитие [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki ÑвлÑетÑÑ Ñвободным программным обеÑпечением, которое вы можете раÑпроÑтранÑÑ‚ÑŒ и/или изменÑÑ‚ÑŒ в ÑоответÑтвии Ñ ÑƒÑловиÑми лицензии GNU General Public License, опубликованной фондом Ñвободного программного обеÑпечениÑ; второй верÑии, либо любой более поздней верÑии.
MediaWiki раÑпроÑтранÑетÑÑ Ð² надежде, что она будет полезной, но БЕЗ КÐКИХ-ЛИБО ГÐРÐÐТИЙ, даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ ЦЕÐÐОСТИ или ПРИГОДÐОСТИ ДЛЯ ОПРЕДЕЛЕÐÐОЙ ЦЕЛИ. См. лицензию GNU General Public License Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ подробной информации.
@@ -4128,16 +4178,16 @@ MediaWiki раÑпроÑтранÑетÑÑ Ð² надежде, что она бу
# New logging system
'logentry-delete-delete' => '$1 {{GENDER:$2|удалил|удалила}} Ñтраницу $3',
-'logentry-delete-restore' => '$1 {{GENDER:$1|воÑÑтановил|воÑÑтановила}} Ñтраницу $3',
-'logentry-delete-event' => '$1 {{GENDER:$1|изменил|изменила}} видимоÑÑ‚ÑŒ {{PLURAL:$5|$5 запиÑи|$5 запиÑей}} журнала на $3: $4',
-'logentry-delete-revision' => '$1 {{GENDER:$1|изменил|изменила}} видимоÑÑ‚ÑŒ {{PLURAL:$5|$5 верÑии|$5 верÑий}} на Ñтранице $3: $4',
-'logentry-delete-event-legacy' => '$1 {{GENDER:$1|изменил|изменила}} видимоÑÑ‚ÑŒ запиÑей журнала $3',
-'logentry-delete-revision-legacy' => '$1 {{GENDER:$1|изменил|изменила}} видимоÑÑ‚ÑŒ верÑий на Ñтранице $3',
-'logentry-suppress-delete' => '$1 {{GENDER:$1|подавил|подавила}} Ñтраницу $3',
-'logentry-suppress-event' => '$1 Ñкрытно {{GENDER:$1|изменил|изменила}} видимоÑÑ‚ÑŒ {{PLURAL:$5|$5 запиÑи|$5 запиÑей}} журнала на $3: $4',
-'logentry-suppress-revision' => '$1 Ñкрытно {{GENDER:$1|изменил|изменила}} видимоÑÑ‚ÑŒ {{PLURAL:$5|$5 верÑии|$5 верÑий}} на Ñтранице $3: $4',
-'logentry-suppress-event-legacy' => '$1 Ñкрытно {{GENDER:$1|изменил|изменила}} видимоÑÑ‚ÑŒ запиÑей журнала $3',
-'logentry-suppress-revision-legacy' => '$1 Ñкрытно {{GENDER:$1|изменил|изменила}} видимоÑÑ‚ÑŒ верÑий на Ñтранице $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|воÑÑтановил|воÑÑтановила}} Ñтраницу $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|изменил|изменила}} видимоÑÑ‚ÑŒ {{PLURAL:$5|$5 запиÑи|$5 запиÑей}} журнала на $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|изменил|изменила}} видимоÑÑ‚ÑŒ {{PLURAL:$5|$5 верÑии|$5 верÑий}} на Ñтранице $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|изменил|изменила}} видимоÑÑ‚ÑŒ запиÑей журнала $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|изменил|изменила}} видимоÑÑ‚ÑŒ верÑий на Ñтранице $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|подавил|подавила}} Ñтраницу $3',
+'logentry-suppress-event' => '$1 Ñкрытно {{GENDER:$2|изменил|изменила}} видимоÑÑ‚ÑŒ {{PLURAL:$5|$5 запиÑи|$5 запиÑей}} журнала на $3: $4',
+'logentry-suppress-revision' => '$1 Ñкрытно {{GENDER:$2|изменил|изменила}} видимоÑÑ‚ÑŒ {{PLURAL:$5|$5 верÑии|$5 верÑий}} на Ñтранице $3: $4',
+'logentry-suppress-event-legacy' => '$1 Ñкрытно {{GENDER:$2|изменил|изменила}} видимоÑÑ‚ÑŒ запиÑей журнала $3',
+'logentry-suppress-revision-legacy' => '$1 Ñкрытно {{GENDER:$2|изменил|изменила}} видимоÑÑ‚ÑŒ верÑий на Ñтранице $3',
'revdelete-content-hid' => 'Ñодержание Ñкрыто',
'revdelete-summary-hid' => 'опиÑание правки Ñкрыто',
'revdelete-uname-hid' => 'Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника Ñкрыто',
@@ -4146,17 +4196,21 @@ MediaWiki раÑпроÑтранÑетÑÑ Ð² надежде, что она бу
'revdelete-uname-unhid' => 'Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника раÑкрыто',
'revdelete-restricted' => 'Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÑÑŽÑ‚ÑÑ Ðº админиÑтраторам',
'revdelete-unrestricted' => 'Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑнÑÑ‚Ñ‹ Ð´Ð»Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтраторов',
-'logentry-move-move' => '$1 {{GENDER:$1|переименовал|переименовала}} Ñтраницу $3 в $4',
-'logentry-move-move-noredirect' => '$1 {{GENDER:$1|переименовал|переименовала}} Ñтраницу $3 в $4 без оÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ',
-'logentry-move-move_redir' => '$1 {{GENDER:$1|переименовал|переименовала}} Ñтраницу $3 в $4 поверх перенаправлениÑ',
-'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$1|переименовал|переименовала}} Ñтраницу $3 в $4 поверх Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ без оÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ',
-'logentry-patrol-patrol' => '$1 {{GENDER:$1|отпатрулировал|отпатрулировала}} верÑию $4 Ñтраницы $3',
-'logentry-patrol-patrol-auto' => '$1 автоматичеÑки {{GENDER:$1|отпатрулировал|отпатрулировала}} верÑию $4 Ñтраницы $3',
-'logentry-newusers-newusers' => 'Создана ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ $1',
-'logentry-newusers-create' => 'Создана ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ $1',
-'logentry-newusers-create2' => '$1 {{GENDER:$2|Ñоздал|Ñоздала}} учётную запиÑÑŒ Ð´Ð»Ñ $3',
-'logentry-newusers-autocreate' => 'ÐвтоматичеÑки Ñоздана ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ $1',
-'newuserlog-byemail' => 'пароль отправлен по Ñл. почте',
+'logentry-move-move' => '$1 {{GENDER:$2|переименовал|переименовала}} Ñтраницу $3 в $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|переименовал|переименовала}} Ñтраницу $3 в $4 без оÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|переименовал|переименовала}} Ñтраницу $3 в $4 поверх перенаправлениÑ',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|переименовал|переименовала}} Ñтраницу $3 в $4 поверх Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ без оÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|отпатрулировал|отпатрулировала}} верÑию $4 Ñтраницы $3',
+'logentry-patrol-patrol-auto' => '$1 автоматичеÑки {{GENDER:$2|отпатрулировал|отпатрулировала}} верÑию $4 Ñтраницы $3',
+'logentry-newusers-newusers' => '{{GENDER:$2|УчаÑтник Ñоздал|УчаÑтница Ñоздала}} учётную запиÑÑŒ $1',
+'logentry-newusers-create' => '{{GENDER:$2|УчаÑтник Ñоздал|УчаÑтница Ñоздала}} учётную запиÑÑŒ $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|Ñоздал|Ñоздала}} учётную запиÑÑŒ $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|Ñоздал|Ñоздала}} учётную запиÑÑŒ $3 и пароль был отправлен по Ñлектронной почте',
+'logentry-newusers-autocreate' => 'ÐвтоматичеÑки Ñоздана ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ {{GENDER:$2|учаÑтника|учаÑтницы}} $1',
+'logentry-rights-rights' => '$1 {{GENDER:$2|изменил|изменила}} членÑтво в группах Ð´Ð»Ñ $3 Ñ $4 на $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|изменил|изменила}} членÑтво в группах Ð´Ð»Ñ $3',
+'logentry-rights-autopromote' => '$1 был{{GENDER:$2||а}} автоматичеÑки переведен{{GENDER:$2||а}} из $4 в $5',
+'rightsnone' => '(нет)',
# Feedback
'feedback-bugornote' => 'ЕÑли вы готовы подробно опиÑать техничеÑкую проблему, пожалуйÑта, [$1 Ñообщите об ошибке].
@@ -4210,6 +4264,7 @@ MediaWiki раÑпроÑтранÑетÑÑ Ð² надежде, что она бу
'api-error-ok-but-empty' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: нет ответа от Ñервера.',
'api-error-overwrite' => 'Ðе допуÑкаетÑÑ Ð·Ð°Ð¼ÐµÐ½Ð° ÑущеÑтвующего файла.',
'api-error-stashfailed' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: Ñервер не Ñмог Ñохранить временный файл.',
+'api-error-publishfailed' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: Ñервер не Ñмог Ñохранить временный файл.',
'api-error-timeout' => 'Сервер не отвечает в течение ожидаемого времени.',
'api-error-unclassified' => 'Произошла неизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°',
'api-error-unknown-code' => 'ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°: «$1»',
@@ -4230,4 +4285,7 @@ MediaWiki раÑпроÑтранÑетÑÑ Ð² надежде, что она бу
'duration-centuries' => '$1 {{PLURAL:$1|век|века|веков}}',
'duration-millennia' => '$1 {{PLURAL:$1|Ñ‚Ñ‹ÑÑчелетие|Ñ‚Ñ‹ÑÑчелетиÑ|Ñ‚Ñ‹ÑÑчелетий}}',
+# Image rotation
+'rotate-comment' => 'Изображение повёрнуто на $1 градуÑ{{PLURAL:$1||а|ов}} по чаÑовой Ñтрелке',
+
);
diff --git a/languages/messages/MessagesRue.php b/languages/messages/MessagesRue.php
index c1151442..3b2c4f1e 100644
--- a/languages/messages/MessagesRue.php
+++ b/languages/messages/MessagesRue.php
@@ -251,6 +251,7 @@ $messages = array(
'newwindow' => '(отворить ÑÑ Ð² новім окнї)',
'cancel' => 'Зрушыти',
'moredotdotdot' => 'Детайлнїше…',
+'morenotlisted' => 'Дале не є ніч ...',
'mypage' => 'Сторінка',
'mytalk' => 'ДіÑкузіÑ',
'anontalk' => 'ДіÑÐºÑƒÐ·Ñ–Ñ Ðº тїй IP-адреÑÑ—',
@@ -262,7 +263,6 @@ $messages = array(
'qbbrowse' => 'ПереглÑдати',
'qbedit' => 'Едітовати',
'qbpageoptions' => 'Тота Ñторінка',
-'qbpageinfo' => 'КонтекÑÑ‚',
'qbmyoptions' => 'Мої Ñторінкы',
'qbspecialpages' => 'Шпеціалны Ñторінкы',
'faq' => 'ЧаÑÑ‚Ñ‹ звідованÑ',
@@ -285,6 +285,7 @@ $messages = array(
'namespaces' => 'ПроÑторы назв',
'variants' => 'Варіанты',
+'navigation-heading' => 'Ðавіґачне меню',
'errorpagetitle' => 'Хыба',
'returnto' => 'ÐÐ°Ð²ÐµÑ€Ð½ÑƒÑ‚Ñ Ð´Ð¾ Ñторінкы «$1».',
'tagline' => 'Матеріал з {{grammar:genitive|{{SITENAME}}}}',
@@ -524,10 +525,10 @@ $2',
# Login and logout pages
'logouttext' => "'''Ðынї Ñьте одголошеный(а).'''
-Можете продовжовати в анонімнім перезераню Ñ– едітації {{grammar:2sg|{{SITENAME}}}}, або ÑÑ Ð¼Ð¾Ð¶ÐµÑ‚Ðµ [[Special:UserLogin|зÑÑÑŒ приголоÑити]] Ñк тот Ñамый або Ñк іншый хоÑнователь. ДаÑкы Ñторінкы ÑÑ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ зображовати Ñк кібы Ñьте были дотеперь приголошены, покы не змажете кеш переглÑдача.",
-'welcomecreation' => '== Вітаєме ваÑ, $1! ==
-Ваше конто было вытворене.
-Ðе забудьте змінити Ñвої [[Special:Preferences|наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ñайту]].',
+Можете продовжовати в анонімнім перезераню Ñ– едітації {{grammar:2sg|{{SITENAME}}}}, або ÑÑ Ð¼Ð¾Ð¶ÐµÑ‚Ðµ <span class='plainlinks'>[$1 зÑÑÑŒ приголоÑити]</span> Ñк тот Ñамый або Ñк іншый хоÑнователь. ДаÑкы Ñторінкы ÑÑ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ зображовати Ñк кібы Ñьте были дотеперь приголошены, покы не змажете кеш переглÑдача.",
+'welcomeuser' => 'Вітайте, $1!',
+'welcomecreation-msg' => 'Ваше конто было вытворене.
+Ðе забудьте змінити Ñвої [[Special:Preferences|наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ {{grammar:2sg|{{SITENAME}}}}]].',
'yourname' => 'Ð†Ð¼Ñ Ñ…Ð¾ÑнователÑ:',
'yourpassword' => 'ГеÑло:',
'yourpasswordagain' => 'ПовторÑйте геÑло:',
@@ -550,7 +551,7 @@ $2',
'gotaccount' => "Уж Ñьте реґіÑтрованы? '''$1'''.",
'gotaccountlink' => 'ПриголошінÑ',
'userlogin-resetlink' => 'Забыли Ñьте вашы даны на приголошінÑ?',
-'createaccountmail' => 'електроничнов поштов',
+'createaccountmail' => 'СхоÑновати дочаÑне геÑло та загнати го на ниже напиÑану адреÑу',
'createaccountreason' => 'Причіна:',
'badretype' => 'Вами напиÑаны геÑла не ÑуглаÑÑÑ‚ÑŒ.',
'userexists' => 'Уведжене Ñ–Ð¼Ñ Ñ…Ð¾ÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑÑ ÑƒÐ¶ хоÑнує.
@@ -621,6 +622,7 @@ $2',
# Email sending
'php-mail-error-unknown' => 'Ðезнама хыба у PHP mail() функції',
'user-mail-no-addy' => 'Проба одоÑлати електронічну пошту без імейловой адреÑÑ‹.',
+'user-mail-no-body' => 'Спроба поÑлати порожнїй або барз куртый імейл.',
# Change password dialog
'resetpass' => 'Змінити геÑло',
@@ -683,6 +685,7 @@ $2
'changeemail-oldemail' => 'Ð¢ÐµÐ¿ÐµÑ€Ñ—ÑˆÐ½Ñ Ñ–Ð¼ÐµÐ¹Ð»Ð¾Ð²Ð° адреÑа:',
'changeemail-newemail' => 'Ðова імейлова адреÑа:',
'changeemail-none' => '(жадне)',
+'changeemail-password' => 'Ваше геÑло на портал {{SITENAME}}:',
'changeemail-submit' => 'Змінити імейл',
'changeemail-cancel' => 'Сторно',
@@ -851,7 +854,6 @@ $2
'template-protected' => '(вÑокочена)',
'template-semiprotected' => '(чаÑтково вÑокочене)',
'hiddencategories' => 'Тота Ñторінка належыть до $1 {{PLURAL:$1|Ñхованa катеґоріÑ|Ñхованы катеґорії|Ñхованых катеґорій}}:',
-'nocreatetitle' => 'Ð¡Ñ‚Ð²Ð¾Ñ€Ñ—Ð½Ñ Ñторінок обмеджено',
'nocreatetext' => 'Ðа {{grammar:6sg|{{SITENAME}}}} Ñ” можливоÑÑ‚ÑŒ Ñтворїна новых Ñторінок обмеджена.
Можете ÑÑ Ð²ÐµÑ€Ð½ÑƒÑ‚Ð¸ Ñ– едітовати уж екзіÑтуючу Ñторінку, або [[Special:UserLogin|ÑÑ Ð¿Ñ€Ð¸Ð³Ð¾Ð»Ð¾Ñити ці ÑÑ Ñ€ÐµÒ‘Ñ–Ñтровати]].',
'nocreate-loggedin' => 'Ðе маєте права Ñтворёвати новы Ñторінкы.',
@@ -874,6 +876,15 @@ $2
'edit-no-change' => 'Ваша ÐµÐ´Ñ–Ñ‚Ð°Ñ†Ñ–Ñ Ð±Ñ‹Ð»Ð° іґнорована, бо ÑÑ Ð½Ðµ зробила жадна зміна текÑту.',
'edit-already-exists' => 'Ðе вдало ÑÑ Ñтворити нову Ñторінку, бо она уж Ñ–Ñнує.',
'defaultmessagetext' => 'ПреднаÑтавленый текÑÑ‚ повідомлїнÑ',
+'content-failed-to-parse' => 'Ðе вдало ÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·Ð¾Ð²Ð°Ñ‚Ð¸ $2 Ñк тіп $1: $3',
+'invalid-content-data' => 'ÐеприпуÑтны даны',
+'content-not-allowed-here' => 'ОбÑÑг «$1» недозволеный на Ñторінцї [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'вікітекÑÑ‚',
+'content-model-text' => 'чіÑтый текÑÑ‚',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Увага: Тота Ñторінка обÑÑгує дуже много ÐºÐ»Ð¸ÐºÐ°Ð½Ñ Ð²Ñ‹ÐºÐ¾Ð½Ð¾Ð²Ð¾ Ñ‚Ñжкых функцій парÑера.
@@ -1237,9 +1248,9 @@ $1",
'prefs-emailconfirm-label' => 'ÐŸÐ¾Ñ‚Ð²ÐµÑ€Ð´Ð¶Ñ–Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ñ–Ñ‡Ð½Ð¾Ð¹ пошты:',
'prefs-textboxsize' => 'Розмір окна едітованÑ',
'youremail' => 'ÐдреÑа електронічной пошты:',
-'username' => 'Мено хоÑнователÑ:',
-'uid' => 'Ідентіфікатор хоÑнователÑ:',
-'prefs-memberingroups' => 'Член {{PLURAL:$1|ґрупы|ґруп}}:',
+'username' => '{{GENDER:$1|Ð†Ð¼Ñ Ñ…Ð¾ÑнователÑ}}:',
+'uid' => 'Ідентіфікатор {{GENDER:$1|хоÑнователÑ}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Член}} {{PLURAL:$1|ґрупы|ґруп}}:',
'prefs-registration' => 'Ð§Ð°Ñ Ñ€ÐµÒ‘Ñ–Ñтрації:',
'yourrealname' => 'Правдиве імÑ:',
'yourlanguage' => 'Язык:',
@@ -1389,12 +1400,13 @@ $1",
'right-sendemail' => 'ПоÑÑ‹Ð»Ð°Ð½Ñ Ð¿Ð¾ÑˆÑ‚Ñ‹ іншым хоÑнователÑм',
'right-passwordreset' => 'ÐŸÐµÑ€ÐµÐ·ÐµÑ€Ð°Ð½Ñ Ñ–Ð¼ÐµÐ¹Ð»Ñ–Ð² про зміну геÑла',
+# Special:Log/newusers
+'newuserlogpage' => 'Лоґ вытварÑнь хоÑнователїв',
+'newuserlogpagetext' => 'Тото Ñ” ÑпиÑок ново реґіÑтрованых хоÑнователїв.',
+
# User rights log
'rightslog' => 'Лоґ хоÑновательÑкых прав',
'rightslogtext' => 'Тото Ñ” протокол зміны прав хоÑнователїв',
-'rightslogentry' => 'змінив членÑтво в ґрупах про хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ $1 з $2 на $3',
-'rightslogentry-autopromote' => 'быв автоматічно повышеный з $2 на $3',
-'rightsnone' => '(жадне)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'прочітати тоту Ñторінку',
@@ -1614,6 +1626,7 @@ $1',
'backend-fail-notsame' => 'Ðеідентичный файл $1 вже Ñ–Ñнує.',
'backend-fail-invalidpath' => '$1 Ñ” неправилна Ñтепка к міÑцю уложінÑ.',
'backend-fail-delete' => 'Ðе вдало ÑÑ Ð²Ñ‹Ð»ÑƒÑ‡Ñ–Ñ‚Ð¸ файл $1.',
+'backend-fail-describe' => 'Ðе вдало ÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ метаданы файлу «$1».',
'backend-fail-alreadyexists' => 'Файл $1 вже Ñ–Ñнує.',
'backend-fail-store' => 'Ðе вдало ÑÑ ÑƒÐ»Ð¾Ð¶Ñ‹Ñ‚Ð¸ файл $1 в $2.',
'backend-fail-copy' => 'Ðе вдало ÑÑ Ñкопіровати файл $1 до $2.',
@@ -1998,7 +2011,7 @@ $1',
'linksearch-ok' => 'ГлÑдати',
'linksearch-text' => 'Може хоÑновати заÑтупны Ñімболы, наприклад „*.wikipedia.org“.<br />
Повиннов Ñ” передовшыткым домена найвыÑшой уровни, напр. „*.org“.<br />
-Підпорованы протоколы: <code>$1</code>',
+Підпорованы протоколы: <code>$1</code> (кідь не є шпеціфікованый та http://).',
'linksearch-line' => '$2 одказує на $1',
'linksearch-error' => 'ЗаÑтупны Ñімболы може хоÑновати лем на початку доменового мена.',
@@ -2017,10 +2030,6 @@ $1',
'activeusers-hidesysops' => 'Сховати адмініÑтраторів',
'activeusers-noresult' => 'Ðенайдженый жаден хоÑнователь.',
-# Special:Log/newusers
-'newuserlogpage' => 'Лоґ вытварÑнь хоÑнователїв',
-'newuserlogpagetext' => 'Тото Ñ” ÑпиÑок ново реґіÑтрованых хоÑнователїв.',
-
# Special:ListGroupRights
'listgrouprights' => 'Права ґруп хоÑнователїв',
'listgrouprights-summary' => 'Тото Ñ” ÑпиÑок ґруп хоÑнователїв дефінованых на тій вікіi Ñ–&nbsp;Ñ—Ñ… приÑтуповых прав.
@@ -2116,42 +2125,48 @@ $1',
'enotif_mailer' => 'ЗаÑылач нотіфікацій {{grammar:2sg|{{SITENAME}}}}',
'enotif_reset' => 'Означіти вшытко Ñк навщівене',
-'enotif_newpagetext' => 'Тото Ñ” нова Ñторінка.',
'enotif_impersonal_salutation' => 'ХоÑнователь {{grammar:genitive|{{SITENAME}}}}',
-'changed' => 'змінена',
-'created' => 'Ñтворена',
-'enotif_subject' => '$PAGEEDITOR змінив Ñторінку $PAGETITLE на {{grammar:6sg|{{SITENAME}}}}.',
+'enotif_subject_deleted' => '$2 {{gender:$2|змазав|змазала}} Ñторінку $1 на {{grammar:6sg|{{SITENAME}}}}',
+'enotif_subject_created' => '$2 {{gender:$2|Ñтворив|Ñтворила}} Ñторінку $1 на {{grammar:6sg|{{SITENAME}}}}',
+'enotif_subject_moved' => '$2 {{gender:$2|переменовав|переменовала}} Ñторінку $1 на {{grammar:6sg|{{SITENAME}}}}',
+'enotif_subject_restored' => '$2 {{gender:$2|обновив|обновила}} Ñторінку $1 на {{grammar:6sg|{{SITENAME}}}}',
+'enotif_subject_changed' => '$2 {{gender:$2|змінив|змінила}} Ñторінку $1 на {{grammar:6sg|{{SITENAME}}}}',
+'enotif_body_intro_deleted' => 'Ð’ $PAGEEDITDATE {{gender:$2|змазав|змазала}} $2 на {{grammar:6sg|{{SITENAME}}}} Ñторінку $1,поÑмотьте $3 .',
+'enotif_body_intro_created' => 'Ð’ $PAGEEDITDATE {{gender:$2|Ñтворив|Ñтворила}} $2 на {{grammar:6sg|{{SITENAME}}}} Ñторінку $1, поÑмотьте актуалну верзію на $3 .',
+'enotif_body_intro_moved' => 'Ð’ $PAGEEDITDATE {{gender:$2|переменовав|переменовала}} $2 на {{grammar:6sg|{{SITENAME}}}} Ñторінку $1, поÑмотьте актуалну верзію на $3 .',
+'enotif_body_intro_restored' => 'Ð’ $PAGEEDITDATE {{gender:$2|обновив|обновила}} $2 на {{grammar:6sg|{{SITENAME}}}} Ñторінку $1, поÑмотьте актуалну верзію на $3 .',
+'enotif_body_intro_changed' => 'Ð’ $PAGEEDITDATE {{gender:$2|змінив|змінила}} $2 на {{grammar:6sg|{{SITENAME}}}} Ñторінку $1, поÑмотьте актуалну верзію на $3 .',
'enotif_lastvisited' => 'Видьте $1 про ÑпиÑок вшыткых змін од минулой навщівы.',
'enotif_lastdiff' => 'Тоту зміну видьте на $1',
'enotif_anon_editor' => 'анонімный хоÑнователь $1',
-'enotif_body' => 'Дорогый хоÑнователю $WATCHINGUSERNAME,
+'enotif_body' => 'ЧеÑтованый хоÑнователю $WATCHINGUSERNAME,
-У $PAGEEDITDATE была хоÑнователём $PAGEEDITOR $CHANGEDORCREATED Ñторінка $PAGETITLE, Ñмотьте актуалну верзію на $PAGETITLE_URL .
+$PAGEINTRO $NEWPAGE
-$NEWPAGE
-Куртый Ð¾Ð¿Ð¸Ñ Ð·Ð¼Ñ–Ð½: $PAGESUMMARY $PAGEMINOREDIT
+Ð—Ð³Ð¾Ñ€Ð½ÑƒÑ‚Ñ ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ: $PAGESUMMARY $PAGEMINOREDIT
-ХоÑнователÑ, котрый учінив зміну, можете контактовати:
+ХоÑнователÑ, котрый зміну учінив, можете контактовати:
імейлом: $PAGEEDITOR_EMAIL
на вікі: $PAGEEDITOR_WIKI
-Покы Ñторінку не навщівите, не будуть вам поÑыланы далшы Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ñ Ð¾ змінах той Ñторінкы.
-Припадно Ñобі можете вынуловати флачы у Ñвоїм ÑпиÑку Ñлїдованых Ñторінок.
+Покы Ñторінку не навщівите, не будуть вам заганÑны далшы Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»Ñ—Ð½Ñ Ð¾ змінах той Ñторінкы. Тыж Ñобі можете вынуловати признакы у Ñвоїм ÑпиÑку Ñлїдованых Ñторінок.
- Поздравує ваш поÑылач повідомлїнь {{grammar:2sg|{{SITENAME}}}}
+ Поздравує Ð²Ð°Ñ Ð²Ð°Ñˆ поÑылач Ð³Ð¾Ð»Ð¾ÑˆÑ–Ð½Ñ {{grammar:2sg|{{SITENAME}}}}
--
-Змінити наÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ñ–Ð¼ÐµÐ¹Ð»Ð¾Ð²Ñ‹Ñ… повідомлїнь можете на
+Змінити Ð½Ð°ÑˆÑ‚ÐµÐ»Ñ‘Ð²Ð°Ð½Ñ Ñ–Ð¼ÐµÐ¹Ð»Ð¾Ð²Ñ‹Ñ… повідомлїнь можете на
{{canonicalurl:{{#special:Preferences}}}}
-ÐаÑÑ‚Ð°Ð²Ð»Ñ—Ð½Ñ Ñлїдованых Ñторінок можете змінити на
+ÐÐ°ÑˆÑ‚ÐµÐ»Ñ‘Ð²Ð°Ð½Ñ Ñлїдованых Ñторінок можете змінити на
{{canonicalurl:Special:Watchlist/edit}}
-Сторінку можете із Ñвоїх Ñлїдованых вылучіти на
+Сторінку можете зо Ñвоїх Ñлїдованых вышмарити на
$UNWATCHURL
Порада і контакт:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'Ñтворена',
+'changed' => 'змінена',
# Delete
'deletepage' => 'Змазати Ñторінку',
@@ -2297,7 +2312,8 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|Обновлена $1 верзіÑ|Обновлены $1 верзії|Обновленых $1 верзій}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Обновлена єдна верзіÑ|Обновлены $1 верзії|Обновленых $1 верзій}} Ñ– $2 {{PLURAL:$2|файл|файлы|файлів}}.',
'undeletedfiles' => '{{PLURAL:$1|обновленый $1 файл|обновлены $1 файлы|обновленых $1 файлів}}',
-'cannotundelete' => 'ÐžÐ±Ð½Ð¾Ð²Ð»Ñ—Ð½Ñ ÑÑ Ð½Ðµ вдало; правдоподобно дахто другый обновив Ñторінку Ñкоре Ñк вы.',
+'cannotundelete' => 'ÐžÐ±Ð½Ð¾Ð²Ð»Ñ—Ð½Ñ ÑÑ Ð½Ðµ вдало:
+$1',
'undeletedpage' => "'''$1 была обновлена'''
Ð—Ð°Ð¿Ð¸Ñ Ð¾ поÑлїднїх мазанÑÑ… Ñ– обновлїнÑÑ… найдете в [[Special:Log/delete|книзї змазаных Ñторінок]].",
@@ -2328,7 +2344,7 @@ $1',
'blanknamespace' => '(ОÑновный)',
# Contributions
-'contributions' => 'ПриÑпівок хоÑнователÑ',
+'contributions' => 'ПриÑпівкы {{GENDER:$1|хоÑнователÑ|хоÑнователькы}}',
'contributions-title' => 'ПриÑпівок хоÑÐ½Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ $1',
'mycontris' => 'ПриÑпівкы',
'contribsub2' => 'ПриÑпівок $1 ($2)',
@@ -2598,6 +2614,7 @@ $1',
'immobile-target-namespace-iw' => 'МіджіÑзыковый одказ не Ñ” валідный ціль про Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð¾Ð²Ð°Ð½Ñ Ñторінкы.',
'immobile-source-page' => 'Тота Ñторінка ÑÑ Ð½Ðµ даÑÑ‚ÑŒ переменовати.',
'immobile-target-page' => 'Сторінка ÑÑ Ð½Ðµ даÑÑ‚ÑŒ переменовати на дану назву.',
+'bad-target-model' => 'Желаный цїль хоÑнує другый модел обÑÑгу. Ðе годен перевеÑти $1 на $2.',
'imagenocrossnamespace' => 'Ðе даÑÑ‚ÑŒ ÑÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð¾Ð²Ð°Ñ‚Ð¸ файл мімо проÑтор назв файлів',
'nonfile-cannot-move-to-file' => 'До проÑтору назв {{ns:file}} ÑÑ Ð½Ðµ дають переменовати Ñторінкы неналежачі ку файлу',
'imagetypemismatch' => 'Ðове роÑÑˆÑ‹Ñ€Ñ—Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ не одповідать ёго тіпу',
@@ -2706,6 +2723,7 @@ $1',
'import-error-interwiki' => 'Сторінка „$1“ ÑÑ Ð½Ðµ імпортує, бо єй назва Ñ” зарезервована про вонкашнї лінкы (interwiki).',
'import-error-special' => 'Сторінка „$1“ ÑÑ Ð½Ðµ імпортує, бо належыть до шпеціалного проÑтору назв, до котрого Ñторінкы не належать.',
'import-error-invalid' => 'Сторінка „$1“ ÑÑ Ð½Ðµ імпортує, бо єй назва неприпуÑтна.',
+'import-error-unserialize' => 'Ðе вдало ÑÑ Ð´ÐµÑеріалізовати ревізію $2 Ñторінкы „$1“. Ð ÐµÐ²Ñ–Ð·Ñ–Ñ Ñ…Ð¾Ñ‚Ñ—Ð»Ð° хоÑновати модел обÑÑгу $3 Ñеріалоізованый Ñк $4.',
'import-options-wrong' => '{{PLURAL:$2|Ðеправильна опціÑ|Ðеправильны опції}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Вказана некоректна назва корїнёвой Ñторінкы',
'import-rootpage-nosubpage' => 'Ð’ проÑторї назв вказаной корїнёвой Ñторінкы «$1» не дозволены підÑторінкы',
@@ -2720,7 +2738,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'ТеÑÑ‚Ð¾Ð²Ð°Ð½Ñ JavaScript',
-'javascripttest-disabled' => 'Тота Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð½Ðµ дозволена на тій вікі.',
'javascripttest-title' => 'Біжать теÑÑ‚ в $1',
'javascripttest-pagetext-noframework' => 'Тота Ñторінка Ñ” резервована про теÑÑ‚Ð¾Ð²Ð°Ð½Ñ JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Ðезнаный фреймворк теÑÑ‚Ð¾Ð²Ð°Ð½Ñ â€ž$1“.',
@@ -2834,6 +2851,7 @@ $1',
'pageinfo-default-sort' => 'ОÑновный ключ ÑортованÑ',
'pageinfo-length' => 'Довжына Ñторінкы (в байтах)',
'pageinfo-article-id' => 'ID Ñторінкы',
+'pageinfo-language' => 'Язык обÑÑгу Ñторінкы',
'pageinfo-robot-policy' => 'ÐÐ°ÑˆÑ‚ÐµÐ»Ñ‘Ð²Ð°Ð½Ñ Ð¿Ñ€Ð¾ выглÑдавачі ÑÑ–Ñтемы',
'pageinfo-robot-index' => 'ІндекÑує ÑÑ',
'pageinfo-robot-noindex' => 'Ðе індекÑує ÑÑ',
@@ -2853,6 +2871,14 @@ $1',
'pageinfo-magic-words' => '{{PLURAL:$1|Маґічне Ñлово|Маґічны Ñлова}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Скрыта катеґоріÑ|Скрыты катеґорії}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|ХоÑнована шаблона|ХоÑнованы шаблоны}} ($1)',
+'pageinfo-toolboxlink' => 'Інформації о Ñторінцї',
+'pageinfo-redirectsto' => 'ÐапрÑмлює на',
+'pageinfo-redirectsto-info' => 'інформаціÑ',
+'pageinfo-contentpage' => 'Рахує ÑÑ Ñк ÑтатÑ',
+'pageinfo-contentpage-yes' => 'Гей',
+'pageinfo-protect-cascading' => 'Одты ÑÑ Ð¿Ð¾Ñ‡Ñ–Ð½Ð°Ñ‚ÑŒ каÑкадна охорона',
+'pageinfo-protect-cascading-yes' => 'Гей',
+'pageinfo-protect-cascading-from' => 'КаÑкадна охорона ÑÑ Ð¿Ð¾Ñ‡Ñ–Ð½Ð°Ñ‚ÑŒ гев',
# Patrolling
'markaspatrolleddiff' => 'Означіти Ñк перевірене',
@@ -2864,6 +2890,8 @@ $1',
'markedaspatrollederror' => 'Ðе даÑÑ‚ÑŒ ÑÑ Ð¾Ð·Ð½Ð°Ñ‡Ñ–Ñ‚Ð¸ Ñк перевірене',
'markedaspatrollederrortext' => 'МуÑите зволити ревізію, котра має быти означена Ñк перевірена.',
'markedaspatrollederror-noautopatrol' => 'Ðе маєте дозволене означовати влаÑтны ÐµÐ´Ñ–Ñ‚Ð¾Ð²Ð°Ð½Ñ Ñк перевірены.',
+'markedaspatrollednotify' => 'ГевÑÑ Ð·Ð¼Ñ–Ð½Ð° Ñторінкы $1 была означена Ñк одпратролована.',
+'markedaspatrollederrornotify' => 'Ðе вдало ÑÑ Ð¿Ð¾Ñтавити позначку про патролёванÑ',
# Patrol log
'patrol-log-page' => 'Книга перевіреных едітовань',
@@ -2898,6 +2926,7 @@ $1',
'file-nohires' => 'Ðе Ñ” Ð²ÐµÑ€Ð·Ñ–Ñ Ð· векшым розлишінём.',
'svg-long-desc' => 'SVG-файл, номінално $1 × $2 пікÑелів, розмір файлу: $3',
'svg-long-desc-animated' => 'Ðнімованый SVG-файл, номінално $1 × $2 пікÑелів, розмір файлу: $3',
+'svg-long-error' => 'Ðеправильный файл SVG: $1',
'show-big-image' => 'Повне розлишінÑ',
'show-big-image-preview' => 'Розмір того наглÑду: $1.',
'show-big-image-other' => '{{PLURAL:$2|Інше|іншы}} розлишінÑ: $1.',
@@ -2928,6 +2957,7 @@ $1',
'hours' => '{{PLURAL:$1|$1 година|$1 годины|$1 годин}}',
'days' => '{{PLURAL:$1|$1 день|$1 днї|$1 днїв}}',
'ago' => '$1 тому',
+'just-now' => 'акурат теперь',
# Bad image list
'bad_image_list' => 'Формат має быти наÑтупным:
@@ -3420,6 +3450,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[Ð’ÐºÐ»Ð°Ð´Ð°Ð½Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½ міджі вікі Ñ” выпнуте]',
'scarytranscludefailed' => '[Ðе вдало ÑÑ Ð½Ð°Ñ‚Ñгнути шаблону про $1]',
+'scarytranscludefailed-httpstatus' => '[Ðе вдало ÑÑ Ð½Ð°Ð»Ð°Ð´Ð¾Ð²Ð°Ñ‚Ð¸ шаблону про $1: HTTP $2]',
'scarytranscludetoolong' => '[URL дуже довгый]',
# Delete conflict
@@ -3529,6 +3560,7 @@ $5
'version-license' => 'ЛіценціÑ',
'version-poweredby-credits' => "Тота вікі біжыть на '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
'version-poweredby-others' => 'іншы',
+'version-credits-summary' => 'Слїдуючім людÑм бы Ñьме радо подÑковали за Ñ—Ñ… приÑпівкы [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki Ñ” Ñлободный Ñофтвер; можете го шырити або управлÑти в згодї з уÑловіÑми GNU General Public License, выдаваной Free Software Foundation; будь Ð²ÐµÑ€Ð·Ñ–Ñ 2 той ліценції або (Ñк уважыте) будьÑка пізнїша верзіÑ.
MediaWiki Ñ” діÑтрібуована в надїї, же буде хоÑновна, але БЕЗ БУДЬЯКОЙ ЗÐРУКЫ; не давають ÑÑ Ð°Ð½Ð¸ зарукы ПРОДÐЙÐОСТИ або Ð’ÐЛУШÐОСТИ ПРО СТÐÐОВЛЕÐЫЙ ЦІЛЬ. Детайлы ÑÑ Ð´Ð¾Ñ‡Ñ–Ñ‚Ð°Ñ‚Ðµ в текÑÑ‚Ñ— GNU General Public License.
@@ -3671,7 +3703,10 @@ MediaWiki Ñ” діÑтрібуована в надїї, же буде хоÑноÐ
'logentry-newusers-create' => 'Створене было хоÑновательÑке конто $1',
'logentry-newusers-create2' => '$1 Ñтворив хоÑновательÑке конто $3',
'logentry-newusers-autocreate' => 'Ðвтоматічно было Ñтворене конто $1',
-'newuserlog-byemail' => 'гело поÑлане електронічнов поштов',
+'logentry-rights-rights' => '$1 {{GENDER:$1|змінив|змінила}} членÑтво в ґрупах про $3 із $4 на $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|змінив|змінила}} членÑтво в ґрупах про $3',
+'logentry-rights-autopromote' => '$1 было автоматічно переведено із $4 в $5',
+'rightsnone' => '(жадне)',
# Feedback
'feedback-bugornote' => 'Кідь Ñьте прирыхтованый подробно опиÑати технічный проблем, можете [$1 наголоÑити хыбу].
diff --git a/languages/messages/MessagesRup.php b/languages/messages/MessagesRup.php
index 2ce77f98..2d43144b 100644
--- a/languages/messages/MessagesRup.php
+++ b/languages/messages/MessagesRup.php
@@ -131,9 +131,6 @@ $messages = array(
'viewsource' => 'Videts-u fãntãnã',
# Login and logout pages
-'welcomecreation' => '== Ghine vinish, $1 ==
-
-Isape a vostrã ira adratã. Nu agãrshits s-le alãxits alidzerle-a vostre ti {{SITENAME}}.',
'yourname' => 'Numa di ufilizitor:',
'yourpassword' => 'Cljao:',
'yourpasswordagain' => 'Bãgats-u cljao iara:',
diff --git a/languages/messages/MessagesSa.php b/languages/messages/MessagesSa.php
index 818cea89..18dda21d 100644
--- a/languages/messages/MessagesSa.php
+++ b/languages/messages/MessagesSa.php
@@ -178,7 +178,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¥€à¤¸à¤šà¤¤à¥‡__', '__FORCETOC__' ),
'toc' => array( '0', '__अनà¥à¤•à¥à¤°à¤®à¤£à¥€__', '__TOC__' ),
'noeditsection' => array( '0', '__नैवसमà¥à¤ªà¤¾à¤¦à¤¨à¤µà¤¿à¤­à¤¾à¤—__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__नैवमà¥à¤–à¥à¤¯à¤¶à¤¿à¤°à¥à¤·à¤•__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'अदà¥à¤¯à¤®à¤¾à¤¸à¥‡', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonthname' => array( '1', 'अदà¥à¤¯à¤®à¤¾à¤¸à¥‡à¤¨à¤¾à¤®', 'CURRENTMONTHNAME' ),
'currentmonthnamegen' => array( '1', 'अदà¥à¤¯à¤®à¤¾à¤¸à¥‡à¤¨à¤¾à¤®à¤¸à¤¾à¤§à¤¾à¤°à¤£', 'CURRENTMONTHNAMEGEN' ),
@@ -424,7 +423,6 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'qbbrowse' => 'बà¥à¤°à¤¾à¤‰à¤¸à¥ इतà¥à¤¯à¥‡à¤¤à¤¤à¥ करोतà¥à¥¤',
'qbedit' => 'समà¥à¤ªà¤¾à¤¦à¥à¤¯à¤¤à¤¾à¤®à¥',
'qbpageoptions' => 'इदं पृषà¥à¤ à¤®à¥',
-'qbpageinfo' => 'पà¥à¤°à¤¸à¤‚गः',
'qbmyoptions' => 'मम पृषà¥à¤ à¤¾à¤¨à¤¿',
'qbspecialpages' => 'विशेषपृषà¥à¤ à¤¾à¤¨à¤¿',
'faq' => 'बहà¥à¤§à¤¾ पृचà¥à¤›à¥à¤¯à¤®à¤¾à¤¨à¤¾à¤ƒ पà¥à¤°à¤¶à¥à¤¨à¤¾à¤ƒ',
@@ -447,6 +445,7 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
'namespaces' => 'नामाकाशानि',
'variants' => 'भिनà¥à¤¨à¤°à¥‚पाणि',
+'navigation-heading' => 'मारà¥à¤—णसूचिः',
'errorpagetitle' => 'दोषः',
'returnto' => '$1 इतà¥à¤¯à¥‡à¤¤à¤¦à¥ पà¥à¤°à¤¤à¤¿ निवरà¥à¤¤à¤¤à¤¾à¤®à¥à¥¤',
'tagline' => '{{SITENAME}} इतà¥à¤¯à¤¸à¥à¤®à¤¾à¤¤à¥',
@@ -679,11 +678,11 @@ $2',
# Login and logout pages
'logouttext' => "'''भवानॠअधà¥à¤¨à¤¾ बहिरागतः ।'''
-भवानॠ{{SITENAME}} इतà¥à¤¯à¥‡à¤¤à¤¤à¥ अनामतया पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥à¤‚ शकà¥à¤¨à¥‹à¤¤à¤¿, अथवा भवानॠतेनैव पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒà¤¨à¤¾à¤®à¥à¤¨à¤¾, भिनà¥à¤¨à¤ªà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒà¤¨à¤¾à¤®à¥à¤¨à¤¾ वा [[Special:UserLogin|पà¥à¤¨à¤ƒ पà¥à¤°à¤µà¥‡à¤·à¥à¤Ÿà¥à¤‚ शकà¥à¤¨à¥‹à¤¤à¤¿]]।
+भवानॠ{{SITENAME}} इतà¥à¤¯à¥‡à¤¤à¤¤à¥ अनामतया पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥à¤‚ शकà¥à¤¨à¥‹à¤¤à¤¿, अथवा भवानॠतेनैव पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒà¤¨à¤¾à¤®à¥à¤¨à¤¾, भिनà¥à¤¨à¤ªà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒà¤¨à¤¾à¤®à¥à¤¨à¤¾ वा <span class='plainlinks'>[$1 पà¥à¤¨à¤ƒ पà¥à¤°à¤µà¥‡à¤·à¥à¤Ÿà¥à¤‚ शकà¥à¤¨à¥‹à¤¤à¤¿]</span>।
इदानीमपि कानिचन पृषà¥à¤ à¤¾à¤¨à¤¿ पूरà¥à¤µà¤µà¤¦à¥‡à¤µ दृशà¥à¤¯à¥‡à¤°à¤¨à¥ । असà¥à¤¯ वारणाय विचरकसà¥à¤¯ सà¥à¤®à¥ƒà¤¤à¤¿à¤¸à¤žà¥à¤šà¤¯à¤ƒ रिकà¥à¤¤à¥€à¤•à¥à¤°à¤¿à¤¯à¤¤à¤¾à¤®à¥ ।",
-'welcomecreation' => '==सà¥à¤µà¤¾à¤—तमà¥â€Œ, $1!==
-भवता सदसà¥à¤¯à¤¤à¤¾ पà¥à¤°à¤¾à¤ªà¥à¤¤à¤¾ असà¥à¤¤à¤¿à¥¤
-भवतः [[Special:Preferences|{{SITENAME}} इषà¥à¤Ÿà¤¤à¤®à¤¾à¤¨à¤¿]] इतà¥à¤¯à¤¸à¥à¤¯ परिवरà¥à¤¤à¤¨à¤‚ न विसà¥à¤®à¤°à¥à¤¯à¤¤à¤¾à¤®à¥à¥¤',
+'welcomeuser' => 'सà¥à¤µà¤¾à¤—तं, हे $1!',
+'welcomecreation-msg' => 'भवतः लेखा रचिताऽसà¥à¤¤à¤¿à¥¤
+सà¥à¤µà¤•à¥€à¤¯à¤¾à¤¨à¤¾à¤‚ [[Special:Preferences|{{SITENAME}} इषà¥à¤Ÿà¤¤à¤®à¤¾à¤¨à¤¾à¤‚]]. निगदनं मा विसà¥à¤®à¤°à¥à¤¯à¤¤à¤¾à¤®à¥à¥¤',
'yourname' => 'योजकनामनà¥:',
'yourpassword' => 'कूटशबà¥à¤¦à¤ƒ',
'yourpasswordagain' => 'कूटशबà¥à¤¦à¤ƒ पà¥à¤¨à¤ƒ लिखà¥à¤¯à¤¤à¤¾à¤®à¥ ।',
@@ -787,6 +786,7 @@ You may ignore this message, if this account was created in error.',
# Email sending
'php-mail-error-unknown' => 'पीà¤à¤šà¥à¤ªà¥€ इतà¥à¤¯à¥‡à¤¤à¤¸à¥à¤¯ mail() फलने अजà¥à¤žà¤¾à¤¤à¤¾ काऽपि तà¥à¤°à¥à¤Ÿà¤¿à¤°à¥à¤œà¤¾à¤¤à¤¾à¥¤',
'user-mail-no-addy' => 'ईपतà¥à¤°à¤¸à¤™à¥à¤•à¥‡à¤¤à¤‚ विना ईपतà¥à¤°à¤ªà¥à¤°à¥‡à¤·à¤£à¤¸à¥à¤¯ पà¥à¤°à¤¯à¤¾à¤¸à¤ƒ कृतः ।',
+'user-mail-no-body' => 'भवता खलॠविदà¥à¤¯à¥à¤¤à¥à¤ªà¤¤à¥à¤°à¤‚ रिकà¥à¤¤à¤¤à¤¯à¤¾ अथवा अतिलघà¥à¤°à¥‚पेण पà¥à¤°à¥‡à¤·à¤¿à¤¤à¥à¤‚ चेषà¥à¤Ÿà¤¿à¤¤à¤®à¥à¥¤',
# Change password dialog
'resetpass' => 'कूटशबà¥à¤¦à¤ƒ परिवरà¥à¤¤à¥à¤¯à¤¤à¤¾à¤®à¥',
@@ -842,6 +842,7 @@ $2
'changeemail-oldemail' => 'पà¥à¤°à¤šà¤²à¤¿à¤¤à¤ƒ विदà¥à¤¯à¥à¤¨à¥à¤®à¤¾à¤¨à¤ªà¤¤à¥à¤°à¤¸à¤™à¥à¤•à¥‡à¤¤à¤ƒ ।',
'changeemail-newemail' => 'नूतनः विदà¥à¤¯à¥à¤¨à¥à¤®à¤¾à¤¨à¤¸à¤™à¥à¤•à¥‡à¤¤à¤ƒ ।',
'changeemail-none' => 'असतà¥',
+'changeemail-password' => 'भवतः {{SITENAME}} कूटशबà¥à¤¦à¤ƒ:',
'changeemail-submit' => 'विदà¥à¤¯à¥à¤¨à¥à¤®à¤¾à¤¨à¤ªà¤¤à¥à¤°à¤¸à¤™à¥à¤•à¥‡à¤¤à¤‚ परिवरà¥à¤¤à¤¯à¤¤à¥ ।',
'changeemail-cancel' => 'निवरà¥à¤¤à¤¯à¤¤à¥‡',
@@ -1014,7 +1015,6 @@ $2
'template-protected' => '(संरकà¥à¤·à¤¿à¤¤à¤®à¥)',
'template-semiprotected' => '(अरà¥à¤§à¤¸à¤‚रकà¥à¤·à¤¿à¤¤à¤®à¥)',
'hiddencategories' => 'इदं पृषà¥à¤ à¤‚ {{PLURAL:$1|1 निगूढे वरà¥à¤—े |$1 निगूढेषॠवरà¥à¤—ेषà¥}} अनà¥à¤¯à¤¤à¤®à¤‚ विदà¥à¤¯à¤¤à¥‡ :',
-'nocreatetitle' => 'पà¥à¤Ÿà¤¨à¤¿à¤°à¥à¤®à¤¾à¤£à¤‚ नियतमॠ।',
'nocreatetext' => '{{SITENAME}} नूतनपà¥à¤Ÿà¤¨à¤¿à¤°à¥à¤®à¤¾à¤£à¤¸à¥à¤¯ कà¥à¤·à¤®à¤¤à¤¾ नियता । वरà¥à¤¤à¤®à¤¾à¤¨à¤¾à¤ªà¥à¤Ÿà¤¾à¤¨à¤¾à¤‚ समà¥à¤ªà¤¾à¤¦à¤¨à¤¾à¤°à¥à¤¥à¤‚ निरà¥à¤—चà¥à¤›à¤¤à¥ । अथवा [[Special:UserLogin|log in or create an account]].',
'nocreate-loggedin' => 'नूतनपà¥à¤Ÿà¤¨à¤¿à¤°à¥à¤®à¤¾à¤°à¥à¤¥à¤®à¥ अनà¥à¤®à¤¤à¤¿à¤ƒ नासà¥à¤¤à¤¿ ।',
'sectioneditnotsupported-title' => 'विभागसमà¥à¤ªà¤¾à¤¦à¤¨à¤‚ न पोषितमॠ।',
@@ -1037,6 +1037,14 @@ $2
'edit-already-exists' => 'नूतनं पृषà¥à¤ à¤‚ सà¥à¤°à¤·à¥à¤Ÿà¥à¤‚ नापारयतà¥à¥¤
इदं पूरà¥à¤µà¥‡ à¤à¤µ विदà¥à¤¯à¤¤à¥‡à¥¤',
'defaultmessagetext' => 'सनà¥à¤¦à¥‡à¤¶à¤ªà¤¾à¤ à¤‚ सà¥à¤¥à¤¿à¤°à¤¯à¤¤à¥ ।',
+'invalid-content-data' => 'अमानà¥à¤¯à¤ƒ सामगà¥à¤°à¥€à¤¦à¤¤à¥à¤¤à¤¾à¤‚शः',
+'content-not-allowed-here' => '[[$2]] इति पृषà¥à¤ à¥‡ "$1" सामगà¥à¤°à¥€ अनà¥à¤®à¤¤à¤¾ नासà¥à¤¤à¤¿à¥¤',
+
+# Content models
+'content-model-wikitext' => 'विकिपाठः',
+'content-model-text' => 'शà¥à¤¦à¥à¤§à¤ªà¤¾à¤ à¤ƒ',
+'content-model-javascript' => 'जावालिपिः',
+'content-model-css' => 'सी-à¤à¤¸à¥-à¤à¤¸à¥',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''पà¥à¤°à¤¬à¥‹à¤§à¤ƒ :''' असà¥à¤®à¤¿à¤¨à¥ पृषà¥à¤ à¥‡ पà¥à¤°à¤­à¥‚तानि जटिलानि पारà¥à¤¸à¤°à¥-फ़ंकà¥à¤¶à¤¨à¥-आहà¥à¤µà¤¾à¤¨à¤¾à¤¨à¤¿ सनà¥à¤¤à¤¿à¥¤
@@ -1535,12 +1543,13 @@ You can still [$1 view this revision]",
'right-sendemail' => 'अनà¥à¤¯à¤¯à¥‹à¤œà¤•à¥‡à¤­à¥à¤¯à¤ƒ विदà¥à¤¯à¥à¤¨à¥à¤®à¤¾à¤¨à¤ªà¤¤à¥à¤°à¤¾à¤£à¤¿ पà¥à¤°à¥‡à¤·à¤¯à¤¤à¥ ।',
'right-passwordreset' => 'निकà¥à¤žà¥à¤šà¤ªà¥à¤¨à¤¾à¤°à¤šà¤¿à¤¤à¤¾à¤¨à¤¾à¤‚ विदà¥à¤¯à¥à¤¨à¥à¤®à¤¾à¤¨à¤ªà¤¤à¥à¤°à¤¾à¤£à¤¾à¤®à¥ अवलोकनमॠ।',
+# Special:Log/newusers
+'newuserlogpage' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒ-सृजन-सूचिका',
+'newuserlogpagetext' => 'अयं योजकनिरà¥à¤®à¤¾à¤£à¤¾à¤¸à¥à¤¯ पà¥à¤°à¤µà¥‡à¤¶à¤ƒ ।',
+
# User rights log
'rightslog' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒ-अधिकार-सूचिका',
'rightslogtext' => 'अयं योजकाधिकारसà¥à¤¯ परिवरà¥à¤¤à¤¨à¤•à¥à¤žà¥à¤šà¤ƒ ।',
-'rightslogentry' => '$2 - $3 तः $1 सामूहिकसदसà¥à¤¯à¤¤à¥à¤µà¤‚ परिवरà¥à¤¤à¤¿à¤¤à¤®à¥ ।',
-'rightslogentry-autopromote' => '$2 तः $3 सà¥à¤µà¤¯à¤®à¥ उनà¥à¤¨à¤¤à¥€à¤•à¥ƒà¤¤à¤®à¥ ।',
-'rightsnone' => '(कतम)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'à¤à¤¤à¤¤à¥à¤ªà¥à¤Ÿà¤‚ पठतॠ।',
@@ -1768,6 +1777,7 @@ URL मानà¥à¤¯à¤®à¥ अभिगमà¥à¤¯à¤‚ वेति परिशीà
'backend-fail-notsame' => '$1 मधà¥à¤¯à¥‡ काचितॠअजà¥à¤žà¤¾à¤¤à¤¸à¤žà¥à¤šà¤¿à¤•à¤¾ पूरà¥à¤µà¤®à¥‡à¤µà¤¾à¤¸à¥à¤¤à¤¿ ।',
'backend-fail-invalidpath' => '$1 मानà¥à¤¯à¤ƒ सङà¥à¤—à¥à¤°à¤¹à¤ªà¤¥à¤ƒ न ।',
'backend-fail-delete' => '$1 सञà¥à¤šà¤¿à¤•à¤¾à¤‚ परिमरà¥à¤œà¤¿à¤¤à¥à¤‚ नैव शकà¥à¤¯à¤¤à¥‡ ।',
+'backend-fail-describe' => '"$1" इति सञà¥à¤šà¤¿à¤•à¤¾à¤°à¥à¤¥à¤‚ पà¥à¤°à¤¦à¤¤à¥à¤¤à¤¾à¤‚शं परिवरà¥à¤¤à¤¯à¤¿à¤¤à¥à¤‚ नाशकà¥à¤¨à¥‹à¤¤à¥à¥¤',
'backend-fail-alreadyexists' => '$1 इति सञà¥à¤šà¤¿à¤• पूरà¥à¤µà¤®à¥‡à¤µ वरà¥à¤¤à¤¤à¥‡ ।',
'backend-fail-store' => '$1 सञà¥à¤šà¤¿à¤•à¤¾à¤‚ $2 मधà¥à¤¯à¥‡ सङà¥à¤—à¥à¤°à¤¹à¤¿à¤¤à¥à¤‚ नैव शकà¥à¤¯à¤¤à¥‡ ।',
'backend-fail-copy' => '$1 सञà¥à¤šà¤¿à¤•à¤¾à¤‚ $2 मधà¥à¤¯à¥‡ पà¥à¤°à¤¤à¤¿à¤•à¥ƒà¤¤à¤¿à¤ƒ करà¥à¤¤à¥à¤‚ नैव शकà¥à¤¯à¤¤à¥‡ ।',
@@ -2005,6 +2015,9 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
à¤à¤¤à¤¾à¤¨à¤¿ यथारà¥à¤¥à¤µà¤¿à¤·à¥ˆà¤ƒ योजनीयानि । <br />
यदि कोऽपि पà¥à¤Ÿà¥‡à¤¨ पà¥à¤°à¤•à¥ƒà¤¤à¤¿à¤‚ पà¥à¤°à¤¯à¥‹à¤œà¤¯à¤¤à¤¿ यः [[MediaWiki:Disambiguationspage]] इतà¥à¤¯à¤¨à¥‡à¤¨ अनà¥à¤¬à¤¦à¥à¤§à¤ƒ ससनà¥à¤¦à¤¿à¤—à¥à¤§à¤ªà¥à¤Ÿà¤®à¥ इति उचà¥à¤¯à¤¤à¥‡ ।',
+'pageswithprop' => 'पà¥à¤°à¤—à¥à¤£à¤µà¤¿à¤¶à¥‡à¤·à¤¯à¥à¤¤à¤¾à¤¨à¤¿ पृषà¥à¤ à¤¾à¤¨à¤¿',
+'pageswithprop-legend' => 'पà¥à¤°à¤—à¥à¤£à¤µà¤¿à¤¶à¥‡à¤·à¤¯à¥à¤¤à¤¾à¤¨à¤¿ पृषà¥à¤ à¤¾à¤¨à¤¿',
+
'doubleredirects' => 'दà¥à¤—à¥à¤¨à¥€-अनà¥à¤ªà¥à¤°à¥‡à¤·à¤¿à¤¤à¥‡',
'doubleredirectstext' => 'à¤à¤¤à¤¤à¥à¤ªà¥à¤Ÿà¤‚ तेषां पà¥à¤Ÿà¤¾à¤¨à¤¾à¤‚ सूची असà¥à¤¤à¤¿ यानि अनà¥à¤¯à¤ªà¥à¤¨à¤°à¥à¤¨à¤¿à¤¦à¥‡à¤¶à¤¿à¤¤à¤ªà¥à¤Ÿà¤¾à¤¨à¤¿ पà¥à¤°à¤¤à¤¿ पà¥à¤¨à¤°à¤¿à¤¦à¥‡à¤¶à¤¿à¤¤à¤¾à¤¨à¤¿ सनà¥à¤¤à¤¿ ।
पà¥à¤°à¤¤à¥à¤¯à¥‡à¤•à¤‚ पङà¥à¤•à¥à¤¤à¤¿à¤ƒ पà¥à¤°à¤¥à¤®à¤¦à¥à¤µà¤¿à¤¤à¥€à¤¯à¤ªà¥à¤¨à¤°à¥à¤¨à¤¿à¤¦à¥‡à¤¶à¤®à¥ अनà¥à¤¤à¤°à¥à¤—ता । दà¥à¤µà¤¿à¤¤à¥€à¤¯à¤ªà¥à¤¨à¤°à¥à¤¨à¤¿à¤¦à¥‡à¤¶à¤ƒ लकà¥à¤·à¥à¤¯à¤‚ यतॠवासà¥à¤¤à¤µà¤‚ लकà¥à¤·à¥à¤¯à¤ªà¥à¤Ÿà¤‚ पà¥à¤°à¤¥à¤®à¤‚ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤à¤®à¥ ।
@@ -2177,10 +2190,6 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
'activeusers-hidesysops' => 'पà¥à¤°à¤¶à¤¾à¤¸à¤•à¤¾à¤¨à¥ गोपयतॠ।',
'activeusers-noresult' => 'योजकः न पà¥à¤°à¤¾à¤ªà¥à¤¤à¤ƒ ।',
-# Special:Log/newusers
-'newuserlogpage' => 'पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¥ƒ-सृजन-सूचिका',
-'newuserlogpagetext' => 'अयं योजकनिरà¥à¤®à¤¾à¤£à¤¾à¤¸à¥à¤¯ पà¥à¤°à¤µà¥‡à¤¶à¤ƒ ।',
-
# Special:ListGroupRights
'listgrouprights' => 'योजकसमूहाधिकाराः ।',
'listgrouprights-summary' => 'अधोदतà¥à¤¤à¤¾ विकिपरिभाषितसà¥à¤¯ सङà¥à¤—ताभिगमà¥à¤¯à¤¤à¤¾à¤§à¤¿à¤•à¤¾à¤°à¥ˆà¤ƒ सहिता योजकसमूहसà¥à¤¯ आवली । [[{{MediaWiki:Listgrouprights-helppage}}|additional information]]',
@@ -2274,15 +2283,48 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
'enotif_mailer' => '{{SITENAME}} सूचितः विदà¥à¤¯à¥à¤¨à¥à¤®à¤¾à¤¨à¤ªà¤¤à¥à¤°à¤ªà¥à¤°à¥‡à¤·à¤•à¤ƒ ।',
'enotif_reset' => 'सनà¥à¤¦à¤°à¥à¤¶à¤¿à¤¤à¤¾à¤¨à¤¿ इति सरà¥à¤µà¤ªà¥à¤Ÿà¤¾à¤¨à¤¿ अङà¥à¤•à¤¯à¤¤à¥ ।',
-'enotif_newpagetext' => 'इदमॠà¤à¤•à¤‚ नवीनपृषà¥à¤ à¤®à¥',
'enotif_impersonal_salutation' => '{{SITENAME}} योजक',
-'changed' => 'परिवरà¥à¤¤à¤¿à¤¤à¤®à¥ ।',
-'created' => 'सृषà¥à¤Ÿà¤®à¥ ।',
-'enotif_subject' => '{{SITENAME}} $ पà¥à¤Ÿà¤¶à¥€à¤°à¥à¤·à¤•à¤‚ $ परिवरà¥à¤¤à¤¿à¤¤à¤®à¥$ इतà¥à¤¯à¤¨à¥‡à¤¨ ।',
+'enotif_subject_deleted' => '{{SITENAME}} पृषà¥à¤ à¤‚ $1 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ {{gender:$2 इतà¥à¤¯à¤¨à¥‡à¤¨|$2 इतà¥à¤¯à¤¨à¤¯à¤¾}} अपाकृतमसà¥à¤¤à¤¿à¥¤',
+'enotif_subject_created' => '{{SITENAME}} पृषà¥à¤ à¤‚ $1 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ {{gender:$2 इतà¥à¤¯à¤¨à¥‡à¤¨|$2 इतà¥à¤¯à¤¨à¤¯à¤¾}} रचितमसà¥à¤¤à¤¿',
+'enotif_subject_moved' => '{{SITENAME}} पृषà¥à¤ à¤‚ $1 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ {{gender:$2 इतà¥à¤¯à¤¨à¥‡à¤¨|$2 इतà¥à¤¯à¤¨à¤¯à¤¾}} चालितमसà¥à¤¤à¤¿',
+'enotif_subject_restored' => '{{SITENAME}} पृषà¥à¤ à¤‚ $1 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ {{gender:$2 इतà¥à¤¯à¤¨à¥‡à¤¨|$2 इतà¥à¤¯à¤¨à¤¯à¤¾}} पà¥à¤¨à¤ƒà¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿',
+'enotif_subject_changed' => '{{SITENAME}} पृषà¥à¤ à¤‚ $1 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ {{gender:$2 इतà¥à¤¯à¤¨à¥‡à¤¨|$2 इतà¥à¤¯à¤¨à¤¯à¤¾}} परिवरà¥à¤¤à¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿à¥¤',
+'enotif_body_intro_deleted' => '{{SITENAME}} पृषà¥à¤ à¤‚ $1 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ $PAGEEDITDATE इति दिनाङà¥à¤•à¥‡ {{gender:$2 इतà¥à¤¯à¤¨à¥‡à¤¨|$2 इतà¥à¤¯à¤¨à¤¯à¤¾}} अपाकृतमसà¥à¤¤à¤¿, $3 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ दृशà¥à¤¯à¤¤à¤¾à¤®à¥à¥¤',
+'enotif_body_intro_created' => '{{SITENAME}} पृषà¥à¤ à¤‚ $1 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ $PAGEEDITDATE इति दिनाङà¥à¤•à¥‡ {{gender:$2 इतà¥à¤¯à¤¨à¥‡à¤¨|$2 इतà¥à¤¯à¤¨à¤¯à¤¾}} रचितमसà¥à¤¤à¤¿, वरà¥à¤¤à¤®à¤¾à¤¨à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¥à¤¯à¤°à¥à¤¥à¥‡ $3 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ दृशà¥à¤¯à¤¤à¤¾à¤®à¥à¥¤',
+'enotif_body_intro_moved' => '{{SITENAME}} पृषà¥à¤ à¤‚ $1 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ $PAGEEDITDATE इति दिनाङà¥à¤•à¥‡ {{gender:$2 इतà¥à¤¯à¤¨à¥‡à¤¨|$2 इतà¥à¤¯à¤¨à¤¯à¤¾}} चालितमसà¥à¤¤à¤¿, वरà¥à¤¤à¤®à¤¾à¤¨à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¥à¤¯à¤°à¥à¤¥à¥‡ $3 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ दृशà¥à¤¯à¤¤à¤¾à¤®à¥à¥¤',
+'enotif_body_intro_restored' => '{{SITENAME}} पृषà¥à¤ à¤‚ $1 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ $PAGEEDITDATE इति दिनाङà¥à¤•à¥‡ {{gender:$2 इतà¥à¤¯à¤¨à¥‡à¤¨|$2 इतà¥à¤¯à¤¨à¤¯à¤¾}} पà¥à¤¨à¤ƒà¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿, वरà¥à¤¤à¤®à¤¾à¤¨à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¥à¤¯à¤°à¥à¤¥à¥‡ $3 इति दृशà¥à¤¯à¤¤à¤¾à¤®à¥à¥¤',
+'enotif_body_intro_changed' => '{{SITENAME}} पृषà¥à¤ à¤‚ $1 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ $PAGEEDITDATE इति दिनाङà¥à¤•à¥‡ {{gender:$2 इतà¥à¤¯à¤¨à¥‡à¤¨|$2 इतà¥à¤¯à¤¨à¤¯à¤¾}} परिवरà¥à¤¤à¤¿à¤¤à¤®à¤¸à¥à¤¤à¤¿, वरà¥à¤¤à¤®à¤¾à¤¨à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¥à¤¯à¤°à¥à¤¥à¥‡ $3 इतà¥à¤¯à¥‡à¤¤à¤¤à¥ दृशà¥à¤¯à¤¤à¤¾à¤®à¥à¥¤',
'enotif_lastvisited' => 'भवतः पूवसनà¥à¤¦à¤°à¥à¤¶à¤¨à¤¸à¥à¤¯ पशà¥à¤šà¤¾à¤¤à¥ सवृतà¥à¤¤à¤ªà¤°à¤¿à¤µà¤°à¥à¤¤à¤¨à¤¾à¤°à¥à¤¥à¤‚ $1 पशà¥à¤¯à¤¤à¥ ।',
'enotif_lastdiff' => 'à¤à¤¤à¤¤à¥à¤ªà¤°à¤¿à¤µà¤°à¥à¤¤à¤¨à¤‚ दृषà¥à¤Ÿà¥à¤‚ $1 पशà¥à¤¯à¤¤à¥ ।',
'enotif_anon_editor' => 'अनामकः योजकः $1',
-'enotif_body' => 'आतà¥à¤®à¥€à¤¯ $ अवलोकनबनà¥à¤§à¥‹',
+'enotif_body' => 'Dear $WATCHINGUSERNAME,
+
+$PAGEINTRO $NEWPAGE
+
+Editor\'s summary: $PAGESUMMARY $PAGEMINOREDIT
+
+Contact the editor:
+mail: $PAGEEDITOR_EMAIL
+wiki: $PAGEEDITOR_WIKI
+
+There will be no other notifications in case of further activity unless you visit this page. You could also reset the notification flags for all your watched pages on your watchlist.
+
+ Your friendly {{SITENAME}} notification system
+
+--
+To change your e-mail notification settings, visit
+{{canonicalurl:{{#special:Preferences}}}}
+
+To change your watchlist settings, visit
+{{canonicalurl:{{#special:EditWatchlist}}}}
+
+To delete the page from your watchlist, visit
+$UNWATCHURL
+
+Feedback and further assistance:
+{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'सृषà¥à¤Ÿà¤®à¥ ।',
+'changed' => 'परिवरà¥à¤¤à¤¿à¤¤à¤®à¥ ।',
# Delete
'deletepage' => 'पृषà¥à¤ à¤‚ निराकरोतà¥à¥¤',
@@ -2738,6 +2780,7 @@ $2 इति पà¥à¤°à¤•à¤¾à¤°à¤¸à¥à¤¯ अवरोधं करà¥à¤¤à¥à¤‚ à
'immobile-target-namespace-iw' => 'पà¥à¤Ÿà¤šà¤¾à¤²à¤¨à¤¾à¤°à¥à¤¥à¤®à¥ अनà¥à¤¤à¤°à¥à¤µà¤¿à¤•à¥à¤¯à¤¾à¤¨à¥à¤¬à¤¨à¥à¤§à¤ƒ मानà¥à¤¯à¤‚ लकà¥à¤·à¥à¤¯à¤‚ न ।',
'immobile-source-page' => 'à¤à¤¤à¤¤à¥à¤ªà¥à¤Ÿà¤‚ चालनयोगà¥à¤¯à¤‚ न ।',
'immobile-target-page' => 'ततॠलकà¥à¤·à¤¿à¤¤à¤¶à¥€à¤°à¥à¤·à¤•à¤‚ पà¥à¤°à¤¤à¤¿ चालयितà¥à¤‚ न शकà¥à¤¯à¤¤à¥‡ ।',
+'bad-target-model' => 'अभीषà¥à¤Ÿà¤—नà¥à¤¤à¤µà¥à¤¯à¥‡ तॠभिनà¥à¤¨à¤®à¥‡à¤•à¤‚ सामगà¥à¤°à¥€à¤ªà¥à¤°à¤¤à¤¿à¤®à¤¾à¤¨à¤‚ पà¥à¤°à¤¯à¥à¤œà¥à¤¯à¤¤à¥‡à¥¤ $1 इतà¥à¤¯à¤¸à¥à¤¯ $2 इतà¥à¤¯à¤¸à¥à¤®à¤¿à¤¨à¥ परिवरà¥à¤¤à¤¨à¤‚ न शकà¥à¤¯à¤®à¥à¥¤',
'imagenocrossnamespace' => 'सञà¥à¤šà¤¿à¤•à¤¾à¤‚ अनामसà¥à¤¥à¤¾à¤¨à¥‡ सà¥à¤¥à¤¾à¤¨à¤¾à¤¨à¥à¤¤à¤°à¤¿à¤¤à¤‚ करà¥à¤¤à¥à¤‚ नैव शकà¥à¤¯à¤¤à¥‡ ।',
'nonfile-cannot-move-to-file' => 'असञà¥à¤šà¤¿à¤•à¤¾à¤¯à¤¾à¤ƒ सञà¥à¤šà¤¿à¤•à¤¾à¤¨à¤¾à¤®à¤¸à¥à¤¥à¤¾à¤¨à¥‡ सà¥à¤¥à¤¾à¤¨à¤¾à¤¨à¥à¤¤à¤°à¤‚ न शकà¥à¤¯à¤¤à¥‡ ।',
'imagetypemismatch' => 'नूतपà¥à¤Ÿà¤µà¤¿à¤¸à¥à¤¤à¤¾à¤°à¤ƒ तसà¥à¤¯ पà¥à¤°à¤•à¤¾à¤£ सह मेलं न पà¥à¤°à¤¾à¤ªà¥à¤¨à¥‹à¤¤à¤¿ ।',
@@ -2858,7 +2901,6 @@ $2 इति पà¥à¤°à¤•à¤¾à¤°à¤¸à¥à¤¯ अवरोधं करà¥à¤¤à¥à¤‚ à
# JavaScriptTest
'javascripttest' => 'जावालिपिपरीकà¥à¤·à¤£à¤®à¥ ।',
-'javascripttest-disabled' => 'विकà¥à¤¯à¤¾à¤®à¥ अयं कà¥à¤°à¤¿à¤¯à¤¾à¤•à¤²à¤¾à¤ªà¤ƒ निषà¥à¤•à¥à¤°à¤¿à¤¯à¤ƒ ।',
'javascripttest-title' => '$1 परीकà¥à¤·à¤¾à¤ªà¥à¤°à¤šà¤²à¤¤à¤¿ ।',
'javascripttest-pagetext-noframework' => 'जावलिपिचालनपरीकà¥à¤·à¤¾à¤°à¥à¤¥à¤®à¥ à¤à¤¤à¤¤à¥à¤ªà¥à¤Ÿà¤®à¥ आरकà¥à¤·à¤¿à¤¤à¤®à¥ ।',
'javascripttest-pagetext-unknownframework' => 'अजà¥à¤žà¤¾à¤¤à¤ªà¤°à¥€à¤•à¥à¤·à¤¾à¤ªà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ $1',
@@ -2974,6 +3016,7 @@ $2 इति पà¥à¤°à¤•à¤¾à¤°à¤¸à¥à¤¯ अवरोधं करà¥à¤¤à¥à¤‚ à
'pageinfo-default-sort' => 'संविभागकीलकं पूरà¥à¤µà¤¨à¤¿à¤°à¥à¤¦à¤¿à¤·à¥à¤Ÿà¤‚ कà¥à¤°à¤¿à¤¯à¤¤à¤¾à¤®à¥',
'pageinfo-length' => 'पृषà¥à¤ à¤¦à¥ˆà¤°à¥à¤˜à¥à¤¯à¤®à¥ (बैटà¥à¤¸à¥à¤¦à¥à¤µà¤¾à¤°à¤¾)',
'pageinfo-article-id' => 'पृषà¥à¤ à¤¾à¤­à¤¿à¤œà¥à¤žà¤¾à¤ªà¤•à¤®à¥',
+'pageinfo-language' => 'पृषà¥à¤ à¤¸à¤¾à¤®à¤—à¥à¤°à¥à¤¯à¤¾à¤ƒ भाषा',
'pageinfo-robot-policy' => 'चालकयनà¥à¤¤à¥à¤°à¤¸à¥à¤¥à¤¿à¤¤à¤¿à¤ƒ अनà¥à¤µà¤¿à¤·à¥à¤¯à¤¤à¤¾à¤®à¥',
'pageinfo-robot-index' => 'अङà¥à¤•à¤¨à¤¯à¥‹à¤—à¥à¤¯à¤®à¥',
'pageinfo-robot-noindex' => 'अङà¥à¤•à¤¨à¤¾à¤¯à¥‹à¤—à¥à¤¯à¤®à¥',
@@ -2993,6 +3036,18 @@ $2 इति पà¥à¤°à¤•à¤¾à¤°à¤¸à¥à¤¯ अवरोधं करà¥à¤¤à¥à¤‚ à
'pageinfo-magic-words' => 'मानà¥à¤¤à¥à¤°à¤¿à¤•{{PLURAL:$1|शबà¥à¤¦à¤ƒ|शबà¥à¤¦à¤¾à¤ƒ}} ($1)',
'pageinfo-hidden-categories' => 'गोपित{{PLURAL:$1|वरà¥à¤—ः|वरà¥à¤—ाः}} ($1)',
'pageinfo-templates' => 'समायोजित{{PLURAL:$1|फलकमà¥|फलकानि}} ($1)',
+'pageinfo-toolboxlink' => 'पृषà¥à¤ à¤¸à¥‚चनाः',
+'pageinfo-redirectsto' => 'इतà¥à¤¯à¤¤à¥à¤° अनà¥à¤ªà¥à¤°à¥‡à¤·à¥à¤¯à¤¤à¥‡',
+'pageinfo-redirectsto-info' => 'सूचना',
+'pageinfo-contentpage' => 'सामगà¥à¤°à¥€à¤ªà¥ƒà¤·à¥à¤ à¤µà¤¤à¥ गणà¥à¤¯à¤¤à¥‡',
+'pageinfo-contentpage-yes' => 'आमà¥',
+'pageinfo-protect-cascading' => 'अतसà¥à¤¤à¥ संरकà¥à¤·à¤£à¤µà¤¿à¤§à¤¿à¤ƒ सोपानवतॠगचà¥à¤›à¤¤à¤¿',
+'pageinfo-protect-cascading-yes' => 'आमà¥',
+'pageinfo-protect-cascading-from' => 'अधोलिखितेभà¥à¤¯à¤ƒ संरकà¥à¤·à¤£à¤µà¤¿à¤§à¤¿à¤ƒ सोपानवतॠगचà¥à¤›à¤¤à¤¿',
+'pageinfo-category-info' => 'वरà¥à¤—विषयकसूचना',
+'pageinfo-category-pages' => 'पृषà¥à¤ à¤¾à¤¨à¤¾à¤‚ सङà¥à¤–à¥à¤¯à¤¾',
+'pageinfo-category-subcats' => 'उपवरà¥à¤—ानां सङà¥à¤–à¥à¤¯à¤¾',
+'pageinfo-category-files' => 'सञà¥à¤šà¤¿à¤•à¤¾à¤¨à¤¾à¤‚ सङà¥à¤–à¥à¤¯à¤¾',
# Skin names
'skinname-standard' => 'पूरà¥à¤µ',
@@ -3012,6 +3067,8 @@ $2 इति पà¥à¤°à¤•à¤¾à¤°à¤¸à¥à¤¯ अवरोधं करà¥à¤¤à¥à¤‚ à
'markedaspatrollederror' => 'आरकà¥à¤·à¤¿à¤¤à¤®à¤¿à¤¤à¤¿ अङà¥à¤•à¤¿à¤¤à¤‚ न भवति ।',
'markedaspatrollederrortext' => 'आरकà¥à¤·à¤¿à¤¤à¤®à¤¿à¤¤à¤¿ सूचयितà¥à¤‚ पà¥à¤¨à¤°à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¤¿à¤‚ विशेषयतॠ।',
'markedaspatrollederror-noautopatrol' => 'सà¥à¤µà¤¸à¥à¤¯ परिवरà¥à¤¤à¤¨à¤¾à¤¨à¤¿ आरकà¥à¤·à¤¿à¤¤à¤‚ करà¥à¤¤à¥à¤‚ भवानॠनानà¥à¤®à¤¤à¤ƒ ।',
+'markedaspatrollednotify' => '$1 इतà¥à¤¯à¤¸à¥à¤¯ à¤à¤¤à¤¤à¥ परिवरà¥à¤¤à¤¨à¤‚ समीकà¥à¤·à¤¿à¤¤à¤®à¥ इति अङà¥à¤•à¤¿à¤¤à¤®à¥à¥¤',
+'markedaspatrollederrornotify' => 'समीकà¥à¤·à¤¿à¤¤à¤®à¥ इति चिहà¥à¤¨à¥€à¤•à¤°à¤£à¤‚ विफलमà¥à¥¤',
# Patrol log
'patrol-log-page' => 'आरकà¥à¤·à¤£à¤¸à¥‚चिका ।',
@@ -3043,6 +3100,7 @@ $2 इति पà¥à¤°à¤•à¤¾à¤°à¤¸à¥à¤¯ अवरोधं करà¥à¤¤à¥à¤‚ à
'file-nohires' => 'उचà¥à¤šà¤¤à¤°à¤‚ विभेदनं नोपलबà¥à¤§à¤®à¥',
'svg-long-desc' => 'SVG संचिका, साधारणतया $1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¾à¤¨à¤¿, संचिकायाः आकारः : $3',
'svg-long-desc-animated' => 'आशà¥à¤µà¤¸à¤¿à¤¤à¤¾ SVG संचिका, साधारणतया $1 × $2 पिकà¥à¤¸à¥‡à¤²à¤¾à¤¨à¤¿, संचिकायाः आकारः : $3',
+'svg-long-error' => 'à¤à¤·à¤¾ अमानà¥à¤¯à¤¾ SVG सञà¥à¤šà¤¿à¤•à¤¾ : $1',
'show-big-image' => 'पूरà¥à¤£à¤‚ विभेदनमà¥',
'show-big-image-preview' => 'असà¥à¤¯ पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•à¤¨à¤¸à¥à¤¯ आकारः : $1',
'show-big-image-other' => 'अनà¥à¤¯à¤¾à¤ƒ {{PLURAL:$2| पà¥à¤°à¤¸à¥à¤¤à¤µà¤ƒ|पà¥à¤°à¤¸à¥à¤¤à¤¾à¤µà¤¾à¤ƒ}}: $1 ।',
@@ -3073,6 +3131,7 @@ $2 इति पà¥à¤°à¤•à¤¾à¤°à¤¸à¥à¤¯ अवरोधं करà¥à¤¤à¥à¤‚ à
'hours' => '{{PLURAL:$1|$1होरा|$1 होराः}}',
'days' => '{{PLURAL:$1|$1 दिनमà¥|$1 दिनानि}}',
'ago' => '$1 पूरà¥à¤µà¤®à¥',
+'just-now' => 'अधà¥à¤¨à¥ˆà¤µ',
# Bad image list
'bad_image_list' => 'रूपमॠà¤à¤µà¤®à¥ असà¥à¤¤à¤¿ -
@@ -3676,6 +3735,7 @@ $5
'version-license' => 'अनà¥à¤œà¥à¤žà¤¾à¤ªà¤¤à¥à¤°à¤®à¥',
'version-poweredby-credits' => "इयं विकिः अनेन सञà¥à¤šà¤¾à¤²à¤¿à¤¤à¤¾ '''[//www.mediawiki.org/ MediaWiki]''', सà¥à¤µà¤¾à¤®à¤¿à¤¤à¥à¤µà¤®à¥ © 2001 - $1 $2 ।",
'version-poweredby-others' => 'अनà¥à¤¯',
+'version-credits-summary' => '[[Special:Version|MediaWiki] इतà¥à¤¯à¤¤à¥à¤° योगदानारà¥à¤¥à¤‚ वयं अधोलिखितानॠजनानॠपà¥à¤°à¤¶à¤‚सितà¥à¤®à¤¿à¤šà¥à¤›à¤¾à¤®à¤ƒà¥¤',
'version-license-info' => 'मिडियाविकिः तॠनिशà¥à¤¶à¥à¤²à¥à¤•à¤¤à¤¨à¥à¤¤à¥à¤°à¤¾à¤‚शः ; भवानॠपà¥à¤¨à¤ƒ वितरà¥à¤¤à¥à¤‚ शकà¥à¤¨à¥‹à¤¤à¤¿ अथवा GNU सामानà¥à¤¯à¤¸à¤¾à¤°à¥à¤µà¤œà¤¨à¤¿à¤•à¤¾à¤¨à¥à¤œà¥à¤žà¤ªà¤¤à¥à¤°à¤¸à¥à¤¯ नियमानà¥à¤—à¥à¤£à¤‚ दà¥à¤µà¥€à¤¤à¥€à¤¯à¤¾à¤µà¥ƒà¤¤à¥à¤¤à¤¿à¤®à¥ अथवा अनà¥à¤¯à¤¨à¥‚तनावृतिं संसà¥à¤•à¤°à¥à¤¤à¥à¤‚ शकà¥à¤¨à¥‹à¤¤à¤¿ ।
à¤à¤·à¤¾ बहूपयोगाय भवेतॠइति धिया मिडियाविकिः वितीरà¥à¤£à¤¾ । किनà¥à¤¤à¥ केनापि पà¥à¤°à¤®à¤¾à¤£à¤¤à¥à¤µà¥‡à¤¨ विना दतà¥à¤¤à¤¾ । अथवा निरà¥à¤¦à¤¿à¤·à¥à¤Ÿà¥‹à¤¦à¥à¤¦à¥‡à¤¶à¤°à¥à¤¥à¥‡ अनà¥à¤•à¥‚लकरं वेति अपरिशीलà¥à¤¯ अथवा वाणिजà¥à¤¯à¤¸à¥à¤¯ आनà¥à¤·à¤™à¥à¤—िकानà¥à¤œà¥à¤žà¤¾à¤ªà¤¤à¥à¤°à¥‡à¤£ विना अपि मीडियाविकिः पà¥à¤°à¤¦à¤¤à¥à¤¤à¤¾ । विशेषविवरणपà¥à¤°à¤¾à¤ªà¥à¤¤à¤¯à¥‡ GNU सरà¥à¤µà¤œà¤¨à¤¸à¤¾à¤®à¤¾à¤¨à¥à¤¯à¤®à¥ अनà¥à¤œà¥à¤žà¤¾à¤ªà¤¤à¥à¤°à¤‚ पशà¥à¤¯à¤¤à¥ ।
@@ -3819,7 +3879,10 @@ $1 इतà¥à¤¯à¤¨à¥‡à¤¨ $3 इति पृषà¥à¤ à¤®à¥ $4 इतà¥à¤¯à¥‡à¤
'logentry-newusers-create' => '$1 योजकलेखामॠअसृजतà¥',
'logentry-newusers-create2' => '$1, $3 इति योजकलेखामॠअसृजतà¥',
'logentry-newusers-autocreate' => '$1 लेखा सà¥à¤µà¤¯à¤®à¥‡à¤µ सृषà¥à¤Ÿà¤‚ जातमà¥',
-'newuserlog-byemail' => 'कूटशबà¥à¤¦à¤ƒ ईपतà¥à¤°à¤¦à¥à¤µà¤¾à¤°à¤¾ पà¥à¤°à¥‡à¤·à¤¿à¤¤à¤ƒ',
+'logentry-rights-rights' => '$1 इतà¥à¤¯à¤¯à¤‚ $3 इतà¥à¤¯à¤¸à¥à¤¯ समूहसदसà¥à¤¯à¤¤à¤¾à¤‚ $4 इतà¥à¤¯à¤¤à¤ƒ परिवरà¥à¤¤à¥à¤¯ $5 इतà¥à¤¯à¤•à¤°à¥‹à¤¤à¥',
+'logentry-rights-rights-legacy' => '$1, $3 इतà¥à¤¯à¤¸à¥à¤®à¥ˆ समूहसदसà¥à¤¯à¤¤à¤¾à¤‚ परà¥à¤¯à¤µà¤°à¥à¤¤à¤¯à¤¤à¥',
+'logentry-rights-autopromote' => '$1 इतà¥à¤¯à¤¯à¤‚ सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤à¤°à¥‚पेण $4 इतà¥à¤¯à¤¤à¤ƒ $5 इति यावतॠपदोनà¥à¤¨à¤¤à¤ƒ',
+'rightsnone' => '(कतम)',
# Feedback
'feedback-bugornote' => 'यदि भवानॠकसà¥à¤¯à¤¾à¤¶à¥à¤šà¤¿à¤¤à¥ तानà¥à¤¤à¥à¤°à¤¿à¤•à¤¸à¤®à¤¸à¥à¤¯à¤¾à¤¯à¤¾à¤ƒ विषये विशदीकरà¥à¤¤à¥à¤®à¥ इचà¥à¤›à¤¤à¤¿ तरà¥à¤¹à¤¿ [$1 मतà¥à¤•à¥à¤£à¤¸à¤žà¥à¤šà¤¿à¤•à¤¾à¤‚ करोतॠ।]
diff --git a/languages/messages/MessagesSah.php b/languages/messages/MessagesSah.php
index b65534cc..925c6123 100644
--- a/languages/messages/MessagesSah.php
+++ b/languages/messages/MessagesSah.php
@@ -176,6 +176,7 @@ $messages = array(
'newwindow' => '(атын Ñ‚Ò¯Ð½Ð½Ò¯ÐºÐºÑ Ð°Ñ€Ñ‹Ð»Ð»Ð°Ñ€)',
'cancel' => 'ÐлҕаÑ',
'moredotdotdot' => 'Ó¨ÑÑÓ©...',
+'morenotlisted' => 'Ðтын Ñуох...',
'mypage' => 'СирÑй',
'mytalk' => 'КÑпÑÑÑ‚ÑÑ€ Ñирим',
'anontalk' => 'Бу IP-га ырытыы',
@@ -187,7 +188,6 @@ $messages = array(
'qbbrowse' => 'Көр',
'qbedit' => 'Уларыт',
'qbpageoptions' => 'Бу ÑирÑй',
-'qbpageinfo' => 'Ð˜Ñ Ñ…Ð¾Ò»Ð¾Ð¾Ð½Ð¾',
'qbmyoptions' => 'Мин ÑирÑйдÑрим',
'qbspecialpages' => 'Ðналлаах ÑирÑйдÑÑ€',
'faq' => 'FAQ',
@@ -210,6 +210,7 @@ $messages = array(
'namespaces' => 'Ðат даллара',
'variants' => 'Барыллар',
+'navigation-heading' => 'ÐавигациÑ',
'errorpagetitle' => 'Сыыһа',
'returnto' => 'Төттөрү $1 ÑирÑйгÑ.',
'tagline' => '{{SITENAME}} диÑн ÑиртÑн ылыллыбыт',
@@ -448,11 +449,11 @@ $2',
'logouttext' => "'''Эн тиһиликтÑн таҕыÑÑ‚Ñ‹Ò¥.'''
{{SITENAME}} Ñитим-ÑÐ¸Ñ€Ð³Ñ Ð±Ð¸Ð»Ð¸Ð³Ð¸Ð½ урукку ааккынан буолбакка IP-аадырыһынан ÑÑ€Ñ ÐºÓ©Ñтөҕүн.
-Салгыы ааккын ааттаабакка үлÑлиÑххин Ñөп, ÑбÑÑ‚ÑÑ€ Ñаҥаттан урукку ааккынан дуу, атын аатынан дуу [[Special:UserLogin|киириÑххин]] Ñөп.
+Салгыы ааккын ааттаабакка үлÑлиÑххин Ñөп, ÑбÑÑ‚ÑÑ€ Ñаҥаттан урукку ааккынан дуу, атын аатынан дуу <span class='plainlinks'>[$1 киириÑххин]</span> Ñөп.
Сорох ÑирÑйдÑÑ€ Ó©ÑÑÓ© даҕаны Ñйигин урукку ааккынан көрдөрүөхтÑрин Ñөп, ону Ñуох гыныаххын баҕардаххына интÑриниÑÑ‚ көрдөрөөччүҥ кÑÑһин ырааÑтаа.",
-'welcomecreation' => '== Ðөрүөн нөргүй, $1! ==
-Эн манна бÑлиÑÑ‚Ñнниҥ.
-[[Special:Preferences|{{SITENAME}} туруорууларын]] бÑйÑÒ•ÑÑ€ Ñөп түбÑÒ»ÑÑ€ гына уларытаргын умнума.',
+'welcomeuser' => 'Ðөрүөн нөргүй, $1!',
+'welcomecreation-msg' => 'Ðатыҥ бÑлиÑÑ‚ÑннÑ.
+{{SITENAME}} Ñитим-ÑÐ¸Ñ€Ð³Ñ Ò¯Ð»ÑÐ»Ð¸Ð¸Ñ€Ð³Ñ Ñ‚Ð°Ð±Ñ‹Ð³Ð°Ñтаах буоллун диÑн [[Special:Preferences|Ñ‚ÑƒÑ Ñ‚ÑƒÑ€ÑƒÐ¾Ñ€ÑƒÑƒÐ»Ð°Ñ€Ð³Ñ‹Ð½]] уларытыаххын Ñөп.',
'yourname' => 'Кыттааччы аатыҥ:',
'yourpassword' => 'Киирии тыла:',
'yourpasswordagain' => 'Киирии тылгын хатылаа:',
@@ -475,7 +476,7 @@ $2',
'gotaccount' => "БÑлиÑÑ‚Ñммитиҥ дуо? '''$1'''.",
'gotaccountlink' => 'Ðатыҥ',
'userlogin-resetlink' => 'КиирÑÑ€ тылгын умнубуккун дуо?',
-'createaccountmail' => 'e-mail-ынан',
+'createaccountmail' => 'БыÑтах киирии тылы туһаныы уонна ону email-ынан Ñ‹Ñ‹Ñ‚Ñ‹Ñ‹',
'createaccountreason' => 'ТөрүөтÑ:',
'badretype' => 'Киирии тылларыҥ Ñөп түбÑÑпÑтилÑÑ€.',
'userexists' => 'Суруйбут аатыҥ бÑлиÑÑ€ баар.
@@ -549,6 +550,7 @@ $2',
# Email sending
'php-mail-error-unknown' => 'mail() PHP-функциÑтыгар туох ÑÑ€Ñ Ð°Ð»Ò•Ð°Ñ Ñ‚Ð°Ñ…Ñыбыт',
'user-mail-no-addy' => 'Сурук аадырыһа Ñуох ыыттылла Ñатаабыт',
+'user-mail-no-body' => 'Кураанах ÑбÑÑ‚ÑÑ€ Ñуолтата Ñуох ÐºÑ‹Ð»Ð³Ð°Ñ Ñ‚Ð¸ÑкиÑÑ‚ÑÑÑ… Ñуругу ыыта Ñатаабыт.',
# Change password dialog
'resetpass' => 'Киирии тылы уларытыы',
@@ -615,6 +617,7 @@ $2
'changeemail-oldemail' => 'Билиҥҥи аадырыÑ:',
'changeemail-newemail' => 'Саҥа аадырыÑ:',
'changeemail-none' => '(Ñуох)',
+'changeemail-password' => '{{SITENAME}} Ñитим-ÑÐ¸Ñ€Ð³Ñ ÐºÐ¸Ð¸Ñ€ÑÑ€ тылыҥ:',
'changeemail-submit' => 'Ðадырыһы уларыт',
'changeemail-cancel' => 'Тохтот',
@@ -793,7 +796,6 @@ IP-аадырыһа ÑÑ€Ñ ÐºÓ©ÑÑ‚Ó©Ñ€.
'template-semiprotected' => '(хатаммыт аҥардаах)',
'hiddencategories' => 'Бу ÑирÑй киÑÑ‚Ñммит {{PLURAL:$1|1 категориÑҕа|$1 категориÑларга}} киирÑÑ€:',
'edittools' => '<!-- Манна Ñуруллубут Ñурук уларытыы уонна Ñбии пуормаларын анныгар Ñуруллуо. -->',
-'nocreatetitle' => 'СирÑй оҥорор хааччахтаммыт',
'nocreatetext' => '{{SITENAME}} Ñаайтыгар Ñаҥа ÑирÑйи оҥорор хааччахтанар.
Баар ÑирÑйи уларытыаххын Ñөп, ÑбÑÑ‚ÑÑ€ [[Special:UserLogin|манна бÑлиÑÑ‚ÑниÑххин ÑбÑÑ‚ÑÑ€ атын аатынан киириÑххин Ñөп]].',
'nocreate-loggedin' => 'Эн Ñаҥа ÑирÑйи оҥорор кыаҕыҥ Ó©ÑÑÓ© Ñуох.',
@@ -818,6 +820,15 @@ IP-аадырыһа ÑÑ€Ñ ÐºÓ©ÑÑ‚Ó©Ñ€.
'edit-already-exists' => 'Саҥа ÑирÑйи оҥорор табыллыбат.
Маннык ÑирÑй баар Ñбит.',
'defaultmessagetext' => 'ТуÑпа ÑтиллибÑÑ‚ÑÒ•Ð¸Ð½Ñ Ñуруллар тиÑкиÑ',
+'content-failed-to-parse' => '$2 иһинÑÑÒ•Ð¸Ñ‚Ñ $1 көрүҥÑÑ€ Ñөп түбÑÑпÑÑ‚: $3.',
+'invalid-content-data' => 'ÐлҕаÑтаах дааннайдар',
+'content-not-allowed-here' => '[[$2]] ÑирÑÐ¹Ð³Ñ "$1" туттуллуо Ñуохтаах',
+
+# Content models
+'content-model-wikitext' => 'биики-тиÑкиÑ',
+'content-model-text' => 'көннөрү тиÑкиÑ',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Болҕой. Бу ÑирÑй наһаа ÑлбÑÑ… көмпүүтÑри ноҕурууÑкалыыр реÑурÑаларга ÑигÑнÑÑ€.
@@ -1183,9 +1194,9 @@ $1",
'prefs-emailconfirm-label' => 'Эл. почтаны бигÑргÑтии:',
'prefs-textboxsize' => 'ЭрÑдÑÑкиÑÑйлиир түннүк улахана',
'youremail' => 'E-mail-Ñ‹Ò¥:',
-'username' => 'БÑлиÑÑ‚Ñммит аатыҥ:',
-'uid' => 'Кыттааччы ID-та:',
-'prefs-memberingroups' => 'Бу {{PLURAL:$1|бөлөххө|бөлөхтөргө}} киирÑÑ€:',
+'username' => '{{GENDER:$1|БÑлиÑÑ‚Ñммит аатыҥ}}:',
+'uid' => '{{GENDER:$1|Кыттааччы}} ID-та:',
+'prefs-memberingroups' => 'Бу {{PLURAL:$1|бөлөххө|бөлөхтөргө}} {{GENDER:$2|киирÑÑ€}}:',
'prefs-registration' => 'БÑлиÑÑ‚Ñнии кÑмÑ:',
'prefs-registration-date-time' => '$1',
'yourrealname' => 'Докумуонунан аатыҥ:',
@@ -1334,12 +1345,13 @@ $1 {{PLURAL:$1|бÑлиÑÑ‚Ñ‚Ñн|бÑлиÑÑ‚Ñ‚Ñн (буукубаттан)}}
'right-sendemail' => 'Ðтын кыттааччыларга Ñл. почтаны ыытарга',
'right-passwordreset' => 'Киирии тылы почта нөҥүө уларытыыны көрүү',
+# Special:Log/newusers
+'newuserlogpage' => 'Кыттааччылары бÑлиÑтиир Ñурунаал',
+'newuserlogpagetext' => 'Соторутааҕыта бÑлиÑÑ‚Ñммит кыттааччылар.',
+
# User rights log
'rightslog' => 'Кыттаачы бырааптарын Ñурунаала',
'rightslogtext' => 'Бу кыттааччы бырааптарын уларыйыытын көрдөрөр Ñурунаал.',
-'rightslogentry' => '$1 кыттаачы киирÑÑ€ бырааба $2-тан $3 уларыйда',
-'rightslogentry-autopromote' => 'мантан $2 аптамаатынан манна $3 көÑпүт',
-'rightsnone' => '(Ñуох)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'бу ÑирÑйи ааҕыы',
@@ -1963,8 +1975,8 @@ $1',
'linksearch-ns' => 'Ðат хочото (namespace):',
'linksearch-ok' => 'Бул',
'linksearch-text' => 'Туруоран биÑÑ€ÑÑ€ бÑлиÑлÑри туһаныахха Ñөп, холобур, "*.wikipedia.org".
-Саатар үрдүкү таһымнаах домен наада Ñбит, холобур "*.org".<br />
-Өйүүр боротокуоллар: <code>$1</code> (көрдүүргÑÑ€ балартан ханныгын да ÑбимÑ)',
+Үрдүкү таһымнаах домен көрдөнөр, холобур "*.org".<br />
+Өйөнөр боротокуоллар: <code>$1</code> (көрдүүргÑÑ€ ханнык да боротокуолу талбатаххына http:// туруоруллуо)',
'linksearch-line' => 'Мантан $2 манна $1 ыйынньык',
'linksearch-error' => 'Туруоран биÑÑ€ÑÑ€ бÑлиÑлÑри аадырыÑ/hostname Ñаҕаланыытыгар ÑÑ€Ñ Ñ‚ÑƒÑ‚Ñ‚ÑƒÐ¾Ñ…Ñ…Ð° Ñөп.',
@@ -1983,10 +1995,6 @@ $1',
'activeusers-hidesysops' => 'Дьаһабыллары көрдөрүмÑ',
'activeusers-noresult' => 'Кыттааччылар көÑтүбÑтилÑÑ€.',
-# Special:Log/newusers
-'newuserlogpage' => 'Кыттааччылары бÑлиÑтиир Ñурунаал',
-'newuserlogpagetext' => 'Соторутааҕыта бÑлиÑÑ‚Ñммит кыттааччылар.',
-
# Special:ListGroupRights
'listgrouprights' => 'Кыттааччылар бөлөхтөрүн бырааптара',
'listgrouprights-summary' => 'Манна бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ Ð±Ð°Ð°Ñ€ бөлөхтөр уонна кинилÑÑ€ киирÑÑ€ бырааптара көÑтөллөр.
@@ -2082,11 +2090,7 @@ $1',
'enotif_mailer' => '{{SITENAME}} БиллÑÑ€ÑÑ€ СулууÑпата',
'enotif_reset' => 'Бары ÑирÑйдÑри көрбүтүм курдук бÑлиÑÑ‚ÑÑ',
-'enotif_newpagetext' => 'Бу Ñаҥа ÑирÑй.',
'enotif_impersonal_salutation' => '{{SITENAME}} кыттааччыта',
-'changed' => 'уларыппыт (уларытыллыбыт)',
-'created' => 'айыллыбыт',
-'enotif_subject' => '«{{SITENAME}}» $PAGETITLE кыттааччыга Ñыһыаннаах ÑирÑйи $PAGEEDITOR кыттааччы $CHANGEDORCREATED',
'enotif_lastvisited' => 'БутÑһик киирииҥ кÑнниттÑн оҥоһуллубут уларыйыылары барытын көрөргө манна киир: $1.',
'enotif_lastdiff' => 'Уларытыыны манна көрүҥ: $1.',
'enotif_anon_editor' => 'ааттамматах кыттааччы $1',
@@ -2115,6 +2119,8 @@ $UNWATCHURL
КөмөлөһүннÑÑ€ÑÑ€ уонна быһаартарар Ñир:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'айыллыбыт',
+'changed' => 'уларыппыт (уларытыллыбыт)',
# Delete
'deletepage' => 'СирÑйи Ñот',
@@ -2298,7 +2304,7 @@ $1',
'blanknamespace' => '(Сүрүн)',
# Contributions
-'contributions' => 'Кыттааччы Ñуруйуута (вклад)',
+'contributions' => '{{GENDER:$1|Кыттааччы}} Ñуруйуута (кылаата)',
'contributions-title' => '$1 кыттааччы киллÑрбит уларытыылара',
'mycontris' => 'Суруйуу тиһигÑ',
'contribsub2' => 'Вклад $1 ($2)',
@@ -2699,7 +2705,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'JavaScript тургутуу',
-'javascripttest-disabled' => 'Дьайыы бу Ð±Ð¸Ð¸ÐºÐ¸Ð³Ñ Ð°Ñ€Ð°Ð°Ñ€Ñ‹Ð»Ð»Ñ‹Ð±Ð°Ñ‚ Ñбит.',
'javascripttest-title' => '$1 тургутуу бара турар',
'javascripttest-pagetext-noframework' => 'Бу ÑирÑй JavaScript тургутууларга анаммыт.',
'javascripttest-pagetext-unknownframework' => '"$1" тургутуу биллибÑÑ‚ ÑйгÑÑ‚Ñ.',
@@ -2841,6 +2846,10 @@ $1',
'pageinfo-magic-words' => 'Ðптаах {{PLURAL:$1|тыл|тыллар}} ($1)',
'pageinfo-hidden-categories' => 'КиÑÑ‚Ñммит {{PLURAL:$1|категориÑ|категориÑлар}} ($1)',
'pageinfo-templates' => '$1 халыыптаах ($1)',
+'pageinfo-contentpage-yes' => 'Сөп',
+'pageinfo-protect-cascading' => 'КаÑкаадынан көмүÑкÑл мантан',
+'pageinfo-protect-cascading-yes' => 'Сөп',
+'pageinfo-protect-cascading-from' => 'КаÑкадынан көмүÑкÑл мантан',
# Skin names
'skinname-standard' => 'КлаÑÑика',
@@ -3645,7 +3654,7 @@ MediaWiki туһалаах буоллун диÑн тарҕатыллар, ол
# New logging system
'logentry-delete-delete' => '$3 ÑирÑйи $1 Ñоппут',
-'logentry-delete-restore' => '$3 ÑирÑйи $1 төннөрбүт',
+'logentry-delete-restore' => '$3 ÑирÑйи $1 Ñөргүппүт',
'logentry-delete-event' => 'Сурунаал {{PLURAL:$5|Ñуругун|$5 Ñуруктарын}} көÑтүүтүн манна $3: $4 $1 уларыппыт',
'logentry-delete-revision' => 'Сурунаал {{PLURAL:$5|Ñуругун|$5 Ñуруктарын}} көÑтүүтүн бу ÑирÑÐ¹Ð³Ñ $3: $4 $1 уларыппыт',
'logentry-delete-event-legacy' => '$3 Ñурунаал Ñуруктарын көÑтүүтүн $1 уларыппыт',
@@ -3664,16 +3673,16 @@ MediaWiki туһалаах буоллун диÑн тарҕатыллар, ол
'revdelete-restricted' => 'хааччахтааһын админиÑтраатардарга Ñыһыаннаах',
'revdelete-unrestricted' => 'хааччахтааһын админÑтраатардартан уһулунна',
'logentry-move-move' => '$1 $3 ÑирÑй аатын маннык $4 уларыппыт',
-'logentry-move-move-noredirect' => '$1 $3 ÑирÑй аатын маннык $4 уларыппыт, утаарыы-ÑирÑй оҥорботох',
+'logentry-move-move-noredirect' => '$3 ÑирÑй аатын $1 маннык $4 уларыппыт, утаарыы-ÑирÑй хаалларбатах',
'logentry-move-move_redir' => '$3 ÑирÑйи $1 диÑн кыттааччы манныкка $4 уларыппыт (утаарыы үрдүнÑн)',
-'logentry-move-move_redir-noredirect' => '$1 $3 ÑирÑй аатын утаарыы үрдүнÑн маннык $4 уларыппыт, утаарыы-ÑирÑй оҥорботох',
-'logentry-patrol-patrol' => '$1 $3 ÑирÑй $4 барылын ботуруулламмыт курдук бÑлиÑÑ‚ÑÑбит',
-'logentry-patrol-patrol-auto' => '$1 $3 ÑирÑй $4 барылын аптамаатынан ботуруулламмыт курдук бÑлиÑÑ‚ÑÑбит',
-'logentry-newusers-newusers' => '$1 диÑн кыттааччы бÑлиÑÑ‚ÑннÑ',
+'logentry-move-move_redir-noredirect' => '$1 $3 ÑирÑй аатын утаарыы үрдүнÑн маннык $4 уларыппыт, утаарыы-ÑирÑй хаалларбатах',
+'logentry-patrol-patrol' => '$3 ÑирÑй $4 барылын $1 ботурууллаабыт',
+'logentry-patrol-patrol-auto' => '$3 ÑирÑй $4 барылын $1 аптамаатынан ботурууллаабыт',
+'logentry-newusers-newusers' => 'Кыттааччы $1 диÑн ааты бÑлиÑÑ‚ÑÑÑ‚Ñ',
'logentry-newusers-create' => '$1 диÑн кыттааччы бÑлиÑÑ‚ÑннÑ',
-'logentry-newusers-create2' => '$3 кыттааччыны $1 бÑлиÑÑ‚ÑÑбит',
-'logentry-newusers-autocreate' => 'Маннык аат $1 аптамаатынан бÑлиÑÑ‚ÑнилиннÑ',
-'newuserlog-byemail' => 'киирии тыл Ñл. почтаннан ыытылынна',
+'logentry-newusers-create2' => '$3 кыттааччы аатын $1 бÑлиÑÑ‚ÑÑÑ‚Ñ',
+'logentry-newusers-autocreate' => 'Маннык аат $1 аптамаатынан бÑлиÑÑ‚ÑннÑ',
+'rightsnone' => '(Ñуох)',
# Feedback
'feedback-bugornote' => 'Туох кыһалҕаны көрÑүбүккүн Ñиһилии Ñуруйар кыахтаах буоллаххына, бука диÑн [$1 Ð°Ð»Ò•Ð°Ñ Ñ‚ÑƒÒ»ÑƒÐ½Ð°Ð½ биллÑÑ€].
diff --git a/languages/messages/MessagesSat.php b/languages/messages/MessagesSat.php
index 48005da4..7060b139 100644
--- a/languages/messages/MessagesSat.php
+++ b/languages/messages/MessagesSat.php
@@ -163,7 +163,6 @@ $messages = array(
'qbbrowse' => 'Sendra',
'qbedit' => 'Tońge',
'qbpageoptions' => 'Noa sakam',
-'qbpageinfo' => 'Sakam reaḱ thuti',
'qbmyoptions' => 'In̕anḱ sakamko',
'qbspecialpages' => 'Asokay teaḱ sakamko',
'faq' => 'Baá¸ae kupuliko',
@@ -397,9 +396,6 @@ $2',
'virus-unknownscanner' => 'Baá¹… urum aná¹­vayras:',
# Login and logout pages
-'welcomecreation' => '== Johar $1! ==
-Amaḱ ekaunṭ do tearena.
-Amaḱ [[Special:Preferance {{SITENAME}} pạsindko]] thir dohoe lạgitÌte alom hiá¹›iÅ„a.',
'yourname' => 'Beoboharicaḱ ńutum',
'yourpassword' => 'Uku namber',
'yourpasswordagain' => 'Arhõ oku namber olme',
@@ -601,7 +597,6 @@ Amaḱ bodolaḱ kodo nit habićte bań rukhíạakana!",
'template-protected' => 'Rukhiạ',
'template-semiprotected' => '(Kạṭic-rukhiyạ)',
'hiddencategories' => 'Noa sakam do {{PLURAL:$1 1 ukuakan bhag $1 uku akan bhagkorenaḱ}} gaõtarenge:',
-'nocreatetitle' => 'Sakam tear do akoá¹­gea',
'nocreate-loggedin' => 'Nãwã sakam tear lạgitÌte am do ạidạri em baá¹… hoeakana.',
'sectioneditnotsupported-title' => 'Pahaá¹­a sompadona do bae hataoeda',
'sectioneditnotsupported-text' => 'Noa sompadona sakamre pahaá¹­a sompadona do bae hataoeda',
@@ -800,6 +795,9 @@ Amaḱ e-mail ṭhikạna do bań cabaḱa tinre onko do ko beohara',
'right-upload' => 'Rẽtko rakabmẽ',
'right-delete' => 'Sakamko get giá¸iymẽ',
+# Special:Log/newusers
+'newuserlogpage' => 'Laṛcaṛićaḱ tear cạbi',
+
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'noa sakam joá¹›ao',
@@ -939,9 +937,6 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
'listusers-submit' => 'Udugmẽ',
'listusers-blocked' => '(Esetgea)',
-# Special:Log/newusers
-'newuserlogpage' => 'Laṛcaṛićaḱ tear cạbi',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Gaõta',
'listgrouprights-rights' => 'Ạidạriko',
diff --git a/languages/messages/MessagesSc.php b/languages/messages/MessagesSc.php
index f5376614..7f5ef9c5 100644
--- a/languages/messages/MessagesSc.php
+++ b/languages/messages/MessagesSc.php
@@ -195,7 +195,6 @@ $messages = array(
'qbbrowse' => 'Nàviga',
'qbedit' => 'Acontza',
'qbpageoptions' => 'Possibilidades de sa pàgina',
-'qbpageinfo' => 'Cuntestu de sa pàgina',
'qbmyoptions' => 'Is preferèntzias meas',
'qbspecialpages' => 'Pàginas spetziales',
'faq' => 'Pregontas/Respostas (FAQ)',
@@ -392,11 +391,8 @@ Podet èsser stadu burradu dae calicunu àteru.',
# Login and logout pages
'logouttext' => "'''As acabadu sa sessione.'''
-Immoe podes sighire a impreare {{SITENAME}} in forma anònima, o ti podes [[Special:UserLogin|identificare torra]] comente su de prima o comente usuàriu diferente.
+Immoe podes sighire a impreare {{SITENAME}} in forma anònima, o ti podes <span class='plainlinks'>[$1 identificare torra]</span> comente su de prima o comente usuàriu diferente.
Tene contu ca is pàginas ki sunt giai abertas in àteras bentanas podent sighire a pàrrer comente cando fias identificadu, fintzas a cando non ddas renfriscas.",
-'welcomecreation' => "== Benènnidu, $1! ==
-S'account tuo est istadu creadu.
-No iscaressa de personalizare sas [[Special:Preferences|preferèntzias de {{SITENAME}}]].",
'yourname' => 'Nùmene usuàriu',
'yourpassword' => 'Password:',
'yourpasswordagain' => 'Repite sa password:',
@@ -557,7 +553,6 @@ Cun s'imbiu de custu scritu ses garantende, a responsabilidade tua, si su scritu
'template-protected' => '(amparadu)',
'template-semiprotected' => '(mesu-amparadu)',
'hiddencategories' => 'Custa pàgina faghet parte de {{PLURAL:$1|1 categoria cuada|$1 categorias cuadas}}:',
-'nocreatetitle' => 'Creatzione de pàginas limitada',
'nocreate-loggedin' => 'Non tenes su permissu de creare pàginas noas.',
'permissionserrors' => 'Faddina de permissos',
'permissionserrorstext-withaction' => 'Non tenes su permissu de $2, pro {{PLURAL:$1|custu motivu|custus motivus}}:',
@@ -777,9 +772,11 @@ Prova a seberare ''totu:'' pro chircare in totu su cuntènnidu (inclùdidas pàg
'right-undelete' => 'Restaurare una pàgina',
'right-siteadmin' => 'Bloccare e sbloccare su database',
+# Special:Log/newusers
+'newuserlogpage' => 'Usuàrios nous',
+
# User rights log
'rightslog' => 'Deretos de is usuàrios',
-'rightsnone' => '(nisciunu)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lègher custa pàgina',
@@ -1015,9 +1012,6 @@ Dia podent essere immàgines impreadas dae àteros giassos cun unu ligàmine dir
'activeusers-hidebots' => 'Cua bots',
'activeusers-hidesysops' => 'Cua amministradores',
-# Special:Log/newusers
-'newuserlogpage' => 'Usuàrios nous',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Grupu',
'listgrouprights-members' => '(lista de is cumponentes)',
@@ -1067,7 +1061,6 @@ Is mudàntzias de custa pàgina e de sa pàgina de cuntierras sua ant a bennere
'watching' => 'Giunghende a sa watchlist...',
'unwatching' => 'Boghende dae sa watchlist...',
-'enotif_newpagetext' => 'Custa est una pàgina noa.',
'enotif_impersonal_salutation' => 'Usuàriu de {{SITENAME}}',
'created' => 'creada',
@@ -1556,7 +1549,7 @@ Is acàpius chi sighint in sa matessi lìnia sunt cunsideraus comente eccetzione
'htmlform-selectorother-other' => 'Àteru',
# New logging system
-'newuserlog-byemail' => 'password imbiada via e-mail',
+'rightsnone' => '(nisciunu)',
# Search suggestions
'searchsuggest-search' => 'Chirca',
diff --git a/languages/messages/MessagesScn.php b/languages/messages/MessagesScn.php
index c57ae491..38a539f5 100644
--- a/languages/messages/MessagesScn.php
+++ b/languages/messages/MessagesScn.php
@@ -51,89 +51,104 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
- 'Allmessages' => array( 'Missaggi' ),
- 'Allpages' => array( 'TuttiLiPàggini' ),
- 'Ancientpages' => array( 'PàgginiMenuNovi' ),
- 'Blankpage' => array( 'PàgginaVacanti' ),
+ 'Activeusers' => array( 'UtentiAttivi' ),
+ 'Allmessages' => array( 'Messaggi' ),
+ 'Allpages' => array( 'TutteLePagine' ),
+ 'Ancientpages' => array( 'PagineMenoRecenti' ),
+ 'Badtitle' => array( 'TitoloErrato' ),
+ 'Blankpage' => array( 'PaginaVuota' ),
'Block' => array( 'Blocca' ),
'Blockme' => array( 'BloccaProxy' ),
'Booksources' => array( 'RicercaISBN' ),
- 'BrokenRedirects' => array( 'RinnirizzamentiSbagghiati' ),
- 'Categories' => array( 'Catigurìi' ),
- 'ChangePassword' => array( 'RimpostaPassword' ),
- 'Confirmemail' => array( 'CunfermaEmail' ),
- 'Contributions' => array( 'Cuntribbuti', 'CuntribbutiUtenti' ),
- 'CreateAccount' => array( 'CrìatiNuCuntu' ),
- 'Deadendpages' => array( 'PàgginiSenzaNisciuta' ),
- 'DeletedContributions' => array( 'CuntribbutiScancillati' ),
- 'Disambiguations' => array( 'Disambiguazzioni' ),
- 'DoubleRedirects' => array( 'RinnirizzamentiDuppi' ),
- 'Emailuser' => array( 'MannaEmail' ),
+ 'BrokenRedirects' => array( 'RedirectErrati' ),
+ 'Categories' => array( 'Categorie' ),
+ 'ChangeEmail' => array( 'CambiaEmail' ),
+ 'ChangePassword' => array( 'CambiaPassword' ),
+ 'ComparePages' => array( 'ComparaPagine' ),
+ 'Confirmemail' => array( 'ConfermaEMail' ),
+ 'Contributions' => array( 'Contributi', 'ContributiUtente', 'Edit' ),
+ 'CreateAccount' => array( 'CreaAccount' ),
+ 'Deadendpages' => array( 'PagineSenzaUscita' ),
+ 'DeletedContributions' => array( 'ContributiCancellati' ),
+ 'Disambiguations' => array( 'Disambigua' ),
+ 'DoubleRedirects' => array( 'RedirectDoppi' ),
+ 'EditWatchlist' => array( 'ModificaOsservati', 'ModificaOsservatiSpeciali', 'ModificaListaSeguiti' ),
+ 'Emailuser' => array( 'InviaEMail' ),
'Export' => array( 'Esporta' ),
- 'Fewestrevisions' => array( 'PàgginiCuCchiùPiccaRivisioni' ),
- 'Import' => array( 'Mporta' ),
- 'BlockList' => array( 'IPBluccati' ),
- 'LinkSearch' => array( 'CercaCullicamenti' ),
- 'Listadmins' => array( 'Amministratura' ),
- 'Listbots' => array( 'ListaBot' ),
- 'Listfiles' => array( 'Mmàggini' ),
- 'Listgrouprights' => array( 'AlencuPirmessiGruppi' ),
- 'Listredirects' => array( 'Rinnirizzamenti', 'ListaRinnirizzamenti' ),
- 'Listusers' => array( 'Utilizzatura', 'ListaUtilizzatura' ),
- 'Lockdb' => array( 'BloccaDB', 'BloccaDatabase' ),
- 'Log' => array( 'Riggistri', 'Riggistru' ),
- 'Lonelypages' => array( 'PàgginiOrfani' ),
- 'Longpages' => array( 'PàgginiCchiùLonghi' ),
- 'MergeHistory' => array( 'UnìficaCrunuluggìa' ),
+ 'Fewestrevisions' => array( 'PagineConMenoRevisioni' ),
+ 'FileDuplicateSearch' => array( 'CercaFileDuplicati' ),
+ 'Filepath' => array( 'Percorso' ),
+ 'Import' => array( 'Importa' ),
+ 'Invalidateemail' => array( 'InvalidaEMail' ),
+ 'JavaScriptTest' => array( 'TestJavaScript' ),
+ 'BlockList' => array( 'IPBloccati', 'ElencoBlocchi', 'Blocchi' ),
+ 'LinkSearch' => array( 'CercaCollegamenti', 'CercaLink' ),
+ 'Listadmins' => array( 'Amministratori', 'ElencoAmministratori', 'Admin', 'Sysop', 'Cricca' ),
+ 'Listbots' => array( 'Bot', 'ElencoBot' ),
+ 'Listfiles' => array( 'File', 'Immagini' ),
+ 'Listgrouprights' => array( 'ElencoPermessiGruppi', 'Privilegi' ),
+ 'Listredirects' => array( 'Redirect', 'ElencoRedirect' ),
+ 'Listusers' => array( 'Utenti', 'ElencoUtenti' ),
+ 'Lockdb' => array( 'BloccaDB' ),
+ 'Log' => array( 'Registri', 'Registro' ),
+ 'Lonelypages' => array( 'PagineOrfane' ),
+ 'Longpages' => array( 'PaginePiùLunghe' ),
+ 'MergeHistory' => array( 'FondiCronologia', 'UnificaCronologia' ),
'MIMEsearch' => array( 'RicercaMIME' ),
- 'Mostcategories' => array( 'PàgginiCuCchiossaiCatigurìi' ),
- 'Mostimages' => array( 'MmàgginiCchiùRichiamati' ),
- 'Mostlinked' => array( 'PàgginiCchiùRichiamati' ),
- 'Mostlinkedcategories' => array( 'CatigurìiCchiùRichiamati' ),
- 'Mostlinkedtemplates' => array( 'TemplateCchiùRichiamati' ),
- 'Mostrevisions' => array( 'PàgginiCuCchiossaiRivisioni' ),
- 'Movepage' => array( 'Sposta', 'Rinòmina' ),
- 'Mycontributions' => array( 'CuntribbutiMei' ),
- 'Mypage' => array( 'MèPàgginaUtenti' ),
- 'Mytalk' => array( 'DiscussioniMei' ),
- 'Newimages' => array( 'MmàgginiRicenti' ),
- 'Newpages' => array( 'PàgginiCchiùNovi' ),
- 'Popularpages' => array( 'PàgginiCchiùVisitati' ),
- 'Preferences' => array( 'Prifirenzi' ),
- 'Prefixindex' => array( 'Prifissi' ),
- 'Protectedpages' => array( 'PàgginiPrutiggiuti' ),
- 'Protectedtitles' => array( 'TìtuliPrutiggiuti' ),
- 'Randompage' => array( 'PàgginaAmmuzzu' ),
- 'Randomredirect' => array( 'RedirectAmmuzzu' ),
- 'Recentchanges' => array( 'ÙrtimiCanciamenti' ),
- 'Recentchangeslinked' => array( 'CanciamentiCurrilati' ),
- 'Revisiondelete' => array( 'ScancellaRivisioni' ),
- 'Search' => array( 'Ricerca', 'Cerca' ),
- 'Shortpages' => array( 'PàgginiCchiùCurti' ),
- 'Specialpages' => array( 'PàgginiSpiciali' ),
- 'Statistics' => array( 'Statìstichi' ),
- 'Uncategorizedcategories' => array( 'CatigurìiSenzaCatigurìi' ),
- 'Uncategorizedimages' => array( 'MmàgginiSenzaCatigurìi' ),
- 'Uncategorizedpages' => array( 'PàgginiSenzaCatigurìi' ),
- 'Uncategorizedtemplates' => array( 'TemplateSenzaCatigurìi' ),
- 'Undelete' => array( 'Riprìstina' ),
- 'Unlockdb' => array( 'SbloccaDB', 'SbloccaDatabase' ),
- 'Unusedcategories' => array( 'CatigurìiNonUsati' ),
- 'Unusedimages' => array( 'MmàgginiNonUsati' ),
- 'Unusedtemplates' => array( 'TemplateNunUsati' ),
- 'Unwatchedpages' => array( 'PàgginiNunTaliati' ),
- 'Upload' => array( 'Càrrica' ),
- 'Userlogin' => array( 'Tràsi', 'Login' ),
- 'Userlogout' => array( 'Nesci', 'Logout' ),
- 'Userrights' => array( 'PirmessiUtenti' ),
- 'Version' => array( 'Virsioni' ),
- 'Wantedcategories' => array( 'CatigurìiAddumannati' ),
- 'Wantedfiles' => array( 'FileAddumannati' ),
- 'Wantedpages' => array( 'PàgginiAddumannati' ),
- 'Wantedtemplates' => array( 'TemplateAddumannati' ),
- 'Watchlist' => array( 'ArtìculiTaliati' ),
- 'Whatlinkshere' => array( 'ChiPuntaCcà' ),
- 'Withoutinterwiki' => array( 'SenzaInterwiki' ),
+ 'Mostcategories' => array( 'PagineConPiùCategorie' ),
+ 'Mostimages' => array( 'ImmaginiPiùRichiamate' ),
+ 'Mostinterwikis' => array( 'InterwikiPiùRichiamati' ),
+ 'Mostlinked' => array( 'PaginePiùRichiamate' ),
+ 'Mostlinkedcategories' => array( 'CategoriePiùRichiamate' ),
+ 'Mostlinkedtemplates' => array( 'TemplatePiùRichiamati' ),
+ 'Mostrevisions' => array( 'PagineConPiùRevisioni' ),
+ 'Movepage' => array( 'Sposta', 'Rinomina' ),
+ 'Mycontributions' => array( 'MieiContributi' ),
+ 'Mypage' => array( 'MiaPaginaUtente', 'MiaPagina' ),
+ 'Mytalk' => array( 'MieDiscussioni' ),
+ 'Myuploads' => array( 'MieiUpload', 'MieiEdit' ),
+ 'Newimages' => array( 'ImmaginiRecenti' ),
+ 'Newpages' => array( 'PaginePiùRecenti' ),
+ 'PasswordReset' => array( 'ReimpostaPassword' ),
+ 'PermanentLink' => array( 'LinkPermanente' ),
+ 'Popularpages' => array( 'PaginePiùVisitate' ),
+ 'Preferences' => array( 'Preferenze' ),
+ 'Prefixindex' => array( 'Prefissi' ),
+ 'Protectedpages' => array( 'PagineProtette' ),
+ 'Protectedtitles' => array( 'TitoliProtetti' ),
+ 'Randompage' => array( 'PaginaCasuale' ),
+ 'Randomredirect' => array( 'RedirectCasuale' ),
+ 'Recentchanges' => array( 'UltimeModifiche' ),
+ 'Recentchangeslinked' => array( 'ModificheCorrelate' ),
+ 'Revisiondelete' => array( 'CancellaRevisione' ),
+ 'Search' => array( 'Arriscedi', 'Cerca', 'Trova' ),
+ 'Shortpages' => array( 'PaginePiùCorte' ),
+ 'Specialpages' => array( 'PagineSpeciali' ),
+ 'Statistics' => array( 'Statistiche' ),
+ 'Tags' => array( 'Etichette', 'Tag' ),
+ 'Unblock' => array( 'ElencoSblocchi', 'Sblocchi' ),
+ 'Uncategorizedcategories' => array( 'CategorieSenzaCategorie' ),
+ 'Uncategorizedimages' => array( 'ImmaginiSenzaCategorie' ),
+ 'Uncategorizedpages' => array( 'PagineSenzaCategorie' ),
+ 'Uncategorizedtemplates' => array( 'TemplateSenzaCategorie' ),
+ 'Undelete' => array( 'Ripristina' ),
+ 'Unlockdb' => array( 'SbloccaDB' ),
+ 'Unusedcategories' => array( 'CategorieNonUsate', 'CategorieVuote' ),
+ 'Unusedimages' => array( 'ImmaginiNonUsate' ),
+ 'Unusedtemplates' => array( 'TemplateNonUsati' ),
+ 'Unwatchedpages' => array( 'PagineNonOsservate' ),
+ 'Upload' => array( 'Carica' ),
+ 'Userlogin' => array( 'Entra', 'Login' ),
+ 'Userlogout' => array( 'Esci', 'Logout' ),
+ 'Userrights' => array( 'PermessiUtente' ),
+ 'Version' => array( 'Versione' ),
+ 'Wantedcategories' => array( 'CategorieRichieste' ),
+ 'Wantedfiles' => array( 'FileRichiesti' ),
+ 'Wantedpages' => array( 'PagineRichieste' ),
+ 'Wantedtemplates' => array( 'TemplateRichiesti' ),
+ 'Watchlist' => array( 'OsservatiSpeciali' ),
+ 'Whatlinkshere' => array( 'PuntanoQui' ),
+ 'Withoutinterwiki' => array( 'PagineSenzaInterwiki' ),
);
$messages = array(
@@ -281,7 +296,6 @@ $messages = array(
'qbbrowse' => 'Sfogghia',
'qbedit' => 'Cancia',
'qbpageoptions' => 'Opzioni pàggina',
-'qbpageinfo' => 'Nfurmazzioni supra la pàggina',
'qbmyoptions' => 'Li mè pàggini',
'qbspecialpages' => 'Pàggini spiciali',
'faq' => 'Dumanni cumuni',
@@ -521,11 +535,9 @@ La mutivazzioni è chista: ''$2''.",
# Login and logout pages
'logouttext' => "'''Nisciuta. Ora siti fora.'''
-Poi cuntinuari a usari {{SITENAME}} di manera anònima, o poi [[Special:UserLogin|tràsiri n'àutra vota]] cu lu stissu o cu n'àutru nomu d'utenti.
+Poi cuntinuari a usari {{SITENAME}} di manera anònima, o poi <span class='plainlinks'>[$1 tràsiri n'àutra vota]</span> cu lu stissu o cu n'àutru nomu d'utenti.
Accura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun avissi nisciutu nzinu a quannu tu nun scancelli tutta la mimoria dû tò browser.",
-'welcomecreation' => "== Bonvinutu, $1! ==
-
-L'account hà statu criatu currettamenti. Nun ti scurdari di pirsunalizzari li [[Special:Preferences|prifirenzi di {{SITENAME}}]].",
+'welcomeuser' => 'Bommegna, $1!',
'yourname' => "Lu tò nomu d'utenti (''user name'')",
'yourpassword' => "La tò ''password''",
'yourpasswordagain' => "Scrivi la password n'àutra vota",
@@ -767,7 +779,6 @@ L'amministraturi ca bluccau lu database lu fici pi stu mutivu: $1",
'template-semiprotected' => '(semiprutettu)',
'hiddencategories' => 'Sta pàggina apparteni a {{PLURAL:$1|na catigurìa ammuciata|$1 catigurìi ammuciati}}:',
'edittools' => '<!-- Chistu testu cumpari sutta li moduli di canciu e carricamentu. -->',
-'nocreatetitle' => 'Criazzioni dî pàggini limitata',
'nocreatetext' => "La pussibbilitati di criari pàggini novi nta {{SITENAME}} è limitata a l'utenti riggistrati. Poi turnari 'n arreri e canciari na pàggina esistenti, oppuru [[Special:UserLogin|tràsiri o criari nu cuntu novu]].",
'nocreate-loggedin' => 'Nun hai lu pirmissu pi criari pàggini novi ntâ {{SITENAME}}.',
'permissionserrors' => 'Erruri di pirmissu',
@@ -1238,11 +1249,13 @@ L'operazioni nun pò èssiri annullata.",
'right-siteadmin' => 'Blocca a sblocca lu databasi',
'right-override-export-depth' => 'Esporta pàggini cumpresi li pàggini culligati finu ô quintu liveddu',
+# Special:Log/newusers
+'newuserlogpage' => 'Novi utenti',
+'newuserlogpagetext' => 'Di sècutu vènunu elincati li criazzioni di cunti novi (account).',
+
# User rights log
'rightslog' => "Dritti di l'utenti",
'rightslogtext' => "Chistu è un log dî canciamenti a li dritti di l'utenti.",
-'rightslogentry' => "hà canciatu l'appartinenza di $1 dû gruppu $2 a lu gruppu $3",
-'rightsnone' => '(nuddu)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lèggiri sta pàggina',
@@ -1722,10 +1735,6 @@ Protucolli suppurtati: <code>$1</code>',
'activeusers-hidesysops' => 'Amministratura ammucciati',
'activeusers-noresult' => 'Nussun utenti truvatu.',
-# Special:Log/newusers
-'newuserlogpage' => 'Novi utenti',
-'newuserlogpagetext' => 'Di sècutu vènunu elincati li criazzioni di cunti novi (account).',
-
# Special:ListGroupRights
'listgrouprights' => 'Diritti dô gruppu utenti',
'listgrouprights-summary' => "Ccà sutta sunnu elincati li gruppi utenti difiniti pi sta wiki, cu li dritti d'accessu assuciati a iddi. Pi sapìrinni chiossai supra li dritti, lèggiti [[{{MediaWiki:Listgrouprights-helppage}}|sta pàggina]].",
@@ -1802,11 +1811,7 @@ Protucolli suppurtati: <code>$1</code>',
'enotif_mailer' => 'Sistema di nutìfica via e-mail di {{SITENAME}}',
'enotif_reset' => 'Segna tutti li pàggini comu già visitati',
-'enotif_newpagetext' => 'Chista è na pàggina nova.',
'enotif_impersonal_salutation' => 'Utenti di {{SITENAME}}',
-'changed' => 'canciatu',
-'created' => 'criatu',
-'enotif_subject' => 'La pàggina $PAGETITLE di {{SITENAME}} hà stata $CHANGEDORCREATED di $PAGEEDITOR',
'enotif_lastvisited' => 'Cunzurta $1 pi vìdiri tutti li canciamenti dâ tò ùrtima vìsita.',
'enotif_lastdiff' => 'Vìdiri $1 pi visualizzari lu canciamentu.',
'enotif_anon_editor' => 'utenti anonimu $1',
@@ -1832,6 +1837,8 @@ Pi mudificari li mpustazzioni dâ lista di l\'ussirvati spiciali, vìsita
Pi dari lu tò feedback e arricèviri ultiriuri assistenza:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'criatu',
+'changed' => 'canciatu',
# Delete
'deletepage' => 'Elìmina la pàggina',
@@ -2400,6 +2407,9 @@ Visita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//trans
'spam_reverting' => "Ripristinata l'ùrtima virsioni priva di culligamenti a $1",
'spam_blanking' => 'Pàggina svacantata, tutti li virsioni cuntinìanu culligamenti a $1',
+# Info page
+'pageinfo-toolboxlink' => 'Nfurmazzioni ncapu la pàggina',
+
# Skin names
'skinname-standard' => 'Classicu',
'skinname-nostalgia' => 'Nustargìa',
@@ -2988,7 +2998,7 @@ Mèttiri lu nomu dû file senza lu prifissu "{{ns:file}}:"',
'revdelete-unrestricted' => 'ristrizzioni pi suli amministraturi rimossi',
'logentry-move-move' => '$1 spustau la pàggina $3 a $4',
'logentry-newusers-create' => '$1 criau na utenza',
-'newuserlog-byemail' => 'password mannata via mail',
+'rightsnone' => '(nuddu)',
# Search suggestions
'searchsuggest-search' => 'Risciduta',
diff --git a/languages/messages/MessagesSco.php b/languages/messages/MessagesSco.php
index 6bf76425..556670ba 100644
--- a/languages/messages/MessagesSco.php
+++ b/languages/messages/MessagesSco.php
@@ -159,7 +159,6 @@ $messages = array(
'qbbrowse' => 'Brouse',
'qbedit' => 'Edit',
'qbpageoptions' => 'This page',
-'qbpageinfo' => 'Context',
'qbmyoptions' => 'Ma pages',
'qbspecialpages' => 'Byordinar pages',
'faq' => 'ASQ',
@@ -372,10 +371,6 @@ The grunds for this are: ''$2''.",
Ye can continue to uise {{SITENAME}} namelessly, or ye can log in again as the same or as a different uiser.
Mynd that some pages micht continue tae be displayed as if ye war aye loggit in, till ye clear yer brouser cache.",
-'welcomecreation' => '== Guid tae see ye, $1! ==
-
-Yer accoont haes been creatit.
-Mynd an chynge yer [[Special:Preferences|{{SITENAME}} preferences]].',
'yourname' => 'Yer uiser name',
'yourpassword' => 'Passwaird:',
'yourpasswordagain' => 'Retype passwaird:',
@@ -600,7 +595,6 @@ lang, an that's langer than the maximum of $2 kilobytes. It canna be hained.'''"
'template-protected' => '(protectit)',
'template-semiprotected' => '(semi-protectit)',
'hiddencategories' => 'This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:',
-'nocreatetitle' => 'Page makkin limitit',
'nocreatetext' => 'This site haes restrictit the ability to mak new pages.
Ye can go back an eik tae an existing page, or [[Special:UserLogin|log in or mak an accoont]].',
'nocreate-loggedin' => 'Ye dinnae hae the richts tae mak new pages on this wiki.',
@@ -813,6 +807,9 @@ Yer e-mail address insae revealed whin ither uisers contact ye.",
# Rights
'right-delete' => 'Delete pages',
+# Special:Log/newusers
+'newuserlogpage' => 'Uiser creation log',
+
# User rights log
'rightslog' => 'Uiser richts log',
'rightslogtext' => 'This is a log o chynges tae uiser richts.',
@@ -1059,9 +1056,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'Shaw',
'listusers-blocked' => '(blockit)',
-# Special:Log/newusers
-'newuserlogpage' => 'Uiser creation log',
-
# Special:ListGroupRights
'listgrouprights-members' => '(leet o members)',
@@ -1099,10 +1093,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
'unwatching' => 'Unwatchin...',
'enotif_reset' => 'Merk aa pages visitit',
-'changed' => 'chynged',
-'created' => 'creatit',
-'enotif_subject' => '{{SITENAME}} page $PAGETITLE haes been $CHANGEDORCREATED bi $PAGEEDITOR',
'enotif_lastvisited' => 'Hae a leuk at $1 for aa chynges sin yer last visit.',
+'created' => 'creatit',
+'changed' => 'chynged',
# Delete
'deletepage' => 'Delete page',
diff --git a/languages/messages/MessagesSd.php b/languages/messages/MessagesSd.php
index 2a62e5b9..1e83fcaa 100644
--- a/languages/messages/MessagesSd.php
+++ b/languages/messages/MessagesSd.php
@@ -713,9 +713,8 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننÚÙŠ هوڻ گھرجي.',
'watching' => 'ٽيٽيندي...',
'unwatching' => 'اڻ ٽيٽيندي...',
-'enotif_newpagetext' => 'هيء٠هڪ نئون صÙحو آهي.',
-'changed' => 'تبديل ٿي ويو',
'created' => 'ٺهي چڪو',
+'changed' => 'تبديل ٿي ويو',
# Delete
'deletepage' => 'صÙحو ڊاهيو',
diff --git a/languages/messages/MessagesSdc.php b/languages/messages/MessagesSdc.php
index 22f3274d..e09bb1f6 100644
--- a/languages/messages/MessagesSdc.php
+++ b/languages/messages/MessagesSdc.php
@@ -230,7 +230,6 @@ $messages = array(
'qbbrowse' => 'Iffuglia',
'qbedit' => 'Mudifigga',
'qbpageoptions' => 'Prifirenzi pàgina',
-'qbpageinfo' => "Infuimmazioni i' la pàgina",
'qbmyoptions' => "Li me' pàgini",
'qbspecialpages' => 'Pàgini ippiziari',
'faq' => 'FAQ (infuimmazioni e aggiuddu)',
@@ -437,9 +436,6 @@ La rasgioni frunidda è ''$2''.",
Si pò sighì a usà {{SITENAME}} cumenti utenti anònimu oppuru eseguì una noba intradda, cu' lu matessi innòmu utenti o un'innòmu dibessu.
Zerthuni pàgini pudìani continuà a apparì cumenti si la iscidda nò fùssia avvinudda finaghì nò vèni puridda la mimória cache di lu propriu nabiggadori.",
-'welcomecreation' => '== Binvinuddu, $1! ==
-
-La registhrazioni è isthadda criadda currettamenti. No dimintiggà di passunarizzà li prifirenzi di {{SITENAME}}.',
'yourname' => 'Innòmu utenti',
'yourpassword' => "Paràura d'órdhini",
'yourpasswordagain' => "Ripeti la paràura d'órdhini",
@@ -656,7 +652,6 @@ Inviendi lu testhu ài la ripunsabiriddai chi lu testhu sia toiu oppuru sia i lu
'template-semiprotected' => '(mezu-prutiggiddu)',
'hiddencategories' => 'Chistha pagina appartheni a {{PLURAL:$1|una categuria cuadda|$1 categurì cuaddi}}:',
'edittools' => '<!-- Testhu chi appari in giossu lu mòdulu di mudìfiga e di carriggamentu. -->',
-'nocreatetitle' => 'Criazioni di li pàgini limitadda',
'nocreatetext' => '{{SITENAME}} à limitaddu la pussibiliddai di crià nobi pagini a li sori utenti registhraddi. È pussìbiri turrà indareddu e mudìfiggà una pàgina esisthenti, oppuru [[Special:UserLogin|intrà o crià una noba registhrazioni]].',
'nocreate-loggedin' => 'No si diponi di li pimmissi nezzessàri pa crià nobi pàgini in {{SITENAME}}.',
'permissionserrors' => 'Errori i li pimmissi',
@@ -911,11 +906,12 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
'grouppage-sysop' => '{{ns:project}}:Amministhradori',
'grouppage-bureaucrat' => '{{ns:project}}:Buròcrati',
+# Special:Log/newusers
+'newuserlogpage' => 'Nobi utenti',
+
# User rights log
'rightslog' => 'Diritti di li utenti',
'rightslogtext' => "Chisthu è lu rigisthru di lu mudìfigghi a li diritti assignaddi a l'utenti.",
-'rightslogentry' => "à mudìfiggaddu l'apparthinènzia di $1 da lu gruppu $2 a lu gruppu $3",
-'rightsnone' => '(nisciunu)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'mudìfiggà chistha pàgina',
@@ -1246,9 +1242,6 @@ Also see [[Special:WantedCategories|wanted categories]].",
'listusers-submit' => 'Musthra',
'listusers-noresult' => 'Nisciun utenti curripundi a li critéri impusthaddi.',
-# Special:Log/newusers
-'newuserlogpage' => 'Nobi utenti',
-
# Special:ListGroupRights
'listgrouprights-members' => '(erencu di li membri)',
@@ -1308,11 +1301,7 @@ Si daboi s'à gana d'eliminà la pàgina da la listha di l'abbaidaddi ippiziarii
'enotif_mailer' => 'Sisthema di nutìfica via postha erettrònica di {{SITENAME}}',
'enotif_reset' => 'Signa tutti li pàgini cumenti già visitaddi',
-'enotif_newpagetext' => 'Chistha è una pàgina nóba.',
'enotif_impersonal_salutation' => 'Utenti di {{SITENAME}}',
-'changed' => 'ciambadda',
-'created' => 'criadda',
-'enotif_subject' => 'La pàgina $PAGETITLE di {{SITENAME}} è isthadda $CHANGEDORCREATED da $PAGEEDITOR',
'enotif_lastvisited' => "Cunsultha $1 pa vidé tutti li mudìfigghi da l'ulthima visita tóia.",
'enotif_lastdiff' => 'Vidé $1 pa visuarizzà la mudìfigga.',
'enotif_anon_editor' => 'utenti anònimu $1',
@@ -1339,6 +1328,8 @@ Pa mudìfiggà l\'impusthazioni di la listha di l\'abbaidaddi ippiziari, visita
Pa dì cosa ni pensi e dumandà assisthènzia:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'criadda',
+'changed' => 'ciambadda',
# Delete
'deletepage' => 'Canzella pàgina',
@@ -2048,4 +2039,7 @@ Pa piazeri, cunfèimma chi vòi ricrià avveru chistha pàgina.",
'htmlform-reset' => 'Annulla mudifigghi',
'htmlform-selectorother-other' => 'Althru',
+# New logging system
+'rightsnone' => '(nisciunu)',
+
);
diff --git a/languages/messages/MessagesSe.php b/languages/messages/MessagesSe.php
index 01e07065..d9b0d844 100644
--- a/languages/messages/MessagesSe.php
+++ b/languages/messages/MessagesSe.php
@@ -43,55 +43,86 @@ $namespaceAliases = array(
$specialPageAliases = array(
'Activeusers' => array( 'Aktiivvalaš_geavaheaddjit' ),
- 'Allmessages' => array( 'Buot_systemasánit' ),
+ 'Allmessages' => array( 'Buot_systemadieđáhusat', 'Buot_vuogádatdieđáhusat' ),
'Allpages' => array( 'Buot_siiddut' ),
'Ancientpages' => array( 'Dološ_siiddut' ),
- 'Block' => array( 'Cagge_geavaheaddji' ),
+ 'Badtitle' => array( 'Veadjemeahttun_bajilÄála' ),
+ 'Blankpage' => array( 'Guoros_siidu' ),
+ 'Block' => array( 'Hehtte', 'Hehtte_geavaheaddji', 'Hehtte_IP' ),
+ 'Blockme' => array( 'Hehtte_mu' ),
'Booksources' => array( 'Girjegáldut' ),
+ 'BrokenRedirects' => array( 'Feaillalaš_stivremat', 'Feaillalaš_ođđasitstivremat' ),
'Categories' => array( 'Kategoriijat' ),
- 'Contributions' => array( 'Geavaheaddji_rievdadusat' ),
+ 'ComparePages' => array( 'Veardit_siidduid' ),
+ 'Confirmemail' => array( 'Sihkaraste_e-poastta' ),
+ 'Contributions' => array( 'Rievdadusat' ),
+ 'CreateAccount' => array( 'Ráhkat_dovddaldaga' ),
+ 'DeletedContributions' => array( 'Sihkkojuvvon_rievdadusat' ),
'Disambiguations' => array( 'Liŋkkat_dárkonsiidduide' ),
'DoubleRedirects' => array( 'Guoktegeardásaš_ođđasitstivremat' ),
- 'Emailuser' => array( 'SáddeEpoastta' ),
+ 'EditWatchlist' => array( 'Rievdat_Äuovvunlisttu' ),
+ 'Emailuser' => array( 'Sádde_e-poastta' ),
'Export' => array( 'Olggosfievrrit_siidduid' ),
+ 'Import' => array( 'Sisafievrrit' ),
+ 'BlockList' => array( 'Hehttenlistu', 'Listu_hehttemiin' ),
+ 'Listadmins' => array( 'Administráhtorlistu', 'Listu_administráhtoriin' ),
+ 'Listbots' => array( 'Bohttalistu', 'Listu_bohtain' ),
'Listfiles' => array( 'Fiilalogahallan' ),
- 'Listredirects' => array( 'Listu_ođđasitstivremiin' ),
- 'Listusers' => array( 'Listu_geavaheddjiin' ),
+ 'Listgrouprights' => array( 'Listu_joavkkuid_vuoigavuođain' ),
+ 'Listredirects' => array( 'Stivrenlistu', 'Listu_stivremiin', 'Listu_ođđasitstivremiin' ),
+ 'Listusers' => array( 'Geavaheaddjelistu', 'Listu_geavaheddjiin' ),
'Log' => array( 'Loggat', 'Logga' ),
'Lonelypages' => array( 'Oarbbes_siiddut' ),
'Longpages' => array( 'Guhkes_siiddut' ),
'MIMEsearch' => array( 'MIME-ohcan' ),
- 'Newimages' => array( 'OÄ‘Ä‘a_govat' ),
+ 'Movepage' => array( 'Sirdde_siiddu' ),
+ 'Mycontributions' => array( 'Mu_rievdadusat' ),
+ 'Mypage' => array( 'Mu_siidu' ),
+ 'Mytalk' => array( 'Mu_ságastallan' ),
+ 'Newimages' => array( 'OÄ‘Ä‘a_govat', 'OÄ‘Ä‘a_fiillat' ),
'Newpages' => array( 'OÄ‘Ä‘a_siiddut' ),
- 'Preferences' => array( 'Válljemat' ),
+ 'Popularpages' => array( 'Bivnnuhis_siiddut' ),
+ 'Preferences' => array( 'Válljemat', 'Ãsahusat' ),
'Protectedpages' => array( 'Suodjaluvvon_siiddut' ),
- 'Randompage' => array( 'Summal_siidu' ),
+ 'Protectedtitles' => array( 'Suodjaluvvon_bajilÄállagat', 'Suodjaluvvon_siidonamat' ),
+ 'Randompage' => array( 'Summal', 'Summal_siidu' ),
'Randomredirect' => array( 'Summal_ođđasitstivren' ),
'Recentchanges' => array( 'Varas_rievdadusat' ),
+ 'Revisiondelete' => array( 'Sihko_veršuvnna' ),
'Search' => array( 'Oza' ),
'Shortpages' => array( 'Oanehis_siiddut' ),
- 'Specialpages' => array( 'Erenoamáš_siiddut' ),
+ 'Specialpages' => array( 'Erenoamáš_siiddut', 'Doaibmasiiddut' ),
'Statistics' => array( 'Statistihkat' ),
- 'Uncategorizedcategories' => array( 'Klassifiserekeahtes_kategoriijat' ),
- 'Uncategorizedimages' => array( 'Klassifiserekeahtes_govat' ),
- 'Uncategorizedpages' => array( 'Klassifiserekeahtes_siiddut' ),
- 'Uncategorizedtemplates' => array( 'Klassifiserekeahtes_mállevuođut' ),
- 'Unusedcategories' => array( 'Geavatkeahtes_lágit' ),
- 'Unusedimages' => array( 'Geavatkeahtes_govat' ),
- 'Unusedtemplates' => array( 'Geavatkeahtes_mállevuođut' ),
- 'Unwatchedpages' => array( 'ÄŒuovvotkeahtes_siiddut' ),
+ 'Unblock' => array( 'Sihko_hehttema' ),
+ 'Uncategorizedcategories' => array( 'Kategoriserekeahtes_kategoriijat' ),
+ 'Uncategorizedimages' => array( 'Kategoriserekeahtes_govat', 'Kategoriserekeahtes_fiillat' ),
+ 'Uncategorizedpages' => array( 'Kategoriserekeahtes_siiddut' ),
+ 'Uncategorizedtemplates' => array( 'Kategoriserekeahtes_mállet' ),
+ 'Undelete' => array( 'Máhccat' ),
+ 'Unusedcategories' => array( 'Geavatkeahtes_kategoriijat' ),
+ 'Unusedimages' => array( 'Geavatkeahtes_govat', 'Geavatkeahtes_fiillat' ),
+ 'Unusedtemplates' => array( 'Geavatkeahtes_mállet' ),
+ 'Unwatchedpages' => array( 'ÄŒuovotkeahtes_siiddut' ),
'Upload' => array( 'Sádde_fiilla' ),
+ 'Userlogin' => array( 'Logge_sisa' ),
+ 'Userlogout' => array( 'Logge_olggos' ),
+ 'Userrights' => array( 'Geavaheaddjevuoigatvuođat' ),
'Version' => array( 'Veršuvdna' ),
'Wantedcategories' => array( 'Kategoriijasávaldagat' ),
- 'Wantedpages' => array( 'Siidusávaldagat' ),
+ 'Wantedfiles' => array( 'Fiilasávaldagat', 'Govvasávaldagat' ),
+ 'Wantedpages' => array( 'Siidosávaldagat' ),
+ 'Wantedtemplates' => array( 'Mállesávaldagat' ),
'Watchlist' => array( 'ÄŒuovvunlistu' ),
+ 'Withoutinterwiki' => array( 'Interwikihis_siiddut', 'Giellaliŋkkahis_siiddut', 'Giellaleaŋkkahis_siiddut' ),
);
$magicWords = array(
- 'redirect' => array( '0', '#OÄÄASITSTIVREN', '#STIVREN', '#REDIRECT' ),
+ 'redirect' => array( '0', '#STIVREN', '#OÄÄASITSTIVREN', '#REDIRECT' ),
'numberofarticles' => array( '1', 'ARTIHKKALIIDMEARRI', 'NUMBEROFARTICLES' ),
);
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
+
$linkTrail = '/^(:?[a-zàáâçÄʒǯđðéèêëǧǥȟíìîïıǩŋñóòôõßšŧúùûýÿüžþæøåäö]+)(.*)$/sDu';
$messages = array(
@@ -206,7 +237,6 @@ $messages = array(
'qbbrowse' => 'Bláđe',
'qbedit' => 'Rievdat',
'qbpageoptions' => 'Siidoásahusat',
-'qbpageinfo' => 'Siiddu dieđut',
'qbmyoptions' => 'Ãsahusat',
'qbspecialpages' => 'Doaibmasiiddut',
@@ -357,9 +387,6 @@ $messages = array(
'logouttext' => "'''Don leat dál loggen olggos {{GRAMMAR:elative|{{SITENAME}}}}s.'''
Sáhtát joatkit {{GRAMMAR:genitive|{{SITENAME}}}} geavaheami anonyman dahje logget ođđasit sisa",
-'welcomecreation' => '== Bures boahtin, $1! ==
-Du geavaheaddjidovddaldat lea dál anus.
-Ãle vajáldahte rievdadit {{GRAMMAR:genitive|{{SITENAME}}}} iežat ásahusaid.',
'yourname' => 'Geavaheaddjidovddaldat',
'yourpassword' => 'Suollemassátni:',
'yourpasswordagain' => 'Čále suollemassáni ođđasit:',
@@ -494,7 +521,6 @@ Don fertet dahkat du rievdadusaid dálá tekstii.
'template-protected' => '(suodjáluvvon)',
'template-semiprotected' => '(suodjáluvvon anonyma ja ođđa geavaheddjiin)',
'edittools' => '<!-- Teaksta mii lea dás, Äájehuvvo rievdadanskovi vuolábealde. -->',
-'nocreatetitle' => 'Siidduid álggaheapmi lea ráddjejuvvon',
# Account creation failure
'cantcreateaccounttitle' => 'Dovddaldaga ráhkadeapmi ii lihkosmuvvan',
@@ -684,8 +710,6 @@ $1 {{int:pipe-separator}} $2',
# User rights log
'rightslog' => 'Logga geavaheaddjirievttiin',
'rightslogtext' => 'Vuolábealde lea logga geavaheaddjirivttiid rievdadusain.',
-'rightslogentry' => 'Geavaheaddji $1 rievttit rievdaduvvoi joavkkuin $2 joavkkuide $3',
-'rightsnone' => '(eai rievttit)',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|rievdadus|rievdadusa}}',
@@ -1016,14 +1040,12 @@ Also see [[Special:WantedCategories|wanted categories]].',
'enotif_mailer' => '{{GRAMMAR:genitive|{{SITENAME}}}} siidu lea rievdaduvvon -almmuhus',
'enotif_reset' => 'Merke buot siidduid gehÄÄojuvvon',
-'enotif_newpagetext' => 'Dát lea ođđa siidu.',
'enotif_impersonal_salutation' => '{{SITENAME}}-geavaheaddji',
-'changed' => 'rievdadan siiddu',
-'created' => 'álggahan siiddu',
-'enotif_subject' => '$PAGEEDITOR on $CHANGEDORCREATED $PAGETITLE',
'enotif_lastvisited' => 'Čujuhusas $1 leat buot rievdadusat du maŋimus geavahangearddi maŋŋá.',
'enotif_lastdiff' => 'Rievdadus lea Äujuhusas $1.',
'enotif_anon_editor' => 'registereretkeahtes geavaheaddji $1',
+'created' => 'álggahan siiddu',
+'changed' => 'rievdadan siiddu',
# Delete
'deletepage' => 'Sihko siiddu',
@@ -1445,6 +1467,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
'logentry-move-move_redir-noredirect' => '$1 sirddii siiddu $3 nammii $4 iige ráhkadan ođđasitstivrema',
'logentry-newusers-create' => '$1 ráhkadii dovddaldaga',
'logentry-newusers-autocreate' => 'Dovddaldat $1 ráhkaduvvui automáhtalaÄÄat',
+'rightsnone' => '(eai rievttit)',
# Search suggestions
'searchsuggest-search' => 'Oza',
diff --git a/languages/messages/MessagesSei.php b/languages/messages/MessagesSei.php
index b94e0a23..8d3ebd65 100644
--- a/languages/messages/MessagesSei.php
+++ b/languages/messages/MessagesSei.php
@@ -133,7 +133,6 @@ $messages = array(
'qbbrowse' => 'Quetzexal',
'qbedit' => 'Ticpatlöx',
'qbpageoptions' => 'Jan páhina',
-'qbpageinfo' => 'Contextua',
'qbmyoptions' => 'Hepáhinám',
'qbspecialpages' => 'Páhinám extravám',
'faq' => 'Cocmíiit cmaa',
@@ -320,9 +319,6 @@ $2',
Mecontinudad usadad {{SITENAME}} anon jïx me caápo dajcaitom ö jömcaitom.
Páhinám pac continudad displayom dajme caápo, jánclearom mecachede browser.",
-'welcomecreation' => "== Q'$1! ==
-
-Mecaitom coccebj creatöx. Quiix hequáatlaácde {{SITENAME}} pos-poop.",
'yourname' => 'Caitom ID:',
'yourpassword' => 'Quimx canj:',
'yourpasswordagain' => 'Vanquimx canj:',
@@ -508,7 +504,6 @@ Jan lajxepe occuram me usadad proxy service anon web-based buggy.'''",
'templatesusedsection' => 'Automií usadad jan seccion iti:',
'template-protected' => '(protectöx)',
'template-semiprotected' => '(semi-protectöx)',
-'nocreatetitle' => 'Limiitde creacionde páhinám',
'nocreatetext' => 'Jan site coccebj avlutuatl altede creatöx hun páhinám.
Me pos-coccebj revertöx ö ticpatlöx janpáhinám jöx [[Special:UserLogin|caápo]].',
'nocreate-loggedin' => 'Me necoccebj permiccionde creatöx hunpáhinám jan wiki iti.',
@@ -663,9 +658,6 @@ Informacion: (curt) = quiíxde vercion currentua,
'grouppage-sysop' => '{{ns:project}}:Sysopam',
'grouppage-bureaucrat' => '{{ns:project}}:Bureaucrátam',
-# User rights log
-'rightsnone' => '(zéro)',
-
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|quiix|quíix}}',
'recentchanges' => 'Camjöx cmaa',
@@ -890,11 +882,10 @@ iitom e-iitomde diijömde caitóm.',
'watching' => 'Cáminot...',
'unwatching' => 'Necáminot...',
-'enotif_newpagetext' => 'Jan coccebj hunpáhina.',
'enotif_impersonal_salutation' => '{{SITENAME}} caitom',
-'changed' => 'quiixöx',
-'created' => 'creacöx',
'enotif_anon_editor' => 'caitom anoniimom $1',
+'created' => 'creacöx',
+'changed' => 'quiixöx',
# Delete
'deletepage' => 'Delatar páhina',
@@ -1065,4 +1056,7 @@ iitom e-iitomde diijömde caitóm.',
# Special:SpecialPages
'specialpages' => 'Páhinám extravám',
+# New logging system
+'rightsnone' => '(zéro)',
+
);
diff --git a/languages/messages/MessagesSg.php b/languages/messages/MessagesSg.php
index a0cff5af..c8f15a86 100644
--- a/languages/messages/MessagesSg.php
+++ b/languages/messages/MessagesSg.php
@@ -137,7 +137,6 @@ $messages = array(
'qbbrowse' => 'Hasa',
'qbedit' => 'Sepe',
'qbpageoptions' => 'Lêmbëtï sô',
-'qbpageinfo' => 'Ndongoro',
'qbmyoptions' => 'Âlêmbëtï tî mbï',
'qbspecialpages' => 'Âlêmbëtï ndê',
'faq' => 'Âhûnda',
diff --git a/languages/messages/MessagesSgs.php b/languages/messages/MessagesSgs.php
index bf43bbbf..0411b80c 100644
--- a/languages/messages/MessagesSgs.php
+++ b/languages/messages/MessagesSgs.php
@@ -198,7 +198,6 @@ $messages = array(
'qbbrowse' => 'Naršītė',
'qbedit' => 'Taisītė',
'qbpageoptions' => 'Tas poslapis',
-'qbpageinfo' => 'Konteksts',
'qbmyoptions' => 'Mona poslapē',
'qbspecialpages' => 'Specēlė̅jė poslapē',
'faq' => 'DOK',
@@ -393,11 +392,8 @@ Ožklausėms: $2',
# Login and logout pages
'logouttext' => "'''Daba Tamsta esat atsÄ—jongÄ—s.'''
-Galat Ä— tuoliau nauduotÄ— {{SITENAME}} anuonimÄ—Å¡kÄ aba [[Special:UserLogin|prisÄ—jonkat]] Ä—Å¡ naujÄ— Å¡Ä—tuo patiu a kÄ—to nauduotuojÄ— vardu.
+Galat Ä— tuoliau nauduotÄ— {{SITENAME}} anuonimÄ—Å¡kÄ aba <span class='plainlinks'>[$1 prisÄ—jonkat]</span> Ä—Å¡ naujÄ— Å¡Ä—tuo patiu a kÄ—to nauduotuojÄ— vardu.
Pastebiejims: katruos nekatruos poslapiuos Ä— tuoliau gal ruodÄ«tÄ— bÅ«ktÄ bÅ«tomiet prisÄ—jongÄ—s lÄ—gÄ— tuol, kumet Ä—Å¡valÄ«sÄ—t sava narÅ¡Ä«klÄ—s dietovÄ— (''cache'').",
-'welcomecreation' => '== Svēkė, $1! ==
-
-Tamstas paskīra bova sokorta. Neožmėrškėt pakeistė sava [[Special:Preferences|{{SITENAME}} nustatīmu]].',
'yourname' => 'NauduotuojÄ— vards:',
'yourpassword' => 'Slaptažuodis:',
'yourpasswordagain' => 'Pakartuoket slaptažuodė:',
@@ -617,7 +613,6 @@ tudie negaliesÄ—t Ä—Å¡sauguotÄ— sava pakeitÄ—mu daba. Tamsta galÄ—t nosÄ—kopÄ—jo
'template-protected' => '(apsauguots)',
'template-semiprotected' => '(posiau apsauguots)',
'hiddencategories' => 'Tas poslapis prÄ—klausa $1 {{PLURAL:$1|pakavuotÄ kateguorÄ—jÄ“|pakavuotoms kateguorÄ—jÄ—ms|pakavuotu kateguorÄ—ju}}:',
-'nocreatetitle' => 'Poslapiu kūrims aprėbuots',
'nocreatetext' => '{{SITENAME}} aprėbuojė galėmībe kortė naujus poslapius.
Tamsta galÄ—t grīžtÄ— Ä— redagoutÄ— nÅ«nÄ esonti poslapi, a [[Special:UserLogin|prÄ—sÄ—jongtÄ— a sokortÄ— paskÄ«ra]].',
'permissionserrors' => 'Teisiu klaida',
@@ -881,11 +876,12 @@ Ana gal sodarÄ«tÄ— ne daugiau kÄp $1 {{PLURAL:$1|sÄ—mbuolis|sÄ—mbuolÄ“|sÄ—mbuol
'right-read' => 'Skaitītė poslapius',
'right-edit' => 'KeistÄ— poslapius',
+# Special:Log/newusers
+'newuserlogpage' => 'Nauduotuojė kūrėma regėstros',
+
# User rights log
'rightslog' => 'Nauduotuoju teisiu istuorÄ—jÄ—',
'rightslogtext' => 'Pateikiams nauduotuoju teisiu pakeitÄ—mu sÄraÅ¡os.',
-'rightslogentry' => 'pakeista $1 gropės narīstė ėš $2 i $3. Sveikėnam!',
-'rightsnone' => '(juokiū)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'redagoutÄ— ta poslapi',
@@ -1230,9 +1226,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'Ruodītė',
'listusers-noresult' => 'Nerast anėjuokiū nauduotuoju.',
-# Special:Log/newusers
-'newuserlogpage' => 'Nauduotuojė kūrėma regėstros',
-
# Special:ListGroupRights
'listgrouprights' => 'Nauduotuoju gropiu teisÄ—s',
'listgrouprights-group' => 'GropÄ—',
@@ -1291,10 +1284,9 @@ Jēgo bikumet ožsėnuorietomiet liautėis keravuotė straipsnė, spauskat \"neb
'unwatching' => 'Å alÄ—nama Ä—Å¡ keravuojamu sÄraÅ¡a...',
'enotif_reset' => 'PažīmietÄ— vÄ—sus poslapius kÄp aplonkÄ«tus',
-'enotif_newpagetext' => 'Tas Ä«r naus poslapis.',
-'changed' => 'pakeitÄ—',
-'created' => 'sokūrė',
'enotif_anon_editor' => 'anuonÄ—minis nauduotuos $1',
+'created' => 'sokūrė',
+'changed' => 'pakeitÄ—',
# Delete
'deletepage' => 'TrintÄ— poslapi',
@@ -1970,6 +1962,6 @@ Tamsta tēpuogi galėt [[Special:EditWatchlist/raw|redagoutė grīnaji keravuoja
'logentry-newusers-newusers' => '$1 padėrba nauduotuojė paskīra',
'logentry-newusers-create2' => '$1 padėrba nauduotuojė paskīra $3',
'logentry-newusers-autocreate' => 'PaskÄ«ra $1 bova padÄ—rbta autuomatÄ—Å¡kÄ',
-'newuserlog-byemail' => 'slaptažuodis Ä—Å¡siÅsts par el. paÅ¡ta',
+'rightsnone' => '(juokiū)',
);
diff --git a/languages/messages/MessagesSh.php b/languages/messages/MessagesSh.php
index b5c8671b..ffd9dc36 100644
--- a/languages/messages/MessagesSh.php
+++ b/languages/messages/MessagesSh.php
@@ -121,7 +121,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__FORSIRANISADRŽAJ__', '__UKLJUČISADRŽAJ__', '__FORCETOC__' ),
'toc' => array( '0', '__SADRŽAJ__', '__TOC__' ),
'noeditsection' => array( '0', '__BEZ_IZMJENA__', '__BEZIZMJENA__', '__BEZ_IZMENA__', '__BEZIZMENA__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'TRENUTNIMJESEC', 'TRENUTNIMESEC', 'TRENUTAÄŒNIMJESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'TRENUTNIMJESEC1', 'TRENUTNIMESEC1', 'TRENUTAÄŒNIMJESEC1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'TRENUTNIMJESECIME', 'TRENUTNIMESECIME', 'TRENUTAÄŒNIMJESECIME', 'CURRENTMONTHNAME' ),
@@ -341,6 +340,7 @@ $messages = array(
'newwindow' => '(otvara se u novom prozoru)',
'cancel' => 'Poništi',
'moredotdotdot' => 'Još...',
+'morenotlisted' => 'Više nije prikazano...',
'mypage' => 'Stranica',
'mytalk' => 'Razgovor',
'anontalk' => 'Razgovor za ovu IP adresu',
@@ -352,7 +352,6 @@ $messages = array(
'qbbrowse' => 'Prelistajte',
'qbedit' => 'Uredi',
'qbpageoptions' => 'Opcije stranice',
-'qbpageinfo' => 'Informacije o stranici',
'qbmyoptions' => 'Moje opcije',
'qbspecialpages' => 'Posebne stranice',
'faq' => 'ÄŒPP',
@@ -375,6 +374,7 @@ $messages = array(
'namespaces' => 'Imenski prostori',
'variants' => 'Varijante',
+'navigation-heading' => 'Navigacijski meni',
'errorpagetitle' => 'Greška',
'returnto' => 'Povratak na $1.',
'tagline' => 'Izvor: {{SITENAME}}',
@@ -616,10 +616,10 @@ Administrator koji ju je zakljuÄao ponudio je sledeće objaÅ¡njenje: „$3“.'
# Login and logout pages
'logouttext' => "'''Sad ste odjavljeni.'''
-Možete nastaviti da koristite {{SITENAME}} anonimno, ili se ponovo [[Special:UserLogin|prijaviti]] kao isti ili kao drugi korisnik.
+Možete nastaviti da koristite {{SITENAME}} anonimno, ili se ponovo <span class='plainlinks'>[$1 prijaviti]</span> kao isti ili kao drugi korisnik.
Obratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste joÅ¡ uvijek prijavljeni, dok ne oÄistite keÅ¡ svog preglednika.",
-'welcomecreation' => '== Dobro došli, $1! ==
-VaÅ¡ korisniÄki raÄun je napravljen.
+'welcomeuser' => 'Dobro došli, $1!',
+'welcomecreation-msg' => 'VaÅ¡ korisniÄki raÄun je napravljen.
Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].',
'yourname' => 'KorisniÄko ime:',
'yourpassword' => 'Lozinka/zaporka:',
@@ -643,7 +643,7 @@ Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].
'gotaccount' => "Imate raÄun? '''$1'''.",
'gotaccountlink' => 'Prijavi se',
'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
-'createaccountmail' => 'e-mailom',
+'createaccountmail' => 'Koristite privremenu sluÄajno stvorenu lozinku i poÅ¡aljite na dolje specificiranu e-mail adresu',
'createaccountreason' => 'Razlog:',
'badretype' => 'Lozinke koje ste unijeli se ne poklapaju.',
'userexists' => 'Uneseno korisniÄko ime već je u upotrebi.
@@ -720,6 +720,7 @@ Molimo Vas da saÄekate prije nego Å¡to pokuÅ¡ate ponovo.',
# Email sending
'php-mail-error-unknown' => 'Nepoznata greška u PHP funkciji mail()',
'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.',
# Change password dialog
'resetpass' => 'Promijeni korisniÄku Å¡ifru',
@@ -784,6 +785,7 @@ Privremena Å¡ifra: $2',
'changeemail-oldemail' => 'Trenutna e-mail adresa:',
'changeemail-newemail' => 'Nova e-mail adresa:',
'changeemail-none' => '(ništa)',
+'changeemail-password' => 'Tvoja Å¡ifra/lozinka za {{SITENAME}}:',
'changeemail-submit' => 'Promijeni e-mail',
'changeemail-cancel' => 'Odustani',
@@ -969,7 +971,6 @@ Posljednja stavka registra je prikazana ispod kao referenca:",
'template-protected' => '(zaštićeno)',
'template-semiprotected' => '(polu-zaštićeno)',
'hiddencategories' => 'Ova stranica pripada {{PLURAL:$1|1 skrivenoj kategoriji|$1 skrivenim kategorijama}}:',
-'nocreatetitle' => 'Stvaranje stranica ograniÄeno',
'nocreatetext' => '{{SITENAME}} je ograniÄio/la postavljanje novih stranica.
Možete se vratiti i ureÄ‘ivati već postojeće stranice ili se [[Special:UserLogin|prijaviti ili otvoriti korisniÄki raÄun]].',
'nocreate-loggedin' => 'Nemate dopuštenje da kreirate nove stranice.',
@@ -994,6 +995,15 @@ Izgleda da je obrisana.',
'edit-already-exists' => 'Stranica nije mogla biti kreirana.
Izgleda da već postoji.',
'defaultmessagetext' => 'UobiÄajeni tekst poruke',
+'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]]',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'obiÄni tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Upozorenje: Ova stranica sadrži previše poziva opterećujućih parserskih funkcija.
@@ -1363,9 +1373,9 @@ Ovo se ne može vratiti unazad.',
'prefs-emailconfirm-label' => 'E-mail potvrda:',
'prefs-textboxsize' => 'VeliÄina prozora za ureÄ‘ivanje',
'youremail' => 'E-mail:',
-'username' => 'KorisniÄko ime:',
-'uid' => 'KorisniÄki ID:',
-'prefs-memberingroups' => 'ÄŒlan {{PLURAL:$1|grupe|grupa}}:',
+'username' => 'Ime {{GENDER:$1|korisnika|korisnice}}:',
+'uid' => '{{GENDER:$1|KorisniÄki}} ID:',
+'prefs-memberingroups' => '{{GENDER:$2|Korisnik|Korisnica}} je Älan {{PLURAL:$1|grupe|grupâ}}:',
'prefs-registration' => 'Vrijeme registracije:',
'yourrealname' => 'Vaše pravo ime:',
'yourlanguage' => 'Jezik:',
@@ -1516,12 +1526,13 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
'right-sendemail' => 'Slanje e-maila drugim korisnicima',
'right-passwordreset' => 'Pregled e-maila za obnavljanje lozinke',
+# Special:Log/newusers
+'newuserlogpage' => 'Registar novih korisnika',
+'newuserlogpagetext' => 'Ovo je evidencija registracije novih korisnika.',
+
# User rights log
'rightslog' => 'Registar korisniÄkih prava',
'rightslogtext' => 'Ovo je evidencija izmjene korisniÄkih prava.',
-'rightslogentry' => 'promjena Älanstva u grupi za $1 sa $2 na $3',
-'rightslogentry-autopromote' => 'je automatski unaprijeđen iz $2 u $3',
-'rightsnone' => '(nema)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'Äitanje ove stranice',
@@ -1754,6 +1765,7 @@ Ako se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administrator
'backend-fail-notsame' => 'Već postoji neistovetna datoteka – $1.',
'backend-fail-invalidpath' => '$1 nije ispravna putanja za skladištenje.',
'backend-fail-delete' => 'Ne može se izbrisati datoteka "$1".',
+'backend-fail-describe' => 'Ne mogu promijeniti metapodatke za datoteku "$1".',
'backend-fail-alreadyexists' => 'Datoteka $1 već postoji.',
'backend-fail-store' => 'Ne mogu da smestim datoteku $1 u $2.',
'backend-fail-copy' => 'Ne može se kopirati "$1" na "$2".',
@@ -2143,9 +2155,9 @@ Vidi također [[Special:WantedCategories|zatražene kategorije]].',
'linksearch-pat' => 'Å ema pretrage:',
'linksearch-ns' => 'Imenski prostor:',
'linksearch-ok' => 'Traži',
-'linksearch-text' => 'Mogu se koristiti džokeri poput „*.wikipedia.org“.<br />
-Potreban je najviši domen, kao „*.org“.<br />
-Podržani protokoli: <code>$1</code> (ne stavljajte u pretragu)',
+'linksearch-text' => 'Možete koristiti džoker znakove poput "*.wikipedia.org".
+Potrebno je navesti osnovnu domenu (TLD), npr. "*.org".<br />
+Podržani {{PLURAL:$2|protokol|protokoli}}: <code>$1</code> (default je http:// ako nijedan protokol nije naveden).',
'linksearch-line' => '$1 je povezan od $2',
'linksearch-error' => 'Džokeri se mogu pojavljivati samo na poÄetku naziva servera.',
@@ -2164,10 +2176,6 @@ Podržani protokoli: <code>$1</code> (ne stavljajte u pretragu)',
'activeusers-hidesysops' => 'Sakrij administratore',
'activeusers-noresult' => 'Nije pronađen korisnik.',
-# Special:Log/newusers
-'newuserlogpage' => 'Registar novih korisnika',
-'newuserlogpagetext' => 'Ovo je evidencija registracije novih korisnika.',
-
# Special:ListGroupRights
'listgrouprights' => 'Prava korisniÄkih grupa',
'listgrouprights-summary' => 'Slijedi spisak korisniÄkih grupa na ovoj wiki, s njihovim pravima pristupa.
@@ -2262,20 +2270,23 @@ Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti n
'enotif_mailer' => '{{SITENAME}} obavještenje o pošti',
'enotif_reset' => 'OznaÄi sve strane kao posjećene',
-'enotif_newpagetext' => 'Ovo je nova stranica.',
'enotif_impersonal_salutation' => '{{SITENAME}} korisnik',
-'changed' => 'promijenjena',
-'created' => 'napravljena',
-'enotif_subject' => '{{SITENAME}} strana $PAGETITLE je bila $CHANGEDORCREATED od strane $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}} stranicu $1 {{gender:|je izbrisao|je izbrisala|je izbrisao}} $2',
+'enotif_subject_created' => '{{SITENAME}} stranicu $1 {{gender:|je napravio|je napravila|je napravio}} $2',
+'enotif_subject_moved' => '{{SITENAME}} stranicu $1 {{gender:|je premijestio|je premjestila|je premjestio}} $2',
+'enotif_subject_restored' => '{{SITENAME}} stranicu $1 {{gender:|je obnovio|je obnovila|je obnovio}} $2',
+'enotif_subject_changed' => '{{SITENAME}} stranicu $1 {{gender:|je promijenio|je promijenila|je promijenio}} $2',
+'enotif_body_intro_deleted' => 'Stranicu $1 projekta {{SITENAME}} {{GENDER:$2|obrisao|obrisala}} je dana $PAGEEDITDATE {{GENDER:$2|korisnik|korisnica}} $2, pogledajte $3.',
+'enotif_body_intro_created' => '{{SITENAME}} stranica $1 je stvorena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
+'enotif_body_intro_moved' => '{{SITENAME}} stranica $1 je premještena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
+'enotif_body_intro_restored' => '{{SITENAME}} stranica $1 je obnovljena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
+'enotif_body_intro_changed' => '{{SITENAME}} stranica $1 je izmijenjena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
'enotif_lastvisited' => 'Pogledajte $1 za sve izmjene od vaše posljednje posjete.',
'enotif_lastdiff' => 'Vidi $1 da pregledate ovu promjenu.',
'enotif_anon_editor' => 'anonimni korisnik $1',
'enotif_body' => 'Poštovani $WATCHINGUSERNAME,
-
-Stranica {{SITENAME}} sa naslovom $PAGETITLE je bila $CHANGEDORCREATED dana $PAGEEDITDATE od strane $PAGEEDITOR, pogledajte $PAGETITLE_URL za trenutnu reviziju.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Sažetak urednika: $PAGESUMMARY $PAGEMINOREDIT
@@ -2300,6 +2311,8 @@ $UNWATCHURL
Povratne informacije i daljnja pomoć:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'napravljena',
+'changed' => 'promijenjena',
# Delete
'deletepage' => 'Izbrišite stranicu',
@@ -2370,6 +2383,8 @@ Pogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled tr
'prot_1movedto2' => '[[$1]] premješten na [[$2]]',
'protect-badnamespace-title' => 'Nezaštitljiv imenski prostor',
'protect-badnamespace-text' => 'Stranice u ovom imenskom prostoru se ne mogu zaštititi.',
+'protect-norestrictiontypes-text' => 'Ova stranica se ne može zaÅ¡tititi jer nema dostupnih oblika ograniÄenja.',
+'protect-norestrictiontypes-title' => 'Stranica koju nije moguće zaštititi',
'protect-legend' => 'Potvrdite zaštitu',
'protectcomment' => 'Razlog:',
'protectexpiry' => 'IstiÄe:',
@@ -2455,8 +2470,8 @@ Možda ste unijeli pogrešan link, ili je revizija vraćena ili uklonjena iz arh
'undeletedrevisions' => '{{PLURAL:$1|$1 revizija vraćena|$1 revizije vraćene|$1 revizija vraćeno}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revizija|$1 revizije|$1 revizija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno',
'undeletedfiles' => '{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}',
-'cannotundelete' => 'Vraćanje nije uspjelo;
-neko drugi je već vratio ovu stranicu.',
+'cannotundelete' => 'Vraćanje nije uspelo:
+$1',
'undeletedpage' => "'''$1 je vraćena'''
Provjerite [[Special:Log/delete|evidenciju brisanja]] za zapise najskorijih brisanja i vraćanja.",
@@ -2488,7 +2503,7 @@ $1',
'blanknamespace' => '(Glavno)',
# Contributions
-'contributions' => 'Doprinosi korisnika',
+'contributions' => 'Doprinosi {{GENDER:|korisnika|korisnice|korisnika}} $1',
'contributions-title' => 'KorisniÄki doprinosi od $1',
'mycontris' => 'Doprinosi',
'contribsub2' => 'Za $1 ($2)',
@@ -2766,6 +2781,7 @@ Da li je želite obrisati kako bi ste mogli izvršiti premještanje?',
'immobile-target-namespace-iw' => 'Međuwiki link nije valjano odredište premještanja stranice.',
'immobile-source-page' => 'Ova stranica se ne može premještati.',
'immobile-target-page' => 'Ne može se preusmjeriti na taj odredišni naslov.',
+'bad-target-model' => 'Željeno odrediÅ¡te koristi drugaÄiji model sadržaja. Ne mogu da pretvorim iz $1 u $2.',
'imagenocrossnamespace' => 'Ne može se premjestiti datoteka u nedatoteÄni imenski prostor',
'nonfile-cannot-move-to-file' => 'Ne mogu se premjestiti podaci u datoteÄni imenski prostor',
'imagetypemismatch' => 'Ekstenzija nove datoteke ne odgovara njenom tipu',
@@ -2882,6 +2898,7 @@ Molimo pokušajte ponovno.',
'import-error-interwiki' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv rezervisan za spoljno povezivanje (interwiki).',
'import-error-special' => 'Ne mogu da uvezem stranicu „$1“ jer ona pripada posebnom imenskom prostoru koje ne prihvata stranice.',
'import-error-invalid' => 'Ne mogu da uvezem stranicu „$1“ jer je njen naziv neispravan.',
+'import-error-unserialize' => 'Verzija $2 stranice "$1" ne može biti proÄitana/uvezena. Zapisano je da verzija koristi $3 tip sadržaja u $4 formatu.',
'import-options-wrong' => '{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Navedena osnovna stranica ima neispravan naslov.',
'import-rootpage-nosubpage' => 'Imenski prostor „$1“ osnovne stranice ne dozvoljava podstranice.',
@@ -2896,7 +2913,6 @@ Molimo pokušajte ponovno.',
# JavaScriptTest
'javascripttest' => 'Javaskript test',
-'javascripttest-disabled' => 'Ova funkcija je onemogućena na ovom wikiju.',
'javascripttest-title' => 'Izvršavanje testova za $1',
'javascripttest-pagetext-noframework' => 'Ova stranica je rezervisana za izvršavanje javaskript testova.',
'javascripttest-pagetext-unknownframework' => 'Nepoznati radni okvir „$1“.',
@@ -3013,11 +3029,13 @@ Ovo je vjerovatno izazvano vezom ka vanjskoj nepoželjnoj stranici.',
'pageinfo-default-sort' => 'Podrazumijevani kljuÄ sortiranja',
'pageinfo-length' => 'Dužina stranice (u bajtovima)',
'pageinfo-article-id' => 'ID stranice',
+'pageinfo-language' => 'Jezik sadržaja stranice',
'pageinfo-robot-policy' => 'Status tražilice',
'pageinfo-robot-index' => 'Stranicu je moguće indeksirati',
'pageinfo-robot-noindex' => 'Ne može se indeksirati',
'pageinfo-views' => 'Broj pregleda',
'pageinfo-watchers' => 'Broj pratitelja stranice',
+'pageinfo-few-watchers' => 'Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}',
'pageinfo-redirects-name' => 'Preusmjeravanja na ovu stranicu',
'pageinfo-subpages-name' => 'Podstranice ove stranice',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|preusmjerenje|preusmjerenja|preusmjerenja}}; $3 {{PLURAL:$3|nepreusmjerenje|nepreusmjerenja|nepreusmjerenja}})',
@@ -3032,6 +3050,19 @@ Ovo je vjerovatno izazvano vezom ka vanjskoj nepoželjnoj stranici.',
'pageinfo-magic-words' => '{{PLURAL:$1|MagiÄna rijeÄ|MagiÄne rijeÄi}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|UkljuÄeni Å¡ablon|UkljuÄeni Å¡abloni}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Stranica|Stranice}} ukljuÄene u ($1)',
+'pageinfo-toolboxlink' => 'Informacije o stranici',
+'pageinfo-redirectsto' => 'Preusmjerava na',
+'pageinfo-redirectsto-info' => 'Informacije',
+'pageinfo-contentpage' => 'RaÄuna se kao stranica sa sadržajem',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading' => 'Prenosiva zaštita stranica važi odavde',
+'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-protect-cascading-from' => 'Stranice sa prenosivom zaštitom od',
+'pageinfo-category-info' => 'Informacije o kategoriji',
+'pageinfo-category-pages' => 'Broj stranica',
+'pageinfo-category-subcats' => 'Broj potkategorija',
+'pageinfo-category-files' => 'Broj datoteka',
# Patrolling
'markaspatrolleddiff' => 'OznaÄi kao patrolirano',
@@ -3043,6 +3074,8 @@ Ovo je vjerovatno izazvano vezom ka vanjskoj nepoželjnoj stranici.',
'markedaspatrollederror' => 'Ne može se oznaÄiti kao patrolirano',
'markedaspatrollederrortext' => 'Morate naglasiti reviziju koju treba oznaÄiti kao patroliranu.',
'markedaspatrollederror-noautopatrol' => 'Nije Vam dopuÅ¡teno da vlastite izmjene oznaÄavate patroliranim.',
+'markedaspatrollednotify' => 'Ova izmjena stranice $1 oznaÄena je kao patrolirana.',
+'markedaspatrollederrornotify' => 'Nije uspjelo oznaÄavanje ove stranice kao patrolirane.',
# Patrol log
'patrol-log-page' => 'Evidencija patroliranja',
@@ -3076,6 +3109,7 @@ Njegovim izvršavanjem možete da ugrozite Vaš sistem.",
'file-nohires' => 'Veća rezolucija nije dostupna.',
'svg-long-desc' => 'SVG fajl, nominalno $1 × $2 piksela, veliÄina fajla: $3',
'svg-long-desc-animated' => 'Animirana SVG datoteka, nominalno: $1 × $2 piksela, veliÄina: $3',
+'svg-long-error' => 'Nevaljana SVG datoteka: $1',
'show-big-image' => 'Puna rezolucija',
'show-big-image-preview' => 'VeliÄina ovog prikaza: $1.',
'show-big-image-other' => '{{PLURAL:$2|Druga rezolucija|Druge rezolucije}}: $1.',
@@ -3105,7 +3139,10 @@ Njegovim izvršavanjem možete da ugrozite Vaš sistem.",
'minutes' => '{{PLURAL:$1|$1 minut|$1 minuta|$1 minuta}}',
'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
+'months' => '{{PLURAL:$1|$1 mjesec|$1 mjeseci}}',
+'years' => '{{PLURAL:$1|$1 godina|$1 godine|$1 godina}}',
'ago' => 'prije $1',
+'just-now' => 'upravo sada',
# Bad image list
'bad_image_list' => "Koristi se sljedeći format:
@@ -3607,6 +3644,7 @@ Ovaj kod za potvrdu će isteći u $4.',
# Scary transclusion
'scarytranscludedisabled' => '[MeÄ‘uwiki umetanje je iskljuÄeno]',
'scarytranscludefailed' => '[Neuspješno preusmjerenje šablona na $1]',
+'scarytranscludefailed-httpstatus' => '[Ne mogu da preuzmem Å¡ablon $1: HTTP $2]',
'scarytranscludetoolong' => '[URL je predugaÄak]',
# Delete conflict
@@ -3717,6 +3755,7 @@ TakoÄ‘er možete [[Special:EditWatchlist|koristiti standardni ureÄ‘ivaÄ]].',
'version-license' => 'Licenca',
'version-poweredby-credits' => "Ova wiki je zasnovana na '''[//www.mediawiki.org/ MediaWiki]''', autorska prava zadržana © 2001-$1 $2.",
'version-poweredby-others' => 'ostali',
+'version-credits-summary' => 'Htjeli bismo da zahvalimo sljedećim osobama na njihovom doprinosu [[Special:Version|MediaWiki]].',
'version-license-info' => 'Mediawiki je slobodni softver, možete ga redistribuirati i/ili mijenjati pod uslovima GNU opće javne licence kao što je objavljeno od strane Fondacije Slobodnog Softvera, bilo u verziji 2 licence, ili (po vašoj volji) nekoj od kasniji verzija.
Mediawiki se distriburia u nadi da će biti korisna, ali BEZ IKAKVIH GARANCIJA, Äak i bez ikakvih posrednih garancija o KOMERCIJALNOSTI ili DOSTUPNOSTI ZA ODREÄENU SVRHU. Pogledajte GNU opću javnu licencu za viÅ¡e detalja.
@@ -3859,8 +3898,12 @@ Slike su prikazane u punoj veliÄini, ostale vrste datoteka su prikazane direktn
'logentry-newusers-newusers' => 'KorisniÄki raÄun $1 je napravljen',
'logentry-newusers-create' => 'KorisniÄki raÄun $1 je napravljen',
'logentry-newusers-create2' => 'KorisniÄki raÄun $3 {{GENDER:|je napravio|je napravila|je napravio}} $1',
+'logentry-newusers-byemail' => 'KorisniÄki raÄun $3 je napravio $1 i lozinka/Å¡ifra je poslana putem e-maila',
'logentry-newusers-autocreate' => 'RaÄun $1 je samostalno otvoren',
-'newuserlog-byemail' => 'lozinka je poslana putem e-maila',
+'logentry-rights-rights' => '$1 {{GENDER:$1|je promijenio|je promijenila|je promijenio}} Älanstvo grupe za $3 iz $4 u $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|je promenio|je promenila|je promenio}} Älanstvo grupe za $3',
+'logentry-rights-autopromote' => '$1 je automatski {{GENDER:$1|unaprijeđen|unaprijeđena|unaprijeđen}} iz $4 u $5',
+'rightsnone' => '(nema)',
# Feedback
'feedback-bugornote' => 'Ako ste spremni da detaljno opiÅ¡ete tehniÄki problem, onda [$1 prijavite greÅ¡ku].
@@ -3914,6 +3957,7 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
'api-error-ok-but-empty' => 'Unutrašnja greška: nema odgovora od servera.',
'api-error-overwrite' => 'Pisanje preko postojeće datoteke nije dopušteno.',
'api-error-stashfailed' => 'Unutrašnja greška: server nije mogao da spremi privremenu datoteku.',
+'api-error-publishfailed' => 'Unutrašnja greška: server nije mogao da spremi privremenu datoteku.',
'api-error-timeout' => 'Server nije odgovorio unutar oÄekivanog vremena.',
'api-error-unclassified' => 'Desila se nepoznata greška',
'api-error-unknown-code' => 'Nepoznata greška: "$1"',
diff --git a/languages/messages/MessagesShi.php b/languages/messages/MessagesShi.php
index 3b3dbcfd..02cac985 100644
--- a/languages/messages/MessagesShi.php
+++ b/languages/messages/MessagesShi.php
@@ -157,7 +157,6 @@ $messages = array(
'qbbrowse' => 'Cabba',
'qbedit' => 'Sbadl',
'qbpageoptions' => 'Tasnat ad',
-'qbpageinfo' => 'Context',
'qbmyoptions' => 'Tisnatin inu',
'qbspecialpages' => 'Tisnatin timzlay',
'faq' => 'Isqsitn li bdda tsutulnin',
@@ -367,9 +366,6 @@ Akks ad iskrt kra yaá¸n',
'virus-unknownscanner' => 'antivirus oritwsan',
# Login and logout pages
-'welcomecreation' => '== Brrkat, $1! ==
-lcont nek tuyskar .
- Adur tut atbaddlt [[Special:Preferences|{{SITENAME}} issusmen]]',
'yourname' => 'smiyt o-msxdam:',
'yourpassword' => 'awal iḥdan:',
'yourpasswordagain' => 'Зawd ara awal iḥdan:',
@@ -744,9 +740,11 @@ Izdar ad urtili ɣ isbidn n mayllan ɣ {{SITENAME}} .',
'grouppage-sysop' => '{{ns:project}}: Inedbalen',
+# Special:Log/newusers
+'newuserlogpage' => 'AÉ£mis n willi mmurzmn imiá¸an amsqdac',
+
# User rights log
'rightslog' => 'Anɣmas n imbddlnn izrfan n umsqdac',
-'rightsnone' => '(ḥtta yan)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'Ssɣr tasna yad',
@@ -910,9 +908,6 @@ Mel imbddeln z tisniwin li ittuyzdayni bla tasna li trit.',
'linksearch' => 'Izdayn n brra',
'linksearch-line' => '$1 tmmuttid z $2',
-# Special:Log/newusers
-'newuserlogpage' => 'AÉ£mis n willi mmurzmn imiá¸an amsqdac',
-
# Special:ListGroupRights
'listgrouprights-members' => 'Umuɣ n midn',
@@ -1357,5 +1352,6 @@ WiyyaḠraggis ḥbun s ɣiklli sttin kkan gantn.
# New logging system
'revdelete-restricted' => 'iskr aqn i indbaln',
'revdelete-unrestricted' => 'Aqn iḥiyd i indbaln',
+'rightsnone' => '(ḥtta yan)',
);
diff --git a/languages/messages/MessagesSi.php b/languages/messages/MessagesSi.php
index 21f82968..06610173 100644
--- a/languages/messages/MessagesSi.php
+++ b/languages/messages/MessagesSi.php
@@ -339,7 +339,6 @@ $messages = array(
'qbbrowse' => 'පිරික්සන්න',
'qbedit' => 'සංස්කරණය',
'qbpageoptions' => 'මෙම පිටුව',
-'qbpageinfo' => 'සන්දර්භය',
'qbmyoptions' => 'මගේ පිටු',
'qbspecialpages' => 'විà·à·šà·‚ පිටු',
'faq' => 'නිවිප්â€à¶»',
@@ -362,6 +361,7 @@ $messages = array(
'namespaces' => 'නà·à¶¸à¶…වකà·à·à¶ºà¶±à·Š',
'variants' => 'ප්â€à¶»à¶·à·šà¶¯',
+'navigation-heading' => 'සංචà·à¶½à¶± මෙනුව',
'errorpagetitle' => 'දà·à·‚ය',
'returnto' => '$1 වෙත නà·à·€à¶­ යන්න.',
'tagline' => '{{SITENAME}} වෙතින්',
@@ -602,12 +602,11 @@ $2',
# Login and logout pages
'logouttext' => "'''ඔබ දà·à¶±à·Š ගිණුමෙන් නික්මී ඇත.'''
-ඔබට නිර්නà·à¶¸à·’කව {{SITENAME}} කටයුතු කරගෙන යà·à·„à·à¶š, නà·à¶­à·„ොත් පෙර පරිà·à·“ලක ලෙස හ෠වෙනත් පරිà·à·“ලකයෙකු ලෙස [[Special:UserLogin|නà·à·€à¶­ ගිණුමකâ€à¶§ පිවිසිය à·„à·à¶š]].
+ඔබට නිර්නà·à¶¸à·’කව {{SITENAME}} කටයුතු කරගෙන යà·à·„à·à¶š, නà·à¶­à·„ොත් පෙර පරිà·à·“ලක ලෙස හ෠වෙනත් පරිà·à·“ලකයෙකු ලෙස <span class='plainlinks'>[$1 නà·à·€à¶­ ගිණුමකâ€à¶§ පිවිසිය à·„à·à¶š]</span>.
ඔබගේ බ්â€à¶»à·€à·”සරයෙහි පූර්වà·à¶´à·šà¶šà·Šâ€à·‚à·“ සංචිතය (කෑෂය) පිරිසිදුකරන තෙක්, සමහරක් පිටු විසින් ඔබ තවදුරටත් පිවිසී ඇති බවක් දිගටම පෙන්නුම් කිරීමට ඉඩ ඇත.",
-'welcomecreation' => '== ආයුබà·à·€à¶±à·Š, $1! ==
-
-ඔබâ€à¶œà·š ගිණුම තනන ලදී.
-ඔබâ€à¶œà·š [[Special:Preferences|{{SITENAME}} අභිරුචි ]] වෙනස් කිරීම අමතක නොකරන්න.',
+'welcomeuser' => 'ආයුබà·à·€à¶±à·Š, $1!',
+'welcomecreation-msg' => 'ඔබගේ ගිණුම තන෠ඇත.
+ඔබගේ [[Special:Preferences|{{SITENAME}} අභිරුචීන්]] නෙස් කිරීමට අමතක නොකරන්න.',
'yourname' => 'පරිà·à·“ලක නà·à¶¸à¶º:',
'yourpassword' => 'මුරපදය:',
'yourpasswordagain' => 'මුරපදය යළි ඇතුළු කරන්න:',
@@ -759,6 +758,7 @@ $2
'changeemail-oldemail' => 'වත්මන් විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·Š ලිපිනය:',
'changeemail-newemail' => 'නව විද්â€à¶ºà·”ත් තà·à¶´à·à¶½à·Š ලිපිනය:',
'changeemail-none' => '(කිසිවක් නොමà·à¶­)',
+'changeemail-password' => 'ඔබේ {{SITENAME}} මුරපදය:',
'changeemail-submit' => 'විද්â€à¶ºà·”ත් තà·à¶´à·‘ල වෙනස් කරන්න',
'changeemail-cancel' => 'අවලංගු කරන්න',
@@ -942,7 +942,6 @@ $2
'template-semiprotected' => '(අර්ධ-ආරක්â€à·‚ිත)',
'hiddencategories' => 'මෙම පිටුව, {{PLURAL:$1| එක් à·ƒà·à¶Ÿà·€à·”ණු ප්â€à¶»à·€à¶»à·Šà¶œà¶ºà¶š| à·ƒà·à¶Ÿà·€à·”ණු ප්â€à¶»à·€à¶»à·Šà¶œà¶ºà¶±à·Š $1 ක}} අවයවයක් වේ:',
'edittools' => '<!-- මෙම පෙළ සංස්කරණ හ෠උඩුගත ආකෘතින්ට පහළින් පෙන්නුම් කෙරේ. -->',
-'nocreatetitle' => 'පිටු තà·à¶±à·“ම සීම෠කර ඇත',
'nocreatetext' => 'නව පිටු තà·à¶±à·“මේ à·„à·à¶šà·’යà·à·€ {{SITENAME}} විසින් සීමà·à¶šà¶» ඇත.
ඔබ හට පෙරළ෠ගොස්, දà·à¶±à¶§ පවතින පිටුවක් සංස්කරණය කිරීම à·„à·, [[Special:UserLogin|ගිණුමකට ප්â€à¶»à·€à·’ෂ්ට වීම හ෠නව ගිණුමක් තà·à¶±à·“ම à·„à·]] සිදුකල à·„à·à¶š.',
'nocreate-loggedin' => '{{SITENAME}} à·„à·’ නව පිටු තà·à¶±à·“මට අවසරයක් ඔබ හට ප්â€à¶»à¶¯à·à¶±à¶º කොට නොමà·à¶­.',
@@ -967,6 +966,13 @@ $2
'edit-already-exists' => 'නව පිටුවක් තà·à¶±à·’ය නොහà·à¶šà·’ විය.
එය දà·à¶±à¶§à¶¸à¶­à·Š පවතියි.',
'defaultmessagetext' => 'à·ƒà·à¶¸à·à¶±à·Šâ€à¶º පණිවුඩ පෙළ',
+'invalid-content-data' => 'වලංගු නොවන අන්තර්ගත දත්ත',
+
+# Content models
+'content-model-wikitext' => 'විකිපෙළ',
+'content-model-text' => 'à·ƒà·à¶¸à·à¶±à·Šâ€à¶º පෙළ',
+'content-model-javascript' => 'ජà·à·€à·à·ƒà·Šà¶šà·Šâ€à¶»à·’ප්ට්',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'අවවà·à¶¯à¶ºà¶ºà·’: මෙම පිටුවෙහි අධිවà·à¶º ව්â€à¶ºà·à¶šà¶»à¶« විග්â€à¶»à·„ à·à·Šâ€à¶»à·’ත කà·à¶³à·€à·”ම් (expensive parser function calls) පමණට වඩ෠ඇත.
@@ -1322,9 +1328,9 @@ $1",
'prefs-emailconfirm-label' => 'විද්â€à¶ºà·”ත්-ලිපිනය තහවුරුකිරීම:',
'prefs-textboxsize' => 'සංස්කරණ කවුළුවෙහි ප්â€à¶»à¶¸à·à¶«à¶º',
'youremail' => 'විද්â€à¶ºà·”ත් තà·à¶´à·‘ල:',
-'username' => 'පරිà·à·“ලක නà·à¶¸à¶º:',
-'uid' => 'පරිà·à·“ලක අනන්â€à¶ºà·à¶‚කය:',
-'prefs-memberingroups' => 'ඉදිරියේ දà·à¶šà·Šà·€à·™à¶± {{PLURAL:$1|කණ්ඩà·à¶ºà¶¸à·™à·„à·’|කණ්ඩà·à¶ºà¶¸à·Š වල}} à·ƒà·à¶¸à·à¶¢à·’කයෙකි:',
+'username' => '{{GENDER:$1|පරිà·à·“ලක නà·à¶¸à¶º}}:',
+'uid' => '{{GENDER:$1|පරිà·à·“ලක}} අනන්â€à¶ºà·à¶‚කය:',
+'prefs-memberingroups' => 'ඉදිරියේ දà·à¶šà·Šà·€à·™à¶± {{PLURAL:$1|කණ්ඩà·à¶ºà¶¸à·™à·„à·’|කණ්ඩà·à¶ºà¶¸à·Š වල}} {{GENDER:$2|à·ƒà·à¶¸à·à¶¢à·’කයෙකි}}:',
'prefs-registration' => 'ලියà·à¶´à¶¯à·’ංචිවූ වේලà·à·€:',
'yourrealname' => 'à·ƒà·à¶¶à·‘ නà·à¶¸à¶º:',
'yourlanguage' => 'භà·à·‚à·à·€:',
@@ -1475,12 +1481,13 @@ HTML ටà·à¶œà¶ºà¶±à·Š පිරික්සන්න.',
'right-sendemail' => 'අනෙක් පරිà·à·“ලකයන්ට ඊ-ලිපි යවන්න',
'right-passwordreset' => 'මුරපද යලි à·ƒà·à¶šà·ƒà·“ම් විද්â€à¶ºà·”ත් තà·à¶´à·‘ලයන් නරඹන්න',
+# Special:Log/newusers
+'newuserlogpage' => 'පරිà·à·“ලකයන් තà·à¶±à·“මේ සටහන',
+'newuserlogpagetext' => 'මෙය පරිà·à·’ලකයන් තà·à¶±à·“ම පිළිබඳ සටහනකි.',
+
# User rights log
'rightslog' => 'පරිà·à·“ලක හිමිකම් සටහන',
'rightslogtext' => 'මෙය පරිà·à·“ලකයන්ගේ හිමිකම් වෙනස්වීම් පිළිබඳ ලà¶à·”-සටහනකි.',
-'rightslogentry' => '$1 සඳහ෠කණ්ඩà·à¶ºà¶¸à·Š à·ƒà·à¶¸à·à¶¢à·’කත්වය $2 සිට $3 දක්ව෠වෙනස්කෙරිණි',
-'rightslogentry-autopromote' => 'ස්වයංක්â€à¶»à·“ය ලෙසින් $2 සිට $3 දක්ව෠උසස් කරන ලදි',
-'rightsnone' => '(කිසිවක් නොමà·à¶­)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'මෙම පිටුව කියවන්න',
@@ -2112,10 +2119,6 @@ When filtered by user, only files where that user uploaded the most recent versi
'activeusers-hidesysops' => 'පරිපà·à¶½à¶šà¶ºà·’න් සඟවන්න',
'activeusers-noresult' => 'කිසිදු පරිà·à·“ලකයෙකු හමුනොවිණි.',
-# Special:Log/newusers
-'newuserlogpage' => 'පරිà·à·“ලකයන් තà·à¶±à·“මේ සටහන',
-'newuserlogpagetext' => 'මෙය පරිà·à·’ලකයන් තà·à¶±à·“ම පිළිබඳ සටහනකි.',
-
# Special:ListGroupRights
'listgrouprights' => 'පරිà·à·“ලක කà·à¶«à·Šà¶© හිමිකම්',
'listgrouprights-summary' => 'මෙම විකියේ අර්ථදක්ව෠ඇති පරිà·à·“ලක කà·à¶«à·Šà¶© ලà·à¶ºà·’ස්තුවක් ඔවුනට අදà·à·… ප්â€à¶»à·€à·šà· හිමිකම්ද සමගින් මෙහි පහත ලà·à¶ºà·’ස්තුගත කොට ඇත.
@@ -2208,11 +2211,7 @@ When filtered by user, only files where that user uploaded the most recent versi
'enotif_mailer' => '{{SITENAME}}à·„à·’ නිවේදන යවන්නà·',
'enotif_reset' => 'පිවිසුනු සියළු පිටු සලකුණු කරන්න',
-'enotif_newpagetext' => 'මෙය නව පිටුවකි.',
'enotif_impersonal_salutation' => '{{SITENAME}} පරිà·à·“ලක',
-'changed' => 'වෙනස්කරන ලදි',
-'created' => 'තනන ලදි',
-'enotif_subject' => '{{SITENAME}}හි $PAGETITLE යන පිටුව $PAGEEDITOR විසින් $CHANGEDORCREATED කෙරිණි',
'enotif_lastvisited' => 'ඔබගේ අවසà·à¶± පිවිසුමට පසු සිදුවූ සියළු වෙනස්වීම් නà·à¶»à¶¹à·”මට $1 බලන්න.',
'enotif_lastdiff' => 'මෙම වෙනස නà·à¶»à¶¹à·“ම සඳහ෠$1 බලන්න.',
'enotif_anon_editor' => 'නිර්නà·à¶¸à·’ක පරිà·à·“ලක $1',
@@ -2246,6 +2245,8 @@ $UNWATCHURL
Feedback and further assistance:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'තනන ලදි',
+'changed' => 'වෙනස්කරන ලදි',
# Delete
'deletepage' => 'පිටුව මක෠දමන්න',
@@ -2433,7 +2434,7 @@ $1',
'blanknamespace' => '(ප්â€à¶»à¶°à·à¶±)',
# Contributions
-'contributions' => 'මෙම පරිà·à·“ලකගේ දà·à¶ºà¶šà¶­à·Šà·€à¶ºà¶±à·Š',
+'contributions' => '{{GENDER:$1|පරිà·à·“ලකගේ}} දà·à¶ºà¶šà¶­à·Šà·€à¶ºà¶±à·Š',
'contributions-title' => ' $1 සඳහ෠පරිà·à·“ලක දà·à¶ºà¶šà¶­à·Šà·€à¶ºà¶±à·Š',
'mycontris' => 'දà·à¶ºà¶šà¶­à·Šà·€',
'contribsub2' => '$1 සඳහ෠($2)',
@@ -2970,6 +2971,7 @@ $1 ගේ à·€à·à¶»à¶«à¶ºà¶§ හේතුව මෙය වේ: "$2"',
'pageinfo-default-sort' => 'පෙරනිමි තේරීම් යතුර',
'pageinfo-length' => 'පිටු දිග (බයිට් වලින්)',
'pageinfo-article-id' => 'පිටු අනන්â€à¶ºà¶±à·à¶‚කය',
+'pageinfo-language' => 'පිටු අන්තර්ගතයේ භà·à·‚à·à·€',
'pageinfo-robot-policy' => 'සෙවුම් එන්ජිම් තත්ත්වය',
'pageinfo-robot-index' => 'සුචිමය',
'pageinfo-robot-noindex' => 'සුචිමය නොවන',
@@ -2987,6 +2989,12 @@ $1 ගේ à·€à·à¶»à¶«à¶ºà¶§ හේතුව මෙය වේ: "$2"',
'pageinfo-recent-edits' => 'මෑත සංස්කරණ සංඛ්â€à¶ºà·à·€ (අවසන් $1 තුලදී)',
'pageinfo-recent-authors' => 'මෑත ප්â€à¶»à¶·à·’න්න කර්තෘවරුන් සංඛ්â€à¶ºà·à·€',
'pageinfo-magic-words' => 'මà·à¶¢à·’ක් {{PLURAL:$1|වචනය|වචන}} ($1)',
+'pageinfo-toolboxlink' => 'පිටු තොරතුරු',
+'pageinfo-redirectsto' => 'වෙත යළියොමු කරන්න',
+'pageinfo-redirectsto-info' => 'තොරතුරු',
+'pageinfo-contentpage' => 'අන්තර්ගත පිටුවක් ලෙස ගණනය ගණනය කර ඇත',
+'pageinfo-contentpage-yes' => 'ඔව්',
+'pageinfo-protect-cascading-yes' => 'ඔව්',
# Patrolling
'markaspatrolleddiff' => 'පරික්ෂà·à¶šà¶» බà·à¶½à·– ලෙස සලකුණු කරන්න',
@@ -3030,6 +3038,7 @@ $1',
'file-info-size-pages' => '$1 × $2 පික්සල, ගොනු තරම: $3, MIME වර්ගය: $4, $5 {{PLURAL:$5|පිටුව|පිටු}}',
'file-nohires' => 'මෙයට ඉහල විසර්ජනයක් දක්ව෠එළඹිය නොහà·à¶š.',
'svg-long-desc' => 'SVG ගොනුව, නà·à¶¸à¶¸à·à¶­à·Šâ€à¶»à·’කව $1 × $2 පික්සල්, ගොනු විà·à·à¶½à¶­à·Šà·€à¶º: $3',
+'svg-long-error' => 'අනීතික SVG ගොනුව: $1',
'show-big-image' => 'පූර්ණ විභේදනය',
'show-big-image-preview' => 'මෙම පෙරදසුනෙහි තරම: $1.',
'show-big-image-other' => 'අනෙකුත් {{PLURAL:$2|විභේදනය|විභේදනයන්}}: $1.',
@@ -3062,6 +3071,7 @@ $1',
'hours' => '{{PLURAL:$1|$1 පà·à¶º|$1 පà·à¶º}}',
'days' => '{{PLURAL:$1|$1 දවස|$1 දවස්}}',
'ago' => '$1 පෙර',
+'just-now' => 'මේ දà·à¶±à·Š',
# Bad image list
'bad_image_list' => 'ආකෘතිය පහත පරිදි වේ:
@@ -3932,7 +3942,7 @@ MediaWiki බෙදà·à·„à·à¶» ඇත්තේ එය ප්â€à¶»à¶ºà·à¶¢à¶±à
'logentry-newusers-create' => '$1 පරිà·à·“ලක ගිණුමක් තනන ලදී',
'logentry-newusers-create2' => '$1 විසින් $3 පරිà·à·“ලක ගිණුම තනන ලදී',
'logentry-newusers-autocreate' => '$1 ගිණුම ස්වංක්â€à¶»à·“යව නිර්මිතය',
-'newuserlog-byemail' => 'විද්â€à¶ºà·”ත්-තà·à¶´à·‘ලෙන් මුර-පදය යවන ලදි',
+'rightsnone' => '(කිසිවක් නොමà·à¶­)',
# Feedback
'feedback-subject' => 'විෂයය:',
diff --git a/languages/messages/MessagesSimple.php b/languages/messages/MessagesSimple.php
deleted file mode 100644
index 6d331d88..00000000
--- a/languages/messages/MessagesSimple.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-/** Simple English (Simple English)
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
- *
- * @ingroup Language
- * @file
- */
-
-$fallback = 'en';
diff --git a/languages/messages/MessagesSk.php b/languages/messages/MessagesSk.php
index e6dec96d..881aafae 100644
--- a/languages/messages/MessagesSk.php
+++ b/languages/messages/MessagesSk.php
@@ -415,6 +415,7 @@ $messages = array(
'newwindow' => '(otvorí v novom okne)',
'cancel' => 'Zrušiť',
'moredotdotdot' => 'Viac...',
+'morenotlisted' => 'Ďalšie neuvedené...',
'mypage' => 'Stránka',
'mytalk' => 'Diskusia',
'anontalk' => 'Diskusia k tejto IP adrese',
@@ -426,7 +427,6 @@ $messages = array(
'qbbrowse' => 'Prehliadať',
'qbedit' => 'Upraviť',
'qbpageoptions' => 'Táto stránka',
-'qbpageinfo' => 'Kontext',
'qbmyoptions' => 'Moje stránky',
'qbspecialpages' => 'Špeciálne stránky',
'faq' => 'Často kladené otázky',
@@ -449,6 +449,7 @@ $messages = array(
'namespaces' => 'Menné priestory',
'variants' => 'Varianty',
+'navigation-heading' => 'NavigaÄné menu',
'errorpagetitle' => 'Chyba',
'returnto' => 'Späť na $1.',
'tagline' => 'Z {{GRAMMAR:genitív|{{SITENAME}}}}',
@@ -689,12 +690,11 @@ Správca, ktorý ho zamkol ponúkol toto vysvetlenie: „$3“.',
# Login and logout pages
'logouttext' => "'''Práve ste sa odhlásili.'''
-Odteraz môžete používať {{GRAMMAR:akuzatív|{{SITENAME}}}} ako anonymný používateľ alebo sa môžete opäť [[Special:UserLogin|prihlásiť]] pod rovnakým alebo odlišným používateľským menom.
+Odteraz môžete používať {{GRAMMAR:akuzatív|{{SITENAME}}}} ako anonymný používateľ alebo sa môžete opäť <span class='plainlinks'>[$1 prihlásiť]</span> pod rovnakým alebo odlišným používateľským menom.
Uvedomte si, že niektoré stránky sa môžu naÄalej zobrazovaÅ¥ ako keby ste boli prihlásený, až kým nevymažete vyrovnávaciu pamäť vášho prehliadaÄa.",
-'welcomecreation' => '== Vitaj, $1! ==
-
-Vaše konto je vytvorené.
-Nezabudnite si nastaviť svoje [[Special:Preferences|používateľské nastavenia]].',
+'welcomeuser' => 'Vitajte, $1 !',
+'welcomecreation-msg' => 'Váš úÄet bol vytvorený.
+Nezabudnite zmeniť svoje [[Special:Preferences|Predvoľby {{GRAMMAR:genitív|{{SITENAME}}}}]].',
'yourname' => 'Používateľské meno:',
'yourpassword' => 'Heslo:',
'yourpasswordagain' => 'Zopakujte heslo:',
@@ -717,7 +717,7 @@ Nezabudnite si nastaviť svoje [[Special:Preferences|používateľské nastaveni
'gotaccount' => "Máte už vytvorený úÄet? '''$1'''.",
'gotaccountlink' => 'Prihlásiť',
'userlogin-resetlink' => 'Zabudli ste svoje prihlasovacie údaje?',
-'createaccountmail' => 'e-mailom',
+'createaccountmail' => 'PoužiÅ¥ doÄasné náhodné heslo a poslaÅ¥ ho na nižšie uvedenú emailovú adresu',
'createaccountreason' => 'Dôvod:',
'badretype' => 'Zadané heslá nie sú rovnaké.',
'userexists' => 'Zadané používateľské meno sa už používa.
@@ -789,6 +789,7 @@ Prosím, poÄkajte predtým, než to skúsite znova.',
# Email sending
'php-mail-error-unknown' => 'Neznáma chyba vo funkcii PHP mail()',
'user-mail-no-addy' => 'Pokus o odoslanie e-mailu bez e-mailovej adresy.',
+'user-mail-no-body' => 'Sa pokúsil poslať email s prázdnym alebo neprimerane krátkym telom správy.',
# Change password dialog
'resetpass' => 'Zmeniť heslo',
@@ -852,6 +853,7 @@ DoÄasné heslo:$2',
'changeemail-oldemail' => 'SúÄasná e-mailová adresa:',
'changeemail-newemail' => 'Nová e-mailová adresa:',
'changeemail-none' => '(žiadna)',
+'changeemail-password' => 'Vaše heslo k {{GRAMMAR:lokál|{{SITENAME}}}}:',
'changeemail-submit' => 'Zmeniť e-mail',
'changeemail-cancel' => 'Zrušiť',
@@ -1033,7 +1035,6 @@ Správca, ktorý ju zamkol, uviedol nasledovné vysvetlenie: $1",
'template-semiprotected' => '(ÄiastoÄne zamknutá)',
'hiddencategories' => 'Táto stránka patrí do {{PLURAL:$1|1 skrytej kategórie|$1 skrytých kategórií}}:',
'edittools' => '<!-- Tento text sa zobrazí pod upravovacím a nahrávacím formulárom. -->',
-'nocreatetitle' => 'Tvorba nových stránok bola obmedzená',
'nocreatetext' => 'Na {{GRAMMAR:lokál|{{SITENAME}}}} je tvorba nových stránok obmedzená.
Teraz sa môžete vrátiÅ¥ späť a upravovaÅ¥ existujúcu stránku alebo [[Special:UserLogin|sa prihlásiÅ¥ alebo vytvoriÅ¥ úÄet]].',
'nocreate-loggedin' => 'Nemáte povolenie vytvárať nové stránky.',
@@ -1058,6 +1059,15 @@ Zdá sa, že bola zmazaná.',
'edit-already-exists' => 'Nebolo možné vytvoriť novú stránku.
Už existuje.',
'defaultmessagetext' => 'Predvolený text správy',
+'content-failed-to-parse' => 'Nepodarilo sa spracovať obsah $2 pre model $1: $3',
+'invalid-content-data' => 'Neplatné dáta obsahu',
+'content-not-allowed-here' => 'Obsah „$1“ nie je povolený na stránke [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'Äistý text',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Upozornenie: Táto stránka obsahuje príliš mnoho volaní funkcií syntaktického analyzátora, ktoré nadmerne zaťažujú server.
@@ -1422,7 +1432,7 @@ Túto operáciu nemožno vrátiť.',
'youremail' => 'Váš e-mail²',
'username' => 'Používateľské meno:',
'uid' => 'ID používateľa:',
-'prefs-memberingroups' => 'Člen {{PLURAL:$1|skupiny|skupín}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Člen|Členovia}} {{PLURAL:$1|skupiny|skupín}}:',
'prefs-registration' => 'Čas registrácie:',
'yourrealname' => 'SkutoÄné meno *:',
'yourlanguage' => 'Jazyk:',
@@ -1570,12 +1580,13 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
'right-sendemail' => 'Posielať e-mail ostatným používateľom',
'right-passwordreset' => 'Prezeranie e-mailov pre znovunastavovanie hesla',
+# Special:Log/newusers
+'newuserlogpage' => 'Záznam vytvorených používateľov',
+'newuserlogpagetext' => 'Toto je záznam naposledy vytvorených používateľských úÄtov.',
+
# User rights log
'rightslog' => 'Záznam používateľských práv',
'rightslogtext' => 'Toto je záznam zmien práv používateľa.',
-'rightslogentry' => 'Älenstvo v skupine zmenené pre $1 z $2 na $3',
-'rightslogentry-autopromote' => 'bol automaticky povýšený z $2 na $3',
-'rightsnone' => '(žiadne)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ÄítaÅ¥ túto stránku',
@@ -1816,6 +1827,7 @@ Ak problém pretrváva, kontaktujte [[Special:ListUsers/sysop|správcu systému]
'backend-fail-notsame' => 'Nerovnaký súbor už existuje v $1 .',
'backend-fail-invalidpath' => '„$1“ nie je platná cesta úložiska.',
'backend-fail-delete' => 'Nebolo možné vymazať súbor „$1“.',
+'backend-fail-describe' => 'Nie je možné zmeniť metadáta súboru „$1“.',
'backend-fail-alreadyexists' => 'Súbor „$1“ už existuje.',
'backend-fail-store' => 'Nebolo možné uložiť súbor „$1“ na „$2“.',
'backend-fail-copy' => 'Nebolo možné skopírovať súbor „$1“ na „$2“.',
@@ -2045,6 +2057,12 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
Mali by však odkazovať priamo na príslušnú tému.<br />
Stránka sa považuje za rozliÅ¡ovaciu, keÄ používa Å¡ablónu, na ktorú odkazuje [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Stránky s vlastnosťou stránky',
+'pageswithprop-legend' => 'Stránky s vlastnosťou stránky',
+'pageswithprop-text' => 'Táto stránka obsahuje stránky, ktoré používajú konkrétnu vlastnosť stránky.',
+'pageswithprop-prop' => 'Názov vlastnosti:',
+'pageswithprop-submit' => 'Vykonať',
+
'doubleredirects' => 'Dvojité presmerovania',
'doubleredirectstext' => 'Táto stránka obsahuje zoznam stránok, ktoré presmerovávajú na iné presmerovacie stránky.
Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riadok z textu na ktorý odkazuje druhé presmerovanie, ktoré zvyÄajne odkazuje na „skutoÄný“ cieľ, na ktorý má odkazovaÅ¥ prvé presmerovanie.
@@ -2197,8 +2215,8 @@ Pozri aj [[Special:WantedCategories|žiadané kategórie]].',
'linksearch-ns' => 'Menný priestor:',
'linksearch-ok' => 'Hľadať',
'linksearch-text' => 'Je možné používať zástupné znaky, napr. „*.wikipedia.org“.
-Povinná je minimálne doména najvyššej úrovne, napr.. „*.org“.<br />
-Podporované protokoly: <code>$1</code> (ak protokol nie je uvedený, použije sa <code>http://</code>).',
+Povinná je minimálne doména najvyššej úrovne, napr. „*.org“.<br />
+{{PLURAL:$2|Podporovaný protokol|Podporované protokoly}}: <code>$1</code> (ak protokol nie je uvedený, použije sa http://).',
'linksearch-line' => 'Na $1 odkazuje $2',
'linksearch-error' => 'Zástupné znaky je možné použiÅ¥ iba na zaÄiatku názvu domény.',
@@ -2217,10 +2235,6 @@ Podporované protokoly: <code>$1</code> (ak protokol nie je uvedený, použije s
'activeusers-hidesysops' => 'Skryť správcov',
'activeusers-noresult' => 'Neboli nájdení žiadni používatelia.',
-# Special:Log/newusers
-'newuserlogpage' => 'Záznam vytvorených používateľov',
-'newuserlogpagetext' => 'Toto je záznam naposledy vytvorených používateľských úÄtov.',
-
# Special:ListGroupRights
'listgrouprights' => 'Práva skupiny používateľov',
'listgrouprights-summary' => 'Toto je zoznam skupín používateľov definovaných na tejto wiki a ich prístupových práv.
@@ -2315,26 +2329,30 @@ Budú tam uvedené aj budúce úpravy tejto stránky a jej diskusie.',
'enotif_mailer' => 'UpozorňovaÄ {{GRAMMAR:genitív|{{SITENAME}}}}',
'enotif_reset' => 'OznaÄiÅ¥ vÅ¡etky stránky ako „navÅ¡tívené“',
-'enotif_newpagetext' => 'Toto je nová stránka.',
'enotif_impersonal_salutation' => 'používateľ {{GRAMMAR:genitív|{{SITENAME}}}}',
-'changed' => 'zmene',
-'created' => 'vytvorení',
-'enotif_subject' => '{{SITENAME}} - stránka $PAGETITLE bola $CHANGEDORCREATED $PAGEEDITOR',
+'enotif_subject_deleted' => 'Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ odstránil používateľ $2',
+'enotif_subject_created' => 'Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ vytvoril používateľ $2',
+'enotif_subject_moved' => 'Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ presunul používateľ $2',
+'enotif_subject_restored' => 'Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ obnovil používateľ $2',
+'enotif_subject_changed' => 'Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ zmenil používateľ $2',
+'enotif_body_intro_deleted' => 'Stránka {{GENDER:genitív|{{SITENAME}}}} „$1“ zmazal $PAGEEDITDATE používateľ $2, pozri $3.',
+'enotif_body_intro_created' => 'Stránka {{GENDER:genitív|{{SITENAME}}}} „$1“ vytvoril $PAGEEDITDATE používateľ $2, pozri aktuálnu verziu $3.',
+'enotif_body_intro_moved' => 'Stránka {{GENDER:genitív|{{SITENAME}}}} „$1“ presunul $PAGEEDITDATE používateľ $2, pozri aktuálnu verziu $3.',
+'enotif_body_intro_restored' => 'Stránka {{GENDER:genitív|{{SITENAME}}}} „$1“ obnovil $PAGEEDITDATE používateľ $2, pozri aktuálnu verziu $3.',
+'enotif_body_intro_changed' => 'Stránka {{GENDER:genitív|{{SITENAME}}}} „$1“ zmenil $PAGEEDITDATE používateľ $2, pozri aktuálnu verziu $3.',
'enotif_lastvisited' => 'Všetky zmeny od vašej poslednej návštevy uvidíte na $1.',
'enotif_lastdiff' => 'Zmenu uvidíte v $1.',
'enotif_anon_editor' => 'anonymný používateľ $1',
'enotif_body' => 'Drahý $WATCHINGUSERNAME,
-na {{GRAMMAR:lokál|{{SITENAME}}}} $CHANGEDORCREATED používateľ $PAGEEDITOR stránku $PAGETITLE, pozrite si aktuálnu verziu $PAGETITLE_URL .
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Zhrnutie redaktora: $PAGESUMMARY $PAGEMINOREDIT
Kontaktujte používateľa:
mail: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Nedostanete ÄalÅ¡ie upozornenia, aj ak bude stránka znovu upravovaná, kým nenavÅ¡tívite túto stránku.
+Nedostanete ÄalÅ¡ie upozornenia ani v prípade Äalších aktivít na strínke, kým túto stránku nenavÅ¡tívite.
Možete tiež vynulovať upozornenia pre všetky vaše sledované stránky.
Váš upozorňovací systém {{GRAMMAR:genitív|{{SITENAME}}}}
@@ -2348,6 +2366,8 @@ $UNWATCHURL
Návrhy a ÄalÅ¡ia pomoc:
{{canonicalurl:{{int:Helppage}}}}',
+'created' => 'vytvorení',
+'changed' => 'zmene',
# Delete
'deletepage' => 'Zmazať stránku',
@@ -2414,6 +2434,8 @@ Môžete si pozrieť aj [[Special:ProtectedPages|zoznam momentálne platných oc
'prot_1movedto2' => '[[$1]] premiestnená na [[$2]]',
'protect-badnamespace-title' => 'Nezamykateľný menný priestor',
'protect-badnamespace-text' => 'Stránky v tomto mennom priestore nie je možné zamykať.',
+'protect-norestrictiontypes-text' => 'Túto stránku nie je možné chrániť, pretože nie sú k dispozícii žiadne typy obmedzení.',
+'protect-norestrictiontypes-title' => 'Neochrániteľná stránka',
'protect-legend' => 'PotvrÄte zamknutie',
'protectcomment' => 'Dôvod:',
'protectexpiry' => 'Zamknuté do:',
@@ -2495,7 +2517,8 @@ Ak bola od zmazania vytvorená nová stránka s rovnakým názvom, obnovené rev
'undeletedrevisions' => '{{PLURAL:$1|jedna verzia bola obnovená|$1 verzie boli obnovené|$1 verzií bolo obnovených}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Jedna revízia|$1 revízie|$1 revízií}} a {{PLURAL:$2|jeden súbor bol obnovený|$2 súbory boli obnovené|$2 súborov bolo obnovených}}',
'undeletedfiles' => '{{PLURAL:$1|Jeden súbor bol obnovený|$1 súbory boli obnovené|$1 súborov bolo obnovených}}',
-'cannotundelete' => 'Obnovenie sa nepodarilo; pravdepodobne niekto iný obnovil stránku skôr ako vy.',
+'cannotundelete' => 'Obnovenie sa nepodarilo:
+$1',
'undeletedpage' => "'''$1 bol obnovený'''
Zoznam posledných mazaní a obnovení nájdete v [[Special:Log/delete|Zázname mazaní]].",
@@ -2809,6 +2832,7 @@ Cieľová stránka „[[:$1]]“ už existuje. Chcete ho vymazať a vytvoriť ta
'immobile-target-namespace-iw' => 'Interwiki odkaz nie je platným cieľom na presun stránky.',
'immobile-source-page' => 'Túto stránku nemožno presunúť.',
'immobile-target-page' => 'Nie je možné presunúť na cieľovú stránku z daným názvom.',
+'bad-target-model' => 'Požadovaný cieľ používa iný model obsahu. Nie je možné konvertovať z $1 na $2.',
'imagenocrossnamespace' => 'Obrázok nemožno presunúť mimo menného priestoru obrázkov',
'nonfile-cannot-move-to-file' => 'Nie je možné presunúť objekt, ktorý nie je súbor do menného priestoru Súbor',
'imagetypemismatch' => 'Nová prípona súboru nezodpovedá jeho typu',
@@ -2934,7 +2958,6 @@ Uložte ho na svoj disk a nahrajte sem.',
# JavaScriptTest
'javascripttest' => 'Testovanie JavaScriptu',
-'javascripttest-disabled' => 'Táto funkcia je vypnutá.',
'javascripttest-title' => 'Beží $1 testov',
'javascripttest-pagetext-noframework' => 'Táto stránka je vyhradená pre testy JavaScriptu.',
'javascripttest-pagetext-unknownframework' => 'Neznáma testovacia platfoma „$1“.',
@@ -3084,6 +3107,7 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
'pageinfo-default-sort' => 'Predvolený kÄ¾ÃºÄ zoraÄovania:',
'pageinfo-length' => 'Dĺžka stránky (v bajtoch)',
'pageinfo-article-id' => 'ID stránky',
+'pageinfo-language' => 'Jazyk obsahu stránok',
'pageinfo-robot-policy' => 'Stav vyhľadávaÄa',
'pageinfo-robot-index' => 'Indexovať stránku',
'pageinfo-robot-noindex' => 'Neindexovať stránku',
@@ -3103,6 +3127,14 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
'pageinfo-magic-words' => 'Magické {{PLURAL:$1|slovo|slová}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Skrytá kategória|Skryté kategórie}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Vložená šablóna|Vložené šablóny}} ($1)',
+'pageinfo-toolboxlink' => 'Informácie o stránke',
+'pageinfo-redirectsto' => 'Presmerovanie na',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'PoÄíta sa ako obsah stránky',
+'pageinfo-contentpage-yes' => 'Ãno',
+'pageinfo-protect-cascading' => 'Kaskádové zamknutie',
+'pageinfo-protect-cascading-yes' => 'Ãno',
+'pageinfo-protect-cascading-from' => 'Zámky pochádzajú z kaskádových zamknutí',
# Skin names
'skinname-standard' => 'Klasický',
@@ -3125,6 +3157,8 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
'markedaspatrollederror' => 'Nie je možné oznaÄiÅ¥ ako strážené',
'markedaspatrollederrortext' => 'Pre oznaÄenie ako strážený je potrebné uviesÅ¥ revíziu, ktorá sa má oznaÄiÅ¥ ako strážená.',
'markedaspatrollederror-noautopatrol' => 'Nie je vám umožnené oznaÄiÅ¥ vlastné zmeny za strážené.',
+'markedaspatrollednotify' => 'Táto zmena stránky $1 bola oznaÄená ako strážená.',
+'markedaspatrollederrornotify' => 'OznaÄenie ako strážená zlyhalo.',
# Patrol log
'patrol-log-page' => 'Záznam strážení',
@@ -3158,6 +3192,7 @@ Jeho spustením môžete kompromitovať svoj systém.",
'file-nohires' => 'Nie je dostupné vyššie rozlíšenie.',
'svg-long-desc' => 'SVG súbor, $1 × $2 pixelov, veľkosť súboru: $3',
'svg-long-desc-animated' => 'Animovaný súbor SVG, nominálne $1 × $2 pixlov, veľkosť súboru: $3',
+'svg-long-error' => 'Neplatný súbor SVG: $1',
'show-big-image' => 'Obrázok vo vyššom rozlíšení',
'show-big-image-preview' => 'Veľkosť tohto náhľadu: $1.',
'show-big-image-other' => 'Iné {{PLURAL:$2|rozlíšenie|rozlíšenia}}: $1 .',
@@ -3187,7 +3222,10 @@ Jeho spustením môžete kompromitovať svoj systém.",
'minutes' => '{{PLURAL:$1|$1 minúta|$1 minúty|$1 minút}}',
'hours' => '{{PLURAL:$1|$1 hodina|$1 hodiny|$1 hodín}}',
'days' => '{{PLURAL:$1|$1 deň|$1 dni|$1 dní}}',
+'months' => '{{PLURAL:$1|$1 mesiac|$1 mesiace|$1 mesiacov}}',
+'years' => '{{PLURAL:$1|$1 rok|$1 rok|$1 rokov}}',
'ago' => 'pred: $1',
+'just-now' => 'Pred chvíľkou',
# Bad image list
'bad_image_list' => 'Formát je nasledovný:
@@ -3689,6 +3727,7 @@ Platnosť tohto potvrdzovacieho kódu vyprší $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Transklúzia interwiki je vypnutá]',
'scarytranscludefailed' => '[Nepodarilo sa priniesť šablónu pre $1]',
+'scarytranscludefailed-httpstatus' => '[Stiahnutie šablóny zlyhalo pre $1: HTTP $2]',
'scarytranscludetoolong' => '[URL je príliš dlhé]',
# Delete conflict
@@ -3802,6 +3841,7 @@ Tiež môžete [[Special:EditWatchlist|použiť štandardný editor]].',
'version-license' => 'Licencia',
'version-poweredby-credits' => "Táto wiki beží na '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'Äalší',
+'version-credits-summary' => 'Nasledujúcim osobám by sme radi poÄakovali za ich príspevky k vývoju [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki je slobodný softvér; môžete ho šíriÅ¥ a / alebo modifikovaÅ¥ podľa podmienok GNU General Public License, ktorú vydala Free Software Foundation; a to buÄ verzie 2 tejto licencie alebo (podľa vášho uváženia) ktorejkoľvek neskorÅ¡ej verzie.
MediaWiki je šírený v nádeji, že bude užitoÄný, avÅ¡ak BEZ AKEJKOĽVEK ZÃRUKY; neposkytujú sa ani implicitné záruky PREDAJNOSTI alebo VHODNOSTI NA URÄŒITà ÚČEL. ÄŽalÅ¡ie informácie nájdete v GNU General Public License.
@@ -3916,16 +3956,16 @@ Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v p
'sqlite-no-fts' => '$1 bez podpory vyhľadávania v plnom texte',
# New logging system
-'logentry-delete-delete' => '$1 zmazal(a) stránku $3',
-'logentry-delete-restore' => '$1 obnovil(a) stránku $3',
-'logentry-delete-event' => '$1 zmenil viditeľnosť {{PLURAL:$5|protokolovacieho záznamu|$5 protokolovacích záznamov}} k stránke $3: $4',
+'logentry-delete-delete' => '$1 zmazal stránku $3',
+'logentry-delete-restore' => '$1 obnovil stránku $3',
+'logentry-delete-event' => '$1 zmenil viditeľnosť {{PLURAL:$5|záznamu udalostí|$5 záznamov udalostí}} k stránke $3: $4',
'logentry-delete-revision' => '$1 zmenil viditeľnosť {{PLURAL:$5|revízie|$5 revízií}} na stránke $3: $4',
-'logentry-delete-event-legacy' => '$1 zmenil viditeľnosť protokolovacích záznamov k stránke $3',
+'logentry-delete-event-legacy' => '$1 zmenil viditeľnosť záznamov udalostí k stránke $3',
'logentry-delete-revision-legacy' => '$1 zmenil viditeľnosť revízií na stránke $3',
'logentry-suppress-delete' => '$1 utajil stránku $3',
-'logentry-suppress-event' => '$1 utajene zmenil viditeľnosť {{PLURAL:$5|protokolovacieho záznamu|$5 protokolovacích záznamov}} k stránke $3: $4',
+'logentry-suppress-event' => '$1 utajene zmenil viditeľnosť {{PLURAL:$5|záznamu udalostí|$5 záznamov udalostí}} k stránke $3: $4',
'logentry-suppress-revision' => '$1 utajene zmenil viditeľnosť {{PLURAL:$5|revízie|$5 revízií}} na stránke $3: $4',
-'logentry-suppress-event-legacy' => '$1 utajene zmenil viditeľnosť protokolovacích záznamov k stránke $3',
+'logentry-suppress-event-legacy' => '$1 utajene zmenil viditeľnosť záznamov udalostí k stránke $3',
'logentry-suppress-revision-legacy' => '$1 utajene zmenil viditeľnosť revízií na stránke $3',
'revdelete-content-hid' => 'obsah skrytý',
'revdelete-summary-hid' => 'zhrnutie editácie skryté',
@@ -3938,14 +3978,18 @@ Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v p
'logentry-move-move' => '$1 premiestnil stránku $3 na $4',
'logentry-move-move-noredirect' => '$1 premiestnil stránku $3 na $4, ale neponechal presmerovanie',
'logentry-move-move_redir' => '$1 premiestnil stránku $3 na $4 prostredníctvom presmerovania',
-'logentry-move-move_redir-noredirect' => '$1 premiestnil stránku $3 na $4 prostredníctvom presmerovania, ale neponechal presmerovanie',
-'logentry-patrol-patrol' => '$1 oznaÄil revíziu $4 stránky $3 ako overenú',
-'logentry-patrol-patrol-auto' => '$1 automaticky oznaÄil revíziu $4 stránky $3 ako overenú',
+'logentry-move-move_redir-noredirect' => '$1 premiestnil stránku $3 na $4 prostredníctvom presmerovania, ale neponechal presmerovanie',
+'logentry-patrol-patrol' => '$1 oznaÄil revíziu $4 stránky $3 ako stráženú',
+'logentry-patrol-patrol-auto' => '$1 automaticky oznaÄil revíziu $4 stránky $3 ako stráženú',
'logentry-newusers-newusers' => 'Bol vytvorený používateľský úÄet $1',
'logentry-newusers-create' => 'Bol vytvorený používateľský úÄet $1',
'logentry-newusers-create2' => '$1 vytvoril používateľský úÄet $3',
-'logentry-newusers-autocreate' => 'Automaticky bol založený úÄet $1',
-'newuserlog-byemail' => 'heslo poslané emailom',
+'logentry-newusers-byemail' => '$1 vytvoril používateľský úÄet $3 a heslo bolo poslané emailom',
+'logentry-newusers-autocreate' => 'Používateľský úÄet $1 bol vytvorený automaticky',
+'logentry-rights-rights' => '$1 zmenil Älenstvo $3 v skupinách z $4 na $5',
+'logentry-rights-rights-legacy' => '$1 zmenil Älenstvo $3 v skupinách',
+'logentry-rights-autopromote' => '$1 bol automaticky povýšený z $4 na $5',
+'rightsnone' => '(žiadne)',
# Feedback
'feedback-bugornote' => 'Ak ste pripravený podrobne popísať technický problém, prosím pošlite [$1 hlásenie o chybe].
@@ -3999,6 +4043,7 @@ V opaÄnom prípade môžete použiÅ¥ zjednoduÅ¡ený formulár nižšie. Váš k
'api-error-ok-but-empty' => 'Vnútorná chyba: Žiadna odpoveÄ zo servera.',
'api-error-overwrite' => 'Prepísanie existujúceho súboru nie je povolené.',
'api-error-stashfailed' => 'Vnútorná chyba: Serveru sa nepodarilo uložiÅ¥ doÄasný súbor.',
+'api-error-publishfailed' => 'Vnútorná chyba: Serveru sa nepodarilo publikovaÅ¥ doÄasný súbor.',
'api-error-timeout' => 'Server neodpovedal v oÄakávanom Äase.',
'api-error-unclassified' => 'Vyskytla sa neznáma chyba.',
'api-error-unknown-code' => 'Neznáma chyba: „$1“',
@@ -4019,4 +4064,7 @@ V opaÄnom prípade môžete použiÅ¥ zjednoduÅ¡ený formulár nižšie. Váš k
'duration-centuries' => '$1 {{PLURAL:$1|storoÄie|storoÄia|storoÄí}}',
'duration-millennia' => '$1 {{PLURAL:$1|tisícroÄie|tisícroÄia|tisícroÄí}}',
+# Image rotation
+'rotate-comment' => 'Obrázok otoÄený o $1 {{PLURAL:$1|stupeň|stupne|stupňov}} v smere hodinových ruÄiÄiek',
+
);
diff --git a/languages/messages/MessagesSl.php b/languages/messages/MessagesSl.php
index c6db73bb..6b8c7cea 100644
--- a/languages/messages/MessagesSl.php
+++ b/languages/messages/MessagesSl.php
@@ -13,6 +13,7 @@
* @author Irena Plahuta
* @author McDutchie
* @author Smihael
+ * @author Vadgt
* @author XJamRastafire
* @author Yerpo
* @author romanm
@@ -318,6 +319,7 @@ $messages = array(
'newwindow' => '(odpre se novo okno)',
'cancel' => 'PrekliÄi',
'moredotdotdot' => 'VeÄ ...',
+'morenotlisted' => 'VeÄ ni navedenih ...',
'mypage' => 'Stran',
'mytalk' => 'Pogovor',
'anontalk' => 'Pogovorna stran IP-naslova',
@@ -329,7 +331,6 @@ $messages = array(
'qbbrowse' => 'Prebrskaj',
'qbedit' => 'Uredi',
'qbpageoptions' => 'Možnosti strani',
-'qbpageinfo' => 'Podatki o strani',
'qbmyoptions' => 'Moje strani',
'qbspecialpages' => 'Posebne strani',
'faq' => 'Najpogostejša vprašanja',
@@ -352,6 +353,7 @@ $messages = array(
'namespaces' => 'Imenski prostori',
'variants' => 'RazliÄice',
+'navigation-heading' => 'Navigacijski meni',
'errorpagetitle' => 'Napaka',
'returnto' => 'Vrnite se na $1.',
'tagline' => 'Iz {{GRAMMAR:rodilnik|{{SITENAME}}}}',
@@ -596,10 +598,10 @@ Administrator, ki ga je zaklenil, je podal naslednje pojasnilo: »$3«.',
# Login and logout pages
'logouttext' => "'''Odjavili ste se.'''
-{{GRAMMAR:tožilnik|{{SITENAME}}}} lahko zdaj uporabljate neprijavljeni ali pa se [[Special:UserLogin|ponovno prijavite]] kot enak ali drug uporabnik.
+{{GRAMMAR:tožilnik|{{SITENAME}}}} lahko zdaj uporabljate neprijavljeni ali pa se <span class='plainlinks'>[$1 ponovno prijavite]</span> kot enak ali drug uporabnik.
Morda bodo nekatere strani Å¡e naprej prikazane, kot da ste prijavljeni, dokler ne boste izpraznili predpomnilnika brskalnika.",
-'welcomecreation' => '== Dobrodošli, $1! ==
-Ustvarili ste raÄun.
+'welcomeuser' => '$1, dobrodošli!',
+'welcomecreation-msg' => 'Ustvarili ste raÄun.
Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rodilnik|{{SITENAME}}}}]].',
'yourname' => 'Uporabniško ime:',
'yourpassword' => 'Geslo:',
@@ -623,7 +625,7 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
'gotaccount' => 'RaÄun že imate? $1.',
'gotaccountlink' => 'Prijavite se',
'userlogin-resetlink' => 'Ste pozabili svoje prijavne podatke?',
-'createaccountmail' => 'Po e-pošti',
+'createaccountmail' => 'Ustvari zaÄasno nakljuÄno geslo in ga poÅ¡lji na spodaj navedeni e-poÅ¡tni naslov',
'createaccountreason' => 'Razlog:',
'badretype' => 'Gesli, ki ste ju vnesli, se ne ujemata.',
'userexists' => 'Uporabniško ime, ki ste ga vnesli, je že zasedeno.
@@ -703,6 +705,7 @@ Prosimo poÄakajte, preden poskusite znova.',
# Email sending
'php-mail-error-unknown' => 'Neznana napaka v funkciji PHP mail()',
'user-mail-no-addy' => 'Poskušal poslati e-pošto brez e-poštnega naslova',
+'user-mail-no-body' => 'Poskušali ste poslati e-pošto s prazno ali nerazumno kratko vsebino.',
# Change password dialog
'resetpass' => 'Spremeni geslo',
@@ -760,7 +763,7 @@ svojega starega gesla.',
ZaÄasno geslo: $2',
'passwordreset-emailsent' => 'Poslali smo e-pošto za postavitev gesla.',
'passwordreset-emailsent-capture' => 'Poslali smo e-pošto za ponastavitev gesla, ki je prikazana spodaj.',
-'passwordreset-emailerror-capture' => 'E-poštni opomnik je bil poslan in je prikazan spodaj, vendar pa pošiljanje uporabniku ni uspelo: $1',
+'passwordreset-emailerror-capture' => 'Ustvarili smo e-pošto za ponastavitev gesla, ki je prikazana spodaj, vendar pa pošiljanje uporabniku ni uspelo: $1',
# Special:ChangeEmail
'changeemail' => 'Sprememba e-poštnega naslova',
@@ -770,6 +773,7 @@ ZaÄasno geslo: $2',
'changeemail-oldemail' => 'Trenutni e-poštni naslov:',
'changeemail-newemail' => 'Novi e-poštni naslov:',
'changeemail-none' => '(noben)',
+'changeemail-password' => 'Vaše geslo na {{GRAMMAR:orodnik|{{SITENAME}}}}:',
'changeemail-submit' => 'Spremeni e-naslov',
'changeemail-cancel' => 'PrekliÄi',
@@ -949,7 +953,6 @@ Za sklic je priskrbljen spodnji dnevnik vnosov:",
'template-semiprotected' => '(delno zaÅ¡Äitena)',
'hiddencategories' => 'Ta stran je v vsebovana v {{PLURAL:$1|1 skriti kategoriji|$1 skritih kategorijah}}:',
'edittools' => '<!-- To besedilo bo prikazano pod urejevalnim poljem in poljem za nalaganje. -->',
-'nocreatetitle' => 'Ustvarjanje strani je omejeno',
'nocreatetext' => '{{SITENAME}} ima omejeno zmožnost za ustvarjanje novih strani.
Lahko se vrnete nazaj in urejate že obstojeÄe strani, ali pa se [[Special:UserLogin|prijavite ali ustvarite raÄun]].',
'nocreate-loggedin' => 'Nimate pravic, da bi ustvarjali nove strani.',
@@ -972,6 +975,15 @@ Izgleda, da je bila izbrisana.',
'edit-no-change' => 'Vaše urejanje je bilo prezrto, saj ni vsebovalo sprememb.',
'edit-already-exists' => 'Ni bilo mogoÄe ustvariti nove strani, ker že obstaja.',
'defaultmessagetext' => 'Prednastavljeno besedilo',
+'content-failed-to-parse' => 'Nisem mogel razÄleniti vsebine $2 za obliko $1: $3',
+'invalid-content-data' => 'Neveljavni podatki vsebine',
+'content-not-allowed-here' => 'Vsebina »$1« ni dovoljena na strani [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikibesedilo',
+'content-model-text' => 'golo besedilo',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Opozorilo:''' Ta stran vsebuje preveÄ klicev funkcije razÄlenjevalnika kode.
@@ -1339,9 +1351,9 @@ Tega ni mogoÄe razveljaviti.',
'prefs-emailconfirm-label' => 'Potrditev e-pošte:',
'prefs-textboxsize' => 'Velikost urejevalnega polja',
'youremail' => 'E-poštni naslov:',
-'username' => 'Uporabniško ime:',
-'uid' => 'ID uporabnika:',
-'prefs-memberingroups' => 'ÄŒlan {{PLURAL:$1|naslednje skupine|naslednjih skupin}}:',
+'username' => '{{GENDER:$1|UporabniÅ¡ko|UporabniÄino}} ime:',
+'uid' => 'ID {{GENDER:$1|uporabnika|uporabnice}}:',
+'prefs-memberingroups' => '{{GENDER:$2|ÄŒlan|ÄŒlanica}} {{PLURAL:$1|naslednje skupine|naslednjih skupin}}:',
'prefs-memberingroups-type' => '$1',
'prefs-registration' => 'Registriran od:',
'yourrealname' => 'Pravo ime:',
@@ -1493,12 +1505,13 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
'right-sendemail' => 'Pošiljanje e-pošte drugim uporabnikom',
'right-passwordreset' => 'Ogled e-pošt ponastavitve gesel',
+# Special:Log/newusers
+'newuserlogpage' => 'Dnevnik registracij uporabnikov',
+'newuserlogpagetext' => 'Prikazan je dnevnik nedavnih registracij novih uporabnikov.',
+
# User rights log
'rightslog' => 'Dnevnik uporabniških pravic',
'rightslogtext' => 'Prikazan je dnevnik sprememb uporabniških pravic.',
-'rightslogentry' => 'je spremenil(-a) pravice uporabnika $1 iz $2 v $3',
-'rightslogentry-autopromote' => 'je bil(-a) samodejno povišan(-a) z $2 na $3',
-'rightsnone' => '(nobeno)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'branje te strani',
@@ -1746,6 +1759,7 @@ Prosimo, preverite veljavnost in dostopnost naslova URL ter poskusite ponovno.
'backend-fail-notsame' => 'RazliÄna datoteka že obstaja na $1.',
'backend-fail-invalidpath' => '$1 ni veljavna skladiÅ¡Äna pot.',
'backend-fail-delete' => 'Ne morem izbrisati datoteke $1.',
+'backend-fail-describe' => 'Nisem mogel spremeniti metapodatkov datoteke »$1«.',
'backend-fail-alreadyexists' => 'Datoteka $1 že obstaja.',
'backend-fail-store' => 'Ne morem shraniti datoteke $1 na $2.',
'backend-fail-copy' => 'Ne morem kopirati datoteke $1 na $2.',
@@ -1984,6 +1998,12 @@ Preden jih izbrišete, preverite še druge povezave nanje.',
Namesto tega bi morda bilo bolje, da se povezujejo na primernejše strani.<br />
Stran se obravnava kot razloÄitvena, Äe uporablja predloge, povezane z [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Strani z lastnostmi strani',
+'pageswithprop-legend' => 'Strani z lastnostmi strani',
+'pageswithprop-text' => 'Stran navaja vse strani, ki uporabljajo doloÄene lastnosti strani.',
+'pageswithprop-prop' => 'Ime lastnosti:',
+'pageswithprop-submit' => 'Pojdi',
+
'doubleredirects' => 'Dvojne preusmeritve',
'doubleredirectstext' => 'Ta stran navaja strani, ki se preusmerjajo na druge preusmeritvene strani.
Vsaka vrstica vsebuje povezavo do prve in druge preusmeritve, kakor tudi do cilja druge preusmeritve, ki je po navadi »prava« ciljna stran, na katero naj bi kazala prva preusmeritev.
@@ -2137,7 +2157,7 @@ Glej tudi [[Special:WantedCategories|želene kategorije]].',
'linksearch-ok' => 'IÅ¡Äi',
'linksearch-text' => 'Uporabljate lahko nadomestne znake, kot je »*.wikipedia.org«.
Zahtevana je vsaj najvišja domena, na primer »*.org«.<br />
-Podprti protokoli: <code>$1</code> (Äe protokol ni doloÄen, se privzame http://).',
+{{PLURAL:$2|Podprt protokol|Podprta protokola|Podprti protokoli}}: <code>$1</code> (Äe protokol ni doloÄen, se privzame http://).',
'linksearch-line' => '$1 povezano iz $2',
'linksearch-error' => 'Jokerji se lahko pojavijo le na zaÄetku gostiteljskega imena.',
@@ -2156,10 +2176,6 @@ Podprti protokoli: <code>$1</code> (Äe protokol ni doloÄen, se privzame http:/
'activeusers-hidesysops' => 'Skrij administratorje',
'activeusers-noresult' => 'Noben uporabnik ni bil najden.',
-# Special:Log/newusers
-'newuserlogpage' => 'Dnevnik registracij uporabnikov',
-'newuserlogpagetext' => 'Prikazan je dnevnik nedavnih registracij novih uporabnikov.',
-
# Special:ListGroupRights
'listgrouprights' => 'Pravice uporabniških skupin',
'listgrouprights-summary' => 'Tu je na razpolago seznam uporabniških skupin na tem wikiju z navedbo dodeljenih pravic dostopa.
@@ -2254,20 +2270,23 @@ Morebitne spremembe te strani in pripadajoÄe pogovorne strani bodo navedene tuk
'enotif_mailer' => 'Obvestilni poštar {{GRAMMAR:rodilnik|{{SITENAME}}}}',
'enotif_reset' => 'OznaÄi vse strani kot prebrane',
-'enotif_newpagetext' => 'To je nova stran.',
'enotif_impersonal_salutation' => 'Uporabnik {{GRAMMAR:rodilnik|{{SITENAME}}}}',
-'changed' => 'spremenil',
-'created' => 'ustvaril',
-'enotif_subject' => 'Stran {{GRAMMAR:rodilnik|{{SITENAME}}}} $PAGETITLE je $CHANGEDORCREATED $PAGEEDITOR',
+'enotif_subject_deleted' => '{{GENDER:$2|Uporabnik|Uporabnica}} $2 je {{GENDER:$2|izbrisal|izbrisala}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}',
+'enotif_subject_created' => '{{GENDER:$2|Uporabnik|Uporabnica}} $2 je {{GENDER:$2|ustvaril|ustvarila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}',
+'enotif_subject_moved' => '{{GENDER:$2|Uporabnik|Uporabnica}} $2 je {{GENDER:$2|prestavil|prestavila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}',
+'enotif_subject_restored' => '{{GENDER:$2|Uporabnik|Uporabnica}} $2 je {{GENDER:$2|obnovil|obnovila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}',
+'enotif_subject_changed' => '{{GENDER:$2|Uporabnik|Uporabnica}} $2 je {{GENDER:$2|spremenil|spremenila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}',
+'enotif_body_intro_deleted' => '{{GENDER:$2|uporabnik|uporabnica}} $2 je dne $PAGEEDITDATE {{GENDER:$2|izbrisal|izbrisala}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}; glejte $3.',
+'enotif_body_intro_created' => '{{GENDER:$2|uporabnik|uporabnica}} $2 je dne $PAGEEDITDATE {{GENDER:$2|ustvaril|ustvarila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}; za trenutno redakcijo glejte $3.',
+'enotif_body_intro_moved' => '{{GENDER:$2|uporabnik|uporabnica}} $2 je dne $PAGEEDITDATE {{GENDER:$2|spremenil|spremenila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}; za trenutno redakcijo glejte $3.',
+'enotif_body_intro_restored' => '{{GENDER:$2|uporabnik|uporabnica}} $2 je dne $PAGEEDITDATE {{GENDER:$2|obnovil|obnovila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}; za trenutno redakcijo glejte $3.',
+'enotif_body_intro_changed' => '{{GENDER:$2|uporabnik|uporabnica}} $2 je dne $PAGEEDITDATE {{GENDER:$2|spremenil|spremenila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}; za trenutno redakcijo glejte $3.',
'enotif_lastvisited' => 'Za spremembe po vašem zadnjem obisku glejte $1.',
'enotif_lastdiff' => 'Glej $1 za to spremembo.',
'enotif_anon_editor' => 'brezimni uporabnik $1',
'enotif_body' => '$WATCHINGUSERNAME,
-stran v {{GRAMMAR:dajalnik|{{SITENAME}}}} $PAGETITLE je dne $PAGEEDITDATE $CHANGEDORCREATED uporabnik $PAGEEDITOR,
-za trenutno redakcijo glejte $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
UrejevalÄev povzetek: $PAGESUMMARY $PAGEMINOREDIT
@@ -2275,8 +2294,7 @@ Navežite stik z urejevalcem:
e-pošta: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Nadaljnjih obvestil do obiska strani ne boste prejemali.
-Na spisku nadzorov lahko tudi ponastavite zastavice obveÅ¡Äanj za vse spremljane strani.
+Nadaljnjih obvestil do obiska strani ne boste prejemali. Na spisku nadzorov lahko tudi ponastavite zastavice obveÅ¡Äanj za vse spremljane strani.
Vaš opozorilni sistem {{GRAMMAR:rodilnik|{{SITENAME}}}}
@@ -2292,6 +2310,8 @@ $UNWATCHURL
Povratna sporoÄila in pomoÄ:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'ustvaril',
+'changed' => 'spremenil',
# Delete
'deletepage' => 'Briši stran',
@@ -2362,6 +2382,8 @@ Oglejte si [[Special:ProtectedPages|seznam zaÅ¡Äitenih strani]] za seznam trenu
'prot_1movedto2' => 'je prestavil(-a) [[$1]] na [[$2]]',
'protect-badnamespace-title' => 'NezaÅ¡Äitljiv imenski prostor',
'protect-badnamespace-text' => 'Strani v tem imenskem prostoru ni mogoÄe zaÅ¡Äititi.',
+'protect-norestrictiontypes-text' => 'Strani ni mogoÄe zaÅ¡Äititi, saj zanjo ni na voljo nobena vrsta omejitve.',
+'protect-norestrictiontypes-title' => 'Stran, ki je ni mogoÄe zaÅ¡Äititi',
'protect-legend' => 'Potrdite zaÅ¡Äito',
'protectcomment' => 'Razlog:',
'protectexpiry' => 'PoteÄe:',
@@ -2447,8 +2469,8 @@ Morda imate napaÄno povezavo ali pa je bila redakcija obnovljena ali odstranjen
'undeletedrevisions' => '{{PLURAL:$1|obnovljena $1 redakcija|obnovljeni $1 redakciji|obnovljene $1 redakcije|obnovljenih $1 redakcij}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}} in $2 {{PLURAL:$2|datoteka|datoteki|datoteke|datotek}} {{PLURAL:$1+$2|obnovljena|obnovljeni|obnovljene|obnovljenih}}',
'undeletedfiles' => '{{PLURAL:$1|obnovljena je $1 datoteka|obnovljeni sta $1 datoteki|obnovljene so $1 datoteke|obnovljenih je $1 datotek}}',
-'cannotundelete' => 'Obnova ni uspela;
-morda je stran obnovil že kdo drug.',
+'cannotundelete' => 'Obnova je spodletela:
+$1',
'undeletedpage' => "'''Obnovili ste stran $1.'''
Nedavna brisanja in obnove so zapisani v [[Special:Log/delete|dnevniku brisanja]].",
@@ -2480,7 +2502,7 @@ $1',
'blanknamespace' => '(Osnovno)',
# Contributions
-'contributions' => 'Uporabnikovi prispevki',
+'contributions' => '{{GENDER:$1|Uporabnikovi|UporabniÄini}} prispevki',
'contributions-title' => 'Prispevki uporabnika $1',
'mycontris' => 'Prispevki',
'contribsub2' => 'Uporabnik: $1 ($2)',
@@ -2756,6 +2778,7 @@ strani ni mogoÄe prestaviti samo vaÅ¡e.',
'immobile-target-namespace-iw' => 'Povezava interwiki ni veljaven cilj za premik strani.',
'immobile-source-page' => 'Te strani ni mogoÄe prestaviti.',
'immobile-target-page' => 'Ne morem premakniti na ta ciljni naslov.',
+'bad-target-model' => 'Želen cilj uporablja drugaÄno obliko vsebine. Ne morem pretvoriti iz $1 v $2.',
'imagenocrossnamespace' => 'Ne morem premakniti datoteke izven imenskega prostora datotek',
'nonfile-cannot-move-to-file' => 'Ne morem premakniti nedatoteko v imenski prostor datotek',
'imagetypemismatch' => 'Nova konÄnica datoteke se ne ujema z njeno vrsto',
@@ -2873,6 +2896,7 @@ Prosimo, poskusite znova.',
'import-error-interwiki' => 'Strani »$1« nismo uvozili, ker je njeno ime rezervirano za zunanje povezovanje (interwiki).',
'import-error-special' => 'Strani »$1« nismo uvozili, ker spada k posebnemu imenskemu prostoru, ki ne dovoljuje strani.',
'import-error-invalid' => 'Strani »$1« nismo uvozili, ker njeno ime ni veljavno.',
+'import-error-unserialize' => 'Redakcije $2 strani »$1« ni bilo mogoÄe deserializirati. Redakcija bi naj uporabljala model vsebine $3, serializiran kot $4.',
'import-options-wrong' => '{{PLURAL:$2|NapaÄna možnost|NapaÄni možnosti|NapaÄne možnosti}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Podana korenska stran ni veljaven naslov.',
'import-rootpage-nosubpage' => 'Imenski prostor »$1« korenske strani ne dovoli podstrani.',
@@ -2887,7 +2911,6 @@ Prosimo, poskusite znova.',
# JavaScriptTest
'javascripttest' => 'Preizkušanje JavaScripta',
-'javascripttest-disabled' => 'Funkcija na tem wikiju ni omogoÄena.',
'javascripttest-title' => 'Poganjanje $1 preizkusov',
'javascripttest-pagetext-noframework' => 'Stran je rezervirana za poganjanje preizkusov JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Neznano ogrodje za preizkušanje »$1«.',
@@ -3001,11 +3024,13 @@ OmogoÄa vnos pojasnila v povzetku urejanja.',
'pageinfo-default-sort' => 'Privzeti kljuÄ za razvrÅ¡Äanje',
'pageinfo-length' => 'Dolžina strani (v bajtih)',
'pageinfo-article-id' => 'ID strani',
+'pageinfo-language' => 'Jezik vsebine strani',
'pageinfo-robot-policy' => 'Status iskalnega pogona',
'pageinfo-robot-index' => 'Na voljo za indeksiranje',
'pageinfo-robot-noindex' => 'Ni na voljo za indeksiranje',
'pageinfo-views' => 'Å tevilo ogledov',
'pageinfo-watchers' => 'Å tevilo spremljevalcev strani',
+'pageinfo-few-watchers' => 'Manj kot $1 {{PLURAL:$1|spremljevalec|spremljevalca|spremljevalci|spremljevalcev}}',
'pageinfo-redirects-name' => 'Preusmeritve na stran',
'pageinfo-subpages-name' => 'Podstrani strani',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|preusmeritev|preusmeritvi|preusmeritve|preusmeritev}}; $3 {{PLURAL:$3|nepreusmeritev|nepreusmeritvi|nepreusmeritve|nepreusmeritev}})',
@@ -3020,6 +3045,19 @@ OmogoÄa vnos pojasnila v povzetku urejanja.',
'pageinfo-magic-words' => '{{PLURAL:$1|ÄŒarobna beseda|ÄŒarobni besedi|ÄŒarobne besede}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Skrita kategorija|Skriti kategoriji|Skrite kategorije}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|VkljuÄena predloga|VkljuÄeni predlogi|VkljuÄene predloge}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Stran, vkljuÄena|Strani, vkljuÄeni|Strani, vkljuÄene}} na ($1)',
+'pageinfo-toolboxlink' => 'Podatki o strani',
+'pageinfo-redirectsto' => 'Preusmerja na',
+'pageinfo-redirectsto-info' => 'informacije',
+'pageinfo-contentpage' => 'Å teje kot stran s vsebino',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading' => 'ZaÅ¡Äite se dedujejo od tukaj',
+'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-protect-cascading-from' => 'ZaÅ¡Äite se dedujejo od',
+'pageinfo-category-info' => 'Informacije o kategoriji',
+'pageinfo-category-pages' => 'Å tevilo strani',
+'pageinfo-category-subcats' => 'Å tevilo podkategorij',
+'pageinfo-category-files' => 'Å tevilo datotek',
# Patrolling
'markaspatrolleddiff' => 'OznaÄite kot nadzorovano',
@@ -3031,6 +3069,8 @@ OmogoÄa vnos pojasnila v povzetku urejanja.',
'markedaspatrollederror' => 'Ni mogoÄe oznaÄiti kot pregledano',
'markedaspatrollederrortext' => 'DoloÄite redakcijo, ki jo želite oznaÄiti kot pregledano.',
'markedaspatrollederror-noautopatrol' => 'Svojih urejanj vam ni dovoljeno oznaÄiti kot nadzorovanih.',
+'markedaspatrollednotify' => 'Ta sprememba $1 je bila oznaÄena kot nadzorovana.',
+'markedaspatrollederrornotify' => 'OznaÄevanje kot nadzorovano ni uspelo.',
# Patrol log
'patrol-log-page' => 'Dnevnik patrulje',
@@ -3065,6 +3105,7 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
'file-nohires' => 'ViÅ¡ja loÄljivost slike ni na voljo.',
'svg-long-desc' => 'datoteka SVG, v izvirniku $1 × $2 slikovnih toÄk, velikost datoteke: $3',
'svg-long-desc-animated' => 'animirana datoteka SVG, v izvirniku $1 × $2 slikovnih toÄk, velikost datoteke: $3',
+'svg-long-error' => 'Neveljavna datoteka SVG: $1',
'show-big-image' => 'Slika v viÅ¡ji loÄljivosti',
'show-big-image-preview' => 'Velikost predogleda: $1.',
'show-big-image-other' => '{{PLURAL:$2|Druga resolucija|Drugi resoluciji|Druge resolucije}}: $1.',
@@ -3099,7 +3140,10 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
'minutes' => '$1 {{PLURAL:$1|minuta|minuti|minute|minut}}',
'hours' => '$1 {{PLURAL:$1|ura|uri|ure|ur}}',
'days' => '$1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
+'months' => '$1 {{PLURAL:$1|mesec|meseca|mesece|mesecev}}',
+'years' => '$1 {{PLURAL:$1|leto|leti|leta|let}}',
'ago' => 'pred $1',
+'just-now' => 'pravkar',
# Bad image list
'bad_image_list' => 'Oblika je naslednja:
@@ -3600,6 +3644,7 @@ Potrditvena koda poteÄe $4.',
# Scary transclusion
'scarytranscludedisabled' => '[PrevkljuÄevanje med wikiji je onemogoÄeno]',
'scarytranscludefailed' => '[Pridobivanje predloge za $1 ni uspelo]',
+'scarytranscludefailed-httpstatus' => '[Pridobivanje predloge za $1 ni uspelo: HTTP $2]',
'scarytranscludetoolong' => '[Spletni naslov je predolg]',
# Delete conflict
@@ -3715,6 +3760,7 @@ Uporabite lahko tudi [[Special:EditWatchlist|standardni urejevalnik]].',
'version-license' => 'Licenca',
'version-poweredby-credits' => "Ta wiki poganja '''[//www.mediawiki.org/ MediaWiki]''', vse pravice pridržave © 2001-$1 $2.",
'version-poweredby-others' => 'drugi',
+'version-credits-summary' => 'Radi bi priznali prispevek naslednjih oseb k [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki je prosto programje; lahko ga razÅ¡irjate in / ali spreminjate pod pogoji GNU General Public License, kot ga je objavila Free Software Foundation; bodisi License razliÄice 2 ali (po vaÅ¡i izbiri) katere koli poznejÅ¡e razliÄice.
MediaWiki je razÅ¡irjan v upanju, da bo uporaben, vendar BREZ KAKRÅ NEGA KOLI ZAGOTOVILA; tudi brez posrednega jamstva PRODAJNE VREDNOSTI ali PRIMERNOSTI ZA DOLOÄŒEN NAMEN. Oglejte si GNU General Public License za veÄ podrobnosti.
@@ -3834,17 +3880,17 @@ Ta stran se sooÄa s tehniÄnimi težavami.',
'sqlite-no-fts' => '$1 brez podpore iskanju polnih besedil',
# New logging system
-'logentry-delete-delete' => '$1 je izbrisal(-a) stran $3',
-'logentry-delete-restore' => '$1 je obnovil(-a) stran $3',
-'logentry-delete-event' => '$1 je spremenil(-a) vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
-'logentry-delete-revision' => '$1 je spremenil(-a) vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
-'logentry-delete-event-legacy' => '$1 je spremenil(-a) vidljivost dnevniških dogodkov na $3',
-'logentry-delete-revision-legacy' => '$1 je spremenil(-a) vidljivost redakcij na strani $3',
-'logentry-suppress-delete' => '$1 je zatrl(-a) stran $3',
-'logentry-suppress-event' => '$1 je skrivaj spremenil(-a) vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
-'logentry-suppress-revision' => '$1 je skrivaj spremenil(-a) vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
-'logentry-suppress-event-legacy' => '$1 je skrivaj spremenil(-a) vidljivost dnevniških dogodkov na $3',
-'logentry-suppress-revision-legacy' => '$1 je skrivaj spremenil(-a) vidljivost redakcij na strani $3',
+'logentry-delete-delete' => '$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} stran $3',
+'logentry-delete-restore' => '$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3',
+'logentry-delete-event' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
+'logentry-delete-revision' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
+'logentry-delete-event-legacy' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost dnevniških dogodkov na $3',
+'logentry-delete-revision-legacy' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost redakcij na strani $3',
+'logentry-suppress-delete' => '$1 je {{GENDER:$2|zatrl|zatrla|zatrl(-a)}} stran $3',
+'logentry-suppress-event' => '$1 je skrivaj {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
+'logentry-suppress-revision' => '$1 je skrivaj {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
+'logentry-suppress-event-legacy' => '$1 je skrivaj {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost dnevniških dogodkov na $3',
+'logentry-suppress-revision-legacy' => '$1 je skrivaj {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost redakcij na strani $3',
'revdelete-content-hid' => 'vsebina je skrita',
'revdelete-summary-hid' => 'povzetek urejanja je skrit',
'revdelete-uname-hid' => 'uporabniško ime je skrito',
@@ -3853,17 +3899,21 @@ Ta stran se sooÄa s tehniÄnimi težavami.',
'revdelete-uname-unhid' => 'uporabniško ime je ponovno prikazano',
'revdelete-restricted' => 'uveljavljene omejitve administratorjev',
'revdelete-unrestricted' => 'odstranjene omejitve administratorjev',
-'logentry-move-move' => '$1 je premaknil(-a) stran $3 na $4',
-'logentry-move-move-noredirect' => '$1 je premaknil(-a) stran $3 na $4 brez preusmeritve',
-'logentry-move-move_redir' => '$1 je premaknil(-a) stran $3 na $4 prek preusmeritve',
-'logentry-move-move_redir-noredirect' => '$1 je premaknil(-a) stran $3 na $4 prek preusmeritve in brez preusmeritve',
-'logentry-patrol-patrol' => '$1 je oznaÄil(-a) redakcijo $4 strani $3 kot nadzorovano',
-'logentry-patrol-patrol-auto' => '$1 je samodejno oznaÄil(-a) redakcijo $4 strani $3 kot nadzorovano',
-'logentry-newusers-newusers' => '$1 je ustvaril(-a) uporabniÅ¡ki raÄun',
-'logentry-newusers-create' => '$1 je ustvaril(-a) uporabniÅ¡ki raÄun',
-'logentry-newusers-create2' => '$1 je ustvaril(-a) uporabniÅ¡ki raÄun $3',
-'logentry-newusers-autocreate' => 'RaÄun $1 je bil samodejno ustvarjen',
-'newuserlog-byemail' => 'geslo je bilo poslano po e-pošti',
+'logentry-move-move' => '$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4',
+'logentry-move-move-noredirect' => '$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4 brez preusmeritve',
+'logentry-move-move_redir' => '$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4 prek preusmeritve',
+'logentry-move-move_redir-noredirect' => '$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4 prek preusmeritve in brez preusmeritve',
+'logentry-patrol-patrol' => '$1 je {{GENDER:$2|oznaÄil|oznaÄila|oznaÄil(-a)}} redakcijo $4 strani $3 kot nadzorovano',
+'logentry-patrol-patrol-auto' => '$1 je samodejno {{GENDER:$2|oznaÄil|oznaÄila|oznaÄil(-a)}} redakcijo $4 strani $3 kot nadzorovano',
+'logentry-newusers-newusers' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniÅ¡ki raÄun',
+'logentry-newusers-create' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniÅ¡ki raÄun',
+'logentry-newusers-create2' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniÅ¡ki raÄun $3',
+'logentry-newusers-byemail' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniÅ¡ki raÄun $3; geslo je bilo poslano po e-poÅ¡ti',
+'logentry-newusers-autocreate' => 'RaÄun $1 je bil samodejno {{GENDER:$2|ustvarjen}}',
+'logentry-rights-rights' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} Älanstvo skupine $3 z $4 na $5',
+'logentry-rights-rights-legacy' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} Älanstvo skupine $3',
+'logentry-rights-autopromote' => '$1 je {{GENDER:$2|bil samodejno povišan|bila samodejno povišana|bil(-a) samodejno povišan(-a)}} z $4 na $5',
+'rightsnone' => '(nobeno)',
# Feedback
'feedback-bugornote' => 'ÄŒe ste pripravljeni podrobno opisati tehniÄno težavo, vložite [$1 poroÄilo o hroÅ¡Äu].
@@ -3917,6 +3967,7 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
'api-error-ok-but-empty' => 'Notranja napaka: strežnik se ne odziva.',
'api-error-overwrite' => 'Prepisovanje obstojeÄe datoteke ni dovoljeno.',
'api-error-stashfailed' => 'Notranja napaka: strežnik ni uspel shraniti zaÄasne datoteke.',
+'api-error-publishfailed' => 'Notranja napaka: strežnik ni uspel objaviti zaÄasne datoteke.',
'api-error-timeout' => 'Strežnik se ni odzval v priÄakovanem Äasu.',
'api-error-unclassified' => 'Prišlo je do neznane napake',
'api-error-unknown-code' => 'Neznana napaka: »$1«',
@@ -3937,4 +3988,7 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
'duration-centuries' => '$1 {{PLURAL:$1|stoletje|stoletji|stoletja|stoletij}}',
'duration-millennia' => '$1 {{PLURAL:$1|tisoÄletje|tisoÄletji|tisoÄletja|tisoÄletij}}',
+# Image rotation
+'rotate-comment' => 'Slika zavrti s $1 {{PLURAL:$1| degree|degrees}} v smeri urinega kazalca',
+
);
diff --git a/languages/messages/MessagesSli.php b/languages/messages/MessagesSli.php
index 4c2465e4..fbcf6632 100644
--- a/languages/messages/MessagesSli.php
+++ b/languages/messages/MessagesSli.php
@@ -160,7 +160,6 @@ $messages = array(
'qbfind' => 'Fenda',
'qbedit' => 'Ändern',
'qbpageoptions' => 'Seytaoptiona',
-'qbpageinfo' => 'Seytadata',
'qbmyoptions' => 'Menne Seyta',
'qbspecialpages' => 'Spezialseyta',
'faq' => 'FAQ',
@@ -363,12 +362,8 @@ De Sperre wurde durch [[User:$1|$1]] miet der Begrindung ''„$2“'' eigerichte
# Login and logout pages
'logouttext' => "'''Du best nun obgemeldet.'''
-Du koast {{SITENAME}} jitz anonym wetter nutzen, oder diech erneut under damm selba oder a'm andern Nutzernoama [[Special:UserLogin|oamelda]].
+Du koast {{SITENAME}} jitz anonym wetter nutzen, oder diech erneut under damm selba oder a'm andern Nutzernoama <span class='plainlinks'>[$1 oamelda]</span>.
Beachte, doas einige Seyta noo oazeiga kinna, doas du oagemeldet best, sulange du ne denn Browsercache gelaart host.",
-'welcomecreation' => '== Willkumma, $1! ==
-
-Dei Benutzerkonto wurde eigerichtet.
-Vergiss nä, denne [[Special:Preferences|{{SITENAME}}-Eistellunga]] oazupoassa.',
'yourname' => 'Benutzernoame:',
'yourpassword' => 'Passwort:',
'yourpasswordagain' => 'Passwort wiederhola:',
@@ -602,7 +597,6 @@ Grund fier de Sperre: $1",
'template-protected' => '(schreibgeschietzt)',
'template-semiprotected' => '(schreibgeschietzt fier unoagemeldete und neue Nutzer)',
'hiddencategories' => 'Diese Seite ies Mitglied vun {{PLURAL:$1|1 versteckter Kategorie|$1 versteckta Kategoria}}:',
-'nocreatetitle' => 'De Erstellung neuer Seyta ies eengeschränkt.',
'nocreatetext' => 'Uff {{SITENAME}} wurde doas Erstalla neuer Seyta eengeschränkt. Du koast bestiehende Seyten ändern oder diech [[Special:UserLogin|oamelda]].',
'nocreate-loggedin' => 'Du host kenne Berechtigung, neue Seyta zu erstalla.',
'permissionserrorstext' => 'Du best ne berechtigt, de Aksjonn auszufiehra. {{PLURAL:$1|Grund|Grinde}}:',
@@ -962,9 +956,12 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
'right-siteadmin' => 'Datenbank sperra und entsperra',
'right-sendemail' => 'E-Mails oa andere Nutzer senda',
+# Special:Log/newusers
+'newuserlogpage' => 'Neuoameldungs-Logbuch',
+'newuserlogpagetext' => 'Dies ies a Logbuch fier neu erstellte Nutzerkonten.',
+
# User rights log
'rightslogtext' => 'Dies ies doas Logbuch dar Änderunga dar Nutzerrechte.',
-'rightslogentry' => 'änderte de Nutzerrechte fier „$1“ vu „$2“ uff „$3“',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'de Seite zu lasa',
@@ -1365,10 +1362,6 @@ Siehe au de Liste der [[Special:WantedCategories|gewinschta Kategorien]].',
# Special:ActiveUsers
'activeusers-noresult' => 'Kenne Benutzer gefunda.',
-# Special:Log/newusers
-'newuserlogpage' => 'Neuoameldungs-Logbuch',
-'newuserlogpagetext' => 'Dies ies a Logbuch fier neu erstellte Nutzerkonten.',
-
# Special:ListGroupRights
'listgrouprights' => 'Nutzergruppen-Rechte',
'listgrouprights-summary' => 'Dies ies anne Liste dar ei diesem Wiki definierten Nutzergruppen und dar damit verbundenen Rechte.
@@ -1439,9 +1432,6 @@ Wenn du de Seite wieder vu denner Beobachtungsliste entferna mechtest, klicke uf
'enotif_mailer' => '{{SITENAME}}-E-Mail-Benoachrichtigungsdienst',
'enotif_reset' => 'Olle Seyta ols besucht markiern',
-'enotif_newpagetext' => 'Doas ies anne neue Seite.',
-'created' => 'erzeugt',
-'enotif_subject' => '[{{SITENAME}}] De Seite "$PAGETITLE" wurde vu $PAGEEDITOR $CHANGEDORCREATED',
'enotif_lastvisited' => "Olle Änderunga uff a'n Blick: $1",
'enotif_lastdiff' => 'Siehe $1 noach dieser Änderung.',
'enotif_anon_editor' => 'Anonymer Nutzer $1',
@@ -1467,6 +1457,7 @@ Is waan sulange kenne wettera Benachrichtigungs-E-Mails gesendet, bis du de Seit
Im de Einstellunga denner Beobachtungsliste oazupoaßa, besuche: {{canonicalurl:{{#special:EditWatchlist}}}}
Rickmeldungen und wettere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'erzeugt',
# Delete
'deletepage' => 'Seite läscha',
@@ -2371,6 +2362,5 @@ De Eengabe muuß ohne dann Zusatz „{{ns:file}}:“ erfolga.',
# New logging system
'revdelete-restricted' => 'Einschränkungen gelten au fier Administratorn',
'revdelete-unrestricted' => 'Einschränkungen fier Administratorn uffgehobn',
-'newuserlog-byemail' => 'doas Passwurt wourde per E-Mail versandt',
);
diff --git a/languages/messages/MessagesSma.php b/languages/messages/MessagesSma.php
index 022e6bdb..32474003 100644
--- a/languages/messages/MessagesSma.php
+++ b/languages/messages/MessagesSma.php
@@ -558,7 +558,6 @@ Dov dorje värrhtoedimmie gååvnese bielieh, jallh [[Special:UserLogin|logge sÃ
'watching' => 'Sïektjeminie...',
'unwatching' => 'Ov-sïektjedh...',
-'enotif_newpagetext' => 'Dïhte lea orre bielie.',
'enotif_impersonal_salutation' => '{{SITENAME}} nuhtjien',
'created' => 'skaepede',
diff --git a/languages/messages/MessagesSn.php b/languages/messages/MessagesSn.php
index db4716bb..ad74a735 100644
--- a/languages/messages/MessagesSn.php
+++ b/languages/messages/MessagesSn.php
@@ -88,9 +88,6 @@ $messages = array(
'viewsource' => 'Wona mabviro',
# Login and logout pages
-'welcomecreation' => '== Tigashire, $1! ==
-Akaunzi yako yagadzirwa.
-Usakanganwe kuchinga [[Special:Preferences|mapreferences ako {{SITENAME}}]].',
'yourname' => 'Zita:',
'yourpassword' => 'Password:',
'yourpasswordagain' => 'Nyorazve password:',
diff --git a/languages/messages/MessagesSo.php b/languages/messages/MessagesSo.php
index dfe12582..2118322d 100644
--- a/languages/messages/MessagesSo.php
+++ b/languages/messages/MessagesSo.php
@@ -156,7 +156,6 @@ $messages = array(
'qbbrowse' => 'Ka soo raadi',
'qbedit' => 'Wax ka bedel',
'qbpageoptions' => 'Boggaan',
-'qbpageinfo' => 'isku xiran',
'qbmyoptions' => 'Boggageyga',
'qbspecialpages' => 'Bogaga qaaska ah',
'faq' => 'SIL',
@@ -179,6 +178,7 @@ $messages = array(
'namespaces' => 'Xarun magaceedyada',
'variants' => 'Isbedelada',
+'navigation-heading' => 'Liiska laga galo',
'errorpagetitle' => 'Qalad',
'returnto' => 'Ku noqo $1.',
'tagline' => 'Ka {{SITENAME}}',
@@ -384,10 +384,8 @@ Sababta neh waxaa waaye "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Hada waad ka baxday.'''
-Waad sii isticmaali kartaa {{SITENAME}} adoona lagu aqoon, ama [[Special:UserLogin|gudaha gal]] adiga oo isticmaalaya magacaagii hore ama mid ka duwan. OGEYSIIS waxaa lagayabaa bogyaasha qaarkood in ay yiraahdaan wali gudaha ayaad ku jirtaa, ilaa inta aad ka nadiifineesid browsahaaga Internetka.",
-'welcomecreation' => "== Soo dhawoow, $1! ==
-Akoon kaada waa la sameeyay.
-Ha' hilmaamin in aad wax ka bedesho [[Special:Preferences|{{SITENAME}} dooqyadaada]].",
+Waad sii isticmaali kartaa {{SITENAME}} adoona lagu aqoon, ama <span class='plainlinks'>[$1 gudaha gal]</span> adiga oo isticmaalaya magacaagii hore ama mid ka duwan. OGEYSIIS waxaa lagayabaa bogyaasha qaarkood in ay yiraahdaan wali gudaha ayaad ku jirtaa, ilaa inta aad ka nadiifineesid browsahaaga Internetka.",
+'welcomeuser' => 'Soo dhowoow, $1',
'yourname' => 'Magaca gudagalka:',
'yourpassword' => 'Eraysir:',
'yourpasswordagain' => 'Markale qor ereysirka:',
@@ -859,8 +857,8 @@ E-mailkaada mala sheegaayo markii ee dadka kale kula soo xiriirayaan.',
'right-browsearchive' => 'Raadi maqaalada la tirtiray',
'right-undelete' => 'Ha tirtirin bog',
-# User rights log
-'rightsnone' => '(waxna)',
+# Special:Log/newusers
+'newuserlogpage' => 'Gudagalaha Isticmaale sameeyay',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'akhri boggaan',
@@ -1067,9 +1065,6 @@ Tafaasiishiisa waxee ku qorantahay [$2 bogga tafaasiisha faylka] oo ka arki kart
'listusers-noresult' => 'Lama helin isticmaale.',
'listusers-blocked' => '(waa la mamnuucay)',
-# Special:Log/newusers
-'newuserlogpage' => 'Gudagalaha Isticmaale sameeyay',
-
# Special:ListGroupRights
'listgrouprights-members' => '(Inta ka mid ah liiskooda)',
@@ -1117,9 +1112,41 @@ Hadii aad rabootid in aad boggan ka saartid wardiyeynta, dhagsii \"Ha' wardiyeyn
# Displayed when you click the "watch" button and it is in the process of watching
'watching' => 'Daawasho...',
+'enotif_subject_created' => '{{SITENAME}} Bogga $1 Qof ayaa sameeyey {{gender:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}} Bogga $1 Waxaa {{GENDER:$2|Bedel}} ku sameeyey qof $2',
+'enotif_body_intro_created' => 'Bogga {{SITENAME}} ga $1 waxaa la sameeyey $PAGEEDITDATE qof {{gender:$2|$2}}, eeg $3 sida laga dhigay hadda.',
+'enotif_body_intro_restored' => 'Booga {{SITENAME}} $1 waa labadelay {{GENDER:$2|dib u habayn}} waqtigaan $PAGEEDITDATE waxaana badalay $2, eeg $3 sida hadda laga dhigay.',
+'enotif_body_intro_changed' => 'Bogga {{SITENAME}} ga $1 waxaa la badelay $PAGEEDITDATE qof {{gender:$2|$2}}, eeg $3 sida laga dhigay hadda.',
'enotif_lastvisited' => 'Eeg $1 Dhamaan isbedeleda ilaa goortii kuugu dambaysay.',
'enotif_lastdiff' => 'Eeg $1 si aad u aragto bedelkaan.',
'enotif_anon_editor' => 'Aan la qoon $1',
+'enotif_body' => 'Mudane $WATCHINGUSERNAME,
+
+$PAGEINTRO $NEWPAGE
+
+Qaybta wax laga bedelay: $PAGESUMMARY $PAGEMINOREDIT
+
+La xariirka Tifaftiraha:
+mail: $PAGEEDITOR_EMAIL
+wiki: $PAGEEDITOR_WIKI
+
+Lama soo diri doono ogeysiin dambe hadii isbedel kale lagu sii sameeyo ilaa aad ka soo booqato bogga.
+Waxaad awoodaa inaad ka saarto liiska waardiyeha bogga.
+
+ Nidaamka war gelinta {{SITENAME}} ee E-mailka
+
+--
+si aad ubedesho fariinta e-mail dooqyadiisa, Booqo
+{{canonicalurl:{{#special:Preferences}}}}
+
+Si aad ubedesho liiskaada waardiyaha, Booqo
+{{canonicalurl:{{#special:EditWatchlist}}}}
+
+si aad utirtirto liiskaada waardiyaha ee gaarka ah, Booqo
+$UNWATCHURL
+
+Faalada iyo helista caawinaad dheeraad ah:
+{{canonicalurl:{{MediaWiki:Helppage}}}}',
# Delete
'confirm' => 'Xaqiiji',
@@ -1350,6 +1377,7 @@ Waxaa fiiri kartaa cadaadkiisa',
# Info page
'pageinfo-title' => 'Macluumaad ku saabsan "$1"',
+'pageinfo-toolboxlink' => 'Macluumad ku saabsan',
# Browsing diffs
'previousdiff' => '↠bedelkii ka duqsanaa',
@@ -1453,6 +1481,9 @@ waxaad awoodaa [[Special:EditWatchlist/raw|Liiska wax ka bedel]].',
'htmlform-reset' => 'Ka noqo wax bedelka',
'htmlform-selectorother-other' => 'kuwa kale',
+# New logging system
+'rightsnone' => '(waxna)',
+
# Feedback
'feedback-message' => 'Fariinta:',
diff --git a/languages/messages/MessagesSq.php b/languages/messages/MessagesSq.php
index 89fafd31..72e3acb1 100644
--- a/languages/messages/MessagesSq.php
+++ b/languages/messages/MessagesSq.php
@@ -360,7 +360,6 @@ $messages = array(
'qbbrowse' => 'Shfletoni',
'qbedit' => 'Redaktoni',
'qbpageoptions' => 'Kjo faqe',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => 'Faqet e mia',
'qbspecialpages' => 'Faqet speciale',
'faq' => 'Pyetje që bëhen shpesh',
@@ -383,6 +382,7 @@ $messages = array(
'namespaces' => 'Hapsirat e emrit',
'variants' => 'Variante',
+'navigation-heading' => 'Menuja e navigimit',
'errorpagetitle' => 'Gabim',
'returnto' => 'Kthehuni tek $1',
'tagline' => 'Nga {{SITENAME}}',
@@ -625,11 +625,11 @@ Administratori i cili e mbylli atë e dha këtë shpjegim: "$3".',
# Login and logout pages
'logouttext' => "'''Ju keni dalë jashtë.'''
- Ju mund të vazhdoni të përdorni {{SITENAME}} në mënyrë anonime, ose mund të [[Special:UserLogin|identifikoheni përsëri]] si përdoruesi i mëparshëm ose si një përdorues tjetër.
+ Ju mund të vazhdoni të përdorni {{SITENAME}} në mënyrë anonime, ose mund të <span class='plainlinks'>[$1 identifikoheni përsëri]</span> si përdoruesi i mëparshëm ose si një përdorues tjetër.
Kini parasysh që disa faqe mund të shfaqen sikur të ishit i identifikuar derisa të fshini ''cache''-in e shfletuesit tuaj.",
-'welcomecreation' => '== Mirësevini, $1! ==
- Llogaria juaj është krijuar.
- Mos harroni të ndryshoni [[Special:Preferences|{{SITENAME}} preferencat]] tuaja.',
+'welcomeuser' => 'Mirë se vini, $1!',
+'welcomecreation-msg' => 'Llogaria juaj u krijua.
+Mos harroni të ndryshoni [[Special:Preferences|{{SITENAME}} preferencat]] tuaja.',
'yourname' => 'Fusni nofkën tuaj',
'yourpassword' => 'Fusni fjalëkalimin tuaj',
'yourpasswordagain' => 'Fusni fjalëkalimin përsëri',
@@ -960,7 +960,6 @@ Regjistri më i vonshëm i hyrjeve është poshtë për referncë:",
'template-semiprotected' => '(gjysëm-mbrojtur)',
'hiddencategories' => 'Kjo faqe është nën {{PLURAL:$1|një kategori të fshehur|$1 kategori të fshehura}}:',
'edittools' => '<!-- Teksti këtu do të tregohet poshtë kutive të redaktimit dhe ngarkimit të skedave. -->',
-'nocreatetitle' => 'Krijimi i faqeve të reja është i kufizuar.',
'nocreatetext' => 'Mundësia për të krijuar faqe të reja është kufizuar. Duhet të [[Special:UserLogin|hyni ose të hapni një llogari]] për të krijuar faqe të reja, ose mund të ktheheni mbrapsh dhe të redaktoni një faqe ekzistuese.',
'nocreate-loggedin' => 'Nuk ju lejohet të krijoni faqe të reja.',
'sectioneditnotsupported-title' => 'Redaktimi i pjesës nuk është i mbështetur',
@@ -984,6 +983,9 @@ Duket se është grisur.',
Ajo tanimë ekziston.',
'defaultmessagetext' => 'Teksti i porosisë së parazgjedhur',
+# Content models
+'content-model-text' => 'tekst i thejshtë',
+
# Parser/template warnings
'expensive-parserfunction-warning' => 'Kujdes: Kjo faqe ka shumë kërkesa që kërkojnë analizë gramatikore të kushtueshme për sistemin.
@@ -1485,12 +1487,13 @@ Kjo informatë është publike.',
'right-sendemail' => 'Dërgo e-mail tek përdoruesit e tjerë',
'right-passwordreset' => 'Shiko e-mail-et e rivendosjes së fjalëkalimit',
+# Special:Log/newusers
+'newuserlogpage' => 'Regjistri i llogarive',
+'newuserlogpagetext' => 'Ky është një regjistër i llogarive të fundit që janë hapur',
+
# User rights log
'rightslog' => 'Regjistri i privilegjeve të përdoruesit',
'rightslogtext' => 'Ky është një regjistër për ndryshimet e privilegjeve të përdoruesit.',
-'rightslogentry' => 'u ndryshua anëtarësimi i grupit për $1 nga $2 tek $3',
-'rightslogentry-autopromote' => 'automatikisht u rrit në datyrë nga $2 në $3',
-'rightsnone' => '(asgjë)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lexo këtë faqe',
@@ -2117,10 +2120,6 @@ Protokolle të mbështetura: <code>$1<code> (mos shtoni ndonjërin nga këta në
'activeusers-hidesysops' => 'Fshih administratorët',
'activeusers-noresult' => 'Asnjë përdorues nuk u gjet.',
-# Special:Log/newusers
-'newuserlogpage' => 'Regjistri i llogarive',
-'newuserlogpagetext' => 'Ky është një regjistër i llogarive të fundit që janë hapur',
-
# Special:ListGroupRights
'listgrouprights' => 'Grupime përdoruesish me privilegje',
'listgrouprights-summary' => 'Më poshtë jepet grupimi i përdoruesve sipas privilegjeve që ju janë dhënë në këtë wiki. Më shumë informacion rreth privilegjeve në veçanti mund të gjendet [[{{MediaWiki:Listgrouprights-helppage}}|këtu]].',
@@ -2213,11 +2212,7 @@ Në qoftë se dëshironi të hiqni një faqe nga lista mbikqyrëse më vonë, sh
'enotif_mailer' => 'Postieri Njoftues i {{SITENAME}}',
'enotif_reset' => 'Shëno të gjitha faqet e vizituara',
-'enotif_newpagetext' => 'Kjo është një faqe e re.',
'enotif_impersonal_salutation' => 'Përdorues i {{SITENAME}}',
-'changed' => 'ndryshuar',
-'created' => 'u krijua',
-'enotif_subject' => '{{SITENAME}} faqja $PAGETITLE u $CHANGEDORCREATED prej $PAGEEDITOR',
'enotif_lastvisited' => 'Shikoni $1 për të gjitha ndryshimet që prej vizitës tuaj të fundit.',
'enotif_lastdiff' => 'Shikoni $1 për ndryshime.',
'enotif_anon_editor' => 'përdorues anonim $1',
@@ -2273,6 +2268,8 @@ $UNWATCHURL
Për të na dhënë përshtypjet tuaja ose për ndihmë të mëtejshme:
{{canonicalurl:{{MediaWiki:Helpage}}}}',
+'created' => 'u krijua',
+'changed' => 'ndryshuar',
# Delete
'deletepage' => 'Grise faqen',
@@ -2453,7 +2450,7 @@ $1',
'blanknamespace' => '(Artikujt)',
# Contributions
-'contributions' => 'Kontributet',
+'contributions' => 'Kontributet e {{GENDER:$1|përdoruesit|përdorueses}}',
'contributions-title' => 'Kontributet e përdoruesit për $1',
'mycontris' => 'Kontributet',
'contribsub2' => 'Për $1 ($2)',
@@ -2848,7 +2845,6 @@ Ju lutemi provoni përsëri.',
# JavaScriptTest
'javascripttest' => 'Duke testuar JavaScript',
-'javascripttest-disabled' => 'Ky funksion nuk është mundësuar në këtë wiki.',
'javascripttest-title' => 'Duke kryer testet $1',
'javascripttest-pagetext-noframework' => 'Kjo faqe është rezervuar për kryerjen e testimeve JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Kornizë pune e panjohur testuese "$1".',
@@ -3780,7 +3776,7 @@ Kjo faqe është duke përjetuar vështirësi teknike.',
'logentry-newusers-create' => '$1 krijoi një llogari',
'logentry-newusers-create2' => '$1 krijoi një llogari $3',
'logentry-newusers-autocreate' => 'Llogaria $1 u krijua automatikisht',
-'newuserlog-byemail' => 'fjalëkalimi u dërgua në postën elektronike',
+'rightsnone' => '(asgjë)',
# Feedback
'feedback-bugornote' => 'Nëse jeni gati për të përshkruar një problem teknik me detaje ju lutemi [$1 raportoni një problem].
diff --git a/languages/messages/MessagesSr_ec.php b/languages/messages/MessagesSr_ec.php
index e4a31580..fab63bc9 100644
--- a/languages/messages/MessagesSr_ec.php
+++ b/languages/messages/MessagesSr_ec.php
@@ -141,7 +141,6 @@ $specialPageAliases = array(
'Protectedtitles' => array( 'Заштићени_наÑлови' ),
'Randompage' => array( 'СлучајнаСтрана', 'ÐаÑумична_Ñтраница' ),
'Recentchanges' => array( 'СкорашњеИзмене', 'Скорашње_измене' ),
- 'RevisionMove' => array( 'ПремеÑти_измену' ),
'Search' => array( 'Претражи' ),
'Shortpages' => array( 'КраткиЧланци' ),
'Specialpages' => array( 'СпецијалнеСтране', 'ПоÑебне_Ñтранице' ),
@@ -252,7 +251,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__ФОРСИРÐÐИСÐДРЖÐЈ__', '__ФОРСИРÐÐИ_СÐДРЖÐЈ__', '__ПРИМОРÐÐИСÐДРЖÐЈ__', '__ПРИМОРÐÐИ_СÐДРЖÐЈ__', '__FORCETOC__' ),
'toc' => array( '0', '__СÐДРЖÐЈ__', '__TOC__' ),
'noeditsection' => array( '0', '__БЕЗИЗМЕÐÐ__', '__БЕЗ_ИЗМЕÐÐ__', '__БЕЗИЗМЈЕÐÐ__', '__БЕЗ_ИЗМЈЕÐÐ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__БЕЗЗÐГЛÐВЉÐ__', '__БЕЗ_ЗÐГЛÐВЉÐ__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'ТРЕÐУТÐИМЕСЕЦ', 'ТРЕÐУТÐИ_МЕСЕЦ', 'ТЕКУЋИМЕСЕЦ', 'ТЕКУЋИ_МЕСЕЦ', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'ТРЕÐУТÐИМЕСЕЦ1', 'ТРЕÐУТÐИ_МЕСЕЦ1', 'ТЕКУЋИМЕСЕЦ1', 'ТЕКУЋИ_МЕСЕЦ1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'ТРЕÐУТÐИМЕСЕЦИМЕ', 'ИМЕТЕКУЋЕГМЕСЕЦÐ', 'ИМЕ_ТЕКУЋЕГ_МЕСЕЦÐ', 'CURRENTMONTHNAME' ),
@@ -541,7 +539,6 @@ $messages = array(
'qbbrowse' => 'Потражи',
'qbedit' => 'Уреди',
'qbpageoptions' => 'ПоÑтавке Ñтранице',
-'qbpageinfo' => 'Садржај Ñтранице',
'qbmyoptions' => 'Моје Ñтранице',
'qbspecialpages' => 'ПоÑебне Ñтранице',
'faq' => 'ÐПП',
@@ -564,6 +561,7 @@ $messages = array(
'namespaces' => 'ИменÑки проÑтори',
'variants' => 'Варијанте',
+'navigation-heading' => 'Ðавигациони мени',
'errorpagetitle' => 'Грешка',
'returnto' => 'Ðазад на $1.',
'tagline' => 'Извор: {{SITENAME}}',
@@ -813,12 +811,11 @@ $2',
# Login and logout pages
'logouttext' => "'''Одјављени Ñте.'''
-Можете да наÑтавите Ñ ÐºÐ¾Ñ€Ð¸ÑˆÑ›ÐµÑšÐµÐ¼ овог викија као гоÑÑ‚, или Ñе [[Special:UserLogin|поново пријавите]] као други кориÑник.
+Можете да наÑтавите Ñ ÐºÐ¾Ñ€Ð¸ÑˆÑ›ÐµÑšÐµÐ¼ овог викија као гоÑÑ‚, или Ñе <span class='plainlinks'>[$1 поново пријавите]</span> као други кориÑник.
Имајте на уму да неке Ñтранице могу наÑтавити да Ñе приказују као да Ñте још пријављени, Ñве док не очиÑтите привремену меморију Ñвог прегледача.",
-'welcomecreation' => '== Добро дошли, $1! ==
-
-Ваш налог је отворен.
-Ðе заборавите да прилагодите Ñвоја [[Special:Preferences|подешавања]].',
+'welcomeuser' => 'Добро дошли, $1!',
+'welcomecreation-msg' => 'Ваш налог је отворен.
+Ðе заборавите да промените Ñвоја [[Special:Preferences|подешавања]].',
'yourname' => 'КориÑничко име:',
'yourpassword' => 'Лозинка:',
'yourpasswordagain' => 'Потврда лозинке:',
@@ -977,6 +974,7 @@ $2
'changeemail-oldemail' => 'Тренутна е-адреÑа:',
'changeemail-newemail' => 'Ðова е-адреÑа:',
'changeemail-none' => '(ништа)',
+'changeemail-password' => 'Ваша лозинка:',
'changeemail-submit' => 'Промени',
'changeemail-cancel' => 'Откажи',
@@ -1165,7 +1163,6 @@ $2
'hiddencategories' => 'Ова Ñтраница је члан {{PLURAL:$1|једне Ñкривене категорије|$1 Ñкривене категорије|$1 Ñкривених категорија}}:',
'edittools' => '<!-- Овај текÑÑ‚ ће бити приказан иÑпод обраÑца за уређивање и отпремање. -->',
'edittools-upload' => '-',
-'nocreatetitle' => 'Прављење Ñтранице је ограничено',
'nocreatetext' => 'Ðа овом викију је ограничено прављење нових Ñтраница.
Можете Ñе вратити и уредити поÑтојећу Ñтраницу, или Ñе [[Special:UserLogin|пријавите или отворите налог]].',
'nocreate-loggedin' => 'Ðемате дозволу да правите нове Ñтранице.',
@@ -1190,6 +1187,15 @@ $2
'edit-already-exists' => 'Ðе могу да направим Ñтраницу.
Изгледа да она већ поÑтоји.',
'defaultmessagetext' => 'Подразумевани текÑÑ‚ поруке',
+'content-failed-to-parse' => 'Ðе могу да рашчланим Ñадржај типа $2 за модел $1: $3',
+'invalid-content-data' => 'ÐеиÑправни подаци Ñадржаја',
+'content-not-allowed-here' => 'Садржај модела „$1“ није дозвољен на Ñтраници [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'викитекÑÑ‚',
+'content-model-text' => 'чиÑÑ‚ текÑÑ‚',
+'content-model-javascript' => 'јаваÑкрипт',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Упозорење:''' ова Ñтраница Ñадржи превише позива за рашчлањивање.
@@ -1715,12 +1721,13 @@ $1",
'right-sendemail' => 'Ñлање е-порука другим кориÑницима',
'right-passwordreset' => 'прегледање порука за обнављање лозинке',
+# Special:Log/newusers
+'newuserlogpage' => 'Дневник нових кориÑника',
+'newuserlogpagetext' => 'Ово је иÑторија нових кориÑника.',
+
# User rights log
'rightslog' => 'Дневник кориÑничких права',
'rightslogtext' => 'Ово је дневник измена кориÑничких права.',
-'rightslogentry' => '{{GENDER:|је променио|је променила|је променио}} права за члана $1 из $2 у $3',
-'rightslogentry-autopromote' => 'је унапређен из $2 у $3',
-'rightsnone' => '(ништа)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'читање ове Ñтранице',
@@ -1973,6 +1980,7 @@ $1',
'backend-fail-notsame' => 'Већ поÑтоји неиÑтоветна датотека – $1.',
'backend-fail-invalidpath' => '$1 није иÑправна путања за Ñкладиштење.',
'backend-fail-delete' => 'Ðе могу да обришем датотеку $1.',
+'backend-fail-describe' => 'Ðе могу да променим метаподатке за датотеку „$1“.',
'backend-fail-alreadyexists' => 'Датотека $1 већ поÑтоји.',
'backend-fail-store' => 'Ðе могу да ÑмеÑтим датотеку $1 у $2.',
'backend-fail-copy' => 'Ðе могу да умножим датотеку $1 у $2.',
@@ -2386,10 +2394,6 @@ $1',
'activeusers-hidesysops' => 'Сакриј админиÑтраторе',
'activeusers-noresult' => 'КориÑник није пронађен.',
-# Special:Log/newusers
-'newuserlogpage' => 'Дневник нових кориÑника',
-'newuserlogpagetext' => 'Ово је иÑторија нових кориÑника.',
-
# Special:ListGroupRights
'listgrouprights' => 'Права кориÑничких група',
'listgrouprights-summary' => 'Следи ÑпиÑак кориÑничких група на овом викију, заједно Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð¼Ð° приÑтупа.
@@ -2489,11 +2493,17 @@ $1',
'enotif_mailer' => '{{SITENAME}} е-обавештење',
'enotif_reset' => 'Означи Ñве Ñтранице као поÑећене',
-'enotif_newpagetext' => 'Ово је нова Ñтраница.',
'enotif_impersonal_salutation' => '{{SITENAME}} кориÑник',
-'changed' => 'измењена',
-'created' => 'направљена',
-'enotif_subject' => '{{SITENAME}} Ñтраница $PAGETITLE је $CHANGEDORCREATED од Ñтране $PAGEEDITOR',
+'enotif_subject_deleted' => 'Страницу $1 на {{SITENAME}} {{GENDER:$2|обриÑао је|обриÑала је|обриÑао је}} $2',
+'enotif_subject_created' => 'Страницу $1 на {{SITENAME}} {{GENDER:$2|направио је|направила је|направио је}} $2',
+'enotif_subject_moved' => 'Страницу $1 на {{SITENAME}} {{GENDER:$2|премеÑтио је|премеÑтила је|премеÑтио је}} $2',
+'enotif_subject_restored' => 'Страницу $1 на {{SITENAME}} {{GENDER:$2|вратио је|вратила је|вратио је}} $2',
+'enotif_subject_changed' => 'Страницу $1 на {{SITENAME}} {{GENDER:$2|променио је|променила је|променио је}} $2',
+'enotif_body_intro_deleted' => 'Страницу $1 на {{SITENAME}} {{GENDER:$2|обриÑао је|обриÑала је|обриÑао је}} $2 дана $PAGEEDITDATE. Погледајте $3.',
+'enotif_body_intro_created' => 'Страницу $1 на {{SITENAME}} {{GENDER:$2|направио је|направила је|направио је}} $2 дана $PAGEEDITDATE. Тренутна измена налази Ñе на $3.',
+'enotif_body_intro_moved' => 'Страницу $1 на {{SITENAME}} {{GENDER:$2|премеÑтио је|премеÑтила је|премеÑтио је}} $2 дана $PAGEEDITDATE. Тренутна измена налази Ñе на $3.',
+'enotif_body_intro_restored' => 'Страницу $1 на {{SITENAME}} {{GENDER:$2|вратио је|вратила је|вратио је}} $2 дана $PAGEEDITDATE. Тренутна измена налази Ñе на $3.',
+'enotif_body_intro_changed' => 'Страницу $1 на {{SITENAME}} {{GENDER:$2|променио је|променила је|променио је}} $2 дана $PAGEEDITDATE. Тренутна измена налази Ñе на $3.',
'enotif_lastvisited' => 'Погледајте $1 за Ñве измене од ваше поÑледње поÑете.',
'enotif_lastdiff' => 'Погледајте $1 да видите ову измену.',
'enotif_anon_editor' => 'анониман кориÑник $1',
@@ -2527,6 +2537,8 @@ $UNWATCHURL
Подршка и даља помоћ:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'направљена',
+'changed' => 'измењена',
# Delete
'deletepage' => 'Обриши Ñтраницу',
@@ -2683,7 +2695,8 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|Измена је враћена|$1 измене Ñу враћене|$1 измена је враћено}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека|датотеке|датотека}} је враћено',
'undeletedfiles' => '{{PLURAL:$1|Датотека је враћена|$1 датотеке Ñу враћене|$1 датотека је враћено}}',
-'cannotundelete' => 'ÐеуÑпешно враћање. Ðеко други је то урадио пре ваÑ.',
+'cannotundelete' => 'Враћање није уÑпело:
+$1',
'undeletedpage' => "'''Страница $1 је враћена'''
Погледајте [[Special:Log/delete|иÑторију бриÑања]] за запиÑе о Ñкорашњим бриÑањима и враћањима.",
@@ -2994,6 +3007,7 @@ $1',
'immobile-target-namespace-iw' => 'Међувики веза није иÑправно одредиште за премештање Ñтранице.',
'immobile-source-page' => 'Ова Ñтраница Ñе не може премеÑтити.',
'immobile-target-page' => 'Ðе могу да премеÑтим на жељени наÑлов.',
+'bad-target-model' => 'Жељено одредиште кориÑти другачији модел Ñадржаја. Ðе могу да претворим из $1 у $2.',
'imagenocrossnamespace' => 'Датотека Ñе не може премеÑтити у именÑки проÑтор који не припада датотекама.',
'nonfile-cannot-move-to-file' => 'Ðе-датотеке не можете премеÑтити у именÑки проÑтор за датотеке',
'imagetypemismatch' => 'ЕкÑтензија нове датотеке Ñе не поклапа Ñ ÑšÐµÐ½Ð¾Ð¼ врÑтом',
@@ -3124,7 +3138,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'ЈаваÑкрипт теÑÑ‚',
-'javascripttest-disabled' => 'Ова функција није омогућена на овом викију.',
'javascripttest-title' => 'Извршавање теÑтова за $1',
'javascripttest-pagetext-noframework' => 'Ова Ñтраница је резервиÑана за извршавање јаваÑкрипт теÑтова.',
'javascripttest-pagetext-unknownframework' => 'Ðепознати радни оквир „$1“.',
@@ -3273,6 +3286,7 @@ $1',
'pageinfo-default-sort' => 'Подразумевани кључ Ñортирања',
'pageinfo-length' => 'Дужина Ñтранице (у бајтовима)',
'pageinfo-article-id' => 'ИД Ñтранице',
+'pageinfo-language' => 'Језик Ñадржаја Ñтранице',
'pageinfo-robot-policy' => 'Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ€ÐµÑ‚Ñ€Ð°Ð¶Ð¸Ð²Ð°Ñ‡Ð°',
'pageinfo-robot-index' => 'Може да Ñе попише',
'pageinfo-robot-noindex' => 'Ðе може да Ñе попише',
@@ -3292,6 +3306,14 @@ $1',
'pageinfo-magic-words' => '{{PLURAL:$1|Магична реч|Магичне речи}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Сакривена категорија|Сакривене категорије}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Укључени шаблон|Укључени шаблони}} ($1)',
+'pageinfo-toolboxlink' => 'Подаци о Ñтраници',
+'pageinfo-redirectsto' => 'ПреуÑмерава на',
+'pageinfo-redirectsto-info' => 'подаци',
+'pageinfo-contentpage' => 'Рачуна Ñе као Ñтраница Ñа Ñадржајем',
+'pageinfo-contentpage-yes' => 'Да',
+'pageinfo-protect-cascading' => 'ПреноÑива заштита Ñтраница важи одавде',
+'pageinfo-protect-cascading-yes' => 'Да',
+'pageinfo-protect-cascading-from' => 'Странице Ñа преноÑивом заштитом од',
# Skin names
'skinname-standard' => 'КлаÑично',
@@ -3314,6 +3336,8 @@ $1',
'markedaspatrollederror' => 'Ðе могу да означим као патролирано',
'markedaspatrollederrortext' => 'Морате изабрати измену да биÑте је означили као прегледану.',
'markedaspatrollederror-noautopatrol' => 'Ðе можете да означите Ñвоје измене као патролиране.',
+'markedaspatrollednotify' => 'Ова измена на Ñтраници „$1“ је означена као прегледана.',
+'markedaspatrollederrornotify' => 'Ðије уÑпешно означавање ове Ñтранице као прегледаном.',
# Patrol log
'patrol-log-page' => 'Дневник патролирања',
@@ -3971,6 +3995,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[Међувики укључивање шаблона је онемогућено]',
'scarytranscludefailed' => '[Добављање шаблона за $1 није уÑпело]',
+'scarytranscludefailed-httpstatus' => '[Ðе могу да преузмем шаблон $1: HTTP $2]',
'scarytranscludetoolong' => '[URL адреÑа је предугачка]',
# Delete conflict
@@ -4162,6 +4187,7 @@ $5
'version-license' => 'Лиценца',
'version-poweredby-credits' => "Овај вики покреће '''[//www.mediawiki.org/ Медијавики]''', ауторÑка права © 2001-$1 $2.",
'version-poweredby-others' => 'оÑтали',
+'version-credits-summary' => 'Желели биÑмо да захвалимо Ñледећим људима на њиховом доприноÑу [[Special:Version|Медијавикији]].',
'version-license-info' => 'Медијавики је Ñлободан Ñофтвер; можете га раÑподељивати и мењати под уÑловима ГÐУ-ове опште јавне лиценце (ОЈЛ) коју је објавила Задужбина за Ñлободан Ñофтвер, било да је у питању друго или новије издање лиценце.
Медијавики Ñе нуди у нади да ће бити од кориÑти, али БЕЗ ИКÐКВЕ ГÐРÐÐЦИЈЕ; чак и без подразумеване гаранције о ПРОДÐЈÐОЈ ВРЕДÐОСТИ или ПОГОДÐОСТИ ЗРОДРЕЂЕÐЕ ÐÐМЕÐЕ. Погледајте ГÐУ-ову општу јавну лиценцу за више информација.
@@ -4305,7 +4331,10 @@ $5
'logentry-newusers-create' => '$1 {{GENDER:|је отворио|је отворила|је отворио}} кориÑнички налог',
'logentry-newusers-create2' => '$1 {{GENDER:|је отворио|је отворила|је отворио}} кориÑнички налог $3',
'logentry-newusers-autocreate' => 'Ðалог $1 је ÑамоÑтално отворен',
-'newuserlog-byemail' => 'лозинка је поÑлата е-поштом',
+'logentry-rights-rights' => '$1 {{GENDER:$1|је променио|је променила|је променио}} чланÑтво групе за $3 из $4 у $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|је променио|је променила|је променио}} чланÑтво групе за $3',
+'logentry-rights-autopromote' => '$1 је аутоматÑки {{GENDER:$1|унапређен|унапређена|унапређен}} из $4 у $5',
+'rightsnone' => '(ништа)',
# Feedback
'feedback-bugornote' => 'Ðко Ñте Ñпремни да детаљно опишете технички проблем, онда [$1 пријавите грешку].
diff --git a/languages/messages/MessagesSr_el.php b/languages/messages/MessagesSr_el.php
index f13e78ff..c6c556e9 100644
--- a/languages/messages/MessagesSr_el.php
+++ b/languages/messages/MessagesSr_el.php
@@ -164,7 +164,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__FORSIRANISADRŽAJ__', '__FORSIRANI_SADRŽAJ__', '__PRIMORANISADRŽAJ__', '__PRIMORANI_SADRŽAJ__', '__FORCETOC__' ),
'toc' => array( '0', '__SADRŽAJ__', '__TOC__' ),
'noeditsection' => array( '0', '__BEZIZMENA__', '__BEZ_IZMENA__', '__BEZIZMJENA__', '__BEZ_IZMJENA__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__BEZZAGLAVLJA__', '__BEZ_ZAGLAVLJA__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'TRENUTNIMESEC', 'TRENUTNI_MESEC', 'TEKUĆIMESEC', 'TEKUĆI_MESEC', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'TRENUTNIMESEC1', 'TRENUTNI_MESEC1', 'TEKUĆIMESEC1', 'TEKUĆI_MESEC1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'TRENUTNIMESECIME', 'IMETEKUĆEGMESECA', 'IME_TEKUĆEG_MESECA', 'CURRENTMONTHNAME' ),
@@ -450,7 +449,6 @@ $messages = array(
'qbbrowse' => 'Potraži',
'qbedit' => 'Uredi',
'qbpageoptions' => 'Postavke stranice',
-'qbpageinfo' => 'Sadržaj stranice',
'qbmyoptions' => 'Moje stranice',
'qbspecialpages' => 'Posebne stranice',
'faq' => 'NPP',
@@ -722,12 +720,8 @@ Administrator koji ju je zakljuÄao ponudio je sledeće objaÅ¡njenje: „$3“.'
# Login and logout pages
'logouttext' => "'''Odjavljeni ste.'''
-Možete da nastavite s korišćenjem ovog vikija kao gost, ili se [[Special:UserLogin|ponovo prijavite]] kao drugi korisnik.
+Možete da nastavite s korišćenjem ovog vikija kao gost, ili se <span class='plainlinks'>[$1 ponovo prijavite]</span> kao drugi korisnik.
Imajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste joÅ¡ prijavljeni, sve dok ne oÄistite privremenu memoriju svog pregledaÄa.",
-'welcomecreation' => '== Dobro došli, $1! ==
-
-Vaš nalog je otvoren.
-Ne zaboravite da prilagodite svoja [[Special:Preferences|podešavanja]].',
'yourname' => 'KorisniÄko ime:',
'yourpassword' => 'Lozinka:',
'yourpasswordagain' => 'Potvrda lozinke:',
@@ -1074,7 +1068,6 @@ Poslednji zapis u dnevniku je prikazan ispod:",
'hiddencategories' => 'Ova stranica je Älan {{PLURAL:$1|jedne skrivene kategorije|$1 skrivene kategorije|$1 skrivenih kategorija}}:',
'edittools' => '<!-- Ovaj tekst će biti prikazan ispod obrasca za uređivanje i otpremanje. -->',
'edittools-upload' => '-',
-'nocreatetitle' => 'Pravljenje stranice je ograniÄeno',
'nocreatetext' => 'Na ovom vikiju je ograniÄeno pravljenje novih stranica.
Možete se vratiti i urediti postojeću stranicu, ili se [[Special:UserLogin|prijavite ili otvorite nalog]].',
'nocreate-loggedin' => 'Nemate dozvolu da pravite nove stranice.',
@@ -1099,6 +1092,15 @@ Izgleda da je obrisana.',
'edit-already-exists' => 'Ne mogu da napravim stranicu.
Izgleda da ona već postoji.',
'defaultmessagetext' => 'Podrazumevani tekst poruke',
+'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]]',
+
+# Content models
+'content-model-wikitext' => 'vikitekst',
+'content-model-text' => 'Äist tekst',
+'content-model-javascript' => 'javaskript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Upozorenje:''' ova stranica sadrži previÅ¡e poziva za raÅ¡Älanjivanje.
@@ -1624,12 +1626,13 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
'right-sendemail' => 'slanje e-poruka drugim korisnicima',
'right-passwordreset' => 'pregledanje poruka za obnavljanje lozinke',
+# Special:Log/newusers
+'newuserlogpage' => 'Dnevnik novih korisnika',
+'newuserlogpagetext' => 'Ovo je istorija novih korisnika.',
+
# User rights log
'rightslog' => 'Dnevnik korisniÄkih prava',
'rightslogtext' => 'Ovo je dnevnik izmena korisniÄkih prava.',
-'rightslogentry' => '{{GENDER:|je promenio|je promenila|je promenio}} prava za Älana $1 iz $2 u $3',
-'rightslogentry-autopromote' => 'je unapređen iz $2 u $3',
-'rightsnone' => '(ništa)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'Äitanje ove stranice',
@@ -2295,10 +2298,6 @@ Podržani protokoli: <code>$1</code> (zadaje http:// ako ne navedete protokol).'
'activeusers-hidesysops' => 'Sakrij administratore',
'activeusers-noresult' => 'Korisnik nije pronađen.',
-# Special:Log/newusers
-'newuserlogpage' => 'Dnevnik novih korisnika',
-'newuserlogpagetext' => 'Ovo je istorija novih korisnika.',
-
# Special:ListGroupRights
'listgrouprights' => 'Prava korisniÄkih grupa',
'listgrouprights-summary' => 'Sledi spisak korisniÄkih grupa na ovom vikiju, zajedno s pravima pristupa.
@@ -2398,11 +2397,7 @@ Ukoliko budete želeli da uklonite stranicu sa spiska nadgledanja, kliknite opet
'enotif_mailer' => '{{SITENAME}} e-obaveštenje',
'enotif_reset' => 'OznaÄi sve stranice kao posećene',
-'enotif_newpagetext' => 'Ovo je nova stranica.',
'enotif_impersonal_salutation' => '{{SITENAME}} korisnik',
-'changed' => 'izmenjena',
-'created' => 'napravljena',
-'enotif_subject' => '{{SITENAME}} stranica $PAGETITLE je $CHANGEDORCREATED od strane $PAGEEDITOR',
'enotif_lastvisited' => 'Pogledajte $1 za sve izmene od vaše poslednje posete.',
'enotif_lastdiff' => 'Pogledajte $1 da vidite ovu izmenu.',
'enotif_anon_editor' => 'anoniman korisnik $1',
@@ -2436,6 +2431,8 @@ $UNWATCHURL
Podrška i dalja pomoć:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'napravljena',
+'changed' => 'izmenjena',
# Delete
'deletepage' => 'Obriši stranicu',
@@ -2592,7 +2589,8 @@ Možda ste uneli pogrešnu vezu, ili je izmena vraćena ili uklonjena iz arhive.
'undeletedrevisions' => '{{PLURAL:$1|Izmena je vraćena|$1 izmene su vraćene|$1 izmena je vraćeno}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|izmena|izmene|izmena}} i $2 {{PLURAL:$2|datoteka|datoteke|datoteka}} je vraćeno',
'undeletedfiles' => '{{PLURAL:$1|Datoteka je vraćena|$1 datoteke su vraćene|$1 datoteka je vraćeno}}',
-'cannotundelete' => 'Neuspešno vraćanje. Neko drugi je to uradio pre vas.',
+'cannotundelete' => 'Vraćanje nije uspelo:
+$1',
'undeletedpage' => "'''Stranica $1 je vraćena'''
Pogledajte [[Special:Log/delete|istoriju brisanja]] za zapise o skorašnjim brisanjima i vraćanjima.",
@@ -2903,6 +2901,7 @@ ne mogu da premestim stranicu preko same sebe.',
'immobile-target-namespace-iw' => 'Međuviki veza nije ispravno odredište za premeštanje stranice.',
'immobile-source-page' => 'Ova stranica se ne može premestiti.',
'immobile-target-page' => 'Ne mogu da premestim na željeni naslov.',
+'bad-target-model' => 'Željeno odrediÅ¡te koristi drugaÄiji model sadržaja. Ne mogu da pretvorim iz $1 u $2.',
'imagenocrossnamespace' => 'Datoteka se ne može premestiti u imenski prostor koji ne pripada datotekama.',
'nonfile-cannot-move-to-file' => 'Ne-datoteke ne možete premestiti u imenski prostor za datoteke',
'imagetypemismatch' => 'Ekstenzija nove datoteke se ne poklapa s njenom vrstom',
@@ -3033,7 +3032,6 @@ Pokušajte ponovo.',
# JavaScriptTest
'javascripttest' => 'Javaskript test',
-'javascripttest-disabled' => 'Ova funkcija nije omogućena na ovom vikiju.',
'javascripttest-title' => 'Izvršavanje testova za $1',
'javascripttest-pagetext-noframework' => 'Ova stranica je rezervisana za izvršavanje javaskript testova.',
'javascripttest-pagetext-unknownframework' => 'Nepoznati radni okvir „$1“.',
@@ -3182,6 +3180,7 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
'pageinfo-default-sort' => 'Podrazumevani kljuÄ sortiranja',
'pageinfo-length' => 'Dužina stranice (u bajtovima)',
'pageinfo-article-id' => 'ID stranice',
+'pageinfo-language' => 'Jezik sadržaja stranice',
'pageinfo-robot-policy' => 'Status pretraživaÄa',
'pageinfo-robot-index' => 'Može da se popiše',
'pageinfo-robot-noindex' => 'Ne može da se popiše',
@@ -3201,6 +3200,14 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
'pageinfo-magic-words' => '{{PLURAL:$1|MagiÄna reÄ|MagiÄne reÄi}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|UkljuÄeni Å¡ablon|UkljuÄeni Å¡abloni}} ($1)',
+'pageinfo-toolboxlink' => 'Podaci o stranici',
+'pageinfo-redirectsto' => 'Preusmerava na',
+'pageinfo-redirectsto-info' => 'podaci',
+'pageinfo-contentpage' => 'RaÄuna se kao stranica sa sadržajem',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading' => 'Prenosiva zaštita stranica važi odavde',
+'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-protect-cascading-from' => 'Stranice sa prenosivom zaštitom od',
# Skin names
'skinname-standard' => 'KlasiÄno',
@@ -3223,6 +3230,8 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
'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.',
# Patrol log
'patrol-log-page' => 'Dnevnik patroliranja',
@@ -3880,6 +3889,7 @@ Ovaj potvrdni kod istiÄe $6 u $7.',
# Scary transclusion
'scarytranscludedisabled' => '[MeÄ‘uviki ukljuÄivanje Å¡ablona je onemogućeno]',
'scarytranscludefailed' => '[Dobavljanje Å¡ablona za $1 nije uspelo]',
+'scarytranscludefailed-httpstatus' => '[Ne mogu da preuzmem Å¡ablon $1: HTTP $2]',
'scarytranscludetoolong' => '[URL adresa je predugaÄka]',
# Delete conflict
@@ -4071,6 +4081,7 @@ Možete da [[Special:EditWatchlist|koristite i obiÄan ureÄ‘ivaÄ]].',
'version-license' => 'Licenca',
'version-poweredby-credits' => "Ovaj viki pokreće '''[//www.mediawiki.org/ Medijaviki]''', autorska prava © 2001-$1 $2.",
'version-poweredby-others' => 'ostali',
+'version-credits-summary' => 'Želeli bismo da zahvalimo sledećim ljudima na njihovom doprinosu [[Special:Version|Medijavikiji]].',
'version-license-info' => 'Medijaviki je slobodan softver; možete ga raspodeljivati i menjati pod uslovima GNU-ove opšte javne licence (OJL) koju je objavila Zadužbina za slobodan softver, bilo da je u pitanju drugo ili novije izdanje licence.
Medijaviki se nudi u nadi da će biti od koristi, ali BEZ IKAKVE GARANCIJE; Äak i bez podrazumevane garancije o PRODAJNOJ VREDNOSTI ili POGODNOSTI ZA ODREÄENE NAMENE. Pogledajte GNU-ovu opÅ¡tu javnu licencu za viÅ¡e informacija.
@@ -4214,7 +4225,10 @@ Slike su prikazane u punoj veliÄini, a druge vrste datoteka se pokreću pomoću
'logentry-newusers-create' => '$1 {{GENDER:|je otvorio|je otvorila|je otvorio}} korisniÄki nalog',
'logentry-newusers-create2' => '$1 {{GENDER:|je otvorio|je otvorila|je otvorio}} korisniÄki nalog $3',
'logentry-newusers-autocreate' => 'Nalog $1 je samostalno otvoren',
-'newuserlog-byemail' => 'lozinka je poslata e-poštom',
+'logentry-rights-rights' => '$1 {{GENDER:$1|je promenio|je promenila|je promenio}} Älanstvo grupe za $3 iz $4 u $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|je promenio|je promenila|je promenio}} Älanstvo grupe za $3',
+'logentry-rights-autopromote' => '$1 je automatski {{GENDER:$1|unapređen|unapređena|unapređen}} iz $4 u $5',
+'rightsnone' => '(ništa)',
# Feedback
'feedback-bugornote' => 'Ako ste spremni da detaljno opiÅ¡ete tehniÄki problem, onda [$1 prijavite greÅ¡ku].
diff --git a/languages/messages/MessagesSrn.php b/languages/messages/MessagesSrn.php
index ac60bcea..ce0037dd 100644
--- a/languages/messages/MessagesSrn.php
+++ b/languages/messages/MessagesSrn.php
@@ -279,7 +279,6 @@ $messages = array(
'qbbrowse' => 'Browse',
'qbedit' => 'Kenki',
'qbpageoptions' => 'A papira disi',
-'qbpageinfo' => 'Abra a papira',
'qbmyoptions' => 'Mi papira',
'qbspecialpages' => 'Spesrutu papira',
'faq' => 'FAQ (Sani di ben aksi furu)',
@@ -443,9 +442,6 @@ Fu san ede: ''$2''.",
Yu kan tan kebroiki {{SITENAME}} sondro nen, noso yu kan psa kon baka leki a srefi noso wan tra kebroikiman.
Sabi taki a kan gersi leki yu psa kon ete, te leki yu leygi a cache fu yu browser.",
-'welcomecreation' => '== Welkom, $1! ==
-Yu account meki now.
-No fergiti fu kenki den seti fu yu gi {{SITENAME}}.',
'yourname' => 'Kebroikiman nen:',
'yourpassword' => 'Psa wortu:',
'yourpasswordagain' => 'Psa wortu ete wan leysi:',
@@ -731,7 +727,6 @@ A kan ben trowe efu dribi.
# User rights log
'rightslog' => 'Log buku fu kebroikiman leti',
-'rightsnone' => '(no)',
# Recent changes
'nchanges' => '$1 {{PLURAL:$1|kenki|kenki}}',
@@ -1241,4 +1236,7 @@ Trawan o kibri.
# Special:SpecialPages
'specialpages' => 'Spesrutu papira',
+# New logging system
+'rightsnone' => '(no)',
+
);
diff --git a/languages/messages/MessagesStq.php b/languages/messages/MessagesStq.php
index 47bcce88..6f58e152 100644
--- a/languages/messages/MessagesStq.php
+++ b/languages/messages/MessagesStq.php
@@ -189,7 +189,6 @@ $messages = array(
'qbbrowse' => 'Bleederje',
'qbedit' => 'Annerje',
'qbpageoptions' => 'Disse Siede',
-'qbpageinfo' => 'Siedendoatäie',
'qbmyoptions' => 'Mien Sieden',
'qbspecialpages' => 'Spezialsieden',
'faq' => 'Oafte stoalde Froagen',
@@ -443,12 +442,8 @@ Die Administrator, die dän Skrieuwtougriep speerde, roate foulgjenden Gruund an
# Login and logout pages
'logouttext' => "'''Du bäst nu oumälded.'''
-Du koast {{SITENAME}} nu anonym fääre benutsje, of die fonnäien unner dänsälge of n uur Benutsernoome wier [[Special:UserLogin|anmäldje]].
+Du koast {{SITENAME}} nu anonym fääre benutsje, of die fonnäien unner dänsälge of n uur Benutsernoome wier <span class='plainlinks'>[$1 anmäldje]</span>.
Beoachtje, dät eenige Sieden noch anwiese konnen, dät du oumälded bäst, soloange du nit din Browsercache loosmoaked hääst.",
-'welcomecreation' => '== Wäilkuumen, $1 ==
-
-Dien Benutserkonto wuude iengjucht.
-Ferjeet nit, dien [[Special:Preferences|{{SITENAME}}-Ienstaalengen]] antoupaasjen.',
'yourname' => 'Benutsernoome:',
'yourpassword' => 'Paaswoud:',
'yourpasswordagain' => 'Paaswoud wierhoalje:',
@@ -741,7 +736,6 @@ Gruund foar ju Speere: $1",
'template-semiprotected' => '(Siedenskuts foar nit anmäldede un näie Benutsere)',
'hiddencategories' => 'Disse Siede is Meeglid fon {{PLURAL:$1|1 ferstatte Kategorie|$1 ferstatte Kategorien}}:',
'edittools' => '<!-- Text hier stoant unner Beoarbaidengsfäildere un Hoochleedefäildere. -->',
-'nocreatetitle' => 'Dät Moakjen fon näie Sieden is begränsed',
'nocreatetext' => 'Ap {{SITENAME}} wuude dät Moakjen fon näie Sieden begränsed. Du koast al bestoundene Sieden beoarbaidje of die [[Special:UserLogin|anmäldje]].',
'nocreate-loggedin' => 'Du hääst neen Begjuchtigenge, näie Sieden antoulääsen.',
'sectioneditnotsupported-title' => 'Ju Beoarbaidenge fon Ousnitte wäd nit unnerstutsed',
@@ -1260,12 +1254,13 @@ Ju duur maximoal $1 {{PLURAL:$1|Teeken|Teekene}} loang weese.',
'right-sendemail' => 'E-Mails an uur Benutsere seende',
'right-passwordreset' => 'Paaswoud fon n Benutser touräächsätte ([[Special:PasswordReset|Spezioalsiede]])',
+# Special:Log/newusers
+'newuserlogpage' => 'Näianmäldengs-Logbouk',
+'newuserlogpagetext' => 'Dit is dät Logbouk fon näi anmäldede Benutsere.',
+
# User rights log
'rightslog' => 'Gjuchte-Logbouk',
'rightslogtext' => 'Dit is dät Logbouk fon do Annerengen fon do Benutsergjuchte.',
-'rightslogentry' => 'annerde ju Gruppentouheeregaid foar „$1“ fon „$2“ ap „$3“.',
-'rightslogentry-autopromote' => 'wuud automatisk fon „$2“ ätter „$3“ touoardend',
-'rightsnone' => '(-)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'disse Siede tou leesen',
@@ -1834,10 +1829,6 @@ Sjuch uk ju Lieste fon do [[Special:WantedCategories|wonskede Kategorien]].',
'activeusers-hidesysops' => 'Administratore fersteete',
'activeusers-noresult' => 'Neen Benutsere fuunen.',
-# Special:Log/newusers
-'newuserlogpage' => 'Näianmäldengs-Logbouk',
-'newuserlogpagetext' => 'Dit is dät Logbouk fon näi anmäldede Benutsere.',
-
# Special:ListGroupRights
'listgrouprights' => 'Benutsergruppen-Gjuchte',
'listgrouprights-summary' => 'Dit is ne Lieste fon do in dissen Wiki definierde Benutsergruppen un do deermäd ferbuundene Gjuchte.
@@ -1933,11 +1924,7 @@ Wan du die Artikkel wier fon ju Foulgelieste ou hoalje moatest, klik ap ju Siede
'enotif_mailer' => '{{SITENAME}} tält Beskeed uur Email',
'enotif_reset' => 'Markier aal besoachte Sieden',
-'enotif_newpagetext' => 'Dit is ne näie Siede.',
'enotif_impersonal_salutation' => '{{SITENAME}} Benutser',
-'changed' => 'annerd',
-'created' => 'näi anlaid',
-'enotif_subject' => '{{SITENAME}} Siede $PAGETITLE wuude $CHANGEDORCREATED fon $PAGEEDITOR',
'enotif_lastvisited' => 'Aal Annerengen ap aan Blik: $1',
'enotif_lastdiff' => '$1 wiest alle Annerengen mäd aan Glap.',
'enotif_anon_editor' => 'Anonyme Benutser $1',
@@ -1969,6 +1956,8 @@ Uum ju Siede fon dien Kontrollieste tou läskjen, besäik
$UNWATCHURL
Touräächmäldengen un wiedere Hälpe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'näi anlaid',
+'changed' => 'annerd',
# Delete
'deletepage' => 'Siede läskje',
@@ -3297,7 +3286,7 @@ Ne [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie fon ju ''GNU General Public License''
# New logging system
'revdelete-restricted' => 'Einskränkengen jäilde uk foar Administratore',
'revdelete-unrestricted' => 'Ienskränkengen foar Administratore wächhoald',
-'newuserlog-byemail' => 'dät Paaswoud wuud uur E-Mail fersoand',
+'rightsnone' => '(-)',
# Search suggestions
'searchsuggest-search' => 'Säik',
diff --git a/languages/messages/MessagesSu.php b/languages/messages/MessagesSu.php
index 523087e0..2c8b70ad 100644
--- a/languages/messages/MessagesSu.php
+++ b/languages/messages/MessagesSu.php
@@ -274,7 +274,6 @@ $messages = array(
'qbbrowse' => 'Sungsi',
'qbedit' => 'Édit',
'qbpageoptions' => 'Kaca ieu',
-'qbpageinfo' => 'Kontéks',
'qbmyoptions' => 'Kaca kuring',
'qbspecialpages' => 'Kaca husus',
'faq' => 'NLD',
@@ -518,11 +517,8 @@ Pikeun alihbasa, mangga sumping ka [//translatewiki.net/wiki/Main_Page?setlang=e
# Login and logout pages
'logouttext' => "'''Anjeun ayeuna geus kaluar log.'''
-Anjeun bisa tetep migunakeun {{SITENAME}} bari anonim, atawa bisa [[Special:UserLogin|asup log deui]] salaku pamaké nu sarua atawa nu séjén deui.
+Anjeun bisa tetep migunakeun {{SITENAME}} bari anonim, atawa bisa <span class='plainlinks'>[$1 asup log deui]</span> salaku pamaké nu sarua atawa nu séjén deui.
Mangkahadé, sababaraha kaca bakal tetep némbongkeun saolah-olah anjeun asup log kénéh nepi ka anjeun ngosongkeun ''cache'' panyungsi anjeun.",
-'welcomecreation' => '==Wilujeng sumping, $1!==
-Rekening anjeun geus dijieun.
-Tong hilap ngarobih [[Special:Preferences|{{SITENAME}} préferénsi]] anjeun.',
'yourname' => 'Sandiasma:',
'yourpassword' => 'Sandi anjeun',
'yourpasswordagain' => 'Ketik deui sandi anjeun',
@@ -825,7 +821,6 @@ kuncén nu ngonci pangkalan data mikeun kajelasan : $1",
'template-semiprotected' => '(semi-dikonci)',
'hiddencategories' => 'Ieu kaca kaasup {{PLURAL:$1|1 kategori nyumput|$1 kategori nyumput}}:',
'edittools' => '<!-- Téks di dieu bakal némbongan di handapeun formulir édit jeung muat.-->',
-'nocreatetitle' => 'Nyieun kaca kakara diwatesan',
'nocreatetext' => '{{SITENAME}} nutup kabisa nyieun kaca anyar.
Mangga édit artikel nu geus aya, atawa [[Special:UserLogin|asup log/daptar heula]].',
'nocreate-loggedin' => 'Anjeun teu diwenangkeun pikeun nyieun kaca anyar.',
@@ -1314,12 +1309,13 @@ Mun geus anggeus teu bisa dibolaykeun.',
'right-siteadmin' => 'Ngonci jeung muka konci databés',
'right-sendemail' => 'Kirim surélék ka pamaké séjén',
+# Special:Log/newusers
+'newuserlogpage' => 'Log akun anyar',
+'newuserlogpagetext' => 'Di handap ieu béréndélan log pamaké anyar.',
+
# User rights log
'rightslog' => 'Log hak pamaké',
'rightslogtext' => 'Ieu mangrupa log parobahan hak-hak pamaké.',
-'rightslogentry' => 'ngarobah kaanggotaan grup pikeun $1 tina $2 jadi $3',
-'rightslogentry-autopromote' => 'geus sacara otomatis dipromosikeun ti $2 ka $3',
-'rightsnone' => '(euweuh)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'maca ieu kaca',
@@ -1820,10 +1816,6 @@ Baca ogé [[Special:WantedCategories|kategori nu dipikabutuh]].',
'activeusers-hidesysops' => 'Sumputkeun kuncén',
'activeusers-noresult' => 'Teu kapendak.',
-# Special:Log/newusers
-'newuserlogpage' => 'Log akun anyar',
-'newuserlogpagetext' => 'Di handap ieu béréndélan log pamaké anyar.',
-
# Special:ListGroupRights
'listgrouprights' => 'Hak-hak grup pamaké',
'listgrouprights-summary' => 'Ieu mangrupa daptar jumplukan pamaké anu aya di wiki ieu, kalawan daptar hak aksés maranéhanana.
@@ -1907,11 +1899,7 @@ Jaga, parobahan na kaca ieu katut kaca obrolanana bakal dibéréndélkeun di din
'enotif_mailer' => 'Surat Émbaran {{SITENAME}}',
'enotif_reset' => 'Tandaan sadaya kaca nu geus dilongok',
-'enotif_newpagetext' => 'Kaca ieu anyar.',
'enotif_impersonal_salutation' => 'Pamaké {{SITENAME}}',
-'changed' => 'geus robah',
-'created' => 'geus dijieun',
-'enotif_subject' => 'Kaca $PAGETITLE {{SITENAME}} geus $CHANGEDORCREATED ku $PAGEEDITOR',
'enotif_lastvisited' => 'Tempo $1 pikeun sadaya parobahan ti saprak anjeun ninggalkeun ieu kaca.',
'enotif_lastdiff' => 'Buka $1 pikeun nempo ieu parobahan.',
'enotif_anon_editor' => 'pamaké anonim $1',
@@ -1936,6 +1924,8 @@ Pikeun ngarobah setélan dabtar awaseun anjeun, sindang ka {{SERVER}}{{localurl:
Asupan jeung bantuan salajengna:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'geus dijieun',
+'changed' => 'geus robah',
# Delete
'deletepage' => 'Hapus kaca',
@@ -3052,7 +3042,7 @@ Coba ku sawangan normal.',
# New logging system
'revdelete-restricted' => 'akses geus dibatesan ukur keur kuncén',
'revdelete-unrestricted' => 'Watesan akses kuncén dihapuskeun',
-'newuserlog-byemail' => 'Sandi geus dikirim maké surélék.',
+'rightsnone' => '(euweuh)',
# Feedback
'feedback-subject' => 'Ngeunaan:',
diff --git a/languages/messages/MessagesSv.php b/languages/messages/MessagesSv.php
index 5a95b961..e6ce2c85 100644
--- a/languages/messages/MessagesSv.php
+++ b/languages/messages/MessagesSv.php
@@ -42,6 +42,7 @@
* @author Rotsee
* @author S.Örvarr.S
* @author Sannab
+ * @author Sendelbach
* @author Sertion
* @author Skalman
* @author Stefan2
@@ -182,7 +183,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__ALLTIDINNEHÅLLSFÖRTECKNING__', '__FORCETOC__' ),
'toc' => array( '0', '__INNEHÅLLSFÖRTECKNING__', '__TOC__' ),
'noeditsection' => array( '0', '__INTEREDIGERASEKTION__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__INGENRUBRIK__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'NUVARANDEMÃ…NAD', 'NUMÃ…NAD', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'NUVARANDEMÃ…NAD1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'NUVARANDEMÃ…NADSNAMN', 'NUMÃ…NADSNAMN', 'CURRENTMONTHNAME' ),
@@ -455,6 +455,7 @@ $messages = array(
'newwindow' => '(öppnas i ett nytt fönster)',
'cancel' => 'Avbryt',
'moredotdotdot' => 'Mer...',
+'morenotlisted' => 'Mer som inte är listad...',
'mypage' => 'Min sida',
'mytalk' => 'Diskussion',
'anontalk' => 'Diskussionssida för denna IP-adress',
@@ -466,7 +467,6 @@ $messages = array(
'qbbrowse' => 'Bläddra igenom',
'qbedit' => 'Redigera',
'qbpageoptions' => 'Denna sida',
-'qbpageinfo' => 'Sidinformation',
'qbmyoptions' => 'Mina inställningar',
'qbspecialpages' => 'Specialsidor',
'faq' => 'FAQ',
@@ -489,6 +489,7 @@ $messages = array(
'namespaces' => 'Namnrymder',
'variants' => 'Varianter',
+'navigation-heading' => 'Navigeringsmeny',
'errorpagetitle' => 'Fel',
'returnto' => 'Tillbaka till $1.',
'tagline' => 'Från {{SITENAME}}',
@@ -728,10 +729,10 @@ Den administratören som låste den gav denna anledning: "\'\'$3\'\'".',
# Login and logout pages
'logouttext' => "'''Du är nu utloggad.'''
-Du kan fortsätta att använda {{SITENAME}} anonymt, eller så kan du [[Special:UserLogin|logga in igen]] som samma eller som en annan användare.
+Du kan fortsätta att använda {{SITENAME}} anonymt, eller så kan du <span class='plainlinks'>[$1 logga in igen]</span> som samma eller som en annan användare.
Observera att det, tills du tömmer din webbläsares cache, på vissa sidor kan se ut som att du fortfarande är inloggad.",
-'welcomecreation' => '== Välkommen, $1! ==
-Ditt konto har skapats.
+'welcomeuser' => 'Välkommen, $1!',
+'welcomecreation-msg' => 'Ditt konto har skapats.
Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].',
'yourname' => 'Användarnamn:',
'yourpassword' => 'Lösenord:',
@@ -755,7 +756,7 @@ Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].
'gotaccount' => "Har du redan ett användarkonto? '''$1'''.",
'gotaccountlink' => 'Logga in',
'userlogin-resetlink' => 'Har du glömt dina inloggningsuppgifter?',
-'createaccountmail' => 'med e-post',
+'createaccountmail' => 'Använd ett tillfällig slumpartat lösenord och skicka den till e-postadressen som anges nedan',
'createaccountreason' => 'Orsak:',
'badretype' => 'De lösenord du uppgett överensstämmer inte med varandra.',
'userexists' => 'Det valda användarnamnet används redan.
@@ -825,6 +826,7 @@ Vänta innan du försöker igen.',
# Email sending
'php-mail-error-unknown' => "Okänt fel i PHP's mail()-funktion",
'user-mail-no-addy' => 'Försökte skicka e-post utan en e-postadress',
+'user-mail-no-body' => 'Försökte skicka e-post med tomt eller orimligt kort innehåll.',
# Change password dialog
'resetpass' => 'Ändra lösenord',
@@ -872,7 +874,7 @@ Du bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna
Tillfälligt lösenord: $2',
'passwordreset-emailsent' => 'En lösenordsåterställning via e-post har skickats.',
'passwordreset-emailsent-capture' => 'En lösenordsåterställning via e-post har skickats, som visas nedan.',
-'passwordreset-emailerror-capture' => 'En påminnelse via e-post har skapats, som visas nedan, men det gick inte att skicka den till användaren: $1',
+'passwordreset-emailerror-capture' => 'En lösenordsåterställning via e-post har skapats, som visas nedan, men det gick inte att skicka den till användaren: $1',
# Special:ChangeEmail
'changeemail' => 'Ändra e-postadress',
@@ -882,6 +884,7 @@ Tillfälligt lösenord: $2',
'changeemail-oldemail' => 'Nuvarande e-postadress:',
'changeemail-newemail' => 'Ny e-postadress:',
'changeemail-none' => '(ingen)',
+'changeemail-password' => 'Ditt lösenord till {{SITENAME}}:',
'changeemail-submit' => 'Ändra e-post',
'changeemail-cancel' => 'Avbryt',
@@ -1062,7 +1065,6 @@ Den senaste loggposten tillhandahålls nedan som referens:",
'template-semiprotected' => '(delvis skyddad)',
'hiddencategories' => 'Denna sida är medlem i följande dolda {{PLURAL:$1|kategori|kategorier}}:',
'edittools' => '<!-- Denna text kommer att visas nedanför redigeringsrutor och uppladdningsformulär. -->',
-'nocreatetitle' => 'Skapande av sidor begränsat',
'nocreatetext' => '{{SITENAME}} har begränsat möjligheterna att skapa nya sidor.
Du kan redigera existerande sidor, eller [[Special:UserLogin|logga in eller skapa ett användarkonto]].',
'nocreate-loggedin' => 'Du har inte behörighet att skapa nya sidor.',
@@ -1087,6 +1089,15 @@ Det verkar som att den har raderats.',
'edit-already-exists' => 'Sidan kunde inte skapas.
Den finns redan.',
'defaultmessagetext' => 'Standardtext för meddelande',
+'content-failed-to-parse' => 'Det gick inte att parsa $2 innehåll för $1 modell: $3',
+'invalid-content-data' => 'Ogiltig innehållsdata',
+'content-not-allowed-here' => 'innehåll av "$1" är inte tillåtet på sidan [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'oformaterad text',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Varning: Denna sida innehåller för många anrop av resurskrävande parserfunktioner.
@@ -1454,9 +1465,9 @@ Detta kan inte återställas.',
'prefs-emailconfirm-label' => 'E-postbekräftelse:',
'prefs-textboxsize' => 'Storlek på redigeringsrutan',
'youremail' => 'E-post:',
-'username' => 'Användarnamn:',
-'uid' => 'Användar-ID:',
-'prefs-memberingroups' => 'Medlem av {{PLURAL:$1|gruppen|grupperna}}:',
+'username' => '{{GENDER:$1|Användarnamn}}:',
+'uid' => '{{GENDER:$1|Användar}}-ID:',
+'prefs-memberingroups' => '{{GENDER:$2|Medlem}} av {{PLURAL:$1|gruppen|grupperna}}:',
'prefs-registration' => 'Registreringstid:',
'yourrealname' => 'Riktigt namn:',
'yourlanguage' => 'Språk:',
@@ -1605,12 +1616,13 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
'right-sendemail' => 'Skicka e-post till andra användare',
'right-passwordreset' => 'Visa e-postmeddelanden med lösenordsåterställning',
+# Special:Log/newusers
+'newuserlogpage' => 'Logg över nya användare',
+'newuserlogpagetext' => 'Detta är en logg över skapade användarkonton.',
+
# User rights log
'rightslog' => 'Användarrättighetslogg',
'rightslogtext' => 'Detta är en logg över ändringar av användares rättigheter.',
-'rightslogentry' => 'ändrade grupptillhörighet för $1 från $2 till $3',
-'rightslogentry-autopromote' => 'befordrades automatiskt från $2 till $3',
-'rightsnone' => '(inga)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'läsa denna sida',
@@ -1851,6 +1863,7 @@ Om problemet kvarstår, kontakta en [[Special:ListUsers/sysop|administratör]].'
'backend-fail-notsame' => 'En icke-identisk fil redan finns på $1.',
'backend-fail-invalidpath' => '$1 är inte en giltig sökväg för att spara.',
'backend-fail-delete' => 'Kunde inte radera filen $1.',
+'backend-fail-describe' => 'Kunde inte att ändra metadata för filen "$1".',
'backend-fail-alreadyexists' => 'Filen $1 finns redan.',
'backend-fail-store' => 'Kunde inte spara filen $1 vid $2.',
'backend-fail-copy' => 'Det gick inte att kopiera filen $1 till $2.',
@@ -2085,6 +2098,12 @@ Innan mallarna raderas, kontrollera att det inte finns andra länkar till dem.',
De bör troligtvis ändras så att de länkar till en mer passande sida istället.<br />
En sida anses vara en förgreningssida om den inkluderar en mall som länkas till från [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Sidor med en sidegenskap',
+'pageswithprop-legend' => 'Sidor med en sidegenskap',
+'pageswithprop-text' => 'Denna sida listar sidor som använder en speciell sidegenskap.',
+'pageswithprop-prop' => 'Egenskapsnamn:',
+'pageswithprop-submit' => 'GÃ¥',
+
'doubleredirects' => 'Dubbla omdirigeringar',
'doubleredirectstext' => 'Det här är en lista över sidor som dirigerar om till andra omdirigeringssidor. Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt till målet för den andra omdirigeringen. Målet för den andra omdirigeringen är ofta den "riktiga" sidan, som den första omdirigeringen egentligen ska leda till.
<del>Stryk över</del> poster som har åtgärdats.',
@@ -2236,7 +2255,7 @@ Se även [[Special:WantedCategories|önskade kategorier]].',
'linksearch-ok' => 'Sök',
'linksearch-text' => 'Jokertecken (wildcards) som t.ex. "*.wikipedia.org" kan användas.
Det krävs åtminstone en toppdomän, t.ex. "*.org".<br />
-Protokoll som stöds: <code>$1</code> (sätts till http:// om inget protokoll anges).',
+{{PLURAL:$2|Protokollet|Protokollen}} som stöds: <code>$1</code> (sätts till http:// om inget protokoll anges).',
'linksearch-line' => '$1 länkas från $2',
'linksearch-error' => 'Jokertecken kan bara användas i början av domännamnet.',
@@ -2255,10 +2274,6 @@ Protokoll som stöds: <code>$1</code> (sätts till http:// om inget protokoll an
'activeusers-hidesysops' => 'Dölj administratörer',
'activeusers-noresult' => 'Inga användare funna.',
-# Special:Log/newusers
-'newuserlogpage' => 'Logg över nya användare',
-'newuserlogpagetext' => 'Detta är en logg över skapade användarkonton.',
-
# Special:ListGroupRights
'listgrouprights' => 'Behörigheter för användargrupper',
'listgrouprights-summary' => 'Följande lista visar vilka användargrupper som är definierade på den här wikin och vilka behörigheter grupperna har.
@@ -2353,19 +2368,23 @@ Framtida ändringar av den här sidan och dess diskussionssida kommer att listas
'enotif_mailer' => '{{SITENAME}}s system för att få meddelanden om förändringar per e-post',
'enotif_reset' => 'Markera alla sidor som besökta',
-'enotif_newpagetext' => 'Detta är en ny sida.',
'enotif_impersonal_salutation' => '{{SITENAME}}användare',
-'changed' => 'ändrad',
-'created' => 'skapad',
-'enotif_subject' => '{{SITENAME}}-sidan $PAGETITLE har blivit $CHANGEDORCREATED av $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}}sidan $1 har raderats av {{gender:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}}sidan $1 har skapats av {{gender:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}}sidan $1 har flyttats av {{gender:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}}sidan $1 har återställts av {{gender:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}}sidan $1 har ändrats {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Sidan $1 på {{SITENAME}} raderades den $PAGEEDITDATE av {{gender:$2|$2}}, se $3.',
+'enotif_body_intro_created' => '{{SITENAME}}sidan $1 skapades den $PAGEEDITDATE av {{gender:$2|$2}}, se $3 för den aktuella versionen.',
+'enotif_body_intro_moved' => '{{SITENAME}}sidan $1 flyttades den $PAGEEDITDATE av {{gender:$2|$2}}, se $3 för den aktuella versionen.',
+'enotif_body_intro_restored' => '{{SITENAME}}sidan $1 återställdes den $PAGEEDITDATE av {{gender:$2|$2}}, se $3 för den aktuella versionen.',
+'enotif_body_intro_changed' => '{{SITENAME}}sidan $1 ändrades den $PAGEEDITDATE av {{gender:$2|$2}}, se $3 för den aktuella versionen.',
'enotif_lastvisited' => 'På $1 återfinner du alla ändringar sedan ditt senaste besök.',
'enotif_lastdiff' => 'Se denna ändring på $1',
'enotif_anon_editor' => 'anonym användare $1',
-'enotif_body' => '$WATCHINGUSERNAME,
+'enotif_body' => 'Hej $WATCHINGUSERNAME,
-{{SITENAME}}-sidan $PAGETITLE har blivit $CHANGEDORCREATED $PAGEEDITDATE av $PAGEEDITOR; se $PAGETITLE_URL för den nuvarande versionen.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Angiven sammanfattning av redigeringen: $PAGESUMMARY $PAGEMINOREDIT
@@ -2376,7 +2395,7 @@ wiki: $PAGEEDITOR_WIKI
Såvida du inte besöker sidan, kommer du inte att få flera meddelanden om ändringar av sidan.
Du kan också ta bort flaggan för meddelanden om ändringar på alla sidor i din bevakningslista.
- Hälsningar från {{SITENAME}}s meddelandesystem
+Hälsningar från {{SITENAME}}s meddelandesystem
--
För att ändra inställningarna för dina uppdateringar via e-post, besök
@@ -2390,6 +2409,8 @@ $UNWATCHURL
Feedback och ytterligare hjälp:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'skapad',
+'changed' => 'ändrad',
# Delete
'deletepage' => 'Ta bort sida',
@@ -2456,6 +2477,8 @@ Se [[Special:ProtectedPages|listan över skyddade sidor]] för listan över akti
'prot_1movedto2' => 'flyttade [[$1]] till [[$2]]',
'protect-badnamespace-title' => 'Namnrymd som inte kan skrivskyddas',
'protect-badnamespace-text' => 'Sidor i den här namnrymden kan inte skrivskyddas.',
+'protect-norestrictiontypes-text' => 'Denna sida kan inte skyddas eftersom det inte finns några begränsningstyper tillgängliga.',
+'protect-norestrictiontypes-title' => 'Oskyddbar sida',
'protect-legend' => 'Bekräfta skrivskydd av sida',
'protectcomment' => 'Anledning:',
'protectexpiry' => 'Varaktighet:',
@@ -2538,7 +2561,8 @@ I sådana fall måste du se till att den senaste raderade versionen inte är ikr
'undeletedrevisions' => '{{PLURAL:$1|en version återställd|$1 versioner återställda}}',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|version|versioner}} och $2 {{PLURAL:$2|fil|filer}} återställda',
'undeletedfiles' => '{{PLURAL:$1|en fil återställd|$1 filer återställda}}',
-'cannotundelete' => 'Återställning misslyckades; kanske någon redan har återställt sidan.',
+'cannotundelete' => 'Återställning misslyckades:
+$1',
'undeletedpage' => "'''$1 har återställts'''
Se [[Special:Log/delete|raderingsloggen]] för en förteckning över de senaste raderingarna och återställningarna.",
@@ -2569,7 +2593,7 @@ $1',
'blanknamespace' => '(Huvudnamnrymden)',
# Contributions
-'contributions' => 'Användarbidrag',
+'contributions' => '{{GENDER:$1|Användarbidrag}}',
'contributions-title' => 'Bidrag av $1',
'mycontris' => 'Bidrag',
'contribsub2' => 'För $1 ($2)',
@@ -2840,6 +2864,7 @@ Den titel du vill flytta sidan till, "[[:$1]]", finns redan. Vill du radera den
'immobile-target-namespace-iw' => 'Interwikilänk är inte ett giltigt mål för sidflyttar.',
'immobile-source-page' => 'Denna sida är inte flyttbar.',
'immobile-target-page' => 'Kan inte flytta till det målnamnet.',
+'bad-target-model' => 'Den önskade destinationen använder en annan innehållsmodell. Kan inte konvertera från $1 till $2.',
'imagenocrossnamespace' => 'Kan inte flytta filer till andra namnrymder än filnamnrymden',
'nonfile-cannot-move-to-file' => 'Kan inte flytta icke-fil till filnamnrymden',
'imagetypemismatch' => 'Den nya filändelsen motsvarar inte filtypen',
@@ -2953,6 +2978,7 @@ Spara den på din dator och ladda upp den här.',
'import-error-interwiki' => 'Sidan "$1" är inte importerad eftersom dess namn är reserverat för externa länkar (interwiki).',
'import-error-special' => 'Sidan "$1" är inte importerad eftersom den tillhör en särskild namnrymd som inte tillåter sidor.',
'import-error-invalid' => 'Sidan "$1" är inte importerad eftersom dess namn är ogiltigt.',
+'import-error-unserialize' => 'Versionen $2 av sidan "$1" kunde inte avserialiseras. Versionen rapporterades för att använda innehållsmodellen $3, som serialiserades som $4.',
'import-options-wrong' => 'Fel {{PLURAL:$2|alternativ|alternativ}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Angiven grundsida är en ogiltig titel.',
'import-rootpage-nosubpage' => 'Namnrymden "$1" till grundsidan tillåter inte undersidor.',
@@ -2967,7 +2993,6 @@ Spara den på din dator och ladda upp den här.',
# JavaScriptTest
'javascripttest' => 'JavaScript-testning',
-'javascripttest-disabled' => 'Denna funktion har inte aktiverats på denna wiki.',
'javascripttest-title' => 'Kör $1 tester',
'javascripttest-pagetext-noframework' => 'Denna sida är reserverat för att köra JavaScript-tester.',
'javascripttest-pagetext-unknownframework' => 'Okänd testmiljö "$1".',
@@ -3118,11 +3143,13 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
'pageinfo-default-sort' => 'Standardsorteringsnyckel',
'pageinfo-length' => 'Sidlängd (i byte)',
'pageinfo-article-id' => 'Sid-ID',
+'pageinfo-language' => 'Språk för sidinnehåll',
'pageinfo-robot-policy' => 'Sökmotordirektiv',
'pageinfo-robot-index' => 'Indexerbar',
'pageinfo-robot-noindex' => 'Inte indexerbar',
'pageinfo-views' => 'Antal visningar',
'pageinfo-watchers' => 'Antal användare som bevakar sidan',
+'pageinfo-few-watchers' => 'Färre än $1 {{PLURAL:$1|bevakare}}',
'pageinfo-redirects-name' => 'Omdirigeringar till denna sida',
'pageinfo-subpages-name' => 'Undersidor till denna sida',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|omdirigering|omdirigeringar}}; $3 {{PLURAL:$3|icke-omdirigering|icke-omdirigeringar}})',
@@ -3137,6 +3164,19 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
'pageinfo-magic-words' => '{{PLURAL:$1|Magiskt|Magiska}} ord ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Dold kategori|Dolda kategorier}} ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Inkluderad mall|Inkluderade mallar}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Sida|Sidor}} mallinkluderas på ($1)',
+'pageinfo-toolboxlink' => 'Sidinformation',
+'pageinfo-redirectsto' => 'Omdirigerar till',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Räknas som en innehållssida',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Skrivskydd kaskaderar härifrån',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Skrivskydd kaskaderar från',
+'pageinfo-category-info' => 'Kategoriinformation',
+'pageinfo-category-pages' => 'Antal sidor',
+'pageinfo-category-subcats' => 'Antal underkategorier',
+'pageinfo-category-files' => 'Antal filer',
# Skin names
'skinname-standard' => 'Standard',
@@ -3159,6 +3199,8 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
'markedaspatrollederror' => 'Kan inte markera som patrullerad',
'markedaspatrollederrortext' => 'Det går inte att markera som patrullerad utan att ange version.',
'markedaspatrollederror-noautopatrol' => 'Du har inte tillåtelse att markera dina egna redigeringar som patrullerade.',
+'markedaspatrollednotify' => 'Denna ändring till $1 har markerats som patrullerad.',
+'markedaspatrollederrornotify' => 'Markering som patrullerad misslyckades.',
# Patrol log
'patrol-log-page' => 'Patrulleringslogg',
@@ -3192,6 +3234,7 @@ Om du kör den kan din dator skadas.",
'file-nohires' => 'Det finns ingen version med högre upplösning.',
'svg-long-desc' => 'SVG-fil, grundstorlek: $1 × $2 pixlar, filstorlek: $3',
'svg-long-desc-animated' => 'Animerad SVG-fil, standardstorlek $1 × $2 pixlar, filstorlek: $3',
+'svg-long-error' => 'Felaktig SVG-fil: $1',
'show-big-image' => 'Högupplöst version',
'show-big-image-preview' => 'Storlek på förhandsvisningen: $1.',
'show-big-image-other' => '{{PLURAL:$2|Annan upplösning|Andra upplösningar}}: $1.',
@@ -3222,7 +3265,10 @@ Om du kör den kan din dator skadas.",
'minutes' => '{{PLURAL:$1|$1 minut|$1 minuter}}',
'hours' => '{{PLURAL:$1|$1 timme|$1 timmar}}',
'days' => '{{PLURAL:$1|$1 dag|$1 dagar}}',
+'months' => '{{PLURAL:$1|$1 månad|$1 månader}}',
+'years' => '{{PLURAL:$1|$1 år}}',
'ago' => '$1 sedan',
+'just-now' => 'precis nu',
# Bad image list
'bad_image_list' => 'Listan fungerar enligt följande:
@@ -3716,6 +3762,7 @@ Denna bekräftelsekod kommer att sluta fungera efter $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Interwiki-inklusion är inte aktiverad]',
'scarytranscludefailed' => '[Hämtning av mall för $1 misslyckades]',
+'scarytranscludefailed-httpstatus' => '[Hämtning av mall för $1 misslyckades: HTTP $2]',
'scarytranscludetoolong' => '[För lång URL]',
# Delete conflict
@@ -3833,6 +3880,7 @@ Du kan också [[Special:EditWatchlist|använda standardeditorn]].',
'version-license' => 'Licens',
'version-poweredby-credits' => "Den här wikin drivs av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'andra',
+'version-credits-summary' => 'Vi skulle vilja tacka följande personer för deras bidrag till [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki är fri programvara; du kan distribuera det och/eller modifiera det under villkoren i GNU General Public License, publicerad av Free Software Foundation; antingen version 2 av licensen, eller (om du önskar) någon senare version.
MediaWiki distribueras i hopp om att det ska vara användbart, men UTAN NÅGON GARANTI, även utan underförstådd garanti om SÄLJBARHET eller LÄMPLIGHET FÖR ETT VISST SYFTE. Se GNU General Public License för fler detaljer.
@@ -3947,17 +3995,17 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
'sqlite-no-fts' => '$1 utan stöd för fulltextsökning',
# New logging system
-'logentry-delete-delete' => '$1 raderade sidan $3',
-'logentry-delete-restore' => '$1 återställde sidan $3',
-'logentry-delete-event' => '$1 ändrade synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
-'logentry-delete-revision' => '$1 ändrade synligheten för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
-'logentry-delete-event-legacy' => '$1 ändrade synligheten för logghändelser på $3',
-'logentry-delete-revision-legacy' => '$1 ändrade synligheten för versioner på sidan $3',
-'logentry-suppress-delete' => '$1 gömde sidan $3',
-'logentry-suppress-event' => '$1 ändrade i hemlighet synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
-'logentry-suppress-revision' => '$1 ändrade synligheten i hemlighet för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
-'logentry-suppress-event-legacy' => '$1 ändrade synligheten i hemlighet för logghändelser på $3',
-'logentry-suppress-revision-legacy' => '$1 ändrade synligheten i hemlighet för versioner på sidan $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|raderade}} sidan $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|återställde}} sidan $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten för logghändelser på $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten för versioner på sidan $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|gömde}} sidan $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|ändrade}} i hemlighet synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för logghändelser på $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för versioner på sidan $3',
'revdelete-content-hid' => 'innehåll dolt',
'revdelete-summary-hid' => 'redigeringssammanfattning dold',
'revdelete-uname-hid' => 'användarnamn dolt',
@@ -3966,17 +4014,21 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
'revdelete-uname-unhid' => 'användarnamn synligt',
'revdelete-restricted' => 'satte begränsningar för administratörer',
'revdelete-unrestricted' => 'tog bort begränsningar för administratörer',
-'logentry-move-move' => '$1 flyttade sidan $3 till $4',
-'logentry-move-move-noredirect' => '$1 flyttade sidan $3 till $4 utan att lämna en omdirigering',
-'logentry-move-move_redir' => '$1 flyttade sidan $3 till $4 över en omdirigering',
-'logentry-move-move_redir-noredirect' => '$1 flyttade sidan $3 till $4 över en omdirigering utan att lämna en omdirigering',
-'logentry-patrol-patrol' => '$1 markerade versionen $4 av sidan $3 som patrullerad',
-'logentry-patrol-patrol-auto' => '$1 markerade automatiskt versionen $4 av sidan $3 som patrullerad',
-'logentry-newusers-newusers' => 'Användarkonto $1 skapades',
-'logentry-newusers-create' => 'Användarkonto $1 skapades',
-'logentry-newusers-create2' => 'Användarkonto $3 skapades av $1',
-'logentry-newusers-autocreate' => 'Kontot $1 skapades automatiskt',
-'newuserlog-byemail' => 'lösenord skickat med e-post',
+'logentry-move-move' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4 utan att lämna en omdirigering',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4 över en omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4 över en omdirigering utan att lämna en omdirigering',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|markerade}} versionen $4 av sidan $3 som patrullerad',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markerade}} automatiskt versionen $4 av sidan $3 som patrullerad',
+'logentry-newusers-newusers' => 'Användarkonto $1 har {{GENDER:$2|skapats}}',
+'logentry-newusers-create' => 'Användarkonto $1 har {{GENDER:$2|skapats}}',
+'logentry-newusers-create2' => 'Användarkonto $3 har {{GENDER:$2|skapats}} av $1',
+'logentry-newusers-byemail' => 'Användarkontot $3 har {{GENDER:$2|skapats}} av $1 och lösenordet skickades via e-post',
+'logentry-newusers-autocreate' => 'Användarkontot $1 {{GENDER:$2|skapades}} automatiskt',
+'logentry-rights-rights' => '$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för $3 från $4 till $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|ändrade}} gruppmedlemskapet för $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|befordrades}} automatiskt från $4 till $5',
+'rightsnone' => '(inga)',
# Feedback
'feedback-bugornote' => 'Om du är redo att beskriva ett tekniskt problem detaljerat, var god [$1 rapporterar en bugg].
@@ -4030,6 +4082,7 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
'api-error-ok-but-empty' => 'Internt fel: Inget svar från servern.',
'api-error-overwrite' => 'Det är inte tillåtet att skriva över en befintlig fil.',
'api-error-stashfailed' => 'Internt fel: servern kunde inte lagra temporär fil.',
+'api-error-publishfailed' => 'Internt fel: Servern kunde inte publicera temporär fil.',
'api-error-timeout' => 'Servern svarade inte inom förväntad tid.',
'api-error-unclassified' => 'Ett okänt fel uppstod',
'api-error-unknown-code' => 'Okänt fel: "$1"',
@@ -4050,4 +4103,7 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
'duration-centuries' => '$1 {{PLURAL:$1|sekel|sekel}}',
'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennier}}',
+# Image rotation
+'rotate-comment' => 'Bilden roteras $1 {{PLURAL:$1|grad|grader}} medurs',
+
);
diff --git a/languages/messages/MessagesSw.php b/languages/messages/MessagesSw.php
index 8da399fe..b6111a02 100644
--- a/languages/messages/MessagesSw.php
+++ b/languages/messages/MessagesSw.php
@@ -269,7 +269,6 @@ $messages = array(
'qbbrowse' => 'Vinjari',
'qbedit' => 'Hariri',
'qbpageoptions' => 'Ukurasa huu',
-'qbpageinfo' => 'Muktadha',
'qbmyoptions' => 'Kurasa zangu',
'qbspecialpages' => 'Kurasa za pekee',
'faq' => 'Maswali ya kawaida',
@@ -292,6 +291,7 @@ $messages = array(
'namespaces' => 'Maeneo ya wiki',
'variants' => 'Vibadala',
+'navigation-heading' => 'Urambazaji',
'errorpagetitle' => 'Hitilafu',
'returnto' => 'Rudia $1.',
'tagline' => 'Kutoka {{SITENAME}}',
@@ -527,10 +527,8 @@ Sababu zilizotolewa ni "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Umetoka kwenye akaunti yako.'''
-Unaweza kuendelea kutumia {{SITENAME}} bila kutaja jina lako, au unaweza [[Special:UserLogin|kuingia tena]] kwenye akaunti yako. Kumbuka kwamba kurasa nyingine zitaendelea kuonekana kana kwamba bado hujatoka kwenye akaunti yako, hadi utakaposafisha kache ya kivinjari.",
-'welcomecreation' => '== Karibu, $1! ==
-Ushafunguliwa akaunti yako tayari.
-Usisahau kubadilisha mapendekezo yako ya [[Special:Preferences|{{SITENAME}}]].',
+Unaweza kuendelea kutumia {{SITENAME}} bila kutaja jina lako, au unaweza <span class='plainlinks'>[$1 kuingia tena]</span> kwenye akaunti yako. Kumbuka kwamba kurasa nyingine zitaendelea kuonekana kana kwamba bado hujatoka kwenye akaunti yako, hadi utakaposafisha kache ya kivinjari.",
+'welcomeuser' => 'Karibu, $1!',
'yourname' => 'Jina la mtumiaji:',
'yourpassword' => 'Neno la siri:',
'yourpasswordagain' => 'Andika tena neno la siri',
@@ -865,7 +863,6 @@ Rejea kumbukumbu ya mwisho inayoandikwa chini:",
'template-protected' => '(kulindwa)',
'template-semiprotected' => '(ulindaji kwa kiasi)',
'hiddencategories' => 'Ukurasa huu uliomo katika jamii $1 {{PLURAL:$1|iliofichwa|zilizofichwa}}:',
-'nocreatetitle' => 'Si wote wanaoweza kuanzisha ukurasa',
'nocreatetext' => '{{SITENAME}} imebana uwezekano kutengeneza kurasa mpya. Unaweza kurudia na kuhariri kurasa zilizomo, au [[Special:UserLogin|ingia au anza akaunti]].',
'nocreate-loggedin' => 'Huna ruhusa ya kuanzisha ukurasa mpya.',
'sectioneditnotsupported-title' => 'Kuhariri sehemu kwa sehemu haiwezikani',
@@ -888,6 +885,9 @@ Inaonekana kwamba ukurasa umefutwa.',
Ukurasa wa jina hilo unapatikana tayari.',
'defaultmessagetext' => 'Ujumbe uliopo',
+# Content models
+'content-model-javascript' => 'HatiJava',
+
# Parser/template warnings
'post-expand-template-inclusion-warning' => "'''Ilani:''' Kigezo kinajumlisha ukubwa uliozidi mno.
Baadhi ya vigezo havitaweza kuingizwa.",
@@ -1345,11 +1345,13 @@ Taarifa hii itakuwa wazi.',
'right-sendemail' => 'Kutuma barua-pepe kwa watumiaji wengine',
'right-passwordreset' => 'Onesha barua pepe zinazoweka neno la siri upya',
+# Special:Log/newusers
+'newuserlogpage' => 'Kumbukumbu za kuanzisha akaunti za watumiaji',
+'newuserlogpagetext' => 'Hii ni kumbukumbu ya akaunti mpya zilizosajiliwa.',
+
# User rights log
'rightslog' => 'Kumbukumbu za vyeo vya watumiaji',
'rightslogtext' => 'Hii ni kumbukumbu za mabadiliko za wezo za watumiaji.',
-'rightslogentry' => 'alibadilisha wezo za $1 aliyekuwa na wezo za kundi $2 awe mwanachama wa $3',
-'rightsnone' => '(hana)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'kusoma ukurasa huu',
@@ -1922,10 +1924,6 @@ Itifaki zinazoungwa mkono: <code>$1</code> (usiongeza hizi unapotafuta).',
'activeusers-hidesysops' => 'Ficha wakabidhi',
'activeusers-noresult' => 'Watumiaji hawakupatikana.',
-# Special:Log/newusers
-'newuserlogpage' => 'Kumbukumbu za kuanzisha akaunti za watumiaji',
-'newuserlogpagetext' => 'Hii ni kumbukumbu ya akaunti mpya zilizosajiliwa.',
-
# Special:ListGroupRights
'listgrouprights' => 'Wezo za kundi za watumiaji',
'listgrouprights-summary' => 'Inafuata orodha ya kundi za watumiaji wa wiki hii, pamoja na maelezo ya wezo zao za kushughulika mambo.
@@ -2024,11 +2022,7 @@ Ukitaka kufuta ukurasa huo kutoka maangalizi yako baadaye, bonyeza \"Acha kufuat
'enotif_mailer' => 'Huduma ya taarifa ya barua pepe kutoka kwa {{SITENAME}}',
'enotif_reset' => 'Weka alama kwa kurasa zote zilizotembelewa',
-'enotif_newpagetext' => 'Ukurasa huu ni mpya.',
'enotif_impersonal_salutation' => 'Kwa mtumiaji wa {{SITENAME}}',
-'changed' => 'alibadilisha',
-'created' => 'alianzisha',
-'enotif_subject' => '$PAGEEDITOR $CHANGEDORCREATED ukurasa wa $PAGETITLE kwenye {{SITENAME}}',
'enotif_lastvisited' => 'Tazama $1 kwa mabadiliko yote tangu ziara yako ya mwisho.',
'enotif_lastdiff' => 'Tazama badiliko hili hapo $1.',
'enotif_anon_editor' => 'mtumiaji bila jina $1',
@@ -2059,6 +2053,8 @@ $UNWATCHURL
Kutoa maoni yako au kupata msaada mwingine:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'alianzisha',
+'changed' => 'alibadilisha',
# Delete
'deletepage' => 'Futa ukurasa',
@@ -2204,7 +2200,7 @@ $1',
'blanknamespace' => '(Kuu)',
# Contributions
-'contributions' => 'Michango ya mtumiaji',
+'contributions' => 'Michango ya {{GENDER:$1|mtumiaji}}',
'contributions-title' => 'Michango ya mtumiaji $1',
'mycontris' => 'Michango',
'contribsub2' => 'Kwa $1 ($2)',
@@ -2582,8 +2578,15 @@ Tafadhali jaribu tena.',
'pageinfo-header-properties' => 'Sifa za ukurasa',
'pageinfo-display-title' => 'Onyesha mada',
'pageinfo-article-id' => 'ID ya ukurasa',
+'pageinfo-language' => 'Lugha ya maudhui ya ukurasa',
'pageinfo-watchers' => 'Idadi ya wanaofuatilia',
'pageinfo-edits' => 'Idadi ya maharirio',
+'pageinfo-toolboxlink' => 'Maelezo ya ukurasa',
+'pageinfo-contentpage-yes' => 'Ndiyo',
+'pageinfo-protect-cascading-yes' => 'Ndiyo',
+'pageinfo-category-info' => 'Maelezo ya jamii',
+'pageinfo-category-pages' => 'Idadi ya kurasa',
+'pageinfo-category-files' => 'Idadi ya mafaili',
# Image deletion
'deletedrevision' => 'Pitio la awali lililofutwa $1',
@@ -3155,7 +3158,7 @@ Tovuti hii inapata matatatizo wakati huu.',
'logentry-newusers-create' => '$1 alianzisha akaunti ya mtumiaji',
'logentry-newusers-create2' => '$1 alianzisha akaunti ya mtumiaji $3',
'logentry-newusers-autocreate' => 'Akaunti ya mtumiaji $1 ilianzishwa na mashine',
-'newuserlog-byemail' => 'neno la siri limetumwa kwa barua pepe',
+'rightsnone' => '(hana)',
# Feedback
'feedback-subject' => 'Mada:',
diff --git a/languages/messages/MessagesSzl.php b/languages/messages/MessagesSzl.php
index 9be77709..03d6c194 100644
--- a/languages/messages/MessagesSzl.php
+++ b/languages/messages/MessagesSzl.php
@@ -208,7 +208,6 @@ $messages = array(
'qbbrowse' => 'Uoglůndańy',
'qbedit' => 'Sprowjej',
'qbpageoptions' => 'Ta zajta',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => 'Moje zajty',
'qbspecialpages' => 'Szpecyjalne zajty',
'faq' => 'FAQ',
@@ -451,11 +450,8 @@ Administrator kery zawarł wćepał kůmyntorz: "$3".',
# Login and logout pages
'logouttext' => "'''Terozki ježeś wylůgowany'''.
-Možeš dali sam sprowjać zajty we {{SITENAME}} kej ńyzalůgowany užytkowńik, abo [[Special:UserLogin|zalůgować śe nazod]] kej tyn som abo inkšy užytkowńik.
+Možeš dali sam sprowjać zajty we {{SITENAME}} kej ńyzalůgowany užytkowńik, abo <span class='plainlinks'>[$1 zalůgować śe nazod]</span> kej tyn som abo inkšy užytkowńik.
Dej pozůr, co na ńykerych zajtach přeglůndarka može dali pokozywać co ježeś zalůgowany, a bydźe tak aže uodśwjyžyš jeij cache.",
-'welcomecreation' => '== Witej, $1! ==
-Uotwarli my sam lo Ćebje kůnto.
-Ńy zapomńij poštalować [[Special:Preferences|preferencyji lo {{GRAMMAR:D.lp|{{SITENAME}}}}]].',
'yourname' => 'Mjano użytkowńika:',
'yourpassword' => 'Hasło:',
'yourpasswordagain' => 'Naszkryflej ausdruk zaÅ›',
@@ -741,7 +737,6 @@ Uostatńy wpis z rejera je ńyżej.",
'template-protected' => '(zawrzity uod sprowjańo)',
'template-semiprotected' => '(tajlowo zawarte)',
'hiddencategories' => 'Ta zajta je {{PLURAL:$1|w jednyj schrůńunyj katygoryji|we $1 schrůńunych katygoryjach}}:',
-'nocreatetitle' => 'UograÅ„iÄůno wćepywaÅ„y zajtůw',
'nocreatetext' => 'Na {{GRAMMAR:MS.lp|{{SITENAME}}}} twoÅ™yÅ„y nowych zajtůw uograÅ„iÄůno.
Možeš sprowjać te co juž sům, abo [[Special:UserLogin|zalogować śe, abo zauožyć konto]].',
'nocreate-loggedin' => 'Ńy moš uprowńyń do twořyńo nowych zajtůw.',
@@ -1185,11 +1180,13 @@ $1',
'right-userrights-interwiki' => 'Sprowjej uprawńyńo užytkowńikůw na zajtach inkšych Wiki',
'right-siteadmin' => 'Zawjerańy i uodmykańy bazy danych',
+# Special:Log/newusers
+'newuserlogpage' => 'Nowe użytkowniki',
+'newuserlogpagetext' => 'To je rejer uostatńo utworzůnych kůnt użytkowńikůw',
+
# User rights log
'rightslog' => 'Uprawńyńa',
'rightslogtext' => 'Rejer půmjyńań uprawńyń užytkowńikůw.',
-'rightslogentry' => 'půmjyńiu/a uprawńyńo užytkowńika $1 ($2 → $3)',
-'rightsnone' => 'podstawowo',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'přeglůndańo tyj zajty',
@@ -1632,10 +1629,6 @@ Uobsůgiwane protokoły: <code>$1</code>',
'activeusers-hidesysops' => 'Schrůń adminy',
'activeusers-noresult' => 'Ńy sům używacze.',
-# Special:Log/newusers
-'newuserlogpage' => 'Nowe użytkowniki',
-'newuserlogpagetext' => 'To je rejer uostatńo utworzůnych kůnt użytkowńikůw',
-
# Special:ListGroupRights
'listgrouprights' => 'Uprawńyńo grup użytkowńikůw',
'listgrouprights-summary' => 'Půńiży znojdowo śe spis grup użytkowńikůw zdefińjowanych na tyj wiki, s wyszczygůlńyńym przidźelůnych im prow dostympu.
@@ -1716,11 +1709,7 @@ Na tyi liśće bydźeš mjou rejer přišuych sprowjyń tyi zajty i jeji zajty g
'enotif_mailer' => 'Powjadomjyńe s {{GRAMMAR:D.lp|{{SITENAME}}}}',
'enotif_reset' => 'UoznoÄ wÅ¡yjstke zajty kej uodwjydzůne',
-'enotif_newpagetext' => 'To je nowo zajta.',
'enotif_impersonal_salutation' => 'užytkowńik {{GRAMMAR:D.lp|{{SITENAME}}}}',
-'changed' => 'pomjyńono',
-'created' => 'utwořono',
-'enotif_subject' => 'Zajta $PAGETITLE we {{GRAMMAR:MS.lp|{{SITENAME}}}} zostoua $CHANGEDORCREATED bez užytkowńika $PAGEEDITOR',
'enotif_lastvisited' => 'Uobejřij na zajće $1 wšyjstke půmjyńańo uod Twojej uostatńij wizyty.',
'enotif_lastdiff' => 'Uobejřij na zajće $1 te pomjyńeńe.',
'enotif_anon_editor' => 'užytkowńik anůnimowy $1',
@@ -1747,6 +1736,8 @@ KejbyÅ› chćou půmjyÅ„ić Å¡talowaÅ„o swojej listy zajtůw, na kere dowoÅ¡ pozÅ
Pomoc:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'utwořono',
+'changed' => 'pomjyńono',
# Delete
'deletepage' => 'Wyćep artikel',
@@ -2851,6 +2842,6 @@ NaÅ¡kryflej sam mjano plika bez prefiksu „{{ns:file}}:â€.',
# New logging system
'revdelete-restricted' => 'naÅ¡taluj uograniÄyÅ„o do administratorůw',
'revdelete-unrestricted' => 'wycofej uograniÄyÅ„o do administratorůw',
-'newuserlog-byemail' => 'hasło uostało wysłane e-brifym',
+'rightsnone' => 'podstawowo',
);
diff --git a/languages/messages/MessagesTa.php b/languages/messages/MessagesTa.php
index 70ec4398..362ca0b6 100644
--- a/languages/messages/MessagesTa.php
+++ b/languages/messages/MessagesTa.php
@@ -226,7 +226,6 @@ $messages = array(
'qbbrowse' => 'உலவà¯',
'qbedit' => 'தொகà¯',
'qbpageoptions' => 'பகà¯à®• விரà¯à®ªà¯à®ªà®¤à¯ தேரà¯à®µà¯à®•à®³à¯',
-'qbpageinfo' => 'பகà¯à®•à®¤à¯ தகவலà¯à®•à®³à¯',
'qbmyoptions' => 'என௠விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯',
'qbspecialpages' => 'சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯',
'faq' => 'அடிகà¯à®•à®Ÿà®¿ கேடà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯ கேளà¯à®µà®¿à®•à®³à¯',
@@ -251,6 +250,7 @@ $messages = array(
மாறà¯à®±à¯à®°à¯à®µà®™à¯à®•à®³à¯',
+'navigation-heading' => 'வழிசெலà¯à®¤à¯à®¤à®²à¯ படà¯à®Ÿà®¿',
'errorpagetitle' => 'தவறà¯',
'returnto' => '$1 பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯à®¤à¯ திரà¯à®®à¯à®ªà¯.',
'tagline' => '{{SITENAME}} இரà¯à®¨à¯à®¤à¯',
@@ -482,9 +482,9 @@ MySQL returned error "$3: $4".',
# Login and logout pages
'logouttext' => "'''நீஙà¯à®•à®³à¯ இபà¯à®ªà¯Šà®´à¯à®¤à¯ விடà¯à®ªà®¤à®¿à®•à¯ˆà®¯à®¿à®²à¯ உளà¯à®³à¯€à®°à¯à®•à®³à¯.'''
-நீஙà¯à®•à®³à¯ தொடரà¯à®¨à¯à®¤à¯ {{SITENAME}} தளதà¯à®¤à¯ˆ அனானியாகப௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à®¾à®®à¯, அலà¯à®²à®¤à¯ அதே பயனராகவோ வேற௠பயனராகவோ [[Special:UserLogin|மீணà¯à®Ÿà¯à®®à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ]] செயà¯à®¯à®²à®¾à®®à¯. உஙà¯à®•à®³à¯ உலாவியின௠இடைமாறà¯à®±à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯ வரை சில பகà¯à®•à®™à¯à®•à®³à¯ தொடரà¯à®¨à¯à®¤à¯à®®à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆà®¯à®¿à®²à¯ உளà¯à®³à®¤à¯ போனà¯à®±à¯‡ காடà¯à®šà®¿ தரà¯à®®à¯ எனà¯à®ªà®¤à¯ˆà®•à¯ கவனிகà¯à®•à®µà¯à®®à¯.",
-'welcomecreation' => '==நலà¯à®µà®°à®µà¯, $1!==
-உஙà¯à®•à®³à¯à®•à¯à®•à®¾à®© பயனர௠கணகà¯à®•à¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. உஙà¯à®•à®³à¯à®•à¯à®•à¯‡à®±à¯à®±à®µà®¾à®±à¯ [[Special:Preferences|{{SITENAME}} விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯ˆ]] மாறà¯à®±à®¿à®•à¯ கொளà¯à®³ மறவாதீரà¯à®•à®³à¯.',
+நீஙà¯à®•à®³à¯ தொடரà¯à®¨à¯à®¤à¯ {{SITENAME}} தளதà¯à®¤à¯ˆ அனானியாகப௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à®¾à®®à¯, அலà¯à®²à®¤à¯ அதே பயனராகவோ வேற௠பயனராகவோ <span class='plainlinks'>[$1 மீணà¯à®Ÿà¯à®®à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ]</span> செயà¯à®¯à®²à®¾à®®à¯. உஙà¯à®•à®³à¯ உலாவியின௠இடைமாறà¯à®±à¯ நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯ வரை சில பகà¯à®•à®™à¯à®•à®³à¯ தொடரà¯à®¨à¯à®¤à¯à®®à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆà®¯à®¿à®²à¯ உளà¯à®³à®¤à¯ போனà¯à®±à¯‡ காடà¯à®šà®¿ தரà¯à®®à¯ எனà¯à®ªà®¤à¯ˆà®•à¯ கவனிகà¯à®•à®µà¯à®®à¯.",
+'welcomeuser' => 'வரà¯à®• $1',
+'welcomecreation-msg' => 'உஙà¯à®•à®³à¯à®•à¯à®•à®¾à®© பயனர௠கணகà¯à®•à¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯. உஙà¯à®•à®³à¯à®•à¯à®•à¯‡à®±à¯à®±à®µà®¾à®±à¯ [[Special:Preferences|{{SITENAME}} விரà¯à®ªà¯à®ªà®¤à¯à®¤à¯‡à®°à¯à®µà¯à®•à®³à¯ˆ]] மாறà¯à®±à®¿à®•à¯ கொளà¯à®³ மறவாதீரà¯à®•à®³à¯.',
'yourname' => 'பயனர௠பெயரà¯:',
'yourpassword' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯:',
'yourpasswordagain' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆà®¤à¯ திரà¯à®®à¯à®ª தடà¯à®Ÿà®šà¯à®šà®¿à®Ÿà¯à®•:',
@@ -575,6 +575,7 @@ MySQL returned error "$3: $4".',
# Email sending
'php-mail-error-unknown' => "PHP 's mail() செயலà¯à®ªà®¾à®Ÿà¯à®Ÿà®¿à®²à¯ அறியபà¯à®ªà®Ÿà®¾à®¤ பிழை.",
'user-mail-no-addy' => 'மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿ இலà¯à®²à®¾à®®à®²à¯ மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ª à®®à¯à®¯à®±à¯à®šà®¿à®¤à¯à®¤à®¤à¯.',
+'user-mail-no-body' => 'வெறà¯à®±à¯ அலà¯à®²à®¤à¯ மிகவà¯à®®à¯ சிறிய அளவà¯à®³à¯à®³ மினà¯à®©à®žà¯à®šà®²à¯ˆ அனà¯à®ªà¯à®ª à®®à¯à®¯à®±à¯à®šà®¿à®¤à¯à®¤à¯à®³à¯à®³à¯€à®°à¯.',
# Change password dialog
'resetpass' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ மாறà¯à®±à®¿à®¯à®®à¯ˆ',
@@ -633,6 +634,7 @@ $2
'changeemail-oldemail' => 'தறà¯à®ªà¯Šà®´à¯à®¤à¯à®³à¯à®³ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿:',
'changeemail-newemail' => 'பà¯à®¤à®¿à®¯ மினà¯à®©à®žà¯à®šà®²à¯ à®®à¯à®•à®µà®°à®¿:',
'changeemail-none' => '(எதà¯à®µà¯à®®à®¿à®²à¯à®²à¯ˆ)',
+'changeemail-password' => 'உஙà¯à®•à®³à¯ {{SITENAME}} கடவà¯à®šà¯à®šà¯Šà®²à¯:',
'changeemail-submit' => 'மினà¯à®©à®žà¯à®šà®²à¯ˆ மாறà¯à®±à¯',
'changeemail-cancel' => 'விடà¯à®Ÿà¯à®µà®¿à®Ÿà¯',
@@ -794,7 +796,6 @@ $1 எனà¯à®®à¯ பயனரையோ வேற௠[[{{MediaWiki:Grouppage-sy
'template-protected' => '(காகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯)',
'template-semiprotected' => '(பகà¯à®¤à®¿à®¯à®¾à®•à®•à¯ காகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯)',
'hiddencategories' => 'இபà¯à®ªà®•à¯à®•à®®à¯ {{PLURAL:$1|ஒர௠மறைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®ªà¯à®ªà®¿à®²à¯|$1 மறைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®ªà¯à®ªà¯à®•à®³à®¿à®²à¯}} அடஙà¯à®•à¯à®•à®¿à®±à®¤à¯:',
-'nocreatetitle' => 'பகà¯à®•à®¤à¯ தொடகà¯à®•à®®à¯ மடà¯à®Ÿà¯à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯',
'nocreatetext' => '{{SITENAME}} பà¯à®¤à®¿à®¯ பகà¯à®•à®™à¯à®•à®³à¯ˆ ஆகà¯à®•à¯à®µà®¤à®±à¯à®•à®¾à®© அனà¯à®®à®¤à®¿à®¯à¯ˆ மடà¯à®Ÿà¯à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®¯à¯à®³à¯à®³à®¤à¯.
நீஙà¯à®•à®³à¯ à®à®±à¯à®•à®©à®µà¯‡ இரà¯à®•à¯à®•à¯à®®à¯ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¤à¯ தொகà¯à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à¯à®®à¯ அலà¯à®²à®¤à¯ [[Special:UserLogin|பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯à®µà¯à®®à¯ அலà¯à®²à®¤à¯ கணகà¯à®•à¯Šà®©à¯à®±à¯ˆ தொடஙà¯à®•à¯à®™à¯à®•à®³à¯]].',
'nocreate-loggedin' => 'பà¯à®¤à®¿à®¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¤à¯ தொடஙà¯à®•à¯à®µà®¤à®±à¯à®•à¯ உஙà¯à®•à®³à¯à®•à¯à®•à¯ அனà¯à®®à®¤à®¿ கிடையாதà¯.',
@@ -821,6 +822,14 @@ $1 எனà¯à®®à¯ பயனரையோ வேற௠[[{{MediaWiki:Grouppage-sy
'edit-already-exists' => 'பà¯à®¤à®¿à®¯ பகà¯à®•à®®à¯Šà®©à¯à®±à¯ˆ உரà¯à®µà®¾à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.
இபà¯à®ªà®•à¯à®•à®®à¯ à®à®±à¯à®•à®©à®µà¯‡ உளà¯à®³à®¤à¯.',
'defaultmessagetext' => 'இயலà¯à®ªà®¿à®°à¯à®ªà¯à®ªà¯ தகவல௠உரை',
+'invalid-content-data' => 'செலà¯à®²à®¾à®¤ உளà¯à®³à®Ÿà®•à¯à®•à®¤à¯ தரவà¯',
+'content-not-allowed-here' => '"$1" உளà¯à®³à®Ÿà®•à¯à®•à®®à¯ [[$2]] பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ அனà¯à®®à®¤à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
+
+# Content models
+'content-model-wikitext' => 'விகà¯à®•à®¿à®‰à®°à¯ˆ',
+'content-model-text' => 'எளிய உரை',
+'content-model-javascript' => 'ஜாவா ஸà¯à®•à®¿à®°à®¿à®ªà¯à®Ÿà¯',
+'content-model-css' => 'சிஎஸà¯à®Žà®¸à¯',
# Parser/template warnings
'expensive-parserfunction-warning' => 'எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ: இபà¯à®ªà®•à¯à®•à®®à¯ அதிகளவ௠இலகà¯à®•à®£à®ªà¯ பாகà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®šà¯ சாரà¯à®ªà¯à®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿà¯à®³à¯à®³à®¤à¯.
@@ -1180,9 +1189,9 @@ $1",
'prefs-emailconfirm-label' => 'மினà¯à®©à®žà¯à®šà®²à¯ˆ உறà¯à®¤à®¿à®šà¯†à®¯à¯à®¤à®²à¯:',
'prefs-textboxsize' => 'தொகà¯à®•à¯à®•à¯à®®à¯ சாளரதà¯à®¤à®¿à®©à¯ அளவà¯',
'youremail' => 'மினà¯à®©à®žà¯à®šà®²à¯:',
-'username' => 'பயனர௠பெயரà¯:',
-'uid' => 'பயனரà¯:',
-'prefs-memberingroups' => 'பினà¯à®µà®°à¯à®®à¯ {{PLURAL:$1|கà¯à®´à¯|கà¯à®´à¯à®•à¯à®•à®³à®¿à®²à¯}} உறà¯à®ªà¯à®ªà®¿à®©à®°à¯:',
+'username' => '{{GENDER:$1|பயனர௠பெயரà¯}}:',
+'uid' => '{{பாலினமà¯:$1|பயனரà¯}}:',
+'prefs-memberingroups' => 'பினà¯à®µà®°à¯à®®à¯ {{பனà¯à®®à¯ˆ:$1|கà¯à®´à¯|கà¯à®´à¯à®•à¯à®•à®³à®¿à®²à¯}} {{பாலினமà¯:$2|உறà¯à®ªà¯à®ªà®¿à®©à®°à¯}}:',
'prefs-registration' => 'பதிவ௠செயà¯à®¯à¯à®®à¯ நேரமà¯:',
'yourrealname' => 'உணà¯à®®à¯ˆà®ªà¯ பெயரà¯:',
'yourlanguage' => 'மொழி:',
@@ -1333,12 +1342,13 @@ $1",
'right-sendemail' => 'மறà¯à®± பயனரà¯à®•à®³à¯à®•à¯à®•à¯ மினà¯à®©à®žà¯à®šà®²à¯ அனà¯à®ªà¯à®ªà¯',
'right-passwordreset' => 'கடவà¯à®šà¯à®šà¯Šà®²à¯ மீடà¯à®Ÿà®®à¯ˆ மினà¯à®©à®žà¯à®šà®²à¯à®•à®³à¯ˆ காணà¯.',
+# Special:Log/newusers
+'newuserlogpage' => 'பயனர௠உரà¯à®µà®¾à®•à¯à®•à®®à¯ பறà¯à®±à®¿à®¯ கà¯à®±à®¿à®ªà¯à®ªà¯',
+'newuserlogpagetext' => 'இத௠பயனர௠படைபà¯à®ªà¯à®•à®³à®¿à®©à¯ பதிவ௠ஆகà¯à®®à¯.',
+
# User rights log
'rightslog' => 'பயனர௠உரிமைகள௠பதிகை',
'rightslogtext' => 'இத௠பயனர௠உரிமைகள௠தொடரà¯à®ªà®¾à®© மாறà¯à®±à®™à¯à®•à®³à®¿à®©à¯ பதிகையாகà¯à®®à¯.',
-'rightslogentry' => '$1 பயனரà¯à®•à¯à®•à®¾à®© கà¯à®´à¯ உறà¯à®ªà¯à®ªà®¿à®¯à®®à¯ $2 கà¯à®´à¯à®µà®¿à®²à®¿à®°à¯à®¨à¯à®¤à¯ $3 கà¯à®´à¯à®µà®¿à®±à¯à®•à¯ மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
-'rightslogentry-autopromote' => ' $2 லிரà¯à®¨à¯à®¤à¯ $3 கà¯à®•à¯ தானாக உயரà¯à®¨à¯à®¤à®¤à¯.',
-'rightsnone' => '(எதà¯à®µà¯à®®à®¿à®²à¯à®²à¯ˆ)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'இப௠பகà¯à®•à®¤à¯à®¤à¯ˆ வாசிகà¯à®•à®µà¯à®®à¯',
@@ -1773,6 +1783,9 @@ $1',
'disambiguationspage' => 'Template:பகà¯à®•à®µà®´à®¿ நெறிபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯',
'disambiguations-text' => "பினà¯à®µà®°à¯à®®à¯ பகà¯à®•à®™à¯à®•à®³à¯ '''பகà¯à®•à®µà®´à®¿ நெறிபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯''' இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®©. மாறாக இவை பொரà¯à®¤à¯à®¤à®®à®© தலைபà¯à®ªà®¿à®±à¯à®•à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿ வேணà¯à®Ÿà¯à®®à¯. <br />[[MediaWiki:Disambiguationspage|பகà¯à®•à®µà®´à®¿ நெறிபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ பகà¯à®•à®™à¯à®•à®¤à¯à®¤à®¿à®²à¯]] உளà¯à®³ வாரà¯à®ªà¯à®ªà¯à®°à¯ இணைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®™à¯à®•à®³à¯ பகà¯à®•à®µà®´à®¿ நெறிபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®²à¯ பகà¯à®•à®™à¯à®•à®³à¯ என௠கரà¯à®¤à®ªà¯à®ªà®Ÿà¯à®®à¯.",
+'pageswithprop' => 'பகà¯à®•à®ªà¯ பணà¯à®ªà¯à®Ÿà¯ˆà®¯ பகà¯à®•à®™à¯à®•à®³à¯',
+'pageswithprop-submit' => 'செலà¯à®•',
+
'doubleredirects' => 'இரடà¯à®Ÿà¯ˆ வழிமாறà¯à®±à¯à®•à®³à¯',
'doubleredirectstext' => 'இநà¯à®¤à®ªà¯ படà¯à®Ÿà®¿à®¯à®²à¯ போலியான நேரà¯à®®à®¤à®¿à®ªà¯à®ªà¯à®•à¯à®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à®•à¯à®•à¯‚டà¯à®®à¯. இத௠வழகà¯à®•à®®à®¾à®•, இணைபà¯à®ªà¯à®Ÿà®©à¯ கூடிய மேலதிக உரை à®®à¯à®¤à®²à®¾à®µà®¤à¯ #வழிமாறà¯à®±à¯à®•à¯à®•à¯à®•à¯ கீழ௠இரà¯à®ªà¯à®ªà®¤à¯ˆà®•à¯ கà¯à®±à®¿à®•à¯à®•à¯à®®à¯.ஒவà¯à®µà¯Šà®°à¯ வரியà¯à®®à¯, à®®à¯à®¤à®²à®¾à®®à¯ இரணà¯à®Ÿà®¾à®®à¯ வழிமாறà¯à®±à¯à®•à®³à¯à®•à¯à®•à¯ இணைபà¯à®ªà¯à®•à®³à¯ˆà®•à¯ கொணà¯à®Ÿà®¿à®°à¯à®ªà¯à®ªà®¤à¯à®Ÿà®©à¯, இரணà¯à®Ÿà®¾à®µà®¤à¯ வழிமாறà¯à®±à¯ உரையின௠மà¯à®¤à®²à¯ வரிகà¯à®•à¯à®®à¯ இணைபà¯à®ªà¯ˆà®•à¯ கொணà¯à®Ÿà®¿à®°à¯à®•à¯à®•à¯à®®à¯, இத௠வழகà¯à®•à®®à®¾à®• à®®à¯à®¤à®²à®¾à®µà®¤à¯ வழிமாறà¯à®±à¯ கà¯à®±à®¿à®¤à¯à®¤à¯à®•à¯ காடà¯à®Ÿ வேணà¯à®Ÿà®¿à®¯ "உணà¯à®®à¯ˆà®¯à®¾à®©" இலகà¯à®•à¯à®•à¯ கடà¯à®Ÿà¯à®°à¯ˆà®¯à¯ˆà®•à¯ கொடà¯à®•à¯à®•à¯à®®à¯.',
'double-redirect-fixed-move' => '[[$1]] நகரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯. இபà¯à®ªà¯Šà®´à¯à®¤à¯ [[$2]] உகà¯à®•à¯ வழிமாறà¯à®±à¯ தரà¯à®•à®¿à®©à¯à®±à®¤à¯.',
@@ -1933,10 +1946,6 @@ $1',
'activeusers-hidesysops' => 'நிரà¯à®µà®¾à®•à®¿à®•à®³à¯ˆ மறை',
'activeusers-noresult' => 'எநà¯à®¤à®µà¯Šà®°à¯ பயனரà¯à®•à®³à¯à®®à¯ காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.',
-# Special:Log/newusers
-'newuserlogpage' => 'பயனர௠உரà¯à®µà®¾à®•à¯à®•à®®à¯ பறà¯à®±à®¿à®¯ கà¯à®±à®¿à®ªà¯à®ªà¯',
-'newuserlogpagetext' => 'இத௠பயனர௠படைபà¯à®ªà¯à®•à®³à®¿à®©à¯ பதிவ௠ஆகà¯à®®à¯.',
-
# Special:ListGroupRights
'listgrouprights' => 'பயனர௠கà¯à®´à¯ உரிமைகளà¯',
'listgrouprights-key' => '<span class="listgrouprights-granted">உரிமை வழஙà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯</span>
@@ -2030,11 +2039,7 @@ $1',
'enotif_mailer' => '{{SITENAME}} தளதà¯à®¤à®¿à®©à¯ அறிவிதà¯à®¤à®²à¯ அஞà¯à®šà®²à¯à®•à®¾à®°à®°à¯',
'enotif_reset' => 'எலà¯à®²à®¾à®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯ˆà®¯à¯à®®à¯ பாரà¯à®µà¯ˆà®¯à®¿à®Ÿà¯à®Ÿà®¤à®¾à®• கà¯à®±à®¿à®¤à¯à®¤à¯à®•à¯à®•à¯Šà®³à¯',
-'enotif_newpagetext' => 'இத௠ஒர௠பà¯à®¤à®¿à®¯ பகà¯à®•à®®à®¾à®•à¯à®®à¯.',
'enotif_impersonal_salutation' => '{{SITENAME}} பயனரà¯',
-'changed' => 'மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
-'created' => 'தொடகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
-'enotif_subject' => '{{SITENAME}} தளதà¯à®¤à®¿à®©à¯ $PAGETITLE எனà¯à®±à®¤à¯ தலைபà¯à®ªà¯à®Ÿà¯ˆà®¯à®ªà¯ பகà¯à®•à®®à¯ $PAGEEDITOR பயனரால௠$CHANGEDORCREATED',
'enotif_lastvisited' => 'உஙà¯à®•à®³à¯ கடைசி வரà¯à®•à¯ˆà®•à¯à®•à¯à®ªà¯ பினà¯à®©à®°à¯ நடைபெறà¯à®±à¯à®³à¯à®³ மாறà¯à®±à®™à¯à®•à®³à¯ˆà®•à¯ காண $1 பகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯à®•à¯à®•à®µà¯à®®à¯.',
'enotif_lastdiff' => 'மாறà¯à®±à®™à¯à®•à®³à¯ˆà®•à¯ காண $1 பகà¯à®•à®¤à¯à®¤à¯ˆà®ªà¯ பாரà¯.',
'enotif_anon_editor' => 'அடையாளம௠காடà¯à®Ÿà®¾à®¤ பயனர௠$1',
@@ -2062,6 +2067,8 @@ $NEWPAGE
பினà¯à®©à¯‚டà¯à®Ÿà®®à¯, மேலதிக உதவிகளà¯à®•à¯à®•à¯:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'தொடகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
+'changed' => 'மாறà¯à®±à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
# Delete
'deletepage' => 'பகà¯à®•à®¤à¯à®¤à¯ˆ நீகà¯à®•à¯',
@@ -2128,6 +2135,7 @@ $NEWPAGE
'prot_1movedto2' => '[[$1]], [[$2]] எனà¯à®±à®¤à¯ தலைபà¯à®ªà¯à®•à¯à®•à¯ நகரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'protect-badnamespace-title' => 'பாதà¯à®•à®¾à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤ பெயரிடைவெளி',
'protect-badnamespace-text' => 'இநà¯à®¤ பெயரிடைவெளியில௠உளà¯à®³ பகà¯à®•à®™à¯à®•à®³à¯ பாதà¯à®•à®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà®¾à®¤à¯.',
+'protect-norestrictiontypes-title' => 'பாதà¯à®•à®¾à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤ பகà¯à®•à®™à¯à®•à®³à¯',
'protect-legend' => 'காபà¯à®ªà¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯',
'protectcomment' => 'காரணமà¯:',
'protectexpiry' => 'à®®à¯à®Ÿà®¿à®µà¯à®±à¯à®•à®¿à®±à®¤à¯:',
@@ -2209,7 +2217,7 @@ $NEWPAGE
'undeletedrevisions' => '{{PLURAL:$1|1 திரà¯à®¤à¯à®¤à®®à¯ மீடà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯|$1 திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯ மீடà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®©}}',
'undeletedrevisions-files' => '{{PLURAL:$1|1 திரà¯à®¤à¯à®¤à®®à¯|$1 திரà¯à®¤à¯à®¤à®™à¯à®•à®³à¯}} மறà¯à®±à¯à®®à¯ {{PLURAL:$2|1 கோபà¯à®ªà¯|$2 கோபà¯à®ªà¯à®•à®³à¯}} மீடà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®©.',
'undeletedfiles' => '{{PLURAL:$1|ஒர௠கோபà¯à®ªà¯ மீடà¯à®Ÿà¯†à®Ÿà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯|$1 கோபà¯à®ªà¯à®•à®³à¯ மீடà¯à®Ÿà¯†à®Ÿà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®©}}',
-'cannotundelete' => 'நீகà¯à®•à®®à¯ தோலà¯à®µà®¿; வேற௠யாராவத௠மà¯à®©à¯à®©à®¤à®¾à®• இபà¯à®ªà®•à¯à®•à®¤à¯à®¤à¯ˆ நீகà¯à®•à®¿à®¯à®¿à®°à¯à®•à¯à®•à®²à®¾à®®à¯.',
+'cannotundelete' => 'மீளà¯à®µà®¿à®¤à¯à®¤à®²à¯ தோலà¯à®µà®¿: $1',
'undeletedpage' => "'''$1 மீடà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯'''
அணà¯à®®à¯ˆà®¯ நீகà¯à®•à®²à¯à®•à®³à¯à®•à¯à®•à¯à®®à¯ மீடà¯à®ªà¯à®•à¯à®•à®³à¯à®•à¯à®•à¯à®®à¯ [[Special:Log/delete|நீகà¯à®•à®²à¯ பதிவைபà¯]] பாரà¯à®•à¯à®•à®µà¯à®®à¯.",
@@ -2621,7 +2629,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'சாவாநிரல௠சோதனை நடகà¯à®•à®¿à®©à¯à®±à®¤à¯',
-'javascripttest-disabled' => 'இநà¯à®¤à®šà¯ செயலà¯à®ªà®¾à®Ÿà¯ à®®à¯à®Ÿà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.',
'javascripttest-title' => '$1 சோதனைகள௠நடகà¯à®•à®¿à®©à¯à®±à®©',
'javascripttest-pagetext-noframework' => 'இநà¯à®¤ பகà¯à®•à®®à¯ JavaScript பரிசோதனை ஓடà¯à®Ÿà®¤à¯à®¤à®¿à®±à¯à®•à®¾à®• ஒதà¯à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯',
'javascripttest-pagetext-skins' => 'சோதனைகளை நடதà¯à®¤ à®®à¯à®•à®ªà¯à®ªà¯à®±à¯ˆ ஒனà¯à®±à¯ˆà®¤à¯ தேரà¯à®µà¯à®šà¯†à®¯à¯:',
@@ -2727,11 +2734,13 @@ $1',
'pageinfo-display-title' => 'காடà¯à®šà®¿à®¤à¯ தலைபà¯à®ªà¯',
'pageinfo-length' => 'பகà¯à®• நீளம௠(எணà¯à®£à¯à®£à¯à®®à®¿à®•à®³à®¿à®²à¯)',
'pageinfo-article-id' => 'பகà¯à®• அடையாள இலகà¯à®•à®®à¯',
+'pageinfo-language' => 'பகà¯à®• உளà¯à®³à®Ÿà®•à¯à®• மொழி',
'pageinfo-robot-policy' => 'தேடறà¯à®ªà¯Šà®±à®¿ நிலைமை',
'pageinfo-robot-index' => 'வகைபà¯à®ªà®Ÿà®•à¯à®•à¯‚டியதà¯',
'pageinfo-robot-noindex' => 'வகைபà¯à®ªà®Ÿà®¾à®¤à®¤à¯.',
'pageinfo-views' => 'காடà¯à®šà®¿à®•à®³à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆ',
'pageinfo-watchers' => 'பகà¯à®•à®ªà¯ பாரà¯à®µà¯ˆà®¯à®¾à®³à®°à¯à®•à®³à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆ',
+'pageinfo-few-watchers' => 'விட கà¯à®±à¯ˆà®µà®¾à®©à®¤à¯ $1 {{PLURAL:$1|watcher|watchers}}',
'pageinfo-redirects-name' => 'இநà¯à®¤à®ªà¯ பகà¯à®•à®¤à¯à®¤à®¿à®±à¯à®•à®¾à®© வழிமாறà¯à®±à¯à®•à®³à¯',
'pageinfo-subpages-name' => 'இநà¯à®¤à®ªà¯ பகà¯à®•à®¤à¯à®¤à®¿à®©à¯ தà¯à®£à¯ˆà®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|வழிமாறà¯à®±à¯|வழிமாறà¯à®±à¯à®•à®³à¯}}; $3 {{PLURAL:$3|வழிமாறà¯à®±à®¿à®²à¯à®²à®¾à®¤à®¤à¯|வழிமாறà¯à®±à®¿à®²à¯à®²à®¾à®¤à®µà¯ˆ}})',
@@ -2746,6 +2755,15 @@ $1',
'pageinfo-magic-words' => 'மாய {{PLURAL:$1|வாரà¯à®¤à¯à®¤à¯ˆ|வாரà¯à®¤à¯à®¤à¯ˆà®•à®³à¯}} ($1)',
'pageinfo-hidden-categories' => 'மறைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ {{PLURAL:$1|பகà¯à®ªà¯à®ªà¯|பகà¯à®ªà¯à®ªà¯à®•à®³à¯}} ($1)',
'pageinfo-templates' => 'பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿ {{PLURAL:$1|வாரà¯à®ªà¯à®ªà¯à®°à¯|வாரà¯à®ªà¯à®ªà¯à®°à¯à®•à¯à®•à®³à¯}} ($1)',
+'pageinfo-toolboxlink' => 'பகà¯à®•à®¤à¯ தகவலà¯',
+'pageinfo-redirectsto' => 'வழிமாறà¯à®±à®µà¯à®®à¯:',
+'pageinfo-redirectsto-info' => 'தகவலà¯',
+'pageinfo-contentpage' => 'உளà¯à®³à®Ÿà®•à¯à®•à®ªà¯ பகà¯à®•à®®à®¾à®¯à¯à®•à¯ கணகà¯à®•à®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
+'pageinfo-contentpage-yes' => 'ஆமà¯',
+'pageinfo-protect-cascading-yes' => 'ஆமà¯',
+'pageinfo-category-info' => 'பகà¯à®ªà¯à®ªà¯à®•à®³à®¿à®©à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆ',
+'pageinfo-category-pages' => 'பகà¯à®•à®™à¯à®•à®³à®¿à®©à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆ',
+'pageinfo-category-files' => 'கோபà¯à®ªà¯à®•à®³à®¿à®©à¯ எணà¯à®£à®¿à®•à¯à®•à¯ˆ',
# Skin names
'skinname-standard' => 'இயலà¯à®ªà®¾à®©',
@@ -2762,6 +2780,7 @@ $1',
'markedaspatrollederror' => 'ரோநà¯à®¤à®¿à®Ÿà¯à®Ÿà®¤à®¾à®• கà¯à®±à®¿à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯',
'markedaspatrollederrortext' => 'ரோநà¯à®¤à®¿à®Ÿà¯à®Ÿà®¤à®¾à®• கà¯à®±à®¿à®•à¯à®• நீஙà¯à®•à®³à¯ திரà¯à®¤à¯à®¤à®®à¯Šà®©à¯à®±à¯ˆà®•à¯ கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿ வேணà¯à®Ÿà¯à®®à¯.',
'markedaspatrollederror-noautopatrol' => 'உமத௠மாறà¯à®±à®™à¯à®•à®³à¯ˆ நீரே ரோநà¯à®¤à®¿à®Ÿà¯à®Ÿà®¤à®¾à®• கà¯à®±à®¿à®•à¯à®• அனà¯à®®à®¤à®¿ கிடையாதà¯.',
+'markedaspatrollednotify' => '$1 இல௠மேறà¯à®•à¯Šà®³à¯à®³à®ªà¯à®ªà®Ÿà¯à®Ÿ இமà¯à®®à®¾à®±à¯à®±à®®à¯ கணà¯à®•à®¾à®£à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à®¾à®¯à¯à®•à¯ கà¯à®±à®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯.',
# Patrol log
'patrol-log-page' => 'ரோநà¯à®¤à¯à®ªà¯ பதிகை',
@@ -2821,6 +2840,7 @@ $1',
'hours' => '{{PLURAL:$1|$1மணி| $1 மணிகளà¯}}',
'days' => '{{PLURAL:$1|$1நாளà¯|$1 நாடà¯à®•à®³à¯}}',
'ago' => '$1 à®®à¯à®©à¯à®ªà¯',
+'just-now' => 'சடà¯à®¤à®¿à®¯à®¿à®²à¯.',
# Bad image list
'bad_image_list' => 'à®®à¯à®±à¯ˆ பினà¯à®µà®°à¯à®®à®¾à®±à¯:
@@ -3553,7 +3573,7 @@ $5
'logentry-newusers-create' => '$1 ஒர௠பà¯à®¤à®¿à®¯ பயனர௠கணகà¯à®•à¯ˆ உரà¯à®µà®¾à®•à¯à®•à®¿à®¯à¯à®³à¯à®³à®¾à®°à¯.',
'logentry-newusers-create2' => '$3 பயனர௠கணகà¯à®•à®¿à®©à¯ˆ $1 உரà¯à®µà®¾à®•à¯à®•à®¿à®©à®¾à®°à¯',
'logentry-newusers-autocreate' => 'கணகà¯à®•à¯ $1 தானாக உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯',
-'newuserlog-byemail' => 'மினà¯à®©à®žà¯à®šà®²à¯ மூலம௠கடவà¯à®šà¯à®šà¯Šà®²à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®µà®¿à®Ÿà¯à®Ÿà®¤à¯',
+'rightsnone' => '(எதà¯à®µà¯à®®à®¿à®²à¯à®²à¯ˆ)',
# Feedback
'feedback-bugornote' => 'நீஙà¯à®•à®³à¯ ஒர௠தொழிலà¯à®¨à¯à®Ÿà¯à®ªà®•à¯ கோளாற௠கà¯à®±à®¿à®¤à¯à®¤à¯ விரிவாக விளகà¯à®• தாயாராக இரà¯à®¨à¯à®¤à®¾à®²à¯ தயவà¯à®šà¯†à®¯à¯à®¤à¯ [ $1 ஒர௠bug பறà¯à®±à®¿ கூறà¯].
diff --git a/languages/messages/MessagesTcy.php b/languages/messages/MessagesTcy.php
index 88aba0d5..163d3643 100644
--- a/languages/messages/MessagesTcy.php
+++ b/languages/messages/MessagesTcy.php
@@ -154,7 +154,6 @@ $messages = array(
'qbbrowse' => 'ಬà³à²°à³Œà²¸à³',
'qbedit' => 'ಸಂಪಾದನೆ ಮಲà³à²ªà³à²²à³†',
'qbpageoptions' => 'ಈ ಪà³à²Ÿ',
-'qbpageinfo' => 'ಸನà³à²¨à²¿à²µà³‡à²¶',
'qbmyoptions' => 'ಎನà³à²¨ ಪà³à²Ÿà³Šà²²à³',
'qbspecialpages' => 'ವಿಶೇಷ ಪà³à²Ÿà³Šà²²à³',
'faq' => 'ಸಾಮಾನà³à²¯à²µà²¾à²¦à³ ಕೇನà³à²¨ ಪà³à²°à²¶à³à²¨à³†à²²à³',
@@ -359,9 +358,6 @@ $messages = array(
'logouttext' => 'ಈರೠಇತà³à²¤à³† ಲಾಗೠಔಟೠಆತರà³.
ಈರೠ{{SITENAME}} ನೠಅನಾಮಧೇಯರಾತೠಉಪಯೋಗ ಮಲà³à²ªà³Šà²²à²¿,ಅಥವಾ ಕೂಡ ಉಂದà³à²µà³‡ ಪà³à²¦à²°à³â€˜à²¡à³ ಯಾ ಬೇತೆ ಪà³à²¦à²°à³â€˜à²¡à³ ಉಪಯೋಗ ಮಲà³à²ªà³Šà²²à²¿.
ಗಮನಿಸಾಲೆ: ಈರೆನ ಬà³à²°à³Œà²¸à²°à³â€˜à²¡à³ ಮಾಜà³à²¨à²¾à²¡à³† ಮà³à²Ÿà³à²Ÿ ಕೆಲವೠಪà³à²Ÿà²•à³â€˜à²²à³ ಈರೠಇತà³à²¤à³†à²²à²¾ ಲಾಗೠಇನೠಆಯಿಲೆಕà³à²•à²¨à³‡ ತೋಜಾವà³.',
-'welcomecreation' => '== ಸà³à²¸à³à²µà²¾à²—ತೊ, $1! ==
-ಈರೆನೆ ಅಕೌಂಟà³â€˜à²¨à³ ಶà³à²°à³ ಮಲà³à²¤à³â€˜à²‚ಡà³.
-ಈರೆನ [[Special:Preferences|{{SITENAME}} ಪà³à²°à²¾à²¶à²¸à³à²¤à³à²¯à³Šà²²à³†à²¨à³]] ಬದಲಾವಣೆ ಮಲà³à²ªà²°à³† ಮರಪಡೆ',
'yourname' => 'ಸದಸà³à²¯à³†à²°à³à²¨ ಪà³à²¦à²°à³:',
'yourpassword' => 'ಪಾಸà³-ವರà³à²¡à³:',
'yourpasswordagain' => 'ಪಾಸà³à²µà²°à³à²¡à³ ಪಿರ ಟೈಪೠಮಲà³à²ªà³à²²à³†',
@@ -639,6 +635,9 @@ $messages = array(
'right-delete' => 'ಪà³à²Ÿà³Šà²•à³à²²à³†à²¨à³ ಮಾಜಾಲೆ',
'right-undelete' => 'ಪà³à²Ÿà³Šà²¨à³ ಮಾಜಾವಡೆ',
+# Special:Log/newusers
+'newuserlogpage' => 'ಸದಸà³à²¯ ರಚನೆ ಲಾಗà³',
+
# User rights log
'rightslog' => 'ಸದಸà³à²¯à³†à²°à³à²¨ ಹಕà³à²•à³ ದಾಖಲೆ',
@@ -775,9 +774,6 @@ $messages = array(
'allarticles' => 'ಪೂರಾ ಲೇಖನೊಲà³',
'allpagessubmit' => 'ಪೋ',
-# Special:Log/newusers
-'newuserlogpage' => 'ಸದಸà³à²¯ ರಚನೆ ಲಾಗà³',
-
# Special:ListGroupRights
'listgrouprights-members' => '(ಸದಸà³à²¯à³†à²°à³à²¨ ಪಟà³à²Ÿà²¿)',
diff --git a/languages/messages/MessagesTe.php b/languages/messages/MessagesTe.php
index e32449ff..1f2fddd7 100644
--- a/languages/messages/MessagesTe.php
+++ b/languages/messages/MessagesTe.php
@@ -12,6 +12,7 @@
* @author Jprmvnvijay5
* @author Kaganer
* @author Kiranmayee
+ * @author Malkum
* @author Meno25
* @author Mpradeep
* @author Praveen Illa
@@ -287,7 +288,6 @@ $messages = array(
'qbbrowse' => 'విహరించà±',
'qbedit' => 'సవరించà±',
'qbpageoptions' => 'ఈ పేజీ',
-'qbpageinfo' => 'సందరà±à°­à°‚',
'qbmyoptions' => 'నా పేజీలà±',
'qbspecialpages' => 'à°ªà±à°°à°¤à±à°¯à±‡à°• పేజీలà±',
'faq' => 'తరచూ అడిగే à°ªà±à°°à°¶à±à°¨à°²à±',
@@ -542,12 +542,15 @@ $2',
# Login and logout pages
'logouttext' => "'''ఇపà±à°ªà±à°¡à± మీరౠనిషà±à°•à±à°°à°®à°¿à°‚చారà±.'''
-మీరౠ{{SITENAME}}ని à°…à°œà±à°žà°¾à°¤à°‚à°—à°¾ వాడà±à°¤à±‚ండొచà±à°šà±, లేదా ఇదే వాడà±à°•à°°à°¿à°—à°¾ కానీ లేదా వేరే వాడà±à°•à°°à°¿à°—à°¾ కానీ [[Special:UserLogin|మళà±à°³à±€ à°ªà±à°°à°µà±‡à°¶à°¿à°‚చవచà±à°šà±]].
+మీరౠ{{SITENAME}}ని à°…à°œà±à°žà°¾à°¤à°‚à°—à°¾ వాడà±à°¤à±‚ండొచà±à°šà±, లేదా ఇదే వాడà±à°•à°°à°¿à°—à°¾ కానీ లేదా వేరే వాడà±à°•à°°à°¿à°—à°¾ కానీ <span class='plainlinks'>[$1 మళà±à°³à±€ à°ªà±à°°à°µà±‡à°¶à°¿à°‚చవచà±à°šà±]</span>.
అయితే, మీ విహారిణిలోని కోశానà±à°¨à°¿ à°¶à±à°­à±à°°à°ªà°°à°¿à°šà±‡ వరకౠకొనà±à°¨à°¿ పేజీలౠమీరింకా à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°¿ ఉనà±à°¨à°Ÿà±à°²à±à°—ానే చూపించవచà±à°šà°¨à°¿ గమనించండి.",
-'welcomecreation' => '== à°¸à±à°µà°¾à°—తం, $1! ==
-
-మీ ఖాతాని సృషà±à°Ÿà°¿à°‚చాం.
-మీ [[Special:Preferences|{{SITENAME}} à°…à°­à°¿à°°à±à°šà±à°²à°¨à±]] మారà±à°šà±à°•à±‹à°µà°¡à°‚ మరà±à°µà°•à°‚à°¡à°¿.',
+'welcomeuser' => 'à°¸à±à°µà°¾à°—తం, $1!',
+'welcomecreation-msg' => 'మీ ఖాతాని సృషà±à°Ÿà°¿à°‚చాం.
+మీ [[Special:Preferences|{{SITENAME}} à°…à°­à°¿à°°à±à°šà±à°²à°¨à±]] మారà±à°šà±à°•à±‹à°µà°¡à°‚ మరà±à°µà°•à°‚à°¡à°¿.
+తెలà±à°—ౠవికీపీడియాలో తెలà±à°—à±à°²à±‹à°¨à±‡ రాయాలి. వికీలో రచనలౠచేసే à°®à±à°‚à°¦à±, కింది సూచనలనౠగమనించండి.
+తెలà±à°—à± {{SITENAME}}లో తెలà±à°—à±à°²à±‹à°¨à±‡ రాయాలి. వికీలో రచనలౠచేసే à°®à±à°‚à°¦à±, కింది సూచనలనౠగమనించండి.
+*వికీని à°¤à±à°µà°°à°—à°¾ à°…à°°à±à°¥à°‚ చేసà±à°•à±à°¨à±‡à°‚à°¦à±à°•à± [[వికీపీడియా:5 నిమిషాలà±à°²à±‹ వికీ|5 నిమిషాలà±à°²à±‹ వికీ]] పేజీని చూడండి.
+*తెలà±à°—à±à°²à±‹ రాసేందà±à°•à± ఇంగà±à°²à±€à°·à± à°…à°•à±à°·à°°à°¾à°² ఉచà±à°›à°¾à°°à°£à°¤à±‹ తెలà±à°—ౠటైపౠచేసే [[వికీపీడియా:టైపింగౠసహాయం| టైపింగౠసహాయం]] వాడవచà±à°šà±. మరినà±à°¨à°¿ ఉపకరణాల కొరకౠ[[à°•à±€ బోరà±à°¡à±]] మరియౠతెరపై తెలà±à°—ౠసరిగా లేకపోతే[[వికీపీడియా:Setting up your browser for Indic scripts|à°ˆ పేజీ]] చూడండి.',
'yourname' => 'వాడà±à°•à°°à°¿ పేరà±:',
'yourpassword' => 'సంకేతపదం:',
'yourpasswordagain' => 'సంకేతపదానà±à°¨à°¿ మళà±à°³à±€ ఇవà±à°µà°‚à°¡à°¿:',
@@ -698,6 +701,7 @@ $2
'changeemail-oldemail' => 'à°ªà±à°°à°¸à±à°¤à±à°¤ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾:',
'changeemail-newemail' => 'కొతà±à°¤ à°ˆ-మెయిలౠచిరà±à°¨à°¾à°®à°¾:',
'changeemail-none' => '(à°à°®à±€à°²à±‡à°¦à±)',
+'changeemail-password' => 'మీ {{SITENAME}} సంకేతపదం:',
'changeemail-submit' => 'à°ˆ-మెయిలౠమారà±à°šà±',
'changeemail-cancel' => 'à°°à°¦à±à°¦à±à°šà±‡à°¯à°¿',
@@ -859,7 +863,6 @@ $2
'template-protected' => '(సంరకà±à°·à°¿à°¤à°‚)',
'template-semiprotected' => '(సెమీ-à°°à°•à±à°·à°£à°²à±‹ ఉంది)',
'hiddencategories' => 'à°ˆ పేజీ {{PLURAL:$1|à°’à°• దాచిన వరà±à°—ంలో|$1 దాచిన వరà±à°—ాలà±à°²à±‹}} ఉంది:',
-'nocreatetitle' => 'పేజీని సృషà±à°Ÿà°¿à°‚చడానà±à°¨à°¿ నియంతà±à°°à°¿à°‚చాం.',
'nocreatetext' => '{{SITENAME}}లో కొతà±à°¤ పేజీలౠసృషà±à°Ÿà°¿à°‚చడానà±à°¨à°¿ నియంతà±à°°à°¿à°‚చారà±.
మీరౠవెనకà±à°•à°¿ వెళà±à°³à°¿ వేరే పేజీలౠమారà±à°šà°µà°šà±à°šà±, లేదా [[Special:UserLogin|లోనికి à°ªà±à°°à°µà±‡à°¶à°¿à°‚à°šà°‚à°¡à°¿ లేదా ఖాతా సృషà±à°Ÿà°¿à°‚à°šà±à°•à±‹à°‚à°¡à°¿]].',
'nocreate-loggedin' => 'కొతà±à°¤ పేజీలనౠసృషà±à°Ÿà°¿à°‚చేందà±à°•à± మీకౠఅనà±à°®à°¤à°¿ లేదà±.',
@@ -884,6 +887,13 @@ $2
'edit-already-exists' => 'కొతà±à°¤ పేజీని సృషà±à°Ÿà°¿à°‚చలేమà±.
అది ఇపà±à°ªà°Ÿà°¿à°•à±‡ ఉంది.',
'defaultmessagetext' => 'à°…à°ªà±à°°à°®à±‡à°¯ సందేశపౠపాఠà±à°¯à°‚',
+'invalid-content-data' => 'తపà±à°ªà±à°¡à± విషయం',
+
+# Content models
+'content-model-wikitext' => 'వికీపాఠà±à°¯à°‚',
+'content-model-text' => 'సాదా పాఠà±à°¯à°‚',
+'content-model-javascript' => 'జావాసà±à°•à±à°°à°¿à°ªà±à°Ÿà±',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'హెచà±à°šà°°à°¿à°•: à°ˆ పేజీలో ఖరీదైన పారà±à°¸à°°à± పిలà±à°ªà±à°²à± చాలా ఉనà±à°¨à°¾à°¯à°¿.
@@ -1233,7 +1243,7 @@ $1",
'prefs-emailconfirm-label' => 'à°ˆ-మెయిలౠనిరà±à°§à°¾à°°à°£:',
'prefs-textboxsize' => 'దిదà±à°¦à±à°¬à°¾à°Ÿà± à°•à°¿à°Ÿà°¿à°•à±€ పరిమాణం',
'youremail' => 'మీ à°ˆ-మెయిలà±*',
-'username' => 'వాడà±à°•à°°à°¿ పేరà±:',
+'username' => '{{GENDER:$1|వాడà±à°•à°°à°¿ పేరà±}}:',
'uid' => 'వాడà±à°•à°°à°¿ ID:',
'prefs-memberingroups' => 'సభà±à°¯à±à°²à±à°—à°¾ ఉనà±à°¨ {{PLURAL:$1|à°—à±à°‚à°ªà±|à°—à±à°‚à°ªà±à°²à±}}:',
'prefs-registration' => 'నమోదైన సమయం:',
@@ -1383,11 +1393,13 @@ $1",
'right-sendemail' => 'ఇతర వాడà±à°•à°°à±à°²à°•à± à°ˆ-మెయిలౠపంపించగలగడం',
'right-passwordreset' => 'సంకేతపదానà±à°¨à°¿ à°ªà±à°¨à°°à±à°¦à±à°§à°°à°¿à°‚à°šà°¿à°¨ à°ˆ-మెయిళà±à°³à±',
+# Special:Log/newusers
+'newuserlogpage' => 'కొతà±à°¤ వాడà±à°•à°°à±à°² à°šà°¿à°Ÿà±à°Ÿà°¾',
+'newuserlogpagetext' => 'ఇది వాడà±à°•à°°à°¿ నమోదà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾.',
+
# User rights log
'rightslog' => 'వాడà±à°•à°°à±à°² హకà±à°•à±à°² మారà±à°ªà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾',
'rightslogtext' => 'ఇది వాడà±à°•à°°à±à°² హకà±à°•à±à°²à°•à± జరిగిన మారà±à°ªà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾.',
-'rightslogentry' => '$1 గారి సభà±à°¯à°¤à±à°µ à°—à±à°‚à°ªà±à°¨à± $2 à°¨à±à°‚à°¡à°¿ $3 à°•à°¿ మారà±à°šà°¾à°°à±',
-'rightsnone' => '(à°à°®à±€à°²à±‡à°µà±)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ఈ పేజీని చదవండి',
@@ -1797,6 +1809,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'disambiguationspage' => 'Template:అయోమయ నివృతà±à°¤à°¿',
'disambiguations-text' => "కింది పేజీలౠ'''అయోమయ నివృతà±à°¤à°¿''' పేజీకి లింకవà±à°¤à±à°¨à±à°¨à°¾à°¯à°¿. కానీ అవి సంబంధిత పేజీకి నేరà±à°—à°¾ లింకౠఅవాలి. <br /> [[MediaWiki:Disambiguationspage]] à°¨à±à°‚ది లింకౠఉనà±à°¨ మూసనౠవాడే పేజీని అయోమయ నివృతà±à°¤à°¿ పేజీగా భావిసà±à°¤à°¾à°°à±.",
+'pageswithprop-submit' => 'వెళà±à°³à±',
+
'doubleredirects' => 'జంట దారిమారà±à°ªà±à°²à±',
'doubleredirectstext' => 'ఇతర దారిమారà±à°ªà± à°ªà±à°Ÿà°²à°•à°¿ తీసà±à°•à±†à°³à±à°³à±‡ దారిమారà±à°ªà±à°²à°¨à°¿ à°ˆ à°ªà±à°Ÿ చూపిసà±à°¤à±à°‚ది.
à°ªà±à°°à°¤à±€ వరà±à°¸à°²à±‹ మొదటి మరియౠరెండవ దారిమారà±à°ªà±à°²à°•à± లంకెలà±, ఆలానే రెండవ దారిమారà±à°ªà± à°ªà±à°Ÿ యొకà±à°• లకà±à°·à±à°¯à°‚ ఉనà±à°¨à°¾à°¯à°¿. సాధారణంగా à°ˆ రెండవ దారిమారà±à°ªà± యొకà±à°• లకà±à°·à±à°¯à°®à±‡ "అసలైనది", అదే మొదటి దారిమారà±à°ªà± యొకà±à°• లకà±à°·à±à°¯à°‚à°—à°¾ ఉండాలి.
@@ -1960,10 +1974,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'activeusers-hidesysops' => 'నిరà±à°µà°¾à°¹à°•à±à°²à°¨à± దాచà±',
'activeusers-noresult' => 'వాడà±à°•à°°à±à°²à±†à°µà°°à±‚ లేరà±.',
-# Special:Log/newusers
-'newuserlogpage' => 'కొతà±à°¤ వాడà±à°•à°°à±à°² à°šà°¿à°Ÿà±à°Ÿà°¾',
-'newuserlogpagetext' => 'ఇది వాడà±à°•à°°à°¿ నమోదà±à°² à°šà°¿à°Ÿà±à°Ÿà°¾.',
-
# Special:ListGroupRights
'listgrouprights' => 'వాడà±à°•à°°à°¿ à°—à±à°‚à°ªà±à°² హకà±à°•à±à°²à±',
'listgrouprights-summary' => 'కింది జాబితాలో à°ˆ వికీలో నిరà±à°µà°šà°¿à°‚à°šà°¿à°¨ వాడà±à°•à°°à°¿ à°—à±à°‚à°ªà±à°²à±, వాటికి సంబంధించిన హకà±à°•à±à°²à± ఉనà±à°¨à°¾à°¯à°¿.
@@ -2055,11 +2065,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
'enotif_mailer' => '{{SITENAME}} à°ªà±à°°à°•à°Ÿà°¨ మెయిలౠపంపà±à°¨à°¦à°¿',
'enotif_reset' => 'à°…à°¨à±à°¨à°¿ పేజీలనౠచూసినటà±à°²à±à°—à°¾ à°—à±à°°à±à°¤à°¿à°‚à°šà±',
-'enotif_newpagetext' => 'ఇది à°’à°• కొతà±à°¤ పేజీ.',
'enotif_impersonal_salutation' => '{{SITENAME}} వాడà±à°•à°°à°¿',
-'changed' => 'మారà±à°šà°¾à°°à±',
-'created' => 'సృషà±à°Ÿà°¿à°‚చారà±',
-'enotif_subject' => '{{SITENAME}}లో $PAGETITLE అనే పేజీని $PAGEEDITOR $CHANGEDORCREATED',
'enotif_lastvisited' => 'మీ à°—à°¤ సందరà±à°¶à°¨ తరà±à°µà°¾à°¤ జరిగిన మారà±à°ªà±à°² కొరకౠ$1 చూడండి.',
'enotif_lastdiff' => 'à°ˆ మారà±à°ªà± చూసేందà±à°•à± $1 కౠవెళà±à°³à°‚à°¡à°¿.',
'enotif_anon_editor' => 'à°…à°œà±à°žà°¾à°¤ వాడà±à°•à°°à°¿ $1',
@@ -2089,6 +2095,8 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
మీ à°…à°­à°¿à°ªà±à°°à°¾à°¯à°¾à°²à± చెపà±à°ªà±‡à°‚à°¦à±à°•à± మరియౠమరింత సహాయానికై:
{{canonicalurl:{{MediaWiki:helppage}}}}',
+'created' => 'సృషà±à°Ÿà°¿à°‚చారà±',
+'changed' => 'మారà±à°šà°¾à°°à±',
# Delete
'deletepage' => 'పేజీని తొలగించà±',
@@ -2260,7 +2268,7 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
'blanknamespace' => '(మొదటి)',
# Contributions
-'contributions' => 'వాడà±à°•à°°à°¿ రచనలà±',
+'contributions' => '{{GENDER:$1|వాడà±à°•à°°à°¿}} రచనలà±',
'contributions-title' => '$1 యొకà±à°• మారà±à°ªà±à°²à±-చేరà±à°ªà±à°²à±',
'mycontris' => 'మారà±à°ªà±à°²à± చేరà±à°ªà±à°²à±',
'contribsub2' => '$1 ($2) కొరకà±',
@@ -2742,6 +2750,11 @@ $UNWATCHURL à°•à°¿ వెళà±à°³à°‚à°¡à°¿.
'pageinfo-views' => 'వీకà±à°·à°£à°² సంఖà±à°¯',
'pageinfo-watchers' => 'పేజీ వీకà±à°·à°•à±à°² సంఖà±à°¯',
'pageinfo-edits' => 'మొతà±à°¤à°‚ మారà±à°ªà±à°² సంఖà±à°¯',
+'pageinfo-toolboxlink' => 'పేజీ సమాచారం',
+'pageinfo-contentpage-yes' => 'à°…à°µà±à°¨à±',
+'pageinfo-protect-cascading-yes' => 'à°…à°µà±à°¨à±',
+'pageinfo-category-info' => 'వరà±à°—పౠసమాచారం',
+'pageinfo-category-pages' => 'పేజీల సంఖà±à°¯',
# Skin names
'skinname-standard' => 'సంపà±à°°à°¦à°¾à°¯',
@@ -2825,7 +2838,10 @@ $1',
'minutes' => '{{PLURAL:$1|ఒక నిమిషం|$1 నిమిషాల}}',
'hours' => '{{PLURAL:$1|à°’à°• à°—à°‚à°Ÿ|$1 à°—à°‚à°Ÿà°²}}',
'days' => '{{PLURAL:$1|à°’à°• రోజà±|$1 రోజà±à°²}}',
+'months' => '{{PLURAL:$1|ఒక నెల|$1 నెలల}}',
+'years' => '{{PLURAL:$1|à°’à°• సంవతà±à°¸à°°à°‚|$1 సంవతà±à°¸à°°à°¾à°²}}',
'ago' => '$1 à°•à±à°°à°¿à°¤à°‚',
+'just-now' => 'ఇపà±à°ªà±à°¡à±‡',
# Bad image list
'bad_image_list' => 'à°•à°¿à°‚à°¦ తెలిపిన తీరà±à°²à±‹ కలపాలి:
@@ -3514,7 +3530,7 @@ $5
'logentry-newusers-create' => '$1 à°’à°• వాడà±à°•à°°à°¿ ఖాతానౠసృషà±à°Ÿà°¿à°‚చారà±',
'logentry-newusers-create2' => '$1 వాడà±à°•à°°à°¿ ఖాతా $3నౠసృషà±à°Ÿà°¿à°‚చారà±',
'logentry-newusers-autocreate' => '$1 ఖాతానౠఆటోమెటిగà±à°—à°¾ సృషà±à°Ÿà°¿à°‚చారà±',
-'newuserlog-byemail' => 'à°ˆ-మెయిలà±à°²à±‹ సంకేతపదం పంపించాం',
+'rightsnone' => '(à°à°®à±€à°²à±‡à°µà±)',
# Feedback
'feedback-subject' => 'విషయం:',
diff --git a/languages/messages/MessagesTet.php b/languages/messages/MessagesTet.php
index 6d457bad..d80986aa 100644
--- a/languages/messages/MessagesTet.php
+++ b/languages/messages/MessagesTet.php
@@ -301,9 +301,6 @@ Lista ida pájina espesiál nian [[Special:SpecialPages|iha ne'e]].",
'ns-specialprotected' => 'La ema ida bele edita pájina espesiál sira.',
# Login and logout pages
-'welcomecreation' => "== Loron di'ak, $1! ==
-Agora Ita iha konta iha ne'e.
-La haluha muda Ita-nia [[Special:Preferences|preferénsia]].",
'yourname' => "Naran uza-na'in:",
'login' => 'Log in',
'nav-login-createaccount' => 'Log in / kriar konta ida',
@@ -491,11 +488,13 @@ Ita-nia mudansa la armazenadu seidauk!",
'right-userrights' => "Edita priviléjiu uza-na'in hotu",
'right-userrights-interwiki' => "Edita priviléjiu uza-na'in iha wiki seluk sira",
+# Special:Log/newusers
+'newuserlogpage' => "Lista kria uza-na'in",
+'newuserlogpagetext' => "Ne'e lista kria uza-na'in.",
+
# User rights log
'rightslog' => "Lista mudansa priviléjiu uza-na'in",
'rightslogtext' => "Ne'e lista mudansa priviléjiu uza-na'in sira nian.",
-'rightslogentry' => 'muda grupu "$1" nian husi "$2" ba "$3"',
-'rightsnone' => '(mamuk)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => "lee pájina ne'e",
@@ -637,10 +636,6 @@ Ita-nia mudansa la armazenadu seidauk!",
'activeusers-hidebots' => 'Subar bot sira',
'activeusers-hidesysops' => 'Subar administradór sira',
-# Special:Log/newusers
-'newuserlogpage' => "Lista kria uza-na'in",
-'newuserlogpagetext' => "Ne'e lista kria uza-na'in.",
-
# Special:ListGroupRights
'listgrouprights-group' => 'Grupu',
'listgrouprights-rights' => 'Priviléjiu',
@@ -667,11 +662,9 @@ Ita-nia mudansa la armazenadu seidauk!",
'watching' => 'Hateke...',
'unwatching' => 'La hateke...',
-'enotif_newpagetext' => "Ne'e pájina foun.",
'enotif_impersonal_salutation' => "Uza-na'in {{SITENAME}} nian",
-'changed' => 'muda ona',
'created' => 'kria ona',
-'enotif_subject' => '$PAGEEDITOR $CHANGEDORCREATED pájina $PAGETITLE iha {{SITENAME}}',
+'changed' => 'muda ona',
# Delete
'deletepage' => 'Halakon pájina',
@@ -727,7 +720,7 @@ Ita-nia mudansa la armazenadu seidauk!",
'blanknamespace' => '(Prinsipál)',
# Contributions
-'contributions' => "Kontribuisaun uza-na'in",
+'contributions' => "{{GENDER:$1|Kontribuisaun uza-na'in}}",
'contributions-title' => 'Kontribuisaun "$1" nian',
'mycontris' => 'Kontribuisaun',
'contribsub2' => 'Ba $1 ($2)',
@@ -998,4 +991,7 @@ Ligasaun seluk iha liña - ne'e pájina sira iha ne'ebé bele inklui imajen aat.
# Database error messages
'dberr-header' => "Wiki ne'e iha problema",
+# New logging system
+'rightsnone' => '(mamuk)',
+
);
diff --git a/languages/messages/MessagesTg_cyrl.php b/languages/messages/MessagesTg_cyrl.php
index 114f2f6e..9a9c71fb 100644
--- a/languages/messages/MessagesTg_cyrl.php
+++ b/languages/messages/MessagesTg_cyrl.php
@@ -214,7 +214,6 @@ $messages = array(
'qbbrowse' => 'Мурур',
'qbedit' => 'Вироиш',
'qbpageoptions' => 'Ин Ñаҳифа',
-'qbpageinfo' => 'Бофт',
'qbmyoptions' => 'Саҳифаҳои ман',
'qbspecialpages' => 'Саҳифаҳои вижа',
'faq' => 'Саволҳои тез-тез пурÑидашуда',
@@ -445,12 +444,8 @@ $1',
# Login and logout pages
'logouttext' => "'''Ðкнун аз ÑиÑтем хориҷ шудаед.'''
-Шумо метавонед гумном аз {{SITENAME}} иÑтифодабариро идома диҳед, Ñ‘ метавонед бо ҳамин номи корбариатон ва Ñ‘ номи корбарии дигаре [[Special:UserLogin|боз вуруд кунед]].
+Шумо метавонед гумном аз {{SITENAME}} иÑтифодабариро идома диҳед, Ñ‘ метавонед бо ҳамин номи корбариатон ва Ñ‘ номи корбарии дигаре <span class='plainlinks'>[$1 боз вуруд кунед]</span>.
Тавваҷӯҳ кунед, ки баъзе аз Ñаҳифаҳо қаблан чи тавре намоиш шуда будан ҳамин тавр намоиш дода мешаванд, то даме ки шумо ҳофизаи мурургаратонро пок кунед.",
-'welcomecreation' => '== Хуш омадед, $1! ==
-
-ҲиÑоби шумо Ñҷод шуд.
-Танзим кардани [[Special:Preferences|тарҷиҳоти {{SITENAME}}]] худро фаромӯш накунед.',
'yourname' => 'Ðоми корбар',
'yourpassword' => 'Калимаи убур\\пароль',
'yourpasswordagain' => 'Калимаи убурро боз навиÑед',
@@ -682,7 +677,6 @@ $1',
'template-protected' => '(ҳифзшуда)',
'template-semiprotected' => '(нима-муҳофизатшуда)',
'hiddencategories' => 'Ин Ñаҳифа дар {{PLURAL:$1|1 гурӯҳи пинҳон|$1 гурӯҳҳои пинҳон}} қарор дорад:',
-'nocreatetitle' => 'Эҷоди Ñаҳифа маҳдуд шудааÑÑ‚',
'nocreatetext' => '{{SITENAME}} қобилиÑти Ñҷоди Ñаҳифаҳои ҷадидро маҳдуд карда аÑÑ‚.
Шумо метавонед бозгашта Ñаҳифаи мавҷудбударо вироиш кунед, Ñ‘ [[Special:UserLogin|ба ÑиÑтем вуруд кунед Ñ‘ ҳиÑоби корбарӣ Ñҷод кунед]].',
'nocreate-loggedin' => 'Шумо иҷозати Ñҷоди Ñаҳифаи ҷадидро надоред.',
@@ -1029,11 +1023,13 @@ $1',
'right-userrights-interwiki' => 'Вироиши ихтиёроти корбарии корбарони дигар викиҳо',
'right-siteadmin' => 'БаÑтн ва боз кардани пойгоҳи дода',
+# Special:Log/newusers
+'newuserlogpage' => 'Гузориши Ñҷоди корбар',
+'newuserlogpagetext' => 'Ин гузориш аз номҳои корбарии тозаÑохташуда аÑÑ‚.',
+
# User rights log
'rightslog' => 'Гузориши ихтиёроти корбар',
'rightslogtext' => 'Ин гузориш тағйироти ихтиёроти корбар аÑÑ‚.',
-'rightslogentry' => 'узвиÑти $1 аз гурӯҳ $2 ба $3 тағйир дода шуд',
-'rightsnone' => '(ҳеҷ)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'вироиши ин Ñаҳифа',
@@ -1406,10 +1402,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'Ðишон додани',
'listusers-noresult' => 'Ҳеҷ корбаре ёфт нашуд.',
-# Special:Log/newusers
-'newuserlogpage' => 'Гузориши Ñҷоди корбар',
-'newuserlogpagetext' => 'Ин гузориш аз номҳои корбарии тозаÑохташуда аÑÑ‚.',
-
# Special:ListGroupRights
'listgrouprights' => 'Ихтиёроти гурӯҳҳои корбарӣ',
'listgrouprights-group' => 'Гурӯҳ',
@@ -1476,11 +1468,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
'enotif_mailer' => '{{SITENAME}} ИттилораÑонӣ почтаи Ñлектронӣ',
'enotif_reset' => 'ÐломатраÑони ҳамаи Ñаҳифаҳо ба унвони боздидшуда',
-'enotif_newpagetext' => 'Ин Ñаҳифаи нав аÑÑ‚',
'enotif_impersonal_salutation' => 'Корбари {{SITENAME}}',
-'changed' => 'тағйирёфта',
-'created' => 'Ñҷод шуд',
-'enotif_subject' => 'Саҳифаи {{SITENAME}} $PAGETITLE аз тарафи $PAGEEDITOR $CHANGEDORCREATED шуд',
'enotif_lastvisited' => 'Барои дидани ҳамаи тағйирот аз охирин боре, ки Ñар задаед $1ро бубинед.',
'enotif_lastdiff' => 'Барои намоиши ин тағйир $1ро бубинед.',
'enotif_anon_editor' => 'корбари Ð½Ð¾ÑˆÐ¸Ð½Ð¾Ñ $1',
@@ -1507,6 +1495,8 @@ $NEWPAGE
Пешниҳодот ва кӯмаки бештар:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'Ñҷод шуд',
+'changed' => 'тағйирёфта',
# Delete
'deletepage' => 'Ҳазфи Ñаҳифа',
@@ -1650,7 +1640,7 @@ $1',
'blanknamespace' => '(ÐÑлӣ)',
# Contributions
-'contributions' => 'ҲиÑÑагузории корбар',
+'contributions' => 'ҲиÑÑагузориҳои {{GENDER:$1|корбар}}',
'contributions-title' => 'ҲиÑÑагузориҳои корбар барои $1',
'mycontris' => 'ҲиÑÑагузориҳо',
'contribsub2' => 'Барои $1 ($2)',
@@ -2573,6 +2563,6 @@ $5
# New logging system
'revdelete-restricted' => 'маҳдудиÑтҳо ба мудирон амалӣ шуданд',
'revdelete-unrestricted' => 'маҳдудиÑтҳо аз мудирон бардошта шуданд',
-'newuserlog-byemail' => 'калимаи убур ба почтаи Ñлектронӣ фириÑтода шуд',
+'rightsnone' => '(ҳеҷ)',
);
diff --git a/languages/messages/MessagesTg_latn.php b/languages/messages/MessagesTg_latn.php
index aba099c4..61887afa 100644
--- a/languages/messages/MessagesTg_latn.php
+++ b/languages/messages/MessagesTg_latn.php
@@ -155,7 +155,6 @@ $messages = array(
'qbbrowse' => 'Murur',
'qbedit' => 'ViroiÅŸ',
'qbpageoptions' => 'In sahifa',
-'qbpageinfo' => 'Boft',
'qbmyoptions' => 'Sahifahoi man',
'qbspecialpages' => 'Sahifahoi viƶa',
'faq' => 'Savolhoi tez-tez pursidaÅŸuda',
@@ -379,12 +378,8 @@ Daleli zikrÅŸuda az in qaror ast ''$2''.",
# Login and logout pages
'logouttext' => "'''Aknun az sistem xoriç şudaed.'''
-Åžumo metavoned gumnom az {{SITENAME}} istifodabariro idoma dihed, jo metavoned bo hamin nomi korbariaton va jo nomi korbariji digare [[Special:UserLogin|boz vurud kuned]].
+Åžumo metavoned gumnom az {{SITENAME}} istifodabariro idoma dihed, jo metavoned bo hamin nomi korbariaton va jo nomi korbariji digare <span class='plainlinks'>[$1 boz vurud kuned]</span>.
Tavvaçūh kuned, ki ba'ze az sahifaho qablan ci tavre namoiş şuda budan hamin tavr namoiş doda meşavand, to dame ki şumo hofizai mururgaratonro pok kuned.",
-'welcomecreation' => '== XuÅŸ omaded, $1! ==
-
-Hisobi şumo eçod şud.
-Tanzim kardani [[Special:Preferences|tarçihoti {{SITENAME}}]] xudro faromūş nakuned.',
'yourname' => 'Nomi korbar',
'yourpassword' => 'Kalimai ubur\\parolь',
'yourpasswordagain' => 'Kalimai uburro boz navised',
@@ -573,7 +568,6 @@ Hamin tavr ÅŸumo qavl medihed, ki xudatonro inro naviÅŸtaed jo onro az jak manba
'template-protected' => '(hifzÅŸuda)',
'template-semiprotected' => '(nima-muhofizatÅŸuda)',
'hiddencategories' => 'In sahifa dar {{PLURAL:$1|1 gurūhi pinhon|$1 gurūhhoi pinhon}} qaror dorad:',
-'nocreatetitle' => 'Eçodi sahifa mahdud şudaast',
'nocreatetext' => '{{SITENAME}} qobilijati eçodi sahifahoi çadidro mahdud karda ast.
Şumo metavoned bozgaşta sahifai mavçudbudaro viroiş kuned, jo [[Special:UserLogin|ba sistem vurud kuned jo hisobi korbarī eçod kuned]].',
'nocreate-loggedin' => 'Şumo içozati eçodi sahifai çadidro nadored.',
@@ -893,11 +887,13 @@ On bojad kamtar az $1 {{PLURAL:$1|alomat|alomatho}} boÅŸad.',
'right-userrights-interwiki' => 'ViroiÅŸi ixtijoroti korbariji korbaroni digar vikiho',
'right-siteadmin' => 'Bastn va boz kardani pojgohi doda',
+# Special:Log/newusers
+'newuserlogpage' => 'Guzorişi eçodi korbar',
+'newuserlogpagetext' => 'In guzoriÅŸ az nomhoi korbariji tozasoxtaÅŸuda ast.',
+
# User rights log
'rightslog' => 'GuzoriÅŸi ixtijoroti korbar',
'rightslogtext' => 'In guzoriş taƣjiroti ixtijoroti korbar ast.',
-'rightslogentry' => 'uzvijati $1 az gurūh $2 ba $3 taƣjir doda şud',
-'rightsnone' => '(heç)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'viroiÅŸi in sahifa',
@@ -1233,10 +1229,6 @@ Jak klik kardani rūi unvoni sutunho boisi taƣjiri tartibi namoişi parvandaho
'listusers-submit' => 'NiÅŸon dodani',
'listusers-noresult' => 'Heç korbare joft naşud.',
-# Special:Log/newusers
-'newuserlogpage' => 'Guzorişi eçodi korbar',
-'newuserlogpagetext' => 'In guzoriÅŸ az nomhoi korbariji tozasoxtaÅŸuda ast.',
-
# Special:ListGroupRights
'listgrouprights' => 'Ixtijoroti gurūhhoi korbarī',
'listgrouprights-group' => 'Gurūh',
@@ -1299,14 +1291,12 @@ Agar ÅŸumo dertar az fehristi nazarotaton in sahifaro hazv kardan xohed, dar men
'enotif_mailer' => '{{SITENAME}} Ittilorasonī poctai elektronī',
'enotif_reset' => 'Alomatrasoni hamai sahifaho ba unvoni bozdidÅŸuda',
-'enotif_newpagetext' => 'In sahifai nav ast',
'enotif_impersonal_salutation' => 'Korbari {{SITENAME}}',
-'changed' => 'taƣjirjofta',
-'created' => 'eçod şud',
-'enotif_subject' => 'Sahifai {{SITENAME}} $PAGETITLE az tarafi $PAGEEDITOR $CHANGEDORCREATED ÅŸud',
'enotif_lastvisited' => 'Baroi didani hamai taƣjirot az oxirin bore, ki sar zadaed $1ro bubined.',
'enotif_lastdiff' => 'Baroi namoişi in taƣjir $1ro bubined.',
'enotif_anon_editor' => 'korbari noÅŸinos $1',
+'created' => 'eçod şud',
+'changed' => 'taƣjirjofta',
# Delete
'deletepage' => 'Hazfi sahifa',
@@ -2345,6 +2335,6 @@ NiÅŸonai pajvandro biduni peÅŸvand "{{ns:file}}:" vorid kuned.',
# New logging system
'revdelete-restricted' => 'mahdudijatho ba mudiron amalī şudand',
'revdelete-unrestricted' => 'mahdudijatho az mudiron bardoÅŸta ÅŸudand',
-'newuserlog-byemail' => 'kalimai ubur ba poctai elektronī firistoda şud',
+'rightsnone' => '(heç)',
);
diff --git a/languages/messages/MessagesTh.php b/languages/messages/MessagesTh.php
index 0573f57f..8ba0897e 100644
--- a/languages/messages/MessagesTh.php
+++ b/languages/messages/MessagesTh.php
@@ -52,16 +52,20 @@ $namespaceAliases = array(
);
$specialPageAliases = array(
+ 'Activeusers' => array( 'ผู้ใช้ที่มีความเคลื่อนไหว' ),
'Allmessages' => array( 'ข้อความทั้งหมด' ),
'Allpages' => array( 'หน้าทั้งหมด' ),
'Ancientpages' => array( 'บทความที่ไม่ได้à¹à¸à¹‰à¹„ขนานที่สุด' ),
+ 'Badtitle' => array( 'ชื่อเรื่องไม่เหมาะสม' ),
'Blankpage' => array( 'หน้าว่าง' ),
'Block' => array( 'บล็อà¸à¹„อพี' ),
'Blockme' => array( 'บล็อà¸à¸‰à¸±à¸™' ),
'Booksources' => array( 'à¹à¸«à¸¥à¹ˆà¸‡à¸«à¸™à¸±à¸‡à¸ªà¸·à¸­' ),
'BrokenRedirects' => array( 'เปลี่ยนทางเสีย' ),
'Categories' => array( 'หมวดหมู่' ),
- 'ChangePassword' => array( 'ตั้งรหัสผ่านใหม่' ),
+ 'ChangeEmail' => array( 'เปลี่ยนอีเมล' ),
+ 'ChangePassword' => array( 'เปลี่ยนรหัสผ่าน' ),
+ 'ComparePages' => array( 'เปรียบเทียบหน้า' ),
'Confirmemail' => array( 'ยืนยันอีเมล' ),
'Contributions' => array( 'เรื่องที่เขียน' ),
'CreateAccount' => array( 'สร้างบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¹ƒà¸«à¸¡à¹ˆ' ),
@@ -69,6 +73,7 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'à¸à¸²à¸£à¹à¸à¹‰à¹„ขที่ถูà¸à¸¥à¸š' ),
'Disambiguations' => array( 'à¹à¸à¹‰à¸„วามà¸à¸³à¸à¸§à¸¡' ),
'DoubleRedirects' => array( 'เปลี่ยนทางซ้ำซ้อน' ),
+ 'EditWatchlist' => array( 'à¹à¸à¹‰à¹„ขรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู' ),
'Emailuser' => array( 'อีเมลผู้ใช้' ),
'Export' => array( 'ส่งออà¸' ),
'Fewestrevisions' => array( 'บทความที่ถูà¸à¹à¸à¹‰à¹„ขน้อยที่สุด' ),
@@ -76,6 +81,7 @@ $specialPageAliases = array(
'Filepath' => array( 'พาธของไฟล์', 'ตำà¹à¸«à¸™à¹ˆà¸‡à¹„ฟล์' ),
'Import' => array( 'นำเข้า' ),
'Invalidateemail' => array( 'ยà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸—างอีเมล' ),
+ 'JavaScriptTest' => array( 'ทดสอบจาวาสคริปต์' ),
'BlockList' => array( 'รายชื่อผู้ใช้ที่ถูà¸à¸šà¸¥à¹‡à¸­à¸', 'รายà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸', 'รายชื่อไอพีที่ถูà¸à¸šà¸¥à¹‡à¸­à¸' ),
'LinkSearch' => array( 'ค้นหาเว็บลิงà¸à¹Œ' ),
'Listadmins' => array( 'รายชื่อผู้ดูà¹à¸¥' ),
@@ -100,8 +106,11 @@ $specialPageAliases = array(
'Mycontributions' => array( 'เรื่องที่ฉันเขียน' ),
'Mypage' => array( 'หน้าของฉัน' ),
'Mytalk' => array( 'หน้าพูดคุยของฉัน' ),
+ 'Myuploads' => array( 'ไฟล์ที่อัปโหลดของฉัน' ),
'Newimages' => array( 'ภาพใหม่' ),
'Newpages' => array( 'หน้าใหม่' ),
+ 'PasswordReset' => array( 'ตั้งรหัสผ่านใหม่' ),
+ 'PermanentLink' => array( 'ลิงà¸à¹Œà¸–าวร' ),
'Popularpages' => array( 'หน้าที่ได้รับความนิยม' ),
'Preferences' => array( 'à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่า', 'ตั้งค่า' ),
'Prefixindex' => array( 'ดัชนีตามคำขึ้นต้น' ),
@@ -111,11 +120,13 @@ $specialPageAliases = array(
'Randomredirect' => array( 'สุ่มหน้าเปลี่ยนทาง' ),
'Recentchanges' => array( 'ปรับปรุงล่าสุด' ),
'Recentchangeslinked' => array( 'à¸à¸²à¸£à¸›à¸£à¸±à¸šà¸›à¸£à¸¸à¸‡à¸—ี่โยงมา' ),
+ 'Revisiondelete' => array( 'ลบรุ่นà¸à¸²à¸£à¹à¸à¹‰à¹„ข' ),
'Search' => array( 'ค้นหา' ),
'Shortpages' => array( 'หน้าที่สั้นที่สุด' ),
'Specialpages' => array( 'หน้าพิเศษ' ),
'Statistics' => array( 'สถิติ' ),
'Tags' => array( 'ป้ายà¸à¸³à¸à¸±à¸š' ),
+ 'Unblock' => array( 'เลิà¸à¸šà¸¥à¹‡à¸­à¸' ),
'Uncategorizedcategories' => array( 'หมวดหมู่ที่ไม่ได้จัดหมวดหมู่' ),
'Uncategorizedimages' => array( 'ภาพที่ไม่ได้จัดหมวดหมู่' ),
'Uncategorizedpages' => array( 'หน้าที่ไม่ได้จัดหมวดหมู่' ),
@@ -130,7 +141,7 @@ $specialPageAliases = array(
'Userlogin' => array( 'ล็อà¸à¸­à¸´à¸™' ),
'Userlogout' => array( 'ล็อà¸à¹€à¸­à¸²à¸•à¹Œ' ),
'Userrights' => array( 'สิทธิผู้ใช้' ),
- 'Version' => array( 'เวอร์ชั่น' ),
+ 'Version' => array( 'เวอร์ชัน', 'เวอร์ชั่น' ),
'Wantedcategories' => array( 'หมวดหมู่ที่ต้องà¸à¸²à¸£' ),
'Wantedfiles' => array( 'ไฟล์ที่ต้องà¸à¸²à¸£' ),
'Wantedpages' => array( 'หน้าที่ต้องà¸à¸²à¸£', 'à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¹‚ยงเสีย' ),
@@ -319,6 +330,7 @@ $messages = array(
'newwindow' => '(เปิดหน้าต่างใหม่)',
'cancel' => 'ยà¸à¹€à¸¥à¸´à¸',
'moredotdotdot' => 'ดูเพิ่ม...',
+'morenotlisted' => 'มีที่ยังไม่à¹à¸ªà¸”งอีà¸...',
'mypage' => 'หน้า',
'mytalk' => 'พูดคุย',
'anontalk' => 'พูดคุยà¸à¸±à¸šà¹€à¸¥à¸‚ที่อยู่ไอพีนี้',
@@ -330,7 +342,6 @@ $messages = array(
'qbbrowse' => 'สืบค้น',
'qbedit' => 'à¹à¸à¹‰à¹„ข',
'qbpageoptions' => 'หน้านี้',
-'qbpageinfo' => 'บริบท',
'qbmyoptions' => 'หน้าของฉัน',
'qbspecialpages' => 'หน้าพิเศษ',
'faq' => 'คำถามถามบ่อย',
@@ -353,6 +364,7 @@ $messages = array(
'namespaces' => 'เนมสเปซ',
'variants' => 'สิ่งที่à¹à¸•à¸à¸•à¹ˆà¸²à¸‡',
+'navigation-heading' => 'รายà¸à¸²à¸£à¹€à¸¥à¸·à¸­à¸à¸›à¹‰à¸²à¸¢à¸šà¸­à¸à¸—าง',
'errorpagetitle' => 'มีข้อผิดพลาด',
'returnto' => 'à¸à¸¥à¸±à¸šà¹„ป $1',
'tagline' => 'จาภ{{SITENAME}}',
@@ -589,14 +601,13 @@ $1',
'virus-unknownscanner' => 'ไม่รู้จัà¸à¹‚ปรà¹à¸à¸£à¸¡à¸›à¹‰à¸­à¸‡à¸à¸±à¸™à¹„วรัสตัวนี้:',
# Login and logout pages
-'logouttext' => "'''ขณะนี้คุณได้ล็อà¸à¹€à¸­à¸²à¸•à¹Œà¸­à¸­à¸à¸ˆà¸²à¸à¸£à¸°à¸šà¸š'''
+'logouttext' => "'''ขณะนี้คุณได้ล็อà¸à¹€à¸­à¸²à¸•à¹Œà¹à¸¥à¹‰à¸§'''
-คุณสามารถใช้งาน {{SITENAME}} ได้ต่อในà¸à¸²à¸™à¸°à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸™à¸´à¸£à¸™à¸²à¸¡ หรือคุณสามารถ[[Special:UserLogin|ล็อà¸à¸­à¸´à¸™à¸à¸¥à¸±à¸šà¹€à¸‚้าไป]]ด้วยชื่อผู้ใช้เดิมหรือชื่อผู้ใช้อื่นๆ
-อย่างไรà¸à¹‡à¸•à¸²à¸¡à¸­à¸²à¸ˆà¸ˆà¸°à¸¡à¸µà¸šà¸²à¸‡à¸«à¸™à¹‰à¸²à¸—ี่ยังà¹à¸ªà¸”งข้อความว่าคุณà¸à¸³à¸¥à¸±à¸‡à¸¥à¹‡à¸­à¸à¸­à¸´à¸™à¸­à¸¢à¸¹à¹ˆ จนà¸à¸§à¹ˆà¸²à¸„ุณจะล้างà¹à¸„ชออà¸à¸ˆà¸²à¸à¹€à¸§à¹‡à¸šà¹€à¸šà¸£à¸²à¸§à¹Œà¹€à¸‹à¸­à¸£à¹Œ",
-'welcomecreation' => '== ยินดีต้อนรับ $1! ==
-
-ชื่อบัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸‚องคุณถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นà¹à¸¥à¹‰à¸§
-อย่าลืมเข้าไป[[Special:Preferences|ตั้งค่าผู้ใช้สำหรับ {{SITENAME}}]]',
+คุณสามารถใช้งาน {{SITENAME}} ต่อในà¸à¸²à¸™à¸°à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸™à¸´à¸£à¸™à¸²à¸¡ หรือคุณสามารถ<span class='plainlinks'>[$1 ล็อà¸à¸­à¸´à¸™à¸à¸¥à¸±à¸šà¹€à¸‚้าไป]</span>ด้วยชื่อผู้ใช้เดิมหรือชื่อผู้ใช้อื่น
+อย่างไรà¸à¹‡à¸•à¸²à¸¡à¸­à¸²à¸ˆà¸¡à¸µà¸šà¸²à¸‡à¸«à¸™à¹‰à¸²à¸—ี่à¹à¸ªà¸”งผลเสมือนว่าคุณà¸à¸³à¸¥à¸±à¸‡à¸¥à¹‡à¸­à¸à¸­à¸´à¸™à¸­à¸¢à¸¹à¹ˆ จนà¸à¸§à¹ˆà¸²à¸„ุณจะล้างà¹à¸„ชเบราว์เซอร์ของคุณ",
+'welcomeuser' => 'ยินดีต้อนรับ $1!',
+'welcomecreation-msg' => 'บัà¸à¸Šà¸µà¸‚องคุณถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นà¹à¸¥à¹‰à¸§
+อย่าลืมเปลี่ยนà¹à¸›à¸¥à¸‡[[Special:Preferences|à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าใน {{SITENAME}}]] ของคุณ',
'yourname' => 'ชื่อผู้ใช้',
'yourpassword' => 'รหัสผ่าน',
'yourpasswordagain' => 'พิมพ์รหัสผ่านอีà¸à¸„รั้ง:',
@@ -619,7 +630,7 @@ $1',
'gotaccount' => "มีบัà¸à¸Šà¸µà¹à¸¥à¹‰à¸§à¹ƒà¸Šà¹ˆà¹„หม '''$1'''",
'gotaccountlink' => 'ล็อà¸à¸­à¸´à¸™',
'userlogin-resetlink' => 'ลืมรายละเอียดล็อà¸à¸­à¸´à¸™à¸‚องคุณหรือ',
-'createaccountmail' => 'ผ่านทางอีเมล',
+'createaccountmail' => 'ใช้รหัสผ่านสุ่มชั่วคราวà¹à¸¥à¸°à¸ªà¹ˆà¸‡à¹„ปยังที่อยู่อีเมลที่ระบุด้านล่าง',
'createaccountreason' => 'เหตุผล:',
'badretype' => 'รหัสผ่านที่ใส่ไม่ตรงà¸à¸±à¸™',
'userexists' => 'ชื่อผู้ใช้ที่à¸à¸£à¸­à¸à¸¡à¸µà¸œà¸¹à¹‰à¸­à¸·à¹ˆà¸™à¹ƒà¸Šà¹‰à¹„ปà¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“าเลือà¸à¸Šà¸·à¹ˆà¸­à¸­à¸·à¹ˆà¸™',
@@ -683,6 +694,7 @@ $1',
# Email sending
'php-mail-error-unknown' => 'เà¸à¸´à¸”ข้อผิดพลาดไม่ทราบสาเหตุในฟังà¸à¹Œà¸Šà¸±à¸™ mail() ของพีเอชพี',
'user-mail-no-addy' => 'พยายามส่งอีเมลโดยไม่มีที่อยู่อีเมล',
+'user-mail-no-body' => 'พยายามส่งอีเมลที่มีเนื้อหาว่างหรือสั้นอย่างไร้เหตุผล',
# Change password dialog
'resetpass' => 'เปลี่ยนรหัสผ่าน',
@@ -729,6 +741,7 @@ $2
รหัสผ่านชั่วคราว: $2',
'passwordreset-emailsent' => 'อีเมลตั้งรหัสผ่านใหม่ถูà¸à¸ªà¹ˆà¸‡à¹„ปà¹à¸¥à¹‰à¸§',
'passwordreset-emailsent-capture' => 'อีเมลตั้งรหัสผ่านใหม่ถูà¸à¸ªà¹ˆà¸‡à¹„ปà¹à¸¥à¹‰à¸§ ซึ่งà¹à¸ªà¸”งด้านล่าง',
+'passwordreset-emailerror-capture' => 'อีเมลà¹à¸ˆà¹‰à¸‡à¹€à¸•à¸·à¸­à¸™à¸–ูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นà¹à¸¥à¹‰à¸§ ซึ่งà¹à¸ªà¸”งข้างล่าง à¹à¸•à¹ˆà¸à¸²à¸£à¸ªà¹ˆà¸‡à¹„ปยังผู้ใช้ล้มเหลว: $1',
# Special:ChangeEmail
'changeemail' => 'เปลี่ยนที่อยู่อีเมล',
@@ -738,6 +751,7 @@ $2
'changeemail-oldemail' => 'ที่อยู่อีเมลปัจจุบัน:',
'changeemail-newemail' => 'ที่อยู่อีเมลใหม่:',
'changeemail-none' => '(ไม่มี)',
+'changeemail-password' => 'รหัสผ่าน {{SITENAME}} ของคุณ:',
'changeemail-submit' => 'เปลี่ยนอีเมล',
'changeemail-cancel' => 'ยà¸à¹€à¸¥à¸´à¸',
@@ -913,7 +927,6 @@ $2
'template-semiprotected' => '(ถูà¸à¸à¸¶à¹ˆà¸‡à¸¥à¹‡à¸­à¸)',
'hiddencategories' => 'หน้านี้มี {{PLURAL:$1|1 หมวดหมู่ที่ซ่อนอยู่|$1 หมวดหมู่ที่ซ่อนอยู่}}:',
'edittools' => '<!-- ข้อความนี้จะà¹à¸ªà¸”งผลใต้ฟอร์มสำหรับà¸à¸²à¸£à¹à¸à¹‰à¹„ขà¹à¸¥à¸°à¸­à¸±à¸›à¹‚หลด -->',
-'nocreatetitle' => 'จำà¸à¸±à¸”à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸«à¸™à¹‰à¸²à¹ƒà¸«à¸¡à¹ˆ',
'nocreatetext' => '{{SITENAME}} จำà¸à¸±à¸”à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸«à¸™à¹‰à¸²à¹ƒà¸«à¸¡à¹ˆ
คุณสามารถย้อนà¸à¸¥à¸±à¸šà¹„ปà¹à¸à¹‰à¹„ขหน้าที่มีอยู่เดิม หรือ[[Special:UserLogin|ล็อà¸à¸­à¸´à¸™à¸«à¸£à¸·à¸­à¸ªà¸£à¹‰à¸²à¸‡à¸šà¸±à¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰]]',
'nocreate-loggedin' => 'คุณไม่ได้รับอนุà¸à¸²à¸•à¹ƒà¸«à¹‰à¸ªà¸£à¹‰à¸²à¸‡à¸«à¸™à¹‰à¸²à¹ƒà¸«à¸¡à¹ˆ',
@@ -938,6 +951,14 @@ $2
'edit-already-exists' => 'ไม่สามารถสร้างหน้าใหม่ได้
เพราะมีหน้านี้à¹à¸¥à¹‰à¸§',
'defaultmessagetext' => 'ข้อความสารโดยปริยาย',
+'invalid-content-data' => 'ข้อมูลเนื้อหาไม่ถูà¸à¸•à¹‰à¸­à¸‡',
+'content-not-allowed-here' => 'เนื้อหา "$1" ไม่อนุà¸à¸²à¸•à¹ƒà¸™à¸«à¸™à¹‰à¸² [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'ข้อความวิà¸à¸´',
+'content-model-text' => 'ข้อความธรรมดา',
+'content-model-javascript' => 'จาวาสคริปต์',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''คำเตือน:''' หน้านี้มีà¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¹ƒà¸Šà¹‰à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¸™à¹à¸ˆà¸‡à¸ªà¹ˆà¸§à¸™à¸¡à¸²à¸à¹€à¸à¸´à¸™à¹„ป
@@ -1293,9 +1314,9 @@ $1",
'prefs-emailconfirm-label' => 'à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸­à¸µà¹€à¸¡à¸¥:',
'prefs-textboxsize' => 'ขนาดหน้าต่างà¹à¸à¹‰à¹„ข',
'youremail' => 'อีเมล:',
-'username' => 'ชื่อผู้ใช้:',
-'uid' => 'รหัสผู้ใช้:',
-'prefs-memberingroups' => 'สมาชิà¸à¹ƒà¸™{{PLURAL:$1|à¸à¸¥à¸¸à¹ˆà¸¡|à¸à¸¥à¸¸à¹ˆà¸¡}}:',
+'username' => '{{GENDER:$1|ชื่อผู้ใช้}}:',
+'uid' => 'รหัสประจำตัว{{GENDER:$1|ผู้ใช้}}:',
+'prefs-memberingroups' => '{{GENDER:$2|สมาชิà¸}}ใน{{PLURAL:$1|à¸à¸¥à¸¸à¹ˆà¸¡|à¸à¸¥à¸¸à¹ˆà¸¡}}:',
'prefs-registration' => 'เวลาลงทะเบียน:',
'yourrealname' => 'ชื่อจริง:',
'yourlanguage' => 'ภาษา:',
@@ -1442,11 +1463,13 @@ $1",
'right-sendemail' => 'ส่งอีเมลหาผู้ใช้อื่น',
'right-passwordreset' => 'ดูอีเมลตั้งรหัสผ่านใหม่',
+# Special:Log/newusers
+'newuserlogpage' => 'ปูมà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
+'newuserlogpagetext' => 'นี่คือปูมà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
+
# User rights log
'rightslog' => 'ปูมสิทธิผู้ใช้',
'rightslogtext' => 'นี่คือปูมà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸ªà¸´à¸—ธิผู้ใช้',
-'rightslogentry' => '$1 ถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸à¸¥à¸¸à¹ˆà¸¡à¸ˆà¸²à¸ $2 เป็น $3',
-'rightsnone' => '(ไม่มี)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'อ่านหน้านี้',
@@ -2028,9 +2051,9 @@ $1',
'linksearch-pat' => 'รูปà¹à¸šà¸šà¸à¸²à¸£à¸„้นหา:',
'linksearch-ns' => 'เนมสเปซ:',
'linksearch-ok' => 'ค้นหา',
-'linksearch-text' => 'อัà¸à¸‚ระตัวà¹à¸—นเช่น "*.wikipedia.org" สามารถใช้ได้
-โดเมนระดับบนสุดจำเป็นต้องมีเป็นอย่างน้อย เช่น "*.org"<br />
-โพรโทคอลที่รองรับ: <code>$1</code> (อย่าใส่คำเหล่านี้ในà¸à¸²à¸£à¸ªà¸·à¸šà¸„้นของคุณ)',
+'linksearch-text' => 'สามารถใช้ตัวà¹à¸—นเช่น "*.wikipedia.org" ได้
+ต้องà¸à¸²à¸£à¹‚ดเมนระดับบนสุดเป็นอย่างน้อย เช่น "*.org"<br />
+โพรโทคอลที่รองรับ: <code>$1</code> (ค่าโดยปริยายเป็น http:// หาà¸à¹„ม่ระบุโพรโทคอล)',
'linksearch-line' => '$1 ถูà¸à¸¥à¸´à¸‡à¸à¹Œà¸ˆà¸²à¸ $2',
'linksearch-error' => 'อัà¸à¸‚ระตัวà¹à¸—นอยู่ได้เฉพาะหน้าชื่อโฮสต์เท่านั้น',
@@ -2049,10 +2072,6 @@ $1',
'activeusers-hidesysops' => 'ซ่อนผู้ดูà¹à¸¥à¸£à¸°à¸šà¸š',
'activeusers-noresult' => 'ไม่พบผู้ใช้',
-# Special:Log/newusers
-'newuserlogpage' => 'ปูมà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
-'newuserlogpagetext' => 'นี่คือปูมà¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
-
# Special:ListGroupRights
'listgrouprights' => 'สิทธิà¸à¸¥à¸¸à¹ˆà¸¡à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰',
'listgrouprights-summary' => 'ด้านล่างเป็นรายà¸à¸²à¸£à¸à¸¥à¸¸à¹ˆà¸¡à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸—ี่นิยามบนวิà¸à¸´à¸™à¸µà¹‰ à¹à¸¥à¸°à¸ªà¸´à¸—ธิà¸à¸²à¸£à¹€à¸‚้าถึงที่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้อง
@@ -2146,41 +2165,48 @@ $1',
'enotif_mailer' => 'à¹à¸ˆà¹‰à¸‡à¸à¸²à¸£à¹à¸à¹‰à¹„ขจาภ{{SITENAME}}',
'enotif_reset' => 'ทำเครื่องหมายว่าชมทุà¸à¸«à¸™à¹‰à¸²à¹à¸¥à¹‰à¸§',
-'enotif_newpagetext' => 'นี่คือหน้าใหม่',
'enotif_impersonal_salutation' => 'ผู้ใช้{{SITENAME}}',
-'changed' => 'ถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡',
-'created' => 'ถูà¸à¸ªà¸£à¹‰à¸²à¸‡',
-'enotif_subject' => '{{SITENAME}} หน้า $PAGETITLE ได้ $CHANGEDORCREATED โดย $PAGEEDITOR',
+'enotif_subject_deleted' => 'หน้า $1 บน {{SITENAME}} ถูà¸à¸¥à¸šà¹‚ดย {{gender:$2|$2}}',
+'enotif_subject_created' => 'หน้า $1 บน {{SITENAME}} ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¹‚ดย {{gender:$2|$2}}',
+'enotif_subject_moved' => 'หน้า $1 บน {{SITENAME}} ถูà¸à¸¢à¹‰à¸²à¸¢à¹‚ดย {{gender:$2|$2}}',
+'enotif_subject_restored' => 'หน้า $1 บน {{SITENAME}} ถูà¸{{GENDER:$2|à¸à¸¹à¹‰à¸„ืน}}โดย $2',
+'enotif_subject_changed' => 'หน้า $1 บน {{SITENAME}} มีà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¹‚ดย {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'หน้า $1 บน {{SITENAME}} ถูà¸{{GENDER:$2|ลบ}}เมื่อ $PAGEEDITDATE โดย $2 ดู $3',
+'enotif_body_intro_created' => 'หน้า $1 บน {{SITENAME}} ถูà¸{{GENDER:$2|สร้าง}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3',
+'enotif_body_intro_moved' => 'หน้า $1 บน {{SITENAME}} ถูà¸{{GENDER:$2|เปลี่ยนชื่อ}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3',
+'enotif_body_intro_restored' => 'หน้า $1 บน {{SITENAME}} ถูà¸{{GENDER:$2|à¸à¸¹à¹‰à¸„ืน}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3',
+'enotif_body_intro_changed' => 'หน้า $1 บน {{SITENAME}} ถูà¸{{GENDER:$2|เปลี่ยนà¹à¸›à¸¥à¸‡}}เมื่อ $PAGEEDITDATE โดย $2 ดูรุ่นปัจจุบันที่ $3',
'enotif_lastvisited' => 'ดู $1 สำหรับà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸—ั้งหมดตั้งà¹à¸•à¹ˆà¸„ุณเข้าชมครั้งล่าสุด',
'enotif_lastdiff' => 'ดู $1 เพื่อดูà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸™à¸µà¹‰',
'enotif_anon_editor' => 'ผู้ใช้นิรนาม $1',
-'enotif_body' => 'เรียน $WATCHINGUSERNAME,
-
-
-ทางระบบจาà¸à¹€à¸§à¹‡à¸š {{SITENAME}} ต้องà¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¹ƒà¸«à¹‰à¸—ราบว่า หน้า $PAGETITLE ได้ $CHANGEDORCREATED เมื่อ $PAGEEDITDATE โดย $PAGEEDITOR ดูรุ่นปัจจุบันได้ที่ $PAGETITLE_URL
+'enotif_body' => 'เรียน $WATCHINGUSERNAME
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
-คำสรุปà¸à¸²à¸£à¹à¸à¹‰à¹„ข: $PAGESUMMARY $PAGEMINOREDIT
+คำอธิบายอย่างย่อของผู้เขียน: $PAGESUMMARY $PAGEMINOREDIT
-ติดต่อผู้à¹à¸à¹‰à¹„ข:
-อีเมล: $PAGEEDITOR_EMAIL
+ติดต่อผู้เขียน:
+เมล: $PAGEEDITOR_EMAIL
วิà¸à¸´: $PAGEEDITOR_WIKI
-จะไม่มีà¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¹€à¸žà¸´à¹ˆà¸¡à¹€à¸•à¸´à¸¡à¸ˆà¸™à¸à¸§à¹ˆà¸²à¸„ุณจะได้à¹à¸§à¸°à¹€à¸‚้าไปที่หน้านี้
-นอà¸à¸ˆà¸²à¸à¸™à¸µà¹‰à¸„ุณสามารถตั้งค่ายà¸à¹€à¸¥à¸´à¸à¸à¸²à¸£à¹à¸ˆà¹‰à¸‡à¸‚องหน้าที่อยู่ในรายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูได้
+จะไม่มีประà¸à¸²à¸¨à¸­à¸·à¹ˆà¸™à¸«à¸²à¸à¸¡à¸µà¸à¸´à¸ˆà¸à¸£à¸£à¸¡à¹€à¸žà¸´à¹ˆà¸¡à¹€à¸•à¸´à¸¡ เว้นเสียà¹à¸•à¹ˆà¸„ุณจะเข้าชมหน้านี้ คุณยังสามารถตั้งค่าตัวบ่งชี้ประà¸à¸²à¸¨à¹ƒà¸«à¸¡à¹ˆà¸ªà¸³à¸«à¸£à¸±à¸šà¸«à¸™à¹‰à¸²à¸—ี่คุณเà¸à¹‰à¸²à¸”ูทุà¸à¸«à¸™à¹‰à¸²à¹ƒà¸™à¸£à¸²à¸¢à¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณ
-ระบบà¹à¸ˆà¹‰à¸‡à¸­à¸±à¸•à¹‚นมัติจาภ{{SITENAME}}
+ระบบประà¸à¸²à¸¨ {{SITENAME}} ที่เป็นมิตรของคุณ
--
-ถ้าต้องà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸£à¸²à¸¢à¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู à¸à¸£à¸¸à¸“าไปที่:
+ในà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าประà¸à¸²à¸¨à¸­à¸µà¹€à¸¡à¸¥à¸‚องคุณ โปรดดู
+{{canonicalurl:{{#special:Preferences}}}}
+
+ในà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่ารายà¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณ โปรดดู
{{canonicalurl:{{#special:EditWatchlist}}}}
-ถ้าต้องà¸à¸²à¸£à¸¥à¸šà¸«à¸™à¹‰à¸²à¸™à¸µà¹‰à¸ˆà¸²à¸à¸£à¸²à¸¢à¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ู à¸à¸£à¸¸à¸“าไปที่:
+ในà¸à¸²à¸£à¸¥à¸šà¸«à¸™à¹‰à¸²à¸ˆà¸²à¸à¸£à¸²à¸¢à¸à¸²à¸£à¹€à¸à¹‰à¸²à¸”ูของคุณ โปรดดู
$UNWATCHURL
-ถ้าต้องà¸à¸²à¸£à¸„วามช่วยเหลือเพิ่มเติม à¸à¸£à¸¸à¸“าไปที่:
+ผลป้อนà¸à¸¥à¸±à¸šà¹à¸¥à¸°à¸„วามช่วยเหลือเพิ่มเติม:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'ถูà¸à¸ªà¸£à¹‰à¸²à¸‡',
+'changed' => 'ถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡',
# Delete
'deletepage' => 'ลบหน้า',
@@ -2248,6 +2274,8 @@ $UNWATCHURL
'prot_1movedto2' => '[[$1]] ถูà¸à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¸Šà¸·à¹ˆà¸­à¹€à¸›à¹‡à¸™ [[$2]]',
'protect-badnamespace-title' => 'เนมสเปซล็อà¸à¹„ม่ได้',
'protect-badnamespace-text' => 'หน้าในเนมสเปซนี้ไม่สามารถป้องà¸à¸±à¸™à¹„ด้',
+'protect-norestrictiontypes-text' => 'หน้านี้ไม่สามารถถูà¸à¸¥à¹‡à¸­à¸ เพราะไม่มีประเภทà¸à¸²à¸£à¸ˆà¸³à¸à¸±à¸”ที่ใช้ได้',
+'protect-norestrictiontypes-title' => 'หน้าที่ล็อà¸à¹„ม่ได้',
'protect-legend' => 'ยืนยันà¸à¸²à¸£à¸¥à¹‡à¸­à¸',
'protectcomment' => 'เหตุผล:',
'protectexpiry' => 'หมดอายุ:',
@@ -2330,7 +2358,8 @@ $UNWATCHURL
'undeletedrevisions' => '$1 รุ่นà¸à¸²à¸£à¹à¸à¹‰à¹„ขถูà¸à¸à¸¹à¹‰à¸„ืน',
'undeletedrevisions-files' => '$1 รุ่น à¹à¸¥à¸° $2 ไฟล์ถูà¸à¸à¸¹à¹‰à¸„ืน',
'undeletedfiles' => '$1 ไฟล์ถูà¸à¸à¸¹à¹‰à¸„ืน',
-'cannotundelete' => 'เรียà¸à¸„ืนไม่สำเร็จ อาจมีใครบางคนเรียà¸à¸„ืนหน้านั้นà¹à¸¥à¹‰à¸§',
+'cannotundelete' => 'à¸à¸²à¸£à¸à¸¹à¹‰à¸„ืนล้มเหลว:
+$1',
'undeletedpage' => "'''$1 ถูà¸à¸à¸¹à¹‰à¸„ืน'''
ดู[[Special:Log/delete|ปูมà¸à¸²à¸£à¸¥à¸š]] สำหรับรายชื่อà¸à¸²à¸£à¸¥à¸šà¹à¸¥à¸°à¸à¸²à¸£à¸à¸¹à¹‰à¸„ืนล่าสุด",
@@ -2362,7 +2391,7 @@ $1',
'blanknamespace' => '(หลัà¸)',
# Contributions
-'contributions' => 'เรื่องที่ผู้ใช้รายนี้เขียน',
+'contributions' => 'เรื่องที่เขียนโดย{{GENDER:$1|ผู้ใช้}}นี้',
'contributions-title' => 'เรื่องที่เขียนโดย $1',
'mycontris' => 'เรื่องที่เขียน',
'contribsub2' => 'สำหรับ $1 ($2)',
@@ -2748,7 +2777,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'à¸à¸²à¸£à¸—ดสอบจาวาสคริปต์',
-'javascripttest-disabled' => 'ฟังà¸à¹Œà¸Šà¸±à¹ˆà¸™à¸à¸²à¸£à¸—ำงานนี้ถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸­à¸¢à¸¹à¹ˆ',
'javascripttest-title' => 'à¸à¸³à¸¥à¸±à¸‡à¸”ำเนินงานทดสอบ $1',
'javascripttest-pagetext-noframework' => 'หน้านี้สงวนไว้สำหรับดำเนินงานà¸à¸²à¸£à¸—ดสอบจาวาสคริปต์',
'javascripttest-pagetext-skins' => 'เลือà¸à¸ªà¸à¸´à¸™à¸—ี่จะดำเนินงานà¸à¸²à¸£à¸—ดสอบ:',
@@ -2894,9 +2922,11 @@ $1',
'pageinfo-default-sort' => 'หลัà¸à¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸‡à¸¥à¸³à¸”ับโดยปริยาย',
'pageinfo-length' => 'ความยาวหน้า (ไบต์)',
'pageinfo-article-id' => 'หมายเลขประจำหน้า',
+'pageinfo-language' => 'ภาษาเนื้อหาของหน้า',
'pageinfo-robot-policy' => 'สถานะเสิร์ชเอนจิน',
'pageinfo-views' => 'จำนวนà¸à¸²à¸£à¹€à¸‚้าดู',
'pageinfo-watchers' => 'จำนวนผู้เข้าดูหน้า',
+'pageinfo-few-watchers' => '{{PLURAL:$1|ผู้เà¸à¹‰à¸²à¸”ู|ผู้เà¸à¹‰à¸²à¸”ู}}น้อยà¸à¸§à¹ˆà¸² $1 คน',
'pageinfo-redirects-name' => 'หน้าเปลี่ยนทางมายังหน้านี้',
'pageinfo-subpages-name' => 'หน้าย่อยของหน้านี้',
'pageinfo-subpages-value' => '$1 ($2 หน้าเปลี่ยนทาง; $3 หน้าไม่เปลี่ยนทาง)',
@@ -2910,6 +2940,15 @@ $1',
'pageinfo-recent-authors' => 'จำนวนผู้เขียนล่าสุด',
'pageinfo-hidden-categories' => 'หมวดหมู่ที่ซ่อนอยู่ ($1)',
'pageinfo-templates' => 'à¹à¸¡à¹ˆà¹à¸šà¸šà¸—ี่ใช้ ($1)',
+'pageinfo-toolboxlink' => 'ข้อมูลหน้า',
+'pageinfo-redirectsto' => 'เปลี่ยนทางไปยัง',
+'pageinfo-contentpage' => 'นับเป็นหน้าเนื้อหา',
+'pageinfo-contentpage-yes' => 'ใช่',
+'pageinfo-protect-cascading-yes' => 'ใช่',
+'pageinfo-category-info' => 'ข้อมูลหมวดหมู่',
+'pageinfo-category-pages' => 'จำนวนหน้า',
+'pageinfo-category-subcats' => 'จำนวนหมวดหมู่ย่อย',
+'pageinfo-category-files' => 'จำนวนไฟล์',
# Skin names
'skinname-standard' => 'คลาสสิà¸',
@@ -2932,6 +2971,8 @@ $1',
'markedaspatrollederror' => 'ไม่สามารถทำเครื่องหมายว่าตรวจสอบà¹à¸¥à¹‰à¸§',
'markedaspatrollederrortext' => 'คุณจำเป็นต้องระบุรุ่นà¸à¸²à¸£à¹à¸à¹‰à¹„ขที่à¸à¸³à¸«à¸™à¸”ว่าตรวจสอบà¹à¸¥à¹‰à¸§',
'markedaspatrollederror-noautopatrol' => 'คุณไม่สามารถทำเครื่องหมายà¸à¸²à¸£à¹à¸à¹‰à¹„ขของคุณเองว่าตรวจสอบà¹à¸¥à¹‰à¸§',
+'markedaspatrollednotify' => 'à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¹„ปยัง $1 ถูà¸à¸—ำเครื่องหมายว่าตรวจสอบà¹à¸¥à¹‰à¸§',
+'markedaspatrollederrornotify' => 'à¸à¸²à¸£à¸—ำเครื่องหมายว่าตรวจสอบà¹à¸¥à¹‰à¸§à¸¥à¹‰à¸¡à¹€à¸«à¸¥à¸§',
# Patrol log
'patrol-log-page' => 'ปูมà¸à¸²à¸£à¸•à¸£à¸§à¸ˆà¸ªà¸­à¸š',
@@ -2964,6 +3005,7 @@ $1',
'file-info-size-pages' => '$1 × $2 พิà¸à¹€à¸‹à¸¥, ขนาดไฟล์: $3, ประเภท MIME: $4, $5 {{PLURAL:$5|หน้า|หน้า}}',
'file-nohires' => 'ไม่มีความละเอียดสูงà¸à¸§à¹ˆà¸²à¸™à¸µà¹‰',
'svg-long-desc' => 'ไฟล์ SVG, $1 × $2 พิà¸à¹€à¸‹à¸¥ พอเป็นพิธี, ขนาดไฟล์: $3',
+'svg-long-error' => 'ไฟล์ SVG ไม่ถูà¸à¸•à¹‰à¸­à¸‡: $1',
'show-big-image' => 'ความละเอียดสูงสุด',
'show-big-image-other' => 'อื่นๆ {{PLURAL:$2|resolution|resolutions}}: $1.',
'show-big-image-size' => '$1 × $2 พิà¸à¹€à¸‹à¸¥',
@@ -2994,7 +3036,10 @@ $1',
'minutes' => '$1 นาที',
'hours' => '$1 ชั่วโมง',
'days' => '$1 วัน',
+'months' => '$1 เดือน',
+'years' => '$1 ปี',
'ago' => '$1 มาà¹à¸¥à¹‰à¸§',
+'just-now' => 'เมื่อสัà¸à¸„รู่นี้',
# Bad image list
'bad_image_list' => 'รูปà¹à¸šà¸šà¹à¸ªà¸”งต่อไปนี้:
@@ -3660,7 +3705,7 @@ $5
'logentry-newusers-create' => 'บัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰ $1 ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้น',
'logentry-newusers-create2' => 'บัà¸à¸Šà¸µà¸œà¸¹à¹‰à¹ƒà¸Šà¹‰ $3 ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นโดย $1',
'logentry-newusers-autocreate' => 'บัà¸à¸Šà¸µ $1 ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นอัตโนมัติ',
-'newuserlog-byemail' => 'รหัสผ่านถูà¸à¸ªà¹ˆà¸‡à¸—างอีเมล',
+'rightsnone' => '(ไม่มี)',
# Feedback
'feedback-bugornote' => 'หาà¸à¸„ุณได้อธิบายปัà¸à¸«à¸²à¸—างเทคนิคในรายละเอียดà¹à¸¥à¹‰à¸§ โปรด[$1 รายงานจุดบà¸à¸žà¸£à¹ˆà¸­à¸‡]
diff --git a/languages/messages/MessagesTk.php b/languages/messages/MessagesTk.php
index 3405d9b4..84c3abc8 100644
--- a/languages/messages/MessagesTk.php
+++ b/languages/messages/MessagesTk.php
@@ -182,7 +182,6 @@ kiçi kategoriýadan {{PLURAL:$1|sany kiçi kategoriýa|$1 sany kiçi kategoriý
'qbbrowse' => 'Göz aýla',
'qbedit' => 'Redaktirle',
'qbpageoptions' => 'Bu sahypa',
-'qbpageinfo' => 'Kontekst',
'qbmyoptions' => 'Meniň sahypalarym',
'qbspecialpages' => 'Ãörite sahypalar',
'faq' => 'KSS',
@@ -205,6 +204,7 @@ kiçi kategoriýadan {{PLURAL:$1|sany kiçi kategoriýa|$1 sany kiçi kategoriý
'namespaces' => 'At giňişlikleri',
'variants' => 'Wariantlar',
+'navigation-heading' => 'Nawigasiýa menýusy',
'errorpagetitle' => 'Säwlik',
'returnto' => '$1.',
'tagline' => '{{SITENAME}} saýtyndan',
@@ -424,12 +424,9 @@ Görkezilen sebäp: ''$2''.",
# Login and logout pages
'logouttext' => "'''Sessiýany ýapdyňyz.'''
-Indi anonim ýagdaýda {{SITENAME}} saýtyny ulanyp bilersiňiz, ýa-da şol bir ýa-da başga bir at bilen [[Special:UserLogin|sessiýany ýaňadan]] açyp bilersiňiz.
+Indi anonim ýagdaýda {{SITENAME}} saýtyny ulanyp bilersiňiz, ýa-da şol bir ýa-da başga bir at bilen <span class='plainlinks'>[$1 sessiýany ýaňadan]</span> açyp bilersiňiz.
Web brauzeriňiziň keşini arassalaýançaňyz käbir sahypalar sessiýaňyzyň açyk wagtkysy ýaly görünip biler.",
-'welcomecreation' => '== Hoş geldiňiz, $1! ==
-
-Hasabyňyz açyldy.
-[[Special:Preferences|{{SITENAME}} saýtyndaky ileri tutmalaryňyzy]] üýtgetmegi ýatdan çykarmaň.',
+'welcomeuser' => 'Hoş geldiňiz, $1!',
'yourname' => 'Ulanyjy adyňyz:',
'yourpassword' => 'Parolyňyz:',
'yourpasswordagain' => 'Paroly gaýtadan ýaz:',
@@ -719,7 +716,6 @@ Gündeligiň iň soňky ýazgysy salgylanmak üçin aşakda berilýär:",
'template-protected' => '(goragly)',
'template-semiprotected' => '(ýarym goragly)',
'hiddencategories' => 'Bu sahypa {{PLURAL:$1|1 gizlin kategoriýa|$1 gizlin kategoriýa}} degişlidir:',
-'nocreatetitle' => 'Sahypa döretmeklik çäklendirildi',
'nocreatetext' => '{{SITENAME}} täze sahypa döretmek mümkinçiligini çäklendirdi.
Yza gaýdyp, bar bolan sahypalary redaktirläp bilersiňiz ýa-da bolmasa [[Special:UserLogin|sessiýa açyp]] ýa-da [[Special:UserLogin|hasap döredip]] bilersiňiz.',
'nocreate-loggedin' => 'Täze sahypa döretmäge rugsadyňyz ýok.',
@@ -744,6 +740,11 @@ Düşündiriş berilmedi.',
'edit-already-exists' => 'Täze sahypa döredip bolanok.
Ol eýýäm bar.',
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
# Parser/template warnings
'expensive-parserfunction-warning' => "'''Duýduryş:''' Bu sahypada resurs talap ediji funksiýalara çakdanaşa köp çagyryş bar.
@@ -1236,11 +1237,13 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
'right-override-export-depth' => 'Sahypalary, şol sanda çykgytly sahypalary 5-e çenli çuňlukda eksportirle',
'right-sendemail' => 'Başga ulanyjylara e-poçta iber',
+# Special:Log/newusers
+'newuserlogpage' => 'Täze ulanyjy gündeligi',
+'newuserlogpagetext' => 'Ulanyjy döretme gündeligi.',
+
# User rights log
'rightslog' => 'Ulanyjy hukuklarynyň gündeligi',
'rightslogtext' => 'Ulanyjy hukuklaryndaky üýtgeşmeler gündeligi.',
-'rightslogentry' => '$1 üçin topar agzalygyny $2 toparyndan $3 toparyna üýtgetdi',
-'rightsnone' => '(hiç biri)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'bu sahypany okamaga',
@@ -1786,10 +1789,6 @@ Goldanylýan protokollar: <code>$1</code>',
'activeusers-hidesysops' => 'Administratorlary gizle',
'activeusers-noresult' => 'Ulanyjy tapylmady.',
-# Special:Log/newusers
-'newuserlogpage' => 'Täze ulanyjy gündeligi',
-'newuserlogpagetext' => 'Ulanyjy döretme gündeligi.',
-
# Special:ListGroupRights
'listgrouprights' => 'Ulanyjy topary hukuklary',
'listgrouprights-summary' => 'Aşakda şu wikide kesgitlenen ulanyjy toparlarynyň hem-de olaryň degişli ulanmak hukuklarynyň sanawy berilýär.
@@ -1878,11 +1877,7 @@ Aňsatlyk bilen saýlap almak üçin bolsa, [[Special:RecentChanges|soňky üýt
'enotif_mailer' => '{{SITENAME}} Poçta Gullugy',
'enotif_reset' => 'Ähli sahypalary barylyp görülen diýip belle',
-'enotif_newpagetext' => 'Bu täze sahypa.',
'enotif_impersonal_salutation' => '{{SITENAME}} ulanyjysy',
-'changed' => 'üýtgedildi',
-'created' => 'döredildi',
-'enotif_subject' => '{{SITENAME}} sahypasy $PAGETITLE, $PAGEEDITOR tarapyndan $CHANGEDORCREATED',
'enotif_lastvisited' => 'Iň soňky gezek baryp göreliňiz bäri bolan ähli üýtgeşmeleri görmek üçin serediň: $1',
'enotif_lastdiff' => 'Bu üýtgeşmäni görmek üçin serediň: $1',
'enotif_anon_editor' => 'anonim ulanyjy $1',
@@ -1912,6 +1907,8 @@ $UNWATCHURL
Seslenme we goşmaça kömek:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'döredildi',
+'changed' => 'üýtgedildi',
# Delete
'deletepage' => 'Sahypany öçür',
@@ -2093,7 +2090,7 @@ $1',
'blanknamespace' => '(BaÅŸ)',
# Contributions
-'contributions' => 'Ulanyjynyň goşantlary',
+'contributions' => '{{GENDER:$1|Ulanyjy}} goÅŸantlary',
'contributions-title' => '$1 üçin ulanyjy goşantlary',
'mycontris' => 'GoÅŸantlar',
'contribsub2' => '$1 ($2)',
@@ -3155,7 +3152,7 @@ Faýlyň adyny "{{ns:file}}:" pristawkasyz giriziň.',
# New logging system
'revdelete-restricted' => 'administratorlara goýlan çäklendirmeler',
'revdelete-unrestricted' => 'administratorlardan aýyrylan çäklendirmeler',
-'newuserlog-byemail' => 'parol e-poçta bilen iberildi',
+'rightsnone' => '(hiç biri)',
# Search suggestions
'searchsuggest-search' => 'Gözleg',
diff --git a/languages/messages/MessagesTl.php b/languages/messages/MessagesTl.php
index 96baf865..0661c87c 100644
--- a/languages/messages/MessagesTl.php
+++ b/languages/messages/MessagesTl.php
@@ -114,7 +114,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Mga_huling_binago', 'HulingBinago' ),
'Recentchangeslinked' => array( 'Nakakawing_ng_kamakailang_pagbabago', 'Kaugnay_na_mga_pagbabago' ),
'Revisiondelete' => array( 'Pagbura_ng_pagbabago' ),
- 'RevisionMove' => array( 'Paglipat_ng_Rebisyon' ),
'Search' => array( 'Maghanap' ),
'Shortpages' => array( 'Maikling_mga_pahina' ),
'Specialpages' => array( 'Natatanging_mga_pahina' ),
@@ -295,7 +294,6 @@ $messages = array(
'qbbrowse' => 'Basa-basahin',
'qbedit' => 'Baguhin',
'qbpageoptions' => 'Itong pahina',
-'qbpageinfo' => 'Konteksto',
'qbmyoptions' => 'Mga pahina ko',
'qbspecialpages' => 'Mga natatanging pahina',
'faq' => "Mga karaniwang itinatanong (''FAQ'')",
@@ -567,10 +565,10 @@ Ang tagapangasiwang nagkandado nito ay nag-alok ng ganitong paliwanag: "$3".',
# Login and logout pages
'logouttext' => "'''Nakaalis ka na sa pagkakalagda.'''
-Maaari kang tumuloy sa paggamit ng {{SITENAME}} nang hindi nakikilala (anonimo), o maaaring kang [[Special:UserLogin|lumagda/tumala muli]] bilang kapareho o ibang tagagamit.
+Maaari kang tumuloy sa paggamit ng {{SITENAME}} nang hindi nakikilala (anonimo), o maaaring kang <span class='plainlinks'>[$1 lumagda/tumala muli]</span> bilang kapareho o ibang tagagamit.
Tandaan na may ilang pahinang maaaring magpatuloy na nagpapakitang parang nakalagda ka pa rin, hanggang sa linisin mo ang iyong baunang pambasa-basa (''browser cache'').",
-'welcomecreation' => '== Maligayang pagdating, $1! ==
-Nilikha na ang iyong kuwenta.
+'welcomeuser' => 'Mabuhay, $1!',
+'welcomecreation-msg' => 'Nilikha na ang iyong kuwenta.
Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].',
'yourname' => 'Bansag:',
'yourpassword' => 'Hudyat:',
@@ -928,7 +926,6 @@ Ang pinakahuling entrada sa talaan ay ibinigay sa baba para sa inyong pagsasangg
'hiddencategories' => 'Ang pahinang ito ay kasapi sa {{PLURAL:$1|1 nakatagong kategorya|$1 nakatagong kategorya}}:',
'edittools' => '<!-- Ang teksto rito ay ipapakita sa ilalim ng mga pormularyo ng pagbabago at pagkarga. -->',
'edittools-upload' => '-',
-'nocreatetitle' => 'May hangganan ang paglikha ng pahina',
'nocreatetext' => 'Naglagay ng hangganan (restriksyon/limitasyon) ang {{SITENAME}} sa kakayahang makalikha ng bagong mga pahina.
Maaari kang bumalik at magbago ng isang umiiral na pahina, o kaya [[Special:UserLogin|lumagda o lumikha ng kuwenta/akawnt]].',
'nocreate-loggedin' => 'Wala kang pahintulot para lumikha ng bagong mga pahina.',
@@ -954,6 +951,10 @@ Tila binura na ito.',
Umiiral na ito.',
'defaultmessagetext' => 'Nakatakdang teksto ng mensahe',
+# Content models
+'content-model-wikitext' => 'wikiteksto',
+'content-model-text' => 'purong teksto',
+
# Parser/template warnings
'expensive-parserfunction-warning' => 'Babala: Naglalaman ang pahinang ito ng napakaraming mamahaling mga tawag na pantungkulin.
@@ -1315,7 +1316,7 @@ Hindi ito maibabalik sa dating gawi.',
'prefs-emailconfirm-label' => 'Kumpirmasyon ng e-liham:',
'prefs-textboxsize' => 'Sukat ng bintana ng pagbabago',
'youremail' => 'E-liham:',
-'username' => 'Bansag:',
+'username' => '{{GENDER:$1|Bansag}}:',
'uid' => 'ID ng tagagamit:',
'prefs-memberingroups' => 'Kasapi ng {{PLURAL:$1|na pangkat|na mga pangkat}}:',
'prefs-memberingroups-type' => '$1',
@@ -1470,12 +1471,13 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
'right-sendemail' => 'Magpadala ng e-liham sa ibang mga tagagamit',
'right-passwordreset' => 'Tingnan ang mga e-liham ng muling pagtatakda ng hudyat',
+# Special:Log/newusers
+'newuserlogpage' => 'Talaan ng paglikha ng tagagamit',
+'newuserlogpagetext' => 'Isa itong talaan ng mga paglikha ng tagagamit.',
+
# User rights log
'rightslog' => 'Tala ng mga karapatan ng tagagamit',
'rightslogtext' => 'Isa itong tala ng mga pagbabago sa mga karapatan ng tagagamit.',
-'rightslogentry' => 'binago ang kasapiang pampangkat para kay $1 mula sa $2 patungong $3',
-'rightslogentry-autopromote' => 'ay kusang naitaas ang ranggo mula $2 upang maging $3',
-'rightsnone' => '(wala)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'basahin itong pahina',
@@ -1716,6 +1718,7 @@ Kapag nagpatuloy ang suliranin, makipagugnayan sa isang [[Special:ListUsers/syso
'backend-fail-notsame' => 'Isang hindi kamukhang talaksan ang umiiral na sa $1.',
'backend-fail-invalidpath' => 'Ang $1 ay hindi isang katanggap-tanggap na landas ng imbakan.',
'backend-fail-delete' => 'Hindi mabura ang talaksang $1.',
+'backend-fail-describe' => 'Hindi mapalitan ang metadatos para sa talaksang "$1".',
'backend-fail-alreadyexists' => 'Umiiral na ang pahinang $1.',
'backend-fail-store' => 'Hindi maimbak ang talaksang $1 sa $2.',
'backend-fail-copy' => 'Hindi makopya ang talaksang $1 sa $2.',
@@ -2125,10 +2128,6 @@ Sinusuportahang mga protokolo: <code>$1</code> (huwag idagdag ang anuman sa mga
'activeusers-hidesysops' => 'Itago ang mga tagapangasiwa',
'activeusers-noresult' => 'Walang natagpuang mga tagagamit.',
-# Special:Log/newusers
-'newuserlogpage' => 'Talaan ng paglikha ng tagagamit',
-'newuserlogpagetext' => 'Isa itong talaan ng mga paglikha ng tagagamit.',
-
# Special:ListGroupRights
'listgrouprights' => 'Mga uri ng tagagamit',
'listgrouprights-summary' => 'Ang sumusunod ay isang talaan ng mga pangkat ng tagagamit na binigyang kahulugang sa wiking ito, kasama ang kanilang mga kaugnay na mga karapatan.
@@ -2225,11 +2224,7 @@ Makikita doon ang lahat ng mga susunod na pagbabago sa pahinang ito pati na ang
'enotif_mailer' => 'Tagapagpadala ng mga Pahayag ng {{SITENAME}}',
'enotif_reset' => 'Tatakan ang lahat ng pahina bilang nadalaw na',
-'enotif_newpagetext' => 'Isa itong bagong pahina.',
'enotif_impersonal_salutation' => 'Tagagamit ng {{SITENAME}}',
-'changed' => 'binago',
-'created' => 'nilikha',
-'enotif_subject' => 'Ang pahinang $PAGETITLE sa {{SITENAME}} ay $CHANGEDORCREATED ni $PAGEEDITOR',
'enotif_lastvisited' => 'Tingnan ang $1 para sa lahat ng mga pagbabago magmula noong huling pagdalaw mo.',
'enotif_lastdiff' => 'Tingnan ang $1 para makita ang pagbabagong ito.',
'enotif_anon_editor' => 'hindi nakikilalang tagagamit $1',
@@ -2263,6 +2258,8 @@ $UNWATCHURL
Tugon at karagdagang tulong:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'nilikha',
+'changed' => 'binago',
# Delete
'deletepage' => 'Burahin ang pahina',
@@ -2447,7 +2444,7 @@ $1',
'blanknamespace' => '(Pangunahin)',
# Contributions
-'contributions' => 'Mga ambag ng tagagamit',
+'contributions' => 'Mga ambag ng {{GENDER:$1|tagagamit}}',
'contributions-title' => 'Mga ambag ng tagagamit na si $1',
'mycontris' => 'Mga ambag',
'contribsub2' => 'Para kay $1 ($2)',
@@ -2848,7 +2845,6 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
# JavaScriptTest
'javascripttest' => 'Pagsubok sa JavaScript',
-'javascripttest-disabled' => 'Hindi gumagana ang tungkuling ito sa wiking ito.',
'javascripttest-title' => 'Pinatatakbo ang mga pagsubok ng $1',
'javascripttest-pagetext-noframework' => 'Nakalaan ang pahinang ito para sa pagpapatakbo ng mga pagsubok ng JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Hindi napag-aalamang balangkas ng pagsubok na "$1".',
@@ -4047,7 +4043,7 @@ Ipinapakita ang mga larawan sa buong kalinawan, tuwirang sinisimulan ang ibang u
'logentry-newusers-create' => 'Lumikha si $1 ng isang kuwenta ng tagagamit',
'logentry-newusers-create2' => 'Lumikha si $1 ng isang kuwenta ng tagagamit na $3',
'logentry-newusers-autocreate' => 'Kusang nalikha ang akawnt na $1',
-'newuserlog-byemail' => 'Ipinadala ang hudyat sa pamamagitan ng e-liham',
+'rightsnone' => '(wala)',
# Feedback
'feedback-bugornote' => 'Kung handa ka nang detalyadong maglarawan ng isang suliraning teknikal mangyaring [$1 iulat ang sira].
diff --git a/languages/messages/MessagesTly.php b/languages/messages/MessagesTly.php
index 03910cc4..7c79a52a 100644
--- a/languages/messages/MessagesTly.php
+++ b/languages/messages/MessagesTly.php
@@ -71,7 +71,6 @@ $magicWords = array(
'notoc' => array( '0', '__БЕМЫÐДӘРИҸОТ__', '__NOTOC__' ),
'forcetoc' => array( '0', '__МӘҸБУРИЈӘ_МЫÐДӘРИҸОТ__', '__FORCETOC__' ),
'toc' => array( '0', '__МЫÐДӘРИҸОТ__', '__TOC__' ),
- 'noheader' => array( '0', '__БЕСӘРЛОВҺӘ__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'ЕСӘТÐÓ˜_ÐœÐÐГ', 'ЕСӘТÐÓ˜_ÐœÐÐГ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'ЕСӘТÐÓ˜_ÐœÐÐГ_1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'ЕСӘТÐÓ˜_ÐœÐÐГИ_ÐОМ', 'CURRENTMONTHNAME' ),
@@ -264,7 +263,6 @@ $messages = array(
'qbbrowse' => 'Дијә кардеј',
'qbedit' => 'СәроÑÑ‚ кардеј',
'qbpageoptions' => 'Ым Ñәһифә',
-'qbpageinfo' => 'Мәзмун.',
'qbmyoptions' => 'Чымы Ñәһифон',
'qbspecialpages' => 'ХыÑуÑијә Ñәһифон',
'faq' => 'РÐП',
@@ -637,8 +635,8 @@ $messages = array(
'prefs-files' => 'Фајлон',
'prefs-custom-css' => 'ХыÑуÑи CSS',
'youremail' => 'E-номә:',
-'username' => 'Иштирокәкә ном:',
-'uid' => 'Иштирокәкә ID:',
+'username' => '{{GENDER:$1|Иштирокәкә ном}}:',
+'uid' => '{{GENDER:$1|Иштирокәкә}} ID:',
'yourrealname' => 'Шымә Ó™Ñыл ном:',
'yourlanguage' => 'Зывон:',
'email' => 'E-номә',
@@ -651,6 +649,9 @@ $messages = array(
# Groups
'group-user' => 'Иштирокәкон',
+# Special:Log/newusers
+'newuserlogpage' => 'Иштирокәкон ғеидијоти журнал',
+
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'Ым Ñәһифә ÑәроÑÑ‚ кардеј',
@@ -776,9 +777,6 @@ $messages = array(
# Special:LinkSearch
'linksearch-line' => '$2-ку Ñәбон вардә бә $1',
-# Special:Log/newusers
-'newuserlogpage' => 'Иштирокәкон ғеидијоти журнал',
-
# Special:ListGroupRights
'listgrouprights-members' => '(иштирокәкон Ñијоһи)',
@@ -822,7 +820,7 @@ $messages = array(
'blanknamespace' => '(Ó˜ÑоÑ)',
# Contributions
-'contributions' => 'Иштирокәкә гәнҹ',
+'contributions' => '{{GENDER:$1|Иштирокәкә}} гәнҹ',
'contributions-title' => 'Иштирокәкә гәнҹ $1',
'mycontris' => 'Гәнҹ',
'contribsub2' => 'Гәнҹ $1 ($2)',
diff --git a/languages/messages/MessagesTn.php b/languages/messages/MessagesTn.php
index cebf739e..14ac27e8 100644
--- a/languages/messages/MessagesTn.php
+++ b/languages/messages/MessagesTn.php
@@ -88,9 +88,6 @@ $messages = array(
'viewsource' => 'Lebelela motswedi',
# Login and logout pages
-'welcomecreation' => '== Amogelesega, $1! ==
-
-O ipuletse akhaonte. O seka wa lebala go fetola tse o di dikgatlhegelo tsa gago tsa {{SITENAME}}.',
'yourname' => 'Leina la modirisi:',
'yourpassword' => 'Selotlolo sa sephiri:',
'yourpasswordagain' => 'Kwala selotlolo sa gago sa sephiri gape:',
diff --git a/languages/messages/MessagesTo.php b/languages/messages/MessagesTo.php
index 86d16262..6f85d0f6 100644
--- a/languages/messages/MessagesTo.php
+++ b/languages/messages/MessagesTo.php
@@ -262,9 +262,6 @@ For translations, please consider using [//translatewiki.net/wiki/Main_Page?setl
E lava te ke hoko atu Ê»o ngÄueÊ»aki he {{SITENAME}} tatau mo e Ê»etita taÊ»ehingoa, pe te ke kau-ki-ai mo e hingoa tatau pe hingoa kehe.
Tokanga, mahalo pÄ“ Ê»e Ê»i ai ha ngaahi peesi Ê»oku Ê»asi ko koe kei kau-ki-ai aÊ»u ki he taimi te ke fakaÊ»atÄ Ê»a e fafaÊ»o fakapalausa.",
-'welcomecreation' => '== Tali fiefia, $1! ==
-
-Kuo fakatupu hoʻo tohi kau-ki-ai. ʻOua ʻe ngalo ke liliu hoʻo faʻiteliha {{SITENAME}}.',
'yourname' => 'Hingoa ʻetita',
'yourpassword' => 'Leatapu',
'yourpasswordagain' => 'Toe ʻai leatapu',
@@ -388,7 +385,6 @@ Ko e ʻuhinga loka ko e $1 ia.",
'templatesused' => 'Ngaahi sÄ«pinga Ê»oku ngÄueÊ»aki he kupú ni:',
'templatesusedpreview' => 'Ngaahi sÄ«pinga Ê»oku ngÄueÊ»aki he vakaí ni:',
'templatesusedsection' => 'Ngaahi sÄ«pinga Ê»oku ngÄueÊ»aki he kongá ni:',
-'nocreatetitle' => 'ʻOku fakangatangata ʻa e fakatupu ʻo e peesi.',
'nocreatetext' => 'Naʻe fakangatangata ʻe he tuʻuʻangá ni ʻa e lava ke fakatupu ha peesi foʻou. ʻOku ke lava ke foki pea fatu ha peesi tuʻu, pe [[Special:UserLogin|kau-ki-ai, pe fakatupu ha tohi-kau-ki-ai]].',
# Account creation failure
@@ -499,10 +495,13 @@ Ko e ʻuhinga loka ko e $1 ia.",
'group-sysop-member' => 'Pule fakafounga',
'group-bureaucrat-member' => 'Pulelahi',
+# Special:Log/newusers
+'newuserlogpage' => 'Tohinoa ʻo e fakatupu kau ʻetita',
+'newuserlogpagetext' => 'Ko e tohinoa ʻeni ʻo e fakatupu kau ʻetita.',
+
# User rights log
'rightslog' => 'Tohinoa ʻo e kau ʻetita honau maʻu mafai',
'rightslogtext' => 'Ko e tohinoa ʻeni ʻo e ngaah liliu ʻo e kau ʻetita ʻenau maʻu mafai',
-'rightsnone' => '(hala)',
# Recent changes
'recentchanges' => 'Ngaahi toki liliu',
@@ -731,10 +730,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusersfrom' => 'ʻAsi mai kau ʻetita mei he:',
'listusers-submit' => 'ʻAsi mai',
-# Special:Log/newusers
-'newuserlogpage' => 'Tohinoa ʻo e fakatupu kau ʻetita',
-'newuserlogpagetext' => 'Ko e tohinoa ʻeni ʻo e fakatupu kau ʻetita.',
-
# Email user
'mailnologin' => 'ʻOku ʻikai ha tuʻasila ke tohila ki ai',
'emailuser' => 'Tohila ki he ʻetitá ni',
@@ -781,9 +776,8 @@ Kapau ʻaho ʻe taha, te ke fietoʻo ʻa e pēsí mei hoʻo hokohoko leʻo, lomi
'watching' => 'ʻOku leʻo...',
'unwatching' => 'ʻOku taʻeleʻo...',
-'enotif_newpagetext' => 'Ko e peesi foʻou ia.',
-'changed' => 'ʻosi liliu',
'created' => 'kuo fakatupu',
+'changed' => 'ʻosi liliu',
# Delete
'deletepage' => 'TÄmateÊ»i peesi',
@@ -1235,4 +1229,7 @@ KÄtaki fakapapauÊ»i te ke fie toe fatu Ê»a e kupu ni.",
# Special:SpecialPages
'specialpages' => 'Ngaahi peesi makehe',
+# New logging system
+'rightsnone' => '(hala)',
+
);
diff --git a/languages/messages/MessagesTpi.php b/languages/messages/MessagesTpi.php
index 459e8165..55dd51a4 100644
--- a/languages/messages/MessagesTpi.php
+++ b/languages/messages/MessagesTpi.php
@@ -466,9 +466,11 @@ Na tu yu tok tru nau olsem yu raitim dispela yu yet, o yu kisim long wanpela hap
'right-delete' => 'Rausim ol pes',
'right-suppressionlog' => 'Lukim ol praivet ripot',
+# Special:Log/newusers
+'newuserlogpage' => 'Ripot long ol nupela yusa',
+
# User rights log
'rightslog' => 'Ripot long ol pawa bilong ol yusa',
-'rightsnone' => 'i nogat wanpela',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ridim dispela pes',
@@ -608,9 +610,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Special:ListUsers
'listusers-submit' => 'Soim',
-# Special:Log/newusers
-'newuserlogpage' => 'Ripot long ol nupela yusa',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Grup',
'listgrouprights-members' => '(lista bilong ol memba)',
@@ -653,12 +652,10 @@ Sapos yu laik rausim dispela pes long lukautbuk bilong yu bihain, paitim \"Pinis
'unwatching' => 'Wet liklik, i raus nau long lukautbuk...',
'enotif_reset' => 'Makim olgeta pes olsem mi lukim pinis',
-'enotif_newpagetext' => 'Dispela emi nupela pes.',
'enotif_impersonal_salutation' => 'yusa long {{SITENAME}}',
-'changed' => 'i senisim',
-'created' => 'i kirapim',
-'enotif_subject' => '$PAGEEDITOR $CHANGEDORCREATED pes $PAGETITLE long {{SITENAME}}',
'enotif_anon_editor' => 'IP yusa $1',
+'created' => 'i kirapim',
+'changed' => 'i senisim',
# Delete
'deletepage' => 'Rausim dispela pes',
@@ -885,6 +882,9 @@ Yu inap lukim as tok bilong em',
# HTML forms
'htmlform-selectorother-other' => 'Narapela',
+# New logging system
+'rightsnone' => 'i nogat wanpela',
+
# Search suggestions
'searchsuggest-search' => 'Painim',
diff --git a/languages/messages/MessagesTr.php b/languages/messages/MessagesTr.php
index b1474ee4..78b80084 100644
--- a/languages/messages/MessagesTr.php
+++ b/languages/messages/MessagesTr.php
@@ -56,7 +56,7 @@
*/
$namespaceNames = array(
- NS_MEDIA => 'Medya',
+ NS_MEDIA => 'Ortam',
NS_SPECIAL => 'Özel',
NS_TALK => 'Tartışma',
NS_USER => 'Kullanıcı',
@@ -75,9 +75,10 @@ $namespaceNames = array(
);
$namespaceAliases = array(
- 'Resim' => NS_FILE,
- 'Resim_tartışma' => NS_FILE_TALK,
- 'MedyaViki' => NS_MEDIAWIKI,
+ 'Medya' => NS_MEDIA,
+ 'Resim' => NS_FILE,
+ 'Resim_tartışma' => NS_FILE_TALK,
+ 'MedyaViki' => NS_MEDIAWIKI,
'MedyaViki_tartışma' => NS_MEDIAWIKI_TALK,
);
@@ -93,7 +94,8 @@ $specialPageAliases = array(
'Booksources' => array( 'KitapKaynakları' ),
'BrokenRedirects' => array( 'BozukYönlendirmeler' ),
'Categories' => array( 'Kategoriler', 'Ulamlar' ),
- 'ChangePassword' => array( 'ŞifreDeğiştir', 'ParolaDeğiştir', 'ŞifreSıfırla', 'ParolaSıfırla' ),
+ 'ChangeEmail' => array( 'E-postaDeÄŸiÅŸtir' ),
+ 'ChangePassword' => array( 'ParolaDeğiştir', 'ParolaSıfırla' ),
'ComparePages' => array( 'SayfaKarşılaştır' ),
'Confirmemail' => array( 'E-postaDoÄŸrula' ),
'Contributions' => array( 'Katkılar' ),
@@ -110,6 +112,7 @@ $specialPageAliases = array(
'Filepath' => array( 'DosyaYolu', 'DosyaKonumu' ),
'Import' => array( 'İçeAktar', 'İçeriAktar' ),
'Invalidateemail' => array( 'E-postaDoÄŸrulamaÄ°ptal' ),
+ 'JavaScriptTest' => array( 'JavaScriptTesti' ),
'BlockList' => array( 'EngelListesi', 'IPEngelListesi', 'EngelListele' ),
'LinkSearch' => array( 'BağArama', 'BağlantıArama' ),
'Listadmins' => array( 'HizmetliListele', 'YöneticiListele', 'HizmetliListesi', 'YöneticiListesi' ),
@@ -120,12 +123,13 @@ $specialPageAliases = array(
'Listusers' => array( 'KullanıcıListesi', 'KullanıcıListele' ),
'Lockdb' => array( 'DBKilitle', 'VeritabanıKilitle' ),
'Log' => array( 'Günlük', 'Günlükler', 'Kayıt', 'Kayıtlar' ),
- 'Lonelypages' => array( 'YalnızSayfalar' ),
+ 'Lonelypages' => array( 'YalnızSayfalar', 'YetimSayfalar' ),
'Longpages' => array( 'UzunSayfalar' ),
'MergeHistory' => array( 'GeçmişBirleştir' ),
'MIMEsearch' => array( 'MIMEArama' ),
'Mostcategories' => array( 'EnFazlaKategorili' ),
'Mostimages' => array( 'EnÇokBağlantıVerilenDosyalar' ),
+ 'Mostinterwikis' => array( 'EnFazlaÄ°nterviki' ),
'Mostlinked' => array( 'EnÇokBağlantıVerilenSayfalar' ),
'Mostlinkedcategories' => array( 'EnÇokBağlantıVerilenKategoriler' ),
'Mostlinkedtemplates' => array( 'EnÇokBağlantıVerilenŞablonlar' ),
@@ -149,7 +153,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'SonDeÄŸiÅŸiklikler' ),
'Recentchangeslinked' => array( 'Ä°lgiliDeÄŸiÅŸiklikler' ),
'Revisiondelete' => array( 'RevizyonSil' ),
- 'RevisionMove' => array( 'RevizyonTaşı' ),
'Search' => array( 'Ara', 'Arama' ),
'Shortpages' => array( 'KısaSayfalar' ),
'Specialpages' => array( 'ÖzelSayfalar' ),
@@ -167,10 +170,11 @@ $specialPageAliases = array(
'Unusedtemplates' => array( 'KullanılmayanŞablonlar' ),
'Unwatchedpages' => array( 'Ä°zlenmeyenSayfalar' ),
'Upload' => array( 'Yükle' ),
+ 'UploadStash' => array( 'ZulaYükle', 'ZulaYükleme' ),
'Userlogin' => array( 'KullanıcıOturumuAçma', 'KullanıcıGiriş' ),
'Userlogout' => array( 'KullanıcıOturumuKapatma', 'KullanıcıÇıkış' ),
'Userrights' => array( 'KullanıcıHakları' ),
- 'Version' => array( 'Sürüm' ),
+ 'Version' => array( 'Sürüm', 'Versiyon' ),
'Wantedcategories' => array( 'Ä°stenenKategoriler' ),
'Wantedfiles' => array( 'Ä°stenenDosyalar' ),
'Wantedpages' => array( 'Ä°stenenSayfalar' ),
@@ -187,11 +191,10 @@ $magicWords = array(
'forcetoc' => array( '0', '__İÇİNDEKİLERZORUNLU__', '__FORCETOC__' ),
'toc' => array( '0', '__İÇİNDEKİLER__', '__TOC__' ),
'noeditsection' => array( '0', '__DEĞİŞTİRYOK__', '__DÜZENLEMEYOK__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__BAÅžLIKYOK__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'MEVCUTAY', 'MEVCUTAY2', 'GÃœNCELAY', 'GÃœNCELAY2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'MEVCUTAY1', 'GÃœNCELAY1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'MEVCUTAYADI', 'GÃœNCELAYADI', 'CURRENTMONTHNAME' ),
- 'currentmonthnamegen' => array( '1', 'MEVCUTAYADIÄ°YELÄ°K', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthnamegen' => array( '1', 'MEVCUTAYADIÄ°YELÄ°K', 'GÃœNCELAYADIÄ°YELÄ°K', 'CURRENTMONTHNAMEGEN' ),
'currentmonthabbrev' => array( '1', 'MEVCUTAYKISALTMASI', 'GÃœNCELAYKISALTMASI', 'CURRENTMONTHABBREV' ),
'currentday' => array( '1', 'MEVCUTGÃœN', 'GÃœNCELGÃœN', 'CURRENTDAY' ),
'currentday2' => array( '1', 'MEVCUTGÃœN2', 'GÃœNCELGÃœN2', 'CURRENTDAY2' ),
@@ -221,6 +224,7 @@ $magicWords = array(
'pagenamee' => array( '1', 'SAYFAADIU', 'PAGENAMEE' ),
'namespace' => array( '1', 'ADALANI', 'Ä°SÄ°MALANI', 'NAMESPACE' ),
'namespacee' => array( '1', 'ADALANIU', 'Ä°SÄ°MALANIU', 'NAMESPACEE' ),
+ 'namespacenumber' => array( '1', 'ADALANINUMARASI', 'NAMESPACENUMBER' ),
'talkspace' => array( '1', 'TARTIÅžMAALANI', 'TARTIÅžMABOÅžLUÄžU', 'TALKSPACE' ),
'talkspacee' => array( '1', 'TARTIÅžMAALANIU', 'TARTIÅžMABOÅžLUÄžUU', 'TALKSPACEE' ),
'subjectspace' => array( '1', 'KONUALANI', 'MADDEALANI', 'KONUBOÅžLUÄžU', 'MADDEBOÅžLUÄžU', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -236,9 +240,9 @@ $magicWords = array(
'subjectpagename' => array( '1', 'KONUSAYFASIADI', 'MADDESAYFASIADI', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
'subjectpagenamee' => array( '1', 'KONUSAYFASIADIU', 'MADDESAYFASIADIU', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
'msg' => array( '0', 'MSJ:', 'Ä°LT:', 'MSG:' ),
- 'subst' => array( '0', 'KOPYALA:', 'AKTAR:', 'SUBST:' ),
- 'safesubst' => array( '0', 'GÃœVENLÄ°AKTAR:', 'SAFESUBST:' ),
- 'msgnw' => array( '0', 'MSJNW:', 'MSGNW:' ),
+ 'subst' => array( '0', 'YK:', 'YERÄ°NEKOY:', 'KOPYALA:', 'AKTAR:', 'YAPIÅžTIR:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'GÃœVENLÄ°YERÄ°NEKOY:', 'GÃœVENLÄ°KOPYALA:', 'GÃœVENLÄ°AKTAR:', 'GÃœVENLÄ°YAPIÅžTIR:', 'SAFESUBST:' ),
+ 'msgnw' => array( '0', 'MSJYN:', 'Ä°LTYN:', 'MSGNW:' ),
'img_thumbnail' => array( '1', 'küçükresim', 'küçük', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', 'küçükresim=$1', 'küçük=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'saÄŸ', 'right' ),
@@ -260,18 +264,20 @@ $magicWords = array(
'img_bottom' => array( '1', 'taban', 'bottom' ),
'img_text_bottom' => array( '1', 'metin-taban', 'text-bottom' ),
'img_link' => array( '1', 'bağlantı=$1', 'link=$1' ),
+ 'img_class' => array( '1', 'sınıf=$1', 'class=$1' ),
'int' => array( '0', 'Ä°NT:', 'INT:' ),
'sitename' => array( '1', 'SÄ°TEADI', 'SITENAME' ),
'ns' => array( '0', 'AA:', 'AB:', 'NS:' ),
'nse' => array( '0', 'AAU:', 'ABU:', 'NSE:' ),
'localurl' => array( '0', 'YERELURL:', 'LOCALURL:' ),
'localurle' => array( '0', 'YERELURLU:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'MADDEYOLU', 'ARTICLEPATH' ),
'pageid' => array( '0', 'SAYFANO', 'PAGEID' ),
'server' => array( '0', 'SUNUCU', 'SERVER' ),
'servername' => array( '0', 'SUNUCUADI', 'SERVERNAME' ),
'scriptpath' => array( '0', 'BETÄ°KYOLU', 'SCRIPTPATH' ),
'stylepath' => array( '0', 'BİÇEMYOLU', 'STYLEPATH' ),
- 'grammar' => array( '0', 'GRAMER:', 'GRAMMAR:' ),
+ 'grammar' => array( '0', 'DÄ°LBÄ°LGÄ°SÄ°:', 'GRAMER:', 'GRAMMAR:' ),
'gender' => array( '0', 'CÄ°NSÄ°YET:', 'GENDER:' ),
'notitleconvert' => array( '0', '__BAŞLIKDÖNÜŞÜMÜYOK__', '__BDY__', '__NOTITLECONVERT__', '__NOTC__' ),
'nocontentconvert' => array( '0', '__İÇERİKDÖNÜŞÜMÜYOK__', '__İDY__', '__NOCONTENTCONVERT__', '__NOCC__' ),
@@ -283,13 +289,15 @@ $magicWords = array(
'revisionday' => array( '1', 'SÜRÜMGÜNÜ', 'REVISIONDAY' ),
'revisionday2' => array( '1', 'SÜRÜMGÜNÜ2', 'REVISIONDAY2' ),
'revisionmonth' => array( '1', 'SÃœRÃœMAYI', 'REVISIONMONTH' ),
+ 'revisionmonth1' => array( '1', 'SÃœRÃœMAYI1', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'SÃœRÃœMYILI', 'REVISIONYEAR' ),
'revisiontimestamp' => array( '1', 'SÃœRÃœMZAMANBÄ°LGÄ°SÄ°', 'REVISIONTIMESTAMP' ),
'revisionuser' => array( '1', 'SÃœRÃœMKULLANICI', 'REVISIONUSER' ),
'plural' => array( '0', 'ÇOĞUL:', 'PLURAL:' ),
'fullurl' => array( '0', 'TAMURL:', 'FULLURL:' ),
'fullurle' => array( '0', 'TAMURLU:', 'FULLURLE:' ),
- 'canonicalurl' => array( '0', 'KANONÄ°KURL', 'CANONICALURL:' ),
+ 'canonicalurl' => array( '0', 'KURALLIURL:', 'CANONICALURL:' ),
+ 'canonicalurle' => array( '0', 'KURALLIURLU:', 'CANONICALURLE:' ),
'lcfirst' => array( '0', 'KHÄ°LK:', 'LCFIRST:' ),
'ucfirst' => array( '0', 'BHÄ°LK:', 'UCFIRST:' ),
'lc' => array( '0', 'KH:', 'LC:' ),
@@ -299,15 +307,22 @@ $magicWords = array(
'newsectionlink' => array( '1', '__YENÄ°BAÅžLIKBAÄžLANTISI__', '__NEWSECTIONLINK__' ),
'nonewsectionlink' => array( '1', '__YENÄ°BAÅžLIKBAÄžLANTISIYOK__', '__NONEWSECTIONLINK__' ),
'currentversion' => array( '1', 'MEVCUTSÃœRÃœM', 'GÃœNCELSÃœRÃœM', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'URLKODLAMA:', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', 'ÇENGELKODLAMA:', 'ANCHORENCODE' ),
'currenttimestamp' => array( '1', 'MEVCUTZAMANBÄ°LGÄ°SÄ°', 'GÃœNCELZAMANBÄ°LGÄ°SÄ°', 'CURRENTTIMESTAMP' ),
'localtimestamp' => array( '1', 'YERELZAMANBÄ°LGÄ°SÄ°', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'YÖNİŞARETİ:', 'DIRECTIONMARK', 'DIRMARK' ),
'language' => array( '0', '#DÄ°L:', '#LÄ°SAN:', '#LANGUAGE:' ),
'contentlanguage' => array( '1', 'İÇERİKDİLİ', 'İÇERİKLİSANI', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
'pagesinnamespace' => array( '1', 'Ä°SÄ°MALANINDAKÄ°SAYFALAR', 'Ä°ADAKÄ°SAYFALAR', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
'numberofadmins' => array( '1', 'HÄ°ZMETLÄ°SAYISI', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'BİÇİMNUM', 'FORMATNUM' ),
+ 'padleft' => array( '0', 'DOLSOL', 'PADLEFT' ),
+ 'padright' => array( '0', 'DOLSAÄž', 'PADRIGHT' ),
'special' => array( '0', 'özel', 'special' ),
+ 'speciale' => array( '0', 'özelu', 'speciale' ),
'defaultsort' => array( '1', 'VARSAYILANSIRALA:', 'VARSAYILANSIRALAMAANAHTARI:', 'VARSAYILANKATEGORÄ°SIRALA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
- 'filepath' => array( '0', 'DOSYA_YOLU:', 'FILEPATH:' ),
+ 'filepath' => array( '0', 'DOSYAYOLU:', 'DOSYA_YOLU:', 'FILEPATH:' ),
'tag' => array( '0', 'etiket', 'tag' ),
'hiddencat' => array( '1', '__GÄ°ZLÄ°KAT__', '__GÄ°ZLÄ°KATEGORÄ°__', '__HIDDENCAT__' ),
'pagesincategory' => array( '1', 'KATEGORÄ°DEKÄ°SAYFALAR', 'KATTAKÄ°SAYFALAR', 'PAGESINCATEGORY', 'PAGESINCAT' ),
@@ -317,8 +332,15 @@ $magicWords = array(
'numberingroup' => array( '1', 'GRUPTAKÄ°SAYI', 'GRUBUNSAYISI', 'NUMBERINGROUP', 'NUMINGROUP' ),
'staticredirect' => array( '1', '__STATİKYÖNLENDİRME__', '__SABİTYÖNLENDİRME__', '__STATICREDIRECT__' ),
'protectionlevel' => array( '1', 'KORUMASEVÄ°YESÄ°', 'PROTECTIONLEVEL' ),
- 'formatdate' => array( '0', 'formattarihi', 'tarihformatı', 'formatdate', 'dateformat' ),
+ 'formatdate' => array( '0', 'biçimtarih', 'tarihbiçimi', 'formattarihi', 'tarihformatı', 'formatdate', 'dateformat' ),
+ 'url_path' => array( '0', 'YOL', 'PATH' ),
'url_wiki' => array( '0', 'VÄ°KÄ°', 'WIKI' ),
+ 'url_query' => array( '0', 'SORGU', 'QUERY' ),
+ 'defaultsort_noerror' => array( '0', 'hatayok', 'hatasız', 'noerror' ),
+ 'pagesincategory_all' => array( '0', 'tüm', 'all' ),
+ 'pagesincategory_pages' => array( '0', 'sayfalar', 'pages' ),
+ 'pagesincategory_subcats' => array( '0', 'altkategoriler', 'subcats' ),
+ 'pagesincategory_files' => array( '0', 'dosyalar', 'files' ),
);
$separatorTransformTable = array( ',' => '.', '.' => ',' );
@@ -470,7 +492,6 @@ $messages = array(
'qbbrowse' => 'Tara',
'qbedit' => 'DeÄŸiÅŸtir',
'qbpageoptions' => 'Bu sayfa',
-'qbpageinfo' => 'BaÄŸlam',
'qbmyoptions' => 'Sayfalarım',
'qbspecialpages' => 'Özel sayfalar',
'faq' => 'SSS',
@@ -493,6 +514,7 @@ $messages = array(
'namespaces' => 'Ad alanları',
'variants' => 'Türevler',
+'navigation-heading' => 'Dolaşım menüsü',
'errorpagetitle' => 'Hata',
'returnto' => '$1 sayfasına geri dön.',
'tagline' => '{{SITENAME}} sitesinden',
@@ -727,11 +749,10 @@ Verilen sebep: ''$2''.",
# Login and logout pages
'logouttext' => "'''Oturumu kapattınız.'''
-Şimdi anonim olarak {{SITENAME}} sitesini kullanmaya devam edebilirsiniz ya da aynı kullanıcı adıyla ya da ister başka bir kullanıcı adıyla [[Special:UserLogin|yeniden oturum açabilirsiniz]].
+Şimdi anonim olarak {{SITENAME}} sitesini kullanmaya devam edebilirsiniz ya da aynı kullanıcı adıyla ya da ister başka bir kullanıcı adıyla <span class='plainlinks'>[$1 yeniden oturum açabilirsiniz]</span>.
Tarayıcınızın önbelleğini temizleyene kadar bazı sayfalar sanki hâlâ oturumunuz açıkmış gibi görünebilir.",
-'welcomecreation' => '== HoÅŸ geldin, $1! ==
-
-Hesabınız açıldı.
+'welcomeuser' => 'HoÅŸ geldin $1!',
+'welcomecreation-msg' => 'Hesabınız açıldı.
[[Special:Preferences|{{SITENAME}} tercihlerinizi]] değiştirmeyi unutmayın.',
'yourname' => 'Kullanıcı adı:',
'yourpassword' => 'Parola:',
@@ -755,7 +776,7 @@ Hesabınız açıldı.
'gotaccount' => 'Zaten bir hesabınız var mı? $1.',
'gotaccountlink' => 'Oturum açın',
'userlogin-resetlink' => 'GiriÅŸ bilgilerinizi mi unuttunuz?',
-'createaccountmail' => 'e-posta ile',
+'createaccountmail' => 'Geçici bir rastgele şifre kullan ve şifreyi aşağıda belirtilen e-posta adresine gönder',
'createaccountreason' => 'Sebep:',
'badretype' => 'GirdiÄŸiniz ÅŸifreler birbirleriyle uyuÅŸmuyor.',
'userexists' => 'Girdiğiniz kullanıcı adı zaten kullanımda.
@@ -886,6 +907,7 @@ Geçici şifre: $2',
'changeemail-oldemail' => 'Mevcut E-posta adresi:',
'changeemail-newemail' => 'Yeni E-posta adresi:',
'changeemail-none' => '(yok)',
+'changeemail-password' => '{{SITENAME}} parolanız:',
'changeemail-submit' => "E-posta'yı değiştir",
'changeemail-cancel' => 'Ä°ptal',
@@ -1055,7 +1077,6 @@ Son günlük girdisi referans amaçlı aşağıda verilmiştir:",
'template-semiprotected' => '(yarı-korumada)',
'hiddencategories' => 'Bu sayfa {{PLURAL:$1|1 gizli kategoriye|$1 gizli kategoriye}} mensuptur:',
'edittools' => '<!-- Buradaki metin düzenleme ve yükleme formlarının altında gösterilecektir. -->',
-'nocreatetitle' => 'Sayfa oluşturulması sınırlandı',
'nocreatetext' => '{{SITENAME}}, yeni sayfa oluÅŸturulabilmesini engelledi.
Geri giderek varolan sayfayı değiştirebilirsiniz ya da kayıtlı iseniz [[Special:UserLogin|oturum açabilir]], değilseniz [[Special:UserLogin|kayıt olabilirsiniz]].',
'nocreate-loggedin' => 'Yeni sayfalar oluÅŸturmaya yetkiniz yok.',
@@ -1080,6 +1101,14 @@ Silinmiş görünüyor.',
'edit-already-exists' => 'Yeni sayfa oluşturulamıyor.
Sayfa zaten mevcut.',
'defaultmessagetext' => 'Varsayılan mesaj metni',
+'invalid-content-data' => 'Geçersiz içerik verisi',
+'content-not-allowed-here' => '"$1" içeriğine, [[$2]] sayfasında izin verilmemekte.',
+
+# Content models
+'content-model-wikitext' => 'vikimetin',
+'content-model-text' => 'düz metin',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Uyarı: Bu sayfa çok fazla zengin derleyici fonksiyonu çağrısı içeriyor.
@@ -1438,9 +1467,9 @@ Kullanabileceğiniz rastgele-üretilmiş bir değer: $1',
'prefs-emailconfirm-label' => 'E-posta doğrulaması:',
'prefs-textboxsize' => 'DeÄŸiÅŸtirme penceresinin boyutu',
'youremail' => 'E-posta:',
-'username' => 'Kullanıcı adı:',
-'uid' => 'Kullanıcı kimliği:',
-'prefs-memberingroups' => '{{PLURAL:$1|Grup|Grup}} üyesi:',
+'username' => '{{GENDER:$1|Kullanıcı adı}}:',
+'uid' => '{{GENDER:$1|Kullanıcı}} kimliği:',
+'prefs-memberingroups' => '{{GENDER:$2|Üye}} {{PLURAL:$1|group|grupları}}:',
'prefs-registration' => 'Kayıt zamanı:',
'yourrealname' => 'Gerçek adınız:',
'yourlanguage' => 'Dil:',
@@ -1588,12 +1617,13 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
'right-sendemail' => 'Diğer kullanıcılara e-posta gönder',
'right-passwordreset' => 'Parola sıfırlama e-postalarını görür',
+# Special:Log/newusers
+'newuserlogpage' => 'Yeni kullanıcı kayıtları',
+'newuserlogpagetext' => 'En son kaydolan kullanıcı kayıtları.',
+
# User rights log
'rightslog' => 'Kullanıcı hakları kayıtları',
'rightslogtext' => 'Kullanıcı hakları değişiklikleri kayıtları.',
-'rightslogentry' => '$1 adlı kullanıcının yetkileri $2 iken $3 olarak değiştirildi',
-'rightslogentry-autopromote' => '$2 otomatik olarak yükseltilerek $3 yapıldı.',
-'rightsnone' => '(hiçbiri)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'bu sayfayı okumaya',
@@ -2033,6 +2063,8 @@ Dosya açıklamasını düzenlemek isterseniz, [$2 dosya açıklama sayfası] bu
'disambiguationspage' => 'Template:Anlam ayrımı',
'disambiguations-text' => 'İlk satırda yer alan sayfalar bir anlam ayrım sayfasına iç bağlantı olduğunu gösterir. İkinci sırada yer alan sayfalar anlam ayrım sayfalarını gösterir. <br />Burada [[MediaWiki:Disambiguationspage]] tüm anlam ayrım şablonlarına bağlantılar verilmesi gerekmektedir.',
+'pageswithprop-submit' => 'Git',
+
'doubleredirects' => 'Çift yönlendirmeler',
'doubleredirectstext' => 'Bu sayfa diğer yönlendirme sayfalarına yönlendirme yapan sayfaları listeler.
Her satırın içerdiği bağlantılar; birinci ve ikinci yönlendirme, ayrıca ikinci yönlendirmenin hedefi, ki bu genelde birinci yönlendirmenin göstermesi gereken "gerçek" hedef sayfasıdır.
@@ -2179,7 +2211,7 @@ Ayrıca [[Special:WantedCategories|İstenen kategoriler]]'e bakınız.",
'linksearch-ok' => 'Ara',
'linksearch-text' => '"*.wikipedia.org" gibi jokerler kullanılabilir.
En az bir üst-seviye alan gerekir, örneğin "*.org".<br />
-Desteklenen iletişim kuralları: <code>$1</code> (bunların hiçbirini aramanıza eklemeyin).',
+Desteklenen {{PLURAL:$2|iletişim kuralı|iletişim kuralları}}: <code>$1</code> (herhangi bir iletişim kuralı belirtmezseniz http:// otomatik olarak eklenir).',
'linksearch-line' => "$1'e $2'den bağlantı verilmiş",
'linksearch-error' => 'Jokerler sadece ana makine adının başında görünebilir.',
@@ -2198,10 +2230,6 @@ Desteklenen iletişim kuralları: <code>$1</code> (bunların hiçbirini aramanı
'activeusers-hidesysops' => 'Yöneticileri gizle',
'activeusers-noresult' => 'Kullanıcı bulunamadı.',
-# Special:Log/newusers
-'newuserlogpage' => 'Yeni kullanıcı kayıtları',
-'newuserlogpagetext' => 'En son kaydolan kullanıcı kayıtları.',
-
# Special:ListGroupRights
'listgrouprights' => 'Kullanıcı grubu hakları',
'listgrouprights-summary' => 'Aşağıdaki bu vikide tanımlanan kullanıcı gruplarının, ilgili erişim haklarıyla birlikte listesidir.
@@ -2296,39 +2324,48 @@ Bundan sonra, bu sayfaya ve ilgili tartışma sayfasına yapılacak değişiklik
'enotif_mailer' => '{{SITENAME}} Bildirim Postası',
'enotif_reset' => 'Tüm sayfaları ziyaret edilmiş olarak işaretle',
-'enotif_newpagetext' => 'Yeni bir sayfa.',
'enotif_impersonal_salutation' => '{{SITENAME}} kullanıcı',
-'changed' => 'deÄŸiÅŸtirildi',
-'created' => 'oluÅŸturuldu',
-'enotif_subject' => '{{SITENAME}} sayfası $PAGETITLE, $PAGEEDITOR tarafından $CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}} sayfası $1, $2 tarafından {{GENDER:$2|silindi}}.',
+'enotif_subject_created' => '{{SITENAME}} sayfası $1, $2 tarafından {{GENDER:$2|açıldı}}.',
+'enotif_subject_moved' => '{{SITENAME}} sayfası $1, $2 tarafından {{GENDER:$2|taşındı}}.',
+'enotif_subject_restored' => '{{SITENAME}} sayfası $1, $2 tarafından {{GENDER:$2|geri getirildi}}.',
+'enotif_subject_changed' => '{{SITENAME}} sayfası $1, $2 tarafından {{GENDER:$2|değiştirildi}}.',
+'enotif_body_intro_deleted' => '{{SITENAME}} sayfası $1, $2 tarafından $PAGEEDITDATE tarihinde {{GENDER:$2|silindi}}, bakınız: $3.',
+'enotif_body_intro_created' => '{{SITENAME}} sayfası $1, $2 tarafından $PAGEEDITDATE tarihinde {{GENDER:$2|açıldı}}, mevcut revizyon için bakınız: $3.',
+'enotif_body_intro_moved' => '{{SITENAME}} sayfası $1, $2 tarafından $PAGEEDITDATE tarihinde {{GENDER:$2|taşındı}}, mevcut revizyon için bakınız: $3.',
+'enotif_body_intro_restored' => '{{SITENAME}} sayfası $1, $2 tarafından $PAGEEDITDATE tarihinde {{GENDER:$2|geri getirildi}}, mevcut revizyon için bakınız: $3.',
+'enotif_body_intro_changed' => '{{SITENAME}} sayfası $1, $2 tarafından $PAGEEDITDATE tarihinde {{GENDER:$2|değiştirildi}}, mevcut revizyon için bakınız: $3.',
'enotif_lastvisited' => "Son ziyaretinizden bu yana olan tüm değişiklikleri görmek için $1'e bakın.",
'enotif_lastdiff' => 'Bu değişikliği görmek için, $1 sayfasına bakınız.',
'enotif_anon_editor' => 'anonim kullanıcı $1',
'enotif_body' => 'Sayın $WATCHINGUSERNAME,
-{{SITENAME}} bünyesindeki $PAGETITLE başlıklı sayfa $PAGEEDITDATE tarihinde $PAGEEDITOR tarafından $CHANGEDORCREATED. Sayfanın son haline $PAGETITLE_URL adresinden ulaşabilirsiniz.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
-Değişikliği yapan kullanıcının açıklaması: $PAGESUMMARY $PAGEMINOREDIT
+Editörün girdiği özet: $PAGESUMMARY $PAGEMINOREDIT
-Sayfayı değiştiren kullanıcıya erişim bilgileri:
-E-posta: $PAGEEDITOR_EMAIL
-Viki: $PAGEEDITOR_WIKI
+Editörün iletişim bilgileri:
+e-posta: $PAGEEDITOR_EMAIL
+viki: $PAGEEDITOR_WIKI
-Bahsi geçen sayfayı ziyaret edinceye kadar sayfayla ilgili başka değişiklik bildirimi gönderilmeyecektir. İzleme listenizdeki tüm sayfalar bildirim durumlarını sıfırlayabilirsiniz.
+Bahsi geçen sayfayı ziyaret edinceye kadar sayfayla ilgili başka bildirim gönderilmeyecektir. Ayrıca izleme listenizdeki tüm sayfaların bildirim durumlarını sıfırlayabilirsiniz.
- {{SITENAME}} sitesinin uyarı sistemi.
+{{SITENAME}} bildirim sistemi
--
-İzleme listesi ayarlarınızı değiştirmek için:
+E-posta bildirim ayarlarınızı değiştirmek için aşağıdaki sayfayı ziyaret ediniz:
+{{canonicalurl:{{#special:Preferences}}}}
+
+İzleme listesi ayarlarınızı değiştirmek için aşağıdaki sayfayı ziyaret ediniz:
{{canonicalurl:{{#special:EditWatchlist}}}}
-Sayfayı izleme listenizden silmek için:
+Sayfayı izleme listenizden silmek için aşağıdaki sayfayı ziyaret ediniz:
$UNWATCHURL
Geri bildirim ve daha fazla yardım için:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'oluÅŸturuldu',
+'changed' => 'deÄŸiÅŸtirildi',
# Delete
'deletepage' => 'Sayfayı sil',
@@ -2481,7 +2518,8 @@ Revizyon onarılmış veya arşivden silinmiş olabilir ya da sahip olduğunuz b
'undeletedrevisions' => 'Toplam {{PLURAL:$1|1 kayıt|$1 kayıt}} geri getirildi.',
'undeletedrevisions-files' => '{{PLURAL:$1|1 revizyon|$1 revizyon}} ve {{PLURAL:$2|1 dosya|$2 dosya}} eski konumuna getirildi',
'undeletedfiles' => '{{PLURAL:$1|1 dosya|$1 dosya}} geri getirildi.',
-'cannotundelete' => 'Sayfayı ya da medyayı sizden önce bir başka kullanıcı geri getirdiğinden dolayı sizin geri getirme işleminiz geçersiz.',
+'cannotundelete' => 'Silme başarısız oldu:
+$1',
'undeletedpage' => "'''$1 sayfası geri getirildi'''
Önceki silme ve geri getirme işlemleri için [[Special:Log/delete|silme kayıtları]]na bakınız.",
@@ -2511,7 +2549,7 @@ $1',
'blanknamespace' => '(Ana)',
# Contributions
-'contributions' => 'Kullanıcının katkıları',
+'contributions' => '{{GENDER:$1|Kullanıcı}} katkıları',
'contributions-title' => '$1 için kullanıcı katkıları',
'mycontris' => 'Katkılar',
'contribsub2' => '$1 ($2)',
@@ -2894,7 +2932,6 @@ Geçici dosya kayıp.',
# JavaScriptTest
'javascripttest' => 'JavaScript denemesi',
-'javascripttest-disabled' => 'Bu işlev, bu viki üzerinde etkinleştirilmedi.',
'javascripttest-title' => '$1 testleri çalışıyor',
'javascripttest-qunit-intro' => 'mediawiki.org üzerinden [$1 deneme belgelerine] bakınız.',
'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit deneme paketi',
@@ -3008,6 +3045,7 @@ Geçici dosya kayıp.',
'pageinfo-default-sort' => 'Varsayılan sıralama anahtarı',
'pageinfo-length' => 'Sayfa uzunluÄŸu (bayt cinsinden)',
'pageinfo-article-id' => 'Sayfa ID',
+'pageinfo-language' => 'Sayfa içeriğinin dili',
'pageinfo-robot-policy' => 'Arama motoru durumu',
'pageinfo-robot-index' => 'Ä°ndekslenebilir',
'pageinfo-robot-noindex' => 'Ä°ndekslenemez',
@@ -3027,6 +3065,17 @@ Geçici dosya kayıp.',
'pageinfo-magic-words' => 'Sihirli {{PLURAL:$1|kelimeler|kelimeler}} ($1)',
'pageinfo-hidden-categories' => 'Gizli {{PLURAL:$1|kategori|kategoriler}} ($1)',
'pageinfo-templates' => 'Görüntülenen {{PLURAL:$1|şablon|şablonlar}} ($1)',
+'pageinfo-toolboxlink' => 'Sayfa bilgisi',
+'pageinfo-redirectsto' => 'Yönlendirilen',
+'pageinfo-redirectsto-info' => 'bilgi',
+'pageinfo-contentpage' => 'Bir içerik sayfası sayılır',
+'pageinfo-contentpage-yes' => 'Evet',
+'pageinfo-protect-cascading-yes' => 'Evet',
+'pageinfo-protect-cascading-from' => 'Korumalar üzerinden geçiş',
+'pageinfo-category-info' => 'Kategori bilgileri',
+'pageinfo-category-pages' => 'Sayfa sayısı',
+'pageinfo-category-subcats' => 'Alt kategori sayısı',
+'pageinfo-category-files' => 'Dosya sayısı',
# Skin names
'skinname-standard' => 'Klasik',
@@ -3078,6 +3127,7 @@ Bunu çalıştırmak, sisteminizi tehlikeye atabilir.",
'file-nohires' => 'Daha yüksek çözünürlük yok.',
'svg-long-desc' => 'SVG dosyası, sözde $1 × $2 piksel, dosya boyutu: $3',
'svg-long-desc-animated' => 'Hareketli SVG dosyası, sözde $1 × $2 piksel, dosya boyutu: $3',
+'svg-long-error' => 'Geçersiz SVG dosyası: $1',
'show-big-image' => 'Tam çözünürlük',
'show-big-image-preview' => 'Ön izleme boyutu: $1.',
'show-big-image-other' => 'Diğer {{PLURAL:$2|çözünürlük|çözünürlükleri}}: $1.',
@@ -3109,7 +3159,10 @@ Bunu çalıştırmak, sisteminizi tehlikeye atabilir.",
'minutes' => '{{PLURAL:$1|$1 dakika|$1 dakika}}',
'hours' => '{{PLURAL:$1|$1 saat|$1 saat}}',
'days' => '{{PLURAL:$1|$1 gün|$1 gün}}',
+'months' => '{{PLURAL:$1|$1 ay|$1 ay}}',
+'years' => '{{PLURAL:$1|$1 yıl|$1 yıl}}',
'ago' => '$1 önce',
+'just-now' => 'Hemen ÅŸimdi',
# Bad image list
'bad_image_list' => 'Biçim aşağıdaki gibidir:
@@ -3865,7 +3918,7 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
'logentry-newusers-create' => 'Kullanıcı hesabı $1 oluşturdu',
'logentry-newusers-create2' => '$1 kullanıcı hesabı oluşturdu $3',
'logentry-newusers-autocreate' => '$1 hesabı otomatik olarak oluşturuldu',
-'newuserlog-byemail' => 'e-posta yoluyla şifre gönderilmiştir',
+'rightsnone' => '(hiçbiri)',
# Feedback
'feedback-subject' => 'Konu:',
diff --git a/languages/messages/MessagesTru.php b/languages/messages/MessagesTru.php
index 98544077..f56cd048 100644
--- a/languages/messages/MessagesTru.php
+++ b/languages/messages/MessagesTru.php
@@ -464,6 +464,9 @@ Legend: '''({{int:cur}})''' = difference with latest revision, '''({{int:last}})
'group-user' => 'Hadome',
'group-all' => '(kulle)',
+# Special:Log/newusers
+'newuserlogpage' => 'User creation log',
+
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'Mşaḥlaf iFaṭaṭe',
@@ -585,9 +588,6 @@ The description on its [$2 file description page] there is shown below.',
# Special:ListUsers
'listusers-submit' => 'Maḥway',
-# Special:Log/newusers
-'newuserlogpage' => 'User creation log',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Gudo',
'listgrouprights-rights' => 'Ḥaqat',
diff --git a/languages/messages/MessagesTs.php b/languages/messages/MessagesTs.php
index 8005bb16..a1ad946d 100644
--- a/languages/messages/MessagesTs.php
+++ b/languages/messages/MessagesTs.php
@@ -138,7 +138,6 @@ $messages = array(
'qbfind' => 'Kuma',
'qbedit' => 'Lulamisa',
'qbpageoptions' => 'Tluka leri',
-'qbpageinfo' => 'mongo',
'qbmyoptions' => 'Matluka ya mina',
'qbspecialpages' => 'Matluka yohlawuleka',
'faq' => 'FAQ',
@@ -372,11 +371,8 @@ Hikwlaho ka xivangelo xa "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Uhumile eka wiki leyi.'''
-Ungaya emahlweni utirhisa {{SITENAME}} handle ko tipaluxa, kumbe unga [[Special:UserLogin|pfula unghena nakambe]] tani hi mutirhisa un'wana kumbe kumbe hivuxokoxoko bya wena.
+Ungaya emahlweni utirhisa {{SITENAME}} handle ko tipaluxa, kumbe unga <span class='plainlinks'>[$1 pfula unghena nakambe]</span> tani hi mutirhisa un'wana kumbe kumbe hivuxokoxoko bya wena.
Tsundzuka leswaku matluka man'wana mangaha komba onge upfule unghena eka wiki, loko ungasi sula tluka rakhompuyuta leri tsundzukaka matluka lawa uma vhakeleke.",
-'welcomecreation' => '== Hoyohoyo, eka Wena $1 ! ==
-Akhawunti yawena yitumbuluxiwile.
-Unda rivali ku cinca [[Special:Preferences|{{SITENAME}} minhlawulo ya wena]].',
'yourname' => 'Vito ra vutirhisi',
'yourpassword' => 'Vito-mpfungulo:',
'yourpasswordagain' => 'Thlela u hoxa ritompfungulo ra wena:',
@@ -568,6 +564,9 @@ Adiresi ya wena ya e-mail yitunberile loko van'wana va bula na wena.",
'right-move-subpages' => "yisa matluka lawa na matluka-ntsongo ya wona, kun'wana",
'right-delete' => 'Sula matluka lawa',
+# Special:Log/newusers
+'newuserlogpage' => 'Nghula ya nxaxamelo wa ku tumbuluxiwa ka vatirhisi',
+
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'hlaya tluka leri',
'action-edit' => 'Lulamisa tluka leri',
@@ -694,9 +693,6 @@ Nhlamuselo ya yona leyi nge ndzeni ka [$2 tluka ro hlamusela] hi yona leyi kombi
'linksearch-ok' => 'Lava',
'linksearch-line' => '$1 yi khwekerisiwe kusuka eka $2',
-# Special:Log/newusers
-'newuserlogpage' => 'Nghula ya nxaxamelo wa ku tumbuluxiwa ka vatirhisi',
-
# Special:ListGroupRights
'listgrouprights-members' => '(nxaxamelo wa valandzeri)',
diff --git a/languages/messages/MessagesTt_cyrl.php b/languages/messages/MessagesTt_cyrl.php
index c8216f13..26db15a6 100644
--- a/languages/messages/MessagesTt_cyrl.php
+++ b/languages/messages/MessagesTt_cyrl.php
@@ -13,6 +13,7 @@
* @author Haqmar
* @author Himiq Dzyu
* @author KhayR
+ * @author MF-Warburg
* @author Marat Vildanov
* @author Reedy
* @author Rinatus
@@ -355,7 +356,6 @@ $messages = array(
'qbbrowse' => 'Карау',
'qbedit' => 'Үзгәртү',
'qbpageoptions' => 'Бу бит',
-'qbpageinfo' => 'Бит турында мәгълүмат',
'qbmyoptions' => 'Битләрем',
'qbspecialpages' => 'МахÑÑƒÑ Ð±Ð¸Ñ‚Ð»Ó™Ñ€',
'faq' => 'ЕБС',
@@ -606,11 +606,9 @@ $2',
# Login and logout pages
'logouttext' => "'''Сез хиÑап Ñзмагыздан чыктыгыз.'''
-Сез {{SITENAME}} проектында аноним рәвештә кала ÑиÑÓ™ шул ук Ñки башка иÑем белән Ñңадан [[Special:UserLogin|керә]] алаÑыз.
+Сез {{SITENAME}} проектында аноним рәвештә кала ÑиÑÓ™ шул ук Ñки башка иÑем белән Ñңадан <span class='plainlinks'>[$1 керә]</span> алаÑыз.
Кайбер битләр Сез кергән кебек күрÑәтелергә мөмкин. Моны бетерү өчен браузер кÑшын чиÑтартыгыз.",
-'welcomecreation' => '== Рәхим итегез, $1! ==
-Сез теркәлдегез.
-Сайтның шәхÑи [[Special:Preferences|көйләнмәләрен]] карарга онытмагыз.',
+'welcomeuser' => 'Хуш килдегез, $1!',
'yourname' => 'Кулланучы иÑеме:',
'yourpassword' => 'СерÑүз:',
'yourpasswordagain' => 'СерÑүзне кабат кертү:',
@@ -758,6 +756,7 @@ $2
'changeemail-oldemail' => 'Хәзерге Ñлектрон әрҗә адреÑÑ‹:',
'changeemail-newemail' => 'Яңа Ñлектрон почта адреÑÑ‹:',
'changeemail-none' => '(юк)',
+'changeemail-password' => '«{{SITENAME}}» проекты өчен ÑерÑүзегез:',
'changeemail-submit' => 'E-mail адреÑын үзгәртү',
'changeemail-cancel' => 'Баш тарту',
@@ -931,7 +930,6 @@ $2
'template-protected' => '(Ñкланган)',
'template-semiprotected' => '(өлешчә Ñкланган)',
'hiddencategories' => 'Бу бит $1 {{PLURAL:$1|Ñшерен төркемгә}} керә:',
-'nocreatetitle' => 'Битләр төзү чикләнгән',
'nocreatetext' => '{{SITENAME}}: Ñайтта Ñңа битләр төзү чикләнгән.
Сез артка кайтып, төзелгән битне үзгәртә алаÑыз. [[Special:UserLogin|Керергә ÑиÑÓ™ теркәлергә]] тәгъдим ителә.',
'nocreate-loggedin' => 'Сезгә Ñңа битләр төзү хокукы бирелмәгән.',
@@ -1349,10 +1347,12 @@ $1",
'right-delete' => 'битләрне бетерү',
'right-editinterface' => 'Кулланучы интерфейÑын үзгәртү',
+# Special:Log/newusers
+'newuserlogpage' => 'Кулланучыларны теркәү көндәлеге',
+'newuserlogpagetext' => 'Яңа теркәлгән кулланучылар иÑемлеге',
+
# User rights log
'rightslog' => 'Кулланучының хокуклары көндәлеге',
-'rightslogentry' => '$1 кулланучыÑын $2 группаÑыннан $3 группаÑына күчерде',
-'rightsnone' => '(юк)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'бу битне укырга',
@@ -1710,10 +1710,6 @@ PICT # төрле
'activeusers-hidesysops' => 'Идарәчеләрне Ñшер',
'activeusers-noresult' => 'Кулланучылар табылмады.',
-# Special:Log/newusers
-'newuserlogpage' => 'Кулланучыларны теркәү көндәлеге',
-'newuserlogpagetext' => 'Яңа теркәлгән кулланучылар иÑемлеге',
-
# Special:ListGroupRights
'listgrouprights' => 'Кулланучы төркемнәренең хокуклары',
'listgrouprights-group' => 'Төркем',
@@ -1769,11 +1765,7 @@ PICT # төрле
'watching' => 'Күзәтү иÑемлегемә Ó©Ñтәүе…',
'unwatching' => 'Күзәтү иÑемлегемнән чыгаруы…',
-'enotif_newpagetext' => 'Бу Ñңа бит.',
'enotif_impersonal_salutation' => '{{SITENAME}} кулланучы',
-'changed' => 'үзгәртелде',
-'created' => 'төзергән',
-'enotif_subject' => '{{SITENAME}} проектының $PAGETITLE бите $PAGEEDITOR тарафыннан $CHANGEDORCREATED',
'enotif_lastvisited' => 'Соңгы керүегездән Ñоң булган барлык үзгәртүләрне күрер өчен, бу Ñылтама аша узыгыз: $1',
'enotif_body' => 'Хөрмәтле $WATCHINGUSERNAME,
@@ -1803,6 +1795,8 @@ $UNWATCHURL
Элемтә һәм Ñрдәм:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'төзергән',
+'changed' => 'үзгәртелде',
# Delete
'deletepage' => 'Битне бетерү',
@@ -1918,7 +1912,7 @@ $1',
'blanknamespace' => '(Төп)',
# Contributions
-'contributions' => 'Кулланучының кертеме',
+'contributions' => '{{GENDER:$1|Кулланучының}} кертеме',
'contributions-title' => '$1 иÑемле кулланучының кертеме',
'mycontris' => 'Кертем',
'contribsub2' => '$1 ($2) өчен',
@@ -2168,6 +2162,9 @@ $1',
# Spam protection
'spamprotectiontitle' => 'Спам фильтры',
+# Info page
+'pageinfo-toolboxlink' => 'Бит турында мәгълүмат',
+
# Skin names
'skinname-standard' => 'КлаÑÑик',
'skinname-nostalgia' => 'ИÑкә алу',
@@ -2545,7 +2542,7 @@ $1',
'logentry-newusers-create' => '$1 хиÑап ÑзмаÑÑ‹ төзеде',
'logentry-newusers-create2' => '$1 $3 кулланучы хиÑап ÑзмаÑын төзеде',
'logentry-newusers-autocreate' => 'Ðвтоматик рәвештә $1 хиÑап ÑзмаÑÑ‹ төзелде.',
-'newuserlog-byemail' => 'ÑерÑүз Ñлектрон почта аша җибәрелде',
+'rightsnone' => '(юк)',
# Feedback
'feedback-bugornote' => 'Әгәр дә Ñез техник проблеманы җентекләп таÑвирларга әзер икәнÑез, зинһар өчен, [$1 хата турында хәбәр итегез].
diff --git a/languages/messages/MessagesTt_latn.php b/languages/messages/MessagesTt_latn.php
index 3ecc02e7..826d8335 100644
--- a/languages/messages/MessagesTt_latn.php
+++ b/languages/messages/MessagesTt_latn.php
@@ -237,7 +237,6 @@ $messages = array(
'qbbrowse' => 'Qaraw',
'qbedit' => 'Üzgärtü',
'qbpageoptions' => 'Bu bit',
-'qbpageinfo' => 'Bit turında mäğlümatlar',
'qbmyoptions' => 'Bitlärem',
'qbspecialpages' => 'Maxsus bitlär',
'faq' => 'YBS',
@@ -477,11 +476,8 @@ Ul kürsätkän säbäp: ''$2''.",
# Login and logout pages
'logouttext' => "'''Sez xisap yazmağızdan çıqtığız.'''
-Sez {{SITENAME}} proyektında anonim räweştä qala yäisä şul uq yäki başqa isem belän yañadan [[Special:UserLogin|kerä]] alasız.
+Sez {{SITENAME}} proyektında anonim räweştä qala yäisä şul uq yäki başqa isem belän yañadan <span class='plainlinks'>[$1 kerä]</span> alasız.
Qayber bitlär Sez kergän kebek kürsätelergä mömkin. Monı beterü öçen brauzer keşın çistartığız.",
-'welcomecreation' => '== Räxim itegez, $1! ==
-Sez terkäldegez.
-Saytnıñ şäxsi [[Special:Preferences|köylänmälären]] qararğa onıtmağız.',
'yourname' => 'Qullanuçı iseme:',
'yourpassword' => 'Sersüz:',
'yourpasswordagain' => 'Sersüzne qabat kertü:',
@@ -735,7 +731,6 @@ Asta küzätü köndälegendäge soñğı yazma birelgän:",
'template-protected' => '(yaqlanÄŸan)',
'template-semiprotected' => '(öleşçä yaqlanğan)',
'hiddencategories' => 'Bu bit $1 {{PLURAL:$1|yäşeren törkemgä}} kerä:',
-'nocreatetitle' => 'Bitlär tözü çiklängän',
'nocreatetext' => '{{SITENAME}}: saytta yaña bitlär tözü çiklängän.
Sez artqa qaytıp, tözelgän bitne üzgärtä alasız. [[Special:UserLogin|Kerergä yäisä terkälergä]] täğdim itelä.',
'nocreate-loggedin' => 'Sezgä yaña bitlär tözü xoquqı birelmägän.',
@@ -1118,10 +1113,12 @@ Ul $1 {{PLURAL:$1|xäreftän}} kübräk bulırğa tieş tügel.',
'right-delete' => 'bitlärne beterü',
'right-editinterface' => 'Qullanuçı interfeysın üzgärtü',
+# Special:Log/newusers
+'newuserlogpage' => 'Qullanuçılarnı terkäw köndälege',
+'newuserlogpagetext' => 'Yaña terkälgän qullanuçılar isemlege',
+
# User rights log
'rightslog' => 'Qullanuçınıñ xoquqları köndälege',
-'rightslogentry' => '$1 qullanuçısın $2 gruppasınnan $3 gruppasına küçerde',
-'rightsnone' => '(yuq)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'bu bitne üzgärtergä',
@@ -1468,10 +1465,6 @@ Asta [[Special:UnusedCategories|qullanılmağan törkemnär]] kärsätelgän.
'activeusers-hidesysops' => 'İdaräçelärne yäşer',
'activeusers-noresult' => 'Qullanuçılar tabılmadı.',
-# Special:Log/newusers
-'newuserlogpage' => 'Qullanuçılarnı terkäw köndälege',
-'newuserlogpagetext' => 'Yaña terkälgän qullanuçılar isemlege',
-
# Special:ListGroupRights
'listgrouprights' => 'Qullanuçı törkemnäreneñ xoquqları',
'listgrouprights-group' => 'Törkem',
@@ -1515,11 +1508,7 @@ Bu bittä häm anıñ bäxäslegendä barlıq bulaçaq üzgärtülär şunda kü
'watching' => 'Küzätü isemlegemä östäwe…',
'unwatching' => 'Küzätü isemlegemnän çığaruı…',
-'enotif_newpagetext' => 'Bu yaña bit.',
'enotif_impersonal_salutation' => '{{SITENAME}} qullanuçı',
-'changed' => 'üzgärtelde',
-'created' => 'tözergän',
-'enotif_subject' => '{{SITENAME}} proyektınıñ $PAGETITLE bite $PAGEEDITOR tarafınnan $CHANGEDORCREATED',
'enotif_lastvisited' => 'Soñğı kerüegezdän soñ bulğan barlıq üzgärtülärne kürer öçen, bu sıltama aşa uzığız: $1',
'enotif_body' => 'Xörmätle $WATCHINGUSERNAME,
@@ -1546,6 +1535,8 @@ $UNWATCHURL
Elemtä häm yärdäm:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'tözergän',
+'changed' => 'üzgärtelde',
# Delete
'deletepage' => 'Bitne beterü',
@@ -2195,6 +2186,6 @@ Yulnıñ berençe sıltaması quyma öçen tıyılğan räsemgä sıltama bulır
# New logging system
'revdelete-restricted' => 'çikläwlär idaräçelärgä dä qullanıla',
-'newuserlog-byemail' => 'sersüz elektron poçta aşa cibärelde',
+'rightsnone' => '(yuq)',
);
diff --git a/languages/messages/MessagesTyv.php b/languages/messages/MessagesTyv.php
index d55ca0e4..bde893ba 100644
--- a/languages/messages/MessagesTyv.php
+++ b/languages/messages/MessagesTyv.php
@@ -15,34 +15,68 @@
* @author לערי ריינה×רט
*/
+$fallback = 'ru';
+$fallback8bitEncoding = "windows-1251";
+
$namespaceNames = array(
NS_MEDIA => 'Медиа',
NS_SPECIAL => 'ТуÑкай',
NS_TALK => 'Чугаа',
NS_USER => 'Aжыглакчы',
- NS_USER_TALK => 'Aжыглакчы_чугаазу',
- NS_PROJECT_TALK => '$1_чугаазу',
+ NS_USER_TALK => 'Aжыглакчы_чугаазы',
+ NS_PROJECT_TALK => '$1_чугаазы',
NS_FILE => 'Файл',
- NS_FILE_TALK => 'Файл_чугаазу',
+ NS_FILE_TALK => 'Файл_чугаазы',
NS_MEDIAWIKI => 'МедиаВики',
- NS_MEDIAWIKI_TALK => 'МедиаВики_чугаазу',
- NS_TEMPLATE => 'Ð¥ÑÑ',
- NS_TEMPLATE_TALK => 'Ð¥ÑÑ_чугаазу',
+ NS_MEDIAWIKI_TALK => 'МедиаВики_чугаазы',
+ NS_TEMPLATE => 'Майык',
+ NS_TEMPLATE_TALK => 'Майык_чугаазы',
NS_HELP => 'Дуза',
- NS_HELP_TALK => 'Дуза_чугаазу',
- NS_CATEGORY => 'Бөлүк',
- NS_CATEGORY_TALK => 'Бөлүк_чугаазу',
+ NS_HELP_TALK => 'Дуза_чугаазы',
+ NS_CATEGORY => 'КатегориÑ',
+ NS_CATEGORY_TALK => 'КатегориÑ_чугаазы',
);
-$namespaceAliases = array(
- 'Aжыглакчы_чугаа' => NS_USER_TALK,
- '$1_чугаа' => NS_PROJECT_TALK,
- 'Чурук' => NS_FILE,
- 'Чурук_чугаа' => NS_FILE_TALK,
- 'МедиаВики_чугаа' => NS_MEDIAWIKI_TALK,
- 'Ð¥ÑÑ_чугаа' => NS_TEMPLATE_TALK,
- 'Дуза_чугаа' => NS_HELP_TALK,
- 'Бөлүк_чугаа' => NS_CATEGORY_TALK,
+
+$magicWords = array(
+ 'redirect' => array( '0', '#ШИГЛЕДИР', '#REDIRECT' ),
+ 'notoc' => array( '0', '__ДОПЧУЗУЧОК__', '__NOTOC__' ),
+ 'toc' => array( '0', '__ДОПЧУЗУ__', '__TOC__' ),
+ 'currentmonth' => array( '1', 'ÐМГЫÐЙ', 'ÐМГЫÐЙ2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'ÐМГЫÐЙ1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'ÐМГЫÐЙÐЫҢÐДЫ', 'CURRENTMONTHNAME' ),
+ 'currentday' => array( '1', 'ÐМГЫХҮÐ', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'ÐМГЫХҮÐ2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'ÐМГЫХҮÐÐÒ®Ò¢ÐДЫ', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'ÐМГЫЧЫЛ', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'ÐМГЫҮЕ', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'ÐМГЫШÐК', 'CURRENTHOUR' ),
+ 'numberofpages' => array( '1', 'ÐРЫÐÐÐРÐЫҢСÐÐЫ', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'ЧҮҮЛДЕРÐИҢСÐÐЫ', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'ФÐЙЛДÐРÐЫҢСÐÐЫ', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'ÐЖЫГЛÐКЧЫЛÐРÐЫҢСÐÐЫ', 'NUMBEROFUSERS' ),
+ 'numberofedits' => array( '1', 'ӨСКЕРЛИИШКИÐÐЕРÐИҢСÐÐЫ', 'NUMBEROFEDITS' ),
+ 'pagename' => array( '1', 'ÐРЫÐÐЫҢÐДЫ', 'PAGENAME' ),
+ 'namespace' => array( '1', 'ÐТТÐРДЕЛГЕМИ', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'ÐТТÐРДЕЛГЕМИ2', 'NAMESPACEE' ),
+ 'namespacenumber' => array( '1', 'ÐТТÐРДЕЛГЕМИÐИҢСÐÐЫ', 'NAMESPACENUMBER' ),
+ 'talkspace' => array( '1', 'ЧУГÐÐДЕЛГЕМИ', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', 'ЧУГÐÐДЕЛГЕМИ2', 'TALKSPACEE' ),
+ 'img_right' => array( '1', 'оң', 'right' ),
+ 'img_left' => array( '1', 'Ñолагай', 'left' ),
+ 'img_center' => array( '1', 'төп', 'center', 'centre' ),
+ 'sitename' => array( '1', 'СÐЙТТЫҢÐДЫ', 'SITENAME' ),
+ 'ns' => array( '0', 'ÐД:', 'NS:' ),
+ 'nse' => array( '0', 'ÐД2:', 'NSE:' ),
+ 'currentweek' => array( '1', 'ÐМГЫЧЕДИХОÐУК', 'CURRENTWEEK' ),
+ 'currentdow' => array( '1', 'ÐМГЫЧЕДИХОÐУКТУҢХҮÐÒ®', 'CURRENTDOW' ),
+ 'raw' => array( '0', 'ЧИГ:', 'RAW:' ),
+ 'language' => array( '0', '#ДЫЛ:', '#LANGUAGE:' ),
+ 'special' => array( '0', 'туÑкай', 'special' ),
+ 'tag' => array( '0', 'демдек', 'tag' ),
+ 'pagesincategory_all' => array( '0', 'шупту', 'all' ),
+ 'pagesincategory_pages' => array( '0', 'арыннар', 'pages' ),
+ 'pagesincategory_files' => array( '0', 'файлдар', 'files' ),
);
$bookstoreList = array(
@@ -55,8 +89,6 @@ $bookstoreList = array(
'Barnes & Noble' => 'http://shop.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1'
);
-$fallback8bitEncoding = "windows-1251";
-
$messages = array(
# User preference toggles
'tog-underline' => 'Холбааны шыÑры:',
@@ -172,7 +204,6 @@ $messages = array(
'qbbrowse' => 'Каралаары',
'qbedit' => 'Ó¨Ñкертири',
'qbpageoptions' => 'Бо арын',
-'qbpageinfo' => 'Ðрын дугайында медÑÑ',
'qbmyoptions' => 'ÐœÑÑÒ£ арыннарым',
'qbspecialpages' => 'ТуÑкай арыннар',
'faq' => 'Бо-ла Ñалыр айтырыглар (БлСÐ)',
@@ -340,9 +371,6 @@ $messages = array(
'exception-nologin' => 'КирбеÑ',
# Login and logout pages
-'welcomecreation' => '== Кирип моорлаңар, $1! ==
-Силер бүрүткел бижик has been created.
-Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
'yourname' => 'Aжыглакчының ады',
'yourpassword' => 'Чажыт ÑÓ©Ñ',
'yourpasswordagain' => 'Чажыт Ñөзүңерни катап бижиңер:',
@@ -689,8 +717,8 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
'right-editusercss' => 'Ó¨Ñке ажыглакчыларның CSS файлдарын Ó©Ñкертири.',
'right-edituserjs' => 'Ó¨Ñке ажыглакчыларның JavaScript файлдарын Ó©Ñкертири.',
-# User rights log
-'rightsnone' => '(чок)',
+# Special:Log/newusers
+'newuserlogpage' => 'Чаа ажыглакчы кырында журнал',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'бо арынны номчууру',
@@ -918,9 +946,6 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
'activeusers-hidebots' => 'Роботтарны чажырары',
'activeusers-hidesysops' => 'Эргелекчыларны чажырары',
-# Special:Log/newusers
-'newuserlogpage' => 'Чаа ажыглакчы кырында журнал',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Бөлүк кижилер',
'listgrouprights-members' => '(кежигүннүң даңзызы)',
@@ -953,10 +978,9 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
'watching' => 'Хайгаарап турар...',
'unwatching' => 'Хайгааравайн турар...',
-'enotif_newpagetext' => 'Бо чаа арын-дыр.',
'enotif_impersonal_salutation' => '{{grammar:genitive|{{SITENAME}}}} ажыглакчызы',
-'changed' => 'Ó©Ñкертти',
'enotif_anon_editor' => 'ат ÑÐ²ÐµÑ Ð°Ð¶Ñ‹Ð³Ð»Ð°ÐºÑ‡Ñ‹ $1',
+'changed' => 'Ó©Ñкертти',
# Delete
'deletepage' => 'Ðрынны ырадыры',
@@ -1003,7 +1027,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
'blanknamespace' => '(Кол)',
# Contributions
-'contributions' => 'Ðжыглакчыниң Ñалыышкыннары',
+'contributions' => '{{GENDER:$1|Ðжыглакчының}} Ñалыышкыннары',
'contributions-title' => '«$1» деп ажыглакчының Ñалыышкыннары',
'mycontris' => 'Салыышкыннар',
'contribsub2' => '$1 ($2)',
@@ -1361,6 +1385,9 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
'htmlform-submit' => 'Күүcедири',
'htmlform-selectorother-other' => 'Ó¨Ñке',
+# New logging system
+'rightsnone' => '(чок)',
+
# Feedback
'feedback-subject' => 'Кол ÑÓ©Ñ:',
'feedback-message' => 'Чагаа:',
diff --git a/languages/messages/MessagesUg_arab.php b/languages/messages/MessagesUg_arab.php
index 09e84ace..349a822e 100644
--- a/languages/messages/MessagesUg_arab.php
+++ b/languages/messages/MessagesUg_arab.php
@@ -174,6 +174,7 @@ $messages = array(
'newwindow' => '(ÙŠÛÚ­Ù‰ كۆزنەكتە ئاچ)',
'cancel' => 'ۋاز كەچ',
'moredotdotdot' => 'تەپسىلىي…',
+'morenotlisted' => 'تەپسىلاتى كۆرسىتىلمىگەنلىرى…',
'mypage' => 'بەتىم',
'mytalk' => 'مۇنازىرە بÛتىم',
'anontalk' => 'بۇ IP نىڭ مۇنازىرە بÛتى',
@@ -185,7 +186,6 @@ $messages = array(
'qbbrowse' => 'كۆز يۈگۈرت',
'qbedit' => 'تەھرىر',
'qbpageoptions' => 'بۇ بەت',
-'qbpageinfo' => 'كونتÛكست',
'qbmyoptions' => 'بەتلەرىم',
'qbspecialpages' => 'ئالاھىدە بەتلەر',
'faq' => 'كۆپ كۆرۈلىدىغان مەسىلىلەر',
@@ -208,6 +208,7 @@ $messages = array(
'namespaces' => 'ئات بوشلۇقى',
'variants' => 'ۋارىيانتلار',
+'navigation-heading' => 'يولباشچى تىزىملىكى',
'errorpagetitle' => 'خاتالىق',
'returnto' => '$1 غا قايت.',
'tagline' => 'ئورنى {{SITENAME}}',
@@ -472,11 +473,10 @@ $2',
# Login and logout pages
'logouttext' => "'''ھازىر تىزىمدىن چىقتىڭىز.'''
-سىز نامسىز ھالەتتە {{SITENAME}} نى ئىشلىتەلەيسىز ياكى ئوخشاش ۋە ياكى ئوخشاش بولمىغان ئىشلەتكۈچى سالاھىيىتىدە [[Special:UserLogin|تىزىمغا كىر]]ەلەيسىز.
+سىز نامسىز ھالەتتە {{SITENAME}} نى ئىشلىتەلەيسىز ياكى ئوخشاش ۋە ياكى ئوخشاش بولمىغان ئىشلەتكۈچى سالاھىيىتىدە <span class='plainlinks'>[$1 تىزىمغا كىر]</span>ەلەيسىز.
دىققەت، بەزى بەتلەر توركۆرگۈنىڭ غەملىكى تازىلانمىغۇچە يەنىلا سىزنى تىزىمغا كىرگەن ھالەتتە كۆرسىتىشى مۇمكىن.",
-'welcomecreation' => '== $1! خۇش كەپسىز ==
-
-Ú¾Ûساباتىڭىز قۇرۇلدى.
+'welcomeuser' => '$1، خۇش كەپسىز!',
+'welcomecreation-msg' => 'Ú¾Ûساباتىڭىز قۇرۇلدى.
[[Special:Preferences|{{SITENAME}} تەڭشىكىڭىزنى تەڭشەشنى ئۇنتۇپ قالماڭ]].',
'yourname' => 'ئىشلەتكۈچى ئاتى:',
@@ -501,7 +501,7 @@ $2',
'gotaccount' => "Ú¾Ûساباتىم بار؟ '''$1'''.",
'gotaccountlink' => 'تىزىمغا كىر',
'userlogin-resetlink' => 'تىزىمغا كىرىش تەپسىلاتىنى ئۇنۇتتىڭىز؟',
-'createaccountmail' => 'ئÛلخەتتە',
+'createaccountmail' => 'ۋاقىتلىق ئىختىيارىي بىر ئÛمنى ئىشلىتىدۇ ھەمدە تۆۋەندىكى بەلگىلەنگەن تورخەت ئادرÛسىغا ئەۋەتىدۇ',
'createaccountreason' => 'سەۋەب:',
'badretype' => 'سىز كىرگۈزگەن ئىم ماس كەلمىدى.',
'userexists' => 'كىرگۈزگەن ئىشلەتكۈچى ئاتى ئىشلىتىلىۋاتىدۇ.
@@ -589,6 +589,7 @@ cookies نى قوزغاتقانلىقىڭىزنى جەزملەڭ، بۇ بەتن
# Email sending
'php-mail-error-unknown' => 'PHP نىڭ mail() Ùونكسىيەسىدىكى يوچۇن خاتالىق',
'user-mail-no-addy' => 'ئÛلخەت ئادرÛسسىز خەت يوللاشنى سىنىدى.',
+'user-mail-no-body' => 'بوش ياكى مەزمۇنى قىسقا مۇۋاپىق بولمىغان تورخەت ئەۋەتىشنى سىنىدى.',
# Change password dialog
'resetpass' => 'ئىم ئۆزگەرت',
@@ -654,6 +655,7 @@ $2
'changeemail-oldemail' => 'نۆۋەتتىكى ئÛلخەت ئادرÛسى:',
'changeemail-newemail' => 'ÙŠÛÚ­Ù‰ ئÛلخەت ئادرÛسى:',
'changeemail-none' => '(يوق)',
+'changeemail-password' => '{{SITENAME}} دىكى ئىم:',
'changeemail-submit' => 'ئÛلخەت ئۆزگەرت',
'changeemail-cancel' => 'ۋاز كەچ',
@@ -841,7 +843,6 @@ $2
'hiddencategories' => 'بۇ بەت {{PLURAL:$1|1 يوشۇرۇن تۈر|$1 يوشۇرۇن تۈر}} نىڭ ئەزالىرىغا تەۋە:',
'edittools' => '<!-- بۇ جايدىكى تÛكىست تەھرىرلەش Û‹Û• يوللاش جەدۋىلنىڭ ئاستى تەرىپىدە كۆرۈنىدۇ. -->',
'edittools-upload' => '-',
-'nocreatetitle' => 'بەت قۇرۇش چەكلىمىسى',
'nocreatetext' => '{{SITENAME}} ÙŠÛÚ­Ù‰ بەت قۇرۇش ئىقتىدارىنى چەكلىگەن.
كەينىگە قايتىپ مەۋجۇد بەتنى تەھرىرلىيەلەيسىز ياكى [[Special:UserLogin|تىزىمغا كىر ياكى ÙŠÛÚ­Ù‰ بىر Ú¾Ûسابات قۇر]]الايسىز.',
'nocreate-loggedin' => 'ÙŠÛÚ­Ù‰ بەت قۇرۇش ھوقۇقىڭىز يوق.',
@@ -866,6 +867,15 @@ $2
'edit-already-exists' => 'ÙŠÛÚ­Ù‰ بەت قۇرالمىدى
ئۇ مەۋجۇد.',
'defaultmessagetext' => 'كۆڭۈلدىكى ئۇچۇر تÛكستى',
+'content-failed-to-parse' => '$2 نى $1 گە ئانالىز قلش مەغلۇپ بولدى: $3',
+'invalid-content-data' => 'مەزمۇن سانلىق مەلۇماتى ئىناۋەتسىز',
+'content-not-allowed-here' => '[[$2]] بەتتە "$1" مەزمۇنغا يول قويۇلمايدۇ',
+
+# Content models
+'content-model-wikitext' => 'wiki تÛكىستى',
+'content-model-text' => 'ساپ تÛكىست',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''ئاگاھلاندۇرۇش:''' بۇ بەت ناھايىتى كۆپ يۇقىرى سەرپىياتتىكى گىرامماتىكىلىق ئىقتىدارنى چاقىرغان.\\n
@@ -1233,9 +1243,9 @@ $1",
'prefs-emailconfirm-label' => 'ئÛلخەت جەزملەش:',
'prefs-textboxsize' => 'تەھرىر كۆزنەك چوڭلۇقى',
'youremail' => 'ئÛلخەت:',
-'username' => 'ئىشلەتكۇچى ئىسمى:',
-'uid' => 'ئىشلەتكۈچى كىملىك:',
-'prefs-memberingroups' => '{{PLURAL:$1|بىر|كۆپ}} گۇرۇپپا ئەزاسى:',
+'username' => '{{GENDER:$1|ئىشلەتكۇچى ئىسمى}}:',
+'uid' => '{{GENDER:$1|ئىشلەتكۇچى}} كىملىك:',
+'prefs-memberingroups' => '{{PLURAL:$1|گۇرۇپپا}} دىكى{{GENDER:$2| ئەزا}}:',
'prefs-memberingroups-type' => '$1',
'prefs-registration' => 'خەتلەتكەن ۋاقىت:',
'prefs-registration-date-time' => '$1',
@@ -1294,6 +1304,7 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
'saveusergroups' => 'ئىشلەتكۈچى گۇرۇپپىسى ساقلا',
'userrights-groupsmember' => 'ئەزاسى:',
'userrights-groupsmember-auto' => 'مۇقىم ئەزاسى:',
+'userrights-groupsmember-type' => '$1',
'userrights-groups-help' => 'سىز بۇ ئىشلەتكۈچى تەۋە گۇرۇپپىنى ئۆزگەرتەلەيسىز:\\n
* تاللاش رامكىسى تاللاغلىق بولسا ئىشلەتكۈچى شۇ گۇرۇپپىغا تەۋە:
* تاللاش رامكىسى تاللاغلىق بولمىسا ئىشلەتكۈچى شۇ گۇرۇپپىغا تەۋە ئەمەس.
@@ -1393,12 +1404,13 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
'right-sendemail' => 'باشقا ئىشلەتكۈچىگە ئÛلخەت يوللا',
'right-passwordreset' => 'پارول ئەسلىگە قايتۇرۇش ئÛلخەت ئادرÛس كۆرۈش.',
+# Special:Log/newusers
+'newuserlogpage' => 'ئىشلەتكۈچى قۇرغان خاتىرە',
+'newuserlogpagetext' => '(چەكلەنگەن)',
+
# User rights log
'rightslog' => 'ئىشلەتكۈچى ھوقۇق خاتىرىسى',
'rightslogtext' => 'ئىشلەتكۈچى ھوقۇق خاتىرىسى',
-'rightslogentry' => 'گۇرۇپپا ئەزاسى $1 نىڭ ھوقۇقىنى $2 دىن $3 غا ئۆزگەرت',
-'rightslogentry-autopromote' => 'ئۆزلۈكىدىن $2 دىن $3 غا ئۆرلىدى',
-'rightsnone' => '(يوق)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'بۇ بەتنى ئوقۇ',
@@ -1635,6 +1647,7 @@ $1',
'backend-fail-notsame' => '"$1" دا ئوخشاش بولمىغان ھۆججەت مەۋجۇت.',
'backend-fail-invalidpath' => '"$1" ئىناۋەتلىك ساقلاش يولى ئەمەس.',
'backend-fail-delete' => '"$1" ھۆججەتنى ئۆچۈرەلمىدى.',
+'backend-fail-describe' => 'ھۆججەت "$1" نىڭ Ù…Ûتا سانلىق مەلۇماتىنى ئۆزگەرتەلمىدى.',
'backend-fail-alreadyexists' => '"$1" ھۆججەت ئاللىبۇرۇن مەۋجۇت.',
'backend-fail-store' => 'ھۆججەت "$1" نى "$2"غا ساقلىيالمىدى.',
'backend-fail-copy' => 'ھۆججەت "$1" نى "$2" غا كۆچۈرەلمىدى.',
@@ -2024,8 +2037,9 @@ URL نىڭ توغرىلىقى Û‹Û• تور بÛكەتنى زىيارەت قىلى
'linksearch-pat' => 'ئىزدەش شەكلى:',
'linksearch-ns' => 'ئات بوشلۇقى:',
'linksearch-ok' => 'ئىزدەش',
-'linksearch-text' => ' \\"*.wikipedia.org\\" غا ئوخشاش ئورتاق بەلگە ئىشلىتىشكە بولىدۇ. <br />
-قوللايدىغان ÙƒÛلىشىم: <code>$1</code>',
+'linksearch-text' => '"wikipedia.org.*" غا ئوخشاش ئورتاق بەلگە ئىشلىتىشكە بولىدۇ.
+ </br>ئالىي دەرىجىلىك دائىرە بۇلىشى ÙƒÛرەك، مەسىلەن:"org.*".
+قوللايدىغان{{PLURAL:$2| ÙƒÛلىشىم}}: <code>$1</code>.',
'linksearch-line' => '$1 بولسا $2 دىن ئۇلانغان',
'linksearch-error' => 'ئورتاق بەلگەنى پەقەت ئاساسىي ئاپپارات ئاتىنىڭ باشىدىلا ئىشلەتكىلى بولىدۇ.',
@@ -2044,10 +2058,6 @@ URL نىڭ توغرىلىقى Û‹Û• تور بÛكەتنى زىيارەت قىلى
'activeusers-hidesysops' => 'باشقۇرغۇچىنى يوشۇر',
'activeusers-noresult' => 'ئىشلەتكۈچى تÛپىلمىدى.',
-# Special:Log/newusers
-'newuserlogpage' => 'ئىشلەتكۈچى قۇرغان خاتىرە',
-'newuserlogpagetext' => '(چەكلەنگەن)',
-
# Special:ListGroupRights
'listgrouprights' => 'ئىشلەتكۈچى گۇرۇپپا ھوقۇقى',
'listgrouprights-summary' => 'تۆۋەندىكىسى بۇ wiki دا ئÛنىقلىما بÛرىلگەن ئىشلەتكۈچى ھوقۇق Ú†Ûكى تىزىملىكى Û‹Û• ئۇلارنىڭ زىيارەت ھوقۇق Ú†Ûكى.
@@ -2145,21 +2155,25 @@ URL نىڭ توغرىلىقى Û‹Û• تور بÛكەتنى زىيارەت قىلى
'enotif_mailer' => '{{SITENAME}} ئÛلخەت ئۇقتۇرغۇچ',
'enotif_reset' => 'ھەممە بەتكە ئوقۇلدى بەلگىسى سال',
-'enotif_newpagetext' => 'بۇ ÙŠÛÚ­Ù‰ بەت.',
'enotif_impersonal_salutation' => '{{SITENAME}} ئىشلەتكۈچى',
-'changed' => 'ئۆزگەردى',
-'created' => 'قۇرغان',
-'enotif_subject' => '{{SITENAME}} نىڭ $PAGETITLE بÛتىنى $CHANGEDORCREATED ئۆزگەرتكۈچى$PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}}نىڭ $1 بەت{{gender:$2|$2}}تەرپىدىن ئۆچۈرۈلدى',
+'enotif_subject_created' => '{{SITENAME}}نىڭ $1 بەت{{gender:$2|$2}}تەرپىدىن قۇرۇلدى',
+'enotif_subject_moved' => '{{SITENAME}}نىڭ $1 بەت{{gender:$2|$2}}تەرپىدىن يۆتكىۋÛتىلدى',
+'enotif_subject_restored' => '{{SITENAME}}نىڭ $1 بەت{{gender:$2|$2}}تەرپىدىن ئەسلىگە قايتۇرۇلدى',
+'enotif_subject_changed' => '{{SITENAME}}نىڭ $1 بەت{{gender:$2|$2}}تەرپىدىن ئۆزگەرتىلدى',
+'enotif_body_intro_deleted' => '{{SITENAME}}دىكى $1 بەت $PAGEEDITDATE {{gender:$2|$2}} تەرپىدىن ئۆچۈرۈلدى، $3 دىن كۈرىڭ.',
+'enotif_body_intro_created' => '{{SITENAME}}دىكى $1 بەت $PAGEEDITDATE {{gender:$2|$2}} تەرپىدىن قۇرۇلدى، $3 دىن ھازىرقى نەشرىنى كۈرىڭ.',
+'enotif_body_intro_moved' => '{{SITENAME}}دىكى $1 بەت$PAGEEDITDATE {{gender:$2|$2}} تەرپىدىن يۆتكىۋÛتىلدى، $3 دىن ھازىرقى نەشرىنى كۈرىڭ.',
+'enotif_body_intro_restored' => '{{SITENAME}}دىكى $1 بەت $PAGEEDITDATE {{gender:$2|$2}} تەرپىدىن ئەسلىگە قايتۇرۇلدى، $3 دىن ھازىرقى نەشرىنى كۈرىڭ.',
+'enotif_body_intro_changed' => '{{SITENAME}}دىكى $1 بەت $PAGEEDITDATE {{gender:$2|$2}} تەرپىدىن ئۆزگەرتىلدى، $3 دىن ھازىرقى نەشرىنى كۈرىڭ.',
'enotif_lastvisited' => 'ئالدىنقى Ù‚Ûتىملىق زىيارەتتىن ÙƒÛيىنكى ھەممە ئۆزگەرتىشنى $1 كۆرۈڭ.',
'enotif_lastdiff' => 'بۇ ئۆزگەرتىشنى كۆرمەكچى بولسىڭىز $1 كۆرۈڭ.',
'enotif_anon_editor' => '$1 ئاتسىز ئىشلەتكۈچى',
'enotif_body' => 'قەدىرلىك $WATCHINGUSERNAME،
-{{SITENAME}} بÛكىتىدىكى $PAGETITLE ماۋزۇلۇق بەت $PAGEEDITDATE دا $PAGEEDITOR تەرىپىدىن $CHANGEDORCREATED،نۆۋەتتىكى تۈزىتىلگەن نەشرىنى كۆرۈش ئۈچۈن $PAGETITLE_URL غا يۆتكىلىڭ.
-
-$NEWPAGE
+PAGEINTRO $NEWPAGE$
-تەھرىر ئۈزۈندىسى: $PAGESUMMARY $PAGEMINOREDIT
+تەھرىر ئۈزۈندىسى: PAGESUMMARY $PAGEMINOREDIT$
بۇ تەھرىر بىلەن ئالاقىلىشىڭ:
@@ -2180,6 +2194,8 @@ $UNWATCHURL نى زىيارەت قىلىڭ
قايتما ئىنكاس ياكى تÛخىمۇ ÙƒÛ†Ù¾ ياردەمگە ئÛرىشمەكچى بولسىڭىز:
{{canonicalurl:{{MediaWiki:Helppage}}}} نى زىيارەت قىلىڭ',
+'created' => 'قۇرغان',
+'changed' => 'ئۆزگەردى',
# Delete
'deletepage' => 'بەت ئۆچۈر',
@@ -2252,6 +2268,8 @@ $2 نىڭ ئاخىرقى تۈزىتىلگەن نەشرىگە ئۆزگەرتىلØ
'prot_1movedto2' => '[[$1]] دىن [[$2]]غا يۆتكەلدى',
'protect-badnamespace-title' => 'قوغداتقل بولمايدىغان ئىسىم بوشلۇق',
'protect-badnamespace-text' => 'بۇ ئىسىم بوشلۇقىدىكى بەتنى قوغدىغىلى بولمايدۇ.',
+'protect-norestrictiontypes-text' => 'بۇ بەتنى ساقلىيالمايدۇ سەۋەبى ئىشلەتكىلى بولىدىغان قوغداش تىپى يوق.',
+'protect-norestrictiontypes-title' => 'قوغدىغىلى بولمايدىغان بەت',
'protect-legend' => 'قوغداش جەزملە',
'protectcomment' => 'سەۋەب:',
'protectexpiry' => 'قەرەلى:',
@@ -2337,8 +2355,8 @@ $2 نىڭ ئاخىرقى تۈزىتىلگەن نەشرىگە ئۆزگەرتىلØ
'undeletedrevisions' => '{{PLURAL:$1|1 تۈزىتىش|$1 تۈزىتىش}} ئەسلىگە كەلتۈرۈلدى',
'undeletedrevisions-files' => '{{PLURAL:$1|1 تۈزىتىش|$1 تۈزىتىش}} ۋە {{PLURAL:$2|1 ھۆججەت|$2 ھۆججەت}} ئەسلىگە كەلتۈرۈلدى',
'undeletedfiles' => '{{PLURAL:$1|1 ھۆججەت|$1 ھۆججەت}} ئەسلىگە كەلتۈرۈلدى',
-'cannotundelete' => 'ئەسلىگە كەلتۈرۈش مەغلۇپ بولدى؛
-باشقىلار بۇ بەتنى بايىلا ئەسلىگە كەلتۈرگەن بولۇشى مۇمكىن.',
+'cannotundelete' => 'ئەسلىگە كەلتۈرۈش مەغلۇپ بولدى:
+$1',
'undeletedpage' => "'''$1 ئەسلىگە كەلتۈرۈلدى'''
[[Special:Log/delete|ئۆچۈرۈش خاتىرىسى]]دىن پايدىلىنىپ ئۆچۈر ۋە ئەسلىگە كەلتۈر خاتىرىسىنى كۆرۈڭ.",
@@ -2371,7 +2389,7 @@ $1',
'blanknamespace' => '(ئاساسىي)',
# Contributions
-'contributions' => 'ئىشلەتكۈچى تۆھپىسى',
+'contributions' => '{{$1:GENDER|ئىشلەتكۈچى}} تۆھپىسى',
'contributions-title' => '$1 نىڭ ئىشلەتكۈچى تۆھپىسى',
'mycontris' => 'تۆھپە',
'contribsub2' => '$1 نىڭ تۆھپىسى ($2)',
@@ -2656,6 +2674,7 @@ $1',
'immobile-target-namespace-iw' => 'بەت يۆتكىگەندە wiki دىن ھالقىغان ئۇلانما ئىناۋەتلىك نىشان ئەمەس.',
'immobile-source-page' => 'بۇ بەتنى يۆتكىگىلى بولمايدۇ.',
'immobile-target-page' => 'بۇ نىشان ماۋزۇغا يۆتكىگىلى بولمايدۇ.',
+'bad-target-model' => 'تەلەپ قىلغان نىشان ئوخشاش بولمىغان مەزمۇن مودÛلىنى ئىشلىتىدۇ. $1 دىن $2 غا ئايلاندۇرالمايدۇ.',
'imagenocrossnamespace' => 'ھۆججەتنى غەيرى ھۆججەت ئات بوشلۇقىغا يۆتكىگىلى بولمايدۇ.',
'nonfile-cannot-move-to-file' => 'غەيرى ھۆججەتنى ھۆججەت ئات بوشلۇقىغا يۆتكىگىلى بولمايدۇ.',
'imagetypemismatch' => 'بۇ ÙŠÛÚ­Ù‰ ÙƒÛڭەيتىلگەن ئات بىلەن باشقا تىپ ماسلاشمىدى.',
@@ -2770,6 +2789,7 @@ $1',
'import-error-interwiki' => '"$1" بەتنى ئەكىرەلمىدى سەۋەبى ئۇنىڭ ئىسمى سىرتقى ۋىكى ئۇلانمىسى((interwiki))نى ئىشلىتىدۇ.',
'import-error-special' => '"$1" بەتنى ئەكىرەلمىدى چۈنكى ئۇ بەت قۇرالمايدىغان ئالاھىدە ئات بوشلۇقى ئىشلىتىشكە ئÛھتىياجلىق.',
'import-error-invalid' => '"$1" بەتنى ئەكىرەلمىدى چۈنكى ئۇنىڭ ئىسمى ئىناۋەتسىز.',
+'import-error-unserialize' => '"$1" بەتنىڭ $2 تۈزىتىلگەن نەشرىنى تەرتىپسىزلەشتۈرەلمىدى. بۇ نەشرى ئىشلىتىدىغان مەزمۇن مودÛلى $3 تەرتىپلەشتۈرۈش $4.',
'import-options-wrong' => '{{PLURAL:$2|تاللانما}} خاتالىقى: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'بÛرىلگەن غول بەتنىڭ ماۋزۇسى ئىناۋەتسىز.',
'import-rootpage-nosubpage' => '"$1" ئات بوشلۇقىنىڭ غول بÛتى تارماق بەتكە يول قويمايدۇ.',
@@ -2784,7 +2804,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'JavaScript سىناش',
-'javascripttest-disabled' => 'بۇ ۋىكىدا مەزكۇر ئىقتىدار قوزغىتىلمىغان.',
'javascripttest-title' => '$1 نى تەكشۈرۈش يۈرگۈزۈۋاتىدۇ',
'javascripttest-pagetext-noframework' => 'بۇ بەت JavaScript ئىجرا قىلىپ سىناشقا قالدۇرۇلغان.',
'javascripttest-pagetext-unknownframework' => 'يوچۇن سىناق قۇرۇلما "$1".',
@@ -2935,6 +2954,7 @@ $1',
'pageinfo-default-sort' => 'كۆڭۈلدىكى تەرتىپلەش ئاچقۇچى',
'pageinfo-length' => 'بەت چوڭلۇقى (بايت)',
'pageinfo-article-id' => 'بەت ID',
+'pageinfo-language' => 'بەت مەزمۇن تىلى',
'pageinfo-robot-policy' => 'ئىزدەش ماتور ھالىتى',
'pageinfo-robot-index' => 'ئىندÛكىسلاشچان',
'pageinfo-robot-noindex' => 'ئىندÛكىسلانمايدىغان',
@@ -2955,6 +2975,19 @@ $1',
'pageinfo-magic-words' => '{{PLURAL:$1|سÛھرىي خەت}}',
'pageinfo-hidden-categories' => '{{PLURAL:$1|يوشۇرۇلغان تۈر}}',
'pageinfo-templates' => '{{PLURAL:$1|سىڭدۈرۈلگەن Ù‚Ûلىپ}}',
+'pageinfo-transclusions' => '($1) {{PLURAL:$1|بەت}}تە سىڭدۈرۈلگەن',
+'pageinfo-toolboxlink' => 'بەت ئۇچۇر',
+'pageinfo-redirectsto' => 'قايتا نىشانلىنىدىغىنى',
+'pageinfo-redirectsto-info' => ' ئۇچۇر',
+'pageinfo-contentpage' => 'مەزمۇن بÛتى سۈپىتىدە Ú¾Ûسابلىدى',
+'pageinfo-contentpage-yes' => 'ھەئە',
+'pageinfo-protect-cascading' => 'زەنجىرلىك قۇلۇپ بۇ جايدىن باشلىنىدۇ',
+'pageinfo-protect-cascading-yes' => 'ھەئە',
+'pageinfo-protect-cascading-from' => 'قوغداش دەرىجىسىنىڭ باغلىنىش ئورنى',
+'pageinfo-category-info' => 'تۈر ئۇچۇرى',
+'pageinfo-category-pages' => 'بەت سانى',
+'pageinfo-category-subcats' => 'تارماق تۈر سانى',
+'pageinfo-category-files' => 'ھۆججەت سانى',
# Skin names
'skinname-standard' => 'Classic',
@@ -2977,6 +3010,8 @@ $1',
'markedaspatrollederror' => 'چارلاش بەلگىسى قويغىلى بولمايدۇ',
'markedaspatrollederrortext' => 'مەلۇم نەشرىنى تاللىسىڭىز ئاندىن چارلاش بەلگىسى قويغىلى بولىدۇ.',
'markedaspatrollederror-noautopatrol' => 'سىز ئۆزىڭىزنىڭ ئۆزگەرتىشىگە چارلاش بەلگىسى قويالمايسىز.',
+'markedaspatrollednotify' => '$1 نىڭ ئۆزگەرتىشىگە چارلاش بەلگىسى قويۇلدى.',
+'markedaspatrollederrornotify' => 'چارلىيالمىغانلىق بەلگىسى قويۇلدى.',
# Patrol log
'patrol-log-page' => 'چارلاش خاتىرىسى',
@@ -3010,6 +3045,7 @@ $1',
'file-nohires' => 'يۇقىرىراق پەرق ئÛتىش نىسبىتى يوق.',
'svg-long-desc' => 'SVG ھۆججىتى، ئاتاقتىكى چوڭلۇقى $1 × $2 نۇقتا، ھۆججەت چوڭلۇقى: $3',
'svg-long-desc-animated' => 'جانلاندۇرۇم SVG ھۆججەت، سۈرەت چوڭلۇقى $1×$2 پىكسÛÙ„ØŒ ھۆججەت چوڭلۇقى: $3',
+'svg-long-error' => 'ئۈنۈمسىز SVG ھۈججەت:$1',
'show-big-image' => 'تولۇق ئÛنىقلىق دەرىجىسى',
'show-big-image-preview' => 'بۇ ئالدىن كۆزىتىشنىڭ چوڭلۇقى: $1.',
'show-big-image-other' => 'باشقا {{PLURAL:$2|چوڭلۇقى}}: $1.',
@@ -3044,7 +3080,10 @@ $1',
'minutes' => '{{PLURAL: $1|$1مىنۇت}}',
'hours' => '{{PLURAL:$1|$1سائەت}}',
'days' => '{{PLURAL:$1|$1 ÙƒÛˆÙ†}}',
+'months' => '{{PLURAL:$1|$1 ئاي}}',
+'years' => '{{PLURAL:$1|$1 يىل}}',
'ago' => '$1 بۇرۇن',
+'just-now' => 'بايا',
# Bad image list
'bad_image_list' => 'تۆۋەندىكى Ùورماتتا ÙŠÛزىڭ:
@@ -3574,6 +3613,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[بÛكەت ئاتلىغان كود ئايلاندۇرۇش چەكلەنگەن]',
'scarytranscludefailed' => '[$1 نىڭ Ù‚Ûلىپىنى ئÛلىش مەغلۇپ بولدى]',
+'scarytranscludefailed-httpstatus' => '[$1:HTTP $2 Ú¯Û• Ù‚Ûلىپ ئÛرىشىش مەغلۇپ بولدى]',
'scarytranscludetoolong' => '[URL بەك ئۇزۇن]',
# Delete conflict
@@ -3685,6 +3725,7 @@ $5
'version-license' => 'ئىجازەتنامە',
'version-poweredby-credits' => "بۇ ۋىكىنى '''[//www.mediawiki.org/ MediaWiki]''' تÛخنىكىلىق قوللايدۇ، نەشر ھوقۇقى © 2001-$1 $2",
'version-poweredby-others' => 'باشقا',
+'version-credits-summary' => 'تۆۋەندىكى كىشىنىڭ [[Special:Version|MediaWiki]] غا تۆھپە قوشقانلىقىغا رەھمەت ئÛيتىمىز.',
'version-license-info' => 'MediaWiki ئەركىن يۇمشاق دÛتال؛ سىز ئەركىن يۇمشاق دÛتال ۋەخپىسىنىڭ ئÛلان قىلغان GNU ئاممىباپ ئاممىۋى ئىجازەت ماددىلىرىدىكى بەلگىمىلەرگە ئاساسەن، بۇ پىروگراممىنى قايتا تارقىتىپ ياكى ئۆزگەرتەلەيسىز؛ مەيلى سىز مەزكۇر ئىجازەتنامىنىڭ ئىككىنچى نەشرى ياكى (ئۆزىڭىز تاللىغان) خالىغان كۈندە تارقىتىلغان نەشرىنى ئاساس قىلسىڭىز بولۇۋÛرىدۇ.
MediaWiki ئىشلىتىش مەقسىتىنى ئاساس قىلىپ ئÛلان قىلىنغان، ئەمما Ú¾Ûچقانداق كاپالەت مەسئۇلىيىتىنى ئۈستىگە ئالمايدۇ؛ سÛتىشچانلىق ياكى مۇئەييەن مەقسەت بويىچە ئىشلىتىشچانلىققا كاپالەتلىك قىلمايدۇ. تەپسىلاتىنىGNU ئاممىباپ ئاممىۋى ئىجازەتنامىدىن پايدىلىنىڭ.
@@ -3827,8 +3868,12 @@ MediaWiki ئىشلىتىش مەقسىتىنى ئاساس قىلىپ ئÛلان Ù
'logentry-newusers-newusers' => 'ئەزا $1 قۇرۇلبولدى',
'logentry-newusers-create' => 'ئەزا $1 قۇرۇلبولدى',
'logentry-newusers-create2' => 'ئىشلەتكۈچى Ú¾Ûساباتى $3 نى $1 قۇردى',
+'logentry-newusers-byemail' => 'ئىشلەتكۈچى Ú¾Ûساباتى $3 نى $1 قۇردى ھەمدە ئىمنى تورخەتكە ئەۋەتتى',
'logentry-newusers-autocreate' => 'ئىشلەتكۈچى $1 ئاپتوماتلىق قۇرۇلدى',
-'newuserlog-byemail' => 'ئىم ئىلخەتتە يوللاندى',
+'logentry-rights-rights' => '$3 نىڭ ئىشلەتكۈچى گۇرۇپپىسىنى $4 دىن $5 غا $1 ئالماشتۇردى',
+'logentry-rights-rights-legacy' => '$3 نىڭ ئىشلەتكۈچى گۇرۇپپىسىنى $1 ئۆزگەرتتى',
+'logentry-rights-autopromote' => '$1 نىڭ ئىشلەتكۈچى گۇرۇپپىسى ئۆزلۈكىدىن $4 دىن $5 غا يۈكسەلدى',
+'rightsnone' => '(يوق)',
# Feedback
'feedback-bugornote' => 'ئەگەر بىر تÛخنىكىلىق مەسىلىنى تەپسىلىي بايان قىلىشقا تەييارلانماقچى بولسىڭىز، [$1 خاتالىق دوكلات]Ù‰ يوللاڭ. ياكى تۆۋەندىكى ئاددىي جەدۋەلنى ئىشلىتىڭ. ئىنكاسىڭىز "[$3 $2]" بەتكە قوشۇلىدۇ، ئىشلەتكۈچى ئاتىڭىز Û‹Û• ئىشلەتكەن توركۆرگۈڭىز قوشۇپ قويۇلىدۇ.',
@@ -3881,6 +3926,7 @@ MediaWiki ئىشلىتىش مەقسىتىنى ئاساس قىلىپ ئÛلان Ù
'api-error-ok-but-empty' => 'ئىچكى خاتالىق: مۇلازىمÛتىردا ئىنكاس يوق.',
'api-error-overwrite' => 'مەۋجۇد ھۆججەت قاپلاشقا يول قويمايدۇ.',
'api-error-stashfailed' => 'ئىچكى خاتالىق: مۇلازىمÛتىر ۋاقىتلىق ھۆججەتنى ساقلىيالمىدى.',
+'api-error-publishfailed' => 'ئىچكى خاتالىق: مۇلازىمÛتىر ۋاقىتلىق ھۆججەتنى تارقىتالمىدى.',
'api-error-timeout' => 'مۇلازىمەت كومپيۇتÛر كۆتكەن ۋاقتا ئىنكاس قايتۇرمىدى.',
'api-error-unclassified' => 'نامەلۇم خاتالىق كۆرۈلدى.',
'api-error-unknown-code' => 'نامەلۇم خاتالىق:"$1"',
diff --git a/languages/messages/MessagesUk.php b/languages/messages/MessagesUk.php
index 49af2980..6d02ea60 100644
--- a/languages/messages/MessagesUk.php
+++ b/languages/messages/MessagesUk.php
@@ -16,6 +16,7 @@
* @author AlexSm
* @author Andrijko Z.
* @author Arturyatsko
+ * @author AtUkr
* @author Base
* @author Dim Grits
* @author DixonD
@@ -210,7 +211,6 @@ $magicWords = array(
'forcetoc' => array( '0', '__ОБОВ_ЗМІСТ__', '__ОБЯЗÐТЕЛЬÐОЕ_ОГЛÐВЛЕÐИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
'toc' => array( '0', '__ЗМІСТ__', '__ОГЛÐВЛЕÐИЕ__', '__ОГЛ__', '__TOC__' ),
'noeditsection' => array( '0', '__БЕЗ_РЕДÐГУВ_РОЗДІЛУ__', '__БЕЗ_РЕДÐКТИРОВÐÐИЯ_РÐЗДЕЛÐ__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__БЕЗ_ЗÐГОЛОВКУ__', '__БЕЗ_ЗÐГОЛОВКÐ__', '__NOHEADER__' ),
'currentmonth' => array( '1', 'ПОТОЧÐИЙ_МІСЯЦЬ', 'ПОТОЧÐИЙ_МІСЯЦЬ_2', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
'currentmonth1' => array( '1', 'ПОТОЧÐИЙ_МІСЯЦЬ_1', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
'currentmonthname' => array( '1', 'ÐÐЗВÐ_ПОТОЧÐОГО_МІСЯЦЯ', 'ÐÐЗВÐÐИЕ_ТЕКУЩЕГО_МЕСЯЦÐ', 'CURRENTMONTHNAME' ),
@@ -309,7 +309,7 @@ $magicWords = array(
'revisionmonth1' => array( '1', 'МІСЯЦЬ_ВЕРСІЇ_1', 'МЕСЯЦ_ВЕРСИИ_1', 'REVISIONMONTH1' ),
'revisionyear' => array( '1', 'РІК_ВЕРСІЇ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
'revisiontimestamp' => array( '1', 'МІТКÐ_ЧÐСУ_ВЕРСІЇ', 'ОТМЕТКÐ_ВРЕМЕÐИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
- 'revisionuser' => array( '1', 'ВЕРСІЯ_КОРИСТУВÐЧÐ', 'ВЕРСИЯ_УЧÐСÐИКÐ', 'REVISIONUSER' ),
+ 'revisionuser' => array( '1', 'ВЕРСІЯ_КОРИСТУВÐЧÐ', 'ВЕРСИЯ_УЧÐСÐИКÐ', 'ВЕРСИЯ_УЧÐСТÐИКÐ', 'REVISIONUSER' ),
'plural' => array( '0', 'ÐœÐОЖИÐÐ:', 'ÐœÐОЖЕСТВЕÐÐОЕ_ЧИСЛО:', 'PLURAL:' ),
'fullurl' => array( '0', 'ПОВÐÐ_ÐДРЕСÐ:', 'ПОЛÐЫЙ_ÐДРЕС:', 'FULLURL:' ),
'fullurle' => array( '0', 'ПОВÐÐ_ÐДРЕСÐ_2:', 'ПОЛÐЫЙ_ÐДРЕС_2:', 'FULLURLE:' ),
@@ -493,6 +493,7 @@ $messages = array(
'newwindow' => '(відкриваєтьÑÑ Ð² новому вікні)',
'cancel' => 'СкаÑувати',
'moredotdotdot' => 'Детальніше…',
+'morenotlisted' => 'Більше немає нічого…',
'mypage' => 'Сторінка',
'mytalk' => 'ОбговореннÑ',
'anontalk' => 'ÐžÐ±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— IP-адреÑи',
@@ -504,7 +505,6 @@ $messages = array(
'qbbrowse' => 'ПереглÑнути',
'qbedit' => 'Редагувати',
'qbpageoptions' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñторінки',
-'qbpageinfo' => 'Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñторінку',
'qbmyoptions' => 'Мої налаштуваннÑ',
'qbspecialpages' => 'Спеціальні Ñторінки',
'faq' => 'ЧаÑÑ‚Ñ– питаннÑ',
@@ -527,6 +527,7 @@ $messages = array(
'namespaces' => 'ПроÑтори назв',
'variants' => 'Варіанти',
+'navigation-heading' => 'Ðавігаційне меню',
'errorpagetitle' => 'Помилка',
'returnto' => 'ÐŸÐ¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð´Ð¾ Ñторінки «$1».',
'tagline' => 'Матеріал з {{grammar:genitive|{{SITENAME}}}}',
@@ -768,10 +769,10 @@ $1',
# Login and logout pages
'logouttext' => "'''Тепер ви працюєте в тому ж режимі, Ñкий був до вашого входу до ÑиÑтеми.'''
-Ви можете продовжувати викориÑтовувати {{grammar:accusative|{{SITENAME}}}} анонімно або знову [[Special:UserLogin|ввійти до ÑиÑтеми]] Ñк той Ñамий або інший кориÑтувач. ДеÑкі Ñторінки можуть відображатиÑÑ, ніби ви ще предÑтавлені ÑиÑтемі під іменем, щоб уникнути цього, оновіть кеш браузера.",
-'welcomecreation' => '== Вітаємо ваÑ, $1! ==
-Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ñтворено.
-Ðе забудьте змінити Ñвої [[Special:Preferences|Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñайту]].',
+Ви можете продовжувати викориÑтовувати {{grammar:accusative|{{SITENAME}}}} анонімно або знову <span class='plainlinks'>[$1 ввійти до ÑиÑтеми]</span> Ñк той Ñамий або інший кориÑтувач. ДеÑкі Ñторінки можуть відображатиÑÑ, ніби ви ще предÑтавлені ÑиÑтемі під іменем, щоб уникнути цього, оновіть кеш браузера.",
+'welcomeuser' => 'Вітаємо, $1!',
+'welcomecreation-msg' => 'Ваш акаунт було Ñтворено.
+Ðе забудьте змінити Ñвої [[Special:Preferences|Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ {{GRAMMAR:genitive|{{SITENAME}}}}]].',
'yourname' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:",
'yourpassword' => 'Пароль:',
'yourpasswordagain' => 'Повторний набір паролÑ:',
@@ -794,7 +795,7 @@ $1',
'gotaccount' => "Ви вже зареєÑтровані? '''$1'''.",
'gotaccountlink' => 'Увійдіть',
'userlogin-resetlink' => 'Забули дані, потрібні Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ?',
-'createaccountmail' => 'електронною поштою',
+'createaccountmail' => 'ВикориÑтати тимчаÑовий випадковий пароль Ñ– надіÑлати його на адреÑу електронної пошти, вказану нижче',
'createaccountreason' => 'Причина:',
'badretype' => 'Уведені вами паролі не збігаютьÑÑ.',
'userexists' => "Уведене ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача вже Ñ–Ñнує.
@@ -873,6 +874,7 @@ $1',
# Email sending
'php-mail-error-unknown' => 'Ðевідома помилка в PHP-mail() функції',
'user-mail-no-addy' => 'Спроба надÑÐ¸Ð»Ð°Ð½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти без зазначеної адреÑи електронної пошти.',
+'user-mail-no-body' => 'Спроба надіÑлати електронного лиÑта з порожнім або надто коротким вміÑтом.',
# Change password dialog
'resetpass' => 'Змінити пароль',
@@ -920,7 +922,7 @@ $2
ТимчаÑовий пароль: $2",
'passwordreset-emailsent' => 'Електронний лиÑÑ‚ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ð¹.',
'passwordreset-emailsent-capture' => 'Електронний лиÑÑ‚ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŽ було надіÑлано, Ñк показано нижче.',
-'passwordreset-emailerror-capture' => 'Електронний лиÑÑ‚-Ð½Ð°Ð³Ð°Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ð² бути надіÑланий, Ñк показано нижче, але його вдправка не вдалаÑÑŒ через причину: $1',
+'passwordreset-emailerror-capture' => 'Електронний лиÑÑ‚ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¼Ð°Ð² бути надіÑланий, Ñк показано нижче, але його надÑÐ¸Ð»Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачеві $1 не вдалоÑÑ.',
# Special:ChangeEmail
'changeemail' => 'Змінити адреÑу електронної пошти',
@@ -930,6 +932,7 @@ $2
'changeemail-oldemail' => 'Поточна адреÑа електронної пошти:',
'changeemail-newemail' => 'Ðова адреÑа електронної пошти:',
'changeemail-none' => '(немає)',
+'changeemail-password' => 'Ваш пароль проекту {{SITENAME}}:',
'changeemail-submit' => 'Змінити адреÑу електронної пошти',
'changeemail-cancel' => 'СкаÑувати',
@@ -1117,7 +1120,6 @@ $2
'hiddencategories' => 'Ð¦Ñ Ñторінка належить до $1 {{PLURAL:$1|прихованої категорії|прихованих категорій|прихованих категорій}}:',
'edittools' => '<!-- Розміщений тут текÑÑ‚ буде відображатиÑÑ Ð¿Ñ–Ð´ формою Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– формою завантаженнÑ. -->',
'edittools-upload' => '-',
-'nocreatetitle' => 'Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñторінок обмежено',
'nocreatetext' => 'Ðа цьому Ñайті обмежено можливіÑÑ‚ÑŒ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… Ñторінок.
Ви можете повернутьÑÑ Ð½Ð°Ð·Ð°Ð´ й змінити Ñ–Ñнуючу Ñторінку, [[Special:UserLogin|ввійти в ÑиÑтему, або Ñтворити новий обліковий запиÑ]].',
'nocreate-loggedin' => 'У Ð²Ð°Ñ Ð½ÐµÐ¼Ð° дозволу Ñтворювати нові Ñторінки.',
@@ -1142,6 +1144,15 @@ $2
'edit-already-exists' => 'Ðеможливо Ñтворити нову Ñторінку.
Вона вже Ñ–Ñнує.',
'defaultmessagetext' => 'ТекÑÑ‚ «за замовчуваннÑ»',
+'content-failed-to-parse' => 'Ðе вдалоÑÑŒ проаналізувати $2 Ñк тип $1: $3',
+'invalid-content-data' => 'ÐеприпуÑтимі дані',
+'content-not-allowed-here' => 'ВміÑÑ‚ «$1» недопуÑтимий на Ñторінці [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'вікітекÑÑ‚',
+'content-model-text' => 'звичайний текÑÑ‚',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Увага: Ð¦Ñ Ñторінка міÑтить дуже багато викликів реÑурÑоміÑтких функцій.
@@ -1507,9 +1518,9 @@ $1",
'prefs-emailconfirm-label' => 'ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти:',
'prefs-textboxsize' => 'Розмір вікна редагуваннÑ',
'youremail' => 'ÐдреÑа електронної пошти:',
-'username' => "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача:",
-'uid' => 'Ідентифікатор кориÑтувача:',
-'prefs-memberingroups' => 'Член {{PLURAL:$1|групи|груп}}:',
+'username' => "{{GENDER:$1|Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача|Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувачки}}:",
+'uid' => 'Ідентифікатор {{GENDER:$1|кориÑтувача}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Член}} {{PLURAL:$1|групи|груп}}:',
'prefs-memberingroups-type' => '$1',
'prefs-registration' => 'Ð§Ð°Ñ Ñ€ÐµÑ”Ñтрації:',
'prefs-registration-date-time' => '$1',
@@ -1663,12 +1674,13 @@ $1",
'right-sendemail' => 'відправлÑти пошту іншим кориÑтувачам',
'right-passwordreset' => 'ПереглÑд повідомлень електронної пошти Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ паролю',
+# Special:Log/newusers
+'newuserlogpage' => 'Журнал нових кориÑтувачів',
+'newuserlogpagetext' => 'СпиÑок нещодавно зареєÑтрованих кориÑтувачів.',
+
# User rights log
'rightslog' => 'Журнал прав кориÑтувача',
'rightslogtext' => 'Це протокол зміни прав кориÑтувачів.',
-'rightslogentry' => 'змінив права доÑтупу Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача $1 з $2 на $3',
-'rightslogentry-autopromote' => 'був автоматично переведений з $2 до $3',
-'rightsnone' => '(нема)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'переглÑд цієї Ñторінки',
@@ -1916,6 +1928,7 @@ $1',
'backend-fail-notsame' => 'Ðеідентичний файл $1 вже Ñ–Ñнує.',
'backend-fail-invalidpath' => 'ШлÑÑ… Ð´Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ $1 Ñ” недійÑним.',
'backend-fail-delete' => 'Ðе вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ файл $1.',
+'backend-fail-describe' => 'Ðе вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ метадані Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ «$1».',
'backend-fail-alreadyexists' => 'Файл $1 вже Ñ–Ñнує.',
'backend-fail-store' => 'Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ файл $1 у $2.',
'backend-fail-copy' => 'Ðе вдалоÑÑ Ñкопіювати файл $1 в $2.',
@@ -2153,6 +2166,12 @@ $1',
Ймовірно, вони повинні вказувати на відповідну конкретну Ñтаттю.<br />
Сторінка вважаєтьÑÑ Ð±Ð°Ð³Ð°Ñ‚Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾ÑŽ, Ñкщо на ній розміщений шаблон, назва Ñкого Ñ” на Ñторінці [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Сторінки з перевизначеними влаÑтивоÑÑ‚Ñми',
+'pageswithprop-legend' => 'Сторінки з перевизначеними влаÑтивоÑÑ‚Ñми',
+'pageswithprop-text' => 'Тут перераховані Ñторінки, у Ñких були вручну перевизначені окремі влаÑтивоÑÑ‚Ñ–.',
+'pageswithprop-prop' => 'Ðазва влаÑтивоÑÑ‚Ñ–:',
+'pageswithprop-submit' => 'Перейти',
+
'doubleredirects' => 'Подвійні перенаправленнÑ',
'doubleredirectstext' => 'Ðа цій Ñторінці наведено ÑпиÑок перенаправлень на інші перенаправленнÑ.
Кожен Ñ€Ñдок міÑтить поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° перше та друге перенаправленнÑ, а також перший Ñ€Ñдок текÑту другого перенаправленнÑ, що зазвичай міÑтить «реальне» Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° необхідну Ñторінку, куди повинно вказувати й перше перенаправленнÑ.
@@ -2304,9 +2323,9 @@ $1',
'linksearch-pat' => 'Шаблон Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ:',
'linksearch-ns' => 'ПроÑÑ‚Ñ–Ñ€ назв:',
'linksearch-ok' => 'Знайти',
-'linksearch-text' => 'Можна викориÑтовувати підÑтановочні Ñимволи (шаблони), наприклад, "*.wikipedia.org".
-Ðеобхідний домен принаймні верхнього рівнÑ, наприклад "*.org"<br />
-Підтримувані протоколи: <code>$1</code> (за замовчуваннÑм http:// Ñкщо жоден протокол не вказано)',
+'linksearch-text' => 'Можна вживати підÑтановочні Ñимволи, наприклад, «*.wikipedia.org».
+Ðеобхідно зазначити домен, принаймні верхнього рівнÑ, наприклад «*.org».<br />
+{{PLURAL:$2|ПідтримуєтьÑÑ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»|ПідтримуютьÑÑ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð¸}}: <code>$1</code> (за замовчуваннÑм http:// , Ñкщо жоден протокол не зазначено).',
'linksearch-line' => 'ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° $1 із $2',
'linksearch-error' => 'ПідÑтановочні знаки можуть викориÑтовуватиÑÑ Ð»Ð¸ÑˆÐµ на початку адреÑ.',
@@ -2325,10 +2344,6 @@ $1',
'activeusers-hidesysops' => 'Приховати адмініÑтраторів',
'activeusers-noresult' => 'Ðе знайдено кориÑтувачів.',
-# Special:Log/newusers
-'newuserlogpage' => 'Журнал нових кориÑтувачів',
-'newuserlogpagetext' => 'СпиÑок нещодавно зареєÑтрованих кориÑтувачів.',
-
# Special:ListGroupRights
'listgrouprights' => 'Права груп кориÑтувачів',
'listgrouprights-summary' => 'Ðижче наведений ÑпиÑок груп кориÑтувачів у цій вікі Ñ– права Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ— групи.
@@ -2426,20 +2441,23 @@ $1',
'enotif_mailer' => '{{SITENAME}} Служба ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾ÑˆÑ‚Ð¾ÑŽ',
'enotif_reset' => 'Позначити вÑÑ– Ñторінки Ñк переглÑнуті',
-'enotif_newpagetext' => 'Це нова Ñторінка.',
'enotif_impersonal_salutation' => 'КориÑтувач {{grammar:genitive|{{SITENAME}}}}',
-'changed' => 'змінена',
-'created' => 'Ñтворена',
-'enotif_subject' => 'Сторінка проекту «{{SITENAME}}» $PAGETITLE була $CHANGEDORCREATED кориÑтувачем $PAGEEDITOR',
+'enotif_subject_deleted' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було вилучено {{GENDER:$2|кориÑтувачем|кориÑтувачкою}} $2',
+'enotif_subject_created' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було Ñтворено {{GENDER:$2|кориÑтувачем|кориÑтувачкою}} $2',
+'enotif_subject_moved' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було перейменовано {{GENDER:$2|кориÑтувачем|кориÑтувачкою}} $2',
+'enotif_subject_restored' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було відновлено {{GENDER:$2|кориÑтувачем|кориÑтувачкою}} $2',
+'enotif_subject_changed' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було змінено {{GENDER:$2|кориÑтувачем|кориÑтувачкою}} $2',
+'enotif_body_intro_deleted' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було вилучено $PAGEEDITDATE {{GENDER:$2|кориÑтувачем|кориÑтувачкою}} $2, див. $3.',
+'enotif_body_intro_created' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було Ñтворено $PAGEEDITDATE {{GENDER:$2|кориÑтувачем|кориÑтувачкою}} $2, див. поточну верÑÑ–ÑŽ $3.',
+'enotif_body_intro_moved' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було перейменовано $PAGEEDITDATE {{GENDER:$2|кориÑтувачем|кориÑтувачкою}} $2, див. поточну верÑÑ–ÑŽ $3.',
+'enotif_body_intro_restored' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було відновлено $PAGEEDITDATE {{GENDER:$2|кориÑтувачем|кориÑтувачкою}} $2, див. поточну верÑÑ–ÑŽ $3.',
+'enotif_body_intro_changed' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було змінено $PAGEEDITDATE {{GENDER:$2|кориÑтувачем|кориÑтувачкою}} $2, див. поточну верÑÑ–ÑŽ $3.',
'enotif_lastvisited' => 'Див. $1 Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду вÑÑ–Ñ… змін, що відбулиÑÑ Ð¿Ñ–ÑÐ»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ оÑтаннього переглÑду.',
'enotif_lastdiff' => 'Див. $1 Ð´Ð»Ñ Ð¾Ð·Ð½Ð°Ð¹Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· цією зміною.',
'enotif_anon_editor' => 'анонімний кориÑтувач $1',
'enotif_body' => 'Шановний $WATCHINGUSERNAME,
-
-$PAGEEDITDATE Ñторінка проекту «{{SITENAME}}» $PAGETITLE була $CHANGEDORCREATED кориÑтувачем $PAGEEDITOR, дивітьÑÑ $PAGETITLE_URL Ñк поточну верÑÑ–ÑŽ.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Короткий Ð¾Ð¿Ð¸Ñ Ð·Ð¼Ñ–Ð½: $PAGESUMMARY $PAGEMINOREDIT
@@ -2463,6 +2481,8 @@ $UNWATCHURL
Зворотній зв\'Ñзок Ñ– допомога:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'Ñтворена',
+'changed' => 'змінена',
# Delete
'deletepage' => 'Вилучити Ñторінку',
@@ -2533,6 +2553,8 @@ $UNWATCHURL
'prot_1movedto2' => '«[[$1]]» перейменована на «[[$2]]»',
'protect-badnamespace-title' => 'БеззахиÑний проÑÑ‚Ñ–Ñ€ імен',
'protect-badnamespace-text' => 'Сторінки у проÑторі імен не можуть бути захищені.',
+'protect-norestrictiontypes-text' => 'Цю Ñторінку не може бути захищено, бо немає ніÑких типів обмежень.',
+'protect-norestrictiontypes-title' => 'Сторінка, Ñку неможливо захиÑтити',
'protect-legend' => 'ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ñ…Ð¸Ñту',
'protectcomment' => 'Причина:',
'protectexpiry' => 'ЗакінчуєтьÑÑ:',
@@ -2612,7 +2634,8 @@ $UNWATCHURL
'undeletedrevisions' => '$1 {{PLURAL:$1|редагуваннÑ|редагуваннÑ|редагувань}} відновлено',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|верÑÑ–Ñ|верÑÑ–Ñ—|верÑій}} та $2 {{PLURAL:$2|файл|файли|файлів}} відновлено',
'undeletedfiles' => '$1 {{PLURAL:$1|файл|файли|файлів}} відновлено',
-'cannotundelete' => 'Ðе вдалоÑÑ ÑкаÑувати видаленнÑ, хтоÑÑŒ інший вже міг відмінити Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñторінки.',
+'cannotundelete' => 'Помилка відновленнÑ:
+$1',
'undeletedpage' => "'''Сторінка «$1» відновлена'''
Див. [[Special:Log/delete|ÑпиÑок вилучень]], щоб дізнатиÑÑ Ð¿Ñ€Ð¾ оÑтанні Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñ‚Ð° відновленнÑ.",
@@ -2643,7 +2666,7 @@ $1',
'blanknamespace' => '(ОÑновний)',
# Contributions
-'contributions' => 'ВнеÑок кориÑтувача',
+'contributions' => 'ВнеÑок {{GENDER:$1|кориÑтувача|кориÑтувачки}}',
'contributions-title' => 'ВнеÑок кориÑтувача $1',
'mycontris' => 'ВнеÑок',
'contribsub2' => 'ВнеÑок $1 ($2)',
@@ -2913,6 +2936,7 @@ $1',
'immobile-target-namespace-iw' => 'Інтервікі-поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ðµ підходить Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñторінки.',
'immobile-source-page' => 'Цю Ñторінку не можна перейменувати.',
'immobile-target-page' => 'Ðе можна приÑвоїти Ñторінці цю назву.',
+'bad-target-model' => 'Ðеможливо перетворити $1 на $2: неÑуміÑні моделі даних.',
'imagenocrossnamespace' => 'Ðеможливо дати файлові назву з іншого проÑтору назв',
'nonfile-cannot-move-to-file' => 'Ðе можна перейменовувати Ñторінки з інших проÑторів назв на файли',
'imagetypemismatch' => 'Ðове Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ не Ñпівпадає з його типом',
@@ -3023,6 +3047,7 @@ $1',
'import-error-interwiki' => 'Сторінку "$1" не імпортовано, оÑкільки Ñ—Ñ— назва зарезервована Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ñ… поÑилань (interwiki).',
'import-error-special' => 'Сторінку "$1" не імпортовано, оÑкільки вона належить до оÑобливого проÑтору імен, що не дозволÑÑ” ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñторінок.',
'import-error-invalid' => 'Сторінку "$1" не імпортовано, оÑкільки його ім\'Ñ Ð½ÐµÐ¿Ñ€Ð¸Ð¿ÑƒÑтиме.',
+'import-error-unserialize' => 'ВерÑÑ–Ñ $2 Ñторінки «$1» не може бути деÑтруктурованою (деÑеріалізованою). Отримано повідомленнÑ, що у цій верÑÑ–Ñ— викориÑтано модель $3 Ñериалізована Ñк $4.',
'import-options-wrong' => '{{PLURAL:$2|Ðеправильна опціÑ|Ðеправильні опції}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Вказана некоректна назва кореневої Ñторінки',
'import-rootpage-nosubpage' => 'Ð’ проÑторі назв вказаної кореневої Ñторінки «$1» заборонені підÑторінки',
@@ -3037,7 +3062,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'ТеÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ JavaScript',
-'javascripttest-disabled' => 'Цю функцію відключено.',
'javascripttest-title' => 'Працює $1 випробувань',
'javascripttest-pagetext-noframework' => 'Ð¦Ñ Ñторінка призначений Ð´Ð»Ñ Ñ‚ÐµÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Ðевідоме Ñередовище теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ " $1 ".',
@@ -3199,11 +3223,13 @@ The wiki server can't provide data in a format your client can read.",
'pageinfo-default-sort' => 'Ключ ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° замовчуваннÑм',
'pageinfo-length' => 'Довжина Ñторінки (в байтах)',
'pageinfo-article-id' => 'ID Ñторінки',
+'pageinfo-language' => 'Мова вміÑту Ñторінки',
'pageinfo-robot-policy' => 'ІндекÑÐ°Ñ†Ñ–Ñ Ð¿Ð¾ÑˆÑƒÐºÐ¾Ð²Ð¸Ð¼Ð¸ ÑиÑтемами',
'pageinfo-robot-index' => 'ІндекÑуєтьÑÑ',
'pageinfo-robot-noindex' => 'Ðе індекÑуєтьÑÑ',
'pageinfo-views' => 'КількіÑÑ‚ÑŒ переглÑдів',
'pageinfo-watchers' => 'КількіÑÑ‚ÑŒ ÑпоÑтерігачів',
+'pageinfo-few-watchers' => 'Менше ніж $1 {{PLURAL:$1|ÑпоÑтерігач|ÑпоÑтерігачі|ÑпоÑтерігачів}}',
'pageinfo-redirects-name' => 'ÐŸÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð° цю Ñторінку',
'pageinfo-subpages-name' => 'ПідÑторінки цієї Ñторінки',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|перенаправленнÑ|перенаправленнÑ|перенаправлень}}; $3 {{PLURAL:$3|неперенаправленнÑ|неперенаправленнÑ|неперенаправлень}})',
@@ -3218,6 +3244,19 @@ The wiki server can't provide data in a format your client can read.",
'pageinfo-magic-words' => '{{PLURAL:$1|Магічне Ñлово|Магічні Ñлова}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Прихована категоріÑ|Приховані категорії}} ($1)',
'pageinfo-templates' => 'Включено {{PLURAL:$1|шаблон|шаблонів}} ($1)',
+'pageinfo-transclusions' => 'Включено до ($1) {{PLURAL:$1|Ñторінки|Ñторінок}}',
+'pageinfo-toolboxlink' => 'Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñторінку',
+'pageinfo-redirectsto' => 'ПеренаправлÑÑ” на',
+'pageinfo-redirectsto-info' => 'інформаціÑ',
+'pageinfo-contentpage' => 'РахуєтьÑÑ Ñк ÑтаттÑ',
+'pageinfo-contentpage-yes' => 'Так',
+'pageinfo-protect-cascading' => 'ЗвідÑи розпочинаєтьÑÑ ÐºÐ°Ñкадний захиÑÑ‚',
+'pageinfo-protect-cascading-yes' => 'Так',
+'pageinfo-protect-cascading-from' => 'КаÑкадний захиÑÑ‚ починаєтьÑÑ Ñ‚ÑƒÑ‚',
+'pageinfo-category-info' => 'Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ категорію',
+'pageinfo-category-pages' => 'КількіÑÑ‚ÑŒ Ñторінок',
+'pageinfo-category-subcats' => 'КількіÑÑ‚ÑŒ підкатегорій',
+'pageinfo-category-files' => 'КількіÑÑ‚ÑŒ файлів',
# Skin names
'skinname-standard' => 'Стандартне',
@@ -3240,6 +3279,8 @@ The wiki server can't provide data in a format your client can read.",
'markedaspatrollederror' => 'Ðеможливо позначити Ñк перевірену',
'markedaspatrollederrortext' => 'Ви повинні зазначити верÑÑ–ÑŽ, Ñка буде позначена Ñк перевірена.',
'markedaspatrollederror-noautopatrol' => 'Вам не дозволено позначати влаÑні Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñк перевірені.',
+'markedaspatrollednotify' => 'Цю зміну у «$1» було позначено Ñк відпатрульовану.',
+'markedaspatrollederrornotify' => 'Ðе вдалоÑÑ Ð¿Ð¾Ñтавити позначку про патрулюваннÑ.',
# Patrol log
'patrol-log-page' => 'Журнал патрулюваннÑ',
@@ -3273,6 +3314,7 @@ $1',
'file-nohires' => 'Ðема верÑÑ–Ñ— з більшою роздільніÑÑ‚ÑŽ.',
'svg-long-desc' => 'SVG-файл, номінально $1 × $2 пікÑелів, розмір файлу: $3',
'svg-long-desc-animated' => 'Ðнімований SVG-файл, номінально $1 × $2 {{PLURAL:$2|пікÑель|пікÑелі|пікÑелів}}, розмір файлу: $3',
+'svg-long-error' => 'неправильний SVG-файл: $1',
'show-big-image' => 'Повна роздільніÑÑ‚ÑŒ',
'show-big-image-preview' => 'Розмір при попередньому переглÑді: $1.',
'show-big-image-other' => '{{PLURAL:$2|Інша роздільніÑÑ‚ÑŒ|Інші роздільноÑÑ‚Ñ–}}: $1.',
@@ -3307,7 +3349,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 хвилина|$1 хвилини|$1 хвилин}}',
'hours' => '{{PLURAL:$1|$1 година|$1 години|$1 годин}}',
'days' => '{{PLURAL:$1|$1 день|$1 дні|$1 днів}}',
+'months' => '{{PLURAL:$1|$1 міÑÑць|$1 міÑÑці|$1 міÑÑців}}',
+'years' => '{{PLURAL:$1|$1 рік|$1 роки|$1 років}}',
'ago' => '$1 тому',
+'just-now' => 'щойно',
# Bad image list
'bad_image_list' => 'Формат має бути наÑтупним:
@@ -3892,6 +3937,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[«Interwiki transcluding» вимкнено]',
'scarytranscludefailed' => '[Помилка Ð·Ð²ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ шаблону $1]',
+'scarytranscludefailed-httpstatus' => '[Ðе вдалоÑÑŒ завантажити шаблон Ð´Ð»Ñ $1: HTTP $2]',
'scarytranscludetoolong' => '[URL дуже довгий]',
# Delete conflict
@@ -4079,6 +4125,7 @@ $5
'version-license' => 'ЛіцензіÑ',
'version-poweredby-credits' => "Ð¦Ñ Ð’Ñ–ÐºÑ– працює на ÑиÑтемі ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð²Ð¼Ñ–Ñтом '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'інші',
+'version-credits-summary' => 'Ðам хотілоÑÑ Ð± відзначити наÑтупних оÑіб, що зробили внеÑок у [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki Ñ” вільним програмним забезпеченнÑм, ви можете розповÑюджувати та/або модифікувати його відповідно до умов GNU General Public License, Ñка Ð¾Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ¾Ð²Ð°Ð½Ñ Ñ„Ð¾Ð½Ð´Ð¾Ð¼ вільного програмного забезпеченнÑ; або верÑÑ–Ñ— 2 Ліцензії, або (на Ваш розÑуд) будь-Ñкої наÑтупної верÑÑ–Ñ—.
MediaWiki поширюєтьÑÑ Ð² надії, що вона буде кориÑною, але БЕЗ БУДЬ-ЯКИХ ГÐРÐÐТІЙ, навіть без неÑвної гарантії КОМЕРЦІЙÐОЇ ПРИДÐТÐОСТІ чи ПРИДÐТÐОСТІ ДЛЯ ПЕВÐОЇ МЕТИ. ДивітьÑÑ GNU General Public License Ð´Ð»Ñ Ð±Ñ–Ð»ÑŒÑˆ докладної інформації.
@@ -4197,15 +4244,15 @@ MediaWiki поширюєтьÑÑ Ð² надії, що вона буде кориÑ
# New logging system
'logentry-delete-delete' => '$1 {{GENDER:$2|вилучив|вилучила}} Ñторінку $3',
'logentry-delete-restore' => '$1 {{GENDER:$2|відновив|відновила}} Ñторінку $3',
-'logentry-delete-event' => '$1 змінив видиміÑÑ‚ÑŒ {{PLURAL:$5 запиÑу журнала|$5 запиÑів журналу}} на $3: $4',
-'logentry-delete-revision' => '$1 змінив видиміÑÑ‚ÑŒ {{PLURAL:$5 верÑÑ–Ñ—|$5 верÑій}} на Ñторінці $3: $4',
-'logentry-delete-event-legacy' => '$1 змінив видиміÑÑ‚ÑŒ запиÑів журналу подій $3',
-'logentry-delete-revision-legacy' => '$1 змінив видиміÑÑ‚ÑŒ верÑійна Ñторінці $3',
-'logentry-suppress-delete' => '$1 подавив Ñторінку $3',
-'logentry-suppress-event' => '$1 приховано змінив видиміÑÑ‚ÑŒ Ð´Ð»Ñ {{PLURAL:$5|запиÑу|$5 запиÑів}} журналу на $3: $4',
-'logentry-suppress-revision' => '$1 приховано змінив видиміÑÑ‚ÑŒ Ð´Ð»Ñ {{PLURAL:$5 верÑÑ–Ñ—|$5 верÑій}} на Ñторінці $3: $4',
-'logentry-suppress-event-legacy' => '$1 приховано змінив видиміÑÑ‚ÑŒ запиÑів журналу $3',
-'logentry-suppress-revision-legacy' => '$1 приховано змінив видиміÑÑ‚ÑŒ верÑій на Ñторінці $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|змінив|змінила}} видиміÑÑ‚ÑŒ {{PLURAL:$5 запиÑу журналу|$5 запиÑів журналу}} на $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|змінив|змінила}} видиміÑÑ‚ÑŒ {{PLURAL:$5 верÑÑ–Ñ—|$5 верÑій}} на Ñторінці $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|змінив|змінила}} видиміÑÑ‚ÑŒ запиÑів журналу подій $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|змінив|змінила}} видиміÑÑ‚ÑŒ верÑій на Ñторінці $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|подавив|подавила}} Ñторінку $3',
+'logentry-suppress-event' => '$1 приховано {{GENDER:$2|змінив|змінила}} видиміÑÑ‚ÑŒ Ð´Ð»Ñ {{PLURAL:$5|$5 запиÑу|$5 запиÑів}} журналу на $3: $4',
+'logentry-suppress-revision' => '$1 приховано {{GENDER:$2|змінив|змінила}} видиміÑÑ‚ÑŒ Ð´Ð»Ñ {{PLURAL:$5 верÑÑ–Ñ—|$5 верÑій}} на Ñторінці $3: $4',
+'logentry-suppress-event-legacy' => '$1 приховано {{GENDER:$2|змінив|змінила}} видиміÑÑ‚ÑŒ запиÑів журналу $3',
+'logentry-suppress-revision-legacy' => '$1 приховано {{GENDER:$2|змінив|змінила}} видиміÑÑ‚ÑŒ верÑій на Ñторінці $3',
'revdelete-content-hid' => 'вміÑÑ‚ приховано',
'revdelete-summary-hid' => 'Ð¾Ð¿Ð¸Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ñ…Ð¾Ð²Ð°Ð½Ð¾',
'revdelete-uname-hid' => "ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача приховано",
@@ -4218,13 +4265,17 @@ MediaWiki поширюєтьÑÑ Ð² надії, що вона буде кориÑ
'logentry-move-move-noredirect' => '$1 {{GENDER:$2|перейменував|перейменувала}} Ñторінку з $3 на $4 без ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ',
'logentry-move-move_redir' => '$1 {{GENDER:$2|перейменував|перейменувала}} Ñторінку з $3 на $4 поверх перенаправленнÑ',
'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|перейменував|перейменувала}} Ñторінку $3 на $4 поверх Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ– без Ð·Ð°Ð»Ð¸ÑˆÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ',
-'logentry-patrol-patrol' => '$1 відпатрулював верÑÑ–ÑŽ $4 Ñторінки $3',
-'logentry-patrol-patrol-auto' => '$1 автоматично відпатрулював верÑÑ–ÑŽ $4 Ñторінки $3',
-'logentry-newusers-newusers' => 'Створено обліковий Ð·Ð°Ð¿Ð¸Ñ $1',
-'logentry-newusers-create' => '$1 — Ñтворено обліковий запиÑ',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|відпатрулював|відпатрулювала}} верÑÑ–ÑŽ $4 Ñторінки $3',
+'logentry-patrol-patrol-auto' => '$1 автоматично {{GENDER:$2|відпатрулював|відпатрулювала}} верÑÑ–ÑŽ $4 Ñторінки $3',
+'logentry-newusers-newusers' => 'Обліковий Ð·Ð°Ð¿Ð¸Ñ $1 був {{GENDER:$2|Ñтворений}}',
+'logentry-newusers-create' => 'Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð´Ð»Ñ $1 було Ñтворено',
'logentry-newusers-create2' => '$1 {{GENDER:$2|Ñтворив|Ñтворила}} обліковий Ð·Ð°Ð¿Ð¸Ñ {{GENDER:$4|кориÑтувача|кориÑтувачки}} $3',
-'logentry-newusers-autocreate' => '$1 — автоматично Ñтворений обліковий запиÑ',
-'newuserlog-byemail' => 'пароль надіÑланий електронною поштою',
+'logentry-newusers-byemail' => 'Обліковий Ð·Ð°Ð¿Ð¸Ñ {{GENDER:$2|кориÑтувача|кориÑтувачки}} Ñтворений {{GENDER:$4|кориÑтувачем|кориÑтувачкою}} $1 Ñ– пароль було надіÑлано електронною поштою',
+'logentry-newusers-autocreate' => 'Обліковий Ð·Ð°Ð¿Ð¸Ñ $1 було {{GENDER:$2|Ñтворено}} автоматично',
+'logentry-rights-rights' => '$1 {{GENDER:$1|змінив|змінила}} членÑтво в групах Ð´Ð»Ñ $3 із $4 на $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|змінив|змінила}} членÑтво в групах Ð´Ð»Ñ $3',
+'logentry-rights-autopromote' => '$1 було автоматично переведено із $4 в $5',
+'rightsnone' => '(нема)',
# Feedback
'feedback-bugornote' => 'Якщо ви готові опиÑати технічні проблеми в деталÑÑ…, будь лаÑка [ $1 повідомте про помилку].
@@ -4278,6 +4329,7 @@ MediaWiki поширюєтьÑÑ Ð² надії, що вона буде кориÑ
'api-error-ok-but-empty' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: Ñервер не відповідає.',
'api-error-overwrite' => 'Заміну Ñ–Ñнуючого файлу не дозволено.',
'api-error-stashfailed' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: Ñервер не зміг зберегти тимчаÑовий файл.',
+'api-error-publishfailed' => 'Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: Ñервер не зміг опублікувати тимчаÑовий файл.',
'api-error-timeout' => 'Сервер не відповідає протÑгом очікуваного чаÑу.',
'api-error-unclassified' => 'СталаÑÑ Ð½ÐµÐ²Ñ–Ð´Ð¾Ð¼Ð° помилка.',
'api-error-unknown-code' => 'Ðевідома помилка: «$1»',
@@ -4298,4 +4350,7 @@ MediaWiki поширюєтьÑÑ Ð² надії, що вона буде кориÑ
'duration-centuries' => '$1 {{PLURAL:$1|ÑтоліттÑ|ÑтоліттÑ|Ñтоліть}}',
'duration-millennia' => '$1 {{PLURAL:$1|тиÑÑчоліттÑ|тиÑÑчоліттÑ|тиÑÑчоліть}}',
+# Image rotation
+'rotate-comment' => 'Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÑƒÑ‚Ðµ на $1 {{PLURAL:$1|градуÑ|градуÑів}} за годинниковою Ñтрілкою',
+
);
diff --git a/languages/messages/MessagesUr.php b/languages/messages/MessagesUr.php
index 4ff5c91a..b7d12c06 100644
--- a/languages/messages/MessagesUr.php
+++ b/languages/messages/MessagesUr.php
@@ -46,6 +46,115 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'تبادلۂ_خیال_زمرÛ',
);
+$specialPageAliases = array(
+ 'Activeusers' => array( 'متحرک_صارÙین' ),
+ 'Allmessages' => array( 'تمام_پیغامات' ),
+ 'Allpages' => array( 'تمام_صÙحات' ),
+ 'Ancientpages' => array( 'قدیم_صÙحات' ),
+ 'Badtitle' => array( 'خراب_عنوان' ),
+ 'Blankpage' => array( 'خالی_صÙØ­Û' ),
+ 'Block' => array( 'پابندی،_دستور_شبکی_پابندی،_پابندی_بر_صارÙ' ),
+ 'Blockme' => array( 'میری_پابندی' ),
+ 'Booksources' => array( 'کتابی_وسائل' ),
+ 'BrokenRedirects' => array( 'شکستÛ_رجوع_مکررات' ),
+ 'Categories' => array( 'زمرÛ_جات' ),
+ 'ChangeEmail' => array( 'ڈاک_تبدیل' ),
+ 'ChangePassword' => array( 'کلمÛ_شناخت_تبدیل،_تنظیم_کلمÛ_شناخت' ),
+ 'ComparePages' => array( 'موازنÛ_صÙحات' ),
+ 'Confirmemail' => array( 'تصدیق_ڈاک' ),
+ 'Contributions' => array( 'شراکتیں' ),
+ 'CreateAccount' => array( 'تخلیق_کھاتÛ' ),
+ 'Deadendpages' => array( 'مردÛ_صÙحات' ),
+ 'DeletedContributions' => array( 'حذÙ_شدÛ_شراکتیں' ),
+ 'Disambiguations' => array( 'ضد_ابÛام_صÙحات' ),
+ 'DoubleRedirects' => array( 'دوÛرے_رجوع_مکررات' ),
+ 'EditWatchlist' => array( 'ترمیم_زیر_نظر' ),
+ 'Emailuser' => array( 'صارÙ_ڈاک' ),
+ 'Export' => array( 'برآمدگی' ),
+ 'Fewestrevisions' => array( 'Ú©Ù…_نظر_ثانی_شدÛ' ),
+ 'FileDuplicateSearch' => array( 'دÛری_ملÙ_تلاش' ),
+ 'Filepath' => array( 'راÛ_ملÙ' ),
+ 'Import' => array( 'درآمدگی' ),
+ 'Invalidateemail' => array( 'ڈاک_تصدیق_منسوخ' ),
+ 'JavaScriptTest' => array( 'تجربÛ_جاوا_اسکرپٹ' ),
+ 'BlockList' => array( 'ÙÛرست_ممنوع،_ÙÛرست_دستور_شبکی_ممنوع' ),
+ 'LinkSearch' => array( 'تلاش_روابط' ),
+ 'Listadmins' => array( 'ÙÛرست_منتظمین' ),
+ 'Listbots' => array( 'ÙÛرست_روبÛ_جات' ),
+ 'Listfiles' => array( 'ÙÛرست_املاÙØŒ_ÙÛرست_تصاویر' ),
+ 'Listgrouprights' => array( 'ÙÛرست_اختیارات_گروÛØŒ_صارÙÛŒ_گروÛ_اختیارات' ),
+ 'Listredirects' => array( 'ÙÛرست_رجوع_مکررات' ),
+ 'Listusers' => array( 'ÙÛرست_صارÙین،_صارÙ_ÙÛرست' ),
+ 'Log' => array( 'نوشتÛØŒ_نوشتÛ_جات' ),
+ 'Lonelypages' => array( 'یتیم_صÙحات' ),
+ 'Longpages' => array( 'طویل_صÙحات' ),
+ 'MergeHistory' => array( 'ضم_تاریخچÛ' ),
+ 'Movepage' => array( 'منتقلی_صÙØ­Û' ),
+ 'Mycontributions' => array( 'میرا_حصÛ' ),
+ 'Mypage' => array( 'میرا_صÙØ­Û' ),
+ 'Mytalk' => array( 'میری_Ú¯Ùتگو' ),
+ 'Myuploads' => array( 'میرے_زبراثقالات' ),
+ 'Newimages' => array( 'جدید_املاÙØŒ_جدید_تصاویر' ),
+ 'Newpages' => array( 'جدید_صÙحات' ),
+ 'PermanentLink' => array( 'مستقل_ربط' ),
+ 'Popularpages' => array( 'مقبول_صÙحات' ),
+ 'Preferences' => array( 'ترجیحات' ),
+ 'Prefixindex' => array( 'اشاریÛ_سابقÛ' ),
+ 'Protectedpages' => array( 'محÙوظ_صÙحات' ),
+ 'Protectedtitles' => array( 'محÙوظ_عناوین' ),
+ 'Randompage' => array( 'تصادÙØŒ_تصادÙÛŒ_مقالÛ' ),
+ 'Randomredirect' => array( 'تصادÙÛŒ_رجوع_مکرر' ),
+ 'Recentchanges' => array( 'حالیÛ_تبدیلیاں' ),
+ 'Recentchangeslinked' => array( 'متعلقÛ_تبدیلیاں' ),
+ 'Revisiondelete' => array( 'حذÙ_اعادÛ' ),
+ 'Search' => array( 'تلاش' ),
+ 'Shortpages' => array( 'مختصر_صÙحات' ),
+ 'Specialpages' => array( 'خصوصی_صÙحات' ),
+ 'Statistics' => array( 'شماریات' ),
+ 'Uncategorizedcategories' => array( 'غیر_زمرÛ_بند_زمرÛ_جات' ),
+ 'Uncategorizedimages' => array( 'غیر_زمرÛ_بند_املاÙØŒ_غیر_زمرÛ_بند_تصاویر' ),
+ 'Uncategorizedpages' => array( 'غیر_زمرÛ_بند_صÙحات' ),
+ 'Uncategorizedtemplates' => array( 'غیر_زمرÛ_بند_سانچے' ),
+ 'Undelete' => array( 'بحال' ),
+ 'Unusedcategories' => array( 'غیر_مستعمل_زمرÛ_جات' ),
+ 'Unusedimages' => array( 'غیر_مستعمل_املاÙØŒ_غیر_مستعمل_تصاویر' ),
+ 'Unusedtemplates' => array( 'غیر_مستعمل_سانچے' ),
+ 'Unwatchedpages' => array( 'نادیدÛ_صÙحات' ),
+ 'Upload' => array( 'زبراثقال' ),
+ 'Userlogin' => array( 'داخل_نوشتگی' ),
+ 'Userlogout' => array( 'خارج_نوشتگی' ),
+ 'Userrights' => array( 'صارÙÛŒ_اختیارات' ),
+ 'Version' => array( 'اخراجÛ' ),
+ 'Wantedcategories' => array( 'مطلوب_زمرÛ_جات' ),
+ 'Wantedfiles' => array( 'مطلوب_املاÙ' ),
+ 'Wantedpages' => array( 'مطلوب_صÙحات،_شکستÛ_روابط' ),
+ 'Wantedtemplates' => array( 'مطلوب_سانچے' ),
+ 'Watchlist' => array( 'زیر_نظر_ÙÛرست' ),
+ 'Whatlinkshere' => array( 'ÛŒÛاں_کس_کا_رابطÛ' ),
+ 'Withoutinterwiki' => array( 'بدون_بین_الویکی' ),
+);
+
+$magicWords = array(
+ 'redirect' => array( '0', '#رجوع_مکرر', '#REDIRECT' ),
+ 'notoc' => array( '0', '_ÙÛرست_Ù†Ûیں_', '__NOTOC__' ),
+ 'toc' => array( '0', '__ÙÛرست__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__ناتحریرقسم__', '__NOEDITSECTION__' ),
+ 'msg' => array( '0', 'پیغام:', 'MSG:' ),
+ 'subst' => array( '0', 'نقل:', 'SUBST:' ),
+ 'safesubst' => array( '0', 'محÙوظ_نقل:', 'SAFESUBST:' ),
+ 'img_thumbnail' => array( '1', 'تصغیر', 'thumbnail', 'thumb' ),
+ 'img_right' => array( '1', 'دائیں', 'right' ),
+ 'img_left' => array( '1', 'بائیں', 'left' ),
+ 'img_center' => array( '1', 'درمیان', 'center', 'centre' ),
+ 'sitename' => array( '1', 'نام_موقع', 'SITENAME' ),
+ 'grammar' => array( '0', 'قواعد:', 'GRAMMAR:' ),
+ 'gender' => array( '0', 'جنس:', 'GENDER:' ),
+ 'special' => array( '0', 'خاص', 'special' ),
+ 'speciale' => array( '0', 'خاص_عنوان', 'speciale' ),
+ 'index' => array( '1', '__اشاریÛ__', '__INDEX__' ),
+ 'noindex' => array( '1', '__نااشاریÛ__', '__NOINDEX__' ),
+);
+
$messages = array(
# User preference toggles
'tog-underline' => 'ربط کی خط کشیدگی:',
@@ -185,7 +294,6 @@ $messages = array(
'qbbrowse' => 'تصÙّح',
'qbedit' => 'ترمیم',
'qbpageoptions' => 'صÙØ­Û‚ Ûٰذا',
-'qbpageinfo' => 'Ù…ÙÛوم',
'qbmyoptions' => 'میرے صÙحات',
'qbspecialpages' => 'خاص صÙحات',
'faq' => 'معلومات٠عامÛ',
@@ -428,9 +536,7 @@ Warning: Page may not contain recent updates.',
# Login and logout pages
'logouttext' => "'''اب آپ خارج ÛÙˆÚ†Ú©Û’ Ûیں'''
-آپ گمنام طور پر {{SITENAME}} کا استعمال جاری رکھ سکتے Ûیں، یا Ø¯ÙˆØ¨Ø§Ø±Û Ø§Ø³ÛŒ نام یا مختل٠نام سے [[Special:UserLogin|Ø¯ÙˆØ¨Ø§Ø±Û Ø¯Ø§Ø®Ù„Ù Ù†ÙˆØ´ØªÛ]] بھی ÛÙˆ سکتے Ûیں۔ ÛŒÛ ÛŒØ§Ø¯ آوری کرلیجیۓ Ú©Û Ú©Ú†Ú¾ صÙحات ایسے نظر آتے رÛیں Ú¯Û’ Ú©Û Ø¬ÛŒØ³Û’ ابھی آپ خارج Ù†Ûیں Ûوئے ØŒ جب تک آپ اپنے متصÙØ­ کا ابطن ØµØ§Ù Ù†Û Ú©Ø±Ø¯ÛŒÚºÛ”",
-'welcomecreation' => '== خوش آمدید، $1 ! ==
-آپ کا Ú©Ú¾Ø§ØªÛ Ø¨Ù†Ø§ دیا گیا ÛÛ’Û” اپنی [[Special:Preferences|{{SITENAME}} ترجیحات]] مرتب کرنا مت بھولئے گا.',
+آپ گمنام طور پر {{SITENAME}} کا استعمال جاری رکھ سکتے Ûیں، یا Ø¯ÙˆØ¨Ø§Ø±Û Ø§Ø³ÛŒ نام یا مختل٠نام سے <span class='plainlinks'>[$1 Ø¯ÙˆØ¨Ø§Ø±Û Ø¯Ø§Ø®Ù„Ù Ù†ÙˆØ´ØªÛ]</span> بھی ÛÙˆ سکتے Ûیں۔ ÛŒÛ ÛŒØ§Ø¯ آوری کرلیجیۓ Ú©Û Ú©Ú†Ú¾ صÙحات ایسے نظر آتے رÛیں Ú¯Û’ Ú©Û Ø¬ÛŒØ³Û’ ابھی آپ خارج Ù†Ûیں Ûوئے ØŒ جب تک آپ اپنے متصÙØ­ کا ابطن ØµØ§Ù Ù†Û Ú©Ø±Ø¯ÛŒÚºÛ”",
'yourname' => 'اسم٠رکنیت',
'yourpassword' => 'کلمۂ شناخت',
'yourpasswordagain' => 'کلمۂ شناخت Ø¯ÙˆØ¨Ø§Ø±Û Ù„Ú©Ú¾ÛŒÚº',
@@ -658,7 +764,6 @@ $1 نے پابندی لگائی تھی.
'template-protected' => '(محÙوظ شدÛ)',
'template-semiprotected' => '(نیم محÙوظ)',
'hiddencategories' => 'ÛŒÛ ØµÙØ­Û {{PLURAL:$1|1 Ú†ÙÚ¾Ù¾Û’ زمرے|$1 Ú†ÙÚ¾Ù¾Û’ Ø²Ù…Ø±Û Ø¬Ø§Øª}} میں شامل ÛÛ’:',
-'nocreatetitle' => 'تخلیق٠صÙØ­Û Ù…Ø­Ø¯ÙˆØ¯',
'nocreate-loggedin' => 'آپ Ú©Ùˆ نئے صÙحات تخلیق کرنے Ú©ÛŒ اجازت Ù†Ûیں ÛÛ’.',
'sectioneditnotsupported-title' => 'Ù‚Ø·Ø¹Û Ú©ÛŒ تدوین حمایت Ø´Ø¯Û Ù†Ûیں ÛÛ’',
'sectioneditnotsupported-text' => 'اÙس صÙØ­Û Ù…ÛŒÚº Ù‚Ø·Ø¹Û Ú©ÛŒ تدوین حمایت Ø´Ø¯Û Ù†Ûیں ÛÛ’.',
@@ -679,6 +784,10 @@ $1 نے پابندی لگائی تھی.
'edit-already-exists' => 'نیا صÙØ­Û ØªØ®Ù„ÛŒÙ‚ Ù†Ûیں کیا جاسکتا.
ÛŒÛ Ù¾ÛÙ„Û’ سے موجود ÛÛ’.',
+# Content models
+'content-model-text' => 'Ø³Ø§Ø¯Û Ù…ØªÙ†',
+'content-model-javascript' => 'جاوا اسکرپٹ',
+
# History pages
'viewpagelogs' => 'اس صÙØ­Û Ú©ÛŒÙ„ÛŒÛ’ Ù†ÙˆØ´ØªÛ Ø¬Ø§Øª دیکھیے',
'nohistory' => 'اÙس صÙØ­Û Ú©ÛŒÙ„Ø¦Û’ کوئی تدوینی ØªØ§Ø±ÛŒØ®Ú†Û Ù…ÙˆØ¬ÙˆØ¯ Ù†Ûیں ÛÛ’.',
@@ -979,11 +1088,13 @@ HTML tags جانچئے.',
'right-delete' => 'صÙحات حذ٠کریں',
'right-sendemail' => 'دیگر صارÙین Ú©Ùˆ برقی ڈاک بھیجیں',
+# Special:Log/newusers
+'newuserlogpage' => 'نوشتۂ آمد صارÙ',
+'newuserlogpagetext' => 'ÛŒÛ Ù†Û“ صارÙÙˆÚº Ú©ÛŒ آمد کا Ù†ÙˆØ´ØªÛ ÛÛ’',
+
# User rights log
'rightslog' => 'Ù†ÙˆØ´ØªÛ ØµØ§Ø±ÙÛŒ اختیارات',
'rightslogtext' => 'ÛŒÛ ØµØ§Ø±ÙÛŒ اختیارات میں تبدیلیوں کا Ù†ÙˆØ´ØªÛ ÛÛ’Û”',
-'rightslogentry' => 'Ú¯Ø±ÙˆÛ Ø±Ú©Ù†ÛŒØª میں برائے $1 از $2 تا $3 تبدیلی Ûوئی',
-'rightsnone' => '(Ú©Ú†Ú¾ Ù†Ûیں)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'اس صÙØ­Û Ù…ÛŒÚº ترمیم کریں',
@@ -1182,10 +1293,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Special:LinkSearch
'linksearch-line' => '$1 مربوط ÛÛ’ $2 سے',
-# Special:Log/newusers
-'newuserlogpage' => 'نوشتۂ آمد صارÙ',
-'newuserlogpagetext' => 'ÛŒÛ Ù†Û“ صارÙÙˆÚº Ú©ÛŒ آمد کا Ù†ÙˆØ´ØªÛ ÛÛ’',
-
# Special:ListGroupRights
'listgrouprights-members' => '(اراکین Ú©ÛŒ ÙÛرست)',
@@ -1212,9 +1319,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
'wlshowlast' => 'دکھائیں آخری $1 گھنٹے $2 دن $3',
'watchlist-options' => 'اختیارات برائے زیرÙنظرÙÛرست',
-'enotif_newpagetext' => 'ÛŒÛ Ù†ÛŒØ§ صÙØ­Û ÛÛ’.',
-'changed' => 'تبدیل کردیاگیا',
'created' => 'بنا دیا گیا',
+'changed' => 'تبدیل کردیاگیا',
# Delete
'deletepage' => 'صÙØ­Û Ø¶Ø§Ø¦Ø¹ کریں',
@@ -1529,6 +1635,9 @@ $1 × $2 عکصر (پکسلز)ØŒ حجم ملÙ: $3ØŒ MIME قسم: $4',
# Special:SpecialPages
'specialpages' => 'خصوصی صÙحات',
+# New logging system
+'rightsnone' => '(Ú©Ú†Ú¾ Ù†Ûیں)',
+
# Search suggestions
'searchsuggest-search' => 'تلاش',
diff --git a/languages/messages/MessagesUz.php b/languages/messages/MessagesUz.php
index a8511947..168b33e6 100644
--- a/languages/messages/MessagesUz.php
+++ b/languages/messages/MessagesUz.php
@@ -52,6 +52,54 @@ $namespaceAliases = array(
'Kategoriya_munozarasi' => NS_CATEGORY_TALK,
);
+$magicWords = array(
+ 'redirect' => array( '0', '#YONALTIRISH', '#REDIRECT' ),
+ 'notoc' => array( '0', '__ICHIDAGILARYOQ__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__GALEREYAYOQ__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__ICHIDAGILARMAJBURIY__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__ICHIDAGILARI__', '__ICHIDAGILAR__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__TAHRIRYOQ__', '__TARTIBLASHYOQ__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', 'JORIYOY', 'JORIYOY2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonth1' => array( '1', 'JORIYOY1', 'CURRENTMONTH1' ),
+ 'currentmonthname' => array( '1', 'JORIYOYNOMI', 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( '1', 'JORIYOYNOMIQARATQICH', 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( '1', 'JORIYOYQISQARTMASI', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', 'JORIYKUN', 'CURRENTDAY' ),
+ 'currentday2' => array( '1', 'JORIYKUN2', 'CURRENTDAY2' ),
+ 'currentdayname' => array( '1', 'JORIYKUNNOMI', 'CURRENTDAYNAME' ),
+ 'currentyear' => array( '1', 'JORIYYIL', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'JORIYVAQT', 'CURRENTTIME' ),
+ 'currenthour' => array( '1', 'JORIYSOAT', 'CURRENTHOUR' ),
+ 'localmonth' => array( '1', 'MAHALLIYOY', 'MAHALLIYOY2', 'LOCALMONTH', 'LOCALMONTH2' ),
+ 'localmonth1' => array( '1', 'MAHALLIYOY1', 'LOCALMONTH1' ),
+ 'localmonthname' => array( '1', 'MAHALLIYOYNOMI', 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( '1', 'MAHALLIYOYQARATQICH', 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( '1', 'MAHALLIYOYQISQARTMASI', 'LOCALMONTHABBREV' ),
+ 'localday' => array( '1', 'MAHALLIYKUN', 'LOCALDAY' ),
+ 'localday2' => array( '1', 'MAHALLIYKUN2', 'LOCALDAY2' ),
+ 'localdayname' => array( '1', 'MAHALLIYKUNNOMI', 'LOCALDAYNAME' ),
+ 'localyear' => array( '1', 'MAHALLIYYIL', 'LOCALYEAR' ),
+ 'localtime' => array( '1', 'MAHALLIYVAQT', 'LOCALTIME' ),
+ 'localhour' => array( '1', 'MAHALLIYSOAT', 'LOCALHOUR' ),
+ 'numberofpages' => array( '1', 'SAHIFASONI', 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( '1', 'MAQOLASONI', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'FAYLSONI', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'FOYDALANUVCHISONI', 'NUMBEROFUSERS' ),
+ 'numberofactiveusers' => array( '1', 'FAOLFOYDALANUVCHISONI', 'NUMBEROFACTIVEUSERS' ),
+ 'numberofedits' => array( '1', 'OZGARISHSONI', 'NUMBEROFEDITS' ),
+ 'numberofviews' => array( '1', 'KORISHSONI', 'NUMBEROFVIEWS' ),
+ 'pagename' => array( '1', 'SAHIFANOMI', 'PAGENAME' ),
+ 'numberofadmins' => array( '1', 'ADMINISTRATORSONI', 'NUMBEROFADMINS' ),
+ 'special' => array( '0', 'maxsus', 'special' ),
+ 'tag' => array( '0', 'yorliq', 'tag' ),
+ 'hiddencat' => array( '1', '__YASHIRINTURKUM__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', 'TURKUMDAGISAHIFALAR', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+ 'pagesize' => array( '1', 'SAHIFAHAJMI', 'PAGESIZE' ),
+ 'index' => array( '1', '__INDEKS__', '__INDEX__' ),
+ 'noindex' => array( '1', '__INDEKSYOQ__', '__NOINDEX__' ),
+ 'url_wiki' => array( '0', 'VIKI', 'WIKI' ),
+);
+
$linkTrail = '/^([a-zʻʼ“»]+)(.*)$/sDu';
$messages = array(
@@ -191,6 +239,7 @@ $messages = array(
'newwindow' => '(yangi oynada ochiladi)',
'cancel' => 'Bekor qilish',
'moredotdotdot' => 'Batafsil...',
+'morenotlisted' => 'Boshqa hech nima yoʻq...',
'mypage' => 'Sahifa',
'mytalk' => 'Munozara',
'anontalk' => 'Ushbu IP-manzil munozarasi',
@@ -202,7 +251,6 @@ $messages = array(
'qbbrowse' => 'Koʻrish',
'qbedit' => 'Tahrirlash',
'qbpageoptions' => 'Ushbu sahifa moslamalari',
-'qbpageinfo' => "Sahifa haqida ma'lumot",
'qbmyoptions' => 'Moslamalarim',
'qbspecialpages' => 'Maxsus sahifalar',
'faq' => 'TSS',
@@ -225,6 +273,7 @@ $messages = array(
'namespaces' => 'Nomfazolar',
'variants' => 'Variantlar',
+'navigation-heading' => 'Navigatsiya',
'errorpagetitle' => 'Xato',
'returnto' => '$1 sahifasiga qaytish.',
'tagline' => '{{SITENAME}} dan olingan',
@@ -402,9 +451,6 @@ Ushbu xabar tarjimasini qo'shish yoki o'zgartirish uchun, iltimos, MediaWikining
{{SITENAME}} saytidan anonim holda foydalanishda davom etishindiz mumkin. Yoki siz yana hozirgi yoki boshqa foydalanuvchi nomi bilan qaytadan tizimga kirishingiz mumkin.
Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguningizga qadar xuddi tizimga kirganingizdagidek ko'rinishda davom etaverishi mumkin.",
-'welcomecreation' => '== Xush kelibsiz, $1! ==
-Siz yangi hisob yaratdingiz.
-[[Special:Preferences|{{SITENAME}}dagi shaxsiy moslamalaringizni]] oʻzgartirish yodingizdan chiqmasin.',
'yourname' => 'Foydalanuvchi nomi',
'yourpassword' => 'Maxfiy soʻz',
'yourpasswordagain' => 'Maxfiy so‘zni qayta kiriting:',
@@ -563,7 +609,6 @@ Bundan tashqari, siz ushbu ma'lumotlarni o'zingiz yozgan bo'lishingiz yoki ruxsa
'template-protected' => '(himoyalangan)',
'template-semiprotected' => '(yarim-himoyalangan)',
'hiddencategories' => 'Ushbu sahifa {{PLURAL:$1|1 yashirin turkum|$1 yashirin turkumlar}}ga kiradi:',
-'nocreatetitle' => 'Sahifalarni yaratish cheklangan',
'nocreatetext' => 'Ushbu saytda yangi sahifalar yaratish taqiqlagan.
Ortga qaytib, mavjud sahifani tahrirlashingiz yoki [[Special:UserLogin|tizimga kirishingiz]] mumkin.',
'nocreate-loggedin' => "Sizda yangi sahifalar yaratishga ruxsat yo'q.",
@@ -872,9 +917,12 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
'right-read' => "Sahifalarni o'qish",
'right-edit' => 'Sahifalarni tahrirlash',
+# Special:Log/newusers
+'newuserlogpage' => 'Foydalanuvchilarni roʻyxatga olish qaydlari',
+'newuserlogpagetext' => 'Yaqinda roʻyxatdan oʻtgan foydalanuvchilar roʻyxati',
+
# User rights log
'rightslog' => 'Foydalanuvchi huquqlari koʻrsatilgan qaydlar',
-'rightslogentry' => 'foydalanuvchi $1 $2 guruhidan $3 guruhiga oʻtkazildi',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'ushbu sahifani tahrirlash',
@@ -1088,10 +1136,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'activeusers-hidesysops' => 'Maʼmurlarni yashirish',
'activeusers-noresult' => 'Foydalanuvchilar topilmadi.',
-# Special:Log/newusers
-'newuserlogpage' => 'Foydalanuvchilarni roʻyxatga olish qaydlari',
-'newuserlogpagetext' => 'Yaqinda roʻyxatdan oʻtgan foydalanuvchilar roʻyxati',
-
# Special:ListGroupRights
'listgrouprights' => 'Foydalanuvchilar guruhi huquqlari',
'listgrouprights-group' => 'Guruh',
@@ -1156,43 +1200,48 @@ Agar siz bu sahifani kuzatuv ro'yxatingizdan o'chirmoqchi bo'lsangiz \"Kuzatmasl
'enotif_mailer' => "{{SITENAME}} Pochta orqali e'lon qilish xizmati",
'enotif_reset' => "Hamma sahifalarni ko'rib chiqilgan deb belgilash",
-'enotif_newpagetext' => 'Bu yangi sahifa',
'enotif_impersonal_salutation' => '{{SITENAME}} ishtirokchisi',
-'changed' => 'o‘zgartirildi',
-'created' => 'yaratildi',
-'enotif_subject' => '"{{SITENAME}}" loyihasining $PAGETITLE sahifasi $PAGEEDITOR tomonidan $CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan o‘chirildi',
+'enotif_subject_created' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan yaratildi',
+'enotif_subject_moved' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan qayta nomlandi',
+'enotif_subject_restored' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan tiklandi',
+'enotif_subject_changed' => '{{SITENAME}} loyihasining $1 nomli sahifasi foydalanuvchi {{gender:$2|$2}} tomonidan oʻzgartirildi',
+'enotif_body_intro_deleted' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan o‘chirildi, qarang: $3.',
+'enotif_body_intro_created' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan yaratildi, joriy variantini ko‘rish uchun $3 ga qarang.',
+'enotif_body_intro_moved' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan qayta nomlandi, joriy variantini ko‘rish uchun $3 ga qarang.',
+'enotif_body_intro_restored' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan tiklandi, joriy variantini ko‘rish uchun $3 ga qarang.',
+'enotif_body_intro_changed' => '{{SITENAME}} loyihasining $1 nomli sahifasi $PAGEEDITDATEda foydalanuvchi {{gender:$2|$2}} tomonidan o‘zgartirildi, joriy variantini ko‘rish uchun $3 ga qarang.',
'enotif_lastvisited' => "Oxirgi tashrifingizdan buyon sodir bo'lgan barcha o'zgarishlarni ko'rish uchun $1 ga qarang.",
'enotif_lastdiff' => "O'zgarishlar bilan tanishish uchun $1 ga qarang.",
'enotif_anon_editor' => 'anonim foydalanuvchi $1',
-'enotif_body' => "Hurmatli \$WATCHINGUSERNAME,
+'enotif_body' => 'Hurmatli $WATCHINGUSERNAME,
-\$PAGEEDITDATE kuni \"{{SITENAME}}\" loyihasining \$PAGETITLE sahifasi ishtirokchi \$PAGEEDITOR tomonidan \$CHANGEDORCREATED, joriy versiyani ko'rish uchun \$PAGETITLE_URL havolasi bo'yicha o'ting.
+$PAGEINTRO $NEWPAGE
-\$NEWPAGE
-
-O'zgarish bo'yicha qisqacha izoh: \$PAGESUMMARY \$PAGEMINOREDIT
+O‘zgarish bo‘yicha qisqacha izoh: $PAGESUMMARY $PAGEMINOREDIT
Tahrirlovchiga murojaat qilish:
-el. pochta: \$PAGEEDITOR_EMAIL
-viki: \$PAGEEDITOR_WIKI
+el. pochta: $PAGEEDITOR_EMAIL
+viki: $PAGEEDITOR_WIKI
-Agar siz sahifaga o'tib ko'rmasangiz, u holda uning keyingi o'zgarishlari bo'yicha boshqa bildirish xabarlari kelmaydi.
-Siz shuningdek o'zingizning kuzatuv ro'yxatingizda barcha sahifalar uchun bildirish moslamasini o'chirishingiz mumkin.
+Agar siz sahifaga o‘tib ko‘rmasangiz, u holda uning keyingi o‘zgarishlari bo‘yicha boshqa bildirish xabarlari kelmaydi. Siz, shuningdek o‘z kuzatuv ro‘yxatingizda barcha sahifalar uchun xabar berish moslamasini o‘chirishingiz mumkin.
- {{grammar:genitive|{{SITENAME}}}}ning axborot berish tizimi
+{{SITENAME}}ning xabar berish tizimi
--
-Bildirishlar moslamalarini o'zgartirish
+Xabar berish moslamalarini o‘zgartirish uchun quyidagi havola bo‘yicha o‘ting
{{canonicalurl:{{#special:Preferences}}}}
-O'zingizning kuzatuv ro'yxatingiz moslamalarini o'zgartirish
+Oʻz kuzatuv roʻyxatingiz moslamalarini o‘zgartirish uchun quyidagi havola bo‘yicha o‘ting
{{canonicalurl:{{#special:EditWatchlist}}}}
-Sizning kuzatuv ro'yxatingizdagi sahifalarni o'chirish
-\$UNWATCHURL
+Oʻz kuzatuv roʻyxatingizdan sahifani o‘chirish uchun quyidagi havola bo‘yicha o‘ting
+$UNWATCHURL
Qayta aloqa va yordam
-{{canonicalurl:{{MediaWiki:Helppage}}}}",
+{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'yaratildi',
+'changed' => 'o‘zgartirildi',
# Delete
'deletepage' => "Sahifani o'chirish",
@@ -1286,7 +1335,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
'blanknamespace' => '(asosiy)',
# Contributions
-'contributions' => 'Foydalanuvchining hissasi',
+'contributions' => '{{GENDER:$1|Foydalanuvchi}} hissasi',
'contributions-title' => '{{GENDER:$1|Foydalanuvchi}} $1 hissasi',
'mycontris' => 'Hissam',
'contribsub2' => '$1 uchun ($2)',
@@ -1513,6 +1562,8 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
'pageinfo-article-id' => 'Sahifa identifikatori',
'pageinfo-watchers' => 'Sahifa kuzatuvchilari soni',
'pageinfo-edits' => 'Jami tahrirlar soni',
+'pageinfo-toolboxlink' => 'Sahifa haqida maʼlumot',
+'pageinfo-redirectsto' => 'Qayta yoʻnaltirish',
# Skin names
'skinname-standard' => 'Klassik',
diff --git a/languages/messages/MessagesVec.php b/languages/messages/MessagesVec.php
index e628bede..0a2a7c84 100644
--- a/languages/messages/MessagesVec.php
+++ b/languages/messages/MessagesVec.php
@@ -67,7 +67,8 @@ $specialPageAliases = array(
'Booksources' => array( 'SercaISBN' ),
'BrokenRedirects' => array( 'RimandiSbalià' ),
'Categories' => array( 'Categorie' ),
- 'ChangePassword' => array( 'ReinpostaPassword' ),
+ 'ChangeEmail' => array( 'CanbiaEmail' ),
+ 'ChangePassword' => array( 'CanbiaPassword' ),
'ComparePages' => array( 'ConfrontaPagine' ),
'Confirmemail' => array( 'ConfermaEMail' ),
'Contributions' => array( 'Contributi' ),
@@ -76,6 +77,7 @@ $specialPageAliases = array(
'DeletedContributions' => array( 'ContributiScancelà' ),
'Disambiguations' => array( 'Disanbiguassion' ),
'DoubleRedirects' => array( 'DópiRimandi' ),
+ 'EditWatchlist' => array( 'CanbiaTegnuiDeOcio' ),
'Emailuser' => array( 'MandaEMail' ),
'Export' => array( 'Esporta' ),
'Fewestrevisions' => array( 'PagineConMancoRevision' ),
@@ -99,6 +101,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'SercaMIME' ),
'Mostcategories' => array( 'PagineConPiassèCategorie' ),
'Mostimages' => array( 'FilePiassèDoparà' ),
+ 'Mostinterwikis' => array( 'PiassèInterwiki' ),
'Mostlinked' => array( 'PaginePiassèRiciamà' ),
'Mostlinkedcategories' => array( 'CategoriePiassèDoparà' ),
'Mostlinkedtemplates' => array( 'ModèiPiassèDoparà' ),
@@ -107,8 +110,11 @@ $specialPageAliases = array(
'Mycontributions' => array( 'IMeContributi' ),
'Mypage' => array( 'LaMePaginaUtente' ),
'Mytalk' => array( 'LeMeDiscussion' ),
+ 'Myuploads' => array( 'IMeCaricamenti' ),
'Newimages' => array( 'FileNovi' ),
'Newpages' => array( 'PagineNove' ),
+ 'PasswordReset' => array( 'ReinpostaPassword' ),
+ 'PermanentLink' => array( 'LinkParmanente' ),
'Popularpages' => array( 'PaginePiassèVisità' ),
'Preferences' => array( 'Preferense' ),
'Prefixindex' => array( 'Prefissi' ),
@@ -119,7 +125,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'ÙltimiCanbiamenti' ),
'Recentchangeslinked' => array( 'CanbiamentiLigà' ),
'Revisiondelete' => array( 'ScancelaRevision' ),
- 'RevisionMove' => array( 'SpostaRevision' ),
'Search' => array( 'Serca' ),
'Shortpages' => array( 'PaginePiCurte' ),
'Specialpages' => array( 'PagineSpeciali' ),
@@ -283,6 +288,7 @@ $messages = array(
'newwindow' => '(se verze in te na finestra nova)',
'cancel' => 'Lassa star',
'moredotdotdot' => 'Altro...',
+'morenotlisted' => 'Altro nó elencà',
'mypage' => 'Pàjina',
'mytalk' => 'Discussion',
'anontalk' => 'Discusion par sto IP',
@@ -294,7 +300,6 @@ $messages = array(
'qbbrowse' => 'Sfoja',
'qbedit' => 'Canbia',
'qbpageoptions' => 'Opsion pajina',
-'qbpageinfo' => 'Informasion so Å‚a pajina',
'qbmyoptions' => 'Åe me pajine',
'qbspecialpages' => 'Pagine speciali',
'faq' => 'Domande frequenti',
@@ -317,6 +322,7 @@ $messages = array(
'namespaces' => 'Namespace',
'variants' => 'Varianse',
+'navigation-heading' => 'Menù de navigassion',
'errorpagetitle' => 'Erore',
'returnto' => 'Torna a $1.',
'tagline' => 'Da {{SITENAME}}',
@@ -557,12 +563,11 @@ L\'aministradore che ło ga blocà ga fornìo sta spiegasion: "$3".',
# Login and logout pages
'logouttext' => "'''Te sì 'ndà fora da la to utensa.'''
-Te poli 'ndar vanti doparando {{SITENAME}} come utente anonimo o se nò [[Special:UserLogin|entrar da novo]], col stesso nome utente o uno difarente.
+Te poli 'ndar vanti doparando {{SITENAME}} come utente anonimo o se nò <span class='plainlinks'>[$1 entrar da novo]</span>, col stesso nome utente o uno difarente.
Ocio che serte pagine podarìa èssar che ti 'e vedi come se te fussi 'ncora drento col to nome de prima, fin che no te neti la ''cache'' del to browser.",
-'welcomecreation' => '== Benvegnù, $1! ==
-
-El to nome utente el xe stà creà.
-Te poli sistemarte come te vol le to [[Special:Preferences|prefarense de {{SITENAME}}]].',
+'welcomeuser' => 'Benvegnù, $1!',
+'welcomecreation-msg' => 'El to nome utente el xe stà creà.
+Nó desmentegarte de personałixare łe [[Special:Preferences|prefarense de {{SITENAME}}]].',
'yourname' => 'Nome utente:',
'yourpassword' => 'Password:',
'yourpasswordagain' => 'De novo la password:',
@@ -585,7 +590,7 @@ Te poli sistemarte come te vol le to [[Special:Preferences|prefarense de {{SITEN
'gotaccount' => "Sito zà iscrito? '''$1'''.",
'gotaccountlink' => 'Entra',
'userlogin-resetlink' => "Desmentegà i to dati d'aceso?",
-'createaccountmail' => 'Par e-mail',
+'createaccountmail' => 'Dopara na password caxuałe tenporanea e inviała al indiriso e-mail spesifegà cuà soto',
'createaccountreason' => 'Motivassion:',
'badretype' => 'Le do password le xe difarenti.',
'userexists' => 'El nome utente inserido vien xa doparà da cualchedun altro.
@@ -650,6 +655,7 @@ Spèta un tocheto prima de proàr da novo.',
# Email sending
'php-mail-error-unknown' => "Erore sconosudo nte'l funsionamento deła posta ełetronega PHP",
'user-mail-no-addy' => 'Te ghe provà spedire un mesajo de posta ełetronega sensa un indiriso.',
+'user-mail-no-body' => 'Tentà de inviar na e-mail có un testo vodo o masa curto.',
# Change password dialog
'resetpass' => 'Cànbia la password',
@@ -711,6 +717,7 @@ Password tenporanea: $2',
'changeemail-oldemail' => 'Indiriso de posta ełetronega atuałe:',
'changeemail-newemail' => 'Novo indiriso de posta ełetronega:',
'changeemail-none' => '(nisun)',
+'changeemail-password' => 'Åa password so {{SITENAME}}:',
'changeemail-submit' => 'Canbia indiriso de posta ełetronega',
'changeemail-cancel' => 'Anuła',
@@ -881,7 +888,6 @@ L'aministrador che gà blocà el database el gà dato ła seguente spiegasion: $
'template-protected' => '(proteto)',
'template-semiprotected' => '(semiproteto)',
'hiddencategories' => 'Sta pagina la xe drento a {{PLURAL:$1|na categoria sconta|$1 categorie sconte}}:',
-'nocreatetitle' => 'Creazion de le pagine limitada',
'nocreatetext' => 'La possibilità de crear pagine nóve su {{SITENAME}} la xe stà limità ai soli utenti registrà. Se pol tornar indrìo e modificar na pagina esistente, opure [[Special:UserLogin|entrar o crear un nóvo acesso]].',
'nocreate-loggedin' => 'No te ghè i permessi necessari a crear pagine nove.',
'sectioneditnotsupported-title' => 'Modifica de sezion mia suportà',
@@ -905,6 +911,15 @@ Pararìa che la sìpia stà scancelà.',
'edit-already-exists' => 'No se pol crear na pagina nova.
La esiste de zà.',
'defaultmessagetext' => 'Testo predefinìo',
+'content-failed-to-parse' => "Inposibiłe anałixare $2 pa'l modèl $1: $3",
+'invalid-content-data' => 'Dati contegnui nó vałidi',
+'content-not-allowed-here' => 'Contegnùo in "$1" nó consentio inte ła pàjina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitesto',
+'content-model-text' => 'testo normal',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Ocio: Sta pagina la contien dele chiamate de funzion al parser massa onerose.
@@ -1263,9 +1278,9 @@ Sta operassion no la pol èssar anulà.',
'prefs-emailconfirm-label' => "Conferma de l'e-mail:",
'prefs-textboxsize' => 'Dimension de la casèla de modifica',
'youremail' => 'La to e-mail',
-'username' => 'Nome utente:',
-'uid' => 'ID utente:',
-'prefs-memberingroups' => 'Menbro {{PLURAL:$1|del grupo|dei grupi}}:',
+'username' => '{{GENDER:$1|Nome utente}}:',
+'uid' => '{{GENDER:$1|ID utente}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Menbro}} {{PLURAL:$1|del grupo|de i grupi}}:',
'prefs-registration' => 'Data de registrassion:',
'yourrealname' => 'El to vero nome:',
'yourlanguage' => 'Lengua:',
@@ -1414,12 +1429,13 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
'right-sendemail' => 'Mandarghe e-mail a cheialtri utenti',
'right-passwordreset' => 'Vedi i mesaji de rinpostasion de Å‚a password',
+# Special:Log/newusers
+'newuserlogpage' => 'Novi utenti',
+'newuserlogpagetext' => 'Sto qua el xè el registro dei novi utenti registrai.',
+
# User rights log
'rightslog' => 'Diriti de i utenti',
'rightslogtext' => 'Sto qua el xe el registro de le modifiche ai diriti assegnà ai utenti.',
-'rightslogentry' => "gà modificà l'apartenenza de $1 dal grupo $2 al grupo $3",
-'rightslogentry-autopromote' => 'xe stà automategamente promoso/a da $2 a $3',
-'rightsnone' => '(nissun)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lèxar sta pàxena',
@@ -1643,6 +1659,7 @@ Se el problema el persiste, contatar un [[Special:ListUsers/sysop|aministrador]]
'backend-fail-notsame' => 'Existe xà un file no identico a $1 .',
'backend-fail-invalidpath' => '$1 no xe un percorso de archiviasion vałido.',
'backend-fail-delete' => 'Inposibiłe scançełare el file "$1".',
+'backend-fail-describe' => 'Inposibiłe modifegar i metadati del file "$1".',
'backend-fail-alreadyexists' => 'El file $1 existe xà.',
'backend-fail-store' => 'Inposibiłe memorixare el file $1 in $2 .',
'backend-fail-copy' => 'Inposibiłe copiare el file "$1" in "$2".',
@@ -1875,6 +1892,12 @@ Probabilmente te vui modifegar ła descrision prexente inte ła [$2 pàjina de d
Åe podaria dover puntar a na pàjina pì apropià.<br />
Vien considerae pàjine de dixanbiguasion tute cuełe che łe ga drento i modełi elencai in [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Pagine co na proprietà de pagina',
+'pageswithprop-legend' => 'Pagine co na proprietà de pagina',
+'pageswithprop-text' => 'Sta pagina la elenca le pagine che dòpara na particolare proprietà de pagina.',
+'pageswithprop-prop' => 'Nome proprietà:',
+'pageswithprop-submit' => 'Và',
+
'doubleredirects' => 'Redirect dopi',
'doubleredirectstext' => 'Sta pagina le elenca pagine che rimanda a altre pagine de rimando.
Ogni riga la contien dei colegamenti al primo e al secondo rimando, oltre a la destinassion del secondo rimando, che de solito la xe la "vera" pagina de destinassion, a cui dovarìa pontar el primo rimando.
@@ -2025,9 +2048,9 @@ Varda anca le [[Special:WantedCategories|categorie domandà]].',
'linksearch-pat' => 'Espression de riserca:',
'linksearch-ns' => 'Namespace:',
'linksearch-ok' => 'Serca',
-'linksearch-text' => 'Xe posibiłe doparare metacarateri, come "*.wikipedia.org".<br />
-Xe necesario almanco un dominio de primo liveło, tipo "*.org".<br />
-Protocołi suportadi: <code>$1</code> (no sta xontare nesuno de sti cuà inte ła to riçerca).',
+'linksearch-text' => 'Xe posibiłe doparare metacarateri, come "*.wikipedia.org".
+Xe nesesario almanco un dominio de primo liveło, tipo "*.org".<br />
+{{PLURAL:$2|Protocoło suportà|Protocołi suportai}}: <code>$1</code> (predefinio http:// se nisun protocoło el xe spesifegà).',
'linksearch-line' => '$1 presente ne la pagina $2',
'linksearch-error' => "I metacaràteri i pode vegner doparài solo a l'inizio del nome de l'host.",
@@ -2046,10 +2069,6 @@ Protocołi suportadi: <code>$1</code> (no sta xontare nesuno de sti cuà inte ł
'activeusers-hidesysops' => 'Scondi i aministradori',
'activeusers-noresult' => 'Nissun utente catà.',
-# Special:Log/newusers
-'newuserlogpage' => 'Novi utenti',
-'newuserlogpagetext' => 'Sto qua el xè el registro dei novi utenti registrai.',
-
# Special:ListGroupRights
'listgrouprights' => 'Diriti dei grupi utenti',
'listgrouprights-summary' => 'Sta qua la xe na lista dei grupi de utenti definìi su sta wiki, coi diriti asocià a ognuno.
@@ -2144,40 +2163,48 @@ I futuri canbiamenti a sta pàjina e a ła so pàjina de discusion i vegnarà el
'enotif_mailer' => 'Sistema de notifica via e-mail de {{SITENAME}}',
'enotif_reset' => 'Segna tute le pagine come zà viste',
-'enotif_newpagetext' => 'Sta qua la xe na nova pàxena.',
'enotif_impersonal_salutation' => 'Utente de {{SITENAME}}',
-'changed' => 'canbià',
-'created' => 'creà',
-'enotif_subject' => 'La pagina $PAGETITLE de {{SITENAME}} la xe stà $CHANGEDORCREATED da $PAGEEDITOR',
+'enotif_subject_deleted' => 'Åa pàjina $1 de {{SITENAME}} Å‚a xe sta scansełà da {{gender:$2|$2}}',
+'enotif_subject_created' => 'Åa pàjina $1 de {{SITENAME}} Å‚a xe sta creà da {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Åa pàjina $1 de {{SITENAME}} Å‚a xe sta spostà da {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Åa pàjina $1 de {{SITENAME}} Å‚a xe sta ripristinà da {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Åa pàjina $1 de {{SITENAME}} Å‚a xe sta canbià da {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Åa pàjina $1 de {{SITENAME}} Å‚a xe sta scansełà da {{gender:$2|$2}} el $PAGEEDITDATE (varda $3 par Å‚a version atuaÅ‚e).',
+'enotif_body_intro_created' => 'Åa pàjina $1 de {{SITENAME}} Å‚a xe sta creà da {{gender:$2|$2}} el $PAGEEDITDATE (varda $3 par Å‚a version atuaÅ‚e).',
+'enotif_body_intro_moved' => 'Åa pàjina $1 de {{SITENAME}} Å‚a xe sta spostà da {{gender:$2|$2}} el $PAGEEDITDATE (varda $3 par Å‚a version atuaÅ‚e).',
+'enotif_body_intro_restored' => 'Åa pàjina $1 de {{SITENAME}} Å‚a xe sta ripristinà da {{gender:$2|$2}} el $PAGEEDITDATE (varda $3 par Å‚a version atuaÅ‚e).',
+'enotif_body_intro_changed' => 'Åa pàjina $1 de {{SITENAME}} Å‚a xe sta canbià da {{gender:$2|$2}} el $PAGEEDITDATE (varda $3 par Å‚a version atuaÅ‚e).',
'enotif_lastvisited' => 'Varda $1 par tute le modifiche da la to ultima visita.',
'enotif_lastdiff' => 'Varda $1 par visualizar la modifica.',
'enotif_anon_editor' => 'utente anonimo $1',
'enotif_body' => 'Caro/a $WATCHINGUSERNAME,
-ła pàxena $PAGETITLE de {{SITENAME}} la xè stà $CHANGEDORCREATED el $PAGEEDITDATE da $PAGEEDITOR, varda $PAGETITLE_URL par ła version atuałe.
+$PAGEINTRO $NEWPAGE
-$NEWPAGE
+Ogeto del intervento, inserio dal autor: $PAGESUMMARY $PAGEMINOREDIT
-Somario del redator: $PAGESUMMARY $PAGEMINOREDIT
+Contata l\'autor:
+via posta eletronega: $PAGEEDITOR_EMAIL
+so\'l sito: $PAGEEDITOR_WIKI
-Contatta el redator:
-mail: $PAGEEDITOR_EMAIL
-wiki: $PAGEEDITOR_WIKI
+Nó vegnarà inviae altre notifeghe in caxo de ulteriori atività, se nó te vixiti ła pàjina. Inoltre, xe posibiłe modifegar łe inpostasion de notifega par tute łe pàjine inte ła lista de łe tegnùe d\'ocio.
-No ghe sarà altre notifiche in caso de ulteriori canbiamenti, a manco che ti no te visiti sta pàxena.
-Te podi anca reinpostar l\'avixo de notifica par tuti i osservati speciałi de ła to łista.
-
- El to amichevole sistema de notifica de {{SITENAME}}
+ El sistema de notifega de {{SITENAME}}, al to servisio
--
-Par canbiar łe inpostassion de i to osservati speciałi, visita
-{{canonicalurl:Special:Watchlist/edit}}
+Par modifegar Å‚e inpostasion de Å‚e notifeghe via posta eletronega, varda
+{{canonicalurl:{{#special:Preferences}}}}
+
+Par modifegar ła lista de łe tegnùe d\'ocio, varda
+{{canonicalurl:{{#special:EditWatchlist}}}}
-Par cavar la pagina da i to osservati speciałi, visita
+Par cavar ła pàjina da ła lista de łe tegnùe d\'ocio, varda
$UNWATCHURL
-Par riscontri e ulteriore assistensa:
+Par comentare e risevere ajuto:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'creà',
+'changed' => 'canbià',
# Delete
'deletepage' => 'Scancela pagina',
@@ -2242,6 +2269,8 @@ Vedi ła [[Special:ProtectedPages|lista dełe pajine protete]] pa l'elenco de ł
'prot_1movedto2' => '[[$1]] spostà a [[$2]]',
'protect-badnamespace-title' => 'Namespace nò protexibiłe',
'protect-badnamespace-text' => 'Åe pàjine in sto namespace nò Å‚e pol esar protete.',
+'protect-norestrictiontypes-text' => 'Sta pàjina nò ła pol esar proteta parché nò ghe xe gnaun tipo de restrision disponibiłe.',
+'protect-norestrictiontypes-title' => 'Pàjina nò protexibiłe',
'protect-legend' => 'Conferma la protezion',
'protectcomment' => 'Motivassion:',
'protectexpiry' => 'Scadensa:',
@@ -2322,7 +2351,8 @@ Se dopo ła scancełazion xè stà creà na nova pàxena col stesso titoło, łe
'undeletedrevisions' => '{{PLURAL:$1|Una revision recuperà|$1 revision recuperà}}',
'undeletedrevisions-files' => '{{PLURAL:$1|Una revision|$1 revision}} e $2 file recuperà',
'undeletedfiles' => '{{PLURAL:$1|Un file recuperà|$1 file recuperà}}',
-'cannotundelete' => "El recupero no'l xè riussìo: qualchedun altro el podarià aver xà recuperà ła pàxena.",
+'cannotundelete' => 'Ripristino nó riusìo:
+$1',
'undeletedpage' => "'''$1 la xè stà recuperà'''
Consulta el [[Special:Log/delete|registro de le scancełassion]] par vardare łe scancełassion e i recuperi pì reçenti.",
@@ -2353,7 +2383,7 @@ $1',
'blanknamespace' => '(Prinsipale)',
# Contributions
-'contributions' => 'Contributi utente',
+'contributions' => 'Contributi {{GENDER:$1|utente}}',
'contributions-title' => 'Contributi de $1',
'mycontris' => 'Contributi',
'contribsub2' => 'Par $1 ($2)',
@@ -2617,6 +2647,7 @@ La voxe specificà come destinassion "[[:$1]]" l\'esiste xà. Vóto scancełarla
'immobile-target-namespace-iw' => "El colegamento interwiki no'l xe na valida destinassion in do spostar na pàxena.",
'immobile-source-page' => 'Sta pàxena no la pol vegner spostà.',
'immobile-target-page' => 'No te pol spostar a sto titolo.',
+'bad-target-model' => 'Åa destinasion dexiderà Å‚a dopara un modèl de contegnui difarente. Nò xe posibiÅ‚e convertir da $1 a $2.',
'imagenocrossnamespace' => 'No se pol spostar un file verso un namespace diverso da quelo dei file.',
'nonfile-cannot-move-to-file' => 'Tuto quel che no xe un file, no se pode spostarlo al namespace dei file.',
'imagetypemismatch' => "L'estension nova del file no la corisponde mìa al tipo de file",
@@ -2727,6 +2758,7 @@ Salveło so'l to conpiuter e carghelo cuà.",
'import-error-interwiki' => 'Åa pàjina "$1" nò Å‚a vien inportà parché el so nome el xe riservà pa\'l ligamento foresto (interwiki).',
'import-error-special' => 'Åa pàjina "$1" nò Å‚a vien inportà parché Å‚a apartien a un namespace speciaÅ‚e che nò \'l permete pàjine.',
'import-error-invalid' => 'Åa pàjina "$1" nò Å‚a vien inportà parché el so nome nò \'l xe vaÅ‚ido.',
+'import-error-unserialize' => 'Åa version $2 de Å‚a pàjina "$1" nó Å‚a pol esar de-seriaÅ‚ixà. Åa version Å‚a xe sta segnałà par doparar el modèl de contegnùo $3 seriaÅ‚ixà cofà $4.',
'import-options-wrong' => '{{PLURAL:$2|Opsion sbałià|Opsion sbałiae}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Åa pàjina prinsipaÅ‚e fornia nó Å‚a xe un titoÅ‚o vaÅ‚ido.',
'import-rootpage-nosubpage' => 'El namespace "$1" de ła pàjina prinsipałe nó \'l permete de \'ver sotopajine.',
@@ -2741,7 +2773,6 @@ Salveło so'l to conpiuter e carghelo cuà.",
# JavaScriptTest
'javascripttest' => 'Sperimentasion JavaScript',
-'javascripttest-disabled' => 'Sta funsion nó ła xe abiłità so sta wiki.',
'javascripttest-title' => 'In execusion test par $1',
'javascripttest-pagetext-noframework' => "Sta pàjina ła xe riservà a l'execusion de test de JavaScript.",
'javascripttest-pagetext-unknownframework' => 'Framework de test sconosùo "$1".',
@@ -2855,11 +2886,13 @@ Questo xe probabilmente dovùo a la presenza de un colegamento a un sito foresto
'pageinfo-default-sort' => 'Ciave de ordinamento predefinìo',
'pageinfo-length' => 'Longhessa de la pagina (in byte)',
'pageinfo-article-id' => 'ID de la pagina',
+'pageinfo-language' => 'Lengua del contenuto de la pagina',
'pageinfo-robot-policy' => 'Stato par i motori de riserca',
'pageinfo-robot-index' => 'Indicizabile',
'pageinfo-robot-noindex' => 'Mia indicizabile',
'pageinfo-views' => 'Nùmaro de visite',
'pageinfo-watchers' => "Nùmaro de utenti che tien d'ocio sta pagina",
+'pageinfo-few-watchers' => 'Manco de $1 {{PLURAL:$1|oservador|oservadori}}',
'pageinfo-redirects-name' => 'Rimandi verso sta pagina',
'pageinfo-subpages-name' => 'Sotopagine de sta pagina',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|rimandi}}; $3 {{PLURAL:$3|no rimandi}})',
@@ -2874,6 +2907,19 @@ Questo xe probabilmente dovùo a la presenza de un colegamento a un sito foresto
'pageinfo-magic-words' => '{{PLURAL:$1|Parola magica|Parole magiche}} ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria sconta|Categorie sconte}} ($1)',
'pageinfo-templates' => 'Template {{PLURAL:$1|incluso|inclusi}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pàjina incluxa|Pàjine incluxe}} so ($1)',
+'pageinfo-toolboxlink' => 'Informassion su sta pagina',
+'pageinfo-redirectsto' => 'La rimanda a',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Contà come na pagina de contenuto',
+'pageinfo-contentpage-yes' => 'Sì',
+'pageinfo-protect-cascading' => 'Protession ricorsiva da qua',
+'pageinfo-protect-cascading-yes' => 'Sì',
+'pageinfo-protect-cascading-from' => 'Protession ricorsiva eredità da',
+'pageinfo-category-info' => 'Informasion so Å‚a categoria',
+'pageinfo-category-pages' => 'Nùmaro de pàjine',
+'pageinfo-category-subcats' => 'Nùmaro de sotocategorie',
+'pageinfo-category-files' => 'Nùmaro de file',
# Patrolling
'markaspatrolleddiff' => 'Segna la modifica come verificà',
@@ -2885,6 +2931,8 @@ Questo xe probabilmente dovùo a la presenza de un colegamento a un sito foresto
'markedaspatrollederror' => 'No se pol contrassegnar ła voxe come verificà',
'markedaspatrollederrortext' => 'Bisogna speçificare na revixion da contrassegnar come verificà.',
'markedaspatrollederror-noautopatrol' => 'No te ghè i parmessi necessari par segnar le to stesse modifiche come verificàe.',
+'markedaspatrollednotify' => 'Åa modifega a $1 Å‚a xe sta segnà come verifegà.',
+'markedaspatrollederrornotify' => 'Eror durante Å‚a verifega.',
# Patrol log
'patrol-log-page' => 'Modifiche verificàe',
@@ -2918,6 +2966,7 @@ La so esecuzion la podarìa danegiar el to computer.",
'file-nohires' => 'No ghe xe version a risolussion pì granda.',
'svg-long-desc' => 'file en formato SVG, dimension nominałi $1 × $2 pixel, dimension del file: $3',
'svg-long-desc-animated' => 'file in formato SVG animà, dimension nominałi $1 × $2 pixel, dimension del file: $3',
+'svg-long-error' => 'File SVG mìa valido: $1',
'show-big-image' => 'Version ad alta risołusion',
'show-big-image-preview' => 'Dimension de sta anteprima: $1.',
'show-big-image-other' => '{{PLURAL:$2|Altra risołusion|Altre risołusion}}: $1.',
@@ -2947,7 +2996,10 @@ La so esecuzion la podarìa danegiar el to computer.",
'minutes' => '{{PLURAL:$1|un minuto|$1 minuti}}',
'hours' => "{{PLURAL:$1|un'ora|$1 ore}}",
'days' => '{{PLURAL:$1|un zorno|$1 zorni}}',
+'months' => '{{PLURAL:$1|$1 mexe|$1 mexi}}',
+'years' => '{{PLURAL:$1|$1 ano|$1 ani}}',
'ago' => '$1 fa',
+'just-now' => 'giusto desso',
# Bad image list
'bad_image_list' => 'El formato xe sto qua:
@@ -3440,6 +3492,7 @@ El codexe de conferma el scadarà en automatego a łe $4.',
# Scary transclusion
'scarytranscludedisabled' => "[L'inclusion de pagine tra siti wiki no la xe ativa]",
'scarytranscludefailed' => '[Inpossibile otegner el modèl $1]',
+'scarytranscludefailed-httpstatus' => '[Eror: inposibiłe otegner el modèl $1: HTTP $2]',
'scarytranscludetoolong' => '[La URL la xe massa longa]',
# Delete conflict
@@ -3552,6 +3605,7 @@ Nota che te pol anca [[Special:EditWatchlist|modificar la lista con l'interfacia
'version-license' => 'Licensa',
'version-poweredby-credits' => "Sta wiki la va con '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'altri',
+'version-credits-summary' => "Semo contenti de riconosare Å‚e seguenti persone p' 'ver contribuio a [[Special:Version|MediaWiki]].",
'version-license-info' => "MediaWiki xe un software lìbaro; te pol redistribuirlo e/o modificarlo secondo i termini de la Licensa Publica Zeneral GNU publicà da la Free Software Foundation; secondo la version 2 de la Licensa, o (a scelta tua) una qualunque altra version sucessiva.
MediaWiki el xe distribuìo sperando che el possa vegner utile, ma SENSA NISSUNA GARANSIA; sensa gnanca la garansia inplicita de COMERCIALIZASSION o de ADATAMENTO A UN USO PARTICOLARE. Varda la Licensa Publica Zeneral GNU par ulteriori detagli.
@@ -3665,17 +3719,17 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
'sqlite-no-fts' => '$1 sensa la possibilità de riserca completa nel testo',
# New logging system
-'logentry-delete-delete' => '$1 ga scansełà ła pajina $3',
-'logentry-delete-restore' => '$1 ga ripristinà "$3"',
-'logentry-delete-event' => '$1 ga canbià ła vixibiłità de {{PLURAL:$5|n\'asion del registro|$5 asion del registro}} de "$3": $4',
-'logentry-delete-revision' => '$1 ga canbià ła vixibiłità de {{PLURAL:$5|na revixion|$5 revixion}} de ła pajina"$3": $4',
-'logentry-delete-event-legacy' => '$1 ga canbià ła vixibiłità de calche asion del registro de "$3"',
-'logentry-delete-revision-legacy' => '$1 ga canbià ła vixibiłità par łe revixion de ła pajina $3',
-'logentry-suppress-delete' => '$1 ga sconto la pajina "$3"',
-'logentry-suppress-event' => '$1 ga canbià de scondón la vixibilità de {{PLURAL:$5|n\'asion del registro|$5 asion del registro}} de "$3": $4',
-'logentry-suppress-revision' => '$1 ga canbià de scondón la vixibilità de {{PLURAL:$5|na revixion|$5 revixion}} de "$3": $4',
-'logentry-suppress-event-legacy' => '$1 ga canbià de scondón la vixibilità de calche asion del registro de "$3"',
-'logentry-suppress-revision-legacy' => '$1 ga canbià de scondón la vixibilità de calche revixion de $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|el|la}} ga scansełà ła pajina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|el|la}} ga ripristinà "$3"',
+'logentry-delete-event' => '$1 {{GENDER:$2|el|la}} ga canbià ła vixibiłità de {{PLURAL:$5|n\'asion del registro|$5 asion del registro}} de "$3": $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|el|la}} ga canbià ła vixibiłità de {{PLURAL:$5|na revixion|$5 revixion}} de ła pajina"$3": $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|el|la}} ga canbià ła vixibiłità de calche asion del registro de "$3"',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|el|la}} ga canbià ła vixibiłità par łe revixion de ła pajina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|el|la}} ga sconto la pajina "$3"',
+'logentry-suppress-event' => '$1 {{GENDER:$2|el|la}} ga canbià de scondón la vixibilità de {{PLURAL:$5|n\'asion del registro|$5 asion del registro}} de "$3": $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|el|la}} ga canbià de scondón la vixibilità de {{PLURAL:$5|na revixion|$5 revixion}} de "$3": $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|el|la}} ga canbià de scondón la vixibilità de calche asion del registro de "$3"',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|el|la}} ga canbià de scondón la vixibilità de calche revixion de $3',
'revdelete-content-hid' => 'contegnùo sconto',
'revdelete-summary-hid' => 'ogeto de Å‚a modifega sconto',
'revdelete-uname-hid' => 'nome utente sconto',
@@ -3684,17 +3738,21 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
'revdelete-uname-unhid' => 'nome utente ripristinà',
'revdelete-restricted' => 'aplicà restrizioni ai aministradori',
'revdelete-unrestricted' => 'gà cavà le limitazion par i aministradori',
-'logentry-move-move' => '$1 ga spostà ła pajina $3 a $4',
-'logentry-move-move-noredirect' => '$1 ga spostà ła pajina $3 a $4 sensa metare un rimando',
-'logentry-move-move_redir' => '$1 ga spostà ła pajina $3 a $4 lasiando un rimando',
-'logentry-move-move_redir-noredirect' => '$1 ga spostà la pajina $3 a $4 al posto de un rimando sensa metare un rimando',
-'logentry-patrol-patrol' => '$1 ga segnà la revixion $4 de la pajina $3 come verifegà',
-'logentry-patrol-patrol-auto' => '$1 ga segnà automategamente la revixion $4 de la pajina $3 come verifegà',
-'logentry-newusers-newusers' => "L'utensa $1 xe sta creà",
-'logentry-newusers-create' => "L'utensa $1 xe sta creà",
-'logentry-newusers-create2' => "L'utensa $3 xe sta creà da $1",
-'logentry-newusers-autocreate' => "L'utensa $1 xè stà creà automategamente",
-'newuserlog-byemail' => 'password spedìa par e-mail',
+'logentry-move-move' => '$1 {{GENDER:$2|el|la}} ga spostà ła pajina $3 a $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|el|la}} ga spostà ła pajina $3 a $4 sensa metare un rimando',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|el|la}} ga spostà ła pajina $3 a $4 lasandoghe un rimando',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|el|la}} ga spostà la pajina $3 a $4 al posto de un rimando sensa lasarghe un rimando',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|el|la}} ga segnà la revixion $4 de la pajina $3 come verifegà',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|el|la}} ga segnà automategamente la revixion $4 de la pajina $3 come verifegà',
+'logentry-newusers-newusers' => "L'utensa $1 xe sta {{GENDER:$2|creà}}",
+'logentry-newusers-create' => "L'utensa $1 xe sta {{GENDER:$2|creà}}",
+'logentry-newusers-create2' => "L'utensa $3 xe sta {{GENDER:$2|creà}} da $1",
+'logentry-newusers-byemail' => "L'utensa $3 xe sta {{GENDER:$2|creà}} da $1 e ła password ła xe sta invià par e-mail",
+'logentry-newusers-autocreate' => "L'utensa $1 xè stà {{GENDER:$2|creà}} automategamente",
+'logentry-rights-rights' => "$1 {{GENDER:$2|el|la}} ga canbià l'apartenensa de $3 dal grupo $4 al grupo $5",
+'logentry-rights-rights-legacy' => "$1 {{GENDER:$2|el|la}} ga canbià l'apartenensa a grupi de $3",
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|el|la}} xe stà automategamente promoso/a da $4 a $5',
+'rightsnone' => '(nissun)',
# Feedback
'feedback-bugornote' => 'Se se xe in grado de descrivare el problema tenico riscontrà in maniera precixa, [$1 segnałare el bug]. In alternadiva, se pol doparar el moduło senplifegà cuà soto. El comento inserio el sarà xontà a ła pàjina "[$3 $2]", insieme al propio nome utente.',
@@ -3747,6 +3805,7 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
'api-error-ok-but-empty' => 'Eror interno: nisuna risposta dal server.',
'api-error-overwrite' => 'Nó xe parmeso de sorascrìvar un file existente.',
'api-error-stashfailed' => "Eror interno: el server nó 'l xe riusio a memorixar el documento tenporaneo.",
+'api-error-publishfailed' => "Eror interno: el server nó 'l xe riusio a publicar el documento tenporaneo.",
'api-error-timeout' => "El server nó 'l ga risposto entro el tenpo previsto.",
'api-error-unclassified' => 'Se gà verifegà un eror sconosùo.',
'api-error-unknown-code' => 'Eror sconosùo: "$1"',
@@ -3767,4 +3826,7 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
'duration-centuries' => '$1 {{PLURAL:$1|secolo|secoli}}',
'duration-millennia' => '$1 {{PLURAL:$1|milenio|mileni}}',
+# Image rotation
+'rotate-comment' => 'Imagine girà de $1 {{PLURAL:$1|grado|gradi}} in senso orario',
+
);
diff --git a/languages/messages/MessagesVep.php b/languages/messages/MessagesVep.php
index 7bd64f99..def58582 100644
--- a/languages/messages/MessagesVep.php
+++ b/languages/messages/MessagesVep.php
@@ -232,7 +232,6 @@ $messages = array(
'qbbrowse' => 'Kacelta',
'qbedit' => 'Redaktiruida',
'qbpageoptions' => 'Necen lehtpolen järgendused',
-'qbpageinfo' => 'Andmused lehtpoles',
'qbmyoptions' => 'Minun järgendused',
'qbspecialpages' => 'Specialižed lehtpoled',
'faq' => 'PPK',
@@ -472,11 +471,8 @@ Sü om "\'\'$2\'\'".',
# Login and logout pages
'logouttext' => "'''Tö olet lähtnuded sistemaspäi.'''
-Sab jatkta rad {{SITENAME}}-saital anonimižikš, vai [[Special:UserLogin|kirjutagatoiš udes]] sil-žo vai toižel kävutajan nimel.
+Sab jatkta rad {{SITENAME}}-saital anonimižikš, vai <span class='plainlinks'>[$1 kirjutagatoiš udes]</span> sil-žo vai toižel kävutajan nimel.
Otkat sil'mnägubale, miše erasid lehtpolid ozutaškatas mugažo, kut i edel teiden lähtendad sistemaspäi. Miše vajehtada niiden nägu, puhtastagat teiden kaclimen keš.",
-'welcomecreation' => '== Tulgat tervhen, $1! ==
-Teiden registracii om loptud.
-Algat unohtagoi [[Special:Preferences|järgeta personaližikš]] sait.',
'yourname' => 'Kävutajan nimi:',
'yourpassword' => 'Peitsana:',
'yourpasswordagain' => 'Kirjutagat peitsana udes:',
@@ -735,7 +731,6 @@ Alemba om anttud jäl'gmäine aiglehtesen kirjutez:",
'template-semiprotected' => '(kaitud anonimoišpäi da uziš kävutajišpäi)',
'hiddencategories' => "Nece lehtpol' om {{PLURAL:$1|1 peittud kategorijaspäi|$1 peittud kategorijoišpäi}}:",
'edittools' => '<!-- Tänna sijatud tekst ozutadas redaktiruindan da jügutoitandan formiden al. -->',
-'nocreatetitle' => 'Lehtpoliden sädand om kaidetud',
'nocreatetext' => "{{SITENAME}}-saitas uziden lehtpoliden sädand om kaidetud.
Tö voit pörttas tagaze i redaktiruida toine lehtpol', vai [[Special:UserLogin|kirjutagatoiš sistemha, vai säkat registracii]].",
'nocreate-loggedin' => 'Teile ei sa säta uzid lehtpolid.',
@@ -1202,11 +1197,13 @@ Ku tö kirjutat sen, nece nimi kävutadas, miše ozutada lehtpolen toižetajad.'
'right-sendemail' => 'Oigeta e-poÄtad toižile kävutajile',
'right-passwordreset' => 'Kacta e-kirjeižid peitsanan toižetandanke',
+# Special:Log/newusers
+'newuserlogpage' => 'Kävutajiden registracijan aigkirj',
+'newuserlogpagetext' => 'Tantoi registriruidud kävutajiden nimikirjutez.',
+
# User rights log
'rightslog' => 'Kävutajan oiktusiden aigkirj',
'rightslogtext' => 'Nece om kävutajan oiktusiden toižetusen aigkirj.',
-'rightslogentry' => 'toižetin $1-kävutajan ühtnend gruppiš - oli $2, linneb $3',
-'rightsnone' => '(ei ole)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => "lugeda necidä lehtpol't",
@@ -1693,10 +1690,6 @@ Kc. mugažo [[Special:WantedCategories|ectud kategorijoiden nimikirjutez]].',
'activeusers-hidesysops' => 'Peitta administratorid',
'activeusers-noresult' => 'Kävutajad ei olgoi löutud.',
-# Special:Log/newusers
-'newuserlogpage' => 'Kävutajiden registracijan aigkirj',
-'newuserlogpagetext' => 'Tantoi registriruidud kävutajiden nimikirjutez.',
-
# Special:ListGroupRights
'listgrouprights' => 'Kävutajiden gruppiden oiktused',
'listgrouprights-group' => 'Grupp',
@@ -1770,11 +1763,7 @@ Kc. mugažo [[Special:WantedCategories|ectud kategorijoiden nimikirjutez]].',
'enotif_mailer' => "{{SITENAME}}-saitan lehtpol' om toižetadud - tedotuz",
'enotif_reset' => 'Znamoita kaik lehtpoled kut kactud',
-'enotif_newpagetext' => 'Nece om uz’ lehtpol’',
'enotif_impersonal_salutation' => '{{SITENAME}}-saitan kävutai',
-'changed' => 'om toižetadud',
-'created' => 'om sätud',
-'enotif_subject' => '$PAGEEDITOR om $CHANGEDORCREATED $PAGETITLE',
'enotif_lastvisited' => "Kc. $1, miše nähta kaik teiden jäl'gmäižen vizitan jäl'ghe tehtud toižetused.",
'enotif_lastdiff' => 'Kc. $1, miše kacelta toižetusid.',
'enotif_anon_editor' => 'anonimine kävutai $1',
@@ -1809,6 +1798,8 @@ $UNWATCHURL
Pid\'oitelend da joksii abu:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'om sätud',
+'changed' => 'om toižetadud',
# Delete
'deletepage' => "Čuta lehtpol' poiš",
@@ -1969,7 +1960,7 @@ $1',
'blanknamespace' => '(Pälehtpoled)',
# Contributions
-'contributions' => 'Kävutajan tond',
+'contributions' => '{{GENDER:$1|Kävutajan}} tond',
'contributions-title' => '$1-kävutajan tond',
'mycontris' => 'Minun tond',
'contribsub2' => '$1-kävutajan ($2) tond',
@@ -2281,7 +2272,6 @@ Ei ole pordaigašt failhodrad.',
# JavaScriptTest
'javascripttest' => 'JavaScriptan kodvmine',
-'javascripttest-disabled' => 'Nece funkcii ei ole kävutamas neciš vikiš.',
# Tooltip help for the actions
'tooltip-pt-userpage' => "Teiden kävutajan lehtpol'",
@@ -3065,7 +3055,7 @@ Kävutagat normaline ezikacund.',
# New logging system
'revdelete-restricted' => 'kaidendused administratoriden täht',
'revdelete-unrestricted' => 'kaidendused heittud administratoriden täht',
-'newuserlog-byemail' => 'peisana om oigetud e-poÄtadme',
+'rightsnone' => '(ei ole)',
# Feedback
'feedback-subject' => 'Tem:',
diff --git a/languages/messages/MessagesVi.php b/languages/messages/MessagesVi.php
index 500bf37a..3058609e 100644
--- a/languages/messages/MessagesVi.php
+++ b/languages/messages/MessagesVi.php
@@ -61,7 +61,7 @@ $specialPageAliases = array(
'Ancientpages' => array( 'Trang_cũ' ),
'Badtitle' => array( 'Tá»±a_Ä‘á»_há»ng' ),
'Blankpage' => array( 'Trang_trắng' ),
- 'Block' => array( 'Cấm_IP' ),
+ 'Block' => array( 'Cấm', 'Cấm_IP', 'Cấm_thành_viên', 'Cấm_ngÆ°á»i_dùng' ),
'Blockme' => array( 'Khóa_tôi', 'Khoá_tôi' ),
'Booksources' => array( 'Nguồn_sách' ),
'BrokenRedirects' => array( 'Äổi_hÆ°á»›ng_sai' ),
@@ -124,7 +124,6 @@ $specialPageAliases = array(
'Recentchanges' => array( 'Thay_đổi_gần_đây' ),
'Recentchangeslinked' => array( 'Thay_đổi_liên_quan' ),
'Revisiondelete' => array( 'Xóa_phiên_bản' ),
- 'RevisionMove' => array( 'Di_chuyển_phiên_bản' ),
'Search' => array( 'Tìm_kiếm' ),
'Shortpages' => array( 'Trang_ngắn' ),
'Specialpages' => array( 'Trang_đặc_biệt' ),
@@ -212,14 +211,17 @@ $magicWords = array(
'img_page' => array( '1', 'trang=$1', 'trang $1', 'page=$1', 'page $1' ),
'img_upright' => array( '1', 'đứng', 'đứng=$1', 'đứng $1', 'upright', 'upright=$1', 'upright $1' ),
'img_link' => array( '1', 'liên_kết=$1', 'link=$1' ),
+ 'img_class' => array( '1', 'lá»›p=$1', 'class=$1' ),
'int' => array( '0', 'NỘI:', 'INT:' ),
'sitename' => array( '1', 'TÊNMẠNG', 'SITENAME' ),
'ns' => array( '0', 'KGT:', 'NS:' ),
'localurl' => array( '0', 'URLÄỊAPHƯƠNG:', 'LOCALURL:' ),
- 'articlepath' => array( '0', 'Lá»IBÀI', 'ARTICLEPATH' ),
+ 'articlepath' => array( '0', 'ÄƯỜNGDẪNBÀI', 'Lá»IBÀI', 'ARTICLEPATH' ),
+ 'pageid' => array( '0', 'IDTRANG', 'PAGEID' ),
'server' => array( '0', 'MÃYCHỦ', 'SERVER' ),
'servername' => array( '0', 'TÊNMÃYCHỦ', 'SERVERNAME' ),
- 'scriptpath' => array( '0', 'ÄƯỜNGDẪNSCRIPT', 'SCRIPTPATH' ),
+ 'scriptpath' => array( '0', 'ÄƯỜNGDẪNKỊCHBẢN', 'ÄƯỜNGDẪNSCRIPT', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'ÄƯỜNGDẪNKIỂU', 'STYLEPATH' ),
'grammar' => array( '0', 'NGá»®PHÃP:', 'GRAMMAR:' ),
'gender' => array( '0', 'GIá»NG:', 'GENDER:' ),
'notitleconvert' => array( '0', '__KHÔNGCHUYỂNTÊN__', '__NOTITLECONVERT__', '__NOTC__' ),
@@ -252,7 +254,9 @@ $magicWords = array(
'pagesize' => array( '1', 'Cá» TRANG', 'PAGESIZE' ),
'numberingroup' => array( '1', 'CỠNHÓM', 'NUMBERINGROUP', 'NUMINGROUP' ),
'staticredirect' => array( '1', '__Äá»”IHƯỚNGNHẤTÄỊNH__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'MỨCKHÓA', 'MỨCKHOÃ', 'PROTECTIONLEVEL' ),
'url_path' => array( '0', 'ÄƯỜNGDẪN', 'PATH' ),
+ 'url_query' => array( '0', 'TRUYVẤN', 'QUERY' ),
);
$datePreferences = array(
@@ -430,6 +434,7 @@ $messages = array(
'newwindow' => '(mở cửa sổ mới)',
'cancel' => 'Hủy bá»',
'moredotdotdot' => 'Thêm nữa…',
+'morenotlisted' => 'Có nhiá»u hÆ¡n danh sách này…',
'mypage' => 'Trang cá nhân',
'mytalk' => 'Tin nhắn',
'anontalk' => 'Thảo luận với IP này',
@@ -441,7 +446,6 @@ $messages = array(
'qbbrowse' => 'Duyệt',
'qbedit' => 'Sửa đổi',
'qbpageoptions' => 'Trang này',
-'qbpageinfo' => 'Ngữ cảnh',
'qbmyoptions' => 'Trang cá nhân',
'qbspecialpages' => 'Trang đặc biệt',
'faq' => 'Câu há»i thÆ°á»ng gặp',
@@ -464,6 +468,7 @@ $messages = array(
'namespaces' => 'Không gian tên',
'variants' => 'Biến thể',
+'navigation-heading' => 'Trình đơn chuyển hướng',
'errorpagetitle' => 'Lá»—i',
'returnto' => 'Quay lại $1.',
'tagline' => 'Từ {{SITENAME}}',
@@ -701,9 +706,9 @@ Bảo quản viên khóa nó Ä‘Æ°a lý do là: “$3â€.',
# Login and logout pages
'logouttext' => "'''Bạn đã đăng xuất.'''
-Bạn có thể tiếp tục dùng {{SITENAME}} má»™t cách vô danh, hoặc bạn có thể [[Special:UserLogin|đăng nhập lại]] dÆ°á»›i cùng tên ngÆ°á»i dùng này hoặc má»™t tên ngÆ°á»i dùng khác. Xin lÆ°u ý rằng má»™t vài trang có thể vẫn hiển thị nhÆ° khi bạn còn đăng nhập, cho đến khi bạn xóa vùng nhá»› đệm (''cache'') của trình duyệt.",
-'welcomecreation' => '== Chào mừng, $1! ==
-Tài khoản của bạn đã được mở.
+Bạn có thể tiếp tục dùng {{SITENAME}} má»™t cách vô danh, hoặc bạn có thể <span class='plainlinks'>[$1 đăng nhập lại]</span> dÆ°á»›i cùng tên ngÆ°á»i dùng này hoặc má»™t tên ngÆ°á»i dùng khác. Xin lÆ°u ý rằng má»™t vài trang có thể vẫn hiển thị nhÆ° khi bạn còn đăng nhập, cho đến khi bạn xóa vùng nhá»› đệm (''cache'') của trình duyệt.",
+'welcomeuser' => 'Hoan nghênh, $1!',
+'welcomecreation-msg' => 'Tài khoản của bạn đã được mở.
Hãy nhá»› thay đổi [[Special:Preferences|tùy chá»n cá nhân {{SITENAME}}]] của bạn.',
'yourname' => 'Tên ngÆ°á»i dùng:',
'yourpassword' => 'Mật khẩu:',
@@ -727,7 +732,7 @@ Hãy nhá»› thay đổi [[Special:Preferences|tùy chá»n cá nhân {{SITENAME}}]
'gotaccount' => "Äã mở tài khoản rồi? '''$1'''.",
'gotaccountlink' => 'Äăng nhập',
'userlogin-resetlink' => 'Quên mất thông tin đăng nhập?',
-'createaccountmail' => 'qua thư điện tử',
+'createaccountmail' => 'Sử dụng mật khẩu ngẫu nhiên tạm và gửi nó cho địa chỉ thư điện tử được chỉ định ở dưới',
'createaccountreason' => 'Lý do:',
'badretype' => 'Hai mật khẩu không khớp.',
'userexists' => 'Tên ngÆ°á»i dùng được nhập đã có ngÆ°á»i lấy.
@@ -789,6 +794,7 @@ Xin hãy đợi chốc lát rồi thử lại.',
# Email sending
'php-mail-error-unknown' => 'Lỗi không rõ trong hàm PHP mail()',
'user-mail-no-addy' => 'Không có địa chỉ để gửi thư điện tử đến',
+'user-mail-no-body' => 'Không thể gửi thư điện tử rỗng hoặc có nội dung ngắn một cách vô lý.',
# Change password dialog
'resetpass' => 'Äổi mật khẩu',
@@ -844,7 +850,7 @@ mật khẩu cũ.',
Mật khẩu tạm: $2',
'passwordreset-emailsent' => 'Äã gá»­i thÆ° Ä‘iện tá»­ để tái tạo mật khẩu.',
'passwordreset-emailsent-capture' => 'Thư điện tử để tái tạo mật khẩu đã được gửi, nội dung như sau.',
-'passwordreset-emailerror-capture' => 'Không thể gá»­i thÆ° Ä‘iện tá»­ nhắc nhở ở dÆ°á»›i cho ngÆ°á»i dùng: $1',
+'passwordreset-emailerror-capture' => 'Chúng tôi đã tạo thÆ° tái tạo mật khẩu dÆ°á»›i đây, nhÆ°ng không thể gá»­i đến ngÆ°á»i dùng: $1',
# Special:ChangeEmail
'changeemail' => 'Äổi địa chỉ thÆ° Ä‘iện tá»­',
@@ -854,6 +860,7 @@ Mật khẩu tạm: $2',
'changeemail-oldemail' => 'Äịa chỉ thÆ° Ä‘iện tá»­ hiện tại:',
'changeemail-newemail' => 'Äịa chỉ thÆ° Ä‘iện tá»­ má»›i:',
'changeemail-none' => '(không có)',
+'changeemail-password' => 'Mật khẩu của bạn tại {{SITENAME}}:',
'changeemail-submit' => 'Äổi địa chỉ',
'changeemail-cancel' => 'Hủy bá»',
@@ -1030,7 +1037,6 @@ Thông tin má»›i nhất trong nhật trình được ghi dÆ°á»›i đây để tiá
'template-semiprotected' => '(bị hạn chế sửa đổi)',
'hiddencategories' => 'Trang này thuộc vỠ{{PLURAL:$1|1 thể loại ẩn|$1 thể loại ẩn}}:',
'edittools' => '<!-- Văn bản dưới đây sẽ xuất hiện phía dưới mẫu sửa đổi và tải lên. -->',
-'nocreatetitle' => 'Khả năng tạo trang bị hạn chế',
'nocreatetext' => '{{SITENAME}} đã hạn chế khả năng tạo trang mới.
Bạn có thể quay trở lại và sửa đổi các trang đã có, hoặc [[Special:UserLogin|đăng nhập hoặc tạo tài khoản]].',
'nocreate-loggedin' => 'Bạn không có quyá»n tạo trang má»›i.',
@@ -1055,6 +1061,15 @@ DÆ°á»ng nhÆ° trang này đã bị xóa.',
'edit-already-exists' => 'Không thể tạo trang mới.
Nó đã tồn tại.',
'defaultmessagetext' => 'Nội dung mặc định',
+'content-failed-to-parse' => 'Thất bại phân tích nội dung $2 cho mô hình $1: $3',
+'invalid-content-data' => 'Dữ liệu nội dung không hợp lệ',
+'content-not-allowed-here' => 'Không cho phép đưa nội dung “$1†vào trang [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'mã wiki',
+'content-model-text' => 'văn bản thuần',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => 'Cảnh báo: Trang này có quá nhiá»u lần gá»i hàm cú pháp cần mức Ä‘á»™ xá»­ lý cao.
@@ -1418,9 +1433,9 @@ Không có thể lùi lại tác động này.',
'prefs-emailconfirm-label' => 'Xác nhận thư điện tử:',
'prefs-textboxsize' => 'Kích cỡ hộp sửa đổi',
'youremail' => 'Thư điện tử:',
-'username' => 'Tên ngÆ°á»i dùng:',
-'uid' => 'Số thứ tự thành viên:',
-'prefs-memberingroups' => 'Thành viên của {{PLURAL:$1|nhóm|nhóm}}:',
+'username' => '{{GENDER:$1}}Tên ngÆ°á»i dùng:',
+'uid' => '{{GENDER:$1}}Số thứ tự thành viên:',
+'prefs-memberingroups' => '{{GENDER:$2}}Thành viên của {{PLURAL:$1|nhóm|các nhóm}}:',
'prefs-registration' => 'Lúc mở tài khoản:',
'yourrealname' => 'Tên thật:',
'yourlanguage' => 'Ngôn ngữ:',
@@ -1570,12 +1585,13 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao cá»
'right-sendemail' => 'Gửi thư điện tử cho thành viên khác',
'right-passwordreset' => 'Xem các thư điện tử đặt lại mật khẩu',
+# Special:Log/newusers
+'newuserlogpage' => 'Nhật trình mở tài khoản',
+'newuserlogpagetext' => 'Äây là danh sách những tài khoản thành viên mở lên gần đây.',
+
# User rights log
'rightslog' => 'Nhật trình cấp quyá»n thành viên',
'rightslogtext' => 'Äây là nhật trình lÆ°u những thay đổi đối vá»›i các quyá»n hạn thành viên.',
-'rightslogentry' => 'đã đổi các nhóm liên kết của thành viên $1 từ $2 thành $3',
-'rightslogentry-autopromote' => 'được tự động phong cấp từ $2 đến $3',
-'rightsnone' => '(không có)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'Ä‘á»c trang này',
@@ -1816,6 +1832,7 @@ Nếu vẫn còn bị lỗi, xin hãy liên hệ với một [[Special:ListUsers
'backend-fail-notsame' => 'Một tập tin khác biệt đã tồn tại ở $1.',
'backend-fail-invalidpath' => '$1 không phải Ä‘Æ°á»ng dẫn lÆ°u giữ hợp lệ.',
'backend-fail-delete' => 'Không thể xóa tập tin $1.',
+'backend-fail-describe' => 'Không thể thay đổi siêu dữ liệu của tập tin “$1â€.',
'backend-fail-alreadyexists' => 'Tập tin $1 đã tồn tại.',
'backend-fail-store' => 'Không thể lưu tập tin $1 tại $2.',
'backend-fail-copy' => 'Không thể chép tập tin $1 đến $2.',
@@ -2049,6 +2066,12 @@ Hãy nhớ kiểm tra các liên kết khác đến bản mẫu trước khi xó
'disambiguationspage' => 'Template:disambig',
'disambiguations-text' => "Các trang này có liên kết đến ít nhất một '''trang định hướng''', những trang này có thể có liên kết đến các trang đúng nghĩa hơn.<br />Các trang định hướng là trang sử dụng những bản mẫu được liệt kê ở [[MediaWiki:Disambiguationspage]].",
+'pageswithprop' => 'Trang có thuộc tính trang',
+'pageswithprop-legend' => 'Các trang có thuộc tính trang',
+'pageswithprop-text' => 'Trang này liệt kê các trang sử dụng một thuộc tính trang nào đó.',
+'pageswithprop-prop' => 'Tên thuộc tính:',
+'pageswithprop-submit' => 'Xem',
+
'doubleredirects' => 'Äổi hÆ°á»›ng kép',
'doubleredirectstext' => 'Trang này liệt kê các trang đổi hướng đến một trang đổi hướng khác.
Má»—i hàng có chứa các liên kết đến trang đổi hÆ°á»›ng thứ nhất và thứ hai, cÅ©ng nhÆ° mục tiêu của trang đổi hÆ°á»›ng thứ hai, thÆ°á»ng là trang đích “thá»±c sá»±â€, là nÆ¡i mà trang đổi hÆ°á»›ng đầu tiên nên trỠđến.
@@ -2199,7 +2222,7 @@ Xem thêm [[Special:WantedCategories|thể loại cần thiết]].',
'linksearch-pat' => 'Mẫu liên kết:',
'linksearch-ns' => 'Không gian tên:',
'linksearch-ok' => 'Tìm kiếm',
-'linksearch-text' => "Bạn có thể sá»­ dụng ký tá»± đại diện (''wildcard''), ví dụ “*.wikipedia.orgâ€; ít nhất phải có tên miá»n cấp cao nhất, thí dụ “*.orgâ€.<br />Các giao thức này được há»— trợ: <code>$1</code>; mặc định là <code>http://</code> nếu không định rõ giao thức trong truy vấn.",
+'linksearch-text' => "Bạn có thể sá»­ dụng ký tá»± đại diện (''wildcard''), ví dụ “*.wikipedia.orgâ€; ít nhất phải có tên miá»n cấp cao nhất, thí dụ “*.orgâ€.<br />{{PLURAL:$2|Giao thức|Các giao thức}} này được há»— trợ: <code>$1</code>; mặc định là <code>http://</code> nếu không định rõ giao thức trong truy vấn.",
'linksearch-line' => '$1 được liên kết từ $2',
'linksearch-error' => "Chỉ được sá»­ dụng ký tá»± đại diện (''wildcard'') vào đầu tên miá»n (''hostname'').",
@@ -2218,10 +2241,6 @@ Xem thêm [[Special:WantedCategories|thể loại cần thiết]].',
'activeusers-hidesysops' => 'Ẩn bảo quản viên',
'activeusers-noresult' => 'Không thấy thành viên.',
-# Special:Log/newusers
-'newuserlogpage' => 'Nhật trình mở tài khoản',
-'newuserlogpagetext' => 'Äây là danh sách những tài khoản thành viên mở lên gần đây.',
-
# Special:ListGroupRights
'listgrouprights' => 'Nhóm thành viên',
'listgrouprights-summary' => 'Dưới đây là danh sách nhóm thành viên được định nghĩa tại wiki này, với mức độ truy cập của từng nhóm.
@@ -2316,20 +2335,23 @@ Những sửa đổi đối với trang này và trang thảo luận của nó s
'enotif_mailer' => 'Thông báo của {{SITENAME}}',
'enotif_reset' => 'Äánh dấu đã xem má»i trang',
-'enotif_newpagetext' => 'Trang này mới',
'enotif_impersonal_salutation' => 'thành viên {{SITENAME}}',
-'changed' => 'thay đổi',
-'created' => 'viết mới',
-'enotif_subject' => '$PAGETITLE tại {{SITENAME}} đã được $CHANGEDORCREATED bởi $PAGEEDITOR',
+'enotif_subject_deleted' => 'Trang $1 tại {{SITENAME}} đã được xóa bởi $2.',
+'enotif_subject_created' => 'Trang $1 tại {{SITENAME}} đã được tạo ra bởi $2.',
+'enotif_subject_moved' => 'Trang $1 tại {{SITENAME}} đã được di chuyển bởi $2.',
+'enotif_subject_restored' => 'Trang $1 tại {{SITENAME}} đã được phục hồi bởi $2.',
+'enotif_subject_changed' => 'Trang $1 tại {{SITENAME}} đã được thay đổi bởi $2',
+'enotif_body_intro_deleted' => 'Trang $1 tại {{SITENAME}} đã được $2 xóa vào $PAGEEDITDATE. Xem $3 .',
+'enotif_body_intro_created' => 'Trang $1 tại {{SITENAME}} đã được $2 tạo ra vào $PAGEEDITDATE. Xem phiên bản hiện hành tại $3 .',
+'enotif_body_intro_moved' => 'Trang $1 tại {{SITENAME}} đã được $2 di chuyển vào $PAGEEDITDATE. Xem phiên bản hiện hành tại $3 .',
+'enotif_body_intro_restored' => 'Trang $1 tại {{SITENAME}} đã được $2 phục hồi vào $PAGEEDITDATE. Xem phiên bản hiện hành tại $3 .',
+'enotif_body_intro_changed' => 'Trang $1 tại {{SITENAME}} đã được $2 thay đổi vào $PAGEEDITDATE. Xem phiên bản hiện hành tại $3 .',
'enotif_lastvisited' => 'Xem $1 để biết các thay đổi diễn ra từ lần xem cuối cùng của bạn.',
'enotif_lastdiff' => 'Vào $1 để xem sự thay đổi này.',
'enotif_anon_editor' => 'ngÆ°á»i dùng vô danh $1',
'enotif_body' => 'Xin chào $WATCHINGUSERNAME,
-
-Trang $PAGETITLE tại {{SITENAME}} đã được $PAGEEDITOR $CHANGEDORCREATED vào $PAGEEDITDATE, xem phiên bản hiện hành tại $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Tóm lược sửa đổi: $PAGESUMMARY $PAGEMINOREDIT
@@ -2337,8 +2359,7 @@ Liên lạc vá»›i ngÆ°á»i viết trang qua:
thÆ°: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Sẽ không có thông báo nào khác nếu có sự thay đổi tiếp theo trừ khi bạn xem trang đó.
-Bạn cũng có thể thiết lập lại việc nhắc nhở cho tất cả các trang nằm trong danh sách theo dõi của bạn.
+Sẽ không có thông báo nào khác nếu có sự thay đổi tiếp theo trừ khi bạn xem trang đó. Bạn cũng có thể thiết lập lại việc nhắc nhở cho tất cả các trang nằm trong danh sách theo dõi của bạn.
Hệ thống báo tin {{SITENAME}} thân thiện của bạn
@@ -2354,6 +2375,8 @@ $UNWATCHURL
Phản hồi và cần sự hỗ trợ:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'viết mới',
+'changed' => 'thay đổi',
# Delete
'deletepage' => 'Xóa trang',
@@ -2422,6 +2445,8 @@ quay vỠphiên bản cuối của $2.',
'prot_1movedto2' => '[[$1]] đổi thành [[$2]]',
'protect-badnamespace-title' => 'Không gian tên không thể khóa',
'protect-badnamespace-text' => 'Không thể khóa các trang tại không gian tên này.',
+'protect-norestrictiontypes-text' => 'Không thể khóa trang này vì không có sẵn tác vụ nào để hạn chế.',
+'protect-norestrictiontypes-title' => 'Trang không khóa được',
'protect-legend' => 'Xác nhận khóa',
'protectcomment' => 'Lý do:',
'protectexpiry' => 'Thá»i hạn:',
@@ -2505,8 +2530,8 @@ Chỉ có bảo quản viên mới xem được văn bản đầy đủ của nh
'undeletedrevisions' => '$1 {{PLURAL:$1|bản|bản}} được phục hồi',
'undeletedrevisions-files' => '$1 {{PLURAL:$1|bản|bản}} và $2 {{PLURAL:$2|tập tin|tập tin}} đã được phục hồi',
'undeletedfiles' => '$1 {{PLURAL:$1|tập tin|tập tin}} đã được phục hồi',
-'cannotundelete' => 'Phục hồi thất bại;
-má»™t ngÆ°á»i nào khác đã phục hồi trang này rồi.',
+'cannotundelete' => 'Phục hồi thất bại:
+$1',
'undeletedpage' => "'''$1 đã được khôi phục'''
Xem nhật trình xóa và phục hồi các trang gần đây tại [[Special:Log/delete|nhật trình xóa]].",
@@ -2537,7 +2562,7 @@ $1',
'blanknamespace' => '(Chính)',
# Contributions
-'contributions' => 'Äóng góp của thành viên',
+'contributions' => '{{GENDER:$1}}Äóng góp của thành viên',
'contributions-title' => 'Äóng góp của thành viên $1',
'mycontris' => 'Äóng góp',
'contribsub2' => 'Của $1 ($2)',
@@ -2806,6 +2831,7 @@ Trang với tên “[[:$1]]†đã tồn tại. Bạn có muốn xóa nó để
'immobile-target-namespace-iw' => 'Không cho phép di chuyển trang đến một liên kết liên wiki.',
'immobile-source-page' => 'Bạn không thể di chuyển trang này.',
'immobile-target-page' => 'Không thể di chuyển đến tựa đỠđích.',
+'bad-target-model' => 'Trang đích sử dụng mô hình nội dung khác. Không thể chuyển đổi nội dung từ $1 đến $2.',
'imagenocrossnamespace' => 'Không thể di chuyển tập tin ra khá»i không gian tên Tập tin',
'nonfile-cannot-move-to-file' => 'Không thể di chuyển những gì không phải là tập tin vào không gian tên Tập tin',
'imagetypemismatch' => 'Phần mở rộng trong tên tập tin mới không hợp dạng của tập tin',
@@ -2918,6 +2944,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
'import-error-interwiki' => 'Trang “$1†không được nhập vì tên của nó được dành riêng cho liên kết ngoài (liên wiki).',
'import-error-special' => 'Trang “$1†không được nhập vì nó thuộc vỠkhông gian tên đặc biệt không cho phép các trang không mặc định.',
'import-error-invalid' => 'Trang “$1†không được nhập vì tên của nó không hợp lệ.',
+'import-error-unserialize' => 'Không thể giải tuần tá»± hóa phiên bản $2 của trang “$1â€. Tập tin kết xuất cho rằng phiên bản có mô hình ná»™i dung $3 được tuần tá»± hóa theo định dạng $4.',
'import-options-wrong' => '{{PLURAL:$2|Tùy chá»n|Các tùy chá»n}} có vấn Ä‘á»: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'Trang đích không hợp lệ.',
'import-rootpage-nosubpage' => 'Không gian tên “$1†của trang gốc không cho phép các trang con.',
@@ -2932,7 +2959,6 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
# JavaScriptTest
'javascripttest' => 'Kiểm thử JavaScript',
-'javascripttest-disabled' => 'Chức năng này chưa được kích hoạt trên wiki này.',
'javascripttest-title' => 'Äang chạy $1 ca kiểm thá»­',
'javascripttest-pagetext-noframework' => 'Trang này dành cho việc chạy các ca kiểm thử JavaScript.',
'javascripttest-pagetext-unknownframework' => 'Ná»n tảng kiểm thá»­ không rõ “$1â€.',
@@ -3081,11 +3107,13 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
'pageinfo-default-sort' => 'Từ khóa sắp xếp mặc định',
'pageinfo-length' => 'Chiá»u dài của trang (byte)',
'pageinfo-article-id' => 'Mã số trang',
+'pageinfo-language' => 'Ngôn ngữ nội dung trang',
'pageinfo-robot-policy' => 'Trạng thái công cụ tìm kiếm',
'pageinfo-robot-index' => 'Có thể ghi chỉ mục',
'pageinfo-robot-noindex' => 'Không thể ghi chỉ mục',
'pageinfo-views' => 'Số lần xem',
'pageinfo-watchers' => 'Số ngÆ°á»i theo dõi trang',
+'pageinfo-few-watchers' => 'Không tá»›i $1 ngÆ°á»i theo dõi',
'pageinfo-redirects-name' => 'Số trang đổi hướng đến trang này',
'pageinfo-redirects-value' => '$1',
'pageinfo-subpages-name' => 'Số trang con của trang này',
@@ -3101,6 +3129,19 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
'pageinfo-magic-words' => 'Từ thần chú ($1)',
'pageinfo-hidden-categories' => 'Thể loại ẩn ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Bản mẫu|Các bản mẫu}} được nhúng ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Trang|Các trang}} nhúng ($1)',
+'pageinfo-toolboxlink' => 'Thông tin trang',
+'pageinfo-redirectsto' => 'Äổi hÆ°á»›ng đến',
+'pageinfo-redirectsto-info' => 'thông tin',
+'pageinfo-contentpage' => 'Tính là một trang nội dung',
+'pageinfo-contentpage-yes' => 'Có',
+'pageinfo-protect-cascading' => 'Khóa theo tầng từ đây',
+'pageinfo-protect-cascading-yes' => 'Có',
+'pageinfo-protect-cascading-from' => 'Khóa theo tầng từ',
+'pageinfo-category-info' => 'Thông tin vỠthể loại',
+'pageinfo-category-pages' => 'Số trang',
+'pageinfo-category-subcats' => 'Số thể loại con',
+'pageinfo-category-files' => 'Số tập tin',
# Skin names
'skinname-standard' => 'Cổ điển',
@@ -3121,6 +3162,8 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
'markedaspatrollederror' => 'Không thể đánh dấu tuần tra',
'markedaspatrollederrortext' => 'Bạn phải chá»n phiên bản để đánh dấu tuần tra.',
'markedaspatrollederror-noautopatrol' => 'Bạn không được đánh dấu tuần tra vào sửa đổi của bạn.',
+'markedaspatrollednotify' => 'Äã được đánh dấu tuần tra vào thay đổi tại $1.',
+'markedaspatrollederrornotify' => 'Äánh dấu tuần tra bị thất bại.',
# Patrol log
'patrol-log-page' => 'Nhật trình tuần tra',
@@ -3155,6 +3198,7 @@ Nếu thá»±c thi nó máy tính của bạn có thể bị tiếm quyá»n.",
'file-nohires' => 'Không có độ phân giải cao hơn.',
'svg-long-desc' => 'tập tin SVG, $1×$2 điểm ảnh trên danh nghĩa, kích thước: $3',
'svg-long-desc-animated' => 'tập tin hình động SVG, $1×$2 điểm ảnh trên danh nghĩa, kích thước: $3',
+'svg-long-error' => 'Tập tin SVG có lỗi: $1',
'show-big-image' => 'Äá»™ phân giải tối Ä‘a',
'show-big-image-preview' => 'Kích thước của ảnh xem thử: $1.',
'show-big-image-other' => '{{PLURAL:$2|Äá»™ phân giải|Các Ä‘á»™ phân giải}} khác: $1.',
@@ -3189,7 +3233,10 @@ Nếu thá»±c thi nó máy tính của bạn có thể bị tiếm quyá»n.",
'minutes' => '$1 phút',
'hours' => '$1 giá»',
'days' => '$1 ngày',
+'months' => '$1 tháng',
+'years' => '$1 năm',
'ago' => 'cách đây $1',
+'just-now' => 'hồi nãy',
# Bad image list
'bad_image_list' => 'Äịnh dạng nhÆ° sau:
@@ -3734,6 +3781,7 @@ Mã xác nhận này sẽ hết hạn vào $4.',
# Scary transclusion
'scarytranscludedisabled' => '[Nhúng giữa các wiki bị tắt]',
'scarytranscludefailed' => '[Truy xuất bản mẫu $1 bị thất bại]',
+'scarytranscludefailed-httpstatus' => '[Truy xuất bản mẫu $1 bị thất bại: HTTP $2]',
'scarytranscludetoolong' => '[Äịa chỉ URL quá dài]',
# Delete conflict
@@ -3902,6 +3950,7 @@ Bạn cÅ©ng có thể [[Special:EditWatchlist|dùng trang sá»­a đổi bình thÆ
'version-license' => 'Giấy phép bản quyá»n',
'version-poweredby-credits' => "Wiki này chạy trên '''[//www.mediawiki.org/ MediaWiki]''', bản quyá»n © 2001–$1 $2.",
'version-poweredby-others' => 'những ngÆ°á»i khác',
+'version-credits-summary' => 'Chúng tôi muốn công nhận những ngÆ°á»i sau đã đóng góp vào [[Special:Version|MediaWiki]].',
'version-license-info' => "MediaWiki là phần má»m tá»± do; bạn được phép tái phân phối và/hoặc sá»­a đổi nó theo những Ä‘iá»u khoản của Giấy phép Công cá»™ng GNU do Quỹ Phần má»m Tá»± do xuất bản; phiên bản 2 hay bất kỳ phiên bản nào má»›i hÆ¡n nào của Giấy phép.
MediaWiki được phân phối vá»›i hy vá»ng rằng nó sẽ hữu ích, nhÆ°ng '''không có bất kỳ má»™t bảo đảm nào cả''', ngay cả những bảo đảm ngụ ý cho '''các mục đích thÆ°Æ¡ng mại''' hoặc cho '''má»™t mục đích đặc biệt nào đó'''. Xem Giấy phép Công cá»™ng GNU để biết thêm chi tiết.
@@ -4023,17 +4072,17 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
'sqlite-no-fts' => '$1 không có hỗ trợ tìm kiếm toàn văn',
# New logging system
-'logentry-delete-delete' => '$1 đã xóa trang “$3â€',
-'logentry-delete-restore' => '$1 đã phục hồi trang “$3â€',
-'logentry-delete-event' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} vỠ$3: $4',
-'logentry-delete-revision' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4',
-'logentry-delete-event-legacy' => '$1 đã thay đổi mức hiển thị của các mục nhật trình vỠ$3',
-'logentry-delete-revision-legacy' => '$1 đã thay đổi mức hiển thị của các phiên bản trang $3',
-'logentry-suppress-delete' => '$1 đã ẩn trang $3',
-'logentry-suppress-event' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} vỠ$3 một cách kín đáo: $4',
-'logentry-suppress-revision' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3 một cách kín đáo: $4',
-'logentry-suppress-event-legacy' => '$1 đã thay đổi mức hiển thị các mục nhật trình vỠ$3 một cách kín đáo',
-'logentry-suppress-revision-legacy' => '$1 đã thay đổi mức hiển thị của các phiên bản trang $3 một cách kín đáo',
+'logentry-delete-delete' => '$1 {{GENDER:$2}}đã xóa trang “$3â€',
+'logentry-delete-restore' => '$1 {{GENDER:$2}}đã phục hồi trang “$3â€',
+'logentry-delete-event' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} vỠ$3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các mục nhật trình vỠ$3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các phiên bản trang $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2}}đã ẩn trang $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} vỠ$3 một cách kín đáo: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3 một cách kín đáo: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị các mục nhật trình vỠ$3 một cách kín đáo',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các phiên bản trang $3 một cách kín đáo',
'revdelete-content-hid' => 'đã ẩn nội dung',
'revdelete-summary-hid' => 'đã ẩn tóm lược sửa đổi',
'revdelete-uname-hid' => 'đã ẩn tên ngÆ°á»i dùng',
@@ -4042,17 +4091,21 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
'revdelete-uname-unhid' => 'đã hiện tên ngÆ°á»i dùng',
'revdelete-restricted' => 'đã áp dụng hạn chế cho bảo quản viên',
'revdelete-unrestricted' => 'đã gỡ bỠhạn chế cho bảo quản viên',
-'logentry-move-move' => '$1 đã đổi $3 thành $4',
-'logentry-move-move-noredirect' => '$1 đã đổi $3 thành $4 (đã tắt đổi hướng)',
-'logentry-move-move_redir' => '$1 đã đổi $3 thành $4 qua đổi hướng',
-'logentry-move-move_redir-noredirect' => '$1 đã đổi $3 thành $4 qua đổi hướng (đã tắt đổi hướng)',
-'logentry-patrol-patrol' => '$1 đã đánh dấu tuần tra phiên bản $4 của trang $3',
-'logentry-patrol-patrol-auto' => '$1 đã tự động đánh dấu tuần tra phiên bản $4 của trang $3',
-'logentry-newusers-newusers' => 'Äã mở tài khoản ngÆ°á»i dùng $1',
-'logentry-newusers-create' => 'Äã mở tài khoản ngÆ°á»i dùng $1',
-'logentry-newusers-create2' => '$1 đã mở tài khoản ngÆ°á»i dùng $3',
-'logentry-newusers-autocreate' => 'Tài khoản $1 đã được mở tự động',
-'newuserlog-byemail' => 'gửi mật khẩu qua thư điện tử',
+'logentry-move-move' => '$1 {{GENDER:$2}}đã đổi $3 thành $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 (đã tắt đổi hướng)',
+'logentry-move-move_redir' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 qua đổi hướng',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 qua đổi hướng (đã tắt đổi hướng)',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2}}đã đánh dấu tuần tra phiên bản $4 của trang $3',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2}}đã tự động đánh dấu tuần tra phiên bản $4 của trang $3',
+'logentry-newusers-newusers' => '{{GENDER:$2}}Äã mở tài khoản ngÆ°á»i dùng $1',
+'logentry-newusers-create' => '{{GENDER:$2}}Äã mở tài khoản ngÆ°á»i dùng $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2}}đã mở tài khoản ngÆ°á»i dùng $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2}}đã mở tài khoản ngÆ°á»i dùng $3 và nhận mật khẩu qua thÆ° Ä‘iện tá»­',
+'logentry-newusers-autocreate' => 'Tài khoản $1 {{GENDER:$2}}đã được mở tự động',
+'logentry-rights-rights' => '$1 {{GENDER:$2}}đã đổi các nhóm bao gồm $3 từ $4 đến $5',
+'logentry-rights-rights-legacy' => '{{GENDER:$2}}$1 đã đổi các nhóm bao gồm $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2}}đã được tự động phong cấp từ $4 đến $5',
+'rightsnone' => '(không có)',
# Feedback
'feedback-bugornote' => 'Nếu bạn đã sẵn sàng để miêu tả các chi tiết của một vấn đỠkỹ thuật, xin vui lòng [$1 báo cáo lỗi].
@@ -4106,6 +4159,7 @@ Nếu không thì bạn có thể Ä‘iá»n biểu mẫu Ä‘Æ¡n giản ở dÆ°á»›i.
'api-error-ok-but-empty' => 'Lỗi nội bộ: Máy chủ không phản hồi.',
'api-error-overwrite' => 'Không được ghi đè một tập tin đã tồn tại.',
'api-error-stashfailed' => 'Lỗi nội bộ: Máy chủ bị thất bại trong việc lưu giữ tập tin tạm.',
+'api-error-publishfailed' => 'Lỗi nội bộ: Máy chủ bị thất bại trong việc xuất bản tập tin tạm.',
'api-error-timeout' => 'Máy chủ không đáp ứng trong thá»i gian dá»± kiến.',
'api-error-unclassified' => 'Gặp lá»—i không ngá»',
'api-error-unknown-code' => 'Lá»—i không rõ: “$1â€',
@@ -4126,4 +4180,7 @@ Nếu không thì bạn có thể Ä‘iá»n biểu mẫu Ä‘Æ¡n giản ở dÆ°á»›i.
'duration-centuries' => '$1 thế kỷ',
'duration-millennia' => '$1 thiên niên kỷ',
+# Image rotation
+'rotate-comment' => 'Äã quay hình $1 Ä‘á»™ theo chiá»u kim đồng hồ',
+
);
diff --git a/languages/messages/MessagesVls.php b/languages/messages/MessagesVls.php
index 44efa56e..9b732f61 100644
--- a/languages/messages/MessagesVls.php
+++ b/languages/messages/MessagesVls.php
@@ -169,6 +169,9 @@ $messages = array(
# Search results
'search-result-size' => '$1 ({{PLURAL:$2|1 woord|$2 woordn}})',
+# Special:Log/newusers
+'newuserlogpage' => 'Logboek nieuwe gebrukers',
+
# Recent changes
'recentchanges' => 'Juste veranderd',
@@ -189,9 +192,6 @@ $messages = array(
'newpages' => 'Nieuwe bloadn',
'newpages-username' => 'Gebrukersnoame:',
-# Special:Log/newusers
-'newuserlogpage' => 'Logboek nieuwe gebrukers',
-
# Watchlist
'mywatchlist' => 'Myn volglyste',
'watch' => 'Volgn',
diff --git a/languages/messages/MessagesVmf.php b/languages/messages/MessagesVmf.php
index 5dc24891..202fcb5f 100644
--- a/languages/messages/MessagesVmf.php
+++ b/languages/messages/MessagesVmf.php
@@ -550,6 +550,9 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
'grouppage-sysop' => '{{ns:project}}:Adminisdradoorn',
+# Special:Log/newusers
+'newuserlogpage' => 'Brodoghol iwâr dii naja bearbajdâr-ôômeldunga',
+
# User rights log
'rightslog' => 'Brodoghol fo rächde-dsuudaalung an bearbajdâr',
@@ -649,9 +652,6 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
# Special:LinkSearch
'linksearch' => 'Linggs nach ausârhalb',
-# Special:Log/newusers
-'newuserlogpage' => 'Brodoghol iwâr dii naja bearbajdâr-ôômeldunga',
-
# Special:ListGroupRights
'listgrouprights-members' => '(Lisdn fon dâ midgliidâr)',
diff --git a/languages/messages/MessagesVo.php b/languages/messages/MessagesVo.php
index 4a1cc169..ec4deebe 100644
--- a/languages/messages/MessagesVo.php
+++ b/languages/messages/MessagesVo.php
@@ -248,7 +248,6 @@ $messages = array(
'qbbrowse' => 'Padön',
'qbedit' => 'Redakön',
'qbpageoptions' => 'Pad at',
-'qbpageinfo' => 'Yumed',
'qbmyoptions' => 'Pads obik',
'qbspecialpages' => 'Pads patik',
'faq' => 'Säks suvo pasäköls',
@@ -477,11 +476,8 @@ Kod binon: ''$2''.",
# Login and logout pages
'logouttext' => "'''Esenunädol oli.'''
-Kanol laigebön {{SITENAME}} nennemiko, u kanol [[Special:UserLogin|nunädön oli dönu]] me gebananem ot u gebenanem votik.
+Kanol laigebön {{SITENAME}} nennemiko, u kanol <span class='plainlinks'>[$1 nunädön oli dönu]</span> me gebananem ot u gebenanem votik.
Küpälolös, das pads anik ba nog pojenons äsva no esenunädol oli, jüs uklinükol memi no laidüpik bevüresodanaföma olik.",
-'welcomecreation' => '== Benokömö, o $1! ==
-Kal olik pejafon.
-No glömolöd ad votükön [[Special:Preferences|buükamis olik in {{SITENAME}}]].',
'yourname' => 'Gebananem:',
'yourpassword' => 'Letavöd:',
'yourpasswordagain' => 'Klavolös dönu letavödi:',
@@ -726,7 +722,6 @@ Geban, kel efärmükon oni, egevon kodi at: $1",
'template-protected' => '(pejelon)',
'template-semiprotected' => '(dilo pejelon)',
'hiddencategories' => 'Pad at duton lü {{PLURAL:$1|klad peklänedöl 1|klads peklänedöl $1}}:',
-'nocreatetitle' => 'Padijafam pemiedükon',
'nocreatetext' => '{{SITENAME}} emiedükon mögi ad jafön padis nulik.
Kanol redakön padi dabinöl, u [[Special:UserLogin|nunädön oli u jafön kali]].',
'nocreate-loggedin' => 'No dalol jafön padis nulik.',
@@ -1146,11 +1141,13 @@ Dalol i dälön votikanes kosikön ko ol yufü gebana- u bespikapad olik nes sä
'right-siteadmin' => 'Lökofärmükön e maifükön nünodemi',
'right-sendemail' => 'Sedön penedis leäktronik lü gebans votik',
+# Special:Log/newusers
+'newuserlogpage' => 'Lised gebanijafamas',
+'newuserlogpagetext' => 'Is palisedons jafams gebanas nulik.',
+
# User rights log
'rightslog' => 'Jenotalised gebanagitätas',
'rightslogtext' => 'Is palisedons votükams gebanagitätas.',
-'rightslogentry' => 'grupalimanam gebana: $1 pevotükon de $2 ad $3',
-'rightsnone' => '(nonik)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'reidön padi at',
@@ -1614,10 +1611,6 @@ Protoks pestütöl: <code>$1</code>',
'activeusers-hidesysops' => 'Klänedolöd guvanis',
'activeusers-noresult' => 'Geban nonik petuvon.',
-# Special:Log/newusers
-'newuserlogpage' => 'Lised gebanijafamas',
-'newuserlogpagetext' => 'Is palisedons jafams gebanas nulik.',
-
# Special:ListGroupRights
'listgrouprights' => 'Gitäts gebanagrupa',
'listgrouprights-summary' => 'Is palisedons gebanagrups in vük at dabinöls, sa gitäts tefik onsik.
@@ -1696,11 +1689,7 @@ If vilol poso moükön padi de galädalised olik, välolös lä on knopi: „neg
'enotif_mailer' => 'Nunamasit ela {{SITENAME}}',
'enotif_reset' => 'Malön padis pevisitöl valik',
-'enotif_newpagetext' => 'Atos binon pad nulik.',
'enotif_impersonal_salutation' => 'Geban {{SITENAME}}-a',
-'changed' => 'pevotüköl',
-'created' => 'pejafon',
-'enotif_subject' => 'In {{SITENAME}}, pad: $PAGETITLE $CHANGEDORCREATED fa el $PAGEEDITOR',
'enotif_lastvisited' => 'Logolös eli $1 ad tuvön lisedi votükamas valik pos visit lätik ola.',
'enotif_lastdiff' => 'Logolös eli $1 ad tuvön votükami at.',
'enotif_anon_editor' => 'geban nennemik: $1',
@@ -1728,6 +1717,8 @@ Ad votükön parametami galädaliseda olik, loglös
Küpets e yuf pluik:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'pejafon',
+'changed' => 'pevotüköl',
# Delete
'deletepage' => 'Moükolöd padi',
@@ -2821,7 +2812,7 @@ Magods pajonons ma fomät gudikün, ragivasots votik pamaifükons stedöfo kobü
# New logging system
'revdelete-restricted' => 'miedükams pelonöfükons pro guvans',
'revdelete-unrestricted' => 'miedükams pro guvans pemoükons',
-'newuserlog-byemail' => 'letavöd pesedon me pot leäktronik',
+'rightsnone' => '(nonik)',
# Search suggestions
'searchsuggest-search' => 'Suk',
diff --git a/languages/messages/MessagesVot.php b/languages/messages/MessagesVot.php
index 9b778599..0afeb398 100644
--- a/languages/messages/MessagesVot.php
+++ b/languages/messages/MessagesVot.php
@@ -8,6 +8,7 @@
* @file
*
* @author 2Q
+ * @author Aig mest ei varasta
* @author Andrijko Z.
* @author Comp1089
* @author Erdemaslancan
@@ -444,9 +445,11 @@ Proovvi lizät etsün alkuu ''all:'', nii ettsü etsib kõikkõõ sisältoo (taa
'grouppage-user' => '{{ns:project}}:Сäüttijäd',
'grouppage-sysop' => '{{ns:project}}:Praviťeľad',
+# Special:Log/newusers
+'newuserlogpage' => 'Uuvvõd cäüttijäd',
+
# User rights log
'rightslog' => 'Cäütteminõikuslogi',
-'rightsnone' => '(eb õõ)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'muutu sitä cülciä',
@@ -597,9 +600,6 @@ Seness [$2 kuvauhsõ lehocülless] informaattsija on alapallõ annõttu.',
# Special:ListUsers
'listusers-submit' => 'Näüt väľľää',
-# Special:Log/newusers
-'newuserlogpage' => 'Uuvvõd cäüttijäd',
-
# Special:ListGroupRights
'listgrouprights-members' => '(selttsilainspiiska)',
@@ -627,8 +627,6 @@ Cülci leeb cirjutõttu '''pimmiässi''' [[Special:RecentChanges|spiizgall viime
'watching' => 'Kattsõõn…',
'unwatching' => 'Kattsõõmizõõ lõpõttõmin…',
-'enotif_newpagetext' => 'Kase on vassõn cülci.',
-
# Delete
'deletepage' => 'Pühi cülci',
'delete-legend' => 'Pühi',
@@ -690,7 +688,7 @@ Cüľľellä $2 on spiiska viimeiziss pühcimühsiiss.',
'blanknamespace' => '(Artikkelid)',
# Contributions
-'contributions' => 'Cäüttijää avittamizõd',
+'contributions' => '{{GENDER:$1|Cäüttijää}} avittamizõd',
'contributions-title' => 'Cäüttijää $1 avittamizõd',
'mycontris' => 'Minu avittamizõd',
'contribsub2' => 'Cäüttijää $1 ($2) avittamizõd',
@@ -964,6 +962,9 @@ Kui faili on muutõttu, siiz detaaľid võivad õlla kahõllaizõd muutõtull fa
# HTML forms
'htmlform-selectorother-other' => 'Muu',
+# New logging system
+'rightsnone' => '(eb õõ)',
+
# Feedback
'feedback-message' => 'Ilmottamin:',
'feedback-cancel' => 'Otmeńoit',
diff --git a/languages/messages/MessagesVro.php b/languages/messages/MessagesVro.php
index ff1ef622..de0cfbf3 100644
--- a/languages/messages/MessagesVro.php
+++ b/languages/messages/MessagesVro.php
@@ -185,7 +185,6 @@ $messages = array(
'qbbrowse' => 'Kaeq',
'qbedit' => 'Toimõndaq',
'qbpageoptions' => 'Leheküle säädmine',
-'qbpageinfo' => 'Leheküle teedüs',
'qbmyoptions' => 'Mu säädmiseq',
'qbspecialpages' => 'Tallitusleheküleq',
'faq' => 'Sagõhõhe küsüdüq küsümiseq',
@@ -423,9 +422,8 @@ $2',
# Login and logout pages
'logouttext' => "'''Olõt nime alt vällä lännüq.'''
-Võit {{SITENAME}}t ilma nimeldä edesi toimõndaq vai [[Special:UserLogin|vahtsõst sama vai tõõsõ nimega sisse minnäq]].
+Võit {{SITENAME}}t ilma nimeldä edesi toimõndaq vai <span class='plainlinks'>[$1 vahtsõst sama vai tõõsõ nimega sisse minnäq]</span>.
Tähelepandmisõs: niikavva, ku sa olõ-i tühäs tennüq uma võrgokaeja vaihõmällo, võivaq mõnõq leheküleq iks viil näüdädäq, nigu sa olõsi nimega seen.",
-'welcomecreation' => '<h2>Tereq, $1!</h2><p>Su konto om valmis. Võit taa hindä perrä sisse säädäq.',
'yourname' => 'Pruukjanimi',
'yourpassword' => 'Salasõna',
'yourpasswordagain' => 'Kirodaq viilkõrd salasõna',
@@ -648,7 +646,6 @@ Ku klõpsahtat nuppi \"{{int:savearticle}}\", sis pästetäs '''õnnõ''' ülemb
'template-protected' => '(ärqkaidsõt)',
'template-semiprotected' => '(ärqkaidsõduq nimeldä ja vahtsõq pruukjaq)',
'hiddencategories' => 'Seo leht kuulus {{PLURAL:$1|1 käkitühe katõgooriahe|$1 käkitühe katõgooriahe}}:',
-'nocreatetitle' => 'Lehekülgi luuminõ piiret',
'nocreatetext' => '{{SITENAME}} lupa-i luvvaq vahtsit lehti.
Võit toimõndaq olõmanolõvit lehti vai [[Special:UserLogin|minnäq nimega sisse]].',
'nocreate-loggedin' => 'Sul olõ-i lupa luvvaq vahtsit {{SITENAME}} lehti.',
@@ -951,11 +948,12 @@ Taa tohe-i ollaq rohkõmb ku $1 {{PLURAL:$1|märk|märki}}.",
'right-ipblock-exempt' => 'Minnäq müüdä automaatsist kinniqpidämiisist ni aadrõsijao ja IP-kinniqpidämiisist',
'right-proxyunbannable' => 'Minnäq müüdä automaatsist vaihõserveri kinniqpidämiisist',
+# Special:Log/newusers
+'newuserlogpage' => 'Vahtsõq pruukjaq',
+
# User rights log
'rightslog' => 'Pruukmisõiguisi muutmisõ nimekiri',
'rightslogtext' => 'Taa om pruukmisõiguisi muutmiisi nimekiri.',
-'rightslogentry' => 'Pruukja $1 õigusõq muudõti ümbre rühmäst $2 rühmä $3',
-'rightsnone' => '(olõ-i õiguisi)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'seod lehte toimõndaq',
@@ -1290,9 +1288,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
'listusers-submit' => 'Näütäq',
'listusers-noresult' => 'Olõ-s pruukjit.',
-# Special:Log/newusers
-'newuserlogpage' => 'Vahtsõq pruukjaq',
-
# Special:ListGroupRights
'listgrouprights' => 'Pruukjarühmi õigusõq',
'listgrouprights-members' => '(liikmidõ nimekiri)',
@@ -1351,11 +1346,7 @@ ja sul piät umin [[Special:Preferences|säädmiisin]] olõma e-postiaadrõs, et
'enotif_mailer' => '{{SITENAME}} lehe muutumisteedüs',
'enotif_reset' => 'Märgiq kõik leheq ülekaetuis',
-'enotif_newpagetext' => 'Taa om vahtsõnõ leht.',
'enotif_impersonal_salutation' => '{{SITENAME}} pruukja',
-'changed' => 'lehte muutnuq',
-'created' => 'lehe loonuq',
-'enotif_subject' => '$PAGEEDITOR om $CHANGEDORCREATED $PAGETITLE',
'enotif_lastvisited' => 'Lehel $1 ommaq kõik päält suq perämäst käümist tettüq muutmisõq.',
'enotif_lastdiff' => 'Taa muutusõ nägemises kaeq: $1.',
'enotif_anon_editor' => 'nimeldä pruukja $1',
@@ -1378,6 +1369,8 @@ Inämb seo lehe kotsilõ teedäqandmiisi saadõta-i. Võit ka kõik su perräkae
Perräkaemisnimekirä säädmiisi saat muutaq lehe pääl: {{canonicalurl:Special:Watchlist/edit}}
As\'a kotsilõ mano kaiaq ja küssü saat lehe päält: {{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'lehe loonuq',
+'changed' => 'lehte muutnuq',
# Delete
'deletepage' => 'Kistudaq lehekülg ärq',
@@ -2269,4 +2262,7 @@ Prooviq harilikku kaehust.',
'specialpages-group-wiki' => 'Vikiteedüseq ja tüüriistaq',
'specialpages-group-redirects' => 'Ümbrenäütämistallitusleheq',
+# New logging system
+'rightsnone' => '(olõ-i õiguisi)',
+
);
diff --git a/languages/messages/MessagesWa.php b/languages/messages/MessagesWa.php
index c64cbf42..d6b8740d 100644
--- a/languages/messages/MessagesWa.php
+++ b/languages/messages/MessagesWa.php
@@ -220,7 +220,6 @@ $messages = array(
'qbbrowse' => 'Foyter',
'qbedit' => 'Candjî',
'qbpageoptions' => 'Cisse pådje ci',
-'qbpageinfo' => 'Contecse',
'qbmyoptions' => 'Mes pådjes',
'qbspecialpages' => 'Pådjes sipeciåles',
@@ -423,12 +422,8 @@ $2",
# Login and logout pages
'logouttext' => "'''Vos vs avoz dislodjî.'''
-Vos ploz continouwer a naivyî so {{SITENAME}} anonimmint, oudonbén [[Special:UserLogin|vos relodjî]], dizo l' minme uzeu ou dizo èn uzeu diferin.
+Vos ploz continouwer a naivyî so {{SITENAME}} anonimmint, oudonbén <span class='plainlinks'>[$1 vos relodjî]</span>, dizo l' minme uzeu ou dizo èn uzeu diferin.
Notez ki des pådjes k' i gn a si pôrént continowuer a vey come si vos estîz elodjî, disk' a tant ki vos vudrîz l' muchete di vosse betchteu waibe.",
-'welcomecreation' => '== Bénvnowe, $1! ==
-
-Vosse conte a stî ahivé.
-Èn rovyîz nén di candjî les [[Special:Preferences|preferinces di {{SITENAME}}]] a vosse môde.',
'yourname' => "Vosse no d' elodjaedje:",
'yourpassword' => 'Vosse sicret',
'yourpasswordagain' => 'Ritapez vosse sicret',
@@ -704,7 +699,6 @@ Li dierinne intrêye do djournå est håynêye chal pa dzo po referince:",
'template-protected' => '(protedjî)',
'template-semiprotected' => '(dimey-protedjî)',
'hiddencategories' => "Cisse pådje ci est mimbe {{PLURAL:$1|d' ene categoreye catcheye|di $1 categoreyes catcheyes}}:",
-'nocreatetitle' => 'Ahivaedje di pådjes limité',
'nocreatetext' => "{{SITENAME}} a limité l' possibilité d' ahiver des novelès pådjes.
Vos ploz rivni en erî eyet candjî ene pådje k' egzistêye dedja, oudonbén, [[Special:UserLogin|vos elodjî ou ahiver on conte d' uzeu]].",
'nocreate-loggedin' => "Vos n' avoz nén l' droet d' ahiver des novelès pådjes.",
@@ -1066,12 +1060,13 @@ Ciste infôrmacion serè publike po tertos.",
'right-unblockself' => 'Si disbloker lu-minme',
'right-protect' => "Candjî les liveas d' protedjaedje eyet candjî les pådjes protedjeyes",
+# Special:Log/newusers
+'newuserlogpage' => 'Djournå des noveas uzeus',
+'newuserlogpagetext' => "Chal pa dzo c' est ene djivêye des uzeus novelmint eredjîstrés.",
+
# User rights log
'rightslog' => 'Djournå des droets des uzeus',
'rightslogtext' => "Çouchal, c' est on djournå des candjmints des droets des uzeus.",
-'rightslogentry' => "a candjî l' uzeu «$1» do groupe «$2» viè «$3»",
-'rightslogentry-autopromote' => 'a stî otomaticmint candjî di «$2» a «$3»',
-'rightsnone' => '(nouk)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'lére cisse pådje ci',
@@ -1429,10 +1424,6 @@ Protocoles ricnoxhous: <code>$1</code> (nelzès metoz nén dins vosse tchinne di
'listusers-noresult' => 'Nol uzeu di trové.',
'listusers-blocked' => '({{GENDER:$1|bloké|blokêye}})',
-# Special:Log/newusers
-'newuserlogpage' => 'Djournå des noveas uzeus',
-'newuserlogpagetext' => "Chal pa dzo c' est ene djivêye des uzeus novelmint eredjîstrés.",
-
# Special:ListGroupRights
'listgrouprights-members' => '(djivêye des mimbes)',
@@ -1493,10 +1484,6 @@ Si vos vloz bodjî l' pådje foû di vosse djivêye des shuvous, clitchîz so «
'enotif_mailer' => 'Notifiaedje pa emile di {{SITENAME}}',
'enotif_reset' => 'Mårker totes les pådjes come vizitêyes',
-'enotif_newpagetext' => "C' est ene nouve pådje.",
-'changed' => 'candjeye',
-'created' => 'ahivêye',
-'enotif_subject' => 'Li pådje «$PAGETITLE» so {{SITENAME}} a stî $CHANGEDORCREATED pa $PAGEEDITOR',
'enotif_lastvisited' => 'Loukîz $1 po tos les candjmints dispoy vosse dierinne vizite.',
'enotif_body' => 'Binamé $WATCHINGUSERNAME,
@@ -1529,6 +1516,8 @@ $UNWATCHURL
Po pus d\' aidance:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'ahivêye',
+'changed' => 'candjeye',
# Delete
'deletepage' => "Disfacer l' pådje",
@@ -2350,7 +2339,7 @@ Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
'logentry-newusers-create' => "$1 a-st ahivé on conte d' uzeu",
'logentry-newusers-create2' => "$1 a-st ahivé on conte d' uzeu $3",
'logentry-newusers-autocreate' => 'li conte $1 a stî ahivé otomaticmint',
-'newuserlog-byemail' => "emilaedje d' on scret",
+'rightsnone' => '(nouk)',
# Feedback
'feedback-subject' => 'Sudjet',
diff --git a/languages/messages/MessagesWar.php b/languages/messages/MessagesWar.php
index ad2eb18b..ae7fb40f 100644
--- a/languages/messages/MessagesWar.php
+++ b/languages/messages/MessagesWar.php
@@ -199,6 +199,7 @@ $messages = array(
'newwindow' => '(nabuklad hin bag-o nga tamboan o bintana)',
'cancel' => 'Pasagdi',
'moredotdotdot' => 'Damo pa nga…',
+'morenotlisted' => 'Damo pa nga waray gintalaan...',
'mypage' => 'Pakli',
'mytalk' => 'Mga akon paghingay',
'anontalk' => 'Paghingay para hini nga IP',
@@ -210,7 +211,6 @@ $messages = array(
'qbbrowse' => 'Igdalikyat',
'qbedit' => 'Igliwat',
'qbpageoptions' => 'Ini nga pakli',
-'qbpageinfo' => 'Kontexto',
'qbmyoptions' => 'Akon mga pakli',
'qbspecialpages' => 'Mga pinaurog nga pakli',
'faq' => 'AGG',
@@ -233,6 +233,7 @@ $messages = array(
'namespaces' => "Mga ngaran-lat'ang",
'variants' => 'Mga pagkadirudilain',
+'navigation-heading' => 'Menu hit nabigasyon',
'errorpagetitle' => 'Sayop',
'returnto' => 'Balik ngadto ha $1.',
'tagline' => 'Tikang ha {{SITENAME}}',
@@ -470,9 +471,12 @@ An magdudurmara nga nagtrangka hini in naghatag hini nga eksplenasyon: "$3".',
'virus-unknownscanner' => 'diri-nasasabtan nga antivirus:',
# Login and logout pages
-'welcomecreation' => '== ¡Uswag ngan Dayon, $1! ==
-Ginhimo an imo akawnt.
-Ayaw paghingalimot hin pagbalyo han imo [[Special:Preferences|{{SITENAME}} mga ginpipili]].',
+'logouttext' => "'''Nakalog-out kana.'''
+
+Puydi ka magpadayon paggamit hin {{SITENAME}} nga diri magpapakilala, o puydi ka gihapon <span class='plainlinks'>[$1 mag-log in utro]</span> ha parehas o iba nga gumaramit.",
+'welcomeuser' => '¡Uswag ngan Dayon, $1!',
+'welcomecreation-msg' => 'An im akawnt in nahimo na.
+Ayaw kalimti pagbalyo han imo [[Special:Preferences|{{SITENAME}} preperensya]].',
'yourname' => 'Agnay hit gumaramit:',
'yourpassword' => 'Tigaman-pagsulod:',
'yourpasswordagain' => 'Utroha pagbutang an tigaman-han-pagsakob:',
@@ -494,7 +498,7 @@ Ayaw paghingalimot hin pagbalyo han imo [[Special:Preferences|{{SITENAME}} mga g
'gotaccount' => '¿Mayda kana akawnt? $1.',
'gotaccountlink' => 'Sakob',
'userlogin-resetlink' => 'Nangalimot han imo detalye han pagsakob?',
-'createaccountmail' => 'Ha e-mail',
+'createaccountmail' => 'Gamiti hin temporaryo nga bisan ano nag password ngan igpadangat ngada ha e-mail address nga nakasurat ha ubos',
'createaccountreason' => 'Rason:',
'badretype' => 'Diri naangay an mga tigaman-pagsulod nga im ginbutang',
'userexists' => 'An agnay hiton gumaramit nga im ginbutang in gingamit na.
@@ -582,6 +586,7 @@ Temporaryo nga tigaman han pagsakob: $2',
'changeemail-oldemail' => 'Yana nga e-mail address:',
'changeemail-newemail' => 'Bag-o nga e-mail address:',
'changeemail-none' => '(waray)',
+'changeemail-password' => 'An imo {{SITENAME}} password:',
'changeemail-submit' => 'Igbalyo an e-mail',
'changeemail-cancel' => 'Pasagdi',
@@ -665,7 +670,6 @@ Nasaad ka liwat nga imo ini kalugaringon nga ginsurat, o ginkopya nimo ini tikan
'template-protected' => '(pinaliporan)',
'template-semiprotected' => '(katunga nga pinasaliporan)',
'hiddencategories' => 'Ini nga pakli in api han {{PLURAL:$1|1 nakatago nga kaarangay|$1 nakatago nga kaarangay}}:',
-'nocreatetitle' => 'Limitado an pahimo hin pakli',
'nocreate-loggedin' => 'Diri ka gintutugotan paghimo hin mga bag-o nga pakli.',
'sectioneditnotsupported-title' => 'Diri suportado han pagliwat han seksyon',
'sectioneditnotsupported-text' => 'Diri suportado an pagliwat han seksyon ha dinhi nga pakli.',
@@ -684,6 +688,14 @@ An taramdan han pagpara ngan pagbalhin para han pakli in ginhahatag ha ubos para
'edit-already-exists' => 'Diri nakakahimo hin bag-o nga pakli.
Aada na ito.',
'defaultmessagetext' => 'Aada-nga-daan nga teksto han mensahe',
+'invalid-content-data' => 'Sayop nga sulod nga datos',
+'content-not-allowed-here' => 'An sulod nga "$1" in diri gintutugotan ha pakli nga [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikiteksto',
+'content-model-text' => 'yano nga teksto',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'post-expand-template-inclusion-warning' => "'''Pahimatngon:''' An batakan nga ginlakip in sobra kadako.
@@ -898,9 +910,9 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
'prefs-emailconfirm-label' => 'Kompirmasyon han email:',
'prefs-textboxsize' => 'Kadako han editing window',
'youremail' => 'E-mail:',
-'username' => 'Agnay hiton gumaramit:',
-'uid' => 'ID han gumaramit:',
-'prefs-memberingroups' => 'Api han {{PLURAL:$1| nga hugpo|nga mga hugpo}}:',
+'username' => '{{HENERO:$1|Agnay hit gumaramit}}:',
+'uid' => 'ID hit {{HENERO:$1|Gumaramit}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Api}} han {{PLURAL:$1|grupo|mga grupo}}:',
'prefs-registration' => 'Oras han pagrehistro:',
'yourrealname' => 'Tinuod nga ngaran:',
'yourlanguage' => 'Yinaknan:',
@@ -1009,9 +1021,12 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
'right-userrights-interwiki' => 'Igliwat an mga katungod han gumaramit han mga gumaramit ha iba nga mga wiki',
'right-sendemail' => 'Padad-i hin e-mail ngada ha iba nga mga gumaramit',
+# Special:Log/newusers
+'newuserlogpage' => 'Talaan han paghimo hin gumaramit',
+'newuserlogpagetext' => 'Ini an talaan han mga nagkahihimo nga mga gumaramit.',
+
# User rights log
'rightslog' => 'Talaan hin mga katungod han gumaramit',
-'rightsnone' => '(waray)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'basaha ini nga pakli',
@@ -1304,6 +1319,8 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
'disambiguations' => 'Mga pakli nga nasumpay ha mga pansayod nga pakli',
'disambiguationspage' => 'Template:pansayod',
+'pageswithprop-submit' => 'Kadto-a',
+
'doubleredirects' => 'Mga doble nga redirekta',
'double-redirect-fixer' => 'Mangangayad hin redirekta',
@@ -1422,10 +1439,6 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
'activeusers-hidesysops' => 'Igtago an mga magdudumara',
'activeusers-noresult' => 'Waray gumaramit nga nahiagian.',
-# Special:Log/newusers
-'newuserlogpage' => 'Talaan han paghimo hin gumaramit',
-'newuserlogpagetext' => 'Ini an talaan han mga nagkahihimo nga mga gumaramit.',
-
# Special:ListGroupRights
'listgrouprights-group' => 'Hugpo',
'listgrouprights-rights' => 'Mga katungod',
@@ -1487,11 +1500,15 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
'unwatching' => 'Diri na ginbabantay...',
'enotif_reset' => 'Markahi an ngatanan nga mga pakli nga ginbisita na',
-'enotif_newpagetext' => 'Ini in bag-o nga pakli.',
'enotif_impersonal_salutation' => 'gumaramit han {{SITENAME}}',
-'changed' => 'naliwanan',
-'created' => 'nahimo',
+'enotif_subject_deleted' => 'An {{SITENAME}} pakli nga $1 in {{GENDER:$2|ginpara}} ni $2',
+'enotif_subject_created' => 'An {{SITENAME}} pakli nga $1 in {{GENDER:$2|ginhimo}} ni $2',
+'enotif_subject_moved' => 'An {{SITENAME}} pakli nga $1 in {{GENDER:$2|ginbalhin}} ni $2',
+'enotif_subject_restored' => 'An {{SITENAME}} pakli nga $1 in {{GENDER:$2|ginbalik}} ni $2',
+'enotif_subject_changed' => '{{SITENAME}} page $1 has been {{GENDER:$2|ginbal-iw}} by $2',
'enotif_anon_editor' => 'waray magpakilala nga gumaramit $1',
+'created' => 'nahimo',
+'changed' => 'naliwanan',
# Delete
'deletepage' => 'Igpara an pakli',
@@ -1557,6 +1574,8 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
'undeletelink' => 'igpakita/igbalik',
'undeleteviewlink' => 'kitaa',
'undeletecomment' => 'Katadungan:',
+'cannotundelete' => 'Pakyas an pagpabalik han pinara:
+$1',
'undelete-search-title' => 'Pamiling hin mga ginpara nga mga pakli',
'undelete-search-box' => 'Pamiling hin mga ginpara nga mga pakli',
'undelete-search-submit' => 'Bilnga',
@@ -1569,7 +1588,7 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
'blanknamespace' => '(Panguna)',
# Contributions
-'contributions' => 'Mga amot han gumaramit',
+'contributions' => 'Mga ámot ni {{GENDER:$1|User}}',
'contributions-title' => 'Mga amot han gumaramit para ha $1',
'mycontris' => 'Mga ámot nakon',
'contribsub2' => 'Para ha $1 $2',
@@ -1883,6 +1902,15 @@ Makikit-an nimo an ginkuhaaan',
'pageinfo-lastuser' => 'Giurhii nga nagliwat',
'pageinfo-lasttime' => 'Petsa han kataposan nga pagliwat',
'pageinfo-edits' => 'Ngatanan nga ihap han mga pakli',
+'pageinfo-toolboxlink' => 'Impormasyon han pakli',
+'pageinfo-redirectsto' => 'Igredirect ngadto ha',
+'pageinfo-contentpage' => 'Ginlakip komo uska unod nga pakli',
+'pageinfo-contentpage-yes' => 'Oo',
+'pageinfo-protect-cascading-yes' => 'Oo',
+'pageinfo-category-info' => 'Impormasyon han kaarangay',
+'pageinfo-category-pages' => 'Ihap han mga pakli',
+'pageinfo-category-subcats' => 'Ihap han mga ubos-kaarangay',
+'pageinfo-category-files' => 'Ihap han mga paypay',
# Patrolling
'markaspatrolleddiff' => 'Igmarka komo ginpatrolya na',
@@ -1929,6 +1957,7 @@ $1',
# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
'ago' => '$1 an nakalabay',
+'just-now' => 'yana pala',
# Bad image list
'bad_image_list' => 'An kabutangan in masunod:
@@ -2291,7 +2320,7 @@ Ini nga sityo in nageeksperyensya hin mga pagkuri teknikal.',
'logentry-newusers-create' => '$1 in naghimo hin gumaramit nga akawnt',
'logentry-newusers-create2' => '$1 in naghimo hin gumaramit nga akawnt $3',
'logentry-newusers-autocreate' => 'An akawnt nga $1 in lugaring nga nahimo',
-'newuserlog-byemail' => 'Ginpadangat an tigaman-pagsulod pinaagi han e-mail',
+'rightsnone' => '(waray)',
# Feedback
'feedback-subject' => 'Himangrawon:',
diff --git a/languages/messages/MessagesWo.php b/languages/messages/MessagesWo.php
index bb4dba43..3ab66399 100644
--- a/languages/messages/MessagesWo.php
+++ b/languages/messages/MessagesWo.php
@@ -221,7 +221,6 @@ $messages = array(
'qbbrowse' => 'Lemmi',
'qbedit' => 'Soppi',
'qbpageoptions' => 'Xëtuw tànneef',
-'qbpageinfo' => 'Xëtuw xibaar',
'qbmyoptions' => 'Samay tànneef',
'qbspecialpages' => 'Xëti jagleel',
'faq' => 'Laaj yi ëpp',
@@ -450,10 +449,7 @@ Ngirte li mu joxe mooy ne « ''$2'' ».",
# Login and logout pages
'logouttext' => "Fi mu nekk nii génn nga.'''
-Man ngaa wéy di jëfandikoo {{SITENAME}} ci anam buñ la dul xamme walla nga [[Special:UserLogin|duggewaat]] ak wenn tur wi walla ak weneen.",
-'welcomecreation' => '== Dalal-jàmm, $1 ! ==
-Sosees na sa sàq.
-Bul fatte soppi say [[Special:Preferences|{{SITENAME}} tànneef]].',
+Man ngaa wéy di jëfandikoo {{SITENAME}} ci anam buñ la dul xamme walla nga <span class='plainlinks'>[$1 duggewaat]</span> ak wenn tur wi walla ak weneen.",
'yourname' => 'Sa turu jëfandikukat',
'yourpassword' => 'Sa baatujàll',
'yourpasswordagain' => 'Bindaatal sa baatujàll',
@@ -685,7 +681,6 @@ Jëfandikukat yi nekk yorkat rekk a ko man a soppi.'''",
'template-protected' => '(aar)',
'template-semiprotected' => '(aar-diggu)',
'hiddencategories' => '{{PLURAL:$1|wàll bu nëbbu bu|wàll yu nëbbu yu }} xët wii bokk :',
-'nocreatetitle' => 'Digalu sosteefu xët',
'nocreatetext' => 'Jëfandikukat yi bindu rekk a man a sosi xët ci {{SITENAME}}. Man nga dellu ginnaaw walla soppi aw xët wu am ba noppi, [[Special:UserLogin|duggu walla sos am sàq]].',
'nocreate-loggedin' => 'Amuloo sañ-sañ yu doy ngir man a sosi xët yu bees.',
'permissionserrors' => 'Njuumte ci sañ-sañ yi',
@@ -1129,11 +1124,13 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
'right-siteadmin' => 'Caabi walla caabeedi dàttub njoxe bi',
'right-override-export-depth' => 'génne ay xët yu ëmbi xët yu lëkkaloo ba-ci xóotaay bu tolluwaayam àgg 5',
+# Special:Log/newusers
+'newuserlogpage' => 'Jëfandikukat yu yees yi',
+'newuserlogpagetext' => 'Xët wii daf lay won limu sáq yi fi mujjee sosu.',
+
# User rights log
'rightslog' => 'Sañ-sañi jëfandikukat',
'rightslogtext' => 'Lii di toftal limu jaar-jaaru coppitey sañ-sañi jëfandikukat yi.',
-'rightslogentry' => 'moo jële jëfandikukat bii di « $1 » ci mbooloo $2 yóbb ko ci $3',
-'rightsnone' => '(menn)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'jàng wii xët',
@@ -1549,10 +1546,6 @@ Xoolal itam [[Special:WantedCategories|wàll yi ñuy laaj]].',
'activeusers-from' => 'Wone jëfandikukat yi dalee ko ci:',
'activeusers-noresult' => 'Benn jëfandikukat giseesu ko',
-# Special:Log/newusers
-'newuserlogpage' => 'Jëfandikukat yu yees yi',
-'newuserlogpagetext' => 'Xët wii daf lay won limu sáq yi fi mujjee sosu.',
-
# Special:ListGroupRights
'listgrouprights' => 'Sañ-sañi mbooloom jëfandikukat mi',
'listgrouprights-summary' => 'Lii di toftal mooy limu mboolooy jëfandikukat yi ne ci bii wiki, ak sañ-sañ yi ñu leen féetaleel.
@@ -1625,14 +1618,12 @@ Coppite yiy ñëw yu xët wi ak xëtu waxtaanuwaay wi mu àndal di nañu leen fa
'unwatching' => 'Farug toppte gi ...',
'enotif_reset' => 'Fésal xët yépp niki yoo nemmeeku ba noppi',
-'enotif_newpagetext' => 'Lii aw xët wu bees la.',
'enotif_impersonal_salutation' => 'Jëfandikukat bu {{SITENAME}}',
-'changed' => 'soppi',
-'created' => 'sosu na',
-'enotif_subject' => 'Xët wii di $PAGETITLE wu {{SITENAME}}, $PAGEEDITOR moo ko $CHANGEDORCREATED',
'enotif_lastvisited' => 'Nemmeekul $1 ngir gis bépp coppite dale ba sa nemmeku gu mujj.',
'enotif_lastdiff' => 'Xoolal $1 ngir gis gii coppite.',
'enotif_anon_editor' => 'Jëfandikukat bu binduwul $1',
+'created' => 'sosu na',
+'changed' => 'soppi',
# Delete
'deletepage' => 'Far xët wi',
@@ -2207,6 +2198,6 @@ Man nga tamit [[Special:EditWatchlist/raw|soppi ko]].',
# New logging system
'revdelete-restricted' => 'doxalub digal ngir yorkat yi',
'revdelete-unrestricted' => 'digal ngir yorkat yi deñ na',
-'newuserlog-byemail' => 'baatujáll bi yónne nañu ko cib bataaxal',
+'rightsnone' => '(menn)',
);
diff --git a/languages/messages/MessagesWuu.php b/languages/messages/MessagesWuu.php
index 5cd53c26..584cf06f 100644
--- a/languages/messages/MessagesWuu.php
+++ b/languages/messages/MessagesWuu.php
@@ -160,7 +160,6 @@ $messages = array(
'qbbrowse' => 'æµè§ˆ',
'qbedit' => '编辑',
'qbpageoptions' => 'è¿­åªé¡µé¢',
-'qbpageinfo' => '上下文',
'qbmyoptions' => '我个选项',
'qbspecialpages' => '特殊页é¢',
'faq' => 'FAQs',
@@ -383,11 +382,8 @@ $2',
# Login and logout pages
'logouttext' => "侬已ç»ç™»å‡ºå“‰ã€‚'''
-侬å¯ä»¥ç»§ç»­åŒ¿å使用{{SITENAME}} ,也å¯ä»¥å†æ¬¡ä»¥ç›¸åŒæˆ–者两样个用户å[[Special:UserLogin|登录]]。
+侬å¯ä»¥ç»§ç»­åŒ¿å使用{{SITENAME}} ,也å¯ä»¥å†æ¬¡ä»¥ç›¸åŒæˆ–者两样个用户å<span class='plainlinks'>[$1 登录]</span>。
注æ„,有眼页é¢ä½œå…´è¿˜æ˜¯ä¼šæ­ä¾¬ç™»å‡ºå‰å¤´ä¸€æ ·æ˜¾ç¤ºï¼Œä¸€è„šåˆ°ä¾¬æ¸…除æµè§ˆå™¨ç¼“存。",
-'welcomecreation' => '== 欢迎侬, $1ï¼ ==
-
-侬个户头已ç»å»ºç«‹å¥½å“‰ã€‚å¼—è¦å¿˜è®°è„±è®¾å®šä¾¬ä¸ª[[Special:Preferences|{{SITENAME}}的个人å‚æ•°]]噢。',
'yourname' => '用户å:',
'yourpassword' => '密ç :',
'yourpasswordagain' => 'å†æ‹ä¸€é密ç :',
@@ -629,7 +625,6 @@ $2',
'template-protected' => '(ä¿æŠ¤ï¼‰',
'template-semiprotected' => '(åŠä¿æŠ¤åžƒè®¸ï¼‰',
'hiddencategories' => '箇åªé¡µé¢æ˜¯å±žäºŽ$1个éšè—分类个æˆå‘˜ï¼š',
-'nocreatetitle' => '创建页é¢å—é™',
'nocreatetext' => '{{SITENAME}}é™åˆ¶äº†åˆ›å»ºæ–°é¡µé¢åŠŸèƒ½ã€‚侬å¯ä»¥è¿”回并编辑已有个页é¢ï¼Œæˆ–者[[Special:UserLogin|登录或创建新账户]]。',
'nocreate-loggedin' => '侬呒没æƒé™åˆ›å»ºæ–°é¡µé¢ã€‚',
'sectioneditnotsupported-title' => '段è½ç¼–辑弗支æŒ',
@@ -1001,9 +996,11 @@ $1",
'grouppage-sysop' => '{{ns:project}}:管ç†å‘˜',
'grouppage-bureaucrat' => '{{ns:project}}:行政员',
+# Special:Log/newusers
+'newuserlogpage' => '用户创建日志',
+
# User rights log
'rightslog' => '用户æƒé™æ—¥å¿—',
-'rightsnone' => '(呒)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => '编辑箇åªé¡µé¢',
@@ -1193,9 +1190,6 @@ $1",
# Special:ListUsers
'listusers-submit' => '显示',
-# Special:Log/newusers
-'newuserlogpage' => '用户创建日志',
-
# Special:ListGroupRights
'listgrouprights-members' => '(æˆå‘˜åˆ—表)',
@@ -1230,9 +1224,8 @@ $1",
'watching' => '监控……',
'unwatching' => '解除监控……',
-'enotif_newpagetext' => '该个是一åªæ–°é¡µé¢ã€‚',
-'changed' => '改å˜å“‰',
'created' => '建立哉',
+'changed' => '改å˜å“‰',
# Delete
'deletepage' => '删脱页é¢',
@@ -1601,5 +1594,6 @@ Variants for Chinese language
# New logging system
'revdelete-restricted' => '已将é™åˆ¶åº”用到管ç†å‘˜',
'revdelete-unrestricted' => '已移除对管ç†å‘˜ä¸ªé™åˆ¶',
+'rightsnone' => '(呒)',
);
diff --git a/languages/messages/MessagesXal.php b/languages/messages/MessagesXal.php
index daecd52a..f20dfd16 100644
--- a/languages/messages/MessagesXal.php
+++ b/languages/messages/MessagesXal.php
@@ -199,7 +199,6 @@ $messages = array(
'qbbrowse' => 'Гүүһәд хәләх',
'qbedit' => 'Чиклх',
'qbpageoptions' => 'Тер халх',
-'qbpageinfo' => 'Халхин туÑк',
'qbmyoptions' => 'Тана халхÑ',
'qbspecialpages' => 'Көдлхнә халхÑ',
'faq' => 'Юм би',
@@ -397,11 +396,8 @@ $1',
# Login and logout pages
'logouttext' => "'''Та һарад бәәнәт.'''
-Та {{SITENAME}} гидг ормиг нертә уга олзлҗ чаднат, аль та [[Special:UserLogin|дәкәд орҗ]] цацу аль талдан нертә чаднат.
+Та {{SITENAME}} гидг ормиг нертә уга олзлҗ чаднат, аль та <span class='plainlinks'>[$1 дәкәд орҗ]</span> цацу аль талдан нертә чаднат.
Зәрм Ñ…Ð°Ð»Ñ…Ñ Ñ†Ð°Ð°Ñ€Ð°Ð½Ð´Ð½ÑŒ та ода чигн орÑн мет үзүлҗ чаддг туÑкар темдглтн (та хәләчин Ñанлиг цеврлтл).",
-'welcomecreation' => '== Ирхитн Ñрҗәнәвидн, $1! ==
-Таднар шин бичгдлһн бүтв.
-Тадна [[Special:Preferences|{{SITENAME}} preferences]] Ñольҗ бичә мартн.',
'yourname' => 'Демнчна нернь:',
'yourpassword' => 'Ðууц үг:',
'yourpasswordagain' => 'Ðууц үгиг давтн:',
@@ -712,9 +708,11 @@ $1',
'grouppage-sysop' => '{{ns:project}}:Закрачуд',
'grouppage-bureaucrat' => '{{ns:project}}:Ðойнчуд',
+# Special:Log/newusers
+'newuserlogpage' => 'Бичгдлһнә Ñеткүл',
+
# User rights log
'rightslog' => 'Демнчна зөвәнә Ñеткүл',
-'rightsnone' => '(уга)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'Ñн халхиг чиклх',
@@ -857,9 +855,6 @@ $1',
# Special:LinkSearch
'linksearch' => 'Һаза заалһуд',
-# Special:Log/newusers
-'newuserlogpage' => 'Бичгдлһнә Ñеткүл',
-
# Special:ListGroupRights
'listgrouprights-members' => '(мөчүдин Ñеткүл)',
@@ -883,8 +878,6 @@ $1',
'watching' => 'Шинҗллһнә бүтлклд немлһн...',
'unwatching' => 'Шинҗлһнә Ð±Ò¯Ñ€Ñ‚ÐºÐ»Ó™Ñ Ò»Ð°Ñ€Ò»Ð»Ò»Ð½...',
-'changed' => 'Ñольв',
-'created' => 'бүтәв',
'enotif_body' => 'Мендвт, күндтә $WATCHINGUSERNAME,
$PAGEEDITDATE цагт {{SITENAME}} Ñ‚Ó©Ñвин $PAGETITLE халхиг $PAGEEDITOR $CHANGEDORCREATED. Ода болÑн халхна Ñнз үзҗ Ñедхлә, $PAGETITLE_URL хәләтн.
@@ -907,6 +900,8 @@ e-mail\'ар $PAGEEDITOR_EMAIL
Хәрү холва болн туÑ:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'бүтәв',
+'changed' => 'Ñольв',
# Delete
'deletepage' => 'Эн халхиг һарһҗ',
@@ -1271,4 +1266,7 @@ $2 шидрә һарһлһна төлә хәләтн.',
'htmlform-reset' => 'Сольлһиг уга кех',
'htmlform-selectorother-other' => 'Талдан',
+# New logging system
+'rightsnone' => '(уга)',
+
);
diff --git a/languages/messages/MessagesXh.php b/languages/messages/MessagesXh.php
index 0fb07c33..08473de8 100644
--- a/languages/messages/MessagesXh.php
+++ b/languages/messages/MessagesXh.php
@@ -86,9 +86,6 @@ $messages = array(
'viewsource' => 'Jonga i Source',
# Login and logout pages
-'welcomecreation' => '== Wamkelekile, $1! ==
-
-I Account yakhgo ivuliwe, ungalibali ukutshitsha izinto ozithandayo ngo {{SITENAME}}.',
'yourname' => 'Igama lelungu:',
'yourpassword' => 'Igama elifihlakeleyo lelungu:',
'yourpasswordagain' => 'Faka kwakhona igama elifihlakeleyo:',
diff --git a/languages/messages/MessagesXmf.php b/languages/messages/MessagesXmf.php
index a9ad98b4..4f21adc8 100644
--- a/languages/messages/MessagesXmf.php
+++ b/languages/messages/MessagesXmf.php
@@ -126,7 +126,6 @@ $messages = array(
'qbfind' => 'დáƒáƒ’áƒáƒ áƒ˜',
'qbedit' => 'რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ',
'qbpageoptions' => 'თე ხáƒáƒ¡áƒ·áƒšáƒ',
-'qbpageinfo' => 'კáƒáƒœáƒ¢áƒ”ქსტი',
'qbmyoptions' => 'ჩქიმი ხáƒáƒ¡áƒ·áƒšáƒ”ფი',
'qbspecialpages' => 'გჷშáƒáƒ™áƒ”რძáƒáƒ¤áƒ˜áƒšáƒ˜ ხáƒáƒ¡áƒ·áƒšáƒ”ფი',
'faq' => 'ბხშირი კითხვეფი',
@@ -459,6 +458,9 @@ $messages = array(
'grouppage-user' => '{{ns:project}}:მáƒáƒ®áƒ•áƒáƒ áƒ”ბუეფ',
'grouppage-sysop' => '{{ns:project}}:ხემáƒáƒœáƒ¯áƒ¦áƒ•áƒ”რეფი',
+# Special:Log/newusers
+'newuserlogpage' => 'მáƒáƒ®áƒ•áƒáƒ áƒ”ბუშ რეგისტრáƒáƒªáƒ˜áƒáƒ¨ ჟურნáƒáƒš',
+
# User rights log
'rightslog' => 'მáƒáƒ®áƒ•áƒáƒ áƒ”ბუშ ნებეფიშ ჟურნáƒáƒš',
@@ -601,9 +603,6 @@ $messages = array(
'linksearch' => 'გáƒáƒšáƒ”ნ რცხიეფ',
'linksearch-line' => '$1 მერცხიილი რე $2-შე',
-# Special:Log/newusers
-'newuserlogpage' => 'მáƒáƒ®áƒ•áƒáƒ áƒ”ბუშ რეგისტრáƒáƒªáƒ˜áƒáƒ¨ ჟურნáƒáƒš',
-
# Special:ListGroupRights
'listgrouprights-members' => '(მáƒáƒ™áƒáƒ—ურეფიშ ერკებული)',
diff --git a/languages/messages/MessagesYi.php b/languages/messages/MessagesYi.php
index 700df0a5..f31084da 100644
--- a/languages/messages/MessagesYi.php
+++ b/languages/messages/MessagesYi.php
@@ -146,10 +146,13 @@ $magicWords = array(
'nogallery' => array( '0', '__קיין_×’×לעריע__', '__לל×_גלריה__', '__NOGALLERY__' ),
'toc' => array( '0', '__××™× ×”×לט__', '__תוכן_×¢× ×™×™× ×™×__', '__תוכן__', '__TOC__' ),
'noeditsection' => array( '0', '__נישט_רעד×קטירן__', '__לל×_עריכה__', '__NOEDITSECTION__' ),
- 'noheader' => array( '0', '__קיינקעפל__', '__לל×_כותרת__', '__NOHEADER__' ),
'currentday' => array( '1', 'לויפיקער_ט××’', '×™×•× × ×•×›×—×™', 'CURRENTDAY' ),
+ 'currentyear' => array( '1', 'לויפֿיקע_×™×ָר', 'שנה נוכחית', 'CURRENTYEAR' ),
+ 'currenttime' => array( '1', 'לויפֿיקע_צײַט', 'שעה נוכחית', 'CURRENTTIME' ),
'numberofpages' => array( '1', 'צ×ל_בלעטער', 'מספר ×“×¤×™× ×›×•×œ×œ', 'מספר דפי×', 'NUMBEROFPAGES' ),
'numberofarticles' => array( '1', 'צ×ל_×רטיקלען', 'מספר ערכי×', 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( '1', 'צ×ל_טעקעס', 'מספר קבצי×', 'NUMBEROFFILES' ),
+ 'numberofusers' => array( '1', 'צ×ל_ב×ניצער', 'מספר משתמשי×', 'NUMBEROFUSERS' ),
'pagename' => array( '1', 'בל×טנ×מען', '×©× ×”×“×£', 'PAGENAME' ),
'namespace' => array( '1', '× ×מענטייל', 'מרחב הש×', 'NAMESPACE' ),
'fullpagename' => array( '1', 'פולבל×טנ×מען', '×©× ×”×“×£ המל×', 'FULLPAGENAME' ),
@@ -161,8 +164,10 @@ $magicWords = array(
'img_right' => array( '1', 'רעכטס', 'ימין', 'right' ),
'img_left' => array( '1', 'לינקס', 'שמ×ל', 'left' ),
'img_none' => array( '1', '×ן', 'לל×', 'none' ),
+ 'img_width' => array( '1', '$1פיקס', '$1 פיקסלי×', '$1px' ),
'img_center' => array( '1', 'צענטער', 'מרכז', 'center', 'centre' ),
'img_sub' => array( '1', '×ונטער', 'תחתי', 'sub' ),
+ 'img_super' => array( '1', '×יבער', 'עילי', 'super', 'sup' ),
'img_top' => array( '1', '×ויבן', 'למעלה', 'top' ),
'img_bottom' => array( '1', '×ונטן', 'למטה', 'bottom' ),
'img_link' => array( '1', 'לינק=$1', 'קישור=$1', 'link=$1' ),
@@ -317,6 +322,7 @@ $messages = array(
'newwindow' => '(עפֿנט זיך ×ין × × ×²Ö·×¢× ×¤×¢× ×¡×˜×¢×¨)',
'cancel' => '×ַנולירן',
'moredotdotdot' => '× ×ך…',
+'morenotlisted' => 'ווייטער, × ×ך נישט ×ין דער ליסטע…',
'mypage' => 'מײַן בל×ט',
'mytalk' => 'שמועס',
'anontalk' => 'ד×ס רעדן פון ×“×¢× IP',
@@ -328,7 +334,6 @@ $messages = array(
'qbbrowse' => 'בלעטערט',
'qbedit' => 'ענדערן',
'qbpageoptions' => 'דער בל×ט',
-'qbpageinfo' => 'ק×נטעקסט',
'qbmyoptions' => 'מיינע בלעטער',
'qbspecialpages' => 'ספעציעלע בלעטער',
'faq' => 'מערסטע געפרעגטע פר×געס',
@@ -351,6 +356,7 @@ $messages = array(
'namespaces' => '× ×ָמענטיילן',
'variants' => '×°×ַרי×ַנטן',
+'navigation-heading' => '× ×וויג×ציע מעניו',
'errorpagetitle' => 'פֿעלער',
'returnto' => 'צוריקקערן צו $1.',
'tagline' => 'פֿון {{SITENAME}}',
@@ -595,9 +601,10 @@ $2',
# Login and logout pages
'logouttext' => "'''×יר ×”×ָט זיך ×רויסל×ָגירט.'''
-×יר קענט ממשיך זיין ניצן {{SITENAME}} ×Ö·× ×× ×™×, ×דער ×יר קענט [[Special:UserLogin|צוריק ×ריינל×גירן]] מיט ×“×¢× ×–×¢×œ×‘×Ÿ ×דער ×ן ×נדער ב×ַניצער × ×ָמען. ב×מערקט ××– געוויסע בלעטער קענען זיך ווייטער ×רויסשטעלן ×זוי ווי ווען ×יר זענט ×ריינל×גירט, ביז ×יר וועט ×ויסליידיגן ×“×¢× ×‘×œ×¢×˜×¢×¨×¢×¨ ×–×פ×ס.",
-'welcomecreation' => '== ברוך הב×, $1! ==
-×ייער ק×נטע ××™×– ב×ש×פן געוו×רן. נישט פ×רגעסן צו ענדערן ×ייערע [[Special:Preferences|{{SITENAME}} פרעפֿערענצן]].',
+×יר קענט ממשיך זיין ניצן {{SITENAME}} ×Ö·× ×× ×™×, ×דער ×יר קענט <span class='plainlinks'>[$1 צוריק ×ריינל×גירן]</span> מיט ×“×¢× ×–×¢×œ×‘×Ÿ ×דער ×ן ×נדער ב×ַניצער × ×ָמען. ב×מערקט ××– געוויסע בלעטער קענען זיך ווייטער ×רויסשטעלן ×זוי ווי ווען ×יר זענט ×ריינל×גירט, ביז ×יר וועט ×ויסליידיגן ×“×¢× ×‘×œ×¢×˜×¢×¨×¢×¨ ×–×פ×ס.",
+'welcomeuser' => 'ברוך הב×, $1!',
+'welcomecreation-msg' => "מ'×”×ט געש×פן ×ייער ק×נטע.
+פ×רגעסט נישט צו ענדערן ×ייערע [[Special:Preferences|{{SITENAME}} פרעפערענצן]].",
'yourname' => 'ב×ַניצער × ×ָמען:',
'yourpassword' => 'פ×סוו×רט',
'yourpasswordagain' => 'ווידער ×ריינקל×פן פ×סוו×רט',
@@ -620,7 +627,7 @@ $2',
'gotaccount' => "×”×סטו שוין × ×§×נטע? '''$1'''.",
'gotaccountlink' => '×ַרײַנל×גירן',
'userlogin-resetlink' => 'פ×רגעסן ×ײַערע ×ַרײַנל×ָגירן פרטי×?',
-'createaccountmail' => 'דורך ×¢-פ×סט',
+'createaccountmail' => 'ניצן × ×¤×¨×וויז×ריש פ×סוו×רט ×ון שיקן ×¦×•× ×¢-פ×סט ×דרעס געצייכנט ×ונטן',
'createaccountreason' => '×ורז×ַך:',
'badretype' => 'די פ×סווערטער וו×ס ×יר ×”×ט ×ריינגעלייגט זענען נישט ××™×™× ×™×’.',
'userexists' => 'דער ב×ַניצער × ×ָמען ××™×– שוין געניצט.
@@ -697,6 +704,7 @@ $2',
# Email sending
'php-mail-error-unknown' => '×ומב×ַק×ַנט טעות ×ין()mail פֿונקציע פֿון PHP.',
'user-mail-no-addy' => 'געפרוווט צו שיקן ×¢-פּ×ָסט ×ָן ×ַן ×¢-פּ×ָסט ×ַדרעס.',
+'user-mail-no-body' => '×”×ט פרובירט צו שיקן × ×‘×œ×™×¦×‘×¨×™×•×• וו×ס זיין ××™× ×”×לט ××™×– ליידיק ×דער ×’×ר קורץ.',
# Change password dialog
'resetpass' => 'ענדערן ק×נטע פ×סוו×רט',
@@ -750,7 +758,7 @@ $2
פר×וויז×רישער פּ×ַר×ָל: $2',
'passwordreset-emailsent' => "מ'×”×ט געשיקט × ×¤×סוו×רט צוריקשטעלן ×¢-פּ×ָסט.",
'passwordreset-emailsent-capture' => 'מען ×”×ט געשיקט × ×¤×סוו×רט צוריקשטעלן בליצבריוו, וו×ס ווערט געוויזן ×ונטן.',
-'passwordreset-emailerror-capture' => 'מען ×”×ט געש×פן × ×“×¢×¨×ž×נונג בליצבריוו, וו×ס ווערט געוויזן ×ונטן, ×בער שיקן ×¦×•× ×‘×ניצער ××™×– דורכגעפ×לן: $1',
+'passwordreset-emailerror-capture' => 'מען ×”×ט געש×פן × ×¤×סוו×רט צוריקשטעלן בליצבריוו, וו×ס ווערט געוויזן ×ונטן, ×בער שיקן ×¦×•× ×‘×ניצער ××™×– דורכגעפ×לן: $1',
# Special:ChangeEmail
'changeemail' => 'ענדערן ×¢-פּ×ָסט ×ַדרעס',
@@ -760,6 +768,7 @@ $2
'changeemail-oldemail' => 'קר×ַנטער ×¢-פּ×ָסט ×ַדרעס:',
'changeemail-newemail' => 'נײַער בליצפּ×ָסט ×ַדרעס:',
'changeemail-none' => '(קיין)',
+'changeemail-password' => '×ייער {{SITENAME}} פ×סוו×רט:',
'changeemail-submit' => 'ענדערן ע־פ×סט ×דרעס',
'changeemail-cancel' => '×ַנולירן',
@@ -943,7 +952,6 @@ $2
'template-semiprotected' => '(טיילווייז ב×שיצט)',
'hiddencategories' => 'דער ד×זיגער בל×ט געהערט צו {{PLURAL:$1|×יין ב××”×לטענער ק×טעג×ריע|$1 ב××”×לטענע ק×טעג×ריעס}}:',
'edittools' => '<!-- טעקסט ×“× ×•×•×¢×˜ געוויזן ווערן ×ונטער ענדערן ×ון ×רויפל×דירן פ×רעמס. -->',
-'nocreatetitle' => 'בל×ט ב×ש×פן ב×גרעניצט',
'nocreatetext' => 'די סייט ×”×ט ב×גרעניצט די מעגליכקייט צו ש×פן × ×™×™×¢ בלעטער.
×יר קענט צוריקגיין ×ון ענדערן ×“×¢× ×¢×§×–×™×¡×˜×™×¨× ×“×Ÿ בל×ט, ×דער [[Special:UserLogin|ל×גירט זיך ×ריין ×דער ש×פט × ×§×נטע]].',
'nocreate-loggedin' => '×יר זענט נישט ערלויבט צו ש×ַפֿן נײַע בלעטער.',
@@ -968,6 +976,15 @@ $2
'edit-already-exists' => 'נישט מעגליך צו ש×ַפֿן × ×™×™×¢ בל×ט.
ער עקזיסטירט שוין.',
'defaultmessagetext' => 'גרונטלעכער מעלדונג טעקסט',
+'content-failed-to-parse' => 'פ×רזן $2 ××™× ×”×לט פ×ר $1 מ×דעל דורכגעפ×לן: $3',
+'invalid-content-data' => '×ומגילטיקע ××™× ×”×לט ד×טן',
+'content-not-allowed-here' => '"$1" ××™× ×”×לט נישט דערלויבט ×ויף בל×ט [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'וויקיטעקסט',
+'content-model-text' => 'פשוטער טעקסט',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''×זהרה:''' דער בל×ט ×נטה×לט צופיל טייערע פ×רזירער רופן.
@@ -1328,9 +1345,9 @@ $1",
'prefs-emailconfirm-label' => '×¢-פ×סט ב×ַשטעטיקונג:',
'prefs-textboxsize' => 'גרייס פֿון רעד×ַקטירונג פֿענסטער',
'youremail' => '×¢-פ×סט:',
-'username' => 'ב×ַניצער־נ×ָמען:',
-'uid' => 'ב×ַנוצער־נומער:',
-'prefs-memberingroups' => 'מיטגליד ×ין {{PLURAL:$1|גרופע|גרופעס}}:',
+'username' => '{{GENDER:$1|ב×ַניצער־נ×ָמען}}:',
+'uid' => '{{GENDER:$1|ב×ַנוצער־נומער}}:',
+'prefs-memberingroups' => '{{GENDER:$2|מיטגליד}} ×ין {{PLURAL:$1|גרופע|גרופעס}}:',
'prefs-registration' => '×ײַנשרײַבן צײַט:',
'yourrealname' => 'עכטער × ×מען *:',
'yourlanguage' => 'שפּר×ַך:',
@@ -1476,12 +1493,13 @@ $1",
'right-sendemail' => 'שיקן ×¢-פ×סט צו ×נדערע ב×ניצער',
'right-passwordreset' => 'ב×ַקוקן פ×ַסוו×רט צוריקשטעלן ע־בריוו',
+# Special:Log/newusers
+'newuserlogpage' => '× ×™×™×¢ ב×ַניצערס ל×ָג-בוך',
+'newuserlogpagetext' => 'ד×ס ××™×– × ×œ××’ פון ב×ַניצערס ×ײַנשרײַבונגען.',
+
# User rights log
'rightslog' => 'ב×ַניצער רעכטן ל××’',
'rightslogtext' => 'ד×ָס ××™×– ×Ö· ל××’ פֿון ענדערונגען צו ב×ַניצער רעכטן.',
-'rightslogentry' => 'געביטן די מיטגלידערש×ַפֿט פֿ×ַר $1 פֿון $2 ×ויף $3',
-'rightslogentry-autopromote' => '×ויט×מ×טיש פר×מ×ווירט פון $2 צו $3',
-'rightsnone' => '(×’×רנישט)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'ליינען ×“×¢× ×‘×œ×ַט',
@@ -1704,6 +1722,7 @@ $1",
'backend-fail-notexists' => 'נישט פֿ×ר×ן די טעקע $1.',
'backend-fail-invalidpath' => '$1 ××™×– נישט קיין גילטיקער שפייכלערן שטעג.',
'backend-fail-delete' => 'קען נישט ×ויסמעקן טעקע $1.',
+'backend-fail-describe' => 'קען נישט ענדערן מעט×ד×טן פ×ר דער טעקע "$1".',
'backend-fail-alreadyexists' => 'די טעקע $1 עקזיסטירט שוין.',
'backend-fail-store' => "מ'קען נישט שפייכלערן טעקע $1 בײַ $2.",
'backend-fail-copy' => '×”×ט נישט געקענט ק×פירן "$1" צו "$2".',
@@ -1897,6 +1916,9 @@ $1",
'disambiguationspage' => 'Template:ב×דייטן',
'disambiguations-text' => "די קומענדיגע בלעטער פ×רבינדן צו × '''ב×דייטן בל×ט'''. ×–×™×™ ברויכן ענדערשט פֿ×רבינדן צו ×“×¢× ×¨×¢×œ×¢×•×•×נטן טעמע בל×ט.<br />× ×‘×œ×ט ווערט פ×ררעכענט פ×ר × ×‘×דײַטן בל×ט ×ויב ער ב×ניצט זיך מיט × ×ž×•×¡×˜×¢×¨ וו×ס ××™×– פ×רבינדען פון [[MediaWiki:Disambiguationspage]].",
+'pageswithprop-prop' => '×ייגנש×פט × ×מען:',
+'pageswithprop-submit' => 'גייט',
+
'doubleredirects' => 'געט×פלטע ווײַטערפֿירונגען',
'doubleredirectstext' => 'דער בל×ט רעכנט ×ויס בלעטער וו×ס פירן ווייטער צו ×נדערע ווייטערפירן בלעטער.
יעדע שורה ×נטה×לט × ×œ×™× ×§ ×¦×•× ×¢×¨×©×˜×Ÿ ×ון צווייטן ווייטערפירונג, ווי ×ויך די ציל פון דער צווייטער ווייטערפירונג, וו×ס רוב מ×ל געפינט זיך די ריכטיגע ציל וו×ו די ערשטע ווייטערפירונג ×–×ל ווייזן.
@@ -2062,10 +2084,6 @@ $1",
'activeusers-hidesysops' => 'ב×Ö·×”×ַלטן סיס×פן',
'activeusers-noresult' => 'קיין ב×ניצער נישט געטר×פֿן.',
-# Special:Log/newusers
-'newuserlogpage' => '× ×™×™×¢ ב×ַניצערס ל×ָג-בוך',
-'newuserlogpagetext' => 'ד×ס ××™×– × ×œ××’ פון ב×ַניצערס ×ײַנשרײַבונגען.',
-
# Special:ListGroupRights
'listgrouprights' => 'ב×ַניצער גרופע רעכטן',
'listgrouprights-summary' => "פֿ×לגנד ××™×– × ×¨×©×™×ž×” פֿון ב×ַניצער גרופעס דעפֿינירט ×ויף דער ד×ָזיקער וויקי, מיט זײַערע ×ַס×צי×ירטע צוטריט רעכטן.
@@ -2162,19 +2180,23 @@ $1",
'enotif_mailer' => '× ×טיפ×ק×ציע שיקער {{SITENAME}}',
'enotif_reset' => 'ב×ַצייכענען ×לע בלעטער שוין געזען',
-'enotif_newpagetext' => 'ד×ס ××™×– × × ×™×™×¢×¨ בל×ט.',
'enotif_impersonal_salutation' => '{{SITENAME}} ב×ַניצער',
-'changed' => 'געטוישט',
-'created' => 'געש×ַפֿן',
-'enotif_subject' => 'דער בל×ט $PAGETITLE ×ין {{SITENAME}} $CHANGEDORCREATED דורך $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}} בל×ט $1 ××™×– ×ויסגעמעקט געוו×רן דורך {{gender:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}} בל×ט $1 ××™×– געש×פן געוו×רן דורך {{gender:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}} בל×ט $1 ××™×– בג×וועגט געוו×רן דורך {{gender:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}} בל×ט $1 ××™×– צוריקגעשטעלט געוו×רן דורך {{gender:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}} בל×ט $1 ××™×– געענדערט געוו×רן דורך {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'דער {{SITENAME}} בל×ט $1 ××™×– ×ויסגעמעקט געוו×רן ××•× $PAGEEDITDATE דורך {{gender:$2|$2}}, זעט $3.',
+'enotif_body_intro_created' => 'דער {{SITENAME}} בל×ט $1 ××™×– געש×פן געוו×רן ××•× $PAGEEDITDATE דורך {{gender:$2|$2}}, זעט $3 פ×ר דער לויפיקער רעוויזיע.',
+'enotif_body_intro_moved' => 'דער {{SITENAME}} בל×ט $1 ××™×– ב×וועגט געוו×רן ××•× $PAGEEDITDATE דורך {{gender:$2|$2}}, זעט $3 פ×ר דער לויפיקער רעוויזיע.',
+'enotif_body_intro_restored' => 'דער {{SITENAME}} בל×ט $1 ××™×– צוריקגעשטעלט געוו×רן ××•× $PAGEEDITDATE דורך {{gender:$2|$2}}, זעט $3 פ×ר דער לויפיקער רעוויזיע.',
+'enotif_body_intro_changed' => 'דער {{SITENAME}} בל×ט $1 ××™×– געענדערט געוו×רן ××•× $PAGEEDITDATE דורך {{gender:$2|$2}}, זעט $3 פ×ר דער לויפיקער רעוויזיע.',
'enotif_lastvisited' => 'זעט $1 פֿ×ַר ×לע ענדערונגען זינט ×ײַער לעצטן וויזיט.',
'enotif_lastdiff' => 'זעט $1 פ×ר דער ענדערונג.',
'enotif_anon_editor' => '×Ö·× ×נימער ב×ַניצער $1',
'enotif_body' => 'טײַערער $WATCHINGUSERNAME,
-דער {{SITENAME}} בל×ט $PAGETITLE ××™×– געוו×רן $CHANGEDORCREATED ××•× $PAGEEDITDATE דורך $PAGEEDITOR, זעט $PAGETITLE_URL פ×ר דער ×יצטיגער ווערסיע.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
ענדערערס קורץ וו×רט: $PAGESUMMARY $PAGEMINOREDIT
@@ -2184,10 +2206,13 @@ $NEWPAGE
עס וועט מער נישט זיין קיין מעלדונגען ×ין פ×ל פון × ×ך ענדערונגען × ×ר ×ויב ×יר וועט ב×זוכן ×“×¢× ×‘×œ×ט.
×יר קענט ×ויך צוריקשטעלן די מעלדונגען פ×נען פון ×לע ×ייערע ×ויפֿגעפ×סטע בלעטער ×ין ×ייער ×ויפפ×סונג ליסטע.
-
+
×ייער פֿריינטליכע {{SITENAME}} מעלדונגען סיסטע×
--
+צו ענדערן ×ייער ע־פ×סט × ×טיפיק×ציע שטעלונגען, ב×זוכט
+{{canonicalurl:{{#special:Preferences}}}}
+
צו ענדערן ×ייער ×ויפֿפ×סונג ליסטע, ב×זוכט
{{canonicalurl:{{#special:EditWatchlist}}}}
@@ -2196,6 +2221,8 @@ $UNWATCHURL
פ×ר מער הילף:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'געש×ַפֿן',
+'changed' => 'געטוישט',
# Delete
'deletepage' => 'מעק ×ויס בל×ט',
@@ -2263,6 +2290,7 @@ $UNWATCHURL
'prot_1movedto2' => '[[$1]] ×ריבערגעפירט צו [[$2]]',
'protect-badnamespace-title' => '×ומשיצב×רער × ×מענטייל',
'protect-badnamespace-text' => 'בלעטער ×ין ×“×¢× × ×מענטייל קען מען נישט שיצן.',
+'protect-norestrictiontypes-title' => 'נישט־שיצב×רער בל×ט',
'protect-legend' => 'ב×ַשטעטיגן שיץ',
'protectcomment' => '×ורז×ַך:',
'protectexpiry' => 'גייט ×ויס:',
@@ -2345,7 +2373,7 @@ $UNWATCHURL
'undeletedrevisions' => '{{PLURAL:$1|1 רעוויזיע|$1 רעוויזיעס}} צוריקגעשטעלט',
'undeletedrevisions-files' => '{{PLURAL:$1|1 רעוויזיע|$1 רעוויזיעס}} ×ון {{PLURAL:$2|1 טעקע|$2 טעקעס}} צוריקגעשטעלט',
'undeletedfiles' => '{{PLURAL:$1|1 טעקע|$1 טעקעס}} צוריקגעשטעלט',
-'cannotundelete' => 'צוריקשטעלונג ××™×– דורכגעפ×לן; עס ××™×– מעגליך ××– ×ן ×נדערע ×”×ט ד×ס שוין צוריקגעשטעלט.',
+'cannotundelete' => 'צוריקשטעלונג ××™×– דורכגעפ×לן: $1',
'undeletedpage' => "'''דער בל×ט $1 ××™×– געוו×רן צוריקגעשטעלט.'''
זעט ×“×¢× [[Special:Log/delete| ×ויסמעקן ל××’]] פֿ×ר × ×œ×™×¡×˜×¢ פון די לעצטע ×ויסגעמעקטע ×ון צוריקגעשטעלטע בלעטער.",
@@ -2373,7 +2401,7 @@ $1',
'blanknamespace' => '(הויפט)',
# Contributions
-'contributions' => "ב×ניצער'ס בײַשטײַערונגען",
+'contributions' => '{{GENDER:$1|ב×ניצער}} בײַשטײַערונגען',
'contributions-title' => 'בײַשטײַערונגען פֿון ב×ַניצער $1',
'mycontris' => 'בײַשטײַערונגען',
'contribsub2' => 'וועגן $1 ($2)',
@@ -2776,7 +2804,6 @@ $1',
# JavaScriptTest
'javascripttest' => 'JavaScript טעסט',
-'javascripttest-disabled' => 'די פֿונקציע ××™×– ×ומ×ַקטיווירט ×ין דער ד×זיקער וויקי.',
'javascripttest-title' => 'דורכפירנדיק $1 בדיקות',
'javascripttest-pagetext-noframework' => ' דער בל×ט ××™×– רעזערווירט פ×ר JavaScript. פרו×וון.',
'javascripttest-pagetext-skins' => 'קלויבט × ×‘×ניצער־×ייבערפל×ך מיט וו×ס דורכצופירן די בדיקות:',
@@ -2900,11 +2927,13 @@ $1',
'pageinfo-default-sort' => 'גרונט ס×רטירן שליסל',
'pageinfo-length' => 'בל×ט לענג (×ין בייטן)',
'pageinfo-article-id' => 'בל×ט נומער',
+'pageinfo-language' => 'בל×ט ××™× ×”×לט שפר×ך',
'pageinfo-robot-policy' => 'זוכמ×שין סט×טוס',
'pageinfo-robot-index' => '×ינדעקסירב×ר',
'pageinfo-robot-noindex' => 'נישט ×ינדעקסירב×ר',
'pageinfo-views' => 'צ×ַל קוקן',
'pageinfo-watchers' => '!צ×ָל בל×ט ×ויפֿפ×ַסער',
+'pageinfo-few-watchers' => 'ווינציקער ווי $1 {{PLURAL:$1|×ויפֿפ×סער}}',
'pageinfo-redirects-name' => 'ווײַטערפירונגען צו ×“×¢× ×‘×œ×ט',
'pageinfo-subpages-name' => '×ונטערבלעטער פון ×“×¢× ×‘×œ×ט',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ווײַטערפירונג|ווײַטערפירונגען}}; $3 {{PLURAL:$3|×¡×ª× ×‘×œ×ט|×¡×ª× ×‘×œ×¢×˜×¢×¨}})',
@@ -2919,6 +2948,19 @@ $1',
'pageinfo-magic-words' => '{{PLURAL:$1|מ×גיש וו×רט|מ×גישע ווערטער}} ($1)',
'pageinfo-hidden-categories' => 'ב××”×לטענע {{PLURAL:$1|ק×טעג×ריע|ק×טעג×ריעס}} ($1)',
'pageinfo-templates' => ' {{PLURAL:$1|×ריבערגעשל×סענער מוסטער|×ריבערגשל×סענע מוסטערן}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|בל×ט|בלעטער}} ×ריבעגעשל×סן ×ויף ($1)',
+'pageinfo-toolboxlink' => 'בל×ַט־×ינפֿ×רמ×ַציע',
+'pageinfo-redirectsto' => 'פירט ווײַטער צו',
+'pageinfo-redirectsto-info' => '×ינפֿ×רמ×ַציע',
+'pageinfo-contentpage' => 'געציילט ווי ×ן ××™× ×”×לט בל×ט',
+'pageinfo-contentpage-yes' => '×™×Ö¸',
+'pageinfo-protect-cascading' => 'שיצונגען ק×סק×דירן פון ד×נעט',
+'pageinfo-protect-cascading-yes' => '×™×Ö¸',
+'pageinfo-protect-cascading-from' => 'שיצונגען ק×סק×דירן פון',
+'pageinfo-category-info' => 'ק×טעג×ריע ×ינפ×רמ×ציע',
+'pageinfo-category-pages' => 'צ×ָל בלעטער',
+'pageinfo-category-subcats' => 'צ×ָל ×ונטערק×טעג×ריעס',
+'pageinfo-category-files' => 'צ×ָל טעקעס',
# Skin names
'skinname-standard' => 'קל×סיש',
@@ -2941,6 +2983,8 @@ $1',
'markedaspatrollederror' => 'נישט מעגלעך צו צייכענען ×לס פ×ַטר×לירט',
'markedaspatrollederrortext' => '×יר ד×רפֿט ספעציפֿירן × ×•×•×¢×¨×–×™×¢ צו ב×ַצייכענען ×לס פ×ַטר×לירט.',
'markedaspatrollederror-noautopatrol' => '×יר ט×ר נישט ב×ַצייכענען די ××™×™×’×¢× ×¢ ענדערונגען ×לס פ×ַטר×לירט.',
+'markedaspatrollednotify' => 'די ענדערונג צו $1 ××™×– געוו×רן מ×רקירט ווי ק×נטר×לירט.',
+'markedaspatrollederrornotify' => 'מ×רקירן ווי ק×נטר×לירט דורכגעפ×לן.',
# Patrol log
'patrol-log-page' => 'פ×טר×לירן ל××’-בוך',
@@ -2974,6 +3018,7 @@ $1',
'file-info-size-pages' => '$1 × $2 פיקסעלן, טעקע גרייס: $3, MIME טיפ: $4, $5 {{PLURAL:$5|בל×ט|בלעטער}}',
'file-nohires' => '× ×™×©×˜× ×ž×™×˜ × ×”×¢×›×¢×¨×¢×¨ רעז×לוציע.',
'svg-long-desc' => 'טעקע SVG, × ×מינעל: $1 × $2 פיקסעלן, טעקע גרייס: $3',
+'svg-long-error' => '×ומגילטיקע SVG טעקע: $1',
'show-big-image' => 'בילד מיט דער גרעסטער רעז×לוציע',
'show-big-image-preview' => 'גרייס פון ×“×¢× ×¤×רויסקוק: $1.',
'show-big-image-other' => '{{PLURAL:$2|×נדער רעז×לוציע|×נדערע רעז×לוציעס}}: $1.',
@@ -3004,7 +3049,10 @@ $1',
'minutes' => '{{PLURAL:$1|$1 מינוט|$1 מינוט}}',
'hours' => '{{PLURAL:$1|$1 שעה|$1 שעה}}',
'days' => '{{PLURAL:$1|$1 ט××’|$1 טעג}}',
+'months' => '{{PLURAL:$1|×יין מ×× ×ַט|$1 מ×× ×ַטן}}',
+'years' => '{{PLURAL:$1|×יין ×™×ָר|$1 ×™×ָר}}',
'ago' => 'פֿ×ַר $1',
+'just-now' => 'גר×דע יעצט',
# Bad image list
'bad_image_list' => 'דער פֿ×ָרמ×ַט ××™×– ×°×™ פֿ×ָלגנדיק:
@@ -3565,6 +3613,7 @@ $5
'version-version' => '(ווערסיע $1)',
'version-license' => 'ליצענץ',
'version-poweredby-others' => '×ַנדערע',
+'version-credits-summary' => 'מיר ווילן ×נערקענען די פֿ×לגנדע מענטשן פֿ×ר זייער בײַשטײַערוג צו [[Special:Version|מעדיעוויקי]].',
'version-software' => '×ינסט×ַלירט ווייכוו×ַרג',
'version-software-product' => 'פר×דוקט',
'version-software-version' => 'ווערסיע',
@@ -3669,17 +3718,17 @@ $5
'sqlite-no-fts' => '$1 ×ָן פֿולן-טעקסט זוכן שטיץ',
# New logging system
-'logentry-delete-delete' => '$1 ×”×ט ×ויסגעמעקט בל×ט $3',
-'logentry-delete-restore' => '$1 ×”×ט צוריקגעשטעלט בל×ט $3',
-'logentry-delete-event' => '$1 ×”×ט געענדערט די זעב×רקייט פון {{PLURAL:$5|× ×œ×גבוך ×קטיוויטעט|$5 ל×גבוך ×קטיוויטעטן}} ×ויף $3: $4',
-'logentry-delete-revision' => '$1 ×”×ט געענדערט די זעב×רקייט פון {{PLURAL:$5|× ×¨×¢×•×•×™×–×™×¢|$5 רעוויזיעס}} ×ויף בל×ט $3: $4',
-'logentry-delete-event-legacy' => '$1 ×”×ט געענדערט די זעב×רקייט פון ל×גבוך ×קטיוויטעטן ×ויף $3',
-'logentry-delete-revision-legacy' => '$1 ×”×ט געענדערט די זעב×רקייט פון רעוויזיעס ×ויף בל×ט $3',
-'logentry-suppress-delete' => '$1 ×”×ט ×ונטערדריקט בל×ט $3',
-'logentry-suppress-event' => '$1 ×”×ט געהיימלעך געענדערט די זעב×רקייט פון {{PLURAL:$5|× ×œ×גבוך ×קטיוויטעט|$5 ל×גבוך ×קטיוויטעטן}} ×ויף $3: $4',
-'logentry-suppress-revision' => '$1 ×”×ט געהיימלעך געענדערט די זעב×רקייט פון {{PLURAL:$5|× ×¨×¢×•×•×™×–×™×¢|$5 רעוויזיעס}} ×ויף בל×ט $3: $4',
-'logentry-suppress-event-legacy' => '$1 ×”×ט געהיימלעך געענדערט די זעב×רקייט פון ל×גבוך ×קטיוויטעטן ×ויף $3',
-'logentry-suppress-revision-legacy' => '$1 ×”×ט געהיימלעך געענדערט די זעב×רקייט פון רעוויזיעס ×ויף בל×ט $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|×”×ט ×ויסגעמעקט}} בל×ט $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|×”×ט צוריקגעשטעלט }} בל×ט $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|×”×ט געענדערט}} די זעב×רקייט פון {{PLURAL:$5|× ×œ×גבוך ×קטיוויטעט|$5 ל×גבוך ×קטיוויטעטן}} ×ויף $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|×”×ט געענדערט}} די זעב×רקייט פון {{PLURAL:$5|× ×¨×¢×•×•×™×–×™×¢|$5 רעוויזיעס}} ×ויף בל×ט $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|×”×ט געענדערט}} די זעב×רקייט פון ל×גבוך ×קטיוויטעטן ×ויף $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|×”×ט געענדערט}} די זעב×רקייט פון רעוויזיעס ×ויף בל×ט $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|×”×ט ×ונטערדריקט}} בל×ט $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|×”×ט געהיימלעך געענדערט}} די זעב×רקייט פון {{PLURAL:$5|× ×œ×גבוך ×קטיוויטעט|$5 ל×גבוך ×קטיוויטעטן}} ×ויף $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|×”×ט געהיימלעך געענדערט}} די זעב×רקייט פון {{PLURAL:$5|× ×¨×¢×•×•×™×–×™×¢|$5 רעוויזיעס}} ×ויף בל×ט $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|×”×ט געהיימלעך געענדערט}} די זעב×רקייט פון ל×גבוך ×קטיוויטעטן ×ויף $3',
+'logentry-suppress-revision-legacy' => '!$1 {{GENDER:$2|×”×ט געהיימלעך געענדערט}} די זעב×רקייט פון רעוויזיעס ×ויף בל×ט $3',
'revdelete-content-hid' => '××™× ×”×לט פ×רהוילן',
'revdelete-summary-hid' => 'רעד×קטירונג ק×נספעקט פ×רהוילן',
'revdelete-uname-hid' => 'ב×ניצער־נ×מען פ×רהוילן',
@@ -3688,17 +3737,21 @@ $5
'revdelete-uname-unhid' => 'ב×ַניצער × ×ָמען ×רויסגעגעבן',
'revdelete-restricted' => 'צוגעלייגט ב×גרעניצונגען פ×ר סיס×פן',
'revdelete-unrestricted' => '×וועקגענומען ב×גרעניצונגען פ×ר סיס×פן',
-'logentry-move-move' => '$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-patrol-patrol' => '$1 ×”×ט מ×רקירט רעוויזיע $4 פון בל×ט $3 ווי ק×נטר×לירט',
-'logentry-patrol-patrol-auto' => '$1 ×”×ט ×ויט×מ×טיש מ×רקירט רעוויזיע $4 פון בל×ט $3 ווי ק×נטר×לירט',
-'logentry-newusers-newusers' => 'ב×ניצער ק×נטע $1 געש×פן געוו×רן',
-'logentry-newusers-create' => 'ב×ניצער ק×נטע $1 געש×פן געוו×רן',
-'logentry-newusers-create2' => 'ב×ניצער ק×נטע $1 געש×פן געוו×רן דורך $3',
-'logentry-newusers-autocreate' => 'ק×נטע $1 ב×ש×פן ×ויט×מ×טיש',
-'newuserlog-byemail' => 'פ×ַסוו×רט געשיקט דורך ×¢-פ×סט',
+'logentry-move-move' => '$1 {{GENDER:$2|×”×ט ב×וועגט}} בל×ט $3 צו $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|×”×ט ב×וועגט}} בל×ט $3 צו $4 ×ן ל×זן × ×•×•×™×™×˜×¢×¨×¤×™×¨×•× ×’',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|×”×ט ב×וועגט}} $3 צו $4 ×ריבער ווייטערפירונג',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|×”×ט ב×וועגט}} $3 צו $4 ×ריבער × ×•×•×™×™×˜×¢×¨×¤×™×¨×•× ×’ ×ן ל×זן × ×•×•×™×™×˜×¢×¨×¤×™×¨×•× ×’',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|×”×ט מ×רקירט}} רעוויזיע $4 פון בל×ט $3 ווי ק×נטר×לירט',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|×”×ט ×ויט×מ×טיש מ×רקירט}} רעוויזיע $4 פון בל×ט $3 ווי ק×נטר×לירט',
+'logentry-newusers-newusers' => 'ב×ניצער ק×נטע $1 ××™×– {{GENDER:$2|געש×פן געוו×רן}}',
+'logentry-newusers-create' => 'ב×ניצער ק×נטע $1 ××™×– {{GENDER:$2|געש×פן געוו×רן}}',
+'logentry-newusers-create2' => 'ב×ניצער ק×נטע $1 ××™×– {{GENDER:$2|געש×פן געוו×רן}} דורך $3',
+'logentry-newusers-byemail' => 'ב×ניצער ק×נטע $3 ××™×– {{GENDER:$2|געש×פן געוו×רן}} דורך $1 ×ון ד×ס פ×סוו×רט ××™×– געשיקט געוו×רט דורך ע־פ×סט',
+'logentry-newusers-autocreate' => 'ב×ַניצער ק×נטע $1 {{GENDER:$2|געש×פן}} ×ויט×מ×טיש',
+'logentry-rights-rights' => '$1 ×”×ט {{GENDER:$2|געביטן}} גרופע מיטגלידערש×ַפֿט פֿ×ַר $3 פֿון $4 ×ויף $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|×”×ט געביטן}} גרופע מיטגלידערש×פט פ×ר $3',
+'logentry-rights-autopromote' => '$1 ×ויט×מ×טיש {{GENDER:$2|פר×מ×ווירט}} פון $4 צו $5',
+'rightsnone' => '(×’×רנישט)',
# Feedback
'feedback-bugornote' => 'ווען ×יר זענט גרייט צו ב×שרייבן × ×˜×¢×›× ×™×©×Ÿ פר××‘×œ×¢× ×‘×™×˜×¢ [$1 מעלדט × ×¤×¢×œ×¢×¨].
@@ -3752,6 +3805,7 @@ $5
'api-error-ok-but-empty' => '×ינערלעכער גרײַז: קיין ענטפֿער פֿון סערווירער.',
'api-error-overwrite' => 'מען ט×ָר נישט ×יבערשרײַבן ×ַן עקזיסטירנדע טעקע.',
'api-error-stashfailed' => '×ינערלעכער גרײַז: סערווירער ×”×ט נישט געקענט ×ײַנשפייכלערן צייַטווייַליקע טעקע.',
+'api-error-publishfailed' => '×ינערלעכער גרײַז: סערווירער ×”×ט נישט געזד×נזשעט פ×רעפנטלעכן צייַטווייַליקע טעקע.',
'api-error-timeout' => 'דער סערווירער ×”×ט ניט געענטפֿערט ×ינערה×ַלב דער דערוו×ַרטעטער צייַט.',
'api-error-unclassified' => '×ַן ×ומב×ַק×ַנט טעות ××™×– פֿ×רגעקומען.',
'api-error-unknown-code' => '×ומב×ַק×ַנט טעות: " $1 "',
@@ -3772,4 +3826,7 @@ $5
'duration-centuries' => '$1 {{PLURAL:$1|×™×רהונדערט|×™×רהונדערטער}}',
'duration-millennia' => '$1 {{PLURAL:$1|×™×רטויזנט|×™×רטויזנטער}}',
+# Image rotation
+'rotate-comment' => 'בילד געדרייט דורך $1 {{PLURAL:$1|גר×ד}} זייגערווייז',
+
);
diff --git a/languages/messages/MessagesYo.php b/languages/messages/MessagesYo.php
index dff13743..b77e841f 100644
--- a/languages/messages/MessagesYo.php
+++ b/languages/messages/MessagesYo.php
@@ -186,6 +186,7 @@ $messages = array(
'newwindow' => '(yíò sí nínú fèrèsè tuntun)',
'cancel' => 'Fagilé',
'moredotdotdot' => 'Ẹ̀kúnrẹÌrẹÌ...',
+'morenotlisted' => 'Àtòjá» kíkúnrẹÌráº¹Ì kò sí...',
'mypage' => 'Ojúewé',
'mytalk' => 'Ọ̀rá»Ì€',
'anontalk' => 'Ọ̀rá»Ì€ fún IP yí',
@@ -197,7 +198,6 @@ $messages = array(
'qbbrowse' => 'Ìṣíwò',
'qbedit' => 'Àtúnṣe',
'qbpageoptions' => 'Ojúewé yi',
-'qbpageinfo' => 'Àjá»wípá»Ì€',
'qbmyoptions' => 'Àwá»n ojúewé mi',
'qbspecialpages' => 'Àwá»n ojúewé pàtàkì',
'faq' => 'FAQ',
@@ -220,6 +220,7 @@ $messages = array(
'namespaces' => 'Àwá»n orúká»Ã yè',
'variants' => 'Àwá»n oriá¹£iríṣi',
+'navigation-heading' => 'Ètò ìtá»Ìsá»Ìnà',
'errorpagetitle' => 'Àsìṣe',
'returnto' => 'Padà sí $1.',
'tagline' => "Lát'á»wá»Ì {{SITENAME}}",
@@ -461,12 +462,11 @@ Olùṣeàmójútó tó típa ṣe àlàyé yìí: "$3".',
# Login and logout pages
'logouttext' => "'''Ẹ ti bá»Ìsá»Ìde.'''
-Ẹ le tẹ̀síwájú sí ní lo {{SITENAME}} láìmorúká» yín, tàbí kí ẹ [[Special:UserLogin|padà wá»lé]] bí ẹnikanan tàbí ẹlòmíràn.
+Ẹ le tẹ̀síwájú sí ní lo {{SITENAME}} láìmorúká» yín, tàbí kí ẹ <span class='plainlinks'>[$1 padà wá»lé]</span> bí ẹnikanan tàbí ẹlòmíràn.
Àkíyèsí wípé àwá»n ojúewé kan le hàn b'ígbà tójẹÌpé ẹ sì wá»lé títí tí ẹ ó fi já»Ì€wá»Ì cache browser yín.",
-'welcomecreation' => "== Ẹ kú àbá»Ì€, $1! ==
-
-A ti á¹£'èdá àpamá»Ì yín.
-Ẹ má»Ì gbàgbé l'áti á¹£'àtúná¹£e àwá»n [[Special:Preferences|{{SITENAME}} ìfẹÌràn]] yín.",
+'welcomeuser' => 'Ẹ kú àbá»Ì€, $1!',
+'welcomecreation-msg' => "A ti á¹£'èdá àpamá»Ì yín.
+Ẹ má»Ì gbàgbé l'áti á¹£'àtúná¹£e [[Special:Preferences|{{SITENAME}} àwá»n ìfẹÌràn]] yín.",
'yourname' => 'OrúkỠoníṣe:',
'yourpassword' => 'Ọ̀rá»Ì€Ã¬pamá»Ì:',
'yourpasswordagain' => 'Ká» á»Ì€rá»Ì€Ã¬pamá»Ì lẹÌẹ̀kansí:',
@@ -489,7 +489,7 @@ A ti á¹£'èdá àpamá»Ì yín.
'gotaccount' => "Ṣé ẹ ti ní àpamá»Ì tẹÌlẹ̀? '''$1'''.",
'gotaccountlink' => "Ẹ w'á»lé",
'userlogin-resetlink' => 'À bí ẹ gbàgbé ìwá»lé yín?',
-'createaccountmail' => 'pẹ̀lú e-mail',
+'createaccountmail' => 'Lo á»Ì€rá»Ì€Ã¬pamá»Ì àrìnnàkò ìgbàdíẹ̀ ná, kí o sì fi ránsáº¹Ì sí àdírẹ̀sì email tó wà nísàlẹ̀',
'createaccountreason' => 'Ìdíẹ̀:',
'badretype' => 'Àwá»n á»Ì€rá»Ì€Ã¬pamá»Ì tí ẹ ká» kò já» ra wá»n.',
'userexists' => 'Orúká» oníṣe tí ẹ mú wà lá»Ìwá»Ì ẹlòmíràn.
@@ -569,6 +569,7 @@ E-mail kankan kò ní jáº¹Ì fífiráná¹£áº¹Ì fún ìkankan nínú àwá»n ìnÃ
# Email sending
'php-mail-error-unknown' => 'Àsìṣe àìmá»Ì€ nínú ìgbéṣe mail() ti PHP',
'user-mail-no-addy' => 'Ó fáº¹Ì fi e-mail ráná¹£áº¹Ì láìsí àdírẹÌsì e-mail.',
+'user-mail-no-body' => 'Ã’ fáº¹Ì fi email tí kò ní á»Ì€rá»Ì€ kankan nínú ránsẹÌ.',
# Change password dialog
'resetpass' => 'ÃŒyípadà á»Ì€rá»Ì€Ã¬pamá»Ì',
@@ -626,6 +627,7 @@ $2
'changeemail-oldemail' => 'Àdírẹ̀sì E-mail ìsinsìnyí:',
'changeemail-newemail' => 'Àdírẹ̀sì E-mail tuntun:',
'changeemail-none' => '(kòsí)',
+'changeemail-password' => 'Ọ̀rá»Ì€Ã¬pamá»Ì {{SITENAME}} yín:',
'changeemail-submit' => 'Ìyípadà E-mail',
'changeemail-cancel' => 'Fagilé',
@@ -815,7 +817,6 @@ Olùmójútó tó tìípadé ṣe àlàyé yìí: $1",
'template-protected' => '(aláàbò)',
'template-semiprotected' => '(aláàbò díẹ̀)',
'hiddencategories' => 'Ojúewé yìí jáº¹Ì Ã¬kan nínú {{PLURAL:$1|ẹ̀ka bíbòmá»Ìlẹ̀ 1|àwá»n ẹ̀ka bíbòmá»Ìlẹ̀ $1}}:',
-'nocreatetitle' => 'Ìdènà ìdá ojúewé',
'nocreatetext' => "{{SITENAME}} ti pààlà ààyè láti ṣ'èdá ojúewé tuntun.
Ẹ le padà sẹÌyìn kí ẹ á¹£'àtúná¹£e ojúewé tó wà, tàbí [[Special:UserLogin|kí ẹ wá»lé tàbí kí ẹ á¹£'èdá àpamá»Ì]].",
'nocreate-loggedin' => "Ẹ kò ní ìyá»Ì€nda láti á¹£e'dá ojúewé tuntun.",
@@ -840,6 +841,15 @@ Kò ṣe àlàyé kankan.',
'edit-already-exists' => "A kò le è ṣè'dá ojúewé tuntun.
Ó pilẹ̀ ti wà.",
'defaultmessagetext' => 'ÃŒkỠìráná¹£áº¹Ì Ã tìbẹ̀rẹ̀',
+'content-failed-to-parse' => 'Ìkùnà láti ṣàtúwò àkóónú $2 fún àfijúwe $1: $3',
+'invalid-content-data' => 'Àkóónú dátà tí kò yẹ',
+'content-not-allowed-here' => 'Àkóónú "$1" kò ní ìyá»Ì€nda lórí ojúewé [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'ìká»Ì€rá»Ì€ wiki',
+'content-model-text' => 'ìká»Ì€rá»Ì€ kedere',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => "'''ÃŒkìlá»Ì€:''' Ojúewé yìí ní àwá»n ìpè olùtúwò ìmúṣe adíyelélórí tó pá»Ì€ ju bóṣeyẹlá».
@@ -1209,9 +1219,9 @@ Kò ní á¹£eé dápadà má»Ì.',
'prefs-emailconfirm-label' => 'E-mail ìmúdájú:',
'prefs-textboxsize' => 'Ìtóbi fèrèsé àtúnṣe',
'youremail' => 'E-mail:',
-'username' => 'OrúkỠoníṣe:',
-'uid' => 'Ná»mba ìdámá»Ì€ fún oníṣe:',
-'prefs-memberingroups' => 'Ọ̀kan nínú {{PLURAL:$1|ẹgbẹÌ|àwá»n ẹgbẹÌ}}:',
+'username' => '{{GENDER:$1|OrúkỠoníṣe}}:',
+'uid' => 'Ná»mba ìdámá»Ì€ {{GENDER:$1|oníṣe}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Ọ̀kan}} nínú {{PLURAL:$1|ẹgbẹÌ|àwá»n ẹgbẹÌ}}:',
'prefs-registration' => 'Àsìkò ìforúká»sílẹÌ:',
'yourrealname' => 'OrúkỠganangan:',
'yourlanguage' => 'Èdè:',
@@ -1363,12 +1373,13 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iá¹£áº¹Ì yín fún yín.',
'right-sendemail' => 'Fi e-mail ráná¹£áº¹Ì sí àwá»n oníṣe míràn',
'right-passwordreset' => 'ÃŒwo àwá»n e-mail fún ìtúntò á»Ì€rá»Ì€Ã¬pamá»Ì',
+# Special:Log/newusers
+'newuserlogpage' => 'Àká»sílẹ̀ ìdá oníṣe',
+'newuserlogpagetext' => 'Àká»á»Ìlẹ̀ àwá»n ìdá oníṣe nì yí.',
+
# User rights log
'rightslog' => 'Àwá»n ẹ̀tá»Ì oníṣe',
'rightslogtext' => 'Èyì ni àká»á»Ìlẹ̀ kan àwá»n àtúná¹£e sí àwá»n ẹ̀tá»Ì oníṣe.',
-'rightslogentry' => 'yí ẹgbáº¹Ì tí $1 wà kúrò láti $2 sí $3',
-'rightslogentry-autopromote' => 'jáº¹Ì gbígbéga láláraẹni láti $2 sí $3',
-'rightsnone' => '(kòsí)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => 'wo ojúewé yìí',
@@ -1606,6 +1617,7 @@ Tí ìṣòro náà ò bá jáwá»Ì, ẹ bẹ [[Special:ListUsers/sysop|olùmó
'backend-fail-notsame' => 'Fáìlì aláìjá»ra kan pilẹ̀ ti wà ní $1.',
'backend-fail-invalidpath' => '$1 kìí á¹£e ojúá»Ì€nà ibi-ìkópamá»Ì oníìbámu.',
'backend-fail-delete' => 'ÃŒparáº¹Ì fáìlì $1 kò á¹£e é á¹£e.',
+'backend-fail-describe' => 'Kò le yí metadátà padà fún fáìlì "$1".',
'backend-fail-alreadyexists' => 'Fáìlì $1 pilẹ̀ ti wà.',
'backend-fail-store' => 'Kò le á¹£e ìkópamá»Ì fáìlì $1 sí $2.',
'backend-fail-copy' => 'ÀwòkỠfaili $1 sí $2 kò ṣe é ṣe.',
@@ -1994,6 +2006,9 @@ Bákannáà ẹ wo [[Special:WantedCategories|àwá»n ẹ̀ka wíwá]].',
'linksearch-pat' => 'Ọ̀nà àwáàrí:',
'linksearch-ns' => 'Orúká»Ã yè:',
'linksearch-ok' => 'Ṣàwárí',
+'linksearch-text' => 'Àwá»n á»Ì€rá»Ì€ àfiwá bíi "*.wikipedia.org" le á¹£e é lò.
+Orúká» ibiàyè pá»ndandan, fún àpẹrẹ "*.org".<br />
+{{PLURAL:$2|Prótókólù|Àwá»n prótókólù}} tí a ṣàtìlẹÌyìn fún: <code>$1</code> (yíó bẹ̀rẹ̀ pẹ̀lú http:// tí prótókólù kankan kò bá jáº¹Ì títá»Ìkasí).',
'linksearch-line' => '$1 jáº¹Ì jíjápá»Ì€ láti $2',
'linksearch-error' => 'Àwá»n á»Ì€rá»Ì€ àfiwá le hàn ní ìbẹ̀rẹ̀ orúká» ibiìtakùn (hostname) nìkan.',
@@ -2012,10 +2027,6 @@ Bákannáà ẹ wo [[Special:WantedCategories|àwá»n ẹ̀ka wíwá]].',
'activeusers-hidesysops' => 'ÃŒbòmá»Ìlẹ̀ àwá»n olùmójútó',
'activeusers-noresult' => 'Kò rí oníṣe kankan.',
-# Special:Log/newusers
-'newuserlogpage' => 'Àká»sílẹ̀ ìdá oníṣe',
-'newuserlogpagetext' => 'Àká»á»Ìlẹ̀ àwá»n ìdá oníṣe nì yí.',
-
# Special:ListGroupRights
'listgrouprights' => 'Àwá»n ẹ̀tá»Ì ẹgbáº¹Ì oníṣe',
'listgrouprights-summary' => 'Nísàlẹ̀ ni àtòjỠàwá»n ẹgbáº¹Ì oníṣe tó nítumá»Ì€ lórí wiki yìí, pẹ̀lú àwá»n ẹ̀tá»Ì lílò wá»n.
@@ -2110,20 +2121,23 @@ A óò á¹£\'àkójỠàwá»n àtúná¹£e á»já»Ìwajú sí ojúewé yìí àti
'enotif_mailer' => 'Olùráná¹£áº¹Ì Ã¬fitá»Ìnilétí {{SITENAME}}',
'enotif_reset' => 'Fàlà sí gbogbo àwá»n ojúewé bíi bíbẹ̀wò',
-'enotif_newpagetext' => 'Ojúewé tuntun nìyí.',
'enotif_impersonal_salutation' => 'Oníṣe {{SITENAME}}',
-'changed' => 'títúnṣẹ',
-'created' => 'dídá',
-'enotif_subject' => '$PAGEEDITOR $CHANGEDORCREATED ojúewé $PAGETITLE lórí {{SITENAME}}',
+'enotif_subject_deleted' => 'Ojúewé {{SITENAME}} tó únjáº¹Ì $1 ti jáº¹Ì píparáº¹Ì látá»wá»Ì {{gender:$2|$2}}',
+'enotif_subject_created' => 'Ojúewé {{SITENAME}} tó únjáº¹Ì $1 ti jáº¹Ì dídá látá»wá»Ì {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Ojúewé {{SITENAME}} tó únjáº¹Ì $1 ti jáº¹Ì kíkólá» látá»wá»Ì {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Ojúewé {{SITENAME}} tó únjáº¹Ì $1 ti jáº¹Ì dídápadà látá»wá»Ì {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Ojúewé {{SITENAME}} tó únjáº¹Ì $1 ti jáº¹Ì yíyípadà látá»wá»Ì {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Ojúewé {{SITENAME}} tó únjáº¹Ì $1 ti jáº¹Ì píparáº¹Ì ní $PAGEEDITDATE látá»wá»Ì {{gender:$2|$2}}, ẹ wo $3.',
+'enotif_body_intro_created' => 'Ojúewé {{SITENAME}} tó únjáº¹Ì $1 ti jáº¹Ì dídá ní $PAGEEDITDATE látá»wá»Ì {{gender:$2|$2}}, ẹ wo $3 fún àtúnyẹ̀wò ìgbàyí.',
+'enotif_body_intro_moved' => 'Ojúewé {{SITENAME}} tó únjáº¹Ì $1 ti jáº¹Ì kíkólá» ní $PAGEEDITDATE látá»wá»Ì {{gender:$2|$2}}, ẹ wo $3 fún àtúnyẹ̀wò ìgbàyí.',
+'enotif_body_intro_restored' => 'Ojúewé {{SITENAME}} tó únjáº¹Ì $1 ti jáº¹Ì dídápadà ní $PAGEEDITDATE látá»wá»Ì {{gender:$2|$2}}, ẹ wo $3 fún àtúnyẹ̀wò ìgbàyí.',
+'enotif_body_intro_changed' => 'Ojúewé {{SITENAME}} tó únjáº¹Ì $1 ti jáº¹Ì yíyípadà ní $PAGEEDITDATE látá»wá»Ì {{gender:$2|$2}}, ẹ wo $3 fún àtúnyẹ̀wò ìgbàyí.',
'enotif_lastvisited' => 'Ẹ wo $1 fún gbogbo àwá»n àtúná¹£e látìgbà ìbẹ̀wò yín gbẹ̀yìn.',
'enotif_lastdiff' => 'Ẹ wo $1 láti wo àtúnṣe yìí.',
'enotif_anon_editor' => 'oníṣe aláìlórúkỠ$1',
'enotif_body' => '$WATCHINGUSERNAME á»Ì€wá»Ìn,
-
-Ojúewé {{SITENAME}} $PAGETITLE ti jáº¹Ì $CHANGEDORCREATED lá»Ìjá»Ì $PAGEEDITDATE látá»wá»Ì $PAGEEDITOR, ẹ wo $PAGETITLE_URL fún àtúnyẹ̀wò rẹ̀ báyìí.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
Àkótán olùtúnṣe: $PAGESUMMARY $PAGEMINOREDIT
@@ -2137,7 +2151,6 @@ Kò ní sí ìfitá»Ìnilétí míràn má»Ì fún àyípadà á»já»Ìá»wájú
SístẹÌmù ìfitá»Ìnilétí {{SITENAME}} yín
---
-
Láti ṣàyípadà ìtò ìṣeàkíyèsí e-mail yín, ẹ lỠsí
{{canonicalurl:{{#special:Preferences}}}}
@@ -2149,6 +2162,8 @@ $UNWATCHURL
Fún ìrànwá»Ì àti ìbérè:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'dídá',
+'changed' => 'títúnṣẹ',
# Delete
'deletepage' => 'ÃŒparáº¹Ì ojúewé',
@@ -2305,8 +2320,8 @@ Tó bá jáº¹Ì báyìí, ẹ gbá»Ìdá»Ì€ yỠàmì ihò-àpótí tàbí kí á
'undeletedrevisions' => '{{PLURAL:$1|Àtúnyẹ̀wò 1|Àwá»n àtúnyẹ̀wò $1}} ti jáº¹Ì dídápadà',
'undeletedrevisions-files' => '{{PLURAL:$1|Àtúnyẹ̀wò 1|Àwá»n àtúnyẹ̀wò $1}} àti {{PLURAL:$2|fáìlì 1|àwá»n fáìlì $2}} ti jáº¹Ì dídápadà',
'undeletedfiles' => '{{PLURAL:$1|Fáílì 1|Àwá»n fáìlì $1}} ti jáº¹Ì dídápadà',
-'cannotundelete' => 'ÃŒdápadà ìparáº¹Ì kùnà;
-ẹlòmíràn le ti dá ìparáº¹Ì ojúewé náà padà.',
+'cannotundelete' => 'ÃŒdápadà ìparáº¹Ì kùnà:
+$1',
'undeletedpage' => "'''$1 ti jáº¹Ì dídápadà'''
Ẹ wo [[Special:Log/delete|àká»á»Ìlẹ̀ ìparẹÌ]] fún àká»pamá»Ì àwá»n ìparáº¹Ì Ã ti ìdápadà àìpẹÌ.",
@@ -2338,7 +2353,7 @@ $1',
'blanknamespace' => '(Gbangba)',
# Contributions
-'contributions' => 'Àwá»n àfikún ẹnitíná¹£e',
+'contributions' => 'Àwá»n àfikún {{GENDER:$1|oníṣe}}',
'contributions-title' => 'Àwá»n àfikún oníṣe fún $1',
'mycontris' => 'Àwá»n àfikún',
'contribsub2' => 'Fún $1 ($2)',
@@ -2614,6 +2629,7 @@ kò le yípò ojúewé padà sí ara rẹ̀.',
'immobile-target-namespace-iw' => 'Àjápá»Ì€ aláàrinwiki kò jáº¹Ì Ã fojúsùn oníìbámu fún ìyípòdà ojúewé yìí.',
'immobile-source-page' => 'Ojúewé yìí kòṣe é yínípò',
'immobile-target-page' => 'Kò le yípòpadà sí ibiàyè àká»lé hun.',
+'bad-target-model' => 'Ibi tí ẹ fáº¹Ì kó lỠúnlo àfijúwe àkóónú tó yàtá»Ì€. Kò le yí $1 sí $2.',
'imagenocrossnamespace' => 'Kò le á¹£e ìyípòdà fáìlì sí orúká»Ã yè tí kìí á¹£e ti fáìlì',
'nonfile-cannot-move-to-file' => 'Kò le yípòpadà aláìjáº¹Ì fáìlì sí orúká»Ã yè fáìlì',
'imagetypemismatch' => 'ÃŒfàgùn fáìlì tuntun kó ní ìbámu má»Ì irú rẹ̀',
@@ -2857,6 +2873,7 @@ Fáìlì náà jáº¹Ì rírùsóké ní àbá»Ì€.',
'pageinfo-default-sort' => 'Ká»Ìká»Ìrá»Ì ìtò àyàntẹÌlẹ̀',
'pageinfo-length' => 'Ìgùn ojúewé (ní iye byte)',
'pageinfo-article-id' => 'Ná»Ìmbà ìdámá»Ì€ ojúewé',
+'pageinfo-language' => 'Èdè àkóónú ojúewé',
'pageinfo-robot-policy' => 'Ipò ẹ̀rỠìṣàwárí',
'pageinfo-robot-index' => 'Ṣíṣeéwárí',
'pageinfo-robot-noindex' => 'Kò ṣeéwárí',
@@ -2876,6 +2893,16 @@ Fáìlì náà jáº¹Ì rírùsóké ní àbá»Ì€.',
'pageinfo-magic-words' => '{{PLURAL:$1|Ọ̀rá»Ì€|Àwá»n á»Ì€rá»Ì€}} májìkì ($1)',
'pageinfo-hidden-categories' => '{{PLURAL:$1|Ẹ̀ka|Àwá»n ẹ̀ka}} bíbòmá»Ìlẹ̀ ($1)',
'pageinfo-templates' => '{{PLURAL:$1|Àdàká»|Àwá»n àdàká»}} ìkópá»Ì€má»Ìra ($1)',
+'pageinfo-toolboxlink' => 'Ọ̀rá»Ì€áº¹Ì€kúnrẹÌráº¹Ì ojúewé',
+'pageinfo-redirectsto' => 'Àtúnjúwe sí',
+'pageinfo-redirectsto-info' => 'á»Ì€rá»Ì€áº¹Ì€kúnrẹ̀rẹ̀',
+'pageinfo-contentpage' => 'Kíkà bíi ojúewé àkóónú',
+'pageinfo-contentpage-yes' => 'BẹÌẹ̀ni',
+'pageinfo-protect-cascading' => 'Àbò bẹ̀rẹ̀ láti ibí',
+'pageinfo-protect-cascading-yes' => 'BẹÌẹ̀ni',
+'pageinfo-protect-cascading-from' => 'Àbò bẹ̀rẹ̀ láti',
+'pageinfo-category-pages' => 'Iye àwá»n ojúewé',
+'pageinfo-category-files' => 'Iye àwá»n fáìlì',
# Patrolling
'markaspatrolleddiff' => 'Ìṣààmí sí bíi sísá»Ì',
@@ -2887,6 +2914,8 @@ Fáìlì náà jáº¹Ì rírùsóké ní àbá»Ì€.',
'markedaspatrollederror' => 'Kò le jáº¹Ì síṣààmí sí bíi sísá»Ì',
'markedaspatrollederrortext' => 'Ẹ gbá»Ìdá»Ì€ tá»Ìka àtúnyẹ̀wò kan láti á¹£e àmì sí bíi sísá»Ì.',
'markedaspatrollederror-noautopatrol' => 'Ẹ kò ní àyè láti á¹£e àmì sí àwá»n àtúná¹£e yín bíi sísá»Ì.',
+'markedaspatrollednotify' => 'Àtúná¹£e yìí sí $1 ti jáº¹Ì síṣàmìṣí bíi sísá»Ì.',
+'markedaspatrollederrornotify' => 'ÃŒkùnà ìṣàmìsí bíi sísá»Ì.',
# Patrol log
'patrol-log-page' => 'Àká»á»Ìlẹ̀ ìsá»Ì',
@@ -2920,6 +2949,7 @@ Tí ẹ bá jáº¹Ì Ã³ á¹£iṣẹÌ, ẹ̀rá» sístẹÌmù yín le kó sí ewu.
'file-nohires' => 'Kò sí ìgbéhàn gíga jù báun lá».',
'svg-long-desc' => 'faili SVG, pẹ̀lú $1 × $2 pixels, ìtòbi faili: $3',
'svg-long-desc-animated' => 'Fáìlì SVG alámùúrìn, tó jáº¹Ì $1 × $2 pixels, ìtóbi fáìlì: $3',
+'svg-long-error' => 'Fáìlì SVG àìyẹ: $1',
'show-big-image' => 'Pẹ̀lú ìgbéhàn gíga',
'show-big-image-preview' => 'ÃŒtóbi ìká»Ìyẹ̀wò yìí: $1.',
'show-big-image-other' => '{{PLURAL:$2|ÃŒgbéhàn|Àwá»n ìgbéhàn}} míràn: $1.',
@@ -2950,6 +2980,7 @@ Tí ẹ bá jáº¹Ì Ã³ á¹£iṣẹÌ, ẹ̀rá» sístẹÌmù yín le kó sí ewu.
'hours' => '{{PLURAL:$1|wákàtí $1}}',
'days' => '{{PLURAL:$1|á»já»Ì $1}}',
'ago' => '$1 sẹÌyìn',
+'just-now' => 'nísinsìnyí',
# Bad image list
'bad_image_list' => 'Onírú jáº¹Ì gẹÌgáº¹Ì bíi àtèlé yìí:
@@ -3293,6 +3324,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[ÃŒdálẹÌkun ìjámá»Ìra interwiki]',
'scarytranscludefailed' => '[Ìmjjáde àdàkỠkùnà fún $1]',
+'scarytranscludefailed-httpstatus' => '[Ìmjjáde àdàkỠkùnà fún $1: HTTP $2]',
'scarytranscludetoolong' => '[URL ti gùn jù]',
# Delete conflict
@@ -3388,6 +3420,7 @@ $5
'version-license' => 'Ìwé àṣẹ',
'version-poweredby-credits' => "Agbára ìṣiá¹£áº¹Ì wiki yìí wá látá»wá»Ì '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'àwá»n mìíràn',
+'version-credits-summary' => 'ÃŒdùnnú wa ni láti rántí àwá»n ẹni wá»Ì€nyí fún ìdáwá»Ìlé wá»n sí [[Special:Version|MediaWiki]].',
'version-software' => 'Atòlànà ká»Ì€mpútà kíkànsínú',
'version-software-product' => 'Èso',
'version-software-version' => 'Àtẹ̀jáde',
@@ -3527,7 +3560,10 @@ Ibiìtakùn yìí únkojú ìsòro ìṣìṣẹÌẹ̀rá».',
'logentry-newusers-create' => 'Àpamá»Ì oníṣe $1 jáº¹Ì dídá',
'logentry-newusers-create2' => 'Àpamá»Ì oníṣe $3 jáº¹Ì dídá látá»wá»Ì $1',
'logentry-newusers-autocreate' => 'Àkópamá»Ì $1 jáº¹Ì dídá fúnrarẹ̀',
-'newuserlog-byemail' => 'á»Ì€rá»Ì€Ã¬pamá»Ì jáº¹Ì fífiráná¹£áº¹Ì pẹ̀lú e-mail',
+'logentry-rights-rights' => '$1 yí ìjá»ÌmỠẹgbáº¹Ì padà fún $3 láti $4 sí $5',
+'logentry-rights-rights-legacy' => '$1 yí ìjá»ÌmỠẹgbáº¹Ì padà fún $3',
+'logentry-rights-autopromote' => '$1 jáº¹Ì gbígbéga nífúnraẹni láti $4 sí $5',
+'rightsnone' => '(kòsí)',
# Feedback
'feedback-bugornote' => 'Tí ẹ bá ti á¹£etán láti ṣàlàyé ìsòrò iṣẹÌẹ̀rá»Ì lẹÌẹ̀kúnrẹÌráº¹Ì áº¹ já»Ì€wá»Ì [$1 ẹ sá» irú ìsòro náà]
diff --git a/languages/messages/MessagesYue.php b/languages/messages/MessagesYue.php
index 7ae5ea93..1d8e0df4 100644
--- a/languages/messages/MessagesYue.php
+++ b/languages/messages/MessagesYue.php
@@ -158,7 +158,6 @@ $specialPageAliases = array(
'Recentchanges' => array( '最近修改' ),
'Recentchangeslinked' => array( '外éˆä¿®æ”¹' ),
'Revisiondelete' => array( '修訂版本刪除' ),
- 'RevisionMove' => array( '修訂版本移動' ),
'Search' => array( 'æœç´¢' ),
'Shortpages' => array( '短版' ),
'Specialpages' => array( '特別é ' ),
@@ -376,7 +375,6 @@ $messages = array(
'qbbrowse' => 'ç€è¦½',
'qbedit' => '編輯',
'qbpageoptions' => '呢一é ',
-'qbpageinfo' => '附近文字',
'qbmyoptions' => '我嘅é¸é …',
'qbspecialpages' => '特別é ',
'faq' => 'FAQ',
@@ -614,11 +612,8 @@ $1',
# Login and logout pages
'logouttext' => "'''你而家已經登出咗。'''
-ä½ é‡å¯ä»¥ç”¨åŒ¿å身份用{{SITENAME}},åˆæˆ–者[[Special:UserLogin|é‡æ–°ç™»å…¥]]。
+ä½ é‡å¯ä»¥ç”¨åŒ¿å身份用{{SITENAME}},åˆæˆ–者<span class='plainlinks'>[$1 é‡æ–°ç™»å…¥]</span>。
但係留æ„æŸå•²é é¢å¯èƒ½æœƒç¹¼çºŒè©±ä½ æœªç™»å…¥ï¼Œé™¤éžç­‰ä½ æ¸…除ç€è¦½å™¨å˜…å¿«å–儲存。",
-'welcomecreation' => '== 歡迎, $1ï¼ ==
-
-你個戶å£å·²ç¶“起好。唔好唔記得去改改你嘅[[Special:Preferences|{{SITENAME}}喜好設定]]喎。',
'yourname' => '用戶å:',
'yourpassword' => '密碼:',
'yourpasswordagain' => 'å†è¼¸å…¥å¯†ç¢¼:',
@@ -885,7 +880,6 @@ $1',
'template-semiprotected' => '(åŠä¿è­·)',
'hiddencategories' => '呢一版係屬於$1個隱è—類嘅æˆå“¡:',
'edittools' => '<!-- 喺呢度嘅文字會喺編輯框下é¢åŒåŸ‹ä¸Šè¼‰è¡¨æ ¼ä¸­é¡¯ç¤ºã€‚ -->',
-'nocreatetitle' => 'é é¢å»ºç«‹è¢«é™åˆ¶',
'nocreatetext' => '{{SITENAME}}已經é™åˆ¶å’—起新版嘅能力。
ä½ å¯ä»¥ç•ªè½‰é ­åŽ»ç·¨è¼¯ä¸€å•²å·²ç¶“存在嘅é é¢ï¼Œæˆ–者[[Special:UserLogin|登入或開個新戶å£]]。',
'nocreate-loggedin' => '你並無許å¯æ¬ŠåŽ»é–‹æ–°ç‰ˆã€‚',
@@ -1398,11 +1392,13 @@ $1",
'right-override-export-depth' => '倒出包å«æœ‰äº”層深連版嘅é é¢',
'right-sendemail' => '寄電郵畀其他用戶',
+# Special:Log/newusers
+'newuserlogpage' => '使用者開戶記錄',
+'newuserlogpagetext' => '呢個係一個使用者開戶嘅日誌',
+
# User rights log
'rightslog' => '用戶權é™æ—¥èªŒ',
'rightslogtext' => '呢個係用戶權力嘅修改日誌。',
-'rightslogentry' => '已經將$1嘅組別從$2改到去$3',
-'rightsnone' => '(ç„¡)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => '讀呢版',
@@ -1952,10 +1948,6 @@ Template:æžæ¸…楚',
'activeusers-hidesysops' => 'éš±è—管ç†å“¡',
'activeusers-noresult' => 'æµå””到用戶。',
-# Special:Log/newusers
-'newuserlogpage' => '使用者開戶記錄',
-'newuserlogpagetext' => '呢個係一個使用者開戶嘅日誌',
-
# Special:ListGroupRights
'listgrouprights' => '用戶組權é™',
'listgrouprights-summary' => '下é¢ä¿‚一個響呢個wiki定義咗嘅用戶權é™ä¸€è¦½ï¼ŒåŒåŸ‹ä½¢å“‹å˜…å­˜å–權。
@@ -2041,11 +2033,7 @@ Template:æžæ¸…楚',
'enotif_mailer' => '{{SITENAME}}通知郵éžå“¡',
'enotif_reset' => '將所有é é¢æ¨™æˆå·²è¦–察',
-'enotif_newpagetext' => '呢個係一個新é é¢ã€‚',
'enotif_impersonal_salutation' => '{{SITENAME}}用戶',
-'changed' => '修改éŽ',
-'created' => '建立éŽ',
-'enotif_subject' => '{{SITENAME}}嘅é é¢$PAGETITLE已由$PAGEEDITOR$CHANGEDORCREATED',
'enotif_lastvisited' => '你上次視察以嚟嘅修改請ç‡$1。',
'enotif_lastdiff' => 'ç‡$1去ç‡å“呢一次更改。',
'enotif_anon_editor' => '匿å用戶$1',
@@ -2072,6 +2060,8 @@ wiki: $PAGEEDITOR_WIKI
回饋åŠæ›´å¤šå¹«åŠ©ï¼š
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => '建立éŽ',
+'changed' => '修改éŽ',
# Delete
'deletepage' => '刪除é é¢',
@@ -2236,7 +2226,7 @@ $1',
'blanknamespace' => '(主)',
# Contributions
-'contributions' => '用戶貢ç»',
+'contributions' => '{{GENDER:$1|用戶}}è²¢ç»',
'contributions-title' => '$1嘅用戶貢ç»',
'mycontris' => '個人貢ç»',
'contribsub2' => '$1å˜…è²¢ç» ($2)',
@@ -3370,7 +3360,7 @@ MediaWiki是基於使用目的而加以發佈,但係就唔會負上任何嘅è²
# New logging system
'revdelete-restricted' => '已經應用é™åˆ¶åˆ°æ“作員',
'revdelete-unrestricted' => '已經拎走å°æ–¼æ“作員嘅é™åˆ¶',
-'newuserlog-byemail' => '密碼已由電郵寄出',
+'rightsnone' => '(ç„¡)',
# Search suggestions
'searchsuggest-search' => 'æµå˜¢',
diff --git a/languages/messages/MessagesZea.php b/languages/messages/MessagesZea.php
index e95d50f1..2715b8f1 100644
--- a/languages/messages/MessagesZea.php
+++ b/languages/messages/MessagesZea.php
@@ -187,7 +187,6 @@ $messages = array(
'qbbrowse' => 'Blaeren',
'qbedit' => 'Bewerk',
'qbpageoptions' => 'Paginaopties',
-'qbpageinfo' => 'Pagina-informaotie',
'qbmyoptions' => 'Mien opties',
'qbspecialpages' => 'Speciaole pahina’s',
'faq' => 'FAQ (veehestelde vraehen)',
@@ -418,9 +417,6 @@ De heheven reeën is ''$2''.",
Je kan {{SITENAME}} noe anoniem gebruken of wee anmelden as dezelven of een aore gebruker.
Meuhlijk worn nog een antal pagina's weereheven asof a je anemeld bin totda je de cache van je browser leeg.",
-'welcomecreation' => '== Welkom, $1! ==
-Jen account is anemikt.
-Vergeet nie je [[Special:Preferences|vòkeuren voe {{SITENAME}}]] an te passen.',
'yourname' => 'Gebrukersnaem',
'yourpassword' => 'Wachtwoôrd',
'yourpasswordagain' => 'Heef je wachtwoôrd opnieuw in:',
@@ -655,7 +651,6 @@ Opslaene is nie meuhlijk.'''",
'template-protected' => '(beveiligd)',
'template-semiprotected' => '(semi-beveiligd)',
'hiddencategories' => 'Deêze pagina val in de volhende verborhen {{PLURAL:$1|categorie|categorieën}}:',
-'nocreatetitle' => "'t Anmaeken van pagina's is beperkt",
'nocreatetext' => "{{SITENAME}} ei de meuhlijkeid om nieuwe pagina's an te maeken beperkt.
Je kan a bestaende pagina's wiezigen, of je kan [[Special:UserLogin|jen eihen anmelden of een gebruker anmaeken]].",
'nocreate-loggedin' => "Je kan hin nieuwe pagina's anmaeken.",
@@ -947,11 +942,12 @@ Een nie anekruusd vienkvakje beteêken da de gebruker hin lid is van de hroep.",
'grouppage-bureaucrat' => "{{ns:project}}:Bureaucraot'n",
'grouppage-suppress' => '{{ns:project}}:Toezicht',
+# Special:Log/newusers
+'newuserlogpage' => 'Logboek nuwe gebrukers',
+
# User rights log
'rightslog' => 'Gebrukersrechtenlogboek',
'rightslogtext' => 'Ieronder staen de wiezigiengen in gebrukersrechen.',
-'rightslogentry' => 'wiezihen de gebrukersrechen voe $1 van $2 ni $3',
-'rightsnone' => '(hin)',
# Associated actions - in the sentence "You do not have permission to X"
'action-edit' => 'deêze bladzie te bewerken',
@@ -1120,9 +1116,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
# Special:LinkSearch
'linksearch-line' => "$1 ei 'n verwiezienge in $2",
-# Special:Log/newusers
-'newuserlogpage' => 'Logboek nuwe gebrukers',
-
# Special:ListGroupRights
'listgrouprights-members' => '(ledenlieste)',
@@ -1404,5 +1397,6 @@ Aorre veld'n worr'n verborr'n.
# New logging system
'revdelete-restricted' => 'ei beperkiengen an beheêrders opeleid',
'revdelete-unrestricted' => 'ei beperkiengen voe beheêrders opeheven',
+'rightsnone' => '(hin)',
);
diff --git a/languages/messages/MessagesZh_classical.php b/languages/messages/MessagesZh_classical.php
deleted file mode 100644
index a58df396..00000000
--- a/languages/messages/MessagesZh_classical.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-/** Classical Chinese (文言)
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
- *
- * @ingroup Language
- * @file
- *
- */
-
-# Inherit everything for now
-$fallback = 'lzh';
diff --git a/languages/messages/MessagesZh_hans.php b/languages/messages/MessagesZh_hans.php
index 774db3bb..250bd315 100644
--- a/languages/messages/MessagesZh_hans.php
+++ b/languages/messages/MessagesZh_hans.php
@@ -42,6 +42,7 @@
* @author Mark85296341
* @author MarkAHershberger
* @author Mys 721tx
+ * @author Nemo bis
* @author O
* @author Onecountry
* @author PhiLiP
@@ -116,7 +117,7 @@ $namespaceAliases = array(
$specialPageAliases = array(
'Activeusers' => array( '活跃用户' ),
- 'Allmessages' => array( '所有信æ¯' ),
+ 'Allmessages' => array( '所有消æ¯' ),
'Allpages' => array( '所有页é¢' ),
'Ancientpages' => array( '最早页é¢' ),
'Badtitle' => array( '无效标题' ),
@@ -161,6 +162,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'MIMEæœç´¢' ),
'Mostcategories' => array( '最多分类页é¢' ),
'Mostimages' => array( '最多链接文件' ),
+ 'Mostinterwikis' => array( '最多跨wiki链接页é¢' ),
'Mostlinked' => array( '最多链接页é¢' ),
'Mostlinkedcategories' => array( '最多链接分类' ),
'Mostlinkedtemplates' => array( '最多链接模æ¿' ),
@@ -184,17 +186,16 @@ $specialPageAliases = array(
'Recentchanges' => array( '最近更改' ),
'Recentchangeslinked' => array( '链出更改' ),
'Revisiondelete' => array( '删除或æ¢å¤ä¿®è®¢' ),
- 'RevisionMove' => array( '修订版本移动' ),
'Search' => array( 'æœç´¢' ),
'Shortpages' => array( '短页é¢' ),
'Specialpages' => array( '特殊页é¢' ),
'Statistics' => array( '统计信æ¯' ),
'Tags' => array( '标签' ),
'Unblock' => array( '解除å°ç¦' ),
- 'Uncategorizedcategories' => array( '无分类分类' ),
- 'Uncategorizedimages' => array( '无分类文件' ),
- 'Uncategorizedpages' => array( '无分类页é¢' ),
- 'Uncategorizedtemplates' => array( '无分类模æ¿' ),
+ 'Uncategorizedcategories' => array( '未分类分类' ),
+ 'Uncategorizedimages' => array( '未分类文件' ),
+ 'Uncategorizedpages' => array( '未分类页é¢' ),
+ 'Uncategorizedtemplates' => array( '未分类模æ¿' ),
'Undelete' => array( 'æ¢å¤è¢«åˆ é¡µé¢' ),
'Unlockdb' => array( '解除数æ®åº“é”定' ),
'Unusedcategories' => array( '未使用分类' ),
@@ -239,7 +240,20 @@ $magicWords = array(
'numberofedits' => array( '1', '编辑数', 'NUMBEROFEDITS' ),
'numberofviews' => array( '1', '访问数', 'NUMBEROFVIEWS' ),
'pagename' => array( '1', '页é¢å', 'PAGENAME' ),
+ 'pagenamee' => array( '1', '页é¢åE', 'PAGENAMEE' ),
+ 'namespace' => array( '1', 'å字空间', 'NAMESPACE' ),
+ 'namespacee' => array( '1', 'å字空间E', 'NAMESPACEE' ),
+ 'namespacenumber' => array( '1', 'å字空间编å·', 'NAMESPACENUMBER' ),
+ 'talkspace' => array( '1', '讨论å字空间', 'TALKSPACE' ),
+ 'talkspacee' => array( '1', '讨论å字空间E', 'TALKSPACEE' ),
'fullpagename' => array( '1', '完整页é¢å', 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( '1', '完整页é¢åE', 'FULLPAGENAMEE' ),
+ 'subpagename' => array( '1', 'å­é¡µé¢å', 'SUBPAGENAME' ),
+ 'subpagenamee' => array( '1', 'å­é¡µé¢åE', 'SUBPAGENAMEE' ),
+ 'talkpagename' => array( '1', '讨论页é¢å', 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( '1', '讨论页é¢åE', 'TALKPAGENAMEE' ),
+ 'subst' => array( '0', '替代:', 'SUBST:' ),
+ 'safesubst' => array( '0', '安全替代:', 'SAFESUBST:' ),
'img_thumbnail' => array( '1', '缩略图', 'thumbnail', 'thumb' ),
'img_manualthumb' => array( '1', '缩略图=$1', 'thumbnail=$1', 'thumb=$1' ),
'img_right' => array( '1', 'å³', 'right' ),
@@ -247,14 +261,65 @@ $magicWords = array(
'img_none' => array( '1', 'æ— ', 'none' ),
'img_width' => array( '1', '$1åƒç´ ', '$1px' ),
'img_center' => array( '1', '居中', 'center', 'centre' ),
+ 'img_framed' => array( '1', '有框', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', '无框', 'frameless' ),
'img_page' => array( '1', '页数=$1', '$1页', 'page=$1', 'page $1' ),
+ 'img_border' => array( '1', '有边', 'border' ),
'img_link' => array( '1', '链接=$1', 'link=$1' ),
'img_alt' => array( '1', '替代文本=$1', 'alt=$1' ),
+ 'img_class' => array( '1', 'ç±»=$1', 'class=$1' ),
+ 'int' => array( '0', 'ç•Œé¢:', 'INT:' ),
+ 'sitename' => array( '1', '站点å称', 'SITENAME' ),
+ 'ns' => array( '0', 'å字空间:', 'NS:' ),
+ 'nse' => array( '0', 'å字空间E:', 'NSE:' ),
+ 'localurl' => array( '0', '本地URL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', '本地URLE:', 'LOCALURLE:' ),
+ 'articlepath' => array( '0', 'æ¡ç›®è·¯å¾„', 'ARTICLEPATH' ),
+ 'pageid' => array( '0', '页é¢ID', 'PAGEID' ),
+ 'server' => array( '0', 'æœåŠ¡å™¨', 'SERVER' ),
+ 'servername' => array( '0', 'æœåŠ¡å™¨å', 'SERVERNAME' ),
+ 'scriptpath' => array( '0', '脚本路径', 'SCRIPTPATH' ),
+ 'stylepath' => array( '0', 'æ ·å¼è·¯å¾„', 'STYLEPATH' ),
+ 'grammar' => array( '0', '语法:', 'GRAMMAR:' ),
+ 'gender' => array( '0', '性别:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__ä¸è½¬æ¢æ ‡é¢˜__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__ä¸è½¬æ¢å†…容__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'lcfirst' => array( '0', 'å°å†™é¦–å­—:', 'LCFIRST:' ),
+ 'ucfirst' => array( '0', '大写首字:', 'UCFIRST:' ),
+ 'lc' => array( '0', 'å°å†™:', 'LC:' ),
+ 'uc' => array( '0', '大写:', 'UC:' ),
+ 'displaytitle' => array( '1', '显示标题', 'DISPLAYTITLE' ),
'newsectionlink' => array( '1', '__新段è½é“¾æŽ¥__', '__NEWSECTIONLINK__' ),
'nonewsectionlink' => array( '1', '__无新段è½é“¾æŽ¥__', '__NONEWSECTIONLINK__' ),
+ 'currentversion' => array( '1', '当å‰ç‰ˆæœ¬', 'CURRENTVERSION' ),
+ 'urlencode' => array( '0', 'URLç¼–ç :', 'URLENCODE:' ),
+ 'anchorencode' => array( '0', '锚编ç ', 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( '1', '当å‰æ—¶é—´æˆ³', 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( '1', '本地时间戳', 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( '1', 'æ–¹å‘标记', 'DIRECTIONMARK', 'DIRMARK' ),
'language' => array( '0', '#语言:', '#LANGUAGE:' ),
+ 'contentlanguage' => array( '1', '内容语言', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( '1', 'å字空间中页é¢æ•°:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( '1', '管ç†å‘˜æ•°', 'NUMBEROFADMINS' ),
+ 'formatnum' => array( '0', 'æ ¼å¼åŒ–æ•°å­—', 'FORMATNUM' ),
+ 'padleft' => array( '0', '左填充', 'PADLEFT' ),
+ 'padright' => array( '0', 'å³å¡«å……', 'PADRIGHT' ),
+ 'special' => array( '0', '特殊', 'special' ),
+ 'speciale' => array( '0', '特殊e', 'speciale' ),
+ 'defaultsort' => array( '1', '默认排åº:', '默认排åºå…³é”®å­—:', '默认分类排åº:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+ 'filepath' => array( '0', '文件路径:', 'FILEPATH:' ),
'tag' => array( '0', '标记', 'tag' ),
+ 'hiddencat' => array( '1', '__éšè—分类__', '__HIDDENCAT__' ),
+ 'pagesincategory' => array( '1', '分类中页é¢æ•°', 'PAGESINCATEGORY', 'PAGESINCAT' ),
'pagesize' => array( '1', '页é¢å¤§å°', 'PAGESIZE' ),
+ 'index' => array( '1', '__索引__', '__INDEX__' ),
+ 'noindex' => array( '1', '__ä¸ç´¢å¼•__', '__NOINDEX__' ),
+ 'numberingroup' => array( '1', '组中用户数', 'NUMBERINGROUP', 'NUMINGROUP' ),
+ 'staticredirect' => array( '1', '__é™æ€é‡å®šå‘__', '__STATICREDIRECT__' ),
+ 'protectionlevel' => array( '1', 'ä¿æŠ¤çº§åˆ«', 'PROTECTIONLEVEL' ),
+ 'formatdate' => array( '0', 'æ ¼å¼åŒ–日期', '日期格å¼åŒ–', 'formatdate', 'dateformat' ),
+ 'defaultsort_noerror' => array( '0', 'ä¸æŠ¥é”™', 'noerror' ),
+ 'defaultsort_noreplace' => array( '0', 'ä¸æ›¿æ¢', 'noreplace' ),
);
$linkTrail = '/^()(.*)$/sD';
@@ -418,6 +483,7 @@ $messages = array(
'newwindow' => '(将于新窗å£ä¸­æ‰“开)',
'cancel' => 'å–消',
'moredotdotdot' => '更多',
+'morenotlisted' => '更多未被列出的模æ¿...',
'mypage' => '页é¢',
'mytalk' => '讨论',
'anontalk' => '该IP地å€çš„讨论',
@@ -429,7 +495,6 @@ $messages = array(
'qbbrowse' => 'æµè§ˆ',
'qbedit' => '编辑',
'qbpageoptions' => '页é¢é€‰é¡¹',
-'qbpageinfo' => '页é¢ä¿¡æ¯',
'qbmyoptions' => '我的页é¢',
'qbspecialpages' => '特殊页é¢',
'faq' => '常è§é—®é¢˜',
@@ -452,6 +517,7 @@ $messages = array(
'namespaces' => 'å字空间',
'variants' => 'å˜æ¢',
+'navigation-heading' => '导航èœå•',
'errorpagetitle' => '错误',
'returnto' => '返回$1。',
'tagline' => 'æ¥è‡ª{{SITENAME}}',
@@ -688,9 +754,9 @@ $2',
# Login and logout pages
'logouttext' => "'''您现在已ç»é€€å‡ºã€‚'''
-您å¯ä»¥ç»§ç»­ä»¥åŒ¿åæ–¹å¼ä½¿ç”¨{{SITENAME}},或å†æ¬¡ä»¥ç›¸åŒæˆ–ä¸åŒç”¨æˆ·èº«ä»½[[Special:UserLogin|登录]]。请注æ„一些页é¢å¯èƒ½ä»ç„¶æ˜¾ç¤ºæ‚¨ä¸ºç™»å½•çŠ¶æ€ï¼Œç›´åˆ°æ‚¨æ¸…空您的æµè§ˆå™¨ç¼“存为止。",
-'welcomecreation' => '== 欢迎,$1ï¼ ==
-你的账户已创建。请别忘记更改你的[[Special:Preferences|{{SITENAME}}系统设置]]。',
+您å¯ä»¥ç»§ç»­ä»¥åŒ¿åæ–¹å¼ä½¿ç”¨{{SITENAME}},或å†æ¬¡ä»¥ç›¸åŒæˆ–ä¸åŒç”¨æˆ·èº«ä»½<span class='plainlinks'>[$1 登录]</span>。请注æ„一些页é¢å¯èƒ½ä»ç„¶æ˜¾ç¤ºæ‚¨ä¸ºç™»å½•çŠ¶æ€ï¼Œç›´åˆ°æ‚¨æ¸…空您的æµè§ˆå™¨ç¼“存为止。",
+'welcomeuser' => '欢迎,$1ï¼',
+'welcomecreation-msg' => '你的账户已创建。请ä¸è¦å¿˜è®°æ›´æ”¹ä½ çš„[[Special:Preferences|{{SITENAME}}系统设置]]。',
'yourname' => '用户å:',
'yourpassword' => '密ç ï¼š',
'yourpasswordagain' => 'å†æ¬¡è¾“入密ç ï¼š',
@@ -713,7 +779,7 @@ $2',
'gotaccount' => 'å·²ç»æ‹¥æœ‰è´¦æˆ·ï¼Ÿè¯·$1。',
'gotaccountlink' => '登录',
'userlogin-resetlink' => '忘记了你的登录信æ¯ï¼Ÿ',
-'createaccountmail' => '通过电å­é‚®ä»¶',
+'createaccountmail' => '使用一个临时的éšæœºå¯†ç ï¼Œå¹¶å°†å®ƒå‘é€åˆ°ä»¥ä¸‹æŒ‡å®šçš„电å­é‚®ä»¶åœ°å€',
'createaccountreason' => '原因:',
'badretype' => '您所输入的密ç å¹¶ä¸ç›¸åŒã€‚',
'userexists' => '用户å已存在。请使用其他å称。',
@@ -774,6 +840,7 @@ $2',
# Email sending
'php-mail-error-unknown' => '在 PHP 的 mail() 函数中的未知错误',
'user-mail-no-addy' => 'å°è¯•å‘é€é‚®ä»¶è€Œä¸é™„带电å­é‚®ä»¶åœ°å€ã€‚',
+'user-mail-no-body' => '试图å‘é€ç©ºçš„或者主体短得ä¸åˆç†çš„电å­é‚®ä»¶ã€‚',
# Change password dialog
'resetpass' => '更改密ç ',
@@ -829,6 +896,7 @@ $2
'changeemail-oldemail' => '当å‰ç”µå­é‚®ä»¶åœ°å€ï¼š',
'changeemail-newemail' => '新的电å­é‚®ä»¶åœ°å€ï¼š',
'changeemail-none' => '(无)',
+'changeemail-password' => 'ä½ çš„{{SITENAME}}密ç ï¼š',
'changeemail-submit' => '更改电å­é‚®ä»¶åœ°å€',
'changeemail-cancel' => 'å–消',
@@ -982,7 +1050,6 @@ $2
'template-semiprotected' => '(åŠä¿æŠ¤ï¼‰',
'hiddencategories' => '本页é¢å±žäºŽ$1个éšè—分类:',
'edittools' => '<!-- 这里的文字将显示在编辑和上传表格下é¢ã€‚ -->',
-'nocreatetitle' => '创建页é¢å—é™',
'nocreatetext' => '{{SITENAME}}å·²ç»é™åˆ¶åˆ›å»ºæ–°é¡µé¢åŠŸèƒ½ã€‚ä½ å¯ä»¥è¿”回编辑现有页é¢æˆ–[[Special:UserLogin|登录或创建账户]]。',
'nocreate-loggedin' => '你没有æƒé™åˆ›å»ºæ–°é¡µé¢ã€‚',
'sectioneditnotsupported-title' => '段è½ç¼–辑ä¸æ”¯æŒ',
@@ -1004,6 +1071,15 @@ $2
'edit-already-exists' => 'ä¸å¯ä»¥å»ºç«‹ä¸€ä¸ªæ–°é¡µé¢ã€‚
它已ç»å­˜åœ¨ã€‚',
'defaultmessagetext' => '默认消æ¯æ–‡æœ¬',
+'content-failed-to-parse' => '未能将 $2 内容转æ¢ä¸º $1:$3',
+'invalid-content-data' => '无效的内容数æ®',
+'content-not-allowed-here' => '[[$2]]页é¢ä¸Šä¸å…许“$1â€å†…容',
+
+# Content models
+'content-model-wikitext' => 'wiki语法',
+'content-model-text' => '纯文本',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => '警告:这个页é¢æœ‰å¤ªå¤šé«˜æ˜‚的语法功能调用。
@@ -1345,9 +1421,9 @@ $1",
'prefs-emailconfirm-label' => '电å­é‚®ä»¶ç¡®è®¤ï¼š',
'prefs-textboxsize' => '编辑框大å°',
'youremail' => '电å­é‚®ä»¶ï¼š',
-'username' => '用户å:',
-'uid' => '用户ID:',
-'prefs-memberingroups' => '{{PLURAL:$1|用户组}}:',
+'username' => '{{GENDER:$1|用户å}}:',
+'uid' => '{{GENDER:$1|用户}}ID:',
+'prefs-memberingroups' => '{{GENDER:$2|用户}}{{PLURAL:$1|组}}:',
'prefs-registration' => '注册时间:',
'yourrealname' => '真实姓å:',
'yourlanguage' => '语言:',
@@ -1494,12 +1570,13 @@ $1",
'right-sendemail' => '电邮è”系其他用户',
'right-passwordreset' => '查看密ç é‡ç½®ç”µå­é‚®ä»¶',
+# Special:Log/newusers
+'newuserlogpage' => '用户创建日志',
+'newuserlogpagetext' => '这是用户创建的日志。',
+
# User rights log
'rightslog' => '用户æƒé™æ—¥å¿—',
'rightslogtext' => '这是用户æƒé™æ›´æ”¹çš„日志。',
-'rightslogentry' => '将$1的用户组由$2更改为$3',
-'rightslogentry-autopromote' => '被自动æå‡è‡ª$2至$3',
-'rightsnone' => '(无)',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => '阅读本页',
@@ -1716,6 +1793,7 @@ $1',
'backend-fail-notsame' => '$1已存在ä¸åŒçš„文件。',
'backend-fail-invalidpath' => '$1ä¸æ˜¯æœ‰æ•ˆçš„存储路径。',
'backend-fail-delete' => '无法删除文件“$1â€ã€‚',
+'backend-fail-describe' => '无法修改文件“$1â€çš„元数æ®ã€‚',
'backend-fail-alreadyexists' => '“$1â€é¡µé¢å·²å­˜åœ¨',
'backend-fail-store' => '无法在$2存储文件$1。',
'backend-fail-copy' => '无法å¤åˆ¶æ–‡ä»¶$1到$2。',
@@ -1944,6 +2022,12 @@ $1',
'disambiguationspage' => 'Template:消歧义',
'disambiguations-text' => "以下的页é¢éƒ½æœ‰åˆ°'''消歧义页'''的链接,但它们å¯èƒ½å¯ä»¥é“¾æŽ¥åˆ°æ›´é€‚当的页é¢ã€‚<br />一个页é¢å¦‚果使用了[[MediaWiki:Disambiguationspage]]内的模æ¿ï¼Œåˆ™ä¼šè¢«è§†ä¸ºæ¶ˆæ­§ä¹‰é¡µã€‚",
+'pageswithprop' => '有æŸé¡µé¢å±žæ€§çš„页é¢',
+'pageswithprop-legend' => '有æŸé¡µé¢å±žæ€§çš„页é¢',
+'pageswithprop-text' => '此页é¢åˆ—出了使用特定页é¢å±žæ€§çš„页é¢åå•ã€‚',
+'pageswithprop-prop' => '属性å称:',
+'pageswithprop-submit' => 'æ交',
+
'doubleredirects' => 'åŒé‡é‡å®šå‘页',
'doubleredirectstext' => '本页é¢åˆ—出é‡å®šå‘至其他é‡å®šå‘页的页é¢ã€‚æ¯è¡Œå«æœ‰ç¬¬ä¸€åŠç¬¬äºŒé‡å®šå‘的链接和第二é‡å®šå‘的目标(通常是第一é‡å®šå‘应该指å‘的“真实â€ç›®æ ‡é¡µé¢ï¼‰ã€‚<del>带删除线的</del>æ¡ç›®å·²è¢«è§£å†³ã€‚',
'double-redirect-fixed-move' => '[[$1]]已被移动。它现在é‡å®šå‘至[[$2]]。',
@@ -2092,8 +2176,8 @@ $1',
'linksearch-pat' => 'æœç´¢ç½‘å€ï¼š',
'linksearch-ns' => 'å字空间:',
'linksearch-ok' => 'æœç´¢',
-'linksearch-text' => '制作å¯ä»¥ä½¿ç”¨ç±»ä¼¼â€œ*.wikipedia.orgâ€çš„通é…符。必须至少是顶级域å,例如“*.orgâ€ã€‚<br />
-支æŒçš„å议:<code>$1</code>(如果没有设置å议则默认为<nowiki>http://</nowiki>)。',
+'linksearch-text' => 'å¯ä»¥ä½¿ç”¨ç±»ä¼¼â€œ*.wikipedia.orgâ€çš„通é…符。必须至少是顶级域å,例如“*.orgâ€ã€‚<br />
+支æŒçš„{{PLURAL:$2|åè®®}}:<code>$1</code>(如果没有设置å议则默认为<nowiki>http://</nowiki>)。',
'linksearch-line' => '$1 链自 $2',
'linksearch-error' => '通é…符仅å¯åœ¨ä¸»æœºå称的开头使用。',
@@ -2112,10 +2196,6 @@ $1',
'activeusers-hidesysops' => 'éšè—管ç†å‘˜',
'activeusers-noresult' => '找ä¸åˆ°ç”¨æˆ·ã€‚',
-# Special:Log/newusers
-'newuserlogpage' => '用户创建日志',
-'newuserlogpagetext' => '这是用户创建的日志。',
-
# Special:ListGroupRights
'listgrouprights' => '用户组æƒé™',
'listgrouprights-summary' => '以下é¢æ˜¯ä¸€ä¸ªåœ¨è¿™ä¸ªç»´åŸºä¸­æ‰€å®šä¹‰å‡ºæ¥çš„用户æƒé™åˆ—表,以åŠå®ƒä»¬çš„访问æƒã€‚
@@ -2208,11 +2288,17 @@ $1',
'enotif_mailer' => '{{SITENAME}}通知å‘é€å™¨',
'enotif_reset' => '标记所有页é¢ä¸ºå·²è®¿é—®',
-'enotif_newpagetext' => '该页é¢ä¸ºæ–°é¡µé¢ã€‚',
'enotif_impersonal_salutation' => '{{SITENAME}}用户',
-'changed' => '更改',
-'created' => '创建',
-'enotif_subject' => '{{SITENAME}}页é¢â€œ$PAGETITLEâ€å·²è¢«$PAGEEDITOR$CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}}页é¢$1已被$2删除',
+'enotif_subject_created' => '{{SITENAME}}页é¢$1已被$2创建',
+'enotif_subject_moved' => '{{SITENAME}}页é¢$1已被$2移动',
+'enotif_subject_restored' => '{{SITENAME}}页é¢$1已被$2æ¢å¤',
+'enotif_subject_changed' => '{{SITENAME}}页é¢$1已被$2更改',
+'enotif_body_intro_deleted' => '{{SITENAME}}页é¢$1已于$PAGEEDITDATE被$2{{GENDER:$2|删除}},请è§$3。',
+'enotif_body_intro_created' => '{{SITENAME}}页é¢$1已于$PAGEEDITDATE被$2{{GENDER:$2|创建}},请æµè§ˆ<$3>查看当å‰ç‰ˆæœ¬ã€‚',
+'enotif_body_intro_moved' => '{{SITENAME}}页é¢$1已于$PAGEEDITDATE被$2{{GENDER:$2|移动}},请æµè§ˆ<$3>查看当å‰ç‰ˆæœ¬ã€‚',
+'enotif_body_intro_restored' => '{{SITENAME}}页é¢$1已于$PAGEEDITDATE被$2{{GENDER:$2|æ¢å¤}},请æµè§ˆ<$3>查看当å‰ç‰ˆæœ¬ã€‚',
+'enotif_body_intro_changed' => '{{SITENAME}}页é¢$1已于$PAGEEDITDATE被$2{{GENDER:$2|更改}},请æµè§ˆ $3 查看当å‰ç‰ˆæœ¬ã€‚',
'enotif_lastvisited' => '请æµè§ˆ $1 查看你上次访问åŽçš„所有更改。',
'enotif_lastdiff' => '请æµè§ˆ $1 查看该更改。',
'enotif_anon_editor' => '匿å用户$1',
@@ -2220,8 +2306,7 @@ $1',
你好ï¼
-{{SITENAME}}页é¢$PAGETITLE已于$PAGEEDITDATE被$PAGEEDITOR $CHANGEDORCREATED,请æµè§ˆ $PAGETITLE_URL 查看当å‰ç‰ˆæœ¬ã€‚
-$NEWPAGE
+$PAGEINTRO$NEWPAGE
编辑摘è¦ï¼š$PAGESUMMARY $PAGEMINOREDIT
ä½ å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–¹å¼è”系编者:
@@ -2232,7 +2317,6 @@ $NEWPAGE
你也å¯ä»¥é‡è®¾ä½ çš„监视列表中所有监视页é¢çš„通知标志。
{{SITENAME}}通知系统
-
--
更改邮件通知设置:
{{canonicalurl:{{#special:Preferences}}}}
@@ -2242,6 +2326,8 @@ $NEWPAGE
$UNWATCHURL
å馈与其他帮助:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => '创建',
+'changed' => '更改',
# Delete
'deletepage' => '删除页é¢',
@@ -2307,6 +2393,8 @@ $UNWATCHURL
'prot_1movedto2' => '[[$1]]移动至[[$2]]',
'protect-badnamespace-title' => 'ä¸å¯è¢«ä¿æŠ¤çš„å字空间',
'protect-badnamespace-text' => '这个å字空间内的页é¢æ— æ³•è¢«ä¿æŠ¤ã€‚',
+'protect-norestrictiontypes-text' => '无法ä¿æŠ¤æ­¤é¡µï¼Œå› ä¸ºæ²¡æœ‰å¯ç”¨çš„ä¿æŠ¤ç±»åž‹',
+'protect-norestrictiontypes-title' => 'ä¸å¯ä¿æŠ¤é¡µé¢',
'protect-legend' => '确认ä¿æŠ¤',
'protectcomment' => '原因:',
'protectexpiry' => '到期:',
@@ -2322,6 +2410,7 @@ $UNWATCHURL
'protect-fallback' => 'ä»…å…许拥有“$1â€æƒé™çš„用户',
'protect-level-autoconfirmed' => 'ä»…å…许自动确认用户',
'protect-level-sysop' => 'ä»…å…许管ç†å‘˜',
+'protect-summary-desc' => '[$1=$2]($3)',
'protect-summary-cascade' => 'è”é”',
'protect-expiring' => '终止于$1(UTC)',
'protect-expiring-local' => '$1到期',
@@ -2382,7 +2471,8 @@ $UNWATCHURL
'undeletedrevisions' => '$1个版本已æ¢å¤',
'undeletedrevisions-files' => '$1个版本和$2个文件已æ¢å¤',
'undeletedfiles' => '$1个文件已ç»è¢«æ¢å¤',
-'cannotundelete' => 'æ¢å¤åˆ é™¤å¤±è´¥ï¼›å¯èƒ½å·²æœ‰å…¶ä»–人先行æ¢å¤äº†æ­¤é¡µé¢ã€‚',
+'cannotundelete' => 'æ¢å¤åˆ é™¤å¤±è´¥ï¼š
+$1',
'undeletedpage' => "'''$1å·²ç»è¢«æ¢å¤'''
å‚考[[Special:Log/delete|删除日志]]查看删除åŠæ¢å¤è®°å½•ã€‚",
@@ -2413,7 +2503,7 @@ $1',
'blanknamespace' => '(主è¦ï¼‰',
# Contributions
-'contributions' => '用户贡献',
+'contributions' => '{{GENDER:$1|用户}}贡献',
'contributions-title' => '$1的用户贡献',
'mycontris' => '贡献',
'contribsub2' => '$1的贡献($2)',
@@ -2680,6 +2770,7 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'immobile-target-namespace-iw' => '在移动页é¢æ—¶ï¼Œè·¨wiki链接ä¸æ˜¯æœ‰æ•ˆçš„目标。',
'immobile-source-page' => '此页é¢ä¸èƒ½ç§»åŠ¨ã€‚',
'immobile-target-page' => '无法移动至该目标标题。',
+'bad-target-model' => 'è¦æ±‚的目标使用ä¸åŒçš„内容模å¼ã€‚无法从$1转æ¢åˆ°$2。',
'imagenocrossnamespace' => '无法将文件移动到éžæ–‡ä»¶å字空间',
'nonfile-cannot-move-to-file' => '无法将éžæ–‡ä»¶ç§»åŠ¨åˆ°æ–‡ä»¶å字空间',
'imagetypemismatch' => '该新扩展å与其类型ä¸åŒ¹é…',
@@ -2787,6 +2878,7 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'import-error-interwiki' => '页é¢â€œ$1â€æœªèƒ½å¯¼å…¥ï¼Œå› ä¸ºå®ƒçš„å称需è¦ä½¿ç”¨å¤–部跨wiki链接。',
'import-error-special' => '页é¢â€œ$1â€æœªå¯¼å…¥ï¼Œå› ä¸ºå®ƒéœ€è¦ä½¿ç”¨ä¸€ä¸ªä¸èƒ½åˆ›å»ºé¡µé¢çš„特殊å字空间。',
'import-error-invalid' => '页é¢â€œ$1â€æœªèƒ½å¯¼å…¥ï¼Œå› ä¸ºå®ƒçš„å字无效。',
+'import-error-unserialize' => '页é¢â€œ$1â€çš„版本$2无法ååºåˆ—化。此版本使用内容模型$3åºåˆ—化为$4。',
'import-options-wrong' => '{{PLURAL:$2|选项}}出错:<nowiki>$1</nowiki>',
'import-rootpage-invalid' => '根页é¢çš„标题无效。',
'import-rootpage-nosubpage' => 'å字空间为“$1â€çš„根页é¢ä¸å…许å­é¡µé¢ã€‚',
@@ -2801,7 +2893,6 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
# JavaScriptTest
'javascripttest' => 'JavaScript测试',
-'javascripttest-disabled' => '该wiki站点上尚未å¯ç”¨æ­¤åŠŸèƒ½ã€‚',
'javascripttest-title' => 'è¿è¡Œ$1测试',
'javascripttest-pagetext-noframework' => '本页é¢è¢«ä¿ç•™è¿›è¡ŒJavaScript测试。',
'javascripttest-pagetext-unknownframework' => '未知的框架“$1â€ã€‚',
@@ -2950,11 +3041,13 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'pageinfo-default-sort' => '默认排åºå­—',
'pageinfo-length' => '页é¢é•¿åº¦ï¼ˆå­—节)',
'pageinfo-article-id' => '页é¢ID',
+'pageinfo-language' => '页é¢å†…容语言',
'pageinfo-robot-policy' => 'æœç´¢å¼•æ“ŽçŠ¶æ€',
'pageinfo-robot-index' => 'å¯ç´¢å¼•',
'pageinfo-robot-noindex' => 'ä¸å¯ç´¢å¼•',
'pageinfo-views' => '查看次数',
'pageinfo-watchers' => '页é¢ç›‘视者人数',
+'pageinfo-few-watchers' => '少于$1å监视者',
'pageinfo-redirects-name' => 'é‡å®šå‘到本页',
'pageinfo-subpages-name' => '本页的å­é¡µé¢',
'pageinfo-subpages-value' => '$1 ($2个é‡å®šå‘ï¼›$3个éžé‡å®šå‘)',
@@ -2969,6 +3062,19 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'pageinfo-magic-words' => '魔术字($1)',
'pageinfo-hidden-categories' => 'éšè—分类($1)',
'pageinfo-templates' => '使用的模æ¿ï¼ˆ$1)',
+'pageinfo-transclusions' => '$1个包å«æ­¤é¡µçš„页é¢',
+'pageinfo-toolboxlink' => '页é¢ä¿¡æ¯',
+'pageinfo-redirectsto' => 'é‡å®šå‘到',
+'pageinfo-redirectsto-info' => 'ä¿¡æ¯',
+'pageinfo-contentpage' => '计算为内容页',
+'pageinfo-contentpage-yes' => '是',
+'pageinfo-protect-cascading' => '从这里开始连é”ä¿æŠ¤',
+'pageinfo-protect-cascading-yes' => '是',
+'pageinfo-protect-cascading-from' => 'ä¿æŠ¤çº§è”自',
+'pageinfo-category-info' => '分类信æ¯',
+'pageinfo-category-pages' => '页数',
+'pageinfo-category-subcats' => 'å­åˆ†ç±»æ•°',
+'pageinfo-category-files' => '文件数',
# Skin names
'skinname-standard' => '标准',
@@ -2987,6 +3093,8 @@ $1被å°ç¦çš„ç†ç”±æ˜¯ï¼šâ€œ$2â€',
'markedaspatrollederror' => 'ä¸èƒ½æ ‡å¿—为已检查',
'markedaspatrollederrortext' => '你需è¦æŒ‡å®šä¸€ä¸ªç‰ˆæœ¬ä»¥æ ‡è®°ä¸ºå·²å·¡æŸ¥ã€‚',
'markedaspatrollederror-noautopatrol' => 'ä½ ä¸èƒ½æŠŠè‡ªå·±çš„更改标记为已检查。',
+'markedaspatrollednotify' => '$1的更改已被标记为已巡查。',
+'markedaspatrollederrornotify' => '标记为已巡查失败。',
# Patrol log
'patrol-log-page' => '巡查日志',
@@ -3019,6 +3127,7 @@ $1',
'file-nohires' => '没有更高的分辨率。',
'svg-long-desc' => 'SVG文件,尺寸为$1 × $2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3',
'svg-long-desc-animated' => '动画SVG文件,尺寸为$1 × $2åƒç´ ï¼Œæ–‡ä»¶å¤§å°ï¼š$3',
+'svg-long-error' => '无效的SVG文件:$1',
'show-big-image' => '完全分辨率',
'show-big-image-preview' => '本预览的尺寸:$1。',
'show-big-image-other' => '其他{{PLURAL:$2|分辨率}}:$1。',
@@ -3052,7 +3161,10 @@ $1',
'minutes' => '$1分',
'hours' => '$1å°æ—¶',
'days' => '$1天',
+'months' => '{{PLURAL:$1|$1个月}}',
+'years' => '{{PLURAL:$1|$1å¹´}}',
'ago' => '$1å‰',
+'just-now' => '刚刚',
# Bad image list
'bad_image_list' => '请按照下列格å¼ç¼–写:
@@ -3567,6 +3679,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[跨网站的编ç è½¬æ¢ä¸å¯ç”¨]',
'scarytranscludefailed' => '[æå–$1失败]',
+'scarytranscludefailed-httpstatus' => '[模æ¿$1读å–失败:HTTP $2]',
'scarytranscludetoolong' => '[URL过长]',
# Delete conflict
@@ -3682,6 +3795,7 @@ $5
'version-license' => '授æƒåè®®',
'version-poweredby-credits' => "本Wikiç”±'''[//www.mediawiki.org/ MediaWiki]'''驱动,版æƒæ‰€æœ‰ © 2001-$1 $2。",
'version-poweredby-others' => '其他',
+'version-credits-summary' => '我们感谢下列人士为[[Special:Version|MediaWiki]]作出的贡献。',
'version-license-info' => "MediaWiki是自由软件,你å¯ä»¥ä¾æ®è‡ªç”±è½¯ä»¶åŸºé‡‘会å‘行的'''GNU公众授æƒåè®®'''第2版或任æ„åŽç»­ç‰ˆæœ¬çš„æ¡æ¬¾ï¼Œä¼ æ’­å’Œ/或修改本软件。
MediaWikiå‘表时预期有用,但对此'''无任何ä¿è¯''',亦无éšå«çš„'''å¯ä»¥é”€å”®'''或'''适åˆç‰¹å®šç›®çš„'''çš„ä¿è¯ã€‚详情请è§GNU公众授æƒå议。
@@ -3800,14 +3914,14 @@ MediaWikiå‘表时预期有用,但对此'''无任何ä¿è¯''',亦无éšå«çš
'logentry-delete-delete' => '$1删除页é¢$3',
'logentry-delete-restore' => '$1æ¢å¤é¡µé¢$3',
'logentry-delete-event' => '$1已更改$3中$5项日志的å¯è§æ€§ï¼š$4',
-'logentry-delete-revision' => '$1已更改$3中{{PLURAL:$5|$5个历å²ç‰ˆæœ¬|$5个历å²ç‰ˆæœ¬}}çš„å¯è§æ€§ï¼š$4',
-'logentry-delete-event-legacy' => '$1已更改$3中日志的å¯è§æ€§',
-'logentry-delete-revision-legacy' => '$1已更改$3中历å²ç‰ˆæœ¬çš„å¯è§æ€§',
-'logentry-suppress-delete' => '$1å·²éšè—页é¢$3',
-'logentry-suppress-event' => '$1å·²ä¸å¯è§åœ°æ›´æ”¹$3中{{PLURAL:$5|$5项日志|$5项日志}}çš„å¯è§æ€§ï¼š$4',
-'logentry-suppress-revision' => '$1å·²ä¸å¯è§åœ°æ›´æ”¹$3中{{PLURAL:$5|$5个历å²ç‰ˆæœ¬|$5个历å²ç‰ˆæœ¬}}çš„å¯è§æ€§ï¼š$4',
-'logentry-suppress-event-legacy' => '$1å·²ä¸å¯è§åœ°æ›´æ”¹$3中日志的å¯è§æ€§',
-'logentry-suppress-revision-legacy' => '$1å·²ä¸å¯è§åœ°æ›´æ”¹$3中历å²ç‰ˆæœ¬çš„å¯è§æ€§',
+'logentry-delete-revision' => '$1{{GENDER:$2|已更改}}$3中{{PLURAL:$5|$5个历å²ç‰ˆæœ¬|$5个历å²ç‰ˆæœ¬}}çš„å¯è§æ€§ï¼š$4',
+'logentry-delete-event-legacy' => '$1{{GENDER:$2|已更改}}$3中日志的å¯è§æ€§',
+'logentry-delete-revision-legacy' => '$1{{GENDER:$2|已更改}}$3中历å²ç‰ˆæœ¬çš„å¯è§æ€§',
+'logentry-suppress-delete' => '$1{{GENDER:$2|å·²éšè—}}页é¢$3',
+'logentry-suppress-event' => '$1å·²ä¸å¯è§åœ°{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5项日志|$5项日志}}çš„å¯è§æ€§ï¼š$4',
+'logentry-suppress-revision' => '$1å·²ä¸å¯è§åœ°{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5个历å²ç‰ˆæœ¬|$5个历å²ç‰ˆæœ¬}}çš„å¯è§æ€§ï¼š$4',
+'logentry-suppress-event-legacy' => '$1å·²ä¸å¯è§åœ°{{GENDER:$2|更改}}$3中日志的å¯è§æ€§',
+'logentry-suppress-revision-legacy' => '!$1å·²ä¸å¯è§åœ°{{GENDER:$2|更改}}$3中历å²ç‰ˆæœ¬çš„å¯è§æ€§',
'revdelete-content-hid' => 'éšè—内容',
'revdelete-summary-hid' => 'éšè—编辑摘è¦',
'revdelete-uname-hid' => 'éšè—用户å',
@@ -3820,13 +3934,17 @@ MediaWikiå‘表时预期有用,但对此'''无任何ä¿è¯''',亦无éšå«çš
'logentry-move-move-noredirect' => '$1移动$3页é¢è‡³$4,ä¸ç•™é‡å®šå‘',
'logentry-move-move_redir' => '$1移动页é¢$3至$4覆盖é‡å®šå‘',
'logentry-move-move_redir-noredirect' => '$1通过é‡å®šå‘移动$3页é¢è‡³$4,ä¸ç•™é‡å®šå‘',
-'logentry-patrol-patrol' => '$1标记页é¢$3的版本$4为已巡查',
-'logentry-patrol-patrol-auto' => '$1自动标记页é¢$3的版本$4为已巡查',
-'logentry-newusers-newusers' => '已创建用户å¸æˆ· $1',
-'logentry-newusers-create' => '创建用户å¸æˆ·$1',
+'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' => '创建用户å¸æˆ· $3 ç”± $1',
-'logentry-newusers-autocreate' => '账户$1被自动创建',
-'newuserlog-byemail' => '密ç å·²ç”¨ç”µå­é‚®ä»¶å‘é€',
+'logentry-newusers-byemail' => '$1创建用户$3,并且密ç å·²é€šè¿‡ç”µå­é‚®ä»¶å‘é€',
+'logentry-newusers-autocreate' => '用户å¸æˆ·$1已被自动{{GENDER:$2|创建}}',
+'logentry-rights-rights' => '$1将$3的用户组从$4改为$5',
+'logentry-rights-rights-legacy' => '$1更改$3的用户组',
+'logentry-rights-autopromote' => '$1的用户组已自动从$4改为$5',
+'rightsnone' => '(无)',
# Feedback
'feedback-bugornote' => '如果你准备好详细æ述一个技术问题,请[$1 报告bug]。或者你å¯ä»¥ä½¿ç”¨ä¸‹é¢çš„简å•è¡¨æ ¼ã€‚你的评论åŠç”¨æˆ·å将被添加至页é¢â€œ[$3 $2]â€ã€‚',
@@ -3879,6 +3997,7 @@ MediaWikiå‘表时预期有用,但对此'''无任何ä¿è¯''',亦无éšå«çš
'api-error-ok-but-empty' => '内部错误:æœåŠ¡å™¨æ²¡æœ‰å“应。',
'api-error-overwrite' => 'ä¸å…许覆盖现有文件。',
'api-error-stashfailed' => '内部错误:æœåŠ¡å™¨ä¿å­˜ä¸´æ—¶æ–‡ä»¶å¤±è´¥ã€‚',
+'api-error-publishfailed' => '内部错误:æœåŠ¡å™¨å‘布临时文件失败。',
'api-error-timeout' => 'æœåŠ¡å™¨æ²¡æœ‰åœ¨é¢„期内å“应。',
'api-error-unclassified' => '出现未知错误。',
'api-error-unknown-code' => '未知错误:$1',
@@ -3899,4 +4018,7 @@ MediaWikiå‘表时预期有用,但对此'''无任何ä¿è¯''',亦无éšå«çš
'duration-centuries' => '$1个世纪',
'duration-millennia' => '$1åƒå¹´',
+# Image rotation
+'rotate-comment' => '图åƒå·²é¡ºæ—¶é’ˆæ–¹å‘旋转了 $1 {{PLURAL:$1|度|度}}',
+
);
diff --git a/languages/messages/MessagesZh_hant.php b/languages/messages/MessagesZh_hant.php
index 1711040c..429e1d90 100644
--- a/languages/messages/MessagesZh_hant.php
+++ b/languages/messages/MessagesZh_hant.php
@@ -109,12 +109,14 @@ $specialPageAliases = array(
'Allmessages' => array( '所有信æ¯' ),
'Allpages' => array( '所有é é¢' ),
'Ancientpages' => array( '最早é é¢' ),
+ 'Badtitle' => array( '無效標題' ),
'Blankpage' => array( '空白é é¢' ),
'Block' => array( '查å°ç”¨æˆ¶' ),
'Blockme' => array( 'å°ç¦æˆ‘' ),
'Booksources' => array( '網絡書æº' ),
'BrokenRedirects' => array( 'æ壞的é‡å®šå‘é ' ),
'Categories' => array( 'é é¢åˆ†é¡ž' ),
+ 'ChangeEmail' => array( '修改郵箱' ),
'ChangePassword' => array( '修改密碼' ),
'ComparePages' => array( 'é é¢æ¯”較' ),
'Confirmemail' => array( '確èªé›»å­éƒµä»¶' ),
@@ -132,6 +134,7 @@ $specialPageAliases = array(
'Filepath' => array( '文件路徑' ),
'Import' => array( 'å°Žå…¥é é¢' ),
'Invalidateemail' => array( 'ä¸å¯è­˜åˆ¥çš„電郵地å€' ),
+ 'JavaScriptTest' => array( 'JavaScript測試' ),
'BlockList' => array( 'å°ç¦åˆ—表' ),
'LinkSearch' => array( 'æœç´¢ç¶²é éˆæŽ¥' ),
'Listadmins' => array( '管ç†å“¡åˆ—表' ),
@@ -148,6 +151,7 @@ $specialPageAliases = array(
'MIMEsearch' => array( 'MIMEæœç´¢' ),
'Mostcategories' => array( '最多分類é é¢' ),
'Mostimages' => array( '最多éˆæŽ¥æ–‡ä»¶' ),
+ 'Mostinterwikis' => array( '最多跨維基連çµ' ),
'Mostlinked' => array( '最多éˆæŽ¥é é¢' ),
'Mostlinkedcategories' => array( '最多éˆæŽ¥åˆ†é¡ž' ),
'Mostlinkedtemplates' => array( '最多éˆæŽ¥æ¨¡æ¿' ),
@@ -171,7 +175,6 @@ $specialPageAliases = array(
'Recentchanges' => array( '最近更改' ),
'Recentchangeslinked' => array( 'éˆå‡ºæ›´æ”¹' ),
'Revisiondelete' => array( '刪除或æ¢å¾©ç‰ˆæœ¬' ),
- 'RevisionMove' => array( '版本移動' ),
'Search' => array( 'æœç´¢' ),
'Shortpages' => array( '短é é¢' ),
'Specialpages' => array( '特殊é é¢' ),
@@ -203,6 +206,44 @@ $specialPageAliases = array(
'Withoutinterwiki' => array( '沒有跨語言éˆæŽ¥çš„é é¢' ),
);
+$magicWords = array(
+ 'notoc' => array( '0', '__無目錄__', '__无目录__', '__NOTOC__' ),
+ 'nogallery' => array( '0', '__無圖庫__', '__无图库__', '__NOGALLERY__' ),
+ 'forcetoc' => array( '0', '__強制目錄__', '__强显目录__', '__FORCETOC__' ),
+ 'toc' => array( '0', '__目錄__', '__目录__', '__TOC__' ),
+ 'noeditsection' => array( '0', '__無段è½ç·¨è¼¯__', '__无段è½ç¼–辑__', '__NOEDITSECTION__' ),
+ 'currentmonth' => array( '1', '本月', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+ 'currentmonthabbrev' => array( '1', '本月簡稱', '本月简称', 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( '1', '今天', 'CURRENTDAY' ),
+ 'currenttime' => array( '1', '當å‰æ™‚é–“', '此時', '此时', '当å‰æ—¶é—´', 'CURRENTTIME' ),
+ 'img_thumbnail' => array( '1', '縮圖', '缩略图', 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( '1', '縮圖=$1', '缩略图=$1', 'thumbnail=$1', 'thumb=$1' ),
+ 'img_right' => array( '1', 'å³', 'right' ),
+ 'img_left' => array( '1', 'å·¦', 'left' ),
+ 'img_none' => array( '1', 'ç„¡', 'æ— ', 'none' ),
+ 'img_width' => array( '1', '$1åƒç´ ', '$1px' ),
+ 'img_center' => array( '1', '置中', '居中', 'center', 'centre' ),
+ 'img_framed' => array( '1', '有框', 'framed', 'enframed', 'frame' ),
+ 'img_frameless' => array( '1', '無框', '无框', 'frameless' ),
+ 'img_page' => array( '1', 'é =$1', '$1é ', '页数=$1', '$1页', 'page=$1', 'page $1' ),
+ 'img_link' => array( '1', '連çµ=$1', '链接=$1', 'link=$1' ),
+ 'sitename' => array( '1', '網站å稱', '站点å称', 'SITENAME' ),
+ 'ns' => array( '0', 'å字空間', 'å字空间:', 'NS:' ),
+ 'nse' => array( '0', 'å字空間E', 'å字空间E:', 'NSE:' ),
+ 'localurl' => array( '0', '本地URL', '本地URL:', 'LOCALURL:' ),
+ 'localurle' => array( '0', '本地URLE', '本地URLE:', 'LOCALURLE:' ),
+ 'pageid' => array( '0', 'é é¢ID', '页é¢ID', 'PAGEID' ),
+ 'server' => array( '0', '伺æœå™¨', 'æœåŠ¡å™¨', 'SERVER' ),
+ 'servername' => array( '0', '伺æœå™¨å稱', 'æœåŠ¡å™¨å', 'SERVERNAME' ),
+ 'gender' => array( '0', '性別:', '性别:', 'GENDER:' ),
+ 'notitleconvert' => array( '0', '__ä¸è½‰æ›æ¨™é¡Œ__', '__ä¸è½¬æ¢æ ‡é¢˜__', '__NOTITLECONVERT__', '__NOTC__' ),
+ 'nocontentconvert' => array( '0', '__ä¸è½‰æ›å…§å®¹__', '__ä¸è½¬æ¢å†…容__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+ 'displaytitle' => array( '1', '顯示標題', '显示标题', 'DISPLAYTITLE' ),
+ 'currentversion' => array( '1', '當å‰ç‰ˆæœ¬', '当å‰ç‰ˆæœ¬', 'CURRENTVERSION' ),
+ 'hiddencat' => array( '1', '__éš±è—分類__', '__éšè—分类__', '__HIDDENCAT__' ),
+ 'staticredirect' => array( '1', '__éœæ…‹é‡å®šå‘__', '__é™æ€é‡å®šå‘__', '__STATICREDIRECT__' ),
+);
+
$bookstoreList = array(
'åšå®¢ä¾†æ›¸åº—' => 'http://www.books.com.tw/exep/prod/booksfile.php?item=$1',
'三民書店' => 'http://www.sanmin.com.tw/page-qsearch.asp?ct=search_isbn&qu=$1',
@@ -345,6 +386,7 @@ $messages = array(
'newwindow' => '(以新視窗開啟)',
'cancel' => 'å–消',
'moredotdotdot' => '更多...',
+'morenotlisted' => '更多未列出的項目...',
'mypage' => 'é é¢',
'mytalk' => '討論',
'anontalk' => '該IPçš„å°è©±é ',
@@ -356,7 +398,6 @@ $messages = array(
'qbbrowse' => 'ç€è¦½',
'qbedit' => '編輯',
'qbpageoptions' => 'é é¢é¸é …',
-'qbpageinfo' => 'é é¢è¨Šæ¯',
'qbmyoptions' => '我的é¸é …',
'qbspecialpages' => '特殊é é¢',
'faq' => '常見å•é¡Œè§£ç­”',
@@ -379,6 +420,7 @@ $messages = array(
'namespaces' => 'å字空間',
'variants' => '變æ›',
+'navigation-heading' => '導航',
'errorpagetitle' => '錯誤',
'returnto' => '返回到$1。',
'tagline' => '出自{{SITENAME}}',
@@ -619,12 +661,12 @@ $2',
'virus-unknownscanner' => '未知的防病毒:',
# Login and logout pages
-'logouttext' => '您已經登出。
+'logouttext' => "您已經登出。
-您å¯ä»¥ä»¥åŒ¿åæ–¹å¼ç¹¼çºŒä½¿ç”¨{{SITENAME}},或以相åŒæˆ–ä¸åŒç”¨æˆ¶èº«ä»½[[Special:UserLogin|登入]]。
-請注æ„,如果你å†æ¬¡ç™»å…¥ï¼Œæ­¤é æˆ–會繼續顯示,直到您清除ç€è¦½å™¨ç·©å­˜ã€‚',
-'welcomecreation' => '== 歡迎,$1ï¼ ==
-您的賬號已經建立。
+您å¯ä»¥ä»¥åŒ¿åæ–¹å¼ç¹¼çºŒä½¿ç”¨{{SITENAME}},或以相åŒæˆ–ä¸åŒç”¨æˆ¶èº«ä»½<span class='plainlinks'>[$1 登入]</span>。
+請注æ„,如果你å†æ¬¡ç™»å…¥ï¼Œæ­¤é æˆ–會繼續顯示,直到您清除ç€è¦½å™¨ç·©å­˜ã€‚",
+'welcomeuser' => '歡迎,$1ï¼',
+'welcomecreation-msg' => '您的賬號已經建立。
ä¸è¦å¿˜è¨˜è¨­ç½®[[Special:Preferences|{{SITENAME}}的個人åƒæ•¸]]。',
'yourname' => '用戶å:',
'yourpassword' => '您的密碼:',
@@ -648,7 +690,7 @@ $2',
'gotaccount' => '已經æ“有帳號?$1。',
'gotaccountlink' => '登入',
'userlogin-resetlink' => '忘記了你的登錄信æ¯ï¼Ÿ',
-'createaccountmail' => '通éŽé›»éƒµ',
+'createaccountmail' => '使用一個臨時的隨機密碼,並將它發é€åˆ°ä»¥ä¸‹æŒ‡å®šçš„é›»å­éƒµä»¶åœ°å€',
'createaccountreason' => 'ç†ç”±ï¼š',
'badretype' => '您所輸入的密碼並ä¸ç›¸åŒã€‚',
'userexists' => '!您所輸入的用戶å稱已經存在,請å¦é¸ä¸€å€‹å稱。',
@@ -715,6 +757,7 @@ $2',
# Email sending
'php-mail-error-unknown' => '在 PHP çš„ mail() åƒæ•¸ä¸­çš„未知錯誤',
'user-mail-no-addy' => '嘗試ä¸å¸¶é›»éƒµåœ°å€ç™¼é€é›»éƒµã€‚',
+'user-mail-no-body' => '試圖發é€ç©ºçš„或主體ä¸åˆç†çŸ­çš„é›»å­éƒµä»¶ã€‚',
# Change password dialog
'resetpass' => '更改密碼',
@@ -776,6 +819,7 @@ $2
'changeemail-oldemail' => '當å‰é›»éƒµåœ°å€ï¼š',
'changeemail-newemail' => '新電郵地å€ï¼š',
'changeemail-none' => '(無)',
+'changeemail-password' => '您的{{SITENAME}}密碼:',
'changeemail-submit' => '更改電郵',
'changeemail-cancel' => 'å–消',
@@ -949,7 +993,6 @@ $2
'template-semiprotected' => '(åŠä¿è­·ï¼‰',
'hiddencategories' => '這個é é¢æ˜¯å±¬æ–¼$1個隱è—分類的æˆå“¡:',
'edittools' => '<!-- 此處的文字將被顯示在編輯和上傳表單以下。 -->',
-'nocreatetitle' => '創建é é¢å—é™',
'nocreatetext' => '{{SITENAME}}é™åˆ¶äº†å‰µå»ºæ–°é é¢çš„功能。{{GENDER:|ä½ |妳|ä½ }}å¯ä»¥è¿”回並編輯已有的é é¢ï¼Œæˆ–者[[Special:UserLogin|登錄或創建新賬戶]]。',
'nocreate-loggedin' => '您並無許å¯æ¬ŠåŽ»å‰µå»ºæ–°é é¢ã€‚',
'sectioneditnotsupported-title' => 'ä¸æ”¯æŒæ®µè½ç·¨è¼¯',
@@ -973,6 +1016,15 @@ $2
'edit-already-exists' => 'ä¸å¯ä»¥å»ºç«‹ä¸€å€‹æ–°é é¢ã€‚
它已經存在。',
'defaultmessagetext' => 'é è¨­è¨Šæ¯æ–‡å­—',
+'content-failed-to-parse' => '未能轉æ›$2 內容æˆç‚º$1:$3',
+'invalid-content-data' => '內容資料無效',
+'content-not-allowed-here' => '[[$2]]é é¢ä¸Šä¸å…許「$1ã€å…§å®¹',
+
+# Content models
+'content-model-wikitext' => 'wiki語法',
+'content-model-text' => '純文字',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
# Parser/template warnings
'expensive-parserfunction-warning' => '警告: 這個é é¢æœ‰å¤ªå¤šè€—費的語法功能呼å«ã€‚
@@ -1318,9 +1370,9 @@ $1",
'prefs-emailconfirm-label' => 'é›»å­éƒµä»¶ç¢ºèªï¼š',
'prefs-textboxsize' => '編輯框大å°',
'youremail' => 'é›»å­éƒµä»¶ï¼š',
-'username' => '用戶å:',
-'uid' => '用戶ID:',
-'prefs-memberingroups' => '{{PLURAL:$1|群組}}:',
+'username' => '{{GENDER:$1|用戶å}}:',
+'uid' => '{{GENDER:$1|用戶ID}}:',
+'prefs-memberingroups' => '{{PLURAL:$1|群組}}{{GENDER:$2|æˆå“¡}}:',
'prefs-registration' => '註冊時間:',
'yourrealname' => '真實姓å:',
'yourlanguage' => '語言:',
@@ -1469,12 +1521,13 @@ $1",
'right-sendemail' => '發電å­éƒµä»¶çµ¦å…¶ä»–用戶',
'right-passwordreset' => '查看é‡ç½®å¯†ç¢¼éƒµä»¶',
+# Special:Log/newusers
+'newuserlogpage' => '新進用戶å冊',
+'newuserlogpagetext' => '這是一個最近被創建用戶的新日誌',
+
# User rights log
'rightslog' => '用戶權é™æ—¥èªŒ',
'rightslogtext' => '以下記錄了用戶權é™çš„更改記錄。',
-'rightslogentry' => 'å°‡ $1 的權é™å¾ž $2 改為 $3',
-'rightslogentry-autopromote' => '自動由$2晉å‡è‡³$3',
-'rightsnone' => 'ç„¡',
# Associated actions - in the sentence "You do not have permission to X"
'action-read' => '閱讀這個é é¢',
@@ -1694,6 +1747,7 @@ $1',
'backend-fail-notsame' => '「$1ã€å·²å­˜åœ¨ä¸åŒçš„檔案。',
'backend-fail-invalidpath' => '「$1ã€ä¸æ˜¯æœ‰æ•ˆçš„存儲路徑。',
'backend-fail-delete' => '無法刪除「$1ã€æª”案。',
+'backend-fail-describe' => '無法修改檔案「$1ã€çš„元數據。',
'backend-fail-alreadyexists' => '檔案「$1ã€å·²å­˜åœ¨ã€‚',
'backend-fail-store' => '無法在$2存儲文件$1。',
'backend-fail-copy' => '無法複製文件$1到$2。',
@@ -1932,6 +1986,12 @@ Template:消歧義
Template:消除歧義',
'disambiguations-text' => "以下的é é¢éƒ½æœ‰è‡³å°‘一個連到'''消歧義é '''çš„éˆæŽ¥ï¼Œä½†å®ƒå€‘應éˆæŽ¥åˆ°åˆé©çš„é é¢ã€‚<br />一個é é¢å¦‚果使用了[[MediaWiki:Disambiguationspage]]內的模æ¿ï¼Œå‰‡æœƒè¢«è¦–為消歧義é ã€‚",
+'pageswithprop' => '有é é¢å±¬æ€§çš„é é¢',
+'pageswithprop-legend' => '有é é¢å±¬æ€§çš„é é¢',
+'pageswithprop-text' => 'æ­¤é åˆ—出所有é é¢ä½¿ç”¨äº†ç‰¹å®šçš„é é¢å±¬æ€§ã€‚',
+'pageswithprop-prop' => '屬性å稱:',
+'pageswithprop-submit' => '進入',
+
'doubleredirects' => 'é›™é‡é‡å®šå‘é é¢',
'doubleredirectstext' => '這一é åˆ—出所有é‡å®šå‘é é¢é‡å®šå‘到å¦ä¸€å€‹é‡å®šå‘é çš„é é¢ã€‚æ¯ä¸€è¡Œéƒ½åŒ…å«åˆ°ç¬¬ä¸€å’Œç¬¬äºŒå€‹é‡å®šå‘é é¢çš„連çµï¼Œä»¥åŠç¬¬äºŒå€‹é‡å®šå‘é é¢çš„目標,通常顯示的都會是"真正"的目標é é¢ï¼Œä¹Ÿå°±æ˜¯ç¬¬ä¸€å€‹é‡å®šå‘é é¢æ‡‰è©²æŒ‡å‘çš„é é¢ã€‚
<del>已劃去</del>的為已經解決之項目。',
@@ -2082,7 +2142,7 @@ Template:消除歧義',
'linksearch-ns' => 'å字空間:',
'linksearch-ok' => 'æœå°‹',
'linksearch-text' => 'å¯ä½¿ç”¨é€šé…符,如“*.wikipedia.orgâ€ã€‚至少需è¦ä¸€å€‹é ‚級域å,例如“*.orgâ€ã€‚<br />
-支æŒçš„å”議:<code>$1</code>(若沒有指定å”議,é è¨­ç‚ºhttp://)。',
+支æŒçš„{{PLURAL:$2|å”è­°|å”è­°}}:<code>$1</code>(若沒有指定å”議,é è¨­ç‚ºhttp://)。',
'linksearch-line' => '$1 連自 $2',
'linksearch-error' => 'è¬ç”¨å­—元僅å¯åœ¨ä¸»æ©Ÿå稱的開頭使用。',
@@ -2101,10 +2161,6 @@ Template:消除歧義',
'activeusers-hidesysops' => 'éš±è—管ç†å“¡',
'activeusers-noresult' => '找ä¸åˆ°ç”¨æˆ¶ã€‚',
-# Special:Log/newusers
-'newuserlogpage' => '新進用戶å冊',
-'newuserlogpagetext' => '這是一個最近被創建用戶的新日誌',
-
# Special:ListGroupRights
'listgrouprights' => '用戶群組權é™',
'listgrouprights-summary' => '以下é¢æ˜¯ä¸€å€‹åœ¨é€™å€‹wiki中定義出來的用戶權é™æ¸…單,以åŠå®ƒå€‘çš„å­˜å–權。
@@ -2201,20 +2257,23 @@ Template:消除歧義',
'enotif_mailer' => '{{SITENAME}}郵件通知器',
'enotif_reset' => '將所有é é¢æ¨™ç‚ºå·²é–±è®€',
-'enotif_newpagetext' => '這是新建é é¢ã€‚',
'enotif_impersonal_salutation' => '{{SITENAME}}用戶',
-'changed' => '更改',
-'created' => '建立了',
-'enotif_subject' => '{{SITENAME}}é é¢â€œ$PAGETITLEâ€å·²è¢«$PAGEEDITOR$CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}}的「$1ã€é é¢è¢«$2刪除',
+'enotif_subject_created' => '{{SITENAME}}的「$1ã€é é¢è¢«$2建立',
+'enotif_subject_moved' => '{{SITENAME}}的「$1ã€é é¢è¢«$2移動',
+'enotif_subject_restored' => '{{SITENAME}}的「$1ã€é é¢è¢«$2æ¢å¾©',
+'enotif_subject_changed' => '{{SITENAME}}的「$1ã€é é¢è¢«$2修改',
+'enotif_body_intro_deleted' => '{{SITENAME}}的「$1ã€é é¢æ–¼$PAGEEDITDATE被$2刪除,請見$3。',
+'enotif_body_intro_created' => '{{SITENAME}}的「$1ã€é é¢æ–¼$PAGEEDITDATE被$2建立,請見$3ç€è¦½ç•¶å‰ç‰ˆæœ¬ã€‚。',
+'enotif_body_intro_moved' => '{{SITENAME}}的「$1ã€é é¢æ–¼$PAGEEDITDATE被$2移動,請見$3ç€è¦½ç•¶å‰ç‰ˆæœ¬ã€‚',
+'enotif_body_intro_restored' => '{{SITENAME}}的「$1ã€é é¢æ–¼$PAGEEDITDATE被$2æ¢å¾©ï¼Œè«‹è¦‹$3ç€è¦½ç•¶å‰ç‰ˆæœ¬ã€‚',
+'enotif_body_intro_changed' => '{{SITENAME}}的「$1ã€é é¢æ–¼$PAGEEDITDATE被$2修改,請見 $3 ç€è¦½ç•¶å‰ç‰ˆæœ¬ã€‚',
'enotif_lastvisited' => 'è«‹åƒé–± $1 檢視你上次訪å•å¾Œçš„所有更改。',
'enotif_lastdiff' => 'è«‹åƒé–± $1 檢視該更改。',
'enotif_anon_editor' => '匿å用戶$1',
'enotif_body' => '$WATCHINGUSERNAME:
-
-{{SITENAME}}çš„é é¢$PAGETITLE已經於$PAGEEDITDATEç”±$PAGEEDITOR$CHANGEDORCREATED,請見 $PAGETITLE_URL ç€è¦½ç¾åœ¨çš„版本。
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
編輯摘è¦ï¼š$PAGESUMMARY $PAGEMINOREDIT
@@ -2223,7 +2282,7 @@ $NEWPAGE
郵件:$PAGEEDITOR_EMAIL
本站:$PAGEEDITOR_WIKI
-在您訪å•æ­¤é ä¹‹å‰ï¼Œå°‡ä¾†çš„更改將ä¸æœƒå‘您發通知。您也å¯ä»¥åœ¨ç›£è¦–列表中é‡è¨­æ‚¨æ‰€æœ‰ç›£è¦–é é¢çš„通知標記。
+在您訪å•æ­¤é ä¹‹å‰ï¼Œå°‡ä¾†çš„更改將ä¸æœƒå‘您發出通知。您也å¯ä»¥åœ¨ç›£è¦–列表中é‡è¨­æ‚¨æ‰€æœ‰ç›£è¦–é é¢çš„通知標記。
{{SITENAME}}通知系統啟
@@ -2234,11 +2293,13 @@ $NEWPAGE
更改監視列表設定:
{{canonicalurl:{{#special:EditWatchlist}}}}
-從監視列表中刪除此é é¢ï¼š
+從監視列表中刪除此é é¢ï¼š
$UNWATCHURL
回饋和其他幫助:
{{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => '建立了',
+'changed' => '更改',
# Delete
'deletepage' => '刪除é é¢',
@@ -2306,6 +2367,8 @@ $UNWATCHURL
'prot_1movedto2' => '[[$1]]移動到[[$2]]',
'protect-badnamespace-title' => 'ä¸å¯è¢«ä¿è­·çš„å字空間',
'protect-badnamespace-text' => '這個å字空間內的é é¢ç„¡æ³•è¢«ä¿è­·ã€‚',
+'protect-norestrictiontypes-text' => 'æ­¤é ä¸å¯è¢«ä¿è­·å› æ²’有任何é™åˆ¶å¯ç”¨ã€‚',
+'protect-norestrictiontypes-title' => 'ä¸å¯ä¿è­·çš„é é¢',
'protect-legend' => '確èªä¿è­·',
'protectcomment' => 'ç†ç”±ï¼š',
'protectexpiry' => '到期:',
@@ -2324,6 +2387,7 @@ $UNWATCHURL
'protect-fallback' => '僅å…許有「$1ã€æ¬Šé™çš„用戶',
'protect-level-autoconfirmed' => '僅å…許自動確èªä½¿ç”¨è€…',
'protect-level-sysop' => '僅å…許管ç†å“¡',
+'protect-summary-desc' => '[$1=$2]($3)',
'protect-summary-cascade' => '連鎖',
'protect-expiring' => '終止於 $1 (UTC)',
'protect-expiring-local' => '$1到期',
@@ -2387,7 +2451,7 @@ $UNWATCHURL
'undeletedrevisions' => '$1個修訂版本已經æ¢å¾©',
'undeletedrevisions-files' => '$1 個版本和 $2 個檔案被æ¢å¾©',
'undeletedfiles' => '$1 個檔案被æ¢å¾©',
-'cannotundelete' => 'æ¢å¾©å¤±æ•—ï¼›å¯èƒ½ä¹‹å‰å·²ç¶“被其他人æ¢å¾©ã€‚',
+'cannotundelete' => 'æ¢å¾©å¤±æ•—:$1',
'undeletedpage' => "'''$1已經被æ¢å¾©''' è«‹åƒè€ƒ[[Special:Log/delete|刪除日誌]]來查詢刪除åŠæ¢å¾©è¨˜éŒ„。",
'undelete-header' => '如è¦æŸ¥è©¢æœ€è¿‘的記錄請åƒé–±[[Special:Log/delete|刪除日誌]]。',
'undelete-search-title' => 'æœç´¢å·²åˆªé™¤é é¢',
@@ -2416,7 +2480,7 @@ $1',
'blanknamespace' => '(主)',
# Contributions
-'contributions' => '用戶貢ç»',
+'contributions' => '{{GENDER:$1|用戶}}è²¢ç»',
'contributions-title' => '$1的用戶貢ç»',
'mycontris' => '我的貢ç»',
'contribsub2' => '$1çš„è²¢ç» ï¼ˆ$2)',
@@ -2688,6 +2752,7 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
'immobile-target-namespace-iw' => '垮維基連çµåœ¨ç§»å‹•é é¢ä¸­æ˜¯ç„¡æ•ˆçš„目標。',
'immobile-source-page' => '這個é é¢ä¸èƒ½ç§»å‹•ã€‚',
'immobile-target-page' => '無法移動至目標標題中。',
+'bad-target-model' => '所需的目的地使用ä¸åŒçš„內容模å¼ã€‚ä¸å¯ä»¥å¾ž$1轉æ›åˆ° $2 。',
'imagenocrossnamespace' => 'ä¸å¯ä»¥ç§»å‹•æª”案到éžæª”案å字空間',
'nonfile-cannot-move-to-file' => 'ä¸å¯ä»¥ç§»å‹•éžæª”案到檔案å字空間',
'imagetypemismatch' => '該新副檔åä¸åŒ¹é…它的類型',
@@ -2799,6 +2864,7 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
'import-error-interwiki' => 'é é¢"$1"未能導入,這是因為他的é é¢å稱é ç•™äº†ä¾›è·¨ç¶­åŸºé€£çµä½¿ç”¨ã€‚',
'import-error-special' => '「$1ã€æœªèƒ½å°Žå…¥å› ç‚ºè©²é é¢ä½¿ç”¨ä¸€å€‹ä¸èƒ½å‰µå»ºé é¢çš„特殊å字空間。',
'import-error-invalid' => '「$1ã€ä¸èƒ½å°Žå…¥ï¼Œå› ç‚ºå字無效。',
+'import-error-unserialize' => 'é é¢ã€Œ$1ã€çš„修訂版本「$2ã€ä¸èƒ½ååºåˆ—。該修訂版本是以$3內容模å¼åºåˆ—為$4。',
'import-options-wrong' => '{{PLURAL:$2|é¸é …}}出錯:<nowiki>$1</nowiki>',
'import-rootpage-invalid' => '指定的根é æ¨™é¡Œç„¡æ•ˆã€‚',
'import-rootpage-nosubpage' => 'å字空間「$1ã€çš„æ ¹é é¢ä¸å…許å­é é¢ã€‚',
@@ -2813,7 +2879,6 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
# JavaScriptTest
'javascripttest' => 'JavaScript測試',
-'javascripttest-disabled' => '此功能在此Wiki上未被使用。',
'javascripttest-title' => 'é‹è¡Œ$1測試。',
'javascripttest-pagetext-noframework' => '這個é é¢é ç•™äº†ä½œJavaScript測試。',
'javascripttest-pagetext-unknownframework' => '未知的測試框架「$1ã€ã€‚',
@@ -2958,11 +3023,13 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
'pageinfo-default-sort' => 'é è¨­æŽ’åºå­—:',
'pageinfo-length' => 'é é¢é•·åº¦ (以ä½å…ƒçµ„為單ä½ï¼‰',
'pageinfo-article-id' => 'é é¢ç·¨è™Ÿ',
+'pageinfo-language' => 'é é¢å…§å®¹èªžè¨€',
'pageinfo-robot-policy' => 'æœå°‹å¼•æ“Žç‹€æ…‹',
'pageinfo-robot-index' => 'å¯ç´¢å¼•',
'pageinfo-robot-noindex' => 'ä¸å¯ç´¢å¼•',
'pageinfo-views' => '觀看次數',
'pageinfo-watchers' => 'é é¢ç›£è¦–者數目',
+'pageinfo-few-watchers' => 'å°‘æ–¼$1å監視者',
'pageinfo-redirects-name' => 'é‡å®šå‘到此é ',
'pageinfo-subpages-name' => 'æ­¤é é¢çš„å­é é¢',
'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|é‡å®šå‘|é‡å®šå‘}}; $3 {{PLURAL:$3|éžé‡å®šå‘|éžé‡å®šå‘}})',
@@ -2977,6 +3044,19 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
'pageinfo-magic-words' => '魔術{{PLURAL:$1|字|字}}($1)',
'pageinfo-hidden-categories' => 'éš±è—{{PLURAL:$1|分類|分類}}($1)',
'pageinfo-templates' => '使用的模æ¿ï¼ˆ$1)',
+'pageinfo-transclusions' => '使用的é é¢ï¼ˆ$1)',
+'pageinfo-toolboxlink' => 'é é¢è³‡è¨Š',
+'pageinfo-redirectsto' => 'é‡å®šå‘到',
+'pageinfo-redirectsto-info' => '資訊',
+'pageinfo-contentpage' => '計算為內容é ',
+'pageinfo-contentpage-yes' => '是',
+'pageinfo-protect-cascading' => '從此開始連鎖ä¿è­·',
+'pageinfo-protect-cascading-yes' => '是',
+'pageinfo-protect-cascading-from' => '從此連鎖ä¿è­·',
+'pageinfo-category-info' => '分類資訊',
+'pageinfo-category-pages' => 'é é¢æ•¸é‡',
+'pageinfo-category-subcats' => 'å­åˆ†é¡žæ•¸é‡',
+'pageinfo-category-files' => '編輯數é‡',
# Skin names
'skinname-standard' => '標準',
@@ -2995,6 +3075,8 @@ $1被å°ç¦çš„ç†ç”±æ˜¯â€œ$2â€',
'markedaspatrollederror' => 'ä¸èƒ½æ¨™èªŒç‚ºå·²æª¢æŸ¥',
'markedaspatrollederrortext' => '{{GENDER:|ä½ |妳|ä½ }}需è¦æŒ‡å®šæŸå€‹ç‰ˆæœ¬æ‰èƒ½æ¨™èªŒç‚ºå·²æª¢æŸ¥ã€‚',
'markedaspatrollederror-noautopatrol' => '您無法將{{GENDER:|你|妳|你}}自己所作的更改標記為已檢查。',
+'markedaspatrollednotify' => '$1的更改已標記為已巡查。',
+'markedaspatrollederrornotify' => '標記為巡查失敗。',
# Patrol log
'patrol-log-page' => '巡查日誌',
@@ -3028,6 +3110,7 @@ $1',
'file-nohires' => '無更高解åƒåº¦å¯æ供。',
'svg-long-desc' => 'SVG 檔案,表é¢å¤§å°ï¼š$1 × $2 åƒç´ ï¼Œæª”案大å°ï¼š$3',
'svg-long-desc-animated' => 'SVG 動畫檔案,表é¢å¤§å°ï¼š$1 × $2 åƒç´ ï¼Œæª”案大å°ï¼š$3',
+'svg-long-error' => '無效的SVG檔案:$1',
'show-big-image' => '完整解åƒåº¦',
'show-big-image-preview' => 'æ­¤é è¦½çš„大å°ï¼š$1.',
'show-big-image-other' => '其他{{PLURAL:$2||}}解æžåº¦ï¼š$1。',
@@ -3057,7 +3140,10 @@ $1',
'minutes' => '$1分é¾',
'hours' => '$1å°æ™‚',
'days' => '$1天',
+'months' => '{{PLURAL:$1|$1個月|$1個月}}',
+'years' => '{{PLURAL:$1|$1å¹´|$1å¹´}}',
'ago' => '$1å‰',
+'just-now' => '剛æ‰',
# Bad image list
'bad_image_list' => '請按照下列格å¼ç·¨å¯«ï¼š
@@ -3570,6 +3656,7 @@ $5
# Scary transclusion
'scarytranscludedisabled' => '[è·¨wiki轉æ›ä»£ç¢¼ä¸å¯ç”¨]',
'scarytranscludefailed' => '[模æ¿$1讀å–失敗]',
+'scarytranscludefailed-httpstatus' => '[模æ¿$1讀å–失敗:HTTP$2]',
'scarytranscludetoolong' => '[URL 地å€å¤ªé•·]',
# Delete conflict
@@ -3685,6 +3772,7 @@ $5
'version-license' => '授權',
'version-poweredby-credits' => "這個 Wiki 由 '''[//www.mediawiki.org/ MediaWiki]''' 驅動,版權所有 © 2001-$1 $2。",
'version-poweredby-others' => '其他',
+'version-credits-summary' => '我們感è¬ä»¥ä¸‹äººå£«ç‚º[[Special:Version|MediaWiki]]作出的貢ç»ã€‚',
'version-license-info' => 'MediaWiki為自由軟件;您å¯ä¾æ“šè‡ªç”±è»Ÿä»¶åŸºé‡‘會所發表的GNU通用公共授權æ¢æ¬¾è¦å®šï¼Œå°±æœ¬ç¨‹å¼å†ç‚ºç™¼ä½ˆèˆ‡ï¼æˆ–修改;無論您ä¾æ“šçš„是本授權的第二版或(您自行é¸æ“‡çš„)任一日後發行的版本。
MediaWiki是基於使用目的而加以發佈,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼›äº¦ç„¡å°é©å”®æ€§æˆ–特定目的é©ç”¨æ€§æ‰€ç‚ºçš„默示性擔ä¿ã€‚詳情請åƒç…§GNU通用公共授權。
@@ -3802,14 +3890,14 @@ MediaWiki是基於使用目的而加以發佈,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼
'logentry-delete-delete' => '$1刪除é é¢$3',
'logentry-delete-restore' => '$1æ¢å¾©é é¢$3',
'logentry-delete-event' => '$1已更改$3中$5項日誌的å¯è¦‹æ€§ï¼š$4',
-'logentry-delete-revision' => '$1已更改$3中{{PLURAL:$5|$5個歷å²ç‰ˆæœ¬|$5個歷å²ç‰ˆæœ¬}}çš„å¯è¦‹æ€§ï¼š$4',
-'logentry-delete-event-legacy' => '$1已更改$3中日誌的å¯è¦‹æ€§',
-'logentry-delete-revision-legacy' => '$1已更改$3中歷å²ç‰ˆæœ¬çš„å¯è¦‹æ€§',
-'logentry-suppress-delete' => '$1已隱è—é é¢$3',
-'logentry-suppress-event' => '$1å·²ä¸å¯è¦‹åœ°æ›´æ”¹$3中{{PLURAL:$5|$5項日誌|$5項日誌}}çš„å¯è¦‹æ€§ï¼š$4',
-'logentry-suppress-revision' => '$1å·²ä¸å¯è¦‹åœ°æ›´æ”¹$3中{{PLURAL:$5|$5個歷å²ç‰ˆæœ¬|$5個歷å²ç‰ˆæœ¬}}çš„å¯è¦‹æ€§ï¼š$4',
-'logentry-suppress-event-legacy' => '$1å·²ä¸å¯è¦‹åœ°æ›´æ”¹$3中日誌的å¯è¦‹æ€§',
-'logentry-suppress-revision-legacy' => '$1å·²ä¸å¯è¦‹åœ°æ›´æ”¹$3中歷å²ç‰ˆæœ¬çš„å¯è¦‹æ€§',
+'logentry-delete-revision' => '$1å·²{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5個歷å²ç‰ˆæœ¬|$5個歷å²ç‰ˆæœ¬}}çš„å¯è¦‹æ€§ï¼š$4',
+'logentry-delete-event-legacy' => '$1{{GENDER:$2|已更改}}$3中日誌的å¯è¦‹æ€§',
+'logentry-delete-revision-legacy' => '$1{{GENDER:$2|已更改}}$3中歷å²ç‰ˆæœ¬çš„å¯è¦‹æ€§',
+'logentry-suppress-delete' => '$1{{GENDER:$2|已隱è—}}é é¢$3',
+'logentry-suppress-event' => '$1å·²ä¸å¯è¦‹åœ°{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5項日誌|$5項日誌}}çš„å¯è¦‹æ€§ï¼š$4',
+'logentry-suppress-revision' => '$1å·²ä¸å¯è¦‹åœ°{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5個歷å²ç‰ˆæœ¬|$5個歷å²ç‰ˆæœ¬}}çš„å¯è¦‹æ€§ï¼š$4',
+'logentry-suppress-event-legacy' => '$1å·²ä¸å¯è¦‹åœ°{{GENDER:$2|更改}}$3中日誌的å¯è¦‹æ€§',
+'logentry-suppress-revision-legacy' => '$1å·²ä¸å¯è¦‹åœ°{{GENDER:$2|更改}}$3中歷å²ç‰ˆæœ¬çš„å¯è¦‹æ€§',
'revdelete-content-hid' => 'éš±è—內容',
'revdelete-summary-hid' => 'éš±è—編輯摘è¦',
'revdelete-uname-hid' => 'éš±è—用戶å',
@@ -3822,13 +3910,17 @@ MediaWiki是基於使用目的而加以發佈,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼
'logentry-move-move-noredirect' => '$1移動$3é é¢è‡³$4,ä¸ç•™é‡å®šå‘',
'logentry-move-move_redir' => '$1通éŽé‡å®šå‘移動$3é é¢è‡³$4',
'logentry-move-move_redir-noredirect' => '$1通éŽé‡å®šå‘移動$3é é¢è‡³$4,ä¸ç•™é‡å®šå‘',
-'logentry-patrol-patrol' => '$1標記é é¢$3的版本$4為已巡查',
-'logentry-patrol-patrol-auto' => '$1自動標記é é¢$3的版本$4為已巡查',
-'logentry-newusers-newusers' => '已建立用戶「$1ã€',
-'logentry-newusers-create' => '已建立用戶「$1ã€',
+'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-autocreate' => '帳戶$1被自動創建',
-'newuserlog-byemail' => '密碼已由電å­éƒµä»¶å¯„出',
+'logentry-newusers-byemail' => '$1建立用戶$3並電郵密碼給他',
+'logentry-newusers-autocreate' => '用戶$1被自動{{GENDER:$2|建立}}',
+'logentry-rights-rights' => '$1å°‡$3的權é™å¾ž$4改為$5',
+'logentry-rights-rights-legacy' => '$1更改$3的權é™',
+'logentry-rights-autopromote' => '$1的權é™è‡ªå‹•å¾ž$4改為$5',
+'rightsnone' => 'ç„¡',
# Feedback
'feedback-bugornote' => '如果您準備好了詳細æ述一個技術å•é¡Œï¼Œè«‹[$1 報告一個bug]。或者,您å¯ä»¥ä½¿ç”¨ä¸‹é¢çš„簡易表單。您的評論將被添加到é é¢â€œ[$3 $2]â€ï¼Œä¸¦å¸¶æœ‰æ‚¨çš„用戶å和使用的ç€è¦½å™¨ã€‚',
@@ -3881,6 +3973,7 @@ MediaWiki是基於使用目的而加以發佈,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼
'api-error-ok-but-empty' => '內部錯誤:伺æœå™¨æ²’有響應。',
'api-error-overwrite' => 'ä¸å…許覆蓋ç¾æœ‰æª”案。',
'api-error-stashfailed' => '內部錯誤:伺æœå™¨ä¿å­˜è‡¨æ™‚檔案失敗。',
+'api-error-publishfailed' => '內部錯誤:伺æœå™¨ç™¼ä½ˆè‡¨æ™‚檔案失敗。',
'api-error-timeout' => '伺æœå™¨æ²’有在é æœŸçš„時間內回應。',
'api-error-unclassified' => '發生未知錯誤。',
'api-error-unknown-code' => '未知錯誤:$1',
@@ -3901,4 +3994,7 @@ MediaWiki是基於使用目的而加以發佈,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼
'duration-centuries' => '$1個世紀',
'duration-millennia' => '$1åƒå¹´',
+# Image rotation
+'rotate-comment' => '順時é‡æ—‹è½‰åœ–åƒ$1{{PLURAL:$1|度|度}}',
+
);
diff --git a/languages/messages/MessagesZh_hk.php b/languages/messages/MessagesZh_hk.php
index 91be2ec6..dc28646b 100644
--- a/languages/messages/MessagesZh_hk.php
+++ b/languages/messages/MessagesZh_hk.php
@@ -24,7 +24,6 @@ $fallback8bitEncoding = 'Big5-HKSCS';
$specialPageAliases = array(
'ComparePages' => array( 'é é¢æ¯”較' ),
- 'RevisionMove' => array( '移動版本' ),
'Unblock' => array( '解除å°ç¦' ),
);
diff --git a/languages/messages/MessagesZh_min_nan.php b/languages/messages/MessagesZh_min_nan.php
deleted file mode 100644
index 23b4f924..00000000
--- a/languages/messages/MessagesZh_min_nan.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-/** Min Nan (Bân-lâm-gú/é–©å—話)
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
- *
- * @ingroup Language
- * @file
- *
- */
-
-# Inherit everything for now
-$fallback = 'nan';
diff --git a/languages/messages/MessagesZh_tw.php b/languages/messages/MessagesZh_tw.php
index 1fbc4344..7d984604 100644
--- a/languages/messages/MessagesZh_tw.php
+++ b/languages/messages/MessagesZh_tw.php
@@ -25,6 +25,20 @@
$fallback = 'zh-hant, zh-hans';
+$namespaceNames = array(
+ NS_USER => '使用者',
+ NS_USER_TALK => '使用者討論',
+ NS_HELP => '使用說明',
+ NS_HELP_TALK => '使用說明討論',
+);
+
+$namespaceAliases = array(
+ 'Image' => NS_FILE,
+ 'Image_talk' => NS_FILE_TALK,
+ "圖片" => NS_FILE,
+ "圖片討論" => NS_FILE_TALK,
+);
+
$specialPageAliases = array(
'Ancientpages' => array( '最舊é é¢' ),
'Block' => array( '查å°ç”¨æˆ¶' ),
@@ -46,20 +60,6 @@ $specialPageAliases = array(
'Withoutinterwiki' => array( '沒有跨語言éˆæŽ¥çš„é é¢' ),
);
-$namespaceNames = array(
- NS_USER => '使用者',
- NS_USER_TALK => '使用者討論',
- NS_HELP => '使用說明',
- NS_HELP_TALK => '使用說明討論',
-);
-
-$namespaceAliases = array(
- 'Image' => NS_FILE,
- 'Image_talk' => NS_FILE_TALK,
- "圖片" => NS_FILE,
- "圖片討論" => NS_FILE_TALK,
-);
-
$datePreferences = array(
'default',
'minguo',
diff --git a/languages/messages/MessagesZh_yue.php b/languages/messages/MessagesZh_yue.php
deleted file mode 100644
index a2848f40..00000000
--- a/languages/messages/MessagesZh_yue.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-/** Cantonese (粵語/廣æ±è©±)
- *
- * See MessagesQqq.php for message documentation incl. usage of parameters
- * To improve a translation please visit http://translatewiki.net
- *
- * @ingroup Language
- * @file
- *
- */
-
-# Inherit everything for now
-$fallback = 'yue';
diff --git a/languages/messages/MessagesZu.php b/languages/messages/MessagesZu.php
index 9d965c08..380cf32e 100644
--- a/languages/messages/MessagesZu.php
+++ b/languages/messages/MessagesZu.php
@@ -124,9 +124,8 @@ $messages = array(
'internalerror' => 'Icala lingaphakathi',
# Login and logout pages
-'welcomecreation' => '== Umbingelelo, $1! ==
-
-ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}} wakho.',
+'welcomeuser' => 'Umbingelelo, $1!',
+'welcomecreation-msg' => 'Ikhawundi lakho liyadalwa. Musa ukukhohlwa ukuguqula [[Special:Preferences|amakhethelo]] a-Wikipedia wakho.',
'yourname' => 'Isiga',
'yourpassword' => 'Izwi elingenangozi',
'yourpasswordagain' => 'Bhala izwi elingenangozi lakho kabusha',
@@ -259,8 +258,6 @@ ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}}
'unwatch' => "Mus'ukubukela",
'notanarticle' => 'Akulona ikhasi elinakho okuqukethwe',
-'enotif_newpagetext' => 'Lelikhasi liyasha.',
-
# Delete
'deletepage' => 'Sula ikhasi',
'confirm' => 'Qinisekisa',
diff --git a/languages/utils/CLDRPluralRuleEvaluator.php b/languages/utils/CLDRPluralRuleEvaluator.php
index 6b117043..56627f7d 100644
--- a/languages/utils/CLDRPluralRuleEvaluator.php
+++ b/languages/utils/CLDRPluralRuleEvaluator.php
@@ -7,7 +7,25 @@
* @author Niklas Laxstrom, Tim Starling
*
* @copyright Copyright © 2010-2012, Niklas Laxström
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0
+ * or later
+ *
+ * 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
* @since 1.20
*/
@@ -81,6 +99,7 @@ class CLDRPluralRuleEvaluator {
* @param $token string The token string
* @param $left The left operand. If it is an object, its state may be destroyed.
* @param $right The right operand
+ * @throws CLDRPluralRuleError
* @return mixed
*/
private static function doOperation( $token, $left, $right ) {
@@ -131,7 +150,7 @@ class CLDRPluralRuleEvaluator {
* Evaluator helper class representing a range list.
*/
class CLDRPluralRuleEvaluator_Range {
- var $parts = array();
+ public $parts = array();
function __construct( $start, $end = false ) {
if ( $end === false ) {
@@ -208,9 +227,9 @@ class CLDRPluralRuleEvaluator_Range {
* Helper class for converting rules to reverse polish notation (RPN).
*/
class CLDRPluralRuleConverter {
- var $rule, $pos, $end;
- var $operators = array();
- var $operands = array();
+ public $rule, $pos, $end;
+ public $operators = array();
+ public $operands = array();
/**
* Precedence levels. Note that there's no need to worry about associativity
@@ -447,7 +466,7 @@ class CLDRPluralRuleConverter {
* The base class for operators and expressions, describing a region of the input string.
*/
class CLDRPluralRuleConverter_Fragment {
- var $parser, $pos, $length, $end;
+ public $parser, $pos, $length, $end;
function __construct( $parser, $pos, $length ) {
$this->parser = $parser;
@@ -473,7 +492,7 @@ class CLDRPluralRuleConverter_Fragment {
* validation.
*/
class CLDRPluralRuleConverter_Expression extends CLDRPluralRuleConverter_Fragment {
- var $type, $rpn;
+ public $type, $rpn;
function __construct( $parser, $type, $rpn, $pos, $length ) {
parent::__construct( $parser, $pos, $length );
@@ -498,7 +517,7 @@ class CLDRPluralRuleConverter_Expression extends CLDRPluralRuleConverter_Fragmen
* messages), and the binary operator at that location.
*/
class CLDRPluralRuleConverter_Operator extends CLDRPluralRuleConverter_Fragment {
- var $name;
+ public $name;
/**
* Each op type has three characters: left operand type, right operand type and result type
diff --git a/load.php5 b/load.php5
index 728530fa..9471c650 100644
--- a/load.php5
+++ b/load.php5
@@ -1,7 +1,7 @@
<?php
/**
* Version of load.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
*
* 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
diff --git a/maintenance/7zip.inc b/maintenance/7zip.inc
index 6bb06668..590cad23 100644
--- a/maintenance/7zip.inc
+++ b/maintenance/7zip.inc
@@ -32,7 +32,7 @@
* @ingroup Maintenance
*/
class SevenZipStream {
- var $stream;
+ protected $stream;
private function stripPath( $path ) {
$prefix = 'mediawiki.compress.7z://';
diff --git a/maintenance/Doxyfile b/maintenance/Doxyfile
index e3ba4e5a..e6862acd 100644
--- a/maintenance/Doxyfile
+++ b/maintenance/Doxyfile
@@ -62,7 +62,8 @@ ALIASES = "type{1}=<b> \1 </b>:" \
"protected=\access protected" \
"public=\access public" \
"copyright=\note" \
- "license=\note"
+ "license=\note" \
+ "codeCoverageIgnore="
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
@@ -171,7 +172,9 @@ FILE_PATTERNS = *.c \
*.PHP5 \
*.M \
*.MM \
- *.PY
+ *.PY \
+ *.txt \
+ README
RECURSIVE = YES
EXCLUDE_SYMLINKS = YES
EXCLUDE_PATTERNS = LocalSettings.php AdminSettings.php StartProfiler.php .svn */.git/* {{EXCLUDE_PATTERNS}}
diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php
index 69d11313..a13453df 100644
--- a/maintenance/Maintenance.php
+++ b/maintenance/Maintenance.php
@@ -109,6 +109,12 @@ abstract class Maintenance {
private $mDb = null;
/**
+ * Used when creating separate schema files.
+ * @var resource
+ */
+ public $fileHandle;
+
+ /**
* List of all the core maintenance scripts. This is added
* to scripts added by extensions in $wgMaintenanceScripts
* and returned by getMaintenanceScripts()
@@ -336,7 +342,7 @@ abstract class Maintenance {
*/
protected function error( $err, $die = 0 ) {
$this->outputChanneled( false );
- if ( php_sapi_name() == 'cli' ) {
+ if ( PHP_SAPI == 'cli' ) {
fwrite( STDERR, $err . "\n" );
} else {
print $err;
@@ -482,19 +488,11 @@ abstract class Maintenance {
$this->error( 'Cannot get command line arguments, register_argc_argv is set to false', true );
}
- if ( version_compare( phpversion(), '5.2.4' ) >= 0 ) {
- // Send PHP warnings and errors to stderr instead of stdout.
- // This aids in diagnosing problems, while keeping messages
- // out of redirected output.
- if ( ini_get( 'display_errors' ) ) {
- ini_set( 'display_errors', 'stderr' );
- }
-
- // Don't touch the setting on earlier versions of PHP,
- // as setting it would disable output if you'd wanted it.
-
- // Note that exceptions are also sent to stderr when
- // command-line mode is on, regardless of PHP version.
+ // Send PHP warnings and errors to stderr instead of stdout.
+ // This aids in diagnosing problems, while keeping messages
+ // out of redirected output.
+ if ( ini_get( 'display_errors' ) ) {
+ ini_set( 'display_errors', 'stderr' );
}
$this->loadParamsAndArgs();
@@ -515,8 +513,11 @@ abstract class Maintenance {
define( 'MEDIAWIKI', true );
$wgCommandLineMode = true;
+
# Turn off output buffering if it's on
- @ob_end_flush();
+ while( ob_get_level() > 0 ) {
+ ob_end_flush();
+ }
$this->validateParamsAndArgs();
}
@@ -922,7 +923,7 @@ 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 );
+ "Use --conf to specify it.", true );
}
$wgCommandLineMode = true;
return $settingsFile;
@@ -938,13 +939,9 @@ abstract class Maintenance {
$dbw = $this->getDB( DB_MASTER );
$dbw->begin( __METHOD__ );
- $tbl_arc = $dbw->tableName( 'archive' );
- $tbl_rev = $dbw->tableName( 'revision' );
- $tbl_txt = $dbw->tableName( 'text' );
-
# Get "active" text records from the revisions table
$this->output( 'Searching for active text records in revisions table...' );
- $res = $dbw->query( "SELECT DISTINCT rev_text_id FROM $tbl_rev" );
+ $res = $dbw->select( 'revision', 'rev_text_id', array(), __METHOD__, array( 'DISTINCT' ) );
foreach ( $res as $row ) {
$cur[] = $row->rev_text_id;
}
@@ -952,16 +949,19 @@ abstract class Maintenance {
# Get "active" text records from the archive table
$this->output( 'Searching for active text records in archive table...' );
- $res = $dbw->query( "SELECT DISTINCT ar_text_id FROM $tbl_arc" );
+ $res = $dbw->select( 'archive', 'ar_text_id', array(), __METHOD__, array( 'DISTINCT' ) );
foreach ( $res as $row ) {
- $cur[] = $row->ar_text_id;
+ # old pre-MW 1.5 records can have null ar_text_id's.
+ if ( $row->ar_text_id !== null ) {
+ $cur[] = $row->ar_text_id;
+ }
}
$this->output( "done.\n" );
# Get the IDs of all text records not in these sets
$this->output( 'Searching for inactive text records...' );
- $set = implode( ', ', $cur );
- $res = $dbw->query( "SELECT old_id FROM $tbl_txt WHERE old_id NOT IN ( $set )" );
+ $cond = 'old_id NOT IN ( ' . $dbw->makeList( $cur ) . ' )';
+ $res = $dbw->select( 'text', 'old_id', array( $cond ), __METHOD__, array( 'DISTINCT' ) );
$old = array();
foreach ( $res as $row ) {
$old[] = $row->old_id;
@@ -975,8 +975,7 @@ abstract class Maintenance {
# Delete as appropriate
if ( $delete && $count ) {
$this->output( 'Deleting...' );
- $set = implode( ', ', $old );
- $dbw->query( "DELETE FROM $tbl_txt WHERE old_id IN ( $set )" );
+ $dbw->delete( 'text', array( 'old_id' => $old ), __METHOD__ );
$this->output( "done.\n" );
}
@@ -1068,7 +1067,7 @@ abstract class Maintenance {
*/
private function lockSearchindex( &$db ) {
$write = array( 'searchindex' );
- $read = array( 'page', 'revision', 'text', 'interwiki', 'l10n_cache' );
+ $read = array( 'page', 'revision', 'text', 'interwiki', 'l10n_cache', 'user' );
$db->lockTables( $read, $write, __CLASS__ . '::' . __METHOD__ );
}
@@ -1144,7 +1143,8 @@ abstract class Maintenance {
$title = $titleObj->getPrefixedDBkey();
$this->output( "$title..." );
# Update searchindex
- $u = new SearchUpdate( $pageId, $titleObj->getText(), $rev->getText() );
+ # TODO: pass the Content object to SearchUpdate, let the search engine decide how to deal with it.
+ $u = new SearchUpdate( $pageId, $titleObj->getText(), $rev->getContent()->getTextForSearchIndex() );
$u->doUpdate();
$this->output( "\n" );
}
@@ -1208,7 +1208,7 @@ abstract class Maintenance {
$encPrompt = wfEscapeShellArg( $prompt );
$command = "read -er -p $encPrompt && echo \"\$REPLY\"";
$encCommand = wfEscapeShellArg( $command );
- $line = wfShellExec( "$bash -c $encCommand", $retval );
+ $line = wfShellExec( "$bash -c $encCommand", $retval, array(), array( 'walltime' => 0 ) );
if ( $retval == 0 ) {
return $line;
diff --git a/maintenance/Makefile b/maintenance/Makefile
index 30b568dc..25554751 100644
--- a/maintenance/Makefile
+++ b/maintenance/Makefile
@@ -8,7 +8,9 @@ test:
doc:
php mwdocgen.php --all
- @echo 'Doc generation done. Look at ./docs/html/'
+ ./mwjsduck-gen
+ @echo 'PHP documentation (by Doxygen) in ./docs/html/'
+ @echo 'JS documentation (by JSDuck) in ./docs/js/'
man:
php mwdocgen.php --all --generate-man
diff --git a/maintenance/README b/maintenance/README
index d6e76917..5cb6f5f5 100644
--- a/maintenance/README
+++ b/maintenance/README
@@ -56,15 +56,15 @@ installations.
importDump.php
XML dump importer
-
+
importImages.php
Import images into the wiki
-
+
importTextFile.php
Import the contents of a text file into a wiki page
moveBatch.php
- Move a batch of pages
+ Move a batch of pages
namespaceDupes.php
Check articles name to see if they conflict with new/existing namespaces
@@ -93,7 +93,7 @@ installations.
runJobs.php
Immediately complete all jobs in the job queue
- stats.php
+ showCacheStats.php
Show all statistics stored in the cache
undelete.php
@@ -106,4 +106,4 @@ installations.
Update pages restriction to the new schema
userOptions.php
- Change user options \ No newline at end of file
+ Change user options
diff --git a/maintenance/archives/patch-archive-ar_content_format.sql b/maintenance/archives/patch-archive-ar_content_format.sql
new file mode 100644
index 00000000..81f9fca8
--- /dev/null
+++ b/maintenance/archives/patch-archive-ar_content_format.sql
@@ -0,0 +1,2 @@
+ALTER TABLE /*$wgDBprefix*/archive
+ ADD ar_content_format varbinary(64) DEFAULT NULL;
diff --git a/maintenance/archives/patch-archive-ar_content_model.sql b/maintenance/archives/patch-archive-ar_content_model.sql
new file mode 100644
index 00000000..1a8b630e
--- /dev/null
+++ b/maintenance/archives/patch-archive-ar_content_model.sql
@@ -0,0 +1,2 @@
+ALTER TABLE /*$wgDBprefix*/archive
+ ADD ar_content_model varbinary(32) DEFAULT NULL;
diff --git a/maintenance/archives/patch-archive-user-index.sql b/maintenance/archives/patch-archive-user-index.sql
index 62baa2dd..997b4a97 100644
--- a/maintenance/archives/patch-archive-user-index.sql
+++ b/maintenance/archives/patch-archive-user-index.sql
@@ -1,4 +1,4 @@
-- Adds a user,timestamp index to the archive table
-- Used for browsing deleted contributions and renames
-ALTER TABLE /*$wgDBprefix*/archive
+ALTER TABLE /*$wgDBprefix*/archive
ADD INDEX usertext_timestamp ( ar_user_text , ar_timestamp );
diff --git a/maintenance/archives/patch-backlinkindexes.sql b/maintenance/archives/patch-backlinkindexes.sql
index 5facd9ea..22cc5871 100644
--- a/maintenance/archives/patch-backlinkindexes.sql
+++ b/maintenance/archives/patch-backlinkindexes.sql
@@ -1,10 +1,10 @@
---
+--
-- patch-backlinkindexes.sql
---
+--
-- Per bug 6440 / http://bugzilla.wikimedia.org/show_bug.cgi?id=6440
--
-- Improve performance of the "what links here"-type queries
---
+--
ALTER TABLE /*$wgDBprefix*/pagelinks
DROP INDEX pl_namespace,
@@ -13,7 +13,7 @@ ALTER TABLE /*$wgDBprefix*/pagelinks
ALTER TABLE /*$wgDBprefix*/templatelinks
DROP INDEX tl_namespace,
ADD INDEX tl_namespace(tl_namespace, tl_title, tl_from);
-
+
ALTER TABLE /*$wgDBprefix*/imagelinks
DROP INDEX il_to,
ADD INDEX il_to(il_to, il_from);
diff --git a/maintenance/archives/patch-category.sql b/maintenance/archives/patch-category.sql
index 416500c3..97a5690d 100644
--- a/maintenance/archives/patch-category.sql
+++ b/maintenance/archives/patch-category.sql
@@ -8,7 +8,7 @@ CREATE TABLE /*$wgDBprefix*/category (
cat_files int signed NOT NULL default 0,
cat_hidden tinyint(1) unsigned NOT NULL default 0,
-
+
PRIMARY KEY (cat_id),
UNIQUE KEY (cat_title),
diff --git a/maintenance/archives/patch-categorylinks.sql b/maintenance/archives/patch-categorylinks.sql
index 02168d7f..0af0cf91 100644
--- a/maintenance/archives/patch-categorylinks.sql
+++ b/maintenance/archives/patch-categorylinks.sql
@@ -6,7 +6,7 @@
CREATE TABLE /*$wgDBprefix*/categorylinks (
-- Key to page_id of the page defined as a category member.
cl_from int unsigned NOT NULL default '0',
-
+
-- Name of the category.
-- This is also the page_title of the category's description page;
-- all such pages are in namespace 14 (NS_CATEGORY).
@@ -17,20 +17,20 @@ CREATE TABLE /*$wgDBprefix*/categorylinks (
-- isn't always ideal, but collations seem to be an exciting
-- and dangerous new world in MySQL...
--
- -- Truncate so that the cl_sortkey key fits in 1000 bytes
+ -- Truncate so that the cl_sortkey key fits in 1000 bytes
-- (MyISAM 5 with server_character_set=utf8)
cl_sortkey varchar(70) binary NOT NULL default '',
-
+
-- This isn't really used at present. Provided for an optional
-- sorting method by approximate addition time.
cl_timestamp timestamp NOT NULL,
-
+
UNIQUE KEY cl_from(cl_from,cl_to),
-
+
-- This key is trouble. It's incomplete, AND it's too big
-- when collation is set to UTF-8. Bleeeacch!
KEY cl_sortkey(cl_to,cl_sortkey),
-
+
-- Not really used?
KEY cl_timestamp(cl_to,cl_timestamp)
diff --git a/maintenance/archives/patch-categorylinksindex.sql b/maintenance/archives/patch-categorylinksindex.sql
index 8a9ff123..24ad84fe 100644
--- a/maintenance/archives/patch-categorylinksindex.sql
+++ b/maintenance/archives/patch-categorylinksindex.sql
@@ -1,10 +1,10 @@
---
+--
-- patch-categorylinksindex.sql
---
+--
-- Per bug 10280 / http://bugzilla.wikimedia.org/show_bug.cgi?id=10280
--
-- Improve enum continuation performance of the what pages belong to a category query
---
+--
ALTER TABLE /*$wgDBprefix*/categorylinks
DROP INDEX cl_sortkey,
diff --git a/maintenance/archives/patch-drop-ss_admins.sql b/maintenance/archives/patch-drop-ss_admins.sql
new file mode 100644
index 00000000..13c3d3b0
--- /dev/null
+++ b/maintenance/archives/patch-drop-ss_admins.sql
@@ -0,0 +1,2 @@
+-- field is deprecated and no longer updated as of 1.5
+ALTER TABLE /*_*/site_stats DROP COLUMN ss_admins; \ No newline at end of file
diff --git a/maintenance/archives/patch-externallinks.sql b/maintenance/archives/patch-externallinks.sql
index 0a4768ca..fc5017db 100644
--- a/maintenance/archives/patch-externallinks.sql
+++ b/maintenance/archives/patch-externallinks.sql
@@ -5,7 +5,7 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
el_from int(8) unsigned NOT NULL default '0',
el_to blob NOT NULL,
el_index blob NOT NULL,
-
+
KEY (el_from, el_to(40)),
KEY (el_to(60), el_from),
KEY (el_index(60))
diff --git a/maintenance/archives/patch-fa_deleted.sql b/maintenance/archives/patch-fa_deleted.sql
index 3483f8cf..7ab65239 100644
--- a/maintenance/archives/patch-fa_deleted.sql
+++ b/maintenance/archives/patch-fa_deleted.sql
@@ -1,3 +1,3 @@
-- Adding fa_deleted field for additional content suppression
-ALTER TABLE /*$wgDBprefix*/filearchive
+ALTER TABLE /*$wgDBprefix*/filearchive
ADD fa_deleted tinyint unsigned NOT NULL default '0';
diff --git a/maintenance/archives/patch-fa_sha1.sql b/maintenance/archives/patch-fa_sha1.sql
new file mode 100644
index 00000000..931bc44d
--- /dev/null
+++ b/maintenance/archives/patch-fa_sha1.sql
@@ -0,0 +1,4 @@
+-- Add fa_sha1 and related index
+ALTER TABLE /*$wgDBprefix*/filearchive
+ ADD COLUMN fa_sha1 varbinary(32) NOT NULL default '';
+CREATE INDEX /*i*/fa_sha1 ON /*$wgDBprefix*/filearchive (fa_sha1(10));
diff --git a/maintenance/archives/patch-filearchive-user-index.sql b/maintenance/archives/patch-filearchive-user-index.sql
index c79000ad..0d8c3ab1 100644
--- a/maintenance/archives/patch-filearchive-user-index.sql
+++ b/maintenance/archives/patch-filearchive-user-index.sql
@@ -1,5 +1,5 @@
-- Adding index to sort by uploader
-ALTER TABLE /*$wgDBprefix*/filearchive
+ALTER TABLE /*$wgDBprefix*/filearchive
ADD INDEX fa_user_timestamp (fa_user_text,fa_timestamp),
-- Remove useless, incomplete index
DROP INDEX fa_deleted_user;
diff --git a/maintenance/archives/patch-filearchive.sql b/maintenance/archives/patch-filearchive.sql
index 587a2ab4..f75da8be 100644
--- a/maintenance/archives/patch-filearchive.sql
+++ b/maintenance/archives/patch-filearchive.sql
@@ -4,30 +4,30 @@
CREATE TABLE /*$wgDBprefix*/filearchive (
-- Unique row id
fa_id int not null auto_increment,
-
+
-- Original base filename; key to image.img_name, page.page_title, etc
fa_name varchar(255) binary NOT NULL default '',
-
+
-- Filename of archived file, if an old revision
fa_archive_name varchar(255) binary default '',
-
+
-- Which storage bin (directory tree or object store) the file data
-- is stored in. Should be 'deleted' for files that have been deleted;
-- any other bin is not yet in use.
fa_storage_group varbinary(16),
-
+
-- SHA-1 of the file contents plus extension, used as a key for storage.
-- eg 8f8a562add37052a1848ff7771a2c515db94baa9.jpg
--
-- If NULL, the file was missing at deletion time or has been purged
-- from the archival storage.
fa_storage_key varbinary(64) default '',
-
+
-- Deletion information, if this file is deleted.
fa_deleted_user int,
fa_deleted_timestamp binary(14) default '',
fa_deleted_reason text,
-
+
-- Duped fields from image
fa_size int unsigned default '0',
fa_width int default '0',
@@ -41,7 +41,7 @@ CREATE TABLE /*$wgDBprefix*/filearchive (
fa_user int unsigned default '0',
fa_user_text varchar(255) binary default '',
fa_timestamp binary(14) default '',
-
+
PRIMARY KEY (fa_id),
INDEX (fa_name, fa_timestamp), -- pick out by image name
INDEX (fa_storage_group, fa_storage_key), -- pick out dupe files
diff --git a/maintenance/archives/patch-hitcounter.sql b/maintenance/archives/patch-hitcounter.sql
index 50e56e0c..c87c9592 100644
--- a/maintenance/archives/patch-hitcounter.sql
+++ b/maintenance/archives/patch-hitcounter.sql
@@ -1,5 +1,5 @@
--
--- hitcounter table is used to buffer page hits before they are periodically
+-- hitcounter table is used to buffer page hits before they are periodically
-- counted and added to the cur_counter column in the cur table.
-- December 2003
--
diff --git a/maintenance/archives/patch-image-user-index.sql b/maintenance/archives/patch-image-user-index.sql
index db56b221..a74d7bd5 100644
--- a/maintenance/archives/patch-image-user-index.sql
+++ b/maintenance/archives/patch-image-user-index.sql
@@ -1,8 +1,8 @@
---
+--
-- image-user-index.sql
---
+--
-- Add user/timestamp index to current image versions
---
+--
ALTER TABLE /*$wgDBprefix*/image
ADD INDEX img_usertext_timestamp (img_user_text,img_timestamp);
diff --git a/maintenance/archives/patch-img_media_mime-index.sql b/maintenance/archives/patch-img_media_mime-index.sql
new file mode 100644
index 00000000..bfaf84f9
--- /dev/null
+++ b/maintenance/archives/patch-img_media_mime-index.sql
@@ -0,0 +1,4 @@
+-- New index on image table to allow searches for types i.e. video webm
+-- Added 2013-01-08
+
+CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
diff --git a/maintenance/archives/patch-img_media_type.sql b/maintenance/archives/patch-img_media_type.sql
index 857eb98e..87b8c2f5 100644
--- a/maintenance/archives/patch-img_media_type.sql
+++ b/maintenance/archives/patch-img_media_type.sql
@@ -4,11 +4,11 @@
ALTER TABLE /*$wgDBprefix*/image ADD (
-- Media type as defined by the MEDIATYPE_xxx constants
img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
-
+
-- major part of a MIME media type as defined by IANA
-- see http://www.iana.org/assignments/media-types/
img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
-
+
-- minor part of a MIME media type as defined by IANA
-- the minor parts are not required to adher to any standard
-- but should be consistent throughout the database
diff --git a/maintenance/archives/patch-img_sha1.sql b/maintenance/archives/patch-img_sha1.sql
index 35950f58..0a375c4f 100644
--- a/maintenance/archives/patch-img_sha1.sql
+++ b/maintenance/archives/patch-img_sha1.sql
@@ -1,8 +1,8 @@
-- Add img_sha1, oi_sha1 and related indexes
ALTER TABLE /*$wgDBprefix*/image
ADD COLUMN img_sha1 varbinary(32) NOT NULL default '',
- ADD INDEX img_sha1 (img_sha1);
+ ADD INDEX img_sha1 (img_sha1(10));
ALTER TABLE /*$wgDBprefix*/oldimage
ADD COLUMN oi_sha1 varbinary(32) NOT NULL default '',
- ADD INDEX oi_sha1 (oi_sha1);
+ ADD INDEX oi_sha1 (oi_sha1(10));
diff --git a/maintenance/archives/patch-indexes.sql b/maintenance/archives/patch-indexes.sql
index c56838fd..c24d9953 100644
--- a/maintenance/archives/patch-indexes.sql
+++ b/maintenance/archives/patch-indexes.sql
@@ -1,8 +1,8 @@
---
+--
-- patch-indexes.sql
---
+--
-- Fix up table indexes; new to stable release in November 2003
---
+--
ALTER TABLE IF EXISTS /*$wgDBprefix*/links
DROP INDEX l_from,
diff --git a/maintenance/archives/patch-interwiki.sql b/maintenance/archives/patch-interwiki.sql
index 321765b9..57b79456 100644
--- a/maintenance/archives/patch-interwiki.sql
+++ b/maintenance/archives/patch-interwiki.sql
@@ -5,16 +5,16 @@
CREATE TABLE /*$wgDBprefix*/interwiki (
-- The interwiki prefix, (e.g. "Meatball", or the language prefix "de")
iw_prefix varchar(32) NOT NULL,
-
+
-- The URL of the wiki, with "$1" as a placeholder for an article name.
-- Any spaces in the name will be transformed to underscores before
-- insertion.
iw_url blob NOT NULL,
-
+
-- A boolean value indicating whether the wiki is in this project
-- (used, for example, to detect redirect loops)
iw_local BOOL NOT NULL,
-
+
UNIQUE KEY iw_prefix (iw_prefix)
) /*$wgDBTableOptions*/;
diff --git a/maintenance/archives/patch-ipb_anon_only.sql b/maintenance/archives/patch-ipb_anon_only.sql
index fcd257c7..bb39c1d9 100644
--- a/maintenance/archives/patch-ipb_anon_only.sql
+++ b/maintenance/archives/patch-ipb_anon_only.sql
@@ -1,9 +1,9 @@
--- Add extra option fields to the ipblocks table, add some extra indexes,
--- convert infinity values in ipb_expiry to something that sorts better,
--- extend ipb_address and range fields, add a unique index for block conflict
+-- Add extra option fields to the ipblocks table, add some extra indexes,
+-- convert infinity values in ipb_expiry to something that sorts better,
+-- extend ipb_address and range fields, add a unique index for block conflict
-- detection.
--- Conflicts in the new unique index can be handled by creating a new
+-- Conflicts in the new unique index can be handled by creating a new
-- table and inserting into it instead of doing an ALTER TABLE.
@@ -22,7 +22,7 @@ CREATE TABLE /*$wgDBprefix*/ipblocks_newunique (
ipb_expiry varbinary(14) NOT NULL default '',
ipb_range_start tinyblob NOT NULL,
ipb_range_end tinyblob NOT NULL,
-
+
PRIMARY KEY ipb_id (ipb_id),
UNIQUE INDEX ipb_address_unique (ipb_address(255), ipb_user, ipb_auto),
INDEX ipb_user (ipb_user),
@@ -32,8 +32,8 @@ CREATE TABLE /*$wgDBprefix*/ipblocks_newunique (
) /*$wgDBTableOptions*/;
-INSERT IGNORE INTO /*$wgDBprefix*/ipblocks_newunique
- (ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, ipb_anon_only, ipb_create_account)
+INSERT IGNORE INTO /*$wgDBprefix*/ipblocks_newunique
+ (ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, ipb_anon_only, ipb_create_account)
SELECT ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, 0 , ipb_user=0
FROM /*$wgDBprefix*/ipblocks;
diff --git a/maintenance/archives/patch-ipb_by_text.sql b/maintenance/archives/patch-ipb_by_text.sql
index c0b620d3..e809d102 100644
--- a/maintenance/archives/patch-ipb_by_text.sql
+++ b/maintenance/archives/patch-ipb_by_text.sql
@@ -4,7 +4,7 @@
ALTER TABLE /*$wgDBprefix*/ipblocks
ADD ipb_by_text varchar(255) binary NOT NULL default '';
-UPDATE /*$wgDBprefix*/ipblocks
+UPDATE /*$wgDBprefix*/ipblocks
JOIN /*$wgDBprefix*/user ON ipb_by = user_id
SET ipb_by_text = user_name
WHERE ipb_by != 0; \ No newline at end of file
diff --git a/maintenance/archives/patch-ipb_deleted.sql b/maintenance/archives/patch-ipb_deleted.sql
index fad94778..b12ddaaa 100644
--- a/maintenance/archives/patch-ipb_deleted.sql
+++ b/maintenance/archives/patch-ipb_deleted.sql
@@ -1,3 +1,3 @@
-- Adding ipb_deleted field for hiding usernames
-ALTER TABLE /*$wgDBprefix*/ipblocks
+ALTER TABLE /*$wgDBprefix*/ipblocks
ADD ipb_deleted bool NOT NULL default 0;
diff --git a/maintenance/archives/patch-ipb_range_start.sql b/maintenance/archives/patch-ipb_range_start.sql
index 64a906d4..84cba8f6 100644
--- a/maintenance/archives/patch-ipb_range_start.sql
+++ b/maintenance/archives/patch-ipb_range_start.sql
@@ -1,5 +1,5 @@
-- Add the range handling fields
-ALTER TABLE /*$wgDBprefix*/ipblocks
+ALTER TABLE /*$wgDBprefix*/ipblocks
ADD ipb_range_start tinyblob NOT NULL default '',
ADD ipb_range_end tinyblob NOT NULL default '',
ADD INDEX ipb_range (ipb_range_start(8), ipb_range_end(8));
@@ -7,15 +7,15 @@ ALTER TABLE /*$wgDBprefix*/ipblocks
-- Initialise fields
-- Only range blocks match ipb_address LIKE '%/%', this fact is used in the code already
-UPDATE /*$wgDBprefix*/ipblocks
- SET
- ipb_range_start = LPAD(HEX(
+UPDATE /*$wgDBprefix*/ipblocks
+ SET
+ ipb_range_start = LPAD(HEX(
(SUBSTRING_INDEX(ipb_address, '.', 1) << 24)
+ (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 2), '.', -1) << 16)
+ (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 3), '.', -1) << 24)
+ (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '/', 1), '.', -1)) ), 8, '0' ),
- ipb_range_end = LPAD(HEX(
+ ipb_range_end = LPAD(HEX(
(SUBSTRING_INDEX(ipb_address, '.', 1) << 24)
+ (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 2), '.', -1) << 16)
+ (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 3), '.', -1) << 24)
diff --git a/maintenance/archives/patch-iwlinks.sql b/maintenance/archives/patch-iwlinks.sql
index 89b34cb1..b7bd3f13 100644
--- a/maintenance/archives/patch-iwlinks.sql
+++ b/maintenance/archives/patch-iwlinks.sql
@@ -1,10 +1,10 @@
---
+--
-- Track inline interwiki links
--
CREATE TABLE /*_*/iwlinks (
-- page_id of the referring page
iwl_from int unsigned NOT NULL default 0,
-
+
-- Interwiki prefix code of the target
iwl_prefix varbinary(20) NOT NULL default '',
diff --git a/maintenance/archives/patch-job.sql b/maintenance/archives/patch-job.sql
index c9199efb..662f5d27 100644
--- a/maintenance/archives/patch-job.sql
+++ b/maintenance/archives/patch-job.sql
@@ -1,7 +1,7 @@
-- Jobs performed by parallel apache threads or a command-line daemon
CREATE TABLE /*_*/job (
job_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-
+
-- Command name
-- Limited to 60 to prevent key length overflow
job_cmd varbinary(60) NOT NULL default '',
diff --git a/maintenance/archives/patch-job_attempts.sql b/maintenance/archives/patch-job_attempts.sql
new file mode 100644
index 00000000..47b73e81
--- /dev/null
+++ b/maintenance/archives/patch-job_attempts.sql
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/job
+ ADD COLUMN job_attempts integer unsigned NOT NULL default 0;
+
+CREATE INDEX /*i*/job_cmd_token_id ON /*_*/job (job_cmd,job_token,job_id);
diff --git a/maintenance/archives/patch-job_token.sql b/maintenance/archives/patch-job_token.sql
new file mode 100644
index 00000000..080fa97c
--- /dev/null
+++ b/maintenance/archives/patch-job_token.sql
@@ -0,0 +1,9 @@
+ALTER TABLE /*_*/job
+ ADD COLUMN job_random integer unsigned NOT NULL default 0,
+ ADD COLUMN job_token varbinary(32) NOT NULL default '',
+ ADD COLUMN job_token_timestamp varbinary(14) NULL default NULL,
+ ADD COLUMN job_sha1 varbinary(32) NOT NULL default '';
+
+CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
+CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
+
diff --git a/maintenance/archives/patch-langlinks.sql b/maintenance/archives/patch-langlinks.sql
index ffff07c0..5594acd5 100644
--- a/maintenance/archives/patch-langlinks.sql
+++ b/maintenance/archives/patch-langlinks.sql
@@ -1,7 +1,7 @@
CREATE TABLE /*$wgDBprefix*/langlinks (
-- page_id of the referring page
ll_from int unsigned NOT NULL default '0',
-
+
-- Language code of the target
ll_lang varbinary(20) NOT NULL default '',
diff --git a/maintenance/archives/patch-linktables.sql b/maintenance/archives/patch-linktables.sql
index b15878c3..d53d2ea3 100644
--- a/maintenance/archives/patch-linktables.sql
+++ b/maintenance/archives/patch-linktables.sql
@@ -6,13 +6,13 @@ DROP TABLE IF EXISTS /*$wgDBprefix*/links;
CREATE TABLE /*$wgDBprefix*/links (
-- Key to the page_id of the page containing the link.
l_from int unsigned NOT NULL default '0',
-
+
-- Key to the page_id of the link target.
-- An unfortunate consequence of this is that rename
-- operations require changing the links entries for
-- all links to the moved page.
l_to int unsigned NOT NULL default '0',
-
+
UNIQUE KEY l_from(l_from,l_to),
KEY (l_to)
@@ -27,7 +27,7 @@ DROP TABLE IF EXISTS /*$wgDBprefix*/brokenlinks;
CREATE TABLE /*$wgDBprefix*/brokenlinks (
-- Key to the page_id of the page containing the link.
bl_from int unsigned NOT NULL default '0',
-
+
-- Text of the target page title ("namesapce:title").
-- Unfortunately this doesn't split the namespace index
-- key and therefore can't easily be joined to anything.
@@ -46,12 +46,12 @@ DROP TABLE IF EXISTS /*$wgDBprefix*/imagelinks;
CREATE TABLE /*$wgDBprefix*/imagelinks (
-- Key to page_id of the page containing the image / media link.
il_from int unsigned NOT NULL default '0',
-
+
-- Filename of target image.
-- This is also the page_title of the file's description page;
-- all such pages are in namespace 6 (NS_FILE).
il_to varchar(255) binary NOT NULL default '',
-
+
UNIQUE KEY il_from(il_from,il_to),
KEY (il_to)
diff --git a/maintenance/archives/patch-log_search-rename-index.sql b/maintenance/archives/patch-log_search-rename-index.sql
index 41e051d8..7e1113e6 100644
--- a/maintenance/archives/patch-log_search-rename-index.sql
+++ b/maintenance/archives/patch-log_search-rename-index.sql
@@ -1,7 +1,7 @@
-- Rename the primary unique index from PRIMARY to ls_field_val
-- This is for MySQL only and is necessary only for databases which were updated
-- between MW 1.16 development revisions r50567 and r51465.
-ALTER TABLE /*_*/log_search
- DROP PRIMARY KEY,
+ALTER TABLE /*_*/log_search
+ DROP PRIMARY KEY,
ADD UNIQUE INDEX ls_field_val (ls_field,ls_value,ls_log_id);
diff --git a/maintenance/archives/patch-log_user_text.sql b/maintenance/archives/patch-log_user_text.sql
index 9a783d87..12ca75e5 100644
--- a/maintenance/archives/patch-log_user_text.sql
+++ b/maintenance/archives/patch-log_user_text.sql
@@ -1,4 +1,4 @@
-ALTER TABLE /*$wgDBprefix*/logging
+ALTER TABLE /*$wgDBprefix*/logging
ADD log_user_text varchar(255) binary NOT NULL default '',
ADD log_page int unsigned NULL,
CHANGE log_type log_type varbinary(32) NOT NULL,
diff --git a/maintenance/archives/patch-logging-times-index.sql b/maintenance/archives/patch-logging-times-index.sql
index e66ceec4..5f24f5c3 100644
--- a/maintenance/archives/patch-logging-times-index.sql
+++ b/maintenance/archives/patch-logging-times-index.sql
@@ -1,8 +1,8 @@
---
+--
-- patch-logging-times-index.sql
---
+--
-- Add a very humble index on logging times
---
+--
ALTER TABLE /*$wgDBprefix*/logging
ADD INDEX times (log_timestamp);
diff --git a/maintenance/archives/patch-logging.sql b/maintenance/archives/patch-logging.sql
index b5cfdf72..79df0dd4 100644
--- a/maintenance/archives/patch-logging.sql
+++ b/maintenance/archives/patch-logging.sql
@@ -7,21 +7,21 @@ CREATE TABLE /*$wgDBprefix*/logging (
-- action field, but only the type controls categorization.
log_type varbinary(10) NOT NULL default '',
log_action varbinary(10) NOT NULL default '',
-
+
-- Timestamp. Duh.
log_timestamp binary(14) NOT NULL default '19700101000000',
-
+
-- The user who performed this action; key to user_id
log_user int unsigned NOT NULL default 0,
-
+
-- Key to the page affected. Where a user is the target,
-- this will point to the user page.
log_namespace int NOT NULL default 0,
log_title varchar(255) binary NOT NULL default '',
-
+
-- Freeform text. Interpreted as edit history comments.
log_comment varchar(255) NOT NULL default '',
-
+
-- LF separated list of miscellaneous parameters
log_params blob NOT NULL,
diff --git a/maintenance/archives/patch-mime_minor_length.sql b/maintenance/archives/patch-mime_minor_length.sql
index 8b63d1f0..88dd64cf 100644
--- a/maintenance/archives/patch-mime_minor_length.sql
+++ b/maintenance/archives/patch-mime_minor_length.sql
@@ -3,8 +3,8 @@ ALTER TABLE /*_*/filearchive
ALTER TABLE /*_*/image
MODIFY COLUMN img_minor_mime varbinary(100) NOT NULL default "unknown";
-
+
ALTER TABLE /*_*/oldimage
MODIFY COLUMN oi_minor_mime varbinary(100) NOT NULL default "unknown";
-
+
INSERT INTO /*_*/updatelog(ul_key) VALUES ('mime_minor_length');
diff --git a/maintenance/archives/patch-msg_resource.sql b/maintenance/archives/patch-msg_resource.sql
index f4f35339..9fa05d2a 100644
--- a/maintenance/archives/patch-msg_resource.sql
+++ b/maintenance/archives/patch-msg_resource.sql
@@ -2,7 +2,7 @@
CREATE TABLE /*_*/msg_resource (
-- Resource name
mr_resource varbinary(255) NOT NULL,
- -- Language code
+ -- Language code
mr_lang varbinary(32) NOT NULL,
-- JSON blob. This is an incomplete JSON object, i.e. without the wrapping {}
mr_blob mediumblob NOT NULL,
diff --git a/maintenance/archives/patch-oi_metadata.sql b/maintenance/archives/patch-oi_metadata.sql
index bc848878..df043c55 100644
--- a/maintenance/archives/patch-oi_metadata.sql
+++ b/maintenance/archives/patch-oi_metadata.sql
@@ -1,10 +1,10 @@
---
+--
-- patch-oi_metadata.sql
---
+--
-- Add data to allow for direct reference to old images
-- Some re-indexing here.
-- Old images can be included into pages effeciently now.
---
+--
ALTER TABLE /*$wgDBprefix*/oldimage
DROP INDEX oi_name,
diff --git a/maintenance/archives/patch-oldimage-user-index.sql b/maintenance/archives/patch-oldimage-user-index.sql
index 949625eb..2c7f8071 100644
--- a/maintenance/archives/patch-oldimage-user-index.sql
+++ b/maintenance/archives/patch-oldimage-user-index.sql
@@ -1,8 +1,8 @@
---
+--
-- oldimage-user-index.sql
---
+--
-- Add user/timestamp index to old image versions
---
+--
ALTER TABLE /*$wgDBprefix*/oldimage
ADD INDEX oi_usertext_timestamp (oi_user_text,oi_timestamp);
diff --git a/maintenance/archives/patch-page-page_content_model.sql b/maintenance/archives/patch-page-page_content_model.sql
new file mode 100644
index 00000000..30434d93
--- /dev/null
+++ b/maintenance/archives/patch-page-page_content_model.sql
@@ -0,0 +1,2 @@
+ALTER TABLE /*$wgDBprefix*/page
+ ADD page_content_model varbinary(32) DEFAULT NULL;
diff --git a/maintenance/archives/patch-page_props-propname-page-index.sql b/maintenance/archives/patch-page_props-propname-page-index.sql
new file mode 100644
index 00000000..822fa04d
--- /dev/null
+++ b/maintenance/archives/patch-page_props-propname-page-index.sql
@@ -0,0 +1,4 @@
+--
+-- Creates the pp_propname_page index on page_props
+--
+CREATE UNIQUE INDEX /*i*/pp_propname_page ON /*_*/page_props (pp_propname, pp_page);
diff --git a/maintenance/archives/patch-pagelinks.sql b/maintenance/archives/patch-pagelinks.sql
index 118592fb..cea89b52 100644
--- a/maintenance/archives/patch-pagelinks.sql
+++ b/maintenance/archives/patch-pagelinks.sql
@@ -1,7 +1,7 @@
--
-- Create the new pagelinks table to merge links and brokenlinks data,
-- and populate it.
---
+--
-- Unlike the old links and brokenlinks, these records will not need to be
-- altered when target pages are created, deleted, or renamed. This should
-- reduce the amount of severe database frustration that happens when widely-
@@ -19,14 +19,14 @@
CREATE TABLE /*$wgDBprefix*/pagelinks (
-- Key to the page_id of the page containing the link.
pl_from int unsigned NOT NULL default '0',
-
+
-- Key to page_namespace/page_title of the target page.
-- The target page may or may not exist, and due to renames
-- and deletions may refer to different page records as time
-- goes by.
pl_namespace int NOT NULL default '0',
pl_title varchar(255) binary NOT NULL default '',
-
+
UNIQUE KEY pl_from(pl_from,pl_namespace,pl_title),
KEY (pl_namespace,pl_title)
diff --git a/maintenance/archives/patch-parsercache.sql b/maintenance/archives/patch-parsercache.sql
index 395a81bd..5fe241c3 100644
--- a/maintenance/archives/patch-parsercache.sql
+++ b/maintenance/archives/patch-parsercache.sql
@@ -1,5 +1,5 @@
--
--- parsercache table, for cacheing complete parsed articles
+-- parsercache table, for cacheing complete parsed articles
-- before they are imbedded in the skin.
--
diff --git a/maintenance/archives/patch-pl-tl-il-unique.sql b/maintenance/archives/patch-pl-tl-il-unique.sql
index 186a2036..a3566705 100644
--- a/maintenance/archives/patch-pl-tl-il-unique.sql
+++ b/maintenance/archives/patch-pl-tl-il-unique.sql
@@ -1,6 +1,6 @@
---
+--
-- patch-pl-tl-il-unique-index.sql
---
+--
-- Make reorderings of UNIQUE indices UNIQUE as well
DROP INDEX /*i*/pl_namespace ON /*_*/pagelinks;
diff --git a/maintenance/archives/patch-querycache.sql b/maintenance/archives/patch-querycache.sql
index e6da79cc..8e1a5188 100644
--- a/maintenance/archives/patch-querycache.sql
+++ b/maintenance/archives/patch-querycache.sql
@@ -3,14 +3,14 @@
CREATE TABLE /*$wgDBprefix*/querycache (
-- A key name, generally the base name of of the special page.
qc_type varbinary(32) NOT NULL,
-
+
-- Some sort of stored value. Sizes, counts...
qc_value int unsigned NOT NULL default '0',
-
+
-- Target namespace+title
qc_namespace int NOT NULL default '0',
qc_title varchar(255) binary NOT NULL default '',
-
+
KEY (qc_type,qc_value)
) /*$wgDBTableOptions*/;
diff --git a/maintenance/archives/patch-querycachetwo.sql b/maintenance/archives/patch-querycachetwo.sql
index 01623bc7..79131310 100644
--- a/maintenance/archives/patch-querycachetwo.sql
+++ b/maintenance/archives/patch-querycachetwo.sql
@@ -3,14 +3,14 @@
CREATE TABLE /*$wgDBprefix*/querycachetwo (
-- A key name, generally the base name of of the special page.
qcc_type varbinary(32) NOT NULL,
-
+
-- Some sort of stored value. Sizes, counts...
qcc_value int unsigned NOT NULL default '0',
-
+
-- Target namespace+title
qcc_namespace int NOT NULL default '0',
qcc_title varchar(255) binary NOT NULL default '',
-
+
-- Target namespace+title2
qcc_namespacetwo int NOT NULL default '0',
qcc_titletwo varchar(255) binary NOT NULL default '',
diff --git a/maintenance/archives/patch-rc_deleted.sql b/maintenance/archives/patch-rc_deleted.sql
index 04ead974..f4bbd0f9 100644
--- a/maintenance/archives/patch-rc_deleted.sql
+++ b/maintenance/archives/patch-rc_deleted.sql
@@ -1,6 +1,6 @@
-- Adding rc_deleted field for revisiondelete
-- Add rc_logid to match log_id
-ALTER TABLE /*$wgDBprefix*/recentchanges
+ALTER TABLE /*$wgDBprefix*/recentchanges
ADD rc_deleted tinyint unsigned NOT NULL default '0',
ADD rc_logid int unsigned NOT NULL default '0',
ADD rc_log_type varbinary(255) NULL default NULL,
diff --git a/maintenance/archives/patch-rc_id.sql b/maintenance/archives/patch-rc_id.sql
index 3b023753..28caee0e 100644
--- a/maintenance/archives/patch-rc_id.sql
+++ b/maintenance/archives/patch-rc_id.sql
@@ -1,6 +1,6 @@
-- Primary key in recentchanges
-ALTER TABLE /*$wgDBprefix*/recentchanges
+ALTER TABLE /*$wgDBprefix*/recentchanges
ADD rc_id int NOT NULL auto_increment,
ADD PRIMARY KEY rc_id (rc_id);
diff --git a/maintenance/archives/patch-rc_ip.sql b/maintenance/archives/patch-rc_ip.sql
index 6b0b0534..4d93300f 100644
--- a/maintenance/archives/patch-rc_ip.sql
+++ b/maintenance/archives/patch-rc_ip.sql
@@ -1,6 +1,6 @@
-- Adding the rc_ip field for logging of IP addresses in recentchanges
-ALTER TABLE /*$wgDBprefix*/recentchanges
+ALTER TABLE /*$wgDBprefix*/recentchanges
ADD rc_ip varbinary(40) NOT NULL default '',
ADD INDEX rc_ip (rc_ip);
diff --git a/maintenance/archives/patch-rc_moved.sql b/maintenance/archives/patch-rc_moved.sql
new file mode 100644
index 00000000..2fa1de6b
--- /dev/null
+++ b/maintenance/archives/patch-rc_moved.sql
@@ -0,0 +1,4 @@
+-- rc_moved_to_ns and rc_moved_to_title is no longer used, delete the fields
+
+ALTER TABLE /*$wgDBprefix*/recentchanges DROP COLUMN rc_moved_to_ns,
+ DROP COLUMN rc_moved_to_title;
diff --git a/maintenance/archives/patch-redirect.sql b/maintenance/archives/patch-redirect.sql
index 5d7218bc..d2957df4 100644
--- a/maintenance/archives/patch-redirect.sql
+++ b/maintenance/archives/patch-redirect.sql
@@ -1,7 +1,7 @@
--
-- Create the new redirect table.
-- For each redirect, this table contains exactly one row defining its target
---
+--
CREATE TABLE /*$wgDBprefix*/redirect (
-- Key to the page_id of the redirect page
rd_from int unsigned NOT NULL default '0',
diff --git a/maintenance/archives/patch-rename-iwl_prefix.sql b/maintenance/archives/patch-rename-iwl_prefix.sql
index 4b11b36b..4a410037 100644
--- a/maintenance/archives/patch-rename-iwl_prefix.sql
+++ b/maintenance/archives/patch-rename-iwl_prefix.sql
@@ -1,4 +1,4 @@
---
+--
-- Recreates the iwl_prefix index for the iwlinks table
--
CREATE UNIQUE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
diff --git a/maintenance/archives/patch-restructure.sql b/maintenance/archives/patch-restructure.sql
index 7b638483..a5bc3e52 100644
--- a/maintenance/archives/patch-restructure.sql
+++ b/maintenance/archives/patch-restructure.sql
@@ -38,7 +38,6 @@ CREATE TABLE /*$wgDBprefix*/revision (
rev_minor_edit tinyint unsigned NOT NULL default '0',
rev_deleted tinyint unsigned NOT NULL default '0',
-
PRIMARY KEY rev_page_id (rev_page, rev_id),
UNIQUE INDEX rev_id (rev_id),
INDEX rev_timestamp (rev_timestamp),
@@ -53,7 +52,7 @@ CREATE TABLE /*$wgDBprefix*/revision (
-- old_id int(8) unsigned NOT NULL auto_increment,
-- old_text mediumtext NOT NULL,
-- old_flags tinyblob NOT NULL,
---
+--
-- PRIMARY KEY old_id (old_id)
-- );
diff --git a/maintenance/archives/patch-revision-rev_content_format.sql b/maintenance/archives/patch-revision-rev_content_format.sql
new file mode 100644
index 00000000..22aeb8a7
--- /dev/null
+++ b/maintenance/archives/patch-revision-rev_content_format.sql
@@ -0,0 +1,2 @@
+ALTER TABLE /*$wgDBprefix*/revision
+ ADD rev_content_format varbinary(64) DEFAULT NULL;
diff --git a/maintenance/archives/patch-revision-rev_content_model.sql b/maintenance/archives/patch-revision-rev_content_model.sql
new file mode 100644
index 00000000..1ba05721
--- /dev/null
+++ b/maintenance/archives/patch-revision-rev_content_model.sql
@@ -0,0 +1,2 @@
+ALTER TABLE /*$wgDBprefix*/revision
+ ADD rev_content_model varbinary(32) DEFAULT NULL;
diff --git a/maintenance/archives/patch-searchindex.sql b/maintenance/archives/patch-searchindex.sql
index 9b635a8f..36507a2b 100644
--- a/maintenance/archives/patch-searchindex.sql
+++ b/maintenance/archives/patch-searchindex.sql
@@ -10,13 +10,13 @@ DROP TABLE IF EXISTS /*$wgDBprefix*/searchindex;
CREATE TABLE /*$wgDBprefix*/searchindex (
-- Key to page_id
si_page int unsigned NOT NULL,
-
+
-- Munged version of title
si_title varchar(255) NOT NULL default '',
-
+
-- Munged version of body text
si_text mediumtext NOT NULL,
-
+
UNIQUE KEY (si_page)
) ENGINE=MyISAM;
diff --git a/maintenance/archives/patch-sites.sql b/maintenance/archives/patch-sites.sql
new file mode 100644
index 00000000..88392748
--- /dev/null
+++ b/maintenance/archives/patch-sites.sql
@@ -0,0 +1,71 @@
+-- Patch to add the sites and site_identifiers tables.
+-- Licence: GNU GPL v2+
+-- Author: Jeroen De Dauw < jeroendedauw@gmail.com >
+
+
+-- Holds all the sites known to the wiki.
+CREATE TABLE IF NOT EXISTS /*_*/sites (
+-- Numeric id of the site
+ site_id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+
+ -- Global identifier for the site, ie 'enwiktionary'
+ site_global_key varbinary(32) NOT NULL,
+
+ -- Type of the site, ie 'mediawiki'
+ site_type varbinary(32) NOT NULL,
+
+ -- Group of the site, ie 'wikipedia'
+ site_group varbinary(32) NOT NULL,
+
+ -- Source of the site data, ie 'local', 'wikidata', 'my-magical-repo'
+ site_source varbinary(32) NOT NULL,
+
+ -- Language code of the sites primary language.
+ site_language varbinary(32) NOT NULL,
+
+ -- Protocol of the site, ie 'http://', 'irc://', '//'
+ -- This field is an index for lookups and is build from type specific data in site_data.
+ site_protocol varbinary(32) NOT NULL,
+
+ -- Domain of the site in reverse order, ie 'org.mediawiki.www.'
+ -- This field is an index for lookups and is build from type specific data in site_data.
+ site_domain VARCHAR(255) NOT NULL,
+
+ -- Type dependent site data.
+ site_data BLOB NOT NULL,
+
+ -- If site.tld/path/key:pageTitle should forward users to the page on
+ -- the actual site, where "key" is the local identifier.
+ site_forward bool NOT NULL,
+
+ -- Type dependent site config.
+ -- For instance if template transclusion should be allowed if it's a MediaWiki.
+ site_config BLOB NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/sites_global_key ON /*_*/sites (site_global_key);
+CREATE INDEX /*i*/sites_type ON /*_*/sites (site_type);
+CREATE INDEX /*i*/sites_group ON /*_*/sites (site_group);
+CREATE INDEX /*i*/sites_source ON /*_*/sites (site_source);
+CREATE INDEX /*i*/sites_language ON /*_*/sites (site_language);
+CREATE INDEX /*i*/sites_protocol ON /*_*/sites (site_protocol);
+CREATE INDEX /*i*/sites_domain ON /*_*/sites (site_domain);
+CREATE INDEX /*i*/sites_forward ON /*_*/sites (site_forward);
+
+
+
+-- Links local site identifiers to their corresponding site.
+CREATE TABLE IF NOT EXISTS /*_*/site_identifiers (
+ -- Key on site.site_id
+ si_site INT UNSIGNED NOT NULL,
+
+ -- local key type, ie 'interwiki' or 'langlink'
+ si_type varbinary(32) NOT NULL,
+
+ -- local key value, ie 'en' or 'wiktionary'
+ si_key varbinary(32) NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/site_ids_type ON /*_*/site_identifiers (si_type, si_key);
+CREATE INDEX /*i*/site_ids_site ON /*_*/site_identifiers (si_site);
+CREATE INDEX /*i*/site_ids_key ON /*_*/site_identifiers (si_key); \ No newline at end of file
diff --git a/maintenance/archives/patch-templatelinks.sql b/maintenance/archives/patch-templatelinks.sql
index a545b34e..086b6a1b 100644
--- a/maintenance/archives/patch-templatelinks.sql
+++ b/maintenance/archives/patch-templatelinks.sql
@@ -4,16 +4,15 @@
CREATE TABLE /*$wgDBprefix*/templatelinks (
-- Key to the page_id of the page containing the link.
tl_from int unsigned NOT NULL default '0',
-
+
-- Key to page_namespace/page_title of the target page.
-- The target page may or may not exist, and due to renames
-- and deletions may refer to different page records as time
-- goes by.
tl_namespace int NOT NULL default '0',
tl_title varchar(255) binary NOT NULL default '',
-
+
UNIQUE KEY tl_from(tl_from,tl_namespace,tl_title),
KEY (tl_namespace,tl_title)
-
) /*$wgDBTableOptions*/;
diff --git a/maintenance/archives/patch-testrun.sql b/maintenance/archives/patch-testrun.sql
index 8591d81d..6699b554 100644
--- a/maintenance/archives/patch-testrun.sql
+++ b/maintenance/archives/patch-testrun.sql
@@ -12,13 +12,13 @@ drop table if exists /*$wgDBprefix*/testrun;
create table /*$wgDBprefix*/testrun (
tr_id int not null auto_increment,
-
+
tr_date char(14) binary,
tr_mw_version blob,
tr_php_version blob,
tr_db_version blob,
tr_uname blob,
-
+
primary key (tr_id)
) engine=InnoDB;
@@ -26,10 +26,10 @@ create table /*$wgDBprefix*/testitem (
ti_run int not null,
ti_name varchar(255),
ti_success bool,
-
+
unique key (ti_run, ti_name),
key (ti_run, ti_success),
-
+
foreign key (ti_run) references /*$wgDBprefix*/testrun(tr_id)
on delete cascade
) engine=InnoDB;
diff --git a/maintenance/archives/patch-ufg_group-length-increase-255.sql b/maintenance/archives/patch-ufg_group-length-increase-255.sql
new file mode 100644
index 00000000..4b7f0d38
--- /dev/null
+++ b/maintenance/archives/patch-ufg_group-length-increase-255.sql
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/user_former_groups
+ MODIFY COLUMN ufg_group varbinary(255) NOT NULL default '';
diff --git a/maintenance/archives/patch-ufg_group-length-increase.sql b/maintenance/archives/patch-ufg_group-length-increase.sql
deleted file mode 100644
index e24cba02..00000000
--- a/maintenance/archives/patch-ufg_group-length-increase.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-ALTER TABLE /*_*/user_former_groups
- MODIFY COLUMN ufg_group varbinary(32) NOT NULL default '';
diff --git a/maintenance/archives/patch-ug_group-length-increase-255.sql b/maintenance/archives/patch-ug_group-length-increase-255.sql
new file mode 100644
index 00000000..79e17ac0
--- /dev/null
+++ b/maintenance/archives/patch-ug_group-length-increase-255.sql
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/user_groups
+ MODIFY COLUMN ug_group varbinary(255) NOT NULL default '';
diff --git a/maintenance/archives/patch-ug_group-length-increase.sql b/maintenance/archives/patch-ug_group-length-increase.sql
deleted file mode 100644
index e944a858..00000000
--- a/maintenance/archives/patch-ug_group-length-increase.sql
+++ /dev/null
@@ -1,2 +0,0 @@
-ALTER TABLE /*_*/user_groups
- MODIFY COLUMN ug_group varbinary(32) NOT NULL default '';
diff --git a/maintenance/archives/patch-uploadstash-us_props.sql b/maintenance/archives/patch-uploadstash-us_props.sql
new file mode 100644
index 00000000..d64515a8
--- /dev/null
+++ b/maintenance/archives/patch-uploadstash-us_props.sql
@@ -0,0 +1,2 @@
+ALTER TABLE /*$wgDBprefix*/uploadstash
+ ADD COLUMN us_props blob;
diff --git a/maintenance/archives/patch-uploadstash.sql b/maintenance/archives/patch-uploadstash.sql
index 2512076f..14eaeab0 100644
--- a/maintenance/archives/patch-uploadstash.sql
+++ b/maintenance/archives/patch-uploadstash.sql
@@ -1,10 +1,10 @@
--
--- Store information about newly uploaded files before they're
+-- Store information about newly uploaded files before they're
-- moved into the actual filestore
--
CREATE TABLE /*_*/uploadstash (
us_id int unsigned NOT NULL PRIMARY KEY auto_increment,
-
+
-- the user who uploaded the file.
us_user int unsigned NOT NULL,
@@ -14,16 +14,16 @@ CREATE TABLE /*_*/uploadstash (
-- the original path
us_orig_path varchar(255) NOT NULL,
-
+
-- the temporary path at which the file is actually stored
us_path varchar(255) NOT NULL,
-
+
-- which type of upload the file came from (sometimes)
us_source_type varchar(50),
-
+
-- the date/time on which the file was added
us_timestamp varbinary(14) not null,
-
+
us_status varchar(50) not null,
-- file properties from File::getPropsFromPath. these may prove unnecessary.
@@ -33,12 +33,11 @@ CREATE TABLE /*_*/uploadstash (
us_sha1 varchar(31) NOT NULL,
us_mime varchar(255),
-- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
- us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
+ us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
-- image-specific properties
us_image_width int unsigned,
us_image_height int unsigned,
us_image_bits smallint unsigned
-
) /*$wgDBTableOptions*/;
-- sometimes there's a delete for all of a user's stuff.
diff --git a/maintenance/archives/patch-user-realname.sql b/maintenance/archives/patch-user-realname.sql
index 96edaa43..de7cee75 100644
--- a/maintenance/archives/patch-user-realname.sql
+++ b/maintenance/archives/patch-user-realname.sql
@@ -1,5 +1,5 @@
-- Add a 'real name' field where users can specify the name they want
-- used for author attribution or other places that real names matter.
-ALTER TABLE user
+ALTER TABLE user
ADD (user_real_name varchar(255) binary NOT NULL default '');
diff --git a/maintenance/archives/patch-user_former_groups.sql b/maintenance/archives/patch-user_former_groups.sql
index ef56db06..b043196d 100644
--- a/maintenance/archives/patch-user_former_groups.sql
+++ b/maintenance/archives/patch-user_former_groups.sql
@@ -1,9 +1,9 @@
--- Stores the groups the user has once belonged to.
+-- Stores the groups the user has once belonged to.
-- The user may still belong these groups. Check user_groups.
CREATE TABLE /*_*/user_former_groups (
-- Key to user_id
ufg_user int unsigned NOT NULL default 0,
- ufg_group varbinary(32) NOT NULL default ''
+ ufg_group varbinary(255) NOT NULL default ''
) /*$wgDBTableOptions*/;
CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg_group);
diff --git a/maintenance/archives/patch-user_groups.sql b/maintenance/archives/patch-user_groups.sql
index c3740332..1683cf2a 100644
--- a/maintenance/archives/patch-user_groups.sql
+++ b/maintenance/archives/patch-user_groups.sql
@@ -9,7 +9,7 @@
CREATE TABLE /*$wgDBprefix*/user_groups (
-- Key to user_id
ug_user int unsigned NOT NULL default '0',
-
+
-- Group names are short symbolic string keys.
-- The set of group names is open-ended, though in practice
-- only some predefined ones are likely to be used.
@@ -19,7 +19,7 @@ CREATE TABLE /*$wgDBprefix*/user_groups (
-- permissions of any group they're explicitly in, plus
-- the implicit '*' and 'user' groups.
ug_group varbinary(16) NOT NULL default '',
-
+
PRIMARY KEY (ug_user,ug_group),
KEY (ug_group)
) /*$wgDBTableOptions*/;
diff --git a/maintenance/archives/patch-user_properties.sql b/maintenance/archives/patch-user_properties.sql
index e30e00dc..85b00616 100644
--- a/maintenance/archives/patch-user_properties.sql
+++ b/maintenance/archives/patch-user_properties.sql
@@ -10,10 +10,10 @@
CREATE TABLE /*_*/user_properties(
-- Foreign key to user.user_id
up_user int not null,
-
+
-- Name of the option being saved. This is indexed for bulk lookup.
up_property varbinary(32) not null,
-
+
-- Property value as a string.
up_value blob
) /*$wgDBTableOptions*/;
diff --git a/maintenance/archives/patch-user_rights.sql b/maintenance/archives/patch-user_rights.sql
index 9866654c..4947cb1f 100644
--- a/maintenance/archives/patch-user_rights.sql
+++ b/maintenance/archives/patch-user_rights.sql
@@ -8,10 +8,10 @@
CREATE TABLE /*$wgDBprefix*/user_rights (
-- Key to user_id
ur_user int unsigned NOT NULL,
-
+
-- Comma-separated list of permission keys
ur_rights tinyblob NOT NULL,
-
+
UNIQUE KEY ur_user (ur_user)
) /*$wgDBTableOptions*/;
diff --git a/maintenance/archives/upgradeLogging.php b/maintenance/archives/upgradeLogging.php
index 2c28011b..f0806458 100644
--- a/maintenance/archives/upgradeLogging.php
+++ b/maintenance/archives/upgradeLogging.php
@@ -34,9 +34,9 @@ class UpdateLogging {
/**
* @var DatabaseBase
*/
- var $dbw;
- var $batchSize = 1000;
- var $minTs = false;
+ public $dbw;
+ public $batchSize = 1000;
+ public $minTs = false;
function execute() {
$this->dbw = wfGetDB( DB_MASTER );
@@ -211,4 +211,3 @@ EOT;
$ul = new UpdateLogging;
$ul->execute();
-
diff --git a/maintenance/backupPrefetch.inc b/maintenance/backupPrefetch.inc
index 0e12a1ce..cc0a7e17 100644
--- a/maintenance/backupPrefetch.inc
+++ b/maintenance/backupPrefetch.inc
@@ -48,9 +48,9 @@ class BaseDump {
var $infiles = null;
function BaseDump( $infile ) {
- $this->infiles = explode(';',$infile);
+ $this->infiles = explode( ';', $infile );
$this->reader = new XMLReader();
- $infile = array_shift($this->infiles);
+ $infile = array_shift( $this->infiles );
if (defined( 'LIBXML_PARSEHUGE' ) ) {
$this->reader->open( $infile, null, LIBXML_PARSEHUGE );
}
diff --git a/maintenance/backupTextPass.inc b/maintenance/backupTextPass.inc
index f1f09546..0b8b3445 100644
--- a/maintenance/backupTextPass.inc
+++ b/maintenance/backupTextPass.inc
@@ -169,7 +169,7 @@ class TextPassDumper extends BackupDumper {
$this->xmlwriterobj = new XmlDumpWriter();
$input = fopen( $this->input, "rt" );
- $result = $this->readDump( $input );
+ $this->readDump( $input );
if ( $this->spawnProc ) {
$this->closeSpawn();
@@ -294,7 +294,7 @@ class TextPassDumper extends BackupDumper {
}
function setTimeExceeded() {
- $this->timeExceeded = True;
+ $this->timeExceeded = true;
}
function checkIfTimeExceeded() {
diff --git a/maintenance/benchmarks/Benchmarker.php b/maintenance/benchmarks/Benchmarker.php
index c198e0ff..98b35b53 100644
--- a/maintenance/benchmarks/Benchmarker.php
+++ b/maintenance/benchmarks/Benchmarker.php
@@ -75,7 +75,7 @@ abstract class Benchmarker extends Maintenance {
}
}
- public function getFormattedResults( ) {
+ public function getFormattedResults() {
$ret = '';
foreach( $this->results as $res ) {
// show function with args
diff --git a/maintenance/benchmarks/bench_strtr_str_replace.php b/maintenance/benchmarks/bench_strtr_str_replace.php
index 9fa7c8e3..10c5cd0b 100644
--- a/maintenance/benchmarks/bench_strtr_str_replace.php
+++ b/maintenance/benchmarks/bench_strtr_str_replace.php
@@ -26,11 +26,11 @@
require_once( __DIR__ . '/Benchmarker.php' );
function bfNormalizeTitleStrTr( $str ) {
- return strtr( $str, '_', ' ' );
+ return strtr( $str, '_', ' ' );
}
function bfNormalizeTitleStrReplace( $str ) {
- return str_replace( '_', ' ', $str );
+ return str_replace( '_', ' ', $str );
}
/**
diff --git a/maintenance/benchmarks/bench_wfBaseConvert.php b/maintenance/benchmarks/bench_wfBaseConvert.php
new file mode 100644
index 00000000..a1e5c6a4
--- /dev/null
+++ b/maintenance/benchmarks/bench_wfBaseConvert.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Benchmark for wfBaseConvert
+ *
+ * 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 Benchmark
+ * @author Tyler Romeo
+ */
+
+require_once( __DIR__ . '/Benchmarker.php' );
+
+/**
+ * Maintenance script that benchmarks wfBaseConvert().
+ *
+ * @ingroup Benchmark
+ */
+class bench_wfBaseConvert extends Benchmarker {
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Benchmark for wfBaseConvert.";
+ $this->addOption( "inbase", "Input base", false, true );
+ $this->addOption( "outbase", "Output base", false, true );
+ $this->addOption( "length", "Size in digits to generate for input", false, true );
+ }
+
+ public function execute() {
+ $inbase = $this->getOption( "inbase", 36 );
+ $outbase = $this->getOption( "outbase", 16 );
+ $length = $this->getOption( "length", 128 );
+ $number = self::makeRandomNumber( $inbase, $length );
+
+ $this->bench( array(
+ array(
+ 'function' => 'wfBaseConvert',
+ 'args' => array( $number, $inbase, $outbase, 0, true, 'php' )
+ ),
+ array(
+ 'function' => 'wfBaseConvert',
+ 'args' => array( $number, $inbase, $outbase, 0, true, 'bcmath' )
+ ),
+ array(
+ 'function' => 'wfBaseConvert',
+ 'args' => array( $number, $inbase, $outbase, 0, true, 'gmp' )
+ ),
+ ));
+
+ $this->output( $this->getFormattedResults() );
+ }
+
+ protected static function makeRandomNumber( $base, $length ) {
+ $baseChars = "0123456789abcdefghijklmnopqrstuvwxyz";
+ $res = "";
+ for( $i = 0; $i < $length; $i++ ) {
+ $res .= $baseChars[mt_rand(0, $base - 1)];
+ }
+ return $res;
+ }
+}
+
+$maintClass = 'bench_wfBaseConvert';
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/changePassword.php b/maintenance/changePassword.php
index f276fc16..861610b7 100644
--- a/maintenance/changePassword.php
+++ b/maintenance/changePassword.php
@@ -46,7 +46,7 @@ class ChangePassword extends Maintenance {
} elseif ( $this->hasOption( "userid" ) ) {
$user = User::newFromId( $this->getOption( 'userid' ) );
} else {
- $this->error( "A \"user\" or \"userid\" must be set to change the password for" , true );
+ $this->error( "A \"user\" or \"userid\" must be set to change the password for", true );
}
if ( !$user || !$user->getId() ) {
$this->error( "No such user: " . $this->getOption( 'user' ), true );
diff --git a/maintenance/checkAutoLoader.php b/maintenance/checkAutoLoader.php
deleted file mode 100644
index 8d0e442b..00000000
--- a/maintenance/checkAutoLoader.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-/**
- * Check the autoloader
- *
- * 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 Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script to check classes definitions in the autoloader.
- *
- * @ingroup Maintenance
- */
-class CheckAutoLoader extends Maintenance {
- public function __construct() {
- parent::__construct();
- $this->mDescription = "AutoLoader sanity checks";
- }
- public function execute() {
- global $wgAutoloadLocalClasses, $IP;
- $files = array_unique( $wgAutoloadLocalClasses );
-
- foreach ( $files as $file ) {
- if ( function_exists( 'parsekit_compile_file' ) ) {
- $parseInfo = parsekit_compile_file( "$IP/$file" );
- $classes = array_keys( $parseInfo['class_table'] );
- } else {
- $contents = file_get_contents( "$IP/$file" );
- $m = array();
- preg_match_all( '/\n\s*class\s+([a-zA-Z0-9_]+)/', $contents, $m, PREG_PATTERN_ORDER );
- $classes = $m[1];
- }
- foreach ( $classes as $class ) {
- if ( !isset( $wgAutoloadLocalClasses[$class] ) ) {
- // printf( "%-50s Unlisted, in %s\n", $class, $file );
- $this->output( "\t'$class' => '$file',\n" );
- } elseif ( $wgAutoloadLocalClasses[$class] !== $file ) {
- $this->output( "$class: Wrong file: found in $file, listed in " . $wgAutoloadLocalClasses[$class] . "\n" );
- }
- }
- }
- }
-}
-
-$maintClass = "CheckAutoLoader";
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/checkBadRedirects.php b/maintenance/checkBadRedirects.php
index 670b93de..4ba7e66b 100644
--- a/maintenance/checkBadRedirects.php
+++ b/maintenance/checkBadRedirects.php
@@ -50,7 +50,7 @@ class CheckBadRedirects extends Maintenance {
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
$rev = Revision::newFromId( $row->page_latest );
if ( $rev ) {
- $target = Title::newFromRedirect( $rev->getText() );
+ $target = $rev->getContent()->getRedirectTarget();
if ( !$target ) {
$this->output( $title->getPrefixedText() . "\n" );
}
diff --git a/maintenance/checkSyntax.php b/maintenance/checkSyntax.php
index 0a22f58c..1e44e239 100644
--- a/maintenance/checkSyntax.php
+++ b/maintenance/checkSyntax.php
@@ -368,4 +368,3 @@ class CheckSyntax extends Maintenance {
$maintClass = "CheckSyntax";
require_once( RUN_MAINTENANCE_IF_MAIN );
-
diff --git a/maintenance/cleanupPreferences.php b/maintenance/cleanupPreferences.php
index f37af775..c0a526b7 100644
--- a/maintenance/cleanupPreferences.php
+++ b/maintenance/cleanupPreferences.php
@@ -1,52 +1,52 @@
-<?php
-/**
- * Remove hidden preferences from the database.
- *
- * 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 TyA <tya.wiki@gmail.com>
- * @see [[bugzilla:30976]]
- * @ingroup Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script that removes hidden preferences from the database.
- *
- * @ingroup Maintenance
- */
-class CleanupPreferences extends Maintenance {
- public function execute() {
- global $wgHiddenPrefs;
-
- $dbw = wfGetDB( DB_MASTER );
- $dbw->begin();
- foreach( $wgHiddenPrefs as $item ) {
- $dbw->delete(
- 'user_properties',
- array( 'up_property' => $item ),
- __METHOD__
- );
- };
- $dbw->commit();
- $this->output( "Finished!\n" );
- }
-}
-
-$maintClass = 'CleanupPreferences'; // Tells it to run the class
-require_once( RUN_MAINTENANCE_IF_MAIN );
+<?php
+/**
+ * Remove hidden preferences from the database.
+ *
+ * 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 TyA <tya.wiki@gmail.com>
+ * @see [[bugzilla:30976]]
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script that removes hidden preferences from the database.
+ *
+ * @ingroup Maintenance
+ */
+class CleanupPreferences extends Maintenance {
+ public function execute() {
+ global $wgHiddenPrefs;
+
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->begin( __METHOD__ );
+ foreach( $wgHiddenPrefs as $item ) {
+ $dbw->delete(
+ 'user_properties',
+ array( 'up_property' => $item ),
+ __METHOD__
+ );
+ };
+ $dbw->commit( __METHOD__ );
+ $this->output( "Finished!\n" );
+ }
+}
+
+$maintClass = 'CleanupPreferences'; // Tells it to run the class
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/cleanupSpam.php b/maintenance/cleanupSpam.php
index e20bcd87..a41423ae 100644
--- a/maintenance/cleanupSpam.php
+++ b/maintenance/cleanupSpam.php
@@ -44,7 +44,7 @@ class CleanupSpam extends Maintenance {
$username = wfMessage( 'spambot_username' )->text();
$wgUser = User::newFromName( $username );
if ( !$wgUser ) {
- $this->error( "Invalid username", true );
+ $this->error( "Invalid username specified in 'spambot_username' message: $username", true );
}
// Create the user if necessary
if ( !$wgUser->getId() ) {
@@ -103,7 +103,8 @@ class CleanupSpam extends Maintenance {
$rev = Revision::newFromTitle( $title );
$currentRevId = $rev->getId();
- while ( $rev && ( $rev->isDeleted( Revision::DELETED_TEXT ) || LinkFilter::matchEntry( $rev->getText() , $domain ) ) ) {
+ while ( $rev && ( $rev->isDeleted( Revision::DELETED_TEXT )
+ || LinkFilter::matchEntry( $rev->getContent( Revision::RAW ), $domain ) ) ) {
$rev = $rev->getPrevious();
}
@@ -117,8 +118,10 @@ class CleanupSpam extends Maintenance {
$page = WikiPage::factory( $title );
if ( $rev ) {
// Revert to this revision
+ $content = $rev->getContent( Revision::RAW );
+
$this->output( "reverting\n" );
- $page->doEdit( $rev->getText(), wfMessage( 'spam_reverting', $domain )->inContentLanguage()->text(),
+ $page->doEditContent( $content, wfMessage( 'spam_reverting', $domain )->inContentLanguage()->text(),
EDIT_UPDATE, $rev->getId() );
} elseif ( $this->hasOption( 'delete' ) ) {
// Didn't find a non-spammy revision, blank the page
@@ -126,8 +129,11 @@ class CleanupSpam extends Maintenance {
$page->doDeleteArticle( wfMessage( 'spam_deleting', $domain )->inContentLanguage()->text() );
} else {
// Didn't find a non-spammy revision, blank the page
+ $handler = ContentHandler::getForTitle( $title );
+ $content = $handler->makeEmptyContent();
+
$this->output( "blanking\n" );
- $page->doEdit( '', wfMessage( 'spam_blanking', $domain )->inContentLanguage()->text() );
+ $page->doEditContent( $content, wfMessage( 'spam_blanking', $domain )->inContentLanguage()->text() );
}
$dbw->commit( __METHOD__ );
}
diff --git a/maintenance/cleanupTitles.php b/maintenance/cleanupTitles.php
index ad2577aa..66f9e87f 100644
--- a/maintenance/cleanupTitles.php
+++ b/maintenance/cleanupTitles.php
@@ -114,7 +114,7 @@ class TitleCleanup extends TableCleanup {
protected function moveInconsistentPage( $row, $title ) {
if ( $title->exists() || $title->getInterwiki() || !$title->canExist() ) {
if ( $title->getInterwiki() || !$title->canExist() ) {
- $prior = $title->getPrefixedDbKey();
+ $prior = $title->getPrefixedDBkey();
} else {
$prior = $title->getDBkey();
}
diff --git a/maintenance/cleanupUploadStash.php b/maintenance/cleanupUploadStash.php
index cc329461..441e8ae3 100644
--- a/maintenance/cleanupUploadStash.php
+++ b/maintenance/cleanupUploadStash.php
@@ -41,50 +41,98 @@ class UploadStashCleanup extends Maintenance {
}
public function execute() {
+ global $wgUploadStashMaxAge;
+
$repo = RepoGroup::singleton()->getLocalRepo();
+ $tempRepo = $repo->getTempRepo();
$dbr = $repo->getSlaveDb();
// how far back should this look for files to delete?
- global $wgUploadStashMaxAge;
+ $cutoff = time() - $wgUploadStashMaxAge;
$this->output( "Getting list of files to clean up...\n" );
$res = $dbr->select(
'uploadstash',
'us_key',
- 'us_timestamp < ' . $dbr->addQuotes( $dbr->timestamp( time() - $wgUploadStashMaxAge ) ),
+ 'us_timestamp < ' . $dbr->addQuotes( $dbr->timestamp( $cutoff ) ),
__METHOD__
);
- if( !is_object( $res ) || $res->numRows() == 0 ) {
- $this->output( "No files to cleanup!\n" );
- // nothing to do.
- return;
- }
+ // Delete all registered stash files...
+ if ( $res->numRows() == 0 ) {
+ $this->output( "No stashed files to cleanup according to the DB.\n" );
+ } else {
+ // finish the read before starting writes.
+ $keys = array();
+ foreach( $res as $row ) {
+ array_push( $keys, $row->us_key );
+ }
+
+ $this->output( 'Removing ' . count( $keys ) . " file(s)...\n" );
+ // this could be done some other, more direct/efficient way, but using
+ // UploadStash's own methods means it's less likely to fall accidentally
+ // out-of-date someday
+ $stash = new UploadStash( $repo );
- // finish the read before starting writes.
- $keys = array();
- foreach( $res as $row ) {
- array_push( $keys, $row->us_key );
+ $i = 0;
+ foreach( $keys as $key ) {
+ $i++;
+ try {
+ $stash->getFile( $key, true );
+ $stash->removeFileNoAuth( $key );
+ } catch ( UploadStashBadPathException $ex ) {
+ $this->output( "Failed removing stashed upload with key: $key\n" );
+ } catch ( UploadStashZeroLengthFileException $ex ) {
+ $this->output( "Failed removing stashed upload with key: $key\n" );
+ }
+ if ( $i % 100 == 0 ) {
+ $this->output( "$i\n" );
+ }
+ }
+ $this->output( "$i done\n" );
}
- $this->output( 'Removing ' . count($keys) . " file(s)...\n" );
- // this could be done some other, more direct/efficient way, but using
- // UploadStash's own methods means it's less likely to fall accidentally
- // out-of-date someday
- $stash = new UploadStash( $repo );
+ // Delete all the corresponding thumbnails...
+ $dir = $tempRepo->getZonePath( 'thumb' );
+ $iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir ) );
+ $this->output( "Deleting old thumbnails...\n" );
+ $i = 0;
+ foreach ( $iterator as $file ) {
+ if ( wfTimestamp( TS_UNIX, $tempRepo->getFileTimestamp( "$dir/$file" ) ) < $cutoff ) {
+ $status = $tempRepo->quickPurge( "$dir/$file" );
+ if ( !$status->isOK() ) {
+ $this->error( print_r( $status->getErrorsArray(), true ) );
+ }
+ if ( ( ++$i % 100 ) == 0 ) {
+ $this->output( "$i\n" );
+ }
+ }
+ }
+ $this->output( "$i done\n" );
+ // Apparently lots of stash files are not registered in the DB...
+ $dir = $tempRepo->getZonePath( 'public' );
+ $iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir ) );
+ $this->output( "Deleting orphaned temp files...\n" );
+ if ( strpos( $dir, '/local-temp' ) === false ) { // sanity check
+ $this->error( "Temp repo is not using the temp container.", 1 ); // die
+ }
$i = 0;
- foreach( $keys as $key ) {
- $i++;
- try {
- $stash->getFile( $key, true );
- $stash->removeFileNoAuth( $key );
- } catch ( UploadStashBadPathException $ex ) {
- $this->output( "Failed removing stashed upload with key: $key\n" );
+ foreach ( $iterator as $file ) {
+ // Absolute sanity check for stashed files and file segments
+ if ( !preg_match( '#(^\d{14}!|\.\d+\.\w+\.\d+$)#', basename( $file ) ) ) {
+ $this->output( "Skipped non-stash $file\n" );
+ continue;
}
- if ( $i % 100 == 0 ) {
- $this->output( "$i\n" );
+ if ( wfTimestamp( TS_UNIX, $tempRepo->getFileTimestamp( "$dir/$file" ) ) < $cutoff ) {
+ $status = $tempRepo->quickPurge( "$dir/$file" );
+ if ( !$status->isOK() ) {
+ $this->error( print_r( $status->getErrorsArray(), true ) );
+ }
+ if ( ( ++$i % 100 ) == 0 ) {
+ $this->output( "$i\n" );
+ }
}
}
$this->output( "$i done\n" );
diff --git a/maintenance/clearCacheStats.php b/maintenance/clearCacheStats.php
new file mode 100644
index 00000000..7a0d664a
--- /dev/null
+++ b/maintenance/clearCacheStats.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Removes all statistics tracking from the cache.
+ *
+ * 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 Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to remove all statistics tracking from the cache.
+ *
+ * @ingroup Maintenance
+ */
+class ClearCacheStats extends Maintenance {
+
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Remove all statistics tracking from the cache";
+ }
+
+ public function execute() {
+ global $wgLocalDatabases, $wgMemc;
+ foreach ( $wgLocalDatabases as $db ) {
+ $wgMemc->delete( "$db:stats:request_with_session" );
+ $wgMemc->delete( "$db:stats:request_without_session" );
+ $wgMemc->delete( "$db:stats:pcache_hit" );
+ $wgMemc->delete( "$db:stats:pcache_miss_expired" );
+ $wgMemc->delete( "$db:stats:pcache_miss_absent" );
+ $wgMemc->delete( "$db:stats:pcache_miss_stub" );
+ $wgMemc->delete( "$db:stats:image_cache_hit" );
+ $wgMemc->delete( "$db:stats:image_cache_miss" );
+ $wgMemc->delete( "$db:stats:image_cache_update" );
+ $wgMemc->delete( "$db:stats:diff_cache_hit" );
+ $wgMemc->delete( "$db:stats:diff_cache_miss" );
+ $wgMemc->delete( "$db:stats:diff_uncacheable" );
+ $wgMemc->delete( "$db:stats:job-insert" );
+ $wgMemc->delete( "$db:stats:job-pop" );
+ }
+ }
+}
+
+$maintClass = "ClearCacheStats";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/clear_interwiki_cache.php b/maintenance/clearInterwikiCache.php
index 88769df2..88769df2 100644
--- a/maintenance/clear_interwiki_cache.php
+++ b/maintenance/clearInterwikiCache.php
diff --git a/maintenance/clear_stats.php b/maintenance/clear_stats.php
deleted file mode 100644
index 4581d532..00000000
--- a/maintenance/clear_stats.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-/**
- * Removes all statistics tracking from the cache.
- *
- * 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 Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script to remove all statistics tracking from the cache.
- *
- * @ingroup Maintenance
- */
-class clear_stats extends Maintenance {
-
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Remove all statistics tracking from the cache";
- }
-
- public function execute() {
- global $wgLocalDatabases, $wgMemc;
- foreach ( $wgLocalDatabases as $db ) {
- $wgMemc->delete( "$db:stats:request_with_session" );
- $wgMemc->delete( "$db:stats:request_without_session" );
- $wgMemc->delete( "$db:stats:pcache_hit" );
- $wgMemc->delete( "$db:stats:pcache_miss_expired" );
- $wgMemc->delete( "$db:stats:pcache_miss_absent" );
- $wgMemc->delete( "$db:stats:pcache_miss_stub" );
- $wgMemc->delete( "$db:stats:image_cache_hit" );
- $wgMemc->delete( "$db:stats:image_cache_miss" );
- $wgMemc->delete( "$db:stats:image_cache_update" );
- $wgMemc->delete( "$db:stats:diff_cache_hit" );
- $wgMemc->delete( "$db:stats:diff_cache_miss" );
- $wgMemc->delete( "$db:stats:diff_uncacheable" );
- $wgMemc->delete( "$db:stats:job-insert" );
- $wgMemc->delete( "$db:stats:job-pop" );
- }
- }
-}
-
-$maintClass = "clear_stats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/compareParsers.php b/maintenance/compareParsers.php
index a3337173..1f3ac1c3 100644
--- a/maintenance/compareParsers.php
+++ b/maintenance/compareParsers.php
@@ -114,15 +114,24 @@ class CompareParsers extends DumpIterator {
$parser1 = new $parser1Name();
$parser2 = new $parser2Name();
- $output1 = $parser1->parse( $rev->getText(), $title, $this->options );
- $output2 = $parser2->parse( $rev->getText(), $title, $this->options );
+ $content = $rev->getContent();
+
+ if ( $content->getModel() !== CONTENT_MODEL_WIKITEXT ) {
+ $this->error( "Page {$title->getPrefixedText()} does not contain wikitext but {$content->getModel()}\n" );
+ return;
+ }
+
+ $text = strval( $content->getNativeData() );
+
+ $output1 = $parser1->parse( $text, $title, $this->options );
+ $output2 = $parser2->parse( $text, $title, $this->options );
if ( $output1->getText() != $output2->getText() ) {
$this->failed++;
$this->error( "Parsing for {$title->getPrefixedText()} differs\n" );
if ( $this->saveFailed ) {
- file_put_contents( $this->saveFailed . '/' . rawurlencode( $title->getPrefixedText() ) . ".txt", $rev->getText());
+ file_put_contents( $this->saveFailed . '/' . rawurlencode( $title->getPrefixedText() ) . ".txt", $text );
}
if ( $this->showDiff ) {
$this->output( wfDiff( $this->stripParameters( $output1->getText() ), $this->stripParameters( $output2->getText() ), '' ) );
diff --git a/maintenance/convertUserOptions.php b/maintenance/convertUserOptions.php
index 7c9ca269..e2223e1a 100644
--- a/maintenance/convertUserOptions.php
+++ b/maintenance/convertUserOptions.php
@@ -56,7 +56,7 @@ class ConvertUserOptions extends Maintenance {
array( 'LIMIT' => 50, 'FOR UPDATE' )
);
$id = $this->convertOptionBatch( $res, $dbw );
- $dbw->commit();
+ $dbw->commit( __METHOD__ );
wfWaitForSlaves();
diff --git a/maintenance/copyFileBackend.php b/maintenance/copyFileBackend.php
index aebdee17..f2c4ac54 100644
--- a/maintenance/copyFileBackend.php
+++ b/maintenance/copyFileBackend.php
@@ -134,6 +134,21 @@ class CopyFileBackend extends Maintenance {
$ops = array();
$fsFiles = array();
$copiedRel = array(); // for output message
+
+ // Download the batch of source files into backend cache...
+ if ( $this->hasOption( 'missingonly' ) ) {
+ $srcPaths = array();
+ foreach ( $srcPathsRel as $srcPathRel ) {
+ $srcPaths[] = $src->getRootStoragePath() . "/$backendRel/$srcPathRel";
+ }
+ $t_start = microtime( true );
+ $fsFiles = $src->getLocalReferenceMulti( array( 'srcs' => $srcPaths, 'latest' => 1 ) );
+ $ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
+ $this->output( "\nDownloaded these file(s) [{$ellapsed_ms}ms]:\n" .
+ implode( "\n", $srcPaths ) . "\n\n" );
+ }
+
+ // Determine what files need to be copied over...
foreach ( $srcPathsRel as $srcPathRel ) {
$srcPath = $src->getRootStoragePath() . "/$backendRel/$srcPathRel";
$dstPath = $dst->getRootStoragePath() . "/$backendRel/$srcPathRel";
@@ -144,8 +159,9 @@ class CopyFileBackend extends Maintenance {
$this->output( "Already have $srcPathRel.\n" );
continue; // assume already copied...
}
- // Note: getLocalReference() is fast for FS backends
- $fsFile = $src->getLocalReference( array( 'src' => $srcPath, 'latest' => 1 ) );
+ $fsFile = array_key_exists( $srcPath, $fsFiles )
+ ? $fsFiles[$srcPath]
+ : $src->getLocalReference( array( 'src' => $srcPath, 'latest' => 1 ) );
if ( !$fsFile ) {
$this->error( "Could not get local copy of $srcPath.", 1 ); // die
} elseif ( !$fsFile->exists() ) {
@@ -167,6 +183,7 @@ class CopyFileBackend extends Maintenance {
$copiedRel[] = $srcPathRel;
}
+ // Copy in the batch of source files...
$t_start = microtime( true );
$status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
if ( !$status->isOK() ) {
diff --git a/maintenance/createAndPromote.php b/maintenance/createAndPromote.php
index ad5333fc..81fbbb3d 100644
--- a/maintenance/createAndPromote.php
+++ b/maintenance/createAndPromote.php
@@ -20,6 +20,7 @@
* @file
* @ingroup Maintenance
* @author Rob Church <robchur@gmail.com>
+ * @author Pablo Castellano <pablo@anche.no>
*/
require_once( __DIR__ . '/Maintenance.php' );
@@ -31,50 +32,82 @@ require_once( __DIR__ . '/Maintenance.php' );
*/
class CreateAndPromote extends Maintenance {
+ static $permitRoles = array( 'sysop', 'bureaucrat' );
+
public function __construct() {
parent::__construct();
- $this->mDescription = "Create a new user account";
- $this->addOption( "sysop", "Grant the account sysop rights" );
- $this->addOption( "bureaucrat", "Grant the account bureaucrat rights" );
+ $this->mDescription = "Create a new user account and/or grant it additional rights";
+ $this->addOption( "force", "If acccount exists already, just grant it rights or change password." );
+ foreach( self::$permitRoles as $role ) {
+ $this->addOption( $role, "Add the account to the {$role} group" );
+ }
$this->addArg( "username", "Username of new user" );
- $this->addArg( "password", "Password to set" );
+ $this->addArg( "password", "Password to set (not required if --force is used)", false);
}
public function execute() {
$username = $this->getArg( 0 );
$password = $this->getArg( 1 );
-
- $this->output( wfWikiID() . ": Creating and promoting User:{$username}..." );
+ $force = $this->hasOption( 'force' );
+ $inGroups = array();
$user = User::newFromName( $username );
if ( !is_object( $user ) ) {
$this->error( "invalid username.", true );
- } elseif ( 0 != $user->idForName() ) {
- $this->error( "account exists.", true );
}
- # Try to set the password
- try {
- $user->setPassword( $password );
- } catch ( PasswordError $pwe ) {
- $this->error( $pwe->getText(), true );
+ $exists = ( 0 !== $user->idForName() );
+
+ if ( $exists && !$force ) {
+ $this->error( "Account exists. Perhaps you want the --force option?", true );
+ } else if ( !$exists && !$password ) {
+ $this->error( "Argument <password> required!", false );
+ $this->maybeHelp( true );
+ } else if ( $exists ) {
+ $inGroups = $user->getGroups();
}
- # Insert the account into the database
- $user->addToDatabase();
- $user->saveSettings();
+ $promotions = array_diff( array_filter( self::$permitRoles, array( $this, 'hasOption' ) ), $inGroups );
- # Promote user
- if ( $this->hasOption( 'sysop' ) ) {
- $user->addGroup( 'sysop' );
+ if ( $exists && !$password && count( $promotions ) === 0 ) {
+ $this->output( "Account exists and nothing to do.\n" );
+ return;
+ } else if ( count( $promotions ) !== 0 ) {
+ $promoText = "User:{$username} into " . implode( ', ', $promotions ) . "...\n";
+ if ( $exists ) {
+ $this->output( wfWikiID() . ": Promoting $promoText" );
+ } else {
+ $this->output( wfWikiID() . ": Creating and promoting $promoText" );
+ }
}
- if ( $this->hasOption( 'bureaucrat' ) ) {
- $user->addGroup( 'bureaucrat' );
+
+ if ( $password ) {
+ # Try to set the password
+ try {
+ $user->setPassword( $password );
+ if ( $exists ) {
+ $this->output( "Password set.\n" );
+ $user->saveSettings();
+ }
+ } catch ( PasswordError $pwe ) {
+ $this->error( $pwe->getText(), true );
+ }
}
- # Increment site_stats.ss_users
- $ssu = new SiteStatsUpdate( 0, 0, 0, 0, 1 );
- $ssu->doUpdate();
+ if ( !$exists ) {
+ # Insert the account into the database
+ $user->addToDatabase();
+ $user->saveSettings();
+ }
+
+ # Promote user
+ array_map( array( $user, 'addGroup' ), $promotions );
+
+ if ( !$exists ) {
+ # Increment site_stats.ss_users
+ $ssu = new SiteStatsUpdate( 0, 0, 0, 0, 1 );
+ $ssu->doUpdate();
+ }
$this->output( "done.\n" );
}
diff --git a/maintenance/cssjanus/README b/maintenance/cssjanus/README
index 9b922156..1b96d1a2 100644
--- a/maintenance/cssjanus/README
+++ b/maintenance/cssjanus/README
@@ -8,18 +8,18 @@ Author: `Lindsey Simon <elsigh@google.com>`
CSSJanus is CSS parser utility designed to aid the conversion of a website's
layout from left-to-right(LTR) to right-to-left(RTL). The script was born out of
-a need to convert CSS for RTL languages when tables are not being used for layout (since tables will automatically reorder TD's in RTL).
+a need to convert CSS for RTL languages when tables are not being used for layout (since tables will automatically reorder TD's in RTL).
CSSJanus will change most of the obvious CSS property names and their values as
-well as some not-so-obvious ones (cursor, background-position %, etc...).
-The script is designed to offer flexibility to account for cases when you do
+well as some not-so-obvious ones (cursor, background-position %, etc...).
+The script is designed to offer flexibility to account for cases when you do
not want to change certain rules which exist to account for bidirectional text
display bugs, as well as situations where you may or may not want to flip annotations inside of the background url string.
-Note that you can disable CSSJanus from running on an entire class or any
+Note that you can disable CSSJanus from running on an entire class or any
rule within a class by prepending a /* @noflip */ comment before the rule(s)
you want CSSJanus to ignore.
CSSJanus itself is not always enough to make a website that works in a LTR
-language context work in a RTL language all the way, but it is a start.
+language context work in a RTL language all the way, but it is a start.
==Getting the code==
@@ -31,7 +31,7 @@ Check out the latest development version anonymously with:
{{{
$ svn checkout http://cssjanus.googlecode.com/svn/trunk/ cssjanus
-}}}
+}}}
==Using==
@@ -41,13 +41,13 @@ Flags:
--swap_left_right_in_url: Fixes "left"/"right" string within urls.
Ex: ./cssjanus.py --swap_left_right_in_url < file.css > file_rtl.css
--swap_ltr_rtl_in_url: Fixes "ltr"/"rtl" string within urls.
- Ex: ./cssjanus.py --swap_ltr_rtl_in_url < file.css > file_rtl.css
-
+ Ex: ./cssjanus.py --swap_ltr_rtl_in_url < file.css > file_rtl.css
+
If you'd like to make use of the webapp version of cssjanus, you'll need to
download the Google App Engine SDK
http://code.google.com/appengine/downloads.html
and also drop a "django" directory into this directory, with the latest svn
-from django. You should be good to go with that setup. Please let me know
+from django. You should be good to go with that setup. Please let me know
otherwise.
==Bugs, Patches==
@@ -76,13 +76,13 @@ Thanks to Jens Meiert for the German translation.
{{{
Copyright 2008 Google Inc. All Rights Reserved.
-
+
Licensed under the Apache License, Version 2.0 (the 'License');
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
-
+
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an 'AS IS' BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
diff --git a/maintenance/deleteArchivedFiles.inc b/maintenance/deleteArchivedFiles.inc
index e638b17c..792ee6c6 100644
--- a/maintenance/deleteArchivedFiles.inc
+++ b/maintenance/deleteArchivedFiles.inc
@@ -27,7 +27,7 @@
* @ingroup Maintenance
*/
class DeleteArchivedFilesImplementation {
- static public function doDelete( $output, $force ) {
+ public static function doDelete( $output, $force ) {
# Data should come off the master, wrapped in a transaction
$dbw = wfGetDB( DB_MASTER );
$dbw->begin( __METHOD__ );
@@ -35,14 +35,19 @@ class DeleteArchivedFilesImplementation {
$repo = RepoGroup::singleton()->getLocalRepo();
# Get "active" revisions from the filearchive table
$output->handleOutput( "Searching for and deleting archived files...\n" );
- $res = $dbw->query( "SELECT fa_id,fa_storage_group,fa_storage_key FROM $tbl_arch" );
+ $res = $dbw->query( "SELECT fa_id,fa_storage_group,fa_storage_key,fa_sha1 FROM $tbl_arch" );
$count = 0;
foreach ( $res as $row ) {
$key = $row->fa_storage_key;
$group = $row->fa_storage_group;
$id = $row->fa_id;
$path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
- $sha1 = substr( $key, 0, strcspn( $key, '.' ) );
+ if( isset( $row->fa_sha1 ) ) {
+ $sha1 = $row->fa_sha1;
+ } else {
+ // old row, populate from key
+ $sha1 = LocalRepo::getHashFromKey( $key );
+ }
// Check if the file is used anywhere...
$inuse = $dbw->selectField( 'oldimage', '1',
array( 'oi_sha1' => $sha1,
diff --git a/maintenance/deleteArchivedRevisions.inc b/maintenance/deleteArchivedRevisions.inc
index 414d41ad..dd8e3dd4 100644
--- a/maintenance/deleteArchivedRevisions.inc
+++ b/maintenance/deleteArchivedRevisions.inc
@@ -36,7 +36,7 @@ class DeleteArchivedRevisionsImplementation {
* purgeRedundantText(). See Maintenance for a description of
* those methods.
*/
- static public function doDelete( $maint ) {
+ public static function doDelete( $maint ) {
$dbw = wfGetDB( DB_MASTER );
$dbw->begin( __METHOD__ );
diff --git a/maintenance/deleteEqualMessages.php b/maintenance/deleteEqualMessages.php
new file mode 100644
index 00000000..7048140b
--- /dev/null
+++ b/maintenance/deleteEqualMessages.php
@@ -0,0 +1,186 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script that deletes all pages in the MediaWiki namespace
+ * of which the content is equal to the system default.
+ *
+ * @ingroup Maintenance
+ */
+class DeleteEqualMessages extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Deletes all pages in the MediaWiki namespace that are equal to the default message";
+ $this->addOption( 'delete', 'Actually delete the pages (default: dry run)' );
+ $this->addOption( 'delete-talk', 'Don\'t leave orphaned talk pages behind during deletion' );
+ $this->addOption( 'lang-code', 'Check for subpages of this language code (default: root page against content language). ' .
+ 'Use value "*" to run for all mwfile language code subpages (including the base pages that override content language).', false, true );
+ }
+
+ /**
+ * @param string|bool $langCode See --lang-code option.
+ */
+ protected function fetchMessageInfo( $langCode, array &$messageInfo ) {
+ global $wgUser, $wgContLang;
+
+ if ( $langCode ) {
+ $this->output( "\n... fetching message info for language: $langCode" );
+ $nonContLang = true;
+ } else {
+ $this->output( "\n... fetching message info for content language" );
+ $langCode = $wgContLang->getCode();
+ $nonContLang = false;
+ }
+
+ /* Based on SpecialAllmessages::reallyDoQuery #filter=modified */
+
+ $l10nCache = Language::getLocalisationCache();
+ $messageNames = $l10nCache->getSubitemList( 'en', 'messages' );
+ // Normalise message names for NS_MEDIAWIKI page_title
+ $messageNames = array_map( array( $wgContLang, 'ucfirst' ), $messageNames );
+
+ $statuses = AllmessagesTablePager::getCustomisedStatuses( $messageNames, $langCode, $nonContLang );
+ // getCustomisedStatuses is stripping the sub page from the page titles, add it back
+ $titleSuffix = $nonContLang ? "/$langCode" : '';
+
+ foreach ( $messageNames as $key ) {
+ $customised = isset( $statuses['pages'][$key] );
+ if ( $customised ) {
+ $actual = wfMessage( $key )->inLanguage( $langCode )->plain();
+ $default = wfMessage( $key )->inLanguage( $langCode )->useDatabase( false )->plain();
+
+ $messageInfo['relevantPages']++;
+ if ( $actual === $default ) {
+ $hasTalk = isset( $statuses['talks'][$key] );
+ $messageInfo['results'][] = array(
+ 'title' => $key . $titleSuffix,
+ 'hasTalk' => $hasTalk,
+ );
+ $messageInfo['equalPages']++;
+ if ( $hasTalk ) {
+ $messageInfo['equalPagesTalks']++;
+ }
+ }
+ }
+ }
+ }
+
+ public function execute() {
+ $doDelete = $this->hasOption( 'delete' );
+ $doDeleteTalk = $this->hasOption( 'delete-talk' );
+ $langCode = $this->getOption( 'lang-code' );
+
+ $messageInfo = array(
+ 'relevantPages' => 0,
+ 'equalPages' => 0,
+ 'equalPagesTalks' => 0,
+ 'results' => array(),
+ );
+
+ $this->output( 'Checking for pages with default message...' );
+
+ // Load message information
+ if ( $langCode ) {
+ $langCodes = Language::fetchLanguageNames( null, 'mwfile' );
+ if ( $langCode === '*' ) {
+ // All valid lang-code subpages in NS_MEDIAWIKI that
+ // override the messsages in that language
+ foreach ( $langCodes as $key => $value ) {
+ $this->fetchMessageInfo( $key, $messageInfo );
+ }
+ // Lastly, the base pages in NS_MEDIAWIKI that override
+ // messages in content language
+ $this->fetchMessageInfo( false, $messageInfo );
+ } else {
+ if ( !isset( $langCodes[$langCode] ) ) {
+ $this->error( 'Invalid language code: ' . $langCode, 1 );
+ }
+ $this->fetchMessageInfo( $langCode, $messageInfo );
+ }
+ } else {
+ $this->fetchMessageInfo( false, $messageInfo );
+ }
+
+ if ( $messageInfo['equalPages'] === 0 ) {
+ // No more equal messages left
+ $this->output( "\ndone.\n" );
+ return;
+ }
+
+ $this->output( "\n{$messageInfo['relevantPages']} pages in the MediaWiki namespace override messages." );
+ $this->output( "\n{$messageInfo['equalPages']} pages are equal to the default message (+ {$messageInfo['equalPagesTalks']} talk pages).\n" );
+
+ if ( !$doDelete ) {
+ $list = '';
+ foreach ( $messageInfo['results'] as $result ) {
+ $title = Title::makeTitle( NS_MEDIAWIKI, $result['title'] );
+ $list .= "* [[$title]]\n";
+ if ( $result['hasTalk'] ) {
+ $title = Title::makeTitle( NS_MEDIAWIKI_TALK, $result['title'] );
+ $list .= "* [[$title]]\n";
+ }
+ }
+ $this->output( "\nList:\n$list\nRun the script again with --delete to delete these pages" );
+ if ( $messageInfo['equalPagesTalks'] !== 0 ) {
+ $this->output( " (include --delete-talk to also delete the talk pages)" );
+ }
+ $this->output( "\n" );
+ return;
+ }
+
+ $user = User::newFromName( 'MediaWiki default' );
+ if ( !$user ) {
+ $this->error( "Invalid username", true );
+ }
+ $wgUser = $user;
+
+ // Hide deletions from RecentChanges
+ $user->addGroup( 'bot' );
+
+ // Handle deletion
+ $this->output( "\n...deleting equal messages (this may take a long time!)..." );
+ $dbw = wfGetDB( DB_MASTER );
+ foreach ( $messageInfo['results'] as $result ) {
+ wfWaitForSlaves();
+ $dbw->ping();
+ $dbw->begin( __METHOD__ );
+ $title = Title::makeTitle( NS_MEDIAWIKI, $result['title'] );
+ $this->output( "\n* [[$title]]" );
+ $page = WikiPage::factory( $title );
+ $error = ''; // Passed by ref
+ $page->doDeleteArticle( 'No longer required', false, 0, false, $error, $user );
+ if ( $result['hasTalk'] && $doDeleteTalk ) {
+ $title = Title::makeTitle( NS_MEDIAWIKI_TALK, $result['title'] );
+ $this->output( "\n* [[$title]]" );
+ $page = WikiPage::factory( $title );
+ $error = ''; // Passed by ref
+ $page->doDeleteArticle( 'Orphaned talk page of no longer required message', false, 0, false, $error, $user );
+ }
+ $dbw->commit( __METHOD__ );
+ }
+ $this->output( "\n\ndone!\n" );
+ }
+}
+
+$maintClass = "DeleteEqualMessages";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/deleteOldRevisions.php b/maintenance/deleteOldRevisions.php
index 6a3e211b..114aefd7 100644
--- a/maintenance/deleteOldRevisions.php
+++ b/maintenance/deleteOldRevisions.php
@@ -48,48 +48,45 @@ class DeleteOldRevisions extends Maintenance {
$dbw = wfGetDB( DB_MASTER );
$dbw->begin( __METHOD__ );
- $tbl_pag = $dbw->tableName( 'page' );
- $tbl_rev = $dbw->tableName( 'revision' );
-
- $pageIdClause = '';
- $revPageClause = '';
+ $pageConds = array();
+ $revConds = array();
# If a list of page_ids was provided, limit results to that set of page_ids
- if ( sizeof( $args ) > 0 ) {
- $pageIdList = implode( ',', $args );
- $pageIdClause = " WHERE page_id IN ({$pageIdList})";
- $revPageClause = " AND rev_page IN ({$pageIdList})";
- $this->output( "Limiting to {$tbl_pag}.page_id IN ({$pageIdList})\n" );
+ if ( count( $args ) > 0 ) {
+ $pageConds['page_id'] = $args;
+ $revConds['rev_page'] = $args;
+ $this->output( "Limiting to page IDs " . implode( ',', $args ) . "\n" );
}
# Get "active" revisions from the page table
$this->output( "Searching for active revisions..." );
- $res = $dbw->query( "SELECT page_latest FROM $tbl_pag{$pageIdClause}" );
- $cur = array();
+ $res = $dbw->select( 'page', 'page_latest', $pageConds, __METHOD__ );
+ $latestRevs = array();
foreach ( $res as $row ) {
- $cur[] = $row->page_latest;
+ $latestRevs[] = $row->page_latest;
}
$this->output( "done.\n" );
# Get all revisions that aren't in this set
- $old = array();
$this->output( "Searching for inactive revisions..." );
- $set = implode( ', ', $cur );
- $res = $dbw->query( "SELECT rev_id FROM $tbl_rev WHERE rev_id NOT IN ( $set ){$revPageClause}" );
+ if ( count( $latestRevs ) > 0 ) {
+ $revConds[] = 'rev_id NOT IN (' . $dbw->makeList( $latestRevs ) . ')';
+ }
+ $res = $dbw->select( 'revision', 'rev_id', $revConds, __METHOD__ );
+ $oldRevs = array();
foreach ( $res as $row ) {
- $old[] = $row->rev_id;
+ $oldRevs[] = $row->rev_id;
}
$this->output( "done.\n" );
# Inform the user of what we're going to do
- $count = count( $old );
+ $count = count( $oldRevs );
$this->output( "$count old revisions found.\n" );
# Delete as appropriate
if ( $delete && $count ) {
$this->output( "Deleting..." );
- $set = implode( ', ', $old );
- $dbw->query( "DELETE FROM $tbl_rev WHERE rev_id IN ( $set )" );
+ $dbw->delete( 'revision', array( 'rev_id' => $oldRevs ), __METHOD__ );
$this->output( "done.\n" );
}
@@ -104,4 +101,3 @@ class DeleteOldRevisions extends Maintenance {
$maintClass = "DeleteOldRevisions";
require_once( RUN_MAINTENANCE_IF_MAIN );
-
diff --git a/maintenance/deleteOrphanedRevisions.php b/maintenance/deleteOrphanedRevisions.php
index 5dc7567f..f0da9a82 100644
--- a/maintenance/deleteOrphanedRevisions.php
+++ b/maintenance/deleteOrphanedRevisions.php
@@ -61,7 +61,7 @@ class DeleteOrphanedRevisions extends Maintenance {
# Nothing to do?
if ( $report || $count == 0 ) {
- $dbw->commit();
+ $dbw->commit( __METHOD__ );
exit( 0 );
}
@@ -91,4 +91,3 @@ class DeleteOrphanedRevisions extends Maintenance {
$maintClass = "DeleteOrphanedRevisions";
require_once( RUN_MAINTENANCE_IF_MAIN );
-
diff --git a/maintenance/dev/includes/router.php b/maintenance/dev/includes/router.php
index ac96f459..1d5070b1 100644
--- a/maintenance/dev/includes/router.php
+++ b/maintenance/dev/includes/router.php
@@ -21,7 +21,7 @@
* @file
*/
-if ( php_sapi_name() != 'cli-server' ) {
+if ( PHP_SAPI != 'cli-server' ) {
die( "This script can only be run by php's cli-server sapi." );
}
diff --git a/maintenance/doMaintenance.php b/maintenance/doMaintenance.php
index 2bb2a0f4..15b00167 100644
--- a/maintenance/doMaintenance.php
+++ b/maintenance/doMaintenance.php
@@ -111,8 +111,18 @@ try {
// Potentially debug globals
$maintenance->globals();
+
+ // Perform deferred updates.
+ DeferredUpdates::doUpdates( 'commit' );
+
+ // log profiling info
+ wfLogProfilingData();
+
+ // Commit and close up!
+ $factory = wfGetLBFactory();
+ $factory->commitMasterChanges();
+ $factory->shutdown();
} catch ( MWException $mwe ) {
echo( $mwe->getText() );
exit( 1 );
}
-
diff --git a/maintenance/dumpIterator.php b/maintenance/dumpIterator.php
index 3657f960..870d6321 100644
--- a/maintenance/dumpIterator.php
+++ b/maintenance/dumpIterator.php
@@ -168,7 +168,7 @@ class SearchDump extends DumpIterator {
* @param $rev Revision
*/
public function processRevision( $rev ) {
- if ( preg_match( $this->getOption( 'regex' ), $rev->getText() ) ) {
+ if ( preg_match( $this->getOption( 'regex' ), $rev->getContent()->getTextForSearchIndex() ) ) {
$this->output( $rev->getTitle() . " matches at edit from " . $rev->getTimestamp() . "\n" );
}
}
diff --git a/maintenance/dumpLinks.php b/maintenance/dumpLinks.php
index 153fdd79..08aae295 100644
--- a/maintenance/dumpLinks.php
+++ b/maintenance/dumpLinks.php
@@ -76,4 +76,3 @@ class DumpLinks extends Maintenance {
$maintClass = "DumpLinks";
require_once( RUN_MAINTENANCE_IF_MAIN );
-
diff --git a/maintenance/dumpTextPass.php b/maintenance/dumpTextPass.php
index 72d7d97c..2e0d03b1 100644
--- a/maintenance/dumpTextPass.php
+++ b/maintenance/dumpTextPass.php
@@ -64,5 +64,3 @@ Options:
ENDS
);
}
-
-
diff --git a/maintenance/edit.php b/maintenance/edit.php
index 59df5e88..93fc3e79 100644
--- a/maintenance/edit.php
+++ b/maintenance/edit.php
@@ -68,10 +68,11 @@ class EditCLI extends Maintenance {
# Read the text
$text = $this->getStdin( Maintenance::STDIN_ALL );
+ $content = ContentHandler::makeContent( $text, $wgTitle );
# Do the edit
$this->output( "Saving... " );
- $status = $page->doEdit( $text, $summary,
+ $status = $page->doEditContent( $content, $summary,
( $minor ? EDIT_MINOR : 0 ) |
( $bot ? EDIT_FORCE_BOT : 0 ) |
( $autoSummary ? EDIT_AUTOSUMMARY : 0 ) |
@@ -92,4 +93,3 @@ class EditCLI extends Maintenance {
$maintClass = "EditCLI";
require_once( RUN_MAINTENANCE_IF_MAIN );
-
diff --git a/maintenance/eval.php b/maintenance/eval.php
index 5aefe1c9..95f46ffa 100644
--- a/maintenance/eval.php
+++ b/maintenance/eval.php
@@ -43,7 +43,7 @@ if ( isset( $options['d'] ) ) {
}
if ( $d > 1 ) {
$lb = wfGetLB();
- $serverCount = $lb->getServerCount();
+ $serverCount = $lb->getServerCount();
for ( $i = 0; $i < $serverCount; $i++ ) {
$server = $lb->getServerInfo( $i );
$server['flags'] |= DBO_DEBUG;
@@ -80,5 +80,3 @@ while ( ( $line = Maintenance::readconsole() ) !== false ) {
}
print "\n";
-
-
diff --git a/maintenance/fileOpPerfTest.php b/maintenance/fileOpPerfTest.php
index 501bcfc3..008d7686 100644
--- a/maintenance/fileOpPerfTest.php
+++ b/maintenance/fileOpPerfTest.php
@@ -21,7 +21,6 @@
* @ingroup Maintenance
*/
-$initialTime = microtime( true );
$wgProfiler = array( 'class' => 'ProfilerSimpleText' );
error_reporting( E_ALL );
@@ -40,7 +39,8 @@ class TestFileOpPerformance extends Maintenance {
$this->addOption( 'b2', 'Backend 2', false, true );
$this->addOption( 'srcdir', 'File source directory', true, true );
$this->addOption( 'maxfiles', 'Max files', false, true );
- $this->addOption( 'quick', 'Avoid operation pre-checks' );
+ $this->addOption( 'quick', 'Avoid operation pre-checks (use doQuickOperations())' );
+ $this->addOption( 'parallelize', '"parallelize" flag for doOperations()', false, true );
}
public function execute() {
@@ -54,7 +54,8 @@ class TestFileOpPerformance extends Maintenance {
$profiler = Profiler::instance();
$profiler->setTemplated( true );
- $profiler->logData(); // prints
+
+ //NOTE: as of MW1.21, $profiler->logData() is called implicitly by doMaintenance.php.
}
protected function doPerfTest( FileBackend $backend ) {
@@ -95,8 +96,13 @@ class TestFileOpPerformance extends Maintenance {
$method = $this->hasOption( 'quick' ) ? 'doQuickOperations' : 'doOperations';
+ $opts = array( 'force' => 1 );
+ if ( $this->hasOption( 'parallelize' ) ) {
+ $opts['parallelize'] = ( $this->getOption( 'parallelize' ) === 'true' );
+ }
+
$start = microtime( true );
- $status = $backend->$method( $ops1, array( 'force' => 1 ) );
+ $status = $backend->$method( $ops1, $opts );
$e = ( microtime( true ) - $start ) * 1000;
if ( $status->getErrorsArray() ) {
print_r( $status->getErrorsArray() );
@@ -105,7 +111,7 @@ class TestFileOpPerformance extends Maintenance {
$this->output( $backend->getName() . ": Stored " . count( $ops1 ) . " files in $e ms.\n" );
$start = microtime( true );
- $backend->$method( $ops2, array( 'force' => 1 ) );
+ $backend->$method( $ops2, $opts );
$e = ( microtime( true ) - $start ) * 1000;
if ( $status->getErrorsArray() ) {
print_r( $status->getErrorsArray() );
@@ -114,7 +120,7 @@ class TestFileOpPerformance extends Maintenance {
$this->output( $backend->getName() . ": Copied " . count( $ops2 ) . " files in $e ms.\n" );
$start = microtime( true );
- $backend->$method( $ops3, array( 'force' => 1 ) );
+ $backend->$method( $ops3, $opts );
$e = ( microtime( true ) - $start ) * 1000;
if ( $status->getErrorsArray() ) {
print_r( $status->getErrorsArray() );
@@ -123,7 +129,7 @@ class TestFileOpPerformance extends Maintenance {
$this->output( $backend->getName() . ": Moved " . count( $ops3 ) . " files in $e ms.\n" );
$start = microtime( true );
- $backend->$method( $ops4, array( 'force' => 1 ) );
+ $backend->$method( $ops4, $opts );
$e = ( microtime( true ) - $start ) * 1000;
if ( $status->getErrorsArray() ) {
print_r( $status->getErrorsArray() );
@@ -132,7 +138,7 @@ class TestFileOpPerformance extends Maintenance {
$this->output( $backend->getName() . ": Deleted " . count( $ops4 ) . " files in $e ms.\n" );
$start = microtime( true );
- $backend->$method( $ops5, array( 'force' => 1 ) );
+ $backend->$method( $ops5, $opts );
$e = ( microtime( true ) - $start ) * 1000;
if ( $status->getErrorsArray() ) {
print_r( $status->getErrorsArray() );
diff --git a/maintenance/findHooks.php b/maintenance/findHooks.php
index e273c545..778da5a1 100644
--- a/maintenance/findHooks.php
+++ b/maintenance/findHooks.php
@@ -64,6 +64,7 @@ class FindHooks extends Maintenance {
$IP . '/includes/actions/',
$IP . '/includes/api/',
$IP . '/includes/cache/',
+ $IP . '/includes/content/',
$IP . '/includes/context/',
$IP . '/includes/db/',
$IP . '/includes/diff/',
@@ -114,7 +115,7 @@ class FindHooks extends Maintenance {
*/
private function getHooksFromDoc( $doc ) {
if ( $this->hasOption( 'online' ) ) {
- return $this->getHooksFromOnlineDoc( );
+ return $this->getHooksFromOnlineDoc();
} else {
return $this->getHooksFromLocalDoc( $doc );
}
@@ -136,7 +137,7 @@ class FindHooks extends Maintenance {
* Get hooks from www.mediawiki.org using the API
* @return array of documented hooks
*/
- private function getHooksFromOnlineDoc( ) {
+ 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 );
@@ -170,7 +171,7 @@ class FindHooks extends Maintenance {
private function getHooksFromFile( $file ) {
$content = file_get_contents( $file );
$m = array();
- preg_match_all( '/(?:wfRunHooks|Hooks\:\:run)\(\s*([\'"])(.*?)\1/', $content, $m );
+ preg_match_all( '/(?:wfRunHooks|Hooks\:\:run|ContentHandler\:\:runLegacyHooks)\(\s*([\'"])(.*?)\1/', $content, $m );
return $m[2];
}
diff --git a/maintenance/fixDoubleRedirects.php b/maintenance/fixDoubleRedirects.php
index 6f017eca..19b97777 100644
--- a/maintenance/fixDoubleRedirects.php
+++ b/maintenance/fixDoubleRedirects.php
@@ -55,7 +55,12 @@ class FixDoubleRedirects extends Maintenance {
$dbr = wfGetDB( DB_SLAVE );
- $tables = array( 'redirect', 'pa' => 'page', 'pb' => 'page' );
+ // See also SpecialDoubleRedirects
+ $tables = array(
+ 'redirect',
+ 'pa' => 'page',
+ 'pb' => 'page',
+ );
$fields = array(
'pa.page_namespace AS pa_namespace',
'pa.page_title AS pa_title',
@@ -66,6 +71,7 @@ class FixDoubleRedirects extends Maintenance {
'rd_from = pa.page_id',
'rd_namespace = pb.page_namespace',
'rd_title = pb.page_title',
+ '(rd_interwiki IS NULL OR rd_interwiki = "")', // bug 40352
'pb.page_is_redirect' => 1,
);
@@ -83,12 +89,18 @@ class FixDoubleRedirects extends Maintenance {
}
$jobs = array();
+ $processedTitles = "\n";
$n = 0;
foreach ( $res as $row ) {
$titleA = Title::makeTitle( $row->pa_namespace, $row->pa_title );
$titleB = Title::makeTitle( $row->pb_namespace, $row->pb_title );
- $job = new DoubleRedirectJob( $titleA, array( 'reason' => 'maintenance', 'redirTitle' => $titleB->getPrefixedDBkey() ) );
+ $processedTitles .= "* [[$titleA]]\n";
+
+ $job = new DoubleRedirectJob( $titleA, array(
+ 'reason' => 'maintenance',
+ 'redirTitle' => $titleB->getPrefixedDBkey()
+ ) );
if ( !$async ) {
$success = ( $dryrun ? true : $job->run() );
@@ -112,12 +124,12 @@ class FixDoubleRedirects extends Maintenance {
if ( count( $jobs ) ) {
$this->queueJobs( $jobs, $dryrun );
}
- $this->output( "$n double redirects processed.\n" );
+ $this->output( "$n double redirects processed" . $processedTitles . "\n" );
}
protected function queueJobs( $jobs, $dryrun = false ) {
$this->output( "Queuing batch of " . count( $jobs ) . " double redirects.\n" );
- Job::batchInsert( $dryrun ? array() : $jobs );
+ JobQueueGroup::singleton()->push( $dryrun ? array() : $jobs );
}
}
diff --git a/maintenance/fixSlaveDesync.php b/maintenance/fixSlaveDesync.php
index 8bf556f0..ab7603de 100644
--- a/maintenance/fixSlaveDesync.php
+++ b/maintenance/fixSlaveDesync.php
@@ -67,7 +67,7 @@ class FixSlaveDesync extends Maintenance {
$dbw = wfGetDB( DB_MASTER );
$masterIDs = array();
$res = $dbw->select( 'page', array( 'page_id', 'page_latest' ), array( 'page_id<6054123' ), __METHOD__ );
- $this->output( "Number of pages: " . $dbw->numRows( $res ) . "\n" );
+ $this->output( "Number of pages: " . $res->numRows() . "\n" );
foreach ( $res as $row ) {
$masterIDs[$row->page_id] = $row->page_latest;
if ( !( ++$n % 10000 ) ) {
diff --git a/maintenance/formatInstallDoc.php b/maintenance/formatInstallDoc.php
index 600ca976..691ed80c 100644
--- a/maintenance/formatInstallDoc.php
+++ b/maintenance/formatInstallDoc.php
@@ -76,5 +76,3 @@ class MaintenanceFormatInstallDoc extends Maintenance {
$maintClass = 'MaintenanceFormatInstallDoc';
require_once( RUN_MAINTENANCE_IF_MAIN );
-
-
diff --git a/maintenance/fuzz-tester.php b/maintenance/fuzz-tester.php
index 1c96a571..4c039807 100644
--- a/maintenance/fuzz-tester.php
+++ b/maintenance/fuzz-tester.php
@@ -747,7 +747,7 @@ class wikiFuzz {
/**
** Randomly returns one element of the input array.
*/
- static public function chooseInput( array $input ) {
+ public static function chooseInput( array $input ) {
$randindex = wikiFuzz::randnum( count( $input ) - 1 );
return $input[$randindex];
}
@@ -761,7 +761,7 @@ class wikiFuzz {
* @param $start int
* @return int
*/
- static public function randnum( $finish, $start = 0 ) {
+ public static function randnum( $finish, $start = 0 ) {
return mt_rand( $start, $finish );
}
@@ -769,7 +769,7 @@ class wikiFuzz {
* Returns a mix of random text and random wiki syntax.
* @return string
*/
- static private function randstring() {
+ private static function randstring() {
$thestring = "";
for ( $i = 0; $i < 40; $i++ ) {
@@ -801,7 +801,7 @@ class wikiFuzz {
* or random data from "other".
* @return string
*/
- static private function makestring() {
+ private static function makestring() {
$what = wikiFuzz::randnum( 2 );
if ( $what == 0 ) {
return wikiFuzz::randstring();
@@ -818,7 +818,7 @@ class wikiFuzz {
* @param $matches
* @return string
*/
- static private function stringEscape( $matches ) {
+ private static function stringEscape( $matches ) {
return sprintf( "\\x%02x", ord( $matches[1] ) );
}
@@ -828,7 +828,7 @@ class wikiFuzz {
* @param $str string
* @return string
*/
- static public function makeTitleSafe( $str ) {
+ public static function makeTitleSafe( $str ) {
$legalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF";
return preg_replace_callback(
"/([^$legalTitleChars])/", 'wikiFuzz::stringEscape',
@@ -839,7 +839,7 @@ class wikiFuzz {
** Returns a string of fuzz text.
* @return string
*/
- static private function loop() {
+ private static function loop() {
switch ( wikiFuzz::randnum( 3 ) ) {
case 1: // an opening tag, with parameters.
$string = "";
@@ -868,7 +868,7 @@ class wikiFuzz {
* Returns one of the three styles of random quote: ', ", and nothing.
* @return string
*/
- static private function getRandQuote() {
+ private static function getRandQuote() {
switch ( wikiFuzz::randnum( 3 ) ) {
case 1 : return "'";
case 2 : return "\"";
@@ -881,7 +881,7 @@ class wikiFuzz {
* @param $maxtypes int
* @return string
*/
- static public function makeFuzz( $maxtypes = 2 ) {
+ public static function makeFuzz( $maxtypes = 2 ) {
$page = "";
for ( $k = 0; $k < $maxtypes; $k++ ) {
$page .= wikiFuzz::loop();
@@ -1490,7 +1490,7 @@ class specialBlockmeTest extends pageTest {
function __construct() {
$this->pagePath = "index.php?title=Special:Blockme";
- $this->params = array ( );
+ $this->params = array ();
// sometimes we specify "ip", and sometimes we don't.
if ( wikiFuzz::randnum( 1 ) == 0 ) {
@@ -2041,7 +2041,7 @@ class api extends pageTest {
}
// Adds all the elements to the array, using the specified prefix.
- private static function addListParams( &$array, $prefix, $elements ) {
+ private static function addListParams( &$array, $prefix, $elements ) {
foreach ( $elements as $element ) {
$array[$prefix . $element] = self::getParamDetails( $element );
}
@@ -2709,5 +2709,3 @@ for ( $count = 0; true; $count++ ) {
break;
}
}
-
-
diff --git a/maintenance/generateSitemap.php b/maintenance/generateSitemap.php
index f3a5d875..adea97ea 100644
--- a/maintenance/generateSitemap.php
+++ b/maintenance/generateSitemap.php
@@ -44,7 +44,7 @@ class GenerateSitemap extends Maintenance {
*
* @var int
*/
- var $url_limit;
+ public $url_limit;
/**
* The maximum size of a sitemap file
@@ -53,77 +53,77 @@ class GenerateSitemap extends Maintenance {
*
* @var int
*/
- var $size_limit;
+ public $size_limit;
/**
* The path to prepend to the filename
*
* @var string
*/
- var $fspath;
+ public $fspath;
/**
* The URL path to prepend to filenames in the index; should resolve to the same directory as $fspath
*
* @var string
*/
- var $urlpath;
+ public $urlpath;
/**
* Whether or not to use compression
*
* @var bool
*/
- var $compress;
+ public $compress;
/**
* Whether or not to include redirection pages
*
* @var bool
*/
- var $skipRedirects;
+ public $skipRedirects;
/**
* The number of entries to save in each sitemap file
*
* @var array
*/
- var $limit = array();
+ public $limit = array();
/**
* Key => value entries of namespaces and their priorities
*
* @var array
*/
- var $priorities = array();
+ public $priorities = array();
/**
* A one-dimensional array of namespaces in the wiki
*
* @var array
*/
- var $namespaces = array();
+ public $namespaces = array();
/**
* When this sitemap batch was generated
*
* @var string
*/
- var $timestamp;
+ public $timestamp;
/**
* A database slave object
*
* @var object
*/
- var $dbr;
+ public $dbr;
/**
* A resource pointing to the sitemap index file
*
* @var resource
*/
- var $findex;
+ public $findex;
/**
@@ -131,7 +131,7 @@ class GenerateSitemap extends Maintenance {
*
* @var resource
*/
- var $file;
+ public $file;
/**
* Identifier to use in filenames, default $wgDBname
diff --git a/maintenance/getConfiguration.php b/maintenance/getConfiguration.php
new file mode 100644
index 00000000..83b5b029
--- /dev/null
+++ b/maintenance/getConfiguration.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Print serialized output of MediaWiki config vars
+ *
+ * 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 Maintenance
+ * @author Tim Starling
+ * @author Antoine Musso
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Print serialized output of MediaWiki config vars
+ *
+ * @ingroup Maintenance
+ */
+class GetConfiguration extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Get serialized MediaWiki site configuration";
+ $this->addOption( 'settings', 'Space-separated list of wg* variables', true, true );
+ $this->addOption( 'format', 'PHP or JSON', true, true );
+ $this->addOption( 'wiki', 'Wiki ID', true, true );
+ }
+
+ public function execute() {
+ $res = array();
+ foreach ( explode( ' ', $this->getOption( 'settings' ) ) as $name ) {
+ if ( !preg_match( '/^wg[A-Z]/', $name ) ) {
+ throw new MWException( "Variable '$name' does start with 'wg'." );
+ } elseif ( !isset( $GLOBALS[$name] ) ) {
+ throw new MWException( "Variable '$name' is not set." );
+ } elseif ( !$this->isAllowedVariable( $GLOBALS[$name] ) ) {
+ throw new MWException( "Variable '$name' includes non-array, non-scalar, items." );
+ }
+ $res[$name] = $GLOBALS[$name];
+ }
+
+ $out = null;
+ switch( $this->getOption( 'format' ) ) {
+ case 'PHP':
+ $out = serialize( $res );
+ break;
+ case 'JSON':
+ $out = FormatJson::encode( $res );
+ break;
+ default:
+ throw new MWException( "Invalid serialization format given." );
+ }
+ if ( !is_string( $out ) ) {
+ throw new MWException( "Failed to serialize the requested settings." );
+ }
+
+ $this->output( $out . "\n" );
+ }
+
+ private function isAllowedVariable( $value ) {
+ if ( is_array( $value ) ) {
+ foreach ( $value as $k => $v ) {
+ if ( !$this->isAllowedVariable( $v ) ) {
+ return false;
+ }
+ }
+ return true;
+ } elseif ( is_scalar( $value ) ) {
+ return true;
+ }
+ return false;
+ }
+}
+
+$maintClass = "GetConfiguration";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/getText.php b/maintenance/getText.php
index 3e2f8540..f6adfe2b 100644
--- a/maintenance/getText.php
+++ b/maintenance/getText.php
@@ -52,12 +52,12 @@ class GetTextMaint extends Maintenance {
$titleText = $title->getPrefixedText();
$this->error( "Page $titleText does not exist.\n", true );
}
- $text = $rev->getText( $this->hasOption( 'show-private' ) ? Revision::RAW : Revision::FOR_PUBLIC );
- if ( $text === false ) {
+ $content = $rev->getContent( $this->hasOption( 'show-private' ) ? Revision::RAW : Revision::FOR_PUBLIC );
+ if ( $content === false ) {
$titleText = $title->getPrefixedText();
$this->error( "Couldn't extract the text from $titleText.\n", true );
}
- $this->output( $text );
+ $this->output( $content->serialize() );
}
}
diff --git a/maintenance/hiphop/make b/maintenance/hiphop/make
index 2fa70dcb..13e3163a 100644
--- a/maintenance/hiphop/make
+++ b/maintenance/hiphop/make
@@ -1,4 +1,4 @@
-#!/usr/bin/hphpi -f
+#!/usr/bin/hphpi -f
<?php
define( 'MW_CONFIG_CALLBACK', 'MakeHipHop::noConfigNeeded' );
@@ -41,7 +41,7 @@ class MakeHipHop extends Maintenance {
unlink( "$buildDir/source" );
}
- # With the CentOS RPMs, you just get g++44, no g++, so we have to
+ # With the CentOS RPMs, you just get g++44, no g++, so we have to
# use the environment
if ( isset( $_ENV['CXX'] ) ) {
$cxx = $_ENV['CXX'];
@@ -49,7 +49,7 @@ class MakeHipHop extends Maintenance {
$cxx = 'g++';
}
- # Create a function that provides the HipHop compiler version, and
+ # Create a function that provides the HipHop compiler version, and
# doesn't exist when MediaWiki is invoked in interpreter mode.
$version = str_replace( PHP_EOL, ' ', trim( `hphp --version` ) );
file_put_contents(
@@ -94,7 +94,7 @@ class MakeHipHop extends Maintenance {
$this->checkVolatileClasses( $outDir );
# Copy the generated C++ files into the source directory for cmake
- $iter = new RecursiveIteratorIterator(
+ $iter = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator( $outDir ),
RecursiveIteratorIterator::SELF_FIRST );
$sourceFiles = array();
@@ -148,14 +148,14 @@ class MakeHipHop extends Maintenance {
}
# Do our own version of $HPHP_HOME/bin/run.sh, which isn't so broken.
- # HipHop's RELEASE mode seems to be stuck always on, so symbols get
- # stripped. Also we will try keeping the generated .o files instead of
+ # HipHop's RELEASE mode seems to be stuck always on, so symbols get
+ # stripped. Also we will try keeping the generated .o files instead of
# throwing away hours of CPU time every time you make a typo.
chdir( $persistentDir );
if ( $regenerateMakefile ) {
- copy( $_ENV['HPHP_HOME'] . '/bin/CMakeLists.base.txt',
+ copy( $_ENV['HPHP_HOME'] . '/bin/CMakeLists.base.txt',
"$persistentDir/CMakeLists.txt" );
if ( file_exists( "$persistentDir/CMakeCache.txt" ) ) {
@@ -165,7 +165,7 @@ class MakeHipHop extends Maintenance {
$cmd = 'cmake' .
" -D CMAKE_BUILD_TYPE:string=" . wfEscapeShellArg( $GLOBALS['wgHipHopBuildType'] ) .
' -D PROGRAM_NAME:string=mediawiki-hphp';
-
+
if ( file_exists( '/usr/bin/ccache' ) ) {
$cmd .= ' -D CMAKE_CXX_COMPILER:string=ccache' .
' -D CMAKE_CXX_COMPILER_ARG1:string=' . wfEscapeShellArg( $cxx );
@@ -179,7 +179,7 @@ class MakeHipHop extends Maintenance {
# Determine appropriate make concurrency
# Compilation can take a lot of memory, let's assume that that is limiting.
$procs = $this->getNumProcs();
-
+
# Run make. This is the slow step.
passthru( 'make -j' . wfEscapeShellArg( $procs ) );
diff --git a/maintenance/hiphop/run-server b/maintenance/hiphop/run-server
index 1c4b51f4..1adfe29f 100644
--- a/maintenance/hiphop/run-server
+++ b/maintenance/hiphop/run-server
@@ -33,10 +33,10 @@ class RunHipHopServer extends Maintenance {
$sourceBase = realpath( "$IP/.." );
}
- passthru(
+ passthru(
'cd ' . wfEscapeShellArg( $sourceBase ) . " && " .
'MW_INSTALL_PATH=' . wfEscapeShellArg( $IP ) . ' ' .
- wfEscapeShellArg(
+ wfEscapeShellArg(
"$buildDir/persistent/mediawiki-hphp",
'-c', "$thisDir/server.conf",
'-v', "Server.SourceRoot=$sourceBase",
diff --git a/maintenance/ibm_db2/foreignkeys.sql b/maintenance/ibm_db2/foreignkeys.sql
deleted file mode 100644
index 4f1450d9..00000000
--- a/maintenance/ibm_db2/foreignkeys.sql
+++ /dev/null
@@ -1,102 +0,0 @@
--- good
-ALTER TABLE user_groups ADD CONSTRAINT USER_GROUPS_FK1 FOREIGN KEY (ug_user) REFERENCES user(user_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE user_newtalk ADD CONSTRAINT USER_NEWTALK_FK1 FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE
-;
-
--- referenced value not found
-ALTER TABLE revision ADD CONSTRAINT REVISION_PAGE_FK FOREIGN KEY (rev_page) REFERENCES page(page_id) ON DELETE CASCADE
-;
--- referenced value not found
-ALTER TABLE revision ADD CONSTRAINT REVISION_USER_FK FOREIGN KEY (rev_user) REFERENCES user(user_id) ON DELETE RESTRICT
-;
-
--- good
-ALTER TABLE page_restrictions ADD CONSTRAINT PAGE_RESTRICTIONS_PAGE_FK FOREIGN KEY (pr_page) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE page_props ADD CONSTRAINT PAGE_PROPS_PAGE_FK FOREIGN KEY (pp_page) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE archive ADD CONSTRAINT ARCHIVE_USER_FK FOREIGN KEY (ar_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- referenced value not found
-ALTER TABLE redirect ADD CONSTRAINT REDIRECT_FROM_FK FOREIGN KEY (rd_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- referenced value not found
-ALTER TABLE pagelinks ADD CONSTRAINT PAGELINKS_FROM_FK FOREIGN KEY (pl_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE templatelinks ADD CONSTRAINT TEMPLATELINKS_FROM_FK FOREIGN KEY (tl_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE imagelinks ADD CONSTRAINT IMAGELINKS_FROM_FK FOREIGN KEY (il_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE categorylinks ADD CONSTRAINT CATEGORYLINKS_FROM_FK FOREIGN KEY (cl_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE externallinks ADD CONSTRAINT EXTERNALLINKS_FROM_FK FOREIGN KEY (el_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- good
-ALTER TABLE langlinks ADD CONSTRAINT LANGLINKS_FROM_FK FOREIGN KEY (ll_from) REFERENCES page(page_id) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE ipblocks ADD CONSTRAINT IPBLOCKS_USER_FK FOREIGN KEY (ipb_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- good
-ALTER TABLE ipblocks ADD CONSTRAINT IPBLOCKS_BY_FK FOREIGN KEY (ipb_by) REFERENCES user(user_id) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE image ADD CONSTRAINT IMAGE_USER_FK FOREIGN KEY (img_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE oldimage ADD CONSTRAINT OLDIMAGE_USER_FK FOREIGN KEY (oi_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- good
-ALTER TABLE oldimage ADD CONSTRAINT OLDIMAGE_NAME_FK FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE filearchive ADD CONSTRAINT FILEARCHIVE_DELETED_USER_FK FOREIGN KEY (fa_deleted_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE filearchive ADD CONSTRAINT FILEARCHIVE_USER_FK FOREIGN KEY (fa_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE recentchanges ADD CONSTRAINT RECENTCHANGES_USER_FK FOREIGN KEY (rc_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE recentchanges ADD CONSTRAINT RECENTCHANGES_CUR_ID_FK FOREIGN KEY (rc_cur_id) REFERENCES page(page_id) ON DELETE SET NULL
---;
-
--- good
-ALTER TABLE watchlist ADD CONSTRAINT WATCHLIST_USER_FK FOREIGN KEY (wl_user) REFERENCES user(user_id) ON DELETE CASCADE
-;
-
--- cannot contain null values
--- ALTER TABLE protected_titles ADD CONSTRAINT PROTECTED_TITLES_USER_FK FOREIGN KEY (pt_user) REFERENCES user(user_id) ON DELETE SET NULL
---;
-
--- cannot contain null values
--- ALTER TABLE logging ADD CONSTRAINT LOGGING_USER_FK FOREIGN KEY (log_user) REFERENCES user(user_id) ON DELETE SET NULL
---; \ No newline at end of file
diff --git a/maintenance/ibm_db2/patch-categorylinks-better-collation.sql b/maintenance/ibm_db2/patch-categorylinks-better-collation.sql
deleted file mode 100644
index 312583ac..00000000
--- a/maintenance/ibm_db2/patch-categorylinks-better-collation.sql
+++ /dev/null
@@ -1,21 +0,0 @@
---
--- patch-categorylinks-better-collation.sql
---
---
--- Track category inclusions *used inline*
--- This tracks a single level of category membership
--- (folksonomic tagging, really).
---
-CREATE TABLE categorylinks (
- cl_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- cl_to VARCHAR(255) NOT NULL,
- -- cl_sortkey has to be at least 86 wide
- -- in order to be compatible with the old MySQL schema from MW 1.10
- --cl_sortkey VARCHAR(86),
- cl_sortkey VARCHAR(230) FOR BIT DATA NOT NULL ,
- cl_sortkey_prefix VARCHAR(255) FOR BIT DATA NOT NULL ,
- cl_timestamp TIMESTAMP(3) NOT NULL,
- cl_collation VARCHAR(32) FOR BIT DATA NOT NULL ,
- cl_type VARCHAR(6) FOR BIT DATA NOT NULL
-);
diff --git a/maintenance/ibm_db2/patch-change_tag-indexes.sql b/maintenance/ibm_db2/patch-change_tag-indexes.sql
deleted file mode 100644
index 1621a038..00000000
--- a/maintenance/ibm_db2/patch-change_tag-indexes.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-CREATE UNIQUE INDEX change_tag_rc_tag ON change_tag (ct_rc_id,ct_tag);
-CREATE UNIQUE INDEX change_tag_log_tag ON change_tag (ct_log_id,ct_tag);
-CREATE UNIQUE INDEX change_tag_rev_tag ON change_tag (ct_rev_id,ct_tag);
--- Covering index, so we can pull all the info only out of the index.
-CREATE INDEX change_tag_tag_id ON change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
diff --git a/maintenance/ibm_db2/patch-change_tag.sql b/maintenance/ibm_db2/patch-change_tag.sql
deleted file mode 100644
index 3b6f9d54..00000000
--- a/maintenance/ibm_db2/patch-change_tag.sql
+++ /dev/null
@@ -1,8 +0,0 @@
--- A table to track tags for revisions, logs and recent changes.
-CREATE TABLE change_tag (
- ct_rc_id INTEGER,
- ct_log_id INTEGER,
- ct_rev_id INTEGER,
- ct_tag varchar(255) NOT NULL,
- ct_params CLOB(64K) INLINE LENGTH 4096
-);
diff --git a/maintenance/ibm_db2/patch-change_tag_summary.sql b/maintenance/ibm_db2/patch-change_tag_summary.sql
deleted file mode 100644
index 768cbfaa..00000000
--- a/maintenance/ibm_db2/patch-change_tag_summary.sql
+++ /dev/null
@@ -1,7 +0,0 @@
--- Rollup table to pull a LIST of tags simply
-CREATE TABLE tag_summary (
- ts_rc_id INTEGER,
- ts_log_id INTEGER,
- ts_rev_id INTEGER,
- ts_tags CLOB(64K) INLINE LENGTH 4096 NOT NULL
-);
diff --git a/maintenance/ibm_db2/patch-change_valid_tag.sql b/maintenance/ibm_db2/patch-change_valid_tag.sql
deleted file mode 100644
index 9bdcbc92..00000000
--- a/maintenance/ibm_db2/patch-change_valid_tag.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-CREATE TABLE valid_tag (
- vt_tag varchar(255) NOT NULL PRIMARY KEY
-);
diff --git a/maintenance/ibm_db2/patch-cl_collation-field.sql b/maintenance/ibm_db2/patch-cl_collation-field.sql
deleted file mode 100644
index 6999dace..00000000
--- a/maintenance/ibm_db2/patch-cl_collation-field.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE categorylinks ADD cl_collation VARCHAR(32) FOR BIT DATA NOT NULL
diff --git a/maintenance/ibm_db2/patch-cl_sortkey_prefix-field.sql b/maintenance/ibm_db2/patch-cl_sortkey_prefix-field.sql
deleted file mode 100644
index 58b78147..00000000
--- a/maintenance/ibm_db2/patch-cl_sortkey_prefix-field.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE categorylinks ADD cl_sortkey_prefix VARCHAR(255) FOR BIT DATA NOT NULL
diff --git a/maintenance/ibm_db2/patch-cl_type-field.sql b/maintenance/ibm_db2/patch-cl_type-field.sql
deleted file mode 100644
index 5952c989..00000000
--- a/maintenance/ibm_db2/patch-cl_type-field.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE categorylinks ADD cl_type VARCHAR(6) FOR BIT DATA NOT NULL
diff --git a/maintenance/ibm_db2/patch-external_user.sql b/maintenance/ibm_db2/patch-external_user.sql
deleted file mode 100644
index 96cb8237..00000000
--- a/maintenance/ibm_db2/patch-external_user.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE TABLE external_user (
- -- Foreign key to user_id
- eu_local_id BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-
- -- Some opaque identifier provided by the external database
- eu_external_id VARCHAR(255) NOT NULL
-);
diff --git a/maintenance/ibm_db2/patch-ipb_allow_usertalk.sql b/maintenance/ibm_db2/patch-ipb_allow_usertalk.sql
deleted file mode 100644
index 6274bb22..00000000
--- a/maintenance/ibm_db2/patch-ipb_allow_usertalk.sql
+++ /dev/null
@@ -1,23 +0,0 @@
-CREATE TABLE ipblocks (
- ipb_id INTEGER NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --DEFAULT nextval('ipblocks_ipb_id_val'),
- ipb_address VARCHAR(1024),
- ipb_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- ipb_by BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE CASCADE,
- ipb_by_text VARCHAR(255) NOT NULL DEFAULT '',
- ipb_reason VARCHAR(1024) NOT NULL,
- ipb_timestamp TIMESTAMP(3) NOT NULL,
- ipb_auto SMALLINT NOT NULL DEFAULT 0,
- ipb_anon_only SMALLINT NOT NULL DEFAULT 0,
- ipb_create_account SMALLINT NOT NULL DEFAULT 1,
- ipb_enable_autoblock SMALLINT NOT NULL DEFAULT 1,
- ipb_expiry TIMESTAMP(3) NOT NULL,
- ipb_range_start VARCHAR(1024),
- ipb_range_end VARCHAR(1024),
- ipb_deleted SMALLINT NOT NULL DEFAULT 0,
- ipb_block_email SMALLINT NOT NULL DEFAULT 0,
- ipb_allow_usertalk SMALLINT NOT NULL DEFAULT 0
-
-);
diff --git a/maintenance/ibm_db2/patch-iw_api-field.sql b/maintenance/ibm_db2/patch-iw_api-field.sql
deleted file mode 100644
index dd732a58..00000000
--- a/maintenance/ibm_db2/patch-iw_api-field.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE interwiki ADD iw_api CLOB(64K) INLINE LENGTH 4096 NOT NULL
diff --git a/maintenance/ibm_db2/patch-iw_api_and_wikiid.sql b/maintenance/ibm_db2/patch-iw_api_and_wikiid.sql
deleted file mode 100644
index 1b1e3592..00000000
--- a/maintenance/ibm_db2/patch-iw_api_and_wikiid.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE interwiki (
- iw_prefix VARCHAR(32) NOT NULL UNIQUE,
- iw_url CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- iw_api CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- iw_wikiid varchar(64) NOT NULL,
- iw_local SMALLINT NOT NULL,
- iw_trans SMALLINT NOT NULL DEFAULT 0
-);
diff --git a/maintenance/ibm_db2/patch-iw_wikiid-field.sql b/maintenance/ibm_db2/patch-iw_wikiid-field.sql
deleted file mode 100644
index fe49e3c0..00000000
--- a/maintenance/ibm_db2/patch-iw_wikiid-field.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE interwiki ADD iw_wikiid varchar(64) NOT NULL
diff --git a/maintenance/ibm_db2/patch-iwlinks.sql b/maintenance/ibm_db2/patch-iwlinks.sql
deleted file mode 100644
index 2902512f..00000000
--- a/maintenance/ibm_db2/patch-iwlinks.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE TABLE "IWLINKS"
-(
-"IWL_FROM" INT NOT NULL ,
-"IWL_PREFIX" VARCHAR(20) FOR BIT DATA NOT NULL ,
-"IWL_TITLE" VARCHAR(255) FOR BIT DATA NOT NULL
-)
-;
diff --git a/maintenance/ibm_db2/patch-l10n_cache.sql b/maintenance/ibm_db2/patch-l10n_cache.sql
deleted file mode 100644
index 49ebed2b..00000000
--- a/maintenance/ibm_db2/patch-l10n_cache.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE l10n_cache (
- -- Language code
- lc_lang VARCHAR(32) NOT NULL,
- -- Cache key
- lc_key VARCHAR(255) NOT NULL,
- -- Value
- lc_value CLOB(16M) INLINE LENGTH 4096 NOT NULL
-);
diff --git a/maintenance/ibm_db2/patch-log_search-rename-index.sql b/maintenance/ibm_db2/patch-log_search-rename-index.sql
deleted file mode 100644
index a6a696e1..00000000
--- a/maintenance/ibm_db2/patch-log_search-rename-index.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE log_search (
- -- The type of ID (rev ID, log ID, rev TIMESTAMP(3), username)
- ls_field VARCHAR(32) FOR BIT DATA NOT NULL,
- -- The value of the ID
- ls_value varchar(255) NOT NULL,
- -- Key to log_id
- ls_log_id BIGINT NOT NULL default 0
-);
diff --git a/maintenance/ibm_db2/patch-log_search.sql b/maintenance/ibm_db2/patch-log_search.sql
deleted file mode 100644
index a6a696e1..00000000
--- a/maintenance/ibm_db2/patch-log_search.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE log_search (
- -- The type of ID (rev ID, log ID, rev TIMESTAMP(3), username)
- ls_field VARCHAR(32) FOR BIT DATA NOT NULL,
- -- The value of the ID
- ls_value varchar(255) NOT NULL,
- -- Key to log_id
- ls_log_id BIGINT NOT NULL default 0
-);
diff --git a/maintenance/ibm_db2/patch-log_user_text.sql b/maintenance/ibm_db2/patch-log_user_text.sql
deleted file mode 100644
index 3534057a..00000000
--- a/maintenance/ibm_db2/patch-log_user_text.sql
+++ /dev/null
@@ -1,17 +0,0 @@
-CREATE TABLE logging (
- log_id BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --PRIMARY KEY DEFAULT nextval('log_log_id_seq'),
- log_type VARCHAR(32) NOT NULL,
- log_action VARCHAR(32) NOT NULL,
- log_timestamp TIMESTAMP(3) NOT NULL,
- log_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- -- Name of the user who performed this action
- log_user_text VARCHAR(255) NOT NULL default '',
- log_namespace SMALLINT NOT NULL,
- log_title VARCHAR(255) NOT NULL,
- log_page BIGINT,
- log_comment VARCHAR(255),
- log_params CLOB(64K) INLINE LENGTH 4096,
- log_deleted SMALLINT NOT NULL DEFAULT 0
-);
diff --git a/maintenance/ibm_db2/patch-module_deps.sql b/maintenance/ibm_db2/patch-module_deps.sql
deleted file mode 100644
index 5058d1f5..00000000
--- a/maintenance/ibm_db2/patch-module_deps.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE TABLE "MODULE_DEPS" (
-"MD_MODULE" VARCHAR(255) FOR BIT DATA NOT NULL ,
-"MD_SKIN" VARCHAR(32) FOR BIT DATA NOT NULL ,
-"MD_DEPS" CLOB(16M) INLINE LENGTH 4096 NOT NULL
-)
-;
diff --git a/maintenance/ibm_db2/patch-msg_resource.sql b/maintenance/ibm_db2/patch-msg_resource.sql
deleted file mode 100644
index 58b3dd6c..00000000
--- a/maintenance/ibm_db2/patch-msg_resource.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE "MSG_RESOURCE"
-(
-"MR_RESOURCE" VARCHAR(255) FOR BIT DATA NOT NULL ,
-"MR_LANG" VARCHAR(32) FOR BIT DATA NOT NULL ,
-"MR_BLOB" BLOB NOT NULL ,
-"MR_TIMESTAMP" TIMESTAMP(3) NOT NULL
-)
-;
diff --git a/maintenance/ibm_db2/patch-msg_resource_links.sql b/maintenance/ibm_db2/patch-msg_resource_links.sql
deleted file mode 100644
index 4c0ff918..00000000
--- a/maintenance/ibm_db2/patch-msg_resource_links.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE TABLE "MSG_RESOURCE_LINKS"
-(
-"MRL_RESOURCE" VARCHAR(255) FOR BIT DATA NOT NULL ,
-"MRL_MESSAGE" VARCHAR(255) FOR BIT DATA NOT NULL
-)
-;
diff --git a/maintenance/ibm_db2/patch-rd_interwiki.sql b/maintenance/ibm_db2/patch-rd_interwiki.sql
deleted file mode 100644
index c162548c..00000000
--- a/maintenance/ibm_db2/patch-rd_interwiki.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE redirect (
- rd_from BIGINT NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --REFERENCES page(page_id) ON DELETE CASCADE,
- rd_namespace SMALLINT NOT NULL DEFAULT 0,
- rd_title VARCHAR(255) NOT NULL DEFAULT '',
- rd_interwiki varchar(32),
- rd_fragment VARCHAR(255)
-);
diff --git a/maintenance/ibm_db2/patch-ss_active_users.sql b/maintenance/ibm_db2/patch-ss_active_users.sql
deleted file mode 100644
index f0e6d145..00000000
--- a/maintenance/ibm_db2/patch-ss_active_users.sql
+++ /dev/null
@@ -1,11 +0,0 @@
-CREATE TABLE site_stats (
- ss_row_id BIGINT NOT NULL UNIQUE,
- ss_total_views BIGINT DEFAULT 0,
- ss_total_edits BIGINT DEFAULT 0,
- ss_good_articles BIGINT DEFAULT 0,
- ss_total_pages INTEGER DEFAULT -1,
- ss_users INTEGER DEFAULT -1,
- ss_active_users INTEGER DEFAULT -1,
- ss_admins INTEGER DEFAULT -1,
- ss_images INTEGER DEFAULT 0
-);
diff --git a/maintenance/ibm_db2/patch-ul_value.sql b/maintenance/ibm_db2/patch-ul_value.sql
deleted file mode 100644
index cd00f8e0..00000000
--- a/maintenance/ibm_db2/patch-ul_value.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-CREATE TABLE updatelog (
- ul_key VARCHAR(255) NOT NULL PRIMARY KEY
-);
diff --git a/maintenance/ibm_db2/patch-uq61_msg_resource_links.sql b/maintenance/ibm_db2/patch-uq61_msg_resource_links.sql
deleted file mode 100644
index d9185c0a..00000000
--- a/maintenance/ibm_db2/patch-uq61_msg_resource_links.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE UNIQUE INDEX "UQ61_MSG_RESOURCE_LINKS" ON "MSG_RESOURCE_LINKS"
-(
-"MRL_MESSAGE",
-"MRL_RESOURCE"
-)
-ALLOW REVERSE SCANS
-;
diff --git a/maintenance/ibm_db2/patch-uq81_msg_resource.sql b/maintenance/ibm_db2/patch-uq81_msg_resource.sql
deleted file mode 100644
index 8ed85379..00000000
--- a/maintenance/ibm_db2/patch-uq81_msg_resource.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE UNIQUE INDEX "UQ81_MSG_RESOURCE" ON "MSG_RESOURCE"
-(
-"MR_RESOURCE"
-,"MR_LANG"
-)
-ALLOW REVERSE SCANS
-;
diff --git a/maintenance/ibm_db2/patch-uq96_module_deps.sql b/maintenance/ibm_db2/patch-uq96_module_deps.sql
deleted file mode 100644
index e0cc879a..00000000
--- a/maintenance/ibm_db2/patch-uq96_module_deps.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE UNIQUE INDEX "UQ96_MODULE_DEPS" ON "MODULE_DEPS"
-(
-"MD_MODULE"
-,"MD_SKIN"
-)
-ALLOW REVERSE SCANS
-;
diff --git a/maintenance/ibm_db2/patch-user_properties.sql b/maintenance/ibm_db2/patch-user_properties.sql
deleted file mode 100644
index 72dcd792..00000000
--- a/maintenance/ibm_db2/patch-user_properties.sql
+++ /dev/null
@@ -1,10 +0,0 @@
-CREATE TABLE user_properties (
- -- Foreign key to user.user_id
- up_user BIGINT NOT NULL,
-
- -- Name of the option being saved. This is indexed for bulk lookup.
- up_property VARCHAR(32) FOR BIT DATA NOT NULL,
-
- -- Property value as a string.
- up_value CLOB(64K) INLINE LENGTH 4096
-);
diff --git a/maintenance/ibm_db2/tables.sql b/maintenance/ibm_db2/tables.sql
deleted file mode 100644
index caad9251..00000000
--- a/maintenance/ibm_db2/tables.sql
+++ /dev/null
@@ -1,930 +0,0 @@
--- IBM DB2
-
--- SQL to create the initial tables for the MediaWiki database.
--- This is read and executed by the install script; you should
--- not have to run it by itself unless doing a manual install.
-
--- Notes:
--- * DB2 will convert all table and column names to all caps internally.
--- * DB2 has a 32k limit on SQL filesize, so it may be necessary
--- to split this into two files soon.
-
-
-CREATE TABLE user (
- -- Needs to start with 0
- user_id BIGINT
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 0),
- user_name VARCHAR(255) NOT NULL UNIQUE,
- user_real_name VARCHAR(255),
- user_password VARCHAR(1024),
- user_newpassword VARCHAR(1024),
- user_newpass_time TIMESTAMP(3),
- user_token VARCHAR(255),
- user_email VARCHAR(1024),
- user_email_token VARCHAR(255),
- user_email_token_expires TIMESTAMP(3),
- user_email_authenticated TIMESTAMP(3),
- -- obsolete, replace by user_properties table
- -- user_options CLOB(64K) INLINE LENGTH 4096,
- user_touched TIMESTAMP(3),
- user_registration TIMESTAMP(3),
- user_editcount INTEGER
-);
-CREATE INDEX user_email_token_idx
- ON user (user_email_token);
-CREATE UNIQUE INDEX user_include_idx
- ON user (user_id)
- INCLUDE (user_name, user_real_name, user_password, user_newpassword,
- user_newpass_time, user_token,
- user_email, user_email_token, user_email_token_expires,
- user_email_authenticated,
- user_touched, user_registration, user_editcount);
-CREATE UNIQUE INDEX user_email
- ON user (user_email);
-
-
-
--- Create a dummy user to satisfy fk contraints especially with revisions
-INSERT INTO user(
- user_name, user_real_name, user_password, user_newpassword, user_newpass_time,
- user_email, user_email_authenticated, user_token, user_registration, user_editcount
-)
-VALUES (
- 'Anonymous', '', NULL, NULL, CURRENT_TIMESTAMP,
- NULL, NULL, NULL, CURRENT_TIMESTAMP, 0
-);
-
-
-
-CREATE TABLE user_groups (
- ug_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE CASCADE,
- ug_group VARCHAR(255) NOT NULL
-);
-CREATE INDEX user_groups_unique
- ON user_groups (ug_user, ug_group);
-
-
-
-CREATE TABLE user_newtalk (
- -- registered users key
- user_id BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE CASCADE,
- -- anonymous users key
- user_ip VARCHAR(40),
- user_last_timestamp TIMESTAMP(3)
-);
-CREATE INDEX user_newtalk_id_idx
- ON user_newtalk (user_id);
-CREATE INDEX user_newtalk_ip_idx
- ON user_newtalk (user_ip);
-CREATE UNIQUE INDEX user_newtalk_include_idx
- ON user_newtalk (user_id, user_ip)
- INCLUDE (user_last_timestamp);
-
-
-
-CREATE TABLE page (
- page_id BIGINT
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- page_namespace SMALLINT NOT NULL,
- page_title VARCHAR(255) NOT NULL,
- page_restrictions VARCHAR(1024),
- page_counter BIGINT NOT NULL DEFAULT 0,
- page_is_redirect SMALLINT NOT NULL DEFAULT 0,
- page_is_new SMALLINT NOT NULL DEFAULT 0,
- page_random NUMERIC(15,14) NOT NULL,
- page_touched TIMESTAMP(3),
- page_latest BIGINT NOT NULL, -- FK?
- page_len BIGINT NOT NULL
-);
-CREATE UNIQUE INDEX page_unique_name
- ON page (page_namespace, page_title);
-CREATE INDEX page_random_idx
- ON page (page_random);
-CREATE INDEX page_len_idx
- ON page (page_len);
-CREATE UNIQUE INDEX page_id_include
- ON page (page_id)
- INCLUDE (page_namespace, page_title, page_restrictions, page_counter, page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len);
-CREATE UNIQUE INDEX page_name_include
- ON page (page_namespace, page_title)
- INCLUDE (page_id, page_restrictions, page_counter, page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len);
-
-
-
-CREATE TABLE revision (
- rev_id BIGINT
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- rev_page BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page (page_id) ON DELETE CASCADE,
- rev_text_id BIGINT, -- FK
- rev_comment VARCHAR(1024),
- rev_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE RESTRICT,
- rev_user_text VARCHAR(255) NOT NULL,
- rev_timestamp TIMESTAMP(3) NOT NULL,
- rev_minor_edit SMALLINT NOT NULL DEFAULT 0,
- rev_deleted SMALLINT NOT NULL DEFAULT 0,
- rev_len BIGINT,
- rev_parent_id BIGINT DEFAULT NULL,
- rev_sha1 VARCHAR(255) NOT NULL DEFAULT ''
-);
-CREATE UNIQUE INDEX revision_unique
- ON revision (rev_page, rev_id);
-CREATE INDEX rev_text_id_idx
- ON revision (rev_text_id);
-CREATE INDEX rev_timestamp_idx
- ON revision (rev_timestamp);
-CREATE INDEX rev_user_idx
- ON revision (rev_user);
-CREATE INDEX rev_user_text_idx
- ON revision (rev_user_text);
-
-
-
-CREATE TABLE text ( -- replaces reserved word 'text'
- old_id INTEGER
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- old_text CLOB(16M) INLINE LENGTH 4096,
- old_flags VARCHAR(1024)
-);
-
-
-
-CREATE TABLE page_restrictions (
- pr_id BIGINT
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- pr_page INTEGER NOT NULL DEFAULT 0,
- --(used to be nullable)
- -- REFERENCES page (page_id) ON DELETE CASCADE,
- pr_type VARCHAR(60) NOT NULL,
- pr_level VARCHAR(60) NOT NULL,
- pr_cascade SMALLINT NOT NULL,
- pr_user INTEGER,
- pr_expiry TIMESTAMP(3)
- --PRIMARY KEY (pr_page, pr_type)
-);
---ALTER TABLE page_restrictions ADD CONSTRAINT page_restrictions_pk PRIMARY KEY (pr_page, pr_type);
-CREATE UNIQUE INDEX pr_pagetype
- ON page_restrictions (pr_page, pr_type);
-CREATE INDEX pr_typelevel
- ON page_restrictions (pr_type, pr_level);
-CREATE INDEX pr_level
- ON page_restrictions (pr_level);
-CREATE INDEX pr_cascade
- ON page_restrictions (pr_cascade);
-
-
-
-CREATE TABLE page_props (
- pp_page INTEGER NOT NULL DEFAULT 0,
- -- REFERENCES page (page_id) ON DELETE CASCADE,
- pp_propname VARCHAR(255) NOT NULL,
- pp_value CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- PRIMARY KEY (pp_page, pp_propname)
-);
-CREATE INDEX page_props_propname
- ON page_props (pp_propname);
-
-
-
-CREATE TABLE archive (
- ar_namespace SMALLINT NOT NULL,
- ar_title VARCHAR(255) NOT NULL,
- ar_text CLOB(16M) INLINE LENGTH 4096,
- ar_comment VARCHAR(1024),
- ar_user BIGINT NOT NULL,
- -- no foreign keys in MySQL
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- ar_user_text VARCHAR(255) NOT NULL,
- ar_timestamp TIMESTAMP(3) NOT NULL,
- ar_minor_edit SMALLINT NOT NULL DEFAULT 0,
- ar_flags VARCHAR(1024),
- ar_rev_id INTEGER,
- ar_text_id INTEGER,
- ar_deleted SMALLINT NOT NULL DEFAULT 0,
- ar_len INTEGER,
- ar_page_id INTEGER,
- ar_parent_id INTEGER,
- ar_sha1 VARCHAR(255) NOT NULL DEFAULT ''
-);
-CREATE INDEX archive_name_title_timestamp
- ON archive (ar_namespace, ar_title, ar_timestamp);
-CREATE INDEX archive_user_text
- ON archive (ar_user_text);
-
-
-
-CREATE TABLE redirect (
- rd_from BIGINT NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- --REFERENCES page(page_id) ON DELETE CASCADE,
- rd_namespace SMALLINT NOT NULL DEFAULT 0,
- rd_title VARCHAR(255) NOT NULL DEFAULT '',
- rd_interwiki VARCHAR(32),
- rd_fragment VARCHAR(255)
-);
-CREATE INDEX redirect_ns_title
- ON redirect (rd_namespace, rd_title, rd_from);
-
-
-CREATE TABLE pagelinks (
- pl_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- pl_namespace SMALLINT NOT NULL,
- pl_title VARCHAR(255) NOT NULL
-);
-CREATE UNIQUE INDEX pagelink_unique
- ON pagelinks (pl_from, pl_namespace, pl_title);
-
-
-
-CREATE TABLE templatelinks (
- tl_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- tl_namespace SMALLINT NOT NULL,
- tl_title VARCHAR(255) NOT NULL
-);
-CREATE UNIQUE INDEX templatelinks_unique
- ON templatelinks (tl_namespace, tl_title, tl_from);
-CREATE UNIQUE INDEX tl_from_idx
- ON templatelinks (tl_from, tl_namespace, tl_title);
-
-
-
-CREATE TABLE imagelinks (
- il_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- il_to VARCHAR(255) NOT NULL
-);
-CREATE UNIQUE INDEX il_from_idx
- ON imagelinks (il_to, il_from);
-CREATE UNIQUE INDEX il_to_idx
- ON imagelinks (il_from, il_to);
-
-
-
-CREATE TABLE categorylinks (
- cl_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- cl_to VARCHAR(255) NOT NULL,
- -- cl_sortkey has to be at least 86 wide
- -- in order to be compatible with the old MySQL schema from MW 1.10
- --cl_sortkey VARCHAR(86),
- cl_sortkey VARCHAR(230) FOR BIT DATA NOT NULL,
- cl_sortkey_prefix VARCHAR(255) FOR BIT DATA NOT NULL,
- cl_timestamp TIMESTAMP(3) NOT NULL,
- cl_collation VARCHAR(32) FOR BIT DATA NOT NULL,
- cl_type VARCHAR(6) FOR BIT DATA NOT NULL
-);
-CREATE UNIQUE INDEX cl_from
- ON categorylinks (cl_from, cl_to);
-CREATE INDEX cl_sortkey
- ON categorylinks (cl_to, cl_sortkey, cl_from);
-
-
-
-CREATE TABLE externallinks (
- el_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- el_to VARCHAR(1024) NOT NULL,
- el_index VARCHAR(1024) NOT NULL
-);
-CREATE INDEX externallinks_from_to
- ON externallinks (el_from, el_to);
-CREATE INDEX externallinks_index
- ON externallinks (el_index);
-
-
-
---
--- Track external user accounts, if ExternalAuth is used
---
-CREATE TABLE external_user (
- -- Foreign key to user_id
- eu_local_id BIGINT NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
-
- -- Some opaque identifier provided by the external database
- eu_external_id VARCHAR(255) NOT NULL
-);
-CREATE UNIQUE INDEX eu_external_id_idx
- ON external_user (eu_external_id)
- INCLUDE (eu_local_id);
-CREATE UNIQUE INDEX eu_local_id_idx
- ON external_user (eu_local_id)
- INCLUDE (eu_external_id);
-
-
-
-CREATE TABLE langlinks (
- ll_from BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page (page_id) ON DELETE CASCADE,
- ll_lang VARCHAR(20),
- ll_title VARCHAR(255)
-);
-CREATE UNIQUE INDEX langlinks_unique
- ON langlinks (ll_from, ll_lang);
-CREATE INDEX langlinks_lang_title
- ON langlinks (ll_lang, ll_title);
-
-
-
-CREATE TABLE site_stats (
- ss_row_id BIGINT NOT NULL UNIQUE,
- ss_total_views BIGINT DEFAULT 0,
- ss_total_edits BIGINT DEFAULT 0,
- ss_good_articles BIGINT DEFAULT 0,
- ss_total_pages INTEGER DEFAULT -1,
- ss_users INTEGER DEFAULT -1,
- ss_active_users INTEGER DEFAULT -1,
- ss_admins INTEGER DEFAULT -1,
- ss_images INTEGER DEFAULT 0
-);
-
-
-
-CREATE TABLE hitcounter (
- hc_id BIGINT NOT NULL
-);
-
-
-
-CREATE TABLE ipblocks (
- ipb_id INTEGER NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- ipb_address VARCHAR(1024),
- ipb_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- ipb_by BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE CASCADE,
- ipb_by_text VARCHAR(255) NOT NULL DEFAULT '',
- ipb_reason VARCHAR(1024) NOT NULL,
- ipb_timestamp TIMESTAMP(3) NOT NULL,
- ipb_auto SMALLINT NOT NULL DEFAULT 0,
- ipb_anon_only SMALLINT NOT NULL DEFAULT 0,
- ipb_create_account SMALLINT NOT NULL DEFAULT 1,
- ipb_enable_autoblock SMALLINT NOT NULL DEFAULT 1,
- ipb_expiry TIMESTAMP(3) NOT NULL,
- ipb_range_start VARCHAR(1024),
- ipb_range_end VARCHAR(1024),
- ipb_deleted SMALLINT NOT NULL DEFAULT 0,
- ipb_block_email SMALLINT NOT NULL DEFAULT 0,
- ipb_allow_usertalk SMALLINT NOT NULL DEFAULT 0,
- ipb_parent_block_id INTEGER DEFAULT NULL
- -- REFERENCES ipblocks(ipb_id) ON DELETE SET NULL
-
-);
-CREATE INDEX ipb_address
- ON ipblocks (ipb_address);
-CREATE INDEX ipb_user
- ON ipblocks (ipb_user);
-CREATE INDEX ipb_range
- ON ipblocks (ipb_range_start, ipb_range_end);
-
-
-
-CREATE TABLE image (
- img_name VARCHAR(255) NOT NULL
- PRIMARY KEY,
- img_size BIGINT NOT NULL,
- img_width INTEGER NOT NULL,
- img_height INTEGER NOT NULL,
- img_metadata CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
- img_bits SMALLINT,
- img_media_type VARCHAR(255),
- img_major_mime VARCHAR(255) DEFAULT 'unknown',
- img_minor_mime VARCHAR(32) DEFAULT 'unknown',
- img_description VARCHAR(1024) NOT NULL DEFAULT '',
- img_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- img_user_text VARCHAR(255) NOT NULL DEFAULT '',
- img_timestamp TIMESTAMP(3),
- img_sha1 VARCHAR(255) NOT NULL DEFAULT ''
-);
-CREATE INDEX img_size_idx
- ON image (img_size);
-CREATE INDEX img_timestamp_idx
- ON image (img_timestamp);
-CREATE INDEX img_sha1
- ON image (img_sha1);
-
-
-CREATE TABLE oldimage (
- oi_name VARCHAR(255) NOT NULL DEFAULT '',
- oi_archive_name VARCHAR(255) NOT NULL,
- oi_size BIGINT NOT NULL,
- oi_width INTEGER NOT NULL,
- oi_height INTEGER NOT NULL,
- oi_bits SMALLINT NOT NULL,
- oi_description VARCHAR(1024),
- oi_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- oi_user_text VARCHAR(255) NOT NULL,
- oi_timestamp TIMESTAMP(3) NOT NULL,
- oi_metadata CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
- oi_media_type VARCHAR(255),
- oi_major_mime VARCHAR(255) NOT NULL DEFAULT 'unknown',
- oi_minor_mime VARCHAR(255) NOT NULL DEFAULT 'unknown',
- oi_deleted SMALLINT NOT NULL DEFAULT 0,
- oi_sha1 VARCHAR(255) NOT NULL DEFAULT ''
- --FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE
-);
-CREATE INDEX oi_name_timestamp
- ON oldimage (oi_name, oi_timestamp);
-CREATE INDEX oi_name_archive_name
- ON oldimage (oi_name, oi_archive_name);
-CREATE INDEX oi_sha1
- ON oldimage (oi_sha1);
-
-
-
-CREATE TABLE filearchive (
- fa_id INTEGER NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- fa_name VARCHAR(255) NOT NULL,
- fa_archive_name VARCHAR(255),
- fa_storage_group VARCHAR(255),
- fa_storage_key VARCHAR(64) DEFAULT '',
- fa_deleted_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- fa_deleted_timestamp TIMESTAMP(3) NOT NULL,
- fa_deleted_reason VARCHAR(255),
- fa_size BIGINT NOT NULL,
- fa_width INTEGER NOT NULL,
- fa_height INTEGER NOT NULL,
- fa_metadata CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
- fa_bits SMALLINT,
- fa_media_type VARCHAR(255),
- fa_major_mime VARCHAR(255) DEFAULT 'unknown',
- fa_minor_mime VARCHAR(255) DEFAULT 'unknown',
- fa_description VARCHAR(1024) NOT NULL,
- fa_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- fa_user_text VARCHAR(255) NOT NULL,
- fa_timestamp TIMESTAMP(3),
- fa_deleted SMALLINT NOT NULL DEFAULT 0
-);
-CREATE INDEX fa_name_time
- ON filearchive (fa_name, fa_timestamp);
-CREATE INDEX fa_dupe
- ON filearchive (fa_storage_group, fa_storage_key);
-CREATE INDEX fa_notime
- ON filearchive (fa_deleted_timestamp);
-CREATE INDEX fa_nouser
- ON filearchive (fa_deleted_user);
-
-
-
-CREATE TABLE recentchanges (
- rc_id INTEGER NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- rc_timestamp TIMESTAMP(3) NOT NULL,
- rc_cur_time TIMESTAMP(3) NOT NULL,
- rc_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- rc_user_text VARCHAR(255) NOT NULL,
- rc_namespace SMALLINT NOT NULL,
- rc_title VARCHAR(255) NOT NULL,
- rc_comment VARCHAR(255),
- rc_minor SMALLINT NOT NULL DEFAULT 0,
- rc_bot SMALLINT NOT NULL DEFAULT 0,
- rc_new SMALLINT NOT NULL DEFAULT 0,
- rc_cur_id BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES page(page_id) ON DELETE SET NULL,
- rc_this_oldid BIGINT NOT NULL,
- rc_last_oldid BIGINT NOT NULL,
- rc_type SMALLINT NOT NULL DEFAULT 0,
- rc_moved_to_ns SMALLINT,
- rc_moved_to_title VARCHAR(255),
- rc_patrolled SMALLINT NOT NULL DEFAULT 0,
- rc_ip VARCHAR(40), -- was CIDR type
- rc_old_len INTEGER,
- rc_new_len INTEGER,
- rc_deleted SMALLINT NOT NULL DEFAULT 0,
- rc_logid BIGINT NOT NULL DEFAULT 0,
- rc_log_type VARCHAR(255),
- rc_log_action VARCHAR(255),
- rc_params CLOB(64K) INLINE LENGTH 4096
-
-);
-CREATE INDEX rc_timestamp
- ON recentchanges (rc_timestamp);
-CREATE INDEX rc_namespace_title
- ON recentchanges (rc_namespace, rc_title);
-CREATE INDEX rc_cur_id
- ON recentchanges (rc_cur_id);
-CREATE INDEX new_name_timestamp
- ON recentchanges (rc_new, rc_namespace, rc_timestamp);
-CREATE INDEX rc_ip
- ON recentchanges (rc_ip);
-
-
-
-CREATE TABLE watchlist (
- wl_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE CASCADE,
- wl_namespace SMALLINT NOT NULL DEFAULT 0,
- wl_title VARCHAR(255) NOT NULL,
- wl_notificationtimestamp TIMESTAMP(3)
-);
-CREATE UNIQUE INDEX wl_user_namespace_title
- ON watchlist (wl_namespace, wl_title, wl_user);
-
-
-
-CREATE TABLE interwiki (
- iw_prefix VARCHAR(32) NOT NULL UNIQUE,
- iw_url CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- iw_api CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- iw_wikiid VARCHAR(64) NOT NULL,
- iw_local SMALLINT NOT NULL,
- iw_trans SMALLINT NOT NULL DEFAULT 0
-);
-
-
-
-CREATE TABLE querycache (
- qc_type VARCHAR(255) NOT NULL,
- qc_value BIGINT NOT NULL,
- qc_namespace INTEGER NOT NULL,
- qc_title VARCHAR(255) NOT NULL
-);
-CREATE INDEX querycache_type_value
- ON querycache (qc_type, qc_value);
-
-
-
-CREATE TABLE querycache_info (
- qci_type VARCHAR(255) UNIQUE NOT NULL,
- qci_timestamp TIMESTAMP(3)
-);
-
-
-
-CREATE TABLE querycachetwo (
- qcc_type VARCHAR(255) NOT NULL,
- qcc_value BIGINT NOT NULL DEFAULT 0,
- qcc_namespace INTEGER NOT NULL DEFAULT 0,
- qcc_title VARCHAR(255) NOT NULL DEFAULT '',
- qcc_namespacetwo INTEGER NOT NULL DEFAULT 0,
- qcc_titletwo VARCHAR(255) NOT NULL DEFAULT ''
-);
-CREATE INDEX querycachetwo_type_value
- ON querycachetwo (qcc_type, qcc_value);
-CREATE INDEX querycachetwo_title
- ON querycachetwo (qcc_type, qcc_namespace, qcc_title);
-CREATE INDEX querycachetwo_titletwo
- ON querycachetwo (qcc_type, qcc_namespacetwo, qcc_titletwo);
-
-
-
-CREATE TABLE objectcache (
- keyname VARCHAR(255) NOT NULL UNIQUE, -- was nullable
- value CLOB(16M) INLINE LENGTH 4096 NOT NULL DEFAULT '',
- exptime TIMESTAMP(3) NOT NULL
-);
-CREATE INDEX objectcacache_exptime
- ON objectcache (exptime);
-
-
-
-CREATE TABLE transcache (
- tc_url VARCHAR(255) NOT NULL UNIQUE,
- tc_contents CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- tc_time TIMESTAMP(3) NOT NULL
-);
-
-
-
-CREATE TABLE logging (
- log_id BIGINT NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- log_type VARCHAR(32) NOT NULL,
- log_action VARCHAR(32) NOT NULL,
- log_timestamp TIMESTAMP(3) NOT NULL,
- log_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- -- Name of the user who performed this action
- log_user_text VARCHAR(255) NOT NULL DEFAULT '',
- log_namespace SMALLINT NOT NULL,
- log_title VARCHAR(255) NOT NULL,
- log_page BIGINT,
- log_comment VARCHAR(255),
- log_params CLOB(64K) INLINE LENGTH 4096,
- log_deleted SMALLINT NOT NULL DEFAULT 0
-);
-CREATE INDEX logging_type_name
- ON logging (log_type, log_timestamp);
-CREATE INDEX logging_user_time
- ON logging (log_timestamp, log_user);
-CREATE INDEX logging_page_time
- ON logging (log_namespace, log_title, log_timestamp);
-CREATE INDEX log_user_type_time
- ON logging (log_user, log_type, log_timestamp);
-CREATE INDEX log_page_id_time
- ON logging (log_page, log_timestamp);
-CREATE UNIQUE INDEX type_action
- ON logging (log_type, log_action, log_timestamp);
-
-
-
-CREATE TABLE trackbacks (
- tb_id INTEGER NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- -- foreign key also in MySQL
- tb_page INTEGER,
- -- REFERENCES page(page_id) ON DELETE CASCADE,
- tb_title VARCHAR(255) NOT NULL,
- tb_url CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- tb_ex CLOB(64K) INLINE LENGTH 4096,
- tb_name VARCHAR(255)
-);
-CREATE INDEX trackback_page
- ON trackbacks (tb_page);
-
-
-
-CREATE TABLE job (
- job_id BIGINT NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- job_cmd VARCHAR(255) NOT NULL,
- job_namespace SMALLINT NOT NULL,
- job_title VARCHAR(255) NOT NULL,
- job_params CLOB(64K) INLINE LENGTH 4096 NOT NULL
-);
-CREATE INDEX job_cmd_namespace_title
- ON job (job_cmd, job_namespace, job_title);
-
-
-
---TODO
---CREATE FUNCTION add_interwiki (TEXT, INT, SMALLINT) RETURNS INT LANGUAGE SQL AS
---$mw$
--- INSERT INTO interwiki (iw_prefix, iw_url, iw_local) VALUES ($1,$2,$3);
--- SELECT 1;
---$mw$;
-
-
-
--- hack implementation
--- should be replaced with OmniFind, Contains(), etc
-CREATE TABLE searchindex (
- si_page BIGINT NOT NULL,
- si_title VARCHAR(255) NOT NULL DEFAULT '',
- si_text CLOB NOT NULL
-);
-
-
-
--- This table is not used unless profiling is turned on
-CREATE TABLE profiling (
- pf_count INTEGER NOT NULL DEFAULT 0,
- pf_time NUMERIC(18,10) NOT NULL DEFAULT 0,
- pf_memory NUMERIC(18,10) NOT NULL DEFAULT 0,
- pf_name VARCHAR(255) NOT NULL,
- pf_server VARCHAR(255)
-);
-CREATE UNIQUE INDEX pf_name_server
- ON profiling (pf_name, pf_server);
-
-
-
-CREATE TABLE protected_titles (
- pt_namespace INTEGER NOT NULL,
- pt_title VARCHAR(255) NOT NULL,
- pt_user BIGINT NOT NULL DEFAULT 0,
- -- REFERENCES user(user_id) ON DELETE SET NULL,
- pt_reason VARCHAR(1024),
- pt_timestamp TIMESTAMP(3) NOT NULL,
- pt_expiry TIMESTAMP(3),
- pt_create_perm VARCHAR(60) NOT NULL DEFAULT ''
-);
-CREATE UNIQUE INDEX protected_titles_unique
- ON protected_titles (pt_namespace, pt_title);
-
-
-
-CREATE TABLE updatelog (
- ul_key VARCHAR(255) NOT NULL
- PRIMARY KEY
-);
-
-
-
-CREATE TABLE category (
- cat_id INTEGER NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- cat_title VARCHAR(255) NOT NULL,
- cat_pages INTEGER NOT NULL DEFAULT 0,
- cat_subcats INTEGER NOT NULL DEFAULT 0,
- cat_files INTEGER NOT NULL DEFAULT 0,
- cat_hidden SMALLINT NOT NULL DEFAULT 0
-);
-CREATE UNIQUE INDEX category_title
- ON category (cat_title);
-CREATE INDEX category_pages
- ON category (cat_pages);
-
-
-
--- A table to track tags for revisions, logs and recent changes.
-CREATE TABLE change_tag (
- ct_rc_id INTEGER,
- ct_log_id INTEGER,
- ct_rev_id INTEGER,
- ct_tag VARCHAR(255) NOT NULL,
- ct_params CLOB(64K) INLINE LENGTH 4096
-);
-CREATE UNIQUE INDEX change_tag_rc_tag
- ON change_tag (ct_rc_id, ct_tag);
-CREATE UNIQUE INDEX change_tag_log_tag
- ON change_tag (ct_log_id, ct_tag);
-CREATE UNIQUE INDEX change_tag_rev_tag
- ON change_tag (ct_rev_id, ct_tag);
--- Covering index, so we can pull all the info only out of the index.
-CREATE INDEX change_tag_tag_id
- ON change_tag (ct_tag, ct_rc_id, ct_rev_id, ct_log_id);
-
-
-
--- Rollup table to pull a LIST of tags simply
-CREATE TABLE tag_summary (
- ts_rc_id INTEGER,
- ts_log_id INTEGER,
- ts_rev_id INTEGER,
- ts_tags CLOB(64K) INLINE LENGTH 4096 NOT NULL
-);
-CREATE UNIQUE INDEX tag_summary_rc_id
- ON tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX tag_summary_log_id
- ON tag_summary (ts_log_id);
-CREATE UNIQUE INDEX tag_summary_rev_id
- ON tag_summary (ts_rev_id);
-
-
-
-CREATE TABLE valid_tag (
- vt_tag VARCHAR(255) NOT NULL
- PRIMARY KEY
-);
-
-
-
---
--- User preferences and perhaps other fun stuff. :)
--- Replaces the old user.user_options blob, with a couple nice properties:
---
--- 1) We only store non-default settings, so changes to the DEFAULTs
--- are now reflected for everybody, not just new accounts.
--- 2) We can more easily do bulk lookups, statistics, or modifications of
--- saved options since it's a sane table structure.
---
-CREATE TABLE user_properties (
- -- Foreign key to user.user_id
- up_user BIGINT NOT NULL,
- -- Name of the option being saved. This is indexed for bulk lookup.
- up_property VARCHAR(255) FOR BIT DATA NOT NULL,
- -- Property value as a string.
- up_value CLOB(64K) INLINE LENGTH 4096
-);
-CREATE UNIQUE INDEX user_properties_user_property
- ON user_properties (up_user, up_property);
-CREATE INDEX user_properties_property
- ON user_properties (up_property);
-
-CREATE TABLE log_search (
- -- The type of ID (rev ID, log ID, rev TIMESTAMP(3), username)
- ls_field VARCHAR(32) FOR BIT DATA NOT NULL,
- -- The value of the ID
- ls_value VARCHAR(255) NOT NULL,
- -- Key to log_id
- ls_log_id BIGINT NOT NULL DEFAULT 0
-);
-CREATE UNIQUE INDEX ls_field_val
- ON log_search (ls_field, ls_value, ls_log_id);
-CREATE INDEX ls_log_id
- ON log_search (ls_log_id);
-
-
-
--- Table for storing localisation data
-CREATE TABLE l10n_cache (
- -- Language code
- lc_lang VARCHAR(32) NOT NULL,
- -- Cache key
- lc_key VARCHAR(255) NOT NULL,
- -- Value
- lc_value CLOB(16M) INLINE LENGTH 4096 NOT NULL
-);
-CREATE INDEX lc_lang_key
- ON l10n_cache (lc_lang, lc_key);
-
-
-
-CREATE TABLE msg_resource_links
-(
- mrl_resource VARCHAR(255) FOR BIT DATA NOT NULL,
- mrl_message VARCHAR(255) FOR BIT DATA NOT NULL
-);
-CREATE UNIQUE INDEX uq61_msg_resource_links
- ON msg_resource_links (mrl_message, mrl_resource);
--- All DB2 indexes DEFAULT to allowing reverse scans
-
-
-
-CREATE TABLE msg_resource
-(
- mr_resource VARCHAR(255) FOR BIT DATA NOT NULL,
- mr_lang VARCHAR(32) FOR BIT DATA NOT NULL,
- mr_blob CLOB(64K) INLINE LENGTH 4096 NOT NULL,
- mr_timestamp TIMESTAMP(3) NOT NULL
-);
-CREATE UNIQUE INDEX uq81_msg_resource
- ON msg_resource (mr_resource, mr_lang);
--- All DB2 indexes DEFAULT to allowing reverse scans
-
-
-
-CREATE TABLE module_deps (
- md_module VARCHAR(255) FOR BIT DATA NOT NULL,
- md_skin VARCHAR(32) FOR BIT DATA NOT NULL,
- md_deps CLOB(16M) INLINE LENGTH 4096 NOT NULL
-);
-CREATE UNIQUE INDEX uq96_module_deps
- ON module_deps (md_module, md_skin);
--- All DB2 indexes DEFAULT to allowing reverse scans
-
-
-
-CREATE TABLE iwlinks
-(
- iwl_from INTEGER NOT NULL,
- iwl_prefix VARCHAR(20) FOR BIT DATA NOT NULL,
- iwl_title VARCHAR(255) FOR BIT DATA NOT NULL
-);
-
-
-
---
--- Store information about newly uploaded files before they're
--- moved into the actual filestore
---
-CREATE TABLE uploadstash (
- us_id BIGINT NOT NULL
- PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
- -- the user who uploaded the file.
- us_user BIGINT NOT NULL,
- -- file key. this is how applications actually search for the file.
- -- this might go away, or become the primary key.
- us_key VARCHAR(255) NOT NULL,
- -- the original path
- us_orig_path VARCHAR(255) NOT NULL,
- -- the temporary path at which the file is actually stored
- us_path VARCHAR(255) NOT NULL,
- -- which type of upload the file came from (sometimes)
- us_source_type VARCHAR(50),
- -- the date/time on which the file was added
- us_timestamp TIMESTAMP(3) NOT NULL,
- us_status VARCHAR(50) NOT NULL,
- -- file properties from File::getPropsFromPath. these may prove unnecessary.
- --
- us_size BIGINT NOT NULL,
- -- this hash comes from File::sha1Base36(), and is 31 characters
- us_sha1 VARCHAR(31) NOT NULL,
- us_mime VARCHAR(255),
- -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
- us_media_type VARCHAR(30)
- CONSTRAINT my_constraint
- CHECK (
- us_media_type in (
- 'UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA',
- 'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'
- )
- ) DEFAULT NULL,
- -- image-specific properties
- us_image_width BIGINT,
- us_image_height BIGINT,
- us_image_bits INTEGER
-);
--- sometimes there's a delete for all of a user's stuff.
-CREATE INDEX us_user
- ON uploadstash (us_user);
--- pick out files by key, enforce key UNIQUEness
-CREATE UNIQUE INDEX us_key
- ON uploadstash (us_key);
--- the abandoned upload cleanup script needs this
-CREATE INDEX us_timestamp
- ON uploadstash (us_timestamp);
-
-
-
--- Stores the groups the user has once belonged to.
--- The user may still belong these groups. Check user_groups.
-CREATE TABLE user_former_groups (
- ufg_user BIGINT NOT NULL DEFAULT 0,
- ufg_group VARCHAR(16) FOR BIT DATA NOT NULL
-);
-CREATE UNIQUE INDEX ufg_user_group
- ON user_former_groups (ufg_user, ufg_group);
diff --git a/maintenance/importDump.php b/maintenance/importDump.php
index f51d7ad7..904b6247 100644
--- a/maintenance/importDump.php
+++ b/maintenance/importDump.php
@@ -32,13 +32,13 @@ require_once( __DIR__ . '/Maintenance.php' );
* @ingroup Maintenance
*/
class BackupReader extends Maintenance {
- var $reportingInterval = 100;
- var $pageCount = 0;
- var $revCount = 0;
- var $dryRun = false;
- var $uploads = false;
- var $imageBasePath = false;
- var $nsFilter = false;
+ public $reportingInterval = 100;
+ public $pageCount = 0;
+ public $revCount = 0;
+ public $dryRun = false;
+ public $uploads = false;
+ public $imageBasePath = false;
+ public $nsFilter = false;
function __construct() {
parent::__construct();
diff --git a/maintenance/importImages.inc b/maintenance/importImages.inc
index ac5d1443..2b3d5514 100644
--- a/maintenance/importImages.inc
+++ b/maintenance/importImages.inc
@@ -28,9 +28,10 @@
*
* @param $dir string Path to directory to search
* @param $exts Array of extensions to search for
+ * @param $recurse Bool Search subdirectories recursively
* @return mixed Array of filenames on success, or false on failure
*/
-function findFiles( $dir, $exts ) {
+function findFiles( $dir, $exts, $recurse = false ) {
if ( is_dir( $dir ) ) {
$dhl = opendir( $dir );
if ( $dhl ) {
@@ -38,8 +39,11 @@ function findFiles( $dir, $exts ) {
while ( ( $file = readdir( $dhl ) ) !== false ) {
if ( is_file( $dir . '/' . $file ) ) {
list( /* $name */, $ext ) = splitFilename( $dir . '/' . $file );
- if ( array_search( strtolower( $ext ), $exts ) !== false )
+ if ( array_search( strtolower( $ext ), $exts ) !== false ) {
$files[] = $dir . '/' . $file;
+ }
+ } elseif ( $recurse && is_dir( $dir . '/' . $file ) && $file !== '..' && $file !== '.' ) {
+ $files = array_merge( $files, findFiles( $dir . '/' . $file, $exts, true ) );
}
}
return $files;
diff --git a/maintenance/importImages.php b/maintenance/importImages.php
index 8d92383d..782f502d 100644
--- a/maintenance/importImages.php
+++ b/maintenance/importImages.php
@@ -31,7 +31,10 @@
* @author Mij <mij@bitchx.it>
*/
-$optionsWithArgs = array( 'extensions', 'comment', 'comment-file', 'comment-ext', 'user', 'license', 'sleep', 'limit', 'from', 'source-wiki-url' );
+$optionsWithArgs = array(
+ 'extensions', 'comment', 'comment-file', 'comment-ext', 'summary', 'user',
+ 'license', 'sleep', 'limit', 'from', 'source-wiki-url', 'timestamp',
+);
require_once( __DIR__ . '/commandLine.inc' );
require_once( __DIR__ . '/importImages.inc' );
$processed = $added = $ignored = $skipped = $overwritten = $failed = 0;
@@ -61,7 +64,7 @@ $extensions = isset( $options['extensions'] )
: $wgFileExtensions;
# Search the path provided for candidates for import
-$files = findFiles( $dir, $extensions );
+$files = findFiles( $dir, $extensions, isset( $options['search-recursively'] ) );
# Initialise the user for this operation
$user = isset( $options['user'] )
@@ -98,6 +101,8 @@ if ( $limit ) {
$limit = (int)$limit;
}
+$timestamp = isset( $options['timestamp'] ) ? $options['timestamp'] : false;
+
# Get the upload comment. Provide a default one in case there's no comment given.
$comment = 'Importing image file';
@@ -112,6 +117,8 @@ if ( isset( $options['comment-file'] ) ) {
$commentExt = isset( $options['comment-ext'] ) ? $options['comment-ext'] : false;
+$summary = isset( $options['summary'] ) ? $options['summary'] : '';
+
# Get the license specifier
$license = isset( $options['license'] ) ? $options['license'] : '';
@@ -230,9 +237,14 @@ if ( $count > 0 ) {
}
}
+ $commentText = SpecialUpload::getInitialPageText( $commentText, $license );
+ if ( !$summary ) {
+ $summary = $commentText;
+ }
+
if ( isset( $options['dry'] ) ) {
echo( "done.\n" );
- } elseif ( $image->recordUpload( $archive->value, $commentText, $license ) ) {
+ } elseif ( $image->recordUpload2( $archive->value, $summary, $commentText, false, $timestamp ) ) {
# We're done!
echo( "done.\n" );
@@ -314,25 +326,28 @@ USAGE: php importImages.php [options] <dir>
<dir> : Path to the directory containing images to be imported
Options:
---extensions=<exts> Comma-separated list of allowable extensions, defaults to \$wgFileExtensions
---overwrite Overwrite existing images with the same name (default is to skip them)
---limit=<num> Limit the number of images to process. Ignored or skipped images are not counted.
---from=<name> Ignore all files until the one with the given name. Useful for resuming
- aborted imports. <name> should be the file's canonical database form.
---skip-dupes Skip images that were already uploaded under a different name (check SHA1)
---sleep=<sec> Sleep between files. Useful mostly for debugging.
---user=<username> Set username of uploader, default 'Maintenance script'
---check-userblock Check if the user got blocked during import.
---comment=<text> Set upload summary comment, default 'Importing image file'.
---comment-file=<file> Set upload summary comment the the content of <file>.
---comment-ext=<ext> Causes the comment for each file to be loaded from a file with the same name
- but the extension <ext>. If a global comment is also given, it is appended.
---license=<code> Use an optional license template
---dry Dry run, don't import anything
+--extensions=<exts> Comma-separated list of allowable extensions, defaults to \$wgFileExtensions
+--overwrite Overwrite existing images with the same name (default is to skip them)
+--limit=<num> Limit the number of images to process. Ignored or skipped images are not counted.
+--from=<name> Ignore all files until the one with the given name. Useful for resuming
+ aborted imports. <name> should be the file's canonical database form.
+--skip-dupes Skip images that were already uploaded under a different name (check SHA1)
+--search-recursively Search recursively for files in subdirectories
+--sleep=<sec> Sleep between files. Useful mostly for debugging.
+--user=<username> Set username of uploader, default 'Maintenance script'
+--check-userblock Check if the user got blocked during import.
+--comment=<text> Set file description, default 'Importing image file'.
+--comment-file=<file> Set description to the content of <file>.
+--comment-ext=<ext> Causes the description for each file to be loaded from a file with the same name
+ but the extension <ext>. If a global description is also given, it is appended.
+--license=<code> Use an optional license template
+--dry Dry run, don't import anything
--protect=<protect> Specify the protect value (autoconfirmed,sysop)
+--summary=<summary> Upload summary, description will be used if not provided
+--timestamp=<timestamp> Override upload time/date, all MediaWiki timestamp formats are accepted
--unprotect Unprotects all uploaded images
---source-wiki-url if specified, take User and Comment data for each imported file from this URL.
- For example, --source-wiki-url="http://en.wikipedia.org/"
+--source-wiki-url If specified, take User and Comment data for each imported file from this URL.
+ For example, --source-wiki-url="http://en.wikipedia.org/"
TEXT;
exit( 1 );
diff --git a/maintenance/importSiteScripts.php b/maintenance/importSiteScripts.php
index e369cb15..fabc6dc6 100644
--- a/maintenance/importSiteScripts.php
+++ b/maintenance/importSiteScripts.php
@@ -62,7 +62,8 @@ class ImportSiteScripts extends Maintenance {
$text = Http::get( $url );
$wikiPage = WikiPage::factory( $title );
- $wikiPage->doEdit( $text, "Importing from $url", 0, false, $user );
+ $content = ContentHandler::makeContent( $text, $wikiPage->getTitle() );
+ $wikiPage->doEditContent( $content, "Importing from $url", 0, false, $user );
}
}
diff --git a/maintenance/importTextFile.php b/maintenance/importTextFile.php
index adb50635..c04989c0 100644
--- a/maintenance/importTextFile.php
+++ b/maintenance/importTextFile.php
@@ -56,7 +56,8 @@ if ( count( $args ) < 1 || isset( $options['help'] ) ) {
echo( "\nPerforming edit..." );
$page = WikiPage::factory( $title );
- $page->doEdit( $text, $comment, $flags, false, $user );
+ $content = ContentHandler::makeContent( $text, $title );
+ $page->doEditContent( $content, $comment, $flags, false, $user );
echo( "done.\n" );
} else {
diff --git a/maintenance/initSiteStats.php b/maintenance/initSiteStats.php
new file mode 100644
index 00000000..19906592
--- /dev/null
+++ b/maintenance/initSiteStats.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Re-initialise or update the site statistics table.
+ *
+ * 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 Maintenance
+ * @author Brion Vibber
+ * @author Rob Church <robchur@gmail.com>
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to re-initialise or update the site statistics table
+ *
+ * @ingroup Maintenance
+ */
+class InitSiteStats extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Re-initialise the site statistics tables";
+ $this->addOption( 'update', 'Update the existing statistics (preserves the ss_total_views field)' );
+ $this->addOption( 'noviews', "Don't update the page view counter" );
+ $this->addOption( 'active', 'Also update active users count' );
+ $this->addOption( 'use-master', 'Count using the master database' );
+ }
+
+ public function execute() {
+ $this->output( "Refresh Site Statistics\n\n" );
+ $counter = new SiteStatsInit( $this->hasOption( 'use-master' ) );
+
+ $this->output( "Counting total edits..." );
+ $edits = $counter->edits();
+ $this->output( "{$edits}\nCounting number of articles..." );
+
+ $good = $counter->articles();
+ $this->output( "{$good}\nCounting total pages..." );
+
+ $pages = $counter->pages();
+ $this->output( "{$pages}\nCounting number of users..." );
+
+ $users = $counter->users();
+ $this->output( "{$users}\nCounting number of images..." );
+
+ $image = $counter->files();
+ $this->output( "{$image}\n" );
+
+ if ( !$this->hasOption( 'noviews' ) ) {
+ $this->output( "Counting total page views..." );
+ $views = $counter->views();
+ $this->output( "{$views}\n" );
+ }
+
+ if ( $this->hasOption( 'active' ) ) {
+ $this->output( "Counting active users..." );
+ $active = SiteStatsUpdate::cacheUpdate( wfGetDB( DB_MASTER ) );
+ $this->output( "{$active}\n" );
+ }
+
+ $this->output( "\nUpdating site statistics..." );
+
+ if ( $this->hasOption( 'update' ) ) {
+ $counter->update();
+ } else {
+ $counter->refresh();
+ }
+
+ $this->output( "done.\n" );
+ }
+}
+
+$maintClass = "InitSiteStats";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/initStats.php b/maintenance/initStats.php
deleted file mode 100644
index 5d8b8866..00000000
--- a/maintenance/initStats.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-/**
- * Re-initialise or update the site statistics table.
- *
- * 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 Maintenance
- * @author Brion Vibber
- * @author Rob Church <robchur@gmail.com>
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script to re-initialise or update the site statistics table
- *
- * @ingroup Maintenance
- */
-class InitStats extends Maintenance {
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Re-initialise the site statistics tables";
- $this->addOption( 'update', 'Update the existing statistics (preserves the ss_total_views field)' );
- $this->addOption( 'noviews', "Don't update the page view counter" );
- $this->addOption( 'active', 'Also update active users count' );
- $this->addOption( 'use-master', 'Count using the master database' );
- }
-
- public function execute() {
- $this->output( "Refresh Site Statistics\n\n" );
- $counter = new SiteStatsInit( $this->hasOption( 'use-master' ) );
-
- $this->output( "Counting total edits..." );
- $edits = $counter->edits();
- $this->output( "{$edits}\nCounting number of articles..." );
-
- $good = $counter->articles();
- $this->output( "{$good}\nCounting total pages..." );
-
- $pages = $counter->pages();
- $this->output( "{$pages}\nCounting number of users..." );
-
- $users = $counter->users();
- $this->output( "{$users}\nCounting number of images..." );
-
- $image = $counter->files();
- $this->output( "{$image}\n" );
-
- if ( !$this->hasOption( 'noviews' ) ) {
- $this->output( "Counting total page views..." );
- $views = $counter->views();
- $this->output( "{$views}\n" );
- }
-
- if ( $this->hasOption( 'active' ) ) {
- $this->output( "Counting active users..." );
- $active = SiteStatsUpdate::cacheUpdate( wfGetDB( DB_MASTER ) );
- $this->output( "{$active}\n" );
- }
-
- $this->output( "\nUpdating site statistics..." );
-
- if ( $this->hasOption( 'update' ) ) {
- $counter->update();
- } else {
- $counter->refresh();
- }
-
- $this->output( "done.\n" );
- }
-}
-
-$maintClass = "InitStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/install.php b/maintenance/install.php
index 762bb94f..935a2966 100644
--- a/maintenance/install.php
+++ b/maintenance/install.php
@@ -22,9 +22,8 @@
*/
if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
- echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.3.2 or higher. ABORTING.\n" .
- "Check if you have a newer php executable with a different name, such as php5.\n";
- die( 1 );
+ require_once( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
+ wfPHPVersionError( 'cli' );
}
define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
@@ -45,7 +44,8 @@ class CommandLineInstaller extends Maintenance {
$this->addArg( 'name', 'The name of the wiki', true);
$this->addArg( 'admin', 'The username of the wiki administrator (WikiSysop)', true );
- $this->addOption( 'pass', 'The password for the wiki administrator.', true, true );
+ $this->addOption( 'pass', 'The password for the wiki administrator.', false, true );
+ $this->addOption( 'passfile', 'An alternative way to provide pass option, as the contents of this file', false, true );
/* $this->addOption( 'email', 'The email for the wiki administrator', false, true ); */
$this->addOption( 'scriptpath', 'The relative path of the wiki in the web server (/wiki)', false, true );
@@ -77,6 +77,9 @@ class CommandLineInstaller extends Maintenance {
$dbpassfile = $this->getOption( 'dbpassfile', false );
if ( $dbpassfile !== false ) {
+ if ( $this->getOption( 'dbpass', false ) !== false ) {
+ $this->error( 'WARNING: You provide the options "dbpass" and "dbpassfile". The content of "dbpassfile" overwrites "dbpass".' );
+ }
wfSuppressWarnings();
$dbpass = file_get_contents( $dbpassfile );
wfRestoreWarnings();
@@ -86,6 +89,22 @@ class CommandLineInstaller extends Maintenance {
$this->mOptions['dbpass'] = trim( $dbpass, "\r\n" );
}
+ $passfile = $this->getOption( 'passfile', false );
+ if ( $passfile !== false ) {
+ if ( $this->getOption( 'pass', false ) !== false ) {
+ $this->error( 'WARNING: You provide the options "pass" and "passfile". The content of "passfile" overwrites "pass".' );
+ }
+ wfSuppressWarnings();
+ $pass = file_get_contents( $passfile );
+ wfRestoreWarnings();
+ if ( $pass === false ) {
+ $this->error( "Couldn't open $passfile", true );
+ }
+ $this->mOptions['pass'] = str_replace( array( "\n", "\r" ), "", $pass );
+ } elseif ( $this->getOption( 'pass', false ) === false ) {
+ $this->error( 'You need to provide the option "pass" or "passfile"', true );
+ }
+
$installer =
InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
diff --git a/maintenance/jsduck/MetaTags.rb b/maintenance/jsduck/MetaTags.rb
new file mode 100644
index 00000000..84e40213
--- /dev/null
+++ b/maintenance/jsduck/MetaTags.rb
@@ -0,0 +1,53 @@
+# See also:
+# - https://github.com/senchalabs/jsduck/wiki/Tags
+# - https://github.com/senchalabs/jsduck/wiki/Custom-tags
+require 'jsduck/meta_tag'
+
+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
diff --git a/maintenance/jsduck/categories.json b/maintenance/jsduck/categories.json
new file mode 100644
index 00000000..4a8ba8c3
--- /dev/null
+++ b/maintenance/jsduck/categories.json
@@ -0,0 +1,54 @@
+[
+ {
+ "name": "MediaWiki",
+ "groups": [
+ {
+ "name": "Base",
+ "classes": [
+ "mw",
+ "mw.Map",
+ "mw.Message",
+ "mw.loader",
+ "mw.html",
+ "mw.html.Cdata",
+ "mw.html.Raw"
+ ]
+ },
+ {
+ "name": "General",
+ "classes": [
+ "mw.Title",
+ "mw.notification",
+ "mw.util",
+ "mw.plugin.notify"
+ ]
+ },
+ {
+ "name": "API",
+ "classes": ["mw.Api*"]
+ }
+ ]
+ },
+ {
+ "name": "jQuery",
+ "groups": [
+ {
+ "name": "Core",
+ "classes": ["jQuery", "jQuery.Event", "jQuery.Promise", "jQuery.Deferred", "jQuery.jqXHR"]
+ },
+ {
+ "name": "Plugins",
+ "classes": ["jQuery.plugin.*"]
+ }
+ ]
+ },
+ {
+ "name": "Misc",
+ "groups": [
+ {
+ "name": "Native",
+ "classes": ["Array", "Boolean", "Date", "Function", "Number", "Object", "RegExp", "String"]
+ }
+ ]
+ }
+]
diff --git a/maintenance/jsduck/config.json b/maintenance/jsduck/config.json
new file mode 100644
index 00000000..c4705d8f
--- /dev/null
+++ b/maintenance/jsduck/config.json
@@ -0,0 +1,18 @@
+{
+ "--title": "MediaWiki Code Documentation",
+ "--categories": "./categories.json",
+ "--meta-tags": "./MetaTags.rb",
+ "--warnings": ["-no_doc"],
+ "--builtin-classes": true,
+ "--output": "../../docs/js",
+ "--": [
+ "./external.js",
+ "../../resources/mediawiki/mediawiki.js",
+ "../../resources/mediawiki/mediawiki.util.js",
+ "../../resources/mediawiki/mediawiki.Title.js",
+ "../../resources/mediawiki/mediawiki.notify.js",
+ "../../resources/mediawiki/mediawiki.notification.js",
+ "../../resources/mediawiki.api",
+ "../../resources/jquery/jquery.localize.js"
+ ]
+} \ No newline at end of file
diff --git a/maintenance/jsduck/eg-iframe.html b/maintenance/jsduck/eg-iframe.html
new file mode 100644
index 00000000..f53b4044
--- /dev/null
+++ b/maintenance/jsduck/eg-iframe.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>MediaWiki Examples</title>
+ <script>
+ function loadInlineExample(code, options, callback) {
+ try {
+ document.body.innerHTML = '';
+ eval(code);
+ callback && callback(true);
+ } catch (e) {
+ document.body.innerHTML = document.createTextNode(e);
+ callback && callback(false, e);
+ }
+ }
+ </script>
+</head>
+<body></body>
+</html>
diff --git a/maintenance/jsduck/external.js b/maintenance/jsduck/external.js
new file mode 100644
index 00000000..8ab102f4
--- /dev/null
+++ b/maintenance/jsduck/external.js
@@ -0,0 +1,26 @@
+/**
+ * @class jQuery
+ */
+
+/**
+ * @method ajax
+ * @return {jqXHR}
+ */
+
+/**
+ * @class jQuery.Event
+ */
+
+/**
+ * @class jQuery.Promise
+ */
+
+/**
+ * @class jQuery.Deferred
+ * @mixins jQuery.Promise
+ */
+
+/**
+ * @class jQuery.jqXHR
+ * @alternateClassName jqXHR
+ */
diff --git a/maintenance/jsparse.php b/maintenance/jsparse.php
index ceafc390..1a2e121c 100644
--- a/maintenance/jsparse.php
+++ b/maintenance/jsparse.php
@@ -29,7 +29,7 @@ require_once( __DIR__ . '/Maintenance.php' );
* @ingroup Maintenance
*/
class JSParseHelper extends Maintenance {
- var $errs = 0;
+ public $errs = 0;
public function __construct() {
parent::__construct();
diff --git a/maintenance/lag.php b/maintenance/lag.php
index 3ad0864f..3df11692 100644
--- a/maintenance/lag.php
+++ b/maintenance/lag.php
@@ -51,7 +51,7 @@ class DatabaseLag extends Maintenance {
unset( $lags[0] );
echo gmdate( 'H:i:s' ) . ' ';
foreach ( $lags as $lag ) {
- printf( "%-12s " , $lag === false ? 'false' : $lag );
+ printf( "%-12s ", $lag === false ? 'false' : $lag );
}
echo "\n";
sleep( 5 );
@@ -61,7 +61,7 @@ class DatabaseLag extends Maintenance {
$lags = $lb->getLagTimes();
foreach ( $lags as $i => $lag ) {
$name = $lb->getServerName( $i );
- $this->output( sprintf( "%-20s %s\n" , $name, $lag === false ? 'false' : $lag ) );
+ $this->output( sprintf( "%-20s %s\n", $name, $lag === false ? 'false' : $lag ) );
}
}
}
diff --git a/maintenance/language/StatOutputs.php b/maintenance/language/StatOutputs.php
index d77029e7..20fb4778 100644
--- a/maintenance/language/StatOutputs.php
+++ b/maintenance/language/StatOutputs.php
@@ -60,7 +60,7 @@ class wikiStatsOutput extends statsOutput {
echo ', as well as the following languages that are not intended for system message translations, usually because they redirect to other language codes: ' . implode( ', ', $dummyCodes );
}
echo ".\n\n"; # dot to end sentence
- echo '{| class="sortable wikitable" border="2" cellpadding="4" cellspacing="0" style="background-color: #F9F9F9; border: 1px #AAAAAA solid; border-collapse: collapse; clear:both;" width="100%"' . "\n";
+ echo '{| class="sortable wikitable" border="2" style="background-color: #F9F9F9; border: 1px #AAAAAA solid; border-collapse: collapse; clear:both; width:100%;"' . "\n";
}
function footer() {
echo "|}\n";
@@ -96,7 +96,7 @@ class wikiStatsOutput extends statsOutput {
$color = $red . $green . $blue;
$percent = parent::formatPercent( $subset, $total, $revert, $accuracy );
- return 'bgcolor="#' . $color . '"|' . $percent;
+ return 'style="background-color:#' . $color . ';"|' . $percent;
}
}
diff --git a/maintenance/language/checkLanguage.inc b/maintenance/language/checkLanguage.inc
index 11b00e14..1860f4a5 100644
--- a/maintenance/language/checkLanguage.inc
+++ b/maintenance/language/checkLanguage.inc
@@ -43,7 +43,7 @@ class CheckLanguageCLI {
* Constructor.
* @param $options array Options for script.
*/
- public function __construct( Array $options ) {
+ public function __construct( array $options ) {
if ( isset( $options['help'] ) ) {
echo $this->help();
exit(1);
@@ -305,6 +305,7 @@ ENDS;
/**
* Check a language.
* @param $code string The language code.
+ * @throws MWException
* @return array The results.
*/
protected function checkLanguage( $code ) {
@@ -484,7 +485,7 @@ class CheckExtensionsCLI extends CheckLanguageCLI {
* @param $options array Options for script.
* @param $extension string The extension name (or names).
*/
- public function __construct( Array $options, $extension ) {
+ public function __construct( array $options, $extension ) {
if ( isset( $options['help'] ) ) {
echo $this->help();
exit(1);
@@ -641,6 +642,7 @@ ENDS;
/**
* Check a language and show the results.
* @param $code string The language code.
+ * @throws MWException
*/
protected function checkLanguage( $code ) {
foreach( $this->extensions as $extension ) {
diff --git a/maintenance/language/generateCollationData.php b/maintenance/language/generateCollationData.php
index e34d9a13..12823c0c 100644
--- a/maintenance/language/generateCollationData.php
+++ b/maintenance/language/generateCollationData.php
@@ -30,19 +30,19 @@ require_once( __DIR__ .'/../Maintenance.php' );
*/
class GenerateCollationData extends Maintenance {
/** The directory with source data files in it */
- var $dataDir;
+ public $dataDir;
/** The primary weights, indexed by codepoint */
- var $weights;
+ public $weights;
/**
* A hashtable keyed by codepoint, where presence indicates that a character
* has a decomposition mapping. This makes it non-preferred for group header
* selection.
*/
- var $mappedChars;
+ public $mappedChars;
- var $debugOutFile;
+ public $debugOutFile;
/**
* Important tertiary weights from UTS #10 section 7.2
@@ -61,18 +61,80 @@ class GenerateCollationData extends Maintenance {
public function execute() {
$this->dataDir = $this->getOption( 'data-dir', '.' );
- if ( !file_exists( "{$this->dataDir}/allkeys.txt" ) ) {
- $this->error( "Unable to find allkeys.txt. Please download it from " .
- "http://www.unicode.org/Public/UCA/latest/allkeys.txt and specify " .
- "its location with --data-dir=<DIR>" );
- exit( 1 );
- }
- if ( !file_exists( "{$this->dataDir}/ucd.all.grouped.xml" ) ) {
- $this->error( "Unable to find ucd.all.grouped.xml. Please download it " .
- "from http://www.unicode.org/Public/6.0.0/ucdxml/ucd.all.grouped.zip " .
- "and specify its location with --data-dir=<DIR>" );
+
+ $allkeysPresent = file_exists( "{$this->dataDir}/allkeys.txt" );
+ $ucdallPresent = file_exists( "{$this->dataDir}/ucd.all.grouped.xml" );
+
+ // As of January 2013, these links work for all versions of Unicode
+ // between 5.1 and 6.2, inclusive.
+ $allkeysURL = "http://www.unicode.org/Public/UCA/<Unicode version>/allkeys.txt";
+ $ucdallURL = "http://www.unicode.org/Public/<Unicode version>/ucdxml/ucd.all.grouped.zip";
+
+ if ( !$allkeysPresent || !$ucdallPresent ) {
+ $icuVersion = IcuCollation::getICUVersion();
+ $unicodeVersion = IcuCollation::getUnicodeVersionForICU();
+
+ $error = "";
+
+ if ( !$allkeysPresent ) {
+ $error .= "Unable to find allkeys.txt. "
+ . "Download it and specify its location with --data-dir=<DIR>. "
+ . "\n\n";
+ }
+ if ( !$ucdallPresent ) {
+ $error .= "Unable to find ucd.all.grouped.xml. "
+ . "Download it, unzip, and specify its location with --data-dir=<DIR>. "
+ . "\n\n";
+ }
+
+ $versionKnown = false;
+ if ( !$icuVersion ) {
+ // Unknown version - either very old intl,
+ // or PHP < 5.3.7 which does not expose this information
+ $error .= "As MediaWiki could not determine the version of ICU library used by your PHP's "
+ . "intl extension it can't suggest which file version to download. "
+ . "This can be caused by running a very old version of intl or PHP < 5.3.7. "
+ . "If you are sure everything is all right, find out the ICU version "
+ . "by running phpinfo(), check what is the Unicode version it is using "
+ . "at http://site.icu-project.org/download, then try finding appropriate data file(s) at:";
+ } elseif ( version_compare( $icuVersion, "4.0", "<" ) ) {
+ // Extra old version
+ $error .= "You are using outdated version of ICU ($icuVersion), intended for "
+ . ( $unicodeVersion ? "Unicode $unicodeVersion" : "an unknown version of Unicode" )
+ . "; this file might not be avalaible for it, and it's not supported by MediaWiki. "
+ ." You are on your own; consider upgrading PHP's intl extension or try "
+ . "one of the files available at:";
+ } elseif ( version_compare( $icuVersion, "51.0", ">=" ) ) {
+ // Extra recent version
+ $error .= "You are using ICU $icuVersion, released after this script was last updated. "
+ . "Check what is the Unicode version it is using at http://site.icu-project.org/download . "
+ . "It can't be guaranteed everything will work, but appropriate file(s) should "
+ . "be available at:";
+ } else {
+ // ICU 4.0 to 50.x
+ $versionKnown = true;
+ $error .= "You are using ICU $icuVersion, intended for "
+ . ( $unicodeVersion ? "Unicode $unicodeVersion" : "an unknown version of Unicode" )
+ . ". Appropriate file(s) should be available at:";
+ }
+ $error .= "\n";
+
+ if ( $versionKnown && $unicodeVersion ) {
+ $allkeysURL = str_replace( "<Unicode version>", "$unicodeVersion.0", $allkeysURL );
+ $ucdallURL = str_replace( "<Unicode version>", "$unicodeVersion.0", $ucdallURL );
+ }
+
+ if ( !$allkeysPresent ) {
+ $error .= "* $allkeysURL\n";
+ }
+ if ( !$ucdallPresent ) {
+ $error .= "* $ucdallURL\n";
+ }
+
+ $this->error( $error );
exit( 1 );
}
+
$debugOutFileName = $this->getOption( 'debug-output' );
if ( $debugOutFileName ) {
$this->debugOutFile = fopen( $debugOutFileName, 'w' );
@@ -285,12 +347,12 @@ class GenerateCollationData extends Maintenance {
}
class UcdXmlReader {
- var $fileName;
- var $callback;
- var $groupAttrs;
- var $xml;
- var $blocks = array();
- var $currentBlock;
+ public $fileName;
+ public $callback;
+ public $groupAttrs;
+ public $xml;
+ public $blocks = array();
+ public $currentBlock;
function __construct( $fileName ) {
$this->fileName = $fileName;
diff --git a/maintenance/language/generateNormalizerData.php b/maintenance/language/generateNormalizerData.php
index 54dfa39a..c03162c4 100644
--- a/maintenance/language/generateNormalizerData.php
+++ b/maintenance/language/generateNormalizerData.php
@@ -21,10 +21,10 @@
* @ingroup MaintenanceLanguage
*/
-require_once( __DIR__ . '/../Maintenance.php' );
-
require_once( __DIR__ . '/../../includes/normal/UtfNormalUtil.php' );
+require_once( __DIR__ . '/../Maintenance.php' );
+
/**
* Generates normalizer data files for Arabic and Malayalam.
* For NFC see includes/normal.
@@ -32,7 +32,7 @@ require_once( __DIR__ . '/../../includes/normal/UtfNormalUtil.php' );
* @ingroup MaintenanceLanguage
*/
class GenerateNormalizerData extends Maintenance {
- var $dataFile;
+ public $dataFile;
public function __construct() {
parent::__construct();
diff --git a/maintenance/language/langmemusage.php b/maintenance/language/langmemusage.php
index 2323638e..ad29efb2 100644
--- a/maintenance/language/langmemusage.php
+++ b/maintenance/language/langmemusage.php
@@ -1,7 +1,6 @@
<?php
/**
- * Dumb program that tries to get the memory usage
- * for each language file.
+ * Dumb program that tries to get the memory usage for each language file.
*
* 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
@@ -18,6 +17,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup MaintenanceLanguage
*/
@@ -25,6 +25,11 @@
require_once( __DIR__ . '/../Maintenance.php' );
require_once( __DIR__ . '/languages.inc' );
+/**
+ * Maintenance script that tries to get the memory usage for each language file.
+ *
+ * @ingroup MaintenanceLanguage
+ */
class LangMemUsage extends Maintenance {
public function __construct() {
@@ -41,7 +46,7 @@ class LangMemUsage extends Maintenance {
$memlast = $memstart = memory_get_usage();
$this->output( "Base memory usage: $memstart\n" );
-
+
foreach ( $langtool->getLanguages() as $langcode ) {
Language::factory( $langcode );
$memstep = memory_get_usage();
diff --git a/maintenance/language/languages.inc b/maintenance/language/languages.inc
index b76f921d..dcd9b9b4 100644
--- a/maintenance/language/languages.inc
+++ b/maintenance/language/languages.inc
@@ -508,7 +508,7 @@ class languages {
if ( isset( $messages[$key] ) ) {
- $messages[$key] = implode( $messages[$key],", " );
+ $messages[$key] = implode( $messages[$key], ", " );
}
}
return $messages;
@@ -581,14 +581,14 @@ class languages {
# Check default namespace name
if( isset( $this->mNamespaceNames[$code][NS_PROJECT_TALK] ) ) {
$default = $this->mNamespaceNames[$code][NS_PROJECT_TALK];
- if ( strpos( $default, '$1' ) === FALSE ) {
+ if ( strpos( $default, '$1' ) === false ) {
$namespaces[$default] = 'default';
}
}
# Check namespace aliases
foreach( $this->mNamespaceAliases[$code] as $key => $value ) {
- if ( $value == NS_PROJECT_TALK && strpos( $key, '$1' ) === FALSE ) {
+ if ( $value == NS_PROJECT_TALK && strpos( $key, '$1' ) === false ) {
$namespaces[$key] = '';
}
}
@@ -739,9 +739,8 @@ class extensionLanguages extends languages {
function __construct( MessageGroup $group ) {
$this->mMessageGroup = $group;
- $bools = $this->mMessageGroup->getBools();
- $this->mIgnoredMessages = $bools['ignored'];
- $this->mOptionalMessages = $bools['optional'];
+ $this->mIgnoredMessages = $this->mMessageGroup->getIgnored();
+ $this->mOptionalMessages = $this->mMessageGroup->getOptional();
}
/**
diff --git a/maintenance/language/messageTypes.inc b/maintenance/language/messageTypes.inc
index ce1dbb9b..66cc1dcc 100644
--- a/maintenance/language/messageTypes.inc
+++ b/maintenance/language/messageTypes.inc
@@ -181,6 +181,7 @@ $wgIgnoredMessages = array(
'deadendpages-summary',
'protectedpages-summary',
'disambiguations-summary',
+ 'pageswithprop-summary',
'doubleredirects-summary',
'lonelypages-summary',
'unusedtemplates-summary',
@@ -214,10 +215,11 @@ $wgIgnoredMessages = array(
'1movedto2',
'1movedto2_redir',
'move-redirect-suppressed',
- // 'newuserlog-byemail',
'newuserlog-create-entry',
'newuserlog-create2-entry',
'newuserlog-autocreate-entry',
+ 'rightslogentry',
+ 'rightslogentry-autopromote',
'suppressedarticle',
'deletedarticle',
// 'uploadedimage',
@@ -365,6 +367,7 @@ $wgOptionalMessages = array(
'exif-maxaperturevalue-value',
'exif-subjectnewscode-value',
'booksources-isbn',
+ 'protect-summary-desc',
'sp-contributions-explain',
'sorbs',
'video-dims',
@@ -467,6 +470,7 @@ $wgOptionalMessages = array(
'backlinksubtitle',
'prefs-registration-date-time',
'prefs-memberingroups-type',
+ 'userrights-groupsmember-type',
'shared-repo-name-wikimediacommons',
'usermessage-template',
'filepage.css',
@@ -479,6 +483,8 @@ $wgOptionalMessages = array(
'categoryviewer-pagedlinks',
'undelete-revisionrow',
'pageinfo-redirects-value',
+ 'created', // @deprecated. Remove in MediaWiki 1.23.
+ 'changed', // @deprecated. Remove in MediaWiki 1.23.
);
/** EXIF messages, which may be set as optional in several checks, but are generally mandatory */
diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc
index baa0c96e..c2d5847d 100644
--- a/maintenance/language/messages.inc
+++ b/maintenance/language/messages.inc
@@ -167,6 +167,7 @@ $wgMessageStructure = array(
'newwindow',
'cancel',
'moredotdotdot',
+ 'morenotlisted',
'mypage',
'mytalk',
'anontalk',
@@ -178,7 +179,6 @@ $wgMessageStructure = array(
'qbbrowse',
'qbedit',
'qbpageoptions',
- 'qbpageinfo',
'qbmyoptions',
'qbspecialpages',
'faq',
@@ -204,6 +204,7 @@ $wgMessageStructure = array(
'variants',
),
'miscellaneous2' => array(
+ 'navigation-heading',
'errorpagetitle',
'returnto',
'tagline',
@@ -426,7 +427,8 @@ $wgMessageStructure = array(
),
'login' => array(
'logouttext',
- 'welcomecreation',
+ 'welcomeuser',
+ 'welcomecreation-msg',
'yourname',
'yourpassword',
'yourpasswordagain',
@@ -512,6 +514,7 @@ $wgMessageStructure = array(
'php-mail-error',
'php-mail-error-unknown',
'user-mail-no-addy',
+ 'user-mail-no-body',
),
'resetpass' => array(
'resetpass',
@@ -529,6 +532,7 @@ $wgMessageStructure = array(
'resetpass-submit-cancel',
'resetpass-wrong-oldpass',
'resetpass-temp-password',
+ 'resetpass-abort-generic',
),
'passwordreset' => array(
'passwordreset',
@@ -558,6 +562,7 @@ $wgMessageStructure = array(
'changeemail-oldemail',
'changeemail-newemail',
'changeemail-none',
+ 'changeemail-password',
'changeemail-submit',
'changeemail-cancel',
),
@@ -670,7 +675,6 @@ $wgMessageStructure = array(
'hiddencategories',
'edittools',
'edittools-upload',
- 'nocreatetitle',
'nocreatetext',
'nocreate-loggedin',
'sectioneditnotsupported-title',
@@ -689,6 +693,15 @@ $wgMessageStructure = array(
'addsection-preload',
'addsection-editintro',
'defaultmessagetext',
+ 'content-failed-to-parse',
+ 'invalid-content-data',
+ 'content-not-allowed-here',
+ ),
+ 'contentmodels' => array(
+ 'content-model-wikitext',
+ 'content-model-text',
+ 'content-model-javascript',
+ 'content-model-css',
),
'parserwarnings' => array(
'expensive-parserfunction-warning',
@@ -1079,6 +1092,7 @@ $wgMessageStructure = array(
'saveusergroups',
'userrights-groupsmember',
'userrights-groupsmember-auto',
+ 'userrights-groupsmember-type',
'userrights-groups-help',
'userrights-reason',
'userrights-no-interwiki',
@@ -1177,12 +1191,13 @@ $wgMessageStructure = array(
'right-sendemail',
'right-passwordreset',
),
+ 'newuserlog' => array(
+ 'newuserlogpage',
+ 'newuserlogpagetext',
+ ),
'rightslog' => array(
'rightslog',
'rightslogtext',
- 'rightslogentry',
- 'rightslogentry-autopromote',
- 'rightsnone',
),
'action' => array(
'action-read',
@@ -1387,6 +1402,7 @@ $wgMessageStructure = array(
'backend-fail-notsame',
'backend-fail-invalidpath',
'backend-fail-delete',
+ 'backend-fail-describe',
'backend-fail-alreadyexists',
'backend-fail-store',
'backend-fail-copy',
@@ -1622,6 +1638,14 @@ $wgMessageStructure = array(
'disambiguationspage',
'disambiguations-text',
),
+ 'pageswithprop' => array(
+ 'pageswithprop',
+ 'pageswithprop-summary',
+ 'pageswithprop-legend',
+ 'pageswithprop-text',
+ 'pageswithprop-prop',
+ 'pageswithprop-submit',
+ ),
'doubleredirects' => array(
'doubleredirects',
'doubleredirects-summary',
@@ -1833,10 +1857,6 @@ $wgMessageStructure = array(
'activeusers-submit',
'activeusers-noresult',
),
- 'newuserlog' => array(
- 'newuserlogpage',
- 'newuserlogpagetext',
- ),
'listgrouprights' => array(
'listgrouprights',
'listgrouprights-summary',
@@ -1934,15 +1954,23 @@ $wgMessageStructure = array(
'enotif' => array(
'enotif_mailer',
'enotif_reset',
- 'enotif_newpagetext',
'enotif_impersonal_salutation',
- 'changed',
- 'created',
- 'enotif_subject',
+ 'enotif_subject_deleted',
+ 'enotif_subject_created',
+ 'enotif_subject_moved',
+ 'enotif_subject_restored',
+ 'enotif_subject_changed',
+ 'enotif_body_intro_deleted',
+ 'enotif_body_intro_created',
+ 'enotif_body_intro_moved',
+ 'enotif_body_intro_restored',
+ 'enotif_body_intro_changed',
'enotif_lastvisited',
'enotif_lastdiff',
'enotif_anon_editor',
'enotif_body',
+ 'created',
+ 'changed',
),
'delete' => array(
'deletepage',
@@ -2000,6 +2028,8 @@ $wgMessageStructure = array(
'prot_1movedto2',
'protect-badnamespace-title',
'protect-badnamespace-text',
+ 'protect-norestrictiontypes-text',
+ 'protect-norestrictiontypes-title',
'protect-legend',
'protectcomment',
'protectexpiry',
@@ -2015,6 +2045,7 @@ $wgMessageStructure = array(
'protect-fallback',
'protect-level-autoconfirmed',
'protect-level-sysop',
+ 'protect-summary-desc',
'protect-summary-cascade',
'protect-expiring',
'protect-expiring-local',
@@ -2335,6 +2366,7 @@ $wgMessageStructure = array(
'immobile-target-namespace-iw',
'immobile-source-page',
'immobile-target-page',
+ 'bad-target-model',
'immobile_namespace',
'imagenocrossnamespace',
'nonfile-cannot-move-to-file',
@@ -2436,6 +2468,7 @@ $wgMessageStructure = array(
'import-error-interwiki',
'import-error-special',
'import-error-invalid',
+ 'import-error-unserialize',
'import-options-wrong',
'import-rootpage-invalid',
'import-rootpage-nosubpage',
@@ -2451,7 +2484,6 @@ $wgMessageStructure = array(
'javaccripttest' => array(
'javascripttest',
'javascripttest-backlink',
- 'javascripttest-disabled',
'javascripttest-title',
'javascripttest-pagetext-noframework',
'javascripttest-pagetext-unknownframework',
@@ -2673,11 +2705,13 @@ $wgMessageStructure = array(
'pageinfo-default-sort',
'pageinfo-length',
'pageinfo-article-id',
+ 'pageinfo-language',
'pageinfo-robot-policy',
'pageinfo-robot-index',
'pageinfo-robot-noindex',
'pageinfo-views',
'pageinfo-watchers',
+ 'pageinfo-few-watchers',
'pageinfo-redirects-name',
'pageinfo-redirects-value',
'pageinfo-subpages-name',
@@ -2693,7 +2727,20 @@ $wgMessageStructure = array(
'pageinfo-magic-words',
'pageinfo-hidden-categories',
'pageinfo-templates',
+ 'pageinfo-transclusions',
'pageinfo-footer',
+ 'pageinfo-toolboxlink',
+ 'pageinfo-redirectsto',
+ 'pageinfo-redirectsto-info',
+ 'pageinfo-contentpage',
+ 'pageinfo-contentpage-yes',
+ 'pageinfo-protect-cascading',
+ 'pageinfo-protect-cascading-yes',
+ 'pageinfo-protect-cascading-from',
+ 'pageinfo-category-info',
+ 'pageinfo-category-pages',
+ 'pageinfo-category-subcats',
+ 'pageinfo-category-files'
),
'skin' => array(
'skinname-standard',
@@ -2717,6 +2764,8 @@ $wgMessageStructure = array(
'markedaspatrollederror',
'markedaspatrollederrortext',
'markedaspatrollederror-noautopatrol',
+ 'markedaspatrollednotify',
+ 'markedaspatrollederrornotify',
),
'patrol-log' => array(
'patrol-log-page',
@@ -2748,6 +2797,7 @@ $wgMessageStructure = array(
'file-nohires',
'svg-long-desc',
'svg-long-desc-animated',
+ 'svg-long-error',
'show-big-image',
'show-big-image-preview',
'show-big-image-other',
@@ -2782,7 +2832,10 @@ $wgMessageStructure = array(
'minutes',
'hours',
'days',
+ 'months',
+ 'years',
'ago',
+ 'just-now',
),
'badimagelist' => array(
'bad_image_list',
@@ -3343,6 +3396,7 @@ $wgMessageStructure = array(
'scarytransclusion' => array(
'scarytranscludedisabled',
'scarytranscludefailed',
+ 'scarytranscludefailed-httpstatus',
'scarytranscludetoolong',
),
'deleteconflict' => array(
@@ -3552,6 +3606,7 @@ $wgMessageStructure = array(
'version-license',
'version-poweredby-credits',
'version-poweredby-others',
+ 'version-credits-summary',
'version-license-info',
'version-software',
'version-software-product',
@@ -3690,8 +3745,12 @@ $wgMessageStructure = array(
'logentry-newusers-newusers',
'logentry-newusers-create',
'logentry-newusers-create2',
+ 'logentry-newusers-byemail',
'logentry-newusers-autocreate',
- 'newuserlog-byemail',
+ 'logentry-rights-rights',
+ 'logentry-rights-rights-legacy',
+ 'logentry-rights-autopromote',
+ 'rightsnone',
),
'logging-irc' => array(
'revdelete-logentry',
@@ -3712,7 +3771,6 @@ $wgMessageStructure = array(
'1movedto2',
'1movedto2_redir',
'move-redirect-suppressed',
- // 'newuserlog-byemail',
'newuserlog-create-entry',
'newuserlog-create2-entry',
'newuserlog-autocreate-entry',
@@ -3720,6 +3778,8 @@ $wgMessageStructure = array(
'deletedarticle',
// 'uploadedimage',
// 'overwroteimage',
+ 'rightslogentry',
+ 'rightslogentry-autopromote',
),
'feedback' => array(
'feedback-bugornote',
@@ -3772,6 +3832,7 @@ $wgMessageStructure = array(
'api-error-ok-but-empty',
'api-error-overwrite',
'api-error-stashfailed',
+ 'api-error-publishfailed',
'api-error-timeout',
'api-error-unclassified',
'api-error-unknown-code',
@@ -3792,13 +3853,16 @@ $wgMessageStructure = array(
'duration-centuries',
'duration-millennia'
),
+ 'rotation' => array(
+ 'rotate-comment',
+ ),
);
/** Comments for each block */
$wgBlockComments = array(
'sidebar' => "The sidebar for MonoBook is generated from this message, lines that do not
begin with * or ** are discarded, furthermore lines that do begin with ** and
-do not contain | are also discarded, but do not depend on this behaviour for
+do not contain | are also discarded, but do not depend on this behavior for
future releases. Also note that since each list value is wrapped in a unique
XHTML id it should only appear once and include characters that are legal
XHTML id names.",
@@ -3829,6 +3893,7 @@ XHTML id names.",
'toolbar' => 'Edit page toolbar',
'edit' => 'Edit pages',
'parserwarnings' => 'Parser/template warnings',
+ 'contentmodels' => 'Content models',
'undo' => '"Undo" feature',
'cantcreateaccount' => 'Account creation failure',
'history' => 'History pages',
@@ -3875,6 +3940,7 @@ XHTML id names.",
'randomredirect' => 'Random redirect',
'statistics' => 'Statistics',
'disambiguations' => '',
+ 'pageswithprop' => '',
'doubleredirects' => '',
'brokenredirects' => '',
'withoutinterwiki' => '',
@@ -4031,4 +4097,5 @@ Variants for Chinese language",
'apierrors' => 'API errors',
'duration' => 'Durations',
'cachedspecial' => 'SpecialCachedPage',
+ 'rotation' => 'Image rotation',
);
diff --git a/maintenance/language/validate.php b/maintenance/language/validate.php
index 751e744d..4f00496f 100644
--- a/maintenance/language/validate.php
+++ b/maintenance/language/validate.php
@@ -21,6 +21,10 @@
* @ingroup MaintenanceLanguage
*/
+if ( PHP_SAPI != 'cli' ) {
+ die( "Run me from the command line please.\n" );
+}
+
if ( !isset( $argv[1] ) ) {
print "Usage: php {$argv[0]} <filename>\n";
exit( 1 );
diff --git a/maintenance/language/zhtable/Makefile b/maintenance/language/zhtable/Makefile
new file mode 100644
index 00000000..9d3637fc
--- /dev/null
+++ b/maintenance/language/zhtable/Makefile
@@ -0,0 +1,2 @@
+../../../includes/ZhConversion.php: Makefile.py $(wildcard *.manual)
+ ./Makefile.py
diff --git a/maintenance/language/zhtable/Makefile.py b/maintenance/language/zhtable/Makefile.py
new file mode 100644
index 00000000..7e197945
--- /dev/null
+++ b/maintenance/language/zhtable/Makefile.py
@@ -0,0 +1,391 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# @author Philip
+import tarfile as tf
+import zipfile as zf
+import os, re, shutil, sys, platform
+
+pyversion = platform.python_version()
+islinux = platform.system().lower() == 'linux'
+
+if pyversion[:3] in ['2.6', '2.7']:
+ import urllib as urllib_request
+ import codecs
+ open = codecs.open
+ _unichr = unichr
+ if sys.maxunicode < 0x10000:
+ def unichr(i):
+ if i < 0x10000:
+ return _unichr(i)
+ else:
+ return _unichr( 0xD7C0 + ( i>>10 ) ) + _unichr( 0xDC00 + ( i & 0x3FF ) )
+elif pyversion[:2] == '3.':
+ import urllib.request as urllib_request
+ unichr = chr
+
+def unichr2( *args ):
+ return [unichr( int( i.split('<')[0][2:], 16 ) ) for i in args]
+
+def unichr3( *args ):
+ return [unichr( int( i[2:7], 16 ) ) for i in args if i[2:7]]
+
+# DEFINE
+UNIHAN_VER = '6.2.0'
+SF_MIRROR = 'dfn'
+SCIM_TABLES_VER = '0.5.11'
+SCIM_PINYIN_VER = '0.5.92'
+LIBTABE_VER = '0.2.3'
+# END OF DEFINE
+
+def download( url, dest ):
+ if os.path.isfile( dest ):
+ print( 'File %s is up to date.' % dest )
+ return
+ global islinux
+ if islinux:
+ # we use wget instead urlretrieve under Linux,
+ # because wget could display details like download progress
+ os.system( 'wget %s -O %s' % ( url, dest ) )
+ else:
+ print( 'Downloading from [%s] ...' % url )
+ urllib_request.urlretrieve( url, dest )
+ print( 'Download complete.\n' )
+ return
+
+def uncompress( fp, member, encoding = 'U8' ):
+ name = member.rsplit( '/', 1 )[-1]
+ print( 'Extracting %s ...' % name )
+ fp.extract( member )
+ shutil.move( member, name )
+ if '/' in member:
+ shutil.rmtree( member.split( '/', 1 )[0] )
+ return open( name, 'rb', encoding, 'ignore' )
+
+unzip = lambda path, member, encoding = 'U8': \
+ uncompress( zf.ZipFile( path ), member, encoding )
+
+untargz = lambda path, member, encoding = 'U8': \
+ uncompress( tf.open( path, 'r:gz' ), member, encoding )
+
+def parserCore( fp, pos, beginmark = None, endmark = None ):
+ if beginmark and endmark:
+ start = False
+ else: start = True
+ mlist = set()
+ for line in fp:
+ if beginmark and line.startswith( beginmark ):
+ start = True
+ continue
+ elif endmark and line.startswith( endmark ):
+ break
+ if start and not line.startswith( '#' ):
+ elems = line.split()
+ if len( elems ) < 2:
+ continue
+ elif len( elems[0] ) > 1 and \
+ len( elems[pos] ) > 1: # words only
+ mlist.add( elems[pos] )
+ return mlist
+
+def tablesParser( path, name ):
+ """ Read file from scim-tables and parse it. """
+ global SCIM_TABLES_VER
+ src = 'scim-tables-%s/tables/zh/%s' % ( SCIM_TABLES_VER, name )
+ fp = untargz( path, src, 'U8' )
+ return parserCore( fp, 1, 'BEGIN_TABLE', 'END_TABLE' )
+
+ezbigParser = lambda path: tablesParser( path, 'EZ-Big.txt.in' )
+wubiParser = lambda path: tablesParser( path, 'Wubi.txt.in' )
+zrmParser = lambda path: tablesParser( path, 'Ziranma.txt.in' )
+
+def phraseParser( path ):
+ """ Read phrase_lib.txt and parse it. """
+ global SCIM_PINYIN_VER
+ src = 'scim-pinyin-%s/data/phrase_lib.txt' % SCIM_PINYIN_VER
+ dst = 'phrase_lib.txt'
+ fp = untargz( path, src, 'U8' )
+ return parserCore( fp, 0 )
+
+def tsiParser( path ):
+ """ Read tsi.src and parse it. """
+ src = 'libtabe/tsi-src/tsi.src'
+ dst = 'tsi.src'
+ fp = untargz( path, src, 'big5hkscs' )
+ return parserCore( fp, 0 )
+
+def unihanParser( path ):
+ """ Read Unihan_Variants.txt and parse it. """
+ fp = unzip( path, 'Unihan_Variants.txt', 'U8' )
+ t2s = dict()
+ s2t = dict()
+ for line in fp:
+ if line.startswith( '#' ):
+ continue
+ else:
+ elems = line.split()
+ if len( elems ) < 3:
+ continue
+ type = elems.pop( 1 )
+ elems = unichr2( *elems )
+ if type == 'kTraditionalVariant':
+ s2t[elems[0]] = elems[1:]
+ elif type == 'kSimplifiedVariant':
+ t2s[elems[0]] = elems[1:]
+ fp.close()
+ return ( t2s, s2t )
+
+def applyExcludes( mlist, path ):
+ """ Apply exclude rules from path to mlist. """
+ excludes = open( path, 'rb', 'U8' ).read().split()
+ excludes = [word.split( '#' )[0].strip() for word in excludes]
+ excludes = '|'.join( excludes )
+ excptn = re.compile( '.*(?:%s).*' % excludes )
+ diff = [mword for mword in mlist if excptn.search( mword )]
+ mlist.difference_update( diff )
+ return mlist
+
+def charManualTable( path ):
+ fp = open( path, 'rb', 'U8' )
+ ret = {}
+ for line in fp:
+ elems = line.split( '#' )[0].split( '|' )
+ elems = unichr3( *elems )
+ if len( elems ) > 1:
+ ret[elems[0]] = elems[1:]
+ return ret
+
+def toManyRules( src_table ):
+ tomany = set()
+ for ( f, t ) in src_table.iteritems():
+ for i in range( 1, len( t ) ):
+ tomany.add( t[i] )
+ return tomany
+
+def removeRules( path, table ):
+ fp = open( path, 'rb', 'U8' )
+ texc = list()
+ for line in fp:
+ elems = line.split( '=>' )
+ f = t = elems[0].strip()
+ if len( elems ) == 2:
+ t = elems[1].strip()
+ f = f.strip('"').strip("'")
+ t = t.strip('"').strip("'")
+ if f:
+ try:
+ table.pop( f )
+ except:
+ pass
+ if t:
+ texc.append( t )
+ texcptn = re.compile( '^(?:%s)$' % '|'.join( texc ) )
+ for (tmp_f, tmp_t) in table.copy().iteritems():
+ if texcptn.match( tmp_t ):
+ table.pop( tmp_f )
+ return table
+
+def customRules( path ):
+ fp = open( path, 'rb', 'U8' )
+ ret = dict()
+ for line in fp:
+ elems = line.split( '#' )[0].split()
+ if len( elems ) > 1:
+ ret[elems[0]] = elems[1]
+ return ret
+
+def dictToSortedList( src_table, pos ):
+ return sorted( src_table.items(), key = lambda m: m[pos] )
+
+def translate( text, conv_table ):
+ i = 0
+ while i < len( text ):
+ for j in range( len( text ) - i, 0, -1 ):
+ f = text[i:][:j]
+ t = conv_table.get( f )
+ if t:
+ text = text[:i] + t + text[i:][j:]
+ i += len(t) - 1
+ break
+ i += 1
+ return text
+
+def manualWordsTable( path, conv_table, reconv_table ):
+ fp = open( path, 'rb', 'U8' )
+ reconv_table = {}
+ wordlist = [line.split( '#' )[0].strip() for line in fp]
+ wordlist = list( set( wordlist ) )
+ wordlist.sort( key = len, reverse = True )
+ while wordlist:
+ word = wordlist.pop()
+ new_word = translate( word, conv_table )
+ rcv_word = translate( word, reconv_table )
+ if word != rcv_word:
+ reconv_table[word] = word
+ reconv_table[new_word] = word
+ return reconv_table
+
+def defaultWordsTable( src_wordlist, src_tomany, char_conv_table, char_reconv_table ):
+ wordlist = list( src_wordlist )
+ wordlist.sort( key = len, reverse = True )
+ word_conv_table = {}
+ word_reconv_table = {}
+ conv_table = char_conv_table.copy()
+ reconv_table = char_reconv_table.copy()
+ tomanyptn = re.compile( '(?:%s)' % '|'.join( src_tomany ) )
+ while wordlist:
+ conv_table.update( word_conv_table )
+ reconv_table.update( word_reconv_table )
+ word = wordlist.pop()
+ new_word_len = word_len = len( word )
+ while new_word_len == word_len:
+ add = False
+ test_word = translate( word, reconv_table )
+ new_word = translate( word, conv_table )
+ if not reconv_table.get( new_word ) \
+ and ( test_word != word \
+ or ( tomanyptn.search( word ) \
+ and word != translate( new_word, reconv_table ) ) ):
+ word_conv_table[word] = new_word
+ word_reconv_table[new_word] = word
+ try:
+ word = wordlist.pop()
+ except IndexError:
+ break
+ new_word_len = len(word)
+ return word_reconv_table
+
+def PHPArray( table ):
+ lines = ['\'%s\' => \'%s\',' % (f, t) for (f, t) in table if f and t]
+ return '\n'.join(lines)
+
+def main():
+ #Get Unihan.zip:
+ url = 'http://www.unicode.org/Public/%s/ucd/Unihan.zip' % UNIHAN_VER
+ han_dest = 'Unihan.zip'
+ download( url, han_dest )
+
+ # Get scim-tables-$(SCIM_TABLES_VER).tar.gz:
+ url = 'http://%s.dl.sourceforge.net/sourceforge/scim/scim-tables-%s.tar.gz' % ( SF_MIRROR, SCIM_TABLES_VER )
+ tbe_dest = 'scim-tables-%s.tar.gz' % SCIM_TABLES_VER
+ download( url, tbe_dest )
+
+ # Get scim-pinyin-$(SCIM_PINYIN_VER).tar.gz:
+ url = 'http://%s.dl.sourceforge.net/sourceforge/scim/scim-pinyin-%s.tar.gz' % ( SF_MIRROR, SCIM_PINYIN_VER )
+ pyn_dest = 'scim-pinyin-%s.tar.gz' % SCIM_PINYIN_VER
+ download( url, pyn_dest )
+
+ # Get libtabe-$(LIBTABE_VER).tgz:
+ url = 'http://%s.dl.sourceforge.net/sourceforge/libtabe/libtabe-%s.tgz' % ( SF_MIRROR, LIBTABE_VER )
+ lbt_dest = 'libtabe-%s.tgz' % LIBTABE_VER
+ download( url, lbt_dest )
+
+ # Unihan.txt
+ ( t2s_1tomany, s2t_1tomany ) = unihanParser( han_dest )
+
+ t2s_1tomany.update( charManualTable( 'trad2simp.manual' ) )
+ s2t_1tomany.update( charManualTable( 'simp2trad.manual' ) )
+
+ t2s_1to1 = dict( [( f, t[0] ) for ( f, t ) in t2s_1tomany.iteritems()] )
+ s2t_1to1 = dict( [( f, t[0] ) for ( f, t ) in s2t_1tomany.iteritems()] )
+
+ s_tomany = toManyRules( t2s_1tomany )
+ t_tomany = toManyRules( s2t_1tomany )
+
+ # noconvert rules
+ t2s_1to1 = removeRules( 'trad2simp_noconvert.manual', t2s_1to1 )
+ s2t_1to1 = removeRules( 'simp2trad_noconvert.manual', s2t_1to1 )
+
+ # the supper set for word to word conversion
+ t2s_1to1_supp = t2s_1to1.copy()
+ s2t_1to1_supp = s2t_1to1.copy()
+ t2s_1to1_supp.update( customRules( 'trad2simp_supp_set.manual' ) )
+ s2t_1to1_supp.update( customRules( 'simp2trad_supp_set.manual' ) )
+
+ # word to word manual rules
+ t2s_word2word_manual = manualWordsTable( 'simpphrases.manual', s2t_1to1_supp, t2s_1to1_supp )
+ t2s_word2word_manual.update( customRules( 'toSimp.manual' ) )
+ s2t_word2word_manual = manualWordsTable( 'tradphrases.manual', t2s_1to1_supp, s2t_1to1_supp )
+ s2t_word2word_manual.update( customRules( 'toTrad.manual' ) )
+
+ # word to word rules from input methods
+ t_wordlist = set()
+ s_wordlist = set()
+ t_wordlist.update( ezbigParser( tbe_dest ),
+ tsiParser( lbt_dest ) )
+ s_wordlist.update( wubiParser( tbe_dest ),
+ zrmParser( tbe_dest ),
+ phraseParser( pyn_dest ) )
+
+ # exclude
+ s_wordlist = applyExcludes( s_wordlist, 'simpphrases_exclude.manual' )
+ t_wordlist = applyExcludes( t_wordlist, 'tradphrases_exclude.manual' )
+
+ s2t_supp = s2t_1to1_supp.copy()
+ s2t_supp.update( s2t_word2word_manual )
+ t2s_supp = t2s_1to1_supp.copy()
+ t2s_supp.update( t2s_word2word_manual )
+
+ # parse list to dict
+ t2s_word2word = defaultWordsTable( s_wordlist, s_tomany, s2t_1to1_supp, t2s_supp )
+ t2s_word2word.update( t2s_word2word_manual )
+ s2t_word2word = defaultWordsTable( t_wordlist, t_tomany, t2s_1to1_supp, s2t_supp )
+ s2t_word2word.update( s2t_word2word_manual )
+
+ # Final tables
+ # sorted list toHans
+ t2s_1to1 = dict( [( f, t ) for ( f, t ) in t2s_1to1.iteritems() if f != t] )
+ toHans = dictToSortedList( t2s_1to1, 0 ) + dictToSortedList( t2s_word2word, 1 )
+ # sorted list toHant
+ s2t_1to1 = dict( [( f, t ) for ( f, t ) in s2t_1to1.iteritems() if f != t] )
+ toHant = dictToSortedList( s2t_1to1, 0 ) + dictToSortedList( s2t_word2word, 1 )
+ # sorted list toCN
+ toCN = dictToSortedList( customRules( 'toCN.manual' ), 1 )
+ # sorted list toHK
+ toHK = dictToSortedList( customRules( 'toHK.manual' ), 1 )
+ # sorted list toSG
+ toSG = dictToSortedList( customRules( 'toSG.manual' ), 1 )
+ # sorted list toTW
+ toTW = dictToSortedList( customRules( 'toTW.manual' ), 1 )
+
+ # Get PHP Array
+ php = '''<?php
+/**
+ * Simplified / Traditional Chinese conversion tables
+ *
+ * Automatically generated using code and data in includes/zhtable/
+ * Do not modify directly!
+ *
+ * @file
+ */
+
+$zh2Hant = array(\n'''
+ php += PHPArray( toHant ) \
+ + '\n);\n\n$zh2Hans = array(\n' \
+ + PHPArray( toHans ) \
+ + '\n);\n\n$zh2TW = array(\n' \
+ + PHPArray( toTW ) \
+ + '\n);\n\n$zh2HK = array(\n' \
+ + PHPArray( toHK ) \
+ + '\n);\n\n$zh2CN = array(\n' \
+ + PHPArray( toCN ) \
+ + '\n);\n\n$zh2SG = array(\n' \
+ + PHPArray( toSG ) \
+ + '\n);\n'
+
+ f = open( os.path.join( '..', '..', '..', 'includes', 'ZhConversion.php' ), 'wb', encoding = 'utf8' )
+ print ('Writing ZhConversion.php ... ')
+ f.write( php )
+ f.close()
+
+ # Remove temporary files
+ print ('Deleting temporary files ... ')
+ os.remove('EZ-Big.txt.in')
+ os.remove('phrase_lib.txt')
+ os.remove('tsi.src')
+ os.remove('Unihan_Variants.txt')
+ os.remove('Wubi.txt.in')
+ os.remove('Ziranma.txt.in')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/includes/zhtable/README b/maintenance/language/zhtable/README
index 7e3f87e2..7e3f87e2 100644
--- a/includes/zhtable/README
+++ b/maintenance/language/zhtable/README
diff --git a/includes/zhtable/simp2trad.manual b/maintenance/language/zhtable/simp2trad.manual
index 1b84f8e7..1b84f8e7 100644
--- a/includes/zhtable/simp2trad.manual
+++ b/maintenance/language/zhtable/simp2trad.manual
diff --git a/includes/zhtable/simp2trad_noconvert.manual b/maintenance/language/zhtable/simp2trad_noconvert.manual
index a46560a7..a46560a7 100644
--- a/includes/zhtable/simp2trad_noconvert.manual
+++ b/maintenance/language/zhtable/simp2trad_noconvert.manual
diff --git a/includes/zhtable/simp2trad_supp_set.manual b/maintenance/language/zhtable/simp2trad_supp_set.manual
index a5038a5d..a5038a5d 100644
--- a/includes/zhtable/simp2trad_supp_set.manual
+++ b/maintenance/language/zhtable/simp2trad_supp_set.manual
diff --git a/includes/zhtable/simpphrases.manual b/maintenance/language/zhtable/simpphrases.manual
index d8602fec..d8602fec 100644
--- a/includes/zhtable/simpphrases.manual
+++ b/maintenance/language/zhtable/simpphrases.manual
diff --git a/includes/zhtable/simpphrases_exclude.manual b/maintenance/language/zhtable/simpphrases_exclude.manual
index 3e9d3ecc..3e9d3ecc 100644
--- a/includes/zhtable/simpphrases_exclude.manual
+++ b/maintenance/language/zhtable/simpphrases_exclude.manual
diff --git a/includes/zhtable/toCN.manual b/maintenance/language/zhtable/toCN.manual
index 243f61b0..243f61b0 100644
--- a/includes/zhtable/toCN.manual
+++ b/maintenance/language/zhtable/toCN.manual
diff --git a/includes/zhtable/toHK.manual b/maintenance/language/zhtable/toHK.manual
index 1f7fe7d0..1f7fe7d0 100644
--- a/includes/zhtable/toHK.manual
+++ b/maintenance/language/zhtable/toHK.manual
diff --git a/includes/zhtable/toSG.manual b/maintenance/language/zhtable/toSG.manual
index 2d39aa35..2d39aa35 100644
--- a/includes/zhtable/toSG.manual
+++ b/maintenance/language/zhtable/toSG.manual
diff --git a/maintenance/language/zhtable/toSimp.manual b/maintenance/language/zhtable/toSimp.manual
new file mode 100644
index 00000000..e22447a6
--- /dev/null
+++ b/maintenance/language/zhtable/toSimp.manual
@@ -0,0 +1,166 @@
+乾县 乾县
+è§ä¹¾ è§ä¹¾
+乾断 乾断
+乾图 乾图
+乾纲 乾纲
+乾红 乾红
+乾清宫 乾清宫
+乾仪 乾仪
+乾兴 乾兴
+乾冈 乾冈
+乾刘 乾刘
+乾刚 乾刚
+ä¹¾å¯ ä¹¾å¯
+ä¹¾å® ä¹¾å®
+乾岗 乾岗
+乾录 乾录
+乾晖 乾晖
+乾构 乾构
+乾枢 乾枢
+乾栋 乾栋
+ä¹¾çµ ä¹¾çµ
+乾窦 乾窦
+乾笃 乾笃
+乾纽 乾纽
+乾络 乾络
+乾统 乾统
+乾维 乾维
+乾罗 乾罗
+ä¹¾è« ä¹¾è«
+乾象历 乾象历
+乾贞 乾贞
+乾贶 乾贶
+乾车 乾车
+乾轴 乾轴
+乾鉴 乾鉴
+乾钧 乾钧
+乾闼 乾闼
+乾顾 乾顾
+乾风 乾风
+乾马 乾马
+乾鹄 乾鹄
+乾鹊 乾鹊
+乾龙 乾龙
+张法乾 张法乾
+æ—‹ä¹¾è½¬å¤ æ—‹ä¹¾è½¬å¤
+天é“为乾 天é“为乾
+易ç»Â·ä¹¾ 易ç»Â·ä¹¾
+易ç»ä¹¾ 易ç»ä¹¾
+乾务 乾务
+黄润乾 黄润乾
+男性为乾 男性为乾
+男为乾 男为乾
+阳为乾 阳为乾
+男性为乾 男性为乾
+男性爲乾 男性为乾
+男为乾 男为乾
+男爲乾 男为乾
+阳为乾 阳为乾
+陽爲乾 阳为乾
+乾一组 乾一组
+ä¹¾ä¸€å› ä¹¾ä¸€å›
+陈乾生 陈乾生
+陈公乾生 陈公乾生
+柳诒徵 柳诒徵
+於夫罗 於夫罗
+æ–¼æ¢¨åŽ æ–¼æ¢¨åŽ
+於潜县 於潜县
+於志贺 於志贺
+憑藉 凭借
+藉端 借端
+藉故 借故
+è—‰å£ å€Ÿå£
+藉助 借助
+藉手 借手
+藉詞 借è¯
+藉機 借机
+藉此 借此
+藉由 借由
+藉著 借ç€
+è—‰ç€ å€Ÿç€
+æ²ˆç© æ²‰ç§¯
+沈船 沉船
+沈默 沉默
+沈沒 沉没
+彷彿 仿佛
+é …éŠ é¡¹é“¾
+肘手éŠè¶³ 肘手链足
+éŠå­ 链å­
+éŠæ¢ 链æ¡
+æ‹‰éŠ æ‹‰é“¾
+é‰¸éŠ é“°é“¾
+éŠéŽ– 链é”
+éŽ–éŠ é”链
+éµéŠ é“链
+é‡‘éŠ é‡‘é“¾
+éŠ€éŠ é“¶é“¾
+éŠéŒ˜ 链锤
+æ´—éŠ æ´—ç»ƒ
+石ç¢é•‡ 石ç¢é•‡
+å覆 åå¤
+回覆 回å¤
+答覆 ç­”å¤
+åå覆覆 ååå¤å¤
+é‡è¦† é‡å¤
+覆核 å¤æ ¸
+覆查 å¤æŸ¥
+鬱姓 鬱姓
+é¬±æ° é¬±æ°
+ä¾å„¸ç´€ ä¾ç½—纪
+夥計 伙计
+å³å…¶æ¿¬ å´å…¶æ¿¬
+å´å…¶æ¿¬ å´å…¶æ¿¬
+乾泉水 干泉水
+么åŠç¾¤ 幺åŠç¾¤
+么元 幺元
+么爹 幺爹
+ä¹ˆå” å¹ºå”
+么舅 幺舅
+么爸 幺爸
+么媽 幺妈
+么姨 幺姨
+么娘 幺娘
+么孃 幺娘
+幺孃 幺娘
+么妹 幺妹
+ä¹ˆå° å¹ºå°
+么姓 幺姓
+ä¹ˆæ° å¹ºæ°
+ä¹ˆè›¾å­ å¹ºè›¾å­
+幺厮 幺厮
+çªä¸¸ ç¾ä¸¸
+é™„çª é™„ç¾
+éš±çª éš±ç¾
+麼麼 麽麽
+么麼 幺麽
+么麼å°ä¸‘ 幺麽å°ä¸‘
+么鳳 幺凤
+么二三 幺二三
+么篇 幺篇
+么謙 幺谦
+这么 这么
+麴义 麴义
+乾乾淨淨 干干净净
+乾乾脆脆 干干脆脆
+肉乾乾 肉干干
+魚乾乾 鱼干干
+æ–¼äºŽåŒ æ–¼äºŽåŒ
+æ–¼ä¹™äºŽåŒ æ–¼ä¹™äºŽåŒ
+閻懷禮 闫怀礼
+醯酱 醯酱
+醯鸡 醯鸡
+醯壶 醯壶
+苧烯 苧烯
+æŽä¹¾é¡º æŽä¹¾é¡º
+幹著 å¹²ç€
+氾濫 泛滥
+显著 显著
+顯著 显著
+標誌著 标志ç€
+近角èªä¿¡ 近角èªä¿¡
+ä¿®éŠ ä¿®ç‚¼
+米泽瑠美 米泽瑠美
+太閤 太é˜
+候覆 候å¤
+待覆 å¾…å¤
+批覆 批å¤
diff --git a/includes/zhtable/toTW.manual b/maintenance/language/zhtable/toTW.manual
index 1a14e99a..1a14e99a 100644
--- a/includes/zhtable/toTW.manual
+++ b/maintenance/language/zhtable/toTW.manual
diff --git a/includes/zhtable/toTrad.manual b/maintenance/language/zhtable/toTrad.manual
index b0efd28e..b0efd28e 100644
--- a/includes/zhtable/toTrad.manual
+++ b/maintenance/language/zhtable/toTrad.manual
diff --git a/maintenance/language/zhtable/trad2simp.manual b/maintenance/language/zhtable/trad2simp.manual
new file mode 100644
index 00000000..747a240a
--- /dev/null
+++ b/maintenance/language/zhtable/trad2simp.manual
@@ -0,0 +1,153 @@
+U+04E99亙|U+04E98亘|
+U+04F48佈|U+05E03布|
+U+04F48佈|U+05E03布|
+U+04F54ä½”|U+05360å |
+U+05016倖|U+05E78幸|
+U+050A2傢|U+05BB6家|
+U+050F1僱|U+096C7雇|
+U+05138儸|U+03469㑩|U+07F57罗|
+U+05147兇|U+051F6凶|
+U+05277剷|U+094F2铲|
+U+052F3勳|U+052CB勋|
+U+0537Då½|U+05373å³|
+U+053A4厤|U+05386历|
+U+055ABå–«|U+05403åƒ|
+U+05641å™|U+06076æ¶|
+U+05690åš|U+05C1Då°|
+U+056A5嚥|U+054BD咽|
+U+056AEåš®|U+05411å‘|
+U+056CC囌|U+082CFè‹|
+U+0585A塚|U+051A2冢|
+U+058B0墰|U+0575Bå›|
+U+058DC壜|U+0575Bå›|
+U+05925夥|U+04F19伙|
+U+05BC0寀|U+091C7采|
+U+05D11崑|U+06606昆|
+U+05D19崙|U+04ED1仑|
+U+05D57åµ—|U+05C81å²|
+U+05DBD嶽|U+05CB3岳|
+U+05DD6巖|U+05CA9岩|
+U+05DF9å·¹|U+0537Aåº|
+U+05F14å¼”|U+0540AåŠ|
+U+05F46彆|U+0522B别|
+U+0617C慼|U+0621A戚|
+U+0617E慾|U+06B32欲|
+U+061DE懞|U+08499蒙|
+U+062DA拚|U+062FC拼|
+U+06331挱|U+06332挲|
+U+06371æ±|U+06328挨|
+U+06372æ²|U+05377å·|
+U+0647A摺|U+06298折|
+U+065C2æ—‚|U+065D7æ——|
+U+065E3æ—£|U+065E2æ—¢|
+U+06607昇|U+05347å‡|
+U+0672E朮|U+0672F术|
+U+068CA棊|U+068CB棋|
+U+069A6榦|U+05E72干|
+U+069D3槓|U+06760æ |
+U+06A11樑|U+06881æ¢|
+U+06B05欅|U+06989榉|
+U+06B4Eæ­Ž|U+053F9å¹|
+U+06BAD殭|U+050F5僵|
+U+06C59汙|U+06C61污|
+U+06CDDæ³|U+06EAF溯|
+U+06D29洩|U+06CC4泄|
+U+06DD2淒|U+051C4凄|
+U+06DE8淨|U+051C0净|
+U+06DE9淩|U+051CC凌|
+U+06E67湧|U+06D8C涌|
+U+06ED9滙|U+06C47汇|
+U+06F90æ¾|U+06C84沄|
+U+06FBEæ¾¾|U+03CE0ã³ |
+U+06FDBæ¿›|U+06FDBæ¿›|U+08499è’™|
+U+07030瀰|U+05F25弥|
+U+071EC燬|U+06BC1æ¯|
+U+07232爲|U+04E3A为|
+U+07343çƒ|U+05446呆|
+U+07515甕|U+074EE瓮|
+U+07526甦|U+082CFè‹|
+U+0752F甯|U+05B81å®|
+U+0756B畫|U+0753B画|U+05212划|
+U+07575畵|U+0753B画|U+05212划|
+U+075E0ç— |U+09178é…¸|
+U+07652癒|U+06108愈|
+U+07661癡|U+075F4痴|
+U+076C3盃|U+0676Fæ¯|
+U+0771E眞|U+0771F真|
+U+077AD瞭|U+04E86了|
+U+077C7矇|U+08499蒙|
+U+07843硃|U+06731朱|
+U+07895碕|U+057FC埼|
+U+07958祘|U+07B97算|
+U+07A1C稜|U+068F1棱|
+U+07B87箇|U+04E2A个|
+U+07C11ç°‘|U+084D1è“‘|
+U+07C64籤|U+07B7E签|
+U+07C72ç±²|U+05401å|
+U+07CF0糰|U+056E2团|
+U+07D2E紮|U+0624E扎|
+U+07DAB綫|U+07EBF线|
+U+07DB5綵|U+05F69彩|U+0433D䌽|
+U+07E34縴|U+07EA4纤|
+U+07E50ç¹|U+07A57ç©—|
+U+07E94纔|U+0624Dæ‰|
+U+07F4E罎|U+0575Bå›|
+U+07FA8羨|U+07FA1羡|
+U+08123脣|U+05507唇|
+U+081E5臥|U+05367å§|
+U+08218舘|U+09986馆|
+U+083F4è´|U+05EB5庵|
+U+08457è‘—|U+08457è‘—|U+07740ç€|
+U+08518蔘|U+053C2å‚|
+U+08591薑|U+059DC姜|
+U+085C9藉|U+085C9藉|U+0501F借|
+U+0880Dè |U+0874EèŽ|
+U+0884A衊|U+08511蔑|
+U+088CFè£|U+091CC里|
+U+08946襆|U+05E5E幞|
+U+08986覆|U+08986覆|U+0590Då¤|
+U+08A17託|U+06258托|U+08BAC讬|
+U+08AEEè«®|U+054A8å’¨|U+08C18è°˜|
+U+08B6Dè­­|U+06BC1æ¯|
+U+08B8E讎|U+04EC7仇|
+U+08B9A讚|U+08D5E赞|
+U+08C54豔|U+08273艳|
+U+08FF4迴|U+056DE回|
+U+09031週|U+05468周|
+U+0904AéŠ|U+06E38游|
+U+09061é¡|U+06EAF溯|
+U+091A3醣|U+07CD6糖|
+U+091AF醯|U+09170酰|
+U+0934AéŠ|U+070BC炼|U+094FE链|
+U+0938C鎌|U+09570镰|
+U+093AD鎭|U+093AE镇|
+U+093DAéš|U+0621A戚|
+U+09451鑑|U+09274鉴|
+U+0955Fé•Ÿ|U+065CBæ—‹|
+U+09592é–’|U+095F2é—²|
+U+095A4é–¤|U+05408åˆ|
+U+095E2闢|U+08F9F辟|
+U+0962A阪|U+0962A阪|U+05742å‚|
+U+0965E陞|U+05347å‡|
+U+097A6鞦|U+079CB秋|U+097A7鞧|
+U+097C6韆|U+05343åƒ|
+U+097DDéŸ|U+097B2éž²|
+U+09858願|U+0613F愿|
+U+098F1飱|U+098E7飧|
+U+09918餘|U+04F59余|U+09980馀|
+U+09931餱|U+07CC7糇|
+U+09935餵|U+05582喂|
+U+09B28鬨|U+054C4哄|
+U+09D70鵰|U+096D5雕|U+05F6B彫|
+U+09E7C鹼|U+078B1碱|U+07877硷|
+U+09EAA麪|U+09762é¢|
+U+09EAB麫|U+09762é¢|
+U+09EAF麯|U+066F2曲|
+U+09EB4麴|U+066F2曲|U+09EB4麴|
+U+09EF4黴|U+09709霉|
+U+09F15鼕|U+051AC冬|
+U+09F47齇|U+09F44齄|
+U+09F63齣|U+051FA出|
+U+09F91龑|U+04DAE䶮|
+U+21ED5ð¡»•|U+05C81å²|
+U+298F5𩣵|U+299FB𩧻|
diff --git a/includes/zhtable/trad2simp_noconvert.manual b/maintenance/language/zhtable/trad2simp_noconvert.manual
index 052bab69..052bab69 100644
--- a/includes/zhtable/trad2simp_noconvert.manual
+++ b/maintenance/language/zhtable/trad2simp_noconvert.manual
diff --git a/includes/zhtable/trad2simp_supp_set.manual b/maintenance/language/zhtable/trad2simp_supp_set.manual
index d1728f0a..d1728f0a 100644
--- a/includes/zhtable/trad2simp_supp_set.manual
+++ b/maintenance/language/zhtable/trad2simp_supp_set.manual
diff --git a/maintenance/language/zhtable/tradphrases.manual b/maintenance/language/zhtable/tradphrases.manual
new file mode 100644
index 00000000..e20ca05b
--- /dev/null
+++ b/maintenance/language/zhtable/tradphrases.manual
@@ -0,0 +1,4311 @@
+零隻
+〇隻
+一隻
+二隻
+å…©éš»
+三隻
+四隻
+五隻
+å…­éš»
+七隻
+å…«éš»
+ä¹éš»
+0éš»
+1éš»
+2éš»
+3éš»
+4éš»
+5éš»
+6éš»
+7éš»
+8éš»
+9éš»
+ï¼éš»
+1隻
+ï¼’éš»
+3隻
+4隻
+5隻
+ï¼–éš»
+ï¼—éš»
+8隻
+9隻
+0åªæ”¯æ´
+1åªæ”¯æ´
+2åªæ”¯æ´
+3åªæ”¯æ´
+4åªæ”¯æ´
+5åªæ”¯æ´
+6åªæ”¯æ´
+7åªæ”¯æ´
+8åªæ”¯æ´
+9åªæ”¯æ´
+0åªæ”¯æŒ
+1åªæ”¯æŒ
+2åªæ”¯æŒ
+3åªæ”¯æŒ
+4åªæ”¯æŒ
+5åªæ”¯æŒ
+6åªæ”¯æŒ
+7åªæ”¯æŒ
+8åªæ”¯æŒ
+9åªæ”¯æŒ
+百隻
+åƒéš»
+è¬éš»
+å„„éš»
+最多
+至多
+頂多
+多隻
+0多隻
+ï¼å¤šéš»
+零多隻
+å多隻
+百多隻
+åƒå¤šéš»
+è¬å¤šéš»
+億多隻
+這åªèƒ½
+這åªå¯
+這åªåœ¨
+這åªæ˜¯
+這åªéœ€
+這åªæœƒ
+這åªç”¨
+é‚£åªèƒ½
+é‚£åªå¯
+é‚£åªåœ¨
+é‚£åªæ˜¯
+é‚£åªéœ€
+é‚£åªæœƒ
+é‚£åªç”¨
+多åªèƒ½
+多åªå¯
+多åªåœ¨
+多åªæœ‰
+多åªæ˜¯
+多åªéœ€
+多åªæœƒ
+多åªç”¨
+大åªèƒ½
+大åªå¯
+大åªåœ¨
+大åªæœ‰
+大åªæ˜¯
+大åªéœ€
+大åªæœƒ
+å°åªèƒ½
+å°åªå¯
+å°åªåœ¨
+å°åªæœ‰
+å°åªæ˜¯
+å°åªéœ€
+å°åªæœƒ
+隻身
+形單影隻
+首隻
+數天後
+幾天後
+多天後
+零天後
+一天後
+二天後
+兩天後
+三天後
+四天後
+五天後
+六天後
+七天後
+八天後
+ä¹å¤©å¾Œ
+å天後
+百天後
+åƒå¤©å¾Œ
+è¬å¤©å¾Œ
+億天後
+0天後
+1天後
+2天後
+3天後
+4天後
+5天後
+6天後
+7天後
+8天後
+9天後
+ï¼å¤©å¾Œ
+1天後
+2天後
+3天後
+4天後
+5天後
+6天後
+7天後
+8天後
+9天後
+天後來
+天後天
+天後åŠ
+後å°
+è¬è±¡
+並存著
+乾絲
+乾著急
+乾魚
+é­šä¹¾
+乾梅
+糕乾
+黃乾黑瘦
+馬乾
+香乾
+趲幹
+謀幹
+è©žå¹¹
+蟶乾
+è–„å¹¹
+腦幹
+營幹
+è€ä¹¾
+è€å¹¹éƒ¨
+管幹
+盲幹
+煨乾
+æµ·ä¹¾
+乾漆
+æ·šä¹¾
+æ²’å¹¹
+沒乾沒淨
+æžä¸å¾—大於榦
+æ¯ä¹¾
+打幹
+打乾噦
+å¾å¹¹
+府幹
+乾館
+乾顙
+å¹¹é©å‘½
+ä¹¾éœäº‚
+乾雷
+乾阿奶
+ä¹¾é‡
+乾醋
+乾逼
+乾貨
+乾衣
+幹蠱
+乾虔
+ä¹¾è½
+幹營生
+乾茶錢
+乾茨臘
+乾苔
+乾花
+乾肥
+乾耗
+幹缺
+乾繃
+ä¹¾çµ
+乾餱
+乾篾片
+乾稿
+乾禮
+乾瞪眼
+乾白兒
+乾疥
+乾生å­
+乾生å—
+幹父之蠱
+乾熬
+乾燈盞
+乾濕
+乾澀
+幹濟
+乾沒
+乾死
+ä¹¾æ‘æ²™
+乾暖
+乾料
+乾敲梆å­ä¸è³£æ²¹
+乾支支
+乾支剌
+乾擦
+乾撇下
+乾撂å°
+乾折
+乾急
+幹當
+ä¹¾å¼
+乾屎橛
+幹家
+乾奴æ‰
+幹頭
+乾塢
+乾圓潔淨
+乾回付
+乾啼
+乾哭
+乾噦
+乾咽
+乾和
+å¹¹å
+ä¹¾åŠè‘—下巴
+乾號
+乾颱
+ä¹¾å¦
+ä¹¾å‰å‰
+乾刻版
+乾芻
+幹人
+乾產
+乾喬
+夯幹
+大目乾連
+國之楨榦
+唇乾
+單幹
+勾幹
+豆乾
+果乾
+如果幹
+乾麵
+乾柴
+枯乾
+æ™’ä¹¾
+顛乾倒å¤
+å¼·å¹¹
+乾著
+乾眼
+幹的åœç•¶
+乾巴
+åŽä¹¾
+眼乾
+å·é›žä¸è‘—
+几絲
+划著
+划著走
+別著
+刮著
+åƒçµ²è¬ç¸·
+åƒåˆ
+åƒè€ƒåƒ¹å€¼
+åƒèˆ‡
+åƒèˆ‡äººå“¡
+åƒèˆ‡åˆ¶
+åƒèˆ‡æ„Ÿ
+åƒèˆ‡è€…
+åƒè§€åœ˜
+åƒè§€åœ˜é«”
+åƒé–±
+åƒè‘—ä¸ç›¡
+åˆè‘—
+åŠå¸¶è¤²
+åŠæŽ›è‘—
+åŠè‘—
+åŠè¤²
+åŠè¤²å¸¶
+å‘è‘—
+åš´çµ²åˆç¸«
+回絲
+回著
+å¡—è‘—
+壟斷價格
+壟斷資產
+壟斷集團
+姜絲
+帶團åƒåŠ 
+干著急
+幾絲
+彆著
+怎麼著
+憑藉著
+憑藉
+接著說
+擔著
+擔負著
+敘說著
+斗轉åƒæ©«
+旋繞著
+æ¿è‘—臉
+正當著
+沈著
+æ²–è‘—
+派團åƒåŠ 
+涂著
+湊åˆè‘—
+瀰漫著
+為著
+煙斗絲
+率團åƒåŠ 
+ç•«è‘—
+當著
+發著
+直接åƒä¸Ž
+ç¡è‘—了
+秋褲
+ç©æžåƒä¸Ž
+ç©æžåƒåŠ 
+簽著
+系著
+絕å°åƒç…§
+絲來線去
+絲布
+çµ²æ¿
+絲瓜布
+絲絨布
+絲線
+絲織廠
+絲蟲
+緊繃著
+繃著
+繃著臉
+繃著臉兒
+繫著
+罵著
+肉絲麵
+背å‘è‘—
+èŒçµ²é«”
+è‘—å…’
+著書立說
+著色軟體
+è‘—é‡æŒ‡å‡º
+著錄
+著錄è¦å‰‡
+è–‘çµ²
+藉著
+蘊å«è‘—
+蘊涵著
+è¡è‘—
+被覆著
+覆著
+覆蓋著
+å覆
+訴說著
+說著
+è«‹åƒé–±
+è¬çµ•åƒè§€
+豎著
+è±æ¿±
+è±æ¿±é„‰
+è±åº¦
+象徵著
+這麼著
+那麼著
+é…åˆè‘—
+醞釀著
+錄著
+é›éŠå‡º
+關係著
+雞絲
+雞絲麵
+é¢æœè‘—
+é¢è‡¨è‘—
+颳著
+髮絲
+æ–·é«®
+ä¸æ–·ç™¼
+判斷發
+評斷發
+買斷發
+賣斷發
+打斷發
+披頭散髮
+é«®ç¦
+鬥著
+鬧著玩兒
+鯰魚
+世界盃
+其次辟地
+é–‹é—¢
+闢地
+精闢
+別闢
+å¦é—¢
+闢佛
+闢田
+闢築
+闢謠
+闢辟
+é€é—¢
+墾闢
+ç¿•é—¢
+è»’é—¢
+闢建
+闢室
+å„é—¢
+增闢
+闢邪以律
+錶盤
+錶æ¿
+錶帶
+錶é‡
+錶蒙å­
+袋錶
+腕錶
+碼錶
+錶冠
+魔錶
+彆å£æ°£
+彆強
+皺彆
+一彆頭
+并州
+併兼
+併產
+併骨
+併網
+併線
+ä½µæµ
+逼併
+ä½µå
+併當
+ä½µç«
+併肩å­
+併除
+併疊
+忙併
+打併
+ç°¡ä½µ
+並發表
+並發ç¾
+並發展
+並發動
+並發布
+ç«ä¸¦éž
+舉手表
+æ®æ‰‹è¡¨
+併一ä¸äºŒ
+連三併四
+相併
+撤併
+數罪併罰
+催併
+狂併潮
+è–è””
+æ摩太後書
+當家纔知柴米價
+剛纔一載
+è£æµ·
+骨頭裡掙出來的錢纔åšå¾—肉
+æ°çº”
+é ç¸£çº”至
+別日å—鴻纔北去
+然身死纔數月耳
+纔得兩年
+纔則
+纔此
+你纔å­ç™¼æ˜
+纔å¯å®¹é¡å五餘
+ä¸æŽ¡
+披榛採蘭
+謬採虛è²
+採樵人
+回採
+觀採
+開採
+æªæŽ¡
+樵採
+採訪
+採辦
+採補
+採買
+採風å•ä¿—
+採ç´
+採çµ
+採蓮
+採錄
+採購
+採光
+採礦
+採花
+採集
+採擷
+採掘
+採芹人
+採å–
+採é¸
+採摭
+採摘
+採ç 
+採種
+採茶
+採石
+採拾
+採收
+採生折割
+採樹種
+採擇
+採藥
+採薇
+採用
+盜採
+採信
+採行
+採證
+採èŠ
+åšæŽ¡
+採空採穗
+採挖
+採éµ
+採金
+採氣
+採油
+採煤
+採鹽
+採å€
+採é‹
+採風
+官地為寀
+寮寀
+蔘ç¶
+個人# “個人åƒæ•¸â€ä¸æ˜¯â€œå€‹äººè”˜æ•¸â€
+人蔘
+蕭蔘
+人åƒèˆ‡
+人åƒé¸
+人åƒè§€
+人åƒè€ƒ
+人åƒå±•
+人åƒåŠ 
+人åƒè­°
+人åƒè¬€
+人åƒé…Œ
+人åƒç…§
+人åƒæ”¿
+人åƒæˆ°
+人åƒæ‹œ
+人åƒé–±
+人åƒç¦ª
+人åƒè´Š
+人åƒè¦‹
+人åƒé€
+人åƒçœ‹
+æ±è¡è¥¿çª
+天克地è¡
+å…­è¡
+撞陣è¡è»
+è¡æ³¢
+è¡é¢¨
+è¡é ­é™£
+è¡å …陷陣
+è¡é™·
+è¡å¿ƒ
+è¡å·žæ’žåºœ
+è¡æ®º
+è¡ç„¶
+è¡ç›¹
+å·¦è¡å³çª
+虫部
+手塚治虫
+群醜
+百拙åƒé†œ
+大醜
+地醜德齊
+丟醜
+亮醜
+æ­é†œ
+倛醜
+嫌好é“醜
+醜巴怪
+醜末
+醜婦
+醜地
+醜頭怪臉
+醜女效顰
+醜剌剌
+醜話
+醜媳
+醜å’
+醜è²é æ’­
+醜夷
+弄醜
+露醜
+摧堅ç²é†œ
+謷醜
+ä¸å«Œæ¯é†œ
+一爭兩醜
+惡直醜正
+很醜
+醜男
+醜斃了
+醜奴兒
+醜言
+醜徒
+醜雜
+醜儕
+醜沮
+醜辭
+醜比
+醜辱
+醜逆
+醜å²
+醜賊生
+醜婆å­
+出乖弄醜
+出乖露醜
+ç²åŒªå…¶é†œ
+乙丑
+ä¸ä¸‘
+己丑
+辛丑
+癸丑
+丑時
+丑日
+丑月
+丑年
+文丑
+武丑
+女丑
+å°ä¸‘
+大丑
+丑婆å­
+丑旦
+丑角
+丑三
+丑表功
+公孫丑
+么麼å°ä¸‘
+齣電影
+齣電視
+齣動畫
+齣節目
+é½£å¡é€š
+齣戲
+齣劇
+平平當當
+滿滿當當
+當當ä¸ä¸
+ä¸ä¸ç•¶ç•¶
+åœåœç•¶ç•¶
+快快當當
+咯噹
+啷噹
+å…šåƒ
+党進
+党太尉
+å…šé …
+撲鼕
+æ´—é«®
+牽一髮
+白發其事
+åŽé«®åº§
+åŽé«®æ˜Ÿç³»åœ˜
+åŽé«®FK型星
+波髮藻
+辮髮
+逋髮
+抿髮
+髮漂
+髮匪
+髮腳
+髮癬
+髮釵
+髮飾
+髮紗
+髮上指冠
+髮上沖冠
+髮乳
+髮引åƒéˆž
+髮踴沖冠
+è‘£æ°å°é«®
+胎髮
+禿妃之髮
+æ‰é«®
+綠髮
+括髮
+é«¡é«®
+éµ é«®
+截髮
+解髮佯狂
+淨髮
+秋髮
+噙齒戴髮
+é’山一髮
+晞髮
+ç´°ä¸å®¹é«®
+心細如髮
+ç¥é«®
+擢髮
+é½’é«®
+é½’å±é«®ç§€
+沖冠髮怒
+甩髮
+絲髮
+çµ²æ©é«®æ€¨
+蒜髮
+ç®—é«®
+有髮頭陀寺
+髮箋
+髮屋
+櫛髮工
+鬒髮
+模范棒棒堂
+模范三è»
+模范七棒
+模范14棒
+模范21棒
+é¡ç¯„
+儀範
+典範
+å¤ç¯„
+壼範
+容範
+懿範
+明範
+格範
+模範
+樣範
+æ¯ç¯„
+洪範
+淑範
+éºç¯„
+科範
+立範
+貽範
+é“範
+閨範
+閫範
+雅範
+霽範
+鴻範
+沒樣範
+錢範
+銅範
+金範
+範金
+垂範
+範性形變
+範字
+有事之無範
+置言æˆç¯„
+å¾çˆ²ä¹‹ç¯„我馳驅
+天地為範
+範數
+丰采
+丰標ä¸å‡¡
+丰神
+丰茸
+丰儀
+丰度
+丰情
+丰韵
+å­ä¹‹ä¸°å…®
+艸木丰丰
+張三丰
+復始
+複分æž
+複輔音
+複元音
+複平é¢
+複函數
+複æµ
+å複製
+複å°æ•¸
+顛覆
+答覆
+覆沒
+覆亡
+覆水難收
+翻雲覆雨
+覆雨翻雲
+覆è½
+覆巢之下無完åµ
+覆蓋
+覆命
+天翻地覆
+天覆地載
+撥穀
+æ‰æ“¬ç©€ç›œèŸ²
+ä¸ç©€
+辟穀
+米穀
+ç”°ç©€
+脫穀機
+å¹´ç©€
+礱穀機
+孤寡ä¸ç©€
+穀米
+穀旦
+穀圭
+穀貴餓農
+穀食
+穀日
+館穀
+禾穀
+ç©ç©€
+嘉穀
+嚼穀
+ä¹ç©€
+戩穀
+錢穀
+æ¯ç©€
+æ®–ç©€
+å·ç©€
+曬穀
+臧穀亡羊
+種穀
+颳雪
+刮風下雪倒便宜
+广部
+亂鬨ä¸éŽä¾†
+斗鬨
+亂鬨
+開鬨
+花鬨
+鬨動
+交鬨
+喧鬨
+起鬨
+內鬨
+於後
+猜三划五
+划é¾èˆŸ
+å—è¿´ç·š
+å—è¿´éµè·¯
+北迴線
+北迴éµè·¯
+文匯報
+æ²³æµåŒ¯é›†
+å“å½™
+åšå½™
+æ»™è±
+伙頭
+方几
+ä¼å‡ 
+高几
+雪窗螢几
+燕几
+隱几
+饑饉
+乾薑
+毛薑
+è–‘æ¯
+薑湯
+è–‘æ¡‚
+薑是è€çš„è¾£
+åƒè–‘
+è–‘è€è¾£
+野薑
+咬薑呷醋
+薑蓉
+薑黃
+ç‹è—‰è™Žå¨
+滑藉
+藉寇兵
+藉箸代籌
+藉手
+藉此
+é¾æ²
+æ²èˆŒ
+夸父
+夸克
+夸特
+夸毗
+夸麗
+夸姣
+夸人
+夸容
+大言éžå¤¸
+言大而夸
+ç覺
+æ„›ç
+çºå †
+çºç´²
+çºè‡£
+çºç“¦çµç¹©
+湘çº
+å°çºç¶¬è‹¥
+ç•æ¹˜
+ç•ç„¶
+澤滲ç•è€Œä¸‹é™
+è£å‹¾å¤–連
+è£æ‰‹
+水里鄉
+水里溪
+水里æ¿æ°´æºª
+二里頭
+å¹´æ­·å²
+西歷å²
+國歷å²
+國歷代
+國歷任
+國歷屆
+國歷經
+國歷來
+æ–°æ­·å²
+å¤æ­·å²
+百花曆
+寶曆
+穆罕默德曆
+大明曆
+大曆
+å°æ›†
+太åˆæ›†
+通曆
+曆本
+曆命
+曆紀
+曆始
+曆室
+曆日
+曆尾
+曆元
+律曆志
+官曆
+回曆
+巧曆
+慶曆
+朱ç†å®‰æ›†
+長曆
+è—曆
+四分曆
+三統曆
+é¡æˆ‘略曆
+埃åŠæ›†
+伊斯蘭教曆
+åˆæ›†
+玉曆
+農民曆
+桌曆
+商曆
+周曆
+大è¡æ›†
+皇極曆
+儒略改é©æ›†
+希伯來曆
+格里曆
+格里高利曆
+共和曆
+掛曆
+曆ç„
+天文曆表
+日心曆表
+地心曆表
+復活節曆表
+月çƒæ›†è¡¨
+伊爾汗曆表
+延曆
+共和歷å²
+厤物之æ„
+爰定祥厤
+白黴
+黴黧
+黴黑
+麴黴
+蒙霧露
+懞懞懂懂
+懞直
+è€æ‡ž
+放懞掙
+矇著
+矇èµ
+矇çž
+矇事
+矇頭轉
+矇æ¾é›¨
+è—矇歌兒
+矇著é‹å…’
+朦朧
+濛濛細雨
+濛汜
+冥濛
+溟濛
+淡濛濛
+凌濛åˆ
+涳濛
+ç°æ¿›æ¿›
+æ¾’æ¿›
+瀰山é野
+瀰瀰
+冷麵
+撈麵
+煮麵
+炆麵
+煎麵
+泡麵
+食麵
+公仔麵
+方便麵
+白粉麵
+棒å­éºµ
+麵缸
+麵å¯å…’
+麵碼兒
+麵åŠ
+麵湯
+麵疙瘩
+麵館
+麵漿
+甜水麵
+麵人兒
+麵塑
+æ麵人
+趕麵æ£
+擀麵
+éŽæ°´éºµ
+蕎麥麵
+巧婦åšä¸å¾—無麵餺飥
+削麵
+å°ç±³éºµ
+壯麵
+åƒæ¿åˆ€éºµ
+åƒè¾£éºµ
+扯麵
+æ‹éºµ
+é‡ç¾…麵
+雜麵
+雜åˆéºµå…’
+溲麵
+索麵
+一é‹éºµ
+伊府麵
+藥麵兒
+æ„大利麵
+湯下麵
+茶麵
+麵糰
+冷é¢ç›¸
+糞穢衊é¢
+湟潦生苹
+食野之苹
+苹縈
+é’苹
+é’蘋果
+僕僕
+有僕
+冉有僕
+屢顧爾僕
+僕少
+僕雖罷駑
+僕夫
+僕僮
+僕å
+僕姑
+僕固懷æ©
+僕程
+僕使
+僕憎
+僕æ­
+僕射
+太僕
+僮僕
+金僕姑
+僕婢
+樸實
+樸訥
+樸念ä»
+白樸
+抱素懷樸
+抱朴而長åŸå…®
+樸鄙
+樸馬
+樸父
+樸陋
+樸魯
+樸厚
+樸學
+樸質
+樸拙
+樸é‡
+樸素
+樸樕
+樸野
+å樸
+å¤æ¨¸
+胡樸安
+返樸
+渾樸
+儉樸
+簡樸
+拙樸
+斫雕為樸
+斲雕為樸
+質樸
+誠樸
+純樸
+曾樸
+éƒæ¨¸
+棫樸
+敦樸
+樸éˆ
+樸直
+見素抱樸
+掣籤
+標籤
+書籤
+發籤
+粉籤å­
+路籤
+更籤
+好籤
+ç«ç±¤
+籤å¹
+籤押
+照入籤
+制籤
+抽公籤
+瑤籤
+藥籤
+è¬ç±¤æ’架
+雲笈七籤
+上簽å
+上簽字
+上簽收
+上簽寫
+下簽å
+下簽字
+下簽收
+下簽寫
+犖确
+磽确
+确瘠
+言辯而确
+數與虜确
+關弓與我确
+æ‹šæ¨
+廣æ¨
+齊王æ¨ç‰›
+æ¨å¢®
+æ¨å¯¦
+棄æ¨
+æ¨å®‰å°±å±
+æ–½èˆä¹‹é“
+瀋河
+瀋水
+瀋州
+瀋山線
+瀋å‰ç·š
+墨沈
+瀋海éµè·¯
+é¼ç€‹
+胜肽
+胜éµ
+雙胜類
+兀朮
+白朮
+蒼朮
+赤朮
+朮赤
+髼鬆
+皮鬆
+濛鬆雨
+發鬆
+翻鬆
+浮鬆
+弄鬆
+精鬆
+懈鬆
+鬆蛋
+鬆寬
+鬆氣
+鬆一å£æ°£
+鬆元音
+鬆喉
+囉囉囌囌
+囉囌
+骨罈
+罈騞
+餵驢
+剪牡丹喂牛
+鹹粥
+鹹食
+鹹潟
+鹹嘴淡舌
+鹽打怎麼鹹
+鹹派
+鹹批
+錦綉花園
+籲天
+勃鬱
+怫鬱
+氣鬱
+沉鬱
+神è¼é¬±å£˜
+èºé¬±
+蒼鬱
+漚鬱
+伊鬱
+壹鬱
+悒鬱
+氤鬱
+湮鬱
+陰鬱
+泱鬱
+å±é¬±
+滃鬱
+蓊鬱
+紆鬱
+鬱勃
+鬱陶
+鬱律
+鬱壘
+鬱ç«
+鬱ç©
+鬱金
+鬱江
+鬱血
+鬱蒸
+鬱症
+鬱沉沉
+鬱熱
+鬱塞
+鬱伊
+鬱邑
+鬱挹
+鬱堙ä¸å¶
+鬱泱
+鬱蓊
+鬱紆
+鬱燠
+è‚鬱
+鬱å’
+鬱鬱ä¸å¹³
+鬱鬱ä¸æ¨‚
+鬱鬱寡歡
+鬱鬱蔥蔥
+鬱鬱而終
+愿樸
+愿而æ­
+許愿起經
+北嶽
+嶽麓
+但云
+胡云
+詩云
+注云
+鄭凱云
+云乎
+云然
+云為
+å°æ‘º
+網誌
+標標致致
+澄澹精致
+呆緻緻
+光緻緻
+工緻
+功緻
+ç¸ç·»
+å …ç·»
+ç§æ”¾
+ç§å¸«é“
+ç§å¸«ä¸­
+後庄
+舊庄
+正官庄
+龜山庄
+寶山庄
+冬山庄
+員山庄
+æ¾å±±åº„
+厂部
+閤府
+佈é“
+剪綵
+è¡é‡
+è¡è»Š
+書çƒå­
+相干
+府干é 
+府干涉
+府干政
+府干擾
+府干犯
+府干å¿
+一干人
+未乾
+未干涉
+抹乾
+餅乾
+æ‹­ä¹¾
+擦乾
+晾乾
+烘乾
+肉乾
+èœä¹¾
+è…ä¹¾
+乾脆
+乾淨
+乾燥
+乾旱
+乾涸
+乾洗
+乾女
+乾等
+乾糧
+乾枯
+乾薪
+乾爹
+乾粉
+乾爽
+乾兒
+ä¹¾å­
+乾渴
+乾股
+乾果
+ä¹¾è‰
+ä¹¾èœ
+乾笑
+乾餾
+乾電
+乾飯
+乾冰
+乾嘔
+ä¹¾æ
+乾媽
+乾季
+è‘¡è„ä¹¾
+æå­ä¹¾
+蘿蔔乾
+蘋果乾
+芒果乾
+è è˜¿ä¹¾
+鳳梨乾
+豆è…ä¹¾
+æžœå­ä¹¾
+é¾çœ¼ä¹¾
+乾乾淨淨
+乾柴烈ç«
+乾乾兒的
+æ¡‘ä¹¾
+撈乾
+æ­ä¹¾é‹ª
+æ©ä¹¾
+敢幹
+幹探
+幹事
+幹什麼
+幹細胞
+悶著頭兒幹
+é…水幹管
+ç¹å¹ƒé£„井幹
+站乾岸兒
+秋陰入井幹
+沒梢幹
+楨幹
+據榦而窺井底
+井榦摧敗
+æ°ç‰¹
+æŽé€£æ°
+周æ°å€«
+æ°å€«
+姜文æ°
+稜é¡
+稜角
+稜å°
+稜éŒ
+觚稜
+稜å­
+稜層
+稜柱
+盧稜伽
+波稜èœ
+è ç¨œèœ
+稜縫
+稜等登
+稜稜
+嶒稜
+蹭稜å­
+稜體
+二ä¸ç¨œç™»
+有稜有角
+å¨ç¨œ
+負債çºçº
+å‚·ç—•çºçº
+儒略曆
+伊斯蘭曆
+酒麴
+昇平
+爾冬陞
+澹臺
+拜託
+委託
+輓曲
+敬輓
+万俟
+万旗
+鬚鯨
+鬚鯊
+兇手
+兇徒
+兇案
+兇器
+兇殺
+兇殘
+行兇
+ç·å…‡
+追兇
+真兇
+ç–‘å…‡
+è²·å…‡
+元兇
+å¶éŸ»
+å¶éŸ³
+å¶æ­å¼˜
+å¶ æ­å¼˜
+å¶ã€€æ­å¼˜
+æ–¼1
+æ–¼2
+æ–¼3
+æ–¼4
+æ–¼5
+æ–¼6
+æ–¼7
+æ–¼8
+æ–¼9
+æ–¼0
+於1
+於2
+於3
+於4
+於5
+於6
+於7
+於8
+於9
+æ–¼ï¼
+於一
+於二
+於三
+於四
+於五
+於六
+於七
+於八
+æ–¼ä¹
+æ–¼å
+æ–¼åŠ
+於夫羅
+於梨è¯
+置於
+佈於
+散於
+æ’­æ–¼
+國於
+æ•—æ–¼
+於一役
+畢於
+畢業於
+寒於
+任於
+拘於
+æ’æ–¼
+中於
+於市
+於野
+æ•æ–¼
+è½æ–¼
+短於
+æˆæ–¼
+樊於期
+æ·¡æ–¼
+於陸
+於密
+於盡
+ç¦æ–¼
+格於
+猛於
+施於
+於牆
+於物
+於己
+於你
+於我
+於他
+於她
+於它
+於祂
+拒人於
+æ‹’æ–¼
+æ½°æ–¼
+窮於
+相於
+形於
+åŠæ–¼
+於始
+於終
+詢於
+美於
+醜於
+好於
+åæ–¼
+å¼·æ–¼
+弱於
+差於
+劣於
+於美
+於醜
+於好
+æ–¼å
+於強
+於弱
+於差
+於劣
+於垂
+染指於
+æ–¼ç«
+å­˜å一於åƒç™¾
+存於
+於勤
+隱於
+è—æ–¼
+åš´æ–¼
+寬於
+於幕
+給於
+於穆
+於呼哀哉
+於時
+於該
+å±æ–¼
+æ–¼ä¼
+於何
+於家
+於國
+於潛縣
+於焉
+於徵
+離於
+於畢
+麗於
+下於
+亞於
+åŒæ–¼
+屑於
+絕於
+致於
+於行
+éœæ–¼
+任教於
+教於
+自於
+來於
+附於
+於人
+於世
+阻於
+於民
+於盲
+於色
+囿於
+ç›´æ–¼
+建於
+都於
+於農
+於樂
+æ–¼å‰
+役於
+於心
+於法
+於事
+助於
+害於
+ææ–¼
+益於
+從於
+隨於
+順於
+汲於
+溺於
+è¿·æ–¼
+醉於
+行於
+泥於
+身於
+足於
+溢於
+於衷
+ç•æ–¼
+視於
+è¡·æ–¼
+狃於
+疲於
+通於
+於途
+è€æ–¼
+耿於
+於懷
+æœæ–¼
+臻於
+匿於
+å› æ–¼
+似於
+é·æ–¼
+怒於
+心於
+集於
+容於
+é«’è©ž
+髒心
+æ–°ç´®
+紙紮
+ç´®éµ
+紮寨
+一紮
+å…©ç´®
+三紮
+四紮
+五紮
+å…­ç´®
+七紮
+å…«ç´®
+ä¹ç´®
+åç´®
+百紮
+åƒç´®
+è¬ç´®
+ä½”1
+ä½”2
+ä½”3
+ä½”4
+ä½”5
+ä½”6
+ä½”7
+ä½”8
+ä½”9
+ä½”0
+佔1
+佔2
+佔3
+佔4
+佔5
+佔6
+佔7
+佔8
+佔9
+ä½”ï¼
+佔零
+佔〇
+佔一
+佔二
+佔兩
+佔三
+佔四
+佔五
+佔六
+佔七
+佔八
+ä½”ä¹
+ä½”å
+佔百
+ä½”åƒ
+佔万
+佔億
+佔超éŽ
+ä½”ä¸è¶³
+佔至少
+佔少
+佔至多
+ä½”åŠ
+佔多
+佔大
+ä½”å°
+佔中
+ä½”æ±
+佔西
+ä½”å—
+佔北
+佔平å‡
+佔總
+ç¨ä½”鰲頭
+所佔
+市佔
+佔率
+市佔率
+佔市場
+佔世界
+佔全
+佔國內
+佔美
+ä½”å°
+佔香
+佔澳
+佔加
+佔新
+佔馬
+ä½”å°
+佔英
+佔法
+佔德
+佔葡
+佔俄
+佔蘇
+佔缺
+ä½”A
+ä½”B
+ä½”C
+ä½”D
+ä½”E
+ä½”F
+ä½”G
+ä½”H
+ä½”I
+ä½”J
+ä½”K
+ä½”L
+ä½”M
+ä½”N
+ä½”O
+ä½”P
+ä½”Q
+ä½”R
+ä½”S
+ä½”T
+ä½”U
+ä½”V
+ä½”W
+ä½”X
+ä½”Y
+ä½”Z
+ä½”a
+ä½”b
+ä½”c
+ä½”d
+ä½”e
+ä½”f
+ä½”g
+ä½”h
+ä½”i
+ä½”j
+ä½”k
+ä½”l
+ä½”m
+ä½”n
+ä½”o
+ä½”p
+ä½”q
+ä½”r
+ä½”s
+ä½”t
+ä½”u
+ä½”v
+ä½”w
+ä½”x
+ä½”y
+ä½”z
+佔A
+佔B
+佔C
+佔D
+佔E
+佔F
+佔G
+佔H
+佔I
+佔J
+佔K
+佔L
+佔M
+佔N
+佔O
+佔P
+佔Q
+佔R
+佔S
+佔T
+佔U
+佔V
+佔W
+佔X
+佔Y
+佔Z
+ä½”ï½
+佔b
+佔c
+佔d
+佔e
+佔f
+佔g
+佔h
+佔i
+佔j
+佔k
+佔l
+ä½”ï½
+佔n
+ä½”ï½
+ä½”ï½
+佔q
+佔r
+佔s
+佔t
+佔u
+佔v
+佔w
+佔x
+佔y
+佔z
+ä½”ä¸ä½”
+ä¸ä½”
+佔了
+佔穩
+佔資æº
+佔人便宜
+佔頭
+ä½”é“
+佔屋
+佔網
+佔床
+佔座
+佔分
+佔飯
+佔個ä½
+佔後
+佔著
+佔山
+馬å å±±
+佔比
+ä½”åœè»Š
+佔哺乳
+佔下風
+å°‘ä½”
+多佔
+費佔
+佔查
+佔壓
+佔優
+佔劣
+ç©©ä½”
+佔整體
+佔局部
+日佔
+美佔
+英佔
+å¾·ä½”
+法佔
+ä¿„ä½”
+è‘¡ä½”
+西佔
+奧佔
+æ„ä½”
+義佔
+地佔
+佔場
+佔耕
+ç‹‚ä½”
+徵佔
+圈佔
+已佔
+ä½”å›
+佔主
+佔次
+寡佔
+佔去
+將佔
+å°‡å åœ
+è¦ä½”
+è¦å åœ
+會佔
+會å åœ
+å åœ
+夢有五ä¸å 
+å æœ‰äº”ä¸é©—
+誌異
+ç­‘å‰
+筑後
+ç­‘ç´«
+ç­‘æ³¢
+ç­‘å·ž
+ç­‘è‚¥
+筑西
+筑北
+肥筑方言
+筑邦
+筑陽
+å—ç­‘
+批准的
+核准的
+為準
+準直
+擺é˜
+ç·¨é˜
+碰é˜
+é³´é˜
+晨é˜
+é˜é«”
+飯後é˜
+盜é˜
+一天é˜
+æ’žé˜
+殿é˜è‡ªé³´
+天文é˜
+天文學é˜
+æ´›é˜æ±æ‡‰
+亮é˜
+郘é˜
+æ­Œé˜
+é˜ä¸æ’žä¸é³´
+毀é˜ç‚ºé¸
+æ´ªé˜
+æ“Šé˜
+警世é˜
+ç«Šé˜æŽ©è€³
+ç´é˜
+見é˜ä¸æ‰“
+é‡é˜
+æœé˜
+木é˜
+é˜ä¸æ‰£ä¸é³´
+é˜é³´
+é˜å¡”
+é˜æ¼
+é˜ç´
+é˜ç£¬
+é˜å½¢èŸ²
+é˜ä¹³æ´ž
+é˜ä¹³çŸ³
+é˜åœ¨å¯ºè£¡
+è©©é˜
+懸é˜
+山崩é˜æ‡‰
+åé˜
+宗周é˜
+塞耳盜é˜
+二缶é˜æƒ‘
+å£é˜
+é˜çš„
+çš„é˜
+這é˜
+å©é˜
+音è²å¦‚é˜
+應é˜
+原å­é˜
+泳氣é˜
+é›»å­é˜
+é›»å­é˜éŒ¶
+石英é˜éŒ¶
+石英é˜
+é˜éŒ¶çŽ‹
+é˜å¾‹
+看é˜
+看錶
+看表é¢
+éµé˜
+看下é˜
+看下錶
+瞅下é˜
+瞅下錶
+拿下é˜
+拿下錶
+é˜ä¸æ•²ä¸éŸ¿
+å°æº–é˜
+å°æº–é˜éŒ¶
+å°æº–錶
+é˜éŒ¶å¿«
+é˜å¿«
+錶快
+é˜éŒ¶æ…¢
+é˜æ…¢
+錶慢
+響é˜
+é˜æ•²
+大本é˜æ•²
+大笨é˜æ•²
+世紀é˜éŒ¶
+世紀é˜
+錶王
+é˜çŽ‹
+é˜éŒ¶
+å¤é˜
+å¤é˜éŒ¶
+é˜é¢
+é˜è¡¨é¢
+å—京é˜
+å—京é˜éŒ¶
+造é˜éŒ¶
+造é˜
+ä¹é¾è¡¨è¡Œ
+é˜éŒ¶è¡Œ
+é˜è¡Œ
+錶行
+å°åž‹é˜è¡¨é¢
+å°åž‹é˜é¢
+å°åž‹é˜éŒ¶
+å°åž‹é˜
+中型é˜è¡¨é¢
+中型é˜é¢
+中型é˜éŒ¶
+中型é˜
+大型é˜è¡¨é¢
+大型é˜é¢
+大型é˜éŒ¶
+大型é˜
+é˜åŒ 
+深山何處é˜
+下課é˜
+上課é˜
+è€çˆºé˜
+è¬å¹´æ›†éŒ¶
+個é˜
+個é˜éŒ¶
+喜歡é˜
+喜歡é˜éŒ¶
+喜歡錶
+大é˜
+ä½›é˜
+é˜å£
+é˜è…°
+é˜å£
+é˜èº«
+é˜æ¨¡
+é˜é ‚
+é˜ç´
+é˜åº§
+ä»–é˜
+寺é˜
+座é˜
+盜é˜
+大笨é˜
+大本é˜
+é˜éŒ¶æ­·å²
+錶的歷å²
+é˜éŒ¶çš„æ­·å²
+點多é˜
+點åŠé˜
+分多é˜
+刻多é˜
+分åŠé˜
+刻åŠé˜
+教學é˜
+æ“作é˜
+å—å±æ™šé˜
+敲é˜
+瞧著é˜
+瞧著é˜éŒ¶
+瞧著錶
+警報é˜
+猶如é˜
+猶如é˜éŒ¶
+猶如錶
+舊é˜éŒ¶
+ç¹é˜
+å››é¢é˜
+æ›´é˜
+警示é˜
+é˜å·®
+任何é˜éŒ¶
+任何é˜
+任何錶
+任何表示
+任何表é”
+任何表演
+é¸æ‰‹è¡¨ç¾
+é¸æ‰‹è¡¨é”
+é¸æ‰‹è¡¨ç¤º
+é¸æ‰‹è¡¨æ˜Ž
+é¸æ‰‹è¡¨æ±º
+分å­é˜
+飛行é˜
+é˜ç½©
+主é˜å·®
+花é˜
+磬é˜
+主é˜æ›²ç·š
+é˜é€Ÿ
+ç´…é˜
+å„é¡žé˜
+打著é˜
+é˜æ„
+衛星é˜
+該é˜
+錶轉
+é˜èª¿
+調é˜éŒ¶
+調錶
+原é˜
+é˜éŒ¶é€Ÿ
+件é˜
+é˜ç™¼éŸ³
+逆é˜
+æ‹‚é˜ç„¡è²
+é˜ä¸ç©ºå‰‡å•ž
+看著é˜éŒ¶
+看著é˜
+看著錶
+晚é˜
+潛水é˜éŒ¶
+潛水é˜
+潛水錶
+樂器é˜
+é˜å·¦å³
+埋頭尋é˜éŒ¶
+埋頭尋é˜
+埋頭尋錶
+é˜é™³åˆ—
+é©šé˜
+望著é˜éŒ¶
+望著é˜
+望著錶
+é˜éŒ¶åœ
+é˜åœ
+銫é˜
+數字é˜éŒ¶
+數字é˜
+顯示é˜éŒ¶
+顯示é˜
+顯示錶
+å如é˜
+錶åœ
+西周é˜
+æ±å‘¨é˜
+錶速
+機械é˜éŒ¶
+機械é˜
+機械錶
+之é˜
+é˜å½¢
+架é˜
+é †é˜å‘
+逆é˜å‘
+éºå‚³é˜
+鬧錶
+è¯åš´é˜
+懷é˜
+生物é˜
+é˜éŒ¶çš„
+錶的嘀嗒
+çš„é˜éŒ¶
+嘀嗒的錶
+é˜å¥½
+é˜å¤ª
+é˜ä¸
+é˜æœ‰
+é˜ç›¤
+é˜éŒ¶ç›¤
+é˜æ²’
+é˜è¢«
+制é˜
+布穀鳥é˜
+å’•å’•é˜
+拉克施爾德é˜
+é˜ä¸Š
+é˜ä¸‹
+摸é˜
+舊é˜
+舊錶
+å°é˜
+é˜éŸ¿
+å©é˜
+計時錶
+防水錶
+å°„éµ°
+神鵰
+神雕åƒ
+采石磯
+采石之戰
+采石之役
+èŠé½‹å¿—ç•°
+部è½ç™¼
+角è½ç™¼
+æ‘è½ç™¼
+蛇髮女妖
+畢生發展
+å°è¯ç™¼å‹•
+中美發表
+尸魂界
+樹樑
+屋樑
+樑柱
+柱樑
+下樑
+上æ¢å±±
+昇陽
+僥倖
+å¤éŠ
+秋éŠ
+冬éŠ
+黑奴籲天錄
+æž—éƒæ–¹
+讚歌
+編餘
+餘墨
+唾餘
+餘韻
+歸餘
+公餘
+寬餘
+餘糧
+餘慶
+餘殃
+餘燼
+劫餘
+çµé¤˜
+燼餘
+淨餘
+餕餘
+餘暉
+餘è¼
+羨餘
+餘悸
+心餘
+刑餘
+緒餘
+血餘
+朱慶餘
+諸餘
+餘論
+茶餘
+廚餘
+餘裕
+餘氣
+詩餘
+詞餘
+餘僇
+餘辜
+餘責
+餘罪
+無餘
+耳餘
+餘烈
+餘æ€
+鹽餘
+嬴餘
+è´é¤˜
+王餘魚
+紆餘
+餘波
+餘æ¯
+餘步
+餘妙
+餘音
+餘è²
+餘明
+餘風
+餘黨
+餘毒
+餘桃
+餘桶
+餘利
+餘ç€
+餘è†
+餘光
+餘æ­
+餘竅
+餘缺
+餘暇
+餘閒
+餘羨
+餘響
+餘興
+餘蓄
+餘緒
+餘ç
+餘眾
+餘酲
+餘喘
+餘食
+餘熱
+餘刃
+餘é–
+餘存
+餘業
+餘姚
+餘蔭
+餘映
+餘外
+餘å¨
+餘味
+餘溫
+餘勇
+多餘
+剩餘
+餘生
+餘歡
+有餘
+一餘
+二餘
+兩餘
+三餘
+四餘
+五餘
+六餘
+七餘
+八餘
+ä¹é¤˜
+å餘
+百餘
+åƒé¤˜
+è¬é¤˜
+億餘
+兆餘
+0餘
+1餘
+2餘
+3餘
+4餘
+5餘
+6餘
+7餘
+8餘
+9餘
+ï¼é¤˜
+1餘
+2餘
+3餘
+4餘
+5餘
+6餘
+7餘
+8餘
+9餘
+余姓
+余光生
+余光中
+ä½™æ€æ•
+ä½™å¨å¾·
+ä½™å­æ˜Ž
+余三å‹
+å´‘å±±
+崑曲
+å´‘è…”
+崑調
+崑劇
+崑蘇
+蘇崑
+分布圖
+一干家中
+星期後
+ä¸å‡†ä½ 
+ä¸å‡†æˆ‘
+ä¸å‡†ä»–
+ä¸å‡†å¥¹
+ä¸å‡†å®ƒ
+ä¸å‡†èª°
+ä¸å‡†è¨±
+准ä¸å‡†ä½ 
+准ä¸å‡†æˆ‘
+准ä¸å‡†ä»–
+准ä¸å‡†å¥¹
+准ä¸å‡†å®ƒ
+准ä¸å‡†èª°
+准ä¸å‡†è¨±
+ä¾ä¾ä¸æ¨
+戀戀ä¸æ¨
+窮追ä¸æ¨
+緊追ä¸æ¨
+é¥è€Œä¸æ¨
+稜登
+å‰è¨€ä¸ç­”後語
+繃扒弔拷
+ä¸å¼”
+ä¸é€šå¼”æ…¶
+陪弔
+盆弔
+å±è‚¡å¤§å¼”了心
+撇弔
+憑弔
+門弔兒
+ä¼ç½ªå¼”æ°‘
+打出弔入
+æ—鬼弔白
+弔膀å­
+弔民
+弔民ä¼ç½ª
+弔奠
+弔頭
+å¼”å¤
+å¼”å¤å°‹å¹½
+弔詭
+弔詭矜奇
+弔客
+弔拷
+弔拷繃扒
+弔扣
+弔賀迎é€
+弔鶴
+弔喉
+弔謊
+弔祭
+弔腳兒事
+弔頸
+弔橋
+å¼”å–
+å¼”å­
+弔紙
+弔者大悅
+弔場
+弔書
+弔詞
+弔死å•å­¤
+弔死å•ç–¾
+弔撒
+弔喪
+弔喪å•ç–¾
+弔腰撒跨
+å¼”å”
+弔宴
+弔喭
+弔影
+弔慰
+弔文
+å¼”å•
+頭巾弔在水裡
+æ心弔膽
+弄鬼弔猴
+管人弔腳兒事
+é–‹å¼”
+鶴弔
+昊天ä¸å¼”
+花馬弔嘴
+會弔
+å‰å‡¶æ…¶å¼”
+蟣è¨ç›¸å¼”
+祭弔
+祭弔文
+é’蠅弔客
+慶弔
+形影相弔
+哀弔
+一弔
+å”å¼”
+於水
+安於
+è¿«æ–¼
+ç½·æ–¼
+蹪於
+æ–¼æ•
+æ–¼éŽ
+甚於
+等於
+定於
+利於
+å°æ–¼
+推舟於陸
+退è—於密
+歸於
+難於
+移ç¦æ–¼
+生於
+ç«‹æ–¼
+多於
+å‹æ–¼
+傳於
+æµæ–¼
+éŽæ–¼
+關於
+毀於
+基於
+急於
+å«ç¦æ–¼
+借è½æ–¼è¾
+見於
+é‘’æ–¼
+謹於心
+求é“於盲
+始於
+æ–¼è—
+出於
+輕於
+行百里者åŠæ–¼ä¹å
+幸於
+怠於
+詢於芻蕘
+止於
+至於
+拙於
+å¿ æ–¼
+終於
+é‡æ–¼
+åž‚æ–¼
+å–„æ–¼
+死於
+屬於
+浮於
+在於
+åŽè–ªæ–¼ç«
+易於
+精於
+由於
+於此
+燕巢於幕
+æ–¼èŸ
+於乎
+於戲
+於邑
+補於
+ä½æ–¼
+於今
+於是
+於是乎
+於斯
+寓於
+月離於畢
+月麗於箕
+æºæ–¼
+且於
+é•·æ–¼
+短於
+ç¾æ–¼
+較於
+於之
+分布於
+分散於
+優於
+æ—©æ–¼
+晚於
+æ„Ÿæ–¼
+鬼谷å­
+于美人
+ç·Šç·»
+冗餘
+曰云
+若干
+徵婚
+鬥鬨
+事有鬥巧
+歹鬥
+鬥茶
+鬥鴨
+爭奇鬥å¦
+誇能鬥智
+春香鬥學
+鬥引
+鬥彩
+鬥武
+鬥悶
+鬥牙拌齒
+鬥幌å­
+鬥腳
+雞åµéµé¬¥
+辯鬥
+å»é¬¥
+誇多鬥é¡
+臨潼鬥寶
+鬥趣
+撩鬥
+傲霜鬥雪
+賭鬥
+æ¬é¬¥
+鬥爭鬥åˆ
+鬥疊
+鬥文
+è€é¬¥
+鬥巧
+油鬥
+蚊動牛鬥
+åµèˆ‡çŸ³é¬¥
+挑鬥
+爭奇鬥異
+鬥葉å­
+鬥分å­
+爭å¦é¬¥å¥‡
+ä¸é¬¥
+鬥心眼
+鬥頭
+挌鬥
+好鬥
+鬥åˆ
+拚鬥
+兩虎共鬥
+兩鼠鬥穴
+鬥犀臺
+鬥牙鬥齒
+惡鬥
+鬥å‹
+鬥富
+鬥艦
+鬥葉兒
+鬥彆氣
+鬥話
+鬥牌
+鬥百è‰
+鬥打
+鬥犬
+鬥風
+鬥雪紅
+鬥暴
+鬥閑氣
+é¾é¬¥è™Žå‚·
+殷師牛鬥
+二虎相鬥
+鬥力
+爭紅鬥紫
+鬥麗
+鬥狠
+鬥飣
+虎鬥
+引鬥
+爭å¦é¬¥è±”
+轉鬥åƒé‡Œ
+鬥而鑄兵
+困鬥
+好勇鬥狠
+爭奇鬥豔
+使其鬥
+鬥地主
+石樑
+木樑
+è—æ­·å²
+é é¢
+æ–¹é¢
+表é¢
+é¢æ¢ç›®
+課餘
+節餘
+盈餘
+病餘
+餘地
+餘力
+餘å­
+餘事
+扶餘國
+è…餘
+富餘
+之餘
+餘澤
+æµé¢¨é¤˜ä¿—
+æµé¢¨é¤˜éŸ»
+淋餘土
+餘一
+餘二
+餘三
+餘四
+餘五
+餘六
+餘七
+餘八
+餘ä¹
+餘å
+零餘
+〇餘
+餘零
+餘〇
+餘1
+餘2
+餘3
+餘4
+餘5
+餘6
+餘7
+餘8
+餘9
+餘0
+餘1
+餘2
+餘3
+餘4
+餘5
+餘6
+餘7
+餘8
+餘9
+餘ï¼
+餘數
+其餘
+尸居餘氣
+賸餘
+餘孽
+殘餘
+業餘
+餘割
+餘款
+餘角
+餘切
+餘霞
+餘下
+餘弦
+餘震
+餘貾
+餘é¡
+禹餘糧
+餘人
+編余
+ç—…ä½™
+餘俗
+餘å€
+åŒé¤˜
+大讚
+唄讚
+褒讚
+謬讚
+誄讚
+ç¥è®š
+詩讚
+賞讚
+讚唄
+飛紮
+紮裹
+紮腳
+ç´®è©
+紮囮
+ä½ç´®
+佔畢
+佔頭籌
+佔高æžå…’
+隱佔
+憑摺
+沒摺至
+大摺兒
+大週摺
+ç«æ‘ºå­
+è£æ‘º
+變徵
+談徵
+ç´å¾µ
+æµå¾µ
+柳詒徵
+固徵
+è²´å¾µ
+考徵
+å’Žå¾µ
+æžå®‹ç„¡å¾µ
+休徵
+徵辟
+å¾µå責實
+徵發
+徵風å¬é›¨
+徵答
+徵啟
+å¾µé¸
+徵招
+徵士
+徵庸
+之徵
+ç‘žå¾µ
+三徵七辟
+é¡å¾µ
+有徵
+有å¾æœ
+有å¾æˆ°
+有å¾ä¼
+有å¾è¨Ž
+ç„¡å¾µä¸ä¿¡
+文徵明
+徵跡
+徵車
+徵效
+徵怪
+å¾µè–
+徵咎
+å¾µå
+徵令
+本徵
+船é˜
+黃鈺筑
+齊莊
+鴻案相莊
+項莊
+韋莊
+é‹èŽŠ
+鄭莊公
+通莊
+蒙莊
+端莊
+票莊
+矜莊
+楚莊å•é¼Ž
+楚莊絕纓
+整莊
+打路莊æ¿
+莊騷
+莊語
+莊舄越åŸ
+莊房
+莊客
+莊農
+平泉莊
+布莊
+香山庄
+寶莊
+å莊
+周莊王
+發莊
+åžèŽŠ
+包莊
+剔莊貨
+劉克莊
+冷莊å­
+石家莊
+åžèŽŠå­
+新莊市
+當準
+憑準
+沒準
+蜂準
+推情準ç†
+寇準
+åˆæº–
+準ä¿
+準譜
+準分å­
+準點
+一個準
+準擬
+準貨幣
+準è»äº‹
+準å¼
+èªæº–
+三準
+éµæº–
+有準
+å´‘å´™
+鎌倉
+è«‹å›å…¥ç”•
+甕安
+ç—Šç™’
+治癒
+ç—…ç™’
+大病åˆç™’
+ç™’åˆ
+槓桿
+宣洩
+圖鑑
+諮詢
+勳章
+張勳
+趙治勳
+æ®­å±
+有栖å·
+兇惡
+兇狠
+兇猛
+兇橫
+å…‡æ‚
+兇險
+兇相
+兇犯
+嫌兇
+兇嫌
+兇疑
+兇刀
+å…‡æ§
+很兇
+兇巴巴
+行兇å‰
+å‡éŠ
+éŠè²§
+éŠåº¦
+éŠå½¢
+éŠå¸«
+éŠçŸ³
+éŠå­—
+éŠå†¶
+ç´°éŠ
+陳éŠ
+é—–éŠ
+éŠæ±ž
+æ·¬éŠ
+鋼之éŠé‡‘術師
+索馬里
+范登堡
+世田谷
+製漿
+三統歷å²
+伊斯蘭教歷å²
+伊斯蘭歷å²
+儒略改é©æ­·å²
+儒略歷å²
+公歷å²
+å°æ­·å²
+åˆæ­·å²
+周歷å²
+商歷å²
+四分歷å²
+回歷å²
+埃åŠæ­·å²
+大明歷å²
+大歷å²
+大è¡æ­·å²
+太åˆæ­·å²
+官歷å²
+寶歷å²
+巧歷å²
+希伯來歷å²
+弘歷å²
+慶歷å²
+日歷å²
+星歷å²
+月歷å²
+朱ç†å®‰æ­·å²
+桌歷å²
+永歷å²
+玉歷å²
+百花歷å²
+皇歷å²
+皇極歷å²
+穆罕默德歷å²
+ç®—æ­·å²
+紀歷å²
+舊歷å²
+航海歷å²
+è¬æ­·å²
+行事歷å²
+農歷å²
+農民歷å²
+通歷å²
+é•·æ­·å²
+é™°æ­·å²
+陽歷å²
+é¡æˆ‘略歷å²
+黃歷å²
+天曆
+天歷å²
+美醜
+ç»é†œ
+出醜
+家醜
+é®é†œ
+醜八怪
+醜å
+醜詆
+醜態
+醜女
+醜類
+醜陋
+醜虜
+醜化
+醜劇
+醜媳婦
+醜å°é´¨
+醜行
+醜事
+醜è²
+醜人
+醜惡
+醜丫頭
+醜èž
+醜語
+æ¯é†œ
+一齣å­
+齣兒
+è³£çƒ
+發çƒ
+大çƒ
+çƒçƒ
+çƒç­‰
+çƒé ­
+çƒè…¦
+çƒæ ¹
+çƒç£•
+çƒæ†¨çƒ
+çƒè©±
+çƒæ°£
+çƒæƒ³
+çƒæ€§
+çƒæ»¯
+çƒè‘—
+çƒç—´
+çƒä¸²äº†çš®
+çƒäº‹
+çƒäºº
+çƒå­
+好çƒ
+å ä¾¿å®œçš„是çƒ
+阿çƒ
+丰標
+丰姿
+丰韻
+éµ°ç¿Ž
+鵰心é›çˆª
+鵰鶚
+雙鵰
+撲鼕鼕
+普鼕鼕
+鼕鼕鼓
+令人髮指
+爆發指數
+開發
+剪其髮
+å哺æ‰é«®
+å哺æ¡é«®
+å«é½’戴髮
+大金髮苔
+寸髮åƒé‡‘
+心長髮短
+戴髮å«é½’
+拔髮
+拔鬚
+æªé«®
+æªé¬š
+整髮用å“
+斷髮文身
+滿頭洋髮
+燙一個髮
+燙一次髮
+燙個髮
+燙完髮
+燙次髮
+ç†ä¸€å€‹é«®
+ç†ä¸€æ¬¡é«®
+ç†å€‹é«®
+ç†å®Œé«®
+ç†æ¬¡é«®
+細如髮
+繫於一髮
+膚髮
+皮膚
+生è¯é«®
+蒼髮
+被髮佯狂
+被髮入山
+被髮左衽
+被髮纓冠
+被髮陽狂
+身體髮膚
+é«’é«®
+髮光å¯é‘‘
+髮已霜白
+髮油
+髮為血之本
+髮網
+髮踊沖冠
+髮際
+黃髮
+é½’è½é«®ç™½
+剷頭
+剷刈
+å£ç‡¥å”‡ä¹¾
+舌乾唇焦
+花è´è©žé¸
+渾箇
+箇中原因
+箇中ç†ç”±
+箇中高手
+箇中好手
+箇中強手
+箇中滋味
+箇中奧秘
+箇中奧妙
+箇中玄機
+箇中消æ¯
+箇中資訊
+箇中訊æ¯
+å°è¡¨é”
+å°è¡¨ç¾
+å°è¡¨æ¼”
+å°è¡¨æš
+å°è¡¨ä¸­
+å°è¡¨æ˜Ž
+ä¸æº–確
+並ä¸æº–確
+一伙頭
+一伙食
+一åŠåª
+一干弟兄
+一干弟å­
+一干部下
+一斗斗
+一é¢é£Ÿ
+è¬ä¸€åª
+上é¢ç³Š
+ä¸å…‹è‡ªåˆ¶
+ä¸å‡†æ²’
+ä¸åŠ è‡ªåˆ¶
+ä¸å å‡¶å‰
+ä¸å åœ
+ä¸å å‰å‡¶
+ä¸å ç®—
+ä¸å¥½å¹²æ¶‰
+ä¸å¥½å¹²é 
+ä¸å¹²é 
+ä¸å¹²æ¶‰
+ä¸å¹²ä¼‘
+ä¸å¹²çŠ¯
+ä¸å¹²æ“¾
+ä¸å¹²ä½ 
+ä¸å¹²æˆ‘
+ä¸å¹²ä»–
+ä¸å¹²å¥¹
+ä¸å¹²å®ƒ
+ä¸å¹²äº‹
+ä¸æ–—膽
+ä¸æ¯åª
+ä¸é‡‡è²
+å°ˆå‘å¾€
+丰容
+之一åª
+之二åª
+之八ä¹åª
+也斗了膽
+事情干脆
+事都干脆
+二åªå¾—
+亦云
+人云
+以自制
+們斗了膽
+你斗了膽
+其一åª
+其二åª
+其八ä¹åª
+å…§é¢åŒ…
+å…§é¢åŒ…çš„
+准ä¿è­·
+准ä¿é‡‹
+几上
+几淨窗明
+几凳
+几å­
+几æ—
+几椅
+几榻
+几é¢ä¸Š
+出å¾æ”¶
+擊扑
+划一槳
+划了一會
+划到岸
+划到江心
+å‰é¢åº—
+åƒåªå¯
+åƒåªå¤ 
+åƒåªæ€•
+åƒåªèƒ½
+åƒåªè¶³å¤ 
+åŠåªå¯
+åŠåªå¤ 
+å äº†åœ
+å£å¹²å†’
+å£å¹²æ”¿
+å£å¹²æ¶‰
+å£å¹²çŠ¯
+å£å¹²é 
+å¤æ›¸äº‘
+å¤èªžäº‘
+åªå åœ
+åªå å‰
+åªå ç¥žå•åœ
+åªå ç®—
+åªèº«ä¸Šå·²
+åªèº«ä¸Šç„¡
+åªèº«ä¸Šæœ‰
+åªèº«ä¸Šæ²’
+åªèº«ä¸Šçš„
+åªèº«ä¸–
+åªèº«ç‚º
+åªèº«ä»½
+åªèº«é«”
+åªèº«å‰
+åªèº«å—
+åªèº«å¾Œ
+åªèº«å­
+åªèº«å½¢
+åªèº«å½±
+åªèº«å¿ƒ
+åªèº«æ—
+åªèº«æ
+åªèº«æ®µ
+åªèº«é‚Š
+åªèº«é¦–
+åªèº«é«˜
+åªé‡‡è²
+å¯è‡ªåˆ¶
+å°å­å¥³
+å°å­å­«
+å°å¸ƒæ™¯
+å°é¢å‰
+åˆåºœä¸Š
+後é¢åº—
+å‘往常
+å‘往日
+å‘往時
+å‘往來
+唯一åª
+喂了一è²
+å–œå‘å¾€
+四出徵收
+å››é¢åŒ…
+多åŠåª
+好斗大
+好斗室
+好斗笠
+好斗篷
+好斗膽
+好斗蓬
+家具體
+家具備
+家具有
+å°å‡ 
+尸利
+尸祿
+尸臣
+尸鳩
+å·²å åœ
+å·²å ç®—
+并迭
+所云
+所云云
+所å åœ
+所å æ˜Ÿ
+所å ç®—
+手表決
+手表態
+手表明
+手表演
+手表ç¾
+手表示
+手表é”
+手表露
+手表é¢
+æ‰å¹²ä¼‘
+æ‰å¹²æˆˆ
+æ‰å¹²æ“¾
+æ‰å¹²æ”¿
+æ‰å¹²æ¶‰
+æ‰å¹²é 
+扎好底å­
+扎好根
+扑撻
+打å¨
+折å‘å¾€
+拉é¢ä¸Š
+拉é¢å…·
+拉é¢å‰
+拉é¢å·¾
+拉é¢ç„¡
+拉é¢çš®
+拉é¢ç½©
+拉é¢è‰²
+拉é¢éƒ¨
+æ‰å¥¸é»¨
+æ‰å¥¸å¾’
+æ‰å¥¸ç´°
+æ‰å¥¸è³Š
+敢情欲
+敢斗了膽
+敲扑
+æ–¹å‘å¾€
+望了望
+桌几
+æ¯æ¯åª
+法自制
+洒滌
+æ´’æ·…
+洒濯
+洒然
+ç˜æ¶‚
+特制ä½
+特制定
+特制止
+特制訂
+百åªå¯
+百åªå¤ 
+百åªæ€•
+百åªè¶³å¤ 
+皮制æœ
+相克制
+相克æœ
+短几
+石几
+秒表明
+秒表示
+窗明几亮
+竹几
+精制ä¼
+精制ä½
+精制æœ
+經有云
+給我干脆
+編制法
+能干休
+能干戈
+能干擾
+能干政
+能干涉
+能干é 
+能自制
+自制一下
+自制下來
+自制ä¸
+自制之力
+自制之能
+自制他
+自制ä¼
+自制你
+自制地
+自制她
+自制情
+自制我
+自制æœ
+自制的能
+自制能力
+船åªå¾—
+船åªæœ‰
+船åªèƒ½
+è‰è
+èå±…
+è臻
+è饑
+è¦è‡ªåˆ¶
+語有云
+跌扑
+轉å‘å¾€
+酒帘
+裡é¢åŒ…
+金表態
+金表情
+金表æš
+金表明
+金表演
+金表ç¾
+金表示
+金表é”
+金表露
+金表é¢
+長几
+隆准許
+雄斗斗
+é¢åŒ…ä½
+é¢åŒ…辦
+é¢åŒ…廂
+é¢åŒ…å«
+é¢åŒ…åœ
+é¢åŒ…容
+é¢åŒ…庇
+é¢åŒ…ç´®
+é¢åŒ…抄
+é¢åŒ…括
+é¢åŒ…攬
+é¢åŒ…涵
+é¢åŒ…管
+é¢åŒ…ç¾…
+é¢åŒ…è‘—
+é¢åŒ…è—
+é¢åŒ…è£
+é¢åŒ…裹
+é¢åŒ…èµ·
+é¢åº—舖
+é¢ç²‰ç¢Ž
+é¢ç²‰ç´…
+é¢é£Ÿéºµ
+é¢é£Ÿé£¯
+顛顛仆仆
+高干擾
+高干é 
+高度自制
+黃金表
+天åŽå®®
+一åŠéŒ¢
+ä¸é£Ÿä¹¾è…Š
+傳ä½äºŽå››å¤ªå­
+儉确之教
+党懷英
+八蜡
+憑几
+å—宮适
+大蜡
+å­äº‘
+分å­é›²
+å°ä»·
+æ­²è¿äº‘æš®
+崖广
+æ•ä¹ä»·å‚¬
+悲筑
+折å­æˆ²
+æ®æ†
+æ¤è‚®æ‹ŠèƒŒ
+文采éƒéƒ
+木æ†
+洪适
+çƒæ†
+腊之以為餌
+腊毒
+蜡月
+蜡祭
+言云
+宜云
+è²´ä»·
+éƒéƒè²è²
+馬æ†
+造麯
+麴生
+麴秀æ‰
+麴塵
+麴櫱
+大麴
+黃麴毒素
+酒醴麴櫱
+麴é“士
+麴錢
+麴車
+麴院
+鼠麴è‰
+ä¸ä¹¾ä¸æ·¨
+生發生
+å¿…é ˆ
+須根據
+·范
+ã€å‰‹åˆ¶
+,剋制
+。剋制
+ï¼å‰‹åˆ¶
+?剋制
+;剋制
+:剋制
+ä¸å‰‹åˆ¶
+也剋制
+了剋制
+他剋制
+們剋制
+剋制ä¸äº†
+剋制ä¸ä½
+力剋制
+力求剋制
+å¯ä»¥å‰‹åˆ¶
+和剋制
+在剋制
+地剋制
+夠剋制
+她剋制
+你剋制
+您剋制
+就剋制
+彼此剋制
+得剋制
+快剋制
+想剋制
+æ„剋制
+應剋制
+我剋制
+æ‰å‰‹åˆ¶
+於剋制
+易剋制
+無法剋制
+的剋制
+盡é‡å‰‹åˆ¶
+而剋制
+能剋制
+與剋制
+著剋制
+è¦å‰‹åˆ¶
+è»éšŠå‰‹åˆ¶
+空投佈雷
+ç«ç®­ä½ˆé›·
+æµ·ç£ä½ˆé›·
+空中佈雷
+海上佈雷
+佈雷的
+佈雷,
+佈雷ã€
+佈雷。
+佈雷;
+佈雷艦
+佈雷艇
+佈雷速度
+佈雷å°éŽ–
+滿拚自盡
+拚生盡死
+æ‹šå»
+æ‹šè€å‘½
+拚絕
+æˆæ–¼æ€
+單單於
+ç©æ¾±
+æ¾±ç©
+澱北片
+澱解物
+澱謂之滓
+淺澱
+堙澱
+茂都澱
+並曰入澱
+澱乃ä¸è€•ä¹‹åœ°
+è—æ¾±
+皆å¯ä½œæ¾±
+澱山
+海淀山後
+澱澱
+掛鈎
+è–´æ‚´
+絡腮é¬
+è½è…®é¬
+山羊é¬
+幸é‹é¬
+刮é¬
+剃é¬
+å¹é¬
+è“„é¬
+白é¬
+é•·é¬
+é¬é«¯
+髯é¬
+é«­é¬
+鬚é¬
+范文瀾
+范文åŒ
+范文正公
+范文程
+范文芳
+范文藤
+范文虎
+范文照
+發表
+ä¹¾é‡
+若干
+鈎心鬥角
+若干
+ä¹¾é‡
+å…¨é¢åŒ…åœ
+å…¨é¢åŒ…裹
+機械系
+體系
+心ç†
+複分解
+é¹°éµ°
+å±å’¤903
+å±å’¤MY903
+å±å’¤My903
+å±å’¤æ¨‚壇
+å±å’¤å’¤
+å±å’¤å±å’¤å±å’¤å’¤
+å±å’¤å±å±å’¤
+正在å±å’¤
+空餘
+變髒
+天地志狼
+薴烯
+阿斯圖里亞斯
+雙折射
+心繫家
+心繫國
+心繫祖
+心繫北
+心繫京
+心繫å—
+心繫西
+心繫æ±
+心繫四
+心繫å·
+心繫浙
+心繫汶
+心繫廣
+心繫湖
+心繫山
+心繫å°
+心繫江
+心繫昌
+心繫香
+心繫澳
+心繫港
+心繫泰
+心繫å¥
+心繫天
+心繫地
+心繫大
+心繫å°
+心繫全
+心繫眾
+心繫奧
+心繫世
+心繫中
+心繫高
+心繫ç½
+心繫éž
+心繫群
+心繫新
+心繫沈
+心繫å”
+心繫黃
+心繫乔
+心繫阮
+心繫父
+心繫æ¯
+心繫病
+心繫故
+心繫哪
+心繫中
+心繫英
+心繫美
+心繫日
+心繫德
+心繫功
+心繫曉
+心繫神
+心繫è¬
+心繫的
+心繫在
+心繫兩
+心繫社
+心繫曼
+心繫彼
+心繫風
+心繫募
+心繫一
+心繫何
+心繫困
+心繫輸
+心繫人
+心繫民
+心繫å
+心繫百
+心繫åƒ
+心繫和
+心繫é¸
+心繫囑
+心繫我
+心繫你
+心繫您
+心繫他
+心繫她
+心繫它
+心繫伊
+心繫長
+心繫舞
+心繫蘭
+心繫五
+心繫生
+心繫婦
+心繫幼
+心繫茶
+心繫動
+心繫沙
+心繫林
+心繫摩
+心繫农
+心繫慈
+心繫麥
+心繫貧
+心繫富
+心繫é 
+心繫近
+心繫宣
+心繫傳
+心繫紅
+心繫è€
+心繫é‡
+心繫震
+心繫妻
+心繫夫
+心繫女
+心繫å­
+心繫著
+é‡å›ž
+挑大樑
+扛大樑
+åŽè±
+製得
+é™åˆ¶
+控制
+製å–
+第四出局
+心臟
+è‚臟
+脾臟
+肺臟
+腎臟
+åƒèˆ‡
+浮誇
+星巴克
+于謙
+于寘
+淳于
+于ç¦
+于æ•ä¸­
+註:# ä¸ä½œâ€œæ³¨ï¼šâ€
+呆呆ç¸
+劃為# ä¸ä½œâ€œåˆ’為â€
+併為一體
+併為一家
+一個# é¿å…“個裡â€çš„錯誤
+兩個
+二個
+三個
+四個
+五個
+六個
+七個
+八個
+ä¹å€‹
+å個
+百個
+åƒå€‹
+è¬å€‹
+億個
+兆個
+零個
+云:# ä¸ä½œâ€œé›²ï¼šâ€
+é›»å­è¡¨æ ¼
+雪裡紅
+雪裡蕻
+森林裡
+æ—¥å­è£¡
+故事裡
+領域裡
+時間裡
+深淵裡
+醫院裡
+春å‡è£¡
+æš‘å‡è£¡
+秋å‡è£¡
+寒å‡è£¡
+春天裡
+å¤å¤©è£¡
+秋天裡
+冬天裡
+春日裡
+å¤æ—¥è£¡
+秋日裡
+冬日裡
+嘴裡
+心裡
+皮裡陽秋
+肚裡
+苦裡
+裡勾外連
+裡é¢
+這裡
+中文裡
+山洞裡
+世界裡
+眼ç›è£¡
+首發
+夸脫
+誰幹的
+é˜èžº
+風采
+代碼表
+編碼表
+字碼表
+電碼表
+科斗
+佔領
+ç•æ°´
+點裡
+這åªæ˜¯
+這åªä¸
+這åªå®¹
+這åªå…
+這åªæŽ¡
+這åªç”¨
+有åªæ˜¯
+有åªä¸
+有åªå®¹
+有åªå…
+有åªæŽ¡
+有åªç”¨
+葉å¶ç¹
+胡å­æ˜‚
+包括
+特别致
+分别致
+會上簽訂
+會上簽署
+周一 # (åŠä»¥ä¸‹ï¼‰é¿å…“周一齣版â€çš„錯誤
+周二
+周三
+周四
+周五
+周六
+韶山沖
+總è£åˆ¶
+于丹
+于樂
+于冕
+于è»
+于å‰
+于堅
+于姓
+于æ°
+于娜
+于娟
+于山
+于帥
+于慧
+于振
+于æ•
+于斌
+于晴
+于波
+于濤
+于衡
+于贈
+于越
+于é–
+于勒
+于格
+于ä»æ³°
+于會泳
+于å‰åœ‹
+于佳å‰
+于光é 
+于克勒
+于凌奎
+于鳳至
+于化虎
+于å å…ƒ
+于å°ç…™
+于å“æµ·
+于國楨
+于大寶
+于天ä»
+于å­åƒ
+于孔兼
+于學忠
+于家堡
+于å°å‰
+于å°å½¤
+于山國
+于幼è»
+于廣洲
+于康震
+于å¼æžš
+于從濂
+于德海
+于志寧
+于慎行
+于æˆé¾
+于振武
+于明濤
+于是之
+于晨楠
+于根å‰
+于樹潔
+于欣æº
+于正昇
+于正昌
+于永波
+于漢超
+于江震
+于洪å€
+于浩å¨
+于海洋
+于湘蘭
+于特森
+于玉立
+于秀æ•
+于素秋
+于若木
+于蔭霖
+于西翰
+于é å‰
+于é“泉
+于都縣
+于震寰
+于震環
+于éžé—‡
+于風政
+于鳳æ¡
+于默奧
+于家堡
+于爾岑
+于默奧
+于è²çˆ¾
+于爾根
+于雙戈
+于里察
+于澤爾
+于斯塔德
+于斯é”爾
+于爾里克
+于奇庫æœå…‹
+于韋斯屈èŠ
+于克-蘭多縣
+于斯ç´çˆ¾æ–¯è²é‡Œ
+å¤äºŽå–¬
+涂姓
+涂å¤
+涂天相
+涂åºç‘„
+涂澤民
+涂紹煃
+涂羽å¿
+涂逢年
+涂長望
+涂謹申
+涂鴻欽
+涂壯勳
+涂醒哲
+涂善妮
+涂æ•æ†
+總è£åˆ¶
+故云
+強制作用
+鬱å—
+西米谷
+一出生
+二出生
+三出生
+四出生
+五出生
+六出生
+七出生
+八出生
+ä¹å‡ºç”Ÿ
+å出生
+一出版
+二出版
+三出版
+四出版
+五出版
+六出版
+七出版
+八出版
+ä¹å‡ºç‰ˆ
+å出版
+一出刊
+二出刊
+三出刊
+四出刊
+五出刊
+六出刊
+七出刊
+八出刊
+ä¹å‡ºåˆŠ
+å出刊
+一出逃
+二出逃
+三出逃
+四出逃
+五出逃
+六出逃
+七出逃
+八出逃
+ä¹å‡ºé€ƒ
+å出逃
+一出å£
+二出å£
+三出å£
+四出å£
+五出å£
+六出å£
+七出å£
+八出å£
+ä¹å‡ºå£
+å出å£
+一出ç¥å±±
+二出ç¥å±±
+三出ç¥å±±
+四出ç¥å±±
+五出ç¥å±±
+六出ç¥å±±
+七出ç¥å±±
+八出ç¥å±±
+ä¹å‡ºç¥å±±
+å出ç¥å±±
+鬱林
+饑è’
+å…å¾µ
+亞美尼亞曆
+百科裡
+æ­·å²è£¡
+戲裡
+作å“裡
+專輯裡
+年代裡
+棺æ裡
+注釋
+月é¢
+è·¯é¢
+ä¿®æ°æ¥·
+ä¿®æ°éºŸ
+學裡
+ç„裡
+館裡
+系列裡
+æ‘å­è£¡
+艷åŽ
+廢åŽ
+妖åŽ
+åŽæµ·ç£
+ä»™åŽ
+賈åŽ
+è³¢åŽ
+蜂åŽ
+皇åŽ
+王åŽ
+王侯åŽ
+æ¯åŽ
+æ­¦åŽ
+æ­ŒåŽ
+å½±åŽ
+å°åŽ
+太åŽ
+天åŽ
+å‘‚åŽ
+åŽé‡Œ
+åŽè¡—
+åŽç¾¿
+åŽç¨·
+åŽåº§
+åŽå¹³è·¯
+åŽå®‰è·¯
+åŽåœŸ
+åŽåŒ—è¡—
+åŽå† 
+望åŽçŸ³
+åŽè§’
+蟻åŽ
+åŽå¦ƒ
+大周åŽ
+å°å‘¨åŽ
+染殿åŽ
+准三åŽ
+風åŽ
+åŽæ¯æˆŠ
+風後,
+人如風後入江雲
+中風後
+å±é¢¨å¾Œ
+颱風後
+颳風後
+整風後
+打風後
+é‡é¢¨å¾Œ
+èžé¢¨å¾Œ
+逆風後
+順風後
+大風後
+馬格里布
+伊里布
+劃入
+中庄å­
+埔è£ç¤¾æ’«å¢¾å±€
+懸掛
+僱傭
+å››æ¨å…­å…¥
+宿èˆ
+會干擾
+代表
+高清愿
+瓷製
+竹製
+絲製
+莜麵
+劃入
+ç°¡ç­‘ç¿Ž
+楊雅筑
+é­”æ°åº§
+æ°å¨çˆ¾éŸ³æ¨‚
+彭于æ™
+尸羅精èˆ
+索馬里 # (åŠä»¥ä¸‹ï¼‰é¿å…里海=>è£æµ·çš„轉æ›
+西西里
+騰格里
+阿里
+æ‘里長
+進制
+黃詩æ°
+陳冲
+何æ°
+劉佳怜
+于å°æƒ 
+于å“æµ·
+于耘婕
+于洋
+于澄
+于光新
+范賢惠
+于國治
+于楓
+于熙ç
+涂善妮
+邱于庭
+熊æ°
+åœäº‘å‰
+黎å‰é›²
+于飛島
+代表
+水無怜奈
+å‚²éŠ # æµè§ˆå™¨å
+å¤äºŽå–¬
+è³­åŽ
+åŽæµ·ç£
+ç«‹åŽç¶œ
+甲åŽè·¯
+劉芸åŽ
+è¬è¯åŽ
+趙惠åŽ
+趙å¨åŽ
+è–åŽ
+陳有åŽ
+許虬
+網éŠ
+ç‹„å¿—æ°
+伊é©æ°
+于冠è¯
+于å°ç…™
+于雲鶴
+于忠肅集
+于å‹æ¾¤
+于和å‰
+于來山
+于樂
+于天é¾
+于謹
+于榮光
+電波é˜
+余三å‹
+掛å
+啟發å¼
+舞åŽ
+甄åŽ
+郭åŽ
+0å¹´ # å”助分詞
+1å¹´
+2å¹´
+3å¹´
+4å¹´
+5å¹´
+6å¹´
+7å¹´
+8å¹´
+9å¹´
+ï¼å¹´
+1年
+ï¼’å¹´
+3年
+4年
+5年
+ï¼–å¹´
+ï¼—å¹´
+8年
+9年
+〇年
+零年
+一年
+å…©å¹´
+二年
+三年
+四年
+五年
+å…­å¹´
+七年
+å…«å¹´
+ä¹å¹´
+åå¹´
+百年
+åƒå¹´
+è¬å¹´
+å„„å¹´
+周åŽ
+0周後
+1周後
+2周後
+3周後
+4周後
+5周後
+6周後
+7周後
+8周後
+9周後
+ï¼å‘¨å¾Œ
+1周後
+2周後
+3周後
+4周後
+5周後
+6周後
+7周後
+8周後
+9周後
+零周後
+〇周後
+一周後
+二周後
+兩周後
+三周後
+四周後
+五周後
+六周後
+七周後
+八周後
+ä¹å‘¨å¾Œ
+å周後
+百周後
+åƒå‘¨å¾Œ
+è¬å‘¨å¾Œ
+億周後
+幾周後
+多周後
+å‰å¾€
+åŽç‘žç«™
+å¸åŽè‡º
+新井里美
+樗里å­
+伊é”里å­
+濱田里佳å­
+å°ŠåŽ
+å¶å¿—ç©—
+å¶ä¸äºŒå­
+于立æˆ
+山谷é“
+æŽå¿—å–œ
+于欣
+于少ä¿
+于海
+於海邊
+於海上
+于凌辰
+于é­æ™º
+于鬯
+于仲文
+于å†æ¸…
+于震
+於震å‰
+於震åŽ
+於震中
+固定制
+毗婆尸佛
+尸棄佛
+划船
+划ä¸ä¾†
+划拳
+划槳
+划動
+划艇
+划行
+划算
+總è£åˆ¶
+æ’生
+嚴云農
+手è£åŠ
+秦莊襄王
+伊æ±æ€œ
+衛後莊公
+餘é‡
+並行
+éƒéƒé’é’
+å”防
+å°è¡¨æ ¼
+å°è¡¨ç¤º
+å°è¡¨é”
+å°è¡¨æ¼”
+å°è¡¨æ˜Ž
+了然後
+戴表元
+張樂于張å¾
+余力為
+葉å¶ç´
+万俟
+幾個
+澀谷å€
+å”調
+é¸æ‰‹
+併發症
+併發é‡ç—‡
+併發模å¼
+併發型模å¼
+金色長髮
+紅色長髮
+一頭長髮
+çš„é•·é«®
+黑色長髮
+å‰å¤©
+昨天
+今天
+明天
+後天
+數學家
+科學家
+物ç†å­¸å®¶
+化學家
+生物學家
+天文學家
+游離
+å­æ™³
+ç´…åŽå‡èªª
+書é¢
+ä¸åª
+高涌泉
+請求
+考試
+測試
+筆試
+å£è©¦
+冰冷
+王田里
+åŽå§“
+å°å·ž
+田庄英雄
+計劃
+抑制劑
diff --git a/includes/zhtable/tradphrases_exclude.manual b/maintenance/language/zhtable/tradphrases_exclude.manual
index e6abb4e1..e6abb4e1 100644
--- a/includes/zhtable/tradphrases_exclude.manual
+++ b/maintenance/language/zhtable/tradphrases_exclude.manual
diff --git a/maintenance/locking/LockServerDaemon.php b/maintenance/locking/LockServerDaemon.php
index 689c9309..01fbac72 100644
--- a/maintenance/locking/LockServerDaemon.php
+++ b/maintenance/locking/LockServerDaemon.php
@@ -23,7 +23,7 @@
* @ingroup LockManager Maintenance
*/
-if ( php_sapi_name() !== 'cli' ) {
+if ( PHP_SAPI !== 'cli' ) {
die( "This is not a valid entry point.\n" );
}
error_reporting( E_ALL );
@@ -39,6 +39,8 @@ LockServerDaemon::init(
/**
* Simple lock server daemon that accepts lock/unlock requests
+ *
+ * @ingroup LockManager Maintenance
*/
class LockServerDaemon {
/** @var resource */
@@ -66,6 +68,8 @@ class LockServerDaemon {
/**
* @params $config Array
+ * @param array $config
+ * @throws Exception
* @return LockServerDaemon
*/
public static function init( array $config ) {
@@ -75,9 +79,9 @@ class LockServerDaemon {
foreach ( array( 'address', 'port', 'authKey' ) as $par ) {
if ( !isset( $config[$par] ) ) {
die( "Usage: php LockServerDaemon.php " .
- "--address <address> --port <port> --authkey <key> " .
+ "--address <address> --port <port> --authKey <key> " .
"[--lockTimeout <seconds>] " .
- "[--maxLocks <integer>] [--maxClients <integer>] [--maxBacklog <integer>]"
+ "[--maxLocks <integer>] [--maxClients <integer>] [--maxBacklog <integer>]\n"
);
}
}
@@ -111,6 +115,7 @@ class LockServerDaemon {
}
/**
+ * @throws Exception
* @return void
*/
protected function setupServerSocket() {
@@ -237,7 +242,9 @@ class LockServerDaemon {
$m = explode( ':', $data ); // <session, key, command, type, values>
if ( count( $m ) == 5 ) {
list( $session, $key, $command, $type, $values ) = $m;
- if ( sha1( $session . $command . $type . $values . $this->authKey ) !== $key ) {
+ $goodKey = hash_hmac( 'sha1',
+ "{$session}\n{$command}\n{$type}\n{$values}", $this->authKey );
+ if ( $goodKey !== $key ) {
return 'BAD_KEY';
} elseif ( strlen( $session ) !== 32 ) {
return 'BAD_SESSION';
diff --git a/maintenance/mcc.php b/maintenance/mcc.php
index e07e62db..6ff8a176 100644
--- a/maintenance/mcc.php
+++ b/maintenance/mcc.php
@@ -25,11 +25,62 @@
/** */
require_once( __DIR__ . '/commandLine.inc' );
-$mcc = new MWMemcached( array( 'persistent' => true/*, 'debug' => true*/ ) );
-$mcc->set_servers( $wgMemCachedServers );
-# $mcc->set_debug( true );
+$options = getopt( '', array( 'debug', 'help', 'cache:' ) );
-function mccShowHelp( $command ) {
+$debug = isset( $options['debug'] );
+$help = isset( $options['help'] );
+$cache = isset( $options['cache'] ) ? $options['cache'] : null;
+
+if ( $help ) {
+ mccShowUsage();
+ exit( 0 );
+}
+$mcc = new MWMemcached( array(
+ 'persistent' => true,
+ 'debug' => $debug,
+) );
+
+if ( $cache ) {
+ if ( !isset( $wgObjectCaches[$cache] ) ) {
+ print "MediaWiki isn't configured with a cache named '$cache'";
+ exit( 1 );
+ }
+ $servers = $wgObjectCaches[$cache]['servers'];
+} elseif ( $wgMainCacheType === CACHE_MEMCACHED ) {
+ $mcc->set_servers( $wgMemCachedServers );
+} elseif( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
+ $mcc->set_servers( $wgObjectCaches[$wgMainCacheType]['servers'] );
+} else {
+ print "MediaWiki isn't configured for Memcached usage\n";
+ exit( 1 );
+}
+
+/**
+ * Show this command line tool usage.
+ */
+function mccShowUsage() {
+ echo <<<EOF
+Usage:
+ mcc.php [--debug]
+ mcc.php --help
+
+MemCached Command (mcc) is an interactive command tool that let you interact
+with the MediaWiki memcached cache.
+
+Options:
+ --debug Set debug mode on the memcached connection.
+ --help This help screen.
+
+Interactive commands:
+
+EOF;
+ print "\t";
+ print str_replace( "\n", "\n\t", mccGetHelp( false ) );
+ print "\n";
+}
+
+function mccGetHelp( $command ) {
+ $output = '';
$commandList = array(
'get' => 'grabs something',
'getsock' => 'lists sockets',
@@ -48,13 +99,15 @@ function mccShowHelp( $command ) {
if ( $command === 'fullhelp' ) {
$max_cmd_len = max( array_map( 'strlen', array_keys( $commandList ) ) );
foreach ( $commandList as $cmd => $desc ) {
- printf( "%-{$max_cmd_len}s: %s\n", $cmd, $desc );
+ $output .= sprintf( "%-{$max_cmd_len}s: %s\n", $cmd, $desc );
}
} elseif ( isset( $commandList[$command] ) ) {
- print "$command: $commandList[$command]\n";
+ $output .= "$command: $commandList[$command]\n";
} else {
- print "$command: command does not exist or no help for it\n";
+ $output .= "$command: command does not exist or no help for it\n";
}
+
+ return $output;
}
do {
@@ -72,8 +125,8 @@ do {
switch ( $command ) {
case 'help':
// show an help message
- mccShowHelp( array_shift( $args ) );
- break;
+ print mccGetHelp( array_shift( $args ) );
+ break;
case 'get':
$sub = '';
@@ -93,7 +146,7 @@ do {
} else {
var_dump( $res );
}
- break;
+ break;
case 'getsock':
$res = $mcc->get( $args[0] );
diff --git a/maintenance/mctest.php b/maintenance/mctest.php
index 691b832b..469feca2 100644
--- a/maintenance/mctest.php
+++ b/maintenance/mctest.php
@@ -36,18 +36,32 @@ class mcTest extends Maintenance {
$this->mDescription = "Makes several 'set', 'incr' and 'get' requests on every"
. " memcached server and shows a report";
$this->addOption( 'i', 'Number of iterations', false, true );
+ $this->addOption( 'cache', 'Use servers from this $wgObjectCaches store', false, true );
$this->addArg( 'server[:port]', 'Memcached server to test, with optional port', false );
}
public function execute() {
- global $wgMemCachedServers, $wgMemCachedTimeout;
+ global $wgMainCacheType, $wgMemCachedTimeout, $wgObjectCaches;
+ $cache = $this->getOption( 'cache' );
$iterations = $this->getOption( 'i', 100 );
- if ( $this->hasArg() ) {
- $wgMemCachedServers = array( $this->getArg() );
+ if ( $cache ) {
+ if ( !isset( $wgObjectCaches[$cache] ) ) {
+ $this->error( "MediaWiki isn't configured with a cache named '$cache'", 1 );
+ }
+ $servers = $wgObjectCaches[$cache]['servers'];
+ } elseif ( $this->hasArg() ) {
+ $servers = array( $this->getArg() );
+ } elseif ( $wgMainCacheType === CACHE_MEMCACHED ) {
+ global $wgMemCachedServers;
+ $servers = $wgMemCachedServers ;
+ } elseif ( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
+ $servers = $wgObjectCaches[$wgMainCacheType]['servers'];
+ } else {
+ $this->error( "MediaWiki isn't configured for Memcached usage", 1 );
}
- foreach ( $wgMemCachedServers as $server ) {
+ foreach ( $servers as $server ) {
$this->output( $server . " ", $server );
$mcc = new MemCachedClientforWiki( array(
'persistant' => true,
diff --git a/maintenance/mergeMessageFileList.php b/maintenance/mergeMessageFileList.php
index cea64333..62596b20 100644
--- a/maintenance/mergeMessageFileList.php
+++ b/maintenance/mergeMessageFileList.php
@@ -82,6 +82,9 @@ class MergeMessageFileList extends Maintenance {
if ( $this->hasOption( 'output' ) ) {
$mmfl['output'] = $this->getOption( 'output' );
}
+ if ( $this->hasOption( 'quiet' ) ) {
+ $mmfl['quiet'] = true;
+ }
}
}
@@ -92,7 +95,9 @@ foreach ( $mmfl['setupFiles'] as $fileName ) {
continue;
}
$fileName = str_replace( '$IP', $IP, $fileName );
- fwrite( STDERR, "Loading data from $fileName\n" );
+ if ( empty( $mmfl['quiet'] ) ) {
+ fwrite( STDERR, "Loading data from $fileName\n" );
+ }
include_once( $fileName );
}
fwrite( STDERR, "\n" );
@@ -120,4 +125,3 @@ if ( isset( $mmfl['output'] ) ) {
} else {
echo $s;
}
-
diff --git a/maintenance/migrateUserGroup.php b/maintenance/migrateUserGroup.php
index 496af723..f3e5957c 100644
--- a/maintenance/migrateUserGroup.php
+++ b/maintenance/migrateUserGroup.php
@@ -55,7 +55,9 @@ class MigrateUserGroup extends Maintenance {
$blockEnd = $start + $this->mBatchSize - 1;
// Migrate users over in batches...
while ( $blockEnd <= $end ) {
+ $affected = 0;
$this->output( "Doing users $blockStart to $blockEnd\n" );
+
$dbw->begin( __METHOD__ );
$dbw->update( 'user_groups',
array( 'ug_group' => $newGroup ),
@@ -64,19 +66,42 @@ class MigrateUserGroup extends Maintenance {
__METHOD__,
array( 'IGNORE' )
);
- $count += $dbw->affectedRows();
+ $affected += $dbw->affectedRows();
+ // Delete rows that the UPDATE operation above had to ignore.
+ // This happens when a user is in both the old and new group.
+ // Updating the row for the old group membership failed since
+ // user/group is UNIQUE.
$dbw->delete( 'user_groups',
array( 'ug_group' => $oldGroup,
"ug_user BETWEEN $blockStart AND $blockEnd" ),
__METHOD__
);
- $count += $dbw->affectedRows();
+ $affected += $dbw->affectedRows();
$dbw->commit( __METHOD__ );
+
+ // Clear cache for the affected users (bug 40340)
+ if ( $affected > 0 ) {
+ // XXX: This also invalidates cache of unaffected users that
+ // were in the new group and not in the group.
+ $res = $dbw->select( 'user_groups', 'ug_user',
+ array( 'ug_group' => $newGroup,
+ "ug_user BETWEEN $blockStart AND $blockEnd" ),
+ __METHOD__
+ );
+ if ( $res !== false ) {
+ foreach ( $res as $row ) {
+ $user = User::newFromId( $row->ug_user );
+ $user->invalidateCache();
+ }
+ }
+ }
+
+ $count += $affected;
$blockStart += $this->mBatchSize;
$blockEnd += $this->mBatchSize;
wfWaitForSlaves();
}
- $this->output( "Done! $count user(s) in group '$oldGroup' are now in '$newGroup' instead.\n" );
+ $this->output( "Done! $count users in group '$oldGroup' are now in '$newGroup' instead.\n" );
}
}
diff --git a/maintenance/minify.php b/maintenance/minify.php
index 9f5a909d..0846a64c 100644
--- a/maintenance/minify.php
+++ b/maintenance/minify.php
@@ -29,7 +29,7 @@ require_once( __DIR__ . '/Maintenance.php' );
* @ingroup Maintenance
*/
class MinifyScript extends Maintenance {
- var $outDir;
+ public $outDir;
public function __construct() {
parent::__construct();
diff --git a/maintenance/mssql/tables.sql b/maintenance/mssql/tables.sql
index a0c3d17b..ad996175 100644
--- a/maintenance/mssql/tables.sql
+++ b/maintenance/mssql/tables.sql
@@ -76,10 +76,10 @@ CREATE TABLE /*$wgDBprefix*/user_newtalk (
CREATE INDEX /*$wgDBprefix*/user_group_id ON /*$wgDBprefix*/user_newtalk([user_id]);
CREATE INDEX /*$wgDBprefix*/user_ip ON /*$wgDBprefix*/user_newtalk(user_ip);
---
+--
-- User preferences and other fun stuff
-- replaces old user.user_options BLOB
---
+--
CREATE TABLE /*$wgDBprefix*/user_properties (
up_user INT NOT NULL,
up_property NVARCHAR(32) NOT NULL,
@@ -157,7 +157,7 @@ CREATE TABLE /*$wgDBprefix*/text (
-- The fields generally correspond to the page, revision, and text
-- fields, with several caveats.
-- Cannot reasonably create views on this table, due to the presence of TEXT
--- columns.
+-- columns.
CREATE TABLE /*$wgDBprefix*/archive (
ar_namespace SMALLINT NOT NULL DEFAULT 0,
ar_title NVARCHAR(255) NOT NULL DEFAULT '',
@@ -234,7 +234,7 @@ CREATE INDEX /*$wgDBprefix*/cl_sortkey ON /*$wgDBprefix*/categorylinks(cl_to,c
CREATE INDEX /*$wgDBprefix*/cl_timestamp ON /*$wgDBprefix*/categorylinks(cl_to,cl_timestamp);
--;
---
+--
-- Track all existing categories. Something is a category if 1) it has an en-
-- try somewhere in categorylinks, or 2) it once did. Categories might not
-- have corresponding pages, so they need to be tracked separately.
@@ -279,16 +279,16 @@ CREATE TABLE /*$wgDBprefix*/valid_tag (
vt_tag varchar(255) NOT NULL PRIMARY KEY
);
---
+--
-- Table for storing localisation data
---
+--
CREATE TABLE /*$wgDBprefix*/l10n_cache (
-- language code
lc_lang NVARCHAR(32) NOT NULL,
-
+
-- cache key
lc_key NVARCHAR(255) NOT NULL,
-
+
-- Value
lc_value TEXT NOT NULL DEFAULT '',
);
@@ -305,9 +305,9 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
-- Maximum key length ON SQL Server is 900 bytes
CREATE INDEX /*$wgDBprefix*/externallinks_index ON /*$wgDBprefix*/externallinks(el_index);
---
+--
-- Track external user accounts, if ExternalAuth is used
---
+--
CREATE TABLE /*$wgDBprefix*/external_user (
-- Foreign key to user_id
eu_local_id INT NOT NULL PRIMARY KEY,
@@ -327,16 +327,16 @@ CREATE TABLE /*$wgDBprefix*/langlinks (
);
CREATE UNIQUE INDEX /*$wgDBprefix*/langlinks_reverse_key ON /*$wgDBprefix*/langlinks(ll_lang,ll_title);
---
+--
-- Track inline interwiki links
---
+--
CREATE TABLE /*$wgDBprefix*/iwlinks (
-- page_id of the referring page
iwl_from INT NOT NULL DEFAULT 0,
-
+
-- Interwiki prefix code of the target
iwl_prefix NVARCHAR(20) NOT NULL DEFAULT '',
-
+
-- Title of the target, including namespace
iwl_title NVARCHAR(255) NOT NULL DEFAULT '',
);
@@ -728,7 +728,7 @@ CREATE TABLE /*$wgDBprefix*/updatelog (
PRIMARY KEY (ul_key)
);
--- NOTE To enable full text indexing on SQL 2008 you need to create an account FDH$MSSQLSERVER
+-- NOTE To enable full text indexing on SQL 2008 you need to create an account FDH$MSSQLSERVER
-- AND assign a password for the FDHOST process to run under
-- Once you have assigned a password to that account, you need to run the following stored procedure
-- replacing XXXXX with the password you used.
diff --git a/maintenance/mwdocgen.php b/maintenance/mwdocgen.php
index 37e626ba..4fad7a7f 100644
--- a/maintenance/mwdocgen.php
+++ b/maintenance/mwdocgen.php
@@ -43,7 +43,7 @@
# Variables / Configuration
#
-if ( php_sapi_name() != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
echo 'Run "' . __FILE__ . '" from the command line.';
die( -1 );
}
@@ -116,8 +116,7 @@ function readaline( $prompt = '' ) {
* @param $doxyGenerateMan Boolean
* @return string
*/
-function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $input, $exclude, $excludePatterns, $doxyGenerateMan ) {
- global $doxygenInputFilter;
+function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $input, $exclude, $excludePatterns, $doxyGenerateMan, $doxygenInputFilter ) {
$template = file_get_contents( $doxygenTemplate );
// Replace template placeholders by correct values.
@@ -134,7 +133,7 @@ function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath,
);
$tmpCfg = str_replace( array_keys( $replacements ), array_values( $replacements ), $template );
$tmpFileName = tempnam( wfTempDir(), 'mwdocgen-' );
- file_put_contents( $tmpFileName , $tmpCfg ) or die( "Could not write doxygen configuration to file $tmpFileName\n" );
+ file_put_contents( $tmpFileName, $tmpCfg ) or die( "Could not write doxygen configuration to file $tmpFileName\n" );
return $tmpFileName;
}
@@ -248,7 +247,7 @@ case 6:
$excludedPaths = $mwPath . join( " $mwPath", $mwExcludePaths );
print "EXCLUDE: $excludedPaths\n\n";
-$generatedConf = generateConfigFile( $doxygenTemplate, $doxyOutput, $mwPath, $doxyVersion, $input, $excludedPaths, $excludePatterns, $doxyGenerateMan );
+$generatedConf = generateConfigFile( $doxygenTemplate, $doxyOutput, $mwPath, $doxyVersion, $input, $excludedPaths, $excludePatterns, $doxyGenerateMan, $doxygenInputFilter );
$command = $doxygenBin . ' ' . $generatedConf;
echo <<<TEXT
@@ -261,7 +260,8 @@ $command
TEXT;
-passthru( $command );
+$exitcode = 1;
+passthru( $command, $exitcode );
echo <<<TEXT
---------------------------------------------------
@@ -271,3 +271,5 @@ Check above for possible errors.
You might want to delete the temporary file $generatedConf
TEXT;
+
+exit( $exitcode );
diff --git a/maintenance/mwjsduck-gen b/maintenance/mwjsduck-gen
new file mode 100644
index 00000000..fbd428f1
--- /dev/null
+++ b/maintenance/mwjsduck-gen
@@ -0,0 +1,2 @@
+#!/usr/bin/env sh
+jsduck --config=$(cd $(dirname $0)/..; pwd)/maintenance/jsduck/config.json && echo 'JSDuck execution finished.'
diff --git a/maintenance/namespaceDupes.php b/maintenance/namespaceDupes.php
index 4197a355..6067a826 100644
--- a/maintenance/namespaceDupes.php
+++ b/maintenance/namespaceDupes.php
@@ -147,14 +147,13 @@ class NamespaceConflictChecker extends Maintenance {
/**
* Get the interwiki list
*
- * @todo Needs to respect interwiki cache!
* @return Array
*/
private function getInterwikiList() {
- $result = $this->db->select( 'interwiki', array( 'iw_prefix' ) );
+ $result = Interwiki::getAllPrefixes();
$prefixes = array();
foreach ( $result as $row ) {
- $prefixes[] = $row->iw_prefix;
+ $prefixes[] = $row['iw_prefix'];
}
return $prefixes;
}
diff --git a/maintenance/nextJobDB.php b/maintenance/nextJobDB.php
index e66e981b..1be5146e 100644
--- a/maintenance/nextJobDB.php
+++ b/maintenance/nextJobDB.php
@@ -18,7 +18,6 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @todo Make this work on PostgreSQL and maybe other database servers
* @ingroup Maintenance
*/
@@ -33,127 +32,86 @@ class nextJobDB extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Pick a database that has pending jobs";
- $this->addOption( 'type', "The type of job to search for", false, true );
+ $this->addOption( 'type', "Search by job type", false, true );
+ $this->addOption( 'types', "Space separated list of job types to search for", false, true );
}
public function execute() {
- global $wgMemc;
- $type = $this->getOption( 'type', false );
+ global $wgJobTypesExcludedFromDefaultQueue;
- $memcKey = 'jobqueue:dbs:v2';
- $pendingDBs = $wgMemc->get( $memcKey );
-
- // If the cache entry wasn't present, or in 1% of cases otherwise,
- // regenerate the cache.
- if ( !$pendingDBs || mt_rand( 0, 100 ) == 0 ) {
- $pendingDBs = $this->getPendingDbs();
- $wgMemc->set( $memcKey, $pendingDBs, 300 );
+ // job type required/picked
+ if ( $this->hasOption( 'types' ) ) {
+ $types = explode( ' ', $this->getOption( 'types' ) );
+ } elseif ( $this->hasOption( 'type' ) ) {
+ $types = array( $this->getOption( 'type' ) );
+ } else {
+ $types = false;
}
- if ( !$pendingDBs ) {
- return;
+ // Handle any required periodic queue maintenance
+ $this->executeReadyPeriodicTasks();
+
+ // Get all the queues with jobs in them
+ $pendingDBs = JobQueueAggregator::singleton()->getAllReadyWikiQueues();
+ if ( !count( $pendingDBs ) ) {
+ return; // no DBs with jobs or cache is both empty and locked
}
do {
$again = false;
- if ( $type === false ) {
- $candidates = call_user_func_array( 'array_merge', $pendingDBs );
- } elseif ( isset( $pendingDBs[$type] ) ) {
- $candidates = $pendingDBs[$type];
- } else {
- $candidates = array();
- }
- if ( !$candidates ) {
- return;
- }
-
- $candidates = array_values( $candidates );
- $db = $candidates[ mt_rand( 0, count( $candidates ) - 1 ) ];
- if ( !$this->checkJob( $type, $db ) ) {
- // This job is not available in the current database. Remove it from
- // the cache.
- if ( $type === false ) {
- foreach ( $pendingDBs as $type2 => $dbs ) {
- $pendingDBs[$type2] = array_diff( $pendingDBs[$type2], array( $db ) );
+ $candidates = array(); // list of (type, db)
+ // Flatten the tree of candidates into a flat list so that a random
+ // item can be selected, weighing each queue (type/db tuple) equally.
+ foreach ( $pendingDBs as $type => $dbs ) {
+ if (
+ ( is_array( $types ) && in_array( $type, $types ) ) ||
+ ( $types === false && !in_array( $type, $wgJobTypesExcludedFromDefaultQueue ) )
+ ) {
+ foreach ( $dbs as $db ) {
+ $candidates[] = array( $type, $db );
}
- } else {
- $pendingDBs[$type] = array_diff( $pendingDBs[$type], array( $db ) );
}
+ }
+ if ( !count( $candidates ) ) {
+ return; // no jobs for this type
+ }
- $wgMemc->set( $memcKey, $pendingDBs, 300 );
+ list( $type, $db ) = $candidates[mt_rand( 0, count( $candidates ) - 1 )];
+ if ( JobQueueGroup::singleton( $db )->isQueueDeprioritized( $type ) ) {
+ $pendingDBs[$type] = array_diff( $pendingDBs[$type], array( $db ) );
$again = true;
}
} while ( $again );
- $this->output( $db . "\n" );
- }
-
- /**
- * Check if the specified database has a job of the specified type in it.
- * The type may be false to indicate "all".
- * @param $type string
- * @param $dbName string
- * @return bool
- */
- function checkJob( $type, $dbName ) {
- $lb = wfGetLB( $dbName );
- $db = $lb->getConnection( DB_MASTER, array(), $dbName );
- if ( $type === false ) {
- $conds = Job::defaultQueueConditions( );
+ if ( $this->hasOption( 'types' ) ) {
+ $this->output( $db . " " . $type . "\n" );
} else {
- $conds = array( 'job_cmd' => $type );
+ $this->output( $db . "\n" );
}
-
-
- $exists = (bool) $db->selectField( 'job', '1', $conds, __METHOD__ );
- $lb->reuseConnection( $db );
- return $exists;
}
/**
- * Get all databases that have a pending job
- * @return array
+ * Do all ready periodic jobs for all databases every 5 minutes (and .1% of the time)
+ * @return integer
*/
- private function getPendingDbs() {
- global $wgLocalDatabases;
- $pendingDBs = array();
- # Cross-reference DBs by master DB server
- $dbsByMaster = array();
- foreach ( $wgLocalDatabases as $db ) {
- $lb = wfGetLB( $db );
- $dbsByMaster[$lb->getServerName( 0 )][] = $db;
- }
-
- foreach ( $dbsByMaster as $dbs ) {
- $dbConn = wfGetDB( DB_MASTER, array(), $dbs[0] );
-
- # Padding row for MySQL bug
- $pad = str_repeat( '-', 40 );
- $sql = "(SELECT '$pad' as db, '$pad' as job_cmd)";
- foreach ( $dbs as $wikiId ) {
- if ( $sql != '' ) {
- $sql .= ' UNION ';
+ private function executeReadyPeriodicTasks() {
+ global $wgLocalDatabases, $wgMemc;
+
+ $count = 0;
+ $memcKey = 'jobqueue:periodic:lasttime';
+ $timestamp = (int)$wgMemc->get( $memcKey ); // UNIX timestamp or 0
+ if ( ( time() - $timestamp ) > 300 || mt_rand( 0, 999 ) == 0 ) { // 5 minutes
+ if ( $wgMemc->add( "$memcKey:rebuild", 1, 1800 ) ) { // lock
+ foreach ( $wgLocalDatabases as $db ) {
+ $count += JobQueueGroup::singleton( $db )->executeReadyPeriodicTasks();
}
-
- list( $dbName, $tablePrefix ) = wfSplitWikiID( $wikiId );
- $dbConn->tablePrefix( $tablePrefix );
- $jobTable = $dbConn->tableName( 'job' );
-
- $sql .= "(SELECT DISTINCT '$wikiId' as db, job_cmd FROM $dbName.$jobTable GROUP BY job_cmd)";
- }
- $res = $dbConn->query( $sql, __METHOD__ );
- $first = true;
- foreach ( $res as $row ) {
- if ( $first ) {
- // discard padding row
- $first = false;
- continue;
- }
- $pendingDBs[$row->job_cmd][] = $row->db;
+ $wgMemc->set( $memcKey, time() );
+ $wgMemc->delete( "$memcKey:rebuild" ); // unlock
}
}
- return $pendingDBs;
+
+ return $count;
}
}
diff --git a/maintenance/oracle/alterSharedConstraints.php b/maintenance/oracle/alterSharedConstraints.php
index e222314d..a46c5e1f 100644
--- a/maintenance/oracle/alterSharedConstraints.php
+++ b/maintenance/oracle/alterSharedConstraints.php
@@ -15,13 +15,14 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance
*/
/**
* When using shared tables that are referenced by foreign keys on local
* tables you have to change the constraints on local tables.
- *
+ *
* The shared tables have to have GRANT REFERENCE on shared tables to local schema
* i.e.: GRANT REFERENCES (user_id) ON mwuser TO hubclient;
*/
@@ -40,12 +41,12 @@ class AlterSharedConstraints extends Maintenance {
public function execute() {
global $wgSharedDB, $wgSharedTables, $wgSharedPrefix, $wgDBprefix;
-
+
if ( $wgSharedDB == null ) {
$this->output( "Database sharing is not enabled\n" );
return;
}
-
+
$dbw = wfGetDB( DB_MASTER );
foreach ( $wgSharedTables as $table ) {
$stable = $dbw->tableNameInternal($table);
@@ -54,7 +55,7 @@ class AlterSharedConstraints extends Maintenance {
} else {
$ltable = "{$wgDBprefix}{$stable}" ;
}
-
+
$result = $dbw->query( "SELECT uc.constraint_name, uc.table_name, ucc.column_name, uccpk.table_name pk_table_name, uccpk.column_name pk_column_name, uc.delete_rule, uc.deferrable, uc.deferred
FROM user_constraints uc, user_cons_columns ucc, user_cons_columns uccpk
WHERE uc.constraint_type = 'R'
@@ -62,9 +63,9 @@ class AlterSharedConstraints extends Maintenance {
AND uccpk.constraint_name = uc.r_constraint_name
AND uccpk.table_name = '$ltable'" );
while (($row = $result->fetchRow()) !== false) {
-
+
$this->output( "Altering {$row['constraint_name']} ...");
-
+
try {
$dbw->query( "ALTER TABLE {$row['table_name']} DROP CONSTRAINT {$wgDBprefix}{$row['constraint_name']}" );
} catch (DBQueryError $exdb) {
@@ -72,13 +73,13 @@ class AlterSharedConstraints extends Maintenance {
throw $exdb;
}
}
-
+
$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']})
+ $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" );
}
}
diff --git a/maintenance/oracle/archives/patch-archive-ar_content_format.sql b/maintenance/oracle/archives/patch-archive-ar_content_format.sql
new file mode 100644
index 00000000..0c0c0d94
--- /dev/null
+++ b/maintenance/oracle/archives/patch-archive-ar_content_format.sql
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.archive ADD ar_content_format VARCHAR2(64);
diff --git a/maintenance/oracle/archives/patch-archive-ar_content_model.sql b/maintenance/oracle/archives/patch-archive-ar_content_model.sql
new file mode 100644
index 00000000..d18fc9e4
--- /dev/null
+++ b/maintenance/oracle/archives/patch-archive-ar_content_model.sql
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.archive ADD ar_content_model VARCHAR2(32);
diff --git a/maintenance/oracle/archives/patch-cat_hidden.sql b/maintenance/oracle/archives/patch-cat_hidden.sql
new file mode 100644
index 00000000..d1649c7c
--- /dev/null
+++ b/maintenance/oracle/archives/patch-cat_hidden.sql
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.category DROP COLUMN cat_hidden;
+
diff --git a/maintenance/oracle/archives/patch-fa_sha1.sql b/maintenance/oracle/archives/patch-fa_sha1.sql
new file mode 100644
index 00000000..70c9e60c
--- /dev/null
+++ b/maintenance/oracle/archives/patch-fa_sha1.sql
@@ -0,0 +1,5 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.filearchive ADD fa_sha1 VARCHAR2(32);
+CREATE INDEX &mw_prefix.filearchive_i05 ON &mw_prefix.filearchive (fa_sha1);
+
diff --git a/maintenance/oracle/archives/patch-job_attempts.sql b/maintenance/oracle/archives/patch-job_attempts.sql
new file mode 100644
index 00000000..b05c8779
--- /dev/null
+++ b/maintenance/oracle/archives/patch-job_attempts.sql
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.job ADD job_attempts NUMBER DEFAULT 0 NOT NULL;
+CREATE INDEX &mw_prefix.job_i05 ON &mw_prefix.job (job_attempts);
diff --git a/maintenance/oracle/archives/patch-job_token.sql b/maintenance/oracle/archives/patch-job_token.sql
new file mode 100644
index 00000000..1a730e95
--- /dev/null
+++ b/maintenance/oracle/archives/patch-job_token.sql
@@ -0,0 +1,12 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.job ADD (
+ job_random NUMBER DEFAULT 0 NOT NULL,
+ job_token VARCHAR2(32),
+ job_token_timestamp TIMESTAMP(6) WITH TIME ZONE,
+ job_sha1 VARCHAR2(32)
+);
+
+CREATE INDEX &mw_prefix.job_i03 ON &mw_prefix.job (job_sha1);
+CREATE INDEX &mw_prefix.job_i04 ON &mw_prefix.job (job_cmd,job_token,job_random);
+
diff --git a/maintenance/oracle/archives/patch-page-page_content_model.sql b/maintenance/oracle/archives/patch-page-page_content_model.sql
new file mode 100644
index 00000000..e5839d9a
--- /dev/null
+++ b/maintenance/oracle/archives/patch-page-page_content_model.sql
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.page ADD page_content_model VARCHAR2(32);
diff --git a/maintenance/oracle/archives/patch-rc_moved.sql b/maintenance/oracle/archives/patch-rc_moved.sql
new file mode 100644
index 00000000..2a71315d
--- /dev/null
+++ b/maintenance/oracle/archives/patch-rc_moved.sql
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.recentchanges DROP ( rc_moved_to_ns, rc_moved_to_title );
+
diff --git a/maintenance/oracle/archives/patch-revision-rev_content_format.sql b/maintenance/oracle/archives/patch-revision-rev_content_format.sql
new file mode 100644
index 00000000..ebde71c9
--- /dev/null
+++ b/maintenance/oracle/archives/patch-revision-rev_content_format.sql
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.revision ADD rev_content_format VARCHAR2(64);
diff --git a/maintenance/oracle/archives/patch-revision-rev_content_model.sql b/maintenance/oracle/archives/patch-revision-rev_content_model.sql
new file mode 100644
index 00000000..dd226423
--- /dev/null
+++ b/maintenance/oracle/archives/patch-revision-rev_content_model.sql
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.revision ADD rev_content_model VARCHAR2(32);
diff --git a/maintenance/oracle/archives/patch-sites.sql b/maintenance/oracle/archives/patch-sites.sql
new file mode 100644
index 00000000..868b210f
--- /dev/null
+++ b/maintenance/oracle/archives/patch-sites.sql
@@ -0,0 +1,34 @@
+define mw_prefix='{$wgDBprefix}';
+
+CREATE SEQUENCE sites_site_id_seq MINVALUE 0 START WITH 0;
+CREATE TABLE &mw_prefix.sites (
+ site_id NUMBER NOT NULL,
+ site_global_key VARCHAR2(32) NOT NULL,
+ site_type VARCHAR2(32) NOT NULL,
+ site_group VARCHAR2(32) NOT NULL,
+ site_source VARCHAR2(32) NOT NULL,
+ site_language VARCHAR2(32) NOT NULL,
+ site_protocol VARCHAR2(32) NOT NULL,
+ site_domain VARCHAR2(255) NOT NULL,
+ site_data BLOB NOT NULL,
+ site_forward NUMBER(1) NOT NULL,
+ site_config BLOB NOT NULL
+);
+ALTER TABLE &mw_prefix.sites ADD CONSTRAINT &mw_prefix.sites_pk PRIMARY KEY (site_id);
+CREATE UNIQUE INDEX &mw_prefix.sites_u01 ON &mw_prefix.sites (site_global_key);
+CREATE INDEX &mw_prefix.sites_i01 ON &mw_prefix.sites (site_type);
+CREATE INDEX &mw_prefix.sites_i02 ON &mw_prefix.sites (site_group);
+CREATE INDEX &mw_prefix.sites_i03 ON &mw_prefix.sites (site_source);
+CREATE INDEX &mw_prefix.sites_i04 ON &mw_prefix.sites (site_language);
+CREATE INDEX &mw_prefix.sites_i05 ON &mw_prefix.sites (site_protocol);
+CREATE INDEX &mw_prefix.sites_i06 ON &mw_prefix.sites (site_domain);
+CREATE INDEX &mw_prefix.sites_i07 ON &mw_prefix.sites (site_forward);
+
+CREATE TABLE &mw_prefix.site_identifiers (
+ si_site NUMBER NOT NULL,
+ si_type VARCHAR2(32) NOT NULL,
+ si_key VARCHAR2(32) NOT NULL
+);
+CREATE UNIQUE INDEX &mw_prefix.site_identifiers_u01 ON &mw_prefix.site_identifiers (si_type, si_key);
+CREATE INDEX &mw_prefix.site_identifiers_i01 ON &mw_prefix.site_identifiers (si_site);
+CREATE INDEX &mw_prefix.site_identifiers_i02 ON &mw_prefix.site_identifiers (si_key);
diff --git a/maintenance/oracle/archives/patch-ss_admins.sql b/maintenance/oracle/archives/patch-ss_admins.sql
new file mode 100644
index 00000000..c2e9242e
--- /dev/null
+++ b/maintenance/oracle/archives/patch-ss_admins.sql
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.site_stats DROP COLUMN ss_admins;
+
diff --git a/maintenance/oracle/archives/patch-testrun.sql b/maintenance/oracle/archives/patch-testrun.sql
index 6e3e1b7c..84facabc 100644
--- a/maintenance/oracle/archives/patch-testrun.sql
+++ b/maintenance/oracle/archives/patch-testrun.sql
@@ -25,7 +25,7 @@ BEFORE UPDATE FOR EACH ROW
ON &mw_prefix.testrun
BEGIN
SELECT testrun_tr_id_seq.NEXTVAL into :NEW.tr_id FROM dual;
-END;
+END;
CREATE TABLE /*$wgDBprefix*/testitem (
ti_run NUMBER NOT NULL REFERENCES &mw_prefix.testrun (tr_id) ON DELETE CASCADE,
diff --git a/maintenance/oracle/archives/patch-ufg_group-length-increase-255.sql b/maintenance/oracle/archives/patch-ufg_group-length-increase-255.sql
new file mode 100644
index 00000000..6a4a7517
--- /dev/null
+++ b/maintenance/oracle/archives/patch-ufg_group-length-increase-255.sql
@@ -0,0 +1,9 @@
+define mw_prefix='{$wgDBprefix}';
+
+/*$mw$*/
+BEGIN
+ EXECUTE IMMEDIATE 'ALTER TABLE &mw_prefix.user_former_groups MODIFY ufg_group VARCHAR2(255) NOT NULL';
+EXCEPTION WHEN OTHERS THEN
+ IF (SQLCODE = -01442) THEN NULL; ELSE RAISE; END IF;
+END;
+/*$mw$*/
diff --git a/maintenance/oracle/archives/patch-ufg_group-length-increase.sql b/maintenance/oracle/archives/patch-ufg_group-length-increase.sql
deleted file mode 100644
index a48b8bff..00000000
--- a/maintenance/oracle/archives/patch-ufg_group-length-increase.sql
+++ /dev/null
@@ -1,9 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-/*$mw$*/
-BEGIN
- EXECUTE IMMEDIATE 'ALTER TABLE &mw_prefix.user_former_groups MODIFY ufg_group VARCHAR2(32) NOT NULL';
-EXCEPTION WHEN OTHERS THEN
- IF (SQLCODE = -01442) THEN NULL; ELSE RAISE; END IF;
-END;
-/*$mw$*/
diff --git a/maintenance/oracle/archives/patch-ug_group-length-increase-255.sql b/maintenance/oracle/archives/patch-ug_group-length-increase-255.sql
new file mode 100644
index 00000000..00a5e7b2
--- /dev/null
+++ b/maintenance/oracle/archives/patch-ug_group-length-increase-255.sql
@@ -0,0 +1,9 @@
+define mw_prefix='{$wgDBprefix}';
+
+/*$mw$*/
+BEGIN
+ EXECUTE IMMEDIATE 'ALTER TABLE &mw_prefix.user_groups MODIFY ug_group VARCHAR2(255) NOT NULL';
+EXCEPTION WHEN OTHERS THEN
+ IF (SQLCODE = -01442) THEN NULL; ELSE RAISE; END IF;
+END;
+/*$mw$*/
diff --git a/maintenance/oracle/archives/patch-ug_group-length-increase.sql b/maintenance/oracle/archives/patch-ug_group-length-increase.sql
deleted file mode 100644
index 89e55329..00000000
--- a/maintenance/oracle/archives/patch-ug_group-length-increase.sql
+++ /dev/null
@@ -1,9 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-/*$mw$*/
-BEGIN
- EXECUTE IMMEDIATE 'ALTER TABLE &mw_prefix.user_groups MODIFY ug_group VARCHAR2(32) NOT NULL';
-EXCEPTION WHEN OTHERS THEN
- IF (SQLCODE = -01442) THEN NULL; ELSE RAISE; END IF;
-END;
-/*$mw$*/
diff --git a/maintenance/oracle/archives/patch-uploadstash-us_props.sql b/maintenance/oracle/archives/patch-uploadstash-us_props.sql
new file mode 100644
index 00000000..8962dc7c
--- /dev/null
+++ b/maintenance/oracle/archives/patch-uploadstash-us_props.sql
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.uploadstash ADD us_props BLOB;
+
diff --git a/maintenance/oracle/archives/patch-user_former_groups.sql b/maintenance/oracle/archives/patch-user_former_groups.sql
index 59147eb2..c14824eb 100644
--- a/maintenance/oracle/archives/patch-user_former_groups.sql
+++ b/maintenance/oracle/archives/patch-user_former_groups.sql
@@ -2,7 +2,7 @@ define mw_prefix='{$wgDBprefix}';
CREATE TABLE &mw_prefix.user_former_groups (
ufg_user NUMBER DEFAULT 0 NOT NULL,
- ufg_group VARCHAR2(16) NOT NULL
+ ufg_group VARCHAR2(255) NOT NULL
);
ALTER TABLE &mw_prefix.user_former_groups ADD CONSTRAINT &mw_prefix.user_former_groups_fk1 FOREIGN KEY (ufg_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.user_former_groups_u01 ON &mw_prefix.user_former_groups (ufg_user,ufg_group);
diff --git a/maintenance/oracle/tables.sql b/maintenance/oracle/tables.sql
index 26600eba..ba69da1b 100644
--- a/maintenance/oracle/tables.sql
+++ b/maintenance/oracle/tables.sql
@@ -31,7 +31,7 @@ INSERT INTO &mw_prefix.mwuser
CREATE TABLE &mw_prefix.user_groups (
ug_user NUMBER DEFAULT 0 NOT NULL,
- ug_group VARCHAR2(32) NOT NULL
+ ug_group VARCHAR2(255) NOT NULL
);
ALTER TABLE &mw_prefix.user_groups ADD CONSTRAINT &mw_prefix.user_groups_fk1 FOREIGN KEY (ug_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.user_groups_u01 ON &mw_prefix.user_groups (ug_user,ug_group);
@@ -39,7 +39,7 @@ CREATE INDEX &mw_prefix.user_groups_i01 ON &mw_prefix.user_groups (ug_group);
CREATE TABLE &mw_prefix.user_former_groups (
ufg_user NUMBER DEFAULT 0 NOT NULL,
- ufg_group VARCHAR2(16) NOT NULL
+ ufg_group VARCHAR2(255) NOT NULL
);
ALTER TABLE &mw_prefix.user_former_groups ADD CONSTRAINT &mw_prefix.user_former_groups_fk1 FOREIGN KEY (ufg_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
CREATE UNIQUE INDEX &mw_prefix.user_former_groups_u01 ON &mw_prefix.user_former_groups (ufg_user,ufg_group);
@@ -73,7 +73,8 @@ CREATE TABLE &mw_prefix.page (
page_random NUMBER(15,14) NOT NULL,
page_touched TIMESTAMP(6) WITH TIME ZONE,
page_latest NUMBER DEFAULT 0 NOT NULL, -- FK?
- page_len NUMBER DEFAULT 0 NOT NULL
+ page_len NUMBER DEFAULT 0 NOT NULL,
+ page_content_model VARCHAR2(32)
);
ALTER TABLE &mw_prefix.page ADD CONSTRAINT &mw_prefix.page_pk PRIMARY KEY (page_id);
CREATE UNIQUE INDEX &mw_prefix.page_u01 ON &mw_prefix.page (page_namespace,page_title);
@@ -83,7 +84,7 @@ CREATE INDEX &mw_prefix.page_i03 ON &mw_prefix.page (page_is_redirect, page_name
-- Create a dummy page to satisfy fk contraints especially with revisions
INSERT INTO &mw_prefix.page
- VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, 0, 0);
+ VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, 0, 0, NULL);
/*$mw$*/
CREATE TRIGGER &mw_prefix.page_set_random BEFORE INSERT ON &mw_prefix.page
@@ -106,7 +107,9 @@ CREATE TABLE &mw_prefix.revision (
rev_deleted CHAR(1) DEFAULT '0' NOT NULL,
rev_len NUMBER NULL,
rev_parent_id NUMBER DEFAULT NULL,
- rev_sha1 VARCHAR2(32) NULL
+ rev_sha1 VARCHAR2(32) NULL,
+ rev_content_model VARCHAR2(32),
+ rev_content_format VARCHAR2(64)
);
ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_pk PRIMARY KEY (rev_id);
ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_fk1 FOREIGN KEY (rev_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
@@ -142,7 +145,9 @@ CREATE TABLE &mw_prefix.archive (
ar_len NUMBER,
ar_page_id NUMBER,
ar_parent_id NUMBER,
- ar_sha1 VARCHAR2(32) NULL
+ ar_sha1 VARCHAR2(32),
+ ar_content_model VARCHAR2(32),
+ ar_content_format VARCHAR2(64)
);
ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk1 FOREIGN KEY (ar_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX &mw_prefix.archive_i01 ON &mw_prefix.archive (ar_namespace,ar_title,ar_timestamp);
@@ -197,8 +202,7 @@ CREATE TABLE &mw_prefix.category (
cat_title VARCHAR2(255) NOT NULL,
cat_pages NUMBER DEFAULT 0 NOT NULL,
cat_subcats NUMBER DEFAULT 0 NOT NULL,
- cat_files NUMBER DEFAULT 0 NOT NULL,
- cat_hidden NUMBER DEFAULT 0 NOT NULL
+ cat_files NUMBER DEFAULT 0 NOT NULL
);
ALTER TABLE &mw_prefix.category ADD CONSTRAINT &mw_prefix.category_pk PRIMARY KEY (cat_id);
CREATE UNIQUE INDEX &mw_prefix.category_u01 ON &mw_prefix.category (cat_title);
@@ -246,7 +250,6 @@ CREATE TABLE &mw_prefix.site_stats (
ss_total_pages NUMBER DEFAULT -1,
ss_users NUMBER DEFAULT -1,
ss_active_users NUMBER DEFAULT -1,
- ss_admins NUMBER DEFAULT -1,
ss_images NUMBER DEFAULT 0
);
CREATE UNIQUE INDEX &mw_prefix.site_stats_u01 ON &mw_prefix.site_stats (ss_row_id);
@@ -358,7 +361,8 @@ CREATE TABLE &mw_prefix.filearchive (
fa_user NUMBER DEFAULT 0 NOT NULL,
fa_user_text VARCHAR2(255) NOT NULL,
fa_timestamp TIMESTAMP(6) WITH TIME ZONE,
- fa_deleted NUMBER DEFAULT 0 NOT NULL
+ fa_deleted NUMBER DEFAULT 0 NOT NULL,
+ fa_sha1 VARCHAR2(32)
);
ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_pk PRIMARY KEY (fa_id);
ALTER TABLE &mw_prefix.filearchive ADD CONSTRAINT &mw_prefix.filearchive_fk1 FOREIGN KEY (fa_deleted_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
@@ -367,6 +371,7 @@ CREATE INDEX &mw_prefix.filearchive_i01 ON &mw_prefix.filearchive (fa_name, fa_t
CREATE INDEX &mw_prefix.filearchive_i02 ON &mw_prefix.filearchive (fa_storage_group, fa_storage_key);
CREATE INDEX &mw_prefix.filearchive_i03 ON &mw_prefix.filearchive (fa_deleted_timestamp);
CREATE INDEX &mw_prefix.filearchive_i04 ON &mw_prefix.filearchive (fa_user_text,fa_timestamp);
+CREATE INDEX &mw_prefix.filearchive_i05 ON &mw_prefix.filearchive (fa_sha1);
CREATE SEQUENCE uploadstash_us_id_seq;
CREATE TABLE &mw_prefix.uploadstash (
@@ -385,7 +390,8 @@ CREATE TABLE &mw_prefix.uploadstash (
us_media_type VARCHAR2(32) DEFAULT NULL,
us_image_width NUMBER,
us_image_height NUMBER,
- us_image_bits NUMBER
+ us_image_bits NUMBER,
+ us_props BLOB
);
ALTER TABLE &mw_prefix.uploadstash ADD CONSTRAINT &mw_prefix.uploadstash_pk PRIMARY KEY (us_id);
ALTER TABLE &mw_prefix.uploadstash ADD CONSTRAINT &mw_prefix.uploadstash_fk1 FOREIGN KEY (us_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
@@ -523,11 +529,19 @@ CREATE TABLE &mw_prefix.job (
job_namespace NUMBER DEFAULT 0 NOT NULL,
job_title VARCHAR2(255) NOT NULL,
job_timestamp TIMESTAMP(6) WITH TIME ZONE NULL,
- job_params CLOB NOT NULL
+ job_params CLOB NOT NULL,
+ job_random NUMBER DEFAULT 0 NOT NULL,
+ job_token VARCHAR2(32),
+ job_token_timestamp TIMESTAMP(6) WITH TIME ZONE,
+ job_sha1 VARCHAR2(32),
+ job_attempts NUMBER DEFAULT 0 NOT NULL
);
ALTER TABLE &mw_prefix.job ADD CONSTRAINT &mw_prefix.job_pk PRIMARY KEY (job_id);
CREATE INDEX &mw_prefix.job_i01 ON &mw_prefix.job (job_cmd, job_namespace, job_title);
CREATE INDEX &mw_prefix.job_i02 ON &mw_prefix.job (job_timestamp);
+CREATE INDEX &mw_prefix.job_i03 ON &mw_prefix.job (job_sha1);
+CREATE INDEX &mw_prefix.job_i04 ON &mw_prefix.job (job_cmd,job_token,job_random);
+CREATE INDEX &mw_prefix.job_i05 ON &mw_prefix.job (job_attempts);
CREATE TABLE &mw_prefix.querycache_info (
qci_type VARCHAR2(32) NOT NULL,
@@ -667,6 +681,39 @@ CREATE TABLE &mw_prefix.module_deps (
);
CREATE UNIQUE INDEX &mw_prefix.module_deps_u01 ON &mw_prefix.module_deps (md_module, md_skin);
+CREATE SEQUENCE sites_site_id_seq MINVALUE 0 START WITH 0;
+CREATE TABLE &mw_prefix.sites (
+ site_id NUMBER NOT NULL,
+ site_global_key VARCHAR2(32) NOT NULL,
+ site_type VARCHAR2(32) NOT NULL,
+ site_group VARCHAR2(32) NOT NULL,
+ site_source VARCHAR2(32) NOT NULL,
+ site_language VARCHAR2(32) NOT NULL,
+ site_protocol VARCHAR2(32) NOT NULL,
+ site_domain VARCHAR2(255) NOT NULL,
+ site_data BLOB NOT NULL,
+ site_forward NUMBER(1) NOT NULL,
+ site_config BLOB NOT NULL
+);
+ALTER TABLE &mw_prefix.sites ADD CONSTRAINT &mw_prefix.sites_pk PRIMARY KEY (site_id);
+CREATE UNIQUE INDEX &mw_prefix.sites_u01 ON &mw_prefix.sites (site_global_key);
+CREATE INDEX &mw_prefix.sites_i01 ON &mw_prefix.sites (site_type);
+CREATE INDEX &mw_prefix.sites_i02 ON &mw_prefix.sites (site_group);
+CREATE INDEX &mw_prefix.sites_i03 ON &mw_prefix.sites (site_source);
+CREATE INDEX &mw_prefix.sites_i04 ON &mw_prefix.sites (site_language);
+CREATE INDEX &mw_prefix.sites_i05 ON &mw_prefix.sites (site_protocol);
+CREATE INDEX &mw_prefix.sites_i06 ON &mw_prefix.sites (site_domain);
+CREATE INDEX &mw_prefix.sites_i07 ON &mw_prefix.sites (site_forward);
+
+CREATE TABLE &mw_prefix.site_identifiers (
+ si_site NUMBER NOT NULL,
+ si_type VARCHAR2(32) NOT NULL,
+ si_key VARCHAR2(32) NOT NULL
+);
+CREATE UNIQUE INDEX &mw_prefix.site_identifiers_u01 ON &mw_prefix.site_identifiers (si_type, si_key);
+CREATE INDEX &mw_prefix.site_identifiers_i01 ON &mw_prefix.site_identifiers (si_site);
+CREATE INDEX &mw_prefix.site_identifiers_i02 ON &mw_prefix.site_identifiers (si_key);
+
-- do not prefix this table as it breaks parserTests
CREATE TABLE wiki_field_info_full (
table_name VARCHAR2(35) NOT NULL,
diff --git a/maintenance/orphans.php b/maintenance/orphans.php
index 78f98f5a..3b1a9b0e 100644
--- a/maintenance/orphans.php
+++ b/maintenance/orphans.php
@@ -87,7 +87,7 @@ class Orphans extends Maintenance {
FROM $revision LEFT OUTER JOIN $page ON rev_page=page_id
WHERE page_id IS NULL
" );
- $orphans = $dbw->numRows( $result );
+ $orphans = $result->numRows();
if ( $orphans > 0 ) {
global $wgContLang;
$this->output( "$orphans orphan revisions...\n" );
@@ -139,7 +139,7 @@ class Orphans extends Maintenance {
FROM $page LEFT OUTER JOIN $revision ON page_latest=rev_id
WHERE rev_id IS NULL
" );
- $widows = $dbw->numRows( $result );
+ $widows = $result->numRows();
if ( $widows > 0 ) {
$this->output( "$widows childless pages...\n" );
$this->output( sprintf( "%10s %11s %2s %s\n", 'page_id', 'page_latest', 'ns', 'page_title' ) );
diff --git a/maintenance/parse.php b/maintenance/parse.php
index b0ab6244..58e76b0a 100644
--- a/maintenance/parse.php
+++ b/maintenance/parse.php
@@ -109,7 +109,7 @@ class CLIParser extends Maintenance {
*
* @return Title object
*/
- protected function getTitle( ) {
+ protected function getTitle() {
$title =
$this->getOption( 'title' )
? $this->getOption( 'title' )
diff --git a/maintenance/populateFilearchiveSha1.php b/maintenance/populateFilearchiveSha1.php
new file mode 100644
index 00000000..27e692d1
--- /dev/null
+++ b/maintenance/populateFilearchiveSha1.php
@@ -0,0 +1,107 @@
+<?php
+/**
+ * Optional upgrade script to populate the fa_sha1 field
+ *
+ * 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 Maintenance
+ */
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+/**
+ * Maintenance script to populate the fa_sha1 field.
+ *
+ * @ingroup Maintenance
+ * @since 1.21
+ */
+class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Populate the fa_sha1 field from fa_storage_key";
+ }
+
+ protected function getUpdateKey() {
+ return 'populate fa_sha1';
+ }
+
+ protected function updateSkippedMessage() {
+ return 'fa_sha1 column of filearchive table already populated.';
+ }
+
+ public function doDBUpdates() {
+ $startTime = microtime( true );
+ $dbw = wfGetDB( DB_MASTER );
+ $table = 'filearchive';
+ $conds = array( 'fa_sha1' => '', 'fa_storage_key IS NOT NULL' );
+
+ if ( !$dbw->fieldExists( $table, 'fa_sha1', __METHOD__ ) ) {
+ $this->output( "fa_sha1 column does not exist\n\n", true );
+ return false;
+ }
+
+ $this->output( "Populating fa_sha1 field from fa_storage_key\n" );
+ $endId = $dbw->selectField( $table, 'MAX(fa_id)', false, __METHOD__ );
+
+ $batchSize = $this->mBatchSize;
+ $done = 0;
+
+ do {
+ $res = $dbw->select(
+ $table,
+ array( 'fa_id', 'fa_storage_key' ),
+ $conds,
+ __METHOD__,
+ array( 'LIMIT' => $batchSize )
+ );
+
+ $i = 0;
+ foreach ( $res as $row ) {
+ if ( $row->fa_storage_key == '' ) {
+ // Revision was missing pre-deletion
+ continue;
+ }
+ $sha1 = LocalRepo::getHashFromKey( $row->fa_storage_key );
+ $dbw->update( $table,
+ array( 'fa_sha1' => $sha1 ),
+ array( 'fa_id' => $row->fa_id ),
+ __METHOD__
+ );
+ $lastId = $row->fa_id;
+ $i++;
+ }
+
+ $done += $i;
+ if( $i !== $batchSize ) {
+ break;
+ }
+
+ // print status and let slaves catch up
+ $this->output( sprintf(
+ "id %d done (up to %d), %5.3f%% \r", $lastId, $endId, $lastId / $endId * 100 ) );
+ wfWaitForSlaves();
+ } while( true );
+
+ $processingTime = microtime( true ) - $startTime;
+ $this->output( sprintf( "\nDone %d files in %.1f seconds\n", $done, $processingTime ) );
+
+ return true; // we only updated *some* files, don't log
+ }
+}
+
+$maintClass = "PopulateFilearchiveSha1";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/populateLogUsertext.php b/maintenance/populateLogUsertext.php
index 059b6fe2..fa9d512f 100644
--- a/maintenance/populateLogUsertext.php
+++ b/maintenance/populateLogUsertext.php
@@ -83,4 +83,3 @@ class PopulateLogUsertext extends LoggedUpdateMaintenance {
$maintClass = "PopulateLogUsertext";
require_once( RUN_MAINTENANCE_IF_MAIN );
-
diff --git a/maintenance/populateRevisionLength.php b/maintenance/populateRevisionLength.php
index 6c835f4e..7c529d53 100644
--- a/maintenance/populateRevisionLength.php
+++ b/maintenance/populateRevisionLength.php
@@ -48,7 +48,11 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
$db = $this->getDB( DB_MASTER );
if ( !$db->tableExists( 'revision' ) ) {
$this->error( "revision table does not exist", true );
+ } else if ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
+ $this->output( "rev_sha1 column does not exist\n\n", true );
+ return false;
}
+
$this->output( "Populating rev_len column\n" );
$start = $db->selectField( 'revision', 'MIN(rev_id)', false, __METHOD__ );
@@ -63,10 +67,11 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
$blockEnd = intval( $start ) + $this->mBatchSize - 1;
$count = 0;
$missing = 0;
+ $fields = Revision::selectFields();
while ( $blockStart <= $end ) {
$this->output( "...doing rev_id from $blockStart to $blockEnd\n" );
$res = $db->select( 'revision',
- Revision::selectFields(),
+ $fields,
array( "rev_id >= $blockStart",
"rev_id <= $blockEnd",
"rev_len IS NULL" ),
@@ -74,16 +79,16 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
# Go through and update rev_len from these rows.
foreach ( $res as $row ) {
$rev = new Revision( $row );
- $text = $rev->getRawText();
- if ( !is_string( $text ) ) {
+ $content = $rev->getContent();
+ if ( !$content ) {
# This should not happen, but sometimes does (bug 20757)
- $this->output( "Text of revision {$row->rev_id} unavailable!\n" );
+ $this->output( "Content of revision {$row->rev_id} unavailable!\n" );
$missing++;
}
else {
# Update the row...
$db->update( 'revision',
- array( 'rev_len' => strlen( $text ) ),
+ array( 'rev_len' => $content->getSize() ),
array( 'rev_id' => $row->rev_id ),
__METHOD__ );
$count++;
diff --git a/maintenance/populateRevisionSha1.php b/maintenance/populateRevisionSha1.php
index 2e14d31e..113eef49 100644
--- a/maintenance/populateRevisionSha1.php
+++ b/maintenance/populateRevisionSha1.php
@@ -48,6 +48,9 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
$this->error( "revision table does not exist", true );
} elseif ( !$db->tableExists( 'archive' ) ) {
$this->error( "archive table does not exist", true );
+ } else if ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
+ $this->output( "rev_sha1 column does not exist\n\n", true );
+ return false;
}
$this->output( "Populating rev_sha1 column\n" );
@@ -143,14 +146,14 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
$rev = ( $table === 'archive' )
? Revision::newFromArchiveRow( $row )
: new Revision( $row );
- $text = $rev->getRawText();
+ $text = $rev->getSerializedData();
} catch ( MWException $e ) {
- $this->output( "Text of revision with {$idCol}={$row->$idCol} unavailable!\n" );
+ $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( "Text of revision with {$idCol}={$row->$idCol} unavailable!\n" );
+ $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
return false;
} else {
$db->update( $table,
@@ -174,10 +177,10 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
$this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
return false; // bug 22624?
}
- $text = $rev->getRawText();
+ $text = $rev->getSerializedData();
if ( !is_string( $text ) ) {
# This should not happen, but sometimes does (bug 20757)
- $this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
+ $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.
diff --git a/maintenance/postgres/archives/patch-sites.sql b/maintenance/postgres/archives/patch-sites.sql
new file mode 100644
index 00000000..a4f9ed9e
--- /dev/null
+++ b/maintenance/postgres/archives/patch-sites.sql
@@ -0,0 +1,31 @@
+CREATE SEQUENCE sites_site_id_seq;
+CREATE TABLE sites (
+ site_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('sites_site_id_seq'),
+ site_global_key TEXT NOT NULL,
+ site_type TEXT NOT NULL,
+ site_group TEXT NOT NULL,
+ site_source TEXT NOT NULL,
+ site_language TEXT NOT NULL,
+ site_protocol TEXT NOT NULL,
+ site_domain TEXT NOT NULL,
+ site_data TEXT NOT NULL,
+ site_forward SMALLINT NOT NULL,
+ site_config TEXT NOT NULL
+);
+CREATE UNIQUE INDEX site_global_key ON sites (site_global_key);
+CREATE INDEX site_type ON sites (site_type);
+CREATE INDEX site_group ON sites (site_group);
+CREATE INDEX site_source ON sites (site_source);
+CREATE INDEX site_language ON sites (site_language);
+CREATE INDEX site_protocol ON sites (site_protocol);
+CREATE INDEX site_domain ON sites (site_domain);
+CREATE INDEX site_forward ON sites (site_forward);
+
+CREATE TABLE site_identifiers (
+ si_site INTEGER NOT NULL,
+ si_type TEXT NOT NULL,
+ si_key TEXT NOT NULL
+);
+CREATE UNIQUE INDEX si_type_key ON site_identifiers (si_type, si_key);
+CREATE INDEX si_site ON site_identifiers (si_site);
+CREATE INDEX si_key ON site_identifiers (si_key);
diff --git a/maintenance/postgres/archives/patch-testrun.sql b/maintenance/postgres/archives/patch-testrun.sql
index c15300b5..a131b5da 100644
--- a/maintenance/postgres/archives/patch-testrun.sql
+++ b/maintenance/postgres/archives/patch-testrun.sql
@@ -26,5 +26,5 @@ CREATE TABLE testitem (
ti_run INTEGER NOT NULL REFERENCES testrun(tr_id) ON DELETE CASCADE,
ti_name TEXT NOT NULL,
ti_success SMALLINT NOT NULL
-);
+);
CREATE UNIQUE INDEX testitem_uniq ON testitem(ti_run, ti_name);
diff --git a/maintenance/postgres/tables.sql b/maintenance/postgres/tables.sql
index 3ac19cb4..9cbabfdf 100644
--- a/maintenance/postgres/tables.sql
+++ b/maintenance/postgres/tables.sql
@@ -79,7 +79,8 @@ CREATE TABLE page (
page_random NUMERIC(15,14) NOT NULL DEFAULT RANDOM(),
page_touched TIMESTAMPTZ,
page_latest INTEGER NOT NULL, -- FK?
- page_len INTEGER NOT NULL
+ page_len INTEGER NOT NULL,
+ page_content_model TEXT
);
CREATE UNIQUE INDEX page_unique_name ON page (page_namespace, page_title);
CREATE INDEX page_main_title ON page (page_title text_pattern_ops) WHERE page_namespace = 0;
@@ -104,18 +105,20 @@ CREATE TRIGGER page_deleted AFTER DELETE ON page
CREATE SEQUENCE revision_rev_id_seq;
CREATE TABLE revision (
- rev_id INTEGER NOT NULL UNIQUE DEFAULT nextval('revision_rev_id_seq'),
- rev_page INTEGER NULL REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
- rev_text_id INTEGER NULL, -- FK
- rev_comment TEXT,
- rev_user INTEGER NOT NULL REFERENCES mwuser(user_id) ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED,
- rev_user_text TEXT NOT NULL,
- rev_timestamp TIMESTAMPTZ NOT NULL,
- rev_minor_edit SMALLINT NOT NULL DEFAULT 0,
- rev_deleted SMALLINT NOT NULL DEFAULT 0,
- rev_len INTEGER NULL,
- rev_parent_id INTEGER NULL,
- rev_sha1 TEXT NOT NULL DEFAULT ''
+ rev_id INTEGER NOT NULL UNIQUE DEFAULT nextval('revision_rev_id_seq'),
+ rev_page INTEGER NULL REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+ rev_text_id INTEGER NULL, -- FK
+ rev_comment TEXT,
+ rev_user INTEGER NOT NULL REFERENCES mwuser(user_id) ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED,
+ rev_user_text TEXT NOT NULL,
+ rev_timestamp TIMESTAMPTZ NOT NULL,
+ rev_minor_edit SMALLINT NOT NULL DEFAULT 0,
+ rev_deleted SMALLINT NOT NULL DEFAULT 0,
+ rev_len INTEGER NULL,
+ rev_parent_id INTEGER NULL,
+ rev_sha1 TEXT NOT NULL DEFAULT '',
+ rev_content_model TEXT,
+ rev_content_format TEXT
);
CREATE UNIQUE INDEX revision_unique ON revision (rev_page, rev_id);
CREATE INDEX rev_text_id_idx ON revision (rev_text_id);
@@ -151,24 +154,27 @@ CREATE TABLE page_props (
);
ALTER TABLE page_props ADD CONSTRAINT page_props_pk PRIMARY KEY (pp_page,pp_propname);
CREATE INDEX page_props_propname ON page_props (pp_propname);
+CREATE UNIQUE INDEX pp_propname_page ON page_props (pp_propname,pp_page);
CREATE TABLE archive (
- ar_namespace SMALLINT NOT NULL,
- ar_title TEXT NOT NULL,
- ar_text TEXT, -- technically should be bytea, but not used anymore
- ar_page_id INTEGER NULL,
- ar_parent_id INTEGER NULL,
- ar_sha1 TEXT NOT NULL DEFAULT '',
- ar_comment TEXT,
- ar_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
- ar_user_text TEXT NOT NULL,
- ar_timestamp TIMESTAMPTZ NOT NULL,
- ar_minor_edit SMALLINT NOT NULL DEFAULT 0,
- ar_flags TEXT,
- ar_rev_id INTEGER,
- ar_text_id INTEGER,
- ar_deleted SMALLINT NOT NULL DEFAULT 0,
- ar_len INTEGER NULL
+ ar_namespace SMALLINT NOT NULL,
+ ar_title TEXT NOT NULL,
+ ar_text TEXT, -- technically should be bytea, but not used anymore
+ ar_page_id INTEGER NULL,
+ ar_parent_id INTEGER NULL,
+ ar_sha1 TEXT NOT NULL DEFAULT '',
+ ar_comment TEXT,
+ ar_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+ ar_user_text TEXT NOT NULL,
+ ar_timestamp TIMESTAMPTZ NOT NULL,
+ ar_minor_edit SMALLINT NOT NULL DEFAULT 0,
+ ar_flags TEXT,
+ ar_rev_id INTEGER,
+ ar_text_id INTEGER,
+ ar_deleted SMALLINT NOT NULL DEFAULT 0,
+ ar_len INTEGER NULL,
+ ar_content_model TEXT,
+ ar_content_format TEXT
);
CREATE INDEX archive_name_title_timestamp ON archive (ar_namespace,ar_title,ar_timestamp);
CREATE INDEX archive_user_text ON archive (ar_user_text);
@@ -353,12 +359,14 @@ CREATE TABLE filearchive (
fa_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
fa_user_text TEXT NOT NULL,
fa_timestamp TIMESTAMPTZ,
- fa_deleted SMALLINT NOT NULL DEFAULT 0
+ fa_deleted SMALLINT NOT NULL DEFAULT 0,
+ fa_sha1 TEXT NOT NULL DEFAULT ''
);
CREATE INDEX fa_name_time ON filearchive (fa_name, fa_timestamp);
CREATE INDEX fa_dupe ON filearchive (fa_storage_group, fa_storage_key);
CREATE INDEX fa_notime ON filearchive (fa_deleted_timestamp);
CREATE INDEX fa_nouser ON filearchive (fa_deleted_user);
+CREATE INDEX fa_sha1 ON filearchive (fa_sha1);
CREATE SEQUENCE uploadstash_us_id_seq;
CREATE TYPE media_type AS ENUM ('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE');
@@ -516,13 +524,21 @@ CREATE INDEX ls_log_id ON log_search (ls_log_id);
CREATE SEQUENCE job_job_id_seq;
CREATE TABLE job (
- job_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('job_job_id_seq'),
- job_cmd TEXT NOT NULL,
- job_namespace SMALLINT NOT NULL,
- job_title TEXT NOT NULL,
- job_timestamp TIMESTAMPTZ,
- job_params TEXT NOT NULL
-);
+ job_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('job_job_id_seq'),
+ job_cmd TEXT NOT NULL,
+ job_namespace SMALLINT NOT NULL,
+ job_title TEXT NOT NULL,
+ job_timestamp TIMESTAMPTZ,
+ job_params TEXT NOT NULL,
+ job_random INTEGER NOT NULL DEFAULT 0,
+ job_attempts INTEGER NOT NULL DEFAULT 0,
+ job_token TEXT NOT NULL DEFAULT '',
+ job_token_timestamp TIMESTAMPTZ,
+ job_sha1 TEXT NOT NULL DEFAULT ''
+);
+CREATE INDEX job_sha1 ON job (job_sha1);
+CREATE INDEX job_cmd_token ON job (job_cmd, job_token, job_random);
+CREATE INDEX job_cmd_token_id ON job (job_cmd, job_token, job_id);
CREATE INDEX job_cmd_namespace_title ON job (job_cmd, job_namespace, job_title);
CREATE INDEX job_timestamp_idx ON job (job_timestamp);
@@ -684,3 +700,35 @@ CREATE TABLE module_deps (
md_deps TEXT NOT NULL
);
CREATE UNIQUE INDEX md_module_skin ON module_deps (md_module, md_skin);
+
+CREATE SEQUENCE sites_site_id_seq;
+CREATE TABLE sites (
+ site_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('sites_site_id_seq'),
+ site_global_key TEXT NOT NULL,
+ site_type TEXT NOT NULL,
+ site_group TEXT NOT NULL,
+ site_source TEXT NOT NULL,
+ site_language TEXT NOT NULL,
+ site_protocol TEXT NOT NULL,
+ site_domain TEXT NOT NULL,
+ site_data TEXT NOT NULL,
+ site_forward SMALLINT NOT NULL,
+ site_config TEXT NOT NULL
+);
+CREATE UNIQUE INDEX site_global_key ON sites (site_global_key);
+CREATE INDEX site_type ON sites (site_type);
+CREATE INDEX site_group ON sites (site_group);
+CREATE INDEX site_source ON sites (site_source);
+CREATE INDEX site_language ON sites (site_language);
+CREATE INDEX site_protocol ON sites (site_protocol);
+CREATE INDEX site_domain ON sites (site_domain);
+CREATE INDEX site_forward ON sites (site_forward);
+
+CREATE TABLE site_identifiers (
+ si_site INTEGER NOT NULL,
+ si_type TEXT NOT NULL,
+ si_key TEXT NOT NULL
+);
+CREATE UNIQUE INDEX si_type_key ON site_identifiers (si_type, si_key);
+CREATE INDEX si_site ON site_identifiers (si_site);
+CREATE INDEX si_key ON site_identifiers (si_key);
diff --git a/maintenance/preprocessDump.php b/maintenance/preprocessDump.php
index 5952fd96..bb3d68b0 100644
--- a/maintenance/preprocessDump.php
+++ b/maintenance/preprocessDump.php
@@ -78,8 +78,14 @@ class PreprocessDump extends DumpIterator {
* @param $rev Revision
*/
public function processRevision( $rev ) {
+ $content = $rev->getContent( Revision::RAW );
+
+ if ( $content->getModel() !== CONTENT_MODEL_WIKITEXT ) {
+ return;
+ }
+
try {
- $this->mPreprocessor->preprocessToObj( $rev->getText(), 0 );
+ $this->mPreprocessor->preprocessToObj( strval( $content->getNativeData() ), 0 );
}
catch(Exception $e) {
$this->error("Caught exception " . $e->getMessage() . " in " . $rev->getTitle()->getPrefixedText() );
@@ -89,4 +95,3 @@ class PreprocessDump extends DumpIterator {
$maintClass = "PreprocessDump";
require_once( RUN_MAINTENANCE_IF_MAIN );
-
diff --git a/maintenance/preprocessorFuzzTest.php b/maintenance/preprocessorFuzzTest.php
index a53bc88c..49c7aee3 100644
--- a/maintenance/preprocessorFuzzTest.php
+++ b/maintenance/preprocessorFuzzTest.php
@@ -26,7 +26,7 @@ require_once( __DIR__ . '/commandLine.inc' );
$wgHooks['BeforeParserFetchTemplateAndtitle'][] = 'PPFuzzTester::templateHook';
class PPFuzzTester {
- var $hairs = array(
+ public $hairs = array(
'[[', ']]', '{{', '{{', '}}', '}}', '{{{', '}}}',
'<', '>', '<nowiki', '<gallery', '</nowiki>', '</gallery>', '<nOwIkI>', '</NoWiKi>',
'<!--' , '-->',
@@ -39,12 +39,12 @@ class PPFuzzTester {
// extensions
// '<ref>', '</ref>', '<references/>',
);
- var $minLength = 0;
- var $maxLength = 20;
- var $maxTemplates = 5;
- // var $outputTypes = array( 'OT_HTML', 'OT_WIKI', 'OT_PREPROCESS' );
- var $entryPoints = array( 'testSrvus', 'testPst', 'testPreprocess' );
- var $verbose = false;
+ public $minLength = 0;
+ public $maxLength = 20;
+ public $maxTemplates = 5;
+ // public $outputTypes = array( 'OT_HTML', 'OT_WIKI', 'OT_PREPROCESS' );
+ public $entryPoints = array( 'testSrvus', 'testPst', 'testPreprocess' );
+ public $verbose = false;
static $currentTest = false;
function execute() {
@@ -140,7 +140,7 @@ class PPFuzzTester {
}
class PPFuzzTest {
- var $templates, $mainText, $title, $entryPoint, $output;
+ public $templates, $mainText, $title, $entryPoint, $output;
function __construct( $tester ) {
global $wgMaxSigChars;
@@ -219,7 +219,7 @@ class PPFuzzTest {
}
class PPFuzzUser extends User {
- var $ppfz_test, $mDataLoaded;
+ public $ppfz_test, $mDataLoaded;
function load() {
if ( $this->mDataLoaded ) {
diff --git a/maintenance/protect.php b/maintenance/protect.php
index 2f6aa1ae..ff13bd6e 100644
--- a/maintenance/protect.php
+++ b/maintenance/protect.php
@@ -58,6 +58,7 @@ class Protect extends Maintenance {
$this->error( "Invalid username", true );
}
+ // @todo FIXME: This is reset 7 lines down.
$restrictions = array( 'edit' => $protection, 'move' => $protection );
$t = Title::newFromText( $this->getArg() );
diff --git a/maintenance/proxyCheck.php b/maintenance/proxyCheck.php
new file mode 100644
index 00000000..2ccf703e
--- /dev/null
+++ b/maintenance/proxyCheck.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Command line script to check for an open proxy at a specified location.
+ *
+ * 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 Maintenance
+ */
+
+if( PHP_SAPI != 'cli' ) {
+ die( 1 );
+}
+
+/**
+ *
+ */
+$output = '';
+
+/**
+ * Exit if there are not enough parameters, or if it's not command line mode
+ */
+if ( ( isset( $_REQUEST ) && array_key_exists( 'argv', $_REQUEST ) ) || count( $argv ) < 4 ) {
+ $output .= "Incorrect parameters\n";
+} else {
+ /**
+ * Get parameters
+ */
+ $ip = $argv[1];
+ $port = $argv[2];
+ $url = $argv[3];
+ $host = trim(`hostname`);
+ $output = "Connecting to $ip:$port, target $url, this hostname $host\n";
+
+ # Open socket
+ $sock = @fsockopen($ip, $port, $errno, $errstr, 5);
+ if ($errno == 0 ) {
+ $output .= "Connected\n";
+ # Send payload
+ $request = "GET $url HTTP/1.0\r\n";
+# $request .= "Proxy-Connection: Keep-Alive\r\n";
+# $request .= "Pragma: no-cache\r\n";
+# $request .= "Host: ".$url."\r\n";
+# $request .= "User-Agent: MediaWiki open proxy check\r\n";
+ $request .= "\r\n";
+ @fputs($sock, $request);
+ $response = fgets($sock, 65536);
+ $output .= $response;
+ @fclose($sock);
+ } else {
+ $output .= "No connection\n";
+ }
+}
+
+$output = escapeshellarg( $output );
+
+#`echo $output >> /home/tstarling/open/proxy.log`;
diff --git a/maintenance/proxy_check.php b/maintenance/proxy_check.php
deleted file mode 100644
index 10892c42..00000000
--- a/maintenance/proxy_check.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * Command line script to check for an open proxy at a specified location.
- *
- * 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 Maintenance
- */
-
-if( php_sapi_name() != 'cli' ) {
- die( 1 );
-}
-
-/**
- *
- */
-$output = '';
-
-/**
- * Exit if there are not enough parameters, or if it's not command line mode
- */
-if ( ( isset( $_REQUEST ) && array_key_exists( 'argv', $_REQUEST ) ) || count( $argv ) < 4 ) {
- $output .= "Incorrect parameters\n";
-} else {
- /**
- * Get parameters
- */
- $ip = $argv[1];
- $port = $argv[2];
- $url = $argv[3];
- $host = trim(`hostname`);
- $output = "Connecting to $ip:$port, target $url, this hostname $host\n";
-
- # Open socket
- $sock = @fsockopen($ip, $port, $errno, $errstr, 5);
- if ($errno == 0 ) {
- $output .= "Connected\n";
- # Send payload
- $request = "GET $url HTTP/1.0\r\n";
-# $request .= "Proxy-Connection: Keep-Alive\r\n";
-# $request .= "Pragma: no-cache\r\n";
-# $request .= "Host: ".$url."\r\n";
-# $request .= "User-Agent: MediaWiki open proxy check\r\n";
- $request .= "\r\n";
- @fputs($sock, $request);
- $response = fgets($sock, 65536);
- $output .= $response;
- @fclose($sock);
- } else {
- $output .= "No connection\n";
- }
-}
-
-$output = escapeshellarg( $output );
-
-#`echo $output >> /home/tstarling/open/proxy.log`;
diff --git a/maintenance/purgeList.php b/maintenance/purgeList.php
index 4b3c3821..b72c417e 100644
--- a/maintenance/purgeList.php
+++ b/maintenance/purgeList.php
@@ -32,22 +32,27 @@ class PurgeList extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Send purge requests for listed pages to squid";
- $this->addOption( 'purge', 'Whether to update page_touched.' , false, false );
+ $this->addOption( 'purge', 'Whether to update page_touched.', false, false );
$this->addOption( 'namespace', 'Namespace number', false, true );
+ $this->addOption( 'all', 'Purge all pages', false, false );
+ $this->addOption( 'delay', 'Number of seconds to delay between each purge', false, true );
+ $this->addOption( 'verbose', 'Show more output', false, false, 'v' );
$this->setBatchSize( 100 );
}
public function execute() {
- if( $this->hasOption( 'namespace' ) ) {
- $this->purgeNamespace();
+ if ( $this->hasOption( 'all' ) ) {
+ $this->purgeNamespace( false );
+ } elseif ( $this->hasOption( 'namespace' ) ) {
+ $this->purgeNamespace( intval( $this->getOption( 'namespace') ) );
} else {
- $this->purgeList();
+ $this->doPurge();
}
$this->output( "Done!\n" );
}
/** Purge URL coming from stdin */
- private function purgeList() {
+ private function doPurge() {
$stdin = $this->getStdin();
$urls = array();
@@ -69,56 +74,41 @@ class PurgeList extends Maintenance {
}
}
}
+ $this->output( "Purging " . count( $urls ). " urls\n" );
$this->sendPurgeRequest( $urls );
}
- /** Purge a namespace given by --namespace */
- private function purgeNamespace() {
+ /** Purge a namespace or all pages */
+ private function purgeNamespace( $namespace = false ) {
$dbr = wfGetDB( DB_SLAVE );
- $ns = $dbr->addQuotes( $this->getOption( 'namespace') );
-
- $result = $dbr->select(
- array( 'page' ),
- array( 'page_namespace', 'page_title' ),
- array( "page_namespace = $ns" ),
- __METHOD__,
- array( 'ORDER BY' => 'page_id' )
- );
-
- $start = 0;
- $end = $dbr->numRows( $result );
- $this->output( "Will purge $end pages from namespace $ns\n" );
-
- # Do remaining chunk
- $end += $this->mBatchSize - 1;
- $blockStart = $start;
- $blockEnd = $start + $this->mBatchSize - 1;
-
- while( $blockEnd <= $end ) {
- # Select pages we will purge:
- $result = $dbr->select(
- array( 'page' ),
- array( 'page_namespace', 'page_title' ),
- array( "page_namespace = $ns" ),
+ $startId = 0;
+ if ( $namespace === false ) {
+ $conds = array();
+ } else {
+ $conds = array( 'page_namespace' => $namespace );
+ }
+ while ( true ) {
+ $res = $dbr->select( 'page',
+ array( 'page_id', 'page_namespace', 'page_title' ),
+ $conds + array( 'page_id > ' . $dbr->addQuotes( $startId ) ),
__METHOD__,
- array( # conditions
- 'ORDER BY' => 'page_id',
- 'LIMIT' => $this->mBatchSize,
- 'OFFSET' => $blockStart,
+ array(
+ 'LIMIT' => $this->mBatchSize,
+ 'ORDER BY' => 'page_id'
+
)
);
- # Initialize/reset URLs to be purged
+ if ( !$res->numRows() ) {
+ break;
+ }
$urls = array();
- foreach( $result as $row ) {
+ foreach ( $res as $row ) {
$title = Title::makeTitle( $row->page_namespace, $row->page_title );
$url = $title->getInternalUrl();
$urls[] = $url;
+ $startId = $row->page_id;
}
-
$this->sendPurgeRequest( $urls );
-
- $blockStart += $this->mBatchSize;
- $blockEnd += $this->mBatchSize;
}
}
@@ -127,9 +117,23 @@ class PurgeList extends Maintenance {
* @param $urls array List of URLS to purge from squids
*/
private function sendPurgeRequest( $urls ) {
- $this->output( "Purging " . count( $urls ). " urls\n" );
- $u = new SquidUpdate( $urls );
- $u->doUpdate();
+ if ( $this->hasOption( 'delay' ) ) {
+ $delay = floatval( $this->getOption( 'delay' ) );
+ foreach ( $urls as $url ) {
+ if ( $this->hasOption( 'verbose' ) ) {
+ $this->output( $url . "\n" );
+ }
+ $u = new SquidUpdate( array( $url ) );
+ $u->doUpdate();
+ usleep( $delay * 1e6 );
+ }
+ } else {
+ if ( $this->hasOption( 'verbose' ) ) {
+ $this->output( implode( "\n", $urls ) . "\n" );
+ }
+ $u = new SquidUpdate( $urls );
+ $u->doUpdate();
+ }
}
}
diff --git a/maintenance/purgeParserCache.php b/maintenance/purgeParserCache.php
index 1c417980..e21dd176 100644
--- a/maintenance/purgeParserCache.php
+++ b/maintenance/purgeParserCache.php
@@ -30,7 +30,7 @@ require( __DIR__ . '/Maintenance.php' );
* @ingroup Maintenance
*/
class PurgeParserCache extends Maintenance {
- var $lastProgress;
+ public $lastProgress;
function __construct() {
parent::__construct();
@@ -52,21 +52,19 @@ class PurgeParserCache extends Maintenance {
global $wgParserCacheExpireTime;
$date = wfTimestamp( TS_MW, time() + $wgParserCacheExpireTime - intval( $inputAge ) );
} else {
- echo "Must specify either --expiredate or --age\n";
- exit( 1 );
+ $this->error( "Must specify either --expiredate or --age", 1 );
}
$english = Language::factory( 'en' );
- echo "Deleting objects expiring before " . $english->timeanddate( $date ) . "\n";
+ $this->output( "Deleting objects expiring before " . $english->timeanddate( $date ) . "\n" );
$pc = wfGetParserCacheStorage();
$success = $pc->deleteObjectsExpiringBefore( $date, array( $this, 'showProgress' ) );
if ( !$success ) {
- echo "\nCannot purge this kind of parser cache.\n";
- exit( 1 );
+ $this->error( "\nCannot purge this kind of parser cache.", 1 );
}
$this->showProgress( 100 );
- echo "\nDone\n";
+ $this->output( "\nDone\n" );
}
function showProgress( $percent ) {
@@ -77,8 +75,8 @@ class PurgeParserCache extends Maintenance {
$this->lastProgress = $percentString;
$stars = floor( $percent / 2 );
- echo '[' . str_repeat( '*', $stars ), str_repeat( '.', 50 - $stars ) . '] ' .
- "$percentString%\r";
+ $this->output( '[' . str_repeat( '*', $stars ) . str_repeat( '.', 50 - $stars ) . '] ' .
+ "$percentString%\r" );
}
}
diff --git a/maintenance/reassignEdits.php b/maintenance/reassignEdits.php
index a91abf93..2d79f363 100644
--- a/maintenance/reassignEdits.php
+++ b/maintenance/reassignEdits.php
@@ -180,4 +180,3 @@ class ReassignEdits extends Maintenance {
$maintClass = "ReassignEdits";
require_once( RUN_MAINTENANCE_IF_MAIN );
-
diff --git a/maintenance/rebuildLocalisationCache.php b/maintenance/rebuildLocalisationCache.php
index 83849de6..db77564b 100644
--- a/maintenance/rebuildLocalisationCache.php
+++ b/maintenance/rebuildLocalisationCache.php
@@ -53,6 +53,15 @@ class RebuildLocalisationCache extends Maintenance {
return '1000M';
}
+ public function finalSetup() {
+ # This script needs to be run to build the inital l10n cache. But if
+ # $wgLanguageCode is not 'en', it won't be able to run because there is
+ # no l10n cache. Break the cycle by forcing $wgLanguageCode = 'en'.
+ global $wgLanguageCode;
+ $wgLanguageCode = 'en';
+ return parent::finalSetup();
+ }
+
public function execute() {
global $wgLocalisationCacheConf;
diff --git a/maintenance/rebuildrecentchanges.php b/maintenance/rebuildrecentchanges.php
index 0278f72c..bfaaab54 100644
--- a/maintenance/rebuildrecentchanges.php
+++ b/maintenance/rebuildrecentchanges.php
@@ -218,24 +218,17 @@ class RebuildRecentchanges extends Maintenance {
* DOCUMENT ME!
*/
private function rebuildRecentChangesTablePass4() {
- global $wgGroupPermissions, $wgUseRCPatrol;
+ global $wgUseRCPatrol;
$dbw = wfGetDB( DB_MASTER );
list( $recentchanges, $usergroups, $user ) = $dbw->tableNamesN( 'recentchanges', 'user_groups', 'user' );
- $botgroups = $autopatrolgroups = array();
- foreach ( $wgGroupPermissions as $group => $rights ) {
- if ( isset( $rights['bot'] ) && $rights['bot'] ) {
- $botgroups[] = $dbw->addQuotes( $group );
- }
- if ( $wgUseRCPatrol && isset( $rights['autopatrol'] ) && $rights['autopatrol'] ) {
- $autopatrolgroups[] = $dbw->addQuotes( $group );
- }
- }
+ $botgroups = User::getGroupsWithPermission( 'bot' );
+ $autopatrolgroups = $wgUseRCPatrol ? User::getGroupsWithPermission( 'autopatrol' ) : array();
# Flag our recent bot edits
if ( !empty( $botgroups ) ) {
- $botwhere = implode( ',', $botgroups );
+ $botwhere = $dbw->makeList( $botgroups );
$botusers = array();
$this->output( "Flagging bot account edits...\n" );
@@ -259,7 +252,7 @@ class RebuildRecentchanges extends Maintenance {
global $wgMiserMode;
# Flag our recent autopatrolled edits
if ( !$wgMiserMode && !empty( $autopatrolgroups ) ) {
- $patrolwhere = implode( ',', $autopatrolgroups );
+ $patrolwhere = $dbw->makeList( $autopatrolgroups );
$patrolusers = array();
$this->output( "Flagging auto-patrolled edits...\n" );
diff --git a/maintenance/rebuildtextindex.php b/maintenance/rebuildtextindex.php
index 41b245f8..534b7ca1 100644
--- a/maintenance/rebuildtextindex.php
+++ b/maintenance/rebuildtextindex.php
@@ -92,22 +92,37 @@ class RebuildTextIndex extends Maintenance {
$this->output( "Rebuilding index fields for {$count} pages...\n" );
$n = 0;
+ $fields = array_merge(
+ Revision::selectPageFields(),
+ Revision::selectFields(),
+ Revision::selectTextFields()
+ );
+
while ( $n < $count ) {
if ( $n ) {
$this->output( $n . "\n" );
}
$end = $n + self::RTI_CHUNK_SIZE - 1;
- $res = $this->db->select( array( 'page', 'revision', 'text' ),
- array( 'page_id', 'page_namespace', 'page_title', 'old_flags', 'old_text' ),
+ $res = $this->db->select( array( 'page', 'revision', 'text' ), $fields,
array( "page_id BETWEEN $n AND $end", 'page_latest = rev_id', 'rev_text_id = old_id' ),
__METHOD__
- );
+ );
foreach ( $res as $s ) {
- $revtext = Revision::getRevisionText( $s );
- $u = new SearchUpdate( $s->page_id, $s->page_title, $revtext );
- $u->doUpdate();
+ try {
+ $title = Title::makeTitle( $s->page_namespace, $s->page_title );
+
+ $rev = new Revision( $s );
+ $content = $rev->getContent();
+ $text = $content->getTextForSearchIndex();
+
+ $u = new SearchUpdate( $s->page_id, $title, $text );
+ $u->doUpdate();
+ } catch ( MWContentSerializationException $ex ) {
+ $this->output( "Failed to deserialize content of revision {$s->rev_id} of page "
+ . "`" . $title->getPrefixedDBkey() . "`!\n" );
+ }
}
$n += self::RTI_CHUNK_SIZE;
}
diff --git a/maintenance/refreshFileHeaders.php b/maintenance/refreshFileHeaders.php
new file mode 100644
index 00000000..74f0f35d
--- /dev/null
+++ b/maintenance/refreshFileHeaders.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Refresh file headers from metadata.
+ *
+ * Usage: php refreshFileHeaders.php
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to refresh file headers from metadata
+ *
+ * @ingroup Maintenance
+ */
+class RefreshFileHeaders extends Maintenance {
+ function __construct() {
+ parent::__construct();
+ $this->mDescription = 'Script to update file HTTP headers';
+ $this->addOption( 'verbose', 'Output information about each file.', false, false, 'v' );
+ $this->addOption( 'start', 'Name of file to start with', false, true );
+ $this->addOption( 'end', 'Name of file to end with', false, true );
+ $this->setBatchSize( 200 );
+ }
+
+ public function execute() {
+ $repo = RepoGroup::singleton()->getLocalRepo();
+ $start = str_replace( ' ', '_', $this->getOption( 'start', '' ) ); // page on img_name
+ $end = str_replace( ' ', '_', $this->getOption( 'end', '' ) ); // page on img_name
+
+ $count = 0;
+ $dbr = wfGetDB( DB_SLAVE );
+ do {
+ $conds = array( "img_name > {$dbr->addQuotes( $start )}" );
+ if ( strlen( $end ) ) {
+ $conds[] = "img_name <= {$dbr->addQuotes( $end )}";
+ }
+ $res = $dbr->select( 'image', '*', $conds,
+ __METHOD__, array( 'LIMIT' => $this->mBatchSize, 'ORDER BY' => 'img_name ASC' ) );
+ foreach ( $res as $row ) {
+ $file = $repo->newFileFromRow( $row );
+ $headers = $file->getStreamHeaders();
+ if ( count( $headers ) ) {
+ $this->updateFileHeaders( $file, $headers );
+ }
+ // Do all of the older file versions...
+ foreach ( $file->getHistory() as $oldFile ) {
+ $headers = $oldFile->getStreamHeaders();
+ if ( count( $headers ) ) {
+ $this->updateFileHeaders( $oldFile, $headers );
+ }
+ }
+ if ( $this->hasOption( 'verbose' ) ) {
+ $this->output( "Updated headers for file '{$row->img_name}'.\n" );
+ }
+ ++$count;
+ $start = $row->img_name; // advance
+ }
+ } while ( $res->numRows() > 0 );
+
+ $this->output( "Done. Updated headers for $count file(s).\n" );
+ }
+
+ protected function updateFileHeaders( File $file, array $headers ) {
+ $status = $file->getRepo()->getBackend()->describe( array(
+ 'src' => $file->getPath(), 'headers' => $headers
+ ) );
+ if ( !$status->isGood() ) {
+ $this->error( "Encountered error: " . print_r( $status, true ) );
+ }
+ }
+}
+
+$maintClass = 'RefreshFileHeaders';
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/refreshImageMetadata.php b/maintenance/refreshImageMetadata.php
index 12da7a8b..55f5b4aa 100644
--- a/maintenance/refreshImageMetadata.php
+++ b/maintenance/refreshImageMetadata.php
@@ -53,7 +53,7 @@ class RefreshImageMetadata extends Maintenance {
$this->addOption( 'start', 'Name of file to start with', false, true );
$this->addOption( 'end', 'Name of file to end with', false, true );
- $this->addOption( 'mime', '(Inefficient!) Only refresh files with this mime type. Can accept wild-card image/*' , false, true );
+ $this->addOption( 'mime', '(Inefficient!) Only refresh files with this mime type. Can accept wild-card image/*', false, true );
$this->addOption( 'metadata-contains', '(Inefficient!) Only refresh files where the img_metadata field contains this string. Can be used if its known a specific property was being extracted incorrectly.', false, true );
}
diff --git a/maintenance/refreshLinks.php b/maintenance/refreshLinks.php
index 3d9270b8..7b255664 100644
--- a/maintenance/refreshLinks.php
+++ b/maintenance/refreshLinks.php
@@ -105,7 +105,7 @@ class RefreshLinks extends Maintenance {
array(),
array( 'redirect' => array( "LEFT JOIN", "page_id=rd_from" ) )
);
- $num = $dbr->numRows( $res );
+ $num = $res->numRows();
$this->output( "Refreshing $num old redirects from $start...\n" );
$i = 0;
@@ -126,7 +126,7 @@ class RefreshLinks extends Maintenance {
"page_id >= $start" ),
__METHOD__
);
- $num = $dbr->numRows( $res );
+ $num = $res->numRows();
$this->output( "$num new articles...\n" );
$i = 0;
@@ -176,8 +176,16 @@ class RefreshLinks extends Maintenance {
}
/**
- * Update the redirect entry for a given page
- * @param $id int The page_id of the redirect
+ * Update the redirect entry for a given page.
+ *
+ * This methods bypasses the "redirect" table to get the redirect target,
+ * and parses the page's content to fetch it. This allows to be sure that
+ * the redirect target is up to date and valid.
+ * This is particularly useful when modifying namespaces to be sure the
+ * entry in the "redirect" table points to the correct page and not to an
+ * invalid one.
+ *
+ * @param $id int The page ID to check
*/
private function fixRedirect( $id ) {
$page = WikiPage::newFromID( $id );
@@ -191,14 +199,25 @@ class RefreshLinks extends Maintenance {
return;
}
- $rt = $page->getRedirectTarget();
+ $rt = null;
+ $content = $page->getContent( Revision::RAW );
+ if ( $content !== null ) {
+ $rt = $content->getUltimateRedirectTarget();
+ }
if ( $rt === null ) {
// The page is not a redirect
// Delete any redirect table entry for it
- $dbw->delete( 'redirect', array( 'rd_from' => $id ),
- __METHOD__ );
+ $dbw->delete( 'redirect', array( 'rd_from' => $id ), __METHOD__ );
+ $fieldValue = 0;
+ } else {
+ $page->insertRedirectEntry( $rt );
+ $fieldValue = 1;
}
+
+ // Update the page table to be sure it is an a consistent state
+ $dbw->update( 'page', array( 'page_is_redirect' => $fieldValue ),
+ array( 'page_id' => $id ), __METHOD__ );
}
/**
@@ -206,8 +225,6 @@ class RefreshLinks extends Maintenance {
* @param $id int The page_id
*/
public static function fixLinksFromArticle( $id ) {
- global $wgParser, $wgContLang;
-
$page = WikiPage::newFromID( $id );
LinkCache::singleton()->clear();
@@ -216,18 +233,16 @@ class RefreshLinks extends Maintenance {
return;
}
- $text = $page->getRawText();
- if ( $text === false ) {
+ $content = $page->getContent( Revision::RAW );
+ if ( $content === null ) {
return;
}
$dbw = wfGetDB( DB_MASTER );
$dbw->begin( __METHOD__ );
- $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
- $parserOutput = $wgParser->parse( $text, $page->getTitle(), $options, true, true, $page->getLatest() );
- $update = new LinksUpdate( $page->getTitle(), $parserOutput, false );
- $update->doUpdate();
+ $updates = $content->getSecondaryDataUpdates( $page->getTitle() );
+ DataUpdate::runUpdates( $updates );
$dbw->commit( __METHOD__ );
}
diff --git a/maintenance/removeUnusedAccounts.php b/maintenance/removeUnusedAccounts.php
index 8bc27c18..b4528ca0 100644
--- a/maintenance/removeUnusedAccounts.php
+++ b/maintenance/removeUnusedAccounts.php
@@ -77,6 +77,8 @@ class RemoveUnusedAccounts extends Maintenance {
$this->output( "\nDeleting inactive accounts..." );
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'user', array( 'user_id' => $del ), __METHOD__ );
+ $dbw->delete( 'logging', array( 'log_user' => $del ), __METHOD__ );
+ $dbw->delete( 'recentchanges', array( 'rc_user' => $del ), __METHOD__ );
$this->output( "done.\n" );
# Update the site_stats.ss_users field
$users = $dbw->selectField( 'user', 'COUNT(*)', array(), __METHOD__ );
@@ -97,8 +99,13 @@ class RemoveUnusedAccounts extends Maintenance {
*/
private function isInactiveAccount( $id, $master = false ) {
$dbo = wfGetDB( $master ? DB_MASTER : DB_SLAVE );
- $checks = array( 'revision' => 'rev', 'archive' => 'ar', 'logging' => 'log',
- 'image' => 'img', 'oldimage' => 'oi', 'filearchive' => 'fa' );
+ $checks = array(
+ 'revision' => 'rev',
+ 'archive' => 'ar',
+ 'image' => 'img',
+ 'oldimage' => 'oi',
+ 'filearchive' => 'fa'
+ );
$count = 0;
$dbo->begin( __METHOD__ );
@@ -106,6 +113,10 @@ class RemoveUnusedAccounts extends Maintenance {
$conds = array( $fprefix . '_user' => $id );
$count += (int)$dbo->selectField( $table, 'COUNT(*)', $conds, __METHOD__ );
}
+
+ $conds = array( 'log_user' => $id, 'log_type != ' . $dbo->addQuotes( 'newusers' ) );
+ $count += (int)$dbo->selectField( 'logging', 'COUNT(*)', $conds, __METHOD__ );
+
$dbo->commit( __METHOD__ );
return $count == 0;
diff --git a/maintenance/renderDump.php b/maintenance/renderDump.php
index 24bedfa4..2ba2b3dc 100644
--- a/maintenance/renderDump.php
+++ b/maintenance/renderDump.php
@@ -80,8 +80,6 @@ class DumpRenderer extends Maintenance {
* @param $rev Revision
*/
public function handleRevision( $rev ) {
- global $wgParserConf;
-
$title = $rev->getTitle();
if ( !$title ) {
$this->error( "Got bogus revision with null title!" );
@@ -100,10 +98,10 @@ class DumpRenderer extends Maintenance {
$this->output( sprintf( "%s\n", $filename, $display ) );
$user = new User();
- $parser = new $wgParserConf['class']();
$options = ParserOptions::newFromUser( $user );
- $output = $parser->parse( $rev->getText(), $title, $options );
+ $content = $rev->getContent();
+ $output = $content->getParserOutput( $title, null, $options );
file_put_contents( $filename,
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" " .
diff --git a/maintenance/runJobs.php b/maintenance/runJobs.php
index e909bc06..b1be714c 100644
--- a/maintenance/runJobs.php
+++ b/maintenance/runJobs.php
@@ -52,6 +52,11 @@ class RunJobs extends Maintenance {
public function execute() {
global $wgTitle;
+
+ if ( wfReadOnly() ) {
+ $this->error( "Unable to run jobs; the wiki is in read-only mode.", 1 ); // die
+ }
+
if ( $this->hasOption( 'procs' ) ) {
$procs = intval( $this->getOption( 'procs' ) );
if ( $procs < 1 || $procs > 1000 ) {
@@ -68,44 +73,64 @@ class RunJobs extends Maintenance {
$type = $this->getOption( 'type', false );
$wgTitle = Title::newFromText( 'RunJobs.php' );
$dbw = wfGetDB( DB_MASTER );
- $n = 0;
+ $jobsRun = 0; // counter
- if ( $type === false ) {
- $conds = Job::defaultQueueConditions( );
- } else {
- $conds = array( 'job_cmd' => $type );
+ $group = JobQueueGroup::singleton();
+ // Handle any required periodic queue maintenance
+ $count = $group->executeReadyPeriodicTasks();
+ if ( $count > 0 ) {
+ $this->runJobsLog( "Executed $count periodic queue task(s)." );
}
- while ( $dbw->selectField( 'job', 'job_id', $conds, 'runJobs.php' ) ) {
- $offset = 0;
- for ( ; ; ) {
- $job = !$type ? Job::pop( $offset ) : Job::pop_type( $type );
+ $lastTime = time();
+ do {
+ $job = ( $type === false )
+ ? $group->pop( JobQueueGroup::TYPE_DEFAULT, JobQueueGroup::USE_CACHE )
+ : $group->pop( $type ); // job from a single queue
+ if ( $job ) { // found a job
+ ++$jobsRun;
+ $this->runJobsLog( $job->toString() . " STARTING" );
- if ( !$job ) {
- break;
+ // Run the job...
+ $t = microtime( true );
+ try {
+ $status = $job->run();
+ $error = $job->getLastError();
+ } catch ( MWException $e ) {
+ $status = false;
+ $error = get_class( $e ) . ': ' . $e->getMessage();
+ }
+ $timeMs = intval( ( microtime( true ) - $t ) * 1000 );
+
+ // Mark the job as done on success or when the job cannot be retried
+ if ( $status !== false || !$job->allowRetries() ) {
+ $group->ack( $job ); // done
}
- wfWaitForSlaves();
- $t = microtime( true );
- $offset = $job->id;
- $this->runJobsLog( $job->toString() . " STARTING" );
- $status = $job->run();
- $t = microtime( true ) - $t;
- $timeMs = intval( $t * 1000 );
if ( !$status ) {
- $this->runJobsLog( $job->toString() . " t=$timeMs error={$job->error}" );
+ $this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" );
} else {
$this->runJobsLog( $job->toString() . " t=$timeMs good" );
}
- if ( $maxJobs && ++$n > $maxJobs ) {
- break 2;
+ // Break out if we hit the job count or wall time limits...
+ if ( $maxJobs && $jobsRun >= $maxJobs ) {
+ break;
+ } elseif ( $maxTime && ( time() - $startTime ) > $maxTime ) {
+ break;
}
- if ( $maxTime && time() - $startTime > $maxTime ) {
- break 2;
+
+ // Don't let any of the main DB slaves get backed up
+ $timePassed = time() - $lastTime;
+ if ( $timePassed >= 5 || $timePassed < 0 ) {
+ wfWaitForSlaves();
+ }
+ // Don't let any queue slaves/backups fall behind
+ if ( $jobsRun > 0 && ( $jobsRun % 100 ) == 0 ) {
+ $group->waitForBackups();
}
}
- }
+ } while ( $job ); // stop when there are no jobs
}
/**
diff --git a/maintenance/showCacheStats.php b/maintenance/showCacheStats.php
new file mode 100644
index 00000000..8f238680
--- /dev/null
+++ b/maintenance/showCacheStats.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Show statistics from the cache.
+ *
+ * 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 Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script that shows statistics from the cache.
+ *
+ * @ingroup Maintenance
+ */
+class ShowCacheStats extends Maintenance {
+
+ public function __construct() {
+ $this->mDescription = "Show statistics from the cache";
+ parent::__construct();
+ }
+
+ public function getDbType() {
+ return Maintenance::DB_NONE;
+ }
+
+ public function execute() {
+ global $wgMemc;
+
+ // Can't do stats if
+ if ( get_class( $wgMemc ) == 'EmptyBagOStuff' ) {
+ $this->error( "You are running EmptyBagOStuff, I can not provide any statistics.", true );
+ }
+ $session = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_with_session' ) ) );
+ $noSession = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_without_session' ) ) );
+ $total = $session + $noSession;
+ if ( $total == 0 ) {
+ $this->error( "You either have no stats or the cache isn't running. Aborting.", true );
+ }
+ $this->output( "Requests\n" );
+ $this->output( sprintf( "with session: %-10d %6.2f%%\n", $session, $session / $total * 100 ) );
+ $this->output( sprintf( "without session: %-10d %6.2f%%\n", $noSession, $noSession / $total * 100 ) );
+ $this->output( sprintf( "total: %-10d %6.2f%%\n", $total, 100 ) );
+
+
+ $this->output( "\nParser cache\n" );
+ $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_hit' ) ) );
+ $expired = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_expired' ) ) );
+ $absent = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_absent' ) ) );
+ $stub = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_stub' ) ) );
+ $total = $hits + $expired + $absent + $stub;
+ if ( $total ) {
+ $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
+ $this->output( sprintf( "expired: %-10d %6.2f%%\n", $expired, $expired / $total * 100 ) );
+ $this->output( sprintf( "absent: %-10d %6.2f%%\n", $absent, $absent / $total * 100 ) );
+ $this->output( sprintf( "stub threshold: %-10d %6.2f%%\n", $stub, $stub / $total * 100 ) );
+ $this->output( sprintf( "total: %-10d %6.2f%%\n", $total, 100 ) );
+ } else {
+ $this->output( "no statistics available\n" );
+ }
+
+ $this->output( "\nImage cache\n" );
+ $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_hit' ) ) );
+ $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_miss' ) ) );
+ $updates = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_update' ) ) );
+ $total = $hits + $misses;
+ if ( $total ) {
+ $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
+ $this->output( sprintf( "misses: %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
+ $this->output( sprintf( "updates: %-10d\n", $updates ) );
+ } else {
+ $this->output( "no statistics available\n" );
+ }
+
+ $this->output( "\nDiff cache\n" );
+ $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_hit' ) ) );
+ $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_miss' ) ) );
+ $uncacheable = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_uncacheable' ) ) );
+ $total = $hits + $misses + $uncacheable;
+ if ( $total ) {
+ $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
+ $this->output( sprintf( "misses: %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
+ $this->output( sprintf( "uncacheable: %-10d %6.2f%%\n", $uncacheable, $uncacheable / $total * 100 ) );
+ } else {
+ $this->output( "no statistics available\n" );
+ }
+ }
+}
+
+$maintClass = "ShowCacheStats";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/showJobs.php b/maintenance/showJobs.php
index 1dceb790..8b49517f 100644
--- a/maintenance/showJobs.php
+++ b/maintenance/showJobs.php
@@ -39,21 +39,24 @@ class ShowJobs extends Maintenance {
$this->mDescription = "Show number of jobs waiting in master database";
$this->addOption( 'group', 'Show number of jobs per job type' );
}
+
public function execute() {
- $dbw = wfGetDB( DB_MASTER );
+ $group = JobQueueGroup::singleton();
if ( $this->hasOption( 'group' ) ) {
- $res = $dbw->select(
- 'job',
- array( 'job_cmd', 'count(*) as count' ),
- array(),
- __METHOD__,
- array( 'GROUP BY' => 'job_cmd' )
- );
- foreach ( $res as $row ) {
- $this->output( $row->job_cmd . ': ' . $row->count . "\n" );
+ foreach ( $group->getQueueTypes() as $type ) {
+ $queue = $group->get( $type );
+ $pending = $queue->getSize();
+ $claimed = $queue->getAcquiredCount();
+ if ( ( $pending + $claimed ) > 0 ) {
+ $this->output( "{$type}: $pending queued; $claimed acquired\n" );
+ }
}
} else {
- $this->output( $dbw->selectField( 'job', 'count(*)', '', __METHOD__ ) . "\n" );
+ $count = 0;
+ foreach ( $group->getQueueTypes() as $type ) {
+ $count += $group->get( $type )->getSize();
+ }
+ $this->output( "$count\n" );
}
}
}
diff --git a/maintenance/showSiteStats.php b/maintenance/showSiteStats.php
new file mode 100644
index 00000000..e7359b2f
--- /dev/null
+++ b/maintenance/showSiteStats.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * Show the cached statistics.
+ * Give out the same output as [[Special:Statistics]]
+ *
+ * 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 Maintenance
+ * @author Antoine Musso <hashar at free dot fr>
+ * Based on initSiteStats.php by:
+ * @author Brion Vibber
+ * @author Rob Church <robchur@gmail.com>
+ *
+ * @license GNU General Public License 2.0 or later
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to show the cached statistics.
+ *
+ * @ingroup Maintenance
+ */
+class ShowSiteStats extends Maintenance {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Show the cached statistics";
+ }
+ public function execute() {
+ $fields = array(
+ 'ss_total_views' => 'Total views',
+ 'ss_total_edits' => 'Total edits',
+ 'ss_good_articles' => 'Number of articles',
+ 'ss_total_pages' => 'Total pages',
+ 'ss_users' => 'Number of users',
+ 'ss_images' => 'Number of images',
+ );
+
+ // Get cached stats from slave database
+ $dbr = wfGetDB( DB_SLAVE );
+ $stats = $dbr->selectRow( 'site_stats', '*', '', __METHOD__ );
+
+ // Get maximum size for each column
+ $max_length_value = $max_length_desc = 0;
+ foreach ( $fields as $field => $desc ) {
+ $max_length_value = max( $max_length_value, strlen( $stats->$field ) );
+ $max_length_desc = max( $max_length_desc, strlen( $desc ) ) ;
+ }
+
+ // Show them
+ foreach ( $fields as $field => $desc ) {
+ $this->output( sprintf( "%-{$max_length_desc}s: %{$max_length_value}d\n", $desc, $stats->$field ) );
+ }
+ }
+}
+
+$maintClass = "ShowSiteStats";
+require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/showStats.php b/maintenance/showStats.php
deleted file mode 100644
index 982c7cbb..00000000
--- a/maintenance/showStats.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-/**
- * Show the cached statistics.
- * Give out the same output as [[Special:Statistics]]
- *
- * 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 Maintenance
- * @author Antoine Musso <hashar at free dot fr>
- * Based on initStats.php by:
- * @author Brion Vibber
- * @author Rob Church <robchur@gmail.com>
- *
- * @license GNU General Public License 2.0 or later
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script to show the cached statistics.
- *
- * @ingroup Maintenance
- */
-class ShowStats extends Maintenance {
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Show the cached statistics";
- }
- public function execute() {
- $fields = array(
- 'ss_total_views' => 'Total views',
- 'ss_total_edits' => 'Total edits',
- 'ss_good_articles' => 'Number of articles',
- 'ss_total_pages' => 'Total pages',
- 'ss_users' => 'Number of users',
- 'ss_images' => 'Number of images',
- );
-
- // Get cached stats from slave database
- $dbr = wfGetDB( DB_SLAVE );
- $stats = $dbr->selectRow( 'site_stats', '*', '', __METHOD__ );
-
- // Get maximum size for each column
- $max_length_value = $max_length_desc = 0;
- foreach ( $fields as $field => $desc ) {
- $max_length_value = max( $max_length_value, strlen( $stats->$field ) );
- $max_length_desc = max( $max_length_desc , strlen( $desc ) ) ;
- }
-
- // Show them
- foreach ( $fields as $field => $desc ) {
- $this->output( sprintf( "%-{$max_length_desc}s: %{$max_length_value}d\n", $desc, $stats->$field ) );
- }
- }
-}
-
-$maintClass = "ShowStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
-
diff --git a/maintenance/sql.php b/maintenance/sql.php
index 04e98d91..11699909 100644
--- a/maintenance/sql.php
+++ b/maintenance/sql.php
@@ -33,13 +33,19 @@ class MwSql extends Maintenance {
public function __construct() {
parent::__construct();
$this->mDescription = "Send SQL queries to a MediaWiki database";
+ $this->addOption( 'cluster', 'Use an external cluster by name', false, true );
}
public function execute() {
- $dbw = wfGetDB( DB_MASTER );
- if ( $this->hasArg() ) {
- $fileName = $this->getArg();
- $file = fopen( $fileName, 'r' );
+ // Get a DB handle (with this wiki's DB select) from the appropriate load balancer
+ if ( $this->hasOption( 'cluster' ) ) {
+ $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ) );
+ $dbw = $lb->getConnection( DB_MASTER ); // master for external LB
+ } else {
+ $dbw = wfGetDB( DB_MASTER ); // master for primary LB for this wiki
+ }
+ if ( $this->hasArg( 0 ) ) {
+ $file = fopen( $this->getArg( 0 ), 'r' );
if ( !$file ) {
$this->error( "Unable to open input file", true );
}
@@ -63,26 +69,39 @@ class MwSql extends Maintenance {
}
$wholeLine = '';
- while ( ( $line = Maintenance::readconsole() ) !== false ) {
+ $newPrompt = '> ';
+ $prompt = $newPrompt;
+ while ( ( $line = Maintenance::readconsole( $prompt ) ) !== false ) {
+ if( !$line ) {
+ # User simply pressed return key
+ continue;
+ }
$done = $dbw->streamStatementEnd( $wholeLine, $line );
$wholeLine .= $line;
if ( !$done ) {
+ $wholeLine .= ' ';
+ $prompt = ' -> ';
continue;
}
if ( $useReadline ) {
- readline_add_history( $wholeLine );
+ # Delimiter is eated by streamStatementEnd, we add it
+ # up in the history (bug 37020)
+ readline_add_history( $wholeLine . $dbw->getDelimiter() );
readline_write_history( $historyFile );
}
try{
$res = $dbw->query( $wholeLine );
$this->sqlPrintResult( $res, $dbw );
+ $prompt = $newPrompt;
$wholeLine = '';
} catch (DBQueryError $e) {
- $this->error( $e, true );
+ $doDie = ! Maintenance::posix_isatty( 0 );
+ $this->error( $e, $doDie );
}
}
+ wfWaitForSlaves();
}
/**
@@ -93,6 +112,7 @@ class MwSql extends Maintenance {
public function sqlPrintResult( $res, $db ) {
if ( !$res ) {
// Do nothing
+ return;
} elseif ( is_object( $res ) && $res->numRows() ) {
foreach ( $res as $row ) {
$this->output( print_r( $row, true ) );
diff --git a/maintenance/sqlite.inc b/maintenance/sqlite.inc
index a8a1fce6..16568ac7 100644
--- a/maintenance/sqlite.inc
+++ b/maintenance/sqlite.inc
@@ -43,6 +43,8 @@ class Sqlite {
* Checks given files for correctness of SQL syntax. MySQL DDL will be converted to
* SQLite-compatible during processing.
* Will throw exceptions on SQL errors
+ * @param $files
+ * @throws MWException
* @return mixed true if no error or error string in case of errors
*/
public static function checkSqlSyntax( $files ) {
diff --git a/maintenance/sqlite/archives/patch-drop-ss_admins.sql b/maintenance/sqlite/archives/patch-drop-ss_admins.sql
new file mode 100644
index 00000000..9951e17e
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-drop-ss_admins.sql
@@ -0,0 +1,22 @@
+-- field is deprecated and no longer updated as of 1.5
+CREATE TABLE /*_*/site_stats_tmp (
+ ss_row_id int unsigned NOT NULL,
+ ss_total_views bigint unsigned default 0,
+ ss_total_edits bigint unsigned default 0,
+ ss_good_articles bigint unsigned default 0,
+ ss_total_pages bigint default '-1',
+ ss_users bigint default '-1',
+ ss_active_users bigint default '-1',
+ ss_images int default 0
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/site_stats_tmp
+ SELECT ss_row_id, ss_total_views, ss_total_edits, ss_good_articles,
+ ss_total_pages, ss_users, ss_active_users, ss_images
+ FROM /*_*/site_stats;
+
+DROP TABLE /*_*/site_stats;
+
+ALTER TABLE /*_*/site_stats_tmp RENAME TO /*_*/site_stats;
+
+CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id); \ No newline at end of file
diff --git a/maintenance/sqlite/archives/patch-job_token.sql b/maintenance/sqlite/archives/patch-job_token.sql
new file mode 100644
index 00000000..4e4d28fd
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-job_token.sql
@@ -0,0 +1,8 @@
+ALTER TABLE /*_*/job ADD COLUMN job_random integer unsigned NOT NULL default 0;
+ALTER TABLE /*_*/job ADD COLUMN job_token varbinary(32) NOT NULL default '';
+ALTER TABLE /*_*/job ADD COLUMN job_sha1 varbinary(32) NOT NULL default '';
+ALTER TABLE /*_*/job ADD COLUMN job_token_timestamp varbinary(14) NULL default NULL;
+
+CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
+CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
+
diff --git a/maintenance/sqlite/archives/patch-profiling.sql b/maintenance/sqlite/archives/patch-profiling.sql
new file mode 100644
index 00000000..4a07283c
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-profiling.sql
@@ -0,0 +1,12 @@
+-- profiling table
+-- This is optional
+
+CREATE TABLE /*_*/profiling (
+ pf_count int NOT NULL default 0,
+ pf_time float NOT NULL default 0,
+ pf_memory float NOT NULL default 0,
+ pf_name varchar(255) NOT NULL default '',
+ pf_server varchar(30) NOT NULL default ''
+);
+
+CREATE UNIQUE INDEX /*i*/pf_name_server ON /*_*/profiling (pf_name, pf_server);
diff --git a/maintenance/sqlite/archives/patch-rc_moved.sql b/maintenance/sqlite/archives/patch-rc_moved.sql
new file mode 100644
index 00000000..70248d54
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-rc_moved.sql
@@ -0,0 +1,46 @@
+-- rc_moved_to_ns and rc_moved_to_title is no longer used, delete the fields
+
+CREATE TABLE /*_*/recentchanges_tmp (
+ rc_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ rc_timestamp varbinary(14) NOT NULL default '',
+ rc_cur_time varbinary(14) NOT NULL default '',
+ rc_user int unsigned NOT NULL default 0,
+ rc_user_text varchar(255) binary NOT NULL,
+ rc_namespace int NOT NULL default 0,
+ rc_title varchar(255) binary NOT NULL default '',
+ rc_comment varchar(255) binary NOT NULL default '',
+ rc_minor tinyint unsigned NOT NULL default 0,
+ rc_bot tinyint unsigned NOT NULL default 0,
+ rc_new tinyint unsigned NOT NULL default 0,
+ rc_cur_id int unsigned NOT NULL default 0,
+ rc_this_oldid int unsigned NOT NULL default 0,
+ rc_last_oldid int unsigned NOT NULL default 0,
+ rc_type tinyint unsigned NOT NULL default 0,
+ rc_patrolled tinyint unsigned NOT NULL default 0,
+ rc_ip varbinary(40) NOT NULL default '',
+ rc_old_len int,
+ rc_new_len int,
+ rc_deleted tinyint unsigned NOT NULL default 0,
+ rc_logid int unsigned NOT NULL default 0,
+ rc_log_type varbinary(255) NULL default NULL,
+ rc_log_action varbinary(255) NULL default NULL,
+ rc_params blob NULL
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/recentchanges_tmp
+ SELECT rc_id, rc_timestamp, rc_cur_time, rc_user, rc_user_text, rc_namespace, rc_title, rc_comment,
+ rc_minor, rc_bot, rc_new, rc_cur_id, rc_this_oldid, rc_last_oldid, rc_type, rc_patrolled, rc_ip,
+ rc_old_len, rc_new_len, rc_deleted, rc_logid, rc_log_type, rc_log_action, rc_params
+ FROM /*_*/recentchanges;
+
+DROP TABLE /*_*/recentchanges;
+
+ALTER TABLE /*_*/recentchanges_tmp RENAME TO /*_*/recentchanges;
+
+CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp);
+CREATE INDEX /*i*/rc_namespace_title ON /*_*/recentchanges (rc_namespace, rc_title);
+CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id);
+CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp);
+CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip);
+CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text);
+CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp);
diff --git a/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql b/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
index 851a6b37..fd4c9ec7 100644
--- a/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
+++ b/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
@@ -1,4 +1,4 @@
---
+--
-- Recreates the iwl_prefix for the iwlinks table
--
DROP INDEX IF EXISTS /*i*/iwl_prefix;
diff --git a/maintenance/sqlite/archives/patch-sites.sql b/maintenance/sqlite/archives/patch-sites.sql
new file mode 100644
index 00000000..88392748
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-sites.sql
@@ -0,0 +1,71 @@
+-- Patch to add the sites and site_identifiers tables.
+-- Licence: GNU GPL v2+
+-- Author: Jeroen De Dauw < jeroendedauw@gmail.com >
+
+
+-- Holds all the sites known to the wiki.
+CREATE TABLE IF NOT EXISTS /*_*/sites (
+-- Numeric id of the site
+ site_id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+
+ -- Global identifier for the site, ie 'enwiktionary'
+ site_global_key varbinary(32) NOT NULL,
+
+ -- Type of the site, ie 'mediawiki'
+ site_type varbinary(32) NOT NULL,
+
+ -- Group of the site, ie 'wikipedia'
+ site_group varbinary(32) NOT NULL,
+
+ -- Source of the site data, ie 'local', 'wikidata', 'my-magical-repo'
+ site_source varbinary(32) NOT NULL,
+
+ -- Language code of the sites primary language.
+ site_language varbinary(32) NOT NULL,
+
+ -- Protocol of the site, ie 'http://', 'irc://', '//'
+ -- This field is an index for lookups and is build from type specific data in site_data.
+ site_protocol varbinary(32) NOT NULL,
+
+ -- Domain of the site in reverse order, ie 'org.mediawiki.www.'
+ -- This field is an index for lookups and is build from type specific data in site_data.
+ site_domain VARCHAR(255) NOT NULL,
+
+ -- Type dependent site data.
+ site_data BLOB NOT NULL,
+
+ -- If site.tld/path/key:pageTitle should forward users to the page on
+ -- the actual site, where "key" is the local identifier.
+ site_forward bool NOT NULL,
+
+ -- Type dependent site config.
+ -- For instance if template transclusion should be allowed if it's a MediaWiki.
+ site_config BLOB NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/sites_global_key ON /*_*/sites (site_global_key);
+CREATE INDEX /*i*/sites_type ON /*_*/sites (site_type);
+CREATE INDEX /*i*/sites_group ON /*_*/sites (site_group);
+CREATE INDEX /*i*/sites_source ON /*_*/sites (site_source);
+CREATE INDEX /*i*/sites_language ON /*_*/sites (site_language);
+CREATE INDEX /*i*/sites_protocol ON /*_*/sites (site_protocol);
+CREATE INDEX /*i*/sites_domain ON /*_*/sites (site_domain);
+CREATE INDEX /*i*/sites_forward ON /*_*/sites (site_forward);
+
+
+
+-- Links local site identifiers to their corresponding site.
+CREATE TABLE IF NOT EXISTS /*_*/site_identifiers (
+ -- Key on site.site_id
+ si_site INT UNSIGNED NOT NULL,
+
+ -- local key type, ie 'interwiki' or 'langlink'
+ si_type varbinary(32) NOT NULL,
+
+ -- local key value, ie 'en' or 'wiktionary'
+ si_key varbinary(32) NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/site_ids_type ON /*_*/site_identifiers (si_type, si_key);
+CREATE INDEX /*i*/site_ids_site ON /*_*/site_identifiers (si_site);
+CREATE INDEX /*i*/site_ids_key ON /*_*/site_identifiers (si_key); \ No newline at end of file
diff --git a/maintenance/sqlite/archives/patch-ufg_group-length-increase-255.sql b/maintenance/sqlite/archives/patch-ufg_group-length-increase-255.sql
new file mode 100644
index 00000000..edd0a3dc
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-ufg_group-length-increase-255.sql
@@ -0,0 +1,15 @@
+ CREATE TABLE /*_*/user_former_groups_tmp (
+ ufg_user int unsigned NOT NULL default 0,
+ ufg_group varbinary(255) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/user_former_groups_tmp
+ SELECT ufg_user, ufg_group
+ FROM /*_*/user_former_groups;
+
+DROP TABLE /*_*/user_former_groups;
+
+ALTER TABLE /*_*/user_former_groups_tmp RENAME TO /*_*/user_former_groups;
+
+CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg_group);
+
diff --git a/maintenance/sqlite/archives/patch-ufg_group-length-increase.sql b/maintenance/sqlite/archives/patch-ufg_group-length-increase.sql
deleted file mode 100644
index c6dcea5e..00000000
--- a/maintenance/sqlite/archives/patch-ufg_group-length-increase.sql
+++ /dev/null
@@ -1,15 +0,0 @@
-CREATE TABLE /*_*/user_former_groups_tmp (
- ug_user int unsigned NOT NULL default 0,
- ug_group varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-
-INSERT INTO /*_*/user_former_groups_tmp
- SELECT ug_user, ug_group
- FROM /*_*/user_groups;
-
-DROP TABLE /*_*/user_former_groups;
-
-ALTER TABLE /*_*/user_former_groups_tmp RENAME TO /*_*/user_former_groups;
-
-CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg_group);
-
diff --git a/maintenance/sqlite/archives/patch-ug_group-length-increase-255.sql b/maintenance/sqlite/archives/patch-ug_group-length-increase-255.sql
new file mode 100644
index 00000000..3daeb7c6
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-ug_group-length-increase-255.sql
@@ -0,0 +1,15 @@
+CREATE TABLE /*_*/user_groups_tmp (
+ ug_user int unsigned NOT NULL default 0,
+ ug_group varbinary(255) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/user_groups_tmp
+ SELECT ug_user, ug_group
+ FROM /*_*/user_groups;
+
+DROP TABLE /*_*/user_groups;
+
+ALTER TABLE /*_*/user_groups_tmp RENAME TO /*_*/user_groups;
+
+CREATE UNIQUE INDEX /*i*/ug_user_group ON /*_*/user_groups (ug_user,ug_group);
+CREATE INDEX /*i*/ug_group ON /*_*/user_groups (ug_group);
diff --git a/maintenance/sqlite/archives/patch-ug_group-length-increase.sql b/maintenance/sqlite/archives/patch-ug_group-length-increase.sql
deleted file mode 100644
index 5e810937..00000000
--- a/maintenance/sqlite/archives/patch-ug_group-length-increase.sql
+++ /dev/null
@@ -1,15 +0,0 @@
-CREATE TABLE /*_*/user_groups_tmp (
- ug_user int unsigned NOT NULL default 0,
- ug_group varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-
-INSERT INTO /*_*/user_groups_tmp
- SELECT ug_user, ug_group
- FROM /*_*/user_groups;
-
-DROP TABLE /*_*/user_groups;
-
-ALTER TABLE /*_*/user_groups_tmp RENAME TO /*_*/user_groups;
-
-CREATE UNIQUE INDEX /*i*/ug_user_group ON /*_*/user_groups (ug_user,ug_group);
-CREATE INDEX /*i*/ug_group ON /*_*/user_groups (ug_group);
diff --git a/maintenance/sqlite/archives/searchindex-fts3.sql b/maintenance/sqlite/archives/searchindex-fts3.sql
index 28554c02..2a370940 100644
--- a/maintenance/sqlite/archives/searchindex-fts3.sql
+++ b/maintenance/sqlite/archives/searchindex-fts3.sql
@@ -1,7 +1,7 @@
-- Patch that introduces fulltext search capabilities to SQLite schema
-- Requires that SQLite must be compiled with FTS3 module (comes with core amalgamation).
-- See http://sqlite.org/fts3.html for details of syntax.
--- Will fail if FTS3 is not present,
+-- Will fail if FTS3 is not present,
DROP TABLE IF EXISTS /*_*/searchindex;
CREATE VIRTUAL TABLE /*_*/searchindex USING FTS3(
-- Key to page_id
@@ -10,7 +10,7 @@ CREATE VIRTUAL TABLE /*_*/searchindex USING FTS3(
-- Munged version of title
si_title,
-
+
-- Munged version of body text
si_text
);
diff --git a/maintenance/sqlite/archives/searchindex-no-fts.sql b/maintenance/sqlite/archives/searchindex-no-fts.sql
index bc014b3d..16247ffe 100644
--- a/maintenance/sqlite/archives/searchindex-no-fts.sql
+++ b/maintenance/sqlite/archives/searchindex-no-fts.sql
@@ -17,7 +17,7 @@ CREATE TABLE /*_*/searchindex (
-- Munged version of title
si_title TEXT,
-
+
-- Munged version of body text
si_text TEXT
);
diff --git a/maintenance/stats.php b/maintenance/stats.php
deleted file mode 100644
index be448f99..00000000
--- a/maintenance/stats.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-/**
- * Show statistics from the cache.
- *
- * 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 Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script that shows statistics from the cache.
- *
- * @ingroup Maintenance
- */
-class CacheStats extends Maintenance {
-
- public function __construct() {
- $this->mDescription = "Show statistics from the cache";
- parent::__construct();
- }
-
- public function getDbType() {
- return Maintenance::DB_NONE;
- }
-
- public function execute() {
- global $wgMemc;
-
- // Can't do stats if
- if ( get_class( $wgMemc ) == 'EmptyBagOStuff' ) {
- $this->error( "You are running EmptyBagOStuff, I can not provide any statistics.", true );
- }
- $session = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_with_session' ) ) );
- $noSession = intval( $wgMemc->get( wfMemcKey( 'stats', 'request_without_session' ) ) );
- $total = $session + $noSession;
- if ( $total == 0 ) {
- $this->error( "You either have no stats or the cache isn't running. Aborting.", true );
- }
- $this->output( "Requests\n" );
- $this->output( sprintf( "with session: %-10d %6.2f%%\n", $session, $session / $total * 100 ) );
- $this->output( sprintf( "without session: %-10d %6.2f%%\n", $noSession, $noSession / $total * 100 ) );
- $this->output( sprintf( "total: %-10d %6.2f%%\n", $total, 100 ) );
-
-
- $this->output( "\nParser cache\n" );
- $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_hit' ) ) );
- $expired = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_expired' ) ) );
- $absent = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_absent' ) ) );
- $stub = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_stub' ) ) );
- $total = $hits + $expired + $absent + $stub;
- if ( $total ) {
- $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
- $this->output( sprintf( "expired: %-10d %6.2f%%\n", $expired, $expired / $total * 100 ) );
- $this->output( sprintf( "absent: %-10d %6.2f%%\n", $absent, $absent / $total * 100 ) );
- $this->output( sprintf( "stub threshold: %-10d %6.2f%%\n", $stub, $stub / $total * 100 ) );
- $this->output( sprintf( "total: %-10d %6.2f%%\n", $total, 100 ) );
- } else {
- $this->output( "no statistics available\n" );
- }
-
- $this->output( "\nImage cache\n" );
- $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_hit' ) ) );
- $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_miss' ) ) );
- $updates = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_update' ) ) );
- $total = $hits + $misses;
- if ( $total ) {
- $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
- $this->output( sprintf( "misses: %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
- $this->output( sprintf( "updates: %-10d\n", $updates ) );
- } else {
- $this->output( "no statistics available\n" );
- }
-
- $this->output( "\nDiff cache\n" );
- $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_hit' ) ) );
- $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_miss' ) ) );
- $uncacheable = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_uncacheable' ) ) );
- $total = $hits + $misses + $uncacheable;
- if ( $total ) {
- $this->output( sprintf( "hits: %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
- $this->output( sprintf( "misses: %-10d %6.2f%%\n", $misses, $misses / $total * 100 ) );
- $this->output( sprintf( "uncacheable: %-10d %6.2f%%\n", $uncacheable, $uncacheable / $total * 100 ) );
- } else {
- $this->output( "no statistics available\n" );
- }
- }
-}
-
-$maintClass = "CacheStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/storage/blobs.sql b/maintenance/storage/blobs.sql
index 623dd7bf..979e68a9 100644
--- a/maintenance/storage/blobs.sql
+++ b/maintenance/storage/blobs.sql
@@ -4,5 +4,4 @@ CREATE TABLE /*$wgDBprefix*/blobs (
blob_id integer UNSIGNED NOT NULL AUTO_INCREMENT,
blob_text longblob,
PRIMARY KEY (blob_id)
-) ENGINE=MyISAM MAX_ROWS=100000000 AVG_ROW_LENGTH=100000;
-
+) ENGINE=InnoDB;
diff --git a/maintenance/storage/checkStorage.php b/maintenance/storage/checkStorage.php
index 6c669bfa..fd9393f2 100644
--- a/maintenance/storage/checkStorage.php
+++ b/maintenance/storage/checkStorage.php
@@ -38,14 +38,16 @@ if ( !defined( 'MEDIAWIKI' ) ) {
// ----------------------------------------------------------------------------------
/**
+ * Maintenance script to do various checks on external storage.
+ *
* @ingroup Maintenance ExternalStorage
*/
class CheckStorage {
const CONCAT_HEADER = 'O:27:"concatenatedgziphistoryblob"';
- var $oldIdMap, $errors;
- var $dbStore = null;
+ public $oldIdMap, $errors;
+ public $dbStore = null;
- var $errorDescriptions = array(
+ public $errorDescriptions = array(
'restore text' => 'Damaged text, need to be restored from a backup',
'restore revision' => 'Damaged revision row, need to be restored from a backup',
'unfixable' => 'Unexpected errors with no automated fixing method',
diff --git a/maintenance/storage/compressOld.php b/maintenance/storage/compressOld.php
index 4594db71..d6362834 100644
--- a/maintenance/storage/compressOld.php
+++ b/maintenance/storage/compressOld.php
@@ -43,6 +43,11 @@
require_once( __DIR__ . '/../Maintenance.php' );
+/**
+ * Maintenance script that compress the text of a wiki.
+ *
+ * @ingroup Maintenance ExternalStorage
+ */
class CompressOld extends Maintenance {
/**
* @todo document
@@ -110,7 +115,7 @@ class CompressOld extends Maintenance {
do {
$res = $dbw->select( 'text', array( 'old_id','old_flags','old_text' ),
"old_id>=$start", __METHOD__, array( 'ORDER BY' => 'old_id', 'LIMIT' => $chunksize, 'FOR UPDATE' ) );
- if( $dbw->numRows( $res ) == 0 ) {
+ if( $res->numRows() == 0 ) {
break;
}
$last = $start;
@@ -251,7 +256,7 @@ class CompressOld extends Maintenance {
$pageRes = $dbr->select( 'page',
array('page_id', 'page_namespace', 'page_title','page_latest'),
$pageConds + array('page_id' => $pageId), __METHOD__ );
- if ( $dbr->numRows( $pageRes ) == 0 ) {
+ if ( $pageRes->numRows() == 0 ) {
continue;
}
$pageRow = $dbr->fetchObject( $pageRes );
diff --git a/maintenance/storage/drop_content_model_info.sql b/maintenance/storage/drop_content_model_info.sql
new file mode 100644
index 00000000..7bd9aba9
--- /dev/null
+++ b/maintenance/storage/drop_content_model_info.sql
@@ -0,0 +1,7 @@
+ALTER TABLE /*$wgDBprefix*/archive DROP COLUMN ar_content_model;
+ALTER TABLE /*$wgDBprefix*/archive DROP COLUMN ar_content_format;
+
+ALTER TABLE /*$wgDBprefix*/revision DROP COLUMN rev_content_model;
+ALTER TABLE /*$wgDBprefix*/revision DROP COLUMN rev_content_format;
+
+ALTER TABLE /*$wgDBprefix*/page DROP COLUMN page_content_model;
diff --git a/maintenance/storage/dumpRev.php b/maintenance/storage/dumpRev.php
index 6020f22e..39f08f9d 100644
--- a/maintenance/storage/dumpRev.php
+++ b/maintenance/storage/dumpRev.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Get the text of a revision, resolving external storage if needed.
+ *
* 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
@@ -15,11 +17,18 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance ExternalStorage
*/
require_once( __DIR__ . '/../Maintenance.php' );
+/**
+ * Maintenance script that gets the text of a revision,
+ * resolving external storage if needed.
+ *
+ * @ingroup Maintenance ExternalStorage
+ */
class DumpRev extends Maintenance {
public function __construct() {
parent::__construct();
diff --git a/maintenance/storage/fixBug20757.php b/maintenance/storage/fixBug20757.php
index 52ee825c..30cbcf1a 100644
--- a/maintenance/storage/fixBug20757.php
+++ b/maintenance/storage/fixBug20757.php
@@ -23,11 +23,16 @@
require_once( __DIR__ . '/../Maintenance.php' );
+/**
+ * Maintenance script to fix bug 20757.
+ *
+ * @ingroup Maintenance ExternalStorage
+ */
class FixBug20757 extends Maintenance {
- var $batchSize = 10000;
- var $mapCache = array();
- var $mapCacheSize = 0;
- var $maxMapCacheSize = 1000000;
+ public $batchSize = 10000;
+ public $mapCache = array();
+ public $mapCacheSize = 0;
+ public $maxMapCacheSize = 1000000;
function __construct() {
parent::__construct();
@@ -344,4 +349,3 @@ class FixBug20757 extends Maintenance {
$maintClass = 'FixBug20757';
require_once( RUN_MAINTENANCE_IF_MAIN );
-
diff --git a/maintenance/storage/make-blobs b/maintenance/storage/make-blobs
index 36cf9ced..16dcb672 100755
--- a/maintenance/storage/make-blobs
+++ b/maintenance/storage/make-blobs
@@ -6,11 +6,9 @@ if [ -z $2 ];then
fi
if [ -z $3 ]; then
table=blobs
-else
+else
table=$3
fi
echo "CREATE DATABASE $2" | mysql -u wikiadmin -p`wikiadmin_pass` -h $1 && \
sed "s/blobs\>/$table/" blobs.sql | mysql -u wikiadmin -p`wikiadmin_pass` -h $1 $2
-
-
diff --git a/maintenance/storage/moveToExternal.php b/maintenance/storage/moveToExternal.php
index 2dcc25c2..1049e0cc 100644
--- a/maintenance/storage/moveToExternal.php
+++ b/maintenance/storage/moveToExternal.php
@@ -25,7 +25,7 @@ define( 'REPORTING_INTERVAL', 1 );
if ( !defined( 'MEDIAWIKI' ) ) {
require_once( __DIR__ . '/../commandLine.inc' );
- require_once( __DIR__ . '/../../includes/ExternalStoreDB.php' );
+ require_once( __DIR__ . '/../../includes/externalstore/ExternalStoreDB.php' );
require_once( 'resolveStubs.php' );
$fname = 'moveToExternal';
@@ -124,5 +124,3 @@ function moveToExternal( $cluster, $maxID, $minID = 1 ) {
}
}
}
-
-
diff --git a/maintenance/storage/orphanStats.php b/maintenance/storage/orphanStats.php
index 82ee135b..4e246287 100644
--- a/maintenance/storage/orphanStats.php
+++ b/maintenance/storage/orphanStats.php
@@ -1,7 +1,6 @@
<?php
-
/**
- * Show some statistics on the blob_orphans table, created with trackBlobs.php
+ * Show some statistics on the blob_orphans table, created with trackBlobs.php.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -18,10 +17,18 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
+ * @file
* @ingroup Maintenance ExternalStorage
*/
+
require_once( __DIR__ . '/../Maintenance.php' );
+/**
+ * Maintenance script that shows some statistics on the blob_orphans table,
+ * created with trackBlobs.php.
+ *
+ * @ingroup Maintenance ExternalStorage
+ */
class OrphanStats extends Maintenance {
public function __construct() {
parent::__construct();
diff --git a/maintenance/storage/recompressTracked.php b/maintenance/storage/recompressTracked.php
index 4098077f..030a147e 100644
--- a/maintenance/storage/recompressTracked.php
+++ b/maintenance/storage/recompressTracked.php
@@ -42,20 +42,26 @@ Options:
$job = RecompressTracked::newFromCommandLine( $args, $options );
$job->execute();
+/**
+ * Maintenance script that moves blobs indexed by trackBlobs.php to a specified
+ * list of destination clusters, and recompresses them in the process.
+ *
+ * @ingroup Maintenance ExternalStorage
+ */
class RecompressTracked {
- var $destClusters;
- var $batchSize = 1000;
- var $orphanBatchSize = 1000;
- var $reportingInterval = 10;
- var $numProcs = 1;
- var $useDiff, $pageBlobClass, $orphanBlobClass;
- var $slavePipes, $slaveProcs, $prevSlaveId;
- var $copyOnly = false;
- var $isChild = false;
- var $slaveId = false;
- var $noCount = false;
- var $debugLog, $infoLog, $criticalLog;
- var $store;
+ public $destClusters;
+ public $batchSize = 1000;
+ public $orphanBatchSize = 1000;
+ public $reportingInterval = 10;
+ public $numProcs = 1;
+ public $useDiff, $pageBlobClass, $orphanBlobClass;
+ public $slavePipes, $slaveProcs, $prevSlaveId;
+ public $copyOnly = false;
+ public $isChild = false;
+ public $slaveId = false;
+ public $noCount = false;
+ public $debugLog, $infoLog, $criticalLog;
+ public $store;
static $optionsWithArgs = array( 'procs', 'slave-id', 'debug-log', 'info-log', 'critical-log' );
static $cmdLineOptionMap = array(
@@ -517,7 +523,7 @@ class RecompressTracked {
*
* Write the new URL to the text table and set the bt_moved flag.
*
- * This is done in a single transaction to provide restartable behaviour
+ * This is done in a single transaction to provide restartable behavior
* without data loss.
*
* The transaction is kept short to reduce locking.
@@ -670,10 +676,10 @@ class RecompressTracked {
* Class to represent a recompression operation for a single CGZ blob
*/
class CgzCopyTransaction {
- var $parent;
- var $blobClass;
- var $cgz;
- var $referrers;
+ public $parent;
+ public $blobClass;
+ public $cgz;
+ public $referrers;
/**
* Create a transaction from a RecompressTracked object
@@ -803,4 +809,3 @@ class CgzCopyTransaction {
}
}
}
-
diff --git a/maintenance/storage/resolveStubs.php b/maintenance/storage/resolveStubs.php
index 7e288e13..414eab81 100644
--- a/maintenance/storage/resolveStubs.php
+++ b/maintenance/storage/resolveStubs.php
@@ -1,7 +1,7 @@
<?php
/**
- * Script to convert history stubs that point to an external row to direct
- * external pointers.
+ * Convert history stubs that point to an external row to direct external
+ * pointers.
*
* 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
@@ -110,4 +110,3 @@ function resolveStub( $id, $stubText, $flags ) {
), $fname
);
}
-
diff --git a/maintenance/storage/storageTypeStats.php b/maintenance/storage/storageTypeStats.php
index 1afecc4e..3187c318 100644
--- a/maintenance/storage/storageTypeStats.php
+++ b/maintenance/storage/storageTypeStats.php
@@ -113,4 +113,3 @@ SQL;
$maintClass = 'StorageTypeStats';
require_once( RUN_MAINTENANCE_IF_MAIN );
-
diff --git a/maintenance/storage/testCompression.php b/maintenance/storage/testCompression.php
index 998ebe48..e13e1b10 100644
--- a/maintenance/storage/testCompression.php
+++ b/maintenance/storage/testCompression.php
@@ -1,5 +1,7 @@
<?php
/**
+ * Test revision text compression and decompression.
+ *
* 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
@@ -16,8 +18,7 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @ingroup Maintenance
- * @see wfWaitForSlaves()
+ * @ingroup Maintenance ExternalStorage
*/
$optionsWithArgs = array( 'start', 'limit', 'type' );
@@ -65,7 +66,7 @@ $uncompressedSize = 0;
$t = -microtime( true );
foreach ( $res as $row ) {
$revision = new Revision( $row );
- $text = $revision->getText();
+ $text = $revision->getSerializedData();
$uncompressedSize += strlen( $text );
$hashes[$row->rev_id] = md5( $text );
$keys[$row->rev_id] = $blob->addItem( $text );
@@ -98,4 +99,3 @@ foreach ( $keys as $id => $key ) {
}
$t += microtime( true );
printf( "Decompression time: %5.2f ms\n", $t * 1000 );
-
diff --git a/maintenance/storage/trackBlobs.php b/maintenance/storage/trackBlobs.php
index 214168a8..2f3c8c6a 100644
--- a/maintenance/storage/trackBlobs.php
+++ b/maintenance/storage/trackBlobs.php
@@ -37,12 +37,12 @@ $tracker->run();
echo "All done.\n";
class TrackBlobs {
- var $clusters, $textClause;
- var $doBlobOrphans;
- var $trackedBlobs = array();
+ public $clusters, $textClause;
+ public $doBlobOrphans;
+ public $trackedBlobs = array();
- var $batchSize = 1000;
- var $reportingInterval = 10;
+ public $batchSize = 1000;
+ public $reportingInterval = 10;
function __construct( $clusters ) {
$this->clusters = $clusters;
diff --git a/maintenance/syncFileBackend.php b/maintenance/syncFileBackend.php
index a29647b5..158019b7 100644
--- a/maintenance/syncFileBackend.php
+++ b/maintenance/syncFileBackend.php
@@ -34,21 +34,50 @@ class SyncFileBackend extends Maintenance {
parent::__construct();
$this->mDescription = "Sync one file backend with another using the journal";
$this->addOption( 'src', 'Name of backend to sync from', true, true );
- $this->addOption( 'dst', 'Name of destination backend to sync', true, true );
+ $this->addOption( 'dst', 'Name of destination backend to sync', false, true );
$this->addOption( 'start', 'Starting journal ID', false, true );
$this->addOption( 'end', 'Ending journal ID', false, true );
$this->addOption( 'posdir', 'Directory to read/record journal positions', false, true );
+ $this->addOption( 'posdump', 'Just dump current journal position into the position dir.' );
+ $this->addOption( 'postime', 'For position dumps, get the ID at this time', false, true );
$this->addOption( 'verbose', 'Verbose mode', false, false, 'v' );
$this->setBatchSize( 50 );
}
public function execute() {
$src = FileBackendGroup::singleton()->get( $this->getOption( 'src' ) );
- $dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) );
$posDir = $this->getOption( 'posdir' );
$posFile = $posDir ? $posDir . '/' . wfWikiID() : false;
+ if ( $this->hasOption( 'posdump' ) ) {
+ // Just dump the current position into the specified position dir
+ if ( !$this->hasOption( 'posdir' ) ) {
+ $this->error( "Param posdir required!", 1 );
+ }
+ if ( $this->hasOption( 'postime' ) ) {
+ $id = (int)$src->getJournal()->getPositionAtTime( $this->getOption( 'postime' ) );
+ $this->output( "Requested journal position is $id.\n" );
+ } else {
+ $id = (int)$src->getJournal()->getCurrentPosition();
+ $this->output( "Current journal position is $id.\n" );
+ }
+ if ( file_put_contents( $posFile, $id, LOCK_EX ) !== false ) {
+ $this->output( "Saved journal position file.\n" );
+ } else {
+ $this->output( "Could not save journal position file.\n" );
+ }
+ if ( $this->isQuiet() ) {
+ print $id; // give a single machine-readable number
+ }
+ return;
+ }
+
+ if ( !$this->hasOption( 'dst' ) ) {
+ $this->error( "Param dst required!", 1 );
+ }
+ $dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) );
+
$start = $this->getOption( 'start', 0 );
if ( !$start && $posFile && is_dir( $posDir ) ) {
$start = is_file( $posFile )
@@ -67,8 +96,15 @@ class SyncFileBackend extends Maintenance {
$this->output( "Ending journal position is $end.\n" );
}
+ // Periodically update the position file
+ $callback = function( $pos ) use ( $startFromPosFile, $posFile, $start ) {
+ if ( $startFromPosFile && $pos >= $start ) { // successfully advanced
+ file_put_contents( $posFile, $pos, LOCK_EX );
+ }
+ };
+
// Actually sync the dest backend with the reference backend
- $lastOKPos = $this->syncBackends( $src, $dst, $start, $end );
+ $lastOKPos = $this->syncBackends( $src, $dst, $start, $end, $callback );
// Update the sync position file
if ( $startFromPosFile && $lastOKPos >= $start ) { // successfully advanced
@@ -102,9 +138,12 @@ class SyncFileBackend extends Maintenance {
* @param $dst FileBackend
* @param $start integer Starting journal position
* @param $end integer Starting journal position
+ * @param $callback Closure Callback to update any position file
* @return integer|false Journal entry ID or false if there are none
*/
- protected function syncBackends( FileBackend $src, FileBackend $dst, $start, $end ) {
+ protected function syncBackends(
+ FileBackend $src, FileBackend $dst, $start, $end, Closure $callback
+ ) {
$lastOKPos = 0; // failed
$first = true; // first batch
@@ -135,6 +174,7 @@ class SyncFileBackend extends Maintenance {
$status = $this->syncFileBatch( array_keys( $pathsInBatch ), $src, $dst );
if ( $status->isOK() ) {
$lastOKPos = max( $lastOKPos, $lastPosInBatch );
+ $callback( $lastOKPos ); // update position file
} else {
$this->error( print_r( $status->getErrorsArray(), true ) );
break; // no gaps; everything up to $lastPos must be OK
diff --git a/maintenance/tables.sql b/maintenance/tables.sql
index 52b835fd..72b4eb6c 100644
--- a/maintenance/tables.sql
+++ b/maintenance/tables.sql
@@ -86,10 +86,12 @@ CREATE TABLE /*_*/user (
-- Same with passwords.
user_email tinytext NOT NULL,
- -- This is a timestamp which is updated when a user
- -- logs in, logs out, changes preferences, or performs
- -- some other action requiring HTML cache invalidation
- -- to ensure that the UI is updated.
+ -- If the browser sends an If-Modified-Since header, a 304 response is
+ -- suppressed if the value in this field for the current user is later than
+ -- the value in the IMS header. That is, this field is an invalidation timestamp
+ -- for the browser cache of logged-in users. Among other things, it is used
+ -- to prevent pages generated for a previously logged in user from being
+ -- displayed after a session expiry followed by a fresh login.
user_touched binary(14) NOT NULL default '',
-- A pseudorandomly generated value that is stored in
@@ -152,7 +154,7 @@ CREATE TABLE /*_*/user_groups (
-- with particular permissions. A user will have the combined
-- permissions of any group they're explicitly in, plus
-- the implicit '*' and 'user' groups.
- ug_group varbinary(32) NOT NULL default ''
+ ug_group varbinary(255) NOT NULL default ''
) /*$wgDBTableOptions*/;
CREATE UNIQUE INDEX /*i*/ug_user_group ON /*_*/user_groups (ug_user,ug_group);
@@ -164,7 +166,7 @@ CREATE INDEX /*i*/ug_group ON /*_*/user_groups (ug_group);
CREATE TABLE /*_*/user_former_groups (
-- Key to user_id
ufg_user int unsigned NOT NULL default 0,
- ufg_group varbinary(32) NOT NULL default ''
+ ufg_group varbinary(255) NOT NULL default ''
) /*$wgDBTableOptions*/;
CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg_group);
@@ -260,7 +262,10 @@ CREATE TABLE /*_*/page (
page_latest int unsigned NOT NULL,
-- Uncompressed length in bytes of the page's current source text.
- page_len int unsigned NOT NULL
+ page_len int unsigned NOT NULL,
+
+ -- content model, see CONTENT_MODEL_XXX constants
+ page_content_model varbinary(32) DEFAULT NULL
) /*$wgDBTableOptions*/;
CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
@@ -316,7 +321,13 @@ CREATE TABLE /*_*/revision (
rev_parent_id int unsigned default NULL,
-- SHA-1 text content hash in base-36
- rev_sha1 varbinary(32) NOT NULL default ''
+ rev_sha1 varbinary(32) NOT NULL default '',
+
+ -- content model, see CONTENT_MODEL_XXX constants
+ rev_content_model varbinary(32) DEFAULT NULL,
+
+ -- content format, see CONTENT_FORMAT_XXX constants
+ rev_content_format varbinary(64) DEFAULT NULL
) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-- In case tables are created as MyISAM, use row hints for MySQL <5.0 to avoid 4GB limit
@@ -427,7 +438,14 @@ CREATE TABLE /*_*/archive (
ar_parent_id int unsigned default NULL,
-- SHA-1 text content hash in base-36
- ar_sha1 varbinary(32) NOT NULL default ''
+ ar_sha1 varbinary(32) NOT NULL default '',
+
+ -- content model, see CONTENT_MODEL_XXX constants
+ ar_content_model varbinary(32) DEFAULT NULL,
+
+ -- content format, see CONTENT_FORMAT_XXX constants
+ ar_content_format varbinary(64) DEFAULT NULL
+
) /*$wgDBTableOptions*/;
CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
@@ -544,10 +562,10 @@ CREATE UNIQUE INDEX /*i*/cl_from ON /*_*/categorylinks (cl_from,cl_to);
-- callers won't be using an index: fix this?
CREATE INDEX /*i*/cl_sortkey ON /*_*/categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
--- Not really used?
+-- Used by the API (and some extensions)
CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp);
--- For finding rows with outdated collation
+-- FIXME: Not used, delete this
CREATE INDEX /*i*/cl_collation ON /*_*/categorylinks (cl_collation);
--
@@ -689,9 +707,6 @@ CREATE TABLE /*_*/site_stats (
-- Number of users that still edit
ss_active_users bigint default '-1',
- -- Deprecated, no longer updated as of 1.5
- ss_admins int default '-1',
-
-- Number of images, equivalent to SELECT COUNT(*) FROM image
ss_images int default 0
) /*$wgDBTableOptions*/;
@@ -846,7 +861,9 @@ CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
-- Used by Special:Newimages and Special:ListFiles
CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
-- Used in API and duplicate search
-CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1);
+CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1(10));
+-- Used to get media of one type
+CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
--
@@ -884,7 +901,7 @@ CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timest
CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
-- oi_archive_name truncated to 14 to avoid key length overflow
CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name(14));
-CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1);
+CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1(10));
--
@@ -932,7 +949,10 @@ CREATE TABLE /*_*/filearchive (
fa_timestamp binary(14) default '',
-- Visibility of deleted revisions, bitfield
- fa_deleted tinyint unsigned NOT NULL default 0
+ fa_deleted tinyint unsigned NOT NULL default 0,
+
+ -- sha1 hash of file content
+ fa_sha1 varbinary(32) NOT NULL default ''
) /*$wgDBTableOptions*/;
-- pick out by image name
@@ -943,6 +963,8 @@ CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_sto
CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
-- sort by uploader
CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
+-- find file by sha1, 10 bytes will be enough for hashes to be indexed
+CREATE INDEX /*i*/fa_sha1 ON /*_*/filearchive (fa_sha1(10));
--
@@ -976,8 +998,10 @@ CREATE TABLE /*_*/uploadstash (
-- chunk counter starts at 0, current offset is stored in us_size
us_chunk_inx int unsigned NULL,
- -- file properties from File::getPropsFromPath. these may prove unnecessary.
- --
+ -- Serialized file properties from File::getPropsFromPath
+ us_props blob,
+
+ -- file size in bytes
us_size int unsigned NOT NULL,
-- this hash comes from File::sha1Base36(), and is 31 characters
us_sha1 varchar(31) NOT NULL,
@@ -1045,10 +1069,6 @@ CREATE TABLE /*_*/recentchanges (
-- The type of change entry (RC_EDIT,RC_NEW,RC_LOG)
rc_type tinyint unsigned NOT NULL default 0,
- -- These may no longer be used, with the new move log.
- rc_moved_to_ns tinyint unsigned NOT NULL default 0,
- rc_moved_to_title varchar(255) binary NOT NULL default '',
-
-- If the Recent Changes Patrol option is enabled,
-- users may mark edits as having been reviewed to
-- remove a warning flag on the RC list.
@@ -1228,7 +1248,8 @@ CREATE TABLE /*_*/logging (
-- Freeform text. Interpreted as edit history comments.
log_comment varchar(255) NOT NULL default '',
- -- LF separated list of miscellaneous parameters
+ -- miscellaneous parameters:
+ -- LF separated list (old system) or serialized PHP array (new system)
log_params blob NOT NULL,
-- rev_deleted for logs
@@ -1275,9 +1296,27 @@ CREATE TABLE /*_*/job (
-- Any other parameters to the command
-- Stored as a PHP serialized array, or an empty string if there are no parameters
- job_params blob NOT NULL
+ job_params blob NOT NULL,
+
+ -- Random, non-unique, number used for job acquisition (for lock concurrency)
+ job_random integer unsigned NOT NULL default 0,
+
+ -- The number of times this job has been locked
+ job_attempts integer unsigned NOT NULL default 0,
+
+ -- Field that conveys process locks on rows via process UUIDs
+ job_token varbinary(32) NOT NULL default '',
+
+ -- Timestamp when the job was locked
+ job_token_timestamp varbinary(14) NULL default NULL,
+
+ -- Base 36 SHA1 of the job parameters relevant to detecting duplicates
+ job_sha1 varbinary(32) NOT NULL default ''
) /*$wgDBTableOptions*/;
+CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
+CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
+CREATE INDEX /*i*/job_cmd_token_id ON /*_*/job (job_cmd,job_token,job_id);
CREATE INDEX /*i*/job_cmd ON /*_*/job (job_cmd, job_namespace, job_title, job_params(128));
CREATE INDEX /*i*/job_timestamp ON /*_*/job (job_timestamp);
@@ -1382,6 +1421,7 @@ CREATE TABLE /*_*/page_props (
) /*$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);
-- A table to log updates, one text key row per update.
@@ -1479,4 +1519,69 @@ CREATE TABLE /*_*/module_deps (
) /*$wgDBTableOptions*/;
CREATE UNIQUE INDEX /*i*/md_module_skin ON /*_*/module_deps (md_module, md_skin);
+-- Holds all the sites known to the wiki.
+CREATE TABLE /*_*/sites (
+-- Numeric id of the site
+ site_id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+
+ -- Global identifier for the site, ie 'enwiktionary'
+ site_global_key varbinary(32) NOT NULL,
+
+ -- Type of the site, ie 'mediawiki'
+ site_type varbinary(32) NOT NULL,
+
+ -- Group of the site, ie 'wikipedia'
+ site_group varbinary(32) NOT NULL,
+
+ -- Source of the site data, ie 'local', 'wikidata', 'my-magical-repo'
+ site_source varbinary(32) NOT NULL,
+
+ -- Language code of the sites primary language.
+ site_language varbinary(32) NOT NULL,
+
+ -- Protocol of the site, ie 'http://', 'irc://', '//'
+ -- This field is an index for lookups and is build from type specific data in site_data.
+ site_protocol varbinary(32) NOT NULL,
+
+ -- Domain of the site in reverse order, ie 'org.mediawiki.www.'
+ -- This field is an index for lookups and is build from type specific data in site_data.
+ site_domain VARCHAR(255) NOT NULL,
+
+ -- Type dependent site data.
+ site_data BLOB NOT NULL,
+
+ -- If site.tld/path/key:pageTitle should forward users to the page on
+ -- the actual site, where "key" is the local identifier.
+ site_forward bool NOT NULL,
+
+ -- Type dependent site config.
+ -- For instance if template transclusion should be allowed if it's a MediaWiki.
+ site_config BLOB NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/sites_global_key ON /*_*/sites (site_global_key);
+CREATE INDEX /*i*/sites_type ON /*_*/sites (site_type);
+CREATE INDEX /*i*/sites_group ON /*_*/sites (site_group);
+CREATE INDEX /*i*/sites_source ON /*_*/sites (site_source);
+CREATE INDEX /*i*/sites_language ON /*_*/sites (site_language);
+CREATE INDEX /*i*/sites_protocol ON /*_*/sites (site_protocol);
+CREATE INDEX /*i*/sites_domain ON /*_*/sites (site_domain);
+CREATE INDEX /*i*/sites_forward ON /*_*/sites (site_forward);
+
+-- Links local site identifiers to their corresponding site.
+CREATE TABLE /*_*/site_identifiers (
+ -- Key on site.site_id
+ si_site INT UNSIGNED NOT NULL,
+
+ -- local key type, ie 'interwiki' or 'langlink'
+ si_type varbinary(32) NOT NULL,
+
+ -- local key value, ie 'en' or 'wiktionary'
+ si_key varbinary(32) NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/site_ids_type ON /*_*/site_identifiers (si_type, si_key);
+CREATE INDEX /*i*/site_ids_site ON /*_*/site_identifiers (si_site);
+CREATE INDEX /*i*/site_ids_key ON /*_*/site_identifiers (si_key);
+
-- vim: sw=2 sts=2 et
diff --git a/maintenance/term/MWTerm.php b/maintenance/term/MWTerm.php
index ca0f95d2..c52f07cc 100644
--- a/maintenance/term/MWTerm.php
+++ b/maintenance/term/MWTerm.php
@@ -19,12 +19,14 @@
* http://www.gnu.org/copyleft/gpl.html
*
* @file
- * @ingroup Testing
+ * @ingroup Maintenance Testing
* @todo Fixme: Make this more generic
*/
/**
* Terminal that supports ANSI escape sequences.
+ *
+ * @ingroup Maintenance Testing
*/
class AnsiTermColorer {
function __construct() {
@@ -56,6 +58,8 @@ class AnsiTermColorer {
/**
* A colour-less terminal
+ *
+ * @ingroup Maintenance Testing
*/
class DummyTermColorer {
public function color( $color ) {
@@ -66,4 +70,3 @@ class DummyTermColorer {
return '';
}
}
-
diff --git a/maintenance/update.php b/maintenance/update.php
index 877f1366..f69a9b0d 100644
--- a/maintenance/update.php
+++ b/maintenance/update.php
@@ -26,9 +26,8 @@
*/
if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
- echo "You are using PHP version " . phpversion() . " but MediaWiki needs PHP 5.3.2 or higher. ABORTING.\n" .
- "Check if you have a newer php executable with a different name, such as php5.\n";
- die( 1 );
+ require( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
+ wfPHPVersionError( 'cli' );
}
$wgUseMasterForMaintenance = true;
@@ -40,7 +39,6 @@ require_once( __DIR__ . '/Maintenance.php' );
* @ingroup Maintenance
*/
class UpdateMediaWiki extends Maintenance {
-
function __construct() {
parent::__construct();
$this->mDescription = "MediaWiki database updater";
@@ -48,6 +46,8 @@ class UpdateMediaWiki extends Maintenance {
$this->addOption( 'quick', 'Skip 5 second countdown before starting' );
$this->addOption( 'doshared', 'Also update shared tables' );
$this->addOption( 'nopurge', 'Do not purge the objectcache table after updates' );
+ $this->addOption( 'noschema', 'Only do the updates that are not done during schema updates' );
+ $this->addOption( 'schema', 'Output SQL to do the schema updates instead of doing them. Works even when $wgAllowSchemaUpdates is false', false, true );
$this->addOption( 'force', 'Override when $wgAllowSchemaUpdates disables this script' );
}
@@ -83,10 +83,24 @@ class UpdateMediaWiki extends Maintenance {
function execute() {
global $wgVersion, $wgTitle, $wgLang, $wgAllowSchemaUpdates;
- if( !$wgAllowSchemaUpdates && !$this->hasOption( 'force' ) ) {
+ if( !$wgAllowSchemaUpdates && !( $this->hasOption( 'force' ) || $this->hasOption( 'schema' ) || $this->hasOption( 'noschema' ) ) ) {
$this->error( "Do not run update.php on this wiki. If you're seeing this you should\n"
- . "probably ask for some help in performing your schema updates.\n\n"
- . "If you know what you are doing, you can continue with --force", true );
+ . "probably ask for some help in performing your schema updates or use\n"
+ . "the --noschema and --schema options to get an SQL file for someone\n"
+ . "else to inspect and run.\n\n"
+ . "If you know what you are doing, you can continue with --force\n", true );
+ }
+
+ $this->fileHandle = null;
+ if( substr( $this->getOption( 'schema' ), 0, 2 ) === "--" ) {
+ $this->error( "The --schema option requires a file as an argument.\n", true );
+ } else if( $this->hasOption( 'schema' ) ) {
+ $file = $this->getOption( 'schema' );
+ $this->fileHandle = fopen( $file, "w" );
+ if( $this->fileHandle === false ) {
+ $err = error_get_last();
+ $this->error( "Problem opening the schema file for writing: $file\n\t{$err['message']}", true );
+ }
}
$wgLang = Language::factory( 'en' );
@@ -108,6 +122,9 @@ class UpdateMediaWiki extends Maintenance {
$db = wfGetDB( DB_MASTER );
$this->output( "Going to run database updates for " . wfWikiID() . "\n" );
+ if( $db->getType() === 'sqlite' ) {
+ $this->output( "Using SQLite file: '{$db->mDatabaseFile}'\n" );
+ }
$this->output( "Depending on the size of your database this may take a while!\n" );
if ( !$this->hasOption( 'quick' ) ) {
@@ -117,21 +134,40 @@ class UpdateMediaWiki extends Maintenance {
$shared = $this->hasOption( 'doshared' );
- $updates = array( 'core', 'extensions', 'stats' );
- if( !$this->hasOption('nopurge') ) {
- $updates[] = 'purge';
+ $updates = array( 'core', 'extensions' );
+ if( !$this->hasOption('schema') ) {
+ if( $this->hasOption('noschema') ) {
+ $updates[] = 'noschema';
+ }
+ $updates[] = 'stats';
+
+ if( !$this->hasOption('nopurge') ) {
+ $updates[] = 'purge';
+ }
}
$updater = DatabaseUpdater::newForDb( $db, $shared, $this );
$updater->doUpdates( $updates );
foreach( $updater->getPostDatabaseUpdateMaintenance() as $maint ) {
- if ( $updater->updateRowExists( $maint ) ) {
+ $child = $this->runChild( $maint );
+
+ // LoggedUpdateMaintenance is checking the updatelog itself
+ $isLoggedUpdate = is_a( $child, 'LoggedUpdateMaintenance' );
+
+ if ( !$isLoggedUpdate && $updater->updateRowExists( $maint ) ) {
continue;
}
+
$child = $this->runChild( $maint );
$child->execute();
- $updater->insertUpdateRow( $maint );
+ if ( !$isLoggedUpdate ) {
+ $updater->insertUpdateRow( $maint );
+ }
+ }
+
+ if( !$this->hasOption('nopurge') ) {
+ $updater->purgeCache();
}
$this->output( "\nDone.\n" );
diff --git a/maintenance/updateCollation.php b/maintenance/updateCollation.php
index b732508f..a76a1ee6 100644
--- a/maintenance/updateCollation.php
+++ b/maintenance/updateCollation.php
@@ -35,10 +35,10 @@ require_once( __DIR__ . '/Maintenance.php' );
* @ingroup Maintenance
*/
class UpdateCollation extends Maintenance {
- const BATCH_SIZE = 50; // Number of rows to process in one batch
+ const BATCH_SIZE = 10000; // Number of rows to process in one batch
const SYNC_INTERVAL = 20; // Wait for slaves after this many batches
- var $sizeHistogram = array();
+ public $sizeHistogram = array();
public function __construct() {
parent::__construct();
@@ -68,7 +68,7 @@ TEXT;
}
public function execute() {
- global $wgCategoryCollation, $wgMiserMode;
+ global $wgCategoryCollation;
$dbw = $this->getDB( DB_MASTER );
$force = $this->getOption( 'force' );
@@ -82,10 +82,13 @@ TEXT;
$collation = Collation::singleton();
}
- $options = array( 'LIMIT' => self::BATCH_SIZE, 'STRAIGHT_JOIN' );
+ $options = array(
+ 'LIMIT' => self::BATCH_SIZE,
+ 'ORDER BY' => 'cl_to, cl_type, cl_from',
+ 'STRAIGHT_JOIN',
+ );
if ( $force || $dryRun ) {
- $options['ORDER BY'] = 'cl_from, cl_to';
$collationConds = array();
} else {
if ( $this->hasOption( 'previous-collation' ) ) {
@@ -96,20 +99,20 @@ TEXT;
);
}
- if ( !$wgMiserMode ) {
+ $count = $dbw->estimateRowCount(
+ 'categorylinks',
+ '*',
+ $collationConds,
+ __METHOD__
+ );
+ // Improve estimate if feasible
+ if ( $count < 1000000 ) {
$count = $dbw->selectField(
'categorylinks',
'COUNT(*)',
$collationConds,
__METHOD__
);
- } else {
- $count = $dbw->estimateRowCount(
- 'categorylinks',
- '*',
- $collationConds,
- __METHOD__
- );
}
if ( $count == 0 ) {
$this->output( "Collations up-to-date.\n" );
@@ -126,7 +129,7 @@ TEXT;
$res = $dbw->select(
array( 'categorylinks', 'page' ),
array( 'cl_from', 'cl_to', 'cl_sortkey_prefix', 'cl_collation',
- 'cl_sortkey', 'page_namespace', 'page_title'
+ 'cl_sortkey', 'cl_type', 'page_namespace', 'page_title'
),
array_merge( $collationConds, $batchConds, array( 'cl_from = page_id' ) ),
__METHOD__,
@@ -186,12 +189,8 @@ TEXT;
$dbw->commit( __METHOD__ );
}
- if ( ( $force || $dryRun ) && $row ) {
- $encFrom = $dbw->addQuotes( $row->cl_from );
- $encTo = $dbw->addQuotes( $row->cl_to );
- $batchConds = array(
- "(cl_from = $encFrom AND cl_to > $encTo) " .
- " OR cl_from > $encFrom" );
+ if ( $row ) {
+ $batchConds = array( $this->getBatchCondition( $row ) );
}
$count += $res->numRows();
@@ -212,6 +211,32 @@ TEXT;
}
}
+ /**
+ * Return an SQL expression selecting rows which sort above the given row,
+ * assuming an ordering of cl_to, cl_type, cl_from
+ */
+ function getBatchCondition( $row ) {
+ $dbw = $this->getDB( DB_MASTER );
+ $fields = array( 'cl_to', 'cl_type', 'cl_from' );
+ $first = true;
+ $cond = false;
+ $prefix = false;
+ foreach ( $fields as $field ) {
+ $encValue = $dbw->addQuotes( $row->$field );
+ $inequality = "$field > $encValue";
+ $equality = "$field = $encValue";
+ if ( $first ) {
+ $cond = $inequality;
+ $prefix = $equality;
+ $first = false;
+ } else {
+ $cond .= " OR ($prefix AND $inequality)";
+ $prefix .= " AND $equality";
+ }
+ }
+ return $cond;
+ }
+
function updateSortKeySizeHistogram( $key ) {
$length = strlen( $key );
if ( !isset( $this->sizeHistogram[$length] ) ) {
diff --git a/maintenance/updateSearchIndex.php b/maintenance/updateSearchIndex.php
index 2a71e7ed..ac784847 100644
--- a/maintenance/updateSearchIndex.php
+++ b/maintenance/updateSearchIndex.php
@@ -96,9 +96,9 @@ class UpdateSearchIndex extends Maintenance {
$end = $dbw->timestamp( $end );
$page = $dbw->tableName( 'page' );
- $sql = "SELECT rc_cur_id,rc_type,rc_moved_to_ns,rc_moved_to_title FROM $recentchanges
+ $sql = "SELECT rc_cur_id FROM $recentchanges
JOIN $page ON rc_cur_id=page_id AND rc_this_oldid=page_latest
- WHERE rc_timestamp BETWEEN '$start' AND '$end'
+ WHERE rc_type != " . RC_LOG . " AND rc_timestamp BETWEEN '$start' AND '$end'
";
$res = $dbw->query( $sql, __METHOD__ );
@@ -108,17 +108,7 @@ class UpdateSearchIndex extends Maintenance {
}
public function searchIndexUpdateCallback( $dbw, $row ) {
- if ( $row->rc_type == RC_MOVE || $row->rc_type == RC_MOVE_OVER_REDIRECT ) {
- # Rename searchindex entry
- $titleObj = Title::makeTitle( $row->rc_moved_to_ns, $row->rc_moved_to_title );
- $title = $titleObj->getPrefixedDBkey();
- $this->output( "$title..." );
- $u = new SearchUpdate( $row->rc_cur_id, $title, false );
- $u->doUpdate();
- $this->output( "\n" );
- } elseif ( $row->rc_type !== RC_LOG ) {
- $this->updateSearchIndexForPage( $dbw, $row->rc_cur_id );
- }
+ $this->updateSearchIndexForPage( $dbw, $row->rc_cur_id );
}
}
diff --git a/maintenance/updateSpecialPages.php b/maintenance/updateSpecialPages.php
index 3f1a90bb..f92f67aa 100644
--- a/maintenance/updateSpecialPages.php
+++ b/maintenance/updateSpecialPages.php
@@ -47,10 +47,10 @@ class UpdateSpecialPages extends Maintenance {
$this->error( "Uncallable function $call!" );
continue;
}
+ $this->output( sprintf( '%-30s ', $special ) );
$t1 = explode( ' ', microtime() );
call_user_func( $call, $dbw );
$t2 = explode( ' ', microtime() );
- $this->output( sprintf( '%-30s ', $special ) );
$elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
$hours = intval( $elapsed / 3600 );
$minutes = intval( $elapsed % 3600 / 60 );
diff --git a/maintenance/upgrade1_5.php b/maintenance/upgrade1_5.php
deleted file mode 100644
index 1e268de3..00000000
--- a/maintenance/upgrade1_5.php
+++ /dev/null
@@ -1,1337 +0,0 @@
-<?php
-/**
- * Alternate 1.4 -> 1.5 schema upgrade.
- * This does only the main tables + UTF-8 and is designed to allow upgrades to
- * interleave with other updates on the replication stream so that large wikis
- * can be upgraded without disrupting other services.
- *
- * Note: this script DOES NOT apply every update, nor will it probably handle
- * much older versions, etc.
- * Run this, FOLLOWED BY update.php, for upgrading from 1.4.5 release to 1.5.
- *
- * 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 Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-define( 'MW_UPGRADE_COPY', false );
-define( 'MW_UPGRADE_ENCODE', true );
-define( 'MW_UPGRADE_NULL', null );
-define( 'MW_UPGRADE_CALLBACK', null ); // for self-documentation only
-
-/**
- * @ingroup Maintenance
- */
-class FiveUpgrade extends Maintenance {
-
- /**
- * @var DatabaseBase
- */
- protected $db;
-
- function __construct() {
- parent::__construct();
-
- $this->mDescription = 'Script for upgrades from 1.4 to 1.5 (NOT 1.15) in very special cases.';
-
- $this->addOption( 'upgrade', 'Really run the script' );
- $this->addOption( 'noimage', '' );
- $this->addOption( 'step', 'Only do a specific step', false, true );
- }
-
- public function getDbType() {
- return Maintenance::DB_ADMIN;
- }
-
- public function execute() {
- $this->output( "ATTENTION: This script is for upgrades from 1.4 to 1.5 (NOT 1.15) in very special cases.\n" );
- $this->output( "Use update.php for usual updates.\n" );
-
- if ( !$this->hasOption( 'upgrade' ) ) {
- $this->output( "Please run this script with --upgrade key to actually run the updater.\n" );
- return;
- }
-
- $this->setMembers();
-
- $tables = array(
- 'page',
- 'links',
- 'user',
- 'image',
- 'oldimage',
- 'watchlist',
- 'logging',
- 'archive',
- 'imagelinks',
- 'categorylinks',
- 'ipblocks',
- 'recentchanges',
- 'querycache'
- );
-
- foreach ( $tables as $table ) {
- if ( $this->doing( $table ) ) {
- $method = 'upgrade' . ucfirst( $table );
- $this->$method();
- }
- }
-
- if ( $this->doing( 'cleanup' ) ) {
- $this->upgradeCleanup();
- }
- }
-
- protected function setMembers() {
- $this->conversionTables = $this->prepareWindows1252();
-
- $this->loadBalancers = array();
- $this->dbw = wfGetDB( DB_MASTER );
- $this->dbr = $this->streamConnection();
-
- $this->cleanupSwaps = array();
- $this->emailAuth = false; # don't preauthenticate emails
- $this->step = $this->getOption( 'step', null );
- }
-
- function doing( $step ) {
- return is_null( $this->step ) || $step == $this->step;
- }
-
- /**
- * Open a connection to the master server with the admin rights.
- * @return DatabaseBase
- * @access private
- */
- function newConnection() {
- $lb = wfGetLBFactory()->newMainLB();
- $db = $lb->getConnection( DB_MASTER );
-
- $this->loadBalancers[] = $lb;
- return $db;
- }
-
- /**
- * Commit transactions and close the connections when we're done...
- */
- function close() {
- foreach ( $this->loadBalancers as $lb ) {
- $lb->commitMasterChanges();
- $lb->closeAll();
- }
- }
-
- /**
- * Open a second connection to the master server, with buffering off.
- * This will let us stream large datasets in and write in chunks on the
- * other end.
- * @return DatabaseBase
- * @access private
- */
- function streamConnection() {
- $timeout = 3600 * 24;
- $db = $this->newConnection();
- $db->bufferResults( false );
- if ( $db->getType() == 'mysql' ) {
- $db->query( "SET net_read_timeout=$timeout" );
- $db->query( "SET net_write_timeout=$timeout" );
- }
- return $db;
- }
-
- /**
- * Prepare a conversion array for converting Windows Code Page 1252 to
- * UTF-8. This should provide proper conversion of text that was miscoded
- * as Windows-1252 by naughty user-agents, and doesn't rely on an outside
- * iconv library.
- *
- * @return array
- * @access private
- */
- function prepareWindows1252() {
- # Mappings from:
- # http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
- static $cp1252 = array(
- 0x80 => 0x20AC, # EURO SIGN
- 0x81 => 0xFFFD, # REPLACEMENT CHARACTER (no mapping)
- 0x82 => 0x201A, # SINGLE LOW-9 QUOTATION MARK
- 0x83 => 0x0192, # LATIN SMALL LETTER F WITH HOOK
- 0x84 => 0x201E, # DOUBLE LOW-9 QUOTATION MARK
- 0x85 => 0x2026, # HORIZONTAL ELLIPSIS
- 0x86 => 0x2020, # DAGGER
- 0x87 => 0x2021, # DOUBLE DAGGER
- 0x88 => 0x02C6, # MODIFIER LETTER CIRCUMFLEX ACCENT
- 0x89 => 0x2030, # PER MILLE SIGN
- 0x8A => 0x0160, # LATIN CAPITAL LETTER S WITH CARON
- 0x8B => 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
- 0x8C => 0x0152, # LATIN CAPITAL LIGATURE OE
- 0x8D => 0xFFFD, # REPLACEMENT CHARACTER (no mapping)
- 0x8E => 0x017D, # LATIN CAPITAL LETTER Z WITH CARON
- 0x8F => 0xFFFD, # REPLACEMENT CHARACTER (no mapping)
- 0x90 => 0xFFFD, # REPLACEMENT CHARACTER (no mapping)
- 0x91 => 0x2018, # LEFT SINGLE QUOTATION MARK
- 0x92 => 0x2019, # RIGHT SINGLE QUOTATION MARK
- 0x93 => 0x201C, # LEFT DOUBLE QUOTATION MARK
- 0x94 => 0x201D, # RIGHT DOUBLE QUOTATION MARK
- 0x95 => 0x2022, # BULLET
- 0x96 => 0x2013, # EN DASH
- 0x97 => 0x2014, # EM DASH
- 0x98 => 0x02DC, # SMALL TILDE
- 0x99 => 0x2122, # TRADE MARK SIGN
- 0x9A => 0x0161, # LATIN SMALL LETTER S WITH CARON
- 0x9B => 0x203A, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
- 0x9C => 0x0153, # LATIN SMALL LIGATURE OE
- 0x9D => 0xFFFD, # REPLACEMENT CHARACTER (no mapping)
- 0x9E => 0x017E, # LATIN SMALL LETTER Z WITH CARON
- 0x9F => 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS
- );
- $pairs = array();
- for ( $i = 0; $i < 0x100; $i++ ) {
- $unicode = isset( $cp1252[$i] ) ? $cp1252[$i] : $i;
- $pairs[chr( $i )] = codepointToUtf8( $unicode );
- }
- return $pairs;
- }
-
- /**
- * Convert from 8-bit Windows-1252 to UTF-8 if necessary.
- * @param string $text
- * @return string
- * @access private
- */
- function conv( $text ) {
- global $wgUseLatin1;
- return is_null( $text )
- ? null
- : ( $wgUseLatin1
- ? strtr( $text, $this->conversionTables )
- : $text );
- }
-
- /**
- * Dump timestamp and message to output
- * @param $message String
- * @access private
- */
- function log( $message ) {
- $this->output( wfWikiID() . ' ' . wfTimestamp( TS_DB ) . ': ' . $message . "\n" );
- }
-
- /**
- * Initialize the chunked-insert system.
- * Rows will be inserted in chunks of the given number, rather
- * than in a giant INSERT...SELECT query, to keep the serialized
- * MySQL database replication from getting hung up. This way other
- * things can be going on during conversion without waiting for
- * slaves to catch up as badly.
- *
- * @param int $chunksize Number of rows to insert at once
- * @param int $final Total expected number of rows / id of last row,
- * used for progress reports.
- * @param string $table to insert on
- * @param string $fname function name to report in SQL
- * @access private
- */
- function setChunkScale( $chunksize, $final, $table, $fname ) {
- $this->chunkSize = $chunksize;
- $this->chunkFinal = $final;
- $this->chunkCount = 0;
- $this->chunkStartTime = microtime( true );
- $this->chunkOptions = array( 'IGNORE' );
- $this->chunkTable = $table;
- $this->chunkFunction = $fname;
- }
-
- /**
- * Chunked inserts: perform an insert if we've reached the chunk limit.
- * Prints a progress report with estimated completion time.
- * @param array &$chunk -- This will be emptied if an insert is done.
- * @param int $key A key identifier to use in progress estimation in
- * place of the number of rows inserted. Use this if
- * you provided a max key number instead of a count
- * as the final chunk number in setChunkScale()
- * @access private
- */
- function addChunk( &$chunk, $key = null ) {
- if ( count( $chunk ) >= $this->chunkSize ) {
- $this->insertChunk( $chunk );
-
- $this->chunkCount += count( $chunk );
- $now = microtime( true );
- $delta = $now - $this->chunkStartTime;
- $rate = $this->chunkCount / $delta;
-
- if ( is_null( $key ) ) {
- $completed = $this->chunkCount;
- } else {
- $completed = $key;
- }
- $portion = $completed / $this->chunkFinal;
-
- $estimatedTotalTime = $delta / $portion;
- $eta = $this->chunkStartTime + $estimatedTotalTime;
-
- printf( "%s: %6.2f%% done on %s; ETA %s [%d/%d] %.2f/sec\n",
- wfTimestamp( TS_DB, intval( $now ) ),
- $portion * 100.0,
- $this->chunkTable,
- wfTimestamp( TS_DB, intval( $eta ) ),
- $completed,
- $this->chunkFinal,
- $rate );
- flush();
-
- $chunk = array();
- }
- }
-
- /**
- * Chunked inserts: perform an insert unconditionally, at the end, and log.
- * @param array &$chunk -- This will be emptied if an insert is done.
- * @access private
- */
- function lastChunk( &$chunk ) {
- $n = count( $chunk );
- if ( $n > 0 ) {
- $this->insertChunk( $chunk );
- }
- $this->log( "100.00% done on $this->chunkTable (last chunk $n rows)." );
- }
-
- /**
- * Chunked inserts: perform an insert.
- * @param array &$chunk -- This will be emptied if an insert is done.
- * @access private
- */
- function insertChunk( &$chunk ) {
- // Give slaves a chance to catch up
- wfWaitForSlaves();
- $this->dbw->insert( $this->chunkTable, $chunk, $this->chunkFunction, $this->chunkOptions );
- }
-
- /**
- * Helper function for copyTable array_filter
- * @param $x
- * @return bool
- */
- static private function notUpgradeNull( $x ) {
- return $x !== MW_UPGRADE_NULL;
- }
-
- /**
- * Copy and transcode a table to table_temp.
- * @param string $name Base name of the source table
- * @param string $tabledef CREATE TABLE definition, w/ $1 for the name
- * @param array $fields set of destination fields to these constants:
- * MW_UPGRADE_COPY - straight copy
- * MW_UPGRADE_ENCODE - for old Latin1 wikis, conv to UTF-8
- * MW_UPGRADE_NULL - just put NULL
- * @param $callback callback An optional callback to modify the data
- * or perform other processing. Func should be
- * ( object $row, array $copy ) and return $copy
- * @access private
- */
- function copyTable( $name, $tabledef, $fields, $callback = null ) {
- $name_temp = $name . '_temp';
- $this->log( "Migrating $name table to $name_temp..." );
-
- $table_temp = $this->dbw->tableName( $name_temp );
-
- // Create temporary table; we're going to copy everything in there,
- // then at the end rename the final tables into place.
- $def = str_replace( '$1', $table_temp, $tabledef );
- $this->dbw->query( $def, __METHOD__ );
-
- $numRecords = $this->dbw->selectField( $name, 'COUNT(*)', '', __METHOD__ );
- $this->setChunkScale( 100, $numRecords, $name_temp, __METHOD__ );
-
- // Pull all records from the second, streaming database connection.
- $sourceFields = array_keys( array_filter( $fields, 'FiveUpgrade::notUpgradeNull' ) );
- $result = $this->dbr->select( $name,
- $sourceFields,
- '',
- __METHOD__ );
-
- $add = array();
- foreach ( $result as $row ) {
- $copy = array();
- foreach ( $fields as $field => $source ) {
- if ( $source === MW_UPGRADE_COPY ) {
- $copy[$field] = $row->$field;
- } elseif ( $source === MW_UPGRADE_ENCODE ) {
- $copy[$field] = $this->conv( $row->$field );
- } elseif ( $source === MW_UPGRADE_NULL ) {
- $copy[$field] = null;
- } else {
- $this->log( "Unknown field copy type: $field => $source" );
- }
- }
- if ( is_callable( $callback ) ) {
- $copy = call_user_func( $callback, $row, $copy );
- }
- $add[] = $copy;
- $this->addChunk( $add );
- }
- $this->lastChunk( $add );
-
- $this->log( "Done converting $name." );
- $this->cleanupSwaps[] = $name;
- }
-
- function upgradePage() {
- $chunksize = 100;
-
- if ( $this->dbw->tableExists( 'page' ) ) {
- $this->error( 'Page table already exists.', true );
- }
-
- $this->log( "Checking cur table for unique title index and applying if necessary" );
- $this->checkDupes();
-
- $this->log( "...converting from cur/old to page/revision/text DB structure." );
-
- list ( $cur, $old, $page, $revision, $text ) = $this->dbw->tableNamesN( 'cur', 'old', 'page', 'revision', 'text' );
-
- $this->log( "Creating page and revision tables..." );
- $this->dbw->query( "CREATE TABLE $page (
- page_id int(8) unsigned NOT NULL auto_increment,
- page_namespace int NOT NULL,
- page_title varchar(255) binary NOT NULL,
- page_restrictions tinyblob NOT NULL default '',
- page_counter bigint(20) unsigned NOT NULL default '0',
- page_is_redirect tinyint(1) unsigned NOT NULL default '0',
- page_is_new tinyint(1) unsigned NOT NULL default '0',
- page_random real unsigned NOT NULL,
- page_touched char(14) binary NOT NULL default '',
- page_latest int(8) unsigned NOT NULL,
- page_len int(8) unsigned NOT NULL,
-
- PRIMARY KEY page_id (page_id),
- UNIQUE INDEX name_title (page_namespace,page_title),
- INDEX (page_random),
- INDEX (page_len)
- ) TYPE=InnoDB", __METHOD__ );
- $this->dbw->query( "CREATE TABLE $revision (
- rev_id int(8) unsigned NOT NULL auto_increment,
- rev_page int(8) unsigned NOT NULL,
- rev_text_id int(8) unsigned NOT NULL,
- rev_comment tinyblob NOT NULL default '',
- rev_user int(5) unsigned NOT NULL default '0',
- rev_user_text varchar(255) binary NOT NULL default '',
- rev_timestamp char(14) binary NOT NULL default '',
- rev_minor_edit tinyint(1) unsigned NOT NULL default '0',
- rev_deleted tinyint(1) unsigned NOT NULL default '0',
-
- PRIMARY KEY rev_page_id (rev_page, rev_id),
- UNIQUE INDEX rev_id (rev_id),
- INDEX rev_timestamp (rev_timestamp),
- INDEX page_timestamp (rev_page,rev_timestamp),
- INDEX user_timestamp (rev_user,rev_timestamp),
- INDEX usertext_timestamp (rev_user_text,rev_timestamp)
- ) TYPE=InnoDB", __METHOD__ );
-
- $maxold = intval( $this->dbw->selectField( 'old', 'max(old_id)', '', __METHOD__ ) );
- $this->log( "Last old record is {$maxold}" );
-
- global $wgLegacySchemaConversion;
- if ( $wgLegacySchemaConversion ) {
- // Create HistoryBlobCurStub entries.
- // Text will be pulled from the leftover 'cur' table at runtime.
- echo "......Moving metadata from cur; using blob references to text in cur table.\n";
- $cur_text = "concat('O:18:\"historyblobcurstub\":1:{s:6:\"mCurId\";i:',cur_id,';}')";
- $cur_flags = "'object'";
- } else {
- // Copy all cur text in immediately: this may take longer but avoids
- // having to keep an extra table around.
- echo "......Moving text from cur.\n";
- $cur_text = 'cur_text';
- $cur_flags = "''";
- }
-
- $maxcur = $this->dbw->selectField( 'cur', 'max(cur_id)', '', __METHOD__ );
- $this->log( "Last cur entry is $maxcur" );
-
- /**
- * Copy placeholder records for each page's current version into old
- * Don't do any conversion here; text records are converted at runtime
- * based on the flags (and may be originally binary!) while the meta
- * fields will be converted in the old -> rev and cur -> page steps.
- */
- $this->setChunkScale( $chunksize, $maxcur, 'old', __METHOD__ );
- $result = $this->dbr->query(
- "SELECT cur_id, cur_namespace, cur_title, $cur_text AS text, cur_comment,
- cur_user, cur_user_text, cur_timestamp, cur_minor_edit, $cur_flags AS flags
- FROM $cur
- ORDER BY cur_id", __METHOD__ );
- $add = array();
- foreach ( $result as $row ) {
- $add[] = array(
- 'old_namespace' => $row->cur_namespace,
- 'old_title' => $row->cur_title,
- 'old_text' => $row->text,
- 'old_comment' => $row->cur_comment,
- 'old_user' => $row->cur_user,
- 'old_user_text' => $row->cur_user_text,
- 'old_timestamp' => $row->cur_timestamp,
- 'old_minor_edit' => $row->cur_minor_edit,
- 'old_flags' => $row->flags );
- $this->addChunk( $add, $row->cur_id );
- }
- $this->lastChunk( $add );
-
- /**
- * Copy revision metadata from old into revision.
- * We'll also do UTF-8 conversion of usernames and comments.
- */
- # $newmaxold = $this->dbw->selectField( 'old', 'max(old_id)', '', __METHOD__ );
- # $this->setChunkScale( $chunksize, $newmaxold, 'revision', __METHOD__ );
- # $countold = $this->dbw->selectField( 'old', 'count(old_id)', '', __METHOD__ );
- $countold = $this->dbw->selectField( 'old', 'max(old_id)', '', __METHOD__ );
- $this->setChunkScale( $chunksize, $countold, 'revision', __METHOD__ );
-
- $this->log( "......Setting up revision table." );
- $result = $this->dbr->query(
- "SELECT old_id, cur_id, old_comment, old_user, old_user_text,
- old_timestamp, old_minor_edit
- FROM $old,$cur WHERE old_namespace=cur_namespace AND old_title=cur_title",
- __METHOD__ );
-
- $add = array();
- foreach ( $result as $row ) {
- $add[] = array(
- 'rev_id' => $row->old_id,
- 'rev_page' => $row->cur_id,
- 'rev_text_id' => $row->old_id,
- 'rev_comment' => $this->conv( $row->old_comment ),
- 'rev_user' => $row->old_user,
- 'rev_user_text' => $this->conv( $row->old_user_text ),
- 'rev_timestamp' => $row->old_timestamp,
- 'rev_minor_edit' => $row->old_minor_edit );
- $this->addChunk( $add );
- }
- $this->lastChunk( $add );
-
-
- /**
- * Copy page metadata from cur into page.
- * We'll also do UTF-8 conversion of titles.
- */
- $this->log( "......Setting up page table." );
- $this->setChunkScale( $chunksize, $maxcur, 'page', __METHOD__ );
- $result = $this->dbr->query( "
- SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter, cur_is_redirect, cur_is_new,
- cur_random, cur_touched, rev_id, LENGTH(cur_text) AS len
- FROM $cur,$revision
- WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}
- ORDER BY cur_id", __METHOD__ );
- $add = array();
- foreach ( $result as $row ) {
- $add[] = array(
- 'page_id' => $row->cur_id,
- 'page_namespace' => $row->cur_namespace,
- 'page_title' => $this->conv( $row->cur_title ),
- 'page_restrictions' => $row->cur_restrictions,
- 'page_counter' => $row->cur_counter,
- 'page_is_redirect' => $row->cur_is_redirect,
- 'page_is_new' => $row->cur_is_new,
- 'page_random' => $row->cur_random,
- 'page_touched' => $this->dbw->timestamp(),
- 'page_latest' => $row->rev_id,
- 'page_len' => $row->len );
- # $this->addChunk( $add, $row->cur_id );
- $this->addChunk( $add );
- }
- $this->lastChunk( $add );
-
- $this->log( "...done with cur/old -> page/revision." );
- }
-
- function upgradeLinks() {
- $chunksize = 200;
- list ( $links, $brokenlinks, $pagelinks, $cur ) = $this->dbw->tableNamesN( 'links', 'brokenlinks', 'pagelinks', 'cur' );
-
- $this->log( 'Checking for interwiki table change in case of bogus items...' );
- if ( $this->dbw->fieldExists( 'interwiki', 'iw_trans' ) ) {
- $this->log( 'interwiki has iw_trans.' );
- } else {
- global $IP;
- $this->log( 'adding iw_trans...' );
- $this->dbw->sourceFile( $IP . '/maintenance/archives/patch-interwiki-trans.sql' );
- $this->log( 'added iw_trans.' );
- }
-
- $this->log( 'Creating pagelinks table...' );
- $this->dbw->query( "
-CREATE TABLE $pagelinks (
- -- Key to the page_id of the page containing the link.
- pl_from int(8) unsigned NOT NULL default '0',
-
- -- Key to page_namespace/page_title of the target page.
- -- The target page may or may not exist, and due to renames
- -- and deletions may refer to different page records as time
- -- goes by.
- pl_namespace int NOT NULL default '0',
- pl_title varchar(255) binary NOT NULL default '',
-
- UNIQUE KEY pl_from(pl_from,pl_namespace,pl_title),
- KEY (pl_namespace,pl_title)
-
-) TYPE=InnoDB" );
-
- $this->log( 'Importing live links -> pagelinks' );
- $nlinks = $this->dbw->selectField( 'links', 'count(*)', '', __METHOD__ );
- if ( $nlinks ) {
- $this->setChunkScale( $chunksize, $nlinks, 'pagelinks', __METHOD__ );
- $result = $this->dbr->query( "
- SELECT l_from,cur_namespace,cur_title
- FROM $links, $cur
- WHERE l_to=cur_id", __METHOD__ );
- $add = array();
- foreach ( $result as $row ) {
- $add[] = array(
- 'pl_from' => $row->l_from,
- 'pl_namespace' => $row->cur_namespace,
- 'pl_title' => $this->conv( $row->cur_title ) );
- $this->addChunk( $add );
- }
- $this->lastChunk( $add );
- } else {
- $this->log( 'no links!' );
- }
-
- $this->log( 'Importing brokenlinks -> pagelinks' );
- $nbrokenlinks = $this->dbw->selectField( 'brokenlinks', 'count(*)', '', __METHOD__ );
- if ( $nbrokenlinks ) {
- $this->setChunkScale( $chunksize, $nbrokenlinks, 'pagelinks', __METHOD__ );
- $result = $this->dbr->query(
- "SELECT bl_from, bl_to FROM $brokenlinks",
- __METHOD__ );
- $add = array();
- foreach ( $result as $row ) {
- $pagename = $this->conv( $row->bl_to );
- $title = Title::newFromText( $pagename );
- if ( is_null( $title ) ) {
- $this->log( "** invalid brokenlink: $row->bl_from -> '$pagename' (converted from '$row->bl_to')" );
- } else {
- $add[] = array(
- 'pl_from' => $row->bl_from,
- 'pl_namespace' => $title->getNamespace(),
- 'pl_title' => $title->getDBkey() );
- $this->addChunk( $add );
- }
- }
- $this->lastChunk( $add );
- } else {
- $this->log( 'no brokenlinks!' );
- }
-
- $this->log( 'Done with links.' );
- }
-
- function userDupeCallback( $str ) {
- echo $str;
- }
-
- function upgradeUser() {
- // Apply unique index, if necessary:
- $duper = new UserDupes( $this->dbw, array( $this, 'userDupeCallback' ) );
- if ( $duper->hasUniqueIndex() ) {
- $this->log( "Already have unique user_name index." );
- } else {
- $this->log( "Clearing user duplicates..." );
- if ( !$duper->clearDupes() ) {
- $this->log( "WARNING: Duplicate user accounts, may explode!" );
- }
- }
-
- $tabledef = <<<END
-CREATE TABLE $1 (
- user_id int(5) unsigned NOT NULL auto_increment,
- user_name varchar(255) binary NOT NULL default '',
- user_real_name varchar(255) binary NOT NULL default '',
- user_password tinyblob NOT NULL default '',
- user_newpassword tinyblob NOT NULL default '',
- user_email tinytext NOT NULL default '',
- user_options blob NOT NULL default '',
- user_touched char(14) binary NOT NULL default '',
- user_token char(32) binary NOT NULL default '',
- user_email_authenticated CHAR(14) BINARY,
- user_email_token CHAR(32) BINARY,
- user_email_token_expires CHAR(14) BINARY,
-
- PRIMARY KEY user_id (user_id),
- UNIQUE INDEX user_name (user_name),
- INDEX (user_email_token)
-
-) TYPE=InnoDB
-END;
- $fields = array(
- 'user_id' => MW_UPGRADE_COPY,
- 'user_name' => MW_UPGRADE_ENCODE,
- 'user_real_name' => MW_UPGRADE_ENCODE,
- 'user_password' => MW_UPGRADE_COPY,
- 'user_newpassword' => MW_UPGRADE_COPY,
- 'user_email' => MW_UPGRADE_ENCODE,
- 'user_options' => MW_UPGRADE_ENCODE,
- 'user_touched' => MW_UPGRADE_CALLBACK,
- 'user_token' => MW_UPGRADE_COPY,
- 'user_email_authenticated' => MW_UPGRADE_CALLBACK,
- 'user_email_token' => MW_UPGRADE_NULL,
- 'user_email_token_expires' => MW_UPGRADE_NULL );
- $this->copyTable( 'user', $tabledef, $fields,
- array( &$this, 'userCallback' ) );
- }
-
- function userCallback( $row, $copy ) {
- $now = $this->dbw->timestamp();
- $copy['user_touched'] = $now;
- $copy['user_email_authenticated'] = $this->emailAuth ? $now : null;
- return $copy;
- }
-
- function upgradeImage() {
- $tabledef = <<<END
-CREATE TABLE $1 (
- img_name varchar(255) binary NOT NULL default '',
- img_size int(8) unsigned NOT NULL default '0',
- img_width int(5) NOT NULL default '0',
- img_height int(5) NOT NULL default '0',
- img_metadata mediumblob NOT NULL,
- img_bits int(3) NOT NULL default '0',
- img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
- img_minor_mime varchar(32) NOT NULL default "unknown",
- img_description tinyblob NOT NULL default '',
- img_user int(5) unsigned NOT NULL default '0',
- img_user_text varchar(255) binary NOT NULL default '',
- img_timestamp char(14) binary NOT NULL default '',
-
- PRIMARY KEY img_name (img_name),
- INDEX img_size (img_size),
- INDEX img_timestamp (img_timestamp)
-) TYPE=InnoDB
-END;
- $fields = array(
- 'img_name' => MW_UPGRADE_ENCODE,
- 'img_size' => MW_UPGRADE_COPY,
- 'img_width' => MW_UPGRADE_CALLBACK,
- 'img_height' => MW_UPGRADE_CALLBACK,
- 'img_metadata' => MW_UPGRADE_CALLBACK,
- 'img_bits' => MW_UPGRADE_CALLBACK,
- 'img_media_type' => MW_UPGRADE_CALLBACK,
- 'img_major_mime' => MW_UPGRADE_CALLBACK,
- 'img_minor_mime' => MW_UPGRADE_CALLBACK,
- 'img_description' => MW_UPGRADE_ENCODE,
- 'img_user' => MW_UPGRADE_COPY,
- 'img_user_text' => MW_UPGRADE_ENCODE,
- 'img_timestamp' => MW_UPGRADE_COPY );
- $this->copyTable( 'image', $tabledef, $fields,
- array( &$this, 'imageCallback' ) );
- }
-
- function imageCallback( $row, $copy ) {
- if ( !$this->hasOption( 'noimage' ) ) {
- // Fill in the new image info fields
- $info = $this->imageInfo( $row->img_name );
-
- $copy['img_width' ] = $info['width'];
- $copy['img_height' ] = $info['height'];
- $copy['img_metadata' ] = ""; // loaded on-demand
- $copy['img_bits' ] = $info['bits'];
- $copy['img_media_type'] = $info['media'];
- $copy['img_major_mime'] = $info['major'];
- $copy['img_minor_mime'] = $info['minor'];
- }
-
- // If doing UTF8 conversion the file must be renamed
- $this->renameFile( $row->img_name, 'wfImageDir' );
-
- return $copy;
- }
-
- function imageInfo( $filename ) {
- $info = array(
- 'width' => 0,
- 'height' => 0,
- 'bits' => 0,
- 'media' => '',
- 'major' => '',
- 'minor' => '' );
-
- $magic = MimeMagic::singleton();
- $mime = $magic->guessMimeType( $filename, true );
- list( $info['major'], $info['minor'] ) = explode( '/', $mime );
-
- $info['media'] = $magic->getMediaType( $filename, $mime );
-
- $image = UnregisteredLocalFile::newFromPath( $filename, $mime );
-
- $info['width'] = $image->getWidth();
- $info['height'] = $image->getHeight();
-
- $gis = $image->getImageSize( $filename );
- if ( isset( $gis['bits'] ) ) {
- $info['bits'] = $gis['bits'];
- }
-
- return $info;
- }
-
-
- /**
- * Truncate a table.
- * @param string $table The table name to be truncated
- */
- function clearTable( $table ) {
- print "Clearing $table...\n";
- $tableName = $this->db->tableName( $table );
- $this->db->query( "TRUNCATE $tableName" );
- }
-
- /**
- * Rename a given image or archived image file to the converted filename,
- * leaving a symlink for URL compatibility.
- *
- * @param $oldname string pre-conversion filename
- * @param $subdirCallback string
- * @param $basename string pre-conversion base filename for dir hashing, if an archive
- * @return bool|string
- * @access private
- */
- function renameFile( $oldname, $subdirCallback = 'wfImageDir', $basename = null ) {
- $newname = $this->conv( $oldname );
- if ( $newname == $oldname ) {
- // No need to rename; another field triggered this row.
- return false;
- }
-
- if ( is_null( $basename ) ) $basename = $oldname;
- $ubasename = $this->conv( $basename );
- $oldpath = call_user_func( $subdirCallback, $basename ) . '/' . $oldname;
- $newpath = call_user_func( $subdirCallback, $ubasename ) . '/' . $newname;
-
- $this->log( "$oldpath -> $newpath" );
- if ( rename( $oldpath, $newpath ) ) {
- $relpath = wfRelativePath( $newpath, dirname( $oldpath ) );
- if ( !symlink( $relpath, $oldpath ) ) {
- $this->log( "... symlink failed!" );
- }
- return $newname;
- } else {
- $this->log( "... rename failed!" );
- return false;
- }
- }
-
- function upgradeOldImage() {
- $tabledef = <<<END
-CREATE TABLE $1 (
- -- Base filename: key to image.img_name
- oi_name varchar(255) binary NOT NULL default '',
-
- -- Filename of the archived file.
- -- This is generally a timestamp and '!' prepended to the base name.
- oi_archive_name varchar(255) binary NOT NULL default '',
-
- -- Other fields as in image...
- oi_size int(8) unsigned NOT NULL default 0,
- oi_width int(5) NOT NULL default 0,
- oi_height int(5) NOT NULL default 0,
- oi_bits int(3) NOT NULL default 0,
- oi_description tinyblob NOT NULL default '',
- oi_user int(5) unsigned NOT NULL default '0',
- oi_user_text varchar(255) binary NOT NULL default '',
- oi_timestamp char(14) binary NOT NULL default '',
-
- INDEX oi_name (oi_name(10))
-
-) TYPE=InnoDB;
-END;
- $fields = array(
- 'oi_name' => MW_UPGRADE_ENCODE,
- 'oi_archive_name' => MW_UPGRADE_ENCODE,
- 'oi_size' => MW_UPGRADE_COPY,
- 'oi_width' => MW_UPGRADE_CALLBACK,
- 'oi_height' => MW_UPGRADE_CALLBACK,
- 'oi_bits' => MW_UPGRADE_CALLBACK,
- 'oi_description' => MW_UPGRADE_ENCODE,
- 'oi_user' => MW_UPGRADE_COPY,
- 'oi_user_text' => MW_UPGRADE_ENCODE,
- 'oi_timestamp' => MW_UPGRADE_COPY );
- $this->copyTable( 'oldimage', $tabledef, $fields,
- array( &$this, 'oldimageCallback' ) );
- }
-
- function oldimageCallback( $row, $copy ) {
- global $options;
- if ( !isset( $options['noimage'] ) ) {
- // Fill in the new image info fields
- $info = $this->imageInfo( $row->oi_archive_name, 'wfImageArchiveDir', $row->oi_name );
- $copy['oi_width' ] = $info['width' ];
- $copy['oi_height'] = $info['height'];
- $copy['oi_bits' ] = $info['bits' ];
- }
-
- // If doing UTF8 conversion the file must be renamed
- $this->renameFile( $row->oi_archive_name, 'wfImageArchiveDir', $row->oi_name );
-
- return $copy;
- }
-
-
- function upgradeWatchlist() {
- $chunksize = 100;
-
- list ( $watchlist, $watchlist_temp ) = $this->dbw->tableNamesN( 'watchlist', 'watchlist_temp' );
-
- $this->log( 'Migrating watchlist table to watchlist_temp...' );
- $this->dbw->query(
-"CREATE TABLE $watchlist_temp (
- -- Key to user_id
- wl_user int(5) unsigned NOT NULL,
-
- -- Key to page_namespace/page_title
- -- Note that users may watch patches which do not exist yet,
- -- or existed in the past but have been deleted.
- wl_namespace int NOT NULL default '0',
- wl_title varchar(255) binary NOT NULL default '',
-
- -- Timestamp when user was last sent a notification e-mail;
- -- cleared when the user visits the page.
- -- FIXME: add proper null support etc
- wl_notificationtimestamp varchar(14) binary NOT NULL default '0',
-
- UNIQUE KEY (wl_user, wl_namespace, wl_title),
- KEY namespace_title (wl_namespace,wl_title)
-
-) TYPE=InnoDB;", __METHOD__ );
-
- // Fix encoding for Latin-1 upgrades, add some fields,
- // and double article to article+talk pairs
- $numwatched = $this->dbw->selectField( 'watchlist', 'count(*)', '', __METHOD__ );
-
- $this->setChunkScale( $chunksize, $numwatched * 2, 'watchlist_temp', __METHOD__ );
- $result = $this->dbr->select( 'watchlist',
- array(
- 'wl_user',
- 'wl_namespace',
- 'wl_title' ),
- '',
- __METHOD__ );
-
- $add = array();
- foreach ( $result as $row ) {
- $add[] = array(
- 'wl_user' => $row->wl_user,
- 'wl_namespace' => MWNamespace::getSubject( $row->wl_namespace ),
- 'wl_title' => $this->conv( $row->wl_title ),
- 'wl_notificationtimestamp' => '0' );
- $this->addChunk( $add );
-
- $add[] = array(
- 'wl_user' => $row->wl_user,
- 'wl_namespace' => MWNamespace::getTalk( $row->wl_namespace ),
- 'wl_title' => $this->conv( $row->wl_title ),
- 'wl_notificationtimestamp' => '0' );
- $this->addChunk( $add );
- }
- $this->lastChunk( $add );
-
- $this->log( 'Done converting watchlist.' );
- $this->cleanupSwaps[] = 'watchlist';
- }
-
- function upgradeLogging() {
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- -- Symbolic keys for the general log type and the action type
- -- within the log. The output format will be controlled by the
- -- action field, but only the type controls categorization.
- log_type char(10) NOT NULL default '',
- log_action char(10) NOT NULL default '',
-
- -- Timestamp. Duh.
- log_timestamp char(14) NOT NULL default '19700101000000',
-
- -- The user who performed this action; key to user_id
- log_user int unsigned NOT NULL default 0,
-
- -- Key to the page affected. Where a user is the target,
- -- this will point to the user page.
- log_namespace int NOT NULL default 0,
- log_title varchar(255) binary NOT NULL default '',
-
- -- Freeform text. Interpreted as edit history comments.
- log_comment varchar(255) NOT NULL default '',
-
- -- LF separated list of miscellaneous parameters
- log_params blob NOT NULL default '',
-
- KEY type_time (log_type, log_timestamp),
- KEY user_time (log_user, log_timestamp),
- KEY page_time (log_namespace, log_title, log_timestamp)
-
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'log_type' => MW_UPGRADE_COPY,
- 'log_action' => MW_UPGRADE_COPY,
- 'log_timestamp' => MW_UPGRADE_COPY,
- 'log_user' => MW_UPGRADE_COPY,
- 'log_namespace' => MW_UPGRADE_COPY,
- 'log_title' => MW_UPGRADE_ENCODE,
- 'log_comment' => MW_UPGRADE_ENCODE,
- 'log_params' => MW_UPGRADE_ENCODE );
- $this->copyTable( 'logging', $tabledef, $fields );
- }
-
- function upgradeArchive() {
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- ar_namespace int NOT NULL default '0',
- ar_title varchar(255) binary NOT NULL default '',
- ar_text mediumblob NOT NULL default '',
-
- ar_comment tinyblob NOT NULL default '',
- ar_user int(5) unsigned NOT NULL default '0',
- ar_user_text varchar(255) binary NOT NULL,
- ar_timestamp char(14) binary NOT NULL default '',
- ar_minor_edit tinyint(1) NOT NULL default '0',
-
- ar_flags tinyblob NOT NULL default '',
-
- ar_rev_id int(8) unsigned,
- ar_text_id int(8) unsigned,
-
- KEY name_title_timestamp (ar_namespace,ar_title,ar_timestamp)
-
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'ar_namespace' => MW_UPGRADE_COPY,
- 'ar_title' => MW_UPGRADE_ENCODE,
- 'ar_text' => MW_UPGRADE_COPY,
- 'ar_comment' => MW_UPGRADE_ENCODE,
- 'ar_user' => MW_UPGRADE_COPY,
- 'ar_user_text' => MW_UPGRADE_ENCODE,
- 'ar_timestamp' => MW_UPGRADE_COPY,
- 'ar_minor_edit' => MW_UPGRADE_COPY,
- 'ar_flags' => MW_UPGRADE_COPY,
- 'ar_rev_id' => MW_UPGRADE_NULL,
- 'ar_text_id' => MW_UPGRADE_NULL );
- $this->copyTable( 'archive', $tabledef, $fields );
- }
-
- function upgradeImagelinks() {
- global $wgUseLatin1;
- if ( $wgUseLatin1 ) {
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- -- Key to page_id of the page containing the image / media link.
- il_from int(8) unsigned NOT NULL default '0',
-
- -- Filename of target image.
- -- This is also the page_title of the file's description page;
- -- all such pages are in namespace 6 (NS_FILE).
- il_to varchar(255) binary NOT NULL default '',
-
- UNIQUE KEY il_from(il_from,il_to),
- KEY (il_to)
-
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'il_from' => MW_UPGRADE_COPY,
- 'il_to' => MW_UPGRADE_ENCODE );
- $this->copyTable( 'imagelinks', $tabledef, $fields );
- }
- }
-
- function upgradeCategorylinks() {
- global $wgUseLatin1;
- if ( $wgUseLatin1 ) {
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- cl_from int(8) unsigned NOT NULL default '0',
- cl_to varchar(255) binary NOT NULL default '',
- cl_sortkey varchar(86) binary NOT NULL default '',
- cl_timestamp timestamp NOT NULL,
-
- UNIQUE KEY cl_from(cl_from,cl_to),
- KEY cl_sortkey(cl_to,cl_sortkey),
- KEY cl_timestamp(cl_to,cl_timestamp)
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'cl_from' => MW_UPGRADE_COPY,
- 'cl_to' => MW_UPGRADE_ENCODE,
- 'cl_sortkey' => MW_UPGRADE_ENCODE,
- 'cl_timestamp' => MW_UPGRADE_COPY );
- $this->copyTable( 'categorylinks', $tabledef, $fields );
- }
- }
-
- function upgradeIpblocks() {
- global $wgUseLatin1;
- if ( $wgUseLatin1 ) {
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- ipb_id int(8) NOT NULL auto_increment,
- ipb_address varchar(40) binary NOT NULL default '',
- ipb_user int(8) unsigned NOT NULL default '0',
- ipb_by int(8) unsigned NOT NULL default '0',
- ipb_reason tinyblob NOT NULL default '',
- ipb_timestamp char(14) binary NOT NULL default '',
- ipb_auto tinyint(1) NOT NULL default '0',
- ipb_expiry char(14) binary NOT NULL default '',
-
- PRIMARY KEY ipb_id (ipb_id),
- INDEX ipb_address (ipb_address),
- INDEX ipb_user (ipb_user)
-
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'ipb_id' => MW_UPGRADE_COPY,
- 'ipb_address' => MW_UPGRADE_COPY,
- 'ipb_user' => MW_UPGRADE_COPY,
- 'ipb_by' => MW_UPGRADE_COPY,
- 'ipb_reason' => MW_UPGRADE_ENCODE,
- 'ipb_timestamp' => MW_UPGRADE_COPY,
- 'ipb_auto' => MW_UPGRADE_COPY,
- 'ipb_expiry' => MW_UPGRADE_COPY );
- $this->copyTable( 'ipblocks', $tabledef, $fields );
- }
- }
-
- function upgradeRecentchanges() {
- // There's a format change in the namespace field
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- rc_id int(8) NOT NULL auto_increment,
- rc_timestamp varchar(14) binary NOT NULL default '',
- rc_cur_time varchar(14) binary NOT NULL default '',
-
- rc_user int(10) unsigned NOT NULL default '0',
- rc_user_text varchar(255) binary NOT NULL default '',
-
- rc_namespace int NOT NULL default '0',
- rc_title varchar(255) binary NOT NULL default '',
-
- rc_comment varchar(255) binary NOT NULL default '',
- rc_minor tinyint(3) unsigned NOT NULL default '0',
-
- rc_bot tinyint(3) unsigned NOT NULL default '0',
- rc_new tinyint(3) unsigned NOT NULL default '0',
-
- rc_cur_id int(10) unsigned NOT NULL default '0',
- rc_this_oldid int(10) unsigned NOT NULL default '0',
- rc_last_oldid int(10) unsigned NOT NULL default '0',
-
- rc_type tinyint(3) unsigned NOT NULL default '0',
- rc_moved_to_ns tinyint(3) unsigned NOT NULL default '0',
- rc_moved_to_title varchar(255) binary NOT NULL default '',
-
- rc_patrolled tinyint(3) unsigned NOT NULL default '0',
-
- rc_ip char(15) NOT NULL default '',
-
- PRIMARY KEY rc_id (rc_id),
- INDEX rc_timestamp (rc_timestamp),
- INDEX rc_namespace_title (rc_namespace, rc_title),
- INDEX rc_cur_id (rc_cur_id),
- INDEX new_name_timestamp(rc_new,rc_namespace,rc_timestamp),
- INDEX rc_ip (rc_ip)
-
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'rc_id' => MW_UPGRADE_COPY,
- 'rc_timestamp' => MW_UPGRADE_COPY,
- 'rc_cur_time' => MW_UPGRADE_COPY,
- 'rc_user' => MW_UPGRADE_COPY,
- 'rc_user_text' => MW_UPGRADE_ENCODE,
- 'rc_namespace' => MW_UPGRADE_COPY,
- 'rc_title' => MW_UPGRADE_ENCODE,
- 'rc_comment' => MW_UPGRADE_ENCODE,
- 'rc_minor' => MW_UPGRADE_COPY,
- 'rc_bot' => MW_UPGRADE_COPY,
- 'rc_new' => MW_UPGRADE_COPY,
- 'rc_cur_id' => MW_UPGRADE_COPY,
- 'rc_this_oldid' => MW_UPGRADE_COPY,
- 'rc_last_oldid' => MW_UPGRADE_COPY,
- 'rc_type' => MW_UPGRADE_COPY,
- 'rc_moved_to_ns' => MW_UPGRADE_COPY,
- 'rc_moved_to_title' => MW_UPGRADE_ENCODE,
- 'rc_patrolled' => MW_UPGRADE_COPY,
- 'rc_ip' => MW_UPGRADE_COPY );
- $this->copyTable( 'recentchanges', $tabledef, $fields );
- }
-
- function upgradeQuerycache() {
- // There's a format change in the namespace field
- $tabledef = <<<ENDS
-CREATE TABLE $1 (
- -- A key name, generally the base name of of the special page.
- qc_type char(32) NOT NULL,
-
- -- Some sort of stored value. Sizes, counts...
- qc_value int(5) unsigned NOT NULL default '0',
-
- -- Target namespace+title
- qc_namespace int NOT NULL default '0',
- qc_title char(255) binary NOT NULL default '',
-
- KEY (qc_type,qc_value)
-
-) TYPE=InnoDB
-ENDS;
- $fields = array(
- 'qc_type' => MW_UPGRADE_COPY,
- 'qc_value' => MW_UPGRADE_COPY,
- 'qc_namespace' => MW_UPGRADE_COPY,
- 'qc_title' => MW_UPGRADE_ENCODE );
- $this->copyTable( 'querycache', $tabledef, $fields );
- }
-
- /**
- * Check for duplicate rows in "cur" table and move duplicates entries in
- * "old" table.
- *
- * This was in cleanupDupes.inc before.
- */
- function checkDupes() {
- $dbw = wfGetDB( DB_MASTER );
- if ( $dbw->indexExists( 'cur', 'name_title' ) &&
- $dbw->indexUnique( 'cur', 'name_title' ) ) {
- echo wfWikiID() . ": cur table has the current unique index; no duplicate entries.\n";
- return;
- } elseif ( $dbw->indexExists( 'cur', 'name_title_dup_prevention' ) ) {
- echo wfWikiID() . ": cur table has a temporary name_title_dup_prevention unique index; no duplicate entries.\n";
- return;
- }
-
- echo wfWikiID() . ": cur table has the old non-unique index and may have duplicate entries.\n";
-
- $dbw = wfGetDB( DB_MASTER );
- $cur = $dbw->tableName( 'cur' );
- $old = $dbw->tableName( 'old' );
- $dbw->query( "LOCK TABLES $cur WRITE, $old WRITE" );
- echo "Checking for duplicate cur table entries... (this may take a while on a large wiki)\n";
- $res = $dbw->query( <<<END
-SELECT cur_namespace,cur_title,count(*) as c,min(cur_id) as id
- FROM $cur
- GROUP BY cur_namespace,cur_title
-HAVING c > 1
-END
- );
- $n = $dbw->numRows( $res );
- echo "Found $n titles with duplicate entries.\n";
- if ( $n > 0 ) {
- echo "Correcting...\n";
- foreach ( $res as $row ) {
- $ns = intval( $row->cur_namespace );
- $title = $dbw->addQuotes( $row->cur_title );
-
- # Get the first responding ID; that'll be the one we keep.
- $id = $dbw->selectField( 'cur', 'cur_id', array(
- 'cur_namespace' => $row->cur_namespace,
- 'cur_title' => $row->cur_title ) );
-
- echo "$ns:$row->cur_title (canonical ID $id)\n";
- if ( $id != $row->id ) {
- echo " ** minimum ID $row->id; ";
- $timeMin = $dbw->selectField( 'cur', 'cur_timestamp', array(
- 'cur_id' => $row->id ) );
- $timeFirst = $dbw->selectField( 'cur', 'cur_timestamp', array(
- 'cur_id' => $id ) );
- if ( $timeMin == $timeFirst ) {
- echo "timestamps match at $timeFirst; ok\n";
- } else {
- echo "timestamps don't match! min: $timeMin, first: $timeFirst; ";
- if ( $timeMin > $timeFirst ) {
- $id = $row->id;
- echo "keeping minimum: $id\n";
- } else {
- echo "keeping first: $id\n";
- }
- }
- }
-
- $dbw->query( <<<END
-INSERT
- INTO $old
- (old_namespace, old_title, old_text,
- old_comment, old_user, old_user_text,
- old_timestamp, old_minor_edit, old_flags,
- inverse_timestamp)
-SELECT cur_namespace, cur_title, cur_text,
- cur_comment, cur_user, cur_user_text,
- cur_timestamp, cur_minor_edit, '',
- inverse_timestamp
- FROM $cur
- WHERE cur_namespace=$ns
- AND cur_title=$title
- AND cur_id != $id
-END
- );
- $dbw->query( <<<END
-DELETE
- FROM $cur
- WHERE cur_namespace=$ns
- AND cur_title=$title
- AND cur_id != $id
-END
- );
- }
- }
- $dbw->query( 'UNLOCK TABLES' );
- echo "Done.\n";
- }
-
- /**
- * Rename all our temporary tables into final place.
- * We've left things in place so a read-only wiki can continue running
- * on the old code during all this.
- */
- function upgradeCleanup() {
- $this->renameTable( 'old', 'text' );
-
- foreach ( $this->cleanupSwaps as $table ) {
- $this->swap( $table );
- }
- }
-
- function renameTable( $from, $to ) {
- $this->log( "Renaming $from to $to..." );
-
- $fromtable = $this->dbw->tableName( $from );
- $totable = $this->dbw->tableName( $to );
- $this->dbw->query( "ALTER TABLE $fromtable RENAME TO $totable" );
- }
-
- function swap( $base ) {
- $this->renameTable( $base, "{$base}_old" );
- $this->renameTable( "{$base}_temp", $base );
- }
-
-}
-
-$maintClass = 'FiveUpgrade';
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/userDupes.inc b/maintenance/userDupes.inc
index 31bae8ed..be45a111 100644
--- a/maintenance/userDupes.inc
+++ b/maintenance/userDupes.inc
@@ -26,13 +26,17 @@
/**
* Look for duplicate user table entries and optionally prune them.
+ *
+ * This is still used by our MysqlUpdater at:
+ * includes/installer/MysqlUpdater.php
+ *
* @ingroup Maintenance
*/
class UserDupes {
- var $db;
- var $reassigned;
- var $trimmed;
- var $failed;
+ private $db;
+ private $reassigned;
+ private $trimmed;
+ private $failed;
private $outputCallback;
function __construct( &$database, $outputCallback ) {
diff --git a/maintenance/userOptions.inc b/maintenance/userOptions.inc
index 2a066579..cbe6b057 100644
--- a/maintenance/userOptions.inc
+++ b/maintenance/userOptions.inc
@@ -108,7 +108,7 @@ class userOptions {
return false;
}
- $this->{ $this->mMode } ( );
+ $this->{ $this->mMode } ();
return true;
}
@@ -117,7 +117,7 @@ class userOptions {
#
/** List default options and their value */
- private function LISTER( ) {
+ private function LISTER() {
$def = User::getDefaultOptions();
ksort( $def );
$maxOpt = 0;
@@ -130,7 +130,7 @@ class userOptions {
}
/** List options usage */
- private function USAGER( ) {
+ private function USAGER() {
$ret = array();
$defaultOptions = User::getDefaultOptions();
@@ -181,7 +181,7 @@ class userOptions {
/** Change our users options */
- private function CHANGER( ) {
+ private function CHANGER() {
$this->warn();
// We list user by user_id from one of the slave database
diff --git a/maintenance/userOptions.php b/maintenance/userOptions.php
index 2181e44d..1e1f24b5 100644
--- a/maintenance/userOptions.php
+++ b/maintenance/userOptions.php
@@ -33,4 +33,3 @@ $uo = new userOptions( $options, $args );
$uo->run();
print "Done.\n";
-
diff --git a/maintenance/waitForSlave.php b/maintenance/waitForSlave.php
index 655be43d..df83928b 100644
--- a/maintenance/waitForSlave.php
+++ b/maintenance/waitForSlave.php
@@ -31,6 +31,7 @@ require_once( __DIR__ . '/Maintenance.php' );
*/
class WaitForSlave extends Maintenance {
public function __construct() {
+ parent::__construct();
$this->addArg( 'maxlag', 'How long to wait for the slaves, default 10 seconds', false );
}
public function execute() {
diff --git a/mw-config/index.php b/mw-config/index.php
index 065d1879..2823210a 100644
--- a/mw-config/index.php
+++ b/mw-config/index.php
@@ -2,6 +2,21 @@
/**
* New version of MediaWiki web-based config/installation
*
+ * 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
*/
diff --git a/mw-config/index.php5 b/mw-config/index.php5
index 8e6ceda9..bc9e891b 100644
--- a/mw-config/index.php5
+++ b/mw-config/index.php5
@@ -1,4 +1,25 @@
<?php
+/**
+ * Version of mw-config/index.php to used in web server requiring .php5
+ * extension to execute scripts with PHP5 engine.
+ *
+ * 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
+ */
define('MW_INSTALL_PHP5_EXT', 1);
require './index.php';
diff --git a/mw-config/overrides.php b/mw-config/overrides.php
index ae982951..d3d85bbb 100644
--- a/mw-config/overrides.php
+++ b/mw-config/overrides.php
@@ -5,6 +5,23 @@
* Altering it is preferred over changing anything in /includes.
*
* Note: this file doesn't gets included from a global scope, don't use globals directly.
+ *
+ * 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
*/
/*
diff --git a/opensearch_desc.php b/opensearch_desc.php
index 95f028ac..cb8b1bec 100644
--- a/opensearch_desc.php
+++ b/opensearch_desc.php
@@ -22,7 +22,7 @@
require_once( __DIR__ . '/includes/WebStart.php' );
-if( $wgRequest->getVal( 'ctype' ) == 'application/xml' ) {
+if ( $wgRequest->getVal( 'ctype' ) == 'application/xml' ) {
// Makes testing tweaks about a billion times easier
$ctype = 'application/xml';
} else {
@@ -65,7 +65,7 @@ print Xml::element( 'Image',
'height' => 16,
'width' => 16,
'type' => 'image/x-icon' ),
- wfExpandUrl( $wgFavicon , PROTO_CURRENT ) );
+ wfExpandUrl( $wgFavicon, PROTO_CURRENT ) );
$urls = array();
@@ -78,7 +78,7 @@ $urls[] = array(
'method' => 'get',
'template' => $searchPage->getCanonicalURL( 'search={searchTerms}' ) );
-if( $wgEnableAPI ) {
+if ( $wgEnableAPI ) {
// JSON interface for search suggestions.
// Supported in Firefox 2 and later.
$urls[] = array(
@@ -91,7 +91,7 @@ if( $wgEnableAPI ) {
// general way than overriding the whole search engine...
wfRunHooks( 'OpenSearchUrls', array( &$urls ) );
-foreach( $urls as $attribs ) {
+foreach ( $urls as $attribs ) {
print Xml::element( 'Url', $attribs );
}
diff --git a/opensearch_desc.php5 b/opensearch_desc.php5
index 16d09ea5..0c499a4d 100644
--- a/opensearch_desc.php5
+++ b/opensearch_desc.php5
@@ -1,7 +1,7 @@
<?php
/**
* Version of opensearch_desc.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
*
* 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
@@ -21,4 +21,4 @@
* @file
*/
-require './opensearch_desc.php';
+require './opensearch_desc.php';
diff --git a/profileinfo.php b/profileinfo.php
index bbd5fc8a..4117d975 100644
--- a/profileinfo.php
+++ b/profileinfo.php
@@ -34,69 +34,138 @@ if ( isset( $_SERVER['MW_COMPILED'] ) ) {
require ( __DIR__ . '/includes/WebStart.php' );
}
-
header( 'Content-Type: text/html; charset=utf-8' );
?>
+<!DOCTYPE html>
<html>
<head>
-<title>Profiling data</title>
-<style type="text/css">
- th {
- text-align: left;
- border-bottom: solid 1px black;
- }
+ <meta charset="UTF-8">
+ <title>Profiling data</title>
+ <style>
+ /* noc.wikimedia.org/base.css */
+
+ * {
+ margin: 0;
+ padding: 0;
+ }
- th, td {
- padding-left: 0.5em;
- padding-right: 0.5em;
- }
+ body {
+ padding: 0.5em 1em;
+ background: #fff;
+ font: 14px/1.6 sans-serif;
+ color: #333;
+ }
- td.timep, td.memoryp, td.count, td.cpr, td.tpc, td.mpc, td.tpr, td.mpr {
- text-align: right;
- }
- td.timep, td.tpc, td.tpr {
- background-color: #ffff80;
- }
- td.memoryp, td.mpc, td.mpr {
- background-color: #80f8ff;
- }
- td.count, td,cpr {
- background-color: #80ff80;
- }
- td.name {
- background-color: #89f9f9;
- }
+ p, ul, ol, table {
+ margin: 0.5em 0;
+ }
- tr:hover {
- font-weight: bold;
- }
-</style>
+ a {
+ color: #0645AD;
+ text-decoration: none;
+ }
+
+ a:hover {
+ text-decoration: underline;
+ }
+
+ /*!
+ * Bootstrap v2.1.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+ table {
+ max-width: 100%;
+ background-color: transparent;
+ border-collapse: collapse;
+ border-spacing: 0;
+ }
+
+ .table {
+ width: 100%;
+ margin-bottom: 20px;
+ }
+
+ .table th,
+ .table td {
+ padding: 0.1em;
+ text-align: left;
+ vertical-align: top;
+ border-top: 1px solid #ddd;
+ }
+
+ .table th {
+ font-weight: bold;
+ }
+
+ .table thead th {
+ vertical-align: bottom;
+ }
+
+ .table thead:first-child tr:first-child th,
+ .table thead:first-child tr:first-child td {
+ border-top: 0;
+ }
+
+ .table tbody + tbody {
+ border-top: 2px solid #ddd;
+ }
+
+ .table-condensed th,
+ .table-condensed td {
+ padding: 4px 5px;
+ }
+
+ .table-striped tbody tr:nth-child(odd) td,
+ .table-striped tbody tr:nth-child(odd) th {
+ background-color: #f9f9f9;
+ }
+
+ .table-hover tbody tr:hover td,
+ .table-hover tbody tr:hover th {
+ background-color: #f5f5f5;
+ }
+
+ hr {
+ margin: 20px 0;
+ border: 0;
+ border-top: 1px solid #eee;
+ border-bottom: 1px solid #fff;
+ }
+ </style>
</head>
<body>
<?php
if ( !$wgEnableProfileInfo ) {
- echo "<p>Disabled</p>\n";
- echo "</body></html>";
+ echo '<p>Disabled</p>'
+ . '</body></html>';
exit( 1 );
}
$dbr = wfGetDB( DB_SLAVE );
-if( !$dbr->tableExists( 'profiling' ) ) {
- echo "<p>No 'profiling' table exists, so we can't show you anything.</p>\n";
- echo "<p>If you want to log profiling data, create the table using "
- . "<tt>maintenance/archives/patch-profiling.sql</tt> and enable "
- . "<tt>\$wgProfileToDatabase</tt>.</p>\n";
- echo "</body></html>";
+if ( !$dbr->tableExists( 'profiling' ) ) {
+ echo '<p>No <code>profiling</code> table exists, so we can\'t show you anything.</p>'
+ . '<p>If you want to log profiling data, enable <code>$wgProfileToDatabase</code>'
+ . ' in your LocalSettings.php and run <code>maintenance/update.php</code> to'
+ . ' create the profiling table.'
+ . '</body></html>';
exit( 1 );
}
$expand = array();
-if ( isset( $_REQUEST['expand'] ) )
- foreach( explode( ',', $_REQUEST['expand'] ) as $f )
+if ( isset( $_REQUEST['expand'] ) ) {
+ foreach ( explode( ',', $_REQUEST['expand'] ) as $f ) {
$expand[$f] = true;
+ }
+}
class profile_point {
var $name;
@@ -123,10 +192,12 @@ class profile_point {
$ex = isset( $expand[$this->name()] );
+ $anchor = str_replace( '"', '', $this->name() );
+
if ( !$ex ) {
if ( count( $this->children ) ) {
$url = getEscapedProfileUrl( false, false, $expand + array( $this->name() => true ) );
- $extet = " <a href=\"$url\">[+]</a>";
+ $extet = " <a id=\"{$anchor}\" href=\"{$url}#{$anchor}\">[+]</a>";
} else {
$extet = '';
}
@@ -137,23 +208,25 @@ class profile_point {
$e += array( $name => $ep );
}
}
-
- $extet = " <a href=\"" . getEscapedProfileUrl( false, false, $e ) . "\">[–]</a>";
+ $url = getEscapedProfileUrl( false, false, $e );
+ $extet = " <a id=\"{$anchor}\" href=\"{$url}#{$anchor}\">[–]</a>";
}
?>
- <tr>
- <td class="name" style="padding-left: <?php echo $indent ?>em;">
- <?php echo htmlspecialchars( $this->name() ) . $extet ?>
- </td>
- <td class="timep"><?php echo @wfPercent( $this->time() / self::$totaltime * 100 ) ?></td>
- <td class="memoryp"><?php echo @wfPercent( $this->memory() / self::$totalmemory * 100 ) ?></td>
- <td class="count"><?php echo $this->count() ?></td>
- <td class="cpr"><?php echo round( sprintf( '%.2f', $this->callsPerRequest() ), 2 ) ?></td>
- <td class="tpc"><?php echo round( sprintf( '%.2f', $this->timePerCall() ), 2 ) ?></td>
- <td class="mpc"><?php echo round( sprintf( '%.2f' ,$this->memoryPerCall() / 1024 ), 2 ) ?></td>
- <td class="tpr"><?php echo @round( sprintf( '%.2f', $this->time() / self::$totalcount ), 2 ) ?></td>
- <td class="mpr"><?php echo @round( sprintf( '%.2f' ,$this->memory() / self::$totalcount / 1024 ), 2 ) ?></td>
- </tr>
+ <tr>
+ <th>
+ <div style="margin-left: <?php echo (int)$indent; ?>em;">
+ <?php echo htmlspecialchars( str_replace( ',', ', ', $this->name() ) ) . $extet ?>
+ </div>
+ </th>
+ <td class="mw-profileinfo-timep"><?php echo @wfPercent( $this->time() / self::$totaltime * 100 ); ?></td>
+ <td class="mw-profileinfo-memoryp"><?php echo @wfPercent( $this->memory() / self::$totalmemory * 100 ); ?></td>
+ <td class="mw-profileinfo-count"><?php echo $this->count(); ?></td>
+ <td class="mw-profileinfo-cpr"><?php echo round( sprintf( '%.2f', $this->callsPerRequest() ), 2 ); ?></td>
+ <td class="mw-profileinfo-tpc"><?php echo round( sprintf( '%.2f', $this->timePerCall() ), 2 ); ?></td>
+ <td class="mw-profileinfo-mpc"><?php echo round( sprintf( '%.2f', $this->memoryPerCall() / 1024 ), 2 ); ?></td>
+ <td class="mw-profileinfo-tpr"><?php echo @round( sprintf( '%.2f', $this->time() / self::$totalcount ), 2 ); ?></td>
+ <td class="mw-profileinfo-mpr"><?php echo @round( sprintf( '%.2f', $this->memory() / self::$totalcount / 1024 ), 2 ); ?></td>
+ </tr>
<?php
if ( $ex ) {
foreach ( $this->children as $child ) {
@@ -173,160 +246,170 @@ class profile_point {
function time() {
return $this->time;
}
-
+
function memory() {
return $this->memory;
}
-
+
function timePerCall() {
return @( $this->time / $this->count );
}
-
+
function memoryPerCall() {
return @( $this->memory / $this->count );
}
-
+
function callsPerRequest() {
return @( $this->count / self::$totalcount );
}
-
+
function timePerRequest() {
return @( $this->time / self::$totalcount );
}
-
+
function memoryPerRequest() {
return @( $this->memory / self::$totalcount );
}
function fmttime() {
- return sprintf( "%5.02f", $this->time );
+ return sprintf( '%5.02f', $this->time );
}
};
-function compare_point(profile_point $a, profile_point $b) {
+function compare_point( profile_point $a, profile_point $b ) {
global $sort;
switch ( $sort ) {
- case "name":
- return strcmp( $a->name(), $b->name() );
- case "time":
- return $a->time() > $b->time() ? -1 : 1;
- case "memory":
- return $a->memory() > $b->memory() ? -1 : 1;
- case "count":
- return $a->count() > $b->count() ? -1 : 1;
- case "time_per_call":
- return $a->timePerCall() > $b->timePerCall() ? -1 : 1;
- case "memory_per_call":
- return $a->memoryPerCall() > $b->memoryPerCall() ? -1 : 1;
- case "calls_per_req":
- return $a->callsPerRequest() > $b->callsPerRequest() ? -1 : 1;
- case "time_per_req":
- return $a->timePerRequest() > $b->timePerRequest() ? -1 : 1;
- case "memory_per_req":
- return $a->memoryPerRequest() > $b->memoryPerRequest() ? -1 : 1;
+ case 'name':
+ return strcmp( $a->name(), $b->name() );
+ case 'time':
+ return $a->time() > $b->time() ? -1 : 1;
+ case 'memory':
+ return $a->memory() > $b->memory() ? -1 : 1;
+ case 'count':
+ return $a->count() > $b->count() ? -1 : 1;
+ case 'time_per_call':
+ return $a->timePerCall() > $b->timePerCall() ? -1 : 1;
+ case 'memory_per_call':
+ return $a->memoryPerCall() > $b->memoryPerCall() ? -1 : 1;
+ case 'calls_per_req':
+ return $a->callsPerRequest() > $b->callsPerRequest() ? -1 : 1;
+ case 'time_per_req':
+ return $a->timePerRequest() > $b->timePerRequest() ? -1 : 1;
+ case 'memory_per_req':
+ return $a->memoryPerRequest() > $b->memoryPerRequest() ? -1 : 1;
}
}
$sorts = array( 'time', 'memory', 'count', 'calls_per_req', 'name',
'time_per_call', 'memory_per_call', 'time_per_req', 'memory_per_req' );
$sort = 'time';
-if ( isset( $_REQUEST['sort'] ) && in_array( $_REQUEST['sort'], $sorts ) )
+if ( isset( $_REQUEST['sort'] ) && in_array( $_REQUEST['sort'], $sorts ) ) {
$sort = $_REQUEST['sort'];
+}
$res = $dbr->select( 'profiling', '*', array(), 'profileinfo.php', array( 'ORDER BY' => 'pf_name ASC' ) );
-if (isset( $_REQUEST['filter'] ) )
+if ( isset( $_REQUEST['filter'] ) ) {
$filter = $_REQUEST['filter'];
-else
+} else {
$filter = '';
+}
?>
<form method="get" action="profileinfo.php">
-<p>
-<input type="text" name="filter" value="<?php echo htmlspecialchars($filter)?>"/>
-<input type="hidden" name="sort" value="<?php echo htmlspecialchars($sort)?>"/>
-<input type="hidden" name="expand" value="<?php echo htmlspecialchars(implode(",", array_keys($expand)))?>"/>
-<input type="submit" value="Filter" />
-</p>
+ <p>
+ <input type="text" name="filter" value="<?php echo htmlspecialchars( $filter ); ?>">
+ <input type="hidden" name="sort" value="<?php echo htmlspecialchars( $sort ); ?>">
+ <input type="hidden" name="expand" value="<?php echo htmlspecialchars( implode( ",", array_keys( $expand ) ) ); ?>">
+ <input type="submit" value="Filter">
+ </p>
</form>
-<table cellspacing="0" border="1">
-<tr id="top">
-<th><a href="<?php echo getEscapedProfileUrl( false, 'name' ) ?>">Name</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'time' ) ?>">Time (%)</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'memory' ) ?>">Memory (%)</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'count' ) ?>">Count</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'calls_per_req' ) ?>">Calls/req</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_call' ) ?>">ms/call</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_call' ) ?>">kb/call</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_req' ) ?>">ms/req</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_req' ) ?>">kb/req</a></th>
-</tr>
-<?php
-profile_point::$totaltime = 0.0;
-profile_point::$totalcount = 0;
-profile_point::$totalmemory = 0.0;
-
-function getEscapedProfileUrl( $_filter = false, $_sort = false, $_expand = false ) {
- global $filter, $sort, $expand;
-
- if ( $_expand === false )
- $_expand = $expand;
-
- return htmlspecialchars(
- '?' .
- wfArrayToCGI( array(
- 'filter' => $_filter ? $_filter : $filter,
- 'sort' => $_sort ? $_sort : $sort,
- 'expand' => implode( ',', array_keys( $_expand ) )
- ) )
- );
-}
+<table class="mw-profileinfo-table table table-striped table-hover">
+ <thead>
+ <tr>
+ <th><a href="<?php echo getEscapedProfileUrl( false, 'name' ); ?>">Name</a></th>
+ <th><a href="<?php echo getEscapedProfileUrl( false, 'time' ); ?>">Time (%)</a></th>
+ <th><a href="<?php echo getEscapedProfileUrl( false, 'memory' ); ?>">Memory (%)</a></th>
+ <th><a href="<?php echo getEscapedProfileUrl( false, 'count' ); ?>">Count</a></th>
+ <th><a href="<?php echo getEscapedProfileUrl( false, 'calls_per_req' ); ?>">Calls/req</a></th>
+ <th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_call' ); ?>">ms/call</a></th>
+ <th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_call' ); ?>">kb/call</a></th>
+ <th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_req' ); ?>">ms/req</a></th>
+ <th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_req' ); ?>">kb/req</a></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php
+ profile_point::$totaltime = 0.0;
+ profile_point::$totalcount = 0;
+ profile_point::$totalmemory = 0.0;
+
+ function getEscapedProfileUrl( $_filter = false, $_sort = false, $_expand = false ) {
+ global $filter, $sort, $expand;
+
+ if ( $_expand === false ) {
+ $_expand = $expand;
+ }
-$points = array();
-$queries = array();
-$sqltotal = 0.0;
-
-$last = false;
-foreach( $res as $o ) {
- $next = new profile_point( $o->pf_name, $o->pf_count, $o->pf_time, $o->pf_memory );
- if( $next->name() == '-total' ) {
- profile_point::$totaltime = $next->time();
- profile_point::$totalcount = $next->count();
- profile_point::$totalmemory = $next->memory();
+ return htmlspecialchars(
+ '?' .
+ wfArrayToCgi( array(
+ 'filter' => $_filter ? $_filter : $filter,
+ 'sort' => $_sort ? $_sort : $sort,
+ 'expand' => implode( ',', array_keys( $_expand ) )
+ ) )
+ );
}
- if ( $last !== false ) {
- if ( preg_match( "/^".preg_quote( $last->name(), "/" )."/", $next->name() ) ) {
- $last->add_child($next);
- continue;
+
+ $points = array();
+ $queries = array();
+ $sqltotal = 0.0;
+
+ $last = false;
+ foreach ( $res as $o ) {
+ $next = new profile_point( $o->pf_name, $o->pf_count, $o->pf_time, $o->pf_memory );
+ if ( $next->name() == '-total' ) {
+ profile_point::$totaltime = $next->time();
+ profile_point::$totalcount = $next->count();
+ profile_point::$totalmemory = $next->memory();
+ }
+ if ( $last !== false ) {
+ if ( preg_match( '/^' . preg_quote( $last->name(), '/' ) . '/', $next->name() ) ) {
+ $last->add_child( $next );
+ continue;
+ }
+ }
+ $last = $next;
+ if ( preg_match( '/^query: /', $next->name() ) || preg_match( '/^query-m: /', $next->name() ) ) {
+ $sqltotal += $next->time();
+ $queries[] = $next;
+ } else {
+ $points[] = $next;
}
}
- $last = $next;
- if ( preg_match( "/^query: /", $next->name() ) || preg_match( "/^query-m: /", $next->name() ) ) {
- $sqltotal += $next->time();
- $queries[] = $next;
- } else {
- $points[] = $next;
- }
-}
-$s = new profile_point( "SQL Queries", 0, $sqltotal, 0, 0 );
-foreach ( $queries as $q )
- $s->add_child($q);
-$points[] = $s;
+ $s = new profile_point( 'SQL Queries', 0, $sqltotal, 0, 0 );
+ foreach ( $queries as $q )
+ $s->add_child( $q );
+ $points[] = $s;
-usort( $points, "compare_point" );
+ usort( $points, 'compare_point' );
-foreach ( $points as $point ) {
- if ( strlen( $filter ) && !strstr( $point->name(), $filter ) )
- continue;
+ foreach ( $points as $point ) {
+ if ( strlen( $filter ) && !strstr( $point->name(), $filter ) ) {
+ continue;
+ }
- $point->display( $expand );
-}
-?>
+ $point->display( $expand );
+ }
+ ?>
+ </tbody>
</table>
+<hr>
+<p>Total time: <code><?php printf( '%5.02f', profile_point::$totaltime ); ?></code></p>
-<p>Total time: <tt><?php printf("%5.02f", profile_point::$totaltime) ?></tt></p>
-<p>Total memory: <tt><?php printf("%5.02f", profile_point::$totalmemory / 1024 ) ?></tt></p>
+<p>Total memory: <code><?php printf( '%5.02f', profile_point::$totalmemory / 1024 ); ?></code></p>
+<hr />
</body>
</html>
diff --git a/redirect.php5 b/redirect.php5
index ae29c4cf..b65f69aa 100644
--- a/redirect.php5
+++ b/redirect.php5
@@ -1,7 +1,7 @@
<?php
/**
* Version of redirect.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
*
* 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
diff --git a/resources/Resources.php b/resources/Resources.php
index 0a70c5a2..6205bb91 100644
--- a/resources/Resources.php
+++ b/resources/Resources.php
@@ -1,8 +1,34 @@
<?php
+/**
+ * Definition of core ResourceLoader modules.
+ *
+ * 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
+ */
+
+if( !defined( 'MEDIAWIKI' ) ) {
+ die( 'Not an entry point.' );
+}
return array(
- /* Special modules who have their own classes */
+ /**
+ * Special modules who have their own classes
+ */
// Scripts managed by the local wiki (stored in the MediaWiki namespace)
'site' => array( 'class' => 'ResourceLoaderSiteModule' ),
@@ -24,7 +50,16 @@ return array(
// Scripts for the dynamic language specific data, like grammar forms.
'mediawiki.language.data' => array( 'class' => 'ResourceLoaderLanguageDataModule' ),
- /* Skins */
+ /**
+ * Skins
+ * Be careful not to add 'scripts' to these modules,
+ * since they are loaded with OutputPage::addModuleStyles so that the skin styles
+ * apply without javascript.
+ * If a skin needs custom js in the interface, register a separate module
+ * and add it to the load queue with OutputPage::addModules.
+ *
+ * See Vector for an example.
+ */
'skins.chick' => array(
'styles' => array( 'chick/main.css' => array( 'media' => 'screen, handheld' ) ),
@@ -91,6 +126,10 @@ return array(
'vector/screen.css' => array( 'media' => 'screen' ),
'vector/screen-hd.css' => array( 'media' => 'screen and (min-width: 982px)' ),
),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.vector.js' => array(
'scripts' => 'vector/vector.js',
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => $GLOBALS['wgStyleDirectory'],
@@ -101,6 +140,7 @@ return array(
'jquery' => array(
'scripts' => 'resources/jquery/jquery.js',
'debugRaw' => false,
+ 'targets' => array( 'desktop', 'mobile' ),
),
/* jQuery Plugins */
@@ -122,6 +162,7 @@ return array(
'jquery.badge' => array(
'scripts' => 'resources/jquery/jquery.badge.js',
'styles' => 'resources/jquery/jquery.badge.css',
+ 'dependencies' => 'mediawiki.language',
),
'jquery.byteLength' => array(
'scripts' => 'resources/jquery/jquery.byteLength.js',
@@ -135,9 +176,7 @@ return array(
),
'jquery.client' => array(
'scripts' => 'resources/jquery/jquery.client.js',
- ),
- 'jquery.collapsibleTabs' => array(
- 'scripts' => 'resources/jquery/jquery.collapsibleTabs.js',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'jquery.color' => array(
'scripts' => 'resources/jquery/jquery.color.js',
@@ -148,6 +187,7 @@ return array(
),
'jquery.cookie' => array(
'scripts' => 'resources/jquery/jquery.cookie.js',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'jquery.delayedBind' => array(
'scripts' => 'resources/jquery/jquery.delayedBind.js',
@@ -171,6 +211,10 @@ return array(
'jquery.getAttrs' => array(
'scripts' => 'resources/jquery/jquery.getAttrs.js',
),
+ 'jquery.hidpi' => array(
+ 'scripts' => 'resources/jquery/jquery.hidpi.js',
+ 'targets' => array( 'desktop', 'mobile' ),
+ ),
'jquery.highlightText' => array(
'scripts' => 'resources/jquery/jquery.highlightText.js',
'dependencies' => 'jquery.mwExtension',
@@ -180,6 +224,7 @@ return array(
),
'jquery.json' => array(
'scripts' => 'resources/jquery/jquery.json.js',
+ 'targets' => array( 'mobile', 'desktop' ),
),
'jquery.localize' => array(
'scripts' => 'resources/jquery/jquery.localize.js',
@@ -197,6 +242,7 @@ return array(
),
'jquery.mwExtension' => array(
'scripts' => 'resources/jquery/jquery.mwExtension.js',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'jquery.placeholder' => array(
'scripts' => 'resources/jquery/jquery.placeholder.js',
@@ -539,6 +585,7 @@ return array(
'scripts' => 'resources/mediawiki/mediawiki.js',
'debugScripts' => 'resources/mediawiki/mediawiki.log.js',
'debugRaw' => false,
+ 'targets' => array( 'desktop', 'mobile' ),
),
'mediawiki.api' => array(
'scripts' => 'resources/mediawiki.api/mediawiki.api.js',
@@ -562,13 +609,6 @@ return array(
'scripts' => 'resources/mediawiki.api/mediawiki.api.parse.js',
'dependencies' => 'mediawiki.api',
),
- 'mediawiki.api.titleblacklist' => array(
- 'scripts' => 'resources/mediawiki.api/mediawiki.api.titleblacklist.js',
- 'dependencies' => array(
- 'mediawiki.api',
- 'mediawiki.Title',
- ),
- ),
'mediawiki.api.watch' => array(
'scripts' => 'resources/mediawiki.api/mediawiki.api.watch.js',
'dependencies' => array(
@@ -614,6 +654,13 @@ return array(
'feedback-bugnew',
),
),
+ 'mediawiki.hidpi' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.hidpi.js',
+ 'dependencies' => array(
+ 'jquery.hidpi',
+ ),
+ 'targets' => array( 'desktop', 'mobile' ),
+ ),
'mediawiki.htmlform' => array(
'scripts' => 'resources/mediawiki/mediawiki.htmlform.js',
),
@@ -626,9 +673,11 @@ return array(
),
'mediawiki.notify' => array(
'scripts' => 'resources/mediawiki/mediawiki.notify.js',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'mediawiki.searchSuggest' => array(
'scripts' => 'resources/mediawiki/mediawiki.searchSuggest.js',
+ 'styles' => 'resources/mediawiki/mediawiki.searchSuggest.css',
'messages' => array(
'searchsuggest-search',
'searchsuggest-containing',
@@ -652,6 +701,8 @@ return array(
'dependencies' => array(
'jquery.cookie',
'mediawiki.api',
+ 'user.options',
+ 'user.tokens',
),
),
'mediawiki.util' => array(
@@ -664,6 +715,7 @@ return array(
),
'messages' => array( 'showtoc', 'hidetoc' ),
'position' => 'top', // For $wgPreloadJavaScriptMwUtil
+ 'targets' => array( 'desktop', 'mobile' ),
),
/* MediaWiki Action */
@@ -693,7 +745,10 @@ return array(
),
'mediawiki.action.view.dblClickEdit' => array(
'scripts' => 'resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js',
- 'dependencies' => 'mediawiki.util',
+ 'dependencies' => array(
+ 'mediawiki.util',
+ 'mediawiki.page.startup',
+ ),
),
'mediawiki.action.view.metadata' => array(
'scripts' => 'resources/mediawiki.action/mediawiki.action.view.metadata.js',
@@ -702,6 +757,10 @@ return array(
'metadata-collapse',
),
),
+ 'mediawiki.action.view.postEdit' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.view.postEdit.js',
+ 'dependencies' => 'jquery.cookie'
+ ),
'mediawiki.action.view.rightClickEdit' => array(
'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
),
@@ -713,7 +772,10 @@ return array(
/* MediaWiki Language */
'mediawiki.language' => array(
- 'scripts' => 'resources/mediawiki.language/mediawiki.language.js',
+ 'scripts' => array(
+ 'resources/mediawiki.language/mediawiki.language.js',
+ 'resources/mediawiki.language/mediawiki.language.numbers.js'
+ ),
'languageScripts' => array(
'bs' => 'resources/mediawiki.language/languages/bs.js',
'dsb' => 'resources/mediawiki.language/languages/dsb.js',
@@ -731,8 +793,9 @@ return array(
),
'dependencies' => array(
'mediawiki.language.data',
- 'mediawiki.cldr'
+ 'mediawiki.cldr',
),
+ 'targets' => array( 'desktop', 'mobile' ),
),
'mediawiki.cldr' => array(
@@ -740,14 +803,17 @@ return array(
'dependencies' => array(
'mediawiki.libs.pluralruleparser',
),
+ 'targets' => array( 'desktop', 'mobile' ),
),
'mediawiki.libs.pluralruleparser' => array(
'scripts' => 'resources/mediawiki.libs/CLDRPluralRuleParser.js',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'mediawiki.language.init' => array(
'scripts' => 'resources/mediawiki.language/mediawiki.language.init.js',
+ 'targets' => array( 'desktop', 'mobile' ),
),
'mediawiki.jqueryMsg' => array(
@@ -756,6 +822,7 @@ return array(
'mediawiki.util',
'mediawiki.language',
),
+ 'targets' => array( 'desktop', 'mobile' ),
),
/* MediaWiki Libs */
@@ -784,6 +851,23 @@ return array(
),
'position' => 'top',
),
+ 'mediawiki.page.patrol.ajax' => array(
+ 'scripts' => 'resources/mediawiki.page/mediawiki.page.patrol.ajax.js',
+ 'dependencies' => array(
+ 'mediawiki.page.startup',
+ 'mediawiki.api',
+ 'mediawiki.util',
+ 'mediawiki.Title',
+ 'mediawiki.notify',
+ 'jquery.spinner',
+ 'user.tokens'
+ ),
+ 'messages' => array(
+ 'markedaspatrollednotify',
+ 'markedaspatrollederrornotify',
+ 'markedaspatrollederror-noautopatrol'
+ ),
+ ),
'mediawiki.page.watch.ajax' => array(
'scripts' => 'resources/mediawiki.page/mediawiki.page.watch.ajax.js',
'dependencies' => array(
@@ -869,6 +953,9 @@ return array(
),
'dependencies' => array( 'mediawiki.libs.jpegmeta', 'mediawiki.util' ),
),
+ 'mediawiki.special.userlogin.signup' => array(
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.userLogin.signup.js',
+ ),
'mediawiki.special.javaScriptTest' => array(
'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
'messages' => array_merge( Skin::getSkinNameMessages(), array(
@@ -884,6 +971,7 @@ return array(
'mediawiki.tests.qunit.testrunner' => array(
'scripts' => 'tests/qunit/data/testrunner.js',
'dependencies' => array(
+ 'jquery.getAttrs',
'jquery.qunit',
'jquery.qunit.completenessTest',
'mediawiki.page.startup',
diff --git a/resources/Resources.php.orig b/resources/Resources.php.orig
new file mode 100644
index 00000000..0a70c5a2
--- /dev/null
+++ b/resources/Resources.php.orig
@@ -0,0 +1,968 @@
+<?php
+
+return array(
+
+ /* Special modules who have their own classes */
+
+ // Scripts managed by the local wiki (stored in the MediaWiki namespace)
+ 'site' => array( 'class' => 'ResourceLoaderSiteModule' ),
+ 'noscript' => array( 'class' => 'ResourceLoaderNoscriptModule' ),
+ 'startup' => array( 'class' => 'ResourceLoaderStartUpModule' ),
+ 'filepage' => array( 'class' => 'ResourceLoaderFilePageModule' ),
+ 'user.groups' => array( 'class' => 'ResourceLoaderUserGroupsModule' ),
+
+ // Scripts managed by the current user (stored in their user space)
+ 'user' => array( 'class' => 'ResourceLoaderUserModule' ),
+
+ // Scripts generated based on the current user's preferences
+ 'user.cssprefs' => array( 'class' => 'ResourceLoaderUserCSSPrefsModule' ),
+
+ // Populate mediawiki.user placeholders with information about the current user
+ 'user.options' => array( 'class' => 'ResourceLoaderUserOptionsModule' ),
+ 'user.tokens' => array( 'class' => 'ResourceLoaderUserTokensModule' ),
+
+ // Scripts for the dynamic language specific data, like grammar forms.
+ 'mediawiki.language.data' => array( 'class' => 'ResourceLoaderLanguageDataModule' ),
+
+ /* Skins */
+
+ 'skins.chick' => array(
+ 'styles' => array( 'chick/main.css' => array( 'media' => 'screen, handheld' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.cologneblue' => array(
+ 'styles' => array( 'cologneblue/screen.css' => array( 'media' => 'screen' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.modern' => array(
+ 'styles' => array(
+ 'modern/main.css' => array( 'media' => 'screen' ),
+ 'modern/print.css' => array( 'media' => 'print' ),
+ ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.monobook' => array(
+ 'styles' => array(
+ 'common/commonElements.css' => array( 'media' => 'screen' ),
+ 'common/commonContent.css' => array( 'media' => 'screen' ),
+ 'common/commonInterface.css' => array( 'media' => 'screen' ),
+ 'monobook/main.css' => array( 'media' => 'screen' ),
+ ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.archlinux' => array(
+ 'styles' => array(
+ 'common/commonElements.css' => array( 'media' => 'screen' ),
+ 'common/commonContent.css' => array( 'media' => 'screen' ),
+ 'common/commonInterface.css' => array( 'media' => 'screen' ),
+ 'archlinux/main.css' => array( 'media' => 'screen' ),
+ 'archlinux/archnavbar.css' => array( 'media' => 'screen' ),
+ 'archlinux/arch.css' => array( 'media' => 'screen' ),
+ 'archlinux/print.css' => array( 'media' => 'print' ),
+ ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.nostalgia' => array(
+ 'styles' => array( 'nostalgia/screen.css' => array( 'media' => 'screen' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.simple' => array(
+ 'styles' => array( 'simple/main.css' => array( 'media' => 'screen' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.standard' => array(
+ 'styles' => array( 'standard/main.css' => array( 'media' => 'screen' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'skins.vector' => array(
+ // Keep in sync with WebInstallerOutput::getCSS()
+ 'styles' => array(
+ 'common/commonElements.css' => array( 'media' => 'screen' ),
+ 'common/commonContent.css' => array( 'media' => 'screen' ),
+ 'common/commonInterface.css' => array( 'media' => 'screen' ),
+ 'vector/screen.css' => array( 'media' => 'screen' ),
+ 'vector/screen-hd.css' => array( 'media' => 'screen and (min-width: 982px)' ),
+ ),
+ 'scripts' => 'vector/vector.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+
+ /* jQuery */
+
+ 'jquery' => array(
+ 'scripts' => 'resources/jquery/jquery.js',
+ 'debugRaw' => false,
+ ),
+
+ /* jQuery Plugins */
+
+ 'jquery.appear' => array(
+ 'scripts' => 'resources/jquery/jquery.appear.js',
+ ),
+ 'jquery.arrowSteps' => array(
+ 'scripts' => 'resources/jquery/jquery.arrowSteps.js',
+ 'styles' => 'resources/jquery/jquery.arrowSteps.css',
+ ),
+ 'jquery.async' => array(
+ 'scripts' => 'resources/jquery/jquery.async.js',
+ ),
+ 'jquery.autoEllipsis' => array(
+ 'scripts' => 'resources/jquery/jquery.autoEllipsis.js',
+ 'dependencies' => 'jquery.highlightText',
+ ),
+ 'jquery.badge' => array(
+ 'scripts' => 'resources/jquery/jquery.badge.js',
+ 'styles' => 'resources/jquery/jquery.badge.css',
+ ),
+ 'jquery.byteLength' => array(
+ 'scripts' => 'resources/jquery/jquery.byteLength.js',
+ ),
+ 'jquery.byteLimit' => array(
+ 'scripts' => 'resources/jquery/jquery.byteLimit.js',
+ 'dependencies' => 'jquery.byteLength',
+ ),
+ 'jquery.checkboxShiftClick' => array(
+ 'scripts' => 'resources/jquery/jquery.checkboxShiftClick.js',
+ ),
+ 'jquery.client' => array(
+ 'scripts' => 'resources/jquery/jquery.client.js',
+ ),
+ 'jquery.collapsibleTabs' => array(
+ 'scripts' => 'resources/jquery/jquery.collapsibleTabs.js',
+ ),
+ 'jquery.color' => array(
+ 'scripts' => 'resources/jquery/jquery.color.js',
+ 'dependencies' => 'jquery.colorUtil',
+ ),
+ 'jquery.colorUtil' => array(
+ 'scripts' => 'resources/jquery/jquery.colorUtil.js',
+ ),
+ 'jquery.cookie' => array(
+ 'scripts' => 'resources/jquery/jquery.cookie.js',
+ ),
+ 'jquery.delayedBind' => array(
+ 'scripts' => 'resources/jquery/jquery.delayedBind.js',
+ ),
+ 'jquery.expandableField' => array(
+ 'scripts' => 'resources/jquery/jquery.expandableField.js',
+ 'dependencies' => 'jquery.delayedBind',
+ ),
+ 'jquery.farbtastic' => array(
+ 'scripts' => 'resources/jquery/jquery.farbtastic.js',
+ 'styles' => 'resources/jquery/jquery.farbtastic.css',
+ 'dependencies' => 'jquery.colorUtil',
+ ),
+ 'jquery.footHovzer' => array(
+ 'scripts' => 'resources/jquery/jquery.footHovzer.js',
+ 'styles' => 'resources/jquery/jquery.footHovzer.css',
+ ),
+ 'jquery.form' => array(
+ 'scripts' => 'resources/jquery/jquery.form.js',
+ ),
+ 'jquery.getAttrs' => array(
+ 'scripts' => 'resources/jquery/jquery.getAttrs.js',
+ ),
+ 'jquery.highlightText' => array(
+ 'scripts' => 'resources/jquery/jquery.highlightText.js',
+ 'dependencies' => 'jquery.mwExtension',
+ ),
+ 'jquery.hoverIntent' => array(
+ 'scripts' => 'resources/jquery/jquery.hoverIntent.js',
+ ),
+ 'jquery.json' => array(
+ 'scripts' => 'resources/jquery/jquery.json.js',
+ ),
+ 'jquery.localize' => array(
+ 'scripts' => 'resources/jquery/jquery.localize.js',
+ ),
+ 'jquery.makeCollapsible' => array(
+ 'scripts' => 'resources/jquery/jquery.makeCollapsible.js',
+ 'styles' => 'resources/jquery/jquery.makeCollapsible.css',
+ 'messages' => array( 'collapsible-expand', 'collapsible-collapse' ),
+ ),
+ 'jquery.mockjax' => array(
+ 'scripts' => 'resources/jquery/jquery.mockjax.js',
+ ),
+ 'jquery.mw-jump' => array(
+ 'scripts' => 'resources/jquery/jquery.mw-jump.js',
+ ),
+ 'jquery.mwExtension' => array(
+ 'scripts' => 'resources/jquery/jquery.mwExtension.js',
+ ),
+ 'jquery.placeholder' => array(
+ 'scripts' => 'resources/jquery/jquery.placeholder.js',
+ ),
+ 'jquery.qunit' => array(
+ 'scripts' => 'resources/jquery/jquery.qunit.js',
+ 'styles' => 'resources/jquery/jquery.qunit.css',
+ 'position' => 'top',
+ ),
+ 'jquery.qunit.completenessTest' => array(
+ 'scripts' => 'resources/jquery/jquery.qunit.completenessTest.js',
+ 'dependencies' => 'jquery.qunit',
+ ),
+ 'jquery.spinner' => array(
+ 'scripts' => 'resources/jquery/jquery.spinner.js',
+ 'styles' => 'resources/jquery/jquery.spinner.css',
+ ),
+ 'jquery.jStorage' => array(
+ 'scripts' => 'resources/jquery/jquery.jStorage.js',
+ 'dependencies' => 'jquery.json',
+ ),
+ 'jquery.suggestions' => array(
+ 'scripts' => 'resources/jquery/jquery.suggestions.js',
+ 'styles' => 'resources/jquery/jquery.suggestions.css',
+ 'dependencies' => 'jquery.autoEllipsis',
+ ),
+ 'jquery.tabIndex' => array(
+ 'scripts' => 'resources/jquery/jquery.tabIndex.js',
+ ),
+ 'jquery.tablesorter' => array(
+ 'scripts' => 'resources/jquery/jquery.tablesorter.js',
+ 'styles' => 'resources/jquery/jquery.tablesorter.css',
+ 'messages' => array( 'sort-descending', 'sort-ascending' ),
+ 'dependencies' => 'jquery.mwExtension',
+ ),
+ 'jquery.textSelection' => array(
+ 'scripts' => 'resources/jquery/jquery.textSelection.js',
+ 'dependencies' => 'jquery.client',
+ ),
+ 'jquery.validate' => array(
+ 'scripts' => 'resources/jquery/jquery.validate.js',
+ ),
+ 'jquery.xmldom' => array(
+ 'scripts' => 'resources/jquery/jquery.xmldom.js',
+ ),
+
+ /* jQuery Tipsy */
+
+ 'jquery.tipsy' => array(
+ 'scripts' => 'resources/jquery.tipsy/jquery.tipsy.js',
+ 'styles' => 'resources/jquery.tipsy/jquery.tipsy.css',
+ ),
+
+ /* jQuery UI */
+
+ // Core
+ 'jquery.ui.core' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.core.js',
+ 'skinStyles' => array(
+ 'default' => array(
+ 'resources/jquery.ui/themes/default/jquery.ui.core.css',
+ 'resources/jquery.ui/themes/default/jquery.ui.theme.css',
+ ),
+ 'vector' => array(
+ 'resources/jquery.ui/themes/vector/jquery.ui.core.css',
+ 'resources/jquery.ui/themes/vector/jquery.ui.theme.css',
+ ),
+ ),
+ 'dependencies' => 'jquery',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.widget' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.widget.js',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.mouse' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.mouse.js',
+ 'dependencies' => 'jquery.ui.widget',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.position' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.position.js',
+ 'group' => 'jquery.ui',
+ ),
+ // Interactions
+ 'jquery.ui.draggable' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.draggable.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.mouse', 'jquery.ui.widget' ),
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.droppable' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.droppable.js',
+ 'dependencies' => array(
+ 'jquery.ui.core', 'jquery.ui.mouse', 'jquery.ui.widget', 'jquery.ui.draggable',
+ ),
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.resizable' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.resizable.js',
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.resizable.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.resizable.css',
+ ),
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.selectable' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.selectable.js',
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.selectable.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.selectable.css',
+ ),
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.sortable' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.sortable.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
+ 'group' => 'jquery.ui',
+ ),
+ // Widgets
+ 'jquery.ui.accordion' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.accordion.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.accordion.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.accordion.css',
+ ),
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.autocomplete' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.autocomplete.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.position' ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.autocomplete.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.autocomplete.css',
+ ),
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.button' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.button.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.button.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.button.css',
+ ),
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.datepicker' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.datepicker.js',
+ 'dependencies' => 'jquery.ui.core',
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.datepicker.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.datepicker.css',
+ ),
+ 'languageScripts' => array(
+ 'af' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-af.js',
+ 'ar' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js',
+ 'az' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-az.js',
+ 'bg' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js',
+ 'bs' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js',
+ 'ca' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ca.js',
+ 'cs' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js',
+ 'da' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-da.js',
+ 'de' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-de.js',
+ 'el' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-el.js',
+ 'en-gb' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js',
+ 'eo' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js',
+ 'es' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-es.js',
+ 'et' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-et.js',
+ 'eu' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js',
+ 'fa' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js',
+ 'fi' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js',
+ 'fo' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js',
+ 'fr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js',
+ 'gl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-gl.js',
+ 'he' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-he.js',
+ 'hi' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hi.js',
+ 'hr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js',
+ 'hu' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js',
+ 'hy' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hy.js',
+ 'id' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-id.js',
+ 'is' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-is.js',
+ 'it' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-it.js',
+ 'ja' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js',
+ 'ka' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ka.js',
+ 'kk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-kk.js',
+ 'km' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-km.js',
+ 'ko' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ko.js',
+ 'lb' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lb.js',
+ 'lt' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lt.js',
+ 'lv' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lv.js',
+ 'mk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-mk.js',
+ 'ml' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ml.js',
+ 'ms' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ms.js',
+ 'nl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js',
+ 'no' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-no.js',
+ 'pl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-pl.js',
+ 'pt' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-pt.js',
+ 'pt-br' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js',
+ 'rm' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-rm.js',
+ 'ro' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js',
+ 'ru' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js',
+ 'sk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js',
+ 'sl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sl.js',
+ 'sq' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js',
+ 'sr-sr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js',
+ 'sr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js',
+ 'sv' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js',
+ 'ta' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js',
+ 'th' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-th.js',
+ 'tr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-tr.js',
+ 'uk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js',
+ 'vi' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js',
+ 'zh-cn' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js',
+ 'zh-hk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js',
+ 'zh-tw' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js',
+ ),
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.dialog' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.dialog.js',
+ 'dependencies' => array(
+ 'jquery.ui.core',
+ 'jquery.ui.widget',
+ 'jquery.ui.button',
+ 'jquery.ui.draggable',
+ 'jquery.ui.mouse',
+ 'jquery.ui.position',
+ 'jquery.ui.resizable',
+ ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.dialog.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.dialog.css',
+ ),
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.progressbar' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.progressbar.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.progressbar.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.progressbar.css',
+ ),
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.slider' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.slider.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.slider.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.slider.css',
+ ),
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.ui.tabs' => array(
+ 'scripts' => 'resources/jquery.ui/jquery.ui.tabs.js',
+ 'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+ 'skinStyles' => array(
+ 'default' => 'resources/jquery.ui/themes/default/jquery.ui.tabs.css',
+ 'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.tabs.css',
+ ),
+ 'group' => 'jquery.ui',
+ ),
+ // Effects
+ 'jquery.effects.core' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.core.js',
+ 'dependencies' => 'jquery',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.effects.blind' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.blind.js',
+ 'dependencies' => 'jquery.effects.core',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.effects.bounce' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.bounce.js',
+ 'dependencies' => 'jquery.effects.core',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.effects.clip' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.clip.js',
+ 'dependencies' => 'jquery.effects.core',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.effects.drop' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.drop.js',
+ 'dependencies' => 'jquery.effects.core',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.effects.explode' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.explode.js',
+ 'dependencies' => 'jquery.effects.core',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.effects.fade' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.fade.js',
+ 'dependencies' => 'jquery.effects.core',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.effects.fold' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.fold.js',
+ 'dependencies' => 'jquery.effects.core',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.effects.highlight' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.highlight.js',
+ 'dependencies' => 'jquery.effects.core',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.effects.pulsate' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.pulsate.js',
+ 'dependencies' => 'jquery.effects.core',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.effects.scale' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.scale.js',
+ 'dependencies' => 'jquery.effects.core',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.effects.shake' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.shake.js',
+ 'dependencies' => 'jquery.effects.core',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.effects.slide' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.slide.js',
+ 'dependencies' => 'jquery.effects.core',
+ 'group' => 'jquery.ui',
+ ),
+ 'jquery.effects.transfer' => array(
+ 'scripts' => 'resources/jquery.effects/jquery.effects.transfer.js',
+ 'dependencies' => 'jquery.effects.core',
+ 'group' => 'jquery.ui',
+ ),
+
+ /* MediaWiki */
+
+ 'mediawiki' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.js',
+ 'debugScripts' => 'resources/mediawiki/mediawiki.log.js',
+ 'debugRaw' => false,
+ ),
+ 'mediawiki.api' => array(
+ 'scripts' => 'resources/mediawiki.api/mediawiki.api.js',
+ 'dependencies' => 'mediawiki.util',
+ ),
+ 'mediawiki.api.category' => array(
+ 'scripts' => 'resources/mediawiki.api/mediawiki.api.category.js',
+ 'dependencies' => array(
+ 'mediawiki.api',
+ 'mediawiki.Title',
+ ),
+ ),
+ 'mediawiki.api.edit' => array(
+ 'scripts' => 'resources/mediawiki.api/mediawiki.api.edit.js',
+ 'dependencies' => array(
+ 'mediawiki.api',
+ 'mediawiki.Title',
+ ),
+ ),
+ 'mediawiki.api.parse' => array(
+ 'scripts' => 'resources/mediawiki.api/mediawiki.api.parse.js',
+ 'dependencies' => 'mediawiki.api',
+ ),
+ 'mediawiki.api.titleblacklist' => array(
+ 'scripts' => 'resources/mediawiki.api/mediawiki.api.titleblacklist.js',
+ 'dependencies' => array(
+ 'mediawiki.api',
+ 'mediawiki.Title',
+ ),
+ ),
+ 'mediawiki.api.watch' => array(
+ 'scripts' => 'resources/mediawiki.api/mediawiki.api.watch.js',
+ 'dependencies' => array(
+ 'mediawiki.api',
+ 'user.tokens',
+ ),
+ ),
+ 'mediawiki.debug' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.debug.js',
+ 'styles' => 'resources/mediawiki/mediawiki.debug.css',
+ 'dependencies' => 'jquery.footHovzer',
+ 'position' => 'bottom',
+ ),
+ 'mediawiki.debug.init' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.debug.init.js',
+ 'dependencies' => 'mediawiki.debug',
+ // Uses a custom mw.config variable that is set in debughtml,
+ // must be loaded on the bottom
+ 'position' => 'bottom',
+ ),
+ 'mediawiki.feedback' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.feedback.js',
+ 'styles' => 'resources/mediawiki/mediawiki.feedback.css',
+ 'dependencies' => array(
+ 'mediawiki.api.edit',
+ 'mediawiki.Title',
+ 'mediawiki.jqueryMsg',
+ 'jquery.ui.dialog',
+ ),
+ 'messages' => array(
+ 'feedback-bugornote',
+ 'feedback-subject',
+ 'feedback-message',
+ 'feedback-cancel',
+ 'feedback-submit',
+ 'feedback-adding',
+ 'feedback-error1',
+ 'feedback-error2',
+ 'feedback-error3',
+ 'feedback-thanks',
+ 'feedback-close',
+ 'feedback-bugcheck',
+ 'feedback-bugnew',
+ ),
+ ),
+ 'mediawiki.htmlform' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.htmlform.js',
+ ),
+ 'mediawiki.notification' => array(
+ 'styles' => 'resources/mediawiki/mediawiki.notification.css',
+ 'scripts' => 'resources/mediawiki/mediawiki.notification.js',
+ 'dependencies' => array(
+ 'mediawiki.page.startup',
+ ),
+ ),
+ 'mediawiki.notify' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.notify.js',
+ ),
+ 'mediawiki.searchSuggest' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.searchSuggest.js',
+ 'messages' => array(
+ 'searchsuggest-search',
+ 'searchsuggest-containing',
+ ),
+ 'dependencies' => array(
+ 'jquery.autoEllipsis',
+ 'jquery.client',
+ 'jquery.placeholder',
+ 'jquery.suggestions',
+ ),
+ ),
+ 'mediawiki.Title' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.Title.js',
+ 'dependencies' => 'mediawiki.util',
+ ),
+ 'mediawiki.Uri' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.Uri.js',
+ ),
+ 'mediawiki.user' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.user.js',
+ 'dependencies' => array(
+ 'jquery.cookie',
+ 'mediawiki.api',
+ ),
+ ),
+ 'mediawiki.util' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.util.js',
+ 'dependencies' => array(
+ 'jquery.client',
+ 'jquery.cookie',
+ 'jquery.mwExtension',
+ 'mediawiki.notify',
+ ),
+ 'messages' => array( 'showtoc', 'hidetoc' ),
+ 'position' => 'top', // For $wgPreloadJavaScriptMwUtil
+ ),
+
+ /* MediaWiki Action */
+
+ 'mediawiki.action.edit' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.js',
+ 'dependencies' => array(
+ 'jquery.textSelection',
+ 'jquery.byteLimit',
+ ),
+ 'position' => 'top',
+ ),
+ 'mediawiki.action.edit.preview' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.preview.js',
+ 'dependencies' => array(
+ 'jquery.form',
+ 'jquery.spinner',
+ ),
+ ),
+ 'mediawiki.action.history' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.history.js',
+ 'group' => 'mediawiki.action.history',
+ ),
+ 'mediawiki.action.history.diff' => array(
+ 'styles' => 'resources/mediawiki.action/mediawiki.action.history.diff.css',
+ 'group' => 'mediawiki.action.history',
+ ),
+ 'mediawiki.action.view.dblClickEdit' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js',
+ 'dependencies' => 'mediawiki.util',
+ ),
+ 'mediawiki.action.view.metadata' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.view.metadata.js',
+ 'messages' => array(
+ 'metadata-expand',
+ 'metadata-collapse',
+ ),
+ ),
+ 'mediawiki.action.view.rightClickEdit' => array(
+ 'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
+ ),
+ // Alias for backwards compatibility
+ 'mediawiki.action.watch.ajax' => array(
+ 'dependencies' => 'mediawiki.page.watch.ajax'
+ ),
+
+ /* MediaWiki Language */
+
+ 'mediawiki.language' => array(
+ 'scripts' => 'resources/mediawiki.language/mediawiki.language.js',
+ 'languageScripts' => array(
+ 'bs' => 'resources/mediawiki.language/languages/bs.js',
+ 'dsb' => 'resources/mediawiki.language/languages/dsb.js',
+ 'fi' => 'resources/mediawiki.language/languages/fi.js',
+ 'ga' => 'resources/mediawiki.language/languages/ga.js',
+ 'he' => 'resources/mediawiki.language/languages/he.js',
+ 'hsb' => 'resources/mediawiki.language/languages/hsb.js',
+ 'hu' => 'resources/mediawiki.language/languages/hu.js',
+ 'hy' => 'resources/mediawiki.language/languages/hy.js',
+ 'la' => 'resources/mediawiki.language/languages/la.js',
+ 'os' => 'resources/mediawiki.language/languages/os.js',
+ 'ru' => 'resources/mediawiki.language/languages/ru.js',
+ 'sl' => 'resources/mediawiki.language/languages/sl.js',
+ 'uk' => 'resources/mediawiki.language/languages/uk.js',
+ ),
+ 'dependencies' => array(
+ 'mediawiki.language.data',
+ 'mediawiki.cldr'
+ ),
+ ),
+
+ 'mediawiki.cldr' => array(
+ 'scripts' => 'resources/mediawiki.language/mediawiki.cldr.js',
+ 'dependencies' => array(
+ 'mediawiki.libs.pluralruleparser',
+ ),
+ ),
+
+ 'mediawiki.libs.pluralruleparser' => array(
+ 'scripts' => 'resources/mediawiki.libs/CLDRPluralRuleParser.js',
+ ),
+
+ 'mediawiki.language.init' => array(
+ 'scripts' => 'resources/mediawiki.language/mediawiki.language.init.js',
+ ),
+
+ 'mediawiki.jqueryMsg' => array(
+ 'scripts' => 'resources/mediawiki/mediawiki.jqueryMsg.js',
+ 'dependencies' => array(
+ 'mediawiki.util',
+ 'mediawiki.language',
+ ),
+ ),
+
+ /* MediaWiki Libs */
+
+ 'mediawiki.libs.jpegmeta' => array(
+ 'scripts' => 'resources/mediawiki.libs/mediawiki.libs.jpegmeta.js',
+ ),
+
+ /* MediaWiki Page */
+
+ 'mediawiki.page.ready' => array(
+ 'scripts' => 'resources/mediawiki.page/mediawiki.page.ready.js',
+ 'dependencies' => array(
+ 'jquery.checkboxShiftClick',
+ 'jquery.makeCollapsible',
+ 'jquery.placeholder',
+ 'jquery.mw-jump',
+ 'mediawiki.util',
+ ),
+ ),
+ 'mediawiki.page.startup' => array(
+ 'scripts' => 'resources/mediawiki.page/mediawiki.page.startup.js',
+ 'dependencies' => array(
+ 'jquery.client',
+ 'mediawiki.util',
+ ),
+ 'position' => 'top',
+ ),
+ 'mediawiki.page.watch.ajax' => array(
+ 'scripts' => 'resources/mediawiki.page/mediawiki.page.watch.ajax.js',
+ 'dependencies' => array(
+ 'mediawiki.page.startup',
+ 'mediawiki.api.watch',
+ 'mediawiki.util',
+ 'mediawiki.notify',
+ 'jquery.mwExtension',
+ ),
+ 'messages' => array(
+ 'watch',
+ 'unwatch',
+ 'watching',
+ 'unwatching',
+ 'tooltip-ca-watch',
+ 'tooltip-ca-unwatch',
+ 'watcherrortext',
+ ),
+ ),
+
+ /* MediaWiki Special pages */
+
+ 'mediawiki.special' => array(
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.js',
+ 'styles' => 'resources/mediawiki.special/mediawiki.special.css',
+ ),
+ 'mediawiki.special.block' => array(
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.block.js',
+ 'dependencies' => array(
+ 'mediawiki.util',
+ ),
+ ),
+ 'mediawiki.special.changeemail' => array(
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.changeemail.js',
+ 'styles' => 'resources/mediawiki.special/mediawiki.special.changeemail.css',
+ 'dependencies' => array(
+ 'mediawiki.util',
+ ),
+ 'messages' => array(
+ 'email-address-validity-valid',
+ 'email-address-validity-invalid',
+ ),
+ ),
+ 'mediawiki.special.changeslist' => array(
+ 'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.css',
+ 'dependencies' => array( 'jquery.makeCollapsible' ),
+ ),
+ 'mediawiki.special.movePage' => array(
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.movePage.js',
+ 'dependencies' => 'jquery.byteLimit',
+ ),
+ 'mediawiki.special.preferences' => array(
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.preferences.js',
+ 'styles' => 'resources/mediawiki.special/mediawiki.special.preferences.css',
+ ),
+ 'mediawiki.special.recentchanges' => array(
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.recentchanges.js',
+ 'dependencies' => array( 'mediawiki.special' ),
+ 'position' => 'top',
+ ),
+ 'mediawiki.special.search' => array(
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.search.js',
+ 'styles' => 'resources/mediawiki.special/mediawiki.special.search.css',
+ 'messages' => array(
+ 'powersearch-togglelabel',
+ 'powersearch-toggleall',
+ 'powersearch-togglenone',
+ ),
+ ),
+ 'mediawiki.special.undelete' => array(
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.undelete.js',
+ ),
+ 'mediawiki.special.upload' => array(
+ // @TODO: merge in remainder of mediawiki.legacy.upload
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.upload.js',
+ 'messages' => array(
+ 'widthheight',
+ 'size-bytes',
+ 'size-kilobytes',
+ 'size-megabytes',
+ 'size-gigabytes',
+ 'largefileserver',
+ ),
+ 'dependencies' => array( 'mediawiki.libs.jpegmeta', 'mediawiki.util' ),
+ ),
+ 'mediawiki.special.javaScriptTest' => array(
+ 'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
+ 'messages' => array_merge( Skin::getSkinNameMessages(), array(
+ 'colon-separator',
+ 'javascripttest-pagetext-skins',
+ ) ),
+ 'dependencies' => array( 'jquery.qunit' ),
+ 'position' => 'top',
+ ),
+
+ /* MediaWiki Tests */
+
+ 'mediawiki.tests.qunit.testrunner' => array(
+ 'scripts' => 'tests/qunit/data/testrunner.js',
+ 'dependencies' => array(
+ 'jquery.qunit',
+ 'jquery.qunit.completenessTest',
+ 'mediawiki.page.startup',
+ 'mediawiki.page.ready',
+ ),
+ 'position' => 'top',
+ ),
+
+ /* MediaWiki Legacy */
+
+ 'mediawiki.legacy.ajax' => array(
+ 'scripts' => 'common/ajax.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => array(
+ 'mediawiki.util',
+ 'mediawiki.legacy.wikibits',
+ ),
+ 'position' => 'top', // Temporary hack for legacy support
+ ),
+ 'mediawiki.legacy.commonPrint' => array(
+ 'styles' => array( 'common/commonPrint.css' => array( 'media' => 'print' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'mediawiki.legacy.config' => array(
+ 'scripts' => 'common/config.js',
+ 'styles' => array( 'common/config.css', 'common/config-cc.css' ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.IEFixes' => array(
+ 'scripts' => 'common/IEFixes.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => 'mediawiki.legacy.wikibits',
+ ),
+ 'mediawiki.legacy.protect' => array(
+ 'scripts' => 'common/protect.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => array(
+ 'mediawiki.legacy.wikibits',
+ 'jquery.byteLimit',
+ ),
+ 'position' => 'top',
+ ),
+ 'mediawiki.legacy.shared' => array(
+ 'styles' => array( 'common/shared.css' => array( 'media' => 'screen' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'mediawiki.legacy.oldshared' => array(
+ 'styles' => array( 'common/oldshared.css' => array( 'media' => 'screen' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+ 'mediawiki.legacy.upload' => array(
+ 'scripts' => 'common/upload.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => array(
+ 'mediawiki.legacy.wikibits',
+ 'mediawiki.util',
+ ),
+ ),
+ 'mediawiki.legacy.wikibits' => array(
+ 'scripts' => 'common/wikibits.js',
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ 'dependencies' => array(
+ 'mediawiki.util',
+ ),
+ 'position' => 'top',
+ ),
+ 'mediawiki.legacy.wikiprintable' => array(
+ 'styles' => array( 'common/wikiprintable.css' => array( 'media' => 'print' ) ),
+ 'remoteBasePath' => $GLOBALS['wgStylePath'],
+ 'localBasePath' => $GLOBALS['wgStyleDirectory'],
+ ),
+);
diff --git a/resources/jquery.effects/jquery.effects.blind.js b/resources/jquery.effects/jquery.effects.blind.js
index 1e997690..ac25bbd8 100644
--- a/resources/jquery.effects/jquery.effects.blind.js
+++ b/resources/jquery.effects/jquery.effects.blind.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects Blind 1.8.23
+ * jQuery UI Effects Blind 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.effects/jquery.effects.bounce.js b/resources/jquery.effects/jquery.effects.bounce.js
index 7927a4a9..1169d770 100644
--- a/resources/jquery.effects/jquery.effects.bounce.js
+++ b/resources/jquery.effects/jquery.effects.bounce.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects Bounce 1.8.23
+ * jQuery UI Effects Bounce 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.effects/jquery.effects.clip.js b/resources/jquery.effects/jquery.effects.clip.js
index d8b8218f..edd51a6a 100644
--- a/resources/jquery.effects/jquery.effects.clip.js
+++ b/resources/jquery.effects/jquery.effects.clip.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects Clip 1.8.23
+ * jQuery UI Effects Clip 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.effects/jquery.effects.core.js b/resources/jquery.effects/jquery.effects.core.js
index 91ac5755..7fd946fd 100644
--- a/resources/jquery.effects/jquery.effects.core.js
+++ b/resources/jquery.effects/jquery.effects.core.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects 1.8.23
+ * jQuery UI Effects 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -307,7 +307,7 @@ $.fn.extend({
/******************************************************************************/
$.extend($.effects, {
- version: "1.8.23",
+ version: "1.8.24",
// Saves a set of properties in a data storage
save: function(element, set) {
diff --git a/resources/jquery.effects/jquery.effects.drop.js b/resources/jquery.effects/jquery.effects.drop.js
index 6d25bd30..97e5abd4 100644
--- a/resources/jquery.effects/jquery.effects.drop.js
+++ b/resources/jquery.effects/jquery.effects.drop.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects Drop 1.8.23
+ * jQuery UI Effects Drop 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.effects/jquery.effects.explode.js b/resources/jquery.effects/jquery.effects.explode.js
index 1caeca86..f63e47a2 100644
--- a/resources/jquery.effects/jquery.effects.explode.js
+++ b/resources/jquery.effects/jquery.effects.explode.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects Explode 1.8.23
+ * jQuery UI Effects Explode 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.effects/jquery.effects.fade.js b/resources/jquery.effects/jquery.effects.fade.js
index 61249798..7aa37b1a 100644
--- a/resources/jquery.effects/jquery.effects.fade.js
+++ b/resources/jquery.effects/jquery.effects.fade.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects Fade 1.8.23
+ * jQuery UI Effects Fade 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.effects/jquery.effects.fold.js b/resources/jquery.effects/jquery.effects.fold.js
index 81b15b83..06cc5533 100644
--- a/resources/jquery.effects/jquery.effects.fold.js
+++ b/resources/jquery.effects/jquery.effects.fold.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects Fold 1.8.23
+ * jQuery UI Effects Fold 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.effects/jquery.effects.highlight.js b/resources/jquery.effects/jquery.effects.highlight.js
index dee0639f..ad9e7bd4 100644
--- a/resources/jquery.effects/jquery.effects.highlight.js
+++ b/resources/jquery.effects/jquery.effects.highlight.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects Highlight 1.8.23
+ * jQuery UI Effects Highlight 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.effects/jquery.effects.pulsate.js b/resources/jquery.effects/jquery.effects.pulsate.js
index 45cdc884..d730beed 100644
--- a/resources/jquery.effects/jquery.effects.pulsate.js
+++ b/resources/jquery.effects/jquery.effects.pulsate.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects Pulsate 1.8.23
+ * jQuery UI Effects Pulsate 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.effects/jquery.effects.scale.js b/resources/jquery.effects/jquery.effects.scale.js
index 44ecee18..52d18710 100644
--- a/resources/jquery.effects/jquery.effects.scale.js
+++ b/resources/jquery.effects/jquery.effects.scale.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects Scale 1.8.23
+ * jQuery UI Effects Scale 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.effects/jquery.effects.shake.js b/resources/jquery.effects/jquery.effects.shake.js
index bc1fd191..44b8ea44 100644
--- a/resources/jquery.effects/jquery.effects.shake.js
+++ b/resources/jquery.effects/jquery.effects.shake.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects Shake 1.8.23
+ * jQuery UI Effects Shake 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.effects/jquery.effects.slide.js b/resources/jquery.effects/jquery.effects.slide.js
index 0a430278..502e6c9d 100644
--- a/resources/jquery.effects/jquery.effects.slide.js
+++ b/resources/jquery.effects/jquery.effects.slide.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects Slide 1.8.23
+ * jQuery UI Effects Slide 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.effects/jquery.effects.transfer.js b/resources/jquery.effects/jquery.effects.transfer.js
index 64f2a17b..4ee4ae88 100644
--- a/resources/jquery.effects/jquery.effects.transfer.js
+++ b/resources/jquery.effects/jquery.effects.transfer.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Effects Transfer 1.8.23
+ * jQuery UI Effects Transfer 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js
index 6c4883f5..83f2825c 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js
@@ -8,8 +8,8 @@ jQuery(function($){
currentText: '今天',
monthNames: ['一月','二月','三月','四月','五月','六月',
'七月','八月','ä¹æœˆ','å月','å一月','å二月'],
- monthNamesShort: ['一','二','三','四','五','六',
- '七','å…«','ä¹','å','å一','å二'],
+ monthNamesShort: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','ä¹æœˆ','å月','å一月','å二月'],
dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
dayNamesMin: ['日','一','二','三','四','五','六'],
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js
index 06c4c628..11189d3a 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js
@@ -8,8 +8,8 @@ jQuery(function($){
currentText: '今天',
monthNames: ['一月','二月','三月','四月','五月','六月',
'七月','八月','ä¹æœˆ','å月','å一月','å二月'],
- monthNamesShort: ['一','二','三','四','五','六',
- '七','å…«','ä¹','å','å一','å二'],
+ monthNamesShort: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','ä¹æœˆ','å月','å一月','å二月'],
dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
dayNamesMin: ['日','一','二','三','四','五','六'],
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js
index dd51e359..089498b4 100644
--- a/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js
+++ b/resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js
@@ -8,8 +8,8 @@ jQuery(function($){
currentText: '今天',
monthNames: ['一月','二月','三月','四月','五月','六月',
'七月','八月','ä¹æœˆ','å月','å一月','å二月'],
- monthNamesShort: ['一','二','三','四','五','六',
- '七','å…«','ä¹','å','å一','å二'],
+ monthNamesShort: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','ä¹æœˆ','å月','å一月','å二月'],
dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
dayNamesMin: ['日','一','二','三','四','五','六'],
diff --git a/resources/jquery.ui/jquery.ui.accordion.js b/resources/jquery.ui/jquery.ui.accordion.js
index b3340e09..dc1ba60a 100644
--- a/resources/jquery.ui/jquery.ui.accordion.js
+++ b/resources/jquery.ui/jquery.ui.accordion.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Accordion 1.8.23
+ * jQuery UI Accordion 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -518,7 +518,7 @@ $.widget( "ui.accordion", {
});
$.extend( $.ui.accordion, {
- version: "1.8.23",
+ version: "1.8.24",
animations: {
slide: function( options, additions ) {
options = $.extend({
diff --git a/resources/jquery.ui/jquery.ui.autocomplete.js b/resources/jquery.ui/jquery.ui.autocomplete.js
index b634cce5..8d69be28 100644
--- a/resources/jquery.ui/jquery.ui.autocomplete.js
+++ b/resources/jquery.ui/jquery.ui.autocomplete.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Autocomplete 1.8.23
+ * jQuery UI Autocomplete 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/jquery.ui.button.js b/resources/jquery.ui/jquery.ui.button.js
index db2637e8..8326262c 100644
--- a/resources/jquery.ui/jquery.ui.button.js
+++ b/resources/jquery.ui/jquery.ui.button.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Button 1.8.23
+ * jQuery UI Button 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/jquery.ui.core.js b/resources/jquery.ui/jquery.ui.core.js
index 1285a6dd..b36c1ac4 100644
--- a/resources/jquery.ui/jquery.ui.core.js
+++ b/resources/jquery.ui/jquery.ui.core.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI 1.8.23
+ * jQuery UI 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -18,7 +18,7 @@ if ( $.ui.version ) {
}
$.extend( $.ui, {
- version: "1.8.23",
+ version: "1.8.24",
keyCode: {
ALT: 18,
diff --git a/resources/jquery.ui/jquery.ui.datepicker.js b/resources/jquery.ui/jquery.ui.datepicker.js
index 7ea5b079..1fcea12a 100644
--- a/resources/jquery.ui/jquery.ui.datepicker.js
+++ b/resources/jquery.ui/jquery.ui.datepicker.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Datepicker 1.8.23
+ * jQuery UI Datepicker 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -12,7 +12,7 @@
*/
(function( $, undefined ) {
-$.extend($.ui, { datepicker: { version: "1.8.23" } });
+$.extend($.ui, { datepicker: { version: "1.8.24" } });
var PROP_NAME = 'datepicker';
var dpuuid = new Date().getTime();
@@ -1845,7 +1845,7 @@ $.fn.datepicker = function(options){
$.datepicker = new Datepicker(); // singleton instance
$.datepicker.initialized = false;
$.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.8.23";
+$.datepicker.version = "1.8.24";
// Workaround for #4055
// Add another global to avoid noConflict issues with inline event handlers
diff --git a/resources/jquery.ui/jquery.ui.dialog.js b/resources/jquery.ui/jquery.ui.dialog.js
index 082bf2c0..06b85f23 100644
--- a/resources/jquery.ui/jquery.ui.dialog.js
+++ b/resources/jquery.ui/jquery.ui.dialog.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Dialog 1.8.23
+ * jQuery UI Dialog 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -690,7 +690,7 @@ $.widget("ui.dialog", {
});
$.extend($.ui.dialog, {
- version: "1.8.23",
+ version: "1.8.24",
uuid: 0,
maxZ: 0,
diff --git a/resources/jquery.ui/jquery.ui.draggable.js b/resources/jquery.ui/jquery.ui.draggable.js
index 6da1aafe..149035c2 100644
--- a/resources/jquery.ui/jquery.ui.draggable.js
+++ b/resources/jquery.ui/jquery.ui.draggable.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Draggable 1.8.23
+ * jQuery UI Draggable 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -237,11 +237,10 @@ $.widget("ui.draggable", $.ui.mouse, {
},
_mouseUp: function(event) {
- if (this.options.iframeFix === true) {
- $("div.ui-draggable-iframeFix").each(function() {
- this.parentNode.removeChild(this);
- }); //Remove frame helpers
- }
+ //Remove frame helpers
+ $("div.ui-draggable-iframeFix").each(function() {
+ this.parentNode.removeChild(this);
+ });
//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
@@ -513,7 +512,7 @@ $.widget("ui.draggable", $.ui.mouse, {
});
$.extend($.ui.draggable, {
- version: "1.8.23"
+ version: "1.8.24"
});
$.ui.plugin.add("draggable", "connectToSortable", {
diff --git a/resources/jquery.ui/jquery.ui.droppable.js b/resources/jquery.ui/jquery.ui.droppable.js
index 4b98b3ad..f17c2223 100644
--- a/resources/jquery.ui/jquery.ui.droppable.js
+++ b/resources/jquery.ui/jquery.ui.droppable.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Droppable 1.8.23
+ * jQuery UI Droppable 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -147,7 +147,7 @@ $.widget("ui.droppable", {
});
$.extend($.ui.droppable, {
- version: "1.8.23"
+ version: "1.8.24"
});
$.ui.intersect = function(draggable, droppable, toleranceMode) {
@@ -260,7 +260,12 @@ $.ui.ddmanager = {
var parentInstance;
if (this.options.greedy) {
- var parent = this.element.parents(':data(droppable):eq(0)');
+ // find droppable parents with same scope
+ var scope = this.options.scope;
+ var parent = this.element.parents(':data(droppable)').filter(function () {
+ return $.data(this, 'droppable').options.scope === scope;
+ });
+
if (parent.length) {
parentInstance = $.data(parent[0], 'droppable');
parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
diff --git a/resources/jquery.ui/jquery.ui.mouse.js b/resources/jquery.ui/jquery.ui.mouse.js
index e051055d..52a1786c 100644
--- a/resources/jquery.ui/jquery.ui.mouse.js
+++ b/resources/jquery.ui/jquery.ui.mouse.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Mouse 1.8.23
+ * jQuery UI Mouse 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/jquery.ui.position.js b/resources/jquery.ui/jquery.ui.position.js
index 03f2606c..8b20179b 100644
--- a/resources/jquery.ui/jquery.ui.position.js
+++ b/resources/jquery.ui/jquery.ui.position.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Position 1.8.23
+ * jQuery UI Position 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/jquery.ui.progressbar.js b/resources/jquery.ui/jquery.ui.progressbar.js
index c1d9f3c2..7cea1baa 100644
--- a/resources/jquery.ui/jquery.ui.progressbar.js
+++ b/resources/jquery.ui/jquery.ui.progressbar.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Progressbar 1.8.23
+ * jQuery UI Progressbar 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -103,7 +103,7 @@ $.widget( "ui.progressbar", {
});
$.extend( $.ui.progressbar, {
- version: "1.8.23"
+ version: "1.8.24"
});
})( jQuery );
diff --git a/resources/jquery.ui/jquery.ui.resizable.js b/resources/jquery.ui/jquery.ui.resizable.js
index f6ce6949..6cc6f41f 100644
--- a/resources/jquery.ui/jquery.ui.resizable.js
+++ b/resources/jquery.ui/jquery.ui.resizable.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Resizable 1.8.23
+ * jQuery UI Resizable 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -540,7 +540,7 @@ $.widget("ui.resizable", $.ui.mouse, {
});
$.extend($.ui.resizable, {
- version: "1.8.23"
+ version: "1.8.24"
});
/*
diff --git a/resources/jquery.ui/jquery.ui.selectable.js b/resources/jquery.ui/jquery.ui.selectable.js
index ac5bf046..44c6e8c5 100644
--- a/resources/jquery.ui/jquery.ui.selectable.js
+++ b/resources/jquery.ui/jquery.ui.selectable.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Selectable 1.8.23
+ * jQuery UI Selectable 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -261,7 +261,7 @@ $.widget("ui.selectable", $.ui.mouse, {
});
$.extend($.ui.selectable, {
- version: "1.8.23"
+ version: "1.8.24"
});
})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.slider.js b/resources/jquery.ui/jquery.ui.slider.js
index 5ea589e6..c554e783 100644
--- a/resources/jquery.ui/jquery.ui.slider.js
+++ b/resources/jquery.ui/jquery.ui.slider.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Slider 1.8.23
+ * jQuery UI Slider 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -656,7 +656,7 @@ $.widget( "ui.slider", $.ui.mouse, {
});
$.extend( $.ui.slider, {
- version: "1.8.23"
+ version: "1.8.24"
});
}(jQuery));
diff --git a/resources/jquery.ui/jquery.ui.sortable.js b/resources/jquery.ui/jquery.ui.sortable.js
index 1d87f653..9e0cac68 100644
--- a/resources/jquery.ui/jquery.ui.sortable.js
+++ b/resources/jquery.ui/jquery.ui.sortable.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Sortable 1.8.23
+ * jQuery UI Sortable 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -296,7 +296,16 @@ $.widget("ui.sortable", $.ui.mouse, {
var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
if (!intersection) continue;
- if(itemElement != this.currentItem[0] //cannot intersect with itself
+ // Only put the placeholder inside the current Container, skip all
+ // items form other containers. This works because when moving
+ // an item from one container to another the
+ // currentContainer is switched before the placeholder is moved.
+ //
+ // Without this moving items in "sub-sortables" can cause the placeholder to jitter
+ // beetween the outer and inner container.
+ if (item.instance !== this.currentContainer) continue;
+
+ if (itemElement != this.currentItem[0] //cannot intersect with itself
&& this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
&& !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
&& (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
@@ -1003,15 +1012,16 @@ $.widget("ui.sortable", $.ui.mouse, {
if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
- if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
- if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
- for (var i = this.containers.length - 1; i >= 0; i--){
- if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
- delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
- delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
- }
- };
- };
+
+ // Check if the items Container has Changed and trigger appropriate
+ // events.
+ if (this !== this.currentContainer) {
+ if(!noPropagation) {
+ delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.currentContainer));
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.currentContainer));
+ }
+ }
//Post events to containers
for (var i = this.containers.length - 1; i >= 0; i--){
@@ -1078,7 +1088,7 @@ $.widget("ui.sortable", $.ui.mouse, {
});
$.extend($.ui.sortable, {
- version: "1.8.23"
+ version: "1.8.24"
});
})(jQuery);
diff --git a/resources/jquery.ui/jquery.ui.tabs.js b/resources/jquery.ui/jquery.ui.tabs.js
index de453cc3..0c47f0e1 100644
--- a/resources/jquery.ui/jquery.ui.tabs.js
+++ b/resources/jquery.ui/jquery.ui.tabs.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Tabs 1.8.23
+ * jQuery UI Tabs 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -698,7 +698,7 @@ $.widget( "ui.tabs", {
});
$.extend( $.ui.tabs, {
- version: "1.8.23"
+ version: "1.8.24"
});
/*
diff --git a/resources/jquery.ui/jquery.ui.widget.js b/resources/jquery.ui/jquery.ui.widget.js
index befdcc25..66ef0133 100644
--- a/resources/jquery.ui/jquery.ui.widget.js
+++ b/resources/jquery.ui/jquery.ui.widget.js
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Widget 1.8.23
+ * jQuery UI Widget 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/themes/default/jquery.ui.accordion.css b/resources/jquery.ui/themes/default/jquery.ui.accordion.css
index 1ce7d5ea..cd8f971c 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.accordion.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.accordion.css
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Accordion 1.8.23
+ * jQuery UI Accordion 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/themes/default/jquery.ui.autocomplete.css b/resources/jquery.ui/themes/default/jquery.ui.autocomplete.css
index a9817ceb..c7eaff22 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.autocomplete.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.autocomplete.css
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Autocomplete 1.8.23
+ * jQuery UI Autocomplete 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -13,7 +13,7 @@
* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
/*
- * jQuery UI Menu 1.8.23
+ * jQuery UI Menu 1.8.24
*
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/themes/default/jquery.ui.button.css b/resources/jquery.ui/themes/default/jquery.ui.button.css
index c1f26009..cd2dbb6e 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.button.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.button.css
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Button 1.8.23
+ * jQuery UI Button 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@@ -7,32 +7,104 @@
*
* http://docs.jquery.com/UI/Button#theming
*/
-.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
-.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
-button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
-.ui-button-icons-only { width: 3.4em; }
-button.ui-button-icons-only { width: 3.7em; }
+
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ margin-right: .1em;
+ text-decoration: none !important;
+ cursor: pointer;
+ text-align: center;
+ zoom: 1;
+ overflow: visible; /* the overflow property removes extra width in IE */
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
/*button text element */
-.ui-button .ui-button-text { display: block; line-height: 1.4; }
-.ui-button-text-only .ui-button-text { padding: .4em 1em; }
-.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
-.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
-.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
-.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+.ui-button .ui-button-text {
+ display: block;
+ line-height: 1.4;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
/* no icon support for input elements, provide padding by default */
-input.ui-button { padding: .4em 1em; }
+ input.ui-button {
+ padding: .4em 1em;
+}
/*button icon element(s) */
-.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
-.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
-.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
-.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
-.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
/*button sets*/
-.ui-buttonset { margin-right: 7px; }
-.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
/* workarounds */
-button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0; /* reset extra padding in Firefox */
+}
diff --git a/resources/jquery.ui/themes/default/jquery.ui.core.css b/resources/jquery.ui/themes/default/jquery.ui.core.css
index c24627e7..8b953a2b 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.core.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.core.css
@@ -1,5 +1,5 @@
/*!
- * jQuery UI CSS Framework 1.8.23
+ * jQuery UI CSS Framework 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/themes/default/jquery.ui.datepicker.css b/resources/jquery.ui/themes/default/jquery.ui.datepicker.css
index 0282eeee..37d3a98e 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.datepicker.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.datepicker.css
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Datepicker 1.8.23
+ * jQuery UI Datepicker 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/themes/default/jquery.ui.dialog.css b/resources/jquery.ui/themes/default/jquery.ui.dialog.css
index ba50ba5a..04515f48 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.dialog.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.dialog.css
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Dialog 1.8.23
+ * jQuery UI Dialog 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/themes/default/jquery.ui.progressbar.css b/resources/jquery.ui/themes/default/jquery.ui.progressbar.css
index c775a33a..90bf3081 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.progressbar.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.progressbar.css
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Progressbar 1.8.23
+ * jQuery UI Progressbar 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/themes/default/jquery.ui.resizable.css b/resources/jquery.ui/themes/default/jquery.ui.resizable.css
index 420c4afa..d17873e7 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.resizable.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.resizable.css
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Resizable 1.8.23
+ * jQuery UI Resizable 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/themes/default/jquery.ui.selectable.css b/resources/jquery.ui/themes/default/jquery.ui.selectable.css
index 33202748..9850ee7e 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.selectable.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.selectable.css
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Selectable 1.8.23
+ * jQuery UI Selectable 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/themes/default/jquery.ui.slider.css b/resources/jquery.ui/themes/default/jquery.ui.slider.css
index 650ad7e2..fbfe6658 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.slider.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.slider.css
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Slider 1.8.23
+ * jQuery UI Slider 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/themes/default/jquery.ui.tabs.css b/resources/jquery.ui/themes/default/jquery.ui.tabs.css
index 64ac9bf5..f0bee7a2 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.tabs.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.tabs.css
@@ -1,5 +1,5 @@
/*!
- * jQuery UI Tabs 1.8.23
+ * jQuery UI Tabs 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/themes/default/jquery.ui.theme.css b/resources/jquery.ui/themes/default/jquery.ui.theme.css
index 536c8e0e..b7d2f617 100644
--- a/resources/jquery.ui/themes/default/jquery.ui.theme.css
+++ b/resources/jquery.ui/themes/default/jquery.ui.theme.css
@@ -1,5 +1,5 @@
/*!
- * jQuery UI CSS Framework 1.8.23
+ * jQuery UI CSS Framework 1.8.24
*
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.button.css b/resources/jquery.ui/themes/vector/jquery.ui.button.css
index 006bbeac..a6a1b544 100644
--- a/resources/jquery.ui/themes/vector/jquery.ui.button.css
+++ b/resources/jquery.ui/themes/vector/jquery.ui.button.css
@@ -1,35 +1,103 @@
/* Button
----------------------------------*/
-.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
-.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
-button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
-.ui-button-icons-only { width: 3.4em; }
-button.ui-button-icons-only { width: 3.7em; }
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ margin-right: .1em;
+ text-decoration: none !important;
+ cursor: pointer;
+ text-align: center;
+ zoom: 1;
+ overflow: visible; /* the overflow property removes extra width in IE */
+}
+.ui-button-icon-only {
+ width: 2.2em; /* to make room for the icon, a width needs to be set here */
+}
+button.ui-button-icon-only {
+ width: 2.4em; /* button elements seem to need a little more width */
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
/*button text element */
-.ui-button .ui-button-text { display: block; line-height: 1.4; }
-.ui-button-text-only .ui-button-text { padding: 0.3em 1em 0.25em 1em; }
-.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: 0.3em; text-indent: -9999999px; }
-.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: 0.3em 1em 0.25em 2.1em; }
-.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: 0.3em 2.1em 0.25em 1em; }
-.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+.ui-button .ui-button-text {
+ display: block;
+ line-height: 1.4;
+}
+.ui-button-text-only .ui-button-text {
+ padding: 0.3em 1em 0.25em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: 0.3em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: 0.3em 1em 0.25em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: 0.3em 2.1em 0.25em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
/* no icon support for input elements, provide padding by default */
-input.ui-button { padding: 0.3em 1em; }
+input.ui-button {
+ padding: 0.3em 1em;
+}
/*button icon element(s) */
-.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -9px; }
-.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
-.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: 0.5em; }
-.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icon .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: 0.5em; }
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-text-icon .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -9px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icon .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: 0.5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icon .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: 0.5em;
+}
/*button sets*/
-.ui-buttonset { margin-right: 7px; }
-.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
/* workarounds */
-button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0; /* reset extra padding in Firefox */
+}
body .ui-button {
margin: 0.5em 0 0.5em 0.4em;
@@ -46,10 +114,38 @@ body .ui-button {
/* Corner radius */
/* This is normally handled in jquery.ui.theme.css, but in our case, the corner
styling of our buttons doesn't match our default widget corner styling */
-.ui-button.ui-corner-all, .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, .ui-button.ui-corner-top, .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; }
+.ui-button.ui-corner-all,
+.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,
+.ui-button.ui-corner-top,
+.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;
+}
body .ui-button:hover {
border-color: #6e7273;
@@ -66,11 +162,11 @@ body .ui-button.disabled {
color: #7f7f7f;
border-color: #cccccc;
/* @embed */
- background: #f2f2f2 url(images/button-disabled.png) repeat-x scroll 50% 100% !important;
+ background: #f2f2f2 url(images/button-disabled.png) repeat-x scroll 50% 100% !important;
}
/* Disables the annoying dashed border Firefox puts on active buttons */
-body button.ui-button::-moz-focus-inner {
- border: 0;
+body button.ui-button::-moz-focus-inner {
+ border: 0;
}
/* Give large buttons some extra padding */
body .ui-button-large {
diff --git a/resources/jquery/jquery.arrowSteps.js b/resources/jquery/jquery.arrowSteps.js
index 488d1065..a1fd679d 100644
--- a/resources/jquery/jquery.arrowSteps.js
+++ b/resources/jquery/jquery.arrowSteps.js
@@ -42,18 +42,21 @@
*/
( function ( $ ) {
$.fn.arrowSteps = function () {
- var $steps, width, arrowWidth;
+ var $steps, width, arrowWidth,
+ paddingSide = $( 'body' ).hasClass( 'rtl' ) ? 'padding-left' : 'padding-right';
+
this.addClass( 'arrowSteps' );
$steps = this.find( 'li' );
width = parseInt( 100 / $steps.length, 10 );
$steps.css( 'width', width + '%' );
- // every step except the last one has an arrow at the right hand side. Also add in the padding
- // for the calculated arrow width.
+ // Every step except the last one has an arrow pointing forward:
+ // at the right hand side in LTR languages, and at the left hand side in RTL.
+ // Also add in the padding for the calculated arrow width.
arrowWidth = parseInt( this.outerHeight(), 10 );
$steps.filter( ':not(:last-child)' ).addClass( 'arrow' )
- .find( 'div' ).css( 'padding-right', arrowWidth.toString() + 'px' );
+ .find( 'div' ).css( paddingSide, arrowWidth.toString() + 'px' );
this.data( 'arrowSteps', $steps );
return this;
diff --git a/resources/jquery/jquery.badge.css b/resources/jquery/jquery.badge.css
index 92e72555..d961bf3d 100644
--- a/resources/jquery/jquery.badge.css
+++ b/resources/jquery/jquery.badge.css
@@ -1,39 +1,34 @@
.mw-badge {
- min-width: 8px;
- height: 14px;
- border: 1px solid white;
- -moz-border-radius: 8px;
- -webkit-border-radius: 8px;
- border-radius: 8px;
- -moz-box-shadow: 0px 1px 4px #ccc;
- -webkit-box-shadow: 0px 1px 4px #ccc;
- box-shadow: 0px 1px 4px #ccc;
- background-color: #b60a00;
- background-image: -o-linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
- background-image: -moz-linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #a70802), color-stop(1, #cf0e00));
- background-image: -webkit-linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
- background-image: -ms-linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
- background-image: linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
- padding: 0 3px;
+ min-width: 7px;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+ border-radius: 2px;
+ padding: 1px 4px;
text-align: center;
+ font-size: 12px;
+ line-height: 12px;
+ background-color: #d2d2d2;
}
.mw-badge-content {
- font-size: 12px;
- line-height: 14px;
+ font-weight: bold;
color: white;
- vertical-align: top;
+ vertical-align: baseline;
+ text-shadow: 0 1px rgba(0, 0, 0, 0.4);
}
.mw-badge-inline {
display: inline-block;
margin-left: 3px;
}
-
.mw-badge-overlay {
position: absolute;
bottom: -1px;
right: -3px;
z-index: 50;
}
+
+.mw-badge-important {
+ background-color: #cc0000;
+}
+
diff --git a/resources/jquery/jquery.badge.js b/resources/jquery/jquery.badge.js
index 04495b71..9404e818 100644
--- a/resources/jquery/jquery.badge.js
+++ b/resources/jquery/jquery.badge.js
@@ -1,8 +1,6 @@
/**
* jQuery Badge plugin
*
- * Based on Badger plugin by Daniel Raftery (http://thrivingkings.com/badger).
- *
* @license MIT
*/
@@ -23,95 +21,56 @@
*
* This program is distributed WITHOUT ANY WARRANTY.
*/
-( function ( $ ) {
-
+( function ( $, mw ) {
/**
- * Allows you to put a numeric "badge" on an item on the page.
+ * Allows you to put a "badge" on an item on the page. The badge container
+ * will be appended to the selected element(s).
* See mediawiki.org/wiki/ResourceLoader/Default_modules#jQuery.badge
*
- * @param {string|number} badgeCount An explicit number, or "+n"/ "-n"
- * to modify the existing value. If the new value is equal or lower than 0,
- * any existing badge will be removed. The badge container will be appended
- * to the selected element(s).
- * @param {Object} options Optional parameters specified below
- * type: 'inline' or 'overlay' (default)
- * callback: will be called with the number now shown on the badge as a parameter
+ * @param {number|string} text The value to display in the badge. If the value is falsey (0,
+ * null, false, '', etc.), any existing badge will be removed.
+ * @param {boolean} inline True if the badge should be displayed inline, false
+ * if the badge should overlay the parent element (default is inline)
+ * @param {boolean} displayZero True if the number zero should be displayed,
+ * false if the number zero should result in the badge being hidden
+ * (default is zero will result in the badge being hidden)
*/
- $.fn.badge = function ( badgeCount, options ) {
- var $badge,
- oldBadgeCount,
- newBadgeCount,
- $existingBadge = this.find( '.mw-badge' );
-
- options = $.extend( { type : 'overlay' }, options );
-
- // If there is no existing badge, this will give an empty string
- oldBadgeCount = Number( $existingBadge.text() );
- if ( isNaN( oldBadgeCount ) ) {
- oldBadgeCount = 0;
- }
+ $.fn.badge = function ( text, inline, displayZero ) {
+ var $badge = this.find( '.mw-badge' ),
+ badgeStyleClass = 'mw-badge-' + ( inline ? 'inline' : 'overlay' ),
+ isImportant = true, displayBadge = true;
- // If badgeCount is a number, use that as the new badge
- if ( typeof badgeCount === 'number' ) {
- newBadgeCount = badgeCount;
- } else if ( typeof badgeCount === 'string' ) {
- // If badgeCount is "+x", add x to the old badge
- if ( badgeCount.charAt(0) === '+' ) {
- newBadgeCount = oldBadgeCount + Number( badgeCount.substr(1) );
- // If badgeCount is "-x", subtract x from the old badge
- } else if ( badgeCount.charAt(0) === '-' ) {
- newBadgeCount = oldBadgeCount - Number( badgeCount.substr(1) );
- // If badgeCount can be converted into a number, convert it
- } else if ( !isNaN( Number( badgeCount ) ) ) {
- newBadgeCount = Number( badgeCount );
- } else {
- newBadgeCount = 0;
+ // If we're displaying zero, ensure style to be non-important
+ if ( mw.language.convertNumber( text, true ) === 0 ) {
+ isImportant = false;
+ if ( !displayZero ) {
+ displayBadge = false;
}
- // Other types are not supported, fall back to 0.
- } else {
- newBadgeCount = 0;
+ // If text is falsey (besides 0), hide the badge
+ } else if ( !text ) {
+ displayBadge = false;
}
- // Badge count must be a whole number
- newBadgeCount = Math.round( newBadgeCount );
-
- if ( newBadgeCount <= 0 ) {
- // Badges should only exist for values > 0.
- $existingBadge.remove();
- } else {
- // Don't add duplicates
- if ( $existingBadge.length ) {
- $badge = $existingBadge;
- // Insert the new count into the badge
- this.find( '.mw-badge-content' ).text( newBadgeCount );
- } else {
- // Contruct a new badge with the count
- $badge = $( '<div>' )
- .addClass( 'mw-badge' )
- .append(
- $( '<span>' )
- .addClass( 'mw-badge-content' )
- .text( newBadgeCount )
- );
- this.append( $badge );
- }
-
- if ( options.type === 'inline' ) {
+ if ( displayBadge ) {
+ // If a badge already exists, reuse it
+ if ( $badge.length ) {
$badge
- .removeClass( 'mw-badge-overlay' )
- .addClass( 'mw-badge-inline' );
- // Default: overlay
+ .toggleClass( 'mw-badge-important', isImportant )
+ .find( '.mw-badge-content' )
+ .text( text );
} else {
- $badge
- .removeClass( 'mw-badge-inline' )
- .addClass( 'mw-badge-overlay' );
-
- }
-
- // If a callback was specified, call it with the badge count
- if ( $.isFunction( options.callback ) ) {
- options.callback( newBadgeCount );
+ // Otherwise, create a new badge with the specified text and style
+ $badge = $( '<div class="mw-badge"></div>' )
+ .addClass( badgeStyleClass )
+ .toggleClass( 'mw-badge-important', isImportant )
+ .append(
+ $( '<span class="mw-badge-content"></span>' ).text( text )
+ )
+ .appendTo( this );
}
+ } else {
+ $badge.remove();
}
+ return this;
};
-}( jQuery ) );
+}( jQuery, mediaWiki ) );
diff --git a/resources/jquery/jquery.byteLimit.js b/resources/jquery/jquery.byteLimit.js
index 75dc2b90..f2b98f09 100644
--- a/resources/jquery/jquery.byteLimit.js
+++ b/resources/jquery/jquery.byteLimit.js
@@ -221,8 +221,11 @@
// This is a side-effect of limiting after the fact.
if ( res.trimmed === true ) {
this.value = res.newVal;
- prevSafeVal = res.newVal;
}
+ // Always adjust prevSafeVal to reflect the input value. Not doing this could cause
+ // trimValForByteLength to compare the new value to an empty string instead of the
+ // old value, resulting in trimming always from the end (bug 40850).
+ prevSafeVal = res.newVal;
} );
} );
};
diff --git a/resources/jquery/jquery.checkboxShiftClick.js b/resources/jquery/jquery.checkboxShiftClick.js
index 1990dc0d..aced0633 100644
--- a/resources/jquery/jquery.checkboxShiftClick.js
+++ b/resources/jquery/jquery.checkboxShiftClick.js
@@ -1,14 +1,16 @@
/**
* jQuery checkboxShiftClick
*
- * This will enable checkboxes to be checked or unchecked in a row by clicking one, holding shift and clicking another one
+ * This will enable checkboxes to be checked or unchecked in a row by clicking one,
+ * holding shift and clicking another one.
*
- * @author Krinkle <krinklemail@gmail.com>
+ * @author Timo Tijhof, 2011 - 2012
* @license GPL v2
*/
( function ( $ ) {
- $.fn.checkboxShiftClick = function ( text ) {
- var prevCheckbox = null, $box = this;
+ $.fn.checkboxShiftClick = function () {
+ var prevCheckbox = null,
+ $box = this;
// When our boxes are clicked..
$box.click( function ( e ) {
// And one has been clicked before...
diff --git a/resources/jquery/jquery.client.js b/resources/jquery/jquery.client.js
index 24f8959e..b0bd6850 100644
--- a/resources/jquery/jquery.client.js
+++ b/resources/jquery/jquery.client.js
@@ -40,71 +40,74 @@
// Use the cached version if possible
if ( profileCache[nav.userAgent] === undefined ) {
- /* Configuration */
-
- // Name of browsers or layout engines we don't recognize
- var uk = 'unknown';
- // Generic version digit
- var x = 'x';
- // Strings found in user agent strings that need to be conformed
- var wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3'];
- // Translations for conforming user agent strings
- var userAgentTranslations = [
- // Tons of browsers lie about being something they are not
- [/(Firefox|MSIE|KHTML,\slike\sGecko|Konqueror)/, ''],
- // Chrome lives in the shadow of Safari still
- ['Chrome Safari', 'Chrome'],
- // KHTML is the layout engine not the browser - LIES!
- ['KHTML', 'Konqueror'],
- // Firefox nightly builds
- ['Minefield', 'Firefox'],
- // This helps keep differnt versions consistent
- ['Navigator', 'Netscape'],
- // This prevents version extraction issues, otherwise translation would happen later
- ['PLAYSTATION 3', 'PS3']
- ];
- // Strings which precede a version number in a user agent string - combined and used as match 1 in
- // version detectection
- var versionPrefixes = [
- 'camino', 'chrome', 'firefox', 'netscape', 'netscape6', 'opera', 'version', 'konqueror',
- 'lynx', 'msie', 'safari', 'ps3'
- ];
- // Used as matches 2, 3 and 4 in version extraction - 3 is used as actual version number
- var versionSuffix = '(\\/|\\;?\\s|)([a-z0-9\\.\\+]*?)(\\;|dev|rel|\\)|\\s|$)';
- // Names of known browsers
- var names = [
- 'camino', 'chrome', 'firefox', 'netscape', 'konqueror', 'lynx', 'msie', 'opera',
- 'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq'
- ];
- // Tanslations for conforming browser names
- var nameTranslations = [];
- // Names of known layout engines
- var layouts = ['gecko', 'konqueror', 'msie', 'opera', 'webkit'];
- // Translations for conforming layout names
- var layoutTranslations = [['konqueror', 'khtml'], ['msie', 'trident'], ['opera', 'presto']];
- // Names of supported layout engines for version number
- var layoutVersions = ['applewebkit', 'gecko'];
- // Names of known operating systems
- var platforms = ['win', 'mac', 'linux', 'sunos', 'solaris', 'iphone'];
- // Translations for conforming operating system names
- var platformTranslations = [['sunos', 'solaris']];
-
- /* Methods */
-
- /**
- * Performs multiple replacements on a string
- */
- var translate = function ( source, translations ) {
- var i;
- for ( i = 0; i < translations.length; i++ ) {
- source = source.replace( translations[i][0], translations[i][1] );
- }
- return source;
- };
-
- /* Pre-processing */
-
- var ua = nav.userAgent,
+ var
+ versionNumber,
+
+ /* Configuration */
+
+ // Name of browsers or layout engines we don't recognize
+ uk = 'unknown',
+ // Generic version digit
+ x = 'x',
+ // Strings found in user agent strings that need to be conformed
+ wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3'],
+ // Translations for conforming user agent strings
+ userAgentTranslations = [
+ // Tons of browsers lie about being something they are not
+ [/(Firefox|MSIE|KHTML,\slike\sGecko|Konqueror)/, ''],
+ // Chrome lives in the shadow of Safari still
+ ['Chrome Safari', 'Chrome'],
+ // KHTML is the layout engine not the browser - LIES!
+ ['KHTML', 'Konqueror'],
+ // Firefox nightly builds
+ ['Minefield', 'Firefox'],
+ // This helps keep differnt versions consistent
+ ['Navigator', 'Netscape'],
+ // This prevents version extraction issues, otherwise translation would happen later
+ ['PLAYSTATION 3', 'PS3']
+ ],
+ // Strings which precede a version number in a user agent string - combined and used as match 1 in
+ // version detectection
+ versionPrefixes = [
+ 'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'netscape6', 'opera', 'version', 'konqueror',
+ 'lynx', 'msie', 'safari', 'ps3'
+ ],
+ // Used as matches 2, 3 and 4 in version extraction - 3 is used as actual version number
+ versionSuffix = '(\\/|\\;?\\s|)([a-z0-9\\.\\+]*?)(\\;|dev|rel|\\)|\\s|$)',
+ // Names of known browsers
+ names = [
+ 'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'konqueror', 'lynx', 'msie', 'opera',
+ 'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq'
+ ],
+ // Tanslations for conforming browser names
+ nameTranslations = [],
+ // Names of known layout engines
+ layouts = ['gecko', 'konqueror', 'msie', 'opera', 'webkit'],
+ // Translations for conforming layout names
+ layoutTranslations = [ ['konqueror', 'khtml'], ['msie', 'trident'], ['opera', 'presto'] ],
+ // Names of supported layout engines for version number
+ layoutVersions = ['applewebkit', 'gecko'],
+ // Names of known operating systems
+ platforms = ['win', 'mac', 'linux', 'sunos', 'solaris', 'iphone'],
+ // Translations for conforming operating system names
+ platformTranslations = [ ['sunos', 'solaris'] ],
+
+ /* Methods */
+
+ /**
+ * Performs multiple replacements on a string
+ */
+ translate = function ( source, translations ) {
+ var i;
+ for ( i = 0; i < translations.length; i++ ) {
+ source = source.replace( translations[i][0], translations[i][1] );
+ }
+ return source;
+ },
+
+ /* Pre-processing */
+
+ ua = nav.userAgent,
match,
name = uk,
layout = uk,
@@ -145,9 +148,14 @@
}
// Expose Opera 10's lies about being Opera 9.8
if ( name === 'opera' && version >= 9.8) {
- version = ua.match( /version\/([0-9\.]*)/i )[1] || 10;
+ match = ua.match( /version\/([0-9\.]*)/i );
+ if ( match && match[1] ) {
+ version = match[1];
+ } else {
+ version = '10';
+ }
}
- var versionNumber = parseFloat( version, 10 ) || 0.0;
+ versionNumber = parseFloat( version, 10 ) || 0.0;
/* Caching */
@@ -191,11 +199,10 @@
* @return Boolean true if browser known or assumed to be supported, false if blacklisted
*/
test: function ( map, profile ) {
- /*jshint evil:true */
+ /*jshint evil: true */
var conditions, dir, i, op, val;
profile = $.isPlainObject( profile ) ? profile : $.client.profile();
-
dir = $( 'body' ).is( '.rtl' ) ? 'rtl' : 'ltr';
// Check over each browser condition to determine if we are running in a compatible client
if ( typeof map[dir] !== 'object' || map[dir][profile.name] === undefined ) {
@@ -203,12 +210,12 @@
return true;
}
conditions = map[dir][profile.name];
+ if ( conditions === false ) {
+ return false;
+ }
for ( i = 0; i < conditions.length; i++ ) {
op = conditions[i][0];
val = conditions[i][1];
- if ( val === false ) {
- return false;
- }
if ( typeof val === 'string' ) {
if ( !( eval( 'profile.version' + op + '"' + val + '"' ) ) ) {
return false;
@@ -219,6 +226,7 @@
}
}
}
+
return true;
}
};
diff --git a/resources/jquery/jquery.collapsibleTabs.js b/resources/jquery/jquery.collapsibleTabs.js
deleted file mode 100644
index cb25796f..00000000
--- a/resources/jquery/jquery.collapsibleTabs.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * Collapsible tabs jQuery Plugin
- */
-( function ( $ ) {
- $.fn.collapsibleTabs = function ( options ) {
- // return if the function is called on an empty jquery object
- if ( !this.length ) {
- return this;
- }
- // Merge options into the defaults
- var $settings = $.extend( {}, $.collapsibleTabs.defaults, options );
-
- this.each( function () {
- var $el = $( this );
- // add the element to our array of collapsible managers
- $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
- $el : $.collapsibleTabs.instances.add( $el ) );
- // attach the settings to the elements
- $el.data( 'collapsibleTabsSettings', $settings );
- // attach data to our collapsible elements
- $el.children( $settings.collapsible ).each( function () {
- $.collapsibleTabs.addData( $( this ) );
- } );
- } );
-
- // if we haven't already bound our resize hanlder, bind it now
- if ( !$.collapsibleTabs.boundEvent ) {
- $( window )
- .delayedBind( '500', 'resize', function ( ) {
- $.collapsibleTabs.handleResize();
- } );
- }
- // call our resize handler to setup the page
- $.collapsibleTabs.handleResize();
- return this;
- };
- $.collapsibleTabs = {
- instances: [],
- boundEvent: null,
- defaults: {
- expandedContainer: '#p-views ul',
- collapsedContainer: '#p-cactions ul',
- collapsible: 'li.collapsible',
- shifting: false,
- expandCondition: function ( eleWidth ) {
- return ( $( '#left-navigation' ).position().left + $( '#left-navigation' ).width() )
- < ( $( '#right-navigation' ).position().left - eleWidth );
- },
- collapseCondition: function () {
- return ( $( '#left-navigation' ).position().left + $( '#left-navigation' ).width() )
- > $( '#right-navigation' ).position().left;
- }
- },
- addData: function ( $collapsible ) {
- var $settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
- if ( $settings !== null ) {
- $collapsible.data( 'collapsibleTabsSettings', {
- expandedContainer: $settings.expandedContainer,
- collapsedContainer: $settings.collapsedContainer,
- expandedWidth: $collapsible.width(),
- prevElement: $collapsible.prev()
- } );
- }
- },
- getSettings: function ( $collapsible ) {
- var $settings = $collapsible.data( 'collapsibleTabsSettings' );
- if ( $settings === undefined ) {
- $.collapsibleTabs.addData( $collapsible );
- $settings = $collapsible.data( 'collapsibleTabsSettings' );
- }
- return $settings;
- },
- handleResize: function ( e ) {
- $.collapsibleTabs.instances.each( function () {
- var $el = $( this ),
- data = $.collapsibleTabs.getSettings( $el );
-
- if ( data.shifting ) {
- return;
- }
-
- // if the two navigations are colliding
- if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
-
- $el.trigger( 'beforeTabCollapse' );
- // move the element to the dropdown menu
- $.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) );
- }
-
- // if there are still moveable items in the dropdown menu,
- // and there is sufficient space to place them in the tab container
- if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0
- && data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
- data.collapsible + ':first' ) ).expandedWidth ) ) {
- //move the element from the dropdown to the tab
- $el.trigger( 'beforeTabExpand' );
- $.collapsibleTabs
- .moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
- }
- });
- },
- moveToCollapsed: function ( ele ) {
- var $moving = $( ele ),
- data = $.collapsibleTabs.getSettings( $moving ),
- dataExp = $.collapsibleTabs.getSettings( data.expandedContainer );
- dataExp.shifting = true;
- $moving
- .detach()
- .prependTo( data.collapsedContainer )
- .data( 'collapsibleTabsSettings', data );
- dataExp.shifting = false;
- $.collapsibleTabs.handleResize();
- },
- moveToExpanded: function ( ele ) {
- var $moving = $( ele ),
- data = $.collapsibleTabs.getSettings( $moving ),
- dataExp = $.collapsibleTabs.getSettings( data.expandedContainer );
- dataExp.shifting = true;
- // remove this element from where it's at and put it in the dropdown menu
- $moving.detach().insertAfter( data.prevElement ).data( 'collapsibleTabsSettings', data );
- dataExp.shifting = false;
- $.collapsibleTabs.handleResize();
- }
- };
-
-}( jQuery ) );
diff --git a/resources/jquery/jquery.colorUtil.js b/resources/jquery/jquery.colorUtil.js
index c1fe7fe3..9c6f9ecb 100644
--- a/resources/jquery/jquery.colorUtil.js
+++ b/resources/jquery/jquery.colorUtil.js
@@ -113,17 +113,20 @@
* @return Array The HSL representation
*/
rgbToHsl: function ( R, G, B ) {
- var r = R / 255,
+ var d,
+ r = R / 255,
g = G / 255,
- b = B / 255;
- var max = Math.max( r, g, b ), min = Math.min( r, g, b );
- var h, s, l = (max + min) / 2;
+ b = B / 255,
+ max = Math.max( r, g, b ), min = Math.min( r, g, b ),
+ h,
+ s,
+ l = (max + min) / 2;
if ( max === min ) {
// achromatic
h = s = 0;
} else {
- var d = max - min;
+ d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch ( max ) {
case r:
@@ -155,12 +158,12 @@
* @return Array The RGB representation
*/
hslToRgb: function ( h, s, l ) {
- var r, g, b;
+ var r, g, b, hue2rgb, q, p;
if ( s === 0 ) {
r = g = b = l; // achromatic
} else {
- var hue2rgb = function ( p, q, t ) {
+ hue2rgb = function ( p, q, t ) {
if ( t < 0 ) {
t += 1;
}
@@ -179,8 +182,8 @@
return p;
};
- var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
- var p = 2 * l - q;
+ q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+ p = 2 * l - q;
r = hue2rgb( p, q, h + 1/3 );
g = hue2rgb( p, q, h );
b = hue2rgb( p, q, h - 1/3 );
diff --git a/resources/jquery/jquery.delayedBind.js b/resources/jquery/jquery.delayedBind.js
index 5d32b6b0..40f3d44e 100644
--- a/resources/jquery/jquery.delayedBind.js
+++ b/resources/jquery/jquery.delayedBind.js
@@ -43,12 +43,12 @@ $.fn.extend( {
$(this).data( '_delayedBindTimerID-' + encEvent + '-' + timeout, timerID );
} );
}
-
+
// Bottom half
$(this).bind( '_delayedBind-' + encEvent + '-' + timeout, data, callback );
} );
},
-
+
/**
* Cancel the timers for delayed events on the selected elements.
*/
@@ -61,7 +61,7 @@ $.fn.extend( {
}
} );
},
-
+
/**
* Unbind an event bound with delayedBind()
*/
diff --git a/resources/jquery/jquery.expandableField.js b/resources/jquery/jquery.expandableField.js
index 063f2609..9e532e52 100644
--- a/resources/jquery/jquery.expandableField.js
+++ b/resources/jquery/jquery.expandableField.js
@@ -67,16 +67,16 @@
context = {
config: {
// callback function for before collapse
- beforeCondense: function ( context ) {},
+ beforeCondense: function () {},
// callback function for before expand
- beforeExpand: function ( context ) {},
+ beforeExpand: function () {},
// callback function for after collapse
- afterCondense: function ( context ) {},
+ afterCondense: function () {},
// callback function for after expand
- afterExpand: function ( context ) {},
+ afterExpand: function () {},
// Whether the field should expand to the left or the right -- defaults to left
expandToLeft: true
diff --git a/resources/jquery/jquery.hidpi.js b/resources/jquery/jquery.hidpi.js
new file mode 100644
index 00000000..70bfc4ea
--- /dev/null
+++ b/resources/jquery/jquery.hidpi.js
@@ -0,0 +1,117 @@
+/**
+ * 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.
+ *
+ * $.devicePixelRatio() can be used to supplement window.devicePixelRatio with support on
+ * some additional browsers.
+ */
+( 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
+ *
+ * Uses window.devicePixelRatio if available, or CSS media queries on IE.
+ *
+ * @method
+ * @returns {number} Device pixel ratio
+ */
+$.devicePixelRatio = function () {
+ if ( window.devicePixelRatio !== undefined ) {
+ // Most web browsers:
+ // * WebKit (Safari, Chrome, Android browser, etc)
+ // * Opera
+ // * Firefox 18+
+ return window.devicePixelRatio;
+ } else if ( window.msMatchMedia !== undefined ) {
+ // Windows 8 desktops / tablets, probably Windows Phone 8
+ //
+ // IE 10 doesn't report pixel ratio directly, but we can get the
+ // screen DPI and divide by 96. We'll bracket to [1, 1.5, 2.0] for
+ // simplicity, but you may get different values depending on zoom
+ // factor, size of screen and orientation in Metro IE.
+ if ( window.msMatchMedia( '(min-resolution: 192dpi)' ).matches ) {
+ return 2;
+ } else if ( window.msMatchMedia( '(min-resolution: 144dpi)' ).matches ) {
+ return 1.5;
+ } else {
+ return 1;
+ }
+ } else {
+ // Legacy browsers...
+ // Assume 1 if unknown.
+ return 1;
+ }
+};
+
+/**
+ * Implement responsive images based on srcset attributes, if browser has no
+ * native srcset support.
+ *
+ * @method
+ * @returns {jQuery} This selection
+ */
+$.fn.hidpi = function () {
+ var $target = this,
+ // @todo add support for dpi media query checks on Firefox, IE
+ devicePixelRatio = $.devicePixelRatio(),
+ testImage = new Image();
+
+ if ( devicePixelRatio > 1 && testImage.srcset === undefined ) {
+ // No native srcset support.
+ $target.find( 'img' ).each( function () {
+ var $img = $( this ),
+ srcset = $img.attr( 'srcset' ),
+ match;
+ if ( typeof srcset === 'string' && srcset !== '' ) {
+ match = $.matchSrcSet( devicePixelRatio, srcset );
+ if (match !== null ) {
+ $img.attr( 'src', match );
+ }
+ }
+ });
+ }
+
+ return $target;
+};
+
+/**
+ * Match a srcset entry for the given device pixel ratio
+ *
+ * @param {number} devicePixelRatio
+ * @param {string} srcset
+ * @return {mixed} null or the matching src string
+ *
+ * Exposed for testing.
+ */
+$.matchSrcSet = function ( devicePixelRatio, srcset ) {
+ var candidates,
+ candidate,
+ bits,
+ src,
+ i,
+ ratioStr,
+ ratio,
+ selectedRatio = 1,
+ selectedSrc = null;
+ candidates = srcset.split( / *, */ );
+ for ( i = 0; i < candidates.length; i++ ) {
+ candidate = candidates[i];
+ bits = candidate.split( / +/ );
+ src = bits[0];
+ if ( bits.length > 1 && bits[1].charAt( bits[1].length - 1 ) === 'x' ) {
+ ratioStr = bits[1].substr( 0, bits[1].length - 1 );
+ ratio = parseFloat( ratioStr );
+ if ( ratio <= devicePixelRatio && ratio > selectedRatio ) {
+ selectedRatio = ratio;
+ selectedSrc = src;
+ }
+ }
+ }
+ return selectedSrc;
+};
+
+}( jQuery ) );
diff --git a/resources/jquery/jquery.highlightText.js b/resources/jquery/jquery.highlightText.js
index f720e07f..cda2765b 100644
--- a/resources/jquery/jquery.highlightText.js
+++ b/resources/jquery/jquery.highlightText.js
@@ -29,7 +29,7 @@
// non latin characters can make regex think a new word has begun: do not use \b
// http://stackoverflow.com/questions/3787072/regex-wordwrap-with-utf8-characters-in-js
// look for an occurrence of our pattern and store the starting position
- match = node.data.match( new RegExp( "(^|\\s)" + $.escapeRE( pat ), "i" ) );
+ match = node.data.match( new RegExp( '(^|\\s)' + $.escapeRE( pat ), 'i' ) );
if ( match ) {
pos = match.index + match[1].length; // include length of any matched spaces
// create the span wrapper for the matched text
diff --git a/resources/jquery/jquery.jStorage.js b/resources/jquery/jquery.jStorage.js
index 95959cf7..6ca21b5c 100644
--- a/resources/jquery/jquery.jStorage.js
+++ b/resources/jquery/jquery.jStorage.js
@@ -3,12 +3,9 @@
* Simple local storage wrapper to save data on the browser side, supporting
* all major browsers - IE6+, Firefox2+, Safari4+, Chrome4+ and Opera 10.5+
*
- * Copyright (c) 2010 Andris Reinman, andris.reinman@gmail.com
+ * Copyright (c) 2010 - 2012 Andris Reinman, andris.reinman@gmail.com
* Project homepage: www.jstorage.info
*
- * Taken from Github with slight modifications by Hoo man
- * https://raw.github.com/andris9/jStorage/master/jstorage.js
- *
* Licensed under MIT-style license:
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -27,52 +24,30 @@
* SOFTWARE.
*/
-/**
- * $.jStorage
- *
- * USAGE:
- *
- * jStorage requires Prototype, MooTools or jQuery! If jQuery is used, then
- * jQuery-JSON (http://code.google.com/p/jquery-json/) is also needed.
- * (jQuery-JSON needs to be loaded BEFORE jStorage!)
- *
- * Methods:
- *
- * -set(key, value[, options])
- * $.jStorage.set(key, value) -> saves a value
- *
- * -get(key[, default])
- * value = $.jStorage.get(key [, default]) ->
- * retrieves value if key exists, or default if it doesn't
- *
- * -deleteKey(key)
- * $.jStorage.deleteKey(key) -> removes a key from the storage
- *
- * -flush()
- * $.jStorage.flush() -> clears the cache
- *
- * -storageObj()
- * $.jStorage.storageObj() -> returns a read-ony copy of the actual storage
- *
- * -storageSize()
- * $.jStorage.storageSize() -> returns the size of the storage in bytes
- *
- * -index()
- * $.jStorage.index() -> returns the used keys as an array
- *
- * -storageAvailable()
- * $.jStorage.storageAvailable() -> returns true if storage is available
- *
- * -reInit()
- * $.jStorage.reInit() -> reloads the data from browser storage
- *
- * <value> can be any JSON-able value, including objects and arrays.
- *
- **/
+ (function(){
+ var
+ /* jStorage version */
+ JSTORAGE_VERSION = "0.3.0",
+
+ /* detect a dollar object or create one if not found */
+ $ = window.jQuery || window.$ || (window.$ = {}),
-(function($){
- if(!$ || !($.toJSON || Object.toJSON || window.JSON)){
- throw new Error("jQuery, MooTools or Prototype needs to be loaded before jStorage!");
+ /* check for a JSON handling support */
+ JSON = {
+ parse:
+ window.JSON && (window.JSON.parse || window.JSON.decode) ||
+ String.prototype.evalJSON && function(str){return String(str).evalJSON();} ||
+ $.parseJSON ||
+ $.evalJSON,
+ stringify:
+ Object.toJSON ||
+ window.JSON && (window.JSON.stringify || window.JSON.encode) ||
+ $.toJSON
+ };
+
+ // Break if no JSON support was found
+ if(!JSON.parse || !JSON.stringify){
+ throw new Error("No JSON support found, include //cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js to page");
}
var
@@ -88,20 +63,58 @@
/* How much space does the storage take */
_storage_size = 0,
- /* function to encode objects to JSON strings */
- json_encode = $.toJSON || Object.toJSON || (window.JSON && (JSON.encode || JSON.stringify)),
-
- /* function to decode objects from JSON strings */
- json_decode = $.evalJSON || (window.JSON && (JSON.decode || JSON.parse)) || function(str){
- return String(str).evalJSON();
- },
-
/* which backend is currently used */
_backend = false,
+ /* onchange observers */
+ _observers = {},
+
+ /* timeout to wait after onchange event */
+ _observer_timeout = false,
+
+ /* last update time */
+ _observer_update = 0,
+
+ /* pubsub observers */
+ _pubsub_observers = {},
+
+ /* skip published items older than current timestamp */
+ _pubsub_last = +new Date(),
+
/* Next check for TTL */
_ttl_timeout,
+ /* crc32 table */
+ _crc32Table = "00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 "+
+ "0EDB8832 79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 "+
+ "6AB020F2 F3B97148 84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 "+
+ "FD62F97A 8A65C9EC 14015C4F 63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 "+
+ "A2677172 3C03E4D1 4B04D447 D20D85FD A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 "+
+ "32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC 51DE003A C8D75180 BFD06116 21B4F4B5 "+
+ "56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 B10BE924 2F6F7C87 58684C11 "+
+ "C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 06B6B51F 9FBFE4A5 "+
+ "E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 E6635C01 "+
+ "6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 "+
+ "12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE "+
+ "A3BC0074 D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 "+
+ "DA60B8D0 44042D73 33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 "+
+ "5768B525 206F85B3 B966D409 CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 "+
+ "2EB40D81 B7BD5C3B C0BA6CAD EDB88320 9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF "+
+ "04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E 7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 "+
+ "7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D 806567CB 196C3671 6E6B06E7 "+
+ "FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 60B08ED5 D6D6A3E8 "+
+ "A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA AF0A1B4C "+
+ "36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 "+
+ "5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 "+
+ "C2D7FFA7 B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 "+
+ "EB0E363F 72076785 05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D "+
+ "7CDCEFB7 0BDBDF21 86D3D2D4 F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 "+
+ "18B74777 88085AE6 FF0F6A70 66063BCA 11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 "+
+ "A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 D06016F7 4969474D 3E6E77DB AED16A4A "+
+ "D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F 30B5FFE9 BDBDF21C CABAC28A "+
+ "53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E C4614AB8 5D681B02 "+
+ "2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D",
+
/**
* XML encoding and decoding as XML nodes can't be JSON'ized
* XML nodes are encoded and decoded if the node is the value to be saved
@@ -158,14 +171,16 @@
resultXML = dom_parser.call("DOMParser" in window && (new DOMParser()) || window, xmlString, 'text/xml');
return this.isXML(resultXML)?resultXML:false;
}
- };
+ },
+
+ _localStoragePolyfillSetKey = function(){};
+
////////////////////////// PRIVATE METHODS ////////////////////////
/**
* Initialization function. Detects if the browser supports DOM Storage
* or userData behavior and behaves accordingly.
- * @returns undefined
*/
function _init(){
/* Check if browser supports localStorage */
@@ -180,11 +195,13 @@
// QUOTA_EXCEEDED_ERRROR DOM Exception 22.
}
}
+
if(localStorageReallyWorks){
try {
if(window.localStorage) {
_storage_service = window.localStorage;
_backend = "localStorage";
+ _observer_update = _storage_service.jStorage_update;
}
} catch(E3) {/* Firefox fails when touching localStorage and cookies are disabled */}
}
@@ -194,6 +211,7 @@
if(window.globalStorage) {
_storage_service = window.globalStorage[window.location.hostname];
_backend = "globalStorage";
+ _observer_update = _storage_service.jStorage_update;
}
} catch(E4) {/* Firefox fails when touching localStorage and cookies are disabled */}
}
@@ -208,11 +226,24 @@
/* userData element needs to be inserted into the DOM! */
document.getElementsByTagName('head')[0].appendChild(_storage_elm);
- _storage_elm.load("jStorage");
+ try{
+ _storage_elm.load("jStorage");
+ }catch(E){
+ // try to reset cache
+ _storage_elm.setAttribute("jStorage", "{}");
+ _storage_elm.save("jStorage");
+ _storage_elm.load("jStorage");
+ }
+
var data = "{}";
try{
data = _storage_elm.getAttribute("jStorage");
}catch(E5){}
+
+ try{
+ _observer_update = _storage_elm.getAttribute("jStorage_update");
+ }catch(E6){}
+
_storage_service.jStorage = data;
_backend = "userDataBehavior";
}else{
@@ -221,35 +252,427 @@
}
}
+ // Load data from storage
+ _load_storage();
+
+ // remove dead keys
+ _handleTTL();
+
+ // create localStorage and sessionStorage polyfills if needed
+ _createPolyfillStorage("local");
+ _createPolyfillStorage("session");
+
+ // start listening for changes
+ _setupObserver();
+
+ // initialize publish-subscribe service
+ _handlePubSub();
+
+ // handle cached navigation
+ if("addEventListener" in window){
+ window.addEventListener("pageshow", function(event){
+ if(event.persisted){
+ _storageObserver();
+ }
+ }, false);
+ }
+ }
+
+ /**
+ * Create a polyfill for localStorage (type="local") or sessionStorage (type="session")
+ *
+ * @param {String} type Either "local" or "session"
+ * @param {Boolean} forceCreate If set to true, recreate the polyfill (needed with flush)
+ */
+ function _createPolyfillStorage(type, forceCreate){
+ var _skipSave = false,
+ _length = 0,
+ i,
+ storage,
+ storage_source = {};
+
+ var rand = Math.random();
+
+ if(!forceCreate && typeof window[type+"Storage"] != "undefined"){
+ return;
+ }
+
+ // Use globalStorage for localStorage if available
+ if(type == "local" && window.globalStorage){
+ localStorage = window.globalStorage[window.location.hostname];
+ return;
+ }
+
+ // only IE6/7 from this point on
+ if(_backend != "userDataBehavior"){
+ return;
+ }
+
+ // Remove existing storage element if available
+ if(forceCreate && window[type+"Storage"] && window[type+"Storage"].parentNode){
+ window[type+"Storage"].parentNode.removeChild(window[type+"Storage"]);
+ }
+
+ storage = document.createElement("button");
+ document.getElementsByTagName('head')[0].appendChild(storage);
+
+ if(type == "local"){
+ storage_source = _storage;
+ }else if(type == "session"){
+ _sessionStoragePolyfillUpdate();
+ }
+
+ for(i in storage_source){
+
+ if(storage_source.hasOwnProperty(i) && i != "__jstorage_meta" && i != "length" && typeof storage_source[i] != "undefined"){
+ if(!(i in storage)){
+ _length++;
+ }
+ storage[i] = storage_source[i];
+ }
+ }
+
+ // Polyfill API
+
+ /**
+ * Indicates how many keys are stored in the storage
+ */
+ storage.length = _length;
+
+ /**
+ * Returns the key of the nth stored value
+ *
+ * @param {Number} n Index position
+ * @return {String} Key name of the nth stored value
+ */
+ storage.key = function(n){
+ var count = 0, i;
+ _sessionStoragePolyfillUpdate();
+ for(i in storage_source){
+ if(storage_source.hasOwnProperty(i) && i != "__jstorage_meta" && i!="length" && typeof storage_source[i] != "undefined"){
+ if(count == n){
+ return i;
+ }
+ count++;
+ }
+ }
+ }
+
+ /**
+ * Returns the current value associated with the given key
+ *
+ * @param {String} key key name
+ * @return {Mixed} Stored value
+ */
+ storage.getItem = function(key){
+ _sessionStoragePolyfillUpdate();
+ if(type == "session"){
+ return storage_source[key];
+ }
+ return $.jStorage.get(key);
+ }
+
+ /**
+ * Sets or updates value for a give key
+ *
+ * @param {String} key Key name to be updated
+ * @param {String} value String value to be stored
+ */
+ storage.setItem = function(key, value){
+ if(typeof value == "undefined"){
+ return;
+ }
+ storage[key] = (value || "").toString();
+ }
+
+ /**
+ * Removes key from the storage
+ *
+ * @param {String} key Key name to be removed
+ */
+ storage.removeItem = function(key){
+ if(type == "local"){
+ return $.jStorage.deleteKey(key);
+ }
+
+ storage[key] = undefined;
+
+ _skipSave = true;
+ if(key in storage){
+ storage.removeAttribute(key);
+ }
+ _skipSave = false;
+ }
+
+ /**
+ * Clear storage
+ */
+ storage.clear = function(){
+ if(type == "session"){
+ window.name = "";
+ _createPolyfillStorage("session", true);
+ return;
+ }
+ $.jStorage.flush();
+ }
+
+ if(type == "local"){
+
+ _localStoragePolyfillSetKey = function(key, value){
+ if(key == "length"){
+ return;
+ }
+ _skipSave = true;
+ if(typeof value == "undefined"){
+ if(key in storage){
+ _length--;
+ storage.removeAttribute(key);
+ }
+ }else{
+ if(!(key in storage)){
+ _length++;
+ }
+ storage[key] = (value || "").toString();
+ }
+ storage.length = _length;
+ _skipSave = false;
+ }
+ }
+
+ function _sessionStoragePolyfillUpdate(){
+ if(type != "session"){
+ return;
+ }
+ try{
+ storage_source = JSON.parse(window.name || "{}");
+ }catch(E){
+ storage_source = {};
+ }
+ }
+
+ function _sessionStoragePolyfillSave(){
+ if(type != "session"){
+ return;
+ }
+ window.name = JSON.stringify(storage_source);
+ };
+
+ storage.attachEvent("onpropertychange", function(e){
+ if(e.propertyName == "length"){
+ return;
+ }
+
+ if(_skipSave || e.propertyName == "length"){
+ return;
+ }
+
+ if(type == "local"){
+ if(!(e.propertyName in storage_source) && typeof storage[e.propertyName] != "undefined"){
+ _length ++;
+ }
+ }else if(type == "session"){
+ _sessionStoragePolyfillUpdate();
+ if(typeof storage[e.propertyName] != "undefined" && !(e.propertyName in storage_source)){
+ storage_source[e.propertyName] = storage[e.propertyName];
+ _length++;
+ }else if(typeof storage[e.propertyName] == "undefined" && e.propertyName in storage_source){
+ delete storage_source[e.propertyName];
+ _length--;
+ }else{
+ storage_source[e.propertyName] = storage[e.propertyName];
+ }
+
+ _sessionStoragePolyfillSave();
+ storage.length = _length;
+ return;
+ }
+
+ $.jStorage.set(e.propertyName, storage[e.propertyName]);
+ storage.length = _length;
+ });
+
+ window[type+"Storage"] = storage;
+ }
+
+ /**
+ * Reload data from storage when needed
+ */
+ function _reloadData(){
+ var data = "{}";
+
+ if(_backend == "userDataBehavior"){
+ _storage_elm.load("jStorage");
+
+ try{
+ data = _storage_elm.getAttribute("jStorage");
+ }catch(E5){}
+
+ try{
+ _observer_update = _storage_elm.getAttribute("jStorage_update");
+ }catch(E6){}
+
+ _storage_service.jStorage = data;
+ }
+
_load_storage();
// remove dead keys
_handleTTL();
+
+ _handlePubSub();
+ }
+
+ /**
+ * Sets up a storage change observer
+ */
+ function _setupObserver(){
+ if(_backend == "localStorage" || _backend == "globalStorage"){
+ if("addEventListener" in window){
+ window.addEventListener("storage", _storageObserver, false);
+ }else{
+ document.attachEvent("onstorage", _storageObserver);
+ }
+ }else if(_backend == "userDataBehavior"){
+ setInterval(_storageObserver, 1000);
+ }
+ }
+
+ /**
+ * Fired on any kind of data change, needs to check if anything has
+ * really been changed
+ */
+ function _storageObserver(){
+ var updateTime;
+ // cumulate change notifications with timeout
+ clearTimeout(_observer_timeout);
+ _observer_timeout = setTimeout(function(){
+
+ if(_backend == "localStorage" || _backend == "globalStorage"){
+ updateTime = _storage_service.jStorage_update;
+ }else if(_backend == "userDataBehavior"){
+ _storage_elm.load("jStorage");
+ try{
+ updateTime = _storage_elm.getAttribute("jStorage_update");
+ }catch(E5){}
+ }
+
+ if(updateTime && updateTime != _observer_update){
+ _observer_update = updateTime;
+ _checkUpdatedKeys();
+ }
+
+ }, 25);
+ }
+
+ /**
+ * Reloads the data and checks if any keys are changed
+ */
+ function _checkUpdatedKeys(){
+ var oldCrc32List = JSON.parse(JSON.stringify(_storage.__jstorage_meta.CRC32)),
+ newCrc32List;
+
+ _reloadData();
+ newCrc32List = JSON.parse(JSON.stringify(_storage.__jstorage_meta.CRC32));
+
+ var key,
+ updated = [],
+ removed = [];
+
+ for(key in oldCrc32List){
+ if(oldCrc32List.hasOwnProperty(key)){
+ if(!newCrc32List[key]){
+ removed.push(key);
+ continue;
+ }
+ if(oldCrc32List[key] != newCrc32List[key]){
+ updated.push(key);
+ }
+ }
+ }
+
+ for(key in newCrc32List){
+ if(newCrc32List.hasOwnProperty(key)){
+ if(!oldCrc32List[key]){
+ updated.push(key);
+ }
+ }
+ }
+
+ _fireObservers(updated, "updated");
+ _fireObservers(removed, "deleted");
+ }
+
+ /**
+ * Fires observers for updated keys
+ *
+ * @param {Array|String} keys Array of key names or a key
+ * @param {String} action What happened with the value (updated, deleted, flushed)
+ */
+ function _fireObservers(keys, action){
+ keys = [].concat(keys || []);
+ if(action == "flushed"){
+ keys = [];
+ for(var key in _observers){
+ if(_observers.hasOwnProperty(key)){
+ keys.push(key);
+ }
+ }
+ action = "deleted";
+ }
+ for(var i=0, len = keys.length; i<len; i++){
+ if(_observers[keys[i]]){
+ for(var j=0, jlen = _observers[keys[i]].length; j<jlen; j++){
+ _observers[keys[i]][j](keys[i], action);
+ }
+ }
+ }
+ }
+
+ /**
+ * Publishes key change to listeners
+ */
+ function _publishChange(){
+ var updateTime = (+new Date()).toString();
+
+ if(_backend == "localStorage" || _backend == "globalStorage"){
+ _storage_service.jStorage_update = updateTime;
+ }else if(_backend == "userDataBehavior"){
+ _storage_elm.setAttribute("jStorage_update", updateTime);
+ _storage_elm.save("jStorage");
+ }
+
+ _storageObserver();
}
/**
* Loads the data from the storage based on the supported mechanism
- * @returns undefined
*/
function _load_storage(){
/* if jStorage string is retrieved, then decode it */
if(_storage_service.jStorage){
try{
- _storage = json_decode(String(_storage_service.jStorage));
+ _storage = JSON.parse(String(_storage_service.jStorage));
}catch(E6){_storage_service.jStorage = "{}";}
}else{
_storage_service.jStorage = "{}";
}
_storage_size = _storage_service.jStorage?String(_storage_service.jStorage).length:0;
+
+ if(!_storage.__jstorage_meta){
+ _storage.__jstorage_meta = {};
+ }
+ if(!_storage.__jstorage_meta.CRC32){
+ _storage.__jstorage_meta.CRC32 = {};
+ }
}
/**
* This functions provides the "save" mechanism to store the jStorage object
- * @returns undefined
*/
function _save(){
+ _dropOldEvents(); // remove expired events
try{
- _storage_service.jStorage = json_encode(_storage);
+ _storage_service.jStorage = JSON.stringify(_storage);
// If userData is used as the storage engine, additional
if(_storage_elm) {
_storage_elm.setAttribute("jStorage",_storage_service.jStorage);
@@ -261,12 +684,14 @@
/**
* Function checks if a key is set and is string or numberic
+ *
+ * @param {String} key Key name
*/
function _checkKey(key){
- if(!key || (typeof key !== "string" && typeof key !== "number")){
+ if(!key || (typeof key != "string" && typeof key != "number")){
throw new TypeError('Key name must be string or numeric');
}
- if(key === "__jstorage_meta"){
+ if(key == "__jstorage_meta"){
throw new TypeError('Reserved key name');
}
return true;
@@ -276,23 +701,27 @@
* Removes expired keys
*/
function _handleTTL(){
- var curtime, i, TTL, nextExpire = Infinity, changed = false;
+ var curtime, i, TTL, CRC32, nextExpire = Infinity, changed = false, deleted = [];
clearTimeout(_ttl_timeout);
- if(!_storage.__jstorage_meta || typeof _storage.__jstorage_meta.TTL !== "object"){
+ if(!_storage.__jstorage_meta || typeof _storage.__jstorage_meta.TTL != "object"){
// nothing to do here
return;
}
curtime = +new Date();
TTL = _storage.__jstorage_meta.TTL;
+
+ CRC32 = _storage.__jstorage_meta.CRC32;
for(i in TTL){
if(TTL.hasOwnProperty(i)){
if(TTL[i] <= curtime){
delete TTL[i];
+ delete CRC32[i];
delete _storage[i];
changed = true;
+ deleted.push(i);
}else if(TTL[i] < nextExpire){
nextExpire = TTL[i];
}
@@ -307,47 +736,158 @@
// save changes
if(changed){
_save();
+ _publishChange();
+ _fireObservers(deleted, "deleted");
}
}
+ /**
+ * Checks if there's any events on hold to be fired to listeners
+ */
+ function _handlePubSub(){
+ if(!_storage.__jstorage_meta.PubSub){
+ return;
+ }
+ var pubelm,
+ _pubsubCurrent = _pubsub_last;
+
+ for(var i=len=_storage.__jstorage_meta.PubSub.length-1; i>=0; i--){
+ pubelm = _storage.__jstorage_meta.PubSub[i];
+ if(pubelm[0] > _pubsub_last){
+ _pubsubCurrent = pubelm[0];
+ _fireSubscribers(pubelm[1], pubelm[2]);
+ }
+ }
+
+ _pubsub_last = _pubsubCurrent;
+ }
+
+ /**
+ * Fires all subscriber listeners for a pubsub channel
+ *
+ * @param {String} channel Channel name
+ * @param {Mixed} payload Payload data to deliver
+ */
+ function _fireSubscribers(channel, payload){
+ if(_pubsub_observers[channel]){
+ for(var i=0, len = _pubsub_observers[channel].length; i<len; i++){
+ // send immutable data that can't be modified by listeners
+ _pubsub_observers[channel][i](channel, JSON.parse(JSON.stringify(payload)));
+ }
+ }
+ }
+
+ /**
+ * Remove old events from the publish stream (at least 2sec old)
+ */
+ function _dropOldEvents(){
+ if(!_storage.__jstorage_meta.PubSub){
+ return;
+ }
+
+ var retire = +new Date() - 2000;
+
+ for(var i=0, len = _storage.__jstorage_meta.PubSub.length; i<len; i++){
+ if(_storage.__jstorage_meta.PubSub[i][0] <= retire){
+ // deleteCount is needed for IE6
+ _storage.__jstorage_meta.PubSub.splice(i, _storage.__jstorage_meta.PubSub.length - i);
+ break;
+ }
+ }
+
+ if(!_storage.__jstorage_meta.PubSub.length){
+ delete _storage.__jstorage_meta.PubSub;
+ }
+
+ }
+
+ /**
+ * Publish payload to a channel
+ *
+ * @param {String} channel Channel name
+ * @param {Mixed} payload Payload to send to the subscribers
+ */
+ function _publish(channel, payload){
+ if(!_storage.__jstorage_meta){
+ _storage.__jstorage_meta = {};
+ }
+ if(!_storage.__jstorage_meta.PubSub){
+ _storage.__jstorage_meta.PubSub = [];
+ }
+
+ _storage.__jstorage_meta.PubSub.unshift([+new Date, channel, payload]);
+
+ _save();
+ _publishChange();
+ }
+
+ /**
+ * CRC32 calculation based on http://noteslog.com/post/crc32-for-javascript/
+ *
+ * @param {String} str String to be hashed
+ * @param {Number} [crc] Last crc value in case of streams
+ */
+ function _crc32(str, crc){
+ crc = crc || 0;
+
+ var n = 0, //a number between 0 and 255
+ x = 0; //an hex number
+
+ crc = crc ^ (-1);
+ for(var i = 0, len = str.length; i < len; i++){
+ n = (crc ^ str.charCodeAt(i)) & 0xFF;
+ x = "0x" + _crc32Table.substr(n * 9, 8);
+ crc = (crc >>> 8)^x;
+ }
+ return crc^(-1);
+ }
+
////////////////////////// PUBLIC INTERFACE /////////////////////////
$.jStorage = {
/* Version number */
- version: "0.1.7.0",
+ version: JSTORAGE_VERSION,
/**
* Sets a key's value.
*
- * @param {String} key - Key to set. If this value is not set or not
+ * @param {String} key Key to set. If this value is not set or not
* a string an exception is raised.
- * @param {Mixed} value - Value to set. This can be any value that is JSON
+ * @param {Mixed} value Value to set. This can be any value that is JSON
* compatible (Numbers, Strings, Objects etc.).
* @param {Object} [options] - possible options to use
* @param {Number} [options.TTL] - optional TTL value
- * @returns the used value
+ * @return {Mixed} the used value
*/
set: function(key, value, options){
_checkKey(key);
options = options || {};
+ // undefined values are deleted automatically
+ if(typeof value == "undefined"){
+ this.deleteKey(key);
+ return value;
+ }
+
if(_XMLService.isXML(value)){
value = {_is_xml:true,xml:_XMLService.encode(value)};
- }else if(typeof value === "function"){
- value = null; // functions can't be saved!
- }else if(value && typeof value === "object"){
+ }else if(typeof value == "function"){
+ return undefined; // functions can't be saved!
+ }else if(value && typeof value == "object"){
// clone the object before saving to _storage tree
- value = json_decode(json_encode(value));
+ value = JSON.parse(JSON.stringify(value));
}
+
_storage[key] = value;
- if(!isNaN(options.TTL)){
- this.setTTL(key, options.TTL);
- // also handles saving
- }else{
- _save();
- }
+ _storage.__jstorage_meta.CRC32[key] = _crc32(JSON.stringify(value));
+
+ this.setTTL(key, options.TTL || 0); // also handles saving and _publishChange
+
+ _localStoragePolyfillSetKey(key, value);
+
+ _fireObservers(key, "updated");
return value;
},
@@ -356,12 +896,12 @@
*
* @param {String} key - Key to look up.
* @param {mixed} def - Default value to return, if key didn't exist.
- * @returns the key value, default value or <null>
+ * @return {Mixed} the key value, default value or null
*/
get: function(key, def){
_checkKey(key);
if(key in _storage){
- if(_storage[key] && typeof _storage[key] === "object" &&
+ if(_storage[key] && typeof _storage[key] == "object" &&
_storage[key]._is_xml &&
_storage[key]._is_xml){
return _XMLService.decode(_storage[key].xml);
@@ -369,26 +909,31 @@
return _storage[key];
}
}
- return typeof(def) === 'undefined' ? null : def;
+ return typeof(def) == 'undefined' ? null : def;
},
/**
* Deletes a key from cache.
*
* @param {String} key - Key to delete.
- * @returns true if key existed or false if it didn't
+ * @return {Boolean} true if key existed or false if it didn't
*/
deleteKey: function(key){
_checkKey(key);
if(key in _storage){
delete _storage[key];
// remove from TTL list
- if(_storage.__jstorage_meta &&
- typeof _storage.__jstorage_meta.TTL === "object" &&
+ if(typeof _storage.__jstorage_meta.TTL == "object" &&
key in _storage.__jstorage_meta.TTL){
delete _storage.__jstorage_meta.TTL[key];
}
+
+ delete _storage.__jstorage_meta.CRC32[key];
+ _localStoragePolyfillSetKey(key, undefined);
+
_save();
+ _publishChange();
+ _fireObservers(key, "deleted");
return true;
}
return false;
@@ -399,7 +944,7 @@
*
* @param {String} key - key to set the TTL for
* @param {Number} ttl - TTL timeout in milliseconds
- * @returns true if key existed or false if it didn't
+ * @return {Boolean} true if key existed or false if it didn't
*/
setTTL: function(key, ttl){
var curtime = +new Date();
@@ -407,9 +952,6 @@
ttl = Number(ttl) || 0;
if(key in _storage){
- if(!_storage.__jstorage_meta){
- _storage.__jstorage_meta = {};
- }
if(!_storage.__jstorage_meta.TTL){
_storage.__jstorage_meta.TTL = {};
}
@@ -424,26 +966,47 @@
_save();
_handleTTL();
+
+ _publishChange();
return true;
}
return false;
},
/**
+ * Gets remaining TTL (in milliseconds) for a key or 0 when no TTL has been set
+ *
+ * @param {String} key Key to check
+ * @return {Number} Remaining TTL in milliseconds
+ */
+ getTTL: function(key){
+ var curtime = +new Date(), ttl;
+ _checkKey(key);
+ if(key in _storage && _storage.__jstorage_meta.TTL && _storage.__jstorage_meta.TTL[key]){
+ ttl = _storage.__jstorage_meta.TTL[key] - curtime;
+ return ttl || 0;
+ }
+ return 0;
+ },
+
+ /**
* Deletes everything in cache.
*
- * @return true
+ * @return {Boolean} Always true
*/
flush: function(){
- _storage = {};
+ _storage = {__jstorage_meta:{CRC32:{}}};
+ _createPolyfillStorage("local", true);
_save();
+ _publishChange();
+ _fireObservers(null, "flushed");
return true;
},
/**
* Returns a read-only copy of _storage
*
- * @returns Object
+ * @return {Object} Read-only copy of _storage
*/
storageObj: function(){
function F() {}
@@ -455,12 +1018,12 @@
* Returns an index of all used keys as an array
* ['key1', 'key2',..'keyN']
*
- * @returns Array
+ * @return {Array} Used keys
*/
index: function(){
var index = [], i;
for(i in _storage){
- if(_storage.hasOwnProperty(i) && i !== "__jstorage_meta"){
+ if(_storage.hasOwnProperty(i) && i != "__jstorage_meta"){
index.push(i);
}
}
@@ -470,7 +1033,8 @@
/**
* How much space in bytes does the storage take?
*
- * @returns Number
+ * @return {Number} Storage size in chars (not the same as in bytes,
+ * since some chars may take several bytes)
*/
storageSize: function(){
return _storage_size;
@@ -479,7 +1043,7 @@
/**
* Which backend is currently in use?
*
- * @returns String
+ * @return {String} Backend name
*/
currentBackend: function(){
return _backend;
@@ -488,45 +1052,92 @@
/**
* Test if storage is available
*
- * @returns Boolean
+ * @return {Boolean} True if storage can be used
*/
storageAvailable: function(){
return !!_backend;
},
/**
- * Reloads the data from browser storage
+ * Register change listeners
*
- * @returns undefined
+ * @param {String} key Key name
+ * @param {Function} callback Function to run when the key changes
*/
- reInit: function(){
- var new_storage_elm, data;
- if(_storage_elm && _storage_elm.addBehavior){
- new_storage_elm = document.createElement('link');
+ listenKeyChange: function(key, callback){
+ _checkKey(key);
+ if(!_observers[key]){
+ _observers[key] = [];
+ }
+ _observers[key].push(callback);
+ },
- _storage_elm.parentNode.replaceChild(new_storage_elm, _storage_elm);
- _storage_elm = new_storage_elm;
+ /**
+ * Remove change listeners
+ *
+ * @param {String} key Key name to unregister listeners against
+ * @param {Function} [callback] If set, unregister the callback, if not - unregister all
+ */
+ stopListening: function(key, callback){
+ _checkKey(key);
- /* Use a DOM element to act as userData storage */
- _storage_elm.style.behavior = 'url(#default#userData)';
+ if(!_observers[key]){
+ return;
+ }
- /* userData element needs to be inserted into the DOM! */
- document.getElementsByTagName('head')[0].appendChild(_storage_elm);
+ if(!callback){
+ delete _observers[key];
+ return;
+ }
- _storage_elm.load("jStorage");
- data = "{}";
- try{
- data = _storage_elm.getAttribute("jStorage");
- }catch(E5){}
- _storage_service.jStorage = data;
- _backend = "userDataBehavior";
+ for(var i = _observers[key].length - 1; i>=0; i--){
+ if(_observers[key][i] == callback){
+ _observers[key].splice(i,1);
+ }
}
+ },
+
+ /**
+ * Subscribe to a Publish/Subscribe event stream
+ *
+ * @param {String} channel Channel name
+ * @param {Function} callback Function to run when the something is published to the channel
+ */
+ subscribe: function(channel, callback){
+ channel = (channel || "").toString();
+ if(!channel){
+ throw new TypeError('Channel not defined');
+ }
+ if(!_pubsub_observers[channel]){
+ _pubsub_observers[channel] = [];
+ }
+ _pubsub_observers[channel].push(callback);
+ },
- _load_storage();
+ /**
+ * Publish data to an event stream
+ *
+ * @param {String} channel Channel name
+ * @param {Mixed} payload Payload to deliver
+ */
+ publish: function(channel, payload){
+ channel = (channel || "").toString();
+ if(!channel){
+ throw new TypeError('Channel not defined');
+ }
+
+ _publish(channel, payload);
+ },
+
+ /**
+ * Reloads the data from browser storage
+ */
+ reInit: function(){
+ _reloadData();
}
};
// Initialize jStorage
_init();
-})(window.$ || window.jQuery);
+})();
diff --git a/resources/jquery/jquery.js b/resources/jquery/jquery.js
index d4f3bb38..a86bf797 100644
--- a/resources/jquery/jquery.js
+++ b/resources/jquery/jquery.js
@@ -1,5 +1,5 @@
/*!
- * jQuery JavaScript Library v1.8.2
+ * jQuery JavaScript Library v1.8.3
* http://jquery.com/
*
* Includes Sizzle.js
@@ -9,7 +9,7 @@
* Released under the MIT license
* http://jquery.org/license
*
- * Date: Thu Sep 20 2012 21:13:05 GMT-0400 (Eastern Daylight Time)
+ * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)
*/
(function( window, undefined ) {
var
@@ -186,7 +186,7 @@ jQuery.fn = jQuery.prototype = {
selector: "",
// The current version of jQuery being used
- jquery: "1.8.2",
+ jquery: "1.8.3",
// The default length of a jQuery object is 0
length: 0,
@@ -999,8 +999,10 @@ jQuery.Callbacks = function( options ) {
(function add( args ) {
jQuery.each( args, function( _, arg ) {
var type = jQuery.type( arg );
- if ( type === "function" && ( !options.unique || !self.has( arg ) ) ) {
- list.push( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
} else if ( arg && arg.length && type !== "string" ) {
// Inspect recursively
add( arg );
@@ -1253,24 +1255,23 @@ jQuery.support = (function() {
clickFn,
div = document.createElement("div");
- // Preliminary tests
+ // Setup
div.setAttribute( "className", "t" );
div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+ // Support tests won't run in some limited or non-browser environments
all = div.getElementsByTagName("*");
a = div.getElementsByTagName("a")[ 0 ];
- a.style.cssText = "top:1px;float:left;opacity:.5";
-
- // Can't get basic test support
- if ( !all || !all.length ) {
+ if ( !all || !a || !all.length ) {
return {};
}
- // First batch of supports tests
+ // First batch of tests
select = document.createElement("select");
opt = select.appendChild( document.createElement("option") );
input = div.getElementsByTagName("input")[ 0 ];
+ a.style.cssText = "top:1px;float:left;opacity:.5";
support = {
// IE strips leading whitespace when .innerHTML is used
leadingWhitespace: ( div.firstChild.nodeType === 3 ),
@@ -1312,7 +1313,7 @@ jQuery.support = (function() {
// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
getSetAttribute: div.className !== "t",
- // Tests for enctype support on a form(#6743)
+ // Tests for enctype support on a form (#6743)
enctype: !!document.createElement("form").enctype,
// Makes sure cloning an html5 element does not cause problems
@@ -2217,26 +2218,25 @@ jQuery.extend({
},
select: {
get: function( elem ) {
- var value, i, max, option,
- index = elem.selectedIndex,
- values = [],
+ var value, option,
options = elem.options,
- one = elem.type === "select-one";
-
- // Nothing was selected
- if ( index < 0 ) {
- return null;
- }
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
// Loop through all the selected options
- i = one ? index : 0;
- max = one ? index + 1 : options.length;
for ( ; i < max; i++ ) {
option = options[ i ];
- // Don't return options that are disabled or in a disabled optgroup
- if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
- (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+ // oldIE doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
// Get the specific value for the option
value = jQuery( option ).val();
@@ -2251,11 +2251,6 @@ jQuery.extend({
}
}
- // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
- if ( one && !values.length && options.length ) {
- return jQuery( options[ index ] ).val();
- }
-
return values;
},
@@ -3233,7 +3228,7 @@ jQuery.removeEvent = document.removeEventListener ?
if ( elem.detachEvent ) {
- // #8545, #7054, preventing memory leaks for custom events in IE6-8 –
+ // #8545, #7054, preventing memory leaks for custom events in IE6-8
// detachEvent needed property on element, by name of that event, to properly expose it to GC
if ( typeof elem[ name ] === "undefined" ) {
elem[ name ] = null;
@@ -3725,7 +3720,8 @@ var cachedruns,
delete cache[ keys.shift() ];
}
- return (cache[ key ] = value);
+ // Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)
+ return (cache[ key + " " ] = value);
}, cache );
},
@@ -4259,13 +4255,13 @@ Expr = Sizzle.selectors = {
},
"CLASS": function( className ) {
- var pattern = classCache[ expando ][ className ];
- if ( !pattern ) {
- pattern = classCache( className, new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)") );
- }
- return function( elem ) {
- return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
- };
+ var pattern = classCache[ expando ][ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
+ });
},
"ATTR": function( name, operator, check ) {
@@ -4511,7 +4507,7 @@ Expr = Sizzle.selectors = {
"focus": function( elem ) {
var doc = elem.ownerDocument;
- return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);
+ return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
},
"active": function( elem ) {
@@ -4519,11 +4515,11 @@ Expr = Sizzle.selectors = {
},
// Positional types
- "first": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ "first": createPositionalPseudo(function() {
return [ 0 ];
}),
- "last": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
return [ length - 1 ];
}),
@@ -4531,14 +4527,14 @@ Expr = Sizzle.selectors = {
return [ argument < 0 ? argument + length : argument ];
}),
- "even": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
for ( var i = 0; i < length; i += 2 ) {
matchIndexes.push( i );
}
return matchIndexes;
}),
- "odd": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
for ( var i = 1; i < length; i += 2 ) {
matchIndexes.push( i );
}
@@ -4659,7 +4655,9 @@ baseHasDuplicate = !hasDuplicate;
// Document sorting and removing duplicates
Sizzle.uniqueSort = function( results ) {
var elem,
- i = 1;
+ duplicates = [],
+ i = 1,
+ j = 0;
hasDuplicate = baseHasDuplicate;
results.sort( sortOrder );
@@ -4667,9 +4665,12 @@ Sizzle.uniqueSort = function( results ) {
if ( hasDuplicate ) {
for ( ; (elem = results[i]); i++ ) {
if ( elem === results[ i - 1 ] ) {
- results.splice( i--, 1 );
+ j = duplicates.push( i );
}
}
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
}
return results;
@@ -4680,8 +4681,9 @@ Sizzle.error = function( msg ) {
};
function tokenize( selector, parseOnly ) {
- var matched, match, tokens, type, soFar, groups, preFilters,
- cached = tokenCache[ expando ][ selector ];
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ expando ][ selector + " " ];
if ( cached ) {
return parseOnly ? 0 : cached.slice( 0 );
@@ -4696,7 +4698,8 @@ function tokenize( selector, parseOnly ) {
// Comma and first run
if ( !matched || (match = rcomma.exec( soFar )) ) {
if ( match ) {
- soFar = soFar.slice( match[0].length );
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
}
groups.push( tokens = [] );
}
@@ -4715,8 +4718,7 @@ function tokenize( selector, parseOnly ) {
// Filters
for ( type in Expr.filter ) {
if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
- // The last two arguments here are (context, xml) for backCompat
- (match = preFilters[ type ]( match, document, true ))) ) {
+ (match = preFilters[ type ]( match ))) ) {
tokens.push( matched = new Token( match.shift() ) );
soFar = soFar.slice( matched.length );
@@ -4836,18 +4838,13 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
postFinder = setMatcher( postFinder, postSelector );
}
return markFunction(function( seed, results, context, xml ) {
- // Positional selectors apply to seed elements, so it is invalid to follow them with relative ones
- if ( seed && postFinder ) {
- return;
- }
-
- var i, elem, postFilterIn,
+ var temp, i, elem,
preMap = [],
postMap = [],
preexisting = results.length,
// Get initial elements from seed or context
- elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [], seed ),
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
// Prefilter to get matcher input, preserving a map for seed-results synchronization
matcherIn = preFilter && ( seed || !selector ) ?
@@ -4872,27 +4869,45 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
// Apply postFilter
if ( postFilter ) {
- postFilterIn = condense( matcherOut, postMap );
- postFilter( postFilterIn, [], context, xml );
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
// Un-match failing elements by moving them back to matcherIn
- i = postFilterIn.length;
+ i = temp.length;
while ( i-- ) {
- if ( (elem = postFilterIn[i]) ) {
+ if ( (elem = temp[i]) ) {
matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
}
}
}
- // Keep seed and results synchronized
if ( seed ) {
- // Ignore postFinder because it can't coexist with seed
- i = preFilter && matcherOut.length;
- while ( i-- ) {
- if ( (elem = matcherOut[i]) ) {
- seed[ preMap[i] ] = !(results[ preMap[i] ] = elem);
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
}
}
+
+ // Add elements to results, through postFinder if defined
} else {
matcherOut = condense(
matcherOut === results ?
@@ -4933,7 +4948,6 @@ function matcherFromTokens( tokens ) {
if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
} else {
- // The concatenated values are (context, xml) for backCompat
matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
// Return special upon seeing a positional matcher
@@ -5062,7 +5076,7 @@ compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
var i,
setMatchers = [],
elementMatchers = [],
- cached = compilerCache[ expando ][ selector ];
+ cached = compilerCache[ expando ][ selector + " " ];
if ( !cached ) {
// Generate a function of recursive functions that can be used to check each element
@@ -5085,11 +5099,11 @@ compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
return cached;
};
-function multipleContexts( selector, contexts, results, seed ) {
+function multipleContexts( selector, contexts, results ) {
var i = 0,
len = contexts.length;
for ( ; i < len; i++ ) {
- Sizzle( selector, contexts[i], results, seed );
+ Sizzle( selector, contexts[i], results );
}
return results;
}
@@ -5167,15 +5181,14 @@ if ( document.querySelectorAll ) {
rescape = /'|\\/g,
rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
- // qSa(:focus) reports false when true (Chrome 21),
+ // qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA
// A support test would require too much code (would include document ready)
- rbuggyQSA = [":focus"],
+ rbuggyQSA = [ ":focus" ],
- // matchesSelector(:focus) reports false when true (Chrome 21),
// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
// A support test would require too much code (would include document ready)
// just skip matchesSelector for :active
- rbuggyMatches = [ ":active", ":focus" ],
+ rbuggyMatches = [ ":active" ],
matches = docElem.matchesSelector ||
docElem.mozMatchesSelector ||
docElem.webkitMatchesSelector ||
@@ -5229,7 +5242,7 @@ if ( document.querySelectorAll ) {
// Only use querySelectorAll when not filtering,
// when this is not xml,
// and when no QSA bugs apply
- if ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ if ( !seed && !xml && !rbuggyQSA.test( selector ) ) {
var groups, i,
old = true,
nid = expando,
@@ -5298,7 +5311,7 @@ if ( document.querySelectorAll ) {
expr = expr.replace( rattributeQuotes, "='$1']" );
// rbuggyMatches always contains :active, so no need for an existence check
- if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {
+ if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) {
try {
var ret = matches.call( elem, expr );
@@ -6533,7 +6546,7 @@ var curCSS, iframe, iframeDoc,
rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
- elemdisplay = {},
+ elemdisplay = { BODY: "block" },
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
cssNormalTransform = {
@@ -6814,7 +6827,9 @@ if ( window.getComputedStyle ) {
if ( computed ) {
- ret = computed[ name ];
+ // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+
if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
ret = jQuery.style( elem, name );
}
@@ -7843,9 +7858,12 @@ jQuery.extend({
// A cross-domain request is in order when we have a protocol:host:port mismatch
if ( s.crossDomain == null ) {
- parts = rurl.exec( s.url.toLowerCase() ) || false;
- s.crossDomain = parts && ( parts.join(":") + ( parts[ 3 ] ? "" : parts[ 1 ] === "http:" ? 80 : 443 ) ) !==
- ( ajaxLocParts.join(":") + ( ajaxLocParts[ 3 ] ? "" : ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) );
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+ );
}
// Convert data if not already a string
@@ -8464,7 +8482,7 @@ if ( jQuery.support.ajax ) {
// on any attempt to access responseText (#11426)
try {
responses.text = xhr.responseText;
- } catch( _ ) {
+ } catch( e ) {
}
// Firefox throws an exception when accessing
@@ -8617,7 +8635,9 @@ function Animation( elem, properties, options ) {
tick = function() {
var currentTime = fxNow || createFxNow(),
remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
- percent = 1 - ( remaining / animation.duration || 0 ),
+ // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
index = 0,
length = animation.tweens.length;
@@ -8769,7 +8789,7 @@ jQuery.Animation = jQuery.extend( Animation, {
});
function defaultPrefilter( elem, props, opts ) {
- var index, prop, value, length, dataShow, tween, hooks, oldfire,
+ var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
anim = this,
style = elem.style,
orig = {},
@@ -8843,6 +8863,7 @@ function defaultPrefilter( elem, props, opts ) {
value = props[ index ];
if ( rfxtypes.exec( value ) ) {
delete props[ index ];
+ toggle = toggle || value === "toggle";
if ( value === ( hidden ? "hide" : "show" ) ) {
continue;
}
@@ -8853,6 +8874,14 @@ function defaultPrefilter( elem, props, opts ) {
length = handled.length;
if ( length ) {
dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+
+ // store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
if ( hidden ) {
jQuery( elem ).show();
} else {
@@ -9149,6 +9178,8 @@ jQuery.fx.tick = function() {
timers = jQuery.timers,
i = 0;
+ fxNow = jQuery.now();
+
for ( ; i < timers.length; i++ ) {
timer = timers[ i ];
// Checks the timer has not already been removed
@@ -9160,6 +9191,7 @@ jQuery.fx.tick = function() {
if ( !timers.length ) {
jQuery.fx.stop();
}
+ fxNow = undefined;
};
jQuery.fx.timer = function( timer ) {
diff --git a/resources/jquery/jquery.json.js b/resources/jquery/jquery.json.js
index aac3428b..75953f4d 100644
--- a/resources/jquery/jquery.json.js
+++ b/resources/jquery/jquery.json.js
@@ -1,168 +1,174 @@
/**
- * jQuery JSON Plugin
- * version: 2.3 (2011-09-17)
+ * jQuery JSON plugin 2.4.0
*
- * This document is licensed as free software under the terms of the
- * MIT License: http://www.opensource.org/licenses/mit-license.php
- *
- * Brantley Harris wrote this plugin. It is based somewhat on the JSON.org
- * website's http://www.json.org/json2.js, which proclaims:
- * "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that
- * I uphold.
- *
- * It is also influenced heavily by MochiKit's serializeJSON, which is
- * copyrighted 2005 by Bob Ippolito.
+ * @author Brantley Harris, 2009-2011
+ * @author Timo Tijhof, 2011-2012
+ * @source This plugin is heavily influenced by MochiKit's serializeJSON, which is
+ * copyrighted 2005 by Bob Ippolito.
+ * @source Brantley Harris wrote this plugin. It is based somewhat on the JSON.org
+ * website's http://www.json.org/json2.js, which proclaims:
+ * "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that
+ * I uphold.
+ * @license MIT License <http://www.opensource.org/licenses/mit-license.php>
*/
+(function ($) {
+ 'use strict';
-(function( $ ) {
-
- var escapeable = /["\\\x00-\x1f\x7f-\x9f]/g,
- meta = {
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '"' : '\\"',
- '\\': '\\\\'
- };
+ var escape = /["\\\x00-\x1f\x7f-\x9f]/g,
+ meta = {
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '"' : '\\"',
+ '\\': '\\\\'
+ },
+ hasOwn = Object.prototype.hasOwnProperty;
/**
* jQuery.toJSON
- * Converts the given argument into a JSON respresentation.
+ * Converts the given argument into a JSON representation.
*
- * @param o {Mixed} The json-serializble *thing* to be converted
+ * @param o {Mixed} The json-serializable *thing* to be converted
*
* If an object has a toJSON prototype, that will be used to get the representation.
* Non-integer/string keys are skipped in the object, as are keys that point to a
* function.
*
*/
- $.toJSON = typeof JSON === 'object' && JSON.stringify
- ? JSON.stringify
- : function( o ) {
-
- if ( o === null ) {
+ $.toJSON = typeof JSON === 'object' && JSON.stringify ? JSON.stringify : function (o) {
+ if (o === null) {
return 'null';
}
- var type = typeof o;
+ var pairs, k, name, val,
+ type = $.type(o);
- if ( type === 'undefined' ) {
+ if (type === 'undefined') {
return undefined;
}
- if ( type === 'number' || type === 'boolean' ) {
- return '' + o;
+
+ // Also covers instantiated Number and Boolean objects,
+ // which are typeof 'object' but thanks to $.type, we
+ // catch them here. I don't know whether it is right
+ // or wrong that instantiated primitives are not
+ // exported to JSON as an {"object":..}.
+ // We choose this path because that's what the browsers did.
+ if (type === 'number' || type === 'boolean') {
+ return String(o);
}
- if ( type === 'string') {
- return $.quoteString( o );
+ if (type === 'string') {
+ return $.quoteString(o);
}
- if ( type === 'object' ) {
- if ( typeof o.toJSON === 'function' ) {
- return $.toJSON( o.toJSON() );
- }
- if ( o.constructor === Date ) {
- var month = o.getUTCMonth() + 1,
- day = o.getUTCDate(),
- year = o.getUTCFullYear(),
- hours = o.getUTCHours(),
- minutes = o.getUTCMinutes(),
- seconds = o.getUTCSeconds(),
- milli = o.getUTCMilliseconds();
+ if (typeof o.toJSON === 'function') {
+ return $.toJSON(o.toJSON());
+ }
+ if (type === 'date') {
+ var month = o.getUTCMonth() + 1,
+ day = o.getUTCDate(),
+ year = o.getUTCFullYear(),
+ hours = o.getUTCHours(),
+ minutes = o.getUTCMinutes(),
+ seconds = o.getUTCSeconds(),
+ milli = o.getUTCMilliseconds();
- if ( month < 10 ) {
- month = '0' + month;
- }
- if ( day < 10 ) {
- day = '0' + day;
- }
- if ( hours < 10 ) {
- hours = '0' + hours;
- }
- if ( minutes < 10 ) {
- minutes = '0' + minutes;
- }
- if ( seconds < 10 ) {
- seconds = '0' + seconds;
- }
- if ( milli < 100 ) {
- milli = '0' + milli;
- }
- if ( milli < 10 ) {
- milli = '0' + milli;
- }
- return '"' + year + '-' + month + '-' + day + 'T' +
- hours + ':' + minutes + ':' + seconds +
- '.' + milli + 'Z"';
+ if (month < 10) {
+ month = '0' + month;
}
- if ( o.constructor === Array ) {
- var ret = [];
- for ( var i = 0; i < o.length; i++ ) {
- ret.push( $.toJSON( o[i] ) || 'null' );
- }
- return '[' + ret.join(',') + ']';
+ if (day < 10) {
+ day = '0' + day;
+ }
+ if (hours < 10) {
+ hours = '0' + hours;
+ }
+ if (minutes < 10) {
+ minutes = '0' + minutes;
+ }
+ if (seconds < 10) {
+ seconds = '0' + seconds;
+ }
+ if (milli < 100) {
+ milli = '0' + milli;
+ }
+ if (milli < 10) {
+ milli = '0' + milli;
+ }
+ return '"' + year + '-' + month + '-' + day + 'T' +
+ hours + ':' + minutes + ':' + seconds +
+ '.' + milli + 'Z"';
+ }
+
+ pairs = [];
+
+ if ($.isArray(o)) {
+ for (k = 0; k < o.length; k++) {
+ pairs.push($.toJSON(o[k]) || 'null');
}
- var name,
- val,
- pairs = [];
- for ( var k in o ) {
- type = typeof k;
- if ( type === 'number' ) {
- name = '"' + k + '"';
- } else if (type === 'string') {
- name = $.quoteString(k);
- } else {
+ return '[' + pairs.join(',') + ']';
+ }
+
+ // Any other object (plain object, RegExp, ..)
+ // Need to do typeof instead of $.type, because we also
+ // want to catch non-plain objects.
+ if (typeof o === 'object') {
+ for (k in o) {
+ // Only include own properties,
+ // Filter out inherited prototypes
+ if (hasOwn.call(o, k)) {
// Keys must be numerical or string. Skip others
- continue;
- }
- type = typeof o[k];
+ type = typeof k;
+ if (type === 'number') {
+ name = '"' + k + '"';
+ } else if (type === 'string') {
+ name = $.quoteString(k);
+ } else {
+ continue;
+ }
+ type = typeof o[k];
- if ( type === 'function' || type === 'undefined' ) {
// Invalid values like these return undefined
// from toJSON, however those object members
// shouldn't be included in the JSON string at all.
- continue;
+ if (type !== 'function' && type !== 'undefined') {
+ val = $.toJSON(o[k]);
+ pairs.push(name + ':' + val);
+ }
}
- val = $.toJSON( o[k] );
- pairs.push( name + ':' + val );
}
- return '{' + pairs.join( ',' ) + '}';
+ return '{' + pairs.join(',') + '}';
}
};
/**
* jQuery.evalJSON
- * Evaluates a given piece of json source.
+ * Evaluates a given json string.
*
- * @param src {String}
+ * @param str {String}
*/
- $.evalJSON = typeof JSON === 'object' && JSON.parse
- ? JSON.parse
- : function( src ) {
- return eval('(' + src + ')');
+ $.evalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
+ /*jshint evil: true */
+ return eval('(' + str + ')');
};
/**
* jQuery.secureEvalJSON
* Evals JSON in a way that is *more* secure.
*
- * @param src {String}
+ * @param str {String}
*/
- $.secureEvalJSON = typeof JSON === 'object' && JSON.parse
- ? JSON.parse
- : function( src ) {
-
+ $.secureEvalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) {
var filtered =
- src
- .replace( /\\["\\\/bfnrtu]/g, '@' )
- .replace( /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
- .replace( /(?:^|:|,)(?:\s*\[)+/g, '');
+ str
+ .replace(/\\["\\\/bfnrtu]/g, '@')
+ .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
+ .replace(/(?:^|:|,)(?:\s*\[)+/g, '');
- if ( /^[\],:{}\s]*$/.test( filtered ) ) {
- return eval( '(' + src + ')' );
- } else {
- throw new SyntaxError( 'Error parsing JSON, source is not valid.' );
+ if (/^[\],:{}\s]*$/.test(filtered)) {
+ /*jshint evil: true */
+ return eval('(' + str + ')');
}
+ throw new SyntaxError('Error parsing JSON, source is not valid.');
};
/**
@@ -176,18 +182,18 @@
* >>> jQuery.quoteString('"Where are we going?", she asked.')
* "\"Where are we going?\", she asked."
*/
- $.quoteString = function( string ) {
- if ( string.match( escapeable ) ) {
- return '"' + string.replace( escapeable, function( a ) {
+ $.quoteString = function (str) {
+ if (str.match(escape)) {
+ return '"' + str.replace(escape, function (a) {
var c = meta[a];
- if ( typeof c === 'string' ) {
+ if (typeof c === 'string') {
return c;
}
c = a.charCodeAt();
return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
}) + '"';
}
- return '"' + string + '"';
+ return '"' + str + '"';
};
-})( jQuery );
+}(jQuery));
diff --git a/resources/jquery/jquery.localize.js b/resources/jquery/jquery.localize.js
index 3e786ec2..d9a2b199 100644
--- a/resources/jquery/jquery.localize.js
+++ b/resources/jquery/jquery.localize.js
@@ -1,9 +1,31 @@
/**
- * Simple Placeholder-based Localization
+ * @class jQuery.plugin.localize
+ */
+( function ( $, mw ) {
+
+/**
+ * Gets a localized message, using parameters from options if present.
+ * @ignore
+ *
+ * @param {Object} options
+ * @param {string} key
+ * @returns {string} Localized message
+ */
+function msg( options, key ) {
+ var args = options.params[key] || [];
+ // Format: mw.msg( key [, p1, p2, ...] )
+ args.unshift( options.prefix + ( options.keys[key] || key ) );
+ return mw.msg.apply( mw, args );
+}
+
+/**
+ * Localizes a DOM selection by replacing <html:msg /> elements with localized text and adding
+ * localized title and alt attributes to elements with title-msg and alt-msg attributes
+ * respectively.
*
- * Call on a selection of HTML which contains <html:msg key="message-key" /> elements or elements
+ * Call on a selection of HTML which contains `<html:msg key="message-key" />` elements or elements
* with title-msg="message-key", alt-msg="message-key" or placeholder-msg="message-key" attributes.
- * <html:msg /> elements will be replaced with localized text, *-msg attributes will be replaced
+ * `<html:msg />` elements will be replaced with localized text, *-msg attributes will be replaced
* with attributes that do not have the "-msg" suffix and contain a localized message.
*
* Example:
@@ -77,34 +99,12 @@
* Appends something like this to the body...
* <p>You may not get there all in one piece.</p>
*
- */
-( function ( $, mw ) {
-
-/**
- * Gets a localized message, using parameters from options if present.
- *
- * @function
- * @param {String} key Message key to get localized message for
- * @returns {String} Localized message
- */
-function msg( options, key ) {
- var args = options.params[key] || [];
- // Format: mw.msg( key [, p1, p2, ...] )
- args.unshift( options.prefix + ( options.keys[key] || key ) );
- return mw.msg.apply( mw, args );
-}
-
-/**
- * Localizes a DOM selection by replacing <html:msg /> elements with localized text and adding
- * localized title and alt attributes to elements with title-msg and alt-msg attributes
- * respectively.
- *
* @method
* @param {Object} options Map of options to be used while localizing
- * @param {String} options.prefix String to prepend to all message keys
+ * @param {string} options.prefix String to prepend to all message keys
* @param {Object} options.keys Message key aliases, used for remapping keys to a template
* @param {Object} options.params Lists of parameters to use with certain message keys
- * @returns {jQuery} This selection
+ * @return {jQuery}
*/
$.fn.localize = function ( options ) {
var $target = this,
@@ -162,4 +162,9 @@ $.fn.localize = function ( options ) {
// Let IE know about the msg tag before it's used...
document.createElement( 'msg' );
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.localize
+ */
+
}( jQuery, mediaWiki ) );
diff --git a/resources/jquery/jquery.makeCollapsible.js b/resources/jquery/jquery.makeCollapsible.js
index 0a4d3645..1407f53b 100644
--- a/resources/jquery/jquery.makeCollapsible.js
+++ b/resources/jquery/jquery.makeCollapsible.js
@@ -2,340 +2,391 @@
* 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 class "mw-made-collapsible".
- * Except for tables and lists, the inner content is wrapped in "mw-collapsible-content".
+ * - 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).
*
- * @author Krinkle <krinklemail@gmail.com>
+ * @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>
*/
( function ( $, mw ) {
+ var lpx = 'jquery.makeCollapsible> ';
+
+ /**
+ * @param {jQuery} $collapsible
+ * @param {string} action The action this function will take ('expand' or 'collapse').
+ * @param {jQuery|null} [optional] $defaultToggle
+ * @param {Object|undefined} options
+ */
+ function toggleElement( $collapsible, action, $defaultToggle, options ) {
+ var $collapsibleContent, $containers;
+ options = options || {};
+
+ // Validate parameters
+
+ // $collapsible must be an instance of jQuery
+ if ( !$collapsible.jquery ) {
+ return;
+ }
+ if ( action !== 'expand' && action !== 'collapse' ) {
+ // action must be string with 'expand' or 'collapse'
+ return;
+ }
+ if ( $defaultToggle === undefined ) {
+ $defaultToggle = null;
+ }
+ if ( $defaultToggle !== null && !$defaultToggle.jquery ) {
+ // is optional (may be undefined), but if defined it must be an instance of jQuery.
+ // If it's not, abort right away.
+ // After this $defaultToggle is either null or a valid jQuery instance.
+ return;
+ }
-$.fn.makeCollapsible = function () {
-
- return this.each(function () {
+ // Handle different kinds of elements
- // Define reused variables and functions
- var $toggle,
- lpx = 'jquery.makeCollapsible> ',
- $that = $(this).addClass( 'mw-collapsible' ), // case: $( '#myAJAXelement' ).makeCollapsible()
- that = this,
- collapsetext = $(this).attr( 'data-collapsetext' ),
- expandtext = $(this).attr( 'data-expandtext' ),
- toggleElement = function ( $collapsible, action, $defaultToggle, instantHide ) {
- var $collapsibleContent, $containers;
+ if ( !options.plainMode && $collapsible.is( 'table' ) ) {
+ // Tables
+ $containers = $collapsible.find( '> tbody > tr' );
+ if ( $defaultToggle ) {
+ // Exclude table row containing togglelink
+ $containers = $containers.not( $defaultToggle.closest( 'tr' ) );
+ }
- // Validate parameters
- if ( !$collapsible.jquery ) { // $collapsible must be an instance of jQuery
- return;
- }
- if ( action !== 'expand' && action !== 'collapse' ) {
- // action must be string with 'expand' or 'collapse'
- return;
- }
- if ( $defaultToggle === undefined ) {
- $defaultToggle = null;
- }
- if ( $defaultToggle !== null && !($defaultToggle instanceof $) ) {
- // is optional (may be undefined), but if defined it must be an instance of jQuery.
- // If it's not, abort right away.
- // After this $defaultToggle is either null or a valid jQuery instance.
- return;
+ if ( action === 'collapse' ) {
+ // Hide all table rows of this table
+ // Slide doesn't work with tables, but fade does as of jQuery 1.1.3
+ // http://stackoverflow.com/questions/467336#920480
+ if ( options.instantHide ) {
+ $containers.hide();
+ } else {
+ $containers.stop( true, true ).fadeOut();
}
+ } else {
+ $containers.stop( true, true ).fadeIn();
+ }
- if ( action === 'collapse' ) {
-
- // Collapse the element
- if ( $collapsible.is( 'table' ) ) {
- // Hide all table rows of this table
- // Slide doens't work with tables, but fade does as of jQuery 1.1.3
- // http://stackoverflow.com/questions/467336#920480
- $containers = $collapsible.find( '>tbody>tr' );
- if ( $defaultToggle ) {
- // Exclude tablerow containing togglelink
- $containers.not( $defaultToggle.closest( 'tr' ) ).stop(true, true).fadeOut();
- } else {
- if ( instantHide ) {
- $containers.hide();
- } else {
- $containers.stop( true, true ).fadeOut();
- }
- }
-
- } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
- $containers = $collapsible.find( '> li' );
- if ( $defaultToggle ) {
- // Exclude list-item containing togglelink
- $containers.not( $defaultToggle.parent() ).stop( true, true ).slideUp();
- } else {
- if ( instantHide ) {
- $containers.hide();
- } else {
- $containers.stop( true, true ).slideUp();
- }
- }
+ } else if ( !options.plainMode && ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) ) {
+ // Lists
+ $containers = $collapsible.find( '> li' );
+ if ( $defaultToggle ) {
+ // Exclude list-item containing togglelink
+ $containers = $containers.not( $defaultToggle.parent() );
+ }
- } else { // <div>, <p> etc.
- $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
+ if ( action === 'collapse' ) {
+ if ( options.instantHide ) {
+ $containers.hide();
+ } else {
+ $containers.stop( true, true ).slideUp();
+ }
+ } else {
+ $containers.stop( true, true ).slideDown();
+ }
- // If a collapsible-content is defined, collapse it
- if ( $collapsibleContent.length ) {
- if ( instantHide ) {
- $collapsibleContent.hide();
- } else {
- $collapsibleContent.slideUp();
- }
+ } else {
+ // Everything else: <div>, <p> etc.
+ $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
- // Otherwise assume this is a customcollapse with a remote toggle
- // .. and there is no collapsible-content because the entire element should be toggled
- } else {
- if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
- $collapsible.fadeOut();
- } else {
- $collapsible.slideUp();
- }
- }
+ // If a collapsible-content is defined, act on it
+ if ( !options.plainMode && $collapsibleContent.length ) {
+ if ( action === 'collapse' ) {
+ if ( options.instantHide ) {
+ $collapsibleContent.hide();
+ } else {
+ $collapsibleContent.slideUp();
}
-
} else {
+ $collapsibleContent.slideDown();
+ }
- // Expand the element
- if ( $collapsible.is( 'table' ) ) {
- $containers = $collapsible.find( '>tbody>tr' );
- if ( $defaultToggle ) {
- // Exclude tablerow containing togglelink
- $containers.not( $defaultToggle.parent().parent() ).stop(true, true).fadeIn();
- } else {
- $containers.stop(true, true).fadeIn();
- }
-
- } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
- $containers = $collapsible.find( '> li' );
- if ( $defaultToggle ) {
- // Exclude list-item containing togglelink
- $containers.not( $defaultToggle.parent() ).stop( true, true ).slideDown();
- } else {
- $containers.stop( true, true ).slideDown();
- }
-
- } else { // <div>, <p> etc.
- $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
-
- // If a collapsible-content is defined, collapse it
- if ( $collapsibleContent.length ) {
- $collapsibleContent.slideDown();
-
- // Otherwise assume this is a customcollapse with a remote toggle
- // .. and there is no collapsible-content because the entire element should be toggled
+ // Otherwise assume this is a customcollapse with a remote toggle
+ // .. and there is no collapsible-content because the entire element should be toggled
+ } else {
+ if ( action === 'collapse' ) {
+ if ( options.instantHide ) {
+ $collapsible.hide();
+ } else {
+ if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
+ $collapsible.fadeOut();
} else {
- if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
- $collapsible.fadeIn();
- } else {
- $collapsible.slideDown();
- }
+ $collapsible.slideUp();
}
}
- }
- },
- // Toggles collapsible and togglelink class and updates text label
- toggleLinkDefault = function ( that, e ) {
- var $that = $(that),
- $collapsible = $that.closest( '.mw-collapsible.mw-made-collapsible' ).toggleClass( 'mw-collapsed' );
- e.preventDefault();
- e.stopPropagation();
-
- // It's expanded right now
- if ( !$that.hasClass( 'mw-collapsible-toggle-collapsed' ) ) {
- // Change link to "Show"
- $that.removeClass( 'mw-collapsible-toggle-expanded' ).addClass( 'mw-collapsible-toggle-collapsed' );
- if ( $that.find( '> a' ).length ) {
- $that.find( '> a' ).text( expandtext );
- } else {
- $that.text( expandtext );
- }
- // Collapse element
- toggleElement( $collapsible, 'collapse', $that );
-
- // It's collapsed right now
} else {
- // Change link to "Hide"
- $that.removeClass( 'mw-collapsible-toggle-collapsed' ).addClass( 'mw-collapsible-toggle-expanded' );
- if ( $that.find( '> a' ).length ) {
- $that.find( '> a' ).text( collapsetext );
+ if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
+ $collapsible.fadeIn();
} else {
- $that.text( collapsetext );
+ $collapsible.slideDown();
}
- // Expand element
- toggleElement( $collapsible, 'expand', $that );
- }
- return;
- },
- // Toggles collapsible and togglelink class
- toggleLinkPremade = function ( $that, e ) {
- var $collapsible = $that.eq(0).closest( '.mw-collapsible.mw-made-collapsible' ).toggleClass( 'mw-collapsed' );
- if ( $(e.target).is( 'a' ) ) {
- return true;
}
- e.preventDefault();
- e.stopPropagation();
+ }
+ }
+ }
+
+ /**
+ * Handles clicking on the collapsible element toggle and other
+ * situations where a collapsible element is toggled (e.g. the initial
+ * toggle for collapsed ones).
+ *
+ * @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
+ * @param {Object|undefined} options
+ */
+ function togglingHandler( $toggle, $collapsible, event, options ) {
+ var wasCollapsed, $textContainer, collapseText, expandText;
+
+ if ( event ) {
+ // Don't fire if a link was clicked, if requested (for premade togglers by default)
+ if ( options.linksPassthru && $.nodeName( event.target, 'a' ) ) {
+ return true;
+ } else {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
- // It's expanded right now
- if ( !$that.hasClass( 'mw-collapsible-toggle-collapsed' ) ) {
- // Change toggle to collapsed
- $that.removeClass( 'mw-collapsible-toggle-expanded' ).addClass( 'mw-collapsible-toggle-collapsed' );
- // Collapse element
- toggleElement( $collapsible, 'collapse', $that );
+ wasCollapsed = $collapsible.hasClass( 'mw-collapsed' );
- // It's collapsed right now
- } else {
- // Change toggle to expanded
- $that.removeClass( 'mw-collapsible-toggle-collapsed' ).addClass( 'mw-collapsible-toggle-expanded' );
- // Expand element
- toggleElement( $collapsible, 'expand', $that );
- }
- return;
- },
- // Toggles customcollapsible
- toggleLinkCustom = function ( $that, e, $collapsible ) {
- // For the initial state call of customtogglers there is no event passed
- if (e) {
- e.preventDefault();
- e.stopPropagation();
- }
- // Get current state and toggle to the opposite
- var action = $collapsible.hasClass( 'mw-collapsed' ) ? 'expand' : 'collapse';
- $collapsible.toggleClass( 'mw-collapsed' );
- toggleElement( $collapsible, action, $that );
-
- };
+ // Toggle the state of the collapsible element (that is, expand or collapse)
+ $collapsible.toggleClass( 'mw-collapsed', !wasCollapsed );
- // Use custom text or default ?
- if ( !collapsetext ) {
- collapsetext = mw.msg( 'collapsible-collapse' );
- }
- if ( !expandtext ) {
- expandtext = mw.msg( 'collapsible-expand' );
+ // Toggle the mw-collapsible-toggle classes, if requested (for default and premade togglers by default)
+ if ( options.toggleClasses ) {
+ $toggle
+ .toggleClass( 'mw-collapsible-toggle-collapsed', !wasCollapsed )
+ .toggleClass( 'mw-collapsible-toggle-expanded', wasCollapsed );
}
- // Create toggle link with a space around the brackets (&nbsp;[text]&nbsp;)
- var $toggleLink =
- $( '<a href="#"></a>' )
- .text( collapsetext )
- .wrap( '<span class="mw-collapsible-toggle"></span>' )
- .parent()
- .prepend( '&nbsp;[' )
- .append( ']&nbsp;' )
- .on( 'click.mw-collapse', function ( e ) {
- toggleLinkDefault( this, e );
- } );
+ // Toggle the text ("Show"/"Hide"), if requested (for default togglers by default)
+ if ( options.toggleText ) {
+ collapseText = options.toggleText.collapseText;
+ expandText = options.toggleText.expandText;
- // Return if it has been enabled already.
- if ( $that.hasClass( 'mw-made-collapsible' ) ) {
- return;
- } else {
- $that.addClass( 'mw-made-collapsible' );
+ $textContainer = $toggle.find( '> a' );
+ if ( !$textContainer.length ) {
+ $textContainer = $toggle;
+ }
+ $textContainer.text( wasCollapsed ? collapseText : expandText );
}
- // Check if this element has a custom position for the toggle link
- // (ie. outside the container or deeper inside the tree)
- // Then: Locate the custom toggle link(s) and bind them
- if ( ( $that.attr( 'id' ) || '' ).indexOf( 'mw-customcollapsible-' ) === 0 ) {
+ // And finally toggle the element state itself
+ toggleElement( $collapsible, wasCollapsed ? 'expand' : 'collapse', $toggle, options );
+ }
+
+ /**
+ * Toggles collapsible and togglelink class and updates text label.
+ *
+ * @param {jQuery} $that
+ * @param {jQuery.Event} e
+ * @param {Object|undefined} options
+ */
+ function toggleLinkDefault( $that, e, options ) {
+ var $collapsible = $that.closest( '.mw-collapsible' );
+ options = $.extend( { toggleClasses: true }, options );
+ togglingHandler( $that, $collapsible, e, options );
+ }
+
+ /**
+ * Toggles collapsible and togglelink class.
+ *
+ * @param {jQuery} $that
+ * @param {jQuery.Event} e
+ * @param {Object|undefined} options
+ */
+ function toggleLinkPremade( $that, e, options ) {
+ var $collapsible = $that.eq( 0 ).closest( '.mw-collapsible' );
+ options = $.extend( { toggleClasses: true, linksPassthru: true }, options );
+ togglingHandler( $that, $collapsible, e, options );
+ }
+
+ /**
+ * Toggles customcollapsible.
+ *
+ * @param {jQuery} $that
+ * @param {jQuery.Event} e
+ * @param {Object|undefined} options
+ * @param {jQuery} $collapsible
+ */
+ function toggleLinkCustom( $that, e, options, $collapsible ) {
+ options = $.extend( {}, options );
+ togglingHandler( $that, $collapsible, e, options );
+ }
+
+ /**
+ * Make any element collapsible.
+ *
+ * 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
+ * collapse only if the elements has the 'mw-collapsible' class.
+ * - $customTogglers: jQuerified list of 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
+ * 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.
+ */
+ $.fn.makeCollapsible = function ( options ) {
+ return this.each(function () {
+ var $collapsible, collapsetext, expandtext, $toggle, $toggleLink, $firstItem, collapsibleId,
+ $customTogglers, firstval;
+
+ if ( options === undefined ) {
+ options = {};
+ }
- var thatId = $that.attr( 'id' ),
- $customTogglers = $( '.' + thatId.replace( 'mw-customcollapsible', 'mw-customtoggle' ) );
- mw.log( lpx + 'Found custom collapsible: #' + thatId );
+ // Ensure class "mw-collapsible" is present in case .makeCollapsible()
+ // is called on element(s) that don't have it yet.
+ $collapsible = $(this).addClass( 'mw-collapsible' );
- // Double check that there is actually a customtoggle link
- if ( $customTogglers.length ) {
- $customTogglers.on( 'click.mw-collapse', function ( e ) {
- toggleLinkCustom( $(this), e, $that );
- } );
+ // Return if it has been enabled already.
+ if ( $collapsible.data( 'mw-made-collapsible' ) ) {
+ return;
} else {
- mw.log( lpx + '#' + thatId + ': Missing toggler!' );
+ $collapsible.data( 'mw-made-collapsible', true );
}
- // Initial state
- if ( $that.hasClass( 'mw-collapsed' ) ) {
- $that.removeClass( 'mw-collapsed' );
- toggleLinkCustom( $customTogglers, null, $that );
+ // Use custom text or default?
+ collapsetext = options.collapseText || $collapsible.attr( 'data-collapsetext' ) || mw.msg( 'collapsible-collapse' );
+ expandtext = options.expandText || $collapsible.attr( 'data-expandtext' ) || mw.msg( 'collapsible-expand' );
+
+ // Create toggle link with a space around the brackets (&nbsp;[text]&nbsp;)
+ $toggleLink =
+ $( '<a href="#"></a>' )
+ .text( collapsetext )
+ .wrap( '<span class="mw-collapsible-toggle"></span>' )
+ .parent()
+ .prepend( '&nbsp;[' )
+ .append( ']&nbsp;' )
+ .on( 'click.mw-collapse', function ( e, opts ) {
+ opts = $.extend( { toggleText: { collapseText: collapsetext, expandText: expandtext } }, options, opts );
+ toggleLinkDefault( $(this), e, opts );
+ } );
+
+ // Check if this element has a custom position for the toggle link
+ // (ie. outside the container or deeper inside the tree)
+ if ( options.$customTogglers ) {
+ $customTogglers = $( options.$customTogglers );
+ } else {
+ collapsibleId = $collapsible.attr( 'id' ) || '';
+ if ( collapsibleId.indexOf( 'mw-customcollapsible-' ) === 0 ) {
+ mw.log( lpx + 'Found custom collapsible: #' + collapsibleId );
+ $customTogglers = $( '.' + collapsibleId.replace( 'mw-customcollapsible', 'mw-customtoggle' ) );
+
+ // Double check that there is actually a customtoggle link
+ if ( !$customTogglers.length ) {
+ mw.log( lpx + '#' + collapsibleId + ': Missing toggler!' );
+ }
+ }
}
- // If this is not a custom case, do the default:
- // Wrap the contents add the toggle link
- } else {
-
- // Elements are treated differently
- if ( $that.is( 'table' ) ) {
- // The toggle-link will be in one the the cells (td or th) of the first row
- var $firstRowCells = $that.find( 'tr:first th, tr:first td' );
- $toggle = $firstRowCells.find( '> .mw-collapsible-toggle' );
+ // Bind the custom togglers
+ if ( $customTogglers && $customTogglers.length ) {
+ $customTogglers.on( 'click.mw-collapse', function ( e, opts ) {
+ opts = $.extend( {}, options, opts );
+ toggleLinkCustom( $(this), e, opts, $collapsible );
+ } );
- // If theres no toggle link, add it to the last cell
- if ( !$toggle.length ) {
- $firstRowCells.eq(-1).prepend( $toggleLink );
- } else {
- $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e ) {
- toggleLinkPremade( $toggle, e );
- } );
+ // Initial state
+ if ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) {
+ // Remove here so that the toggler goes in the right direction,
+ // It re-adds the class.
+ $collapsible.removeClass( 'mw-collapsed' );
+ toggleLinkCustom( $customTogglers, null, $.extend( { instantHide: true }, options ), $collapsible );
}
- } else if ( $that.is( 'ul' ) || $that.is( 'ol' ) ) {
- // The toggle-link will be in the first list-item
- var $firstItem = $that.find( 'li:first' );
- $toggle = $firstItem.find( '> .mw-collapsible-toggle' );
-
- // If theres no toggle link, add it
- if ( !$toggle.length ) {
- // Make sure the numeral order doesn't get messed up, force the first (soon to be second) item
- // to be "1". Except if the value-attribute is already used.
- // If no value was set WebKit returns "", Mozilla returns '-1', others return null or undefined.
- var firstval = $firstItem.attr( 'value' );
- if ( firstval === undefined || !firstval || firstval === '-1' || firstval === -1 ) {
- $firstItem.attr( 'value', '1' );
+ // If this is not a custom case, do the default:
+ // Wrap the contents and add the toggle link
+ } else {
+ // Elements are treated differently
+ if ( $collapsible.is( 'table' ) ) {
+ // The toggle-link will be in one the the cells (td or th) of the first row
+ $firstItem = $collapsible.find( 'tr:first th, tr:first td' );
+ $toggle = $firstItem.find( '> .mw-collapsible-toggle' );
+
+ // If theres no toggle link, add it to the last cell
+ if ( !$toggle.length ) {
+ $firstItem.eq(-1).prepend( $toggleLink );
+ } else {
+ $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
+ opts = $.extend( {}, options, opts );
+ toggleLinkPremade( $toggle, e, opts );
+ } );
}
- $that.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() );
- } else {
- $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e ) {
- toggleLinkPremade( $toggle, e );
- } );
- }
- } else { // <div>, <p> etc.
+ } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
+ // The toggle-link will be in the first list-item
+ $firstItem = $collapsible.find( 'li:first' );
+ $toggle = $firstItem.find( '> .mw-collapsible-toggle' );
+
+ // If theres no toggle link, add it
+ if ( !$toggle.length ) {
+ // Make sure the numeral order doesn't get messed up, force the first (soon to be second) item
+ // to be "1". Except if the value-attribute is already used.
+ // If no value was set WebKit returns "", Mozilla returns '-1', others return null or undefined.
+ firstval = $firstItem.attr( 'value' );
+ if ( firstval === undefined || !firstval || firstval === '-1' || firstval === -1 ) {
+ $firstItem.attr( 'value', '1' );
+ }
+ $collapsible.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() );
+ } else {
+ $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
+ opts = $.extend( {}, options, opts );
+ toggleLinkPremade( $toggle, e, opts );
+ } );
+ }
- // The toggle-link will be the first child of the element
- $toggle = $that.find( '> .mw-collapsible-toggle' );
+ } else { // <div>, <p> etc.
- // If a direct child .content-wrapper does not exists, create it
- if ( !$that.find( '> .mw-collapsible-content' ).length ) {
- $that.wrapInner( '<div class="mw-collapsible-content"></div>' );
- }
+ // The toggle-link will be the first child of the element
+ $toggle = $collapsible.find( '> .mw-collapsible-toggle' );
- // If theres no toggle link, add it
- if ( !$toggle.length ) {
- $that.prepend( $toggleLink );
- } else {
- $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e ) {
- toggleLinkPremade( $toggle, e );
- } );
+ // If a direct child .content-wrapper does not exists, create it
+ if ( !$collapsible.find( '> .mw-collapsible-content' ).length ) {
+ $collapsible.wrapInner( '<div class="mw-collapsible-content"></div>' );
+ }
+
+ // If theres no toggle link, add it
+ if ( !$toggle.length ) {
+ $collapsible.prepend( $toggleLink );
+ } else {
+ $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
+ opts = $.extend( {}, options, opts );
+ toggleLinkPremade( $toggle, e, opts );
+ } );
+ }
}
}
- }
-
- // Initial state (only for those that are not custom)
- if ( $that.hasClass( 'mw-collapsed' ) && ( $that.attr( 'id' ) || '').indexOf( 'mw-customcollapsible-' ) !== 0 ) {
- $that.removeClass( 'mw-collapsed' );
- // The collapsible element could have multiple togglers
- // To toggle the initial state only click one of them (ie. the first one, eq(0) )
- // Else it would go like: hide,show,hide,show for each toggle link.
- toggleElement( $that, 'collapse', $toggleLink.eq(0), /* instantHide = */ true );
- $toggleLink.eq(0).click();
- }
- } );
-};
+ // Initial state (only for those that are not custom,
+ // because the initial state of those has been taken care of already).
+ if (
+ ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) &&
+ ( !$customTogglers || !$customTogglers.length )
+ ) {
+ $collapsible.removeClass( 'mw-collapsed' );
+ // The collapsible element could have multiple togglers
+ // To toggle the initial state only click one of them (ie. the first one, eq(0) )
+ // Else it would go like: hide,show,hide,show for each toggle link.
+ // This is just like it would be in reality (only one toggle is clicked at a time).
+ $toggleLink.eq( 0 ).trigger( 'click', [ { instantHide: true } ] );
+ }
+ } );
+ };
}( jQuery, mediaWiki ) );
diff --git a/resources/jquery/jquery.mw-jump.js b/resources/jquery/jquery.mw-jump.js
index 36b6690c..e2868341 100644
--- a/resources/jquery/jquery.mw-jump.js
+++ b/resources/jquery/jquery.mw-jump.js
@@ -1,12 +1,12 @@
/**
* JavaScript to show jump links to motor-impaired users when they are focused.
*/
-jQuery( function( $ ) {
+jQuery( function ( $ ) {
- $('.mw-jump').delegate( 'a', 'focus blur', function( e ) {
- // Confusingly jQuery leaves e.type as "focusout" for delegated blur events
- if ( e.type === "blur" || e.type === "focusout" ) {
- $( this ).closest( '.mw-jump' ).css({ height: '0' });
+ $( '.mw-jump' ).on( 'focus blur', 'a', function ( e ) {
+ // Confusingly jQuery leaves e.type as focusout for delegated blur events
+ if ( e.type === 'blur' || e.type === 'focusout' ) {
+ $( this ).closest( '.mw-jump' ).css({ height: 0 });
} else {
$( this ).closest( '.mw-jump' ).css({ height: 'auto' });
}
diff --git a/resources/jquery/jquery.mwExtension.js b/resources/jquery/jquery.mwExtension.js
index bbffd7b7..de399788 100644
--- a/resources/jquery/jquery.mwExtension.js
+++ b/resources/jquery/jquery.mwExtension.js
@@ -15,12 +15,13 @@
return str.charAt( 0 ).toUpperCase() + str.substr( 1 );
},
escapeRE: function ( str ) {
- return str.replace ( /([\\{}()|.?*+\-\^$\[\]])/g, "\\$1" );
+ return str.replace ( /([\\{}()|.?*+\-\^$\[\]])/g, '\\$1' );
},
isDomElement: function ( el ) {
return !!el && !!el.nodeType;
},
isEmpty: function ( v ) {
+ var key;
if ( v === '' || v === 0 || v === '0' || v === null
|| v === false || v === undefined )
{
@@ -32,7 +33,7 @@
return true;
}
if ( typeof v === 'object' ) {
- for ( var key in v ) {
+ for ( key in v ) {
return false;
}
return true;
diff --git a/resources/jquery/jquery.qunit.completenessTest.js b/resources/jquery/jquery.qunit.completenessTest.js
index 1475af2a..20e6678e 100644
--- a/resources/jquery/jquery.qunit.completenessTest.js
+++ b/resources/jquery/jquery.qunit.completenessTest.js
@@ -12,10 +12,8 @@
*
* @author Timo Tijhof, 2011-2012
*/
-/*global jQuery, QUnit */
-/*jshint eqeqeq:false, eqnull:false, forin:false */
( function ( $ ) {
- "use strict";
+ 'use strict';
var util,
hasOwn = Object.prototype.hasOwnProperty,
diff --git a/resources/jquery/jquery.qunit.css b/resources/jquery/jquery.qunit.css
index 55970e00..d7fc0c8e 100644
--- a/resources/jquery/jquery.qunit.css
+++ b/resources/jquery/jquery.qunit.css
@@ -1,5 +1,5 @@
/**
- * QUnit v1.10.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.11.0 - A JavaScript Unit Testing Framework
*
* http://qunitjs.com
*
@@ -20,7 +20,7 @@
/** Resets */
-#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
margin: 0;
padding: 0;
}
@@ -111,7 +111,12 @@
color: #000;
}
-#qunit-tests ol {
+#qunit-tests li .runtime {
+ float: right;
+ font-size: smaller;
+}
+
+.qunit-assert-list {
margin-top: 0.5em;
padding: 0.5em;
@@ -122,6 +127,10 @@
-webkit-border-radius: 5px;
}
+.qunit-collapsed {
+ display: none;
+}
+
#qunit-tests table {
border-collapse: collapse;
margin-top: .2em;
diff --git a/resources/jquery/jquery.qunit.js b/resources/jquery/jquery.qunit.js
index d4f17b5a..302545f4 100644
--- a/resources/jquery/jquery.qunit.js
+++ b/resources/jquery/jquery.qunit.js
@@ -1,5 +1,5 @@
/**
- * QUnit v1.10.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.11.0 - A JavaScript Unit Testing Framework
*
* http://qunitjs.com
*
@@ -11,6 +11,7 @@
(function( window ) {
var QUnit,
+ assert,
config,
onErrorFnPrev,
testId = 0,
@@ -20,18 +21,67 @@ var QUnit,
// Keep a local reference to Date (GH-283)
Date = window.Date,
defined = {
- setTimeout: typeof window.setTimeout !== "undefined",
- sessionStorage: (function() {
- var x = "qunit-test-string";
- try {
- sessionStorage.setItem( x, x );
- sessionStorage.removeItem( x );
- return true;
- } catch( e ) {
- return false;
+ setTimeout: typeof window.setTimeout !== "undefined",
+ sessionStorage: (function() {
+ var x = "qunit-test-string";
+ try {
+ sessionStorage.setItem( x, x );
+ sessionStorage.removeItem( x );
+ return true;
+ } catch( e ) {
+ return false;
+ }
+ }())
+ },
+ /**
+ * Provides a normalized error string, correcting an issue
+ * with IE 7 (and prior) where Error.prototype.toString is
+ * not properly implemented
+ *
+ * Based on http://es5.github.com/#x15.11.4.4
+ *
+ * @param {String|Error} error
+ * @return {String} error message
+ */
+ errorString = function( error ) {
+ var name, message,
+ errorString = error.toString();
+ if ( errorString.substring( 0, 7 ) === "[object" ) {
+ name = error.name ? error.name.toString() : "Error";
+ message = error.message ? error.message.toString() : "";
+ if ( name && message ) {
+ return name + ": " + message;
+ } else if ( name ) {
+ return name;
+ } else if ( message ) {
+ return message;
+ } else {
+ return "Error";
+ }
+ } else {
+ return errorString;
}
- }())
-};
+ },
+ /**
+ * Makes a clone of an object using only Array or Object as base,
+ * and copies over the own enumerable properties.
+ *
+ * @param {Object} obj
+ * @return {Object} New object with only the own properties (recursively).
+ */
+ objectValues = function( obj ) {
+ // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
+ /*jshint newcap: false */
+ var key, val,
+ vals = QUnit.is( "array", obj ) ? [] : {};
+ for ( key in obj ) {
+ if ( hasOwn.call( obj, key ) ) {
+ val = obj[key];
+ vals[key] = val === Object(val) ? objectValues(val) : val;
+ }
+ }
+ return vals;
+ };
function Test( settings ) {
extend( this, settings );
@@ -44,11 +94,11 @@ Test.count = 0;
Test.prototype = {
init: function() {
var a, b, li,
- tests = id( "qunit-tests" );
+ tests = id( "qunit-tests" );
if ( tests ) {
b = document.createElement( "strong" );
- b.innerHTML = this.name;
+ b.innerHTML = this.nameHtml;
// `a` initialized at top of scope
a = document.createElement( "a" );
@@ -92,6 +142,7 @@ Test.prototype = {
teardown: function() {}
}, this.moduleTestEnvironment );
+ this.started = +new Date();
runLoggingCallbacks( "testStart", QUnit, {
name: this.testName,
module: this.module
@@ -111,7 +162,7 @@ Test.prototype = {
try {
this.testEnvironment.setup.call( this.testEnvironment );
} catch( e ) {
- QUnit.pushFailure( "Setup failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) );
+ QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
}
},
run: function() {
@@ -120,22 +171,28 @@ Test.prototype = {
var running = id( "qunit-testresult" );
if ( running ) {
- running.innerHTML = "Running: <br/>" + this.name;
+ running.innerHTML = "Running: <br/>" + this.nameHtml;
}
if ( this.async ) {
QUnit.stop();
}
+ this.callbackStarted = +new Date();
+
if ( config.notrycatch ) {
this.callback.call( this.testEnvironment, QUnit.assert );
+ this.callbackRuntime = +new Date() - this.callbackStarted;
return;
}
try {
this.callback.call( this.testEnvironment, QUnit.assert );
+ this.callbackRuntime = +new Date() - this.callbackStarted;
} catch( e ) {
- QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + e.message, extractStacktrace( e, 0 ) );
+ this.callbackRuntime = +new Date() - this.callbackStarted;
+
+ QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
// else next test will carry the responsibility
saveGlobal();
@@ -148,38 +205,43 @@ Test.prototype = {
teardown: function() {
config.current = this;
if ( config.notrycatch ) {
+ if ( typeof this.callbackRuntime === "undefined" ) {
+ this.callbackRuntime = +new Date() - this.callbackStarted;
+ }
this.testEnvironment.teardown.call( this.testEnvironment );
return;
} else {
try {
this.testEnvironment.teardown.call( this.testEnvironment );
} catch( e ) {
- QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) );
+ QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
}
}
checkPollution();
},
finish: function() {
config.current = this;
- if ( config.requireExpects && this.expected == null ) {
+ if ( config.requireExpects && this.expected === null ) {
QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
- } else if ( this.expected != null && this.expected != this.assertions.length ) {
+ } else if ( this.expected !== null && this.expected !== this.assertions.length ) {
QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
- } else if ( this.expected == null && !this.assertions.length ) {
+ } else if ( this.expected === null && !this.assertions.length ) {
QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
}
- var assertion, a, b, i, li, ol,
+ var i, assertion, a, b, time, li, ol,
test = this,
good = 0,
bad = 0,
tests = id( "qunit-tests" );
+ this.runtime = +new Date() - this.started;
config.stats.all += this.assertions.length;
config.moduleStats.all += this.assertions.length;
if ( tests ) {
ol = document.createElement( "ol" );
+ ol.className = "qunit-assert-list";
for ( i = 0; i < this.assertions.length; i++ ) {
assertion = this.assertions[i];
@@ -208,22 +270,22 @@ Test.prototype = {
}
if ( bad === 0 ) {
- ol.style.display = "none";
+ addClass( ol, "qunit-collapsed" );
}
// `b` initialized at top of scope
b = document.createElement( "strong" );
- b.innerHTML = this.name + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
+ b.innerHTML = this.nameHtml + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
addEvent(b, "click", function() {
- var next = b.nextSibling.nextSibling,
- display = next.style.display;
- next.style.display = display === "none" ? "block" : "none";
+ var next = b.parentNode.lastChild,
+ collapsed = hasClass( next, "qunit-collapsed" );
+ ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
});
addEvent(b, "dblclick", function( e ) {
var target = e && e.target ? e.target : window.event.srcElement;
- if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) {
+ if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
target = target.parentNode;
}
if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
@@ -231,13 +293,19 @@ Test.prototype = {
}
});
+ // `time` initialized at top of scope
+ time = document.createElement( "span" );
+ time.className = "runtime";
+ time.innerHTML = this.runtime + " ms";
+
// `li` initialized at top of scope
li = id( this.id );
li.className = bad ? "fail" : "pass";
li.removeChild( li.firstChild );
a = li.firstChild;
li.appendChild( b );
- li.appendChild ( a );
+ li.appendChild( a );
+ li.appendChild( time );
li.appendChild( ol );
} else {
@@ -255,7 +323,8 @@ Test.prototype = {
module: this.module,
failed: bad,
passed: this.assertions.length - bad,
- total: this.assertions.length
+ total: this.assertions.length,
+ duration: this.runtime
});
QUnit.reset();
@@ -321,7 +390,7 @@ QUnit = {
test: function( testName, expected, callback, async ) {
var test,
- name = "<span class='test-name'>" + escapeInnerText( testName ) + "</span>";
+ nameHtml = "<span class='test-name'>" + escapeText( testName ) + "</span>";
if ( arguments.length === 2 ) {
callback = expected;
@@ -329,11 +398,11 @@ QUnit = {
}
if ( config.currentModule ) {
- name = "<span class='module-name'>" + config.currentModule + "</span>: " + name;
+ nameHtml = "<span class='module-name'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;
}
test = new Test({
- name: name,
+ nameHtml: nameHtml,
testName: testName,
expected: expected,
async: async,
@@ -360,6 +429,18 @@ QUnit = {
},
start: function( count ) {
+ // QUnit hasn't been initialized yet.
+ // Note: RequireJS (et al) may delay onLoad
+ if ( config.semaphore === undefined ) {
+ QUnit.begin(function() {
+ // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
+ setTimeout(function() {
+ QUnit.start( count );
+ });
+ });
+ return;
+ }
+
config.semaphore -= count || 1;
// don't start until equal number of stop-calls
if ( config.semaphore > 0 ) {
@@ -368,6 +449,8 @@ QUnit = {
// ignore if start is called more often then stop
if ( config.semaphore < 0 ) {
config.semaphore = 0;
+ QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
+ return;
}
// A slight delay, to avoid any current callbacks
if ( defined.setTimeout ) {
@@ -403,11 +486,14 @@ QUnit = {
}
};
+// `assert` initialized at top of scope
// Asssert helpers
-// All of these must call either QUnit.push() or manually do:
+// All of these must either call QUnit.push() or manually do:
// - runLoggingCallbacks( "log", .. );
// - config.current.assertions.push({ .. });
-QUnit.assert = {
+// We attach it to the QUnit object *after* we expose the public API,
+// otherwise `assert` will become a global variable in browsers (#341).
+assert = {
/**
* Asserts rough true-ish result.
* @name ok
@@ -428,14 +514,14 @@ QUnit.assert = {
message: msg
};
- msg = escapeInnerText( msg || (result ? "okay" : "failed" ) );
+ msg = escapeText( msg || (result ? "okay" : "failed" ) );
msg = "<span class='test-message'>" + msg + "</span>";
if ( !result ) {
source = sourceFromStacktrace( 2 );
if ( source ) {
details.source = source;
- msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr></table>";
+ msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr></table>";
}
}
runLoggingCallbacks( "log", QUnit, details );
@@ -453,6 +539,7 @@ QUnit.assert = {
* @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
*/
equal: function( actual, expected, message ) {
+ /*jshint eqeqeq:false */
QUnit.push( expected == actual, actual, expected, message );
},
@@ -461,10 +548,31 @@ QUnit.assert = {
* @function
*/
notEqual: function( actual, expected, message ) {
+ /*jshint eqeqeq:false */
QUnit.push( expected != actual, actual, expected, message );
},
/**
+ * @name propEqual
+ * @function
+ */
+ propEqual: function( actual, expected, message ) {
+ actual = objectValues(actual);
+ expected = objectValues(expected);
+ QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
+ },
+
+ /**
+ * @name notPropEqual
+ * @function
+ */
+ notPropEqual: function( actual, expected, message ) {
+ actual = objectValues(actual);
+ expected = objectValues(expected);
+ QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
+ },
+
+ /**
* @name deepEqual
* @function
*/
@@ -496,8 +604,9 @@ QUnit.assert = {
QUnit.push( expected !== actual, actual, expected, message );
},
- throws: function( block, expected, message ) {
+ "throws": function( block, expected, message ) {
var actual,
+ expectedOutput = expected,
ok = false;
// 'expected' is optional
@@ -518,18 +627,20 @@ QUnit.assert = {
// we don't want to validate thrown error
if ( !expected ) {
ok = true;
+ expectedOutput = null;
// expected is a regexp
} else if ( QUnit.objectType( expected ) === "regexp" ) {
- ok = expected.test( actual );
+ ok = expected.test( errorString( actual ) );
// expected is a constructor
} else if ( actual instanceof expected ) {
ok = true;
// expected is a validation function which returns true is validation passed
} else if ( expected.call( {}, actual ) === true ) {
+ expectedOutput = null;
ok = true;
}
- QUnit.push( ok, actual, null, message );
+ QUnit.push( ok, actual, expectedOutput, message );
} else {
QUnit.pushFailure( message, null, 'No exception was thrown.' );
}
@@ -538,15 +649,16 @@ QUnit.assert = {
/**
* @deprecate since 1.8.0
- * Kept assertion helpers in root for backwards compatibility
+ * Kept assertion helpers in root for backwards compatibility.
*/
-extend( QUnit, QUnit.assert );
+extend( QUnit, assert );
/**
* @deprecated since 1.9.0
- * Kept global "raises()" for backwards compatibility
+ * Kept root "raises()" for backwards compatibility.
+ * (Note that we don't introduce assert.raises).
*/
-QUnit.raises = QUnit.assert.throws;
+QUnit.raises = assert[ "throws" ];
/**
* @deprecated since 1.0.0, replaced with error pushes since 1.3.0
@@ -622,6 +734,15 @@ config = {
moduleDone: []
};
+// Export global variables, unless an 'exports' object exists,
+// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
+if ( typeof exports === "undefined" ) {
+ extend( window, QUnit );
+
+ // Expose QUnit object
+ window.QUnit = QUnit;
+}
+
// Initialize more QUnit.config and QUnit.urlParams
(function() {
var i,
@@ -655,18 +776,11 @@ config = {
QUnit.isLocal = location.protocol === "file:";
}());
-// Export global variables, unless an 'exports' object exists,
-// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
-if ( typeof exports === "undefined" ) {
- extend( window, QUnit );
-
- // Expose QUnit object
- window.QUnit = QUnit;
-}
-
// Extend QUnit object,
// these after set here because they should not be exposed as global functions
extend( QUnit, {
+ assert: assert,
+
config: config,
// Initialize the configuration options
@@ -681,7 +795,7 @@ extend( QUnit, {
autorun: false,
filter: "",
queue: [],
- semaphore: 0
+ semaphore: 1
});
var tests, banner, result,
@@ -689,7 +803,7 @@ extend( QUnit, {
if ( qunit ) {
qunit.innerHTML =
- "<h1 id='qunit-header'>" + escapeInnerText( document.title ) + "</h1>" +
+ "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
"<h2 id='qunit-banner'></h2>" +
"<div id='qunit-testrunner-toolbar'></div>" +
"<h2 id='qunit-userAgent'></h2>" +
@@ -745,7 +859,7 @@ extend( QUnit, {
// Safe object type checking
is: function( type, obj ) {
- return QUnit.objectType( obj ) == type;
+ return QUnit.objectType( obj ) === type;
},
objectType: function( obj ) {
@@ -757,7 +871,8 @@ extend( QUnit, {
return "null";
}
- var type = toString.call( obj ).match(/^\[object\s(.*)\]$/)[1] || "";
+ var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
+ type = match && match[1] || "";
switch ( type ) {
case "Number":
@@ -794,16 +909,16 @@ extend( QUnit, {
expected: expected
};
- message = escapeInnerText( message ) || ( result ? "okay" : "failed" );
+ message = escapeText( message ) || ( result ? "okay" : "failed" );
message = "<span class='test-message'>" + message + "</span>";
output = message;
if ( !result ) {
- expected = escapeInnerText( QUnit.jsDump.parse(expected) );
- actual = escapeInnerText( QUnit.jsDump.parse(actual) );
+ expected = escapeText( QUnit.jsDump.parse(expected) );
+ actual = escapeText( QUnit.jsDump.parse(actual) );
output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
- if ( actual != expected ) {
+ if ( actual !== expected ) {
output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
}
@@ -812,7 +927,7 @@ extend( QUnit, {
if ( source ) {
details.source = source;
- output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr>";
+ output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
}
output += "</table>";
@@ -839,19 +954,19 @@ extend( QUnit, {
message: message
};
- message = escapeInnerText( message ) || "error";
+ message = escapeText( message ) || "error";
message = "<span class='test-message'>" + message + "</span>";
output = message;
output += "<table>";
if ( actual ) {
- output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeInnerText( actual ) + "</pre></td></tr>";
+ output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
}
if ( source ) {
details.source = source;
- output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr>";
+ output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
}
output += "</table>";
@@ -876,7 +991,8 @@ extend( QUnit, {
querystring += encodeURIComponent( key ) + "=" +
encodeURIComponent( params[ key ] ) + "&";
}
- return window.location.pathname + querystring.slice( 0, -1 );
+ return window.location.protocol + "//" + window.location.host +
+ window.location.pathname + querystring.slice( 0, -1 );
},
extend: extend,
@@ -907,7 +1023,7 @@ extend( QUnit.constructor.prototype, {
// testStart: { name }
testStart: registerLoggingCallback( "testStart" ),
- // testDone: { name, failed, passed, total }
+ // testDone: { name, failed, passed, total, duration }
testDone: registerLoggingCallback( "testDone" ),
// moduleStart: { name }
@@ -925,9 +1041,10 @@ QUnit.load = function() {
runLoggingCallbacks( "begin", QUnit, {} );
// Initialize the config, saving the execution queue
- var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, urlConfigCheckboxes, moduleFilter,
- numModules = 0,
- moduleFilterHtml = "",
+ var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
+ urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,
+ numModules = 0,
+ moduleFilterHtml = "",
urlConfigHtml = "",
oldconfig = extend( {}, config );
@@ -948,14 +1065,24 @@ QUnit.load = function() {
};
}
config[ val.id ] = QUnit.urlParams[ val.id ];
- urlConfigHtml += "<input id='qunit-urlconfig-" + val.id + "' name='" + val.id + "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) + " title='" + val.tooltip + "'><label for='qunit-urlconfig-" + val.id + "' title='" + val.tooltip + "'>" + val.label + "</label>";
+ urlConfigHtml += "<input id='qunit-urlconfig-" + escapeText( val.id ) +
+ "' name='" + escapeText( val.id ) +
+ "' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) +
+ " title='" + escapeText( val.tooltip ) +
+ "'><label for='qunit-urlconfig-" + escapeText( val.id ) +
+ "' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
}
- moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " + ( config.module === undefined ? "selected" : "" ) + ">< All Modules ></option>";
+ moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
+ ( config.module === undefined ? "selected='selected'" : "" ) +
+ ">< All Modules ></option>";
+
for ( i in config.modules ) {
if ( config.modules.hasOwnProperty( i ) ) {
numModules += 1;
- moduleFilterHtml += "<option value='" + encodeURIComponent(i) + "' " + ( config.module === i ? "selected" : "" ) + ">" + i + "</option>";
+ moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(i) ) + "' " +
+ ( config.module === i ? "selected='selected'" : "" ) +
+ ">" + escapeText(i) + "</option>";
}
}
moduleFilterHtml += "</select>";
@@ -1014,22 +1141,28 @@ QUnit.load = function() {
label.innerHTML = "Hide passed tests";
toolbar.appendChild( label );
- urlConfigCheckboxes = document.createElement( 'span' );
- urlConfigCheckboxes.innerHTML = urlConfigHtml;
- addEvent( urlConfigCheckboxes, "change", function( event ) {
- var params = {};
- params[ event.target.name ] = event.target.checked ? true : undefined;
+ urlConfigCheckboxesContainer = document.createElement("span");
+ urlConfigCheckboxesContainer.innerHTML = urlConfigHtml;
+ urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input");
+ // For oldIE support:
+ // * Add handlers to the individual elements instead of the container
+ // * Use "click" instead of "change"
+ // * Fallback from event.target to event.srcElement
+ addEvents( urlConfigCheckboxes, "click", function( event ) {
+ var params = {},
+ target = event.target || event.srcElement;
+ params[ target.name ] = target.checked ? true : undefined;
window.location = QUnit.url( params );
});
- toolbar.appendChild( urlConfigCheckboxes );
+ toolbar.appendChild( urlConfigCheckboxesContainer );
if (numModules > 1) {
moduleFilter = document.createElement( 'span' );
moduleFilter.setAttribute( 'id', 'qunit-modulefilter-container' );
moduleFilter.innerHTML = moduleFilterHtml;
- addEvent( moduleFilter, "change", function() {
+ addEvent( moduleFilter.lastChild, "change", function() {
var selectBox = moduleFilter.getElementsByTagName("select")[0],
- selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
+ selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
window.location = QUnit.url( { module: ( selectedModule === "" ) ? undefined : selectedModule } );
});
@@ -1106,7 +1239,7 @@ function done() {
" milliseconds.<br/>",
"<span class='passed'>",
passed,
- "</span> tests of <span class='total'>",
+ "</span> assertions of <span class='total'>",
config.stats.all,
"</span> passed, <span class='failed'>",
config.stats.bad,
@@ -1199,7 +1332,7 @@ function validTest( test ) {
function extractStacktrace( e, offset ) {
offset = offset === undefined ? 3 : offset;
- var stack, include, i, regex;
+ var stack, include, i;
if ( e.stacktrace ) {
// Opera
@@ -1213,7 +1346,7 @@ function extractStacktrace( e, offset ) {
if ( fileName ) {
include = [];
for ( i = offset; i < stack.length; i++ ) {
- if ( stack[ i ].indexOf( fileName ) != -1 ) {
+ if ( stack[ i ].indexOf( fileName ) !== -1 ) {
break;
}
include.push( stack[ i ] );
@@ -1242,17 +1375,27 @@ function sourceFromStacktrace( offset ) {
}
}
-function escapeInnerText( s ) {
+/**
+ * Escape text for attribute or text content.
+ */
+function escapeText( s ) {
if ( !s ) {
return "";
}
s = s + "";
- return s.replace( /[\&<>]/g, function( s ) {
+ // Both single quotes and double quotes (for attributes)
+ return s.replace( /['"<>&]/g, function( s ) {
switch( s ) {
- case "&": return "&amp;";
- case "<": return "&lt;";
- case ">": return "&gt;";
- default: return s;
+ case '\'':
+ return '&#039;';
+ case '"':
+ return '&quot;';
+ case '<':
+ return '&lt;';
+ case '>':
+ return '&gt;';
+ case '&':
+ return '&amp;';
}
});
}
@@ -1300,7 +1443,7 @@ function saveGlobal() {
}
}
-function checkPollution( name ) {
+function checkPollution() {
var newGlobals,
deletedGlobals,
old = config.pollution;
@@ -1349,16 +1492,53 @@ function extend( a, b ) {
return a;
}
+/**
+ * @param {HTMLElement} elem
+ * @param {string} type
+ * @param {Function} fn
+ */
function addEvent( elem, type, fn ) {
+ // Standards-based browsers
if ( elem.addEventListener ) {
elem.addEventListener( type, fn, false );
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, fn );
+ // IE
} else {
- fn();
+ elem.attachEvent( "on" + type, fn );
}
}
+/**
+ * @param {Array|NodeList} elems
+ * @param {string} type
+ * @param {Function} fn
+ */
+function addEvents( elems, type, fn ) {
+ var i = elems.length;
+ while ( i-- ) {
+ addEvent( elems[i], type, fn );
+ }
+}
+
+function hasClass( elem, name ) {
+ return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
+}
+
+function addClass( elem, name ) {
+ if ( !hasClass( elem, name ) ) {
+ elem.className += (elem.className ? " " : "") + name;
+ }
+}
+
+function removeClass( elem, name ) {
+ var set = " " + elem.className + " ";
+ // Class name may appear multiple times
+ while ( set.indexOf(" " + name + " ") > -1 ) {
+ set = set.replace(" " + name + " " , " ");
+ }
+ // If possible, trim it for prettiness, but not neccecarily
+ elem.className = window.jQuery ? jQuery.trim( set ) : ( set.trim ? set.trim() : set );
+}
+
function id( name ) {
return !!( typeof document !== "undefined" && document && document.getElementById ) &&
document.getElementById( name );
@@ -1372,7 +1552,6 @@ function registerLoggingCallback( key ) {
// Supports deprecated method of completely overwriting logging callbacks
function runLoggingCallbacks( key, scope, args ) {
- //debugger;
var i, callbacks;
if ( QUnit.hasOwnProperty( key ) ) {
QUnit[ key ].call(scope, args );
@@ -1414,6 +1593,7 @@ QUnit.equiv = (function() {
// for string, boolean, number and null
function useStrictEquality( b, a ) {
+ /*jshint eqeqeq:false */
if ( b instanceof a.constructor || a instanceof b.constructor ) {
// to catch short annotaion VS 'new' annotation of a
// declaration
@@ -1610,7 +1790,8 @@ QUnit.jsDump = (function() {
var reName = /^function (\w+)/,
jsDump = {
- parse: function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance
+ // type is used mostly internally, you can fix a (custom)type in advance
+ parse: function( obj, type, stack ) {
stack = stack || [ ];
var inStack, res,
parser = this.parsers[ type || this.typeOf(obj) ];
@@ -1618,18 +1799,16 @@ QUnit.jsDump = (function() {
type = typeof parser;
inStack = inArray( obj, stack );
- if ( inStack != -1 ) {
+ if ( inStack !== -1 ) {
return "recursion(" + (inStack - stack.length) + ")";
}
- //else
- if ( type == "function" ) {
+ if ( type === "function" ) {
stack.push( obj );
res = parser.call( this, obj, stack );
stack.pop();
return res;
}
- // else
- return ( type == "string" ) ? parser : this.parsers.error;
+ return ( type === "string" ) ? parser : this.parsers.error;
},
typeOf: function( obj ) {
var type;
@@ -1656,6 +1835,8 @@ QUnit.jsDump = (function() {
( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
) {
type = "array";
+ } else if ( obj.constructor === Error.prototype.constructor ) {
+ type = "error";
} else {
type = typeof obj;
}
@@ -1664,7 +1845,8 @@ QUnit.jsDump = (function() {
separator: function() {
return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&nbsp;" : " ";
},
- indent: function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing
+ // extra can be a number, shortcut for increasing-calling-decreasing
+ indent: function( extra ) {
if ( !this.multiline ) {
return "";
}
@@ -1693,13 +1875,16 @@ QUnit.jsDump = (function() {
parsers: {
window: "[Window]",
document: "[Document]",
- error: "[ERROR]", //when no parser is found, shouldn"t happen
+ error: function(error) {
+ return "Error(\"" + error.message + "\")";
+ },
unknown: "[Unknown]",
"null": "null",
"undefined": "undefined",
"function": function( fn ) {
var ret = "function",
- name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];//functions never have name in IE
+ // functions never have name in IE
+ name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
if ( name ) {
ret += " " + name;
@@ -1715,13 +1900,9 @@ QUnit.jsDump = (function() {
object: function( map, stack ) {
var ret = [ ], keys, key, val, i;
QUnit.jsDump.up();
- if ( Object.keys ) {
- keys = Object.keys( map );
- } else {
- keys = [];
- for ( key in map ) {
- keys.push( key );
- }
+ keys = [];
+ for ( key in map ) {
+ keys.push( key );
}
keys.sort();
for ( i = 0; i < keys.length; i++ ) {
@@ -1733,21 +1914,34 @@ QUnit.jsDump = (function() {
return join( "{", ret, "}" );
},
node: function( node ) {
- var a, val,
+ var len, i, val,
open = QUnit.jsDump.HTML ? "&lt;" : "<",
close = QUnit.jsDump.HTML ? "&gt;" : ">",
tag = node.nodeName.toLowerCase(),
- ret = open + tag;
-
- for ( a in QUnit.jsDump.DOMAttrs ) {
- val = node[ QUnit.jsDump.DOMAttrs[a] ];
- if ( val ) {
- ret += " " + a + "=" + QUnit.jsDump.parse( val, "attribute" );
+ ret = open + tag,
+ attrs = node.attributes;
+
+ if ( attrs ) {
+ for ( i = 0, len = attrs.length; i < len; i++ ) {
+ val = attrs[i].nodeValue;
+ // IE6 includes all attributes in .attributes, even ones not explicitly set.
+ // Those have values like undefined, null, 0, false, "" or "inherit".
+ if ( val && val !== "inherit" ) {
+ ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
+ }
}
}
- return ret + close + open + "/" + tag + close;
+ ret += close;
+
+ // Show content of TextNode or CDATASection
+ if ( node.nodeType === 3 || node.nodeType === 4 ) {
+ ret += node.nodeValue;
+ }
+
+ return ret + open + "/" + tag + close;
},
- functionArgs: function( fn ) {//function calls it internally, it's the arguments part of the function
+ // function calls it internally, it's the arguments part of the function
+ functionArgs: function( fn ) {
var args,
l = fn.length;
@@ -1757,54 +1951,34 @@ QUnit.jsDump = (function() {
args = new Array(l);
while ( l-- ) {
- args[l] = String.fromCharCode(97+l);//97 is 'a'
+ // 97 is 'a'
+ args[l] = String.fromCharCode(97+l);
}
return " " + args.join( ", " ) + " ";
},
- key: quote, //object calls it internally, the key part of an item in a map
- functionCode: "[code]", //function calls it internally, it's the content of the function
- attribute: quote, //node calls it internally, it's an html attribute value
+ // object calls it internally, the key part of an item in a map
+ key: quote,
+ // function calls it internally, it's the content of the function
+ functionCode: "[code]",
+ // node calls it internally, it's an html attribute value
+ attribute: quote,
string: quote,
date: quote,
- regexp: literal, //regex
+ regexp: literal,
number: literal,
"boolean": literal
},
- DOMAttrs: {
- //attributes to dump from nodes, name=>realName
- id: "id",
- name: "name",
- "class": "className"
- },
- HTML: false,//if true, entities are escaped ( <, >, \t, space and \n )
- indentChar: " ",//indentation unit
- multiline: true //if true, items in a collection, are separated by a \n, else just a space.
+ // if true, entities are escaped ( <, >, \t, space and \n )
+ HTML: false,
+ // indentation unit
+ indentChar: " ",
+ // if true, items in a collection, are separated by a \n, else just a space.
+ multiline: true
};
return jsDump;
}());
-// from Sizzle.js
-function getText( elems ) {
- var i, elem,
- ret = "";
-
- for ( i = 0; elems[i]; i++ ) {
- elem = elems[i];
-
- // Get the text from text nodes and CDATA nodes
- if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
- ret += elem.nodeValue;
-
- // Traverse everything else, except comment nodes
- } else if ( elem.nodeType !== 8 ) {
- ret += getText( elem.childNodes );
- }
- }
-
- return ret;
-}
-
// from jquery.js
function inArray( elem, array ) {
if ( array.indexOf ) {
@@ -1835,13 +2009,14 @@ function inArray( elem, array ) {
* QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
*/
QUnit.diff = (function() {
+ /*jshint eqeqeq:false, eqnull:true */
function diff( o, n ) {
var i,
ns = {},
os = {};
for ( i = 0; i < n.length; i++ ) {
- if ( ns[ n[i] ] == null ) {
+ if ( !hasOwn.call( ns, n[i] ) ) {
ns[ n[i] ] = {
rows: [],
o: null
@@ -1851,7 +2026,7 @@ QUnit.diff = (function() {
}
for ( i = 0; i < o.length; i++ ) {
- if ( os[ o[i] ] == null ) {
+ if ( !hasOwn.call( os, o[i] ) ) {
os[ o[i] ] = {
rows: [],
n: null
@@ -1864,7 +2039,7 @@ QUnit.diff = (function() {
if ( !hasOwn.call( ns, i ) ) {
continue;
}
- if ( ns[i].rows.length == 1 && typeof os[i] != "undefined" && os[i].rows.length == 1 ) {
+ if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
n[ ns[i].rows[0] ] = {
text: n[ ns[i].rows[0] ],
row: os[i].rows[0]
@@ -1970,7 +2145,7 @@ QUnit.diff = (function() {
// for CommonJS enviroments, export everything
if ( typeof exports !== "undefined" ) {
- extend(exports, QUnit);
+ extend( exports, QUnit );
}
// get at whatever the global object is, like window in browsers
diff --git a/resources/jquery/jquery.spinner.js b/resources/jquery/jquery.spinner.js
index 4a6ec3b4..93e30b9a 100644
--- a/resources/jquery/jquery.spinner.js
+++ b/resources/jquery/jquery.spinner.js
@@ -86,7 +86,7 @@
* Injects a spinner after the elements in the jQuery collection
* (as siblings, not children). Collection contents remain unchanged.
*
- * @param {Object} opts See createSpinner() for description.
+ * @param {Object|String} opts See createSpinner() for description.
* @return {jQuery}
*/
$.fn.injectSpinner = function ( opts ) {
diff --git a/resources/jquery/jquery.suggestions.js b/resources/jquery/jquery.suggestions.js
index d80680fc..44382f0d 100644
--- a/resources/jquery/jquery.suggestions.js
+++ b/resources/jquery/jquery.suggestions.js
@@ -13,11 +13,11 @@
*
* Options:
*
- * fetch(query): Callback that should fetch suggestions and set the suggestions property. Executed in the context of the
- * textbox
+ * fetch(query): Callback that should fetch suggestions and set the suggestions property.
+ * Executed in the context of the textbox
* Type: Function
- * cancel: Callback function to call when any pending asynchronous suggestions fetches should be canceled.
- * Executed in the context of the textbox
+ * cancel: Callback function to call when any pending asynchronous suggestions fetches
+ * should be canceled. Executed in the context of the textbox
* Type: Function
* special: Set of callbacks for rendering and selecting
* Type: Object of Functions 'render' and 'select'
@@ -33,12 +33,12 @@
* Type: Number, Range: 0 - 1200, Default: 120
* submitOnClick: Whether to submit the form containing the textbox when a suggestion is clicked
* Type: Boolean, Default: false
- * maxExpandFactor: Maximum suggestions box width relative to the textbox width. If set to e.g. 2, the suggestions box
- * will never be grown beyond 2 times the width of the textbox.
+ * maxExpandFactor: Maximum suggestions box width relative to the textbox width. If set
+ * to e.g. 2, the suggestions box will never be grown beyond 2 times the width of the textbox.
* Type: Number, Range: 1 - infinity, Default: 3
* expandFrom: Which direction to offset the suggestion box from.
- * Values 'start' and 'end' translate to left and right respectively depending on the directionality
- * of the current document, according to $( 'html' ).css( 'direction' ).
+ * Values 'start' and 'end' translate to left and right respectively depending on the
+ * directionality of the current document, according to $( 'html' ).css( 'direction' ).
* Type: String, default: 'auto', options: 'left', 'right', 'start', 'end', 'auto'.
* positionFromLeft: Sets expandFrom=left, for backwards compatibility
* Type: Boolean, Default: true
@@ -49,8 +49,8 @@
$.suggestions = {
/**
- * Cancel any delayed updateSuggestions() call and inform the user so
- * they can cancel their result fetching if they use AJAX or something
+ * Cancel any delayed maybeFetch() call and callback the context so
+ * they can cancel any async fetching if they use AJAX or something.
*/
cancel: function ( context ) {
if ( context.data.timerID !== null ) {
@@ -60,28 +60,35 @@ $.suggestions = {
context.config.cancel.call( context.data.$textbox );
}
},
+
/**
- * Restore the text the user originally typed in the textbox, before it was overwritten by highlight(). This
- * restores the value the currently displayed suggestions are based on, rather than the value just before
+ * Restore the text the user originally typed in the textbox, before it
+ * was overwritten by highlight(). This restores the value the currently
+ * displayed suggestions are based on, rather than the value just before
* highlight() overwrote it; the former is arguably slightly more sensible.
*/
restore: function ( context ) {
context.data.$textbox.val( context.data.prevText );
},
+
/**
- * Ask the user-specified callback for new suggestions. Any previous delayed call to this function still pending
- * will be canceled. If the value in the textbox is empty or hasn't changed since the last time suggestions were fetched, this
- * function does nothing.
+ * Ask the user-specified callback for new suggestions. Any previous delayed
+ * call to this function still pending will be canceled. If the value in the
+ * textbox is empty or hasn't changed since the last time suggestions were fetched,
+ * this function does nothing.
* @param {Boolean} delayed Whether or not to delay this by the currently configured amount of time
*/
update: function ( context, delayed ) {
- // Only fetch if the value in the textbox changed and is not empty
+ // Only fetch if the value in the textbox changed and is not empty, or if the results were hidden
// if the textbox is empty then clear the result div, but leave other settings intouched
function maybeFetch() {
if ( context.data.$textbox.val().length === 0 ) {
context.data.$container.hide();
context.data.prevText = '';
- } else if ( context.data.$textbox.val() !== context.data.prevText ) {
+ } else if (
+ context.data.$textbox.val() !== context.data.prevText ||
+ !context.data.$container.is( ':visible' )
+ ) {
if ( typeof context.config.fetch === 'function' ) {
context.data.prevText = context.data.$textbox.val();
context.config.fetch.call( context.data.$textbox, context.data.$textbox.val() );
@@ -89,18 +96,19 @@ $.suggestions = {
}
}
- // Cancel previous call
- if ( context.data.timerID !== null ) {
- clearTimeout( context.data.timerID );
- }
+ // Cancels any delayed maybeFetch call, and invokes context.config.cancel.
+ $.suggestions.cancel( context );
+
if ( delayed ) {
- // Start a new asynchronous call
+ // To avoid many started/aborted requests while typing, we're gonna take a short
+ // break before trying to fetch data.
context.data.timerID = setTimeout( maybeFetch, context.config.delay );
} else {
maybeFetch();
}
$.suggestions.special( context );
},
+
special: function ( context ) {
// Allow custom rendering - but otherwise don't do any rendering
if ( typeof context.config.special.render === 'function' ) {
@@ -108,17 +116,21 @@ $.suggestions = {
setTimeout( function () {
// Render special
var $special = context.data.$container.find( '.suggestions-special' );
- context.config.special.render.call( $special, context.data.$textbox.val() );
+ context.config.special.render.call( $special, context.data.$textbox.val(), context );
}, 1 );
}
},
+
/**
* Sets the value of a property, and updates the widget accordingly
* @param property String Name of property
* @param value Mixed Value to set property with
*/
configure: function ( context, property, value ) {
- var newCSS;
+ var newCSS,
+ $autoEllipseMe, $result, $results, childrenWidth,
+ i, expWidth, matchedText, maxWidth, text;
+
// Validate creation using fallback values
switch( property ) {
case 'fetch':
@@ -212,55 +224,62 @@ $.suggestions = {
}
context.data.$container.css( newCSS );
- var $results = context.data.$container.children( '.suggestions-results' );
+ $results = context.data.$container.children( '.suggestions-results' );
$results.empty();
- var expWidth = -1;
- var $autoEllipseMe = $( [] );
- var matchedText = null;
- for ( var i = 0; i < context.config.suggestions.length; i++ ) {
+ expWidth = -1;
+ $autoEllipseMe = $( [] );
+ matchedText = null;
+ for ( i = 0; i < context.config.suggestions.length; i++ ) {
/*jshint loopfunc:true */
- var text = context.config.suggestions[i];
- var $result = $( '<div>' )
+ text = context.config.suggestions[i];
+ $result = $( '<div>' )
.addClass( 'suggestions-result' )
.attr( 'rel', i )
.data( 'text', context.config.suggestions[i] )
- .mousemove( function ( e ) {
+ .mousemove( function () {
context.data.selectedWithMouse = true;
$.suggestions.highlight(
- context, $(this).closest( '.suggestions-results div' ), false
+ context,
+ $(this).closest( '.suggestions-results .suggestions-result' ),
+ false
);
} )
.appendTo( $results );
// Allow custom rendering
if ( typeof context.config.result.render === 'function' ) {
- context.config.result.render.call( $result, context.config.suggestions[i] );
+ context.config.result.render.call( $result, context.config.suggestions[i], context );
} else {
// Add <span> with text
- if( context.config.highlightInput ) {
- matchedText = context.data.prevText;
- }
$result.append( $( '<span>' )
.css( 'whiteSpace', 'nowrap' )
.text( text )
);
+ }
- // Widen results box if needed
- // New width is only calculated here, applied later
- var $span = $result.children( 'span' );
- if ( $span.outerWidth() > $result.width() && $span.outerWidth() > expWidth ) {
- // factor in any padding, margin, or border space on the parent
- expWidth = $span.outerWidth() + ( context.data.$container.width() - $span.parent().width());
- }
- $autoEllipseMe = $autoEllipseMe.add( $result );
+ if ( context.config.highlightInput ) {
+ matchedText = context.data.prevText;
}
+
+ // Widen results box if needed
+ // New width is only calculated here, applied later
+ childrenWidth = $result.children().outerWidth();
+ if ( childrenWidth > $result.width() && childrenWidth > expWidth ) {
+ // factor in any padding, margin, or border space on the parent
+ expWidth = childrenWidth + ( context.data.$container.width() - $result.width() );
+ }
+ $autoEllipseMe = $autoEllipseMe.add( $result );
}
// Apply new width for results box, if any
if ( expWidth > context.data.$container.width() ) {
- var maxWidth = context.config.maxExpandFactor*context.data.$textbox.width();
+ maxWidth = context.config.maxExpandFactor*context.data.$textbox.width();
context.data.$container.width( Math.min( expWidth, maxWidth ) );
}
// autoEllipse the results. Has to be done after changing the width
- $autoEllipseMe.autoEllipsis( { hasSpan: true, tooltip: true, matchText: matchedText } );
+ $autoEllipseMe.autoEllipsis( {
+ hasSpan: true,
+ tooltip: true,
+ matchText: matchedText
+ } );
}
}
break;
@@ -280,6 +299,7 @@ $.suggestions = {
break;
}
},
+
/**
* Highlight a result in the results table
* @param result <tr> to highlight: jQuery object, or 'prev' or 'next'
@@ -289,30 +309,40 @@ $.suggestions = {
var selected = context.data.$container.find( '.suggestions-result-current' );
if ( !result.get || selected.get( 0 ) !== result.get( 0 ) ) {
if ( result === 'prev' ) {
- if( selected.is( '.suggestions-special' ) ) {
+ if( selected.hasClass( 'suggestions-special' ) ) {
result = context.data.$container.find( '.suggestions-result:last' );
} else {
result = selected.prev();
+ if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
+ // there is something in the DOM between selected element and the wrapper, bypass it
+ result = selected.parents( '.suggestions-results > *' ).prev().find( '.suggestions-result' ).eq(0);
+ }
+
if ( selected.length === 0 ) {
// we are at the beginning, so lets jump to the last item
if ( context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
result = context.data.$container.find( '.suggestions-special' );
} else {
- result = context.data.$container.find( '.suggestions-results div:last' );
+ result = context.data.$container.find( '.suggestions-results .suggestions-result:last' );
}
}
}
} else if ( result === 'next' ) {
if ( selected.length === 0 ) {
// No item selected, go to the first one
- result = context.data.$container.find( '.suggestions-results div:first' );
+ result = context.data.$container.find( '.suggestions-results .suggestions-result:first' );
if ( result.length === 0 && context.data.$container.find( '.suggestions-special' ).html() !== '' ) {
// No suggestion exists, go to the special one directly
result = context.data.$container.find( '.suggestions-special' );
}
} else {
result = selected.next();
- if ( selected.is( '.suggestions-special' ) ) {
+ if ( !( result.length && result.hasClass( 'suggestions-result' ) ) ) {
+ // there is something in the DOM between selected element and the wrapper, bypass it
+ result = selected.parents( '.suggestions-results > *' ).next().find( '.suggestions-result' ).eq(0);
+ }
+
+ if ( selected.hasClass( 'suggestions-special' ) ) {
result = $( [] );
} else if (
result.length === 0 &&
@@ -338,13 +368,16 @@ $.suggestions = {
context.data.$textbox.trigger( 'change' );
}
},
+
/**
* Respond to keypress event
* @param key Integer Code of key pressed
*/
keypress: function ( e, context, key ) {
- var wasVisible = context.data.$container.is( ':visible' ),
+ var selected,
+ wasVisible = context.data.$container.is( ':visible' ),
preventDefault = false;
+
switch ( key ) {
// Arrow down
case 40:
@@ -376,7 +409,7 @@ $.suggestions = {
case 13:
context.data.$container.hide();
preventDefault = wasVisible;
- var selected = context.data.$container.find( '.suggestions-result-current' );
+ selected = context.data.$container.find( '.suggestions-result-current' );
if ( selected.length === 0 || context.data.selectedWithMouse ) {
// if nothing is selected OR if something was selected with the mouse,
// cancel any current requests and submit the form
@@ -420,18 +453,18 @@ $.fn.suggestions = function () {
if ( context === undefined || context === null ) {
context = {
config: {
- 'fetch' : function () {},
- 'cancel': function () {},
- 'special': {},
- 'result': {},
- '$region': $(this),
- 'suggestions': [],
- 'maxRows': 7,
- 'delay': 120,
- 'submitOnClick': false,
- 'maxExpandFactor': 3,
- 'expandFrom': 'auto',
- 'highlightInput': false
+ fetch: function () {},
+ cancel: function () {},
+ special: {},
+ result: {},
+ $region: $(this),
+ suggestions: [],
+ maxRows: 7,
+ delay: 120,
+ submitOnClick: false,
+ maxExpandFactor: 3,
+ expandFrom: 'auto',
+ highlightInput: false
}
};
}
@@ -480,44 +513,56 @@ $.fn.suggestions = function () {
.addClass( 'suggestions' )
.append(
$( '<div>' ).addClass( 'suggestions-results' )
- // Can't use click() because the container div is hidden when the textbox loses focus. Instead,
- // listen for a mousedown followed by a mouseup on the same div
+ // Can't use click() because the container div is hidden when the
+ // textbox loses focus. Instead, listen for a mousedown followed
+ // by a mouseup on the same div.
.mousedown( function ( e ) {
- context.data.mouseDownOn = $( e.target ).closest( '.suggestions-results div' );
+ context.data.mouseDownOn = $( e.target ).closest( '.suggestions-results .suggestions-result' );
} )
.mouseup( function ( e ) {
- var $result = $( e.target ).closest( '.suggestions-results div' );
- var $other = context.data.mouseDownOn;
+ var $result = $( e.target ).closest( '.suggestions-results .suggestions-result' ),
+ $other = context.data.mouseDownOn;
+
context.data.mouseDownOn = $( [] );
if ( $result.get( 0 ) !== $other.get( 0 ) ) {
return;
}
- $.suggestions.highlight( context, $result, true );
- context.data.$container.hide();
- if ( typeof context.config.result.select === 'function' ) {
- context.config.result.select.call( $result, context.data.$textbox );
+ // do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click)
+ if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
+ $.suggestions.highlight( context, $result, true );
+ context.data.$container.hide();
+ if ( typeof context.config.result.select === 'function' ) {
+ context.config.result.select.call( $result, context.data.$textbox );
+ }
}
+ // but still restore focus to the textbox, so that the suggestions will be hidden properly
context.data.$textbox.focus();
} )
)
.append(
$( '<div>' ).addClass( 'suggestions-special' )
- // Can't use click() because the container div is hidden when the textbox loses focus. Instead,
- // listen for a mousedown followed by a mouseup on the same div
+ // Can't use click() because the container div is hidden when the
+ // textbox loses focus. Instead, listen for a mousedown followed
+ // by a mouseup on the same div.
.mousedown( function ( e ) {
context.data.mouseDownOn = $( e.target ).closest( '.suggestions-special' );
} )
.mouseup( function ( e ) {
- var $special = $( e.target ).closest( '.suggestions-special' );
- var $other = context.data.mouseDownOn;
+ var $special = $( e.target ).closest( '.suggestions-special' ),
+ $other = context.data.mouseDownOn;
+
context.data.mouseDownOn = $( [] );
if ( $special.get( 0 ) !== $other.get( 0 ) ) {
return;
}
- context.data.$container.hide();
- if ( typeof context.config.special.select === 'function' ) {
- context.config.special.select.call( $special, context.data.$textbox );
+ // do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click)
+ if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
+ context.data.$container.hide();
+ if ( typeof context.config.special.select === 'function' ) {
+ context.config.special.select.call( $special, context.data.$textbox );
+ }
}
+ // but still restore focus to the textbox, so that the suggestions will be hidden properly
context.data.$textbox.focus();
} )
.mousemove( function ( e ) {
diff --git a/resources/jquery/jquery.tablesorter.js b/resources/jquery/jquery.tablesorter.js
index 3ef71d57..e08c9aaf 100644
--- a/resources/jquery/jquery.tablesorter.js
+++ b/resources/jquery/jquery.tablesorter.js
@@ -19,6 +19,9 @@
* @example $( 'table' ).tablesorter();
* @desc Create a simple tablesorter interface.
*
+ * @example $( 'table' ).tablesorter( { sortList: [ { 0: 'desc' }, { 1: 'asc' } ] } );
+ * @desc Create a tablesorter interface initially sorting on the first and second column.
+ *
* @option String cssHeader ( optional ) A string of the class name to be appended
* to sortable tr elements in the thead of the table. Default value:
* "header"
@@ -44,9 +47,16 @@
* tablesorter should cancel selection of the table headers text.
* Default value: true
*
+ * @option Array sortList ( optional ) An array containing objects specifying sorting.
+ * By passing more than one object, multi-sorting will be applied. Object structure:
+ * { <Integer column index>: <String 'asc' or 'desc'> }
+ * Default value: []
+ *
* @option Boolean debug ( optional ) Boolean flag indicating if tablesorter
* should display debuging information usefull for development.
*
+ * @event sortEnd.tablesorter: Triggered as soon as any sorting has been applied.
+ *
* @type jQuery
*
* @name tablesorter
@@ -57,6 +67,7 @@
*/
( function ( $, mw ) {
+ /*jshint onevar:false */
/* Local scope */
@@ -75,7 +86,7 @@
return false;
}
- function getElementText( node ) {
+ function getElementSortKey( node ) {
var $node = $( node ),
// Use data-sort-value attribute.
// Use data() instead of attr() so that live value changes
@@ -87,15 +98,20 @@
// like charAt, toLowerCase and split are expected.
return String( data );
} else {
- return $node.text();
- }
- }
-
- function getTextFromRowAndCellIndex( rows, rowIndex, cellIndex ) {
- if ( rows[rowIndex] && rows[rowIndex].cells[cellIndex] ) {
- return $.trim( getElementText( rows[rowIndex].cells[cellIndex] ) );
- } else {
- return '';
+ if ( !node ) {
+ return $node.text();
+ } else if ( node.tagName.toLowerCase() === 'img' ) {
+ return $node.attr( 'alt' ) || ''; // handle undefined alt
+ } else {
+ return $.map( $.makeArray( node.childNodes ), function( elem ) {
+ // 1 is for document.ELEMENT_NODE (the constant is undefined on old browsers)
+ if ( elem.nodeType === 1 ) {
+ return getElementSortKey( elem );
+ } else {
+ return $.text( elem );
+ }
+ } ).join( '' );
+ }
}
}
@@ -108,8 +124,13 @@
concurrent = 0,
needed = ( rows.length > 4 ) ? 5 : rows.length;
- while( i < l ) {
- nodeValue = getTextFromRowAndCellIndex( rows, rowIndex, cellIndex );
+ while ( i < l ) {
+ if ( rows[rowIndex] && rows[rowIndex].cells[cellIndex] ) {
+ nodeValue = $.trim( getElementSortKey( rows[rowIndex].cells[cellIndex] ) );
+ } else {
+ nodeValue = '';
+ }
+
if ( nodeValue !== '') {
if ( parsers[i].is( nodeValue, table ) ) {
concurrent++;
@@ -151,7 +172,7 @@
for ( i = 0; i < len; i++ ) {
parser = false;
- sortType = $headers.eq( i ).data( 'sort-type' );
+ sortType = $headers.eq( i ).data( 'sortType' );
if ( sortType !== undefined ) {
parser = getParserById( sortType );
}
@@ -194,7 +215,7 @@
cache.row.push( $row );
for ( var j = 0; j < totalCells; ++j ) {
- cols.push( parsers[j].format( getElementText( $row[0].cells[j] ), table, $row[0].cells[j] ) );
+ cols.push( parsers[j].format( getElementSortKey( $row[0].cells[j] ), table, $row[0].cells[j] ) );
}
cols.push( cache.normalized.length ); // add position for rowCache
@@ -223,6 +244,8 @@
}
table.tBodies[0].appendChild( fragment );
+
+ $( table ).trigger( 'sortEnd.tablesorter' );
}
/**
@@ -291,7 +314,7 @@
}
if ( !this.sortDisabled ) {
- var $th = $( this ).addClass( table.config.cssHeader ).attr( 'title', msg[1] );
+ $( this ).addClass( table.config.cssHeader ).attr( 'title', msg[1] );
}
// add cell to headerList
@@ -312,20 +335,14 @@
return false;
}
- function setHeadersCss( table, $headers, list, css, msg ) {
- // Remove all header information
- $headers.removeClass( css[0] ).removeClass( css[1] );
-
- var h = [];
- $headers.each( function ( offset ) {
- if ( !this.sortDisabled ) {
- h[this.column] = $( this );
- }
- } );
+ function setHeadersCss( table, $headers, list, css, msg, columnToHeader ) {
+ // Remove all header information and reset titles to default message
+ $headers.removeClass( css[0] ).removeClass( css[1] ).attr( 'title', msg[1] );
- var l = list.length;
- for ( var i = 0; i < l; i++ ) {
- h[ list[i][0] ].addClass( css[ list[i][1] ] ).attr( 'title', msg[ list[i][1] ] );
+ for ( var i = 0; i < list.length; i++ ) {
+ $headers.eq( columnToHeader[ list[i][0] ] )
+ .addClass( css[ list[i][1] ] )
+ .attr( 'title', msg[ list[i][1] ] );
}
}
@@ -368,8 +385,8 @@
ts.transformTable = {};
// Unpack the transform table
- var ascii = separatorTransformTable[0].split( "\t" ).concat( digitTransformTable[0].split( "\t" ) );
- var localised = separatorTransformTable[1].split( "\t" ).concat( digitTransformTable[1].split( "\t" ) );
+ var ascii = separatorTransformTable[0].split( '\t' ).concat( digitTransformTable[0].split( '\t' ) );
+ var localised = separatorTransformTable[1].split( '\t' ).concat( digitTransformTable[1].split( '\t' ) );
// Construct regex for number identification
for ( var i = 0; i < ascii.length; i++ ) {
@@ -381,9 +398,9 @@
// We allow a trailing percent sign, which we just strip. This works fine
// if percents and regular numbers aren't being mixed.
- ts.numberRegex = new RegExp("^(" + "[-+\u2212]?[0-9][0-9,]*(\\.[0-9,]*)?(E[-+\u2212]?[0-9][0-9,]*)?" + // Fortran-style scientific
- "|" + "[-+\u2212]?" + digitClass + "+[\\s\\xa0]*%?" + // Generic localised
- ")$", "i");
+ ts.numberRegex = new RegExp('^(' + '[-+\u2212]?[0-9][0-9,]*(\\.[0-9,]*)?(E[-+\u2212]?[0-9][0-9,]*)?' + // Fortran-style scientific
+ '|' + '[-+\u2212]?' + digitClass + '+[\\s\\xa0]*%?' + // Generic localised
+ ')$', 'i');
}
function buildDateTable() {
@@ -414,24 +431,86 @@
}
+ /**
+ * Replace all rowspanned cells in the body with clones in each row, so sorting
+ * need not worry about them.
+ *
+ * @param $table jQuery object for a <table>
+ */
function explodeRowspans( $table ) {
- // Split multi row cells into multiple cells with the same content
- $table.find( '> tbody > tr > [rowspan]' ).each(function () {
- var rowSpan = this.rowSpan;
- this.rowSpan = 1;
- var cell = $( this );
- var next = cell.parent().nextAll();
+ var rowspanCells = $table.find( '> tbody > tr > [rowspan]' ).get();
+
+ // Short circuit
+ if ( !rowspanCells.length ) {
+ return;
+ }
+
+ // First, we need to make a property like cellIndex but taking into
+ // account colspans. We also cache the rowIndex to avoid having to take
+ // cell.parentNode.rowIndex in the sorting function below.
+ $table.find( '> tbody > tr' ).each( function () {
+ var col = 0;
+ var l = this.cells.length;
+ for ( var i = 0; i < l; i++ ) {
+ this.cells[i].realCellIndex = col;
+ this.cells[i].realRowIndex = this.rowIndex;
+ col += this.cells[i].colSpan;
+ }
+ } );
+
+ // Split multi row cells into multiple cells with the same content.
+ // Sort by column then row index to avoid problems with odd table structures.
+ // Re-sort whenever a rowspanned cell's realCellIndex is changed, because it
+ // might change the sort order.
+ function resortCells() {
+ rowspanCells = rowspanCells.sort( function ( a, b ) {
+ var ret = a.realCellIndex - b.realCellIndex;
+ if ( !ret ) {
+ ret = a.realRowIndex - b.realRowIndex;
+ }
+ return ret;
+ } );
+ $.each( rowspanCells, function () {
+ this.needResort = false;
+ } );
+ }
+ resortCells();
+
+ var spanningRealCellIndex, rowSpan, colSpan;
+ function filterfunc() {
+ return this.realCellIndex >= spanningRealCellIndex;
+ }
+
+ function fixTdCellIndex() {
+ this.realCellIndex += colSpan;
+ if ( this.rowSpan > 1 ) {
+ this.needResort = true;
+ }
+ }
+
+ while ( rowspanCells.length ) {
+ if ( rowspanCells[0].needResort ) {
+ resortCells();
+ }
+
+ var cell = rowspanCells.shift();
+ rowSpan = cell.rowSpan;
+ colSpan = cell.colSpan;
+ spanningRealCellIndex = cell.realCellIndex;
+ cell.rowSpan = 1;
+ var $nextRows = $( cell ).parent().nextAll();
for ( var i = 0; i < rowSpan - 1; i++ ) {
- var td = next.eq( i ).children( 'td' );
- if ( !td.length ) {
- next.eq( i ).append( cell.clone() );
- } else if ( this.cellIndex === 0 ) {
- td.eq( this.cellIndex ).before( cell.clone() );
+ var $tds = $( $nextRows[i].cells ).filter( filterfunc );
+ var $clone = $( cell ).clone();
+ $clone[0].realCellIndex = spanningRealCellIndex;
+ if ( $tds.length ) {
+ $tds.each( fixTdCellIndex );
+ $tds.first().before( $clone );
} else {
- td.eq( this.cellIndex - 1 ).after( cell.clone() );
+ $nextRows.eq( i ).append( $clone );
}
}
- });
+ }
}
function buildCollationTable() {
@@ -480,6 +559,25 @@
};
}
+ /**
+ * Converts sort objects [ { Integer: String }, ... ] to the internally used nested array
+ * structure [ [ Integer , Integer ], ... ]
+ *
+ * @param sortObjects {Array} List of sort objects.
+ * @return {Array} List of internal sort definitions.
+ */
+
+ function convertSortList( sortObjects ) {
+ var sortList = [];
+ $.each( sortObjects, function( i, sortObject ) {
+ $.each ( sortObject, function( columnIndex, order ) {
+ var orderIndex = ( order === 'desc' ) ? 1 : 0;
+ sortList.push( [columnIndex, orderIndex] );
+ } );
+ } );
+ return sortList;
+ }
+
/* Public scope */
$.tablesorter = {
@@ -512,9 +610,9 @@
construct: function ( $tables, settings ) {
return $tables.each( function ( i, table ) {
// Declare and cache.
- var $document, $headers, cache, config, sortOrder,
+ var $headers, cache, config,
+ headerToColumns, columnToHeader, colspanOffset,
$table = $( table ),
- shiftDown = 0,
firstTime = true;
// Quit if no tbody
@@ -531,8 +629,9 @@
return;
}
}
- $table.addClass( "jquery-tablesorter" );
+ $table.addClass( 'jquery-tablesorter' );
+ // FIXME config should probably not be stored in the plain table node
// New config object.
table.config = {};
@@ -540,7 +639,7 @@
config = $.extend( table.config, $.tablesorter.defaultOptions, settings );
// Save the settings where they read
- $.data( table, 'tablesorter', config );
+ $.data( table, 'tablesorter', { config: config } );
// Get the CSS class names, could be done else where.
var sortCSS = [ config.cssDesc, config.cssAsc ];
@@ -558,9 +657,47 @@
// performance improvements in some browsers.
cacheRegexs();
+ function setupForFirstSort() {
+ firstTime = false;
+
+ // Legacy fix of .sortbottoms
+ // Wrap them inside inside a tfoot (because that's what they actually want to be) &
+ // and put the <tfoot> at the end of the <table>
+ var $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
+ if ( $sortbottoms.length ) {
+ var $tfoot = $table.children( 'tfoot' );
+ if ( $tfoot.length ) {
+ $tfoot.eq(0).prepend( $sortbottoms );
+ } else {
+ $table.append( $( '<tfoot>' ).append( $sortbottoms ) );
+ }
+ }
+
+ explodeRowspans( $table );
+
+ // try to auto detect column type, and store in tables config
+ table.config.parsers = buildParserCache( table, $headers );
+ }
+
+ // as each header can span over multiple columns (using colspan=N),
+ // we have to bidirectionally map headers to their columns and columns to their headers
+ headerToColumns = [];
+ columnToHeader = [];
+ colspanOffset = 0;
+ $headers.each( function ( headerIndex ) {
+ var columns = [];
+ for ( var i = 0; i < this.colSpan; i++ ) {
+ columnToHeader[ colspanOffset + i ] = headerIndex;
+ columns.push( colspanOffset + i );
+ }
+
+ headerToColumns[ headerIndex ] = columns;
+ colspanOffset += this.colSpan;
+ } );
+
// Apply event handling to headers
// this is too big, perhaps break it out?
- $headers.click( function ( e ) {
+ $headers.filter( ':not(.unsortable)' ).click( function ( e ) {
if ( e.target.nodeName.toLowerCase() === 'a' ) {
// The user clicked on a link inside a table header
// Do nothing and let the default link click action continue
@@ -568,24 +705,7 @@
}
if ( firstTime ) {
- firstTime = false;
-
- // Legacy fix of .sortbottoms
- // Wrap them inside inside a tfoot (because that's what they actually want to be) &
- // and put the <tfoot> at the end of the <table>
- var $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
- if ( $sortbottoms.length ) {
- var $tfoot = $table.children( 'tfoot' );
- if ( $tfoot.length ) {
- $tfoot.eq(0).prepend( $sortbottoms );
- } else {
- $table.append( $( '<tfoot>' ).append( $sortbottoms ) );
- }
- }
-
- explodeRowspans( $table );
- // try to auto detect column type, and store in tables config
- table.config.parsers = buildParserCache( table, $headers );
+ setupForFirstSort();
}
// Build the cache for the tbody cells
@@ -598,46 +718,48 @@
var totalRows = ( $table[0].tBodies[0] && $table[0].tBodies[0].rows.length ) || 0;
if ( !table.sortDisabled && totalRows > 0 ) {
-
- // Cache jQuery object
- var $cell = $( this );
-
- // Get current column index
- var i = this.column;
-
// Get current column sort order
this.order = this.count % 2;
this.count++;
- // User only wants to sort on one column
- if ( !e[config.sortMultiSortKey] ) {
- // Flush the sort list
- config.sortList = [];
- // Add column to sort list
- config.sortList.push( [i, this.order] );
+ var cell = this;
+ // Get current column index
+ var columns = headerToColumns[this.column];
+ var newSortList = $.map( columns, function (c) {
+ // jQuery "helpfully" flattens the arrays...
+ return [[c, cell.order]];
+ });
+ // Index of first column belonging to this header
+ var i = columns[0];
- // Multi column sorting
+ if ( !e[config.sortMultiSortKey] ) {
+ // User only wants to sort on one column set
+ // Flush the sort list and add new columns
+ config.sortList = newSortList;
} else {
- // The user has clicked on an already sorted column.
+ // Multi column sorting
+ // It is not possible for one column to belong to multiple headers,
+ // so this is okay - we don't need to check for every value in the columns array
if ( isValueInArray( i, config.sortList ) ) {
+ // The user has clicked on an already sorted column.
// Reverse the sorting direction for all tables.
for ( var j = 0; j < config.sortList.length; j++ ) {
var s = config.sortList[j],
o = config.headerList[s[0]];
- if ( s[0] === i ) {
+ if ( isValueInArray( s[0], newSortList ) ) {
o.count = s[1];
o.count++;
s[1] = o.count % 2;
}
}
} else {
- // Add column to sort list array
- config.sortList.push( [i, this.order] );
+ // Add columns to sort list array
+ config.sortList = config.sortList.concat( newSortList );
}
}
// Set CSS for headers
- setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg );
+ setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg, columnToHeader );
appendToTable(
$table[0], multisort( $table[0], config.sortList, cache )
);
@@ -655,6 +777,44 @@
return false;
}
} );
+
+ /**
+ * Sorts the table. If no sorting is specified by passing a list of sort
+ * objects, the table is sorted according to the initial sorting order.
+ * Passing an empty array will reset sorting (basically just reset the headers
+ * making the table appear unsorted).
+ *
+ * @param sortList {Array} (optional) List of sort objects.
+ */
+ $table.data( 'tablesorter' ).sort = function( sortList ) {
+
+ if ( firstTime ) {
+ setupForFirstSort();
+ }
+
+ if ( sortList === undefined ) {
+ sortList = config.sortList;
+ } else if ( sortList.length > 0 ) {
+ sortList = convertSortList( sortList );
+ }
+
+ // re-build the cache for the tbody cells
+ cache = buildCache( table );
+
+ // set css for headers
+ setHeadersCss( table, $headers, sortList, sortCSS, sortMsg, columnToHeader );
+
+ // sort the table and append it to the dom
+ appendToTable( table, multisort( table, sortList, cache ) );
+ };
+
+ // sort initially
+ if ( config.sortList.length > 0 ) {
+ setupForFirstSort();
+ config.sortList = convertSortList( config.sortList );
+ $table.data( 'tablesorter' ).sort();
+ }
+
} );
},
@@ -672,10 +832,10 @@
},
formatDigit: function ( s ) {
+ var out, c, p, i;
if ( ts.transformTable !== false ) {
- var out = '',
- c;
- for ( var p = 0; p < s.length; p++ ) {
+ out = '';
+ for ( p = 0; p < s.length; p++ ) {
c = s.charAt(p);
if ( c in ts.transformTable ) {
out += ts.transformTable[c];
@@ -685,31 +845,22 @@
}
s = out;
}
- var i = parseFloat( s.replace( /[, ]/g, '' ).replace( "\u2212", '-' ) );
- return ( isNaN(i)) ? 0 : i;
+ i = parseFloat( s.replace( /[, ]/g, '' ).replace( '\u2212', '-' ) );
+ return isNaN( i ) ? 0 : i;
},
formatFloat: function ( s ) {
var i = parseFloat(s);
- return ( isNaN(i)) ? 0 : i;
+ return isNaN( i ) ? 0 : i;
},
formatInt: function ( s ) {
var i = parseInt( s, 10 );
- return ( isNaN(i)) ? 0 : i;
+ return isNaN( i ) ? 0 : i;
},
clearTableBody: function ( table ) {
- if ( $.browser.msie ) {
- var empty = function ( el ) {
- while ( el.firstChild ) {
- el.removeChild( el.firstChild );
- }
- };
- empty( table.tBodies[0] );
- } else {
- table.tBodies[0].innerHTML = '';
- }
+ $( table.tBodies[0] ).empty();
}
};
@@ -724,7 +875,7 @@
// Add default parsers
ts.addParser( {
id: 'text',
- is: function ( s ) {
+ is: function () {
return true;
},
format: function ( s ) {
@@ -815,7 +966,7 @@
is: function ( s ) {
return ( ts.dateRegex[0].test(s) || ts.dateRegex[1].test(s) || ts.dateRegex[2].test(s ));
},
- format: function ( s, table ) {
+ format: function ( s ) {
var match;
s = $.trim( s.toLowerCase() );
@@ -824,6 +975,10 @@
s = [ match[3], match[1], match[2] ];
} else if ( mw.config.get( 'wgDefaultDateFormat' ) === 'dmy' ) {
s = [ match[3], match[2], match[1] ];
+ } else {
+ // If we get here, we don't know which order the dd-dd-dddd
+ // date is in. So return something not entirely invalid.
+ return '99999999';
}
} else if ( ( match = s.match( ts.dateRegex[1] ) ) !== null ) {
s = [ match[3], '' + ts.monthNames[match[2]], match[1] ];
@@ -872,7 +1027,7 @@
ts.addParser( {
id: 'number',
- is: function ( s, table ) {
+ is: function ( s ) {
return $.tablesorter.numberRegex.test( $.trim( s ));
},
format: function ( s ) {
diff --git a/resources/jquery/jquery.textSelection.js b/resources/jquery/jquery.textSelection.js
index abb0fa3f..17fd0cd3 100644
--- a/resources/jquery/jquery.textSelection.js
+++ b/resources/jquery/jquery.textSelection.js
@@ -25,6 +25,11 @@
}
$.fn.textSelection = function ( command, options ) {
+ var fn,
+ context,
+ hasIframe,
+ needSave,
+ retval;
/**
* Helper function to get an IE TextRange object for an element
@@ -52,7 +57,7 @@
}
}
- var fn = {
+ fn = {
/**
* Get the contents of the textarea
*/
@@ -168,16 +173,16 @@
range2.collapse();
range2.moveStart( 'character', -1 );
// FIXME: Which check is correct?
- if ( range2.text !== "\r" && range2.text !== "\n" && range2.text !== "" ) {
- insertText = "\n" + insertText;
- pre += "\n";
+ if ( range2.text !== '\r' && range2.text !== '\n' && range2.text !== '' ) {
+ insertText = '\n' + insertText;
+ pre += '\n';
}
range3 = document.selection.createRange();
range3.collapse( false );
range3.moveEnd( 'character', 1 );
- if ( range3.text !== "\r" && range3.text !== "\n" && range3.text !== "" ) {
- insertText += "\n";
- post += "\n";
+ if ( range3.text !== '\r' && range3.text !== '\n' && range3.text !== '' ) {
+ insertText += '\n';
+ post += '\n';
}
}
@@ -216,13 +221,13 @@
insertText = doSplitLines( selText, pre, post );
}
if ( options.ownline ) {
- if ( startPos !== 0 && this.value.charAt( startPos - 1 ) !== "\n" && this.value.charAt( startPos - 1 ) !== "\r" ) {
- insertText = "\n" + insertText;
- pre += "\n";
+ if ( startPos !== 0 && this.value.charAt( startPos - 1 ) !== '\n' && this.value.charAt( startPos - 1 ) !== '\r' ) {
+ insertText = '\n' + insertText;
+ pre += '\n';
}
- if ( this.value.charAt( endPos ) !== "\n" && this.value.charAt( endPos ) !== "\r" ) {
- insertText += "\n";
- post += "\n";
+ if ( this.value.charAt( endPos ) !== '\n' && this.value.charAt( endPos ) !== '\r' ) {
+ insertText += '\n';
+ post += '\n';
}
}
this.value = this.value.substring( 0, startPos ) + insertText +
@@ -230,9 +235,9 @@
// Setting this.value scrolls the textarea to the top, restore the scroll position
this.scrollTop = scrollTop;
if ( window.opera ) {
- pre = pre.replace( /\r?\n/g, "\r\n" );
- selText = selText.replace( /\r?\n/g, "\r\n" );
- post = post.replace( /\r?\n/g, "\r\n" );
+ pre = pre.replace( /\r?\n/g, '\r\n' );
+ selText = selText.replace( /\r?\n/g, '\r\n' );
+ post = post.replace( /\r?\n/g, '\r\n' );
}
if ( isSample && options.selectPeri && !options.splitlines ) {
this.selectionStart = startPos + pre.length;
@@ -261,7 +266,21 @@
*/
getCaretPosition: function ( options ) {
function getCaret( e ) {
- var caretPos = 0, endPos = 0;
+ var caretPos = 0,
+ endPos = 0,
+ preText, rawPreText, periText,
+ rawPeriText, postText, rawPostText,
+ // IE Support
+ preFinished,
+ periFinished,
+ postFinished,
+ // Range containing text in the selection
+ periRange,
+ // Range containing text before the selection
+ preRange,
+ // Range containing text after the selection
+ postRange;
+
if ( 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
@@ -269,20 +288,10 @@
// whatever we do later (bug 31847).
activateElementOnIE( e );
- var
- preText, rawPreText, periText,
- rawPeriText, postText, rawPostText,
-
- // IE Support
- preFinished = false,
- periFinished = false,
- postFinished = false,
- // Range containing text in the selection
- periRange = document.selection.createRange().duplicate(),
- // Range containing text before the selection
- preRange,
- // Range containing text after the selection
- postRange;
+ preFinished = false;
+ periFinished = false;
+ postFinished = false;
+ periRange = document.selection.createRange().duplicate();
preRange = rangeForElementIE( e ),
// Move the end where we need it
@@ -309,7 +318,7 @@
} else {
preRange.moveEnd( 'character', -1 );
if ( preRange.text === preText ) {
- rawPreText += "\r\n";
+ rawPreText += '\r\n';
} else {
preFinished = true;
}
@@ -321,7 +330,7 @@
} else {
periRange.moveEnd( 'character', -1 );
if ( periRange.text === periText ) {
- rawPeriText += "\r\n";
+ rawPeriText += '\r\n';
} else {
periFinished = true;
}
@@ -333,15 +342,15 @@
} else {
postRange.moveEnd( 'character', -1 );
if ( postRange.text === postText ) {
- rawPostText += "\r\n";
+ rawPostText += '\r\n';
} else {
postFinished = true;
}
}
}
} while ( ( !preFinished || !periFinished || !postFinished ) );
- caretPos = rawPreText.replace( /\r\n/g, "\n" ).length;
- endPos = caretPos + rawPeriText.replace( /\r\n/g, "\n" ).length;
+ caretPos = rawPreText.replace( /\r\n/g, '\n' ).length;
+ endPos = caretPos + rawPeriText.replace( /\r\n/g, '\n' ).length;
} else if ( e.selectionStart || e.selectionStart === 0 ) {
// Firefox support
caretPos = e.selectionStart;
@@ -405,20 +414,22 @@
return Math.floor( e.scrollWidth / ( $.client.profile().platform === 'linux' ? 7 : 8 ) );
}
function getCaretScrollPosition( e ) {
- var i, j;
// FIXME: This functions sucks and is off by a few lines most
// of the time. It should be replaced by something decent.
- var text = e.value.replace( /\r/g, '' );
- var caret = $( e ).textSelection( 'getCaretPosition' );
- var lineLength = getLineLength( e );
- var row = 0;
- var charInLine = 0;
- var lastSpaceInLine = 0;
+ var i, j,
+ nextSpace,
+ text = e.value.replace( /\r/g, '' ),
+ caret = $( e ).textSelection( 'getCaretPosition' ),
+ lineLength = getLineLength( e ),
+ row = 0,
+ charInLine = 0,
+ lastSpaceInLine = 0;
+
for ( i = 0; i < caret; i++ ) {
charInLine++;
if ( text.charAt( i ) === ' ' ) {
lastSpaceInLine = charInLine;
- } else if ( text.charAt( i ) === "\n" ) {
+ } else if ( text.charAt( i ) === '\n' ) {
lastSpaceInLine = 0;
charInLine = 0;
row++;
@@ -431,11 +442,11 @@
}
}
}
- var nextSpace = 0;
+ nextSpace = 0;
for ( j = caret; j < caret + lineLength; j++ ) {
if (
text.charAt( j ) === ' ' ||
- text.charAt( j ) === "\n" ||
+ text.charAt( j ) === '\n' ||
caret === text.length
) {
nextSpace = j;
@@ -542,16 +553,16 @@
break;
}
- var context = $(this).data( 'wikiEditor-context' );
- var hasIframe = typeof context !== 'undefined' && context && typeof context.$iframe !== 'undefined';
+ context = $(this).data( 'wikiEditor-context' );
+ hasIframe = context !== undefined && context && context.$iframe !== undefined;
// IE selection restore voodoo
- var needSave = false;
+ needSave = false;
if ( hasIframe && context.savedSelection !== null ) {
context.fn.restoreSelection();
needSave = true;
}
- var retval = ( hasIframe ? context.fn : fn )[command].call( this, options );
+ retval = ( hasIframe ? context.fn : fn )[command].call( this, options );
if ( hasIframe && needSave ) {
context.fn.saveSelection();
}
diff --git a/resources/mediawiki.action/mediawiki.action.edit.js b/resources/mediawiki.action/mediawiki.action.edit.js
index 1c51c974..2835c9cc 100644
--- a/resources/mediawiki.action/mediawiki.action.edit.js
+++ b/resources/mediawiki.action/mediawiki.action.edit.js
@@ -71,7 +71,7 @@
* Apply tagOpen/tagClose to selection in textarea,
* use sampleText instead of selection if there is none.
*/
- insertTags: function ( tagOpen, tagClose, sampleText, selectText ) {
+ insertTags: function ( tagOpen, tagClose, sampleText ) {
if ( currentFocused && currentFocused.length ) {
currentFocused.textSelection(
'encapsulateSelection', {
diff --git a/resources/mediawiki.action/mediawiki.action.edit.preview.js b/resources/mediawiki.action/mediawiki.action.edit.preview.js
index cddf6ccf..602aadb0 100644
--- a/resources/mediawiki.action/mediawiki.action.edit.preview.js
+++ b/resources/mediawiki.action/mediawiki.action.edit.preview.js
@@ -102,6 +102,12 @@
}
$( document ).ready( function () {
+ // Do not enable on user .js/.css pages, as there's no sane way of "previewing"
+ // the scripts or styles without reloading the page.
+ if ( $( '#mw-userjsyoucanpreview' ).length || $( '#mw-usercssyoucanpreview' ).length ) {
+ return;
+ }
+
// The following elements can change in a preview but are not output
// by the server when they're empty until the preview reponse.
// TODO: Make the server output these always (in a hidden state), so we don't
diff --git a/resources/mediawiki.action/mediawiki.action.history.diff.css b/resources/mediawiki.action/mediawiki.action.history.diff.css
index 10473be7..31ca1078 100644
--- a/resources/mediawiki.action/mediawiki.action.history.diff.css
+++ b/resources/mediawiki.action/mediawiki.action.history.diff.css
@@ -1,8 +1,36 @@
/*
** Diff rendering
*/
-table.diff, td.diff-otitle, td.diff-ntitle {
+table.diff {
background-color: white;
+ border: none;
+ border-spacing: 4px;
+ margin: 0;
+ width: 100%;
+ /* Ensure that colums are of equal width */
+ table-layout: fixed;
+}
+
+table.diff td {
+ padding: 0.33em 0.5em;
+}
+
+table.diff td.diff-marker {
+ /* Compensate padding for increased font-size */
+ padding: 0.25em;
+}
+
+table.diff col.diff-marker {
+ width: 2%;
+}
+
+table.diff col.diff-content {
+ width: 48%;
+}
+
+table.diff td div {
+ /* Force-wrap very long lines such as URLs or page-widening char strings */
+ word-wrap: break-word;
}
td.diff-otitle,
@@ -10,14 +38,14 @@ td.diff-ntitle {
text-align: center;
}
-td.diff-marker {
- text-align: right;
+td.diff-lineno {
font-weight: bold;
- font-size: 1.25em;
}
-td.diff-lineno {
+td.diff-marker {
+ text-align: right;
font-weight: bold;
+ font-size: 1.25em;
}
td.diff-addedline,
@@ -27,10 +55,6 @@ td.diff-context {
vertical-align: top;
white-space: -moz-pre-wrap;
white-space: pre-wrap;
-}
-
-td.diff-addedline,
-td.diff-deletedline {
border-style: solid;
border-width: 1px 1px 1px 4px;
border-radius: 0.33em;
@@ -45,12 +69,9 @@ td.diff-deletedline {
}
td.diff-context {
- background: #f3f3f3;
- color: #333333;
- border-style: solid;
- border-width: 1px 1px 1px 4px;
+ background: #f9f9f9;
border-color: #e6e6e6;
- border-radius: 0.33em;
+ color: #333333;
}
.diffchange {
@@ -58,15 +79,6 @@ td.diff-context {
text-decoration: none;
}
-table.diff {
- border: none;
- width: 98%;
- border-spacing: 4px;
-
- /* Ensure that colums are of equal width */
- table-layout: fixed;
-}
-
td.diff-addedline .diffchange,
td.diff-deletedline .diffchange {
border-radius: 0.33em;
@@ -80,25 +92,3 @@ td.diff-addedline .diffchange {
td.diff-deletedline .diffchange {
background: #feeec8;
}
-
-table.diff td {
- padding: 0.33em 0.66em;
-}
-
-table.diff col.diff-marker {
- width: 2%;
-}
-
-table.diff col.diff-content {
- width: 48%;
-}
-
-table.diff td div {
- /* Force-wrap very long lines such as URLs or page-widening char strings.*/
- word-wrap: break-word;
-
- /* As fallback (FF<3.5, Opera <10.5), scrollbars will be added for very wide cells
- instead of text overflowing or widening
- */
- overflow: auto;
-}
diff --git a/resources/mediawiki.action/mediawiki.action.history.js b/resources/mediawiki.action/mediawiki.action.history.js
index 55f799e5..e9d320c1 100644
--- a/resources/mediawiki.action/mediawiki.action.history.js
+++ b/resources/mediawiki.action/mediawiki.action.history.js
@@ -119,7 +119,7 @@ jQuery( document ).ready( function ( $ ) {
e.preventDefault();
return false; // Because the submit is special, return false as well.
}
-
+
// Continue natural browser handling other wise
return true;
} );
diff --git a/resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js b/resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js
index 7a9ceee5..727a5251 100644
--- a/resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js
+++ b/resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js
@@ -1,14 +1,12 @@
/**
- * This module enables double-click-to-edit functionality
+ * This module enables double-click-to-edit functionality.
*/
( function ( mw, $ ) {
$( function () {
- var url = $( '#ca-edit a' ).attr( 'href' );
- if ( url ) {
- mw.util.$content.dblclick( function ( e ) {
- e.preventDefault();
- window.location = url;
- } );
- }
+ mw.util.$content.dblclick( function ( e ) {
+ e.preventDefault();
+ // Trigger native HTMLElement click instead of opening URL (bug 43052)
+ $( '#ca-edit a' ).get( 0 ).click();
+ } );
} );
}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.action/mediawiki.action.view.postEdit.js b/resources/mediawiki.action/mediawiki.action.view.postEdit.js
new file mode 100644
index 00000000..a11233fa
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.view.postEdit.js
@@ -0,0 +1,15 @@
+( function ( mw, $ ) {
+ // Only a view can be a post-edit.
+ if ( mw.config.get( 'wgAction' ) !== 'view' ) {
+ return;
+ }
+
+ // Matches EditPage::POST_EDIT_COOKIE_KEY_PREFIX
+ var cookieKey = mw.config.get( 'wgCookiePrefix' ) + 'PostEditRevision' + mw.config.get( 'wgCurRevisionId' );
+
+ if ( $.cookie( cookieKey ) === '1' ) {
+ // We just saved this page
+ $.cookie( cookieKey, null, { path: '/' } );
+ mw.config.set( 'wgPostEdit', true );
+ }
+} ( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js b/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
index d02d4327..61d9d150 100644
--- a/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
+++ b/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
@@ -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.
@@ -8,23 +8,19 @@ jQuery( function ( $ ) {
// Don't use the ":has:(.editsection a)" selector because it performs very bad.
// http://jsperf.com/jq-1-7-2-vs-jq-1-8-1-performance-of-mw-has/2
$( document ).on( 'contextmenu', 'h1, h2, h3, h4, h5, h6', function ( e ) {
- var $edit, href;
-
- $edit = $( this ).find( '.editsection a' );
+ var $edit = $( this ).find( '.editsection a' );
if ( !$edit.length ) {
return;
}
- // Get href of the editsection link
- href = $edit.prop( 'href' );
-
// Headings can contain rich text.
// Make sure to not block contextmenu events on (other) anchor tags
// inside the heading (e.g. to do things like copy URL, open in new tab, ..).
// e.target can be the heading, but it can also be anything inside the heading.
- if ( href && e.target.nodeName.toLowerCase() !== 'a' ) {
- window.location = href;
+ if ( e.target.nodeName.toLowerCase() !== 'a' ) {
+ // Trigger native HTMLElement click instead of opening URL (bug 43052)
e.preventDefault();
+ $edit.get( 0 ).click();
}
} );
} );
diff --git a/resources/mediawiki.api/mediawiki.api.category.js b/resources/mediawiki.api/mediawiki.api.category.js
index cc6f704f..4de52911 100644
--- a/resources/mediawiki.api/mediawiki.api.category.js
+++ b/resources/mediawiki.api/mediawiki.api.category.js
@@ -1,104 +1,130 @@
/**
- * Additional mw.Api methods to assist with API calls related to categories.
+ * @class mw.Api.plugin.category
*/
( function ( mw, $ ) {
$.extend( mw.Api.prototype, {
/**
* Determine if a category exists.
- * @param title {mw.Title}
- * @param success {Function} callback to pass boolean of category's existence
- * @param err {Function} optional callback to run if api error
- * @return ajax call object
+ * @param {mw.Title} title
+ * @param {Function} [ok] Success callback (deprecated)
+ * @param {Function} [err] Error callback (deprecated)
+ * @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {boolean} return.done.isCategory Whether the category exists.
*/
- isCategory: function ( title, success, err ) {
- var params, ok;
- params = {
- prop: 'categoryinfo',
- titles: title.toString()
- };
- ok = function ( data ) {
- var exists = false;
- if ( data.query && data.query.pages ) {
- $.each( data.query.pages, function ( id, page ) {
- if ( page.categoryinfo ) {
- exists = true;
- }
- } );
- }
- success( exists );
- };
+ isCategory: function ( title, ok, err ) {
+ var d = $.Deferred();
+ // Backwards compatibility (< MW 1.20)
+ d.done( ok );
+ d.fail( err );
- return this.get( params, { ok: ok, err: err } );
+ this.get( {
+ prop: 'categoryinfo',
+ titles: title.toString()
+ } )
+ .done( function ( data ) {
+ var exists = false;
+ if ( data.query && data.query.pages ) {
+ $.each( data.query.pages, function ( id, page ) {
+ if ( page.categoryinfo ) {
+ exists = true;
+ }
+ } );
+ }
+ d.resolve( exists );
+ })
+ .fail( d.reject );
+
+ return d.promise();
},
/**
* Get a list of categories that match a certain prefix.
* e.g. given "Foo", return "Food", "Foolish people", "Foosball tables" ...
- * @param prefix {String} prefix to match
- * @param success {Function} callback to pass matched categories to
- * @param err {Function} optional callback to run if api error
- * @return {jqXHR}
+ * @param {string} prefix Prefix to match.
+ * @param {Function} [ok] Success callback (deprecated)
+ * @param {Function} [err] Error callback (deprecated)
+ * @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {String[]} return.done.categories Matched categories
*/
- getCategoriesByPrefix: function ( prefix, success, err ) {
+ getCategoriesByPrefix: function ( prefix, ok, err ) {
+ var d = $.Deferred();
+ // Backwards compatibility (< MW 1.20)
+ d.done( ok );
+ d.fail( err );
+
// Fetch with allpages to only get categories that have a corresponding description page.
- var params, ok;
- params = {
- 'list': 'allpages',
- 'apprefix': prefix,
- 'apnamespace': mw.config.get('wgNamespaceIds').category
- };
- ok = function ( data ) {
- var texts = [];
- if ( data.query && data.query.allpages ) {
- $.each( data.query.allpages, function ( i, category ) {
- texts.push( new mw.Title( category.title ).getNameText() );
- } );
- }
- success( texts );
- };
+ this.get( {
+ list: 'allpages',
+ apprefix: prefix,
+ apnamespace: mw.config.get('wgNamespaceIds').category
+ } )
+ .done( function ( data ) {
+ var texts = [];
+ if ( data.query && data.query.allpages ) {
+ $.each( data.query.allpages, function ( i, category ) {
+ texts.push( new mw.Title( category.title ).getNameText() );
+ } );
+ }
+ d.resolve( texts );
+ })
+ .fail( d.reject );
- return this.get( params, { ok: ok, err: err } );
+ return d.promise();
},
/**
* Get the categories that a particular page on the wiki belongs to
- * @param title {mw.Title}
- * @param success {Function} callback to pass categories to (or false, if title not found)
- * @param err {Function} optional callback to run if api error
- * @param async {Boolean} optional asynchronousness (default = true = async)
- * @return {jqXHR}
+ * @param {mw.Title} title
+ * @param {Function} [ok] Success callback (deprecated)
+ * @param {Function} [err] Error callback (deprecated)
+ * @param {boolean} [async=true] Asynchronousness
+ * @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {boolean|mw.Title[]} return.done.categories List of category titles or false
+ * if title was not found.
*/
- getCategories: function ( title, success, err, async ) {
- var params, ok;
- params = {
- prop: 'categories',
- titles: title.toString()
- };
- if ( async === undefined ) {
- async = true;
- }
- ok = function ( data ) {
- var ret = false;
- if ( data.query && data.query.pages ) {
- $.each( data.query.pages, function ( id, page ) {
- if ( page.categories ) {
- if ( typeof ret !== 'object' ) {
- ret = [];
+ getCategories: function ( title, ok, err, async ) {
+ var d = $.Deferred();
+ // Backwards compatibility (< MW 1.20)
+ d.done( ok );
+ d.fail( err );
+
+ this.get( {
+ prop: 'categories',
+ titles: title.toString()
+ }, {
+ async: async === undefined ? true : async
+ } )
+ .done( function ( data ) {
+ var ret = false;
+ if ( data.query && data.query.pages ) {
+ $.each( data.query.pages, function ( id, page ) {
+ if ( page.categories ) {
+ if ( typeof ret !== 'object' ) {
+ ret = [];
+ }
+ $.each( page.categories, function ( i, cat ) {
+ ret.push( new mw.Title( cat.title ) );
+ } );
}
- $.each( page.categories, function ( i, cat ) {
- ret.push( new mw.Title( cat.title ) );
- } );
- }
- } );
- }
- success( ret );
- };
+ } );
+ }
+ d.resolve( ret );
+ })
+ .fail( d.reject );
- return this.get( params, { ok: ok, err: err, async: async } );
+ return d.promise();
}
} );
+ /**
+ * @class mw.Api
+ * @mixins mw.Api.plugin.category
+ */
+
}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.api/mediawiki.api.edit.js b/resources/mediawiki.api/mediawiki.api.edit.js
index 49af9375..3c775ad0 100644
--- a/resources/mediawiki.api/mediawiki.api.edit.js
+++ b/resources/mediawiki.api/mediawiki.api.edit.js
@@ -1,5 +1,5 @@
/**
- * Additional mw.Api methods to assist with API calls related to editing wiki pages.
+ * @class mw.Api.plugin.edit
*/
( function ( mw, $ ) {
@@ -13,10 +13,10 @@
* If we have a cached token try using that, and if it fails, blank out the
* cached token and start over.
*
- * @param params {Object} API parameters
- * @param ok {Function} callback for success
- * @param err {Function} [optional] error callback
- * @return {jqXHR}
+ * @param {Object} params API parameters
+ * @param {Function} [ok] Success callback (deprecated)
+ * @param {Function} [err] Error callback (deprecated)
+ * @return {jQuery.Promise} See #post
*/
postWithEditToken: function ( params, ok, err ) {
var useTokenToPost, getTokenIfBad,
@@ -48,67 +48,74 @@
},
/**
- * Api helper to grab an edit token
+ * Api helper to grab an edit token.
*
- * token callback has signature ( String token )
- * error callback has signature ( String code, Object results, XmlHttpRequest xhr, Exception exception )
- * Note that xhr and exception are only available for 'http_*' errors
- * code may be any http_* error code (see mw.Api), or 'token_missing'
- *
- * @param tokenCallback {Function} received token callback
- * @param err {Function} error callback
- * @return {jqXHR}
+ * @param {Function} [ok] Success callback
+ * @param {Function} [err] Error callback
+ * @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {string} return.done.token Received token.
*/
- getEditToken: function ( tokenCallback, err ) {
- var parameters = {
+ getEditToken: function ( ok, err ) {
+ var d = $.Deferred();
+ // Backwards compatibility (< MW 1.20)
+ d.done( ok );
+ d.fail( err );
+
+ this.get( {
action: 'tokens',
type: 'edit'
- },
- ok = function ( data ) {
+ }, {
+ // Due to the API assuming we're logged out if we pass the callback-parameter,
+ // we have to disable jQuery's callback system, and instead parse JSON string,
+ // by setting 'jsonp' to false.
+ // TODO: This concern seems genuine but no other module has it. Is it still
+ // needed and/or should we pass this by default?
+ jsonp: false
+ } )
+ .done( function ( data ) {
var token;
// If token type is not available for this user,
// key 'edittoken' is missing or can contain Boolean false
if ( data.tokens && data.tokens.edittoken ) {
token = data.tokens.edittoken;
cachedToken = token;
- tokenCallback( token );
+ d.resolve( token );
} else {
- err( 'token-missing', data );
+ d.reject( 'token-missing', data );
}
- },
- ajaxOptions = {
- ok: ok,
- err: err,
- // Due to the API assuming we're logged out if we pass the callback-parameter,
- // we have to disable jQuery's callback system, and instead parse JSON string,
- // by setting 'jsonp' to false.
- jsonp: false
- };
+ })
+ .fail( d.reject );
- return this.get( parameters, ajaxOptions );
+ return d.promise();
},
/**
* Create a new section of the page.
- * @param title {mw.Title|String} target page
- * @param header {String}
- * @param message {String} wikitext message
- * @param ok {Function} success handler
- * @param err {Function} error handler
- * @return {jqXHR}
+ * @see #postWithEditToken
+ * @param {mw.Title|String} title Target page
+ * @param {string} header
+ * @param {string} message wikitext message
+ * @param {Function} [ok] Success handler
+ * @param {Function} [err] Error handler
+ * @return {jQuery.Promise}
*/
newSection: function ( title, header, message, ok, err ) {
- var params = {
+ return this.postWithEditToken( {
action: 'edit',
section: 'new',
format: 'json',
title: title.toString(),
summary: header,
text: message
- };
- return this.postWithEditToken( params, ok, err );
+ }, ok, err );
}
} );
+ /**
+ * @class mw.Api
+ * @mixins mw.Api.plugin.edit
+ */
+
}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.api/mediawiki.api.js b/resources/mediawiki.api/mediawiki.api.js
index a184e3ca..cf7443f3 100644
--- a/resources/mediawiki.api/mediawiki.api.js
+++ b/resources/mediawiki.api/mediawiki.api.js
@@ -1,15 +1,9 @@
-/**
- * mw.Api objects represent the API of a particular MediaWiki server.
- */
( function ( mw, $ ) {
- /**
- * @var defaultOptions {Object}
- * We allow people to omit these default parameters from API requests
- * there is very customizable error handling here, on a per-call basis
- * wondering, would it be simpler to make it easy to clone the api object,
- * change error handling, and use that instead?
- */
+ // We allow people to omit these default parameters from API requests
+ // there is very customizable error handling here, on a per-call basis
+ // wondering, would it be simpler to make it easy to clone the api object,
+ // change error handling, and use that instead?
var defaultOptions = {
// Query parameters for API requests
@@ -30,22 +24,23 @@
/**
* Constructor to create an object to interact with the API of a particular MediaWiki server.
+ * mw.Api objects represent the API of a particular MediaWiki server.
+ *
+ * TODO: Share API objects with exact same config.
*
- * @todo Share API objects with exact same config.
- * @example
- * <code>
- * var api = new mw.Api();
- * api.get( {
- * action: 'query',
- * meta: 'userinfo'
- * }, {
- * ok: function () { console.log( arguments ); }
- * } );
- * </code>
+ * var api = new mw.Api();
+ * api.get( {
+ * action: 'query',
+ * meta: 'userinfo'
+ * } ).done ( function ( data ) {
+ * console.log( data );
+ * } );
+ *
+ * @class
*
* @constructor
- * @param options {Object} See defaultOptions documentation above. Ajax options can also be
- * overridden for each individual request to jQuery.ajax() later on.
+ * @param {Object} options See defaultOptions documentation above. Ajax options can also be
+ * overridden for each individual request to {@link jQuery#ajax} later on.
*/
mw.Api = function ( options ) {
@@ -69,13 +64,12 @@
/**
* Normalize the ajax options for compatibility and/or convenience methods.
*
- * @param {undefined|Object|Function} An object contaning one or more of options.ajax,
- * or just a success function (options.ajax.ok).
+ * @param {Object} [arg] An object contaning one or more of options.ajax.
* @return {Object} Normalized ajax options.
*/
normalizeAjaxOptions: function ( arg ) {
// Arg argument is usually empty
- // (before MW 1.20 it was often used to pass ok/err callbacks)
+ // (before MW 1.20 it was used to pass ok callbacks)
var opts = arg || {};
// Options can also be a success callback handler
if ( typeof arg === 'function' ) {
@@ -87,8 +81,8 @@
/**
* Perform API get request
*
- * @param {Object} request parameters
- * @param {Object|Function} [optional] ajax options
+ * @param {Object} parameters
+ * @param {Object|Function} [ajaxOptions]
* @return {jQuery.Promise}
*/
get: function ( parameters, ajaxOptions ) {
@@ -99,10 +93,11 @@
/**
* Perform API post request
- * @todo Post actions for nonlocal will need proxy
*
- * @param {Object} request parameters
- * @param {Object|Function} [optional] ajax options
+ * TODO: Post actions for non-local hostnames will need proxy.
+ *
+ * @param {Object} parameters
+ * @param {Object|Function} [ajaxOptions]
* @return {jQuery.Promise}
*/
post: function ( parameters, ajaxOptions ) {
@@ -114,11 +109,9 @@
/**
* Perform the API call.
*
- * @param {Object} request parameters
- * @param {Object} ajax options
- * @return {jQuery.Promise}
- * - done: API response data as first argument
- * - fail: errorcode as first arg, details (string or object) as second arg.
+ * @param {Object} parameters
+ * @param {Object} [ajaxOptions]
+ * @return {jQuery.Promise} Done: API response data. Fail: Error code
*/
ajax: function ( parameters, ajaxOptions ) {
var token,
@@ -187,7 +180,9 @@
};
/**
- * @var {Array} List of errors we might receive from the API.
+ * @static
+ * @property {Array}
+ * List of errors we might receive from the API.
* For now, this just documents our expectation that there should be similar messages
* available.
*/
@@ -237,7 +232,9 @@
];
/**
- * @var {Array} List of warnings we might receive from the API.
+ * @static
+ * @property {Array}
+ * List of warnings we might receive from the API.
* For now, this just documents our expectation that there should be similar messages
* available.
*/
diff --git a/resources/mediawiki.api/mediawiki.api.parse.js b/resources/mediawiki.api/mediawiki.api.parse.js
index e8d1b3e6..ea0388c1 100644
--- a/resources/mediawiki.api/mediawiki.api.parse.js
+++ b/resources/mediawiki.api/mediawiki.api.parse.js
@@ -1,42 +1,43 @@
/**
- * mw.Api methods for parsing wikitext.
+ * @class mw.Api.plugin.parse
*/
( function ( mw, $ ) {
$.extend( mw.Api.prototype, {
/**
- * Convinience method for 'action=parse'. Parses wikitext into HTML.
+ * Convinience method for 'action=parse'.
*
- * @param wikiText {String}
- * @param ok {Function} [optional] deprecated (success callback)
- * @param err {Function} [optional] deprecated (error callback)
+ * @param {string} wikitext
+ * @param {Function} [ok] Success callback (deprecated)
+ * @param {Function} [err] Error callback (deprecated)
* @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {string} return.done.data Parsed HTML of `wikitext`.
*/
- parse: function ( wikiText, ok, err ) {
- var apiDeferred = $.Deferred();
-
+ parse: function ( wikitext, ok, err ) {
+ var d = $.Deferred();
// Backwards compatibility (< MW 1.20)
- if ( ok ) {
- apiDeferred.done( ok );
- }
- if ( err ) {
- apiDeferred.fail( err );
- }
+ d.done( ok );
+ d.fail( err );
this.get( {
action: 'parse',
- text: wikiText
+ text: wikitext
} )
.done( function ( data ) {
if ( data.parse && data.parse.text && data.parse.text['*'] ) {
- apiDeferred.resolve( data.parse.text['*'] );
+ d.resolve( data.parse.text['*'] );
}
} )
- .fail( apiDeferred.reject );
+ .fail( d.reject );
- // Return the promise
- return apiDeferred.promise();
+ return d.promise();
}
} );
+ /**
+ * @class mw.Api
+ * @mixins mw.Api.plugin.parse
+ */
+
}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.api/mediawiki.api.titleblacklist.js b/resources/mediawiki.api/mediawiki.api.titleblacklist.js
deleted file mode 100644
index 1f7e275a..00000000
--- a/resources/mediawiki.api/mediawiki.api.titleblacklist.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * Additional mw.Api methods to assist with API calls to the API module of the TitleBlacklist extension.
- */
-
-( function ( mw, $ ) {
-
- $.extend( mw.Api.prototype, {
- /**
- * Convinience method for 'action=titleblacklist'.
- * Note: This action is not provided by MediaWiki core, but as part of the TitleBlacklist extension.
- *
- * @param title {mw.Title}
- * @param success {Function} Called on successfull request. First argument is false if title wasn't blacklisted,
- * object with 'reason', 'line' and 'message' properties if title was blacklisted.
- * @param err {Function} optional callback to run if api error
- * @return {jqXHR}
- */
- isBlacklisted: function ( title, success, err ) {
- var params = {
- action: 'titleblacklist',
- tbaction: 'create',
- tbtitle: title.toString()
- },
- ok = function ( data ) {
- var result;
-
- // this fails open (if nothing valid is returned by the api, allows the title)
- // also fails open when the API is not present, which will be most of the time
- // as this API module is part of the TitleBlacklist extension.
- if ( data.titleblacklist && data.titleblacklist.result && data.titleblacklist.result === 'blacklisted') {
- if ( data.titleblacklist.reason ) {
- result = {
- reason: data.titleblacklist.reason,
- line: data.titleblacklist.line,
- message: data.titleblacklist.message
- };
- } else {
- mw.log('mw.Api.titleblacklist::isBlacklisted> no reason data for blacklisted title', 'debug');
- result = { reason: 'Blacklisted, but no reason supplied', line: 'Unknown', message: null };
- }
- success( result );
- } else {
- success ( false );
- }
- };
-
- return this.get( params, { ok: ok, err: err } );
- }
-
- } );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.api/mediawiki.api.watch.js b/resources/mediawiki.api/mediawiki.api.watch.js
index d3234421..c86a90a7 100644
--- a/resources/mediawiki.api/mediawiki.api.watch.js
+++ b/resources/mediawiki.api/mediawiki.api.watch.js
@@ -1,56 +1,72 @@
/**
- * Additional mw.Api methods to assist with (un)watching wiki pages.
+ * @class mw.Api.plugin.watch
* @since 1.19
*/
( function ( mw, $ ) {
/**
- * @context {mw.Api}
+ * @private
+ * @context mw.Api
+ *
+ * @param {String|mw.Title} page Full page name or instance of mw.Title
+ * @param {Function} [ok] Success callback (deprecated)
+ * @param {Function} [err] Error callback (deprecated)
+ * @return {jQuery.Promise}
+ * @return {Function} return.done
+ * @return {Object} return.done.watch
+ * @return {string} return.done.watch.title Full pagename
+ * @return {boolean} return.done.watch.watched
+ * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
*/
- function doWatchInternal( page, success, err, addParams ) {
- var params = {
+ function doWatchInternal( page, ok, err, addParams ) {
+ var params, d = $.Deferred();
+ // Backwards compatibility (< MW 1.20)
+ d.done( ok );
+ d.fail( err );
+
+ params = {
action: 'watch',
title: String( page ),
token: mw.user.tokens.get( 'watchToken' ),
uselang: mw.config.get( 'wgUserLanguage' )
};
- function ok( data ) {
- success( data.watch );
- }
+
if ( addParams ) {
$.extend( params, addParams );
}
- return this.post( params, { ok: ok, err: err } );
+
+ this.post( params )
+ .done( function ( data ) {
+ d.resolve( data.watch );
+ } )
+ .fail( d.reject );
+
+ return d.promise();
}
$.extend( mw.Api.prototype, {
/**
- * Convinience method for 'action=watch'.
+ * Convenience method for `action=watch`.
*
- * @param page {String|mw.Title} Full page name or instance of mw.Title
- * @param success {Function} Callback to which the watch object will be passed.
- * Watch object contains properties 'title' (full pagename), 'watched' (boolean) and
- * 'message' (parsed HTML of the 'addedwatchtext' message).
- * @param err {Function} Error callback (optional)
- * @return {jqXHR}
+ * @inheritdoc #doWatchInternal
*/
- watch: function ( page, success, err ) {
- return doWatchInternal.call( this, page, success, err );
+ watch: function ( page, ok, err ) {
+ return doWatchInternal.call( this, page, ok, err );
},
/**
- * Convinience method for 'action=watch&unwatch=1'.
+ * Convenience method for `action=watch&unwatch=1`.
*
- * @param page {String|mw.Title} Full page name or instance of mw.Title
- * @param success {Function} Callback to which the watch object will be passed.
- * Watch object contains properties 'title' (full pagename), 'watched' (boolean) and
- * 'message' (parsed HTML of the 'removedwatchtext' message).
- * @param err {Function} Error callback (optional)
- * @return {jqXHR}
+ * @inheritdoc #doWatchInternal
*/
- unwatch: function ( page, success, err ) {
- return doWatchInternal.call( this, page, success, err, { unwatch: 1 } );
+ unwatch: function ( page, ok, err ) {
+ return doWatchInternal.call( this, page, ok, err, { unwatch: 1 } );
}
} );
+ /**
+ * @class mw.Api
+ * @mixins mw.Api.plugin.watch
+ */
+
}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.language/languages/bs.js b/resources/mediawiki.language/languages/bs.js
index c0c77aaf..65eb5a6d 100644
--- a/resources/mediawiki.language/languages/bs.js
+++ b/resources/mediawiki.language/languages/bs.js
@@ -2,10 +2,10 @@
* Bosnian (bosanski) language functions
*/
-mediaWiki.language.convertGrammar = function( word, form ) {
- var grammarForms = mw.language.getData( 'bs', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+ var grammarForms = mediaWiki.language.getData( 'bs', 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
- return grammarForms[form][word] ;
+ return grammarForms[form][word];
}
switch ( form ) {
case 'instrumental': // instrumental
diff --git a/resources/mediawiki.language/languages/dsb.js b/resources/mediawiki.language/languages/dsb.js
index a42a8f7f..b2c9c081 100644
--- a/resources/mediawiki.language/languages/dsb.js
+++ b/resources/mediawiki.language/languages/dsb.js
@@ -2,10 +2,10 @@
* Lower Sorbian (Dolnoserbski) language functions
*/
-mediaWiki.language.convertGrammar = function( word, form ) {
- var grammarForms = mw.language.getData( 'dsb', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+ var grammarForms = mediaWiki.language.getData( 'dsb', 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
- return grammarForms[form][word] ;
+ return grammarForms[form][word];
}
switch ( form ) {
case 'instrumental': // instrumental
diff --git a/resources/mediawiki.language/languages/fi.js b/resources/mediawiki.language/languages/fi.js
index 374698dc..61c6c104 100644
--- a/resources/mediawiki.language/languages/fi.js
+++ b/resources/mediawiki.language/languages/fi.js
@@ -3,21 +3,24 @@
* @author Santhosh Thottingal
*/
-mediaWiki.language.convertGrammar = function( word, form ) {
- var grammarForms = mw.language.getData( 'fi', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+ var grammarForms, aou, origWord;
+
+ grammarForms = mediaWiki.language.getData( 'fi', 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
- return grammarForms[form][word] ;
+ return grammarForms[form][word];
}
// vowel harmony flag
- var aou = word.match( /[aou][^äöy]*$/i );
- var origWord = word;
+ aou = word.match( /[aou][^äöy]*$/i );
+ origWord = word;
if ( word.match( /wiki$/i ) ) {
aou = false;
}
//append i after final consonant
- if ( word.match( /[bcdfghjklmnpqrstvwxz]$/i ) )
+ if ( word.match( /[bcdfghjklmnpqrstvwxz]$/i ) ) {
word += 'i';
+ }
switch ( form ) {
case 'genitive':
diff --git a/resources/mediawiki.language/languages/ga.js b/resources/mediawiki.language/languages/ga.js
index a27b489d..c13e8321 100644
--- a/resources/mediawiki.language/languages/ga.js
+++ b/resources/mediawiki.language/languages/ga.js
@@ -2,10 +2,11 @@
* Irish (Gaeilge) language functions
*/
-mediaWiki.language.convertGrammar = function( word, form ) {
- var grammarForms = mw.language.getData( 'ga', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+ /*jshint onecase:true */
+ var grammarForms = mediaWiki.language.getData( 'ga', 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
- return grammarForms[form][word] ;
+ return grammarForms[form][word];
}
switch ( form ) {
case 'ainmlae':
diff --git a/resources/mediawiki.language/languages/he.js b/resources/mediawiki.language/languages/he.js
index d35f77ed..13d457b2 100644
--- a/resources/mediawiki.language/languages/he.js
+++ b/resources/mediawiki.language/languages/he.js
@@ -3,26 +3,26 @@
*/
mediaWiki.language.convertGrammar = function( word, form ) {
- var grammarForms = mw.language.getData( 'he', 'grammarForms' );
+ var grammarForms = mediaWiki.language.getData( 'he', 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
- return grammarForms[form][word] ;
+ return grammarForms[form][word];
}
switch ( form ) {
case 'prefixed':
case 'תחילית': // the same word in Hebrew
// Duplicate prefixed "Waw", but only if it's not already double
- if ( word.substr( 0, 1 ) === "ו" && word.substr( 0, 2 ) !== "וו" ) {
- word = "ו" + word;
+ if ( word.substr( 0, 1 ) === 'ו' && word.substr( 0, 2 ) !== 'וו' ) {
+ word = 'ו' + word;
}
// Remove the "He" if prefixed
- if ( word.substr( 0, 1 ) === "×”" ) {
+ if ( word.substr( 0, 1 ) === '×”' ) {
word = word.substr( 1, word.length );
}
// Add a hyphen (maqaf) before numbers and non-Hebrew letters
- if ( word.substr( 0, 1 ) < "×" || word.substr( 0, 1 ) > "ת" ) {
- word = "Ö¾" + word;
+ if ( word.substr( 0, 1 ) < '×' || word.substr( 0, 1 ) > 'ת' ) {
+ word = 'Ö¾' + word;
}
}
return word;
diff --git a/resources/mediawiki.language/languages/hsb.js b/resources/mediawiki.language/languages/hsb.js
index 211d67b5..77dca75e 100644
--- a/resources/mediawiki.language/languages/hsb.js
+++ b/resources/mediawiki.language/languages/hsb.js
@@ -2,10 +2,10 @@
* Upper Sorbian (Hornjoserbsce) language functions
*/
-mediaWiki.language.convertGrammar = function( word, form ) {
- var grammarForms =mw.language.getData( 'hsb', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+ var grammarForms = mediaWiki.language.getData( 'hsb', 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
- return grammarForms[form][word] ;
+ return grammarForms[form][word];
}
switch ( form ) {
case 'instrumental': // instrumental
diff --git a/resources/mediawiki.language/languages/hu.js b/resources/mediawiki.language/languages/hu.js
index eb3f1f3a..23b0c125 100644
--- a/resources/mediawiki.language/languages/hu.js
+++ b/resources/mediawiki.language/languages/hu.js
@@ -3,10 +3,10 @@
* @author Santhosh Thottingal
*/
-mediaWiki.language.convertGrammar = function( word, form ) {
- var grammarForms = mw.language.getData( 'hu', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+ var grammarForms = mediaWiki.language.getData( 'hu', 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
- return grammarForms[form][word] ;
+ return grammarForms[form][word];
}
switch ( form ) {
case 'rol':
diff --git a/resources/mediawiki.language/languages/hy.js b/resources/mediawiki.language/languages/hy.js
index 215e7504..65081bdd 100644
--- a/resources/mediawiki.language/languages/hy.js
+++ b/resources/mediawiki.language/languages/hy.js
@@ -2,10 +2,11 @@
* Armenian (Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶) language functions
*/
-mediaWiki.language.convertGrammar = function( word, form ) {
- var grammarForms = mw.language.getData( 'hy', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+ /*jshint onecase:true */
+ var grammarForms = mediaWiki.language.getData( 'hy', 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
- return grammarForms[form][word] ;
+ return grammarForms[form][word];
}
// These rules are not perfect, but they are currently only used for site names so it doesn't
@@ -13,14 +14,15 @@ mediaWiki.language.convertGrammar = function( word, form ) {
switch ( form ) {
case 'genitive': // Õ½Õ¥Õ¼Õ¡Õ¯Õ¡Õ¶ Õ°Õ¸Õ¬Õ¸Õ¾
- if ( word.substr( -1 ) === 'Õ¡' )
+ if ( word.substr( -1 ) === 'Õ¡' ) {
word = word.substr( 0, word.length -1 ) + 'Õ¡ÕµÕ«';
- else if ( word.substr( -1 ) === 'Õ¸' )
+ } else if ( word.substr( -1 ) === 'Õ¸' ) {
word = word.substr( 0, word.length - 1 ) + 'Õ¸ÕµÕ«';
- else if ( word.substr( -4 ) === 'Õ£Õ«Ö€Ö„' )
+ } else if ( word.substr( -4 ) === 'Õ£Õ«Ö€Ö„' ) {
word = word.substr( 0, word.length - 4 ) + 'Õ£Ö€Ö„Õ«';
- else
+ } else {
word = word + 'Õ«';
+ }
break;
}
return word;
diff --git a/resources/mediawiki.language/languages/la.js b/resources/mediawiki.language/languages/la.js
index 313bb1c2..27110241 100644
--- a/resources/mediawiki.language/languages/la.js
+++ b/resources/mediawiki.language/languages/la.js
@@ -3,10 +3,10 @@
* @author Santhosh Thottingal
*/
-mediaWiki.language.convertGrammar = function( word, form ) {
- var grammarForms = mw.language.getData( 'la', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+ var grammarForms = mediaWiki.language.getData( 'la', 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
- return grammarForms[form][word] ;
+ return grammarForms[form][word];
}
switch ( form ) {
case 'genitive':
diff --git a/resources/mediawiki.language/languages/os.js b/resources/mediawiki.language/languages/os.js
index 431e38c8..682b3903 100644
--- a/resources/mediawiki.language/languages/os.js
+++ b/resources/mediawiki.language/languages/os.js
@@ -4,23 +4,24 @@
*/
-mediaWiki.language.convertGrammar = function( word, form ) {
- var grammarForms = mw.language.getData( 'os', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+ var grammarForms = mediaWiki.language.getData( 'os', 'grammarForms' ),
+ // Ending for allative case
+ endAllative = 'мæ',
+ // Variable for 'j' beetwen vowels
+ jot = '',
+ // Variable for "-" for not Ossetic words
+ hyphen = '',
+ // Variable for ending
+ ending = '';
+
if ( grammarForms && grammarForms[form] ) {
- return grammarForms[form][word] ;
+ return grammarForms[form][word];
}
- // Ending for allative case
- var end_allative = 'мæ';
- // Variable for 'j' beetwen vowels
- var jot = '';
- // Variable for "-" for not Ossetic words
- var hyphen = '';
- // Variable for ending
- var ending = '';
// Checking if the $word is in plural form
if ( word.match( /тæ$/i ) ) {
word = word.substring( 0, word.length - 1 );
- end_allative = 'æм';
+ endAllative = 'æм';
}
// Works if word is in singular form.
// Checking if word ends on one of the vowels: е, Ñ‘, и, о, Ñ‹, Ñ, ÑŽ, Ñ.
@@ -45,10 +46,10 @@ mediaWiki.language.convertGrammar = function( word, form ) {
ending = hyphen + jot + 'æн';
break;
case 'allative':
- ending = hyphen + end_allative;
+ ending = hyphen + endAllative;
break;
case 'ablative':
- if ( jot == 'й' ) {
+ if ( jot === 'й' ) {
ending = hyphen + jot + 'æ';
}
else {
diff --git a/resources/mediawiki.language/languages/ru.js b/resources/mediawiki.language/languages/ru.js
index cfdbfc3b..1bc06326 100644
--- a/resources/mediawiki.language/languages/ru.js
+++ b/resources/mediawiki.language/languages/ru.js
@@ -2,27 +2,51 @@
* Russian (РуÑÑкий) language functions
*/
-mediaWiki.language.convertGrammar = function( word, form ) {
- var grammarForms = mw.language.getData( 'ru', 'grammarForms' );
+// These tests were originally made for names of Wikimedia
+// websites, so they don't currently cover all the possible
+// cases.
+
+mediaWiki.language.convertGrammar = function ( word, form ) {
+ 'use strict';
+
+ var grammarForms = mediaWiki.language.getData( 'ru', 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
- return grammarForms[form][word] ;
+ return grammarForms[form][word];
}
switch ( form ) {
case 'genitive': // родительный падеж
- if ( ( word.substr( word.length - 4 ) == 'вики' ) || ( word.substr( word.length - 4 ) == 'Вики' ) ) {
- }
- else if ( word.substr( word.length - 1 ) == 'ь' )
+ if ( word.substr( word.length - 1 ) === 'ь' ) {
word = word.substr(0, word.length - 1 ) + 'Ñ';
- else if ( word.substr( word.length - 2 ) == 'иÑ' )
+ } else if ( word.substr( word.length - 2 ) === 'иÑ' ) {
word = word.substr(0, word.length - 2 ) + 'ии';
- else if ( word.substr( word.length - 2 ) == 'ка' )
+ } else if ( word.substr( word.length - 2 ) === 'ка' ) {
word = word.substr(0, word.length - 2 ) + 'ки';
- else if ( word.substr( word.length - 2 ) == 'ти' )
+ } else if ( word.substr( word.length - 2 ) === 'ти' ) {
word = word.substr(0, word.length - 2 ) + 'тей';
- else if ( word.substr( word.length - 2 ) == 'ды' )
+ } else if ( word.substr( word.length - 2 ) === 'ды' ) {
word = word.substr(0, word.length - 2 ) + 'дов';
- else if ( word.substr( word.length - 3 ) == 'ник' )
+ } else if ( word.substr( word.length - 3 ) === 'ные' ) {
+ word = word.substr(0, word.length - 3 ) + 'ных';
+ } else if ( word.substr( word.length - 3 ) === 'ник' ) {
word = word.substr(0, word.length - 3 ) + 'ника';
+ }
+ break;
+ case 'prepositional': // предложный падеж
+ if ( word.substr( word.length - 1 ) === 'ь' ) {
+ word = word.substr(0, word.length - 1 ) + 'е';
+ } else if ( word.substr( word.length - 2 ) === 'иÑ' ) {
+ word = word.substr(0, word.length - 2 ) + 'ии';
+ } else if ( word.substr( word.length - 2 ) === 'ка' ) {
+ word = word.substr(0, word.length - 2 ) + 'ке';
+ } else if ( word.substr( word.length - 2 ) === 'ти' ) {
+ word = word.substr(0, word.length - 2 ) + 'Ñ‚ÑÑ…';
+ } else if ( word.substr( word.length - 2 ) === 'ды' ) {
+ word = word.substr(0, word.length - 2 ) + 'дах';
+ } else if ( word.substr( word.length - 3 ) === 'ные' ) {
+ word = word.substr(0, word.length - 3 ) + 'ных';
+ } else if ( word.substr( word.length - 3 ) === 'ник' ) {
+ word = word.substr(0, word.length - 3 ) + 'нике';
+ }
break;
}
return word;
diff --git a/resources/mediawiki.language/languages/sl.js b/resources/mediawiki.language/languages/sl.js
index acd00bfd..fb335b6a 100644
--- a/resources/mediawiki.language/languages/sl.js
+++ b/resources/mediawiki.language/languages/sl.js
@@ -2,10 +2,10 @@
* Slovenian (SlovenÅ¡Äina) language functions
*/
-mediaWiki.language.convertGrammar = function( word, form ) {
- var grammarForms = mw.language.getData( 'sl', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+ var grammarForms = mediaWiki.language.getData( 'sl', 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
- return grammarForms[form][word] ;
+ return grammarForms[form][word];
}
switch ( form ) {
case 'mestnik': // locative
diff --git a/resources/mediawiki.language/languages/uk.js b/resources/mediawiki.language/languages/uk.js
index ee110b06..5e56b66f 100644
--- a/resources/mediawiki.language/languages/uk.js
+++ b/resources/mediawiki.language/languages/uk.js
@@ -2,33 +2,35 @@
* Ukrainian (УкраїнÑька) language functions
*/
-mediaWiki.language.convertGrammar = function( word, form ) {
- var grammarForms = mw.language.getData( 'uk', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+ /*jshint noempty:false */
+ var grammarForms = mediaWiki.language.getData( 'uk', 'grammarForms' );
if ( grammarForms && grammarForms[form] ) {
- return grammarForms[form][word] ;
+ return grammarForms[form][word];
}
switch ( form ) {
case 'genitive': // родовий відмінок
- if ( ( word.substr( word.length - 4 ) == 'вікі' ) || ( word.substr( word.length - 4 ) == 'Вікі' ) ) {
- }
- else if ( word.substr( word.length - 1 ) == 'ь' )
+ if ( ( word.substr( word.length - 4 ) === 'вікі' ) || ( word.substr( word.length - 4 ) === 'Вікі' ) ) {
+ } else if ( word.substr( word.length - 1 ) === 'ь' ) {
word = word.substr(0, word.length - 1 ) + 'Ñ';
- else if ( word.substr( word.length - 2 ) == 'Ñ–Ñ' )
+ } else if ( word.substr( word.length - 2 ) === 'Ñ–Ñ' ) {
word = word.substr(0, word.length - 2 ) + 'Ñ–Ñ—';
- else if ( word.substr( word.length - 2 ) == 'ка' )
+ } else if ( word.substr( word.length - 2 ) === 'ка' ) {
word = word.substr(0, word.length - 2 ) + 'ки';
- else if ( word.substr( word.length - 2 ) == 'ти' )
+ } else if ( word.substr( word.length - 2 ) === 'ти' ) {
word = word.substr(0, word.length - 2 ) + 'тей';
- else if ( word.substr( word.length - 2 ) == 'ды' )
+ } else if ( word.substr( word.length - 2 ) === 'ды' ) {
word = word.substr(0, word.length - 2 ) + 'дов';
- else if ( word.substr( word.length - 3 ) == 'ник' )
+ } else if ( word.substr( word.length - 3 ) === 'ник' ) {
word = word.substr(0, word.length - 3 ) + 'ника';
+ }
break;
case 'accusative': // знахідний відмінок
- if ( ( word.substr( word.length - 4 ) == 'вікі' ) || ( word.substr( word.length - 4 ) == 'Вікі' ) ) {
+ if ( ( word.substr( word.length - 4 ) === 'вікі' ) || ( word.substr( word.length - 4 ) === 'Вікі' ) ) {
}
- else if ( word.substr( word.length - 2 ) == 'Ñ–Ñ' )
+ else if ( word.substr( word.length - 2 ) === 'Ñ–Ñ' ) {
word = word.substr(0, word.length - 2 ) + 'Ñ–ÑŽ';
+ }
break;
}
return word;
diff --git a/resources/mediawiki.language/mediawiki.cldr.js b/resources/mediawiki.language/mediawiki.cldr.js
index 6660eca4..c3023cd5 100644
--- a/resources/mediawiki.language/mediawiki.cldr.js
+++ b/resources/mediawiki.language/mediawiki.cldr.js
@@ -1,8 +1,8 @@
/**
- * CLDR related utility methods
+ * CLDR related utility methods.
*/
-( function( mw ) {
- "use strict";
+( function ( mw ) {
+ 'use strict';
var cldr = {
/**
@@ -10,19 +10,20 @@
* In case none of the rules passed, we return pluralRules.length
* That means it is the "other" form.
* @param number
- * @param pluralRules
- * @return plural form index
+ * @param {Array} pluralRules
+ * @return {number} plural form index
*/
- getPluralForm: function( number, pluralRules ) {
- var pluralFormIndex = 0;
- for ( pluralFormIndex = 0; pluralFormIndex < pluralRules.length; pluralFormIndex++ ) {
- if ( mw.libs.pluralRuleParser( pluralRules[pluralFormIndex], number ) ) {
+ getPluralForm: function ( number, pluralRules ) {
+ var i;
+ for ( i = 0; i < pluralRules.length; i++ ) {
+ if ( mw.libs.pluralRuleParser( pluralRules[i], number ) ) {
break;
}
}
- return pluralFormIndex;
+ return i;
}
};
mw.cldr = cldr;
-} )( mediaWiki );
+
+}( mediaWiki ) );
diff --git a/resources/mediawiki.language/mediawiki.language.init.js b/resources/mediawiki.language/mediawiki.language.init.js
index 30307a37..937b89bb 100644
--- a/resources/mediawiki.language/mediawiki.language.init.js
+++ b/resources/mediawiki.language/mediawiki.language.init.js
@@ -2,7 +2,7 @@
* Base language object with methods for storing and getting
* language data.
*/
-( function ( mw, $ ) {
+( function ( mw ) {
var language = {
/**
@@ -58,4 +58,4 @@
mw.language = language;
-}( mediaWiki, jQuery ) );
+}( mediaWiki ) );
diff --git a/resources/mediawiki.language/mediawiki.language.js b/resources/mediawiki.language/mediawiki.language.js
index 935d4ff6..7f729bdc 100644
--- a/resources/mediawiki.language/mediawiki.language.js
+++ b/resources/mediawiki.language/mediawiki.language.js
@@ -43,12 +43,14 @@ var language = {
* @param forms array List of plural forms
* @return string Correct form for quantifier in this language
*/
- convertPlural: function( count, forms ) {
- var pluralFormIndex = 0;
+ convertPlural: function ( count, forms ) {
+ var pluralRules,
+ pluralFormIndex = 0;
+
if ( !forms || forms.length === 0 ) {
return '';
}
- var pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
+ pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
if ( !pluralRules ) {
// default fallback.
return ( count === 1 ) ? forms[0] : forms[1];
@@ -73,43 +75,6 @@ var language = {
},
/**
- * Converts a number using digitTransformTable.
- *
- * @param {num} number Value to be converted
- * @param {boolean} integer Convert the return value to an integer
- */
- convertNumber: function( num, integer ) {
- var i, tmp, transformTable;
-
- if ( !mw.language.digitTransformTable ) {
- return num;
- }
- // Set the target Transform table:
- transformTable = mw.language.digitTransformTable;
- // Check if the "restore" to Latin number flag is set:
- if ( integer ) {
- if ( parseInt( num, 10 ) === num ) {
- return num;
- }
- tmp = [];
- for ( i in transformTable ) {
- tmp[ transformTable[ i ] ] = i;
- }
- transformTable = tmp;
- }
- var numberString = '' + num;
- var convertedNumber = '';
- for ( i = 0; i < numberString.length; i++ ) {
- if ( transformTable[ numberString[i] ] ) {
- convertedNumber += transformTable[numberString[i]];
- } else {
- convertedNumber += numberString[i];
- }
- }
- return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
- },
-
- /**
* Provides an alternative text depending on specified gender.
* Usage {{gender:[gender|user object]|masculine|feminine|neutral}}.
* If second or third parameter are not specified, masculine is used.
@@ -121,7 +86,7 @@ var language = {
*
* @return string
*/
- gender: function( gender, forms ) {
+ gender: function ( gender, forms ) {
if ( !forms || forms.length === 0 ) {
return '';
}
@@ -151,10 +116,8 @@ var language = {
return grammarForms[form][word] || word;
}
return word;
- },
+ }
- // Digit Transform Table, populated by language classes where applicable
- digitTransformTable: mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'digitTransformTable' )
};
$.extend( mw.language, language );
diff --git a/resources/mediawiki.language/mediawiki.language.numbers.js b/resources/mediawiki.language/mediawiki.language.numbers.js
new file mode 100644
index 00000000..fada6ce1
--- /dev/null
+++ b/resources/mediawiki.language/mediawiki.language.numbers.js
@@ -0,0 +1,243 @@
+/*
+ * Number related utilities for mediawiki.language
+ */
+( function ( mw, $ ) {
+
+ /**
+ * Pad a string to guarantee that it is at least `size` length by
+ * filling with the character `ch` at either the start or end of the
+ * string. Pads at the start, by default.
+ * example:
+ * Fill the string to length 10 with '+' characters on the right. Yields 'blah++++++'.
+ * pad('blah', 10, '+', true);
+ *
+ * @param {string} text The string to pad
+ * @param {Number} size To provide padding
+ * @param {string} ch Character to pad, defaults to '0'
+ * @param {Boolean} end Adds padding at the end if true, otherwise pads at start
+ * @return {string}
+ */
+ function pad ( text, size, ch, end ) {
+ if ( !ch ) {
+ ch = '0';
+ }
+
+ var out = String( text ),
+ padStr = replicate( ch, Math.ceil( ( size - out.length ) / ch.length ) );
+
+ return end ? out + padStr : padStr + out;
+ }
+
+ /**
+ * Efficiently replicate a string n times.
+ *
+ * @param {string} str The string to replicate
+ * @param {Number} num Number of times to replicate the string
+ * @return {string}
+ */
+ function replicate ( str, num ) {
+ if ( num <= 0 || !str ) {
+ return '';
+ }
+
+ var buf = [];
+ while (num) {
+ buf.push( str );
+ str += str;
+ }
+ return buf.join( '' );
+ }
+
+ /**
+ * Apply numeric pattern to absolute value using options. Gives no
+ * consideration to local customs.
+ *
+ * Adapted from dojo/number library with thanks
+ * http://dojotoolkit.org/reference-guide/1.8/dojo/number.html
+ *
+ * @param {Number} value the number to be formatted, ignores sign
+ * @param {string} pattern the number portion of a pattern (e.g. `#,##0.00`)
+ * @param {string} options.decimalThe decimal separator
+ * @param {string} options.group The group separator
+ *
+ * @return {string}
+ */
+ function commafyNumber( value, pattern, options ) {
+ options = options || {
+ group: ',',
+ decimal: '.'
+ };
+
+ if ( isNaN( value) ) {
+ return value;
+ }
+
+ var padLength,
+ patternDigits,
+ index,
+ whole,
+ off,
+ remainder,
+ patternParts = pattern.split( '.' ),
+ maxPlaces = ( patternParts[1] || [] ).length,
+ valueParts = String( Math.abs( value ) ).split( '.' ),
+ fractional = valueParts[1] || '',
+ groupSize = 0,
+ groupSize2 = 0,
+ pieces = [];
+
+ if ( patternParts[1] ) {
+ // Pad fractional with trailing zeros
+ padLength = ( patternParts[1] && patternParts[1].lastIndexOf( '0' ) + 1 );
+
+ if ( padLength > fractional.length ) {
+ valueParts[1] = pad( fractional, padLength, '0', true );
+ }
+
+ // Truncate fractional
+ if ( maxPlaces < fractional.length ) {
+ valueParts[1] = fractional.substr( 0, maxPlaces );
+ }
+ } else {
+ if ( valueParts[1] ) {
+ valueParts.pop();
+ }
+ }
+
+ // Pad whole with leading zeros
+ patternDigits = patternParts[0].replace( ',', '' );
+
+ padLength = patternDigits.indexOf( '0' );
+
+ if ( padLength !== -1 ) {
+ padLength = patternDigits.length - padLength;
+
+ if ( padLength > valueParts[0].length ) {
+ valueParts[0] = pad( valueParts[0], padLength );
+ }
+
+ // Truncate whole
+ if ( patternDigits.indexOf( '#' ) === -1 ) {
+ valueParts[0] = valueParts[0].substr( valueParts[0].length - padLength );
+ }
+ }
+
+ // Add group separators
+ index = patternParts[0].lastIndexOf( ',' );
+
+ if ( index !== -1 ) {
+ groupSize = patternParts[0].length - index - 1;
+ remainder = patternParts[0].substr( 0, index );
+ index = remainder.lastIndexOf( ',' );
+ if ( index !== -1 ) {
+ groupSize2 = remainder.length - index - 1;
+ }
+ }
+
+ for ( whole = valueParts[0]; whole; ) {
+ off = whole.length - groupSize;
+
+ pieces.push( ( off > 0 ) ? whole.substr( off ) : whole );
+ whole = ( off > 0 ) ? whole.slice( 0, off ) : '';
+
+ if ( groupSize2 ) {
+ groupSize = groupSize2;
+ }
+ }
+ valueParts[0] = pieces.reverse().join( options.group );
+
+ return valueParts.join( options.decimal );
+ }
+
+ $.extend( mw.language, {
+
+ /**
+ * Converts a number using digitTransformTable.
+ *
+ * @param {Number} num Value to be converted
+ * @param {boolean} integer Convert the return value to an integer
+ * @return {Number|string} Formatted number
+ */
+ convertNumber: function ( num, integer ) {
+ var i, tmp, transformTable, numberString, convertedNumber, pattern;
+
+ pattern = mw.language.getData( mw.config.get( 'wgUserLanguage' ),
+ 'digitGroupingPattern' ) || '#,##0.###';
+
+ // Set the target transform table:
+ transformTable = mw.language.getDigitTransformTable();
+
+ if ( !transformTable ) {
+ return num;
+ }
+
+ // Check if the 'restore' to Latin number flag is set:
+ if ( integer ) {
+ if ( parseInt( num, 10 ) === num ) {
+ return num;
+ }
+ tmp = [];
+ for ( i in transformTable ) {
+ tmp[ transformTable[ i ] ] = i;
+ }
+ transformTable = tmp;
+ numberString = num + '';
+ } else {
+ numberString = mw.language.commafy( num, pattern );
+ }
+
+ convertedNumber = '';
+ for ( i = 0; i < numberString.length; i++ ) {
+ if ( transformTable[ numberString[i] ] ) {
+ convertedNumber += transformTable[numberString[i]];
+ } else {
+ convertedNumber += numberString[i];
+ }
+ }
+ return integer ? parseInt( convertedNumber, 10 ) : convertedNumber;
+ },
+
+ getDigitTransformTable: function () {
+ return mw.language.getData( mw.config.get( 'wgUserLanguage' ),
+ 'digitTransformTable' ) || [];
+ },
+
+ getSeparatorTransformTable: function () {
+ return mw.language.getData( mw.config.get( 'wgUserLanguage' ),
+ 'separatorTransformTable' ) || [];
+ },
+
+ /**
+ * Apply pattern to format value as a string using as per
+ * unicode.org TR35 - http://www.unicode.org/reports/tr35/#Number_Format_Patterns.
+ *
+ * @param {Number} value
+ * @param {string} pattern Pattern string as described by Unicode TR35
+ * @throws Error
+ * @returns {String}
+ */
+ commafy: function ( value, pattern ) {
+ var numberPattern,
+ transformTable = mw.language.getSeparatorTransformTable(),
+ group = transformTable[','] || ',',
+ numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/, // not precise, but good enough
+ decimal = transformTable['.'] || '.',
+ patternList = pattern.split( ';' ),
+ positivePattern = patternList[0];
+
+ pattern = patternList[ ( value < 0 ) ? 1 : 0] || ( '-' + positivePattern );
+ numberPattern = positivePattern.match( numberPatternRE );
+
+ if ( !numberPattern ) {
+ throw new Error( 'unable to find a number expression in pattern: ' + pattern );
+ }
+
+ return pattern.replace( numberPatternRE, commafyNumber( value, numberPattern[0], {
+ decimal: decimal,
+ group: group
+ } ) );
+ }
+
+ } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.libs/CLDRPluralRuleParser.js b/resources/mediawiki.libs/CLDRPluralRuleParser.js
index 91bdc07d..441bc91f 100644
--- a/resources/mediawiki.libs/CLDRPluralRuleParser.js
+++ b/resources/mediawiki.libs/CLDRPluralRuleParser.js
@@ -207,6 +207,7 @@ function pluralRuleParser(rule, number) {
}
function range() {
+ var i;
var result = sequence([digits, _range_, digits]);
if (result !== null) {
debug(" -- passed range");
diff --git a/resources/mediawiki.page/mediawiki.page.patrol.ajax.js b/resources/mediawiki.page/mediawiki.page.patrol.ajax.js
new file mode 100644
index 00000000..d7a07d71
--- /dev/null
+++ b/resources/mediawiki.page/mediawiki.page.patrol.ajax.js
@@ -0,0 +1,63 @@
+/**
+ * Animate patrol links to use asynchronous API requests to
+ * patrol pages, rather than navigating to a different URI.
+ *
+ * @since 1.21
+ * @author Marius Hoch <hoo@online.de>
+ */
+( function ( mw, $ ) {
+ if ( !mw.user.tokens.exists( 'patrolToken' ) ) {
+ // Current user has no patrol right, or an old cached version of user.tokens
+ // that didn't have patrolToken yet.
+ return;
+ }
+ $( document ).ready( function () {
+ var $patrolLinks = $( '.patrollink a' );
+ $patrolLinks.on( 'click', function ( e ) {
+ var $spinner, href, rcid, apiRequest;
+
+ // Hide the link and create a spinner to show it inside the brackets.
+ $spinner = $.createSpinner( {
+ size: 'small',
+ type: 'inline'
+ } );
+ $( this ).hide().after( $spinner );
+
+ href = $( this ).attr( 'href' );
+ rcid = mw.util.getParamValue( 'rcid', href );
+ apiRequest = new mw.Api();
+
+ apiRequest.post( {
+ action: 'patrol',
+ token: mw.user.tokens.get( 'patrolToken' ),
+ rcid: rcid
+ } )
+ .done( function ( data ) {
+ // Remove all patrollinks from the page (including any spinners inside).
+ $patrolLinks.closest( '.patrollink' ).remove();
+ if ( data.patrol !== undefined ) {
+ // Success
+ var title = new mw.Title( data.patrol.title );
+ mw.notify( mw.msg( 'markedaspatrollednotify', title.toText() ) );
+ } else {
+ // This should never happen as errors should trigger fail
+ mw.notify( mw.msg( 'markedaspatrollederrornotify' ) );
+ }
+ } )
+ .fail( function ( error ) {
+ $spinner.remove();
+ // Restore the patrol link. This allows the user to try again
+ // (or open it in a new window, bypassing this ajax module).
+ $patrolLinks.show();
+ if ( error === 'noautopatrol' ) {
+ // Can't patrol own
+ mw.notify( mw.msg( 'markedaspatrollederror-noautopatrol' ) );
+ } else {
+ mw.notify( mw.msg( 'markedaspatrollederrornotify' ) );
+ }
+ } );
+
+ e.preventDefault();
+ } );
+ } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.page/mediawiki.page.ready.js b/resources/mediawiki.page/mediawiki.page.ready.js
index 370c3a19..684f582f 100644
--- a/resources/mediawiki.page/mediawiki.page.ready.js
+++ b/resources/mediawiki.page/mediawiki.page.ready.js
@@ -1,24 +1,28 @@
-jQuery( document ).ready( function( $ ) {
+( function ( mw, $ ) {
+ $( function () {
+ var $sortableTables;
- /* Emulate placeholder if not supported by browser */
- if ( !( 'placeholder' in document.createElement( 'input' ) ) ) {
- $( 'input[placeholder]' ).placeholder();
- }
+ /* Emulate placeholder if not supported by browser */
+ if ( !( 'placeholder' in document.createElement( 'input' ) ) ) {
+ $( 'input[placeholder]' ).placeholder();
+ }
- /* Enable makeCollapsible */
- $( '.mw-collapsible' ).makeCollapsible();
+ /* Enable makeCollapsible */
+ $( '.mw-collapsible' ).makeCollapsible();
- /* Lazy load jquery.tablesorter */
- if ( $( 'table.sortable' ).length ) {
- mw.loader.using( 'jquery.tablesorter', function() {
- $( 'table.sortable' ).tablesorter();
- });
- }
+ /* Lazy load jquery.tablesorter */
+ $sortableTables = $( 'table.sortable' );
+ if ( $sortableTables.length ) {
+ mw.loader.using( 'jquery.tablesorter', function () {
+ $sortableTables.tablesorter();
+ });
+ }
- /* Enable CheckboxShiftClick */
- $( 'input[type=checkbox]:not(.noshiftselect)' ).checkboxShiftClick();
+ /* Enable CheckboxShiftClick */
+ $( 'input[type=checkbox]:not(.noshiftselect)' ).checkboxShiftClick();
- /* Add accesskey hints to the tooltips */
- mw.util.updateTooltipAccessKeys();
+ /* Add accesskey hints to the tooltips */
+ mw.util.updateTooltipAccessKeys();
-} );
+ } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.page/mediawiki.page.watch.ajax.js b/resources/mediawiki.page/mediawiki.page.watch.ajax.js
index a7e059c4..f945fa9d 100644
--- a/resources/mediawiki.page/mediawiki.page.watch.ajax.js
+++ b/resources/mediawiki.page/mediawiki.page.watch.ajax.js
@@ -24,13 +24,14 @@
otherAction = action === 'watch' ? 'unwatch' : 'watch';
accesskeyTip = $link.attr( 'title' ).match( mw.util.tooltipAccessKeyRegexp );
$li = $link.closest( 'li' );
+
/**
* Trigger a 'watchpage' event for this List item.
* Announce the otherAction value as the first param.
* Used to monitor the state of watch link.
* TODO: Revise when system wide hooks are implemented
*/
- if( state === undefined ) {
+ if ( state === undefined ) {
$li.trigger( 'watchpage.mw', otherAction );
}
@@ -96,7 +97,7 @@
// Expose local methods
mw.page.watch = {
- 'updateWatchLink': updateWatchLink
+ updateWatchLink: updateWatchLink
};
$( document ).ready( function () {
@@ -134,7 +135,9 @@
otherAction = action === 'watch' ? 'unwatch' : 'watch';
$li = $link.closest( 'li' );
- mw.notify( $.parseHTML( watchResponse.message ), { tag: 'watch-self' } );
+ mw.notify( $.parseHTML( watchResponse.message ), {
+ tag: 'watch-self'
+ } );
// Set link to opposite
updateWatchLink( $link, otherAction );
@@ -144,7 +147,7 @@
if ( watchResponse.watched !== undefined ) {
$( '#wpWatchthis' ).prop( 'checked', true );
} else {
- $( '#wpWatchthis' ).removeProp( 'checked' );
+ $( '#wpWatchthis' ).prop( 'checked', false );
}
},
// Error
@@ -162,14 +165,14 @@
title: cleanTitle
}, cleanTitle
);
- msg = mw.messsage( 'watcherrortext', link );
+ msg = mw.message( 'watcherrortext', link );
// Report to user about the error
mw.notify( msg, { tag: 'watch-self' } );
}
);
- });
- });
+ } );
+ } );
}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.block.js b/resources/mediawiki.special/mediawiki.special.block.js
index 6f79929b..2a158dfb 100644
--- a/resources/mediawiki.special/mediawiki.special.block.js
+++ b/resources/mediawiki.special/mediawiki.special.block.js
@@ -1,46 +1,46 @@
-/* JavaScript for Special:Block */
+/**
+ * JavaScript for Special:Block
+ */
+( function ( mw, $ ) {
+ $( document ).ready( function () {
+ var $blockTarget = $( '#mw-bi-target' ),
+ $anonOnlyRow = $( '#mw-input-wpHardBlock' ).closest( 'tr' ),
+ $enableAutoblockRow = $( '#mw-input-wpAutoBlock' ).closest( 'tr' ),
+ $hideUser = $( '#mw-input-wpHideUser' ).closest( 'tr' ),
+ $watchUser = $( '#mw-input-wpWatch' ).closest( 'tr' );
-jQuery( function( $ ) {
+ function updateBlockOptions( instant ) {
+ var blocktarget = $.trim( $blockTarget.val() ),
+ isEmpty = blocktarget === '',
+ isIp = mw.util.isIPv4Address( blocktarget, true ) || mw.util.isIPv6Address( blocktarget, true ),
+ isIpRange = isIp && blocktarget.match( /\/\d+$/ );
- var DO_INSTANT = true,
- $blockTarget = $( '#mw-bi-target' ),
- $anonOnlyRow = $( '#mw-input-wpHardBlock' ).closest( 'tr' ),
- $enableAutoblockRow = $( '#mw-input-wpAutoBlock' ).closest( 'tr' ),
- $hideUser = $( '#mw-input-wpHideUser' ).closest( 'tr' ),
- $watchUser = $( '#mw-input-wpWatch' ).closest( 'tr' );
-
- var updateBlockOptions = function( instant ) {
- if ( !$blockTarget.length ) {
- return;
+ if ( isIp && !isEmpty ) {
+ $enableAutoblockRow.goOut( instant );
+ $hideUser.goOut( instant );
+ } else {
+ $enableAutoblockRow.goIn( instant );
+ $hideUser.goIn( instant );
+ }
+ if ( !isIp && !isEmpty ) {
+ $anonOnlyRow.goOut( instant );
+ } else {
+ $anonOnlyRow.goIn( instant );
+ }
+ if ( isIpRange && !isEmpty ) {
+ $watchUser.goOut( instant );
+ } else {
+ $watchUser.goIn( instant );
+ }
}
- var blocktarget = $.trim( $blockTarget.val() );
- var isEmpty = ( blocktarget === '' );
- var isIp = mw.util.isIPv4Address( blocktarget, true ) || mw.util.isIPv6Address( blocktarget, true );
- var isIpRange = isIp && blocktarget.match( /\/\d+$/ );
+ if ( $blockTarget.length ) {
+ // Bind functions so they're checked whenever stuff changes
+ $blockTarget.keyup( updateBlockOptions );
- if ( isIp && !isEmpty ) {
- $enableAutoblockRow.goOut( instant );
- $hideUser.goOut( instant );
- } else {
- $enableAutoblockRow.goIn( instant );
- $hideUser.goIn( instant );
- }
- if ( !isIp && !isEmpty ) {
- $anonOnlyRow.goOut( instant );
- } else {
- $anonOnlyRow.goIn( instant );
+ // Call them now to set initial state (ie. Special:Block/Foobar?wpBlockExpiry=2+hours)
+ updateBlockOptions( /* instant= */ true );
}
- if ( isIpRange && !isEmpty ) {
- $watchUser.goOut( instant );
- } else {
- $watchUser.goIn( instant );
- }
- };
-
- // Bind functions so they're checked whenever stuff changes
- $blockTarget.keyup( updateBlockOptions );
+ } );
+}( mediaWiki, jQuery ) );
- // Call them now to set initial state (ie. Special:Block/Foobar?wpBlockExpiry=2+hours)
- updateBlockOptions( DO_INSTANT );
-});
diff --git a/resources/mediawiki.special/mediawiki.special.changeemail.js b/resources/mediawiki.special/mediawiki.special.changeemail.js
index cab0bbd3..14c2f036 100644
--- a/resources/mediawiki.special/mediawiki.special.changeemail.js
+++ b/resources/mediawiki.special/mediawiki.special.changeemail.js
@@ -1,42 +1,42 @@
-/*
+/**
* JavaScript for Special:ChangeEmail
*/
( function ( mw, $ ) {
+ /**
+ * Given an email validity status (true, false, null) update the label CSS class
+ */
+ function updateMailValidityLabel( mail ) {
+ var isValid = mw.util.validateEmail( mail ),
+ $label = $( '#mw-emailaddress-validity' );
-/**
- * Given an email validity status (true, false, null) update the label CSS class
- */
-function updateMailValidityLabel( mail ) {
- var isValid = mw.util.validateEmail( mail ),
- $label = $( '#mw-emailaddress-validity' );
-
- // We allow empty address
- if( isValid === null ) {
- $label.text( '' ).removeClass( 'valid invalid' );
+ // We allow empty address
+ if ( isValid === null ) {
+ $label.text( '' ).removeClass( 'valid invalid' );
- // Valid
- } else if ( isValid ) {
- $label.text( mw.msg( 'email-address-validity-valid' ) ).addClass( 'valid' ).removeClass( 'invalid' );
+ // Valid
+ } else if ( isValid ) {
+ $label.text( mw.msg( 'email-address-validity-valid' ) ).addClass( 'valid' ).removeClass( 'invalid' );
- // Not valid
- } else {
- $label.text( mw.msg( 'email-address-validity-invalid' ) ).addClass( 'invalid' ).removeClass( 'valid' );
+ // Not valid
+ } else {
+ $label.text( mw.msg( 'email-address-validity-invalid' ) ).addClass( 'invalid' ).removeClass( 'valid' );
+ }
}
-}
-$( document ).ready( function () {
- // Lame tip to let user know if its email is valid. See bug 22449
- // Only bind once for 'blur' so that the user can fill it in without errors
- // After that look at every keypress for direct feedback if it was invalid onblur
- $( '#wpNewEmail' ).one( 'blur', function () {
- if ( $( '#mw-emailaddress-validity' ).length === 0 ) {
- $(this).after( '<label for="wpNewEmail" id="mw-emailaddress-validity"></label>' );
- }
- updateMailValidityLabel( $(this).val() );
- $(this).keyup( function () {
- updateMailValidityLabel( $(this).val() );
+ $( document ).ready( function () {
+ // Lame tip to let user know if its email is valid. See bug 22449.
+ // Only bind once for 'blur' so that the user can fill it in without errors;
+ // after that, look at every keypress for immediate feedback.
+ $( '#wpNewEmail' ).one( 'blur', function () {
+ var $this = $( this );
+ if ( $( '#mw-emailaddress-validity' ).length === 0 ) {
+ $this.after( '<label for="wpNewEmail" id="mw-emailaddress-validity"></label>' );
+ }
+
+ updateMailValidityLabel( $this.val() );
+ $this.keyup( function () {
+ updateMailValidityLabel( $this.val() );
+ } );
} );
} );
-} );
-
}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.css b/resources/mediawiki.special/mediawiki.special.changeslist.css
index 8a5421e8..fcdeba1b 100644
--- a/resources/mediawiki.special/mediawiki.special.changeslist.css
+++ b/resources/mediawiki.special/mediawiki.special.changeslist.css
@@ -31,12 +31,12 @@ table.mw-enhanced-rc td.mw-enhanced-rc-nested {
float: none;
}
-/* If JS is disabled, the arrow shouldn't be shown */
-.client-nojs .mw-enhancedchanges-arrow.mw-collapsible-toggle {
+/* If JS is disabled, the arrows or the placeholder space shouldn't be shown */
+.client-nojs .mw-enhancedchanges-arrow-space {
display: none;
}
-.mw-enhancedchanges-arrow {
+.mw-enhancedchanges-arrow-space {
display: inline-block;
*display: inline; /* IE7 and below */
zoom: 1;
@@ -44,8 +44,9 @@ table.mw-enhanced-rc td.mw-enhanced-rc-nested {
height: 15px;
}
-.mw-enhancedchanges-arrow.mw-enhancedchanges-arrow-space {
- background: none;
+/* let it look like it is clickable */
+.mw-enhancedchanges-arrow.mw-collapsible-toggle {
+ cursor: pointer;
}
.mw-enhancedchanges-arrow.mw-collapsible-toggle-collapsed {
diff --git a/resources/mediawiki.special/mediawiki.special.javaScriptTest.js b/resources/mediawiki.special/mediawiki.special.javaScriptTest.js
index 808d5fe8..a560ca95 100644
--- a/resources/mediawiki.special/mediawiki.special.javaScriptTest.js
+++ b/resources/mediawiki.special/mediawiki.special.javaScriptTest.js
@@ -8,7 +8,7 @@
// (only if a framework was found, not on error pages).
$( '#mw-javascripttest-summary.mw-javascripttest-frameworkfound' ).append( function () {
- var $html = $( '<p><label for="useskin">'
+ var $html = $( '<p><label for="useskin">'
+ mw.message( 'javascripttest-pagetext-skins' ).escaped()
+ ' '
+ '</label></p>' ),
diff --git a/resources/mediawiki.special/mediawiki.special.js b/resources/mediawiki.special/mediawiki.special.js
index 3526cef4..8edb1cbe 100644
--- a/resources/mediawiki.special/mediawiki.special.js
+++ b/resources/mediawiki.special/mediawiki.special.js
@@ -1 +1,5 @@
-mw.special = {};
+/*
+ * Namespace for mediawiki.special.* modules
+ */
+
+mediaWiki.special = {};
diff --git a/resources/mediawiki.special/mediawiki.special.movePage.js b/resources/mediawiki.special/mediawiki.special.movePage.js
index 68c2ed07..f719d07c 100644
--- a/resources/mediawiki.special/mediawiki.special.movePage.js
+++ b/resources/mediawiki.special/mediawiki.special.movePage.js
@@ -1,5 +1,6 @@
-/* JavaScript for Special:MovePage */
-
-jQuery( function( $ ) {
+/**
+ * JavaScript for Special:MovePage
+ */
+jQuery( document ).ready( function ( $ ) {
$( '#wpReason, #wpNewTitleMain' ).byteLimit();
-});
+} );
diff --git a/resources/mediawiki.special/mediawiki.special.preferences.js b/resources/mediawiki.special/mediawiki.special.preferences.js
index 47872907..6eaec6a1 100644
--- a/resources/mediawiki.special/mediawiki.special.preferences.js
+++ b/resources/mediawiki.special/mediawiki.special.preferences.js
@@ -1,175 +1,199 @@
-/*
+/**
* JavaScript for Special:Preferences
*/
jQuery( document ).ready( function ( $ ) {
-$( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
-var $preftoc = $('<ul id="preftoc"></ul>');
-var $preferences = $( '#preferences' )
- .addClass( 'jsprefs' )
- .before( $preftoc );
-
-var $fieldsets = $preferences.children( 'fieldset' )
- .hide()
- .addClass( 'prefsection' );
+ var $preftoc, $preferences, $fieldsets, $legends,
+ hash,
+ $tzSelect, $tzTextbox, $localtimeHolder, servertime;
+
+ $( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
+
+ $preftoc = $('<ul id="preftoc"></ul>');
+ $preferences = $( '#preferences' )
+ .addClass( 'jsprefs' )
+ .before( $preftoc );
+ $fieldsets = $preferences.children( 'fieldset' )
+ .hide()
+ .addClass( 'prefsection' );
+ $legends = $fieldsets
+ .children( 'legend' )
+ .addClass( 'mainLegend' );
+
+ /**
+ * It uses document.getElementById for security reasons (HTML injections in $()).
+ *
+ * @param String name: the name of a tab without the prefix ("mw-prefsection-")
+ * @param String mode: [optional] A hash will be set according to the current
+ * open section. Set mode 'noHash' to surpress this.
+ */
+ function switchPrefTab( name, mode ) {
+ var $tab, scrollTop;
+ // Handle hash manually to prevent jumping,
+ // therefore save and restore scrollTop to prevent jumping.
+ scrollTop = $( window ).scrollTop();
+ if ( mode !== 'noHash' ) {
+ window.location.hash = '#mw-prefsection-' + name;
+ }
+ $( window ).scrollTop( scrollTop );
+
+ $preftoc.find( 'li' ).removeClass( 'selected' );
+ $tab = $( document.getElementById( 'preftab-' + name ) );
+ if ( $tab.length ) {
+ $tab.parent().addClass( 'selected' );
+ $preferences.children( 'fieldset' ).hide();
+ $( document.getElementById( 'mw-prefsection-' + name ) ).show();
+ }
+ }
-var $legends = $fieldsets.children( 'legend' )
- .addClass( 'mainLegend' );
+ // Populate the prefToc
+ $legends.each( function ( i, legend ) {
+ var $legend = $(legend),
+ ident, $li, $a;
+ if ( i === 0 ) {
+ $legend.parent().show();
+ }
+ ident = $legend.parent().attr( 'id' );
+
+ $li = $( '<li>' )
+ .addClass( i === 0 ? 'selected' : '' );
+ $a = $( '<a>' )
+ .attr( {
+ id: ident.replace( 'mw-prefsection', 'preftab' ),
+ href: '#' + ident
+ } )
+ .text( $legend.text() );
+ $li.append( $a );
+ $preftoc.append( $li );
+ } );
+
+ // If we've reloaded the page or followed an open-in-new-window,
+ // make the selected tab visible.
+ hash = window.location.hash;
+ if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
+ switchPrefTab( hash.replace( '#mw-prefsection-' , '' ) );
+ }
-/**
- * It uses document.getElementById for security reasons (html injections in
- * jQuery()).
- *
- * @param String name: the name of a tab without the prefix ("mw-prefsection-")
- * @param String mode: [optional] A hash will be set according to the current
- * open section. Set mode 'noHash' to surpress this.
- */
-function switchPrefTab( name, mode ) {
- var $tab, scrollTop;
- // Handle hash manually to prevent jumping,
- // therefore save and restore scrollTop to prevent jumping.
- scrollTop = $( window ).scrollTop();
- if ( mode !== 'noHash' ) {
- window.location.hash = '#mw-prefsection-' + name;
+ // In browsers that support the onhashchange event we will not bind click
+ // handlers and instead let the browser do the default behavior (clicking the
+ // <a href="#.."> will naturally set the hash, handled by onhashchange.
+ // But other things that change the hash will also be catched (e.g. using
+ // the Back and Forward browser navigation).
+ // Note the special check for IE "compatibility" mode.
+ if ( 'onhashchange' in window &&
+ ( document.documentMode === undefined || document.documentMode >= 8 )
+ ) {
+ $(window).on( 'hashchange' , function () {
+ var hash = window.location.hash;
+ if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
+ switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
+ } else if ( hash === '' ) {
+ switchPrefTab( 'personal', 'noHash' );
+ }
+ });
+ // In older browsers we'll bind a click handler as fallback.
+ // We must not have onhashchange *and* the click handlers, other wise
+ // the click handler calls switchPrefTab() which sets the hash value,
+ // which triggers onhashcange and calls switchPrefTab() again.
+ } else {
+ $preftoc.on( 'click', 'li a', function ( e ) {
+ switchPrefTab( $( this ).attr( 'href' ).replace( '#mw-prefsection-', '' ) );
+ e.preventDefault();
+ });
}
- $( window ).scrollTop( scrollTop );
-
- $preftoc.find( 'li' ).removeClass( 'selected' );
- $tab = $( document.getElementById( 'preftab-' + name ) );
- if ( $tab.length ) {
- $tab.parent().addClass( 'selected' );
- $preferences.children( 'fieldset' ).hide();
- $( document.getElementById( 'mw-prefsection-' + name ) ).show();
+
+ /**
+ * Timezone functions.
+ * Guesses Timezone from browser and updates fields onchange
+ */
+
+ $tzSelect = $( '#mw-input-wptimecorrection' );
+ $tzTextbox = $( '#mw-input-wptimecorrection-other' );
+ $localtimeHolder = $( '#wpLocalTime' );
+ servertime = parseInt( $( 'input[name="wpServerTime"]' ).val(), 10 );
+
+ function minutesToHours( min ) {
+ var tzHour = Math.floor( Math.abs( min ) / 60 ),
+ tzMin = Math.abs( min ) % 60,
+ tzString = ( ( min >= 0 ) ? '' : '-' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour +
+ ':' + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin;
+ return tzString;
}
-}
-// Populate the prefToc
-$legends.each( function ( i, legend ) {
- var $legend = $(legend);
- if ( i === 0 ) {
- $legend.parent().show();
+ function hoursToMinutes( hour ) {
+ var minutes,
+ arr = hour.split( ':' );
+
+ arr[0] = parseInt( arr[0], 10 );
+
+ if ( arr.length === 1 ) {
+ // Specification is of the form [-]XX
+ minutes = arr[0] * 60;
+ } else {
+ // Specification is of the form [-]XX:XX
+ minutes = Math.abs( arr[0] ) * 60 + parseInt( arr[1], 10 );
+ if ( arr[0] < 0 ) {
+ minutes *= -1;
+ }
+ }
+ // Gracefully handle non-numbers.
+ if ( isNaN( minutes ) ) {
+ return 0;
+ } else {
+ return minutes;
+ }
}
- var ident = $legend.parent().attr( 'id' );
-
- var $li = $( '<li/>', {
- 'class' : ( i === 0 ) ? 'selected' : null
- });
- var $a = $( '<a/>', {
- text : $legend.text(),
- id : ident.replace( 'mw-prefsection', 'preftab' ),
- href : '#' + ident
- });
- $li.append( $a );
- $preftoc.append( $li );
-} );
-// If we've reloaded the page or followed an open-in-new-window,
-// make the selected tab visible.
-var hash = window.location.hash;
-if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
- switchPrefTab( hash.replace( '#mw-prefsection-' , '' ) );
-}
-
-// In browsers that support the onhashchange event we will not bind click
-// handlers and instead let the browser do the default behavior (clicking the
-// <a href="#.."> will naturally set the hash, handled by onhashchange.
-// But other things that change the hash will also be catched (e.g. using
-// the Back and Forward browser navigation).
-if ( 'onhashchange' in window ) {
- $(window).on( 'hashchange' , function () {
- var hash = window.location.hash;
- if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
- switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
- } else if ( hash === '' ) {
- switchPrefTab( 'personal', 'noHash' );
+ function updateTimezoneSelection () {
+ var minuteDiff, localTime,
+ type = $tzSelect.val();
+
+ if ( type === 'guess' ) {
+ // Get browser timezone & fill it in
+ minuteDiff = -( new Date().getTimezoneOffset() );
+ $tzTextbox.val( minutesToHours( minuteDiff ) );
+ $tzSelect.val( 'other' );
+ $tzTextbox.prop( 'disabled', false );
+ } else if ( type === 'other' ) {
+ // Grab data from the textbox, parse it.
+ minuteDiff = hoursToMinutes( $tzTextbox.val() );
+ } else {
+ // Grab data from the $tzSelect value
+ minuteDiff = parseInt( type.split( '|' )[1], 10 ) || 0;
+ $tzTextbox.val( minutesToHours( minuteDiff ) );
}
- });
-// In older browsers we'll bind a click handler as fallback.
-// We must not have onhashchange *and* the click handlers, other wise
-// the click handler calls switchPrefTab() which sets the hash value,
-// which triggers onhashcange and calls switchPrefTab() again.
-} else {
- $preftoc.on( 'click', 'li a', function ( e ) {
- switchPrefTab( $( this ).attr( 'href' ).replace( '#mw-prefsection-', '' ) );
- e.preventDefault();
- });
-}
-/**
-* Timezone functions.
-* Guesses Timezone from browser and updates fields onchange
-*/
-
-var $tzSelect = $( '#mw-input-wptimecorrection' );
-var $tzTextbox = $( '#mw-input-wptimecorrection-other' );
-
-var $localtimeHolder = $( '#wpLocalTime' );
-var servertime = parseInt( $( 'input[name=wpServerTime]' ).val(), 10 );
-var minuteDiff = 0;
-
-var minutesToHours = function ( min ) {
- var tzHour = Math.floor( Math.abs( min ) / 60 );
- var tzMin = Math.abs( min ) % 60;
- var tzString = ( ( min >= 0 ) ? '' : '-' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour +
- ':' + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin;
- return tzString;
-};
-
-var hoursToMinutes = function ( hour ) {
- var arr = hour.split( ':' );
- arr[0] = parseInt( arr[0], 10 );
-
- var minutes;
- if ( arr.length == 1 ) {
- // Specification is of the form [-]XX
- minutes = arr[0] * 60;
- } else {
- // Specification is of the form [-]XX:XX
- minutes = Math.abs( arr[0] ) * 60 + parseInt( arr[1], 10 );
- if ( arr[0] < 0 ) {
- minutes *= -1;
+ // Determine local time from server time and minutes difference, for display.
+ localTime = servertime + minuteDiff;
+
+ // Bring time within the [0,1440) range.
+ while ( localTime < 0 ) {
+ localTime += 1440;
}
+ while ( localTime >= 1440 ) {
+ localTime -= 1440;
+ }
+ $localtimeHolder.text( minutesToHours( localTime ) );
}
- // Gracefully handle non-numbers.
- if ( isNaN( minutes ) ) {
- return 0;
- } else {
- return minutes;
- }
-};
-
-var updateTimezoneSelection = function () {
- var type = $tzSelect.val();
- if ( type == 'guess' ) {
- // Get browser timezone & fill it in
- minuteDiff = -new Date().getTimezoneOffset();
- $tzTextbox.val( minutesToHours( minuteDiff ) );
- $tzSelect.val( 'other' );
- $tzTextbox.get( 0 ).disabled = false;
- } else if ( type == 'other' ) {
- // Grab data from the textbox, parse it.
- minuteDiff = hoursToMinutes( $tzTextbox.val() );
- } else {
- // Grab data from the $tzSelect value
- minuteDiff = parseInt( type.split( '|' )[1], 10 ) || 0;
- $tzTextbox.val( minutesToHours( minuteDiff ) );
+
+ if ( $tzSelect.length && $tzTextbox.length ) {
+ $tzSelect.change( updateTimezoneSelection );
+ $tzTextbox.blur( updateTimezoneSelection );
+ updateTimezoneSelection();
}
- // Determine local time from server time and minutes difference, for display.
- var localTime = servertime + minuteDiff;
+ // Preserve the tab after saving the preferences
+ // Not using cookies, because their deletion results are inconsistent.
+ // Not using jStorage due to its enormous size (for this feature)
+ if ( window.sessionStorage ) {
+ if ( sessionStorage.getItem( 'mediawikiPreferencesTab' ) !== null ) {
+ switchPrefTab( sessionStorage.getItem( 'mediawikiPreferencesTab' ), 'noHash' );
+ }
+ // Deleting the key, the tab states should be reset until we press Save
+ sessionStorage.removeItem( 'mediawikiPreferencesTab' );
- // Bring time within the [0,1440) range.
- while ( localTime < 0 ) {
- localTime += 1440;
- }
- while ( localTime >= 1440 ) {
- localTime -= 1440;
+ $( '#mw-prefs-form' ).submit( function () {
+ var storageData = $( $preftoc ).find( 'li.selected a' ).attr( 'id' ).replace( 'preftab-', '' );
+ sessionStorage.setItem( 'mediawikiPreferencesTab', storageData );
+ } );
}
- $localtimeHolder.text( minutesToHours( localTime ) );
-};
-
-if ( $tzSelect.length && $tzTextbox.length ) {
- $tzSelect.change( function () { updateTimezoneSelection(); } );
- $tzTextbox.blur( function () { updateTimezoneSelection(); } );
- updateTimezoneSelection();
-}
} );
diff --git a/resources/mediawiki.special/mediawiki.special.recentchanges.js b/resources/mediawiki.special/mediawiki.special.recentchanges.js
index 7996d935..d1c1354f 100644
--- a/resources/mediawiki.special/mediawiki.special.recentchanges.js
+++ b/resources/mediawiki.special/mediawiki.special.recentchanges.js
@@ -1,39 +1,34 @@
-/* JavaScript for Special:RecentChanges */
+/**
+ * JavaScript for Special:RecentChanges
+ */
( function ( mw, $ ) {
+ var rc, $checkboxes, $select;
- var checkboxes = [ 'nsassociated', 'nsinvert' ];
-
- /**
- * @var select {jQuery}
- */
- var $select = null;
-
- var rc = mw.special.recentchanges = {
-
+ rc = {
/**
* Handler to disable/enable the namespace selector checkboxes when the
* special 'all' namespace is selected/unselected respectively.
*/
updateCheckboxes: function () {
// The option element for the 'all' namespace has an empty value
- var isAllNS = $select.find('option:selected').val() === '';
+ var isAllNS = $select.val() === '';
// Iterates over checkboxes and propagate the selected option
- $.each( checkboxes, function ( i, id ) {
- $( '#' + id ).prop( 'disabled', isAllNS );
- });
+ $checkboxes.prop( 'disabled', isAllNS );
},
init: function () {
- // Populate
$select = $( '#namespace' );
+ $checkboxes = $( '#nsassociated, #nsinvert' );
// Bind to change event, and trigger once to set the initial state of the checkboxes.
- $select.change( rc.updateCheckboxes ).change();
+ rc.updateCheckboxes();
+ $select.change( rc.updateCheckboxes );
}
};
- // Run when document is ready
- $( rc.init );
+ $( document ).ready( rc.init );
+
+ mw.special.recentchanges = rc;
}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.search.js b/resources/mediawiki.special/mediawiki.special.search.js
index 04954e8d..2dab3026 100644
--- a/resources/mediawiki.special/mediawiki.special.search.js
+++ b/resources/mediawiki.special/mediawiki.special.search.js
@@ -1,49 +1,53 @@
-/*
+/**
* JavaScript for Special:Search
*/
-( function( $, mw ) { $( function() {
+( function ( mw, $ ) {
+ $( document ).ready( function () {
+ var $checkboxes, $headerLinks;
-// Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
-if ( !( 'autofocus' in document.createElement( 'input' ) ) ) {
- $( 'input[autofocus]:first' ).focus();
-}
+ // Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
+ if ( !( 'autofocus' in document.createElement( 'input' ) ) ) {
+ $( 'input[autofocus]' ).eq( 0 ).focus();
+ }
-// Create check all/none button
-var $checkboxes = $('#powersearch input[id^=mw-search-ns]');
-$('#mw-search-togglebox').append(
- $('<label />')
- .text(mw.msg('powersearch-togglelabel'))
-).append(
- $('<input type="button" />')
- .attr('id', 'mw-search-toggleall')
- .attr('value', mw.msg('powersearch-toggleall'))
- .click( function() {
- $checkboxes.prop('checked', true);
- } )
-).append(
- $('<input type="button" />')
- .attr('id', 'mw-search-togglenone')
- .attr('value', mw.msg('powersearch-togglenone'))
- .click( function() {
- $checkboxes.prop('checked', false);
- } )
-);
+ // Create check all/none button
+ $checkboxes = $('#powersearch input[id^=mw-search-ns]');
+ $('#mw-search-togglebox').append(
+ $('<label>')
+ .text(mw.msg('powersearch-togglelabel'))
+ ).append(
+ $('<input type="button" />')
+ .attr( 'id', 'mw-search-toggleall' )
+ .prop( 'value', mw.msg('powersearch-toggleall' ) )
+ .click( function () {
+ $checkboxes.prop('checked', true);
+ } )
+ ).append(
+ $('<input type="button" />')
+ .attr( 'id', 'mw-search-togglenone' )
+ .prop( 'value', mw.msg('powersearch-togglenone' ) )
+ .click( function() {
+ $checkboxes.prop( 'checked', false );
+ } )
+ );
-// Change the header search links to what user entered
-var headerLinks = $('.search-types a');
-$('#searchText, #powerSearchText').change(function() {
- var searchterm = $(this).val();
- headerLinks.each( function() {
- var parts = $(this).attr('href').split( 'search=' );
- var lastpart = '';
- var prefix = 'search=';
- if( parts.length > 1 && parts[1].indexOf('&') >= 0 ) {
- lastpart = parts[1].substring( parts[1].indexOf('&') );
- } else {
- prefix = '&search=';
- }
- this.href = parts[0] + prefix + encodeURIComponent( searchterm ) + lastpart;
- });
-}).trigger('change');
+ // Change the header search links to what user entered
+ $headerLinks = $( '.search-types a' );
+ $( '#searchText, #powerSearchText' ).change( function () {
+ var searchterm = $(this).val();
+ $headerLinks.each( function () {
+ var parts = $(this).attr('href').split( 'search=' ),
+ lastpart = '',
+ prefix = 'search=';
+ if ( parts.length > 1 && parts[1].indexOf('&') >= 0 ) {
+ lastpart = parts[1].substring( parts[1].indexOf('&') );
+ } else {
+ prefix = '&search=';
+ }
+ this.href = parts[0] + prefix + encodeURIComponent( searchterm ) + lastpart;
+ });
+ }).trigger( 'change' );
+
+ } );
-} ); } )( jQuery, mediaWiki );
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.undelete.js b/resources/mediawiki.special/mediawiki.special.undelete.js
index 33b80275..d20aab51 100644
--- a/resources/mediawiki.special/mediawiki.special.undelete.js
+++ b/resources/mediawiki.special/mediawiki.special.undelete.js
@@ -1,10 +1,11 @@
-/*
- * JavaScript for Specical:Undelete
+/**
+ * JavaScript for Special:Undelete
*/
-jQuery( document ).ready( function( $ ) {
- $( '#mw-undelete-invert' ).click( function( e ) {
+jQuery( document ).ready( function ( $ ) {
+ $( '#mw-undelete-invert' ).click( function ( e ) {
+ $( '#undelete input[type="checkbox"]' ).prop( 'checked', function ( i, val ) {
+ return !val;
+ } );
e.preventDefault();
- $( '#undelete' ).find( 'input:checkbox' )
- .prop( 'checked', function( i, val ) { return !val; } );
} );
} );
diff --git a/resources/mediawiki.special/mediawiki.special.upload.js b/resources/mediawiki.special/mediawiki.special.upload.js
index 63e89713..75532f18 100644
--- a/resources/mediawiki.special/mediawiki.special.upload.js
+++ b/resources/mediawiki.special/mediawiki.special.upload.js
@@ -6,12 +6,12 @@
/**
* Add a preview to the upload form
*/
- $( function ( $ ) {
+ $( document ).ready( function () {
/**
* Is the FileAPI available with sufficient functionality?
*/
function hasFileAPI() {
- return typeof window.FileReader !== 'undefined';
+ return window.FileReader !== undefined;
}
/**
@@ -25,7 +25,7 @@
* @return boolean
*/
function fileIsPreviewable( file ) {
- var known = ['image/png', 'image/gif', 'image/jpeg', 'image/svg+xml'],
+ var known = ['image/png', 'image/gif', 'image/jpeg', 'image/svg+xml'],
tooHuge = 10 * 1024 * 1024;
return ( $.inArray( file.type, known ) !== -1 ) && file.size > 0 && file.size < tooHuge;
}
@@ -43,23 +43,26 @@
* @param {File} file
*/
function showPreview( file ) {
- var previewSize = 180,
+ var $canvas,
+ ctx,
+ meta,
+ previewSize = 180,
thumb = $( '<div id="mw-upload-thumbnail" class="thumb tright">' +
'<div class="thumbinner">' +
'<div class="mw-small-spinner" style="width: 180px; height: 180px"></div>' +
'<div class="thumbcaption"><div class="filename"></div><div class="fileinfo"></div></div>' +
'</div>' +
'</div>' );
+
thumb.find( '.filename' ).text( file.name ).end()
.find( '.fileinfo' ).text( prettySize( file.size ) ).end();
- var $canvas = $('<canvas width="' + previewSize + '" height="' + previewSize + '" ></canvas>'),
- ctx = $canvas[0].getContext( '2d' );
+ $canvas = $('<canvas width="' + previewSize + '" height="' + previewSize + '" ></canvas>');
+ ctx = $canvas[0].getContext( '2d' );
$( '#mw-htmlform-source' ).parent().prepend( thumb );
- var meta;
- fetchPreview( file, function( dataURL ) {
- var img = new Image(),
+ fetchPreview( file, function ( dataURL ) {
+ var img = new Image(),
rotation = 0;
if ( meta && meta.tiff && meta.tiff.Orientation ) {
@@ -79,7 +82,8 @@
}
img.onload = function () {
- var width, height, x, y, dx, dy, logicalWidth, logicalHeight;
+ var info, width, height, x, y, dx, dy, logicalWidth, logicalHeight;
+
// Fit the image within the previewSizexpreviewSize box
if ( img.width > img.height ) {
width = previewSize;
@@ -129,12 +133,14 @@
thumb.find('.mw-small-spinner').replaceWith($canvas);
// Image size
- var info = mw.msg( 'widthheight', logicalWidth, logicalHeight ) +
+ info = mw.msg( 'widthheight', logicalWidth, logicalHeight ) +
', ' + prettySize( file.size );
+
$( '#mw-upload-thumbnail .fileinfo' ).text( info );
};
img.src = dataURL;
}, mw.config.get( 'wgFileCanRotate' ) ? function ( data ) {
+ /*jshint camelcase: false, nomen: false */
try {
meta = mw.libs.jpegmeta( data, file.fileName );
meta._binary_data = null;
@@ -171,9 +177,10 @@
// However, our JPEG metadata library wants a string.
// So, this is going to be an ugly conversion.
reader.onload = function() {
- var buffer = new Uint8Array( reader.result ),
+ var i,
+ buffer = new Uint8Array( reader.result ),
string = '';
- for ( var i = 0; i < buffer.byteLength; i++ ) {
+ for ( i = 0; i < buffer.byteLength; i++ ) {
string += String.fromCharCode( buffer[i] );
}
callbackBinary( string );
@@ -196,7 +203,7 @@
} else {
// This ends up decoding the file to base-64 and back again, which
// feels horribly inefficient.
- reader.onload = function() {
+ reader.onload = function () {
callback( reader.result );
};
reader.readAsDataURL( file );
@@ -230,22 +237,29 @@
* Check if the file does not exceed the maximum size
*/
function checkMaxUploadSize( file ) {
+ var maxSize, $error;
+
function getMaxUploadSize( type ) {
var sizes = mw.config.get( 'wgMaxUploadSize' );
+
if ( sizes[type] !== undefined ) {
return sizes[type];
}
return sizes['*'];
}
+
$( '.mw-upload-source-error' ).remove();
- var maxSize = getMaxUploadSize( 'file' );
+ maxSize = getMaxUploadSize( 'file' );
if ( file.size > maxSize ) {
- var error = $( '<p class="error mw-upload-source-error" id="wpSourceTypeFile-error">' +
- mw.message( 'largefileserver', file.size, maxSize ).escaped() + '</p>' );
- $( '#wpUploadFile' ).after( error );
+ $error = $( '<p class="error mw-upload-source-error" id="wpSourceTypeFile-error">' +
+ mw.message( 'largefileserver', file.size, maxSize ).escaped() + '</p>' );
+
+ $( '#wpUploadFile' ).after( $error );
+
return false;
}
+
return true;
}
@@ -276,23 +290,30 @@
/**
* Disable all upload source fields except the selected one
*/
- $( function ( $ ) {
- var i, row,
- rows = $( '.mw-htmlform-field-UploadSourceField' );
- for ( i = rows.length; i; i-- ) {
- row = rows[i - 1];
- $( 'input[name="wpSourceType"]', row ).change( ( function () {
- var currentRow = row; // Store current row in our own scope
- return function () {
- $( '.mw-upload-source-error' ).remove();
- if ( this.checked ) {
- // Disable all inputs
- $( 'input[name!="wpSourceType"]', rows ).prop( 'disabled', true );
- // Re-enable the current one
- $( 'input', currentRow ).prop( 'disabled', false );
- }
- };
- }() ) );
+ $( document ).ready( function () {
+ var i, $row,
+ $rows = $( '.mw-htmlform-field-UploadSourceField' );
+
+ function createHandler( $currentRow ) {
+ /**
+ * @param {jQuery.Event}
+ */
+ return function () {
+ $( '.mw-upload-source-error' ).remove();
+ if ( this.checked ) {
+ // Disable all inputs
+ $rows.find( 'input[name!="wpSourceType"]' ).prop( 'disabled', true );
+ // Re-enable the current one
+ $currentRow.find( 'input' ).prop( 'disabled', false );
+ }
+ };
+ }
+
+ for ( i = $rows.length; i; i-- ) {
+ $row = $rows.eq(i - 1);
+ $row
+ .find( 'input[name="wpSourceType"]' )
+ .change( createHandler( $row ) );
}
} );
diff --git a/resources/mediawiki.special/mediawiki.special.userLogin.signup.js b/resources/mediawiki.special/mediawiki.special.userLogin.signup.js
new file mode 100644
index 00000000..bba42605
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.userLogin.signup.js
@@ -0,0 +1,10 @@
+/**
+ * JavaScript for Special:UserLogin/signup
+ */
+jQuery( document ).ready( function ( $ ) {
+ $( '#wpCreateaccountMail' )
+ .on( 'change', function() {
+ $( '.mw-row-password' ).toggle( !$( this ).attr( 'checked' ) );
+ } )
+ .trigger( 'change' );
+} );
diff --git a/resources/mediawiki/mediawiki.Title.js b/resources/mediawiki/mediawiki.Title.js
index 33cca585..b86a14ba 100644
--- a/resources/mediawiki/mediawiki.Title.js
+++ b/resources/mediawiki/mediawiki.Title.js
@@ -1,6 +1,4 @@
-/**
- * mediaWiki.Title
- *
+/*!
* @author Neil Kandalgaonkar, 2010
* @author Timo Tijhof, 2011
* @since 1.18
@@ -12,13 +10,12 @@
/* Local space */
/**
- * Title
- * @constructor
+ * @class mw.Title
*
- * @param title {String} Title of the page. If no second argument given,
+ * @constructor
+ * @param {string} title Title of the page. If no second argument given,
* this will be searched for a namespace.
- * @param namespace {Number} (optional) Namespace id. If given, title will be taken as-is.
- * @return {Title} this
+ * @param {number} [namespace] Namespace id. If given, title will be taken as-is.
*/
function Title( title, namespace ) {
this.ns = 0; // integer namespace id
@@ -35,17 +32,16 @@
}
var
- /**
- * Public methods (defined later)
- */
+ /* Public methods (defined later) */
fn,
/**
* Strip some illegal chars: control chars, colon, less than, greater than,
* brackets, braces, pipe, whitespace and normal spaces. This still leaves some insanity
* intact, like unicode bidi chars, but it's a good start..
- * @param s {String}
- * @return {String}
+ * @ignore
+ * @param {string} s
+ * @return {string}
*/
clean = function ( s ) {
if ( s !== undefined ) {
@@ -55,8 +51,9 @@ var
/**
* Convert db-key to readable text.
- * @param s {String}
- * @return {String}
+ * @ignore
+ * @param {string} s
+ * @return {string}
*/
text = function ( s ) {
if ( s !== null && s !== undefined ) {
@@ -68,13 +65,15 @@ var
/**
* Sanitize name.
+ * @ignore
*/
fixName = function ( s ) {
return clean( $.trim( s ) );
},
/**
- * Sanitize name.
+ * Sanitize extension.
+ * @ignore
*/
fixExt = function ( s ) {
return clean( s );
@@ -82,6 +81,7 @@ var
/**
* Sanitize namespace id.
+ * @ignore
* @param id {Number} Namespace id.
* @return {Number|Boolean} The id as-is or boolean false if invalid.
*/
@@ -99,8 +99,8 @@ var
/**
* Get namespace id from namespace name by any known namespace/id pair (localized, canonical or alias).
- *
- * @example On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or even 'Bild'.
+ * Example: On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or even 'Bild'.
+ * @ignore
* @param ns {String} Namespace name (case insensitive, leading/trailing space ignored).
* @return {Number|Boolean} Namespace id or boolean false if unrecognized.
*/
@@ -125,19 +125,20 @@ var
/**
* Helper to extract namespace, name and extension from a string.
*
- * @param title {mw.Title}
- * @param raw {String}
+ * @ignore
+ * @param {mw.Title} title
+ * @param {string} raw
* @return {mw.Title}
*/
setAll = function ( title, s ) {
// In normal browsers the match-array contains null/undefined if there's no match,
// IE returns an empty string.
var matches = s.match( /^(?:([^:]+):)?(.*?)(?:\.(\w+))?$/ ),
- ns_match = getNsIdByName( matches[1] );
+ nsMatch = getNsIdByName( matches[1] );
// Namespace must be valid, and title must be a non-empty string.
- if ( ns_match && typeof matches[2] === 'string' && matches[2] !== '' ) {
- title.ns = ns_match;
+ if ( nsMatch && typeof matches[2] === 'string' && matches[2] !== '' ) {
+ title.ns = nsMatch;
title.name = fixName( matches[2] );
if ( typeof matches[3] === 'string' && matches[3] !== '' ) {
title.ext = fixExt( matches[3] );
@@ -153,8 +154,9 @@ var
/**
* Helper to extract name and extension from a string.
*
- * @param title {mw.Title}
- * @param raw {String}
+ * @ignore
+ * @param {mw.Title} title
+ * @param {string} raw
* @return {mw.Title}
*/
setNameAndExtension = function ( title, raw ) {
@@ -179,8 +181,9 @@ var
/**
* Whether this title exists on the wiki.
- * @param title {mixed} prefixed db-key name (string) or instance of Title
- * @return {mixed} Boolean true/false if the information is available. Otherwise null.
+ * @static
+ * @param {Mixed} title prefixed db-key name (string) or instance of Title
+ * @return {Mixed} Boolean true/false if the information is available. Otherwise null.
*/
Title.exists = function ( title ) {
var type = $.type( title ), obj = Title.exist.pages, match;
@@ -198,20 +201,27 @@ var
};
/**
- * @var Title.exist {Object}
+ * @static
+ * @property
*/
Title.exist = {
/**
- * @var Title.exist.pages {Object} Keyed by PrefixedDb title.
+ * @static
+ * @property {Object} exist.pages Keyed by PrefixedDb title.
* Boolean true value indicates page does exist.
*/
pages: {},
/**
- * @example Declare existing titles: Title.exist.set(['User:John_Doe', ...]);
- * @example Declare titles nonexistent: Title.exist.set(['File:Foo_bar.jpg', ...], false);
- * @param titles {String|Array} Title(s) in strict prefixedDb title form.
- * @param state {Boolean} (optional) State of the given titles. Defaults to true.
- * @return {Boolean}
+ * Example to declare existing titles:
+ * Title.exist.set(['User:John_Doe', ...]);
+ * Eample to declare titles nonexistent:
+ * Title.exist.set(['File:Foo_bar.jpg', ...], false);
+ *
+ * @static
+ * @property exist.set
+ * @param {string|Array} titles Title(s) in strict prefixedDb title form.
+ * @param {boolean} [state] State of the given titles. Defaults to true.
+ * @return {boolean}
*/
set: function ( titles, state ) {
titles = $.isArray( titles ) ? titles : [titles];
@@ -231,7 +241,7 @@ var
/**
* Get the namespace number.
- * @return {Number}
+ * @return {number}
*/
getNamespaceId: function (){
return this.ns;
@@ -240,7 +250,7 @@ var
/**
* Get the namespace prefix (in the content-language).
* In NS_MAIN this is '', otherwise namespace name plus ':'
- * @return {String}
+ * @return {string}
*/
getNamespacePrefix: function (){
return mw.config.get( 'wgFormattedNamespaces' )[this.ns].replace( / /g, '_' ) + (this.ns === 0 ? '' : ':');
@@ -248,7 +258,7 @@ var
/**
* The name, like "Foo_bar"
- * @return {String}
+ * @return {string}
*/
getName: function () {
if ( $.inArray( this.ns, mw.config.get( 'wgCaseSensitiveNamespaces' ) ) !== -1 ) {
@@ -260,7 +270,7 @@ var
/**
* The name, like "Foo bar"
- * @return {String}
+ * @return {string}
*/
getNameText: function () {
return text( this.getName() );
@@ -269,6 +279,7 @@ var
/**
* Get full name in prefixed DB form, like File:Foo_bar.jpg,
* most useful for API calls, anything that must identify the "title".
+ * @return {string}
*/
getPrefixedDb: function () {
return this.getNamespacePrefix() + this.getMain();
@@ -276,7 +287,7 @@ var
/**
* Get full name in text form, like "File:Foo bar.jpg".
- * @return {String}
+ * @return {string}
*/
getPrefixedText: function () {
return text( this.getPrefixedDb() );
@@ -284,7 +295,7 @@ var
/**
* The main title (without namespace), like "Foo_bar.jpg"
- * @return {String}
+ * @return {string}
*/
getMain: function () {
return this.getName() + this.getDotExtension();
@@ -292,7 +303,7 @@ var
/**
* The "text" form, like "Foo bar.jpg"
- * @return {String}
+ * @return {string}
*/
getMainText: function () {
return text( this.getMain() );
@@ -300,7 +311,7 @@ var
/**
* Get the extension (returns null if there was none)
- * @return {String|null} extension
+ * @return {string|null}
*/
getExtension: function () {
return this.ext;
@@ -308,7 +319,7 @@ var
/**
* Convenience method: return string like ".jpg", or "" if no extension
- * @return {String}
+ * @return {string}
*/
getDotExtension: function () {
return this.ext === null ? '' : '.' + this.ext;
@@ -316,7 +327,8 @@ var
/**
* Return the URL to this title
- * @return {String}
+ * @see mw.util#wikiGetlink
+ * @return {string}
*/
getUrl: function () {
return mw.util.wikiGetlink( this.toString() );
@@ -324,7 +336,8 @@ var
/**
* Whether this title exists on the wiki.
- * @return {mixed} Boolean true/false if the information is available. Otherwise null.
+ * @see #static-method-exists
+ * @return {boolean|null} If the information is available. Otherwise null.
*/
exists: function () {
return Title.exists( this );
diff --git a/resources/mediawiki/mediawiki.Uri.js b/resources/mediawiki/mediawiki.Uri.js
index bd12b214..643e5c3e 100644
--- a/resources/mediawiki/mediawiki.Uri.js
+++ b/resources/mediawiki/mediawiki.Uri.js
@@ -61,11 +61,11 @@
/**
* Function that's useful when constructing the URI string -- we frequently encounter the pattern of
* having to add something to the URI as we go, but only if it's present, and to include a character before or after if so.
- * @param {String} to prepend, if value not empty
- * @param {String} value to include, if not empty
- * @param {String} to append, if value not empty
- * @param {Boolean} raw -- if true, do not URI encode
- * @return {String}
+ * @param {string|undefined} pre To prepend.
+ * @param {string} val To include.
+ * @param {string} post To append.
+ * @param {boolean} raw If true, val will not be encoded.
+ * @return {string} Result.
*/
function cat( pre, val, post, raw ) {
if ( val === undefined || val === null || val === '' ) {
@@ -76,8 +76,8 @@
// Regular expressions to parse many common URIs.
var parser = {
- strict: /^(?:([^:\/?#]+):)?(?:\/\/(?:(?:([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)?((?:[^?#\/]*\/)*[^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
- loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?(?:(?:([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?((?:\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?[^?#\/]*)(?:\?([^#]*))?(?:#(.*))?/
+ strict: /^(?:([^:\/?#]+):)?(?:\/\/(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?)?((?:[^?#\/]*\/)*[^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
+ loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?((?:\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?[^?#\/]*)(?:\?([^#]*))?(?:#(.*))?/
},
// The order here matches the order of captured matches in the above parser regexes.
@@ -103,14 +103,14 @@
/**
* Constructs URI object. Throws error if arguments are illegal/impossible, or otherwise don't parse.
* @constructor
- * @param {Object|String} URI string, or an Object with appropriate properties (especially another URI object to clone).
+ * @param {Object|string} uri URI string, or an Object with appropriate properties (especially another URI object to clone).
* Object must have non-blank 'protocol', 'host', and 'path' properties.
- * This parameter is optional. If omitted (or set to undefined, null or empty string), then an object will be created
- * for the default uri of this constructor (e.g. document.location for mw.Uri in MediaWiki core).
- * @param {Object|Boolean} Object with options, or (backwards compatibility) a boolean for strictMode
- * - strictMode {Boolean} Trigger strict mode parsing of the url. Default: false
- * - overrideKeys {Boolean} Wether to let duplicate query parameters override eachother (true) or automagically
- * convert to an array (false, default).
+ * This parameter is optional. If omitted (or set to undefined, null or empty string), then an object will be created
+ * for the default uri of this constructor (e.g. document.location for mw.Uri in MediaWiki core).
+ * @param {Object|boolean} Object with options, or (backwards compatibility) a boolean for strictMode
+ * - {boolean} strictMode Trigger strict mode parsing of the url. Default: false
+ * - {boolean} overrideKeys Wether to let duplicate query parameters override eachother (true) or automagically
+ * convert to an array (false, default).
*/
function Uri( uri, options ) {
options = typeof options === 'object' ? options : { strictMode: !!options };
@@ -158,7 +158,7 @@
}
if ( this.path && this.path.charAt( 0 ) !== '/' ) {
// A real relative URL, relative to defaultUri.path. We can't really handle that since we cannot
- // figure out whether the last path compoennt of defaultUri.path is a directory or a file.
+ // figure out whether the last path component of defaultUri.path is a directory or a file.
throw new Error( 'Bad constructor arguments' );
}
if ( !( this.protocol && this.host && this.path ) ) {
@@ -169,8 +169,8 @@
/**
* Standard encodeURIComponent, with extra stuff to make all browsers work similarly and more compliant with RFC 3986
* Similar to rawurlencode from PHP and our JS library mw.util.rawurlencode, but we also replace space with a +
- * @param {String} string
- * @return {String} encoded for URI
+ * @param {string} s String to encode.
+ * @return {string} Encoded string for URI.
*/
Uri.encode = function ( s ) {
return encodeURIComponent( s )
@@ -180,9 +180,9 @@
};
/**
- * Standard decodeURIComponent, with '+' to space
- * @param {String} string encoded for URI
- * @return {String} decoded string
+ * Standard decodeURIComponent, with '+' to space.
+ * @param {string} s String encoded for URI.
+ * @return {string} Decoded string.
*/
Uri.decode = function ( s ) {
return decodeURIComponent( s.replace( /\+/g, '%20' ) );
@@ -192,9 +192,9 @@
/**
* Parse a string and set our properties accordingly.
- * @param {String} URI
+ * @param {string} str URI
* @param {Object} options
- * @return {Boolean} success
+ * @return {boolean} Success.
*/
parse: function ( str, options ) {
var q,
@@ -240,7 +240,7 @@
/**
* Returns user and password portion of a URI.
- * @return {String}
+ * @return {string}
*/
getUserInfo: function () {
return cat( '', this.user, cat( ':', this.password, '' ) );
@@ -248,7 +248,7 @@
/**
* Gets host and port portion of a URI.
- * @return {String}
+ * @return {string}
*/
getHostPort: function () {
return this.host + cat( ':', this.port, '' );
@@ -257,7 +257,7 @@
/**
* Returns the userInfo and host and port portion of the URI.
* In most real-world URLs, this is simply the hostname, but it is more general.
- * @return {String}
+ * @return {string}
*/
getAuthority: function () {
return cat( '', this.getUserInfo(), '@' ) + this.getHostPort();
@@ -266,7 +266,7 @@
/**
* Returns the query arguments of the URL, encoded into a string
* Does not preserve the order of arguments passed into the URI. Does handle escaping.
- * @return {String}
+ * @return {string}
*/
getQueryString: function () {
var args = [];
@@ -274,7 +274,13 @@
var k = Uri.encode( key ),
vals = $.isArray( val ) ? val : [ val ];
$.each( vals, function ( i, v ) {
- args.push( k + ( v === null ? '' : '=' + Uri.encode( v ) ) );
+ if ( v === null ) {
+ args.push( k );
+ } else if ( k === 'title' ) {
+ args.push( k + '=' + mw.util.wikiUrlencode( v ) );
+ } else {
+ args.push( k + '=' + Uri.encode( v ) );
+ }
} );
} );
return args.join( '&' );
@@ -282,7 +288,7 @@
/**
* Returns everything after the authority section of the URI
- * @return {String}
+ * @return {string}
*/
getRelativePath: function () {
return this.path + cat( '?', this.getQueryString(), '', true ) + cat( '#', this.fragment, '' );
@@ -290,7 +296,7 @@
/**
* Gets the entire URI string. May not be precisely the same as input due to order of query arguments.
- * @return {String} the URI string
+ * @return {string} The URI string.
*/
toString: function () {
return this.protocol + '://' + this.getAuthority() + this.getRelativePath();
diff --git a/resources/mediawiki/mediawiki.debug.css b/resources/mediawiki/mediawiki.debug.css
index 149e1bff..513cb847 100644
--- a/resources/mediawiki/mediawiki.debug.css
+++ b/resources/mediawiki/mediawiki.debug.css
@@ -1,6 +1,5 @@
.mw-debug {
width: 100%;
- text-align: left;
background-color: #eee;
border-top: 1px solid #aaa;
}
diff --git a/resources/mediawiki/mediawiki.debug.js b/resources/mediawiki/mediawiki.debug.js
index 1ad1a623..88af3c65 100644
--- a/resources/mediawiki/mediawiki.debug.js
+++ b/resources/mediawiki/mediawiki.debug.js
@@ -96,7 +96,7 @@
buildHtml: function () {
var $container, $bits, panes, id, gitInfo;
- $container = $( '<div id="mw-debug-toolbar" class="mw-debug"></div>' );
+ $container = $( '<div id="mw-debug-toolbar" class="mw-debug" lang="en" dir="ltr"></div>' );
$bits = $( '<div class="mw-debug-bits"></div>' );
@@ -187,9 +187,7 @@
.text( 'Time: ' + this.data.time.toFixed( 5 ) );
bitDiv( 'memory' )
- .text( 'Memory: ' + this.data.memory )
- .append( $( '<span title="Peak usage"></span>' ).text( ' (' + this.data.memoryPeak + ')' ) );
-
+ .text( 'Memory: ' + this.data.memory + ' (Peak: ' + this.data.memoryPeak + ')' );
$bits.appendTo( $container );
diff --git a/resources/mediawiki/mediawiki.feedback.js b/resources/mediawiki/mediawiki.feedback.js
index 634d02b1..1afe51ef 100644
--- a/resources/mediawiki/mediawiki.feedback.js
+++ b/resources/mediawiki/mediawiki.feedback.js
@@ -1,5 +1,5 @@
/**
- * mediawiki.Feedback
+ * mediawiki.feedback
*
* @author Ryan Kaldari, 2010
* @author Neil Kandalgaonkar, 2010-11
@@ -68,17 +68,28 @@
mw.Feedback.prototype = {
setup: function () {
- var fb = this;
+ var $feedbackPageLink,
+ $bugNoteLink,
+ $bugsListLink,
+ fb = this;
- var $feedbackPageLink = $( '<a>' )
- .attr( { 'href': fb.title.getUrl(), 'target': '_blank' } )
- .css( { 'white-space': 'nowrap' } );
+ $feedbackPageLink = $( '<a>' )
+ .attr( {
+ href: fb.title.getUrl(),
+ target: '_blank'
+ } )
+ .css( {
+ whiteSpace: 'nowrap'
+ } );
- var $bugNoteLink = $( '<a>' ).attr( { 'href': '#' } ).click( function () {
+ $bugNoteLink = $( '<a>' ).attr( { href: '#' } ).click( function () {
fb.displayBugs();
} );
- var $bugsListLink = $( '<a>' ).attr( { 'href': fb.bugsListLink, 'target': '_blank' } );
+ $bugsListLink = $( '<a>' ).attr( {
+ href: fb.bugsListLink,
+ target: '_blank'
+ } );
// TODO: Use a stylesheet instead of these inline styles
this.$dialog =
@@ -108,7 +119,7 @@
),
$( '<div class="feedback-mode feedback-submitting" style="text-align: center; margin: 3em 0;"></div>' ).append(
mw.msg( 'feedback-adding' ),
- $( '<br/>' ),
+ $( '<br>' ),
$( '<span class="feedback-spinner"></span>' )
),
$( '<div class="feedback-mode feedback-thanks" style="text-align: center; margin:1em"></div>' ).msg(
@@ -148,9 +159,9 @@
},
displayBugs: function () {
- var fb = this;
+ var fb = this,
+ bugsButtons = {};
this.display( 'bugs' );
- var bugsButtons = {};
bugsButtons[ mw.msg( 'feedback-bugnew' ) ] = function () {
window.open( fb.bugsLink, '_blank' );
};
@@ -163,9 +174,9 @@
},
displayThanks: function () {
- var fb = this;
+ var fb = this,
+ closeButton = {};
this.display( 'thanks' );
- var closeButton = {};
closeButton[ mw.msg( 'feedback-close' ) ] = function () {
fb.$dialog.dialog( 'close' );
};
@@ -181,14 +192,14 @@
* message: {String}
*/
displayForm: function ( contents ) {
- var fb = this;
+ var fb = this,
+ formButtons = {};
this.subjectInput.value = ( contents && contents.subject ) ? contents.subject : '';
this.messageInput.value = ( contents && contents.message ) ? contents.message : '';
this.display( 'form' );
// Set up buttons for dialog box. We have to do it the hard way since the json keys are localized
- var formButtons = {};
formButtons[ mw.msg( 'feedback-submit' ) ] = function () {
fb.submit();
};
@@ -199,10 +210,10 @@
},
displayError: function ( message ) {
- var fb = this;
+ var fb = this,
+ closeButton = {};
this.display( 'error' );
this.$dialog.find( '.feedback-error-msg' ).msg( message );
- var closeButton = {};
closeButton[ mw.msg( 'feedback-close' ) ] = function () {
fb.$dialog.dialog( 'close' );
};
@@ -231,7 +242,7 @@
}
}
- function err( code, info ) {
+ function err() {
// ajax request failed
fb.displayError( 'feedback-error3' );
}
diff --git a/resources/mediawiki/mediawiki.hidpi.js b/resources/mediawiki/mediawiki.hidpi.js
new file mode 100644
index 00000000..ecee450c
--- /dev/null
+++ b/resources/mediawiki/mediawiki.hidpi.js
@@ -0,0 +1,5 @@
+jQuery( function ( $ ) {
+ // Apply hidpi images on DOM-ready
+ // Some may have already partly preloaded at low resolution.
+ $( 'body' ).hidpi();
+} );
diff --git a/resources/mediawiki/mediawiki.htmlform.js b/resources/mediawiki/mediawiki.htmlform.js
index a4753b99..83bf2e3a 100644
--- a/resources/mediawiki/mediawiki.htmlform.js
+++ b/resources/mediawiki/mediawiki.htmlform.js
@@ -1,64 +1,62 @@
/**
- * Utility functions for jazzing up HTMLForm elements
+ * Utility functions for jazzing up HTMLForm elements.
*/
( function ( $ ) {
-/**
- * jQuery plugin to fade or snap to visible state.
- *
- * @param boolean instantToggle (optional)
- * @return jQuery
- */
-$.fn.goIn = function ( instantToggle ) {
- if ( instantToggle === true ) {
- return $(this).show();
- }
- return $(this).stop( true, true ).fadeIn();
-};
-
-/**
- * jQuery plugin to fade or snap to hiding state.
- *
- * @param boolean instantToggle (optional)
- * @return jQuery
- */
-$.fn.goOut = function ( instantToggle ) {
- if ( instantToggle === true ) {
- return $(this).hide();
- }
- return $(this).stop( true, true ).fadeOut();
-};
-
-/**
- * Bind a function to the jQuery object via live(), and also immediately trigger
- * the function on the objects with an 'instant' parameter set to true
- * @param callback function taking one parameter, which is Bool true when the event
- * is called immediately, and the EventArgs object when triggered from an event
- */
-$.fn.liveAndTestAtStart = function ( callback ){
- $(this)
- .live( 'change', callback )
- .each( function ( index, element ){
- callback.call( this, true );
- } );
-};
-
-// Document ready:
-$( function () {
-
- // Animate the SelectOrOther fields, to only show the text field when
- // 'other' is selected.
- $( '.mw-htmlform-select-or-other' ).liveAndTestAtStart( function ( instant ) {
- var $other = $( '#' + $(this).attr( 'id' ) + '-other' );
- $other = $other.add( $other.siblings( 'br' ) );
- if ( $(this).val() === 'other' ) {
- $other.goIn( instant );
- } else {
- $other.goOut( instant );
+ /**
+ * jQuery plugin to fade or snap to visible state.
+ *
+ * @param {boolean} instantToggle [optional]
+ * @return {jQuery}
+ */
+ $.fn.goIn = function ( instantToggle ) {
+ if ( instantToggle === true ) {
+ return $(this).show();
}
- });
-
-});
-
+ return $(this).stop( true, true ).fadeIn();
+ };
+
+ /**
+ * jQuery plugin to fade or snap to hiding state.
+ *
+ * @param {boolean} instantToggle [optional]
+ * @return jQuery
+ */
+ $.fn.goOut = function ( instantToggle ) {
+ if ( instantToggle === true ) {
+ return $(this).hide();
+ }
+ return $(this).stop( true, true ).fadeOut();
+ };
+
+ /**
+ * Bind a function to the jQuery object via live(), and also immediately trigger
+ * the function on the objects with an 'instant' parameter set to true.
+ * @param {Function} callback Takes one parameter, which is {true} when the
+ * event is called immediately, and {jQuery.Event} when triggered from an event.
+ */
+ $.fn.liveAndTestAtStart = function ( callback ){
+ $(this)
+ .live( 'change', callback )
+ .each( function () {
+ callback.call( this, true );
+ } );
+ };
+
+ $( function () {
+
+ // Animate the SelectOrOther fields, to only show the text field when
+ // 'other' is selected.
+ $( '.mw-htmlform-select-or-other' ).liveAndTestAtStart( function ( instant ) {
+ var $other = $( '#' + $(this).attr( 'id' ) + '-other' );
+ $other = $other.add( $other.siblings( 'br' ) );
+ if ( $(this).val() === 'other' ) {
+ $other.goIn( instant );
+ } else {
+ $other.goOut( instant );
+ }
+ });
+
+ } );
}( jQuery ) );
diff --git a/resources/mediawiki/mediawiki.jqueryMsg.js b/resources/mediawiki/mediawiki.jqueryMsg.js
index 86af31ff..183b525e 100644
--- a/resources/mediawiki/mediawiki.jqueryMsg.js
+++ b/resources/mediawiki/mediawiki.jqueryMsg.js
@@ -5,13 +5,26 @@
* @author neilk@wikimedia.org
*/
( function ( mw, $ ) {
- var slice = Array.prototype.slice,
+ var oldParser,
+ slice = Array.prototype.slice,
parserDefaults = {
magic : {
'SITENAME' : mw.config.get( 'wgSiteName' )
},
messages : mw.messages,
- language : mw.language
+ language : mw.language,
+
+ // Same meaning as in mediawiki.js.
+ //
+ // Only 'text', 'parse', and 'escaped' are supported, and the
+ // actual escaping for 'escaped' is done by other code (generally
+ // through jqueryMsg).
+ //
+ // However, note that this default only
+ // applies to direct calls to jqueryMsg. The default for mediawiki.js itself
+ // is 'text', including when it uses jqueryMsg.
+ format: 'parse'
+
};
/**
@@ -30,8 +43,8 @@
* @return {jQuery}
*/
return function ( args ) {
- var key = args[0];
- var argsArray = $.isArray( args[1] ) ? args[1] : slice.call( args, 1 );
+ var key = args[0],
+ argsArray = $.isArray( args[1] ) ? args[1] : slice.call( args, 1 );
try {
return parser.parse( key, argsArray );
} catch ( e ) {
@@ -56,19 +69,32 @@
* @return {Function} function suitable for assigning to window.gM
*/
mw.jqueryMsg.getMessageFunction = function ( options ) {
- var failableParserFn = getFailableParserFn( options );
+ var failableParserFn = getFailableParserFn( options ),
+ format;
+
+ if ( options && options.format !== undefined ) {
+ format = options.format;
+ } else {
+ format = parserDefaults.format;
+ }
+
/**
* N.B. replacements are variadic arguments or an array in second parameter. In other words:
* somefunction(a, b, c, d)
* is equivalent to
* somefunction(a, [b, c, d])
*
- * @param {String} message key
- * @param {Array} optional replacements (can also specify variadically)
- * @return {String} rendered HTML as string
+ * @param {string} key Message key.
+ * @param {Array|mixed} replacements Optional variable replacements (variadically or an array).
+ * @return {string} Rendered HTML.
*/
- return function ( /* key, replacements */ ) {
- return failableParserFn( arguments ).html();
+ return function () {
+ var failableResult = failableParserFn( arguments );
+ if ( format === 'text' || format === 'escaped' ) {
+ return failableResult.text();
+ } else {
+ return failableResult.html();
+ }
};
};
@@ -93,12 +119,14 @@
* somefunction(a, [b, c, d])
*
* We append to 'this', which in a jQuery plugin context will be the selected elements.
- * @param {String} message key
- * @param {Array} optional replacements (can also specify variadically)
+ * @param {string} key Message key.
+ * @param {Array|mixed} replacements Optional variable replacements (variadically or an array).
* @return {jQuery} this
*/
- return function ( /* key, replacements */ ) {
+ return function () {
var $target = this.empty();
+ // TODO: Simply $target.append( failableParserFn( arguments ).contents() )
+ // or Simply $target.append( failableParserFn( arguments ) )
$.each( failableParserFn( arguments ).contents(), function ( i, node ) {
$target.append( node );
} );
@@ -113,20 +141,36 @@
*/
mw.jqueryMsg.parser = function ( options ) {
this.settings = $.extend( {}, parserDefaults, options );
+ this.settings.onlyCurlyBraceTransform = ( this.settings.format === 'text' || this.settings.format === 'escaped' );
+
this.emitter = new mw.jqueryMsg.htmlEmitter( this.settings.language, this.settings.magic );
};
mw.jqueryMsg.parser.prototype = {
- // cache, map of mediaWiki message key to the AST of the message. In most cases, the message is a string so this is identical.
- // (This is why we would like to move this functionality server-side).
+ /**
+ * Cache mapping MediaWiki message keys and the value onlyCurlyBraceTransform, to the AST of the message.
+ *
+ * In most cases, the message is a string so this is identical.
+ * (This is why we would like to move this functionality server-side).
+ *
+ * The two parts of the key are separated by colon. For example:
+ *
+ * "message-key:true": ast
+ *
+ * if they key is "message-key" and onlyCurlyBraceTransform is true.
+ *
+ * This cache is shared by all instances of mw.jqueryMsg.parser.
+ *
+ * @static
+ */
astCache: {},
/**
* Where the magic happens.
* Parses a message from the key, and swaps in replacements as necessary, wraps in jQuery
* If an error is thrown, returns original key, and logs the error
- * @param {String} message key
- * @param {Array} replacements for $1, $2... $n
+ * @param {String} key Message key.
+ * @param {Array} replacements Variable replacements for $1, $2... $n
* @return {jQuery}
*/
parse: function ( key, replacements ) {
@@ -139,16 +183,19 @@
* @return {String|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
*/
getAst: function ( key ) {
- if ( this.astCache[ key ] === undefined ) {
- var wikiText = this.settings.messages.get( key );
+ var cacheKey = [key, this.settings.onlyCurlyBraceTransform].join( ':' ), wikiText;
+
+ if ( this.astCache[ cacheKey ] === undefined ) {
+ wikiText = this.settings.messages.get( key );
if ( typeof wikiText !== 'string' ) {
- wikiText = "\\[" + key + "\\]";
+ wikiText = '\\[' + key + '\\]';
}
- this.astCache[ key ] = this.wikiTextToAst( wikiText );
+ this.astCache[ cacheKey ] = this.wikiTextToAst( wikiText );
}
- return this.astCache[ key ];
+ return this.astCache[ cacheKey ];
},
- /*
+
+ /**
* Parses the input wikiText into an abstract syntax tree, essentially an s-expression.
*
* CAVEAT: This does not parse all wikitext. It could be more efficient, but it's pretty good already.
@@ -159,18 +206,27 @@
* @return {Mixed} abstract syntax tree
*/
wikiTextToAst: function ( input ) {
+ var pos,
+ regularLiteral, regularLiteralWithoutBar, regularLiteralWithoutSpace, regularLiteralWithSquareBrackets,
+ backslash, anyCharacter, escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
+ whitespace, dollar, digits,
+ openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openLink, closeLink, templateName, pipe, colon,
+ templateContents, openTemplate, closeTemplate,
+ nonWhitespaceExpression, paramExpression, expression, curlyBraceTransformExpression, result;
// Indicates current position in input as we parse through it.
// Shared among all parsing functions below.
- var pos = 0;
+ pos = 0;
+
// =========================================================
// parsing combinators - could be a library on its own
// =========================================================
// Try parsers until one works, if none work return null
function choice( ps ) {
return function () {
- for ( var i = 0; i < ps.length; i++ ) {
- var result = ps[i]();
+ var i, result;
+ for ( i = 0; i < ps.length; i++ ) {
+ result = ps[i]();
if ( result !== null ) {
return result;
}
@@ -181,10 +237,11 @@
// try several ps in a row, all must succeed or return null
// this is the only eager one
function sequence( ps ) {
- var originalPos = pos;
- var result = [];
- for ( var i = 0; i < ps.length; i++ ) {
- var res = ps[i]();
+ var i, res,
+ originalPos = pos,
+ result = [];
+ for ( i = 0; i < ps.length; i++ ) {
+ res = ps[i]();
if ( res === null ) {
pos = originalPos;
return null;
@@ -197,9 +254,9 @@
// must succeed a minimum of n times or return null
function nOrMore( n, p ) {
return function () {
- var originalPos = pos;
- var result = [];
- var parsed = p();
+ var originalPos = pos,
+ result = [],
+ parsed = p();
while ( parsed !== null ) {
result.push( parsed );
parsed = p();
@@ -258,11 +315,12 @@
// but some debuggers can't tell you exactly where they come from. Also the mutually
// recursive functions seem not to work in all browsers then. (Tested IE6-7, Opera, Safari, FF)
// This may be because, to save code, memoization was removed
- var regularLiteral = makeRegexParser( /^[^{}\[\]$\\]/ );
- var regularLiteralWithoutBar = makeRegexParser(/^[^{}\[\]$\\|]/);
- var regularLiteralWithoutSpace = makeRegexParser(/^[^{}\[\]$\s]/);
- var backslash = makeStringParser( "\\" );
- var anyCharacter = makeRegexParser( /^./ );
+ regularLiteral = makeRegexParser( /^[^{}\[\]$\\]/ );
+ regularLiteralWithoutBar = makeRegexParser(/^[^{}\[\]$\\|]/);
+ regularLiteralWithoutSpace = makeRegexParser(/^[^{}\[\]$\s]/);
+ regularLiteralWithSquareBrackets = makeRegexParser( /^[^{}$\\]/ );
+ backslash = makeStringParser( '\\' );
+ anyCharacter = makeRegexParser( /^./ );
function escapedLiteral() {
var result = sequence( [
backslash,
@@ -270,36 +328,50 @@
] );
return result === null ? null : result[1];
}
- var escapedOrLiteralWithoutSpace = choice( [
+ escapedOrLiteralWithoutSpace = choice( [
escapedLiteral,
regularLiteralWithoutSpace
] );
- var escapedOrLiteralWithoutBar = choice( [
+ escapedOrLiteralWithoutBar = choice( [
escapedLiteral,
regularLiteralWithoutBar
] );
- var escapedOrRegularLiteral = choice( [
+ escapedOrRegularLiteral = choice( [
escapedLiteral,
regularLiteral
] );
// Used to define "literals" without spaces, in space-delimited situations
function literalWithoutSpace() {
- var result = nOrMore( 1, escapedOrLiteralWithoutSpace )();
- return result === null ? null : result.join('');
+ var result = nOrMore( 1, escapedOrLiteralWithoutSpace )();
+ return result === null ? null : result.join('');
}
// Used to define "literals" within template parameters. The pipe character is the parameter delimeter, so by default
// it is not a literal in the parameter
function literalWithoutBar() {
- var result = nOrMore( 1, escapedOrLiteralWithoutBar )();
- return result === null ? null : result.join('');
+ var result = nOrMore( 1, escapedOrLiteralWithoutBar )();
+ return result === null ? null : result.join('');
}
+
+ // Used for wikilink page names. Like literalWithoutBar, but
+ // without allowing escapes.
+ function unescapedLiteralWithoutBar() {
+ var result = nOrMore( 1, regularLiteralWithoutBar )();
+ return result === null ? null : result.join('');
+ }
+
function literal() {
- var result = nOrMore( 1, escapedOrRegularLiteral )();
- return result === null ? null : result.join('');
+ var result = nOrMore( 1, escapedOrRegularLiteral )();
+ return result === null ? null : result.join('');
}
- var whitespace = makeRegexParser( /^\s+/ );
- var dollar = makeStringParser( '$' );
- var digits = makeRegexParser( /^\d+/ );
+
+ function curlyBraceTransformExpressionLiteral() {
+ var result = nOrMore( 1, regularLiteralWithSquareBrackets )();
+ return result === null ? null : result.join('');
+ }
+
+ whitespace = makeRegexParser( /^\s+/ );
+ dollar = makeStringParser( '$' );
+ digits = makeRegexParser( /^\d+/ );
function replacement() {
var result = sequence( [
@@ -311,12 +383,13 @@
}
return [ 'REPLACE', parseInt( result[1], 10 ) - 1 ];
}
- var openExtlink = makeStringParser( '[' );
- var closeExtlink = makeStringParser( ']' );
+ openExtlink = makeStringParser( '[' );
+ closeExtlink = makeStringParser( ']' );
// this extlink MUST have inner text, e.g. [foo] not allowed; [foo bar] is allowed
function extlink() {
- var result = null;
- var parsedResult = sequence( [
+ var result, parsedResult;
+ result = null;
+ parsedResult = sequence( [
openExtlink,
nonWhitespaceExpression,
whitespace,
@@ -343,39 +416,73 @@
}
return [ 'LINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
}
- var openLink = makeStringParser( '[[' );
- var closeLink = makeStringParser( ']]' );
+ openLink = makeStringParser( '[[' );
+ closeLink = makeStringParser( ']]' );
+ pipe = makeStringParser( '|' );
+
+ function template() {
+ var result = sequence( [
+ openTemplate,
+ templateContents,
+ closeTemplate
+ ] );
+ return result === null ? null : result[1];
+ }
+
+ wikilinkPage = choice( [
+ unescapedLiteralWithoutBar,
+ template
+ ] );
+
+ function pipedWikilink() {
+ var result = sequence( [
+ wikilinkPage,
+ pipe,
+ expression
+ ] );
+ return result === null ? null : [ result[0], result[2] ];
+ }
+
+ wikilinkContents = choice( [
+ pipedWikilink,
+ wikilinkPage // unpiped link
+ ] );
+
function link() {
- var result = null;
- var parsedResult = sequence( [
+ var result, parsedResult, parsedLinkContents;
+ result = null;
+
+ parsedResult = sequence( [
openLink,
- expression,
+ wikilinkContents,
closeLink
] );
if ( parsedResult !== null ) {
- result = [ 'WLINK', parsedResult[1] ];
+ parsedLinkContents = parsedResult[1];
+ result = [ 'WLINK' ].concat( parsedLinkContents );
}
return result;
}
- var templateName = transform(
+ templateName = transform(
// see $wgLegalTitleChars
// not allowing : due to the need to catch "PLURAL:$1"
makeRegexParser( /^[ !"$&'()*,.\/0-9;=?@A-Z\^_`a-z~\x80-\xFF+\-]+/ ),
function ( result ) { return result.toString(); }
);
function templateParam() {
- var result = sequence( [
+ var expr, result;
+ result = sequence( [
pipe,
nOrMore( 0, paramExpression )
] );
if ( result === null ) {
return null;
}
- var expr = result[1];
- // use a "CONCAT" operator if there are multiple nodes, otherwise return the first node, raw.
- return expr.length > 1 ? [ "CONCAT" ].concat( expr ) : expr[0];
+ expr = result[1];
+ // use a CONCAT operator if there are multiple nodes, otherwise return the first node, raw.
+ return expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[0];
}
- var pipe = makeStringParser( '|' );
+
function templateWithReplacement() {
var result = sequence( [
templateName,
@@ -392,8 +499,8 @@
] );
return result === null ? null : [ result[0], result[2] ];
}
- var colon = makeStringParser(':');
- var templateContents = choice( [
+ colon = makeStringParser(':');
+ templateContents = choice( [
function () {
var res = sequence( [
// templates can have placeholders for dynamic replacement eg: {{PLURAL:$1|one car|$1 cars}}
@@ -414,17 +521,9 @@
return [ res[0] ].concat( res[1] );
}
] );
- var openTemplate = makeStringParser('{{');
- var closeTemplate = makeStringParser('}}');
- function template() {
- var result = sequence( [
- openTemplate,
- templateContents,
- closeTemplate
- ] );
- return result === null ? null : result[1];
- }
- var nonWhitespaceExpression = choice( [
+ openTemplate = makeStringParser('{{');
+ closeTemplate = makeStringParser('}}');
+ nonWhitespaceExpression = choice( [
template,
link,
extLinkParam,
@@ -432,7 +531,7 @@
replacement,
literalWithoutSpace
] );
- var paramExpression = choice( [
+ paramExpression = choice( [
template,
link,
extLinkParam,
@@ -440,7 +539,8 @@
replacement,
literalWithoutBar
] );
- var expression = choice( [
+
+ expression = choice( [
template,
link,
extLinkParam,
@@ -448,25 +548,42 @@
replacement,
literal
] );
- function start() {
- var result = nOrMore( 0, expression )();
+
+ // Used when only {{-transformation is wanted, for 'text'
+ // or 'escaped' formats
+ curlyBraceTransformExpression = choice( [
+ template,
+ replacement,
+ curlyBraceTransformExpressionLiteral
+ ] );
+
+
+ /**
+ * Starts the parse
+ *
+ * @param {Function} rootExpression root parse function
+ */
+ function start( rootExpression ) {
+ var result = nOrMore( 0, rootExpression )();
if ( result === null ) {
return null;
}
- return [ "CONCAT" ].concat( result );
+ return [ 'CONCAT' ].concat( result );
}
// everything above this point is supposed to be stateless/static, but
// I am deferring the work of turning it into prototypes & objects. It's quite fast enough
// finally let's do some actual work...
- var result = start();
+
+ // If you add another possible rootExpression, you must update the astCache key scheme.
+ result = start( this.settings.onlyCurlyBraceTransform ? curlyBraceTransformExpression : expression );
/*
* For success, the p must have gotten to the end of the input
* and returned a non-null.
* n.b. This is part of language infrastructure, so we do not throw an internationalizable message.
*/
- if (result === null || pos !== input.length) {
- throw new Error( "Parse error at position " + pos.toString() + " in input: " + input );
+ if ( result === null || pos !== input.length ) {
+ throw new Error( 'Parse error at position ' + pos.toString() + ' in input: ' + input );
}
return result;
}
@@ -491,18 +608,20 @@
* @return {Mixed} single-string node or array of nodes suitable for jQuery appending
*/
this.emit = function ( node, replacements ) {
- var ret = null;
- var jmsg = this;
+ var ret, subnodes, operation,
+ jmsg = this;
switch ( typeof node ) {
case 'string':
case 'number':
ret = node;
break;
- case 'object': // node is an array of nodes
- var subnodes = $.map( node.slice( 1 ), function ( n ) {
+ // typeof returns object for arrays
+ case 'object':
+ // node is an array of nodes
+ subnodes = $.map( node.slice( 1 ), function ( n ) {
return jmsg.emit( n, replacements );
} );
- var operation = node[0].toLowerCase();
+ operation = node[0].toLowerCase();
if ( typeof jmsg[operation] === 'function' ) {
ret = jmsg[ operation ]( subnodes, replacements );
} else {
@@ -543,8 +662,9 @@
$span.append( childNode );
} );
} else {
- // strings, integers, anything else
- $span.append( node );
+ // Let jQuery append nodes, arrays of nodes and jQuery objects
+ // other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
+ $span.append( $.type( node ) === 'object' ? node : document.createTextNode( node ) );
}
} );
return $span;
@@ -555,7 +675,7 @@
* Note that we expect the parsed parameter to be zero-based. i.e. $1 should have become [ 0 ].
* if the specified parameter is not found return the same string
* (e.g. "$99" -> parameter 98 -> not found -> return "$99" )
- * TODO throw error if nodes.length > 1 ?
+ * TODO: Throw error if nodes.length > 1 ?
* @param {Array} of one element, integer, n >= 0
* @return {String} replacement
*/
@@ -563,13 +683,7 @@
var index = parseInt( nodes[0], 10 );
if ( index < replacements.length ) {
- if ( typeof arg === 'string' ) {
- // replacement is a string, escape it
- return mw.html.escape( replacements[index] );
- } else {
- // replacement is no string, don't touch!
- return replacements[index];
- }
+ return replacements[index];
} else {
// index not found, fallback to displaying variable
return '$' + ( index + 1 );
@@ -578,10 +692,41 @@
/**
* Transform wiki-link
- * TODO unimplemented
+ *
+ * TODO:
+ * It only handles basic cases, either no pipe, or a pipe with an explicit
+ * anchor.
+ *
+ * It does not attempt to handle features like the pipe trick.
+ * However, the pipe trick should usually not be present in wikitext retrieved
+ * from the server, since the replacement is done at save time.
+ * It may, though, if the wikitext appears in extension-controlled content.
+ *
+ * @param nodes
*/
wlink: function ( nodes ) {
- return 'unimplemented';
+ var page, anchor, url;
+
+ page = nodes[0];
+ url = mw.util.wikiGetlink( page );
+
+ // [[Some Page]] or [[Namespace:Some Page]]
+ if ( nodes.length === 1 ) {
+ anchor = page;
+ }
+
+ /*
+ * [[Some Page|anchor text]] or
+ * [[Namespace:Some Page|anchor]
+ */
+ else {
+ anchor = nodes[1];
+ }
+
+ return $( '<a />' ).attr( {
+ title: page,
+ href: url
+ } ).text( anchor );
},
/**
@@ -594,9 +739,9 @@
* @return {jQuery}
*/
link: function ( nodes ) {
- var arg = nodes[0];
- var contents = nodes[1];
- var $el;
+ var $el,
+ arg = nodes[0],
+ contents = nodes[1];
if ( arg instanceof jQuery ) {
$el = arg;
} else {
@@ -639,25 +784,32 @@
* @return {String} selected pluralized form according to current language
*/
plural: function ( nodes ) {
- var count = parseFloat( this.language.convertNumber( nodes[0], true ) );
- var forms = nodes.slice(1);
+ var forms, count;
+ count = parseFloat( this.language.convertNumber( nodes[0], true ) );
+ forms = nodes.slice(1);
return forms.length ? this.language.convertPlural( count, forms ) : '';
},
/**
- * Transform parsed structure into gender
- * Usage {{gender:[gender| mw.user object ] | masculine|feminine|neutral}}.
- * @param {Array} of nodes, [ {String|mw.User}, {String}, {String} , {String} ]
+ * Transform parsed structure according to gender.
+ * Usage {{gender:[ gender | mw.user object ] | masculine form|feminine form|neutral form}}.
+ * The first node is either a string, which can be "male" or "female",
+ * or a User object (not a username).
+ *
+ * @param {Array} of nodes, [ {String|mw.User}, {String}, {String}, {String} ]
* @return {String} selected gender form according to current language
*/
gender: function ( nodes ) {
- var gender;
- if ( nodes[0] && nodes[0].options instanceof mw.Map ){
+ var gender, forms;
+
+ if ( nodes[0] && nodes[0].options instanceof mw.Map ) {
gender = nodes[0].options.get( 'gender' );
} else {
gender = nodes[0];
}
- var forms = nodes.slice(1);
+
+ forms = nodes.slice( 1 );
+
return this.language.gender( gender, forms );
},
@@ -668,9 +820,33 @@
* @return {String} selected grammatical form according to current language
*/
grammar: function ( nodes ) {
- var form = nodes[0];
- var word = nodes[1];
+ var form = nodes[0],
+ word = nodes[1];
return word && form && this.language.convertGrammar( word, form );
+ },
+
+ /**
+ * Tranform parsed structure into a int: (interface language) message include
+ * Invoked by putting {{int:othermessage}} into a message
+ * @param {Array} of nodes
+ * @return {string} Other message
+ */
+ int: function ( nodes ) {
+ return mw.jqueryMsg.getMessageFunction()( nodes[0].toLowerCase() );
+ },
+
+ /**
+ * Takes an unformatted number (arab, no group separators and . as decimal separator)
+ * and outputs it in the localized digit script and formatted with decimal
+ * separator, according to the current language
+ * @param {Array} of nodes
+ * @return {Number|String} formatted number
+ */
+ formatnum: function ( nodes ) {
+ var isInteger = ( nodes[1] && nodes[1] === 'R' ) ? true : false,
+ number = nodes[0];
+
+ return this.language.convertNumber( number, isInteger );
}
};
// Deprecated! don't rely on gM existing.
@@ -681,17 +857,24 @@
$.fn.msg = mw.jqueryMsg.getPlugin();
// Replace the default message parser with jqueryMsg
- var oldParser = mw.Message.prototype.parser;
+ oldParser = mw.Message.prototype.parser;
mw.Message.prototype.parser = function () {
+ var messageFunction;
+
// TODO: should we cache the message function so we don't create a new one every time? Benchmark this maybe?
// Caching is somewhat problematic, because we do need different message functions for different maps, so
// we'd have to cache the parser as a member of this.map, which sounds a bit ugly.
// Do not use mw.jqueryMsg unless required
- if ( this.map.get( this.key ).indexOf( '{{' ) < 0 ) {
+ if ( this.format === 'plain' || !/\{\{|\[/.test(this.map.get( this.key ) ) ) {
// Fall back to mw.msg's simple parser
return oldParser.apply( this );
}
- var messageFunction = mw.jqueryMsg.getMessageFunction( { 'messages': this.map } );
+
+ messageFunction = mw.jqueryMsg.getMessageFunction( {
+ 'messages': this.map,
+ // For format 'escaped', escaping part is handled by mediawiki.js
+ 'format': this.format
+ } );
return messageFunction( this.key, this.parameters );
};
diff --git a/resources/mediawiki/mediawiki.jqueryMsg.peg b/resources/mediawiki/mediawiki.jqueryMsg.peg
index e059ed1d..7879d6fa 100644
--- a/resources/mediawiki/mediawiki.jqueryMsg.peg
+++ b/resources/mediawiki/mediawiki.jqueryMsg.peg
@@ -37,6 +37,7 @@ templateParam
templateName
= tn:[A-Za-z_]+ { return tn.join('').toUpperCase() }
+/* TODO: Update to reflect separate piped and unpiped handling */
link
= "[[" w:expression "]]" { return [ 'WLINK', w ]; }
diff --git a/resources/mediawiki/mediawiki.js b/resources/mediawiki/mediawiki.js
index 19112aed..ca987543 100644
--- a/resources/mediawiki/mediawiki.js
+++ b/resources/mediawiki/mediawiki.js
@@ -1,9 +1,9 @@
/*
* Core MediaWiki JavaScript Library
*/
-/*global mw:true */
+
var mw = ( function ( $, undefined ) {
- "use strict";
+ 'use strict';
/* Private Members */
@@ -13,14 +13,13 @@ var mw = ( function ( $, undefined ) {
/* Object constructors */
/**
- * Map
- *
* Creates an object that can be read from or written to from prototype functions
* that allow both single and multiple variables at once.
+ * @class mw.Map
*
- * @param global boolean Whether to store the values in the global window
+ * @constructor
+ * @param {boolean} global Whether to store the values in the global window
* object or a exclusively in the object property 'values'.
- * @return Map
*/
function Map( global ) {
this.values = global === true ? window : {};
@@ -39,26 +38,26 @@ var mw = ( function ( $, undefined ) {
* If selection was an array, returns an object of key/values (value is null if not found),
* If selection was not passed or invalid, will return the 'values' object member (be careful as
* objects are always passed by reference in JavaScript!).
- * @return Values as a string or object, null if invalid/inexistant.
+ * @return {string|Object|null} Values as a string or object, null if invalid/inexistant.
*/
get: function ( selection, fallback ) {
var results, i;
+ // If we only do this in the `return` block, it'll fail for the
+ // call to get() from the mutli-selection block.
+ fallback = arguments.length > 1 ? fallback : null;
if ( $.isArray( selection ) ) {
selection = slice.call( selection );
results = {};
- for ( i = 0; i < selection.length; i += 1 ) {
+ for ( i = 0; i < selection.length; i++ ) {
results[selection[i]] = this.get( selection[i], fallback );
}
return results;
}
if ( typeof selection === 'string' ) {
- if ( this.values[selection] === undefined ) {
- if ( fallback !== undefined ) {
- return fallback;
- }
- return null;
+ if ( !hasOwn.call( this.values, selection ) ) {
+ return fallback;
}
return this.values[selection];
}
@@ -87,7 +86,7 @@ var mw = ( function ( $, undefined ) {
}
return true;
}
- if ( typeof selection === 'string' && value !== undefined ) {
+ if ( typeof selection === 'string' && arguments.length > 1 ) {
this.values[selection] = value;
return true;
}
@@ -98,36 +97,35 @@ var mw = ( function ( $, undefined ) {
* Checks if one or multiple keys exist.
*
* @param selection {mixed} String key or array of keys to check
- * @return {Boolean} Existence of key(s)
+ * @return {boolean} Existence of key(s)
*/
exists: function ( selection ) {
var s;
if ( $.isArray( selection ) ) {
- for ( s = 0; s < selection.length; s += 1 ) {
- if ( this.values[selection[s]] === undefined ) {
+ for ( s = 0; s < selection.length; s++ ) {
+ if ( typeof selection[s] !== 'string' || !hasOwn.call( this.values, selection[s] ) ) {
return false;
}
}
return true;
}
- return this.values[selection] !== undefined;
+ return typeof selection === 'string' && hasOwn.call( this.values, selection );
}
};
/**
- * Message
- *
* Object constructor for messages,
* similar to the Message class in MediaWiki PHP.
+ * @class mw.Message
*
- * @param map Map Instance of mw.Map
- * @param key String
- * @param parameters Array
- * @return Message
+ * @constructor
+ * @param {mw.Map} map Message storage
+ * @param {string} key
+ * @param {Array} [parameters]
*/
function Message( map, key, parameters ) {
- this.format = 'plain';
+ this.format = 'text';
this.map = map;
this.key = key;
this.parameters = parameters === undefined ? [] : slice.call( parameters );
@@ -136,9 +134,13 @@ var mw = ( function ( $, undefined ) {
Message.prototype = {
/**
- * Simple message parser, does $N replacement and nothing else.
+ * Simple message parser, does $N replacement, HTML-escaping (only for
+ * 'escaped' format), and nothing else.
+ *
* This may be overridden to provide a more complex message parser.
*
+ * The primary override is in mediawiki.jqueryMsg.
+ *
* This function will not be called for nonexistent messages.
*/
parser: function () {
@@ -152,8 +154,8 @@ var mw = ( function ( $, undefined ) {
/**
* Appends (does not replace) parameters for replacement to the .parameters property.
*
- * @param parameters Array
- * @return Message
+ * @param {Array} parameters
+ * @chainable
*/
params: function ( parameters ) {
var i;
@@ -166,25 +168,21 @@ var mw = ( function ( $, undefined ) {
/**
* Converts message object to it's string form based on the state of format.
*
- * @return string Message as a string in the current form or <key> if key does not exist.
+ * @return {string} Message as a string in the current form or `<key>` if key does not exist.
*/
toString: function () {
var text;
if ( !this.exists() ) {
// Use <key> as text if key does not exist
- if ( this.format !== 'plain' ) {
- // format 'escape' and 'parse' need to have the brackets and key html escaped
+ if ( this.format === 'escaped' || this.format === 'parse' ) {
+ // format 'escaped' and 'parse' need to have the brackets and key html escaped
return mw.html.escape( '<' + this.key + '>' );
}
return '<' + this.key + '>';
}
- if ( this.format === 'plain' ) {
- // @todo FIXME: Although not applicable to core Message,
- // Plugins like jQueryMsg should be able to distinguish
- // between 'plain' (only variable replacement and plural/gender)
- // and actually parsing wikitext to HTML.
+ if ( this.format === 'plain' || this.format === 'text' || this.format === 'parse' ) {
text = this.parser();
}
@@ -193,15 +191,16 @@ var mw = ( function ( $, undefined ) {
text = mw.html.escape( text );
}
- if ( this.format === 'parse' ) {
- text = this.parser();
- }
-
return text;
},
/**
- * Changes format to parse and converts message to string
+ * Changes format to 'parse' and converts message to string
+ *
+ * If jqueryMsg is loaded, this parses the message text from wikitext
+ * (where supported) to HTML
+ *
+ * Otherwise, it is equivalent to plain.
*
* @return {string} String form of parsed message
*/
@@ -211,7 +210,10 @@ var mw = ( function ( $, undefined ) {
},
/**
- * Changes format to plain and converts message to string
+ * Changes format to 'plain' and converts message to string
+ *
+ * This substitutes parameters, but otherwise does not change the
+ * message text.
*
* @return {string} String form of plain message
*/
@@ -221,7 +223,23 @@ var mw = ( function ( $, undefined ) {
},
/**
- * Changes the format to html escaped and converts message to string
+ * Changes format to 'text' and converts message to string
+ *
+ * If jqueryMsg is loaded, {{-transformation is done where supported
+ * (such as {{plural:}}, {{gender:}}, {{int:}}).
+ *
+ * Otherwise, it is equivalent to plain.
+ */
+ text: function () {
+ this.format = 'text';
+ return this.toString();
+ },
+
+ /**
+ * Changes the format to 'escaped' and converts message to string
+ *
+ * This is equivalent to using the 'text' format (see text method), then
+ * HTML-escaping the output.
*
* @return {string} String form of html escaped message
*/
@@ -233,13 +251,19 @@ var mw = ( function ( $, undefined ) {
/**
* Checks if message exists
*
- * @return {string} String form of parsed message
+ * @see mw.Map#exists
+ * @return {boolean}
*/
exists: function () {
return this.map.exists( this.key );
}
};
+ /**
+ * @class mw
+ * @alternateClassName mediaWiki
+ * @singleton
+ */
return {
/* Public Members */
@@ -249,77 +273,72 @@ var mw = ( function ( $, undefined ) {
*/
log: function () { },
- /**
- * @var constructor Make the Map constructor publicly available.
- */
+ // Make the Map constructor publicly available.
Map: Map,
- /**
- * @var constructor Make the Message constructor publicly available.
- */
+ // Make the Message constructor publicly available.
Message: Message,
/**
* List of configuration values
*
* Dummy placeholder. Initiated in startUp module as a new instance of mw.Map().
- * If $wgLegacyJavaScriptGlobals is true, this Map will have its values
+ * If `$wgLegacyJavaScriptGlobals` is true, this Map will have its values
* in the global window object.
+ * @property
*/
config: null,
/**
- * @var object
- *
* Empty object that plugins can be installed in.
+ * @property
*/
libs: {},
/* Extension points */
+ /**
+ * @property
+ */
legacy: {},
/**
* Localization system
+ * @property {mw.Map}
*/
messages: new Map(),
/* Public Methods */
/**
- * Gets a message object, similar to wfMessage()
+ * Gets a message object, similar to wfMessage().
*
- * @param key string Key of message to get
- * @param parameter_1 mixed First argument in a list of variadic arguments,
- * each a parameter for $N replacement in messages.
- * @return Message
+ * @param {string} key Key of message to get
+ * @param {Mixed...} parameters Parameters for the $N replacements in messages.
+ * @return {mw.Message}
*/
- message: function ( key, parameter_1 /* [, parameter_2] */ ) {
- var parameters;
- // Support variadic arguments
- if ( parameter_1 !== undefined ) {
- parameters = slice.call( arguments );
- parameters.shift();
- } else {
- parameters = [];
- }
+ message: function ( key ) {
+ // Variadic arguments
+ var parameters = slice.call( arguments, 1 );
return new Message( mw.messages, key, parameters );
},
/**
* Gets a message string, similar to wfMessage()
*
- * @param key string Key of message to get
- * @param parameters mixed First argument in a list of variadic arguments,
- * each a parameter for $N replacement in messages.
- * @return String.
+ * @see mw.Message#toString
+ * @param {string} key Key of message to get
+ * @param {Mixed...} parameters Parameters for the $N replacements in messages.
+ * @return {string}
*/
- msg: function ( /* key, parameter_1, parameter_2, .. */ ) {
+ msg: function ( /* key, parameters... */ ) {
return mw.message.apply( mw.message, arguments ).toString();
},
/**
* Client-side module loader which integrates with the MediaWiki ResourceLoader
+ * @class mw.loader
+ * @singleton
*/
loader: ( function () {
@@ -338,29 +357,32 @@ var mw = ( function ( $, undefined ) {
* mw.loader.implement.
*
* Format:
- * {
- * 'moduleName': {
- * 'version': ############## (unix timestamp),
- * 'dependencies': ['required.foo', 'bar.also', ...], (or) function () {}
- * 'group': 'somegroup', (or) null,
- * 'source': 'local', 'someforeignwiki', (or) null
- * 'state': 'registered', 'loading', 'loaded', 'ready', 'error' or 'missing'
- * 'script': ...,
- * 'style': ...,
- * 'messages': { 'key': 'value' },
- * }
- * }
+ * {
+ * 'moduleName': {
+ * 'version': ############## (unix timestamp),
+ * 'dependencies': ['required.foo', 'bar.also', ...], (or) function () {}
+ * 'group': 'somegroup', (or) null,
+ * 'source': 'local', 'someforeignwiki', (or) null
+ * 'state': 'registered', 'loaded', 'loading', 'ready', 'error' or 'missing'
+ * 'script': ...,
+ * 'style': ...,
+ * 'messages': { 'key': 'value' },
+ * }
+ * }
+ *
+ * @property
+ * @private
*/
var registry = {},
- /**
- * Mapping of sources, keyed by source-id, values are objects.
- * Format:
- * {
- * 'sourceId': {
- * 'loadScript': 'http://foo.bar/w/load.php'
- * }
- * }
- */
+ //
+ // Mapping of sources, keyed by source-id, values are objects.
+ // Format:
+ // {
+ // 'sourceId': {
+ // 'loadScript': 'http://foo.bar/w/load.php'
+ // }
+ // }
+ //
sources = {},
// List of modules which will be loaded as when ready
batch = [],
@@ -369,7 +391,11 @@ var mw = ( function ( $, undefined ) {
// List of callback functions waiting for modules to be ready to be called
jobs = [],
// Selector cache for the marker element. Use getMarker() to get/use the marker!
- $marker = null;
+ $marker = null,
+ // Buffer for addEmbeddedCSS.
+ cssBuffer = '',
+ // Callbacks for addEmbeddedCSS.
+ cssCallbacks = $.Callbacks();
/* Private methods */
@@ -392,10 +418,11 @@ var mw = ( function ( $, undefined ) {
/**
* Create a new style tag and add it to the DOM.
*
- * @param text String: CSS text
- * @param nextnode mixed: [optional] An Element or jQuery object for an element where
- * the style tag should be inserted before. Otherwise appended to the <head>.
- * @return HTMLStyleElement
+ * @private
+ * @param {string} text CSS text
+ * @param {Mixed} [nextnode] An Element or jQuery object for an element where
+ * the style tag should be inserted before. Otherwise appended to the `<head>`.
+ * @return {HTMLElement} Node reference to the created `<style>` tag.
*/
function addStyleTag( text, nextnode ) {
var s = document.createElement( 'style' );
@@ -429,76 +456,107 @@ var mw = ( function ( $, undefined ) {
}
/**
- * Checks if certain cssText is safe to append to
- * a stylesheet.
- *
- * Right now it only makes sure that cssText containing @import
- * rules will end up in a new stylesheet (as those only work when
- * placed at the start of a stylesheet; bug 35562).
- * This could later be extended to take care of other bugs, such as
- * the IE cssRules limit - not the same as the IE styleSheets limit).
+ * Checks whether it is safe to add this css to a stylesheet.
+ *
+ * @private
+ * @param {string} cssText
+ * @return {boolean} False if a new one must be created.
*/
- function canExpandStylesheetWith( $style, cssText ) {
+ function canExpandStylesheetWith( cssText ) {
+ // Makes sure that cssText containing `@import`
+ // rules will end up in a new stylesheet (as those only work when
+ // placed at the start of a stylesheet; bug 35562).
return cssText.indexOf( '@import' ) === -1;
}
- function addEmbeddedCSS( cssText ) {
+ /**
+ * @param {string} [cssText=cssBuffer] If called without cssText,
+ * the internal buffer will be inserted instead.
+ * @param {Function} [callback]
+ */
+ function addEmbeddedCSS( cssText, callback ) {
var $style, styleEl;
- $style = getMarker().prev();
- // Re-use <style> tags if possible, this to try to stay
- // under the IE stylesheet limit (bug 31676).
- // Also verify that the the element before Marker actually is one
- // that came from ResourceLoader, and not a style tag that some
- // other script inserted before our marker, or, more importantly,
- // it may not be a style tag at all (could be <meta> or <script>).
- if (
- $style.data( 'ResourceLoaderDynamicStyleTag' ) === true &&
- canExpandStylesheetWith( $style, cssText )
- ) {
- // There's already a dynamic <style> tag present and
- // canExpandStylesheetWith() gave a green light to append more to it.
- styleEl = $style.get( 0 );
- if ( styleEl.styleSheet ) {
- try {
- styleEl.styleSheet.cssText += cssText; // IE
- } catch ( e ) {
- log( 'addEmbeddedCSS fail\ne.message: ' + e.message, e );
- }
- } else {
- styleEl.appendChild( document.createTextNode( String( cssText ) ) );
+
+ if ( callback ) {
+ cssCallbacks.add( callback );
+ }
+
+ // Yield once before inserting the <style> tag. There are likely
+ // more calls coming up which we can combine this way.
+ // Appending a stylesheet and waiting for the browser to repaint
+ // is fairly expensive, this reduces it (bug 45810)
+ if ( cssText ) {
+ // Be careful not to extend the buffer with css that needs a new stylesheet
+ if ( !cssBuffer || canExpandStylesheetWith( cssText ) ) {
+ // Linebreak for somewhat distinguishable sections
+ // (the rl-cachekey comment separating each)
+ cssBuffer += '\n' + cssText;
+ // TODO: Use requestAnimationFrame in the future which will
+ // perform even better by not injecting styles while the browser
+ // is paiting.
+ setTimeout( function () {
+ // Can't pass addEmbeddedCSS to setTimeout directly because Firefox
+ // (below version 13) has the non-standard behaviour of passing a
+ // numerical "lateness" value as first argument to this callback
+ // http://benalman.com/news/2009/07/the-mysterious-firefox-settime/
+ addEmbeddedCSS();
+ } );
+ return;
}
+
+ // This is a delayed call and we got a buffer still
+ } else if ( cssBuffer ) {
+ cssText = cssBuffer;
+ cssBuffer = '';
} else {
- $( addStyleTag( cssText, getMarker() ) )
- .data( 'ResourceLoaderDynamicStyleTag', true );
+ // This is a delayed call, but buffer is already cleared by
+ // another delayed call.
+ return;
}
- }
- function compare( a, b ) {
- var i;
- if ( a.length !== b.length ) {
- return false;
- }
- for ( i = 0; i < b.length; i += 1 ) {
- if ( $.isArray( a[i] ) ) {
- if ( !compare( a[i], b[i] ) ) {
- return false;
+ // By default, always create a new <style>. Appending text
+ // to a <style> tag means the contents have to be re-parsed (bug 45810).
+ // Except, of course, in IE below 9, in there we default to
+ // re-using and appending to a <style> tag due to the
+ // IE stylesheet limit (bug 31676).
+ if ( 'documentMode' in document && document.documentMode <= 9 ) {
+
+ $style = getMarker().prev();
+ // Verify that the the element before Marker actually is a
+ // <style> tag and one that came from ResourceLoader
+ // (not some other style tag or even a `<meta>` or `<script>`).
+ if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
+ // There's already a dynamic <style> tag present and
+ // canExpandStylesheetWith() gave a green light to append more to it.
+ styleEl = $style.get( 0 );
+ if ( styleEl.styleSheet ) {
+ try {
+ styleEl.styleSheet.cssText += cssText; // IE
+ } catch ( e ) {
+ log( 'addEmbeddedCSS fail\ne.message: ' + e.message, e );
+ }
+ } else {
+ styleEl.appendChild( document.createTextNode( String( cssText ) ) );
}
- }
- if ( a[i] !== b[i] ) {
- return false;
+ cssCallbacks.fire().empty();
+ return;
}
}
- return true;
+
+ $( addStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
+
+ cssCallbacks.fire().empty();
}
/**
* Generates an ISO8601 "basic" string from a UNIX timestamp
+ * @private
*/
function formatVersionNumber( timestamp ) {
- var pad = function ( a, b, c ) {
- return [a < 10 ? '0' + a : a, b < 10 ? '0' + b : b, c < 10 ? '0' + c : c].join( '' );
- },
- d = new Date();
+ var d = new Date();
+ function pad( a, b, c ) {
+ return [a < 10 ? '0' + a : a, b < 10 ? '0' + b : b, c < 10 ? '0' + c : c].join( '' );
+ }
d.setTime( timestamp * 1000 );
return [
pad( d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate() ), 'T',
@@ -509,15 +567,16 @@ var mw = ( function ( $, undefined ) {
/**
* Resolves dependencies and detects circular references.
*
- * @param module String Name of the top-level module whose dependencies shall be
+ * @private
+ * @param {string} module Name of the top-level module whose dependencies shall be
* resolved and sorted.
- * @param resolved Array Returns a topological sort of the given module and its
+ * @param {Array} resolved Returns a topological sort of the given module and its
* dependencies, such that later modules depend on earlier modules. The array
* contains the module names. If the array contains already some module names,
* this function appends its result to the pre-existing array.
- * @param unresolved Object [optional] Hash used to track the current dependency
+ * @param {Object} [unresolved] Hash used to track the current dependency
* chain; used to report loops in the dependency graph.
- * @throws Error if any unregistered module or a dependency loop is encountered
+ * @throws {Error} If any unregistered module or a dependency loop is encountered
*/
function sortDependencies( module, resolved, unresolved ) {
var n, deps, len;
@@ -566,9 +625,10 @@ var mw = ( function ( $, undefined ) {
* Gets a list of module names that a module depends on in their proper dependency
* order.
*
- * @param module string module name or array of string module names
- * @return list of dependencies, including 'module'.
- * @throws Error if circular reference is detected
+ * @private
+ * @param {string} module Module name or array of string module names
+ * @return {Array} list of dependencies, including 'module'.
+ * @throws {Error} If circular reference is detected
*/
function resolve( module ) {
var m, resolved;
@@ -597,10 +657,11 @@ var mw = ( function ( $, undefined ) {
* One can also filter for 'unregistered', which will return the
* modules names that don't have a registry entry.
*
- * @param states string or array of strings of module states to filter by
- * @param modules array list of module names to filter (optional, by default the entire
+ * @private
+ * @param {string|string[]} states Module states to filter by
+ * @param {Array} modules List of module names to filter (optional, by default the entire
* registry is used)
- * @return array list of filtered module names
+ * @return {Array} List of filtered module names
*/
function filter( states, modules ) {
var list, module, s, m;
@@ -642,9 +703,9 @@ var mw = ( function ( $, undefined ) {
* Determine whether all dependencies are in state 'ready', which means we may
* execute the module or job now.
*
- * @param dependencies Array dependencies (module names) to be checked.
- *
- * @return Boolean true if all dependencies are in state 'ready', false otherwise
+ * @private
+ * @param {Array} dependencies Dependencies (module names) to be checked.
+ * @return {boolean} True if all dependencies are in state 'ready', false otherwise
*/
function allReady( dependencies ) {
return filter( 'ready', dependencies ).length === dependencies.length;
@@ -656,8 +717,9 @@ var mw = ( function ( $, undefined ) {
* Gets console references in each invocation, so that delayed debugging tools work
* fine. No need for optimization here, which would only result in losing logs.
*
- * @param msg String text for the log entry.
- * @param e Error [optional] to also log.
+ * @private
+ * @param {string} msg text for the log entry.
+ * @param {Error} [e]
*/
function log( msg, e ) {
var console = window.console;
@@ -679,7 +741,8 @@ var mw = ( function ( $, undefined ) {
* state up the dependency tree; otherwise, execute all jobs/modules that now have all their
* dependencies satisfied. On jobs depending on a failed module, run the error callback, if any.
*
- * @param module String name of module that entered one of the states 'ready', 'error', or 'missing'.
+ * @private
+ * @param {string} module Name of module that entered one of the states 'ready', 'error', or 'missing'.
*/
function handlePending( module ) {
var j, job, hasErrors, m, stateChange;
@@ -712,7 +775,7 @@ var mw = ( function ( $, undefined ) {
j -= 1;
try {
if ( hasErrors ) {
- throw new Error ("Module " + module + " failed.");
+ throw new Error( 'Module ' + module + ' failed.');
} else {
if ( $.isFunction( job.ready ) ) {
job.ready();
@@ -747,8 +810,9 @@ var mw = ( function ( $, undefined ) {
* Adds a script tag to the DOM, either using document.write or low-level DOM manipulation,
* depending on whether document-ready has occurred yet and whether we are in async mode.
*
- * @param src String: URL to script, will be used as the src attribute in the script tag
- * @param callback Function: Optional callback which will be run when the script is done
+ * @private
+ * @param {string} src URL to script, will be used as the src attribute in the script tag
+ * @param {Function} [callback] Callback which will be run when the script is done
*/
function addScript( src, callback, async ) {
/*jshint evil:true */
@@ -758,16 +822,20 @@ var mw = ( function ( $, undefined ) {
// Using isReady directly instead of storing it locally from
// a $.fn.ready callback (bug 31895).
if ( $.isReady || async ) {
- // jQuery's getScript method is NOT better than doing this the old-fashioned way
- // because jQuery will eval the script's code, and errors will not have sane
- // line numbers.
+ // Can't use jQuery.getScript because that only uses <script> for cross-domain,
+ // it uses XHR and eval for same-domain scripts, which we don't want because it
+ // messes up line numbers.
+ // The below is based on jQuery ([jquery@1.8.2]/src/ajax/script.js)
+
+ // IE-safe way of getting the <head>. document.head isn't supported
+ // in old IE, and doesn't work when in the <head>.
+ head = document.getElementsByTagName( 'head' )[0] || document.body;
+
script = document.createElement( 'script' );
- script.setAttribute( 'src', src );
- script.setAttribute( 'type', 'text/javascript' );
+ script.async = true;
+ script.src = src;
if ( $.isFunction( callback ) ) {
- // Attach handlers for all browsers (based on jQuery.ajax)
script.onload = script.onreadystatechange = function () {
-
if (
!done
&& (
@@ -775,24 +843,20 @@ var mw = ( function ( $, undefined ) {
|| /loaded|complete/.test( script.readyState )
)
) {
-
done = true;
- callback();
+ // Handle memory leak in IE
+ script.onload = script.onreadystatechange = null;
- // Handle memory leak in IE. This seems to fail in
- // IE7 sometimes (Permission Denied error when
- // accessing script.parentNode) so wrap it in
- // a try catch.
- try {
- script.onload = script.onreadystatechange = null;
- if ( script.parentNode ) {
- script.parentNode.removeChild( script );
- }
-
- // Dereference the script
- script = undefined;
- } catch ( e ) { }
+ // Remove the script
+ if ( script.parentNode ) {
+ script.parentNode.removeChild( script );
+ }
+
+ // Dereference the script
+ script = undefined;
+
+ callback();
}
};
}
@@ -800,20 +864,17 @@ var mw = ( function ( $, undefined ) {
if ( window.opera ) {
// Appending to the <head> blocks rendering completely in Opera,
// so append to the <body> after document ready. This means the
- // scripts only start loading after the document has been rendered,
+ // scripts only start loading after the document has been rendered,
// but so be it. Opera users don't deserve faster web pages if their
- // browser makes it impossible
- $( function () { document.body.appendChild( script ); } );
+ // browser makes it impossible.
+ $( function () {
+ document.body.appendChild( script );
+ } );
} else {
- // IE-safe way of getting the <head> . document.documentElement.head doesn't
- // work in scripts that run in the <head>
- head = document.getElementsByTagName( 'head' )[0];
- ( document.body || head ).appendChild( script );
+ head.appendChild( script );
}
} else {
- document.write( mw.html.element(
- 'script', { 'type': 'text/javascript', 'src': src }, ''
- ) );
+ document.write( mw.html.element( 'script', { 'src': src }, '' ) );
if ( $.isFunction( callback ) ) {
// Document.write is synchronous, so this is called when it's done
// FIXME: that's a lie. doc.write isn't actually synchronous
@@ -825,10 +886,12 @@ var mw = ( function ( $, undefined ) {
/**
* Executes a loaded module, making it ready to use
*
- * @param module string module name to execute
+ * @private
+ * @param {string} module Module name to execute
*/
function execute( module ) {
- var key, value, media, i, urls, script, markModuleReady, nestedAddScript;
+ var key, value, media, i, urls, cssHandle, checkCssHandles,
+ cssHandlesRegistered = false;
if ( registry[module] === undefined ) {
throw new Error( 'Module has not been registered yet: ' + module );
@@ -837,12 +900,13 @@ var mw = ( function ( $, undefined ) {
} else if ( registry[module].state === 'loading' ) {
throw new Error( 'Module has not completed loading yet: ' + module );
} else if ( registry[module].state === 'ready' ) {
- throw new Error( 'Module has already been loaded: ' + module );
+ throw new Error( 'Module has already been executed: ' + module );
}
/**
* Define loop-function here for efficiency
* and to avoid re-using badly scoped variables.
+ * @ignore
*/
function addLink( media, url ) {
var el = document.createElement( 'link' );
@@ -854,6 +918,80 @@ var mw = ( function ( $, undefined ) {
el.href = url;
}
+ function runScript() {
+ var script, markModuleReady, nestedAddScript;
+ try {
+ script = registry[module].script;
+ markModuleReady = function () {
+ registry[module].state = 'ready';
+ handlePending( module );
+ };
+ nestedAddScript = function ( arr, callback, async, i ) {
+ // Recursively call addScript() in its own callback
+ // for each element of arr.
+ if ( i >= arr.length ) {
+ // We're at the end of the array
+ callback();
+ return;
+ }
+
+ addScript( arr[i], function () {
+ nestedAddScript( arr, callback, async, i + 1 );
+ }, async );
+ };
+
+ if ( $.isArray( script ) ) {
+ nestedAddScript( script, markModuleReady, registry[module].async, 0 );
+ } else if ( $.isFunction( script ) ) {
+ registry[module].state = 'ready';
+ script( $ );
+ handlePending( module );
+ }
+ } catch ( e ) {
+ // This needs to NOT use mw.log because these errors are common in production mode
+ // and not in debug mode, such as when a symbol that should be global isn't exported
+ log( 'Exception thrown by ' + module + ': ' + e.message, e );
+ registry[module].state = 'error';
+ handlePending( module );
+ }
+ }
+
+ // This used to be inside runScript, but since that is now fired asychronously
+ // (after CSS is loaded) we need to set it here right away. It is crucial that
+ // when execute() is called this is set synchronously, otherwise modules will get
+ // executed multiple times as the registry will state that it isn't loading yet.
+ registry[module].state = 'loading';
+
+ // Add localizations to message system
+ if ( $.isPlainObject( registry[module].messages ) ) {
+ mw.messages.set( registry[module].messages );
+ }
+
+ // Make sure we don't run the scripts until all (potentially asynchronous)
+ // stylesheet insertions have completed.
+ ( function () {
+ var pending = 0;
+ checkCssHandles = function () {
+ // cssHandlesRegistered ensures we don't take off too soon, e.g. when
+ // one of the cssHandles is fired while we're still creating more handles.
+ if ( cssHandlesRegistered && pending === 0 && runScript ) {
+ runScript();
+ runScript = undefined; // Revoke
+ }
+ };
+ cssHandle = function () {
+ var check = checkCssHandles;
+ pending++;
+ return function () {
+ if (check) {
+ pending--;
+ check();
+ check = undefined; // Revoke
+ }
+ };
+ };
+ }() );
+
// Process styles (see also mw.loader.implement)
// * back-compat: { <media>: css }
// * back-compat: { <media>: [url, ..] }
@@ -872,7 +1010,7 @@ var mw = ( function ( $, undefined ) {
// Strings are pre-wrapped in "@media". The media-type was just ""
// (because it had to be set to something).
// This is one of the reasons why this format is no longer used.
- addEmbeddedCSS( value );
+ addEmbeddedCSS( value, cssHandle() );
} else {
// back-compat: { <media>: [url, ..] }
media = key;
@@ -889,7 +1027,7 @@ var mw = ( function ( $, undefined ) {
addLink( media, value[i] );
} else if ( key === 'css' ) {
// { "css": [css, ..] }
- addEmbeddedCSS( value[i] );
+ addEmbeddedCSS( value[i], cssHandle() );
}
}
// Not an array, but a regular object
@@ -906,61 +1044,24 @@ var mw = ( function ( $, undefined ) {
}
}
- // Add localizations to message system
- if ( $.isPlainObject( registry[module].messages ) ) {
- mw.messages.set( registry[module].messages );
- }
-
- // Execute script
- try {
- script = registry[module].script;
- markModuleReady = function () {
- registry[module].state = 'ready';
- handlePending( module );
- };
- nestedAddScript = function ( arr, callback, async, i ) {
- // Recursively call addScript() in its own callback
- // for each element of arr.
- if ( i >= arr.length ) {
- // We're at the end of the array
- callback();
- return;
- }
-
- addScript( arr[i], function () {
- nestedAddScript( arr, callback, async, i + 1 );
- }, async );
- };
-
- if ( $.isArray( script ) ) {
- registry[module].state = 'loading';
- nestedAddScript( script, markModuleReady, registry[module].async, 0 );
- } else if ( $.isFunction( script ) ) {
- registry[module].state = 'ready';
- script( $ );
- handlePending( module );
- }
- } catch ( e ) {
- // This needs to NOT use mw.log because these errors are common in production mode
- // and not in debug mode, such as when a symbol that should be global isn't exported
- log( 'Exception thrown by ' + module + ': ' + e.message, e );
- registry[module].state = 'error';
- handlePending( module );
- }
+ // Kick off.
+ cssHandlesRegistered = true;
+ checkCssHandles();
}
/**
* Adds a dependencies to the queue with optional callbacks to be run
* when the dependencies are ready or fail
*
- * @param dependencies string module name or array of string module names
- * @param ready function callback to execute when all dependencies are ready
- * @param error function callback to execute when any dependency fails
- * @param async (optional) If true, load modules asynchronously even if
- * document ready has not yet occurred
+ * @private
+ * @param {string|string[]} dependencies Module name or array of string module names
+ * @param {Function} [ready] Callback to execute when all dependencies are ready
+ * @param {Function} [error] Callback to execute when any dependency fails
+ * @param {boolean} [async] If true, load modules asynchronously even if
+ * document ready has not yet occurred.
*/
function request( dependencies, ready, error, async ) {
- var regItemDeps, regItemDepLen, n;
+ var n;
// Allow calling by single module name
if ( typeof dependencies === 'string' ) {
@@ -1012,6 +1113,7 @@ var mw = ( function ( $, undefined ) {
/**
* Converts a module map of the form { foo: [ 'bar', 'baz' ], bar: [ 'baz, 'quux' ] }
* to a query string of the form foo.bar,baz|bar.baz,quux
+ * @private
*/
function buildModulesString( moduleMap ) {
var arr = [], p, prefix;
@@ -1025,14 +1127,15 @@ var mw = ( function ( $, undefined ) {
/**
* Asynchronously append a script tag to the end of the body
* that invokes load.php
- * @param moduleMap {Object}: Module map, see buildModulesString()
- * @param currReqBase {Object}: Object with other parameters (other than 'modules') to use in the request
- * @param sourceLoadScript {String}: URL of load.php
- * @param async {Boolean}: If true, use an asynchrounous request even if document ready has not yet occurred
+ * @private
+ * @param {Object} moduleMap Module map, see #buildModulesString
+ * @param {Object} currReqBase Object with other parameters (other than 'modules') to use in the request
+ * @param {string} sourceLoadScript URL of load.php
+ * @param {boolean} async If true, use an asynchrounous request even if document ready has not yet occurred
*/
function doRequest( moduleMap, currReqBase, sourceLoadScript, async ) {
var request = $.extend(
- { 'modules': buildModulesString( moduleMap ) },
+ { modules: buildModulesString( moduleMap ) },
currReqBase
);
request = sortQuery( request );
@@ -1127,9 +1230,9 @@ var mw = ( function ( $, undefined ) {
}
}
- currReqBase = $.extend( { 'version': formatVersionNumber( maxVersion ) }, reqBase );
+ currReqBase = $.extend( { version: formatVersionNumber( maxVersion ) }, reqBase );
// For user modules append a user name to the request.
- if ( group === "user" && mw.config.get( 'wgUserName' ) !== null ) {
+ if ( group === 'user' && mw.config.get( 'wgUserName' ) !== null ) {
currReqBase.user = mw.config.get( 'wgUserName' );
}
currReqBaseLength = $.param( currReqBase ).length;
@@ -1183,10 +1286,10 @@ var mw = ( function ( $, undefined ) {
/**
* Register a source.
*
- * @param id {String}: Short lowercase a-Z string representing a source, only used internally.
- * @param props {Object}: Object containing only the loadScript property which is a url to
- * the load.php location of the source.
- * @return {Boolean}
+ * @param {string} id Short lowercase a-Z string representing a source, only used internally.
+ * @param {Object} props Object containing only the loadScript property which is a url to
+ * the load.php location of the source.
+ * @return {boolean}
*/
addSource: function ( id, props ) {
var source;
@@ -1242,15 +1345,15 @@ var mw = ( function ( $, undefined ) {
}
// List the module as registered
registry[module] = {
- 'version': version !== undefined ? parseInt( version, 10 ) : 0,
- 'dependencies': [],
- 'group': typeof group === 'string' ? group : null,
- 'source': typeof source === 'string' ? source: 'local',
- 'state': 'registered'
+ version: version !== undefined ? parseInt( version, 10 ) : 0,
+ dependencies: [],
+ group: typeof group === 'string' ? group : null,
+ source: typeof source === 'string' ? source: 'local',
+ state: 'registered'
};
if ( typeof dependencies === 'string' ) {
// Allow dependencies to be given as a single module name
- registry[module].dependencies = [dependencies];
+ registry[module].dependencies = [ dependencies ];
} else if ( typeof dependencies === 'object' || $.isFunction( dependencies ) ) {
// Allow dependencies to be given as an array of module names
// or a function which returns an array
@@ -1265,20 +1368,20 @@ var mw = ( function ( $, undefined ) {
*
* All arguments are required.
*
- * @param {String} module Name of module
+ * @param {string} module Name of module
* @param {Function|Array} script Function with module code or Array of URLs to
- * be used as the src attribute of a new <script> tag.
+ * be used as the src attribute of a new `<script>` tag.
* @param {Object} style Should follow one of the following patterns:
- * { "css": [css, ..] }
- * { "url": { <media>: [url, ..] } }
- * And for backwards compatibility (needs to be supported forever due to caching):
- * { <media>: css }
- * { <media>: [url, ..] }
+ * { "css": [css, ..] }
+ * { "url": { <media>: [url, ..] } }
+ * And for backwards compatibility (needs to be supported forever due to caching):
+ * { <media>: css }
+ * { <media>: [url, ..] }
*
- * The reason css strings are not concatenated anymore is bug 31676. We now check
- * whether it's safe to extend the stylesheet (see canExpandStylesheetWith).
+ * The reason css strings are not concatenated anymore is bug 31676. We now check
+ * whether it's safe to extend the stylesheet (see #canExpandStylesheetWith).
*
- * @param {Object} msgs List of key/value pairs to be passed through mw.messages.set
+ * @param {Object} msgs List of key/value pairs to be added to {@link mw#messages}.
*/
implement: function ( module, script, style, msgs ) {
// Validate input
@@ -1331,7 +1434,7 @@ var mw = ( function ( $, undefined ) {
}
// Allow calling with a single dependency as a string
if ( tod === 'string' ) {
- dependencies = [dependencies];
+ dependencies = [ dependencies ];
}
// Resolve entire dependency map
dependencies = resolve( dependencies );
@@ -1366,7 +1469,7 @@ var mw = ( function ( $, undefined ) {
* be assumed if loading a URL, and false will be assumed otherwise.
*/
load: function ( modules, type, async ) {
- var filtered, m, module;
+ var filtered, m, module, l;
// Validate input
if ( typeof modules !== 'object' && typeof modules !== 'string' ) {
@@ -1381,11 +1484,13 @@ var mw = ( function ( $, undefined ) {
async = true;
}
if ( type === 'text/css' ) {
- $( 'head' ).append( $( '<link>', {
- rel: 'stylesheet',
- type: 'text/css',
- href: modules
- } ) );
+ // IE7-8 throws security warnings when inserting a <link> tag
+ // with a protocol-relative URL set though attributes (instead of
+ // properties) - when on HTTPS. See also bug #.
+ l = document.createElement( 'link' );
+ l.rel = 'stylesheet';
+ l.href = modules;
+ $( 'head' ).append( l );
return;
}
if ( type === 'text/javascript' || type === undefined ) {
@@ -1396,7 +1501,7 @@ var mw = ( function ( $, undefined ) {
throw new Error( 'invalid type for external url, must be text/css or text/javascript. not ' + type );
}
// Called with single module
- modules = [modules];
+ modules = [ modules ];
}
// Filter out undefined modules, otherwise resolve() will throw
@@ -1427,7 +1532,7 @@ var mw = ( function ( $, undefined ) {
return;
}
// Since some modules are not yet ready, queue up a request.
- request( filtered, null, null, async );
+ request( filtered, undefined, undefined, async );
},
/**
@@ -1448,7 +1553,7 @@ var mw = ( function ( $, undefined ) {
if ( registry[module] === undefined ) {
mw.loader.register( module );
}
- if ( $.inArray(state, ['ready', 'error', 'missing']) !== -1
+ if ( $.inArray( state, ['ready', 'error', 'missing'] ) !== -1
&& registry[module].state !== state ) {
// Make sure pending modules depending on this one get executed if their
// dependencies are now fulfilled!
@@ -1510,11 +1615,15 @@ var mw = ( function ( $, undefined ) {
};
}() ),
- /** HTML construction helper functions */
+ /**
+ * HTML construction helper functions
+ * @class mw.html
+ * @singleton
+ */
html: ( function () {
function escapeCallback( s ) {
switch ( s ) {
- case "'":
+ case '\'':
return '&#039;';
case '"':
return '&quot;';
@@ -1530,7 +1639,7 @@ var mw = ( function ( $, undefined ) {
return {
/**
* Escape a string for HTML. Converts special characters to HTML entities.
- * @param s The string to escape
+ * @param {string} s The string to escape
*/
escape: function ( s ) {
return s.replace( /['"<>&]/g, escapeCallback );
@@ -1538,7 +1647,7 @@ var mw = ( function ( $, undefined ) {
/**
* Wrapper object for raw HTML passed to mw.html.element().
- * @constructor
+ * @class mw.html.Raw
*/
Raw: function ( value ) {
this.value = value;
@@ -1546,7 +1655,7 @@ var mw = ( function ( $, undefined ) {
/**
* Wrapper object for CDATA element contents passed to mw.html.element()
- * @constructor
+ * @class mw.html.Cdata
*/
Cdata: function ( value ) {
this.value = value;
diff --git a/resources/mediawiki/mediawiki.log.js b/resources/mediawiki/mediawiki.log.js
index 4ea1a881..ee08b12b 100644
--- a/resources/mediawiki/mediawiki.log.js
+++ b/resources/mediawiki/mediawiki.log.js
@@ -41,7 +41,7 @@
':' + ( d.getSeconds() < 10 ? '0' + d.getSeconds() : d.getSeconds() ) +
'.' + ( d.getMilliseconds() < 10 ? '00' + d.getMilliseconds() : ( d.getMilliseconds() < 100 ? '0' + d.getMilliseconds() : d.getMilliseconds() ) ),
$log = $( '#mw-log-console' );
-
+
if ( !$log.length ) {
$log = $( '<div id="mw-log-console"></div>' ).css( {
overflow: 'auto',
diff --git a/resources/mediawiki/mediawiki.notification.js b/resources/mediawiki/mediawiki.notification.js
index 58a3ab6a..fd34e7ee 100644
--- a/resources/mediawiki/mediawiki.notification.js
+++ b/resources/mediawiki/mediawiki.notification.js
@@ -1,24 +1,24 @@
-/**
- * Implements mediaWiki.notification library
- */
( function ( mw, $ ) {
'use strict';
- var isPageReady = false,
- isInitialized = false,
+ var notification,
+ isPageReady = false,
preReadyNotifQueue = [],
- /**
- * @var {jQuery}
- * The #mw-notification-area div that all notifications are contained inside.
- */
+ // The #mw-notification-area div that all notifications are contained inside.
$area = null;
/**
* Creates a Notification object for 1 message.
- * Does not insert anything into the document (see .start()).
+ * Does not insert anything into the document (see #start).
+ *
+ * The "_" in the name is to avoid a bug (http://github.com/senchalabs/jsduck/issues/304)
+ * It is not part of the actual class name.
+ *
+ * @class mw.Notification_
+ * @alternateClassName mw.Notification
+ * @private
*
* @constructor
- * @see mw.notification.notify
*/
function Notification( message, options ) {
var $notification, $notificationTitle, $notificationContent;
@@ -88,7 +88,9 @@
// Other notification elements matching the same tag
$tagMatches,
outerHeight,
- placeholderHeight;
+ placeholderHeight,
+ autohideCount,
+ notif;
if ( this.isOpen ) {
return;
@@ -164,10 +166,11 @@
}
} );
+ notif = this;
+
// Create a clear placeholder we can use to make the notifications around the notification that is being
// replaced expand or contract gracefully to fit the height of the new notification.
- var self = this;
- self.$replacementPlaceholder = $( '<div>' )
+ notif.$replacementPlaceholder = $( '<div>' )
// Set the height to the space the previous notification or placeholder took
.css( 'height', outerHeight )
// Make sure that this placeholder is at the very end of this tagged notification group
@@ -181,7 +184,7 @@
// Reset the notification position after we've finished the space animation
// However do not do it if the placeholder was removed because another tagged
// notification went and closed this one.
- if ( self.$replacementPlaceholder ) {
+ if ( notif.$replacementPlaceholder ) {
$notification.css( 'position', '' );
}
// Finally, remove the placeholder from the DOM
@@ -206,7 +209,7 @@
// By default a notification is paused.
// If this notification is within the first {autoHideLimit} notifications then
// start the auto-hide timer as soon as it's created.
- var autohideCount = $area.find( '.mw-notification-autohide' ).length;
+ autohideCount = $area.find( '.mw-notification-autohide' ).length;
if ( autohideCount <= notification.autoHideLimit ) {
this.resume();
}
@@ -253,6 +256,7 @@
*
* @param {Object} options An object containing options for the closing of the notification.
* These are typically only used internally.
+ *
* - speed: Use a close speed different than the default 'slow'.
* - placeholder: Set to false to disable the placeholder transition.
*/
@@ -326,7 +330,7 @@
/**
* Helper function, take a list of notification divs and call
- * a function on the Notification instance attached to them
+ * a function on the Notification instance attached to them.
*
* @param {jQuery} $notifications A jQuery object containing notification divs
* @param {string} fn The name of the function to call on the Notification instance
@@ -341,40 +345,43 @@
}
/**
- * Initialisation
- * (don't call before document ready)
+ * Initialisation.
+ * Must only be called once, and not before the document is ready.
+ * @ignore
*/
function init() {
- if ( !isInitialized ) {
- isInitialized = true;
- $area = $( '<div id="mw-notification-area"></div>' )
- // Pause auto-hide timers when the mouse is in the notification area.
- .on( {
- mouseenter: notification.pause,
- mouseleave: notification.resume
- } )
- // When clicking on a notification close it.
- .on( 'click', '.mw-notification', function () {
- var notif = $( this ).data( 'mw.notification' );
- if ( notif ) {
- notif.close();
- }
- } )
- // Stop click events from <a> tags from propogating to prevent clicking.
- // on links from hiding a notification.
- .on( 'click', 'a', function ( e ) {
- e.stopPropagation();
- } );
-
- // Prepend the notification area to the content area and save it's object.
- mw.util.$content.prepend( $area );
- }
+ $area = $( '<div id="mw-notification-area"></div>' )
+ // Pause auto-hide timers when the mouse is in the notification area.
+ .on( {
+ mouseenter: notification.pause,
+ mouseleave: notification.resume
+ } )
+ // When clicking on a notification close it.
+ .on( 'click', '.mw-notification', function () {
+ var notif = $( this ).data( 'mw.notification' );
+ if ( notif ) {
+ notif.close();
+ }
+ } )
+ // Stop click events from <a> tags from propogating to prevent clicking.
+ // on links from hiding a notification.
+ .on( 'click', 'a', function ( e ) {
+ e.stopPropagation();
+ } );
+
+ // Prepend the notification area to the content area and save it's object.
+ mw.util.$content.prepend( $area );
}
- var notification = {
+ /**
+ * @class mw.notification
+ * @singleton
+ */
+ notification = {
/**
* Pause auto-hide timers for all notifications.
* Notifications will not auto-hide until resume is called.
+ * @see mw.Notification#pause
*/
pause: function () {
callEachNotification(
@@ -385,13 +392,13 @@
/**
* Resume any paused auto-hide timers from the beginning.
- * Only the first {autoHideLimit} timers will be resumed.
+ * Only the first #autoHideLimit timers will be resumed.
*/
resume: function () {
callEachNotification(
- // Only call resume on the first {autoHideLimit} notifications.
- // Exclude noautohide notifications to avoid bugs where {autoHideLimit}
- // { autoHide: false } notifications are at the start preventing any
+ // Only call resume on the first #autoHideLimit notifications.
+ // Exclude noautohide notifications to avoid bugs where #autoHideLimit
+ // `{ autoHide: false }` notifications are at the start preventing any
// auto-hide notifications from being autohidden.
$area.children( '.mw-notification-autohide' ).slice( 0, notification.autoHideLimit ),
'resume'
@@ -401,10 +408,9 @@
/**
* Display a notification message to the user.
*
- * @param {mixed} message The DOM-element, jQuery object, mw.Message instance,
- * or plaintext string to be used as the message.
+ * @param {HTMLElement|jQuery|mw.Message|string} message
* @param {Object} options The options to use for the notification.
- * See mw.notification.defaults for details.
+ * See #defaults for details.
*/
notify: function ( message, options ) {
var notif;
@@ -420,22 +426,23 @@
},
/**
- * @var {Object}
- * The defaults for mw.notification.notify's options parameter
- * autoHide:
- * A boolean indicating whether the notifification should automatically
- * be hidden after shown. Or if it should persist.
+ * @property {Object}
+ * The defaults for #notify options parameter.
+ *
+ * - autoHide:
+ * A boolean indicating whether the notifification should automatically
+ * be hidden after shown. Or if it should persist.
*
- * tag:
- * An optional string. When a notification is tagged only one message
- * with that tag will be displayed. Trying to display a new notification
- * with the same tag as one already being displayed will cause the other
- * notification to be closed and this new notification to open up inside
- * the same place as the previous notification.
+ * - tag:
+ * An optional string. When a notification is tagged only one message
+ * with that tag will be displayed. Trying to display a new notification
+ * with the same tag as one already being displayed will cause the other
+ * notification to be closed and this new notification to open up inside
+ * the same place as the previous notification.
*
- * title:
- * An optional title for the notification. Will be displayed above the
- * content. Usually in bold.
+ * - title:
+ * An optional title for the notification. Will be displayed above the
+ * content. Usually in bold.
*/
defaults: {
autoHide: true,
@@ -444,20 +451,20 @@
},
/**
- * @var {number}
+ * @property {number}
* Number of seconds to wait before auto-hiding notifications.
*/
autoHideSeconds: 5,
/**
- * @var {number}
+ * @property {number}
* Maximum number of notifications to count down auto-hide timers for.
- * Only the first {autoHideLimit} notifications being displayed will
+ * Only the first #autoHideLimit notifications being displayed will
* auto-hide. Any notifications further down in the list will only start
* counting down to auto-hide after the first few messages have closed.
*
* This basically represents the number of notifications the user should
- * be able to process in {autoHideSeconds} time.
+ * be able to process in #autoHideSeconds time.
*/
autoHideLimit: 3
};
diff --git a/resources/mediawiki/mediawiki.notify.js b/resources/mediawiki/mediawiki.notify.js
index 3bf2a896..83d95b61 100644
--- a/resources/mediawiki/mediawiki.notify.js
+++ b/resources/mediawiki/mediawiki.notify.js
@@ -1,11 +1,13 @@
/**
- * Implements mediaWiki.notify function
+ * @class mw.plugin.notify
*/
( function ( mw ) {
'use strict';
/**
- * @see mw.notification.notify
+ * @see mw.notification#notify
+ * @param message
+ * @param options
*/
mw.notify = function ( message, options ) {
// Don't bother loading the whole notification system if we never use it.
@@ -17,4 +19,9 @@
} );
};
-}( mediaWiki ) ); \ No newline at end of file
+ /**
+ * @class mw
+ * @mixins mw.plugin.notify
+ */
+
+}( mediaWiki ) );
diff --git a/resources/mediawiki/mediawiki.searchSuggest.css b/resources/mediawiki/mediawiki.searchSuggest.css
new file mode 100644
index 00000000..0fb862b9
--- /dev/null
+++ b/resources/mediawiki/mediawiki.searchSuggest.css
@@ -0,0 +1,16 @@
+/* Make sure the links are not underlined or colored, ever. */
+/* There is already a :focus / :hover indication on the <div>. */
+.suggestions a.mw-searchSuggest-link,
+.suggestions a.mw-searchSuggest-link:hover,
+.suggestions a.mw-searchSuggest-link:active,
+.suggestions a.mw-searchSuggest-link:focus {
+ text-decoration: none;
+ color: black;
+}
+
+.suggestions-result-current a.mw-searchSuggest-link,
+.suggestions-result-current a.mw-searchSuggest-link:hover,
+.suggestions-result-current a.mw-searchSuggest-link:active,
+.suggestions-result-current a.mw-searchSuggest-link:focus {
+ color: white;
+}
diff --git a/resources/mediawiki/mediawiki.searchSuggest.js b/resources/mediawiki/mediawiki.searchSuggest.js
index 99a55576..2bc7cea9 100644
--- a/resources/mediawiki/mediawiki.searchSuggest.js
+++ b/resources/mediawiki/mediawiki.searchSuggest.js
@@ -3,7 +3,7 @@
*/
( function ( mw, $ ) {
$( document ).ready( function ( $ ) {
- var map, searchboxesSelectors,
+ var map, resultRenderCache, searchboxesSelectors,
// Region where the suggestions box will appear directly below
// (using the same width). Can be a container element or the input
// itself, depending on what suits best in the environment.
@@ -41,6 +41,91 @@
return;
}
+ // Compute form data for search suggestions functionality.
+ function computeResultRenderCache( context ) {
+ var $form, formAction, baseHref, linkParams;
+
+ // Compute common parameters for links' hrefs
+ $form = context.config.$region.closest( 'form' );
+
+ formAction = $form.attr( 'action' );
+ baseHref = formAction + ( formAction.match(/\?/) ? '&' : '?' );
+
+ linkParams = {};
+ $.each( $form.serializeArray(), function ( idx, obj ) {
+ linkParams[ obj.name ] = obj.value;
+ } );
+
+ return {
+ textParam: context.data.$textbox.attr( 'name' ),
+ linkParams: linkParams,
+ baseHref: baseHref
+ };
+ }
+
+ // The function used to render the suggestions.
+ function renderFunction( text, context ) {
+ if ( !resultRenderCache ) {
+ resultRenderCache = computeResultRenderCache( context );
+ }
+
+ // linkParams object is modified and reused
+ resultRenderCache.linkParams[ resultRenderCache.textParam ] = text;
+
+ // this is the container <div>, jQueryfied
+ this
+ .append(
+ // the <span> is needed for $.autoEllipsis to work
+ $( '<span>' )
+ .css( 'whiteSpace', 'nowrap' )
+ .text( text )
+ )
+ .wrap(
+ $( '<a>' )
+ .attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) )
+ .addClass( 'mw-searchSuggest-link' )
+ );
+ }
+
+ function specialRenderFunction( query, context ) {
+ var $el = this;
+
+ if ( !resultRenderCache ) {
+ resultRenderCache = computeResultRenderCache( context );
+ }
+
+ // linkParams object is modified and reused
+ resultRenderCache.linkParams[ resultRenderCache.textParam ] = query;
+
+ if ( $el.children().length === 0 ) {
+ $el
+ .append(
+ $( '<div>' )
+ .addClass( 'special-label' )
+ .text( mw.msg( 'searchsuggest-containing' ) ),
+ $( '<div>' )
+ .addClass( 'special-query' )
+ .text( query )
+ .autoEllipsis()
+ )
+ .show();
+ } else {
+ $el.find( '.special-query' )
+ .text( query )
+ .autoEllipsis();
+ }
+
+ if ( $el.parent().hasClass( 'mw-searchSuggest-link' ) ) {
+ $el.parent().attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) + '&fulltext=1' );
+ } else {
+ $el.wrap(
+ $( '<a>' )
+ .attr( 'href', resultRenderCache.baseHref + $.param( resultRenderCache.linkParams ) + '&fulltext=1' )
+ .addClass( 'mw-searchSuggest-link' )
+ );
+ }
+ }
+
// General suggestions functionality for all search boxes
searchboxesSelectors = [
// Primary searchbox on every page in standard skins
@@ -89,6 +174,7 @@
}
},
result: {
+ render: renderFunction,
select: function ( $input ) {
$input.closest( 'form' ).submit();
}
@@ -118,31 +204,13 @@
// Special suggestions functionality for skin-provided search box
$searchInput.suggestions( {
result: {
+ render: renderFunction,
select: function ( $input ) {
$input.closest( 'form' ).submit();
}
},
special: {
- render: function ( query ) {
- var $el = this;
- if ( $el.children().length === 0 ) {
- $el
- .append(
- $( '<div>' )
- .addClass( 'special-label' )
- .text( mw.msg( 'searchsuggest-containing' ) ),
- $( '<div>' )
- .addClass( 'special-query' )
- .text( query )
- .autoEllipsis()
- )
- .show();
- } else {
- $el.find( '.special-query' )
- .text( query )
- .autoEllipsis();
- }
- },
+ render: specialRenderFunction,
select: function ( $input ) {
$input.closest( 'form' ).append(
$( '<input type="hidden" name="fulltext" value="1"/>' )
diff --git a/resources/mediawiki/mediawiki.user.js b/resources/mediawiki/mediawiki.user.js
index e64d2e84..e0329597 100644
--- a/resources/mediawiki/mediawiki.user.js
+++ b/resources/mediawiki/mediawiki.user.js
@@ -61,7 +61,7 @@
*
* @return String: Random set of 32 alpha-numeric characters
*/
- function generateId() {
+ this.generateRandomSessionId = function () {
var i, r,
id = '',
seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
@@ -70,7 +70,7 @@
id += seed.substring( r, r + 1 );
}
return id;
- }
+ };
/**
* Gets the current user's name.
@@ -89,6 +89,25 @@
};
/**
+ * Get date user registered, if available.
+ *
+ * @return {Date|false|null} date user registered, or false for anonymous users, or
+ * null when data is not available
+ */
+ this.getRegistration = function () {
+ var registration = mw.config.get( 'wgUserRegistration' );
+ if ( this.isAnon() ) {
+ return false;
+ } else if ( registration === null ) {
+ // Information may not be available if they signed up before
+ // MW began storing this.
+ return null;
+ } else {
+ return new Date( registration );
+ }
+ };
+
+ /**
* Checks if the current user is anonymous.
*
* @return Boolean
@@ -115,7 +134,7 @@
this.sessionId = function () {
var sessionId = $.cookie( 'mediaWiki.user.sessionId' );
if ( typeof sessionId === 'undefined' || sessionId === null ) {
- sessionId = generateId();
+ sessionId = user.generateRandomSessionId();
$.cookie( 'mediaWiki.user.sessionId', sessionId, { 'expires': null, 'path': '/' } );
}
return sessionId;
diff --git a/resources/mediawiki/mediawiki.util.js b/resources/mediawiki/mediawiki.util.js
index 29284384..5211b0d0 100644
--- a/resources/mediawiki/mediawiki.util.js
+++ b/resources/mediawiki/mediawiki.util.js
@@ -1,10 +1,11 @@
-/**
- * Implements mediaWiki.util library
- */
( function ( mw, $ ) {
'use strict';
- // Local cache and alias
+ /**
+ * Utility library
+ * @class mw.util
+ * @singleton
+ */
var util = {
/**
@@ -28,13 +29,10 @@
profile.platform === 'mac'
// Chrome on Mac
? 'ctrl-option-'
- : profile.platform === 'win'
- // Chrome on Windows
- // (both alt- and alt-shift work, but alt-f triggers Chrome wrench menu
- // which alt-shift-f does not)
- ? 'alt-shift-'
- // Chrome on other (Ubuntu?)
- : 'alt-'
+ // 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
@@ -62,7 +60,8 @@
/* Fill $content var */
util.$content = ( function () {
- var $content, selectors = [
+ var i, l, $content, selectors;
+ selectors = [
// The preferred standard for setting $content (class="mw-body")
// You may also use (class="mw-body mw-body-primary") if you use
// mw-body in multiple locations.
@@ -94,7 +93,7 @@
// not inserted bodytext yet. But in any case <body> should always exist
'body'
];
- for ( var i = 0, l = selectors.length; i < l; i++ ) {
+ for ( i = 0, l = selectors.length; i < l; i++ ) {
$content = $( selectors[i] ).first();
if ( $content.length ) {
return $content;
@@ -136,7 +135,7 @@
/**
* Encode the string like PHP's rawurlencode
*
- * @param str string String to be encoded
+ * @param {string} str String to be encoded.
*/
rawurlencode: function ( str ) {
str = String( str );
@@ -150,7 +149,7 @@
* We want / and : to be included as literal characters in our title URLs
* as they otherwise fatally break the title
*
- * @param str string String to be encoded
+ * @param {string} str String to be encoded.
*/
wikiUrlencode: function ( str ) {
return util.rawurlencode( str )
@@ -158,10 +157,10 @@
},
/**
- * Get the link to a page name (relative to wgServer)
+ * Get the link to a page name (relative to `wgServer`),
*
- * @param str String: Page name to get the link for.
- * @return String: Location for a page with name of 'str' or boolean false on error.
+ * @param {string} str Page name to get the link for.
+ * @return {string} Location for a page with name of `str` or boolean false on error.
*/
wikiGetlink: function ( str ) {
return mw.config.get( 'wgArticlePath' ).replace( '$1',
@@ -170,7 +169,7 @@
/**
* Get address to a script in the wiki root.
- * For index.php use mw.config.get( 'wgScript' )
+ * For index.php use `mw.config.get( 'wgScript' )`.
*
* @since 1.18
* @param str string Name of script (eg. 'api'), defaults to 'index'
@@ -190,20 +189,18 @@
/**
* Append a new style block to the head and return the CSSStyleSheet object.
- * Use .ownerNode to access the <style> element, or use mw.loader.addStyleTag.
+ * Use .ownerNode to access the `<style>` element, or use mw.loader#addStyleTag.
* This function returns the styleSheet object for convience (due to cross-browsers
* difference as to where it is located).
- * @example
- * <code>
- * var sheet = mw.util.addCSS('.foobar { display: none; }');
- * $(foo).click(function () {
- * // Toggle the sheet on and off
- * sheet.disabled = !sheet.disabled;
- * });
- * </code>
*
- * @param text string CSS to be appended
- * @return CSSStyleSheet (use .ownerNode to get to the <style> element)
+ * var sheet = mw.util.addCSS('.foobar { display: none; }');
+ * $(foo).click(function () {
+ * // Toggle the sheet on and off
+ * sheet.disabled = !sheet.disabled;
+ * });
+ *
+ * @param {string} text CSS to be appended
+ * @return {CSSStyleSheet} Use .ownerNode to get to the `<style>` element.
*/
addCSS: function ( text ) {
var s = mw.loader.addStyleTag( text );
@@ -213,10 +210,10 @@
/**
* Hide/show the table of contents element
*
- * @param $toggleLink jQuery A jQuery object of the toggle link.
- * @param callback function Function to be called after the toggle is
- * completed (including the animation) (optional)
- * @return mixed Boolean visibility of the toc (true if it's visible)
+ * @param {jQuery} $toggleLink A jQuery object of the toggle link.
+ * @param {Function} [callback] Function to be called after the toggle is
+ * completed (including the animation).
+ * @return {Mixed} Boolean visibility of the toc (true if it's visible)
* or Null if there was no table of contents.
*/
toggleToc: function ( $toggleLink, callback ) {
@@ -253,12 +250,14 @@
* Grab the URL parameter value for the given parameter.
* Returns null if not found.
*
- * @param param string The parameter name.
- * @param url string URL to search through (optional)
- * @return mixed Parameter value or null.
+ * @param {string} param The parameter name.
+ * @param {string} [url] URL to search through.
+ * @return {Mixed} Parameter value or null.
*/
getParamValue: function ( param, url ) {
- url = url || document.location.href;
+ if ( url === undefined ) {
+ url = document.location.href;
+ }
// Get last match, stop at hash
var re = new RegExp( '^[^#]*[&?]' + $.escapeRE( param ) + '=([^&#]*)' ),
m = re.exec( url );
@@ -271,14 +270,14 @@
},
/**
- * @var string
+ * @property {string}
* Access key prefix. Will be re-defined based on browser/operating system
- * detection in mw.util.init().
+ * detection in mw.util#init.
*/
tooltipAccessKeyPrefix: 'alt-',
/**
- * @var RegExp
+ * @property {RegExp}
* Regex to match accesskey tooltips.
*/
tooltipAccessKeyRegexp: /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
@@ -289,8 +288,7 @@
* otherwise, all the nodes that will probably have accesskeys by
* default are updated.
*
- * @param $nodes {Array|jQuery} [optional] A jQuery object, or array
- * of elements to update.
+ * @param {Array|jQuery} [$nodes] A jQuery object, or array of nodes to update.
*/
updateTooltipAccessKeys: function ( $nodes ) {
if ( !$nodes ) {
@@ -312,9 +310,9 @@
},
/*
- * @var jQuery
- * A jQuery object that refers to the content area element
- * Populated by init().
+ * @property {jQuery}
+ * A jQuery object that refers to the content area element.
+ * Populated by #init.
*/
$content: null,
@@ -329,28 +327,28 @@
*
* By default the new link will be added to the end of the list. To
* add the link before a given existing item, pass the DOM node
- * (document.getElementById( 'foobar' )) or the jQuery-selector
- * ( '#foobar' ) of that item.
+ * (e.g. `document.getElementById( 'foobar' )`) or a jQuery-selector
+ * (e.g. `'#foobar'`) for that item.
*
- * @example mw.util.addPortletLink(
- * 'p-tb', 'http://mediawiki.org/',
- * 'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', '#t-print'
- * )
+ * mw.util.addPortletLink(
+ * 'p-tb', 'http://mediawiki.org/',
+ * 'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', '#t-print'
+ * );
*
- * @param portlet string ID of the target portlet ( 'p-cactions' or 'p-personal' etc.)
- * @param href string Link URL
- * @param text string Link text
- * @param id string ID of the new item, should be unique and preferably have
- * the appropriate prefix ( 'ca-', 'pt-', 'n-' or 't-' )
- * @param tooltip string Text to show when hovering over the link, without accesskey suffix
- * @param accesskey string Access key to activate this link (one character, try
- * to avoid conflicts. Use $( '[accesskey=x]' ).get() in the console to
- * see if 'x' is already used.
- * @param nextnode mixed DOM Node or jQuery-selector string of the item that the new
- * item should be added before, should be another item in the same
- * list, it will be ignored otherwise
+ * @param {string} portlet ID of the target portlet ( 'p-cactions' or 'p-personal' etc.)
+ * @param {string} href Link URL
+ * @param {string} text Link text
+ * @param {string} [id] ID of the new item, should be unique and preferably have
+ * the appropriate prefix ( 'ca-', 'pt-', 'n-' or 't-' )
+ * @param {string} [tooltip] Text to show when hovering over the link, without accesskey suffix
+ * @param {string} [accesskey] Access key to activate this link (one character, try
+ * to avoid conflicts. Use `$( '[accesskey=x]' ).get()` in the console to
+ * see if 'x' is already used.
+ * @param {HTMLElement|jQuery|string} [nextnode] Element or jQuery-selector string to the item that
+ * the new item should be added before, should be another item in the same
+ * list, it will be ignored otherwise
*
- * @return mixed The DOM Node of the added item (a ListItem or Anchor element,
+ * @return {HTMLElement|null} The added element (a ListItem or Anchor element,
* depending on the skin) or null if no element was added to the document.
*/
addPortletLink: function ( portlet, href, text, id, tooltip, accesskey, nextnode ) {
@@ -370,7 +368,6 @@
// just add it to the bottom of their 'sidebar' element as a fallback
switch ( mw.config.get( 'skin' ) ) {
case 'standard':
- case 'cologneblue':
$( '#quickbar' ).append( $link.after( '<br/>' ) );
return $link[0];
case 'nostalgia':
@@ -440,7 +437,7 @@
// If the jQuery selector isn't found within the <ul>,
// or if nextnode was invalid or not passed at all,
- // then just append it at the end of the <ul> (this is the default behaviour)
+ // then just append it at the end of the <ul> (this is the default behavior)
} else {
$ul.append( $item );
}
@@ -455,9 +452,9 @@
* something, replacing any previous message.
* Calling with no arguments, with an empty string or null will hide the message
*
- * @param message {mixed} The DOM-element, jQuery object or HTML-string to be put inside the message box.
+ * @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.
- * @depreceated Use mw.notify
+ * @deprecated Use mw#notify
*/
jsMessage: function ( message ) {
if ( !arguments.length || message === '' || message === null ) {
@@ -475,87 +472,80 @@
* according to HTML5 specification. Please note the specification
* does not validate a domain with one character.
*
- * @todo FIXME: should be moved to or replaced by a JavaScript validation module.
+ * FIXME: should be moved to or replaced by a validation module.
*
- * @param mailtxt string E-mail address to be validated.
- * @return mixed Null if mailtxt was an empty string, otherwise true/false
- * is determined by validation.
+ * @param {string} mailtxt E-mail address to be validated.
+ * @return {boolean|null} Null if `mailtxt` was an empty string, otherwise true/false
+ * as determined by validation.
*/
validateEmail: function ( mailtxt ) {
- var rfc5322_atext, rfc1034_ldh_str, HTML5_email_regexp;
+ var rfc5322Atext, rfc1034LdhStr, html5EmailRegexp;
if ( mailtxt === '' ) {
return null;
}
- /**
- * HTML5 defines a string as valid e-mail address if it matches
- * the ABNF:
- * 1 * ( atext / "." ) "@" ldh-str 1*( "." ldh-str )
- * With:
- * - atext : defined in RFC 5322 section 3.2.3
- * - ldh-str : defined in RFC 1034 section 3.5
- *
- * (see STD 68 / RFC 5234 http://tools.ietf.org/html/std68):
- */
-
- /**
- * First, define the RFC 5322 'atext' which is pretty easy:
- * atext = ALPHA / DIGIT / ; Printable US-ASCII
- "!" / "#" / ; characters not including
- "$" / "%" / ; specials. Used for atoms.
- "&" / "'" /
- "*" / "+" /
- "-" / "/" /
- "=" / "?" /
- "^" / "_" /
- "`" / "{" /
- "|" / "}" /
- "~"
- */
- rfc5322_atext = "a-z0-9!#$%&'*+\\-/=?^_`{|}~";
-
- /**
- * Next define the RFC 1034 'ldh-str'
- * <domain> ::= <subdomain> | " "
- * <subdomain> ::= <label> | <subdomain> "." <label>
- * <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
- * <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
- * <let-dig-hyp> ::= <let-dig> | "-"
- * <let-dig> ::= <letter> | <digit>
- */
- rfc1034_ldh_str = "a-z0-9\\-";
-
- HTML5_email_regexp = new RegExp(
+ // HTML5 defines a string as valid e-mail address if it matches
+ // the ABNF:
+ // 1 * ( atext / "." ) "@" ldh-str 1*( "." ldh-str )
+ // With:
+ // - atext : defined in RFC 5322 section 3.2.3
+ // - ldh-str : defined in RFC 1034 section 3.5
+ //
+ // (see STD 68 / RFC 5234 http://tools.ietf.org/html/std68)
+ // First, define the RFC 5322 'atext' which is pretty easy:
+ // atext = ALPHA / DIGIT / ; Printable US-ASCII
+ // "!" / "#" / ; characters not including
+ // "$" / "%" / ; specials. Used for atoms.
+ // "&" / "'" /
+ // "*" / "+" /
+ // "-" / "/" /
+ // "=" / "?" /
+ // "^" / "_" /
+ // "`" / "{" /
+ // "|" / "}" /
+ // "~"
+ rfc5322Atext = 'a-z0-9!#$%&\'*+\\-/=?^_`{|}~';
+
+ // Next define the RFC 1034 'ldh-str'
+ // <domain> ::= <subdomain> | " "
+ // <subdomain> ::= <label> | <subdomain> "." <label>
+ // <label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
+ // <ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
+ // <let-dig-hyp> ::= <let-dig> | "-"
+ // <let-dig> ::= <letter> | <digit>
+ rfc1034LdhStr = 'a-z0-9\\-';
+
+ html5EmailRegexp = new RegExp(
// start of string
'^'
+
// User part which is liberal :p
- '[' + rfc5322_atext + '\\.]+'
+ '[' + rfc5322Atext + '\\.]+'
+
// 'at'
'@'
+
// Domain first part
- '[' + rfc1034_ldh_str + ']+'
+ '[' + rfc1034LdhStr + ']+'
+
// Optional second part and following are separated by a dot
- '(?:\\.[' + rfc1034_ldh_str + ']+)*'
+ '(?:\\.[' + rfc1034LdhStr + ']+)*'
+
// End of string
'$',
// RegExp is case insensitive
'i'
);
- return (null !== mailtxt.match( HTML5_email_regexp ) );
+ return (null !== mailtxt.match( html5EmailRegexp ) );
},
/**
* Note: borrows from IP::isIPv4
*
- * @param address string
- * @param allowBlock boolean
- * @return boolean
+ * @param {string} address
+ * @param {boolean} allowBlock
+ * @return {boolean}
*/
isIPv4Address: function ( address, allowBlock ) {
if ( typeof address !== 'string' ) {
@@ -572,9 +562,9 @@
/**
* Note: borrows from IP::isIPv6
*
- * @param address string
- * @param allowBlock boolean
- * @return boolean
+ * @param {string} address
+ * @param {boolean} allowBlock
+ * @return {boolean}
*/
isIPv6Address: function ( address, allowBlock ) {
if ( typeof address !== 'string' ) {
diff --git a/resources/startup.js b/resources/startup.js
index 7951af06..deff7e6e 100644
--- a/resources/startup.js
+++ b/resources/startup.js
@@ -3,19 +3,22 @@
* continue loading the jquery and mediawiki modules. This code should work on
* even the most ancient of browsers, so be very careful when editing.
*/
+
/**
* Returns false when run in a black-listed browser
*
* This function will be deleted after it's used, so do not expand it to be
- * generally useful beyond startup
+ * generally useful beyond startup.
*
- * jQuery has minimum requirements of:
- * * Internet Explorer 6.0+
- * * Firefox 3.6+
- * * Safari 5.0+
- * * Opera 11+
- * * Chrome
+ * MediaWiki & jQuery compatibility:
+ * - Internet Explorer 6.0+
+ * - Firefox 10+
+ * - Safari 5.0+
+ * - Opera 11+
+ * - Chrome
*/
+
+/*jshint unused: false */
function isCompatible() {
// IE < 6.0
if ( navigator.appVersion.indexOf( 'MSIE' ) !== -1
@@ -23,11 +26,9 @@ function isCompatible() {
{
return false;
}
- // @todo FIXME: Firefox < 3.6
- // @todo FIXME: Safari < 5.0
- // @todo FIXME: Opera < 11
return true;
}
+
/**
- * The startUp() function will be generated and added here (at the bottom)
+ * The startUp() function will be auto-generated and added below.
*/
diff --git a/serialized/serialize.php b/serialized/serialize.php
index 0e0ce803..09aec79e 100644
--- a/serialized/serialize.php
+++ b/serialized/serialize.php
@@ -1,4 +1,25 @@
<?php
+/**
+ * Serialize variables found in input file and store the result in the
+ * specified file.
+ *
+ * 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
+ */
if ( !defined( 'MEDIAWIKI' ) ) {
$wgNoDBParam = true;
@@ -62,7 +83,7 @@ function unixLineEndings( $var ) {
fwrite( $stderr, "Error: Recursion limit exceeded. Possible circular reference in array variable.\n" );
exit( 2 );
}
-
+
if ( is_array( $var ) ) {
++$recursionLevel;
$var = array_map( 'unixLineEndings', $var );
@@ -72,4 +93,3 @@ function unixLineEndings( $var ) {
}
return $var;
}
-
diff --git a/skins/ArchLinux.php b/skins/ArchLinux.php
index a5ce1714..d7a79616 100644
--- a/skins/ArchLinux.php
+++ b/skins/ArchLinux.php
@@ -103,11 +103,14 @@ class ArchLinuxTemplate extends BaseTemplate {
</div><!-- #archnavbar -->
<div id="globalWrapper">
-<div id="column-content"><div id="content" class="mw-body-primary">
+<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"><span dir="auto"><?php $this->html('title') ?></span></h1>
+ <h1 id="firstHeading" class="firstHeading" lang="<?php
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
+ $this->html( '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>
@@ -127,9 +130,10 @@ class ArchLinuxTemplate extends BaseTemplate {
</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">
- <h5><?php $this->msg('personaltools') ?></h5>
+ <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) { ?>
@@ -139,7 +143,7 @@ class ArchLinuxTemplate extends BaseTemplate {
</ul>
</div>
</div>
- <div class="portlet" id="p-logo">
+ <div class="portlet" id="p-logo" role="banner">
<?php
echo Html::element( 'a', array(
'href' => $this->data['nav_urls']['mainpage']['href'],
@@ -157,7 +161,7 @@ class ArchLinuxTemplate extends BaseTemplate {
$validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { ?>
-<div id="footer"<?php $this->html('userlangattributes') ?>>
+<div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
<?php
$footerEnd = '</div>';
} else {
@@ -223,8 +227,8 @@ echo $footerEnd;
function searchBox() {
global $wgUseTwoButtonsSearchForm;
?>
- <div id="p-search" class="portlet">
- <h5><label for="searchInput"><?php $this->msg('search') ?></label></h5>
+ <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') ?>"/>
@@ -250,8 +254,8 @@ echo $footerEnd;
*/
function cactions() {
?>
- <div id="p-cactions" class="portlet">
- <h5><?php $this->msg('views') ?></h5>
+ <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) {
@@ -267,8 +271,8 @@ echo $footerEnd;
/*************************************************************************************************/
function toolbox() {
?>
- <div class="portlet" id="p-tb">
- <h5><?php $this->msg('toolbox') ?></h5>
+ <div class="portlet" id="p-tb" role="navigation">
+ <h3><?php $this->msg('toolbox') ?></h3>
<div class="pBody">
<ul>
<?php
@@ -290,8 +294,8 @@ echo $footerEnd;
function languageBox() {
if( $this->data['language_urls'] ) {
?>
- <div id="p-lang" class="portlet">
- <h5<?php $this->html('userlangattributes') ?>><?php $this->msg('otherlanguages') ?></h5>
+ <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) { ?>
@@ -311,7 +315,7 @@ echo $footerEnd;
* @param $cont array|string
*/
function customBox( $bar, $cont ) {
- $portletAttribs = array( 'class' => 'generated-sidebar portlet', 'id' => Sanitizer::escapeId( "p-$bar" ) );
+ $portletAttribs = array( 'class' => 'generated-sidebar portlet', 'id' => Sanitizer::escapeId( "p-$bar" ), 'role' => 'navigation' );
$tooltip = Linker::titleAttrib( "p-$bar" );
if ( $tooltip !== false ) {
$portletAttribs['title'] = $tooltip;
@@ -319,7 +323,7 @@ echo $footerEnd;
echo ' ' . Html::openElement( 'div', $portletAttribs );
?>
- <h5><?php $msg = wfMessage( $bar ); echo htmlspecialchars( $msg->exists() ? $msg->text() : $bar ); ?></h5>
+ <h3><?php $msg = wfMessage( $bar ); echo htmlspecialchars( $msg->exists() ? $msg->text() : $bar ); ?></h3>
<div class='pBody'>
<?php if ( is_array( $cont ) ) { ?>
<ul>
diff --git a/skins/Chick.php b/skins/Chick.php
index 54dada3d..75b807ad 100644
--- a/skins/Chick.php
+++ b/skins/Chick.php
@@ -36,7 +36,7 @@ class SkinChick extends SkinTemplate {
/**
* @param $out OutputPage
*/
- function setupSkinUserCss( OutputPage $out ){
+ function setupSkinUserCss( OutputPage $out ) {
parent::setupSkinUserCss( $out );
$out->addModuleStyles( 'skins.chick' );
diff --git a/skins/CologneBlue.php b/skins/CologneBlue.php
index 1823d882..21b07f7d 100644
--- a/skins/CologneBlue.php
+++ b/skins/CologneBlue.php
@@ -30,136 +30,335 @@ if( !defined( 'MEDIAWIKI' ) ) {
* @todo document
* @ingroup Skins
*/
-class SkinCologneBlue extends SkinLegacy {
+class SkinCologneBlue extends SkinTemplate {
var $skinname = 'cologneblue', $stylename = 'cologneblue',
$template = 'CologneBlueTemplate';
+ var $useHeadElement = true;
/**
* @param $out OutputPage
*/
- function setupSkinUserCss( OutputPage $out ){
- parent::setupSkinUserCss( $out );
+ function setupSkinUserCss( OutputPage $out ) {
+ $out->addModuleStyles( 'mediawiki.legacy.shared' );
+ $out->addModuleStyles( 'mediawiki.legacy.oldshared' );
$out->addModuleStyles( 'skins.cologneblue' );
-
- $qb = $this->qbSetting();
- $rules = array();
-
- if ( 2 == $qb ) { # Right
- $rules[] = "/* @noflip */#quickbar { position: absolute; right: 4px; }";
- $rules[] = "/* @noflip */#article { margin-left: 4px; margin-right: 148px; }";
- $rules[] = "/* @noflip */#footer { margin-right: 152px; }";
- } elseif ( 1 == $qb ) {
- $rules[] = "/* @noflip */#quickbar { position: absolute; left: 4px; }";
- $rules[] = "/* @noflip */#article { margin-left: 148px; margin-right: 4px; }";
- $rules[] = "/* @noflip */#footer { margin-left: 152px; }";
- } elseif ( 3 == $qb ) { # Floating left
- $rules[] = "/* @noflip */#quickbar { position:absolute; left:4px }";
- $rules[] = "/* @noflip */#topbar { margin-left: 148px }";
- $rules[] = "/* @noflip */#article { margin-left:148px; margin-right: 4px; }";
- $rules[] = "/* @noflip */body>#quickbar { position:fixed; left:4px; top:4px; overflow:auto; bottom:4px;}"; # Hides from IE
- $rules[] = "/* @noflip */#footer { margin-left: 152px; }";
- } elseif ( 4 == $qb ) { # Floating right
- $rules[] = "/* @noflip */#quickbar { position: fixed; right: 4px; }";
- $rules[] = "/* @noflip */#topbar { margin-right: 148px }";
- $rules[] = "/* @noflip */#article { margin-right: 148px; margin-left: 4px; }";
- $rules[] = "/* @noflip */body>#quickbar { position: fixed; right: 4px; top: 4px; overflow: auto; bottom:4px;}"; # Hides from IE
- $rules[] = "/* @noflip */#footer { margin-right: 152px; }";
- }
- $style = implode( "\n", $rules );
- $out->addInlineStyle( $style, 'flip' );
}
+ /**
+ * Override langlink formatting behavior not to uppercase the language names.
+ * See otherLanguages() in CologneBlueTemplate.
+ */
+ function formatLanguageName( $name ) {
+ return $name;
+ }
}
-class CologneBlueTemplate extends LegacyTemplate {
+class CologneBlueTemplate extends BaseTemplate {
+ function execute() {
+ // Suppress warnings to prevent notices about missing indexes in $this->data
+ wfSuppressWarnings();
+ $this->html( 'headelement' );
+ echo $this->beforeContent();
+ $this->html( 'bodytext' );
+ echo "\n";
+ echo $this->afterContent();
+ $this->html( 'dataAfterContent' );
+ $this->printTrail();
+ echo "\n</body></html>";
+ wfRestoreWarnings();
+ }
/**
+ * Language/charset variant links for classic-style skins
* @return string
*/
- function doBeforeContent() {
- $mainPageObj = Title::newMainPage();
-
- $s = "\n<div id='content'>\n<div id='topbar'>" .
- '<table width="100%" cellspacing="0" cellpadding="8"><tr>';
+ function variantLinks() {
+ $s = array();
- $s .= '<td class="top" nowrap="nowrap">';
- $s .= '<a href="' . htmlspecialchars( $mainPageObj->getLocalURL() ) . '">';
- $s .= '<span id="sitetitle">' . wfMessage( 'sitetitle' )->escaped() . '</span></a>';
+ $variants = $this->data['content_navigation']['variants'];
- $s .= '</td><td class="top" id="top-syslinks" width="100%">';
- $s .= $this->sysLinks();
- $s .= '</td></tr><tr><td class="top-subheader">';
+ foreach ( $variants as $key => $link ) {
+ $s[] = $this->makeListItem( $key, $link, array( 'tag' => 'span' ) );
+ }
- $s .= '<font size="-1"><span id="sitesub">';
- $s .= wfMessage( 'sitesubtitle' )->escaped() . '</span></font>';
- $s .= '</td><td class="top-linkcollection">';
+ return $this->getSkin()->getLanguage()->pipeList( $s );
+ }
- $s .= '<font size="-1"><span id="langlinks">';
- $s .= str_replace( '<br />', '', $this->otherLanguages() );
+ function otherLanguages() {
+ global $wgHideInterlanguageLinks;
+ if ( $wgHideInterlanguageLinks ) {
+ return "";
+ }
- $s .= $this->getSkin()->getCategories();
+ // We override SkinTemplate->formatLanguageName() in SkinCologneBlue
+ // not to capitalize the language names.
+ $language_urls = $this->data['language_urls'];
+ if ( empty( $language_urls ) ) {
+ return "";
+ }
- $s .= '<br />' . $this->pageTitleLinks();
- $s .= '</span></font>';
+ $s = array();
+ foreach ( $language_urls as $key => $data ) {
+ $s[] = $this->makeListItem( $key, $data, array( 'tag' => 'span' ) );
+ }
- $s .= "</td></tr></table>\n";
+ return wfMessage( 'otherlanguages' )->text()
+ . wfMessage( 'colon-separator' )->text()
+ . $this->getSkin()->getLanguage()->pipeList( $s );
+ }
- $s .= "\n</div>\n<div id='article'>";
+ function pageTitleLinks() {
+ $s = array();
+ $footlinks = $this->getFooterLinks();
- $notice = $this->getSkin()->getSiteNotice();
- if( $notice ) {
- $s .= "\n<div id='siteNotice'>$notice</div>\n";
+ foreach ( $footlinks['places'] as $item ) {
+ $s[] = $this->data[$item];
}
- $s .= $this->pageTitle();
- $s .= $this->pageSubtitle() . "\n";
- return $s;
+
+ return $this->getSkin()->getLanguage()->pipeList( $s );
}
/**
+ * Used in bottomLinks() to eliminate repetitive code.
+ *
+ * @param $key string Key to be passed to makeListItem()
+ * @param $navlink array Navlink suitable for processNavlinkForDocument()
+ * @param $message string Key of the message to use in place of standard text
+ *
* @return string
*/
- function doAfterContent(){
- $s = "\n</div><br clear='all' />\n";
+ function processBottomLink( $key, $navlink, $message=null ) {
+ if ( !$navlink ) {
+ // Empty navlinks might be passed.
+ return null;
+ }
- $s .= "\n<div id='footer'>";
- $s .= '<table width="98%" cellspacing="0"><tr>';
+ if ( $message ) {
+ $navlink['text'] = wfMessage( $message )->escaped();
+ }
- $s .= '<td class="bottom">';
+ return $this->makeListItem( $key, $this->processNavlinkForDocument( $navlink ), array( 'tag' => 'span' ) );
+ }
- $s .= $this->bottomLinks();
- $s .= $this->getSkin()->getLanguage()->pipeList( array(
- "\n<br />" . Linker::linkKnown(
- Title::newMainPage()
- ),
- $this->getSkin()->aboutLink(),
- $this->searchForm( wfMessage( 'qbfind' )->text() )
- ) );
+ function bottomLinks() {
+ $toolbox = $this->getToolbox();
+ $content_nav = $this->data['content_navigation'];
+
+ $lines = array();
+
+ if ( $this->getSkin()->getOutput()->isArticleRelated() ) {
+ // First row. Regular actions.
+ $element = array();
+
+ $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->talkLink();
+
+ $element[] = $this->processBottomLink( 'history', $content_nav['views']['history'], 'history' );
+ $element[] = $this->processBottomLink( 'info', $toolbox['info'] );
+ $element[] = $this->processBottomLink( 'whatlinkshere', $toolbox['whatlinkshere'] );
+ $element[] = $this->processBottomLink( 'recentchangeslinked', $toolbox['recentchangeslinked'] );
+
+ $element[] = $this->processBottomLink( 'contributions', $toolbox['contributions'] );
+ $element[] = $this->processBottomLink( 'emailuser', $toolbox['emailuser'] );
+
+ $lines[] = $this->getSkin()->getLanguage()->pipeList( array_filter( $element ) );
- $s .= "\n<br />" . $this->pageStats();
- $s .= '</td>';
- $s .= "</tr></table>\n</div>\n</div>\n";
+ // Second row. Privileged actions.
+ $element = array();
- if ( $this->getSkin()->qbSetting() != 0 ) {
- $s .= $this->quickBar();
+ $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' );
+
+ $lines[] = $this->getSkin()->getLanguage()->pipeList( array_filter( $element ) );
+
+
+ // Third row. Language links.
+ $lines[] = $this->otherLanguages();
+ }
+
+ return implode( array_filter( $lines ), "<br />\n" ) . "<br />\n";
+ }
+
+ function talkLink() {
+ $title = $this->getSkin()->getTitle();
+
+ if ( $title->getNamespace() == NS_SPECIAL ) {
+ // No discussion links for special pages
+ return "";
+ }
+
+ $companionTitle = $title->isTalkPage() ? $title->getSubjectPage() : $title->getTalkPage();
+ $companionNamespace = $companionTitle->getNamespace();
+
+ // TODO these messages appear to only be used by CologneBlue and legacy skins,
+ // kill and replace with something more sensibly named?
+ $nsToMessage = array(
+ NS_MAIN => 'articlepage',
+ NS_USER => 'userpage',
+ NS_PROJECT => 'projectpage',
+ NS_FILE => 'imagepage',
+ NS_MEDIAWIKI => 'mediawikipage',
+ NS_TEMPLATE => 'templatepage',
+ NS_HELP => 'viewhelppage',
+ NS_CATEGORY => 'categorypage',
+ NS_FILE => 'imagepage',
+ );
+
+ // Find out the message to use for link text. Use either the array above or,
+ // for non-talk pages, a generic "discuss this" message.
+ // Default is the same as for main namespace.
+ if ( isset( $nsToMessage[$companionNamespace] ) ) {
+ $message = $nsToMessage[$companionNamespace];
+ } else {
+ $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)
+ $key = $companionTitle->getNamespaceKey( '' );
+ if ( $companionTitle->isTalkPage() ) {
+ $key = ( $key == 'main' ? 'talk' : $key . "_talk" );
}
+
+ // 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.
+ *
+ * @param $navlink array Navigational link generated by SkinTemplate
+ * @param $idPrefix mixed 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'] ) {
+ $navlink['single-id'] = $navlink['id']; // to allow for tooltip generation
+ $navlink['tooltiponly'] = true; // but no accesskeys
+
+ // mangle or remove the id
+ if ( $idPrefix === false ) {
+ unset( $navlink['id'] );
+ } else {
+ $navlink['id'] = $idPrefix . $navlink['id'];
+ }
+ }
+
+ return $navlink;
+ }
+
+ /**
+ * @return string
+ */
+ 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>
+ </div>
+ <div id="article" 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()->getCode();
+ $this->html( '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
+ $s = ob_get_contents();
+ ob_end_clean();
+
return $s;
}
/**
* @return string
*/
- function sysLinks() {
- $li = SpecialPage::getTitleFor( 'Userlogin' );
- $lo = SpecialPage::getTitleFor( 'Userlogout' );
+ function afterContent() {
+ ob_start();
+?>
+ </div>
+ <div id="footer" role="contentinfo">
+<?php
+ // Page-related links
+ echo $this->bottomLinks();
+ echo "\n<br />";
- $rt = $this->getSkin()->getTitle()->getPrefixedURL();
- if ( 0 == strcasecmp( urlencode( $lo ), $rt ) ) {
- $q = array();
- } else {
- $q = array( 'returnto' => $rt );
+ // Footer and second searchbox
+ echo $this->getSkin()->getLanguage()->pipeList( array(
+ $this->getSkin()->mainPageLink(),
+ $this->getSkin()->aboutLink(),
+ $this->searchForm( 'footer' )
+ ) );
+ echo "\n<br />";
+
+ // Standard footer info
+ $footlinks = $this->getFooterLinks();
+ if ( $footlinks['info'] ) {
+ foreach ( $footlinks['info'] as $item ) {
+ echo $this->data[$item] . ' ';
+ }
}
+?>
+ </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
+ $s = ob_get_contents();
+ ob_end_clean();
+ return $s;
+ }
+
+ /**
+ * @return string
+ */
+ function sysLinks() {
$s = array(
$this->getSkin()->mainPageLink(),
Linker::linkKnown(
@@ -174,189 +373,153 @@ class CologneBlueTemplate extends LegacyTemplate {
Title::newFromText( wfMessage( 'faqpage' )->inContentLanguage()->text() ),
wfMessage( 'faq' )->text()
),
- Linker::specialLink( 'Specialpages' )
);
- /* show links to different language variants */
- if( $this->variantLinks() ) {
- $s[] = $this->variantLinks();
- }
- if( $this->extensionTabLinks() ) {
- $s[] = $this->extensionTabLinks();
- }
- if ( $this->data['loggedin'] ) {
- $s[] = Linker::linkKnown(
- $lo,
- wfMessage( 'logout' )->text(),
- array(),
- $q
- );
- } else {
- $s[] = Linker::linkKnown(
- $li,
- wfMessage( 'login' )->text(),
- array(),
- $q
- );
+ $personalUrls = $this->getPersonalTools();
+ foreach ( array ( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
+ if ( $personalUrls[$key] ) {
+ $s[] = $this->makeListItem( $key, $personalUrls[$key], array( 'tag' => 'span' ) );
+ }
}
return $this->getSkin()->getLanguage()->pipeList( $s );
}
/**
+ * Adds CologneBlue-specific items to the sidebar: qbedit, qbpageoptions and qbmyoptions menus.
+ *
+ * @param $bar sidebar data
+ * @return array modified sidebar data
+ */
+ 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.
+ $content_navigation = $this->data['content_navigation'];
+ $qbpageoptions = array_merge(
+ $content_navigation['namespaces'],
+ array(
+ 'history' => $content_navigation['views']['history'],
+ 'watch' => $content_navigation['actions']['watch'],
+ 'unwatch' => $content_navigation['actions']['unwatch'],
+ )
+ );
+ $content_navigation['actions']['watch'] = null;
+ $content_navigation['actions']['unwatch'] = null;
+ $qbedit = array_merge(
+ array(
+ 'edit' => $content_navigation['views']['edit'],
+ 'addsection' => $content_navigation['views']['addsection'],
+ ),
+ $content_navigation['actions']
+ );
+
+ // Personal tools ("My pages")
+ $qbmyoptions = $this->getPersonalTools();
+ foreach ( array ( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
+ $qbmyoptions[$key] = null;
+ }
+
+ // Use the closest reasonable name
+ $bar['cactions'] = $qbedit;
+ $bar['pageoptions'] = $qbpageoptions; // this is a non-standard portlet name, but nothing fits
+ $bar['personal'] = $qbmyoptions;
+
+ return $bar;
+ }
+
+ /**
* Compute the sidebar
* @access private
*
* @return string
*/
- function quickBar(){
- $s = "\n<div id='quickbar'>";
-
- $sep = '<br />';
- $s .= $this->menuHead( 'qbfind' );
- $s .= $this->searchForm();
-
- $s .= $this->menuHead( 'qbbrowse' );
-
- # Use the first heading from the Monobook sidebar as the "browse" section
- $bar = $this->getSkin()->buildSidebar();
- unset( $bar['SEARCH'] );
- unset( $bar['LANGUAGES'] );
- unset( $bar['TOOLBOX'] );
-
- $barnumber = 1;
- foreach ( $bar as $heading => $browseLinks ) {
- if ( $barnumber > 1 ) {
- $headingMsg = wfMessage( $heading );
- if ( $headingMsg->exists() ) {
- $h = $headingMsg->text();
- } else {
- $h = $heading;
- }
- $s .= "\n<h6>" . htmlspecialchars( $h ) . "</h6>";
+ function quickBar() {
+ // Massage the sidebar. We want to:
+ // * place SEARCH at the beginning
+ // * add new portlets before TOOLBOX (or at the end, if it's missing)
+ // * remove LANGUAGES (langlinks are displayed elsewhere)
+ $orig_bar = $this->data['sidebar'];
+ $bar = array();
+ $hasToolbox = false;
+
+ // Always display search first
+ $bar['SEARCH'] = true;
+ // Copy everything except for langlinks, inserting new items before toolbox
+ foreach ( $orig_bar as $heading => $data ) {
+ if ( $heading == 'TOOLBOX' ) {
+ // Insert the stuff
+ $bar = $this->sidebarAdditions( $bar );
+ $hasToolbox = true;
}
- if( is_array( $browseLinks ) ) {
- foreach ( $browseLinks as $link ) {
- if ( $link['text'] != '-' ) {
- $s .= "<a href=\"{$link['href']}\">" .
- htmlspecialchars( $link['text'] ) . '</a>' . $sep;
- }
- }
+
+ if ( $heading != 'LANGUAGES' ) {
+ $bar[$heading] = $data;
}
- $barnumber++;
+ }
+ // If toolbox is missing, add our items at the end
+ if ( !$hasToolbox ) {
+ $bar = $this->sidebarAdditions( $bar );
}
- $user = $this->getSkin()->getUser();
- if ( $this->data['isarticle'] ) {
- $s .= $this->menuHead( 'qbedit' );
- $s .= '<strong>' . $this->editThisPage() . '</strong>';
+ // Fill out special sidebar items with content
+ $orig_bar = $bar;
+ $bar = array();
+ foreach ( $orig_bar as $heading => $data ) {
+ if ( $heading == 'SEARCH' ) {
+ $bar['search'] = $this->searchForm( 'sidebar' );
+ } elseif ( $heading == 'TOOLBOX' ) {
+ $bar['tb'] = $this->getToolbox();
+ } else {
+ $bar[$heading] = $data;
+ }
+ }
- $s .= $sep . Linker::linkKnown(
- Title::newFromText( wfMessage( 'edithelppage' )->inContentLanguage()->text() ),
- wfMessage( 'edithelp' )->text()
- );
- if( $this->data['loggedin'] ) {
- $s .= $sep . $this->moveThisPage();
- }
- if ( $user->isAllowed( 'delete' ) ) {
- $dtp = $this->deleteThisPage();
- if ( $dtp != '' ) {
- $s .= $sep . $dtp;
- }
- }
- if ( $user->isAllowed( 'protect' ) ) {
- $ptp = $this->protectThisPage();
- if ( $ptp != '' ) {
- $s .= $sep . $ptp;
- }
- }
- $s .= $sep;
-
- $s .= $this->menuHead( 'qbpageoptions' );
- $s .= $this->talkLink()
- . $sep . $this->commentLink()
- . $sep . $this->printableLink();
- if ( $this->data['loggedin'] ) {
- $s .= $sep . $this->watchThisPage();
- }
+ // Output the sidebar
+ // CologneBlue uses custom messages for some portlets, but we should keep the ids for consistency
+ $idToMessage = array(
+ 'search' => 'qbfind',
+ 'navigation' => 'qbbrowse',
+ 'tb' => 'toolbox',
+ 'cactions' => 'qbedit',
+ 'personal' => 'qbmyoptions',
+ 'pageoptions' => 'qbpageoptions',
+ );
- $s .= $sep;
-
- $s .= $this->menuHead( 'qbpageinfo' )
- . $this->historyLink()
- . $sep . $this->whatLinksHere()
- . $sep . $this->watchPageLinksLink();
-
- $title = $this->getSkin()->getTitle();
- $tns = $title->getNamespace();
- if ( $tns == NS_USER || $tns == NS_USER_TALK ) {
- $id = User::idFromName( $title->getText() );
- if( $id != 0 ) {
- $s .= $sep . $this->userContribsLink();
- if( $this->getSkin()->showEmailUser( $id ) ) {
- $s .= $sep . $this->emailUserLink();
+ $s = "<div id='quickbar'>\n";
+
+ 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>";
+ $listHTML = "";
+
+ if ( is_array( $data ) ) {
+ // $data is an array of links
+ foreach ( $data as $key => $link ) {
+ // Can be empty due to how the sidebar additions are done
+ if ( $link ) {
+ $listHTML .= $this->makeListItem( $key, $link );
}
}
+ if ( $listHTML ) {
+ $listHTML = "<ul>$listHTML</ul>";
+ }
+ } else {
+ // $data is a HTML <ul>-list string
+ $listHTML = $data;
}
- $s .= $sep;
- }
- $s .= $this->menuHead( 'qbmyoptions' );
- if ( $this->data['loggedin'] ) {
- $tl = Linker::linkKnown(
- $user->getTalkPage(),
- wfMessage( 'mytalk' )->escaped()
- );
- if ( $user->getNewtalk() ) {
- $tl .= ' *';
+ if ( $listHTML ) {
+ $role = ( $heading == 'search' ) ? 'search' : 'navigation';
+ $s .= "<div class=\"portlet\" id=\"$portletId\" role=\"$role\">\n$headingHTML\n$listHTML\n</div>\n";
}
-
- $s .= Linker::linkKnown(
- $user->getUserPage(),
- wfMessage( 'mypage' )->escaped()
- ) . $sep . $tl . $sep . Linker::specialLink( 'Watchlist' )
- . $sep .
- Linker::linkKnown(
- SpecialPage::getSafeTitleFor( 'Contributions', $user->getName() ),
- wfMessage( 'mycontris' )->escaped()
- ) . $sep . Linker::specialLink( 'Preferences' )
- . $sep . Linker::specialLink( 'Userlogout' );
- } else {
- $s .= Linker::specialLink( 'Userlogin' );
- }
-
- $s .= $this->menuHead( 'qbspecialpages' )
- . Linker::specialLink( 'Newpages' )
- . $sep . Linker::specialLink( 'Listfiles' )
- . $sep . Linker::specialLink( 'Statistics' );
- if( UploadBase::isEnabled() && UploadBase::isAllowed( $user ) === true ) {
- $s .= $sep . $this->getUploadLink();
}
- global $wgSiteSupportPage;
-
- if( $wgSiteSupportPage ) {
- $s .= $sep . '<a href="' . htmlspecialchars( $wgSiteSupportPage ) . '" class="internal">'
- . wfMessage( 'sitesupport' )->escaped() . '</a>';
- }
-
- $s .= $sep . Linker::linkKnown(
- SpecialPage::getTitleFor( 'Specialpages' ),
- wfMessage( 'moredotdotdot' )->text()
- );
-
- $s .= $sep . "\n</div>\n";
- return $s;
- }
-
- /**
- * @param $key string
- * @return string
- */
- function menuHead( $key ) {
- $s = "\n<h6>" . wfMessage( $key )->text() . "</h6>";
+ $s .= "</div>\n";
return $s;
}
@@ -364,31 +527,29 @@ class CologneBlueTemplate extends LegacyTemplate {
* @param $label string
* @return string
*/
- function searchForm( $label = '' ) {
+ function searchForm( $which ) {
global $wgUseTwoButtonsSearchForm;
$search = $this->getSkin()->getRequest()->getText( 'search' );
$action = $this->data['searchaction'];
- $s = "<form id=\"searchform{$this->searchboxes}\" method=\"get\" class=\"inline\" action=\"$action\">";
- if( $label != '' ) {
- $s .= "{$label}: ";
+ $s = "<form id=\"searchform-" . htmlspecialchars($which) . "\" method=\"get\" class=\"inline\" action=\"$action\">";
+ if( $which == 'footer' ) {
+ $s .= wfMessage( 'qbfind' )->text() . ": ";
}
- $s .= "<input type='text' id=\"searchInput{$this->searchboxes}\" class=\"mw-searchInput\" name=\"search\" size=\"14\" value=\""
- . htmlspecialchars( substr( $search, 0, 256 ) ) . "\" /><br />"
- . "<input type='submit' id=\"searchGoButton{$this->searchboxes}\" class=\"searchButton\" name=\"go\" value=\"" . wfMessage( 'searcharticle' )->escaped() . "\" />";
+ $s .= "<input type='text' class=\"mw-searchInput\" name=\"search\" size=\"14\" value=\""
+ . htmlspecialchars( substr( $search, 0, 256 ) ) . "\" />"
+ . ($which == 'footer' ? " " : "<br />")
+ . "<input type='submit' class=\"searchButton\" name=\"go\" value=\"" . wfMessage( 'searcharticle' )->escaped() . "\" />";
if( $wgUseTwoButtonsSearchForm ) {
- $s .= "<input type='submit' id=\"mw-searchButton{$this->searchboxes}\" class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'search' )->escaped() . "\" />\n";
+ $s .= " <input type='submit' class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'searchbutton' )->escaped() . "\" />\n";
} else {
$s .= '<div><a href="' . $action . '" rel="search">' . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n";
}
$s .= '</form>';
- // Ensure unique id's for search boxes made after the first
- $this->searchboxes = $this->searchboxes == '' ? 2 : $this->searchboxes + 1;
-
return $s;
}
}
diff --git a/skins/Modern.php b/skins/Modern.php
index 4211bb84..9dbefb11 100644
--- a/skins/Modern.php
+++ b/skins/Modern.php
@@ -37,7 +37,7 @@ class SkinModern extends SkinTemplate {
/**
* @param $out OutputPage
*/
- function setupSkinUserCss( OutputPage $out ){
+ function setupSkinUserCss( OutputPage $out ) {
parent::setupSkinUserCss( $out );
$out->addModuleStyles ('skins.modern');
}
@@ -65,7 +65,10 @@ class ModernTemplate extends MonoBookTemplate {
?>
<!-- heading -->
- <div id="mw_header"><h1 id="firstHeading"><span dir="auto"><?php $this->html('title') ?></span></h1></div>
+ <div id="mw_header"><h1 id="firstHeading" lang="<?php
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
+ $this->html( 'pageLanguage' );
+ ?>"><span dir="auto"><?php $this->html('title') ?></span></h1></div>
<div id="mw_main">
<div id="mw_contentwrapper">
@@ -73,7 +76,7 @@ class ModernTemplate extends MonoBookTemplate {
<?php $this->cactions(); ?>
<!-- content -->
- <div id="mw_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 -->
@@ -103,6 +106,7 @@ class ModernTemplate extends MonoBookTemplate {
</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'] ); ?>
@@ -115,8 +119,8 @@ class ModernTemplate extends MonoBookTemplate {
<div class="mw_clear"></div>
<!-- personal portlet -->
- <div class="portlet" id="p-personal">
- <h5><?php $this->msg('personaltools') ?></h5>
+ <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) { ?>
@@ -129,7 +133,7 @@ class ModernTemplate extends MonoBookTemplate {
<!-- footer -->
- <div id="footer"<?php $this->html('userlangattributes') ?>>
+ <div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
<ul id="f-list">
<?php
foreach( $this->getFooterLinks("flat") as $aLink ) {
diff --git a/skins/MonoBook.php b/skins/MonoBook.php
index 0bd7134b..f03d31b8 100644
--- a/skins/MonoBook.php
+++ b/skins/MonoBook.php
@@ -80,11 +80,14 @@ class MonoBookTemplate extends BaseTemplate {
$this->html( 'headelement' );
?><div id="globalWrapper">
-<div id="column-content"><div id="content" class="mw-body-primary">
+<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"><span dir="auto"><?php $this->html('title') ?></span></h1>
+ <h1 id="firstHeading" class="firstHeading" lang="<?php
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
+ $this->html( '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>
@@ -104,9 +107,10 @@ class MonoBookTemplate extends BaseTemplate {
</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">
- <h5><?php $this->msg('personaltools') ?></h5>
+ <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) { ?>
@@ -116,7 +120,7 @@ class MonoBookTemplate extends BaseTemplate {
</ul>
</div>
</div>
- <div class="portlet" id="p-logo">
+ <div class="portlet" id="p-logo" role="banner">
<?php
echo Html::element( 'a', array(
'href' => $this->data['nav_urls']['mainpage']['href'],
@@ -134,7 +138,7 @@ class MonoBookTemplate extends BaseTemplate {
$validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { ?>
-<div id="footer"<?php $this->html('userlangattributes') ?>>
+<div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
<?php
$footerEnd = '</div>';
} else {
@@ -200,8 +204,8 @@ echo $footerEnd;
function searchBox() {
global $wgUseTwoButtonsSearchForm;
?>
- <div id="p-search" class="portlet">
- <h5><label for="searchInput"><?php $this->msg('search') ?></label></h5>
+ <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') ?>"/>
@@ -227,8 +231,8 @@ echo $footerEnd;
*/
function cactions() {
?>
- <div id="p-cactions" class="portlet">
- <h5><?php $this->msg('views') ?></h5>
+ <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) {
@@ -244,8 +248,8 @@ echo $footerEnd;
/*************************************************************************************************/
function toolbox() {
?>
- <div class="portlet" id="p-tb">
- <h5><?php $this->msg('toolbox') ?></h5>
+ <div class="portlet" id="p-tb" role="navigation">
+ <h3><?php $this->msg('toolbox') ?></h3>
<div class="pBody">
<ul>
<?php
@@ -267,8 +271,8 @@ echo $footerEnd;
function languageBox() {
if( $this->data['language_urls'] ) {
?>
- <div id="p-lang" class="portlet">
- <h5<?php $this->html('userlangattributes') ?>><?php $this->msg('otherlanguages') ?></h5>
+ <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) { ?>
@@ -288,7 +292,7 @@ echo $footerEnd;
* @param $cont array|string
*/
function customBox( $bar, $cont ) {
- $portletAttribs = array( 'class' => 'generated-sidebar portlet', 'id' => Sanitizer::escapeId( "p-$bar" ) );
+ $portletAttribs = array( 'class' => 'generated-sidebar portlet', 'id' => Sanitizer::escapeId( "p-$bar" ), 'role' => 'navigation' );
$tooltip = Linker::titleAttrib( "p-$bar" );
if ( $tooltip !== false ) {
$portletAttribs['title'] = $tooltip;
@@ -296,7 +300,7 @@ echo $footerEnd;
echo ' ' . Html::openElement( 'div', $portletAttribs );
?>
- <h5><?php $msg = wfMessage( $bar ); echo htmlspecialchars( $msg->exists() ? $msg->text() : $bar ); ?></h5>
+ <h3><?php $msg = wfMessage( $bar ); echo htmlspecialchars( $msg->exists() ? $msg->text() : $bar ); ?></h3>
<div class='pBody'>
<?php if ( is_array( $cont ) ) { ?>
<ul>
diff --git a/skins/Nostalgia.php b/skins/Nostalgia.php
index c3f73e5b..3028915e 100644
--- a/skins/Nostalgia.php
+++ b/skins/Nostalgia.php
@@ -36,7 +36,7 @@ class SkinNostalgia extends SkinLegacy {
/**
* @param $out OutputPage
*/
- function setupSkinUserCss( OutputPage $out ){
+ function setupSkinUserCss( OutputPage $out ) {
parent::setupSkinUserCss( $out );
$out->addModuleStyles( 'skins.nostalgia' );
}
diff --git a/skins/Standard.php b/skins/Standard.php
index de116391..5b358e06 100644
--- a/skins/Standard.php
+++ b/skins/Standard.php
@@ -2,6 +2,22 @@
/**
* Standard (a.k.a. Classic) skin: old MediaWiki default skin
*
+ * 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 Skins
*/
@@ -21,7 +37,7 @@ class SkinStandard extends SkinLegacy {
/**
* @param $out OutputPage
*/
- function setupSkinUserCss( OutputPage $out ){
+ function setupSkinUserCss( OutputPage $out ) {
parent::setupSkinUserCss( $out );
$out->addModuleStyles( 'skins.standard' );
diff --git a/skins/Vector.php b/skins/Vector.php
index 6045ed6e..d0f99951 100644
--- a/skins/Vector.php
+++ b/skins/Vector.php
@@ -57,7 +57,7 @@ class SkinVector extends SkinTemplate {
"/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->"
);
- $out->addModuleScripts( 'skins.vector' );
+ $out->addModules( 'skins.vector.js' );
}
/**
@@ -65,14 +65,14 @@ class SkinVector extends SkinTemplate {
* fixes bug 22916
* @param $out OutputPage object
*/
- function setupSkinUserCss( OutputPage $out ){
+ function setupSkinUserCss( OutputPage $out ) {
parent::setupSkinUserCss( $out );
$out->addModuleStyles( 'skins.vector' );
}
/**
* Adds classes to the body element.
- *
+ *
* @param $out OutputPage object
* @param &$bodyAttrs Array of attributes that will be set on the body element
*/
@@ -156,7 +156,7 @@ class VectorTemplate extends BaseTemplate {
<div id="mw-page-base" class="noprint"></div>
<div id="mw-head-base" class="noprint"></div>
<!-- content -->
- <div id="content" class="mw-body">
+ <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'] ): ?>
@@ -165,7 +165,10 @@ class VectorTemplate extends BaseTemplate {
<!-- /sitenotice -->
<?php endif; ?>
<!-- firstHeading -->
- <h1 id="firstHeading" class="firstHeading"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+ <h1 id="firstHeading" class="firstHeading" lang="<?php
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
+ $this->html( 'pageLanguage' );
+ ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
<!-- /firstHeading -->
<!-- bodyContent -->
<div id="bodyContent">
@@ -191,7 +194,7 @@ class VectorTemplate extends BaseTemplate {
<!-- jumpto -->
<div id="jump-to-nav" class="mw-jump">
<?php $this->msg( 'jumpto' ) ?>
- <a href="#mw-head"><?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>
<!-- /jumpto -->
@@ -224,27 +227,30 @@ class VectorTemplate extends BaseTemplate {
<!-- /bodyContent -->
</div>
<!-- /content -->
- <!-- header -->
- <div id="mw-head" class="noprint">
- <?php $this->renderNavigation( 'PERSONAL' ); ?>
- <div id="left-navigation">
- <?php $this->renderNavigation( array( 'NAMESPACES', 'VARIANTS' ) ); ?>
- </div>
- <div id="right-navigation">
- <?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
+ <div id="mw-navigation">
+ <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+ <!-- header -->
+ <div id="mw-head">
+ <?php $this->renderNavigation( 'PERSONAL' ); ?>
+ <div id="left-navigation">
+ <?php $this->renderNavigation( array( 'NAMESPACES', 'VARIANTS' ) ); ?>
+ </div>
+ <div id="right-navigation">
+ <?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
+ </div>
</div>
- </div>
- <!-- /header -->
- <!-- panel -->
- <div id="mw-panel" class="noprint">
+ <!-- /header -->
+ <!-- panel -->
+ <div id="mw-panel">
<!-- logo -->
- <div id="p-logo"><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>
<!-- /logo -->
<?php $this->renderPortals( $this->data['sidebar'] ); ?>
</div>
- <!-- /panel -->
+ <!-- /panel -->
+ </div>
<!-- footer -->
- <div id="footer"<?php $this->html( 'userlangattributes' ) ?>>
+ <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 ): ?>
@@ -327,8 +333,8 @@ class VectorTemplate extends BaseTemplate {
$msg = $name;
}
?>
-<div class="portal" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo Linker::tooltip( 'p-' . $name ) ?>>
- <h5<?php $this->html( 'userlangattributes' ) ?>><?php $msgObj = wfMessage( $msg ); echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h5>
+<div class="portal" role="navigation" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo Linker::tooltip( 'p-' . $name ) ?>>
+ <h3<?php $this->html( 'userlangattributes' ) ?>><?php $msgObj = wfMessage( $msg ); echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h3>
<div class="body">
<?php
if ( is_array( $content ) ): ?>
@@ -377,8 +383,8 @@ class VectorTemplate extends BaseTemplate {
switch ( $element ) {
case 'NAMESPACES':
?>
-<div id="p-namespaces" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
- <h5><?php $this->msg( 'namespaces' ) ?></h5>
+<div id="p-namespaces" role="navigation" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+ <h3><?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>
@@ -389,15 +395,15 @@ class VectorTemplate extends BaseTemplate {
break;
case 'VARIANTS':
?>
-<div id="p-variants" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
- <h4>
+<div id="p-variants" role="navigation" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+ <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 endif; ?>
<?php endforeach; ?>
- </h4>
- <h5><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h5>
+ </h3>
+ <h3><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
<div class="menu">
<ul>
<?php foreach ( $this->data['variant_urls'] as $link ): ?>
@@ -410,8 +416,8 @@ class VectorTemplate extends BaseTemplate {
break;
case 'VIEWS':
?>
-<div id="p-views" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>">
- <h5><?php $this->msg('views') ?></h5>
+<div id="p-views" role="navigation" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>">
+ <h3><?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
@@ -427,8 +433,8 @@ class VectorTemplate extends BaseTemplate {
break;
case 'ACTIONS':
?>
-<div id="p-cactions" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
- <h5><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h5>
+<div id="p-cactions" role="navigation" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+ <h3><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 ): ?>
@@ -441,21 +447,23 @@ class VectorTemplate extends BaseTemplate {
break;
case 'PERSONAL':
?>
-<div id="p-personal" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
- <h5><?php $this->msg( 'personaltools' ) ?></h5>
+<div id="p-personal" role="navigation" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+ <h3><?php $this->msg( 'personaltools' ) ?></h3>
<ul<?php $this->html( 'userlangattributes' ) ?>>
-<?php foreach( $this->getPersonalTools() as $key => $item ) { ?>
- <?php echo $this->makeListItem( $key, $item ); ?>
-
-<?php } ?>
+<?php
+ $personalTools = $this->getPersonalTools();
+ foreach ( $personalTools as $key => $item ) {
+ echo $this->makeListItem( $key, $item );
+ }
+?>
</ul>
</div>
<?php
break;
case 'SEARCH':
?>
-<div id="p-search">
- <h5<?php $this->html( 'userlangattributes' ) ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h5>
+<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 && $this->getSkin()->getUser()->getOption( 'vector-simplesearch' ) ): ?>
<div id="simpleSearch">
diff --git a/skins/archlinux/main.css b/skins/archlinux/main.css
index 5866d97d..4cbc0939 100644
--- a/skins/archlinux/main.css
+++ b/skins/archlinux/main.css
@@ -24,6 +24,11 @@ div#content {
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;
@@ -71,6 +76,7 @@ a.new,
}
ul {
+ list-style-type: square;
/* @embed */
list-style-image: url(bullet.gif);
}
@@ -224,12 +230,7 @@ table.rimage {
width: 11.6em;
overflow: hidden;
}
-.portlet h4 {
- font-size: 95%;
- font-weight: normal;
- white-space: nowrap;
-}
-.portlet h5 {
+.portlet h3 {
background: transparent;
padding: 0 1em 0 .5em;
display: inline;
@@ -239,18 +240,6 @@ table.rimage {
font-weight: normal;
white-space: nowrap;
}
-.portlet h6 {
- background: #ffae2e;
- border: 1px solid #2f6fab;
- border-style: solid solid none solid;
- padding: 0 1em 0 1em;
- text-transform: lowercase;
- display: block;
- font-size: 1em;
- height: 1.2em;
- font-weight: normal;
- white-space: nowrap;
-}
.pBody {
font-size: 95%;
background-color: white;
@@ -259,18 +248,8 @@ table.rimage {
border: 1px solid #aaa;
padding: 0 .8em .3em .5em;
}
-.portlet h1,
-.portlet h2,
-.portlet h3,
-.portlet h4 {
- margin: 0;
- padding: 0;
-}
.portlet ul {
line-height: 1.5em;
- list-style-type: square;
- /* @embed */
- list-style-image: url(bullet.gif);
font-size: 95%;
}
.portlet li {
@@ -291,7 +270,7 @@ table.rimage {
width: 12em;
overflow: visible;
}
-#p-logo h5 {
+#p-logo h3 {
display: none;
}
#p-logo a,
@@ -352,7 +331,7 @@ input.searchButton {
overflow: visible;
line-height: 1.2em;
}
-#p-personal h5 {
+#p-personal h3 {
display: none;
}
#p-personal .portlet,
@@ -372,7 +351,8 @@ input.searchButton {
padding: 0 2em 0 3em;
margin: 0;
text-align: right;
- list-style: none;
+ list-style-type: none;
+ list-style-image: none;
z-index: 0;
background: none;
cursor: default;
@@ -432,11 +412,11 @@ li#pt-login {
background: none;
border-collapse: collapse;
padding-left: 1em;
- list-style: none;
font-size: 95%;
}
#p-cactions ul {
- list-style: none;
+ list-style-type: none;
+ list-style-image: none;
}
#p-cactions li {
display: inline;
@@ -474,7 +454,7 @@ li#pt-login {
text-decoration: none;
background-color: white;
}
-#p-cactions h5 {
+#p-cactions h3 {
display: none;
}
#p-cactions li.istalk {
@@ -515,8 +495,7 @@ li#ca-print {
}
/* Override text-transform on languages where capitalization is significant */
-.capitalize-all-nouns .portlet h5,
-.capitalize-all-nouns .portlet h6,
+.capitalize-all-nouns .portlet h3,
.capitalize-all-nouns #p-personal ul,
.capitalize-all-nouns #p-cactions ul li a {
text-transform: none;
@@ -824,7 +803,8 @@ div#searchTarget {
}
div#searchTarget ul li {
- list-style: none;
+ list-style-type: none;
+ list-style-image: none;
}
div#searchTarget ul li:before {
diff --git a/skins/cologneblue/screen.css b/skins/cologneblue/screen.css
index 57b5410e..349638aa 100644
--- a/skins/cologneblue/screen.css
+++ b/skins/cologneblue/screen.css
@@ -2,6 +2,7 @@ body {
margin: 0;
padding: 0;
color: black;
+ font-family: serif;
}
#specialform {
@@ -20,10 +21,6 @@ body {
font-size: 8pt;
}
-#topbar {
- padding: 0;
-}
-
#powersearch {
background: #DDEEFF;
border-style: solid;
@@ -61,64 +58,20 @@ textarea {
}
#footer {
+ margin-right: 2%;
+ margin-top: 1em;
padding: 4px;
+ font-family: verdana, arial, sans-serif;
+ font-size: 10pt;
+ text-align: center;
}
#footer form {
display: inline;
}
-#sitetitle {
- font-family: Times, serif;
- color: white;
- font-weight: normal;
- font-size: 32pt;
- line-height: 32pt;
-}
-
-td.top {
- background-color: #6688AA;
- color: white;
- margin-top: 4px;
- margin-bottom: 4px;
- padding-top: 0;
- padding-bottom: 0;
- text-transform: uppercase;
- font-family: Verdana, Arial, sans-serif;
- font-size: 8pt;
-}
-
-td.top a {
- font-family: Verdana, Arial, sans-serif;
- background-color: #6688AA;
- color: white;
- text-decoration: none;
- font-size: 10pt;
-}
-
-td#top-syslinks {
- text-align: right;
- vertical-align: bottom;
-}
-td.top-linkcollection {
- text-align: right;
-}
-/**
- * Overrides text justification (user preference)
- * See bug 31990
- */
-td.top-linkcollection #catlinks {
- text-align: right;
-}
-td.top-subheader {
- vertical-align: top;
-}
-td.bottom {
- font-family: Verdana, Arial, sans-serif;
- font-size: 10pt;
- padding: 0;
- text-align: center;
- vertical-align: bottom;
+#cb-ca-edit {
+ font-weight: bold;
}
#pagestats {
@@ -127,12 +80,7 @@ td.bottom {
font-size: 9pt;
}
-#sitesub {
- font-family: Verdana, Arial, sans-serif;
- font-size: 9pt; font-weight: bold;
- color: black;
- padding-top: 0;
-}
+
#quickbar {
font-family: Verdana, Arial, sans-serif;
@@ -149,7 +97,13 @@ td.bottom {
color: #446688;
}
-#quickbar h6 {
+/* Hide, but keep accessible for screen-readers */
+#mw-navigation h2 {
+ position: absolute;
+ top: -9999px;
+}
+
+#quickbar h3 {
font-family: Verdana, Arial, sans-serif;
font-size: 10pt;
font-weight: bold;
@@ -166,6 +120,14 @@ td.bottom {
margin-top: 0;
}
+#quickbar .portlet ul,
+#quickbar .portlet li {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ line-height: inherit;
+}
+
h1 {
color: #666666;
font-family: Verdana, Arial, sans-serif;
@@ -177,12 +139,12 @@ h1 .editsection {
font-size: 55.6%;
}
-h1.pagetitle {
+h1#firstHeading {
padding-bottom: 0;
margin-bottom: 0;
}
-#article p.subtitle {
+#article p.subtitle, #article p.subpages, #article p.tagline {
color: #666666;
font-size: 11pt;
font-weight: bold;
@@ -212,7 +174,7 @@ a.stub, #quickbar a.stub {
text-decoration: none;
}
-a.new, #quickbar a.new {
+a.new, #quickbar span.new a, #footer span.new a {
color: #CC2200;
}
@@ -227,3 +189,82 @@ small {
input.mw-searchInput {
width: 106px;
}
+
+/* Directionality-specific styles */
+#quickbar { position: absolute; left: 4px; }
+#article { margin-left: 148px; margin-right: 4px; }
+#footer { margin-left: 152px; }
+
+
+#sitetitle, #sitesub, #toplinks, #linkcollection {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+#sitetitle, #toplinks {
+ color: white;
+ text-transform: uppercase;
+ height: 32pt;
+}
+#sitetitle {
+ padding-left: 8px;
+ font-family: Times, serif;
+ font-weight: normal;
+ font-size: 32pt;
+ 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
+}
+
+#toplinks {
+ font-family: Verdana, Arial, sans-serif;
+ position: absolute;
+ top: 0;
+ right: 8px;
+ width: 100%;
+ font-size: 8pt;
+}
+#toplinks a {
+ font-size: 10pt;
+}
+#toplinks p {
+ position: absolute;
+ right: 0;
+ margin: 0;
+ width: 100%;
+ text-align: right;
+}
+#toplinks #syslinks {
+ bottom: 0;
+}
+#toplinks #variantlinks {
+ bottom: 12pt;
+}
+
+#sitesub {
+ float: left;
+ margin-left: 8px;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 9pt;
+ font-weight: bold;
+ color: black;
+}
+
+#linkcollection {
+ margin-top: 0.5em;
+ font-size: small;
+ margin-right: 8px;
+ text-align: right;
+}
+/* Override text justification (user preference), see bug 31990 */
+#linkcollection * {
+ text-align: right;
+}
diff --git a/skins/common/commonContent.css b/skins/common/commonContent.css
index 0fe8489e..a550d97a 100644
--- a/skins/common/commonContent.css
+++ b/skins/common/commonContent.css
@@ -1,6 +1,9 @@
-/*
-** MediaWiki style sheet for general styles on complex content
-*/
+/**
+ * MediaWiki style sheet for general styles on complex content
+ *
+ * Styles for complex things which are a standard part of page content
+ * (ie: the CSS classing built into the system), like the TOC.
+ */
/* Table of Contents */
#toc,
@@ -110,6 +113,16 @@ img.thumbborder {
}
/**
+ * Edit forms
+ */
+#editform textarea {
+ display: block;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+/**
* Basic styles for the user login and create account forms
*/
#userlogin, #userloginForm {
diff --git a/skins/common/commonElements.css b/skins/common/commonElements.css
index 02fd29fe..2fa0cbaf 100644
--- a/skins/common/commonElements.css
+++ b/skins/common/commonElements.css
@@ -1,6 +1,9 @@
/**
* MediaWiki style sheet for general styles on basic content elements
- * This style sheet is used by the monobook and vector skins
+ *
+ * Styles for basic elements: links, lists, etc...
+ *
+ * This style sheet is used by the Monobook and Vector skins.
*/
/* Links */
@@ -186,7 +189,7 @@ blockquote {
pre, code, tt, kbd, samp, .mw-code {
/*
* Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
- * Specifying any valid, second value will trigger correct behaviour without forcing a different font.
+ * Specifying any valid, second value will trigger correct behavior without forcing a different font.
*/
font-family: monospace, Courier;
}
diff --git a/skins/common/commonInterface.css b/skins/common/commonInterface.css
index 60d6436b..af6665e4 100644
--- a/skins/common/commonInterface.css
+++ b/skins/common/commonInterface.css
@@ -1,6 +1,10 @@
-/*
-** MediaWiki style sheet for common core styles on interfaces
-*/
+/**
+ * MediaWiki style sheet for common core styles on interfaces
+ *
+ * Styles for the Monobook/Vector pattern of laying out common interfaces.
+ * These ids/classes are not built into the system,
+ * they are outputted by the actual MonoBook/Vector code by convention.
+ */
/* Categories */
.catlinks {
diff --git a/skins/common/commonPrint.css b/skins/common/commonPrint.css
index 48dd943f..6cb213f2 100644
--- a/skins/common/commonPrint.css
+++ b/skins/common/commonPrint.css
@@ -125,7 +125,9 @@ li#privacy,
.mw-hidden-catlinks,
tr.mw-metadata-show-hide-extended,
span.mw-filepage-other-resolutions,
-#filetoc {
+#filetoc,
+.usermessage,
+#mw-navigation {
/* Hides all the elements irrelevant for printing */
display: none;
}
diff --git a/skins/common/config.css b/skins/common/config.css
index aa982d32..39206c3a 100644
--- a/skins/common/config.css
+++ b/skins/common/config.css
@@ -102,7 +102,6 @@
.config-settings-block {
list-style-type: none;
list-style-image: none;
- float: left;
margin: 0;
padding: 0;
}
diff --git a/skins/common/images/icons/fileicon-djvu.xcf b/skins/common/images/icons/fileicon-djvu.xcf
deleted file mode 100644
index 8043dcdb..00000000
--- a/skins/common/images/icons/fileicon-djvu.xcf
+++ /dev/null
Binary files differ
diff --git a/skins/common/images/icons/fileicon-ogg.xcf b/skins/common/images/icons/fileicon-ogg.xcf
deleted file mode 100644
index a91024bf..00000000
--- a/skins/common/images/icons/fileicon-ogg.xcf
+++ /dev/null
Binary files differ
diff --git a/skins/common/images/icons/fileicon-psd.png b/skins/common/images/icons/fileicon-psd.png
new file mode 100644
index 00000000..5bd40cb0
--- /dev/null
+++ b/skins/common/images/icons/fileicon-psd.png
Binary files differ
diff --git a/skins/common/shared.css b/skins/common/shared.css
index 8f771e9a..6e1c94fd 100644
--- a/skins/common/shared.css
+++ b/skins/common/shared.css
@@ -31,6 +31,12 @@
direction: rtl;
}
+/* User-Agent styles for new HTML5 elements */
+mark {
+ background-color: yellow;
+ color: black;
+}
+
/* Input types that should follow user direction, like buttons */
/* TODO: What about buttons in wikipage content ? */
input[type="submit"],
@@ -226,6 +232,9 @@ td.mw-label {
.prefsection table {
width: 100%;
}
+.prefsection table.mw-htmlform-matrix {
+ width: auto;
+}
td.mw-submit {
white-space: nowrap;
}
@@ -248,6 +257,11 @@ tr.mw-htmlform-vertical-label td.mw-label {
white-space: nowrap;
}
+.mw-htmlform-matrix td {
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+}
+
input#wpSummary {
width: 80%;
margin-bottom: 1em;
@@ -307,6 +321,11 @@ input#wpSummary {
padding-left: 0.25em;
border-left: none;
}
+
+/* (bug 5346) make category redirects italic */
+.catlinks li a.mw-redirect {
+ font-style: italic;
+}
/**
* Hidden categories
*/
@@ -448,6 +467,11 @@ th.mw-revdel-checkbox {
text-align: center;
}
+/* red links; see bug 36276 */
+a.new {
+ color: #BA0000;
+}
+
/* feed links */
a.feedlink {
/* @embed */
@@ -815,6 +839,7 @@ div.gallerytext {
/* Language specific height correction for titles. Ref Bug 29405 and Bug 30809 */
/* Languages like hi or ml require slightly more vertical space to show diacritics properly */
+h1:lang(anp),
h1:lang(as),
h1:lang(bh), /* Macrolanguage, used on bh.wikipedia.org, should be removed one day */
h1:lang(bho),
@@ -822,16 +847,22 @@ h1:lang(bn),
h1:lang(gu),
h1:lang(hi),
h1:lang(kn),
+h1:lang(ks),
h1:lang(ml),
h1:lang(mr),
h1:lang(my),
+h1:lang(mai),
+h1:lang(ne),
+h1:lang(new),
h1:lang(or),
h1:lang(pa),
+h1:lang(pi),
h1:lang(sa),
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),
h2:lang(bh), h3:lang(bh), h4:lang(bh), h5:lang(bh), h6:lang(bh),
@@ -839,11 +870,16 @@ h2:lang(bn), h3:lang(bn), h4:lang(bn), h5:lang(bn), h6:lang(bn),
h2:lang(gu), h3:lang(gu), h4:lang(gu), h5:lang(gu), h6:lang(gu),
h2:lang(hi), h3:lang(hi), h4:lang(hi), h5:lang(hi), h6:lang(hi),
h2:lang(kn), h3:lang(kn), h4:lang(kn), h5:lang(kn), h6:lang(kn),
+h2:lang(ks), h3:lang(ks), h4:lang(ks), h5:lang(ks), h6:lang(ks),
h2:lang(ml), h3:lang(ml), h4:lang(ml), h5:lang(ml), h6:lang(ml),
h2:lang(mr), h3:lang(mr), h4:lang(mr), h5:lang(mr), h6:lang(mr),
h2:lang(my), h3:lang(my), h4:lang(my), h5:lang(my), h6:lang(my),
+h2:lang(mai), h3:lang(mai), h4:lang(mai), h5:lang(mai), h6:lang(mai),
+h2:lang(ne), h3:lang(ne), h4:lang(ne), h5:lang(ne), h6:lang(ne),
+h2:lang(new), h3:lang(new), h4:lang(new), h5:lang(new), h6:lang(new),
h2:lang(or), h3:lang(or), h4:lang(or), h5:lang(or), h6:lang(or),
h2:lang(pa), h3:lang(pa), h4:lang(pa), h5:lang(pa), h6:lang(pa),
+h2:lang(pi), h3:lang(pi), h4:lang(pi), h5:lang(pi), h6:lang(pi),
h2:lang(sa), h3:lang(sa), h4:lang(sa), h5:lang(sa), h6:lang(sa),
h2:lang(ta), h3:lang(ta), h4:lang(ta), h5:lang(ta), h6:lang(ta),
h2:lang(te), h3:lang(te), h4:lang(te), h5:lang(te), h6:lang(te) {
@@ -1057,8 +1093,8 @@ table.floatleft {
}
.editsection, .toctoggle {
- -moz-user-select: none;
- -webkit-user-select: none;
- -ms-user-select: none;
- user-select: none;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
}
diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js
index 05efb4a9..709cc334 100644
--- a/skins/common/wikibits.js
+++ b/skins/common/wikibits.js
@@ -91,10 +91,9 @@ window.importStylesheet = function( page ) {
window.importStylesheetURI = function( url, media ) {
var l = document.createElement( 'link' );
- l.type = 'text/css';
l.rel = 'stylesheet';
l.href = url;
- if( media ) {
+ if ( media ) {
l.media = media;
}
document.getElementsByTagName('head')[0].appendChild( l );
diff --git a/skins/modern/main.css b/skins/modern/main.css
index 7149551f..f201209d 100644
--- a/skins/modern/main.css
+++ b/skins/modern/main.css
@@ -58,6 +58,7 @@ body {
font-variant: small-caps;
}
+#p-personal h3,
#p-personal h5 {
display: none;
}
@@ -125,6 +126,12 @@ body {
background-color: #f0f0f0;
}
+/* Hide, but keep accessible for screen-readers */
+#mw_portlets h2 {
+ position: absolute;
+ top: -9999px;
+}
+
#mw_main {
padding: 0 0 0 0;
margin: 0 0 0 0;
@@ -150,6 +157,11 @@ textarea {
width: 100%;
padding: .1em;
}
+#editform textarea {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
#searchBody {
text-align: center;
@@ -165,11 +177,13 @@ textarea {
margin-top: .4em;
}
+.portlet h3,
.portlet h5 {
padding: 0.1em 0 0.3em 1em;
margin: 0 0 0 0;
background-color: #dddddd;
font-weight: bold;
+ font-size: 0.83em;
border-bottom: solid 1px #3c78b5;
height: 1.1em;
}
@@ -238,6 +252,7 @@ ul {
color: white;
}
+#p-cactions h3,
#p-cactions h5 {
display: none;
}
diff --git a/skins/monobook/main.css b/skins/monobook/main.css
index 5866d97d..4cbc0939 100644
--- a/skins/monobook/main.css
+++ b/skins/monobook/main.css
@@ -24,6 +24,11 @@ div#content {
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;
@@ -71,6 +76,7 @@ a.new,
}
ul {
+ list-style-type: square;
/* @embed */
list-style-image: url(bullet.gif);
}
@@ -224,12 +230,7 @@ table.rimage {
width: 11.6em;
overflow: hidden;
}
-.portlet h4 {
- font-size: 95%;
- font-weight: normal;
- white-space: nowrap;
-}
-.portlet h5 {
+.portlet h3 {
background: transparent;
padding: 0 1em 0 .5em;
display: inline;
@@ -239,18 +240,6 @@ table.rimage {
font-weight: normal;
white-space: nowrap;
}
-.portlet h6 {
- background: #ffae2e;
- border: 1px solid #2f6fab;
- border-style: solid solid none solid;
- padding: 0 1em 0 1em;
- text-transform: lowercase;
- display: block;
- font-size: 1em;
- height: 1.2em;
- font-weight: normal;
- white-space: nowrap;
-}
.pBody {
font-size: 95%;
background-color: white;
@@ -259,18 +248,8 @@ table.rimage {
border: 1px solid #aaa;
padding: 0 .8em .3em .5em;
}
-.portlet h1,
-.portlet h2,
-.portlet h3,
-.portlet h4 {
- margin: 0;
- padding: 0;
-}
.portlet ul {
line-height: 1.5em;
- list-style-type: square;
- /* @embed */
- list-style-image: url(bullet.gif);
font-size: 95%;
}
.portlet li {
@@ -291,7 +270,7 @@ table.rimage {
width: 12em;
overflow: visible;
}
-#p-logo h5 {
+#p-logo h3 {
display: none;
}
#p-logo a,
@@ -352,7 +331,7 @@ input.searchButton {
overflow: visible;
line-height: 1.2em;
}
-#p-personal h5 {
+#p-personal h3 {
display: none;
}
#p-personal .portlet,
@@ -372,7 +351,8 @@ input.searchButton {
padding: 0 2em 0 3em;
margin: 0;
text-align: right;
- list-style: none;
+ list-style-type: none;
+ list-style-image: none;
z-index: 0;
background: none;
cursor: default;
@@ -432,11 +412,11 @@ li#pt-login {
background: none;
border-collapse: collapse;
padding-left: 1em;
- list-style: none;
font-size: 95%;
}
#p-cactions ul {
- list-style: none;
+ list-style-type: none;
+ list-style-image: none;
}
#p-cactions li {
display: inline;
@@ -474,7 +454,7 @@ li#pt-login {
text-decoration: none;
background-color: white;
}
-#p-cactions h5 {
+#p-cactions h3 {
display: none;
}
#p-cactions li.istalk {
@@ -515,8 +495,7 @@ li#ca-print {
}
/* Override text-transform on languages where capitalization is significant */
-.capitalize-all-nouns .portlet h5,
-.capitalize-all-nouns .portlet h6,
+.capitalize-all-nouns .portlet h3,
.capitalize-all-nouns #p-personal ul,
.capitalize-all-nouns #p-cactions ul li a {
text-transform: none;
@@ -824,7 +803,8 @@ div#searchTarget {
}
div#searchTarget ul li {
- list-style: none;
+ list-style-type: none;
+ list-style-image: none;
}
div#searchTarget ul li:before {
diff --git a/skins/simple/main.css b/skins/simple/main.css
index 7b4f2ae5..edb1d7d4 100644
--- a/skins/simple/main.css
+++ b/skins/simple/main.css
@@ -84,6 +84,12 @@ a:hover {
left: 0;
}
+/* Hide, but keep accessible for screen-readers */
+#column-one h2 {
+ position: absolute;
+ top: -9999px;
+}
+
body {
margin: 0;
padding: 0;
diff --git a/skins/vector/images/border.png b/skins/vector/images/border.png
deleted file mode 100644
index f9ca8cc3..00000000
--- a/skins/vector/images/border.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/images/page-base.png b/skins/vector/images/page-base.png
deleted file mode 100644
index b3ecd30d..00000000
--- a/skins/vector/images/page-base.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/images/preferences-base.png b/skins/vector/images/preferences-base.png
deleted file mode 100644
index 8e0082b1..00000000
--- a/skins/vector/images/preferences-base.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/images/preferences-edge.png b/skins/vector/images/preferences-edge.png
deleted file mode 100644
index 411a1aaa..00000000
--- a/skins/vector/images/preferences-edge.png
+++ /dev/null
Binary files differ
diff --git a/skins/vector/screen.css b/skins/vector/screen.css
index 4069d9e4..2e09ee17 100644
--- a/skins/vector/screen.css
+++ b/skins/vector/screen.css
@@ -21,22 +21,26 @@ body {
font-size: 1em;
}
body {
- background-color: #f3f3f3;
- /* @embed */
- background-image: url(images/page-base.png);
+ background-color: #f6f6f6;
}
/* Content */
div#content {
margin-left: 10em;
padding: 1em;
- /* @embed */
- background-image: url(images/border.png);
- background-position: top left;
- background-repeat: repeat-y;
+ /* Border on top, left, and bottom side */
+ border: 1px solid #a7d7f9;
+ border-right-width: 0;
+ /* Merge the border with tabs' one (in their background image) */
+ margin-top: -1px;
background-color: white;
color: black;
direction: ltr;
}
+/* Hide, but keep accessible for screen-readers */
+#mw-navigation h2 {
+ position: absolute;
+ top: -9999px;
+}
/* Head */
#mw-page-base {
height: 5em;
@@ -50,10 +54,6 @@ div#content {
margin-top: -5em;
margin-left: 10em;
height: 5em;
- /* @embed */
- background-image: url(images/border.png);
- background-position: bottom left;
- background-repeat: repeat-x;
}
div#mw-head {
position: absolute;
@@ -61,6 +61,7 @@ div#mw-head {
right: 0;
width: 100%;
}
+div#mw-head h3,
div#mw-head h5 {
margin: 0;
padding: 0;
@@ -74,12 +75,16 @@ div.emptyPortlet {
position: absolute;
top: 0.33em;
right: 0.75em;
+ /* Display on top of page tabs - bug 37158 */
+ z-index: 1;
}
+#p-personal h3,
#p-personal h5 {
display: none;
}
#p-personal ul {
- list-style: none;
+ list-style-type: none;
+ list-style-image: none;
margin: 0;
padding-left: 10em; /* Keep from overlapping logo */
}
@@ -106,7 +111,9 @@ div.emptyPortlet {
margin-top: 2.5em;
}
/* Navigation Labels */
+div.vectorTabs h3,
div.vectorTabs h5,
+div.vectorMenu h3 span,
div.vectorMenu h5 span {
display: none;
}
@@ -129,7 +136,8 @@ div.vectorTabs ul {
}
div.vectorTabs ul {
height: 100%;
- list-style: none;
+ list-style-type: none;
+ list-style-image: none;
margin: 0;
padding: 0;
}
@@ -226,6 +234,7 @@ body.rtl div.vectorMenu {
}
/* OVERRIDDEN BY COMPLIANT BROWSERS */
/* @noflip */
+div#mw-head div.vectorMenu h3,
div#mw-head div.vectorMenu h5 {
float: left;
/* @embed */
@@ -233,15 +242,18 @@ div#mw-head div.vectorMenu h5 {
background-repeat: no-repeat;
}
/* This will be flipped - unlike the one above it */
+div#mw-head div.vectorMenu h3,
div#mw-head div.vectorMenu h5 {
background-position: bottom left;
margin-left: -1px;
}
/* IGNORED BY IE6 */
+div#mw-head div.vectorMenu > h3,
div#mw-head div.vectorMenu > h5 {
background-image: none;
}
-div#mw-head div.vectorMenu h4 {
+div#mw-head div.vectorMenu h4,
+div.vectorMenu#p-variants #mw-vector-current-variant {
display: inline-block;
float: left;
font-size: 0.8em;
@@ -252,20 +264,23 @@ div#mw-head div.vectorMenu h4 {
}
/* OVERRIDDEN BY COMPLIANT BROWSERS */
/* @noflip */
+div.vectorMenu h3 a,
div.vectorMenu h5 a {
display: inline-block;
width: 24px;
- height: 2.5em;
+ height: 1.9em;
text-decoration: none;
/* @embed */
background-image: url(images/tab-break.png);
background-repeat: no-repeat;
}
/* This will be flipped - unlike the one above it */
+div.vectorMenu h3 a,
div.vectorMenu h5 a {
background-position: bottom right;
}
/* IGNORED BY IE6 */
+div.vectorMenu h3 > a,
div.vectorMenu h5 > a {
display: block;
}
@@ -302,9 +317,8 @@ div.vectorMenu ul {
background-color: white;
border: solid 1px silver;
border-top-width: 0;
- list-style: none;
- list-style-image: none;
list-style-type: none;
+ list-style-image: none;
padding: 0;
margin: 0;
margin-left: -1px;
@@ -346,6 +360,7 @@ div.vectorMenu li.selected a:visited {
text-decoration: none;
}
/* Search */
+#p-search h3,
#p-search h5 {
display: none;
}
@@ -399,6 +414,12 @@ div#simpleSearch input.placeholder {
div#simpleSearch input::-webkit-input-placeholder {
color: #999;
}
+div#simpleSearch input:-moz-placeholder {
+ color: #999;
+}
+div#simpleSearch input:-ms-input-placeholder {
+ color: #999;
+}
div#simpleSearch input#searchInput {
position: absolute;
top: 0;
@@ -457,6 +478,7 @@ div#mw-panel div.portal {
padding-bottom: 1.5em;
direction: ltr;
}
+div#mw-panel div.portal h3,
div#mw-panel div.portal h5 {
font-weight: normal;
color: #444;
@@ -477,9 +499,8 @@ div#mw-panel div.portal div.body {
background-position: top left;
}
div#mw-panel div.portal div.body ul {
- list-style: none;
- list-style-image: none;
list-style-type: none;
+ list-style-image: none;
padding: 0;
margin: 0;
}
@@ -502,16 +523,11 @@ div#footer {
margin-left: 10em;
margin-top: 0;
padding: 0.75em;
- /* @embed */
- background-image: url(images/border.png);
- background-position: top left;
- background-repeat: repeat-x;
direction: ltr;
}
div#footer ul {
- list-style: none;
- list-style-image: none;
list-style-type: none;
+ list-style-image: none;
margin: 0;
padding: 0;
}
@@ -629,9 +645,7 @@ div#footer #footer-places li {
margin-top: -2px;
clear: both;
border: solid 1px #ccc;
- background-color: #f9f9f9;
- /* @embed */
- background-image: url(images/preferences-base.png);
+ background-color: #fafafa;
}
#preferences fieldset {
border: none;
@@ -679,6 +693,7 @@ div#content {
}
ul {
+ list-style-type: disc;
/* @embed */
list-style-image: url(images/bullet-icon.png);
}
diff --git a/skins/vector/vector.js b/skins/vector/vector.js
index 8b719e5b..4427d9a3 100644
--- a/skins/vector/vector.js
+++ b/skins/vector/vector.js
@@ -4,7 +4,7 @@
jQuery( function ( $ ) {
$( 'div.vectorMenu' ).each( function () {
var $el = $( this );
- $el.find( 'h5:first a:first' )
+ $el.find( 'h3:first a:first' )
// For accessibility, show the menu when the hidden link in the menu is clicked (bug 24298)
.click( function ( e ) {
$el.find( '.menu:first' ).toggleClass( 'menuForceShow' );
diff --git a/tests/.htaccess b/tests/.htaccess
deleted file mode 100644
index 3a428827..00000000
--- a/tests/.htaccess
+++ /dev/null
@@ -1 +0,0 @@
-Deny from all
diff --git a/tests/RunSeleniumTests.php b/tests/RunSeleniumTests.php
deleted file mode 100644
index 28501eaa..00000000
--- a/tests/RunSeleniumTests.php
+++ /dev/null
@@ -1,233 +0,0 @@
-#!/usr/bin/php
-<?php
-/**
- * @file
- * @ingroup Maintenance
- * @copyright Copyright © Wikimedia Deuschland, 2009
- * @author Hallo Welt! Medienwerkstatt GmbH
- * @author Markus Glaser, Dan Nessett, Priyanka Dhanda
- * initial idea by Daniel Kinzler
- *
- * 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
- */
-
-$IP = dirname( __DIR__ );
-
-define( 'SELENIUMTEST', true );
-
-//require_once( __DIR__ . '/../maintenance/commandLine.inc' );
-require( __DIR__ . '/../maintenance/Maintenance.php' );
-
-require_once( 'PHPUnit/Runner/Version.php' );
-if( version_compare( PHPUnit_Runner_Version::id(), '3.5.0', '>=' ) ) {
- # PHPUnit 3.5.0 introduced a nice autoloader based on class name
- require_once( 'PHPUnit/Autoload.php' );
-} else {
- # Keep the old pre PHPUnit 3.5.0 behaviour for compatibility
- require_once( 'PHPUnit/TextUI/Command.php' );
-}
-
-require_once( 'PHPUnit/Extensions/SeleniumTestCase.php' );
-include_once( 'PHPUnit/Util/Log/JUnit.php' );
-
-require_once( __DIR__ . "/selenium/SeleniumServerManager.php" );
-
-class SeleniumTester extends Maintenance {
- protected $selenium;
- protected $serverManager;
- protected $seleniumServerExecPath;
-
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Selenium Test Runner. For documentation, visit http://www.mediawiki.org/wiki/SeleniumFramework";
- $this->addOption( 'port', 'Port used by selenium server. Default: 4444', false, true );
- $this->addOption( 'host', 'Host selenium server. Default: $wgServer . $wgScriptPath', false, true );
- $this->addOption( 'testBrowser', 'The browser used during testing. Default: firefox', false, true );
- $this->addOption( 'wikiUrl', 'The Mediawiki installation to point to. Default: http://localhost', false, true );
- $this->addOption( 'username', 'The login username for sunning tests. Default: empty', false, true );
- $this->addOption( 'userPassword', 'The login password for running tests. Default: empty', false, true );
- $this->addOption( 'seleniumConfig', 'Location of the selenium config file. Default: empty', false, true );
- $this->addOption( 'list-browsers', 'List the available browsers.' );
- $this->addOption( 'verbose', 'Be noisier.' );
- $this->addOption( 'startserver', 'Start Selenium Server (on localhost) before the run.' );
- $this->addOption( 'stopserver', 'Stop Selenium Server (on localhost) after the run.' );
- $this->addOption( 'jUnitLogFile', 'Log results in a specified JUnit log file. Default: empty', false, true );
- $this->addOption( 'runAgainstGrid', 'The test will be run against a Selenium Grid. Default: false.', false, true );
- $this->deleteOption( 'dbpass' );
- $this->deleteOption( 'dbuser' );
- $this->deleteOption( 'globals' );
- $this->deleteOption( 'wiki' );
- }
-
- public function listBrowsers() {
- $desc = "Available browsers:\n";
-
- foreach ($this->selenium->getAvailableBrowsers() as $k => $v) {
- $desc .= " $k => $v\n";
- }
-
- echo $desc;
- }
-
- protected function startServer() {
- if ( $this->seleniumServerExecPath == '' ) {
- die ( "The selenium server exec path is not set in " .
- "selenium_settings.ini. Cannot start server \n" .
- "as requested - terminating RunSeleniumTests\n" );
- }
- $this->serverManager = new SeleniumServerManager( 'true',
- $this->selenium->getPort(),
- $this->seleniumServerExecPath );
- switch ( $this->serverManager->start() ) {
- case 'started':
- break;
- case 'failed':
- die ( "Unable to start the Selenium Server - " .
- "terminating RunSeleniumTests\n" );
- case 'running':
- echo ( "Warning: The Selenium Server is " .
- "already running\n" );
- break;
- }
-
- return;
- }
-
- protected function stopServer() {
- if ( !isset ( $this->serverManager ) ) {
- echo ( "Warning: Request to stop Selenium Server, but it was " .
- "not stared by RunSeleniumTests\n" .
- "RunSeleniumTests cannot stop a Selenium Server it " .
- "did not start\n" );
- } else {
- switch ( $this->serverManager->stop() ) {
- case 'stopped':
- break;
- case 'failed':
- echo ( "unable to stop the Selenium Server\n" );
- }
- }
- return;
- }
-
- protected function runTests( $seleniumTestSuites = array() ) {
- $result = new PHPUnit_Framework_TestResult;
- $result->addListener( new SeleniumTestListener( $this->selenium->getLogger() ) );
- if ( $this->selenium->getJUnitLogFile() ) {
- $jUnitListener = new PHPUnit_Util_Log_JUnit( $this->selenium->getJUnitLogFile(), true );
- $result->addListener( $jUnitListener );
- }
-
- foreach ( $seleniumTestSuites as $testSuiteName => $testSuiteFile ) {
- require( $testSuiteFile );
- $suite = new $testSuiteName();
- $suite->setName( $testSuiteName );
- $suite->addTests();
-
- try {
- $suite->run( $result );
- } catch ( Testing_Selenium_Exception $e ) {
- $suite->tearDown();
- throw new MWException( $e->getMessage() );
- }
- }
-
- if ( $this->selenium->getJUnitLogFile() ) {
- $jUnitListener->flush();
- }
- }
-
- public function execute() {
- global $wgServer, $wgScriptPath, $wgHooks;
-
- $seleniumSettings = array();
- $seleniumBrowsers = array();
- $seleniumTestSuites = array();
-
- $configFile = $this->getOption( 'seleniumConfig', '' );
- if ( strlen( $configFile ) > 0 ) {
- $this->output("Using Selenium Configuration file: " . $configFile . "\n");
- SeleniumConfig::getSeleniumSettings( $seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites,
- $configFile );
- } elseif ( !isset( $wgHooks['SeleniumSettings'] ) ) {
- $this->output("No command line, configuration file or configuration hook found.\n");
- SeleniumConfig::getSeleniumSettings( $seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites
- );
- } else {
- $this->output("Using 'SeleniumSettings' hook for configuration.\n");
- wfRunHooks('SeleniumSettings', array( $seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites ) );
- }
-
- // State for starting/stopping the Selenium server has nothing to do with the Selenium
- // class. Keep this state local to SeleniumTester class. Using getOption() is clumsy, but
- // the Maintenance class does not have a setOption()
- if ( ! isset( $seleniumSettings['startserver'] ) ) $this->getOption( 'startserver', true );
- if ( ! isset( $seleniumSettings['stopserver'] ) ) $this->getOption( 'stopserver', true );
- if ( !isset( $seleniumSettings['seleniumserverexecpath'] ) ) $seleniumSettings['seleniumserverexecpath'] = '';
- $this->seleniumServerExecPath = $seleniumSettings['seleniumserverexecpath'];
-
- //set reasonable defaults if we did not find the settings
- if ( !isset( $seleniumBrowsers ) ) $seleniumBrowsers = array ('firefox' => '*firefox');
- if ( !isset( $seleniumSettings['host'] ) ) $seleniumSettings['host'] = $wgServer . $wgScriptPath;
- if ( !isset( $seleniumSettings['port'] ) ) $seleniumSettings['port'] = '4444';
- if ( !isset( $seleniumSettings['wikiUrl'] ) ) $seleniumSettings['wikiUrl'] = 'http://localhost';
- if ( !isset( $seleniumSettings['username'] ) ) $seleniumSettings['username'] = '';
- if ( !isset( $seleniumSettings['userPassword'] ) ) $seleniumSettings['userPassword'] = '';
- if ( !isset( $seleniumSettings['testBrowser'] ) ) $seleniumSettings['testBrowser'] = 'firefox';
- if ( !isset( $seleniumSettings['jUnitLogFile'] ) ) $seleniumSettings['jUnitLogFile'] = false;
- if ( !isset( $seleniumSettings['runAgainstGrid'] ) ) $seleniumSettings['runAgainstGrid'] = false;
-
- // Setup Selenium class
- $this->selenium = new Selenium( );
- $this->selenium->setAvailableBrowsers( $seleniumBrowsers );
- $this->selenium->setRunAgainstGrid( $this->getOption( 'runAgainstGrid', $seleniumSettings['runAgainstGrid'] ) );
- $this->selenium->setUrl( $this->getOption( 'wikiUrl', $seleniumSettings['wikiUrl'] ) );
- $this->selenium->setBrowser( $this->getOption( 'testBrowser', $seleniumSettings['testBrowser'] ) );
- $this->selenium->setPort( $this->getOption( 'port', $seleniumSettings['port'] ) );
- $this->selenium->setHost( $this->getOption( 'host', $seleniumSettings['host'] ) );
- $this->selenium->setUser( $this->getOption( 'username', $seleniumSettings['username'] ) );
- $this->selenium->setPass( $this->getOption( 'userPassword', $seleniumSettings['userPassword'] ) );
- $this->selenium->setVerbose( $this->hasOption( 'verbose' ) );
- $this->selenium->setJUnitLogFile( $this->getOption( 'jUnitLogFile', $seleniumSettings['jUnitLogFile'] ) );
-
- if( $this->hasOption( 'list-browsers' ) ) {
- $this->listBrowsers();
- exit(0);
- }
- if ( $this->hasOption( 'startserver' ) ) {
- $this->startServer();
- }
-
- $logger = new SeleniumTestConsoleLogger;
- $this->selenium->setLogger( $logger );
-
- $this->runTests( $seleniumTestSuites );
-
- if ( $this->hasOption( 'stopserver' ) ) {
- $this->stopServer();
- }
- }
-}
-
-$maintClass = "SeleniumTester";
-
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/tests/TestsAutoLoader.php b/tests/TestsAutoLoader.php
deleted file mode 100644
index 42f5f68a..00000000
--- a/tests/TestsAutoLoader.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-global $wgAutoloadClasses;
-$testFolder = __DIR__;
-
-$wgAutoloadClasses += array(
-
- //PHPUnit
- 'MediaWikiTestCase' => "$testFolder/phpunit/MediaWikiTestCase.php",
- 'MediaWikiPHPUnitCommand' => "$testFolder/phpunit/MediaWikiPHPUnitCommand.php",
- 'MediaWikiLangTestCase' => "$testFolder/phpunit/MediaWikiLangTestCase.php",
- 'NewParserTest' => "$testFolder/phpunit/includes/parser/NewParserTest.php",
-
- //includes
- 'BlockTest' => "$testFolder/phpunit/includes/BlockTest.php",
-
- //API
- 'ApiFormatTestBase' => "$testFolder/phpunit/includes/api/format/ApiFormatTestBase.php",
- 'ApiTestCase' => "$testFolder/phpunit/includes/api/ApiTestCase.php",
- 'TestUser' => "$testFolder/phpunit/includes/TestUser.php",
- 'MockApi' => "$testFolder/phpunit/includes/api/ApiTestCase.php",
- 'RandomImageGenerator' => "$testFolder/phpunit/includes/api/RandomImageGenerator.php",
- 'UserWrapper' => "$testFolder/phpunit/includes/api/ApiTestCase.php",
-
- //Selenium
- 'SeleniumTestConstants' => "$testFolder/selenium/SeleniumTestConstants.php",
-
- //maintenance
- 'DumpTestCase' => "$testFolder/phpunit/maintenance/DumpTestCase.php",
- 'BackupDumper' => "$testFolder/../maintenance/backup.inc",
-
- //Generic providers
- 'MediaWikiProvide' => "$testFolder/phpunit/includes/Providers.php",
-);
-
diff --git a/tests/jasmine/.htaccess b/tests/jasmine/.htaccess
deleted file mode 100644
index 605d2f4c..00000000
--- a/tests/jasmine/.htaccess
+++ /dev/null
@@ -1 +0,0 @@
-Allow from all
diff --git a/tests/jasmine/SpecRunner.html b/tests/jasmine/SpecRunner.html
deleted file mode 100644
index 63d0fdfa..00000000
--- a/tests/jasmine/SpecRunner.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html lang="en" dir="ltr">
- <head>
- <title>Jasmine Test Runner</title>
- <meta charset="UTF-8" />
- <link rel="stylesheet" type="text/css" href="lib/jasmine-1.0.1/jasmine.css">
- <script src="lib/jasmine-1.0.1/jasmine.js"></script>
- <script src="lib/jasmine-1.0.1/jasmine-html.js"></script>
-
- <!-- include source files here... -->
- <script src="../../load.php?debug=true&amp;lang=en&amp;modules=startup&amp;only=scripts&amp;skin=vector&amp;*"></script>
- <script>
- mw.loader.load( ['mediawiki.jqueryMsg'] );
- </script>
-
- <!-- insert test data files here -->
- <script src="spec/mediawiki.jqueryMsg.spec.data.js"></script>
-
- <!-- include spec files here... -->
- <script src="spec/mediawiki.jqueryMsg.spec.js"></script>
- </head>
-<body>
- <script>
- jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );
- jasmine.getEnv().execute();
- </script>
-</body>
-</html>
diff --git a/tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE b/tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE
deleted file mode 100644
index 1eb9b49e..00000000
--- a/tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2008-2010 Pivotal Labs
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js b/tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js
deleted file mode 100644
index 81402b9c..00000000
--- a/tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js
+++ /dev/null
@@ -1,188 +0,0 @@
-jasmine.TrivialReporter = function(doc) {
- this.document = doc || document;
- this.suiteDivs = {};
- this.logRunningSpecs = false;
-};
-
-jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
- var el = document.createElement(type);
-
- for (var i = 2; i < arguments.length; i++) {
- var child = arguments[i];
-
- if (typeof child === 'string') {
- el.appendChild(document.createTextNode(child));
- } else {
- if (child) { el.appendChild(child); }
- }
- }
-
- for (var attr in attrs) {
- if (attr == "className") {
- el[attr] = attrs[attr];
- } else {
- el.setAttribute(attr, attrs[attr]);
- }
- }
-
- return el;
-};
-
-jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
- var showPassed, showSkipped;
-
- this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
- this.createDom('div', { className: 'banner' },
- this.createDom('div', { className: 'logo' },
- this.createDom('a', { href: 'http://pivotal.github.com/jasmine/', target: "_blank" }, "Jasmine"),
- this.createDom('span', { className: 'version' }, runner.env.versionString())),
- this.createDom('div', { className: 'options' },
- "Show ",
- showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
- this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
- showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
- this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
- )
- ),
-
- this.runnerDiv = this.createDom('div', { className: 'runner running' },
- this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
- this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
- this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
- );
-
- this.document.body.appendChild(this.outerDiv);
-
- var suites = runner.suites();
- for (var i = 0; i < suites.length; i++) {
- var suite = suites[i];
- var suiteDiv = this.createDom('div', { className: 'suite' },
- this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
- this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
- this.suiteDivs[suite.id] = suiteDiv;
- var parentDiv = this.outerDiv;
- if (suite.parentSuite) {
- parentDiv = this.suiteDivs[suite.parentSuite.id];
- }
- parentDiv.appendChild(suiteDiv);
- }
-
- this.startedAt = new Date();
-
- var self = this;
- showPassed.onclick = function(evt) {
- if (showPassed.checked) {
- self.outerDiv.className += ' show-passed';
- } else {
- self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
- }
- };
-
- showSkipped.onclick = function(evt) {
- if (showSkipped.checked) {
- self.outerDiv.className += ' show-skipped';
- } else {
- self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
- }
- };
-};
-
-jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
- var results = runner.results();
- var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
- this.runnerDiv.setAttribute("class", className);
- //do it twice for IE
- this.runnerDiv.setAttribute("className", className);
- var specs = runner.specs();
- var specCount = 0;
- for (var i = 0; i < specs.length; i++) {
- if (this.specFilter(specs[i])) {
- specCount++;
- }
- }
- var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
- message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
- this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
-
- this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
-};
-
-jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
- var results = suite.results();
- var status = results.passed() ? 'passed' : 'failed';
- if (results.totalCount == 0) { // todo: change this to check results.skipped
- status = 'skipped';
- }
- this.suiteDivs[suite.id].className += " " + status;
-};
-
-jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
- if (this.logRunningSpecs) {
- this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
- }
-};
-
-jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
- var results = spec.results();
- var status = results.passed() ? 'passed' : 'failed';
- if (results.skipped) {
- status = 'skipped';
- }
- var specDiv = this.createDom('div', { className: 'spec ' + status },
- this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
- this.createDom('a', {
- className: 'description',
- href: '?spec=' + encodeURIComponent(spec.getFullName()),
- title: spec.getFullName()
- }, spec.description));
-
-
- var resultItems = results.getItems();
- var messagesDiv = this.createDom('div', { className: 'messages' });
- for (var i = 0; i < resultItems.length; i++) {
- var result = resultItems[i];
-
- if (result.type == 'log') {
- messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
- } else if (result.type == 'expect' && result.passed && !result.passed()) {
- messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
-
- if (result.trace.stack) {
- messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
- }
- }
- }
-
- if (messagesDiv.childNodes.length > 0) {
- specDiv.appendChild(messagesDiv);
- }
-
- this.suiteDivs[spec.suite.id].appendChild(specDiv);
-};
-
-jasmine.TrivialReporter.prototype.log = function() {
- var console = jasmine.getGlobal().console;
- if (console && console.log) {
- if (console.log.apply) {
- console.log.apply(console, arguments);
- } else {
- console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
- }
- }
-};
-
-jasmine.TrivialReporter.prototype.getLocation = function() {
- return this.document.location;
-};
-
-jasmine.TrivialReporter.prototype.specFilter = function(spec) {
- var paramMap = {};
- var params = this.getLocation().search.substring(1).split('&');
- for (var i = 0; i < params.length; i++) {
- var p = params[i].split('=');
- paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
- }
-
- if (!paramMap["spec"]) return true;
- return spec.getFullName().indexOf(paramMap["spec"]) == 0;
-};
diff --git a/tests/jasmine/lib/jasmine-1.0.1/jasmine.css b/tests/jasmine/lib/jasmine-1.0.1/jasmine.css
deleted file mode 100644
index 6583fe7c..00000000
--- a/tests/jasmine/lib/jasmine-1.0.1/jasmine.css
+++ /dev/null
@@ -1,166 +0,0 @@
-body {
- font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif;
-}
-
-
-.jasmine_reporter a:visited, .jasmine_reporter a {
- color: #303;
-}
-
-.jasmine_reporter a:hover, .jasmine_reporter a:active {
- color: blue;
-}
-
-.run_spec {
- float:right;
- padding-right: 5px;
- font-size: .8em;
- text-decoration: none;
-}
-
-.jasmine_reporter {
- margin: 0 5px;
-}
-
-.banner {
- color: #303;
- background-color: #fef;
- padding: 5px;
-}
-
-.logo {
- float: left;
- font-size: 1.1em;
- padding-left: 5px;
-}
-
-.logo .version {
- font-size: .6em;
- padding-left: 1em;
-}
-
-.runner.running {
- background-color: yellow;
-}
-
-
-.options {
- text-align: right;
- font-size: .8em;
-}
-
-
-
-
-.suite {
- border: 1px outset gray;
- margin: 5px 0;
- padding-left: 1em;
-}
-
-.suite .suite {
- margin: 5px;
-}
-
-.suite.passed {
- background-color: #dfd;
-}
-
-.suite.failed {
- background-color: #fdd;
-}
-
-.spec {
- margin: 5px;
- padding-left: 1em;
- clear: both;
-}
-
-.spec.failed, .spec.passed, .spec.skipped {
- padding-bottom: 5px;
- border: 1px solid gray;
-}
-
-.spec.failed {
- background-color: #fbb;
- border-color: red;
-}
-
-.spec.passed {
- background-color: #bfb;
- border-color: green;
-}
-
-.spec.skipped {
- background-color: #bbb;
-}
-
-.messages {
- border-left: 1px dashed gray;
- padding-left: 1em;
- padding-right: 1em;
-}
-
-.passed {
- background-color: #cfc;
- display: none;
-}
-
-.failed {
- background-color: #fbb;
-}
-
-.skipped {
- color: #777;
- background-color: #eee;
- display: none;
-}
-
-
-/*.resultMessage {*/
- /*white-space: pre;*/
-/*}*/
-
-.resultMessage span.result {
- display: block;
- line-height: 2em;
- color: black;
-}
-
-.resultMessage .mismatch {
- color: black;
-}
-
-.stackTrace {
- white-space: pre;
- font-size: .8em;
- margin-left: 10px;
- max-height: 5em;
- overflow: auto;
- border: 1px inset red;
- padding: 1em;
- background: #eef;
-}
-
-.finished-at {
- padding-left: 1em;
- font-size: .6em;
-}
-
-.show-passed .passed,
-.show-skipped .skipped {
- display: block;
-}
-
-
-#jasmine_content {
- position:fixed;
- right: 100%;
-}
-
-.runner {
- border: 1px solid gray;
- display: block;
- margin: 5px 0;
- padding: 2px 0 2px 10px;
-}
diff --git a/tests/jasmine/lib/jasmine-1.0.1/jasmine.js b/tests/jasmine/lib/jasmine-1.0.1/jasmine.js
deleted file mode 100644
index 964f99ed..00000000
--- a/tests/jasmine/lib/jasmine-1.0.1/jasmine.js
+++ /dev/null
@@ -1,2421 +0,0 @@
-/**
- * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework.
- *
- * @namespace
- */
-var jasmine = {};
-
-/**
- * @private
- */
-jasmine.unimplementedMethod_ = function() {
- throw new Error("unimplemented method");
-};
-
-/**
- * Use <code>jasmine.undefined</code> instead of <code>undefined</code>, since <code>undefined</code> is just
- * a plain old variable and may be redefined by somebody else.
- *
- * @private
- */
-jasmine.undefined = jasmine.___undefined___;
-
-/**
- * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed.
- *
- */
-jasmine.DEFAULT_UPDATE_INTERVAL = 250;
-
-/**
- * Default timeout interval in milliseconds for waitsFor() blocks.
- */
-jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;
-
-jasmine.getGlobal = function() {
- function getGlobal() {
- return this;
- }
-
- return getGlobal();
-};
-
-/**
- * Allows for bound functions to be compared. Internal use only.
- *
- * @ignore
- * @private
- * @param base {Object} bound 'this' for the function
- * @param name {Function} function to find
- */
-jasmine.bindOriginal_ = function(base, name) {
- var original = base[name];
- if (original.apply) {
- return function() {
- return original.apply(base, arguments);
- };
- } else {
- // IE support
- return jasmine.getGlobal()[name];
- }
-};
-
-jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout');
-jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout');
-jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval');
-jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval');
-
-jasmine.MessageResult = function(values) {
- this.type = 'log';
- this.values = values;
- this.trace = new Error(); // todo: test better
-};
-
-jasmine.MessageResult.prototype.toString = function() {
- var text = "";
- for(var i = 0; i < this.values.length; i++) {
- if (i > 0) text += " ";
- if (jasmine.isString_(this.values[i])) {
- text += this.values[i];
- } else {
- text += jasmine.pp(this.values[i]);
- }
- }
- return text;
-};
-
-jasmine.ExpectationResult = function(params) {
- this.type = 'expect';
- this.matcherName = params.matcherName;
- this.passed_ = params.passed;
- this.expected = params.expected;
- this.actual = params.actual;
-
- this.message = this.passed_ ? 'Passed.' : params.message;
- this.trace = this.passed_ ? '' : new Error(this.message);
-};
-
-jasmine.ExpectationResult.prototype.toString = function () {
- return this.message;
-};
-
-jasmine.ExpectationResult.prototype.passed = function () {
- return this.passed_;
-};
-
-/**
- * Getter for the Jasmine environment. Ensures one gets created
- */
-jasmine.getEnv = function() {
- return jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env();
-};
-
-/**
- * @ignore
- * @private
- * @param value
- * @returns {Boolean}
- */
-jasmine.isArray_ = function(value) {
- return jasmine.isA_("Array", value);
-};
-
-/**
- * @ignore
- * @private
- * @param value
- * @returns {Boolean}
- */
-jasmine.isString_ = function(value) {
- return jasmine.isA_("String", value);
-};
-
-/**
- * @ignore
- * @private
- * @param value
- * @returns {Boolean}
- */
-jasmine.isNumber_ = function(value) {
- return jasmine.isA_("Number", value);
-};
-
-/**
- * @ignore
- * @private
- * @param {String} typeName
- * @param value
- * @returns {Boolean}
- */
-jasmine.isA_ = function(typeName, value) {
- return Object.prototype.toString.apply(value) === '[object ' + typeName + ']';
-};
-
-/**
- * Pretty printer for expecations. Takes any object and turns it into a human-readable string.
- *
- * @param value {Object} an object to be outputted
- * @returns {String}
- */
-jasmine.pp = function(value) {
- var stringPrettyPrinter = new jasmine.StringPrettyPrinter();
- stringPrettyPrinter.format(value);
- return stringPrettyPrinter.string;
-};
-
-/**
- * Returns true if the object is a DOM Node.
- *
- * @param {Object} obj object to check
- * @returns {Boolean}
- */
-jasmine.isDomNode = function(obj) {
- return obj['nodeType'] > 0;
-};
-
-/**
- * Returns a matchable 'generic' object of the class type. For use in expecations of type when values don't matter.
- *
- * @example
- * // don't care about which function is passed in, as long as it's a function
- * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function));
- *
- * @param {Class} clazz
- * @returns matchable object of the type clazz
- */
-jasmine.any = function(clazz) {
- return new jasmine.Matchers.Any(clazz);
-};
-
-/**
- * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks.
- *
- * Spies should be created in test setup, before expectations. They can then be checked, using the standard Jasmine
- * expectation syntax. Spies can be checked if they were called or not and what the calling params were.
- *
- * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs).
- *
- * Spies are torn down at the end of every spec.
- *
- * Note: Do <b>not</b> call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj.
- *
- * @example
- * // a stub
- * var myStub = jasmine.createSpy('myStub'); // can be used anywhere
- *
- * // spy example
- * var foo = {
- * not: function(bool) { return !bool; }
- * }
- *
- * // actual foo.not will not be called, execution stops
- * spyOn(foo, 'not');
-
- // foo.not spied upon, execution will continue to implementation
- * spyOn(foo, 'not').andCallThrough();
- *
- * // fake example
- * var foo = {
- * not: function(bool) { return !bool; }
- * }
- *
- * // foo.not(val) will return val
- * spyOn(foo, 'not').andCallFake(function(value) {return value;});
- *
- * // mock example
- * foo.not(7 == 7);
- * expect(foo.not).toHaveBeenCalled();
- * expect(foo.not).toHaveBeenCalledWith(true);
- *
- * @constructor
- * @see spyOn, jasmine.createSpy, jasmine.createSpyObj
- * @param {String} name
- */
-jasmine.Spy = function(name) {
- /**
- * The name of the spy, if provided.
- */
- this.identity = name || 'unknown';
- /**
- * Is this Object a spy?
- */
- this.isSpy = true;
- /**
- * The actual function this spy stubs.
- */
- this.plan = function() {
- };
- /**
- * Tracking of the most recent call to the spy.
- * @example
- * var mySpy = jasmine.createSpy('foo');
- * mySpy(1, 2);
- * mySpy.mostRecentCall.args = [1, 2];
- */
- this.mostRecentCall = {};
-
- /**
- * Holds arguments for each call to the spy, indexed by call count
- * @example
- * var mySpy = jasmine.createSpy('foo');
- * mySpy(1, 2);
- * mySpy(7, 8);
- * mySpy.mostRecentCall.args = [7, 8];
- * mySpy.argsForCall[0] = [1, 2];
- * mySpy.argsForCall[1] = [7, 8];
- */
- this.argsForCall = [];
- this.calls = [];
-};
-
-/**
- * Tells a spy to call through to the actual implemenatation.
- *
- * @example
- * var foo = {
- * bar: function() { // do some stuff }
- * }
- *
- * // defining a spy on an existing property: foo.bar
- * spyOn(foo, 'bar').andCallThrough();
- */
-jasmine.Spy.prototype.andCallThrough = function() {
- this.plan = this.originalValue;
- return this;
-};
-
-/**
- * For setting the return value of a spy.
- *
- * @example
- * // defining a spy from scratch: foo() returns 'baz'
- * var foo = jasmine.createSpy('spy on foo').andReturn('baz');
- *
- * // defining a spy on an existing property: foo.bar() returns 'baz'
- * spyOn(foo, 'bar').andReturn('baz');
- *
- * @param {Object} value
- */
-jasmine.Spy.prototype.andReturn = function(value) {
- this.plan = function() {
- return value;
- };
- return this;
-};
-
-/**
- * For throwing an exception when a spy is called.
- *
- * @example
- * // defining a spy from scratch: foo() throws an exception w/ message 'ouch'
- * var foo = jasmine.createSpy('spy on foo').andThrow('baz');
- *
- * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch'
- * spyOn(foo, 'bar').andThrow('baz');
- *
- * @param {String} exceptionMsg
- */
-jasmine.Spy.prototype.andThrow = function(exceptionMsg) {
- this.plan = function() {
- throw exceptionMsg;
- };
- return this;
-};
-
-/**
- * Calls an alternate implementation when a spy is called.
- *
- * @example
- * var baz = function() {
- * // do some stuff, return something
- * }
- * // defining a spy from scratch: foo() calls the function baz
- * var foo = jasmine.createSpy('spy on foo').andCall(baz);
- *
- * // defining a spy on an existing property: foo.bar() calls an anonymnous function
- * spyOn(foo, 'bar').andCall(function() { return 'baz';} );
- *
- * @param {Function} fakeFunc
- */
-jasmine.Spy.prototype.andCallFake = function(fakeFunc) {
- this.plan = fakeFunc;
- return this;
-};
-
-/**
- * Resets all of a spy's the tracking variables so that it can be used again.
- *
- * @example
- * spyOn(foo, 'bar');
- *
- * foo.bar();
- *
- * expect(foo.bar.callCount).toEqual(1);
- *
- * foo.bar.reset();
- *
- * expect(foo.bar.callCount).toEqual(0);
- */
-jasmine.Spy.prototype.reset = function() {
- this.wasCalled = false;
- this.callCount = 0;
- this.argsForCall = [];
- this.calls = [];
- this.mostRecentCall = {};
-};
-
-jasmine.createSpy = function(name) {
-
- var spyObj = function() {
- spyObj.wasCalled = true;
- spyObj.callCount++;
- var args = jasmine.util.argsToArray(arguments);
- spyObj.mostRecentCall.object = this;
- spyObj.mostRecentCall.args = args;
- spyObj.argsForCall.push(args);
- spyObj.calls.push({object: this, args: args});
- return spyObj.plan.apply(this, arguments);
- };
-
- var spy = new jasmine.Spy(name);
-
- for (var prop in spy) {
- spyObj[prop] = spy[prop];
- }
-
- spyObj.reset();
-
- return spyObj;
-};
-
-/**
- * Determines whether an object is a spy.
- *
- * @param {jasmine.Spy|Object} putativeSpy
- * @returns {Boolean}
- */
-jasmine.isSpy = function(putativeSpy) {
- return putativeSpy && putativeSpy.isSpy;
-};
-
-/**
- * Creates a more complicated spy: an Object that has every property a function that is a spy. Used for stubbing something
- * large in one call.
- *
- * @param {String} baseName name of spy class
- * @param {Array} methodNames array of names of methods to make spies
- */
-jasmine.createSpyObj = function(baseName, methodNames) {
- if (!jasmine.isArray_(methodNames) || methodNames.length == 0) {
- throw new Error('createSpyObj requires a non-empty array of method names to create spies for');
- }
- var obj = {};
- for (var i = 0; i < methodNames.length; i++) {
- obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]);
- }
- return obj;
-};
-
-/**
- * All parameters are pretty-printed and concatenated together, then written to the current spec's output.
- *
- * Be careful not to leave calls to <code>jasmine.log</code> in production code.
- */
-jasmine.log = function() {
- var spec = jasmine.getEnv().currentSpec;
- spec.log.apply(spec, arguments);
-};
-
-/**
- * Function that installs a spy on an existing object's method name. Used within a Spec to create a spy.
- *
- * @example
- * // spy example
- * var foo = {
- * not: function(bool) { return !bool; }
- * }
- * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops
- *
- * @see jasmine.createSpy
- * @param obj
- * @param methodName
- * @returns a Jasmine spy that can be chained with all spy methods
- */
-var spyOn = function(obj, methodName) {
- return jasmine.getEnv().currentSpec.spyOn(obj, methodName);
-};
-
-/**
- * Creates a Jasmine spec that will be added to the current suite.
- *
- * // TODO: pending tests
- *
- * @example
- * it('should be true', function() {
- * expect(true).toEqual(true);
- * });
- *
- * @param {String} desc description of this specification
- * @param {Function} func defines the preconditions and expectations of the spec
- */
-var it = function(desc, func) {
- return jasmine.getEnv().it(desc, func);
-};
-
-/**
- * Creates a <em>disabled</em> Jasmine spec.
- *
- * A convenience method that allows existing specs to be disabled temporarily during development.
- *
- * @param {String} desc description of this specification
- * @param {Function} func defines the preconditions and expectations of the spec
- */
-var xit = function(desc, func) {
- return jasmine.getEnv().xit(desc, func);
-};
-
-/**
- * Starts a chain for a Jasmine expectation.
- *
- * It is passed an Object that is the actual value and should chain to one of the many
- * jasmine.Matchers functions.
- *
- * @param {Object} actual Actual value to test against and expected value
- */
-var expect = function(actual) {
- return jasmine.getEnv().currentSpec.expect(actual);
-};
-
-/**
- * Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs.
- *
- * @param {Function} func Function that defines part of a jasmine spec.
- */
-var runs = function(func) {
- jasmine.getEnv().currentSpec.runs(func);
-};
-
-/**
- * Waits a fixed time period before moving to the next block.
- *
- * @deprecated Use waitsFor() instead
- * @param {Number} timeout milliseconds to wait
- */
-var waits = function(timeout) {
- jasmine.getEnv().currentSpec.waits(timeout);
-};
-
-/**
- * Waits for the latchFunction to return true before proceeding to the next block.
- *
- * @param {Function} latchFunction
- * @param {String} optional_timeoutMessage
- * @param {Number} optional_timeout
- */
-var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
- jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments);
-};
-
-/**
- * A function that is called before each spec in a suite.
- *
- * Used for spec setup, including validating assumptions.
- *
- * @param {Function} beforeEachFunction
- */
-var beforeEach = function(beforeEachFunction) {
- jasmine.getEnv().beforeEach(beforeEachFunction);
-};
-
-/**
- * A function that is called after each spec in a suite.
- *
- * Used for restoring any state that is hijacked during spec execution.
- *
- * @param {Function} afterEachFunction
- */
-var afterEach = function(afterEachFunction) {
- jasmine.getEnv().afterEach(afterEachFunction);
-};
-
-/**
- * Defines a suite of specifications.
- *
- * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared
- * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization
- * of setup in some tests.
- *
- * @example
- * // TODO: a simple suite
- *
- * // TODO: a simple suite with a nested describe block
- *
- * @param {String} description A string, usually the class under test.
- * @param {Function} specDefinitions function that defines several specs.
- */
-var describe = function(description, specDefinitions) {
- return jasmine.getEnv().describe(description, specDefinitions);
-};
-
-/**
- * Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development.
- *
- * @param {String} description A string, usually the class under test.
- * @param {Function} specDefinitions function that defines several specs.
- */
-var xdescribe = function(description, specDefinitions) {
- return jasmine.getEnv().xdescribe(description, specDefinitions);
-};
-
-
-// Provide the XMLHttpRequest class for IE 5.x-6.x:
-jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() {
- try {
- return new ActiveXObject("Msxml2.XMLHTTP.6.0");
- } catch(e) {
- }
- try {
- return new ActiveXObject("Msxml2.XMLHTTP.3.0");
- } catch(e) {
- }
- try {
- return new ActiveXObject("Msxml2.XMLHTTP");
- } catch(e) {
- }
- try {
- return new ActiveXObject("Microsoft.XMLHTTP");
- } catch(e) {
- }
- throw new Error("This browser does not support XMLHttpRequest.");
-} : XMLHttpRequest;
-/**
- * @namespace
- */
-jasmine.util = {};
-
-/**
- * Declare that a child class inherit it's prototype from the parent class.
- *
- * @private
- * @param {Function} childClass
- * @param {Function} parentClass
- */
-jasmine.util.inherit = function(childClass, parentClass) {
- /**
- * @private
- */
- var subclass = function() {
- };
- subclass.prototype = parentClass.prototype;
- childClass.prototype = new subclass;
-};
-
-jasmine.util.formatException = function(e) {
- var lineNumber;
- if (e.line) {
- lineNumber = e.line;
- }
- else if (e.lineNumber) {
- lineNumber = e.lineNumber;
- }
-
- var file;
-
- if (e.sourceURL) {
- file = e.sourceURL;
- }
- else if (e.fileName) {
- file = e.fileName;
- }
-
- var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString();
-
- if (file && lineNumber) {
- message += ' in ' + file + ' (line ' + lineNumber + ')';
- }
-
- return message;
-};
-
-jasmine.util.htmlEscape = function(str) {
- if (!str) return str;
- return str.replace(/&/g, '&amp;')
- .replace(/</g, '&lt;')
- .replace(/>/g, '&gt;');
-};
-
-jasmine.util.argsToArray = function(args) {
- var arrayOfArgs = [];
- for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]);
- return arrayOfArgs;
-};
-
-jasmine.util.extend = function(destination, source) {
- for (var property in source) destination[property] = source[property];
- return destination;
-};
-
-/**
- * Environment for Jasmine
- *
- * @constructor
- */
-jasmine.Env = function() {
- this.currentSpec = null;
- this.currentSuite = null;
- this.currentRunner_ = new jasmine.Runner(this);
-
- this.reporter = new jasmine.MultiReporter();
-
- this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL;
- this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL;
- this.lastUpdate = 0;
- this.specFilter = function() {
- return true;
- };
-
- this.nextSpecId_ = 0;
- this.nextSuiteId_ = 0;
- this.equalityTesters_ = [];
-
- // wrap matchers
- this.matchersClass = function() {
- jasmine.Matchers.apply(this, arguments);
- };
- jasmine.util.inherit(this.matchersClass, jasmine.Matchers);
-
- jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass);
-};
-
-
-jasmine.Env.prototype.setTimeout = jasmine.setTimeout;
-jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout;
-jasmine.Env.prototype.setInterval = jasmine.setInterval;
-jasmine.Env.prototype.clearInterval = jasmine.clearInterval;
-
-/**
- * @returns an object containing jasmine version build info, if set.
- */
-jasmine.Env.prototype.version = function () {
- if (jasmine.version_) {
- return jasmine.version_;
- } else {
- throw new Error('Version not set');
- }
-};
-
-/**
- * @returns string containing jasmine version build info, if set.
- */
-jasmine.Env.prototype.versionString = function() {
- if (jasmine.version_) {
- var version = this.version();
- return version.major + "." + version.minor + "." + version.build + " revision " + version.revision;
- } else {
- return "version unknown";
- }
-};
-
-/**
- * @returns a sequential integer starting at 0
- */
-jasmine.Env.prototype.nextSpecId = function () {
- return this.nextSpecId_++;
-};
-
-/**
- * @returns a sequential integer starting at 0
- */
-jasmine.Env.prototype.nextSuiteId = function () {
- return this.nextSuiteId_++;
-};
-
-/**
- * Register a reporter to receive status updates from Jasmine.
- * @param {jasmine.Reporter} reporter An object which will receive status updates.
- */
-jasmine.Env.prototype.addReporter = function(reporter) {
- this.reporter.addReporter(reporter);
-};
-
-jasmine.Env.prototype.execute = function() {
- this.currentRunner_.execute();
-};
-
-jasmine.Env.prototype.describe = function(description, specDefinitions) {
- var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite);
-
- var parentSuite = this.currentSuite;
- if (parentSuite) {
- parentSuite.add(suite);
- } else {
- this.currentRunner_.add(suite);
- }
-
- this.currentSuite = suite;
-
- var declarationError = null;
- try {
- specDefinitions.call(suite);
- } catch(e) {
- declarationError = e;
- }
-
- this.currentSuite = parentSuite;
-
- if (declarationError) {
- this.it("encountered a declaration exception", function() {
- throw declarationError;
- });
- }
-
- return suite;
-};
-
-jasmine.Env.prototype.beforeEach = function(beforeEachFunction) {
- if (this.currentSuite) {
- this.currentSuite.beforeEach(beforeEachFunction);
- } else {
- this.currentRunner_.beforeEach(beforeEachFunction);
- }
-};
-
-jasmine.Env.prototype.currentRunner = function () {
- return this.currentRunner_;
-};
-
-jasmine.Env.prototype.afterEach = function(afterEachFunction) {
- if (this.currentSuite) {
- this.currentSuite.afterEach(afterEachFunction);
- } else {
- this.currentRunner_.afterEach(afterEachFunction);
- }
-
-};
-
-jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) {
- return {
- execute: function() {
- }
- };
-};
-
-jasmine.Env.prototype.it = function(description, func) {
- var spec = new jasmine.Spec(this, this.currentSuite, description);
- this.currentSuite.add(spec);
- this.currentSpec = spec;
-
- if (func) {
- spec.runs(func);
- }
-
- return spec;
-};
-
-jasmine.Env.prototype.xit = function(desc, func) {
- return {
- id: this.nextSpecId(),
- runs: function() {
- }
- };
-};
-
-jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) {
- if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) {
- return true;
- }
-
- a.__Jasmine_been_here_before__ = b;
- b.__Jasmine_been_here_before__ = a;
-
- var hasKey = function(obj, keyName) {
- return obj != null && obj[keyName] !== jasmine.undefined;
- };
-
- for (var property in b) {
- if (!hasKey(a, property) && hasKey(b, property)) {
- mismatchKeys.push("expected has key '" + property + "', but missing from actual.");
- }
- }
- for (property in a) {
- if (!hasKey(b, property) && hasKey(a, property)) {
- mismatchKeys.push("expected missing key '" + property + "', but present in actual.");
- }
- }
- for (property in b) {
- if (property == '__Jasmine_been_here_before__') continue;
- if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) {
- mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual.");
- }
- }
-
- if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) {
- mismatchValues.push("arrays were not the same length");
- }
-
- delete a.__Jasmine_been_here_before__;
- delete b.__Jasmine_been_here_before__;
- return (mismatchKeys.length == 0 && mismatchValues.length == 0);
-};
-
-jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) {
- mismatchKeys = mismatchKeys || [];
- mismatchValues = mismatchValues || [];
-
- for (var i = 0; i < this.equalityTesters_.length; i++) {
- var equalityTester = this.equalityTesters_[i];
- var result = equalityTester(a, b, this, mismatchKeys, mismatchValues);
- if (result !== jasmine.undefined) return result;
- }
-
- if (a === b) return true;
-
- if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) {
- return (a == jasmine.undefined && b == jasmine.undefined);
- }
-
- if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) {
- return a === b;
- }
-
- if (a instanceof Date && b instanceof Date) {
- return a.getTime() == b.getTime();
- }
-
- if (a instanceof jasmine.Matchers.Any) {
- return a.matches(b);
- }
-
- if (b instanceof jasmine.Matchers.Any) {
- return b.matches(a);
- }
-
- if (jasmine.isString_(a) && jasmine.isString_(b)) {
- return (a == b);
- }
-
- if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) {
- return (a == b);
- }
-
- if (typeof a === "object" && typeof b === "object") {
- return this.compareObjects_(a, b, mismatchKeys, mismatchValues);
- }
-
- //Straight check
- return (a === b);
-};
-
-jasmine.Env.prototype.contains_ = function(haystack, needle) {
- if (jasmine.isArray_(haystack)) {
- for (var i = 0; i < haystack.length; i++) {
- if (this.equals_(haystack[i], needle)) return true;
- }
- return false;
- }
- return haystack.indexOf(needle) >= 0;
-};
-
-jasmine.Env.prototype.addEqualityTester = function(equalityTester) {
- this.equalityTesters_.push(equalityTester);
-};
-/** No-op base class for Jasmine reporters.
- *
- * @constructor
- */
-jasmine.Reporter = function() {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportRunnerStarting = function(runner) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportRunnerResults = function(runner) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportSuiteResults = function(suite) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportSpecStarting = function(spec) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportSpecResults = function(spec) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.log = function(str) {
-};
-
-/**
- * Blocks are functions with executable code that make up a spec.
- *
- * @constructor
- * @param {jasmine.Env} env
- * @param {Function} func
- * @param {jasmine.Spec} spec
- */
-jasmine.Block = function(env, func, spec) {
- this.env = env;
- this.func = func;
- this.spec = spec;
-};
-
-jasmine.Block.prototype.execute = function(onComplete) {
- try {
- this.func.apply(this.spec);
- } catch (e) {
- this.spec.fail(e);
- }
- onComplete();
-};
-/** JavaScript API reporter.
- *
- * @constructor
- */
-jasmine.JsApiReporter = function() {
- this.started = false;
- this.finished = false;
- this.suites_ = [];
- this.results_ = {};
-};
-
-jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) {
- this.started = true;
- var suites = runner.topLevelSuites();
- for (var i = 0; i < suites.length; i++) {
- var suite = suites[i];
- this.suites_.push(this.summarize_(suite));
- }
-};
-
-jasmine.JsApiReporter.prototype.suites = function() {
- return this.suites_;
-};
-
-jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) {
- var isSuite = suiteOrSpec instanceof jasmine.Suite;
- var summary = {
- id: suiteOrSpec.id,
- name: suiteOrSpec.description,
- type: isSuite ? 'suite' : 'spec',
- children: []
- };
-
- if (isSuite) {
- var children = suiteOrSpec.children();
- for (var i = 0; i < children.length; i++) {
- summary.children.push(this.summarize_(children[i]));
- }
- }
- return summary;
-};
-
-jasmine.JsApiReporter.prototype.results = function() {
- return this.results_;
-};
-
-jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) {
- return this.results_[specId];
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) {
- this.finished = true;
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) {
- this.results_[spec.id] = {
- messages: spec.results().getItems(),
- result: spec.results().failedCount > 0 ? "failed" : "passed"
- };
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.log = function(str) {
-};
-
-jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){
- var results = {};
- for (var i = 0; i < specIds.length; i++) {
- var specId = specIds[i];
- results[specId] = this.summarizeResult_(this.results_[specId]);
- }
- return results;
-};
-
-jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){
- var summaryMessages = [];
- var messagesLength = result.messages.length;
- for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) {
- var resultMessage = result.messages[messageIndex];
- summaryMessages.push({
- text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined,
- passed: resultMessage.passed ? resultMessage.passed() : true,
- type: resultMessage.type,
- message: resultMessage.message,
- trace: {
- stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined
- }
- });
- }
-
- return {
- result : result.result,
- messages : summaryMessages
- };
-};
-
-/**
- * @constructor
- * @param {jasmine.Env} env
- * @param actual
- * @param {jasmine.Spec} spec
- */
-jasmine.Matchers = function(env, actual, spec, opt_isNot) {
- this.env = env;
- this.actual = actual;
- this.spec = spec;
- this.isNot = opt_isNot || false;
- this.reportWasCalled_ = false;
-};
-
-// todo: @deprecated as of Jasmine 0.11, remove soon [xw]
-jasmine.Matchers.pp = function(str) {
- throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!");
-};
-
-// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw]
-jasmine.Matchers.prototype.report = function(result, failing_message, details) {
- throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs");
-};
-
-jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) {
- for (var methodName in prototype) {
- if (methodName == 'report') continue;
- var orig = prototype[methodName];
- matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig);
- }
-};
-
-jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) {
- return function() {
- var matcherArgs = jasmine.util.argsToArray(arguments);
- var result = matcherFunction.apply(this, arguments);
-
- if (this.isNot) {
- result = !result;
- }
-
- if (this.reportWasCalled_) return result;
-
- var message;
- if (!result) {
- if (this.message) {
- message = this.message.apply(this, arguments);
- if (jasmine.isArray_(message)) {
- message = message[this.isNot ? 1 : 0];
- }
- } else {
- var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); });
- message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate;
- if (matcherArgs.length > 0) {
- for (var i = 0; i < matcherArgs.length; i++) {
- if (i > 0) message += ",";
- message += " " + jasmine.pp(matcherArgs[i]);
- }
- }
- message += ".";
- }
- }
- var expectationResult = new jasmine.ExpectationResult({
- matcherName: matcherName,
- passed: result,
- expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0],
- actual: this.actual,
- message: message
- });
- this.spec.addMatcherResult(expectationResult);
- return jasmine.undefined;
- };
-};
-
-
-
-
-/**
- * toBe: compares the actual to the expected using ===
- * @param expected
- */
-jasmine.Matchers.prototype.toBe = function(expected) {
- return this.actual === expected;
-};
-
-/**
- * toNotBe: compares the actual to the expected using !==
- * @param expected
- * @deprecated as of 1.0. Use not.toBe() instead.
- */
-jasmine.Matchers.prototype.toNotBe = function(expected) {
- return this.actual !== expected;
-};
-
-/**
- * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc.
- *
- * @param expected
- */
-jasmine.Matchers.prototype.toEqual = function(expected) {
- return this.env.equals_(this.actual, expected);
-};
-
-/**
- * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual
- * @param expected
- * @deprecated as of 1.0. Use not.toNotEqual() instead.
- */
-jasmine.Matchers.prototype.toNotEqual = function(expected) {
- return !this.env.equals_(this.actual, expected);
-};
-
-/**
- * Matcher that compares the actual to the expected using a regular expression. Constructs a RegExp, so takes
- * a pattern or a String.
- *
- * @param expected
- */
-jasmine.Matchers.prototype.toMatch = function(expected) {
- return new RegExp(expected).test(this.actual);
-};
-
-/**
- * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch
- * @param expected
- * @deprecated as of 1.0. Use not.toMatch() instead.
- */
-jasmine.Matchers.prototype.toNotMatch = function(expected) {
- return !(new RegExp(expected).test(this.actual));
-};
-
-/**
- * Matcher that compares the actual to jasmine.undefined.
- */
-jasmine.Matchers.prototype.toBeDefined = function() {
- return (this.actual !== jasmine.undefined);
-};
-
-/**
- * Matcher that compares the actual to jasmine.undefined.
- */
-jasmine.Matchers.prototype.toBeUndefined = function() {
- return (this.actual === jasmine.undefined);
-};
-
-/**
- * Matcher that compares the actual to null.
- */
-jasmine.Matchers.prototype.toBeNull = function() {
- return (this.actual === null);
-};
-
-/**
- * Matcher that boolean not-nots the actual.
- */
-jasmine.Matchers.prototype.toBeTruthy = function() {
- return !!this.actual;
-};
-
-
-/**
- * Matcher that boolean nots the actual.
- */
-jasmine.Matchers.prototype.toBeFalsy = function() {
- return !this.actual;
-};
-
-
-/**
- * Matcher that checks to see if the actual, a Jasmine spy, was called.
- */
-jasmine.Matchers.prototype.toHaveBeenCalled = function() {
- if (arguments.length > 0) {
- throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith');
- }
-
- if (!jasmine.isSpy(this.actual)) {
- throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
- }
-
- this.message = function() {
- return [
- "Expected spy " + this.actual.identity + " to have been called.",
- "Expected spy " + this.actual.identity + " not to have been called."
- ];
- };
-
- return this.actual.wasCalled;
-};
-
-/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */
-jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled;
-
-/**
- * Matcher that checks to see if the actual, a Jasmine spy, was not called.
- *
- * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead
- */
-jasmine.Matchers.prototype.wasNotCalled = function() {
- if (arguments.length > 0) {
- throw new Error('wasNotCalled does not take arguments');
- }
-
- if (!jasmine.isSpy(this.actual)) {
- throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
- }
-
- this.message = function() {
- return [
- "Expected spy " + this.actual.identity + " to not have been called.",
- "Expected spy " + this.actual.identity + " to have been called."
- ];
- };
-
- return !this.actual.wasCalled;
-};
-
-/**
- * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters.
- *
- * @example
- *
- */
-jasmine.Matchers.prototype.toHaveBeenCalledWith = function() {
- var expectedArgs = jasmine.util.argsToArray(arguments);
- if (!jasmine.isSpy(this.actual)) {
- throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
- }
- this.message = function() {
- if (this.actual.callCount == 0) {
- // todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw]
- return [
- "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.",
- "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was."
- ];
- } else {
- return [
- "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall),
- "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall)
- ];
- }
- };
-
- return this.env.contains_(this.actual.argsForCall, expectedArgs);
-};
-
-/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */
-jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith;
-
-/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */
-jasmine.Matchers.prototype.wasNotCalledWith = function() {
- var expectedArgs = jasmine.util.argsToArray(arguments);
- if (!jasmine.isSpy(this.actual)) {
- throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
- }
-
- this.message = function() {
- return [
- "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was",
- "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was"
- ]
- };
-
- return !this.env.contains_(this.actual.argsForCall, expectedArgs);
-};
-
-/**
- * Matcher that checks that the expected item is an element in the actual Array.
- *
- * @param {Object} expected
- */
-jasmine.Matchers.prototype.toContain = function(expected) {
- return this.env.contains_(this.actual, expected);
-};
-
-/**
- * Matcher that checks that the expected item is NOT an element in the actual Array.
- *
- * @param {Object} expected
- * @deprecated as of 1.0. Use not.toNotContain() instead.
- */
-jasmine.Matchers.prototype.toNotContain = function(expected) {
- return !this.env.contains_(this.actual, expected);
-};
-
-jasmine.Matchers.prototype.toBeLessThan = function(expected) {
- return this.actual < expected;
-};
-
-jasmine.Matchers.prototype.toBeGreaterThan = function(expected) {
- return this.actual > expected;
-};
-
-/**
- * Matcher that checks that the expected exception was thrown by the actual.
- *
- * @param {String} expected
- */
-jasmine.Matchers.prototype.toThrow = function(expected) {
- var result = false;
- var exception;
- if (typeof this.actual != 'function') {
- throw new Error('Actual is not a function');
- }
- try {
- this.actual();
- } catch (e) {
- exception = e;
- }
- if (exception) {
- result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected));
- }
-
- var not = this.isNot ? "not " : "";
-
- this.message = function() {
- if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {
- return ["Expected function " + not + "to throw", expected ? expected.message || expected : " an exception", ", but it threw", exception.message || exception].join(' ');
- } else {
- return "Expected function to throw an exception.";
- }
- };
-
- return result;
-};
-
-jasmine.Matchers.Any = function(expectedClass) {
- this.expectedClass = expectedClass;
-};
-
-jasmine.Matchers.Any.prototype.matches = function(other) {
- if (this.expectedClass == String) {
- return typeof other == 'string' || other instanceof String;
- }
-
- if (this.expectedClass == Number) {
- return typeof other == 'number' || other instanceof Number;
- }
-
- if (this.expectedClass == Function) {
- return typeof other == 'function' || other instanceof Function;
- }
-
- if (this.expectedClass == Object) {
- return typeof other == 'object';
- }
-
- return other instanceof this.expectedClass;
-};
-
-jasmine.Matchers.Any.prototype.toString = function() {
- return '<jasmine.any(' + this.expectedClass + ')>';
-};
-
-/**
- * @constructor
- */
-jasmine.MultiReporter = function() {
- this.subReporters_ = [];
-};
-jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter);
-
-jasmine.MultiReporter.prototype.addReporter = function(reporter) {
- this.subReporters_.push(reporter);
-};
-
-(function() {
- var functionNames = [
- "reportRunnerStarting",
- "reportRunnerResults",
- "reportSuiteResults",
- "reportSpecStarting",
- "reportSpecResults",
- "log"
- ];
- for (var i = 0; i < functionNames.length; i++) {
- var functionName = functionNames[i];
- jasmine.MultiReporter.prototype[functionName] = (function(functionName) {
- return function() {
- for (var j = 0; j < this.subReporters_.length; j++) {
- var subReporter = this.subReporters_[j];
- if (subReporter[functionName]) {
- subReporter[functionName].apply(subReporter, arguments);
- }
- }
- };
- })(functionName);
- }
-})();
-/**
- * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults
- *
- * @constructor
- */
-jasmine.NestedResults = function() {
- /**
- * The total count of results
- */
- this.totalCount = 0;
- /**
- * Number of passed results
- */
- this.passedCount = 0;
- /**
- * Number of failed results
- */
- this.failedCount = 0;
- /**
- * Was this suite/spec skipped?
- */
- this.skipped = false;
- /**
- * @ignore
- */
- this.items_ = [];
-};
-
-/**
- * Roll up the result counts.
- *
- * @param result
- */
-jasmine.NestedResults.prototype.rollupCounts = function(result) {
- this.totalCount += result.totalCount;
- this.passedCount += result.passedCount;
- this.failedCount += result.failedCount;
-};
-
-/**
- * Adds a log message.
- * @param values Array of message parts which will be concatenated later.
- */
-jasmine.NestedResults.prototype.log = function(values) {
- this.items_.push(new jasmine.MessageResult(values));
-};
-
-/**
- * Getter for the results: message & results.
- */
-jasmine.NestedResults.prototype.getItems = function() {
- return this.items_;
-};
-
-/**
- * Adds a result, tracking counts (total, passed, & failed)
- * @param {jasmine.ExpectationResult|jasmine.NestedResults} result
- */
-jasmine.NestedResults.prototype.addResult = function(result) {
- if (result.type != 'log') {
- if (result.items_) {
- this.rollupCounts(result);
- } else {
- this.totalCount++;
- if (result.passed()) {
- this.passedCount++;
- } else {
- this.failedCount++;
- }
- }
- }
- this.items_.push(result);
-};
-
-/**
- * @returns {Boolean} True if <b>everything</b> below passed
- */
-jasmine.NestedResults.prototype.passed = function() {
- return this.passedCount === this.totalCount;
-};
-/**
- * Base class for pretty printing for expectation results.
- */
-jasmine.PrettyPrinter = function() {
- this.ppNestLevel_ = 0;
-};
-
-/**
- * Formats a value in a nice, human-readable string.
- *
- * @param value
- */
-jasmine.PrettyPrinter.prototype.format = function(value) {
- if (this.ppNestLevel_ > 40) {
- throw new Error('jasmine.PrettyPrinter: format() nested too deeply!');
- }
-
- this.ppNestLevel_++;
- try {
- if (value === jasmine.undefined) {
- this.emitScalar('undefined');
- } else if (value === null) {
- this.emitScalar('null');
- } else if (value === jasmine.getGlobal()) {
- this.emitScalar('<global>');
- } else if (value instanceof jasmine.Matchers.Any) {
- this.emitScalar(value.toString());
- } else if (typeof value === 'string') {
- this.emitString(value);
- } else if (jasmine.isSpy(value)) {
- this.emitScalar("spy on " + value.identity);
- } else if (value instanceof RegExp) {
- this.emitScalar(value.toString());
- } else if (typeof value === 'function') {
- this.emitScalar('Function');
- } else if (typeof value.nodeType === 'number') {
- this.emitScalar('HTMLNode');
- } else if (value instanceof Date) {
- this.emitScalar('Date(' + value + ')');
- } else if (value.__Jasmine_been_here_before__) {
- this.emitScalar('<circular reference: ' + (jasmine.isArray_(value) ? 'Array' : 'Object') + '>');
- } else if (jasmine.isArray_(value) || typeof value == 'object') {
- value.__Jasmine_been_here_before__ = true;
- if (jasmine.isArray_(value)) {
- this.emitArray(value);
- } else {
- this.emitObject(value);
- }
- delete value.__Jasmine_been_here_before__;
- } else {
- this.emitScalar(value.toString());
- }
- } finally {
- this.ppNestLevel_--;
- }
-};
-
-jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) {
- for (var property in obj) {
- if (property == '__Jasmine_been_here_before__') continue;
- fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) != null) : false);
- }
-};
-
-jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_;
-jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_;
-jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_;
-jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_;
-
-jasmine.StringPrettyPrinter = function() {
- jasmine.PrettyPrinter.call(this);
-
- this.string = '';
-};
-jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter);
-
-jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) {
- this.append(value);
-};
-
-jasmine.StringPrettyPrinter.prototype.emitString = function(value) {
- this.append("'" + value + "'");
-};
-
-jasmine.StringPrettyPrinter.prototype.emitArray = function(array) {
- this.append('[ ');
- for (var i = 0; i < array.length; i++) {
- if (i > 0) {
- this.append(', ');
- }
- this.format(array[i]);
- }
- this.append(' ]');
-};
-
-jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) {
- var self = this;
- this.append('{ ');
- var first = true;
-
- this.iterateObject(obj, function(property, isGetter) {
- if (first) {
- first = false;
- } else {
- self.append(', ');
- }
-
- self.append(property);
- self.append(' : ');
- if (isGetter) {
- self.append('<getter>');
- } else {
- self.format(obj[property]);
- }
- });
-
- this.append(' }');
-};
-
-jasmine.StringPrettyPrinter.prototype.append = function(value) {
- this.string += value;
-};
-jasmine.Queue = function(env) {
- this.env = env;
- this.blocks = [];
- this.running = false;
- this.index = 0;
- this.offset = 0;
- this.abort = false;
-};
-
-jasmine.Queue.prototype.addBefore = function(block) {
- this.blocks.unshift(block);
-};
-
-jasmine.Queue.prototype.add = function(block) {
- this.blocks.push(block);
-};
-
-jasmine.Queue.prototype.insertNext = function(block) {
- this.blocks.splice((this.index + this.offset + 1), 0, block);
- this.offset++;
-};
-
-jasmine.Queue.prototype.start = function(onComplete) {
- this.running = true;
- this.onComplete = onComplete;
- this.next_();
-};
-
-jasmine.Queue.prototype.isRunning = function() {
- return this.running;
-};
-
-jasmine.Queue.LOOP_DONT_RECURSE = true;
-
-jasmine.Queue.prototype.next_ = function() {
- var self = this;
- var goAgain = true;
-
- while (goAgain) {
- goAgain = false;
-
- if (self.index < self.blocks.length && !this.abort) {
- var calledSynchronously = true;
- var completedSynchronously = false;
-
- var onComplete = function () {
- if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) {
- completedSynchronously = true;
- return;
- }
-
- if (self.blocks[self.index].abort) {
- self.abort = true;
- }
-
- self.offset = 0;
- self.index++;
-
- var now = new Date().getTime();
- if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) {
- self.env.lastUpdate = now;
- self.env.setTimeout(function() {
- self.next_();
- }, 0);
- } else {
- if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) {
- goAgain = true;
- } else {
- self.next_();
- }
- }
- };
- self.blocks[self.index].execute(onComplete);
-
- calledSynchronously = false;
- if (completedSynchronously) {
- onComplete();
- }
-
- } else {
- self.running = false;
- if (self.onComplete) {
- self.onComplete();
- }
- }
- }
-};
-
-jasmine.Queue.prototype.results = function() {
- var results = new jasmine.NestedResults();
- for (var i = 0; i < this.blocks.length; i++) {
- if (this.blocks[i].results) {
- results.addResult(this.blocks[i].results());
- }
- }
- return results;
-};
-
-
-/**
- * Runner
- *
- * @constructor
- * @param {jasmine.Env} env
- */
-jasmine.Runner = function(env) {
- var self = this;
- self.env = env;
- self.queue = new jasmine.Queue(env);
- self.before_ = [];
- self.after_ = [];
- self.suites_ = [];
-};
-
-jasmine.Runner.prototype.execute = function() {
- var self = this;
- if (self.env.reporter.reportRunnerStarting) {
- self.env.reporter.reportRunnerStarting(this);
- }
- self.queue.start(function () {
- self.finishCallback();
- });
-};
-
-jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) {
- beforeEachFunction.typeName = 'beforeEach';
- this.before_.splice(0,0,beforeEachFunction);
-};
-
-jasmine.Runner.prototype.afterEach = function(afterEachFunction) {
- afterEachFunction.typeName = 'afterEach';
- this.after_.splice(0,0,afterEachFunction);
-};
-
-
-jasmine.Runner.prototype.finishCallback = function() {
- this.env.reporter.reportRunnerResults(this);
-};
-
-jasmine.Runner.prototype.addSuite = function(suite) {
- this.suites_.push(suite);
-};
-
-jasmine.Runner.prototype.add = function(block) {
- if (block instanceof jasmine.Suite) {
- this.addSuite(block);
- }
- this.queue.add(block);
-};
-
-jasmine.Runner.prototype.specs = function () {
- var suites = this.suites();
- var specs = [];
- for (var i = 0; i < suites.length; i++) {
- specs = specs.concat(suites[i].specs());
- }
- return specs;
-};
-
-jasmine.Runner.prototype.suites = function() {
- return this.suites_;
-};
-
-jasmine.Runner.prototype.topLevelSuites = function() {
- var topLevelSuites = [];
- for (var i = 0; i < this.suites_.length; i++) {
- if (!this.suites_[i].parentSuite) {
- topLevelSuites.push(this.suites_[i]);
- }
- }
- return topLevelSuites;
-};
-
-jasmine.Runner.prototype.results = function() {
- return this.queue.results();
-};
-/**
- * Internal representation of a Jasmine specification, or test.
- *
- * @constructor
- * @param {jasmine.Env} env
- * @param {jasmine.Suite} suite
- * @param {String} description
- */
-jasmine.Spec = function(env, suite, description) {
- if (!env) {
- throw new Error('jasmine.Env() required');
- }
- if (!suite) {
- throw new Error('jasmine.Suite() required');
- }
- var spec = this;
- spec.id = env.nextSpecId ? env.nextSpecId() : null;
- spec.env = env;
- spec.suite = suite;
- spec.description = description;
- spec.queue = new jasmine.Queue(env);
-
- spec.afterCallbacks = [];
- spec.spies_ = [];
-
- spec.results_ = new jasmine.NestedResults();
- spec.results_.description = description;
- spec.matchersClass = null;
-};
-
-jasmine.Spec.prototype.getFullName = function() {
- return this.suite.getFullName() + ' ' + this.description + '.';
-};
-
-
-jasmine.Spec.prototype.results = function() {
- return this.results_;
-};
-
-/**
- * All parameters are pretty-printed and concatenated together, then written to the spec's output.
- *
- * Be careful not to leave calls to <code>jasmine.log</code> in production code.
- */
-jasmine.Spec.prototype.log = function() {
- return this.results_.log(arguments);
-};
-
-jasmine.Spec.prototype.runs = function (func) {
- var block = new jasmine.Block(this.env, func, this);
- this.addToQueue(block);
- return this;
-};
-
-jasmine.Spec.prototype.addToQueue = function (block) {
- if (this.queue.isRunning()) {
- this.queue.insertNext(block);
- } else {
- this.queue.add(block);
- }
-};
-
-/**
- * @param {jasmine.ExpectationResult} result
- */
-jasmine.Spec.prototype.addMatcherResult = function(result) {
- this.results_.addResult(result);
-};
-
-jasmine.Spec.prototype.expect = function(actual) {
- var positive = new (this.getMatchersClass_())(this.env, actual, this);
- positive.not = new (this.getMatchersClass_())(this.env, actual, this, true);
- return positive;
-};
-
-/**
- * Waits a fixed time period before moving to the next block.
- *
- * @deprecated Use waitsFor() instead
- * @param {Number} timeout milliseconds to wait
- */
-jasmine.Spec.prototype.waits = function(timeout) {
- var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this);
- this.addToQueue(waitsFunc);
- return this;
-};
-
-/**
- * Waits for the latchFunction to return true before proceeding to the next block.
- *
- * @param {Function} latchFunction
- * @param {String} optional_timeoutMessage
- * @param {Number} optional_timeout
- */
-jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
- var latchFunction_ = null;
- var optional_timeoutMessage_ = null;
- var optional_timeout_ = null;
-
- for (var i = 0; i < arguments.length; i++) {
- var arg = arguments[i];
- switch (typeof arg) {
- case 'function':
- latchFunction_ = arg;
- break;
- case 'string':
- optional_timeoutMessage_ = arg;
- break;
- case 'number':
- optional_timeout_ = arg;
- break;
- }
- }
-
- var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this);
- this.addToQueue(waitsForFunc);
- return this;
-};
-
-jasmine.Spec.prototype.fail = function (e) {
- var expectationResult = new jasmine.ExpectationResult({
- passed: false,
- message: e ? jasmine.util.formatException(e) : 'Exception'
- });
- this.results_.addResult(expectationResult);
-};
-
-jasmine.Spec.prototype.getMatchersClass_ = function() {
- return this.matchersClass || this.env.matchersClass;
-};
-
-jasmine.Spec.prototype.addMatchers = function(matchersPrototype) {
- var parent = this.getMatchersClass_();
- var newMatchersClass = function() {
- parent.apply(this, arguments);
- };
- jasmine.util.inherit(newMatchersClass, parent);
- jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass);
- this.matchersClass = newMatchersClass;
-};
-
-jasmine.Spec.prototype.finishCallback = function() {
- this.env.reporter.reportSpecResults(this);
-};
-
-jasmine.Spec.prototype.finish = function(onComplete) {
- this.removeAllSpies();
- this.finishCallback();
- if (onComplete) {
- onComplete();
- }
-};
-
-jasmine.Spec.prototype.after = function(doAfter) {
- if (this.queue.isRunning()) {
- this.queue.add(new jasmine.Block(this.env, doAfter, this));
- } else {
- this.afterCallbacks.unshift(doAfter);
- }
-};
-
-jasmine.Spec.prototype.execute = function(onComplete) {
- var spec = this;
- if (!spec.env.specFilter(spec)) {
- spec.results_.skipped = true;
- spec.finish(onComplete);
- return;
- }
-
- this.env.reporter.reportSpecStarting(this);
-
- spec.env.currentSpec = spec;
-
- spec.addBeforesAndAftersToQueue();
-
- spec.queue.start(function () {
- spec.finish(onComplete);
- });
-};
-
-jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() {
- var runner = this.env.currentRunner();
- var i;
-
- for (var suite = this.suite; suite; suite = suite.parentSuite) {
- for (i = 0; i < suite.before_.length; i++) {
- this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this));
- }
- }
- for (i = 0; i < runner.before_.length; i++) {
- this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this));
- }
- for (i = 0; i < this.afterCallbacks.length; i++) {
- this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this));
- }
- for (suite = this.suite; suite; suite = suite.parentSuite) {
- for (i = 0; i < suite.after_.length; i++) {
- this.queue.add(new jasmine.Block(this.env, suite.after_[i], this));
- }
- }
- for (i = 0; i < runner.after_.length; i++) {
- this.queue.add(new jasmine.Block(this.env, runner.after_[i], this));
- }
-};
-
-jasmine.Spec.prototype.explodes = function() {
- throw 'explodes function should not have been called';
-};
-
-jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) {
- if (obj == jasmine.undefined) {
- throw "spyOn could not find an object to spy upon for " + methodName + "()";
- }
-
- if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) {
- throw methodName + '() method does not exist';
- }
-
- if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) {
- throw new Error(methodName + ' has already been spied upon');
- }
-
- var spyObj = jasmine.createSpy(methodName);
-
- this.spies_.push(spyObj);
- spyObj.baseObj = obj;
- spyObj.methodName = methodName;
- spyObj.originalValue = obj[methodName];
-
- obj[methodName] = spyObj;
-
- return spyObj;
-};
-
-jasmine.Spec.prototype.removeAllSpies = function() {
- for (var i = 0; i < this.spies_.length; i++) {
- var spy = this.spies_[i];
- spy.baseObj[spy.methodName] = spy.originalValue;
- }
- this.spies_ = [];
-};
-
-/**
- * Internal representation of a Jasmine suite.
- *
- * @constructor
- * @param {jasmine.Env} env
- * @param {String} description
- * @param {Function} specDefinitions
- * @param {jasmine.Suite} parentSuite
- */
-jasmine.Suite = function(env, description, specDefinitions, parentSuite) {
- var self = this;
- self.id = env.nextSuiteId ? env.nextSuiteId() : null;
- self.description = description;
- self.queue = new jasmine.Queue(env);
- self.parentSuite = parentSuite;
- self.env = env;
- self.before_ = [];
- self.after_ = [];
- self.children_ = [];
- self.suites_ = [];
- self.specs_ = [];
-};
-
-jasmine.Suite.prototype.getFullName = function() {
- var fullName = this.description;
- for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) {
- fullName = parentSuite.description + ' ' + fullName;
- }
- return fullName;
-};
-
-jasmine.Suite.prototype.finish = function(onComplete) {
- this.env.reporter.reportSuiteResults(this);
- this.finished = true;
- if (typeof(onComplete) == 'function') {
- onComplete();
- }
-};
-
-jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) {
- beforeEachFunction.typeName = 'beforeEach';
- this.before_.unshift(beforeEachFunction);
-};
-
-jasmine.Suite.prototype.afterEach = function(afterEachFunction) {
- afterEachFunction.typeName = 'afterEach';
- this.after_.unshift(afterEachFunction);
-};
-
-jasmine.Suite.prototype.results = function() {
- return this.queue.results();
-};
-
-jasmine.Suite.prototype.add = function(suiteOrSpec) {
- this.children_.push(suiteOrSpec);
- if (suiteOrSpec instanceof jasmine.Suite) {
- this.suites_.push(suiteOrSpec);
- this.env.currentRunner().addSuite(suiteOrSpec);
- } else {
- this.specs_.push(suiteOrSpec);
- }
- this.queue.add(suiteOrSpec);
-};
-
-jasmine.Suite.prototype.specs = function() {
- return this.specs_;
-};
-
-jasmine.Suite.prototype.suites = function() {
- return this.suites_;
-};
-
-jasmine.Suite.prototype.children = function() {
- return this.children_;
-};
-
-jasmine.Suite.prototype.execute = function(onComplete) {
- var self = this;
- this.queue.start(function () {
- self.finish(onComplete);
- });
-};
-jasmine.WaitsBlock = function(env, timeout, spec) {
- this.timeout = timeout;
- jasmine.Block.call(this, env, null, spec);
-};
-
-jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block);
-
-jasmine.WaitsBlock.prototype.execute = function (onComplete) {
- this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...');
- this.env.setTimeout(function () {
- onComplete();
- }, this.timeout);
-};
-/**
- * A block which waits for some condition to become true, with timeout.
- *
- * @constructor
- * @extends jasmine.Block
- * @param {jasmine.Env} env The Jasmine environment.
- * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true.
- * @param {Function} latchFunction A function which returns true when the desired condition has been met.
- * @param {String} message The message to display if the desired condition hasn't been met within the given time period.
- * @param {jasmine.Spec} spec The Jasmine spec.
- */
-jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) {
- this.timeout = timeout || env.defaultTimeoutInterval;
- this.latchFunction = latchFunction;
- this.message = message;
- this.totalTimeSpentWaitingForLatch = 0;
- jasmine.Block.call(this, env, null, spec);
-};
-jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block);
-
-jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10;
-
-jasmine.WaitsForBlock.prototype.execute = function(onComplete) {
- this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen'));
- var latchFunctionResult;
- try {
- latchFunctionResult = this.latchFunction.apply(this.spec);
- } catch (e) {
- this.spec.fail(e);
- onComplete();
- return;
- }
-
- if (latchFunctionResult) {
- onComplete();
- } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) {
- var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen');
- this.spec.fail({
- name: 'timeout',
- message: message
- });
-
- this.abort = true;
- onComplete();
- } else {
- this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT;
- var self = this;
- this.env.setTimeout(function() {
- self.execute(onComplete);
- }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT);
- }
-};
-// Mock setTimeout, clearTimeout
-// Contributed by Pivotal Computer Systems, www.pivotalsf.com
-
-jasmine.FakeTimer = function() {
- this.reset();
-
- var self = this;
- self.setTimeout = function(funcToCall, millis) {
- self.timeoutsMade++;
- self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false);
- return self.timeoutsMade;
- };
-
- self.setInterval = function(funcToCall, millis) {
- self.timeoutsMade++;
- self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true);
- return self.timeoutsMade;
- };
-
- self.clearTimeout = function(timeoutKey) {
- self.scheduledFunctions[timeoutKey] = jasmine.undefined;
- };
-
- self.clearInterval = function(timeoutKey) {
- self.scheduledFunctions[timeoutKey] = jasmine.undefined;
- };
-
-};
-
-jasmine.FakeTimer.prototype.reset = function() {
- this.timeoutsMade = 0;
- this.scheduledFunctions = {};
- this.nowMillis = 0;
-};
-
-jasmine.FakeTimer.prototype.tick = function(millis) {
- var oldMillis = this.nowMillis;
- var newMillis = oldMillis + millis;
- this.runFunctionsWithinRange(oldMillis, newMillis);
- this.nowMillis = newMillis;
-};
-
-jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) {
- var scheduledFunc;
- var funcsToRun = [];
- for (var timeoutKey in this.scheduledFunctions) {
- scheduledFunc = this.scheduledFunctions[timeoutKey];
- if (scheduledFunc != jasmine.undefined &&
- scheduledFunc.runAtMillis >= oldMillis &&
- scheduledFunc.runAtMillis <= nowMillis) {
- funcsToRun.push(scheduledFunc);
- this.scheduledFunctions[timeoutKey] = jasmine.undefined;
- }
- }
-
- if (funcsToRun.length > 0) {
- funcsToRun.sort(function(a, b) {
- return a.runAtMillis - b.runAtMillis;
- });
- for (var i = 0; i < funcsToRun.length; ++i) {
- try {
- var funcToRun = funcsToRun[i];
- this.nowMillis = funcToRun.runAtMillis;
- funcToRun.funcToCall();
- if (funcToRun.recurring) {
- this.scheduleFunction(funcToRun.timeoutKey,
- funcToRun.funcToCall,
- funcToRun.millis,
- true);
- }
- } catch(e) {
- }
- }
- this.runFunctionsWithinRange(oldMillis, nowMillis);
- }
-};
-
-jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) {
- this.scheduledFunctions[timeoutKey] = {
- runAtMillis: this.nowMillis + millis,
- funcToCall: funcToCall,
- recurring: recurring,
- timeoutKey: timeoutKey,
- millis: millis
- };
-};
-
-/**
- * @namespace
- */
-jasmine.Clock = {
- defaultFakeTimer: new jasmine.FakeTimer(),
-
- reset: function() {
- jasmine.Clock.assertInstalled();
- jasmine.Clock.defaultFakeTimer.reset();
- },
-
- tick: function(millis) {
- jasmine.Clock.assertInstalled();
- jasmine.Clock.defaultFakeTimer.tick(millis);
- },
-
- runFunctionsWithinRange: function(oldMillis, nowMillis) {
- jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis);
- },
-
- scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {
- jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring);
- },
-
- useMock: function() {
- if (!jasmine.Clock.isInstalled()) {
- var spec = jasmine.getEnv().currentSpec;
- spec.after(jasmine.Clock.uninstallMock);
-
- jasmine.Clock.installMock();
- }
- },
-
- installMock: function() {
- jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer;
- },
-
- uninstallMock: function() {
- jasmine.Clock.assertInstalled();
- jasmine.Clock.installed = jasmine.Clock.real;
- },
-
- real: {
- setTimeout: jasmine.getGlobal().setTimeout,
- clearTimeout: jasmine.getGlobal().clearTimeout,
- setInterval: jasmine.getGlobal().setInterval,
- clearInterval: jasmine.getGlobal().clearInterval
- },
-
- assertInstalled: function() {
- if (!jasmine.Clock.isInstalled()) {
- throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()");
- }
- },
-
- isInstalled: function() {
- return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer;
- },
-
- installed: null
-};
-jasmine.Clock.installed = jasmine.Clock.real;
-
-//else for IE support
-jasmine.getGlobal().setTimeout = function(funcToCall, millis) {
- if (jasmine.Clock.installed.setTimeout.apply) {
- return jasmine.Clock.installed.setTimeout.apply(this, arguments);
- } else {
- return jasmine.Clock.installed.setTimeout(funcToCall, millis);
- }
-};
-
-jasmine.getGlobal().setInterval = function(funcToCall, millis) {
- if (jasmine.Clock.installed.setInterval.apply) {
- return jasmine.Clock.installed.setInterval.apply(this, arguments);
- } else {
- return jasmine.Clock.installed.setInterval(funcToCall, millis);
- }
-};
-
-jasmine.getGlobal().clearTimeout = function(timeoutKey) {
- if (jasmine.Clock.installed.clearTimeout.apply) {
- return jasmine.Clock.installed.clearTimeout.apply(this, arguments);
- } else {
- return jasmine.Clock.installed.clearTimeout(timeoutKey);
- }
-};
-
-jasmine.getGlobal().clearInterval = function(timeoutKey) {
- if (jasmine.Clock.installed.clearTimeout.apply) {
- return jasmine.Clock.installed.clearInterval.apply(this, arguments);
- } else {
- return jasmine.Clock.installed.clearInterval(timeoutKey);
- }
-};
-
-
-jasmine.version_= {
- "major": 1,
- "minor": 0,
- "build": 1,
- "revision": 1286311016
-};
diff --git a/tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js b/tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js
deleted file mode 100644
index a867f72c..00000000
--- a/tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js
+++ /dev/null
@@ -1,488 +0,0 @@
-// This file stores the results from the PHP parser for certain messages and arguments,
-// so we can test the equivalent Javascript libraries.
-// Last generated with makeLanguageSpec.php at 2011-01-28T02:04:09+00:00
-
-mediaWiki.messages.set( {
- "en_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
- "en_category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
- "fr_undelete_short": "Restaurer $1 modification{{PLURAL:$1||s}}",
- "fr_category-subcat-count": "Cette cat\u00e9gorie comprend {{PLURAL:$2|la sous-cat\u00e9gorie|$2 sous-cat\u00e9gories, dont {{PLURAL:$1|celle|les $1}}}} ci-dessous.",
- "ar_undelete_short": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 {{PLURAL:$1|\u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f|\u062a\u0639\u062f\u064a\u0644\u064a\u0646|$1 \u062a\u0639\u062f\u064a\u0644\u0627\u062a|$1 \u062a\u0639\u062f\u064a\u0644|$1 \u062a\u0639\u062f\u064a\u0644\u0627}}",
- "ar_category-subcat-count": "{{PLURAL:$2|\u0644\u0627 \u062a\u0635\u0627\u0646\u064a\u0641 \u0641\u0631\u0639\u064a\u0629 \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u062a\u0627\u0644\u064a \u0641\u0642\u0637.|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 {{PLURAL:$1||\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a|\u0647\u0630\u064a\u0646 \u0627\u0644\u062a\u0635\u0646\u064a\u0641\u064a\u0646 \u0627\u0644\u0641\u0631\u0639\u064a\u064a\u0646|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0627\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u0629|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0646\u064a\u0641\u0627 \u0641\u0631\u0639\u064a\u0627|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0646\u064a\u0641 \u0641\u0631\u0639\u064a}}\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a $2.}}",
- "jp_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
- "jp_category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
- "zh_undelete_short": "\u6062\u590d\u88ab\u5220\u9664\u7684$1\u9879\u4fee\u8ba2",
- "zh_category-subcat-count": "{{PLURAL:$2|\u672c\u5206\u7c7b\u53ea\u6709\u4e0b\u5217\u4e00\u4e2a\u5b50\u5206\u7c7b\u3002|\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u5217$1\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u6709$2\u4e2a\u5b50\u5206\u7c7b\u3002}}"
-} );
-var jasmineMsgSpec = [
- {
- "name": "en undelete_short 0",
- "key": "en_undelete_short",
- "args": [
- 0
- ],
- "result": "Undelete 0 edits",
- "lang": "en"
- },
- {
- "name": "en undelete_short 1",
- "key": "en_undelete_short",
- "args": [
- 1
- ],
- "result": "Undelete one edit",
- "lang": "en"
- },
- {
- "name": "en undelete_short 2",
- "key": "en_undelete_short",
- "args": [
- 2
- ],
- "result": "Undelete 2 edits",
- "lang": "en"
- },
- {
- "name": "en undelete_short 5",
- "key": "en_undelete_short",
- "args": [
- 5
- ],
- "result": "Undelete 5 edits",
- "lang": "en"
- },
- {
- "name": "en undelete_short 21",
- "key": "en_undelete_short",
- "args": [
- 21
- ],
- "result": "Undelete 21 edits",
- "lang": "en"
- },
- {
- "name": "en undelete_short 101",
- "key": "en_undelete_short",
- "args": [
- 101
- ],
- "result": "Undelete 101 edits",
- "lang": "en"
- },
- {
- "name": "en category-subcat-count 0,10",
- "key": "en_category-subcat-count",
- "args": [
- 0,
- 10
- ],
- "result": "This category has the following 0 subcategories, out of 10 total.",
- "lang": "en"
- },
- {
- "name": "en category-subcat-count 1,1",
- "key": "en_category-subcat-count",
- "args": [
- 1,
- 1
- ],
- "result": "This category has only the following subcategory.",
- "lang": "en"
- },
- {
- "name": "en category-subcat-count 1,2",
- "key": "en_category-subcat-count",
- "args": [
- 1,
- 2
- ],
- "result": "This category has the following subcategory, out of 2 total.",
- "lang": "en"
- },
- {
- "name": "en category-subcat-count 3,30",
- "key": "en_category-subcat-count",
- "args": [
- 3,
- 30
- ],
- "result": "This category has the following 3 subcategories, out of 30 total.",
- "lang": "en"
- },
- {
- "name": "fr undelete_short 0",
- "key": "fr_undelete_short",
- "args": [
- 0
- ],
- "result": "Restaurer 0 modification",
- "lang": "fr"
- },
- {
- "name": "fr undelete_short 1",
- "key": "fr_undelete_short",
- "args": [
- 1
- ],
- "result": "Restaurer 1 modification",
- "lang": "fr"
- },
- {
- "name": "fr undelete_short 2",
- "key": "fr_undelete_short",
- "args": [
- 2
- ],
- "result": "Restaurer 2 modifications",
- "lang": "fr"
- },
- {
- "name": "fr undelete_short 5",
- "key": "fr_undelete_short",
- "args": [
- 5
- ],
- "result": "Restaurer 5 modifications",
- "lang": "fr"
- },
- {
- "name": "fr undelete_short 21",
- "key": "fr_undelete_short",
- "args": [
- 21
- ],
- "result": "Restaurer 21 modifications",
- "lang": "fr"
- },
- {
- "name": "fr undelete_short 101",
- "key": "fr_undelete_short",
- "args": [
- 101
- ],
- "result": "Restaurer 101 modifications",
- "lang": "fr"
- },
- {
- "name": "fr category-subcat-count 0,10",
- "key": "fr_category-subcat-count",
- "args": [
- 0,
- 10
- ],
- "result": "Cette cat\u00e9gorie comprend 10 sous-cat\u00e9gories, dont celle ci-dessous.",
- "lang": "fr"
- },
- {
- "name": "fr category-subcat-count 1,1",
- "key": "fr_category-subcat-count",
- "args": [
- 1,
- 1
- ],
- "result": "Cette cat\u00e9gorie comprend la sous-cat\u00e9gorie ci-dessous.",
- "lang": "fr"
- },
- {
- "name": "fr category-subcat-count 1,2",
- "key": "fr_category-subcat-count",
- "args": [
- 1,
- 2
- ],
- "result": "Cette cat\u00e9gorie comprend 2 sous-cat\u00e9gories, dont celle ci-dessous.",
- "lang": "fr"
- },
- {
- "name": "fr category-subcat-count 3,30",
- "key": "fr_category-subcat-count",
- "args": [
- 3,
- 30
- ],
- "result": "Cette cat\u00e9gorie comprend 30 sous-cat\u00e9gories, dont les 3 ci-dessous.",
- "lang": "fr"
- },
- {
- "name": "ar undelete_short 0",
- "key": "ar_undelete_short",
- "args": [
- 0
- ],
- "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f",
- "lang": "ar"
- },
- {
- "name": "ar undelete_short 1",
- "key": "ar_undelete_short",
- "args": [
- 1
- ],
- "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644\u064a\u0646",
- "lang": "ar"
- },
- {
- "name": "ar undelete_short 2",
- "key": "ar_undelete_short",
- "args": [
- 2
- ],
- "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 2 \u062a\u0639\u062f\u064a\u0644\u0627\u062a",
- "lang": "ar"
- },
- {
- "name": "ar undelete_short 5",
- "key": "ar_undelete_short",
- "args": [
- 5
- ],
- "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 5 \u062a\u0639\u062f\u064a\u0644",
- "lang": "ar"
- },
- {
- "name": "ar undelete_short 21",
- "key": "ar_undelete_short",
- "args": [
- 21
- ],
- "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 21 \u062a\u0639\u062f\u064a\u0644\u0627",
- "lang": "ar"
- },
- {
- "name": "ar undelete_short 101",
- "key": "ar_undelete_short",
- "args": [
- 101
- ],
- "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 101 \u062a\u0639\u062f\u064a\u0644\u0627",
- "lang": "ar"
- },
- {
- "name": "ar category-subcat-count 0,10",
- "key": "ar_category-subcat-count",
- "args": [
- 0,
- 10
- ],
- "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 10.",
- "lang": "ar"
- },
- {
- "name": "ar category-subcat-count 1,1",
- "key": "ar_category-subcat-count",
- "args": [
- 1,
- 1
- ],
- "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u062a\u0627\u0644\u064a \u0641\u0642\u0637.",
- "lang": "ar"
- },
- {
- "name": "ar category-subcat-count 1,2",
- "key": "ar_category-subcat-count",
- "args": [
- 1,
- 2
- ],
- "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 2.",
- "lang": "ar"
- },
- {
- "name": "ar category-subcat-count 3,30",
- "key": "ar_category-subcat-count",
- "args": [
- 3,
- 30
- ],
- "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0647\u0630\u0647 \u0627\u06443 \u062a\u0635\u0627\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u0629\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 30.",
- "lang": "ar"
- },
- {
- "name": "jp undelete_short 0",
- "key": "jp_undelete_short",
- "args": [
- 0
- ],
- "result": "Undelete 0 edits",
- "lang": "jp"
- },
- {
- "name": "jp undelete_short 1",
- "key": "jp_undelete_short",
- "args": [
- 1
- ],
- "result": "Undelete one edit",
- "lang": "jp"
- },
- {
- "name": "jp undelete_short 2",
- "key": "jp_undelete_short",
- "args": [
- 2
- ],
- "result": "Undelete 2 edits",
- "lang": "jp"
- },
- {
- "name": "jp undelete_short 5",
- "key": "jp_undelete_short",
- "args": [
- 5
- ],
- "result": "Undelete 5 edits",
- "lang": "jp"
- },
- {
- "name": "jp undelete_short 21",
- "key": "jp_undelete_short",
- "args": [
- 21
- ],
- "result": "Undelete 21 edits",
- "lang": "jp"
- },
- {
- "name": "jp undelete_short 101",
- "key": "jp_undelete_short",
- "args": [
- 101
- ],
- "result": "Undelete 101 edits",
- "lang": "jp"
- },
- {
- "name": "jp category-subcat-count 0,10",
- "key": "jp_category-subcat-count",
- "args": [
- 0,
- 10
- ],
- "result": "This category has the following 0 subcategories, out of 10 total.",
- "lang": "jp"
- },
- {
- "name": "jp category-subcat-count 1,1",
- "key": "jp_category-subcat-count",
- "args": [
- 1,
- 1
- ],
- "result": "This category has only the following subcategory.",
- "lang": "jp"
- },
- {
- "name": "jp category-subcat-count 1,2",
- "key": "jp_category-subcat-count",
- "args": [
- 1,
- 2
- ],
- "result": "This category has the following subcategory, out of 2 total.",
- "lang": "jp"
- },
- {
- "name": "jp category-subcat-count 3,30",
- "key": "jp_category-subcat-count",
- "args": [
- 3,
- 30
- ],
- "result": "This category has the following 3 subcategories, out of 30 total.",
- "lang": "jp"
- },
- {
- "name": "zh undelete_short 0",
- "key": "zh_undelete_short",
- "args": [
- 0
- ],
- "result": "\u6062\u590d\u88ab\u5220\u9664\u76840\u9879\u4fee\u8ba2",
- "lang": "zh"
- },
- {
- "name": "zh undelete_short 1",
- "key": "zh_undelete_short",
- "args": [
- 1
- ],
- "result": "\u6062\u590d\u88ab\u5220\u9664\u76841\u9879\u4fee\u8ba2",
- "lang": "zh"
- },
- {
- "name": "zh undelete_short 2",
- "key": "zh_undelete_short",
- "args": [
- 2
- ],
- "result": "\u6062\u590d\u88ab\u5220\u9664\u76842\u9879\u4fee\u8ba2",
- "lang": "zh"
- },
- {
- "name": "zh undelete_short 5",
- "key": "zh_undelete_short",
- "args": [
- 5
- ],
- "result": "\u6062\u590d\u88ab\u5220\u9664\u76845\u9879\u4fee\u8ba2",
- "lang": "zh"
- },
- {
- "name": "zh undelete_short 21",
- "key": "zh_undelete_short",
- "args": [
- 21
- ],
- "result": "\u6062\u590d\u88ab\u5220\u9664\u768421\u9879\u4fee\u8ba2",
- "lang": "zh"
- },
- {
- "name": "zh undelete_short 101",
- "key": "zh_undelete_short",
- "args": [
- 101
- ],
- "result": "\u6062\u590d\u88ab\u5220\u9664\u7684101\u9879\u4fee\u8ba2",
- "lang": "zh"
- },
- {
- "name": "zh category-subcat-count 0,10",
- "key": "zh_category-subcat-count",
- "args": [
- 0,
- 10
- ],
- "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52170\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u670910\u4e2a\u5b50\u5206\u7c7b\u3002",
- "lang": "zh"
- },
- {
- "name": "zh category-subcat-count 1,1",
- "key": "zh_category-subcat-count",
- "args": [
- 1,
- 1
- ],
- "result": "\u672c\u5206\u7c7b\u53ea\u6709\u4e0b\u5217\u4e00\u4e2a\u5b50\u5206\u7c7b\u3002",
- "lang": "zh"
- },
- {
- "name": "zh category-subcat-count 1,2",
- "key": "zh_category-subcat-count",
- "args": [
- 1,
- 2
- ],
- "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52171\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u67092\u4e2a\u5b50\u5206\u7c7b\u3002",
- "lang": "zh"
- },
- {
- "name": "zh category-subcat-count 3,30",
- "key": "zh_category-subcat-count",
- "args": [
- 3,
- 30
- ],
- "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52173\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u670930\u4e2a\u5b50\u5206\u7c7b\u3002",
- "lang": "zh"
- }
-];
diff --git a/tests/jasmine/spec/mediawiki.jqueryMsg.spec.js b/tests/jasmine/spec/mediawiki.jqueryMsg.spec.js
deleted file mode 100644
index 46dcaa80..00000000
--- a/tests/jasmine/spec/mediawiki.jqueryMsg.spec.js
+++ /dev/null
@@ -1,389 +0,0 @@
-/* spec for language & message behaviour in MediaWiki */
-
-mw.messages.set( {
- "en_empty": "",
- "en_simple": "Simple message",
- "en_replace": "Simple $1 replacement",
- "en_replace2": "Simple $1 $2 replacements",
- "en_link": "Simple [http://example.com link to example].",
- "en_link_replace": "Complex [$1 $2] behaviour.",
- "en_simple_magic": "Simple {{ALOHOMORA}} message",
- "en_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
- "en_undelete_empty_param": "Undelete{{PLURAL:$1|| multiple edits}}",
- "en_category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
- "en_escape0": "Escape \\to fantasy island",
- "en_escape1": "I had \\$2.50 in my pocket",
- "en_escape2": "I had {{PLURAL:$1|the absolute \\|$1\\| which came out to \\$3.00 in my C:\\\\drive| some stuff}}",
- "en_fail": "This should fail to {{parse",
- "en_fail_magic": "There is no such magic word as {{SIETNAME}}",
- "en_evil": "This has <script type='text/javascript'>window.en_evil = true;</script> tags"
-} );
-
-/**
- * Tests
- */
-( function( mw, $, undefined ) {
-
- describe( "mediaWiki.jqueryMsg", function() {
-
- describe( "basic message functionality", function() {
-
- it( "should return identity for empty string", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_empty' ).html() ).toEqual( '' );
- } );
-
-
- it( "should return identity for simple string", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_simple' ).html() ).toEqual( 'Simple message' );
- } );
-
- } );
-
- describe( "escaping", function() {
-
- it ( "should handle simple escaping", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_escape0' ).html() ).toEqual( 'Escape to fantasy island' );
- } );
-
- it ( "should escape dollar signs found in ordinary text when backslashed", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_escape1' ).html() ).toEqual( 'I had $2.50 in my pocket' );
- } );
-
- it ( "should handle a complicated escaping case, including escaped pipe chars in template args", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_escape2', [ 1 ] ).html() ).toEqual( 'I had the absolute |1| which came out to $3.00 in my C:\\drive' );
- } );
-
- } );
-
- describe( "replacing", function() {
-
- it ( "should handle simple replacing", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_replace', [ 'foo' ] ).html() ).toEqual( 'Simple foo replacement' );
- } );
-
- it ( "should return $n if replacement not there", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_replace', [] ).html() ).toEqual( 'Simple $1 replacement' );
- expect( parser.parse( 'en_replace2', [ 'bar' ] ).html() ).toEqual( 'Simple bar $2 replacements' );
- } );
-
- } );
-
- describe( "linking", function() {
-
- it ( "should handle a simple link", function() {
- var parser = new mw.jqueryMsg.parser();
- var parsed = parser.parse( 'en_link' );
- var contents = parsed.contents();
- expect( contents.length ).toEqual( 3 );
- expect( contents[0].nodeName ).toEqual( '#text' );
- expect( contents[0].nodeValue ).toEqual( 'Simple ' );
- expect( contents[1].nodeName ).toEqual( 'A' );
- expect( contents[1].getAttribute( 'href' ) ).toEqual( 'http://example.com' );
- expect( contents[1].childNodes[0].nodeValue ).toEqual( 'link to example' );
- expect( contents[2].nodeName ).toEqual( '#text' );
- expect( contents[2].nodeValue ).toEqual( '.' );
- } );
-
- it ( "should replace a URL into a link", function() {
- var parser = new mw.jqueryMsg.parser();
- var parsed = parser.parse( 'en_link_replace', [ 'http://example.com/foo', 'linking' ] );
- var contents = parsed.contents();
- expect( contents.length ).toEqual( 3 );
- expect( contents[0].nodeName ).toEqual( '#text' );
- expect( contents[0].nodeValue ).toEqual( 'Complex ' );
- expect( contents[1].nodeName ).toEqual( 'A' );
- expect( contents[1].getAttribute( 'href' ) ).toEqual( 'http://example.com/foo' );
- expect( contents[1].childNodes[0].nodeValue ).toEqual( 'linking' );
- expect( contents[2].nodeName ).toEqual( '#text' );
- expect( contents[2].nodeValue ).toEqual( ' behaviour.' );
- } );
-
- it ( "should bind a click handler into a link", function() {
- var parser = new mw.jqueryMsg.parser();
- var clicked = false;
- var click = function() { clicked = true; };
- var parsed = parser.parse( 'en_link_replace', [ click, 'linking' ] );
- var contents = parsed.contents();
- expect( contents.length ).toEqual( 3 );
- expect( contents[0].nodeName ).toEqual( '#text' );
- expect( contents[0].nodeValue ).toEqual( 'Complex ' );
- expect( contents[1].nodeName ).toEqual( 'A' );
- expect( contents[1].getAttribute( 'href' ) ).toEqual( '#' );
- expect( contents[1].childNodes[0].nodeValue ).toEqual( 'linking' );
- expect( contents[2].nodeName ).toEqual( '#text' );
- expect( contents[2].nodeValue ).toEqual( ' behaviour.' );
- // determining bindings is hard in IE
- var anchor = parsed.find( 'a' );
- if ( ( $.browser.mozilla || $.browser.webkit ) && anchor.click ) {
- expect( clicked ).toEqual( false );
- anchor.click();
- expect( clicked ).toEqual( true );
- }
- } );
-
- it ( "should wrap a jquery arg around link contents -- even another element", function() {
- var parser = new mw.jqueryMsg.parser();
- var clicked = false;
- var click = function() { clicked = true; };
- var button = $( '<button>' ).click( click );
- var parsed = parser.parse( 'en_link_replace', [ button, 'buttoning' ] );
- var contents = parsed.contents();
- expect( contents.length ).toEqual( 3 );
- expect( contents[0].nodeName ).toEqual( '#text' );
- expect( contents[0].nodeValue ).toEqual( 'Complex ' );
- expect( contents[1].nodeName ).toEqual( 'BUTTON' );
- expect( contents[1].childNodes[0].nodeValue ).toEqual( 'buttoning' );
- expect( contents[2].nodeName ).toEqual( '#text' );
- expect( contents[2].nodeValue ).toEqual( ' behaviour.' );
- // determining bindings is hard in IE
- if ( ( $.browser.mozilla || $.browser.webkit ) && button.click ) {
- expect( clicked ).toEqual( false );
- parsed.find( 'button' ).click();
- expect( clicked ).toEqual( true );
- }
- } );
-
-
- } );
-
-
- describe( "magic keywords", function() {
- it( "should substitute magic keywords", function() {
- var options = {
- magic: {
- 'alohomora' : 'open'
- }
- };
- var parser = new mw.jqueryMsg.parser( options );
- expect( parser.parse( 'en_simple_magic' ).html() ).toEqual( 'Simple open message' );
- } );
- } );
-
- describe( "error conditions", function() {
- it( "should return non-existent key in square brackets", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( parser.parse( 'en_does_not_exist' ).html() ).toEqual( '[en_does_not_exist]' );
- } );
-
-
- it( "should fail to parse", function() {
- var parser = new mw.jqueryMsg.parser();
- expect( function() { parser.parse( 'en_fail' ); } ).toThrow(
- 'Parse error at position 20 in input: This should fail to {{parse'
- );
- } );
- } );
-
- describe( "empty parameters", function() {
- it( "should deal with empty parameters", function() {
- var parser = new mw.jqueryMsg.parser();
- var ast = parser.getAst( 'en_undelete_empty_param' );
- expect( parser.parse( 'en_undelete_empty_param', [ 1 ] ).html() ).toEqual( 'Undelete' );
- expect( parser.parse( 'en_undelete_empty_param', [ 3 ] ).html() ).toEqual( 'Undelete multiple edits' );
-
- } );
- } );
-
- describe( "easy message interface functions", function() {
- it( "should allow a global that returns strings", function() {
- var gM = mw.jqueryMsg.getMessageFunction();
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- // a surrounding <SPAN> is needed for html() to work right
- var expectedHtml = $( '<span>Complex <a href="http://example.com/foo">linking</a> behaviour.</span>' ).html();
- var result = gM( 'en_link_replace', 'http://example.com/foo', 'linking' );
- expect( typeof result ).toEqual( 'string' );
- expect( result ).toEqual( expectedHtml );
- } );
-
- it( "should allow a jQuery plugin that appends to nodes", function() {
- $.fn.msg = mw.jqueryMsg.getPlugin();
- var $div = $( '<div>' ).append( $( '<p>' ).addClass( 'foo' ) );
- var clicked = false;
- var $button = $( '<button>' ).click( function() { clicked = true; } );
- $div.find( '.foo' ).msg( 'en_link_replace', $button, 'buttoning' );
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- // a surrounding <SPAN> is needed for html() to work right
- var expectedHtml = $( '<span>Complex <button>buttoning</button> behaviour.</span>' ).html();
- var createdHtml = $div.find( '.foo' ).html();
- // it is hard to test for clicks with IE; also it inserts or removes spaces around nodes when creating HTML tags, depending on their type.
- // so need to check the strings stripped of spaces.
- if ( ( $.browser.mozilla || $.browser.webkit ) && $button.click ) {
- expect( createdHtml ).toEqual( expectedHtml );
- $div.find( 'button ').click();
- expect( clicked ).toEqual( true );
- } else if ( $.browser.ie ) {
- expect( createdHtml.replace( /\s/, '' ) ).toEqual( expectedHtml.replace( /\s/, '' ) );
- }
- delete $.fn.msg;
- } );
-
- it( "jQuery plugin should escape incoming string arguments", function() {
- $.fn.msg = mw.jqueryMsg.getPlugin();
- var $div = $( '<div>' ).addClass( 'foo' );
- $div.msg( 'en_replace', '<p>x</p>' ); // looks like HTML, but as a string, should be escaped.
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- var expectedHtml = $( '<div class="foo">Simple &lt;p&gt;x&lt;/p&gt; replacement</div>' ).html();
- var createdHtml = $div.html();
- expect( expectedHtml ).toEqual( createdHtml );
- delete $.fn.msg;
- } );
-
-
- it( "jQuery plugin should never execute scripts", function() {
- window.en_evil = false;
- $.fn.msg = mw.jqueryMsg.getPlugin();
- var $div = $( '<div>' );
- $div.msg( 'en_evil' );
- expect( window.en_evil ).toEqual( false );
- delete $.fn.msg;
- } );
-
-
- // n.b. this passes because jQuery already seems to strip scripts away; however, it still executes them if they are appended to any element.
- it( "jQuery plugin should never emit scripts", function() {
- $.fn.msg = mw.jqueryMsg.getPlugin();
- var $div = $( '<div>' );
- $div.msg( 'en_evil' );
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- var expectedHtml = $( '<div>This has tags</div>' ).html();
- var createdHtml = $div.html();
- expect( expectedHtml ).toEqual( createdHtml );
- console.log( 'expected: ' + expectedHtml );
- console.log( 'created: ' + createdHtml );
- delete $.fn.msg;
- } );
-
-
-
- } );
-
- // The parser functions can throw errors, but let's not actually blow up for the user -- instead dump the error into the interface so we have
- // a chance at fixing this
- describe( "easy message interface functions with graceful failures", function() {
- it( "should allow a global that returns strings, with graceful failure", function() {
- var gM = mw.jqueryMsg.getMessageFunction();
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- // a surrounding <SPAN> is needed for html() to work right
- var expectedHtml = $( '<span>en_fail: Parse error at position 20 in input: This should fail to {{parse</span>' ).html();
- var result = gM( 'en_fail' );
- expect( typeof result ).toEqual( 'string' );
- expect( result ).toEqual( expectedHtml );
- } );
-
- it( "should allow a global that returns strings, with graceful failure on missing magic words", function() {
- var gM = mw.jqueryMsg.getMessageFunction();
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- // a surrounding <SPAN> is needed for html() to work right
- var expectedHtml = $( '<span>en_fail_magic: unknown operation "sietname"</span>' ).html();
- var result = gM( 'en_fail_magic' );
- expect( typeof result ).toEqual( 'string' );
- expect( result ).toEqual( expectedHtml );
- } );
-
-
- it( "should allow a jQuery plugin, with graceful failure", function() {
- $.fn.msg = mw.jqueryMsg.getPlugin();
- var $div = $( '<div>' ).append( $( '<p>' ).addClass( 'foo' ) );
- $div.find( '.foo' ).msg( 'en_fail' );
- // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
- // a surrounding <SPAN> is needed for html() to work right
- var expectedHtml = $( '<span>en_fail: Parse error at position 20 in input: This should fail to {{parse</span>' ).html();
- var createdHtml = $div.find( '.foo' ).html();
- expect( createdHtml ).toEqual( expectedHtml );
- delete $.fn.msg;
- } );
-
- } );
-
-
-
-
- describe( "test plurals and other language-specific functions", function() {
- /* copying some language definitions in here -- it's hard to make this test fast and reliable
- otherwise, and we don't want to have to know the mediawiki URL from this kind of test either.
- We also can't preload the langs for the test since they clobber the same namespace.
- In principle Roan said it was okay to change how languages worked so that didn't happen... maybe
- someday. We'd have to the same kind of importing of the default rules for most rules, or maybe
- come up with some kind of subclassing scheme for languages */
- var languageClasses = {
- ar: {
- /**
- * Arabic (العربية) language functions
- */
-
- convertPlural: function( count, forms ) {
- forms = mw.language.preConvertPlural( forms, 6 );
- if ( count === 0 ) {
- return forms[0];
- }
- if ( count == 1 ) {
- return forms[1];
- }
- if ( count == 2 ) {
- return forms[2];
- }
- if ( count % 100 >= 3 && count % 100 <= 10 ) {
- return forms[3];
- }
- if ( count % 100 >= 11 && count % 100 <= 99 ) {
- return forms[4];
- }
- return forms[5];
- },
-
- digitTransformTable: {
- '0': 'Ù ', // &#x0660;
- '1': 'Ù¡', // &#x0661;
- '2': 'Ù¢', // &#x0662;
- '3': 'Ù£', // &#x0663;
- '4': 'Ù¤', // &#x0664;
- '5': 'Ù¥', // &#x0665;
- '6': 'Ù¦', // &#x0666;
- '7': 'Ù§', // &#x0667;
- '8': 'Ù¨', // &#x0668;
- '9': 'Ù©', // &#x0669;
- '.': 'Ù«', // &#x066b; wrong table ?
- ',': 'Ù¬' // &#x066c;
- }
-
- },
- en: { },
- fr: {
- convertPlural: function( count, forms ) {
- forms = mw.language.preConvertPlural( forms, 2 );
- return ( count <= 1 ) ? forms[0] : forms[1];
- }
- },
- jp: { },
- zh: { }
- };
-
- /* simulate how the language classes override, or don't, the standard functions in mw.language */
- $.each( languageClasses, function( langCode, rules ) {
- $.each( [ 'convertPlural', 'convertNumber' ], function( i, propertyName ) {
- if ( typeof rules[ propertyName ] === 'undefined' ) {
- rules[ propertyName ] = mw.language[ propertyName ];
- }
- } );
- } );
-
- $.each( jasmineMsgSpec, function( i, test ) {
- it( "should parse " + test.name, function() {
- // using language override so we don't have to muck with global namespace
- var parser = new mw.jqueryMsg.parser( { language: languageClasses[ test.lang ] } );
- var parsedHtml = parser.parse( test.key, test.args ).html();
- expect( parsedHtml ).toEqual( test.result );
- } );
- } );
-
- } );
-
- } );
-} )( window.mediaWiki, jQuery );
diff --git a/tests/jasmine/spec_makers/makeJqueryMsgSpec.php b/tests/jasmine/spec_makers/makeJqueryMsgSpec.php
deleted file mode 100644
index 840da96a..00000000
--- a/tests/jasmine/spec_makers/makeJqueryMsgSpec.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-
-/**
- * This PHP script defines the spec that the Javascript message parser should conform to.
- *
- * It does this by looking up the results of various string kinds of string parsing, with various languages,
- * in the current installation of MediaWiki. It then outputs a static specification, mapping expected inputs to outputs,
- * which can be used with the JasmineBDD framework. This specification can then be used by simply including it into
- * the SpecRunner.html file.
- *
- * This is similar to Michael Dale (mdale@mediawiki.org)'s parser tests, except that it doesn't look up the
- * API results while doing the test, so the Jasmine run is much faster(at the cost of being out of date in rare
- * circumstances. But mostly the parsing that we are doing in Javascript doesn't change much.)
- *
- */
-
-$maintenanceDir = dirname( dirname( dirname( __DIR__ ) ) ) . '/maintenance';
-
-require( "$maintenanceDir/Maintenance.php" );
-
-class MakeLanguageSpec extends Maintenance {
-
- static $keyToTestArgs = array(
- 'undelete_short' => array(
- array( 0 ),
- array( 1 ),
- array( 2 ),
- array( 5 ),
- array( 21 ),
- array( 101 )
- ),
- 'category-subcat-count' => array(
- array( 0, 10 ),
- array( 1, 1 ),
- array( 1, 2 ),
- array( 3, 30 )
- )
- );
-
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Create a JasmineBDD-compatible specification for message parsing";
- // add any other options here
- }
-
- public function execute() {
- list( $messages, $tests ) = $this->getMessagesAndTests();
- $this->writeJavascriptFile( $messages, $tests, "spec/mediawiki.language.parser.spec.data.js" );
- }
-
- private function getMessagesAndTests() {
- $messages = array();
- $tests = array();
- foreach ( array( 'en', 'fr', 'ar', 'jp', 'zh' ) as $languageCode ) {
- foreach ( self::$keyToTestArgs as $key => $testArgs ) {
- foreach ($testArgs as $args) {
- // get the raw template, without any transformations
- $template = wfMessage( $key )->inLanguage( $languageCode )->plain();
-
- $result = wfMessage( $key, $args )->inLanguage( $languageCode )->text();
-
- // record the template, args, language, and expected result
- // fake multiple languages by flattening them together
- $langKey = $languageCode . '_' . $key;
- $messages[ $langKey ] = $template;
- $tests[] = array(
- 'name' => $languageCode . " " . $key . " " . join( ",", $args ),
- 'key' => $langKey,
- 'args' => $args,
- 'result' => $result,
- 'lang' => $languageCode
- );
- }
- }
- }
- return array( $messages, $tests );
- }
-
- private function writeJavascriptFile( $messages, $tests, $dataSpecFile ) {
- global $argv;
- $arguments = count($argv) ? $argv : $_SERVER[ 'argv' ];
-
- $json = new Services_JSON;
- $json->pretty = true;
- $javascriptPrologue = "// This file stores the results from the PHP parser for certain messages and arguments,\n"
- . "// so we can test the equivalent Javascript libraries.\n"
- . '// Last generated with ' . join(' ', $arguments) . ' at ' . gmdate('c') . "\n\n";
- $javascriptMessages = "mediaWiki.messages.set( " . $json->encode( $messages, true ) . " );\n";
- $javascriptTests = 'var jasmineMsgSpec = ' . $json->encode( $tests, true ) . ";\n";
-
- $fp = fopen( $dataSpecFile, 'w' );
- if ( !$fp ) {
- die( "couldn't open $dataSpecFile for writing" );
- }
- $success = fwrite( $fp, $javascriptPrologue . $javascriptMessages . $javascriptTests );
- if ( !$success ) {
- die( "couldn't write to $dataSpecFile" );
- }
- $success = fclose( $fp );
- if ( !$success ) {
- die( "couldn't close $dataSpecFile" );
- }
- }
-}
-
-$maintClass = "MakeLanguageSpec";
-require_once( "$maintenanceDir/doMaintenance.php" );
-
-
-
diff --git a/tests/parser/README b/tests/parser/README
deleted file mode 100644
index 8b413376..00000000
--- a/tests/parser/README
+++ /dev/null
@@ -1,8 +0,0 @@
-Parser tests are run using our PHPUnit test suite in tests/phpunit:
-
- $ cd tests/phpunit
- ./phpunit.php --group Parser
-
-You can optionally filter by title using --regex. I.e. :
-
- ./phpunit.php --group Parser --regex="Bug 6200"
diff --git a/tests/parser/extraParserTests.txt b/tests/parser/extraParserTests.txt
deleted file mode 100644
index bef8f506..00000000
--- a/tests/parser/extraParserTests.txt
+++ /dev/null
Binary files differ
diff --git a/tests/parser/parserTest.inc b/tests/parser/parserTest.inc
deleted file mode 100644
index 86e1e192..00000000
--- a/tests/parser/parserTest.inc
+++ /dev/null
@@ -1,1330 +0,0 @@
-<?php
-# Copyright (C) 2004, 2010 Brion Vibber <brion@pobox.com>
-# http://www.mediawiki.org/
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# http://www.gnu.org/copyleft/gpl.html
-
-/**
- * @todo Make this more independent of the configuration (and if possible the database)
- * @todo document
- * @file
- * @ingroup Testing
- */
-
-/**
- * @ingroup Testing
- */
-class ParserTest {
- /**
- * boolean $color whereas output should be colorized
- */
- private $color;
-
- /**
- * boolean $showOutput Show test output
- */
- private $showOutput;
-
- /**
- * boolean $useTemporaryTables Use temporary tables for the temporary database
- */
- private $useTemporaryTables = true;
-
- /**
- * boolean $databaseSetupDone True if the database has been set up
- */
- private $databaseSetupDone = false;
-
- /**
- * Our connection to the database
- * @var DatabaseBase
- */
- private $db;
-
- /**
- * Database clone helper
- * @var CloneDatabase
- */
- private $dbClone;
-
- /**
- * string $oldTablePrefix Original table prefix
- */
- private $oldTablePrefix;
-
- private $maxFuzzTestLength = 300;
- private $fuzzSeed = 0;
- private $memoryLimit = 50;
- private $uploadDir = null;
-
- public $regex = "";
- private $savedGlobals = array();
- /**
- * Sets terminal colorization and diff/quick modes depending on OS and
- * command-line options (--color and --quick).
- */
- public function __construct( $options = array() ) {
- # Only colorize output if stdout is a terminal.
- $this->color = !wfIsWindows() && Maintenance::posix_isatty( 1 );
-
- if ( isset( $options['color'] ) ) {
- switch( $options['color'] ) {
- case 'no':
- $this->color = false;
- break;
- case 'yes':
- default:
- $this->color = true;
- break;
- }
- }
-
- $this->term = $this->color
- ? new AnsiTermColorer()
- : new DummyTermColorer();
-
- $this->showDiffs = !isset( $options['quick'] );
- $this->showProgress = !isset( $options['quiet'] );
- $this->showFailure = !(
- isset( $options['quiet'] )
- && ( isset( $options['record'] )
- || isset( $options['compare'] ) ) ); // redundant output
-
- $this->showOutput = isset( $options['show-output'] );
-
- if ( isset( $options['filter'] ) ) {
- $options['regex'] = $options['filter'];
- }
-
- if ( isset( $options['regex'] ) ) {
- if ( isset( $options['record'] ) ) {
- echo "Warning: --record cannot be used with --regex, disabling --record\n";
- unset( $options['record'] );
- }
- $this->regex = $options['regex'];
- } else {
- # Matches anything
- $this->regex = '';
- }
-
- $this->setupRecorder( $options );
- $this->keepUploads = isset( $options['keep-uploads'] );
-
- if ( isset( $options['seed'] ) ) {
- $this->fuzzSeed = intval( $options['seed'] ) - 1;
- }
-
- $this->runDisabled = isset( $options['run-disabled'] );
-
- $this->hooks = array();
- $this->functionHooks = array();
- self::setUp();
- }
-
- static function setUp() {
- global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
- $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
- $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
- $parserMemc, $wgThumbnailScriptPath, $wgScriptPath,
- $wgArticlePath, $wgStyleSheetPath, $wgScript, $wgStylePath, $wgExtensionAssetsPath,
- $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType, $wgLockManagers;
-
- $wgScript = '/index.php';
- $wgScriptPath = '/';
- $wgArticlePath = '/wiki/$1';
- $wgStyleSheetPath = '/skins';
- $wgStylePath = '/skins';
- $wgExtensionAssetsPath = '/extensions';
- $wgThumbnailScriptPath = false;
- $wgLockManagers = array( array(
- 'name' => 'fsLockManager',
- 'class' => 'FSLockManager',
- 'lockDirectory' => wfTempDir() . '/test-repo/lockdir',
- ) );
- $wgLocalFileRepo = array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'url' => 'http://example.com/images',
- 'hashLevels' => 2,
- 'transformVia404' => false,
- 'backend' => new FSFileBackend( array(
- 'name' => 'local-backend',
- 'lockManager' => 'fsLockManager',
- 'containerPaths' => array(
- 'local-public' => wfTempDir() . '/test-repo/public',
- 'local-thumb' => wfTempDir() . '/test-repo/thumb',
- 'local-temp' => wfTempDir() . '/test-repo/temp',
- 'local-deleted' => wfTempDir() . '/test-repo/deleted',
- )
- ) )
- );
- $wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
- $wgNamespaceAliases['Image'] = NS_FILE;
- $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
-
- // XXX: tests won't run without this (for CACHE_DB)
- if ( $wgMainCacheType === CACHE_DB ) {
- $wgMainCacheType = CACHE_NONE;
- }
- if ( $wgMessageCacheType === CACHE_DB ) {
- $wgMessageCacheType = CACHE_NONE;
- }
- if ( $wgParserCacheType === CACHE_DB ) {
- $wgParserCacheType = CACHE_NONE;
- }
-
- $wgEnableParserCache = false;
- DeferredUpdates::clearPendingUpdates();
- $wgMemc = wfGetMainCache(); // checks $wgMainCacheType
- $messageMemc = wfGetMessageCacheStorage();
- $parserMemc = wfGetParserCacheStorage();
-
- // $wgContLang = new StubContLang;
- $wgUser = new User;
- $context = new RequestContext;
- $wgLang = $context->getLanguage();
- $wgOut = $context->getOutput();
- $wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) );
- $wgRequest = $context->getRequest();
-
- if ( $wgStyleDirectory === false ) {
- $wgStyleDirectory = "$IP/skins";
- }
-
- }
-
- public function setupRecorder ( $options ) {
- if ( isset( $options['record'] ) ) {
- $this->recorder = new DbTestRecorder( $this );
- $this->recorder->version = isset( $options['setversion'] ) ?
- $options['setversion'] : SpecialVersion::getVersion();
- } elseif ( isset( $options['compare'] ) ) {
- $this->recorder = new DbTestPreviewer( $this );
- } else {
- $this->recorder = new TestRecorder( $this );
- }
- }
-
- /**
- * Remove last character if it is a newline
- * @group utility
- */
- static public function chomp( $s ) {
- if ( substr( $s, -1 ) === "\n" ) {
- return substr( $s, 0, -1 );
- }
- else {
- return $s;
- }
- }
-
- /**
- * Run a fuzz test series
- * Draw input from a set of test files
- */
- function fuzzTest( $filenames ) {
- $GLOBALS['wgContLang'] = Language::factory( 'en' );
- $dict = $this->getFuzzInput( $filenames );
- $dictSize = strlen( $dict );
- $logMaxLength = log( $this->maxFuzzTestLength );
- $this->setupDatabase();
- ini_set( 'memory_limit', $this->memoryLimit * 1048576 );
-
- $numTotal = 0;
- $numSuccess = 0;
- $user = new User;
- $opts = ParserOptions::newFromUser( $user );
- $title = Title::makeTitle( NS_MAIN, 'Parser_test' );
-
- while ( true ) {
- // Generate test input
- mt_srand( ++$this->fuzzSeed );
- $totalLength = mt_rand( 1, $this->maxFuzzTestLength );
- $input = '';
-
- while ( strlen( $input ) < $totalLength ) {
- $logHairLength = mt_rand( 0, 1000000 ) / 1000000 * $logMaxLength;
- $hairLength = min( intval( exp( $logHairLength ) ), $dictSize );
- $offset = mt_rand( 0, $dictSize - $hairLength );
- $input .= substr( $dict, $offset, $hairLength );
- }
-
- $this->setupGlobals();
- $parser = $this->getParser();
-
- // Run the test
- try {
- $parser->parse( $input, $title, $opts );
- $fail = false;
- } catch ( Exception $exception ) {
- $fail = true;
- }
-
- if ( $fail ) {
- echo "Test failed with seed {$this->fuzzSeed}\n";
- echo "Input:\n";
- printf( "string(%d) \"%s\"\n\n", strlen( $input ), $input );
- echo "$exception\n";
- } else {
- $numSuccess++;
- }
-
- $numTotal++;
- $this->teardownGlobals();
- $parser->__destruct();
-
- if ( $numTotal % 100 == 0 ) {
- $usage = intval( memory_get_usage( true ) / $this->memoryLimit / 1048576 * 100 );
- echo "{$this->fuzzSeed}: $numSuccess/$numTotal (mem: $usage%)\n";
- if ( $usage > 90 ) {
- echo "Out of memory:\n";
- $memStats = $this->getMemoryBreakdown();
-
- foreach ( $memStats as $name => $usage ) {
- echo "$name: $usage\n";
- }
- $this->abort();
- }
- }
- }
- }
-
- /**
- * Get an input dictionary from a set of parser test files
- */
- function getFuzzInput( $filenames ) {
- $dict = '';
-
- foreach ( $filenames as $filename ) {
- $contents = file_get_contents( $filename );
- preg_match_all( '/!!\s*input\n(.*?)\n!!\s*result/s', $contents, $matches );
-
- foreach ( $matches[1] as $match ) {
- $dict .= $match . "\n";
- }
- }
-
- return $dict;
- }
-
- /**
- * Get a memory usage breakdown
- */
- function getMemoryBreakdown() {
- $memStats = array();
-
- foreach ( $GLOBALS as $name => $value ) {
- $memStats['$' . $name] = strlen( serialize( $value ) );
- }
-
- $classes = get_declared_classes();
-
- foreach ( $classes as $class ) {
- $rc = new ReflectionClass( $class );
- $props = $rc->getStaticProperties();
- $memStats[$class] = strlen( serialize( $props ) );
- $methods = $rc->getMethods();
-
- foreach ( $methods as $method ) {
- $memStats[$class] += strlen( serialize( $method->getStaticVariables() ) );
- }
- }
-
- $functions = get_defined_functions();
-
- foreach ( $functions['user'] as $function ) {
- $rf = new ReflectionFunction( $function );
- $memStats["$function()"] = strlen( serialize( $rf->getStaticVariables() ) );
- }
-
- asort( $memStats );
-
- return $memStats;
- }
-
- function abort() {
- $this->abort();
- }
-
- /**
- * Run a series of tests listed in the given text files.
- * Each test consists of a brief description, wikitext input,
- * and the expected HTML output.
- *
- * Prints status updates on stdout and counts up the total
- * number and percentage of passed tests.
- *
- * @param $filenames Array of strings
- * @return Boolean: true if passed all tests, false if any tests failed.
- */
- public function runTestsFromFiles( $filenames ) {
- $ok = false;
- $GLOBALS['wgContLang'] = Language::factory( 'en' );
- $this->recorder->start();
- try {
- $this->setupDatabase();
- $ok = true;
-
- foreach ( $filenames as $filename ) {
- $tests = new TestFileIterator( $filename, $this );
- $ok = $this->runTests( $tests ) && $ok;
- }
-
- $this->teardownDatabase();
- $this->recorder->report();
- } catch (DBError $e) {
- echo $e->getMessage();
- }
- $this->recorder->end();
-
- return $ok;
- }
-
- function runTests( $tests ) {
- $ok = true;
-
- foreach ( $tests as $t ) {
- $result =
- $this->runTest( $t['test'], $t['input'], $t['result'], $t['options'], $t['config'] );
- $ok = $ok && $result;
- $this->recorder->record( $t['test'], $result );
- }
-
- if ( $this->showProgress ) {
- print "\n";
- }
-
- return $ok;
- }
-
- /**
- * Get a Parser object
- */
- function getParser( $preprocessor = null ) {
- global $wgParserConf;
-
- $class = $wgParserConf['class'];
- $parser = new $class( array( 'preprocessorClass' => $preprocessor ) + $wgParserConf );
-
- foreach ( $this->hooks as $tag => $callback ) {
- $parser->setHook( $tag, $callback );
- }
-
- foreach ( $this->functionHooks as $tag => $bits ) {
- list( $callback, $flags ) = $bits;
- $parser->setFunctionHook( $tag, $callback, $flags );
- }
-
- wfRunHooks( 'ParserTestParser', array( &$parser ) );
-
- return $parser;
- }
-
- /**
- * Run a given wikitext input through a freshly-constructed wiki parser,
- * and compare the output against the expected results.
- * Prints status and explanatory messages to stdout.
- *
- * @param $desc String: test's description
- * @param $input String: wikitext to try rendering
- * @param $result String: result to output
- * @param $opts Array: test's options
- * @param $config String: overrides for global variables, one per line
- * @return Boolean
- */
- public function runTest( $desc, $input, $result, $opts, $config ) {
- if ( $this->showProgress ) {
- $this->showTesting( $desc );
- }
-
- $opts = $this->parseOptions( $opts );
- $context = $this->setupGlobals( $opts, $config );
-
- $user = $context->getUser();
- $options = ParserOptions::newFromContext( $context );
-
- if ( isset( $opts['title'] ) ) {
- $titleText = $opts['title'];
- }
- else {
- $titleText = 'Parser test';
- }
-
- $local = isset( $opts['local'] );
- $preprocessor = isset( $opts['preprocessor'] ) ? $opts['preprocessor'] : null;
- $parser = $this->getParser( $preprocessor );
- $title = Title::newFromText( $titleText );
-
- if ( isset( $opts['pst'] ) ) {
- $out = $parser->preSaveTransform( $input, $title, $user, $options );
- } elseif ( isset( $opts['msg'] ) ) {
- $out = $parser->transformMsg( $input, $options, $title );
- } elseif ( isset( $opts['section'] ) ) {
- $section = $opts['section'];
- $out = $parser->getSection( $input, $section );
- } elseif ( isset( $opts['replace'] ) ) {
- $section = $opts['replace'][0];
- $replace = $opts['replace'][1];
- $out = $parser->replaceSection( $input, $section, $replace );
- } elseif ( isset( $opts['comment'] ) ) {
- $out = Linker::formatComment( $input, $title, $local );
- } elseif ( isset( $opts['preload'] ) ) {
- $out = $parser->getpreloadText( $input, $title, $options );
- } else {
- $output = $parser->parse( $input, $title, $options, true, true, 1337 );
- $out = $output->getText();
-
- if ( isset( $opts['showtitle'] ) ) {
- if ( $output->getTitleText() ) {
- $title = $output->getTitleText();
- }
-
- $out = "$title\n$out";
- }
-
- if ( isset( $opts['ill'] ) ) {
- $out = $this->tidy( implode( ' ', $output->getLanguageLinks() ) );
- } elseif ( isset( $opts['cat'] ) ) {
- $outputPage = $context->getOutput();
- $outputPage->addCategoryLinks( $output->getCategories() );
- $cats = $outputPage->getCategoryLinks();
-
- if ( isset( $cats['normal'] ) ) {
- $out = $this->tidy( implode( ' ', $cats['normal'] ) );
- } else {
- $out = '';
- }
- }
-
- $result = $this->tidy( $result );
- }
-
- $this->teardownGlobals();
- return $this->showTestResult( $desc, $result, $out );
- }
-
- /**
- *
- */
- function showTestResult( $desc, $result, $out ) {
- if ( $result === $out ) {
- $this->showSuccess( $desc );
- return true;
- } else {
- $this->showFailure( $desc, $result, $out );
- return false;
- }
- }
-
- /**
- * Use a regex to find out the value of an option
- * @param $key String: name of option val to retrieve
- * @param $opts Options array to look in
- * @param $default Mixed: default value returned if not found
- */
- private static function getOptionValue( $key, $opts, $default ) {
- $key = strtolower( $key );
-
- if ( isset( $opts[$key] ) ) {
- return $opts[$key];
- } else {
- return $default;
- }
- }
-
- private function parseOptions( $instring ) {
- $opts = array();
- // foo
- // foo=bar
- // foo="bar baz"
- // foo=[[bar baz]]
- // foo=bar,"baz quux"
- $regex = '/\b
- ([\w-]+) # Key
- \b
- (?:\s*
- = # First sub-value
- \s*
- (
- "
- [^"]* # Quoted val
- "
- |
- \[\[
- [^]]* # Link target
- \]\]
- |
- [\w-]+ # Plain word
- )
- (?:\s*
- , # Sub-vals 1..N
- \s*
- (
- "[^"]*" # Quoted val
- |
- \[\[[^]]*\]\] # Link target
- |
- [\w-]+ # Plain word
- )
- )*
- )?
- /x';
-
- if ( preg_match_all( $regex, $instring, $matches, PREG_SET_ORDER ) ) {
- foreach ( $matches as $bits ) {
- array_shift( $bits );
- $key = strtolower( array_shift( $bits ) );
- if ( count( $bits ) == 0 ) {
- $opts[$key] = true;
- } elseif ( count( $bits ) == 1 ) {
- $opts[$key] = $this->cleanupOption( array_shift( $bits ) );
- } else {
- // Array!
- $opts[$key] = array_map( array( $this, 'cleanupOption' ), $bits );
- }
- }
- }
- return $opts;
- }
-
- private function cleanupOption( $opt ) {
- if ( substr( $opt, 0, 1 ) == '"' ) {
- return substr( $opt, 1, -1 );
- }
-
- if ( substr( $opt, 0, 2 ) == '[[' ) {
- return substr( $opt, 2, -2 );
- }
- return $opt;
- }
-
- /**
- * Set up the global variables for a consistent environment for each test.
- * Ideally this should replace the global configuration entirely.
- */
- private function setupGlobals( $opts = '', $config = '' ) {
- # Find out values for some special options.
- $lang =
- self::getOptionValue( 'language', $opts, 'en' );
- $variant =
- self::getOptionValue( 'variant', $opts, false );
- $maxtoclevel =
- self::getOptionValue( 'wgMaxTocLevel', $opts, 999 );
- $linkHolderBatchSize =
- self::getOptionValue( 'wgLinkHolderBatchSize', $opts, 1000 );
-
- $settings = array(
- 'wgServer' => 'http://Britney-Spears',
- 'wgScript' => '/index.php',
- 'wgScriptPath' => '/',
- 'wgArticlePath' => '/wiki/$1',
- 'wgActionPaths' => array(),
- 'wgLockManagers' => array(
- 'name' => 'fsLockManager',
- 'class' => 'FSLockManager',
- 'lockDirectory' => $this->uploadDir . '/lockdir',
- ),
- 'wgLocalFileRepo' => array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'url' => 'http://example.com/images',
- 'hashLevels' => 2,
- 'transformVia404' => false,
- 'backend' => new FSFileBackend( array(
- 'name' => 'local-backend',
- 'lockManager' => 'fsLockManager',
- 'containerPaths' => array(
- 'local-public' => $this->uploadDir,
- 'local-thumb' => $this->uploadDir . '/thumb',
- 'local-temp' => $this->uploadDir . '/temp',
- 'local-deleted' => $this->uploadDir . '/delete',
- )
- ) )
- ),
- 'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
- 'wgStylePath' => '/skins',
- 'wgStyleSheetPath' => '/skins',
- 'wgSitename' => 'MediaWiki',
- 'wgLanguageCode' => $lang,
- 'wgDBprefix' => $this->db->getType() != 'oracle' ? 'parsertest_' : 'pt_',
- 'wgRawHtml' => isset( $opts['rawhtml'] ),
- 'wgLang' => null,
- 'wgContLang' => null,
- 'wgNamespacesWithSubpages' => array( 0 => isset( $opts['subpage'] ) ),
- 'wgMaxTocLevel' => $maxtoclevel,
- 'wgCapitalLinks' => true,
- 'wgNoFollowLinks' => true,
- 'wgNoFollowDomainExceptions' => array(),
- 'wgThumbnailScriptPath' => false,
- 'wgUseImageResize' => false,
- 'wgLocaltimezone' => 'UTC',
- 'wgAllowExternalImages' => true,
- 'wgUseTidy' => false,
- 'wgDefaultLanguageVariant' => $variant,
- 'wgVariantArticlePath' => false,
- 'wgGroupPermissions' => array( '*' => array(
- 'createaccount' => true,
- 'read' => true,
- 'edit' => true,
- 'createpage' => true,
- 'createtalk' => true,
- ) ),
- 'wgNamespaceProtection' => array( NS_MEDIAWIKI => 'editinterface' ),
- 'wgDefaultExternalStore' => array(),
- 'wgForeignFileRepos' => array(),
- 'wgLinkHolderBatchSize' => $linkHolderBatchSize,
- 'wgExperimentalHtmlIds' => false,
- 'wgExternalLinkTarget' => false,
- 'wgAlwaysUseTidy' => false,
- 'wgHtml5' => true,
- 'wgWellFormedXml' => true,
- 'wgAllowMicrodataAttributes' => true,
- 'wgAdaptiveMessageCache' => true,
- 'wgDisableLangConversion' => false,
- 'wgDisableTitleConversion' => false,
- );
-
- if ( $config ) {
- $configLines = explode( "\n", $config );
-
- foreach ( $configLines as $line ) {
- list( $var, $value ) = explode( '=', $line, 2 );
-
- $settings[$var] = eval( "return $value;" );
- }
- }
-
- $this->savedGlobals = array();
-
- /** @since 1.20 */
- wfRunHooks( 'ParserTestGlobals', array( &$settings ) );
-
- foreach ( $settings as $var => $val ) {
- if ( array_key_exists( $var, $GLOBALS ) ) {
- $this->savedGlobals[$var] = $GLOBALS[$var];
- }
-
- $GLOBALS[$var] = $val;
- }
-
- $GLOBALS['wgContLang'] = Language::factory( $lang );
- $GLOBALS['wgMemc'] = new EmptyBagOStuff;
-
- $context = new RequestContext();
- $GLOBALS['wgLang'] = $context->getLanguage();
- $GLOBALS['wgOut'] = $context->getOutput();
-
- $GLOBALS['wgUser'] = new User();
-
- global $wgHooks;
-
- $wgHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
- $wgHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
-
- MagicWord::clearCache();
-
- return $context;
- }
-
- /**
- * List of temporary tables to create, without prefix.
- * Some of these probably aren't necessary.
- */
- private function listTables() {
- $tables = array( 'user', 'user_properties', 'user_former_groups', 'page', 'page_restrictions',
- 'protected_titles', 'revision', 'text', 'pagelinks', 'imagelinks',
- 'categorylinks', 'templatelinks', 'externallinks', 'langlinks', 'iwlinks',
- 'site_stats', 'hitcounter', 'ipblocks', 'image', 'oldimage',
- 'recentchanges', 'watchlist', 'interwiki', 'logging',
- 'querycache', 'objectcache', 'job', 'l10n_cache', 'redirect', 'querycachetwo',
- 'archive', 'user_groups', 'page_props', 'category', 'msg_resource', 'msg_resource_links'
- );
-
- if ( in_array( $this->db->getType(), array( 'mysql', 'sqlite', 'oracle' ) ) ) {
- array_push( $tables, 'searchindex' );
- }
-
- // Allow extensions to add to the list of tables to duplicate;
- // may be necessary if they hook into page save or other code
- // which will require them while running tests.
- wfRunHooks( 'ParserTestTables', array( &$tables ) );
-
- return $tables;
- }
-
- /**
- * Set up a temporary set of wiki tables to work with for the tests.
- * Currently this will only be done once per run, and any changes to
- * the db will be visible to later tests in the run.
- */
- public function setupDatabase() {
- global $wgDBprefix;
-
- if ( $this->databaseSetupDone ) {
- return;
- }
-
- $this->db = wfGetDB( DB_MASTER );
- $dbType = $this->db->getType();
-
- if ( $wgDBprefix === 'parsertest_' || ( $dbType == 'oracle' && $wgDBprefix === 'pt_' ) ) {
- throw new MWException( 'setupDatabase should be called before setupGlobals' );
- }
-
- $this->databaseSetupDone = true;
- $this->oldTablePrefix = $wgDBprefix;
-
- # SqlBagOStuff broke when using temporary tables on r40209 (bug 15892).
- # It seems to have been fixed since (r55079?), but regressed at some point before r85701.
- # This works around it for now...
- ObjectCache::$instances[CACHE_DB] = new HashBagOStuff;
-
- # CREATE TEMPORARY TABLE breaks if there is more than one server
- if ( wfGetLB()->getServerCount() != 1 ) {
- $this->useTemporaryTables = false;
- }
-
- $temporary = $this->useTemporaryTables || $dbType == 'postgres';
- $prefix = $dbType != 'oracle' ? 'parsertest_' : 'pt_';
-
- $this->dbClone = new CloneDatabase( $this->db, $this->listTables(), $prefix );
- $this->dbClone->useTemporaryTables( $temporary );
- $this->dbClone->cloneTableStructure();
-
- if ( $dbType == 'oracle' ) {
- $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' );
- # Insert 0 user to prevent FK violations
-
- # Anonymous user
- $this->db->insert( 'user', array(
- 'user_id' => 0,
- 'user_name' => 'Anonymous' ) );
- }
-
- # Hack: insert a few Wikipedia in-project interwiki prefixes,
- # for testing inter-language links
- $this->db->insert( 'interwiki', array(
- array( 'iw_prefix' => 'wikipedia',
- 'iw_url' => 'http://en.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 0 ),
- array( 'iw_prefix' => 'meatball',
- 'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 0 ),
- array( 'iw_prefix' => 'zh',
- 'iw_url' => 'http://zh.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'es',
- 'iw_url' => 'http://es.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'fr',
- 'iw_url' => 'http://fr.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'ru',
- 'iw_url' => 'http://ru.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- ) );
-
- # Update certain things in site_stats
- $this->db->insert( 'site_stats', array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ) );
-
- # Reinitialise the LocalisationCache to match the database state
- Language::getLocalisationCache()->unloadAll();
-
- # Clear the message cache
- MessageCache::singleton()->clear();
-
- $this->uploadDir = $this->setupUploadDir();
- $user = User::createNew( 'WikiSysop' );
- $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
- $image->recordUpload2( '', 'Upload of some lame file', 'Some lame file', array(
- 'size' => 12345,
- 'width' => 1941,
- 'height' => 220,
- 'bits' => 24,
- 'media_type' => MEDIATYPE_BITMAP,
- 'mime' => 'image/jpeg',
- 'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
- 'fileExists' => true
- ), $this->db->timestamp( '20010115123500' ), $user );
-
- # This image will be blacklisted in [[MediaWiki:Bad image list]]
- $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
- $image->recordUpload2( '', 'zomgnotcensored', 'Borderline image', array(
- 'size' => 12345,
- 'width' => 320,
- 'height' => 240,
- 'bits' => 24,
- 'media_type' => MEDIATYPE_BITMAP,
- 'mime' => 'image/jpeg',
- 'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
- 'fileExists' => true
- ), $this->db->timestamp( '20010115123500' ), $user );
- }
-
- public function teardownDatabase() {
- if ( !$this->databaseSetupDone ) {
- $this->teardownGlobals();
- return;
- }
- $this->teardownUploadDir( $this->uploadDir );
-
- $this->dbClone->destroy();
- $this->databaseSetupDone = false;
-
- if ( $this->useTemporaryTables ) {
- if( $this->db->getType() == 'sqlite' ) {
- # Under SQLite the searchindex table is virtual and need
- # to be explicitly destroyed. See bug 29912
- # See also MediaWikiTestCase::destroyDB()
- wfDebug( __METHOD__ . " explicitly destroying sqlite virtual table parsertest_searchindex\n" );
- $this->db->query( "DROP TABLE `parsertest_searchindex`" );
- }
- # Don't need to do anything
- $this->teardownGlobals();
- return;
- }
-
- $tables = $this->listTables();
-
- foreach ( $tables as $table ) {
- $sql = $this->db->getType() == 'oracle' ? "DROP TABLE pt_$table DROP CONSTRAINTS" : "DROP TABLE `parsertest_$table`";
- $this->db->query( $sql );
- }
-
- if ( $this->db->getType() == 'oracle' )
- $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' );
-
- $this->teardownGlobals();
- }
-
- /**
- * Create a dummy uploads directory which will contain a couple
- * of files in order to pass existence tests.
- *
- * @return String: the directory
- */
- private function setupUploadDir() {
- global $IP;
-
- if ( $this->keepUploads ) {
- $dir = wfTempDir() . '/mwParser-images';
-
- if ( is_dir( $dir ) ) {
- return $dir;
- }
- } else {
- $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
- }
-
- // wfDebug( "Creating upload directory $dir\n" );
- if ( file_exists( $dir ) ) {
- wfDebug( "Already exists!\n" );
- return $dir;
- }
-
- wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
- wfMkdirParents( $dir . '/0/09', null, __METHOD__ );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
-
- return $dir;
- }
-
- /**
- * Restore default values and perform any necessary clean-up
- * after each test runs.
- */
- private function teardownGlobals() {
- RepoGroup::destroySingleton();
- FileBackendGroup::destroySingleton();
- LockManagerGroup::destroySingleton();
- LinkCache::singleton()->clear();
-
- foreach ( $this->savedGlobals as $var => $val ) {
- $GLOBALS[$var] = $val;
- }
- }
-
- /**
- * Remove the dummy uploads directory
- */
- private function teardownUploadDir( $dir ) {
- if ( $this->keepUploads ) {
- return;
- }
-
- // delete the files first, then the dirs.
- self::deleteFiles(
- array (
- "$dir/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
-
- "$dir/0/09/Bad.jpg",
-
- "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
- )
- );
-
- self::deleteDirs(
- array (
- "$dir/3/3a",
- "$dir/3",
- "$dir/thumb/6/65",
- "$dir/thumb/6",
- "$dir/thumb/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a",
- "$dir/thumb/3",
-
- "$dir/0/09/",
- "$dir/0/",
- "$dir/thumb",
- "$dir/math/f/a/5",
- "$dir/math/f/a",
- "$dir/math/f",
- "$dir/math",
- "$dir",
- )
- );
- }
-
- /**
- * Delete the specified files, if they exist.
- * @param $files Array: full paths to files to delete.
- */
- private static function deleteFiles( $files ) {
- foreach ( $files as $file ) {
- if ( file_exists( $file ) ) {
- unlink( $file );
- }
- }
- }
-
- /**
- * Delete the specified directories, if they exist. Must be empty.
- * @param $dirs Array: full paths to directories to delete.
- */
- private static function deleteDirs( $dirs ) {
- foreach ( $dirs as $dir ) {
- if ( is_dir( $dir ) ) {
- rmdir( $dir );
- }
- }
- }
-
- /**
- * "Running test $desc..."
- */
- protected function showTesting( $desc ) {
- print "Running test $desc... ";
- }
-
- /**
- * Print a happy success message.
- *
- * @param $desc String: the test name
- * @return Boolean
- */
- protected function showSuccess( $desc ) {
- if ( $this->showProgress ) {
- print $this->term->color( '1;32' ) . 'PASSED' . $this->term->reset() . "\n";
- }
-
- return true;
- }
-
- /**
- * Print a failure message and provide some explanatory output
- * about what went wrong if so configured.
- *
- * @param $desc String: the test name
- * @param $result String: expected HTML output
- * @param $html String: actual HTML output
- * @return Boolean
- */
- protected function showFailure( $desc, $result, $html ) {
- if ( $this->showFailure ) {
- if ( !$this->showProgress ) {
- # In quiet mode we didn't show the 'Testing' message before the
- # test, in case it succeeded. Show it now:
- $this->showTesting( $desc );
- }
-
- print $this->term->color( '31' ) . 'FAILED!' . $this->term->reset() . "\n";
-
- if ( $this->showOutput ) {
- print "--- Expected ---\n$result\n--- Actual ---\n$html\n";
- }
-
- if ( $this->showDiffs ) {
- print $this->quickDiff( $result, $html );
- if ( !$this->wellFormed( $html ) ) {
- print "XML error: $this->mXmlError\n";
- }
- }
- }
-
- return false;
- }
-
- /**
- * Run given strings through a diff and return the (colorized) output.
- * Requires writable /tmp directory and a 'diff' command in the PATH.
- *
- * @param $input String
- * @param $output String
- * @param $inFileTail String: tailing for the input file name
- * @param $outFileTail String: tailing for the output file name
- * @return String
- */
- protected function quickDiff( $input, $output, $inFileTail = 'expected', $outFileTail = 'actual' ) {
- # Windows, or at least the fc utility, is retarded
- $slash = wfIsWindows() ? '\\' : '/';
- $prefix = wfTempDir() . "{$slash}mwParser-" . mt_rand();
-
- $infile = "$prefix-$inFileTail";
- $this->dumpToFile( $input, $infile );
-
- $outfile = "$prefix-$outFileTail";
- $this->dumpToFile( $output, $outfile );
-
- $shellInfile = wfEscapeShellArg($infile);
- $shellOutfile = wfEscapeShellArg($outfile);
-
- global $wgDiff3;
- // we assume that people with diff3 also have usual diff
- $diff = ( wfIsWindows() && !$wgDiff3 )
- ? `fc $shellInfile $shellOutfile`
- : `diff -au $shellInfile $shellOutfile`;
- unlink( $infile );
- unlink( $outfile );
-
- return $this->colorDiff( $diff );
- }
-
- /**
- * Write the given string to a file, adding a final newline.
- *
- * @param $data String
- * @param $filename String
- */
- private function dumpToFile( $data, $filename ) {
- $file = fopen( $filename, "wt" );
- fwrite( $file, $data . "\n" );
- fclose( $file );
- }
-
- /**
- * Colorize unified diff output if set for ANSI color output.
- * Subtractions are colored blue, additions red.
- *
- * @param $text String
- * @return String
- */
- protected function colorDiff( $text ) {
- return preg_replace(
- array( '/^(-.*)$/m', '/^(\+.*)$/m' ),
- array( $this->term->color( 34 ) . '$1' . $this->term->reset(),
- $this->term->color( 31 ) . '$1' . $this->term->reset() ),
- $text );
- }
-
- /**
- * Show "Reading tests from ..."
- *
- * @param $path String
- */
- public function showRunFile( $path ) {
- print $this->term->color( 1 ) .
- "Reading tests from \"$path\"..." .
- $this->term->reset() .
- "\n";
- }
-
- /**
- * Insert a temporary test article
- * @param $name String: the title, including any prefix
- * @param $text String: the article text
- * @param $line Integer: the input line number, for reporting errors
- * @param $ignoreDuplicate Boolean: whether to silently ignore duplicate pages
- */
- static public function addArticle( $name, $text, $line = 'unknown', $ignoreDuplicate = '' ) {
- global $wgCapitalLinks;
-
- $oldCapitalLinks = $wgCapitalLinks;
- $wgCapitalLinks = true; // We only need this from SetupGlobals() See r70917#c8637
-
- $text = self::chomp( $text );
- $name = self::chomp( $name );
-
- $title = Title::newFromText( $name );
-
- if ( is_null( $title ) ) {
- throw new MWException( "invalid title '$name' at line $line\n" );
- }
-
- $page = WikiPage::factory( $title );
- $page->loadPageData( 'fromdbmaster' );
-
- if ( $page->exists() ) {
- if ( $ignoreDuplicate == 'ignoreduplicate' ) {
- return;
- } else {
- throw new MWException( "duplicate article '$name' at line $line\n" );
- }
- }
-
- $page->doEdit( $text, '', EDIT_NEW );
-
- $wgCapitalLinks = $oldCapitalLinks;
- }
-
- /**
- * Steal a callback function from the primary parser, save it for
- * application to our scary parser. If the hook is not installed,
- * abort processing of this file.
- *
- * @param $name String
- * @return Bool true if tag hook is present
- */
- public function requireHook( $name ) {
- global $wgParser;
-
- $wgParser->firstCallInit( ); // make sure hooks are loaded.
-
- if ( isset( $wgParser->mTagHooks[$name] ) ) {
- $this->hooks[$name] = $wgParser->mTagHooks[$name];
- } else {
- echo " This test suite requires the '$name' hook extension, skipping.\n";
- return false;
- }
-
- return true;
- }
-
- /**
- * Steal a callback function from the primary parser, save it for
- * application to our scary parser. If the hook is not installed,
- * abort processing of this file.
- *
- * @param $name String
- * @return Bool true if function hook is present
- */
- public function requireFunctionHook( $name ) {
- global $wgParser;
-
- $wgParser->firstCallInit( ); // make sure hooks are loaded.
-
- if ( isset( $wgParser->mFunctionHooks[$name] ) ) {
- $this->functionHooks[$name] = $wgParser->mFunctionHooks[$name];
- } else {
- echo " This test suite requires the '$name' function hook extension, skipping.\n";
- return false;
- }
-
- return true;
- }
-
- /**
- * Run the "tidy" command on text if the $wgUseTidy
- * global is true
- *
- * @param $text String: the text to tidy
- * @return String
- */
- private function tidy( $text ) {
- global $wgUseTidy;
-
- if ( $wgUseTidy ) {
- $text = MWTidy::tidy( $text );
- }
-
- return $text;
- }
-
- private function wellFormed( $text ) {
- $html =
- Sanitizer::hackDocType() .
- '<html>' .
- $text .
- '</html>';
-
- $parser = xml_parser_create( "UTF-8" );
-
- # case folding violates XML standard, turn it off
- xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
-
- if ( !xml_parse( $parser, $html, true ) ) {
- $err = xml_error_string( xml_get_error_code( $parser ) );
- $position = xml_get_current_byte_index( $parser );
- $fragment = $this->extractFragment( $html, $position );
- $this->mXmlError = "$err at byte $position:\n$fragment";
- xml_parser_free( $parser );
-
- return false;
- }
-
- xml_parser_free( $parser );
-
- return true;
- }
-
- private function extractFragment( $text, $position ) {
- $start = max( 0, $position - 10 );
- $before = $position - $start;
- $fragment = '...' .
- $this->term->color( 34 ) .
- substr( $text, $start, $before ) .
- $this->term->color( 0 ) .
- $this->term->color( 31 ) .
- $this->term->color( 1 ) .
- substr( $text, $position, 1 ) .
- $this->term->color( 0 ) .
- $this->term->color( 34 ) .
- substr( $text, $position + 1, 9 ) .
- $this->term->color( 0 ) .
- '...';
- $display = str_replace( "\n", ' ', $fragment );
- $caret = ' ' .
- str_repeat( ' ', $before ) .
- $this->term->color( 31 ) .
- '^' .
- $this->term->color( 0 );
-
- return "$display\n$caret";
- }
-
- static function getFakeTimestamp( &$parser, &$ts ) {
- $ts = 123;
- return true;
- }
-}
diff --git a/tests/parser/parserTests.txt b/tests/parser/parserTests.txt
deleted file mode 100644
index df057248..00000000
--- a/tests/parser/parserTests.txt
+++ /dev/null
@@ -1,10363 +0,0 @@
-# MediaWiki Parser test cases
-# Some taken from http://meta.wikimedia.org/wiki/Parser_testing
-# All (C) their respective authors and released under the GPL
-#
-# The syntax should be fairly self-explanatory.
-#
-# Currently supported test options:
-# One of the following three:
-#
-# (default) generate HTML output
-# pst apply pre-save transform
-# msg apply message transform
-#
-# Plus any combination of these:
-#
-# cat add category links
-# ill add inter-language links
-# subpage enable subpages (disabled by default)
-# noxml don't check for XML well formdness
-# title=[[XXX]] run test using article title XXX
-# language=XXX set content language to XXX for this test
-# variant=XXX set the variant of language for this test (eg zh-tw)
-# disabled do not run test
-# showtitle make the first line the title
-# comment run through Linker::formatComment() instead of main parser
-# local format section links in edit comment text as local links
-#
-# For testing purposes, temporary articles can created:
-# !!article / NAMESPACE:TITLE / !!text / ARTICLE TEXT / !!endarticle
-# where '/' denotes a newline.
-
-# This is the standard article assumed to exist.
-!! article
-Main Page
-!! text
-blah blah
-!! endarticle
-
-!!article
-Template:Foo
-!!text
-FOO
-!!endarticle
-
-!! article
-Template:Blank
-!! text
-!! endarticle
-
-!! article
-Template:!
-!! text
-|
-!! endarticle
-
-!!article
-MediaWiki:bad image list
-!!text
-* [[File:Bad.jpg]] except [[Nasty page]]
-!!endarticle
-
-!! article
-Template:inner list
-!! text
-* item 1
-!! endarticle
-
-###
-### Basic tests
-###
-!! test
-Blank input
-!! input
-!! result
-!! end
-
-
-!! test
-Simple paragraph
-!! input
-This is a simple paragraph.
-!! result
-<p>This is a simple paragraph.
-</p>
-!! end
-
-!! test
-Paragraphs with extra newline spacing
-!! input
-foo
-
-bar
-
-
-baz
-
-
-
-booz
-!! result
-<p>foo
-</p><p>bar
-</p><p><br />
-baz
-</p><p><br />
-</p><p>booz
-</p>
-!! end
-
-!! test
-Simple list
-!! input
-* Item 1
-* Item 2
-!! result
-<ul><li> Item 1
-</li><li> Item 2
-</li></ul>
-
-!! end
-
-!! test
-Italics and bold
-!! input
-* plain
-* plain''italic''plain
-* plain''italic''plain''italic''plain
-* plain'''bold'''plain
-* plain'''bold'''plain'''bold'''plain
-* plain''italic''plain'''bold'''plain
-* plain'''bold'''plain''italic''plain
-* plain''italic'''bold-italic'''italic''plain
-* plain'''bold''bold-italic''bold'''plain
-* plain'''''bold-italic'''italic''plain
-* plain'''''bold-italic''bold'''plain
-* plain''italic'''bold-italic'''''plain
-* plain'''bold''bold-italic'''''plain
-* plain l'''italic''plain
-* plain l''''bold''' plain
-!! result
-<ul><li> plain
-</li><li> plain<i>italic</i>plain
-</li><li> plain<i>italic</i>plain<i>italic</i>plain
-</li><li> plain<b>bold</b>plain
-</li><li> plain<b>bold</b>plain<b>bold</b>plain
-</li><li> plain<i>italic</i>plain<b>bold</b>plain
-</li><li> plain<b>bold</b>plain<i>italic</i>plain
-</li><li> plain<i>italic<b>bold-italic</b>italic</i>plain
-</li><li> plain<b>bold<i>bold-italic</i>bold</b>plain
-</li><li> plain<i><b>bold-italic</b>italic</i>plain
-</li><li> plain<b><i>bold-italic</i>bold</b>plain
-</li><li> plain<i>italic<b>bold-italic</b></i>plain
-</li><li> plain<b>bold<i>bold-italic</i></b>plain
-</li><li> plain l'<i>italic</i>plain
-</li><li> plain l'<b>bold</b> plain
-</li></ul>
-
-!! end
-
-###
-### 2-quote opening sequence tests
-###
-!! test
-Italics and bold: 2-quote opening sequence: (2,2)
-!! input
-''foo''
-!! result
-<p><i>foo</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 2-quote opening sequence: (2,3)
-!! input
-''foo'''
-!! result
-<p><i>foo'</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 2-quote opening sequence: (2,4)
-!! input
-''foo''''
-!! result
-<p><i>foo''</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 2-quote opening sequence: (2,5)
-!! input
-''foo'''''
-!! result
-<p><i>foo</i>
-</p>
-!!end
-
-
-###
-### 3-quote opening sequence tests
-###
-
-!! test
-Italics and bold: 3-quote opening sequence: (3,2)
-!! input
-'''foo''
-!! result
-<p>'<i>foo</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 3-quote opening sequence: (3,3)
-!! input
-'''foo'''
-!! result
-<p><b>foo</b>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 3-quote opening sequence: (3,4)
-!! input
-'''foo''''
-!! result
-<p><b>foo'</b>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 3-quote opening sequence: (3,5)
-!! input
-'''foo'''''
-!! result
-<p><b>foo</b>
-</p>
-!!end
-
-
-###
-### 4-quote opening sequence tests
-###
-
-!! test
-Italics and bold: 4-quote opening sequence: (4,2)
-!! input
-''''foo''
-!! result
-<p>''<i>foo</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 4-quote opening sequence: (4,3)
-!! input
-''''foo'''
-!! result
-<p>'<b>foo</b>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 4-quote opening sequence: (4,4)
-!! input
-''''foo''''
-!! result
-<p>'<b>foo'</b>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 4-quote opening sequence: (4,5)
-!! input
-''''foo'''''
-!! result
-<p>'<b>foo</b>
-</p>
-!!end
-
-
-###
-### 5-quote opening sequence tests
-###
-
-!! test
-Italics and bold: 5-quote opening sequence: (5,2)
-!! input
-'''''foo''
-!! result
-<p><b><i>foo</i></b>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 5-quote opening sequence: (5,3)
-!! input
-'''''foo'''
-!! result
-<p><i><b>foo</b></i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 5-quote opening sequence: (5,4)
-!! input
-'''''foo''''
-!! result
-<p><i><b>foo'</b></i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: 5-quote opening sequence: (5,5)
-!! input
-'''''foo'''''
-!! result
-<p><i><b>foo</b></i>
-</p>
-!!end
-
-###
-### multiple quote sequences in a line
-###
-!! test
-Italics and bold: multiple quote sequences: (2,4,2)
-!! input
-''foo''''bar''
-!! result
-<p><i>foo'<b>bar</b></i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: multiple quote sequences: (2,4,3)
-!! input
-''foo''''bar'''
-!! result
-<p><i>foo'<b>bar</b></i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: multiple quote sequences: (2,4,4)
-!! input
-''foo''''bar''''
-!! result
-<p><i>foo'<b>bar'</b></i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: multiple quote sequences: (3,4,2)
-!! input
-'''foo''''bar''
-!! result
-<p><b>foo'</b>bar
-</p>
-!!end
-
-
-!! test
-Italics and bold: multiple quote sequences: (3,4,3)
-!! input
-'''foo''''bar'''
-!! result
-<p><b>foo'</b>bar
-</p>
-!!end
-
-###
-### other quote tests
-###
-!! test
-Italics and bold: other quote tests: (2,3,5)
-!! input
-''this is about '''foo's family'''''
-!! result
-<p><i>this is about <b>foo's family</b></i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: other quote tests: (2,(3,3),2)
-!! input
-''this is about '''foo's''' family''
-!! result
-<p><i>this is about <b>foo's</b> family</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: other quote tests: (3,2,3,2)
-!! input
-'''this is about ''foo'''s family''
-!! result
-<p><b>this is about <i>foo</i></b><i>s family</i>
-</p>
-!!end
-
-
-!! test
-Italics and bold: other quote tests: (3,2,3,3)
-!! input
-'''this is about ''foo'''s family'''
-!! result
-<p>'<i>this is about </i>foo<b>s family</b>
-</p>
-!!end
-
-
-
-!! test
-Italics and bold: other quote tests: (3,(2,2),3)
-!! input
-'''this is about ''foo's'' family'''
-!! result
-<p><b>this is about <i>foo's</i> family</b>
-</p>
-!!end
-
-###
-### <nowiki> test cases
-###
-
-!! test
-<nowiki> unordered list
-!! input
-<nowiki>* This is not an unordered list item.</nowiki>
-!! result
-<p>* This is not an unordered list item.
-</p>
-!! end
-
-!! test
-<nowiki> spacing
-!! input
-<nowiki>Lorem ipsum dolor
-
-sed abit.
- sed nullum.
-
-:and a colon
-</nowiki>
-!! result
-<p>Lorem ipsum dolor
-
-sed abit.
- sed nullum.
-
-:and a colon
-
-</p>
-!! end
-
-!! test
-nowiki 3
-!! input
-:There is not nowiki.
-:There is <nowiki>nowiki</nowiki>.
-
-#There is not nowiki.
-#There is <nowiki>nowiki</nowiki>.
-
-*There is not nowiki.
-*There is <nowiki>nowiki</nowiki>.
-!! result
-<dl><dd>There is not nowiki.
-</dd><dd>There is nowiki.
-</dd></dl>
-<ol><li>There is not nowiki.
-</li><li>There is nowiki.
-</li></ol>
-<ul><li>There is not nowiki.
-</li><li>There is nowiki.
-</li></ul>
-
-!! end
-
-
-###
-### Comments
-###
-!! test
-Comment test 1
-!! input
-<!-- comment 1 --> asdf
-<!-- comment 2 -->
-!! result
-<pre>asdf
-</pre>
-
-!! end
-
-!! test
-Comment test 2
-!! input
-asdf
-<!-- comment 1 -->
-jkl
-!! result
-<p>asdf
-jkl
-</p>
-!! end
-
-!! test
-Comment test 3
-!! input
-asdf
-<!-- comment 1 -->
-<!-- comment 2 -->
-jkl
-!! result
-<p>asdf
-jkl
-</p>
-!! end
-
-!! test
-Comment test 4
-!! input
-asdf<!-- comment 1 -->jkl
-!! result
-<p>asdfjkl
-</p>
-!! end
-
-!! test
-Comment spacing
-!! input
-a
- <!-- foo --> b <!-- bar -->
-c
-!! result
-<p>a
-</p>
-<pre> b
-</pre>
-<p>c
-</p>
-!! end
-
-!! test
-Comment whitespace
-!! input
-<!-- returns a single newline, not nothing, since the newline after > is not stripped -->
-!! result
-
-!! end
-
-!! test
-Comment semantics and delimiters
-!! input
-<!-- --><!----><!-----><!------>
-!! result
-
-!! end
-
-!! test
-Comment semantics and delimiters, redux
-!! input
-<!-- In SGML every "foo" here would actually show up in the text -- foo -- bar
--- foo -- funky huh? ... -->
-!! result
-
-!! end
-
-!! test
-Comment semantics and delimiters: directors cut
-!! input
-<!-- ... However we like to keep things simple and somewhat XML-ish so we eat
-everything starting with < followed by !-- until the first -- and > we see,
-that wouldn't be valid XML however, since in XML -- has to terminate a comment
--->-->
-!! result
-<p>--&gt;
-</p>
-!! end
-
-!! test
-Comment semantics: nesting
-!! input
-<!--<!-- no, we're not going to do anything fancy here -->-->
-!! result
-<p>--&gt;
-</p>
-!! end
-
-!! test
-Comment semantics: unclosed comment at end
-!! input
-<!--This comment will run out to the end of the document
-!! result
-
-!! end
-
-!! test
-Comment in template title
-!! input
-{{f<!---->oo}}
-!! result
-<p>FOO
-</p>
-!! end
-
-!! test
-Comment on its own line post-expand
-!! input
-a
-{{blank}}<!---->
-b
-!! result
-<p>a
-</p><p>b
-</p>
-!! end
-
-###
-### Preformatted text
-###
-!! test
-Preformatted text
-!! input
- This is some
- Preformatted text
- With ''italic''
- And '''bold'''
- And a [[Main Page|link]]
-!! result
-<pre>This is some
-Preformatted text
-With <i>italic</i>
-And <b>bold</b>
-And a <a href="/wiki/Main_Page" title="Main Page">link</a>
-</pre>
-!! end
-
-!! test
-<pre> with <nowiki> inside (compatibility with 1.6 and earlier)
-!! input
-<pre><nowiki>
-<b>
-<cite>
-<em>
-</nowiki></pre>
-!! result
-<pre>
-&lt;b&gt;
-&lt;cite&gt;
-&lt;em&gt;
-</pre>
-
-!! end
-
-!! test
-Regression with preformatted in <center>
-!! input
-<center>
- Blah
-</center>
-!! result
-<center>
-<pre>Blah
-</pre>
-</center>
-
-!! end
-
-# Expected output in the following test is not really expected (there should be
-# <pre> in the output) -- it's only testing for well-formedness.
-!! test
-Bug 6200: Preformatted in <blockquote>
-!! input
-<blockquote>
- Blah
-</blockquote>
-!! result
-<blockquote>
- Blah
-</blockquote>
-
-!! end
-
-!! test
-<pre> with attributes (bug 3202)
-!! input
-<pre style="background: blue; color:white">Bluescreen of WikiDeath</pre>
-!! result
-<pre style="background: blue; color:white">Bluescreen of WikiDeath</pre>
-
-!! end
-
-!! test
-<pre> with width attribute (bug 3202)
-!! input
-<pre width="8">Narrow screen goodies</pre>
-!! result
-<pre width="8">Narrow screen goodies</pre>
-
-!! end
-
-!! test
-<pre> with forbidden attribute (bug 3202)
-!! input
-<pre width="8" onmouseover="alert(document.cookie)">Narrow screen goodies</pre>
-!! result
-<pre width="8">Narrow screen goodies</pre>
-
-!! end
-
-!! test
-<pre> with forbidden attribute values (bug 3202)
-!! input
-<pre width="8" style="border-width: expression(alert(document.cookie))">Narrow screen goodies</pre>
-!! result
-<pre width="8" style="/* insecure input */">Narrow screen goodies</pre>
-
-!! end
-
-!! test
-<nowiki> inside <pre> (bug 13238)
-!! input
-<pre>
-<nowiki>
-</pre>
-<pre>
-<nowiki></nowiki>
-</pre>
-<pre><nowiki><nowiki></nowiki>Foo<nowiki></nowiki></nowiki></pre>
-!! result
-<pre>
-&lt;nowiki&gt;
-</pre>
-<pre>
-
-</pre>
-<pre>&lt;nowiki&gt;Foo&lt;/nowiki&gt;</pre>
-
-!! end
-
-!! test
-<nowiki> and <pre> preference (first one wins)
-!! input
-<pre>
-<nowiki>
-</pre>
-</nowiki>
-</pre>
-
-<nowiki>
-<pre>
-<nowiki>
-</pre>
-</nowiki>
-</pre>
-
-!! result
-<pre>
-&lt;nowiki&gt;
-</pre>
-<p>&lt;/nowiki&gt;
-&lt;/pre&gt;
-</p><p>
-&lt;pre&gt;
-&lt;nowiki&gt;
-&lt;/pre&gt;
-
-&lt;/pre&gt;
-</p>
-!! end
-
-
-###
-### Definition lists
-###
-!! test
-Simple definition
-!! input
-; name : Definition
-!! result
-<dl><dt> name&#160;</dt><dd> Definition
-</dd></dl>
-
-!! end
-
-!! test
-Definition list for indentation only
-!! input
-: Indented text
-!! result
-<dl><dd> Indented text
-</dd></dl>
-
-!! end
-
-!! test
-Definition list with no space
-!! input
-;name:Definition
-!! result
-<dl><dt>name</dt><dd>Definition
-</dd></dl>
-
-!!end
-
-!! test
-Definition list with URL link
-!! input
-; http://example.com/ : definition
-!! result
-<dl><dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&#160;</dt><dd> definition
-</dd></dl>
-
-!! end
-
-!! test
-Definition list with bracketed URL link
-!! input
-;[http://www.example.com/ Example]:Something about it
-!! result
-<dl><dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt><dd>Something about it
-</dd></dl>
-
-!! end
-
-!! test
-Definition list with wikilink containing colon
-!! input
-; [[Help:FAQ]]: The least-read page on Wikipedia
-!! result
-<dl><dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt><dd> The least-read page on Wikipedia
-</dd></dl>
-
-!! end
-
-# At Brion's and JeLuF's insistence... :)
-!! test
-Definition list with news link containing colon
-!! input
-; news:alt.wikipedia.rox: This isn't even a real newsgroup!
-!! result
-<dl><dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt><dd> This isn't even a real newsgroup!
-</dd></dl>
-
-!! end
-
-!! test
-Malformed definition list with colon
-!! input
-; news:alt.wikipedia.rox -- don't crash or enter an infinite loop
-!! result
-<dl><dt> <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
-</dt></dl>
-
-!! end
-
-!! test
-Definition lists: colon in external link text
-!! input
-; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
-!! result
-<dl><dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt><dd> OK, I made that up
-</dd></dl>
-
-!! end
-
-!! test
-Definition lists: colon in HTML attribute
-!! input
-;<b style="display: inline">bold</b>
-!! result
-<dl><dt><b style="display: inline">bold</b>
-</dt></dl>
-
-!! end
-
-
-!! test
-Definition lists: self-closed tag
-!! input
-;one<br/>two : two-line fun
-!! result
-<dl><dt>one<br />two&#160;</dt><dd> two-line fun
-</dd></dl>
-
-!! end
-
-!! test
-Bug 11748: Literal closing tags
-!! options
-disabled
-!! input
-<dl>
-<dt>test 1</dt>
-<dd>test test test test test</dd>
-<dt>test 2</dt>
-<dd>test test test test test</dd>
-</dl>
-!! result
-<dl>
-<dt>test 1</dt>
-<dd>test test test test test</dd>
-<dt>test 2</dt>
-<dd>test test test test test</dd>
-</dl>
-!! end
-
-!! test
-Definition and unordered list using wiki syntax nested in unordered list using html tags.
-!! input
-<ul><li>
-; term : description
-* unordered
-</li>
-</ul>
-!! result
-<ul><li>
-<dl><dt> term&#160;</dt><dd> description
-</dd></dl>
-<ul><li> unordered
-</li></ul>
-</li>
-</ul>
-
-!! end
-
-!! test
-Definition list with empty definition and following paragraph
-!! input
-; term:
-Paragraph text
-!! result
-<dl><dt> term</dt><dd>
-</dd></dl>
-<p>Paragraph text
-</p>
-!! end
-
-!! test
-Definition Lists: No nesting: Multiple dd's
-!! input
-;x
-:a
-:b
-!! result
-<dl><dt>x
-</dt><dd>a
-</dd><dd>b
-</dd></dl>
-
-!! end
-
-!! test
-Definition Lists: Indentation: Regular
-!! input
-:i1
-::i2
-:::i3
-!! result
-<dl><dd>i1
-<dl><dd>i2
-<dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
-
-!! end
-
-!! test
-Definition Lists: Indentation: Missing 1st level
-!! input
-::i2
-:::i3
-!! result
-<dl><dd><dl><dd>i2
-<dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
-
-!! end
-
-!! test
-Definition Lists: Indentation: Multi-level indent
-!! input
-:::i3
-!! result
-<dl><dd><dl><dd><dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
-
-!! end
-
-## The PHP parser treats : items (dd) without a corresponding ; item (dt)
-## as an empty dt item. It also ignores all but the last ";" when followed
-## by ":" later on. So, ";" are not ignored in ";;;t3" but are ignored in
-## ";;;t3 :d1". So, PHP parser behavior is a little inconsistent wrt multiple
-## ";"s.
-##
-## Ex: ";;t2 ::d2" is transformed into:
-##
-## <dl>
-## <dt>t2 </dt>
-## <dd>
-## <dl>
-## <dt></dt>
-## <dd>d2</dd>
-## </dl>
-## </dd>
-## </dl>
-##
-## But, Parsoid treats "; :" as a tight atomic unit and excess ":" as plain text
-## So, the same wikitext above (;;t2 ::d2) is transformed into:
-##
-## <dl>
-## <dt>
-## <dl>
-## <dt>t2 </dt>
-## <dd>:d2</dd>
-## </dl>
-## </dt>
-## </dl>
-##
-## All Parsoid only definition list tests have this difference.
-##
-## See also: https://bugzilla.wikimedia.org/show_bug.cgi?id=6569
-## and http://lists.wikimedia.org/pipermail/wikitext-l/2011-November/000483.html
-
-!! test
-Definition Lists: Nesting: Multi-level (Parsoid only)
-!! options
-disabled
-!! input
-;t1 :d1
-;;t2 ::d2
-;;;t3 :::d3
-!! result
-<dl>
- <dt>t1 </dt>
- <dd>d1</dd>
- <dt>
- <dl>
- <dt>t2 </dt>
- <dd>:d2</dd>
- <dt>
- <dl>
- <dt>t3 </dt>
- <dd>::d3</dd>
- </dl>
- </dt>
- </dl>
- </dt>
-</dl>
-
-
-!! end
-
-
-!! test
-Definition Lists: Nesting: Test 2 (Parsoid only)
-!! options
-disabled
-!! input
-;t1
-::d2
-!! result
-<dl>
- <dt>t1</dt>
- <dd>
- <dl>
- <dd>d2</dd>
- </dl>
- </dd>
-</dl>
-
-!! end
-
-
-!! test
-Definition Lists: Nesting: Test 3 (Parsoid only)
-!! options
-disabled
-!! input
-:;t1
-::::d2
-!! result
-<dl>
- <dd>
- <dl>
- <dt>t1</dt>
- <dd>
- <dl>
- <dd>
- <dl>
- <dd>d2</dd>
- </dl>
- </dd>
- </dl>
- </dd>
- </dl>
- </dd>
-</dl>
-
-!! end
-
-
-!! test
-Definition Lists: Nesting: Test 4
-!! input
-::;t3
-:::d3
-!! result
-<dl><dd><dl><dd><dl><dt>t3
-</dt><dd>d3
-</dd></dl>
-</dd></dl>
-</dd></dl>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 1
-!! input
-:;* foo
-::* bar
-:; baz
-!! result
-<dl><dd><dl><dt><ul><li> foo
-</li><li> bar
-</li></ul>
-</dt></dl>
-<dl><dt> baz
-</dt></dl>
-</dd></dl>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 2
-!! input
-*: d1
-*: d2
-!! result
-<ul><li><dl><dd> d1
-</dd><dd> d2
-</dd></dl>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 3
-!! input
-*::: d1
-*::: d2
-!! result
-<ul><li><dl><dd><dl><dd><dl><dd> d1
-</dd><dd> d2
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 4
-!! input
-*;d1 :d2
-*;d3 :d4
-!! result
-<ul><li><dl><dt>d1&#160;</dt><dd>d2
-</dd><dt>d3&#160;</dt><dd>d4
-</dd></dl>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 5
-!! input
-*:d1
-*:: d2
-!! result
-<ul><li><dl><dd>d1
-<dl><dd> d2
-</dd></dl>
-</dd></dl>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 6
-!! input
-#*:d1
-#*::: d3
-!! result
-<ol><li><ul><li><dl><dd>d1
-<dl><dd><dl><dd> d3
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
-</li></ol>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 7
-!! input
-:* d1
-:* d2
-!! result
-<dl><dd><ul><li> d1
-</li><li> d2
-</li></ul>
-</dd></dl>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 8
-!! input
-:* d1
-::* d2
-!! result
-<dl><dd><ul><li> d1
-</li></ul>
-<dl><dd><ul><li> d2
-</li></ul>
-</dd></dl>
-</dd></dl>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 9
-!! input
-*;foo :bar
-!! result
-<ul><li><dl><dt>foo&#160;</dt><dd>bar
-</dd></dl>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 10
-!! input
-*#;foo :bar
-!! result
-<ul><li><ol><li><dl><dt>foo&#160;</dt><dd>bar
-</dd></dl>
-</li></ol>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 11
-!! input
-*#*#;*;;foo :bar
-*#*#;boo :baz
-!! result
-<ul><li><ol><li><ul><li><ol><li><dl><dt>foo&#160;</dt><dd><ul><li><dl><dt><dl><dt>bar
-</dt></dl>
-</dd></dl>
-</li></ul>
-</dd></dl>
-<dl><dt>boo&#160;</dt><dd>baz
-</dd></dl>
-</li></ol>
-</li></ul>
-</li></ol>
-</li></ul>
-
-!! end
-
-
-!! test
-Definition Lists: Weird Ones: Test 1
-!! input
-*#;*::;; foo : bar (who uses this?)
-!! result
-<ul><li><ol><li><dl><dt> foo&#160;</dt><dd><ul><li><dl><dd><dl><dd><dl><dt><dl><dt> bar (who uses this?)
-</dt></dl>
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
-</dd></dl>
-</li></ol>
-</li></ul>
-
-!! end
-
-###
-### External links
-###
-!! test
-External links: non-bracketed
-!! input
-Non-bracketed: http://example.com
-!! result
-<p>Non-bracketed: <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>
-</p>
-!! end
-
-!! test
-External links: numbered
-!! input
-Numbered: [http://example.com]
-Numbered: [http://example.net]
-Numbered: [http://example.com]
-!! result
-<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>
-!!end
-
-!! test
-External links: specified text
-!! input
-Specified text: [http://example.com link]
-!! result
-<p>Specified text: <a rel="nofollow" class="external text" href="http://example.com">link</a>
-</p>
-!!end
-
-!! test
-External links: trail
-!! input
-Linktrails should not work for external links: [http://example.com link]s
-!! result
-<p>Linktrails should not work for external links: <a rel="nofollow" class="external text" href="http://example.com">link</a>s
-</p>
-!! end
-
-!! test
-External links: dollar sign in URL
-!! input
-http://example.com/1$2345
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com/1$2345">http://example.com/1$2345</a>
-</p>
-!! end
-
-!! test
-External links: dollar sign in URL (named)
-!! input
-[http://example.com/1$2345]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://example.com/1$2345">[1]</a>
-</p>
-!!end
-
-!! test
-External links: open square bracket forbidden in URL (bug 4377)
-!! input
-http://example.com/1[2345
-!! result
-<p><a rel="nofollow" class="external free" 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)
-!! input
-[http://example.com/1[2345]
-!! result
-<p><a rel="nofollow" class="external text" href="http://example.com/1">[2345</a>
-</p>
-!!end
-
-!! test
-External links: nowiki in URL link text (bug 6230)
-!!input
-[http://example.com/ <nowiki>''example site''</nowiki>]
-!! result
-<p><a rel="nofollow" class="external text" href="http://example.com/">''example site''</a>
-</p>
-!! end
-
-!! test
-External links: newline forbidden in text (bug 6230 regression check)
-!! input
-[http://example.com/ first
-second]
-!! result
-<p>[<a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a> first
-second]
-</p>
-!!end
-
-!! test
-External links: protocol-relative URL in brackets
-!! input
-[//example.com/ Test]
-!! result
-<p><a rel="nofollow" class="external text" href="//example.com/">Test</a>
-</p>
-!! end
-
-!! test
-External links: protocol-relative URL in brackets without text
-!! input
-[//example.com]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="//example.com">[1]</a>
-</p>
-!! end
-
-!! test
-External links: protocol-relative URL in free text is left alone
-!! input
-//example.com/Foo
-!! result
-<p>//example.com/Foo
-</p>
-!!end
-
-!! test
-External links: protocol-relative URL in the middle of a word is left alone (bug 30269)
-!! input
-foo//example.com/Foo
-!! result
-<p>foo//example.com/Foo
-</p>
-!! end
-
-!! test
-External image
-!! input
-External image: http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
-!! result
-<p>External image: <img src="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" />
-</p>
-!! end
-
-!! test
-External image from https
-!! input
-External image from https: https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
-!! result
-<p>External image from https: <img src="https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" />
-</p>
-!! end
-
-!! test
-Link to non-http image, no img tag
-!! input
-Link to non-http image, no img tag: ftp://example.com/test.jpg
-!! result
-<p>Link to non-http image, no img tag: <a rel="nofollow" class="external free" href="ftp://example.com/test.jpg">ftp://example.com/test.jpg</a>
-</p>
-!! end
-
-!! test
-External links: terminating separator
-!! input
-Terminating separator: http://example.com/thing,
-!! result
-<p>Terminating separator: <a rel="nofollow" class="external free" href="http://example.com/thing">http://example.com/thing</a>,
-</p>
-!! end
-
-!! test
-External links: intervening separator
-!! input
-Intervening separator: http://example.com/1,2,3
-!! result
-<p>Intervening separator: <a rel="nofollow" class="external free" href="http://example.com/1,2,3">http://example.com/1,2,3</a>
-</p>
-!! end
-
-!! test
-External links: old bug with URL in query
-!! input
-Old bug with URL in query: [http://example.com/thing?url=http://example.com link]
-!! result
-<p>Old bug with URL in query: <a rel="nofollow" class="external text" href="http://example.com/thing?url=http://example.com">link</a>
-</p>
-!! end
-
-!! test
-External links: old URL-in-URL bug, mixed protocols
-!! input
-And again with mixed protocols: [ftp://example.com?url=http://example.com link]
-!! result
-<p>And again with mixed protocols: <a rel="nofollow" class="external text" href="ftp://example.com?url=http://example.com">link</a>
-</p>
-!!end
-
-!! test
-External links: URL in text
-!! input
-URL in text: [http://example.com http://example.com]
-!! result
-<p>URL in text: <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>
-</p>
-!! end
-
-!! test
-External links: Clickable images
-!! input
-ja-style clickable images: [http://example.com http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png]
-!! result
-<p>ja-style clickable images: <a rel="nofollow" class="external text" href="http://example.com"><img src="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png" alt="Ncwikicol.png" /></a>
-</p>
-!!end
-
-!! test
-External links: raw ampersand
-!! input
-Old &amp; use: http://x&y
-!! result
-<p>Old &amp; use: <a rel="nofollow" class="external free" href="http://x&amp;y">http://x&amp;y</a>
-</p>
-!! end
-
-!! test
-External links: encoded ampersand
-!! input
-Old &amp; use: http://x&amp;y
-!! result
-<p>Old &amp; use: <a rel="nofollow" class="external free" href="http://x&amp;y">http://x&amp;y</a>
-</p>
-!! end
-
-!! test
-External links: encoded equals (bug 6102)
-!! input
-http://example.com/?foo&#61;bar
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com/?foo=bar">http://example.com/?foo=bar</a>
-</p>
-!! end
-
-!! test
-External links: [raw ampersand]
-!! input
-Old &amp; use: [http://x&y]
-!! result
-<p>Old &amp; use: <a rel="nofollow" class="external autonumber" href="http://x&amp;y">[1]</a>
-</p>
-!! end
-
-!! test
-External links: [encoded ampersand]
-!! input
-Old &amp; use: [http://x&amp;y]
-!! result
-<p>Old &amp; use: <a rel="nofollow" class="external autonumber" href="http://x&amp;y">[1]</a>
-</p>
-!! end
-
-!! test
-External links: [encoded equals] (bug 6102)
-!! input
-[http://example.com/?foo&#61;bar]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://example.com/?foo=bar">[1]</a>
-</p>
-!! end
-
-!! test
-External links: [IDN ignored character reference in hostname; strip it right off]
-!! input
-[http://e&zwnj;xample.com/]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://example.com/">[1]</a>
-</p>
-!! end
-
-# FIXME: This test (the IDN characters in the text of a link) is an inconsistency.
-# Where an external link could easily circumvent the sanitization of the text of
-# a link like this (where an IDN-ignore character is in the URL somewhere), this
-# test demands a higher standard. That's a bit strange.
-#
-# Example:
-#
-# http://e‌xample.com -> [http://example.com|http://example.com]
-# [http://example.com|http://e‌xample.com] -> [http://example.com|http://e‌xample.com]
-#
-# The first example is sanitized, but the second is not. Any security benefits
-# from this production are trivial to circumvent. Either remove this test and
-# let the parser(s) do their thing unaccosted, or fix the inconsistency and change
-# the test accordingly.
-#
-# All our love,
-# The Parsoid team.
-!! test
-External links: IDN ignored character reference in hostname; strip it right off
-!! input
-http://e&zwnj;xample.com/
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>
-</p>
-!! end
-
-!! test
-External links: www.jpeg.org (bug 554)
-!! input
-http://www.jpeg.org
-!!result
-<p><a rel="nofollow" class="external free" href="http://www.jpeg.org">http://www.jpeg.org</a>
-</p>
-!! end
-
-!! test
-External links: URL within URL (original bug 2)
-!! input
-[http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp]
-!! result
-<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>
-!! end
-
-!! test
-BUG 361: URL inside bracketed URL
-!! input
-[http://www.example.com/foo http://www.example.com/bar]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/foo">http://www.example.com/bar</a>
-</p>
-!! end
-
-!! test
-BUG 361: URL within URL, not bracketed
-!! input
-http://www.example.com/foo?=http://www.example.com/bar
-!! result
-<p><a rel="nofollow" class="external free" href="http://www.example.com/foo?=http://www.example.com/bar">http://www.example.com/foo?=http://www.example.com/bar</a>
-</p>
-!! end
-
-!! test
-BUG 289: ">"-token in URL-tail
-!! input
-http://www.example.com/<hello>
-!! result
-<p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a>&lt;hello&gt;
-</p>
-!!end
-
-!! test
-BUG 289: literal ">"-token in URL-tail
-!! input
-http://www.example.com/<b>html</b>
-!! result
-<p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a><b>html</b>
-</p>
-!!end
-
-!! test
-BUG 289: ">"-token in bracketed URL
-!! input
-[http://www.example.com/<hello> stuff]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/">&lt;hello&gt; stuff</a>
-</p>
-!!end
-
-!! test
-BUG 289: literal ">"-token in bracketed URL
-!! input
-[http://www.example.com/<b>html</b> stuff]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/"><b>html</b> stuff</a>
-</p>
-!!end
-
-!! test
-BUG 289: literal double quote at end of URL
-!! input
-http://www.example.com/"hello"
-!! result
-<p><a rel="nofollow" class="external free" href="http://www.example.com/">http://www.example.com/</a>"hello"
-</p>
-!!end
-
-!! test
-BUG 289: literal double quote in bracketed URL
-!! input
-[http://www.example.com/"hello" stuff]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/">"hello" stuff</a>
-</p>
-!!end
-
-!! test
-External links: multiple legal whitespace is fine, Magnus. Don't break it please. (bug 5081)
-!! input
-[http://www.example.com test]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com">test</a>
-</p>
-!! end
-
-!! test
-External links: wiki links within external link (Bug 3695)
-!! input
-[http://example.com [[wikilink]] embedded in ext link]
-!! result
-<p><a rel="nofollow" class="external text" href="http://example.com"></a><a href="/index.php?title=Wikilink&amp;action=edit&amp;redlink=1" class="new" title="Wikilink (page does not exist)">wikilink</a><a rel="nofollow" class="external text" href="http://example.com"> embedded in ext link</a>
-</p>
-!! end
-
-!! test
-BUG 787: Links with one slash after the url protocol are invalid
-!! input
-http:/example.com
-
-[http:/example.com title]
-!! result
-<p>http:/example.com
-</p><p>[http:/example.com title]
-</p>
-!! end
-
-!! test
-Bug 2702: Mismatched <i>, <b> and <a> tags are invalid
-!! input
-''[http://example.com text'']
-[http://example.com '''text]'''
-''Something [http://example.com in italic'']
-''Something [http://example.com mixed''''', even bold]'''
-'''''Now [http://example.com both''''']
-!! result
-<p><a rel="nofollow" class="external text" href="http://example.com"><i>text</i></a>
-<a rel="nofollow" class="external text" href="http://example.com"><b>text</b></a>
-<i>Something </i><a rel="nofollow" class="external text" href="http://example.com"><i>in italic</i></a>
-<i>Something </i><a rel="nofollow" class="external text" href="http://example.com"><i>mixed</i><b>, even bold</b></a>
-<i><b>Now </b></i><a rel="nofollow" class="external text" href="http://example.com"><i><b>both</b></i></a>
-</p>
-!! end
-
-
-!! test
-Bug 4781: %26 in URL
-!! input
-http://www.example.com/?title=AT%26T
-!! result
-<p><a rel="nofollow" class="external free" 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
-# % is actually legal in HTML5. Any change in output would need testing though.
-!! test
-Bug 4781, 5267: %25 in URL
-!! input
-http://www.example.com/?title=100%25_Bran
-!! result
-<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>
-!! end
-
-!! test
-Bug 4781, 5267: %28, %29 in URL
-!! input
-http://www.example.com/?title=Ben-Hur_%281959_film%29
-!! result
-<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>
-!! end
-
-
-!! test
-Bug 4781: %26 in autonumber URL
-!! input
-[http://www.example.com/?title=AT%26T]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=AT%26T">[1]</a>
-</p>
-!! end
-
-!! test
-Bug 4781, 5267: %26 in autonumber URL
-!! input
-[http://www.example.com/?title=100%25_Bran]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=100%25_Bran">[1]</a>
-</p>
-!! end
-
-!! test
-Bug 4781, 5267: %28, %29 in autonumber URL
-!! input
-[http://www.example.com/?title=Ben-Hur_%281959_film%29]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">[1]</a>
-</p>
-!! end
-
-
-!! test
-Bug 4781: %26 in bracketed URL
-!! input
-[http://www.example.com/?title=AT%26T link]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/?title=AT%26T">link</a>
-</p>
-!! end
-
-!! test
-Bug 4781, 5267: %26 in bracketed URL
-!! input
-[http://www.example.com/?title=100%25_Bran link]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/?title=100%25_Bran">link</a>
-</p>
-!! end
-
-!! test
-Bug 4781, 5267: %28, %29 in bracketed URL
-!! input
-[http://www.example.com/?title=Ben-Hur_%281959_film%29 link]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">link</a>
-</p>
-!! end
-
-!! test
-External link containing double-single-quotes in text '' (bug 4598 sanity check)
-!! input
-Some [http://example.com/ pretty ''italics'' and stuff]!
-!! result
-<p>Some <a rel="nofollow" class="external text" href="http://example.com/">pretty <i>italics</i> and stuff</a>!
-</p>
-!! end
-
-!! test
-External link containing double-single-quotes in text embedded in italics (bug 4598 sanity check)
-!! input
-''Some [http://example.com/ pretty ''italics'' and stuff]!''
-!! result
-<p><i>Some </i><a rel="nofollow" class="external text" href="http://example.com/"><i>pretty </i>italics<i> and stuff</i></a><i>!</i>
-</p>
-!! end
-
-!! test
-External link containing double-single-quotes with no space separating the url from text in italics
-!! input
-[http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm''La muerte de Casagemas'' (1901) en el sitio de [[Museo Picasso (París)|Museo Picasso]].]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.musee-picasso.fr/pages/page_id18528_u1l2.htm"><i>La muerte de Casagemas</i> (1901) en el sitio de <a href="/index.php?title=Museo_Picasso_(Par%C3%ADs)&amp;action=edit&amp;redlink=1" class="new" title="Museo Picasso (París) (page does not exist)">Museo Picasso</a>.</a>
-</p>
-!! end
-
-!! test
-URL-encoding in URL functions (single parameter)
-!! input
-{{localurl:Some page|amp=&}}
-!! result
-<p>/index.php?title=Some_page&amp;amp=&amp;
-</p>
-!! end
-
-!! test
-URL-encoding in URL functions (multiple parameters)
-!! input
-{{localurl:Some page|q=?&amp=&}}
-!! result
-<p>/index.php?title=Some_page&amp;q=?&amp;amp=&amp;
-</p>
-!! end
-
-!! test
-Brackets in urls
-!! input
-http://example.com/index.php?foozoid%5B%5D=bar
-
-http://example.com/index.php?foozoid&#x5B;&#x5D;=bar
-!! result
-<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>
-!! end
-
-!! test
-IPv6 urls (bug 21261)
-!! options
-disabled
-!! input
-http://[2404:130:0:1000::187:2]/index.php
-!! result
-<p><a rel="nofollow" class="external free" href="http://[2404:130:0:1000::187:2]/index.php">http://[2404:130:0:1000::187:2]/index.php</a>
-</p>
-!! end
-
-###
-### Quotes
-###
-
-!! test
-Quotes
-!! input
-Normal text. '''Bold text.''' Normal text. ''Italic text.''
-
-Normal text. '''''Bold italic text.''''' Normal text.
-!!result
-<p>Normal text. <b>Bold text.</b> Normal text. <i>Italic text.</i>
-</p><p>Normal text. <i><b>Bold italic text.</b></i> Normal text.
-</p>
-!! end
-
-
-!! test
-Unclosed and unmatched quotes
-!! input
-'''''Bold italic text '''with bold deactivated''' in between.'''''
-
-'''''Bold italic text ''with italic deactivated'' in between.'''''
-
-'''Bold text..
-
-..spanning two paragraphs (should not work).'''
-
-'''Bold tag left open
-
-''Italic tag left open
-
-Normal text.
-
-<!-- Unmatching number of opening, closing tags: -->
-'''This year''''s election ''should'' beat '''last year''''s.
-
-''Tom'''s car is bigger than ''Susan'''s.
-
-Plain ''italic'''s plain
-!! result
-<p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i>
-</p><p><b><i>Bold italic text </i>with italic deactivated<i> in between.</i></b>
-</p><p><b>Bold text..</b>
-</p><p>..spanning two paragraphs (should not work).
-</p><p><b>Bold tag left open</b>
-</p><p><i>Italic tag left open</i>
-</p><p>Normal text.
-</p><p><b>This year'</b>s election <i>should</i> beat <b>last year'</b>s.
-</p><p><i>Tom<b>s car is bigger than </b></i><b>Susan</b>s.
-</p><p>Plain <i>italic'</i>s plain
-</p>
-!! end
-
-###
-### Tables
-###
-### some content taken from http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide:_Using_tables
-###
-
-# This should not produce <table></table> as <table><tr><td></td></tr></table>
-# is the bare minimun required by the spec, see:
-# http://www.w3.org/TR/xhtml-modularization/dtd_module_defs.html#a_module_Basic_Tables
-!! test
-A table with no data.
-!! input
-{||}
-!! result
-!! end
-
-# A table with nothing but a caption is invalid XHTML, we might want to render
-# this as <p>caption</p>
-!! test
-A table with nothing but a caption
-!! input
-{|
-|+ caption
-|}
-!! result
-<table>
-<caption> caption
-</caption><tr><td></td></tr></table>
-
-!! end
-
-!! test
-Simple table
-!! input
-{|
-| 1 || 2
-|-
-| 3 || 4
-|}
-!! result
-<table>
-<tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
-<td> 4
-</td></tr></table>
-
-!! end
-
-!! test
-Multiplication table
-!! input
-{| border="1" cellpadding="2"
-|+Multiplication table
-|-
-! &times; !! 1 !! 2 !! 3
-|-
-! 1
-| 1 || 2 || 3
-|-
-! 2
-| 2 || 4 || 6
-|-
-! 3
-| 3 || 6 || 9
-|-
-! 4
-| 4 || 8 || 12
-|-
-! 5
-| 5 || 10 || 15
-|}
-!! result
-<table border="1" cellpadding="2">
-<caption>Multiplication table
-</caption>
-<tr>
-<th> &#215; </th>
-<th> 1 </th>
-<th> 2 </th>
-<th> 3
-</th></tr>
-<tr>
-<th> 1
-</th>
-<td> 1 </td>
-<td> 2 </td>
-<td> 3
-</td></tr>
-<tr>
-<th> 2
-</th>
-<td> 2 </td>
-<td> 4 </td>
-<td> 6
-</td></tr>
-<tr>
-<th> 3
-</th>
-<td> 3 </td>
-<td> 6 </td>
-<td> 9
-</td></tr>
-<tr>
-<th> 4
-</th>
-<td> 4 </td>
-<td> 8 </td>
-<td> 12
-</td></tr>
-<tr>
-<th> 5
-</th>
-<td> 5 </td>
-<td> 10 </td>
-<td> 15
-</td></tr></table>
-
-!! end
-
-!! test
-Table rowspan
-!! input
-{| border=1
-| Cell 1, row 1
-|rowspan=2| Cell 2, row 1 (and 2)
-| Cell 3, row 1
-|-
-| Cell 1, row 2
-| Cell 3, row 2
-|}
-!! result
-<table border="1">
-<tr>
-<td> Cell 1, row 1
-</td>
-<td rowspan="2"> Cell 2, row 1 (and 2)
-</td>
-<td> Cell 3, row 1
-</td></tr>
-<tr>
-<td> Cell 1, row 2
-</td>
-<td> Cell 3, row 2
-</td></tr></table>
-
-!! end
-
-!! test
-Nested table
-!! input
-{| border=1
-| &alpha;
-|
-{| bgcolor=#ABCDEF border=2
-|nested
-|-
-|table
-|}
-|the original table again
-|}
-!! result
-<table border="1">
-<tr>
-<td> &#945;
-</td>
-<td>
-<table bgcolor="#ABCDEF" border="2">
-<tr>
-<td>nested
-</td></tr>
-<tr>
-<td>table
-</td></tr></table>
-</td>
-<td>the original table again
-</td></tr></table>
-
-!! end
-
-!! test
-Invalid attributes in table cell (bug 1830)
-!! input
-{|
-|Cell:|broken
-|}
-!! result
-<table>
-<tr>
-<td>broken
-</td></tr></table>
-
-!! end
-
-
-!! test
-Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitech-l/2006-April/022293.html)
-!! input
-{|
-| |[ftp://|x||]" onmouseover="alert(document.cookie)">test
-!! result
-<table>
-<tr>
-<td>[<a rel="nofollow" class="external free" href="ftp://%7Cx">ftp://%7Cx</a></td>
-<td>]" onmouseover="alert(document.cookie)"&gt;test
-</td>
-</tr>
-</table>
-
-!! end
-
-
-!! test
-Indented table markup mixed with indented pre content (proposed in bug 6200)
-!! input
- <table>
- <tr>
- <td>
- Text that should be rendered preformatted
- </td>
- </tr>
- </table>
-!! result
- <table>
- <tr>
- <td>
-<pre>Text that should be rendered preformatted
-</pre>
- </td>
- </tr>
- </table>
-
-!! end
-
-
-###
-### Internal links
-###
-!! test
-Plain link, capitalized
-!! input
-[[Main Page]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
-!! end
-
-!! test
-Plain link, uncapitalized
-!! input
-[[main Page]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">main Page</a>
-</p>
-!! end
-
-!! test
-Piped link
-!! input
-[[Main Page|The Main Page]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">The Main Page</a>
-</p>
-!! end
-
-!! test
-Broken link
-!! input
-[[Zigzagzogzagzig]]
-!! result
-<p><a href="/index.php?title=Zigzagzogzagzig&amp;action=edit&amp;redlink=1" class="new" title="Zigzagzogzagzig (page does not exist)">Zigzagzogzagzig</a>
-</p>
-!! end
-
-!! test
-Broken link with fragment
-!! input
-[[Zigzagzogzagzig#zug]]
-!! result
-<p><a href="/index.php?title=Zigzagzogzagzig&amp;action=edit&amp;redlink=1" class="new" title="Zigzagzogzagzig (page does not exist)">Zigzagzogzagzig#zug</a>
-</p>
-!! end
-
-!! test
-Special page link with fragment
-!! input
-[[Special:Version#anchor]]
-!! result
-<p><a href="/wiki/Special:Version#anchor" title="Special:Version">Special:Version#anchor</a>
-</p>
-!! end
-
-!! test
-Nonexistent special page link with fragment
-!! input
-[[Special:ThisNameWillHopefullyNeverBeUsed#anchor]]
-!! result
-<p><a href="/wiki/Special:ThisNameWillHopefullyNeverBeUsed" class="new" title="Special:ThisNameWillHopefullyNeverBeUsed (page does not exist)">Special:ThisNameWillHopefullyNeverBeUsed#anchor</a>
-</p>
-!! end
-
-!! test
-Link with prefix
-!! input
-xxx[[main Page]], xxx[[Main Page]], Xxx[[main Page]] XXX[[main Page]], XXX[[Main Page]]
-!! result
-<p>xxx<a href="/wiki/Main_Page" title="Main Page">main Page</a>, xxx<a href="/wiki/Main_Page" title="Main Page">Main Page</a>, Xxx<a href="/wiki/Main_Page" title="Main Page">main Page</a> XXX<a href="/wiki/Main_Page" title="Main Page">main Page</a>, XXX<a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
-!! end
-
-!! test
-Link with suffix
-!! input
-[[Main Page]]xxx, [[Main Page]]XXX, [[Main Page]]!!!
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Pagexxx</a>, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>XXX, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>!!!
-</p>
-!! end
-
-!! test
-Link with 3 brackets
-!! input
-[[[main page]]]
-!! result
-<p>[[[main page]]]
-</p>
-!! end
-
-!! test
-Piped link with 3 brackets
-!! input
-[[[main page|the main page]]]
-!! result
-<p>[[[main page|the main page]]]
-</p>
-!! end
-
-!! test
-Link with multiple pipes
-!! input
-[[Main Page|The|Main|Page]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">The|Main|Page</a>
-</p>
-!! end
-
-!! test
-Link to namespaces
-!! input
-[[Talk:Parser testing]], [[Meta:Disclaimers]]
-!! result
-<p><a href="/index.php?title=Talk:Parser_testing&amp;action=edit&amp;redlink=1" class="new" title="Talk:Parser testing (page does not exist)">Talk:Parser testing</a>, <a href="/index.php?title=Meta:Disclaimers&amp;action=edit&amp;redlink=1" class="new" title="Meta:Disclaimers (page does not exist)">Meta:Disclaimers</a>
-</p>
-!! end
-
-!! test
-Piped link to namespace
-!! input
-[[Meta:Disclaimers|The disclaimers]]
-!! result
-<p><a href="/index.php?title=Meta:Disclaimers&amp;action=edit&amp;redlink=1" class="new" title="Meta:Disclaimers (page does not exist)">The disclaimers</a>
-</p>
-!! end
-
-!! test
-Link containing }
-!! input
-[[Usually caused by a typo (oops}]]
-!! result
-<p>[[Usually caused by a typo (oops}]]
-</p>
-!! end
-
-!! test
-Link containing % (not as a hex sequence)
-!! input
-[[7% Solution]]
-!! result
-<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>
-</p>
-!! end
-
-!! test
-Link containing % as a single hex sequence interpreted to char
-!! input
-[[7%25 Solution]]
-!! result
-<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>
-</p>
-!!end
-
-!! test
-Link containing % as a double hex sequence interpreted to hex sequence
-!! input
-[[7%2525 Solution]]
-!! result
-<p>[[7%2525 Solution]]
-</p>
-!!end
-
-!! test
-Link containing "#<" and "#>" % as a hex sequences- these are valid section anchors
-Example for such a section: == < ==
-!! input
-[[%23%3c]][[%23%3e]]
-!! result
-<p><a href="#.3C">#&lt;</a><a href="#.3E">#&gt;</a>
-</p>
-!! end
-
-!! test
-Link containing "<#" and ">#" as a hex sequences
-!! input
-[[%3c%23]][[%3e%23]]
-!! result
-<p>[[%3c%23]][[%3e%23]]
-</p>
-!! end
-
-!! test
-Link containing double-single-quotes '' (bug 4598)
-!! input
-[[Lista d''e paise d''o munno]]
-!! result
-<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>
-!! end
-
-!! test
-Link containing double-single-quotes '' in text (bug 4598 sanity check)
-!! input
-Some [[Link|pretty ''italics'' and stuff]]!
-!! result
-<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>
-!! end
-
-!! test
-Link containing double-single-quotes '' in text embedded in italics (bug 4598 sanity check)
-!! input
-''Some [[Link|pretty ''italics'' and stuff]]!
-!! result
-<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>
-!! end
-
-!! test
-Link with double quotes in title part (literal) and alternate part (interpreted)
-!! input
-[[File:Denys Savchenko ''Pentecoste''.jpg]]
-
-[[''Pentecoste'']]
-
-[[''Pentecoste''|Pentecoste]]
-
-[[''Pentecoste''|''Pentecoste'']]
-!! result
-<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>
-!! end
-
-!! test
-Broken image links with HTML captions (bug 39700)
-!! input
-[[File:Nonexistent|<script></script>]]
-[[File:Nonexistent|100px|<script></script>]]
-[[File:Nonexistent|&lt;]]
-[[File:Nonexistent|a<i>b</i>c]]
-!! result
-<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Nonexistent" class="new" title="File:Nonexistent">&lt;script&gt;&lt;/script&gt;</a>
-<a href="/index.php?title=Special:Upload&amp;wpDestFile=Nonexistent" class="new" title="File:Nonexistent">&lt;script&gt;&lt;/script&gt;</a>
-<a href="/index.php?title=Special:Upload&amp;wpDestFile=Nonexistent" class="new" title="File:Nonexistent">&lt;</a>
-<a href="/index.php?title=Special:Upload&amp;wpDestFile=Nonexistent" class="new" title="File:Nonexistent">abc</a>
-</p>
-!! end
-
-!! test
-Plain link to URL
-!! input
-[[http://www.example.com]]
-!! result
-<p>[<a rel="nofollow" class="external autonumber" href="http://www.example.com">[1]</a>]
-</p>
-!! end
-
-!! test
-Plain link to URL with link text
-!! input
-[[http://www.example.com Link text]]
-!! result
-<p>[<a rel="nofollow" class="external text" href="http://www.example.com">Link text</a>]
-</p>
-!! end
-
-!! test
-Plain link to protocol-relative URL
-!! input
-[[//www.example.com]]
-!! result
-<p>[<a rel="nofollow" class="external autonumber" href="//www.example.com">[1]</a>]
-</p>
-!! end
-
-!! test
-Plain link to protocol-relative URL with link text
-!! input
-[[//www.example.com Link text]]
-!! result
-<p>[<a rel="nofollow" class="external text" href="//www.example.com">Link text</a>]
-</p>
-!! end
-
-
-# I'm fairly sure the expected result here is wrong.
-# We want these to be URL links, not pseudo-pages with URLs for titles....
-# However the current output is also pretty screwy.
-#
-# ----
-# I'm changing it to match the current output--it arguably makes more
-# sense in the light of the test above. Old expected result was:
-#<p>Piped link to URL: <a href="/index.php?title=Http://www.example.com&amp;action=edit" class="new">an example URL</a>
-#</p>
-# But I think this test is bordering on "garbage in, garbage out" anyway.
-# -- wtm
-!! test
-Piped link to URL
-!! input
-Piped link to URL: [[http://www.example.com|an example URL]]
-!! result
-<p>Piped link to URL: [<a rel="nofollow" class="external text" href="http://www.example.com%7Can">example URL</a>]
-</p>
-!! end
-
-!! test
-BUG 2: [[page|http://url/]] should link to page, not http://url/
-!! input
-[[Main Page|http://url/]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">http://url/</a>
-</p>
-!! end
-
-!! test
-BUG 337: Escaped self-links should be bold
-!! options
-title=[[Bug462]]
-!! input
-[[Bu&#103;462]] [[Bug462]]
-!! result
-<p><strong class="selflink">Bu&#103;462</strong> <strong class="selflink">Bug462</strong>
-</p>
-!! end
-
-!! test
-Self-link to section should not be bold
-!! options
-title=[[Main Page]]
-!! input
-[[Main Page#section]]
-!! result
-<p><a href="/wiki/Main_Page#section" title="Main Page">Main Page#section</a>
-</p>
-!! end
-
-!! article
-00
-!! text
-This is 00.
-!! endarticle
-
-!!test
-Self-link to numeric title
-!!options
-title=[[0]]
-!!input
-[[0]]
-!!result
-<p><strong class="selflink">0</strong>
-</p>
-!!end
-
-!!test
-Link to numeric-equivalent title
-!!options
-title=[[0]]
-!!input
-[[00]]
-!!result
-<p><a href="/wiki/00" title="00">00</a>
-</p>
-!!end
-
-!! test
-<nowiki> inside a link
-!! input
-[[Main<nowiki> Page</nowiki>]] [[Main Page|the main page <nowiki>[it's not very good]</nowiki>]]
-!! result
-<p>[[Main Page]] <a href="/wiki/Main_Page" title="Main Page">the main page [it's not very good]</a>
-</p>
-!! end
-
-!! test
-Non-breaking spaces in title
-!! input
-[[&nbsp; Main &nbsp; Page &nbsp;]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">&#160; Main &#160; Page &#160;</a>
-</p>
-!!end
-
-!! test
-Internal link with ca linktrail, surrounded by bold apostrophes (bug 27473 primary issue)
-!! options
-language=ca
-!! input
-'''[[Main Page]]'''
-!! result
-<p><b><a href="/wiki/Main_Page" title="Main Page">Main Page</a></b>
-</p>
-!! end
-
-!! test
-Internal link with ca linktrail, surrounded by italic apostrophes (bug 27473 primary issue)
-!! options
-language=ca
-!! input
-''[[Main Page]]''
-!! result
-<p><i><a href="/wiki/Main_Page" title="Main Page">Main Page</a></i>
-</p>
-!! end
-
-!! test
-Internal link with en linktrail: no apostrophes (bug 27473)
-!! options
-language=en
-!! input
-[[Something]]'nice
-!! result
-<p><a href="/index.php?title=Something&amp;action=edit&amp;redlink=1" class="new" title="Something (page does not exist)">Something</a>'nice
-</p>
-!! end
-
-!! test
-Internal link with ca linktrail with apostrophes (bug 27473)
-!! options
-language=ca
-!! input
-[[Something]]'nice
-!! result
-<p><a href="/index.php?title=Something&amp;action=edit&amp;redlink=1" class="new" title="Something (encara no existeix)">Something'nice</a>
-</p>
-!! end
-
-!! test
-Internal link with kaa linktrail with apostrophes (bug 27473)
-!! options
-language=kaa
-!! input
-[[Something]]'nice
-!! result
-<p><a href="/index.php?title=Something&amp;action=edit&amp;redlink=1" class="new" title="Something (bet ele jaratılmag'an)">Something'nice</a>
-</p>
-!! end
-
-###
-### Interwiki links (see maintenance/interwiki.sql)
-###
-
-!! test
-Inline interwiki link
-!! input
-[[MeatBall:SoftSecurity]]
-!! result
-<p><a href="http://www.usemod.com/cgi-bin/mb.pl?SoftSecurity" class="extiw" title="meatball:SoftSecurity">MeatBall:SoftSecurity</a>
-</p>
-!! end
-
-!! test
-Inline interwiki link with empty title (bug 2372)
-!! input
-[[MeatBall:]]
-!! result
-<p><a href="http://www.usemod.com/cgi-bin/mb.pl" class="extiw" title="meatball:">MeatBall:</a>
-</p>
-!! end
-
-!! test
-Interwiki link encoding conversion (bug 1636)
-!! input
-*[[Wikipedia:ro:Olteni&#0355;a]]
-*[[Wikipedia:ro:Olteni&#355;a]]
-!! result
-<ul><li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
-</li><li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
-</li></ul>
-
-!! end
-
-!! test
-Interwiki link with fragment (bug 2130)
-!! input
-[[MeatBall:SoftSecurity#foo]]
-!! result
-<p><a href="http://www.usemod.com/cgi-bin/mb.pl?SoftSecurity#foo" class="extiw" title="meatball:SoftSecurity">MeatBall:SoftSecurity#foo</a>
-</p>
-!! end
-
-!! test
-Interlanguage link
-!! input
-Blah blah blah
-[[zh:Chinese]]
-!!result
-<p>Blah blah blah
-</p>
-!! end
-
-!! test
-Double interlanguage link
-!! input
-Blah blah blah
-[[es:Spanish]]
-[[zh:Chinese]]
-!!result
-<p>Blah blah blah
-</p>
-!! end
-
-!! test
-Interlanguage link, with prefix links
-!! options
-language=ln
-!! input
-Blah blah blah
-[[zh:Chinese]]
-!!result
-<p>Blah blah blah
-</p>
-!! end
-
-!! test
-Double interlanguage link, with prefix links (bug 8897)
-!! options
-language=ln
-!! input
-Blah blah blah
-[[es:Spanish]]
-[[zh:Chinese]]
-!!result
-<p>Blah blah blah
-</p>
-!! end
-
-
-##
-## XHTML tidiness
-###
-
-!! test
-<br> to <br />
-!! input
-1<br>2<br />3
-!! result
-<p>1<br />2<br />3
-</p>
-!! end
-
-!! test
-Incorrecly removing closing slashes from correctly formed XHTML
-!! input
-<br style="clear:both;" />
-!! result
-<p><br style="clear:both;" />
-</p>
-!! end
-
-!! test
-Failing to transform badly formed HTML into correct XHTML
-!! input
-<br style="clear: left;">
-<br style="clear: right;">
-<br style="clear: both;">
-!! result
-<p><br style="clear: left;" />
-<br style="clear: right;" />
-<br style="clear: both;" />
-</p>
-!!end
-
-!! test
-Horizontal ruler (should it add that extra space?)
-!! input
-<hr>
-<hr >
-foo <hr
-> bar
-!! result
-<hr />
-<hr />
-foo <hr /> bar
-
-!! end
-
-!! test
-Horizontal ruler -- 4+ dashes render hr
-!! input
-----
-!! result
-<hr />
-
-!! end
-
-!! test
-Horizontal ruler -- eats additional dashes on the same line
-!! input
----------
-!! result
-<hr />
-
-!! end
-
-!! test
-Horizontal ruler -- does not collaps dashes on consecutive lines
-!! input
-----
-----
-!! result
-<hr />
-<hr />
-
-!! end
-
-!! test
-Horizontal ruler -- <4 dashes render as plain text
-!! input
----
-!! result
-<p>---
-</p>
-!! end
-
-###
-### Block-level elements
-###
-!! test
-Common list
-!! input
-*Common list
-* item 2
-*item 3
-!! result
-<ul><li>Common list
-</li><li> item 2
-</li><li>item 3
-</li></ul>
-
-!! end
-
-!! test
-Numbered list
-!! input
-#Numbered list
-#item 2
-# item 3
-!! result
-<ol><li>Numbered list
-</li><li>item 2
-</li><li> item 3
-</li></ol>
-
-!! end
-
-!! test
-Mixed list
-!! input
-*Mixed list
-*# with numbers
-** and bullets
-*# and numbers
-*bullets again
-**bullet level 2
-***bullet level 3
-***#Number on level 4
-**bullet level 2
-**#Number on level 3
-**#Number on level 3
-*#number level 2
-*Level 1
-*** Level 3
-#** Level 3, but ordered
-!! result
-<ul><li>Mixed list
-<ol><li> with numbers
-</li></ol>
-<ul><li> and bullets
-</li></ul>
-<ol><li> and numbers
-</li></ol>
-</li><li>bullets again
-<ul><li>bullet level 2
-<ul><li>bullet level 3
-<ol><li>Number on level 4
-</li></ol>
-</li></ul>
-</li><li>bullet level 2
-<ol><li>Number on level 3
-</li><li>Number on level 3
-</li></ol>
-</li></ul>
-<ol><li>number level 2
-</li></ol>
-</li><li>Level 1
-<ul><li><ul><li> Level 3
-</li></ul>
-</li></ul>
-</li></ul>
-<ol><li><ul><li><ul><li> Level 3, but ordered
-</li></ul>
-</li></ul>
-</li></ol>
-
-!! end
-
-!! test
-Nested lists 1
-!! input
-*foo
-**bar
-!! result
-<ul><li>foo
-<ul><li>bar
-</li></ul>
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 2
-!! input
-**foo
-*bar
-!! result
-<ul><li><ul><li>foo
-</li></ul>
-</li><li>bar
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 3 (first element empty)
-!! input
-*
-**bar
-!! result
-<ul><li>
-<ul><li>bar
-</li></ul>
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 4 (first element empty)
-!! input
-**
-*bar
-!! result
-<ul><li><ul><li>
-</li></ul>
-</li><li>bar
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 5 (both elements empty)
-!! input
-**
-*
-!! result
-<ul><li><ul><li>
-</li></ul>
-</li><li>
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 6 (both elements empty)
-!! input
-*
-**
-!! result
-<ul><li>
-<ul><li>
-</li></ul>
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 7 (skip initial nesting levels)
-!! input
-*** foo
-!! result
-<ul><li><ul><li><ul><li> foo
-</li></ul>
-</li></ul>
-</li></ul>
-
-!! end
-
-!! test
-Nested lists 8 (multiple nesting transitions)
-!! input
-* foo
-*** bar
-** baz
-* boo
-!! result
-<ul><li> foo
-<ul><li><ul><li> bar
-</li></ul>
-</li><li> baz
-</li></ul>
-</li><li> boo
-</li></ul>
-
-!! end
-
-
-!! test
-List items are not parsed correctly following a <pre> block (bug 785)
-!! input
-* <pre>foo</pre>
-* <pre>bar</pre>
-* zar
-!! result
-<ul><li> <pre>foo</pre>
-</li><li> <pre>bar</pre>
-</li><li> zar
-</li></ul>
-
-!! end
-
-!! test
-List items from template
-!! input
-
-{{inner list}}
-* item 2
-
-* item 0
-{{inner list}}
-* item 2
-
-* item 0
-* notSOL{{inner list}}
-* item 2
-!! result
-<ul><li> item 1
-</li><li> item 2
-</li></ul>
-<ul><li> item 0
-</li><li> item 1
-</li><li> item 2
-</li></ul>
-<ul><li> item 0
-</li><li> notSOL
-</li><li> item 1
-</li><li> item 2
-</li></ul>
-
-!! end
-
-!! test
-List interrupted by empty line or heading
-!! input
-* foo
-
-** bar
-== A heading ==
-* Another list item
-!! result
-<ul><li> foo
-</li></ul>
-<ul><li><ul><li> bar
-</li></ul>
-</li></ul>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A heading">edit</a>]</span> <span class="mw-headline" id="A_heading"> A heading </span></h2>
-<ul><li> Another list item
-</li></ul>
-
-!!end
-
-
-###
-### Magic Words
-###
-
-!! test
-Magic Word: {{CURRENTDAY}}
-!! input
-{{CURRENTDAY}}
-!! result
-<p>1
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTDAY2}}
-!! input
-{{CURRENTDAY2}}
-!! result
-<p>01
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTDAYNAME}}
-!! input
-{{CURRENTDAYNAME}}
-!! result
-<p>Thursday
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTDOW}}
-!! input
-{{CURRENTDOW}}
-!! result
-<p>4
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTMONTH}}
-!! input
-{{CURRENTMONTH}}
-!! result
-<p>01
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTMONTHABBREV}}
-!! input
-{{CURRENTMONTHABBREV}}
-!! result
-<p>Jan
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTMONTHNAME}}
-!! input
-{{CURRENTMONTHNAME}}
-!! result
-<p>January
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTMONTHNAMEGEN}}
-!! input
-{{CURRENTMONTHNAMEGEN}}
-!! result
-<p>January
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTTIME}}
-!! input
-{{CURRENTTIME}}
-!! result
-<p>00:02
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTWEEK}} (@bug 4594)
-!! input
-{{CURRENTWEEK}}
-!! result
-<p>1
-</p>
-!! end
-
-!! test
-Magic Word: {{CURRENTYEAR}}
-!! input
-{{CURRENTYEAR}}
-!! result
-<p>1970
-</p>
-!! end
-
-!! test
-Magic Word: {{FULLPAGENAME}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{FULLPAGENAME}}
-!! result
-<p>User:Ævar Arnfjörð Bjarmason
-</p>
-!! end
-
-!! test
-Magic Word: {{FULLPAGENAMEE}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{FULLPAGENAMEE}}
-!! result
-<p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
-</p>
-!! end
-
-!! test
-Magic Word: {{NAMESPACE}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{NAMESPACE}}
-!! result
-<p>User
-</p>
-!! end
-
-!! test
-Magic Word: {{NAMESPACEE}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{NAMESPACEE}}
-!! result
-<p>User
-</p>
-!! end
-
-!! test
-Magic Word: {{NAMESPACENUMBER}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{NAMESPACENUMBER}}
-!! result
-<p>2
-</p>
-!! end
-
-!! test
-Magic Word: {{NUMBEROFFILES}}
-!! input
-{{NUMBEROFFILES}}
-!! result
-<p>2
-</p>
-!! end
-
-!! test
-Magic Word: {{PAGENAME}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{PAGENAME}}
-!! result
-<p>Ævar Arnfjörð Bjarmason
-</p>
-!! end
-
-!! test
-Magic Word: {{PAGENAME}} with metacharacters
-!! options
-title=[['foo & bar = baz']]
-!! input
-''{{PAGENAME}}''
-!! result
-<p><i>&#39;foo &#38; bar &#61; baz&#39;</i>
-</p>
-!! end
-
-!! test
-Magic Word: {{PAGENAME}} with metacharacters (bug 26781)
-!! options
-title=[[*RFC 1234 http://example.com/]]
-!! input
-{{PAGENAME}}
-!! result
-<p>&#42;RFC&#32;1234 http&#58;//example.com/
-</p>
-!! end
-
-!! test
-Magic Word: {{PAGENAMEE}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
-!! input
-{{PAGENAMEE}}
-!! result
-<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
-</p>
-!! end
-
-!! test
-Magic Word: {{PAGENAMEE}} with metacharacters (bug 26781)
-!! options
-title=[[*RFC 1234 http://example.com/]]
-!! input
-{{PAGENAMEE}}
-!! result
-<p>&#42;RFC_1234_http&#58;//example.com/
-</p>
-!! end
-
-!! test
-Magic Word: {{REVISIONID}}
-!! input
-{{REVISIONID}}
-!! result
-<p>1337
-</p>
-!! end
-
-!! test
-Magic Word: {{SCRIPTPATH}}
-!! input
-{{SCRIPTPATH}}
-!! result
-<p>/
-</p>
-!! end
-
-!! test
-Magic Word: {{SERVER}}
-!! input
-{{SERVER}}
-!! result
-<p><a rel="nofollow" class="external free" href="http://Britney-Spears">http://Britney-Spears</a>
-</p>
-!! end
-
-!! test
-Magic Word: {{SERVERNAME}}
-!! input
-{{SERVERNAME}}
-!! result
-<p>Britney-Spears
-</p>
-!! end
-
-!! test
-Magic Word: {{SITENAME}}
-!! input
-{{SITENAME}}
-!! result
-<p>MediaWiki
-</p>
-!! end
-
-!! test
-Namespace 1 {{ns:1}}
-!! input
-{{ns:1}}
-!! result
-<p>Talk
-</p>
-!! end
-
-!! test
-Namespace 1 {{ns:01}}
-!! input
-{{ns:01}}
-!! result
-<p>Talk
-</p>
-!! end
-
-!! test
-Namespace 0 {{ns:0}} (bug 4783)
-!! input
-{{ns:0}}
-!! result
-
-!! end
-
-!! test
-Namespace 0 {{ns:00}} (bug 4783)
-!! input
-{{ns:00}}
-!! result
-
-!! end
-
-!! test
-Namespace -1 {{ns:-1}}
-!! input
-{{ns:-1}}
-!! result
-<p>Special
-</p>
-!! end
-
-!! test
-Namespace User {{ns:User}}
-!! input
-{{ns:User}}
-!! result
-<p>User
-</p>
-!! end
-
-!! test
-Namespace User talk {{ns:User_talk}}
-!! input
-{{ns:User_talk}}
-!! result
-<p>User talk
-</p>
-!! end
-
-!! test
-Namespace User talk {{ns:uSeR tAlK}}
-!! input
-{{ns:uSeR tAlK}}
-!! result
-<p>User talk
-</p>
-!! end
-
-!! test
-Namespace File {{ns:File}}
-!! input
-{{ns:File}}
-!! result
-<p>File
-</p>
-!! end
-
-!! test
-Namespace File {{ns:Image}}
-!! input
-{{ns:Image}}
-!! result
-<p>File
-</p>
-!! end
-
-!! test
-Namespace (lang=de) Benutzer {{ns:User}}
-!! options
-language=de
-!! input
-{{ns:User}}
-!! result
-<p>Benutzer
-</p>
-!! end
-
-!! test
-Namespace (lang=de) Benutzer Diskussion {{ns:3}}
-!! options
-language=de
-!! input
-{{ns:3}}
-!! result
-<p>Benutzer Diskussion
-</p>
-!! end
-
-
-!! test
-Urlencode
-!! input
-{{urlencode:hi world?!}}
-{{urlencode:hi world?!|WIKI}}
-{{urlencode:hi world?!|PATH}}
-{{urlencode:hi world?!|QUERY}}
-!! result
-<p>hi+world%3F%21
-hi_world%3F!
-hi%20world%3F%21
-hi+world%3F%21
-</p>
-!! end
-
-###
-### Magic links
-###
-!! test
-Magic links: internal link to RFC (bug 479)
-!! input
-[[RFC 123]]
-!! result
-<p><a href="/index.php?title=RFC_123&amp;action=edit&amp;redlink=1" class="new" title="RFC 123 (page does not exist)">RFC 123</a>
-</p>
-!! end
-
-!! test
-Magic links: RFC (bug 479)
-!! input
-RFC 822
-!! result
-<p><a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc822">RFC 822</a>
-</p>
-!! end
-
-!! test
-Magic links: ISBN (bug 1937)
-!! input
-ISBN 0-306-40615-2
-!! result
-<p><a href="/wiki/Special:BookSources/0306406152" class="internal mw-magiclink-isbn">ISBN 0-306-40615-2</a>
-</p>
-!! end
-
-!! test
-Magic links: PMID incorrectly converts space to underscore
-!! input
-PMID 1234
-!! result
-<p><a class="external mw-magiclink-pmid" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a>
-</p>
-!! end
-
-###
-### Templates
-####
-
-!! test
-Nonexistent template
-!! input
-{{thistemplatedoesnotexist}}
-!! result
-<p><a href="/index.php?title=Template:Thistemplatedoesnotexist&amp;action=edit&amp;redlink=1" class="new" title="Template:Thistemplatedoesnotexist (page does not exist)">Template:Thistemplatedoesnotexist</a>
-</p>
-!! end
-
-!! article
-Template:test
-!! text
-This is a test template
-!! endarticle
-
-!! test
-Simple template
-!! input
-{{test}}
-!! result
-<p>This is a test template
-</p>
-!! end
-
-!! test
-Template with explicit namespace
-!! input
-{{Template:test}}
-!! result
-<p>This is a test template
-</p>
-!! end
-
-
-!! article
-Template:paramtest
-!! text
-This is a test template with parameter {{{param}}}
-!! endarticle
-
-!! test
-Template parameter
-!! input
-{{paramtest|param=foo}}
-!! result
-<p>This is a test template with parameter foo
-</p>
-!! end
-
-!! article
-Template:paramtestnum
-!! text
-[[{{{1}}}|{{{2}}}]]
-!! endarticle
-
-!! test
-Template unnamed parameter
-!! input
-{{paramtestnum|Main Page|the main page}}
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">the main page</a>
-</p>
-!! end
-
-!! article
-Template:templatesimple
-!! text
-(test)
-!! endarticle
-
-!! article
-Template:templateredirect
-!! text
-#redirect [[Template:templatesimple]]
-!! endarticle
-
-!! article
-Template:templateasargtestnum
-!! text
-{{{{{1}}}}}
-!! endarticle
-
-!! article
-Template:templateasargtest
-!! text
-{{template{{{templ}}}}}
-!! endarticle
-
-!! article
-Template:templateasargtest2
-!! text
-{{{{{templ}}}}}
-!! endarticle
-
-!! test
-Template with template name as unnamed argument
-!! input
-{{templateasargtestnum|templatesimple}}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! test
-Template with template name as argument
-!! input
-{{templateasargtest|templ=simple}}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! test
-Template with template name as argument (2)
-!! input
-{{templateasargtest2|templ=templatesimple}}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! article
-Template:templateasargtestdefault
-!! text
-{{{{{templ|templatesimple}}}}}
-!! endarticle
-
-!! article
-Template:templa
-!! text
-'''templ'''
-!! endarticle
-
-!! test
-Template with default value
-!! input
-{{templateasargtestdefault}}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! test
-Template with default value (value set)
-!! input
-{{templateasargtestdefault|templ=templa}}
-!! result
-<p><b>templ</b>
-</p>
-!! end
-
-!! test
-Template redirect
-!! input
-{{templateredirect}}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! test
-Template with argument in separate line
-!! input
-{{ templateasargtest |
- templ = simple }}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! test
-Template with complex template as argument
-!! input
-{{paramtest|
- param ={{ templateasargtest |
- templ = simple }}}}
-!! result
-<p>This is a test template with parameter (test)
-</p>
-!! end
-
-!! test
-Template with thumb image (with link in description)
-!! input
-{{paramtest|
- param =[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]}}
-!! result
-This is a test template with parameter <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Noimage.png" class="new" title="File:Noimage.png">File:Noimage.png</a> <div class="thumbcaption"><a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">link</a> <a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">caption</a></div></div></div>
-
-!! end
-
-!! article
-Template:complextemplate
-!! text
-{{{1}}} {{paramtest|
- param ={{{param}}}}}
-!! endarticle
-
-!! test
-Template with complex arguments
-!! input
-{{complextemplate|
- param ={{ templateasargtest |
- templ = simple }}|[[Template:complextemplate|link]]}}
-!! result
-<p><a href="/wiki/Template:Complextemplate" title="Template:Complextemplate">link</a> This is a test template with parameter (test)
-</p>
-!! end
-
-!! test
-BUG 553: link with two variables in a piped link
-!! input
-{|
-|[[{{{1}}}|{{{2}}}]]
-|}
-!! result
-<table>
-<tr>
-<td>[[{{{1}}}|{{{2}}}]]
-</td></tr></table>
-
-!! end
-
-!! test
-Magic variable as template parameter
-!! input
-{{paramtest|param={{SITENAME}}}}
-!! result
-<p>This is a test template with parameter MediaWiki
-</p>
-!! end
-
-!! article
-Template:linktest
-!! text
-[[{{{param}}}|link]]
-!! endarticle
-
-!! test
-Template parameter as link source
-!! input
-{{linktest|param=Main Page}}
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">link</a>
-</p>
-!! end
-
-
-!!article
-Template:paramtest2
-!! text
-including another template, {{paramtest|param={{{arg}}}}}
-!! endarticle
-
-!! test
-Template passing argument to another template
-!! input
-{{paramtest2|arg='hmm'}}
-!! result
-<p>including another template, This is a test template with parameter 'hmm'
-</p>
-!! end
-
-!! article
-Template:Linktest2
-!! text
-Main Page
-!! endarticle
-
-!! test
-Template as link source
-!! input
-[[{{linktest2}}]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
-!! end
-
-
-!! article
-Template:loop1
-!! text
-{{loop2}}
-!! endarticle
-
-!! article
-Template:loop2
-!! text
-{{loop1}}
-!! endarticle
-
-!! test
-Template infinite loop
-!! input
-{{loop1}}
-!! result
-<p><span class="error">Template loop detected: <a href="/wiki/Template:Loop1" title="Template:Loop1">Template:Loop1</a></span>
-</p>
-!! end
-
-!! test
-Template from main namespace
-!! input
-{{:Main Page}}
-!! result
-<p>blah blah
-</p>
-!! end
-
-!! article
-Template:table
-!! text
-{|
-| 1 || 2
-|-
-| 3 || 4
-|}
-!! endarticle
-
-!! test
-BUG 529: Template with table, not included at beginning of line
-!! input
-foo {{table}}
-!! result
-<p>foo
-</p>
-<table>
-<tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
-<td> 4
-</td></tr></table>
-
-!! end
-
-!! test
-BUG 523: Template shouldn't eat newline (or add an extra one before table)
-!! input
-foo
-{{table}}
-!! result
-<p>foo
-</p>
-<table>
-<tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
-<td> 4
-</td></tr></table>
-
-!! end
-
-!! test
-BUG 41: Template parameters shown as broken links
-!! input
-{{{parameter}}}
-!! result
-<p>{{{parameter}}}
-</p>
-!! end
-
-
-!! article
-Template:MSGNW test
-!! text
-''None'' of '''this''' should be
-* interpreted
- but rather passed unmodified
-{{test}}
-!! endarticle
-
-# hmm, fix this or just deprecate msgnw and document its behavior?
-!! test
-msgnw keyword
-!! options
-disabled
-!! input
-{{msgnw:MSGNW test}}
-!! result
-<p>''None'' of '''this''' should be
-* interpreted
- but rather passed unmodified
-{{test}}
-</p>
-!! end
-
-!! test
-int keyword
-!! input
-{{int:youhavenewmessages|lots of money|not!}}
-!! result
-<p>You have lots of money (not!).
-</p>
-!! end
-
-!! article
-Template:Includes
-!! text
-Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
-!! endarticle
-
-!! test
-<includeonly> and <noinclude> being included
-!! input
-{{Includes}}
-!! result
-<p>Foobar
-</p>
-!! end
-
-!! article
-Template:Includes2
-!! text
-<onlyinclude>Foo</onlyinclude>bar
-!! endarticle
-
-!! test
-<onlyinclude> being included
-!! input
-{{Includes2}}
-!! result
-<p>Foo
-</p>
-!! end
-
-
-!! article
-Template:Includes3
-!! text
-<onlyinclude>Foo</onlyinclude>bar<includeonly>zar</includeonly>
-!! endarticle
-
-!! test
-<onlyinclude> and <includeonly> being included
-!! input
-{{Includes3}}
-!! result
-<p>Foo
-</p>
-!! end
-
-!! test
-<includeonly> and <noinclude> on a page
-!! input
-Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
-!! result
-<p>Foozar
-</p>
-!! end
-
-!! test
-<onlyinclude> on a page
-!! input
-<onlyinclude>Foo</onlyinclude>bar
-!! result
-<p>Foobar
-</p>
-!! end
-
-!! article
-Template:Includeonly section
-!! text
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section T-1==
-!!endarticle
-
-!! test
-Bug 6563: Edit link generation for section shown by <includeonly>
-!! input
-{{includeonly section}}
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-1" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Includeonly_section">Includeonly section</span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-2" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Section_T-1">Section T-1</span></h2>
-
-!! end
-
-# Uses same input as the contents of [[Template:Includeonly section]]
-!! test
-Bug 6563: Section extraction for section shown by <includeonly>
-!! options
-section=T-2
-!! input
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section T-2==
-!! result
-==Section T-2==
-!! end
-
-!! test
-Bug 6563: Edit link generation for section suppressed by <includeonly>
-!! input
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section 1==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h2>
-
-!! end
-
-!! test
-Bug 6563: Section extraction for section suppressed by <includeonly>
-!! options
-section=1
-!! input
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section 1==
-!! result
-==Section 1==
-!! end
-
-###
-### Pre-save transform tests
-###
-!! test
-pre-save transform: subst:
-!! options
-PST
-!! input
-{{subst:test}}
-!! result
-This is a test template
-!! end
-
-!! test
-pre-save transform: normal template
-!! options
-PST
-!! input
-{{test}}
-!! result
-{{test}}
-!! end
-
-!! test
-pre-save transform: nonexistent template
-!! options
-PST
-!! input
-{{thistemplatedoesnotexist}}
-!! result
-{{thistemplatedoesnotexist}}
-!! end
-
-
-!! test
-pre-save transform: subst magic variables
-!! options
-PST
-!! input
-{{subst:SITENAME}}
-!! result
-MediaWiki
-!! end
-
-# This is bug 89, which I fixed. -- wtm
-!! test
-pre-save transform: subst: templates with parameters
-!! options
-pst
-!! input
-{{subst:paramtest|param="something else"}}
-!! result
-This is a test template with parameter "something else"
-!! end
-
-!! article
-Template:nowikitest
-!! text
-<nowiki>'''not wiki'''</nowiki>
-!! endarticle
-
-!! test
-pre-save transform: nowiki in subst (bug 1188)
-!! options
-pst
-!! input
-{{subst:nowikitest}}
-!! result
-<nowiki>'''not wiki'''</nowiki>
-!! end
-
-
-!! article
-Template:commenttest
-!! text
-This template has <!-- a comment --> in it.
-!! endarticle
-
-!! test
-pre-save transform: comment in subst (bug 1936)
-!! options
-pst
-!! input
-{{subst:commenttest}}
-!! result
-This template has <!-- a comment --> in it.
-!! end
-
-!! test
-pre-save transform: unclosed tag
-!! options
-pst noxml
-!! input
-<nowiki>'''not wiki'''
-!! result
-<nowiki>'''not wiki'''
-!! end
-
-!! test
-pre-save transform: mixed tag case
-!! options
-pst noxml
-!! input
-<NOwiki>'''not wiki'''</noWIKI>
-!! result
-<NOwiki>'''not wiki'''</noWIKI>
-!! end
-
-!! test
-pre-save transform: unclosed comment in <nowiki>
-!! options
-pst noxml
-!! input
-wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
-!! result
-wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
-!!end
-
-!! article
-Template:dangerous
-!!text
-<span onmouseover="alert('crap')">Oh no</span>
-!!endarticle
-
-!!test
-(confirming safety of fix for subst bug 1936)
-!! input
-{{Template:dangerous}}
-!! result
-<p><span>Oh no</span>
-</p>
-!! end
-
-!! test
-pre-save transform: comment containing gallery (bug 5024)
-!! options
-pst
-!! input
-<!-- <gallery>data</gallery> -->
-!!result
-<!-- <gallery>data</gallery> -->
-!!end
-
-!! test
-pre-save transform: comment containing extension
-!! options
-pst
-!! input
-<!-- <tag>data</tag> -->
-!!result
-<!-- <tag>data</tag> -->
-!!end
-
-!! test
-pre-save transform: comment containing nowiki
-!! options
-pst
-!! input
-<!-- <nowiki>data</nowiki> -->
-!!result
-<!-- <nowiki>data</nowiki> -->
-!!end
-
-!! test
-pre-save transform: <noinclude> in subst (bug 3298)
-!! options
-pst
-!! input
-{{subst:Includes}}
-!! result
-Foobar
-!! end
-
-!! test
-pre-save transform: <onlyinclude> in subst (bug 3298)
-!! options
-pst
-!! input
-{{subst:Includes2}}
-!! result
-Foo
-!! end
-
-!! article
-Template:SubstTest
-!!text
-{{<includeonly>subst:</includeonly>Includes}}
-!! endarticle
-
-!! article
-Template:SafeSubstTest
-!! text
-{{<includeonly>safesubst:</includeonly>Includes}}
-!! endarticle
-
-!! test
-bug 22297: safesubst: works during PST
-!! options
-pst
-!! input
-{{subst:SafeSubstTest}}{{safesubst:SubstTest}}
-!! result
-FoobarFoobar
-!! end
-
-!! test
-bug 22297: safesubst: works during normal parse
-!! input
-{{SafeSubstTest}}
-!! result
-<p>Foobar
-</p>
-!! end
-
-!! test:
-subst: does not work during normal parse
-!! input
-{{SubstTest}}
-!! result
-<p>{{subst:Includes}}
-</p>
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick")
-!! options
-pst
-!! input
-[[Article (context)|]]
-[[Bar:Article|]]
-[[:Bar:Article|]]
-[[Bar:Article (context)|]]
-[[:Bar:Article (context)|]]
-[[|Article]]
-[[|Article (context)]]
-[[Bar:X (Y) Z|]]
-[[:Bar:X (Y) Z|]]
-!! result
-[[Article (context)|Article]]
-[[Bar:Article|Article]]
-[[:Bar:Article|Article]]
-[[Bar:Article (context)|Article]]
-[[:Bar:Article (context)|Article]]
-[[Article]]
-[[Article (context)]]
-[[Bar:X (Y) Z|X (Y) Z]]
-[[:Bar:X (Y) Z|X (Y) Z]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with interwiki prefix
-!! options
-pst
-!! input
-[[interwiki:Article|]]
-[[:interwiki:Article|]]
-[[interwiki:Bar:Article|]]
-[[:interwiki:Bar:Article|]]
-!! result
-[[interwiki:Article|Article]]
-[[:interwiki:Article|Article]]
-[[interwiki:Bar:Article|Bar:Article]]
-[[:interwiki:Bar:Article|Bar:Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with parens in title
-!! options
-pst title=[[Somearticle (context)]]
-!! input
-[[|Article]]
-!! result
-[[Article (context)|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with comma in title
-!! options
-pst title=[[Someplace, Somewhere]]
-!! input
-[[|Otherplace]]
-[[Otherplace, Elsewhere|]]
-[[Otherplace, Elsewhere, Anywhere|]]
-!! result
-[[Otherplace, Somewhere|Otherplace]]
-[[Otherplace, Elsewhere|Otherplace]]
-[[Otherplace, Elsewhere, Anywhere|Otherplace]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with parens and comma
-!! options
-pst title=[[Someplace (IGNORED), Somewhere]]
-!! input
-[[|Otherplace]]
-[[Otherplace (place), Elsewhere|]]
-!! result
-[[Otherplace, Somewhere|Otherplace]]
-[[Otherplace (place), Elsewhere|Otherplace]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with comma and parens
-!! options
-pst title=[[Who, me? (context)]]
-!! input
-[[|Yes, you.]]
-[[Me, Myself, and I (1937 song)|]]
-!! result
-[[Yes, you. (context)|Yes, you.]]
-[[Me, Myself, and I (1937 song)|Me, Myself, and I]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace
-!! options
-pst title=[[Ns:Somearticle]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace and parens
-!! options
-pst title=[[Ns:Somearticle (context)]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article (context)|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace and comma
-!! options
-pst title=[[Ns:Somearticle, Context, Whatever]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article, Context, Whatever|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace, comma and parens
-!! options
-pst title=[[Ns:Somearticle, Context (context)]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article (context)|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with namespace, parens and comma
-!! options
-pst title=[[Ns:Somearticle (IGNORED), Context]]
-!! input
-[[|Article]]
-!! result
-[[Ns:Article, Context|Article]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with full-width parens and no space (Japanese and Chinese style, bug 30149)
-!! options
-pst
-!! input
-[[Article(context)|]]
-[[Bar:Article(context)|]]
-[[:Bar:Article(context)|]]
-[[|Article(context)]]
-[[Bar:X(Y)Z|]]
-[[:Bar:X(Y)Z|]]
-!! result
-[[Article(context)|Article]]
-[[Bar:Article(context)|Article]]
-[[:Bar:Article(context)|Article]]
-[[Article(context)]]
-[[Bar:X(Y)Z|X(Y)Z]]
-[[:Bar:X(Y)Z|X(Y)Z]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with full-width parens and space (Japanese and Chinese style, bug 30149)
-!! options
-pst
-!! input
-[[Article (context)|]]
-[[Bar:Article (context)|]]
-[[:Bar:Article (context)|]]
-[[|Article (context)]]
-[[Bar:X (Y) Z|]]
-[[:Bar:X (Y) Z|]]
-!! result
-[[Article (context)|Article]]
-[[Bar:Article (context)|Article]]
-[[:Bar:Article (context)|Article]]
-[[Article (context)]]
-[[Bar:X (Y) Z|X (Y) Z]]
-[[:Bar:X (Y) Z|X (Y) Z]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with parens and no space (Korean style, bug 30149)
-!! options
-pst
-!! input
-[[Article(context)|]]
-[[Bar:Article(context)|]]
-[[:Bar:Article(context)|]]
-[[|Article(context)]]
-[[Bar:X(Y)Z|]]
-[[:Bar:X(Y)Z|]]
-!! result
-[[Article(context)|Article]]
-[[Bar:Article(context)|Article]]
-[[:Bar:Article(context)|Article]]
-[[Article(context)]]
-[[Bar:X(Y)Z|X(Y)Z]]
-[[:Bar:X(Y)Z|X(Y)Z]]
-!! end
-
-!! test
-pre-save transform: context links ("pipe trick") with commas (bug 21660)
-!! options
-pst
-!! input
-[[Article (context), context|]]
-[[Article (context),context|]]
-[[Bar:Article (context), context|]]
-[[Bar:Article (context),context|]]
-[[:Bar:Article (context), context|]]
-[[:Bar:Article (context),context|]]
-!! result
-[[Article (context), context|Article]]
-[[Article (context),context|Article]]
-[[Bar:Article (context), context|Article]]
-[[Bar:Article (context),context|Article]]
-[[:Bar:Article (context), context|Article]]
-[[:Bar:Article (context),context|Article]]
-!! end
-
-!! test
-pre-save transform: trim trailing empty lines
-!! options
-pst
-!! input
-Empty lines are trimmed
-
-
-
-
-!! result
-Empty lines are trimmed
-!! end
-
-!! test
-pre-save transform: Signature expansion
-!! options
-pst
-!! input
-* ~~~
-* <noinclude>~~~</noinclude>
-* <includeonly>~~~</includeonly>
-* <onlyinclude>~~~</onlyinclude>
-!! result
-* [[Special:Contributions/127.0.0.1|127.0.0.1]]
-* <noinclude>[[Special:Contributions/127.0.0.1|127.0.0.1]]</noinclude>
-* <includeonly>[[Special:Contributions/127.0.0.1|127.0.0.1]]</includeonly>
-* <onlyinclude>[[Special:Contributions/127.0.0.1|127.0.0.1]]</onlyinclude>
-!! end
-
-
-!! test
-pre-save transform: Signature expansion in nowiki tags (bug 93)
-!! options
-pst disabled
-!! input
-Shall not expand:
-
-<nowiki>~~~~</nowiki>
-
-<includeonly><nowiki>~~~~</nowiki></includeonly>
-
-<noinclude><nowiki>~~~~</nowiki></noinclude>
-
-<onlyinclude><nowiki>~~~~</nowiki></onlyinclude>
-
-{{subst:Foo}} shall be converted to FOO
-
-As well as inside noinclude/onlyinclude
-<noinclude>{{subst:Foo}}</noinclude>
-<onlyinclude>{{subst:Foo}}</onlyinclude>
-
-But not inside includeonly
-<includeonly>{{subst:Foo}}</includeonly>
-!! result
-Shall not expand:
-
-<nowiki>~~~~</nowiki>
-
-<includeonly><nowiki>~~~~</nowiki></includeonly>
-
-<noinclude><nowiki>~~~~</nowiki></noinclude>
-
-<onlyinclude><nowiki>~~~~</nowiki></onlyinclude>
-
-FOO shall be converted to FOO
-
-As well as inside noinclude/onlyinclude
-<noinclude>FOO</noinclude>
-<onlyinclude>FOO</onlyinclude>
-
-But not inside includeonly
-<includeonly>{{subst:Foo}}</includeonly>
-!! end
-
-###
-### Message transform tests
-###
-!! test
-message transform: magic variables
-!! options
-msg
-!! input
-{{SITENAME}}
-!! result
-MediaWiki
-!! end
-
-!! test
-message transform: should not transform wiki markup
-!! options
-msg
-!! input
-''test''
-!! result
-''test''
-!! end
-
-!! test
-message transform: <noinclude> in transcluded template (bug 4926)
-!! options
-msg
-!! input
-{{Includes}}
-!! result
-Foobar
-!! end
-
-!! test
-message transform: <onlyinclude> in transcluded template (bug 4926)
-!! options
-msg
-!! input
-{{Includes2}}
-!! result
-Foo
-!! end
-
-!! test
-{{#special:}} page name, known
-!! options
-msg
-!! input
-{{#special:Recentchanges}}
-!! result
-Special:RecentChanges
-!! end
-
-!! test
-{{#special:}} page name with subpage, known
-!! options
-msg
-!! input
-{{#special:Recentchanges/param}}
-!! result
-Special:RecentChanges/param
-!! end
-
-!! test
-{{#special:}} page name, unknown
-!! options
-msg
-!! input
-{{#special:foobarnonexistent}}
-!! result
-No such special page
-!! end
-
-!! test
-{{#speciale:}} page name, known
-!! options
-msg
-!! input
-{{#speciale:Recentchanges}}
-!! result
-Special:RecentChanges
-!! end
-
-!! test
-{{#speciale:}} page name with subpage, known
-!! options
-msg
-!! input
-{{#speciale:Recentchanges/param}}
-!! result
-Special:RecentChanges/param
-!! end
-
-!! test
-{{#speciale:}} page name, unknown
-!! options
-msg
-!! input
-{{#speciale:foobarnonexistent}}
-!! result
-No_such_special_page
-!! end
-
-###
-### Images
-###
-!! test
-Simple image
-!! input
-[[Image:foobar.jpg]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Right-aligned image
-!! input
-[[Image:foobar.jpg|right]]
-!! result
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-
-!! end
-
-!! test
-Simple image (using File: namespace, now canonical)
-!! input
-[[File:foobar.jpg]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with caption
-!! input
-[[Image:foobar.jpg|right|Caption text]]
-!! result
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-
-!! end
-
-!! test
-Image with link parameter, wiki target
-!! input
-[[Image:foobar.jpg|link=Target page]]
-!! result
-<p><a href="/wiki/Target_page" title="Target page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with link parameter, URL target
-!! input
-[[Image:foobar.jpg|link=http://example.com/]]
-!! result
-<p><a href="http://example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with link parameter, wgExternalLinkTarget
-!! input
-[[Image:foobar.jpg|link=http://example.com/]]
-!! config
-wgExternalLinkTarget='foobar'
-!! result
-<p><a href="http://example.com/" target="foobar" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with link parameter, wgNoFollowLinks set to false
-!! input
-[[Image:foobar.jpg|link=http://example.com/]]
-!! config
-wgNoFollowLinks=false
-!! result
-<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with link parameter, wgNoFollowDomainExceptions
-!! input
-[[Image:foobar.jpg|link=http://example.com/]]
-!! config
-wgNoFollowDomainExceptions='example.com'
-!! result
-<p><a href="http://example.com/"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with link parameter, wgExternalLinkTarget, unnamed parameter
-!! input
-[[Image:foobar.jpg|link=http://example.com/|Title]]
-!! config
-wgExternalLinkTarget='foobar'
-!! result
-<p><a href="http://example.com/" title="Title" target="foobar" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with empty link parameter
-!! input
-[[Image:foobar.jpg|link=]]
-!! result
-<p><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" />
-</p>
-!! end
-
-!! test
-Image with link parameter (wiki target) and unnamed parameter
-!! input
-[[Image:foobar.jpg|link=Target page|Title]]
-!! result
-<p><a href="/wiki/Target_page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with link parameter (URL target) and unnamed parameter
-!! input
-[[Image:foobar.jpg|link=http://example.com/|Title]]
-!! result
-<p><a href="http://example.com/" title="Title" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Thumbnail image with link parameter
-!! input
-[[Image:foobar.jpg|thumb|link=http://example.com/|Title]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="http://example.com/"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></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>Title</div></div></div>
-
-!! end
-
-!! test
-Image with frame and link
-!! input
-[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
-!! result
-<div class="thumb tleft"><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">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
-
-!! end
-
-!! test
-Image with frame and link and explicit alt
-!! input
-[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]|alt=Altitude]]
-!! result
-<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a> <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
-
-!! end
-
-!! test
-Image with wiki markup in implicit alt
-!! input
-[[Image:Foobar.jpg|testing '''bold''' in alt]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="testing bold in alt"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Image with wiki markup in explicit alt
-!! input
-[[Image:Foobar.jpg|alt=testing '''bold''' in alt]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Link to image page- image page normally doesn't exists, hence edit link
-Add test with existing image page
-#<p><a href="/wiki/File:Test" title="Image:Test">Image:test</a>
-!! input
-[[:Image:test]]
-!! result
-<p><a href="/index.php?title=File:Test&amp;action=edit&amp;redlink=1" class="new" title="File:Test (page does not exist)">Image:test</a>
-</p>
-!! end
-
-!! test
-bug 18784 Link to non-existent image page with caption should use caption as link text
-!! input
-[[:Image:test|caption]]
-!! result
-<p><a href="/index.php?title=File:Test&amp;action=edit&amp;redlink=1" class="new" title="File:Test (page does not exist)">caption</a>
-</p>
-!! end
-
-!! test
-Frameless image caption with a free URL
-!! input
-[[Image:foobar.jpg|http://example.com]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="http://example.com"><img alt="http://example.com" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Thumbnail image caption with a free URL
-!! input
-[[Image:foobar.jpg|thumb|http://example.com]]
-!! result
-<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/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></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><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
-
-!! end
-
-!! test
-Thumbnail image caption with a free URL and explicit alt
-!! input
-[[Image:foobar.jpg|thumb|http://example.com|alt=Alteration]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Alteration" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></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><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
-
-!! end
-
-!! test
-BUG 1887: A ISBN with a thumbnail
-!! input
-[[Image:foobar.jpg|thumb|ISBN 1235467890]]
-!! result
-<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/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></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><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></div></div></div>
-
-!! end
-
-!! test
-BUG 1887: A RFC with a thumbnail
-!! input
-[[Image:foobar.jpg|thumb|This is RFC 12354]]
-!! result
-<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/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></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>This is <a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
-
-!! end
-
-!! test
-BUG 1887: A mailto link with a thumbnail
-!! input
-[[Image:foobar.jpg|thumb|Please mailto:nobody@example.com]]
-!! result
-<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/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></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>Please <a rel="nofollow" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></div></div></div>
-
-!! end
-
-# Pending resolution to bug 368
-!! test
-BUG 648: Frameless image caption with a link
-!! input
-[[Image:foobar.jpg|text with a [[link]] in it]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-BUG 648: Frameless image caption with a link (suffix)
-!! input
-[[Image:foobar.jpg|text with a [[link]]foo in it]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a linkfoo in it"><img alt="text with a linkfoo in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-BUG 648: Frameless image caption with an interwiki link
-!! input
-[[Image:foobar.jpg|text with a [[MeatBall:Link]] in it]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a MeatBall:Link in it"><img alt="text with a MeatBall:Link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-BUG 648: Frameless image caption with a piped interwiki link
-!! input
-[[Image:foobar.jpg|text with a [[MeatBall:Link|link]] in it]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Escape HTML special chars in image alt text
-!! input
-[[Image:foobar.jpg|& < > "]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="&amp; &lt; &gt; &quot;"><img alt="&amp; &lt; &gt; &quot;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-BUG 499: Alt text should have &#1234;, not &amp;1234;
-!! input
-[[Image:foobar.jpg|&#9792;]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="♀"><img alt="♀" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
-
-!! test
-Broken image caption with link
-!! input
-[[Image:Foobar.jpg|thumb|This is a broken caption. But [[Main Page|this]] is just an ordinary link.
-!! result
-<p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a href="/wiki/Main_Page" title="Main Page">this</a> is just an ordinary link.
-</p>
-!! end
-
-!! test
-Image caption containing another image
-!! input
-[[Image:Foobar.jpg|thumb|This is a caption with another [[Image:icon.png|image]] inside it!]]
-!! result
-<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/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></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>This is a caption with another <a href="/index.php?title=Special:Upload&amp;wpDestFile=Icon.png" class="new" title="File:Icon.png">image</a> inside it!</div></div></div>
-
-!! end
-
-!! test
-Image caption containing a newline
-!! input
-[[Image:Foobar.jpg|This
-*is some text]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="This *is some text"><img alt="This *is some text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!!end
-
-
-!! test
-Bug 3090: External links other than http: in image captions
-!! input
-[[Image:Foobar.jpg|thumb|200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]]
-!! result
-<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="200" height="23" class="thumbimage" /></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>This caption has <a rel="nofollow" class="external text" href="irc://example.net">irc</a> and <a rel="nofollow" class="external text" href="https://example.com">Secure</a> ext links in it.</div></div></div>
-
-!! end
-
-!! test
-Custom class
-!! input
-[[Image:foobar.jpg|a|class=b]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="a"><img alt="a" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="b" /></a>
-</p>
-!! end
-
-!! article
-File:Barfoo.jpg
-!! text
-#REDIRECT [[File:Barfoo.jpg]]
-!! endarticle
-
-!! test
-Redirected image
-!! input
-[[Image:Barfoo.jpg]]
-!! result
-<p><a href="/wiki/File:Barfoo.jpg" title="File:Barfoo.jpg">File:Barfoo.jpg</a>
-</p>
-!! end
-
-!! test
-Missing image with uploads disabled
-!! options
-wgEnableUploads=0
-!! input
-[[Image:Foobaz.jpg]]
-!! result
-<p><a href="/wiki/File:Foobaz.jpg" title="File:Foobaz.jpg">File:Foobaz.jpg</a>
-</p>
-!! end
-
-
-###
-### Subpages
-###
-!! article
-Subpage test/subpage
-!! text
-foo
-!! endarticle
-
-!! test
-Subpage link
-!! options
-subpage title=[[Subpage test]]
-!! input
-[[/subpage]]
-!! result
-<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a>
-</p>
-!! end
-
-!! test
-Subpage noslash link
-!! options
-subpage title=[[Subpage test]]
-!!input
-[[/subpage/]]
-!! result
-<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">subpage</a>
-</p>
-!! end
-
-!! test
-Disabled subpages
-!! input
-[[/subpage]]
-!! result
-<p><a href="/index.php?title=/subpage&amp;action=edit&amp;redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a>
-</p>
-!! end
-
-!! test
-BUG 561: {{/Subpage}}
-!! options
-subpage title=[[Page]]
-!! input
-{{/Subpage}}
-!! result
-<p><a href="/index.php?title=Page/Subpage&amp;action=edit&amp;redlink=1" class="new" title="Page/Subpage (page does not exist)">Page/Subpage</a>
-</p>
-!! end
-
-###
-### Categories
-###
-!! article
-Category:MediaWiki User's Guide
-!! text
-blah
-!! endarticle
-
-!! test
-Link to category
-!! input
-[[:Category:MediaWiki User's Guide]]
-!! result
-<p><a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">Category:MediaWiki User's Guide</a>
-</p>
-!! end
-
-!! test
-Simple category
-!! options
-cat
-!! input
-[[Category:MediaWiki User's Guide]]
-!! result
-<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
-!! end
-
-!! test
-PAGESINCATEGORY invalid title fatal (r33546 fix)
-!! input
-{{PAGESINCATEGORY:<bogus>}}
-!! result
-<p>0
-</p>
-!! end
-
-###
-### Inter-language links
-###
-!! test
-Inter-language links
-!! options
-ill
-!! input
-[[es:Alimento]]
-[[fr:Nourriture]]
-[[zh:&#39135;&#21697;]]
-!! result
-es:Alimento fr:Nourriture zh:食å“
-!! end
-
-###
-### Sections
-###
-!! test
-Basic section headings
-!! input
-== Headline 1 ==
-Some text
-
-==Headline 2==
-More
-===Smaller headline===
-Blah blah
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
-<p>Some text
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2">Headline 2</span></h2>
-<p>More
-</p>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a>]</span> <span class="mw-headline" id="Smaller_headline">Smaller headline</span></h3>
-<p>Blah blah
-</p>
-!! end
-
-!! test
-Section headings with TOC
-!! input
-== Headline 1 ==
-=== Subheadline 1 ===
-===== Skipping a level =====
-====== Skipping a level ======
-
-== Headline 2 ==
-Some text
-===Another headline===
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Headline_1"><span class="tocnumber">1</span> <span class="toctext">Headline 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#Subheadline_1"><span class="tocnumber">1.1</span> <span class="toctext">Subheadline 1</span></a>
-<ul>
-<li class="toclevel-3 tocsection-3"><a href="#Skipping_a_level"><span class="tocnumber">1.1.1</span> <span class="toctext">Skipping a level</span></a>
-<ul>
-<li class="toclevel-4 tocsection-4"><a href="#Skipping_a_level_2"><span class="tocnumber">1.1.1.1</span> <span class="toctext">Skipping a level</span></a></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-5"><a href="#Headline_2"><span class="tocnumber">2</span> <span class="toctext">Headline 2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-6"><a href="#Another_headline"><span class="tocnumber">2.1</span> <span class="toctext">Another headline</span></a></li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a>]</span> <span class="mw-headline" id="Subheadline_1"> Subheadline 1 </span></h3>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level"> Skipping a level </span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level_2"> Skipping a level </span></h6>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2"> Headline 2 </span></h2>
-<p>Some text
-</p>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a>]</span> <span class="mw-headline" id="Another_headline">Another headline</span></h3>
-
-!! end
-
-# perl -e 'print "="x$_," Level $_ heading","="x$_,"\n" for 1..10'
-!! test
-Handling of sections up to level 6 and beyond
-!! input
-= Level 1 Heading=
-== Level 2 Heading==
-=== Level 3 Heading===
-==== Level 4 Heading====
-===== Level 5 Heading=====
-====== Level 6 Heading======
-======= Level 7 Heading=======
-======== Level 8 Heading========
-========= Level 9 Heading=========
-========== Level 10 Heading==========
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Level_1_Heading"><span class="tocnumber">1</span> <span class="toctext">Level 1 Heading</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#Level_2_Heading"><span class="tocnumber">1.1</span> <span class="toctext">Level 2 Heading</span></a>
-<ul>
-<li class="toclevel-3 tocsection-3"><a href="#Level_3_Heading"><span class="tocnumber">1.1.1</span> <span class="toctext">Level 3 Heading</span></a>
-<ul>
-<li class="toclevel-4 tocsection-4"><a href="#Level_4_Heading"><span class="tocnumber">1.1.1.1</span> <span class="toctext">Level 4 Heading</span></a>
-<ul>
-<li class="toclevel-5 tocsection-5"><a href="#Level_5_Heading"><span class="tocnumber">1.1.1.1.1</span> <span class="toctext">Level 5 Heading</span></a>
-<ul>
-<li class="toclevel-6 tocsection-6"><a href="#Level_6_Heading"><span class="tocnumber">1.1.1.1.1.1</span> <span class="toctext">Level 6 Heading</span></a></li>
-<li class="toclevel-6 tocsection-7"><a href="#.3D_Level_7_Heading.3D"><span class="tocnumber">1.1.1.1.1.2</span> <span class="toctext">= Level 7 Heading=</span></a></li>
-<li class="toclevel-6 tocsection-8"><a href="#.3D.3D_Level_8_Heading.3D.3D"><span class="tocnumber">1.1.1.1.1.3</span> <span class="toctext">== Level 8 Heading==</span></a></li>
-<li class="toclevel-6 tocsection-9"><a href="#.3D.3D.3D_Level_9_Heading.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.4</span> <span class="toctext">=== Level 9 Heading===</span></a></li>
-<li class="toclevel-6 tocsection-10"><a href="#.3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.5</span> <span class="toctext">==== Level 10 Heading====</span></a></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a>]</span> <span class="mw-headline" id="Level_1_Heading"> Level 1 Heading</span></h1>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a>]</span> <span class="mw-headline" id="Level_2_Heading"> Level 2 Heading</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a>]</span> <span class="mw-headline" id="Level_3_Heading"> Level 3 Heading</span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a>]</span> <span class="mw-headline" id="Level_4_Heading"> Level 4 Heading</span></h4>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a>]</span> <span class="mw-headline" id="Level_5_Heading"> Level 5 Heading</span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a>]</span> <span class="mw-headline" id="Level_6_Heading"> Level 6 Heading</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a>]</span> <span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a>]</span> <span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span></h6>
-
-!! end
-
-!! test
-TOC regression (bug 9764)
-!! input
-== title 1 ==
-=== title 1.1 ===
-==== title 1.1.1 ====
-=== title 1.2 ===
-== title 2 ==
-=== title 2.1 ===
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a>
-<ul>
-<li class="toclevel-3 tocsection-3"><a href="#title_1.1.1"><span class="tocnumber">1.1.1</span> <span class="toctext">title 1.1.1</span></a></li>
-</ul>
-</li>
-<li class="toclevel-2 tocsection-4"><a href="#title_1.2"><span class="tocnumber">1.2</span> <span class="toctext">title 1.2</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-5"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-6"><a href="#title_2.1"><span class="tocnumber">2.1</span> <span class="toctext">title 2.1</span></a></li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
-
-!! end
-
-!! test
-TOC with wgMaxTocLevel=3 (bug 6204)
-!! options
-wgMaxTocLevel=3
-!! input
-== title 1 ==
-=== title 1.1 ===
-==== title 1.1.1 ====
-=== title 1.2 ===
-== title 2 ==
-=== title 2.1 ===
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a></li>
-<li class="toclevel-2 tocsection-4"><a href="#title_1.2"><span class="tocnumber">1.2</span> <span class="toctext">title 1.2</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-5"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-6"><a href="#title_2.1"><span class="tocnumber">2.1</span> <span class="toctext">title 2.1</span></a></li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
-
-!! end
-
-!! test
-TOC with wgMaxTocLevel=3 and two level four headings (bug 6204)
-!! options
-wgMaxTocLevel=3
-!! input
-==Section 1==
-===Section 1.1===
-====Section 1.1.1====
-====Section 1.1.1.1====
-==Section 2==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#Section_1.1"><span class="tocnumber">1.1</span> <span class="toctext">Section 1.1</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-5"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1">Section 1.1</span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1">Section 1.1.1</span></h4>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 1.1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1.1">Section 1.1.1.1</span></h4>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 2">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
-
-!! end
-
-
-!! test
-Resolving duplicate section names
-!! input
-== Foo bar ==
-== Foo bar ==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar_2"> Foo bar </span></h2>
-
-!! end
-
-!! test
-Resolving duplicate section names with differing case (bug 10721)
-!! input
-== Foo bar ==
-== Foo Bar ==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> Foo Bar </span></h2>
-
-!! end
-
-!! article
-Template:sections
-!! text
-===Section 1===
-==Section 2==
-!! endarticle
-
-!! test
-Template with sections, __NOTOC__
-!! input
-__NOTOC__
-==Section 0==
-{{sections}}
-==Section 4==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 0">edit</a>]</span> <span class="mw-headline" id="Section_0">Section 0</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-1" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-2" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a>]</span> <span class="mw-headline" id="Section_4">Section 4</span></h2>
-
-!! end
-
-!! test
-__NOEDITSECTION__ keyword
-!! input
-__NOEDITSECTION__
-==Section 1==
-==Section 2==
-!! result
-<h2> <span class="mw-headline" id="Section_1">Section 1</span></h2>
-<h2> <span class="mw-headline" id="Section_2">Section 2</span></h2>
-
-!! end
-
-!! test
-Link inside a section heading
-!! input
-==Section with a [[Main Page|link]] in it==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section with a link in it">edit</a>]</span> <span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</span></h2>
-
-!! end
-
-!! test
-TOC regression (bug 12077)
-!! input
-__TOC__
-== title 1 ==
-=== title 1.1 ===
-== title 2 ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-3"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-
-!! end
-
-!! test
-BUG 1219 URL next to image (good)
-!! input
-http://example.com [[Image:foobar.jpg]]
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!!end
-
-!! test
-Short headings with trailing space should match behaviour of Parser::doHeadings (bug 19910)
-!! input
-===
-The line above must have a trailing space!
-=== <!--
---> <!-- -->
-But just in case it doesn't...
-!! result
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D">=</span></h1>
-<p>The line above must have a trailing space!
-</p>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D_2">=</span></h1>
-<p>But just in case it doesn't...
-</p>
-!! end
-
-!! test
-Header with special characters (bug 25462)
-!! input
-The tooltips shall not show entities to the user (ie. be double escaped)
-
-== text > text ==
-section 1
-
-== text < text ==
-section 2
-
-== text & text ==
-section 3
-
-== text ' text ==
-section 4
-
-== text " text ==
-section 5
-!! result
-<p>The tooltips shall not show entities to the user (ie. be double escaped)
-</p>
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#text_.3E_text"><span class="tocnumber">1</span> <span class="toctext">text &gt; text</span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#text_.3C_text"><span class="tocnumber">2</span> <span class="toctext">text &lt; text</span></a></li>
-<li class="toclevel-1 tocsection-3"><a href="#text_.26_text"><span class="tocnumber">3</span> <span class="toctext">text &amp; text</span></a></li>
-<li class="toclevel-1 tocsection-4"><a href="#text_.27_text"><span class="tocnumber">4</span> <span class="toctext">text ' text</span></a></li>
-<li class="toclevel-1 tocsection-5"><a href="#text_.22_text"><span class="tocnumber">5</span> <span class="toctext">text " text</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: text > text">edit</a>]</span> <span class="mw-headline" id="text_.3E_text"> text &gt; text </span></h2>
-<p>section 1
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a>]</span> <span class="mw-headline" id="text_.3C_text"> text &lt; text </span></h2>
-<p>section 2
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a>]</span> <span class="mw-headline" id="text_.26_text"> text &amp; text </span></h2>
-<p>section 3
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a>]</span> <span class="mw-headline" id="text_.27_text"> text ' text </span></h2>
-<p>section 4
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a>]</span> <span class="mw-headline" id="text_.22_text"> text " text </span></h2>
-<p>section 5
-</p>
-!! end
-
-!! test
-Headers with excess '=' characters
-(Are similar tests necessary beyond the 1st level?)
-!! input
-=foo==
-==foo=
-=''italic'' heading==
-==''italic'' heading=
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#foo.3D"><span class="tocnumber">1</span> <span class="toctext">foo=</span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#.3Dfoo"><span class="tocnumber">2</span> <span class="toctext">=foo</span></a></li>
-<li class="toclevel-1 tocsection-3"><a href="#italic_heading.3D"><span class="tocnumber">3</span> <span class="toctext"><i>italic</i> heading=</span></a></li>
-<li class="toclevel-1 tocsection-4"><a href="#.3Ditalic_heading"><span class="tocnumber">4</span> <span class="toctext">=<i>italic</i> heading</span></a></li>
-</ul>
-</td></tr></table>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: foo=">edit</a>]</span> <span class="mw-headline" id="foo.3D">foo=</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =foo">edit</a>]</span> <span class="mw-headline" id=".3Dfoo">=foo</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: italic heading=">edit</a>]</span> <span class="mw-headline" id="italic_heading.3D"><i>italic</i> heading=</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: =italic heading">edit</a>]</span> <span class="mw-headline" id=".3Ditalic_heading">=<i>italic</i> heading</span></h1>
-
-!! end
-
-!! test
-BUG 1219 URL next to image (broken)
-!! input
-http://example.com[[Image:foobar.jpg]]
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!!end
-
-!! test
-Bug 1186 news: in the middle of text
-!! input
-http://en.wikinews.org/wiki/Wikinews:Workplace
-!! result
-<p><a rel="nofollow" class="external free" href="http://en.wikinews.org/wiki/Wikinews:Workplace">http://en.wikinews.org/wiki/Wikinews:Workplace</a>
-</p>
-!!end
-
-
-!! test
-Namespaced link must have a title
-!! input
-[[Project:]]
-!! result
-<p>[[Project:]]
-</p>
-!!end
-
-!! test
-Namespaced link must have a title (bad fragment version)
-!! input
-[[Project:#fragment]]
-!! result
-<p>[[Project:#fragment]]
-</p>
-!!end
-
-
-!! test
-div with no attributes
-!! input
-<div>HTML rocks</div>
-!! result
-<div>HTML rocks</div>
-
-!! end
-
-!! test
-div with double-quoted attribute
-!! input
-<div id="rock">HTML rocks</div>
-!! result
-<div id="rock">HTML rocks</div>
-
-!! end
-
-!! test
-div with single-quoted attribute
-!! input
-<div id='rock'>HTML rocks</div>
-!! result
-<div id="rock">HTML rocks</div>
-
-!! end
-
-!! test
-div with unquoted attribute
-!! input
-<div id=rock>HTML rocks</div>
-!! result
-<div id="rock">HTML rocks</div>
-
-!! end
-
-!! test
-div with illegal double attributes
-!! input
-<div id="a" id="b">HTML rocks</div>
-!! result
-<div id="b">HTML rocks</div>
-
-!!end
-
-!! test
-HTML multiple attributes correction
-!! input
-<p class="error" class="awesome">Awesome!</p>
-!! result
-<p class="awesome">Awesome!</p>
-
-!!end
-
-!! test
-Table multiple attributes correction
-!! input
-{|
-!+ class="error" class="awesome"| status
-|}
-!! result
-<table>
-<tr>
-<th class="awesome"> status
-</th></tr></table>
-
-!!end
-
-!! test
-DIV IN UPPERCASE
-!! input
-<DIV ID="x">HTML ROCKS</DIV>
-!! result
-<div id="x">HTML ROCKS</div>
-
-!!end
-
-
-!! test
-text with amp in the middle of nowhere
-!! input
-Remember AT&T?
-!!result
-<p>Remember AT&amp;T?
-</p>
-!! end
-
-!! test
-text with character entity: eacute
-!! input
-I always thought &eacute; was a cute letter.
-!! result
-<p>I always thought &#233; was a cute letter.
-</p>
-!! end
-
-!! test
-text with undefined character entity: xacute
-!! input
-I always thought &xacute; was a cute letter.
-!! result
-<p>I always thought &amp;xacute; was a cute letter.
-</p>
-!! end
-
-
-###
-### Media links
-###
-
-!! test
-Media link
-!! input
-[[Media:Foobar.jpg]]
-!! result
-<p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Media:Foobar.jpg</a>
-</p>
-!! end
-
-!! test
-Media link with text
-!! input
-[[Media:Foobar.jpg|A neat file to look at]]
-!! result
-<p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">A neat file to look at</a>
-</p>
-!! end
-
-# FIXME: this is still bad HTML tag nesting
-!! test
-Media link with nasty text
-fixme: doBlockLevels won't wrap this in a paragraph because it contains a div
-!! input
-[[Media:Foobar.jpg|Safe Link<div style=display:none>" onmouseover="alert(document.cookie)" onfoo="</div>]]
-!! result
-<a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Safe Link&lt;div style="display:none"&gt;" onmouseover="alert(document.cookie)" onfoo="&lt;/div&gt;</a>
-
-!! end
-
-!! test
-Media link to nonexistent file (bug 1702)
-!! input
-[[Media:No such.jpg]]
-!! result
-<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=No_such.jpg" class="new" title="No such.jpg">Media:No such.jpg</a>
-</p>
-!! end
-
-!! test
-Image link to nonexistent file (bug 1850 - good)
-!! input
-[[Image:No such.jpg]]
-!! result
-<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=No_such.jpg" class="new" title="File:No such.jpg">File:No such.jpg</a>
-</p>
-!! end
-
-!! test
-:Image link to nonexistent file (bug 1850 - bad)
-!! input
-[[:Image:No such.jpg]]
-!! result
-<p><a href="/index.php?title=File:No_such.jpg&amp;action=edit&amp;redlink=1" class="new" title="File:No such.jpg (page does not exist)">Image:No such.jpg</a>
-</p>
-!! end
-
-
-
-!! test
-Character reference normalization in link text (bug 1938)
-!! input
-[[Main Page|this&that]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">this&amp;that</a>
-</p>
-!!end
-
-!! article
-×Ö·
-!! text
-Test for unicode normalization
-
-The page's name is U+05d0 U+05b7, with non-canonical form U+FB2E
-!! endarticle
-
-!! test
-(bug 19451) Links should refer to the normalized form.
-!! input
-[[&#xFB2E;]]
-[[&#x5d0;&#x5b7;]]
-[[&#x5d0;Ö·]]
-[[×&#x5b7;]]
-[[×Ö·]]
-!! result
-<p><a href="/wiki/%D7%90%D6%B7" title="×Ö·">&#xfb2e;</a>
-<a href="/wiki/%D7%90%D6%B7" title="×Ö·">&#x5d0;&#x5b7;</a>
-<a href="/wiki/%D7%90%D6%B7" title="×Ö·">&#x5d0;Ö·</a>
-<a href="/wiki/%D7%90%D6%B7" title="×Ö·">×&#x5b7;</a>
-<a href="/wiki/%D7%90%D6%B7" title="×Ö·">×Ö·</a>
-</p>
-!! end
-
-!! test
-Empty attribute crash test (bug 2067)
-!! input
-<font color="">foo</font>
-!! result
-<p><font color="">foo</font>
-</p>
-!! end
-
-!! test
-Empty attribute crash test single-quotes (bug 2067)
-!! input
-<font color=''>foo</font>
-!! result
-<p><font color="">foo</font>
-</p>
-!! end
-
-!! test
-Attribute test: equals, then nothing
-!! input
-<font color=>foo</font>
-!! result
-<p><font>foo</font>
-</p>
-!! end
-
-!! test
-Attribute test: unquoted value
-!! input
-<font color=x>foo</font>
-!! result
-<p><font color="x">foo</font>
-</p>
-!! end
-
-!! test
-Attribute test: unquoted but illegal value (hash)
-!! input
-<font color=#x>foo</font>
-!! result
-<p><font color="#x">foo</font>
-</p>
-!! end
-
-!! test
-Attribute test: no value
-!! input
-<font color>foo</font>
-!! result
-<p><font color="color">foo</font>
-</p>
-!! end
-
-!! test
-Bug 2095: link with three closing brackets
-!! input
-[[Main Page]]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>]
-</p>
-!! end
-
-!! test
-Bug 2095: link with pipe and three closing brackets
-!! input
-[[Main Page|link]]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">link</a>]
-</p>
-!! end
-
-!! test
-Bug 2095: link with pipe and three closing brackets, version 2
-!! input
-[[Main Page|[http://example.com/]]]
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">[http://example.com/]</a>
-</p>
-!! end
-
-
-###
-### Safety
-###
-
-!! article
-Template:Dangerous attribute
-!! text
-" onmouseover="alert(document.cookie)
-!! endarticle
-
-!! article
-Template:Dangerous style attribute
-!! text
-border-size: expression(alert(document.cookie))
-!! endarticle
-
-!! article
-Template:Div style
-!! text
-<div style="float: right; {{{1}}}">Magic div</div>
-!! endarticle
-
-!! test
-Bug 2304: HTML attribute safety (safe template; regression bug 2309)
-!! input
-<div title="{{test}}"></div>
-!! result
-<div title="This is a test template"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (dangerous template; 2309)
-!! input
-<div title="{{dangerous attribute}}"></div>
-!! result
-<div title=""></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (dangerous style template; 2309)
-!! input
-<div style="{{dangerous style attribute}}"></div>
-!! result
-<div style="/* insecure input */"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (safe parameter; 2309)
-!! input
-{{div style|width: 200px}}
-!! result
-<div style="float: right; width: 200px">Magic div</div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (unsafe parameter; 2309)
-!! input
-{{div style|width: expression(alert(document.cookie))}}
-!! result
-<div style="/* insecure input */">Magic div</div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (unsafe breakout parameter; 2309)
-!! input
-{{div style|"><script>alert(document.cookie)</script>}}
-!! result
-<div style="float: right;">&lt;script&gt;alert(document.cookie)&lt;/script&gt;"&gt;Magic div</div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (unsafe breakout parameter 2; 2309)
-!! input
-{{div style|" ><script>alert(document.cookie)</script>}}
-!! result
-<div style="float: right;">&lt;script&gt;alert(document.cookie)&lt;/script&gt;"&gt;Magic div</div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (link)
-!! input
-<div title="[[Main Page]]"></div>
-!! result
-<div title="&#91;&#91;Main Page]]"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (italics)
-!! input
-<div title="''foobar''"></div>
-!! result
-<div title="&#39;&#39;foobar&#39;&#39;"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (bold)
-!! input
-<div title="'''foobar'''"></div>
-!! result
-<div title="&#39;&#39;&#39;foobar&#39;&#39;&#39;"></div>
-
-!! end
-
-
-!! test
-Bug 2304: HTML attribute safety (ISBN)
-!! input
-<div title="ISBN 1234567890"></div>
-!! result
-<div title="&#73;SBN 1234567890"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (RFC)
-!! input
-<div title="RFC 1234"></div>
-!! result
-<div title="&#82;FC 1234"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (PMID)
-!! input
-<div title="PMID 1234567890"></div>
-!! result
-<div title="&#80;MID 1234567890"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (web link)
-!! input
-<div title="http://example.com/"></div>
-!! result
-<div title="http&#58;//example.com/"></div>
-
-!! end
-
-!! test
-Bug 2304: HTML attribute safety (named web link)
-!! input
-<div title="[http://example.com/ link]"></div>
-!! result
-<div title="&#91;http&#58;//example.com/ link]"></div>
-
-!! end
-
-!! test
-Bug 3244: HTML attribute safety (extension; safe)
-!! input
-<div style="<nowiki>background:blue</nowiki>"></div>
-!! result
-<div style="background:blue"></div>
-
-!! end
-
-!! test
-Bug 3244: HTML attribute safety (extension; unsafe)
-!! input
-<div style="<nowiki>border-left:expression(alert(document.cookie))</nowiki>"></div>
-!! result
-<div style="/* insecure input */"></div>
-
-!! end
-
-# More MSIE fun discovered by Tom Gilder
-
-!! test
-MSIE CSS safety test: spurious slash
-!! input
-<div style="background-image:u\rl(javascript:alert('boo'))">evil</div>
-!! result
-<div style="/* insecure input */">evil</div>
-
-!! end
-
-!! test
-MSIE CSS safety test: hex code
-!! input
-<div style="background-image:u\72l(javascript:alert('boo'))">evil</div>
-!! result
-<div style="/* insecure input */">evil</div>
-
-!! end
-
-!! test
-MSIE CSS safety test: comment in url
-!! input
-<div style="background-image:u/**/rl(javascript:alert('boo'))">evil</div>
-!! result
-<div style="background-image:u rl(javascript:alert(&#39;boo&#39;))">evil</div>
-
-!! end
-
-!! test
-MSIE CSS safety test: comment in expression
-!! input
-<div style="background-image:expres/**/sion(alert('boo4'))">evil4</div>
-!! result
-<div style="background-image:expres sion(alert(&#39;boo4&#39;))">evil4</div>
-
-!! end
-
-
-!! test
-Table attribute legitimate extension
-!! input
-{|
-!+ style="<nowiki>color:blue</nowiki>"| status
-|}
-!! result
-<table>
-<tr>
-<th style="color:blue"> status
-</th></tr></table>
-
-!!end
-
-!! test
-Table attribute safety
-!! input
-{|
-!+ style="<nowiki>border-width:expression(0+alert(document.cookie))</nowiki>"| status
-|}
-!! result
-<table>
-<tr>
-<th style="/* insecure input */"> status
-</th></tr></table>
-
-!! end
-
-!! test
-CSS line continuation 1
-!! input
-<div style="background-image: u\&#10;rl(test.jpg);"></div>
-!! result
-<div style="/* insecure input */"></div>
-
-!! end
-
-!! test
-CSS line continuation 2
-!! input
-<div style="background-image: u\&#13;rl(test.jpg); "></div>
-!! result
-<div style="/* insecure input */"></div>
-
-!! end
-
-!! article
-Template:Identity
-!! text
-{{{1}}}
-!! endarticle
-
-!! test
-Expansion of multi-line templates in attribute values (bug 6255)
-!! input
-<div style="background: {{identity|#00FF00}}">-</div>
-!! result
-<div style="background: #00FF00">-</div>
-
-!! end
-
-
-!! test
-Expansion of multi-line templates in attribute values (bug 6255 sanity check)
-!! input
-<div style="background:
-#00FF00">-</div>
-!! result
-<div style="background: #00FF00">-</div>
-
-!! end
-
-!! test
-Expansion of multi-line templates in attribute values (bug 6255 sanity check 2)
-!! input
-<div style="background: &#10;#00FF00">-</div>
-!! result
-<div style="background: &#10;#00FF00">-</div>
-
-!! end
-
-###
-### Parser hooks (see maintenance/parserTestsParserHook.php for the <tag> extension)
-###
-!! test
-Parser hook: empty input
-!! input
-<tag></tag>
-!! result
-<pre>
-string(0) ""
-array(0) {
-}
-</pre>
-
-!! end
-
-!! test
-Parser hook: empty input using terminated empty elements
-!! input
-<tag/>
-!! result
-<pre>
-NULL
-array(0) {
-}
-</pre>
-
-!! end
-
-!! test
-Parser hook: empty input using terminated empty elements (space before)
-!! input
-<tag />
-!! result
-<pre>
-NULL
-array(0) {
-}
-</pre>
-
-!! end
-
-!! test
-Parser hook: basic input
-!! input
-<tag>input</tag>
-!! result
-<pre>
-string(5) "input"
-array(0) {
-}
-</pre>
-
-!! end
-
-
-!! test
-Parser hook: case insensitive
-!! input
-<TAG>input</TAG>
-!! result
-<pre>
-string(5) "input"
-array(0) {
-}
-</pre>
-
-!! end
-
-
-!! test
-Parser hook: case insensitive, redux
-!! input
-<TaG>input</TAg>
-!! result
-<pre>
-string(5) "input"
-array(0) {
-}
-</pre>
-
-!! end
-
-!! test
-Parser hook: nested tags
-!! options
-noxml
-!! input
-<tag><tag></tag></tag>
-!! result
-<pre>
-string(5) "<tag>"
-array(0) {
-}
-</pre>&lt;/tag&gt;
-
-!! end
-
-!! test
-Parser hook: basic arguments
-!! input
-<tag width=200 height = "100" depth = '50' square></tag>
-!! result
-<pre>
-string(0) ""
-array(4) {
- ["width"]=>
- string(3) "200"
- ["height"]=>
- string(3) "100"
- ["depth"]=>
- string(2) "50"
- ["square"]=>
- string(6) "square"
-}
-</pre>
-
-!! end
-
-!! test
-Parser hook: argument containing a forward slash (bug 5344)
-!! input
-<tag filename='/tmp/bla'></tag>
-!! result
-<pre>
-string(0) ""
-array(1) {
- ["filename"]=>
- string(8) "/tmp/bla"
-}
-</pre>
-
-!! end
-
-!! test
-Parser hook: empty input using terminated empty elements (bug 2374)
-!! input
-<tag foo=bar/>text
-!! result
-<pre>
-NULL
-array(1) {
- ["foo"]=>
- string(3) "bar"
-}
-</pre>text
-
-!! end
-
-# </tag> should be output literally since there is no matching tag that begins it
-!! test
-Parser hook: basic arguments using terminated empty elements (bug 2374)
-!! input
-<tag width=200 height = "100" depth = '50' square/>
-other stuff
-</tag>
-!! result
-<pre>
-NULL
-array(4) {
- ["width"]=>
- string(3) "200"
- ["height"]=>
- string(3) "100"
- ["depth"]=>
- string(2) "50"
- ["square"]=>
- string(6) "square"
-}
-</pre>
-<p>other stuff
-&lt;/tag&gt;
-</p>
-!! end
-
-###
-### (see maintenance/parserTestsStaticParserHook.php for the <statictag> extension)
-###
-
-!! test
-Parser hook: static parser hook not inside a comment
-!! input
-<statictag>hello, world</statictag>
-<statictag action=flush/>
-!! result
-<p>hello, world
-</p>
-!! end
-
-
-!! test
-Parser hook: static parser hook inside a comment
-!! input
-<!-- <statictag>hello, world</statictag> -->
-<statictag action=flush/>
-!! result
-<p><br />
-</p>
-!! end
-
-# Nested template calls; this case was broken by Parser.php rev 1.506,
-# since reverted.
-
-!! article
-Template:One-parameter
-!! text
-(My parameter is: {{{1}}})
-!! endarticle
-
-!! article
-Template:Map-one-parameter
-!! text
-{{{{{1}}}|{{{2}}}}}
-!! endarticle
-
-!! test
-Nested template calls
-!! input
-{{Map-one-parameter|One-parameter|param}}
-!! result
-<p>(My parameter is: param)
-</p>
-!! end
-
-
-###
-### Sanitizer
-###
-!! test
-Sanitizer: Closing of open tags
-!! input
-<s></s><table></table>
-!! result
-<s></s><table></table>
-
-!! end
-
-!! test
-Sanitizer: Closing of open but not closed tags
-!! input
-<s>foo
-!! result
-<p><s>foo</s>
-</p>
-!! end
-
-!! test
-Sanitizer: Closing of closed but not open tags
-!! input
-</s>
-!! result
-<p>&lt;/s&gt;
-</p>
-!! end
-
-!! test
-Sanitizer: Closing of closed but not open table tags
-!! input
-Table not started</td></tr></table>
-!! result
-<p>Table not started&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
-</p>
-!! end
-
-!! test
-Sanitizer: Escaping of spaces, multibyte characters, colons & other stuff in id=""
-!! input
-<span id="æ: v">byte</span>[[#æ: v|backlink]]
-!! result
-<p><span id=".C3.A6:_v">byte</span><a href="#.C3.A6:_v">backlink</a>
-</p>
-!! end
-
-!! test
-Sanitizer: Validating the contents of the id attribute (bug 4515)
-!! options
-disabled
-!! input
-<br id=9 />
-!! result
-Something, but definitely not <br id="9" />...
-!! end
-
-!! test
-Sanitizer: Validating id attribute uniqueness (bug 4515, bug 6301)
-!! options
-disabled
-!! input
-<br id="foo" /><br id="foo" />
-!! result
-Something need to be done. foo-2 ?
-!! end
-
-!! test
-Language converter: output gets cut off unexpectedly (bug 5757)
-!! options
-language=zh
-!! input
-this bit is safe: }-
-
-but if we add a conversion instance: -{zh-cn:xxx;zh-tw:yyy}-
-
-then we get cut off here: }-
-
-all additional text is vanished
-!! result
-<p>this bit is safe: }-
-</p><p>but if we add a conversion instance: xxx
-</p><p>then we get cut off here: }-
-</p><p>all additional text is vanished
-</p>
-!! end
-
-!! test
-Self closed html pairs (bug 5487)
-!! options
-!! input
-<center><font id="bug" />Centered text</center>
-<div><font id="bug2" />In div text</div>
-!! result
-<center>&lt;font id="bug" /&gt;Centered text</center>
-<div>&lt;font id="bug2" /&gt;In div text</div>
-
-!! end
-
-#
-#
-#
-
-!! test
-Punctuation: nbsp before exclamation
-!! input
-C'est grave !
-!! result
-<p>C'est grave&#160;!
-</p>
-!! end
-
-!! test
-Punctuation: CSS !important (bug 11874)
-!! input
-<div style="width:50% !important">important</div>
-!! result
-<div style="width:50% !important">important</div>
-
-!!end
-
-!! test
-Punctuation: CSS ! important (bug 11874; with space after)
-!! input
-<div style="width:50% ! important">important</div>
-!! result
-<div style="width:50% ! important">important</div>
-
-!!end
-
-
-!! test
-HTML bullet list, closed tags (bug 5497)
-!! input
-<ul>
-<li>One</li>
-<li>Two</li>
-</ul>
-!! result
-<ul>
-<li>One</li>
-<li>Two</li>
-</ul>
-
-!! end
-
-!! test
-HTML bullet list, unclosed tags (bug 5497)
-!! options
-disabled
-!! input
-<ul>
-<li>One
-<li>Two
-</ul>
-!! result
-<ul>
-<li>One
-</li><li>Two
-</li></ul>
-
-!! end
-
-!! test
-HTML ordered list, closed tags (bug 5497)
-!! input
-<ol>
-<li>One</li>
-<li>Two</li>
-</ol>
-!! result
-<ol>
-<li>One</li>
-<li>Two</li>
-</ol>
-
-!! end
-
-!! test
-HTML ordered list, unclosed tags (bug 5497)
-!! options
-disabled
-!! input
-<ol>
-<li>One
-<li>Two
-</ol>
-!! result
-<ol>
-<li>One
-</li><li>Two
-</li></ol>
-
-!! end
-
-!! test
-HTML nested bullet list, closed tags (bug 5497)
-!! input
-<ul>
-<li>One</li>
-<li>Two:
-<ul>
-<li>Sub-one</li>
-<li>Sub-two</li>
-</ul>
-</li>
-</ul>
-!! result
-<ul>
-<li>One</li>
-<li>Two:
-<ul>
-<li>Sub-one</li>
-<li>Sub-two</li>
-</ul>
-</li>
-</ul>
-
-!! end
-
-!! test
-HTML nested bullet list, open tags (bug 5497)
-!! options
-disabled
-!! input
-<ul>
-<li>One
-<li>Two:
-<ul>
-<li>Sub-one
-<li>Sub-two
-</ul>
-</ul>
-!! result
-<ul>
-<li>One
-</li><li>Two:
-<ul>
-<li>Sub-one
-</li><li>Sub-two
-</li></ul>
-</li></ul>
-
-!! end
-
-!! test
-HTML nested ordered list, closed tags (bug 5497)
-!! input
-<ol>
-<li>One</li>
-<li>Two:
-<ol>
-<li>Sub-one</li>
-<li>Sub-two</li>
-</ol>
-</li>
-</ol>
-!! result
-<ol>
-<li>One</li>
-<li>Two:
-<ol>
-<li>Sub-one</li>
-<li>Sub-two</li>
-</ol>
-</li>
-</ol>
-
-!! end
-
-!! test
-HTML nested ordered list, open tags (bug 5497)
-!! options
-disabled
-!! input
-<ol>
-<li>One
-<li>Two:
-<ol>
-<li>Sub-one
-<li>Sub-two
-</ol>
-</ol>
-!! result
-<ol>
-<li>One
-</li><li>Two:
-<ol>
-<li>Sub-one
-</li><li>Sub-two
-</li></ol>
-</li></ol>
-
-!! end
-
-!! test
-HTML ordered list item with parameters oddity
-!! input
-<ol><li id="fragment">One</li></ol>
-!! result
-<ol><li id="fragment">One</li></ol>
-
-!! end
-
-!!test
-bug 5918: autonumbering
-!! input
-[http://first/] [http://second] [ftp://ftp]
-
-ftp://inlineftp
-
-[mailto:enclosed@mail.tld With target]
-
-[mailto:enclosed@mail.tld]
-
-mailto:inline@mail.tld
-!! result
-<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>
-!! end
-
-
-#
-# Security and HTML correctness
-# From Nick Jenkins' fuzz testing
-#
-
-!! test
-Fuzz testing: Parser13
-!! input
-{|
-| http://a|
-!! result
-<table>
-<tr>
-<td>
-</td>
-</tr>
-</table>
-
-!! end
-
-!! test
-Fuzz testing: Parser14
-!! input
-== onmouseover= ==
-http://__TOC__
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a>]</span> <span class="mw-headline" id="onmouseover.3D"> onmouseover= </span></h2>
-http://<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
-</ul>
-</td></tr></table>
-
-!! end
-
-!! test
-Fuzz testing: Parser14-table
-!! input
-==a==
-{| STYLE=__TOC__
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: a">edit</a>]</span> <span class="mw-headline" id="a">a</span></h2>
-<table style="&#95;_TOC&#95;_">
-<tr><td></td></tr>
-</table>
-
-!! end
-
-# Known to produce bogus xml (extra </td>)
-!! test
-Fuzz testing: Parser16
-!! options
-noxml
-!! input
-{|
-!https://||||||
-!! result
-<table>
-<tr>
-<th>https://</th>
-<th></th>
-<th></th>
-<th>
-</td>
-</tr>
-</table>
-
-!! end
-
-!! test
-Fuzz testing: Parser21
-!! input
-{|
-! irc://{{ftp://a" onmouseover="alert('hello world');"
-|
-!! result
-<table>
-<tr>
-<th> <a rel="nofollow" class="external free" href="irc://{{ftp://a">irc://{{ftp://a</a>" onmouseover="alert('hello world');"
-</th>
-<td>
-</td>
-</tr>
-</table>
-
-!! end
-
-!! test
-Fuzz testing: Parser22
-!! input
-http://===r:::https://b
-
-{|
-!!result
-<p><a rel="nofollow" class="external free" href="http://===r:::https://b">http://===r:::https://b</a>
-</p>
-<table>
-<tr><td></td></tr>
-</table>
-
-!! end
-
-# Known to produce bad XML for now
-!! test
-Fuzz testing: Parser24
-!! options
-noxml
-!! input
-{|
-{{{|
-<u CLASS=
-| {{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}} >
-<br style="onmouseover='alert(document.cookie);' " />
-
-MOVE YOUR MOUSE CURSOR OVER THIS TEXT
-|
-!! result
-<table>
-{{{|
-<u class="&#124;">}}}} &gt;
-<br style="onmouseover=&#39;alert(document.cookie);&#39;" />
-
-MOVE YOUR MOUSE CURSOR OVER THIS TEXT
-<tr>
-<td></u>
-</td>
-</tr>
-</table>
-
-!! end
-
-# Note: the current result listed for this is not what the original one was,
-# but the original bug was JavaScript injection, which is fixed in any case.
-# It's not clear that the original result listed was any more correct than the
-# current one. Original result:
-# <p>{{{|
-# </p>
-# <li class="&#124;&#124;">
-# }}}blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
-!!test
-Fuzz testing: Parser25 (bug 6055)
-!! input
-{{{
-|
-<LI CLASS=||
- >
-}}}blah" onmouseover="alert('hello world');" align="left"'''MOVE MOUSE CURSOR OVER HERE
-!! result
-<p>&lt;LI CLASS=blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
-</p>
-!! end
-
-!!test
-Fuzz testing: URL adjacent extension (with space, clean)
-!! options
-!! input
-http://example.com <nowiki>junk</nowiki>
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> junk
-</p>
-!!end
-
-!!test
-Fuzz testing: URL adjacent extension (no space, dirty; nowiki)
-!! options
-!! input
-http://example.com<nowiki>junk</nowiki>
-!! result
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>junk
-</p>
-!!end
-
-!!test
-Fuzz testing: URL adjacent extension (no space, dirty; pre)
-!! options
-!! input
-http://example.com<pre>junk</pre>
-!! result
-<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><pre>junk</pre>
-
-!!end
-
-!!test
-Fuzz testing: image with bogus manual thumbnail
-!!input
-[[Image:foobar.jpg|thumbnail= ]]
-!!result
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;">Error creating thumbnail: <div class="thumbcaption"></div></div></div>
-
-!!end
-
-!! test
-Fuzz testing: encoded newline in generated HTML replacements (bug 6577)
-!! input
-<pre dir="&#10;"></pre>
-!! result
-<pre dir="&#10;"></pre>
-
-!! end
-
-!! test
-Parsing optional HTML elements (Bug 6171)
-!! options
-!! input
-<table>
- <tr>
- <td> Some tabular data</td>
- <td> More tabular data ...
- <td> And yet som tabular data</td>
- </tr>
-</table>
-!! result
-<table>
- <tr>
- <td> Some tabular data</td>
- <td> More tabular data ...
- </td><td> And yet som tabular data</td>
- </tr>
-</table>
-
-!! end
-
-!! test
-Correct handling of <td>, <tr> (Bug 6171)
-!! options
-!! input
-<table>
- <tr>
- <td> Some tabular data</td>
- <td> More tabular data ...</td>
- <td> And yet som tabular data</td>
- </tr>
-</table>
-!! result
-<table>
- <tr>
- <td> Some tabular data</td>
- <td> More tabular data ...</td>
- <td> And yet som tabular data</td>
- </tr>
-</table>
-
-!! end
-
-
-!! test
-Parsing crashing regression (fr:JavaScript)
-!! input
-</body></x>
-!! result
-<p>&lt;/body&gt;&lt;/x&gt;
-</p>
-!! end
-
-!! test
-Inline wiki vs wiki block nesting
-!! input
-'''Bold paragraph
-
-New wiki paragraph
-!! result
-<p><b>Bold paragraph</b>
-</p><p>New wiki paragraph
-</p>
-!! end
-
-!! test
-Inline HTML vs wiki block nesting
-!! options
-disabled
-!! input
-<b>Bold paragraph
-
-New wiki paragraph
-!! result
-<p><b>Bold paragraph</b>
-</p><p>New wiki paragraph
-</p>
-!! end
-
-# Original result was this:
-# <p><b>bold</b><b>bold<i>bolditalics</i></b>
-# </p>
-# While that might be marginally more intuitive, maybe, the six-apostrophe
-# construct is clearly pathological and the result stated here (which is what
-# the parser actually does) is about as reasonable as anything.
-!!test
-Mixing markup for italics and bold
-!! options
-!! input
-'''bold''''''bold''bolditalics'''''
-!! result
-<p>'<i>bold'</i><b>bold<i>bolditalics</i></b>
-</p>
-!! end
-
-
-!! article
-Xyzzyx
-!! text
-Article for special page transclusion test
-!! endarticle
-
-!! test
-Special page transclusion
-!! options
-!! input
-{{Special:Prefixindex/Xyzzyx}}
-!! result
-<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
-
-!! end
-
-!! test
-Special page transclusion twice (bug 5021)
-!! options
-!! input
-{{Special:Prefixindex/Xyzzyx}}
-{{Special:Prefixindex/Xyzzyx}}
-!! result
-<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
-<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
-
-!! end
-
-!! test
-Transclusion of default MediaWiki message
-!! input
-{{MediaWiki:Mainpage}}
-!!result
-<p>Main Page
-</p>
-!! end
-
-!! test
-Transclusion of nonexistent MediaWiki message
-!! input
-{{MediaWiki:Mainpagexxx}}
-!!result
-<p><a href="/index.php?title=MediaWiki:Mainpagexxx&amp;action=edit&amp;redlink=1" class="new" title="MediaWiki:Mainpagexxx (page does not exist)">MediaWiki:Mainpagexxx</a>
-</p>
-!! end
-
-!! test
-Transclusion of MediaWiki message with underscore
-!! input
-{{MediaWiki:history_short}}
-!! result
-<p>History
-</p>
-!! end
-
-!! test
-Transclusion of MediaWiki message with space
-!! input
-{{MediaWiki:history short}}
-!! result
-<p>History
-</p>
-!! end
-
-!! test
-Invalid header with following text
-!! input
-= x = y
-!! result
-<p>= x = y
-</p>
-!! end
-
-
-!! test
-Section extraction test (section 0)
-!! options
-section=0
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-!! end
-
-!! test
-Section extraction test (section 1)
-!! options
-section=1
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-==a==
-===aa===
-====aaa====
-!! end
-
-!! test
-Section extraction test (section 2)
-!! options
-section=2
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-===aa===
-====aaa====
-!! end
-
-!! test
-Section extraction test (section 3)
-!! options
-section=3
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-====aaa====
-!! end
-
-!! test
-Section extraction test (section 4)
-!! options
-section=4
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-!! end
-
-!! test
-Section extraction test (section 5)
-!! options
-section=5
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-===ba===
-!! end
-
-!! test
-Section extraction test (section 6)
-!! options
-section=6
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-===bb===
-====bba====
-!! end
-
-!! test
-Section extraction test (section 7)
-!! options
-section=7
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-====bba====
-!! end
-
-!! test
-Section extraction test (section 8)
-!! options
-section=8
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-===bc===
-!! end
-
-!! test
-Section extraction test (section 9)
-!! options
-section=9
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-==c==
-===ca===
-!! end
-
-!! test
-Section extraction test (section 10)
-!! options
-section=10
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-===ca===
-!! end
-
-!! test
-Section extraction test (nonexistent section 11)
-!! options
-section=11
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-!! end
-
-!! test
-Section extraction test with bogus heading (section 1)
-!! options
-section=1
-!! input
-==a==
-==bogus== not a legal section
-==b==
-!! result
-==a==
-==bogus== not a legal section
-!! end
-
-!! test
-Section extraction test with bogus heading (section 2)
-!! options
-section=2
-!! input
-==a==
-==bogus== not a legal section
-==b==
-!! result
-==b==
-!! end
-
-!! test
-Section extraction test with comment after heading (section 1)
-!! options
-section=1
-!! input
-==a==
-==b== <!-- -->
-==c==
-!! result
-==a==
-!! end
-
-!! test
-Section extraction test with comment after heading (section 2)
-!! options
-section=2
-!! input
-==a==
-==b== <!-- -->
-==c==
-!! result
-==b== <!-- -->
-!! end
-
-!! test
-Section extraction test with bogus <nowiki> heading (section 1)
-!! options
-section=1
-!! input
-==a==
-==bogus== <nowiki>not a legal section</nowiki>
-==b==
-!! result
-==a==
-==bogus== <nowiki>not a legal section</nowiki>
-!! end
-
-!! test
-Section extraction test with bogus <nowiki> heading (section 2)
-!! options
-section=2
-!! input
-==a==
-==bogus== <nowiki>not a legal section</nowiki>
-==b==
-!! result
-==b==
-!! end
-
-
-# Formerly testing for bug 2587, now resolved by the use of unmarked sections
-# instead of respecting commented sections
-!! test
-Section extraction prefixed by comment (section 1)
-!! options
-section=1
-!! input
-<!-- -->==sec1==
-==sec2==
-!!result
-==sec2==
-!!end
-
-!! test
-Section extraction prefixed by comment (section 2)
-!! options
-section=2
-!! input
-<!-- -->==sec1==
-==sec2==
-!!result
-
-!!end
-
-
-# Formerly testing for bug 2607, now resolved by the use of unmarked sections
-# instead of respecting HTML-style headings
-!! test
-Section extraction, mixed wiki and html (section 1)
-!! options
-section=1
-!! input
-<h2>unmarked</h2>
-unmarked
-==1==
-one
-==2==
-two
-!! result
-==1==
-one
-!! end
-
-!! test
-Section extraction, mixed wiki and html (section 2)
-!! options
-section=2
-!! input
-<h2>unmarked</h2>
-unmarked
-==1==
-one
-==2==
-two
-!! result
-==2==
-two
-!! end
-
-
-# Formerly testing for bug 3342
-!! test
-Section extraction, heading surrounded by <noinclude>
-!! options
-section=1
-!! input
-<noinclude>==unmarked==</noinclude>
-==marked==
-!! result
-==marked==
-!!end
-
-# Test behaviour of bug 19910
-!! test
-Sectiion with all-equals
-!! options
-section=2
-!! input
-===
-The line above must have a trailing space
-=== <!--
---> <!-- -->
-But just in case it doesn't...
-!! result
-=== <!--
---> <!-- -->
-But just in case it doesn't...
-!! end
-
-!! test
-Section replacement test (section 0)
-!! options
-replace=0,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-xxx
-
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 1)
-!! options
-replace=1,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-xxx
-
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 2)
-!! options
-replace=2,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-xxx
-
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 3)
-!! options
-replace=3,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-xxx
-
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 4)
-!! options
-replace=4,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-xxx
-
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 5)
-!! options
-replace=5,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-xxx
-
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 6)
-!! options
-replace=6,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-xxx
-
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 7)
-!! options
-replace=7,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-xxx
-
-===bc===
-==c==
-===ca===
-!! end
-
-!! test
-Section replacement test (section 8)
-!! options
-replace=8,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-xxx
-
-==c==
-===ca===
-!!end
-
-!! test
-Section replacement test (section 9)
-!! options
-replace=9,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-xxx
-!! end
-
-!! test
-Section replacement test (section 10)
-!! options
-replace=10,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-xxx
-!! end
-
-!! test
-Section replacement test with initial whitespace (bug 13728)
-!! options
-replace=2,"xxx"
-!! input
- Preformatted initial line
-==a==
-===a===
-!! result
- Preformatted initial line
-==a==
-xxx
-!! end
-
-
-!! test
-Section extraction, heading followed by pre with 20 spaces (bug 6398)
-!! options
-section=1
-!! input
-==a==
- a
-!! result
-==a==
- a
-!! end
-
-!! test
-Section extraction, heading followed by pre with 19 spaces (bug 6398 sanity check)
-!! options
-section=1
-!! input
-==a==
- a
-!! result
-==a==
- a
-!! end
-
-
-!! test
-Section extraction, <pre> around bogus header (bug 10309)
-!! options
-noxml section=2
-!! input
-== Section One ==
-<pre>
-=======
-</pre>
-
-== Section Two ==
-stuff
-!! result
-== Section Two ==
-stuff
-!! end
-
-!! test
-Section replacement, <pre> around bogus header (bug 10309)
-!! options
-noxml replace=2,"xxx"
-!! input
-== Section One ==
-<pre>
-=======
-</pre>
-
-== Section Two ==
-stuff
-!! result
-== Section One ==
-<pre>
-=======
-</pre>
-
-xxx
-!! end
-
-
-
-!! test
-Handling of &#x0A; in URLs
-!! input
-**irc://&#x0A;a
-!! result
-<ul><li><ul><li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
-</li></ul>
-</li></ul>
-
-!!end
-
-!! test
-5 quotes, code coverage +1 line
-!! input
-'''''
-!! result
-!! end
-
-!! test
-Special:Search page linking.
-!! input
-{{Special:search}}
-!! result
-<p><a href="/wiki/Special:Search" title="Special:Search">Special:Search</a>
-</p>
-!! end
-
-!! test
-Say the magic word
-!! input
-* {{PAGENAME}}
-* {{BASEPAGENAME}}
-* {{SUBPAGENAME}}
-* {{SUBPAGENAMEE}}
-* {{BASEPAGENAME}}
-* {{BASEPAGENAMEE}}
-* {{TALKPAGENAME}}
-* {{TALKPAGENAMEE}}
-* {{SUBJECTPAGENAME}}
-* {{SUBJECTPAGENAMEE}}
-* {{NAMESPACEE}}
-* {{NAMESPACE}}
-* {{TALKSPACE}}
-* {{TALKSPACEE}}
-* {{SUBJECTSPACE}}
-* {{SUBJECTSPACEE}}
-* {{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}
-!! result
-<ul><li> Parser test
-</li><li> Parser test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Talk:Parser test
-</li><li> Talk:Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li>
-</li><li>
-</li><li> Talk
-</li><li> Talk
-</li><li>
-</li><li>
-</li><li> <a href="/index.php?title=Template:Dynamic&amp;action=edit&amp;redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a>
-</li></ul>
-
-!! end
-### Note: Above tests excludes the "{{NUMBEROFADMINS}}" magic word because it generates a MySQL error when included.
-
-!! test
-Gallery
-!! input
-<gallery>
-image1.png |
-image2.gif|||||
-
-image3|
-image4 |300px| centre
- image5.svg| http://///////
-[[x|xx]]]]
-* image6
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image1.png</div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image2.gif</div>
- <div class="gallerytext">
-<p>||||
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image3</div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image4</div>
- <div class="gallerytext">
-<p>300px| centre
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Image5.svg</div>
- <div class="gallerytext">
-<p><a rel="nofollow" class="external free" href="http://///////">http://///////</a>
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">* image6</div>
- <div class="gallerytext">
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!! test
-Gallery (with options)
-!! input
-<gallery widths='70px' heights='40px' perrow='2' caption='Foo [[Main Page]]' >
-File:Nonexistant.jpg|caption
-File:Nonexistant.jpg
-image:foobar.jpg|some '''caption''' [[Main Page]]
-image:foobar.jpg
-image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
-</gallery>
-!! result
-<ul class="gallery" style="max-width: 226px;_width: 226px;">
- <li class='gallerycaption'>Foo <a href="/wiki/Main_Page" title="Main Page">Main Page</a></li>
- <li class="gallerybox" style="width: 105px"><div style="width: 105px">
- <div style="height: 70px;">Nonexistant.jpg</div>
- <div class="gallerytext">
-<p>caption
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 105px"><div style="width: 105px">
- <div style="height: 70px;">Nonexistant.jpg</div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 105px"><div style="width: 105px">
- <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="70" height="8" /></a></div></div>
- <div class="gallerytext">
-<p>some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 105px"><div style="width: 105px">
- <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="70" height="8" /></a></div></div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 105px"><div style="width: 105px">
- <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="This is a foo-bar." src="http://example.com/images/3/3a/Foobar.jpg" width="70" height="8" /></a></div></div>
- <div class="gallerytext">
-<p>Blabla|blabla.
-</p>
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!! test
-Gallery with wikitext inside caption
-!! input
-<gallery>
-File:foobar.jpg|[[File:foobar.jpg|20px|desc|alt=inneralt]]|alt=galleryalt
-File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="desc"><img alt="inneralt" src="http://example.com/images/3/3a/Foobar.jpg" width="20" height="2" /></a>
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p>This is a test template
-</p>
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!! test
-gallery (with showfilename option)
-!! input
-<gallery showfilename>
-File:Nonexistant.jpg|caption
-File:Nonexistant.jpg
-image:foobar.jpg|some '''caption''' [[Main Page]]
-File:Foobar.jpg
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Nonexistant.jpg</div>
- <div class="gallerytext">
-<p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
-caption
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Nonexistant.jpg</div>
- <div class="gallerytext">
-<p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
-some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
-</p>
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!! test
-Gallery (with namespace-less filenames)
-!! input
-<gallery>
-File:Nonexistant.jpg
-Nonexistant.jpg
-image:foobar.jpg
-foobar.jpg
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Nonexistant.jpg</div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div style="height: 150px;">Nonexistant.jpg</div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
- </div>
- </div></li>
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!! test
-HTML Hex character encoding (spells the word "JavaScript")
-!! input
-&#x4A;&#x061;&#x0076;&#x00061;&#x000053;&#x0000063;&#114;&#x0000069;&#00000112;&#x0000000074;
-!! result
-<p>&#x4a;&#x61;&#x76;&#x61;&#x53;&#x63;&#114;&#x69;&#112;&#x74;
-</p>
-!! end
-
-!! test
-HTML Hex character encoding bogus encoding (bug 26437 regression check)
-!! input
-&#xsee;&#XSEE;
-!! result
-<p>&amp;#xsee;&amp;#XSEE;
-</p>
-!! end
-
-!! test
-HTML Hex character encoding mixed case
-!! input
-&#xEE;&#Xee;
-!! result
-<p>&#xee;&#xee;
-</p>
-!! end
-
-!! test
-__FORCETOC__ override
-!! input
-__NEWSECTIONLINK__
-__FORCETOC__
-!! result
-<p><br />
-</p>
-!! end
-
-!! test
-ISBN code coverage
-!! input
-ISBN 978-0-1234-56&#x20;789
-!! result
-<p><a href="/wiki/Special:BookSources/9780123456" class="internal mw-magiclink-isbn">ISBN 978-0-1234-56</a>&#x20;789
-</p>
-!! end
-
-!! test
-ISBN followed by 5 spaces
-!! input
-ISBN
-!! result
-<p>ISBN
-</p>
-!! end
-
-!! test
-Double ISBN
-!! input
-ISBN ISBN 1234567890
-!! result
-<p>ISBN <a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
-</p>
-!! end
-
-!! test
-Bug 22905: <abbr> followed by ISBN followed by </a>
-!! input
-<abbr>(fr)</abbr> ISBN 2753300917 [http://www.example.com example.com]
-!! result
-<p><abbr>(fr)</abbr> <a href="/wiki/Special:BookSources/2753300917" class="internal mw-magiclink-isbn">ISBN 2753300917</a> <a rel="nofollow" class="external text" href="http://www.example.com">example.com</a>
-</p>
-!! end
-
-!! test
-Double RFC
-!! input
-RFC RFC 1234
-!! result
-<p>RFC <a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc1234">RFC 1234</a>
-</p>
-!! end
-
-!! test
-Double RFC with a wiki link
-!! input
-RFC [[RFC 1234]]
-!! result
-<p>RFC <a href="/index.php?title=RFC_1234&amp;action=edit&amp;redlink=1" class="new" title="RFC 1234 (page does not exist)">RFC 1234</a>
-</p>
-!! end
-
-!! test
-RFC code coverage
-!! input
-RFC 983&#x20;987
-!! result
-<p><a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc983">RFC 983</a>&#x20;987
-</p>
-!! end
-
-!! test
-Centre-aligned image
-!! input
-[[Image:foobar.jpg|centre]]
-!! result
-<div class="center"><div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div></div>
-
-!!end
-
-!! test
-None-aligned image
-!! input
-[[Image:foobar.jpg|none]]
-!! result
-<div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-
-!!end
-
-!! test
-Width + Height sized image (using px) (height is ignored)
-!! input
-[[Image:foobar.jpg|640x480px]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="640" height="73" /></a>
-</p>
-!!end
-
-!! test
-Width-sized image (using px, no following whitespace)
-!! input
-[[Image:foobar.jpg|640px]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="640" height="73" /></a>
-</p>
-!!end
-
-!! test
-Width-sized image (using px, with following whitespace - test regression from r39467)
-!! input
-[[Image:foobar.jpg|640px ]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="640" height="73" /></a>
-</p>
-!!end
-
-!! test
-Width-sized image (using px, with preceding whitespace - test regression from r39467)
-!! input
-[[Image:foobar.jpg| 640px]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="640" height="73" /></a>
-</p>
-!!end
-
-!! test
-Another italics / bold test
-!! input
- ''' ''x'
-!! result
-<pre>'<i> </i>x'
-</pre>
-!!end
-
-# Note the results may be incorrect, as parserTest output included this:
-# XML error: Mismatched tag at byte 6120:
-# ...<dd> </dt></dl> </dd...
-!! test
-dt/dd/dl test
-!! options
-disabled
-!! input
-:;;;::
-!! result
-<dl><dd><dl><dt><dl><dt><dl><dt><dl><dd><dl><dd>
-</dd></dl>
-</dd></dl>
-</dt></dl>
-</dt></dl>
-</dt></dl>
-</dd></dl>
-
-!!end
-
-
-# Images with the "|" character in external URLs in comment tags; Eats half the comment, leaves unmatched "</a>" tag.
-!! test
-Images with the "|" character in the comment
-!! input
-[[image:Foobar.jpg|thumb|An [http://test/?param1=|left|&param2=|x external] URL]]
-!! result
-<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/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></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
-
-!! test
-[Before] HTML without raw HTML enabled ($wgRawHtml==false)
-!! input
-<html><script>alert(1);</script></html>
-!! result
-<p>&lt;html&gt;&lt;script&gt;alert(1);&lt;/script&gt;&lt;/html&gt;
-</p>
-!! end
-
-!! test
-HTML with raw HTML ($wgRawHtml==true)
-!! options
-rawhtml
-!! input
-<html><script>alert(1);</script></html>
-!! result
-<p><script>alert(1);</script>
-</p>
-!! end
-
-!! test
-Parents of subpages, one level up
-!! options
-subpage title=[[Subpage test/L1/L2/L3]]
-!! input
-[[../|L2]]
-!! result
-<p><a href="/index.php?title=Subpage_test/L1/L2&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1/L2 (page does not exist)">L2</a>
-</p>
-!! end
-
-
-!! test
-Parents of subpages, one level up, not named
-!! options
-subpage title=[[Subpage test/L1/L2/L3]]
-!! input
-[[../]]
-!! result
-<p><a href="/index.php?title=Subpage_test/L1/L2&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1/L2 (page does not exist)">Subpage test/L1/L2</a>
-</p>
-!! end
-
-
-
-!! test
-Parents of subpages, two levels up
-!! options
-subpage title=[[Subpage test/L1/L2/L3]]
-!! input
-[[../../|L1]]2
-
-[[../../|L1]]l
-!! result
-<p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1</a>2
-</p><p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1l</a>
-</p>
-!! end
-
-!! test
-Parents of subpages, two levels up, without trailing slash or name.
-!! options
-subpage title=[[Subpage test/L1/L2/L3]]
-!! input
-[[../..]]
-!! result
-<p>[[../..]]
-</p>
-!! end
-
-!! test
-Parents of subpages, two levels up, with lots of extra trailing slashes.
-!! options
-subpage title=[[Subpage test/L1/L2/L3]]
-!! input
-[[../../////]]
-!! result
-<p><a href="/index.php?title=Subpage_test/L1////&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1//// (page does not exist)">///</a>
-</p>
-!! end
-
-!! test
-Definition list code coverage
-!! input
-; title : def
-; title : def
-;title: def
-!! result
-<dl><dt> title &#160;</dt><dd> def
-</dd><dt> title&#160;</dt><dd> def
-</dd><dt>title</dt><dd> def
-</dd></dl>
-
-!! end
-
-!! test
-Don't fall for the self-closing div
-!! input
-<div>hello world</div/>
-!! result
-<div>hello world</div>
-
-!! end
-
-!! test
-MSGNW magic word
-!! input
-{{MSGNW:msg}}
-!! result
-<p>&#91;&#91;:Template:Msg&#93;&#93;
-</p>
-!! end
-
-!! test
-RAW magic word
-!! input
-{{RAW:QUERTY}}
-!! result
-<p><a href="/index.php?title=Template:QUERTY&amp;action=edit&amp;redlink=1" class="new" title="Template:QUERTY (page does not exist)">Template:QUERTY</a>
-</p>
-!! end
-
-# This isn't needed for XHTML conformance, but would be handy as a fallback security measure
-!! test
-Always escape literal '>' in output, not just after '<'
-!! input
-><>
-!! result
-<p>&gt;&lt;&gt;
-</p>
-!! end
-
-!! test
-Template caching
-!! input
-{{Test}}
-{{Test}}
-!! result
-<p>This is a test template
-This is a test template
-</p>
-!! end
-
-
-!! article
-MediaWiki:Fake
-!! text
-==header==
-!! endarticle
-
-!! test
-Inclusion of !userCanEdit() content
-!! input
-{{MediaWiki:Fake}}
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=T-1" title="MediaWiki:Fake">edit</a>]</span> <span class="mw-headline" id="header">header</span></h2>
-
-!! end
-
-
-!! test
-Out-of-order TOC heading levels
-!! input
-==2==
-======6======
-===3===
-=1=
-=====5=====
-==2==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#2"><span class="tocnumber">1</span> <span class="toctext">2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#6"><span class="tocnumber">1.1</span> <span class="toctext">6</span></a></li>
-<li class="toclevel-2 tocsection-3"><a href="#3"><span class="tocnumber">1.2</span> <span class="toctext">3</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-4"><a href="#1"><span class="tocnumber">2</span> <span class="toctext">1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-5"><a href="#5"><span class="tocnumber">2.1</span> <span class="toctext">5</span></a></li>
-<li class="toclevel-2 tocsection-6"><a href="#2_2"><span class="tocnumber">2.2</span> <span class="toctext">2</span></a></li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2">2</span></h2>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: 6">edit</a>]</span> <span class="mw-headline" id="6">6</span></h6>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: 3">edit</a>]</span> <span class="mw-headline" id="3">3</span></h3>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: 1">edit</a>]</span> <span class="mw-headline" id="1">1</span></h1>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: 5">edit</a>]</span> <span class="mw-headline" id="5">5</span></h5>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2_2">2</span></h2>
-
-!! end
-
-
-!! test
-ISBN with a dummy number
-!! input
-ISBN ---
-!! result
-<p>ISBN ---
-</p>
-!! end
-
-
-!! test
-ISBN with space-delimited number
-!! input
-ISBN 92 9017 032 8
-!! result
-<p><a href="/wiki/Special:BookSources/9290170328" class="internal mw-magiclink-isbn">ISBN 92 9017 032 8</a>
-</p>
-!! end
-
-
-!! test
-ISBN with multiple spaces, no number
-!! input
-ISBN foo
-!! result
-<p>ISBN foo
-</p>
-!! end
-
-
-!! test
-ISBN length
-!! input
-ISBN 123456789
-
-ISBN 1234567890
-
-ISBN 12345678901
-!! result
-<p>ISBN 123456789
-</p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
-</p><p>ISBN 12345678901
-</p>
-!! end
-
-
-!! test
-ISBN with trailing year (bug 8110)
-!! input
-ISBN 1-234-56789-0 - 2006
-
-ISBN 1 234 56789 0 - 2006
-!! result
-<p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1-234-56789-0</a> - 2006
-</p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1 234 56789 0</a> - 2006
-</p>
-!! end
-
-
-!! test
-anchorencode
-!! input
-{{anchorencode:foo bar©#%n}}
-!! result
-<p>foo_bar.C2.A9.23.25n
-</p>
-!! end
-
-!! test
-anchorencode trims spaces
-!! input
-{{anchorencode: __pretty__please__}}
-!! result
-<p>pretty_please
-</p>
-!! end
-
-!! test
-anchorencode deals with links
-!! input
-{{anchorencode: [[hello|world]] [[hi]]}}
-!! result
-<p>world_hi
-</p>
-!! end
-
-!! test
-anchorencode deals with templates
-!! input
-{{anchorencode: {{Foo}} }}
-!! result
-<p>FOO
-</p>
-!! end
-
-!! test
-anchorencode encodes like the TOC generator: (bug 18431)
-!! input
-=== _ +:.3A%3A&&amp;]] ===
-{{anchorencode: _ +:.3A%3A&&amp;]] }}
-__NOEDITSECTION__
-!! result
-<h3> <span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D"> _ +:.3A%3A&amp;&amp;]] </span></h3>
-<p>.2B:.3A.253A.26.26.5D.5D
-</p>
-!! end
-
-# Expected output in the following test is not necessarily expected (there
-# should probably be <p> tags inside the <blockquote> in the output) -- it's
-# only testing for well-formedness.
-!! test
-Bug 6200: blockquotes and paragraph formatting
-!! input
-<blockquote>
-foo
-</blockquote>
-
-bar
-
- baz
-!! result
-<blockquote>
-foo
-</blockquote>
-<p>bar
-</p>
-<pre>baz
-</pre>
-!! end
-
-!! test
-Bug 8293: Use of center tag ruins paragraph formatting
-!! input
-<center>
-foo
-</center>
-
-bar
-
- baz
-!! result
-<center>
-<p>foo
-</p>
-</center>
-<p>bar
-</p>
-<pre>baz
-</pre>
-!! end
-
-
-###
-### Language variants related tests
-###
-!! test
-Self-link in language variants
-!! options
-title=[[Dunav]] language=sr
-!! input
-Both [[Dunav]] and [[Дунав]] are names for this river.
-!! result
-<p>Both <strong class="selflink">Dunav</strong> and <strong class="selflink">Дунав</strong> are names for this river.
-</p>
-!!end
-
-
-!! test
-Link to pages in language variants
-!! options
-language=sr
-!! input
-Main Page can be written as [[Маин Паге]]
-!! result
-<p>Main Page can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>
-</p>
-!!end
-
-
-!! test
-Multiple links to pages in language variants
-!! options
-language=sr
-!! input
-[[Main Page]] can be written as [[Маин Паге]] same as [[Маин Паге]].
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a> can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a> same as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>.
-</p>
-!!end
-
-
-!! test
-Simple template in language variants
-!! options
-language=sr
-!! input
-{{теÑÑ‚}}
-!! result
-<p>This is a test template
-</p>
-!! end
-
-
-!! test
-Template with explicit namespace in language variants
-!! options
-language=sr
-!! input
-{{Template:теÑÑ‚}}
-!! result
-<p>This is a test template
-</p>
-!! end
-
-
-!! test
-Basic test for template parameter in language variants
-!! options
-language=sr
-!! input
-{{парамтеÑÑ‚|param=foo}}
-!! result
-<p>This is a test template with parameter foo
-</p>
-!! end
-
-
-!! test
-Simple category in language variants
-!! options
-language=sr cat
-!! input
-[[Category:МедиаWики УÑер'Ñ Ð“ÑƒÐ¸Ð´Ðµ]]
-!! result
-<a href="/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%98%D0%B0:MediaWiki_User%27s_Guide" title="Категорија:MediaWiki User's Guide">MediaWiki User's Guide</a>
-!! end
-
-
-!! test
-Stripping -{}- tags (language variants)
-!! options
-language=sr
-!! input
-Latin proverb: -{Ne nuntium necare}-
-!! result
-<p>Latin proverb: Ne nuntium necare
-</p>
-!! end
-
-
-!! test
-Prevent conversion with -{}- tags (language variants)
-!! options
-language=sr variant=sr-ec
-!! input
-Latinski: -{Ne nuntium necare}-
-!! result
-<p>ЛатинÑки: Ne nuntium necare
-</p>
-!! end
-
-
-!! test
-Prevent conversion of text with -{}- tags (language variants)
-!! options
-language=sr variant=sr-ec
-!! input
-Latinski: -{Ne nuntium necare}-
-!! result
-<p>ЛатинÑки: Ne nuntium necare
-</p>
-!! end
-
-
-!! test
-Prevent conversion of links with -{}- tags (language variants)
-!! options
-language=sr variant=sr-ec
-!! input
--{[[Main Page]]}-
-!! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
-!! end
-
-
-!! test
--{}- tags within headlines (within html for parserConvert())
-!! options
-language=sr variant=sr-ec
-!! input
-== -{Naslov}- ==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Уредите одељак „Naslov“">уреди</a>]</span> <span class="mw-headline" id="-.7BNaslov.7D-"> Naslov </span></h2>
-
-!! end
-
-
-!! test
-Explicit definition of language variant alternatives
-!! options
-language=zh variant=zh-tw
-!! input
--{zh:China;zh-tw:Taiwan}-, not China
-!! result
-<p>Taiwan, not China
-</p>
-!! end
-
-
-!! test
-Explicit session-wise language variant mapping (A flag and - flag)
-!! options
-language=zh variant=zh-tw
-!! input
-Taiwan is not China.
-But -{A|zh:China;zh-tw:Taiwan}- is China,
-(This-{-|zh:China;zh-tw:Taiwan}- should be stripped!)
-and -{China}- is China.
-!! result
-<p>Taiwan is not China.
-But Taiwan is Taiwan,
-(This should be stripped!)
-and China is China.
-</p>
-!! end
-
-!! test
-Explicit session-wise language variant mapping (H flag for hide)
-!! options
-language=zh variant=zh-tw
-!! input
-(This-{H|zh:China;zh-tw:Taiwan}- should be stripped!)
-Taiwan is China.
-!! result
-<p>(This should be stripped!)
-Taiwan is Taiwan.
-</p>
-!! end
-
-!! test
-Adding explicit conversion rule for title (T flag)
-!! options
-language=zh variant=zh-tw showtitle
-!! input
-Should be stripped-{T|zh:China;zh-tw:Taiwan}-!
-!! result
-Taiwan
-<p>Should be stripped!
-</p>
-!! end
-
-!! test
-Testing that changing the language variant here in the tests actually works
-!! options
-language=zh variant=zh showtitle
-!! input
-Should be stripped-{T|zh:China;zh-tw:Taiwan}-!
-!! result
-China
-<p>Should be stripped!
-</p>
-!! end
-
-!! test
-Bug 24072: more test on conversion rule for title
-!! options
-language=zh variant=zh-tw showtitle
-!! input
-This should be stripped-{T|zh:China;zh-tw:Taiwan}-!
-This won't take interferes with the title rule-{H|zh:Beijing;zh-tw:Taipei}-.
-!! result
-Taiwan
-<p>This should be stripped!
-This won't take interferes with the title rule.
-</p>
-!! end
-
-!! test
-Raw output of variant escape tags (R flag)
-!! options
-language=zh variant=zh-tw
-!! input
-Raw: -{R|zh:China;zh-tw:Taiwan}-
-!! result
-<p>Raw: zh:China;zh-tw:Taiwan
-</p>
-!! end
-
-!! test
-Nested using of manual convert syntax
-!! options
-language=zh variant=zh-hk
-!! input
-Nested: -{zh-hans:Hi -{zh-cn:China;zh-sg:Singapore;}-;zh-hant:Hello -{zh-tw:Taiwan;zh-hk:H-{ong}- K-{}-ong;}-;}-!
-!! result
-<p>Nested: Hello Hong Kong!
-</p>
-!! end
-
-!! test
-Do not convert roman numbers to language variants
-!! options
-language=sr variant=sr-ec
-!! input
-Fridrih IV je car.
-!! result
-<p>Фридрих IV је цар.
-</p>
-!! end
-
-!! test
-Unclosed language converter markup "-{"
-!! options
-language=sr
-!! input
--{T|hello
-!! result
-<p>-{T|hello
-</p>
-!! end
-
-!! test
-Don't convert raw rule "-{R|=&gt;}-" to "=>"
-!! options
-language=sr
-!! input
--{R|=&gt;}-
-!! result
-<p>=&gt;
-</p>
-!!end
-
-!!article
-Template:Bullet
-!!text
-* Bar
-!!endarticle
-
-!! test
-Bug 529: Uncovered bullet
-!! input
-* Foo {{bullet}}
-!! result
-<ul><li> Foo
-</li><li> Bar
-</li></ul>
-
-!! end
-
-!! test
-Bug 529: Uncovered table already at line-start
-!! input
-x
-
-{{table}}
-y
-!! result
-<p>x
-</p>
-<table>
-<tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
-<td> 4
-</td></tr></table>
-<p>y
-</p>
-!! end
-
-!! test
-Bug 529: Uncovered bullet in parser function result
-!! input
-* Foo {{lc:{{bullet}} }}
-!! result
-<ul><li> Foo
-</li><li> bar
-</li></ul>
-
-!! end
-
-!! test
-Bug 5678: Double-parsed template argument
-!! input
-{{lc:{{{1}}}|hello}}
-!! result
-<p>{{{1}}}
-</p>
-!! end
-
-!! test
-Bug 5678: Double-parsed template invocation
-!! input
-{{lc:{{paramtest {{!}} param = hello }} }}
-!! result
-<p>{{paramtest | param = hello }}
-</p>
-!! end
-
-!! test
-Case insensitivity of parser functions for non-ASCII characters (bug 8143)
-!! options
-language=cs
-title=[[Main Page]]
-!! input
-{{PRVNÃVELKÉ:ěšÄÅ™}}
-{{prvnívelké:ěšÄÅ™}}
-{{PRVNÃMALÉ:ěšÄÅ™}}
-{{prvnímalé:ěšÄÅ™}}
-{{MALÃ:ěšÄÅ™}}
-{{malá:ěšÄÅ™}}
-{{VELKÃ:ěšÄÅ™}}
-{{velká:ěšÄÅ™}}
-!! result
-<p>ĚšÄÅ™
-ĚšÄÅ™
-ěšÄÅ™
-ěšÄÅ™
-ěšÄÅ™
-ěšÄÅ™
-ĚŠČŘ
-ĚŠČŘ
-</p>
-!! end
-
-!! test
-Morwen/13: Unclosed link followed by heading
-!! input
-[[link
-==heading==
-!! result
-<p>[[link
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
-
-!! end
-
-!! test
-HHP2.1: Heuristics for headings in preprocessor parenthetical structures
-!! input
-{{foo|
-=heading=
-!! result
-<p>{{foo|
-</p>
-<h1> <span class="mw-headline" id="heading">heading</span></h1>
-
-!! end
-
-!! test
-HHP2.2: Heuristics for headings in preprocessor parenthetical structures
-!! input
-{{foo|
-==heading==
-!! result
-<p>{{foo|
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
-
-!! end
-
-!! test
-Tildes in comments
-!! options
-pst
-!! input
-<!-- ~~~~ -->
-!! result
-<!-- ~~~~ -->
-!! end
-
-!! test
-Paragraphs inside divs (no extra line breaks)
-!! input
-<div>Line one
-
-Line two</div>
-!! result
-<div>Line one
-Line two</div>
-
-!! end
-
-!! test
-Paragraphs inside divs (extra line break on open)
-!! input
-<div>
-Line one
-
-Line two</div>
-!! result
-<div>
-<p>Line one
-</p>
-Line two</div>
-
-!! end
-
-!! test
-Paragraphs inside divs (extra line break on close)
-!! input
-<div>Line one
-
-Line two
-</div>
-!! result
-<div>Line one
-<p>Line two
-</p>
-</div>
-
-!! end
-
-!! test
-Paragraphs inside divs (extra line break on open and close)
-!! input
-<div>
-Line one
-
-Line two
-</div>
-!! result
-<div>
-<p>Line one
-</p><p>Line two
-</p>
-</div>
-
-!! end
-
-!! test
-Nesting tags, paragraphs on lines which begin with <div>
-!! options
-disabled
-!! input
-<div></div><strong>A
-B</strong>
-!! result
-<div></div>
-<p><strong>A
-B</strong>
-</p>
-!! end
-
-# Bug 6200: <blockquote> should behave like <div> with respect to line breaks
-!! test
-Bug 6200: paragraphs inside blockquotes (no extra line breaks)
-!! options
-disabled
-!! input
-<blockquote>Line one
-
-Line two</blockquote>
-!! result
-<blockquote>Line one
-Line two</blockquote>
-
-!! end
-
-!! test
-Bug 6200: paragraphs inside blockquotes (extra line break on open)
-!! options
-disabled
-!! input
-<blockquote>
-Line one
-
-Line two</blockquote>
-!! result
-<blockquote>
-<p>Line one
-</p>
-Line two</blockquote>
-
-!! end
-
-!! test
-Bug 6200: paragraphs inside blockquotes (extra line break on close)
-!! options
-disabled
-!! input
-<blockquote>Line one
-
-Line two
-</blockquote>
-!! result
-<blockquote>Line one
-<p>Line two
-</p>
-</blockquote>
-
-!! end
-
-!! test
-Bug 6200: paragraphs inside blockquotes (extra line break on open and close)
-!! options
-disabled
-!! input
-<blockquote>
-Line one
-
-Line two
-</blockquote>
-!! result
-<blockquote>
-<p>Line one
-</p><p>Line two
-</p>
-</blockquote>
-
-!! end
-
-!! test
-Paragraphs inside blockquotes/divs (no extra line breaks)
-!! input
-<blockquote><div>Line one
-
-Line two</div></blockquote>
-!! result
-<blockquote><div>Line one
-Line two</div></blockquote>
-
-!! end
-
-!! test
-Paragraphs inside blockquotes/divs (extra line break on open)
-!! input
-<blockquote><div>
-Line one
-
-Line two</div></blockquote>
-!! result
-<blockquote><div>
-<p>Line one
-</p>
-Line two</div></blockquote>
-
-!! end
-
-!! test
-Paragraphs inside blockquotes/divs (extra line break on close)
-!! input
-<blockquote><div>Line one
-
-Line two
-</div></blockquote>
-!! result
-<blockquote><div>Line one
-<p>Line two
-</p>
-</div></blockquote>
-
-!! end
-
-!! test
-Paragraphs inside blockquotes/divs (extra line break on open and close)
-!! input
-<blockquote><div>
-Line one
-
-Line two
-</div></blockquote>
-!! result
-<blockquote><div>
-<p>Line one
-</p><p>Line two
-</p>
-</div></blockquote>
-
-!! end
-
-!! test
-Interwiki links trounced by replaceExternalLinks after early LinkHolderArray expansion
-!! options
-wgLinkHolderBatchSize=0
-!! input
-[[meatball:1]]
-[[meatball:2]]
-[[meatball:3]]
-!! result
-<p><a href="http://www.usemod.com/cgi-bin/mb.pl?1" class="extiw" title="meatball:1">meatball:1</a>
-<a href="http://www.usemod.com/cgi-bin/mb.pl?2" class="extiw" title="meatball:2">meatball:2</a>
-<a href="http://www.usemod.com/cgi-bin/mb.pl?3" class="extiw" title="meatball:3">meatball:3</a>
-</p>
-!! end
-
-!! test
-Free external link invading image caption
-!! input
-[[Image:Foobar.jpg|thumb|http://x|hello]]
-!! result
-<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/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></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>hello</div></div></div>
-
-!! end
-
-!! test
-Bug 15196: localised external link numbers
-!! options
-language=fa
-!! input
-[http://en.wikipedia.org/]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="http://en.wikipedia.org/">[Û±]</a>
-</p>
-!! end
-
-!! test
-Multibyte character in padleft
-!! input
-{{padleft:-Hello|7|Æ}}
-!! result
-<p>Æ-Hello
-</p>
-!! end
-
-!! test
-Multibyte character in padright
-!! input
-{{padright:Hello-|7|Æ}}
-!! result
-<p>Hello-Æ
-</p>
-!! end
-
-!! test
-Formatted date
-!! config
-wgUseDynamicDates=1
-!! input
-[[2009-03-24]]
-!! result
-<p><span class="mw-formatted-date" title="2009-03-24"><a href="/index.php?title=2009&amp;action=edit&amp;redlink=1" class="new" title="2009 (page does not exist)">2009</a>-<a href="/index.php?title=March_24&amp;action=edit&amp;redlink=1" class="new" title="March 24 (page does not exist)">03-24</a></span>
-</p>
-!!end
-
-!!test
-formatdate parser function
-!!input
-{{#formatdate:2009-03-24}}
-!! result
-<p><span class="mw-formatted-date" title="2009-03-24">2009-03-24</span>
-</p>
-!! end
-
-!!test
-formatdate parser function, with default format
-!!input
-{{#formatdate:2009-03-24|mdy}}
-!! result
-<p><span class="mw-formatted-date" title="2009-03-24">March 24, 2009</span>
-</p>
-!! end
-
-!! test
-Linked date with autoformatting disabled
-!! config
-wgUseDynamicDates=false
-!! input
-[[2009-03-24]]
-!! result
-<p><a href="/index.php?title=2009-03-24&amp;action=edit&amp;redlink=1" class="new" title="2009-03-24 (page does not exist)">2009-03-24</a>
-</p>
-!! end
-
-!! test
-Spacing of numbers in formatted dates
-!! input
-{{#formatdate:January 15}}
-!! result
-<p><span class="mw-formatted-date" title="01-15">January 15</span>
-</p>
-!! end
-
-!! test
-Spacing of numbers in formatted dates (linked)
-!! config
-wgUseDynamicDates=true
-!! input
-[[January 15]]
-!! result
-<p><span class="mw-formatted-date" title="01-15"><a href="/index.php?title=January_15&amp;action=edit&amp;redlink=1" class="new" title="January 15 (page does not exist)">January 15</a></span>
-</p>
-!! end
-
-!! test
-formatdate parser function, with default format and on a page of which the content language is always English and different from the wiki content language
-!! options
-language=nl title=[[MediaWiki:Common.css]]
-!! input
-{{#formatdate:2009-03-24|dmy}}
-!! result
-<p><span class="mw-formatted-date" title="2009-03-24">24 March 2009</span>
-</p>
-!! end
-
-#
-#
-#
-
-#
-# Edit comments
-#
-
-!! test
-Edit comment with link
-!! options
-comment
-!! input
-I like the [[Main Page]] a lot
-!! result
-I like the <a href="/wiki/Main_Page" title="Main Page">Main Page</a> a lot
-!!end
-
-!! test
-Edit comment with link and link text
-!! options
-comment
-!! input
-I like the [[Main Page|best pages]] a lot
-!! result
-I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
-!!end
-
-!! test
-Edit comment with link and link text with suffix
-!! options
-comment
-!! input
-I like the [[Main Page|best page]]s a lot
-!! result
-I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
-!!end
-
-!! test
-Edit comment with section link (non-local, eg in history list)
-!! options
-comment title=[[Main Page]]
-!! input
-/* External links */ removed bogus entries
-!! result
-<a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
-!!end
-
-!! test
-Edit comment with section link and text before it (non-local, eg in history list)
-!! options
-comment title=[[Main Page]]
-!! input
-pre-comment text /* External links */ removed bogus entries
-!! result
-pre-comment text - <a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
-!!end
-
-!! test
-Edit comment with section link (local, eg in diff view)
-!! options
-comment local title=[[Main Page]]
-!! input
-/* External links */ removed bogus entries
-!! result
-<a href="#External_links">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
-!!end
-
-!! test
-Edit comment with subpage link (bug 14080)
-!! options
-comment
-subpage
-title=[[Subpage test]]
-!! input
-Poked at a [[/subpage]] here...
-!! result
-Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a> here...
-!!end
-
-!! test
-Edit comment with subpage link and link text (bug 14080)
-!! options
-comment
-subpage
-title=[[Subpage test]]
-!! input
-Poked at a [[/subpage|neat little page]] here...
-!! result
-Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">neat little page</a> here...
-!!end
-
-!! test
-Edit comment with bogus subpage link in non-subpage NS (bug 14080)
-!! options
-comment
-title=[[Subpage test]]
-!! input
-Poked at a [[/subpage]] here...
-!! result
-Poked at a <a href="/index.php?title=/subpage&amp;action=edit&amp;redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a> here...
-!!end
-
-!! test
-Edit comment with bare anchor link (local, as on diff)
-!! options
-comment
-local
-title=[[Main Page]]
-!!input
-[[#section]]
-!! result
-<a href="#section">#section</a>
-!! end
-
-!! test
-Edit comment with bare anchor link (non-local, as on history)
-!! options
-comment
-title=[[Main Page]]
-!!input
-[[#section]]
-!! result
-<a href="/wiki/Main_Page#section" title="Main Page">#section</a>
-!! end
-
-!! test
-Anchor starting with underscore
-!!input
-[[#_ref|One]]
-!! result
-<p><a href="#_ref">One</a>
-</p>
-!! end
-
-!! test
-Id starting with underscore
-!!input
-<div id="_ref"></div>
-!! result
-<div id="_ref"></div>
-
-!! end
-
-!! test
-Space normalisation on autocomment (bug 22784)
-!! options
-comment
-title=[[Main Page]]
-!!input
-/* __hello__world__ */
-!! result
-<a href="/wiki/Main_Page#hello_world" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">__hello__world__</span></span>
-!! end
-
-!! test
-percent-encoding and + signs in comments (Bug 26410)
-!! options
-comment
-!!input
-[[ABC%33D% ++]] [[ABC%33D% ++|+%20]]
-!! result
-<a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">ABC3D% ++</a> <a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">+%20</a>
-!! end
-
-!! test
-Bad images - basic functionality
-!! options
-disabled
-!! input
-[[File:Bad.jpg]]
-!! result
-!! end
-
-!! test
-Bad images - bug 16039: text after bad image disappears
-!! options
-disabled
-!! input
-Foo bar
-[[File:Bad.jpg]]
-Bar foo
-!! result
-<p>Foo bar
-</p><p>Bar foo
-</p>
-!! end
-
-!! test
-Verify that displaytitle works (bug #22501) no displaytitle
-!! options
-showtitle
-!! config
-wgAllowDisplayTitle=true
-wgRestrictDisplayTitle=false
-!! input
-this is not the the title
-!! result
-Parser test
-<p>this is not the the title
-</p>
-!! end
-
-!! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=false
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=true
-wgRestrictDisplayTitle=false
-!! input
-this is not the the title
-{{DISPLAYTITLE:whatever}}
-!! result
-whatever
-<p>this is not the the title
-</p>
-!! end
-
-!! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=true mismatch
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=true
-wgRestrictDisplayTitle=true
-!! input
-this is not the the title
-{{DISPLAYTITLE:whatever}}
-!! result
-Screen
-<p>this is not the the title
-</p>
-!! end
-
-!! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=true matching
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=true
-wgRestrictDisplayTitle=true
-!! input
-this is not the the title
-{{DISPLAYTITLE:screen}}
-!! result
-screen
-<p>this is not the the title
-</p>
-!! end
-
-!! test
-Verify that displaytitle works (bug #22501) AllowDisplayTitle=false
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=false
-!! input
-this is not the the title
-{{DISPLAYTITLE:screen}}
-!! result
-Screen
-<p>this is not the the title
-<a href="/index.php?title=Template:DISPLAYTITLE:screen&amp;action=edit&amp;redlink=1" class="new" title="Template:DISPLAYTITLE:screen (page does not exist)">Template:DISPLAYTITLE:screen</a>
-</p>
-!! end
-
-!! test
-Verify that displaytitle works (bug #22501) AllowDisplayTitle=false no DISPLAYTITLE
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=false
-!! input
-this is not the the title
-!! result
-Screen
-<p>this is not the the title
-</p>
-!! end
-
-!! test
-preload: check <noinclude> and <includeonly>
-!! options
-preload
-!! input
-Hello <noinclude>cruel</noinclude><includeonly>kind</includeonly> world.
-!! result
-Hello kind world.
-!! end
-
-!! test
-preload: check <onlyinclude>
-!! options
-preload
-!! input
-Goodbye <onlyinclude>Hello world</onlyinclude>
-!! result
-Hello world
-!! end
-
-!! test
-preload: can pass tags through if we want to
-!! options
-preload
-!! input
-<includeonly><</includeonly>includeonly>Hello world<includeonly><</includeonly>/includeonly>
-!! result
-<includeonly>Hello world</includeonly>
-!! end
-
-!! test
-preload: check that it doesn't try to do tricks
-!! options
-preload
-!! input
-* <!-- Hello --> ''{{world}}'' {{<includeonly>subst:</includeonly>How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
-!! result
-* <!-- Hello --> ''{{world}}'' {{subst:How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
-!! end
-
-!! test
-Play a bit with r67090 and bug 3158
-!! options
-disabled
-!! input
-<div style="width:50% !important">&nbsp;</div>
-<div style="width:50%&nbsp;!important">&nbsp;</div>
-<div style="width:50%&#160;!important">&nbsp;</div>
-<div style="border : solid;">&nbsp;</div>
-!! result
-<div style="width:50% !important">&nbsp;</div>
-<div style="width:50% !important">&nbsp;</div>
-<div style="width:50% !important">&nbsp;</div>
-<div style="border&#160;: solid;">&nbsp;</div>
-
-!! end
-
-!! test
-HTML5 data attributes
-!! input
-<span data-foo="bar">Baz</span>
-<p data-abc-def_hij="">Quuz</p>
-!! result
-<p><span data-foo="bar">Baz</span>
-</p>
-<p data-abc-def_hij="">Quuz</p>
-
-!! end
-
-!! test
-percent-encoding and + signs in internal links (Bug 26410)
-!! input
-[[User:+%]] [[Page+title%]]
-[[%+]] [[%+|%20]] [[%+ ]] [[%+r]]
-[[%]] [[+]] [[image:%+abc%39|foo|[[bar]]]]
-[[%33%45]] [[%33%45+]]
-!! result
-<p><a href="/index.php?title=User:%2B%25&amp;action=edit&amp;redlink=1" class="new" title="User:+% (page does not exist)">User:+%</a> <a href="/index.php?title=Page%2Btitle%25&amp;action=edit&amp;redlink=1" class="new" title="Page+title% (page does not exist)">Page+title%</a>
-<a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%+</a> <a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%20</a> <a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%+ </a> <a href="/index.php?title=%25%2Br&amp;action=edit&amp;redlink=1" class="new" title="%+r (page does not exist)">%+r</a>
-<a href="/index.php?title=%25&amp;action=edit&amp;redlink=1" class="new" title="% (page does not exist)">%</a> <a href="/index.php?title=%2B&amp;action=edit&amp;redlink=1" class="new" title="+ (page does not exist)">+</a> <a href="/index.php?title=Special:Upload&amp;wpDestFile=%25%2Babc9" class="new" title="File:%+abc9">bar</a>
-<a href="/index.php?title=3E&amp;action=edit&amp;redlink=1" class="new" title="3E (page does not exist)">3E</a> <a href="/index.php?title=3E%2B&amp;action=edit&amp;redlink=1" class="new" title="3E+ (page does not exist)">3E+</a>
-</p>
-!! end
-
-!! test
-Special characters in embedded file links (bug 27679)
-!! input
-[[File:Contains & ampersand.jpg]]
-[[File:Does not exist.jpg|Title with & ampersand]]
-!! result
-<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Contains_%26_ampersand.jpg" class="new" title="File:Contains &amp; ampersand.jpg">File:Contains &amp; ampersand.jpg</a>
-<a href="/index.php?title=Special:Upload&amp;wpDestFile=Does_not_exist.jpg" class="new" title="File:Does not exist.jpg">Title with &amp; ampersand</a>
-</p>
-!! end
-
-
-!! test
-Confirm that 'apos' named character reference doesn't make it to output (not legal in HTML 4)
-!! input
-Text&apos;s been normalized?
-!! result
-<p>Text&#39;s been normalized?
-</p>
-!! end
-
-!! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate free external links
-!! input
-http://www.example.org/ <-- U+3000 (vim: ^Vu3000)
-!! result
-<p><a rel="nofollow" class="external free" href="http://www.example.org/">http://www.example.org/</a> &lt;-- U+3000 (vim: ^Vu3000)
-</p>
-!! end
-
-!! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate bracketed external links
-!! input
-[http://www.example.org/ ideograms]
-!! result
-<p><a rel="nofollow" class="external text" href="http://www.example.org/">ideograms</a>
-</p>
-!! end
-
-!! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate external images links
-!! input
-http://www.example.org/pic.png <-- U+3000 (vim: ^Vu3000)
-!! result
-<p><img src="http://www.example.org/pic.png" alt="pic.png" /> &lt;-- U+3000 (vim: ^Vu3000)
-</p>
-!! end
-
-!! article
-Mediawiki:loop1
-!! text
-{{Identical|A}}
-!! endarticle
-
-!! article
-Mediawiki:loop2
-!! text
-{{Identical|B}}
-!! endarticle
-
-!! article
-Template:Identical
-!! text
-{{int:loop1}}
-{{int:loop2}}
-!! endarticle
-
-!! test
-Bug 31098 Template which includes system messages which includes the template
-!! input
-{{Identical}}
-!! result
-<p><span class="error">Template loop detected: <a href="/wiki/Template:Identical" title="Template:Identical">Template:Identical</a></span>
-<span class="error">Template loop detected: <a href="/wiki/Template:Identical" title="Template:Identical">Template:Identical</a></span>
-</p>
-!! end
-
-!! test
-Bug31490 Turkish: ucfirst 'blah'
-!! options
-language=tr
-!! input
-{{ucfirst:blah}}
-!! result
-<p>Blah
-</p>
-!! end
-
-!! test
-Bug31490 Turkish: ucfirst 'ix'
-!! options
-language=tr
-!! input
-{{ucfirst:ix}}
-!! result
-<p>Ä°x
-</p>
-!! end
-
-!! test
-Bug31490 Turkish: lcfirst 'BLAH'
-!! options
-language=tr
-!! input
-{{lcfirst:BLAH}}
-!! result
-<p>bLAH
-</p>
-!! end
-
-!! test
-Bug31490 Turkish: ucfırst (with a dotless i)
-!! options
-language=tr
-!! input
-{{ucfırst:blah}}
-!! result
-<p><a href="/index.php?title=%C5%9Eablon:Ucf%C4%B1rst:blah&amp;action=edit&amp;redlink=1" class="new" title="Şablon:Ucfırst:blah (sayfa mevcut değil)">Şablon:Ucfırst:blah</a>
-</p>
-!! end
-
-!! test
-Bug31490 ucfırst (with a dotless i) with English language
-!! options
-language=en
-!! input
-{{ucfırst:blah}}
-!! result
-<p><a href="/index.php?title=Template:Ucf%C4%B1rst:blah&amp;action=edit&amp;redlink=1" class="new" title="Template:Ucfırst:blah (page does not exist)">Template:Ucfırst:blah</a>
-</p>
-!! end
-
-!! test
-Bug 26375: TOC with italics
-!! options
-title=[[Main Page]]
-!! input
-__TOC__
-== ''Lost'' episodes ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a>]</span> <span class="mw-headline" id="Lost_episodes"> <i>Lost</i> episodes </span></h2>
-
-!! end
-
-!! test
-Bug 26375: TOC with bold
-!! options
-title=[[Main Page]]
-!! input
-__TOC__
-== '''should be bold''' then normal text ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a>]</span> <span class="mw-headline" id="should_be_bold_then_normal_text"> <b>should be bold</b> then normal text </span></h2>
-
-!! end
-
-!! test
-Bug 33845: Headings become cursive in TOC when they contain an image
-!! options
-title=[[Main Page]]
-!! input
-__TOC__
-== Image [[Image:foobar.jpg]] ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a>]</span> <span class="mw-headline" id="Image"> Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> </span></h2>
-
-!! end
-
-!! test
-Bug 33845 (2): Headings become bold in TOC when they contain a blockquote
-!! options
-title=[[Main Page]]
-!! input
-__TOC__
-== <blockquote>Quote</blockquote> ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a>]</span> <span class="mw-headline" id="Quote"> <blockquote>Quote</blockquote> </span></h2>
-
-!! end
-
-!! test
-Unclosed tags in TOC
-!! options
-title=[[Main Page]]
-!! input
-__TOC__
-== Proof: 2 < 3 ==
-<small>Hanc marginis exiguitas non caperet.</small>
-QED
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 &lt; 3</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a>]</span> <span class="mw-headline" id="Proof:_2_.3C_3"> Proof: 2 &lt; 3 </span></h2>
-<p><small>Hanc marginis exiguitas non caperet.</small>
-QED
-</p>
-!! end
-
-!! test
-Multiple tags in TOC
-!! input
-__TOC__
-== <i>Foo</i> <b>Bar</b> ==
-
-== <i>Foo</i> <blockquote>Bar</blockquote> ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Foo_Bar"><span class="tocnumber">1</span> <span class="toctext"><i>Foo</i> <b>Bar</b></span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar"> <i>Foo</i> <b>Bar</b> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> <i>Foo</i> <blockquote>Bar</blockquote> </span></h2>
-
-!! end
-
-!! test
-Tags with parameters in TOC
-!! input
-__TOC__
-== <sup class="in-h2">Hello</sup> ==
-
-== <sup class="a > b">Evilbye</sup> ==
-!! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Hello"><span class="tocnumber">1</span> <span class="toctext"><sup>Hello</sup></span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#b.22.3EEvilbye"><span class="tocnumber">2</span> <span class="toctext"><sup> b"&gt;Evilbye</sup></span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Hello">edit</a>]</span> <span class="mw-headline" id="Hello"> <sup class="in-h2">Hello</sup> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a>]</span> <span class="mw-headline" id="b.22.3EEvilbye"> <sup> b"&gt;Evilbye</sup> </span></h2>
-
-!! end
-
-!! article
-MediaWiki:Bug32057
-!! text
-== {{int:headline_sample}} ==
-!! endarticle
-
-!! test
-Bug 32057: Title needed when expanding <h> nodes.
-!! options
-title=[[Main Page]]
-!! input
-{{int:Bug32057}}
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a>]</span> <span class="mw-headline" id="Headline_text"> Headline text </span></h2>
-
-!! end
-
-!! test
-Strip marker in urlencode
-!! input
-{{urlencode:x<nowiki/>y}}
-{{urlencode:x<nowiki/>y|wiki}}
-{{urlencode:x<nowiki/>y|path}}
-!! result
-<p>xy
-xy
-xy
-</p>
-!! end
-
-!! test
-Strip marker in lc
-!! input
-{{lc:x<nowiki/>y}}
-!! result
-<p>xy
-</p>
-!! end
-
-!! test
-Strip marker in uc
-!! input
-{{uc:x<nowiki/>y}}
-!! result
-<p>XY
-</p>
-!! end
-
-!! test
-Strip marker in formatNum
-!! input
-{{formatnum:1<nowiki/>2}}
-{{formatnum:1<nowiki/>2|R}}
-!! result
-<p>12
-12
-</p>
-!! end
-
-!! test
-Strip marker in grammar
-!! options
-language=fi
-!! input
-{{grammar:elative|foo<nowiki/>bar}}
-!! result
-<p>foobarista
-</p>
-!! end
-
-!! test
-Strip marker in padleft
-!! input
-{{padleft:|2|x<nowiki/>y}}
-!! result
-<p>xy
-</p>
-!! end
-
-!! test
-Strip marker in padright
-!! input
-{{padright:|2|x<nowiki/>y}}
-!! result
-<p>xy
-</p>
-!! end
-
-!! test
-Strip marker in anchorencode
-!! input
-{{anchorencode:x<nowiki/>y}}
-!! result
-<p>xy
-</p>
-!! end
-
-!! test
-nowiki inside link inside heading (bug 18295)
-!! input
-==[[foo|x<nowiki>y</nowiki>z]]==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: xyz">edit</a>]</span> <span class="mw-headline" id="xyz"><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">xyz</a></span></h2>
-
-!! end
-
-!! test
-new support for bdi element (bug 31817)
-!! input
-<p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 ב×פריל 1870–22 בינו×ר 1924) ×”×•× ×ž× ×”×™×’ פוליטי קומוניסטי רוסי.</p>
-!! result
-<p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 ב×פריל 1870–22 בינו×ר 1924) ×”×•× ×ž× ×”×™×’ פוליטי קומוניסטי רוסי.</p>
-
-!!end
-
-!! test
-Ignore pipe between table row attributes
-!! input
-{|
-| quux
-|- id=foo | style='color: red'
-| bar
-|}
-!! result
-<table>
-<tr>
-<td> quux
-</td></tr>
-<tr id="foo" style="color: red">
-<td> bar
-</td></tr></table>
-
-!! end
-
-!!test
-Gallery override link with WikiLink (bug 34852)
-!! input
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p>caption
-</p>
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!!test
-Gallery override link with absolute external link (bug 34852)
-!! input
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p>caption
-</p>
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!!test
-Gallery override link with malicious javascript (bug 34852)
-!! input
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
-</gallery>
-!! result
-<ul class="gallery">
- <li class="gallerybox" style="width: 155px"><div style="width: 155px">
- <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
- <div class="gallerytext">
-<p>caption
-</p>
- </div>
- </div></li>
-</ul>
-
-!! end
-
-!!test
-Language parser function
-!! input
-{{#language:ar}}
-!! result
-<p>العربية
-</p>
-!! end
-
-!!test
-Padleft and padright as substr
-!! input
-{{padleft:|3|abcde}}
-{{padright:|3|abcde}}
-!! result
-<p>abc
-abc
-</p>
-!! end
-
-!!test
-Bug 34939 - Case insensitive link parsing ([HttP://])
-!! input
-[HttP://MediaWiki.Org/]
-!! result
-<p><a rel="nofollow" class="external autonumber" href="HttP://MediaWiki.Org/">[1]</a>
-</p>
-!! end
-
-!!test
-Bug 34939 - Case insensitive link parsing ([HttP:// title])
-!! input
-[HttP://MediaWiki.Org/ MediaWiki]
-!! result
-<p><a rel="nofollow" class="external text" href="HttP://MediaWiki.Org/">MediaWiki</a>
-</p>
-!! end
-
-!!test
-Bug 34939 - Case insensitive link parsing (HttP://)
-!! input
-HttP://MediaWiki.Org/
-!! result
-<p><a rel="nofollow" class="external free" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a>
-</p>
-!! end
-
-
-TODO:
-more images
-more tables
-character entities
-and much more
-Try for 100% code coverage
diff --git a/tests/parser/parserTestsParserHook.php b/tests/parser/parserTestsParserHook.php
deleted file mode 100644
index 24d852c5..00000000
--- a/tests/parser/parserTestsParserHook.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * A basic extension that's used by the parser tests to test whether input and
- * arguments are passed to extensions properly.
- *
- * Copyright © 2005, 2006 Ævar Arnfjörð Bjarmason
- *
- * 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 Testing
- * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- */
-
-class ParserTestParserHook {
-
- static function setup( &$parser ) {
- $parser->setHook( 'tag', array( __CLASS__, 'dumpHook' ) );
- $parser->setHook( 'statictag', array( __CLASS__, 'staticTagHook' ) );
- return true;
- }
-
- static function dumpHook( $in, $argv ) {
- ob_start();
- var_dump(
- $in,
- $argv
- );
- $ret = ob_get_clean();
-
- return "<pre>\n$ret</pre>";
- }
-
- static function staticTagHook( $in, $argv, $parser ) {
- if ( ! count( $argv ) ) {
- $parser->static_tag_buf = $in;
- return '';
- } elseif ( count( $argv ) === 1 && isset( $argv['action'] )
- && $argv['action'] === 'flush' && $in === null )
- {
- // Clear the buffer, we probably don't need to
- if ( isset( $parser->static_tag_buf ) ) {
- $tmp = $parser->static_tag_buf;
- } else {
- $tmp = '';
- }
- $parser->static_tag_buf = null;
- return $tmp;
- } else
- // wtf?
- return
- "\nCall this extension as <statictag>string</statictag> or as" .
- " <statictag action=flush/>, not in any other way.\n" .
- "text: " . var_export( $in, true ) . "\n" .
- "argv: " . var_export( $argv, true ) . "\n";
- }
-}
diff --git a/tests/parser/preprocess/All_system_messages.expected b/tests/parser/preprocess/All_system_messages.expected
deleted file mode 100644
index 897c5fb0..00000000
--- a/tests/parser/preprocess/All_system_messages.expected
+++ /dev/null
@@ -1,5646 +0,0 @@
-<root><template><title>int:allmessagestext</title></template>
-
-&lt;table border=1 width=100%&gt;&lt;tr&gt;&lt;td&gt;
-'''Name'''
-&lt;/td&gt;&lt;td&gt;
-'''Default text'''
-&lt;/td&gt;&lt;td&gt;
-'''Current text'''
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1movedto2&amp;action=edit 1movedto2]&lt;br&gt;
-[[MediaWiki_talk:1movedto2|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1 moved to $2
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:1movedto2</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Monobook.css&amp;action=edit Monobook.css]&lt;br&gt;
-[[MediaWiki_talk:Monobook.css|Talk]]
-&lt;/td&gt;&lt;td&gt;
-/* edit this file to customize the monobook skin for the entire site */
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Monobook.css</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:About&amp;action=edit about]&lt;br&gt;
-[[MediaWiki_talk:About|Talk]]
-&lt;/td&gt;&lt;td&gt;
-About
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:About</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Aboutpage&amp;action=edit aboutpage]&lt;br&gt;
-[[MediaWiki_talk:Aboutpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:About
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Aboutpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Aboutwikipedia&amp;action=edit aboutwikipedia]&lt;br&gt;
-[[MediaWiki_talk:Aboutwikipedia|Talk]]
-&lt;/td&gt;&lt;td&gt;
-About Wiktionary
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Aboutwikipedia</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-addsection&amp;action=edit accesskey-addsection]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-addsection|Talk]]
-&lt;/td&gt;&lt;td&gt;
-+
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-addsection</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-anontalk&amp;action=edit accesskey-anontalk]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-anontalk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-n
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-anontalk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-anonuserpage&amp;action=edit accesskey-anonuserpage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-anonuserpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-anonuserpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-article&amp;action=edit accesskey-article]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-article|Talk]]
-&lt;/td&gt;&lt;td&gt;
-a
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-article</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-compareselectedversions&amp;action=edit accesskey-compareselectedversions]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-compareselectedversions|Talk]]
-&lt;/td&gt;&lt;td&gt;
-v
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-compareselectedversions</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-contributions&amp;action=edit accesskey-contributions]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-contributions|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-contributions&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-contributions</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-currentevents&amp;action=edit accesskey-currentevents]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-currentevents|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-currentevents&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-currentevents</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-delete&amp;action=edit accesskey-delete]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-delete|Talk]]
-&lt;/td&gt;&lt;td&gt;
-d
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-delete</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-edit&amp;action=edit accesskey-edit]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-edit|Talk]]
-&lt;/td&gt;&lt;td&gt;
-e
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-edit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-emailuser&amp;action=edit accesskey-emailuser]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-emailuser|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-emailuser&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-emailuser</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-help&amp;action=edit accesskey-help]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-help|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-help&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-help</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-history&amp;action=edit accesskey-history]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-history|Talk]]
-&lt;/td&gt;&lt;td&gt;
-h
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-history</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-login&amp;action=edit accesskey-login]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-login|Talk]]
-&lt;/td&gt;&lt;td&gt;
-o
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-login</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-logout&amp;action=edit accesskey-logout]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-logout|Talk]]
-&lt;/td&gt;&lt;td&gt;
-o
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-logout</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mainpage&amp;action=edit accesskey-mainpage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-mainpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-z
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-mainpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-minoredit&amp;action=edit accesskey-minoredit]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-minoredit|Talk]]
-&lt;/td&gt;&lt;td&gt;
-i
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-minoredit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-move&amp;action=edit accesskey-move]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-move|Talk]]
-&lt;/td&gt;&lt;td&gt;
-m
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-move</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mycontris&amp;action=edit accesskey-mycontris]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-mycontris|Talk]]
-&lt;/td&gt;&lt;td&gt;
-y
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-mycontris</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mytalk&amp;action=edit accesskey-mytalk]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-mytalk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-n
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-mytalk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-portal&amp;action=edit accesskey-portal]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-portal|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-portal&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-portal</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-preferences&amp;action=edit accesskey-preferences]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-preferences|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-preferences&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-preferences</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-preview&amp;action=edit accesskey-preview]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-preview|Talk]]
-&lt;/td&gt;&lt;td&gt;
-p
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-preview</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-protect&amp;action=edit accesskey-protect]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-protect|Talk]]
-&lt;/td&gt;&lt;td&gt;
-=
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-protect</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-randompage&amp;action=edit accesskey-randompage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-randompage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-x
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-randompage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-recentchanges&amp;action=edit accesskey-recentchanges]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-recentchanges|Talk]]
-&lt;/td&gt;&lt;td&gt;
-r
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-recentchanges</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-recentchangeslinked&amp;action=edit accesskey-recentchangeslinked]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-recentchangeslinked|Talk]]
-&lt;/td&gt;&lt;td&gt;
-c
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-recentchangeslinked</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-save&amp;action=edit accesskey-save]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-save|Talk]]
-&lt;/td&gt;&lt;td&gt;
-s
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-save</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-search&amp;action=edit accesskey-search]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-search|Talk]]
-&lt;/td&gt;&lt;td&gt;
-f
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-search</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-sitesupport&amp;action=edit accesskey-sitesupport]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-sitesupport|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-sitesupport&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-sitesupport</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-specialpage&amp;action=edit accesskey-specialpage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-specialpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;lt;accesskey-specialpage&amp;amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-specialpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-specialpages&amp;action=edit accesskey-specialpages]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-specialpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-q
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-specialpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-talk&amp;action=edit accesskey-talk]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-talk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-t
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-talk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-undelete&amp;action=edit accesskey-undelete]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-undelete|Talk]]
-&lt;/td&gt;&lt;td&gt;
-d
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-undelete</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-unwatch&amp;action=edit accesskey-unwatch]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-unwatch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-w
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-unwatch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-upload&amp;action=edit accesskey-upload]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-upload|Talk]]
-&lt;/td&gt;&lt;td&gt;
-u
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-upload</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-userpage&amp;action=edit accesskey-userpage]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-userpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-userpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-viewsource&amp;action=edit accesskey-viewsource]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-viewsource|Talk]]
-&lt;/td&gt;&lt;td&gt;
-e
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-viewsource</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-watch&amp;action=edit accesskey-watch]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-watch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-w
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-watch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-watchlist&amp;action=edit accesskey-watchlist]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-watchlist|Talk]]
-&lt;/td&gt;&lt;td&gt;
-l
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-watchlist</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-whatlinkshere&amp;action=edit accesskey-whatlinkshere]&lt;br&gt;
-[[MediaWiki_talk:Accesskey-whatlinkshere|Talk]]
-&lt;/td&gt;&lt;td&gt;
-b
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accesskey-whatlinkshere</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accmailtext&amp;action=edit accmailtext]&lt;br&gt;
-[[MediaWiki_talk:Accmailtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The Password for &amp;#39;$1&amp;#39; has been sent to $2.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accmailtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accmailtitle&amp;action=edit accmailtitle]&lt;br&gt;
-[[MediaWiki_talk:Accmailtitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Password sent.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Accmailtitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Actioncomplete&amp;action=edit actioncomplete]&lt;br&gt;
-[[MediaWiki_talk:Actioncomplete|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Action complete
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Actioncomplete</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addedwatch&amp;action=edit addedwatch]&lt;br&gt;
-[[MediaWiki_talk:Addedwatch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Added to watchlist
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Addedwatch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addedwatchtext&amp;action=edit addedwatchtext]&lt;br&gt;
-[[MediaWiki_talk:Addedwatchtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The page &amp;quot;$1&amp;quot; has been added to your &amp;#91;&amp;#91;Special:Watchlist&amp;#124;watchlist]].
-Future changes to this page and its associated Talk page will be listed there,
-and the page will appear &amp;#39;&amp;#39;&amp;#39;bolded&amp;#39;&amp;#39;&amp;#39; in the &amp;#91;&amp;#91;Special:Recentchanges&amp;#124;list of recent changes]] to
-make it easier to pick out.
-
-&amp;lt;p&amp;gt;If you want to remove the page from your watchlist later, click &amp;quot;Stop watching&amp;quot; in the sidebar.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Addedwatchtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addsection&amp;action=edit addsection]&lt;br&gt;
-[[MediaWiki_talk:Addsection|Talk]]
-&lt;/td&gt;&lt;td&gt;
-+
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Addsection</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Administrators&amp;action=edit administrators]&lt;br&gt;
-[[MediaWiki_talk:Administrators|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:Administrators
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Administrators</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Affirmation&amp;action=edit affirmation]&lt;br&gt;
-[[MediaWiki_talk:Affirmation|Talk]]
-&lt;/td&gt;&lt;td&gt;
-I affirm that the copyright holder of this file
-agrees to license it under the terms of the $1.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Affirmation</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:All&amp;action=edit all]&lt;br&gt;
-[[MediaWiki_talk:All|Talk]]
-&lt;/td&gt;&lt;td&gt;
-all
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:All</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allmessages&amp;action=edit allmessages]&lt;br&gt;
-[[MediaWiki_talk:Allmessages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-All system messages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Allmessages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allmessagestext&amp;action=edit allmessagestext]&lt;br&gt;
-[[MediaWiki_talk:Allmessagestext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This is a list of all system messages available in the MediaWiki: namespace.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Allmessagestext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allpages&amp;action=edit allpages]&lt;br&gt;
-[[MediaWiki_talk:Allpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-All pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Allpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alphaindexline&amp;action=edit alphaindexline]&lt;br&gt;
-[[MediaWiki_talk:Alphaindexline|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1 to $2
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Alphaindexline</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alreadyloggedin&amp;action=edit alreadyloggedin]&lt;br&gt;
-[[MediaWiki_talk:Alreadyloggedin|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;font color=red&amp;gt;&amp;lt;b&amp;gt;User $1, you are already logged in!&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br /&amp;gt;
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Alreadyloggedin</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alreadyrolled&amp;action=edit alreadyrolled]&lt;br&gt;
-[[MediaWiki_talk:Alreadyrolled|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Cannot rollback last edit of &amp;#91;&amp;#91;$1]]
-by &amp;#91;&amp;#91;User:$2&amp;#124;$2]] (&amp;#91;&amp;#91;User talk:$2&amp;#124;Talk]]); someone else has edited or rolled back the page already.
-
-Last edit was by &amp;#91;&amp;#91;User:$3&amp;#124;$3]] (&amp;#91;&amp;#91;User talk:$3&amp;#124;Talk]]).
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Alreadyrolled</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ancientpages&amp;action=edit ancientpages]&lt;br&gt;
-[[MediaWiki_talk:Ancientpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Oldest pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ancientpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:And&amp;action=edit and]&lt;br&gt;
-[[MediaWiki_talk:And|Talk]]
-&lt;/td&gt;&lt;td&gt;
-and
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:And</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anontalk&amp;action=edit anontalk]&lt;br&gt;
-[[MediaWiki_talk:Anontalk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Talk for this IP
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Anontalk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anontalkpagetext&amp;action=edit anontalkpagetext]&lt;br&gt;
-[[MediaWiki_talk:Anontalkpagetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-----&amp;#39;&amp;#39;This is the discussion page for an anonymous user who has not created an account yet or who does not use it. We therefore have to use the numerical &amp;#91;&amp;#91;IP address]] to identify him/her. Such an IP address can be shared by several users. If you are an anonymous user and feel that irrelevant comments have been directed at you, please &amp;#91;&amp;#91;Special:Userlogin&amp;#124;create an account or log in]] to avoid future confusion with other anonymous users.&amp;#39;&amp;#39;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Anontalkpagetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anonymous&amp;action=edit anonymous]&lt;br&gt;
-[[MediaWiki_talk:Anonymous|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Anonymous user(s) of Wiktionary
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Anonymous</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Article&amp;action=edit article]&lt;br&gt;
-[[MediaWiki_talk:Article|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Content page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Article</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Articleexists&amp;action=edit articleexists]&lt;br&gt;
-[[MediaWiki_talk:Articleexists|Talk]]
-&lt;/td&gt;&lt;td&gt;
-A page of that name already exists, or the
-name you have chosen is not valid.
-Please choose another name.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Articleexists</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Articlepage&amp;action=edit articlepage]&lt;br&gt;
-[[MediaWiki_talk:Articlepage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View content page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Articlepage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Asksql&amp;action=edit asksql]&lt;br&gt;
-[[MediaWiki_talk:Asksql|Talk]]
-&lt;/td&gt;&lt;td&gt;
-SQL query
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Asksql</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Asksqltext&amp;action=edit asksqltext]&lt;br&gt;
-[[MediaWiki_talk:Asksqltext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Use the form below to make a direct query of the
-database.
-Use single quotes (&amp;#39;like this&amp;#39;) to delimit string literals.
-This can often add considerable load to the server, so please use
-this function sparingly.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Asksqltext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Autoblocker&amp;action=edit autoblocker]&lt;br&gt;
-[[MediaWiki_talk:Autoblocker|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Autoblocked because you share an IP address with &amp;quot;$1&amp;quot;. Reason &amp;quot;$2&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Autoblocker</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badarticleerror&amp;action=edit badarticleerror]&lt;br&gt;
-[[MediaWiki_talk:Badarticleerror|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This action cannot be performed on this page.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badarticleerror</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badfilename&amp;action=edit badfilename]&lt;br&gt;
-[[MediaWiki_talk:Badfilename|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Image name has been changed to &amp;quot;$1&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badfilename</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badfiletype&amp;action=edit badfiletype]&lt;br&gt;
-[[MediaWiki_talk:Badfiletype|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;quot;.$1&amp;quot; is not a recommended image file format.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badfiletype</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badipaddress&amp;action=edit badipaddress]&lt;br&gt;
-[[MediaWiki_talk:Badipaddress|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Invalid IP address
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badipaddress</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badquery&amp;action=edit badquery]&lt;br&gt;
-[[MediaWiki_talk:Badquery|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Badly formed search query
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badquery</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badquerytext&amp;action=edit badquerytext]&lt;br&gt;
-[[MediaWiki_talk:Badquerytext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-We could not process your query.
-This is probably because you have attempted to search for a
-word fewer than three letters long, which is not yet supported.
-It could also be that you have mistyped the expression, for
-example &amp;quot;fish and and scales&amp;quot;.
-Please try another query.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badquerytext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badretype&amp;action=edit badretype]&lt;br&gt;
-[[MediaWiki_talk:Badretype|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The passwords you entered do not match.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badretype</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badtitle&amp;action=edit badtitle]&lt;br&gt;
-[[MediaWiki_talk:Badtitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Bad title
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badtitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badtitletext&amp;action=edit badtitletext]&lt;br&gt;
-[[MediaWiki_talk:Badtitletext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The requested page title was invalid, empty, or
-an incorrectly linked inter-language or inter-wiki title.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Badtitletext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blanknamespace&amp;action=edit blanknamespace]&lt;br&gt;
-[[MediaWiki_talk:Blanknamespace|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(Main)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blanknamespace</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockedtext&amp;action=edit blockedtext]&lt;br&gt;
-[[MediaWiki_talk:Blockedtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Your user name or IP address has been blocked by $1.
-The reason given is this:&amp;lt;br /&amp;gt;&amp;#39;&amp;#39;$2&amp;#39;&amp;#39;&amp;lt;p&amp;gt;You may contact $1 or one of the other
-&amp;#91;&amp;#91;Wiktionary:Administrators&amp;#124;administrators]] to discuss the block.
-
-Note that you may not use the &amp;quot;email this user&amp;quot; feature unless you have a valid email address registered in your &amp;#91;&amp;#91;Special:Preferences&amp;#124;user preferences]].
-
-Your IP address is $3. Please include this address in any queries you make.
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockedtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockedtitle&amp;action=edit blockedtitle]&lt;br&gt;
-[[MediaWiki_talk:Blockedtitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-User is blocked
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockedtitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockip&amp;action=edit blockip]&lt;br&gt;
-[[MediaWiki_talk:Blockip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Block user
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockipsuccesssub&amp;action=edit blockipsuccesssub]&lt;br&gt;
-[[MediaWiki_talk:Blockipsuccesssub|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Block succeeded
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockipsuccesssub</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockipsuccesstext&amp;action=edit blockipsuccesstext]&lt;br&gt;
-[[MediaWiki_talk:Blockipsuccesstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;quot;$1&amp;quot; has been blocked.
-&amp;lt;br /&amp;gt;See &amp;#91;&amp;#91;Special:Ipblocklist&amp;#124;IP block list]] to review blocks.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockipsuccesstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockiptext&amp;action=edit blockiptext]&lt;br&gt;
-[[MediaWiki_talk:Blockiptext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Use the form below to block write access
-from a specific IP address or username.
-This should be done only only to prevent vandalism, and in
-accordance with &amp;#91;&amp;#91;Wiktionary:Policy&amp;#124;policy]].
-Fill in a specific reason below (for example, citing particular
-pages that were vandalized).
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blockiptext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklink&amp;action=edit blocklink]&lt;br&gt;
-[[MediaWiki_talk:Blocklink|Talk]]
-&lt;/td&gt;&lt;td&gt;
-block
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklink</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklistline&amp;action=edit blocklistline]&lt;br&gt;
-[[MediaWiki_talk:Blocklistline|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1, $2 blocked $3 (expires $4)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklistline</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogentry&amp;action=edit blocklogentry]&lt;br&gt;
-[[MediaWiki_talk:Blocklogentry|Talk]]
-&lt;/td&gt;&lt;td&gt;
-blocked &amp;quot;$1&amp;quot; with an expiry time of $2
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklogentry</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogpage&amp;action=edit blocklogpage]&lt;br&gt;
-[[MediaWiki_talk:Blocklogpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Block_log
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklogpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogtext&amp;action=edit blocklogtext]&lt;br&gt;
-[[MediaWiki_talk:Blocklogtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This is a log of user blocking and unblocking actions. Automatically
-blocked IP addresses are not be listed. See the &amp;#91;&amp;#91;Special:Ipblocklist&amp;#124;IP block list]] for
-the list of currently operational bans and blocks.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Blocklogtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bold_sample&amp;action=edit bold_sample]&lt;br&gt;
-[[MediaWiki_talk:Bold_sample|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Bold text
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bold_sample</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bold_tip&amp;action=edit bold_tip]&lt;br&gt;
-[[MediaWiki_talk:Bold_tip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Bold text
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bold_tip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Booksources&amp;action=edit booksources]&lt;br&gt;
-[[MediaWiki_talk:Booksources|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Book sources
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Booksources</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Booksourcetext&amp;action=edit booksourcetext]&lt;br&gt;
-[[MediaWiki_talk:Booksourcetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Below is a list of links to other sites that
-sell new and used books, and may also have further information
-about books you are looking for.Wiktionary is not affiliated with any of these businesses, and
-this list should not be construed as an endorsement.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Booksourcetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Brokenredirects&amp;action=edit brokenredirects]&lt;br&gt;
-[[MediaWiki_talk:Brokenredirects|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Broken Redirects
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Brokenredirects</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Brokenredirectstext&amp;action=edit brokenredirectstext]&lt;br&gt;
-[[MediaWiki_talk:Brokenredirectstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The following redirects link to a non-existing pages.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Brokenredirectstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bugreports&amp;action=edit bugreports]&lt;br&gt;
-[[MediaWiki_talk:Bugreports|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Bug reports
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bugreports</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bugreportspage&amp;action=edit bugreportspage]&lt;br&gt;
-[[MediaWiki_talk:Bugreportspage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:Bug_reports
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bugreportspage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucratlog&amp;action=edit bureaucratlog]&lt;br&gt;
-[[MediaWiki_talk:Bureaucratlog|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Bureaucrat_log
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bureaucratlog</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucratlogentry&amp;action=edit bureaucratlogentry]&lt;br&gt;
-[[MediaWiki_talk:Bureaucratlogentry|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Rights for user &amp;quot;$1&amp;quot; set &amp;quot;$2&amp;quot;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bureaucratlogentry</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucrattext&amp;action=edit bureaucrattext]&lt;br&gt;
-[[MediaWiki_talk:Bureaucrattext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The action you have requested can only be
-performed by sysops with &amp;quot;bureaucrat&amp;quot; status.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bureaucrattext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucrattitle&amp;action=edit bureaucrattitle]&lt;br&gt;
-[[MediaWiki_talk:Bureaucrattitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Bureaucrat access required
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bureaucrattitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bydate&amp;action=edit bydate]&lt;br&gt;
-[[MediaWiki_talk:Bydate|Talk]]
-&lt;/td&gt;&lt;td&gt;
-by date
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bydate</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Byname&amp;action=edit byname]&lt;br&gt;
-[[MediaWiki_talk:Byname|Talk]]
-&lt;/td&gt;&lt;td&gt;
-by name
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Byname</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bysize&amp;action=edit bysize]&lt;br&gt;
-[[MediaWiki_talk:Bysize|Talk]]
-&lt;/td&gt;&lt;td&gt;
-by size
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Bysize</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cachederror&amp;action=edit cachederror]&lt;br&gt;
-[[MediaWiki_talk:Cachederror|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The following is a cached copy of the requested page, and may not be up to date.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Cachederror</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cancel&amp;action=edit cancel]&lt;br&gt;
-[[MediaWiki_talk:Cancel|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Cancel
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Cancel</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cannotdelete&amp;action=edit cannotdelete]&lt;br&gt;
-[[MediaWiki_talk:Cannotdelete|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Could not delete the page or image specified. (It may have already been deleted by someone else.)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Cannotdelete</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cantrollback&amp;action=edit cantrollback]&lt;br&gt;
-[[MediaWiki_talk:Cantrollback|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Cannot revert edit; last contributor is only author of this page.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Cantrollback</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Categories&amp;action=edit categories]&lt;br&gt;
-[[MediaWiki_talk:Categories|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Categories
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Categories</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Category&amp;action=edit category]&lt;br&gt;
-[[MediaWiki_talk:Category|Talk]]
-&lt;/td&gt;&lt;td&gt;
-category
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Category</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Category_header&amp;action=edit category_header]&lt;br&gt;
-[[MediaWiki_talk:Category_header|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Articles in category &amp;quot;$1&amp;quot;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Category_header</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Changepassword&amp;action=edit changepassword]&lt;br&gt;
-[[MediaWiki_talk:Changepassword|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Change password
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Changepassword</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Changes&amp;action=edit changes]&lt;br&gt;
-[[MediaWiki_talk:Changes|Talk]]
-&lt;/td&gt;&lt;td&gt;
-changes
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Changes</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Columns&amp;action=edit columns]&lt;br&gt;
-[[MediaWiki_talk:Columns|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Columns
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Columns</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Commentedit&amp;action=edit commentedit]&lt;br&gt;
-[[MediaWiki_talk:Commentedit|Talk]]
-&lt;/td&gt;&lt;td&gt;
- (comment)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Commentedit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Compareselectedversions&amp;action=edit compareselectedversions]&lt;br&gt;
-[[MediaWiki_talk:Compareselectedversions|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Compare selected versions
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Compareselectedversions</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirm&amp;action=edit confirm]&lt;br&gt;
-[[MediaWiki_talk:Confirm|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Confirm
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirm</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmcheck&amp;action=edit confirmcheck]&lt;br&gt;
-[[MediaWiki_talk:Confirmcheck|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Yes, I really want to delete this.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmcheck</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmdelete&amp;action=edit confirmdelete]&lt;br&gt;
-[[MediaWiki_talk:Confirmdelete|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Confirm delete
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmdelete</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmdeletetext&amp;action=edit confirmdeletetext]&lt;br&gt;
-[[MediaWiki_talk:Confirmdeletetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You are about to permanently delete a page
-or image along with all of its history from the database.
-Please confirm that you intend to do this, that you understand the
-consequences, and that you are doing this in accordance with
-&amp;#91;&amp;#91;Wiktionary:Policy]].
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmdeletetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmprotect&amp;action=edit confirmprotect]&lt;br&gt;
-[[MediaWiki_talk:Confirmprotect|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Confirm protection
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmprotect</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmprotecttext&amp;action=edit confirmprotecttext]&lt;br&gt;
-[[MediaWiki_talk:Confirmprotecttext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Do you really want to protect this page?
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmprotecttext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmunprotect&amp;action=edit confirmunprotect]&lt;br&gt;
-[[MediaWiki_talk:Confirmunprotect|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Confirm unprotection
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmunprotect</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmunprotecttext&amp;action=edit confirmunprotecttext]&lt;br&gt;
-[[MediaWiki_talk:Confirmunprotecttext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Do you really want to unprotect this page?
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Confirmunprotecttext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contextchars&amp;action=edit contextchars]&lt;br&gt;
-[[MediaWiki_talk:Contextchars|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Characters of context per line
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Contextchars</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contextlines&amp;action=edit contextlines]&lt;br&gt;
-[[MediaWiki_talk:Contextlines|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Lines to show per hit
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Contextlines</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contribslink&amp;action=edit contribslink]&lt;br&gt;
-[[MediaWiki_talk:Contribslink|Talk]]
-&lt;/td&gt;&lt;td&gt;
-contribs
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Contribslink</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contribsub&amp;action=edit contribsub]&lt;br&gt;
-[[MediaWiki_talk:Contribsub|Talk]]
-&lt;/td&gt;&lt;td&gt;
-For $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Contribsub</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contributions&amp;action=edit contributions]&lt;br&gt;
-[[MediaWiki_talk:Contributions|Talk]]
-&lt;/td&gt;&lt;td&gt;
-User contributions
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Contributions</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyright&amp;action=edit copyright]&lt;br&gt;
-[[MediaWiki_talk:Copyright|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Content is available under $1.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Copyright</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyrightpage&amp;action=edit copyrightpage]&lt;br&gt;
-[[MediaWiki_talk:Copyrightpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:Copyrights
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Copyrightpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyrightpagename&amp;action=edit copyrightpagename]&lt;br&gt;
-[[MediaWiki_talk:Copyrightpagename|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary copyright
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Copyrightpagename</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyrightwarning&amp;action=edit copyrightwarning]&lt;br&gt;
-[[MediaWiki_talk:Copyrightwarning|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Please note that all contributions to Wiktionary are
-considered to be released under the GNU Free Documentation License
-(see $1 for details).
-If you don&amp;#39;t want your writing to be edited mercilessly and redistributed
-at will, then don&amp;#39;t submit it here.&amp;lt;br /&amp;gt;
-You are also promising us that you wrote this yourself, or copied it from a
-public domain or similar free resource.
-&amp;lt;strong&amp;gt;DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!&amp;lt;/strong&amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Copyrightwarning</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Couldntremove&amp;action=edit couldntremove]&lt;br&gt;
-[[MediaWiki_talk:Couldntremove|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Couldn&amp;#39;t remove item &amp;#39;$1&amp;#39;...
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Couldntremove</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Createaccount&amp;action=edit createaccount]&lt;br&gt;
-[[MediaWiki_talk:Createaccount|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Create new account
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Createaccount</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Createaccountmail&amp;action=edit createaccountmail]&lt;br&gt;
-[[MediaWiki_talk:Createaccountmail|Talk]]
-&lt;/td&gt;&lt;td&gt;
-by email
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Createaccountmail</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cur&amp;action=edit cur]&lt;br&gt;
-[[MediaWiki_talk:Cur|Talk]]
-&lt;/td&gt;&lt;td&gt;
-cur
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Cur</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Currentevents&amp;action=edit currentevents]&lt;br&gt;
-[[MediaWiki_talk:Currentevents|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Current events
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Currentevents</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Currentrev&amp;action=edit currentrev]&lt;br&gt;
-[[MediaWiki_talk:Currentrev|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Current revision
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Currentrev</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Databaseerror&amp;action=edit databaseerror]&lt;br&gt;
-[[MediaWiki_talk:Databaseerror|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Database error
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Databaseerror</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dateformat&amp;action=edit dateformat]&lt;br&gt;
-[[MediaWiki_talk:Dateformat|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Date format
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Dateformat</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dberrortext&amp;action=edit dberrortext]&lt;br&gt;
-[[MediaWiki_talk:Dberrortext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-A database query syntax error has occurred.
-This could be because of an illegal search query (see $5),
-or it may indicate a bug in the software.
-The last attempted database query was:
-&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;$1&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;
-from within function &amp;quot;&amp;lt;tt&amp;gt;$2&amp;lt;/tt&amp;gt;&amp;quot;.
-MySQL returned error &amp;quot;&amp;lt;tt&amp;gt;$3: $4&amp;lt;/tt&amp;gt;&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Dberrortext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dberrortextcl&amp;action=edit dberrortextcl]&lt;br&gt;
-[[MediaWiki_talk:Dberrortextcl|Talk]]
-&lt;/td&gt;&lt;td&gt;
-A database query syntax error has occurred.
-The last attempted database query was:
-&amp;quot;$1&amp;quot;
-from within function &amp;quot;$2&amp;quot;.
-MySQL returned error &amp;quot;$3: $4&amp;quot;.
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Dberrortextcl</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deadendpages&amp;action=edit deadendpages]&lt;br&gt;
-[[MediaWiki_talk:Deadendpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Dead-end pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deadendpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Debug&amp;action=edit debug]&lt;br&gt;
-[[MediaWiki_talk:Debug|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Debug
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Debug</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Defaultns&amp;action=edit defaultns]&lt;br&gt;
-[[MediaWiki_talk:Defaultns|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Search in these namespaces by default:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Defaultns</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Defemailsubject&amp;action=edit defemailsubject]&lt;br&gt;
-[[MediaWiki_talk:Defemailsubject|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary e-mail
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Defemailsubject</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Delete&amp;action=edit delete]&lt;br&gt;
-[[MediaWiki_talk:Delete|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Delete
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Delete</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletecomment&amp;action=edit deletecomment]&lt;br&gt;
-[[MediaWiki_talk:Deletecomment|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Reason for deletion
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletecomment</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletedarticle&amp;action=edit deletedarticle]&lt;br&gt;
-[[MediaWiki_talk:Deletedarticle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-deleted &amp;quot;$1&amp;quot;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletedarticle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletedtext&amp;action=edit deletedtext]&lt;br&gt;
-[[MediaWiki_talk:Deletedtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;quot;$1&amp;quot; has been deleted.
-See $2 for a record of recent deletions.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletedtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deleteimg&amp;action=edit deleteimg]&lt;br&gt;
-[[MediaWiki_talk:Deleteimg|Talk]]
-&lt;/td&gt;&lt;td&gt;
-del
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deleteimg</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletepage&amp;action=edit deletepage]&lt;br&gt;
-[[MediaWiki_talk:Deletepage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Delete page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletepage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletesub&amp;action=edit deletesub]&lt;br&gt;
-[[MediaWiki_talk:Deletesub|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(Deleting &amp;quot;$1&amp;quot;)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletesub</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletethispage&amp;action=edit deletethispage]&lt;br&gt;
-[[MediaWiki_talk:Deletethispage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Delete this page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletethispage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletionlog&amp;action=edit deletionlog]&lt;br&gt;
-[[MediaWiki_talk:Deletionlog|Talk]]
-&lt;/td&gt;&lt;td&gt;
-deletion log
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Deletionlog</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dellogpage&amp;action=edit dellogpage]&lt;br&gt;
-[[MediaWiki_talk:Dellogpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Deletion_log
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Dellogpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dellogpagetext&amp;action=edit dellogpagetext]&lt;br&gt;
-[[MediaWiki_talk:Dellogpagetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Below is a list of the most recent deletions.
-All times shown are server time (UTC).
-&amp;lt;ul&amp;gt;
-&amp;lt;/ul&amp;gt;
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Dellogpagetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Developerspheading&amp;action=edit developerspheading]&lt;br&gt;
-[[MediaWiki_talk:Developerspheading|Talk]]
-&lt;/td&gt;&lt;td&gt;
-For developer use only
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Developerspheading</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Developertext&amp;action=edit developertext]&lt;br&gt;
-[[MediaWiki_talk:Developertext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The action you have requested can only be
-performed by users with &amp;quot;developer&amp;quot; status.
-See $1.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Developertext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Developertitle&amp;action=edit developertitle]&lt;br&gt;
-[[MediaWiki_talk:Developertitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Developer access required
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Developertitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Diff&amp;action=edit diff]&lt;br&gt;
-[[MediaWiki_talk:Diff|Talk]]
-&lt;/td&gt;&lt;td&gt;
-diff
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Diff</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Difference&amp;action=edit difference]&lt;br&gt;
-[[MediaWiki_talk:Difference|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(Difference between revisions)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Difference</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguations&amp;action=edit disambiguations]&lt;br&gt;
-[[MediaWiki_talk:Disambiguations|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Disambiguation pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Disambiguations</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguationspage&amp;action=edit disambiguationspage]&lt;br&gt;
-[[MediaWiki_talk:Disambiguationspage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:Links_to_disambiguating_pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Disambiguationspage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguationstext&amp;action=edit disambiguationstext]&lt;br&gt;
-[[MediaWiki_talk:Disambiguationstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The following pages link to a &amp;lt;i&amp;gt;disambiguation page&amp;lt;/i&amp;gt;. They should link to the appropriate topic instead.&amp;lt;br /&amp;gt;A page is treated as dismbiguation if it is linked from $1.&amp;lt;br /&amp;gt;Links from other namespaces are &amp;lt;i&amp;gt;not&amp;lt;/i&amp;gt; listed here.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Disambiguationstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disclaimerpage&amp;action=edit disclaimerpage]&lt;br&gt;
-[[MediaWiki_talk:Disclaimerpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:General_disclaimer
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Disclaimerpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disclaimers&amp;action=edit disclaimers]&lt;br&gt;
-[[MediaWiki_talk:Disclaimers|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Disclaimers
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Disclaimers</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Doubleredirects&amp;action=edit doubleredirects]&lt;br&gt;
-[[MediaWiki_talk:Doubleredirects|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Double Redirects
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Doubleredirects</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Doubleredirectstext&amp;action=edit doubleredirectstext]&lt;br&gt;
-[[MediaWiki_talk:Doubleredirectstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;b&amp;gt;Attention:&amp;lt;/b&amp;gt; This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.&amp;lt;br /&amp;gt;
-Each row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the &amp;quot;real&amp;quot; target page, which the first redirect should point to.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Doubleredirectstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Edit&amp;action=edit edit]&lt;br&gt;
-[[MediaWiki_talk:Edit|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Edit
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Edit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editcomment&amp;action=edit editcomment]&lt;br&gt;
-[[MediaWiki_talk:Editcomment|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The edit comment was: &amp;quot;&amp;lt;i&amp;gt;$1&amp;lt;/i&amp;gt;&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editcomment</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editconflict&amp;action=edit editconflict]&lt;br&gt;
-[[MediaWiki_talk:Editconflict|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Edit conflict: $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editconflict</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editcurrent&amp;action=edit editcurrent]&lt;br&gt;
-[[MediaWiki_talk:Editcurrent|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Edit the current version of this page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editcurrent</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Edithelp&amp;action=edit edithelp]&lt;br&gt;
-[[MediaWiki_talk:Edithelp|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Editing help
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Edithelp</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Edithelppage&amp;action=edit edithelppage]&lt;br&gt;
-[[MediaWiki_talk:Edithelppage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Help:Editing
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Edithelppage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editing&amp;action=edit editing]&lt;br&gt;
-[[MediaWiki_talk:Editing|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Editing $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editing</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editingold&amp;action=edit editingold]&lt;br&gt;
-[[MediaWiki_talk:Editingold|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;strong&amp;gt;WARNING: You are editing an out-of-date
-revision of this page.
-If you save it, any changes made since this revision will be lost.&amp;lt;/strong&amp;gt;
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editingold</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editsection&amp;action=edit editsection]&lt;br&gt;
-[[MediaWiki_talk:Editsection|Talk]]
-&lt;/td&gt;&lt;td&gt;
-edit
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editsection</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editthispage&amp;action=edit editthispage]&lt;br&gt;
-[[MediaWiki_talk:Editthispage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Edit this page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Editthispage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailflag&amp;action=edit emailflag]&lt;br&gt;
-[[MediaWiki_talk:Emailflag|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Disable e-mail from other users
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailflag</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailforlost&amp;action=edit emailforlost]&lt;br&gt;
-[[MediaWiki_talk:Emailforlost|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Fields marked with a star (*) are optional. Storing an email address enables people to contact you through the website without you having to reveal your
-email address to them, and it can be used to send you a new password if you forget it.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Your real name, if you choose to provide it, will be used for giving you attribution for your work.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailforlost</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailfrom&amp;action=edit emailfrom]&lt;br&gt;
-[[MediaWiki_talk:Emailfrom|Talk]]
-&lt;/td&gt;&lt;td&gt;
-From
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailfrom</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailmessage&amp;action=edit emailmessage]&lt;br&gt;
-[[MediaWiki_talk:Emailmessage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Message
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailmessage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailpage&amp;action=edit emailpage]&lt;br&gt;
-[[MediaWiki_talk:Emailpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-E-mail user
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailpagetext&amp;action=edit emailpagetext]&lt;br&gt;
-[[MediaWiki_talk:Emailpagetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-If this user has entered a valid e-mail address in
-his or her user preferences, the form below will send a single message.
-The e-mail address you entered in your user preferences will appear
-as the &amp;quot;From&amp;quot; address of the mail, so the recipient will be able
-to reply.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailpagetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsend&amp;action=edit emailsend]&lt;br&gt;
-[[MediaWiki_talk:Emailsend|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Send
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailsend</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsent&amp;action=edit emailsent]&lt;br&gt;
-[[MediaWiki_talk:Emailsent|Talk]]
-&lt;/td&gt;&lt;td&gt;
-E-mail sent
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailsent</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsenttext&amp;action=edit emailsenttext]&lt;br&gt;
-[[MediaWiki_talk:Emailsenttext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Your e-mail message has been sent.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailsenttext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsubject&amp;action=edit emailsubject]&lt;br&gt;
-[[MediaWiki_talk:Emailsubject|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Subject
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailsubject</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailto&amp;action=edit emailto]&lt;br&gt;
-[[MediaWiki_talk:Emailto|Talk]]
-&lt;/td&gt;&lt;td&gt;
-To
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailto</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailuser&amp;action=edit emailuser]&lt;br&gt;
-[[MediaWiki_talk:Emailuser|Talk]]
-&lt;/td&gt;&lt;td&gt;
-E-mail this user
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Emailuser</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Enterlockreason&amp;action=edit enterlockreason]&lt;br&gt;
-[[MediaWiki_talk:Enterlockreason|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Enter a reason for the lock, including an estimate
-of when the lock will be released
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Enterlockreason</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Error&amp;action=edit error]&lt;br&gt;
-[[MediaWiki_talk:Error|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Error
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Error</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Errorpagetitle&amp;action=edit errorpagetitle]&lt;br&gt;
-[[MediaWiki_talk:Errorpagetitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Error
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Errorpagetitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exbeforeblank&amp;action=edit exbeforeblank]&lt;br&gt;
-[[MediaWiki_talk:Exbeforeblank|Talk]]
-&lt;/td&gt;&lt;td&gt;
-content before blanking was:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Exbeforeblank</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exblank&amp;action=edit exblank]&lt;br&gt;
-[[MediaWiki_talk:Exblank|Talk]]
-&lt;/td&gt;&lt;td&gt;
-page was empty
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Exblank</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Excontent&amp;action=edit excontent]&lt;br&gt;
-[[MediaWiki_talk:Excontent|Talk]]
-&lt;/td&gt;&lt;td&gt;
-content was:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Excontent</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Explainconflict&amp;action=edit explainconflict]&lt;br&gt;
-[[MediaWiki_talk:Explainconflict|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Someone else has changed this page since you
-started editing it.
-The upper text area contains the page text as it currently exists.
-Your changes are shown in the lower text area.
-You will have to merge your changes into the existing text.
-&amp;lt;b&amp;gt;Only&amp;lt;/b&amp;gt; the text in the upper text area will be saved when you
-press &amp;quot;Save page&amp;quot;.
-&amp;lt;p&amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Explainconflict</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Export&amp;action=edit export]&lt;br&gt;
-[[MediaWiki_talk:Export|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Export pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Export</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exportcuronly&amp;action=edit exportcuronly]&lt;br&gt;
-[[MediaWiki_talk:Exportcuronly|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Include only the current revision, not the full history
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Exportcuronly</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exporttext&amp;action=edit exporttext]&lt;br&gt;
-[[MediaWiki_talk:Exporttext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You can export the text and editing history of a particular
-page or set of pages wrapped in some XML; this can then be imported into another
-wiki running MediaWiki software, transformed, or just kept for your private
-amusement.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Exporttext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Extlink_sample&amp;action=edit extlink_sample]&lt;br&gt;
-[[MediaWiki_talk:Extlink_sample|Talk]]
-&lt;/td&gt;&lt;td&gt;
-http&amp;#58;//www.example.com link title
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Extlink_sample</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Extlink_tip&amp;action=edit extlink_tip]&lt;br&gt;
-[[MediaWiki_talk:Extlink_tip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-External link (remember http&amp;#58;// prefix)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Extlink_tip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Faq&amp;action=edit faq]&lt;br&gt;
-[[MediaWiki_talk:Faq|Talk]]
-&lt;/td&gt;&lt;td&gt;
-FAQ
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Faq</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Faqpage&amp;action=edit faqpage]&lt;br&gt;
-[[MediaWiki_talk:Faqpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:FAQ
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Faqpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Feedlinks&amp;action=edit feedlinks]&lt;br&gt;
-[[MediaWiki_talk:Feedlinks|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Feed:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Feedlinks</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filecopyerror&amp;action=edit filecopyerror]&lt;br&gt;
-[[MediaWiki_talk:Filecopyerror|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Could not copy file &amp;quot;$1&amp;quot; to &amp;quot;$2&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filecopyerror</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filedeleteerror&amp;action=edit filedeleteerror]&lt;br&gt;
-[[MediaWiki_talk:Filedeleteerror|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Could not delete file &amp;quot;$1&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filedeleteerror</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filedesc&amp;action=edit filedesc]&lt;br&gt;
-[[MediaWiki_talk:Filedesc|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Summary
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filedesc</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filename&amp;action=edit filename]&lt;br&gt;
-[[MediaWiki_talk:Filename|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Filename
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filename</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filenotfound&amp;action=edit filenotfound]&lt;br&gt;
-[[MediaWiki_talk:Filenotfound|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Could not find file &amp;quot;$1&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filenotfound</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filerenameerror&amp;action=edit filerenameerror]&lt;br&gt;
-[[MediaWiki_talk:Filerenameerror|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Could not rename file &amp;quot;$1&amp;quot; to &amp;quot;$2&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filerenameerror</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filesource&amp;action=edit filesource]&lt;br&gt;
-[[MediaWiki_talk:Filesource|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Source
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filesource</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filestatus&amp;action=edit filestatus]&lt;br&gt;
-[[MediaWiki_talk:Filestatus|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Copyright status
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Filestatus</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Fileuploaded&amp;action=edit fileuploaded]&lt;br&gt;
-[[MediaWiki_talk:Fileuploaded|Talk]]
-&lt;/td&gt;&lt;td&gt;
-File &amp;quot;$1&amp;quot; uploaded successfully.
-Please follow this link: $2 to the description page and fill
-in information about the file, such as where it came from, when it was
-created and by whom, and anything else you may know about it.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Fileuploaded</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Formerror&amp;action=edit formerror]&lt;br&gt;
-[[MediaWiki_talk:Formerror|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Error: could not submit form
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Formerror</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Fromwikipedia&amp;action=edit fromwikipedia]&lt;br&gt;
-[[MediaWiki_talk:Fromwikipedia|Talk]]
-&lt;/td&gt;&lt;td&gt;
-From Wiktionary
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Fromwikipedia</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Getimagelist&amp;action=edit getimagelist]&lt;br&gt;
-[[MediaWiki_talk:Getimagelist|Talk]]
-&lt;/td&gt;&lt;td&gt;
-fetching image list
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Getimagelist</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Go&amp;action=edit go]&lt;br&gt;
-[[MediaWiki_talk:Go|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Go
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Go</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Googlesearch&amp;action=edit googlesearch]&lt;br&gt;
-[[MediaWiki_talk:Googlesearch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-
-&amp;lt;!-- SiteSearch Google --&amp;gt;
-&amp;lt;FORM method=GET action=&amp;quot;http&amp;#58;//www.google.com/search&amp;quot;&amp;gt;
-&amp;lt;TABLE bgcolor=&amp;quot;#FFFFFF&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;
-&amp;lt;A HREF=&amp;quot;http&amp;#58;//www.google.com/&amp;quot;&amp;gt;
-&amp;lt;IMG SRC=&amp;quot;http&amp;#58;//www.google.com/logos/Logo_40wht.gif&amp;quot;
-border=&amp;quot;0&amp;quot; ALT=&amp;quot;Google&amp;quot;&amp;gt;&amp;lt;/A&amp;gt;
-&amp;lt;/td&amp;gt;
-&amp;lt;td&amp;gt;
-&amp;lt;INPUT TYPE=text name=q size=31 maxlength=255 value=&amp;quot;$1&amp;quot;&amp;gt;
-&amp;lt;INPUT type=submit name=btnG VALUE=&amp;quot;Google Search&amp;quot;&amp;gt;
-&amp;lt;font size=-1&amp;gt;
-&amp;lt;input type=hidden name=domains value=&amp;quot;http&amp;#58;//tl.wiktionary.org&amp;quot;&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;input type=radio name=sitesearch value=&amp;quot;&amp;quot;&amp;gt; WWW &amp;lt;input type=radio name=sitesearch value=&amp;quot;http&amp;#58;//tl.wiktionary.org&amp;quot; checked&amp;gt; http&amp;#58;//tl.wiktionary.org &amp;lt;br /&amp;gt;
-&amp;lt;input type=&amp;#39;hidden&amp;#39; name=&amp;#39;ie&amp;#39; value=&amp;#39;$2&amp;#39;&amp;gt;
-&amp;lt;input type=&amp;#39;hidden&amp;#39; name=&amp;#39;oe&amp;#39; value=&amp;#39;$2&amp;#39;&amp;gt;
-&amp;lt;/font&amp;gt;
-&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/TABLE&amp;gt;
-&amp;lt;/FORM&amp;gt;
-&amp;lt;!-- SiteSearch Google --&amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Googlesearch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Guesstimezone&amp;action=edit guesstimezone]&lt;br&gt;
-[[MediaWiki_talk:Guesstimezone|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Fill in from browser
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Guesstimezone</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Headline_sample&amp;action=edit headline_sample]&lt;br&gt;
-[[MediaWiki_talk:Headline_sample|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Headline text
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Headline_sample</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Headline_tip&amp;action=edit headline_tip]&lt;br&gt;
-[[MediaWiki_talk:Headline_tip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Level 2 headline
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Headline_tip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Help&amp;action=edit help]&lt;br&gt;
-[[MediaWiki_talk:Help|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Help
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Help</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Helppage&amp;action=edit helppage]&lt;br&gt;
-[[MediaWiki_talk:Helppage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Help:Contents
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Helppage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hide&amp;action=edit hide]&lt;br&gt;
-[[MediaWiki_talk:Hide|Talk]]
-&lt;/td&gt;&lt;td&gt;
-hide
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Hide</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hidetoc&amp;action=edit hidetoc]&lt;br&gt;
-[[MediaWiki_talk:Hidetoc|Talk]]
-&lt;/td&gt;&lt;td&gt;
-hide
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Hidetoc</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hist&amp;action=edit hist]&lt;br&gt;
-[[MediaWiki_talk:Hist|Talk]]
-&lt;/td&gt;&lt;td&gt;
-hist
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Hist</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Histlegend&amp;action=edit histlegend]&lt;br&gt;
-[[MediaWiki_talk:Histlegend|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Diff selection: mark the radio boxes of the versions to compare and hit enter or the button at the bottom.&amp;lt;br/&amp;gt;
-Legend: (cur) = difference with current version,
-(last) = difference with preceding version, M = minor edit.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Histlegend</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:History&amp;action=edit history]&lt;br&gt;
-[[MediaWiki_talk:History|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Page history
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:History</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:History_short&amp;action=edit history_short]&lt;br&gt;
-[[MediaWiki_talk:History_short|Talk]]
-&lt;/td&gt;&lt;td&gt;
-History
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:History_short</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Historywarning&amp;action=edit historywarning]&lt;br&gt;
-[[MediaWiki_talk:Historywarning|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Warning: The page you are about to delete has a history:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Historywarning</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hr_tip&amp;action=edit hr_tip]&lt;br&gt;
-[[MediaWiki_talk:Hr_tip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Horizontal line (use sparingly)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Hr_tip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ignorewarning&amp;action=edit ignorewarning]&lt;br&gt;
-[[MediaWiki_talk:Ignorewarning|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Ignore warning and save file anyway.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ignorewarning</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ilshowmatch&amp;action=edit ilshowmatch]&lt;br&gt;
-[[MediaWiki_talk:Ilshowmatch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Show all images with names matching
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ilshowmatch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ilsubmit&amp;action=edit ilsubmit]&lt;br&gt;
-[[MediaWiki_talk:Ilsubmit|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Search
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ilsubmit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Image_sample&amp;action=edit image_sample]&lt;br&gt;
-[[MediaWiki_talk:Image_sample|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Example.jpg
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Image_sample</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Image_tip&amp;action=edit image_tip]&lt;br&gt;
-[[MediaWiki_talk:Image_tip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Embedded image
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Image_tip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagelinks&amp;action=edit imagelinks]&lt;br&gt;
-[[MediaWiki_talk:Imagelinks|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Image links
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imagelinks</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagelist&amp;action=edit imagelist]&lt;br&gt;
-[[MediaWiki_talk:Imagelist|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Image list
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imagelist</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagelisttext&amp;action=edit imagelisttext]&lt;br&gt;
-[[MediaWiki_talk:Imagelisttext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Below is a list of $1 images sorted $2.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imagelisttext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagepage&amp;action=edit imagepage]&lt;br&gt;
-[[MediaWiki_talk:Imagepage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View image page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imagepage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagereverted&amp;action=edit imagereverted]&lt;br&gt;
-[[MediaWiki_talk:Imagereverted|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Revert to earlier version was successful.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imagereverted</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imgdelete&amp;action=edit imgdelete]&lt;br&gt;
-[[MediaWiki_talk:Imgdelete|Talk]]
-&lt;/td&gt;&lt;td&gt;
-del
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imgdelete</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imgdesc&amp;action=edit imgdesc]&lt;br&gt;
-[[MediaWiki_talk:Imgdesc|Talk]]
-&lt;/td&gt;&lt;td&gt;
-desc
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imgdesc</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imghistlegend&amp;action=edit imghistlegend]&lt;br&gt;
-[[MediaWiki_talk:Imghistlegend|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Legend: (cur) = this is the current image, (del) = delete
-this old version, (rev) = revert to this old version.
-&amp;lt;br /&amp;gt;&amp;lt;i&amp;gt;Click on date to see image uploaded on that date&amp;lt;/i&amp;gt;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imghistlegend</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imghistory&amp;action=edit imghistory]&lt;br&gt;
-[[MediaWiki_talk:Imghistory|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Image history
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imghistory</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imglegend&amp;action=edit imglegend]&lt;br&gt;
-[[MediaWiki_talk:Imglegend|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Legend: (desc) = show/edit image description.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Imglegend</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Import&amp;action=edit import]&lt;br&gt;
-[[MediaWiki_talk:Import|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Import pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Import</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importfailed&amp;action=edit importfailed]&lt;br&gt;
-[[MediaWiki_talk:Importfailed|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Import failed: $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Importfailed</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importhistoryconflict&amp;action=edit importhistoryconflict]&lt;br&gt;
-[[MediaWiki_talk:Importhistoryconflict|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Conflicting history revision exists (may have imported this page before)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Importhistoryconflict</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importnotext&amp;action=edit importnotext]&lt;br&gt;
-[[MediaWiki_talk:Importnotext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Empty or no text
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Importnotext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importsuccess&amp;action=edit importsuccess]&lt;br&gt;
-[[MediaWiki_talk:Importsuccess|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Import succeeded!
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Importsuccess</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importtext&amp;action=edit importtext]&lt;br&gt;
-[[MediaWiki_talk:Importtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Please export the file from the source wiki using the Special:Export utility, save it to your disk and upload it here.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Importtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Infobox&amp;action=edit infobox]&lt;br&gt;
-[[MediaWiki_talk:Infobox|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Click a button to get an example text
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Infobox</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Infobox_alert&amp;action=edit infobox_alert]&lt;br&gt;
-[[MediaWiki_talk:Infobox_alert|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Please enter the text you want to be formatted.\n It will be shown in the infobox for copy and pasting.\nExample:\n$1\nwill become:\n$2
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Infobox_alert</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Internalerror&amp;action=edit internalerror]&lt;br&gt;
-[[MediaWiki_talk:Internalerror|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Internal error
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Internalerror</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Intl&amp;action=edit intl]&lt;br&gt;
-[[MediaWiki_talk:Intl|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Interlanguage links
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Intl</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ip_range_invalid&amp;action=edit ip_range_invalid]&lt;br&gt;
-[[MediaWiki_talk:Ip_range_invalid|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Invalid IP range.
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ip_range_invalid</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipaddress&amp;action=edit ipaddress]&lt;br&gt;
-[[MediaWiki_talk:Ipaddress|Talk]]
-&lt;/td&gt;&lt;td&gt;
-IP Address/username
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipaddress</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipb_expiry_invalid&amp;action=edit ipb_expiry_invalid]&lt;br&gt;
-[[MediaWiki_talk:Ipb_expiry_invalid|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Expiry time invalid.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipb_expiry_invalid</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipbexpiry&amp;action=edit ipbexpiry]&lt;br&gt;
-[[MediaWiki_talk:Ipbexpiry|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Expiry
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipbexpiry</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipblocklist&amp;action=edit ipblocklist]&lt;br&gt;
-[[MediaWiki_talk:Ipblocklist|Talk]]
-&lt;/td&gt;&lt;td&gt;
-List of blocked IP addresses and usernames
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipblocklist</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipbreason&amp;action=edit ipbreason]&lt;br&gt;
-[[MediaWiki_talk:Ipbreason|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Reason
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipbreason</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipbsubmit&amp;action=edit ipbsubmit]&lt;br&gt;
-[[MediaWiki_talk:Ipbsubmit|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Block this user
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipbsubmit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipusubmit&amp;action=edit ipusubmit]&lt;br&gt;
-[[MediaWiki_talk:Ipusubmit|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Unblock this address
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipusubmit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipusuccess&amp;action=edit ipusuccess]&lt;br&gt;
-[[MediaWiki_talk:Ipusuccess|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;quot;$1&amp;quot; unblocked
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ipusuccess</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Isbn&amp;action=edit isbn]&lt;br&gt;
-[[MediaWiki_talk:Isbn|Talk]]
-&lt;/td&gt;&lt;td&gt;
-ISBN
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Isbn</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Isredirect&amp;action=edit isredirect]&lt;br&gt;
-[[MediaWiki_talk:Isredirect|Talk]]
-&lt;/td&gt;&lt;td&gt;
-redirect page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Isredirect</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Italic_sample&amp;action=edit italic_sample]&lt;br&gt;
-[[MediaWiki_talk:Italic_sample|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Italic text
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Italic_sample</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Italic_tip&amp;action=edit italic_tip]&lt;br&gt;
-[[MediaWiki_talk:Italic_tip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Italic text
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Italic_tip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Iteminvalidname&amp;action=edit iteminvalidname]&lt;br&gt;
-[[MediaWiki_talk:Iteminvalidname|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Problem with item &amp;#39;$1&amp;#39;, invalid name...
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Iteminvalidname</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Largefile&amp;action=edit largefile]&lt;br&gt;
-[[MediaWiki_talk:Largefile|Talk]]
-&lt;/td&gt;&lt;td&gt;
-It is recommended that images not exceed 100k in size.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Largefile</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Last&amp;action=edit last]&lt;br&gt;
-[[MediaWiki_talk:Last|Talk]]
-&lt;/td&gt;&lt;td&gt;
-last
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Last</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lastmodified&amp;action=edit lastmodified]&lt;br&gt;
-[[MediaWiki_talk:Lastmodified|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This page was last modified $1.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lastmodified</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lastmodifiedby&amp;action=edit lastmodifiedby]&lt;br&gt;
-[[MediaWiki_talk:Lastmodifiedby|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This page was last modified $1 by $2.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lastmodifiedby</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lineno&amp;action=edit lineno]&lt;br&gt;
-[[MediaWiki_talk:Lineno|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Line $1:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lineno</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Link_sample&amp;action=edit link_sample]&lt;br&gt;
-[[MediaWiki_talk:Link_sample|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Link title
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Link_sample</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Link_tip&amp;action=edit link_tip]&lt;br&gt;
-[[MediaWiki_talk:Link_tip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Internal link
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Link_tip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linklistsub&amp;action=edit linklistsub]&lt;br&gt;
-[[MediaWiki_talk:Linklistsub|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(List of links)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Linklistsub</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linkshere&amp;action=edit linkshere]&lt;br&gt;
-[[MediaWiki_talk:Linkshere|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The following pages link to here:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Linkshere</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linkstoimage&amp;action=edit linkstoimage]&lt;br&gt;
-[[MediaWiki_talk:Linkstoimage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The following pages link to this image:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Linkstoimage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linktrail&amp;action=edit linktrail]&lt;br&gt;
-[[MediaWiki_talk:Linktrail|Talk]]
-&lt;/td&gt;&lt;td&gt;
-/^(&amp;#91;a-z]+)(.*)$/sD
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Linktrail</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Listform&amp;action=edit listform]&lt;br&gt;
-[[MediaWiki_talk:Listform|Talk]]
-&lt;/td&gt;&lt;td&gt;
-list
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Listform</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Listusers&amp;action=edit listusers]&lt;br&gt;
-[[MediaWiki_talk:Listusers|Talk]]
-&lt;/td&gt;&lt;td&gt;
-User list
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Listusers</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loadhist&amp;action=edit loadhist]&lt;br&gt;
-[[MediaWiki_talk:Loadhist|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Loading page history
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loadhist</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loadingrev&amp;action=edit loadingrev]&lt;br&gt;
-[[MediaWiki_talk:Loadingrev|Talk]]
-&lt;/td&gt;&lt;td&gt;
-loading revision for diff
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loadingrev</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Localtime&amp;action=edit localtime]&lt;br&gt;
-[[MediaWiki_talk:Localtime|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Local time display
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Localtime</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockbtn&amp;action=edit lockbtn]&lt;br&gt;
-[[MediaWiki_talk:Lockbtn|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Lock database
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lockbtn</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockconfirm&amp;action=edit lockconfirm]&lt;br&gt;
-[[MediaWiki_talk:Lockconfirm|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Yes, I really want to lock the database.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lockconfirm</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdb&amp;action=edit lockdb]&lt;br&gt;
-[[MediaWiki_talk:Lockdb|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Lock database
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lockdb</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdbsuccesssub&amp;action=edit lockdbsuccesssub]&lt;br&gt;
-[[MediaWiki_talk:Lockdbsuccesssub|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Database lock succeeded
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lockdbsuccesssub</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdbsuccesstext&amp;action=edit lockdbsuccesstext]&lt;br&gt;
-[[MediaWiki_talk:Lockdbsuccesstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The database has been locked.
-&amp;lt;br /&amp;gt;Remember to remove the lock after your maintenance is complete.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lockdbsuccesstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdbtext&amp;action=edit lockdbtext]&lt;br&gt;
-[[MediaWiki_talk:Lockdbtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Locking the database will suspend the ability of all
-users to edit pages, change their preferences, edit their watchlists, and
-other things requiring changes in the database.
-Please confirm that this is what you intend to do, and that you will
-unlock the database when your maintenance is done.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lockdbtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Locknoconfirm&amp;action=edit locknoconfirm]&lt;br&gt;
-[[MediaWiki_talk:Locknoconfirm|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You did not check the confirmation box.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Locknoconfirm</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Login&amp;action=edit login]&lt;br&gt;
-[[MediaWiki_talk:Login|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Log in
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Login</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginend&amp;action=edit loginend]&lt;br&gt;
-[[MediaWiki_talk:Loginend|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;amp;nbsp;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginend</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginerror&amp;action=edit loginerror]&lt;br&gt;
-[[MediaWiki_talk:Loginerror|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Login error
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginerror</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginpagetitle&amp;action=edit loginpagetitle]&lt;br&gt;
-[[MediaWiki_talk:Loginpagetitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-User login
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginpagetitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginproblem&amp;action=edit loginproblem]&lt;br&gt;
-[[MediaWiki_talk:Loginproblem|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;b&amp;gt;There has been a problem with your login.&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;Try again!
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginproblem</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginprompt&amp;action=edit loginprompt]&lt;br&gt;
-[[MediaWiki_talk:Loginprompt|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You must have cookies enabled to log in to Wiktionary.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginprompt</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginreqtext&amp;action=edit loginreqtext]&lt;br&gt;
-[[MediaWiki_talk:Loginreqtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You must &amp;#91;&amp;#91;special:Userlogin&amp;#124;login]] to view other pages.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginreqtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginreqtitle&amp;action=edit loginreqtitle]&lt;br&gt;
-[[MediaWiki_talk:Loginreqtitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Login Required
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginreqtitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginsuccess&amp;action=edit loginsuccess]&lt;br&gt;
-[[MediaWiki_talk:Loginsuccess|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You are now logged in to Wiktionary as &amp;quot;$1&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginsuccess</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginsuccesstitle&amp;action=edit loginsuccesstitle]&lt;br&gt;
-[[MediaWiki_talk:Loginsuccesstitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Login successful
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Loginsuccesstitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Logout&amp;action=edit logout]&lt;br&gt;
-[[MediaWiki_talk:Logout|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Log out
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Logout</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Logouttext&amp;action=edit logouttext]&lt;br&gt;
-[[MediaWiki_talk:Logouttext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You are now logged out.
-You can continue to use Wiktionary anonymously, or you can log in
-again as the same or as a different user. Note that some pages may
-continue to be displayed as if you were still logged in, until you clear
-your browser cache
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Logouttext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Logouttitle&amp;action=edit logouttitle]&lt;br&gt;
-[[MediaWiki_talk:Logouttitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-User logout
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Logouttitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lonelypages&amp;action=edit lonelypages]&lt;br&gt;
-[[MediaWiki_talk:Lonelypages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Orphaned pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Lonelypages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Longpages&amp;action=edit longpages]&lt;br&gt;
-[[MediaWiki_talk:Longpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Long pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Longpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Longpagewarning&amp;action=edit longpagewarning]&lt;br&gt;
-[[MediaWiki_talk:Longpagewarning|Talk]]
-&lt;/td&gt;&lt;td&gt;
-WARNING: This page is $1 kilobytes long; some
-browsers may have problems editing pages approaching or longer than 32kb.
-Please consider breaking the page into smaller sections.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Longpagewarning</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailerror&amp;action=edit mailerror]&lt;br&gt;
-[[MediaWiki_talk:Mailerror|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Error sending mail: $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mailerror</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailmypassword&amp;action=edit mailmypassword]&lt;br&gt;
-[[MediaWiki_talk:Mailmypassword|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Mail me a new password
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mailmypassword</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailnologin&amp;action=edit mailnologin]&lt;br&gt;
-[[MediaWiki_talk:Mailnologin|Talk]]
-&lt;/td&gt;&lt;td&gt;
-No send address
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mailnologin</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailnologintext&amp;action=edit mailnologintext]&lt;br&gt;
-[[MediaWiki_talk:Mailnologintext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You must be &amp;lt;a href=&amp;quot;{{localurl:Special:Userlogin&amp;quot;&amp;gt;logged in&amp;lt;/a&amp;gt;
-and have a valid e-mail address in your &amp;lt;a href=&amp;quot;/wiki/Special:Preferences&amp;quot;&amp;gt;preferences&amp;lt;/a&amp;gt;
-to send e-mail to other users.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mailnologintext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mainpage&amp;action=edit mainpage]&lt;br&gt;
-[[MediaWiki_talk:Mainpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Main Page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mainpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mainpagedocfooter&amp;action=edit mainpagedocfooter]&lt;br&gt;
-[[MediaWiki_talk:Mainpagedocfooter|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Please see &amp;#91;http&amp;#58;//meta.wikipedia.org/wiki/MediaWiki_i18n documentation on customizing the interface]
-and the &amp;#91;http&amp;#58;//meta.wikipedia.org/wiki/MediaWiki_User%27s_Guide User&amp;#39;s Guide] for usage and configuration help.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mainpagedocfooter</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mainpagetext&amp;action=edit mainpagetext]&lt;br&gt;
-[[MediaWiki_talk:Mainpagetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiki software successfully installed.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mainpagetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Maintenance&amp;action=edit maintenance]&lt;br&gt;
-[[MediaWiki_talk:Maintenance|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Maintenance page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Maintenance</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Maintenancebacklink&amp;action=edit maintenancebacklink]&lt;br&gt;
-[[MediaWiki_talk:Maintenancebacklink|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Back to Maintenance Page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Maintenancebacklink</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Maintnancepagetext&amp;action=edit maintnancepagetext]&lt;br&gt;
-[[MediaWiki_talk:Maintnancepagetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This page includes several handy tools for everyday maintenance. Some of these functions tend to stress the database, so please do not hit reload after every item you fixed ;-)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Maintnancepagetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysop&amp;action=edit makesysop]&lt;br&gt;
-[[MediaWiki_talk:Makesysop|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Make a user into a sysop
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysop</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopfail&amp;action=edit makesysopfail]&lt;br&gt;
-[[MediaWiki_talk:Makesysopfail|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;b&amp;gt;User &amp;quot;$1&amp;quot; could not be made into a sysop. (Did you enter the name correctly?)&amp;lt;/b&amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysopfail</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopname&amp;action=edit makesysopname]&lt;br&gt;
-[[MediaWiki_talk:Makesysopname|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Name of the user:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysopname</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopok&amp;action=edit makesysopok]&lt;br&gt;
-[[MediaWiki_talk:Makesysopok|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;b&amp;gt;User &amp;quot;$1&amp;quot; is now a sysop&amp;lt;/b&amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysopok</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopsubmit&amp;action=edit makesysopsubmit]&lt;br&gt;
-[[MediaWiki_talk:Makesysopsubmit|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Make this user into a sysop
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysopsubmit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysoptext&amp;action=edit makesysoptext]&lt;br&gt;
-[[MediaWiki_talk:Makesysoptext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This form is used by bureaucrats to turn ordinary users into administrators.
-Type the name of the user in the box and press the button to make the user an administrator
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysoptext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysoptitle&amp;action=edit makesysoptitle]&lt;br&gt;
-[[MediaWiki_talk:Makesysoptitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Make a user into a sysop
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Makesysoptitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Matchtotals&amp;action=edit matchtotals]&lt;br&gt;
-[[MediaWiki_talk:Matchtotals|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The query &amp;quot;$1&amp;quot; matched $2 page titles
-and the text of $3 pages.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Matchtotals</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math&amp;action=edit math]&lt;br&gt;
-[[MediaWiki_talk:Math|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Rendering math
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_bad_output&amp;action=edit math_bad_output]&lt;br&gt;
-[[MediaWiki_talk:Math_bad_output|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Can&amp;#39;t write to or create math output directory
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_bad_output</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_bad_tmpdir&amp;action=edit math_bad_tmpdir]&lt;br&gt;
-[[MediaWiki_talk:Math_bad_tmpdir|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Can&amp;#39;t write to or create math temp directory
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_bad_tmpdir</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_failure&amp;action=edit math_failure]&lt;br&gt;
-[[MediaWiki_talk:Math_failure|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Failed to parse
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_failure</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_image_error&amp;action=edit math_image_error]&lt;br&gt;
-[[MediaWiki_talk:Math_image_error|Talk]]
-&lt;/td&gt;&lt;td&gt;
-PNG conversion failed; check for correct installation of latex, dvips, gs, and convert
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_image_error</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_lexing_error&amp;action=edit math_lexing_error]&lt;br&gt;
-[[MediaWiki_talk:Math_lexing_error|Talk]]
-&lt;/td&gt;&lt;td&gt;
-lexing error
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_lexing_error</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_notexvc&amp;action=edit math_notexvc]&lt;br&gt;
-[[MediaWiki_talk:Math_notexvc|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Missing texvc executable; please see math/README to configure.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_notexvc</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_sample&amp;action=edit math_sample]&lt;br&gt;
-[[MediaWiki_talk:Math_sample|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Insert formula here
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_sample</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_syntax_error&amp;action=edit math_syntax_error]&lt;br&gt;
-[[MediaWiki_talk:Math_syntax_error|Talk]]
-&lt;/td&gt;&lt;td&gt;
-syntax error
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_syntax_error</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_tip&amp;action=edit math_tip]&lt;br&gt;
-[[MediaWiki_talk:Math_tip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Mathematical formula (LaTeX)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_tip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_unknown_error&amp;action=edit math_unknown_error]&lt;br&gt;
-[[MediaWiki_talk:Math_unknown_error|Talk]]
-&lt;/td&gt;&lt;td&gt;
-unknown error
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_unknown_error</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_unknown_function&amp;action=edit math_unknown_function]&lt;br&gt;
-[[MediaWiki_talk:Math_unknown_function|Talk]]
-&lt;/td&gt;&lt;td&gt;
-unknown function
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Math_unknown_function</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Media_sample&amp;action=edit media_sample]&lt;br&gt;
-[[MediaWiki_talk:Media_sample|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Example.mp3
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Media_sample</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Media_tip&amp;action=edit media_tip]&lt;br&gt;
-[[MediaWiki_talk:Media_tip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Media file link
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Media_tip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Minlength&amp;action=edit minlength]&lt;br&gt;
-[[MediaWiki_talk:Minlength|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Image names must be at least three letters.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Minlength</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Minoredit&amp;action=edit minoredit]&lt;br&gt;
-[[MediaWiki_talk:Minoredit|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This is a minor edit
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Minoredit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Minoreditletter&amp;action=edit minoreditletter]&lt;br&gt;
-[[MediaWiki_talk:Minoreditletter|Talk]]
-&lt;/td&gt;&lt;td&gt;
-M
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Minoreditletter</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mispeelings&amp;action=edit mispeelings]&lt;br&gt;
-[[MediaWiki_talk:Mispeelings|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Pages with misspellings
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mispeelings</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mispeelingspage&amp;action=edit mispeelingspage]&lt;br&gt;
-[[MediaWiki_talk:Mispeelingspage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-List of common misspellings
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mispeelingspage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mispeelingstext&amp;action=edit mispeelingstext]&lt;br&gt;
-[[MediaWiki_talk:Mispeelingstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The following pages contain a common misspelling, which are listed on $1. The correct spelling might be given (like this).
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mispeelingstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missingarticle&amp;action=edit missingarticle]&lt;br&gt;
-[[MediaWiki_talk:Missingarticle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The database did not find the text of a page
-that it should have found, named &amp;quot;$1&amp;quot;.
-
-&amp;lt;p&amp;gt;This is usually caused by following an outdated diff or history link to a
-page that has been deleted.
-
-&amp;lt;p&amp;gt;If this is not the case, you may have found a bug in the software.
-Please report this to an administrator, making note of the URL.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Missingarticle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missingimage&amp;action=edit missingimage]&lt;br&gt;
-[[MediaWiki_talk:Missingimage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;b&amp;gt;Missing image&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;i&amp;gt;$1&amp;lt;/i&amp;gt;
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Missingimage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missinglanguagelinks&amp;action=edit missinglanguagelinks]&lt;br&gt;
-[[MediaWiki_talk:Missinglanguagelinks|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Missing Language Links
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Missinglanguagelinks</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missinglanguagelinksbutton&amp;action=edit missinglanguagelinksbutton]&lt;br&gt;
-[[MediaWiki_talk:Missinglanguagelinksbutton|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Find missing language links for
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Missinglanguagelinksbutton</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missinglanguagelinkstext&amp;action=edit missinglanguagelinkstext]&lt;br&gt;
-[[MediaWiki_talk:Missinglanguagelinkstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-These pages do &amp;lt;i&amp;gt;not&amp;lt;/i&amp;gt; link to their counterpart in $1. Redirects and subpages are &amp;lt;i&amp;gt;not&amp;lt;/i&amp;gt; shown.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Missinglanguagelinkstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Moredotdotdot&amp;action=edit moredotdotdot]&lt;br&gt;
-[[MediaWiki_talk:Moredotdotdot|Talk]]
-&lt;/td&gt;&lt;td&gt;
-More...
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Moredotdotdot</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Move&amp;action=edit move]&lt;br&gt;
-[[MediaWiki_talk:Move|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Move
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Move</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movearticle&amp;action=edit movearticle]&lt;br&gt;
-[[MediaWiki_talk:Movearticle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Move page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movearticle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movedto&amp;action=edit movedto]&lt;br&gt;
-[[MediaWiki_talk:Movedto|Talk]]
-&lt;/td&gt;&lt;td&gt;
-moved to
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movedto</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movenologin&amp;action=edit movenologin]&lt;br&gt;
-[[MediaWiki_talk:Movenologin|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Not logged in
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movenologin</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movenologintext&amp;action=edit movenologintext]&lt;br&gt;
-[[MediaWiki_talk:Movenologintext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You must be a registered user and &amp;lt;a href=&amp;quot;/wiki/Special:Userlogin&amp;quot;&amp;gt;logged in&amp;lt;/a&amp;gt;
-to move a page.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movenologintext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepage&amp;action=edit movepage]&lt;br&gt;
-[[MediaWiki_talk:Movepage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Move page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movepage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepagebtn&amp;action=edit movepagebtn]&lt;br&gt;
-[[MediaWiki_talk:Movepagebtn|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Move page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movepagebtn</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepagetalktext&amp;action=edit movepagetalktext]&lt;br&gt;
-[[MediaWiki_talk:Movepagetalktext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The associated talk page, if any, will be automatically moved along with it &amp;#39;&amp;#39;&amp;#39;unless:&amp;#39;&amp;#39;&amp;#39;
-*You are moving the page across namespaces,
-*A non-empty talk page already exists under the new name, or
-*You uncheck the box below.
-
-In those cases, you will have to move or merge the page manually if desired.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movepagetalktext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepagetext&amp;action=edit movepagetext]&lt;br&gt;
-[[MediaWiki_talk:Movepagetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Using the form below will rename a page, moving all
-of its history to the new name.
-The old title will become a redirect page to the new title.
-Links to the old page title will not be changed; be sure to
-&amp;#91;&amp;#91;Special:Maintenance&amp;#124;check]] for double or broken redirects.
-You are responsible for making sure that links continue to
-point where they are supposed to go.
-
-Note that the page will &amp;#39;&amp;#39;&amp;#39;not&amp;#39;&amp;#39;&amp;#39; be moved if there is already
-a page at the new title, unless it is empty or a redirect and has no
-past edit history. This means that you can rename a page back to where
-it was just renamed from if you make a mistake, and you cannot overwrite
-an existing page.
-
-&amp;lt;b&amp;gt;WARNING!&amp;lt;/b&amp;gt;
-This can be a drastic and unexpected change for a popular page;
-please be sure you understand the consequences of this before
-proceeding.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movepagetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movetalk&amp;action=edit movetalk]&lt;br&gt;
-[[MediaWiki_talk:Movetalk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Move &amp;quot;talk&amp;quot; page as well, if applicable.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movetalk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movethispage&amp;action=edit movethispage]&lt;br&gt;
-[[MediaWiki_talk:Movethispage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Move this page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Movethispage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mycontris&amp;action=edit mycontris]&lt;br&gt;
-[[MediaWiki_talk:Mycontris|Talk]]
-&lt;/td&gt;&lt;td&gt;
-My contributions
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mycontris</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mypage&amp;action=edit mypage]&lt;br&gt;
-[[MediaWiki_talk:Mypage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-My page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mypage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mytalk&amp;action=edit mytalk]&lt;br&gt;
-[[MediaWiki_talk:Mytalk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-My talk
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Mytalk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Navigation&amp;action=edit navigation]&lt;br&gt;
-[[MediaWiki_talk:Navigation|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Navigation
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Navigation</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nbytes&amp;action=edit nbytes]&lt;br&gt;
-[[MediaWiki_talk:Nbytes|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1 bytes
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nbytes</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nchanges&amp;action=edit nchanges]&lt;br&gt;
-[[MediaWiki_talk:Nchanges|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1 changes
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nchanges</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newarticle&amp;action=edit newarticle]&lt;br&gt;
-[[MediaWiki_talk:Newarticle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(New)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newarticle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newarticletext&amp;action=edit newarticletext]&lt;br&gt;
-[[MediaWiki_talk:Newarticletext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You&amp;#39;ve followed a link to a page that doesn&amp;#39;t exist yet.
-To create the page, start typing in the box below
-(see the &amp;#91;&amp;#91;Wiktionary:Help&amp;#124;help page]] for more info).
-If you are here by mistake, just click your browser&amp;#39;s &amp;#39;&amp;#39;&amp;#39;back&amp;#39;&amp;#39;&amp;#39; button.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newarticletext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newmessages&amp;action=edit newmessages]&lt;br&gt;
-[[MediaWiki_talk:Newmessages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You have $1.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newmessages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newmessageslink&amp;action=edit newmessageslink]&lt;br&gt;
-[[MediaWiki_talk:Newmessageslink|Talk]]
-&lt;/td&gt;&lt;td&gt;
-new messages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newmessageslink</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpage&amp;action=edit newpage]&lt;br&gt;
-[[MediaWiki_talk:Newpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-New page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpageletter&amp;action=edit newpageletter]&lt;br&gt;
-[[MediaWiki_talk:Newpageletter|Talk]]
-&lt;/td&gt;&lt;td&gt;
-N
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newpageletter</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpages&amp;action=edit newpages]&lt;br&gt;
-[[MediaWiki_talk:Newpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-New pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpassword&amp;action=edit newpassword]&lt;br&gt;
-[[MediaWiki_talk:Newpassword|Talk]]
-&lt;/td&gt;&lt;td&gt;
-New password
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newpassword</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newtitle&amp;action=edit newtitle]&lt;br&gt;
-[[MediaWiki_talk:Newtitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-To new title
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newtitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newusersonly&amp;action=edit newusersonly]&lt;br&gt;
-[[MediaWiki_talk:Newusersonly|Talk]]
-&lt;/td&gt;&lt;td&gt;
- (new users only)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Newusersonly</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Next&amp;action=edit next]&lt;br&gt;
-[[MediaWiki_talk:Next|Talk]]
-&lt;/td&gt;&lt;td&gt;
-next
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Next</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nextn&amp;action=edit nextn]&lt;br&gt;
-[[MediaWiki_talk:Nextn|Talk]]
-&lt;/td&gt;&lt;td&gt;
-next $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nextn</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nlinks&amp;action=edit nlinks]&lt;br&gt;
-[[MediaWiki_talk:Nlinks|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1 links
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nlinks</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noaffirmation&amp;action=edit noaffirmation]&lt;br&gt;
-[[MediaWiki_talk:Noaffirmation|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You must affirm that your upload does not violate
-any copyrights.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noaffirmation</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noarticletext&amp;action=edit noarticletext]&lt;br&gt;
-[[MediaWiki_talk:Noarticletext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(There is currently no text in this page)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noarticletext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noblockreason&amp;action=edit noblockreason]&lt;br&gt;
-[[MediaWiki_talk:Noblockreason|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You must supply a reason for the block.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noblockreason</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noconnect&amp;action=edit noconnect]&lt;br&gt;
-[[MediaWiki_talk:Noconnect|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Sorry! The wiki is experiencing some technical difficulties, and cannot contact the database server.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noconnect</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocontribs&amp;action=edit nocontribs]&lt;br&gt;
-[[MediaWiki_talk:Nocontribs|Talk]]
-&lt;/td&gt;&lt;td&gt;
-No changes were found matching these criteria.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nocontribs</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocookieslogin&amp;action=edit nocookieslogin]&lt;br&gt;
-[[MediaWiki_talk:Nocookieslogin|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary uses cookies to log in users. You have cookies disabled. Please enable them and try again.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nocookieslogin</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocookiesnew&amp;action=edit nocookiesnew]&lt;br&gt;
-[[MediaWiki_talk:Nocookiesnew|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The user account was created, but you are not logged in. Wiktionary uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nocookiesnew</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocreativecommons&amp;action=edit nocreativecommons]&lt;br&gt;
-[[MediaWiki_talk:Nocreativecommons|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Creative Commons RDF metadata disabled for this server.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nocreativecommons</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nodb&amp;action=edit nodb]&lt;br&gt;
-[[MediaWiki_talk:Nodb|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Could not select database $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nodb</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nodublincore&amp;action=edit nodublincore]&lt;br&gt;
-[[MediaWiki_talk:Nodublincore|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Dublin Core RDF metadata disabled for this server.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nodublincore</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noemail&amp;action=edit noemail]&lt;br&gt;
-[[MediaWiki_talk:Noemail|Talk]]
-&lt;/td&gt;&lt;td&gt;
-There is no e-mail address recorded for user &amp;quot;$1&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noemail</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noemailtext&amp;action=edit noemailtext]&lt;br&gt;
-[[MediaWiki_talk:Noemailtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This user has not specified a valid e-mail address,
-or has chosen not to receive e-mail from other users.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noemailtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noemailtitle&amp;action=edit noemailtitle]&lt;br&gt;
-[[MediaWiki_talk:Noemailtitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-No e-mail address
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noemailtitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nogomatch&amp;action=edit nogomatch]&lt;br&gt;
-[[MediaWiki_talk:Nogomatch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-No page with this exact title exists, trying full text search.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nogomatch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nohistory&amp;action=edit nohistory]&lt;br&gt;
-[[MediaWiki_talk:Nohistory|Talk]]
-&lt;/td&gt;&lt;td&gt;
-There is no edit history for this page.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nohistory</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nolinkshere&amp;action=edit nolinkshere]&lt;br&gt;
-[[MediaWiki_talk:Nolinkshere|Talk]]
-&lt;/td&gt;&lt;td&gt;
-No pages link to here.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nolinkshere</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nolinkstoimage&amp;action=edit nolinkstoimage]&lt;br&gt;
-[[MediaWiki_talk:Nolinkstoimage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-There are no pages that link to this image.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nolinkstoimage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noname&amp;action=edit noname]&lt;br&gt;
-[[MediaWiki_talk:Noname|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You have not specified a valid user name.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Noname</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nonefound&amp;action=edit nonefound]&lt;br&gt;
-[[MediaWiki_talk:Nonefound|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;strong&amp;gt;Note&amp;lt;/strong&amp;gt;: unsuccessful searches are
-often caused by searching for common words like &amp;quot;have&amp;quot; and &amp;quot;from&amp;quot;,
-which are not indexed, or by specifying more than one search term (only pages
-containing all of the search terms will appear in the result).
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nonefound</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nospecialpagetext&amp;action=edit nospecialpagetext]&lt;br&gt;
-[[MediaWiki_talk:Nospecialpagetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You have requested a special page that is not
-recognized by the wiki.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nospecialpagetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchaction&amp;action=edit nosuchaction]&lt;br&gt;
-[[MediaWiki_talk:Nosuchaction|Talk]]
-&lt;/td&gt;&lt;td&gt;
-No such action
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nosuchaction</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchactiontext&amp;action=edit nosuchactiontext]&lt;br&gt;
-[[MediaWiki_talk:Nosuchactiontext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The action specified by the URL is not
-recognized by the wiki
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nosuchactiontext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchspecialpage&amp;action=edit nosuchspecialpage]&lt;br&gt;
-[[MediaWiki_talk:Nosuchspecialpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-No such special page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nosuchspecialpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchuser&amp;action=edit nosuchuser]&lt;br&gt;
-[[MediaWiki_talk:Nosuchuser|Talk]]
-&lt;/td&gt;&lt;td&gt;
-There is no user by the name &amp;quot;$1&amp;quot;.
-Check your spelling, or use the form below to create a new user account.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nosuchuser</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notacceptable&amp;action=edit notacceptable]&lt;br&gt;
-[[MediaWiki_talk:Notacceptable|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The wiki server can&amp;#39;t provide data in a format your client can read.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notacceptable</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notanarticle&amp;action=edit notanarticle]&lt;br&gt;
-[[MediaWiki_talk:Notanarticle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Not a content page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notanarticle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notargettext&amp;action=edit notargettext]&lt;br&gt;
-[[MediaWiki_talk:Notargettext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You have not specified a target page or user
-to perform this function on.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notargettext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notargettitle&amp;action=edit notargettitle]&lt;br&gt;
-[[MediaWiki_talk:Notargettitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-No target
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notargettitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Note&amp;action=edit note]&lt;br&gt;
-[[MediaWiki_talk:Note|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;strong&amp;gt;Note:&amp;lt;/strong&amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Note</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notextmatches&amp;action=edit notextmatches]&lt;br&gt;
-[[MediaWiki_talk:Notextmatches|Talk]]
-&lt;/td&gt;&lt;td&gt;
-No page text matches
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notextmatches</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notitlematches&amp;action=edit notitlematches]&lt;br&gt;
-[[MediaWiki_talk:Notitlematches|Talk]]
-&lt;/td&gt;&lt;td&gt;
-No page title matches
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notitlematches</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notloggedin&amp;action=edit notloggedin]&lt;br&gt;
-[[MediaWiki_talk:Notloggedin|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Not logged in
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Notloggedin</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nowatchlist&amp;action=edit nowatchlist]&lt;br&gt;
-[[MediaWiki_talk:Nowatchlist|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You have no items on your watchlist.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nowatchlist</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nowiki_sample&amp;action=edit nowiki_sample]&lt;br&gt;
-[[MediaWiki_talk:Nowiki_sample|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Insert non-formatted text here
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nowiki_sample</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nowiki_tip&amp;action=edit nowiki_tip]&lt;br&gt;
-[[MediaWiki_talk:Nowiki_tip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Ignore wiki formatting
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nowiki_tip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-category&amp;action=edit nstab-category]&lt;br&gt;
-[[MediaWiki_talk:Nstab-category|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Category
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-category</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-help&amp;action=edit nstab-help]&lt;br&gt;
-[[MediaWiki_talk:Nstab-help|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Help
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-help</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-image&amp;action=edit nstab-image]&lt;br&gt;
-[[MediaWiki_talk:Nstab-image|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Image
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-image</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-main&amp;action=edit nstab-main]&lt;br&gt;
-[[MediaWiki_talk:Nstab-main|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Article
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-main</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-media&amp;action=edit nstab-media]&lt;br&gt;
-[[MediaWiki_talk:Nstab-media|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Media
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-media</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-mediawiki&amp;action=edit nstab-mediawiki]&lt;br&gt;
-[[MediaWiki_talk:Nstab-mediawiki|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Message
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-mediawiki</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-special&amp;action=edit nstab-special]&lt;br&gt;
-[[MediaWiki_talk:Nstab-special|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Special
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-special</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-template&amp;action=edit nstab-template]&lt;br&gt;
-[[MediaWiki_talk:Nstab-template|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Template
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-template</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-user&amp;action=edit nstab-user]&lt;br&gt;
-[[MediaWiki_talk:Nstab-user|Talk]]
-&lt;/td&gt;&lt;td&gt;
-User page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-user</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-wp&amp;action=edit nstab-wp]&lt;br&gt;
-[[MediaWiki_talk:Nstab-wp|Talk]]
-&lt;/td&gt;&lt;td&gt;
-About
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nstab-wp</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nviews&amp;action=edit nviews]&lt;br&gt;
-[[MediaWiki_talk:Nviews|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1 views
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Nviews</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ok&amp;action=edit ok]&lt;br&gt;
-[[MediaWiki_talk:Ok|Talk]]
-&lt;/td&gt;&lt;td&gt;
-OK
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ok</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Oldpassword&amp;action=edit oldpassword]&lt;br&gt;
-[[MediaWiki_talk:Oldpassword|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Old password
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Oldpassword</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Orig&amp;action=edit orig]&lt;br&gt;
-[[MediaWiki_talk:Orig|Talk]]
-&lt;/td&gt;&lt;td&gt;
-orig
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Orig</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Orphans&amp;action=edit orphans]&lt;br&gt;
-[[MediaWiki_talk:Orphans|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Orphaned pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Orphans</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Othercontribs&amp;action=edit othercontribs]&lt;br&gt;
-[[MediaWiki_talk:Othercontribs|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Based on work by $1.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Othercontribs</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Otherlanguages&amp;action=edit otherlanguages]&lt;br&gt;
-[[MediaWiki_talk:Otherlanguages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Other languages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Otherlanguages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Pagemovedsub&amp;action=edit pagemovedsub]&lt;br&gt;
-[[MediaWiki_talk:Pagemovedsub|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Move succeeded
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Pagemovedsub</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Pagemovedtext&amp;action=edit pagemovedtext]&lt;br&gt;
-[[MediaWiki_talk:Pagemovedtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Page &amp;quot;&amp;#91;&amp;#91;$1]]&amp;quot; moved to &amp;quot;&amp;#91;&amp;#91;$2]]&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Pagemovedtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Pagetitle&amp;action=edit pagetitle]&lt;br&gt;
-[[MediaWiki_talk:Pagetitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1 - Wiktionary
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Pagetitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Passwordremindertext&amp;action=edit passwordremindertext]&lt;br&gt;
-[[MediaWiki_talk:Passwordremindertext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Someone (probably you, from IP address $1)
-requested that we send you a new Wiktionary login password.
-The password for user &amp;quot;$2&amp;quot; is now &amp;quot;$3&amp;quot;.
-You should log in and change your password now.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Passwordremindertext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Passwordremindertitle&amp;action=edit passwordremindertitle]&lt;br&gt;
-[[MediaWiki_talk:Passwordremindertitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Password reminder from Wiktionary
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Passwordremindertitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Passwordsent&amp;action=edit passwordsent]&lt;br&gt;
-[[MediaWiki_talk:Passwordsent|Talk]]
-&lt;/td&gt;&lt;td&gt;
-A new password has been sent to the e-mail address
-registered for &amp;quot;$1&amp;quot;.
-Please log in again after you receive it.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Passwordsent</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Perfcached&amp;action=edit perfcached]&lt;br&gt;
-[[MediaWiki_talk:Perfcached|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The following data is cached and may not be completely up to date:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Perfcached</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Perfdisabled&amp;action=edit perfdisabled]&lt;br&gt;
-[[MediaWiki_talk:Perfdisabled|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Sorry! This feature has been temporarily disabled
-because it slows the database down to the point that no one can use
-the wiki.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Perfdisabled</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Perfdisabledsub&amp;action=edit perfdisabledsub]&lt;br&gt;
-[[MediaWiki_talk:Perfdisabledsub|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Here&amp;#39;s a saved copy from $1:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Perfdisabledsub</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Personaltools&amp;action=edit personaltools]&lt;br&gt;
-[[MediaWiki_talk:Personaltools|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Personal tools
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Personaltools</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Popularpages&amp;action=edit popularpages]&lt;br&gt;
-[[MediaWiki_talk:Popularpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Popular pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Popularpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Portal&amp;action=edit portal]&lt;br&gt;
-[[MediaWiki_talk:Portal|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Community portal
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Portal</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Portal-url&amp;action=edit portal-url]&lt;br&gt;
-[[MediaWiki_talk:Portal-url|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:Community Portal
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Portal-url</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Postcomment&amp;action=edit postcomment]&lt;br&gt;
-[[MediaWiki_talk:Postcomment|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Post a comment
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Postcomment</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Poweredby&amp;action=edit poweredby]&lt;br&gt;
-[[MediaWiki_talk:Poweredby|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary is powered by &amp;#91;http&amp;#58;//www.mediawiki.org/ MediaWiki], an open source wiki engine.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Poweredby</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Powersearch&amp;action=edit powersearch]&lt;br&gt;
-[[MediaWiki_talk:Powersearch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Search
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Powersearch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Powersearchtext&amp;action=edit powersearchtext]&lt;br&gt;
-[[MediaWiki_talk:Powersearchtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-
-Search in namespaces :&amp;lt;br /&amp;gt;
-$1&amp;lt;br /&amp;gt;
-$2 List redirects &amp;amp;nbsp; Search for $3 $9
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Powersearchtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Preferences&amp;action=edit preferences]&lt;br&gt;
-[[MediaWiki_talk:Preferences|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Preferences
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Preferences</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-help-userdata&amp;action=edit prefs-help-userdata]&lt;br&gt;
-[[MediaWiki_talk:Prefs-help-userdata|Talk]]
-&lt;/td&gt;&lt;td&gt;
-* &amp;lt;strong&amp;gt;Real name&amp;lt;/strong&amp;gt; (optional): if you choose to provide it this will be used for giving you attribution for your work.&amp;lt;br/&amp;gt;
-* &amp;lt;strong&amp;gt;Email&amp;lt;/strong&amp;gt; (optional): Enables people to contact you through the website without you having to reveal your
-email address to them, and it can be used to send you a new password if you forget it.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefs-help-userdata</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-misc&amp;action=edit prefs-misc]&lt;br&gt;
-[[MediaWiki_talk:Prefs-misc|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Misc settings
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefs-misc</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-personal&amp;action=edit prefs-personal]&lt;br&gt;
-[[MediaWiki_talk:Prefs-personal|Talk]]
-&lt;/td&gt;&lt;td&gt;
-User data
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefs-personal</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-rc&amp;action=edit prefs-rc]&lt;br&gt;
-[[MediaWiki_talk:Prefs-rc|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Recent changes and stub display
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefs-rc</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefslogintext&amp;action=edit prefslogintext]&lt;br&gt;
-[[MediaWiki_talk:Prefslogintext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You are logged in as &amp;quot;$1&amp;quot;.
-Your internal ID number is $2.
-
-See &amp;#91;&amp;#91;Wiktionary:User preferences help]] for help deciphering the options.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefslogintext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefsnologin&amp;action=edit prefsnologin]&lt;br&gt;
-[[MediaWiki_talk:Prefsnologin|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Not logged in
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefsnologin</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefsnologintext&amp;action=edit prefsnologintext]&lt;br&gt;
-[[MediaWiki_talk:Prefsnologintext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You must be &amp;lt;a href=&amp;quot;/wiki/Special:Userlogin&amp;quot;&amp;gt;logged in&amp;lt;/a&amp;gt;
-to set user preferences.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefsnologintext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefsreset&amp;action=edit prefsreset]&lt;br&gt;
-[[MediaWiki_talk:Prefsreset|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Preferences have been reset from storage.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prefsreset</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Preview&amp;action=edit preview]&lt;br&gt;
-[[MediaWiki_talk:Preview|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Preview
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Preview</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Previewconflict&amp;action=edit previewconflict]&lt;br&gt;
-[[MediaWiki_talk:Previewconflict|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This preview reflects the text in the upper
-text editing area as it will appear if you choose to save.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Previewconflict</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Previewnote&amp;action=edit previewnote]&lt;br&gt;
-[[MediaWiki_talk:Previewnote|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Remember that this is only a preview, and has not yet been saved!
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Previewnote</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prevn&amp;action=edit prevn]&lt;br&gt;
-[[MediaWiki_talk:Prevn|Talk]]
-&lt;/td&gt;&lt;td&gt;
-previous $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Prevn</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Printableversion&amp;action=edit printableversion]&lt;br&gt;
-[[MediaWiki_talk:Printableversion|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Printable version
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Printableversion</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Printsubtitle&amp;action=edit printsubtitle]&lt;br&gt;
-[[MediaWiki_talk:Printsubtitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(From http&amp;#58;//tl.wiktionary.org)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Printsubtitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protect&amp;action=edit protect]&lt;br&gt;
-[[MediaWiki_talk:Protect|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Protect
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protect</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectcomment&amp;action=edit protectcomment]&lt;br&gt;
-[[MediaWiki_talk:Protectcomment|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Reason for protecting
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectcomment</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedarticle&amp;action=edit protectedarticle]&lt;br&gt;
-[[MediaWiki_talk:Protectedarticle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-protected &amp;#91;&amp;#91;$1]]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectedarticle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedpage&amp;action=edit protectedpage]&lt;br&gt;
-[[MediaWiki_talk:Protectedpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Protected page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectedpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedpagewarning&amp;action=edit protectedpagewarning]&lt;br&gt;
-[[MediaWiki_talk:Protectedpagewarning|Talk]]
-&lt;/td&gt;&lt;td&gt;
-WARNING: This page has been locked so that only
-users with sysop privileges can edit it. Be sure you are following the
-&amp;lt;a href=&amp;#39;/w/wiki.phtml/Wiktionary:Protected_page_guidelines&amp;#39;&amp;gt;protected page
-guidelines&amp;lt;/a&amp;gt;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectedpagewarning</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedtext&amp;action=edit protectedtext]&lt;br&gt;
-[[MediaWiki_talk:Protectedtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This page has been locked to prevent editing; there are
-a number of reasons why this may be so, please see
-&amp;#91;&amp;#91;Wiktionary:Protected page]].
-
-You can view and copy the source of this page:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectedtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectlogpage&amp;action=edit protectlogpage]&lt;br&gt;
-[[MediaWiki_talk:Protectlogpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Protection_log
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectlogpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectlogtext&amp;action=edit protectlogtext]&lt;br&gt;
-[[MediaWiki_talk:Protectlogtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Below is a list of page locks/unlocks.
-See &amp;#91;&amp;#91;Wiktionary:Protected page]] for more information.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectlogtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectpage&amp;action=edit protectpage]&lt;br&gt;
-[[MediaWiki_talk:Protectpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Protect page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectreason&amp;action=edit protectreason]&lt;br&gt;
-[[MediaWiki_talk:Protectreason|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(give a reason)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectreason</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectsub&amp;action=edit protectsub]&lt;br&gt;
-[[MediaWiki_talk:Protectsub|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(Protecting &amp;quot;$1&amp;quot;)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectsub</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectthispage&amp;action=edit protectthispage]&lt;br&gt;
-[[MediaWiki_talk:Protectthispage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Protect this page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Protectthispage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Proxyblocker&amp;action=edit proxyblocker]&lt;br&gt;
-[[MediaWiki_talk:Proxyblocker|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Proxy blocker
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Proxyblocker</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Proxyblockreason&amp;action=edit proxyblockreason]&lt;br&gt;
-[[MediaWiki_talk:Proxyblockreason|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Your IP address has been blocked because it is an open proxy. Please contact your Internet service provider or tech support and inform them of this serious security problem.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Proxyblockreason</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Proxyblocksuccess&amp;action=edit proxyblocksuccess]&lt;br&gt;
-[[MediaWiki_talk:Proxyblocksuccess|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Done.
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Proxyblocksuccess</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbbrowse&amp;action=edit qbbrowse]&lt;br&gt;
-[[MediaWiki_talk:Qbbrowse|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Browse
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbbrowse</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbedit&amp;action=edit qbedit]&lt;br&gt;
-[[MediaWiki_talk:Qbedit|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Edit
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbedit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbfind&amp;action=edit qbfind]&lt;br&gt;
-[[MediaWiki_talk:Qbfind|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Find
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbfind</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbmyoptions&amp;action=edit qbmyoptions]&lt;br&gt;
-[[MediaWiki_talk:Qbmyoptions|Talk]]
-&lt;/td&gt;&lt;td&gt;
-My pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbmyoptions</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbpageinfo&amp;action=edit qbpageinfo]&lt;br&gt;
-[[MediaWiki_talk:Qbpageinfo|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Context
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbpageinfo</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbpageoptions&amp;action=edit qbpageoptions]&lt;br&gt;
-[[MediaWiki_talk:Qbpageoptions|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbpageoptions</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbsettings&amp;action=edit qbsettings]&lt;br&gt;
-[[MediaWiki_talk:Qbsettings|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Quickbar settings
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbsettings</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbspecialpages&amp;action=edit qbspecialpages]&lt;br&gt;
-[[MediaWiki_talk:Qbspecialpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Special pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Qbspecialpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Querybtn&amp;action=edit querybtn]&lt;br&gt;
-[[MediaWiki_talk:Querybtn|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Submit query
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Querybtn</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Querysuccessful&amp;action=edit querysuccessful]&lt;br&gt;
-[[MediaWiki_talk:Querysuccessful|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Query successful
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Querysuccessful</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Randompage&amp;action=edit randompage]&lt;br&gt;
-[[MediaWiki_talk:Randompage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Random page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Randompage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Range_block_disabled&amp;action=edit range_block_disabled]&lt;br&gt;
-[[MediaWiki_talk:Range_block_disabled|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The sysop ability to create range blocks is disabled.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Range_block_disabled</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rchide&amp;action=edit rchide]&lt;br&gt;
-[[MediaWiki_talk:Rchide|Talk]]
-&lt;/td&gt;&lt;td&gt;
-in $4 form; $1 minor edits; $2 secondary namespaces; $3 multiple edits.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rchide</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rclinks&amp;action=edit rclinks]&lt;br&gt;
-[[MediaWiki_talk:Rclinks|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Show last $1 changes in last $2 days&amp;lt;br /&amp;gt;$3
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rclinks</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rclistfrom&amp;action=edit rclistfrom]&lt;br&gt;
-[[MediaWiki_talk:Rclistfrom|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Show new changes starting from $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rclistfrom</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcliu&amp;action=edit rcliu]&lt;br&gt;
-[[MediaWiki_talk:Rcliu|Talk]]
-&lt;/td&gt;&lt;td&gt;
-; $1 edits from logged in users
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rcliu</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcloaderr&amp;action=edit rcloaderr]&lt;br&gt;
-[[MediaWiki_talk:Rcloaderr|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Loading recent changes
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rcloaderr</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rclsub&amp;action=edit rclsub]&lt;br&gt;
-[[MediaWiki_talk:Rclsub|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(to pages linked from &amp;quot;$1&amp;quot;)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rclsub</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcnote&amp;action=edit rcnote]&lt;br&gt;
-[[MediaWiki_talk:Rcnote|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Below are the last &amp;lt;strong&amp;gt;$1&amp;lt;/strong&amp;gt; changes in last &amp;lt;strong&amp;gt;$2&amp;lt;/strong&amp;gt; days.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rcnote</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcnotefrom&amp;action=edit rcnotefrom]&lt;br&gt;
-[[MediaWiki_talk:Rcnotefrom|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Below are the changes since &amp;lt;b&amp;gt;$2&amp;lt;/b&amp;gt; (up to &amp;lt;b&amp;gt;$1&amp;lt;/b&amp;gt; shown).
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rcnotefrom</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Readonly&amp;action=edit readonly]&lt;br&gt;
-[[MediaWiki_talk:Readonly|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Database locked
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Readonly</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Readonlytext&amp;action=edit readonlytext]&lt;br&gt;
-[[MediaWiki_talk:Readonlytext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The database is currently locked to new
-entries and other modifications, probably for routine database maintenance,
-after which it will be back to normal.
-The administrator who locked it offered this explanation:
-&amp;lt;p&amp;gt;$1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Readonlytext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Readonlywarning&amp;action=edit readonlywarning]&lt;br&gt;
-[[MediaWiki_talk:Readonlywarning|Talk]]
-&lt;/td&gt;&lt;td&gt;
-WARNING: The database has been locked for maintenance,
-so you will not be able to save your edits right now. You may wish to cut-n-paste
-the text into a text file and save it for later.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Readonlywarning</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchanges&amp;action=edit recentchanges]&lt;br&gt;
-[[MediaWiki_talk:Recentchanges|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Recent changes
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Recentchanges</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchangescount&amp;action=edit recentchangescount]&lt;br&gt;
-[[MediaWiki_talk:Recentchangescount|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Number of titles in recent changes
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Recentchangescount</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchangeslinked&amp;action=edit recentchangeslinked]&lt;br&gt;
-[[MediaWiki_talk:Recentchangeslinked|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Related changes
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Recentchangeslinked</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchangestext&amp;action=edit recentchangestext]&lt;br&gt;
-[[MediaWiki_talk:Recentchangestext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Track the most recent changes to the wiki on this page.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Recentchangestext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Redirectedfrom&amp;action=edit redirectedfrom]&lt;br&gt;
-[[MediaWiki_talk:Redirectedfrom|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(Redirected from $1)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Redirectedfrom</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Remembermypassword&amp;action=edit remembermypassword]&lt;br&gt;
-[[MediaWiki_talk:Remembermypassword|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Remember my password across sessions.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Remembermypassword</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removechecked&amp;action=edit removechecked]&lt;br&gt;
-[[MediaWiki_talk:Removechecked|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Remove checked items from watchlist
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Removechecked</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removedwatch&amp;action=edit removedwatch]&lt;br&gt;
-[[MediaWiki_talk:Removedwatch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Removed from watchlist
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Removedwatch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removedwatchtext&amp;action=edit removedwatchtext]&lt;br&gt;
-[[MediaWiki_talk:Removedwatchtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The page &amp;quot;$1&amp;quot; has been removed from your watchlist.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Removedwatchtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removingchecked&amp;action=edit removingchecked]&lt;br&gt;
-[[MediaWiki_talk:Removingchecked|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Removing requested items from watchlist...
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Removingchecked</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Resetprefs&amp;action=edit resetprefs]&lt;br&gt;
-[[MediaWiki_talk:Resetprefs|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Reset preferences
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Resetprefs</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Restorelink&amp;action=edit restorelink]&lt;br&gt;
-[[MediaWiki_talk:Restorelink|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1 deleted edits
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Restorelink</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Resultsperpage&amp;action=edit resultsperpage]&lt;br&gt;
-[[MediaWiki_talk:Resultsperpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Hits to show per page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Resultsperpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Retrievedfrom&amp;action=edit retrievedfrom]&lt;br&gt;
-[[MediaWiki_talk:Retrievedfrom|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Retrieved from &amp;quot;$1&amp;quot;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Retrievedfrom</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Returnto&amp;action=edit returnto]&lt;br&gt;
-[[MediaWiki_talk:Returnto|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Return to $1.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Returnto</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Retypenew&amp;action=edit retypenew]&lt;br&gt;
-[[MediaWiki_talk:Retypenew|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Retype new password
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Retypenew</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Reupload&amp;action=edit reupload]&lt;br&gt;
-[[MediaWiki_talk:Reupload|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Re-upload
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Reupload</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Reuploaddesc&amp;action=edit reuploaddesc]&lt;br&gt;
-[[MediaWiki_talk:Reuploaddesc|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Return to the upload form.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Reuploaddesc</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Reverted&amp;action=edit reverted]&lt;br&gt;
-[[MediaWiki_talk:Reverted|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Reverted to earlier revision
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Reverted</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revertimg&amp;action=edit revertimg]&lt;br&gt;
-[[MediaWiki_talk:Revertimg|Talk]]
-&lt;/td&gt;&lt;td&gt;
-rev
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Revertimg</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revertpage&amp;action=edit revertpage]&lt;br&gt;
-[[MediaWiki_talk:Revertpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Reverted edit of $2, changed back to last version by $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Revertpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revhistory&amp;action=edit revhistory]&lt;br&gt;
-[[MediaWiki_talk:Revhistory|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Revision history
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Revhistory</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revisionasof&amp;action=edit revisionasof]&lt;br&gt;
-[[MediaWiki_talk:Revisionasof|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Revision as of $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Revisionasof</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revnotfound&amp;action=edit revnotfound]&lt;br&gt;
-[[MediaWiki_talk:Revnotfound|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Revision not found
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Revnotfound</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revnotfoundtext&amp;action=edit revnotfoundtext]&lt;br&gt;
-[[MediaWiki_talk:Revnotfoundtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The old revision of the page you asked for could not be found.
-Please check the URL you used to access this page.
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Revnotfoundtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rfcurl&amp;action=edit rfcurl]&lt;br&gt;
-[[MediaWiki_talk:Rfcurl|Talk]]
-&lt;/td&gt;&lt;td&gt;
-http&amp;#58;//www.faqs.org/rfcs/rfc$1.html
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rfcurl</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rights&amp;action=edit rights]&lt;br&gt;
-[[MediaWiki_talk:Rights|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Rights:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rights</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollback&amp;action=edit rollback]&lt;br&gt;
-[[MediaWiki_talk:Rollback|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Roll back edits
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rollback</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollback_short&amp;action=edit rollback_short]&lt;br&gt;
-[[MediaWiki_talk:Rollback_short|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Rollback
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rollback_short</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollbackfailed&amp;action=edit rollbackfailed]&lt;br&gt;
-[[MediaWiki_talk:Rollbackfailed|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Rollback failed
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rollbackfailed</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollbacklink&amp;action=edit rollbacklink]&lt;br&gt;
-[[MediaWiki_talk:Rollbacklink|Talk]]
-&lt;/td&gt;&lt;td&gt;
-rollback
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rollbacklink</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rows&amp;action=edit rows]&lt;br&gt;
-[[MediaWiki_talk:Rows|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Rows
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Rows</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Savearticle&amp;action=edit savearticle]&lt;br&gt;
-[[MediaWiki_talk:Savearticle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Save page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Savearticle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Savedprefs&amp;action=edit savedprefs]&lt;br&gt;
-[[MediaWiki_talk:Savedprefs|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Your preferences have been saved.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Savedprefs</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Savefile&amp;action=edit savefile]&lt;br&gt;
-[[MediaWiki_talk:Savefile|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Save file
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Savefile</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Saveprefs&amp;action=edit saveprefs]&lt;br&gt;
-[[MediaWiki_talk:Saveprefs|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Save preferences
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Saveprefs</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Search&amp;action=edit search]&lt;br&gt;
-[[MediaWiki_talk:Search|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Search
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Search</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchdisabled&amp;action=edit searchdisabled]&lt;br&gt;
-[[MediaWiki_talk:Searchdisabled|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;p&amp;gt;Sorry! Full text search has been disabled temporarily, for performance reasons. In the meantime, you can use the Google search below, which may be out of date.&amp;lt;/p&amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchdisabled</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchhelppage&amp;action=edit searchhelppage]&lt;br&gt;
-[[MediaWiki_talk:Searchhelppage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:Searching
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchhelppage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchingwikipedia&amp;action=edit searchingwikipedia]&lt;br&gt;
-[[MediaWiki_talk:Searchingwikipedia|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Searching Wiktionary
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchingwikipedia</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchquery&amp;action=edit searchquery]&lt;br&gt;
-[[MediaWiki_talk:Searchquery|Talk]]
-&lt;/td&gt;&lt;td&gt;
-For query &amp;quot;$1&amp;quot;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchquery</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchresults&amp;action=edit searchresults]&lt;br&gt;
-[[MediaWiki_talk:Searchresults|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Search results
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchresults</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchresultshead&amp;action=edit searchresultshead]&lt;br&gt;
-[[MediaWiki_talk:Searchresultshead|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Search result settings
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchresultshead</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchresulttext&amp;action=edit searchresulttext]&lt;br&gt;
-[[MediaWiki_talk:Searchresulttext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-For more information about searching Wiktionary, see $1.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Searchresulttext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sectionedit&amp;action=edit sectionedit]&lt;br&gt;
-[[MediaWiki_talk:Sectionedit|Talk]]
-&lt;/td&gt;&lt;td&gt;
- (section)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sectionedit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selectnewerversionfordiff&amp;action=edit selectnewerversionfordiff]&lt;br&gt;
-[[MediaWiki_talk:Selectnewerversionfordiff|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Select a newer version for comparison
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Selectnewerversionfordiff</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selectolderversionfordiff&amp;action=edit selectolderversionfordiff]&lt;br&gt;
-[[MediaWiki_talk:Selectolderversionfordiff|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Select an older version for comparison
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Selectolderversionfordiff</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selectonly&amp;action=edit selectonly]&lt;br&gt;
-[[MediaWiki_talk:Selectonly|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Only read-only queries are allowed.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Selectonly</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selflinks&amp;action=edit selflinks]&lt;br&gt;
-[[MediaWiki_talk:Selflinks|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Pages with Self Links
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Selflinks</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selflinkstext&amp;action=edit selflinkstext]&lt;br&gt;
-[[MediaWiki_talk:Selflinkstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The following pages contain a link to themselves, which they should not.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Selflinkstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Seriousxhtmlerrors&amp;action=edit seriousxhtmlerrors]&lt;br&gt;
-[[MediaWiki_talk:Seriousxhtmlerrors|Talk]]
-&lt;/td&gt;&lt;td&gt;
-There were serious xhtml markup errors detected by tidy.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Seriousxhtmlerrors</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Servertime&amp;action=edit servertime]&lt;br&gt;
-[[MediaWiki_talk:Servertime|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Server time is now
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Servertime</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Set_rights_fail&amp;action=edit set_rights_fail]&lt;br&gt;
-[[MediaWiki_talk:Set_rights_fail|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;b&amp;gt;User rights for &amp;quot;$1&amp;quot; could not be set. (Did you enter the name correctly?)&amp;lt;/b&amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Set_rights_fail</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Set_user_rights&amp;action=edit set_user_rights]&lt;br&gt;
-[[MediaWiki_talk:Set_user_rights|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Set user rights
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Set_user_rights</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Setbureaucratflag&amp;action=edit setbureaucratflag]&lt;br&gt;
-[[MediaWiki_talk:Setbureaucratflag|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Set bureaucrat flag
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Setbureaucratflag</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Shortpages&amp;action=edit shortpages]&lt;br&gt;
-[[MediaWiki_talk:Shortpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Short pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Shortpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Show&amp;action=edit show]&lt;br&gt;
-[[MediaWiki_talk:Show|Talk]]
-&lt;/td&gt;&lt;td&gt;
-show
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Show</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showhideminor&amp;action=edit showhideminor]&lt;br&gt;
-[[MediaWiki_talk:Showhideminor|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1 minor edits &amp;#124; $2 bots &amp;#124; $3 logged in users
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Showhideminor</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showingresults&amp;action=edit showingresults]&lt;br&gt;
-[[MediaWiki_talk:Showingresults|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Showing below &amp;lt;b&amp;gt;$1&amp;lt;/b&amp;gt; results starting with #&amp;lt;b&amp;gt;$2&amp;lt;/b&amp;gt;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Showingresults</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showingresultsnum&amp;action=edit showingresultsnum]&lt;br&gt;
-[[MediaWiki_talk:Showingresultsnum|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Showing below &amp;lt;b&amp;gt;$3&amp;lt;/b&amp;gt; results starting with #&amp;lt;b&amp;gt;$2&amp;lt;/b&amp;gt;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Showingresultsnum</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showlast&amp;action=edit showlast]&lt;br&gt;
-[[MediaWiki_talk:Showlast|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Show last $1 images sorted $2.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Showlast</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showpreview&amp;action=edit showpreview]&lt;br&gt;
-[[MediaWiki_talk:Showpreview|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Show preview
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Showpreview</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showtoc&amp;action=edit showtoc]&lt;br&gt;
-[[MediaWiki_talk:Showtoc|Talk]]
-&lt;/td&gt;&lt;td&gt;
-show
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Showtoc</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sig_tip&amp;action=edit sig_tip]&lt;br&gt;
-[[MediaWiki_talk:Sig_tip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Your signature with timestamp
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sig_tip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitestats&amp;action=edit sitestats]&lt;br&gt;
-[[MediaWiki_talk:Sitestats|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Site statistics
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sitestats</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitestatstext&amp;action=edit sitestatstext]&lt;br&gt;
-[[MediaWiki_talk:Sitestatstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-There are &amp;#39;&amp;#39;&amp;#39;$1&amp;#39;&amp;#39;&amp;#39; total pages in the database.
-This includes &amp;quot;talk&amp;quot; pages, pages about Wiktionary, minimal &amp;quot;stub&amp;quot;
-pages, redirects, and others that probably don&amp;#39;t qualify as content pages.
-Excluding those, there are &amp;#39;&amp;#39;&amp;#39;$2&amp;#39;&amp;#39;&amp;#39; pages that are probably legitimate
-content pages.
-
-There have been a total of &amp;#39;&amp;#39;&amp;#39;$3&amp;#39;&amp;#39;&amp;#39; page views, and &amp;#39;&amp;#39;&amp;#39;$4&amp;#39;&amp;#39;&amp;#39; page edits
-since the wiki was setup.
-That comes to &amp;#39;&amp;#39;&amp;#39;$5&amp;#39;&amp;#39;&amp;#39; average edits per page, and &amp;#39;&amp;#39;&amp;#39;$6&amp;#39;&amp;#39;&amp;#39; views per edit.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sitestatstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitesubtitle&amp;action=edit sitesubtitle]&lt;br&gt;
-[[MediaWiki_talk:Sitesubtitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The Free Encyclopedia
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sitesubtitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitesupport&amp;action=edit sitesupport]&lt;br&gt;
-[[MediaWiki_talk:Sitesupport|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Donations
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sitesupport</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitetitle&amp;action=edit sitetitle]&lt;br&gt;
-[[MediaWiki_talk:Sitetitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sitetitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Siteuser&amp;action=edit siteuser]&lt;br&gt;
-[[MediaWiki_talk:Siteuser|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary user $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Siteuser</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Siteusers&amp;action=edit siteusers]&lt;br&gt;
-[[MediaWiki_talk:Siteusers|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary user(s) $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Siteusers</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Skin&amp;action=edit skin]&lt;br&gt;
-[[MediaWiki_talk:Skin|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Skin
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Skin</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Spamprotectiontext&amp;action=edit spamprotectiontext]&lt;br&gt;
-[[MediaWiki_talk:Spamprotectiontext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The page you wanted to save was blocked by the spam filter. This is probably caused by a link to an external site.
-
-You might want to check the following regular expression for patterns that are currently blocked:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Spamprotectiontext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Spamprotectiontitle&amp;action=edit spamprotectiontitle]&lt;br&gt;
-[[MediaWiki_talk:Spamprotectiontitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Spam protection filter
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Spamprotectiontitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Specialpage&amp;action=edit specialpage]&lt;br&gt;
-[[MediaWiki_talk:Specialpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Special Page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Specialpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Specialpages&amp;action=edit specialpages]&lt;br&gt;
-[[MediaWiki_talk:Specialpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Special pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Specialpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Spheading&amp;action=edit spheading]&lt;br&gt;
-[[MediaWiki_talk:Spheading|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Special pages for all users
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Spheading</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sqlislogged&amp;action=edit sqlislogged]&lt;br&gt;
-[[MediaWiki_talk:Sqlislogged|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Please note that all queries are logged.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sqlislogged</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sqlquery&amp;action=edit sqlquery]&lt;br&gt;
-[[MediaWiki_talk:Sqlquery|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Enter query
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sqlquery</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Statistics&amp;action=edit statistics]&lt;br&gt;
-[[MediaWiki_talk:Statistics|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Statistics
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Statistics</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Storedversion&amp;action=edit storedversion]&lt;br&gt;
-[[MediaWiki_talk:Storedversion|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Stored version
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Storedversion</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Stubthreshold&amp;action=edit stubthreshold]&lt;br&gt;
-[[MediaWiki_talk:Stubthreshold|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Threshold for stub display
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Stubthreshold</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Subcategories&amp;action=edit subcategories]&lt;br&gt;
-[[MediaWiki_talk:Subcategories|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Subcategories
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Subcategories</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Subject&amp;action=edit subject]&lt;br&gt;
-[[MediaWiki_talk:Subject|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Subject/headline
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Subject</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Subjectpage&amp;action=edit subjectpage]&lt;br&gt;
-[[MediaWiki_talk:Subjectpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View subject
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Subjectpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Successfulupload&amp;action=edit successfulupload]&lt;br&gt;
-[[MediaWiki_talk:Successfulupload|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Successful upload
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Successfulupload</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Summary&amp;action=edit summary]&lt;br&gt;
-[[MediaWiki_talk:Summary|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Summary
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Summary</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sysopspheading&amp;action=edit sysopspheading]&lt;br&gt;
-[[MediaWiki_talk:Sysopspheading|Talk]]
-&lt;/td&gt;&lt;td&gt;
-For sysop use only
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sysopspheading</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sysoptext&amp;action=edit sysoptext]&lt;br&gt;
-[[MediaWiki_talk:Sysoptext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The action you have requested can only be
-performed by users with &amp;quot;sysop&amp;quot; status.
-See $1.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sysoptext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sysoptitle&amp;action=edit sysoptitle]&lt;br&gt;
-[[MediaWiki_talk:Sysoptitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Sysop access required
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Sysoptitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tableform&amp;action=edit tableform]&lt;br&gt;
-[[MediaWiki_talk:Tableform|Talk]]
-&lt;/td&gt;&lt;td&gt;
-table
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tableform</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talk&amp;action=edit talk]&lt;br&gt;
-[[MediaWiki_talk:Talk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Discussion
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Talk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkexists&amp;action=edit talkexists]&lt;br&gt;
-[[MediaWiki_talk:Talkexists|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The page itself was moved successfully, but the
-talk page could not be moved because one already exists at the new
-title. Please merge them manually.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Talkexists</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpage&amp;action=edit talkpage]&lt;br&gt;
-[[MediaWiki_talk:Talkpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Discuss this page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Talkpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpagemoved&amp;action=edit talkpagemoved]&lt;br&gt;
-[[MediaWiki_talk:Talkpagemoved|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The corresponding talk page was also moved.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Talkpagemoved</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpagenotmoved&amp;action=edit talkpagenotmoved]&lt;br&gt;
-[[MediaWiki_talk:Talkpagenotmoved|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The corresponding talk page was &amp;lt;strong&amp;gt;not&amp;lt;/strong&amp;gt; moved.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Talkpagenotmoved</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpagetext&amp;action=edit talkpagetext]&lt;br&gt;
-[[MediaWiki_talk:Talkpagetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;!-- MediaWiki:talkpagetext --&amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Talkpagetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Textboxsize&amp;action=edit textboxsize]&lt;br&gt;
-[[MediaWiki_talk:Textboxsize|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Textbox dimensions
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Textboxsize</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Textmatches&amp;action=edit textmatches]&lt;br&gt;
-[[MediaWiki_talk:Textmatches|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Page text matches
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Textmatches</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Thisisdeleted&amp;action=edit thisisdeleted]&lt;br&gt;
-[[MediaWiki_talk:Thisisdeleted|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View or restore $1?
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Thisisdeleted</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Thumbnail-more&amp;action=edit thumbnail-more]&lt;br&gt;
-[[MediaWiki_talk:Thumbnail-more|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Enlarge
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Thumbnail-more</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Timezonelegend&amp;action=edit timezonelegend]&lt;br&gt;
-[[MediaWiki_talk:Timezonelegend|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Time zone
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Timezonelegend</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Timezoneoffset&amp;action=edit timezoneoffset]&lt;br&gt;
-[[MediaWiki_talk:Timezoneoffset|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Offset
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Timezoneoffset</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Timezonetext&amp;action=edit timezonetext]&lt;br&gt;
-[[MediaWiki_talk:Timezonetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Enter number of hours your local time differs
-from server time (UTC).
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Timezonetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Titlematches&amp;action=edit titlematches]&lt;br&gt;
-[[MediaWiki_talk:Titlematches|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Article title matches
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Titlematches</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Toc&amp;action=edit toc]&lt;br&gt;
-[[MediaWiki_talk:Toc|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Table of contents
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Toc</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Toolbox&amp;action=edit toolbox]&lt;br&gt;
-[[MediaWiki_talk:Toolbox|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Toolbox
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Toolbox</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-addsection&amp;action=edit tooltip-addsection]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-addsection|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Add a comment to this page. &amp;#91;alt-+]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-addsection</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-anontalk&amp;action=edit tooltip-anontalk]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-anontalk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Discussion about edits from this ip address &amp;#91;alt-n]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-anontalk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-anonuserpage&amp;action=edit tooltip-anonuserpage]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-anonuserpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The user page for the ip you&amp;#39;re editing as &amp;#91;alt-.]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-anonuserpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-article&amp;action=edit tooltip-article]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-article|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View the content page &amp;#91;alt-a]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-article</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-atom&amp;action=edit tooltip-atom]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-atom|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Atom feed for this page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-atom</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-compareselectedversions&amp;action=edit tooltip-compareselectedversions]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-compareselectedversions|Talk]]
-&lt;/td&gt;&lt;td&gt;
-See the differences between the two selected versions of this page. &amp;#91;alt-v]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-compareselectedversions</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-contributions&amp;action=edit tooltip-contributions]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-contributions|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View the list of contributions of this user
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-contributions</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-currentevents&amp;action=edit tooltip-currentevents]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-currentevents|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Find background information on current events
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-currentevents</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-delete&amp;action=edit tooltip-delete]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-delete|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Delete this page &amp;#91;alt-d]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-delete</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-edit&amp;action=edit tooltip-edit]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-edit|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You can edit this page. Please use the preview button before saving. &amp;#91;alt-e]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-edit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-emailuser&amp;action=edit tooltip-emailuser]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-emailuser|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Send a mail to this user
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-emailuser</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-help&amp;action=edit tooltip-help]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-help|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The place to find out.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-help</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-history&amp;action=edit tooltip-history]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-history|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Past versions of this page, &amp;#91;alt-h]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-history</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-login&amp;action=edit tooltip-login]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-login|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You are encouraged to log in, it is not mandatory however. &amp;#91;alt-o]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-login</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-logout&amp;action=edit tooltip-logout]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-logout|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Log out &amp;#91;alt-o]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-logout</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-mainpage&amp;action=edit tooltip-mainpage]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-mainpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Visit the Main Page &amp;#91;alt-z]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-mainpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-minoredit&amp;action=edit tooltip-minoredit]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-minoredit|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Mark this as a minor edit &amp;#91;alt-i]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-minoredit</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-move&amp;action=edit tooltip-move]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-move|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Move this page &amp;#91;alt-m]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-move</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-mycontris&amp;action=edit tooltip-mycontris]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-mycontris|Talk]]
-&lt;/td&gt;&lt;td&gt;
-List of my contributions &amp;#91;alt-y]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-mycontris</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-mytalk&amp;action=edit tooltip-mytalk]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-mytalk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-My talk page &amp;#91;alt-n]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-mytalk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-nomove&amp;action=edit tooltip-nomove]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-nomove|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You don&amp;#39;t have the permissions to move this page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-nomove</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-portal&amp;action=edit tooltip-portal]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-portal|Talk]]
-&lt;/td&gt;&lt;td&gt;
-About the project, what you can do, where to find things
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-portal</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-preferences&amp;action=edit tooltip-preferences]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-preferences|Talk]]
-&lt;/td&gt;&lt;td&gt;
-My preferences
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-preferences</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-preview&amp;action=edit tooltip-preview]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-preview|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Preview your changes, please use this before saving! &amp;#91;alt-p]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-preview</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-protect&amp;action=edit tooltip-protect]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-protect|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Protect this page &amp;#91;alt-=]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-protect</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-randompage&amp;action=edit tooltip-randompage]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-randompage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Load a random page &amp;#91;alt-x]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-randompage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-recentchanges&amp;action=edit tooltip-recentchanges]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-recentchanges|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The list of recent changes in the wiki. &amp;#91;alt-r]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-recentchanges</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-recentchangeslinked&amp;action=edit tooltip-recentchangeslinked]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-recentchangeslinked|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Recent changes in pages linking to this page &amp;#91;alt-c]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-recentchangeslinked</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-rss&amp;action=edit tooltip-rss]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-rss|Talk]]
-&lt;/td&gt;&lt;td&gt;
-RSS feed for this page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-rss</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-save&amp;action=edit tooltip-save]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-save|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Save your changes &amp;#91;alt-s]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-save</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-search&amp;action=edit tooltip-search]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-search|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Search this wiki &amp;#91;alt-f]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-search</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-sitesupport&amp;action=edit tooltip-sitesupport]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-sitesupport|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Support Wiktionary
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-sitesupport</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-specialpage&amp;action=edit tooltip-specialpage]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-specialpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This is a special page, you can&amp;#39;t edit the page itself.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-specialpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-specialpages&amp;action=edit tooltip-specialpages]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-specialpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-List of all special pages &amp;#91;alt-q]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-specialpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-talk&amp;action=edit tooltip-talk]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-talk|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Discussion about the content page &amp;#91;alt-t]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-talk</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-undelete&amp;action=edit tooltip-undelete]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-undelete|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Restore the $1 edits done to this page before it was deleted &amp;#91;alt-d]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-undelete</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-unwatch&amp;action=edit tooltip-unwatch]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-unwatch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Remove this page from your watchlist &amp;#91;alt-w]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-unwatch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-upload&amp;action=edit tooltip-upload]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-upload|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Upload images or media files &amp;#91;alt-u]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-upload</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-userpage&amp;action=edit tooltip-userpage]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-userpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-My user page &amp;#91;alt-.]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-userpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-viewsource&amp;action=edit tooltip-viewsource]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-viewsource|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This page is protected. You can view its source. &amp;#91;alt-e]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-viewsource</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-watch&amp;action=edit tooltip-watch]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-watch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Add this page to your watchlist &amp;#91;alt-w]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-watch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-watchlist&amp;action=edit tooltip-watchlist]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-watchlist|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The list of pages you&amp;#39;re monitoring for changes. &amp;#91;alt-l]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-watchlist</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-whatlinkshere&amp;action=edit tooltip-whatlinkshere]&lt;br&gt;
-[[MediaWiki_talk:Tooltip-whatlinkshere|Talk]]
-&lt;/td&gt;&lt;td&gt;
-List of all wiki pages that link here &amp;#91;alt-b]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Tooltip-whatlinkshere</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uclinks&amp;action=edit uclinks]&lt;br&gt;
-[[MediaWiki_talk:Uclinks|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View the last $1 changes; view the last $2 days.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uclinks</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ucnote&amp;action=edit ucnote]&lt;br&gt;
-[[MediaWiki_talk:Ucnote|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Below are this user&amp;#39;s last &amp;lt;b&amp;gt;$1&amp;lt;/b&amp;gt; changes in the last &amp;lt;b&amp;gt;$2&amp;lt;/b&amp;gt; days.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Ucnote</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uctop&amp;action=edit uctop]&lt;br&gt;
-[[MediaWiki_talk:Uctop|Talk]]
-&lt;/td&gt;&lt;td&gt;
- (top)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uctop</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblockip&amp;action=edit unblockip]&lt;br&gt;
-[[MediaWiki_talk:Unblockip|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Unblock user
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unblockip</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblockiptext&amp;action=edit unblockiptext]&lt;br&gt;
-[[MediaWiki_talk:Unblockiptext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Use the form below to restore write access
-to a previously blocked IP address or username.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unblockiptext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblocklink&amp;action=edit unblocklink]&lt;br&gt;
-[[MediaWiki_talk:Unblocklink|Talk]]
-&lt;/td&gt;&lt;td&gt;
-unblock
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unblocklink</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblocklogentry&amp;action=edit unblocklogentry]&lt;br&gt;
-[[MediaWiki_talk:Unblocklogentry|Talk]]
-&lt;/td&gt;&lt;td&gt;
-unblocked &amp;quot;$1&amp;quot;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unblocklogentry</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undelete&amp;action=edit undelete]&lt;br&gt;
-[[MediaWiki_talk:Undelete|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Restore deleted page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undelete</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undelete_short&amp;action=edit undelete_short]&lt;br&gt;
-[[MediaWiki_talk:Undelete_short|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Undelete $1 edits
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undelete_short</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletearticle&amp;action=edit undeletearticle]&lt;br&gt;
-[[MediaWiki_talk:Undeletearticle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Restore deleted page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletearticle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletebtn&amp;action=edit undeletebtn]&lt;br&gt;
-[[MediaWiki_talk:Undeletebtn|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Restore!
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletebtn</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletedarticle&amp;action=edit undeletedarticle]&lt;br&gt;
-[[MediaWiki_talk:Undeletedarticle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-restored &amp;quot;$1&amp;quot;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletedarticle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletedtext&amp;action=edit undeletedtext]&lt;br&gt;
-[[MediaWiki_talk:Undeletedtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;#91;&amp;#91;$1]] has been successfully restored.
-See &amp;#91;&amp;#91;Wiktionary:Deletion_log]] for a record of recent deletions and restorations.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletedtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletehistory&amp;action=edit undeletehistory]&lt;br&gt;
-[[MediaWiki_talk:Undeletehistory|Talk]]
-&lt;/td&gt;&lt;td&gt;
-If you restore the page, all revisions will be restored to the history.
-If a new page with the same name has been created since the deletion, the restored
-revisions will appear in the prior history, and the current revision of the live page
-will not be automatically replaced.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletehistory</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletepage&amp;action=edit undeletepage]&lt;br&gt;
-[[MediaWiki_talk:Undeletepage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View and restore deleted pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletepage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletepagetext&amp;action=edit undeletepagetext]&lt;br&gt;
-[[MediaWiki_talk:Undeletepagetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The following pages have been deleted but are still in the archive and
-can be restored. The archive may be periodically cleaned out.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeletepagetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeleterevision&amp;action=edit undeleterevision]&lt;br&gt;
-[[MediaWiki_talk:Undeleterevision|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Deleted revision as of $1
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeleterevision</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeleterevisions&amp;action=edit undeleterevisions]&lt;br&gt;
-[[MediaWiki_talk:Undeleterevisions|Talk]]
-&lt;/td&gt;&lt;td&gt;
-$1 revisions archived
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Undeleterevisions</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unexpected&amp;action=edit unexpected]&lt;br&gt;
-[[MediaWiki_talk:Unexpected|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Unexpected value: &amp;quot;$1&amp;quot;=&amp;quot;$2&amp;quot;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unexpected</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockbtn&amp;action=edit unlockbtn]&lt;br&gt;
-[[MediaWiki_talk:Unlockbtn|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Unlock database
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unlockbtn</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockconfirm&amp;action=edit unlockconfirm]&lt;br&gt;
-[[MediaWiki_talk:Unlockconfirm|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Yes, I really want to unlock the database.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unlockconfirm</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdb&amp;action=edit unlockdb]&lt;br&gt;
-[[MediaWiki_talk:Unlockdb|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Unlock database
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unlockdb</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdbsuccesssub&amp;action=edit unlockdbsuccesssub]&lt;br&gt;
-[[MediaWiki_talk:Unlockdbsuccesssub|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Database lock removed
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unlockdbsuccesssub</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdbsuccesstext&amp;action=edit unlockdbsuccesstext]&lt;br&gt;
-[[MediaWiki_talk:Unlockdbsuccesstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The database has been unlocked.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unlockdbsuccesstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdbtext&amp;action=edit unlockdbtext]&lt;br&gt;
-[[MediaWiki_talk:Unlockdbtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Unlocking the database will restore the ability of all
-users to edit pages, change their preferences, edit their watchlists, and
-other things requiring changes in the database.
-Please confirm that this is what you intend to do.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unlockdbtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotect&amp;action=edit unprotect]&lt;br&gt;
-[[MediaWiki_talk:Unprotect|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Unprotect
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unprotect</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectcomment&amp;action=edit unprotectcomment]&lt;br&gt;
-[[MediaWiki_talk:Unprotectcomment|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Reason for unprotecting
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unprotectcomment</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectedarticle&amp;action=edit unprotectedarticle]&lt;br&gt;
-[[MediaWiki_talk:Unprotectedarticle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-unprotected &amp;#91;&amp;#91;$1]]
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unprotectedarticle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectsub&amp;action=edit unprotectsub]&lt;br&gt;
-[[MediaWiki_talk:Unprotectsub|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(Unprotecting &amp;quot;$1&amp;quot;)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unprotectsub</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectthispage&amp;action=edit unprotectthispage]&lt;br&gt;
-[[MediaWiki_talk:Unprotectthispage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Unprotect this page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unprotectthispage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unusedimages&amp;action=edit unusedimages]&lt;br&gt;
-[[MediaWiki_talk:Unusedimages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Unused images
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unusedimages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unusedimagestext&amp;action=edit unusedimagestext]&lt;br&gt;
-[[MediaWiki_talk:Unusedimagestext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;p&amp;gt;Please note that other web sites may link to an image with
-a direct URL, and so may still be listed here despite being
-in active use.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unusedimagestext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unwatch&amp;action=edit unwatch]&lt;br&gt;
-[[MediaWiki_talk:Unwatch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Unwatch
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unwatch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unwatchthispage&amp;action=edit unwatchthispage]&lt;br&gt;
-[[MediaWiki_talk:Unwatchthispage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Stop watching
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Unwatchthispage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Updated&amp;action=edit updated]&lt;br&gt;
-[[MediaWiki_talk:Updated|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(Updated)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Updated</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Upload&amp;action=edit upload]&lt;br&gt;
-[[MediaWiki_talk:Upload|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Upload file
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Upload</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadbtn&amp;action=edit uploadbtn]&lt;br&gt;
-[[MediaWiki_talk:Uploadbtn|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Upload file
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadbtn</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploaddisabled&amp;action=edit uploaddisabled]&lt;br&gt;
-[[MediaWiki_talk:Uploaddisabled|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Sorry, uploading is disabled.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploaddisabled</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadedfiles&amp;action=edit uploadedfiles]&lt;br&gt;
-[[MediaWiki_talk:Uploadedfiles|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Uploaded files
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadedfiles</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadedimage&amp;action=edit uploadedimage]&lt;br&gt;
-[[MediaWiki_talk:Uploadedimage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-uploaded &amp;quot;$1&amp;quot;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadedimage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploaderror&amp;action=edit uploaderror]&lt;br&gt;
-[[MediaWiki_talk:Uploaderror|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Upload error
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploaderror</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadfile&amp;action=edit uploadfile]&lt;br&gt;
-[[MediaWiki_talk:Uploadfile|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Upload images, sounds, documents etc.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadfile</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlink&amp;action=edit uploadlink]&lt;br&gt;
-[[MediaWiki_talk:Uploadlink|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Upload images
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadlink</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlog&amp;action=edit uploadlog]&lt;br&gt;
-[[MediaWiki_talk:Uploadlog|Talk]]
-&lt;/td&gt;&lt;td&gt;
-upload log
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadlog</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlogpage&amp;action=edit uploadlogpage]&lt;br&gt;
-[[MediaWiki_talk:Uploadlogpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Upload_log
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadlogpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlogpagetext&amp;action=edit uploadlogpagetext]&lt;br&gt;
-[[MediaWiki_talk:Uploadlogpagetext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Below is a list of the most recent file uploads.
-All times shown are server time (UTC).
-&amp;lt;ul&amp;gt;
-&amp;lt;/ul&amp;gt;
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadlogpagetext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadnologin&amp;action=edit uploadnologin]&lt;br&gt;
-[[MediaWiki_talk:Uploadnologin|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Not logged in
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadnologin</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadnologintext&amp;action=edit uploadnologintext]&lt;br&gt;
-[[MediaWiki_talk:Uploadnologintext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You must be &amp;lt;a href=&amp;quot;/wiki/Special:Userlogin&amp;quot;&amp;gt;logged in&amp;lt;/a&amp;gt;
-to upload files.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadnologintext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadtext&amp;action=edit uploadtext]&lt;br&gt;
-[[MediaWiki_talk:Uploadtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;strong&amp;gt;STOP!&amp;lt;/strong&amp;gt; Before you upload here,
-make sure to read and follow the &amp;lt;a href=&amp;quot;/wiki/Special:Image_use_policy&amp;quot;&amp;gt;image use policy&amp;lt;/a&amp;gt;.
-&amp;lt;p&amp;gt;If a file with the name you are specifying already
-exists on the wiki, it&amp;#39;ll be replaced without warning.
-So unless you mean to update a file, it&amp;#39;s a good idea
-to first check if such a file exists.
-&amp;lt;p&amp;gt;To view or search previously uploaded images,
-go to the &amp;lt;a href=&amp;quot;/wiki/Special:Imagelist&amp;quot;&amp;gt;list of uploaded images&amp;lt;/a&amp;gt;.
-Uploads and deletions are logged on the &amp;lt;a href=&amp;quot;/wiki/Wiktionary:Upload_log&amp;quot;&amp;gt;upload log&amp;lt;/a&amp;gt;.
-&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Use the form below to upload new image files for use in
-illustrating your pages.
-On most browsers, you will see a &amp;quot;Browse...&amp;quot; button, which will
-bring up your operating system&amp;#39;s standard file open dialog.
-Choosing a file will fill the name of that file into the text
-field next to the button.
-You must also check the box affirming that you are not
-violating any copyrights by uploading the file.
-Press the &amp;quot;Upload&amp;quot; button to finish the upload.
-This may take some time if you have a slow internet connection.
-&amp;lt;p&amp;gt;The preferred formats are JPEG for photographic images, PNG
-for drawings and other iconic images, and OGG for sounds.
-Please name your files descriptively to avoid confusion.
-To include the image in a page, use a link in the form
-&amp;lt;b&amp;gt;&amp;#91;&amp;#91;Image:file.jpg]]&amp;lt;/b&amp;gt; or &amp;lt;b&amp;gt;&amp;#91;&amp;#91;Image:file.png&amp;#124;alt text]]&amp;lt;/b&amp;gt;
-or &amp;lt;b&amp;gt;&amp;#91;&amp;#91;Media:file.ogg]]&amp;lt;/b&amp;gt; for sounds.
-&amp;lt;p&amp;gt;Please note that as with wiki pages, others may edit or
-delete your uploads if they think it serves the project, and
-you may be blocked from uploading if you abuse the system.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadwarning&amp;action=edit uploadwarning]&lt;br&gt;
-[[MediaWiki_talk:Uploadwarning|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Upload warning
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Uploadwarning</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:User_rights_set&amp;action=edit user_rights_set]&lt;br&gt;
-[[MediaWiki_talk:User_rights_set|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;b&amp;gt;User rights for &amp;quot;$1&amp;quot; updated&amp;lt;/b&amp;gt;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:User_rights_set</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usercssjs&amp;action=edit usercssjs]&lt;br&gt;
-[[MediaWiki_talk:Usercssjs|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;#39;&amp;#39;&amp;#39;Note:&amp;#39;&amp;#39;&amp;#39; After saving, you have to tell your bowser to get the new version: &amp;#39;&amp;#39;&amp;#39;Mozilla:&amp;#39;&amp;#39;&amp;#39; click &amp;#39;&amp;#39;reload&amp;#39;&amp;#39;(or &amp;#39;&amp;#39;ctrl-r&amp;#39;&amp;#39;), &amp;#39;&amp;#39;&amp;#39;IE / Opera:&amp;#39;&amp;#39;&amp;#39; &amp;#39;&amp;#39;ctrl-f5&amp;#39;&amp;#39;, &amp;#39;&amp;#39;&amp;#39;Safari:&amp;#39;&amp;#39;&amp;#39; &amp;#39;&amp;#39;cmd-r&amp;#39;&amp;#39;, &amp;#39;&amp;#39;&amp;#39;Konqueror&amp;#39;&amp;#39;&amp;#39; &amp;#39;&amp;#39;ctrl-r&amp;#39;&amp;#39;.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Usercssjs</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usercssjsyoucanpreview&amp;action=edit usercssjsyoucanpreview]&lt;br&gt;
-[[MediaWiki_talk:Usercssjsyoucanpreview|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;strong&amp;gt;Tip:&amp;lt;/strong&amp;gt; Use the &amp;#39;Show preview&amp;#39; button to test your new css/js before saving.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Usercssjsyoucanpreview</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usercsspreview&amp;action=edit usercsspreview]&lt;br&gt;
-[[MediaWiki_talk:Usercsspreview|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;#39;&amp;#39;&amp;#39;Remember that you are only previewing your user css, it has not yet been saved!&amp;#39;&amp;#39;&amp;#39;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Usercsspreview</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userexists&amp;action=edit userexists]&lt;br&gt;
-[[MediaWiki_talk:Userexists|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The user name you entered is already in use. Please choose a different name.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userexists</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userjspreview&amp;action=edit userjspreview]&lt;br&gt;
-[[MediaWiki_talk:Userjspreview|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;#39;&amp;#39;&amp;#39;Remember that you are only testing/previewing your user javascript, it has not yet been saved!&amp;#39;&amp;#39;&amp;#39;
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userjspreview</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userlogin&amp;action=edit userlogin]&lt;br&gt;
-[[MediaWiki_talk:Userlogin|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Log in
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userlogin</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userlogout&amp;action=edit userlogout]&lt;br&gt;
-[[MediaWiki_talk:Userlogout|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Log out
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userlogout</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usermailererror&amp;action=edit usermailererror]&lt;br&gt;
-[[MediaWiki_talk:Usermailererror|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Mail object returned error:
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Usermailererror</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userpage&amp;action=edit userpage]&lt;br&gt;
-[[MediaWiki_talk:Userpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View user page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userstats&amp;action=edit userstats]&lt;br&gt;
-[[MediaWiki_talk:Userstats|Talk]]
-&lt;/td&gt;&lt;td&gt;
-User statistics
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userstats</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userstatstext&amp;action=edit userstatstext]&lt;br&gt;
-[[MediaWiki_talk:Userstatstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-There are &amp;#39;&amp;#39;&amp;#39;$1&amp;#39;&amp;#39;&amp;#39; registered users.
-&amp;#39;&amp;#39;&amp;#39;$2&amp;#39;&amp;#39;&amp;#39; of these are administrators (see $3).
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Userstatstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Version&amp;action=edit version]&lt;br&gt;
-[[MediaWiki_talk:Version|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Version
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Version</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewcount&amp;action=edit viewcount]&lt;br&gt;
-[[MediaWiki_talk:Viewcount|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This page has been accessed $1 times.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Viewcount</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewprevnext&amp;action=edit viewprevnext]&lt;br&gt;
-[[MediaWiki_talk:Viewprevnext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View ($1) ($2) ($3).
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Viewprevnext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewsource&amp;action=edit viewsource]&lt;br&gt;
-[[MediaWiki_talk:Viewsource|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View source
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Viewsource</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewtalkpage&amp;action=edit viewtalkpage]&lt;br&gt;
-[[MediaWiki_talk:Viewtalkpage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View discussion
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Viewtalkpage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wantedpages&amp;action=edit wantedpages]&lt;br&gt;
-[[MediaWiki_talk:Wantedpages|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wanted pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wantedpages</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watch&amp;action=edit watch]&lt;br&gt;
-[[MediaWiki_talk:Watch|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Watch
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watch</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchdetails&amp;action=edit watchdetails]&lt;br&gt;
-[[MediaWiki_talk:Watchdetails|Talk]]
-&lt;/td&gt;&lt;td&gt;
-($1 pages watched not counting talk pages;
-$2 total pages edited since cutoff;
-$3...
-&amp;lt;a href=&amp;#39;$4&amp;#39;&amp;gt;show and edit complete list&amp;lt;/a&amp;gt;.)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchdetails</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watcheditlist&amp;action=edit watcheditlist]&lt;br&gt;
-[[MediaWiki_talk:Watcheditlist|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Here&amp;#39;s an alphabetical list of your
-watched pages. Check the boxes of pages you want to remove
-from your watchlist and click the &amp;#39;remove checked&amp;#39; button
-at the bottom of the screen.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watcheditlist</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchlist&amp;action=edit watchlist]&lt;br&gt;
-[[MediaWiki_talk:Watchlist|Talk]]
-&lt;/td&gt;&lt;td&gt;
-My watchlist
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchlist</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchlistcontains&amp;action=edit watchlistcontains]&lt;br&gt;
-[[MediaWiki_talk:Watchlistcontains|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Your watchlist contains $1 pages.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchlistcontains</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchlistsub&amp;action=edit watchlistsub]&lt;br&gt;
-[[MediaWiki_talk:Watchlistsub|Talk]]
-&lt;/td&gt;&lt;td&gt;
-(for user &amp;quot;$1&amp;quot;)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchlistsub</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchmethod-list&amp;action=edit watchmethod-list]&lt;br&gt;
-[[MediaWiki_talk:Watchmethod-list|Talk]]
-&lt;/td&gt;&lt;td&gt;
-checking watched pages for recent edits
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchmethod-list</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchmethod-recent&amp;action=edit watchmethod-recent]&lt;br&gt;
-[[MediaWiki_talk:Watchmethod-recent|Talk]]
-&lt;/td&gt;&lt;td&gt;
-checking recent edits for watched pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchmethod-recent</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchnochange&amp;action=edit watchnochange]&lt;br&gt;
-[[MediaWiki_talk:Watchnochange|Talk]]
-&lt;/td&gt;&lt;td&gt;
-None of your watched items were edited in the time period displayed.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchnochange</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchnologin&amp;action=edit watchnologin]&lt;br&gt;
-[[MediaWiki_talk:Watchnologin|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Not logged in
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchnologin</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchnologintext&amp;action=edit watchnologintext]&lt;br&gt;
-[[MediaWiki_talk:Watchnologintext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You must be &amp;lt;a href=&amp;quot;/wiki/Special:Userlogin&amp;quot;&amp;gt;logged in&amp;lt;/a&amp;gt;
-to modify your watchlist.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchnologintext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchthis&amp;action=edit watchthis]&lt;br&gt;
-[[MediaWiki_talk:Watchthis|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Watch this page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchthis</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchthispage&amp;action=edit watchthispage]&lt;br&gt;
-[[MediaWiki_talk:Watchthispage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Watch this page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Watchthispage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Welcomecreation&amp;action=edit welcomecreation]&lt;br&gt;
-[[MediaWiki_talk:Welcomecreation|Talk]]
-&lt;/td&gt;&lt;td&gt;
-&amp;lt;h2&amp;gt;Welcome, $1!&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;Your account has been created.
-Don&amp;#39;t forget to change your Wiktionary preferences.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Welcomecreation</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whatlinkshere&amp;action=edit whatlinkshere]&lt;br&gt;
-[[MediaWiki_talk:Whatlinkshere|Talk]]
-&lt;/td&gt;&lt;td&gt;
-What links here
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whatlinkshere</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistacctext&amp;action=edit whitelistacctext]&lt;br&gt;
-[[MediaWiki_talk:Whitelistacctext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-To be allowed to create accounts in this Wiki you have to &amp;#91;&amp;#91;Special:Userlogin&amp;#124;log]] in and have the appropriate permissions.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whitelistacctext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistacctitle&amp;action=edit whitelistacctitle]&lt;br&gt;
-[[MediaWiki_talk:Whitelistacctitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You are not allowed to create an account
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whitelistacctitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistedittext&amp;action=edit whitelistedittext]&lt;br&gt;
-[[MediaWiki_talk:Whitelistedittext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You have to &amp;#91;&amp;#91;Special:Userlogin&amp;#124;login]] to edit pages.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whitelistedittext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistedittitle&amp;action=edit whitelistedittitle]&lt;br&gt;
-[[MediaWiki_talk:Whitelistedittitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Login required to edit
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whitelistedittitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistreadtext&amp;action=edit whitelistreadtext]&lt;br&gt;
-[[MediaWiki_talk:Whitelistreadtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-You have to &amp;#91;&amp;#91;Special:Userlogin&amp;#124;login]] to read pages.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whitelistreadtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistreadtitle&amp;action=edit whitelistreadtitle]&lt;br&gt;
-[[MediaWiki_talk:Whitelistreadtitle|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Login required to read
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Whitelistreadtitle</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wikipediapage&amp;action=edit wikipediapage]&lt;br&gt;
-[[MediaWiki_talk:Wikipediapage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-View project page
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wikipediapage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wikititlesuffix&amp;action=edit wikititlesuffix]&lt;br&gt;
-[[MediaWiki_talk:Wikititlesuffix|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wikititlesuffix</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wlnote&amp;action=edit wlnote]&lt;br&gt;
-[[MediaWiki_talk:Wlnote|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Below are the last $1 changes in the last &amp;lt;b&amp;gt;$2&amp;lt;/b&amp;gt; hours.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wlnote</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wlsaved&amp;action=edit wlsaved]&lt;br&gt;
-[[MediaWiki_talk:Wlsaved|Talk]]
-&lt;/td&gt;&lt;td&gt;
-This is a saved version of your watchlist.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wlsaved</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wlshowlast&amp;action=edit wlshowlast]&lt;br&gt;
-[[MediaWiki_talk:Wlshowlast|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Show last $1 hours $2 days $3
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wlshowlast</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wrong_wfQuery_params&amp;action=edit wrong_wfQuery_params]&lt;br&gt;
-[[MediaWiki_talk:Wrong_wfQuery_params|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Incorrect parameters to wfQuery()&amp;lt;br /&amp;gt;
-Function: $1&amp;lt;br /&amp;gt;
-Query: $2
-
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wrong_wfQuery_params</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wrongpassword&amp;action=edit wrongpassword]&lt;br&gt;
-[[MediaWiki_talk:Wrongpassword|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The password you entered is incorrect. Please try again.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Wrongpassword</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourdiff&amp;action=edit yourdiff]&lt;br&gt;
-[[MediaWiki_talk:Yourdiff|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Differences
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yourdiff</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Youremail&amp;action=edit youremail]&lt;br&gt;
-[[MediaWiki_talk:Youremail|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Your email*
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Youremail</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourname&amp;action=edit yourname]&lt;br&gt;
-[[MediaWiki_talk:Yourname|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Your user name
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yourname</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yournick&amp;action=edit yournick]&lt;br&gt;
-[[MediaWiki_talk:Yournick|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Your nickname (for signatures)
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yournick</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourpassword&amp;action=edit yourpassword]&lt;br&gt;
-[[MediaWiki_talk:Yourpassword|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Your password
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yourpassword</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourpasswordagain&amp;action=edit yourpasswordagain]&lt;br&gt;
-[[MediaWiki_talk:Yourpasswordagain|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Retype password
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yourpasswordagain</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourrealname&amp;action=edit yourrealname]&lt;br&gt;
-[[MediaWiki_talk:Yourrealname|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Your real name*
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yourrealname</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourtext&amp;action=edit yourtext]&lt;br&gt;
-[[MediaWiki_talk:Yourtext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Your text
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Yourtext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
-
-</root> \ No newline at end of file
diff --git a/tests/parser/preprocess/All_system_messages.txt b/tests/parser/preprocess/All_system_messages.txt
deleted file mode 100644
index fc10d7cf..00000000
--- a/tests/parser/preprocess/All_system_messages.txt
+++ /dev/null
@@ -1,5645 +0,0 @@
-{{int:allmessagestext}}
-
-<table border=1 width=100%><tr><td>
-'''Name'''
-</td><td>
-'''Default text'''
-</td><td>
-'''Current text'''
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:1movedto2&action=edit 1movedto2]<br>
-[[MediaWiki_talk:1movedto2|Talk]]
-</td><td>
-$1 moved to $2
-</td><td>
-{{int:1movedto2}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Monobook.css&action=edit Monobook.css]<br>
-[[MediaWiki_talk:Monobook.css|Talk]]
-</td><td>
-/* edit this file to customize the monobook skin for the entire site */
-</td><td>
-{{int:Monobook.css}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:About&action=edit about]<br>
-[[MediaWiki_talk:About|Talk]]
-</td><td>
-About
-</td><td>
-{{int:About}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Aboutpage&action=edit aboutpage]<br>
-[[MediaWiki_talk:Aboutpage|Talk]]
-</td><td>
-Wiktionary:About
-</td><td>
-{{int:Aboutpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Aboutwikipedia&action=edit aboutwikipedia]<br>
-[[MediaWiki_talk:Aboutwikipedia|Talk]]
-</td><td>
-About Wiktionary
-</td><td>
-{{int:Aboutwikipedia}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-addsection&action=edit accesskey-addsection]<br>
-[[MediaWiki_talk:Accesskey-addsection|Talk]]
-</td><td>
-+
-</td><td>
-{{int:Accesskey-addsection}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-anontalk&action=edit accesskey-anontalk]<br>
-[[MediaWiki_talk:Accesskey-anontalk|Talk]]
-</td><td>
-n
-</td><td>
-{{int:Accesskey-anontalk}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-anonuserpage&action=edit accesskey-anonuserpage]<br>
-[[MediaWiki_talk:Accesskey-anonuserpage|Talk]]
-</td><td>
-.
-</td><td>
-{{int:Accesskey-anonuserpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-article&action=edit accesskey-article]<br>
-[[MediaWiki_talk:Accesskey-article|Talk]]
-</td><td>
-a
-</td><td>
-{{int:Accesskey-article}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-compareselectedversions&action=edit accesskey-compareselectedversions]<br>
-[[MediaWiki_talk:Accesskey-compareselectedversions|Talk]]
-</td><td>
-v
-</td><td>
-{{int:Accesskey-compareselectedversions}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-contributions&action=edit accesskey-contributions]<br>
-[[MediaWiki_talk:Accesskey-contributions|Talk]]
-</td><td>
-&amp;lt;accesskey-contributions&amp;gt;
-</td><td>
-{{int:Accesskey-contributions}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-currentevents&action=edit accesskey-currentevents]<br>
-[[MediaWiki_talk:Accesskey-currentevents|Talk]]
-</td><td>
-&amp;lt;accesskey-currentevents&amp;gt;
-</td><td>
-{{int:Accesskey-currentevents}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-delete&action=edit accesskey-delete]<br>
-[[MediaWiki_talk:Accesskey-delete|Talk]]
-</td><td>
-d
-</td><td>
-{{int:Accesskey-delete}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-edit&action=edit accesskey-edit]<br>
-[[MediaWiki_talk:Accesskey-edit|Talk]]
-</td><td>
-e
-</td><td>
-{{int:Accesskey-edit}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-emailuser&action=edit accesskey-emailuser]<br>
-[[MediaWiki_talk:Accesskey-emailuser|Talk]]
-</td><td>
-&amp;lt;accesskey-emailuser&amp;gt;
-</td><td>
-{{int:Accesskey-emailuser}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-help&action=edit accesskey-help]<br>
-[[MediaWiki_talk:Accesskey-help|Talk]]
-</td><td>
-&amp;lt;accesskey-help&amp;gt;
-</td><td>
-{{int:Accesskey-help}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-history&action=edit accesskey-history]<br>
-[[MediaWiki_talk:Accesskey-history|Talk]]
-</td><td>
-h
-</td><td>
-{{int:Accesskey-history}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-login&action=edit accesskey-login]<br>
-[[MediaWiki_talk:Accesskey-login|Talk]]
-</td><td>
-o
-</td><td>
-{{int:Accesskey-login}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-logout&action=edit accesskey-logout]<br>
-[[MediaWiki_talk:Accesskey-logout|Talk]]
-</td><td>
-o
-</td><td>
-{{int:Accesskey-logout}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mainpage&action=edit accesskey-mainpage]<br>
-[[MediaWiki_talk:Accesskey-mainpage|Talk]]
-</td><td>
-z
-</td><td>
-{{int:Accesskey-mainpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-minoredit&action=edit accesskey-minoredit]<br>
-[[MediaWiki_talk:Accesskey-minoredit|Talk]]
-</td><td>
-i
-</td><td>
-{{int:Accesskey-minoredit}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-move&action=edit accesskey-move]<br>
-[[MediaWiki_talk:Accesskey-move|Talk]]
-</td><td>
-m
-</td><td>
-{{int:Accesskey-move}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mycontris&action=edit accesskey-mycontris]<br>
-[[MediaWiki_talk:Accesskey-mycontris|Talk]]
-</td><td>
-y
-</td><td>
-{{int:Accesskey-mycontris}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-mytalk&action=edit accesskey-mytalk]<br>
-[[MediaWiki_talk:Accesskey-mytalk|Talk]]
-</td><td>
-n
-</td><td>
-{{int:Accesskey-mytalk}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-portal&action=edit accesskey-portal]<br>
-[[MediaWiki_talk:Accesskey-portal|Talk]]
-</td><td>
-&amp;lt;accesskey-portal&amp;gt;
-</td><td>
-{{int:Accesskey-portal}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-preferences&action=edit accesskey-preferences]<br>
-[[MediaWiki_talk:Accesskey-preferences|Talk]]
-</td><td>
-&amp;lt;accesskey-preferences&amp;gt;
-</td><td>
-{{int:Accesskey-preferences}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-preview&action=edit accesskey-preview]<br>
-[[MediaWiki_talk:Accesskey-preview|Talk]]
-</td><td>
-p
-</td><td>
-{{int:Accesskey-preview}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-protect&action=edit accesskey-protect]<br>
-[[MediaWiki_talk:Accesskey-protect|Talk]]
-</td><td>
-=
-</td><td>
-{{int:Accesskey-protect}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-randompage&action=edit accesskey-randompage]<br>
-[[MediaWiki_talk:Accesskey-randompage|Talk]]
-</td><td>
-x
-</td><td>
-{{int:Accesskey-randompage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-recentchanges&action=edit accesskey-recentchanges]<br>
-[[MediaWiki_talk:Accesskey-recentchanges|Talk]]
-</td><td>
-r
-</td><td>
-{{int:Accesskey-recentchanges}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-recentchangeslinked&action=edit accesskey-recentchangeslinked]<br>
-[[MediaWiki_talk:Accesskey-recentchangeslinked|Talk]]
-</td><td>
-c
-</td><td>
-{{int:Accesskey-recentchangeslinked}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-save&action=edit accesskey-save]<br>
-[[MediaWiki_talk:Accesskey-save|Talk]]
-</td><td>
-s
-</td><td>
-{{int:Accesskey-save}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-search&action=edit accesskey-search]<br>
-[[MediaWiki_talk:Accesskey-search|Talk]]
-</td><td>
-f
-</td><td>
-{{int:Accesskey-search}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-sitesupport&action=edit accesskey-sitesupport]<br>
-[[MediaWiki_talk:Accesskey-sitesupport|Talk]]
-</td><td>
-&amp;lt;accesskey-sitesupport&amp;gt;
-</td><td>
-{{int:Accesskey-sitesupport}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-specialpage&action=edit accesskey-specialpage]<br>
-[[MediaWiki_talk:Accesskey-specialpage|Talk]]
-</td><td>
-&amp;lt;accesskey-specialpage&amp;gt;
-</td><td>
-{{int:Accesskey-specialpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-specialpages&action=edit accesskey-specialpages]<br>
-[[MediaWiki_talk:Accesskey-specialpages|Talk]]
-</td><td>
-q
-</td><td>
-{{int:Accesskey-specialpages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-talk&action=edit accesskey-talk]<br>
-[[MediaWiki_talk:Accesskey-talk|Talk]]
-</td><td>
-t
-</td><td>
-{{int:Accesskey-talk}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-undelete&action=edit accesskey-undelete]<br>
-[[MediaWiki_talk:Accesskey-undelete|Talk]]
-</td><td>
-d
-</td><td>
-{{int:Accesskey-undelete}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-unwatch&action=edit accesskey-unwatch]<br>
-[[MediaWiki_talk:Accesskey-unwatch|Talk]]
-</td><td>
-w
-</td><td>
-{{int:Accesskey-unwatch}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-upload&action=edit accesskey-upload]<br>
-[[MediaWiki_talk:Accesskey-upload|Talk]]
-</td><td>
-u
-</td><td>
-{{int:Accesskey-upload}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-userpage&action=edit accesskey-userpage]<br>
-[[MediaWiki_talk:Accesskey-userpage|Talk]]
-</td><td>
-.
-</td><td>
-{{int:Accesskey-userpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-viewsource&action=edit accesskey-viewsource]<br>
-[[MediaWiki_talk:Accesskey-viewsource|Talk]]
-</td><td>
-e
-</td><td>
-{{int:Accesskey-viewsource}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-watch&action=edit accesskey-watch]<br>
-[[MediaWiki_talk:Accesskey-watch|Talk]]
-</td><td>
-w
-</td><td>
-{{int:Accesskey-watch}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-watchlist&action=edit accesskey-watchlist]<br>
-[[MediaWiki_talk:Accesskey-watchlist|Talk]]
-</td><td>
-l
-</td><td>
-{{int:Accesskey-watchlist}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accesskey-whatlinkshere&action=edit accesskey-whatlinkshere]<br>
-[[MediaWiki_talk:Accesskey-whatlinkshere|Talk]]
-</td><td>
-b
-</td><td>
-{{int:Accesskey-whatlinkshere}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accmailtext&action=edit accmailtext]<br>
-[[MediaWiki_talk:Accmailtext|Talk]]
-</td><td>
-The Password for &#39;$1&#39; has been sent to $2.
-</td><td>
-{{int:Accmailtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Accmailtitle&action=edit accmailtitle]<br>
-[[MediaWiki_talk:Accmailtitle|Talk]]
-</td><td>
-Password sent.
-</td><td>
-{{int:Accmailtitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Actioncomplete&action=edit actioncomplete]<br>
-[[MediaWiki_talk:Actioncomplete|Talk]]
-</td><td>
-Action complete
-</td><td>
-{{int:Actioncomplete}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addedwatch&action=edit addedwatch]<br>
-[[MediaWiki_talk:Addedwatch|Talk]]
-</td><td>
-Added to watchlist
-</td><td>
-{{int:Addedwatch}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addedwatchtext&action=edit addedwatchtext]<br>
-[[MediaWiki_talk:Addedwatchtext|Talk]]
-</td><td>
-The page &quot;$1&quot; has been added to your &#91;&#91;Special:Watchlist&#124;watchlist]].
-Future changes to this page and its associated Talk page will be listed there,
-and the page will appear &#39;&#39;&#39;bolded&#39;&#39;&#39; in the &#91;&#91;Special:Recentchanges&#124;list of recent changes]] to
-make it easier to pick out.
-
-&lt;p&gt;If you want to remove the page from your watchlist later, click &quot;Stop watching&quot; in the sidebar.
-</td><td>
-{{int:Addedwatchtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Addsection&action=edit addsection]<br>
-[[MediaWiki_talk:Addsection|Talk]]
-</td><td>
-+
-</td><td>
-{{int:Addsection}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Administrators&action=edit administrators]<br>
-[[MediaWiki_talk:Administrators|Talk]]
-</td><td>
-Wiktionary:Administrators
-</td><td>
-{{int:Administrators}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Affirmation&action=edit affirmation]<br>
-[[MediaWiki_talk:Affirmation|Talk]]
-</td><td>
-I affirm that the copyright holder of this file
-agrees to license it under the terms of the $1.
-</td><td>
-{{int:Affirmation}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:All&action=edit all]<br>
-[[MediaWiki_talk:All|Talk]]
-</td><td>
-all
-</td><td>
-{{int:All}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allmessages&action=edit allmessages]<br>
-[[MediaWiki_talk:Allmessages|Talk]]
-</td><td>
-All system messages
-</td><td>
-{{int:Allmessages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allmessagestext&action=edit allmessagestext]<br>
-[[MediaWiki_talk:Allmessagestext|Talk]]
-</td><td>
-This is a list of all system messages available in the MediaWiki: namespace.
-</td><td>
-{{int:Allmessagestext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Allpages&action=edit allpages]<br>
-[[MediaWiki_talk:Allpages|Talk]]
-</td><td>
-All pages
-</td><td>
-{{int:Allpages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alphaindexline&action=edit alphaindexline]<br>
-[[MediaWiki_talk:Alphaindexline|Talk]]
-</td><td>
-$1 to $2
-</td><td>
-{{int:Alphaindexline}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alreadyloggedin&action=edit alreadyloggedin]<br>
-[[MediaWiki_talk:Alreadyloggedin|Talk]]
-</td><td>
-&lt;font color=red&gt;&lt;b&gt;User $1, you are already logged in!&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;
-
-</td><td>
-{{int:Alreadyloggedin}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Alreadyrolled&action=edit alreadyrolled]<br>
-[[MediaWiki_talk:Alreadyrolled|Talk]]
-</td><td>
-Cannot rollback last edit of &#91;&#91;$1]]
-by &#91;&#91;User:$2&#124;$2]] (&#91;&#91;User talk:$2&#124;Talk]]); someone else has edited or rolled back the page already.
-
-Last edit was by &#91;&#91;User:$3&#124;$3]] (&#91;&#91;User talk:$3&#124;Talk]]).
-</td><td>
-{{int:Alreadyrolled}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ancientpages&action=edit ancientpages]<br>
-[[MediaWiki_talk:Ancientpages|Talk]]
-</td><td>
-Oldest pages
-</td><td>
-{{int:Ancientpages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:And&action=edit and]<br>
-[[MediaWiki_talk:And|Talk]]
-</td><td>
-and
-</td><td>
-{{int:And}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anontalk&action=edit anontalk]<br>
-[[MediaWiki_talk:Anontalk|Talk]]
-</td><td>
-Talk for this IP
-</td><td>
-{{int:Anontalk}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anontalkpagetext&action=edit anontalkpagetext]<br>
-[[MediaWiki_talk:Anontalkpagetext|Talk]]
-</td><td>
-----&#39;&#39;This is the discussion page for an anonymous user who has not created an account yet or who does not use it. We therefore have to use the numerical &#91;&#91;IP address]] to identify him/her. Such an IP address can be shared by several users. If you are an anonymous user and feel that irrelevant comments have been directed at you, please &#91;&#91;Special:Userlogin&#124;create an account or log in]] to avoid future confusion with other anonymous users.&#39;&#39;
-</td><td>
-{{int:Anontalkpagetext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Anonymous&action=edit anonymous]<br>
-[[MediaWiki_talk:Anonymous|Talk]]
-</td><td>
-Anonymous user(s) of Wiktionary
-</td><td>
-{{int:Anonymous}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Article&action=edit article]<br>
-[[MediaWiki_talk:Article|Talk]]
-</td><td>
-Content page
-</td><td>
-{{int:Article}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Articleexists&action=edit articleexists]<br>
-[[MediaWiki_talk:Articleexists|Talk]]
-</td><td>
-A page of that name already exists, or the
-name you have chosen is not valid.
-Please choose another name.
-</td><td>
-{{int:Articleexists}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Articlepage&action=edit articlepage]<br>
-[[MediaWiki_talk:Articlepage|Talk]]
-</td><td>
-View content page
-</td><td>
-{{int:Articlepage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Asksql&action=edit asksql]<br>
-[[MediaWiki_talk:Asksql|Talk]]
-</td><td>
-SQL query
-</td><td>
-{{int:Asksql}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Asksqltext&action=edit asksqltext]<br>
-[[MediaWiki_talk:Asksqltext|Talk]]
-</td><td>
-Use the form below to make a direct query of the
-database.
-Use single quotes (&#39;like this&#39;) to delimit string literals.
-This can often add considerable load to the server, so please use
-this function sparingly.
-</td><td>
-{{int:Asksqltext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Autoblocker&action=edit autoblocker]<br>
-[[MediaWiki_talk:Autoblocker|Talk]]
-</td><td>
-Autoblocked because you share an IP address with &quot;$1&quot;. Reason &quot;$2&quot;.
-</td><td>
-{{int:Autoblocker}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badarticleerror&action=edit badarticleerror]<br>
-[[MediaWiki_talk:Badarticleerror|Talk]]
-</td><td>
-This action cannot be performed on this page.
-</td><td>
-{{int:Badarticleerror}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badfilename&action=edit badfilename]<br>
-[[MediaWiki_talk:Badfilename|Talk]]
-</td><td>
-Image name has been changed to &quot;$1&quot;.
-</td><td>
-{{int:Badfilename}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badfiletype&action=edit badfiletype]<br>
-[[MediaWiki_talk:Badfiletype|Talk]]
-</td><td>
-&quot;.$1&quot; is not a recommended image file format.
-</td><td>
-{{int:Badfiletype}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badipaddress&action=edit badipaddress]<br>
-[[MediaWiki_talk:Badipaddress|Talk]]
-</td><td>
-Invalid IP address
-</td><td>
-{{int:Badipaddress}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badquery&action=edit badquery]<br>
-[[MediaWiki_talk:Badquery|Talk]]
-</td><td>
-Badly formed search query
-</td><td>
-{{int:Badquery}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badquerytext&action=edit badquerytext]<br>
-[[MediaWiki_talk:Badquerytext|Talk]]
-</td><td>
-We could not process your query.
-This is probably because you have attempted to search for a
-word fewer than three letters long, which is not yet supported.
-It could also be that you have mistyped the expression, for
-example &quot;fish and and scales&quot;.
-Please try another query.
-</td><td>
-{{int:Badquerytext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badretype&action=edit badretype]<br>
-[[MediaWiki_talk:Badretype|Talk]]
-</td><td>
-The passwords you entered do not match.
-</td><td>
-{{int:Badretype}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badtitle&action=edit badtitle]<br>
-[[MediaWiki_talk:Badtitle|Talk]]
-</td><td>
-Bad title
-</td><td>
-{{int:Badtitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Badtitletext&action=edit badtitletext]<br>
-[[MediaWiki_talk:Badtitletext|Talk]]
-</td><td>
-The requested page title was invalid, empty, or
-an incorrectly linked inter-language or inter-wiki title.
-</td><td>
-{{int:Badtitletext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blanknamespace&action=edit blanknamespace]<br>
-[[MediaWiki_talk:Blanknamespace|Talk]]
-</td><td>
-(Main)
-</td><td>
-{{int:Blanknamespace}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockedtext&action=edit blockedtext]<br>
-[[MediaWiki_talk:Blockedtext|Talk]]
-</td><td>
-Your user name or IP address has been blocked by $1.
-The reason given is this:&lt;br /&gt;&#39;&#39;$2&#39;&#39;&lt;p&gt;You may contact $1 or one of the other
-&#91;&#91;Wiktionary:Administrators&#124;administrators]] to discuss the block.
-
-Note that you may not use the &quot;email this user&quot; feature unless you have a valid email address registered in your &#91;&#91;Special:Preferences&#124;user preferences]].
-
-Your IP address is $3. Please include this address in any queries you make.
-
-</td><td>
-{{int:Blockedtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockedtitle&action=edit blockedtitle]<br>
-[[MediaWiki_talk:Blockedtitle|Talk]]
-</td><td>
-User is blocked
-</td><td>
-{{int:Blockedtitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockip&action=edit blockip]<br>
-[[MediaWiki_talk:Blockip|Talk]]
-</td><td>
-Block user
-</td><td>
-{{int:Blockip}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockipsuccesssub&action=edit blockipsuccesssub]<br>
-[[MediaWiki_talk:Blockipsuccesssub|Talk]]
-</td><td>
-Block succeeded
-</td><td>
-{{int:Blockipsuccesssub}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockipsuccesstext&action=edit blockipsuccesstext]<br>
-[[MediaWiki_talk:Blockipsuccesstext|Talk]]
-</td><td>
-&quot;$1&quot; has been blocked.
-&lt;br /&gt;See &#91;&#91;Special:Ipblocklist&#124;IP block list]] to review blocks.
-</td><td>
-{{int:Blockipsuccesstext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blockiptext&action=edit blockiptext]<br>
-[[MediaWiki_talk:Blockiptext|Talk]]
-</td><td>
-Use the form below to block write access
-from a specific IP address or username.
-This should be done only only to prevent vandalism, and in
-accordance with &#91;&#91;Wiktionary:Policy&#124;policy]].
-Fill in a specific reason below (for example, citing particular
-pages that were vandalized).
-</td><td>
-{{int:Blockiptext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklink&action=edit blocklink]<br>
-[[MediaWiki_talk:Blocklink|Talk]]
-</td><td>
-block
-</td><td>
-{{int:Blocklink}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklistline&action=edit blocklistline]<br>
-[[MediaWiki_talk:Blocklistline|Talk]]
-</td><td>
-$1, $2 blocked $3 (expires $4)
-</td><td>
-{{int:Blocklistline}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogentry&action=edit blocklogentry]<br>
-[[MediaWiki_talk:Blocklogentry|Talk]]
-</td><td>
-blocked &quot;$1&quot; with an expiry time of $2
-</td><td>
-{{int:Blocklogentry}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogpage&action=edit blocklogpage]<br>
-[[MediaWiki_talk:Blocklogpage|Talk]]
-</td><td>
-Block_log
-</td><td>
-{{int:Blocklogpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Blocklogtext&action=edit blocklogtext]<br>
-[[MediaWiki_talk:Blocklogtext|Talk]]
-</td><td>
-This is a log of user blocking and unblocking actions. Automatically
-blocked IP addresses are not be listed. See the &#91;&#91;Special:Ipblocklist&#124;IP block list]] for
-the list of currently operational bans and blocks.
-</td><td>
-{{int:Blocklogtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bold_sample&action=edit bold_sample]<br>
-[[MediaWiki_talk:Bold_sample|Talk]]
-</td><td>
-Bold text
-</td><td>
-{{int:Bold_sample}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bold_tip&action=edit bold_tip]<br>
-[[MediaWiki_talk:Bold_tip|Talk]]
-</td><td>
-Bold text
-</td><td>
-{{int:Bold_tip}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Booksources&action=edit booksources]<br>
-[[MediaWiki_talk:Booksources|Talk]]
-</td><td>
-Book sources
-</td><td>
-{{int:Booksources}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Booksourcetext&action=edit booksourcetext]<br>
-[[MediaWiki_talk:Booksourcetext|Talk]]
-</td><td>
-Below is a list of links to other sites that
-sell new and used books, and may also have further information
-about books you are looking for.Wiktionary is not affiliated with any of these businesses, and
-this list should not be construed as an endorsement.
-</td><td>
-{{int:Booksourcetext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Brokenredirects&action=edit brokenredirects]<br>
-[[MediaWiki_talk:Brokenredirects|Talk]]
-</td><td>
-Broken Redirects
-</td><td>
-{{int:Brokenredirects}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Brokenredirectstext&action=edit brokenredirectstext]<br>
-[[MediaWiki_talk:Brokenredirectstext|Talk]]
-</td><td>
-The following redirects link to a non-existing pages.
-</td><td>
-{{int:Brokenredirectstext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bugreports&action=edit bugreports]<br>
-[[MediaWiki_talk:Bugreports|Talk]]
-</td><td>
-Bug reports
-</td><td>
-{{int:Bugreports}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bugreportspage&action=edit bugreportspage]<br>
-[[MediaWiki_talk:Bugreportspage|Talk]]
-</td><td>
-Wiktionary:Bug_reports
-</td><td>
-{{int:Bugreportspage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucratlog&action=edit bureaucratlog]<br>
-[[MediaWiki_talk:Bureaucratlog|Talk]]
-</td><td>
-Bureaucrat_log
-</td><td>
-{{int:Bureaucratlog}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucratlogentry&action=edit bureaucratlogentry]<br>
-[[MediaWiki_talk:Bureaucratlogentry|Talk]]
-</td><td>
-Rights for user &quot;$1&quot; set &quot;$2&quot;
-</td><td>
-{{int:Bureaucratlogentry}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucrattext&action=edit bureaucrattext]<br>
-[[MediaWiki_talk:Bureaucrattext|Talk]]
-</td><td>
-The action you have requested can only be
-performed by sysops with &quot;bureaucrat&quot; status.
-</td><td>
-{{int:Bureaucrattext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bureaucrattitle&action=edit bureaucrattitle]<br>
-[[MediaWiki_talk:Bureaucrattitle|Talk]]
-</td><td>
-Bureaucrat access required
-</td><td>
-{{int:Bureaucrattitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bydate&action=edit bydate]<br>
-[[MediaWiki_talk:Bydate|Talk]]
-</td><td>
-by date
-</td><td>
-{{int:Bydate}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Byname&action=edit byname]<br>
-[[MediaWiki_talk:Byname|Talk]]
-</td><td>
-by name
-</td><td>
-{{int:Byname}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Bysize&action=edit bysize]<br>
-[[MediaWiki_talk:Bysize|Talk]]
-</td><td>
-by size
-</td><td>
-{{int:Bysize}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cachederror&action=edit cachederror]<br>
-[[MediaWiki_talk:Cachederror|Talk]]
-</td><td>
-The following is a cached copy of the requested page, and may not be up to date.
-</td><td>
-{{int:Cachederror}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cancel&action=edit cancel]<br>
-[[MediaWiki_talk:Cancel|Talk]]
-</td><td>
-Cancel
-</td><td>
-{{int:Cancel}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cannotdelete&action=edit cannotdelete]<br>
-[[MediaWiki_talk:Cannotdelete|Talk]]
-</td><td>
-Could not delete the page or image specified. (It may have already been deleted by someone else.)
-</td><td>
-{{int:Cannotdelete}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cantrollback&action=edit cantrollback]<br>
-[[MediaWiki_talk:Cantrollback|Talk]]
-</td><td>
-Cannot revert edit; last contributor is only author of this page.
-</td><td>
-{{int:Cantrollback}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Categories&action=edit categories]<br>
-[[MediaWiki_talk:Categories|Talk]]
-</td><td>
-Categories
-</td><td>
-{{int:Categories}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Category&action=edit category]<br>
-[[MediaWiki_talk:Category|Talk]]
-</td><td>
-category
-</td><td>
-{{int:Category}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Category_header&action=edit category_header]<br>
-[[MediaWiki_talk:Category_header|Talk]]
-</td><td>
-Articles in category &quot;$1&quot;
-</td><td>
-{{int:Category_header}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Changepassword&action=edit changepassword]<br>
-[[MediaWiki_talk:Changepassword|Talk]]
-</td><td>
-Change password
-</td><td>
-{{int:Changepassword}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Changes&action=edit changes]<br>
-[[MediaWiki_talk:Changes|Talk]]
-</td><td>
-changes
-</td><td>
-{{int:Changes}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Columns&action=edit columns]<br>
-[[MediaWiki_talk:Columns|Talk]]
-</td><td>
-Columns
-</td><td>
-{{int:Columns}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Commentedit&action=edit commentedit]<br>
-[[MediaWiki_talk:Commentedit|Talk]]
-</td><td>
- (comment)
-</td><td>
-{{int:Commentedit}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Compareselectedversions&action=edit compareselectedversions]<br>
-[[MediaWiki_talk:Compareselectedversions|Talk]]
-</td><td>
-Compare selected versions
-</td><td>
-{{int:Compareselectedversions}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirm&action=edit confirm]<br>
-[[MediaWiki_talk:Confirm|Talk]]
-</td><td>
-Confirm
-</td><td>
-{{int:Confirm}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmcheck&action=edit confirmcheck]<br>
-[[MediaWiki_talk:Confirmcheck|Talk]]
-</td><td>
-Yes, I really want to delete this.
-</td><td>
-{{int:Confirmcheck}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmdelete&action=edit confirmdelete]<br>
-[[MediaWiki_talk:Confirmdelete|Talk]]
-</td><td>
-Confirm delete
-</td><td>
-{{int:Confirmdelete}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmdeletetext&action=edit confirmdeletetext]<br>
-[[MediaWiki_talk:Confirmdeletetext|Talk]]
-</td><td>
-You are about to permanently delete a page
-or image along with all of its history from the database.
-Please confirm that you intend to do this, that you understand the
-consequences, and that you are doing this in accordance with
-&#91;&#91;Wiktionary:Policy]].
-</td><td>
-{{int:Confirmdeletetext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmprotect&action=edit confirmprotect]<br>
-[[MediaWiki_talk:Confirmprotect|Talk]]
-</td><td>
-Confirm protection
-</td><td>
-{{int:Confirmprotect}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmprotecttext&action=edit confirmprotecttext]<br>
-[[MediaWiki_talk:Confirmprotecttext|Talk]]
-</td><td>
-Do you really want to protect this page?
-</td><td>
-{{int:Confirmprotecttext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmunprotect&action=edit confirmunprotect]<br>
-[[MediaWiki_talk:Confirmunprotect|Talk]]
-</td><td>
-Confirm unprotection
-</td><td>
-{{int:Confirmunprotect}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Confirmunprotecttext&action=edit confirmunprotecttext]<br>
-[[MediaWiki_talk:Confirmunprotecttext|Talk]]
-</td><td>
-Do you really want to unprotect this page?
-</td><td>
-{{int:Confirmunprotecttext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contextchars&action=edit contextchars]<br>
-[[MediaWiki_talk:Contextchars|Talk]]
-</td><td>
-Characters of context per line
-</td><td>
-{{int:Contextchars}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contextlines&action=edit contextlines]<br>
-[[MediaWiki_talk:Contextlines|Talk]]
-</td><td>
-Lines to show per hit
-</td><td>
-{{int:Contextlines}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contribslink&action=edit contribslink]<br>
-[[MediaWiki_talk:Contribslink|Talk]]
-</td><td>
-contribs
-</td><td>
-{{int:Contribslink}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contribsub&action=edit contribsub]<br>
-[[MediaWiki_talk:Contribsub|Talk]]
-</td><td>
-For $1
-</td><td>
-{{int:Contribsub}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Contributions&action=edit contributions]<br>
-[[MediaWiki_talk:Contributions|Talk]]
-</td><td>
-User contributions
-</td><td>
-{{int:Contributions}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyright&action=edit copyright]<br>
-[[MediaWiki_talk:Copyright|Talk]]
-</td><td>
-Content is available under $1.
-</td><td>
-{{int:Copyright}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyrightpage&action=edit copyrightpage]<br>
-[[MediaWiki_talk:Copyrightpage|Talk]]
-</td><td>
-Wiktionary:Copyrights
-</td><td>
-{{int:Copyrightpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyrightpagename&action=edit copyrightpagename]<br>
-[[MediaWiki_talk:Copyrightpagename|Talk]]
-</td><td>
-Wiktionary copyright
-</td><td>
-{{int:Copyrightpagename}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Copyrightwarning&action=edit copyrightwarning]<br>
-[[MediaWiki_talk:Copyrightwarning|Talk]]
-</td><td>
-Please note that all contributions to Wiktionary are
-considered to be released under the GNU Free Documentation License
-(see $1 for details).
-If you don&#39;t want your writing to be edited mercilessly and redistributed
-at will, then don&#39;t submit it here.&lt;br /&gt;
-You are also promising us that you wrote this yourself, or copied it from a
-public domain or similar free resource.
-&lt;strong&gt;DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION!&lt;/strong&gt;
-</td><td>
-{{int:Copyrightwarning}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Couldntremove&action=edit couldntremove]<br>
-[[MediaWiki_talk:Couldntremove|Talk]]
-</td><td>
-Couldn&#39;t remove item &#39;$1&#39;...
-</td><td>
-{{int:Couldntremove}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Createaccount&action=edit createaccount]<br>
-[[MediaWiki_talk:Createaccount|Talk]]
-</td><td>
-Create new account
-</td><td>
-{{int:Createaccount}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Createaccountmail&action=edit createaccountmail]<br>
-[[MediaWiki_talk:Createaccountmail|Talk]]
-</td><td>
-by email
-</td><td>
-{{int:Createaccountmail}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Cur&action=edit cur]<br>
-[[MediaWiki_talk:Cur|Talk]]
-</td><td>
-cur
-</td><td>
-{{int:Cur}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Currentevents&action=edit currentevents]<br>
-[[MediaWiki_talk:Currentevents|Talk]]
-</td><td>
-Current events
-</td><td>
-{{int:Currentevents}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Currentrev&action=edit currentrev]<br>
-[[MediaWiki_talk:Currentrev|Talk]]
-</td><td>
-Current revision
-</td><td>
-{{int:Currentrev}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Databaseerror&action=edit databaseerror]<br>
-[[MediaWiki_talk:Databaseerror|Talk]]
-</td><td>
-Database error
-</td><td>
-{{int:Databaseerror}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dateformat&action=edit dateformat]<br>
-[[MediaWiki_talk:Dateformat|Talk]]
-</td><td>
-Date format
-</td><td>
-{{int:Dateformat}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dberrortext&action=edit dberrortext]<br>
-[[MediaWiki_talk:Dberrortext|Talk]]
-</td><td>
-A database query syntax error has occurred.
-This could be because of an illegal search query (see $5),
-or it may indicate a bug in the software.
-The last attempted database query was:
-&lt;blockquote&gt;&lt;tt&gt;$1&lt;/tt&gt;&lt;/blockquote&gt;
-from within function &quot;&lt;tt&gt;$2&lt;/tt&gt;&quot;.
-MySQL returned error &quot;&lt;tt&gt;$3: $4&lt;/tt&gt;&quot;.
-</td><td>
-{{int:Dberrortext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dberrortextcl&action=edit dberrortextcl]<br>
-[[MediaWiki_talk:Dberrortextcl|Talk]]
-</td><td>
-A database query syntax error has occurred.
-The last attempted database query was:
-&quot;$1&quot;
-from within function &quot;$2&quot;.
-MySQL returned error &quot;$3: $4&quot;.
-
-</td><td>
-{{int:Dberrortextcl}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deadendpages&action=edit deadendpages]<br>
-[[MediaWiki_talk:Deadendpages|Talk]]
-</td><td>
-Dead-end pages
-</td><td>
-{{int:Deadendpages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Debug&action=edit debug]<br>
-[[MediaWiki_talk:Debug|Talk]]
-</td><td>
-Debug
-</td><td>
-{{int:Debug}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Defaultns&action=edit defaultns]<br>
-[[MediaWiki_talk:Defaultns|Talk]]
-</td><td>
-Search in these namespaces by default:
-</td><td>
-{{int:Defaultns}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Defemailsubject&action=edit defemailsubject]<br>
-[[MediaWiki_talk:Defemailsubject|Talk]]
-</td><td>
-Wiktionary e-mail
-</td><td>
-{{int:Defemailsubject}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Delete&action=edit delete]<br>
-[[MediaWiki_talk:Delete|Talk]]
-</td><td>
-Delete
-</td><td>
-{{int:Delete}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletecomment&action=edit deletecomment]<br>
-[[MediaWiki_talk:Deletecomment|Talk]]
-</td><td>
-Reason for deletion
-</td><td>
-{{int:Deletecomment}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletedarticle&action=edit deletedarticle]<br>
-[[MediaWiki_talk:Deletedarticle|Talk]]
-</td><td>
-deleted &quot;$1&quot;
-</td><td>
-{{int:Deletedarticle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletedtext&action=edit deletedtext]<br>
-[[MediaWiki_talk:Deletedtext|Talk]]
-</td><td>
-&quot;$1&quot; has been deleted.
-See $2 for a record of recent deletions.
-</td><td>
-{{int:Deletedtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deleteimg&action=edit deleteimg]<br>
-[[MediaWiki_talk:Deleteimg|Talk]]
-</td><td>
-del
-</td><td>
-{{int:Deleteimg}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletepage&action=edit deletepage]<br>
-[[MediaWiki_talk:Deletepage|Talk]]
-</td><td>
-Delete page
-</td><td>
-{{int:Deletepage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletesub&action=edit deletesub]<br>
-[[MediaWiki_talk:Deletesub|Talk]]
-</td><td>
-(Deleting &quot;$1&quot;)
-</td><td>
-{{int:Deletesub}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletethispage&action=edit deletethispage]<br>
-[[MediaWiki_talk:Deletethispage|Talk]]
-</td><td>
-Delete this page
-</td><td>
-{{int:Deletethispage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Deletionlog&action=edit deletionlog]<br>
-[[MediaWiki_talk:Deletionlog|Talk]]
-</td><td>
-deletion log
-</td><td>
-{{int:Deletionlog}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dellogpage&action=edit dellogpage]<br>
-[[MediaWiki_talk:Dellogpage|Talk]]
-</td><td>
-Deletion_log
-</td><td>
-{{int:Dellogpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Dellogpagetext&action=edit dellogpagetext]<br>
-[[MediaWiki_talk:Dellogpagetext|Talk]]
-</td><td>
-Below is a list of the most recent deletions.
-All times shown are server time (UTC).
-&lt;ul&gt;
-&lt;/ul&gt;
-
-</td><td>
-{{int:Dellogpagetext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Developerspheading&action=edit developerspheading]<br>
-[[MediaWiki_talk:Developerspheading|Talk]]
-</td><td>
-For developer use only
-</td><td>
-{{int:Developerspheading}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Developertext&action=edit developertext]<br>
-[[MediaWiki_talk:Developertext|Talk]]
-</td><td>
-The action you have requested can only be
-performed by users with &quot;developer&quot; status.
-See $1.
-</td><td>
-{{int:Developertext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Developertitle&action=edit developertitle]<br>
-[[MediaWiki_talk:Developertitle|Talk]]
-</td><td>
-Developer access required
-</td><td>
-{{int:Developertitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Diff&action=edit diff]<br>
-[[MediaWiki_talk:Diff|Talk]]
-</td><td>
-diff
-</td><td>
-{{int:Diff}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Difference&action=edit difference]<br>
-[[MediaWiki_talk:Difference|Talk]]
-</td><td>
-(Difference between revisions)
-</td><td>
-{{int:Difference}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguations&action=edit disambiguations]<br>
-[[MediaWiki_talk:Disambiguations|Talk]]
-</td><td>
-Disambiguation pages
-</td><td>
-{{int:Disambiguations}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguationspage&action=edit disambiguationspage]<br>
-[[MediaWiki_talk:Disambiguationspage|Talk]]
-</td><td>
-Wiktionary:Links_to_disambiguating_pages
-</td><td>
-{{int:Disambiguationspage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguationstext&action=edit disambiguationstext]<br>
-[[MediaWiki_talk:Disambiguationstext|Talk]]
-</td><td>
-The following pages link to a &lt;i&gt;disambiguation page&lt;/i&gt;. They should link to the appropriate topic instead.&lt;br /&gt;A page is treated as dismbiguation if it is linked from $1.&lt;br /&gt;Links from other namespaces are &lt;i&gt;not&lt;/i&gt; listed here.
-</td><td>
-{{int:Disambiguationstext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disclaimerpage&action=edit disclaimerpage]<br>
-[[MediaWiki_talk:Disclaimerpage|Talk]]
-</td><td>
-Wiktionary:General_disclaimer
-</td><td>
-{{int:Disclaimerpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disclaimers&action=edit disclaimers]<br>
-[[MediaWiki_talk:Disclaimers|Talk]]
-</td><td>
-Disclaimers
-</td><td>
-{{int:Disclaimers}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Doubleredirects&action=edit doubleredirects]<br>
-[[MediaWiki_talk:Doubleredirects|Talk]]
-</td><td>
-Double Redirects
-</td><td>
-{{int:Doubleredirects}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Doubleredirectstext&action=edit doubleredirectstext]<br>
-[[MediaWiki_talk:Doubleredirectstext|Talk]]
-</td><td>
-&lt;b&gt;Attention:&lt;/b&gt; This list may contain false positives. That usually means there is additional text with links below the first #REDIRECT.&lt;br /&gt;
-Each row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the &quot;real&quot; target page, which the first redirect should point to.
-</td><td>
-{{int:Doubleredirectstext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Edit&action=edit edit]<br>
-[[MediaWiki_talk:Edit|Talk]]
-</td><td>
-Edit
-</td><td>
-{{int:Edit}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editcomment&action=edit editcomment]<br>
-[[MediaWiki_talk:Editcomment|Talk]]
-</td><td>
-The edit comment was: &quot;&lt;i&gt;$1&lt;/i&gt;&quot;.
-</td><td>
-{{int:Editcomment}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editconflict&action=edit editconflict]<br>
-[[MediaWiki_talk:Editconflict|Talk]]
-</td><td>
-Edit conflict: $1
-</td><td>
-{{int:Editconflict}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editcurrent&action=edit editcurrent]<br>
-[[MediaWiki_talk:Editcurrent|Talk]]
-</td><td>
-Edit the current version of this page
-</td><td>
-{{int:Editcurrent}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Edithelp&action=edit edithelp]<br>
-[[MediaWiki_talk:Edithelp|Talk]]
-</td><td>
-Editing help
-</td><td>
-{{int:Edithelp}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Edithelppage&action=edit edithelppage]<br>
-[[MediaWiki_talk:Edithelppage|Talk]]
-</td><td>
-Help:Editing
-</td><td>
-{{int:Edithelppage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editing&action=edit editing]<br>
-[[MediaWiki_talk:Editing|Talk]]
-</td><td>
-Editing $1
-</td><td>
-{{int:Editing}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editingold&action=edit editingold]<br>
-[[MediaWiki_talk:Editingold|Talk]]
-</td><td>
-&lt;strong&gt;WARNING: You are editing an out-of-date
-revision of this page.
-If you save it, any changes made since this revision will be lost.&lt;/strong&gt;
-
-</td><td>
-{{int:Editingold}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editsection&action=edit editsection]<br>
-[[MediaWiki_talk:Editsection|Talk]]
-</td><td>
-edit
-</td><td>
-{{int:Editsection}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Editthispage&action=edit editthispage]<br>
-[[MediaWiki_talk:Editthispage|Talk]]
-</td><td>
-Edit this page
-</td><td>
-{{int:Editthispage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailflag&action=edit emailflag]<br>
-[[MediaWiki_talk:Emailflag|Talk]]
-</td><td>
-Disable e-mail from other users
-</td><td>
-{{int:Emailflag}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailforlost&action=edit emailforlost]<br>
-[[MediaWiki_talk:Emailforlost|Talk]]
-</td><td>
-Fields marked with a star (*) are optional. Storing an email address enables people to contact you through the website without you having to reveal your
-email address to them, and it can be used to send you a new password if you forget it.&lt;br /&gt;&lt;br /&gt;Your real name, if you choose to provide it, will be used for giving you attribution for your work.
-</td><td>
-{{int:Emailforlost}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailfrom&action=edit emailfrom]<br>
-[[MediaWiki_talk:Emailfrom|Talk]]
-</td><td>
-From
-</td><td>
-{{int:Emailfrom}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailmessage&action=edit emailmessage]<br>
-[[MediaWiki_talk:Emailmessage|Talk]]
-</td><td>
-Message
-</td><td>
-{{int:Emailmessage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailpage&action=edit emailpage]<br>
-[[MediaWiki_talk:Emailpage|Talk]]
-</td><td>
-E-mail user
-</td><td>
-{{int:Emailpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailpagetext&action=edit emailpagetext]<br>
-[[MediaWiki_talk:Emailpagetext|Talk]]
-</td><td>
-If this user has entered a valid e-mail address in
-his or her user preferences, the form below will send a single message.
-The e-mail address you entered in your user preferences will appear
-as the &quot;From&quot; address of the mail, so the recipient will be able
-to reply.
-</td><td>
-{{int:Emailpagetext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsend&action=edit emailsend]<br>
-[[MediaWiki_talk:Emailsend|Talk]]
-</td><td>
-Send
-</td><td>
-{{int:Emailsend}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsent&action=edit emailsent]<br>
-[[MediaWiki_talk:Emailsent|Talk]]
-</td><td>
-E-mail sent
-</td><td>
-{{int:Emailsent}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsenttext&action=edit emailsenttext]<br>
-[[MediaWiki_talk:Emailsenttext|Talk]]
-</td><td>
-Your e-mail message has been sent.
-</td><td>
-{{int:Emailsenttext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailsubject&action=edit emailsubject]<br>
-[[MediaWiki_talk:Emailsubject|Talk]]
-</td><td>
-Subject
-</td><td>
-{{int:Emailsubject}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailto&action=edit emailto]<br>
-[[MediaWiki_talk:Emailto|Talk]]
-</td><td>
-To
-</td><td>
-{{int:Emailto}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Emailuser&action=edit emailuser]<br>
-[[MediaWiki_talk:Emailuser|Talk]]
-</td><td>
-E-mail this user
-</td><td>
-{{int:Emailuser}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Enterlockreason&action=edit enterlockreason]<br>
-[[MediaWiki_talk:Enterlockreason|Talk]]
-</td><td>
-Enter a reason for the lock, including an estimate
-of when the lock will be released
-</td><td>
-{{int:Enterlockreason}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Error&action=edit error]<br>
-[[MediaWiki_talk:Error|Talk]]
-</td><td>
-Error
-</td><td>
-{{int:Error}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Errorpagetitle&action=edit errorpagetitle]<br>
-[[MediaWiki_talk:Errorpagetitle|Talk]]
-</td><td>
-Error
-</td><td>
-{{int:Errorpagetitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exbeforeblank&action=edit exbeforeblank]<br>
-[[MediaWiki_talk:Exbeforeblank|Talk]]
-</td><td>
-content before blanking was:
-</td><td>
-{{int:Exbeforeblank}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exblank&action=edit exblank]<br>
-[[MediaWiki_talk:Exblank|Talk]]
-</td><td>
-page was empty
-</td><td>
-{{int:Exblank}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Excontent&action=edit excontent]<br>
-[[MediaWiki_talk:Excontent|Talk]]
-</td><td>
-content was:
-</td><td>
-{{int:Excontent}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Explainconflict&action=edit explainconflict]<br>
-[[MediaWiki_talk:Explainconflict|Talk]]
-</td><td>
-Someone else has changed this page since you
-started editing it.
-The upper text area contains the page text as it currently exists.
-Your changes are shown in the lower text area.
-You will have to merge your changes into the existing text.
-&lt;b&gt;Only&lt;/b&gt; the text in the upper text area will be saved when you
-press &quot;Save page&quot;.
-&lt;p&gt;
-</td><td>
-{{int:Explainconflict}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Export&action=edit export]<br>
-[[MediaWiki_talk:Export|Talk]]
-</td><td>
-Export pages
-</td><td>
-{{int:Export}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exportcuronly&action=edit exportcuronly]<br>
-[[MediaWiki_talk:Exportcuronly|Talk]]
-</td><td>
-Include only the current revision, not the full history
-</td><td>
-{{int:Exportcuronly}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Exporttext&action=edit exporttext]<br>
-[[MediaWiki_talk:Exporttext|Talk]]
-</td><td>
-You can export the text and editing history of a particular
-page or set of pages wrapped in some XML; this can then be imported into another
-wiki running MediaWiki software, transformed, or just kept for your private
-amusement.
-</td><td>
-{{int:Exporttext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Extlink_sample&action=edit extlink_sample]<br>
-[[MediaWiki_talk:Extlink_sample|Talk]]
-</td><td>
-http&#58;//www.example.com link title
-</td><td>
-{{int:Extlink_sample}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Extlink_tip&action=edit extlink_tip]<br>
-[[MediaWiki_talk:Extlink_tip|Talk]]
-</td><td>
-External link (remember http&#58;// prefix)
-</td><td>
-{{int:Extlink_tip}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Faq&action=edit faq]<br>
-[[MediaWiki_talk:Faq|Talk]]
-</td><td>
-FAQ
-</td><td>
-{{int:Faq}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Faqpage&action=edit faqpage]<br>
-[[MediaWiki_talk:Faqpage|Talk]]
-</td><td>
-Wiktionary:FAQ
-</td><td>
-{{int:Faqpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Feedlinks&action=edit feedlinks]<br>
-[[MediaWiki_talk:Feedlinks|Talk]]
-</td><td>
-Feed:
-</td><td>
-{{int:Feedlinks}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filecopyerror&action=edit filecopyerror]<br>
-[[MediaWiki_talk:Filecopyerror|Talk]]
-</td><td>
-Could not copy file &quot;$1&quot; to &quot;$2&quot;.
-</td><td>
-{{int:Filecopyerror}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filedeleteerror&action=edit filedeleteerror]<br>
-[[MediaWiki_talk:Filedeleteerror|Talk]]
-</td><td>
-Could not delete file &quot;$1&quot;.
-</td><td>
-{{int:Filedeleteerror}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filedesc&action=edit filedesc]<br>
-[[MediaWiki_talk:Filedesc|Talk]]
-</td><td>
-Summary
-</td><td>
-{{int:Filedesc}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filename&action=edit filename]<br>
-[[MediaWiki_talk:Filename|Talk]]
-</td><td>
-Filename
-</td><td>
-{{int:Filename}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filenotfound&action=edit filenotfound]<br>
-[[MediaWiki_talk:Filenotfound|Talk]]
-</td><td>
-Could not find file &quot;$1&quot;.
-</td><td>
-{{int:Filenotfound}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filerenameerror&action=edit filerenameerror]<br>
-[[MediaWiki_talk:Filerenameerror|Talk]]
-</td><td>
-Could not rename file &quot;$1&quot; to &quot;$2&quot;.
-</td><td>
-{{int:Filerenameerror}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filesource&action=edit filesource]<br>
-[[MediaWiki_talk:Filesource|Talk]]
-</td><td>
-Source
-</td><td>
-{{int:Filesource}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Filestatus&action=edit filestatus]<br>
-[[MediaWiki_talk:Filestatus|Talk]]
-</td><td>
-Copyright status
-</td><td>
-{{int:Filestatus}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Fileuploaded&action=edit fileuploaded]<br>
-[[MediaWiki_talk:Fileuploaded|Talk]]
-</td><td>
-File &quot;$1&quot; uploaded successfully.
-Please follow this link: $2 to the description page and fill
-in information about the file, such as where it came from, when it was
-created and by whom, and anything else you may know about it.
-</td><td>
-{{int:Fileuploaded}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Formerror&action=edit formerror]<br>
-[[MediaWiki_talk:Formerror|Talk]]
-</td><td>
-Error: could not submit form
-</td><td>
-{{int:Formerror}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Fromwikipedia&action=edit fromwikipedia]<br>
-[[MediaWiki_talk:Fromwikipedia|Talk]]
-</td><td>
-From Wiktionary
-</td><td>
-{{int:Fromwikipedia}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Getimagelist&action=edit getimagelist]<br>
-[[MediaWiki_talk:Getimagelist|Talk]]
-</td><td>
-fetching image list
-</td><td>
-{{int:Getimagelist}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Go&action=edit go]<br>
-[[MediaWiki_talk:Go|Talk]]
-</td><td>
-Go
-</td><td>
-{{int:Go}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Googlesearch&action=edit googlesearch]<br>
-[[MediaWiki_talk:Googlesearch|Talk]]
-</td><td>
-
-&lt;!-- SiteSearch Google --&gt;
-&lt;FORM method=GET action=&quot;http&#58;//www.google.com/search&quot;&gt;
-&lt;TABLE bgcolor=&quot;#FFFFFF&quot;&gt;&lt;tr&gt;&lt;td&gt;
-&lt;A HREF=&quot;http&#58;//www.google.com/&quot;&gt;
-&lt;IMG SRC=&quot;http&#58;//www.google.com/logos/Logo_40wht.gif&quot;
-border=&quot;0&quot; ALT=&quot;Google&quot;&gt;&lt;/A&gt;
-&lt;/td&gt;
-&lt;td&gt;
-&lt;INPUT TYPE=text name=q size=31 maxlength=255 value=&quot;$1&quot;&gt;
-&lt;INPUT type=submit name=btnG VALUE=&quot;Google Search&quot;&gt;
-&lt;font size=-1&gt;
-&lt;input type=hidden name=domains value=&quot;http&#58;//tl.wiktionary.org&quot;&gt;&lt;br /&gt;&lt;input type=radio name=sitesearch value=&quot;&quot;&gt; WWW &lt;input type=radio name=sitesearch value=&quot;http&#58;//tl.wiktionary.org&quot; checked&gt; http&#58;//tl.wiktionary.org &lt;br /&gt;
-&lt;input type=&#39;hidden&#39; name=&#39;ie&#39; value=&#39;$2&#39;&gt;
-&lt;input type=&#39;hidden&#39; name=&#39;oe&#39; value=&#39;$2&#39;&gt;
-&lt;/font&gt;
-&lt;/td&gt;&lt;/tr&gt;&lt;/TABLE&gt;
-&lt;/FORM&gt;
-&lt;!-- SiteSearch Google --&gt;
-</td><td>
-{{int:Googlesearch}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Guesstimezone&action=edit guesstimezone]<br>
-[[MediaWiki_talk:Guesstimezone|Talk]]
-</td><td>
-Fill in from browser
-</td><td>
-{{int:Guesstimezone}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Headline_sample&action=edit headline_sample]<br>
-[[MediaWiki_talk:Headline_sample|Talk]]
-</td><td>
-Headline text
-</td><td>
-{{int:Headline_sample}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Headline_tip&action=edit headline_tip]<br>
-[[MediaWiki_talk:Headline_tip|Talk]]
-</td><td>
-Level 2 headline
-</td><td>
-{{int:Headline_tip}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Help&action=edit help]<br>
-[[MediaWiki_talk:Help|Talk]]
-</td><td>
-Help
-</td><td>
-{{int:Help}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Helppage&action=edit helppage]<br>
-[[MediaWiki_talk:Helppage|Talk]]
-</td><td>
-Help:Contents
-</td><td>
-{{int:Helppage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hide&action=edit hide]<br>
-[[MediaWiki_talk:Hide|Talk]]
-</td><td>
-hide
-</td><td>
-{{int:Hide}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hidetoc&action=edit hidetoc]<br>
-[[MediaWiki_talk:Hidetoc|Talk]]
-</td><td>
-hide
-</td><td>
-{{int:Hidetoc}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hist&action=edit hist]<br>
-[[MediaWiki_talk:Hist|Talk]]
-</td><td>
-hist
-</td><td>
-{{int:Hist}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Histlegend&action=edit histlegend]<br>
-[[MediaWiki_talk:Histlegend|Talk]]
-</td><td>
-Diff selection: mark the radio boxes of the versions to compare and hit enter or the button at the bottom.&lt;br/&gt;
-Legend: (cur) = difference with current version,
-(last) = difference with preceding version, M = minor edit.
-</td><td>
-{{int:Histlegend}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:History&action=edit history]<br>
-[[MediaWiki_talk:History|Talk]]
-</td><td>
-Page history
-</td><td>
-{{int:History}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:History_short&action=edit history_short]<br>
-[[MediaWiki_talk:History_short|Talk]]
-</td><td>
-History
-</td><td>
-{{int:History_short}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Historywarning&action=edit historywarning]<br>
-[[MediaWiki_talk:Historywarning|Talk]]
-</td><td>
-Warning: The page you are about to delete has a history:
-</td><td>
-{{int:Historywarning}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Hr_tip&action=edit hr_tip]<br>
-[[MediaWiki_talk:Hr_tip|Talk]]
-</td><td>
-Horizontal line (use sparingly)
-</td><td>
-{{int:Hr_tip}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ignorewarning&action=edit ignorewarning]<br>
-[[MediaWiki_talk:Ignorewarning|Talk]]
-</td><td>
-Ignore warning and save file anyway.
-</td><td>
-{{int:Ignorewarning}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ilshowmatch&action=edit ilshowmatch]<br>
-[[MediaWiki_talk:Ilshowmatch|Talk]]
-</td><td>
-Show all images with names matching
-</td><td>
-{{int:Ilshowmatch}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ilsubmit&action=edit ilsubmit]<br>
-[[MediaWiki_talk:Ilsubmit|Talk]]
-</td><td>
-Search
-</td><td>
-{{int:Ilsubmit}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Image_sample&action=edit image_sample]<br>
-[[MediaWiki_talk:Image_sample|Talk]]
-</td><td>
-Example.jpg
-</td><td>
-{{int:Image_sample}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Image_tip&action=edit image_tip]<br>
-[[MediaWiki_talk:Image_tip|Talk]]
-</td><td>
-Embedded image
-</td><td>
-{{int:Image_tip}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagelinks&action=edit imagelinks]<br>
-[[MediaWiki_talk:Imagelinks|Talk]]
-</td><td>
-Image links
-</td><td>
-{{int:Imagelinks}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagelist&action=edit imagelist]<br>
-[[MediaWiki_talk:Imagelist|Talk]]
-</td><td>
-Image list
-</td><td>
-{{int:Imagelist}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagelisttext&action=edit imagelisttext]<br>
-[[MediaWiki_talk:Imagelisttext|Talk]]
-</td><td>
-Below is a list of $1 images sorted $2.
-</td><td>
-{{int:Imagelisttext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagepage&action=edit imagepage]<br>
-[[MediaWiki_talk:Imagepage|Talk]]
-</td><td>
-View image page
-</td><td>
-{{int:Imagepage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imagereverted&action=edit imagereverted]<br>
-[[MediaWiki_talk:Imagereverted|Talk]]
-</td><td>
-Revert to earlier version was successful.
-</td><td>
-{{int:Imagereverted}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imgdelete&action=edit imgdelete]<br>
-[[MediaWiki_talk:Imgdelete|Talk]]
-</td><td>
-del
-</td><td>
-{{int:Imgdelete}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imgdesc&action=edit imgdesc]<br>
-[[MediaWiki_talk:Imgdesc|Talk]]
-</td><td>
-desc
-</td><td>
-{{int:Imgdesc}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imghistlegend&action=edit imghistlegend]<br>
-[[MediaWiki_talk:Imghistlegend|Talk]]
-</td><td>
-Legend: (cur) = this is the current image, (del) = delete
-this old version, (rev) = revert to this old version.
-&lt;br /&gt;&lt;i&gt;Click on date to see image uploaded on that date&lt;/i&gt;.
-</td><td>
-{{int:Imghistlegend}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imghistory&action=edit imghistory]<br>
-[[MediaWiki_talk:Imghistory|Talk]]
-</td><td>
-Image history
-</td><td>
-{{int:Imghistory}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Imglegend&action=edit imglegend]<br>
-[[MediaWiki_talk:Imglegend|Talk]]
-</td><td>
-Legend: (desc) = show/edit image description.
-</td><td>
-{{int:Imglegend}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Import&action=edit import]<br>
-[[MediaWiki_talk:Import|Talk]]
-</td><td>
-Import pages
-</td><td>
-{{int:Import}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importfailed&action=edit importfailed]<br>
-[[MediaWiki_talk:Importfailed|Talk]]
-</td><td>
-Import failed: $1
-</td><td>
-{{int:Importfailed}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importhistoryconflict&action=edit importhistoryconflict]<br>
-[[MediaWiki_talk:Importhistoryconflict|Talk]]
-</td><td>
-Conflicting history revision exists (may have imported this page before)
-</td><td>
-{{int:Importhistoryconflict}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importnotext&action=edit importnotext]<br>
-[[MediaWiki_talk:Importnotext|Talk]]
-</td><td>
-Empty or no text
-</td><td>
-{{int:Importnotext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importsuccess&action=edit importsuccess]<br>
-[[MediaWiki_talk:Importsuccess|Talk]]
-</td><td>
-Import succeeded!
-</td><td>
-{{int:Importsuccess}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Importtext&action=edit importtext]<br>
-[[MediaWiki_talk:Importtext|Talk]]
-</td><td>
-Please export the file from the source wiki using the Special:Export utility, save it to your disk and upload it here.
-</td><td>
-{{int:Importtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Infobox&action=edit infobox]<br>
-[[MediaWiki_talk:Infobox|Talk]]
-</td><td>
-Click a button to get an example text
-</td><td>
-{{int:Infobox}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Infobox_alert&action=edit infobox_alert]<br>
-[[MediaWiki_talk:Infobox_alert|Talk]]
-</td><td>
-Please enter the text you want to be formatted.\n It will be shown in the infobox for copy and pasting.\nExample:\n$1\nwill become:\n$2
-</td><td>
-{{int:Infobox_alert}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Internalerror&action=edit internalerror]<br>
-[[MediaWiki_talk:Internalerror|Talk]]
-</td><td>
-Internal error
-</td><td>
-{{int:Internalerror}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Intl&action=edit intl]<br>
-[[MediaWiki_talk:Intl|Talk]]
-</td><td>
-Interlanguage links
-</td><td>
-{{int:Intl}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ip_range_invalid&action=edit ip_range_invalid]<br>
-[[MediaWiki_talk:Ip_range_invalid|Talk]]
-</td><td>
-Invalid IP range.
-
-</td><td>
-{{int:Ip_range_invalid}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipaddress&action=edit ipaddress]<br>
-[[MediaWiki_talk:Ipaddress|Talk]]
-</td><td>
-IP Address/username
-</td><td>
-{{int:Ipaddress}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipb_expiry_invalid&action=edit ipb_expiry_invalid]<br>
-[[MediaWiki_talk:Ipb_expiry_invalid|Talk]]
-</td><td>
-Expiry time invalid.
-</td><td>
-{{int:Ipb_expiry_invalid}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipbexpiry&action=edit ipbexpiry]<br>
-[[MediaWiki_talk:Ipbexpiry|Talk]]
-</td><td>
-Expiry
-</td><td>
-{{int:Ipbexpiry}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipblocklist&action=edit ipblocklist]<br>
-[[MediaWiki_talk:Ipblocklist|Talk]]
-</td><td>
-List of blocked IP addresses and usernames
-</td><td>
-{{int:Ipblocklist}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipbreason&action=edit ipbreason]<br>
-[[MediaWiki_talk:Ipbreason|Talk]]
-</td><td>
-Reason
-</td><td>
-{{int:Ipbreason}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipbsubmit&action=edit ipbsubmit]<br>
-[[MediaWiki_talk:Ipbsubmit|Talk]]
-</td><td>
-Block this user
-</td><td>
-{{int:Ipbsubmit}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipusubmit&action=edit ipusubmit]<br>
-[[MediaWiki_talk:Ipusubmit|Talk]]
-</td><td>
-Unblock this address
-</td><td>
-{{int:Ipusubmit}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ipusuccess&action=edit ipusuccess]<br>
-[[MediaWiki_talk:Ipusuccess|Talk]]
-</td><td>
-&quot;$1&quot; unblocked
-</td><td>
-{{int:Ipusuccess}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Isbn&action=edit isbn]<br>
-[[MediaWiki_talk:Isbn|Talk]]
-</td><td>
-ISBN
-</td><td>
-{{int:Isbn}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Isredirect&action=edit isredirect]<br>
-[[MediaWiki_talk:Isredirect|Talk]]
-</td><td>
-redirect page
-</td><td>
-{{int:Isredirect}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Italic_sample&action=edit italic_sample]<br>
-[[MediaWiki_talk:Italic_sample|Talk]]
-</td><td>
-Italic text
-</td><td>
-{{int:Italic_sample}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Italic_tip&action=edit italic_tip]<br>
-[[MediaWiki_talk:Italic_tip|Talk]]
-</td><td>
-Italic text
-</td><td>
-{{int:Italic_tip}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Iteminvalidname&action=edit iteminvalidname]<br>
-[[MediaWiki_talk:Iteminvalidname|Talk]]
-</td><td>
-Problem with item &#39;$1&#39;, invalid name...
-</td><td>
-{{int:Iteminvalidname}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Largefile&action=edit largefile]<br>
-[[MediaWiki_talk:Largefile|Talk]]
-</td><td>
-It is recommended that images not exceed 100k in size.
-</td><td>
-{{int:Largefile}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Last&action=edit last]<br>
-[[MediaWiki_talk:Last|Talk]]
-</td><td>
-last
-</td><td>
-{{int:Last}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lastmodified&action=edit lastmodified]<br>
-[[MediaWiki_talk:Lastmodified|Talk]]
-</td><td>
-This page was last modified $1.
-</td><td>
-{{int:Lastmodified}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lastmodifiedby&action=edit lastmodifiedby]<br>
-[[MediaWiki_talk:Lastmodifiedby|Talk]]
-</td><td>
-This page was last modified $1 by $2.
-</td><td>
-{{int:Lastmodifiedby}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lineno&action=edit lineno]<br>
-[[MediaWiki_talk:Lineno|Talk]]
-</td><td>
-Line $1:
-</td><td>
-{{int:Lineno}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Link_sample&action=edit link_sample]<br>
-[[MediaWiki_talk:Link_sample|Talk]]
-</td><td>
-Link title
-</td><td>
-{{int:Link_sample}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Link_tip&action=edit link_tip]<br>
-[[MediaWiki_talk:Link_tip|Talk]]
-</td><td>
-Internal link
-</td><td>
-{{int:Link_tip}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linklistsub&action=edit linklistsub]<br>
-[[MediaWiki_talk:Linklistsub|Talk]]
-</td><td>
-(List of links)
-</td><td>
-{{int:Linklistsub}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linkshere&action=edit linkshere]<br>
-[[MediaWiki_talk:Linkshere|Talk]]
-</td><td>
-The following pages link to here:
-</td><td>
-{{int:Linkshere}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linkstoimage&action=edit linkstoimage]<br>
-[[MediaWiki_talk:Linkstoimage|Talk]]
-</td><td>
-The following pages link to this image:
-</td><td>
-{{int:Linkstoimage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Linktrail&action=edit linktrail]<br>
-[[MediaWiki_talk:Linktrail|Talk]]
-</td><td>
-/^(&#91;a-z]+)(.*)$/sD
-</td><td>
-{{int:Linktrail}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Listform&action=edit listform]<br>
-[[MediaWiki_talk:Listform|Talk]]
-</td><td>
-list
-</td><td>
-{{int:Listform}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Listusers&action=edit listusers]<br>
-[[MediaWiki_talk:Listusers|Talk]]
-</td><td>
-User list
-</td><td>
-{{int:Listusers}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loadhist&action=edit loadhist]<br>
-[[MediaWiki_talk:Loadhist|Talk]]
-</td><td>
-Loading page history
-</td><td>
-{{int:Loadhist}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loadingrev&action=edit loadingrev]<br>
-[[MediaWiki_talk:Loadingrev|Talk]]
-</td><td>
-loading revision for diff
-</td><td>
-{{int:Loadingrev}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Localtime&action=edit localtime]<br>
-[[MediaWiki_talk:Localtime|Talk]]
-</td><td>
-Local time display
-</td><td>
-{{int:Localtime}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockbtn&action=edit lockbtn]<br>
-[[MediaWiki_talk:Lockbtn|Talk]]
-</td><td>
-Lock database
-</td><td>
-{{int:Lockbtn}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockconfirm&action=edit lockconfirm]<br>
-[[MediaWiki_talk:Lockconfirm|Talk]]
-</td><td>
-Yes, I really want to lock the database.
-</td><td>
-{{int:Lockconfirm}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdb&action=edit lockdb]<br>
-[[MediaWiki_talk:Lockdb|Talk]]
-</td><td>
-Lock database
-</td><td>
-{{int:Lockdb}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdbsuccesssub&action=edit lockdbsuccesssub]<br>
-[[MediaWiki_talk:Lockdbsuccesssub|Talk]]
-</td><td>
-Database lock succeeded
-</td><td>
-{{int:Lockdbsuccesssub}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdbsuccesstext&action=edit lockdbsuccesstext]<br>
-[[MediaWiki_talk:Lockdbsuccesstext|Talk]]
-</td><td>
-The database has been locked.
-&lt;br /&gt;Remember to remove the lock after your maintenance is complete.
-</td><td>
-{{int:Lockdbsuccesstext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lockdbtext&action=edit lockdbtext]<br>
-[[MediaWiki_talk:Lockdbtext|Talk]]
-</td><td>
-Locking the database will suspend the ability of all
-users to edit pages, change their preferences, edit their watchlists, and
-other things requiring changes in the database.
-Please confirm that this is what you intend to do, and that you will
-unlock the database when your maintenance is done.
-</td><td>
-{{int:Lockdbtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Locknoconfirm&action=edit locknoconfirm]<br>
-[[MediaWiki_talk:Locknoconfirm|Talk]]
-</td><td>
-You did not check the confirmation box.
-</td><td>
-{{int:Locknoconfirm}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Login&action=edit login]<br>
-[[MediaWiki_talk:Login|Talk]]
-</td><td>
-Log in
-</td><td>
-{{int:Login}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginend&action=edit loginend]<br>
-[[MediaWiki_talk:Loginend|Talk]]
-</td><td>
-&amp;nbsp;
-</td><td>
-{{int:Loginend}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginerror&action=edit loginerror]<br>
-[[MediaWiki_talk:Loginerror|Talk]]
-</td><td>
-Login error
-</td><td>
-{{int:Loginerror}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginpagetitle&action=edit loginpagetitle]<br>
-[[MediaWiki_talk:Loginpagetitle|Talk]]
-</td><td>
-User login
-</td><td>
-{{int:Loginpagetitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginproblem&action=edit loginproblem]<br>
-[[MediaWiki_talk:Loginproblem|Talk]]
-</td><td>
-&lt;b&gt;There has been a problem with your login.&lt;/b&gt;&lt;br /&gt;Try again!
-</td><td>
-{{int:Loginproblem}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginprompt&action=edit loginprompt]<br>
-[[MediaWiki_talk:Loginprompt|Talk]]
-</td><td>
-You must have cookies enabled to log in to Wiktionary.
-</td><td>
-{{int:Loginprompt}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginreqtext&action=edit loginreqtext]<br>
-[[MediaWiki_talk:Loginreqtext|Talk]]
-</td><td>
-You must &#91;&#91;special:Userlogin&#124;login]] to view other pages.
-</td><td>
-{{int:Loginreqtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginreqtitle&action=edit loginreqtitle]<br>
-[[MediaWiki_talk:Loginreqtitle|Talk]]
-</td><td>
-Login Required
-</td><td>
-{{int:Loginreqtitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginsuccess&action=edit loginsuccess]<br>
-[[MediaWiki_talk:Loginsuccess|Talk]]
-</td><td>
-You are now logged in to Wiktionary as &quot;$1&quot;.
-</td><td>
-{{int:Loginsuccess}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Loginsuccesstitle&action=edit loginsuccesstitle]<br>
-[[MediaWiki_talk:Loginsuccesstitle|Talk]]
-</td><td>
-Login successful
-</td><td>
-{{int:Loginsuccesstitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Logout&action=edit logout]<br>
-[[MediaWiki_talk:Logout|Talk]]
-</td><td>
-Log out
-</td><td>
-{{int:Logout}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Logouttext&action=edit logouttext]<br>
-[[MediaWiki_talk:Logouttext|Talk]]
-</td><td>
-You are now logged out.
-You can continue to use Wiktionary anonymously, or you can log in
-again as the same or as a different user. Note that some pages may
-continue to be displayed as if you were still logged in, until you clear
-your browser cache
-
-</td><td>
-{{int:Logouttext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Logouttitle&action=edit logouttitle]<br>
-[[MediaWiki_talk:Logouttitle|Talk]]
-</td><td>
-User logout
-</td><td>
-{{int:Logouttitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Lonelypages&action=edit lonelypages]<br>
-[[MediaWiki_talk:Lonelypages|Talk]]
-</td><td>
-Orphaned pages
-</td><td>
-{{int:Lonelypages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Longpages&action=edit longpages]<br>
-[[MediaWiki_talk:Longpages|Talk]]
-</td><td>
-Long pages
-</td><td>
-{{int:Longpages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Longpagewarning&action=edit longpagewarning]<br>
-[[MediaWiki_talk:Longpagewarning|Talk]]
-</td><td>
-WARNING: This page is $1 kilobytes long; some
-browsers may have problems editing pages approaching or longer than 32kb.
-Please consider breaking the page into smaller sections.
-</td><td>
-{{int:Longpagewarning}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailerror&action=edit mailerror]<br>
-[[MediaWiki_talk:Mailerror|Talk]]
-</td><td>
-Error sending mail: $1
-</td><td>
-{{int:Mailerror}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailmypassword&action=edit mailmypassword]<br>
-[[MediaWiki_talk:Mailmypassword|Talk]]
-</td><td>
-Mail me a new password
-</td><td>
-{{int:Mailmypassword}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailnologin&action=edit mailnologin]<br>
-[[MediaWiki_talk:Mailnologin|Talk]]
-</td><td>
-No send address
-</td><td>
-{{int:Mailnologin}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mailnologintext&action=edit mailnologintext]<br>
-[[MediaWiki_talk:Mailnologintext|Talk]]
-</td><td>
-You must be &lt;a href=&quot;{{localurl:Special:Userlogin&quot;&gt;logged in&lt;/a&gt;
-and have a valid e-mail address in your &lt;a href=&quot;/wiki/Special:Preferences&quot;&gt;preferences&lt;/a&gt;
-to send e-mail to other users.
-</td><td>
-{{int:Mailnologintext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mainpage&action=edit mainpage]<br>
-[[MediaWiki_talk:Mainpage|Talk]]
-</td><td>
-Main Page
-</td><td>
-{{int:Mainpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mainpagedocfooter&action=edit mainpagedocfooter]<br>
-[[MediaWiki_talk:Mainpagedocfooter|Talk]]
-</td><td>
-Please see &#91;http&#58;//meta.wikipedia.org/wiki/MediaWiki_i18n documentation on customizing the interface]
-and the &#91;http&#58;//meta.wikipedia.org/wiki/MediaWiki_User%27s_Guide User&#39;s Guide] for usage and configuration help.
-</td><td>
-{{int:Mainpagedocfooter}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mainpagetext&action=edit mainpagetext]<br>
-[[MediaWiki_talk:Mainpagetext|Talk]]
-</td><td>
-Wiki software successfully installed.
-</td><td>
-{{int:Mainpagetext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Maintenance&action=edit maintenance]<br>
-[[MediaWiki_talk:Maintenance|Talk]]
-</td><td>
-Maintenance page
-</td><td>
-{{int:Maintenance}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Maintenancebacklink&action=edit maintenancebacklink]<br>
-[[MediaWiki_talk:Maintenancebacklink|Talk]]
-</td><td>
-Back to Maintenance Page
-</td><td>
-{{int:Maintenancebacklink}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Maintnancepagetext&action=edit maintnancepagetext]<br>
-[[MediaWiki_talk:Maintnancepagetext|Talk]]
-</td><td>
-This page includes several handy tools for everyday maintenance. Some of these functions tend to stress the database, so please do not hit reload after every item you fixed ;-)
-</td><td>
-{{int:Maintnancepagetext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysop&action=edit makesysop]<br>
-[[MediaWiki_talk:Makesysop|Talk]]
-</td><td>
-Make a user into a sysop
-</td><td>
-{{int:Makesysop}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopfail&action=edit makesysopfail]<br>
-[[MediaWiki_talk:Makesysopfail|Talk]]
-</td><td>
-&lt;b&gt;User &quot;$1&quot; could not be made into a sysop. (Did you enter the name correctly?)&lt;/b&gt;
-</td><td>
-{{int:Makesysopfail}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopname&action=edit makesysopname]<br>
-[[MediaWiki_talk:Makesysopname|Talk]]
-</td><td>
-Name of the user:
-</td><td>
-{{int:Makesysopname}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopok&action=edit makesysopok]<br>
-[[MediaWiki_talk:Makesysopok|Talk]]
-</td><td>
-&lt;b&gt;User &quot;$1&quot; is now a sysop&lt;/b&gt;
-</td><td>
-{{int:Makesysopok}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysopsubmit&action=edit makesysopsubmit]<br>
-[[MediaWiki_talk:Makesysopsubmit|Talk]]
-</td><td>
-Make this user into a sysop
-</td><td>
-{{int:Makesysopsubmit}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysoptext&action=edit makesysoptext]<br>
-[[MediaWiki_talk:Makesysoptext|Talk]]
-</td><td>
-This form is used by bureaucrats to turn ordinary users into administrators.
-Type the name of the user in the box and press the button to make the user an administrator
-</td><td>
-{{int:Makesysoptext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Makesysoptitle&action=edit makesysoptitle]<br>
-[[MediaWiki_talk:Makesysoptitle|Talk]]
-</td><td>
-Make a user into a sysop
-</td><td>
-{{int:Makesysoptitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Matchtotals&action=edit matchtotals]<br>
-[[MediaWiki_talk:Matchtotals|Talk]]
-</td><td>
-The query &quot;$1&quot; matched $2 page titles
-and the text of $3 pages.
-</td><td>
-{{int:Matchtotals}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math&action=edit math]<br>
-[[MediaWiki_talk:Math|Talk]]
-</td><td>
-Rendering math
-</td><td>
-{{int:Math}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_bad_output&action=edit math_bad_output]<br>
-[[MediaWiki_talk:Math_bad_output|Talk]]
-</td><td>
-Can&#39;t write to or create math output directory
-</td><td>
-{{int:Math_bad_output}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_bad_tmpdir&action=edit math_bad_tmpdir]<br>
-[[MediaWiki_talk:Math_bad_tmpdir|Talk]]
-</td><td>
-Can&#39;t write to or create math temp directory
-</td><td>
-{{int:Math_bad_tmpdir}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_failure&action=edit math_failure]<br>
-[[MediaWiki_talk:Math_failure|Talk]]
-</td><td>
-Failed to parse
-</td><td>
-{{int:Math_failure}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_image_error&action=edit math_image_error]<br>
-[[MediaWiki_talk:Math_image_error|Talk]]
-</td><td>
-PNG conversion failed; check for correct installation of latex, dvips, gs, and convert
-</td><td>
-{{int:Math_image_error}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_lexing_error&action=edit math_lexing_error]<br>
-[[MediaWiki_talk:Math_lexing_error|Talk]]
-</td><td>
-lexing error
-</td><td>
-{{int:Math_lexing_error}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_notexvc&action=edit math_notexvc]<br>
-[[MediaWiki_talk:Math_notexvc|Talk]]
-</td><td>
-Missing texvc executable; please see math/README to configure.
-</td><td>
-{{int:Math_notexvc}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_sample&action=edit math_sample]<br>
-[[MediaWiki_talk:Math_sample|Talk]]
-</td><td>
-Insert formula here
-</td><td>
-{{int:Math_sample}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_syntax_error&action=edit math_syntax_error]<br>
-[[MediaWiki_talk:Math_syntax_error|Talk]]
-</td><td>
-syntax error
-</td><td>
-{{int:Math_syntax_error}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_tip&action=edit math_tip]<br>
-[[MediaWiki_talk:Math_tip|Talk]]
-</td><td>
-Mathematical formula (LaTeX)
-</td><td>
-{{int:Math_tip}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_unknown_error&action=edit math_unknown_error]<br>
-[[MediaWiki_talk:Math_unknown_error|Talk]]
-</td><td>
-unknown error
-</td><td>
-{{int:Math_unknown_error}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Math_unknown_function&action=edit math_unknown_function]<br>
-[[MediaWiki_talk:Math_unknown_function|Talk]]
-</td><td>
-unknown function
-</td><td>
-{{int:Math_unknown_function}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Media_sample&action=edit media_sample]<br>
-[[MediaWiki_talk:Media_sample|Talk]]
-</td><td>
-Example.mp3
-</td><td>
-{{int:Media_sample}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Media_tip&action=edit media_tip]<br>
-[[MediaWiki_talk:Media_tip|Talk]]
-</td><td>
-Media file link
-</td><td>
-{{int:Media_tip}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Minlength&action=edit minlength]<br>
-[[MediaWiki_talk:Minlength|Talk]]
-</td><td>
-Image names must be at least three letters.
-</td><td>
-{{int:Minlength}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Minoredit&action=edit minoredit]<br>
-[[MediaWiki_talk:Minoredit|Talk]]
-</td><td>
-This is a minor edit
-</td><td>
-{{int:Minoredit}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Minoreditletter&action=edit minoreditletter]<br>
-[[MediaWiki_talk:Minoreditletter|Talk]]
-</td><td>
-M
-</td><td>
-{{int:Minoreditletter}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mispeelings&action=edit mispeelings]<br>
-[[MediaWiki_talk:Mispeelings|Talk]]
-</td><td>
-Pages with misspellings
-</td><td>
-{{int:Mispeelings}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mispeelingspage&action=edit mispeelingspage]<br>
-[[MediaWiki_talk:Mispeelingspage|Talk]]
-</td><td>
-List of common misspellings
-</td><td>
-{{int:Mispeelingspage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mispeelingstext&action=edit mispeelingstext]<br>
-[[MediaWiki_talk:Mispeelingstext|Talk]]
-</td><td>
-The following pages contain a common misspelling, which are listed on $1. The correct spelling might be given (like this).
-</td><td>
-{{int:Mispeelingstext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missingarticle&action=edit missingarticle]<br>
-[[MediaWiki_talk:Missingarticle|Talk]]
-</td><td>
-The database did not find the text of a page
-that it should have found, named &quot;$1&quot;.
-
-&lt;p&gt;This is usually caused by following an outdated diff or history link to a
-page that has been deleted.
-
-&lt;p&gt;If this is not the case, you may have found a bug in the software.
-Please report this to an administrator, making note of the URL.
-</td><td>
-{{int:Missingarticle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missingimage&action=edit missingimage]<br>
-[[MediaWiki_talk:Missingimage|Talk]]
-</td><td>
-&lt;b&gt;Missing image&lt;/b&gt;&lt;br /&gt;&lt;i&gt;$1&lt;/i&gt;
-
-</td><td>
-{{int:Missingimage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missinglanguagelinks&action=edit missinglanguagelinks]<br>
-[[MediaWiki_talk:Missinglanguagelinks|Talk]]
-</td><td>
-Missing Language Links
-</td><td>
-{{int:Missinglanguagelinks}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missinglanguagelinksbutton&action=edit missinglanguagelinksbutton]<br>
-[[MediaWiki_talk:Missinglanguagelinksbutton|Talk]]
-</td><td>
-Find missing language links for
-</td><td>
-{{int:Missinglanguagelinksbutton}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Missinglanguagelinkstext&action=edit missinglanguagelinkstext]<br>
-[[MediaWiki_talk:Missinglanguagelinkstext|Talk]]
-</td><td>
-These pages do &lt;i&gt;not&lt;/i&gt; link to their counterpart in $1. Redirects and subpages are &lt;i&gt;not&lt;/i&gt; shown.
-</td><td>
-{{int:Missinglanguagelinkstext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Moredotdotdot&action=edit moredotdotdot]<br>
-[[MediaWiki_talk:Moredotdotdot|Talk]]
-</td><td>
-More...
-</td><td>
-{{int:Moredotdotdot}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Move&action=edit move]<br>
-[[MediaWiki_talk:Move|Talk]]
-</td><td>
-Move
-</td><td>
-{{int:Move}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movearticle&action=edit movearticle]<br>
-[[MediaWiki_talk:Movearticle|Talk]]
-</td><td>
-Move page
-</td><td>
-{{int:Movearticle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movedto&action=edit movedto]<br>
-[[MediaWiki_talk:Movedto|Talk]]
-</td><td>
-moved to
-</td><td>
-{{int:Movedto}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movenologin&action=edit movenologin]<br>
-[[MediaWiki_talk:Movenologin|Talk]]
-</td><td>
-Not logged in
-</td><td>
-{{int:Movenologin}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movenologintext&action=edit movenologintext]<br>
-[[MediaWiki_talk:Movenologintext|Talk]]
-</td><td>
-You must be a registered user and &lt;a href=&quot;/wiki/Special:Userlogin&quot;&gt;logged in&lt;/a&gt;
-to move a page.
-</td><td>
-{{int:Movenologintext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepage&action=edit movepage]<br>
-[[MediaWiki_talk:Movepage|Talk]]
-</td><td>
-Move page
-</td><td>
-{{int:Movepage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepagebtn&action=edit movepagebtn]<br>
-[[MediaWiki_talk:Movepagebtn|Talk]]
-</td><td>
-Move page
-</td><td>
-{{int:Movepagebtn}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepagetalktext&action=edit movepagetalktext]<br>
-[[MediaWiki_talk:Movepagetalktext|Talk]]
-</td><td>
-The associated talk page, if any, will be automatically moved along with it &#39;&#39;&#39;unless:&#39;&#39;&#39;
-*You are moving the page across namespaces,
-*A non-empty talk page already exists under the new name, or
-*You uncheck the box below.
-
-In those cases, you will have to move or merge the page manually if desired.
-</td><td>
-{{int:Movepagetalktext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movepagetext&action=edit movepagetext]<br>
-[[MediaWiki_talk:Movepagetext|Talk]]
-</td><td>
-Using the form below will rename a page, moving all
-of its history to the new name.
-The old title will become a redirect page to the new title.
-Links to the old page title will not be changed; be sure to
-&#91;&#91;Special:Maintenance&#124;check]] for double or broken redirects.
-You are responsible for making sure that links continue to
-point where they are supposed to go.
-
-Note that the page will &#39;&#39;&#39;not&#39;&#39;&#39; be moved if there is already
-a page at the new title, unless it is empty or a redirect and has no
-past edit history. This means that you can rename a page back to where
-it was just renamed from if you make a mistake, and you cannot overwrite
-an existing page.
-
-&lt;b&gt;WARNING!&lt;/b&gt;
-This can be a drastic and unexpected change for a popular page;
-please be sure you understand the consequences of this before
-proceeding.
-</td><td>
-{{int:Movepagetext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movetalk&action=edit movetalk]<br>
-[[MediaWiki_talk:Movetalk|Talk]]
-</td><td>
-Move &quot;talk&quot; page as well, if applicable.
-</td><td>
-{{int:Movetalk}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Movethispage&action=edit movethispage]<br>
-[[MediaWiki_talk:Movethispage|Talk]]
-</td><td>
-Move this page
-</td><td>
-{{int:Movethispage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mycontris&action=edit mycontris]<br>
-[[MediaWiki_talk:Mycontris|Talk]]
-</td><td>
-My contributions
-</td><td>
-{{int:Mycontris}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mypage&action=edit mypage]<br>
-[[MediaWiki_talk:Mypage|Talk]]
-</td><td>
-My page
-</td><td>
-{{int:Mypage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Mytalk&action=edit mytalk]<br>
-[[MediaWiki_talk:Mytalk|Talk]]
-</td><td>
-My talk
-</td><td>
-{{int:Mytalk}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Navigation&action=edit navigation]<br>
-[[MediaWiki_talk:Navigation|Talk]]
-</td><td>
-Navigation
-</td><td>
-{{int:Navigation}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nbytes&action=edit nbytes]<br>
-[[MediaWiki_talk:Nbytes|Talk]]
-</td><td>
-$1 bytes
-</td><td>
-{{int:Nbytes}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nchanges&action=edit nchanges]<br>
-[[MediaWiki_talk:Nchanges|Talk]]
-</td><td>
-$1 changes
-</td><td>
-{{int:Nchanges}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newarticle&action=edit newarticle]<br>
-[[MediaWiki_talk:Newarticle|Talk]]
-</td><td>
-(New)
-</td><td>
-{{int:Newarticle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newarticletext&action=edit newarticletext]<br>
-[[MediaWiki_talk:Newarticletext|Talk]]
-</td><td>
-You&#39;ve followed a link to a page that doesn&#39;t exist yet.
-To create the page, start typing in the box below
-(see the &#91;&#91;Wiktionary:Help&#124;help page]] for more info).
-If you are here by mistake, just click your browser&#39;s &#39;&#39;&#39;back&#39;&#39;&#39; button.
-</td><td>
-{{int:Newarticletext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newmessages&action=edit newmessages]<br>
-[[MediaWiki_talk:Newmessages|Talk]]
-</td><td>
-You have $1.
-</td><td>
-{{int:Newmessages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newmessageslink&action=edit newmessageslink]<br>
-[[MediaWiki_talk:Newmessageslink|Talk]]
-</td><td>
-new messages
-</td><td>
-{{int:Newmessageslink}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpage&action=edit newpage]<br>
-[[MediaWiki_talk:Newpage|Talk]]
-</td><td>
-New page
-</td><td>
-{{int:Newpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpageletter&action=edit newpageletter]<br>
-[[MediaWiki_talk:Newpageletter|Talk]]
-</td><td>
-N
-</td><td>
-{{int:Newpageletter}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpages&action=edit newpages]<br>
-[[MediaWiki_talk:Newpages|Talk]]
-</td><td>
-New pages
-</td><td>
-{{int:Newpages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newpassword&action=edit newpassword]<br>
-[[MediaWiki_talk:Newpassword|Talk]]
-</td><td>
-New password
-</td><td>
-{{int:Newpassword}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newtitle&action=edit newtitle]<br>
-[[MediaWiki_talk:Newtitle|Talk]]
-</td><td>
-To new title
-</td><td>
-{{int:Newtitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Newusersonly&action=edit newusersonly]<br>
-[[MediaWiki_talk:Newusersonly|Talk]]
-</td><td>
- (new users only)
-</td><td>
-{{int:Newusersonly}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Next&action=edit next]<br>
-[[MediaWiki_talk:Next|Talk]]
-</td><td>
-next
-</td><td>
-{{int:Next}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nextn&action=edit nextn]<br>
-[[MediaWiki_talk:Nextn|Talk]]
-</td><td>
-next $1
-</td><td>
-{{int:Nextn}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nlinks&action=edit nlinks]<br>
-[[MediaWiki_talk:Nlinks|Talk]]
-</td><td>
-$1 links
-</td><td>
-{{int:Nlinks}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noaffirmation&action=edit noaffirmation]<br>
-[[MediaWiki_talk:Noaffirmation|Talk]]
-</td><td>
-You must affirm that your upload does not violate
-any copyrights.
-</td><td>
-{{int:Noaffirmation}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noarticletext&action=edit noarticletext]<br>
-[[MediaWiki_talk:Noarticletext|Talk]]
-</td><td>
-(There is currently no text in this page)
-</td><td>
-{{int:Noarticletext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noblockreason&action=edit noblockreason]<br>
-[[MediaWiki_talk:Noblockreason|Talk]]
-</td><td>
-You must supply a reason for the block.
-</td><td>
-{{int:Noblockreason}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noconnect&action=edit noconnect]<br>
-[[MediaWiki_talk:Noconnect|Talk]]
-</td><td>
-Sorry! The wiki is experiencing some technical difficulties, and cannot contact the database server.
-</td><td>
-{{int:Noconnect}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocontribs&action=edit nocontribs]<br>
-[[MediaWiki_talk:Nocontribs|Talk]]
-</td><td>
-No changes were found matching these criteria.
-</td><td>
-{{int:Nocontribs}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocookieslogin&action=edit nocookieslogin]<br>
-[[MediaWiki_talk:Nocookieslogin|Talk]]
-</td><td>
-Wiktionary uses cookies to log in users. You have cookies disabled. Please enable them and try again.
-</td><td>
-{{int:Nocookieslogin}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocookiesnew&action=edit nocookiesnew]<br>
-[[MediaWiki_talk:Nocookiesnew|Talk]]
-</td><td>
-The user account was created, but you are not logged in. Wiktionary uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.
-</td><td>
-{{int:Nocookiesnew}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nocreativecommons&action=edit nocreativecommons]<br>
-[[MediaWiki_talk:Nocreativecommons|Talk]]
-</td><td>
-Creative Commons RDF metadata disabled for this server.
-</td><td>
-{{int:Nocreativecommons}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nodb&action=edit nodb]<br>
-[[MediaWiki_talk:Nodb|Talk]]
-</td><td>
-Could not select database $1
-</td><td>
-{{int:Nodb}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nodublincore&action=edit nodublincore]<br>
-[[MediaWiki_talk:Nodublincore|Talk]]
-</td><td>
-Dublin Core RDF metadata disabled for this server.
-</td><td>
-{{int:Nodublincore}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noemail&action=edit noemail]<br>
-[[MediaWiki_talk:Noemail|Talk]]
-</td><td>
-There is no e-mail address recorded for user &quot;$1&quot;.
-</td><td>
-{{int:Noemail}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noemailtext&action=edit noemailtext]<br>
-[[MediaWiki_talk:Noemailtext|Talk]]
-</td><td>
-This user has not specified a valid e-mail address,
-or has chosen not to receive e-mail from other users.
-</td><td>
-{{int:Noemailtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noemailtitle&action=edit noemailtitle]<br>
-[[MediaWiki_talk:Noemailtitle|Talk]]
-</td><td>
-No e-mail address
-</td><td>
-{{int:Noemailtitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nogomatch&action=edit nogomatch]<br>
-[[MediaWiki_talk:Nogomatch|Talk]]
-</td><td>
-No page with this exact title exists, trying full text search.
-</td><td>
-{{int:Nogomatch}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nohistory&action=edit nohistory]<br>
-[[MediaWiki_talk:Nohistory|Talk]]
-</td><td>
-There is no edit history for this page.
-</td><td>
-{{int:Nohistory}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nolinkshere&action=edit nolinkshere]<br>
-[[MediaWiki_talk:Nolinkshere|Talk]]
-</td><td>
-No pages link to here.
-</td><td>
-{{int:Nolinkshere}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nolinkstoimage&action=edit nolinkstoimage]<br>
-[[MediaWiki_talk:Nolinkstoimage|Talk]]
-</td><td>
-There are no pages that link to this image.
-</td><td>
-{{int:Nolinkstoimage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Noname&action=edit noname]<br>
-[[MediaWiki_talk:Noname|Talk]]
-</td><td>
-You have not specified a valid user name.
-</td><td>
-{{int:Noname}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nonefound&action=edit nonefound]<br>
-[[MediaWiki_talk:Nonefound|Talk]]
-</td><td>
-&lt;strong&gt;Note&lt;/strong&gt;: unsuccessful searches are
-often caused by searching for common words like &quot;have&quot; and &quot;from&quot;,
-which are not indexed, or by specifying more than one search term (only pages
-containing all of the search terms will appear in the result).
-</td><td>
-{{int:Nonefound}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nospecialpagetext&action=edit nospecialpagetext]<br>
-[[MediaWiki_talk:Nospecialpagetext|Talk]]
-</td><td>
-You have requested a special page that is not
-recognized by the wiki.
-</td><td>
-{{int:Nospecialpagetext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchaction&action=edit nosuchaction]<br>
-[[MediaWiki_talk:Nosuchaction|Talk]]
-</td><td>
-No such action
-</td><td>
-{{int:Nosuchaction}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchactiontext&action=edit nosuchactiontext]<br>
-[[MediaWiki_talk:Nosuchactiontext|Talk]]
-</td><td>
-The action specified by the URL is not
-recognized by the wiki
-</td><td>
-{{int:Nosuchactiontext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchspecialpage&action=edit nosuchspecialpage]<br>
-[[MediaWiki_talk:Nosuchspecialpage|Talk]]
-</td><td>
-No such special page
-</td><td>
-{{int:Nosuchspecialpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nosuchuser&action=edit nosuchuser]<br>
-[[MediaWiki_talk:Nosuchuser|Talk]]
-</td><td>
-There is no user by the name &quot;$1&quot;.
-Check your spelling, or use the form below to create a new user account.
-</td><td>
-{{int:Nosuchuser}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notacceptable&action=edit notacceptable]<br>
-[[MediaWiki_talk:Notacceptable|Talk]]
-</td><td>
-The wiki server can&#39;t provide data in a format your client can read.
-</td><td>
-{{int:Notacceptable}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notanarticle&action=edit notanarticle]<br>
-[[MediaWiki_talk:Notanarticle|Talk]]
-</td><td>
-Not a content page
-</td><td>
-{{int:Notanarticle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notargettext&action=edit notargettext]<br>
-[[MediaWiki_talk:Notargettext|Talk]]
-</td><td>
-You have not specified a target page or user
-to perform this function on.
-</td><td>
-{{int:Notargettext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notargettitle&action=edit notargettitle]<br>
-[[MediaWiki_talk:Notargettitle|Talk]]
-</td><td>
-No target
-</td><td>
-{{int:Notargettitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Note&action=edit note]<br>
-[[MediaWiki_talk:Note|Talk]]
-</td><td>
-&lt;strong&gt;Note:&lt;/strong&gt;
-</td><td>
-{{int:Note}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notextmatches&action=edit notextmatches]<br>
-[[MediaWiki_talk:Notextmatches|Talk]]
-</td><td>
-No page text matches
-</td><td>
-{{int:Notextmatches}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notitlematches&action=edit notitlematches]<br>
-[[MediaWiki_talk:Notitlematches|Talk]]
-</td><td>
-No page title matches
-</td><td>
-{{int:Notitlematches}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Notloggedin&action=edit notloggedin]<br>
-[[MediaWiki_talk:Notloggedin|Talk]]
-</td><td>
-Not logged in
-</td><td>
-{{int:Notloggedin}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nowatchlist&action=edit nowatchlist]<br>
-[[MediaWiki_talk:Nowatchlist|Talk]]
-</td><td>
-You have no items on your watchlist.
-</td><td>
-{{int:Nowatchlist}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nowiki_sample&action=edit nowiki_sample]<br>
-[[MediaWiki_talk:Nowiki_sample|Talk]]
-</td><td>
-Insert non-formatted text here
-</td><td>
-{{int:Nowiki_sample}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nowiki_tip&action=edit nowiki_tip]<br>
-[[MediaWiki_talk:Nowiki_tip|Talk]]
-</td><td>
-Ignore wiki formatting
-</td><td>
-{{int:Nowiki_tip}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-category&action=edit nstab-category]<br>
-[[MediaWiki_talk:Nstab-category|Talk]]
-</td><td>
-Category
-</td><td>
-{{int:Nstab-category}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-help&action=edit nstab-help]<br>
-[[MediaWiki_talk:Nstab-help|Talk]]
-</td><td>
-Help
-</td><td>
-{{int:Nstab-help}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-image&action=edit nstab-image]<br>
-[[MediaWiki_talk:Nstab-image|Talk]]
-</td><td>
-Image
-</td><td>
-{{int:Nstab-image}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-main&action=edit nstab-main]<br>
-[[MediaWiki_talk:Nstab-main|Talk]]
-</td><td>
-Article
-</td><td>
-{{int:Nstab-main}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-media&action=edit nstab-media]<br>
-[[MediaWiki_talk:Nstab-media|Talk]]
-</td><td>
-Media
-</td><td>
-{{int:Nstab-media}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-mediawiki&action=edit nstab-mediawiki]<br>
-[[MediaWiki_talk:Nstab-mediawiki|Talk]]
-</td><td>
-Message
-</td><td>
-{{int:Nstab-mediawiki}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-special&action=edit nstab-special]<br>
-[[MediaWiki_talk:Nstab-special|Talk]]
-</td><td>
-Special
-</td><td>
-{{int:Nstab-special}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-template&action=edit nstab-template]<br>
-[[MediaWiki_talk:Nstab-template|Talk]]
-</td><td>
-Template
-</td><td>
-{{int:Nstab-template}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-user&action=edit nstab-user]<br>
-[[MediaWiki_talk:Nstab-user|Talk]]
-</td><td>
-User page
-</td><td>
-{{int:Nstab-user}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nstab-wp&action=edit nstab-wp]<br>
-[[MediaWiki_talk:Nstab-wp|Talk]]
-</td><td>
-About
-</td><td>
-{{int:Nstab-wp}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Nviews&action=edit nviews]<br>
-[[MediaWiki_talk:Nviews|Talk]]
-</td><td>
-$1 views
-</td><td>
-{{int:Nviews}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ok&action=edit ok]<br>
-[[MediaWiki_talk:Ok|Talk]]
-</td><td>
-OK
-</td><td>
-{{int:Ok}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Oldpassword&action=edit oldpassword]<br>
-[[MediaWiki_talk:Oldpassword|Talk]]
-</td><td>
-Old password
-</td><td>
-{{int:Oldpassword}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Orig&action=edit orig]<br>
-[[MediaWiki_talk:Orig|Talk]]
-</td><td>
-orig
-</td><td>
-{{int:Orig}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Orphans&action=edit orphans]<br>
-[[MediaWiki_talk:Orphans|Talk]]
-</td><td>
-Orphaned pages
-</td><td>
-{{int:Orphans}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Othercontribs&action=edit othercontribs]<br>
-[[MediaWiki_talk:Othercontribs|Talk]]
-</td><td>
-Based on work by $1.
-</td><td>
-{{int:Othercontribs}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Otherlanguages&action=edit otherlanguages]<br>
-[[MediaWiki_talk:Otherlanguages|Talk]]
-</td><td>
-Other languages
-</td><td>
-{{int:Otherlanguages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Pagemovedsub&action=edit pagemovedsub]<br>
-[[MediaWiki_talk:Pagemovedsub|Talk]]
-</td><td>
-Move succeeded
-</td><td>
-{{int:Pagemovedsub}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Pagemovedtext&action=edit pagemovedtext]<br>
-[[MediaWiki_talk:Pagemovedtext|Talk]]
-</td><td>
-Page &quot;&#91;&#91;$1]]&quot; moved to &quot;&#91;&#91;$2]]&quot;.
-</td><td>
-{{int:Pagemovedtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Pagetitle&action=edit pagetitle]<br>
-[[MediaWiki_talk:Pagetitle|Talk]]
-</td><td>
-$1 - Wiktionary
-</td><td>
-{{int:Pagetitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Passwordremindertext&action=edit passwordremindertext]<br>
-[[MediaWiki_talk:Passwordremindertext|Talk]]
-</td><td>
-Someone (probably you, from IP address $1)
-requested that we send you a new Wiktionary login password.
-The password for user &quot;$2&quot; is now &quot;$3&quot;.
-You should log in and change your password now.
-</td><td>
-{{int:Passwordremindertext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Passwordremindertitle&action=edit passwordremindertitle]<br>
-[[MediaWiki_talk:Passwordremindertitle|Talk]]
-</td><td>
-Password reminder from Wiktionary
-</td><td>
-{{int:Passwordremindertitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Passwordsent&action=edit passwordsent]<br>
-[[MediaWiki_talk:Passwordsent|Talk]]
-</td><td>
-A new password has been sent to the e-mail address
-registered for &quot;$1&quot;.
-Please log in again after you receive it.
-</td><td>
-{{int:Passwordsent}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Perfcached&action=edit perfcached]<br>
-[[MediaWiki_talk:Perfcached|Talk]]
-</td><td>
-The following data is cached and may not be completely up to date:
-</td><td>
-{{int:Perfcached}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Perfdisabled&action=edit perfdisabled]<br>
-[[MediaWiki_talk:Perfdisabled|Talk]]
-</td><td>
-Sorry! This feature has been temporarily disabled
-because it slows the database down to the point that no one can use
-the wiki.
-</td><td>
-{{int:Perfdisabled}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Perfdisabledsub&action=edit perfdisabledsub]<br>
-[[MediaWiki_talk:Perfdisabledsub|Talk]]
-</td><td>
-Here&#39;s a saved copy from $1:
-</td><td>
-{{int:Perfdisabledsub}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Personaltools&action=edit personaltools]<br>
-[[MediaWiki_talk:Personaltools|Talk]]
-</td><td>
-Personal tools
-</td><td>
-{{int:Personaltools}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Popularpages&action=edit popularpages]<br>
-[[MediaWiki_talk:Popularpages|Talk]]
-</td><td>
-Popular pages
-</td><td>
-{{int:Popularpages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Portal&action=edit portal]<br>
-[[MediaWiki_talk:Portal|Talk]]
-</td><td>
-Community portal
-</td><td>
-{{int:Portal}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Portal-url&action=edit portal-url]<br>
-[[MediaWiki_talk:Portal-url|Talk]]
-</td><td>
-Wiktionary:Community Portal
-</td><td>
-{{int:Portal-url}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Postcomment&action=edit postcomment]<br>
-[[MediaWiki_talk:Postcomment|Talk]]
-</td><td>
-Post a comment
-</td><td>
-{{int:Postcomment}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Poweredby&action=edit poweredby]<br>
-[[MediaWiki_talk:Poweredby|Talk]]
-</td><td>
-Wiktionary is powered by &#91;http&#58;//www.mediawiki.org/ MediaWiki], an open source wiki engine.
-</td><td>
-{{int:Poweredby}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Powersearch&action=edit powersearch]<br>
-[[MediaWiki_talk:Powersearch|Talk]]
-</td><td>
-Search
-</td><td>
-{{int:Powersearch}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Powersearchtext&action=edit powersearchtext]<br>
-[[MediaWiki_talk:Powersearchtext|Talk]]
-</td><td>
-
-Search in namespaces :&lt;br /&gt;
-$1&lt;br /&gt;
-$2 List redirects &amp;nbsp; Search for $3 $9
-</td><td>
-{{int:Powersearchtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Preferences&action=edit preferences]<br>
-[[MediaWiki_talk:Preferences|Talk]]
-</td><td>
-Preferences
-</td><td>
-{{int:Preferences}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-help-userdata&action=edit prefs-help-userdata]<br>
-[[MediaWiki_talk:Prefs-help-userdata|Talk]]
-</td><td>
-* &lt;strong&gt;Real name&lt;/strong&gt; (optional): if you choose to provide it this will be used for giving you attribution for your work.&lt;br/&gt;
-* &lt;strong&gt;Email&lt;/strong&gt; (optional): Enables people to contact you through the website without you having to reveal your
-email address to them, and it can be used to send you a new password if you forget it.
-</td><td>
-{{int:Prefs-help-userdata}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-misc&action=edit prefs-misc]<br>
-[[MediaWiki_talk:Prefs-misc|Talk]]
-</td><td>
-Misc settings
-</td><td>
-{{int:Prefs-misc}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-personal&action=edit prefs-personal]<br>
-[[MediaWiki_talk:Prefs-personal|Talk]]
-</td><td>
-User data
-</td><td>
-{{int:Prefs-personal}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefs-rc&action=edit prefs-rc]<br>
-[[MediaWiki_talk:Prefs-rc|Talk]]
-</td><td>
-Recent changes and stub display
-</td><td>
-{{int:Prefs-rc}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefslogintext&action=edit prefslogintext]<br>
-[[MediaWiki_talk:Prefslogintext|Talk]]
-</td><td>
-You are logged in as &quot;$1&quot;.
-Your internal ID number is $2.
-
-See &#91;&#91;Wiktionary:User preferences help]] for help deciphering the options.
-</td><td>
-{{int:Prefslogintext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefsnologin&action=edit prefsnologin]<br>
-[[MediaWiki_talk:Prefsnologin|Talk]]
-</td><td>
-Not logged in
-</td><td>
-{{int:Prefsnologin}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefsnologintext&action=edit prefsnologintext]<br>
-[[MediaWiki_talk:Prefsnologintext|Talk]]
-</td><td>
-You must be &lt;a href=&quot;/wiki/Special:Userlogin&quot;&gt;logged in&lt;/a&gt;
-to set user preferences.
-</td><td>
-{{int:Prefsnologintext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prefsreset&action=edit prefsreset]<br>
-[[MediaWiki_talk:Prefsreset|Talk]]
-</td><td>
-Preferences have been reset from storage.
-</td><td>
-{{int:Prefsreset}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Preview&action=edit preview]<br>
-[[MediaWiki_talk:Preview|Talk]]
-</td><td>
-Preview
-</td><td>
-{{int:Preview}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Previewconflict&action=edit previewconflict]<br>
-[[MediaWiki_talk:Previewconflict|Talk]]
-</td><td>
-This preview reflects the text in the upper
-text editing area as it will appear if you choose to save.
-</td><td>
-{{int:Previewconflict}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Previewnote&action=edit previewnote]<br>
-[[MediaWiki_talk:Previewnote|Talk]]
-</td><td>
-Remember that this is only a preview, and has not yet been saved!
-</td><td>
-{{int:Previewnote}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Prevn&action=edit prevn]<br>
-[[MediaWiki_talk:Prevn|Talk]]
-</td><td>
-previous $1
-</td><td>
-{{int:Prevn}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Printableversion&action=edit printableversion]<br>
-[[MediaWiki_talk:Printableversion|Talk]]
-</td><td>
-Printable version
-</td><td>
-{{int:Printableversion}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Printsubtitle&action=edit printsubtitle]<br>
-[[MediaWiki_talk:Printsubtitle|Talk]]
-</td><td>
-(From http&#58;//tl.wiktionary.org)
-</td><td>
-{{int:Printsubtitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protect&action=edit protect]<br>
-[[MediaWiki_talk:Protect|Talk]]
-</td><td>
-Protect
-</td><td>
-{{int:Protect}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectcomment&action=edit protectcomment]<br>
-[[MediaWiki_talk:Protectcomment|Talk]]
-</td><td>
-Reason for protecting
-</td><td>
-{{int:Protectcomment}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedarticle&action=edit protectedarticle]<br>
-[[MediaWiki_talk:Protectedarticle|Talk]]
-</td><td>
-protected &#91;&#91;$1]]
-</td><td>
-{{int:Protectedarticle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedpage&action=edit protectedpage]<br>
-[[MediaWiki_talk:Protectedpage|Talk]]
-</td><td>
-Protected page
-</td><td>
-{{int:Protectedpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedpagewarning&action=edit protectedpagewarning]<br>
-[[MediaWiki_talk:Protectedpagewarning|Talk]]
-</td><td>
-WARNING: This page has been locked so that only
-users with sysop privileges can edit it. Be sure you are following the
-&lt;a href=&#39;/w/wiki.phtml/Wiktionary:Protected_page_guidelines&#39;&gt;protected page
-guidelines&lt;/a&gt;.
-</td><td>
-{{int:Protectedpagewarning}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectedtext&action=edit protectedtext]<br>
-[[MediaWiki_talk:Protectedtext|Talk]]
-</td><td>
-This page has been locked to prevent editing; there are
-a number of reasons why this may be so, please see
-&#91;&#91;Wiktionary:Protected page]].
-
-You can view and copy the source of this page:
-</td><td>
-{{int:Protectedtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectlogpage&action=edit protectlogpage]<br>
-[[MediaWiki_talk:Protectlogpage|Talk]]
-</td><td>
-Protection_log
-</td><td>
-{{int:Protectlogpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectlogtext&action=edit protectlogtext]<br>
-[[MediaWiki_talk:Protectlogtext|Talk]]
-</td><td>
-Below is a list of page locks/unlocks.
-See &#91;&#91;Wiktionary:Protected page]] for more information.
-</td><td>
-{{int:Protectlogtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectpage&action=edit protectpage]<br>
-[[MediaWiki_talk:Protectpage|Talk]]
-</td><td>
-Protect page
-</td><td>
-{{int:Protectpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectreason&action=edit protectreason]<br>
-[[MediaWiki_talk:Protectreason|Talk]]
-</td><td>
-(give a reason)
-</td><td>
-{{int:Protectreason}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectsub&action=edit protectsub]<br>
-[[MediaWiki_talk:Protectsub|Talk]]
-</td><td>
-(Protecting &quot;$1&quot;)
-</td><td>
-{{int:Protectsub}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Protectthispage&action=edit protectthispage]<br>
-[[MediaWiki_talk:Protectthispage|Talk]]
-</td><td>
-Protect this page
-</td><td>
-{{int:Protectthispage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Proxyblocker&action=edit proxyblocker]<br>
-[[MediaWiki_talk:Proxyblocker|Talk]]
-</td><td>
-Proxy blocker
-</td><td>
-{{int:Proxyblocker}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Proxyblockreason&action=edit proxyblockreason]<br>
-[[MediaWiki_talk:Proxyblockreason|Talk]]
-</td><td>
-Your IP address has been blocked because it is an open proxy. Please contact your Internet service provider or tech support and inform them of this serious security problem.
-</td><td>
-{{int:Proxyblockreason}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Proxyblocksuccess&action=edit proxyblocksuccess]<br>
-[[MediaWiki_talk:Proxyblocksuccess|Talk]]
-</td><td>
-Done.
-
-</td><td>
-{{int:Proxyblocksuccess}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbbrowse&action=edit qbbrowse]<br>
-[[MediaWiki_talk:Qbbrowse|Talk]]
-</td><td>
-Browse
-</td><td>
-{{int:Qbbrowse}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbedit&action=edit qbedit]<br>
-[[MediaWiki_talk:Qbedit|Talk]]
-</td><td>
-Edit
-</td><td>
-{{int:Qbedit}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbfind&action=edit qbfind]<br>
-[[MediaWiki_talk:Qbfind|Talk]]
-</td><td>
-Find
-</td><td>
-{{int:Qbfind}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbmyoptions&action=edit qbmyoptions]<br>
-[[MediaWiki_talk:Qbmyoptions|Talk]]
-</td><td>
-My pages
-</td><td>
-{{int:Qbmyoptions}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbpageinfo&action=edit qbpageinfo]<br>
-[[MediaWiki_talk:Qbpageinfo|Talk]]
-</td><td>
-Context
-</td><td>
-{{int:Qbpageinfo}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbpageoptions&action=edit qbpageoptions]<br>
-[[MediaWiki_talk:Qbpageoptions|Talk]]
-</td><td>
-This page
-</td><td>
-{{int:Qbpageoptions}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbsettings&action=edit qbsettings]<br>
-[[MediaWiki_talk:Qbsettings|Talk]]
-</td><td>
-Quickbar settings
-</td><td>
-{{int:Qbsettings}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Qbspecialpages&action=edit qbspecialpages]<br>
-[[MediaWiki_talk:Qbspecialpages|Talk]]
-</td><td>
-Special pages
-</td><td>
-{{int:Qbspecialpages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Querybtn&action=edit querybtn]<br>
-[[MediaWiki_talk:Querybtn|Talk]]
-</td><td>
-Submit query
-</td><td>
-{{int:Querybtn}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Querysuccessful&action=edit querysuccessful]<br>
-[[MediaWiki_talk:Querysuccessful|Talk]]
-</td><td>
-Query successful
-</td><td>
-{{int:Querysuccessful}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Randompage&action=edit randompage]<br>
-[[MediaWiki_talk:Randompage|Talk]]
-</td><td>
-Random page
-</td><td>
-{{int:Randompage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Range_block_disabled&action=edit range_block_disabled]<br>
-[[MediaWiki_talk:Range_block_disabled|Talk]]
-</td><td>
-The sysop ability to create range blocks is disabled.
-</td><td>
-{{int:Range_block_disabled}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rchide&action=edit rchide]<br>
-[[MediaWiki_talk:Rchide|Talk]]
-</td><td>
-in $4 form; $1 minor edits; $2 secondary namespaces; $3 multiple edits.
-</td><td>
-{{int:Rchide}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rclinks&action=edit rclinks]<br>
-[[MediaWiki_talk:Rclinks|Talk]]
-</td><td>
-Show last $1 changes in last $2 days&lt;br /&gt;$3
-</td><td>
-{{int:Rclinks}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rclistfrom&action=edit rclistfrom]<br>
-[[MediaWiki_talk:Rclistfrom|Talk]]
-</td><td>
-Show new changes starting from $1
-</td><td>
-{{int:Rclistfrom}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcliu&action=edit rcliu]<br>
-[[MediaWiki_talk:Rcliu|Talk]]
-</td><td>
-; $1 edits from logged in users
-</td><td>
-{{int:Rcliu}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcloaderr&action=edit rcloaderr]<br>
-[[MediaWiki_talk:Rcloaderr|Talk]]
-</td><td>
-Loading recent changes
-</td><td>
-{{int:Rcloaderr}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rclsub&action=edit rclsub]<br>
-[[MediaWiki_talk:Rclsub|Talk]]
-</td><td>
-(to pages linked from &quot;$1&quot;)
-</td><td>
-{{int:Rclsub}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcnote&action=edit rcnote]<br>
-[[MediaWiki_talk:Rcnote|Talk]]
-</td><td>
-Below are the last &lt;strong&gt;$1&lt;/strong&gt; changes in last &lt;strong&gt;$2&lt;/strong&gt; days.
-</td><td>
-{{int:Rcnote}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rcnotefrom&action=edit rcnotefrom]<br>
-[[MediaWiki_talk:Rcnotefrom|Talk]]
-</td><td>
-Below are the changes since &lt;b&gt;$2&lt;/b&gt; (up to &lt;b&gt;$1&lt;/b&gt; shown).
-</td><td>
-{{int:Rcnotefrom}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Readonly&action=edit readonly]<br>
-[[MediaWiki_talk:Readonly|Talk]]
-</td><td>
-Database locked
-</td><td>
-{{int:Readonly}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Readonlytext&action=edit readonlytext]<br>
-[[MediaWiki_talk:Readonlytext|Talk]]
-</td><td>
-The database is currently locked to new
-entries and other modifications, probably for routine database maintenance,
-after which it will be back to normal.
-The administrator who locked it offered this explanation:
-&lt;p&gt;$1
-</td><td>
-{{int:Readonlytext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Readonlywarning&action=edit readonlywarning]<br>
-[[MediaWiki_talk:Readonlywarning|Talk]]
-</td><td>
-WARNING: The database has been locked for maintenance,
-so you will not be able to save your edits right now. You may wish to cut-n-paste
-the text into a text file and save it for later.
-</td><td>
-{{int:Readonlywarning}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchanges&action=edit recentchanges]<br>
-[[MediaWiki_talk:Recentchanges|Talk]]
-</td><td>
-Recent changes
-</td><td>
-{{int:Recentchanges}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchangescount&action=edit recentchangescount]<br>
-[[MediaWiki_talk:Recentchangescount|Talk]]
-</td><td>
-Number of titles in recent changes
-</td><td>
-{{int:Recentchangescount}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchangeslinked&action=edit recentchangeslinked]<br>
-[[MediaWiki_talk:Recentchangeslinked|Talk]]
-</td><td>
-Related changes
-</td><td>
-{{int:Recentchangeslinked}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Recentchangestext&action=edit recentchangestext]<br>
-[[MediaWiki_talk:Recentchangestext|Talk]]
-</td><td>
-Track the most recent changes to the wiki on this page.
-</td><td>
-{{int:Recentchangestext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Redirectedfrom&action=edit redirectedfrom]<br>
-[[MediaWiki_talk:Redirectedfrom|Talk]]
-</td><td>
-(Redirected from $1)
-</td><td>
-{{int:Redirectedfrom}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Remembermypassword&action=edit remembermypassword]<br>
-[[MediaWiki_talk:Remembermypassword|Talk]]
-</td><td>
-Remember my password across sessions.
-</td><td>
-{{int:Remembermypassword}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removechecked&action=edit removechecked]<br>
-[[MediaWiki_talk:Removechecked|Talk]]
-</td><td>
-Remove checked items from watchlist
-</td><td>
-{{int:Removechecked}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removedwatch&action=edit removedwatch]<br>
-[[MediaWiki_talk:Removedwatch|Talk]]
-</td><td>
-Removed from watchlist
-</td><td>
-{{int:Removedwatch}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removedwatchtext&action=edit removedwatchtext]<br>
-[[MediaWiki_talk:Removedwatchtext|Talk]]
-</td><td>
-The page &quot;$1&quot; has been removed from your watchlist.
-</td><td>
-{{int:Removedwatchtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Removingchecked&action=edit removingchecked]<br>
-[[MediaWiki_talk:Removingchecked|Talk]]
-</td><td>
-Removing requested items from watchlist...
-</td><td>
-{{int:Removingchecked}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Resetprefs&action=edit resetprefs]<br>
-[[MediaWiki_talk:Resetprefs|Talk]]
-</td><td>
-Reset preferences
-</td><td>
-{{int:Resetprefs}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Restorelink&action=edit restorelink]<br>
-[[MediaWiki_talk:Restorelink|Talk]]
-</td><td>
-$1 deleted edits
-</td><td>
-{{int:Restorelink}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Resultsperpage&action=edit resultsperpage]<br>
-[[MediaWiki_talk:Resultsperpage|Talk]]
-</td><td>
-Hits to show per page
-</td><td>
-{{int:Resultsperpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Retrievedfrom&action=edit retrievedfrom]<br>
-[[MediaWiki_talk:Retrievedfrom|Talk]]
-</td><td>
-Retrieved from &quot;$1&quot;
-</td><td>
-{{int:Retrievedfrom}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Returnto&action=edit returnto]<br>
-[[MediaWiki_talk:Returnto|Talk]]
-</td><td>
-Return to $1.
-</td><td>
-{{int:Returnto}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Retypenew&action=edit retypenew]<br>
-[[MediaWiki_talk:Retypenew|Talk]]
-</td><td>
-Retype new password
-</td><td>
-{{int:Retypenew}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Reupload&action=edit reupload]<br>
-[[MediaWiki_talk:Reupload|Talk]]
-</td><td>
-Re-upload
-</td><td>
-{{int:Reupload}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Reuploaddesc&action=edit reuploaddesc]<br>
-[[MediaWiki_talk:Reuploaddesc|Talk]]
-</td><td>
-Return to the upload form.
-</td><td>
-{{int:Reuploaddesc}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Reverted&action=edit reverted]<br>
-[[MediaWiki_talk:Reverted|Talk]]
-</td><td>
-Reverted to earlier revision
-</td><td>
-{{int:Reverted}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revertimg&action=edit revertimg]<br>
-[[MediaWiki_talk:Revertimg|Talk]]
-</td><td>
-rev
-</td><td>
-{{int:Revertimg}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revertpage&action=edit revertpage]<br>
-[[MediaWiki_talk:Revertpage|Talk]]
-</td><td>
-Reverted edit of $2, changed back to last version by $1
-</td><td>
-{{int:Revertpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revhistory&action=edit revhistory]<br>
-[[MediaWiki_talk:Revhistory|Talk]]
-</td><td>
-Revision history
-</td><td>
-{{int:Revhistory}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revisionasof&action=edit revisionasof]<br>
-[[MediaWiki_talk:Revisionasof|Talk]]
-</td><td>
-Revision as of $1
-</td><td>
-{{int:Revisionasof}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revnotfound&action=edit revnotfound]<br>
-[[MediaWiki_talk:Revnotfound|Talk]]
-</td><td>
-Revision not found
-</td><td>
-{{int:Revnotfound}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Revnotfoundtext&action=edit revnotfoundtext]<br>
-[[MediaWiki_talk:Revnotfoundtext|Talk]]
-</td><td>
-The old revision of the page you asked for could not be found.
-Please check the URL you used to access this page.
-
-</td><td>
-{{int:Revnotfoundtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rfcurl&action=edit rfcurl]<br>
-[[MediaWiki_talk:Rfcurl|Talk]]
-</td><td>
-http&#58;//www.faqs.org/rfcs/rfc$1.html
-</td><td>
-{{int:Rfcurl}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rights&action=edit rights]<br>
-[[MediaWiki_talk:Rights|Talk]]
-</td><td>
-Rights:
-</td><td>
-{{int:Rights}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollback&action=edit rollback]<br>
-[[MediaWiki_talk:Rollback|Talk]]
-</td><td>
-Roll back edits
-</td><td>
-{{int:Rollback}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollback_short&action=edit rollback_short]<br>
-[[MediaWiki_talk:Rollback_short|Talk]]
-</td><td>
-Rollback
-</td><td>
-{{int:Rollback_short}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollbackfailed&action=edit rollbackfailed]<br>
-[[MediaWiki_talk:Rollbackfailed|Talk]]
-</td><td>
-Rollback failed
-</td><td>
-{{int:Rollbackfailed}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rollbacklink&action=edit rollbacklink]<br>
-[[MediaWiki_talk:Rollbacklink|Talk]]
-</td><td>
-rollback
-</td><td>
-{{int:Rollbacklink}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Rows&action=edit rows]<br>
-[[MediaWiki_talk:Rows|Talk]]
-</td><td>
-Rows
-</td><td>
-{{int:Rows}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Savearticle&action=edit savearticle]<br>
-[[MediaWiki_talk:Savearticle|Talk]]
-</td><td>
-Save page
-</td><td>
-{{int:Savearticle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Savedprefs&action=edit savedprefs]<br>
-[[MediaWiki_talk:Savedprefs|Talk]]
-</td><td>
-Your preferences have been saved.
-</td><td>
-{{int:Savedprefs}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Savefile&action=edit savefile]<br>
-[[MediaWiki_talk:Savefile|Talk]]
-</td><td>
-Save file
-</td><td>
-{{int:Savefile}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Saveprefs&action=edit saveprefs]<br>
-[[MediaWiki_talk:Saveprefs|Talk]]
-</td><td>
-Save preferences
-</td><td>
-{{int:Saveprefs}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Search&action=edit search]<br>
-[[MediaWiki_talk:Search|Talk]]
-</td><td>
-Search
-</td><td>
-{{int:Search}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchdisabled&action=edit searchdisabled]<br>
-[[MediaWiki_talk:Searchdisabled|Talk]]
-</td><td>
-&lt;p&gt;Sorry! Full text search has been disabled temporarily, for performance reasons. In the meantime, you can use the Google search below, which may be out of date.&lt;/p&gt;
-</td><td>
-{{int:Searchdisabled}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchhelppage&action=edit searchhelppage]<br>
-[[MediaWiki_talk:Searchhelppage|Talk]]
-</td><td>
-Wiktionary:Searching
-</td><td>
-{{int:Searchhelppage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchingwikipedia&action=edit searchingwikipedia]<br>
-[[MediaWiki_talk:Searchingwikipedia|Talk]]
-</td><td>
-Searching Wiktionary
-</td><td>
-{{int:Searchingwikipedia}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchquery&action=edit searchquery]<br>
-[[MediaWiki_talk:Searchquery|Talk]]
-</td><td>
-For query &quot;$1&quot;
-</td><td>
-{{int:Searchquery}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchresults&action=edit searchresults]<br>
-[[MediaWiki_talk:Searchresults|Talk]]
-</td><td>
-Search results
-</td><td>
-{{int:Searchresults}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchresultshead&action=edit searchresultshead]<br>
-[[MediaWiki_talk:Searchresultshead|Talk]]
-</td><td>
-Search result settings
-</td><td>
-{{int:Searchresultshead}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Searchresulttext&action=edit searchresulttext]<br>
-[[MediaWiki_talk:Searchresulttext|Talk]]
-</td><td>
-For more information about searching Wiktionary, see $1.
-</td><td>
-{{int:Searchresulttext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sectionedit&action=edit sectionedit]<br>
-[[MediaWiki_talk:Sectionedit|Talk]]
-</td><td>
- (section)
-</td><td>
-{{int:Sectionedit}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selectnewerversionfordiff&action=edit selectnewerversionfordiff]<br>
-[[MediaWiki_talk:Selectnewerversionfordiff|Talk]]
-</td><td>
-Select a newer version for comparison
-</td><td>
-{{int:Selectnewerversionfordiff}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selectolderversionfordiff&action=edit selectolderversionfordiff]<br>
-[[MediaWiki_talk:Selectolderversionfordiff|Talk]]
-</td><td>
-Select an older version for comparison
-</td><td>
-{{int:Selectolderversionfordiff}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selectonly&action=edit selectonly]<br>
-[[MediaWiki_talk:Selectonly|Talk]]
-</td><td>
-Only read-only queries are allowed.
-</td><td>
-{{int:Selectonly}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selflinks&action=edit selflinks]<br>
-[[MediaWiki_talk:Selflinks|Talk]]
-</td><td>
-Pages with Self Links
-</td><td>
-{{int:Selflinks}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Selflinkstext&action=edit selflinkstext]<br>
-[[MediaWiki_talk:Selflinkstext|Talk]]
-</td><td>
-The following pages contain a link to themselves, which they should not.
-</td><td>
-{{int:Selflinkstext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Seriousxhtmlerrors&action=edit seriousxhtmlerrors]<br>
-[[MediaWiki_talk:Seriousxhtmlerrors|Talk]]
-</td><td>
-There were serious xhtml markup errors detected by tidy.
-</td><td>
-{{int:Seriousxhtmlerrors}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Servertime&action=edit servertime]<br>
-[[MediaWiki_talk:Servertime|Talk]]
-</td><td>
-Server time is now
-</td><td>
-{{int:Servertime}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Set_rights_fail&action=edit set_rights_fail]<br>
-[[MediaWiki_talk:Set_rights_fail|Talk]]
-</td><td>
-&lt;b&gt;User rights for &quot;$1&quot; could not be set. (Did you enter the name correctly?)&lt;/b&gt;
-</td><td>
-{{int:Set_rights_fail}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Set_user_rights&action=edit set_user_rights]<br>
-[[MediaWiki_talk:Set_user_rights|Talk]]
-</td><td>
-Set user rights
-</td><td>
-{{int:Set_user_rights}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Setbureaucratflag&action=edit setbureaucratflag]<br>
-[[MediaWiki_talk:Setbureaucratflag|Talk]]
-</td><td>
-Set bureaucrat flag
-</td><td>
-{{int:Setbureaucratflag}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Shortpages&action=edit shortpages]<br>
-[[MediaWiki_talk:Shortpages|Talk]]
-</td><td>
-Short pages
-</td><td>
-{{int:Shortpages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Show&action=edit show]<br>
-[[MediaWiki_talk:Show|Talk]]
-</td><td>
-show
-</td><td>
-{{int:Show}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showhideminor&action=edit showhideminor]<br>
-[[MediaWiki_talk:Showhideminor|Talk]]
-</td><td>
-$1 minor edits &#124; $2 bots &#124; $3 logged in users
-</td><td>
-{{int:Showhideminor}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showingresults&action=edit showingresults]<br>
-[[MediaWiki_talk:Showingresults|Talk]]
-</td><td>
-Showing below &lt;b&gt;$1&lt;/b&gt; results starting with #&lt;b&gt;$2&lt;/b&gt;.
-</td><td>
-{{int:Showingresults}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showingresultsnum&action=edit showingresultsnum]<br>
-[[MediaWiki_talk:Showingresultsnum|Talk]]
-</td><td>
-Showing below &lt;b&gt;$3&lt;/b&gt; results starting with #&lt;b&gt;$2&lt;/b&gt;.
-</td><td>
-{{int:Showingresultsnum}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showlast&action=edit showlast]<br>
-[[MediaWiki_talk:Showlast|Talk]]
-</td><td>
-Show last $1 images sorted $2.
-</td><td>
-{{int:Showlast}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showpreview&action=edit showpreview]<br>
-[[MediaWiki_talk:Showpreview|Talk]]
-</td><td>
-Show preview
-</td><td>
-{{int:Showpreview}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Showtoc&action=edit showtoc]<br>
-[[MediaWiki_talk:Showtoc|Talk]]
-</td><td>
-show
-</td><td>
-{{int:Showtoc}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sig_tip&action=edit sig_tip]<br>
-[[MediaWiki_talk:Sig_tip|Talk]]
-</td><td>
-Your signature with timestamp
-</td><td>
-{{int:Sig_tip}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitestats&action=edit sitestats]<br>
-[[MediaWiki_talk:Sitestats|Talk]]
-</td><td>
-Site statistics
-</td><td>
-{{int:Sitestats}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitestatstext&action=edit sitestatstext]<br>
-[[MediaWiki_talk:Sitestatstext|Talk]]
-</td><td>
-There are &#39;&#39;&#39;$1&#39;&#39;&#39; total pages in the database.
-This includes &quot;talk&quot; pages, pages about Wiktionary, minimal &quot;stub&quot;
-pages, redirects, and others that probably don&#39;t qualify as content pages.
-Excluding those, there are &#39;&#39;&#39;$2&#39;&#39;&#39; pages that are probably legitimate
-content pages.
-
-There have been a total of &#39;&#39;&#39;$3&#39;&#39;&#39; page views, and &#39;&#39;&#39;$4&#39;&#39;&#39; page edits
-since the wiki was setup.
-That comes to &#39;&#39;&#39;$5&#39;&#39;&#39; average edits per page, and &#39;&#39;&#39;$6&#39;&#39;&#39; views per edit.
-</td><td>
-{{int:Sitestatstext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitesubtitle&action=edit sitesubtitle]<br>
-[[MediaWiki_talk:Sitesubtitle|Talk]]
-</td><td>
-The Free Encyclopedia
-</td><td>
-{{int:Sitesubtitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitesupport&action=edit sitesupport]<br>
-[[MediaWiki_talk:Sitesupport|Talk]]
-</td><td>
-Donations
-</td><td>
-{{int:Sitesupport}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sitetitle&action=edit sitetitle]<br>
-[[MediaWiki_talk:Sitetitle|Talk]]
-</td><td>
-Wiktionary
-</td><td>
-{{int:Sitetitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Siteuser&action=edit siteuser]<br>
-[[MediaWiki_talk:Siteuser|Talk]]
-</td><td>
-Wiktionary user $1
-</td><td>
-{{int:Siteuser}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Siteusers&action=edit siteusers]<br>
-[[MediaWiki_talk:Siteusers|Talk]]
-</td><td>
-Wiktionary user(s) $1
-</td><td>
-{{int:Siteusers}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Skin&action=edit skin]<br>
-[[MediaWiki_talk:Skin|Talk]]
-</td><td>
-Skin
-</td><td>
-{{int:Skin}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Spamprotectiontext&action=edit spamprotectiontext]<br>
-[[MediaWiki_talk:Spamprotectiontext|Talk]]
-</td><td>
-The page you wanted to save was blocked by the spam filter. This is probably caused by a link to an external site.
-
-You might want to check the following regular expression for patterns that are currently blocked:
-</td><td>
-{{int:Spamprotectiontext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Spamprotectiontitle&action=edit spamprotectiontitle]<br>
-[[MediaWiki_talk:Spamprotectiontitle|Talk]]
-</td><td>
-Spam protection filter
-</td><td>
-{{int:Spamprotectiontitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Specialpage&action=edit specialpage]<br>
-[[MediaWiki_talk:Specialpage|Talk]]
-</td><td>
-Special Page
-</td><td>
-{{int:Specialpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Specialpages&action=edit specialpages]<br>
-[[MediaWiki_talk:Specialpages|Talk]]
-</td><td>
-Special pages
-</td><td>
-{{int:Specialpages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Spheading&action=edit spheading]<br>
-[[MediaWiki_talk:Spheading|Talk]]
-</td><td>
-Special pages for all users
-</td><td>
-{{int:Spheading}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sqlislogged&action=edit sqlislogged]<br>
-[[MediaWiki_talk:Sqlislogged|Talk]]
-</td><td>
-Please note that all queries are logged.
-</td><td>
-{{int:Sqlislogged}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sqlquery&action=edit sqlquery]<br>
-[[MediaWiki_talk:Sqlquery|Talk]]
-</td><td>
-Enter query
-</td><td>
-{{int:Sqlquery}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Statistics&action=edit statistics]<br>
-[[MediaWiki_talk:Statistics|Talk]]
-</td><td>
-Statistics
-</td><td>
-{{int:Statistics}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Storedversion&action=edit storedversion]<br>
-[[MediaWiki_talk:Storedversion|Talk]]
-</td><td>
-Stored version
-</td><td>
-{{int:Storedversion}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Stubthreshold&action=edit stubthreshold]<br>
-[[MediaWiki_talk:Stubthreshold|Talk]]
-</td><td>
-Threshold for stub display
-</td><td>
-{{int:Stubthreshold}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Subcategories&action=edit subcategories]<br>
-[[MediaWiki_talk:Subcategories|Talk]]
-</td><td>
-Subcategories
-</td><td>
-{{int:Subcategories}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Subject&action=edit subject]<br>
-[[MediaWiki_talk:Subject|Talk]]
-</td><td>
-Subject/headline
-</td><td>
-{{int:Subject}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Subjectpage&action=edit subjectpage]<br>
-[[MediaWiki_talk:Subjectpage|Talk]]
-</td><td>
-View subject
-</td><td>
-{{int:Subjectpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Successfulupload&action=edit successfulupload]<br>
-[[MediaWiki_talk:Successfulupload|Talk]]
-</td><td>
-Successful upload
-</td><td>
-{{int:Successfulupload}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Summary&action=edit summary]<br>
-[[MediaWiki_talk:Summary|Talk]]
-</td><td>
-Summary
-</td><td>
-{{int:Summary}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sysopspheading&action=edit sysopspheading]<br>
-[[MediaWiki_talk:Sysopspheading|Talk]]
-</td><td>
-For sysop use only
-</td><td>
-{{int:Sysopspheading}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sysoptext&action=edit sysoptext]<br>
-[[MediaWiki_talk:Sysoptext|Talk]]
-</td><td>
-The action you have requested can only be
-performed by users with &quot;sysop&quot; status.
-See $1.
-</td><td>
-{{int:Sysoptext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Sysoptitle&action=edit sysoptitle]<br>
-[[MediaWiki_talk:Sysoptitle|Talk]]
-</td><td>
-Sysop access required
-</td><td>
-{{int:Sysoptitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tableform&action=edit tableform]<br>
-[[MediaWiki_talk:Tableform|Talk]]
-</td><td>
-table
-</td><td>
-{{int:Tableform}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talk&action=edit talk]<br>
-[[MediaWiki_talk:Talk|Talk]]
-</td><td>
-Discussion
-</td><td>
-{{int:Talk}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkexists&action=edit talkexists]<br>
-[[MediaWiki_talk:Talkexists|Talk]]
-</td><td>
-The page itself was moved successfully, but the
-talk page could not be moved because one already exists at the new
-title. Please merge them manually.
-</td><td>
-{{int:Talkexists}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpage&action=edit talkpage]<br>
-[[MediaWiki_talk:Talkpage|Talk]]
-</td><td>
-Discuss this page
-</td><td>
-{{int:Talkpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpagemoved&action=edit talkpagemoved]<br>
-[[MediaWiki_talk:Talkpagemoved|Talk]]
-</td><td>
-The corresponding talk page was also moved.
-</td><td>
-{{int:Talkpagemoved}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpagenotmoved&action=edit talkpagenotmoved]<br>
-[[MediaWiki_talk:Talkpagenotmoved|Talk]]
-</td><td>
-The corresponding talk page was &lt;strong&gt;not&lt;/strong&gt; moved.
-</td><td>
-{{int:Talkpagenotmoved}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Talkpagetext&action=edit talkpagetext]<br>
-[[MediaWiki_talk:Talkpagetext|Talk]]
-</td><td>
-&lt;!-- MediaWiki:talkpagetext --&gt;
-</td><td>
-{{int:Talkpagetext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Textboxsize&action=edit textboxsize]<br>
-[[MediaWiki_talk:Textboxsize|Talk]]
-</td><td>
-Textbox dimensions
-</td><td>
-{{int:Textboxsize}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Textmatches&action=edit textmatches]<br>
-[[MediaWiki_talk:Textmatches|Talk]]
-</td><td>
-Page text matches
-</td><td>
-{{int:Textmatches}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Thisisdeleted&action=edit thisisdeleted]<br>
-[[MediaWiki_talk:Thisisdeleted|Talk]]
-</td><td>
-View or restore $1?
-</td><td>
-{{int:Thisisdeleted}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Thumbnail-more&action=edit thumbnail-more]<br>
-[[MediaWiki_talk:Thumbnail-more|Talk]]
-</td><td>
-Enlarge
-</td><td>
-{{int:Thumbnail-more}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Timezonelegend&action=edit timezonelegend]<br>
-[[MediaWiki_talk:Timezonelegend|Talk]]
-</td><td>
-Time zone
-</td><td>
-{{int:Timezonelegend}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Timezoneoffset&action=edit timezoneoffset]<br>
-[[MediaWiki_talk:Timezoneoffset|Talk]]
-</td><td>
-Offset
-</td><td>
-{{int:Timezoneoffset}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Timezonetext&action=edit timezonetext]<br>
-[[MediaWiki_talk:Timezonetext|Talk]]
-</td><td>
-Enter number of hours your local time differs
-from server time (UTC).
-</td><td>
-{{int:Timezonetext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Titlematches&action=edit titlematches]<br>
-[[MediaWiki_talk:Titlematches|Talk]]
-</td><td>
-Article title matches
-</td><td>
-{{int:Titlematches}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Toc&action=edit toc]<br>
-[[MediaWiki_talk:Toc|Talk]]
-</td><td>
-Table of contents
-</td><td>
-{{int:Toc}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Toolbox&action=edit toolbox]<br>
-[[MediaWiki_talk:Toolbox|Talk]]
-</td><td>
-Toolbox
-</td><td>
-{{int:Toolbox}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-addsection&action=edit tooltip-addsection]<br>
-[[MediaWiki_talk:Tooltip-addsection|Talk]]
-</td><td>
-Add a comment to this page. &#91;alt-+]
-</td><td>
-{{int:Tooltip-addsection}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-anontalk&action=edit tooltip-anontalk]<br>
-[[MediaWiki_talk:Tooltip-anontalk|Talk]]
-</td><td>
-Discussion about edits from this ip address &#91;alt-n]
-</td><td>
-{{int:Tooltip-anontalk}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-anonuserpage&action=edit tooltip-anonuserpage]<br>
-[[MediaWiki_talk:Tooltip-anonuserpage|Talk]]
-</td><td>
-The user page for the ip you&#39;re editing as &#91;alt-.]
-</td><td>
-{{int:Tooltip-anonuserpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-article&action=edit tooltip-article]<br>
-[[MediaWiki_talk:Tooltip-article|Talk]]
-</td><td>
-View the content page &#91;alt-a]
-</td><td>
-{{int:Tooltip-article}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-atom&action=edit tooltip-atom]<br>
-[[MediaWiki_talk:Tooltip-atom|Talk]]
-</td><td>
-Atom feed for this page
-</td><td>
-{{int:Tooltip-atom}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-compareselectedversions&action=edit tooltip-compareselectedversions]<br>
-[[MediaWiki_talk:Tooltip-compareselectedversions|Talk]]
-</td><td>
-See the differences between the two selected versions of this page. &#91;alt-v]
-</td><td>
-{{int:Tooltip-compareselectedversions}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-contributions&action=edit tooltip-contributions]<br>
-[[MediaWiki_talk:Tooltip-contributions|Talk]]
-</td><td>
-View the list of contributions of this user
-</td><td>
-{{int:Tooltip-contributions}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-currentevents&action=edit tooltip-currentevents]<br>
-[[MediaWiki_talk:Tooltip-currentevents|Talk]]
-</td><td>
-Find background information on current events
-</td><td>
-{{int:Tooltip-currentevents}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-delete&action=edit tooltip-delete]<br>
-[[MediaWiki_talk:Tooltip-delete|Talk]]
-</td><td>
-Delete this page &#91;alt-d]
-</td><td>
-{{int:Tooltip-delete}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-edit&action=edit tooltip-edit]<br>
-[[MediaWiki_talk:Tooltip-edit|Talk]]
-</td><td>
-You can edit this page. Please use the preview button before saving. &#91;alt-e]
-</td><td>
-{{int:Tooltip-edit}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-emailuser&action=edit tooltip-emailuser]<br>
-[[MediaWiki_talk:Tooltip-emailuser|Talk]]
-</td><td>
-Send a mail to this user
-</td><td>
-{{int:Tooltip-emailuser}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-help&action=edit tooltip-help]<br>
-[[MediaWiki_talk:Tooltip-help|Talk]]
-</td><td>
-The place to find out.
-</td><td>
-{{int:Tooltip-help}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-history&action=edit tooltip-history]<br>
-[[MediaWiki_talk:Tooltip-history|Talk]]
-</td><td>
-Past versions of this page, &#91;alt-h]
-</td><td>
-{{int:Tooltip-history}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-login&action=edit tooltip-login]<br>
-[[MediaWiki_talk:Tooltip-login|Talk]]
-</td><td>
-You are encouraged to log in, it is not mandatory however. &#91;alt-o]
-</td><td>
-{{int:Tooltip-login}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-logout&action=edit tooltip-logout]<br>
-[[MediaWiki_talk:Tooltip-logout|Talk]]
-</td><td>
-Log out &#91;alt-o]
-</td><td>
-{{int:Tooltip-logout}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-mainpage&action=edit tooltip-mainpage]<br>
-[[MediaWiki_talk:Tooltip-mainpage|Talk]]
-</td><td>
-Visit the Main Page &#91;alt-z]
-</td><td>
-{{int:Tooltip-mainpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-minoredit&action=edit tooltip-minoredit]<br>
-[[MediaWiki_talk:Tooltip-minoredit|Talk]]
-</td><td>
-Mark this as a minor edit &#91;alt-i]
-</td><td>
-{{int:Tooltip-minoredit}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-move&action=edit tooltip-move]<br>
-[[MediaWiki_talk:Tooltip-move|Talk]]
-</td><td>
-Move this page &#91;alt-m]
-</td><td>
-{{int:Tooltip-move}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-mycontris&action=edit tooltip-mycontris]<br>
-[[MediaWiki_talk:Tooltip-mycontris|Talk]]
-</td><td>
-List of my contributions &#91;alt-y]
-</td><td>
-{{int:Tooltip-mycontris}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-mytalk&action=edit tooltip-mytalk]<br>
-[[MediaWiki_talk:Tooltip-mytalk|Talk]]
-</td><td>
-My talk page &#91;alt-n]
-</td><td>
-{{int:Tooltip-mytalk}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-nomove&action=edit tooltip-nomove]<br>
-[[MediaWiki_talk:Tooltip-nomove|Talk]]
-</td><td>
-You don&#39;t have the permissions to move this page
-</td><td>
-{{int:Tooltip-nomove}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-portal&action=edit tooltip-portal]<br>
-[[MediaWiki_talk:Tooltip-portal|Talk]]
-</td><td>
-About the project, what you can do, where to find things
-</td><td>
-{{int:Tooltip-portal}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-preferences&action=edit tooltip-preferences]<br>
-[[MediaWiki_talk:Tooltip-preferences|Talk]]
-</td><td>
-My preferences
-</td><td>
-{{int:Tooltip-preferences}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-preview&action=edit tooltip-preview]<br>
-[[MediaWiki_talk:Tooltip-preview|Talk]]
-</td><td>
-Preview your changes, please use this before saving! &#91;alt-p]
-</td><td>
-{{int:Tooltip-preview}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-protect&action=edit tooltip-protect]<br>
-[[MediaWiki_talk:Tooltip-protect|Talk]]
-</td><td>
-Protect this page &#91;alt-=]
-</td><td>
-{{int:Tooltip-protect}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-randompage&action=edit tooltip-randompage]<br>
-[[MediaWiki_talk:Tooltip-randompage|Talk]]
-</td><td>
-Load a random page &#91;alt-x]
-</td><td>
-{{int:Tooltip-randompage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-recentchanges&action=edit tooltip-recentchanges]<br>
-[[MediaWiki_talk:Tooltip-recentchanges|Talk]]
-</td><td>
-The list of recent changes in the wiki. &#91;alt-r]
-</td><td>
-{{int:Tooltip-recentchanges}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-recentchangeslinked&action=edit tooltip-recentchangeslinked]<br>
-[[MediaWiki_talk:Tooltip-recentchangeslinked|Talk]]
-</td><td>
-Recent changes in pages linking to this page &#91;alt-c]
-</td><td>
-{{int:Tooltip-recentchangeslinked}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-rss&action=edit tooltip-rss]<br>
-[[MediaWiki_talk:Tooltip-rss|Talk]]
-</td><td>
-RSS feed for this page
-</td><td>
-{{int:Tooltip-rss}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-save&action=edit tooltip-save]<br>
-[[MediaWiki_talk:Tooltip-save|Talk]]
-</td><td>
-Save your changes &#91;alt-s]
-</td><td>
-{{int:Tooltip-save}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-search&action=edit tooltip-search]<br>
-[[MediaWiki_talk:Tooltip-search|Talk]]
-</td><td>
-Search this wiki &#91;alt-f]
-</td><td>
-{{int:Tooltip-search}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-sitesupport&action=edit tooltip-sitesupport]<br>
-[[MediaWiki_talk:Tooltip-sitesupport|Talk]]
-</td><td>
-Support Wiktionary
-</td><td>
-{{int:Tooltip-sitesupport}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-specialpage&action=edit tooltip-specialpage]<br>
-[[MediaWiki_talk:Tooltip-specialpage|Talk]]
-</td><td>
-This is a special page, you can&#39;t edit the page itself.
-</td><td>
-{{int:Tooltip-specialpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-specialpages&action=edit tooltip-specialpages]<br>
-[[MediaWiki_talk:Tooltip-specialpages|Talk]]
-</td><td>
-List of all special pages &#91;alt-q]
-</td><td>
-{{int:Tooltip-specialpages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-talk&action=edit tooltip-talk]<br>
-[[MediaWiki_talk:Tooltip-talk|Talk]]
-</td><td>
-Discussion about the content page &#91;alt-t]
-</td><td>
-{{int:Tooltip-talk}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-undelete&action=edit tooltip-undelete]<br>
-[[MediaWiki_talk:Tooltip-undelete|Talk]]
-</td><td>
-Restore the $1 edits done to this page before it was deleted &#91;alt-d]
-</td><td>
-{{int:Tooltip-undelete}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-unwatch&action=edit tooltip-unwatch]<br>
-[[MediaWiki_talk:Tooltip-unwatch|Talk]]
-</td><td>
-Remove this page from your watchlist &#91;alt-w]
-</td><td>
-{{int:Tooltip-unwatch}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-upload&action=edit tooltip-upload]<br>
-[[MediaWiki_talk:Tooltip-upload|Talk]]
-</td><td>
-Upload images or media files &#91;alt-u]
-</td><td>
-{{int:Tooltip-upload}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-userpage&action=edit tooltip-userpage]<br>
-[[MediaWiki_talk:Tooltip-userpage|Talk]]
-</td><td>
-My user page &#91;alt-.]
-</td><td>
-{{int:Tooltip-userpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-viewsource&action=edit tooltip-viewsource]<br>
-[[MediaWiki_talk:Tooltip-viewsource|Talk]]
-</td><td>
-This page is protected. You can view its source. &#91;alt-e]
-</td><td>
-{{int:Tooltip-viewsource}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-watch&action=edit tooltip-watch]<br>
-[[MediaWiki_talk:Tooltip-watch|Talk]]
-</td><td>
-Add this page to your watchlist &#91;alt-w]
-</td><td>
-{{int:Tooltip-watch}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-watchlist&action=edit tooltip-watchlist]<br>
-[[MediaWiki_talk:Tooltip-watchlist|Talk]]
-</td><td>
-The list of pages you&#39;re monitoring for changes. &#91;alt-l]
-</td><td>
-{{int:Tooltip-watchlist}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Tooltip-whatlinkshere&action=edit tooltip-whatlinkshere]<br>
-[[MediaWiki_talk:Tooltip-whatlinkshere|Talk]]
-</td><td>
-List of all wiki pages that link here &#91;alt-b]
-</td><td>
-{{int:Tooltip-whatlinkshere}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uclinks&action=edit uclinks]<br>
-[[MediaWiki_talk:Uclinks|Talk]]
-</td><td>
-View the last $1 changes; view the last $2 days.
-</td><td>
-{{int:Uclinks}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Ucnote&action=edit ucnote]<br>
-[[MediaWiki_talk:Ucnote|Talk]]
-</td><td>
-Below are this user&#39;s last &lt;b&gt;$1&lt;/b&gt; changes in the last &lt;b&gt;$2&lt;/b&gt; days.
-</td><td>
-{{int:Ucnote}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uctop&action=edit uctop]<br>
-[[MediaWiki_talk:Uctop|Talk]]
-</td><td>
- (top)
-</td><td>
-{{int:Uctop}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblockip&action=edit unblockip]<br>
-[[MediaWiki_talk:Unblockip|Talk]]
-</td><td>
-Unblock user
-</td><td>
-{{int:Unblockip}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblockiptext&action=edit unblockiptext]<br>
-[[MediaWiki_talk:Unblockiptext|Talk]]
-</td><td>
-Use the form below to restore write access
-to a previously blocked IP address or username.
-</td><td>
-{{int:Unblockiptext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblocklink&action=edit unblocklink]<br>
-[[MediaWiki_talk:Unblocklink|Talk]]
-</td><td>
-unblock
-</td><td>
-{{int:Unblocklink}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unblocklogentry&action=edit unblocklogentry]<br>
-[[MediaWiki_talk:Unblocklogentry|Talk]]
-</td><td>
-unblocked &quot;$1&quot;
-</td><td>
-{{int:Unblocklogentry}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undelete&action=edit undelete]<br>
-[[MediaWiki_talk:Undelete|Talk]]
-</td><td>
-Restore deleted page
-</td><td>
-{{int:Undelete}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undelete_short&action=edit undelete_short]<br>
-[[MediaWiki_talk:Undelete_short|Talk]]
-</td><td>
-Undelete $1 edits
-</td><td>
-{{int:Undelete_short}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletearticle&action=edit undeletearticle]<br>
-[[MediaWiki_talk:Undeletearticle|Talk]]
-</td><td>
-Restore deleted page
-</td><td>
-{{int:Undeletearticle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletebtn&action=edit undeletebtn]<br>
-[[MediaWiki_talk:Undeletebtn|Talk]]
-</td><td>
-Restore!
-</td><td>
-{{int:Undeletebtn}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletedarticle&action=edit undeletedarticle]<br>
-[[MediaWiki_talk:Undeletedarticle|Talk]]
-</td><td>
-restored &quot;$1&quot;
-</td><td>
-{{int:Undeletedarticle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletedtext&action=edit undeletedtext]<br>
-[[MediaWiki_talk:Undeletedtext|Talk]]
-</td><td>
-&#91;&#91;$1]] has been successfully restored.
-See &#91;&#91;Wiktionary:Deletion_log]] for a record of recent deletions and restorations.
-</td><td>
-{{int:Undeletedtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletehistory&action=edit undeletehistory]<br>
-[[MediaWiki_talk:Undeletehistory|Talk]]
-</td><td>
-If you restore the page, all revisions will be restored to the history.
-If a new page with the same name has been created since the deletion, the restored
-revisions will appear in the prior history, and the current revision of the live page
-will not be automatically replaced.
-</td><td>
-{{int:Undeletehistory}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletepage&action=edit undeletepage]<br>
-[[MediaWiki_talk:Undeletepage|Talk]]
-</td><td>
-View and restore deleted pages
-</td><td>
-{{int:Undeletepage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeletepagetext&action=edit undeletepagetext]<br>
-[[MediaWiki_talk:Undeletepagetext|Talk]]
-</td><td>
-The following pages have been deleted but are still in the archive and
-can be restored. The archive may be periodically cleaned out.
-</td><td>
-{{int:Undeletepagetext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeleterevision&action=edit undeleterevision]<br>
-[[MediaWiki_talk:Undeleterevision|Talk]]
-</td><td>
-Deleted revision as of $1
-</td><td>
-{{int:Undeleterevision}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Undeleterevisions&action=edit undeleterevisions]<br>
-[[MediaWiki_talk:Undeleterevisions|Talk]]
-</td><td>
-$1 revisions archived
-</td><td>
-{{int:Undeleterevisions}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unexpected&action=edit unexpected]<br>
-[[MediaWiki_talk:Unexpected|Talk]]
-</td><td>
-Unexpected value: &quot;$1&quot;=&quot;$2&quot;.
-</td><td>
-{{int:Unexpected}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockbtn&action=edit unlockbtn]<br>
-[[MediaWiki_talk:Unlockbtn|Talk]]
-</td><td>
-Unlock database
-</td><td>
-{{int:Unlockbtn}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockconfirm&action=edit unlockconfirm]<br>
-[[MediaWiki_talk:Unlockconfirm|Talk]]
-</td><td>
-Yes, I really want to unlock the database.
-</td><td>
-{{int:Unlockconfirm}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdb&action=edit unlockdb]<br>
-[[MediaWiki_talk:Unlockdb|Talk]]
-</td><td>
-Unlock database
-</td><td>
-{{int:Unlockdb}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdbsuccesssub&action=edit unlockdbsuccesssub]<br>
-[[MediaWiki_talk:Unlockdbsuccesssub|Talk]]
-</td><td>
-Database lock removed
-</td><td>
-{{int:Unlockdbsuccesssub}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdbsuccesstext&action=edit unlockdbsuccesstext]<br>
-[[MediaWiki_talk:Unlockdbsuccesstext|Talk]]
-</td><td>
-The database has been unlocked.
-</td><td>
-{{int:Unlockdbsuccesstext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unlockdbtext&action=edit unlockdbtext]<br>
-[[MediaWiki_talk:Unlockdbtext|Talk]]
-</td><td>
-Unlocking the database will restore the ability of all
-users to edit pages, change their preferences, edit their watchlists, and
-other things requiring changes in the database.
-Please confirm that this is what you intend to do.
-</td><td>
-{{int:Unlockdbtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotect&action=edit unprotect]<br>
-[[MediaWiki_talk:Unprotect|Talk]]
-</td><td>
-Unprotect
-</td><td>
-{{int:Unprotect}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectcomment&action=edit unprotectcomment]<br>
-[[MediaWiki_talk:Unprotectcomment|Talk]]
-</td><td>
-Reason for unprotecting
-</td><td>
-{{int:Unprotectcomment}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectedarticle&action=edit unprotectedarticle]<br>
-[[MediaWiki_talk:Unprotectedarticle|Talk]]
-</td><td>
-unprotected &#91;&#91;$1]]
-</td><td>
-{{int:Unprotectedarticle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectsub&action=edit unprotectsub]<br>
-[[MediaWiki_talk:Unprotectsub|Talk]]
-</td><td>
-(Unprotecting &quot;$1&quot;)
-</td><td>
-{{int:Unprotectsub}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unprotectthispage&action=edit unprotectthispage]<br>
-[[MediaWiki_talk:Unprotectthispage|Talk]]
-</td><td>
-Unprotect this page
-</td><td>
-{{int:Unprotectthispage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unusedimages&action=edit unusedimages]<br>
-[[MediaWiki_talk:Unusedimages|Talk]]
-</td><td>
-Unused images
-</td><td>
-{{int:Unusedimages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unusedimagestext&action=edit unusedimagestext]<br>
-[[MediaWiki_talk:Unusedimagestext|Talk]]
-</td><td>
-&lt;p&gt;Please note that other web sites may link to an image with
-a direct URL, and so may still be listed here despite being
-in active use.
-</td><td>
-{{int:Unusedimagestext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unwatch&action=edit unwatch]<br>
-[[MediaWiki_talk:Unwatch|Talk]]
-</td><td>
-Unwatch
-</td><td>
-{{int:Unwatch}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Unwatchthispage&action=edit unwatchthispage]<br>
-[[MediaWiki_talk:Unwatchthispage|Talk]]
-</td><td>
-Stop watching
-</td><td>
-{{int:Unwatchthispage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Updated&action=edit updated]<br>
-[[MediaWiki_talk:Updated|Talk]]
-</td><td>
-(Updated)
-</td><td>
-{{int:Updated}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Upload&action=edit upload]<br>
-[[MediaWiki_talk:Upload|Talk]]
-</td><td>
-Upload file
-</td><td>
-{{int:Upload}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadbtn&action=edit uploadbtn]<br>
-[[MediaWiki_talk:Uploadbtn|Talk]]
-</td><td>
-Upload file
-</td><td>
-{{int:Uploadbtn}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploaddisabled&action=edit uploaddisabled]<br>
-[[MediaWiki_talk:Uploaddisabled|Talk]]
-</td><td>
-Sorry, uploading is disabled.
-</td><td>
-{{int:Uploaddisabled}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadedfiles&action=edit uploadedfiles]<br>
-[[MediaWiki_talk:Uploadedfiles|Talk]]
-</td><td>
-Uploaded files
-</td><td>
-{{int:Uploadedfiles}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadedimage&action=edit uploadedimage]<br>
-[[MediaWiki_talk:Uploadedimage|Talk]]
-</td><td>
-uploaded &quot;$1&quot;
-</td><td>
-{{int:Uploadedimage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploaderror&action=edit uploaderror]<br>
-[[MediaWiki_talk:Uploaderror|Talk]]
-</td><td>
-Upload error
-</td><td>
-{{int:Uploaderror}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadfile&action=edit uploadfile]<br>
-[[MediaWiki_talk:Uploadfile|Talk]]
-</td><td>
-Upload images, sounds, documents etc.
-</td><td>
-{{int:Uploadfile}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlink&action=edit uploadlink]<br>
-[[MediaWiki_talk:Uploadlink|Talk]]
-</td><td>
-Upload images
-</td><td>
-{{int:Uploadlink}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlog&action=edit uploadlog]<br>
-[[MediaWiki_talk:Uploadlog|Talk]]
-</td><td>
-upload log
-</td><td>
-{{int:Uploadlog}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlogpage&action=edit uploadlogpage]<br>
-[[MediaWiki_talk:Uploadlogpage|Talk]]
-</td><td>
-Upload_log
-</td><td>
-{{int:Uploadlogpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadlogpagetext&action=edit uploadlogpagetext]<br>
-[[MediaWiki_talk:Uploadlogpagetext|Talk]]
-</td><td>
-Below is a list of the most recent file uploads.
-All times shown are server time (UTC).
-&lt;ul&gt;
-&lt;/ul&gt;
-
-</td><td>
-{{int:Uploadlogpagetext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadnologin&action=edit uploadnologin]<br>
-[[MediaWiki_talk:Uploadnologin|Talk]]
-</td><td>
-Not logged in
-</td><td>
-{{int:Uploadnologin}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadnologintext&action=edit uploadnologintext]<br>
-[[MediaWiki_talk:Uploadnologintext|Talk]]
-</td><td>
-You must be &lt;a href=&quot;/wiki/Special:Userlogin&quot;&gt;logged in&lt;/a&gt;
-to upload files.
-</td><td>
-{{int:Uploadnologintext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadtext&action=edit uploadtext]<br>
-[[MediaWiki_talk:Uploadtext|Talk]]
-</td><td>
-&lt;strong&gt;STOP!&lt;/strong&gt; Before you upload here,
-make sure to read and follow the &lt;a href=&quot;/wiki/Special:Image_use_policy&quot;&gt;image use policy&lt;/a&gt;.
-&lt;p&gt;If a file with the name you are specifying already
-exists on the wiki, it&#39;ll be replaced without warning.
-So unless you mean to update a file, it&#39;s a good idea
-to first check if such a file exists.
-&lt;p&gt;To view or search previously uploaded images,
-go to the &lt;a href=&quot;/wiki/Special:Imagelist&quot;&gt;list of uploaded images&lt;/a&gt;.
-Uploads and deletions are logged on the &lt;a href=&quot;/wiki/Wiktionary:Upload_log&quot;&gt;upload log&lt;/a&gt;.
-&lt;/p&gt;&lt;p&gt;Use the form below to upload new image files for use in
-illustrating your pages.
-On most browsers, you will see a &quot;Browse...&quot; button, which will
-bring up your operating system&#39;s standard file open dialog.
-Choosing a file will fill the name of that file into the text
-field next to the button.
-You must also check the box affirming that you are not
-violating any copyrights by uploading the file.
-Press the &quot;Upload&quot; button to finish the upload.
-This may take some time if you have a slow internet connection.
-&lt;p&gt;The preferred formats are JPEG for photographic images, PNG
-for drawings and other iconic images, and OGG for sounds.
-Please name your files descriptively to avoid confusion.
-To include the image in a page, use a link in the form
-&lt;b&gt;&#91;&#91;Image:file.jpg]]&lt;/b&gt; or &lt;b&gt;&#91;&#91;Image:file.png&#124;alt text]]&lt;/b&gt;
-or &lt;b&gt;&#91;&#91;Media:file.ogg]]&lt;/b&gt; for sounds.
-&lt;p&gt;Please note that as with wiki pages, others may edit or
-delete your uploads if they think it serves the project, and
-you may be blocked from uploading if you abuse the system.
-</td><td>
-{{int:Uploadtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Uploadwarning&action=edit uploadwarning]<br>
-[[MediaWiki_talk:Uploadwarning|Talk]]
-</td><td>
-Upload warning
-</td><td>
-{{int:Uploadwarning}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:User_rights_set&action=edit user_rights_set]<br>
-[[MediaWiki_talk:User_rights_set|Talk]]
-</td><td>
-&lt;b&gt;User rights for &quot;$1&quot; updated&lt;/b&gt;
-</td><td>
-{{int:User_rights_set}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usercssjs&action=edit usercssjs]<br>
-[[MediaWiki_talk:Usercssjs|Talk]]
-</td><td>
-&#39;&#39;&#39;Note:&#39;&#39;&#39; After saving, you have to tell your bowser to get the new version: &#39;&#39;&#39;Mozilla:&#39;&#39;&#39; click &#39;&#39;reload&#39;&#39;(or &#39;&#39;ctrl-r&#39;&#39;), &#39;&#39;&#39;IE / Opera:&#39;&#39;&#39; &#39;&#39;ctrl-f5&#39;&#39;, &#39;&#39;&#39;Safari:&#39;&#39;&#39; &#39;&#39;cmd-r&#39;&#39;, &#39;&#39;&#39;Konqueror&#39;&#39;&#39; &#39;&#39;ctrl-r&#39;&#39;.
-</td><td>
-{{int:Usercssjs}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usercssjsyoucanpreview&action=edit usercssjsyoucanpreview]<br>
-[[MediaWiki_talk:Usercssjsyoucanpreview|Talk]]
-</td><td>
-&lt;strong&gt;Tip:&lt;/strong&gt; Use the &#39;Show preview&#39; button to test your new css/js before saving.
-</td><td>
-{{int:Usercssjsyoucanpreview}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usercsspreview&action=edit usercsspreview]<br>
-[[MediaWiki_talk:Usercsspreview|Talk]]
-</td><td>
-&#39;&#39;&#39;Remember that you are only previewing your user css, it has not yet been saved!&#39;&#39;&#39;
-</td><td>
-{{int:Usercsspreview}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userexists&action=edit userexists]<br>
-[[MediaWiki_talk:Userexists|Talk]]
-</td><td>
-The user name you entered is already in use. Please choose a different name.
-</td><td>
-{{int:Userexists}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userjspreview&action=edit userjspreview]<br>
-[[MediaWiki_talk:Userjspreview|Talk]]
-</td><td>
-&#39;&#39;&#39;Remember that you are only testing/previewing your user javascript, it has not yet been saved!&#39;&#39;&#39;
-</td><td>
-{{int:Userjspreview}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userlogin&action=edit userlogin]<br>
-[[MediaWiki_talk:Userlogin|Talk]]
-</td><td>
-Log in
-</td><td>
-{{int:Userlogin}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userlogout&action=edit userlogout]<br>
-[[MediaWiki_talk:Userlogout|Talk]]
-</td><td>
-Log out
-</td><td>
-{{int:Userlogout}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Usermailererror&action=edit usermailererror]<br>
-[[MediaWiki_talk:Usermailererror|Talk]]
-</td><td>
-Mail object returned error:
-</td><td>
-{{int:Usermailererror}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userpage&action=edit userpage]<br>
-[[MediaWiki_talk:Userpage|Talk]]
-</td><td>
-View user page
-</td><td>
-{{int:Userpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userstats&action=edit userstats]<br>
-[[MediaWiki_talk:Userstats|Talk]]
-</td><td>
-User statistics
-</td><td>
-{{int:Userstats}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Userstatstext&action=edit userstatstext]<br>
-[[MediaWiki_talk:Userstatstext|Talk]]
-</td><td>
-There are &#39;&#39;&#39;$1&#39;&#39;&#39; registered users.
-&#39;&#39;&#39;$2&#39;&#39;&#39; of these are administrators (see $3).
-</td><td>
-{{int:Userstatstext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Version&action=edit version]<br>
-[[MediaWiki_talk:Version|Talk]]
-</td><td>
-Version
-</td><td>
-{{int:Version}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewcount&action=edit viewcount]<br>
-[[MediaWiki_talk:Viewcount|Talk]]
-</td><td>
-This page has been accessed $1 times.
-</td><td>
-{{int:Viewcount}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewprevnext&action=edit viewprevnext]<br>
-[[MediaWiki_talk:Viewprevnext|Talk]]
-</td><td>
-View ($1) ($2) ($3).
-</td><td>
-{{int:Viewprevnext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewsource&action=edit viewsource]<br>
-[[MediaWiki_talk:Viewsource|Talk]]
-</td><td>
-View source
-</td><td>
-{{int:Viewsource}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Viewtalkpage&action=edit viewtalkpage]<br>
-[[MediaWiki_talk:Viewtalkpage|Talk]]
-</td><td>
-View discussion
-</td><td>
-{{int:Viewtalkpage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wantedpages&action=edit wantedpages]<br>
-[[MediaWiki_talk:Wantedpages|Talk]]
-</td><td>
-Wanted pages
-</td><td>
-{{int:Wantedpages}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watch&action=edit watch]<br>
-[[MediaWiki_talk:Watch|Talk]]
-</td><td>
-Watch
-</td><td>
-{{int:Watch}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchdetails&action=edit watchdetails]<br>
-[[MediaWiki_talk:Watchdetails|Talk]]
-</td><td>
-($1 pages watched not counting talk pages;
-$2 total pages edited since cutoff;
-$3...
-&lt;a href=&#39;$4&#39;&gt;show and edit complete list&lt;/a&gt;.)
-</td><td>
-{{int:Watchdetails}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watcheditlist&action=edit watcheditlist]<br>
-[[MediaWiki_talk:Watcheditlist|Talk]]
-</td><td>
-Here&#39;s an alphabetical list of your
-watched pages. Check the boxes of pages you want to remove
-from your watchlist and click the &#39;remove checked&#39; button
-at the bottom of the screen.
-</td><td>
-{{int:Watcheditlist}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchlist&action=edit watchlist]<br>
-[[MediaWiki_talk:Watchlist|Talk]]
-</td><td>
-My watchlist
-</td><td>
-{{int:Watchlist}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchlistcontains&action=edit watchlistcontains]<br>
-[[MediaWiki_talk:Watchlistcontains|Talk]]
-</td><td>
-Your watchlist contains $1 pages.
-</td><td>
-{{int:Watchlistcontains}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchlistsub&action=edit watchlistsub]<br>
-[[MediaWiki_talk:Watchlistsub|Talk]]
-</td><td>
-(for user &quot;$1&quot;)
-</td><td>
-{{int:Watchlistsub}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchmethod-list&action=edit watchmethod-list]<br>
-[[MediaWiki_talk:Watchmethod-list|Talk]]
-</td><td>
-checking watched pages for recent edits
-</td><td>
-{{int:Watchmethod-list}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchmethod-recent&action=edit watchmethod-recent]<br>
-[[MediaWiki_talk:Watchmethod-recent|Talk]]
-</td><td>
-checking recent edits for watched pages
-</td><td>
-{{int:Watchmethod-recent}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchnochange&action=edit watchnochange]<br>
-[[MediaWiki_talk:Watchnochange|Talk]]
-</td><td>
-None of your watched items were edited in the time period displayed.
-</td><td>
-{{int:Watchnochange}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchnologin&action=edit watchnologin]<br>
-[[MediaWiki_talk:Watchnologin|Talk]]
-</td><td>
-Not logged in
-</td><td>
-{{int:Watchnologin}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchnologintext&action=edit watchnologintext]<br>
-[[MediaWiki_talk:Watchnologintext|Talk]]
-</td><td>
-You must be &lt;a href=&quot;/wiki/Special:Userlogin&quot;&gt;logged in&lt;/a&gt;
-to modify your watchlist.
-</td><td>
-{{int:Watchnologintext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchthis&action=edit watchthis]<br>
-[[MediaWiki_talk:Watchthis|Talk]]
-</td><td>
-Watch this page
-</td><td>
-{{int:Watchthis}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Watchthispage&action=edit watchthispage]<br>
-[[MediaWiki_talk:Watchthispage|Talk]]
-</td><td>
-Watch this page
-</td><td>
-{{int:Watchthispage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Welcomecreation&action=edit welcomecreation]<br>
-[[MediaWiki_talk:Welcomecreation|Talk]]
-</td><td>
-&lt;h2&gt;Welcome, $1!&lt;/h2&gt;&lt;p&gt;Your account has been created.
-Don&#39;t forget to change your Wiktionary preferences.
-</td><td>
-{{int:Welcomecreation}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whatlinkshere&action=edit whatlinkshere]<br>
-[[MediaWiki_talk:Whatlinkshere|Talk]]
-</td><td>
-What links here
-</td><td>
-{{int:Whatlinkshere}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistacctext&action=edit whitelistacctext]<br>
-[[MediaWiki_talk:Whitelistacctext|Talk]]
-</td><td>
-To be allowed to create accounts in this Wiki you have to &#91;&#91;Special:Userlogin&#124;log]] in and have the appropriate permissions.
-</td><td>
-{{int:Whitelistacctext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistacctitle&action=edit whitelistacctitle]<br>
-[[MediaWiki_talk:Whitelistacctitle|Talk]]
-</td><td>
-You are not allowed to create an account
-</td><td>
-{{int:Whitelistacctitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistedittext&action=edit whitelistedittext]<br>
-[[MediaWiki_talk:Whitelistedittext|Talk]]
-</td><td>
-You have to &#91;&#91;Special:Userlogin&#124;login]] to edit pages.
-</td><td>
-{{int:Whitelistedittext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistedittitle&action=edit whitelistedittitle]<br>
-[[MediaWiki_talk:Whitelistedittitle|Talk]]
-</td><td>
-Login required to edit
-</td><td>
-{{int:Whitelistedittitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistreadtext&action=edit whitelistreadtext]<br>
-[[MediaWiki_talk:Whitelistreadtext|Talk]]
-</td><td>
-You have to &#91;&#91;Special:Userlogin&#124;login]] to read pages.
-</td><td>
-{{int:Whitelistreadtext}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Whitelistreadtitle&action=edit whitelistreadtitle]<br>
-[[MediaWiki_talk:Whitelistreadtitle|Talk]]
-</td><td>
-Login required to read
-</td><td>
-{{int:Whitelistreadtitle}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wikipediapage&action=edit wikipediapage]<br>
-[[MediaWiki_talk:Wikipediapage|Talk]]
-</td><td>
-View project page
-</td><td>
-{{int:Wikipediapage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wikititlesuffix&action=edit wikititlesuffix]<br>
-[[MediaWiki_talk:Wikititlesuffix|Talk]]
-</td><td>
-Wiktionary
-</td><td>
-{{int:Wikititlesuffix}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wlnote&action=edit wlnote]<br>
-[[MediaWiki_talk:Wlnote|Talk]]
-</td><td>
-Below are the last $1 changes in the last &lt;b&gt;$2&lt;/b&gt; hours.
-</td><td>
-{{int:Wlnote}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wlsaved&action=edit wlsaved]<br>
-[[MediaWiki_talk:Wlsaved|Talk]]
-</td><td>
-This is a saved version of your watchlist.
-</td><td>
-{{int:Wlsaved}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wlshowlast&action=edit wlshowlast]<br>
-[[MediaWiki_talk:Wlshowlast|Talk]]
-</td><td>
-Show last $1 hours $2 days $3
-</td><td>
-{{int:Wlshowlast}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wrong_wfQuery_params&action=edit wrong_wfQuery_params]<br>
-[[MediaWiki_talk:Wrong_wfQuery_params|Talk]]
-</td><td>
-Incorrect parameters to wfQuery()&lt;br /&gt;
-Function: $1&lt;br /&gt;
-Query: $2
-
-</td><td>
-{{int:Wrong_wfQuery_params}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Wrongpassword&action=edit wrongpassword]<br>
-[[MediaWiki_talk:Wrongpassword|Talk]]
-</td><td>
-The password you entered is incorrect. Please try again.
-</td><td>
-{{int:Wrongpassword}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourdiff&action=edit yourdiff]<br>
-[[MediaWiki_talk:Yourdiff|Talk]]
-</td><td>
-Differences
-</td><td>
-{{int:Yourdiff}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Youremail&action=edit youremail]<br>
-[[MediaWiki_talk:Youremail|Talk]]
-</td><td>
-Your email*
-</td><td>
-{{int:Youremail}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourname&action=edit yourname]<br>
-[[MediaWiki_talk:Yourname|Talk]]
-</td><td>
-Your user name
-</td><td>
-{{int:Yourname}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yournick&action=edit yournick]<br>
-[[MediaWiki_talk:Yournick|Talk]]
-</td><td>
-Your nickname (for signatures)
-</td><td>
-{{int:Yournick}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourpassword&action=edit yourpassword]<br>
-[[MediaWiki_talk:Yourpassword|Talk]]
-</td><td>
-Your password
-</td><td>
-{{int:Yourpassword}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourpasswordagain&action=edit yourpasswordagain]<br>
-[[MediaWiki_talk:Yourpasswordagain|Talk]]
-</td><td>
-Retype password
-</td><td>
-{{int:Yourpasswordagain}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourrealname&action=edit yourrealname]<br>
-[[MediaWiki_talk:Yourrealname|Talk]]
-</td><td>
-Your real name*
-</td><td>
-{{int:Yourrealname}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Yourtext&action=edit yourtext]<br>
-[[MediaWiki_talk:Yourtext|Talk]]
-</td><td>
-Your text
-</td><td>
-{{int:Yourtext}}
-</td></tr></table>
-
diff --git a/tests/parser/preprocess/Factorial.expected b/tests/parser/preprocess/Factorial.expected
deleted file mode 100644
index a10fd6ca..00000000
--- a/tests/parser/preprocess/Factorial.expected
+++ /dev/null
@@ -1,17 +0,0 @@
-<root><template><title>#expr:<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=00</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>01<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=01</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*01<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=02</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*02<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=03</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*03<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=04</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*04<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=05</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*05<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=06</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*06<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=07</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*07<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=08</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*08<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=09</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*09<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=10</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*10<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=11</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*11<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=12</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*12<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=13</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*13<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=14</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*14<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=15</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*15<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=16</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*16<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=17</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*17<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=18</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*18<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=19</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*19<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=20</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*20<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=21</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*21<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=22</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*22<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=23</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*23<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=24</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*24<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=25</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*25<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=26</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*26<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=27</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*27<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=28</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*28<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=29</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*29<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=30</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*30<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=31</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*31<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=32</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*32<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=33</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*33<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=34</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*34<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=35</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*35<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=36</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*36<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=37</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*37<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=38</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*38<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=39</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*39<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=40</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*40<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=41</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*41<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=42</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*42<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=43</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*43<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=44</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*44<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=45</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*45<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=46</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*46<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=47</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*47<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=48</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*48<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=49</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*49<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=50</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*50<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=51</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*51<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=52</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*52<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=53</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*53<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=54</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*54<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=55</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*55<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=56</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*56<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=57</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*57<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=58</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*58<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=59</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*59<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=60</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*60<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=61</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*61<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=62</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*62<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=63</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*63<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=64</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*64<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=65</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*65<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=66</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*66<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=67</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*67<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=68</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*68<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=69</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*69<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=70</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*70<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=71</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*71<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=72</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*72<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=73</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*73<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=74</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*74<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=75</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*75<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=76</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*76<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=77</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*77<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=78</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*78<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=79</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*79<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=80</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*80<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=81</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*81<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=82</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*82<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=83</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*83<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=84</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*84<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=85</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*85<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=86</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*86<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=87</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*87<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=88</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*88<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=89</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*89<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=90</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*90<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=91</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*91<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=92</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*92<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=93</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*93<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=94</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*94<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=95</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*95<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=96</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*96<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=97</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*97<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=98</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*98<template><title>#ifeq:<template><title>#expr:<tplarg><title>1</title></tplarg>&gt;=99</title></template></title><part><name index="1" /><value>1</value></part><part><name index="2" /><value>*99</value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></value></part></template></title></template><ignore>&lt;noinclude&gt;</ignore>
-<template lineStart="1"><title>Template documentation</title></template>
-This template finds the [[factorial]] of a number. To use it, enter:&lt;br /&gt;
-&lt;code&gt;&lt;nowiki&gt;<template><title>factorial</title><part><name index="1" /><value>input</value></part></template>&lt;/nowiki&gt;&lt;/code&gt;&lt;br /&gt;
-The input must be a positive interger smaller than 100 (better than most calculators, which go up to only 69). This template works by repeating conditional multiplications. Examples:&lt;br /&gt;
-*&lt;nowiki&gt;<template><title>factorial</title><part><name index="1" /><value>2</value></part></template>&lt;/nowiki&gt; gives <template><title>factorial</title><part><name index="1" /><value>2</value></part></template>
-*&lt;nowiki&gt;<template><title>factorial</title><part><name index="1" /><value>3</value></part></template>&lt;/nowiki&gt; gives <template><title>factorial</title><part><name index="1" /><value>3</value></part></template>
-*&lt;nowiki&gt;<template><title>factorial</title><part><name index="1" /><value>5</value></part></template>&lt;/nowiki&gt; gives <template><title>factorial</title><part><name index="1" /><value>5</value></part></template>
-*&lt;nowiki&gt;<template><title>factorial</title><part><name index="1" /><value>10</value></part></template>&lt;/nowiki&gt; gives <template><title>factorial</title><part><name index="1" /><value>10</value></part></template>
-*&lt;nowiki&gt;<template><title>factorial</title><part><name index="1" /><value>80</value></part></template>&lt;/nowiki&gt; gives <template><title>factorial</title><part><name index="1" /><value>80</value></part></template>
-*&lt;nowiki&gt;<template><title>factorial</title><part><name index="1" /><value>0.5</value></part></template>&lt;/nowiki&gt; gives <template><title>factorial</title><part><name index="1" /><value>0.5</value></part></template> (invalid input)
-*&lt;nowiki&gt;<template><title>factorial</title><part><name index="1" /><value>-1</value></part></template>&lt;/nowiki&gt; gives <template><title>factorial</title><part><name index="1" /><value>-1</value></part></template> (invalid input)
-<template lineStart="1"><title>esoteric</title></template>
-[[Category:Mathematical templates|<template><title>PAGENAME</title></template>]]
-<ignore>&lt;/noinclude&gt;</ignore>
-
-</root> \ No newline at end of file
diff --git a/tests/parser/preprocess/Factorial.txt b/tests/parser/preprocess/Factorial.txt
deleted file mode 100644
index 316f0792..00000000
--- a/tests/parser/preprocess/Factorial.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-{{#expr:{{#ifeq:{{#expr:{{{1}}}>=00}}|1|01{{#ifeq:{{#expr:{{{1}}}>=01}}|1|*01{{#ifeq:{{#expr:{{{1}}}>=02}}|1|*02{{#ifeq:{{#expr:{{{1}}}>=03}}|1|*03{{#ifeq:{{#expr:{{{1}}}>=04}}|1|*04{{#ifeq:{{#expr:{{{1}}}>=05}}|1|*05{{#ifeq:{{#expr:{{{1}}}>=06}}|1|*06{{#ifeq:{{#expr:{{{1}}}>=07}}|1|*07{{#ifeq:{{#expr:{{{1}}}>=08}}|1|*08{{#ifeq:{{#expr:{{{1}}}>=09}}|1|*09{{#ifeq:{{#expr:{{{1}}}>=10}}|1|*10{{#ifeq:{{#expr:{{{1}}}>=11}}|1|*11{{#ifeq:{{#expr:{{{1}}}>=12}}|1|*12{{#ifeq:{{#expr:{{{1}}}>=13}}|1|*13{{#ifeq:{{#expr:{{{1}}}>=14}}|1|*14{{#ifeq:{{#expr:{{{1}}}>=15}}|1|*15{{#ifeq:{{#expr:{{{1}}}>=16}}|1|*16{{#ifeq:{{#expr:{{{1}}}>=17}}|1|*17{{#ifeq:{{#expr:{{{1}}}>=18}}|1|*18{{#ifeq:{{#expr:{{{1}}}>=19}}|1|*19{{#ifeq:{{#expr:{{{1}}}>=20}}|1|*20{{#ifeq:{{#expr:{{{1}}}>=21}}|1|*21{{#ifeq:{{#expr:{{{1}}}>=22}}|1|*22{{#ifeq:{{#expr:{{{1}}}>=23}}|1|*23{{#ifeq:{{#expr:{{{1}}}>=24}}|1|*24{{#ifeq:{{#expr:{{{1}}}>=25}}|1|*25{{#ifeq:{{#expr:{{{1}}}>=26}}|1|*26{{#ifeq:{{#expr:{{{1}}}>=27}}|1|*27{{#ifeq:{{#expr:{{{1}}}>=28}}|1|*28{{#ifeq:{{#expr:{{{1}}}>=29}}|1|*29{{#ifeq:{{#expr:{{{1}}}>=30}}|1|*30{{#ifeq:{{#expr:{{{1}}}>=31}}|1|*31{{#ifeq:{{#expr:{{{1}}}>=32}}|1|*32{{#ifeq:{{#expr:{{{1}}}>=33}}|1|*33{{#ifeq:{{#expr:{{{1}}}>=34}}|1|*34{{#ifeq:{{#expr:{{{1}}}>=35}}|1|*35{{#ifeq:{{#expr:{{{1}}}>=36}}|1|*36{{#ifeq:{{#expr:{{{1}}}>=37}}|1|*37{{#ifeq:{{#expr:{{{1}}}>=38}}|1|*38{{#ifeq:{{#expr:{{{1}}}>=39}}|1|*39{{#ifeq:{{#expr:{{{1}}}>=40}}|1|*40{{#ifeq:{{#expr:{{{1}}}>=41}}|1|*41{{#ifeq:{{#expr:{{{1}}}>=42}}|1|*42{{#ifeq:{{#expr:{{{1}}}>=43}}|1|*43{{#ifeq:{{#expr:{{{1}}}>=44}}|1|*44{{#ifeq:{{#expr:{{{1}}}>=45}}|1|*45{{#ifeq:{{#expr:{{{1}}}>=46}}|1|*46{{#ifeq:{{#expr:{{{1}}}>=47}}|1|*47{{#ifeq:{{#expr:{{{1}}}>=48}}|1|*48{{#ifeq:{{#expr:{{{1}}}>=49}}|1|*49{{#ifeq:{{#expr:{{{1}}}>=50}}|1|*50{{#ifeq:{{#expr:{{{1}}}>=51}}|1|*51{{#ifeq:{{#expr:{{{1}}}>=52}}|1|*52{{#ifeq:{{#expr:{{{1}}}>=53}}|1|*53{{#ifeq:{{#expr:{{{1}}}>=54}}|1|*54{{#ifeq:{{#expr:{{{1}}}>=55}}|1|*55{{#ifeq:{{#expr:{{{1}}}>=56}}|1|*56{{#ifeq:{{#expr:{{{1}}}>=57}}|1|*57{{#ifeq:{{#expr:{{{1}}}>=58}}|1|*58{{#ifeq:{{#expr:{{{1}}}>=59}}|1|*59{{#ifeq:{{#expr:{{{1}}}>=60}}|1|*60{{#ifeq:{{#expr:{{{1}}}>=61}}|1|*61{{#ifeq:{{#expr:{{{1}}}>=62}}|1|*62{{#ifeq:{{#expr:{{{1}}}>=63}}|1|*63{{#ifeq:{{#expr:{{{1}}}>=64}}|1|*64{{#ifeq:{{#expr:{{{1}}}>=65}}|1|*65{{#ifeq:{{#expr:{{{1}}}>=66}}|1|*66{{#ifeq:{{#expr:{{{1}}}>=67}}|1|*67{{#ifeq:{{#expr:{{{1}}}>=68}}|1|*68{{#ifeq:{{#expr:{{{1}}}>=69}}|1|*69{{#ifeq:{{#expr:{{{1}}}>=70}}|1|*70{{#ifeq:{{#expr:{{{1}}}>=71}}|1|*71{{#ifeq:{{#expr:{{{1}}}>=72}}|1|*72{{#ifeq:{{#expr:{{{1}}}>=73}}|1|*73{{#ifeq:{{#expr:{{{1}}}>=74}}|1|*74{{#ifeq:{{#expr:{{{1}}}>=75}}|1|*75{{#ifeq:{{#expr:{{{1}}}>=76}}|1|*76{{#ifeq:{{#expr:{{{1}}}>=77}}|1|*77{{#ifeq:{{#expr:{{{1}}}>=78}}|1|*78{{#ifeq:{{#expr:{{{1}}}>=79}}|1|*79{{#ifeq:{{#expr:{{{1}}}>=80}}|1|*80{{#ifeq:{{#expr:{{{1}}}>=81}}|1|*81{{#ifeq:{{#expr:{{{1}}}>=82}}|1|*82{{#ifeq:{{#expr:{{{1}}}>=83}}|1|*83{{#ifeq:{{#expr:{{{1}}}>=84}}|1|*84{{#ifeq:{{#expr:{{{1}}}>=85}}|1|*85{{#ifeq:{{#expr:{{{1}}}>=86}}|1|*86{{#ifeq:{{#expr:{{{1}}}>=87}}|1|*87{{#ifeq:{{#expr:{{{1}}}>=88}}|1|*88{{#ifeq:{{#expr:{{{1}}}>=89}}|1|*89{{#ifeq:{{#expr:{{{1}}}>=90}}|1|*90{{#ifeq:{{#expr:{{{1}}}>=91}}|1|*91{{#ifeq:{{#expr:{{{1}}}>=92}}|1|*92{{#ifeq:{{#expr:{{{1}}}>=93}}|1|*93{{#ifeq:{{#expr:{{{1}}}>=94}}|1|*94{{#ifeq:{{#expr:{{{1}}}>=95}}|1|*95{{#ifeq:{{#expr:{{{1}}}>=96}}|1|*96{{#ifeq:{{#expr:{{{1}}}>=97}}|1|*97{{#ifeq:{{#expr:{{{1}}}>=98}}|1|*98{{#ifeq:{{#expr:{{{1}}}>=99}}|1|*99}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}<noinclude>
-{{Template documentation}}
-This template finds the [[factorial]] of a number. To use it, enter:<br />
-<code><nowiki>{{factorial|input}}</nowiki></code><br />
-The input must be a positive interger smaller than 100 (better than most calculators, which go up to only 69). This template works by repeating conditional multiplications. Examples:<br />
-*<nowiki>{{factorial|2}}</nowiki> gives {{factorial|2}}
-*<nowiki>{{factorial|3}}</nowiki> gives {{factorial|3}}
-*<nowiki>{{factorial|5}}</nowiki> gives {{factorial|5}}
-*<nowiki>{{factorial|10}}</nowiki> gives {{factorial|10}}
-*<nowiki>{{factorial|80}}</nowiki> gives {{factorial|80}}
-*<nowiki>{{factorial|0.5}}</nowiki> gives {{factorial|0.5}} (invalid input)
-*<nowiki>{{factorial|-1}}</nowiki> gives {{factorial|-1}} (invalid input)
-{{esoteric}}
-[[Category:Mathematical templates|{{PAGENAME}}]]
-</noinclude>
-
diff --git a/tests/parser/preprocess/Fundraising.expected b/tests/parser/preprocess/Fundraising.expected
deleted file mode 100644
index f5b32cc5..00000000
--- a/tests/parser/preprocess/Fundraising.expected
+++ /dev/null
@@ -1,18 +0,0 @@
-<root>&lt;div name=&quot;fundraising&quot; id=&quot;fundraising&quot; class=&quot;plainlinks&quot; style=&quot;margin-top:5px; text-align: center; background-color: #ffffe0; border: solid 1px #e0e0c0&quot;&gt;
-'''Pwede kang [[Wikimedia:give the gift of knowledge|maghandog ng kaalaman]] sa paraan ng [[Wikimedia:Fundraising#Donation_methods|pagbibigay ng donasyon sa Pundasyong Wikimedia!]]'''
-&lt;br /&gt;
-&lt;fundraising/&gt;
-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
-&lt;fundraisinglogo/&gt;
-&lt;br /&gt;
-&lt;b&gt;Ngayon, ang iyong [[Wikimedia:Fundraising|kontribusyon]] ay [[Wikimedia:Fundraising FAQ|itatambal]] ng isang anonimong kaibigan.&lt;/b&gt;
-&lt;br /&gt;
-&lt;small&gt;
-[[Wikimedia:Deductibility of donations|Pagbabawas sa mga buwis ng donasyon]]
-|
-[[Wikimedia:Fundraising FAQ|FAQ]]
-|
-[http://upload.wikimedia.org/wikipedia/foundation/2/28/Wikimedia_2006_fs.pdf Mga pampananalaping pahayag]
-&lt;/small&gt;
-&lt;/div&gt;
-</root> \ No newline at end of file
diff --git a/tests/parser/preprocess/Fundraising.txt b/tests/parser/preprocess/Fundraising.txt
deleted file mode 100644
index b868b4d8..00000000
--- a/tests/parser/preprocess/Fundraising.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-<div name="fundraising" id="fundraising" class="plainlinks" style="margin-top:5px; text-align: center; background-color: #ffffe0; border: solid 1px #e0e0c0">
-'''Pwede kang [[Wikimedia:give the gift of knowledge|maghandog ng kaalaman]] sa paraan ng [[Wikimedia:Fundraising#Donation_methods|pagbibigay ng donasyon sa Pundasyong Wikimedia!]]'''
-<br />
-<fundraising/>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-<fundraisinglogo/>
-<br />
-<b>Ngayon, ang iyong [[Wikimedia:Fundraising|kontribusyon]] ay [[Wikimedia:Fundraising FAQ|itatambal]] ng isang anonimong kaibigan.</b>
-<br />
-<small>
-[[Wikimedia:Deductibility of donations|Pagbabawas sa mga buwis ng donasyon]]
-|
-[[Wikimedia:Fundraising FAQ|FAQ]]
-|
-[http://upload.wikimedia.org/wikipedia/foundation/2/28/Wikimedia_2006_fs.pdf Mga pampananalaping pahayag]
-</small>
-</div>
diff --git a/tests/parser/preprocess/QuoteQuran.expected b/tests/parser/preprocess/QuoteQuran.expected
deleted file mode 100644
index e9a78e46..00000000
--- a/tests/parser/preprocess/QuoteQuran.expected
+++ /dev/null
@@ -1,140 +0,0 @@
-<root><ignore>&lt;noinclude&gt;</ignore><template><title>Template sandbox notice</title></template><ignore>&lt;/noinclude&gt;</ignore>
-&lt;div class=&quot;boilerplate metadata rfa&quot; style=&quot;background-color:#FFFFF5; margin: 2em 0 0 0; padding: 0 10px 0 10px; border: 1px solid #AAAAAA;&quot;&gt;The [[Qur'an]], [[sura|chapter]] <template><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 1) </title><part><name index="1" /><value> 1 ([[Al-Fatiha]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 2) </title><part><name index="1" /><value> 2 ([[Al-Baqara]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 3) </title><part><name index="1" /><value> 3 ([[Ali Imran]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 4) </title><part><name index="1" /><value> 4 ([[An-Nisa]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 5) </title><part><name index="1" /><value> 5 ([[Al-Ma'ida]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 6) </title><part><name index="1" /><value> 6 ([[Al-An'am]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 7) </title><part><name index="1" /><value> 7 ([[Al-A'raf]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 8) </title><part><name index="1" /><value> 8 ([[Al-Anfal]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 9) </title><part><name index="1" /><value> 9 ([[At-Tawba]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 10) </title><part><name index="1" /><value> 10 ([[Yunus (sura)|Yunus]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 11) </title><part><name index="1" /><value> 11 ([[Hud (sura)|Hud]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 12) </title><part><name index="1" /><value> 12 ([[Yusuf (sura)|Yusuf]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 13) </title><part><name index="1" /><value> 13 ([[Ar-Ra'd]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 14) </title><part><name index="1" /><value> 14 ([[Ibrahim (sura)|Ibrahim]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 15) </title><part><name index="1" /><value> 15 ([[Al-Hijr]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 16) </title><part><name index="1" /><value> 16 ([[An-Nahl]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 17) </title><part><name index="1" /><value> 17 ([[Al-Isra]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 18) </title><part><name index="1" /><value> 18 ([[Al-Kahf]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 19) </title><part><name index="1" /><value> 19 ([[Maryam (sura)|Maryam]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 20) </title><part><name index="1" /><value> 20 ([[Ta-Ha]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 21) </title><part><name index="1" /><value> 21 ([[Al-Anbiya]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 22) </title><part><name index="1" /><value> 22 ([[Al-Hajj]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 23) </title><part><name index="1" /><value> 23 ([[Al-Muminun]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 24) </title><part><name index="1" /><value> 24 ([[An-Noor]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 25) </title><part><name index="1" /><value> 25 ([[Al-Furqan]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 26) </title><part><name index="1" /><value> 26 ([[Ash-Shu'ara]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 27) </title><part><name index="1" /><value> 27 ([[An-Naml]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 28) </title><part><name index="1" /><value> 28 ([[Al-Qisas]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 29) </title><part><name index="1" /><value> 29 ([[Al-Ankabut]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 30) </title><part><name index="1" /><value> 30 ([[Ar-Rum]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 31) </title><part><name index="1" /><value> 31 ([[Luqman (sura)|Luqman]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 32) </title><part><name index="1" /><value> 32 ([[As-Sajda]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 33) </title><part><name index="1" /><value> 33 ([[Al-Ahzab]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 34) </title><part><name index="1" /><value> 34 ([[Saba (sura)|Saba]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 35) </title><part><name index="1" /><value> 35 ([[Fatir]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 36) </title><part><name index="1" /><value> 36 ([[Ya-Seen]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 37) </title><part><name index="1" /><value> 37 ([[As-Saaffat]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 38) </title><part><name index="1" /><value> 38 ([[Sad (sura)|Sad]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 39) </title><part><name index="1" /><value> 39 ([[Az-Zumar]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 40) </title><part><name index="1" /><value> 40 ([[Ghafir]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 41) </title><part><name index="1" /><value> 41 ([[Fussilat]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 42) </title><part><name index="1" /><value> 42 ([[Ash-Shura]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 43) </title><part><name index="1" /><value> 43 ([[Az-Zukhruf]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 44) </title><part><name index="1" /><value> 44 ([[Ad-Dukhan]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 45) </title><part><name index="1" /><value> 45 ([[Al-Jathiya]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 46) </title><part><name index="1" /><value> 46 ([[Al-Ahqaf]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 47) </title><part><name index="1" /><value> 47 ([[Muhammad (sura)|Muhammad]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 48) </title><part><name index="1" /><value> 48 ([[Al-Fath]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 49) </title><part><name index="1" /><value> 49 ([[Al-Hujraat]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 50) </title><part><name index="1" /><value> 50 ([[Qaf (sura)|Qaf]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 51) </title><part><name index="1" /><value> 51 ([[Adh-Dhariyat]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 52) </title><part><name index="1" /><value> 52 ([[At-Tur]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 53) </title><part><name index="1" /><value> 53 ([[An-Najm]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 54) </title><part><name index="1" /><value> 54 ([[Al-Qamar]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 55) </title><part><name index="1" /><value> 55 ([[Ar-Rahman]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 56) </title><part><name index="1" /><value> 56 ([[Al-Waqia]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 57) </title><part><name index="1" /><value> 57 ([[Al-Hadid]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 58) </title><part><name index="1" /><value> 58 ([[Al-Mujadila]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 59) </title><part><name index="1" /><value> 59 ([[Al-Hashr]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 60) </title><part><name index="1" /><value> 60 ([[Al-Mumtahina]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 61) </title><part><name index="1" /><value> 61 ([[As-Saff]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 62) </title><part><name index="1" /><value> 62 ([[Al-Jumua]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 63) </title><part><name index="1" /><value> 63 ([[Al-Munafiqoon]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 64) </title><part><name index="1" /><value> 64 ([[At-Taghabun]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 65) </title><part><name index="1" /><value> 65 ([[At-Talaq]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 66) </title><part><name index="1" /><value> 66 ([[At-Tahrim]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 67) </title><part><name index="1" /><value> 67 ([[Al-Mulk]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 68) </title><part><name index="1" /><value> 68 ([[Al-Qalam]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 69) </title><part><name index="1" /><value> 69 ([[Al-Haaqqa]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 70) </title><part><name index="1" /><value> 70 ([[Al-Maarij]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 71) </title><part><name index="1" /><value> 71 ([[Nooh (sura)|Nooh]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 72) </title><part><name index="1" /><value> 72 ([[Al-Jinn]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 73) </title><part><name index="1" /><value> 73 ([[Al-Muzzammil]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 74) </title><part><name index="1" /><value> 74 ([[Al-Muddaththir]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 75) </title><part><name index="1" /><value> 75 ([[Al-Qiyama]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 76) </title><part><name index="1" /><value> 76 ([[Al-Insan]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 77) </title><part><name index="1" /><value> 77 ([[Al-Mursalat]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 78) </title><part><name index="1" /><value> 78 ([[An-Naba]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 79) </title><part><name index="1" /><value> 79 ([[An-Naziat]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 80) </title><part><name index="1" /><value> 80 ([[Abasa]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 81) </title><part><name index="1" /><value> 81 ([[At-Takwir]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 82) </title><part><name index="1" /><value> 82 ([[Al-Infitar]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 83) </title><part><name index="1" /><value> 83 ([[Al-Mutaffifin]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 84) </title><part><name index="1" /><value> 84 ([[Al-Inshiqaq]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 85) </title><part><name index="1" /><value> 85 ([[Al-Burooj]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 86) </title><part><name index="1" /><value> 86 ([[At-Tariq]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 87) </title><part><name index="1" /><value> 87 ([[Al-Ala]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 88) </title><part><name index="1" /><value> 88 ([[Al-Ghashiya]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 89) </title><part><name index="1" /><value> 89 ([[Al-Fajr (sura)|Al-Fajr]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 90) </title><part><name index="1" /><value> 90 ([[Al-Balad]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 91) </title><part><name index="1" /><value> 91 ([[Ash-Shams]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 92) </title><part><name index="1" /><value> 92 ([[Al-Lail]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 93) </title><part><name index="1" /><value> 93 ([[Ad-Dhuha]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 94) </title><part><name index="1" /><value> 94 ([[Al-Inshirah]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 95) </title><part><name index="1" /><value> 95 ([[At-Tin]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 96) </title><part><name index="1" /><value> 96 ([[Al-Alaq]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 97) </title><part><name index="1" /><value> 97 ([[Al-Qadr]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 98) </title><part><name index="1" /><value> 98 ([[Al-Bayyina]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 99) </title><part><name index="1" /><value> 99 ([[Az-Zalzala]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 100) </title><part><name index="1" /><value> 100 ([[Al-Adiyat]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 101) </title><part><name index="1" /><value> 101 ([[Al-Qaria]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 102) </title><part><name index="1" /><value> 102 ([[At-Takathur]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 103) </title><part><name index="1" /><value> 103 ([[Al-Asr]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 104) </title><part><name index="1" /><value> 104 ([[Al-Humaza]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 105) </title><part><name index="1" /><value> 105 ([[Al-Fil]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 106) </title><part><name index="1" /><value> 106 ([[Quraysh (sura)|Quraysh]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 107) </title><part><name index="1" /><value> 107 ([[Al-Ma'un]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 108) </title><part><name index="1" /><value> 108 ([[Al-Kawthar]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 109) </title><part><name index="1" /><value> 109 ([[Al-Kafirun]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 110) </title><part><name index="1" /><value> 110 ([[An-Nasr]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 111) </title><part><name index="1" /><value> 111 ([[Al-Masadd]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 112) </title><part><name index="1" /><value> 112 ([[Al-Ikhlas]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 113) </title><part><name index="1" /><value> 113 ([[Al-Falaq]]) </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg> = 114) </title><part><name index="1" /><value> 114 ([[An-Nas]]) </value></part><part><name index="2" /><value>
-error </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template>, [[ayat|verse]] [http://www.usc.edu/dept/MSA/quran/<template><title>three digit</title><part><name index="1" /><value><tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg></value></part></template>.qmt.html#<template><title>three digit</title><part><name index="1" /><value><tplarg><title>1</title><part><name index="1" /><value>1</value></part></tplarg></value></part></template>.<template><title>three digit</title><part><name index="1" /><value><tplarg><title>2</title><part><name index="1" /><value>1</value></part></tplarg></value></part></template> <tplarg><title>2</title><part><name index="1" /><value>1</value></part></tplarg>]''':'''<template><title>cquote</title><part><name index="1" /><value> <tplarg><title>3</title><part><name index="1" /><value>Default text</value></part></tplarg>&amp;mdash; &lt;small&gt;[[Qur'an translations|translated]] by <template><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 0) </title><part><name index="1" /><value> Unknown </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 1) </title><part><name index="1" /><value> [[Salman the Persian]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 101) </title><part><name index="1" /><value> [[Marmaduke Pickthall]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 102) </title><part><name index="1" /><value> [[Abdullah Yusuf Ali]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 601) </title><part><name index="1" /><value> [[Muhammad Muhsin Khan]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 701) </title><part><name index="1" /><value> [[Mohammed Habib Shakir|M. H. Shakir]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 901) </title><part><name index="1" /><value> [[Maulana Muhammad Ali]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 902) </title><part><name index="1" /><value> [[Rashad Khalifa]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 1001) </title><part><name index="1" /><value> [[Theodor Bibliander]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 1002) </title><part><name index="1" /><value> [[Robert of Ketton]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 1003) </title><part><name index="1" /><value> [[Andre du Ryer]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 1004) </title><part><name index="1" /><value> [[Alexander Ross (writer)|Alexander Ross]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 1005) </title><part><name index="1" /><value> [[Abraham Hinckelmann]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 1006) </title><part><name index="1" /><value> [[George Sale]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 1007) </title><part><name index="1" /><value> [[John Medows Rodwell]] </value></part><part><name index="2" /><value>
-<template lineStart="1"><title>#ifexpr: (<tplarg><title>4</title><part><name index="1" /><value>0</value></part></tplarg> = 1008) </title><part><name index="1" /><value> [[Arthur John Arberry]] </value></part><part><name index="2" /><value>
-error </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template> </value></part></template>&lt;/small&gt;
-<template lineStart="1"><title>#if:<tplarg><title>trans</title><part><name index="1" /><value></value></part></tplarg></title><part><name index="1" /><value>
-----
-[[Transliteration]]: <tplarg><title>trans</title></tplarg></value></part><part><name index="2" /><value> </value></part></template>
-<template lineStart="1"><title>#if:<tplarg><title>arab</title><part><name index="1" /><value></value></part></tplarg></title><part><name index="1" /><value>
-----
-[[Arabic language|Arabic]]: <tplarg><title>arab</title></tplarg></value></part><part><name index="2" /><value> </value></part></template> </value></part></template>&lt;/font&gt;&lt;/div&gt;
-
-</root> \ No newline at end of file
diff --git a/tests/parser/preprocess/QuoteQuran.txt b/tests/parser/preprocess/QuoteQuran.txt
deleted file mode 100644
index 3cfac5b2..00000000
--- a/tests/parser/preprocess/QuoteQuran.txt
+++ /dev/null
@@ -1,139 +0,0 @@
-<noinclude>{{Template sandbox notice}}</noinclude>
-<div class="boilerplate metadata rfa" style="background-color:#FFFFF5; margin: 2em 0 0 0; padding: 0 10px 0 10px; border: 1px solid #AAAAAA;">The [[Qur'an]], [[sura|chapter]] {{#ifexpr: ({{{1|1}}} = 1) | 1 ([[Al-Fatiha]]) |
-{{#ifexpr: ({{{1|1}}} = 2) | 2 ([[Al-Baqara]]) |
-{{#ifexpr: ({{{1|1}}} = 3) | 3 ([[Ali Imran]]) |
-{{#ifexpr: ({{{1|1}}} = 4) | 4 ([[An-Nisa]]) |
-{{#ifexpr: ({{{1|1}}} = 5) | 5 ([[Al-Ma'ida]]) |
-{{#ifexpr: ({{{1|1}}} = 6) | 6 ([[Al-An'am]]) |
-{{#ifexpr: ({{{1|1}}} = 7) | 7 ([[Al-A'raf]]) |
-{{#ifexpr: ({{{1|1}}} = 8) | 8 ([[Al-Anfal]]) |
-{{#ifexpr: ({{{1|1}}} = 9) | 9 ([[At-Tawba]]) |
-{{#ifexpr: ({{{1|1}}} = 10) | 10 ([[Yunus (sura)|Yunus]]) |
-{{#ifexpr: ({{{1|1}}} = 11) | 11 ([[Hud (sura)|Hud]]) |
-{{#ifexpr: ({{{1|1}}} = 12) | 12 ([[Yusuf (sura)|Yusuf]]) |
-{{#ifexpr: ({{{1|1}}} = 13) | 13 ([[Ar-Ra'd]]) |
-{{#ifexpr: ({{{1|1}}} = 14) | 14 ([[Ibrahim (sura)|Ibrahim]]) |
-{{#ifexpr: ({{{1|1}}} = 15) | 15 ([[Al-Hijr]]) |
-{{#ifexpr: ({{{1|1}}} = 16) | 16 ([[An-Nahl]]) |
-{{#ifexpr: ({{{1|1}}} = 17) | 17 ([[Al-Isra]]) |
-{{#ifexpr: ({{{1|1}}} = 18) | 18 ([[Al-Kahf]]) |
-{{#ifexpr: ({{{1|1}}} = 19) | 19 ([[Maryam (sura)|Maryam]]) |
-{{#ifexpr: ({{{1|1}}} = 20) | 20 ([[Ta-Ha]]) |
-{{#ifexpr: ({{{1|1}}} = 21) | 21 ([[Al-Anbiya]]) |
-{{#ifexpr: ({{{1|1}}} = 22) | 22 ([[Al-Hajj]]) |
-{{#ifexpr: ({{{1|1}}} = 23) | 23 ([[Al-Muminun]]) |
-{{#ifexpr: ({{{1|1}}} = 24) | 24 ([[An-Noor]]) |
-{{#ifexpr: ({{{1|1}}} = 25) | 25 ([[Al-Furqan]]) |
-{{#ifexpr: ({{{1|1}}} = 26) | 26 ([[Ash-Shu'ara]]) |
-{{#ifexpr: ({{{1|1}}} = 27) | 27 ([[An-Naml]]) |
-{{#ifexpr: ({{{1|1}}} = 28) | 28 ([[Al-Qisas]]) |
-{{#ifexpr: ({{{1|1}}} = 29) | 29 ([[Al-Ankabut]]) |
-{{#ifexpr: ({{{1|1}}} = 30) | 30 ([[Ar-Rum]]) |
-{{#ifexpr: ({{{1|1}}} = 31) | 31 ([[Luqman (sura)|Luqman]]) |
-{{#ifexpr: ({{{1|1}}} = 32) | 32 ([[As-Sajda]]) |
-{{#ifexpr: ({{{1|1}}} = 33) | 33 ([[Al-Ahzab]]) |
-{{#ifexpr: ({{{1|1}}} = 34) | 34 ([[Saba (sura)|Saba]]) |
-{{#ifexpr: ({{{1|1}}} = 35) | 35 ([[Fatir]]) |
-{{#ifexpr: ({{{1|1}}} = 36) | 36 ([[Ya-Seen]]) |
-{{#ifexpr: ({{{1|1}}} = 37) | 37 ([[As-Saaffat]]) |
-{{#ifexpr: ({{{1|1}}} = 38) | 38 ([[Sad (sura)|Sad]]) |
-{{#ifexpr: ({{{1|1}}} = 39) | 39 ([[Az-Zumar]]) |
-{{#ifexpr: ({{{1|1}}} = 40) | 40 ([[Ghafir]]) |
-{{#ifexpr: ({{{1|1}}} = 41) | 41 ([[Fussilat]]) |
-{{#ifexpr: ({{{1|1}}} = 42) | 42 ([[Ash-Shura]]) |
-{{#ifexpr: ({{{1|1}}} = 43) | 43 ([[Az-Zukhruf]]) |
-{{#ifexpr: ({{{1|1}}} = 44) | 44 ([[Ad-Dukhan]]) |
-{{#ifexpr: ({{{1|1}}} = 45) | 45 ([[Al-Jathiya]]) |
-{{#ifexpr: ({{{1|1}}} = 46) | 46 ([[Al-Ahqaf]]) |
-{{#ifexpr: ({{{1|1}}} = 47) | 47 ([[Muhammad (sura)|Muhammad]]) |
-{{#ifexpr: ({{{1|1}}} = 48) | 48 ([[Al-Fath]]) |
-{{#ifexpr: ({{{1|1}}} = 49) | 49 ([[Al-Hujraat]]) |
-{{#ifexpr: ({{{1|1}}} = 50) | 50 ([[Qaf (sura)|Qaf]]) |
-{{#ifexpr: ({{{1|1}}} = 51) | 51 ([[Adh-Dhariyat]]) |
-{{#ifexpr: ({{{1|1}}} = 52) | 52 ([[At-Tur]]) |
-{{#ifexpr: ({{{1|1}}} = 53) | 53 ([[An-Najm]]) |
-{{#ifexpr: ({{{1|1}}} = 54) | 54 ([[Al-Qamar]]) |
-{{#ifexpr: ({{{1|1}}} = 55) | 55 ([[Ar-Rahman]]) |
-{{#ifexpr: ({{{1|1}}} = 56) | 56 ([[Al-Waqia]]) |
-{{#ifexpr: ({{{1|1}}} = 57) | 57 ([[Al-Hadid]]) |
-{{#ifexpr: ({{{1|1}}} = 58) | 58 ([[Al-Mujadila]]) |
-{{#ifexpr: ({{{1|1}}} = 59) | 59 ([[Al-Hashr]]) |
-{{#ifexpr: ({{{1|1}}} = 60) | 60 ([[Al-Mumtahina]]) |
-{{#ifexpr: ({{{1|1}}} = 61) | 61 ([[As-Saff]]) |
-{{#ifexpr: ({{{1|1}}} = 62) | 62 ([[Al-Jumua]]) |
-{{#ifexpr: ({{{1|1}}} = 63) | 63 ([[Al-Munafiqoon]]) |
-{{#ifexpr: ({{{1|1}}} = 64) | 64 ([[At-Taghabun]]) |
-{{#ifexpr: ({{{1|1}}} = 65) | 65 ([[At-Talaq]]) |
-{{#ifexpr: ({{{1|1}}} = 66) | 66 ([[At-Tahrim]]) |
-{{#ifexpr: ({{{1|1}}} = 67) | 67 ([[Al-Mulk]]) |
-{{#ifexpr: ({{{1|1}}} = 68) | 68 ([[Al-Qalam]]) |
-{{#ifexpr: ({{{1|1}}} = 69) | 69 ([[Al-Haaqqa]]) |
-{{#ifexpr: ({{{1|1}}} = 70) | 70 ([[Al-Maarij]]) |
-{{#ifexpr: ({{{1|1}}} = 71) | 71 ([[Nooh (sura)|Nooh]]) |
-{{#ifexpr: ({{{1|1}}} = 72) | 72 ([[Al-Jinn]]) |
-{{#ifexpr: ({{{1|1}}} = 73) | 73 ([[Al-Muzzammil]]) |
-{{#ifexpr: ({{{1|1}}} = 74) | 74 ([[Al-Muddaththir]]) |
-{{#ifexpr: ({{{1|1}}} = 75) | 75 ([[Al-Qiyama]]) |
-{{#ifexpr: ({{{1|1}}} = 76) | 76 ([[Al-Insan]]) |
-{{#ifexpr: ({{{1|1}}} = 77) | 77 ([[Al-Mursalat]]) |
-{{#ifexpr: ({{{1|1}}} = 78) | 78 ([[An-Naba]]) |
-{{#ifexpr: ({{{1|1}}} = 79) | 79 ([[An-Naziat]]) |
-{{#ifexpr: ({{{1|1}}} = 80) | 80 ([[Abasa]]) |
-{{#ifexpr: ({{{1|1}}} = 81) | 81 ([[At-Takwir]]) |
-{{#ifexpr: ({{{1|1}}} = 82) | 82 ([[Al-Infitar]]) |
-{{#ifexpr: ({{{1|1}}} = 83) | 83 ([[Al-Mutaffifin]]) |
-{{#ifexpr: ({{{1|1}}} = 84) | 84 ([[Al-Inshiqaq]]) |
-{{#ifexpr: ({{{1|1}}} = 85) | 85 ([[Al-Burooj]]) |
-{{#ifexpr: ({{{1|1}}} = 86) | 86 ([[At-Tariq]]) |
-{{#ifexpr: ({{{1|1}}} = 87) | 87 ([[Al-Ala]]) |
-{{#ifexpr: ({{{1|1}}} = 88) | 88 ([[Al-Ghashiya]]) |
-{{#ifexpr: ({{{1|1}}} = 89) | 89 ([[Al-Fajr (sura)|Al-Fajr]]) |
-{{#ifexpr: ({{{1|1}}} = 90) | 90 ([[Al-Balad]]) |
-{{#ifexpr: ({{{1|1}}} = 91) | 91 ([[Ash-Shams]]) |
-{{#ifexpr: ({{{1|1}}} = 92) | 92 ([[Al-Lail]]) |
-{{#ifexpr: ({{{1|1}}} = 93) | 93 ([[Ad-Dhuha]]) |
-{{#ifexpr: ({{{1|1}}} = 94) | 94 ([[Al-Inshirah]]) |
-{{#ifexpr: ({{{1|1}}} = 95) | 95 ([[At-Tin]]) |
-{{#ifexpr: ({{{1|1}}} = 96) | 96 ([[Al-Alaq]]) |
-{{#ifexpr: ({{{1|1}}} = 97) | 97 ([[Al-Qadr]]) |
-{{#ifexpr: ({{{1|1}}} = 98) | 98 ([[Al-Bayyina]]) |
-{{#ifexpr: ({{{1|1}}} = 99) | 99 ([[Az-Zalzala]]) |
-{{#ifexpr: ({{{1|1}}} = 100) | 100 ([[Al-Adiyat]]) |
-{{#ifexpr: ({{{1|1}}} = 101) | 101 ([[Al-Qaria]]) |
-{{#ifexpr: ({{{1|1}}} = 102) | 102 ([[At-Takathur]]) |
-{{#ifexpr: ({{{1|1}}} = 103) | 103 ([[Al-Asr]]) |
-{{#ifexpr: ({{{1|1}}} = 104) | 104 ([[Al-Humaza]]) |
-{{#ifexpr: ({{{1|1}}} = 105) | 105 ([[Al-Fil]]) |
-{{#ifexpr: ({{{1|1}}} = 106) | 106 ([[Quraysh (sura)|Quraysh]]) |
-{{#ifexpr: ({{{1|1}}} = 107) | 107 ([[Al-Ma'un]]) |
-{{#ifexpr: ({{{1|1}}} = 108) | 108 ([[Al-Kawthar]]) |
-{{#ifexpr: ({{{1|1}}} = 109) | 109 ([[Al-Kafirun]]) |
-{{#ifexpr: ({{{1|1}}} = 110) | 110 ([[An-Nasr]]) |
-{{#ifexpr: ({{{1|1}}} = 111) | 111 ([[Al-Masadd]]) |
-{{#ifexpr: ({{{1|1}}} = 112) | 112 ([[Al-Ikhlas]]) |
-{{#ifexpr: ({{{1|1}}} = 113) | 113 ([[Al-Falaq]]) |
-{{#ifexpr: ({{{1|1}}} = 114) | 114 ([[An-Nas]]) |
-error }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }}, [[ayat|verse]] [http://www.usc.edu/dept/MSA/quran/{{three digit|{{{1|1}}}}}.qmt.html#{{three digit|{{{1|1}}}}}.{{three digit|{{{2|1}}}}} {{{2|1}}}]''':'''{{cquote| {{{3|Default text}}}&mdash; <small>[[Qur'an translations|translated]] by {{#ifexpr: ({{{4|0}}} = 0) | Unknown |
-{{#ifexpr: ({{{4|0}}} = 1) | [[Salman the Persian]] |
-{{#ifexpr: ({{{4|0}}} = 101) | [[Marmaduke Pickthall]] |
-{{#ifexpr: ({{{4|0}}} = 102) | [[Abdullah Yusuf Ali]] |
-{{#ifexpr: ({{{4|0}}} = 601) | [[Muhammad Muhsin Khan]] |
-{{#ifexpr: ({{{4|0}}} = 701) | [[Mohammed Habib Shakir|M. H. Shakir]] |
-{{#ifexpr: ({{{4|0}}} = 901) | [[Maulana Muhammad Ali]] |
-{{#ifexpr: ({{{4|0}}} = 902) | [[Rashad Khalifa]] |
-{{#ifexpr: ({{{4|0}}} = 1001) | [[Theodor Bibliander]] |
-{{#ifexpr: ({{{4|0}}} = 1002) | [[Robert of Ketton]] |
-{{#ifexpr: ({{{4|0}}} = 1003) | [[Andre du Ryer]] |
-{{#ifexpr: ({{{4|0}}} = 1004) | [[Alexander Ross (writer)|Alexander Ross]] |
-{{#ifexpr: ({{{4|0}}} = 1005) | [[Abraham Hinckelmann]] |
-{{#ifexpr: ({{{4|0}}} = 1006) | [[George Sale]] |
-{{#ifexpr: ({{{4|0}}} = 1007) | [[John Medows Rodwell]] |
-{{#ifexpr: ({{{4|0}}} = 1008) | [[Arthur John Arberry]] |
-error }} }} }} }} }} }} }} }} }} }} }} }} }} }} }} }}</small>
-{{#if:{{{trans|}}}|
-----
-[[Transliteration]]: {{{trans}}}| }}
-{{#if:{{{arab|}}}|
-----
-[[Arabic language|Arabic]]: {{{arab}}}| }} }}</font></div>
-
diff --git a/tests/parserTests.php b/tests/parserTests.php
deleted file mode 100644
index 4df9a618..00000000
--- a/tests/parserTests.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-/**
- * MediaWiki parser test suite
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Testing
- */
-
-$otions = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled' );
-$optionsWithArgs = array( 'regex', 'filter', 'seed', 'setversion' );
-
-require_once( __DIR__ . '/../maintenance/commandLine.inc' );
-
-if ( isset( $options['help'] ) ) {
- echo <<<ENDS
-MediaWiki $wgVersion parser test suite
-Usage: php parserTests.php [options...]
-
-Options:
- --quick Suppress diff output of failed tests
- --quiet Suppress notification of passed tests (shows only failed tests)
- --show-output Show expected and actual output
- --color[=yes|no] Override terminal detection and force color output on or off
- use wgCommandLineDarkBg = true; if your term is dark
- --regex Only run tests whose descriptions which match given regex
- --filter Alias for --regex
- --file=<testfile> Run test cases from a custom file instead of parserTests.txt
- --record Record tests in database
- --compare Compare with recorded results, without updating the database.
- --setversion When using --record, set the version string to use (useful
- with git-svn so that you can get the exact revision)
- --keep-uploads Re-use the same upload directory for each test, don't delete it
- --fuzz Do a fuzz test instead of a normal test
- --seed <n> Start the fuzz test from the specified seed
- --help Show this help message
- --run-disabled run disabled tests
-
-ENDS;
- exit( 0 );
-}
-
-# Cases of weird db corruption were encountered when running tests on earlyish
-# versions of SQLite
-if ( $wgDBtype == 'sqlite' ) {
- $db = wfGetDB( DB_MASTER );
- $version = $db->getServerVersion();
- if ( version_compare( $version, '3.6' ) < 0 ) {
- die( "Parser tests require SQLite version 3.6 or later, you have $version\n" );
- }
-}
-
-# There is a convention that the parser should never
-# refer to $wgTitle directly, but instead use the title
-# passed to it.
-$wgTitle = Title::newFromText( 'Parser test script do not use' );
-$tester = new ParserTest($options);
-
-if ( isset( $options['file'] ) ) {
- $files = array( $options['file'] );
-} else {
- // Default parser tests and any set from extensions or local config
- $files = $wgParserTestFiles;
-}
-
-# Print out software version to assist with locating regressions
-$version = SpecialVersion::getVersion();
-echo( "This is MediaWiki version {$version}.\n\n" );
-
-if ( isset( $options['fuzz'] ) ) {
- $tester->fuzzTest( $files );
-} else {
- $ok = $tester->runTestsFromFiles( $files );
- exit ( $ok ? 0 : 1 );
-}
diff --git a/tests/phpunit/Makefile b/tests/phpunit/Makefile
deleted file mode 100644
index 8a55dae0..00000000
--- a/tests/phpunit/Makefile
+++ /dev/null
@@ -1,91 +0,0 @@
-.PHONY: help test phpunit install coverage warning destructive parser noparser safe databaseless list-groups
-.DEFAULT: warning
-
-SHELL = /bin/sh
-CONFIG_FILE = $(shell pwd)/suite.xml
-PHP = php
-PU = ${PHP} phpunit.php --configuration ${CONFIG_FILE} ${FLAGS}
-
-all test: warning
-
-warning:
- @echo "Run 'make help' to get usage"
- @echo ""
- @echo "WARNING -- some tests are DESTRUCTIVE and will alter your wiki."
- @echo "DO NOT RUN THESE TESTS on a production wiki."
- @echo ""
- @echo "Until the default tests are made non-destructive, you can run"
- @echo "the destructive tests like so:"
- @echo ""
- @echo " make destructive"
- @echo ""
- @echo "Some tests are expected to be safe, you can run them with"
- @echo ""
- @echo " make safe"
- @echo ""
- @echo "You are recommended to run the tests with read-only credentials."
- @echo ""
- @echo "If you don't have a database running, you can still run"
- @echo ""
- @echo " make databaseless"
- @echo ""
-
-destructive: phpunit
-
-phpunit:
- ${PU}
-
-install:
- ./install-phpunit.sh
-
-tap:
- ${PU} --tap
-
-coverage:
- ${PU} --coverage-html ../../docs/code-coverage
-
-parser:
- ${PU} --group Parser
-parserfuzz:
- @echo "******************************************************************"
- @echo "* This WILL kill your computer by eating all memory AND all swap *"
- @echo "* *"
- @echo "* If you are on a production machine. ABORT NOW!! *"
- @echo "* Press control+C to stop *"
- @echo "* *"
- @echo "******************************************************************"
- ${PU} --group Parser,ParserFuzz
-noparser:
- ${PU} --exclude-group Parser,Broken,ParserFuzz,Stub
-
-safe:
- ${PU} --exclude-group Broken,ParserFuzz,Destructive,Stub
-
-databaseless:
- ${PU} --exclude-group Broken,ParserFuzz,Destructive,Database,Stub
-
-database:
- ${PU} --exclude-group Broken,ParserFuzz,Destructive,Stub --group Database
-
-list-groups:
- ${PU} --list-groups
-
-help:
- # Usage:
- # make <target> [OPTION=value]
- #
- # Targets:
- # phpunit (default) Run all the tests with phpunit
- # install Install PHPUnit from phpunit.de
- # tap Run the tests individually through Test::Harness's prove(1)
- # help You're looking at it!
- # coverage Run the tests and generates an HTML code coverage report
- # You will need the Xdebug PHP extension for the later.
- # [no]parser Skip or only run Parser tests
- #
- # list-groups List availabe Tests groups.
- #
- # Options:
- # CONFIG_FILE Path to a PHPUnit configuration file (default: suite.xml)
- # FLAGS Additional flags to pass to PHPUnit
- # PHP Path to php
diff --git a/tests/phpunit/MediaWikiLangTestCase.php b/tests/phpunit/MediaWikiLangTestCase.php
deleted file mode 100644
index 6dd8ea35..00000000
--- a/tests/phpunit/MediaWikiLangTestCase.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/**
- * Base class that store and restore the Language objects
- */
-abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
- private static $oldLang;
- private static $oldContLang;
-
- public function setUp() {
- global $wgLanguageCode, $wgLang, $wgContLang;
-
- parent::setUp();
-
- self::$oldLang = $wgLang;
- self::$oldContLang = $wgContLang;
-
- if( $wgLanguageCode != $wgContLang->getCode() ) {
- throw new MWException("Error in MediaWikiLangTestCase::setUp(): " .
- "\$wgLanguageCode ('$wgLanguageCode') is different from " .
- "\$wgContLang->getCode() (" . $wgContLang->getCode() . ")" );
- }
-
- $wgLanguageCode = 'en'; # For mainpage to be 'Main Page'
-
- $wgContLang = $wgLang = Language::factory( $wgLanguageCode );
- MessageCache::singleton()->disable();
-
- }
-
- public function tearDown() {
- global $wgContLang, $wgLang, $wgLanguageCode;
- $wgLang = self::$oldLang;
-
- $wgContLang = self::$oldContLang;
- $wgLanguageCode = $wgContLang->getCode();
- self::$oldContLang = self::$oldLang = null;
-
- parent::tearDown();
- }
-
-}
diff --git a/tests/phpunit/MediaWikiPHPUnitCommand.php b/tests/phpunit/MediaWikiPHPUnitCommand.php
deleted file mode 100644
index fca32515..00000000
--- a/tests/phpunit/MediaWikiPHPUnitCommand.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-
-class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
-
- static $additionalOptions = array(
- 'regex=' => false,
- 'file=' => false,
- 'use-filebackend=' => false,
- 'keep-uploads' => false,
- 'use-normal-tables' => false,
- 'reuse-db' => false,
- );
-
- public function __construct() {
- foreach( self::$additionalOptions as $option => $default ) {
- $this->longOptions[$option] = $option . 'Handler';
- }
-
- }
-
- public static function main( $exit = true ) {
- $command = new self;
-
- if( wfIsWindows() ) {
- # Windows does not come anymore with ANSI.SYS loaded by default
- # PHPUnit uses the suite.xml parameters to enable/disable colors
- # which can be then forced to be enabled with --colors.
- # The below code inject a parameter just like if the user called
- # phpunit with a --no-color option (which does not exist). It
- # overrides the suite.xml setting.
- # Probably fix bug 29226
- $command->arguments['colors'] = false;
- }
-
- # Makes MediaWiki PHPUnit directory includable so the PHPUnit will
- # be able to resolve relative files inclusion such as suites/*
- # PHPUnit uses stream_resolve_include_path() internally
- # See bug 32022
- set_include_path(
- __DIR__
- .PATH_SEPARATOR
- . get_include_path()
- );
-
- $command->run($_SERVER['argv'], $exit);
- }
-
- public function __call( $func, $args ) {
-
- if( substr( $func, -7 ) == 'Handler' ) {
- if( is_null( $args[0] ) ) $args[0] = true; //Booleans
- self::$additionalOptions[substr( $func, 0, -7 ) ] = $args[0];
- }
- }
-
- public function showHelp() {
- parent::showHelp();
-
- print <<<EOT
-
-ParserTest-specific options:
-
- --regex="<regex>" Only run parser tests that match the given regex
- --file="<filename>" Prints the version and exits.
- --keep-uploads Re-use the same upload directory for each test, don't delete it
-
-
-Database options:
- --use-normal-tables Use normal DB tables.
- --reuse-db Init DB only if tables are missing and keep after finish.
-
-
-EOT;
- }
-
-}
diff --git a/tests/phpunit/MediaWikiTestCase.php b/tests/phpunit/MediaWikiTestCase.php
deleted file mode 100644
index 1cc45e08..00000000
--- a/tests/phpunit/MediaWikiTestCase.php
+++ /dev/null
@@ -1,547 +0,0 @@
-<?php
-
-abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
- public $suite;
- public $regex = '';
- public $runDisabled = false;
-
- /**
- * @var Array of TestUser
- */
- public static $users;
-
- /**
- * @var DatabaseBase
- */
- protected $db;
- protected $oldTablePrefix;
- protected $useTemporaryTables = true;
- protected $reuseDB = false;
- protected $tablesUsed = array(); // tables with data
-
- private static $dbSetup = false;
-
- /**
- * Holds the paths of temporary files/directories created through getNewTempFile,
- * and getNewTempDirectory
- *
- * @var array
- */
- private $tmpfiles = array();
-
-
- /**
- * Table name prefixes. Oracle likes it shorter.
- */
- const DB_PREFIX = 'unittest_';
- const ORA_DB_PREFIX = 'ut_';
-
- protected $supportedDBs = array(
- 'mysql',
- 'sqlite',
- 'postgres',
- 'oracle'
- );
-
- function __construct( $name = null, array $data = array(), $dataName = '' ) {
- parent::__construct( $name, $data, $dataName );
-
- $this->backupGlobals = false;
- $this->backupStaticAttributes = false;
- }
-
- function run( PHPUnit_Framework_TestResult $result = NULL ) {
- /* Some functions require some kind of caching, and will end up using the db,
- * which we can't allow, as that would open a new connection for mysql.
- * Replace with a HashBag. They would not be going to persist anyway.
- */
- ObjectCache::$instances[CACHE_DB] = new HashBagOStuff;
-
- if( $this->needsDB() ) {
- global $wgDBprefix;
-
- $this->useTemporaryTables = !$this->getCliArg( 'use-normal-tables' );
- $this->reuseDB = $this->getCliArg('reuse-db');
-
- $this->db = wfGetDB( DB_MASTER );
-
- $this->checkDbIsSupported();
-
- $this->oldTablePrefix = $wgDBprefix;
-
- if( !self::$dbSetup ) {
- $this->initDB();
- self::$dbSetup = true;
- }
-
- $this->addCoreDBData();
- $this->addDBData();
-
- parent::run( $result );
-
- $this->resetDB();
- } else {
- parent::run( $result );
- }
- }
-
- /**
- * obtains a new temporary file name
- *
- * The obtained filename is enlisted to be removed upon tearDown
- *
- * @returns string: absolute name of the temporary file
- */
- protected function getNewTempFile() {
- $fname = tempnam( wfTempDir(), 'MW_PHPUnit_' . get_class( $this ) . '_' );
- $this->tmpfiles[] = $fname;
- return $fname;
- }
-
- /**
- * obtains a new temporary directory
- *
- * The obtained directory is enlisted to be removed (recursively with all its contained
- * files) upon tearDown.
- *
- * @returns string: absolute name of the temporary directory
- */
- protected function getNewTempDirectory() {
- // Starting of with a temporary /file/.
- $fname = $this->getNewTempFile();
-
- // Converting the temporary /file/ to a /directory/
- //
- // The following is not atomic, but at least we now have a single place,
- // where temporary directory creation is bundled and can be improved
- unlink( $fname );
- $this->assertTrue( wfMkdirParents( $fname ) );
- return $fname;
- }
-
- protected function tearDown() {
- // Cleaning up temporary files
- foreach ( $this->tmpfiles as $fname ) {
- if ( is_file( $fname ) || ( is_link( $fname ) ) ) {
- unlink( $fname );
- } elseif ( is_dir( $fname ) ) {
- wfRecursiveRemoveDir( $fname );
- }
- }
-
- // clean up open transactions
- if( $this->needsDB() && $this->db ) {
- while( $this->db->trxLevel() > 0 ) {
- $this->db->rollback();
- }
- }
-
- parent::tearDown();
- }
-
- function dbPrefix() {
- return $this->db->getType() == 'oracle' ? self::ORA_DB_PREFIX : self::DB_PREFIX;
- }
-
- function needsDB() {
- # if the test says it uses database tables, it needs the database
- if ( $this->tablesUsed ) {
- return true;
- }
-
- # if the test says it belongs to the Database group, it needs the database
- $rc = new ReflectionClass( $this );
- if ( preg_match( '/@group +Database/im', $rc->getDocComment() ) ) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Stub. If a test needs to add additional data to the database, it should
- * implement this method and do so
- */
- function addDBData() {}
-
- private function addCoreDBData() {
- # disabled for performance
- #$this->tablesUsed[] = 'page';
- #$this->tablesUsed[] = 'revision';
-
- if ( $this->db->getType() == 'oracle' ) {
-
- # Insert 0 user to prevent FK violations
- # Anonymous user
- $this->db->insert( 'user', array(
- 'user_id' => 0,
- 'user_name' => 'Anonymous' ), __METHOD__, array( 'IGNORE' ) );
-
- # Insert 0 page to prevent FK violations
- # Blank page
- $this->db->insert( 'page', array(
- 'page_id' => 0,
- 'page_namespace' => 0,
- 'page_title' => ' ',
- 'page_restrictions' => NULL,
- 'page_counter' => 0,
- 'page_is_redirect' => 0,
- 'page_is_new' => 0,
- 'page_random' => 0,
- 'page_touched' => $this->db->timestamp(),
- 'page_latest' => 0,
- 'page_len' => 0 ), __METHOD__, array( 'IGNORE' ) );
-
- }
-
- User::resetIdByNameCache();
-
- //Make sysop user
- $user = User::newFromName( 'UTSysop' );
-
- if ( $user->idForName() == 0 ) {
- $user->addToDatabase();
- $user->setPassword( 'UTSysopPassword' );
-
- $user->addGroup( 'sysop' );
- $user->addGroup( 'bureaucrat' );
- $user->saveSettings();
- }
-
-
- //Make 1 page with 1 revision
- $page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
- if ( !$page->getId() == 0 ) {
- $page->doEdit( 'UTContent',
- 'UTPageSummary',
- EDIT_NEW,
- false,
- User::newFromName( 'UTSysop' ) );
- }
- }
-
- private function initDB() {
- global $wgDBprefix;
- if ( $wgDBprefix === $this->dbPrefix() ) {
- throw new MWException( 'Cannot run unit tests, the database prefix is already "unittest_"' );
- }
-
- $tablesCloned = $this->listTables();
- $dbClone = new CloneDatabase( $this->db, $tablesCloned, $this->dbPrefix() );
- $dbClone->useTemporaryTables( $this->useTemporaryTables );
-
- if ( ( $this->db->getType() == 'oracle' || !$this->useTemporaryTables ) && $this->reuseDB ) {
- CloneDatabase::changePrefix( $this->dbPrefix() );
- $this->resetDB();
- return;
- } else {
- $dbClone->cloneTableStructure();
- }
-
- if ( $this->db->getType() == 'oracle' ) {
- $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' );
- }
- }
-
- /**
- * Empty all tables so they can be repopulated for tests
- */
- private function resetDB() {
- if( $this->db ) {
- if ( $this->db->getType() == 'oracle' ) {
- if ( $this->useTemporaryTables ) {
- wfGetLB()->closeAll();
- $this->db = wfGetDB( DB_MASTER );
- } else {
- foreach( $this->tablesUsed as $tbl ) {
- if( $tbl == 'interwiki') continue;
- $this->db->query( 'TRUNCATE TABLE '.$this->db->tableName($tbl), __METHOD__ );
- }
- }
- } else {
- foreach( $this->tablesUsed as $tbl ) {
- if( $tbl == 'interwiki' || $tbl == 'user' ) continue;
- $this->db->delete( $tbl, '*', __METHOD__ );
- }
- }
- }
- }
-
- function __call( $func, $args ) {
- static $compatibility = array(
- 'assertInternalType' => 'assertType',
- 'assertNotInternalType' => 'assertNotType',
- 'assertInstanceOf' => 'assertType',
- 'assertEmpty' => 'assertEmpty2',
- );
-
- if ( method_exists( $this->suite, $func ) ) {
- return call_user_func_array( array( $this->suite, $func ), $args);
- } elseif ( isset( $compatibility[$func] ) ) {
- return call_user_func_array( array( $this, $compatibility[$func] ), $args);
- } else {
- throw new MWException( "Called non-existant $func method on "
- . get_class( $this ) );
- }
- }
-
- private function assertEmpty2( $value, $msg ) {
- return $this->assertTrue( $value == '', $msg );
- }
-
- static private function unprefixTable( $tableName ) {
- global $wgDBprefix;
- return substr( $tableName, strlen( $wgDBprefix ) );
- }
-
- static private function isNotUnittest( $table ) {
- return strpos( $table, 'unittest_' ) !== 0;
- }
-
- protected function listTables() {
- global $wgDBprefix;
-
- $tables = $this->db->listTables( $wgDBprefix, __METHOD__ );
- $tables = array_map( array( __CLASS__, 'unprefixTable' ), $tables );
-
- // Don't duplicate test tables from the previous fataled run
- $tables = array_filter( $tables, array( __CLASS__, 'isNotUnittest' ) );
-
- if ( $this->db->getType() == 'sqlite' ) {
- $tables = array_flip( $tables );
- // these are subtables of searchindex and don't need to be duped/dropped separately
- unset( $tables['searchindex_content'] );
- unset( $tables['searchindex_segdir'] );
- unset( $tables['searchindex_segments'] );
- $tables = array_flip( $tables );
- }
- return $tables;
- }
-
- protected function checkDbIsSupported() {
- if( !in_array( $this->db->getType(), $this->supportedDBs ) ) {
- throw new MWException( $this->db->getType() . " is not currently supported for unit testing." );
- }
- }
-
- public function getCliArg( $offset ) {
-
- if( isset( MediaWikiPHPUnitCommand::$additionalOptions[$offset] ) ) {
- return MediaWikiPHPUnitCommand::$additionalOptions[$offset];
- }
-
- }
-
- public function setCliArg( $offset, $value ) {
-
- MediaWikiPHPUnitCommand::$additionalOptions[$offset] = $value;
-
- }
-
- /**
- * Don't throw a warning if $function is deprecated and called later
- *
- * @param $function String
- * @return null
- */
- function hideDeprecated( $function ) {
- wfSuppressWarnings();
- wfDeprecated( $function );
- wfRestoreWarnings();
- }
-
- /**
- * Asserts that the given database query yields the rows given by $expectedRows.
- * The expected rows should be given as indexed (not associative) arrays, with
- * the values given in the order of the columns in the $fields parameter.
- * Note that the rows are sorted by the columns given in $fields.
- *
- * @since 1.20
- *
- * @param $table String|Array the table(s) to query
- * @param $fields String|Array the columns to include in the result (and to sort by)
- * @param $condition String|Array "where" condition(s)
- * @param $expectedRows Array - an array of arrays giving the expected rows.
- *
- * @throws MWException if this test cases's needsDB() method doesn't return true.
- * Test cases can use "@group Database" to enable database test support,
- * or list the tables under testing in $this->tablesUsed, or override the
- * needsDB() method.
- */
- protected function assertSelect( $table, $fields, $condition, Array $expectedRows ) {
- if ( !$this->needsDB() ) {
- throw new MWException( 'When testing database state, the test cases\'s needDB()' .
- ' method should return true. Use @group Database or $this->tablesUsed.');
- }
-
- $db = wfGetDB( DB_SLAVE );
-
- $res = $db->select( $table, $fields, $condition, wfGetCaller(), array( 'ORDER BY' => $fields ) );
- $this->assertNotEmpty( $res, "query failed: " . $db->lastError() );
-
- $i = 0;
-
- foreach ( $expectedRows as $expected ) {
- $r = $res->fetchRow();
- self::stripStringKeys( $r );
-
- $i += 1;
- $this->assertNotEmpty( $r, "row #$i missing" );
-
- $this->assertEquals( $expected, $r, "row #$i mismatches" );
- }
-
- $r = $res->fetchRow();
- self::stripStringKeys( $r );
-
- $this->assertFalse( $r, "found extra row (after #$i)" );
- }
-
- /**
- * Utility method taking an array of elements and wrapping
- * each element in it's own array. Useful for data providers
- * that only return a single argument.
- *
- * @since 1.20
- *
- * @param array $elements
- *
- * @return array
- */
- protected function arrayWrap( array $elements ) {
- return array_map(
- function( $element ) {
- return array( $element );
- },
- $elements
- );
- }
-
- /**
- * Assert that two arrays are equal. By default this means that both arrays need to hold
- * the same set of values. Using additional arguments, order and associated key can also
- * be set as relevant.
- *
- * @since 1.20
- *
- * @param array $expected
- * @param array $actual
- * @param boolean $ordered If the order of the values should match
- * @param boolean $named If the keys should match
- */
- protected function assertArrayEquals( array $expected, array $actual, $ordered = false, $named = false ) {
- if ( !$ordered ) {
- $this->objectAssociativeSort( $expected );
- $this->objectAssociativeSort( $actual );
- }
-
- if ( !$named ) {
- $expected = array_values( $expected );
- $actual = array_values( $actual );
- }
-
- call_user_func_array(
- array( $this, 'assertEquals' ),
- array_merge( array( $expected, $actual ), array_slice( func_get_args(), 4 ) )
- );
- }
-
- /**
- * Put each HTML element on its own line and then equals() the results
- *
- * Use for nicely formatting of PHPUnit diff output when comparing very
- * simple HTML
- *
- * @since 1.20
- *
- * @param String $expected HTML on oneline
- * @param String $actual HTML on oneline
- * @param String $msg Optional message
- */
- protected function assertHTMLEquals( $expected, $actual, $msg='' ) {
- $expected = str_replace( '>', ">\n", $expected );
- $actual = str_replace( '>', ">\n", $actual );
-
- $this->assertEquals( $expected, $actual, $msg );
- }
-
- /**
- * Does an associative sort that works for objects.
- *
- * @since 1.20
- *
- * @param array $array
- */
- protected function objectAssociativeSort( array &$array ) {
- uasort(
- $array,
- function( $a, $b ) {
- return serialize( $a ) > serialize( $b ) ? 1 : -1;
- }
- );
- }
-
- /**
- * Utility function for eliminating all string keys from an array.
- * Useful to turn a database result row as returned by fetchRow() into
- * a pure indexed array.
- *
- * @since 1.20
- *
- * @param $r mixed the array to remove string keys from.
- */
- protected static function stripStringKeys( &$r ) {
- if ( !is_array( $r ) ) {
- return;
- }
-
- foreach ( $r as $k => $v ) {
- if ( is_string( $k ) ) {
- unset( $r[$k] );
- }
- }
- }
-
- /**
- * Asserts that the provided variable is of the specified
- * internal type or equals the $value argument. This is useful
- * for testing return types of functions that return a certain
- * type or *value* when not set or on error.
- *
- * @since 1.20
- *
- * @param string $type
- * @param mixed $actual
- * @param mixed $value
- * @param string $message
- */
- protected function assertTypeOrValue( $type, $actual, $value = false, $message = '' ) {
- if ( $actual === $value ) {
- $this->assertTrue( true, $message );
- }
- else {
- $this->assertType( $type, $actual, $message );
- }
- }
-
- /**
- * Asserts the type of the provided value. This can be either
- * in internal type such as boolean or integer, or a class or
- * interface the value extends or implements.
- *
- * @since 1.20
- *
- * @param string $type
- * @param mixed $actual
- * @param string $message
- */
- protected function assertType( $type, $actual, $message = '' ) {
- if ( is_object( $actual ) ) {
- $this->assertInstanceOf( $type, $actual, $message );
- }
- else {
- $this->assertInternalType( $type, $actual, $message );
- }
- }
-
-}
diff --git a/tests/phpunit/README b/tests/phpunit/README
deleted file mode 100644
index 0a32ba17..00000000
--- a/tests/phpunit/README
+++ /dev/null
@@ -1,53 +0,0 @@
-== MediaWiki PHPUnit Tests ==
-
-The unit tests for MediaWiki are implemented using the PHPUnit testing
-framework and require PHPUnit to run.
-
-
-=== WARNING ===
-
-Some of the unit tests are DESTRUCTIVE and WILL ALTER YOUR WIKI'S CONTENTS.
-
-DO NOT RUN THESE TESTS ON A PRODUCTION SYSTEM OR ON ANY SYSTEM WHERE YOU NEED
-TO RETAIN YOUR DATA.
-
-
-== Installation ==
-
-If PHPUnit is not installed, follow the installation instructions in the
-PHPUnit Manual at:
-
- http://www.phpunit.de/manual/current/en/installation.html
-
-- or -
-
-On Unix-like operating systems, run:
-
- make install
-
-
-== Running tests ==
-
-The tests are run from your operating system's command line.
-
-Ensure that you are in the tests/phpunit directory of your MediaWiki
-installation.
-
-
-On Unix-like operating systems, the tests runs are controlled with a makefile.
-Run command:
-
- make help
-
-for a full list of options for running tests.
-
-
-On Windows-family operating systems, run the 'run-tests.bat' batch file.
-
-
-=== Writing tests ===
-
-A guide to writing unit tests for MediaWiki can be found at:
-
- http://mediawiki.org/wiki/Unit_Testing
-
diff --git a/tests/phpunit/StructureTest.php b/tests/phpunit/StructureTest.php
deleted file mode 100644
index 17ea06c4..00000000
--- a/tests/phpunit/StructureTest.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-/**
- * The tests here verify the structure of the code. This is for outright bugs,
- * not just style issues.
- */
-
-class StructureTest extends MediaWikiTestCase {
- /**
- * Verify all files that appear to be tests have file names ending in
- * Test. If the file names do not end in Test, they will not be run.
- */
- public function testUnitTestFileNamesEndWithTest() {
- if ( wfIsWindows() ) {
- $this->markTestSkipped( 'This test does not work on Windows' );
- }
- $rootPath = escapeshellarg( __DIR__ );
- $testClassRegex = implode( '|', array(
- 'ApiFormatTestBase',
- 'ApiTestCase',
- 'MediaWikiLangTestCase',
- 'MediaWikiTestCase',
- 'PHPUnit_Framework_TestCase',
- 'DumpTestCase',
- ) );
- $testClassRegex = "^class .* extends ($testClassRegex)";
- $finder = "find $rootPath -name '*.php' '!' -name '*Test.php'" .
- " | xargs grep -El '$testClassRegex|function suite\('";
-
- $results = null;
- $exitCode = null;
- exec($finder, $results, $exitCode);
-
- $this->assertEquals(
- 0,
- $exitCode,
- 'Verify find/grep command succeeds.'
- );
-
- $results = array_filter(
- $results,
- array( $this, 'filterSuites' )
- );
- $strip = strlen( $rootPath ) - 1;
- foreach( $results as $k => $v) {
- $results[$k] = substr( $v, $strip );
- }
- $this->assertEquals(
- array(),
- $results,
- "Unit test file in $rootPath must end with Test."
- );
- }
-
- /**
- * Filter to remove testUnitTestFileNamesEndWithTest false positives.
- */
- public function filterSuites( $filename ) {
- return strpos( $filename, __DIR__ . '/suites/' ) !== 0;
- }
-}
diff --git a/tests/phpunit/TODO b/tests/phpunit/TODO
deleted file mode 100644
index b2fa7fb6..00000000
--- a/tests/phpunit/TODO
+++ /dev/null
@@ -1,10 +0,0 @@
-== Things To Do ==
-* Most of the tests are named poorly; naming should describe a use case in story-like language, not simply identify the
-unit under test. An example would be the difference between testCalculate and testAddingIntegersTogetherWorks.
-* Many of the tests make multiple assertions, and are thus not unitary tests. By using data-providers and more use-case
-oriented test selection nearly all of these cases can be easily resolved.
-* Some of the test files are either incorrectly named or in the wrong folder. Tests should be organized in a mirrored
-structure to the source they are testing, and named the same, with the exception of the word "Test" at the end.
-* Shared set-up code or base classes are present, but usually named improperly or appear to be poorly factored. Support
-code should share as much of the same naming as the code it's supporting, and test and test-case depenencies should be
-considered to resolve other shared needs.
diff --git a/tests/phpunit/bootstrap.php b/tests/phpunit/bootstrap.php
deleted file mode 100644
index 933767e7..00000000
--- a/tests/phpunit/bootstrap.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * Bootstrapping for MediaWiki PHPUnit tests
- * This file is included by phpunit and is NOT in the global scope.
- *
- * @file
- */
-
-if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
- echo <<<EOF
-You are running these tests directly from phpunit. You may not have all globals correctly set.
-Running phpunit.php instead is recommended.
-EOF;
- require_once ( __DIR__ . "/phpunit.php" );
-}
-
-// Output a notice when running with older versions of PHPUnit
-if ( version_compare( PHPUnit_Runner_Version::id(), "3.6.7", "<" ) ) {
- echo <<<EOF
-********************************************************************************
-
-These tests run best with version PHPUnit 3.6.7 or better. Earlier versions may
-show failures because earlier versions of PHPUnit do not properly implement
-dependencies.
-
-********************************************************************************
-
-EOF;
-}
-
-/** @todo Check if this is really needed */
-MessageCache::destroyInstance();
diff --git a/tests/phpunit/data/db/mysql/functions.sql b/tests/phpunit/data/db/mysql/functions.sql
deleted file mode 100644
index 9e5e470f..00000000
--- a/tests/phpunit/data/db/mysql/functions.sql
+++ /dev/null
@@ -1,12 +0,0 @@
--- MySQL test file for DatabaseTest::testStoredFunctions()
-
-DELIMITER //
-
-CREATE FUNCTION mw_test_function()
-RETURNS int DETERMINISTIC
-BEGIN
- SET @foo = 21;
- RETURN @foo * 2;
-END//
-
-DELIMITER //
diff --git a/tests/phpunit/data/db/postgres/functions.sql b/tests/phpunit/data/db/postgres/functions.sql
deleted file mode 100644
index 3086d4d5..00000000
--- a/tests/phpunit/data/db/postgres/functions.sql
+++ /dev/null
@@ -1,12 +0,0 @@
--- Postgres test file for DatabaseTest::testStoredFunctions()
-
-CREATE FUNCTION mw_test_function()
-RETURNS INTEGER
-LANGUAGE plpgsql AS
-$mw$
-DECLARE foo INTEGER;
-BEGIN
- foo := 21;
- RETURN foo * 2;
-END
-$mw$;
diff --git a/tests/phpunit/data/db/sqlite/tables-1.13.sql b/tests/phpunit/data/db/sqlite/tables-1.13.sql
deleted file mode 100644
index 66847ab1..00000000
--- a/tests/phpunit/data/db/sqlite/tables-1.13.sql
+++ /dev/null
@@ -1,342 +0,0 @@
--- This is a copy of SQLite schema from MediaWiki 1.13 used for updater testing
-
-CREATE TABLE /*$wgDBprefix*/user (
- user_id INTEGER PRIMARY KEY AUTOINCREMENT,
- user_name varchar(255) default '',
- user_real_name varchar(255) default '',
- user_password tinyblob ,
- user_newpassword tinyblob ,
- user_newpass_time BLOB,
- user_email tinytext ,
- user_options blob ,
- user_touched BLOB default '',
- user_token BLOB default '',
- user_email_authenticated BLOB,
- user_email_token BLOB,
- user_email_token_expires BLOB,
- user_registration BLOB,
- user_editcount int) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/user_groups (
- ug_user INTEGER default '0',
- ug_group varBLOB default '') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/user_newtalk (
- user_id INTEGER default '0',
- user_ip varBLOB default '',
- user_last_timestamp BLOB default '') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/page (
- page_id INTEGER PRIMARY KEY AUTOINCREMENT,
- page_namespace INTEGER ,
- page_title varchar(255) ,
- page_restrictions tinyblob ,
- page_counter bigint default '0',
- page_is_redirect tinyint default '0',
- page_is_new tinyint default '0',
- page_random real ,
- page_touched BLOB default '',
- page_latest INTEGER ,
- page_len INTEGER ) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/revision (
- rev_id INTEGER PRIMARY KEY AUTOINCREMENT,
- rev_page INTEGER ,
- rev_text_id INTEGER ,
- rev_comment tinyblob ,
- rev_user INTEGER default '0',
- rev_user_text varchar(255) default '',
- rev_timestamp BLOB default '',
- rev_minor_edit tinyint default '0',
- rev_deleted tinyint default '0',
- rev_len int,
- rev_parent_id INTEGER default NULL) /*$wgDBTableOptions*/ ;
-
-CREATE TABLE /*$wgDBprefix*/text (
- old_id INTEGER PRIMARY KEY AUTOINCREMENT,
- old_text mediumblob ,
- old_flags tinyblob ) /*$wgDBTableOptions*/ ;
-
-CREATE TABLE /*$wgDBprefix*/archive (
- ar_namespace INTEGER default '0',
- ar_title varchar(255) default '',
- ar_text mediumblob ,
- ar_comment tinyblob ,
- ar_user INTEGER default '0',
- ar_user_text varchar(255) ,
- ar_timestamp BLOB default '',
- ar_minor_edit tinyint default '0',
- ar_flags tinyblob ,
- ar_rev_id int,
- ar_text_id int,
- ar_deleted tinyint default '0',
- ar_len int,
- ar_page_id int,
- ar_parent_id INTEGER default NULL) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/pagelinks (
- pl_from INTEGER default '0',
- pl_namespace INTEGER default '0',
- pl_title varchar(255) default '') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/templatelinks (
- tl_from INTEGER default '0',
- tl_namespace INTEGER default '0',
- tl_title varchar(255) default '') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/imagelinks (
- il_from INTEGER default '0',
- il_to varchar(255) default '') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/categorylinks (
- cl_from INTEGER default '0',
- cl_to varchar(255) default '',
- cl_sortkey varchar(70) default '',
- cl_timestamp timestamp ) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/category (
- cat_id INTEGER PRIMARY KEY AUTOINCREMENT,
- cat_title varchar(255) ,
- cat_pages INTEGER signed default 0,
- cat_subcats INTEGER signed default 0,
- cat_files INTEGER signed default 0,
- cat_hidden tinyint default 0) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/externallinks (
- el_from INTEGER default '0',
- el_to blob ,
- el_index blob ) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/langlinks (
- ll_from INTEGER default '0',
- ll_lang varBLOB default '',
- ll_title varchar(255) default '') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/site_stats (
- ss_row_id INTEGER ,
- ss_total_views bigint default '0',
- ss_total_edits bigint default '0',
- ss_good_articles bigint default '0',
- ss_total_pages bigint default '-1',
- ss_users bigint default '-1',
- ss_admins INTEGER default '-1',
- ss_images INTEGER default '0') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/hitcounter (
- hc_id INTEGER
-) ;
-
-CREATE TABLE /*$wgDBprefix*/ipblocks (
- ipb_id INTEGER PRIMARY KEY AUTOINCREMENT,
- ipb_address tinyblob ,
- ipb_user INTEGER default '0',
- ipb_by INTEGER default '0',
- ipb_by_text varchar(255) default '',
- ipb_reason tinyblob ,
- ipb_timestamp BLOB default '',
- ipb_auto bool default 0,
- ipb_anon_only bool default 0,
- ipb_create_account bool default 1,
- ipb_enable_autoblock bool default '1',
- ipb_expiry varBLOB default '',
- ipb_range_start tinyblob ,
- ipb_range_end tinyblob ,
- ipb_deleted bool default 0,
- ipb_block_email bool default 0) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/image (
- img_name varchar(255) default '',
- img_size INTEGER default '0',
- img_width INTEGER default '0',
- img_height INTEGER default '0',
- img_metadata mediumblob ,
- img_bits INTEGER default '0',
- img_media_type TEXT default NULL,
- img_major_mime TEXT default "unknown",
- img_minor_mime varBLOB default "unknown",
- img_description tinyblob ,
- img_user INTEGER default '0',
- img_user_text varchar(255) ,
- img_timestamp varBLOB default '',
- img_sha1 varBLOB default '') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/oldimage (
- oi_name varchar(255) default '',
- oi_archive_name varchar(255) default '',
- oi_size INTEGER default 0,
- oi_width INTEGER default 0,
- oi_height INTEGER default 0,
- oi_bits INTEGER default 0,
- oi_description tinyblob ,
- oi_user INTEGER default '0',
- oi_user_text varchar(255) ,
- oi_timestamp BLOB default '',
- oi_metadata mediumblob ,
- oi_media_type TEXT default NULL,
- oi_major_mime TEXT default "unknown",
- oi_minor_mime varBLOB default "unknown",
- oi_deleted tinyint default '0',
- oi_sha1 varBLOB default '') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/filearchive (
- fa_id INTEGER PRIMARY KEY AUTOINCREMENT,
- fa_name varchar(255) default '',
- fa_archive_name varchar(255) default '',
- fa_storage_group varBLOB,
- fa_storage_key varBLOB default '',
- fa_deleted_user int,
- fa_deleted_timestamp BLOB default '',
- fa_deleted_reason text,
- fa_size INTEGER default '0',
- fa_width INTEGER default '0',
- fa_height INTEGER default '0',
- fa_metadata mediumblob,
- fa_bits INTEGER default '0',
- fa_media_type TEXT default NULL,
- fa_major_mime TEXT default "unknown",
- fa_minor_mime varBLOB default "unknown",
- fa_description tinyblob,
- fa_user INTEGER default '0',
- fa_user_text varchar(255) ,
- fa_timestamp BLOB default '',
- fa_deleted tinyint default '0') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/recentchanges (
- rc_id INTEGER PRIMARY KEY AUTOINCREMENT,
- rc_timestamp varBLOB default '',
- rc_cur_time varBLOB default '',
- rc_user INTEGER default '0',
- rc_user_text varchar(255) ,
- rc_namespace INTEGER default '0',
- rc_title varchar(255) default '',
- rc_comment varchar(255) default '',
- rc_minor tinyint default '0',
- rc_bot tinyint default '0',
- rc_new tinyint default '0',
- rc_cur_id INTEGER default '0',
- rc_this_oldid INTEGER default '0',
- rc_last_oldid INTEGER default '0',
- rc_type tinyint default '0',
- rc_moved_to_ns tinyint default '0',
- rc_moved_to_title varchar(255) default '',
- rc_patrolled tinyint default '0',
- rc_ip varBLOB default '',
- rc_old_len int,
- rc_new_len int,
- rc_deleted tinyint default '0',
- rc_logid INTEGER default '0',
- rc_log_type varBLOB NULL default NULL,
- rc_log_action varBLOB NULL default NULL,
- rc_params blob NULL) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/watchlist (
- wl_user INTEGER ,
- wl_namespace INTEGER default '0',
- wl_title varchar(255) default '',
- wl_notificationtimestamp varBLOB) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/math (
- math_inputhash varBLOB ,
- math_outputhash varBLOB ,
- math_html_conservativeness tinyint ,
- math_html text,
- math_mathml text) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/searchindex (
- si_page INTEGER ,
- si_title varchar(255) default '',
- si_text mediumtext ) ;
-
-CREATE TABLE /*$wgDBprefix*/interwiki (
- iw_prefix varchar(32) ,
- iw_url blob ,
- iw_local bool ,
- iw_trans tinyint default 0) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/querycache (
- qc_type varBLOB ,
- qc_value INTEGER default '0',
- qc_namespace INTEGER default '0',
- qc_title varchar(255) default '') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/objectcache (
- keyname varBLOB default '',
- value mediumblob,
- exptime datetime) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/transcache (
- tc_url varBLOB ,
- tc_contents text,
- tc_time INTEGER ) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/logging (
- log_id INTEGER PRIMARY KEY AUTOINCREMENT,
- log_type varBLOB default '',
- log_action varBLOB default '',
- log_timestamp BLOB default '19700101000000',
- log_user INTEGER default 0,
- log_namespace INTEGER default 0,
- log_title varchar(255) default '',
- log_comment varchar(255) default '',
- log_params blob ,
- log_deleted tinyint default '0') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/trackbacks (
- tb_id INTEGER PRIMARY KEY AUTOINCREMENT,
- tb_page INTEGER REFERENCES /*$wgDBprefix*/page(page_id) ON DELETE CASCADE,
- tb_title varchar(255) ,
- tb_url blob ,
- tb_ex text,
- tb_name varchar(255)) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/job (
- job_id INTEGER PRIMARY KEY AUTOINCREMENT,
- job_cmd varBLOB default '',
- job_namespace INTEGER ,
- job_title varchar(255) ,
- job_params blob ) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/querycache_info (
- qci_type varBLOB default '',
- qci_timestamp BLOB default '19700101000000') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/redirect (
- rd_from INTEGER default '0',
- rd_namespace INTEGER default '0',
- rd_title varchar(255) default '') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/querycachetwo (
- qcc_type varBLOB ,
- qcc_value INTEGER default '0',
- qcc_namespace INTEGER default '0',
- qcc_title varchar(255) default '',
- qcc_namespacetwo INTEGER default '0',
- qcc_titletwo varchar(255) default '') /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/page_restrictions (
- pr_page INTEGER ,
- pr_type varBLOB ,
- pr_level varBLOB ,
- pr_cascade tinyint ,
- pr_user INTEGER NULL,
- pr_expiry varBLOB NULL,
- pr_id INTEGER PRIMARY KEY AUTOINCREMENT) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/protected_titles (
- pt_namespace INTEGER ,
- pt_title varchar(255) ,
- pt_user INTEGER ,
- pt_reason tinyblob,
- pt_timestamp BLOB ,
- pt_expiry varBLOB default '',
- pt_create_perm varBLOB ) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/page_props (
- pp_page INTEGER ,
- pp_propname varBLOB ,
- pp_value blob ) /*$wgDBTableOptions*/;
-
-CREATE TABLE /*$wgDBprefix*/updatelog (
- ul_key varchar(255) ) /*$wgDBTableOptions*/;
-
-
diff --git a/tests/phpunit/data/db/sqlite/tables-1.15.sql b/tests/phpunit/data/db/sqlite/tables-1.15.sql
deleted file mode 100644
index 6b3a628e..00000000
--- a/tests/phpunit/data/db/sqlite/tables-1.15.sql
+++ /dev/null
@@ -1,454 +0,0 @@
--- This is a copy of MediaWiki 1.15 schema shared by MySQL and SQLite.
--- It is used for updater testing. Comments are stripped to decrease
--- file size, as we don't need to maintain it.
-
-CREATE TABLE /*_*/user (
- user_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- user_name varchar(255) binary NOT NULL default '',
- user_real_name varchar(255) binary NOT NULL default '',
- user_password tinyblob NOT NULL,
- user_newpassword tinyblob NOT NULL,
- user_newpass_time binary(14),
- user_email tinytext NOT NULL,
- user_options blob NOT NULL,
- user_touched binary(14) NOT NULL default '',
- user_token binary(32) NOT NULL default '',
- user_email_authenticated binary(14),
- user_email_token binary(32),
- user_email_token_expires binary(14),
- user_registration binary(14),
- user_editcount int
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/user_name ON /*_*/user (user_name);
-CREATE INDEX /*i*/user_email_token ON /*_*/user (user_email_token);
-CREATE TABLE /*_*/user_groups (
- ug_user int unsigned NOT NULL default 0,
- ug_group varbinary(16) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ug_user_group ON /*_*/user_groups (ug_user,ug_group);
-CREATE INDEX /*i*/ug_group ON /*_*/user_groups (ug_group);
-CREATE TABLE /*_*/user_newtalk (
- user_id int NOT NULL default 0,
- user_ip varbinary(40) NOT NULL default '',
- user_last_timestamp binary(14) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/un_user_id ON /*_*/user_newtalk (user_id);
-CREATE INDEX /*i*/un_user_ip ON /*_*/user_newtalk (user_ip);
-CREATE TABLE /*_*/page (
- page_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- page_namespace int NOT NULL,
- page_title varchar(255) binary NOT NULL,
- page_restrictions tinyblob NOT NULL,
- page_counter bigint unsigned NOT NULL default 0,
- page_is_redirect tinyint unsigned NOT NULL default 0,
- page_is_new tinyint unsigned NOT NULL default 0,
- page_random real unsigned NOT NULL,
- page_touched binary(14) NOT NULL default '',
- page_latest int unsigned NOT NULL,
- page_len int unsigned NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
-CREATE INDEX /*i*/page_random ON /*_*/page (page_random);
-CREATE INDEX /*i*/page_len ON /*_*/page (page_len);
-CREATE TABLE /*_*/revision (
- rev_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- rev_page int unsigned NOT NULL,
- rev_text_id int unsigned NOT NULL,
- rev_comment tinyblob NOT NULL,
- rev_user int unsigned NOT NULL default 0,
- rev_user_text varchar(255) binary NOT NULL default '',
- rev_timestamp binary(14) NOT NULL default '',
- rev_minor_edit tinyint unsigned NOT NULL default 0,
- rev_deleted tinyint unsigned NOT NULL default 0,
- rev_len int unsigned,
- rev_parent_id int unsigned default NULL
-) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-CREATE UNIQUE INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
-CREATE INDEX /*i*/rev_timestamp ON /*_*/revision (rev_timestamp);
-CREATE INDEX /*i*/page_timestamp ON /*_*/revision (rev_page,rev_timestamp);
-CREATE INDEX /*i*/user_timestamp ON /*_*/revision (rev_user,rev_timestamp);
-CREATE INDEX /*i*/usertext_timestamp ON /*_*/revision (rev_user_text,rev_timestamp);
-CREATE TABLE /*_*/text (
- old_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- old_text mediumblob NOT NULL,
- old_flags tinyblob NOT NULL
-) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
-CREATE TABLE /*_*/archive (
- ar_namespace int NOT NULL default 0,
- ar_title varchar(255) binary NOT NULL default '',
- ar_text mediumblob NOT NULL,
- ar_comment tinyblob NOT NULL,
- ar_user int unsigned NOT NULL default 0,
- ar_user_text varchar(255) binary NOT NULL,
- ar_timestamp binary(14) NOT NULL default '',
- ar_minor_edit tinyint NOT NULL default 0,
- ar_flags tinyblob NOT NULL,
- ar_rev_id int unsigned,
- ar_text_id int unsigned,
- ar_deleted tinyint unsigned NOT NULL default 0,
- ar_len int unsigned,
- ar_page_id int unsigned,
- ar_parent_id int unsigned default NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
-CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
-CREATE TABLE /*_*/pagelinks (
- pl_from int unsigned NOT NULL default 0,
- pl_namespace int NOT NULL default 0,
- pl_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pl_from ON /*_*/pagelinks (pl_from,pl_namespace,pl_title);
-CREATE UNIQUE INDEX /*i*/pl_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from);
-CREATE TABLE /*_*/templatelinks (
- tl_from int unsigned NOT NULL default 0,
- tl_namespace int NOT NULL default 0,
- tl_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/tl_from ON /*_*/templatelinks (tl_from,tl_namespace,tl_title);
-CREATE UNIQUE INDEX /*i*/tl_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from);
-CREATE TABLE /*_*/imagelinks (
- il_from int unsigned NOT NULL default 0,
- il_to varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/il_from ON /*_*/imagelinks (il_from,il_to);
-CREATE UNIQUE INDEX /*i*/il_to ON /*_*/imagelinks (il_to,il_from);
-CREATE TABLE /*_*/categorylinks (
- cl_from int unsigned NOT NULL default 0,
- cl_to varchar(255) binary NOT NULL default '',
- cl_sortkey varchar(70) binary NOT NULL default '',
- cl_timestamp timestamp NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/cl_from ON /*_*/categorylinks (cl_from,cl_to);
-CREATE INDEX /*i*/cl_sortkey ON /*_*/categorylinks (cl_to,cl_sortkey,cl_from);
-CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp);
-CREATE TABLE /*_*/category (
- cat_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- cat_title varchar(255) binary NOT NULL,
- cat_pages int signed NOT NULL default 0,
- cat_subcats int signed NOT NULL default 0,
- cat_files int signed NOT NULL default 0,
- cat_hidden tinyint unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/cat_title ON /*_*/category (cat_title);
-CREATE INDEX /*i*/cat_pages ON /*_*/category (cat_pages);
-CREATE TABLE /*_*/externallinks (
- el_from int unsigned NOT NULL default 0,
- el_to blob NOT NULL,
- el_index blob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
-CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
-CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/langlinks (
- ll_from int unsigned NOT NULL default 0,
-
- ll_lang varbinary(20) NOT NULL default '',
- ll_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ll_from ON /*_*/langlinks (ll_from, ll_lang);
-CREATE INDEX /*i*/ll_lang ON /*_*/langlinks (ll_lang, ll_title);
-CREATE TABLE /*_*/site_stats (
- ss_row_id int unsigned NOT NULL,
- ss_total_views bigint unsigned default 0,
- ss_total_edits bigint unsigned default 0,
- ss_good_articles bigint unsigned default 0,
- ss_total_pages bigint default '-1',
- ss_users bigint default '-1',
- ss_active_users bigint default '-1',
- ss_admins int default '-1',
- ss_images int default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id);
-CREATE TABLE /*_*/hitcounter (
- hc_id int unsigned NOT NULL
-) ENGINE=HEAP MAX_ROWS=25000;
-CREATE TABLE /*_*/ipblocks (
- ipb_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- ipb_address tinyblob NOT NULL,
- ipb_user int unsigned NOT NULL default 0,
- ipb_by int unsigned NOT NULL default 0,
- ipb_by_text varchar(255) binary NOT NULL default '',
- ipb_reason tinyblob NOT NULL,
- ipb_timestamp binary(14) NOT NULL default '',
- ipb_auto bool NOT NULL default 0,
- ipb_anon_only bool NOT NULL default 0,
- ipb_create_account bool NOT NULL default 1,
- ipb_enable_autoblock bool NOT NULL default '1',
- ipb_expiry varbinary(14) NOT NULL default '',
- ipb_range_start tinyblob NOT NULL,
- ipb_range_end tinyblob NOT NULL,
- ipb_deleted bool NOT NULL default 0,
- ipb_block_email bool NOT NULL default 0,
- ipb_allow_usertalk bool NOT NULL default 0
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only);
-CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
-CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
-CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
-CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
-CREATE TABLE /*_*/image (
- img_name varchar(255) binary NOT NULL default '' PRIMARY KEY,
- img_size int unsigned NOT NULL default 0,
- img_width int NOT NULL default 0,
- img_height int NOT NULL default 0,
- img_metadata mediumblob NOT NULL,
- img_bits int NOT NULL default 0,
- img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
- img_minor_mime varbinary(32) NOT NULL default "unknown",
- img_description tinyblob NOT NULL,
- img_user int unsigned NOT NULL default 0,
- img_user_text varchar(255) binary NOT NULL,
- img_timestamp varbinary(14) NOT NULL default '',
- img_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
-CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
-CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
-CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1);
-CREATE TABLE /*_*/oldimage (
- oi_name varchar(255) binary NOT NULL default '',
- oi_archive_name varchar(255) binary NOT NULL default '',
- oi_size int unsigned NOT NULL default 0,
- oi_width int NOT NULL default 0,
- oi_height int NOT NULL default 0,
- oi_bits int NOT NULL default 0,
- oi_description tinyblob NOT NULL,
- oi_user int unsigned NOT NULL default 0,
- oi_user_text varchar(255) binary NOT NULL,
- oi_timestamp binary(14) NOT NULL default '',
- oi_metadata mediumblob NOT NULL,
- oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
- oi_minor_mime varbinary(32) NOT NULL default "unknown",
- oi_deleted tinyint unsigned NOT NULL default 0,
- oi_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
-CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
-CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name(14));
-CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1);
-CREATE TABLE /*_*/filearchive (
- fa_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- fa_name varchar(255) binary NOT NULL default '',
- fa_archive_name varchar(255) binary default '',
- fa_storage_group varbinary(16),
- fa_storage_key varbinary(64) default '',
- fa_deleted_user int,
- fa_deleted_timestamp binary(14) default '',
- fa_deleted_reason text,
- fa_size int unsigned default 0,
- fa_width int default 0,
- fa_height int default 0,
- fa_metadata mediumblob,
- fa_bits int default 0,
- fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") default "unknown",
- fa_minor_mime varbinary(32) default "unknown",
- fa_description tinyblob,
- fa_user int unsigned default 0,
- fa_user_text varchar(255) binary,
- fa_timestamp binary(14) default '',
- fa_deleted tinyint unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);
-CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);
-CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
-CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
-CREATE TABLE /*_*/recentchanges (
- rc_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- rc_timestamp varbinary(14) NOT NULL default '',
- rc_cur_time varbinary(14) NOT NULL default '',
- rc_user int unsigned NOT NULL default 0,
- rc_user_text varchar(255) binary NOT NULL,
- rc_namespace int NOT NULL default 0,
- rc_title varchar(255) binary NOT NULL default '',
- rc_comment varchar(255) binary NOT NULL default '',
- rc_minor tinyint unsigned NOT NULL default 0,
- rc_bot tinyint unsigned NOT NULL default 0,
- rc_new tinyint unsigned NOT NULL default 0,
- rc_cur_id int unsigned NOT NULL default 0,
- rc_this_oldid int unsigned NOT NULL default 0,
- rc_last_oldid int unsigned NOT NULL default 0,
- rc_type tinyint unsigned NOT NULL default 0,
- rc_moved_to_ns tinyint unsigned NOT NULL default 0,
- rc_moved_to_title varchar(255) binary NOT NULL default '',
- rc_patrolled tinyint unsigned NOT NULL default 0,
- rc_ip varbinary(40) NOT NULL default '',
- rc_old_len int,
- rc_new_len int,
- rc_deleted tinyint unsigned NOT NULL default 0,
- rc_logid int unsigned NOT NULL default 0,
- rc_log_type varbinary(255) NULL default NULL,
- rc_log_action varbinary(255) NULL default NULL,
- rc_params blob NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp);
-CREATE INDEX /*i*/rc_namespace_title ON /*_*/recentchanges (rc_namespace, rc_title);
-CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id);
-CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp);
-CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip);
-CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text);
-CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp);
-CREATE TABLE /*_*/watchlist (
- wl_user int unsigned NOT NULL,
- wl_namespace int NOT NULL default 0,
- wl_title varchar(255) binary NOT NULL default '',
- wl_notificationtimestamp varbinary(14)
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/wl_user ON /*_*/watchlist (wl_user, wl_namespace, wl_title);
-CREATE INDEX /*i*/namespace_title ON /*_*/watchlist (wl_namespace, wl_title);
-CREATE TABLE /*_*/math (
- math_inputhash varbinary(16) NOT NULL,
- math_outputhash varbinary(16) NOT NULL,
- math_html_conservativeness tinyint NOT NULL,
- math_html text,
- math_mathml text
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/math_inputhash ON /*_*/math (math_inputhash);
-CREATE TABLE /*_*/searchindex (
- si_page int unsigned NOT NULL,
- si_title varchar(255) NOT NULL default '',
- si_text mediumtext NOT NULL
-) ENGINE=MyISAM;
-CREATE UNIQUE INDEX /*i*/si_page ON /*_*/searchindex (si_page);
-CREATE FULLTEXT INDEX /*i*/si_title ON /*_*/searchindex (si_title);
-CREATE FULLTEXT INDEX /*i*/si_text ON /*_*/searchindex (si_text);
-CREATE TABLE /*_*/interwiki (
- iw_prefix varchar(32) NOT NULL,
- iw_url blob NOT NULL,
- iw_local bool NOT NULL,
- iw_trans tinyint NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/iw_prefix ON /*_*/interwiki (iw_prefix);
-CREATE TABLE /*_*/querycache (
- qc_type varbinary(32) NOT NULL,
- qc_value int unsigned NOT NULL default 0,
- qc_namespace int NOT NULL default 0,
- qc_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/qc_type ON /*_*/querycache (qc_type,qc_value);
-CREATE TABLE /*_*/objectcache (
- keyname varbinary(255) NOT NULL default '' PRIMARY KEY,
- value mediumblob,
- exptime datetime
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/exptime ON /*_*/objectcache (exptime);
-CREATE TABLE /*_*/transcache (
- tc_url varbinary(255) NOT NULL,
- tc_contents text,
- tc_time int NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/tc_url_idx ON /*_*/transcache (tc_url);
-CREATE TABLE /*_*/logging (
- log_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- log_type varbinary(10) NOT NULL default '',
- log_action varbinary(10) NOT NULL default '',
- log_timestamp binary(14) NOT NULL default '19700101000000',
- log_user int unsigned NOT NULL default 0,
- log_namespace int NOT NULL default 0,
- log_title varchar(255) binary NOT NULL default '',
- log_comment varchar(255) NOT NULL default '',
- log_params blob NOT NULL,
- log_deleted tinyint unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/type_time ON /*_*/logging (log_type, log_timestamp);
-CREATE INDEX /*i*/user_time ON /*_*/logging (log_user, log_timestamp);
-CREATE INDEX /*i*/page_time ON /*_*/logging (log_namespace, log_title, log_timestamp);
-CREATE INDEX /*i*/times ON /*_*/logging (log_timestamp);
-CREATE TABLE /*_*/trackbacks (
- tb_id int PRIMARY KEY AUTO_INCREMENT,
- tb_page int REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
- tb_title varchar(255) NOT NULL,
- tb_url blob NOT NULL,
- tb_ex text,
- tb_name varchar(255)
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/tb_page ON /*_*/trackbacks (tb_page);
-CREATE TABLE /*_*/job (
- job_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- job_cmd varbinary(60) NOT NULL default '',
- job_namespace int NOT NULL,
- job_title varchar(255) binary NOT NULL,
- job_params blob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/job_cmd ON /*_*/job (job_cmd, job_namespace, job_title);
-CREATE TABLE /*_*/querycache_info (
- qci_type varbinary(32) NOT NULL default '',
- qci_timestamp binary(14) NOT NULL default '19700101000000'
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/qci_type ON /*_*/querycache_info (qci_type);
-CREATE TABLE /*_*/redirect (
- rd_from int unsigned NOT NULL default 0 PRIMARY KEY,
- rd_namespace int NOT NULL default 0,
- rd_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/rd_ns_title ON /*_*/redirect (rd_namespace,rd_title,rd_from);
-CREATE TABLE /*_*/querycachetwo (
- qcc_type varbinary(32) NOT NULL,
- qcc_value int unsigned NOT NULL default 0,
- qcc_namespace int NOT NULL default 0,
- qcc_title varchar(255) binary NOT NULL default '',
- qcc_namespacetwo int NOT NULL default 0,
- qcc_titletwo varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/qcc_type ON /*_*/querycachetwo (qcc_type,qcc_value);
-CREATE INDEX /*i*/qcc_title ON /*_*/querycachetwo (qcc_type,qcc_namespace,qcc_title);
-CREATE INDEX /*i*/qcc_titletwo ON /*_*/querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
-CREATE TABLE /*_*/page_restrictions (
- pr_page int NOT NULL,
- pr_type varbinary(60) NOT NULL,
- pr_level varbinary(60) NOT NULL,
- pr_cascade tinyint NOT NULL,
- pr_user int NULL,
- pr_expiry varbinary(14) NULL,
- pr_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pr_pagetype ON /*_*/page_restrictions (pr_page,pr_type);
-CREATE INDEX /*i*/pr_typelevel ON /*_*/page_restrictions (pr_type,pr_level);
-CREATE INDEX /*i*/pr_level ON /*_*/page_restrictions (pr_level);
-CREATE INDEX /*i*/pr_cascade ON /*_*/page_restrictions (pr_cascade);
-CREATE TABLE /*_*/protected_titles (
- pt_namespace int NOT NULL,
- pt_title varchar(255) binary NOT NULL,
- pt_user int unsigned NOT NULL,
- pt_reason tinyblob,
- pt_timestamp binary(14) NOT NULL,
- pt_expiry varbinary(14) NOT NULL default '',
- pt_create_perm varbinary(60) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pt_namespace_title ON /*_*/protected_titles (pt_namespace,pt_title);
-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
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props (pp_page,pp_propname);
-CREATE TABLE /*_*/updatelog (
- ul_key varchar(255) NOT NULL PRIMARY KEY
-) /*$wgDBTableOptions*/;
-CREATE TABLE /*_*/change_tag (
- ct_rc_id int NULL,
- ct_log_id int NULL,
- ct_rev_id int NULL,
- ct_tag varchar(255) NOT NULL,
- ct_params blob NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag (ct_rc_id,ct_tag);
-CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag);
-CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag);
-CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
-CREATE TABLE /*_*/tag_summary (
- ts_rc_id int NULL,
- ts_log_id int NULL,
- ts_rev_id int NULL,
- ts_tags blob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
-CREATE TABLE /*_*/valid_tag (
- vt_tag varchar(255) NOT NULL PRIMARY KEY
-) /*$wgDBTableOptions*/;
diff --git a/tests/phpunit/data/db/sqlite/tables-1.16.sql b/tests/phpunit/data/db/sqlite/tables-1.16.sql
deleted file mode 100644
index 6e56add2..00000000
--- a/tests/phpunit/data/db/sqlite/tables-1.16.sql
+++ /dev/null
@@ -1,483 +0,0 @@
--- This is a copy of MediaWiki 1.16 schema shared by MySQL and SQLite.
--- It is used for updater testing. Comments are stripped to decrease
--- file size, as we don't need to maintain it.
-
-CREATE TABLE /*_*/user (
- user_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- user_name varchar(255) binary NOT NULL default '',
- user_real_name varchar(255) binary NOT NULL default '',
- user_password tinyblob NOT NULL,
- user_newpassword tinyblob NOT NULL,
- user_newpass_time binary(14),
- user_email tinytext NOT NULL,
- user_options blob NOT NULL,
- user_touched binary(14) NOT NULL default '',
- user_token binary(32) NOT NULL default '',
- user_email_authenticated binary(14),
- user_email_token binary(32),
- user_email_token_expires binary(14),
- user_registration binary(14),
- user_editcount int
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/user_name ON /*_*/user (user_name);
-CREATE INDEX /*i*/user_email_token ON /*_*/user (user_email_token);
-CREATE TABLE /*_*/user_groups (
- ug_user int unsigned NOT NULL default 0,
- ug_group varbinary(16) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ug_user_group ON /*_*/user_groups (ug_user,ug_group);
-CREATE INDEX /*i*/ug_group ON /*_*/user_groups (ug_group);
-CREATE TABLE /*_*/user_newtalk (
- user_id int NOT NULL default 0,
- user_ip varbinary(40) NOT NULL default '',
- user_last_timestamp binary(14) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/un_user_id ON /*_*/user_newtalk (user_id);
-CREATE INDEX /*i*/un_user_ip ON /*_*/user_newtalk (user_ip);
-CREATE TABLE /*_*/user_properties (
- up_user int NOT NULL,
- up_property varbinary(32) NOT NULL,
- up_value blob
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/user_properties_user_property ON /*_*/user_properties (up_user,up_property);
-CREATE INDEX /*i*/user_properties_property ON /*_*/user_properties (up_property);
-CREATE TABLE /*_*/page (
- page_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- page_namespace int NOT NULL,
- page_title varchar(255) binary NOT NULL,
- page_restrictions tinyblob NOT NULL,
- page_counter bigint unsigned NOT NULL default 0,
- page_is_redirect tinyint unsigned NOT NULL default 0,
- page_is_new tinyint unsigned NOT NULL default 0,
- page_random real unsigned NOT NULL,
- page_touched binary(14) NOT NULL default '',
- page_latest int unsigned NOT NULL,
- page_len int unsigned NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
-CREATE INDEX /*i*/page_random ON /*_*/page (page_random);
-CREATE INDEX /*i*/page_len ON /*_*/page (page_len);
-CREATE TABLE /*_*/revision (
- rev_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- rev_page int unsigned NOT NULL,
- rev_text_id int unsigned NOT NULL,
- rev_comment tinyblob NOT NULL,
- rev_user int unsigned NOT NULL default 0,
- rev_user_text varchar(255) binary NOT NULL default '',
- rev_timestamp binary(14) NOT NULL default '',
- rev_minor_edit tinyint unsigned NOT NULL default 0,
- rev_deleted tinyint unsigned NOT NULL default 0,
- rev_len int unsigned,
- rev_parent_id int unsigned default NULL
-) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-CREATE UNIQUE INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
-CREATE INDEX /*i*/rev_timestamp ON /*_*/revision (rev_timestamp);
-CREATE INDEX /*i*/page_timestamp ON /*_*/revision (rev_page,rev_timestamp);
-CREATE INDEX /*i*/user_timestamp ON /*_*/revision (rev_user,rev_timestamp);
-CREATE INDEX /*i*/usertext_timestamp ON /*_*/revision (rev_user_text,rev_timestamp);
-CREATE TABLE /*_*/text (
- old_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- old_text mediumblob NOT NULL,
- old_flags tinyblob NOT NULL
-) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
-CREATE TABLE /*_*/archive (
- ar_namespace int NOT NULL default 0,
- ar_title varchar(255) binary NOT NULL default '',
- ar_text mediumblob NOT NULL,
- ar_comment tinyblob NOT NULL,
- ar_user int unsigned NOT NULL default 0,
- ar_user_text varchar(255) binary NOT NULL,
- ar_timestamp binary(14) NOT NULL default '',
- ar_minor_edit tinyint NOT NULL default 0,
- ar_flags tinyblob NOT NULL,
- ar_rev_id int unsigned,
- ar_text_id int unsigned,
- ar_deleted tinyint unsigned NOT NULL default 0,
- ar_len int unsigned,
- ar_page_id int unsigned,
- ar_parent_id int unsigned default NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
-CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
-CREATE TABLE /*_*/pagelinks (
- pl_from int unsigned NOT NULL default 0,
- pl_namespace int NOT NULL default 0,
- pl_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pl_from ON /*_*/pagelinks (pl_from,pl_namespace,pl_title);
-CREATE UNIQUE INDEX /*i*/pl_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from);
-CREATE TABLE /*_*/templatelinks (
- tl_from int unsigned NOT NULL default 0,
- tl_namespace int NOT NULL default 0,
- tl_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/tl_from ON /*_*/templatelinks (tl_from,tl_namespace,tl_title);
-CREATE UNIQUE INDEX /*i*/tl_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from);
-CREATE TABLE /*_*/imagelinks (
- il_from int unsigned NOT NULL default 0,
- il_to varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/il_from ON /*_*/imagelinks (il_from,il_to);
-CREATE UNIQUE INDEX /*i*/il_to ON /*_*/imagelinks (il_to,il_from);
-CREATE TABLE /*_*/categorylinks (
- cl_from int unsigned NOT NULL default 0,
- cl_to varchar(255) binary NOT NULL default '',
- cl_sortkey varchar(70) binary NOT NULL default '',
- cl_timestamp timestamp NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/cl_from ON /*_*/categorylinks (cl_from,cl_to);
-CREATE INDEX /*i*/cl_sortkey ON /*_*/categorylinks (cl_to,cl_sortkey,cl_from);
-CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp);
-CREATE TABLE /*_*/category (
- cat_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- cat_title varchar(255) binary NOT NULL,
- cat_pages int signed NOT NULL default 0,
- cat_subcats int signed NOT NULL default 0,
- cat_files int signed NOT NULL default 0,
- cat_hidden tinyint unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/cat_title ON /*_*/category (cat_title);
-CREATE INDEX /*i*/cat_pages ON /*_*/category (cat_pages);
-CREATE TABLE /*_*/externallinks (
- el_from int unsigned NOT NULL default 0,
- el_to blob NOT NULL,
- el_index blob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
-CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
-CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
- eu_local_id int unsigned NOT NULL PRIMARY KEY,
- eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
-CREATE TABLE /*_*/langlinks (
- ll_from int unsigned NOT NULL default 0,
- ll_lang varbinary(20) NOT NULL default '',
- ll_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ll_from ON /*_*/langlinks (ll_from, ll_lang);
-CREATE INDEX /*i*/ll_lang ON /*_*/langlinks (ll_lang, ll_title);
-CREATE TABLE /*_*/site_stats (
- ss_row_id int unsigned NOT NULL,
- ss_total_views bigint unsigned default 0,
- ss_total_edits bigint unsigned default 0,
- ss_good_articles bigint unsigned default 0,
- ss_total_pages bigint default '-1',
- ss_users bigint default '-1',
- ss_active_users bigint default '-1',
- ss_admins int default '-1',
- ss_images int default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id);
-CREATE TABLE /*_*/hitcounter (
- hc_id int unsigned NOT NULL
-) ENGINE=HEAP MAX_ROWS=25000;
-CREATE TABLE /*_*/ipblocks (
- ipb_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- ipb_address tinyblob NOT NULL,
- ipb_user int unsigned NOT NULL default 0,
- ipb_by int unsigned NOT NULL default 0,
- ipb_by_text varchar(255) binary NOT NULL default '',
- ipb_reason tinyblob NOT NULL,
- ipb_timestamp binary(14) NOT NULL default '',
- ipb_auto bool NOT NULL default 0,
- ipb_anon_only bool NOT NULL default 0,
- ipb_create_account bool NOT NULL default 1,
- ipb_enable_autoblock bool NOT NULL default '1',
- ipb_expiry varbinary(14) NOT NULL default '',
- ipb_range_start tinyblob NOT NULL,
- ipb_range_end tinyblob NOT NULL,
- ipb_deleted bool NOT NULL default 0,
- ipb_block_email bool NOT NULL default 0,
- ipb_allow_usertalk bool NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only);
-CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
-CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
-CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
-CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
-CREATE TABLE /*_*/image (
- img_name varchar(255) binary NOT NULL default '' PRIMARY KEY,
- img_size int unsigned NOT NULL default 0,
- img_width int NOT NULL default 0,
- img_height int NOT NULL default 0,
- img_metadata mediumblob NOT NULL,
- img_bits int NOT NULL default 0,
- img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
- img_minor_mime varbinary(100) NOT NULL default "unknown",
- img_description tinyblob NOT NULL,
- img_user int unsigned NOT NULL default 0,
- img_user_text varchar(255) binary NOT NULL,
- img_timestamp varbinary(14) NOT NULL default '',
- img_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
-CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
-CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
-CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1);
-CREATE TABLE /*_*/oldimage (
- oi_name varchar(255) binary NOT NULL default '',
- oi_archive_name varchar(255) binary NOT NULL default '',
- oi_size int unsigned NOT NULL default 0,
- oi_width int NOT NULL default 0,
- oi_height int NOT NULL default 0,
- oi_bits int NOT NULL default 0,
- oi_description tinyblob NOT NULL,
- oi_user int unsigned NOT NULL default 0,
- oi_user_text varchar(255) binary NOT NULL,
- oi_timestamp binary(14) NOT NULL default '',
- oi_metadata mediumblob NOT NULL,
- oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
- oi_minor_mime varbinary(100) NOT NULL default "unknown",
- oi_deleted tinyint unsigned NOT NULL default 0,
- oi_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
-CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
-CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name(14));
-CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1);
-CREATE TABLE /*_*/filearchive (
- fa_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- fa_name varchar(255) binary NOT NULL default '',
- fa_archive_name varchar(255) binary default '',
- fa_storage_group varbinary(16),
- fa_storage_key varbinary(64) default '',
- fa_deleted_user int,
- fa_deleted_timestamp binary(14) default '',
- fa_deleted_reason text,
- fa_size int unsigned default 0,
- fa_width int default 0,
- fa_height int default 0,
- fa_metadata mediumblob,
- fa_bits int default 0,
- fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") default "unknown",
- fa_minor_mime varbinary(100) default "unknown",
- fa_description tinyblob,
- fa_user int unsigned default 0,
- fa_user_text varchar(255) binary,
- fa_timestamp binary(14) default '',
- fa_deleted tinyint unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);
-CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);
-CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
-CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
-CREATE TABLE /*_*/recentchanges (
- rc_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- rc_timestamp varbinary(14) NOT NULL default '',
- rc_cur_time varbinary(14) NOT NULL default '',
- rc_user int unsigned NOT NULL default 0,
- rc_user_text varchar(255) binary NOT NULL,
- rc_namespace int NOT NULL default 0,
- rc_title varchar(255) binary NOT NULL default '',
- rc_comment varchar(255) binary NOT NULL default '',
- rc_minor tinyint unsigned NOT NULL default 0,
- rc_bot tinyint unsigned NOT NULL default 0,
- rc_new tinyint unsigned NOT NULL default 0,
- rc_cur_id int unsigned NOT NULL default 0,
- rc_this_oldid int unsigned NOT NULL default 0,
- rc_last_oldid int unsigned NOT NULL default 0,
- rc_type tinyint unsigned NOT NULL default 0,
- rc_moved_to_ns tinyint unsigned NOT NULL default 0,
- rc_moved_to_title varchar(255) binary NOT NULL default '',
- rc_patrolled tinyint unsigned NOT NULL default 0,
- rc_ip varbinary(40) NOT NULL default '',
- rc_old_len int,
- rc_new_len int,
- rc_deleted tinyint unsigned NOT NULL default 0,
- rc_logid int unsigned NOT NULL default 0,
- rc_log_type varbinary(255) NULL default NULL,
- rc_log_action varbinary(255) NULL default NULL,
- rc_params blob NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp);
-CREATE INDEX /*i*/rc_namespace_title ON /*_*/recentchanges (rc_namespace, rc_title);
-CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id);
-CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp);
-CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip);
-CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text);
-CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp);
-CREATE TABLE /*_*/watchlist (
- wl_user int unsigned NOT NULL,
- wl_namespace int NOT NULL default 0,
- wl_title varchar(255) binary NOT NULL default '',
- wl_notificationtimestamp varbinary(14)
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/wl_user ON /*_*/watchlist (wl_user, wl_namespace, wl_title);
-CREATE INDEX /*i*/namespace_title ON /*_*/watchlist (wl_namespace, wl_title);
-CREATE TABLE /*_*/math (
- math_inputhash varbinary(16) NOT NULL,
- math_outputhash varbinary(16) NOT NULL,
- math_html_conservativeness tinyint NOT NULL,
- math_html text,
- math_mathml text
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/math_inputhash ON /*_*/math (math_inputhash);
-CREATE TABLE /*_*/searchindex (
- si_page int unsigned NOT NULL,
- si_title varchar(255) NOT NULL default '',
- si_text mediumtext NOT NULL
-) ENGINE=MyISAM;
-CREATE UNIQUE INDEX /*i*/si_page ON /*_*/searchindex (si_page);
-CREATE FULLTEXT INDEX /*i*/si_title ON /*_*/searchindex (si_title);
-CREATE FULLTEXT INDEX /*i*/si_text ON /*_*/searchindex (si_text);
-CREATE TABLE /*_*/interwiki (
- iw_prefix varchar(32) NOT NULL,
- iw_url blob NOT NULL,
- iw_local bool NOT NULL,
- iw_trans tinyint NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/iw_prefix ON /*_*/interwiki (iw_prefix);
-CREATE TABLE /*_*/querycache (
- qc_type varbinary(32) NOT NULL,
- qc_value int unsigned NOT NULL default 0,
- qc_namespace int NOT NULL default 0,
- qc_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/qc_type ON /*_*/querycache (qc_type,qc_value);
-CREATE TABLE /*_*/objectcache (
- keyname varbinary(255) NOT NULL default '' PRIMARY KEY,
- value mediumblob,
- exptime datetime
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/exptime ON /*_*/objectcache (exptime);
-CREATE TABLE /*_*/transcache (
- tc_url varbinary(255) NOT NULL,
- tc_contents text,
- tc_time binary(14) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/tc_url_idx ON /*_*/transcache (tc_url);
-CREATE TABLE /*_*/logging (
- log_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- log_type varbinary(32) NOT NULL default '',
- log_action varbinary(32) NOT NULL default '',
- log_timestamp binary(14) NOT NULL default '19700101000000',
- log_user int unsigned NOT NULL default 0,
- log_user_text varchar(255) binary NOT NULL default '',
- log_namespace int NOT NULL default 0,
- log_title varchar(255) binary NOT NULL default '',
- log_page int unsigned NULL,
- log_comment varchar(255) NOT NULL default '',
- log_params blob NOT NULL,
- log_deleted tinyint unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/type_time ON /*_*/logging (log_type, log_timestamp);
-CREATE INDEX /*i*/user_time ON /*_*/logging (log_user, log_timestamp);
-CREATE INDEX /*i*/page_time ON /*_*/logging (log_namespace, log_title, log_timestamp);
-CREATE INDEX /*i*/times ON /*_*/logging (log_timestamp);
-CREATE INDEX /*i*/log_user_type_time ON /*_*/logging (log_user, log_type, log_timestamp);
-CREATE INDEX /*i*/log_page_id_time ON /*_*/logging (log_page,log_timestamp);
-CREATE TABLE /*_*/log_search (
- ls_field varbinary(32) NOT NULL,
- ls_value varchar(255) NOT NULL,
- ls_log_id int unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ls_field_val ON /*_*/log_search (ls_field,ls_value,ls_log_id);
-CREATE INDEX /*i*/ls_log_id ON /*_*/log_search (ls_log_id);
-CREATE TABLE /*_*/trackbacks (
- tb_id int PRIMARY KEY AUTO_INCREMENT,
- tb_page int REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
- tb_title varchar(255) NOT NULL,
- tb_url blob NOT NULL,
- tb_ex text,
- tb_name varchar(255)
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/tb_page ON /*_*/trackbacks (tb_page);
-CREATE TABLE /*_*/job (
- job_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- job_cmd varbinary(60) NOT NULL default '',
- job_namespace int NOT NULL,
- job_title varchar(255) binary NOT NULL,
- job_params blob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/job_cmd ON /*_*/job (job_cmd, job_namespace, job_title, job_params(128));
-CREATE TABLE /*_*/querycache_info (
- qci_type varbinary(32) NOT NULL default '',
- qci_timestamp binary(14) NOT NULL default '19700101000000'
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/qci_type ON /*_*/querycache_info (qci_type);
-CREATE TABLE /*_*/redirect (
- rd_from int unsigned NOT NULL default 0 PRIMARY KEY,
- rd_namespace int NOT NULL default 0,
- rd_title varchar(255) binary NOT NULL default '',
- rd_interwiki varchar(32) default NULL,
- rd_fragment varchar(255) binary default NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/rd_ns_title ON /*_*/redirect (rd_namespace,rd_title,rd_from);
-CREATE TABLE /*_*/querycachetwo (
- qcc_type varbinary(32) NOT NULL,
- qcc_value int unsigned NOT NULL default 0,
- qcc_namespace int NOT NULL default 0,
- qcc_title varchar(255) binary NOT NULL default '',
- qcc_namespacetwo int NOT NULL default 0,
- qcc_titletwo varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/qcc_type ON /*_*/querycachetwo (qcc_type,qcc_value);
-CREATE INDEX /*i*/qcc_title ON /*_*/querycachetwo (qcc_type,qcc_namespace,qcc_title);
-CREATE INDEX /*i*/qcc_titletwo ON /*_*/querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
-CREATE TABLE /*_*/page_restrictions (
- pr_page int NOT NULL,
- pr_type varbinary(60) NOT NULL,
- pr_level varbinary(60) NOT NULL,
- pr_cascade tinyint NOT NULL,
- pr_user int NULL,
- pr_expiry varbinary(14) NULL,
- pr_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pr_pagetype ON /*_*/page_restrictions (pr_page,pr_type);
-CREATE INDEX /*i*/pr_typelevel ON /*_*/page_restrictions (pr_type,pr_level);
-CREATE INDEX /*i*/pr_level ON /*_*/page_restrictions (pr_level);
-CREATE INDEX /*i*/pr_cascade ON /*_*/page_restrictions (pr_cascade);
-CREATE TABLE /*_*/protected_titles (
- pt_namespace int NOT NULL,
- pt_title varchar(255) binary NOT NULL,
- pt_user int unsigned NOT NULL,
- pt_reason tinyblob,
- pt_timestamp binary(14) NOT NULL,
- pt_expiry varbinary(14) NOT NULL default '',
- pt_create_perm varbinary(60) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pt_namespace_title ON /*_*/protected_titles (pt_namespace,pt_title);
-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
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props (pp_page,pp_propname);
-CREATE TABLE /*_*/updatelog (
- ul_key varchar(255) NOT NULL PRIMARY KEY
-) /*$wgDBTableOptions*/;
-CREATE TABLE /*_*/change_tag (
- ct_rc_id int NULL,
- ct_log_id int NULL,
- ct_rev_id int NULL,
- ct_tag varchar(255) NOT NULL,
- ct_params blob NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag (ct_rc_id,ct_tag);
-CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag);
-CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag);
-CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
-CREATE TABLE /*_*/tag_summary (
- ts_rc_id int NULL,
- ts_log_id int NULL,
- ts_rev_id int NULL,
- ts_tags blob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
-CREATE TABLE /*_*/valid_tag (
- vt_tag varchar(255) NOT NULL PRIMARY KEY
-) /*$wgDBTableOptions*/;
-CREATE TABLE /*_*/l10n_cache (
- lc_lang varbinary(32) NOT NULL,
- lc_key varchar(255) NOT NULL,
- lc_value mediumblob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key);
diff --git a/tests/phpunit/data/db/sqlite/tables-1.17.sql b/tests/phpunit/data/db/sqlite/tables-1.17.sql
deleted file mode 100644
index 69ae3764..00000000
--- a/tests/phpunit/data/db/sqlite/tables-1.17.sql
+++ /dev/null
@@ -1,516 +0,0 @@
--- This is a copy of MediaWiki 1.17 schema shared by MySQL and SQLite.
--- It is used for updater testing. Comments are stripped to decrease
--- file size, as we don't need to maintain it.
-
-CREATE TABLE /*_*/user (
- user_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- user_name varchar(255) binary NOT NULL default '',
- user_real_name varchar(255) binary NOT NULL default '',
- user_password tinyblob NOT NULL,
- user_newpassword tinyblob NOT NULL,
- user_newpass_time binary(14),
- user_email tinytext NOT NULL,
- user_options blob NOT NULL,
- user_touched binary(14) NOT NULL default '',
- user_token binary(32) NOT NULL default '',
- user_email_authenticated binary(14),
- user_email_token binary(32),
- user_email_token_expires binary(14),
- user_registration binary(14),
- user_editcount int
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/user_name ON /*_*/user (user_name);
-CREATE INDEX /*i*/user_email_token ON /*_*/user (user_email_token);
-CREATE TABLE /*_*/user_groups (
- ug_user int unsigned NOT NULL default 0,
- ug_group varbinary(16) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ug_user_group ON /*_*/user_groups (ug_user,ug_group);
-CREATE INDEX /*i*/ug_group ON /*_*/user_groups (ug_group);
-CREATE TABLE /*_*/user_newtalk (
- user_id int NOT NULL default 0,
- user_ip varbinary(40) NOT NULL default '',
- user_last_timestamp binary(14) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/un_user_id ON /*_*/user_newtalk (user_id);
-CREATE INDEX /*i*/un_user_ip ON /*_*/user_newtalk (user_ip);
-CREATE TABLE /*_*/user_properties (
- up_user int NOT NULL,
- up_property varbinary(32) NOT NULL,
- up_value blob
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/user_properties_user_property ON /*_*/user_properties (up_user,up_property);
-CREATE INDEX /*i*/user_properties_property ON /*_*/user_properties (up_property);
-CREATE TABLE /*_*/page (
- page_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- page_namespace int NOT NULL,
- page_title varchar(255) binary NOT NULL,
- page_restrictions tinyblob NOT NULL,
- page_counter bigint unsigned NOT NULL default 0,
- page_is_redirect tinyint unsigned NOT NULL default 0,
- page_is_new tinyint unsigned NOT NULL default 0,
- page_random real unsigned NOT NULL,
- page_touched binary(14) NOT NULL default '',
- page_latest int unsigned NOT NULL,
- page_len int unsigned NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
-CREATE INDEX /*i*/page_random ON /*_*/page (page_random);
-CREATE INDEX /*i*/page_len ON /*_*/page (page_len);
-CREATE TABLE /*_*/revision (
- rev_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- rev_page int unsigned NOT NULL,
- rev_text_id int unsigned NOT NULL,
- rev_comment tinyblob NOT NULL,
- rev_user int unsigned NOT NULL default 0,
- rev_user_text varchar(255) binary NOT NULL default '',
- rev_timestamp binary(14) NOT NULL default '',
- rev_minor_edit tinyint unsigned NOT NULL default 0,
- rev_deleted tinyint unsigned NOT NULL default 0,
- rev_len int unsigned,
- rev_parent_id int unsigned default NULL
-) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-CREATE UNIQUE INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
-CREATE INDEX /*i*/rev_timestamp ON /*_*/revision (rev_timestamp);
-CREATE INDEX /*i*/page_timestamp ON /*_*/revision (rev_page,rev_timestamp);
-CREATE INDEX /*i*/user_timestamp ON /*_*/revision (rev_user,rev_timestamp);
-CREATE INDEX /*i*/usertext_timestamp ON /*_*/revision (rev_user_text,rev_timestamp);
-CREATE TABLE /*_*/text (
- old_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- old_text mediumblob NOT NULL,
- old_flags tinyblob NOT NULL
-) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
-CREATE TABLE /*_*/archive (
- ar_namespace int NOT NULL default 0,
- ar_title varchar(255) binary NOT NULL default '',
- ar_text mediumblob NOT NULL,
- ar_comment tinyblob NOT NULL,
- ar_user int unsigned NOT NULL default 0,
- ar_user_text varchar(255) binary NOT NULL,
- ar_timestamp binary(14) NOT NULL default '',
- ar_minor_edit tinyint NOT NULL default 0,
- ar_flags tinyblob NOT NULL,
- ar_rev_id int unsigned,
- ar_text_id int unsigned,
- ar_deleted tinyint unsigned NOT NULL default 0,
- ar_len int unsigned,
- ar_page_id int unsigned,
- ar_parent_id int unsigned default NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
-CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
-CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
-CREATE TABLE /*_*/pagelinks (
- pl_from int unsigned NOT NULL default 0,
- pl_namespace int NOT NULL default 0,
- pl_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pl_from ON /*_*/pagelinks (pl_from,pl_namespace,pl_title);
-CREATE UNIQUE INDEX /*i*/pl_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from);
-CREATE TABLE /*_*/templatelinks (
- tl_from int unsigned NOT NULL default 0,
- tl_namespace int NOT NULL default 0,
- tl_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/tl_from ON /*_*/templatelinks (tl_from,tl_namespace,tl_title);
-CREATE UNIQUE INDEX /*i*/tl_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from);
-CREATE TABLE /*_*/imagelinks (
- il_from int unsigned NOT NULL default 0,
- il_to varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/il_from ON /*_*/imagelinks (il_from,il_to);
-CREATE UNIQUE INDEX /*i*/il_to ON /*_*/imagelinks (il_to,il_from);
-CREATE TABLE /*_*/categorylinks (
- cl_from int unsigned NOT NULL default 0,
- cl_to varchar(255) binary NOT NULL default '',
- cl_sortkey varbinary(230) NOT NULL default '',
- cl_sortkey_prefix varchar(255) binary NOT NULL default '',
- cl_timestamp timestamp NOT NULL,
- cl_collation varbinary(32) NOT NULL default '',
- cl_type ENUM('page', 'subcat', 'file') NOT NULL default 'page'
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/cl_from ON /*_*/categorylinks (cl_from,cl_to);
-CREATE INDEX /*i*/cl_sortkey ON /*_*/categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
-CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp);
-CREATE INDEX /*i*/cl_collation ON /*_*/categorylinks (cl_collation);
-CREATE TABLE /*_*/category (
- cat_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- cat_title varchar(255) binary NOT NULL,
- cat_pages int signed NOT NULL default 0,
- cat_subcats int signed NOT NULL default 0,
- cat_files int signed NOT NULL default 0,
- cat_hidden tinyint unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/cat_title ON /*_*/category (cat_title);
-CREATE INDEX /*i*/cat_pages ON /*_*/category (cat_pages);
-CREATE TABLE /*_*/externallinks (
- el_from int unsigned NOT NULL default 0,
- el_to blob NOT NULL,
- el_index blob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
-CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
-CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
- eu_local_id int unsigned NOT NULL PRIMARY KEY,
- eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
-CREATE TABLE /*_*/langlinks (
- ll_from int unsigned NOT NULL default 0,
- ll_lang varbinary(20) NOT NULL default '',
- ll_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ll_from ON /*_*/langlinks (ll_from, ll_lang);
-CREATE INDEX /*i*/ll_lang ON /*_*/langlinks (ll_lang, ll_title);
-CREATE TABLE /*_*/iwlinks (
- iwl_from int unsigned NOT NULL default 0,
- iwl_prefix varbinary(20) NOT NULL default '',
- iwl_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/iwl_from ON /*_*/iwlinks (iwl_from, iwl_prefix, iwl_title);
-CREATE UNIQUE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
-CREATE TABLE /*_*/site_stats (
- ss_row_id int unsigned NOT NULL,
- ss_total_views bigint unsigned default 0,
- ss_total_edits bigint unsigned default 0,
- ss_good_articles bigint unsigned default 0,
- ss_total_pages bigint default '-1',
- ss_users bigint default '-1',
- ss_active_users bigint default '-1',
- ss_admins int default '-1',
- ss_images int default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id);
-CREATE TABLE /*_*/hitcounter (
- hc_id int unsigned NOT NULL
-) ENGINE=HEAP MAX_ROWS=25000;
-CREATE TABLE /*_*/ipblocks (
- ipb_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- ipb_address tinyblob NOT NULL,
- ipb_user int unsigned NOT NULL default 0,
- ipb_by int unsigned NOT NULL default 0,
- ipb_by_text varchar(255) binary NOT NULL default '',
- ipb_reason tinyblob NOT NULL,
- ipb_timestamp binary(14) NOT NULL default '',
- ipb_auto bool NOT NULL default 0,
- ipb_anon_only bool NOT NULL default 0,
- ipb_create_account bool NOT NULL default 1,
- ipb_enable_autoblock bool NOT NULL default '1',
- ipb_expiry varbinary(14) NOT NULL default '',
- ipb_range_start tinyblob NOT NULL,
- ipb_range_end tinyblob NOT NULL,
- ipb_deleted bool NOT NULL default 0,
- ipb_block_email bool NOT NULL default 0,
- ipb_allow_usertalk bool NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only);
-CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
-CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
-CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
-CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
-CREATE TABLE /*_*/image (
- img_name varchar(255) binary NOT NULL default '' PRIMARY KEY,
- img_size int unsigned NOT NULL default 0,
- img_width int NOT NULL default 0,
- img_height int NOT NULL default 0,
- img_metadata mediumblob NOT NULL,
- img_bits int NOT NULL default 0,
- img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
- img_minor_mime varbinary(100) NOT NULL default "unknown",
- img_description tinyblob NOT NULL,
- img_user int unsigned NOT NULL default 0,
- img_user_text varchar(255) binary NOT NULL,
- img_timestamp varbinary(14) NOT NULL default '',
- img_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
-CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
-CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
-CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1);
-CREATE TABLE /*_*/oldimage (
- oi_name varchar(255) binary NOT NULL default '',
- oi_archive_name varchar(255) binary NOT NULL default '',
- oi_size int unsigned NOT NULL default 0,
- oi_width int NOT NULL default 0,
- oi_height int NOT NULL default 0,
- oi_bits int NOT NULL default 0,
- oi_description tinyblob NOT NULL,
- oi_user int unsigned NOT NULL default 0,
- oi_user_text varchar(255) binary NOT NULL,
- oi_timestamp binary(14) NOT NULL default '',
- oi_metadata mediumblob NOT NULL,
- oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
- oi_minor_mime varbinary(100) NOT NULL default "unknown",
- oi_deleted tinyint unsigned NOT NULL default 0,
- oi_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
-CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
-CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name(14));
-CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1);
-CREATE TABLE /*_*/filearchive (
- fa_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- fa_name varchar(255) binary NOT NULL default '',
- fa_archive_name varchar(255) binary default '',
- fa_storage_group varbinary(16),
- fa_storage_key varbinary(64) default '',
- fa_deleted_user int,
- fa_deleted_timestamp binary(14) default '',
- fa_deleted_reason text,
- fa_size int unsigned default 0,
- fa_width int default 0,
- fa_height int default 0,
- fa_metadata mediumblob,
- fa_bits int default 0,
- fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") default "unknown",
- fa_minor_mime varbinary(100) default "unknown",
- fa_description tinyblob,
- fa_user int unsigned default 0,
- fa_user_text varchar(255) binary,
- fa_timestamp binary(14) default '',
- fa_deleted tinyint unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);
-CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);
-CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
-CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
-CREATE TABLE /*_*/recentchanges (
- rc_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- rc_timestamp varbinary(14) NOT NULL default '',
- rc_cur_time varbinary(14) NOT NULL default '',
- rc_user int unsigned NOT NULL default 0,
- rc_user_text varchar(255) binary NOT NULL,
- rc_namespace int NOT NULL default 0,
- rc_title varchar(255) binary NOT NULL default '',
- rc_comment varchar(255) binary NOT NULL default '',
- rc_minor tinyint unsigned NOT NULL default 0,
- rc_bot tinyint unsigned NOT NULL default 0,
- rc_new tinyint unsigned NOT NULL default 0,
- rc_cur_id int unsigned NOT NULL default 0,
- rc_this_oldid int unsigned NOT NULL default 0,
- rc_last_oldid int unsigned NOT NULL default 0,
- rc_type tinyint unsigned NOT NULL default 0,
- rc_moved_to_ns tinyint unsigned NOT NULL default 0,
- rc_moved_to_title varchar(255) binary NOT NULL default '',
- rc_patrolled tinyint unsigned NOT NULL default 0,
- rc_ip varbinary(40) NOT NULL default '',
- rc_old_len int,
- rc_new_len int,
- rc_deleted tinyint unsigned NOT NULL default 0,
- rc_logid int unsigned NOT NULL default 0,
- rc_log_type varbinary(255) NULL default NULL,
- rc_log_action varbinary(255) NULL default NULL,
- rc_params blob NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp);
-CREATE INDEX /*i*/rc_namespace_title ON /*_*/recentchanges (rc_namespace, rc_title);
-CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id);
-CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp);
-CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip);
-CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text);
-CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp);
-CREATE TABLE /*_*/watchlist (
- wl_user int unsigned NOT NULL,
- wl_namespace int NOT NULL default 0,
- wl_title varchar(255) binary NOT NULL default '',
- wl_notificationtimestamp varbinary(14)
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/wl_user ON /*_*/watchlist (wl_user, wl_namespace, wl_title);
-CREATE INDEX /*i*/namespace_title ON /*_*/watchlist (wl_namespace, wl_title);
-CREATE TABLE /*_*/math (
- math_inputhash varbinary(16) NOT NULL,
- math_outputhash varbinary(16) NOT NULL,
- math_html_conservativeness tinyint NOT NULL,
- math_html text,
- math_mathml text
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/math_inputhash ON /*_*/math (math_inputhash);
-CREATE TABLE /*_*/searchindex (
- si_page int unsigned NOT NULL,
- si_title varchar(255) NOT NULL default '',
- si_text mediumtext NOT NULL
-) ENGINE=MyISAM;
-CREATE UNIQUE INDEX /*i*/si_page ON /*_*/searchindex (si_page);
-CREATE FULLTEXT INDEX /*i*/si_title ON /*_*/searchindex (si_title);
-CREATE FULLTEXT INDEX /*i*/si_text ON /*_*/searchindex (si_text);
-CREATE TABLE /*_*/interwiki (
- iw_prefix varchar(32) NOT NULL,
- iw_url blob NOT NULL,
- iw_api blob NOT NULL,
- iw_wikiid varchar(64) NOT NULL,
- iw_local bool NOT NULL,
- iw_trans tinyint NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/iw_prefix ON /*_*/interwiki (iw_prefix);
-CREATE TABLE /*_*/querycache (
- qc_type varbinary(32) NOT NULL,
- qc_value int unsigned NOT NULL default 0,
- qc_namespace int NOT NULL default 0,
- qc_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/qc_type ON /*_*/querycache (qc_type,qc_value);
-CREATE TABLE /*_*/objectcache (
- keyname varbinary(255) NOT NULL default '' PRIMARY KEY,
- value mediumblob,
- exptime datetime
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/exptime ON /*_*/objectcache (exptime);
-CREATE TABLE /*_*/transcache (
- tc_url varbinary(255) NOT NULL,
- tc_contents text,
- tc_time binary(14) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/tc_url_idx ON /*_*/transcache (tc_url);
-CREATE TABLE /*_*/logging (
- log_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- log_type varbinary(32) NOT NULL default '',
- log_action varbinary(32) NOT NULL default '',
- log_timestamp binary(14) NOT NULL default '19700101000000',
- log_user int unsigned NOT NULL default 0,
- log_user_text varchar(255) binary NOT NULL default '',
- log_namespace int NOT NULL default 0,
- log_title varchar(255) binary NOT NULL default '',
- log_page int unsigned NULL,
- log_comment varchar(255) NOT NULL default '',
- log_params blob NOT NULL,
- log_deleted tinyint unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/type_time ON /*_*/logging (log_type, log_timestamp);
-CREATE INDEX /*i*/user_time ON /*_*/logging (log_user, log_timestamp);
-CREATE INDEX /*i*/page_time ON /*_*/logging (log_namespace, log_title, log_timestamp);
-CREATE INDEX /*i*/times ON /*_*/logging (log_timestamp);
-CREATE INDEX /*i*/log_user_type_time ON /*_*/logging (log_user, log_type, log_timestamp);
-CREATE INDEX /*i*/log_page_id_time ON /*_*/logging (log_page,log_timestamp);
-CREATE TABLE /*_*/log_search (
- ls_field varbinary(32) NOT NULL,
- ls_value varchar(255) NOT NULL,
- ls_log_id int unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ls_field_val ON /*_*/log_search (ls_field,ls_value,ls_log_id);
-CREATE INDEX /*i*/ls_log_id ON /*_*/log_search (ls_log_id);
-CREATE TABLE /*_*/trackbacks (
- tb_id int PRIMARY KEY AUTO_INCREMENT,
- tb_page int REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
- tb_title varchar(255) NOT NULL,
- tb_url blob NOT NULL,
- tb_ex text,
- tb_name varchar(255)
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/tb_page ON /*_*/trackbacks (tb_page);
-CREATE TABLE /*_*/job (
- job_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- job_cmd varbinary(60) NOT NULL default '',
- job_namespace int NOT NULL,
- job_title varchar(255) binary NOT NULL,
- job_params blob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/job_cmd ON /*_*/job (job_cmd, job_namespace, job_title, job_params(128));
-CREATE TABLE /*_*/querycache_info (
- qci_type varbinary(32) NOT NULL default '',
- qci_timestamp binary(14) NOT NULL default '19700101000000'
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/qci_type ON /*_*/querycache_info (qci_type);
-CREATE TABLE /*_*/redirect (
- rd_from int unsigned NOT NULL default 0 PRIMARY KEY,
- rd_namespace int NOT NULL default 0,
- rd_title varchar(255) binary NOT NULL default '',
- rd_interwiki varchar(32) default NULL,
- rd_fragment varchar(255) binary default NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/rd_ns_title ON /*_*/redirect (rd_namespace,rd_title,rd_from);
-CREATE TABLE /*_*/querycachetwo (
- qcc_type varbinary(32) NOT NULL,
- qcc_value int unsigned NOT NULL default 0,
- qcc_namespace int NOT NULL default 0,
- qcc_title varchar(255) binary NOT NULL default '',
- qcc_namespacetwo int NOT NULL default 0,
- qcc_titletwo varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/qcc_type ON /*_*/querycachetwo (qcc_type,qcc_value);
-CREATE INDEX /*i*/qcc_title ON /*_*/querycachetwo (qcc_type,qcc_namespace,qcc_title);
-CREATE INDEX /*i*/qcc_titletwo ON /*_*/querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
-CREATE TABLE /*_*/page_restrictions (
- pr_page int NOT NULL,
- pr_type varbinary(60) NOT NULL,
- pr_level varbinary(60) NOT NULL,
- pr_cascade tinyint NOT NULL,
- pr_user int NULL,
- pr_expiry varbinary(14) NULL,
- pr_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pr_pagetype ON /*_*/page_restrictions (pr_page,pr_type);
-CREATE INDEX /*i*/pr_typelevel ON /*_*/page_restrictions (pr_type,pr_level);
-CREATE INDEX /*i*/pr_level ON /*_*/page_restrictions (pr_level);
-CREATE INDEX /*i*/pr_cascade ON /*_*/page_restrictions (pr_cascade);
-CREATE TABLE /*_*/protected_titles (
- pt_namespace int NOT NULL,
- pt_title varchar(255) binary NOT NULL,
- pt_user int unsigned NOT NULL,
- pt_reason tinyblob,
- pt_timestamp binary(14) NOT NULL,
- pt_expiry varbinary(14) NOT NULL default '',
- pt_create_perm varbinary(60) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pt_namespace_title ON /*_*/protected_titles (pt_namespace,pt_title);
-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
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props (pp_page,pp_propname);
-CREATE TABLE /*_*/updatelog (
- ul_key varchar(255) NOT NULL PRIMARY KEY,
- ul_value blob
-) /*$wgDBTableOptions*/;
-CREATE TABLE /*_*/change_tag (
- ct_rc_id int NULL,
- ct_log_id int NULL,
- ct_rev_id int NULL,
- ct_tag varchar(255) NOT NULL,
- ct_params blob NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag (ct_rc_id,ct_tag);
-CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag);
-CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag);
-CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
-CREATE TABLE /*_*/tag_summary (
- ts_rc_id int NULL,
- ts_log_id int NULL,
- ts_rev_id int NULL,
- ts_tags blob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
-CREATE TABLE /*_*/valid_tag (
- vt_tag varchar(255) NOT NULL PRIMARY KEY
-) /*$wgDBTableOptions*/;
-CREATE TABLE /*_*/l10n_cache (
- lc_lang varbinary(32) NOT NULL,
- lc_key varchar(255) NOT NULL,
- lc_value mediumblob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key);
-CREATE TABLE /*_*/msg_resource (
- mr_resource varbinary(255) NOT NULL,
- mr_lang varbinary(32) NOT NULL,
- mr_blob mediumblob NOT NULL,
- mr_timestamp binary(14) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/mr_resource_lang ON /*_*/msg_resource (mr_resource, mr_lang);
-CREATE TABLE /*_*/msg_resource_links (
- mrl_resource varbinary(255) NOT NULL,
- mrl_message varbinary(255) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/mrl_message_resource ON /*_*/msg_resource_links (mrl_message, mrl_resource);
-CREATE TABLE /*_*/module_deps (
- md_module varbinary(255) NOT NULL,
- md_skin varbinary(32) NOT NULL,
- md_deps mediumblob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/md_module_skin ON /*_*/module_deps (md_module, md_skin);
diff --git a/tests/phpunit/data/db/sqlite/tables-1.18.sql b/tests/phpunit/data/db/sqlite/tables-1.18.sql
deleted file mode 100644
index bedf6c33..00000000
--- a/tests/phpunit/data/db/sqlite/tables-1.18.sql
+++ /dev/null
@@ -1,535 +0,0 @@
--- This is a copy of MediaWiki 1.18 schema shared by MySQL and SQLite.
--- It is used for updater testing. Comments are stripped to decrease
--- file size, as we don't need to maintain it.
-
-CREATE TABLE /*_*/user (
- user_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- user_name varchar(255) binary NOT NULL default '',
- user_real_name varchar(255) binary NOT NULL default '',
- user_password tinyblob NOT NULL,
- user_newpassword tinyblob NOT NULL,
- user_newpass_time binary(14),
- user_email tinytext NOT NULL,
- user_options blob NOT NULL,
- user_touched binary(14) NOT NULL default '',
- user_token binary(32) NOT NULL default '',
- user_email_authenticated binary(14),
- user_email_token binary(32),
- user_email_token_expires binary(14),
- user_registration binary(14),
- user_editcount int
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/user_name ON /*_*/user (user_name);
-CREATE INDEX /*i*/user_email_token ON /*_*/user (user_email_token);
-CREATE INDEX /*i*/user_email ON /*_*/user (user_email(50));
-CREATE TABLE /*_*/user_groups (
- ug_user int unsigned NOT NULL default 0,
- ug_group varbinary(16) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ug_user_group ON /*_*/user_groups (ug_user,ug_group);
-CREATE INDEX /*i*/ug_group ON /*_*/user_groups (ug_group);
-CREATE TABLE /*_*/user_former_groups (
- ufg_user int unsigned NOT NULL default 0,
- ufg_group varbinary(16) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ufg_user_group ON /*_*/user_former_groups (ufg_user,ufg_group);
-CREATE TABLE /*_*/user_newtalk (
- user_id int NOT NULL default 0,
- user_ip varbinary(40) NOT NULL default '',
- user_last_timestamp varbinary(14) NULL default NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/un_user_id ON /*_*/user_newtalk (user_id);
-CREATE INDEX /*i*/un_user_ip ON /*_*/user_newtalk (user_ip);
-CREATE TABLE /*_*/user_properties (
- up_user int NOT NULL,
- up_property varbinary(255) NOT NULL,
- up_value blob
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/user_properties_user_property ON /*_*/user_properties (up_user,up_property);
-CREATE INDEX /*i*/user_properties_property ON /*_*/user_properties (up_property);
-CREATE TABLE /*_*/page (
- page_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- page_namespace int NOT NULL,
- page_title varchar(255) binary NOT NULL,
- page_restrictions tinyblob NOT NULL,
- page_counter bigint unsigned NOT NULL default 0,
- page_is_redirect tinyint unsigned NOT NULL default 0,
- page_is_new tinyint unsigned NOT NULL default 0,
- page_random real unsigned NOT NULL,
- page_touched binary(14) NOT NULL default '',
- page_latest int unsigned NOT NULL,
- page_len int unsigned NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
-CREATE INDEX /*i*/page_random ON /*_*/page (page_random);
-CREATE INDEX /*i*/page_len ON /*_*/page (page_len);
-CREATE TABLE /*_*/revision (
- rev_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- rev_page int unsigned NOT NULL,
- rev_text_id int unsigned NOT NULL,
- rev_comment tinyblob NOT NULL,
- rev_user int unsigned NOT NULL default 0,
- rev_user_text varchar(255) binary NOT NULL default '',
- rev_timestamp binary(14) NOT NULL default '',
- rev_minor_edit tinyint unsigned NOT NULL default 0,
- rev_deleted tinyint unsigned NOT NULL default 0,
- rev_len int unsigned,
- rev_parent_id int unsigned default NULL
-) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-CREATE UNIQUE INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
-CREATE INDEX /*i*/rev_timestamp ON /*_*/revision (rev_timestamp);
-CREATE INDEX /*i*/page_timestamp ON /*_*/revision (rev_page,rev_timestamp);
-CREATE INDEX /*i*/user_timestamp ON /*_*/revision (rev_user,rev_timestamp);
-CREATE INDEX /*i*/usertext_timestamp ON /*_*/revision (rev_user_text,rev_timestamp);
-CREATE TABLE /*_*/text (
- old_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- old_text mediumblob NOT NULL,
- old_flags tinyblob NOT NULL
-) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
-CREATE TABLE /*_*/archive (
- ar_namespace int NOT NULL default 0,
- ar_title varchar(255) binary NOT NULL default '',
- ar_text mediumblob NOT NULL,
- ar_comment tinyblob NOT NULL,
- ar_user int unsigned NOT NULL default 0,
- ar_user_text varchar(255) binary NOT NULL,
- ar_timestamp binary(14) NOT NULL default '',
- ar_minor_edit tinyint NOT NULL default 0,
- ar_flags tinyblob NOT NULL,
- ar_rev_id int unsigned,
- ar_text_id int unsigned,
- ar_deleted tinyint unsigned NOT NULL default 0,
- ar_len int unsigned,
- ar_page_id int unsigned,
- ar_parent_id int unsigned default NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
-CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
-CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
-CREATE TABLE /*_*/pagelinks (
- pl_from int unsigned NOT NULL default 0,
- pl_namespace int NOT NULL default 0,
- pl_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pl_from ON /*_*/pagelinks (pl_from,pl_namespace,pl_title);
-CREATE UNIQUE INDEX /*i*/pl_namespace ON /*_*/pagelinks (pl_namespace,pl_title,pl_from);
-CREATE TABLE /*_*/templatelinks (
- tl_from int unsigned NOT NULL default 0,
- tl_namespace int NOT NULL default 0,
- tl_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/tl_from ON /*_*/templatelinks (tl_from,tl_namespace,tl_title);
-CREATE UNIQUE INDEX /*i*/tl_namespace ON /*_*/templatelinks (tl_namespace,tl_title,tl_from);
-CREATE TABLE /*_*/imagelinks (
- il_from int unsigned NOT NULL default 0,
- il_to varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/il_from ON /*_*/imagelinks (il_from,il_to);
-CREATE UNIQUE INDEX /*i*/il_to ON /*_*/imagelinks (il_to,il_from);
-CREATE TABLE /*_*/categorylinks (
- cl_from int unsigned NOT NULL default 0,
- cl_to varchar(255) binary NOT NULL default '',
- cl_sortkey varbinary(230) NOT NULL default '',
- cl_sortkey_prefix varchar(255) binary NOT NULL default '',
- cl_timestamp timestamp NOT NULL,
- cl_collation varbinary(32) NOT NULL default '',
- cl_type ENUM('page', 'subcat', 'file') NOT NULL default 'page'
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/cl_from ON /*_*/categorylinks (cl_from,cl_to);
-CREATE INDEX /*i*/cl_sortkey ON /*_*/categorylinks (cl_to,cl_type,cl_sortkey,cl_from);
-CREATE INDEX /*i*/cl_timestamp ON /*_*/categorylinks (cl_to,cl_timestamp);
-CREATE INDEX /*i*/cl_collation ON /*_*/categorylinks (cl_collation);
-CREATE TABLE /*_*/category (
- cat_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- cat_title varchar(255) binary NOT NULL,
- cat_pages int signed NOT NULL default 0,
- cat_subcats int signed NOT NULL default 0,
- cat_files int signed NOT NULL default 0,
- cat_hidden tinyint unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/cat_title ON /*_*/category (cat_title);
-CREATE INDEX /*i*/cat_pages ON /*_*/category (cat_pages);
-CREATE TABLE /*_*/externallinks (
- el_from int unsigned NOT NULL default 0,
- el_to blob NOT NULL,
- el_index blob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
-CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
-CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
- eu_local_id int unsigned NOT NULL PRIMARY KEY,
- eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
-CREATE TABLE /*_*/langlinks (
- ll_from int unsigned NOT NULL default 0,
- ll_lang varbinary(20) NOT NULL default '',
- ll_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ll_from ON /*_*/langlinks (ll_from, ll_lang);
-CREATE INDEX /*i*/ll_lang ON /*_*/langlinks (ll_lang, ll_title);
-CREATE TABLE /*_*/iwlinks (
- iwl_from int unsigned NOT NULL default 0,
- iwl_prefix varbinary(20) NOT NULL default '',
- iwl_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/iwl_from ON /*_*/iwlinks (iwl_from, iwl_prefix, iwl_title);
-CREATE UNIQUE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
-CREATE TABLE /*_*/site_stats (
- ss_row_id int unsigned NOT NULL,
- ss_total_views bigint unsigned default 0,
- ss_total_edits bigint unsigned default 0,
- ss_good_articles bigint unsigned default 0,
- ss_total_pages bigint default '-1',
- ss_users bigint default '-1',
- ss_active_users bigint default '-1',
- ss_admins int default '-1',
- ss_images int default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id);
-CREATE TABLE /*_*/hitcounter (
- hc_id int unsigned NOT NULL
-) ENGINE=HEAP MAX_ROWS=25000;
-CREATE TABLE /*_*/ipblocks (
- ipb_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- ipb_address tinyblob NOT NULL,
- ipb_user int unsigned NOT NULL default 0,
- ipb_by int unsigned NOT NULL default 0,
- ipb_by_text varchar(255) binary NOT NULL default '',
- ipb_reason tinyblob NOT NULL,
- ipb_timestamp binary(14) NOT NULL default '',
- ipb_auto bool NOT NULL default 0,
- ipb_anon_only bool NOT NULL default 0,
- ipb_create_account bool NOT NULL default 1,
- ipb_enable_autoblock bool NOT NULL default '1',
- ipb_expiry varbinary(14) NOT NULL default '',
- ipb_range_start tinyblob NOT NULL,
- ipb_range_end tinyblob NOT NULL,
- ipb_deleted bool NOT NULL default 0,
- ipb_block_email bool NOT NULL default 0,
- ipb_allow_usertalk bool NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only);
-CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
-CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
-CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
-CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
-CREATE TABLE /*_*/image (
- img_name varchar(255) binary NOT NULL default '' PRIMARY KEY,
- img_size int unsigned NOT NULL default 0,
- img_width int NOT NULL default 0,
- img_height int NOT NULL default 0,
- img_metadata mediumblob NOT NULL,
- img_bits int NOT NULL default 0,
- img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
- img_minor_mime varbinary(100) NOT NULL default "unknown",
- img_description tinyblob NOT NULL,
- img_user int unsigned NOT NULL default 0,
- img_user_text varchar(255) binary NOT NULL,
- img_timestamp varbinary(14) NOT NULL default '',
- img_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
-CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
-CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
-CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1);
-CREATE TABLE /*_*/oldimage (
- oi_name varchar(255) binary NOT NULL default '',
- oi_archive_name varchar(255) binary NOT NULL default '',
- oi_size int unsigned NOT NULL default 0,
- oi_width int NOT NULL default 0,
- oi_height int NOT NULL default 0,
- oi_bits int NOT NULL default 0,
- oi_description tinyblob NOT NULL,
- oi_user int unsigned NOT NULL default 0,
- oi_user_text varchar(255) binary NOT NULL,
- oi_timestamp binary(14) NOT NULL default '',
- oi_metadata mediumblob NOT NULL,
- oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
- oi_minor_mime varbinary(100) NOT NULL default "unknown",
- oi_deleted tinyint unsigned NOT NULL default 0,
- oi_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
-CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
-CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name(14));
-CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1);
-CREATE TABLE /*_*/filearchive (
- fa_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- fa_name varchar(255) binary NOT NULL default '',
- fa_archive_name varchar(255) binary default '',
- fa_storage_group varbinary(16),
- fa_storage_key varbinary(64) default '',
- fa_deleted_user int,
- fa_deleted_timestamp binary(14) default '',
- fa_deleted_reason text,
- fa_size int unsigned default 0,
- fa_width int default 0,
- fa_height int default 0,
- fa_metadata mediumblob,
- fa_bits int default 0,
- fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") default "unknown",
- fa_minor_mime varbinary(100) default "unknown",
- fa_description tinyblob,
- fa_user int unsigned default 0,
- fa_user_text varchar(255) binary,
- fa_timestamp binary(14) default '',
- fa_deleted tinyint unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);
-CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);
-CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
-CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
-CREATE TABLE /*_*/uploadstash (
- us_id int unsigned NOT NULL PRIMARY KEY auto_increment,
- us_user int unsigned NOT NULL,
- us_key varchar(255) NOT NULL,
- us_orig_path varchar(255) NOT NULL,
- us_path varchar(255) NOT NULL,
- us_source_type varchar(50),
- us_timestamp varbinary(14) not null,
- us_status varchar(50) not null,
- us_size int unsigned NOT NULL,
- us_sha1 varchar(31) NOT NULL,
- us_mime varchar(255),
- us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
- us_image_width int unsigned,
- us_image_height int unsigned,
- us_image_bits smallint unsigned
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/us_user ON /*_*/uploadstash (us_user);
-CREATE UNIQUE INDEX /*i*/us_key ON /*_*/uploadstash (us_key);
-CREATE INDEX /*i*/us_timestamp ON /*_*/uploadstash (us_timestamp);
-CREATE TABLE /*_*/recentchanges (
- rc_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- rc_timestamp varbinary(14) NOT NULL default '',
- rc_cur_time varbinary(14) NOT NULL default '',
- rc_user int unsigned NOT NULL default 0,
- rc_user_text varchar(255) binary NOT NULL,
- rc_namespace int NOT NULL default 0,
- rc_title varchar(255) binary NOT NULL default '',
- rc_comment varchar(255) binary NOT NULL default '',
- rc_minor tinyint unsigned NOT NULL default 0,
- rc_bot tinyint unsigned NOT NULL default 0,
- rc_new tinyint unsigned NOT NULL default 0,
- rc_cur_id int unsigned NOT NULL default 0,
- rc_this_oldid int unsigned NOT NULL default 0,
- rc_last_oldid int unsigned NOT NULL default 0,
- rc_type tinyint unsigned NOT NULL default 0,
- rc_moved_to_ns tinyint unsigned NOT NULL default 0,
- rc_moved_to_title varchar(255) binary NOT NULL default '',
- rc_patrolled tinyint unsigned NOT NULL default 0,
- rc_ip varbinary(40) NOT NULL default '',
- rc_old_len int,
- rc_new_len int,
- rc_deleted tinyint unsigned NOT NULL default 0,
- rc_logid int unsigned NOT NULL default 0,
- rc_log_type varbinary(255) NULL default NULL,
- rc_log_action varbinary(255) NULL default NULL,
- rc_params blob NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp);
-CREATE INDEX /*i*/rc_namespace_title ON /*_*/recentchanges (rc_namespace, rc_title);
-CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id);
-CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp);
-CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip);
-CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text);
-CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp);
-CREATE TABLE /*_*/watchlist (
- wl_user int unsigned NOT NULL,
- wl_namespace int NOT NULL default 0,
- wl_title varchar(255) binary NOT NULL default '',
- wl_notificationtimestamp varbinary(14)
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/wl_user ON /*_*/watchlist (wl_user, wl_namespace, wl_title);
-CREATE INDEX /*i*/namespace_title ON /*_*/watchlist (wl_namespace, wl_title);
-CREATE TABLE /*_*/searchindex (
- si_page int unsigned NOT NULL,
- si_title varchar(255) NOT NULL default '',
- si_text mediumtext NOT NULL
-) ENGINE=MyISAM;
-CREATE UNIQUE INDEX /*i*/si_page ON /*_*/searchindex (si_page);
-CREATE FULLTEXT INDEX /*i*/si_title ON /*_*/searchindex (si_title);
-CREATE FULLTEXT INDEX /*i*/si_text ON /*_*/searchindex (si_text);
-CREATE TABLE /*_*/interwiki (
- iw_prefix varchar(32) NOT NULL,
- iw_url blob NOT NULL,
- iw_api blob NOT NULL,
- iw_wikiid varchar(64) NOT NULL,
- iw_local bool NOT NULL,
- iw_trans tinyint NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/iw_prefix ON /*_*/interwiki (iw_prefix);
-CREATE TABLE /*_*/querycache (
- qc_type varbinary(32) NOT NULL,
- qc_value int unsigned NOT NULL default 0,
- qc_namespace int NOT NULL default 0,
- qc_title varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/qc_type ON /*_*/querycache (qc_type,qc_value);
-CREATE TABLE /*_*/objectcache (
- keyname varbinary(255) NOT NULL default '' PRIMARY KEY,
- value mediumblob,
- exptime datetime
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/exptime ON /*_*/objectcache (exptime);
-CREATE TABLE /*_*/transcache (
- tc_url varbinary(255) NOT NULL,
- tc_contents text,
- tc_time binary(14) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/tc_url_idx ON /*_*/transcache (tc_url);
-CREATE TABLE /*_*/logging (
- log_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- log_type varbinary(32) NOT NULL default '',
- log_action varbinary(32) NOT NULL default '',
- log_timestamp binary(14) NOT NULL default '19700101000000',
- log_user int unsigned NOT NULL default 0,
- log_user_text varchar(255) binary NOT NULL default '',
- log_namespace int NOT NULL default 0,
- log_title varchar(255) binary NOT NULL default '',
- log_page int unsigned NULL,
- log_comment varchar(255) NOT NULL default '',
- log_params blob NOT NULL,
- log_deleted tinyint unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/type_time ON /*_*/logging (log_type, log_timestamp);
-CREATE INDEX /*i*/user_time ON /*_*/logging (log_user, log_timestamp);
-CREATE INDEX /*i*/page_time ON /*_*/logging (log_namespace, log_title, log_timestamp);
-CREATE INDEX /*i*/times ON /*_*/logging (log_timestamp);
-CREATE INDEX /*i*/log_user_type_time ON /*_*/logging (log_user, log_type, log_timestamp);
-CREATE INDEX /*i*/log_page_id_time ON /*_*/logging (log_page,log_timestamp);
-CREATE TABLE /*_*/log_search (
- ls_field varbinary(32) NOT NULL,
- ls_value varchar(255) NOT NULL,
- ls_log_id int unsigned NOT NULL default 0
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/ls_field_val ON /*_*/log_search (ls_field,ls_value,ls_log_id);
-CREATE INDEX /*i*/ls_log_id ON /*_*/log_search (ls_log_id);
-CREATE TABLE /*_*/trackbacks (
- tb_id int PRIMARY KEY AUTO_INCREMENT,
- tb_page int REFERENCES /*_*/page(page_id) ON DELETE CASCADE,
- tb_title varchar(255) NOT NULL,
- tb_url blob NOT NULL,
- tb_ex text,
- tb_name varchar(255)
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/tb_page ON /*_*/trackbacks (tb_page);
-CREATE TABLE /*_*/job (
- job_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
- job_cmd varbinary(60) NOT NULL default '',
- job_namespace int NOT NULL,
- job_title varchar(255) binary NOT NULL,
- job_params blob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/job_cmd ON /*_*/job (job_cmd, job_namespace, job_title, job_params(128));
-CREATE TABLE /*_*/querycache_info (
- qci_type varbinary(32) NOT NULL default '',
- qci_timestamp binary(14) NOT NULL default '19700101000000'
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/qci_type ON /*_*/querycache_info (qci_type);
-CREATE TABLE /*_*/redirect (
- rd_from int unsigned NOT NULL default 0 PRIMARY KEY,
- rd_namespace int NOT NULL default 0,
- rd_title varchar(255) binary NOT NULL default '',
- rd_interwiki varchar(32) default NULL,
- rd_fragment varchar(255) binary default NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/rd_ns_title ON /*_*/redirect (rd_namespace,rd_title,rd_from);
-CREATE TABLE /*_*/querycachetwo (
- qcc_type varbinary(32) NOT NULL,
- qcc_value int unsigned NOT NULL default 0,
- qcc_namespace int NOT NULL default 0,
- qcc_title varchar(255) binary NOT NULL default '',
- qcc_namespacetwo int NOT NULL default 0,
- qcc_titletwo varchar(255) binary NOT NULL default ''
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/qcc_type ON /*_*/querycachetwo (qcc_type,qcc_value);
-CREATE INDEX /*i*/qcc_title ON /*_*/querycachetwo (qcc_type,qcc_namespace,qcc_title);
-CREATE INDEX /*i*/qcc_titletwo ON /*_*/querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
-CREATE TABLE /*_*/page_restrictions (
- pr_page int NOT NULL,
- pr_type varbinary(60) NOT NULL,
- pr_level varbinary(60) NOT NULL,
- pr_cascade tinyint NOT NULL,
- pr_user int NULL,
- pr_expiry varbinary(14) NULL,
- pr_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pr_pagetype ON /*_*/page_restrictions (pr_page,pr_type);
-CREATE INDEX /*i*/pr_typelevel ON /*_*/page_restrictions (pr_type,pr_level);
-CREATE INDEX /*i*/pr_level ON /*_*/page_restrictions (pr_level);
-CREATE INDEX /*i*/pr_cascade ON /*_*/page_restrictions (pr_cascade);
-CREATE TABLE /*_*/protected_titles (
- pt_namespace int NOT NULL,
- pt_title varchar(255) binary NOT NULL,
- pt_user int unsigned NOT NULL,
- pt_reason tinyblob,
- pt_timestamp binary(14) NOT NULL,
- pt_expiry varbinary(14) NOT NULL default '',
- pt_create_perm varbinary(60) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pt_namespace_title ON /*_*/protected_titles (pt_namespace,pt_title);
-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
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props (pp_page,pp_propname);
-CREATE TABLE /*_*/updatelog (
- ul_key varchar(255) NOT NULL PRIMARY KEY,
- ul_value blob
-) /*$wgDBTableOptions*/;
-CREATE TABLE /*_*/change_tag (
- ct_rc_id int NULL,
- ct_log_id int NULL,
- ct_rev_id int NULL,
- ct_tag varchar(255) NOT NULL,
- ct_params blob NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag (ct_rc_id,ct_tag);
-CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag);
-CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag);
-CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
-CREATE TABLE /*_*/tag_summary (
- ts_rc_id int NULL,
- ts_log_id int NULL,
- ts_rev_id int NULL,
- ts_tags blob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
-CREATE TABLE /*_*/valid_tag (
- vt_tag varchar(255) NOT NULL PRIMARY KEY
-) /*$wgDBTableOptions*/;
-CREATE TABLE /*_*/l10n_cache (
- lc_lang varbinary(32) NOT NULL,
- lc_key varchar(255) NOT NULL,
- lc_value mediumblob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key);
-CREATE TABLE /*_*/msg_resource (
- mr_resource varbinary(255) NOT NULL,
- mr_lang varbinary(32) NOT NULL,
- mr_blob mediumblob NOT NULL,
- mr_timestamp binary(14) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/mr_resource_lang ON /*_*/msg_resource (mr_resource, mr_lang);
-CREATE TABLE /*_*/msg_resource_links (
- mrl_resource varbinary(255) NOT NULL,
- mrl_message varbinary(255) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/mrl_message_resource ON /*_*/msg_resource_links (mrl_message, mrl_resource);
-CREATE TABLE /*_*/module_deps (
- md_module varbinary(255) NOT NULL,
- md_skin varbinary(32) NOT NULL,
- md_deps mediumblob NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/md_module_skin ON /*_*/module_deps (md_module, md_skin);
-
diff --git a/tests/phpunit/data/media/1bit-png.png b/tests/phpunit/data/media/1bit-png.png
deleted file mode 100644
index 254e403a..00000000
--- a/tests/phpunit/data/media/1bit-png.png
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/80x60-2layers.xcf b/tests/phpunit/data/media/80x60-2layers.xcf
deleted file mode 100644
index c51e980c..00000000
--- a/tests/phpunit/data/media/80x60-2layers.xcf
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/80x60-Greyscale.xcf b/tests/phpunit/data/media/80x60-Greyscale.xcf
deleted file mode 100644
index 84bf3e67..00000000
--- a/tests/phpunit/data/media/80x60-Greyscale.xcf
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/80x60-RGB.xcf b/tests/phpunit/data/media/80x60-RGB.xcf
deleted file mode 100644
index 1d58f16d..00000000
--- a/tests/phpunit/data/media/80x60-RGB.xcf
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/Animated_PNG_example_bouncing_beach_ball.png b/tests/phpunit/data/media/Animated_PNG_example_bouncing_beach_ball.png
deleted file mode 100644
index c2f45d90..00000000
--- a/tests/phpunit/data/media/Animated_PNG_example_bouncing_beach_ball.png
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/Gtk-media-play-ltr.svg b/tests/phpunit/data/media/Gtk-media-play-ltr.svg
deleted file mode 100644
index fc22338a..00000000
--- a/tests/phpunit/data/media/Gtk-media-play-ltr.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
- <!ATTLIST svg
- xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink">
-]>
-<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" version="1" x="0.00000000" y="0.00000000" width="60.0000000" height="60.0000000" viewBox="0 0 256 256" id="svg548">
- <defs id="defs572"/>
- <g style="font-size:12;stroke:#000000;" id="Layer_1">
- <path d="M 256 256 L 0 256 L 0 0 L 256 0 L 256 256 z " style="fill:none;stroke:none;" id="path550"/>
- </g>
- <g style="font-size:12;stroke:#000000;" id="Layer_2">
- <path d="M 35.159 8.29 C 32.18 10.01 30.329 13.216 30.329 16.656 L 30.329 245.539 C 30.329 248.978 32.179 252.184 35.158 253.902 C 38.138 255.623 41.839 255.623 44.817 253.904 L 243.037 139.463 C 246.016 137.742 247.867 134.537 247.867 131.098 C 247.867 127.658 246.016 124.452 243.037 122.731 L 44.818 8.29 C 41.839 6.57 38.138 6.57 35.159 8.29 z " style="opacity:0.2;stroke:none;" id="path552"/>
- <path d="M 27.314 2.29 C 24.335 4.01 22.484 7.216 22.484 10.656 L 22.484 239.538 C 22.484 242.977 24.335 246.184 27.313 247.903 C 30.293 249.623 33.994 249.623 36.973 247.905 L 235.193 133.464 C 238.172 131.742 240.023 128.536 240.023 125.098 C 240.023 121.658 238.172 118.452 235.193 116.732 L 36.975 2.29 C 33.996 0.57 30.294 0.57 27.314 2.29 z " style="fill:#003399;stroke:none;" id="path553"/>
- <path d="M 29.247 5.636 C 27.454 6.672 26.349 8.585 26.349 10.656 L 26.349 239.538 C 26.349 241.608 27.453 243.521 29.247 244.558 C 31.04 245.592 33.249 245.592 35.042 244.558 L 233.261 130.117 C 235.054 129.081 236.159 127.169 236.159 125.098 C 236.159 123.027 235.054 121.114 233.261 120.078 L 35.042 5.636 C 33.25 4.601 31.041 4.601 29.247 5.636 z " style="fill:#003399;stroke:none;" id="path554"/>
- <path d="M 32.145 10.656 L 230.364 125.097 L 32.145 239.538 L 32.145 10.656 z " style="fill:#3399ff;stroke:none;" id="path555"/>
- <linearGradient x1="109.971703" y1="8.70849991" x2="109.971703" y2="107.238800" id="XMLID_1_" gradientUnits="userSpaceOnUse" spreadMethod="pad">
- <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0.00000000" id="stop557"/>
- <stop style="stop-color:#3399ff;stop-opacity:1;" offset="1.00000000" id="stop558"/>
- <a:midPointStop offset="0" style="stop-color:#FFFFFF" id="midPointStop559"/>
- <a:midPointStop offset="0.5" style="stop-color:#FFFFFF" id="midPointStop560"/>
- <a:midPointStop offset="1" style="stop-color:#3399FF" id="midPointStop561"/>
- </linearGradient>
- <path d="M 32.145 141.057 C 36.775 141.258 41.456 141.368 46.183 141.368 C 105.41 141.368 157.526 125.124 187.799 100.524 L 32.145 10.656 L 32.145 141.057 z " style="fill:url(#XMLID_1_);stroke:none;" id="path562"/>
- <linearGradient x1="109.972198" y1="264.875000" x2="109.972198" y2="145.249298" id="XMLID_2_" gradientUnits="userSpaceOnUse" spreadMethod="pad">
- <stop style="stop-color:#ccffff;stop-opacity:1;" offset="0.00000000" id="stop564"/>
- <stop style="stop-color:#3399ff;stop-opacity:1;" offset="1.00000000" id="stop565"/>
- <a:midPointStop offset="0" style="stop-color:#CCFFFF" id="midPointStop566"/>
- <a:midPointStop offset="0.5" style="stop-color:#CCFFFF" id="midPointStop567"/>
- <a:midPointStop offset="1" style="stop-color:#3399FF" id="midPointStop568"/>
- </linearGradient>
- <path d="M 32.145 108.517 C 36.775 108.315 41.456 108.206 46.183 108.206 C 105.41 108.206 157.526 124.451 187.799 149.05 L 32.145 238.916 L 32.145 108.517 z " style="fill:url(#XMLID_2_);stroke:none;" id="path569"/>
- <path d="M 37.145 19.316 C 36.526 19.673 36.145 20.334 36.145 21.048 L 36.145 162.69 C 36.145 163.768 36.999 198.629 38.077 198.667 C 39.154 198.703 40.41 48.03 48.066 40.375 C 55.722 32.72 212.492 122.951 213 122 C 213.507 121.049 186.703 104.509 185.77 103.97 L 39.145 19.316 C 38.526 18.959 37.764 18.959 37.145 19.316 z " style="opacity:0.5;fill:#ffffff;stroke:none;" id="path570"/>
- </g>
-</svg> \ No newline at end of file
diff --git a/tests/phpunit/data/media/Png-native-test.png b/tests/phpunit/data/media/Png-native-test.png
deleted file mode 100644
index a0b81ca9..00000000
--- a/tests/phpunit/data/media/Png-native-test.png
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/QA_icon.svg b/tests/phpunit/data/media/QA_icon.svg
deleted file mode 100644
index 6b5d86e4..00000000
--- a/tests/phpunit/data/media/QA_icon.svg
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg:svg xmlns:svg="http://www.w3.org/2000/svg" version="1.0" width="60" height="60" viewBox="0 0 128 128" id="svg548">
- <svg:defs id="defs601">
- <svg:linearGradient id="linearGradient2802">
- <svg:stop style="stop-color:#1d12aa;stop-opacity:1" offset="0" id="stop2804"/>
- <svg:stop style="stop-color:#8b12aa;stop-opacity:0" offset="1" id="stop2806"/>
- </svg:linearGradient>
- <svg:linearGradient id="linearGradient2812">
- <svg:stop style="stop-color:#1d25aa;stop-opacity:1" offset="0" id="stop2814"/>
- <svg:stop style="stop-color:#8b12aa;stop-opacity:0" offset="1" id="stop2816"/>
- </svg:linearGradient>
- <svg:marker refX="0" refY="0" orient="auto" style="overflow:visible" id="Arrow1Lstart">
- <svg:path d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z " transform="scale(0.8)" style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none" id="path2991"/>
- </svg:marker>
- <svg:linearGradient id="linearGradient4766">
- <svg:stop style="stop-color:#0447ff;stop-opacity:1" offset="0" id="stop4768"/>
- <svg:stop style="stop-color:#000000;stop-opacity:0" offset="1" id="stop4770"/>
- </svg:linearGradient>
- <svg:linearGradient x1="55.4272" y1="102.1953" x2="55.4272" y2="-7.1773" id="XMLID_1_" gradientUnits="userSpaceOnUse" gradientTransform="translate(0, -0.496766)" spreadMethod="pad">
- <svg:stop style="stop-color:#7c74ff;stop-opacity:1" offset="0" id="stop556"/>
- <svg:stop style="stop-color:#b3caff;stop-opacity:1" offset="0.41010001" id="stop557"/>
- <svg:stop style="stop-color:#dfeaff;stop-opacity:1" offset="0.8258" id="stop558"/>
- <svg:stop style="stop-color:#ffffff;stop-opacity:1" offset="1" id="stop559"/>
- <midPointStop offset="0" style="stop-color:#7C74FF" id="midPointStop560"/>
- <midPointStop offset="0.5" style="stop-color:#7C74FF" id="midPointStop561"/>
- <midPointStop offset="0.4101" style="stop-color:#B3CAFF" id="midPointStop562"/>
- <midPointStop offset="0.5" style="stop-color:#B3CAFF" id="midPointStop563"/>
- <midPointStop offset="0.8258" style="stop-color:#DFEAFF" id="midPointStop564"/>
- <midPointStop offset="0.5" style="stop-color:#DFEAFF" id="midPointStop565"/>
- <midPointStop offset="1" style="stop-color:#FFFFFF" id="midPointStop566"/>
- </svg:linearGradient>
- <svg:linearGradient x1="54.7607" y1="7.2758999" x2="54.7607" y2="57.487301" id="XMLID_2_" gradientUnits="userSpaceOnUse" spreadMethod="pad">
- <svg:stop style="stop-color:#ffffff;stop-opacity:1" offset="0" id="stop569"/>
- <svg:stop style="stop-color:#b3caff;stop-opacity:1" offset="1" id="stop570"/>
- <midPointStop offset="0" style="stop-color:#FFFFFF" id="midPointStop571"/>
- <midPointStop offset="0.5" style="stop-color:#FFFFFF" id="midPointStop572"/>
- <midPointStop offset="1" style="stop-color:#B3CAFF" id="midPointStop573"/>
- </svg:linearGradient>
- <svg:linearGradient x1="83.637703" y1="119.3457" x2="83.637703" y2="42.033901" id="XMLID_3_" gradientUnits="userSpaceOnUse" spreadMethod="pad">
- <svg:stop style="stop-color:#006dff;stop-opacity:1" offset="0" id="stop577"/>
- <svg:stop style="stop-color:#94caff;stop-opacity:1" offset="0.41010001" id="stop578"/>
- <svg:stop style="stop-color:#dcf0ff;stop-opacity:1" offset="0.8258" id="stop579"/>
- <svg:stop style="stop-color:#ffffff;stop-opacity:1" offset="1" id="stop580"/>
- <midPointStop offset="0" style="stop-color:#006DFF" id="midPointStop581"/>
- <midPointStop offset="0.5" style="stop-color:#006DFF" id="midPointStop582"/>
- <midPointStop offset="0.4101" style="stop-color:#94CAFF" id="midPointStop583"/>
- <midPointStop offset="0.5" style="stop-color:#94CAFF" id="midPointStop584"/>
- <midPointStop offset="0.8258" style="stop-color:#DCF0FF" id="midPointStop585"/>
- <midPointStop offset="0.5" style="stop-color:#DCF0FF" id="midPointStop586"/>
- <midPointStop offset="1" style="stop-color:#FFFFFF" id="midPointStop587"/>
- </svg:linearGradient>
- <svg:linearGradient x1="265.11331" y1="52.250999" x2="265.11331" y2="87.743599" id="XMLID_4_" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-1, 0, 0, 1, 349, 0)" spreadMethod="pad">
- <svg:stop style="stop-color:#ffffff;stop-opacity:1" offset="0" id="stop590"/>
- <svg:stop style="stop-color:#94caff;stop-opacity:1" offset="1" id="stop591"/>
- <midPointStop offset="0" style="stop-color:#FFFFFF" id="midPointStop592"/>
- <midPointStop offset="0.5" style="stop-color:#FFFFFF" id="midPointStop593"/>
- <midPointStop offset="1" style="stop-color:#94CAFF" id="midPointStop594"/>
- </svg:linearGradient>
- </svg:defs>
- <svg:g style="font-size:12px;stroke:#000000" id="Layer_2">
- <svg:path d="M 128,128 L 0,128 L 0,0 L 128,0 L 128,128 z " style="fill:none;stroke:none" id="path550"/>
- </svg:g>
- <svg:g style="font-size:12px;stroke:#000000" id="Layer_1"/>
- <svg:path d="M 9.041,92.189 C 9.041,92.189 21.955,85.393 30.11,67.382 L 52.198,76.897 C 52.198,76.897 46.422,92.189 9.041,92.189 z " style="font-size:12px;fill:#00008d;stroke:none" id="path553"/>
- <svg:path d="M 1.905,49.712 C 1.905,70.733 25.867,87.773 55.427,87.773 C 84.987,87.773 108.949,70.733 108.949,49.712 C 108.949,28.692 84.987,11.651 55.427,11.651 C 25.867,11.651 1.905,28.692 1.905,49.712 z " style="font-size:12px;fill:#00008d;stroke:none" id="path554"/>
- <svg:path d="M 55.427,13.193234 C 27.039,13.193234 3.943,29.352234 3.943,49.214234 C 3.943,61.333234 12.55,72.067234 25.703,78.598234 C 22.202,83.521234 18.6,87.075234 15.722,89.464234 C 27.71,88.800234 35.664,86.388234 40.883,83.762234 C 45.498,84.716234 50.377,85.236234 55.427,85.236234 C 83.815,85.236234 106.91,69.077234 106.91,49.215234 C 106.91,29.353234 83.815,13.193234 55.427,13.193234 z " style="font-size:12px;fill:url(#XMLID_1_);stroke:none" id="path567"/>
- <svg:path d="M 12.999,35.282 C 30.044,44.81 49.474,47.149 69.356,41.962 C 73.46,40.821 77.627,39.436 81.656,38.096 C 86.51,36.482 91.504,34.846 96.524,33.573 C 88.559,23.302 72.888,16.748 55.428,16.748 C 37.091,16.749 20.396,24.128 12.999,35.282 z " style="font-size:12px;fill:url(#XMLID_2_);stroke:none" id="path574"/>
- <svg:text x="32.487015" y="68.006958" style="font-size:48px;font-style:normal;font-weight:bold;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Microsoft Sans Serif" id="text2303" xml:space="preserve"><svg:tspan x="32.487015" y="68.006958" style="font-size:64px;font-style:normal;font-weight:bold;fill:#000000;fill-opacity:1;font-family:sans" id="tspan2305">?</svg:tspan></svg:text>
- <svg:path d="M 42.401,82.248 C 42.401,98.96 60.9,112.557 83.638,112.557 C 86.794,112.557 90.053,112.231 93.329,111.651 C 98.255,113.817 104.317,115.142 111.437,115.538 L 126.095,116.35 L 114.798,106.972 C 114.067,106.367 113.056,105.441 111.922,104.237 C 120.165,98.531 124.875,90.66 124.875,82.25 C 124.875,65.538 106.376,51.942 83.637,51.942 C 60.9,51.94 42.401,65.536 42.401,82.248 z " style="font-size:12px;fill:#0032a4;stroke:none" id="path575"/>
- <svg:path d="M 44.823,82.248 C 44.823,97.624 62.236,110.133 83.637,110.133 C 87.009,110.133 90.357,109.784 93.616,109.163 C 98.327,111.368 104.334,112.717 111.571,113.118 L 118.9,113.524 L 113.251,108.835 C 111.96,107.763 110.162,106.071 108.268,103.754 C 117.176,98.487 122.454,90.629 122.454,82.248 C 122.454,66.871 105.042,54.363 83.639,54.363 C 62.236,54.363 44.823,66.871 44.823,82.248 z " style="font-size:12px;fill:url(#XMLID_3_);stroke:none" id="path588"/>
- <svg:path d="M 83.638,57.505 C 98.257,57.505 110.759,63.777 115.655,72.576 C 102.935,80.147 88.183,82.013 73.429,78.165 C 66.228,76.163 59.247,73.276 52.12,71.719 C 57.332,63.374 69.498,57.505 83.638,57.505 z " style="font-size:12px;fill:url(#XMLID_4_);stroke:none" id="path595"/>
- <svg:g transform="matrix(1.38561, 0, 0, 1.38561, -32.2514, -30.5491)" id="g4248">
- <svg:path d="M 103.21356 24.205935 A 24.311146 23.627199 0 1 1 54.591267,24.205935 A 24.311146 23.627199 0 1 1 103.21356 24.205935 z" transform="matrix(0.148134, 0, 0, 0.152972, 71.9504, 64.0705)" style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:6.64218044;stroke-linecap:square;marker-start:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="path3881"/>
- <svg:path d="M 87.539971,77.627004 C 87.539971,78.31674 87.591107,91.916423 87.60756,94.355578 C 87.61771,95.860439 89.879004,95.050778 90.026509,95.980703 C 90.2785,97.569343 86.888685,97.025111 86.718511,97.01762 C 85.743882,96.974724 82.425764,97.036144 81.376943,97.036144 C 81.101002,97.036144 77.578516,97.69007 77.314172,96.309196 C 77.071189,95.039902 79.49446,95.29146 79.833236,94.380195 C 81.070282,91.052684 81.154686,84.029315 80.322646,79.891188 C 79.902772,77.802954 76.928763,78.363984 77.263297,76.859643 C 77.479369,75.888015 78.579837,75.778912 79.35102,75.513942 C 81.049574,74.930337 83.123826,75.068206 84.579101,74.012707 C 86.187481,72.846162 87.539971,75.631913 87.539971,77.627004 z " style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99986994;stroke-linecap:square;marker-start:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" id="path4774"/>
- </svg:g>
-</svg:svg> \ No newline at end of file
diff --git a/tests/phpunit/data/media/README b/tests/phpunit/data/media/README
deleted file mode 100644
index fe3bc682..00000000
--- a/tests/phpunit/data/media/README
+++ /dev/null
@@ -1,38 +0,0 @@
-This directory contains media files for use with the
-tests in includes/media directory.
-
-Image credits:
-
-QA_icon.svg:
-http://es.wikipedia.org/wiki/Archivo:QA_icon.svg
-GNU Lesser General Public License
-~~helix84 (16.4.2007), Philverney (6.12.2005) David Vignoni
-
-Gtk-media-play-ltr.svg
-http://commons.wikimedia.org/wiki/File:Gtk-media-play-ltr.svg
-GNU Lesser General Public License
-http://ftp.gnome.org/pub/GNOME/sources/gnome-themes-extras/0.9/gnome-themes-extras-0.9.0.tar.gz
-David Vignoni
-
-US_states_by_total_state_tax_revenue.svg
-http://commons.wikimedia.org/wiki/File:US_states_by_total_state_tax_revenue.svg
-CC-BY 3.0
-TastyCakes on English Wikipedia
-
-greyscale-na-png.png, rgb-png.png, Xmp-exif-multilingual_test.jpg
-greyscale-png.png, 1bit-png.png, Png-native-test.png, rgb-na-png.png,
-test.tiff, test.jpg, jpeg-comment-multiple.jpg, jpeg-comment-utf.jpg,
-jpeg-comment-iso8859-1.jpg, jpeg-comment-binary.jpg, jpeg-xmp-psir.jpg,
-jpeg-xmp-alt.jpg, animated.gif, exif-user-comment.jpg, animated-xmp.gif,
-iptc-timetest-invalid.jpg, jpeg-iptc-bad-hash.jpg, iptc-timetest.jpg,
-xmp.png, nonanimated.gif, exif-gps.jpg, jpeg-xmp-psir.xmp, jpeg-iptc-good-hash.jpg,
-jpeg-padding-even.jpg, jpeg-padding-odd.jpg
-Are all by Bawolff. I don't think they contain enough originality to
-claim copyright, but on the off chance they do, feel free to use them
-however you feel fit, without restriction.
-
-Animated_PNG_example_bouncing_beach_ball.png
-http://commons.wikimedia.org/wiki/File:Animated_PNG_example_bouncing_beach_ball.png (originally http://www.treebuilder.de/default.asp?file=89031.xml )
-Public Domain
-Holger Will
-
diff --git a/tests/phpunit/data/media/Toll_Texas_1.svg b/tests/phpunit/data/media/Toll_Texas_1.svg
deleted file mode 100644
index 73004e3e..00000000
--- a/tests/phpunit/data/media/Toll_Texas_1.svg
+++ /dev/null
@@ -1,150 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_svg "http://www.w3.org/2000/svg">
- <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
-]>
-<svg version="1.1" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="385" height="385.0004883"
- viewBox="0 0 385 385.0004883" overflow="visible" enable-background="new 0 0 385 385.0004883" xml:space="preserve">
-<g>
- <g>
- <g>
- <path fill="#FFFFFF" d="M0.5,24.5c0-13.2548828,10.7451172-24,24-24h336c13.2548828,0,24,10.7451172,24,24v336.0004883
- c0,13.2548828-10.7451172,24-24,24h-336c-13.2548828,0-24-10.7451172-24-24V24.5L0.5,24.5z"/>
- <path fill="#FFFFFF" d="M192.5,192.5004883"/>
- </g>
- <g>
- <path fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="3.863693" d="M0.5,24.5
- c0-13.2548828,10.7451172-24,24-24h336c13.2548828,0,24,10.7451172,24,24v336.0004883c0,13.2548828-10.7451172,24-24,24h-336
- c-13.2548828,0-24-10.7451172-24-24V24.5L0.5,24.5z"/>
- <path fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="3.863693" d="
- M192.5,192.5004883"/>
- </g>
- </g>
- <g>
- <path fill="#003882" d="M24.5,0.5h336c13.2548828,0,24,10.7451172,24,24v232.0004883H0.5V24.5
- C0.5,11.2451172,11.2451172,0.5,24.5,0.5z"/>
- </g>
- <g>
- <path fill="#FFFFFF" d="M10.5,24.5c0-7.7319336,6.2680664-14,14-14h336c7.7324219,0,14,6.2680664,14,14v222.0004883h-364V24.5z"/>
- </g>
- <g>
- <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#003882" points="93.809082,348.2397461 91.6787109,347.8666992
- 89.5478516,347.7368164 85.2929688,347.7368164 83.1640625,347.8666992 78.9042969,348.6157227 76.7763672,349.1166992
- 72.7666016,350.3706055 70.7631836,351.246582 68.8837891,352.121582 67.0053711,353.1254883 65.1254883,354.253418
- 63.3740234,355.5063477 60.1210938,358.2602539 58.4926758,359.762207 57.1132813,361.2641602 55.7338867,362.8959961
- 54.3603516,364.6459961 21.2949219,301.3999023 21.168457,301.3999023 22.5478516,299.6469727 23.9248047,298.0200195
- 25.3022461,296.5180664 26.9296875,295.0141602 30.1875,292.2592773 31.9404297,291.0073242 33.8188477,289.8793945
- 35.6972656,288.8774414 37.5761719,288.0004883 39.5791016,287.1245117 43.5878906,285.8706055 45.7148438,285.3706055
- 49.9755859,284.6176758 52.1020508,284.4946289 56.3632813,284.4946289 58.4926758,284.6176758 60.6201172,284.9946289
- 60.6201172,284.8696289 "/>
- </g>
- <g>
- <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="32.8154297,319.559082 45.0898438,312.4233398
- 42.2080078,298.5209961 52.7299805,308.0375977 65.1254883,300.9008789 59.2421875,313.9243164 69.8867188,323.4428711
- 55.7338867,321.9389648 49.8476563,334.965332 46.9677734,321.0629883 "/>
- </g>
- <g>
- <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#B01C2E" points="132.0053711,306.6606445 148.5385742,338.2211914
- 147.4101563,339.7241211 146.1577148,341.2270508 144.9052734,342.6020508 143.5302734,343.9848633 142.1494141,345.2358398
- 140.6484375,346.4868164 139.2705078,347.6157227 137.765625,348.6157227 136.1381836,349.6176758 134.6357422,350.621582
- 133.0083008,351.3696289 131.3798828,352.246582 129.625,352.8745117 128,353.5024414 126.2441406,354.0004883
- 124.4921875,354.5043945 122.737793,354.8774414 120.9853516,355.1293945 117.4785156,355.3793945 113.9707031,355.3793945
- 112.09375,355.2543945 110.3408203,355.003418 108.5854492,354.6274414 106.9589844,354.253418 103.4501953,353.2485352
- 101.8232422,352.6254883 100.0688477,351.871582 98.4428711,351.1235352 96.9389648,350.1176758 95.3095703,349.2426758
- 93.809082,348.2397461 93.809082,348.1147461 93.809082,348.2397461 77.1523438,316.4282227 77.2753906,316.4282227
- 77.2753906,316.5551758 78.78125,317.5581055 80.4057617,318.4350586 81.9116211,319.4360352 83.5395508,320.1860352
- 85.2929688,320.9399414 86.9208984,321.5649414 90.4257813,322.5668945 92.0551758,322.9418945 93.809082,323.3188477
- 95.5620117,323.5688477 97.4423828,323.6948242 100.9462891,323.6948242 102.6992188,323.5688477 104.4521484,323.4428711
- 106.2060547,323.1928711 107.9609375,322.8168945 111.4682617,321.8168945 113.0947266,321.1889648 114.8481445,320.5639648
- 116.4765625,319.6879883 118.1035156,318.9350586 119.6083984,317.934082 121.2363281,316.9301758 122.737793,315.9282227
- 124.1152344,314.8012695 125.6196289,313.5483398 126.9960938,312.2983398 128.3759766,310.9194336 129.625,309.5424805
- 130.8789063,308.0375977 132.0053711,306.5366211 132.1328125,306.5366211 "/>
- </g>
- <g>
-
- <polyline fill="none" stroke="#003882" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="3.863693" points="
- 60.7441406,285.1196289 63,286.4956055 65.2529297,287.7485352 67.5068359,288.8774414 69.8867188,289.8793945
- 72.3916016,290.6313477 74.8955078,291.3813477 77.4008789,291.7583008 80.0302734,292.1333008 82.5366211,292.2592773
- 85.1655273,292.2592773 87.6708984,292.0083008 90.3022461,291.6313477 92.8066406,291.1313477 95.3095703,290.3793945
- 97.6904297,289.5024414 100.0688477,288.5004883 102.3256836,287.2504883 104.578125,285.8706055 106.7070313,284.4946289
- 108.7124023,282.8637695 110.5888672,281.1108398 112.3427734,279.2329102 114.0986328,277.2290039 115.5976563,275.1010742 "/>
- </g>
- <g>
-
- <line fill="none" stroke="#003882" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="3.863693" x1="115.4746094" y1="275.1010742" x2="131.8793945" y2="306.2836914"/>
- </g>
- <g>
- <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#003882" points="215.1650391,349.1166992 213.1601563,348.2397461
- 211.2832031,347.237793 207.7773438,344.7329102 206.1503906,343.2319336 204.6435547,341.7270508 203.2685547,340.0991211
- 202.0166016,338.347168 200.8867188,336.5942383 199.8857422,334.590332 199.0097656,332.7114258 198.2578125,330.7075195
- 197.6328125,328.5776367 197.1289063,326.5756836 196.7548828,324.4458008 196.6318359,322.3168945 196.6318359,320.0629883
- 196.7548828,317.934082 197.0058594,315.8041992 197.3818359,313.6743164 198.6357422,309.6665039 199.5107422,307.6635742
- 200.5126953,305.7827148 201.6386719,303.9067383 202.890625,302.152832 204.2685547,300.3989258 205.6464844,298.8969727
- 207.2744141,297.3920898 208.9023438,296.0161133 210.6572266,294.887207 212.5361328,293.7602539 214.4130859,292.7602539
- 216.4179688,291.8833008 218.5449219,291.0073242 220.6767578,290.2543945 222.9306641,289.6274414 227.4384766,288.8774414
- 229.6933594,288.6254883 231.9482422,288.5004883 234.2011719,288.5004883 236.4541016,288.6254883 238.7119141,288.8774414
- 240.9638672,289.253418 243.21875,289.7543945 245.3476563,290.3793945 247.6025391,291.1313477 249.6054688,292.0083008
- 251.7363281,293.0083008 251.7363281,292.8852539 253.6132813,294.137207 255.4931641,295.5151367 257.2460938,297.0161133
- 258.8740234,298.6459961 260.5019531,300.3989258 261.8808594,302.277832 263.1328125,304.1577148 264.2578125,306.2836914
- 266.0117188,310.543457 266.6386719,312.7983398 267.390625,317.3051758 267.5136719,319.6879883 267.390625,321.9418945
- 267.265625,324.3188477 266.2626953,328.8286133 265.5117188,330.9575195 264.6347656,333.2114258 263.6318359,335.2163086
- 262.5058594,337.2192383 261.1298828,339.0981445 259.625,340.9770508 258.1240234,342.6020508 256.3701172,344.1079102
- 254.4902344,345.6098633 252.6142578,346.8618164 250.609375,347.9926758 248.4785156,348.9926758 246.3496094,349.8696289
- 244.2216797,350.621582 242.0927734,351.246582 239.8359375,351.7485352 237.5830078,352.121582 235.3291016,352.3754883
- 232.9501953,352.4985352 230.6933594,352.4985352 228.4414063,352.3754883 226.1865234,352.121582 223.9296875,351.7485352
- 221.6777344,351.246582 219.421875,350.746582 217.2949219,349.9946289 "/>
- </g>
- <g>
- <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="219.9238281,303.6547852 221.9287109,301.5258789
- 224.4335938,299.8999023 227.1904297,298.8969727 230.1943359,298.2700195 233.0742188,298.3959961 235.9550781,299.0219727
- 238.7119141,300.2739258 241.0898438,301.9018555 243.0957031,304.1577148 244.5957031,306.5366211 245.9746094,308.9145508
- 246.9765625,311.4204102 247.8535156,314.0512695 248.4785156,316.8051758 248.8535156,319.559082 248.9804688,322.3168945
- 248.9804688,325.0727539 248.6035156,327.8256836 248.1035156,330.5805664 247.3496094,333.2114258 246.3496094,335.7172852
- 244.9726563,337.8442383 243.34375,339.6000977 241.3408203,341.1020508 239.2109375,342.355957 236.8330078,343.2319336
- 234.4511719,343.6049805 231.9482422,343.7319336 229.4414063,343.3579102 227.1904297,342.6020508 224.9326172,341.4770508
- 222.9306641,340.0991211 221.1757813,338.347168 219.6748047,336.3422852 218.5449219,334.2114258 217.7949219,331.8334961
- 217.0449219,329.7036133 216.0419922,325.4477539 215.7910156,323.1928711 215.6660156,320.9399414 215.6660156,318.684082
- 215.9169922,316.4282227 216.1669922,314.300293 216.6679688,312.0454102 217.2949219,309.918457 218.0458984,307.7895508
- 218.9208984,305.7827148 219.9238281,303.7817383 "/>
- </g>
- <g>
- <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#003882" points="150.4169922,290.0063477 196.3789063,289.7543945
- 192.7470703,304.4067383 192.6220703,304.5307617 192.1210938,303.7817383 191.4960938,303.1567383 190.8681641,302.5288086
- 190.1162109,302.027832 189.2421875,301.652832 188.4887695,301.2768555 187.6113281,301.0258789 186.7353516,300.7758789
- 179.9741211,300.7758789 179.8481445,345.1098633 179.8481445,345.2358398 180.0966797,346.1118164 180.3486328,347.1157227
- 180.7246094,347.9926758 181.1005859,348.7407227 181.6015625,349.6176758 182.8549805,351.1235352 183.6054688,351.7485352
- 158.5556641,351.7485352 158.5556641,351.871582 159.3095703,351.246582 160.0595703,350.4956055 160.6845703,349.7426758
- 161.1875,348.9926758 161.6879883,347.9926758 161.9384766,347.1157227 162.1894531,346.1118164 162.3144531,345.1098633
- 162.4375,300.9008789 156.5527344,300.9008789 155.1767578,301.0258789 153.9248047,301.2768555 152.671875,301.5258789
- 151.4204102,301.9018555 150.1660156,302.4008789 148.9135742,303.0297852 146.6601563,304.2797852 146.6601563,304.4067383 "/>
- </g>
- <g>
- <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#003882" points="275.7822266,344.3598633 276.03125,298.1450195
- 275.90625,297.769043 275.90625,297.894043 275.7822266,296.7661133 275.5302734,295.7670898 275.15625,294.6391602
- 274.7792969,293.637207 272.8984375,291.0073242 272.0234375,290.2543945 272.1484375,290.2543945 297.4492188,290.1313477
- 296.4453125,290.8803711 295.5683594,291.6313477 294.6904297,292.5083008 294.0673828,293.5102539 293.5644531,294.6391602
- 293.1904297,295.7670898 293.0644531,297.0161133 293.0644531,298.2700195 293.0644531,298.1450195 293.1904297,298.1450195
- 293.0644531,340.7260742 292.9394531,340.7260742 294.8183594,341.3540039 296.8222656,341.8540039 298.7011719,342.1040039
- 300.7050781,342.355957 302.7070313,342.4799805 304.5878906,342.355957 306.5917969,342.2299805 308.46875,341.8540039
- 311.4746094,340.7260742 312.4765625,340.2231445 313.3535156,339.7241211 314.3535156,339.2241211 316.109375,337.972168
- 311.8505859,351.621582 271.3984375,351.7485352 272.3994141,351.1235352 273.2753906,350.3706055 274.0292969,349.6176758
- 275.2802734,347.6157227 275.53125,346.4868164 275.7822266,345.4858398 275.90625,344.2348633 "/>
- </g>
- <g>
- <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#003882" points="327.5058594,344.3598633 327.7539063,298.1450195
- 327.6308594,297.769043 327.6308594,297.894043 327.5058594,296.7661133 327.2539063,295.7670898 326.8769531,294.6391602
- 326.5029297,293.637207 324.6259766,291.0073242 323.7480469,290.2543945 323.8740234,290.2543945 349.171875,290.1313477
- 348.1708984,290.8803711 347.2929688,291.6313477 346.4179688,292.5083008 345.7890625,293.5102539 345.2871094,294.6391602
- 344.9121094,295.7670898 344.7890625,297.0161133 344.7890625,298.2700195 344.7890625,298.1450195 344.9121094,298.1450195
- 344.7890625,340.7260742 344.6640625,340.7260742 346.5410156,341.3540039 348.5458984,341.8540039 350.4238281,342.1040039
- 352.4277344,342.355957 354.4316406,342.4799805 356.3105469,342.355957 358.3144531,342.2299805 360.1933594,341.8540039
- 361.1933594,341.4770508 363.1992188,340.7260742 364.2011719,340.2231445 365.078125,339.7241211 366.0820313,339.2241211
- 367.8320313,337.972168 363.5751953,351.621582 323.1220703,351.7485352 324.125,351.1235352 325.0019531,350.3706055
- 325.7519531,349.6176758 327.0058594,347.6157227 327.2539063,346.4868164 327.5058594,345.4858398 327.6308594,344.2348633 "/>
- </g>
-</g>
-<path fill-rule="evenodd" clip-rule="evenodd" fill="#003882" d="M188.4228516,211.0395508V89.7011719h-23.2304688V66.4711914
- c7.4140625-0.3291016,13.8393555-2.3886719,19.2763672-6.1782227c5.4365234-3.7890625,9.3085938-8.7314453,11.6152344-14.8276367
- h23.7236328v165.5742188H188.4228516z"/>
-</svg>
diff --git a/tests/phpunit/data/media/US_states_by_total_state_tax_revenue.svg b/tests/phpunit/data/media/US_states_by_total_state_tax_revenue.svg
deleted file mode 100644
index 9afea859..00000000
--- a/tests/phpunit/data/media/US_states_by_total_state_tax_revenue.svg
+++ /dev/null
@@ -1,248 +0,0 @@
-<ns0:svg height="592.78998" id="svg2275" version="1.0" width="958.69" ns1:docbase="C:\Users\Adam\Desktop" ns1:docname="Blank_US_Map_with_borders.svg" ns1:version="0.32" ns2:output_extension="org.inkscape.output.svg.inkscape" ns2:version="0.46" xmlns:ns0="http://www.w3.org/2000/svg" xmlns:ns1="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:ns2="http://www.inkscape.org/namespaces/inkscape">
- <ns0:metadata id="metadata2625">
- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
- <ns4:Work rdf:about="" xmlns:ns4="http://creativecommons.org/ns#">
- <ns5:format xmlns:ns5="http://purl.org/dc/elements/1.1/">image/svg+xml</ns5:format>
- <ns5:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" xmlns:ns5="http://purl.org/dc/elements/1.1/" />
- </ns4:Work>
- </rdf:RDF>
- </ns0:metadata>
- <ns0:defs id="defs2623">
- <ns2:perspective id="perspective226" ns1:type="inkscape:persp3d" ns2:persp3d-origin="479.345 : 197.59666 : 1" ns2:vp_x="0 : 296.39499 : 1" ns2:vp_y="0 : 1000 : 0" ns2:vp_z="958.69 : 296.39499 : 1" />
- </ns0:defs>
- <ns1:namedview bordercolor="#666666" borderopacity="1.0" gridtolerance="10.0" guidetolerance="10.0" id="base" objecttolerance="10.0" pagecolor="#ffffff" showgrid="false" ns2:current-layer="svg2275" ns2:cx="479.345" ns2:cy="299.1307" ns2:pageopacity="0.0" ns2:pageshadow="2" ns2:window-height="820" ns2:window-width="1440" ns2:window-x="-8" ns2:window-y="-8" ns2:zoom="0.99941554" />
- <ns0:path d="M 798.49579,591.98217 L 799.73403,593.07468 L 802.54072,590.88965 L 807.98899,586.51962 L 811.78627,582.48573 L 814.3453,575.59451 L 815.3359,573.82969 L 815.501,570.30004 L 814.75805,570.80427 L 813.76746,573.74564 L 812.28156,578.53588 L 808.97958,583.99844 L 804.52191,588.36847 L 801.05483,590.38542 L 798.49579,591.98217 z M 784.71002,597.19259 L 787.18651,596.52028 L 788.5073,596.26817 L 789.99319,593.83102 L 792.38713,592.15024 L 793.70792,592.65448 L 795.44146,592.99063 L 795.8542,594.08315 L 792.30458,595.34374 L 788.012,596.85644 L 785.61807,598.11703 L 784.71002,597.19259 z M 657.3254,482.07418 L 660.96585,481.47149 L 667.07449,479.28647 L 673.18314,478.78224 L 677.6408,478.10993 L 685.40042,479.95879 L 693.65535,483.99266 L 695.30633,485.50536 L 698.2781,486.6819 L 699.92909,488.69884 L 700.25929,491.55616 L 703.56126,490.21154 L 707.52362,490.21154 L 711.15578,488.1946 L 714.95305,484.49689 L 718.08992,484.66497 L 718.58522,483.48842 L 717.75972,482.47995 L 717.92482,480.46302 L 722.05228,479.62263 L 724.69386,479.62263 L 727.66563,481.13533 L 731.95819,482.64803 L 734.43467,486.51382 L 737.24134,487.52229 L 738.39703,491.05193 L 741.8641,492.73271 L 743.51508,495.42195 L 745.49627,496.09427 L 750.77942,497.43889 L 752.1002,500.63237 L 755.23708,504.49816 L 755.23708,514.41476 L 753.75119,519.28902 L 754.08139,522.14634 L 755.40217,527.18868 L 757.21826,531.39063 L 758.04375,530.8864 L 759.52964,526.18021 L 756.88806,525.17175 L 756.55786,524.49943 L 758.20885,523.82712 L 762.83161,524.83559 L 762.9967,526.51637 L 759.69473,532.23102 L 757.54845,534.75219 L 761.18062,538.61798 L 763.8222,541.81146 L 766.79397,547.35803 L 769.76574,551.3919 L 771.91202,556.60232 L 773.7281,556.93847 L 775.37909,554.75346 L 777.19517,555.93001 L 779.83675,560.13195 L 780.49714,563.82967 L 783.63401,568.36777 L 784.4595,567.02315 L 788.42187,567.3593 L 792.05403,569.7124 L 795.5211,575.09089 L 796.34659,578.62053 L 796.67679,581.64593 L 797.83248,582.6544 L 799.15327,583.15863 L 801.62975,582.15016 L 803.11563,580.46938 L 807.078,580.3013 L 810.21487,578.7886 L 813.02154,575.42704 L 812.52624,573.41011 L 812.19605,570.88894 L 812.85644,568.87201 L 812.52624,566.85507 L 815.00272,565.51045 L 815.33292,561.98081 L 814.67252,560.13195 L 814.17723,547.69419 L 812.85644,539.79453 L 808.23368,531.22255 L 804.60152,525.17175 L 801.95994,519.62517 L 798.98817,516.59977 L 796.0164,508.86819 L 796.84189,507.52356 L 797.99758,506.17894 L 796.34659,503.15354 L 792.21913,499.28775 L 787.26618,493.5731 L 783.46891,487.01806 L 778.02066,477.26954 L 774.21165,467.14054 L 771.56179,458.12552" id="FL_Gulf" style="fill:#cccccc;fill-opacity:0;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 772.07835,458.61245 L 774.21165,467.14054 L 778.02066,477.26954 L 783.46891,487.01806 L 787.26618,493.5731 L 792.21913,499.28775 L 796.34659,503.15354 L 797.99758,506.17894 L 796.84189,507.52356 L 796.0164,508.86819 L 798.98817,516.59977 L 801.95994,519.62517 L 804.60152,525.17175 L 808.23368,531.22255 L 812.85644,539.79453 L 814.17723,547.69419 L 814.67252,560.13195 L 815.33292,561.98081 L 815.00272,565.51045 L 812.52624,566.85507 L 812.85644,568.87201 L 812.19605,570.88894 L 812.52624,573.41011 L 813.02154,575.42704 L 810.21487,578.7886 L 807.078,580.3013 L 803.11563,580.46938 L 801.62975,582.15016 L 799.15327,583.15863 L 797.83248,582.6544 L 796.67679,581.64593 L 796.34659,578.62053 L 795.5211,575.09089 L 792.05403,569.7124 L 788.42187,567.3593 L 784.4595,567.02315 L 783.63401,568.36777 L 780.49714,563.82967 L 779.83675,560.13195 L 777.19517,555.93001 L 775.37909,554.75346 L 773.7281,556.93847 L 771.91202,556.60232 L 769.76574,551.3919 L 766.79397,547.35803 L 763.8222,541.81146 L 761.18062,538.61798 L 757.54845,534.75219 L 759.69473,532.23102 L 762.9967,526.51637 L 762.83161,524.83559 L 758.20885,523.82712 L 756.55786,524.49943 L 756.88806,525.17175 L 759.52964,526.18021 L 758.04375,530.8864 L 757.21826,531.39063 L 755.40217,527.18868 L 754.08139,522.14634 L 753.75119,519.28902 L 755.23708,514.41476 L 755.23708,504.49816 L 752.1002,500.63237 L 750.77942,497.43889 L 745.49627,496.09427 L 743.51508,495.42195 L 741.8641,492.73271 L 738.39703,491.05193 L 737.24134,487.52229 L 734.43467,486.51382 L 731.95819,482.64803 L 727.66563,481.13533 L 724.69386,479.62263 L 722.05228,479.62263 L 717.92482,480.46302 L 717.75972,482.47995 L 718.58522,483.48842 L 718.08992,484.66497 L 714.95305,484.49689 L 711.15578,488.1946 L 707.52362,490.21154 L 703.56126,490.21154 L 700.25929,491.55616 L 699.92909,488.69884 L 698.2781,486.6819 L 695.30633,485.50536 L 693.65535,483.99266 L 685.40042,479.95879 L 677.6408,478.10993 L 673.18314,478.78224 L 667.07449,479.28647 L 660.96585,481.47149 L 657.41261,482.10878 L 657.16963,473.73948 L 654.52806,471.72255 L 652.71197,469.87369 L 653.04217,466.6802 L 663.44338,465.33558 L 689.52898,462.31017 L 696.46313,461.63786 L 702.73688,461.46977 L 705.37846,465.50365 L 706.86434,467.01635 L 714.95419,467.18443 L 726.00404,466.51212 L 747.97393,465.1675 L 753.53546,464.46636 L 758.21005,464.49519 L 758.37515,467.52059 L 761.01673,468.36098 L 761.34692,463.82287 L 759.69594,459.11668 L 760.85163,457.4359 L 766.79518,458.27629 L 772.07835,458.61245 z M 784.71002,597.19259 L 787.18651,596.52028 L 788.5073,596.26817 L 789.99319,593.83102 L 792.38713,592.15024 L 793.70792,592.65448 L 795.44146,592.99063 L 795.8542,594.08315 L 792.30458,595.34374 L 788.012,596.85644 L 785.61807,598.11703 L 784.71002,597.19259 z M 798.49579,591.98217 L 799.73403,593.07468 L 802.54072,590.88965 L 807.98899,586.51962 L 811.78627,582.48573 L 814.3453,575.59451 L 815.3359,573.82969 L 815.501,570.30004 L 814.75805,570.80427 L 813.76746,573.74564 L 812.28156,578.53588 L 808.97958,583.99844 L 804.52191,588.36847 L 801.05483,590.38542 L 798.49579,591.98217 z " id="FL" style="fill:#501616" />
- <ns0:path d="M 777.85557,425.66962 L 776.04071,426.6776 L 773.39913,425.33297 L 772.73874,423.14795 L 771.41795,419.45024 L 769.10656,417.26521 L 766.46499,416.5929 L 764.814,411.55057 L 762.00732,405.33167 L 757.71476,403.31473 L 755.56847,401.29779 L 754.24768,398.60854 L 752.1014,396.5916 L 749.79002,395.24697 L 747.47863,392.22157 L 744.34176,389.86848 L 739.71899,388.01961 L 739.2237,386.50691 L 736.74722,383.48151 L 736.25192,381.9688 L 732.78485,376.5903 L 729.31778,376.75838 L 725.19031,374.2372 L 723.86952,372.89258 L 723.53932,371.04372 L 724.36481,369.02679 L 726.67619,368.01831 L 726.346,365.8333 L 732.61975,363.14405 L 741.86527,358.43786 L 749.29471,357.59747 L 766.13479,357.09323 L 768.44617,359.11017 L 770.09715,362.47174 L 774.55482,361.9675 L 787.43252,360.45479 L 790.4043,361.29519 L 803.282,369.19486 L 813.60504,377.63896 L 808.06859,383.31398 L 805.42701,389.70094 L 804.93171,396.25598 L 803.28073,397.09637 L 802.12504,399.95369 L 799.64856,400.62601 L 797.50228,404.32372 L 794.69561,407.18104 L 792.38423,410.71068 L 790.73325,411.55107 L 787.10108,415.08071 L 784.12931,415.24879 L 785.1199,418.61034 L 780.00185,424.32499 L 777.85557,425.66962 z " id="SC" style="fill:#e9afaf" />
- <ns0:path d="M 704.71806,368.52255 L 699.7651,369.36294 L 691.17997,370.53949 L 682.42974,371.46391 L 682.42974,373.73297 L 682.59484,375.91799 L 683.25523,379.44763 L 686.72231,387.68346 L 689.19879,397.93623 L 690.68467,404.3232 L 692.33566,409.36554 L 693.82155,416.5929 L 695.96784,423.14795 L 698.60941,426.6776 L 699.10471,430.20724 L 701.0859,431.04763 L 701.251,433.23265 L 699.4349,438.27499 L 698.93961,441.63656 L 698.77451,443.65349 L 700.4255,448.19161 L 700.7557,453.73818 L 699.9302,456.25936 L 700.5906,457.09975 L 702.07649,457.94014 L 702.73688,461.46977 L 705.37846,465.50365 L 706.86434,467.01635 L 714.95419,467.18443 L 726.00404,466.51212 L 747.97393,465.1675 L 753.53546,464.46636 L 758.21005,464.49519 L 758.37515,467.52059 L 761.01673,468.36098 L 761.34692,463.82287 L 759.69594,459.11668 L 760.85163,457.4359 L 766.79518,458.27629 L 771.87844,458.60669 L 771.08653,452.05785 L 773.39791,441.63702 L 774.88379,437.26699 L 774.3885,434.57775 L 778.51596,427.3504 L 777.90454,425.66937 L 776.04071,426.6776 L 773.39913,425.33297 L 772.73874,423.14795 L 771.41795,419.45024 L 769.10656,417.26521 L 766.46499,416.5929 L 764.814,411.55057 L 762.00732,405.33167 L 757.71476,403.31473 L 755.56847,401.29779 L 754.24768,398.60854 L 752.1014,396.5916 L 749.79002,395.24697 L 747.47863,392.22157 L 744.34176,389.86848 L 739.71899,388.01961 L 739.2237,386.50691 L 736.74722,383.48151 L 736.25192,381.9688 L 732.78485,376.5903 L 729.31778,376.75838 L 725.19031,374.2372 L 723.86952,372.89258 L 723.53932,371.04372 L 724.36481,369.02679 L 726.67619,368.01831 L 726.51109,365.64481 L 724.69501,366.16945 L 718.75146,367.17792 L 711.65221,368.01831 L 704.71806,368.52255 z " id="GA" style="fill:#d35f5f" />
- <ns0:path d="M 639.33795,481.63956 L 637.68799,465.83981 L 634.88131,446.34274 L 635.04641,431.71994 L 635.8719,399.44893 L 635.7068,382.13688 L 635.87539,375.46299 L 643.79664,375.07759 L 672.19362,372.38834 L 682.58068,371.46391 L 682.42974,373.73297 L 682.59484,375.91799 L 683.25523,379.44763 L 686.72231,387.68346 L 689.19879,397.93623 L 690.68467,404.3232 L 692.33566,409.36554 L 693.82155,416.5929 L 695.96784,423.14795 L 698.60941,426.6776 L 699.10471,430.20724 L 701.0859,431.04763 L 701.251,433.23265 L 699.4349,438.27499 L 698.93961,441.63656 L 698.77451,443.65349 L 700.4255,448.19161 L 700.7557,453.73818 L 699.9302,456.25936 L 700.5906,457.09975 L 702.07649,457.94014 L 702.90198,461.63786 L 696.46313,461.63786 L 689.52898,462.31017 L 663.44338,465.33558 L 653.04217,466.6802 L 652.71197,469.87369 L 654.52806,471.72255 L 657.16963,473.73948 L 657.76284,481.98993 L 651.05994,484.66497 L 648.25327,484.32881 L 651.05994,482.31188 L 651.05994,481.30341 L 647.92307,475.08453 L 645.61169,474.41221 L 644.12581,478.95032 L 642.80502,481.80764 L 642.14462,481.63956 L 639.33795,481.63956 z " id="AL" style="fill:#e9afaf" />
- <ns0:path d="M 850.23842,306.65958 L 851.98478,311.54471 L 855.61694,318.26782 L 858.09342,320.78899 L 858.75382,323.14208 L 856.27734,323.31016 L 857.10283,323.98247 L 856.77263,328.3525 L 854.13106,329.69712 L 853.47066,331.88214 L 852.14988,334.90754 L 848.35261,336.58832 L 845.87614,336.25216 L 844.39025,336.08408 L 842.73926,334.73946 L 843.06946,336.08408 L 843.06946,337.09255 L 845.05064,337.09255 L 845.87614,338.43717 L 843.89495,344.99221 L 848.18751,344.99221 L 848.84791,346.67299 L 851.15929,344.3199 L 852.48007,343.81567 L 850.49889,347.51338 L 847.36202,352.55572 L 846.04123,352.55572 L 844.88554,352.05149 L 842.07887,352.7238 L 836.79572,355.24497 L 830.19178,360.79154 L 826.72471,365.6658 L 824.74353,372.38892 L 824.24824,374.91008 L 819.46038,375.41432 L 813.43993,377.723 L 803.282,369.19486 L 790.4043,361.29519 L 787.43252,360.45479 L 774.55482,361.9675 L 770.09715,362.47174 L 768.44617,359.11017 L 766.13479,357.09323 L 749.29471,357.59747 L 741.86527,358.43786 L 732.61975,363.14405 L 726.346,365.8333 L 724.69501,366.16945 L 718.75146,367.17792 L 711.65221,368.01831 L 704.71806,368.52255 L 705.04826,363.4802 L 706.86434,361.9675 L 709.67103,361.29519 L 710.33142,357.42939 L 714.62399,354.57206 L 718.58636,353.05935 L 722.87893,349.36164 L 727.33659,347.17662 L 727.99698,343.98313 L 731.95935,339.94926 L 732.61975,339.78119 C 732.61975,339.78119 732.61975,340.95773 733.44524,340.95773 C 734.27073,340.95773 735.42643,341.29389 735.42643,341.29389 L 737.73781,337.59616 L 739.88409,336.92385 L 742.19547,337.26001 L 743.84646,333.56229 L 746.81824,330.87303 L 747.31353,328.68802 L 747.31353,324.57011 L 751.9363,325.32646 L 759.22415,323.98183 L 775.38031,321.96489 L 792.88078,319.27565 L 813.92151,315.35219 L 833.49506,311.37597 L 845.21707,308.35056 L 850.23842,306.65958 z M 854.21672,340.95692 L 856.85831,338.3517 L 860.07773,335.66244 L 861.64617,334.99013 L 861.81127,332.88915 L 861.15088,326.50217 L 859.66499,324.06503 L 859.00459,322.13213 L 859.74753,321.88001 L 862.55422,327.59468 L 862.96697,332.21684 L 862.80187,335.74649 L 859.33479,337.34323 L 856.44555,339.86441 L 855.28987,341.125 L 854.21672,340.95692 z " id="NC" style="fill:#c83737" />
- <ns0:path d="M 712.3126,329.69649 L 659.31592,334.90691 L 643.2212,336.75577 L 638.50172,337.28883 L 634.55111,337.26001 L 634.55111,341.29389 L 625.96598,341.79812 L 618.86673,342.47043 L 607.53473,342.52544 L 607.26436,348.59252 L 605.08072,355.11718 L 604.06449,358.25292 L 602.68706,362.80789 L 602.35687,365.49714 L 598.22939,367.85023 L 599.71528,371.54796 L 598.72469,376.08606 L 597.15628,377.85089 L 605.49374,377.76685 L 630.09345,375.74991 L 635.54175,375.58184 L 643.79664,375.07759 L 672.19362,372.38834 L 682.58068,371.54796 L 691.17997,370.53949 L 699.7651,369.36294 L 704.71806,368.52255 L 705.04826,363.4802 L 706.86434,361.9675 L 709.67103,361.29519 L 710.33142,357.42939 L 714.62399,354.57206 L 718.58636,353.05935 L 722.87893,349.36164 L 727.33659,347.17662 L 727.99698,343.98313 L 731.95935,339.94926 L 732.61975,339.78119 C 732.61975,339.78119 732.61975,340.95773 733.44524,340.95773 C 734.27073,340.95773 735.42643,341.29389 735.42643,341.29389 L 737.73781,337.59616 L 739.88409,336.92385 L 742.19547,337.26001 L 743.84646,333.56229 L 746.81824,330.87303 L 747.31353,328.68802 L 747.49366,324.59981 L 745.16725,324.65414 L 742.69078,326.67109 L 734.60093,326.83916 L 722.3505,328.8153 L 712.3126,329.69649 z " id="TN" style="fill:#de8787" />
- <ns0:path d="M 893.09433,183.30123 L 892.6011,178.92994 L 891.77561,174.39182 L 890.04208,168.25697 L 895.90308,166.66023 L 897.55407,167.83677 L 901.02115,172.37489 L 903.99187,176.99768 L 901.01902,178.59507 L 899.69824,178.42699 L 898.54255,180.27585 L 896.06607,182.29279 L 893.09433,183.30123 z " id="RI" style="fill:#f4d7d7" />
- <ns0:path d="M 893.58963,183.30123 L 892.6011,178.92994 L 891.77561,174.39182 L 890.12463,168.17293 L 884.84146,169.34947 L 862.55312,174.30778 L 863.21351,177.75339 L 864.6994,185.31692 L 864.6994,193.72083 L 863.54371,196.07393 L 865.41508,198.26677 L 870.47581,194.73055 L 874.10797,191.36899 L 876.08916,189.18398 L 876.91465,189.85629 L 879.72132,188.34359 L 885.00447,187.16705 L 893.58963,183.30123 z " id="CT" style="fill:#de8787" />
- <ns0:path d="M 919.55232,177.09192 L 921.77043,176.37882 L 922.23741,174.59609 L 923.28809,174.71493 L 924.33877,177.09192 L 923.0546,177.56732 L 919.08535,177.68617 L 919.55232,177.09192 z M 909.97943,177.92387 L 912.31427,175.19033 L 913.94868,175.19033 L 915.81656,176.73537 L 913.36497,177.80501 L 911.14686,178.87466 L 909.97943,177.92387 z M 874.44023,155.06282 L 892.27091,150.69278 L 894.5823,150.02047 L 896.72858,146.65891 L 900.54482,144.92957 L 903.4955,149.51759 L 901.01902,154.89608 L 900.68883,156.40879 L 902.67001,159.09803 L 903.8257,158.25764 L 905.64178,158.25764 L 907.95316,160.94689 L 911.91552,167.16577 L 915.54769,167.67001 L 917.85907,166.66154 L 919.67515,164.81268 L 918.84966,161.95536 L 916.70338,160.27458 L 915.21749,161.11497 L 914.2269,159.77034 L 914.7222,159.26611 L 916.86848,159.09803 L 918.68456,159.93842 L 920.66574,162.45959 L 921.65633,165.48499 L 921.98653,168.00616 L 917.69397,169.51886 L 913.73161,171.5358 L 909.76924,176.24198 L 907.78806,177.75468 L 907.78806,176.74621 L 910.26454,175.23351 L 910.75983,173.38466 L 909.93434,170.19118 L 906.96257,171.70388 L 906.13708,173.21658 L 906.63237,175.56967 L 903.82678,177.08172 L 901.02115,172.37489 L 897.55407,167.83677 L 895.90308,166.66023 L 890.04208,168.25697 L 884.84146,169.34947 L 862.55312,174.30778 L 861.56253,168.34101 L 862.22292,157.33189 L 867.50608,156.40745 L 874.44023,155.06282" id="MA" style="fill:#c83737" />
- <ns0:path d="M 943.28423,76.73985 L 945.26541,78.924863 L 947.57679,82.790656 L 947.57679,84.807591 L 945.43051,89.68185 L 943.44933,90.354162 L 939.98226,93.547643 L 935.02931,99.262292 C 935.02931,99.262292 934.36891,99.262292 933.70852,99.262292 C 933.04813,99.262292 932.71793,97.077279 932.71793,97.077279 L 930.90185,97.245357 L 929.91126,98.758058 L 927.43478,100.27076 L 926.44419,101.78346 L 928.09517,103.29616 L 927.59988,103.96847 L 927.10458,106.8258 L 925.1234,106.65772 L 925.1234,104.97694 L 924.7932,103.63232 L 923.30732,103.96847 L 921.49123,100.60692 L 919.34495,101.95154 L 920.66574,103.46424 L 920.99594,104.64079 L 920.17045,105.98541 L 920.50064,109.17889 L 920.66574,110.85967 L 919.01476,113.54892 L 916.04298,114.05315 L 915.71279,117.07855 L 910.26454,120.27203 L 908.94375,120.77627 L 907.29277,119.26356 L 904.15589,122.96128 L 905.14649,126.32284 L 903.6606,127.66746 L 903.4955,132.20556 L 901.88477,140.12915 L 899.37016,138.9273 L 898.87486,135.73381 L 894.91249,134.55727 L 894.5823,131.69993 L 887.15284,107.32858 L 882.28553,91.967581 L 884.77927,91.608771 L 886.32526,92.034941 L 886.32526,89.345695 L 887.15075,83.631045 L 889.79233,78.756786 L 891.27821,74.554837 L 889.29703,72.033669 L 889.29703,65.814786 L 890.12252,64.806318 L 890.94802,61.948993 L 890.78292,60.436292 L 890.61782,55.393954 L 892.4339,50.351617 L 895.40568,41.107331 L 897.55196,36.737305 L 898.87274,36.737305 L 900.19353,36.905383 L 900.19353,38.081928 L 901.51432,40.435019 L 904.32099,41.107331 L 905.14649,40.266941 L 905.14649,39.258474 L 909.27395,36.233071 L 911.09003,34.384214 L 912.57592,34.552292 L 918.68456,37.073461 L 920.66574,38.081928 L 929.91126,69.176344 L 936.0199,69.176344 L 936.84539,71.193279 L 937.01049,76.235617 L 939.98226,78.588708 L 940.80775,78.588708 L 940.97285,78.084474 L 940.47756,76.907928 L 943.28423,76.73985 z M 921.90732,108.08415 L 923.47577,106.48741 L 924.87911,107.57992 L 925.45696,110.1011 L 923.72342,111.02553 L 921.90732,108.08415 z M 928.75894,101.94929 L 930.57502,103.88219 C 930.57502,103.88219 931.89582,103.96623 931.89582,103.63007 C 931.89582,103.29391 932.14346,101.52909 932.14346,101.52909 L 933.05151,100.6887 L 932.22602,98.839833 L 930.16228,99.596189 L 928.75894,101.94929 z " id="ME" style="fill:#f4d7d7" />
- <ns0:path d="M 900.54588,144.88986 L 900.85393,143.29871 L 901.96733,139.87704 L 899.37016,138.9273 L 898.87486,135.73381 L 894.91249,134.55727 L 894.5823,131.69993 L 887.15284,107.32858 L 882.45357,92.208279 L 881.5374,92.203019 L 880.87701,93.883799 L 880.21662,93.379565 L 879.22603,92.371097 L 877.74014,94.388032 L 876.76354,100.09176 L 877.08182,105.98396 L 879.063,108.84129 L 879.063,113.04325 L 875.26572,117.2452 L 872.62415,118.42176 L 872.62415,119.5983 L 873.77984,121.44716 L 873.77984,130.35531 L 872.95434,139.93577 L 872.78925,144.97812 L 873.77984,146.32275 L 873.61474,151.02894 L 873.11944,152.8778 L 874.60533,154.97877 L 892.27091,150.69278 L 894.5823,150.02047 L 896.72858,146.65891 L 900.54588,144.88986 z " id="NH" style="fill:#f4d7d7" />
- <ns0:path d="M 862.38802,157.584 L 861.56253,151.70126 L 858.42565,140.27193 L 857.76525,139.93577 L 854.79347,138.59115 L 855.61896,135.56574 L 854.79347,133.38072 L 852.1519,128.67453 L 853.14249,124.64065 L 852.31699,119.26214 L 849.84051,112.53901 L 849.0178,107.42109 L 876.75058,99.933872 L 877.08182,105.98396 L 879.063,108.84129 L 879.063,113.04325 L 875.26572,117.2452 L 872.62415,118.42176 L 872.62415,119.5983 L 873.77984,121.44716 L 873.77984,130.35531 L 872.95434,139.93577 L 872.78925,144.97812 L 873.77984,146.32275 L 873.61474,151.02894 L 873.11944,152.8778 L 874.60533,154.97877 L 867.50608,156.40745 L 862.38802,157.584 z " id="VT" style="fill:#f4d7d7" />
- <ns0:path d="M 846.20833,194.22506 L 845.05264,193.21659 L 842.41105,193.04851 L 840.09968,191.03158 L 837.62319,185.485 L 834.55471,184.51732 L 832.17493,182.29151 L 813.18856,186.49346 L 769.27227,195.56969 L 760.19184,197.08239 L 759.43798,189.88537 L 762.17121,188.00743 L 763.492,186.83089 L 764.48259,185.15011 L 766.29867,183.97356 L 768.27985,182.12471 L 768.77515,180.44393 L 770.92143,177.5866 L 772.07712,176.57814 L 771.91202,175.56967 L 770.59123,172.37619 L 768.77515,172.20811 L 766.79397,165.82115 L 769.76574,163.97229 L 774.2234,162.45959 L 778.35086,161.11497 L 781.65283,160.61073 L 788.09167,160.44266 L 790.07285,161.78728 L 791.72384,161.95536 L 793.87012,160.61073 L 796.51169,159.43419 L 801.79484,158.92995 L 803.94112,157.0811 L 805.75721,153.71954 L 807.40819,151.7026 L 809.55447,151.7026 L 811.53565,150.52606 L 811.70075,148.17297 L 810.21487,145.98795 L 809.88467,144.47525 L 811.04036,142.29024 L 811.04036,140.77754 L 809.22428,140.77754 L 807.40819,139.93715 L 806.5827,138.7606 L 806.4176,136.07136 L 812.36115,130.35671 L 813.02154,129.51632 L 814.50743,126.49092 L 817.4792,121.78473 L 820.28587,117.91894 L 822.43215,115.39777 L 824.89861,113.49969 L 828.0455,112.20429 L 833.65885,110.85967 L 836.96082,111.02775 L 841.58358,109.51505 L 849.30966,107.36166 L 849.84051,112.53901 L 852.31699,119.26214 L 853.14249,124.64065 L 852.1519,128.67453 L 854.79347,133.38072 L 855.61896,135.56574 L 854.79347,138.59115 L 857.76525,139.93577 L 858.42565,140.27193 L 861.56253,151.70126 L 862.05782,157.07976 L 861.56253,168.34101 L 862.38802,174.05567 L 863.21351,177.75339 L 864.6994,185.31692 L 864.6994,193.72083 L 863.54371,196.07393 L 865.42216,198.14582 L 865.19266,199.77289 L 863.21147,201.62175 L 863.54167,202.96637 L 864.86246,202.63021 L 866.34835,201.28559 L 868.65972,198.59634 L 869.81541,197.92403 L 871.4664,198.59634 L 873.77778,198.76442 L 881.8676,194.73055 L 884.83937,191.87323 L 886.16016,190.36053 L 890.45272,192.0413 L 886.98565,195.73902 L 883.02329,198.76442 L 875.75896,204.31099 L 873.11738,205.31946 L 867.17384,207.3364 L 863.04638,208.51294 L 861.49899,207.95886 L 860.90212,204.47784 L 861.39742,201.62051 L 861.23232,199.4355 L 858.59075,198.25894 L 853.96798,197.25047 L 850.0056,196.07393 L 846.20833,194.22506 z " id="NY" style="fill:#280b0b" />
- <ns0:path d="M 846.20833,194.22506 L 844.06205,196.74624 L 844.06205,199.93973 L 842.08086,203.13321 L 841.91576,204.814 L 843.23656,206.15862 L 843.07146,208.6798 L 840.76007,209.85635 L 841.58556,212.71367 L 841.75066,213.89023 L 844.55734,214.22639 L 845.54794,216.91563 L 849.18011,219.43681 L 851.65659,221.11759 L 851.65659,221.95798 L 848.35462,225.15147 L 846.70362,227.50456 L 845.21774,230.3619 L 842.90636,231.70652 L 841.66812,232.46288 L 841.42046,233.72347 L 840.79828,236.43369 L 841.91377,238.76697 L 845.21574,241.79237 L 850.1687,244.14546 L 854.29616,244.81777 L 854.46126,246.33047 L 853.63576,247.33894 L 853.96596,250.19627 L 854.79145,250.19627 L 856.93773,247.6751 L 857.76322,242.63276 L 860.5699,238.43081 L 863.70677,231.70769 L 864.86246,225.99305 L 864.20207,224.8165 L 864.03697,215.06798 L 862.38598,211.53834 L 861.23029,212.37873 L 858.42362,212.71489 L 857.92832,212.21066 L 859.08401,211.20219 L 861.23029,209.18525 L 861.29469,208.048 L 860.90212,204.47784 L 861.39742,201.62051 L 861.23232,199.4355 L 858.59075,198.25894 L 853.96798,197.25047 L 850.0056,196.07393 L 846.20833,194.22506 z " id="NJ" style="fill:#a02c2c" />
- <ns0:path d="M 841.75066,232.37883 L 842.90636,231.70652 L 845.21774,230.3619 L 846.70362,227.50456 L 848.35462,225.15147 L 851.65659,221.95798 L 851.65659,221.11759 L 849.18011,219.43681 L 845.54794,216.91563 L 844.55734,214.22639 L 841.75066,213.89023 L 841.58556,212.71367 L 840.76007,209.85635 L 843.07146,208.6798 L 843.23656,206.15862 L 841.91576,204.814 L 842.08086,203.13321 L 844.06205,199.93973 L 844.06205,196.74624 L 846.45598,194.22507 L 845.05264,193.21659 L 842.41105,193.04851 L 840.09968,191.03158 L 837.62319,185.485 L 834.55471,184.51732 L 832.17493,182.29151 L 813.18856,186.49346 L 769.27227,195.56969 L 760.19184,197.08239 L 759.68563,189.71729 L 754.08139,195.57094 L 752.7606,196.07518 L 748.46894,199.20351 L 751.4416,219.10066 L 753.16482,230.27806 L 756.81257,250.30417 L 761.54207,249.5232 L 773.73965,247.96108 L 812.47286,239.9916 L 827.66544,237.0562 L 836.14231,235.36944 L 837.45809,234.05962 L 839.60438,232.37883 L 841.75066,232.37883 z " id="PA" style="fill:#782121" />
- <ns0:path d="M 840.59298,235.90964 L 841.42046,233.72347 L 841.66812,232.37883 L 839.60438,232.37883 L 837.45809,234.05962 L 835.9722,235.57232 L 837.45809,239.94236 L 839.76948,245.8251 L 841.91576,255.9098 L 843.56675,262.46486 L 848.68482,262.29678 L 854.95755,261.03674 L 852.64517,253.38975 L 851.65458,253.89398 L 848.02242,251.37281 L 846.20633,246.49855 L 844.22515,242.80084 L 841.91377,241.79237 L 839.76749,238.09466 L 840.59298,235.90964 z " id="DE" style="fill:#f4d7d7" />
- <ns0:path d="M 854.95655,260.95325 L 848.68482,262.29678 L 843.56675,262.46486 L 841.91576,255.9098 L 839.76948,245.8251 L 837.45809,239.94236 L 836.14231,235.36944 L 827.66544,237.0562 L 812.47286,239.9916 L 774.22495,247.84224 L 775.38031,253.05285 L 776.37091,258.93558 L 776.7011,258.59942 L 778.84739,256.07825 L 781.15877,252.88476 L 783.63525,252.71668 L 785.12115,251.20398 L 786.93723,248.51473 L 788.25802,249.18705 L 791.22979,248.85089 L 793.87137,246.66588 L 795.92094,245.15492 L 797.80542,244.65068 L 799.48473,245.82549 L 802.45651,247.33819 L 804.43769,249.18705 L 805.67593,250.78379 L 809.88595,252.5486 L 809.88595,255.57402 L 815.49931,256.91864 L 817.48049,258.26326 L 818.47108,256.24633 L 820.78247,257.92711 L 819.29657,261.28868 L 818.96637,264.146 L 817.15029,266.83525 L 817.15029,269.02027 L 817.81068,270.86913 L 822.98233,272.27864 L 827.38511,272.21447 L 830.52198,273.22294 L 832.66826,273.5591 L 833.65885,271.37408 L 832.17296,269.18907 L 832.17296,267.34021 L 829.69649,265.1552 L 827.55021,259.44055 L 828.87099,253.89398 L 828.70589,251.70897 L 827.38511,250.36434 C 827.38511,250.36434 828.87099,248.68356 828.87099,248.01125 C 828.87099,247.33894 829.36629,245.82624 829.36629,245.82624 L 831.34747,244.48162 L 833.32865,242.80084 L 833.82395,243.8093 L 832.33806,245.49008 L 831.01727,249.35588 L 831.34747,250.53242 L 833.16355,250.86858 L 833.65885,256.58323 L 831.51257,257.59169 L 831.84277,261.28941 L 832.33806,261.12133 L 833.49375,259.1044 L 835.14473,260.95325 L 833.49375,262.29788 L 833.16355,265.82751 L 835.80513,269.35715 L 839.76749,269.86138 L 841.41848,269.02099 L 844.72045,274.39949 L 846.53653,274.90372 L 846.53653,278.60143 L 844.22515,283.64377 L 843.72986,290.87112 L 845.21574,294.40076 L 846.70163,294.56884 L 848.68281,290.19881 L 849.5083,286.5011 L 849.6734,279.10567 L 852.81027,274.06333 L 854.95655,266.83598 L 854.95655,260.95325 z M 838.20212,271.12031 L 839.3578,273.72552 L 839.5229,275.57439 L 840.67859,277.50729 C 840.67859,277.50729 841.58664,276.58285 841.58664,276.2467 C 841.58664,275.91054 840.8437,273.05321 840.8437,273.05321 L 840.10075,270.61606 L 838.20212,271.12031 z " id="MD" style="fill:#d35f5f" />
- <ns0:path d="M 822.59725,272.21447 L 827.38511,272.21447 L 830.52198,273.22294 L 832.66826,273.5591 L 833.65885,271.37408 L 832.17296,269.18907 L 832.17296,267.34021 L 829.69649,265.1552 L 827.55021,259.44055 L 828.87099,253.89398 L 828.70589,251.70897 L 827.38511,250.36434 C 827.38511,250.36434 828.87099,248.68356 828.87099,248.01125 C 828.87099,247.33894 829.36629,245.82624 829.36629,245.82624 L 831.34747,244.48162 L 833.32865,242.80084 L 833.82395,243.8093 L 832.33806,245.49008 L 831.01727,249.35588 L 831.34747,250.53242 L 833.16355,250.86858 L 833.65885,256.58323 L 831.51257,257.59169 L 831.84277,261.28941 L 832.33806,261.12133 L 833.49375,259.1044 L 835.14473,260.95325 L 833.49375,262.29788 L 833.16355,265.82751 L 835.80513,269.35715 L 839.76749,269.86138 L 841.41848,269.02099 L 844.72045,274.39949 L 846.53653,274.90372 L 846.53653,278.60143 L 844.22515,283.64377 L 843.72986,290.87112 L 845.21574,294.40076 L 846.70163,294.56884 L 848.68281,290.19881 L 849.5083,286.5011 L 849.6734,279.10567 L 852.81027,274.06333 L 854.95655,266.83598 L 854.95655,260.95325 M 838.20212,271.12031 L 839.3578,273.72552 L 839.5229,275.57439 L 840.67859,277.50729 C 840.67859,277.50729 841.58664,276.58285 841.58664,276.2467 C 841.58664,275.91054 840.8437,273.05321 840.8437,273.05321 L 840.10075,270.61606 L 838.20212,271.12031 z " id="MD_Atlantic" style="fill:#0000ff;fill-opacity:0;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 774.24466,247.91204 L 775.38031,253.05285 L 776.37091,258.93558 L 776.7011,258.59942 L 778.84739,256.07825 L 781.15877,252.88476 L 783.63525,252.71668 L 785.12115,251.20398 L 786.93723,248.51473 L 788.25802,249.18705 L 791.22979,248.85089 L 793.87137,246.66588 L 795.92094,245.15492 L 797.80542,244.65068 L 799.48473,245.82549 L 802.45651,247.33819 L 804.43769,249.18705 L 805.84103,250.53167 L 804.7679,255.7421 L 798.98943,252.5486 L 794.36667,250.69975 L 794.20157,256.24633 L 793.70628,258.43134 L 792.05529,261.28868 L 791.39489,262.96946 L 788.25802,265.49063 L 787.76272,267.84373 L 784.29564,268.17988 L 783.96545,271.37336 L 782.80976,277.08802 L 780.16818,277.08802 L 778.84739,276.24763 L 777.1964,273.3903 L 775.38031,273.55838 L 775.05012,278.09649 L 772.90384,284.9877 L 767.78577,296.24894 L 768.61127,297.59356 L 768.44617,300.45089 L 766.29989,302.46782 L 764.814,302.13167 L 761.51202,304.65285 L 758.87045,303.64438 L 757.05436,308.51864 C 757.05436,308.51864 753.25709,309.35903 752.59669,309.52711 C 751.9363,309.69518 750.12022,308.18248 750.12022,308.18248 L 747.64373,310.53557 L 745.00215,311.2079 L 742.03037,310.36749 L 740.70958,309.02287 L 738.47074,305.8795 L 735.26132,303.81246 L 732.61975,300.95512 L 729.64798,297.08933 L 728.98758,294.73623 L 726.346,293.22353 L 725.5205,291.54275 L 725.27285,286.0802 L 727.50168,285.99616 L 729.48288,285.15577 L 729.64798,282.29845 L 731.29896,280.78574 L 731.46406,275.57532 L 732.45465,271.54144 L 733.77544,270.86913 L 735.09623,272.04567 L 735.59153,273.89453 L 737.40761,272.88606 L 737.90291,271.20529 L 736.74722,269.35643 L 736.74722,266.83525 L 737.73781,265.49063 L 740.04919,261.96099 L 741.36998,260.44829 L 743.51627,260.95252 L 745.82765,259.27173 L 748.96452,255.7421 L 751.27591,251.70821 L 751.6061,245.82549 L 752.1014,240.61506 L 752.1014,235.74079 L 750.94571,232.54731 L 751.9363,231.0346 L 753.24707,229.68997 L 756.81257,250.30417 L 761.54207,249.5232 L 774.24466,247.91204 z " id="WV" style="fill:#f4d7d7" />
- <ns0:path d="M 738.61165,306.09768 L 735.42643,309.35903 L 731.13386,313.05675 L 726.51109,318.60333 L 724.69501,320.45219 L 724.69501,322.6372 L 720.73264,324.82222 L 714.95419,328.35186 L 712.28688,329.81359 L 659.31592,334.90691 L 643.2212,336.75577 L 638.50172,337.28883 L 634.55111,337.26001 L 634.55111,341.29389 L 625.96598,341.79812 L 618.86673,342.47043 L 608.21432,342.68419 L 609.24067,341.39196 L 611.46709,339.55999 L 613.56845,338.3715 L 613.80194,335.04372 L 614.73588,333.14213 L 613.09488,330.50244 L 613.91377,328.51994 L 616.22516,326.67109 L 618.37144,325.99877 L 621.17811,327.3434 L 624.81029,328.68802 L 625.96598,328.35186 L 626.13108,325.99877 L 624.81029,323.47759 L 625.14049,321.1245 L 627.12167,319.6118 L 629.76325,318.93949 L 631.41424,318.26718 L 630.58875,316.41831 L 629.92835,314.40138 L 631.08404,313.56099 L 632.15718,310.11537 L 635.2115,308.35056 L 641.15506,307.34209 L 644.78724,306.83786 L 646.27312,308.85479 L 648.08921,309.69518 L 649.90529,306.33362 L 652.87707,304.82092 L 654.85825,306.5017 L 655.68375,307.67825 L 657.83004,307.17401 L 657.66493,303.64438 L 660.63671,301.96359 L 661.7924,301.1232 L 662.94809,302.80398 L 667.73595,302.80398 L 668.56145,300.61896 L 668.23125,298.26587 L 671.20302,294.56815 L 675.99089,290.53428 L 676.48618,285.82809 L 679.29287,285.49193 L 683.25523,283.64307 L 686.06192,281.62613 L 685.73171,279.60919 L 684.24582,278.09649 L 684.82367,275.82744 L 689.03369,275.57532 L 691.51017,274.73493 L 694.48195,276.41571 L 696.13293,280.95382 L 702.07649,281.28997 L 703.89257,283.13884 L 706.03885,283.30692 L 708.51534,281.79422 L 711.65221,282.29845 L 712.973,283.81115 L 715.77968,281.12189 L 717.59577,279.77727 L 719.24675,279.77727 L 719.90714,282.63461 L 721.72324,283.64307 L 725.3554,285.82809 L 725.5205,291.54275 L 726.346,293.22353 L 728.98758,294.73623 L 729.64798,297.08933 L 732.61975,300.95512 L 735.26132,303.81246 L 738.61165,306.09768 z " id="KY" style="fill:#e9afaf" />
- <ns0:path d="M 748.46982,198.97029 L 741.20371,203.30253 L 737.24134,205.65562 L 733.77427,209.52141 L 729.64681,213.55528 L 726.34484,214.39567 L 723.37307,214.8999 L 717.75972,217.58915 L 715.61344,217.75723 L 712.14638,214.56375 L 706.86322,215.23606 L 704.22165,213.72336 L 701.78994,212.3189 L 696.79333,213.05024 L 686.39211,214.73102 L 678.46737,215.99161 L 679.78816,231.20268 L 681.60425,245.48932 L 684.24582,269.86066 L 684.82367,275.82744 L 689.03369,275.57532 L 691.51017,274.73493 L 694.48195,276.41571 L 696.13293,280.95382 L 702.07649,281.28997 L 703.89257,283.13884 L 706.03885,283.30692 L 708.51534,281.79422 L 711.65221,282.29845 L 712.973,283.81115 L 715.77968,281.12189 L 717.59577,279.77727 L 719.24675,279.77727 L 719.90714,282.63461 L 721.72324,283.64307 L 725.27285,286.0802 L 727.50168,285.99616 L 729.48288,285.15577 L 729.64798,282.29845 L 731.29896,280.78574 L 731.46406,275.57532 L 732.45465,271.54144 L 733.77544,270.86913 L 735.09623,272.04567 L 735.59153,273.89453 L 737.40761,272.88606 L 737.90291,271.20529 L 736.74722,269.35643 L 736.74722,266.83525 L 737.73781,265.49063 L 740.04919,261.96099 L 741.36998,260.44829 L 743.51627,260.95252 L 745.82765,259.27173 L 748.96452,255.7421 L 751.27591,251.70821 L 751.6061,245.82549 L 752.1014,240.61506 L 752.1014,235.74079 L 750.94571,232.54731 L 751.9363,231.0346 L 753.33994,230.27806 L 751.4416,219.10066 L 748.46982,198.97029 z " id="OH" style="fill:#c83737" />
- <ns0:path d="M 594.42414,81.655837 L 596.29202,79.516552 L 598.51013,78.684606 L 603.99703,74.643722 L 606.33188,74.049474 L 606.79885,74.524879 L 601.54544,79.873103 L 598.1599,81.893534 L 596.05854,82.844333 L 594.42414,81.655837 z M 682.43117,115.05941 L 683.09156,117.66462 L 686.39354,117.8327 L 687.71434,116.57211 C 687.71434,116.57211 687.63178,115.05941 687.30159,114.89133 C 686.97139,114.72326 685.6506,112.95843 685.6506,112.95843 L 683.42177,113.21054 L 681.77077,113.37862 L 681.44058,114.55518 L 682.43117,115.05941 z M 713.13697,180.61201 L 709.835,172.04003 L 707.52362,162.62767 L 705.04714,159.26611 L 702.40557,157.41725 L 700.75458,158.5938 L 696.79222,160.44266 L 694.81104,165.65307 L 692.00436,169.51886 L 690.84867,170.19118 L 689.36279,169.51886 C 689.36279,169.51886 686.72121,168.00616 686.88631,167.33385 C 687.05141,166.66154 687.38161,162.12343 687.38161,162.12343 L 690.84867,160.77881 L 691.67417,157.24918 L 692.33456,154.55993 L 694.81104,152.87915 L 694.48084,142.45832 L 692.82985,140.10523 L 691.50907,139.26484 L 690.68357,137.07982 L 691.50907,136.23943 L 693.16005,136.57559 L 693.32515,134.89481 L 690.84867,132.54172 L 689.52789,129.85247 L 686.88631,129.85247 L 682.26355,128.33977 L 676.6502,124.81014 L 673.84353,124.81014 L 673.18314,125.48245 L 672.19255,124.97821 L 669.05568,122.62512 L 666.0839,124.47398 L 663.11213,126.82707 L 663.44233,130.52479 L 664.43292,130.86094 L 666.5792,131.36518 L 667.07449,132.20556 L 664.43292,133.04595 L 661.79134,133.38211 L 660.30546,135.23097 L 659.97526,137.41598 L 660.30546,139.09676 L 660.63565,144.81141 L 657.00349,146.99642 L 656.34309,146.82834 L 656.34309,142.45832 L 657.66388,139.93715 L 658.32427,137.41598 L 657.49878,136.57559 L 655.5176,137.41598 L 654.52701,141.78601 L 651.72034,142.96255 L 649.90425,144.97949 L 649.73915,145.98795 L 650.39955,146.82834 L 649.73915,149.51759 L 647.42778,150.02182 L 647.42778,151.19837 L 648.25327,153.71954 L 647.09758,160.1065 L 645.44659,164.30845 L 646.10699,169.18271 L 646.60228,170.35925 L 645.77679,172.88042 L 645.44659,173.72081 L 645.1164,176.57814 L 648.74856,182.79702 L 651.72034,189.52014 L 653.20622,194.56247 L 652.38073,199.43673 L 651.39014,205.65562 L 648.91366,211.03411 L 648.58347,213.89143 L 645.43483,217.12572 L 644.67586,217.92491 L 649.40999,217.75643 L 671.86343,215.40333 L 678.13717,214.73102 L 678.46737,215.99161 L 686.39211,214.73102 L 696.79333,213.05024 L 702.12014,212.57103 L 700.75458,211.37027 L 700.91968,209.85756 L 703.06596,205.99177 L 705.10906,204.18493 L 704.88204,198.9325 L 706.51299,197.27212 L 707.62681,196.91556 L 707.85382,193.21785 L 709.42225,190.0664 L 710.49539,190.69668 L 710.66049,191.36899 L 711.48598,191.53707 L 713.46716,190.5286 L 713.13697,180.61201 z M 578.8376,112.43927 L 580.72799,111.3639 L 583.53467,110.52351 L 587.16683,108.17042 L 587.16683,107.16195 L 587.82723,106.48964 L 593.93587,105.48118 L 596.41235,103.46424 L 600.87001,101.27923 L 601.03511,99.934604 L 603.01629,96.909201 L 604.83237,96.068811 L 606.15316,94.219954 L 608.46454,91.866863 L 612.9222,89.345695 L 617.71005,88.841461 L 618.86574,90.018006 L 618.53554,91.026474 L 614.73828,92.034941 L 613.25239,95.228422 L 610.94101,96.068811 L 610.44572,98.58998 L 607.96924,101.95154 L 607.63904,104.64079 L 608.46454,105.14502 L 609.45513,103.96847 L 613.08729,100.94307 L 614.40808,102.28769 L 616.71946,102.28769 L 620.02143,103.29616 L 621.50732,104.47271 L 622.9932,107.66619 L 625.79988,110.52351 L 629.76224,110.35543 L 631.24813,109.34697 L 632.89911,110.69159 L 634.5501,111.19582 L 635.87088,110.35543 L 637.02657,110.35543 L 638.67756,109.34697 L 642.80502,105.64925 L 646.27209,104.47271 L 653.04112,104.13655 L 657.66388,102.11962 L 660.30546,100.77499 L 661.79134,100.94307 L 661.79134,106.8258 L 662.28664,107.16195 L 665.25841,108.00234 L 667.23959,107.49811 L 673.51333,105.81733 L 674.66902,104.64079 L 676.15491,105.14502 L 676.15491,112.37237 L 679.45688,115.56585 L 680.77767,116.23816 L 682.09845,117.24663 L 680.77767,117.58279 L 679.95217,117.24663 L 676.15491,116.7424 L 674.00863,117.41471 L 671.69725,117.24663 L 668.39528,118.75933 L 666.5792,118.75933 L 660.63565,117.41471 L 655.3525,117.58279 L 653.37132,120.27203 L 646.27209,120.94434 L 643.79561,121.78473 L 642.63992,124.97821 L 641.31913,126.15476 L 640.82384,125.98668 L 639.33795,124.3059 L 634.71519,126.82707 L 634.0548,126.82707 L 632.89911,125.14629 L 632.07362,125.31437 L 630.09244,129.85247 L 629.10185,134.05442 L 625.27363,142.51293 L 623.6083,141.31962 L 622.20739,139.89342 L 620.57299,129.197 L 616.83724,128.00851 L 615.43633,125.63153 L 602.59467,122.77914 L 600.02634,121.59066 L 591.62089,119.21367 L 583.21544,118.02518 L 578.8376,112.43927 z " id="MI" style="fill:#c83737" />
- <ns0:path d="M 363.20447,145.98954 L 351.44763,144.98362 L 318.67723,141.55738 L 302.09981,139.41809 L 273.14771,135.13952 L 252.83454,132.04945 L 251.38528,143.66906 L 247.4644,168.89268 L 242.09425,200.50655 L 240.53069,211.44019 L 238.82546,223.80098 L 245.48808,224.7662 L 262.73518,227.14318 L 271.75391,228.36645 L 292.76047,230.93187 L 330.81813,235.21041 L 355.80134,237.34972 L 360.23755,191.23625 L 361.87193,164.85174 L 363.20447,145.98954 z " id="WY" style="fill:#f4d7d7" />
- <ns0:path d="M 365.51098,123.96764 L 366.33647,111.87386 L 368.64299,85.935913 L 370.0439,70.247815 L 371.33142,55.452236 L 338.69364,52.032396 L 308.81082,48.334682 L 278.92799,44.132734 L 245.9083,38.586162 L 227.08707,35.056526 L 193.6675,27.848581 L 189.09322,50.043547 L 192.59549,57.887585 L 191.19458,62.64155 L 193.06246,67.395514 L 196.33125,68.821708 L 200.067,79.518133 L 203.80276,83.321298 L 204.26973,84.509794 L 207.772,85.698291 L 208.23897,87.837565 L 201.00095,106.14034 L 201.00095,108.75502 L 203.56928,112.08279 L 204.50321,112.08279 L 209.40639,108.99272 L 210.10685,107.80422 L 211.74124,108.51732 L 211.50775,113.98438 L 214.30957,127.05779 L 217.34487,129.67247 L 218.2788,130.38556 L 220.14668,132.76254 L 219.67972,136.32802 L 220.38017,139.89349 L 221.5476,140.84429 L 223.88244,138.4673 L 226.68426,138.4673 L 229.95305,140.13119 L 232.52138,139.1804 L 236.7241,139.1804 L 240.45985,140.84429 L 243.26167,140.36889 L 243.72864,137.27881 L 246.76394,136.56572 L 248.16485,137.99191 L 248.63182,141.31968 L 251.26853,143.90677 L 252.83454,132.04945 L 273.14771,135.13952 L 302.09981,139.41809 L 318.67723,141.55738 L 351.44763,144.98362 L 363.16317,146.23449 L 364.89307,129.69427 L 365.51098,123.96764 z " id="MT" style="fill:#f4d7d7" />
- <ns0:path d="M 144.08485,180.96023 L 148.93381,161.76187 L 153.37002,143.34026 L 154.77093,138.94284 L 157.33926,132.76269 L 156.0551,130.38571 L 153.48676,130.50455 L 152.66957,129.43491 L 153.13654,128.24642 L 153.48676,125.0375 L 158.03971,119.33273 L 159.90759,118.85734 L 161.07501,117.66885 L 161.65873,114.34107 L 162.59266,113.62798 L 166.5619,107.56668 L 170.53114,103.05041 L 170.76463,99.128389 L 167.26235,96.394856 L 165.91982,91.819167 L 166.32842,81.776422 L 170.06418,64.662142 L 174.61712,43.031605 L 178.46962,29.00742 L 179.24775,25.053259 L 193.6675,27.848581 L 189.09322,50.043547 L 192.59549,57.887585 L 191.19458,62.64155 L 193.06246,67.395514 L 196.33125,68.821708 L 200.067,79.518133 L 203.80276,83.321298 L 204.26973,84.509794 L 207.772,85.698291 L 208.23897,87.837565 L 201.00095,106.14034 L 201.00095,108.75502 L 203.56928,112.08279 L 204.50321,112.08279 L 209.40639,108.99272 L 210.10685,107.80422 L 211.74124,108.51732 L 211.50775,113.98438 L 214.30957,127.05779 L 217.34487,129.67247 L 218.2788,130.38556 L 220.14668,132.76254 L 219.67972,136.32802 L 220.38017,139.89349 L 221.5476,140.84429 L 223.88244,138.4673 L 226.68426,138.4673 L 229.95305,140.13119 L 232.52138,139.1804 L 236.7241,139.1804 L 240.45985,140.84429 L 243.26167,140.36889 L 243.72864,137.27881 L 246.76394,136.56572 L 248.16485,137.99191 L 248.63182,141.31968 L 251.31689,143.45897 L 247.4644,168.89268 L 242.21095,200.38777 L 237.30774,199.55589 L 228.78555,198.12969 L 218.27875,196.22811 L 206.02081,194.08882 L 193.0624,191.65242 L 184.89044,189.57255 L 175.43432,187.67098 L 165.51122,185.65054 L 144.08485,180.96023 z " id="ID" style="fill:#f4d7d7" />
- <ns0:path d="M 95.99889,2.9536428 L 100.45655,4.4663441 L 110.36246,7.3236687 L 119.11268,9.3406038 L 139.58489,15.223331 L 163.02887,21.106058 L 179.49525,24.969183 L 178.46962,29.00742 L 174.61712,43.031605 L 170.06418,64.662142 L 166.32842,81.776422 L 166.13328,91.861195 L 151.85237,88.313121 L 136.44238,84.628799 L 120.68217,84.747642 L 120.21521,83.321459 L 114.61157,85.460744 L 110.05862,84.866496 L 107.60703,83.202605 L 106.32286,83.915707 L 101.53644,83.678 L 99.785303,82.251817 L 94.415149,80.112532 L 93.597952,80.231386 L 89.161743,78.686338 L 87.177124,80.587926 L 80.873036,80.231386 L 74.802439,75.952816 L 75.50289,75.12087 L 75.736374,67.039124 L 73.401527,62.998262 L 69.198802,62.404014 L 68.498351,59.789335 L 66.094359,59.304248 L 64.13488,57.747045 L 62.318797,58.755513 L 60.007419,55.73011 L 60.337616,52.704708 L 63.14429,52.368552 L 64.795274,48.166604 L 62.153699,46.990058 L 62.318797,43.124266 L 66.776456,42.451954 L 63.969782,39.59463 L 62.483896,32.199201 L 63.14429,29.173799 L 63.14429,20.93798 L 61.328206,17.576422 L 63.639585,7.8279025 L 65.785865,8.3321363 L 68.262342,11.357539 L 71.069016,14.046786 L 74.370985,16.063721 L 78.993743,18.248734 L 82.130616,18.921045 L 85.102388,20.433747 L 88.569459,21.442214 L 90.880838,21.274136 L 90.880838,18.752967 L 92.201625,17.576422 L 94.347905,16.231799 L 94.678102,17.408344 L 95.008299,19.257201 L 92.696921,19.761435 L 92.366724,21.946448 L 94.182807,23.459149 L 95.338496,25.980318 L 95.99889,27.997253 L 97.484776,27.829175 L 97.649875,26.484552 L 96.659284,25.139928 L 96.163989,21.77837 L 96.989481,19.929513 L 96.329087,18.416812 L 96.329087,16.063721 L 98.14517,12.366006 L 96.989481,9.6767597 L 94.513004,4.634422 L 94.843201,3.7940324 L 95.99889,2.9536428 z M 86.341086,9.169955 L 88.404826,9.001877 L 88.900121,10.430545 L 90.468562,8.7497548 L 92.862495,8.7497548 L 93.687987,10.3465 L 92.119546,12.111324 L 92.779951,12.951724 L 92.037002,15.052704 L 90.63366,15.472893 C 90.63366,15.472893 89.725613,15.556938 89.725613,15.220782 C 89.725613,14.884626 91.21151,12.531524 91.21151,12.531524 L 89.477971,11.943246 L 89.147774,13.455958 L 88.404826,14.12827 L 86.836382,11.775168 L 86.341086,9.169955 z " id="WA" style="fill:#d35f5f" />
- <ns0:path d="M 224.65378,521.59843 L 226.52879,518.16091 L 228.7163,517.84841 L 229.0288,518.62966 L 226.99754,521.59843 L 224.65378,521.59843 z M 234.49758,518.00466 L 240.43511,520.50467 L 242.46637,520.19217 L 244.02887,516.44215 L 243.40387,513.16089 L 239.34135,512.69214 L 235.43508,514.41089 L 234.49758,518.00466 z M 264.18522,527.69221 L 267.77898,533.00473 L 270.12274,532.69223 L 271.2165,532.22348 L 272.62275,533.47348 L 276.21652,533.31723 L 277.15403,531.91098 L 274.34151,530.19222 L 272.4665,526.59845 L 270.43524,523.16094 L 264.81022,525.97345 L 264.18522,527.69221 z M 283.71656,536.286 L 284.96656,534.41099 L 289.49783,535.34849 L 290.12284,534.87974 L 296.06036,535.50474 L 295.74786,536.75475 L 293.24785,538.161 L 289.02908,537.8485 L 283.71656,536.286 z M 288.87283,541.28602 L 290.74784,545.03604 L 293.7166,543.94228 L 294.0291,542.37977 L 292.4666,540.34851 L 288.87283,540.03601 L 288.87283,541.28602 z M 295.59161,540.19226 L 297.77912,537.37975 L 302.31039,539.72351 L 306.52916,540.81727 L 310.74793,543.47353 L 310.74793,545.34854 L 307.31042,547.0673 L 302.62289,548.0048 L 300.27913,546.59854 L 295.59161,540.19226 z M 311.68544,555.19233 L 313.24794,553.94233 L 316.52921,555.50484 L 323.87299,558.94235 L 327.15426,560.97361 L 328.71676,563.31737 L 330.59177,567.53614 L 334.49804,570.03615 L 334.18554,571.28616 L 330.43552,574.41117 L 326.373,575.81743 L 324.96675,575.19243 L 321.99798,576.91118 L 319.65422,580.0362 L 317.46671,582.84871 L 315.74795,582.69246 L 312.31044,580.19245 L 311.99794,575.81743 L 312.62294,573.47367 L 311.06043,568.00489 L 309.02917,566.28613 L 308.87292,563.78612 L 311.06043,562.84862 L 313.09169,559.87986 L 313.56044,558.94235 L 311.99794,557.22359 L 311.68544,555.19233 z " id="HI_Pacific" style="fill:none;fill-opacity:0.26666697;stroke:#80b0f0;stroke-width:1pt" />
- <ns0:path d="M 224.65378,521.59843 L 226.52879,518.16091 L 228.7163,517.84841 L 229.0288,518.62966 L 226.99754,521.59843 L 224.65378,521.59843 z M 234.49758,518.00466 L 240.43511,520.50467 L 242.46637,520.19217 L 244.02887,516.44215 L 243.40387,513.16089 L 239.34135,512.69214 L 235.43508,514.41089 L 234.49758,518.00466 z M 264.18522,527.69221 L 267.77898,533.00473 L 270.12274,532.69223 L 271.2165,532.22348 L 272.62275,533.47348 L 276.21652,533.31723 L 277.15403,531.91098 L 274.34151,530.19222 L 272.4665,526.59845 L 270.43524,523.16094 L 264.81022,525.97345 L 264.18522,527.69221 z M 283.71656,536.286 L 284.96656,534.41099 L 289.49783,535.34849 L 290.12284,534.87974 L 296.06036,535.50474 L 295.74786,536.75475 L 293.24785,538.161 L 289.02908,537.8485 L 283.71656,536.286 z M 288.87283,541.28602 L 290.74784,545.03604 L 293.7166,543.94228 L 294.0291,542.37977 L 292.4666,540.34851 L 288.87283,540.03601 L 288.87283,541.28602 z M 295.59161,540.19226 L 297.77912,537.37975 L 302.31039,539.72351 L 306.52916,540.81727 L 310.74793,543.47353 L 310.74793,545.34854 L 307.31042,547.0673 L 302.62289,548.0048 L 300.27913,546.59854 L 295.59161,540.19226 z M 311.68544,555.19233 L 313.24794,553.94233 L 316.52921,555.50484 L 323.87299,558.94235 L 327.15426,560.97361 L 328.71676,563.31737 L 330.59177,567.53614 L 334.49804,570.03615 L 334.18554,571.28616 L 330.43552,574.41117 L 326.373,575.81743 L 324.96675,575.19243 L 321.99798,576.91118 L 319.65422,580.0362 L 317.46671,582.84871 L 315.74795,582.69246 L 312.31044,580.19245 L 311.99794,575.81743 L 312.62294,573.47367 L 311.06043,568.00489 L 309.02917,566.28613 L 308.87292,563.78612 L 311.06043,562.84862 L 313.09169,559.87986 L 313.56044,558.94235 L 311.99794,557.22359 L 311.68544,555.19233 z " id="HI" style="fill:#e9afaf" />
- <ns0:path d="M 365.08234,342.9472 L 388.2557,344.07626 L 420.00963,345.26475 L 418.60872,369.98537 L 418.14175,388.52584 L 418.37523,390.18973 L 422.81144,393.9929 L 424.9128,395.18139 L 425.61327,394.94369 L 426.31372,392.80441 L 427.71463,394.70599 L 429.81599,394.70599 L 429.81599,393.2798 L 432.6178,394.70599 L 432.15084,398.74687 L 436.35356,398.98457 L 438.92189,400.17306 L 443.12462,400.88615 L 445.69295,402.78774 L 448.02779,400.64846 L 451.53007,401.36155 L 454.0984,404.92703 L 455.03233,404.92703 L 455.03233,407.30401 L 457.36718,408.0171 L 459.70203,405.64012 L 461.5699,406.35321 L 464.13823,406.35321 L 465.07218,408.9679 L 469.97536,410.86948 L 471.37627,410.15638 L 473.24415,405.87781 L 474.41156,405.87781 L 475.57899,408.0171 L 479.78172,408.73019 L 483.51747,410.15638 L 486.55277,411.10718 L 488.42065,410.15638 L 489.1211,407.54171 L 493.55731,407.54171 L 495.65868,408.49249 L 498.46049,406.35321 L 499.62792,406.35321 L 500.32837,408.0171 L 504.53109,408.0171 L 506.16549,405.87781 L 508.03337,406.35321 L 510.13473,408.9679 L 513.40351,410.86948 L 516.6723,411.82028 L 519.47412,413.12761 L 521.80896,415.14805 L 524.84426,413.72186 L 527.64608,414.91035 L 528.33194,426.45357 L 528.34653,436.5409 L 529.04699,446.28652 L 529.74745,450.3274 L 532.31578,454.60597 L 533.24971,459.83533 L 537.68592,465.54009 L 537.9194,468.86787 L 538.61987,469.58096 L 537.9194,478.3758 L 534.88411,483.60516 L 536.5185,485.74444 L 535.81804,488.35912 L 535.11759,495.96547 L 533.71668,499.29324 L 534.00598,503.01936 L 527.40119,504.83432 L 517.33018,509.5405 L 516.33959,511.55743 L 513.69802,513.57437 L 511.55174,515.08707 L 510.23095,515.92746 L 504.4525,521.47403 L 501.64583,523.65904 L 496.19758,527.0206 L 490.41913,529.54177 L 483.98029,533.07141 L 482.16421,534.58411 L 476.22066,538.28182 L 472.7536,538.95414 L 468.79123,544.66878 L 464.66377,545.00494 L 463.67318,547.02188 L 465.98456,549.03881 L 464.49867,554.75346 L 463.17788,559.45964 L 462.0222,563.49351 L 461.1967,568.19969 L 462.0222,570.72086 L 463.83828,577.94821 L 464.82887,584.33517 L 466.64495,587.1925 L 465.65436,588.7052 L 462.51749,590.72214 L 456.73904,586.68827 L 451.1257,585.51172 L 449.80491,586.01595 L 446.50294,585.34364 L 442.21038,582.15016 L 436.92723,580.97362 L 429.1676,577.44398 L 427.02132,573.41011 L 425.70053,566.68699 L 422.39856,564.67006 L 421.73817,562.31697 L 422.39856,561.64466 L 422.72876,558.11502 L 421.40797,557.44271 L 420.74758,556.43424 L 422.06837,551.89614 L 420.41738,549.54304 L 417.11541,548.19842 L 413.64834,543.66032 L 410.01618,536.76912 L 405.72362,534.07988 L 405.88872,532.06294 L 400.44047,519.28902 L 399.61497,514.91899 L 397.79889,512.90206 L 397.63379,511.38936 L 391.52515,505.84279 L 388.88357,502.6493 L 388.88357,501.47276 L 386.242,499.28775 L 379.30786,498.1112 L 371.71333,497.43889 L 368.57646,495.0858 L 363.9537,496.93466 L 360.32154,498.44736 L 358.01016,501.80891 L 357.01957,505.67471 L 352.56191,512.06167 L 350.08543,514.58284 L 347.44386,513.57437 L 345.62777,512.39782 L 343.64659,511.72551 L 339.68423,509.37242 L 339.68423,508.70011 L 337.86815,506.68317 L 332.585,504.49816 L 324.99047,496.43042 L 322.67909,491.55616 L 322.67909,483.15227 L 319.37712,476.42915 L 318.88182,473.57182 L 317.23084,472.56336 L 316.07515,470.37834 L 310.9571,468.19333 L 309.63631,466.51255 L 302.37198,458.27673 L 301.05119,454.91517 L 296.26332,452.56207 L 294.77744,448.02394 L 292.13584,444.99855 L 290.15467,444.49434 L 289.49163,439.63101 L 297.66367,440.34413 L 327.31615,443.19648 L 356.96871,444.86037 L 359.30356,420.13975 L 363.27277,362.37936 L 364.90719,342.88781 L 366.3081,342.91754 M 467.38967,586.18345 L 466.81183,578.788 L 464.00514,571.30851 L 463.42729,563.99709 L 464.99573,555.42509 L 468.38027,548.28176 L 471.92989,542.65112 L 475.14933,538.95339 L 475.80972,539.20552 L 470.9393,546.09673 L 466.48163,552.90391 L 464.41788,559.79513 L 464.08769,565.17365 L 464.99573,571.56063 L 467.63732,579.04012 L 468.13261,584.41863 L 468.29771,585.93134 L 467.38967,586.18345 z " id="TX" style="fill:#280b0b" />
- <ns0:path d="M 140.74058,399.1133 L 144.96457,398.27159 L 146.48222,396.01346 L 147.06593,393.16108 L 143.33019,392.56684 L 142.86321,391.73489 L 143.33019,389.95216 L 143.44692,383.89086 L 145.54828,383.17775 L 148.46685,380.32538 L 149.05056,375.21486 L 150.56821,371.4117 L 152.55282,369.39125 L 156.0551,367.60852 L 157.68948,366.18234 L 157.80623,363.80536 L 156.75555,363.21111 L 155.93835,362.14147 L 154.65419,356.08016 L 151.85237,350.96965 L 152.44317,347.57226 L 149.86775,344.19525 L 135.04148,320.54427 L 115.19528,290.35661 L 91.963567,255.17727 L 79.318752,235.85757 L 80.989783,229.03046 L 88.111072,202.05171 L 96.399776,169.3682 L 82.624178,165.56503 L 68.848582,161.99955 L 56.006928,157.72098 L 48.301935,155.58169 L 36.627704,152.49162 L 29.426941,149.98419 L 27.813217,154.89608 L 27.648119,162.62767 L 22.364968,174.89736 L 19.228097,177.5866 L 18.8979,178.76315 L 17.081817,179.60354 L 15.595931,183.97356 L 14.770438,187.33512 L 17.577112,191.70515 L 19.228097,196.07518 L 20.383786,199.77289 L 20.053589,206.49601 L 18.237506,209.68949 L 17.577112,215.74029 L 16.586521,219.60608 L 18.402605,223.63995 L 21.209279,228.34614 L 23.520657,233.38847 L 24.841445,237.59042 L 24.511248,240.95198 L 24.181051,241.45621 L 24.181051,243.64123 L 29.959497,250.19627 L 29.464202,252.71743 L 28.803808,255.07053 L 28.143414,257.08746 L 28.308513,265.65943 L 30.454793,269.52523 L 32.435974,272.21447 L 35.242648,272.71871 L 36.233239,275.57603 L 35.07755,279.27375 L 32.93127,280.95453 L 31.775581,280.95453 L 30.950088,284.9884 L 31.445384,288.0138 L 34.747353,292.5519 L 36.398338,298.09847 L 37.884224,302.97273 L 39.205012,306.16621 L 42.672079,312.21702 L 44.157966,314.90627 L 44.653261,317.93167 L 46.304246,318.94014 L 46.304246,321.4613 L 45.478753,323.47824 L 43.66267,330.87367 L 43.167375,332.8906 L 45.643852,335.74793 L 49.936412,336.25216 L 54.559169,338.10102 L 58.521532,340.28603 L 61.493305,340.28603 L 64.465077,343.47951 L 67.106653,348.52185 L 68.262342,350.87494 L 72.224705,353.05995 L 77.177659,353.90034 L 78.663546,356.08536 L 79.32394,359.44692 L 77.838053,360.11923 L 78.16825,361.12769 L 81.470222,361.96808 L 84.276896,362.13616 L 87.248668,367.01042 L 91.211035,371.38045 L 92.036527,373.73354 L 94.678102,378.10356 L 95.008299,381.46512 L 95.008299,391.21364 L 95.503595,393.0625 L 105.7397,394.5752 L 125.88171,397.43253 L 140.74058,399.1133 z M 50.26694,346.75563 L 51.587732,348.35237 L 51.422633,349.697 L 48.120652,349.61296 L 47.542806,348.35237 L 46.88241,346.83966 L 50.26694,346.75563 z M 52.248128,346.75563 L 53.48637,346.08332 L 57.118549,348.26833 L 60.255432,349.52892 L 59.347387,350.20124 L 54.724613,349.94912 L 53.073623,348.26833 L 52.248128,346.75563 z M 73.380807,367.34524 L 75.19689,369.78238 L 76.022393,370.79086 L 77.590834,371.37912 L 78.168673,369.86642 L 77.178082,368.01756 L 74.453952,365.91658 L 73.380807,366.08465 L 73.380807,367.34524 z M 71.89491,376.33744 L 73.711004,379.61497 L 74.949248,381.63192 L 73.463351,381.88403 L 72.142563,380.62344 C 72.142563,380.62344 71.399615,379.11074 71.399615,378.69054 C 71.399615,378.27035 71.399615,376.42148 71.399615,376.42148 L 71.89491,376.33744 z " id="CA" style="fill:#280b0b" />
- <ns0:path d="M 141.11208,399.22238 L 138.4292,401.4664 L 138.099,402.9791 L 138.5943,403.98756 L 157.91082,415.08071 L 170.2932,422.98037 L 185.31716,431.8885 L 202.4874,442.30933 L 215.03489,444.8305 L 242.33612,448.47703 L 244.42909,434.63935 L 248.26156,406.64864 L 255.37454,351.33455 L 259.72234,319.30647 L 233.45531,315.31482 L 205.67064,310.56085 L 171.53056,303.99238 L 168.54652,322.80241 L 168.07955,323.2778 L 166.32842,326.01134 L 163.76009,325.89248 L 162.47592,323.04011 L 159.67411,322.68356 L 158.74017,321.49507 L 157.80623,321.49507 L 156.87229,322.08932 L 154.88767,323.15896 L 154.77093,330.40875 L 154.53744,332.19149 L 153.95374,345.26489 L 152.43609,347.52302 L 151.85237,350.96965 L 154.65419,356.08016 L 155.93835,362.14147 L 156.75555,363.21111 L 157.80623,363.80536 L 157.68948,366.18234 L 156.0551,367.60852 L 152.55282,369.39125 L 150.56821,371.4117 L 149.05056,375.21486 L 148.46685,380.32538 L 145.54828,383.17775 L 143.44692,383.89086 L 143.33019,389.95216 L 142.86321,391.73489 L 143.33019,392.56684 L 147.06593,393.16108 L 146.48222,396.01346 L 144.96457,398.27159 L 141.11208,399.22238 z " id="AZ" style="fill:#de8787" />
- <ns0:path d="M 144.08485,180.96023 L 165.51122,185.65054 L 175.43432,187.67098 L 184.89044,189.57255 L 193.12078,191.77126 L 191.89498,197.53545 L 188.27597,215.71936 L 184.42347,236.99336 L 182.43886,246.26359 L 180.22075,260.40663 L 176.83522,277.63975 L 173.56644,293.44668 L 171.55619,304.36486 L 168.54652,322.80241 L 168.07955,323.2778 L 166.32842,326.01134 L 163.76009,325.89248 L 162.47592,323.04011 L 159.67411,322.68356 L 158.74017,321.49507 L 157.80623,321.49507 L 156.87229,322.08932 L 154.88767,323.15896 L 154.77093,330.40875 L 154.53744,332.19149 L 153.95374,345.26489 L 152.43963,347.54764 L 149.86775,344.19525 L 135.04148,320.54427 L 115.19528,290.35661 L 91.963567,255.17727 L 79.318752,235.85757 L 80.989783,229.03046 L 88.111072,202.05171 L 96.166292,169.45944 L 130.48854,177.92533 L 144.49761,181.0154" id="NV" style="fill:#e9afaf" />
- <ns0:path d="M 259.6056,319.59339 L 233.45531,315.31482 L 205.67064,310.56085 L 171.45228,304.13508 L 173.56644,293.44668 L 176.83522,277.63975 L 180.22075,260.40663 L 182.43886,246.26359 L 184.42347,236.99336 L 188.27597,215.71936 L 191.89498,197.53545 L 193.03322,191.74155 L 206.02081,194.08882 L 218.27875,196.22811 L 228.78555,198.12969 L 237.30774,199.55589 L 242.21095,200.38777 L 240.53069,211.44019 L 238.82546,223.80098 L 245.48808,224.7662 L 262.73518,227.14318 L 272.10412,228.36648 L 268.94498,251.37398 L 265.6762,274.66841 L 261.84373,303.76606 L 260.30605,315.31482 L 259.6056,319.59339 z " id="UT" style="fill:#e9afaf" />
- <ns0:path d="M 384.05299,331.95365 L 388.2557,263.49654 L 389.8901,240.2021 L 355.80134,237.34972 L 330.81813,235.21041 L 292.76047,230.93187 L 271.63008,228.31722 L 268.94498,251.37398 L 265.6762,274.66841 L 261.84373,303.76606 L 260.30605,315.31482 L 259.72234,319.35569 L 294.86179,323.63426 L 332.58567,328.23704 L 366.04543,330.52751 L 372.84567,331.2406 L 384.5199,331.83485" id="CO" style="fill:#e9afaf" />
- <ns0:path d="M 290.31977,444.66242 L 289.49163,439.63101 L 297.66367,440.34413 L 327.31615,443.19648 L 356.96871,444.86037 L 359.30356,420.13975 L 363.27277,362.37936 L 364.90719,342.88781 L 366.3081,342.91754 L 366.29351,330.73549 L 332.58567,328.23704 L 294.86179,323.63426 L 259.66398,319.35569 L 255.37454,351.33455 L 248.26156,406.64864 L 244.42909,434.63935 L 242.33612,448.47703 L 258.12559,450.54515 L 259.44637,440.12432 L 276.45152,442.81356 L 290.31977,444.66242 z " id="NM" style="fill:#e9afaf" />
- <ns0:path d="M 144.38087,180.54003 L 148.93381,161.76187 L 153.37002,143.34026 L 154.77093,138.94284 L 157.33926,132.76269 L 156.0551,130.38571 L 153.48676,130.50455 L 152.66957,129.43491 L 153.13654,128.24642 L 153.48676,125.0375 L 158.03971,119.33273 L 159.90759,118.85734 L 161.07501,117.66885 L 161.65873,114.34107 L 162.59266,113.62798 L 166.5619,107.56668 L 170.53114,103.05041 L 170.76463,99.128389 L 167.26235,96.394856 L 166.19165,92.03947 L 151.85237,88.313121 L 136.44238,84.628799 L 120.68217,84.747642 L 120.21521,83.321459 L 114.61157,85.460744 L 110.05862,84.866496 L 107.60703,83.202605 L 106.32286,83.915707 L 101.53644,83.678 L 99.785303,82.251817 L 94.415149,80.112532 L 93.597952,80.231386 L 89.161743,78.686338 L 87.177124,80.587926 L 80.873036,80.231386 L 74.802439,75.952816 L 75.50289,75.12087 L 75.736374,67.039124 L 73.401527,62.998262 L 69.198802,62.404014 L 68.498351,59.789335 L 66.094359,59.304248 L 60.172517,61.44476 L 57.861139,68.167876 L 54.559169,78.588708 L 51.2572,85.311824 L 46.139147,99.934604 L 39.535209,114.05315 L 31.280285,127.16323 L 29.299104,130.18863 L 28.473611,139.09676 L 27.152823,145.31564 L 29.426941,149.98419 L 36.627704,152.49162 L 48.301935,155.58169 L 56.006928,157.72098 L 68.848582,161.99955 L 82.624178,165.56503 L 96.399776,169.60589 M 144.08485,180.96023 L 96.166292,169.45944 L 130.48854,177.92533 L 144.49761,181.0154" id="OR" style="fill:#e9afaf" />
- <ns0:path d="M 482.58353,129.91009 L 481.88308,121.11525 L 480.0152,113.50891 L 478.14732,99.484714 L 477.68036,89.263683 L 475.81248,85.698205 L 474.17808,80.468846 L 474.17808,69.772421 L 474.87853,65.731548 L 472.88209,60.014242 L 442.87077,59.427825 L 423.88445,58.755513 L 396.8083,57.410889 L 371.33142,55.452236 L 370.0439,70.247815 L 368.64299,85.935913 L 366.33647,111.87386 L 365.67607,124.49947 L 423.04492,128.24621 L 482.58353,129.91009 z " id="ND" style="fill:#f4d7d7" />
- <ns0:path d="M 484.10703,208.42015 L 483.13305,206.29529 L 481.4161,203.35887 L 483.28398,198.8426 L 484.6849,192.90014 L 481.88308,190.76086 L 481.4161,187.90848 L 482.35005,185.29379 L 484.21793,185.29379 L 484.6849,178.16284 L 484.45141,146.54897 L 483.98444,143.4589 L 479.78172,139.89342 L 478.61429,137.99183 L 478.61429,136.32794 L 480.71565,134.66406 L 482.11657,133.23787 L 482.4668,129.91009 L 423.04492,128.24621 L 365.67608,124.20534 L 364.89307,129.69427 L 363.24575,146.19243 L 361.87193,164.85174 L 360.23755,191.5928 L 376.1145,192.66245 L 396.66115,193.85093 L 414.87297,195.03943 L 439.15538,196.22791 L 450.12916,195.75252 L 452.23052,198.1295 L 457.1337,201.21959 L 458.30112,202.17037 L 462.73733,200.74418 L 466.70658,200.26879 L 469.50839,200.03109 L 471.37627,201.45728 L 476.51293,203.12117 L 479.54822,204.78505 L 480.0152,206.44894 L 480.94914,208.58823 L 482.81702,208.58823 L 484.10703,208.42015 z " id="SD" style="fill:#f4d7d7" />
- <ns0:path d="M 496.12564,252.80011 L 497.52656,255.41479 L 497.29307,257.79177 L 499.8614,261.83265 L 503.13018,266.11122 L 496.82609,266.11122 L 451.76325,265.63581 L 410.43676,264.20963 L 388.13897,263.37769 L 389.8901,240.2021 L 355.80134,237.34972 L 360.23755,191.5928 L 376.1145,192.66245 L 396.66115,193.85093 L 414.87297,195.03943 L 439.15538,196.22791 L 450.12916,195.75252 L 452.23052,198.1295 L 457.1337,201.21959 L 458.30112,202.17037 L 462.73733,200.74418 L 466.70658,200.26879 L 469.50839,200.03109 L 471.37627,201.45728 L 476.51293,203.12117 L 479.54822,204.78505 L 480.0152,206.44894 L 480.94914,208.58823 L 482.81702,208.58823 L 484.45141,208.46938 L 485.61883,214.05529 L 488.42065,221.89933 L 489.35459,226.891 L 491.68943,230.69417 L 492.38988,236.16123 L 494.02428,240.4398 L 494.25776,247.33306 L 496.23653,253.05224" id="NE" style="fill:#f4d7d7" />
- <ns0:path d="M 580.12177,205.73586 L 580.18014,207.63744 L 582.51499,208.35053 L 583.44892,209.53902 L 583.91589,211.44061 L 587.88513,215.00608 L 588.58559,217.38307 L 587.88513,220.94855 L 586.01725,224.75171 L 585.3168,227.36639 L 582.98196,229.26798 L 581.11408,229.98108 L 575.74393,231.40726 L 575.04347,233.30885 L 574.34302,235.44814 L 575.04347,236.87433 L 576.91135,238.53822 L 576.67787,242.81678 L 574.80999,244.48067 L 574.10954,246.14456 L 574.10954,248.99694 L 572.24166,249.47233 L 570.60726,250.66083 L 570.37378,252.08702 L 570.60726,254.22631 L 568.85613,256.06846 L 565.4706,252.56242 L 564.30317,250.18543 L 556.3647,250.89852 L 546.32485,251.37392 L 520.40805,252.32472 L 506.63246,252.56242 L 497.05959,252.80011 L 495.9476,252.92617 L 494.25776,247.33306 L 494.02428,240.4398 L 492.38988,236.16123 L 491.68943,230.69417 L 489.35459,226.891 L 488.42065,221.89933 L 485.61883,214.05529 L 484.45141,208.46938 L 483.0505,206.21125 L 481.4161,203.35887 L 483.28398,198.8426 L 484.6849,192.90014 L 481.88308,190.76086 L 481.4161,187.90848 L 482.35005,185.29379 L 484.10119,185.29379 L 495.89216,185.29379 L 546.55834,184.5807 L 565.00364,183.86761 L 569.20636,183.74877 L 569.90681,187.19538 L 572.24166,188.85927 L 572.47514,190.28546 L 570.37378,193.85093 L 570.60726,197.17871 L 573.1756,201.21959 L 575.74393,202.40807 L 578.77923,202.88347 L 580.12177,205.73586 z " id="IA" style="fill:#e9afaf" />
- <ns0:path d="M 639.20393,481.84625 L 638.01716,483.15227 L 632.73401,483.15227 L 631.24813,482.31188 L 629.10185,481.97572 L 622.16771,483.99266 L 620.35163,483.15227 L 617.71005,487.52229 L 616.58406,488.3312 L 615.43633,485.74444 L 614.2689,481.70357 L 610.76664,478.3758 L 611.93406,470.53175 L 611.23361,469.58096 L 609.36573,469.81866 L 600.96028,470.53175 L 576.2109,471.24485 L 575.74393,469.58096 L 576.44438,461.26152 L 579.94666,454.84366 L 585.3168,445.33573 L 584.38287,443.19645 L 585.55029,443.19645 L 586.25075,439.86868 L 583.91589,437.96709 L 584.14938,436.0655 L 582.04802,431.31154 L 581.75616,425.75534 L 583.15706,422.99209 L 582.74847,418.47583 L 581.34756,415.38574 L 582.74847,413.95956 L 581.34756,411.82028 L 581.81454,409.91869 L 582.74847,403.50083 L 585.78377,400.64846 L 585.08332,398.50917 L 588.81908,393.0421 L 591.62089,392.09132 L 591.62089,389.47664 L 590.92044,388.05044 L 593.72225,382.58339 L 596.52407,381.39489 L 596.63379,377.84737 L 605.49374,377.76685 L 630.09345,375.74991 L 635.69855,375.51222 L 635.7068,382.13688 L 635.8719,399.44893 L 635.04641,431.71994 L 634.88131,446.34274 L 637.68799,465.83981 L 639.20393,481.84625 z " id="MS" style="fill:#e9afaf" />
- <ns0:path d="M 632.23973,310.19942 L 632.07463,306.16555 L 632.56993,301.45935 L 634.88131,298.43395 L 636.6974,294.40007 L 639.33898,290.03004 L 638.84368,283.97923 L 637.0276,281.12189 L 636.6974,277.76034 L 637.52289,272.04567 L 637.0276,264.81831 L 635.7068,248.17858 L 634.38601,232.21115 L 633.3949,220.02589 L 636.53128,220.95071 L 638.01716,221.95917 L 639.17285,221.62302 L 641.31913,219.60608 L 644.20888,217.92491 L 649.40999,217.75643 L 671.86343,215.40333 L 678.13717,214.73102 L 678.30227,215.90756 L 679.78816,231.20268 L 681.60425,245.48932 L 684.24582,269.86066 L 684.74112,275.7434 L 684.24582,278.09649 L 685.73171,279.60919 L 686.06192,281.62613 L 683.25523,283.64307 L 679.29287,285.49193 L 676.48618,285.82809 L 675.99089,290.53428 L 671.20302,294.56815 L 668.23125,298.26587 L 668.56145,300.61896 L 667.73595,302.80398 L 662.94809,302.80398 L 661.7924,301.1232 L 660.63671,301.96359 L 657.66493,303.64438 L 657.83004,307.17401 L 655.68375,307.67825 L 654.85825,306.5017 L 652.87707,304.82092 L 649.90529,306.33362 L 648.08921,309.69518 L 646.27312,308.85479 L 644.78724,306.83786 L 641.15506,307.34209 L 635.2115,308.35056 L 632.23973,310.19942 z " id="IN" style="fill:#de8787" />
- <ns0:path d="M 632.07463,310.03134 L 632.07463,306.16555 L 632.56993,301.45935 L 634.88131,298.43395 L 636.6974,294.40007 L 639.33898,290.03004 L 638.84368,283.97923 L 637.0276,281.12189 L 636.6974,277.76034 L 637.52289,272.04567 L 637.0276,264.81831 L 635.7068,248.17858 L 634.38601,232.21115 L 633.56001,220.10992 L 632.23872,219.26993 L 631.41322,216.58068 L 630.09244,212.71489 L 628.44145,210.86603 L 626.95557,208.17679 L 626.71703,202.46993 L 616.60376,203.83427 L 588.81909,205.617 L 579.94666,205.17133 L 580.18014,207.63744 L 582.51499,208.35053 L 583.44892,209.53902 L 583.91589,211.44061 L 587.88513,215.00608 L 588.58559,217.38307 L 587.88513,220.94855 L 586.01725,224.75171 L 585.3168,227.36639 L 582.98196,229.26798 L 581.11408,229.98108 L 575.74393,231.40726 L 575.04347,233.30885 L 574.34302,235.44814 L 575.04347,236.87433 L 576.91135,238.53822 L 576.67787,242.81678 L 574.80999,244.48067 L 574.10954,246.14456 L 574.10954,248.99694 L 572.24166,249.47233 L 570.60726,250.66083 L 570.37378,252.08702 L 570.60726,254.22631 L 568.85613,255.59306 L 567.80545,258.50488 L 568.27242,262.30804 L 570.60726,269.91439 L 578.07878,277.75843 L 583.68241,281.56161 L 583.44892,286.07787 L 584.38287,287.50407 L 590.92044,287.97946 L 593.72225,289.40566 L 593.0218,293.20882 L 590.68696,299.38898 L 589.98649,302.71676 L 592.32134,306.75762 L 598.85891,312.22469 L 603.52862,312.93778 L 605.62997,318.16715 L 607.73133,321.49492 L 606.7974,324.58499 L 608.43179,328.86356 L 610.29967,331.00285 L 613.32836,330.65102 L 613.91377,328.51994 L 616.22516,326.67109 L 618.37144,325.99877 L 621.17811,327.3434 L 624.81029,328.68802 L 625.96598,328.35186 L 626.13108,325.99877 L 624.81029,323.47759 L 625.14049,321.1245 L 627.12167,319.6118 L 629.76325,318.93949 L 631.41424,318.26718 L 630.58875,316.41831 L 629.92835,314.40138 L 631.08404,313.56099 L 632.07463,310.03134 z " id="IL" style="fill:#782121" />
- <ns0:path d="M 482.35005,129.91009 L 481.88308,121.11525 L 480.0152,113.50891 L 478.14732,99.484714 L 477.68036,89.263683 L 475.81248,85.698205 L 474.17808,80.468846 L 474.17808,69.772421 L 474.87853,65.731548 L 473.01887,60.063466 L 503.79211,60.100136 L 504.1223,51.528162 L 504.7827,51.360084 L 507.09408,51.864318 L 509.07526,52.704708 L 509.90075,58.419357 L 511.38664,64.806318 L 513.03762,66.487097 L 517.99058,66.487097 L 518.32077,67.999799 L 524.75961,68.335954 L 524.75961,70.520967 L 529.71257,70.520967 L 530.04276,69.176344 L 531.19845,67.999799 L 533.50983,67.327487 L 534.83062,68.335954 L 537.80239,68.335954 L 541.76476,71.025201 L 547.21301,73.54637 L 549.68948,74.050604 L 550.18478,73.042136 L 551.67066,72.537902 L 552.16596,75.563305 L 554.80753,76.907928 L 555.30283,76.403695 L 556.62362,76.571773 L 556.62362,78.756786 L 559.26519,79.765253 L 562.40206,79.765253 L 564.05305,78.924863 L 567.35502,75.563305 L 569.99659,75.059071 L 570.82209,76.907928 L 571.31738,78.252552 L 572.30797,78.252552 L 573.29856,77.412162 L 582.37898,77.076006 L 584.19506,80.269487 L 584.85546,80.269487 L 585.58425,79.142165 L 590.11857,78.756786 L 589.49346,81.126733 L 585.47097,83.036786 L 576.02857,87.25913 L 571.15228,89.345695 L 568.01541,92.034941 L 565.53894,95.732656 L 563.22756,99.766526 L 561.41147,100.60692 L 556.78872,105.81733 L 555.46793,105.98541 L 552.00086,109.17889 L 552.70347,109.74365 L 549.82713,112.55812 L 549.59365,115.4105 L 549.59365,124.20534 L 548.42622,125.86923 L 543.05607,129.91009 L 540.72123,136.09025 L 541.18819,136.32794 L 543.75652,138.46723 L 544.45698,141.79501 L 542.5891,145.12278 L 542.5891,149.16365 L 543.05607,156.0569 L 546.09137,159.14699 L 549.59365,159.14699 L 551.46153,162.47476 L 554.96379,162.95015 L 558.93303,168.89261 L 566.17105,173.17118 L 568.27242,176.02356 L 569.20636,183.86761 L 565.00364,183.86761 L 546.55834,184.5807 L 495.89216,185.29379 L 484.10119,185.29379 L 484.6849,178.16284 L 484.45141,146.54897 L 483.98444,143.4589 L 479.78172,139.89342 L 478.61429,137.99183 L 478.61429,136.32794 L 480.71565,134.66406 L 482.11657,133.23787 L 482.35005,129.91009 z " id="MN" style="fill:#d35f5f" />
- <ns0:path d="M 626.6436,202.64577 L 626.79047,198.26019 L 625.13948,193.55401 L 624.47909,187.16705 L 623.3234,184.64588 L 624.31399,181.4524 L 625.13948,178.42699 L 626.62537,175.73775 L 625.96497,172.20811 L 625.30458,168.5104 L 625.79988,166.66154 L 627.78106,164.14037 L 627.94616,161.28305 L 627.12066,159.93842 L 627.78106,157.24918 L 628.27635,153.88762 L 631.08303,148.00489 L 634.0548,140.94562 L 634.2199,138.59253 L 633.8897,137.58406 L 633.06421,138.08829 L 628.77165,144.64333 L 625.96497,148.84528 L 623.98379,150.69414 L 623.1583,153.04723 L 621.67241,153.88762 L 620.51673,155.90455 L 619.03084,155.5684 L 618.86574,153.71954 L 620.18653,151.19837 L 622.33281,146.32411 L 624.14889,144.64333 L 625.27363,142.26081 L 623.6083,141.31962 L 622.20739,139.89342 L 620.57299,129.197 L 616.83724,128.00851 L 615.43633,125.63153 L 602.59467,122.77914 L 600.02634,121.59066 L 591.62089,119.21367 L 583.21544,118.02518 L 578.9573,112.40581 L 578.41662,113.71699 L 577.26093,113.54892 L 576.60053,112.37237 L 573.79386,111.53198 L 572.63817,111.70006 L 570.82209,112.70853 L 569.8315,112.03621 L 570.49189,110.01928 L 572.47307,106.8258 L 573.62876,105.64925 L 571.64758,104.13655 L 569.5013,104.97694 L 566.52953,106.99388 L 558.935,110.35543 L 555.96322,111.02775 L 552.99145,110.52351 L 551.98885,109.6104 L 549.82713,112.55812 L 549.59365,115.4105 L 549.59365,124.20534 L 548.42622,125.86923 L 543.05607,129.91009 L 540.72123,136.09025 L 541.18819,136.32794 L 543.75652,138.46723 L 544.45698,141.79501 L 542.5891,145.12278 L 542.5891,149.16365 L 543.05607,156.0569 L 546.09137,159.14699 L 549.59365,159.14699 L 551.46153,162.47476 L 554.96379,162.95015 L 558.93303,168.89261 L 566.17105,173.17118 L 568.27242,176.02356 L 569.20636,183.74877 L 569.90681,187.19538 L 572.24166,188.85927 L 572.47514,190.28546 L 570.37378,193.85093 L 570.60726,197.17871 L 573.1756,201.21959 L 575.74393,202.40807 L 578.77923,202.88347 L 580.03422,205.49817 L 589.40281,205.49815 L 616.60376,203.83427 L 626.6436,202.64577 z " id="WI" style="fill:#de8787" />
- <ns0:path d="M 568.73938,255.89021 L 565.4706,252.56242 L 564.30317,250.18543 L 556.3647,250.89852 L 546.32485,251.37392 L 520.40805,252.32472 L 506.63246,252.56242 L 498.57727,252.68126 L 496.24239,252.80011 L 497.52656,255.41479 L 497.29307,257.79177 L 499.8614,261.83265 L 503.01343,266.11122 L 506.16549,268.96359 L 508.50034,269.20129 L 509.90124,270.15209 L 509.90124,273.24216 L 508.03337,274.90605 L 507.56639,277.28304 L 509.66775,280.84852 L 512.23609,283.93859 L 514.80442,285.84018 L 516.20533,297.96278 L 515.50487,334.68718 L 515.73836,339.55999 L 516.20533,346.69094 L 540.02077,346.21554 L 563.83621,345.50245 L 585.08332,344.55165 L 596.29058,344.07626 L 598.15846,347.16634 L 597.69149,349.54332 L 594.4227,352.3957 L 593.72225,355.48577 L 600.02634,355.96118 L 605.163,355.24808 L 607.26436,348.59252 L 607.11843,342.73921 L 610.06619,341.22388 L 611.46709,339.55999 L 613.56845,338.3715 L 613.80194,335.04372 L 614.73588,333.14213 L 613.33497,330.61659 L 610.29967,331.00285 L 608.43179,328.86356 L 606.7974,324.58499 L 607.73133,321.49492 L 605.62997,318.16715 L 603.52862,312.93778 L 598.85891,312.22469 L 592.32134,306.75762 L 589.98649,302.71676 L 590.68696,299.38898 L 593.0218,293.20882 L 593.72225,289.40566 L 590.92044,287.97946 L 584.38287,287.50407 L 583.44892,286.07787 L 583.68241,281.56161 L 578.07878,277.75843 L 570.60726,269.91439 L 568.27242,262.30804 L 567.80545,258.50488 L 568.73938,255.89021 z " id="MO" style="fill:#de8787" />
- <ns0:path d="M 604.99844,354.98628 L 600.02634,355.96118 L 593.72225,355.48577 L 594.4227,352.3957 L 597.69149,349.54332 L 598.15846,347.16634 L 596.29058,344.07626 L 585.08332,344.55165 L 563.83621,345.50245 L 540.02077,346.21554 L 516.20533,346.69094 L 517.83972,353.82189 L 517.83971,362.37904 L 519.24063,373.78867 L 519.47412,413.12761 L 521.80896,415.14805 L 524.84426,413.72186 L 527.64608,414.91035 L 528.31735,426.58728 L 550.99455,426.55757 L 570.60726,425.60677 L 581.63941,425.75534 L 583.15706,422.99209 L 582.74847,418.47583 L 581.34756,415.38574 L 582.74847,413.95956 L 581.34756,411.82028 L 581.81454,409.91869 L 582.74847,403.50083 L 585.78377,400.64846 L 585.08332,398.50917 L 588.81908,393.0421 L 591.62089,392.09132 L 591.62089,389.47664 L 590.92044,388.05044 L 593.72225,382.58339 L 596.52407,381.39489 L 596.22104,377.59524 L 598.72469,376.42223 L 599.71528,371.54796 L 598.22939,367.85023 L 602.35687,365.49714 L 602.68706,362.80789 L 604.06449,358.25292 L 604.99844,354.98628 z " id="AR" style="fill:#e9afaf" />
- <ns0:path d="M 383.76113,331.71594 L 372.84567,331.2406 L 366.27891,330.73549 L 366.54158,330.94347 L 365.98708,342.94722 L 388.2557,344.07626 L 420.00963,345.26475 L 418.60872,369.98537 L 418.14175,388.52584 L 418.37523,390.18973 L 422.81144,393.9929 L 424.9128,395.18139 L 425.61327,394.94369 L 426.31372,392.80441 L 427.71463,394.70599 L 429.81599,394.70599 L 429.81599,393.2798 L 432.6178,394.70599 L 432.15084,398.74687 L 436.35356,398.98457 L 438.92189,400.17306 L 443.12462,400.88615 L 445.69295,402.78774 L 448.02779,400.64846 L 451.53007,401.36155 L 454.0984,404.92703 L 455.03233,404.92703 L 455.03233,407.30401 L 457.36718,408.0171 L 459.70203,405.64012 L 461.5699,406.35321 L 464.13823,406.35321 L 465.07218,408.9679 L 469.97536,410.86948 L 471.37627,410.15638 L 473.24415,405.87781 L 474.41156,405.87781 L 475.57899,408.0171 L 479.78172,408.73019 L 483.51747,410.15638 L 486.55277,411.10718 L 488.42065,410.15638 L 489.1211,407.54171 L 493.55731,407.54171 L 495.65868,408.49249 L 498.46049,406.35321 L 499.62792,406.35321 L 500.32837,408.0171 L 504.53109,408.0171 L 506.16549,405.87781 L 508.03337,406.35321 L 510.13473,408.9679 L 513.40351,410.86948 L 516.6723,411.82028 L 519.47412,413.48417 L 519.24063,373.78867 L 517.83971,362.37904 L 517.83972,353.82189 L 516.20533,346.69094 L 515.73836,339.55999 L 515.50487,334.92488 L 501.9627,335.75681 L 454.56566,335.28143 L 408.56892,333.14212 L 383.76113,331.71594 z " id="OK" style="fill:#e9afaf" />
- <ns0:path d="M 515.50487,335.04372 L 501.9627,335.75681 L 454.56566,335.28143 L 408.56892,333.14212 L 383.90706,331.83479 L 388.13897,263.37769 L 410.43676,264.20963 L 451.76325,265.63581 L 496.82609,266.11122 L 503.01343,266.11122 L 506.16549,268.96359 L 508.50034,269.20129 L 509.90124,270.15209 L 509.90124,273.24216 L 508.03337,274.90605 L 507.56639,277.28304 L 509.66775,280.84852 L 512.23609,283.93859 L 514.80442,285.84018 L 516.20533,297.96278 L 515.50487,335.04372 z " id="KS" style="fill:#e9afaf" />
- <ns0:path d="M 616.71945,488.11058 L 615.43633,485.74444 L 614.2689,481.70357 L 610.76664,478.3758 L 611.93406,470.53175 L 611.23361,469.58096 L 609.36573,469.81866 L 600.96028,470.53175 L 576.2109,471.24485 L 575.74393,469.58096 L 576.44438,461.26152 L 579.94666,454.84366 L 585.3168,445.33573 L 584.38287,443.19645 L 585.55029,443.19645 L 586.25075,439.86868 L 583.91589,437.96709 L 584.14938,436.0655 L 582.04802,431.31154 L 581.69779,425.60677 L 570.60726,425.60677 L 550.99455,426.55757 L 528.31735,426.58728 L 528.34653,436.5409 L 529.04699,446.28652 L 529.74745,450.3274 L 532.31578,454.60597 L 533.24971,459.83533 L 537.68592,465.54009 L 537.9194,468.86787 L 538.61987,469.58096 L 537.9194,478.3758 L 534.88411,483.60516 L 536.5185,485.74444 L 535.81804,488.35912 L 535.11759,495.96547 L 533.71668,499.29324 L 533.84174,503.05325 L 538.62788,501.47276 L 546.88281,501.1366 L 557.44911,504.83432 L 564.05305,506.01086 L 567.85031,504.49816 L 571.15228,505.67471 L 574.45425,506.68317 L 575.27974,504.49816 L 571.97778,503.32162 L 569.3362,503.82585 L 566.52953,502.14507 C 566.52953,502.14507 566.69462,500.80045 567.35502,500.63237 C 568.01541,500.46429 570.49189,499.6239 570.49189,499.6239 L 572.30797,501.1366 L 574.12406,500.12814 L 577.42603,500.80045 L 578.91191,503.32162 L 579.24211,505.67471 L 583.86487,506.01086 L 585.68095,507.85972 L 584.85546,509.5405 L 583.53467,510.38089 L 585.18565,512.06167 L 593.77077,515.75938 L 597.40294,514.41476 L 598.39353,511.89359 L 601.03511,511.22128 L 602.85119,509.70858 L 604.17198,510.71704 L 604.99747,513.74245 L 602.68609,514.58284 L 603.34648,515.25515 L 606.81355,513.91053 L 609.12493,510.38089 L 609.95042,509.87666 L 607.80414,509.5405 L 608.62964,507.85972 L 608.46454,506.34702 L 610.61082,505.84279 L 611.76651,504.49816 L 612.4269,505.33855 C 612.4269,505.33855 612.2618,508.53203 613.08729,508.53203 C 613.91279,508.53203 617.37985,509.20434 617.37985,509.20434 L 621.50732,511.22128 L 622.49791,512.73398 L 625.46968,512.73398 L 626.62537,513.74245 L 628.93675,510.54897 L 628.93675,509.03627 L 627.61596,509.03627 L 624.14889,506.17894 L 618.20535,505.33855 L 614.90338,502.98546 L 616.05907,500.12814 L 618.37045,500.46429 L 618.53554,499.79198 L 616.71946,498.78351 L 616.71946,498.27928 L 620.02143,498.27928 L 621.83751,495.0858 L 620.51673,493.06886 L 620.18653,490.21154 L 618.70064,490.37962 L 616.71946,492.56463 L 616.05907,495.25388 L 612.9222,494.58156 L 611.93161,492.73271 L 613.74769,490.71577 L 615.81141,488.86693 L 616.71945,488.11058 z " id="LA" style="fill:#de8787" />
- <ns0:path d="M 817.62464,258.28441 L 818.55858,256.38283 L 820.84673,258.09426 L 819.7727,260.66139 L 818.09161,259.04505 L 817.62464,258.28441 z " id="path6656" style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <ns0:g id="g8180" style="fill:#cccccc">
- <ns0:path d="M 738.7284,305.32516 L 740.70958,309.02287 L 742.03037,310.36749 L 745.00215,311.2079 L 747.64373,310.53557 L 750.12022,308.18248 C 750.12022,308.18248 751.9363,309.69518 752.59669,309.52711 C 753.25709,309.35903 757.05436,308.51864 757.05436,308.51864 L 758.87045,303.64438 L 761.51202,304.65285 L 764.814,302.13167 L 766.29989,302.46782 L 768.44617,300.45089 L 768.61127,297.59356 L 767.78577,296.24894 L 772.90384,284.9877 L 775.05012,278.09649 L 775.38031,273.55838 L 777.1964,273.3903 L 778.84739,276.24763 L 780.16818,277.08802 L 782.80976,277.08802 L 783.96545,271.37336 L 784.29564,268.17988 L 787.76272,267.84373 L 788.25802,265.49063 L 791.39489,262.96946 L 792.05529,261.28868 L 793.70628,258.43134 L 794.20157,256.24633 L 794.36667,250.69975 L 798.98943,252.5486 L 804.7679,255.7421 L 805.59338,250.44764 L 809.88595,252.5486 L 809.88595,255.57402 L 815.49931,256.91864 L 817.48049,258.26326 L 818.47108,256.24633 L 820.78247,257.92711 L 819.29657,261.28868 L 818.96637,264.146 L 817.15029,266.83525 L 817.15029,269.02027 L 817.81068,270.86913 L 822.98233,272.27864 L 824.90863,273.89525 L 830.19178,274.23141 L 832.83336,276.5845 L 836.13533,277.25681 L 837.45611,278.60143 L 836.96082,283.30762 L 837.95141,284.31608 L 838.11651,286.66917 L 839.43729,288.85419 L 839.2722,290.70305 L 835.97023,289.5265 L 835.97023,290.53497 L 837.95141,292.21575 L 837.95141,293.39229 L 839.43729,294.56884 L 840.75808,296.24962 L 840.92318,298.60271 L 838.6118,300.11541 L 838.942,300.61964 L 841.58358,300.11541 L 844.88554,299.4431 L 846.04123,299.27502 L 850.20356,306.58097 L 845.21707,308.35056 L 833.49506,311.37597 L 813.92151,315.35219 L 792.88078,319.27565 L 775.38031,321.96489 L 759.22415,323.98183 L 751.9363,325.32646 L 747.32856,324.68385 L 745.16725,324.65414 L 742.69078,326.67109 L 734.60093,326.83916 L 722.3505,328.8153 L 712.13922,329.78475 L 714.95419,328.35186 L 720.73264,324.82222 L 724.69501,322.6372 L 724.69501,320.45219 L 726.51109,318.60333 L 731.13386,313.05675 L 735.42643,309.35903 L 738.7284,305.32516 z " id="VA" style="fill:#d35f5f" />
- <ns0:path d="M 845.69487,293.77543 L 844.35758,290.76684 L 844.75381,282.95122 L 847.26331,278.51396 L 847.13123,274.21116 L 853.07478,271.9253 L 852.41438,274.21116 L 849.24449,278.3795 L 848.92256,286.54808 L 848.17135,289.94326 L 846.33876,293.85948 L 845.69487,293.77543 z " id="path3106" style="fill:#d35f5f" ns1:nodetypes="cccccccccccc" />
- </ns0:g>
- <ns0:path d="M 467.38967,586.18345 L 466.81183,578.788 L 464.00514,571.30851 L 463.42729,563.99709 L 464.99573,555.42509 L 468.38027,548.28176 L 471.92989,542.65112 L 475.14933,538.95339 L 475.80972,539.20552 L 470.9393,546.09673 L 466.48163,552.90391 L 464.41788,559.79513 L 464.08769,565.17365 L 464.99573,571.56063 L 467.63732,579.04012 L 468.13261,584.41863 L 468.29771,585.93134 L 467.38967,586.18345 z M 465.65436,588.7052 L 466.64495,587.1925 L 464.82887,584.33517 L 463.83828,577.94821 L 462.0222,570.72086 L 461.1967,568.19969 L 462.0222,563.49351 L 463.17788,559.45964 L 464.49867,554.75346 L 465.98456,549.03881 L 463.67318,547.02188 L 464.66377,545.00494 L 468.79123,544.66878 L 472.7536,538.95414 L 476.22066,538.28182 L 482.16421,534.58411 L 483.98029,533.07141 L 490.41913,529.54177 L 496.19758,527.0206 L 501.64583,523.65904 L 504.4525,521.47403 L 510.23095,515.92746 L 511.55174,515.08707 L 513.69802,513.57437 L 516.33959,511.55743 L 517.33018,509.5405 L 527.40119,504.83432 L 534.17024,502.98546" id="TX_Gulf" style="fill:none;fill-opacity:0.26666697;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 900.52373,145.31564 L 900.85393,143.29871 L 902.00961,139.60099" id="NH_Atlantic" style="fill:#0000ff;fill-opacity:0;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 919.55232,177.09192 L 921.77043,176.37882 L 922.23741,174.59609 L 923.28809,174.71493 L 924.33877,177.09192 L 923.0546,177.56732 L 919.08535,177.68617 L 919.55232,177.09192 z M 909.97943,177.92387 L 912.31427,175.19033 L 913.94868,175.19033 L 915.81656,176.73537 L 913.36497,177.80501 L 911.14686,178.87466 L 909.97943,177.92387 z M 903.66061,177.08236 L 906.63237,175.56967 L 906.13708,173.21658 L 906.96257,171.70388 L 909.93434,170.19118 L 910.75983,173.38466 L 910.26454,175.23351 L 907.78806,176.74621 L 907.78806,177.75468 L 909.76924,176.24198 L 913.73161,171.5358 L 917.69397,169.51886 L 921.98653,168.00616 L 921.65633,165.48499 L 920.66574,162.45959 L 918.68456,159.93842 L 916.86848,159.09803 L 914.7222,159.26611 L 914.2269,159.77034 L 915.21749,161.11497 L 916.70338,160.27458 L 918.84966,161.95536 L 919.67515,164.81268 L 917.85907,166.66154 L 915.54769,167.67001 L 911.91552,167.16577 L 907.95316,160.94689 L 905.64178,158.25764 L 903.8257,158.25764 L 902.67001,159.09803 L 900.68883,156.40879 L 901.01902,154.89608 L 903.4955,149.51759 L 900.35862,144.81139" id="MA_Atlantic" style="fill:#0000ff;fill-opacity:0;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 771.67854,458.60093 L 771.08653,452.05785 L 773.39791,441.63702 L 774.88379,437.26699 L 774.3885,434.57775 L 778.51596,427.3504 L 777.85557,425.66962" id="GA_Atlantic" style="fill:#6666e6;fill-opacity:0;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 777.85557,425.66962 L 780.00185,424.32499 L 785.1199,418.61034 L 784.12931,415.24879 L 787.10108,415.08071 L 790.73325,411.55107 L 792.38423,410.71068 L 794.69561,407.18104 L 797.50228,404.32372 L 799.64856,400.62601 L 802.12504,399.95369 L 803.28073,397.09637 L 804.93171,396.25598 L 805.42701,389.70094 L 808.06859,383.31398 L 813.51684,377.43125" id="SC_Atlantic" style="fill:#0000ff;fill-opacity:0;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 813.18663,377.59933 L 819.46038,375.41432 L 824.24824,374.91008 L 824.74353,372.38892 L 826.72471,365.6658 L 830.19178,360.79154 L 836.79572,355.24497 L 842.07887,352.7238 L 844.88554,352.05149 L 846.04123,352.55572 L 847.36202,352.55572 L 850.49889,347.51338 L 852.48007,343.81567 L 851.15929,344.3199 L 848.84791,346.67299 L 848.18751,344.99221 L 843.89495,344.99221 L 845.87614,338.43717 L 845.05064,337.09255 L 843.06946,337.09255 L 843.06946,336.08408 L 842.73926,334.73946 L 844.39025,336.08408 L 845.87614,336.25216 L 848.35261,336.58832 L 852.14988,334.90754 L 853.47066,331.88214 L 854.13106,329.69712 L 856.77263,328.3525 L 857.10283,323.98247 L 856.27734,323.31016 L 858.75382,323.14208 L 858.09342,320.78899 L 855.61694,318.26782 L 851.98478,311.54471 L 850.1687,306.50237 M 854.21672,340.95692 L 856.85831,338.3517 L 860.07773,335.66244 L 861.64617,334.99013 L 861.81127,332.88915 L 861.15088,326.50217 L 859.66499,324.06503 L 859.00459,322.13213 L 859.74753,321.88001 L 862.55422,327.59468 L 862.96697,332.21684 L 862.80187,335.74649 L 859.33479,337.34323 L 856.44555,339.86441 L 855.28987,341.125 L 854.21672,340.95692 z " id="NC_Atlantic" style="fill:#0000ff;fill-opacity:0;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 850.1687,306.50237 L 846.04123,299.27502 L 844.88554,299.4431 L 841.58358,300.11541 L 838.942,300.61964 L 838.6118,300.11541 L 840.92318,298.60271 L 840.75808,296.24962 L 839.43729,294.56884 L 837.95141,293.39229 L 837.95141,292.21575 L 835.97023,290.53497 L 835.97023,289.5265 L 839.2722,290.70305 L 839.43729,288.85419 L 838.11651,286.66917 L 837.95141,284.31608 L 836.96082,283.30762 L 837.45611,278.60143 L 836.13533,277.25681 L 832.83336,276.5845 L 830.19178,274.23141 L 824.90863,273.89525 L 822.59725,272.21447" id="VA_Atlantic" style="fill:#0000ff;fill-opacity:0;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 893.09433,183.30123 L 896.06607,182.29279 L 898.54255,180.27585 L 899.69824,178.42699 L 901.01902,178.59507 L 903.99082,176.91428" id="RI_Atlantic" style="fill:#0000ff;fill-opacity:0;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 865.2752,198.17615 L 870.47581,194.73055 L 874.10797,191.36899 L 876.08916,189.18398 L 876.91465,189.85629 L 879.72132,188.34359 L 885.00447,187.16705 L 893.58963,183.30123" id="CT_Atlantic" style="fill:#0000ff;fill-opacity:0;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 840.75808,236.41389 L 841.91377,238.76697 L 845.21574,241.79237 L 850.1687,244.14546 L 854.29616,244.81777 L 854.46126,246.33047 L 853.63576,247.33894 L 853.96596,250.19627 L 854.79145,250.19627 L 856.93773,247.6751 L 857.76322,242.63276 L 860.5699,238.43081 L 863.70677,231.70769 L 864.86246,225.99305 L 864.20207,224.8165 L 864.03697,215.06798 L 862.38598,211.53834 L 861.23029,212.37873 L 858.42362,212.71489 L 857.92832,212.21066 L 859.08401,211.20219 L 861.23029,209.18525 L 861.06519,207.84063" id="NJ_Atlantic" style="fill:#0000ff;fill-opacity:0;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 861.06519,207.84063 L 863.04638,208.51294 L 867.17384,207.3364 L 873.11738,205.31946 L 875.75896,204.31099 L 883.02329,198.76442 L 886.98565,195.73902 L 890.45272,192.0413 L 886.16016,190.36053 L 884.83937,191.87323 L 881.8676,194.73055 L 873.77778,198.76442 L 871.4664,198.59634 L 869.81541,197.92403 L 868.65972,198.59634 L 866.34835,201.28559 L 864.86246,202.63021 L 863.54167,202.96637 L 863.21147,201.62175 L 865.19266,199.77289 L 865.52285,197.75595" id="NY_Atlantic" style="fill:#0000ff;fill-opacity:0;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 854.95655,260.95325 L 852.64517,253.38975 L 851.65458,253.89398 L 848.02242,251.37281 L 846.20633,246.49855 L 844.22515,242.80084 L 841.91377,241.79237 L 839.76749,238.09466 L 840.59298,235.90964" id="DE_Atlantic" style="fill:#cccccc;fill-opacity:0.26666697;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 29.464207,149.85375 L 27.813223,154.89608 L 27.648124,162.62767 L 22.364973,174.89736 L 19.228102,177.5866 L 18.897905,178.76315 L 17.081822,179.60354 L 15.595936,183.97356 L 14.770444,187.33512 L 17.577118,191.70515 L 19.228102,196.07518 L 20.383791,199.77289 L 20.053595,206.49601 L 18.237511,209.68949 L 17.577118,215.74029 L 16.586527,219.60608 L 18.40261,223.63995 L 21.209284,228.34614 L 23.520662,233.38847 L 24.84145,237.59042 L 24.511253,240.95198 L 24.181056,241.45621 L 24.181056,243.64123 L 29.959503,250.19627 L 29.464207,252.71743 L 28.803813,255.07053 L 28.14342,257.08746 L 28.308518,265.65943 L 30.454798,269.52523 L 32.43598,272.21447 L 35.242654,272.71871 L 36.233244,275.57603 L 35.077555,279.27375 L 32.931275,280.95453 L 31.775586,280.95453 L 30.950093,284.9884 L 31.445389,288.0138 L 34.747358,292.5519 L 36.398343,298.09847 L 37.884229,302.97273 L 39.205017,306.16621 L 42.672085,312.21702 L 44.157971,314.90627 L 44.653266,317.93167 L 46.304251,318.94014 L 46.304251,321.4613 L 45.478759,323.47824 L 43.662676,330.87367 L 43.16738,332.8906 L 45.643857,335.74793 L 49.936417,336.25216 L 54.559175,338.10102 L 58.521538,340.28603 L 61.49331,340.28603 L 64.465083,343.47951 L 67.106658,348.52185 L 68.262347,350.87494 L 72.224711,353.05995 L 77.177665,353.90034 L 78.663551,356.08536 L 79.323945,359.44692 L 77.838059,360.11923 L 78.168256,361.12769 L 81.470225,361.96808 L 84.276899,362.13616 L 87.248671,367.01042 L 91.211035,371.38045 L 92.036527,373.73354 L 94.678102,378.10356 L 95.008299,381.46512 L 95.008299,391.21364 L 95.503595,393.0625 M 50.266945,346.75563 L 51.587737,348.35237 L 51.422639,349.697 L 48.120658,349.61296 L 47.542811,348.35237 L 46.882415,346.83966 L 50.266945,346.75563 z M 52.248133,346.75563 L 53.486376,346.08332 L 57.118555,348.26833 L 60.255437,349.52892 L 59.347393,350.20124 L 54.724619,349.94912 L 53.073629,348.26833 L 52.248133,346.75563 z M 73.380812,367.34524 L 75.196895,369.78238 L 76.022398,370.79086 L 77.590839,371.37912 L 78.168678,369.86642 L 77.178087,368.01756 L 74.453957,365.91658 L 73.380812,366.08465 L 73.380812,367.34524 z M 71.894915,376.33744 L 73.711009,379.61497 L 74.949253,381.63192 L 73.463356,381.88403 L 72.142568,380.62344 C 72.142568,380.62344 71.39962,379.11074 71.39962,378.69054 C 71.39962,378.27035 71.39962,376.42148 71.39962,376.42148 L 71.894915,376.33744 z " id="CA_Pacific" style="fill:none;fill-opacity:0.26666697;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 95.99889,2.9536428 L 94.843201,3.7940324 L 94.513004,4.634422 L 96.989481,9.6767597 L 98.14517,12.366006 L 96.329087,16.063721 L 96.329087,18.416812 L 96.989481,19.929513 L 96.163989,21.77837 L 96.659284,25.139928 L 97.649875,26.484552 L 97.484776,27.829175 L 95.99889,27.997253 L 95.338496,25.980318 L 94.182807,23.459149 L 92.366724,21.946448 L 92.696921,19.761435 L 95.008299,19.257201 L 94.678102,17.408344 L 94.347905,16.231799 L 92.201625,17.576422 L 90.880838,18.752967 L 90.880838,21.274136 L 88.569459,21.442214 L 85.102391,20.433747 L 82.130619,18.921045 L 78.993748,18.248734 L 74.370991,16.063721 L 71.069021,14.046786 L 68.262347,11.357539 L 65.78587,8.3321363 L 63.63959,7.8279025 L 61.328212,17.576422 L 63.144295,20.93798 L 63.144295,29.173799 L 62.483901,32.199201 L 63.969787,39.59463 L 66.776461,42.451954 L 62.318803,43.124266 L 62.153704,46.990058 L 64.79528,48.166604 L 63.144295,52.368552 L 60.337621,52.704708 L 60.007424,55.73011 L 62.318803,58.755513 L 64.134886,57.747045 L 66.446264,59.427825 M 86.341089,9.169955 L 88.404826,9.001877 L 88.900121,10.430545 L 90.468562,8.7497548 L 92.862495,8.7497548 L 93.687987,10.3465 L 92.119546,12.111324 L 92.779951,12.951724 L 92.037002,15.052704 L 90.63366,15.472893 C 90.63366,15.472893 89.725613,15.556938 89.725613,15.220782 C 89.725613,14.884626 91.21151,12.531524 91.21151,12.531524 L 89.477971,11.943246 L 89.147774,13.455958 L 88.404826,14.12827 L 86.836385,11.775168 L 86.341089,9.169955 z " id="WA_Pacific" style="fill:none;fill-opacity:0.26666697;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 66.446264,59.427825 L 60.172522,61.44476 L 57.861144,68.167876 L 54.559175,78.588708 L 51.257205,85.311824 L 46.139153,99.934604 L 39.535214,114.05315 L 31.28029,127.16323 L 29.299109,130.18863 L 28.473616,139.09676 L 27.152829,145.31564 L 29.464207,149.85375" id="OR_Pacific" style="fill:none;fill-opacity:0.26666697;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 639.33795,481.63956 L 642.14462,481.63956 L 642.80502,481.80764 L 644.12581,478.95032 L 645.61169,474.41221 L 647.92307,475.08453 L 651.05994,481.30341 L 651.05994,482.31188 L 648.25327,484.32881 L 651.05994,484.66497 L 658.02586,481.83647" id="AL_Gulf" style="fill:none;fill-opacity:0.26666697;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 616.38926,488.36268 L 617.71005,487.52229 L 620.35163,483.15227 L 622.16771,483.99266 L 629.10185,481.97572 L 631.24813,482.31188 L 632.73401,483.15227 L 638.01716,483.15227 L 639.33795,481.63956" id="MS_Gulf" style="fill:none;fill-opacity:0.26666697;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:path d="M 533.67494,503.06949 L 538.62788,501.47276 L 546.88281,501.1366 L 557.44911,504.83432 L 564.05305,506.01086 L 567.85031,504.49816 L 571.15228,505.67471 L 574.45425,506.68317 L 575.27974,504.49816 L 571.97778,503.32162 L 569.3362,503.82585 L 566.52953,502.14507 C 566.52953,502.14507 566.69462,500.80045 567.35502,500.63237 C 568.01541,500.46429 570.49189,499.6239 570.49189,499.6239 L 572.30797,501.1366 L 574.12406,500.12814 L 577.42603,500.80045 L 578.91191,503.32162 L 579.24211,505.67471 L 583.86487,506.01086 L 585.68095,507.85972 L 584.85546,509.5405 L 583.53467,510.38089 L 585.18565,512.06167 L 593.77077,515.75938 L 597.40294,514.41476 L 598.39353,511.89359 L 601.03511,511.22128 L 602.85119,509.70858 L 604.17198,510.71704 L 604.99747,513.74245 L 602.68609,514.58284 L 603.34648,515.25515 L 606.81355,513.91053 L 609.12493,510.38089 L 609.95042,509.87666 L 607.80414,509.5405 L 608.62964,507.85972 L 608.46454,506.34702 L 610.61082,505.84279 L 611.76651,504.49816 L 612.4269,505.33855 C 612.4269,505.33855 612.2618,508.53203 613.08729,508.53203 C 613.91279,508.53203 617.37985,509.20434 617.37985,509.20434 L 621.50732,511.22128 L 622.49791,512.73398 L 625.46968,512.73398 L 626.62537,513.74245 L 628.93675,510.54897 L 628.93675,509.03627 L 627.61596,509.03627 L 624.14889,506.17894 L 618.20535,505.33855 L 614.90338,502.98546 L 616.05907,500.12814 L 618.37045,500.46429 L 618.53554,499.79198 L 616.71946,498.78351 L 616.71946,498.27928 L 620.02143,498.27928 L 621.83751,495.0858 L 620.51673,493.06886 L 620.18653,490.21154 L 618.70064,490.37962 L 616.71946,492.56463 L 616.05907,495.25388 L 612.9222,494.58156 L 611.93161,492.73271 L 613.74769,490.71577 L 616.38926,488.36268 L 617.2973,487.77441" id="LA_Gulf" style="fill:none;fill-opacity:0.26666697;stroke:#80b0f0;stroke-width:1.06612186pt" />
- <ns0:g id="Great_Lakes_borders" style="fill:none;stroke:#80b0f0" transform="matrix(1.0566302,0,0,1.0756987,-45.325399,-166.80506)">
- <ns0:path d="M 652.1875,357.8125 L 649.84375,359.21875 L 647.8125,361.09375 L 646.71875,361.40625 L 645.3125,360.46875 L 642.18749,359.53125" id="IN_Great_Lakes" style="fill:none;stroke:#80b0f0;stroke-width:1pt" />
- <ns0:path d="M 712.53906,338.43751 L 712.8125,334.6875 L 714.29687,331.75782 L 715.50782,330.39062 M 717.85156,323.16407 L 714.6875,315 L 712.5,306.25 L 710.15625,303.125 L 707.65625,301.40625 L 706.09375,302.5 L 702.34375,304.21875 L 700.46875,309.0625 L 697.8125,312.65625 L 696.71875,313.28125 L 695.3125,312.65625 C 695.3125,312.65625 692.8125,311.25 692.96875,310.625 C 693.125,310 693.4375,305.78125 693.4375,305.78125 L 696.71875,304.53125 L 697.5,301.25 L 698.125,298.75 L 700.46875,297.1875 L 700.15625,287.5 L 698.59375,285.3125 L 697.34375,284.53125 L 696.5625,282.5 L 697.34375,281.71875 L 698.90625,282.03125 L 699.0625,280.46875 L 696.71875,278.28125 L 695.46875,275.78125 L 692.96875,275.78125 L 688.59375,274.375 L 683.28125,271.09375 L 680.625,271.09375 L 680,271.71875 L 679.0625,271.25 L 676.09375,269.0625 L 673.28125,270.78125 L 670.46875,272.96875 L 670.78125,276.40625 L 671.71875,276.71875 L 673.75,277.1875 L 674.21875,277.96875 L 671.71875,278.75 L 669.21875,279.0625 L 667.8125,280.78125 L 667.5,282.8125 L 667.8125,284.375 L 668.125,289.6875 L 664.6875,291.71875 L 664.0625,291.5625 L 664.0625,287.5 L 665.3125,285.15625 L 665.9375,282.8125 L 665.15625,282.03125 L 663.28125,282.8125 L 662.34375,286.875 L 659.6875,287.96875 L 657.96875,289.84375 L 657.8125,290.78125 L 658.4375,291.5625 L 657.8125,294.0625 L 655.625,294.53125 L 655.625,295.625 L 656.40625,297.96875 L 655.3125,303.90625 L 653.75,307.8125 L 654.375,312.34375 L 654.84375,313.4375 L 654.0625,315.78125 L 653.75,316.5625 L 653.4375,319.21875 L 656.875,325 L 659.6875,331.25 L 661.09375,335.9375 L 660.3125,340.46875 L 659.375,346.25 L 657.03125,351.25 L 656.71875,353.90625 L 654.84375,356.25 L 652.1875,357.8125 M 605.4621,230.97629 L 607.22987,228.98755 L 609.3291,228.21415 L 614.52193,224.45763 L 616.73164,223.9052 L 617.17359,224.34715 L 612.20173,229.31901 L 608.99764,231.19726 L 607.0089,232.08115 L 605.4621,230.97629 z M 634.68749,287.50003 L 638.28125,279.6875 L 639.21875,275.78125 L 641.09375,271.5625 L 641.875,271.40625 L 642.96875,272.96875 L 643.59375,272.96875 L 647.96875,270.625 L 649.375,272.1875 L 649.84375,272.34375 L 651.09375,271.25 L 652.1875,268.28125 L 654.53125,267.5 L 661.25,266.875 L 663.125,264.375 L 668.125,264.21875 L 673.75,265.46875 L 675.46875,265.46875 L 678.59375,264.0625 L 680.78125,264.21875 L 682.8125,263.59375 L 686.40625,264.0625 L 687.1875,264.375 L 688.4375,264.0625 L 687.1875,263.125 L 685.9375,262.5 L 682.8125,259.53125 L 682.8125,252.8125 L 681.40625,252.34375 L 680.3125,253.4375 L 674.375,255 L 672.5,255.46875 L 669.6875,254.6875 L 669.21875,254.375 L 669.21875,248.90625 L 667.8125,248.75 L 665.3125,250 L 660.9375,251.875 L 654.53125,252.1875 L 651.25,253.28125 L 647.34375,256.71875 L 645.78125,257.65625 L 644.6875,257.65625 L 643.4375,258.4375 L 641.875,257.96875 L 640.3125,256.71875 L 638.90625,257.65625 L 635.15625,257.8125 L 632.5,255.15625 L 631.09375,252.1875 L 629.6875,251.09375 L 626.5625,250.15625 L 624.375,250.15625 L 623.125,248.90625 L 619.6875,251.71875 L 618.75,252.8125 L 617.96875,252.34375 L 618.28125,249.84375 L 620.625,246.71875 L 621.09375,244.375 L 623.28125,243.59375 L 624.6875,240.625 L 628.28125,239.6875 L 628.59375,238.75 L 627.5,237.65625 L 622.96875,238.125 L 618.75,240.46875 L 616.5625,242.65625 L 615.3125,244.375 L 613.59375,245.15625 L 611.71875,247.96875 L 611.5625,249.21875 L 607.34375,251.25 L 605,253.125 L 599.21875,254.0625 L 598.59375,254.6875 L 598.59375,255.625 L 595.15625,257.8125 L 592.5,258.59375 L 590.9375,259.53125 M 688.75238,262.0292 L 689.37738,264.45108 L 692.50239,264.60733 L 693.7524,263.43545 C 693.7524,263.43545 693.67427,262.0292 693.36177,261.87295 C 693.04927,261.7167 691.79927,260.07607 691.79927,260.07607 L 689.68989,260.31044 L 688.12738,260.46669 L 687.81488,261.56045 L 688.75238,262.0292 z M 707.34375,352.8125 L 706.09375,351.5625 L 706.25,350.15625 L 708.28125,346.5625 L 710.42969,344.60937" id="MI_Great_Lakes" style="fill:none;stroke:#80b0f0;stroke-width:1pt" />
- <ns0:path d="M 762.03126,331.40624 L 756.5625,336.875 L 755.3125,337.34375 L 751.25001,340.46875" id="PA_Great_Lakes" style="fill:none;stroke:#80b0f0;stroke-width:1pt" />
- <ns0:path d="M 773.4375,318.28125 L 773.59375,319.21875 L 772.5,320.15625 L 770.46875,322.8125 L 770,324.375 L 768.125,326.09375 L 766.40625,327.1875 L 765.46875,328.75 L 764.21875,329.84375 L 761.56251,331.71874 M 823.75,260.46875 L 821.25,262.34375 L 819.21875,264.6875 L 816.5625,268.28125 L 813.75,272.65625 L 812.34375,275.46875 L 811.71875,276.25 L 806.09375,281.5625 L 806.25,284.0625 L 807.03125,285.15625 L 808.75,285.9375 L 810.46875,285.9375 L 810.46875,287.34375 L 809.375,289.375 L 809.6875,290.78125 L 811.09375,292.8125 L 810.9375,295 L 809.0625,296.09375 L 807.03125,296.09375 L 805.46875,297.96875 L 803.75,301.09375 L 801.71875,302.8125 L 796.71875,303.28125 L 794.21875,304.375 L 792.1875,305.625 L 790.625,305.46875 L 788.75,304.21875 L 782.65625,304.375 L 779.53125,304.84375 L 775.625,306.09375 L 771.40625,307.5 L 768.59375,309.21875" id="NY_Great_Lakes" style="fill:none;stroke:#80b0f0;stroke-width:1pt" />
- <ns0:path d="M 751.40626,340.46875 L 744.375,344.0625 L 740.625,346.25 L 737.34375,349.84375 L 733.4375,353.59375 L 730.3125,354.375 L 727.5,354.84375 L 722.1875,357.34375 L 720.15625,357.5 L 716.875,354.53125 L 711.875,355.15625 L 709.375,353.75 L 706.71874,352.34374" id="OH_Great_Lakes" style="fill:none;stroke:#80b0f0;stroke-width:1pt" />
- <ns0:path d="M 642.5,359.6875 L 641.25,358.90625 L 640.46875,356.40625 L 639.21875,352.8125 L 637.65625,351.09375 L 636.25,348.59375 L 636.09375,343.12504" id="IL_Great_Lakes" style="fill:none;stroke:#80b0f0;stroke-width:1pt" />
- <ns0:path d="M 590.9375,259.53125 L 590.3125,260.78125 L 589.21875,260.625 L 588.59375,259.53125 L 585.9375,258.75 L 584.84375,258.90625 L 583.125,259.84375 L 582.1875,259.21875 L 582.8125,257.34375 L 584.6875,254.375 L 585.78125,253.28125 L 583.90625,251.875 L 581.875,252.65625 L 579.0625,254.53125 L 571.875,257.65625 L 569.0625,258.28125 L 566.25,257.8125 L 565.46875,256.875 M 636.25,343.43744 L 636.09375,339.375 L 634.53125,335 L 633.90625,329.0625 L 632.8125,326.71875 L 633.75,323.75 L 634.53125,320.9375 L 635.9375,318.4375 L 635.3125,315.15625 L 634.6875,311.71875 L 635.15625,310 L 637.03125,307.65625 L 637.1875,305 L 636.40625,303.75 L 637.03125,301.25 L 637.5,298.125 L 640.15625,292.65625 L 642.96875,286.09375 L 643.125,283.90625 L 642.8125,282.96875 L 642.03125,283.4375 L 637.96875,289.53125 L 635.3125,293.4375 L 633.4375,295.15625 L 632.65625,297.34375 L 631.25,298.125 L 630.15625,300 L 628.75,299.6875 L 628.59375,297.96875 L 629.84375,295.625 L 631.875,291.09375 L 633.59375,289.53125 L 634.68749,287.03127" id="WI_Great_Lakes" style="fill:none;stroke:#80b0f0;stroke-width:1pt" />
- <ns0:path d="M 565.9375,257.34374 L 565.3125,256.5625 L 568.59375,253.59375 L 569.84375,253.4375 L 574.21875,248.59375 L 575.9375,247.8125 L 578.125,244.0625 L 580.46875,240.625 L 583.4375,238.125 L 587.5,236.40625 L 595,232.8125 L 597.8125,232.03125 C 597.8125,232.03125 600.78125,230.3125 601.09375,229.6875 C 601.40625,229.0625 601.71875,228.28125 601.71875,228.28125" id="MN_Great_Lakes" style="fill:none;stroke:#80b0f0;stroke-width:1pt" />
- </ns0:g>
- <ns0:path d="M 152.15345,458.16063 L 151.84095,540.66102 L 153.40345,541.59852 L 156.37222,541.75477 L 157.77847,540.66102 L 160.27848,540.66102 L 160.43474,543.47353 L 167.15352,550.03606 L 167.62227,552.53607 L 170.90353,550.66106 L 171.52854,550.50481 L 171.84104,547.53605 L 173.24729,545.97354 L 174.34105,545.81729 L 176.21606,544.41103 L 179.18482,546.44229 L 179.80983,549.25481 L 181.68483,550.34856 L 182.77859,552.69232 L 186.52861,554.41108 L 189.80987,560.19236 L 192.46613,563.94237 L 194.65364,566.59864 L 196.0599,570.1924 L 200.90367,571.91116 L 205.9037,573.94242 L 206.8412,578.16119 L 207.30995,581.12995 L 206.37245,584.41122 L 204.65369,586.59873 L 203.09118,585.81748 L 201.68493,582.84871 L 199.02866,581.44246 L 197.30991,580.3487 L 196.52865,581.12995 L 197.93491,583.78622 L 198.09116,587.37998 L 196.9974,587.84873 L 195.1224,585.97373 L 193.09114,584.72372 L 193.55989,586.28623 L 194.80989,588.00499 L 194.02864,588.78624 C 194.02864,588.78624 193.24739,588.47374 192.77864,587.84873 C 192.30988,587.22373 190.74738,584.56747 190.74738,584.56747 L 189.80987,582.37996 C 189.80987,582.37996 189.49737,583.62997 188.87237,583.31746 C 188.24736,583.00496 187.62236,581.91121 187.62236,581.91121 L 189.34112,580.0362 L 187.93486,578.62994 L 187.93486,573.78617 L 187.15361,573.78617 L 186.37236,577.06743 L 185.2786,577.53619 L 184.3411,573.94242 L 183.71609,570.34865 L 182.93484,569.8799 L 183.24734,575.34868 L 183.24734,576.44243 L 181.84108,575.19243 L 178.40357,569.41115 L 176.37231,568.9424 L 175.74731,565.34863 L 174.1848,562.53612 L 172.62229,561.44236 L 172.62229,559.25485 L 174.65355,558.00485 L 174.1848,557.69235 L 171.68479,558.31735 L 168.40352,555.97359 L 165.90351,553.16107 L 161.21599,550.66106 L 157.30972,548.16105 L 158.55973,545.03604 L 158.55973,543.47353 L 156.84097,545.03604 L 154.02846,546.12979 L 150.43469,545.03604 L 144.96591,542.69228 L 139.65339,542.69228 L 139.02839,543.16103 L 132.77836,539.41101 L 130.7471,539.09851 L 128.09084,533.47348 L 124.65332,533.78598 L 121.2158,535.19224 L 121.68456,539.56726 L 122.77831,536.75475 L 123.71582,537.06725 L 122.30956,541.28602 L 125.43457,538.62976 L 126.05958,540.19226 L 122.30956,544.41103 L 121.05955,544.09853 L 120.5908,542.22352 L 119.3408,541.44227 L 118.09079,542.53603 L 115.43453,540.81727 L 112.46576,542.84853 L 110.74701,544.87979 L 107.46574,546.91105 L 102.93447,546.75479 L 102.46572,544.72354 L 106.05948,544.09853 L 106.05948,542.84853 L 103.87197,542.22352 L 104.80948,539.87976 L 106.99699,536.12975 L 106.99699,534.41099 L 107.15324,533.62973 L 111.37201,531.44222 L 112.30951,532.69223 L 114.96578,532.69223 L 113.71577,530.19222 L 110.122,529.87972 L 105.27823,532.53598 L 102.93447,535.81724 L 101.21571,538.31726 L 100.12196,540.50477 L 96.059441,541.91102 L 93.090671,544.41103 L 92.778171,545.97354 L 94.965681,546.91105 L 95.746941,548.9423 L 93.090671,552.06732 L 86.840651,556.12984 L 79.340608,560.19236 L 77.309348,561.28611 L 72.153076,562.37987 L 66.996796,564.56738 L 68.715556,565.81738 L 67.309296,567.22364 L 66.840546,568.31739 L 64.184286,567.37989 L 61.059276,567.53614 L 60.278016,569.72365 L 59.340516,569.72365 L 59.653016,567.37989 L 56.215496,568.6299 L 53.402986,569.5674 L 50.121721,568.31739 L 47.309208,570.1924 L 44.184194,570.1924 L 42.152934,571.44241 L 40.590427,572.22366 L 38.559168,571.91116 L 36.059156,570.81741 L 33.871646,571.44241 L 32.934142,572.37991 L 31.371634,571.28616 L 31.371634,569.41115 L 34.340398,568.16114 L 40.434176,568.78615 L 44.652946,567.22364 L 46.684205,565.19238 L 49.496718,564.56738 L 51.215476,563.78612 L 53.871739,563.94237 L 55.434246,565.19238 L 56.371746,564.87988 L 58.559256,562.22362 L 61.528026,561.28611 L 64.809286,560.66111 L 66.059296,560.34861 L 66.684296,560.81736 L 67.465556,560.81736 L 68.715556,557.22359 L 72.621826,555.81734 L 74.496836,552.22357 L 76.684348,547.84855 L 78.246858,546.44229 L 78.559358,543.94228 L 76.996848,545.19229 L 73.715576,545.81729 L 73.090576,543.47353 L 71.840576,543.16103 L 70.903066,544.09853 L 70.746816,546.91105 L 69.340556,546.75479 L 67.934306,541.12977 L 66.684296,542.37977 L 65.590546,541.91102 L 65.278046,540.03601 L 61.371776,540.19226 L 59.340516,541.28602 L 56.840506,540.97352 L 58.246756,539.56726 L 58.715506,537.06725 L 58.090506,535.19224 L 59.496766,534.25474 L 60.746766,534.09849 L 60.121766,532.37973 L 60.121766,528.16096 L 59.184266,527.22345 L 58.403006,528.62971 L 52.465482,528.62971 L 51.059226,527.3797 L 50.434223,523.62969 L 48.402963,520.19217 L 48.402963,519.25467 L 50.434223,518.47341 L 50.590473,516.44215 L 51.684228,515.3484 L 50.902975,514.87965 L 49.652969,515.3484 L 48.559214,512.69214 L 49.496718,507.84836 L 53.871739,504.72335 L 56.371746,503.16084 L 58.246756,499.56708 L 60.903026,498.31707 L 63.403036,499.41083 L 63.715536,501.75459 L 66.059296,501.44208 L 69.184306,499.09832 L 70.746816,499.72333 L 71.684316,500.34833 L 73.246826,500.34833 L 75.434338,499.09832 L 76.215598,494.87955 C 76.215598,494.87955 76.528098,492.06704 77.153098,491.59829 C 77.778098,491.12954 78.090598,490.66079 78.090598,490.66079 L 76.996848,488.78578 L 74.496836,489.56703 L 71.371816,490.34828 L 69.496806,489.87953 L 66.059296,488.16077 L 61.215526,488.00452 L 57.778006,484.41076 L 58.246756,480.66074 L 58.871766,478.31698 L 56.840506,476.59822 L 54.965494,473.00445 L 55.434246,472.2232 L 61.996776,471.75445 L 64.028036,471.75445 L 64.965536,472.69195 L 65.590546,472.69195 L 65.434296,471.12944 L 69.184306,470.50444 L 71.684316,470.81694 L 73.090576,471.9107 L 71.684316,473.94196 L 71.215566,475.34821 L 73.871836,476.91072 L 78.715608,478.62948 L 80.434368,477.69198 L 78.246858,473.47321 L 77.309348,470.34819 L 78.246858,469.56694 L 74.965588,467.69193 L 74.496836,466.59817 L 74.965588,465.03567 L 74.184336,461.28565 L 71.371816,456.75438 L 69.028056,452.69186 L 71.840576,450.81685 L 74.965588,450.81685 L 76.684348,451.44185 L 80.746868,451.2856 L 84.340631,447.84809 L 85.434391,444.87932 L 89.028161,442.53556 L 90.590661,443.47307 L 93.246921,442.84806 L 96.840691,440.8168 L 97.934451,440.66055 L 98.871951,441.44181 L 103.24697,441.28556 L 105.90323,438.31679 L 106.99699,438.31679 L 110.4345,440.66055 L 112.30951,442.69181 L 111.84076,443.78557 L 112.46576,444.87932 L 114.02827,443.31682 L 117.77829,443.62932 L 118.09079,447.22308 L 119.9658,448.62934 L 126.84083,449.25434 L 132.93461,453.31686 L 134.34086,452.37936 L 139.34089,454.87937 L 141.37215,454.25437 L 143.24716,453.47311 L 147.93468,455.34812 L 152.15345,458.16063 z M 40.902929,486.12951 L 42.934188,491.28579 L 42.777937,492.22329 L 39.965424,491.91079 L 38.246666,488.00452 L 36.527908,486.59827 L 34.184147,486.59827 L 34.027897,484.09825 L 35.746655,481.75449 L 36.84041,484.09825 L 38.246666,485.50451 L 40.902929,486.12951 z M 38.402917,518.47341 L 41.996684,519.25467 L 45.59045,520.19217 L 46.371704,521.12968 L 44.809197,524.72344 L 41.840433,524.56719 L 38.559168,521.12968 L 38.402917,518.47341 z M 18.402824,504.8796 L 19.49658,507.37961 L 20.590335,508.94212 L 19.49658,509.72337 L 17.46532,506.75461 L 17.46532,504.8796 L 18.402824,504.8796 z M 5.1215129,575.50493 L 8.4027779,573.31742 L 11.684043,572.37991 L 14.184055,572.69241 L 14.652807,574.25492 L 16.527816,574.72367 L 18.402824,572.84867 L 18.090323,571.28616 L 20.746585,570.66116 L 23.559098,573.16117 L 22.465343,574.87992 L 18.246574,575.97368 L 15.590311,575.50493 L 11.996545,574.41117 L 7.7777749,575.81743 L 6.2152679,576.12993 L 5.1215129,575.50493 z M 52.465482,571.12991 L 54.027989,573.00492 L 56.059246,571.44241 L 54.652992,570.1924 L 52.465482,571.12991 z M 55.277995,574.09867 L 56.371746,571.91116 L 58.403006,572.22366 L 57.621756,574.09867 L 55.277995,574.09867 z M 78.090598,572.22366 L 79.496858,573.94242 L 80.434368,572.84867 L 79.653108,570.97366 L 78.090598,572.22366 z M 86.528141,560.19236 L 87.621901,565.81738 L 90.434411,566.59864 L 95.278181,563.78612 L 99.496951,561.28611 L 97.934451,558.94235 L 98.403201,556.59859 L 96.371941,557.8486 L 93.559431,557.06734 L 95.121931,555.97359 L 96.996941,556.75484 L 100.74696,555.03608 L 101.21571,553.62983 L 98.871951,552.84857 L 99.653201,550.97356 L 96.996941,552.84857 L 92.465671,556.28609 L 87.778151,559.0986 L 86.528141,560.19236 z M 127.46583,540.97352 L 129.80959,539.56726 L 128.87209,537.8485 L 127.15333,538.78601 L 127.46583,540.97352 z " id="AK" style="fill:#f4d7d7" />
- <ns0:g id="g16325" style="stroke:#000000;stroke-opacity:1">
- <ns0:g id="g5778" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-opacity:1">
- <ns0:path d="M 816.92419,258.09425 C 817.71859,258.70718 818.14466,259.56702 819.77271,260.56631 L 819.77271,260.61385" id="path6654" style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:1.33265233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" ns1:nodetypes="ccc" />
- <ns0:g id="g4679" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-opacity:1">
- <ns0:g id="g3580" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-opacity:1">
- <ns0:g id="State_borders_old" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-opacity:1" transform="matrix(1.0566302,0,0,1.0756987,-45.325399,-166.80506)">
- <ns0:path d="M 389.29574,462.33445 L 395.75915,462.99736 L 406.8077,463.54979" id="CO_OK" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 389.79293,462.72114 L 389.2405,473.88019" id="NM_OK" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 389.90342,473.82495 L 388.24613,473.82494 L 386.69931,491.94483 L 382.94283,545.64053 L 380.73312,568.62152 L 352.66979,567.07472 L 324.60654,564.42309 L 316.87248,563.76016 L 317.5354,568.62152" id="NM_TX" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 299.63678,367.31684 L 319.96612,369.74752 L 355.98408,373.72497 L 379.62831,375.71374" id="WY_CO" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 379.62831,375.71374 L 411.89008,378.36539 L 410.34328,400.02056" id="NE_CO" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 410.34328,400.02056 L 406.36581,463.66023" id="CO_KS" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 379.62831,375.71374 L 383.82676,332.84535" id="WY_NE" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 383.82676,332.84535 L 385.37355,308.31756 L 386.63467,290.78272" id="WY_SD" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 386.7128,291.15996 L 388.23277,275.63418 L 388.81756,270.31054" id="MT_SD" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 388.81755,270.85742 L 389.59881,259.06782 L 391.78171,234.95517 L 393.10754,220.37107 L 394.43337,206.67087" id="MT_ND" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 389.13006,270.75248 L 443.26797,274.28802 L 499.6156,275.83481" id="ND_SD" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 490.55578,211.09029 L 492.32355,216.17262 L 491.66064,219.92913 L 491.66064,229.87283 L 493.20744,234.73419 L 494.97521,238.04876 L 495.41715,247.55052 L 497.18492,260.58781 L 498.95269,267.65888 L 499.39463,275.83481" id="ND_MN" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 499.39463,275.83481 L 499.17366,278.92841 L 497.84783,280.25424 L 495.85909,281.80103 L 495.85909,283.34783 L 496.96395,285.1156 L 500.94143,288.43017 L 501.38337,291.30279 L 501.60434,320.69194 L 501.1624,327.32107" id="SD_MN" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 501.1624,327.32107 L 499.39463,327.32107 L 498.51074,329.75176 L 498.95269,332.40341 L 501.60434,334.39215 L 500.27851,339.91643 L 498.51074,344.11488 L 500.05754,346.76653 L 501.60434,348.97624" id="SD_IA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 501.60434,348.97624 L 499.83657,348.97624 L 498.0688,348.97624 L 497.18492,346.9875 L 496.74297,345.4407 L 493.87035,343.89391 L 489.00899,342.34711 L 487.24122,341.02128 L 484.58957,341.24225 L 480.83306,341.68419 L 476.63461,343.01002 L 475.52975,342.12614 L 470.88936,339.25351 L 468.90062,337.0438 L 458.51498,337.48574 L 435.53399,336.38089 L 418.29824,335.27603 L 398.85279,334.17118 L 383.82676,333.50826" id="SD_NE" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 500.94143,327.32107 L 512.21095,327.32107 L 560.16167,326.65816 L 577.61839,325.99525 L 581.59587,325.99525" id="MN_IA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 581.59587,325.99525 L 580.71198,318.7032 L 578.72324,316.05155 L 571.87314,312.07407 L 568.11663,306.54979 L 564.80207,306.10785 L 563.0343,303.01426 L 559.71973,303.01426 L 556.84711,300.14163 L 556.40516,293.73347 L 556.40516,289.97696 L 558.17293,286.88337 L 557.51002,283.78977 L 555.07934,281.80103 L 554.6374,281.58006 L 556.84711,275.83481 L 561.92944,272.07831 L 563.0343,270.53151 L 563.0343,262.35558 L 563.25527,259.70393 L 566.01741,256.8313" id="MN_WI" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 590.71092,259.59344 L 594.85413,264.78626 L 602.80909,265.89112 L 610.76405,268.10083 L 613.19473,269.20568 L 625.34814,271.85734 L 626.67397,274.06705 L 630.2095,275.1719 L 631.7563,285.1156 L 633.08213,286.44143 L 634.62893,287.60152" id="WI_MI" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 581.59587,325.77428 L 582.25878,329.08884 L 584.46849,330.63564 L 584.68946,331.96147 L 582.70072,335.27603 L 582.92169,338.36963 L 585.35238,342.12614 L 587.78306,343.23099 L 590.65568,343.67293 L 591.92627,346.3246" id="IA_WI" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 591.76054,345.88265 L 601.04136,346.10361 L 626.453,344.55682 L 635.95475,343.45196" id="WI_IL" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 591.76054,345.71692 L 591.98151,348.09236 L 594.19122,348.75527 L 595.0751,349.86012 L 595.51704,351.62789 L 599.27355,354.94246 L 599.93647,357.15217 L 599.27355,360.46674 L 597.50578,364.00227 L 596.84287,366.43295 L 594.63316,368.20072 L 592.86539,368.86364 L 587.78306,370.18946 L 587.12014,371.95723 L 586.45723,373.94597 L 587.12014,375.2718 L 588.88791,376.8186 L 588.66694,380.79607 L 586.89917,382.34287 L 586.23626,383.88967 L 586.23626,386.54132 L 584.46849,386.98326 L 582.92169,388.08812 L 582.70072,389.41395 L 582.92169,391.40269 L 581.15393,393.05996" id="IA_IL" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 581.3749,393.17045 L 578.06033,389.85589 L 576.95547,387.64618 L 569.44246,388.30909 L 559.9407,388.75103 L 535.41291,389.63492 L 522.37562,389.85589 L 513.31581,390.07686 L 511.98998,390.07686" id="IA_MO" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 512.53686,390.31124 L 510.66415,384.99453 L 510.44318,378.58636 L 508.89638,374.60888 L 508.23347,369.52655 L 506.02376,365.99101 L 505.13988,361.35062 L 502.48822,354.05857 L 501.1624,348.75527" id="NE_IA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 410.12231,399.79959 L 431.33554,400.68347 L 470.44713,402.00929 L 513.09483,402.45124 L 519.06105,402.45124" id="NE_KS" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 519.06105,402.45124 L 515.96746,398.47376 L 513.53678,394.71725 L 513.75775,392.50754 L 512.43192,390.07686" id="NE_MO" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 518.84008,402.45124 L 521.93368,405.10289 L 524.14339,405.32386 L 525.46921,406.20775 L 525.46921,409.08037 L 523.70145,410.62717 L 523.2595,412.83688 L 525.24824,416.15145 L 527.67893,419.02407 L 530.10961,420.79184 L 531.43543,432.06136 L 530.77252,466.53285" id="KS_MO" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 530.77252,466.53285 L 517.95614,467.19576 L 473.09935,466.75383 L 429.56781,464.76507 L 406.08959,463.43925" id="KS_OK" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 388.4119,473.88015 L 410.34328,474.92975 L 440.39535,476.03461 L 439.06952,499.0156 L 438.62758,516.25134 L 438.84855,517.79814 L 443.047,521.33368 L 445.03574,522.43853 L 445.69866,522.21756 L 446.36157,520.22882 L 447.6874,521.99659 L 449.67614,521.99659 L 449.67614,520.67076 L 452.32779,521.99659 L 451.88585,525.7531 L 455.86333,525.97407 L 458.29401,527.07893 L 462.27149,527.74184 L 464.70217,529.50961 L 466.91188,527.52087 L 470.22645,528.18378 L 472.65713,531.49835 L 473.54101,531.49835 L 473.54101,533.70806 L 475.75072,534.37097 L 477.96043,532.16126 L 479.7282,532.82417 L 482.15888,532.82417 L 483.04277,535.25486 L 487.68316,537.02262 L 489.00899,536.35971 L 490.77676,532.38223 L 491.88161,532.38223 L 492.98647,534.37097 L 496.96395,535.03388 L 500.49948,536.35971 L 503.37211,537.2436 L 505.13988,536.35971 L 505.80279,533.92903 L 510.00124,533.92903 L 511.98998,534.81291 L 514.64163,532.82417 L 515.74649,532.82417 L 516.4094,534.37097 L 520.38688,534.37097 L 521.93368,532.38223 L 523.70145,532.82417 L 525.69019,535.25486 L 528.78378,537.02262 L 531.87738,537.90651 L 534.52903,539.45331" id="OK_TX" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 534.52903,539.45331 L 534.30806,502.55125 L 532.98222,491.94454 L 532.98223,483.98957 L 531.43543,477.36043" id="OK_AR" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 531.43543,477.36043 L 530.99349,470.7313 L 530.77252,465.86994" id="OK_MO" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 531.43543,477.36043 L 553.97448,476.91849 L 576.51353,476.25558 L 596.6219,475.37169 L 607.22851,474.92975 L 608.99628,477.80238 L 608.55434,480.01209 L 605.46074,482.66374 L 604.79783,485.53636 L 610.76405,485.97831 L 615.62541,485.31539" id="MO_AR" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 615.62541,485.31539 L 617.61415,479.1282 L 617.61415,473.38295" id="MO_TN" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 617.33793,473.99063 L 620.26581,472.2781 L 621.59163,470.7313 L 623.58037,469.62645 L 623.80134,466.53285 L 624.68523,464.76508 L 623.13842,462.27915" id="MO_KY" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 623.58037,462.55537 L 620.48678,462.77634 L 618.71901,460.7876 L 617.17221,456.81012 L 618.05609,453.9375 L 616.06735,450.84391 L 614.07862,445.98254 L 609.65919,445.31963 L 603.472,440.23729 L 601.26229,436.48079 L 601.92521,433.38719 L 604.13492,427.64194 L 604.79783,424.10641 L 602.14618,422.78058 L 595.95899,422.33864 L 595.0751,421.01281 L 595.29607,416.81436 L 589.99277,413.27882 L 582.92169,405.98678 L 580.71198,398.9157 L 580.27004,395.38017 L 581.3749,392.28657" id="MO_IL" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 534.52903,538.79039 L 536.73874,541.0001 L 539.61136,539.67428 L 542.26302,540.77913 L 542.92593,551.38574" id="TX_AR" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 542.92593,551.38574 L 542.92593,560.8875 L 543.58884,569.94731 L 544.25176,573.70382 L 546.68244,577.6813 L 547.56632,582.54267 L 551.76477,587.84597 L 551.98574,590.93957 L 552.64866,591.60248 L 551.98574,599.77841 L 549.11312,604.63977 L 550.65992,606.62851 L 549.997,609.05919 L 549.33409,616.13027 L 548.00826,619.22386 L 548.28448,622.70416" id="TX_LA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 542.87069,551.88293 L 564.36012,551.60672 L 582.92169,550.72283 L 593.30733,550.72283" id="AR_LA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 593.52831,550.72283 L 593.74928,556.02614 L 595.73802,560.44556 L 595.51704,562.21333 L 597.72676,563.9811 L 597.06384,567.07469 L 595.95899,567.07469 L 596.84287,569.06343 L 591.76054,577.90227 L 588.44597,583.86849 L 587.78306,591.60248 L 588.225,593.14928 L 611.64793,592.48636 L 619.60289,591.82345 L 621.37066,591.60248 L 622.03357,592.48636 L 620.92872,599.77841 L 624.24328,602.872 L 625.34814,606.62851 L 626.61872,609.00395" id="LA_MS" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 593.41781,550.99905 L 594.79888,548.29215 L 594.41219,544.0937 L 593.08636,541.22107 L 594.41219,539.89525 L 593.08636,537.90651 L 593.52831,536.13874 L 594.41219,530.17252 L 597.28481,527.52087 L 596.6219,525.53213 L 600.15744,520.44979 L 602.80909,519.56591 L 602.80909,517.13523 L 602.14618,515.8094 L 604.79783,510.72707 L 607.44948,509.62221 L 607.44948,506.08667" id="AR_MS" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 642.50096,359.68676 L 643.28221,370.93678 L 644.53221,385.78055 L 645.78222,401.24932 L 646.25097,407.96808 L 645.46972,413.28059 L 645.78222,416.40559 L 647.50097,419.06185 L 647.96972,424.68686 L 645.46972,428.74936 L 643.75096,432.49937 L 641.56346,435.31187 L 641.09471,439.68688 L 641.09471,443.28063" id="IL_IN" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 641.09471,443.28063 L 640.15721,446.56189 L 639.06346,447.34314 L 639.68846,449.21814 L 640.46971,450.9369 L 638.90721,451.5619 L 636.4072,452.1869 L 634.5322,453.59315 L 634.2197,455.78065 L 635.4697,458.12441 L 635.31345,460.31191 L 634.2197,460.62441 L 630.78219,459.37441 L 628.12594,458.12441 L 626.09469,458.74941 L 623.90718,460.46816 L 623.12593,462.34316" id="IL_KY" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 641.25096,443.43688 L 644.06346,441.71813 L 649.68847,440.78063 L 653.12598,440.31188 L 654.53223,442.18688 L 656.25098,442.96813 L 657.96973,439.84313 L 660.78224,438.43688 L 662.65724,439.99938 L 663.43849,441.09313 L 665.46975,440.62438 L 665.31349,437.34313 L 668.126,435.78062 L 669.21975,434.99937 L 670.3135,436.56187 L 674.84476,436.56187 L 675.62601,434.53062 L 675.31351,432.34312 L 678.12601,428.90561 L 682.65727,425.15561 L 683.12602,420.7806 L 685.78228,420.4681 L 689.53228,418.74935 L 692.18854,416.87434 L 691.87603,414.99934 L 690.46978,413.59309 L 690.93853,411.40559" id="IN_KY" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 690.93853,411.40559 L 690.46978,405.93683 L 687.96978,383.28054 L 686.25103,369.99927 L 684.84477,355.7805" id="IN_OH" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 684.84477,355.7805 L 684.68852,354.68675 L 678.75102,355.31175 L 657.50098,357.49926 L 652.96973,357.49926" id="IN_MI" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 615.46967,485.07202 L 614.58577,488.10878 L 613.28217,492.34321 L 612.96967,494.84321 L 609.06341,497.03071 L 610.46966,500.46822 L 609.53216,504.99948 L 606.87591,506.09323" id="AR_TN" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 607.65716,506.56198 L 615.93842,506.24948 L 639.21971,504.37448 L 642.96971,504.21823" id="TN_MS" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 644.51654,503.77628 L 644.53221,510.31198 L 644.68846,526.40576 L 643.90721,556.4058 L 643.75096,569.99957 L 646.40722,588.1246 L 647.9524,603.33611" id="MS_AL" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 642.65721,504.21823 L 652.18848,503.74947 L 679.06352,501.24947 L 689.03673,500.46822" id="TN_AL" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 199.86827,240.25868 L 200.31021,231.08839 L 203.84575,215.17847 L 208.15468,195.07011 L 211.8007,182.03283 L 212.5741,178.27632" id="WA_ID" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 105.11516,210.08273 L 107.72336,210.64857 L 108.38627,213.07925 L 112.36375,213.63168 L 114.57346,217.38818 L 114.35249,224.9012 L 113.68958,225.6746 L 119.43482,229.65208 L 125.40104,229.98353 L 127.27929,228.21576 L 131.47774,229.65208 L 132.25114,229.54159 L 137.33348,231.53033 L 138.99076,232.85615 L 143.52066,233.07713 L 144.736,232.41421 L 147.0562,233.96101 L 151.36513,234.51344 L 156.66844,232.5247 L 157.11038,233.85052 L 172.02592,233.74004 L 186.61001,237.16509 L 200.38279,240.66827" id="WA_OR" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 199.97875,240.59014 L 201.19409,244.6781 L 204.50866,247.21927 L 204.28769,250.86529 L 200.53118,255.06374 L 196.77467,260.6985 L 195.89079,261.36141 L 195.33836,264.45501 L 194.23351,265.55986 L 192.46574,266.0018 L 188.1568,271.30511 L 187.82535,274.28822 L 187.38341,275.39307 L 188.1568,276.38744 L 190.58749,276.27696 L 191.80283,278.48667 L 189.37215,284.23191 L 188.04632,288.31988 L 183.84787,305.44513 L 179.53894,322.90184" id="OR_ID" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 134.1294,312.29523 L 126.28493,342.89971 L 119.54531,367.97992 L 117.96384,374.32659 L 129.93095,392.28673 L 151.91756,424.99044 L 170.7001,453.05375 L 184.73175,475.04037 L 187.28633,478.33598" id="CA_NV" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 179.25879,323.29247 L 199.53681,327.65271 L 208.92808,329.53097 L 217.8774,331.29873 L 225.72187,333.17699" id="ID_NV" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 225.5009,333.28747 L 237.87528,335.49718 L 249.47626,337.48592 L 259.41995,339.25369 L 267.48539,340.57952 L 272.23627,341.24243" id="ID_UT" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 187.05195,478.02348 L 186.61001,481.33804 L 189.26166,486.08892 L 190.477,491.72368 L 191.2504,492.71805 L 192.24477,493.27048 L 192.13428,495.48019 L 190.58749,496.80601 L 187.27292,498.46329 L 185.39467,500.34155 L 183.95836,503.87708 L 183.40593,508.62796 L 180.64379,511.27961 L 178.65505,511.94253 L 178.54457,517.57729 L 178.10262,519.23457 L 178.54457,520.00797 L 182.0801,520.56039 L 181.52767,523.21205 L 180.09136,525.31127 L 176.44534,526.19515" id="CA_AZ" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 187.27292,478.24445 L 188.59875,476.03474 L 189.15117,463.88133 L 189.37215,462.22405 L 189.48263,455.48444 L 191.36088,454.49007 L 192.24477,453.93764 L 193.12865,453.93764 L 194.01254,455.04249 L 196.66419,455.37395 L 197.87953,458.0256 L 200.31021,458.13609 L 201.96749,455.59492 L 202.40943,455.15298 L 205.40595,437.74758" id="NV_AZ" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 205.28206,438.35918 L 207.16031,427.86306 L 210.2539,413.16849 L 213.45798,397.14809 L 215.55721,384.00032 L 217.43546,375.38245 L 221.08148,355.60554 L 224.50653,338.70126 L 225.61139,333.50844" id="NV_UT" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 70.710722,294.61753 L 77.560823,296.82724 L 88.609373,299.69986 L 95.901416,301.6886 L 108.05482,305.66608 L 121.09211,308.98065 L 134.1294,312.73715" id="OR_CA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 133.68746,312.68584 L 166.39117,320.47114 L 179.64943,323.34376" id="OR_NV" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 226.27435,180.81733 L 221.85493,201.58861 L 225.1695,208.88065 L 223.84367,213.30007 L 225.61144,217.71949 L 228.70504,219.04532 L 232.24057,228.98902 L 235.77611,232.52455 L 236.21805,233.62941 L 239.53262,234.73427 L 239.97456,236.723 L 233.12446,253.73778 L 233.12446,256.16846 L 235.55514,259.26205 L 236.43902,259.26205 L 241.07941,256.38943 L 241.74233,255.28457 L 243.28913,255.94749 L 243.06815,261.02982 L 245.71981,273.18323 L 248.59243,275.61391 L 249.47631,276.27682 L 251.24408,278.48653 L 250.80214,281.8011 L 251.46505,285.11566 L 252.56991,285.99955 L 254.77962,283.78984 L 257.43127,283.78984 L 260.52487,285.33664 L 262.95555,284.45275 L 266.93303,284.45275 L 270.46856,285.99955 L 273.12022,285.55761 L 273.56216,282.68498 L 276.43478,282.02207 L 277.76061,283.3479 L 278.20255,286.44149 L 280.63323,288.6512" id="ID_MT" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 280.76267,289.04183 L 282.18003,277.82362 L 301.40451,280.69624 L 328.80492,284.67372 L 344.49387,286.66246 L 375.50794,289.84759 L 386.47836,290.86091" id="MT_WY" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 280.8542,288.20926 L 277.0977,312.07413 L 272.01536,341.46328" id="ID_WY" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 272.01536,341.46328 L 270.5356,351.6275 L 268.92177,363.11844 L 275.2273,364.01574 L 291.55004,366.22545 L 300.53404,367.40842" id="UT_WY" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 300.29966,367.31689 L 297.42703,388.75109 L 294.33344,410.40625 L 290.70637,437.45625 L 289.2511,448.1923 L 288.58819,452.16978" id="UT_CO" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 205.06113,437.58569 L 237.54388,443.77288 L 263.83943,448.1923 L 288.80916,451.85728" id="UT_AZ" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 288.58819,451.94881 L 284.5839,481.67727 L 277.85214,533.09881 L 274.22507,559.11977 L 272.4573,571.93609" id="AZ_NM" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 288.80916,451.72784 L 321.95482,455.92629 L 357.65689,460.20517 L 389.35099,462.33445" id="CO_NM" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 685.15727,355.93675 L 692.50104,354.68675 L 702.3448,353.12425 L 707.42849,352.54501" id="MI_OH" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 691.09478,411.56184 L 695.00104,411.24934 L 697.34479,410.46809 L 700.1573,412.03059 L 701.7198,416.24934 L 707.34481,416.56184 L 709.06356,418.2806 L 711.09481,418.43685 L 713.43857,417.0306 L 716.40732,417.49935 L 717.65732,418.9056 L 720.31358,416.40559 L 722.03233,415.15559 L 723.59483,415.15559 L 724.21983,417.81185 L 725.93859,418.74935 L 729.37609,420.7806" id="OH_KY" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 729.37609,420.7806 L 729.53234,426.09311 L 730.31359,427.65561 L 732.8136,429.06186 L 733.4386,431.24937 L 736.2511,434.84312 L 738.7511,437.49938 L 741.92187,439.62379" id="KY_WV" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 742.03236,438.90563 L 738.90736,442.65563 L 734.84485,446.09314 L 730.46984,451.2494 L 728.75109,452.96815 L 728.75109,454.9994 L 725.00108,457.03065 L 719.53233,460.31191 L 716.70413,461.72601" id="KY_VA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 717.31181,461.61552 L 666.876,466.40567 L 651.64388,468.12442 L 647.17734,468.61997 L 643.43846,468.59317 L 643.43846,472.34318 L 635.31345,472.81193 L 628.59469,473.43693 L 618.12592,473.59318" id="KY_TN" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 665.15724,603.28087 L 664.84474,595.46836 L 662.34474,593.59336 L 660.62599,591.87461 L 660.93849,588.90585 L 670.78225,587.65585 L 695.46979,584.84335 L 702.0323,584.21835 L 708.12606,584.21835" id="AL_FL" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 708.12606,584.21835 L 707.34481,580.78084 L 705.93856,579.99959 L 705.31355,579.21834 L 706.09481,576.87458 L 705.78231,571.71833 L 704.2198,567.49957 L 704.37605,565.62457 L 704.8448,562.49956 L 706.56356,557.81206 L 706.40731,555.7808 L 704.5323,554.99955 L 704.06355,551.7183 L 701.56355,548.43704 L 699.5323,542.34328 L 698.12604,535.62452 L 696.56354,530.93702 L 695.15729,524.99951 L 692.81354,515.46824 L 689.53228,507.81198 L 688.90728,504.53073 L 688.75103,502.49947 L 688.75103,500.31197" id="AL_GA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 707.81356,583.90584 L 710.46981,587.8121 L 711.87606,589.21835 L 719.53233,589.3746 L 729.98996,588.7496 L 750.78237,587.4996 L 756.04583,586.8478 L 760.46989,586.8746 L 760.62614,589.6871 L 763.12614,590.46835 L 763.43864,586.2496 L 761.87614,581.87459 L 762.96989,580.31209 L 768.5949,581.09334 L 773.59491,581.40584" id="GA_FL" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 688.75103,500.46822 L 697.03229,499.53072 L 705.1573,498.43697 L 709.84481,497.65572" id="TN_GA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 709.84481,497.65572 L 716.40732,497.18696 L 723.12608,496.40571 L 728.75109,495.46821 L 730.46984,495.31196" id="NC_GA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 730.46984,495.31196 L 730.62609,497.18696 L 728.43859,498.12447 L 727.65734,499.99947 L 727.96984,501.71822 L 729.21984,502.96822 L 733.1261,505.31198 L 736.40735,505.15573 L 739.68861,510.15573 L 740.15736,511.56199 L 742.50111,514.37449 L 742.96986,515.78074 L 747.34487,517.4995 L 750.31362,519.687 L 752.50113,522.4995 L 754.68863,523.7495 L 756.71988,525.62451 L 757.96988,528.12451 L 760.00114,529.99951 L 764.06364,531.87452 L 766.7199,537.65578 L 768.2824,542.34328 L 770.7824,542.96828 L 772.96991,544.99954 L 774.21991,548.43704 L 774.84491,550.46829 L 777.34491,551.7183 L 779.37617,550.7808" id="GA_SC" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 730.15734,494.99946 L 736.2511,492.65571 L 745.00111,488.2807 L 752.03237,487.49945 L 767.9699,487.0307 L 770.1574,488.9057 L 771.7199,492.03071 L 775.93866,491.56196 L 788.12618,490.1557 L 790.93868,490.93696 L 803.1262,498.28072 L 812.97945,506.32368" id="NC_SC" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 709.84481,497.65572 L 710.15731,492.96821 L 711.87606,491.56196 L 714.53232,490.93696 L 715.15732,487.3432 L 719.21983,484.68695 L 722.96983,483.28069 L 727.03234,479.84319 L 731.25109,477.81194 L 731.87609,474.84318 L 735.6261,471.09318 L 736.2511,470.93693 C 736.2511,470.93693 736.2511,472.03068 737.03235,472.03068 C 737.8136,472.03068 738.90736,472.34318 738.90736,472.34318 L 741.09486,468.90567 L 743.12611,468.28067 L 745.31361,468.59317 L 746.87612,465.15567 L 749.68862,462.65566 L 750.15737,460.62441 L 750.31362,456.71815" id="TN_NC" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 717.03232,461.56191 L 726.53223,460.74273 L 738.1261,458.90566 L 745.78237,458.74941 L 748.12612,456.8744 L 750.34206,456.92964" id="VA_TN" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 750.00112,456.8744 L 754.53238,457.49941 L 761.42964,456.2494 L 776.71991,454.3744 L 793.28244,451.8744 L 813.19549,448.22704 L 831.71999,444.53064 L 842.81376,441.71813 L 847.56599,440.14615" id="VA_NC" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 741.65514,439.21813 L 743.90736,442.34313 L 745.15736,443.59313 L 747.96987,444.37439 L 750.46987,443.74938 L 752.81363,441.56188 C 752.81363,441.56188 754.53238,442.96813 755.15738,442.81188 C 755.78238,442.65563 759.37614,441.87438 759.37614,441.87438 L 761.09489,437.34313 L 763.59489,438.28063 L 766.7199,435.93687 L 768.12615,436.24937 L 770.1574,434.37437 L 770.31365,431.71812 L 769.5324,430.46812 L 774.37616,419.99935 L 776.40741,413.59309 L 776.71991,409.37433 L 778.43866,409.21808 L 780.00117,411.87434 L 781.25117,412.65559 L 783.75117,412.65559 L 784.84492,407.34308 L 785.15742,404.37433 L 788.43868,404.06183 L 788.90743,401.87432 L 791.87618,399.53057 L 792.50119,397.96807 L 794.06369,395.31181 L 794.53244,393.28056 L 794.68869,388.1243 L 799.06369,389.84305 L 804.53246,392.81181 L 805.46995,387.65555" id="WV_VA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 805.15745,388.1243 L 809.37621,389.84305 L 809.37621,392.65556 L 814.68872,393.90556 L 816.56372,395.15556 L 817.50122,393.28056 L 819.68873,394.84306 L 818.28247,397.96807 L 817.96997,400.62432 L 816.25122,403.12432 L 816.25122,405.15558 L 816.87622,406.87433 L 822.13512,408.2443" id="VA_MD" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 805.6262,388.28055 L 804.21995,386.71805 L 802.34495,384.9993 L 799.53245,383.59305 L 797.94314,382.50092 L 796.15966,382.96967 L 794.21994,384.3743 L 791.71993,386.40555 L 788.90743,386.71805 L 787.65743,386.09305 L 785.93868,388.59305 L 784.53242,389.9993 L 782.18867,390.15555 L 780.00117,393.12431 L 777.96991,395.46806 L 777.65741,395.78056 L 776.71991,390.31181 L 775.31366,385.3118" id="WV_MD" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 775.64512,385.53277 L 763.62333,387.03055 L 759.14731,387.75656 L 755.60717,368.59302" id="PA_WV" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 755.93863,368.59302 L 754.53238,369.84302 L 753.59488,371.24928 L 754.68863,374.21803 L 754.68863,378.74929 L 754.21988,383.59305 L 753.90738,389.0618 L 751.71987,392.81181 L 748.75112,396.09306 L 746.56362,397.65557 L 744.53236,397.18682 L 743.28236,398.59307 L 741.09486,401.87432 L 740.15736,403.12432 L 740.15736,405.46808 L 741.25111,407.18683 L 740.78236,408.74933 L 739.06361,409.68683 L 738.59485,407.96808 L 737.34485,406.87433 L 736.09485,407.49933 L 735.15735,411.24934 L 735.0011,416.09309 L 733.4386,417.49935 L 733.28235,420.1556 L 731.40734,420.93685 L 729.21984,421.24935" id="OH_WV" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 751.25169,340.03513 L 754.06419,358.74889 L 755.78295,369.68641" id="OH_PA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 761.7015,331.46032 L 762.34546,338.28009 L 770.93923,336.87384 L 812.50182,328.43632 L 830.47061,324.53006 L 832.72285,326.59924 L 835.62687,327.49882 L 837.97063,332.65508 L 840.15813,334.53008 L 842.65814,334.68633 L 843.90814,335.78009" id="NY_PA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 843.75189,335.62383 L 847.34565,337.34259 L 851.09566,338.43634 L 855.47067,339.37384 L 857.97067,340.4676 L 858.12692,342.49885 L 857.65817,345.15511 L 858.24689,348.66681" id="NY_NJ" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 844.06439,335.46758 L 841.72064,337.96759 L 841.72064,340.93635 L 839.84563,343.9051 L 839.68938,345.46761 L 840.93939,346.71761 L 840.78314,349.06137 L 838.59563,350.15512 L 839.37688,352.81137 L 839.53313,353.90513 L 842.18939,354.21763 L 843.12689,356.71763 L 846.5644,359.06139 L 848.90815,360.62389 L 848.90815,361.40514 L 845.78315,364.3739 L 844.22064,366.5614 L 842.81439,369.21766 L 840.62689,370.46766 L 839.53313,371.24891" id="PA_NJ" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 839.37688,371.09266 L 839.22063,372.34267 L 838.66983,374.88059" id="DE_NJ" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 839.53313,371.09266 L 837.50188,371.09266 L 835.47062,372.65517 L 834.06437,374.06142" id="NY_DE" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 834.06437,374.06142 L 835.47062,378.12393 L 837.65813,383.59269 L 839.68938,392.96771 L 841.25189,399.06148 L 846.09565,398.90523 L 852.03316,397.81147" id="MD_DE" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 834.38635,373.6842 L 826.20281,375.44087 L 811.82448,378.1697 L 774.68924,385.62395" id="PA_MD" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 862.06162,339.46537 L 860.15818,337.34259 L 861.25193,335.15508 L 861.25193,327.34257 L 859.84568,320.3113 L 859.06443,316.87379" id="NY_CT" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 859.06443,316.87379 L 858.28318,311.56128 L 858.75193,301.09251" id="NY_MA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 858.75193,301.09251 L 858.28318,296.0925 L 855.31442,285.46747 L 854.68942,285.15497 L 851.87691,283.90497 L 852.65816,281.09246 L 851.87691,279.06121 L 849.37691,274.6862 L 850.31441,270.93619 L 849.53316,265.93618 L 847.1894,259.68616 L 846.5644,254.8424" id="NY_VT" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 872.65821,247.81114 L 872.97071,253.5924 L 874.84571,256.24866 L 874.84571,260.15492 L 871.25195,264.06117 L 868.75195,265.15493 L 868.75195,266.24868 L 869.8457,267.96743 L 869.8457,276.2487 L 869.06445,285.15497 L 868.9082,289.84248 L 869.8457,291.09249 L 869.68945,295.46749 L 869.2207,297.18625 L 870.7832,299.06125" id="VT_NH" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 859.06443,301.56126 L 863.90819,300.46751 L 870.4707,299.2175" id="VT_MA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 870.4707,299.2175 L 887.34574,295.15499 L 889.53325,294.52999 L 891.5645,291.40499 L 895.50868,289.5947" id="NH_MA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 896.48246,285.35698 L 894.06451,284.21747 L 893.59575,281.24871 L 889.84575,280.15496 L 889.53325,277.4987 L 882.50198,254.8424 L 877.81447,240.46737" id="NH_ME" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 859.37693,317.34254 L 880.31447,312.49878 L 885.31449,311.40503" id="MA_CT" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 885.31449,311.40503 L 886.87699,317.18629 L 887.65824,321.40505 L 888.28324,325.46756" id="CT_RI" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- <ns0:path d="M 885.15824,311.56128 L 890.78325,309.99878 L 892.34575,311.09253 L 895.62701,315.31129 L 898.43952,319.6863" id="RI_MA" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:1pt;stroke-opacity:1" />
- </ns0:g>
- <ns0:g id="g3561" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-opacity:1">
- <ns0:path d="M 242.11104,448.52821 L 258.12559,450.54515 L 259.44637,440.12432 L 276.45152,442.81356 L 290.31977,444.66242" id="NM_Mexico" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-dasharray:none;stroke-opacity:1" />
- <ns0:path d="M 289.98957,444.32625 L 292.13584,444.99855 L 294.77744,448.02394 L 296.26332,452.56207 L 301.05119,454.91517 L 302.37198,458.27673 L 309.63631,466.51255 L 310.9571,468.19333 L 316.07515,470.37834 L 317.23084,472.56336 L 318.88182,473.57182 L 319.37712,476.42915 L 322.67909,483.15227 L 322.67909,491.55616 L 324.99047,496.43042 L 332.585,504.49816 L 337.86815,506.68317 L 339.68423,508.70011 L 339.68423,509.37242 L 343.64659,511.72551 L 345.62777,512.39782 L 347.44386,513.57437 L 350.08543,514.58284 L 352.56191,512.06167 L 357.01957,505.67471 L 358.01016,501.80891 L 360.32154,498.44736 L 363.9537,496.93466 L 368.57646,495.0858 L 371.71333,497.43889 L 379.30786,498.1112 L 386.242,499.28775 L 388.88357,501.47276 L 388.88357,502.6493 L 391.52515,505.84279 L 397.63379,511.38936 L 397.79889,512.90206 L 399.61497,514.91899 L 400.44047,519.28902 L 405.88872,532.06294 L 405.72362,534.07988 L 410.01618,536.76912 L 413.64834,543.66032 L 417.11541,548.19842 L 420.41738,549.54304 L 422.06837,551.89614 L 420.74758,556.43424 L 421.40797,557.44271 L 422.72876,558.11502 L 422.39856,561.64466 L 421.73817,562.31697 L 422.39856,564.67006 L 425.70053,566.68699 L 427.02132,573.41011 L 429.1676,577.44398 L 436.92723,580.97362 L 442.21038,582.15016 L 446.50294,585.34364 L 449.80491,586.01595 L 451.1257,585.51172 L 456.73904,586.68827 L 462.51749,590.72214 L 465.65436,588.7052" id="TX_Mexico" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-dasharray:none;stroke-opacity:1" />
- <ns0:path d="M 95.503595,393.0625 L 105.7397,394.5752 L 125.88171,397.43253 L 140.74058,399.1133" id="CA_Mexico" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-dasharray:none;stroke-opacity:1" />
- <ns0:path d="M 140.74058,399.1133 L 138.4292,401.4664 L 138.099,402.9791 L 138.5943,403.98756 L 157.91082,415.08071 L 170.2932,422.98037 L 185.31716,431.8885 L 202.4874,442.30933 L 215.03489,444.8305 L 242.11104,448.52821" id="AZ_Mexico" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-dasharray:none;stroke-opacity:1" />
- <ns0:g id="g3547" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-opacity:1">
- <ns0:path d="M 876.74955,100.10268 L 848.85548,107.51359" id="VT_Canada" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-dasharray:none;stroke-opacity:1" />
- <ns0:path d="M 943.28423,76.73985 L 940.47756,76.907928 L 940.97285,78.084474 L 940.80775,78.588708 L 939.98226,78.588708 L 937.01049,76.235617 L 936.84539,71.193279 L 936.0199,69.176344 L 929.91126,69.176344 L 920.66574,38.081928 L 918.68456,37.073461 L 912.57592,34.552292 L 911.09003,34.384214 L 909.27395,36.233071 L 905.14649,39.258474 L 905.14649,40.266941 L 904.32099,41.107331 L 901.51432,40.435019 L 900.19353,38.081928 L 900.19353,36.905383 L 898.87274,36.737305 L 897.55196,36.737305 L 895.40568,41.107331 L 892.4339,50.351617 L 890.61782,55.393954 L 890.78292,60.436292 L 890.94802,61.948993 L 890.12252,64.806318 L 889.29703,65.814786 L 889.29703,72.033669 L 891.27821,74.554837 L 889.79233,78.756786 L 887.15075,83.631045 L 886.32526,89.345695 L 886.32526,92.034941 L 884.77927,91.608771 L 881.71077,91.733617" id="ME_Canada" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-dasharray:none;stroke-opacity:1" />
- <ns0:path d="M 882.59051,91.36264 L 881.5374,92.203019 L 880.87701,93.883799 L 880.21662,93.379565 L 879.22603,92.371097 L 877.74014,94.388032 L 875.84148,100.77501" id="NH_Canada" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-dasharray:none;stroke-opacity:1" />
- <ns0:g id="g3537" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-opacity:1">
- <ns0:path d="M 710.49539,188.67975 L 711.48598,189.52014 L 710.49539,190.69668 L 710.66049,191.36899 L 711.48598,191.53707 L 713.46716,190.5286 L 713.13697,180.61201 M 704.88204,204.47907 L 704.88204,198.9325 L 706.86322,196.91556 L 707.68872,196.57941" id="MI_Canada" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-dasharray:none;stroke-opacity:1" />
- <ns0:path d="M 766.79397,165.82115 L 768.77515,172.20811 L 770.59123,172.37619 L 771.91202,175.56967 M 849.4392,107.39474 L 841.58358,109.51505 L 836.96082,111.02775 L 833.65885,110.85967 L 828.0455,112.20429 L 824.7235,113.61855" id="NY_Canada" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-opacity:1" />
- <ns0:g id="g3530" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-opacity:1">
- <ns0:path d="M 179.70368,24.971818 L 163.02887,21.106058 L 139.58489,15.223331 L 119.11268,9.3406038 L 110.36246,7.3236687 L 100.45655,4.4663441 L 95.99889,2.9536428" id="WA_Canada" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-dasharray:none;stroke-opacity:1" />
- <ns0:path d="M 193.57209,27.997253 L 179.20868,25.139971" id="ID_Canada" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-dasharray:none;stroke-opacity:1" />
- <ns0:path d="M 371.21804,55.393954 L 338.69364,52.032396 L 308.81082,48.334682 L 278.92799,44.132734 L 245.9083,38.586162 L 227.08707,35.056526 L 193.57209,27.997253" id="MT_Canada" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-dasharray:none;stroke-opacity:1" />
- <ns0:path d="M 472.75352,59.76398 L 442.87077,59.427825 L 423.88445,58.755513 L 396.8083,57.410889 L 371.21804,55.393954" id="ND_Canada" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-dasharray:none;stroke-opacity:1" />
- <ns0:path d="M 590.4688,78.756786 L 585.35075,79.261019 L 584.85546,80.269487 L 584.19506,80.269487 L 582.37898,77.076006 L 573.29856,77.412162 L 572.30797,78.252552 L 571.31738,78.252552 L 570.82209,76.907928 L 569.99659,75.059071 L 567.35502,75.563305 L 564.05305,78.924863 L 562.40206,79.765253 L 559.26519,79.765253 L 556.62362,78.756786 L 556.62362,76.571773 L 555.30283,76.403695 L 554.80753,76.907928 L 552.16596,75.563305 L 551.67066,72.537902 L 550.18478,73.042136 L 549.68948,74.050604 L 547.21301,73.54637 L 541.76476,71.025201 L 537.80239,68.335954 L 534.83062,68.335954 L 533.50983,67.327487 L 531.19845,67.999799 L 530.04276,69.176344 L 529.71257,70.520967 L 524.75961,70.520967 L 524.75961,68.335954 L 518.32077,67.999799 L 517.99058,66.487097 L 513.03762,66.487097 L 511.38664,64.806318 L 509.90075,58.419357 L 509.07526,52.704708 L 507.09408,51.864318 L 504.7827,51.360084 L 504.1223,51.528162 L 503.79211,60.100136 L 472.09313,60.100136" id="MN_Canada" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-width:2.66530466;stroke-dasharray:none;stroke-opacity:1" />
- </ns0:g>
- </ns0:g>
- </ns0:g>
- </ns0:g>
- </ns0:g>
- <ns0:g id="g4675" style="fill:#000000;fill-opacity:0;stroke:#000000;stroke-opacity:1">
- <ns0:path d="M 846.52085,274.72594 L 847.80814,273.69012 L 850.29359,272.77823 L 852.1404,272.10064 L 852.89317,271.82446 L 853.40684,271.87199" id="path3995" style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:1.33265233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" ns1:nodetypes="cccccc" />
- <ns0:path d="M 817.25107,257.90409 C 818.2317,258.85489 818.79206,259.61552 818.79206,259.61552 L 819.39913,260.85156 L 819.53922,260.70894" id="path5767" style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:0.41898587;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" ns1:nodetypes="cccc" />
- </ns0:g>
- </ns0:g>
- </ns0:g>
- <ns0:path d="M 152.15345,458.16063 L 151.84095,540.66102 L 153.40345,541.59852 L 156.37222,541.75477 L 157.77847,540.66102 L 160.27848,540.66102 L 160.43474,543.47353 L 167.15352,550.03606 L 167.62227,552.53607 L 170.90353,550.66106 L 171.52854,550.50481 L 171.84104,547.53605 L 173.24729,545.97354 L 174.34105,545.81729 L 176.21606,544.41103 L 179.18482,546.44229 L 179.80983,549.25481 L 181.68483,550.34856 L 182.77859,552.69232 L 186.52861,554.41108 L 189.80987,560.19236 L 192.46613,563.94237 L 194.65364,566.59864 L 196.0599,570.1924 L 200.90367,571.91116 L 205.9037,573.94242 L 206.8412,578.16119 L 207.30995,581.12995 L 206.37245,584.41122 L 204.34118,587.14562" id="AK_Canada" style="fill:none;stroke:#000000;stroke-width:2.5;stroke-dasharray:none;stroke-opacity:1" />
- </ns0:g>
- <ns0:path d="M 127.46583,540.97352 L 129.80959,539.56726 L 128.87209,537.8485 L 127.15333,538.78601 L 127.46583,540.97352 z M 86.528141,560.19236 L 87.621901,565.81738 L 90.434411,566.59864 L 95.278181,563.78612 L 99.496951,561.28611 L 97.934451,558.94235 L 98.403201,556.59859 L 96.371941,557.8486 L 93.559431,557.06734 L 95.121931,555.97359 L 96.996941,556.75484 L 100.74696,555.03608 L 101.21571,553.62983 L 98.871951,552.84857 L 99.653201,550.97356 L 96.996941,552.84857 L 92.465671,556.28609 L 87.778151,559.0986 L 86.528141,560.19236 z M 78.090601,572.22366 L 79.496861,573.94242 L 80.434371,572.84867 L 79.653111,570.97366 L 78.090601,572.22366 z M 55.278,574.09867 L 56.371751,571.91116 L 58.403011,572.22366 L 57.621761,574.09867 L 55.278,574.09867 z M 52.465487,571.12991 L 54.027994,573.00492 L 56.059251,571.44241 L 54.652997,570.1924 L 52.465487,571.12991 z M 5.1215179,575.50493 L 8.4027829,573.31742 L 11.684048,572.37991 L 14.18406,572.69241 L 14.652812,574.25492 L 16.527821,574.72367 L 18.402829,572.84867 L 18.090328,571.28616 L 20.74659,570.66116 L 23.559103,573.16117 L 22.465348,574.87992 L 18.246579,575.97368 L 15.590316,575.50493 L 11.99655,574.41117 L 7.7777799,575.81743 L 6.2152729,576.12993 L 5.1215179,575.50493 z M 18.402829,504.8796 L 19.496585,507.37961 L 20.59034,508.94212 L 19.496585,509.72337 L 17.465325,506.75461 L 17.465325,504.8796 L 18.402829,504.8796 z M 38.402922,518.47341 L 41.996689,519.25467 L 45.590455,520.19217 L 46.371709,521.12968 L 44.809202,524.72344 L 41.840438,524.56719 L 38.559173,521.12968 L 38.402922,518.47341 z M 40.902934,486.12951 L 42.934193,491.28579 L 42.777942,492.22329 L 39.965429,491.91079 L 38.246671,488.00452 L 36.527913,486.59827 L 34.184152,486.59827 L 34.027902,484.09825 L 35.74666,481.75449 L 36.840415,484.09825 L 38.246671,485.50451 L 40.902934,486.12951 z M 204.65369,586.59873 L 203.09118,585.81748 L 201.68493,582.84871 L 199.02866,581.44246 L 197.30991,580.3487 L 196.52865,581.12995 L 197.93491,583.78622 L 198.09116,587.37998 L 196.9974,587.84873 L 195.1224,585.97373 L 193.09114,584.72372 L 193.55989,586.28623 L 194.80989,588.00499 L 194.02864,588.78624 C 194.02864,588.78624 193.24739,588.47374 192.77864,587.84873 C 192.30988,587.22373 190.74738,584.56747 190.74738,584.56747 L 189.80987,582.37996 C 189.80987,582.37996 189.49737,583.62997 188.87237,583.31746 C 188.24736,583.00496 187.62236,581.91121 187.62236,581.91121 L 189.34112,580.0362 L 187.93486,578.62994 L 187.93486,573.78617 L 187.15361,573.78617 L 186.37236,577.06743 L 185.2786,577.53619 L 184.3411,573.94242 L 183.71609,570.34865 L 182.93484,569.8799 L 183.24734,575.34868 L 183.24734,576.44243 L 181.84108,575.19243 L 178.40357,569.41115 L 176.37231,568.9424 L 175.74731,565.34863 L 174.1848,562.53612 L 172.62229,561.44236 L 172.62229,559.25485 L 174.65355,558.00485 L 174.1848,557.69235 L 171.68479,558.31735 L 168.40352,555.97359 L 165.90351,553.16107 L 161.21599,550.66106 L 157.30972,548.16105 L 158.55973,545.03604 L 158.55973,543.47353 L 156.84097,545.03604 L 154.02846,546.12979 L 150.43469,545.03604 L 144.96591,542.69228 L 139.65339,542.69228 L 139.02839,543.16103 L 132.77836,539.41101 L 130.7471,539.09851 L 128.09084,533.47348 L 124.65332,533.78598 L 121.2158,535.19224 L 121.68456,539.56726 L 122.77831,536.75475 L 123.71582,537.06725 L 122.30956,541.28602 L 125.43457,538.62976 L 126.05958,540.19226 L 122.30956,544.41103 L 121.05955,544.09853 L 120.5908,542.22352 L 119.3408,541.44227 L 118.09079,542.53603 L 115.43453,540.81727 L 112.46576,542.84853 L 110.74701,544.87979 L 107.46574,546.91105 L 102.93447,546.75479 L 102.46572,544.72354 L 106.05948,544.09853 L 106.05948,542.84853 L 103.87197,542.22352 L 104.80948,539.87976 L 106.99699,536.12975 L 106.99699,534.41099 L 107.15324,533.62973 L 111.37201,531.44222 L 112.30951,532.69223 L 114.96578,532.69223 L 113.71577,530.19222 L 110.122,529.87972 L 105.27823,532.53598 L 102.93447,535.81724 L 101.21571,538.31726 L 100.12196,540.50477 L 96.059441,541.91102 L 93.090671,544.41103 L 92.778171,545.97354 L 94.965681,546.91105 L 95.746941,548.9423 L 93.090671,552.06732 L 86.840651,556.12984 L 79.340611,560.19236 L 77.309351,561.28611 L 72.153081,562.37987 L 66.996801,564.56738 L 68.715561,565.81738 L 67.309301,567.22364 L 66.840551,568.31739 L 64.184291,567.37989 L 61.059281,567.53614 L 60.278021,569.72365 L 59.340521,569.72365 L 59.653021,567.37989 L 56.215501,568.6299 L 53.402991,569.5674 L 50.121726,568.31739 L 47.309213,570.1924 L 44.184199,570.1924 L 42.152939,571.44241 L 40.590432,572.22366 L 38.559173,571.91116 L 36.059161,570.81741 L 33.871651,571.44241 L 32.934147,572.37991 L 31.371639,571.28616 L 31.371639,569.41115 L 34.340403,568.16114 L 40.434181,568.78615 L 44.652951,567.22364 L 46.68421,565.19238 L 49.496723,564.56738 L 51.215481,563.78612 L 53.871744,563.94237 L 55.434251,565.19238 L 56.371751,564.87988 L 58.559261,562.22362 L 61.528031,561.28611 L 64.809291,560.66111 L 66.059301,560.34861 L 66.684301,560.81736 L 67.465561,560.81736 L 68.715561,557.22359 L 72.621831,555.81734 L 74.496841,552.22357 L 76.684351,547.84855 L 78.246861,546.44229 L 78.559361,543.94228 L 76.996851,545.19229 L 73.715581,545.81729 L 73.090581,543.47353 L 71.840581,543.16103 L 70.903071,544.09853 L 70.746821,546.91105 L 69.340561,546.75479 L 67.934311,541.12977 L 66.684301,542.37977 L 65.590551,541.91102 L 65.278051,540.03601 L 61.371781,540.19226 L 59.340521,541.28602 L 56.840511,540.97352 L 58.246761,539.56726 L 58.715511,537.06725 L 58.090511,535.19224 L 59.496771,534.25474 L 60.746771,534.09849 L 60.121771,532.37973 L 60.121771,528.16096 L 59.184271,527.22345 L 58.403011,528.62971 L 52.465487,528.62971 L 51.059231,527.3797 L 50.434228,523.62969 L 48.402968,520.19217 L 48.402968,519.25467 L 50.434228,518.47341 L 50.590478,516.44215 L 51.684233,515.3484 L 50.90298,514.87965 L 49.652974,515.3484 L 48.559219,512.69214 L 49.496723,507.84836 L 53.871744,504.72335 L 56.371751,503.16084 L 58.246761,499.56708 L 60.903031,498.31707 L 63.403041,499.41083 L 63.715541,501.75459 L 66.059301,501.44208 L 69.184311,499.09832 L 70.746821,499.72333 L 71.684321,500.34833 L 73.246831,500.34833 L 75.434341,499.09832 L 76.215601,494.87955 C 76.215601,494.87955 76.528101,492.06704 77.153101,491.59829 C 77.778101,491.12954 78.090601,490.66079 78.090601,490.66079 L 76.996851,488.78578 L 74.496841,489.56703 L 71.371821,490.34828 L 69.496811,489.87953 L 66.059301,488.16077 L 61.215531,488.00452 L 57.778011,484.41076 L 58.246761,480.66074 L 58.871771,478.31698 L 56.840511,476.59822 L 54.965499,473.00445 L 55.434251,472.2232 L 61.996781,471.75445 L 64.028041,471.75445 L 64.965541,472.69195 L 65.590551,472.69195 L 65.434301,471.12944 L 69.184311,470.50444 L 71.684321,470.81694 L 73.090581,471.9107 L 71.684321,473.94196 L 71.215571,475.34821 L 73.871841,476.91072 L 78.715611,478.62948 L 80.434371,477.69198 L 78.246861,473.47321 L 77.309351,470.34819 L 78.246861,469.56694 L 74.965591,467.69193 L 74.496841,466.59817 L 74.965591,465.03567 L 74.184341,461.28565 L 71.371821,456.75438 L 69.028061,452.69186 L 71.840581,450.81685 L 74.965591,450.81685 L 76.684351,451.44185 L 80.746871,451.2856 L 84.340631,447.84809 L 85.434391,444.87932 L 89.028161,442.53556 L 90.590661,443.47307 L 93.246921,442.84806 L 96.840691,440.8168 L 97.934451,440.66055 L 98.871951,441.44181 L 103.24697,441.28556 L 105.90323,438.31679 L 106.99699,438.31679 L 110.4345,440.66055 L 112.30951,442.69181 L 111.84076,443.78557 L 112.46576,444.87932 L 114.02827,443.31682 L 117.77829,443.62932 L 118.09079,447.22308 L 119.9658,448.62934 L 126.84083,449.25434 L 132.93461,453.31686 L 134.34086,452.37936 L 139.34089,454.87937 L 141.37215,454.25437 L 143.24716,453.47311 L 147.93468,455.34812 L 152.15345,458.16063" id="AK_Pacific" style="fill:none;fill-opacity:0.26666697;stroke:#80b0f0;stroke-width:1pt" />
- <ns0:g id="Frames" transform="translate(-18.307669,-131.99439)">
- <ns0:path d="M 229.21212,631.12334 L 229.68087,688.43625 L 264.68114,723.74902 M 18.429285,562.99783 L 161.86786,563.31033 L 229.52462,631.59209 L 314.68151,631.74834 L 370.43191,685.18624 L 370.11941,723.43652" id="Inset_border" style="fill:none;fill-opacity:0.75;stroke:#000000;stroke-width:1.875;stroke-dasharray:none" ns1:nodetypes="ccccccccc" />
- <ns0:rect height="590.28674" id="Outer_border" style="fill:none;stroke:#000000;stroke-width:2.5;stroke-dasharray:none" width="955.48639" x="19.444839" y="133.89751" />
- </ns0:g>
- <ns0:path d="M 822.91849,258.28198 A 4.1274123,3.62712 0 1 1 814.66366,258.28198 A 4.1274123,3.62712 0 1 1 822.91849,258.28198 z" id="DC" style="opacity:1;fill:#a02c2c;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" transform="matrix(0.9707988,0,0,1.0018987,24.345102,-0.4278704)" ns1:cx="818.79108" ns1:cy="258.28198" ns1:rx="4.1274123" ns1:ry="3.62712" ns1:type="arc" ns2:label="#DC" />
-</ns0:svg> \ No newline at end of file
diff --git a/tests/phpunit/data/media/Wikimedia-logo.svg b/tests/phpunit/data/media/Wikimedia-logo.svg
deleted file mode 100644
index 1e17acbe..00000000
--- a/tests/phpunit/data/media/Wikimedia-logo.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Wikimedia logo" viewBox="-599 -599 1198 1198" width="1024" height="1024">
-<defs>
- <clipPath id="mask">
- <path d="M 47.5,-87.5 v 425 h -95 v -425 l -552,-552 v 1250 h 1199 v -1250 z"/>
- </clipPath>
-</defs>
-<g clip-path="url(#mask)">
- <circle id="green parts" fill="#396" r="336.5"/>
- <circle id="blue arc" fill="none" stroke="#069" r="480.25" stroke-width="135.5"/>
-</g>
-<circle fill="#900" cy="-379.5" r="184.5" id="red circle"/>
-</svg> \ No newline at end of file
diff --git a/tests/phpunit/data/media/Xmp-exif-multilingual_test.jpg b/tests/phpunit/data/media/Xmp-exif-multilingual_test.jpg
deleted file mode 100644
index f7b23025..00000000
--- a/tests/phpunit/data/media/Xmp-exif-multilingual_test.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/animated-xmp.gif b/tests/phpunit/data/media/animated-xmp.gif
deleted file mode 100644
index fcba079d..00000000
--- a/tests/phpunit/data/media/animated-xmp.gif
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/animated.gif b/tests/phpunit/data/media/animated.gif
deleted file mode 100644
index a8f248b3..00000000
--- a/tests/phpunit/data/media/animated.gif
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/broken_exif_date.jpg b/tests/phpunit/data/media/broken_exif_date.jpg
deleted file mode 100644
index 82f62f57..00000000
--- a/tests/phpunit/data/media/broken_exif_date.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/exif-gps.jpg b/tests/phpunit/data/media/exif-gps.jpg
deleted file mode 100644
index 40137340..00000000
--- a/tests/phpunit/data/media/exif-gps.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/exif-user-comment.jpg b/tests/phpunit/data/media/exif-user-comment.jpg
deleted file mode 100644
index 9f23966a..00000000
--- a/tests/phpunit/data/media/exif-user-comment.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/greyscale-na-png.png b/tests/phpunit/data/media/greyscale-na-png.png
deleted file mode 100644
index 4a4b7452..00000000
--- a/tests/phpunit/data/media/greyscale-na-png.png
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/greyscale-png.png b/tests/phpunit/data/media/greyscale-png.png
deleted file mode 100644
index 340a67b4..00000000
--- a/tests/phpunit/data/media/greyscale-png.png
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/iptc-invalid-psir.jpg b/tests/phpunit/data/media/iptc-invalid-psir.jpg
deleted file mode 100644
index 01b9acf3..00000000
--- a/tests/phpunit/data/media/iptc-invalid-psir.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/iptc-timetest-invalid.jpg b/tests/phpunit/data/media/iptc-timetest-invalid.jpg
deleted file mode 100644
index b03e192a..00000000
--- a/tests/phpunit/data/media/iptc-timetest-invalid.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/iptc-timetest.jpg b/tests/phpunit/data/media/iptc-timetest.jpg
deleted file mode 100644
index db9932ba..00000000
--- a/tests/phpunit/data/media/iptc-timetest.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/jpeg-comment-binary.jpg b/tests/phpunit/data/media/jpeg-comment-binary.jpg
deleted file mode 100644
index b467fe43..00000000
--- a/tests/phpunit/data/media/jpeg-comment-binary.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/jpeg-comment-iso8859-1.jpg b/tests/phpunit/data/media/jpeg-comment-iso8859-1.jpg
deleted file mode 100644
index d9ffbac1..00000000
--- a/tests/phpunit/data/media/jpeg-comment-iso8859-1.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/jpeg-comment-multiple.jpg b/tests/phpunit/data/media/jpeg-comment-multiple.jpg
deleted file mode 100644
index 363c7385..00000000
--- a/tests/phpunit/data/media/jpeg-comment-multiple.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/jpeg-comment-utf.jpg b/tests/phpunit/data/media/jpeg-comment-utf.jpg
deleted file mode 100644
index d6d35b4b..00000000
--- a/tests/phpunit/data/media/jpeg-comment-utf.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/jpeg-iptc-bad-hash.jpg b/tests/phpunit/data/media/jpeg-iptc-bad-hash.jpg
deleted file mode 100644
index 6464c5b8..00000000
--- a/tests/phpunit/data/media/jpeg-iptc-bad-hash.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/jpeg-iptc-good-hash.jpg b/tests/phpunit/data/media/jpeg-iptc-good-hash.jpg
deleted file mode 100644
index ef970854..00000000
--- a/tests/phpunit/data/media/jpeg-iptc-good-hash.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/jpeg-padding-even.jpg b/tests/phpunit/data/media/jpeg-padding-even.jpg
deleted file mode 100644
index c83c66bd..00000000
--- a/tests/phpunit/data/media/jpeg-padding-even.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/jpeg-padding-odd.jpg b/tests/phpunit/data/media/jpeg-padding-odd.jpg
deleted file mode 100644
index 25b93308..00000000
--- a/tests/phpunit/data/media/jpeg-padding-odd.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/jpeg-xmp-alt.jpg b/tests/phpunit/data/media/jpeg-xmp-alt.jpg
deleted file mode 100644
index 0e2c3f63..00000000
--- a/tests/phpunit/data/media/jpeg-xmp-alt.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/jpeg-xmp-psir.jpg b/tests/phpunit/data/media/jpeg-xmp-psir.jpg
deleted file mode 100644
index 4d19fcbe..00000000
--- a/tests/phpunit/data/media/jpeg-xmp-psir.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/jpeg-xmp-psir.xmp b/tests/phpunit/data/media/jpeg-xmp-psir.xmp
deleted file mode 100644
index fee6ee18..00000000
--- a/tests/phpunit/data/media/jpeg-xmp-psir.xmp
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
-<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 7.30'>
-<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-
- <rdf:Description rdf:about=''
- xmlns:dc='http://purl.org/dc/elements/1.1/'>
- <dc:identifier>jpeg-xmp-psir.jpg</dc:identifier>
- </rdf:Description>
-</rdf:RDF>
-</x:xmpmeta>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<?xpacket end='w'?> \ No newline at end of file
diff --git a/tests/phpunit/data/media/landscape-plain.jpg b/tests/phpunit/data/media/landscape-plain.jpg
deleted file mode 100644
index cf296555..00000000
--- a/tests/phpunit/data/media/landscape-plain.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/nonanimated.gif b/tests/phpunit/data/media/nonanimated.gif
deleted file mode 100644
index 9e52a7f0..00000000
--- a/tests/phpunit/data/media/nonanimated.gif
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/portrait-rotated.jpg b/tests/phpunit/data/media/portrait-rotated.jpg
deleted file mode 100644
index 445feaed..00000000
--- a/tests/phpunit/data/media/portrait-rotated.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/rgb-na-png.png b/tests/phpunit/data/media/rgb-na-png.png
deleted file mode 100644
index 2f2a5ca0..00000000
--- a/tests/phpunit/data/media/rgb-na-png.png
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/rgb-png.png b/tests/phpunit/data/media/rgb-png.png
deleted file mode 100644
index 6f40cc92..00000000
--- a/tests/phpunit/data/media/rgb-png.png
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/test.jpg b/tests/phpunit/data/media/test.jpg
deleted file mode 100644
index cb084253..00000000
--- a/tests/phpunit/data/media/test.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/test.tiff b/tests/phpunit/data/media/test.tiff
deleted file mode 100644
index 6a36f760..00000000
--- a/tests/phpunit/data/media/test.tiff
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/media/xmp.png b/tests/phpunit/data/media/xmp.png
deleted file mode 100644
index 6b9f7a87..00000000
--- a/tests/phpunit/data/media/xmp.png
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/xmp/1.result.php b/tests/phpunit/data/xmp/1.result.php
deleted file mode 100644
index beead1bd..00000000
--- a/tests/phpunit/data/xmp/1.result.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-$result = array( 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => '9'
- )
-);
diff --git a/tests/phpunit/data/xmp/1.xmp b/tests/phpunit/data/xmp/1.xmp
deleted file mode 100644
index 66e15427..00000000
--- a/tests/phpunit/data/xmp/1.xmp
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/2.result.php b/tests/phpunit/data/xmp/2.result.php
deleted file mode 100644
index beead1bd..00000000
--- a/tests/phpunit/data/xmp/2.result.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-$result = array( 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => '9'
- )
-);
diff --git a/tests/phpunit/data/xmp/2.xmp b/tests/phpunit/data/xmp/2.xmp
deleted file mode 100644
index 0fa6a894..00000000
--- a/tests/phpunit/data/xmp/2.xmp
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Flash>
-<rdf:Description exif:Return="0">
-<exif:Fired>True</exif:Fired> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></rdf:Description></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/3-invalid.result.php b/tests/phpunit/data/xmp/3-invalid.result.php
deleted file mode 100644
index 5741b2c9..00000000
--- a/tests/phpunit/data/xmp/3-invalid.result.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-$result = array( 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- )
-);
diff --git a/tests/phpunit/data/xmp/3-invalid.xmp b/tests/phpunit/data/xmp/3-invalid.xmp
deleted file mode 100644
index 2425e254..00000000
--- a/tests/phpunit/data/xmp/3-invalid.xmp
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<!--
-This file has an invalid flash compoenent (one of the values are a qualifier)
--->
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
->
-<exif:DigitalZoomRatio>
-
-<rdf:Description>
-<rdf:value>
-0/10
-</rdf:value>
-<exif:foobarbaz>fred</exif:foobarbaz>
-
-</rdf:Description>
-
-</exif:DigitalZoomRatio>
-
-<exif:Flash>
-<rdf:Description exif:Return="0">
-<exif:Mode><rdf:Description>
-<rdf:value>1</rdf:value>
-<exif:Fired>False</exif:Fired> <!-- qualifier. should be ignored-->
-</rdf:Description>
-</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></rdf:Description></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/3.result.php b/tests/phpunit/data/xmp/3.result.php
deleted file mode 100644
index beead1bd..00000000
--- a/tests/phpunit/data/xmp/3.result.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-$result = array( 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => '9'
- )
-);
diff --git a/tests/phpunit/data/xmp/3.xmp b/tests/phpunit/data/xmp/3.xmp
deleted file mode 100644
index 2cf19883..00000000
--- a/tests/phpunit/data/xmp/3.xmp
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
->
-<exif:DigitalZoomRatio>
-
-<rdf:Description>
-<rdf:value>
-0/10
-</rdf:value>
-<exif:foobarbaz>fred</exif:foobarbaz>
-
-</rdf:Description>
-
-</exif:DigitalZoomRatio>
-
-<exif:Flash>
-<rdf:Description exif:Return="0">
-<exif:Fired>True</exif:Fired>
-<exif:Mode><rdf:Description>
-<rdf:value>1</rdf:value>
-<exif:Fired>False</exif:Fired> <!-- qualifier. should be ignored-->
-</rdf:Description>
-</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></rdf:Description></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/4.result.php b/tests/phpunit/data/xmp/4.result.php
deleted file mode 100644
index 5741b2c9..00000000
--- a/tests/phpunit/data/xmp/4.result.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-$result = array( 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- )
-);
diff --git a/tests/phpunit/data/xmp/4.xmp b/tests/phpunit/data/xmp/4.xmp
deleted file mode 100644
index 29eb614b..00000000
--- a/tests/phpunit/data/xmp/4.xmp
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<!-- Valid output is just the DigitalZoomRatio
-as the flash is a qualifier
--->
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/">
- <exif:DigitalZoomRatio>
-<rdf:Description>
-<rdf:value>
-0/10
-</rdf:value>
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash>
-</rdf:Description>
-</exif:DigitalZoomRatio>
-</rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/5.result.php b/tests/phpunit/data/xmp/5.result.php
deleted file mode 100644
index 5741b2c9..00000000
--- a/tests/phpunit/data/xmp/5.result.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-$result = array( 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- )
-);
diff --git a/tests/phpunit/data/xmp/5.xmp b/tests/phpunit/data/xmp/5.xmp
deleted file mode 100644
index 3cc61d68..00000000
--- a/tests/phpunit/data/xmp/5.xmp
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/">
- <exif:DigitalZoomRatio>
-<rdf:Description rdf:value="0/10">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash>
-</rdf:Description>
-</exif:DigitalZoomRatio>
-</rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/6.result.php b/tests/phpunit/data/xmp/6.result.php
deleted file mode 100644
index beead1bd..00000000
--- a/tests/phpunit/data/xmp/6.result.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-$result = array( 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => '9'
- )
-);
diff --git a/tests/phpunit/data/xmp/6.xmp b/tests/phpunit/data/xmp/6.xmp
deleted file mode 100644
index f435ab23..00000000
--- a/tests/phpunit/data/xmp/6.xmp
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/">
-<exif:DigitalZoomRatio>
-0/10
-</exif:DigitalZoomRatio>
-</rdf:Description>
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/">
-
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/7.result.php b/tests/phpunit/data/xmp/7.result.php
deleted file mode 100644
index 0efcfa36..00000000
--- a/tests/phpunit/data/xmp/7.result.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-$result = array (
- 'xmp-exif' =>
- array (
- 'CameraOwnerName' => 'Me!',
- ),
- 'xmp-general' =>
- array (
- 'LicenseUrl' => 'http://creativecommons.com/cc-by-2.9',
- 'ImageDescription' =>
- array (
- 'x-default' => 'Test image for the cc: xmp: xmpRights: namespaces in xmp',
- '_type' => 'lang',
- ),
- 'ObjectName' =>
- array (
- 'x-default' => 'xmp core/xmp rights/cc ns test',
- '_type' => 'lang',
- ),
- 'DateTimeDigitized' => '2005:04:03',
- 'Software' => 'The one true editor: Vi (ok i used gimp)',
- 'Identifier' =>
- array (
- 0 => 'http://example.com/identifierurl',
- 1 => 'urn:sha1:342524abcdef',
- '_type' => 'ul',
- ),
- 'Label' => 'Test image',
- 'DateTimeMetadata' => '2011:05:12',
- 'DateTime' => '2007:03:04 06:34:10',
- 'Nickname' => 'My little xmp test image',
- 'Rating' => '5',
- 'RightsCertificate' => 'http://example.com/rights-certificate/',
- 'Copyrighted' => 'True',
- 'CopyrightOwner' =>
- array (
- 0 => 'Bawolff is copyright owner',
- '_type' => 'ul',
- ),
- 'UsageTerms' =>
- array (
- 'x-default' => 'do whatever you want',
- 'en-gb' => 'Do whatever you want in british english',
- '_type' => 'lang',
- ),
- 'WebStatement' => 'http://example.com/web_statement',
- ),
- 'xmp-deprecated' =>
- array (
- 'Identifier' => 'http://example.com/identifierurl/wrong',
- ),
-);
diff --git a/tests/phpunit/data/xmp/7.xmp b/tests/phpunit/data/xmp/7.xmp
deleted file mode 100644
index e18e13d9..00000000
--- a/tests/phpunit/data/xmp/7.xmp
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
-<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 7.30'>
-<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-
- <rdf:Description rdf:about=''
- xmlns:aux='http://ns.adobe.com/exif/1.0/aux/'>
- <aux:OwnerName>Me!</aux:OwnerName>
- </rdf:Description>
-
- <rdf:Description rdf:about=''
- xmlns:cc='http://creativecommons.org/ns#'>
- <cc:license>http://creativecommons.com/cc-by-2.9</cc:license>
- </rdf:Description>
-
- <rdf:Description rdf:about=''
- xmlns:dc='http://purl.org/dc/elements/1.1/'>
- <dc:description>
- <rdf:Alt>
- <rdf:li xml:lang='x-default'>Test image for the cc: xmp: xmpRights: namespaces in xmp</rdf:li>
- </rdf:Alt>
- </dc:description>
- <dc:identifier>http://example.com/identifierurl/wrong</dc:identifier>
- <dc:title>
- <rdf:Alt>
- <rdf:li xml:lang='x-default'>xmp core/xmp rights/cc ns test</rdf:li>
- </rdf:Alt>
- </dc:title>
- </rdf:Description>
-
- <rdf:Description rdf:about=''
- xmlns:xmp='http://ns.adobe.com/xap/1.0/'>
- <xmp:CreateDate>2005-04-03</xmp:CreateDate>
- <xmp:CreatorTool>The one true editor: Vi (ok i used gimp)</xmp:CreatorTool>
- <xmp:Identifier>
- <rdf:Bag>
- <rdf:li>http://example.com/identifierurl
-</rdf:li>
- <rdf:li>urn:sha1:342524abcdef</rdf:li>
- </rdf:Bag>
- </xmp:Identifier>
- <xmp:Label>Test image</xmp:Label>
- <xmp:MetadataDate>2011-05-12</xmp:MetadataDate>
- <xmp:ModifyDate>2007-03-04T12:34:10-06:00</xmp:ModifyDate>
- <xmp:Nickname>My little xmp test image</xmp:Nickname>
- <xmp:Rating>7</xmp:Rating>
- </rdf:Description>
-
- <rdf:Description rdf:about=''
- xmlns:xmpRights='http://ns.adobe.com/xap/1.0/rights/'>
- <xmpRights:Certificate>http://example.com/rights-certificate/</xmpRights:Certificate>
- <xmpRights:Marked>True</xmpRights:Marked>
- <xmpRights:Owner>
- <rdf:Bag>
- <rdf:li>Bawolff is copyright owner</rdf:li>
- </rdf:Bag>
- </xmpRights:Owner>
- <xmpRights:UsageTerms>
- <rdf:Alt>
- <rdf:li xml:lang='x-default'>do whatever you want</rdf:li>
- <rdf:li xml:lang='en-GB'>Do whatever you want in british english</rdf:li>
- </rdf:Alt>
- </xmpRights:UsageTerms>
- <xmpRights:WebStatement>http://example.com/web_statement</xmpRights:WebStatement>
- </rdf:Description>
-</rdf:RDF>
-</x:xmpmeta>
-<?xpacket end='r'?>
diff --git a/tests/phpunit/data/xmp/README b/tests/phpunit/data/xmp/README
deleted file mode 100644
index bd949176..00000000
--- a/tests/phpunit/data/xmp/README
+++ /dev/null
@@ -1,3 +0,0 @@
-This directory contains a bunch of XMP files
-as well as a bunch of php files containing what the
-parsed version of the XMP looks like.
diff --git a/tests/phpunit/data/xmp/bag-for-seq.result.php b/tests/phpunit/data/xmp/bag-for-seq.result.php
deleted file mode 100644
index b5244f88..00000000
--- a/tests/phpunit/data/xmp/bag-for-seq.result.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-$result = array(
- 'xmp-general' => array(
- 'Artist' => array(
- '_type' => 'ul',
- 0 => 'The author',
- )
- )
-);
diff --git a/tests/phpunit/data/xmp/bag-for-seq.xmp b/tests/phpunit/data/xmp/bag-for-seq.xmp
deleted file mode 100644
index c6ed5b7c..00000000
--- a/tests/phpunit/data/xmp/bag-for-seq.xmp
+++ /dev/null
@@ -1 +0,0 @@
-<?xpacket begin=""?> <x:xmpmeta xmlns:x="adobe:ns:meta/"> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"> <dc:creator> <rdf:Bag> <rdf:li>The author</rdf:li> </rdf:Bag> </dc:creator> </rdf:Description> </rdf:RDF> </x:xmpmeta>
diff --git a/tests/phpunit/data/xmp/flash.result.php b/tests/phpunit/data/xmp/flash.result.php
deleted file mode 100644
index 018c0ac1..00000000
--- a/tests/phpunit/data/xmp/flash.result.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-$result = array( 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => '127'
- )
-);
diff --git a/tests/phpunit/data/xmp/flash.xmp b/tests/phpunit/data/xmp/flash.xmp
deleted file mode 100644
index b1373cc2..00000000
--- a/tests/phpunit/data/xmp/flash.xmp
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>3</exif:Return> <exif:Mode>3</exif:Mode> <exif:Function>True</exif:Function> <exif:RedEyeMode>True</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/gps.result.php b/tests/phpunit/data/xmp/gps.result.php
deleted file mode 100644
index 2d1243d5..00000000
--- a/tests/phpunit/data/xmp/gps.result.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-$result = array( 'xmp-exif' =>
- array(
- 'GPSAltitude' => -3.14159265301,
- 'GPSDOP' => '5/1',
- 'GPSLatitude' => 88.51805555,
- 'GPSLongitude' => -21.12356945,
- 'GPSVersionID' => '2.2.0.0'
- )
-);
-
diff --git a/tests/phpunit/data/xmp/gps.xmp b/tests/phpunit/data/xmp/gps.xmp
deleted file mode 100644
index e52d2c8a..00000000
--- a/tests/phpunit/data/xmp/gps.xmp
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
-<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 7.30'>
-<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-
- <rdf:Description rdf:about=''
- xmlns:exif='http://ns.adobe.com/exif/1.0/'>
- <exif:GPSAltitude>103993/33102</exif:GPSAltitude>
- <exif:GPSAltitudeRef>1</exif:GPSAltitudeRef>
- <exif:GPSDOP>5/1</exif:GPSDOP>
- <exif:GPSLatitude>88,31.083333N</exif:GPSLatitude>
- <exif:GPSLongitude>21,7.414167W</exif:GPSLongitude>
- <exif:GPSVersionID>2.2.0.0</exif:GPSVersionID>
- </rdf:Description>
-
-</rdf:RDF>
-</x:xmpmeta>
-<?xpacket end='w'?>
diff --git a/tests/phpunit/data/xmp/invalid-child-not-struct.result.php b/tests/phpunit/data/xmp/invalid-child-not-struct.result.php
deleted file mode 100644
index 5741b2c9..00000000
--- a/tests/phpunit/data/xmp/invalid-child-not-struct.result.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-$result = array( 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- )
-);
diff --git a/tests/phpunit/data/xmp/invalid-child-not-struct.xmp b/tests/phpunit/data/xmp/invalid-child-not-struct.xmp
deleted file mode 100644
index 6aa0c10b..00000000
--- a/tests/phpunit/data/xmp/invalid-child-not-struct.xmp
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode>
-
- </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/no-namespace.result.php b/tests/phpunit/data/xmp/no-namespace.result.php
deleted file mode 100644
index 3ff69201..00000000
--- a/tests/phpunit/data/xmp/no-namespace.result.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-$result = array( 'xmp-exif' =>
- array(
- 'FNumber' => '28/10',
- )
-);
diff --git a/tests/phpunit/data/xmp/no-namespace.xmp b/tests/phpunit/data/xmp/no-namespace.xmp
deleted file mode 100644
index 7d6cdb2f..00000000
--- a/tests/phpunit/data/xmp/no-namespace.xmp
+++ /dev/null
@@ -1,11 +0,0 @@
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<!-- Testing it handles random non-namespaced properties in files ok.
- Some older photoshop's did not include the rdf: prefix on about. -->
-<rdf:Description
- about=""
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:FNumber="28/10">
-</rdf:Description>
-</rdf:RDF>
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/no-recognized-props.result.php b/tests/phpunit/data/xmp/no-recognized-props.result.php
deleted file mode 100644
index b3ca9f5a..00000000
--- a/tests/phpunit/data/xmp/no-recognized-props.result.php
+++ /dev/null
@@ -1,2 +0,0 @@
-<?php
-$result = array();
diff --git a/tests/phpunit/data/xmp/no-recognized-props.xmp b/tests/phpunit/data/xmp/no-recognized-props.xmp
deleted file mode 100644
index 54e80901..00000000
--- a/tests/phpunit/data/xmp/no-recognized-props.xmp
+++ /dev/null
@@ -1,8 +0,0 @@
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/not-exif-namespace"
- exif:FNumber="2/10">
-</rdf:Description>
-</rdf:RDF>
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/utf16BE.result.php b/tests/phpunit/data/xmp/utf16BE.result.php
deleted file mode 100644
index ac7ea506..00000000
--- a/tests/phpunit/data/xmp/utf16BE.result.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-$result = array(
- 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- ),
- 'xmp-general' =>
- array(
- 'Label' => 'ôŠ¯'
- ),
-);
diff --git a/tests/phpunit/data/xmp/utf16BE.xmp b/tests/phpunit/data/xmp/utf16BE.xmp
deleted file mode 100644
index 0cf60d60..00000000
--- a/tests/phpunit/data/xmp/utf16BE.xmp
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/xmp/utf16LE.result.php b/tests/phpunit/data/xmp/utf16LE.result.php
deleted file mode 100644
index ac7ea506..00000000
--- a/tests/phpunit/data/xmp/utf16LE.result.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-$result = array(
- 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- ),
- 'xmp-general' =>
- array(
- 'Label' => 'ôŠ¯'
- ),
-);
diff --git a/tests/phpunit/data/xmp/utf16LE.xmp b/tests/phpunit/data/xmp/utf16LE.xmp
deleted file mode 100644
index 66d71f4c..00000000
--- a/tests/phpunit/data/xmp/utf16LE.xmp
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/xmp/utf32BE.result.php b/tests/phpunit/data/xmp/utf32BE.result.php
deleted file mode 100644
index ac7ea506..00000000
--- a/tests/phpunit/data/xmp/utf32BE.result.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-$result = array(
- 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- ),
- 'xmp-general' =>
- array(
- 'Label' => 'ôŠ¯'
- ),
-);
diff --git a/tests/phpunit/data/xmp/utf32BE.xmp b/tests/phpunit/data/xmp/utf32BE.xmp
deleted file mode 100644
index 06afdf92..00000000
--- a/tests/phpunit/data/xmp/utf32BE.xmp
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/xmp/utf32LE.result.php b/tests/phpunit/data/xmp/utf32LE.result.php
deleted file mode 100644
index ac7ea506..00000000
--- a/tests/phpunit/data/xmp/utf32LE.result.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-$result = array(
- 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- ),
- 'xmp-general' =>
- array(
- 'Label' => 'ôŠ¯'
- ),
-);
diff --git a/tests/phpunit/data/xmp/utf32LE.xmp b/tests/phpunit/data/xmp/utf32LE.xmp
deleted file mode 100644
index bf2097fe..00000000
--- a/tests/phpunit/data/xmp/utf32LE.xmp
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/xmp/xmpExt.result.php b/tests/phpunit/data/xmp/xmpExt.result.php
deleted file mode 100644
index beead1bd..00000000
--- a/tests/phpunit/data/xmp/xmpExt.result.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-$result = array( 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => '9'
- )
-);
diff --git a/tests/phpunit/data/xmp/xmpExt.xmp b/tests/phpunit/data/xmp/xmpExt.xmp
deleted file mode 100644
index da0383f8..00000000
--- a/tests/phpunit/data/xmp/xmpExt.xmp
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10 ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- xmlns:xmpNote="http://ns.adobe.com/xmp/note/"
- exif:DigitalZoomRatio="0/10"
- xmpNote:HasExtendedXMP="28C74E0AC2D796886759006FBE2E57B7">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/xmpExt2.xmp b/tests/phpunit/data/xmp/xmpExt2.xmp
deleted file mode 100644
index 060abb2c..00000000
--- a/tests/phpunit/data/xmp/xmpExt2.xmp
+++ /dev/null
@@ -1,8 +0,0 @@
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:FNumber="2/10">
-</rdf:Description>
-</rdf:RDF>
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/zip/cd-gap.zip b/tests/phpunit/data/zip/cd-gap.zip
deleted file mode 100644
index b5ae6ccd..00000000
--- a/tests/phpunit/data/zip/cd-gap.zip
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/zip/cd-truncated.zip b/tests/phpunit/data/zip/cd-truncated.zip
deleted file mode 100644
index 4d40d7d4..00000000
--- a/tests/phpunit/data/zip/cd-truncated.zip
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/zip/class-trailing-null.zip b/tests/phpunit/data/zip/class-trailing-null.zip
deleted file mode 100644
index 31dcf3d8..00000000
--- a/tests/phpunit/data/zip/class-trailing-null.zip
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/zip/class-trailing-slash.zip b/tests/phpunit/data/zip/class-trailing-slash.zip
deleted file mode 100644
index 9eb1f037..00000000
--- a/tests/phpunit/data/zip/class-trailing-slash.zip
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/zip/class.zip b/tests/phpunit/data/zip/class.zip
deleted file mode 100644
index 98a625b7..00000000
--- a/tests/phpunit/data/zip/class.zip
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/zip/empty.zip b/tests/phpunit/data/zip/empty.zip
deleted file mode 100644
index 15cb0ecb..00000000
--- a/tests/phpunit/data/zip/empty.zip
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/zip/looks-like-zip64.zip b/tests/phpunit/data/zip/looks-like-zip64.zip
deleted file mode 100644
index 7428cddd..00000000
--- a/tests/phpunit/data/zip/looks-like-zip64.zip
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/zip/nosig.zip b/tests/phpunit/data/zip/nosig.zip
deleted file mode 100644
index a22c73a4..00000000
--- a/tests/phpunit/data/zip/nosig.zip
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/zip/split.zip b/tests/phpunit/data/zip/split.zip
deleted file mode 100644
index 6984ae6d..00000000
--- a/tests/phpunit/data/zip/split.zip
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/zip/trail.zip b/tests/phpunit/data/zip/trail.zip
deleted file mode 100644
index 50bcea12..00000000
--- a/tests/phpunit/data/zip/trail.zip
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/zip/wrong-cd-start-disk.zip b/tests/phpunit/data/zip/wrong-cd-start-disk.zip
deleted file mode 100644
index 59b45938..00000000
--- a/tests/phpunit/data/zip/wrong-cd-start-disk.zip
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/data/zip/wrong-central-entry-sig.zip b/tests/phpunit/data/zip/wrong-central-entry-sig.zip
deleted file mode 100644
index 05329b43..00000000
--- a/tests/phpunit/data/zip/wrong-central-entry-sig.zip
+++ /dev/null
Binary files differ
diff --git a/tests/phpunit/docs/ExportDemoTest.php b/tests/phpunit/docs/ExportDemoTest.php
deleted file mode 100644
index ce65d494..00000000
--- a/tests/phpunit/docs/ExportDemoTest.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/**
- * Test for the demo xml
- *
- * @group Dump
- */
-class ExportDemoTest extends DumpTestCase {
-
- /**
- * @group large
- */
- function testExportDemo() {
- $this->validateXmlFileAgainstXsd( "../../docs/export-demo.xml" );
- }
-
- /**
- * Validates a xml file against the xsd.
- *
- * The validation is slow, because php has to read the xsd on each call.
- *
- * @param $fname string: name of file to validate
- */
- protected function validateXmlFileAgainstXsd( $fname ) {
- $version = WikiExporter::schemaVersion();
-
- $dom = new DomDocument();
- $dom->load( $fname );
-
- try {
- $this->assertTrue( $dom->schemaValidate( "../../docs/export-" . $version . ".xsd" ),
- "schemaValidate has found an error" );
- } catch( Exception $e ) {
- $this->fail( "xml not valid against xsd: " . $e->getMessage() );
- }
- }
-}
diff --git a/tests/phpunit/includes/ArticleTablesTest.php b/tests/phpunit/includes/ArticleTablesTest.php
deleted file mode 100644
index 17cee6e8..00000000
--- a/tests/phpunit/includes/ArticleTablesTest.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/**
- * @group Database
- */
-class ArticleTablesTest extends MediaWikiLangTestCase {
-
- function testbug14404() {
- global $wgContLang, $wgLanguageCode, $wgLang;
-
- $title = Title::newFromText( 'Bug 14404' );
- $page = WikiPage::factory( $title );
- $user = new User();
- $user->mRights = array( 'createpage', 'edit', 'purge' );
- $wgLanguageCode = 'es';
- $wgContLang = Language::factory( 'es' );
-
- $wgLang = Language::factory( 'fr' );
- $status = $page->doEdit( '{{:{{int:history}}}}', 'Test code for bug 14404', 0, false, $user );
- $templates1 = $title->getTemplateLinksFrom();
-
- $wgLang = Language::factory( 'de' );
- $page->mPreparedEdit = false; // In order to force the rerendering of the same wikitext
-
- // We need an edit, a purge is not enough to regenerate the tables
- $status = $page->doEdit( '{{:{{int:history}}}}', 'Test code for bug 14404', EDIT_UPDATE, false, $user );
- $templates2 = $title->getTemplateLinksFrom();
-
- $this->assertEquals( $templates1, $templates2 );
- $this->assertEquals( $templates1[0]->getFullText(), 'Historial' );
- }
-
-}
diff --git a/tests/phpunit/includes/ArticleTest.php b/tests/phpunit/includes/ArticleTest.php
deleted file mode 100644
index 846d2b86..00000000
--- a/tests/phpunit/includes/ArticleTest.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-class ArticleTest extends MediaWikiTestCase {
-
- private $title; // holds a Title object
- private $article; // holds an article
-
- /** creates a title object and its article object */
- function setUp() {
- $this->title = Title::makeTitle( NS_MAIN, 'SomePage' );
- $this->article = new Article( $this->title );
-
- }
-
- /** cleanup title object and its article object */
- function tearDown() {
- $this->title = null;
- $this->article = null;
-
- }
-
- function testImplementsGetMagic() {
- $this->assertEquals( false, $this->article->mLatest, "Article __get magic" );
- }
-
- /**
- * @depends testImplementsGetMagic
- */
- function testImplementsSetMagic() {
- $this->article->mLatest = 2;
- $this->assertEquals( 2, $this->article->mLatest, "Article __set magic" );
- }
-
- /**
- * @depends testImplementsSetMagic
- */
- function testImplementsCallMagic() {
- $this->article->mLatest = 33;
- $this->article->mDataLoaded = true;
- $this->assertEquals( 33, $this->article->getLatest(), "Article __call magic" );
- }
-
- function testGetOrSetOnNewProperty() {
- $this->article->ext_someNewProperty = 12;
- $this->assertEquals( 12, $this->article->ext_someNewProperty,
- "Article get/set magic on new field" );
-
- $this->article->ext_someNewProperty = -8;
- $this->assertEquals( -8, $this->article->ext_someNewProperty,
- "Article get/set magic on update to new field" );
- }
-
- /**
- * Checks for the existence of the backwards compatibility static functions (forwarders to WikiPage class)
- */
- function testStaticFunctions() {
- $this->assertEquals( WikiPage::selectFields(), Article::selectFields(),
- "Article static functions" );
- $this->assertEquals( true, is_callable( "Article::onArticleCreate" ),
- "Article static functions" );
- $this->assertEquals( true, is_callable( "Article::onArticleDelete" ),
- "Article static functions" );
- $this->assertEquals( true, is_callable( "ImagePage::onArticleEdit" ),
- "Article static functions" );
- $this->assertTrue( is_string( CategoryPage::getAutosummary( '', '', 0 ) ),
- "Article static functions" );
- }
-
- function testWikiPageFactory() {
- $title = Title::makeTitle( NS_FILE, 'Someimage.png' );
- $page = WikiPage::factory( $title );
- $this->assertEquals( 'WikiFilePage', get_class( $page ) );
-
- $title = Title::makeTitle( NS_CATEGORY, 'SomeCategory' );
- $page = WikiPage::factory( $title );
- $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
-
- $title = Title::makeTitle( NS_MAIN, 'SomePage' );
- $page = WikiPage::factory( $title );
- $this->assertEquals( 'WikiPage', get_class( $page ) );
- }
-}
diff --git a/tests/phpunit/includes/BlockTest.php b/tests/phpunit/includes/BlockTest.php
deleted file mode 100644
index 0c95b8d1..00000000
--- a/tests/phpunit/includes/BlockTest.php
+++ /dev/null
@@ -1,230 +0,0 @@
-<?php
-
-/**
- * @group Database
- * @group Blocking
- */
-class BlockTest extends MediaWikiLangTestCase {
-
- private $block, $madeAt;
-
- /* variable used to save up the blockID we insert in this test suite */
- private $blockId;
-
- function setUp() {
- global $wgContLang;
- parent::setUp();
- $wgContLang = Language::factory( 'en' );
- }
-
- function addDBData() {
- //$this->dumpBlocks();
-
- $user = User::newFromName( 'UTBlockee' );
- if( $user->getID() == 0 ) {
- $user->addToDatabase();
- $user->setPassword( 'UTBlockeePassword' );
-
- $user->saveSettings();
- }
-
- // Delete the last round's block if it's still there
- $oldBlock = Block::newFromTarget( 'UTBlockee' );
- if ( $oldBlock ) {
- // An old block will prevent our new one from saving.
- $oldBlock->delete();
- }
-
- $this->block = new Block( 'UTBlockee', $user->getID(), 0,
- 'Parce que', 0, false, time() + 100500
- );
- $this->madeAt = wfTimestamp( TS_MW );
-
- $this->block->insert();
- // save up ID for use in assertion. Since ID is an autoincrement,
- // its value might change depending on the order the tests are run.
- // ApiBlockTest insert its own blocks!
- $newBlockId = $this->block->getId();
- if ($newBlockId) {
- $this->blockId = $newBlockId;
- } else {
- throw new MWException( "Failed to insert block for BlockTest; old leftover block remaining?" );
- }
- }
-
- /**
- * debug function : dump the ipblocks table
- */
- function dumpBlocks() {
- $v = $this->db->query( 'SELECT * FROM unittest_ipblocks' );
- print "Got " . $v->numRows() . " rows. Full dump follow:\n";
- foreach( $v as $row ) {
- print_r( $row );
- }
- }
-
- function testInitializerFunctionsReturnCorrectBlock() {
- // $this->dumpBlocks();
-
- $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::newFromID( $this->blockId ) ), "newFromID() returns the same block as the one that was made");
-
- }
-
- /**
- * per bug 26425
- */
- 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 is the method previously used to load block info in CheckUser etc
- * passing an empty value (empty string, null, etc) as the ip parameter bypasses IP lookup checks.
- *
- * This stopped working with r84475 and friends: regression being fixed for bug 29116.
- *
- * @dataProvider dataBug29116
- */
- function testBug29116LoadWithEmptyIp( $vagueTarget ) {
- $this->hideDeprecated( 'Block::load' );
-
- $uid = User::idFromName( 'UTBlockee' );
- $this->assertTrue( ($uid > 0), 'Must be able to look up the target user during tests' );
-
- $block = new Block();
- $ok = $block->load( $vagueTarget, $uid );
- $this->assertTrue( $ok, "Block->load() with empty IP and user ID '$uid' should return a block" );
-
- $this->assertTrue( $this->block->equals( $block ), "Block->load() returns the same block as the one that was made when given empty ip param " . var_export( $vagueTarget, true ) );
- }
-
- /**
- * CheckUser since being changed to use Block::newFromTarget started failing
- * because the new function didn't accept empty strings like Block::load()
- * had. Regression bug 29116.
- *
- * @dataProvider dataBug29116
- */
- 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 ) );
- }
-
- function dataBug29116() {
- return array(
- array( null ),
- array( '' ),
- array( false )
- );
- }
-
- function testBlockedUserCanNotCreateAccount() {
- $username = 'BlockedUserToCreateAccountWith';
- $u = User::newFromName( $username );
- $u->setPassword( 'NotRandomPass' );
- $u->addToDatabase();
- unset( $u );
-
-
- // Sanity check
- $this->assertNull(
- Block::newFromTarget( $username ),
- "$username should not be blocked"
- );
-
- // Reload user
- $u = User::newFromName( $username );
- $this->assertFalse(
- $u->isBlockedFromCreateAccount(),
- "Our sandbox user should be able to create account before being blocked"
- );
-
- // Foreign perspective (blockee not on current wiki)...
- $block = new Block(
- /* $address */ $username,
- /* $user */ 14146,
- /* $by */ 0,
- /* $reason */ 'crosswiki block...',
- /* $timestamp */ wfTimestampNow(),
- /* $auto */ false,
- /* $expiry */ $this->db->getInfinity(),
- /* anonOnly */ false,
- /* $createAccount */ true,
- /* $enableAutoblock */ true,
- /* $hideName (ipb_deleted) */ true,
- /* $blockEmail */ true,
- /* $allowUsertalk */ false,
- /* $byName */ 'MetaWikiUser'
- );
- $block->insert();
-
- // Reload block from DB
- $userBlock = Block::newFromTarget( $username );
- $this->assertTrue(
- (bool) $block->prevents( 'createaccount' ),
- "Block object in DB should prevents 'createaccount'"
- );
-
- $this->assertInstanceOf(
- 'Block',
- $userBlock,
- "'$username' block block object should be existent"
- );
-
- // Reload user
- $u = User::newFromName( $username );
- $this->assertTrue(
- (bool) $u->isBlockedFromCreateAccount(),
- "Our sandbox user '$username' should NOT be able to create account"
- );
- }
-
- function testCrappyCrossWikiBlocks() {
- // Delete the last round's block if it's still there
- $oldBlock = Block::newFromTarget( 'UserOnForeignWiki' );
- if ( $oldBlock ) {
- // An old block will prevent our new one from saving.
- $oldBlock->delete();
- }
-
- // Foreign perspective (blockee not on current wiki)...
- $block = new Block(
- /* $address */ 'UserOnForeignWiki',
- /* $user */ 14146,
- /* $by */ 0,
- /* $reason */ 'crosswiki block...',
- /* $timestamp */ wfTimestampNow(),
- /* $auto */ false,
- /* $expiry */ $this->db->getInfinity(),
- /* anonOnly */ false,
- /* $createAccount */ true,
- /* $enableAutoblock */ true,
- /* $hideName (ipb_deleted) */ true,
- /* $blockEmail */ true,
- /* $allowUsertalk */ false,
- /* $byName */ 'MetaWikiUser'
- );
-
- $res = $block->insert( $this->db );
- $this->assertTrue( (bool)$res['id'], 'Block succeeded' );
-
- // Local perspective (blockee on current wiki)...
- $user = User::newFromName( 'UserOnForeignWiki' );
- $user->addToDatabase();
- // Set user ID to match the test value
- $this->db->update( 'user', array( 'user_id' => 14146 ), array( 'user_id' => $user->getId() ) );
- $user = null; // clear
-
- $block = Block::newFromID( $res['id'] );
- $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' );
- $this->assertEquals( 0, $block->getBy(), 'Correct blocker id' );
- }
-}
diff --git a/tests/phpunit/includes/CdbTest.php b/tests/phpunit/includes/CdbTest.php
deleted file mode 100644
index b5418dd7..00000000
--- a/tests/phpunit/includes/CdbTest.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/**
- * Test the CDB reader/writer
- */
-
-class CdbTest extends MediaWikiTestCase {
-
- public function setUp() {
- if ( !CdbReader::haveExtension() ) {
- $this->markTestSkipped( 'Native CDB support is not available' );
- }
- }
-
- public function testCdb() {
- $dir = wfTempDir();
- if ( !is_writable( $dir ) ) {
- $this->markTestSkipped( "Temp dir isn't writable" );
- }
-
- $w1 = new CdbWriter_PHP( "$dir/php.cdb" );
- $w2 = new CdbWriter_DBA( "$dir/dba.cdb" );
-
- $data = array();
- for ( $i = 0; $i < 1000; $i++ ) {
- $key = $this->randomString();
- $value = $this->randomString();
- $w1->set( $key, $value );
- $w2->set( $key, $value );
-
- if ( !isset( $data[$key] ) ) {
- $data[$key] = $value;
- }
- }
-
- $w1->close();
- $w2->close();
-
- $this->assertEquals(
- md5_file( "$dir/dba.cdb" ),
- md5_file( "$dir/php.cdb" ),
- 'same hash'
- );
-
- $r1 = new CdbReader_PHP( "$dir/php.cdb" );
- $r2 = new CdbReader_DBA( "$dir/dba.cdb" );
-
- foreach ( $data as $key => $value ) {
- if ( $key === '' ) {
- // Known bug
- continue;
- }
- $v1 = $r1->get( $key );
- $v2 = $r2->get( $key );
-
- $v1 = $v1 === false ? '(not found)' : $v1;
- $v2 = $v2 === false ? '(not found)' : $v2;
-
- # cdbAssert( 'Mismatch', $key, $v1, $v2 );
- $this->cdbAssert( "PHP error", $key, $v1, $value );
- $this->cdbAssert( "DBA error", $key, $v2, $value );
- }
-
- unlink( "$dir/dba.cdb" );
- unlink( "$dir/php.cdb" );
- }
-
- private function randomString() {
- $len = mt_rand( 0, 10 );
- $s = '';
- for ( $j = 0; $j < $len; $j++ ) {
- $s .= chr( mt_rand( 0, 255 ) );
- }
- return $s;
- }
-
- private function cdbAssert( $msg, $key, $v1, $v2 ) {
- $this->assertEquals(
- $v2,
- $v1,
- $msg . ', k=' . bin2hex( $key )
- );
- }
-}
diff --git a/tests/phpunit/includes/DiffHistoryBlobTest.php b/tests/phpunit/includes/DiffHistoryBlobTest.php
deleted file mode 100644
index cdb6ed2f..00000000
--- a/tests/phpunit/includes/DiffHistoryBlobTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-class DiffHistoryBlobTest extends MediaWikiTestCase {
- function setUp() {
- if ( !extension_loaded( 'xdiff' ) ) {
- $this->markTestSkipped( 'The xdiff extension is not available' );
- return;
- }
- if ( !function_exists( 'xdiff_string_rabdiff' ) ) {
- $this->markTestSkipped( 'The version of xdiff extension is lower than 1.5.0' );
- return;
- }
- if ( !extension_loaded( 'hash' ) && !extension_loaded( 'mhash' ) ) {
- $this->markTestSkipped( 'Neither the hash nor mhash extension is available' );
- return;
- }
- }
-
- /**
- * Test for DiffHistoryBlob::xdiffAdler32()
- * @dataProvider provideXdiffAdler32
- */
- function testXdiffAdler32( $input ) {
- $xdiffHash = substr( xdiff_string_rabdiff( $input, '' ), 0, 4 );
- $dhb = new DiffHistoryBlob;
- $myHash = $dhb->xdiffAdler32( $input );
- $this->assertSame( bin2hex( $xdiffHash ), bin2hex( $myHash ),
- "Hash of " . addcslashes( $input, "\0..\37!@\@\177..\377" ) );
- }
-
- function provideXdiffAdler32() {
- return array(
- array( '', 'Empty string' ),
- array( "\0", 'Null' ),
- array( "\0\0\0", "Several nulls" ),
- array( "Hello", "An ASCII string" ),
- array( str_repeat( "x", 6000 ), "A string larger than xdiff's NMAX (5552)" )
- );
- }
-}
diff --git a/tests/phpunit/includes/EditPageTest.php b/tests/phpunit/includes/EditPageTest.php
deleted file mode 100644
index 8ecfd7e5..00000000
--- a/tests/phpunit/includes/EditPageTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/**
- * @group Editing
- */
-class EditPageTest extends MediaWikiTestCase {
-
- /**
- * @dataProvider dataExtractSectionTitle
- */
- function testExtractSectionTitle( $section, $title ) {
- $extracted = EditPage::extractSectionTitle( $section );
- $this->assertEquals( $title, $extracted );
- }
-
- function dataExtractSectionTitle() {
- return array(
- array(
- "== Test ==\n\nJust a test section.",
- "Test"
- ),
- array(
- "An initial section, no header.",
- false
- ),
- array(
- "An initial section with a fake heder (bug 32617)\n\n== Test == ??\nwtf",
- false
- ),
- array(
- "== Section ==\nfollowed by a fake == Non-section == ??\nnoooo",
- "Section"
- ),
- array(
- "== Section== \t\r\n followed by whitespace (bug 35051)",
- 'Section',
- ),
- );
- }
-}
diff --git a/tests/phpunit/includes/ExternalStoreTest.php b/tests/phpunit/includes/ExternalStoreTest.php
deleted file mode 100644
index 92ec7344..00000000
--- a/tests/phpunit/includes/ExternalStoreTest.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * External Store tests
- */
-
-class ExternalStoreTest extends MediaWikiTestCase {
- private $saved_wgExternalStores;
-
- function setUp() {
- global $wgExternalStores;
- $this->saved_wgExternalStores = $wgExternalStores ;
- }
-
- function tearDown() {
- global $wgExternalStores;
- $wgExternalStores = $this->saved_wgExternalStores ;
- }
-
- function testExternalStoreDoesNotFetchIncorrectURL() {
- global $wgExternalStores;
- $wgExternalStores = true;
-
- # Assertions for r68900
- $this->assertFalse(
- ExternalStore::fetchFromURL( 'http://' ) );
- $this->assertFalse(
- ExternalStore::fetchFromURL( 'ftp.wikimedia.org' ) );
- $this->assertFalse(
- ExternalStore::fetchFromURL( '/super.txt' ) );
- }
-}
-
diff --git a/tests/phpunit/includes/ExtraParserTest.php b/tests/phpunit/includes/ExtraParserTest.php
deleted file mode 100644
index 903a6d25..00000000
--- a/tests/phpunit/includes/ExtraParserTest.php
+++ /dev/null
@@ -1,169 +0,0 @@
-<?php
-
-/**
- * Parser-related tests that don't suit for parserTests.txt
- */
-class ExtraParserTest extends MediaWikiTestCase {
-
- function setUp() {
- global $wgMemc;
- global $wgContLang;
- global $wgShowDBErrorBacktrace;
- global $wgLanguageCode;
- global $wgAlwaysUseTidy;
-
- $wgShowDBErrorBacktrace = true;
- $wgLanguageCode = 'en';
- $wgContLang = new Language( 'en' );
- $wgMemc = new EmptyBagOStuff;
- $wgAlwaysUseTidy = false;
-
- $this->options = new ParserOptions;
- $this->options->setTemplateCallback( array( __CLASS__, 'statelessFetchTemplate' ) );
- $this->parser = new Parser;
-
- MagicWord::clearCache();
- }
-
- // Bug 8689 - Long numeric lines kill the parser
- function testBug8689() {
- global $wgLang;
- global $wgUser;
- $longLine = '1.' . str_repeat( '1234567890', 100000 ) . "\n";
-
- if ( $wgLang === null ) $wgLang = new Language;
-
- $t = Title::newFromText( 'Unit test' );
- $options = ParserOptions::newFromUser( $wgUser );
- $this->assertEquals( "<p>$longLine</p>",
- $this->parser->parse( $longLine, $t, $options )->getText() );
- }
-
- /* Test the parser entry points */
- function testParse() {
- $title = Title::newFromText( __FUNCTION__ );
- $parserOutput = $this->parser->parse( "Test\n{{Foo}}\n{{Bar}}" , $title, $this->options );
- $this->assertEquals( "<p>Test\nContent of <i>Template:Foo</i>\nContent of <i>Template:Bar</i>\n</p>", $parserOutput->getText() );
- }
-
- function testPreSaveTransform() {
- global $wgUser;
- $title = Title::newFromText( __FUNCTION__ );
- $outputText = $this->parser->preSaveTransform( "Test\r\n{{subst:Foo}}\n{{Bar}}", $title, $wgUser, $this->options );
-
- $this->assertEquals( "Test\nContent of ''Template:Foo''\n{{Bar}}", $outputText );
- }
-
- function testPreprocess() {
- $title = Title::newFromText( __FUNCTION__ );
- $outputText = $this->parser->preprocess( "Test\n{{Foo}}\n{{Bar}}" , $title, $this->options );
-
- $this->assertEquals( "Test\nContent of ''Template:Foo''\nContent of ''Template:Bar''", $outputText );
- }
-
- /**
- * cleanSig() makes all templates substs and removes tildes
- */
- function testCleanSig() {
- global $wgCleanSignatures;
- $oldCleanSignature = $wgCleanSignatures;
- $wgCleanSignatures = true;
-
- $title = Title::newFromText( __FUNCTION__ );
- $outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
-
- $wgCleanSignatures = $oldCleanSignature;
-
- $this->assertEquals( "{{SUBST:Foo}} ", $outputText );
- }
-
- /**
- * cleanSig() should do nothing if disabled
- */
- function testCleanSigDisabled() {
- global $wgCleanSignatures;
- $oldCleanSignature = $wgCleanSignatures;
- $wgCleanSignatures = false;
-
- $title = Title::newFromText( __FUNCTION__ );
- $outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
-
- $wgCleanSignatures = $oldCleanSignature;
-
- $this->assertEquals( "{{Foo}} ~~~~", $outputText );
- }
-
- /**
- * cleanSigInSig() just removes tildes
- * @dataProvider provideStringsForCleanSigInSig
- */
- function testCleanSigInSig( $in, $out ) {
- $this->assertEquals( Parser::cleanSigInSig( $in), $out );
- }
-
- function provideStringsForCleanSigInSig() {
- return array(
- array( "{{Foo}} ~~~~", "{{Foo}} " ),
- array( "~~~", "" ),
- array( "~~~~~", "" ),
- );
- }
-
- 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 );
-
- $this->assertEquals( "=== Heading 2 ===\nSection 2", $outputText2 );
- $this->assertEquals( "== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2", $outputText1 );
- }
-
- 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" );
-
- $this->assertEquals( "Section 0\nNew section 1\n\n== Heading 3 ==\nSection 3", $outputText );
- }
-
- /**
- * Templates and comments are not affected, but noinclude/onlyinclude is.
- */
- function testGetPreloadText() {
- $title = Title::newFromText( __FUNCTION__ );
- $outputText = $this->parser->getPreloadText( "{{Foo}}<noinclude> censored</noinclude> information <!-- is very secret -->", $title, $this->options );
-
- $this->assertEquals( "{{Foo}} information <!-- is very secret -->", $outputText );
- }
-
- static function statelessFetchTemplate( $title, $parser=false ) {
- $text = "Content of ''" . $title->getFullText() . "''";
- $deps = array();
-
- return array(
- 'text' => $text,
- 'finalTitle' => $title,
- 'deps' => $deps );
- }
-
- /**
- * @group Database
- */
- function testTrackingCategory() {
- $title = Title::newFromText( __FUNCTION__ );
- $catName = wfMessage( 'broken-file-category' )->inContentLanguage()->text();
- $cat = Title::makeTitleSafe( NS_CATEGORY, $catName );
- $expected = array( $cat->getDBkey() );
- $parserOutput = $this->parser->parse( "[[file:nonexistent]]" , $title, $this->options );
- $result = $parserOutput->getCategoryLinks();
- $this->assertEquals( $expected, $result );
- }
-
- /**
- * @group Database
- */
- function testTrackingCategorySpecial() {
- // Special pages shouldn't have tracking cats.
- $title = SpecialPage::getTitleFor( 'Contributions' );
- $parserOutput = $this->parser->parse( "[[file:nonexistent]]" , $title, $this->options );
- $result = $parserOutput->getCategoryLinks();
- $this->assertEmpty( $result );
- }
- }
diff --git a/tests/phpunit/includes/FauxResponseTest.php b/tests/phpunit/includes/FauxResponseTest.php
deleted file mode 100644
index c0420049..00000000
--- a/tests/phpunit/includes/FauxResponseTest.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * Tests for the FauxResponse class
- *
- * Copyright @ 2011 Alexandre Emsenhuber
- *
- * 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
- */
-
-class FauxResponseTest extends MediaWikiTestCase {
- var $response;
-
- function setUp() {
- $this->response = new FauxResponse;
- }
-
- function testCookie() {
- $this->assertEquals( null, $this->response->getcookie( 'key' ), 'Non-existing cookie' );
- $this->response->setcookie( 'key', 'val' );
- $this->assertEquals( 'val', $this->response->getcookie( 'key' ), 'Existing cookie' );
- }
-
- function testHeader() {
- $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->response->header( 'Location: http://127.0.0.1/' );
- $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' );
- }
-
- function testResponseCode() {
- $this->response->header( 'HTTP/1.1 200' );
- $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->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->response->header( 'HTTP/1.x 204 OK', false, 205 );
- $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' );
- }
-}
diff --git a/tests/phpunit/includes/FormOptionsInitializationTest.php b/tests/phpunit/includes/FormOptionsInitializationTest.php
deleted file mode 100644
index d86c95d7..00000000
--- a/tests/phpunit/includes/FormOptionsInitializationTest.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-/**
- * This file host two test case classes for the MediaWiki FormOptions class:
- * - FormOptionsInitializationTest : tests initialization of the class.
- * - FormOptionsTest : tests methods an on instance
- *
- * The split let us take advantage of setting up a fixture for the methods
- * tests.
- */
-
-/**
- * Dummy class to makes FormOptions::$options public.
- * Used by FormOptionsInitializationTest which need to verify the $options
- * array is correctly set through the FormOptions::add() function.
- */
-class FormOptionsExposed extends FormOptions {
- public function getOptions() {
- return $this->options;
- }
-}
-
-/**
- * Test class for FormOptions initialization
- * Ensure the FormOptions::add() does what we want it to do.
- *
- * Generated by PHPUnit on 2011-02-28 at 20:46:27.
- *
- * Copyright © 2011, Antoine Musso
- *
- * @author Antoine Musso
- */
-class FormOptionsInitializationTest extends MediaWikiTestCase {
- /**
- * @var FormOptions
- */
- protected $object;
-
-
- /**
- * A new fresh and empty FormOptions object to test initialization
- * with.
- */
- protected function setUp() {
- $this->object = new FormOptionsExposed();
-
- }
-
- public function testAddStringOption() {
- $this->object->add( 'foo', 'string value' );
- $this->assertEquals(
- array(
- 'foo' => array(
- 'default' => 'string value',
- 'consumed' => false,
- 'type' => FormOptions::STRING,
- 'value' => null,
- )
- ),
- $this->object->getOptions()
- );
- }
-
- public function testAddIntegers() {
- $this->object->add( 'one', 1 );
- $this->object->add( 'negone', -1 );
- $this->assertEquals(
- array(
- 'negone' => array(
- 'default' => -1,
- 'value' => null,
- 'consumed' => false,
- 'type' => FormOptions::INT,
- ),
- 'one' => array(
- 'default' => 1,
- 'value' => null,
- 'consumed' => false,
- 'type' => FormOptions::INT,
- )
- ),
- $this->object->getOptions()
- );
- }
-
-}
diff --git a/tests/phpunit/includes/FormOptionsTest.php b/tests/phpunit/includes/FormOptionsTest.php
deleted file mode 100644
index 749343ec..00000000
--- a/tests/phpunit/includes/FormOptionsTest.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-/**
- * This file host two test case classes for the MediaWiki FormOptions class:
- * - FormOptionsInitializationTest : tests initialization of the class.
- * - FormOptionsTest : tests methods an on instance
- *
- * The split let us take advantage of setting up a fixture for the methods
- * tests.
- */
-
-/**
- * Test class for FormOptions methods.
- * Generated by PHPUnit on 2011-02-28 at 20:46:27.
- *
- * Copyright © 2011, Antoine Musso
- *
- * @author Antoine Musso
- */
-class FormOptionsTest extends MediaWikiTestCase {
- /**
- * @var FormOptions
- */
- protected $object;
-
- /**
- * Instanciates a FormOptions object to play with.
- * FormOptions::add() is tested by the class FormOptionsInitializationTest
- * so we assume the function is well tested already an use it to create
- * the fixture.
- */
- protected function setUp() {
- $this->object = new FormOptions;
- $this->object->add( 'string1', 'string one' );
- $this->object->add( 'string2', 'string two' );
- $this->object->add( 'integer', 0 );
- $this->object->add( 'intnull', 0, FormOptions::INTNULL );
- }
-
- /** Helpers for testGuessType() */
- /* @{ */
- private function assertGuessBoolean( $data ) {
- $this->guess( FormOptions::BOOL, $data );
- }
- private function assertGuessInt( $data ) {
- $this->guess( FormOptions::INT, $data );
- }
- private function assertGuessString( $data ) {
- $this->guess( FormOptions::STRING, $data );
- }
-
- /** Generic helper */
- private function guess( $expected, $data ) {
- $this->assertEquals(
- $expected,
- FormOptions::guessType( $data )
- );
- }
- /* @} */
-
- /**
- * Reuse helpers above assertGuessBoolean assertGuessInt assertGuessString
- */
- public function testGuessTypeDetection() {
- $this->assertGuessBoolean( true );
- $this->assertGuessBoolean( false );
-
- $this->assertGuessInt( 0 );
- $this->assertGuessInt( -5 );
- $this->assertGuessInt( 5 );
- $this->assertGuessInt( 0x0F );
-
- $this->assertGuessString( 'true' );
- $this->assertGuessString( 'false' );
- $this->assertGuessString( '5' );
- $this->assertGuessString( '0' );
- }
-
- /**
- * @expectedException MWException
- */
- public function testGuessTypeOnArrayThrowException() {
- $this->object->guessType( array( 'foo' ) );
- }
- /**
- * @expectedException MWException
- */
- public function testGuessTypeOnNullThrowException() {
- $this->object->guessType( null );
- }
-}
diff --git a/tests/phpunit/includes/GlobalFunctions/GlobalTest.php b/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
deleted file mode 100644
index 9097d301..00000000
--- a/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
+++ /dev/null
@@ -1,598 +0,0 @@
-<?php
-
-class GlobalTest extends MediaWikiTestCase {
- function setUp() {
- global $wgReadOnlyFile, $wgUrlProtocols;
- $this->originals['wgReadOnlyFile'] = $wgReadOnlyFile;
- $this->originals['wgUrlProtocols'] = $wgUrlProtocols;
- $wgReadOnlyFile = tempnam( wfTempDir(), "mwtest_readonly" );
- $wgUrlProtocols[] = 'file://';
- unlink( $wgReadOnlyFile );
- }
-
- function tearDown() {
- global $wgReadOnlyFile, $wgUrlProtocols;
- if ( file_exists( $wgReadOnlyFile ) ) {
- unlink( $wgReadOnlyFile );
- }
- $wgReadOnlyFile = $this->originals['wgReadOnlyFile'];
- $wgUrlProtocols = $this->originals['wgUrlProtocols'];
- }
-
- /** @dataProvider provideForWfArrayDiff2 */
- public function testWfArrayDiff2( $a, $b, $expected ) {
- $this->assertEquals(
- wfArrayDiff2( $a, $b), $expected
- );
- }
-
- // @todo Provide more tests
- public function provideForWfArrayDiff2() {
- // $a $b $expected
- return array(
- array(
- array( 'a', 'b'),
- array( 'a', 'b'),
- array(),
- ),
- array(
- array( array( 'a'), array( 'a', 'b', 'c' )),
- array( array( 'a'), array( 'a', 'b' )),
- array( 1 => array( 'a', 'b', 'c' ) ),
- ),
- );
- }
-
- function testRandom() {
- # This could hypothetically fail, but it shouldn't ;)
- $this->assertFalse(
- wfRandom() == wfRandom() );
- }
-
- function testUrlencode() {
- $this->assertEquals(
- "%E7%89%B9%E5%88%A5:Contributions/Foobar",
- wfUrlencode( "\xE7\x89\xB9\xE5\x88\xA5:Contributions/Foobar" ) );
- }
-
- 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" ) );
- }
-
- function testReadOnlyEmpty() {
- global $wgReadOnly;
- $wgReadOnly = null;
-
- $this->assertFalse( wfReadOnly() );
- $this->assertFalse( wfReadOnly() );
- }
-
- function testReadOnlySet() {
- global $wgReadOnly, $wgReadOnlyFile;
-
- $f = fopen( $wgReadOnlyFile, "wt" );
- fwrite( $f, 'Message' );
- fclose( $f );
- $wgReadOnly = null; # Check on $wgReadOnlyFile
-
- $this->assertTrue( wfReadOnly() );
- $this->assertTrue( wfReadOnly() ); # Check cached
-
- unlink( $wgReadOnlyFile );
- $wgReadOnly = null; # Clean cache
-
- $this->assertFalse( wfReadOnly() );
- $this->assertFalse( wfReadOnly() );
- }
-
- function testQuotedPrintable() {
- $this->assertEquals(
- "=?UTF-8?Q?=C4=88u=20legebla=3F?=",
- UserMailer::quotedPrintable( "\xc4\x88u legebla?", "UTF-8" ) );
- }
-
- function testTime() {
- $start = wfTime();
- $this->assertInternalType( 'float', $start );
- $end = wfTime();
- $this->assertTrue( $end > $start, "Time is running backwards!" );
- }
-
- function dataArrayToCGI() {
- return array(
- array( array(), '' ), // empty
- array( array( 'foo' => 'bar' ), 'foo=bar' ), // string test
- array( array( 'foo' => '' ), 'foo=' ), // empty string test
- array( array( 'foo' => 1 ), 'foo=1' ), // number test
- array( array( 'foo' => true ), 'foo=1' ), // true test
- 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' => 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' ) ), 'foo%5B0%5D=bar&foo%5B1%5D=baz' ),
- array( array( 'foo' => array( 'bar' => array( 'bar' => 'baz' ) ) ), 'foo%5Bbar%5D%5Bbar%5D=baz' ),
- );
- }
-
- /**
- * @dataProvider dataArrayToCGI
- */
- function testArrayToCGI( $array, $result ) {
- $this->assertEquals( $result, wfArrayToCGI( $array ) );
- }
-
-
- function testArrayToCGI2() {
- $this->assertEquals(
- "baz=bar&foo=bar",
- wfArrayToCGI(
- array( 'baz' => 'bar' ),
- array( 'foo' => 'bar', 'baz' => 'overridden value' ) ) );
- }
-
- function dataCgiToArray() {
- return array(
- array( '', array() ), // empty
- array( 'foo=bar', array( 'foo' => 'bar' ) ), // string
- array( 'foo=', array( 'foo' => '' ) ), // empty string
- array( 'foo', array( 'foo' => '' ) ), // missing =
- 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%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' ) ) ) ),
- );
- }
-
- /**
- * @dataProvider dataCgiToArray
- */
- function testCgiToArray( $cgi, $result ) {
- $this->assertEquals( $result, wfCgiToArray( $cgi ) );
- }
-
- function dataCgiRoundTrip() {
- return array(
- array( '' ),
- array( 'foo=bar' ),
- array( 'foo=' ),
- array( 'foo=bar&baz=biz' ),
- array( 'foo=A%26B%3D5%2B6%40%21%22%27' ),
- array( 'foo%5Bbar%5D=baz' ),
- array( 'foo%5B0%5D=bar&foo%5B1%5D=baz' ),
- array( 'foo%5Bbar%5D%5Bbar%5D=baz' ),
- );
- }
-
- /**
- * @dataProvider dataCgiRoundTrip
- */
- function testCgiRoundTrip( $cgi ) {
- $this->assertEquals( $cgi, wfArrayToCGI( wfCgiToArray( $cgi ) ) );
- }
-
- function testMimeTypeMatch() {
- $this->assertEquals(
- 'text/html',
- mimeTypeMatch( 'text/html',
- array( 'application/xhtml+xml' => 1.0,
- 'text/html' => 0.7,
- 'text/plain' => 0.3 ) ) );
- $this->assertEquals(
- 'text/*',
- mimeTypeMatch( 'text/html',
- array( 'image/*' => 1.0,
- 'text/*' => 0.5 ) ) );
- $this->assertEquals(
- '*/*',
- mimeTypeMatch( 'text/html',
- array( '*/*' => 1.0 ) ) );
- $this->assertNull(
- mimeTypeMatch( 'text/html',
- array( 'image/png' => 1.0,
- 'image/svg+xml' => 0.5 ) ) );
- }
-
- function testNegotiateType() {
- $this->assertEquals(
- 'text/html',
- wfNegotiateType(
- array( 'application/xhtml+xml' => 1.0,
- 'text/html' => 0.7,
- 'text/plain' => 0.5,
- 'text/*' => 0.2 ),
- array( 'text/html' => 1.0 ) ) );
- $this->assertEquals(
- 'application/xhtml+xml',
- wfNegotiateType(
- array( 'application/xhtml+xml' => 1.0,
- 'text/html' => 0.7,
- 'text/plain' => 0.5,
- 'text/*' => 0.2 ),
- array( 'application/xhtml+xml' => 1.0,
- 'text/html' => 0.5 ) ) );
- $this->assertEquals(
- 'text/html',
- wfNegotiateType(
- array( 'text/html' => 1.0,
- 'text/plain' => 0.5,
- 'text/*' => 0.5,
- 'application/xhtml+xml' => 0.2 ),
- array( 'application/xhtml+xml' => 1.0,
- 'text/html' => 0.5 ) ) );
- $this->assertEquals(
- 'text/html',
- wfNegotiateType(
- array( 'text/*' => 1.0,
- 'image/*' => 0.7,
- '*/*' => 0.3 ),
- array( 'application/xhtml+xml' => 1.0,
- 'text/html' => 0.5 ) ) );
- $this->assertNull(
- wfNegotiateType(
- array( 'text/*' => 1.0 ),
- array( 'application/xhtml+xml' => 1.0 ) ) );
- }
-
- function testFallbackMbstringFunctions() {
-
- if( !extension_loaded( 'mbstring' ) ) {
- $this->markTestSkipped( "The mb_string functions must be installed to test the fallback functions" );
- }
-
- $sampleUTF = "Östergötland_coat_of_arms.png";
-
-
- //mb_substr
- $substr_params = array(
- array( 0, 0 ),
- array( 5, -4 ),
- array( 33 ),
- array( 100, -5 ),
- array( -8, 10 ),
- array( 1, 1 ),
- array( 2, -1 )
- );
-
- foreach( $substr_params as $param_set ) {
- $old_param_set = $param_set;
- array_unshift( $param_set, $sampleUTF );
-
- $this->assertEquals(
- MWFunction::callArray( 'mb_substr', $param_set ),
- MWFunction::callArray( 'Fallback::mb_substr', $param_set ),
- 'Fallback mb_substr with params ' . implode( ', ', $old_param_set )
- );
- }
-
-
- //mb_strlen
- $this->assertEquals(
- mb_strlen( $sampleUTF ),
- Fallback::mb_strlen( $sampleUTF ),
- 'Fallback mb_strlen'
- );
-
-
- //mb_str(r?)pos
- $strpos_params = array(
- //array( 'ter' ),
- //array( 'Ö' ),
- //array( 'Ö', 3 ),
- //array( 'oat_', 100 ),
- //array( 'c', -10 ),
- //Broken for now
- );
-
- foreach( $strpos_params as $param_set ) {
- $old_param_set = $param_set;
- array_unshift( $param_set, $sampleUTF );
-
- $this->assertEquals(
- MWFunction::callArray( 'mb_strpos', $param_set ),
- MWFunction::callArray( 'Fallback::mb_strpos', $param_set ),
- 'Fallback mb_strpos with params ' . implode( ', ', $old_param_set )
- );
-
- $this->assertEquals(
- MWFunction::callArray( 'mb_strrpos', $param_set ),
- MWFunction::callArray( 'Fallback::mb_strrpos', $param_set ),
- 'Fallback mb_strrpos with params ' . implode( ', ', $old_param_set )
- );
- }
-
- }
-
-
- function testDebugFunctionTest() {
-
- global $wgDebugLogFile, $wgDebugTimestamps;
-
- $old_log_file = $wgDebugLogFile;
- $wgDebugLogFile = tempnam( wfTempDir(), 'mw-' );
- # @todo FIXME: This setting should be tested
- $wgDebugTimestamps = false;
-
-
-
- wfDebug( "This is a normal string" );
- $this->assertEquals( "This is a normal string", file_get_contents( $wgDebugLogFile ) );
- unlink( $wgDebugLogFile );
-
-
- wfDebug( "This is nöt an ASCII string" );
- $this->assertEquals( "This is nöt an ASCII string", file_get_contents( $wgDebugLogFile ) );
- 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 ) );
- unlink( $wgDebugLogFile );
-
- wfDebugMem();
- $this->assertGreaterThan( 5000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
- unlink( $wgDebugLogFile );
-
- wfDebugMem(true);
- $this->assertGreaterThan( 5000000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
- unlink( $wgDebugLogFile );
-
-
-
- $wgDebugLogFile = $old_log_file;
-
- }
-
- function testClientAcceptsGzipTest() {
-
- $settings = array(
- 'gzip' => true,
- 'bzip' => false,
- '*' => false,
- 'compress, gzip' => true,
- 'gzip;q=1.0' => true,
- 'foozip' => false,
- 'foo*zip' => false,
- 'gzip;q=abcde' => true, //is this REALLY valid?
- 'gzip;q=12345678.9' => true,
- ' gzip' => true,
- );
-
- if( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) $old_server_setting = $_SERVER['HTTP_ACCEPT_ENCODING'];
-
- foreach ( $settings as $encoding => $expect ) {
- $_SERVER['HTTP_ACCEPT_ENCODING'] = $encoding;
-
- $this->assertEquals( $expect, wfClientAcceptsGzip( true ),
- "'$encoding' => " . wfBoolToStr( $expect ) );
- }
-
- if( isset( $old_server_setting ) ) $_SERVER['HTTP_ACCEPT_ENCODING'] = $old_server_setting;
-
- }
-
-
-
- function testSwapVarsTest() {
-
-
- $var1 = 1;
- $var2 = 2;
-
- $this->assertEquals( $var1, 1, 'var1 is set originally' );
- $this->assertEquals( $var2, 2, 'var1 is set originally' );
-
- swap( $var1, $var2 );
-
- $this->assertEquals( $var1, 2, 'var1 is swapped' );
- $this->assertEquals( $var2, 1, 'var2 is swapped' );
-
- }
-
-
- function testWfPercentTest() {
-
- $pcts = array(
- array( 6/7, '0.86%', 2, false ),
- array( 3/3, '1%' ),
- array( 22/7, '3.14286%', 5 ),
- array( 3/6, '0.5%' ),
- array( 1/3, '0%', 0 ),
- array( 10/3, '0%', -1 ),
- array( 3/4/5, '0.1%', 1 ),
- array( 6/7*8, '6.8571428571%', 10 ),
- );
-
- foreach( $pcts as $pct ) {
- if( !isset( $pct[2] ) ) $pct[2] = 2;
- if( !isset( $pct[3] ) ) $pct[3] = true;
-
- $this->assertEquals( wfPercent( $pct[0], $pct[2], $pct[3] ), $pct[1], $pct[1] );
- }
-
- }
-
-
- function testInStringTest() {
-
- $this->assertTrue( in_string( 'foo', 'foobar' ), 'foo is in foobar' );
- $this->assertFalse( in_string( 'Bar', 'foobar' ), 'Case-sensitive by default' );
- $this->assertTrue( in_string( 'Foo', 'foobar', true ), 'Case-insensitive when asked' );
-
- }
-
- /**
- * test @see wfShorthandToInteger()
- * @dataProvider provideShorthand
- */
- public function testWfShorthandToInteger( $shorthand, $expected ) {
- $this->assertEquals( $expected,
- wfShorthandToInteger( $shorthand )
- );
- }
-
- /** array( shorthand, expected integer ) */
- public function provideShorthand() {
- return array(
- # Null, empty ...
- array( '', -1),
- array( ' ', -1),
- array( null, -1),
-
- # Failures returns 0 :(
- array( 'ABCDEFG', 0 ),
- array( 'Ak', 0 ),
-
- # Int, strings with spaces
- array( 1, 1 ),
- array( ' 1 ', 1 ),
- array( 1023, 1023 ),
- array( ' 1023 ', 1023 ),
-
- # kilo, Mega, Giga
- array( '1k', 1024 ),
- array( '1K', 1024 ),
- array( '1m', 1024 * 1024 ),
- array( '1M', 1024 * 1024 ),
- array( '1g', 1024 * 1024 * 1024 ),
- array( '1G', 1024 * 1024 * 1024 ),
-
- # Negatives
- array( -1, -1 ),
- array( -500, -500 ),
- array( '-500', -500 ),
- array( '-1k', -1024 ),
-
- # Zeroes
- array( '0', 0 ),
- array( '0k', 0 ),
- array( '0M', 0 ),
- array( '0G', 0 ),
- array( '-0', 0 ),
- array( '-0k', 0 ),
- array( '-0M', 0 ),
- array( '-0G', 0 ),
- );
- }
-
- /**
- * @dataProvider provideMakeUrlIndexes()
- */
- function testMakeUrlIndexes( $url, $expected ) {
- $index = wfMakeUrlIndexes( $url );
- $this->assertEquals( $expected, $index, "wfMakeUrlIndexes(\"$url\")" );
- }
-
- function provideMakeUrlIndexes() {
- return array(
- array(
- // just a regular :)
- 'https://bugzilla.wikimedia.org/show_bug.cgi?id=28627',
- array( 'https://org.wikimedia.bugzilla./show_bug.cgi?id=28627' )
- ),
- array(
- // mailtos are handled special
- // is this really right though? that final . probably belongs earlier?
- 'mailto:wiki@wikimedia.org',
- array( 'mailto:org.wikimedia@wiki.' )
- ),
-
- // file URL cases per bug 28627...
- array(
- // three slashes: local filesystem path Unix-style
- 'file:///whatever/you/like.txt',
- array( 'file://./whatever/you/like.txt' )
- ),
- array(
- // three slashes: local filesystem path Windows-style
- 'file:///c:/whatever/you/like.txt',
- array( 'file://./c:/whatever/you/like.txt' )
- ),
- array(
- // two slashes: UNC filesystem path Windows-style
- 'file://intranet/whatever/you/like.txt',
- array( 'file://intranet./whatever/you/like.txt' )
- ),
- // Multiple-slash cases that can sorta work on Mozilla
- // if you hack it just right are kinda pathological,
- // and unreliable cross-platform or on IE which means they're
- // unlikely to appear on intranets.
- //
- // Those will survive the algorithm but with results that
- // are less consistent.
-
- // protocol-relative URL cases per bug 29854...
- array(
- '//bugzilla.wikimedia.org/show_bug.cgi?id=28627',
- array(
- 'http://org.wikimedia.bugzilla./show_bug.cgi?id=28627',
- 'https://org.wikimedia.bugzilla./show_bug.cgi?id=28627'
- )
- ),
- );
- }
-
- /**
- * @dataProvider provideWfMatchesDomainList
- */
- function testWfMatchesDomainList( $url, $domains, $expected, $description ) {
- $actual = wfMatchesDomainList( $url, $domains );
- $this->assertEquals( $expected, $actual, $description );
- }
-
- function provideWfMatchesDomainList() {
- $a = array();
- $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" ),
-
- // FIXME: This is a bug in wfMatchesDomainList(). If and when this is fixed, update this test case
- array( "$p//nds-nl.wikipedia.org", array( 'nl.wikipedia.org' ), true, "Substrings of domains match while they shouldn't, $pDesc URL" ),
- ) );
- }
- return $a;
- }
-
- /**
- * @dataProvider provideWfShellMaintenanceCmdList
- */
- function testWfShellMaintenanceCmd( $script, $parameters, $options, $expected, $description ) {
- if( wfIsWindows() ) {
- // Approximation that's good enough for our purposes just now
- $expected = str_replace( "'", '"', $expected );
- }
- $actual = wfShellMaintenanceCmd( $script, $parameters, $options );
- $this->assertEquals( $expected, $actual, $description );
- }
-
- function provideWfShellMaintenanceCmdList() {
- global $wgPhpCli;
- return array(
- array( 'eval.php', array( '--help', '--test' ), array(),
- "'$wgPhpCli' 'eval.php' '--help' '--test'",
- "Called eval.php --help --test" ),
- array( 'eval.php', array( '--help', '--test space' ), array('php' => 'php5'),
- "'php5' 'eval.php' '--help' '--test space'",
- "Called eval.php --help --test with php option" ),
- 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'),
- "'php5' 'MWScript.php' 'eval.php' '--help' '--test' 'y'",
- "Called eval.php --help --test with wrapper and php option" ),
- );
- }
- /* TODO: many more! */
-}
-
diff --git a/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php b/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
deleted file mode 100644
index 4879a38d..00000000
--- a/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-/**
- * @group Database
- */
-class GlobalWithDBTest extends MediaWikiTestCase {
- /**
- * @dataProvider provideWfIsBadImageList
- */
- function testWfIsBadImage( $name, $title, $blacklist, $expected, $desc ) {
- $this->assertEquals( $expected, wfIsBadImage( $name, $title, $blacklist ), $desc );
- }
-
- function provideWfIsBadImageList() {
- $blacklist = '* [[File:Bad.jpg]] except [[Nasty page]]';
- return array(
- array( 'Bad.jpg', false, $blacklist, true,
- 'Called on a bad image' ),
- array( 'Bad.jpg', Title::makeTitle( NS_MAIN, 'A page' ), $blacklist, true,
- 'Called on a bad image' ),
- array( 'NotBad.jpg', false, $blacklist, false,
- 'Called on a non-bad image' ),
- array( 'Bad.jpg', Title::makeTitle( NS_MAIN, 'Nasty page' ), $blacklist, false,
- 'Called on a bad image but is on a whitelisted page' ),
- array( 'File:Bad.jpg', false, $blacklist, false,
- 'Called on a bad image with File:' ),
- );
- }
-}
diff --git a/tests/phpunit/includes/GlobalFunctions/README b/tests/phpunit/includes/GlobalFunctions/README
deleted file mode 100644
index 0042bdac..00000000
--- a/tests/phpunit/includes/GlobalFunctions/README
+++ /dev/null
@@ -1,2 +0,0 @@
-This directory hold tests for includes/GlobalFunctions.php file
-which is a pile of functions.
diff --git a/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php b/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
deleted file mode 100644
index be6c99e7..00000000
--- a/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/**
- * Unit tests for wfAssembleUrl()
- */
-
-class wfAssembleUrl extends MediaWikiTestCase {
- /** @dataProvider provideURLParts */
- public function testWfAssembleUrl( $parts, $output ) {
- $partsDump = print_r( $parts, true );
- $this->assertEquals(
- $output,
- wfAssembleUrl( $parts ),
- "Testing $partsDump assembles to $output"
- );
- }
-
- /**
- * Provider of URL parts for testing wfAssembleUrl()
- *
- * @return array
- */
- public function provideURLParts() {
- $schemes = array(
- '' => array(),
- '//' => array(
- 'delimiter' => '//',
- ),
- 'http://' => array(
- 'scheme' => 'http',
- 'delimiter' => '://',
- ),
- );
-
- $hosts = array(
- '' => array(),
- 'example.com' => array(
- 'host' => 'example.com',
- ),
- 'example.com:123' => array(
- 'host' => 'example.com',
- 'port' => 123,
- ),
- 'id@example.com' => array(
- 'user' => 'id',
- 'host' => 'example.com',
- ),
- 'id@example.com:123' => array(
- 'user' => 'id',
- 'host' => 'example.com',
- 'port' => 123,
- ),
- 'id:key@example.com' => array(
- 'user' => 'id',
- 'pass' => 'key',
- 'host' => 'example.com',
- ),
- 'id:key@example.com:123' => array(
- 'user' => 'id',
- 'pass' => 'key',
- 'host' => 'example.com',
- 'port' => 123,
- ),
- );
-
- $cases = array();
- foreach ( $schemes as $scheme => $schemeParts ) {
- foreach ( $hosts as $host => $hostParts ) {
- foreach ( array( '', '/path' ) as $path ) {
- foreach ( array( '', 'query' ) as $query ) {
- foreach ( array( '', 'fragment' ) as $fragment ) {
- $parts = array_merge(
- $schemeParts,
- $hostParts
- );
- $url = $scheme .
- $host .
- $path;
-
- if ( $path ) {
- $parts['path'] = $path;
- }
- if ( $query ) {
- $parts['query'] = $query;
- $url .= '?' . $query;
- }
- if( $fragment ) {
- $parts['fragment'] = $fragment;
- $url .= '#' . $fragment;
- }
-
-
- $cases[] = array(
- $parts,
- $url,
- );
- }
- }
- }
- }
- }
-
- $complexURL = 'http://id:key@example.org:321' .
- '/over/there?name=ferret&foo=bar#nose';
- $cases[] = array(
- wfParseUrl( $complexURL ),
- $complexURL,
- );
-
- return $cases;
- }
-}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php b/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
deleted file mode 100644
index f4ec7a5f..00000000
--- a/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
+++ /dev/null
@@ -1,133 +0,0 @@
-<?php
-/**
- * Unit tests for wfBCP47()
- */
-class wfBCP47 extends MediaWikiTestCase {
- /**
- * test @see wfBCP47().
- * Please note the BCP explicitly state that language codes are case
- * insensitive, there are some exceptions to the rule :)
- * This test is used to verify our formatting against all lower and
- * all upper cases language code.
- *
- * @see http://tools.ietf.org/html/bcp47
- * @dataProvider provideLanguageCodes()
- */
- function testBCP47( $code, $expected ) {
- $code = strtolower( $code );
- $this->assertEquals( $expected, wfBCP47($code),
- "Applying BCP47 standard to lower case '$code'"
- );
-
- $code = strtoupper( $code );
- $this->assertEquals( $expected, wfBCP47($code),
- "Applying BCP47 standard to upper case '$code'"
- );
- }
-
- /**
- * Array format is ($code, $expected)
- */
- function provideLanguageCodes() {
- return array(
- // Extracted from BCP47 (list not exhaustive)
- # 2.1.1
- array( 'en-ca-x-ca' , 'en-CA-x-ca' ),
- array( 'sgn-be-fr' , 'sgn-BE-FR' ),
- array( 'az-latn-x-latn', 'az-Latn-x-latn' ),
- # 2.2
- array( 'sr-Latn-RS', 'sr-Latn-RS' ),
- array( 'az-arab-ir', 'az-Arab-IR' ),
-
- # 2.2.5
- array( 'sl-nedis' , 'sl-nedis' ),
- array( 'de-ch-1996', 'de-CH-1996' ),
-
- # 2.2.6
- array(
- 'en-latn-gb-boont-r-extended-sequence-x-private',
- 'en-Latn-GB-boont-r-extended-sequence-x-private'
- ),
-
- // Examples from BCP47 Appendix A
- # Simple language subtag:
- array( 'DE', 'de' ),
- array( 'fR', 'fr' ),
- array( 'ja', 'ja' ),
-
- # Language subtag plus script subtag:
- array( 'zh-hans', 'zh-Hans'),
- array( 'sr-cyrl', 'sr-Cyrl'),
- array( 'sr-latn', 'sr-Latn'),
-
- # Extended language subtags and their primary language subtag
- # counterparts:
- array( 'zh-cmn-hans-cn', 'zh-cmn-Hans-CN' ),
- array( 'cmn-hans-cn' , 'cmn-Hans-CN' ),
- array( 'zh-yue-hk' , 'zh-yue-HK' ),
- array( 'yue-hk' , 'yue-HK' ),
-
- # Language-Script-Region:
- array( 'zh-hans-cn', 'zh-Hans-CN' ),
- array( 'sr-latn-RS', 'sr-Latn-RS' ),
-
- # Language-Variant:
- array( 'sl-rozaj' , 'sl-rozaj' ),
- array( 'sl-rozaj-biske', 'sl-rozaj-biske' ),
- array( 'sl-nedis' , 'sl-nedis' ),
-
- # Language-Region-Variant:
- array( 'de-ch-1901' , 'de-CH-1901' ),
- array( 'sl-it-nedis' , 'sl-IT-nedis' ),
-
- # Language-Script-Region-Variant:
- array( 'hy-latn-it-arevela', 'hy-Latn-IT-arevela' ),
-
- # Language-Region:
- array( 'de-de' , 'de-DE' ),
- array( 'en-us' , 'en-US' ),
- array( 'es-419', 'es-419'),
-
- # Private use subtags:
- array( 'de-ch-x-phonebk' , 'de-CH-x-phonebk' ),
- array( 'az-arab-x-aze-derbend', 'az-Arab-x-aze-derbend' ),
- /**
- * Previous test does not reflect the BCP which states:
- * az-Arab-x-AZE-derbend
- * AZE being private, it should be lower case, hence the test above
- * should probably be:
- #array( 'az-arab-x-aze-derbend', 'az-Arab-x-AZE-derbend' ),
- */
-
- # Private use registry values:
- array( 'x-whatever', 'x-whatever' ),
- array( 'qaa-qaaa-qm-x-southern', 'qaa-Qaaa-QM-x-southern' ),
- array( 'de-qaaa' , 'de-Qaaa' ),
- array( 'sr-latn-qm', 'sr-Latn-QM' ),
- array( 'sr-qaaa-rs', 'sr-Qaaa-RS' ),
-
- # Tags that use extensions
- array( 'en-us-u-islamcal', 'en-US-u-islamcal' ),
- array( 'zh-cn-a-myext-x-private', 'zh-CN-a-myext-x-private' ),
- array( 'en-a-myext-b-another', 'en-a-myext-b-another' ),
-
- # Invalid:
- // de-419-DE
- // a-DE
- // ar-a-aaa-b-bbb-a-ccc
-
- /*
- // ISO 15924 :
- array( 'sr-Cyrl', 'sr-Cyrl' ),
- # @todo FIXME: Fix our function?
- array( 'SR-lATN', 'sr-Latn' ),
- array( 'fr-latn', 'fr-Latn' ),
- // Use lowercase for single segment
- // ISO 3166-1-alpha-2 code
- array( 'US', 'us' ), # USA
- array( 'uS', 'us' ), # USA
- array( 'Fr', 'fr' ), # France
- array( 'va', 'va' ), # Holy See (Vatican City State)
- */);
- }
-}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php b/tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
deleted file mode 100644
index 59954b23..00000000
--- a/tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/**
- * Tests for wfBaseName()
- */
-class wfBaseName extends MediaWikiTestCase {
- /**
- * @dataProvider providePaths
- */
- function testBaseName( $fullpath, $basename ) {
- $this->assertEquals( $basename, wfBaseName( $fullpath ),
- "wfBaseName('$fullpath') => '$basename'" );
- }
-
- function providePaths() {
- return array(
- array( '', '' ),
- array( '/', '' ),
- array( '\\', '' ),
- array( '//', '' ),
- array( '\\\\', '' ),
- array( 'a', 'a' ),
- array( 'aaaa', 'aaaa' ),
- array( '/a', 'a' ),
- array( '\\a', 'a' ),
- array( '/aaaa', 'aaaa' ),
- array( '\\aaaa', 'aaaa' ),
- 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( 'C:\\Progra~1\\Wikime~1\\Wikipe~1\\VIEWER.EXE', 'VIEWER.EXE' ),
- array( 'Östergötland_coat_of_arms.png', 'Östergötland_coat_of_arms.png' ),
- );
- }
-}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php b/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
deleted file mode 100644
index 192689f8..00000000
--- a/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-/**
- * Unit tests for wfExpandUrl()
- */
-
-class wfExpandUrl extends MediaWikiTestCase {
- /** @dataProvider provideExpandableUrls */
- public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $canServer, $httpsMode, $message ) {
- // Fake $wgServer and $wgCanonicalServer
- global $wgServer, $wgCanonicalServer;
- $oldServer = $wgServer;
- $oldCanServer = $wgCanonicalServer;
- $wgServer = $server;
- $wgCanonicalServer = $canServer;
-
- // Fake $_SERVER['HTTPS'] if needed
- if ( $httpsMode ) {
- $_SERVER['HTTPS'] = 'on';
- } else {
- unset( $_SERVER['HTTPS'] );
- }
-
- $this->assertEquals( $fullUrl, wfExpandUrl( $shortUrl, $defaultProto ), $message );
-
- // Restore $wgServer and $wgCanonicalServer
- $wgServer = $oldServer;
- $wgCanonicalServer = $oldCanServer;
- }
-
- /**
- * Provider of URL examples for testing wfExpandUrl()
- *
- * @return array
- */
- public function provideExpandableUrls() {
- $modes = array( 'http', 'https' );
- $servers = array( 'http' => 'http://example.com', 'https' => 'https://example.com', 'protocol-relative' => '//example.com' );
- $defaultProtos = array( 'http' => PROTO_HTTP, 'https' => PROTO_HTTPS, 'protocol-relative' => PROTO_RELATIVE, 'current' => PROTO_CURRENT, 'canonical' => PROTO_CANONICAL );
-
- $retval = array();
- foreach ( $modes as $mode ) {
- $httpsMode = $mode == 'https';
- foreach ( $servers as $serverDesc => $server ) {
- foreach ( $modes as $canServerMode ) {
- $canServer = "$canServerMode://example2.com";
- foreach ( $defaultProtos as $protoDesc => $defaultProto ) {
- $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 )" );
- $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 )" );
- # 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 )" );
-
- // Determine expected protocol
- $p = $protoDesc . ':'; // default case
- if ( $protoDesc == 'protocol-relative' ) {
- $p = '';
- } elseif ( $protoDesc == 'current' ) {
- $p = "$mode:";
- } elseif ( $protoDesc == 'canonical' ) {
- $p = "$canServerMode:";
- } else {
- $p = $protoDesc . ':';
- }
- // Determine expected server name
- if ( $protoDesc == 'canonical' ) {
- $srv = $canServer;
- } elseif ( $serverDesc == 'protocol-relative' ) {
- $srv = $p . $server;
- } else {
- $srv = $server;
- }
-
- $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 )" );
- $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 )" );
- }
- }
- }
- }
- return $retval;
- }
-}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php b/tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
deleted file mode 100644
index 4c4c4c04..00000000
--- a/tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-class wfGetCaller extends MediaWikiTestCase {
-
- function testZero() {
- $this->assertEquals( __METHOD__, wfGetCaller( 1 ) );
- }
-
- function callerOne() {
- return wfGetCaller();
- }
-
- function testOne() {
- $this->assertEquals( "wfGetCaller::testOne", self::callerOne() );
- }
-
- function intermediateFunction( $level = 2, $n = 0 ) {
- if ( $n > 0 )
- return self::intermediateFunction( $level, $n - 1 );
- return wfGetCaller( $level );
- }
-
- function testTwo() {
- $this->assertEquals( "wfGetCaller::testTwo", self::intermediateFunction() );
- }
-
- function testN() {
- $this->assertEquals( "wfGetCaller::testN", self::intermediateFunction( 2, 0 ) );
- $this->assertEquals( "wfGetCaller::intermediateFunction", self::intermediateFunction( 1, 0 ) );
-
- for ($i=0; $i < 10; $i++)
- $this->assertEquals( "wfGetCaller::intermediateFunction", self::intermediateFunction( $i + 1, $i ) );
- }
-}
-
diff --git a/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php b/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
deleted file mode 100644
index 1cf0e0fb..00000000
--- a/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-/**
- * Unit tests for wfRemoveDotSegments()
- */
-
-class wfRemoveDotSegments extends MediaWikiTestCase {
- /** @dataProvider providePaths */
- public function testWfRemoveDotSegments( $inputPath, $outputPath ) {
- $this->assertEquals(
- $outputPath,
- wfRemoveDotSegments( $inputPath ),
- "Testing $inputPath expands to $outputPath"
- );
- }
-
- /**
- * Provider of URL paths for testing wfRemoveDotSegments()
- *
- * @return array
- */
- public function providePaths() {
- return array(
- array( '/a/b/c/./../../g', '/a/g' ),
- array( 'mid/content=5/../6', 'mid/6' ),
- array( '/a//../b', '/a/b' ),
- array( '/.../a', '/.../a' ),
- array( '.../a', '.../a' ),
- array( '', '' ),
- array( '/', '/' ),
- array( '//', '//' ),
- array( '.', '' ),
- array( '..', '' ),
- array( '...', '...' ),
- array( '/.', '/' ),
- array( '/..', '/' ),
- array( './', '' ),
- array( '../', '' ),
- array( './a', 'a' ),
- array( '../a', 'a' ),
- array( '../../a', 'a' ),
- array( '.././a', 'a' ),
- array( './../a', 'a' ),
- array( '././a', 'a' ),
- array( '../../', '' ),
- array( '.././', '' ),
- array( './../', '' ),
- array( '././', '' ),
- array( '../..', '' ),
- array( '../.', '' ),
- array( './..', '' ),
- array( './.', '' ),
- array( '/../../a', '/a' ),
- array( '/.././a', '/a' ),
- array( '/./../a', '/a' ),
- array( '/././a', '/a' ),
- array( '/../../', '/' ),
- array( '/.././', '/' ),
- array( '/./../', '/' ),
- array( '/././', '/' ),
- array( '/../..', '/' ),
- array( '/../.', '/' ),
- array( '/./..', '/' ),
- array( '/./.', '/' ),
- array( 'b/../../a', '/a' ),
- array( 'b/.././a', '/a' ),
- array( 'b/./../a', '/a' ),
- array( 'b/././a', 'b/a' ),
- array( 'b/../../', '/' ),
- array( 'b/.././', '/' ),
- array( 'b/./../', '/' ),
- array( 'b/././', 'b/' ),
- array( 'b/../..', '/' ),
- array( 'b/../.', '/' ),
- array( 'b/./..', '/' ),
- array( 'b/./.', 'b/' ),
- array( '/b/../../a', '/a' ),
- array( '/b/.././a', '/a' ),
- array( '/b/./../a', '/a' ),
- array( '/b/././a', '/b/a' ),
- array( '/b/../../', '/' ),
- array( '/b/.././', '/' ),
- array( '/b/./../', '/' ),
- array( '/b/././', '/b/' ),
- array( '/b/../..', '/' ),
- array( '/b/../.', '/' ),
- array( '/b/./..', '/' ),
- array( '/b/./.', '/b/' ),
- );
- }
-}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php b/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
deleted file mode 100644
index 1df26d2c..00000000
--- a/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-class wfShorthandToIntegerTest extends MediaWikiTestCase {
- /**
- * @dataProvider provideABunchOfShorthands
- */
- function testWfShorthandToInteger( $input, $output, $description ) {
- $this->assertEquals(
- wfShorthandToInteger( $input ),
- $output,
- $description
- );
- }
-
- function provideABunchOfShorthands() {
- return array(
- array( '', -1, 'Empty string' ),
- array( ' ', -1, 'String of spaces' ),
- array( '1G', 1024 * 1024 * 1024, 'One gig uppercased' ),
- array( '1g', 1024 * 1024 * 1024, 'One gig lowercased' ),
- array( '1M', 1024 * 1024, 'One meg uppercased' ),
- array( '1m', 1024 * 1024, 'One meg lowercased' ),
- array( '1K', 1024, 'One kb uppercased' ),
- array( '1k', 1024, 'One kb lowercased' ),
- );
- }
-
-}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php b/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
deleted file mode 100644
index 505c28c7..00000000
--- a/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-
-/*
- * Tests for wfTimestamp()
- */
-class wfTimestamp extends MediaWikiTestCase {
- /**
- * @dataProvider provideNormalTimestamps
- */
- function testNormalTimestamps( $input, $format, $output, $desc ) {
- $this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
- }
-
- function provideNormalTimestamps() {
- $t = gmmktime( 12, 34, 56, 1, 15, 2001 );
- return array (
- // TS_UNIX
- array( $t, TS_MW, '20010115123456', 'TS_UNIX to TS_MW' ),
- array( -30281104, TS_MW, '19690115123456', 'Negative TS_UNIX to TS_MW' ),
- array( $t, TS_UNIX, 979562096, 'TS_UNIX to TS_UNIX' ),
- array( $t, TS_DB, '2001-01-15 12:34:56', 'TS_UNIX to TS_DB' ),
-
- array( $t, TS_ISO_8601_BASIC, '20010115T123456Z', 'TS_ISO_8601_BASIC to TS_DB' ),
-
- // TS_MW
- array( '20010115123456', TS_MW, '20010115123456', 'TS_MW to TS_MW' ),
- array( '20010115123456', TS_UNIX, 979562096, 'TS_MW to TS_UNIX' ),
- array( '20010115123456', TS_DB, '2001-01-15 12:34:56', 'TS_MW to TS_DB' ),
- array( '20010115123456', TS_ISO_8601_BASIC, '20010115T123456Z', 'TS_MW to TS_ISO_8601_BASIC' ),
-
- // TS_DB
- 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' ),
-
- # 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' ),
-
- # 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' ),
- );
- }
-
- /**
- * This test checks wfTimestamp() with values outside.
- * It needs PHP 64 bits or PHP > 5.1.
- * See r74778 and bug 25451
- * @dataProvider provideOldTimestamps
- */
- function testOldTimestamps( $input, $format, $output, $desc ) {
- $this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
- }
-
- function provideOldTimestamps() {
- return array (
- 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( '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]]' ),
-
- /* @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' ),
- array( '-62135596800', TS_RFC2822, 'Mon, 01 Jan 0001 00:00:00 GMT', 'Year 1' ),
-
- /* It is not clear if we should generate a year 0 or not
- * 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]]' ),
- );
- }
-
- /**
- * The Resource Loader uses wfTimestamp() to convert timestamps
- * from If-Modified-Since header. Thus it must be able to parse all
- * rfc2616 date formats
- * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
- * @dataProvider provideHttpDates
- */
- function testHttpDate( $input, $output, $desc ) {
- $this->assertEquals( $output, wfTimestamp( TS_MW, $input ), $desc );
- }
-
- function provideHttpDates() {
- return array(
- array( 'Sun, 06 Nov 1994 08:49:37 GMT', '19941106084937', 'RFC 822 date' ),
- 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' ),
- );
- }
-
- /**
- * There are a number of assumptions in our codebase where wfTimestamp()
- * should give the current date but it is not given a 0 there. See r71751 CR
- */
- function testTimestampParameter() {
- $now = wfTimestamp( TS_UNIX );
- // We check that wfTimestamp doesn't return false (error) and use a LessThan assert
- // for the cases where the test is run in a second boundary.
-
- $zero = wfTimestamp( TS_UNIX, 0 );
- $this->assertNotEquals( false, $zero );
- $this->assertLessThan( 5, $zero - $now );
-
- $empty = wfTimestamp( TS_UNIX, '' );
- $this->assertNotEquals( false, $empty );
- $this->assertLessThan( 5, $empty - $now );
-
- $null = wfTimestamp( TS_UNIX, null );
- $this->assertNotEquals( false, $null );
- $this->assertLessThan( 5, $null - $now );
- }
-}
diff --git a/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php b/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
deleted file mode 100644
index cd1a8dbd..00000000
--- a/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-/**
- * Tests for includes/GlobalFunctions.php -> wfUrlencode()
- *
- * The function only need a string parameter and might react to IIS7.0
- */
-
-class wfUrlencodeTest extends MediaWikiTestCase {
-
- #### TESTS ##############################################################
-
- /** @dataProvider provideURLS */
- public function testEncodingUrlWith( $input, $expected ) {
- $this->verifyEncodingFor( 'Apache', $input, $expected );
- }
-
- /** @dataProvider provideURLS */
- public function testEncodingUrlWithMicrosoftIis7( $input, $expected ) {
- $this->verifyEncodingFor( 'Microsoft-IIS/7', $input, $expected );
- }
-
- #### HELPERS #############################################################
-
- /**
- * Internal helper that actually run the test.
- * Called by the public methods testEncodingUrlWith...()
- *
- */
- private function verifyEncodingFor( $server, $input, $expectations ) {
- $expected = $this->extractExpect( $server, $expectations );
-
- // save up global
- $old = isset($_SERVER['SERVER_SOFTWARE'])
- ? $_SERVER['SERVER_SOFTWARE']
- : null
- ;
- $_SERVER['SERVER_SOFTWARE'] = $server;
- wfUrlencode( null );
-
- // do the requested test
- $this->assertEquals(
- $expected,
- wfUrlencode( $input ),
- "Encoding '$input' for server '$server' should be '$expected'"
- );
-
- // restore global
- if( $old === null ) {
- unset( $_SERVER['SERVER_SOFTWARE'] );
- } else {
- $_SERVER['SERVER_SOFTWARE'] = $old;
- }
- wfUrlencode( null );
- }
-
- /**
- * Interprets the provider array. Return expected value depending
- * the HTTP server name.
- */
- private function extractExpect( $server, $expectations ) {
- if( is_string( $expectations ) ) {
- 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" );
- } 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" );
- }
- }
-
-
- #### PROVIDERS ###########################################################
-
- /**
- * Format is either:
- * array( 'input', 'expected' );
- * Or:
- * array( 'input',
- * array( 'Apache', 'expected' ),
- * array( 'Microsoft-IIS/7', 'expected' ),
- * ),
- * If you want to add other HTTP server name, you will have to add a new
- * testing method much like the testEncodingUrlWith() method above.
- */
- public function provideURLS() {
- return array(
- ### RFC 1738 chars
- // + is not safe
- array( '+', '%2B' ),
- // & and = not safe in queries
- array( '&', '%26' ),
- array( '=', '%3D' ),
-
- array( ':', array(
- 'Apache' => ':',
- 'Microsoft-IIS/7' => '%3A',
- ) ),
-
- // remaining chars do not need encoding
- array(
- ';@$-_.!*',
- ';@$-_.!*',
- ),
-
- ### Other tests
- // slash remain unchanged. %2F seems to break things
- array( '/', '/' ),
-
- // Other 'funnies' chars
- array( '[]', '%5B%5D' ),
- array( '<>', '%3C%3E' ),
-
- // Apostrophe is encoded
- array( '\'', '%27' ),
- );
- }
-}
diff --git a/tests/phpunit/includes/HooksTest.php b/tests/phpunit/includes/HooksTest.php
deleted file mode 100644
index 2f9d9f8d..00000000
--- a/tests/phpunit/includes/HooksTest.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-class HooksTest extends MediaWikiTestCase {
-
- public function testOldStyleHooks() {
- $foo = 'Foo';
- $bar = 'Bar';
-
- $i = new NothingClass();
-
- global $wgHooks;
-
- $wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someNonStatic' );
-
- wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'fOO', $foo, 'Standard method' );
- $foo = 'Foo';
-
- $wgHooks['MediaWikiHooksTest001'][] = $i;
-
- wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'foo', $foo, 'onEventName style' );
- $foo = 'Foo';
-
- $wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someNonStaticWithData', 'baz' );
-
- wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'baz', $foo, 'Data included' );
- $foo = 'Foo';
-
- $wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someStatic' );
-
- wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'bah', $foo, 'Standard static method' );
- //$foo = 'Foo';
-
- unset( $wgHooks['MediaWikiHooksTest001'] );
-
- }
-
- public function testNewStyleHooks() {
- $foo = 'Foo';
- $bar = 'Bar';
-
- $i = new NothingClass();
-
- Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someNonStatic' ) );
-
- Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'fOO', $foo, 'Standard method' );
- $foo = 'Foo';
-
- Hooks::register( 'MediaWikiHooksTest001', $i );
-
- Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'foo', $foo, 'onEventName style' );
- $foo = 'Foo';
-
- Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someNonStaticWithData', 'baz' ) );
-
- Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'baz', $foo, 'Data included' );
- $foo = 'Foo';
-
- Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someStatic' ) );
-
- Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
- $this->assertEquals( 'bah', $foo, 'Standard static method' );
- $foo = 'Foo';
- }
-}
-
-class NothingClass {
- static public function someStatic( &$foo, &$bar ) {
- $foo = 'bah';
- return true;
- }
-
- public function someNonStatic( &$foo, &$bar ) {
- $foo = 'fOO';
- $bar = 'bAR';
- return true;
- }
-
- public function onMediaWikiHooksTest001( &$foo, &$bar ) {
- $foo = 'foo';
- return true;
- }
-
- public function someNonStaticWithData( $foo, &$bar ) {
- $bar = $foo;
- return true;
- }
-}
diff --git a/tests/phpunit/includes/HtmlTest.php b/tests/phpunit/includes/HtmlTest.php
deleted file mode 100644
index 135ebc5a..00000000
--- a/tests/phpunit/includes/HtmlTest.php
+++ /dev/null
@@ -1,580 +0,0 @@
-<?php
-/** tests for includes/Html.php */
-
-class HtmlTest extends MediaWikiTestCase {
- private static $oldLang;
- private static $oldContLang;
- private static $oldLanguageCode;
- private static $oldNamespaces;
- private static $oldHTML5;
-
- public function setUp() {
- global $wgLang, $wgContLang, $wgLanguageCode, $wgHTML5;
-
- // Save globals
- self::$oldLang = $wgLang;
- self::$oldContLang = $wgContLang;
- self::$oldNamespaces = $wgContLang->getNamespaces();
- self::$oldLanguageCode = $wgLanguageCode;
- self::$oldHTML5 = $wgHTML5;
-
- $wgLanguageCode = 'en';
- $wgContLang = $wgLang = Language::factory( $wgLanguageCode );
-
- // Hardcode namespaces during test runs,
- // so that html output based on existing namespaces
- // can be properly evaluated.
- $wgContLang->setNamespaces( array(
- -2 => 'Media',
- -1 => 'Special',
- 0 => '',
- 1 => 'Talk',
- 2 => 'User',
- 3 => 'User_talk',
- 4 => 'MyWiki',
- 5 => 'MyWiki_Talk',
- 6 => 'File',
- 7 => 'File_talk',
- 8 => 'MediaWiki',
- 9 => 'MediaWiki_talk',
- 10 => 'Template',
- 11 => 'Template_talk',
- 14 => 'Category',
- 15 => 'Category_talk',
- 100 => 'Custom',
- 101 => 'Custom_talk',
- ) );
- }
-
- public function tearDown() {
- global $wgLang, $wgContLang, $wgLanguageCode, $wgHTML5;
-
- // Restore globals
- $wgContLang->setNamespaces( self::$oldNamespaces );
- $wgLang = self::$oldLang;
- $wgContLang = self::$oldContLang;
- $wgLanguageCode = self::$oldLanguageCode;
- $wgHTML5 = self::$oldHTML5;
- }
-
- /**
- * Wrapper to easily set $wgHTML5 = true.
- * Original value will be restored after test completion.
- * @todo Move to MediaWikiTestCase
- */
- public function enableHTML5() {
- global $wgHTML5;
- $wgHTML5 = true;
- }
- /**
- * Wrapper to easily set $wgHTML5 = false
- * Original value will be restored after test completion.
- * @todo Move to MediaWikiTestCase
- */
- public function disableHTML5() {
- global $wgHTML5;
- $wgHTML5 = false;
- }
-
- public function testExpandAttributesSkipsNullAndFalse() {
-
- ### EMPTY ########
- $this->AssertEmpty(
- Html::expandAttributes( array( 'foo' => null ) ),
- 'skip keys with null value'
- );
- $this->AssertEmpty(
- Html::expandAttributes( array( 'foo' => false ) ),
- 'skip keys with false value'
- );
- $this->AssertNotEmpty(
- Html::expandAttributes( array( 'foo' => '' ) ),
- 'keep keys with an empty string'
- );
- }
-
- public function testExpandAttributesForBooleans() {
- global $wgHtml5;
- $this->AssertEquals(
- '',
- Html::expandAttributes( array( 'selected' => false ) ),
- 'Boolean attributes do not generates output when value is false'
- );
- $this->AssertEquals(
- '',
- Html::expandAttributes( array( 'selected' => null ) ),
- 'Boolean attributes do not generates output when value is null'
- );
-
- $this->AssertEquals(
- $wgHtml5 ? ' selected=""' : ' selected="selected"',
- Html::expandAttributes( array( 'selected' => true ) ),
- 'Boolean attributes skip value output'
- );
- $this->AssertEquals(
- $wgHtml5 ? ' selected=""' : ' selected="selected"',
- Html::expandAttributes( array( 'selected' ) ),
- 'Boolean attributes (ex: selected) do not need a value'
- );
- }
-
- /**
- * Test for Html::expandAttributes()
- * Please note it output a string prefixed with a space!
- */
- public function testExpandAttributesVariousExpansions() {
- ### NOT EMPTY ####
- $this->AssertEquals(
- ' empty_string=""',
- Html::expandAttributes( array( 'empty_string' => '' ) ),
- 'Value with an empty string'
- );
- $this->AssertEquals(
- ' key="value"',
- Html::expandAttributes( array( 'key' => 'value' ) ),
- 'Value is a string'
- );
- $this->AssertEquals(
- ' one="1"',
- Html::expandAttributes( array( 'one' => 1 ) ),
- 'Value is a numeric one'
- );
- $this->AssertEquals(
- ' zero="0"',
- Html::expandAttributes( array( 'zero' => 0 ) ),
- 'Value is a numeric zero'
- );
- }
-
- /**
- * Html::expandAttributes has special features for HTML
- * attributes that use space separated lists and also
- * allows arrays to be used as values.
- */
- public function testExpandAttributesListValueAttributes() {
- ### STRING VALUES
- $this->AssertEquals(
- ' class="redundant spaces here"',
- Html::expandAttributes( array( 'class' => ' redundant spaces here ' ) ),
- 'Normalization should strip redundant spaces'
- );
- $this->AssertEquals(
- ' class="foo bar"',
- Html::expandAttributes( array( 'class' => 'foo bar foo bar bar' ) ),
- 'Normalization should remove duplicates in string-lists'
- );
- ### "EMPTY" ARRAY VALUES
- $this->AssertEquals(
- ' class=""',
- Html::expandAttributes( array( 'class' => array() ) ),
- 'Value with an empty array'
- );
- $this->AssertEquals(
- ' class=""',
- Html::expandAttributes( array( 'class' => array( null, '', ' ', ' ' ) ) ),
- 'Array with null, empty string and spaces'
- );
- ### NON-EMPTY ARRAY VALUES
- $this->AssertEquals(
- ' class="foo bar"',
- Html::expandAttributes( array( 'class' => array(
- 'foo',
- 'bar',
- 'foo',
- 'bar',
- 'bar',
- ) ) ),
- 'Normalization should remove duplicates in the array'
- );
- $this->AssertEquals(
- ' class="foo bar"',
- Html::expandAttributes( array( 'class' => array(
- 'foo bar',
- 'bar foo',
- 'foo',
- 'bar bar',
- ) ) ),
- 'Normalization should remove duplicates in string-lists in the array'
- );
- }
-
- /**
- * Test feature added by r96188, let pass attributes values as
- * a PHP array. Restricted to class,rel, accesskey.
- */
- function testExpandAttributesSpaceSeparatedAttributesWithBoolean() {
- $this->assertEquals(
- ' class="booltrue one"',
- Html::expandAttributes( array( 'class' => array(
- 'booltrue' => true,
- 'one' => 1,
-
- # Method use isset() internally, make sure we do discard
- # attributes values which have been assigned well known values
- 'emptystring' => '',
- 'boolfalse' => false,
- 'zero' => 0,
- 'null' => null,
- )))
- );
- }
-
- /**
- * How do we handle duplicate keys in HTML attributes expansion?
- * We could pass a "class" the values: 'GREEN' and array( 'GREEN' => false )
- * The later will take precedence.
- *
- * Feature added by r96188
- */
- function testValueIsAuthoritativeInSpaceSeparatedAttributesArrays() {
- $this->assertEquals(
- ' class=""',
- Html::expandAttributes( array( 'class' => array(
- 'GREEN',
- 'GREEN' => false,
- 'GREEN',
- )))
- );
- }
-
- function testNamespaceSelector() {
- $this->assertEquals(
- '<select>' . "\n" .
-'<option value="0">(Main)</option>' . "\n" .
-'<option value="1">Talk</option>' . "\n" .
-'<option value="2">User</option>' . "\n" .
-'<option value="3">User talk</option>' . "\n" .
-'<option value="4">MyWiki</option>' . "\n" .
-'<option value="5">MyWiki Talk</option>' . "\n" .
-'<option value="6">File</option>' . "\n" .
-'<option value="7">File talk</option>' . "\n" .
-'<option value="8">MediaWiki</option>' . "\n" .
-'<option value="9">MediaWiki talk</option>' . "\n" .
-'<option value="10">Template</option>' . "\n" .
-'<option value="11">Template talk</option>' . "\n" .
-'<option value="14">Category</option>' . "\n" .
-'<option value="15">Category talk</option>' . "\n" .
-'<option value="100">Custom</option>' . "\n" .
-'<option value="101">Custom talk</option>' . "\n" .
-'</select>',
- Html::namespaceSelector(),
- 'Basic namespace selector without custom options'
- );
-
- $this->assertEquals(
- '<label for="mw-test-namespace">Select a namespace:</label>&#160;' .
-'<select id="mw-test-namespace" name="wpNamespace">' . "\n" .
-'<option value="all">all</option>' . "\n" .
-'<option value="0">(Main)</option>' . "\n" .
-'<option value="1">Talk</option>' . "\n" .
-'<option value="2" selected="">User</option>' . "\n" .
-'<option value="3">User talk</option>' . "\n" .
-'<option value="4">MyWiki</option>' . "\n" .
-'<option value="5">MyWiki Talk</option>' . "\n" .
-'<option value="6">File</option>' . "\n" .
-'<option value="7">File talk</option>' . "\n" .
-'<option value="8">MediaWiki</option>' . "\n" .
-'<option value="9">MediaWiki talk</option>' . "\n" .
-'<option value="10">Template</option>' . "\n" .
-'<option value="11">Template talk</option>' . "\n" .
-'<option value="14">Category</option>' . "\n" .
-'<option value="15">Category talk</option>' . "\n" .
-'<option value="100">Custom</option>' . "\n" .
-'<option value="101">Custom talk</option>' . "\n" .
-'</select>',
- Html::namespaceSelector(
- array( 'selected' => '2', 'all' => 'all', 'label' => 'Select a namespace:' ),
- array( 'name' => 'wpNamespace', 'id' => 'mw-test-namespace' )
- ),
- 'Basic namespace selector with custom values'
- );
-
- $this->assertEquals(
- '<label>Select a namespace:</label>&#160;' .
-'<select>' . "\n" .
-'<option value="0">(Main)</option>' . "\n" .
-'<option value="1">Talk</option>' . "\n" .
-'<option value="2">User</option>' . "\n" .
-'<option value="3">User talk</option>' . "\n" .
-'<option value="4">MyWiki</option>' . "\n" .
-'<option value="5">MyWiki Talk</option>' . "\n" .
-'<option value="6">File</option>' . "\n" .
-'<option value="7">File talk</option>' . "\n" .
-'<option value="8">MediaWiki</option>' . "\n" .
-'<option value="9">MediaWiki talk</option>' . "\n" .
-'<option value="10">Template</option>' . "\n" .
-'<option value="11">Template talk</option>' . "\n" .
-'<option value="14">Category</option>' . "\n" .
-'<option value="15">Category talk</option>' . "\n" .
-'<option value="100">Custom</option>' . "\n" .
-'<option value="101">Custom talk</option>' . "\n" .
-'</select>',
- Html::namespaceSelector(
- array( 'label' => 'Select a namespace:' )
- ),
- 'Basic namespace selector with a custom label but no id attribtue for the <select>'
- );
- }
-
- function testCanFilterOutNamespaces() {
- $this->assertEquals(
-'<select>' . "\n" .
-'<option value="2">User</option>' . "\n" .
-'<option value="4">MyWiki</option>' . "\n" .
-'<option value="5">MyWiki Talk</option>' . "\n" .
-'<option value="6">File</option>' . "\n" .
-'<option value="7">File talk</option>' . "\n" .
-'<option value="8">MediaWiki</option>' . "\n" .
-'<option value="9">MediaWiki talk</option>' . "\n" .
-'<option value="10">Template</option>' . "\n" .
-'<option value="11">Template talk</option>' . "\n" .
-'<option value="14">Category</option>' . "\n" .
-'<option value="15">Category talk</option>' . "\n" .
-'</select>',
- Html::namespaceSelector(
- array( 'exclude' => array( 0, 1, 3, 100, 101 ) )
- ),
- 'Namespace selector namespace filtering.'
- );
- }
-
- function testCanDisableANamespaces() {
- $this->assertEquals(
-'<select>' . "\n" .
-'<option disabled="" value="0">(Main)</option>' . "\n" .
-'<option disabled="" value="1">Talk</option>' . "\n" .
-'<option disabled="" value="2">User</option>' . "\n" .
-'<option disabled="" value="3">User talk</option>' . "\n" .
-'<option disabled="" value="4">MyWiki</option>' . "\n" .
-'<option value="5">MyWiki Talk</option>' . "\n" .
-'<option value="6">File</option>' . "\n" .
-'<option value="7">File talk</option>' . "\n" .
-'<option value="8">MediaWiki</option>' . "\n" .
-'<option value="9">MediaWiki talk</option>' . "\n" .
-'<option value="10">Template</option>' . "\n" .
-'<option value="11">Template talk</option>' . "\n" .
-'<option value="14">Category</option>' . "\n" .
-'<option value="15">Category talk</option>' . "\n" .
-'<option value="100">Custom</option>' . "\n" .
-'<option value="101">Custom talk</option>' . "\n" .
-'</select>',
- Html::namespaceSelector( array(
- 'disable' => array( 0, 1, 2, 3, 4 )
- ) ),
- 'Namespace selector namespace disabling'
- );
- }
-
- /**
- * @dataProvider providesHtml5InputTypes
- */
- function testHtmlElementAcceptsNewHtml5TypesInHtml5Mode( $HTML5InputType ) {
- $this->enableHTML5();
- $this->assertEquals(
- '<input type="' . $HTML5InputType . '" />',
- HTML::element( 'input', array( 'type' => $HTML5InputType ) ),
- 'In HTML5, HTML::element() should accept type="' . $HTML5InputType . '"'
- );
- }
-
- /**
- * List of input element types values introduced by HTML5
- * Full list at http://www.w3.org/TR/html-markup/input.html
- */
- function providesHtml5InputTypes() {
- $types = array(
- 'datetime',
- 'datetime-local',
- 'date',
- 'month',
- 'time',
- 'week',
- 'number',
- 'range',
- 'email',
- 'url',
- 'search',
- 'tel',
- 'color',
- );
- $cases = array();
- foreach( $types as $type ) {
- $cases[] = array( $type );
- }
- return $cases;
- }
-
- /**
- * Test out Html::element drops default value
- * @cover Html::dropDefaults
- * @dataProvider provideElementsWithAttributesHavingDefaultValues
- */
- function testDropDefaults( $expected, $element, $message = '' ) {
- $this->enableHTML5();
- $this->assertEquals( $expected, $element, $message );
- }
-
- function provideElementsWithAttributesHavingDefaultValues() {
- # Use cases in a concise format:
- # <expected>, <element name>, <array of attributes> [, <message>]
- # Will be mapped to Html::element()
- $cases = array();
-
- ### Generic cases, match $attribDefault static array
- $cases[] = array( '<area />',
- 'area', array( 'shape' => 'rect' )
- );
-
- $cases[] = array( '<button></button>',
- 'button', array( 'formaction' => 'GET' )
- );
- $cases[] = array( '<button></button>',
- 'button', array( 'formenctype' => 'application/x-www-form-urlencoded' )
- );
- $cases[] = array( '<button></button>',
- 'button', array( 'type' => 'submit' )
- );
-
- $cases[] = array( '<canvas></canvas>',
- 'canvas', array( 'height' => '150' )
- );
- $cases[] = array( '<canvas></canvas>',
- 'canvas', array( 'width' => '300' )
- );
- # Also check with numeric values
- $cases[] = array( '<canvas></canvas>',
- 'canvas', array( 'height' => 150 )
- );
- $cases[] = array( '<canvas></canvas>',
- 'canvas', array( 'width' => 300 )
- );
-
- $cases[] = array( '<command />',
- 'command', array( 'type' => 'command' )
- );
-
- $cases[] = array( '<form></form>',
- 'form', array( 'action' => 'GET' )
- );
- $cases[] = array( '<form></form>',
- 'form', array( 'autocomplete' => 'on' )
- );
- $cases[] = array( '<form></form>',
- 'form', array( 'enctype' => 'application/x-www-form-urlencoded' )
- );
-
- $cases[] = array( '<input />',
- 'input', array( 'formaction' => 'GET' )
- );
- $cases[] = array( '<input />',
- 'input', array( 'type' => 'text' )
- );
-
- $cases[] = array( '<keygen />',
- 'keygen', array( 'keytype' => 'rsa' )
- );
-
- $cases[] = array( '<link />',
- 'link', array( 'media' => 'all' )
- );
-
- $cases[] = array( '<menu></menu>',
- 'menu', array( 'type' => 'list' )
- );
-
- $cases[] = array( '<script></script>',
- 'script', array( 'type' => 'text/javascript' )
- );
-
- $cases[] = array( '<style></style>',
- 'style', array( 'media' => 'all' )
- );
- $cases[] = array( '<style></style>',
- 'style', array( 'type' => 'text/css' )
- );
-
- $cases[] = array( '<textarea></textarea>',
- 'textarea', array( 'wrap' => 'soft' )
- );
-
- ### SPECIFIC CASES
-
- # <link type="text/css" />
- $cases[] = array( '<link />',
- 'link', array( 'type' => 'text/css' )
- );
-
- # <input /> specific handling
- $cases[] = array( '<input type="checkbox" />',
- 'input', array( 'type' => 'checkbox', 'value' => 'on' ),
- 'Default value "on" is stripped of checkboxes',
- );
- $cases[] = array( '<input type="radio" />',
- 'input', array( 'type' => 'radio', 'value' => 'on' ),
- 'Default value "on" is stripped of radio buttons',
- );
- $cases[] = array( '<input type="submit" value="Submit" />',
- 'input', array( 'type' => 'submit', 'value' => 'Submit' ),
- 'Default value "Submit" is kept on submit buttons (for possible l10n issues)',
- );
- $cases[] = array( '<input type="color" />',
- 'input', array( 'type' => 'color', 'value' => '' ),
- );
- $cases[] = array( '<input type="range" />',
- 'input', array( 'type' => 'range', 'value' => '' ),
- );
-
- # <select /> specifc handling
- $cases[] = array( '<select multiple=""></select>',
- 'select', array( 'size' => '4', 'multiple' => true ),
- );
- # .. with numeric value
- $cases[] = array( '<select multiple=""></select>',
- 'select', array( 'size' => 4, 'multiple' => true ),
- );
- $cases[] = array( '<select></select>',
- 'select', array( 'size' => '1', 'multiple' => false ),
- );
- # .. with numeric value
- $cases[] = array( '<select></select>',
- 'select', array( 'size' => 1, 'multiple' => false ),
- );
-
- # Passing an array as value
- $cases[] = array( '<a class="css-class-one css-class-two"></a>',
- 'a', array( 'class' => array( 'css-class-one', 'css-class-two' ) ),
- "dropDefaults accepts values given as an array"
- );
-
- # FIXME: doDropDefault should remove defaults given in an array
- # Expected should be '<a></a>'
- $cases[] = array( '<a class=""></a>',
- 'a', array( 'class' => array( '', '' ) ),
- "dropDefaults accepts values given as an array"
- );
-
-
- # Craft the Html elements
- $ret = array();
- foreach( $cases as $case ) {
- $ret[] = array(
- $case[0],
- Html::element( $case[1], $case[2] )
- );
- }
- return $ret;
- }
-
- public function testFormValidationBlacklist() {
- $this->assertEmpty(
- 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\"'."
- );
- }
-
-}
diff --git a/tests/phpunit/includes/HttpTest.php b/tests/phpunit/includes/HttpTest.php
deleted file mode 100644
index 263383f1..00000000
--- a/tests/phpunit/includes/HttpTest.php
+++ /dev/null
@@ -1,180 +0,0 @@
-<?php
-/**
- * @group Broken
- */
-class HttpTest extends MediaWikiTestCase {
- /**
- * @dataProvider cookieDomains
- */
- function testValidateCookieDomain( $expected, $domain, $origin = null ) {
- if ( $origin ) {
- $ok = Cookie::validateCookieDomain( $domain, $origin );
- $msg = "$domain against origin $origin";
- } else {
- $ok = Cookie::validateCookieDomain( $domain );
- $msg = "$domain";
- }
- $this->assertEquals( $expected, $ok, $msg );
- }
-
- function cookieDomains() {
- return array(
- array( false, "org"),
- array( false, ".org"),
- array( true, "wikipedia.org"),
- array( true, ".wikipedia.org"),
- array( false, "co.uk" ),
- array( false, ".co.uk" ),
- array( false, "gov.uk" ),
- array( false, ".gov.uk" ),
- array( true, "supermarket.uk" ),
- array( false, "uk" ),
- array( false, ".uk" ),
- array( false, "127.0.0." ),
- array( false, "127." ),
- array( false, "127.0.0.1." ),
- array( true, "127.0.0.1" ),
- array( false, "333.0.0.1" ),
- array( true, "example.com" ),
- array( false, "example.com." ),
- array( true, ".example.com" ),
-
- array( true, ".example.com", "www.example.com" ),
- array( false, "example.com", "www.example.com" ),
- array( true, "127.0.0.1", "127.0.0.1" ),
- array( false, "127.0.0.1", "localhost" ),
- );
- }
-
- /**
- * Test Http::isValidURI()
- * @bug 27854 : Http::isValidURI is too lax
- * @dataProvider provideURI
- */
- function testIsValidUri( $expect, $URI, $message = '' ) {
- $this->assertEquals(
- $expect,
- (bool) Http::isValidURI( $URI ),
- $message
- );
- }
-
- /**
- * Feeds URI to test a long regular expression in Http::isValidURI
- */
- function provideURI() {
- /** Format: 'boolean expectation', 'URI to test', 'Optional message' */
- return array(
- array( false, '¿non sens before!! http://a', 'Allow anything before URI' ),
-
- # (http|https) - only two schemes allowed
- array( true, 'http://www.example.org/' ),
- array( true, 'https://www.example.org/' ),
- array( true, 'http://www.example.org', 'URI without directory' ),
- array( true, 'http://a', 'Short name' ),
- array( true, 'http://étoile', 'Allow UTF-8 in hostname' ), # 'étoile' is french for 'star'
- array( false, '\\host\directory', 'CIFS share' ),
- array( false, 'gopher://host/dir', 'Reject gopher scheme' ),
- array( false, 'telnet://host', 'Reject telnet scheme' ),
-
- # :\/\/ - double slashes
- array( false, 'http//example.org', 'Reject missing colon in protocol' ),
- array( false, 'http:/example.org', 'Reject missing slash in protocol' ),
- array( false, 'http:example.org', 'Must have two slashes' ),
- # Following fail since hostname can be made of anything
- array( false, 'http:///example.org', 'Must have exactly two slashes, not three' ),
-
- # (\w+:{0,1}\w*@)? - optional user:pass
- array( true, 'http://user@host', 'Username provided' ),
- array( true, 'http://user:@host', 'Username provided, no password' ),
- array( true, 'http://user:pass@host', 'Username and password provided' ),
-
- # (\S+) - host part is made of anything not whitespaces
- array( false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ),
- array( false, 'http://exam:ple.org/', 'hostname can not use colons!' ),
-
- # (:[0-9]+)? - port number
- array( true, 'http://example.org:80/' ),
- array( true, 'https://example.org:80/' ),
- array( true, 'http://example.org:443/' ),
- array( true, 'https://example.org:443/' ),
-
- # Part after the hostname is / or / with something else
- array( true, 'http://example/#' ),
- array( true, 'http://example/!' ),
- array( true, 'http://example/:' ),
- array( true, 'http://example/.' ),
- array( true, 'http://example/?' ),
- array( true, 'http://example/+' ),
- array( true, 'http://example/=' ),
- array( true, 'http://example/&' ),
- array( true, 'http://example/%' ),
- array( true, 'http://example/@' ),
- array( true, 'http://example/-' ),
- array( true, 'http://example//' ),
- array( true, 'http://example/&' ),
-
- # Fragment
- array( true, 'http://exam#ple.org', ), # This one is valid, really!
- array( true, 'http://example.org:80#anchor' ),
- array( true, 'http://example.org/?id#anchor' ),
- array( true, 'http://example.org/?#anchor' ),
-
- array( false, 'http://a ¿non !!sens after', 'Allow anything after URI' ),
- );
- }
-
- /**
- * Warning:
- *
- * These tests are for code that makes use of an artifact of how CURL
- * handles header reporting on redirect pages, and will need to be
- * rewritten when bug 29232 is taken care of (high-level handling of
- * HTTP redirects).
- */
- function testRelativeRedirections() {
- $h = new MWHttpRequestTester( 'http://oldsite/file.ext' );
- # Forge a Location header
- $h->setRespHeaders( 'location', array(
- 'http://newsite/file.ext',
- '/newfile.ext',
- )
- );
- # Verify we correctly fix the Location
- $this->assertEquals(
- 'http://newsite/newfile.ext',
- $h->getFinalUrl(),
- "Relative file path Location: interpreted as full URL"
- );
-
- $h->setRespHeaders( 'location', array(
- 'https://oldsite/file.ext'
- )
- );
- $this->assertEquals(
- 'https://oldsite/file.ext',
- $h->getFinalUrl(),
- "Location to the HTTPS version of the site"
- );
-
- $h->setRespHeaders( 'location', array(
- '/anotherfile.ext',
- 'http://anotherfile/hoster.ext',
- 'https://anotherfile/hoster.ext'
- )
- );
- $this->assertEquals(
- 'https://anotherfile/hoster.ext',
- $h->getFinalUrl( "Relative file path Location: should keep the latest host and scheme!")
- );
- }
-}
-
-/**
- * Class to let us overwrite MWHttpREquest respHeaders variable
- */
-class MWHttpRequestTester extends MWHttpRequest {
- function setRespHeaders( $name, $value ) {
- $this->respHeaders[$name] = $value ;
- }
-}
diff --git a/tests/phpunit/includes/IPTest.php b/tests/phpunit/includes/IPTest.php
deleted file mode 100644
index f50b2fe9..00000000
--- a/tests/phpunit/includes/IPTest.php
+++ /dev/null
@@ -1,542 +0,0 @@
-<?php
-/**
- * Tests for IP validity functions. Ported from /t/inc/IP.t by avar.
- * @group IP
- */
-
-class IPTest extends MediaWikiTestCase {
- /**
- * not sure it should be tested with boolean false. hashar 20100924
- * @covers IP::isIPAddress
- */
- public function testisIPAddress() {
- $this->assertFalse( IP::isIPAddress( false ), 'Boolean false is not an IP' );
- $this->assertFalse( IP::isIPAddress( true ), 'Boolean true is not an IP' );
- $this->assertFalse( IP::isIPAddress( "" ), 'Empty string is not an IP' );
- $this->assertFalse( IP::isIPAddress( 'abc' ), 'Garbage IP string' );
- $this->assertFalse( IP::isIPAddress( ':' ), 'Single ":" is not an IP' );
- $this->assertFalse( IP::isIPAddress( '2001:0DB8::A:1::1'), 'IPv6 with a double :: occurrence' );
- $this->assertFalse( IP::isIPAddress( '2001:0DB8::A:1::'), 'IPv6 with a double :: occurrence, last at end' );
- $this->assertFalse( IP::isIPAddress( '::2001:0DB8::5:1'), 'IPv6 with a double :: occurrence, firt at beginning' );
- $this->assertFalse( IP::isIPAddress( '124.24.52' ), 'IPv4 not enough quads' );
- $this->assertFalse( IP::isIPAddress( '24.324.52.13' ), 'IPv4 out of range' );
- $this->assertFalse( IP::isIPAddress( '.24.52.13' ), 'IPv4 starts with period' );
- $this->assertFalse( IP::isIPAddress( 'fc:100:300' ), 'IPv6 with only 3 words' );
-
- $this->assertTrue( IP::isIPAddress( '::' ), 'RFC 4291 IPv6 Unspecified Address' );
- $this->assertTrue( IP::isIPAddress( '::1' ), 'RFC 4291 IPv6 Loopback Address' );
- $this->assertTrue( IP::isIPAddress( '74.24.52.13/20', 'IPv4 range' ) );
- $this->assertTrue( IP::isIPAddress( 'fc:100:a:d:1:e:ac:0/24' ), 'IPv6 range' );
- $this->assertTrue( IP::isIPAddress( 'fc::100:a:d:1:e:ac/96' ), 'IPv6 range with "::"' );
-
- $validIPs = array( 'fc:100::', 'fc:100:a:d:1:e:ac::', 'fc::100', '::fc:100:a:d:1:e:ac',
- '::fc', 'fc::100:a:d:1:e:ac', 'fc:100:a:d:1:e:ac:0', '124.24.52.13', '1.24.52.13' );
- foreach ( $validIPs as $ip ) {
- $this->assertTrue( IP::isIPAddress( $ip ), "$ip is a valid IP address" );
- }
- }
-
- /**
- * @covers IP::isIPv6
- */
- public function testisIPv6() {
- $this->assertFalse( IP::isIPv6( ':fc:100::' ), 'IPv6 starting with lone ":"' );
- $this->assertFalse( IP::isIPv6( 'fc:100:::' ), 'IPv6 ending with a ":::"' );
- $this->assertFalse( IP::isIPv6( 'fc:300' ), 'IPv6 with only 2 words' );
- $this->assertFalse( IP::isIPv6( 'fc:100:300' ), 'IPv6 with only 3 words' );
-
- $this->assertTrue( IP::isIPv6( 'fc:100::' ) );
- $this->assertTrue( IP::isIPv6( 'fc:100:a::' ) );
- $this->assertTrue( IP::isIPv6( 'fc:100:a:d::' ) );
- $this->assertTrue( IP::isIPv6( 'fc:100:a:d:1::' ) );
- $this->assertTrue( IP::isIPv6( 'fc:100:a:d:1:e::' ) );
- $this->assertTrue( IP::isIPv6( 'fc:100:a:d:1:e:ac::' ) );
-
- $this->assertFalse( IP::isIPv6( 'fc:100:a:d:1:e:ac:0::' ), 'IPv6 with 8 words ending with "::"' );
- $this->assertFalse( IP::isIPv6( 'fc:100:a:d:1:e:ac:0:1::' ), 'IPv6 with 9 words ending with "::"' );
-
- $this->assertFalse( IP::isIPv6( ':::' ) );
- $this->assertFalse( IP::isIPv6( '::0:' ), 'IPv6 ending in a lone ":"' );
-
- $this->assertTrue( IP::isIPv6( '::' ), 'IPv6 zero address' );
- $this->assertTrue( IP::isIPv6( '::0' ) );
- $this->assertTrue( IP::isIPv6( '::fc' ) );
- $this->assertTrue( IP::isIPv6( '::fc:100' ) );
- $this->assertTrue( IP::isIPv6( '::fc:100:a' ) );
- $this->assertTrue( IP::isIPv6( '::fc:100:a:d' ) );
- $this->assertTrue( IP::isIPv6( '::fc:100:a:d:1' ) );
- $this->assertTrue( IP::isIPv6( '::fc:100:a:d:1:e' ) );
- $this->assertTrue( IP::isIPv6( '::fc:100:a:d:1:e:ac' ) );
-
- $this->assertFalse( IP::isIPv6( '::fc:100:a:d:1:e:ac:0' ), 'IPv6 with "::" and 8 words' );
- $this->assertFalse( IP::isIPv6( '::fc:100:a:d:1:e:ac:0:1' ), 'IPv6 with 9 words' );
-
- $this->assertFalse( IP::isIPv6( ':fc::100' ), 'IPv6 starting with lone ":"' );
- $this->assertFalse( IP::isIPv6( 'fc::100:' ), 'IPv6 ending with lone ":"' );
- $this->assertFalse( IP::isIPv6( 'fc:::100' ), 'IPv6 with ":::" in the middle' );
-
- $this->assertTrue( IP::isIPv6( 'fc::100' ), 'IPv6 with "::" and 2 words' );
- $this->assertTrue( IP::isIPv6( 'fc::100:a' ), 'IPv6 with "::" and 3 words' );
- $this->assertTrue( IP::isIPv6( 'fc::100:a:d', 'IPv6 with "::" and 4 words' ) );
- $this->assertTrue( IP::isIPv6( 'fc::100:a:d:1' ), 'IPv6 with "::" and 5 words' );
- $this->assertTrue( IP::isIPv6( 'fc::100:a:d:1:e' ), 'IPv6 with "::" and 6 words' );
- $this->assertTrue( IP::isIPv6( 'fc::100:a:d:1:e:ac' ), 'IPv6 with "::" and 7 words' );
- $this->assertTrue( IP::isIPv6( '2001::df'), 'IPv6 with "::" and 2 words' );
- $this->assertTrue( IP::isIPv6( '2001:5c0:1400:a::df'), 'IPv6 with "::" and 5 words' );
- $this->assertTrue( IP::isIPv6( '2001:5c0:1400:a::df:2'), 'IPv6 with "::" and 6 words' );
-
- $this->assertFalse( IP::isIPv6( 'fc::100:a:d:1:e:ac:0' ), 'IPv6 with "::" and 8 words' );
- $this->assertFalse( IP::isIPv6( 'fc::100:a:d:1:e:ac:0:1' ), 'IPv6 with 9 words' );
-
- $this->assertTrue( IP::isIPv6( 'fc:100:a:d:1:e:ac:0' ) );
- }
-
- /**
- * @covers IP::isIPv4
- */
- public function testisIPv4() {
- $this->assertFalse( IP::isIPv4( false ), 'Boolean false is not an IP' );
- $this->assertFalse( IP::isIPv4( true ), 'Boolean true is not an IP' );
- $this->assertFalse( IP::isIPv4( "" ), 'Empty string is not an IP' );
- $this->assertFalse( IP::isIPv4( 'abc' ) );
- $this->assertFalse( IP::isIPv4( ':' ) );
- $this->assertFalse( IP::isIPv4( '124.24.52' ), 'IPv4 not enough quads' );
- $this->assertFalse( IP::isIPv4( '24.324.52.13' ), 'IPv4 out of range' );
- $this->assertFalse( IP::isIPv4( '.24.52.13' ), 'IPv4 starts with period' );
-
- $this->assertTrue( IP::isIPv4( '124.24.52.13' ) );
- $this->assertTrue( IP::isIPv4( '1.24.52.13' ) );
- $this->assertTrue( IP::isIPv4( '74.24.52.13/20', 'IPv4 range' ) );
- }
-
- /**
- * @covers IP::isValid
- */
- public function testValidIPs() {
- foreach ( range( 0, 255 ) as $i ) {
- $a = sprintf( "%03d", $i );
- $b = sprintf( "%02d", $i );
- $c = sprintf( "%01d", $i );
- foreach ( array_unique( array( $a, $b, $c ) ) as $f ) {
- $ip = "$f.$f.$f.$f";
- $this->assertTrue( IP::isValid( $ip ) , "$ip is a valid IPv4 address" );
- }
- }
- foreach ( range( 0x0, 0xFFFF, 0xF ) as $i ) {
- $a = sprintf( "%04x", $i );
- $b = sprintf( "%03x", $i );
- $c = sprintf( "%02x", $i );
- foreach ( array_unique( array( $a, $b, $c ) ) as $f ) {
- $ip = "$f:$f:$f:$f:$f:$f:$f:$f";
- $this->assertTrue( IP::isValid( $ip ) , "$ip is a valid IPv6 address" );
- }
- }
- // test with some abbreviations
- $this->assertFalse( IP::isValid( ':fc:100::' ), 'IPv6 starting with lone ":"' );
- $this->assertFalse( IP::isValid( 'fc:100:::' ), 'IPv6 ending with a ":::"' );
- $this->assertFalse( IP::isValid( 'fc:300' ), 'IPv6 with only 2 words' );
- $this->assertFalse( IP::isValid( 'fc:100:300' ), 'IPv6 with only 3 words' );
-
- $this->assertTrue( IP::isValid( 'fc:100::' ) );
- $this->assertTrue( IP::isValid( 'fc:100:a:d:1:e::' ) );
- $this->assertTrue( IP::isValid( 'fc:100:a:d:1:e:ac::' ) );
-
- $this->assertTrue( IP::isValid( 'fc::100' ), 'IPv6 with "::" and 2 words' );
- $this->assertTrue( IP::isValid( 'fc::100:a' ), 'IPv6 with "::" and 3 words' );
- $this->assertTrue( IP::isValid( '2001::df'), 'IPv6 with "::" and 2 words' );
- $this->assertTrue( IP::isValid( '2001:5c0:1400:a::df'), 'IPv6 with "::" and 5 words' );
- $this->assertTrue( IP::isValid( '2001:5c0:1400:a::df:2'), 'IPv6 with "::" and 6 words' );
- $this->assertTrue( IP::isValid( 'fc::100:a:d:1' ), 'IPv6 with "::" and 5 words' );
- $this->assertTrue( IP::isValid( 'fc::100:a:d:1:e:ac' ), 'IPv6 with "::" and 7 words' );
-
- $this->assertFalse( IP::isValid( 'fc:100:a:d:1:e:ac:0::' ), 'IPv6 with 8 words ending with "::"' );
- $this->assertFalse( IP::isValid( 'fc:100:a:d:1:e:ac:0:1::' ), 'IPv6 with 9 words ending with "::"' );
- }
-
- /**
- * @covers IP::isValid
- */
- public function testInvalidIPs() {
- // Out of range...
- foreach ( range( 256, 999 ) as $i ) {
- $a = sprintf( "%03d", $i );
- $b = sprintf( "%02d", $i );
- $c = sprintf( "%01d", $i );
- foreach ( array_unique( array( $a, $b, $c ) ) as $f ) {
- $ip = "$f.$f.$f.$f";
- $this->assertFalse( IP::isValid( $ip ), "$ip is not a valid IPv4 address" );
- }
- }
- foreach ( range( 'g', 'z' ) as $i ) {
- $a = sprintf( "%04s", $i );
- $b = sprintf( "%03s", $i );
- $c = sprintf( "%02s", $i );
- foreach ( array_unique( array( $a, $b, $c ) ) as $f ) {
- $ip = "$f:$f:$f:$f:$f:$f:$f:$f";
- $this->assertFalse( IP::isValid( $ip ) , "$ip is not a valid IPv6 address" );
- }
- }
- // Have CIDR
- $ipCIDRs = array(
- '212.35.31.121/32',
- '212.35.31.121/18',
- '212.35.31.121/24',
- '::ff:d:321:5/96',
- 'ff::d3:321:5/116',
- 'c:ff:12:1:ea:d:321:5/120',
- );
- foreach ( $ipCIDRs as $i ) {
- $this->assertFalse( IP::isValid( $i ),
- "$i is an invalid IP address because it is a block" );
- }
- // Incomplete/garbage
- $invalid = array(
- 'www.xn--var-xla.net',
- '216.17.184.G',
- '216.17.184.1.',
- '216.17.184',
- '216.17.184.',
- '256.17.184.1'
- );
- foreach ( $invalid as $i ) {
- $this->assertFalse( IP::isValid( $i ), "$i is an invalid IP address" );
- }
- }
-
- /**
- * @covers IP::isValidBlock
- */
- public function testValidBlocks() {
- $valid = array(
- '116.17.184.5/32',
- '0.17.184.5/30',
- '16.17.184.1/24',
- '30.242.52.14/1',
- '10.232.52.13/8',
- '30.242.52.14/0',
- '::e:f:2001/96',
- '::c:f:2001/128',
- '::10:f:2001/70',
- '::fe:f:2001/1',
- '::6d:f:2001/8',
- '::fe:f:2001/0',
- );
- foreach ( $valid as $i ) {
- $this->assertTrue( IP::isValidBlock( $i ), "$i is a valid IP block" );
- }
- }
-
- /**
- * @covers IP::isValidBlock
- */
- public function testInvalidBlocks() {
- $invalid = array(
- '116.17.184.5/33',
- '0.17.184.5/130',
- '16.17.184.1/-1',
- '10.232.52.13/*',
- '7.232.52.13/ab',
- '11.232.52.13/',
- '::e:f:2001/129',
- '::c:f:2001/228',
- '::10:f:2001/-1',
- '::6d:f:2001/*',
- '::86:f:2001/ab',
- '::23:f:2001/',
- );
- foreach ( $invalid as $i ) {
- $this->assertFalse( IP::isValidBlock( $i ), "$i is not a valid IP block" );
- }
- }
-
- /**
- * Improve IP::sanitizeIP() code coverage
- * @todo Most probably incomplete
- */
- public function testSanitizeIP() {
- $this->assertNull( IP::sanitizeIP('') );
- $this->assertNull( IP::sanitizeIP(' ') );
- }
-
- /**
- * test wrapper around ip2long which might return -1 or false depending on PHP version
- * @covers IP::toUnsigned
- */
- public function testip2longWrapper() {
- // @todo FIXME: Add more tests ?
- $this->assertEquals( pow(2,32) - 1, IP::toUnsigned( '255.255.255.255' ));
- $i = 'IN.VA.LI.D';
- $this->assertFalse( IP::toUnSigned( $i ) );
- }
-
- /**
- * @covers IP::isPublic
- */
- public function testPrivateIPs() {
- $private = array( 'fc00::3', 'fc00::ff', '::1', '10.0.0.1', '172.16.0.1', '192.168.0.1' );
- foreach ( $private as $p ) {
- $this->assertFalse( IP::isPublic( $p ), "$p is not a public IP address" );
- }
- $public = array( '2001:5c0:1000:a::133', 'fc::3', '00FC::' );
- foreach ( $public as $p ) {
- $this->assertTrue( IP::isPublic( $p ), "$p is a public IP address" );
- }
- }
-
- // Private wrapper used to test CIDR Parsing.
- private function assertFalseCIDR( $CIDR, $msg='' ) {
- $ff = array( false, false );
- $this->assertEquals( $ff, IP::parseCIDR( $CIDR ), $msg );
- }
-
- // Private wrapper to test network shifting using only dot notation
- private function assertNet( $expected, $CIDR ) {
- $parse = IP::parseCIDR( $CIDR );
- $this->assertEquals( $expected, long2ip( $parse[0] ), "network shifting $CIDR" );
- }
-
- /**
- * @covers IP::hexToQuad
- */
- public function testHexToQuad() {
- $this->assertEquals( '0.0.0.1' , IP::hexToQuad( '00000001' ) );
- $this->assertEquals( '255.0.0.0' , IP::hexToQuad( 'FF000000' ) );
- $this->assertEquals( '255.255.255.255', IP::hexToQuad( 'FFFFFFFF' ) );
- $this->assertEquals( '10.188.222.255' , IP::hexToQuad( '0ABCDEFF' ) );
- // hex not left-padded...
- $this->assertEquals( '0.0.0.0' , IP::hexToQuad( '0' ) );
- $this->assertEquals( '0.0.0.1' , IP::hexToQuad( '1' ) );
- $this->assertEquals( '0.0.0.255' , IP::hexToQuad( 'FF' ) );
- $this->assertEquals( '0.0.255.0' , IP::hexToQuad( 'FF00' ) );
- }
-
- /**
- * @covers IP::hexToOctet
- */
- public function testHexToOctet() {
- $this->assertEquals( '0:0:0:0:0:0:0:1',
- IP::hexToOctet( '00000000000000000000000000000001' ) );
- $this->assertEquals( '0:0:0:0:0:0:FF:3',
- IP::hexToOctet( '00000000000000000000000000FF0003' ) );
- $this->assertEquals( '0:0:0:0:0:0:FF00:6',
- IP::hexToOctet( '000000000000000000000000FF000006' ) );
- $this->assertEquals( '0:0:0:0:0:0:FCCF:FAFF',
- IP::hexToOctet( '000000000000000000000000FCCFFAFF' ) );
- $this->assertEquals( 'FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF',
- IP::hexToOctet( 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' ) );
- // hex not left-padded...
- $this->assertEquals( '0:0:0:0:0:0:0:0' , IP::hexToOctet( '0' ) );
- $this->assertEquals( '0:0:0:0:0:0:0:1' , IP::hexToOctet( '1' ) );
- $this->assertEquals( '0:0:0:0:0:0:0:FF' , IP::hexToOctet( 'FF' ) );
- $this->assertEquals( '0:0:0:0:0:0:0:FFD0' , IP::hexToOctet( 'FFD0' ) );
- $this->assertEquals( '0:0:0:0:0:0:FA00:0' , IP::hexToOctet( 'FA000000' ) );
- $this->assertEquals( '0:0:0:0:0:0:FCCF:FAFF', IP::hexToOctet( 'FCCFFAFF' ) );
- }
-
- /**
- * IP::parseCIDR() returns an array containing a signed IP address
- * representing the network mask and the bit mask.
- * @covers IP::parseCIDR
- */
- function testCIDRParsing() {
- $this->assertFalseCIDR( '192.0.2.0' , "missing mask" );
- $this->assertFalseCIDR( '192.0.2.0/', "missing bitmask" );
-
- // Verify if statement
- $this->assertFalseCIDR( '256.0.0.0/32', "invalid net" );
- $this->assertFalseCIDR( '192.0.2.0/AA', "mask not numeric" );
- $this->assertFalseCIDR( '192.0.2.0/-1', "mask < 0" );
- $this->assertFalseCIDR( '192.0.2.0/33', "mask > 32" );
-
- // Check internal logic
- # 0 mask always result in array(0,0)
- $this->assertEquals( array( 0, 0 ), IP::parseCIDR('192.0.0.2/0') );
- $this->assertEquals( array( 0, 0 ), IP::parseCIDR('0.0.0.0/0') );
- $this->assertEquals( array( 0, 0 ), IP::parseCIDR('255.255.255.255/0') );
-
- // @todo FIXME: Add more tests.
-
- # This part test network shifting
- $this->assertNet( '192.0.0.0' , '192.0.0.2/24' );
- $this->assertNet( '192.168.5.0', '192.168.5.13/24');
- $this->assertNet( '10.0.0.160' , '10.0.0.161/28' );
- $this->assertNet( '10.0.0.0' , '10.0.0.3/28' );
- $this->assertNet( '10.0.0.0' , '10.0.0.3/30' );
- $this->assertNet( '10.0.0.4' , '10.0.0.4/30' );
- $this->assertNet( '172.17.32.0', '172.17.35.48/21' );
- $this->assertNet( '10.128.0.0' , '10.135.0.0/9' );
- $this->assertNet( '134.0.0.0' , '134.0.5.1/8' );
- }
-
-
- /**
- * @covers IP::canonicalize
- */
- public function testIPCanonicalizeOnValidIp() {
- $this->assertEquals( '192.0.2.152', IP::canonicalize( '192.0.2.152' ),
- 'Canonicalization of a valid IP returns it unchanged' );
- }
-
- /**
- * @covers IP::canonicalize
- */
- public function testIPCanonicalizeMappedAddress() {
- $this->assertEquals(
- '192.0.2.152',
- IP::canonicalize( '::ffff:192.0.2.152' )
- );
- $this->assertEquals(
- '192.0.2.152',
- IP::canonicalize( '::192.0.2.152' )
- );
- }
-
- /**
- * Issues there are most probably from IP::toHex() or IP::parseRange()
- * @covers IP::isInRange
- * @dataProvider provideIPsAndRanges
- */
- public function testIPIsInRange( $expected, $addr, $range, $message = '' ) {
- $this->assertEquals(
- $expected,
- IP::isInRange( $addr, $range ),
- $message
- );
- }
-
- /** Provider for testIPIsInRange() */
- function provideIPsAndRanges() {
- # Format: (expected boolean, address, range, optional message)
- return array(
- # IPv4
- array( true , '192.0.2.0' , '192.0.2.0/24', 'Network address' ),
- array( true , '192.0.2.77' , '192.0.2.0/24', 'Simple address' ),
- array( true , '192.0.2.255' , '192.0.2.0/24', 'Broadcast address' ),
-
- array( false, '0.0.0.0' , '192.0.2.0/24' ),
- array( false, '255.255.255' , '192.0.2.0/24' ),
-
- # IPv6
- array( false, '::1' , '2001:DB8::/32' ),
- array( false, '::' , '2001:DB8::/32' ),
- array( false, 'FE80::1', '2001:DB8::/32' ),
-
- array( true , '2001:DB8::' , '2001:DB8::/32' ),
- array( true , '2001:0DB8::' , '2001:DB8::/32' ),
- array( true , '2001:DB8::1' , '2001:DB8::/32' ),
- array( true , '2001:0DB8::1', '2001:DB8::/32' ),
- array( true , '2001:0DB8:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF',
- '2001:DB8::/32' ),
-
- array( false, '2001:0DB8:F::', '2001:DB8::/96' ),
- );
- }
-
- /**
- * Test for IP::splitHostAndPort().
- * @dataProvider provideSplitHostAndPort
- */
- function testSplitHostAndPort( $expected, $input, $description ) {
- $this->assertEquals( $expected, IP::splitHostAndPort( $input ), $description );
- }
-
- /**
- * Provider for IP::splitHostAndPort()
- */
- function provideSplitHostAndPort() {
- return array(
- array( false, '[', 'Unclosed square bracket' ),
- array( false, '[::', 'Unclosed square bracket 2' ),
- array( array( '::', false ), '::', 'Bare IPv6 0' ),
- array( array( '::1', false ), '::1', 'Bare IPv6 1' ),
- array( array( '::', false ), '[::]', 'Bracketed IPv6 0' ),
- array( array( '::1', false ), '[::1]', 'Bracketed IPv6 1' ),
- array( array( '::1', 80 ), '[::1]:80', 'Bracketed IPv6 with port' ),
- array( false, '::x', 'Double colon but no IPv6' ),
- array( array( 'x', 80 ), 'x:80', 'Hostname and port' ),
- array( false, 'x:x', 'Hostname and invalid port' ),
- array( array( 'x', false ), 'x', 'Plain hostname' )
- );
- }
-
- /**
- * Test for IP::combineHostAndPort()
- * @dataProvider provideCombineHostAndPort
- */
- function testCombineHostAndPort( $expected, $input, $description ) {
- list( $host, $port, $defaultPort ) = $input;
- $this->assertEquals(
- $expected,
- IP::combineHostAndPort( $host, $port, $defaultPort ),
- $description );
- }
-
- /**
- * Provider for IP::combineHostAndPort()
- */
- function provideCombineHostAndPort() {
- return array(
- array( '[::1]', array( '::1', 2, 2 ), 'IPv6 default port' ),
- array( '[::1]:2', array( '::1', 2, 3 ), 'IPv6 non-default port' ),
- array( 'x', array( 'x', 2, 2 ), 'Normal default port' ),
- array( 'x:2', array( 'x', 2, 3 ), 'Normal non-default port' ),
- );
- }
-
- /**
- * Test for IP::sanitizeRange()
- * @dataProvider provideIPCIDRs
- */
- function testSanitizeRange( $input, $expected, $description ) {
- $this->assertEquals( $expected, IP::sanitizeRange( $input ), $description );
- }
-
- /**
- * Provider for IP::testSanitizeRange()
- */
- function provideIPCIDRs() {
- return array(
- array( '35.56.31.252/16', '35.56.0.0/16', 'IPv4 range' ),
- array( '135.16.21.252/24', '135.16.21.0/24', 'IPv4 range' ),
- array( '5.36.71.252/32', '5.36.71.252/32', 'IPv4 silly range' ),
- array( '5.36.71.252', '5.36.71.252', 'IPv4 non-range' ),
- array( '0:1:2:3:4:c5:f6:7/96', '0:1:2:3:4:C5:0:0/96', 'IPv6 range' ),
- array( '0:1:2:3:4:5:6:7/120', '0:1:2:3:4:5:6:0/120', 'IPv6 range' ),
- array( '0:e1:2:3:4:5:e6:7/128', '0:E1:2:3:4:5:E6:7/128', 'IPv6 silly range' ),
- array( '0:c1:A2:3:4:5:c6:7', '0:C1:A2:3:4:5:C6:7', 'IPv6 non range' ),
- );
- }
-
- /**
- * Test for IP::prettifyIP()
- * @dataProvider provideIPsToPrettify
- */
- function testPrettifyIP( $ip, $prettified ) {
- $this->assertEquals( $prettified, IP::prettifyIP( $ip ), "Prettify of $ip" );
- }
-
- /**
- * Provider for IP::testPrettifyIP()
- */
- function provideIPsToPrettify() {
- return array(
- array( '0:0:0:0:0:0:0:0', '::' ),
- array( '0:0:0::0:0:0', '::' ),
- array( '0:0:0:1:0:0:0:0', '0:0:0:1::' ),
- array( '0:0::f', '::f' ),
- array( '0::0:0:0:33:fef:b', '::33:fef:b' ),
- array( '3f:535:0:0:0:0:e:fbb', '3f:535::e:fbb' ),
- array( '0:0:fef:0:0:0:e:fbb', '0:0:fef::e:fbb' ),
- array( 'abbc:2004::0:0:0:0', 'abbc:2004::' ),
- array( 'cebc:2004:f:0:0:0:0:0', 'cebc:2004:f::' ),
- array( '0:0:0:0:0:0:0:0/16', '::/16' ),
- array( '0:0:0::0:0:0/64', '::/64' ),
- array( '0:0::f/52', '::f/52' ),
- array( '::0:0:33:fef:b/52', '::33:fef:b/52' ),
- array( '3f:535:0:0:0:0:e:fbb/48', '3f:535::e:fbb/48' ),
- array( '0:0:fef:0:0:0:e:fbb/96', '0:0:fef::e:fbb/96' ),
- array( 'abbc:2004:0:0::0:0/40', 'abbc:2004::/40' ),
- array( 'aebc:2004:f:0:0:0:0:0/80', 'aebc:2004:f::/80' ),
- );
- }
-}
diff --git a/tests/phpunit/includes/JsonTest.php b/tests/phpunit/includes/JsonTest.php
deleted file mode 100644
index 75dd18d5..00000000
--- a/tests/phpunit/includes/JsonTest.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-class JsonTest extends MediaWikiTestCase {
-
- function testPhpBug46944Test() {
-
- $this->assertNotEquals(
- '\ud840\udc00',
- strtolower( FormatJson::encode( "\xf0\xa0\x80\x80" ) ),
- 'Test encoding an broken json_encode character (U+20000)'
- );
-
-
- }
-
- function testDecodeVarTypes() {
-
- $this->assertInternalType(
- 'object',
- FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}' ),
- 'Default to object'
- );
-
- $this->assertInternalType(
- 'array',
- FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}', true ),
- 'Optional array'
- );
-
- }
-
-}
-
diff --git a/tests/phpunit/includes/LanguageConverterTest.php b/tests/phpunit/includes/LanguageConverterTest.php
deleted file mode 100644
index baf28b07..00000000
--- a/tests/phpunit/includes/LanguageConverterTest.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php
-
-class LanguageConverterTest extends MediaWikiLangTestCase {
- protected $lang = null;
- protected $lc = null;
-
- function setUp() {
- parent::setUp();
- global $wgMemc, $wgRequest, $wgUser, $wgContLang;
-
- $wgUser = new User;
- $wgRequest = new FauxRequest( array() );
- $wgMemc = new EmptyBagOStuff;
- $wgContLang = Language::factory( 'tg' );
- $this->lang = new LanguageToTest();
- $this->lc = new TestConverter( $this->lang, 'tg',
- array( 'tg', 'tg-latn' ) );
- }
-
- function tearDown() {
- global $wgMemc;
- unset( $wgMemc );
- unset( $this->lc );
- unset( $this->lang );
- parent::tearDown();
- }
-
- function testGetPreferredVariantDefaults() {
- $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
- }
-
- function testGetPreferredVariantHeaders() {
- global $wgRequest;
- $wgRequest->setHeader( 'Accept-Language', 'tg-latn' );
-
- $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
- }
-
- function testGetPreferredVariantHeaderWeight() {
- global $wgRequest;
- $wgRequest->setHeader( 'Accept-Language', 'tg;q=1' );
-
- $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
- }
-
- function testGetPreferredVariantHeaderWeight2() {
- global $wgRequest;
- $wgRequest->setHeader( 'Accept-Language', 'tg-latn;q=1' );
-
- $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
- }
-
- function testGetPreferredVariantHeaderMulti() {
- global $wgRequest;
- $wgRequest->setHeader( 'Accept-Language', 'en, tg-latn;q=1' );
-
- $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
- }
-
- function testGetPreferredVariantUserOption() {
- global $wgUser;
-
- $wgUser = new User;
- $wgUser->load(); // from 'defaults'
- $wgUser->mId = 1;
- $wgUser->mDataLoaded = true;
- $wgUser->mOptionsLoaded = true;
- $wgUser->setOption( 'variant', 'tg-latn' );
-
- $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
- }
-
- function testGetPreferredVariantHeaderUserVsUrl() {
- global $wgRequest, $wgUser, $wgContLang;
-
- $wgContLang = Language::factory( 'tg-latn' );
- $wgRequest->setVal( 'variant', 'tg' );
- $wgUser = User::newFromId( "admin" );
- $wgUser->setId( 1 );
- $wgUser->mFrom = 'defaults';
- $wgUser->mOptionsLoaded = true;
- $wgUser->setOption( 'variant', 'tg-latn' ); // The user's data is ignored
- // because the variant is set in the URL.
- $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
- }
-
-
- function testGetPreferredVariantDefaultLanguageVariant() {
- global $wgDefaultLanguageVariant;
-
- $wgDefaultLanguageVariant = 'tg-latn';
- $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
- }
-
- function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
- global $wgDefaultLanguageVariant, $wgRequest, $wgContLang;
-
- $wgContLang = Language::factory( 'tg-latn' );
- $wgDefaultLanguageVariant = 'tg';
- $wgRequest->setVal( 'variant', null );
- $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
- }
-}
-
-/**
- * Test converter (from Tajiki to latin orthography)
- */
-class TestConverter extends LanguageConverter {
- private $table = array(
- 'б' => 'b',
- 'в' => 'v',
- 'г' => 'g',
- );
-
- function loadDefaultTables() {
- $this->mTables = array(
- 'tg-latn' => new ReplacementArray( $this->table ),
- 'tg' => new ReplacementArray()
- );
- }
-
-}
-
-class LanguageToTest extends Language {
- function __construct() {
- parent::__construct();
- $variants = array( 'tg', 'tg-latn' );
- $this->mConverter = new TestConverter( $this, 'tg', $variants );
- }
-}
diff --git a/tests/phpunit/includes/LicensesTest.php b/tests/phpunit/includes/LicensesTest.php
deleted file mode 100644
index e467f3cd..00000000
--- a/tests/phpunit/includes/LicensesTest.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-class LicensesTest extends MediaWikiTestCase {
-
- function testLicenses() {
- $str = "
-* Free licenses:
-** GFDL|Debian disagrees
-";
-
- $lc = new Licenses( array(
- 'fieldname' => 'FooField',
- 'type' => 'select',
- 'section' => 'description',
- 'id' => 'wpLicense',
- 'label' => 'A label text', # Note can't test label-message because $wgOut is not defined
- 'name' => 'AnotherName',
- 'licenses' => $str,
- ) );
- $this->assertThat( $lc, $this->isInstanceOf( 'Licenses' ) );
- }
-}
diff --git a/tests/phpunit/includes/LinksUpdateTest.php b/tests/phpunit/includes/LinksUpdateTest.php
deleted file mode 100644
index 49462001..00000000
--- a/tests/phpunit/includes/LinksUpdateTest.php
+++ /dev/null
@@ -1,154 +0,0 @@
-<?php
-
-/**
- *
- * @group Database
- * ^--- make sure temporary tables are used.
- */
-class LinksUpdateTest extends MediaWikiTestCase {
-
- function __construct( $name = null, array $data = array(), $dataName = '' ) {
- parent::__construct( $name, $data, $dataName );
-
- $this->tablesUsed = array_merge ( $this->tablesUsed,
- array( 'interwiki',
-
- 'page_props',
- 'pagelinks',
- 'categorylinks',
- 'langlinks',
- 'externallinks',
- 'imagelinks',
- 'templatelinks',
- 'iwlinks' ) );
- }
-
- function setUp() {
- $dbw = wfGetDB( DB_MASTER );
- $dbw->replace( 'interwiki',
- array('iw_prefix'),
- array( 'iw_prefix' => 'linksupdatetest',
- 'iw_url' => 'http://testing.com/wiki/$1',
- 'iw_api' => 'http://testing.com/w/api.php',
- 'iw_local' => 0,
- 'iw_trans' => 0,
- 'iw_wikiid' => 'linksupdatetest',
- ) );
- }
-
- protected function makeTitleAndParserOutput( $name, $id ) {
- $t = Title::newFromText( $name );
- $t->mArticleID = $id; # XXX: this is fugly
-
- $po = new ParserOutput();
- $po->setTitleText( $t->getPrefixedText() );
-
- return array( $t, $po );
- }
-
- public function testUpdate_pagelinks() {
- list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
- $po->addLink( Title::newFromText( "Foo" ) );
- $po->addLink( Title::newFromText( "Special:Foo" ) ); // special namespace should be ignored
- $po->addLink( Title::newFromText( "linksupdatetest:Foo" ) ); // interwiki link should be ignored
- $po->addLink( Title::newFromText( "#Foo" ) ); // hash link should be ignored
-
- $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
- array( NS_MAIN, 'Foo' ),
- ) );
-
- $po = new ParserOutput();
- $po->setTitleText( $t->getPrefixedText() );
-
- $po->addLink( Title::newFromText( "Bar" ) );
-
- $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
- array( NS_MAIN, 'Bar' ),
- ) );
- }
-
- public function testUpdate_externallinks() {
- list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
- $po->addExternalLink( "http://testing.com/wiki/Foo" );
-
- $this->assertLinksUpdate( $t, $po, 'externallinks', 'el_to, el_index', 'el_from = 111', array(
- array( 'http://testing.com/wiki/Foo', 'http://com.testing./wiki/Foo' ),
- ) );
- }
-
- public function testUpdate_categorylinks() {
- list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
- $po->addCategory( "Foo", "FOO" );
-
- $this->assertLinksUpdate( $t, $po, 'categorylinks', 'cl_to, cl_sortkey', 'cl_from = 111', array(
- array( 'Foo', "FOO\nTESTING" ),
- ) );
- }
-
- public function testUpdate_iwlinks() {
- list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
- $target = Title::makeTitleSafe( NS_MAIN, "Foo", '', 'linksupdatetest' );
- $po->addInterwikiLink( $target );
-
- $this->assertLinksUpdate( $t, $po, 'iwlinks', 'iwl_prefix, iwl_title', 'iwl_from = 111', array(
- array( 'linksupdatetest', 'Foo' ),
- ) );
- }
-
- public function testUpdate_templatelinks() {
- list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
- $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' ),
- ) );
- }
-
- public function testUpdate_imagelinks() {
- list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
- $po->addImage( "Foo.png" );
-
-
- $this->assertLinksUpdate( $t, $po, 'imagelinks', 'il_to', 'il_from = 111', array(
- array( 'Foo.png' ),
- ) );
- }
-
- public function testUpdate_langlinks() {
- list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
- $po->addLanguageLink( Title::newFromText( "en:Foo" ) );
-
-
- $this->assertLinksUpdate( $t, $po, 'langlinks', 'll_lang, ll_title', 'll_from = 111', array(
- array( 'En', 'Foo' ),
- ) );
- }
-
- public function testUpdate_page_props() {
- list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
-
- $po->setProperty( "foo", "bar" );
-
- $this->assertLinksUpdate( $t, $po, 'page_props', 'pp_propname, pp_value', 'pp_page = 111', array(
- array( 'foo', 'bar' ),
- ) );
- }
-
- #@todo: test recursive, too!
-
- protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput, $table, $fields, $condition, Array $expectedRows ) {
- $update = new LinksUpdate( $title, $parserOutput );
-
- $update->doUpdate();
-
- $this->assertSelect( $table, $fields, $condition, $expectedRows );
- }
-}
-
diff --git a/tests/phpunit/includes/LocalFileTest.php b/tests/phpunit/includes/LocalFileTest.php
deleted file mode 100644
index 5b26b89c..00000000
--- a/tests/phpunit/includes/LocalFileTest.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-
-/**
- * These tests should work regardless of $wgCapitalLinks
- * @group Database
- */
-
-class LocalFileTest extends MediaWikiTestCase {
- function setUp() {
- global $wgCapitalLinks;
-
- $wgCapitalLinks = true;
-
- $info = array(
- 'name' => 'test',
- 'directory' => '/testdir',
- 'url' => '/testurl',
- 'hashLevels' => 2,
- 'transformVia404' => false,
- 'backend' => new FSFileBackend( array(
- 'name' => 'local-backend',
- 'lockManager' => 'fsLockManager',
- 'containerPaths' => array(
- 'cont1' => "/testdir/local-backend/tempimages/cont1",
- 'cont2' => "/testdir/local-backend/tempimages/cont2"
- )
- ) )
- );
- $this->repo_hl0 = new LocalRepo( array( 'hashLevels' => 0 ) + $info );
- $this->repo_hl2 = new LocalRepo( array( 'hashLevels' => 2 ) + $info );
- $this->repo_lc = new LocalRepo( array( 'initialCapital' => false ) + $info );
- $this->file_hl0 = $this->repo_hl0->newFile( 'test!' );
- $this->file_hl2 = $this->repo_hl2->newFile( 'test!' );
- $this->file_lc = $this->repo_lc->newFile( 'test!' );
- }
-
- function testGetHashPath() {
- $this->assertEquals( '', $this->file_hl0->getHashPath() );
- $this->assertEquals( 'a/a2/', $this->file_hl2->getHashPath() );
- $this->assertEquals( 'c/c4/', $this->file_lc->getHashPath() );
- }
-
- function testGetRel() {
- $this->assertEquals( 'Test!', $this->file_hl0->getRel() );
- $this->assertEquals( 'a/a2/Test!', $this->file_hl2->getRel() );
- $this->assertEquals( 'c/c4/test!', $this->file_lc->getRel() );
- }
-
- function testGetUrlRel() {
- $this->assertEquals( 'Test%21', $this->file_hl0->getUrlRel() );
- $this->assertEquals( 'a/a2/Test%21', $this->file_hl2->getUrlRel() );
- $this->assertEquals( 'c/c4/test%21', $this->file_lc->getUrlRel() );
- }
-
- 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( '!' ) );
- }
-
- 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' ) );
- }
-
- function testGetArchiveUrl() {
- $this->assertEquals( '/testurl/archive', $this->file_hl0->getArchiveUrl() );
- $this->assertEquals( '/testurl/archive/a/a2', $this->file_hl2->getArchiveUrl() );
- $this->assertEquals( '/testurl/archive/%21', $this->file_hl0->getArchiveUrl( '!' ) );
- $this->assertEquals( '/testurl/archive/a/a2/%21', $this->file_hl2->getArchiveUrl( '!' ) );
- }
-
- function testGetThumbUrl() {
- $this->assertEquals( '/testurl/thumb/Test%21', $this->file_hl0->getThumbUrl() );
- $this->assertEquals( '/testurl/thumb/a/a2/Test%21', $this->file_hl2->getThumbUrl() );
- $this->assertEquals( '/testurl/thumb/Test%21/x', $this->file_hl0->getThumbUrl( 'x' ) );
- $this->assertEquals( '/testurl/thumb/a/a2/Test%21/x', $this->file_hl2->getThumbUrl( 'x' ) );
- }
-
- 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( '!' ) );
- }
-
- 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( '!' ) );
- }
-
- function testGetUrl() {
- $this->assertEquals( '/testurl/Test%21', $this->file_hl0->getUrl() );
- $this->assertEquals( '/testurl/a/a2/Test%21', $this->file_hl2->getUrl() );
- }
-
- 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' );
- }
-}
-
-
diff --git a/tests/phpunit/includes/LocalisationCacheTest.php b/tests/phpunit/includes/LocalisationCacheTest.php
deleted file mode 100644
index 356db87c..00000000
--- a/tests/phpunit/includes/LocalisationCacheTest.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-class LocalisationCacheTest extends MediaWikiTestCase {
- public function testPuralRulesFallback() {
- $cache = Language::getLocalisationCache();
-
- $this->assertEquals(
- $cache->getItem( 'ru', 'pluralRules' ),
- $cache->getItem( 'os', 'pluralRules' ),
- 'os plural rules (undefined) fallback to ru (defined)'
- );
-
- $this->assertEquals(
- $cache->getItem( 'ru', 'compiledPluralRules' ),
- $cache->getItem( 'os', 'compiledPluralRules' ),
- 'os compiled plural rules (undefined) fallback to ru (defined)'
- );
-
- $this->assertNotEquals(
- $cache->getItem( 'ksh', 'pluralRules' ),
- $cache->getItem( 'de', 'pluralRules' ),
- 'ksh plural rules (defined) dont fallback to de (defined)'
- );
-
- $this->assertNotEquals(
- $cache->getItem( 'ksh', 'compiledPluralRules' ),
- $cache->getItem( 'de', 'compiledPluralRules' ),
- 'ksh compiled plural rules (defined) dont fallback to de (defined)'
- );
- }
-}
diff --git a/tests/phpunit/includes/MWFunctionTest.php b/tests/phpunit/includes/MWFunctionTest.php
deleted file mode 100644
index ed5e7602..00000000
--- a/tests/phpunit/includes/MWFunctionTest.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-class MWFunctionTest extends MediaWikiTestCase {
-
- function testCallUserFuncWorkarounds() {
-
- $this->assertEquals(
- call_user_func( array( 'MWFunctionTest', 'someMethod' ) ),
- MWFunction::call( 'MWFunctionTest::someMethod' )
- );
- $this->assertEquals(
- call_user_func( array( 'MWFunctionTest', 'someMethod' ), 'foo', 'bar', 'baz' ),
- MWFunction::call( 'MWFunctionTest::someMethod', 'foo', 'bar', 'baz' )
- );
-
-
-
- $this->assertEquals(
- call_user_func_array( array( 'MWFunctionTest', 'someMethod' ), array() ),
- MWFunction::callArray( 'MWFunctionTest::someMethod', array() )
- );
- $this->assertEquals(
- call_user_func_array( array( 'MWFunctionTest', 'someMethod' ), array( 'foo', 'bar', 'baz' ) ),
- MWFunction::callArray( 'MWFunctionTest::someMethod', array( 'foo', 'bar', 'baz' ) )
- );
-
- }
-
- function testNewObjFunction() {
-
- $arg1 = 'Foo';
- $arg2 = 'Bar';
- $arg3 = array( 'Baz' );
- $arg4 = new ExampleObject;
-
- $args = array( $arg1, $arg2, $arg3, $arg4 );
-
- $newObject = new MWBlankClass( $arg1, $arg2, $arg3, $arg4 );
-
- $this->assertEquals(
- MWFunction::newObj( 'MWBlankClass', $args )->args,
- $newObject->args
- );
-
- $this->assertEquals(
- MWFunction::newObj( 'MWBlankClass', $args, true )->args,
- $newObject->args,
- 'Works even with PHP version < 5.1.3'
- );
-
- }
-
- /**
- * @expectedException MWException
- */
- function testCallingParentFails() {
-
- MWFunction::call( 'parent::foo' );
- }
-
- /**
- * @expectedException MWException
- */
- function testCallingSelfFails() {
-
- MWFunction::call( 'self::foo' );
- }
-
- public static function someMethod() {
- return func_get_args();
- }
-
-}
-
-class MWBlankClass {
-
- public $args = array();
-
- function __construct( $arg1, $arg2, $arg3, $arg4 ) {
- $this->args = array( $arg1, $arg2, $arg3, $arg4 );
- }
-
-}
-
-class ExampleObject {
-}
diff --git a/tests/phpunit/includes/MWNamespaceTest.php b/tests/phpunit/includes/MWNamespaceTest.php
deleted file mode 100644
index 3b05d675..00000000
--- a/tests/phpunit/includes/MWNamespaceTest.php
+++ /dev/null
@@ -1,628 +0,0 @@
-<?php
-/**
- * @author Antoine Musso
- * @copyright Copyright © 2011, Antoine Musso
- * @file
- */
-
-/**
- * Test class for MWNamespace.
- * Generated by PHPUnit on 2011-02-20 at 21:01:55.
- *
- */
-class MWNamespaceTest extends MediaWikiTestCase {
- /**
- * Sets up the fixture, for example, opens a network connection.
- * This method is called before a test is executed.
- */
- protected function setUp() {
- }
-
- /**
- * Tears down the fixture, for example, closes a network connection.
- * This method is called after a test is executed.
- */
- protected function tearDown() {
- }
-
-
-#### START OF TESTS #########################################################
-
- /**
- * @todo Write more texts, handle $wgAllowImageMoving setting
- */
- public function testIsMovable() {
- $this->assertFalse( MWNamespace::isMovable( NS_CATEGORY ) );
- # @todo FIXME: Write more tests!!
- }
-
- /**
- * Please make sure to change testIsTalk() if you change the assertions below
- */
- public function testIsSubject() {
- // Special namespaces
- $this->assertIsSubject( NS_MEDIA );
- $this->assertIsSubject( NS_SPECIAL );
-
- // Subject pages
- $this->assertIsSubject( NS_MAIN );
- $this->assertIsSubject( NS_USER );
- $this->assertIsSubject( 100 ); # user defined
-
- // Talk pages
- $this->assertIsNotSubject( NS_TALK );
- $this->assertIsNotSubject( NS_USER_TALK );
- $this->assertIsNotSubject( 101 ); # user defined
- }
-
- /**
- * Reverse of testIsSubject().
- * Please update testIsSubject() if you change assertions below
- */
- public function testIsTalk() {
- // Special namespaces
- $this->assertIsNotTalk( NS_MEDIA );
- $this->assertIsNotTalk( NS_SPECIAL );
-
- // Subject pages
- $this->assertIsNotTalk( NS_MAIN );
- $this->assertIsNotTalk( NS_USER );
- $this->assertIsNotTalk( 100 ); # user defined
-
- // Talk pages
- $this->assertIsTalk( NS_TALK );
- $this->assertIsTalk( NS_USER_TALK );
- $this->assertIsTalk( 101 ); # user defined
- }
-
- /**
- */
- public function testGetSubject() {
- // Special namespaces are their own subjects
- $this->assertEquals( NS_MEDIA, MWNamespace::getSubject( NS_MEDIA ) );
- $this->assertEquals( NS_SPECIAL, MWNamespace::getSubject( NS_SPECIAL ) );
-
- $this->assertEquals( NS_MAIN, MWNamespace::getSubject( NS_TALK ) );
- $this->assertEquals( NS_USER, MWNamespace::getSubject( NS_USER_TALK ) );
- }
-
- /**
- * Regular getTalk() calls
- * Namespaces without a talk page (NS_MEDIA, NS_SPECIAL) are tested in
- * the function testGetTalkExceptions()
- */
- public function testGetTalk() {
- $this->assertEquals( NS_TALK, MWNamespace::getTalk( NS_MAIN ) );
- $this->assertEquals( NS_TALK, MWNamespace::getTalk( NS_TALK ) );
- $this->assertEquals( NS_USER_TALK, MWNamespace::getTalk( NS_USER ) );
- $this->assertEquals( NS_USER_TALK, MWNamespace::getTalk( NS_USER_TALK ) );
- }
-
- /**
- * Exceptions with getTalk()
- * NS_MEDIA does not have talk pages. MediaWiki raise an exception for them.
- * @expectedException MWException
- */
- public function testGetTalkExceptionsForNsMedia() {
- $this->assertNull( MWNamespace::getTalk( NS_MEDIA ) );
- }
-
- /**
- * Exceptions with getTalk()
- * NS_SPECIAL does not have talk pages. MediaWiki raise an exception for them.
- * @expectedException MWException
- */
- public function testGetTalkExceptionsForNsSpecial() {
- $this->assertNull( MWNamespace::getTalk( NS_SPECIAL ) );
- }
-
- /**
- * Regular getAssociated() calls
- * Namespaces without an associated page (NS_MEDIA, NS_SPECIAL) are tested in
- * the function testGetAssociatedExceptions()
- */
- public function testGetAssociated() {
- $this->assertEquals( NS_TALK, MWNamespace::getAssociated( NS_MAIN ) );
- $this->assertEquals( NS_MAIN, MWNamespace::getAssociated( NS_TALK ) );
-
- }
-
- ### Exceptions with getAssociated()
- ### NS_MEDIA and NS_SPECIAL do not have talk pages. MediaWiki raises
- ### an exception for them.
- /**
- * @expectedException MWException
- */
- public function testGetAssociatedExceptionsForNsMedia() {
- $this->assertNull( MWNamespace::getAssociated( NS_MEDIA ) );
- }
-
- /**
- * @expectedException MWException
- */
- public function testGetAssociatedExceptionsForNsSpecial() {
- $this->assertNull( MWNamespace::getAssociated( NS_SPECIAL ) );
- }
-
- /**
- * @todo Implement testExists().
- */
-/*
- public function testExists() {
- // Remove the following lines when you implement this test.
- $this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
- );
- }
-*/
-
- /**
- * Test MWNamespace::equals
- * Note if we add a namespace registration system with keys like 'MAIN'
- * we should add tests here for equivilance on things like 'MAIN' == 0
- * and 'MAIN' == NS_MAIN.
- */
- public function testEquals() {
- $this->assertTrue( MWNamespace::equals( NS_MAIN, NS_MAIN ) );
- $this->assertTrue( MWNamespace::equals( NS_MAIN, 0 ) ); // In case we make NS_MAIN 'MAIN'
- $this->assertTrue( MWNamespace::equals( NS_USER, NS_USER ) );
- $this->assertTrue( MWNamespace::equals( NS_USER, 2 ) );
- $this->assertTrue( MWNamespace::equals( NS_USER_TALK, NS_USER_TALK ) );
- $this->assertTrue( MWNamespace::equals( NS_SPECIAL, NS_SPECIAL ) );
- $this->assertFalse( MWNamespace::equals( NS_MAIN, NS_TALK ) );
- $this->assertFalse( MWNamespace::equals( NS_USER, NS_USER_TALK ) );
- $this->assertFalse( MWNamespace::equals( NS_PROJECT, NS_TEMPLATE ) );
- }
-
- /**
- * Test MWNamespace::subjectEquals
- */
- public function testSubjectEquals() {
- $this->assertSameSubject( NS_MAIN, NS_MAIN );
- $this->assertSameSubject( NS_MAIN, 0 ); // In case we make NS_MAIN 'MAIN'
- $this->assertSameSubject( NS_USER, NS_USER );
- $this->assertSameSubject( NS_USER, 2 );
- $this->assertSameSubject( NS_USER_TALK, NS_USER_TALK );
- $this->assertSameSubject( NS_SPECIAL, NS_SPECIAL );
- $this->assertSameSubject( NS_MAIN, NS_TALK );
- $this->assertSameSubject( NS_USER, NS_USER_TALK );
-
- $this->assertDifferentSubject( NS_PROJECT, NS_TEMPLATE );
- $this->assertDifferentSubject( NS_SPECIAL, NS_MAIN );
- }
-
- public function testSpecialAndMediaAreDifferentSubjects() {
- $this->assertDifferentSubject(
- NS_MEDIA, NS_SPECIAL,
- "NS_MEDIA and NS_SPECIAL are different subject namespaces"
- );
- $this->assertDifferentSubject(
- NS_SPECIAL, NS_MEDIA,
- "NS_SPECIAL and NS_MEDIA are different subject namespaces"
- );
-
- }
-
- /**
- * @todo Implement testGetCanonicalNamespaces().
- */
-/*
- public function testGetCanonicalNamespaces() {
- // Remove the following lines when you implement this test.
- $this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
- );
- }
-*/
- /**
- * @todo Implement testGetCanonicalName().
- */
-/*
- public function testGetCanonicalName() {
- // Remove the following lines when you implement this test.
- $this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
- );
- }
-*/
- /**
- * @todo Implement testGetCanonicalIndex().
- */
-/*
- public function testGetCanonicalIndex() {
- // Remove the following lines when you implement this test.
- $this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
- );
- }
-*/
- /**
- * @todo Implement testGetValidNamespaces().
- */
-/*
- public function testGetValidNamespaces() {
- // Remove the following lines when you implement this test.
- $this->markTestIncomplete(
- 'This test has not been implemented yet. Rely on $wgCanonicalNamespaces.'
- );
- }
-*/
- /**
- */
- public function testCanTalk() {
- $this->assertCanNotTalk( NS_MEDIA );
- $this->assertCanNotTalk( NS_SPECIAL );
-
- $this->assertCanTalk( NS_MAIN );
- $this->assertCanTalk( NS_TALK );
- $this->assertCanTalk( NS_USER );
- $this->assertCanTalk( NS_USER_TALK );
-
- // User defined namespaces
- $this->assertCanTalk( 100 );
- $this->assertCanTalk( 101 );
- }
-
- /**
- */
- public function testIsContent() {
- // NS_MAIN is a content namespace per DefaultSettings.php
- // and per function definition.
- $this->assertIsContent( NS_MAIN );
-
- global $wgContentNamespaces;
-
- $saved = $wgContentNamespaces;
-
- $wgContentNamespaces[] = NS_MAIN;
- $this->assertIsContent( NS_MAIN );
-
- // Other namespaces which are not expected to be content
- if ( isset( $wgContentNamespaces[NS_MEDIA] ) ) {
- unset( $wgContentNamespaces[NS_MEDIA] );
- }
- $this->assertIsNotContent( NS_MEDIA );
-
- if ( isset( $wgContentNamespaces[NS_SPECIAL] ) ) {
- unset( $wgContentNamespaces[NS_SPECIAL] );
- }
- $this->assertIsNotContent( NS_SPECIAL );
-
- if ( isset( $wgContentNamespaces[NS_TALK] ) ) {
- unset( $wgContentNamespaces[NS_TALK] );
- }
- $this->assertIsNotContent( NS_TALK );
-
- if ( isset( $wgContentNamespaces[NS_USER] ) ) {
- unset( $wgContentNamespaces[NS_USER] );
- }
- $this->assertIsNotContent( NS_USER );
-
- if ( isset( $wgContentNamespaces[NS_CATEGORY] ) ) {
- unset( $wgContentNamespaces[NS_CATEGORY] );
- }
- $this->assertIsNotContent( NS_CATEGORY );
-
- if ( isset( $wgContentNamespaces[100] ) ) {
- unset( $wgContentNamespaces[100] );
- }
- $this->assertIsNotContent( 100 );
-
- $wgContentNamespaces = $saved;
- }
-
- /**
- * Similar to testIsContent() but alters the $wgContentNamespaces
- * global variable.
- */
- public function testIsContentWithAdditionsInWgContentNamespaces() {
- // NS_MAIN is a content namespace per DefaultSettings.php
- // and per function definition.
- $this->assertIsContent( NS_MAIN );
-
- // Tests that user defined namespace #252 is not content:
- $this->assertIsNotContent( 252 );
-
- # @todo FIXME: Is global saving really required for PHPUnit?
- // Bless namespace # 252 as a content namespace
- global $wgContentNamespaces;
- $savedGlobal = $wgContentNamespaces;
- $wgContentNamespaces[] = 252;
- $this->assertIsContent( 252 );
-
- // Makes sure NS_MAIN was not impacted
- $this->assertIsContent( NS_MAIN );
-
- // Restore global
- $wgContentNamespaces = $savedGlobal;
-
- // Verify namespaces after global restauration
- $this->assertIsContent( NS_MAIN );
- $this->assertIsNotContent( 252 );
- }
-
- public function testIsWatchable() {
- // Specials namespaces are not watchable
- $this->assertIsNotWatchable( NS_MEDIA );
- $this->assertIsNotWatchable( NS_SPECIAL );
-
- // Core defined namespaces are watchables
- $this->assertIsWatchable( NS_MAIN );
- $this->assertIsWatchable( NS_TALK );
-
- // Additional, user defined namespaces are watchables
- $this->assertIsWatchable( 100 );
- $this->assertIsWatchable( 101 );
- }
-
- public function testHasSubpages() {
- // Special namespaces:
- $this->assertHasNotSubpages( NS_MEDIA );
- $this->assertHasNotSubpages( NS_SPECIAL );
-
- // namespaces without subpages
- # save up global
- global $wgNamespacesWithSubpages;
- $saved = null;
- if( array_key_exists( NS_MAIN, $wgNamespacesWithSubpages ) ) {
- $saved = $wgNamespacesWithSubpages[NS_MAIN];
- unset( $wgNamespacesWithSubpages[NS_MAIN] );
- }
-
- $this->assertHasNotSubpages( NS_MAIN );
-
- $wgNamespacesWithSubpages[NS_MAIN] = true;
- $this->assertHasSubpages( NS_MAIN );
- $wgNamespacesWithSubpages[NS_MAIN] = false;
- $this->assertHasNotSubpages( NS_MAIN );
-
- # restore global
- if( $saved !== null ) {
- $wgNamespacesWithSubpages[NS_MAIN] = $saved;
- }
-
- // Some namespaces with subpages
- $this->assertHasSubpages( NS_TALK );
- $this->assertHasSubpages( NS_USER );
- $this->assertHasSubpages( NS_USER_TALK );
- }
-
- /**
- */
- public function testGetContentNamespaces() {
- $this->assertEquals(
- array( NS_MAIN ),
- MWNamespace::getcontentNamespaces(),
- '$wgContentNamespaces is an array with only NS_MAIN by default'
- );
-
- global $wgContentNamespaces;
-
- $saved = $wgContentNamespaces;
- # test !is_array( $wgcontentNamespaces )
- $wgContentNamespaces = '';
- $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
- $wgContentNamespaces = false;
- $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
- $wgContentNamespaces = null;
- $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
- $wgContentNamespaces = 5;
- $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
-
- # test $wgContentNamespaces === array()
- $wgContentNamespaces = array();
- $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
-
- # test !in_array( NS_MAIN, $wgContentNamespaces )
- $wgContentNamespaces = array( NS_USER, NS_CATEGORY );
- $this->assertEquals(
- array( NS_MAIN, NS_USER, NS_CATEGORY ),
- MWNamespace::getcontentNamespaces(),
- 'NS_MAIN is forced in $wgContentNamespaces even if unwanted'
- );
-
- # test other cases, return $wgcontentNamespaces as is
- $wgContentNamespaces = array( NS_MAIN );
- $this->assertEquals(
- array( NS_MAIN ),
- MWNamespace::getcontentNamespaces()
- );
-
- $wgContentNamespaces = array( NS_MAIN, NS_USER, NS_CATEGORY );
- $this->assertEquals(
- array( NS_MAIN, NS_USER, NS_CATEGORY ),
- MWNamespace::getcontentNamespaces()
- );
-
- $wgContentNamespaces = $saved;
- }
-
- /**
- */
- public function testGetSubjectNamespaces() {
- $subjectsNS = MWNamespace::getSubjectNamespaces();
- $this->assertContains( NS_MAIN, $subjectsNS,
- "Talk namespaces should have NS_MAIN" );
- $this->assertNotContains( NS_TALK, $subjectsNS,
- "Talk namespaces should have NS_TALK" );
-
- $this->assertNotContains( NS_MEDIA, $subjectsNS,
- "Talk namespaces should not have NS_MEDIA" );
- $this->assertNotContains( NS_SPECIAL, $subjectsNS,
- "Talk namespaces should not have NS_SPECIAL" );
- }
-
- /**
- */
- public function testGetTalkNamespaces() {
- $talkNS = MWNamespace::getTalkNamespaces();
- $this->assertContains( NS_TALK, $talkNS,
- "Subject namespaces should have NS_TALK" );
- $this->assertNotContains( NS_MAIN, $talkNS,
- "Subject namespaces should not have NS_MAIN" );
-
- $this->assertNotContains( NS_MEDIA, $talkNS,
- "Subject namespaces should not have NS_MEDIA" );
- $this->assertNotContains( NS_SPECIAL, $talkNS,
- "Subject namespaces should not have NS_SPECIAL" );
- }
-
- /**
- * Some namespaces are always capitalized per code definition
- * in MWNamespace::$alwaysCapitalizedNamespaces
- */
- public function testIsCapitalizedHardcodedAssertions() {
- // NS_MEDIA and NS_FILE are treated the same
- $this->assertEquals(
- MWNamespace::isCapitalized( NS_MEDIA ),
- MWNamespace::isCapitalized( NS_FILE ),
- 'NS_MEDIA and NS_FILE have same capitalization rendering'
- );
-
- // Boths are capitalized by default
- $this->assertIsCapitalized( NS_MEDIA );
- $this->assertIsCapitalized( NS_FILE );
-
- // Always capitalized namespaces
- // @see MWNamespace::$alwaysCapitalizedNamespaces
- $this->assertIsCapitalized( NS_SPECIAL );
- $this->assertIsCapitalized( NS_USER );
- $this->assertIsCapitalized( NS_MEDIAWIKI );
- }
-
- /**
- * Follows up for testIsCapitalizedHardcodedAssertions() but alter the
- * global $wgCapitalLink setting to have extended coverage.
- *
- * MWNamespace::isCapitalized() rely on two global settings:
- * $wgCapitalLinkOverrides = array(); by default
- * $wgCapitalLinks = true; by default
- * This function test $wgCapitalLinks
- *
- * Global setting correctness is tested against the NS_PROJECT and
- * NS_PROJECT_TALK namespaces since they are not hardcoded nor specials
- */
- public function testIsCapitalizedWithWgCapitalLinks() {
- global $wgCapitalLinks;
- // Save the global to easily reset to MediaWiki default settings
- $savedGlobal = $wgCapitalLinks;
-
- $wgCapitalLinks = true;
- $this->assertIsCapitalized( NS_PROJECT );
- $this->assertIsCapitalized( NS_PROJECT_TALK );
-
- $wgCapitalLinks = false;
- // hardcoded namespaces (see above function) are still capitalized:
- $this->assertIsCapitalized( NS_SPECIAL );
- $this->assertIsCapitalized( NS_USER );
- $this->assertIsCapitalized( NS_MEDIAWIKI );
- // setting is correctly applied
- $this->assertIsNotCapitalized( NS_PROJECT );
- $this->assertIsNotCapitalized( NS_PROJECT_TALK );
-
- // reset global state:
- $wgCapitalLinks = $savedGlobal;
- }
-
- /**
- * Counter part for MWNamespace::testIsCapitalizedWithWgCapitalLinks() now
- * testing the $wgCapitalLinkOverrides global.
- *
- * @todo split groups of assertions in autonomous testing functions
- */
- public function testIsCapitalizedWithWgCapitalLinkOverrides() {
- global $wgCapitalLinkOverrides;
- // Save the global to easily reset to MediaWiki default settings
- $savedGlobal = $wgCapitalLinkOverrides;
-
- // Test default settings
- $this->assertIsCapitalized( NS_PROJECT );
- $this->assertIsCapitalized( NS_PROJECT_TALK );
- // hardcoded namespaces (see above function) are capitalized:
- $this->assertIsCapitalized( NS_SPECIAL );
- $this->assertIsCapitalized( NS_USER );
- $this->assertIsCapitalized( NS_MEDIAWIKI );
-
- // Hardcoded namespaces remains capitalized
- $wgCapitalLinkOverrides[NS_SPECIAL] = false;
- $wgCapitalLinkOverrides[NS_USER] = false;
- $wgCapitalLinkOverrides[NS_MEDIAWIKI] = false;
- $this->assertIsCapitalized( NS_SPECIAL );
- $this->assertIsCapitalized( NS_USER );
- $this->assertIsCapitalized( NS_MEDIAWIKI );
-
- $wgCapitalLinkOverrides = $savedGlobal;
- $wgCapitalLinkOverrides[NS_PROJECT] = false;
- $this->assertIsNotCapitalized( NS_PROJECT );
- $wgCapitalLinkOverrides[NS_PROJECT] = true ;
- $this->assertIsCapitalized( NS_PROJECT );
- unset( $wgCapitalLinkOverrides[NS_PROJECT] );
- $this->assertIsCapitalized( NS_PROJECT );
-
- // reset global state:
- $wgCapitalLinkOverrides = $savedGlobal;
- }
-
- public function testHasGenderDistinction() {
- // Namespaces with gender distinctions
- $this->assertTrue( MWNamespace::hasGenderDistinction( NS_USER ) );
- $this->assertTrue( MWNamespace::hasGenderDistinction( NS_USER_TALK ) );
-
- // Other ones, "genderless"
- $this->assertFalse( MWNamespace::hasGenderDistinction( NS_MEDIA ) );
- $this->assertFalse( MWNamespace::hasGenderDistinction( NS_SPECIAL ) );
- $this->assertFalse( MWNamespace::hasGenderDistinction( NS_MAIN ) );
- $this->assertFalse( MWNamespace::hasGenderDistinction( NS_TALK ) );
-
- }
-
- public function testIsNonincludable() {
- global $wgNonincludableNamespaces;
- $wgNonincludableNamespaces = array( NS_USER );
-
- $this->assertTrue( MWNamespace::isNonincludable( NS_USER ) );
-
- $this->assertFalse( MWNamespace::isNonincludable( NS_TEMPLATE ) );
- }
-
- ####### HELPERS ###########################################################
- function __call( $method, $args ) {
- // Call the real method if it exists
- if( method_exists($this, $method ) ) {
- return $this->$method( $args );
- }
-
- 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";
-
- # Forge the namespace constant name:
- if( $ns === 0 ) {
- $ns_name = "NS_MAIN";
- } else {
- $ns_name = "NS_" . strtoupper( MWNamespace::getCanonicalName( $ns ) );
- }
- # ... and the MWNamespace method name
- $nsMethod = strtolower( $m[1] ) . $m[3];
-
- $expect = ($m[2] === '');
- $expect_name = $expect ? 'TRUE' : 'FALSE';
-
- return $this->assertEquals( $expect,
- MWNamespace::$nsMethod( $ns, $msg ),
- "MWNamespace::$nsMethod( $ns_name ) should returns $expect_name"
- );
- }
-
- throw new Exception( __METHOD__ . " could not find a method named $method\n" );
- }
-
- function assertSameSubject( $ns1, $ns2, $msg = '' ) {
- $this->assertTrue( MWNamespace::subjectEquals( $ns1, $ns2, $msg ) );
- }
- function assertDifferentSubject( $ns1, $ns2, $msg = '' ) {
- $this->assertFalse( MWNamespace::subjectEquals( $ns1, $ns2, $msg ) );
- }
-}
-
diff --git a/tests/phpunit/includes/MessageTest.php b/tests/phpunit/includes/MessageTest.php
deleted file mode 100644
index 20181fd4..00000000
--- a/tests/phpunit/includes/MessageTest.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-class MessageTest extends MediaWikiLangTestCase {
-
- function testExists() {
- $this->assertTrue( wfMessage( 'mainpage' )->exists() );
- $this->assertTrue( wfMessage( 'mainpage' )->params( array() )->exists() );
- $this->assertTrue( wfMessage( 'mainpage' )->rawParams( 'foo', 123 )->exists() );
- $this->assertFalse( wfMessage( 'i-dont-exist-evar' )->exists() );
- $this->assertFalse( wfMessage( 'i-dont-exist-evar' )->params( array() )->exists() );
- $this->assertFalse( wfMessage( 'i-dont-exist-evar' )->rawParams( 'foo', 123 )->exists() );
- }
-
- function testKey() {
- $this->assertInstanceOf( 'Message', wfMessage( 'mainpage' ) );
- $this->assertInstanceOf( 'Message', wfMessage( 'i-dont-exist-evar' ) );
- $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->text() );
- $this->assertEquals( '&lt;i-dont-exist-evar&gt;', wfMessage( 'i-dont-exist-evar' )->text() );
- $this->assertEquals( '<i-dont-exist-evar>', wfMessage( 'i-dont-exist-evar' )->plain() );
- $this->assertEquals( '&lt;i-dont-exist-evar&gt;', wfMessage( 'i-dont-exist-evar' )->escaped() );
- }
-
- function testInLanguage() {
- $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inLanguage( 'en' )->text() );
- $this->assertEquals( 'Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница', wfMessage( 'mainpage' )->inLanguage( 'ru' )->text() );
- $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inLanguage( Language::factory( 'en' ) )->text() );
- $this->assertEquals( 'Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница', wfMessage( 'mainpage' )->inLanguage( Language::factory( 'ru' ) )->text() );
- }
-
- 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() );
- }
-
- 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() );
- }
-
- function testInContentLanguage() {
- global $wgLang, $wgForceUIMsgAsContentMsg;
- $oldLang = $wgLang;
- $wgLang = Language::factory( 'fr' );
-
- $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg disabled' );
- $wgForceUIMsgAsContentMsg['testInContentLanguage'] = 'mainpage';
- $this->assertEquals( 'Accueil', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg enabled' );
-
- /* Restore globals */
- $wgLang = $oldLang;
- unset( $wgForceUIMsgAsContentMsg['testInContentLanguage'] );
- }
-
- /**
- * @expectedException MWException
- */
- function testInLanguageThrows() {
- wfMessage( 'foo' )->inLanguage( 123 );
- }
-}
diff --git a/tests/phpunit/includes/ParserOptionsTest.php b/tests/phpunit/includes/ParserOptionsTest.php
deleted file mode 100644
index 59c955fe..00000000
--- a/tests/phpunit/includes/ParserOptionsTest.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-class ParserOptionsTest extends MediaWikiTestCase {
-
- private $popts;
- private $pcache;
-
- function setUp() {
- global $wgContLang, $wgUser, $wgLanguageCode;
- $wgContLang = Language::factory( $wgLanguageCode );
- $this->popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
- $this->pcache = ParserCache::singleton();
- }
-
- function tearDown() {
- parent::tearDown();
- }
-
- /**
- * ParserOptions::optionsHash was not giving consistent results when $wgUseDynamicDates was set
- * @group Database
- */
- function testGetParserCacheKeyWithDynamicDates() {
- global $wgUseDynamicDates;
- $wgUseDynamicDates = true;
-
- $title = Title::newFromText( "Some test article" );
- $page = WikiPage::factory( $title );
-
- $pcacheKeyBefore = $this->pcache->getKey( $page, $this->popts );
- $this->assertNotNull( $this->popts->getDateFormat() );
- $pcacheKeyAfter = $this->pcache->getKey( $page, $this->popts );
- $this->assertEquals( $pcacheKeyBefore, $pcacheKeyAfter );
- }
-}
diff --git a/tests/phpunit/includes/PathRouterTest.php b/tests/phpunit/includes/PathRouterTest.php
deleted file mode 100644
index f6274584..00000000
--- a/tests/phpunit/includes/PathRouterTest.php
+++ /dev/null
@@ -1,254 +0,0 @@
-<?php
-/**
- * Tests for the PathRouter parsing
- */
-
-class PathRouterTest extends MediaWikiTestCase {
-
- public function setUp() {
- $router = new PathRouter;
- $router->add("/wiki/$1");
- $this->basicRouter = $router;
- }
-
- /**
- * Test basic path parsing
- */
- public function testBasic() {
- $matches = $this->basicRouter->parse( "/wiki/Foo" );
- $this->assertEquals( $matches, array( 'title' => "Foo" ) );
- }
-
- /**
- * Test loose path auto-$1
- */
- public function testLoose() {
- $router = new PathRouter;
- $router->add("/"); # Should be the same as "/$1"
- $matches = $router->parse( "/Foo" );
- $this->assertEquals( $matches, array( 'title' => "Foo" ) );
-
- $router = new PathRouter;
- $router->add("/wiki"); # Should be the same as /wiki/$1
- $matches = $router->parse( "/wiki/Foo" );
- $this->assertEquals( $matches, array( 'title' => "Foo" ) );
-
- $router = new PathRouter;
- $router->add("/wiki/"); # Should be the same as /wiki/$1
- $matches = $router->parse( "/wiki/Foo" );
- $this->assertEquals( $matches, array( 'title' => "Foo" ) );
- }
-
- /**
- * Test to ensure that path is based on specifity, not order
- */
- public function testOrder() {
- $router = new PathRouter;
- $router->add("/$1");
- $router->add("/a/$1");
- $router->add("/b/$1");
- $matches = $router->parse( "/a/Foo" );
- $this->assertEquals( $matches, array( 'title' => "Foo" ) );
-
- $router = new PathRouter;
- $router->add("/b/$1");
- $router->add("/a/$1");
- $router->add("/$1");
- $matches = $router->parse( "/a/Foo" );
- $this->assertEquals( $matches, array( 'title' => "Foo" ) );
- }
-
- /**
- * Test the handling of key based arrays with a url parameter
- */
- public function testKeyParameter() {
- $router = new PathRouter;
- $router->add( array( 'edit' => "/edit/$1" ), array( 'action' => '$key' ) );
- $matches = $router->parse( "/edit/Foo" );
- $this->assertEquals( $matches, array( 'title' => "Foo", 'action' => 'edit' ) );
- }
-
- /**
- * Test the handling of $2 inside paths
- */
- public function testAdditionalParameter() {
- // Basic $2
- $router = new PathRouter;
- $router->add( '/$2/$1', array( 'test' => '$2' ) );
- $matches = $router->parse( "/asdf/Foo" );
- $this->assertEquals( $matches, array( 'title' => "Foo", 'test' => 'asdf' ) );
- }
-
- /**
- * Test additional restricted value parameter
- */
- public function testRestrictedValue() {
- $router = new PathRouter;
- $router->add( '/$2/$1',
- array( 'test' => '$2' ),
- array( '$2' => array( 'a', 'b' ) )
- );
- $router->add( '/$2/$1',
- array( 'test2' => '$2' ),
- array( '$2' => 'c' )
- );
- $router->add( '/$1' );
-
- $matches = $router->parse( "/asdf/Foo" );
- $this->assertEquals( $matches, array( 'title' => "asdf/Foo" ) );
-
- $matches = $router->parse( "/a/Foo" );
- $this->assertEquals( $matches, array( 'title' => "Foo", 'test' => 'a' ) );
-
- $matches = $router->parse( "/c/Foo" );
- $this->assertEquals( $matches, array( 'title' => "Foo", 'test2' => 'c' ) );
- }
-
- public function callbackForTest( &$matches, $data ) {
- $matches['x'] = $data['$1'];
- $matches['foo'] = $data['foo'];
- }
-
- public function testCallback() {
- $router = new PathRouter;
- $router->add( "/$1",
- array( 'a' => 'b', 'data:foo' => 'bar' ),
- array( 'callback' => array( $this, 'callbackForTest' ) )
- );
- $matches = $router->parse( '/Foo' );
- $this->assertEquals( $matches, array(
- 'title' => "Foo",
- 'x' => 'Foo',
- 'a' => 'b',
- 'foo' => 'bar'
- ) );
- }
-
- /**
- * Test to ensure that matches are not made if a parameter expects nonexistent input
- */
- public function testFail() {
- $router = new PathRouter;
- $router->add( "/wiki/$1", array( 'title' => "$1$2" ) );
- $matches = $router->parse( "/wiki/A" );
- $this->assertEquals( array(), $matches );
- }
-
- /**
- * Test to ensure weight of paths is handled correctly
- */
- public function testWeight() {
- $router = new PathRouter;
- $router->addStrict( "/Bar", array( 'ping' => 'pong' ) );
- $router->add( "/asdf-$1", array( 'title' => 'qwerty-$1' ) );
- $router->add( "/$1" );
- $router->add( "/qwerty-$1", array( 'title' => 'asdf-$1' ) );
- $router->addStrict( "/Baz", array( 'marco' => 'polo' ) );
- $router->add( "/a/$1" );
- $router->add( "/asdf/$1" );
- $router->add( "/$2/$1", array( 'unrestricted' => '$2' ) );
- $router->add( array( 'qwerty' => "/qwerty/$1" ), array( 'qwerty' => '$key' ) );
- $router->add( "/$2/$1", array( 'restricted-to-y' => '$2' ), array( '$2' => 'y' ) );
-
- foreach( array(
- "/Foo" => array( 'title' => "Foo" ),
- "/Bar" => array( 'ping' => 'pong' ),
- "/Baz" => array( 'marco' => 'polo' ),
- "/asdf-foo" => array( 'title' => "qwerty-foo" ),
- "/qwerty-bar" => array( 'title' => "asdf-bar" ),
- "/a/Foo" => array( 'title' => "Foo" ),
- "/asdf/Foo" => array( 'title' => "Foo" ),
- "/qwerty/Foo" => array( 'title' => "Foo", 'qwerty' => 'qwerty' ),
- "/baz/Foo" => array( 'title' => "Foo", 'unrestricted' => 'baz' ),
- "/y/Foo" => array( 'title' => "Foo", 'restricted-to-y' => 'y' ),
- ) as $path => $result ) {
- $this->assertEquals( $router->parse( $path ), $result );
- }
- }
-
- /**
- * Make sure the router handles titles like Special:Recentchanges correctly
- */
- public function testSpecial() {
- $matches = $this->basicRouter->parse( "/wiki/Special:Recentchanges" );
- $this->assertEquals( $matches, array( 'title' => "Special:Recentchanges" ) );
- }
-
- /**
- * Make sure the router decodes urlencoding properly
- */
- public function testUrlencoding() {
- $matches = $this->basicRouter->parse( "/wiki/Title_With%20Space" );
- $this->assertEquals( $matches, array( 'title' => "Title_With Space" ) );
- }
-
- public function dataRegexpChars() {
- return array(
- array( "$" ),
- array( "$1" ),
- array( "\\" ),
- array( "\\$1" ),
- );
- }
-
- /**
- * Make sure the router doesn't break on special characters like $ used in regexp replacements
- * @dataProvider dataRegexpChars
- */
- public function testRegexpChars( $char ) {
- $matches = $this->basicRouter->parse( "/wiki/$char" );
- $this->assertEquals( $matches, array( 'title' => "$char" ) );
- }
-
- /**
- * Make sure the router handles characters like +&() properly
- */
- public function testCharacters() {
- $matches = $this->basicRouter->parse( "/wiki/Plus+And&Dollar\\Stuff();[]{}*" );
- $this->assertEquals( $matches, array( 'title' => "Plus+And&Dollar\\Stuff();[]{}*" ) );
- }
-
- /**
- * Make sure the router handles unicode characters correctly
- * @depends testSpecial
- * @depends testUrlencoding
- * @depends testCharacters
- */
- public function testUnicode() {
- $matches = $this->basicRouter->parse( "/wiki/Spécial:Modifications_récentes" );
- $this->assertEquals( $matches, array( 'title' => "Spécial:Modifications_récentes" ) );
-
- $matches = $this->basicRouter->parse( "/wiki/Sp%C3%A9cial:Modifications_r%C3%A9centes" );
- $this->assertEquals( $matches, array( 'title' => "Spécial:Modifications_récentes" ) );
- }
-
- /**
- * Ensure the router doesn't choke on long paths.
- */
- public function testLength() {
- $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." ) );
- }
-
-
- /**
- * Ensure that the php passed site of parameter values are not urldecoded
- */
- public function testPatternUrlencoding() {
- $router = new PathRouter;
- $router->add( "/wiki/$1", array( 'title' => '%20:$1' ) );
- $matches = $router->parse( "/wiki/Foo" );
- $this->assertEquals( $matches, array( 'title' => '%20:Foo' ) );
- }
-
- /**
- * Ensure that raw parameter values do not have any variable replacements or urldecoding
- */
- public function testRawParamValue() {
- $router = new PathRouter;
- $router->add( "/wiki/$1", array( 'title' => array( 'value' => 'bar%20$1' ) ) );
- $matches = $router->parse( "/wiki/Foo" );
- $this->assertEquals( $matches, array( 'title' => 'bar%20$1' ) );
- }
-
-}
diff --git a/tests/phpunit/includes/PreferencesTest.php b/tests/phpunit/includes/PreferencesTest.php
deleted file mode 100644
index 0e123177..00000000
--- a/tests/phpunit/includes/PreferencesTest.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-
-class PreferencesTest extends MediaWikiTestCase {
- /** Array of User objects */
- private $prefUsers;
- private $context;
-
- function __construct() {
- parent::__construct();
- global $wgEnableEmail;
-
- $this->prefUsers['noemail'] = new User;
-
- $this->prefUsers['notauth'] = new User;
- $this->prefUsers['notauth']
- ->setEmail( 'noauth@example.org' );
-
- $this->prefUsers['auth'] = new User;
- $this->prefUsers['auth']
- ->setEmail( 'noauth@example.org' );
- $this->prefUsers['auth']
- ->setEmailAuthenticationTimestamp( 1330946623 );
-
- $this->context = new RequestContext;
- $this->context->setTitle( Title::newFromText('PreferencesTest') );
-
- //some tests depends on email setting
- $wgEnableEmail = true;
- }
-
- /**
- * Placeholder to verify bug 34302
- * @covers Preferences::profilePreferences
- */
- function testEmailFieldsWhenUserHasNoEmail() {
- $prefs = $this->prefsFor( 'noemail' );
- $this->assertArrayHasKey( 'cssclass',
- $prefs['emailaddress']
- );
- $this->assertEquals( 'mw-email-none', $prefs['emailaddress']['cssclass'] );
- }
- /**
- * Placeholder to verify bug 34302
- * @covers Preferences::profilePreferences
- */
- function testEmailFieldsWhenUserEmailNotAuthenticated() {
- $prefs = $this->prefsFor( 'notauth' );
- $this->assertArrayHasKey( 'cssclass',
- $prefs['emailaddress']
- );
- $this->assertEquals( 'mw-email-not-authenticated', $prefs['emailaddress']['cssclass'] );
- }
- /**
- * Placeholder to verify bug 34302
- * @covers Preferences::profilePreferences
- */
- function testEmailFieldsWhenUserEmailIsAuthenticated() {
- $prefs = $this->prefsFor( 'auth' );
- $this->assertArrayHasKey( 'cssclass',
- $prefs['emailaddress']
- );
- $this->assertEquals( 'mw-email-authenticated', $prefs['emailaddress']['cssclass'] );
- }
-
- /** Helper */
- function prefsFor( $user_key ) {
- $preferences = array();
- Preferences::profilePreferences(
- $this->prefUsers[$user_key]
- , $this->context
- , $preferences
- );
- return $preferences;
- }
-}
diff --git a/tests/phpunit/includes/Providers.php b/tests/phpunit/includes/Providers.php
deleted file mode 100644
index f451f8a0..00000000
--- a/tests/phpunit/includes/Providers.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Generic providers for the MediaWiki PHPUnit test suite
- *
- * @author Antoine Musso
- * @copyright Copyright © 2011, Antoine Musso
- * @file
- */
-
-/** */
-class MediaWikiProvide {
-
- /* provide an array of numbers from 1 up to @param $num */
- private static function createProviderUpTo( $num ) {
- $ret = array();
- for( $i=1; $i<=$num;$i++ ) {
- $ret[] = array( $i );
- }
- return $ret;
- }
-
- /* array of months numbers (as an integer) */
- public static function Months() {
- return self::createProviderUpTo( 12 );
- }
-
- /* array of days numbers (as an integer) */
- public static function Days() {
- return self::createProviderUpTo( 31 );
- }
-
- public static function DaysMonths() {
- $ret = array();
-
- $months = self::Months();
- $days = self::Days();
- foreach( $months as $month) {
- foreach( $days as $day ) {
- $ret[] = array( $day[0], $month[0] );
- }
- }
- return $ret;
- }
-}
diff --git a/tests/phpunit/includes/RecentChangeTest.php b/tests/phpunit/includes/RecentChangeTest.php
deleted file mode 100644
index fbf271cc..00000000
--- a/tests/phpunit/includes/RecentChangeTest.php
+++ /dev/null
@@ -1,273 +0,0 @@
-<?php
-/**
- * @group Database
- */
-class RecentChangeTest extends MediaWikiTestCase {
- protected $title;
- protected $target;
- protected $user;
- protected $user_comment;
- protected $context;
-
- function __construct() {
- parent::__construct();
-
- $this->title = Title::newFromText( 'SomeTitle' );
- $this->target = Title::newFromText( 'TestTarget' );
- $this->user = User::newFromName( 'UserName' );
-
- $this->user_comment = '<User comment about action>';
- $this->context = RequestContext::newExtraneousContext( $this->title );
- }
-
- /**
- * The testIrcMsgForAction* tests are supposed to cover the hacky
- * LogFormatter::getIRCActionText / bug 34508
- *
- * Third parties bots listen to those messages. They are clever enough
- * to fetch the i18n messages from the wiki and then analyze the IRC feed
- * to reverse engineer the $1, $2 messages.
- * One thing bots can not detect is when MediaWiki change the meaning of
- * a message like what happened when we deployed 1.19. $1 became the user
- * performing the action which broke basically all bots around.
- *
- * Should cover the following log actions (which are most commonly used by bots):
- * - block/block
- * - block/unblock
- * - delete/delete
- * - delete/restore
- * - newusers/create
- * - newusers/create2
- * - newusers/autocreate
- * - move/move
- * - move/move_redir
- * - protect/protect
- * - protect/modifyprotect
- * - protect/unprotect
- * - upload/upload
- *
- * As well as the following Auto Edit Summaries:
- * - blank
- * - replace
- * - rollback
- * - undo
- */
-
- /**
- * @covers LogFormatter::getIRCActionText
- */
- function testIrcMsgForLogTypeBlock() {
- # block/block
- $this->assertIRCComment(
- $this->context->msg( 'blocklogentry', 'SomeTitle' )->plain() . ': ' . $this->user_comment,
- 'block', 'block',
- array(),
- $this->user_comment
- );
- # block/unblock
- $this->assertIRCComment(
- $this->context->msg( 'unblocklogentry', 'SomeTitle' )->plain() . ': ' . $this->user_comment,
- 'block', 'unblock',
- array(),
- $this->user_comment
- );
- }
-
- /**
- * @covers LogFormatter::getIRCActionText
- */
- function testIrcMsgForLogTypeDelete() {
- # delete/delete
- $this->assertIRCComment(
- $this->context->msg( 'deletedarticle', 'SomeTitle' )->plain() . ': ' . $this->user_comment,
- 'delete', 'delete',
- array(),
- $this->user_comment
- );
-
- # delete/restore
- $this->assertIRCComment(
- $this->context->msg( 'undeletedarticle', 'SomeTitle' )->plain() . ': ' . $this->user_comment,
- 'delete', 'restore',
- array(),
- $this->user_comment
- );
- }
-
- /**
- * @covers LogFormatter::getIRCActionText
- */
- function testIrcMsgForLogTypeNewusers() {
- $this->assertIRCComment(
- 'New user account',
- 'newusers', 'newusers',
- array()
- );
- $this->assertIRCComment(
- 'New user account',
- 'newusers', 'create',
- array()
- );
- $this->assertIRCComment(
- 'created new account SomeTitle',
- 'newusers', 'create2',
- array()
- );
- $this->assertIRCComment(
- 'Account created automatically',
- 'newusers', 'autocreate',
- array()
- );
- }
-
- /**
- * @covers LogFormatter::getIRCActionText
- */
- function testIrcMsgForLogTypeMove() {
- $move_params = array(
- '4::target' => $this->target->getPrefixedText(),
- '5::noredir' => 0,
- );
-
- # move/move
- $this->assertIRCComment(
- $this->context->msg( '1movedto2', 'SomeTitle', 'TestTarget' )->plain() . ': ' . $this->user_comment,
- 'move', 'move',
- $move_params,
- $this->user_comment
- );
-
- # move/move_redir
- $this->assertIRCComment(
- $this->context->msg( '1movedto2_redir', 'SomeTitle', 'TestTarget' )->plain() . ': ' . $this->user_comment,
- 'move', 'move_redir',
- $move_params,
- $this->user_comment
- );
- }
-
- /**
- * @covers LogFormatter::getIRCActionText
- */
- function testIrcMsgForLogTypePatrol() {
- # patrol/patrol
- $this->assertIRCComment(
- $this->context->msg( 'patrol-log-line', 'revision 777', '[[SomeTitle]]', '' )->plain(),
- 'patrol', 'patrol',
- array(
- '4::curid' => '777',
- '5::previd' => '666',
- '6::auto' => 0,
- )
- );
- }
-
- /**
- * @covers LogFormatter::getIRCActionText
- */
- function testIrcMsgForLogTypeProtect() {
- $protectParams = array(
- '[edit=sysop] (indefinite) ‎[move=sysop] (indefinite)'
- );
-
- # protect/protect
- $this->assertIRCComment(
- $this->context->msg( 'protectedarticle', 'SomeTitle ' . $protectParams[0] )->plain() . ': ' . $this->user_comment,
- 'protect', 'protect',
- $protectParams,
- $this->user_comment
- );
-
- # protect/unprotect
- $this->assertIRCComment(
- $this->context->msg( 'unprotectedarticle', 'SomeTitle' )->plain() . ': ' . $this->user_comment,
- 'protect', 'unprotect',
- array(),
- $this->user_comment
- );
-
- # protect/modify
- $this->assertIRCComment(
- $this->context->msg( 'modifiedarticleprotection', 'SomeTitle ' . $protectParams[0] )->plain() . ': ' . $this->user_comment,
- 'protect', 'modify',
- $protectParams,
- $this->user_comment
- );
- }
-
- /**
- * @covers LogFormatter::getIRCActionText
- */
- function testIrcMsgForLogTypeUpload() {
- # upload/upload
- $this->assertIRCComment(
- $this->context->msg( 'uploadedimage', 'SomeTitle' )->plain() . ': ' . $this->user_comment,
- 'upload', 'upload',
- array(),
- $this->user_comment
- );
-
- # upload/overwrite
- $this->assertIRCComment(
- $this->context->msg( 'overwroteimage', 'SomeTitle' )->plain() . ': ' . $this->user_comment,
- 'upload', 'overwrite',
- array(),
- $this->user_comment
- );
- }
-
- /**
- * @todo: Emulate these edits somehow and extract
- * raw edit summary from RecentChange object
- * --
-
- function testIrcMsgForBlankingAES() {
- // $this->context->msg( 'autosumm-blank', .. );
- }
-
- function testIrcMsgForReplaceAES() {
- // $this->context->msg( 'autosumm-replace', .. );
- }
-
- function testIrcMsgForRollbackAES() {
- // $this->context->msg( 'revertpage', .. );
- }
-
- function testIrcMsgForUndoAES() {
- // $this->context->msg( 'undo-summary', .. );
- }
-
- * --
- */
-
- /**
- * @param $expected String Expected IRC text without colors codes
- * @param $type String Log type (move, delete, suppress, patrol ...)
- * @param $action String A log type action
- * @param $comment String (optional) A comment for the log action
- * @param $msg String (optional) A message for PHPUnit :-)
- */
- function assertIRCComment( $expected, $type, $action, $params, $comment = null, $msg = '' ) {
-
- $logEntry = new ManualLogEntry( $type, $action );
- $logEntry->setPerformer( $this->user );
- $logEntry->setTarget( $this->title );
- if ( $comment !== null ) {
- $logEntry->setComment( $comment );
- }
- $logEntry->setParameters( $params );
-
- $formatter = LogFormatter::newFromEntry( $logEntry );
- $formatter->setContext( $this->context );
-
- // Apply the same transformation as done in RecentChange::getIRCLine for rc_comment
- $ircRcComment = RecentChange::cleanupForIRC( $formatter->getIRCActionComment() );
-
- $this->assertEquals(
- $expected,
- $ircRcComment,
- $msg
- );
- }
-
-}
diff --git a/tests/phpunit/includes/ResourceLoaderTest.php b/tests/phpunit/includes/ResourceLoaderTest.php
deleted file mode 100644
index ab704839..00000000
--- a/tests/phpunit/includes/ResourceLoaderTest.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-
-class ResourceLoaderTest extends MediaWikiTestCase {
-
- protected static $resourceLoaderRegisterModulesHook;
-
- /* Hook Methods */
-
- /**
- * ResourceLoaderRegisterModules hook
- */
- public static function resourceLoaderRegisterModules( &$resourceLoader ) {
- self::$resourceLoaderRegisterModulesHook = true;
- return true;
- }
-
- /* Provider Methods */
- public function provideValidModules() {
- return array(
- array( 'TEST.validModule1', new ResourceLoaderTestModule() ),
- );
- }
-
- /* Test Methods */
-
- /**
- * Ensures that the ResourceLoaderRegisterModules hook is called when a new ResourceLoader object is constructed
- * @covers ResourceLoader::__construct
- */
- public function testCreatingNewResourceLoaderCallsRegistrationHook() {
- self::$resourceLoaderRegisterModulesHook = false;
- $resourceLoader = new ResourceLoader();
- $this->assertTrue( self::$resourceLoaderRegisterModulesHook );
- return $resourceLoader;
- }
-
- /**
- * @dataProvider provideValidModules
- * @depends testCreatingNewResourceLoaderCallsRegistrationHook
- * @covers ResourceLoader::register
- * @covers ResourceLoader::getModule
- */
- public function testRegisteredValidModulesAreAccessible(
- $name, ResourceLoaderModule $module, ResourceLoader $resourceLoader
- ) {
- $resourceLoader->register( $name, $module );
- $this->assertEquals( $module, $resourceLoader->getModule( $name ) );
- }
-
- /**
- * @dataProvider providePackedModules
- */
- public function testMakePackedModulesString( $desc, $modules, $packed ) {
- $this->assertEquals( $packed, ResourceLoader::makePackedModulesString( $modules ), $desc );
- }
-
- /**
- * @dataProvider providePackedModules
- */
- public function testexpandModuleNames( $desc, $modules, $packed ) {
- $this->assertEquals( $modules, ResourceLoaderContext::expandModuleNames( $packed ), $desc );
- }
-
- public function providePackedModules() {
- return array(
- array(
- 'Example from makePackedModulesString doc comment',
- array( 'foo.bar', 'foo.baz', 'bar.baz', 'bar.quux' ),
- 'foo.bar,baz|bar.baz,quux',
- ),
- array(
- 'Example from expandModuleNames doc comment',
- array( 'jquery.foo', 'jquery.bar', 'jquery.ui.baz', 'jquery.ui.quux' ),
- 'jquery.foo,bar|jquery.ui.baz,quux',
- ),
- array(
- 'Regression fixed in r88706 with dotless names',
- array( 'foo', 'bar', 'baz' ),
- 'foo,bar,baz',
- )
- );
- }
-}
-
-/* Stubs */
-
-class ResourceLoaderTestModule extends ResourceLoaderModule { }
-
-/* Hooks */
-global $wgHooks;
-$wgHooks['ResourceLoaderRegisterModules'][] = 'ResourceLoaderTest::resourceLoaderRegisterModules';
diff --git a/tests/phpunit/includes/RevisionStorageTest.php b/tests/phpunit/includes/RevisionStorageTest.php
deleted file mode 100644
index 8a7facec..00000000
--- a/tests/phpunit/includes/RevisionStorageTest.php
+++ /dev/null
@@ -1,408 +0,0 @@
-<?php
-
-/**
- * Test class for Revision storage.
- *
- * @group Database
- * ^--- important, causes temporary tables to be used instead of the real database
- *
- * @group medium
- * ^--- important, causes tests not to fail with timeout
- */
-class RevisionStorageTest extends MediaWikiTestCase {
-
- var $the_page;
-
- function __construct( $name = null, array $data = array(), $dataName = '' ) {
- parent::__construct( $name, $data, $dataName );
-
- $this->tablesUsed = array_merge( $this->tablesUsed,
- array( 'page',
- 'revision',
- 'text',
-
- 'recentchanges',
- 'logging',
-
- 'page_props',
- 'pagelinks',
- 'categorylinks',
- 'langlinks',
- 'externallinks',
- 'imagelinks',
- 'templatelinks',
- 'iwlinks' ) );
- }
-
- public function setUp() {
- if ( !$this->the_page ) {
- $this->the_page = $this->createPage( 'RevisionStorageTest_the_page', "just a dummy page" );
- }
- }
-
- protected function makeRevision( $props = null ) {
- if ( $props === null ) $props = array();
-
- if ( !isset( $props['content'] ) && !isset( $props['text'] ) ) $props['text'] = 'Lorem Ipsum';
- if ( !isset( $props['comment'] ) ) $props['comment'] = 'just a test';
- if ( !isset( $props['page'] ) ) $props['page'] = $this->the_page->getId();
-
- $rev = new Revision( $props );
-
- $dbw = wfgetDB( DB_MASTER );
- $rev->insertOn( $dbw );
-
- return $rev;
- }
-
- protected function createPage( $page, $text, $model = null ) {
- if ( is_string( $page ) ) $page = Title::newFromText( $page );
- if ( $page instanceof Title ) $page = new WikiPage( $page );
-
- if ( $page->exists() ) {
- $page->doDeleteArticle( "done" );
- }
-
- $page->doEdit( $text, "testing", EDIT_NEW );
-
- return $page;
- }
-
- protected function assertRevEquals( Revision $orig, Revision $rev = null ) {
- $this->assertNotNull( $rev, 'missing revision' );
-
- $this->assertEquals( $orig->getId(), $rev->getId() );
- $this->assertEquals( $orig->getPage(), $rev->getPage() );
- $this->assertEquals( $orig->getTimestamp(), $rev->getTimestamp() );
- $this->assertEquals( $orig->getUser(), $rev->getUser() );
- $this->assertEquals( $orig->getSha1(), $rev->getSha1() );
- }
-
- /**
- * @covers Revision::__construct
- */
- public function testConstructFromRow()
- {
- $orig = $this->makeRevision();
-
- $dbr = wfgetDB( DB_SLAVE );
- $res = $dbr->select( 'revision', '*', array( 'rev_id' => $orig->getId() ) );
- $this->assertTrue( is_object( $res ), 'query failed' );
-
- $row = $res->fetchObject();
- $res->free();
-
- $rev = new Revision( $row );
-
- $this->assertRevEquals( $orig, $rev );
- }
-
- /**
- * @covers Revision::newFromRow
- */
- public function testNewFromRow()
- {
- $orig = $this->makeRevision();
-
- $dbr = wfgetDB( DB_SLAVE );
- $res = $dbr->select( 'revision', '*', array( 'rev_id' => $orig->getId() ) );
- $this->assertTrue( is_object( $res ), 'query failed' );
-
- $row = $res->fetchObject();
- $res->free();
-
- $rev = Revision::newFromRow( $row );
-
- $this->assertRevEquals( $orig, $rev );
- }
-
-
- /**
- * @covers Revision::newFromArchiveRow
- */
- public function testNewFromArchiveRow()
- {
- $page = $this->createPage( 'RevisionStorageTest_testNewFromArchiveRow', 'Lorem Ipsum' );
- $orig = $page->getRevision();
- $page->doDeleteArticle( 'test Revision::newFromArchiveRow' );
-
- $dbr = wfgetDB( DB_SLAVE );
- $res = $dbr->select( 'archive', '*', array( 'ar_rev_id' => $orig->getId() ) );
- $this->assertTrue( is_object( $res ), 'query failed' );
-
- $row = $res->fetchObject();
- $res->free();
-
- $rev = Revision::newFromArchiveRow( $row );
-
- $this->assertRevEquals( $orig, $rev );
- }
-
- /**
- * @covers Revision::newFromId
- */
- public function testNewFromId()
- {
- $orig = $this->makeRevision();
-
- $rev = Revision::newFromId( $orig->getId() );
-
- $this->assertRevEquals( $orig, $rev );
- }
-
- /**
- * @covers Revision::fetchRevision
- */
- public function testFetchRevision()
- {
- $page = $this->createPage( 'RevisionStorageTest_testFetchRevision', 'one' );
- $id1 = $page->getRevision()->getId();
-
- $page->doEdit( 'two', 'second rev' );
- $id2 = $page->getRevision()->getId();
-
- $res = Revision::fetchRevision( $page->getTitle() );
-
- #note: order is unspecified
- $rows = array();
- while ( ( $row = $res->fetchObject() ) ) {
- $rows[ $row->rev_id ]= $row;
- }
-
- $row = $res->fetchObject();
- $this->assertEquals( 1, count($rows), 'expected exactly one revision' );
- $this->assertArrayHasKey( $id2, $rows, 'missing revision with id ' . $id2 );
- }
-
- /**
- * @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');
- }
-
- /**
- * @covers Revision::getPage
- */
- public function testGetPage()
- {
- $page = $this->the_page;
-
- $orig = $this->makeRevision( array( 'page' => $page->getId() ) );
- $rev = Revision::newFromId( $orig->getId() );
-
- $this->assertEquals( $page->getId(), $rev->getPage() );
- }
-
- /**
- * @covers Revision::getText
- */
- public function testGetText()
- {
- $orig = $this->makeRevision( array( 'text' => 'hello hello.' ) );
- $rev = Revision::newFromId( $orig->getId() );
-
- $this->assertEquals( 'hello hello.', $rev->getText() );
- }
-
- /**
- * @covers Revision::revText
- */
- public function testRevText()
- {
- $this->hideDeprecated( 'Revision::revText' );
- $orig = $this->makeRevision( array( 'text' => 'hello hello rev.' ) );
- $rev = Revision::newFromId( $orig->getId() );
-
- $this->assertEquals( 'hello hello rev.', $rev->revText() );
- }
-
- /**
- * @covers Revision::getRawText
- */
- public function testGetRawText()
- {
- $orig = $this->makeRevision( array( 'text' => 'hello hello raw.' ) );
- $rev = Revision::newFromId( $orig->getId() );
-
- $this->assertEquals( 'hello hello raw.', $rev->getRawText() );
- }
- /**
- * @covers Revision::isCurrent
- */
- public function testIsCurrent()
- {
- $page = $this->createPage( 'RevisionStorageTest_testIsCurrent', 'Lorem Ipsum' );
- $rev1 = $page->getRevision();
-
- # @todo: find out if this should be true
- # $this->assertTrue( $rev1->isCurrent() );
-
- $rev1x = Revision::newFromId( $rev1->getId() );
- $this->assertTrue( $rev1x->isCurrent() );
-
- $page->doEdit( 'Bla bla', 'second rev' );
- $rev2 = $page->getRevision();
-
- # @todo: find out if this should be true
- # $this->assertTrue( $rev2->isCurrent() );
-
- $rev1x = Revision::newFromId( $rev1->getId() );
- $this->assertFalse( $rev1x->isCurrent() );
-
- $rev2x = Revision::newFromId( $rev2->getId() );
- $this->assertTrue( $rev2x->isCurrent() );
- }
-
- /**
- * @covers Revision::getPrevious
- */
- public function testGetPrevious()
- {
- $page = $this->createPage( 'RevisionStorageTest_testGetPrevious', 'Lorem Ipsum testGetPrevious' );
- $rev1 = $page->getRevision();
-
- $this->assertNull( $rev1->getPrevious() );
-
- $page->doEdit( 'Bla bla', 'second rev testGetPrevious' );
- $rev2 = $page->getRevision();
-
- $this->assertNotNull( $rev2->getPrevious() );
- $this->assertEquals( $rev1->getId(), $rev2->getPrevious()->getId() );
- }
-
- /**
- * @covers Revision::getNext
- */
- public function testGetNext()
- {
- $page = $this->createPage( 'RevisionStorageTest_testGetNext', 'Lorem Ipsum testGetNext' );
- $rev1 = $page->getRevision();
-
- $this->assertNull( $rev1->getNext() );
-
- $page->doEdit( 'Bla bla', 'second rev testGetNext' );
- $rev2 = $page->getRevision();
-
- $this->assertNotNull( $rev1->getNext() );
- $this->assertEquals( $rev2->getId(), $rev1->getNext()->getId() );
- }
-
- /**
- * @covers Revision::newNullRevision
- */
- public function testNewNullRevision()
- {
- $page = $this->createPage( 'RevisionStorageTest_testNewNullRevision', 'some testing text' );
- $orig = $page->getRevision();
-
- $dbw = wfGetDB( DB_MASTER );
- $rev = Revision::newNullRevision( $dbw, $page->getId(), 'a null revision', false );
-
- $this->assertNotEquals( $orig->getId(), $rev->getId(), 'new null revision shold have a different id from the original revision' );
- $this->assertEquals( $orig->getTextId(), $rev->getTextId(), 'new null revision shold have the same text id as the original revision' );
- $this->assertEquals( 'some testing text', $rev->getText() );
- }
-
- public function dataUserWasLastToEdit() {
- return array(
- array( #0
- 3, true, # actually the last edit
- ),
- array( #1
- 2, true, # not the current edit, but still by this user
- ),
- array( #2
- 1, false, # edit by another user
- ),
- array( #3
- 0, false, # first edit, by this user, but another user edited in the mean time
- ),
- );
- }
-
- /**
- * @dataProvider dataUserWasLastToEdit
- */
- public function testUserWasLastToEdit( $sinceIdx, $expectedLast ) {
- $userA = \User::newFromName( "RevisionStorageTest_userA" );
- $userB = \User::newFromName( "RevisionStorageTest_userB" );
-
- if ( $userA->getId() === 0 ) {
- $userA = \User::createNew( $userA->getName() );
- }
-
- if ( $userB->getId() === 0 ) {
- $userB = \User::createNew( $userB->getName() );
- }
-
- $dbw = wfGetDB( DB_MASTER );
- $revisions = array();
-
- // create revisions -----------------------------
- $page = WikiPage::factory( Title::newFromText( 'RevisionStorageTest_testUserWasLastToEdit' ) );
-
- # zero
- $revisions[0] = new Revision( array(
- 'page' => $page->getId(),
- 'timestamp' => '20120101000000',
- 'user' => $userA->getId(),
- 'text' => 'zero',
- 'summary' => 'edit zero'
- ) );
- $revisions[0]->insertOn( $dbw );
-
- # one
- $revisions[1] = new Revision( array(
- 'page' => $page->getId(),
- 'timestamp' => '20120101000100',
- 'user' => $userA->getId(),
- 'text' => 'one',
- 'summary' => 'edit one'
- ) );
- $revisions[1]->insertOn( $dbw );
-
- # two
- $revisions[2] = new Revision( array(
- 'page' => $page->getId(),
- 'timestamp' => '20120101000200',
- 'user' => $userB->getId(),
- 'text' => 'two',
- 'summary' => 'edit two'
- ) );
- $revisions[2]->insertOn( $dbw );
-
- # three
- $revisions[3] = new Revision( array(
- 'page' => $page->getId(),
- 'timestamp' => '20120101000300',
- 'user' => $userA->getId(),
- 'text' => 'three',
- 'summary' => 'edit three'
- ) );
- $revisions[3]->insertOn( $dbw );
-
- # four
- $revisions[4] = new Revision( array(
- 'page' => $page->getId(),
- 'timestamp' => '20120101000200',
- 'user' => $userA->getId(),
- 'text' => 'zero',
- 'summary' => 'edit four'
- ) );
- $revisions[4]->insertOn( $dbw );
-
- // test it ---------------------------------
- $since = $revisions[ $sinceIdx ]->getTimestamp();
-
- $wasLast = Revision::userWasLastToEdit( $dbw, $page->getId(), $userA->getId(), $since );
-
- $this->assertEquals( $expectedLast, $wasLast );
- }
-}
diff --git a/tests/phpunit/includes/RevisionTest.php b/tests/phpunit/includes/RevisionTest.php
deleted file mode 100644
index d7654db9..00000000
--- a/tests/phpunit/includes/RevisionTest.php
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-
-class RevisionTest extends MediaWikiTestCase {
- var $saveGlobals = array();
-
- function setUp() {
- global $wgContLang;
- $wgContLang = Language::factory( 'en' );
- $globalSet = array(
- 'wgLegacyEncoding' => false,
- 'wgCompressRevisions' => false,
- );
- foreach ( $globalSet as $var => $data ) {
- $this->saveGlobals[$var] = $GLOBALS[$var];
- $GLOBALS[$var] = $data;
- }
- }
-
- function tearDown() {
- foreach ( $this->saveGlobals as $var => $data ) {
- $GLOBALS[$var] = $data;
- }
- }
-
- function testGetRevisionText() {
- $row = new stdClass;
- $row->old_flags = '';
- $row->old_text = 'This is a bunch of revision text.';
- $this->assertEquals(
- 'This is a bunch of revision text.',
- Revision::getRevisionText( $row ) );
- }
-
- function testGetRevisionTextGzip() {
- if ( !function_exists( 'gzdeflate' ) ) {
- $this->markTestSkipped( 'Gzip compression is not enabled (requires zlib).' );
- } else {
- $row = new stdClass;
- $row->old_flags = 'gzip';
- $row->old_text = gzdeflate( 'This is a bunch of revision text.' );
- $this->assertEquals(
- 'This is a bunch of revision text.',
- Revision::getRevisionText( $row ) );
- }
- }
-
- function testGetRevisionTextUtf8Native() {
- $row = new stdClass;
- $row->old_flags = 'utf-8';
- $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
- $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
- $this->assertEquals(
- "Wiki est l'\xc3\xa9cole superieur !",
- Revision::getRevisionText( $row ) );
- }
-
- function testGetRevisionTextUtf8Legacy() {
- $row = new stdClass;
- $row->old_flags = '';
- $row->old_text = "Wiki est l'\xe9cole superieur !";
- $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
- $this->assertEquals(
- "Wiki est l'\xc3\xa9cole superieur !",
- Revision::getRevisionText( $row ) );
- }
-
- function testGetRevisionTextUtf8NativeGzip() {
- if ( !function_exists( 'gzdeflate' ) ) {
- $this->markTestSkipped( 'Gzip compression is not enabled (requires zlib).' );
- } else {
- $row = new stdClass;
- $row->old_flags = 'gzip,utf-8';
- $row->old_text = gzdeflate( "Wiki est l'\xc3\xa9cole superieur !" );
- $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
- $this->assertEquals(
- "Wiki est l'\xc3\xa9cole superieur !",
- Revision::getRevisionText( $row ) );
- }
- }
-
- function testGetRevisionTextUtf8LegacyGzip() {
- if ( !function_exists( 'gzdeflate' ) ) {
- $this->markTestSkipped( 'Gzip compression is not enabled (requires zlib).' );
- } else {
- $row = new stdClass;
- $row->old_flags = 'gzip';
- $row->old_text = gzdeflate( "Wiki est l'\xe9cole superieur !" );
- $GLOBALS['wgLegacyEncoding'] = 'iso-8859-1';
- $this->assertEquals(
- "Wiki est l'\xc3\xa9cole superieur !",
- Revision::getRevisionText( $row ) );
- }
- }
-
- function testCompressRevisionTextUtf8() {
- $row = new stdClass;
- $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
- $row->old_flags = Revision::compressRevisionText( $row->old_text );
- $this->assertTrue( false !== strpos( $row->old_flags, 'utf-8' ),
- "Flags should contain 'utf-8'" );
- $this->assertFalse( false !== strpos( $row->old_flags, 'gzip' ),
- "Flags should not contain 'gzip'" );
- $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
- $row->old_text, "Direct check" );
- $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
- Revision::getRevisionText( $row ), "getRevisionText" );
- }
-
- function testCompressRevisionTextUtf8Gzip() {
- $GLOBALS['wgCompressRevisions'] = true;
- $row = new stdClass;
- $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
- $row->old_flags = Revision::compressRevisionText( $row->old_text );
- $this->assertTrue( false !== strpos( $row->old_flags, 'utf-8' ),
- "Flags should contain 'utf-8'" );
- $this->assertTrue( false !== strpos( $row->old_flags, 'gzip' ),
- "Flags should contain 'gzip'" );
- $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
- gzinflate( $row->old_text ), "Direct check" );
- $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
- Revision::getRevisionText( $row ), "getRevisionText" );
- }
-}
-
-
diff --git a/tests/phpunit/includes/SampleTest.php b/tests/phpunit/includes/SampleTest.php
deleted file mode 100644
index 59ba0a04..00000000
--- a/tests/phpunit/includes/SampleTest.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-
-class TestSample extends MediaWikiLangTestCase {
-
- /**
- * Anything that needs to happen before your tests should go here.
- */
- function setUp() {
- global $wgContLang;
- parent::setUp();
-
- /* For example, we need to set $wgContLang for creating a new Title */
- $wgContLang = Language::factory( 'en' );
- }
-
- /**
- * Anything cleanup you need to do should go here.
- */
- function tearDown() {
- parent::tearDown();
- }
-
- /**
- * Name tests so that PHPUnit can turn them into sentances when
- * they run. While MediaWiki isn't strictly an Agile Programming
- * project, you are encouraged to use the naming described under
- * "Agile Documentation" at
- * http://www.phpunit.de/manual/3.4/en/other-uses-for-tests.html
- */
- function testTitleObjectStringConversion() {
- $title = Title::newFromText("text");
- $this->assertEquals("Text", $title->__toString(), "Title creation");
- $this->assertEquals("Text", "Text", "Automatic string conversion");
-
- $title = Title::newFromText("text", NS_MEDIA);
- $this->assertEquals("Media:Text", $title->__toString(), "Title creation with namespace");
-
- }
-
- /**
- * If you want to run a the same test with a variety of data. use a data provider.
- * see: http://www.phpunit.de/manual/3.4/en/writing-tests-for-phpunit.html
- */
- public function provideTitles() {
- return array(
- array( 'Text', NS_MEDIA, 'Media:Text' ),
- array( 'Text', null, 'Text' ),
- array( 'text', null, 'Text' ),
- array( 'Text', NS_USER, 'User:Text' ),
- array( 'Photo.jpg', NS_FILE, 'File:Photo.jpg' )
- );
- }
-
- /**
- * @dataProvider provideTitles
- * See http://www.phpunit.de/manual/3.4/en/appendixes.annotations.html#appendixes.annotations.dataProvider
- */
- public function testCreateBasicListOfTitles($titleName, $ns, $text) {
- $title = Title::newFromText($titleName, $ns);
- $this->assertEquals($text, "$title", "see if '$titleName' matches '$text'");
- }
-
- public function testSetUpMainPageTitleForNextTest() {
- $title = Title::newMainPage();
- $this->assertEquals("Main Page", "$title", "Test initial creation of a title");
-
- return $title;
- }
-
- /**
- * Instead of putting a bunch of tests in a single test method,
- * you should put only one or two tests in each test method. This
- * way, the test method names can remain descriptive.
- *
- * If you want to make tests depend on data created in another
- * method, you can create dependencies feed whatever you return
- * from the dependant method (e.g. testInitialCreation in this
- * example) as arguments to the next method (e.g. $title in
- * testTitleDepends is whatever testInitialCreatiion returned.)
- */
- /**
- * @depends testSetUpMainPageTitleForNextTest
- * See http://www.phpunit.de/manual/3.4/en/appendixes.annotations.html#appendixes.annotations.depends
- */
- public function testCheckMainPageTitleIsConsideredLocal( $title ) {
- $this->assertTrue( $title->isLocal() );
- }
-
- /**
- * @expectedException MWException object
- * See http://www.phpunit.de/manual/3.4/en/appendixes.annotations.html#appendixes.annotations.expectedException
- */
- function testTitleObjectFromObject() {
- $title = Title::newFromText( Title::newFromText( "test" ) );
- $this->assertEquals( "Test", $title->isLocal() );
- }
-}
-
diff --git a/tests/phpunit/includes/SanitizerTest.php b/tests/phpunit/includes/SanitizerTest.php
deleted file mode 100644
index 66af2581..00000000
--- a/tests/phpunit/includes/SanitizerTest.php
+++ /dev/null
@@ -1,162 +0,0 @@
-<?php
-
-class SanitizerTest extends MediaWikiTestCase {
-
- function setUp() {
- AutoLoader::loadClass( 'Sanitizer' );
- }
-
- function testDecodeNamedEntities() {
- $this->assertEquals(
- "\xc3\xa9cole",
- Sanitizer::decodeCharReferences( '&eacute;cole' ),
- 'decode named entities'
- );
- }
-
- function testDecodeNumericEntities() {
- $this->assertEquals(
- "\xc4\x88io bonas dans l'\xc3\xa9cole!",
- Sanitizer::decodeCharReferences( "&#x108;io bonas dans l'&#233;cole!" ),
- 'decode numeric entities'
- );
- }
-
- function testDecodeMixedEntities() {
- $this->assertEquals(
- "\xc4\x88io bonas dans l'\xc3\xa9cole!",
- Sanitizer::decodeCharReferences( "&#x108;io bonas dans l'&eacute;cole!" ),
- 'decode mixed numeric/named entities'
- );
- }
-
- function testDecodeMixedComplexEntities() {
- $this->assertEquals(
- "\xc4\x88io bonas dans l'\xc3\xa9cole! (mais pas &#x108;io dans l'&eacute;cole)",
- Sanitizer::decodeCharReferences(
- "&#x108;io bonas dans l'&eacute;cole! (mais pas &amp;#x108;io dans l'&#38;eacute;cole)"
- ),
- 'decode mixed complex entities'
- );
- }
-
- function testInvalidAmpersand() {
- $this->assertEquals(
- 'a & b',
- Sanitizer::decodeCharReferences( 'a & b' ),
- 'Invalid ampersand'
- );
- }
-
- function testInvalidEntities() {
- $this->assertEquals(
- '&foo;',
- Sanitizer::decodeCharReferences( '&foo;' ),
- 'Invalid named entity'
- );
- }
-
- function testInvalidNumberedEntities() {
- $this->assertEquals( UTF8_REPLACEMENT, Sanitizer::decodeCharReferences( "&#88888888888888;" ), 'Invalid numbered entity' );
- }
-
- function testSelfClosingTag() {
- $GLOBALS['wgUseTidy'] = false;
- $this->assertEquals(
- '<div>Hello world</div>',
- Sanitizer::removeHTMLtags( '<div>Hello world</div />' ),
- 'Self-closing closing div'
- );
- }
-
- function testDecodeTagAttributes() {
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=bar' ), array( 'foo' => 'bar' ), 'Unquoted attribute' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( ' foo = bar ' ), array( 'foo' => 'bar' ), 'Spaced attribute' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo="bar"' ), array( 'foo' => 'bar' ), 'Double-quoted attribute' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=\'bar\'' ), array( 'foo' => 'bar' ), 'Single-quoted attribute' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=\'bar\' baz="foo"' ), array( 'foo' => 'bar', 'baz' => 'foo' ), 'Several attributes' );
-
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=\'bar\' baz="foo"' ), array( 'foo' => 'bar', 'baz' => 'foo' ), 'Several attributes' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=\'bar\' baz="foo"' ), array( 'foo' => 'bar', 'baz' => 'foo' ), 'Several attributes' );
-
- $this->assertEquals( Sanitizer::decodeTagAttributes( ':foo=\'bar\'' ), array( ':foo' => 'bar' ), 'Leading :' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( '_foo=\'bar\'' ), array( '_foo' => 'bar' ), 'Leading _' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'Foo=\'bar\'' ), array( 'foo' => 'bar' ), 'Leading capital' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'FOO=BAR' ), array( 'foo' => 'BAR' ), 'Attribute keys are normalized to lowercase' );
-
- # Invalid beginning
- $this->assertEquals( Sanitizer::decodeTagAttributes( '-foo=bar' ), array(), 'Leading - is forbidden' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( '.foo=bar' ), array(), 'Leading . is forbidden' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo-bar=bar' ), array( 'foo-bar' => 'bar' ), 'A - is allowed inside the attribute' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo-=bar' ), array( 'foo-' => 'bar' ), 'A - is allowed inside the attribute' );
-
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo.bar=baz' ), array( 'foo.bar' => 'baz' ), 'A . is allowed inside the attribute' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo.=baz' ), array( 'foo.' => 'baz' ), 'A . is allowed as last character' );
-
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo6=baz' ), array( 'foo6' => 'baz' ), 'Numbers are allowed' );
-
- # This bit is more relaxed than XML rules, but some extensions use it, like ProofreadPage (see bug 27539)
- $this->assertEquals( Sanitizer::decodeTagAttributes( '1foo=baz' ), array( '1foo' => 'baz' ), 'Leading numbers are allowed' );
-
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo$=baz' ), array(), 'Symbols are not allowed' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo@=baz' ), array(), 'Symbols are not allowed' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo~=baz' ), array(), 'Symbols are not allowed' );
-
-
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=1[#^`*%w/(' ), array( 'foo' => '1[#^`*%w/(' ), 'All kind of characters are allowed as values' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo="1[#^`*%\'w/("' ), array( 'foo' => '1[#^`*%\'w/(' ), 'Double quotes are allowed if quoted by single quotes' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=\'1[#^`*%"w/(\'' ), array( 'foo' => '1[#^`*%"w/(' ), 'Single quotes are allowed if quoted by double quotes' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=&amp;&quot;' ), array( 'foo' => '&"' ), 'Special chars can be provided as entities' );
- $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=&foobar;' ), array( 'foo' => '&foobar;' ), 'Entity-like items are accepted' );
- }
-
- /**
- * @dataProvider provideDeprecatedAttributes
- */
- function testDeprecatedAttributesUnaltered( $inputAttr, $inputEl ) {
- $this->assertEquals( " $inputAttr", Sanitizer::fixTagAttributes( $inputAttr, $inputEl ) );
- }
-
- public static function provideDeprecatedAttributes() {
- return array(
- array( 'clear="left"', 'br' ),
- array( 'clear="all"', 'br' ),
- array( 'width="100"', 'td' ),
- array( 'nowrap="true"', 'td' ),
- array( 'nowrap=""', 'td' ),
- array( 'align="right"', 'td' ),
- array( 'align="center"', 'table' ),
- array( 'align="left"', 'tr' ),
- array( 'align="center"', 'div' ),
- array( 'align="left"', 'h1' ),
- array( 'align="left"', 'span' ),
- );
- }
-
- /**
- * @dataProvider provideCssCommentsFixtures
- */
- function testCssCommentsChecking( $expected, $css, $message = '' ) {
- $this->assertEquals(
- $expected,
- Sanitizer::checkCss( $css ),
- $message
- );
- }
-
- function provideCssCommentsFixtures() {
- /** array( <expected>, <css>, [message] ) */
- return array(
- array( ' ', '/**/' ),
- array( ' ', '/****/' ),
- array( ' ', '/* comment */' ),
- array( ' ', "\\2f\\2a foo \\2a\\2f",
- 'Backslash-escaped comments must be stripped (bug 28450)' ),
- array( '', '/* unfinished comment structure',
- 'Remove anything after a comment-start token' ),
- array( '', "\\2f\\2a unifinished comment'",
- 'Remove anything after a backslash-escaped comment-start token' ),
- );
- }
-}
-
diff --git a/tests/phpunit/includes/SanitizerValidateEmailTest.php b/tests/phpunit/includes/SanitizerValidateEmailTest.php
deleted file mode 100644
index 14d799cf..00000000
--- a/tests/phpunit/includes/SanitizerValidateEmailTest.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-class SanitizerValidateEmailTest extends MediaWikiTestCase {
-
- private function checkEmail( $addr, $expected = true, $msg = '') {
- if( $msg == '' ) { $msg = "Testing $addr"; }
- $this->assertEquals(
- $expected,
- Sanitizer::validateEmail( $addr ),
- $msg
- );
- }
- private function valid( $addr, $msg = '' ) {
- $this->checkEmail( $addr, true, $msg );
- }
- private function invalid( $addr, $msg = '' ) {
- $this->checkEmail( $addr, false, $msg );
- }
-
- function testEmailWellKnownUserAtHostDotTldAreValid() {
- $this->valid( 'user@example.com' );
- $this->valid( 'user@example.museum' );
- }
- function testEmailWithUpperCaseCharactersAreValid() {
- $this->valid( 'USER@example.com' );
- $this->valid( 'user@EXAMPLE.COM' );
- $this->valid( 'user@Example.com' );
- $this->valid( 'USER@eXAMPLE.com' );
- }
- function testEmailWithAPlusInUserName() {
- $this->valid( 'user+sub@example.com' );
- $this->valid( 'user+@example.com' );
- }
- function testEmailDoesNotNeedATopLevelDomain() {
- $this->valid( "user@localhost" );
- $this->valid( "FooBar@localdomain" );
- $this->valid( "nobody@mycompany" );
- }
- function testEmailWithWhiteSpacesBeforeOrAfterAreInvalids() {
- $this->invalid( " user@host.com" );
- $this->invalid( "user@host.com " );
- $this->invalid( "\tuser@host.com" );
- $this->invalid( "user@host.com\t" );
- }
- function testEmailWithWhiteSpacesAreInvalids() {
- $this->invalid( "User user@host" );
- $this->invalid( "first last@mycompany" );
- $this->invalid( "firstlast@my company" );
- }
- // bug 26948 : comma were matched by an incorrect regexp range
- function testEmailWithCommasAreInvalids() {
- $this->invalid( "user,foo@example.org" );
- $this->invalid( "userfoo@ex,ample.org" );
- }
- function testEmailWithHyphens() {
- $this->valid( "user-foo@example.org" );
- $this->valid( "userfoo@ex-ample.org" );
- }
- function testEmailDomainCanNotBeginWithDot() {
- $this->invalid( "user@." );
- $this->invalid( "user@.localdomain" );
- $this->invalid( "user@localdomain." );
- $this->valid( "user.@localdomain" );
- $this->valid( ".@localdomain" );
- $this->invalid( ".@a............" );
- }
- function testEmailWithFunnyCharacters() {
- $this->valid( "\$user!ex{this}@123.com" );
- }
- function testEmailTopLevelDomainCanBeNumerical() {
- $this->valid( "user@example.1234" );
- }
- function testEmailWithoutAtSignIsInvalid() {
- $this->invalid( 'useràexample.com' );
- }
- function testEmailWithOneCharacterDomainIsValid() {
- $this->valid( 'user@a' );
- }
-}
diff --git a/tests/phpunit/includes/SeleniumConfigurationTest.php b/tests/phpunit/includes/SeleniumConfigurationTest.php
deleted file mode 100644
index 8589c188..00000000
--- a/tests/phpunit/includes/SeleniumConfigurationTest.php
+++ /dev/null
@@ -1,228 +0,0 @@
-<?php
-
-class SeleniumConfigurationTest extends MediaWikiTestCase {
-
- /**
- * The file where the test temporarity stores the selenium config.
- * This should be cleaned up as part of teardown.
- */
- private $tempFileName;
-
- /**
- * String containing the a sample selenium settings
- */
- private $testConfig0 =
-'
-[SeleniumSettings]
-browsers[firefox] = "*firefox"
-browsers[iexplorer] = "*iexploreproxy"
-browsers[chrome] = "*chrome"
-host = "localhost"
-port = "foobarr"
-wikiUrl = "http://localhost/deployment"
-username = "xxxxxxx"
-userPassword = ""
-testBrowser = "chrome"
-startserver =
-stopserver =
-jUnitLogFile =
-runAgainstGrid = false
-
-[SeleniumTests]
-testSuite[SimpleSeleniumTestSuite] = "tests/selenium/SimpleSeleniumTestSuite.php"
-testSuite[TestSuiteName] = "testSuitePath"
-';
- /**
- * Array of expected browsers from $testConfig0
- */
- private $testBrowsers0 = array( 'firefox' => '*firefox',
- 'iexplorer' => '*iexploreproxy',
- 'chrome' => '*chrome'
- );
- /**
- * Array of expected selenium settings from $testConfig0
- */
- private $testSettings0 = array(
- 'host' => 'localhost',
- 'port' => 'foobarr',
- 'wikiUrl' => 'http://localhost/deployment',
- 'username' => 'xxxxxxx',
- 'userPassword' => '',
- 'testBrowser' => 'chrome',
- 'startserver' => null,
- 'stopserver' => null,
- 'seleniumserverexecpath' => null,
- 'jUnitLogFile' => null,
- 'runAgainstGrid' => null
- );
- /**
- * Array of expected testSuites from $testConfig0
- */
- private $testSuites0 = array(
- 'SimpleSeleniumTestSuite' => 'tests/selenium/SimpleSeleniumTestSuite.php',
- 'TestSuiteName' => 'testSuitePath'
- );
-
-
- /**
- * Another sample selenium settings file contents
- */
- private $testConfig1 =
-'
-[SeleniumSettings]
-host = "localhost"
-testBrowser = "firefox"
-';
- /**
- * Expected browsers from $testConfig1
- */
- private $testBrowsers1 = null;
- /**
- * Expected selenium settings from $testConfig1
- */
- private $testSettings1 = array(
- 'host' => 'localhost',
- 'port' => null,
- 'wikiUrl' => null,
- 'username' => null,
- 'userPassword' => null,
- 'testBrowser' => 'firefox',
- 'startserver' => null,
- 'stopserver' => null,
- 'seleniumserverexecpath' => null,
- 'jUnitLogFile' => null,
- 'runAgainstGrid' => null
- );
- /**
- * Expected test suites from $testConfig1
- */
- private $testSuites1 = null;
-
-
- public function setUp() {
- if ( !defined( 'SELENIUMTEST' ) ) {
- define( 'SELENIUMTEST', true );
- }
- }
-
- /**
- * Clean up the temporary file used to store the selenium settings.
- */
- public function tearDown() {
- if ( strlen( $this->tempFileName ) > 0 ) {
- unlink( $this->tempFileName );
- unset( $this->tempFileName );
- }
- parent::tearDown();
- }
-
- /**
- * @expectedException MWException
- * @group SeleniumFramework
- */
- public function testErrorOnIncorrectConfigFile() {
- $seleniumSettings = array();
- $seleniumBrowsers = array();
- $seleniumTestSuites = array();
-
- SeleniumConfig::getSeleniumSettings($seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites,
- "Some_fake_settings_file.ini" );
-
- }
-
- /**
- * @expectedException MWException
- * @group SeleniumFramework
- */
- public function testErrorOnMissingConfigFile() {
- $seleniumSettings = array();
- $seleniumBrowsers = array();
- $seleniumTestSuites = array();
- global $wgSeleniumConfigFile;
- $wgSeleniumConfigFile = '';
- SeleniumConfig::getSeleniumSettings($seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites);
- }
-
- /**
- * @group SeleniumFramework
- */
- public function testUsesGlobalVarForConfigFile() {
- $seleniumSettings = array();
- $seleniumBrowsers = array();
- $seleniumTestSuites = array();
- global $wgSeleniumConfigFile;
- $this->writeToTempFile( $this->testConfig0 );
- $wgSeleniumConfigFile = $this->tempFileName;
- SeleniumConfig::getSeleniumSettings($seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites);
- $this->assertEquals($seleniumSettings, $this->testSettings0 ,
- 'The selenium settings should have been read from the file defined in $wgSeleniumConfigFile'
- );
- $this->assertEquals($seleniumBrowsers, $this->testBrowsers0,
- 'The available browsers should have been read from the file defined in $wgSeleniumConfigFile'
- );
- $this->assertEquals($seleniumTestSuites, $this->testSuites0,
- 'The test suites should have been read from the file defined in $wgSeleniumConfigFile'
- );
- }
-
- /**
- * @group SeleniumFramework
- * @dataProvider sampleConfigs
- */
- public function testgetSeleniumSettings($sampleConfig, $expectedSettings, $expectedBrowsers, $expectedSuites ) {
- $this->writeToTempFile( $sampleConfig );
- $seleniumSettings = array();
- $seleniumBrowsers = array();
- $seleniumTestSuites = null;
-
- SeleniumConfig::getSeleniumSettings($seleniumSettings,
- $seleniumBrowsers,
- $seleniumTestSuites,
- $this->tempFileName );
-
- $this->assertEquals($seleniumSettings, $expectedSettings,
- "The selenium settings for the following test configuration was not retrieved correctly" . $sampleConfig
- );
- $this->assertEquals($seleniumBrowsers, $expectedBrowsers,
- "The available browsers for the following test configuration was not retrieved correctly" . $sampleConfig
- );
- $this->assertEquals($seleniumTestSuites, $expectedSuites,
- "The test suites for the following test configuration was not retrieved correctly" . $sampleConfig
- );
-
-
- }
-
- /**
- * create a temp file and write text to it.
- * @param $testToWrite the text to write to the temp file
- */
- private function writeToTempFile($textToWrite) {
- $this->tempFileName = tempnam(sys_get_temp_dir(), 'test_settings.');
- $tempFile = fopen( $this->tempFileName, "w" );
- fwrite($tempFile , $textToWrite);
- fclose($tempFile);
- }
-
- /**
- * Returns an array containing:
- * The contents of the selenium cingiguration ini file
- * The expected selenium configuration array that getSeleniumSettings should return
- * The expected available browsers array that getSeleniumSettings should return
- * The expected test suites arrya that getSeleniumSettings should return
- */
- public function sampleConfigs() {
- return array(
- array($this->testConfig0, $this->testSettings0, $this->testBrowsers0, $this->testSuites0 ),
- array($this->testConfig1, $this->testSettings1, $this->testBrowsers1, $this->testSuites1 )
- );
- }
-
-
-}
diff --git a/tests/phpunit/includes/SiteConfigurationTest.php b/tests/phpunit/includes/SiteConfigurationTest.php
deleted file mode 100644
index 57d3532a..00000000
--- a/tests/phpunit/includes/SiteConfigurationTest.php
+++ /dev/null
@@ -1,311 +0,0 @@
-<?php
-
-function getSiteParams( $conf, $wiki ) {
- $site = null;
- $lang = null;
- foreach ( $conf->suffixes as $suffix ) {
- if ( substr( $wiki, -strlen( $suffix ) ) == $suffix ) {
- $site = $suffix;
- $lang = substr( $wiki, 0, -strlen( $suffix ) );
- break;
- }
- }
- return array(
- 'suffix' => $site,
- 'lang' => $lang,
- 'params' => array(
- 'lang' => $lang,
- 'site' => $site,
- 'wiki' => $wiki,
- ),
- 'tags' => array( 'tag' ),
- );
-}
-
-class SiteConfigurationTest extends MediaWikiTestCase {
- var $mConf;
-
- function setUp() {
- $this->mConf = new SiteConfiguration;
-
- $this->mConf->suffixes = array( 'wiki' );
- $this->mConf->wikis = array( 'enwiki', 'dewiki', 'frwiki' );
- $this->mConf->settings = array(
- 'simple' => array(
- 'wiki' => 'wiki',
- 'tag' => 'tag',
- 'enwiki' => 'enwiki',
- 'dewiki' => 'dewiki',
- 'frwiki' => 'frwiki',
- ),
-
- 'fallback' => array(
- 'default' => 'default',
- 'wiki' => 'wiki',
- 'tag' => 'tag',
- ),
-
- 'params' => array(
- 'default' => '$lang $site $wiki',
- ),
-
- '+global' => array(
- 'wiki' => array(
- 'wiki' => 'wiki',
- ),
- 'tag' => array(
- 'tag' => 'tag',
- ),
- 'enwiki' => array(
- 'enwiki' => 'enwiki',
- ),
- 'dewiki' => array(
- 'dewiki' => 'dewiki',
- ),
- 'frwiki' => array(
- 'frwiki' => 'frwiki',
- ),
- ),
-
- 'merge' => array(
- '+wiki' => array(
- 'wiki' => 'wiki',
- ),
- '+tag' => array(
- 'tag' => 'tag',
- ),
- 'default' => array(
- 'default' => 'default',
- ),
- '+enwiki' => array(
- 'enwiki' => 'enwiki',
- ),
- '+dewiki' => array(
- 'dewiki' => 'dewiki',
- ),
- '+frwiki' => array(
- 'frwiki' => 'frwiki',
- ),
- ),
- );
-
- $GLOBALS['global'] = array( 'global' => 'global' );
- }
-
-
- function testSiteFromDb() {
- $this->assertEquals(
- array( 'wikipedia', 'en' ),
- $this->mConf->siteFromDB( 'enwiki' ),
- 'siteFromDB()'
- );
- $this->assertEquals(
- array( 'wikipedia', '' ),
- $this->mConf->siteFromDB( 'wiki' ),
- 'siteFromDB() on a suffix'
- );
- $this->assertEquals(
- array( null, null ),
- $this->mConf->siteFromDB( 'wikien' ),
- 'siteFromDB() on a non-existing wiki'
- );
-
- $this->mConf->suffixes = array( 'wiki', '' );
- $this->assertEquals(
- array( '', 'wikien' ),
- $this->mConf->siteFromDB( 'wikien' ),
- 'siteFromDB() on a non-existing wiki (2)'
- );
- }
-
- function testGetLocalDatabases() {
- $this->assertEquals(
- array( 'enwiki', 'dewiki', 'frwiki' ),
- $this->mConf->getLocalDatabases(),
- 'getLocalDatabases()'
- );
- }
-
- function testGetConfVariables() {
- $this->assertEquals(
- 'enwiki',
- $this->mConf->get( 'simple', 'enwiki', 'wiki' ),
- 'get(): simple setting on an existing wiki'
- );
- $this->assertEquals(
- 'dewiki',
- $this->mConf->get( 'simple', 'dewiki', 'wiki' ),
- 'get(): simple setting on an existing wiki (2)'
- );
- $this->assertEquals(
- 'frwiki',
- $this->mConf->get( 'simple', 'frwiki', 'wiki' ),
- 'get(): simple setting on an existing wiki (3)'
- );
- $this->assertEquals(
- 'wiki',
- $this->mConf->get( 'simple', 'wiki', 'wiki' ),
- 'get(): simple setting on an suffix'
- );
- $this->assertEquals(
- 'wiki',
- $this->mConf->get( 'simple', 'eswiki', 'wiki' ),
- 'get(): simple setting on an non-existing wiki'
- );
-
- $this->assertEquals(
- 'wiki',
- $this->mConf->get( 'fallback', 'enwiki', 'wiki' ),
- 'get(): fallback setting on an existing wiki'
- );
- $this->assertEquals(
- 'tag',
- $this->mConf->get( 'fallback', 'dewiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): fallback setting on an existing wiki (with wiki tag)'
- );
- $this->assertEquals(
- 'wiki',
- $this->mConf->get( 'fallback', 'wiki', 'wiki' ),
- 'get(): fallback setting on an suffix'
- );
- $this->assertEquals(
- 'wiki',
- $this->mConf->get( 'fallback', 'wiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): fallback setting on an suffix (with wiki tag)'
- );
- $this->assertEquals(
- 'wiki',
- $this->mConf->get( 'fallback', 'eswiki', 'wiki' ),
- 'get(): fallback setting on an non-existing wiki'
- );
- $this->assertEquals(
- 'tag',
- $this->mConf->get( 'fallback', 'eswiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): fallback setting on an non-existing wiki (with wiki tag)'
- );
-
- $common = array( 'wiki' => 'wiki', 'default' => 'default' );
- $commonTag = array( 'tag' => 'tag', 'wiki' => 'wiki', 'default' => 'default' );
- $this->assertEquals(
- array( 'enwiki' => 'enwiki' ) + $common,
- $this->mConf->get( 'merge', 'enwiki', 'wiki' ),
- 'get(): merging setting on an existing wiki'
- );
- $this->assertEquals(
- array( 'enwiki' => 'enwiki' ) + $commonTag,
- $this->mConf->get( 'merge', 'enwiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): merging setting on an existing wiki (with tag)'
- );
- $this->assertEquals(
- array( 'dewiki' => 'dewiki' ) + $common,
- $this->mConf->get( 'merge', 'dewiki', 'wiki' ),
- 'get(): merging setting on an existing wiki (2)'
- );
- $this->assertEquals(
- array( 'dewiki' => 'dewiki' ) + $commonTag,
- $this->mConf->get( 'merge', 'dewiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): merging setting on an existing wiki (2) (with tag)'
- );
- $this->assertEquals(
- array( 'frwiki' => 'frwiki' ) + $common,
- $this->mConf->get( 'merge', 'frwiki', 'wiki' ),
- 'get(): merging setting on an existing wiki (3)'
- );
- $this->assertEquals(
- array( 'frwiki' => 'frwiki' ) + $commonTag,
- $this->mConf->get( 'merge', 'frwiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): merging setting on an existing wiki (3) (with tag)'
- );
- $this->assertEquals(
- array( 'wiki' => 'wiki' ) + $common,
- $this->mConf->get( 'merge', 'wiki', 'wiki' ),
- 'get(): merging setting on an suffix'
- );
- $this->assertEquals(
- array( 'wiki' => 'wiki' ) + $commonTag,
- $this->mConf->get( 'merge', 'wiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): merging setting on an suffix (with tag)'
- );
- $this->assertEquals(
- $common,
- $this->mConf->get( 'merge', 'eswiki', 'wiki' ),
- 'get(): merging setting on an non-existing wiki'
- );
- $this->assertEquals(
- $commonTag,
- $this->mConf->get( 'merge', 'eswiki', 'wiki', array(), array( 'tag' ) ),
- 'get(): merging setting on an non-existing wiki (with tag)'
- );
- }
-
- function testSiteFromDbWithCallback() {
- $this->mConf->siteParamsCallback = 'getSiteParams';
-
- $this->assertEquals(
- array( 'wiki', 'en' ),
- $this->mConf->siteFromDB( 'enwiki' ),
- 'siteFromDB() with callback'
- );
- $this->assertEquals(
- array( 'wiki', '' ),
- $this->mConf->siteFromDB( 'wiki' ),
- 'siteFromDB() with callback on a suffix'
- );
- $this->assertEquals(
- array( null, null ),
- $this->mConf->siteFromDB( 'wikien' ),
- 'siteFromDB() with callback on a non-existing wiki'
- );
- }
-
- function testParameterReplacement() {
- $this->mConf->siteParamsCallback = 'getSiteParams';
-
- $this->assertEquals(
- 'en wiki enwiki',
- $this->mConf->get( 'params', 'enwiki', 'wiki' ),
- 'get(): parameter replacement on an existing wiki'
- );
- $this->assertEquals(
- 'de wiki dewiki',
- $this->mConf->get( 'params', 'dewiki', 'wiki' ),
- 'get(): parameter replacement on an existing wiki (2)'
- );
- $this->assertEquals(
- 'fr wiki frwiki',
- $this->mConf->get( 'params', 'frwiki', 'wiki' ),
- 'get(): parameter replacement on an existing wiki (3)'
- );
- $this->assertEquals(
- ' wiki wiki',
- $this->mConf->get( 'params', 'wiki', 'wiki' ),
- 'get(): parameter replacement on an suffix'
- );
- $this->assertEquals(
- 'es wiki eswiki',
- $this->mConf->get( 'params', 'eswiki', 'wiki' ),
- 'get(): parameter replacement on an non-existing wiki'
- );
- }
-
- function testGetAllGlobals() {
- $this->mConf->siteParamsCallback = 'getSiteParams';
-
- $getall = array(
- 'simple' => 'enwiki',
- 'fallback' => 'tag',
- 'params' => 'en wiki enwiki',
- 'global' => array( 'enwiki' => 'enwiki' ) + $GLOBALS['global'],
- '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' );
- }
-}
diff --git a/tests/phpunit/includes/TemplateCategoriesTest.php b/tests/phpunit/includes/TemplateCategoriesTest.php
deleted file mode 100644
index 39ce6e31..00000000
--- a/tests/phpunit/includes/TemplateCategoriesTest.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-/**
- * @group Database
- */
-require __DIR__ . "/../../../maintenance/runJobs.php";
-
-class TemplateCategoriesTest extends MediaWikiLangTestCase {
-
- function testTemplateCategories() {
- $title = Title::newFromText( "Categorized from template" );
- $page = WikiPage::factory( $title );
- $user = new User();
- $user->mRights = array( 'createpage', 'edit', 'purge' );
-
- $status = $page->doEdit( '{{Categorising template}}', 'Create a page with a template', 0, false, $user );
- $this->assertEquals(
- array()
- , $title->getParentCategories()
- );
-
- $template = WikiPage::factory( Title::newFromText( 'Template:Categorising template' ) );
- $status = $template->doEdit( '[[Category:Solved bugs]]', 'Add a category through a template', 0, false, $user );
-
- // Run the job queue
- $jobs = new RunJobs;
- $jobs->loadParamsAndArgs( null, array( 'quiet' => true ), null );
- $jobs->execute();
-
- $this->assertEquals(
- array( 'Category:Solved_bugs' => $title->getPrefixedText() )
- , $title->getParentCategories()
- );
- }
-
-}
diff --git a/tests/phpunit/includes/TestUser.php b/tests/phpunit/includes/TestUser.php
deleted file mode 100644
index c4d89455..00000000
--- a/tests/phpunit/includes/TestUser.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-/* 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;
- public $password;
- public $email;
- public $groups;
- public $user;
-
- function __construct( $username, $realname = 'Real Name', $email = 'sample@example.com', $groups = array() ) {
- $this->username = $username;
- $this->realname = $realname;
- $this->email = $email;
- $this->groups = $groups;
-
- // don't allow user to hardcode or select passwords -- people sometimes run tests
- // on live wikis. Sometimes we create sysop users in these tests. A sysop user with
- // a known password would be a Bad Thing.
- $this->password = User::randomPassword();
-
- $this->user = User::newFromName( $this->username );
- $this->user->load();
-
- // In an ideal world we'd have a new wiki (or mock data store) for every single test.
- // But for now, we just need to create or update the user with the desired properties.
- // we particularly need the new password, since we just generated it randomly.
- // In core MediaWiki, there is no functionality to delete users, so this is the best we can do.
- if ( !$this->user->getID() ) {
- // create the user
- $this->user = User::createNew(
- $this->username, array(
- "email" => $this->email,
- "real_name" => $this->realname
- )
- );
- if ( !$this->user ) {
- throw new Exception( "error creating user" );
- }
- }
-
- // update the user to use the new random password and other details
- $this->user->setPassword( $this->password );
- $this->user->setEmail( $this->email );
- $this->user->setRealName( $this->realname );
- // remove all groups, replace with any groups specified
- foreach ( $this->user->getGroups() as $group ) {
- $this->user->removeGroup( $group );
- }
- if ( count( $this->groups ) ) {
- foreach ( $this->groups as $group ) {
- $this->user->addGroup( $group );
- }
- }
- $this->user->saveSettings();
-
- }
-}
diff --git a/tests/phpunit/includes/TimeAdjustTest.php b/tests/phpunit/includes/TimeAdjustTest.php
deleted file mode 100644
index cd027c5b..00000000
--- a/tests/phpunit/includes/TimeAdjustTest.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-class TimeAdjustTest extends MediaWikiLangTestCase {
- static $offset;
-
- public function setUp() {
- parent::setUp();
- global $wgLocalTZoffset;
- self::$offset = $wgLocalTZoffset;
-
- $this->iniSet( 'precision', 15 );
- }
-
- public function tearDown() {
- global $wgLocalTZoffset;
- $wgLocalTZoffset = self::$offset;
- parent::tearDown();
- }
-
- # Test offset usage for a given language::userAdjust
- function testUserAdjust() {
- global $wgLocalTZoffset, $wgContLang;
-
- $wgContLang = $en = Language::factory( 'en' );
-
- #  Collection of parameters for Language_t_Offset.
- # Format: date to be formatted, localTZoffset value, expected date
- $userAdjust_tests = array(
- array( 20061231235959, 0, 20061231235959 ),
- array( 20061231235959, 5, 20070101000459 ),
- array( 20061231235959, 15, 20070101001459 ),
- array( 20061231235959, 60, 20070101005959 ),
- array( 20061231235959, 90, 20070101012959 ),
- array( 20061231235959, 120, 20070101015959 ),
- array( 20061231235959, 540, 20070101085959 ),
- array( 20061231235959, -5, 20061231235459 ),
- array( 20061231235959, -30, 20061231232959 ),
- array( 20061231235959, -60, 20061231225959 ),
- );
-
- foreach ( $userAdjust_tests as $data ) {
- $wgLocalTZoffset = $data[1];
-
- $this->assertEquals(
- strval( $data[2] ),
- strval( $en->userAdjust( $data[0], '' ) ),
- "User adjust {$data[0]} by {$data[1]} minutes should give {$data[2]}"
- );
- }
- }
-}
diff --git a/tests/phpunit/includes/TimestampTest.php b/tests/phpunit/includes/TimestampTest.php
deleted file mode 100644
index 231228f5..00000000
--- a/tests/phpunit/includes/TimestampTest.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-
-/**
- * Tests timestamp parsing and output.
- */
-class TimestampTest extends MediaWikiTestCase {
- /**
- * Test parsing of valid timestamps and outputing to MW format.
- * @dataProvider provideValidTimestamps
- */
- function testValidParse( $format, $original, $expected ) {
- $timestamp = new MWTimestamp( $original );
- $this->assertEquals( $expected, $timestamp->getTimestamp( TS_MW ) );
- }
-
- /**
- * Test outputting valid timestamps to different formats.
- * @dataProvider provideValidTimestamps
- */
- function testValidOutput( $format, $expected, $original ) {
- $timestamp = new MWTimestamp( $original );
- $this->assertEquals( $expected, (string) $timestamp->getTimestamp( $format ) );
- }
-
- /**
- * Test an invalid timestamp.
- * @expectedException TimestampException
- */
- function testInvalidParse() {
- $timestamp = new MWTimestamp( "This is not a timestamp." );
- }
-
- /**
- * Test requesting an invalid output format.
- * @expectedException TimestampException
- */
- function testInvalidOutput() {
- $timestamp = new MWTimestamp( '1343761268' );
- $timestamp->getTimestamp( 98 );
- }
-
- /**
- * Test human readable timestamp format.
- */
- function testHumanOutput() {
- $timestamp = new MWTimestamp( time() - 3600 );
- $this->assertEquals( "1 hour ago", $timestamp->getHumanTimestamp()->toString() );
- }
-
- /**
- * Returns a list of valid timestamps in the format:
- * array( type, timestamp_of_type, timestamp_in_MW )
- */
- function provideValidTimestamps() {
- return array(
- // Various formats
- array( TS_UNIX, '1343761268', '20120731190108' ),
- array( TS_MW, '20120731190108', '20120731190108' ),
- array( TS_DB, '2012-07-31 19:01:08', '20120731190108' ),
- array( TS_ISO_8601, '2012-07-31T19:01:08Z', '20120731190108' ),
- array( TS_ISO_8601_BASIC, '20120731T190108Z', '20120731190108' ),
- array( TS_EXIF, '2012:07:31 19:01:08', '20120731190108' ),
- array( TS_RFC2822, 'Tue, 31 Jul 2012 19:01:08 GMT', '20120731190108' ),
- array( TS_ORACLE, '31-07-2012 19:01:08.000000', '20120731190108' ),
- array( TS_POSTGRES, '2012-07-31 19:01:08 GMT', '20120731190108' ),
- array( TS_DB2, '2012-07-31 19:01:08', '20120731190108' ),
- // Some extremes and weird values
- array( TS_ISO_8601, '9999-12-31T23:59:59Z', '99991231235959' ),
- array( TS_UNIX, '-62135596801', '00001231235959' )
- );
- }
-}
diff --git a/tests/phpunit/includes/TitleMethodsTest.php b/tests/phpunit/includes/TitleMethodsTest.php
deleted file mode 100644
index aed658ba..00000000
--- a/tests/phpunit/includes/TitleMethodsTest.php
+++ /dev/null
@@ -1,201 +0,0 @@
-<?php
-
-class TitleMethodsTest extends MediaWikiTestCase {
-
- public function dataEquals() {
- return array(
- array( 'Main Page', 'Main Page', true ),
- array( 'Main Page', 'Not The Main Page', false ),
- array( 'Main Page', 'Project:Main Page', false ),
- array( 'File:Example.png', 'Image:Example.png', true ),
- array( 'Special:Version', 'Special:Version', true ),
- array( 'Special:Version', 'Special:Recentchanges', false ),
- array( 'Special:Version', 'Main Page', false ),
- );
- }
-
- /**
- * @dataProvider dataEquals
- */
- public function testEquals( $titleA, $titleB, $expectedBool ) {
- $titleA = Title::newFromText( $titleA );
- $titleB = Title::newFromText( $titleB );
-
- $this->assertEquals( $expectedBool, $titleA->equals( $titleB ) );
- $this->assertEquals( $expectedBool, $titleB->equals( $titleA ) );
- }
-
- public function dataInNamespace() {
- return array(
- array( 'Main Page', NS_MAIN, true ),
- array( 'Main Page', NS_TALK, false ),
- array( 'Main Page', NS_USER, false ),
- array( 'User:Foo', NS_USER, true ),
- array( 'User:Foo', NS_USER_TALK, false ),
- array( 'User:Foo', NS_TEMPLATE, false ),
- array( 'User_talk:Foo', NS_USER_TALK, true ),
- array( 'User_talk:Foo', NS_USER, false ),
- );
- }
-
- /**
- * @dataProvider dataInNamespace
- */
- public function testInNamespace( $title, $ns, $expectedBool ) {
- $title = Title::newFromText( $title );
- $this->assertEquals( $expectedBool, $title->inNamespace( $ns ) );
- }
-
- public function testInNamespaces() {
- $mainpage = Title::newFromText( 'Main Page' );
- $this->assertTrue( $mainpage->inNamespaces( NS_MAIN, NS_USER ) );
- $this->assertTrue( $mainpage->inNamespaces( array( NS_MAIN, NS_USER ) ) );
- $this->assertTrue( $mainpage->inNamespaces( array( NS_USER, NS_MAIN ) ) );
- $this->assertFalse( $mainpage->inNamespaces( array( NS_PROJECT, NS_TEMPLATE ) ) );
- }
-
- public function dataHasSubjectNamespace() {
- return array(
- array( 'Main Page', NS_MAIN, true ),
- array( 'Main Page', NS_TALK, true ),
- array( 'Main Page', NS_USER, false ),
- array( 'User:Foo', NS_USER, true ),
- array( 'User:Foo', NS_USER_TALK, true ),
- array( 'User:Foo', NS_TEMPLATE, false ),
- array( 'User_talk:Foo', NS_USER_TALK, true ),
- array( 'User_talk:Foo', NS_USER, true ),
- );
- }
-
- /**
- * @dataProvider dataHasSubjectNamespace
- */
- public function testHasSubjectNamespace( $title, $ns, $expectedBool ) {
- $title = Title::newFromText( $title );
- $this->assertEquals( $expectedBool, $title->hasSubjectNamespace( $ns ) );
- }
-
- public function dataIsCssOrJsPage() {
- return array(
- array( 'Foo', false ),
- array( 'Foo.js', false ),
- array( 'Foo/bar.js', false ),
- array( 'User:Foo', false ),
- array( 'User:Foo.js', false ),
- array( 'User:Foo/bar.js', false ),
- array( 'User:Foo/bar.css', false ),
- array( 'User talk:Foo/bar.css', false ),
- array( 'User:Foo/bar.js.xxx', false ),
- array( 'User:Foo/bar.xxx', false ),
- array( 'MediaWiki:Foo.js', true ),
- array( 'MediaWiki:Foo.css', true ),
- array( 'MediaWiki:Foo.JS', false ),
- array( 'MediaWiki:Foo.CSS', false ),
- array( 'MediaWiki:Foo.css.xxx', false ),
- );
- }
-
- /**
- * @dataProvider dataIsCssOrJsPage
- */
- public function testIsCssOrJsPage( $title, $expectedBool ) {
- $title = Title::newFromText( $title );
- $this->assertEquals( $expectedBool, $title->isCssOrJsPage() );
- }
-
-
- public function dataIsCssJsSubpage() {
- return array(
- array( 'Foo', false ),
- array( 'Foo.js', false ),
- array( 'Foo/bar.js', false ),
- array( 'User:Foo', false ),
- array( 'User:Foo.js', false ),
- array( 'User:Foo/bar.js', true ),
- array( 'User:Foo/bar.css', true ),
- array( 'User talk:Foo/bar.css', false ),
- array( 'User:Foo/bar.js.xxx', false ),
- array( 'User:Foo/bar.xxx', false ),
- array( 'MediaWiki:Foo.js', false ),
- array( 'User:Foo/bar.JS', false ),
- array( 'User:Foo/bar.CSS', false ),
- );
- }
-
- /**
- * @dataProvider dataIsCssJsSubpage
- */
- public function testIsCssJsSubpage( $title, $expectedBool ) {
- $title = Title::newFromText( $title );
- $this->assertEquals( $expectedBool, $title->isCssJsSubpage() );
- }
-
- public function dataIsCssSubpage() {
- return array(
- array( 'Foo', false ),
- array( 'Foo.css', false ),
- array( 'User:Foo', false ),
- array( 'User:Foo.js', false ),
- array( 'User:Foo.css', false ),
- array( 'User:Foo/bar.js', false ),
- array( 'User:Foo/bar.css', true ),
- );
- }
-
- /**
- * @dataProvider dataIsCssSubpage
- */
- public function testIsCssSubpage( $title, $expectedBool ) {
- $title = Title::newFromText( $title );
- $this->assertEquals( $expectedBool, $title->isCssSubpage() );
- }
-
- public function dataIsJsSubpage() {
- return array(
- array( 'Foo', false ),
- array( 'Foo.css', false ),
- array( 'User:Foo', false ),
- array( 'User:Foo.js', false ),
- array( 'User:Foo.css', false ),
- array( 'User:Foo/bar.js', true ),
- array( 'User:Foo/bar.css', false ),
- );
- }
-
- /**
- * @dataProvider dataIsJsSubpage
- */
- public function testIsJsSubpage( $title, $expectedBool ) {
- $title = Title::newFromText( $title );
- $this->assertEquals( $expectedBool, $title->isJsSubpage() );
- }
-
- public function dataIsWikitextPage() {
- return array(
- array( 'Foo', true ),
- array( 'Foo.js', true ),
- array( 'Foo/bar.js', true ),
- array( 'User:Foo', true ),
- array( 'User:Foo.js', true ),
- array( 'User:Foo/bar.js', false ),
- array( 'User:Foo/bar.css', false ),
- array( 'User talk:Foo/bar.css', true ),
- array( 'User:Foo/bar.js.xxx', true ),
- array( 'User:Foo/bar.xxx', true ),
- array( 'MediaWiki:Foo.js', false ),
- array( 'MediaWiki:Foo.css', false ),
- array( 'MediaWiki:Foo/bar.css', false ),
- array( 'User:Foo/bar.JS', true ),
- array( 'User:Foo/bar.CSS', true ),
- );
- }
-
- /**
- * @dataProvider dataIsWikitextPage
- */
- public function testIsWikitextPage( $title, $expectedBool ) {
- $title = Title::newFromText( $title );
- $this->assertEquals( $expectedBool, $title->isWikitextPage() );
- }
-
-}
diff --git a/tests/phpunit/includes/TitlePermissionTest.php b/tests/phpunit/includes/TitlePermissionTest.php
deleted file mode 100644
index f62ac5dd..00000000
--- a/tests/phpunit/includes/TitlePermissionTest.php
+++ /dev/null
@@ -1,660 +0,0 @@
-<?php
-
-/**
- * @group Database
- */
-class TitlePermissionTest extends MediaWikiLangTestCase {
- protected $title;
-
- /**
- * @var User
- */
- protected $user, $anonUser, $userUser, $altUser;
-
- /**
- * @var string
- */
- protected $userName, $altUserName;
-
- function setUp() {
- global $wgLocaltimezone, $wgLocalTZoffset, $wgMemc, $wgContLang, $wgLang;
- parent::setUp();
-
- if(!$wgMemc) {
- $wgMemc = new EmptyBagOStuff;
- }
- $wgContLang = $wgLang = Language::factory( 'en' );
-
- $this->userName = "Useruser";
- $this->altUserName = "Altuseruser";
- date_default_timezone_set( $wgLocaltimezone );
- $wgLocalTZoffset = date( "Z" ) / 60;
-
- $this->title = Title::makeTitle( NS_MAIN, "Main Page" );
- if ( !isset( $this->userUser ) || !( $this->userUser instanceOf User ) ) {
- $this->userUser = User::newFromName( $this->userName );
-
- if ( !$this->userUser->getID() ) {
- $this->userUser = User::createNew( $this->userName, array(
- "email" => "test@example.com",
- "real_name" => "Test User" ) );
- $this->userUser->load();
- }
-
- $this->altUser = User::newFromName( $this->altUserName );
- if ( !$this->altUser->getID() ) {
- $this->altUser = User::createNew( $this->altUserName, array(
- "email" => "alttest@example.com",
- "real_name" => "Test User Alt" ) );
- $this->altUser->load();
- }
-
- $this->anonUser = User::newFromId( 0 );
-
- $this->user = $this->userUser;
- }
- }
-
- function tearDown() {
- parent::tearDown();
- }
-
- function setUserPerm( $perm ) {
- // Setting member variables is evil!!!
-
- if ( is_array( $perm ) ) {
- $this->user->mRights = $perm;
- } else {
- $this->user->mRights = array( $perm );
- }
- }
-
- function setTitle( $ns, $title = "Main_Page" ) {
- $this->title = Title::makeTitle( $ns, $title );
- }
-
- function setUser( $userName = null ) {
- if ( $userName === 'anon' ) {
- $this->user = $this->anonUser;
- } elseif ( $userName === null || $userName === $this->userName ) {
- $this->user = $this->userUser;
- } else {
- $this->user = $this->altUser;
- }
-
- global $wgUser;
- $wgUser = $this->user;
- }
-
- function testQuickPermissions() {
- global $wgContLang;
- $prefix = $wgContLang->getFormattedNsText( NS_PROJECT );
-
- $this->setUser( 'anon' );
- $this->setTitle( NS_TALK );
- $this->setUserPerm( "createtalk" );
- $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
- $this->assertEquals( array(), $res );
-
- $this->setTitle( NS_TALK );
- $this->setUserPerm( "createpage" );
- $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
- $this->assertEquals( array( array( "nocreatetext" ) ), $res );
-
- $this->setTitle( NS_TALK );
- $this->setUserPerm( "" );
- $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
- $this->assertEquals( array( array( 'nocreatetext' ) ), $res );
-
- $this->setTitle( NS_MAIN );
- $this->setUserPerm( "createpage" );
- $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
- $this->assertEquals( array( ), $res );
-
- $this->setTitle( NS_MAIN );
- $this->setUserPerm( "createtalk" );
- $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
- $this->assertEquals( array( array( 'nocreatetext' ) ), $res );
-
- $this->setUser( $this->userName );
- $this->setTitle( NS_TALK );
- $this->setUserPerm( "createtalk" );
- $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
- $this->assertEquals( array( ), $res );
-
- $this->setTitle( NS_TALK );
- $this->setUserPerm( "createpage" );
- $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
- $this->assertEquals( array( array( 'nocreate-loggedin' ) ), $res );
-
- $this->setTitle( NS_TALK );
- $this->setUserPerm( "" );
- $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
- $this->assertEquals( array( array( 'nocreate-loggedin' ) ), $res );
-
- $this->setTitle( NS_MAIN );
- $this->setUserPerm( "createpage" );
- $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
- $this->assertEquals( array( ), $res );
-
- $this->setTitle( NS_MAIN );
- $this->setUserPerm( "createtalk" );
- $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
- $this->assertEquals( array( array( 'nocreate-loggedin' ) ), $res );
-
- $this->setTitle( NS_MAIN );
- $this->setUserPerm( "" );
- $res = $this->title->getUserPermissionsErrors( 'create', $this->user );
- $this->assertEquals( array( array( 'nocreate-loggedin' ) ), $res );
-
- $this->setUser( 'anon' );
- $this->setTitle( NS_USER, $this->userName . '' );
- $this->setUserPerm( "" );
- $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
- $this->assertEquals( array( array( 'cant-move-user-page' ), array( 'movenologintext' ) ), $res );
-
- $this->setTitle( NS_USER, $this->userName . '/subpage' );
- $this->setUserPerm( "" );
- $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
- $this->assertEquals( array( array( 'movenologintext' ) ), $res );
-
- $this->setTitle( NS_USER, $this->userName . '' );
- $this->setUserPerm( "move-rootuserpages" );
- $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
- $this->assertEquals( array( array( 'movenologintext' ) ), $res );
-
- $this->setTitle( NS_USER, $this->userName . '/subpage' );
- $this->setUserPerm( "move-rootuserpages" );
- $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
- $this->assertEquals( array( array( 'movenologintext' ) ), $res );
-
- $this->setTitle( NS_USER, $this->userName . '' );
- $this->setUserPerm( "" );
- $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
- $this->assertEquals( array( array( 'cant-move-user-page' ), array( 'movenologintext' ) ), $res );
-
- $this->setTitle( NS_USER, $this->userName . '/subpage' );
- $this->setUserPerm( "" );
- $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
- $this->assertEquals( array( array( 'movenologintext' ) ), $res );
-
- $this->setTitle( NS_USER, $this->userName . '' );
- $this->setUserPerm( "move-rootuserpages" );
- $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
- $this->assertEquals( array( array( 'movenologintext' ) ), $res );
-
- $this->setTitle( NS_USER, $this->userName . '/subpage' );
- $this->setUserPerm( "move-rootuserpages" );
- $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
- $this->assertEquals( array( array( 'movenologintext' ) ), $res );
-
- $this->setUser( $this->userName );
- $this->setTitle( NS_FILE, "img.png" );
- $this->setUserPerm( "" );
- $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
- $this->assertEquals( array( array( 'movenotallowedfile' ), array( 'movenotallowed' ) ), $res );
-
- $this->setTitle( NS_FILE, "img.png" );
- $this->setUserPerm( "movefile" );
- $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
- $this->assertEquals( array( array( 'movenotallowed' ) ), $res );
-
- $this->setUser( 'anon' );
- $this->setTitle( NS_FILE, "img.png" );
- $this->setUserPerm( "" );
- $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
- $this->assertEquals( array( array( 'movenotallowedfile' ), array( 'movenologintext' ) ), $res );
-
- $this->setTitle( NS_FILE, "img.png" );
- $this->setUserPerm( "movefile" );
- $res = $this->title->getUserPermissionsErrors( 'move', $this->user );
- $this->assertEquals( array( array( 'movenologintext' ) ), $res );
-
- $this->setUser( $this->userName );
- $this->setUserPerm( "move" );
- $this->runGroupPermissions( 'move', array( array( 'movenotallowedfile' ) ) );
-
- $this->setUserPerm( "" );
- $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->setTitle( NS_MAIN );
- $this->setUser( 'anon' );
- $this->setUserPerm( "move" );
- $this->runGroupPermissions( 'move', array( ) );
-
- $this->setUserPerm( "" );
- $this->runGroupPermissions( 'move', array( array( 'movenotallowed' ) ),
- array( array( 'movenologintext' ) ) );
-
- $this->setUser( $this->userName );
- $this->setUserPerm( "" );
- $this->runGroupPermissions( 'move', array( array( 'movenotallowed' ) ) );
-
- $this->setUserPerm( "move" );
- $this->runGroupPermissions( 'move', array( ) );
-
- $this->setUser( 'anon' );
- $this->setUserPerm( 'move' );
- $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
- $this->assertEquals( array( ), $res );
-
- $this->setUserPerm( '' );
- $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
- $this->assertEquals( array( array( 'movenotallowed' ) ), $res );
-
- $this->setTitle( NS_USER );
- $this->setUser( $this->userName );
- $this->setUserPerm( array( "move", "move-rootuserpages" ) );
- $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
- $this->assertEquals( array( ), $res );
-
- $this->setUserPerm( "move" );
- $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
- $this->assertEquals( array( array( 'cant-move-to-user-page' ) ), $res );
-
- $this->setUser( 'anon' );
- $this->setUserPerm( array( "move", "move-rootuserpages" ) );
- $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
- $this->assertEquals( array( ), $res );
-
- $this->setTitle( NS_USER, "User/subpage" );
- $this->setUserPerm( array( "move", "move-rootuserpages" ) );
- $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
- $this->assertEquals( array( ), $res );
-
- $this->setUserPerm( "move" );
- $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
- $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' ) ),
- array( array( 'badaccess-group0' ), array( 'protect-cantedit' ) ),
- array( array( 'protect-cantedit' ) ), false ),
- '' => array( array( ), array( ), array( ), true ) );
- global $wgUser;
- $wgUser = $this->user;
- foreach ( array( "edit", "protect", "" ) as $action ) {
- $this->setUserPerm( null );
- $this->assertEquals( $check[$action][0],
- $this->title->getUserPermissionsErrors( $action, $this->user, true ) );
-
- global $wgGroupPermissions;
- $old = $wgGroupPermissions;
- $wgGroupPermissions = array();
-
- $this->assertEquals( $check[$action][1],
- $this->title->getUserPermissionsErrors( $action, $this->user, true ) );
- $wgGroupPermissions = $old;
-
- $this->setUserPerm( $action );
- $this->assertEquals( $check[$action][2],
- $this->title->getUserPermissionsErrors( $action, $this->user, true ) );
-
- $this->setUserPerm( $action );
- $this->assertEquals( $check[$action][3],
- $this->title->userCan( $action, true ) );
- $this->assertEquals( $check[$action][3],
- $this->title->quickUserCan( $action ) );
-
- # count( User::getGroupsWithPermissions( $action ) ) < 1
- }
- }
-
- function runGroupPermissions( $action, $result, $result2 = null ) {
- global $wgGroupPermissions;
-
- if ( $result2 === null ) $result2 = $result;
-
- $wgGroupPermissions['autoconfirmed']['move'] = false;
- $wgGroupPermissions['user']['move'] = false;
- $res = $this->title->getUserPermissionsErrors( $action, $this->user );
- $this->assertEquals( $result, $res );
-
- $wgGroupPermissions['autoconfirmed']['move'] = true;
- $wgGroupPermissions['user']['move'] = false;
- $res = $this->title->getUserPermissionsErrors( $action, $this->user );
- $this->assertEquals( $result2, $res );
-
- $wgGroupPermissions['autoconfirmed']['move'] = true;
- $wgGroupPermissions['user']['move'] = true;
- $res = $this->title->getUserPermissionsErrors( $action, $this->user );
- $this->assertEquals( $result2, $res );
-
- $wgGroupPermissions['autoconfirmed']['move'] = false;
- $wgGroupPermissions['user']['move'] = true;
- $res = $this->title->getUserPermissionsErrors( $action, $this->user );
- $this->assertEquals( $result2, $res );
- }
-
- function testSpecialsAndNSPermissions() {
- $this->setUser( $this->userName );
- global $wgUser;
- $wgUser = $this->user;
-
- $this->setTitle( NS_SPECIAL );
-
- $this->assertEquals( array( array( 'badaccess-group0' ), array( 'ns-specialprotected' ) ),
- $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
- $this->assertEquals( array( array( 'badaccess-group0' ) ),
- $this->title->getUserPermissionsErrors( 'execute', $this->user ) );
-
- $this->setTitle( NS_MAIN );
- $this->setUserPerm( 'bogus' );
- $this->assertEquals( array( ),
- $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
-
- $this->setTitle( NS_MAIN );
- $this->setUserPerm( '' );
- $this->assertEquals( array( array( 'badaccess-group0' ) ),
- $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
-
- global $wgNamespaceProtection;
- $wgNamespaceProtection[NS_USER] = array ( 'bogus' );
- $this->setTitle( NS_USER );
- $this->setUserPerm( '' );
- $this->assertEquals( array( array( 'badaccess-group0' ), array( 'namespaceprotected', 'User' ) ),
- $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
-
- $this->setTitle( NS_MEDIAWIKI );
- $this->setUserPerm( 'bogus' );
- $this->assertEquals( array( array( 'protectedinterface' ) ),
- $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
-
- $this->setTitle( NS_MEDIAWIKI );
- $this->setUserPerm( 'bogus' );
- $this->assertEquals( array( array( 'protectedinterface' ) ),
- $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
-
- $wgNamespaceProtection = null;
- $this->setUserPerm( 'bogus' );
- $this->assertEquals( array( ),
- $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
- $this->assertEquals( true,
- $this->title->userCan( 'bogus' ) );
-
- $this->setUserPerm( '' );
- $this->assertEquals( array( array( 'badaccess-group0' ) ),
- $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
- $this->assertEquals( false,
- $this->title->userCan( 'bogus' ) );
- }
-
- function testCssAndJavascriptPermissions() {
- $this->setUser( $this->userName );
- global $wgUser;
- $wgUser = $this->user;
-
- $this->setTitle( NS_USER, $this->altUserName . '/test.js' );
- $this->runCSSandJSPermissions(
- array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
- array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
- array( array( 'badaccess-group0' ) ) );
-
- $this->setTitle( NS_USER, $this->altUserName . '/test.css' );
- $this->runCSSandJSPermissions(
- array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ),
- array( array( 'badaccess-group0' ) ),
- array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ) );
-
- $this->setTitle( NS_USER, $this->altUserName . '/tempo' );
- $this->runCSSandJSPermissions(
- array( array( 'badaccess-group0' ) ),
- array( array( 'badaccess-group0' ) ),
- array( array( 'badaccess-group0' ) ) );
- }
-
- function runCSSandJSPermissions( $result0, $result1, $result2 ) {
- $this->setUserPerm( '' );
- $this->assertEquals( $result0,
- $this->title->getUserPermissionsErrors( 'bogus',
- $this->user ) );
-
- $this->setUserPerm( 'editusercss' );
- $this->assertEquals( $result1,
- $this->title->getUserPermissionsErrors( 'bogus',
- $this->user ) );
-
- $this->setUserPerm( 'edituserjs' );
- $this->assertEquals( $result2,
- $this->title->getUserPermissionsErrors( 'bogus',
- $this->user ) );
-
- $this->setUserPerm( 'editusercssjs' );
- $this->assertEquals( array( array( 'badaccess-group0' ) ),
- $this->title->getUserPermissionsErrors( 'bogus',
- $this->user ) );
-
- $this->setUserPerm( array( 'edituserjs', 'editusercss' ) );
- $this->assertEquals( array( array( 'badaccess-group0' ) ),
- $this->title->getUserPermissionsErrors( 'bogus',
- $this->user ) );
- }
-
- function testPageRestrictions() {
- global $wgUser, $wgContLang;
-
- $prefix = $wgContLang->getFormattedNsText( NS_PROJECT );
-
- $wgUser = $this->user;
- $this->setTitle( NS_MAIN );
- $this->title->mRestrictionsLoaded = true;
- $this->setUserPerm( "edit" );
- $this->title->mRestrictions = array( "bogus" => array( 'bogus', "sysop", "protect", "" ) );
-
- $this->assertEquals( array( ),
- $this->title->getUserPermissionsErrors( 'edit',
- $this->user ) );
-
- $this->assertEquals( true,
- $this->title->quickUserCan( 'edit' ) );
- $this->title->mRestrictions = array( "edit" => array( 'bogus', "sysop", "protect", "" ),
- "bogus" => array( 'bogus', "sysop", "protect", "" ) );
-
- $this->assertEquals( array( array( 'badaccess-group0' ),
- array( 'protectedpagetext', 'bogus' ),
- array( 'protectedpagetext', 'protect' ),
- array( 'protectedpagetext', 'protect' ) ),
- $this->title->getUserPermissionsErrors( 'bogus',
- $this->user ) );
- $this->assertEquals( array( array( 'protectedpagetext', 'bogus' ),
- array( 'protectedpagetext', 'protect' ),
- array( 'protectedpagetext', 'protect' ) ),
- $this->title->getUserPermissionsErrors( 'edit',
- $this->user ) );
- $this->setUserPerm( "" );
- $this->assertEquals( array( array( 'badaccess-group0' ),
- array( 'protectedpagetext', 'bogus' ),
- array( 'protectedpagetext', 'protect' ),
- array( 'protectedpagetext', 'protect' ) ),
- $this->title->getUserPermissionsErrors( 'bogus',
- $this->user ) );
- $this->assertEquals( array( array( 'badaccess-groups', "*, [[$prefix:Users|Users]]", 2 ),
- array( 'protectedpagetext', 'bogus' ),
- array( 'protectedpagetext', 'protect' ),
- array( 'protectedpagetext', 'protect' ) ),
- $this->title->getUserPermissionsErrors( 'edit',
- $this->user ) );
- $this->setUserPerm( array( "edit", "editprotected" ) );
- $this->assertEquals( array( array( 'badaccess-group0' ),
- array( 'protectedpagetext', 'bogus' ),
- array( 'protectedpagetext', 'protect' ),
- array( 'protectedpagetext', 'protect' ) ),
- $this->title->getUserPermissionsErrors( 'bogus',
- $this->user ) );
- $this->assertEquals( array( ),
- $this->title->getUserPermissionsErrors( 'edit',
- $this->user ) );
- $this->title->mCascadeRestriction = true;
- $this->assertEquals( false,
- $this->title->quickUserCan( 'bogus' ) );
- $this->assertEquals( false,
- $this->title->quickUserCan( 'edit' ) );
- $this->assertEquals( array( array( 'badaccess-group0' ),
- array( 'protectedpagetext', 'bogus' ),
- array( 'protectedpagetext', 'protect' ),
- array( 'protectedpagetext', 'protect' ) ),
- $this->title->getUserPermissionsErrors( 'bogus',
- $this->user ) );
- $this->assertEquals( array( array( 'protectedpagetext', 'bogus' ),
- array( 'protectedpagetext', 'protect' ),
- array( 'protectedpagetext', 'protect' ) ),
- $this->title->getUserPermissionsErrors( 'edit',
- $this->user ) );
- }
-
- function testCascadingSourcesRestrictions() {
- global $wgUser;
- $wgUser = $this->user;
- $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->assertEquals( false,
- $this->title->userCan( 'bogus' ) );
- $this->assertEquals( array( array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ),
- array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ) ),
- $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
-
- $this->assertEquals( true,
- $this->title->userCan( 'edit' ) );
- $this->assertEquals( array( ),
- $this->title->getUserPermissionsErrors( 'edit', $this->user ) );
-
- }
-
- function testActionPermissions() {
- global $wgUser;
- $wgUser = $this->user;
-
- $this->setUserPerm( array( "createpage" ) );
- $this->setTitle( NS_MAIN, "test page" );
- $this->title->mTitleProtection['pt_create_perm'] = '';
- $this->title->mTitleProtection['pt_user'] = $this->user->getID();
- $this->title->mTitleProtection['pt_expiry'] = wfGetDB( DB_SLAVE )->getInfinity();
- $this->title->mTitleProtection['pt_reason'] = 'test';
- $this->title->mCascadeRestriction = false;
-
- $this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
- $this->title->getUserPermissionsErrors( 'create', $this->user ) );
- $this->assertEquals( false,
- $this->title->userCan( 'create' ) );
-
- $this->title->mTitleProtection['pt_create_perm'] = 'sysop';
- $this->setUserPerm( array( 'createpage', 'protect' ) );
- $this->assertEquals( array( ),
- $this->title->getUserPermissionsErrors( 'create', $this->user ) );
- $this->assertEquals( true,
- $this->title->userCan( 'create' ) );
-
-
- $this->setUserPerm( array( 'createpage' ) );
- $this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
- $this->title->getUserPermissionsErrors( 'create', $this->user ) );
- $this->assertEquals( false,
- $this->title->userCan( 'create' ) );
-
- $this->setTitle( NS_MEDIA, "test page" );
- $this->setUserPerm( array( "move" ) );
- $this->assertEquals( false,
- $this->title->userCan( 'move' ) );
- $this->assertEquals( array( array( 'immobile-source-namespace', 'Media' ) ),
- $this->title->getUserPermissionsErrors( 'move', $this->user ) );
-
- $this->setTitle( NS_MAIN, "test page" );
- $this->assertEquals( array( ),
- $this->title->getUserPermissionsErrors( 'move', $this->user ) );
- $this->assertEquals( true,
- $this->title->userCan( 'move' ) );
-
- $this->title->mInterwiki = "no";
- $this->assertEquals( array( array( 'immobile-source-page' ) ),
- $this->title->getUserPermissionsErrors( 'move', $this->user ) );
- $this->assertEquals( false,
- $this->title->userCan( 'move' ) );
-
- $this->setTitle( NS_MEDIA, "test page" );
- $this->assertEquals( false,
- $this->title->userCan( 'move-target' ) );
- $this->assertEquals( array( array( 'immobile-target-namespace', 'Media' ) ),
- $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
-
- $this->setTitle( NS_MAIN, "test page" );
- $this->assertEquals( array( ),
- $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
- $this->assertEquals( true,
- $this->title->userCan( 'move-target' ) );
-
- $this->title->mInterwiki = "no";
- $this->assertEquals( array( array( 'immobile-target-page' ) ),
- $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
- $this->assertEquals( false,
- $this->title->userCan( 'move-target' ) );
-
- }
-
- function testUserBlock() {
- global $wgUser, $wgEmailConfirmToEdit, $wgEmailAuthentication;
- $wgEmailConfirmToEdit = true;
- $wgEmailAuthentication = true;
- $wgUser = $this->user;
-
- $this->setUserPerm( array( "createpage", "move" ) );
- $this->setTitle( NS_MAIN, "test page" );
-
- # $short
- $this->assertEquals( array( array( 'confirmedittext' ) ),
- $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
- $wgEmailConfirmToEdit = false;
- $this->assertEquals( true, $this->title->userCan( 'move-target' ) );
-
- # $wgEmailConfirmToEdit && !$user->isEmailConfirmed() && $action != 'createaccount'
- $this->assertEquals( array( ),
- $this->title->getUserPermissionsErrors( 'move-target',
- $this->user ) );
-
- global $wgLang;
- $prev = time();
- $now = time() + 120;
- $this->user->mBlockedby = $this->user->getId();
- $this->user->mBlock = new Block( '127.0.8.1', 0, $this->user->getId(),
- 'no reason given', $prev + 3600, 1, 0 );
- $this->user->mBlock->mTimestamp = 0;
- $this->assertEquals( array( array( 'autoblockedtext',
- '[[User:Useruser|Useruser]]', 'no reason given', '127.0.0.1',
- 'Useruser', null, 'infinite', '127.0.8.1',
- $wgLang->timeanddate( wfTimestamp( TS_MW, $prev ), true ) ) ),
- $this->title->getUserPermissionsErrors( 'move-target',
- $this->user ) );
-
- $this->assertEquals( false, $this->title->userCan( 'move-target' ) );
- // quickUserCan should ignore user blocks
- $this->assertEquals( true, $this->title->quickUserCan( 'move-target' ) );
-
- global $wgLocalTZoffset;
- $wgLocalTZoffset = -60;
- $this->user->mBlockedby = $this->user->getName();
- $this->user->mBlock = new Block( '127.0.8.1', 0, 1, 'no reason given', $now, 0, 10 );
- $this->assertEquals( array( array( 'blockedtext',
- '[[User:Useruser|Useruser]]', 'no reason given', '127.0.0.1',
- 'Useruser', null, '23:00, 31 December 1969', '127.0.8.1',
- $wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ) ),
- $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
-
- # $action != 'read' && $action != 'createaccount' && $user->isBlockedFrom( $this )
- # $user->blockedFor() == ''
- # $user->mBlock->mExpiry == 'infinity'
- }
-}
diff --git a/tests/phpunit/includes/TitleTest.php b/tests/phpunit/includes/TitleTest.php
deleted file mode 100644
index f61652df..00000000
--- a/tests/phpunit/includes/TitleTest.php
+++ /dev/null
@@ -1,155 +0,0 @@
-<?php
-
-class TitleTest extends MediaWikiTestCase {
-
- function testLegalChars() {
- $titlechars = Title::legalChars();
-
- 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" );
- } else {
- $this->assertTrue( (bool)preg_match( "/[$titlechars]/", $chr ), "chr($num) = $chr is a valid titlechar" );
- }
- }
- }
-
- /**
- * @dataProvider dataBug31100
- */
- function testBug31100FixSpecialName( $text, $expectedParam ) {
- $title = Title::newFromText( $text );
- $fixed = $title->fixSpecialName();
- $stuff = explode( '/', $fixed->getDbKey(), 2 );
- if ( count( $stuff ) == 2 ) {
- $par = $stuff[1];
- } else {
- $par = null;
- }
- $this->assertEquals( $expectedParam, $par, "Bug 31100 regression check: Title->fixSpecialName() should preserve parameter" );
- }
-
- function dataBug31100() {
- return array(
- array( 'Special:Version', null ),
- array( 'Special:Version/', '' ),
- array( 'Special:Version/param', 'param' ),
- );
- }
-
- /**
- * Auth-less test of Title::isValidMoveOperation
- *
- * @group Database
- * @param string $source
- * @param string $target
- * @param array|string|true $expected Required error
- * @dataProvider dataTestIsValidMoveOperation
- */
- function testIsValidMoveOperation( $source, $target, $expected ) {
- $title = Title::newFromText( $source );
- $nt = Title::newFromText( $target );
- $errors = $title->isValidMoveOperation( $nt, false );
- if ( $expected === true ) {
- $this->assertTrue( $errors );
- } else {
- $errors = $this->flattenErrorsArray( $errors );
- foreach ( (array)$expected as $error ) {
- $this->assertContains( $error, $errors );
- }
- }
- }
-
- function flattenErrorsArray( $errors ) {
- $result = array();
- foreach ( $errors as $error ) {
- $result[] = $error[0];
- }
- return $result;
- }
-
- function dataTestIsValidMoveOperation() {
- return array(
- array( 'Test', 'Test', 'selfmove' ),
- array( 'File:Test.jpg', 'Page', 'imagenocrossnamespace' )
- );
- }
-
-
- /**
- * @dataProvider provideCasesForGetpageviewlanguage
- */
- function testGetpageviewlanguage( $expected, $titleText, $contLang, $lang, $variant, $msg='' ) {
- // Save globals
- global $wgContLang, $wgLang, $wgAllowUserJs, $wgLanguageCode, $wgDefaultLanguageVariant;
- $save['wgContLang'] = $wgContLang;
- $save['wgLang'] = $wgLang;
- $save['wgAllowUserJs'] = $wgAllowUserJs;
- $save['wgLanguageCode'] = $wgLanguageCode;
- $save['wgDefaultLanguageVariant'] = $wgDefaultLanguageVariant;
-
- // Setup test environnement:
- $wgContLang = Language::factory( $contLang );
- $wgLang = Language::factory( $lang );
- # To test out .js titles:
- $wgAllowUserJs = true;
- $wgLanguageCode = $contLang;
- $wgDefaultLanguageVariant = $variant;
-
- $title = Title::newFromText( $titleText );
- $this->assertInstanceOf( 'Title', $title,
- "Test must be passed a valid title text, you gave '$titleText'"
- );
- $this->assertEquals( $expected,
- $title->getPageViewLanguage()->getCode(),
- $msg
- );
-
- // Restore globals
- $wgContLang = $save['wgContLang'];
- $wgLang = $save['wgLang'];
- $wgAllowUserJs = $save['wgAllowUserJs'];
- $wgLanguageCode = $save['wgLanguageCode'];
- $wgDefaultLanguageVariant = $save['wgDefaultLanguageVariant'];
- }
-
- function provideCasesForGetpageviewlanguage() {
- # Format:
- # - expected
- # - Title name
- # - wgContLang (expected in most case)
- # - wgLang (on some specific pages)
- # - wgDefaultLanguageVariant
- # - Optional message
- return array(
- array( 'fr', 'Main_page', 'fr', 'fr', false ),
- array( 'es', 'Main_page', 'es', 'zh-tw', false ),
- array( 'zh', 'Main_page', 'zh', 'zh-tw', false ),
-
- array( 'es', 'Main_page', 'es', 'zh-tw', 'zh-cn' ),
- array( 'es', 'MediaWiki:About', 'es', 'zh-tw', 'zh-cn' ),
- array( 'es', 'MediaWiki:About/', 'es', 'zh-tw', 'zh-cn' ),
- array( 'de', 'MediaWiki:About/de', 'es', 'zh-tw', 'zh-cn' ),
- array( 'en', 'MediaWiki:Common.js', 'es', 'zh-tw', 'zh-cn' ),
- array( 'en', 'MediaWiki:Common.css', 'es', 'zh-tw', 'zh-cn' ),
- array( 'en', 'User:JohnDoe/Common.js', 'es', 'zh-tw', 'zh-cn' ),
- array( 'en', 'User:JohnDoe/Monobook.css', 'es', 'zh-tw', 'zh-cn' ),
-
- array( 'zh-cn', 'Main_page', 'zh', 'zh-tw', 'zh-cn' ),
- array( 'zh', 'MediaWiki:About', 'zh', 'zh-tw', 'zh-cn' ),
- array( 'zh', 'MediaWiki:About/', 'zh', 'zh-tw', 'zh-cn' ),
- array( 'de', 'MediaWiki:About/de', 'zh', 'zh-tw', 'zh-cn' ),
- array( 'zh-cn', 'MediaWiki:About/zh-cn', 'zh', 'zh-tw', 'zh-cn' ),
- array( 'zh-tw', 'MediaWiki:About/zh-tw', 'zh', 'zh-tw', 'zh-cn' ),
- array( 'en', 'MediaWiki:Common.js', 'zh', 'zh-tw', 'zh-cn' ),
- array( 'en', 'MediaWiki:Common.css', 'zh', 'zh-tw', 'zh-cn' ),
- array( 'en', 'User:JohnDoe/Common.js', 'zh', 'zh-tw', 'zh-cn' ),
- array( 'en', 'User:JohnDoe/Monobook.css', 'zh', 'zh-tw', 'zh-cn' ),
-
- array( 'zh-tw', 'Special:NewPages', 'es', 'zh-tw', 'zh-cn' ),
- array( 'zh-tw', 'Special:NewPages', 'zh', 'zh-tw', 'zh-cn' ),
-
- );
- }
-}
diff --git a/tests/phpunit/includes/UserTest.php b/tests/phpunit/includes/UserTest.php
deleted file mode 100644
index 7a424aef..00000000
--- a/tests/phpunit/includes/UserTest.php
+++ /dev/null
@@ -1,171 +0,0 @@
-<?php
-
-define( 'NS_UNITTEST', 5600 );
-define( 'NS_UNITTEST_TALK', 5601 );
-
-/**
- * @group Database
- */
-class UserTest extends MediaWikiTestCase {
- protected $savedGroupPermissions, $savedRevokedPermissions;
-
- /**
- * @var User
- */
- protected $user;
-
- public function setUp() {
- parent::setUp();
-
- $this->savedGroupPermissions = $GLOBALS['wgGroupPermissions'];
- $this->savedRevokedPermissions = $GLOBALS['wgRevokePermissions'];
-
- $this->setUpPermissionGlobals();
- $this->setUpUser();
- }
- private function setUpPermissionGlobals() {
- global $wgGroupPermissions, $wgRevokePermissions;
-
- # Data for regular $wgGroupPermissions test
- $wgGroupPermissions['unittesters'] = array(
- 'test' => true,
- 'runtest' => true,
- 'writetest' => false,
- 'nukeworld' => false,
- );
- $wgGroupPermissions['testwriters'] = array(
- 'test' => true,
- 'writetest' => true,
- 'modifytest' => true,
- );
- # Data for regular $wgRevokePermissions test
- $wgRevokePermissions['formertesters'] = array(
- 'runtest' => true,
- );
- }
- private function setUpUser() {
- $this->user = new User;
- $this->user->addGroup( 'unittesters' );
- }
-
- public function tearDown() {
- parent::tearDown();
-
- $GLOBALS['wgGroupPermissions'] = $this->savedGroupPermissions;
- $GLOBALS['wgRevokePermissions'] = $this->savedRevokedPermissions;
- }
-
- public function testGroupPermissions() {
- $rights = User::getGroupPermissions( array( 'unittesters' ) );
- $this->assertContains( 'runtest', $rights );
- $this->assertNotContains( 'writetest', $rights );
- $this->assertNotContains( 'modifytest', $rights );
- $this->assertNotContains( 'nukeworld', $rights );
-
- $rights = User::getGroupPermissions( array( 'unittesters', 'testwriters' ) );
- $this->assertContains( 'runtest', $rights );
- $this->assertContains( 'writetest', $rights );
- $this->assertContains( 'modifytest', $rights );
- $this->assertNotContains( 'nukeworld', $rights );
- }
- public function testRevokePermissions() {
- $rights = User::getGroupPermissions( array( 'unittesters', 'formertesters' ) );
- $this->assertNotContains( 'runtest', $rights );
- $this->assertNotContains( 'writetest', $rights );
- $this->assertNotContains( 'modifytest', $rights );
- $this->assertNotContains( 'nukeworld', $rights );
- }
-
- public function testUserPermissions() {
- $rights = $this->user->getRights();
- $this->assertContains( 'runtest', $rights );
- $this->assertNotContains( 'writetest', $rights );
- $this->assertNotContains( 'modifytest', $rights );
- $this->assertNotContains( 'nukeworld', $rights );
- }
-
- /**
- * @dataProvider provideGetGroupsWithPermission
- */
- public function testGetGroupsWithPermission( $expected, $right ) {
- $result = User::getGroupsWithPermission( $right );
- sort( $result );
- sort( $expected );
-
- $this->assertEquals( $expected, $result, "Groups with permission $right" );
- }
-
- public function provideGetGroupsWithPermission() {
- return array(
- array(
- array( 'unittesters', 'testwriters' ),
- 'test'
- ),
- array(
- array( 'unittesters' ),
- 'runtest'
- ),
- array(
- array( 'testwriters' ),
- 'writetest'
- ),
- array(
- array( 'testwriters' ),
- 'modifytest'
- ),
- );
- }
-
- /**
- * @dataProvider provideUserNames
- */
- public function testIsValidUserName( $username, $result, $message ) {
- $this->assertEquals( $this->user->isValidUserName( $username ), $result, $message );
- }
-
- public function provideUserNames() {
- return array(
- array( '', false, 'Empty string' ),
- array( ' ', false, 'Blank space' ),
- array( 'abcd', false, 'Starts with small letter' ),
- array( 'Ab/cd', false, 'Contains slash' ),
- array( 'Ab cd' , true, 'Whitespace' ),
- array( '192.168.1.1', false, 'IP' ),
- array( 'User:Abcd', false, 'Reserved Namespace' ),
- array( '12abcd232' , true , 'Starts with Numbers' ),
- array( '?abcd' , true, 'Start with ? mark' ),
- array( '#abcd', false, 'Start with #' ),
- array( 'Abcdà´•à´–à´—à´˜', true, ' Mixed scripts' ),
- array( 'ജോസàµâ€Œà´¤àµ‹à´®à´¸àµ', false, 'ZWNJ- Format control character' ),
- array( 'Ab cd', false, ' Ideographic space' ),
- );
- }
-
- /**
- * Test, if for all rights a right- message exist,
- * which is used on Special:ListGroupRights as help text
- * Extensions and core
- */
- public function testAllRightsWithMessage() {
- //Getting all user rights, for core: User::$mCoreRights, for extensions: $wgAvailableRights
- $allRights = User::getAllRights();
- $allMessageKeys = Language::getMessageKeysFor( 'en' );
-
- $rightsWithMessage = array();
- foreach ( $allMessageKeys as $message ) {
- // === 0: must be at beginning of string (position 0)
- if ( strpos( $message, 'right-' ) === 0 ) {
- $rightsWithMessage[] = substr( $message, strlen( 'right-' ) );
- }
- }
-
- sort( $allRights );
- sort( $rightsWithMessage );
-
- $this->assertEquals(
- $allRights,
- $rightsWithMessage,
- 'Each user rights (core/extensions) has a corresponding right- message.'
- );
- }
-}
diff --git a/tests/phpunit/includes/WebRequestTest.php b/tests/phpunit/includes/WebRequestTest.php
deleted file mode 100644
index 1fc0b4b3..00000000
--- a/tests/phpunit/includes/WebRequestTest.php
+++ /dev/null
@@ -1,216 +0,0 @@
-<?php
-
-class WebRequestTest extends MediaWikiTestCase {
- static $oldServer;
-
- function setUp() {
- self::$oldServer = $_SERVER;
- }
-
- function tearDown() {
- $_SERVER = self::$oldServer;
- }
-
- /**
- * @dataProvider provideDetectServer
- */
- function testDetectServer( $expected, $input, $description ) {
- $_SERVER = $input;
- $result = WebRequest::detectServer();
- $this->assertEquals( $expected, $result, $description );
- }
-
- function provideDetectServer() {
- return array(
- array(
- 'http://x',
- array(
- 'HTTP_HOST' => 'x'
- ),
- 'Host header'
- ),
- array(
- 'https://x',
- array(
- 'HTTP_HOST' => 'x',
- 'HTTPS' => 'on',
- ),
- 'Host header with secure'
- ),
- array(
- 'http://x',
- array(
- 'HTTP_HOST' => 'x',
- 'SERVER_PORT' => 80,
- ),
- 'Default SERVER_PORT',
- ),
- array(
- 'http://x',
- array(
- 'HTTP_HOST' => 'x',
- 'HTTPS' => 'off',
- ),
- 'Secure off'
- ),
- array(
- 'http://y',
- array(
- 'SERVER_NAME' => 'y',
- ),
- 'Server name'
- ),
- array(
- 'http://x',
- array(
- 'HTTP_HOST' => 'x',
- 'SERVER_NAME' => 'y',
- ),
- 'Host server name precedence'
- ),
- array(
- 'http://[::1]:81',
- array(
- 'HTTP_HOST' => '[::1]',
- 'SERVER_NAME' => '::1',
- 'SERVER_PORT' => '81',
- ),
- 'Apache bug 26005'
- ),
- array(
- 'http://localhost',
- array(
- 'SERVER_NAME' => '[2001'
- ),
- 'Kind of like lighttpd per commit message in MW r83847',
- ),
- array(
- 'http://[2a01:e35:2eb4:1::2]:777',
- array(
- 'SERVER_NAME' => '[2a01:e35:2eb4:1::2]:777'
- ),
- 'Possible lighttpd environment per bug 14977 comment 13',
- ),
- );
- }
-
- /**
- * @dataProvider provideGetIP
- */
- function testGetIP( $expected, $input, $squid, $private, $description ) {
- global $wgSquidServersNoPurge, $wgUsePrivateIPs;
- $_SERVER = $input;
- $wgSquidServersNoPurge = $squid;
- $wgUsePrivateIPs = $private;
- $request = new WebRequest();
- $result = $request->getIP();
- $this->assertEquals( $expected, $result, $description );
- }
-
- function provideGetIP() {
- return array(
- array(
- '127.0.0.1',
- array(
- 'REMOTE_ADDR' => '127.0.0.1'
- ),
- array(),
- false,
- 'Simple IPv4'
- ),
- array(
- '::1',
- array(
- 'REMOTE_ADDR' => '::1'
- ),
- array(),
- false,
- 'Simple IPv6'
- ),
- array(
- '12.0.0.3',
- array(
- 'REMOTE_ADDR' => '12.0.0.1',
- 'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
- ),
- array( '12.0.0.1', '12.0.0.2' ),
- false,
- 'With X-Forwaded-For'
- ),
- array(
- '12.0.0.1',
- array(
- 'REMOTE_ADDR' => '12.0.0.1',
- 'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
- ),
- array(),
- false,
- 'With X-Forwaded-For and disallowed server'
- ),
- array(
- '12.0.0.2',
- array(
- 'REMOTE_ADDR' => '12.0.0.1',
- 'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
- ),
- array( '12.0.0.1' ),
- false,
- 'With multiple X-Forwaded-For and only one allowed server'
- ),
- array(
- '12.0.0.2',
- array(
- 'REMOTE_ADDR' => '12.0.0.2',
- 'HTTP_X_FORWARDED_FOR' => '10.0.0.3, 12.0.0.2'
- ),
- array( '12.0.0.1', '12.0.0.2' ),
- false,
- 'With X-Forwaded-For and private IP'
- ),
- array(
- '10.0.0.3',
- array(
- 'REMOTE_ADDR' => '12.0.0.2',
- 'HTTP_X_FORWARDED_FOR' => '10.0.0.3, 12.0.0.2'
- ),
- array( '12.0.0.1', '12.0.0.2' ),
- true,
- 'With X-Forwaded-For and private IP (allowed)'
- ),
- );
- }
-
- /**
- * @expectedException MWException
- */
- function testGetIpLackOfRemoteAddrThrowAnException() {
- $request = new WebRequest();
- # Next call throw an exception about lacking an IP
- $request->getIP();
- }
-
- function languageProvider() {
- return array(
- 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( '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' ),
- );
- }
-
- /**
- * @dataProvider languageProvider
- */
- function testAcceptLang($acceptLanguageHeader, $expectedLanguages, $description) {
- $_SERVER = array( 'HTTP_ACCEPT_LANGUAGE' => $acceptLanguageHeader );
- $request = new WebRequest();
- $this->assertSame( $request->getAcceptLang(), $expectedLanguages, $description);
- }
-}
diff --git a/tests/phpunit/includes/WikiPageTest.php b/tests/phpunit/includes/WikiPageTest.php
deleted file mode 100644
index 0e1e1ce8..00000000
--- a/tests/phpunit/includes/WikiPageTest.php
+++ /dev/null
@@ -1,784 +0,0 @@
-<?php
-/**
-* @group Database
-* ^--- important, causes temporary tables to be used instead of the real database
-* @group medium
-**/
-
-class WikiPageTest extends MediaWikiLangTestCase {
-
- var $pages_to_delete;
-
- function __construct( $name = null, array $data = array(), $dataName = '' ) {
- parent::__construct( $name, $data, $dataName );
-
- $this->tablesUsed = array_merge ( $this->tablesUsed,
- array( 'page',
- 'revision',
- 'text',
-
- 'recentchanges',
- 'logging',
-
- 'page_props',
- 'pagelinks',
- 'categorylinks',
- 'langlinks',
- 'externallinks',
- 'imagelinks',
- 'templatelinks',
- 'iwlinks' ) );
- }
-
- public function setUp() {
- parent::setUp();
- $this->pages_to_delete = array();
- }
-
- public function tearDown() {
- foreach ( $this->pages_to_delete as $p ) {
- /* @var $p WikiPage */
-
- try {
- if ( $p->exists() ) {
- $p->doDeleteArticle( "testing done." );
- }
- } catch ( MWException $ex ) {
- // fail silently
- }
- }
- parent::tearDown();
- }
-
- protected function newPage( $title ) {
- if ( is_string( $title ) ) $title = Title::newFromText( $title );
-
- $p = new WikiPage( $title );
-
- $this->pages_to_delete[] = $p;
-
- return $p;
- }
-
- protected function createPage( $page, $text, $model = null ) {
- if ( is_string( $page ) ) $page = Title::newFromText( $page );
- if ( $page instanceof Title ) $page = $this->newPage( $page );
-
- $page->doEdit( $text, "testing", EDIT_NEW );
-
- return $page;
- }
-
- public function testDoEdit() {
- $title = Title::newFromText( "WikiPageTest_testDoEdit" );
-
- $page = $this->newPage( $title );
-
- $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
- . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
-
- $page->doEdit( $text, "testing 1" );
-
- $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
- $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
-
- $id = $page->getId();
-
- # ------------------------
- $page = new WikiPage( $title );
-
- $retrieved = $page->getText();
- $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
-
- # ------------------------
- $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
- . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
-
- $page->doEdit( $text, "testing 2" );
-
- # ------------------------
- $page = new WikiPage( $title );
-
- $retrieved = $page->getText();
- $this->assertEquals( $text, $retrieved, 'retrieved text doesn\'t equal original' );
-
- # ------------------------
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
- $n = $res->numRows();
- $res->free();
-
- $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
- }
-
- public function testDoQuickEdit() {
- global $wgUser;
-
- $page = $this->createPage( "WikiPageTest_testDoQuickEdit", "original text" );
-
- $text = "quick text";
- $page->doQuickEdit( $text, $wgUser, "testing q" );
-
- # ---------------------
- $page = new WikiPage( $page->getTitle() );
- $this->assertEquals( $text, $page->getText() );
- }
-
- public function testDoDeleteArticle() {
- $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo" );
- $id = $page->getId();
-
- $page->doDeleteArticle( "testing deletion" );
-
- $this->assertFalse( $page->exists(), "WikiPage::exists should return false 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" );
-
- # ------------------------
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
- $n = $res->numRows();
- $res->free();
-
- $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
- }
-
- public function testDoDeleteUpdates() {
- $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo" );
- $id = $page->getId();
-
- $page->doDeleteUpdates( $id );
-
- # ------------------------
- $dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
- $n = $res->numRows();
- $res->free();
-
- $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
- }
-
- public function testGetRevision() {
- $page = $this->newPage( "WikiPageTest_testGetRevision" );
-
- $rev = $page->getRevision();
- $this->assertNull( $rev );
-
- # -----------------
- $this->createPage( $page, "some text" );
-
- $rev = $page->getRevision();
-
- $this->assertEquals( $page->getLatest(), $rev->getId() );
- $this->assertEquals( "some text", $rev->getText() );
- }
-
- public function testGetText() {
- $page = $this->newPage( "WikiPageTest_testGetText" );
-
- $text = $page->getText();
- $this->assertFalse( $text );
-
- # -----------------
- $this->createPage( $page, "some text" );
-
- $text = $page->getText();
- $this->assertEquals( "some text", $text );
- }
-
- public function testGetRawText() {
- $page = $this->newPage( "WikiPageTest_testGetRawText" );
-
- $text = $page->getRawText();
- $this->assertFalse( $text );
-
- # -----------------
- $this->createPage( $page, "some text" );
-
- $text = $page->getRawText();
- $this->assertEquals( "some text", $text );
- }
-
-
- public function testExists() {
- $page = $this->newPage( "WikiPageTest_testExists" );
- $this->assertFalse( $page->exists() );
-
- # -----------------
- $this->createPage( $page, "some text" );
- $this->assertTrue( $page->exists() );
-
- $page = new WikiPage( $page->getTitle() );
- $this->assertTrue( $page->exists() );
-
- # -----------------
- $page->doDeleteArticle( "done testing" );
- $this->assertFalse( $page->exists() );
-
- $page = new WikiPage( $page->getTitle() );
- $this->assertFalse( $page->exists() );
- }
-
- public function dataHasViewableContent() {
- return array(
- array( 'WikiPageTest_testHasViewableContent', false, true ),
- array( 'Special:WikiPageTest_testHasViewableContent', false ),
- array( 'MediaWiki:WikiPageTest_testHasViewableContent', false ),
- array( 'Special:Userlogin', true ),
- array( 'MediaWiki:help', true ),
- );
- }
-
- /**
- * @dataProvider dataHasViewableContent
- */
- public function testHasViewableContent( $title, $viewable, $create = false ) {
- $page = $this->newPage( $title );
- $this->assertEquals( $viewable, $page->hasViewableContent() );
-
- if ( $create ) {
- $this->createPage( $page, "some text" );
- $this->assertTrue( $page->hasViewableContent() );
-
- $page = new WikiPage( $page->getTitle() );
- $this->assertTrue( $page->hasViewableContent() );
- }
- }
-
- public function dataGetRedirectTarget() {
- return array(
- array( 'WikiPageTest_testGetRedirectTarget_1', "hello world", null ),
- array( 'WikiPageTest_testGetRedirectTarget_2', "#REDIRECT [[hello world]]", "Hello world" ),
- );
- }
-
- /**
- * @dataProvider dataGetRedirectTarget
- */
- public function testGetRedirectTarget( $title, $text, $target ) {
- $page = $this->createPage( $title, $text );
-
- # now, test the actual redirect
- $t = $page->getRedirectTarget();
- $this->assertEquals( $target, is_null( $t ) ? null : $t->getPrefixedText() );
- }
-
- /**
- * @dataProvider dataGetRedirectTarget
- */
- public function testIsRedirect( $title, $text, $target ) {
- $page = $this->createPage( $title, $text );
- $this->assertEquals( !is_null( $target ), $page->isRedirect() );
- }
-
- public function dataIsCountable() {
- return array(
-
- // any
- array( 'WikiPageTest_testIsCountable',
- '',
- 'any',
- true
- ),
- array( 'WikiPageTest_testIsCountable',
- 'Foo',
- 'any',
- true
- ),
-
- // comma
- array( 'WikiPageTest_testIsCountable',
- 'Foo',
- 'comma',
- false
- ),
- array( 'WikiPageTest_testIsCountable',
- 'Foo, bar',
- 'comma',
- true
- ),
-
- // link
- array( 'WikiPageTest_testIsCountable',
- 'Foo',
- 'link',
- false
- ),
- array( 'WikiPageTest_testIsCountable',
- 'Foo [[bar]]',
- 'link',
- true
- ),
-
- // redirects
- array( 'WikiPageTest_testIsCountable',
- '#REDIRECT [[bar]]',
- 'any',
- false
- ),
- array( 'WikiPageTest_testIsCountable',
- '#REDIRECT [[bar]]',
- 'comma',
- false
- ),
- array( 'WikiPageTest_testIsCountable',
- '#REDIRECT [[bar]]',
- 'link',
- false
- ),
-
- // not a content namespace
- array( 'Talk:WikiPageTest_testIsCountable',
- 'Foo',
- 'any',
- false
- ),
- array( 'Talk:WikiPageTest_testIsCountable',
- 'Foo, bar',
- 'comma',
- false
- ),
- array( 'Talk:WikiPageTest_testIsCountable',
- 'Foo [[bar]]',
- 'link',
- false
- ),
-
- // not a content namespace, different model
- array( 'MediaWiki:WikiPageTest_testIsCountable.js',
- 'Foo',
- 'any',
- false
- ),
- array( 'MediaWiki:WikiPageTest_testIsCountable.js',
- 'Foo, bar',
- 'comma',
- false
- ),
- array( 'MediaWiki:WikiPageTest_testIsCountable.js',
- 'Foo [[bar]]',
- 'link',
- false
- ),
- );
- }
-
-
- /**
- * @dataProvider dataIsCountable
- */
- public function testIsCountable( $title, $text, $mode, $expected ) {
- global $wgArticleCountMethod;
-
- $old = $wgArticleCountMethod;
- $wgArticleCountMethod = $mode;
-
- $page = $this->createPage( $title, $text );
- $editInfo = $page->prepareTextForEdit( $page->getText() );
-
- $v = $page->isCountable();
- $w = $page->isCountable( $editInfo );
- $wgArticleCountMethod = $old;
-
- $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\"" );
- }
-
- public function dataGetParserOutput() {
- return array(
- array("hello ''world''\n", "<p>hello <i>world</i></p>"),
- // @todo: more...?
- );
- }
-
- /**
- * @dataProvider dataGetParserOutput
- */
- public function testGetParserOutput( $text, $expectedHtml ) {
- $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text );
-
- $opt = new ParserOptions();
- $po = $page->getParserOutput( $opt );
- $text = $po->getText();
-
- $text = trim( preg_replace( '/<!--.*?-->/sm', '', $text ) ); # strip injected comments
- $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
-
- $this->assertEquals( $expectedHtml, $text );
- return $po;
- }
-
- static $sections =
-
- "Intro
-
-== stuff ==
-hello world
-
-== test ==
-just a test
-
-== foo ==
-more stuff
-";
-
-
- public function dataReplaceSection() {
- return array(
- array( 'WikiPageTest_testReplaceSection',
- WikiPageTest::$sections,
- "0",
- "No more",
- null,
- trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest::$sections ) )
- ),
- array( 'WikiPageTest_testReplaceSection',
- WikiPageTest::$sections,
- "",
- "No more",
- null,
- "No more"
- ),
- array( 'WikiPageTest_testReplaceSection',
- WikiPageTest::$sections,
- "2",
- "== TEST ==\nmore fun",
- null,
- trim( preg_replace( '/^== test ==.*== foo ==/sm', "== TEST ==\nmore fun\n\n== foo ==", WikiPageTest::$sections ) )
- ),
- array( 'WikiPageTest_testReplaceSection',
- WikiPageTest::$sections,
- "8",
- "No more",
- null,
- trim( WikiPageTest::$sections )
- ),
- array( 'WikiPageTest_testReplaceSection',
- WikiPageTest::$sections,
- "new",
- "No more",
- "New",
- trim( WikiPageTest::$sections ) . "\n\n== New ==\n\nNo more"
- ),
- );
- }
-
- /**
- * @dataProvider dataReplaceSection
- */
- public function testReplaceSection( $title, $text, $section, $with, $sectionTitle, $expected ) {
- $page = $this->createPage( $title, $text );
- $text = $page->replaceSection( $section, $with, $sectionTitle );
- $text = trim( $text );
-
- $this->assertEquals( $expected, $text );
- }
-
- /* @todo FIXME: fix this!
- public function testGetUndoText() {
- global $wgDiff3;
-
- wfSuppressWarnings();
- $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
- wfRestoreWarnings();
-
- if( !$haveDiff3 ) {
- $this->markTestSkipped( "diff3 not installed or not found" );
- return;
- }
-
- $text = "one";
- $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
- $rev1 = $page->getRevision();
-
- $text .= "\n\ntwo";
- $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");
- $rev3 = $page->getRevision();
-
- $text .= "\n\nfour";
- $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");
- $rev5 = $page->getRevision();
-
- $text .= "\n\nsix";
- $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section six");
- $rev6 = $page->getRevision();
-
- $undo6 = $page->getUndoText( $rev6 );
- if ( $undo6 === false ) $this->fail( "getUndoText failed for rev6" );
- $this->assertEquals( "one\n\ntwo\n\nthree\n\nfour\n\nfive", $undo6 );
-
- $undo3 = $page->getUndoText( $rev4, $rev2 );
- if ( $undo3 === false ) $this->fail( "getUndoText failed for rev4..rev2" );
- $this->assertEquals( "one\n\ntwo\n\nfive", $undo3 );
-
- $undo2 = $page->getUndoText( $rev2 );
- if ( $undo2 === false ) $this->fail( "getUndoText failed for rev2" );
- $this->assertEquals( "one\n\nfive", $undo2 );
- }
- */
-
- /**
- * @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();
- $admin->setName("Admin");
-
- $text = "one";
- $page = $this->newPage( "WikiPageTest_testDoRollback" );
- $page->doEdit( $text, "section one", EDIT_NEW, false, $admin );
-
- $user1 = new User();
- $user1->setName( "127.0.1.11" );
- $text .= "\n\ntwo";
- $page = new WikiPage( $page->getTitle() );
- $page->doEdit( $text, "adding section two", 0, false, $user1 );
-
- $user2 = new User();
- $user2->setName( "127.0.2.13" );
- $text .= "\n\nthree";
- $page = new WikiPage( $page->getTitle() );
- $page->doEdit( $text, "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.
- $dbr = wfGetDB( DB_SLAVE );
- $this->assertEquals( 3, Revision::countByPageId( $dbr, $page->getId() ) );
-
- $page = new WikiPage( $page->getTitle() );
- $rev3 = $page->getRevision();
- $this->assertEquals( '127.0.2.13', $rev3->getUserText() );
-
- $rev2 = $rev3->getPrevious();
- $this->assertEquals( '127.0.1.11', $rev2->getUserText() );
-
- $rev1 = $rev2->getPrevious();
- $this->assertEquals( 'Admin', $rev1->getUserText() );
-
- # 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 );
-
- if ( $errors ) {
- $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
- }
-
- $page = new WikiPage( $page->getTitle() );
- $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(), "rollback did not revert to the correct revision" );
- $this->assertEquals( "one\n\ntwo", $page->getText() );
- }
-
- /**
- * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
- */
- public function testDoRollback() {
- $admin = new User();
- $admin->setName("Admin");
-
- $text = "one";
- $page = $this->newPage( "WikiPageTest_testDoRollback" );
- $page->doEdit( $text, "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->doEdit( $text, "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 );
-
- if ( $errors ) {
- $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
- }
-
- $page = new WikiPage( $page->getTitle() );
- $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(), "rollback did not revert to the correct revision" );
- $this->assertEquals( "one", $page->getText() );
- }
-
- public function dataGetAutosummary( ) {
- return array(
- array(
- 'Hello there, world!',
- '#REDIRECT [[Foo]]',
- 0,
- '/^Redirected page .*Foo/'
- ),
-
- array(
- null,
- 'Hello world!',
- EDIT_NEW,
- '/^Created page .*Hello/'
- ),
-
- array(
- 'Hello there, world!',
- '',
- 0,
- '/^Blanked/'
- ),
-
- 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.',
- 'Hello world!',
- 0,
- '/^Replaced .*Hello/'
- ),
-
- array(
- 'foo',
- 'bar',
- 0,
- '/^$/'
- ),
- );
- }
-
- /**
- * @dataProvider dataGetAutoSummary
- */
- public function testGetAutosummary( $old, $new, $flags, $expected ) {
- $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
-
- $summary = $page->getAutosummary( $old, $new, $flags );
-
- $this->assertTrue( (bool)preg_match( $expected, $summary ), "Autosummary didn't match expected pattern $expected: $summary" );
- }
-
- public function dataGetAutoDeleteReason( ) {
- return array(
- array(
- array(),
- false,
- false
- ),
-
- array(
- array(
- array( "first edit", null ),
- ),
- "/first edit.*only contributor/",
- false
- ),
-
- array(
- array(
- array( "first edit", null ),
- array( "second edit", null ),
- ),
- "/second edit.*only contributor/",
- true
- ),
-
- array(
- array(
- array( "first edit", "127.0.2.22" ),
- array( "second edit", "127.0.3.33" ),
- ),
- "/second edit/",
- true
- ),
-
- 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 ),
- ),
- '/first edit:.*\.\.\."/',
- false
- ),
-
- array(
- array(
- array( "first edit", "127.0.2.22" ),
- array( "", "127.0.3.33" ),
- ),
- "/before blanking.*first edit/",
- true
- ),
-
- );
- }
-
- /**
- * @dataProvider dataGetAutoDeleteReason
- */
- public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
- global $wgUser;
-
- $page = $this->newPage( "WikiPageTest_testGetAutoDeleteReason" );
-
- $c = 1;
-
- foreach ( $edits as $edit ) {
- $user = new User();
-
- if ( !empty( $edit[1] ) ) $user->setName( $edit[1] );
- else $user = $wgUser;
-
- $page->doEdit( $edit[0], "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user );
-
- $c += 1;
- }
-
- $reason = $page->getAutoDeleteReason( $hasHistory );
-
- if ( is_bool( $expectedResult ) || is_null( $expectedResult ) ) $this->assertEquals( $expectedResult, $reason );
- else $this->assertTrue( (bool)preg_match( $expectedResult, $reason ), "Autosummary didn't match expected pattern $expectedResult: $reason" );
-
- $this->assertEquals( $expectedHistory, $hasHistory, "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
-
- $page->doDeleteArticle( "done" );
- }
-
- public function dataPreSaveTransform() {
- return array(
- array( 'hello this is ~~~',
- "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
- ),
- array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
- 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
- ),
- );
- }
-
- /**
- * @dataProvider dataPreSaveTransform
- */
- public function testPreSaveTransform( $text, $expected ) {
- $this->hideDeprecated( 'WikiPage::preSaveTransform' );
- $user = new User();
- $user->setName("127.0.0.1");
-
- $page = $this->newPage( "WikiPageTest_testPreloadTransform" );
- $text = $page->preSaveTransform( $text, $user );
-
- $this->assertEquals( $expected, $text );
- }
-
-}
-
diff --git a/tests/phpunit/includes/XmlJsTest.php b/tests/phpunit/includes/XmlJsTest.php
deleted file mode 100644
index c5b411fb..00000000
--- a/tests/phpunit/includes/XmlJsTest.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-class XmlJs extends MediaWikiTestCase {
- public function testConstruction() {
- $obj = new XmlJsCode( null );
- $this->assertNull( $obj->value );
- $obj = new XmlJsCode( '' );
- $this->assertSame( $obj->value, '' );
- }
-}
diff --git a/tests/phpunit/includes/XmlSelectTest.php b/tests/phpunit/includes/XmlSelectTest.php
deleted file mode 100644
index 2407c151..00000000
--- a/tests/phpunit/includes/XmlSelectTest.php
+++ /dev/null
@@ -1,139 +0,0 @@
-<?php
-
-// TODO
-class XmlSelectTest extends MediaWikiTestCase {
- protected $select;
-
- protected function setUp() {
- $this->select = new XmlSelect();
- }
- protected function tearDown() {
- $this->select = null;
- }
-
- ### START OF TESTS ###
-
- public function testConstructWithoutParameters() {
- $this->assertEquals( '<select></select>', $this->select->getHTML() );
- }
-
- /**
- * Parameters are $name (false), $id (false), $default (false)
- * @dataProvider provideConstructionParameters
- */
- public function testConstructParameters( $name, $id, $default, $expected ) {
- $this->select = new XmlSelect( $name, $id, $default );
- $this->assertEquals( $expected, $this->select->getHTML() );
- }
-
- /**
- * Provide parameters for testConstructParameters() which use three
- * parameters:
- * - $name (default: false)
- * - $id (default: false)
- * - $default (default: false)
- * Provides a fourth parameters representing the expected HTML output
- *
- */
- public function provideConstructionParameters() {
- return array(
- /**
- * Values are set following a 3-bit Gray code where two successive
- * values differ by only one value.
- * See http://en.wikipedia.org/wiki/Gray_code
- */
- # $name $id $default
- array( false , false, false, '<select></select>' ),
- array( false , false, 'foo', '<select></select>' ),
- array( false , 'id' , 'foo', '<select id="id"></select>' ),
- array( false , 'id' , false, '<select id="id"></select>' ),
- array( 'name', 'id' , false, '<select name="name" id="id"></select>' ),
- array( 'name', 'id' , 'foo', '<select name="name" id="id"></select>' ),
- array( 'name', false, 'foo', '<select name="name"></select>' ),
- array( 'name', false, false, '<select name="name"></select>' ),
- );
- }
-
- # Begin XmlSelect::addOption() similar to Xml::option
- public function testAddOption() {
- $this->select->addOption( 'foo' );
- $this->assertEquals( '<select><option value="foo">foo</option></select>', $this->select->getHTML() );
- }
- public function testAddOptionWithDefault() {
- $this->select->addOption( 'foo', true );
- $this->assertEquals( '<select><option value="1">foo</option></select>', $this->select->getHTML() );
- }
- public function testAddOptionWithFalse() {
- $this->select->addOption( 'foo', false );
- $this->assertEquals( '<select><option value="foo">foo</option></select>', $this->select->getHTML() );
- }
- public function testAddOptionWithValueZero() {
- $this->select->addOption( 'foo', 0 );
- $this->assertEquals( '<select><option value="0">foo</option></select>', $this->select->getHTML() );
- }
- # End XmlSelect::addOption() similar to Xml::option
-
- public function testSetDefault() {
- $this->select->setDefault( 'bar1' );
- $this->select->addOption( 'foo1' );
- $this->select->addOption( 'bar1' );
- $this->select->addOption( 'foo2' );
- $this->assertEquals(
-'<select><option value="foo1">foo1</option>' . "\n" .
-'<option value="bar1" selected="">bar1</option>' . "\n" .
-'<option value="foo2">foo2</option></select>', $this->select->getHTML() );
- }
-
- /**
- * Adding default later on should set the correct selection or
- * raise an exception.
- * To handle this, we need to render the options in getHtml()
- */
- public function testSetDefaultAfterAddingOptions() {
- $this->select->addOption( 'foo1' );
- $this->select->addOption( 'bar1' );
- $this->select->addOption( 'foo2' );
- $this->select->setDefault( 'bar1' ); # setting default after adding options
- $this->assertEquals(
-'<select><option value="foo1">foo1</option>' . "\n" .
-'<option value="bar1" selected="">bar1</option>' . "\n" .
-'<option value="foo2">foo2</option></select>', $this->select->getHTML() );
- }
-
- public function testGetAttributes() {
- # create some attributes
- $this->select->setAttribute( 'dummy', 0x777 );
- $this->select->setAttribute( 'string', 'euro €' );
- $this->select->setAttribute( 1911, 'razor' );
-
- # verify we can retrieve them
- $this->assertEquals(
- $this->select->getAttribute( 'dummy' ),
- 0x777
- );
- $this->assertEquals(
- $this->select->getAttribute( 'string' ),
- 'euro €'
- );
- $this->assertEquals(
- $this->select->getAttribute( 1911 ),
- 'razor'
- );
-
- # inexistant keys should give us 'null'
- $this->assertEquals(
- $this->select->getAttribute( 'I DO NOT EXIT' ),
- null
- );
-
- # verify string / integer
- $this->assertEquals(
- $this->select->getAttribute( '1911' ),
- 'razor'
- );
- $this->assertEquals(
- $this->select->getAttribute( 'dummy' ),
- 0x777
- );
- }
-}
diff --git a/tests/phpunit/includes/XmlTest.php b/tests/phpunit/includes/XmlTest.php
deleted file mode 100644
index 93ed3dc7..00000000
--- a/tests/phpunit/includes/XmlTest.php
+++ /dev/null
@@ -1,342 +0,0 @@
-<?php
-
-class XmlTest extends MediaWikiTestCase {
- private static $oldLang;
- private static $oldNamespaces;
-
- public function setUp() {
- global $wgLang, $wgContLang;
-
- self::$oldLang = $wgLang;
- $wgLang = Language::factory( 'en' );
-
- // Hardcode namespaces during test runs,
- // so that html output based on existing namespaces
- // can be properly evaluated.
- self::$oldNamespaces = $wgContLang->getNamespaces();
- $wgContLang->setNamespaces( array(
- -2 => 'Media',
- -1 => 'Special',
- 0 => '',
- 1 => 'Talk',
- 2 => 'User',
- 3 => 'User_talk',
- 4 => 'MyWiki',
- 5 => 'MyWiki_Talk',
- 6 => 'File',
- 7 => 'File_talk',
- 8 => 'MediaWiki',
- 9 => 'MediaWiki_talk',
- 10 => 'Template',
- 11 => 'Template_talk',
- 100 => 'Custom',
- 101 => 'Custom_talk',
- ) );
- }
-
- public function tearDown() {
- global $wgLang, $wgContLang;
- $wgLang = self::$oldLang;
-
- $wgContLang->setNamespaces( self::$oldNamespaces );
- }
-
- public function testExpandAttributes() {
- $this->assertNull( Xml::expandAttributes(null),
- 'Converting a null list of attributes'
- );
- $this->assertEquals( '', Xml::expandAttributes( array() ),
- 'Converting an empty list of attributes'
- );
- }
-
- public function testExpandAttributesException() {
- $this->setExpectedException('MWException');
- Xml::expandAttributes('string');
- }
-
- function testElementOpen() {
- $this->assertEquals(
- '<element>',
- Xml::element( 'element', null, null ),
- 'Opening element with no attributes'
- );
- }
-
- function testElementEmpty() {
- $this->assertEquals(
- '<element />',
- Xml::element( 'element', null, '' ),
- 'Terminated empty element'
- );
- }
-
- function testElementInputCanHaveAValueOfZero() {
- $this->assertEquals(
- '<input name="name" value="0" />',
- Xml::input( 'name', false, 0 ),
- 'Input with a value of 0 (bug 23797)'
- );
- }
- function testElementEscaping() {
- $this->assertEquals(
- '<element>hello &lt;there&gt; you &amp; you</element>',
- Xml::element( 'element', null, 'hello <there> you & you' ),
- 'Element with no attributes and content that needs escaping'
- );
- }
-
- public function testEscapeTagsOnly() {
- $this->assertEquals( '&quot;&gt;&lt;', Xml::escapeTagsOnly( '"><' ),
- 'replace " > and < with their HTML entitites'
- );
- }
-
- function testElementAttributes() {
- $this->assertEquals(
- '<element key="value" <>="&lt;&gt;">',
- Xml::element( 'element', array( 'key' => 'value', '<>' => '<>' ), null ),
- 'Element attributes, keys are not escaped'
- );
- }
-
- function testOpenElement() {
- $this->assertEquals(
- '<element k="v">',
- Xml::openElement( 'element', array( 'k' => 'v' ) ),
- 'openElement() shortcut'
- );
- }
-
- function testCloseElement() {
- $this->assertEquals( '</element>', Xml::closeElement( 'element' ), 'closeElement() shortcut' );
- }
-
- /**
- * @group Broken
- */
- public function testDateMenu( ) {
- $curYear = intval(gmdate('Y'));
- $prevYear = $curYear - 1;
-
- $curMonth = intval(gmdate('n'));
- $prevMonth = $curMonth - 1;
- if( $prevMonth == 0 ) { $prevMonth = 12; }
- $nextMonth = $curMonth + 1;
- if( $nextMonth == 13 ) { $nextMonth = 1; }
-
- $this->assertEquals(
- '<label for="year">From year (and earlier):</label> <input name="year" size="4" value="2011" id="year" maxlength="4" /> <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" .
-'<option value="4">April</option>' . "\n" .
-'<option value="5">May</option>' . "\n" .
-'<option value="6">June</option>' . "\n" .
-'<option value="7">July</option>' . "\n" .
-'<option value="8">August</option>' . "\n" .
-'<option value="9">September</option>' . "\n" .
-'<option value="10">October</option>' . "\n" .
-'<option value="11">November</option>' . "\n" .
-'<option value="12">December</option></select>',
- Xml::dateMenu( 2011, 02 ),
- "Date menu for february 2011"
- );
- $this->assertEquals(
- '<label for="year">From year (and earlier):</label> <input name="year" size="4" value="2011" id="year" maxlength="4" /> <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" .
-'<option value="4">April</option>' . "\n" .
-'<option value="5">May</option>' . "\n" .
-'<option value="6">June</option>' . "\n" .
-'<option value="7">July</option>' . "\n" .
-'<option value="8">August</option>' . "\n" .
-'<option value="9">September</option>' . "\n" .
-'<option value="10">October</option>' . "\n" .
-'<option value="11">November</option>' . "\n" .
-'<option value="12">December</option></select>',
- Xml::dateMenu( 2011, -1),
- "Date menu with negative month for 'All'"
- );
- $this->assertEquals(
- Xml::dateMenu( $curYear, $curMonth ),
- Xml::dateMenu( '' , $curMonth ),
- "Date menu year is the current one when not specified"
- );
-
- // @todo FIXME: next month can be in the next year
- // test failing because it is now december
- $this->assertEquals(
- Xml::dateMenu( $prevYear, $nextMonth ),
- Xml::dateMenu( '', $nextMonth ),
- "Date menu next month is 11 months ago"
- );
-
- # @todo FIXME: Please note there is no year there!
- $this->assertEquals(
- '<label for="year">From year (and earlier):</label> <input name="year" size="4" value="" id="year" maxlength="4" /> <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" .
-'<option value="4">April</option>' . "\n" .
-'<option value="5">May</option>' . "\n" .
-'<option value="6">June</option>' . "\n" .
-'<option value="7">July</option>' . "\n" .
-'<option value="8">August</option>' . "\n" .
-'<option value="9">September</option>' . "\n" .
-'<option value="10">October</option>' . "\n" .
-'<option value="11">November</option>' . "\n" .
-'<option value="12">December</option></select>',
- Xml::dateMenu( '', '' ),
- "Date menu with neither year or month"
- );
- }
-
- #
- # textarea
- #
- function testTextareaNoContent() {
- $this->assertEquals(
- '<textarea name="name" id="name" cols="40" rows="5"></textarea>',
- Xml::textarea( 'name', '' ),
- 'textarea() with not content'
- );
- }
-
- function testTextareaAttribs() {
- $this->assertEquals(
- '<textarea name="name" id="name" cols="20" rows="10">&lt;txt&gt;</textarea>',
- Xml::textarea( 'name', '<txt>', 20, 10 ),
- 'textarea() with custom attribs'
- );
- }
-
- #
- # input and label
- #
- function testLabelCreation() {
- $this->assertEquals(
- '<label for="id">name</label>',
- Xml::label( 'name', 'id' ),
- 'label() with no attribs'
- );
- }
- function testLabelAttributeCanOnlyBeClassOrTitle() {
- $this->assertEquals(
- '<label for="id">name</label>',
- Xml::label( 'name', 'id', array( 'generated' => true ) ),
- 'label() can not be given a generated attribute'
- );
- $this->assertEquals(
- '<label for="id" class="nice">name</label>',
- Xml::label( 'name', 'id', array( 'class' => 'nice' ) ),
- 'label() can get a class attribute'
- );
- $this->assertEquals(
- '<label for="id" title="nice tooltip">name</label>',
- Xml::label( 'name', 'id', array( 'title' => 'nice tooltip' ) ),
- 'label() can get a title attribute'
- );
- $this->assertEquals(
- '<label for="id" class="nice" title="nice tooltip">name</label>',
- Xml::label( 'name', 'id', array(
- 'generated' => true,
- 'class' => 'nice',
- 'title' => 'nice tooltip',
- 'anotherattr' => 'value',
- )
- ),
- 'label() skip all attributes but "class" and "title"'
- );
- }
-
- function testLanguageSelector() {
- $select = Xml::languageSelector( 'en', true, null,
- array( 'id' => 'testlang' ), wfMessage( 'yourlanguage' ) );
- $this->assertEquals(
- '<label for="testlang">Language:</label>',
- $select[0]
- );
- }
-
- #
- # JS
- #
- function testEscapeJsStringSpecialChars() {
- $this->assertEquals(
- '\\\\\r\n',
- Xml::escapeJsString( "\\\r\n" ),
- 'escapeJsString() with special characters'
- );
- }
-
- function testEncodeJsVarBoolean() {
- $this->assertEquals(
- 'true',
- Xml::encodeJsVar( true ),
- 'encodeJsVar() with boolean'
- );
- }
-
- function testEncodeJsVarNull() {
- $this->assertEquals(
- 'null',
- Xml::encodeJsVar( null ),
- 'encodeJsVar() with null'
- );
- }
-
- function testEncodeJsVarArray() {
- $this->assertEquals(
- '["a",1]',
- Xml::encodeJsVar( array( 'a', 1 ) ),
- 'encodeJsVar() with array'
- );
- $this->assertEquals(
- '{"a":"a","b":1}',
- Xml::encodeJsVar( array( 'a' => 'a', 'b' => 1 ) ),
- 'encodeJsVar() with associative array'
- );
- }
-
- function testEncodeJsVarObject() {
- $this->assertEquals(
- '{"a":"a","b":1}',
- Xml::encodeJsVar( (object)array( 'a' => 'a', 'b' => 1 ) ),
- 'encodeJsVar() with object'
- );
- }
-
- function testEncodeJsVarInt() {
- $this->assertEquals(
- '123456',
- Xml::encodeJsVar( 123456 ),
- 'encodeJsVar() with int'
- );
- }
-
- function testEncodeJsVarFloat() {
- $this->assertEquals(
- '1.23456',
- Xml::encodeJsVar( 1.23456 ),
- 'encodeJsVar() with float'
- );
- }
-
- function testEncodeJsVarIntString() {
- $this->assertEquals(
- '"123456"',
- Xml::encodeJsVar( '123456' ),
- 'encodeJsVar() with int-like string'
- );
- }
-
- function testEncodeJsVarFloatString() {
- $this->assertEquals(
- '"1.23456"',
- Xml::encodeJsVar( '1.23456' ),
- 'encodeJsVar() with float-like string'
- );
- }
-}
diff --git a/tests/phpunit/includes/ZipDirectoryReaderTest.php b/tests/phpunit/includes/ZipDirectoryReaderTest.php
deleted file mode 100644
index d90a6950..00000000
--- a/tests/phpunit/includes/ZipDirectoryReaderTest.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-class ZipDirectoryReaderTest extends MediaWikiTestCase {
- var $zipDir, $entries;
-
- function setUp() {
- $this->zipDir = __DIR__ . '/../data/zip';
- }
-
- function zipCallback( $entry ) {
- $this->entries[] = $entry;
- }
-
- function readZipAssertError( $file, $error, $assertMessage ) {
- $this->entries = array();
- $status = ZipDirectoryReader::read( "{$this->zipDir}/$file", array( $this, 'zipCallback' ) );
- $this->assertTrue( $status->hasMessage( $error ), $assertMessage );
- }
-
- function readZipAssertSuccess( $file, $assertMessage ) {
- $this->entries = array();
- $status = ZipDirectoryReader::read( "{$this->zipDir}/$file", array( $this, 'zipCallback' ) );
- $this->assertTrue( $status->isOK(), $assertMessage );
- }
-
- function testEmpty() {
- $this->readZipAssertSuccess( 'empty.zip', 'Empty zip' );
- }
-
- function testMultiDisk0() {
- $this->readZipAssertError( 'split.zip', 'zip-unsupported',
- 'Split zip error' );
- }
-
- function testNoSignature() {
- $this->readZipAssertError( 'nosig.zip', 'zip-wrong-format',
- 'No signature should give "wrong format" error' );
- }
-
- function testSimple() {
- $this->readZipAssertSuccess( 'class.zip', 'Simple ZIP' );
- $this->assertEquals( $this->entries, array( array(
- 'name' => 'Class.class',
- 'mtime' => '20010115000000',
- 'size' => 1,
- ) ) );
- }
-
- function testBadCentralEntrySignature() {
- $this->readZipAssertError( 'wrong-central-entry-sig.zip', 'zip-bad',
- 'Bad central entry error' );
- }
-
- function testTrailingBytes() {
- $this->readZipAssertError( 'trail.zip', 'zip-bad',
- 'Trailing bytes error' );
- }
-
- function testWrongCDStart() {
- $this->readZipAssertError( 'wrong-cd-start-disk.zip', 'zip-unsupported',
- 'Wrong CD start disk error' );
- }
-
-
- function testCentralDirectoryGap() {
- $this->readZipAssertError( 'cd-gap.zip', 'zip-bad',
- 'CD gap error' );
- }
-
- function testCentralDirectoryTruncated() {
- $this->readZipAssertError( 'cd-truncated.zip', 'zip-bad',
- 'CD truncated error (should hit unpack() overrun)' );
- }
-
- function testLooksLikeZip64() {
- $this->readZipAssertError( 'looks-like-zip64.zip', 'zip-unsupported',
- 'A file which looks like ZIP64 but isn\'t, should give error' );
- }
-}
diff --git a/tests/phpunit/includes/api/ApiBlockTest.php b/tests/phpunit/includes/api/ApiBlockTest.php
deleted file mode 100644
index 5dfceee8..00000000
--- a/tests/phpunit/includes/api/ApiBlockTest.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-
-/**
- * @group API
- * @group Database
- */
-class ApiBlockTest extends ApiTestCase {
-
- function setUp() {
- parent::setUp();
- $this->doLogin();
- }
-
- function getTokens() {
- return $this->getTokenList( self::$users['sysop'] );
- }
-
- function addDBData() {
- $user = User::newFromName( 'UTApiBlockee' );
-
- if ( $user->getId() == 0 ) {
- $user->addToDatabase();
- $user->setPassword( 'UTApiBlockeePassword' );
-
- $user->saveSettings();
- }
- }
-
- /**
- * This test has probably always been broken and use an invalid token
- * Bug tracking brokenness is https://bugzilla.wikimedia.org/35646
- *
- * Root cause is https://gerrit.wikimedia.org/r/3434
- * Which made the Block/Unblock API to actually verify the token
- * previously always considered valid (bug 34212).
- */
- function testMakeNormalBlock() {
-
- $data = $this->getTokens();
-
- $user = User::newFromName( 'UTApiBlockee' );
-
- if ( !$user->getId() ) {
- $this->markTestIncomplete( "The user UTApiBlockee does not exist" );
- }
-
- if( !isset( $data[0]['query']['pages'] ) ) {
- $this->markTestIncomplete( "No block token found" );
- }
-
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
- $pageinfo = $data[0]['query']['pages'][$key];
-
- $data = $this->doApiRequest( array(
- 'action' => 'block',
- 'user' => 'UTApiBlockee',
- 'reason' => 'Some reason',
- 'token' => $pageinfo['blocktoken'] ), null, false, self::$users['sysop']->user );
-
- $block = Block::newFromTarget('UTApiBlockee');
-
- $this->assertTrue( !is_null( $block ), 'Block is valid' );
-
- $this->assertEquals( 'UTApiBlockee', (string)$block->getTarget() );
- $this->assertEquals( 'Some reason', $block->mReason );
- $this->assertEquals( 'infinity', $block->mExpiry );
-
- }
-
- /**
- * @dataProvider provideBlockUnblockAction
- */
- function testGetTokenUsingABlockingAction( $action ) {
- $data = $this->doApiRequest(
- array(
- 'action' => $action,
- 'user' => 'UTApiBlockee',
- 'gettoken' => '' ),
- null,
- false,
- self::$users['sysop']->user
- );
- $this->assertEquals( 34, strlen( $data[0][$action]["{$action}token"] ) );
- }
-
- /**
- * Attempting to block without a token should give a UsageException with
- * error message:
- * "The token parameter must be set"
- *
- * @dataProvider provideBlockUnblockAction
- * @expectedException UsageException
- */
- function testBlockingActionWithNoToken( $action ) {
- $this->doApiRequest(
- array(
- 'action' => $action,
- 'user' => 'UTApiBlockee',
- 'reason' => 'Some reason',
- ),
- null,
- false,
- self::$users['sysop']->user
- );
- }
-
- /**
- * Just provide the 'block' and 'unblock' action to test both API calls
- */
- function provideBlockUnblockAction() {
- return array(
- array( 'block' ),
- array( 'unblock' ),
- );
- }
-}
diff --git a/tests/phpunit/includes/api/ApiEditPageTest.php b/tests/phpunit/includes/api/ApiEditPageTest.php
deleted file mode 100644
index 5297d6da..00000000
--- a/tests/phpunit/includes/api/ApiEditPageTest.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-/**
- * Tests for MediaWiki api.php?action=edit.
- *
- * @author Daniel Kinzler
- *
- * @group API
- * @group Database
- */
-class ApiEditPageTest extends ApiTestCase {
-
- function setUp() {
- parent::setUp();
- $this->doLogin();
- }
-
- function testEdit( ) {
- $name = 'ApiEditPageTest_testEdit';
-
- // -- test new page --------------------------------------------
- $apiResult = $this->doApiRequestWithToken( array(
- 'action' => 'edit',
- 'title' => $name,
- 'text' => 'some text', ) );
- $apiResult = $apiResult[0];
-
- # Validate API result data
- $this->assertArrayHasKey( 'edit', $apiResult );
- $this->assertArrayHasKey( 'result', $apiResult['edit'] );
- $this->assertEquals( 'Success', $apiResult['edit']['result'] );
-
- $this->assertArrayHasKey( 'new', $apiResult['edit'] );
- $this->assertArrayNotHasKey( 'nochange', $apiResult['edit'] );
-
- $this->assertArrayHasKey( 'pageid', $apiResult['edit'] );
-
- // -- test existing page, no change ----------------------------
- $data = $this->doApiRequestWithToken( array(
- 'action' => 'edit',
- 'title' => $name,
- 'text' => 'some text', ) );
-
- $this->assertEquals( 'Success', $data[0]['edit']['result'] );
-
- $this->assertArrayNotHasKey( 'new', $data[0]['edit'] );
- $this->assertArrayHasKey( 'nochange', $data[0]['edit'] );
-
- // -- test existing page, with change --------------------------
- $data = $this->doApiRequestWithToken( array(
- 'action' => 'edit',
- 'title' => $name,
- 'text' => 'different text' ) );
-
- $this->assertEquals( 'Success', $data[0]['edit']['result'] );
-
- $this->assertArrayNotHasKey( 'new', $data[0]['edit'] );
- $this->assertArrayNotHasKey( 'nochange', $data[0]['edit'] );
-
- $this->assertArrayHasKey( 'oldrevid', $data[0]['edit'] );
- $this->assertArrayHasKey( 'newrevid', $data[0]['edit'] );
- $this->assertNotEquals(
- $data[0]['edit']['newrevid'],
- $data[0]['edit']['oldrevid'],
- "revision id should change after edit"
- );
- }
-
- function testEditAppend() {
- $this->markTestIncomplete( "not yet implemented" );
- }
-
- function testEditSection() {
- $this->markTestIncomplete( "not yet implemented" );
- }
-
- function testUndo() {
- $this->markTestIncomplete( "not yet implemented" );
- }
-
- function testEditNonText() {
- $this->markTestIncomplete( "not yet implemented" );
- }
-}
diff --git a/tests/phpunit/includes/api/ApiOptionsTest.php b/tests/phpunit/includes/api/ApiOptionsTest.php
deleted file mode 100644
index 5243fca1..00000000
--- a/tests/phpunit/includes/api/ApiOptionsTest.php
+++ /dev/null
@@ -1,276 +0,0 @@
-<?php
-
-/**
- * @group API
- * @group Database
- */
-class ApiOptionsTest extends MediaWikiLangTestCase {
-
- private $mTested, $mApiMainMock, $mUserMock, $mContext, $mSession;
-
- private $mOldGetPreferencesHooks = false;
-
- private static $Success = array( 'options' => 'success' );
-
- function setUp() {
- parent::setUp();
-
- $this->mUserMock = $this->getMockBuilder( 'User' )
- ->disableOriginalConstructor()
- ->getMock();
-
- $this->mApiMainMock = $this->getMockBuilder( 'ApiBase' )
- ->disableOriginalConstructor()
- ->getMock();
-
- // Set up groups
- $this->mUserMock->expects( $this->any() )
- ->method( 'getEffectiveGroups' )->will( $this->returnValue( array( '*', 'user')) );
-
- // Create a new context
- $this->mContext = new DerivativeContext( new RequestContext() );
- $this->mContext->getContext()->setTitle( Title::newFromText( 'Test' ) );
- $this->mContext->setUser( $this->mUserMock );
-
- $this->mApiMainMock->expects( $this->any() )
- ->method( 'getContext' )
- ->will( $this->returnValue( $this->mContext ) );
-
- $this->mApiMainMock->expects( $this->any() )
- ->method( 'getResult' )
- ->will( $this->returnValue( new ApiResult( $this->mApiMainMock ) ) );
-
-
- // Empty session
- $this->mSession = array();
-
- $this->mTested = new ApiOptions( $this->mApiMainMock, 'options' );
-
- global $wgHooks;
- if ( !isset( $wgHooks['GetPreferences'] ) ) {
- $wgHooks['GetPreferences'] = array();
- }
- $this->mOldGetPreferencesHooks = $wgHooks['GetPreferences'];
- $wgHooks['GetPreferences'][] = array( $this, 'hookGetPreferences' );
- }
-
- public function tearDown() {
- global $wgHooks;
-
- if ( $this->mOldGetPreferencesHooks !== false ) {
- $wgHooks['GetPreferences'] = $this->mOldGetPreferencesHooks;
- $this->mOldGetPreferencesHooks = false;
- }
-
- parent::tearDown();
- }
-
- public function hookGetPreferences( $user, &$preferences ) {
- foreach ( array( 'name', 'willBeNull', 'willBeEmpty', 'willBeHappy' ) as $k ) {
- $preferences[$k] = array(
- 'type' => 'text',
- 'section' => 'test',
- 'label' => '&#160;',
- );
- }
-
- return true;
- }
-
- private function getSampleRequest( $custom = array() ) {
- $request = array(
- 'token' => '123ABC',
- 'change' => null,
- 'optionname' => null,
- 'optionvalue' => null,
- );
- return array_merge( $request, $custom );
- }
-
- private function executeQuery( $request ) {
- $this->mContext->setRequest( new FauxRequest( $request, true, $this->mSession ) );
- $this->mTested->execute();
- return $this->mTested->getResult()->getData();
- }
-
- /**
- * @expectedException UsageException
- */
- public function testNoToken() {
- $request = $this->getSampleRequest( array( 'token' => null ) );
-
- $this->executeQuery( $request );
- }
-
- public function testAnon() {
- $this->mUserMock->expects( $this->once() )
- ->method( 'isAnon' )
- ->will( $this->returnValue( true ) );
-
- try {
- $request = $this->getSampleRequest();
-
- $this->executeQuery( $request );
- } catch ( UsageException $e ) {
- $this->assertEquals( 'notloggedin', $e->getCodeString() );
- $this->assertEquals( 'Anonymous users cannot change preferences', $e->getMessage() );
- return;
- }
- $this->fail( "UsageException was not thrown" );
- }
-
- public function testNoOptionname() {
- try {
- $request = $this->getSampleRequest( array( 'optionvalue' => '1' ) );
-
- $this->executeQuery( $request );
- } catch ( UsageException $e ) {
- $this->assertEquals( 'nooptionname', $e->getCodeString() );
- $this->assertEquals( 'The optionname parameter must be set', $e->getMessage() );
- return;
- }
- $this->fail( "UsageException was not thrown" );
- }
-
- public function testNoChanges() {
- $this->mUserMock->expects( $this->never() )
- ->method( 'resetOptions' );
-
- $this->mUserMock->expects( $this->never() )
- ->method( 'setOption' );
-
- $this->mUserMock->expects( $this->never() )
- ->method( 'saveSettings' );
-
- try {
- $request = $this->getSampleRequest();
-
- $this->executeQuery( $request );
- } catch ( UsageException $e ) {
- $this->assertEquals( 'nochanges', $e->getCodeString() );
- $this->assertEquals( 'No changes were requested', $e->getMessage() );
- return;
- }
- $this->fail( "UsageException was not thrown" );
- }
-
- public function testReset() {
- $this->mUserMock->expects( $this->once() )
- ->method( 'resetOptions' );
-
- $this->mUserMock->expects( $this->never() )
- ->method( 'setOption' );
-
- $this->mUserMock->expects( $this->once() )
- ->method( 'saveSettings' );
-
- $request = $this->getSampleRequest( array( 'reset' => '' ) );
-
- $response = $this->executeQuery( $request );
-
- $this->assertEquals( self::$Success, $response );
- }
-
- public function testOptionWithValue() {
- $this->mUserMock->expects( $this->never() )
- ->method( 'resetOptions' );
-
- $this->mUserMock->expects( $this->once() )
- ->method( 'setOption' )
- ->with( $this->equalTo( 'name' ), $this->equalTo( 'value' ) );
-
- $this->mUserMock->expects( $this->once() )
- ->method( 'saveSettings' );
-
- $request = $this->getSampleRequest( array( 'optionname' => 'name', 'optionvalue' => 'value' ) );
-
- $response = $this->executeQuery( $request );
-
- $this->assertEquals( self::$Success, $response );
- }
-
- public function testOptionResetValue() {
- $this->mUserMock->expects( $this->never() )
- ->method( 'resetOptions' );
-
- $this->mUserMock->expects( $this->once() )
- ->method( 'setOption' )
- ->with( $this->equalTo( 'name' ), $this->equalTo( null ) );
-
- $this->mUserMock->expects( $this->once() )
- ->method( 'saveSettings' );
-
- $request = $this->getSampleRequest( array( 'optionname' => 'name' ) );
- $response = $this->executeQuery( $request );
-
- $this->assertEquals( self::$Success, $response );
- }
-
- public function testChange() {
- $this->mUserMock->expects( $this->never() )
- ->method( 'resetOptions' );
-
- $this->mUserMock->expects( $this->at( 1 ) )
- ->method( 'getOptions' );
-
- $this->mUserMock->expects( $this->at( 2 ) )
- ->method( 'setOption' )
- ->with( $this->equalTo( 'willBeNull' ), $this->equalTo( null ) );
-
- $this->mUserMock->expects( $this->at( 3 ) )
- ->method( 'getOptions' );
-
- $this->mUserMock->expects( $this->at( 4 ) )
- ->method( 'setOption' )
- ->with( $this->equalTo( 'willBeEmpty' ), $this->equalTo( '' ) );
-
- $this->mUserMock->expects( $this->at( 5 ) )
- ->method( 'getOptions' );
-
- $this->mUserMock->expects( $this->at( 6 ) )
- ->method( 'setOption' )
- ->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
-
- $this->mUserMock->expects( $this->once() )
- ->method( 'saveSettings' );
-
- $request = $this->getSampleRequest( array( 'change' => 'willBeNull|willBeEmpty=|willBeHappy=Happy' ) );
-
- $response = $this->executeQuery( $request );
-
- $this->assertEquals( self::$Success, $response );
- }
-
- public function testResetChangeOption() {
- $this->mUserMock->expects( $this->once() )
- ->method( 'resetOptions' );
-
- $this->mUserMock->expects( $this->at( 2 ) )
- ->method( 'getOptions' );
-
- $this->mUserMock->expects( $this->at( 3 ) )
- ->method( 'setOption' )
- ->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
-
- $this->mUserMock->expects( $this->at( 4 ) )
- ->method( 'getOptions' );
-
- $this->mUserMock->expects( $this->at( 5 ) )
- ->method( 'setOption' )
- ->with( $this->equalTo( 'name' ), $this->equalTo( 'value' ) );
-
- $this->mUserMock->expects( $this->once() )
- ->method( 'saveSettings' );
-
- $args = array(
- 'reset' => '',
- 'change' => 'willBeHappy=Happy',
- 'optionname' => 'name',
- 'optionvalue' => 'value'
- );
-
- $response = $this->executeQuery( $this->getSampleRequest( $args ) );
-
- $this->assertEquals( self::$Success, $response );
- }
-}
diff --git a/tests/phpunit/includes/api/ApiPurgeTest.php b/tests/phpunit/includes/api/ApiPurgeTest.php
deleted file mode 100644
index 2566c6cd..00000000
--- a/tests/phpunit/includes/api/ApiPurgeTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/**
- * @group API
- * @group Database
- */
-class ApiPurgeTest extends ApiTestCase {
-
- function setUp() {
- parent::setUp();
- $this->doLogin();
- }
-
- /**
- * @group Broken
- */
- function testPurgeMainPage() {
- if ( !Title::newFromText( 'UTPage' )->exists() ) {
- $this->markTestIncomplete( "The article [[UTPage]] does not exist" );
- }
-
- $somePage = mt_rand();
-
- $data = $this->doApiRequest( array(
- 'action' => 'purge',
- 'titles' => 'UTPage|' . $somePage . '|%5D' ) );
-
- $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 ) );
-
- $pages = array( 'UTPage' => 'purged', $somePage => 'missing', '%5D' => 'invalid' );
- foreach( $data[0]['purge'] as $v ) {
- $this->assertArrayHasKey( $pages[$v['title']], $v );
- }
- }
-
-}
diff --git a/tests/phpunit/includes/api/ApiQueryTest.php b/tests/phpunit/includes/api/ApiQueryTest.php
deleted file mode 100644
index a4b9dc70..00000000
--- a/tests/phpunit/includes/api/ApiQueryTest.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-/**
- * @group API
- * @group Database
- */
-class ApiQueryTest extends ApiTestCase {
-
- function setUp() {
- parent::setUp();
- $this->doLogin();
- }
-
- function testTitlesGetNormalized() {
-
- global $wgMetaNamespace;
-
- $data = $this->doApiRequest( array(
- 'action' => 'query',
- 'titles' => 'Project:articleA|article_B' ) );
-
-
- $this->assertArrayHasKey( 'query', $data[0] );
- $this->assertArrayHasKey( 'normalized', $data[0]['query'] );
-
- // Forge a normalized title
- $to = Title::newFromText( $wgMetaNamespace.':ArticleA' );
-
- $this->assertEquals(
- array(
- 'from' => 'Project:articleA',
- 'to' => $to->getPrefixedText(),
- ),
- $data[0]['query']['normalized'][0]
- );
-
- $this->assertEquals(
- array(
- 'from' => 'article_B',
- 'to' => 'Article B'
- ),
- $data[0]['query']['normalized'][1]
- );
-
- }
-
- function testTitlesAreRejectedIfInvalid() {
- $title = false;
- while( !$title || Title::newFromText( $title )->exists() ) {
- $title = md5( mt_rand( 0, 10000 ) + rand( 0, 999000 ) );
- }
-
- $data = $this->doApiRequest( array(
- 'action' => 'query',
- 'titles' => $title . '|Talk:' ) );
-
- $this->assertArrayHasKey( 'query', $data[0] );
- $this->assertArrayHasKey( 'pages', $data[0]['query'] );
- $this->assertEquals( 2, count( $data[0]['query']['pages'] ) );
-
- $this->assertArrayHasKey( -2, $data[0]['query']['pages'] );
- $this->assertArrayHasKey( -1, $data[0]['query']['pages'] );
-
- $this->assertArrayHasKey( 'missing', $data[0]['query']['pages'][-2] );
- $this->assertArrayHasKey( 'invalid', $data[0]['query']['pages'][-1] );
- }
-
-}
diff --git a/tests/phpunit/includes/api/ApiTest.php b/tests/phpunit/includes/api/ApiTest.php
deleted file mode 100644
index c3eacd5b..00000000
--- a/tests/phpunit/includes/api/ApiTest.php
+++ /dev/null
@@ -1,280 +0,0 @@
-<?php
-
-/**
- * @group API
- * @group Database
- */
-class ApiTest extends ApiTestCase {
-
- function testRequireOnlyOneParameterDefault() {
- $mock = new MockApi();
-
- $this->assertEquals(
- null, $mock->requireOnlyOneParameter( array( "filename" => "foo.txt",
- "enablechunks" => false ), "filename", "enablechunks" ) );
- }
-
- /**
- * @expectedException UsageException
- */
- function testRequireOnlyOneParameterZero() {
- $mock = new MockApi();
-
- $this->assertEquals(
- null, $mock->requireOnlyOneParameter( array( "filename" => "foo.txt",
- "enablechunks" => 0 ), "filename", "enablechunks" ) );
- }
-
- /**
- * @expectedException UsageException
- */
- function testRequireOnlyOneParameterTrue() {
- $mock = new MockApi();
-
- $this->assertEquals(
- null, $mock->requireOnlyOneParameter( array( "filename" => "foo.txt",
- "enablechunks" => true ), "filename", "enablechunks" ) );
- }
-
- /**
- * Test that the API will accept a FauxRequest and execute. The help action
- * (default) throws a UsageException. Just validate we're getting proper XML
- *
- * @expectedException UsageException
- */
- function testApi() {
-
- $api = new ApiMain(
- new FauxRequest( array( 'action' => 'help', 'format' => 'xml' ) )
- );
- $api->execute();
- $api->getPrinter()->setBufferResult( true );
- $api->printResult( false );
- $resp = $api->getPrinter()->getBuffer();
-
- libxml_use_internal_errors( true );
- $sxe = simplexml_load_string( $resp );
- $this->assertNotInternalType( "bool", $sxe );
- $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
- }
-
- /**
- * Test result of attempted login with an empty username
- */
- function testApiLoginNoName() {
- $data = $this->doApiRequest( array( 'action' => 'login',
- 'lgname' => '', 'lgpassword' => self::$users['sysop']->password,
- ) );
- $this->assertEquals( 'NoName', $data[0]['login']['result'] );
- }
-
- function testApiLoginBadPass() {
- global $wgServer;
-
- $user = self::$users['sysop'];
- $user->user->logOut();
-
- if ( !isset( $wgServer ) ) {
- $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
- }
- $ret = $this->doApiRequest( array(
- "action" => "login",
- "lgname" => $user->username,
- "lgpassword" => "bad",
- )
- );
-
- $result = $ret[0];
-
- $this->assertNotInternalType( "bool", $result );
- $a = $result["login"]["result"];
- $this->assertEquals( "NeedToken", $a );
-
- $token = $result["login"]["token"];
-
- $ret = $this->doApiRequest( array(
- "action" => "login",
- "lgtoken" => $token,
- "lgname" => $user->username,
- "lgpassword" => "badnowayinhell",
- ), $ret[2]
- );
-
- $result = $ret[0];
-
- $this->assertNotInternalType( "bool", $result );
- $a = $result["login"]["result"];
-
- $this->assertEquals( "WrongPass", $a );
- }
-
- function testApiLoginGoodPass() {
- global $wgServer;
-
- if ( !isset( $wgServer ) ) {
- $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
- }
-
- $user = self::$users['sysop'];
- $user->user->logOut();
-
- $ret = $this->doApiRequest( array(
- "action" => "login",
- "lgname" => $user->username,
- "lgpassword" => $user->password,
- )
- );
-
- $result = $ret[0];
- $this->assertNotInternalType( "bool", $result );
- $this->assertNotInternalType( "null", $result["login"] );
-
- $a = $result["login"]["result"];
- $this->assertEquals( "NeedToken", $a );
- $token = $result["login"]["token"];
-
- $ret = $this->doApiRequest( array(
- "action" => "login",
- "lgtoken" => $token,
- "lgname" => $user->username,
- "lgpassword" => $user->password,
- ), $ret[2]
- );
-
- $result = $ret[0];
-
- $this->assertNotInternalType( "bool", $result );
- $a = $result["login"]["result"];
-
- $this->assertEquals( "Success", $a );
- }
-
- /**
- * @group Broken
- */
- function testApiGotCookie() {
- $this->markTestIncomplete( "The server can't do external HTTP requests, and the internal one won't give cookies" );
-
- global $wgServer, $wgScriptPath;
-
- if ( !isset( $wgServer ) ) {
- $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
- }
- $user = self::$users['sysop'];
-
- $req = MWHttpRequest::factory( self::$apiUrl . "?action=login&format=xml",
- array( "method" => "POST",
- "postData" => array(
- "lgname" => $user->username,
- "lgpassword" => $user->password ) ) );
- $req->execute();
-
- libxml_use_internal_errors( true );
- $sxe = simplexml_load_string( $req->getContent() );
- $this->assertNotInternalType( "bool", $sxe );
- $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
- $this->assertNotInternalType( "null", $sxe->login[0] );
-
- $a = $sxe->login[0]->attributes()->result[0];
- $this->assertEquals( ' result="NeedToken"', $a->asXML() );
- $token = (string)$sxe->login[0]->attributes()->token;
-
- $req->setData( array(
- "lgtoken" => $token,
- "lgname" => $user->username,
- "lgpassword" => $user->password ) );
- $req->execute();
-
- $cj = $req->getCookieJar();
- $serverName = parse_url( $wgServer, PHP_URL_HOST );
- $this->assertNotEquals( false, $serverName );
- $serializedCookie = $cj->serializeToHttpRequest( $wgScriptPath, $serverName );
- $this->assertNotEquals( '', $serializedCookie );
- $this->assertRegexp( '/_session=[^;]*; .*UserID=[0-9]*; .*UserName=' . $user->userName . '; .*Token=/', $serializedCookie );
-
- return $cj;
- }
-
- /**
- * @todo Finish filling me out...what are we trying to test here?
- */
- function testApiListPages() {
- global $wgServer;
- if ( !isset( $wgServer ) ) {
- $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
- }
-
- $ret = $this->doApiRequest( array(
- 'action' => 'query',
- 'prop' => 'revisions',
- 'titles' => 'Main Page',
- 'rvprop' => 'timestamp|user|comment|content',
- ) );
-
- $result = $ret[0]['query']['pages'];
- $this->markTestIncomplete( "Somebody needs to finish loving me" );
- }
-
- function testRunLogin() {
- $sysopUser = self::$users['sysop'];
- $data = $this->doApiRequest( array(
- 'action' => 'login',
- 'lgname' => $sysopUser->username,
- 'lgpassword' => $sysopUser->password ) );
-
- $this->assertArrayHasKey( "login", $data[0] );
- $this->assertArrayHasKey( "result", $data[0]['login'] );
- $this->assertEquals( "NeedToken", $data[0]['login']['result'] );
- $token = $data[0]['login']['token'];
-
- $data = $this->doApiRequest( array(
- 'action' => 'login',
- "lgtoken" => $token,
- "lgname" => $sysopUser->username,
- "lgpassword" => $sysopUser->password ), $data[2] );
-
- $this->assertArrayHasKey( "login", $data[0] );
- $this->assertArrayHasKey( "result", $data[0]['login'] );
- $this->assertEquals( "Success", $data[0]['login']['result'] );
- $this->assertArrayHasKey( 'lgtoken', $data[0]['login'] );
-
- return $data;
- }
-
- function testGettingToken() {
- foreach ( self::$users as $user ) {
- $this->runTokenTest( $user );
- }
- }
-
- function runTokenTest( $user ) {
-
- $data = $this->getTokenList( $user );
-
- $this->assertArrayHasKey( 'query', $data[0] );
- $this->assertArrayHasKey( 'pages', $data[0]['query'] );
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
-
- $rights = $user->user->getRights();
-
- $this->assertArrayHasKey( $key, $data[0]['query']['pages'] );
- $this->assertArrayHasKey( 'edittoken', $data[0]['query']['pages'][$key] );
- $this->assertArrayHasKey( 'movetoken', $data[0]['query']['pages'][$key] );
-
- if ( isset( $rights['delete'] ) ) {
- $this->assertArrayHasKey( 'deletetoken', $data[0]['query']['pages'][$key] );
- }
-
- if ( isset( $rights['block'] ) ) {
- $this->assertArrayHasKey( 'blocktoken', $data[0]['query']['pages'][$key] );
- $this->assertArrayHasKey( 'unblocktoken', $data[0]['query']['pages'][$key] );
- }
-
- if ( isset( $rights['protect'] ) ) {
- $this->assertArrayHasKey( 'protecttoken', $data[0]['query']['pages'][$key] );
- }
-
- return $data;
- }
-}
diff --git a/tests/phpunit/includes/api/ApiTestCase.php b/tests/phpunit/includes/api/ApiTestCase.php
deleted file mode 100644
index b84292e3..00000000
--- a/tests/phpunit/includes/api/ApiTestCase.php
+++ /dev/null
@@ -1,187 +0,0 @@
-<?php
-
-abstract class ApiTestCase extends MediaWikiLangTestCase {
- protected static $apiUrl;
-
- /**
- * @var ApiTestContext
- */
- protected $apiContext;
-
- function setUp() {
- global $wgContLang, $wgAuth, $wgMemc, $wgRequest, $wgUser, $wgServer;
-
- parent::setUp();
- self::$apiUrl = $wgServer . wfScript( 'api' );
- $wgMemc = new EmptyBagOStuff();
- $wgContLang = Language::factory( 'en' );
- $wgAuth = new StubObject( 'wgAuth', 'AuthPlugin' );
- $wgRequest = new FauxRequest( array() );
-
- self::$users = array(
- 'sysop' => new TestUser(
- 'Apitestsysop',
- 'Api Test Sysop',
- 'api_test_sysop@example.com',
- array( 'sysop' )
- ),
- 'uploader' => new TestUser(
- 'Apitestuser',
- 'Api Test User',
- 'api_test_user@example.com',
- array()
- )
- );
-
- $wgUser = self::$users['sysop']->user;
-
- $this->apiContext = new ApiTestContext();
-
- }
-
- protected function doApiRequest( Array $params, Array $session = null, $appendModule = false, User $user = null ) {
- global $wgRequest, $wgUser;
-
- if ( is_null( $session ) ) {
- # re-use existing global session by default
- $session = $wgRequest->getSessionArray();
- }
-
- # set up global environment
- if ( $user ) {
- $wgUser = $user;
- }
-
- $wgRequest = new FauxRequest( $params, true, $session );
- RequestContext::getMain()->setRequest( $wgRequest );
-
- # set up local environment
- $context = $this->apiContext->newTestContext( $wgRequest, $wgUser );
-
- $module = new ApiMain( $context, true );
-
- # run it!
- $module->execute();
-
- # construct result
- $results = array(
- $module->getResultData(),
- $context->getRequest(),
- $context->getRequest()->getSessionArray()
- );
- if( $appendModule ) {
- $results[] = $module;
- }
-
- return $results;
- }
-
- /**
- * 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
- * @param $params Array: key-value API params
- * @param $session Array|null: session array
- * @param $user User|null A User object for the context
- */
- protected function doApiRequestWithToken( Array $params, Array $session = null, User $user = null ) {
- global $wgRequest;
-
- if ( $session === null ) {
- $session = $wgRequest->getSessionArray();
- }
-
- if ( $session['wsToken'] ) {
- // add edit token to fake session
- $session['wsEditToken'] = $session['wsToken'];
- // add token to request parameters
- $params['token'] = md5( $session['wsToken'] ) . User::EDIT_TOKEN_SUFFIX;
- return $this->doApiRequest( $params, $session, false, $user );
- } else {
- throw new Exception( "request data not in right format" );
- }
- }
-
- protected function doLogin() {
- $data = $this->doApiRequest( array(
- 'action' => 'login',
- 'lgname' => self::$users['sysop']->username,
- 'lgpassword' => self::$users['sysop']->password ) );
-
- $token = $data[0]['login']['token'];
-
- $data = $this->doApiRequest( array(
- 'action' => 'login',
- 'lgtoken' => $token,
- 'lgname' => self::$users['sysop']->username,
- 'lgpassword' => self::$users['sysop']->password
- ), $data[2] );
-
- return $data;
- }
-
- protected function getTokenList( $user, $session = null ) {
- $data = $this->doApiRequest( array(
- 'action' => 'query',
- 'titles' => 'Main Page',
- 'intoken' => 'edit|delete|protect|move|block|unblock|watch',
- 'prop' => 'info' ), $session, false, $user->user );
- return $data;
- }
-}
-
-class UserWrapper {
- public $userName, $password, $user;
-
- public function __construct( $userName, $password, $group = '' ) {
- $this->userName = $userName;
- $this->password = $password;
-
- $this->user = User::newFromName( $this->userName );
- if ( !$this->user->getID() ) {
- $this->user = User::createNew( $this->userName, array(
- "email" => "test@example.com",
- "real_name" => "Test User" ) );
- }
- $this->user->setPassword( $this->password );
-
- if ( $group !== '' ) {
- $this->user->addGroup( $group );
- }
- $this->user->saveSettings();
- }
-}
-
-class MockApi extends ApiBase {
- public function execute() { }
- public function getVersion() { }
-
- public function __construct() { }
-
- public function getAllowedParams() {
- return array(
- 'filename' => null,
- 'enablechunks' => false,
- 'sessionkey' => null,
- );
- }
-}
-
-class ApiTestContext extends RequestContext {
-
- /**
- * Returns a DerivativeContext with the request variables in place
- *
- * @param $request WebRequest request object including parameters and session
- * @param $user User or null
- * @return DerivativeContext
- */
- public function newTestContext( WebRequest $request, User $user = null ) {
- $context = new DerivativeContext( $this );
- $context->setRequest( $request );
- if ( $user !== null ) {
- $context->setUser( $user );
- }
- return $context;
- }
-}
diff --git a/tests/phpunit/includes/api/ApiTestCaseUpload.php b/tests/phpunit/includes/api/ApiTestCaseUpload.php
deleted file mode 100644
index 39c79547..00000000
--- a/tests/phpunit/includes/api/ApiTestCaseUpload.php
+++ /dev/null
@@ -1,148 +0,0 @@
-<?php
-
-/**
- * * Abstract class to support upload tests
- */
-
-abstract class ApiTestCaseUpload extends ApiTestCase {
- /**
- * Fixture -- run before every test
- */
- public function setUp() {
- global $wgEnableUploads, $wgEnableAPI;
- parent::setUp();
-
- $wgEnableUploads = true;
- $wgEnableAPI = true;
- wfSetupSession();
-
- $this->clearFakeUploads();
- }
-
- public function tearDown() {
- $this->clearTempUpload();
- }
-
- /**
- * Helper function -- remove files and associated articles by Title
- * @param $title Title: title to be removed
- */
- public function deleteFileByTitle( $title ) {
- if ( $title->exists() ) {
- $file = wfFindFile( $title, array( 'ignoreRedirect' => true ) );
- $noOldArchive = ""; // yes this really needs to be set this way
- $comment = "removing for test";
- $restrictDeletedVersions = false;
- $status = FileDeleteForm::doDelete( $title, $file, $noOldArchive, $comment, $restrictDeletedVersions );
- if ( !$status->isGood() ) {
- return false;
- }
- $page = WikiPage::factory( $title );
- $page->doDeleteArticle( "removing for test" );
-
- // see if it now doesn't exist; reload
- $title = Title::newFromText( $title->getText(), NS_FILE );
- }
- return ! ( $title && $title instanceof Title && $title->exists() );
- }
-
- /**
- * Helper function -- remove files and associated articles with a particular filename
- * @param $fileName String: filename to be removed
- */
- public function deleteFileByFileName( $fileName ) {
- return $this->deleteFileByTitle( Title::newFromText( $fileName, NS_FILE ) );
- }
-
-
- /**
- * Helper function -- given a file on the filesystem, find matching content in the db (and associated articles) and remove them.
- * @param $filePath String: path to file on the filesystem
- */
- public function deleteFileByContent( $filePath ) {
- $hash = FSFile::getSha1Base36FromPath( $filePath );
- $dupes = RepoGroup::singleton()->findBySha1( $hash );
- $success = true;
- foreach ( $dupes as $dupe ) {
- $success &= $this->deleteFileByTitle( $dupe->getTitle() );
- }
- return $success;
- }
-
- /**
- * Fake an upload by dumping the file into temp space, and adding info to $_FILES.
- * (This is what PHP would normally do).
- * @param $fieldName String: name this would have in the upload form
- * @param $fileName String: name to title this
- * @param $type String: mime type
- * @param $filePath String: path where to find file contents
- */
- function fakeUploadFile( $fieldName, $fileName, $type, $filePath ) {
- $tmpName = tempnam( wfTempDir(), "" );
- if ( !file_exists( $filePath ) ) {
- throw new Exception( "$filePath doesn't exist!" );
- };
-
- if ( !copy( $filePath, $tmpName ) ) {
- throw new Exception( "couldn't copy $filePath to $tmpName" );
- }
-
- clearstatcache();
- $size = filesize( $tmpName );
- if ( $size === false ) {
- throw new Exception( "couldn't stat $tmpName" );
- }
-
- $_FILES[ $fieldName ] = array(
- 'name' => $fileName,
- 'type' => $type,
- 'tmp_name' => $tmpName,
- 'size' => $size,
- 'error' => null
- );
-
- return true;
-
- }
- function fakeUploadChunk( $fieldName, $fileName, $type, & $chunkData ){
- $tmpName = tempnam( wfTempDir(), "" );
- // copy the chunk data to temp location:
- if ( !file_put_contents( $tmpName, $chunkData ) ) {
- throw new Exception( "couldn't copy chunk data to $tmpName" );
- }
-
- clearstatcache();
- $size = filesize( $tmpName );
- if ( $size === false ) {
- throw new Exception( "couldn't stat $tmpName" );
- }
-
- $_FILES[ $fieldName ] = array(
- 'name' => $fileName,
- 'type' => $type,
- 'tmp_name' => $tmpName,
- 'size' => $size,
- 'error' => null
- );
- }
-
- function clearTempUpload() {
- if( isset( $_FILES['file']['tmp_name'] ) ) {
- $tmp = $_FILES['file']['tmp_name'];
- if( file_exists( $tmp ) ) {
- unlink( $tmp );
- }
- }
- }
-
- /**
- * Remove traces of previous fake uploads
- */
- function clearFakeUploads() {
- $_FILES = array();
- }
-
-
-
-
-}
diff --git a/tests/phpunit/includes/api/ApiUploadTest.php b/tests/phpunit/includes/api/ApiUploadTest.php
deleted file mode 100644
index 642fed05..00000000
--- a/tests/phpunit/includes/api/ApiUploadTest.php
+++ /dev/null
@@ -1,569 +0,0 @@
-<?php
-
-/**
- * @group API
- * @group Database
- */
-
-/**
- * n.b. Ensure that you can write to the images/ directory as the
- * 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... )
-
-// TODO: port the other Upload tests, and other API tests to this framework
-
-require_once( 'ApiTestCaseUpload.php' );
-
-/**
- * @group Database
- * @group Broken
- * Broken test, reports false errors from time to time.
- * See https://bugzilla.wikimedia.org/26169
- *
- * This is pretty sucky... needs to be prettified.
- */
-class ApiUploadTest extends ApiTestCaseUpload {
-
- /**
- * Testing login
- * XXX this is a funny way of getting session context
- */
- function testLogin() {
- $user = self::$users['uploader'];
-
- $params = array(
- 'action' => 'login',
- 'lgname' => $user->username,
- 'lgpassword' => $user->password
- );
- list( $result, , $session ) = $this->doApiRequest( $params );
- $this->assertArrayHasKey( "login", $result );
- $this->assertArrayHasKey( "result", $result['login'] );
- $this->assertEquals( "NeedToken", $result['login']['result'] );
- $token = $result['login']['token'];
-
- $params = array(
- 'action' => 'login',
- 'lgtoken' => $token,
- 'lgname' => $user->username,
- 'lgpassword' => $user->password
- );
- list( $result, , $session ) = $this->doApiRequest( $params, $session );
- $this->assertArrayHasKey( "login", $result );
- $this->assertArrayHasKey( "result", $result['login'] );
- $this->assertEquals( "Success", $result['login']['result'] );
- $this->assertArrayHasKey( 'lgtoken', $result['login'] );
-
- $this->assertNotEmpty( $session, 'API Login must return a session' );
- return $session;
-
- }
-
- /**
- * @depends testLogin
- */
- public function testUploadRequiresToken( $session ) {
- $exception = false;
- try {
- $this->doApiRequest( array(
- 'action' => 'upload'
- ) );
- } catch ( UsageException $e ) {
- $exception = true;
- $this->assertEquals( "The token parameter must be set", $e->getMessage() );
- }
- $this->assertTrue( $exception, "Got exception" );
- }
-
- /**
- * @depends testLogin
- */
- public function testUploadMissingParams( $session ) {
- $exception = false;
- try {
- $this->doApiRequestWithToken( array(
- 'action' => 'upload',
- ), $session, self::$users['uploader']->user );
- } catch ( UsageException $e ) {
- $exception = true;
- $this->assertEquals( "One of the parameters filekey, file, url, statuskey is required",
- $e->getMessage() );
- }
- $this->assertTrue( $exception, "Got exception" );
- }
-
-
- /**
- * @depends testLogin
- */
- public function testUpload( $session ) {
- $extension = 'png';
- $mimeType = 'image/png';
-
- try {
- $randomImageGenerator = new RandomImageGenerator();
- $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
- }
- catch ( Exception $e ) {
- $this->markTestIncomplete( $e->getMessage() );
- }
-
- $filePath = $filePaths[0];
- $fileSize = filesize( $filePath );
- $fileName = basename( $filePath );
-
- $this->deleteFileByFileName( $fileName );
- $this->deleteFileByContent( $filePath );
-
-
- if (! $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath ) ) {
- $this->markTestIncomplete( "Couldn't upload file!\n" );
- }
-
- $params = array(
- 'action' => 'upload',
- 'filename' => $fileName,
- 'file' => 'dummy content',
- 'comment' => 'dummy comment',
- 'text' => "This is the page text for $fileName",
- );
-
- $exception = false;
- try {
- list( $result, , ) = $this->doApiRequestWithToken( $params, $session,
- self::$users['uploader']->user );
- } catch ( UsageException $e ) {
- $exception = true;
- }
- $this->assertTrue( isset( $result['upload'] ) );
- $this->assertEquals( 'Success', $result['upload']['result'] );
- $this->assertEquals( $fileSize, ( int )$result['upload']['imageinfo']['size'] );
- $this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
- $this->assertFalse( $exception );
-
- // clean up
- $this->deleteFileByFilename( $fileName );
- unlink( $filePath );
- }
-
-
- /**
- * @depends testLogin
- */
- public function testUploadZeroLength( $session ) {
- $mimeType = 'image/png';
-
- $filePath = tempnam( wfTempDir(), "" );
- $fileName = "apiTestUploadZeroLength.png";
-
- $this->deleteFileByFileName( $fileName );
-
- if (! $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath ) ) {
- $this->markTestIncomplete( "Couldn't upload file!\n" );
- }
-
- $params = array(
- 'action' => 'upload',
- 'filename' => $fileName,
- 'file' => 'dummy content',
- 'comment' => 'dummy comment',
- 'text' => "This is the page text for $fileName",
- );
-
- $exception = false;
- try {
- $this->doApiRequestWithToken( $params, $session, self::$users['uploader']->user );
- } catch ( UsageException $e ) {
- $this->assertContains( 'The file you submitted was empty', $e->getMessage() );
- $exception = true;
- }
- $this->assertTrue( $exception );
-
- // clean up
- $this->deleteFileByFilename( $fileName );
- unlink( $filePath );
- }
-
-
- /**
- * @depends testLogin
- */
- public function testUploadSameFileName( $session ) {
- $extension = 'png';
- $mimeType = 'image/png';
-
- try {
- $randomImageGenerator = new RandomImageGenerator();
- $filePaths = $randomImageGenerator->writeImages( 2, $extension, wfTempDir() );
- }
- catch ( Exception $e ) {
- $this->markTestIncomplete( $e->getMessage() );
- }
-
- // we'll reuse this filename
- $fileName = basename( $filePaths[0] );
-
- // clear any other files with the same name
- $this->deleteFileByFileName( $fileName );
-
- // we reuse these params
- $params = array(
- 'action' => 'upload',
- 'filename' => $fileName,
- 'file' => 'dummy content',
- 'comment' => 'dummy comment',
- 'text' => "This is the page text for $fileName",
- );
-
- // first upload .... should succeed
-
- if (! $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePaths[0] ) ) {
- $this->markTestIncomplete( "Couldn't upload file!\n" );
- }
-
- $exception = false;
- try {
- list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
- self::$users['uploader']->user );
- } catch ( UsageException $e ) {
- $exception = true;
- }
- $this->assertTrue( isset( $result['upload'] ) );
- $this->assertEquals( 'Success', $result['upload']['result'] );
- $this->assertFalse( $exception );
-
- // second upload with the same name (but different content)
-
- if (! $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePaths[1] ) ) {
- $this->markTestIncomplete( "Couldn't upload file!\n" );
- }
-
- $exception = false;
- try {
- list( $result, , ) = $this->doApiRequestWithToken( $params, $session,
- self::$users['uploader']->user ); // FIXME: leaks a temporary file
- } catch ( UsageException $e ) {
- $exception = true;
- }
- $this->assertTrue( isset( $result['upload'] ) );
- $this->assertEquals( 'Warning', $result['upload']['result'] );
- $this->assertTrue( isset( $result['upload']['warnings'] ) );
- $this->assertTrue( isset( $result['upload']['warnings']['exists'] ) );
- $this->assertFalse( $exception );
-
- // clean up
- $this->deleteFileByFilename( $fileName );
- unlink( $filePaths[0] );
- unlink( $filePaths[1] );
- }
-
-
- /**
- * @depends testLogin
- */
- public function testUploadSameContent( $session ) {
- $extension = 'png';
- $mimeType = 'image/png';
-
- try {
- $randomImageGenerator = new RandomImageGenerator();
- $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
- }
- catch ( Exception $e ) {
- $this->markTestIncomplete( $e->getMessage() );
- }
-
- $fileNames[0] = basename( $filePaths[0] );
- $fileNames[1] = "SameContentAs" . $fileNames[0];
-
- // clear any other files with the same name or content
- $this->deleteFileByContent( $filePaths[0] );
- $this->deleteFileByFileName( $fileNames[0] );
- $this->deleteFileByFileName( $fileNames[1] );
-
- // first upload .... should succeed
-
- $params = array(
- 'action' => 'upload',
- 'filename' => $fileNames[0],
- 'file' => 'dummy content',
- 'comment' => 'dummy comment',
- 'text' => "This is the page text for " . $fileNames[0],
- );
-
- if (! $this->fakeUploadFile( 'file', $fileNames[0], $mimeType, $filePaths[0] ) ) {
- $this->markTestIncomplete( "Couldn't upload file!\n" );
- }
-
- $exception = false;
- try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
- self::$users['uploader']->user );
- } catch ( UsageException $e ) {
- $exception = true;
- }
- $this->assertTrue( isset( $result['upload'] ) );
- $this->assertEquals( 'Success', $result['upload']['result'] );
- $this->assertFalse( $exception );
-
-
- // second upload with the same content (but different name)
-
- if (! $this->fakeUploadFile( 'file', $fileNames[1], $mimeType, $filePaths[0] ) ) {
- $this->markTestIncomplete( "Couldn't upload file!\n" );
- }
-
- $params = array(
- 'action' => 'upload',
- 'filename' => $fileNames[1],
- 'file' => 'dummy content',
- 'comment' => 'dummy comment',
- 'text' => "This is the page text for " . $fileNames[1],
- );
-
- $exception = false;
- try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
- self::$users['uploader']->user ); // FIXME: leaks a temporary file
- } catch ( UsageException $e ) {
- $exception = true;
- }
- $this->assertTrue( isset( $result['upload'] ) );
- $this->assertEquals( 'Warning', $result['upload']['result'] );
- $this->assertTrue( isset( $result['upload']['warnings'] ) );
- $this->assertTrue( isset( $result['upload']['warnings']['duplicate'] ) );
- $this->assertFalse( $exception );
-
- // clean up
- $this->deleteFileByFilename( $fileNames[0] );
- $this->deleteFileByFilename( $fileNames[1] );
- unlink( $filePaths[0] );
- }
-
-
- /**
- * @depends testLogin
- */
- public function testUploadStash( $session ) {
- global $wgUser;
- $wgUser = self::$users['uploader']->user; // @todo FIXME: still used somewhere
-
- $extension = 'png';
- $mimeType = 'image/png';
-
- try {
- $randomImageGenerator = new RandomImageGenerator();
- $filePaths = $randomImageGenerator->writeImages( 1, $extension, wfTempDir() );
- }
- catch ( Exception $e ) {
- $this->markTestIncomplete( $e->getMessage() );
- }
-
- $filePath = $filePaths[0];
- $fileSize = filesize( $filePath );
- $fileName = basename( $filePath );
-
- $this->deleteFileByFileName( $fileName );
- $this->deleteFileByContent( $filePath );
-
- if (! $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath ) ) {
- $this->markTestIncomplete( "Couldn't upload file!\n" );
- }
-
- $params = array(
- 'action' => 'upload',
- 'stash' => 1,
- 'filename' => $fileName,
- 'file' => 'dummy content',
- 'comment' => 'dummy comment',
- 'text' => "This is the page text for $fileName",
- );
-
- $exception = false;
- try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
- self::$users['uploader']->user ); // FIXME: leaks a temporary file
- } catch ( UsageException $e ) {
- $exception = true;
- }
- $this->assertFalse( $exception );
- $this->assertTrue( isset( $result['upload'] ) );
- $this->assertEquals( 'Success', $result['upload']['result'] );
- $this->assertEquals( $fileSize, ( int )$result['upload']['imageinfo']['size'] );
- $this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
- $this->assertTrue( isset( $result['upload']['filekey'] ) );
- $this->assertEquals( $result['upload']['sessionkey'], $result['upload']['filekey'] );
- $filekey = $result['upload']['filekey'];
-
- // it should be visible from Special:UploadStash
- // XXX ...but how to test this, with a fake WebRequest with the session?
-
- // now we should try to release the file from stash
- $params = array(
- 'action' => 'upload',
- 'filekey' => $filekey,
- 'filename' => $fileName,
- 'comment' => 'dummy comment',
- 'text' => "This is the page text for $fileName, altered",
- );
-
- $this->clearFakeUploads();
- $exception = false;
- try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
- self::$users['uploader']->user );
- } catch ( UsageException $e ) {
- $exception = true;
- }
- $this->assertTrue( isset( $result['upload'] ) );
- $this->assertEquals( 'Success', $result['upload']['result'] );
- $this->assertFalse( $exception, "No UsageException exception." );
-
- // clean up
- $this->deleteFileByFilename( $fileName );
- unlink( $filePath );
- }
-
-
- /**
- * @depends testLogin
- */
- public function testUploadChunks( $session ) {
- global $wgUser;
- $wgUser = self::$users['uploader']->user; // @todo FIXME: still used somewhere
-
- $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';
- $filePath = wfTempDir() . '/Oberaargletscher_from_Oberaar.jpg';
- try {
- // Only download if the file is not avaliable in the temp location:
- if( !is_file( $filePath ) ){
- copy($url, $filePath);
- }
- }
- catch ( Exception $e ) {
- $this->markTestIncomplete( $e->getMessage() );
- }
-
- $fileSize = filesize( $filePath );
- $fileName = basename( $filePath );
-
- $this->deleteFileByFileName( $fileName );
- $this->deleteFileByContent( $filePath );
-
- // Base upload params:
- $params = array(
- 'action' => 'upload',
- 'stash' => 1,
- 'filename' => $fileName,
- 'filesize' => $fileSize,
- 'offset' => 0,
- );
-
- // Upload chunks
- $chunkSessionKey = false;
- $resultOffset = 0;
- // Open the file:
- $handle = @fopen ($filePath, "r");
- if( $handle === false ){
- $this->markTestIncomplete( "could not open file: $filePath" );
- }
- while (!feof ($handle)) {
- // Get the current chunk
- $chunkData = @fread( $handle, $chunkSize );
-
- // Upload the current chunk into the $_FILE object:
- $this->fakeUploadChunk( 'chunk', 'blob', $mimeType, $chunkData );
-
- // Check for chunkSessionKey
- if( !$chunkSessionKey ){
- // Upload fist chunk ( and get the session key )
- try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
- self::$users['uploader']->user );
- } catch ( UsageException $e ) {
- $this->markTestIncomplete( $e->getMessage() );
- }
- // Make sure we got a valid chunk continue:
- $this->assertTrue( isset( $result['upload'] ) );
- $this->assertTrue( isset( $result['upload']['filekey'] ) );
- // If we don't get a session key mark test incomplete.
- if( ! isset( $result['upload']['filekey'] ) ){
- $this->markTestIncomplete( "no filekey provided" );
- }
- $chunkSessionKey = $result['upload']['filekey'];
- $this->assertEquals( 'Continue', $result['upload']['result'] );
- // First chunk should have chunkSize == offset
- $this->assertEquals( $chunkSize, $result['upload']['offset'] );
- $resultOffset = $result['upload']['offset'];
- continue;
- }
- // 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'] )
- $params['offset'] += $chunkSize;
- // Make sure param offset is insync with resultOffset:
- $this->assertEquals( $resultOffset, $params['offset'] );
- // Upload current chunk
- try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
- self::$users['uploader']->user );
- } catch ( UsageException $e ) {
- $this->markTestIncomplete( $e->getMessage() );
- }
- // Make sure we got a valid chunk continue:
- $this->assertTrue( isset( $result['upload'] ) );
- $this->assertTrue( isset( $result['upload']['filekey'] ) );
-
- // Check if we were on the last chunk:
- if( $params['offset'] + $chunkSize >= $fileSize ){
- $this->assertEquals( 'Success', $result['upload']['result'] );
- break;
- } else {
- $this->assertEquals( 'Continue', $result['upload']['result'] );
- // update $resultOffset
- $resultOffset = $result['upload']['offset'];
- }
- }
- fclose ($handle);
-
- // Check that we got a valid file result:
- 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'] ) );
- $filekey = $result['upload']['filekey'];
-
- // Now we should try to release the file from stash
- $params = array(
- 'action' => 'upload',
- 'filekey' => $filekey,
- 'filename' => $fileName,
- 'comment' => 'dummy comment',
- 'text' => "This is the page text for $fileName, altered",
- );
- $this->clearFakeUploads();
- $exception = false;
- try {
- list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
- self::$users['uploader']->user );
- } catch ( UsageException $e ) {
- $exception = true;
- }
- $this->assertTrue( isset( $result['upload'] ) );
- $this->assertEquals( 'Success', $result['upload']['result'] );
- $this->assertFalse( $exception );
-
- // clean up
- $this->deleteFileByFilename( $fileName );
- // don't remove downloaded temporary file for fast subquent tests.
- //unlink( $filePath );
- }
-}
diff --git a/tests/phpunit/includes/api/ApiWatchTest.php b/tests/phpunit/includes/api/ApiWatchTest.php
deleted file mode 100644
index d2e98152..00000000
--- a/tests/phpunit/includes/api/ApiWatchTest.php
+++ /dev/null
@@ -1,176 +0,0 @@
-<?php
-
-/**
- * @group API
- * @group Database
- * @todo This test suite is severly broken and need a full review
- */
-class ApiWatchTest extends ApiTestCase {
-
- function setUp() {
- parent::setUp();
- $this->doLogin();
- }
-
- function getTokens() {
- $data = $this->getTokenList( self::$users['sysop'] );
-
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
- $pageinfo = $data[0]['query']['pages'][$key];
-
- return $pageinfo;
- }
-
- /**
- */
- function testWatchEdit() {
- $pageinfo = $this->getTokens();
-
- $data = $this->doApiRequest( array(
- 'action' => 'edit',
- 'title' => 'UTPage',
- 'text' => 'new text',
- 'token' => $pageinfo['edittoken'],
- 'watchlist' => 'watch' ) );
- $this->assertArrayHasKey( 'edit', $data[0] );
- $this->assertArrayHasKey( 'result', $data[0]['edit'] );
- $this->assertEquals( 'Success', $data[0]['edit']['result'] );
-
- return $data;
- }
-
- /**
- * @depends testWatchEdit
- */
- function testWatchClear() {
-
- $pageinfo = $this->getTokens();
-
- $data = $this->doApiRequest( array(
- 'action' => 'query',
- 'list' => 'watchlist' ) );
-
- if ( isset( $data[0]['query']['watchlist'] ) ) {
- $wl = $data[0]['query']['watchlist'];
-
- foreach ( $wl as $page ) {
- $data = $this->doApiRequest( array(
- 'action' => 'watch',
- 'title' => $page['title'],
- 'unwatch' => true,
- 'token' => $pageinfo['watchtoken'] ) );
- }
- }
- $data = $this->doApiRequest( array(
- 'action' => 'query',
- 'list' => 'watchlist' ), $data );
- $this->assertArrayHasKey( 'query', $data[0] );
- $this->assertArrayHasKey( 'watchlist', $data[0]['query'] );
- $this->assertEquals( 0, count( $data[0]['query']['watchlist'] ) );
-
- return $data;
- }
-
- /**
- */
- function testWatchProtect() {
-
- $pageinfo = $this->getTokens();
-
- $data = $this->doApiRequest( array(
- 'action' => 'protect',
- 'token' => $pageinfo['protecttoken'],
- 'title' => 'UTPage',
- 'protections' => 'edit=sysop',
- 'watchlist' => 'unwatch' ) );
-
- $this->assertArrayHasKey( 'protect', $data[0] );
- $this->assertArrayHasKey( 'protections', $data[0]['protect'] );
- $this->assertEquals( 1, count( $data[0]['protect']['protections'] ) );
- $this->assertArrayHasKey( 'edit', $data[0]['protect']['protections'][0] );
- }
-
- /**
- */
- function testGetRollbackToken() {
-
- $pageinfo = $this->getTokens();
-
- if ( !Title::newFromText( 'UTPage' )->exists() ) {
- $this->markTestSkipped( "The article [[UTPage]] does not exist" ); //TODO: just create it?
- }
-
- $data = $this->doApiRequest( array(
- 'action' => 'query',
- 'prop' => 'revisions',
- 'titles' => 'UTPage',
- 'rvtoken' => 'rollback' ) );
-
- $this->assertArrayHasKey( 'query', $data[0] );
- $this->assertArrayHasKey( 'pages', $data[0]['query'] );
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
-
- if ( isset( $data[0]['query']['pages'][$key]['missing'] ) ) {
- $this->markTestSkipped( "Target page (UTPage) doesn't exist" );
- }
-
- $this->assertArrayHasKey( 'pageid', $data[0]['query']['pages'][$key] );
- $this->assertArrayHasKey( 'revisions', $data[0]['query']['pages'][$key] );
- $this->assertArrayHasKey( 0, $data[0]['query']['pages'][$key]['revisions'] );
- $this->assertArrayHasKey( 'rollbacktoken', $data[0]['query']['pages'][$key]['revisions'][0] );
-
- return $data;
- }
-
- /**
- * @group Broken
- * Broken because there is currently no revision info in the $pageinfo
- *
- * @depends testGetRollbackToken
- */
- function testWatchRollback( $data ) {
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
- $pageinfo = $data[0]['query']['pages'][$key];
- $revinfo = $pageinfo['revisions'][0];
-
- try {
- $data = $this->doApiRequest( array(
- 'action' => 'rollback',
- 'title' => 'UTPage',
- 'user' => $revinfo['user'],
- 'token' => $pageinfo['rollbacktoken'],
- 'watchlist' => 'watch' ) );
-
- $this->assertArrayHasKey( 'rollback', $data[0] );
- $this->assertArrayHasKey( 'title', $data[0]['rollback'] );
- } catch( UsageException $ue ) {
- if( $ue->getCodeString() == 'onlyauthor' ) {
- $this->markTestIncomplete( "Only one author to 'UTPage', cannot test rollback" );
- } else {
- $this->fail( "Received error '" . $ue->getCodeString() . "'" );
- }
- }
- }
-
- /**
- */
- function testWatchDelete() {
- $pageinfo = $this->getTokens();
-
- $data = $this->doApiRequest( array(
- 'action' => 'delete',
- 'token' => $pageinfo['deletetoken'],
- 'title' => 'UTPage' ) );
- $this->assertArrayHasKey( 'delete', $data[0] );
- $this->assertArrayHasKey( 'title', $data[0]['delete'] );
-
- $data = $this->doApiRequest( array(
- 'action' => 'query',
- 'list' => 'watchlist' ) );
-
- $this->markTestIncomplete( 'This test needs to verify the deleted article was added to the users watchlist' );
- }
-}
diff --git a/tests/phpunit/includes/api/PrefixUniquenessTest.php b/tests/phpunit/includes/api/PrefixUniquenessTest.php
deleted file mode 100644
index 69b01ea7..00000000
--- a/tests/phpunit/includes/api/PrefixUniquenessTest.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-/**
- * Checks that all API query modules, core and extensions, have unique prefixes
- * @group API
- */
-class PrefixUniquenessTest extends MediaWikiTestCase {
- public function testPrefixes() {
- $main = new ApiMain( new FauxRequest() );
- $query = new ApiQuery( $main, 'foo', 'bar' );
- $modules = $query->getModules();
- $prefixes = array();
-
- foreach ( $modules as $name => $class ) {
- $module = new $class( $main, $name );
- $prefix = $module->getModulePrefix();
- if ( isset( $prefixes[$prefix] ) ) {
- $this->fail( "Module prefix '{$prefix}' is shared between {$class} and {$prefixes[$prefix]}" );
- }
- $prefixes[$module->getModulePrefix()] = $class;
- }
- $this->assertTrue( true ); // dummy call to make this test non-incomplete
- }
-}
diff --git a/tests/phpunit/includes/api/RandomImageGenerator.php b/tests/phpunit/includes/api/RandomImageGenerator.php
deleted file mode 100644
index 8b6a3849..00000000
--- a/tests/phpunit/includes/api/RandomImageGenerator.php
+++ /dev/null
@@ -1,463 +0,0 @@
-<?php
-
-/**
- * RandomImageGenerator -- does what it says on the tin.
- * 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)
- *
- * 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.
- *
- * @file
- * @author Neil Kandalgaonkar <neilk@wikimedia.org>
- */
-
-/**
- * RandomImageGenerator: does what it says on the tin.
- * 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 ;
- private $minHeight = 400 ;
- private $maxHeight = 800 ;
- 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)
- */
- private static $orientations = array(
- array(
- '0thRow' => 'top',
- '0thCol' => 'left',
- 'exifCode' => 1,
- 'counterRotation' => array( array( 1, 0 ), array( 0, 1 ) )
- ),
- array(
- '0thRow' => 'bottom',
- '0thCol' => 'right',
- 'exifCode' => 3,
- 'counterRotation' => array( array( -1, 0 ), array( 0, -1 ) )
- ),
- array(
- '0thRow' => 'right',
- '0thCol' => 'top',
- 'exifCode' => 6,
- 'counterRotation' => array( array( 0, 1 ), array( 1, 0 ) )
- ),
- array(
- '0thRow' => 'left',
- '0thCol' => 'bottom',
- 'exifCode' => 8,
- 'counterRotation' => array( array( 0, -1 ), array( -1, 0 ) )
- )
- );
-
-
- public function __construct( $options = array() ) {
- foreach ( array( 'dictionaryFile', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight', 'shapesToDraw' ) as $property ) {
- if ( isset( $options[$property] ) ) {
- $this->$property = $options[$property];
- }
- }
-
- // find the dictionary file, to generate random names
- if ( !isset( $this->dictionaryFile ) ) {
- foreach ( array(
- '/usr/share/dict/words',
- '/usr/dict/words',
- __DIR__ . '/words.txt' )
- as $dictionaryFile ) {
- if ( is_file( $dictionaryFile ) and is_readable( $dictionaryFile ) ) {
- $this->dictionaryFile = $dictionaryFile;
- break;
- }
- }
- }
- if ( !isset( $this->dictionaryFile ) ) {
- 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
- *
- * @param $number Integer: number of filenames to write
- * @param $format String: optional, must be understood by ImageMagick, such as 'jpg' or 'gif'
- * @param $dir String: directory, optional (will default to current working directory)
- * @return Array: filenames we just wrote
- */
- function writeImages( $number, $format = 'jpg', $dir = null ) {
- $filenames = $this->getRandomFilenames( $number, $format, $dir );
- $imageWriteMethod = $this->getImageWriteMethod( $format );
- foreach( $filenames as $filename ) {
- $this->{$imageWriteMethod}( $this->getImageSpec(), $format, $filename );
- }
- return $filenames;
- }
-
-
- /**
- * Figure out how we write images. This is a factor of both format and the local system
- * @param $format (a typical extension like 'svg', 'jpg', etc.)
- */
- function getImageWriteMethod( $format ) {
- global $wgUseImageMagick, $wgImageMagickConvertCommand;
- if ( $format === 'svg' ) {
- return 'writeSvg';
- } else {
- // figure out how to write images
- global $wgExiv2Command;
- if ( class_exists( 'Imagick' ) && $wgExiv2Command && is_executable( $wgExiv2Command ) ) {
- return 'writeImageWithApi';
- } elseif ( $wgUseImageMagick && $wgImageMagickConvertCommand && is_executable( $wgImageMagickConvertCommand ) ) {
- return 'writeImageWithCommandLine';
- }
- }
- throw new Exception( "RandomImageGenerator: could not find a suitable method to write images in '$format' format" );
- }
-
- /**
- * Return a number of randomly-generated filenames
- * Each filename uses two words randomly drawn from the dictionary, like elephantine_spatula.jpg
- *
- * @param $number Integer: of filenames to generate
- * @param $extension String: optional, defaults to 'jpg'
- * @param $dir String: optional, defaults to current working directory
- * @return Array: of filenames
- */
- private function getRandomFilenames( $number, $extension = 'jpg', $dir = null ) {
- if ( is_null( $dir ) ) {
- $dir = getcwd();
- }
- $filenames = array();
- foreach( $this->getRandomWordPairs( $number ) as $pair ) {
- $basename = $pair[0] . '_' . $pair[1];
- if ( !is_null( $extension ) ) {
- $basename .= '.' . $extension;
- }
- $basename = preg_replace( '/\s+/', '', $basename );
- $filenames[] = "$dir/$basename";
- }
-
- return $filenames;
-
- }
-
-
- /**
- * 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}
- */
- public function getImageSpec() {
- $spec = array();
-
- $spec['width'] = mt_rand( $this->minWidth, $this->maxWidth );
- $spec['height'] = mt_rand( $this->minHeight, $this->maxHeight );
- $spec['fill'] = $this->getRandomColor();
-
- $diagonalLength = sqrt( pow( $spec['width'], 2 ) + pow( $spec['height'], 2 ) );
-
- $draws = array();
- for ( $i = 0; $i <= $this->shapesToDraw; $i++ ) {
- $radius = mt_rand( 0, $diagonalLength / 4 );
- if ( $radius == 0 ) {
- continue;
- }
- $originX = mt_rand( -1 * $radius, $spec['width'] + $radius );
- $originY = mt_rand( -1 * $radius, $spec['height'] + $radius );
- $angle = mt_rand( 0, ( 3.141592/2 ) * $radius ) / $radius;
- $legDeltaX = round( $radius * sin( $angle ) );
- $legDeltaY = round( $radius * cos( $angle ) );
-
- $draw = array();
- $draw['fill'] = $this->getRandomColor();
- $draw['shape'] = array(
- array( 'x' => $originX, 'y' => $originY - $radius ),
- array( 'x' => $originX + $legDeltaX, 'y' => $originY + $legDeltaY ),
- array( 'x' => $originX - $legDeltaX, 'y' => $originY + $legDeltaY ),
- array( 'x' => $originX, 'y' => $originY - $radius )
- );
- $draws[] = $draw;
-
- }
-
- $spec['draws'] = $draws;
-
- return $spec;
- }
-
- /**
- * Given array( array('x' => 10, 'y' => 20), array( 'x' => 30, y=> 5 ) )
- * returns "10,20 30,5"
- * Useful for SVG and imagemagick command line arguments
- * @param $shape: Array of arrays, each array containing x & y keys mapped to numeric values
- * @return string
- */
- static function shapePointsToString( $shape ) {
- $points = array();
- foreach ( $shape as $point ) {
- $points[] = $point['x'] . ',' . $point['y'];
- }
- return join( " ", $points );
- }
-
- /**
- * Based on image specification, write a very simple SVG file to disk.
- * Ignores the background spec because transparency is cool. :)
- * @param $spec: spec describing background and shapes to draw
- * @param $format: file format to write (which is obviously always svg here)
- * @param $filename: filename to write to
- */
- public function writeSvg( $spec, $format, $filename ) {
- $svg = new SimpleXmlElement( '<svg/>' );
- $svg->addAttribute( 'xmlns', 'http://www.w3.org/2000/svg' );
- $svg->addAttribute( 'version', '1.1' );
- $svg->addAttribute( 'width', $spec['width'] );
- $svg->addAttribute( 'height', $spec['height'] );
- $g = $svg->addChild( 'g' );
- foreach ( $spec['draws'] as $drawSpec ) {
- $shape = $g->addChild( 'polygon' );
- $shape->addAttribute( 'fill', $drawSpec['fill'] );
- $shape->addAttribute( 'points', self::shapePointsToString( $drawSpec['shape'] ) );
- };
- if ( ! $fh = fopen( $filename, 'w' ) ) {
- throw new Exception( "couldn't open $filename for writing" );
- }
- fwrite( $fh, $svg->asXML() );
- if ( !fclose($fh) ) {
- throw new Exception( "couldn't close $filename" );
- }
- }
-
- /**
- * Based on an image specification, write such an image to disk, using Imagick PHP extension
- * @param $spec: spec describing background and circles to draw
- * @param $format: file format to write
- * @param $filename: filename to write to
- */
- public function writeImageWithApi( $spec, $format, $filename ) {
- // this is a hack because I can't get setImageOrientation() to work. See below.
- global $wgExiv2Command;
-
- $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
- */
- $orientation = self::$orientations[0]; // default is normal orientation
- if ( $format == 'jpg' ) {
- $orientation = self::$orientations[ array_rand( self::$orientations ) ];
- $spec = self::rotateImageSpec( $spec, $orientation['counterRotation'] );
- }
-
- $image->newImage( $spec['width'], $spec['height'], new ImagickPixel( $spec['fill'] ) );
-
- foreach ( $spec['draws'] as $drawSpec ) {
- $draw = new ImagickDraw();
- $draw->setFillColor( $drawSpec['fill'] );
- $draw->polygon( $drawSpec['shape'] );
- $image->drawImage( $draw );
- }
-
- $image->setImageFormat( $format );
-
- // this doesn't work, even though it's documented to do so...
- // $image->setImageOrientation( $orientation['exifCode'] );
-
- $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)
- if ( $wgExiv2Command ) {
- $cmd = wfEscapeShellArg( $wgExiv2Command )
- . " -M "
- . wfEscapeShellArg( "set Exif.Image.Orientation " . $orientation['exifCode'] )
- . " "
- . wfEscapeShellArg( $filename );
-
- $retval = 0;
- $err = wfShellExec( $cmd, $retval );
- if ( $retval !== 0 ) {
- print "Error with $cmd: $retval, $err\n";
- }
- }
- }
-
- /**
- * Given an image specification, produce rotated version
- * This is used when simulating a rotated image capture with EXIF orientation
- * @param $spec Object returned by getImageSpec
- * @param $matrix 2x2 transformation matrix
- * @return transformed Spec
- */
- private static function rotateImageSpec( &$spec, $matrix ) {
- $tSpec = array();
- $dims = self::matrixMultiply2x2( $matrix, $spec['width'], $spec['height'] );
- $correctionX = 0;
- $correctionY = 0;
- if ( $dims['x'] < 0 ) {
- $correctionX = abs( $dims['x'] );
- }
- if ( $dims['y'] < 0 ) {
- $correctionY = abs( $dims['y'] );
- }
- $tSpec['width'] = abs( $dims['x'] );
- $tSpec['height'] = abs( $dims['y'] );
- $tSpec['fill'] = $spec['fill'];
- $tSpec['draws'] = array();
- foreach( $spec['draws'] as $draw ) {
- $tDraw = array(
- 'fill' => $draw['fill'],
- 'shape' => array()
- );
- foreach( $draw['shape'] as $point ) {
- $tPoint = self::matrixMultiply2x2( $matrix, $point['x'], $point['y'] );
- $tPoint['x'] += $correctionX;
- $tPoint['y'] += $correctionY;
- $tDraw['shape'][] = $tPoint;
- }
- $tSpec['draws'][] = $tDraw;
- }
- return $tSpec;
- }
-
- /**
- * Given a matrix and a pair of images, return new position
- * @param $matrix: 2x2 rotation matrix
- * @param $x: x-coordinate number
- * @param $y: y-coordinate number
- * @return Array transformed with properties x, y
- */
- private static function matrixMultiply2x2( $matrix, $x, $y ) {
- return array(
- 'x' => $x * $matrix[0][0] + $y * $matrix[0][1],
- 'y' => $x * $matrix[1][0] + $y * $matrix[1][1]
- );
- }
-
-
- /**
- * 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) \
- * -draw 'fill rgb(12,34,56) polygon 41,39 44,57 50,57 41,39' \
- * -draw 'fill rgb(99,123,231) circle 59,39 56,57' \
- * -draw 'fill rgb(240,12,32) circle 50,21 50,3' filename.png
- *
- * @param $spec: spec describing background and shapes to draw
- * @param $format: file format to write (unused by this method but kept so it has the same signature as writeImageWithApi)
- * @param $filename: filename to write to
- */
- public function writeImageWithCommandLine( $spec, $format, $filename ) {
- global $wgImageMagickConvertCommand;
- $args = array();
- $args[] = "-size " . wfEscapeShellArg( $spec['width'] . 'x' . $spec['height'] );
- $args[] = wfEscapeShellArg( "xc:" . $spec['fill'] );
- foreach( $spec['draws'] as $draw ) {
- $fill = $draw['fill'];
- $polygon = self::shapePointsToString( $draw['shape'] );
- $drawCommand = "fill $fill polygon $polygon";
- $args[] = '-draw ' . wfEscapeShellArg( $drawCommand );
- }
- $args[] = wfEscapeShellArg( $filename );
-
- $command = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " . implode( " ", $args );
- $retval = null;
- wfShellExec( $command, $retval );
- return ( $retval === 0 );
- }
-
- /**
- * Generate a string of random colors for ImageMagick or SVG, like "rgb(12, 37, 98)"
- *
- * @return {String}
- */
- public function getRandomColor() {
- $components = array();
- for ($i = 0; $i <= 2; $i++ ) {
- $components[] = mt_rand( 0, 255 );
- }
- return 'rgb(' . join(', ', $components) . ')';
- }
-
- /**
- * Get an array of random pairs of random words, like array( array( 'foo', 'bar' ), array( 'quux', 'baz' ) );
- *
- * @param $number Integer: number of pairs
- * @return Array: of two-element arrays
- */
- private function getRandomWordPairs( $number ) {
- $lines = $this->getRandomLines( $number * 2 );
- // construct pairs of words
- $pairs = array();
- $count = count( $lines );
- for( $i = 0; $i < $count; $i += 2 ) {
- $pairs[] = array( $lines[$i], $lines[$i+1] );
- }
- return $pairs;
- }
-
-
- /**
- * Return N random lines from a file
- *
- * Will throw exception if the file could not be read or if it had fewer lines than requested.
- *
- * @param $number_desired Integer: number of lines desired
- * @return Array: of exactly n elements, drawn randomly from lines the file
- */
- private function getRandomLines( $number_desired ) {
- $filepath = $this->dictionaryFile;
-
- // initialize array of lines
- $lines = array();
- for ( $i = 0; $i < $number_desired; $i++ ) {
- $lines[] = null;
- }
-
- /*
- * 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 ) {
- throw new Exception( "couldn't open $filepath" );
- }
- $line_number = 0;
- $max_index = $number_desired - 1;
- while( !feof( $fh ) ) {
- $line = fgets( $fh );
- if ( $line !== false ) {
- $line_number++;
- $line = trim( $line );
- if ( mt_rand( 0, $line_number ) <= $max_index ) {
- $lines[ mt_rand( 0, $max_index ) ] = $line;
- }
- }
- }
- fclose( $fh );
- if ( $line_number < $number_desired ) {
- throw new Exception( "not enough lines in $filepath" );
- }
-
- return $lines;
- }
-
-}
diff --git a/tests/phpunit/includes/api/format/ApiFormatPhpTest.php b/tests/phpunit/includes/api/format/ApiFormatPhpTest.php
deleted file mode 100644
index 8209f591..00000000
--- a/tests/phpunit/includes/api/format/ApiFormatPhpTest.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-/**
- * @group API
- * @group Database
- */
-class ApiFormatPhpTest extends ApiFormatTestBase {
-
- function testValidPhpSyntax() {
-
- $data = $this->apiRequest( 'php', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
-
- $this->assertInternalType( 'array', unserialize( $data ) );
- $this->assertGreaterThan( 0, count( (array) $data ) );
-
-
- }
-
-}
diff --git a/tests/phpunit/includes/api/format/ApiFormatTestBase.php b/tests/phpunit/includes/api/format/ApiFormatTestBase.php
deleted file mode 100644
index a0b7b020..00000000
--- a/tests/phpunit/includes/api/format/ApiFormatTestBase.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-abstract class ApiFormatTestBase extends ApiTestCase {
- protected function apiRequest( $format, $params, $data = null ) {
- $data = parent::doApiRequest( $params, $data, true );
-
- $module = $data[3];
-
- $printer = $module->createPrinterByName( $format );
- $printer->setUnescapeAmps( false );
-
- $printer->initPrinter( false );
-
- ob_start();
- $printer->execute();
- $out = ob_get_clean();
-
- $printer->closePrinter();
-
- return $out;
- }
-}
diff --git a/tests/phpunit/includes/api/generateRandomImages.php b/tests/phpunit/includes/api/generateRandomImages.php
deleted file mode 100644
index ee345623..00000000
--- a/tests/phpunit/includes/api/generateRandomImages.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * Bootstrapping for test image file generation
- *
- * @file
- */
-
-// Evaluate the include path relative to this file
-$IP = dirname( dirname( dirname( dirname( __DIR__ ) ) ) );
-
-// Start up MediaWiki in command-line mode
-require_once( "$IP/maintenance/Maintenance.php" );
-require( __DIR__ . "/RandomImageGenerator.php" );
-
-class GenerateRandomImages extends Maintenance {
-
- public function getDbType() {
- return Maintenance::DB_NONE;
- }
-
- public function execute() {
-
- $getOptSpec = array(
- 'dictionaryFile::',
- 'minWidth::',
- 'maxWidth::',
- 'minHeight::',
- 'maxHeight::',
- 'shapesToDraw::',
- 'shape::',
-
- 'number::',
- 'format::'
- );
- $options = getopt( null, $getOptSpec );
-
- $format = isset( $options['format'] ) ? $options['format'] : 'jpg';
- unset( $options['format'] );
-
- $number = isset( $options['number'] ) ? intval( $options['number'] ) : 10;
- unset( $options['number'] );
-
- $randomImageGenerator = new RandomImageGenerator( $options );
- $randomImageGenerator->writeImages( $number, $format );
- }
-}
-
-$maintClass = 'GenerateRandomImages';
-require( RUN_MAINTENANCE_IF_MAIN );
-
-
diff --git a/tests/phpunit/includes/api/words.txt b/tests/phpunit/includes/api/words.txt
deleted file mode 100644
index 7ce23ee3..00000000
--- a/tests/phpunit/includes/api/words.txt
+++ /dev/null
@@ -1,1000 +0,0 @@
-Andaquian
-Anoplanthus
-Araquaju
-Astrophyton
-Avarish
-Batonga
-Bdellidae
-Betoyan
-Bismarck
-Britishness
-Carmen
-Chatillon
-Clement
-Coryphaena
-Croton
-Cyrillianism
-Dagomba
-Decimus
-Dichorisandra
-Duculinae
-Empusa
-Escallonia
-Fathometer
-Fon
-Fundulinae
-Gadswoons
-Gederathite
-Gemini
-Gerbera
-Gregarinida
-Gyracanthus
-Halopsychidae
-Hasidim
-Hemerobius
-Ichthyosauridae
-Iscariot
-Jeames
-Jesuitry
-Jovian
-Judaization
-Katie
-Ladin
-Langhian
-Lapithaean
-Lisette
-Macrochira
-Malaxis
-Malvastrum
-Maranhao
-Marxian
-Maurist
-Metrosideros
-Micky
-Microsporon
-Odacidae
-Ophiuchid
-Osmorhiza
-Paguma
-Palesman
-Papayaceae
-Pastinaca
-Philoxenian
-Pleurostigma
-Rarotongan
-Rhodoraceae
-Rong
-Saho
-Sanyakoan
-Sardanapalian
-Sauropoda
-Sedentaria
-Shambu
-Shukulumbwe
-Solonian
-Spaniardization
-Spirochaetaceae
-Stomatopoda
-Stratiotes
-Taiwanhemp
-Titanically
-Venetianed
-Victrola
-Yuman
-abatis
-abaton
-abjoint
-acanthoma
-acari
-acceptance
-actinography
-acuteness
-addiment
-adelite
-adelomorphic
-adelphogamy
-adipocele
-aelurophobia
-affined
-aflaunt
-agathokakological
-aischrolatreia
-alarmedly
-alebench
-aleurone
-allelotropic
-allerion
-alloplastic
-allowable
-alternacy
-alternariose
-altricial
-ambitionist
-amendment
-amiableness
-amicableness
-ammo
-amortizable
-anchorate
-anemometrically
-angelocracy
-angelological
-anodal
-anomalure
-antedate
-antiagglutinin
-antirationalist
-antiscorbutic
-antisplasher
-antithesize
-antiunionist
-antoecian
-apolegamic
-appropriation
-archididascalian
-archival
-arteriophlebotomy
-articulable
-asseveration
-assignation
-atelo
-atrienses
-atrophy
-atterminement
-atypic
-automower
-aveloz
-awrist
-azteca
-bairnteam
-balsamweed
-bannerman
-beardy
-becry
-beek
-beggarwise
-bescab
-bestness
-bethel
-bewildering
-bibliophilism
-bitterblain
-blakeberyed
-boccarella
-bocedization
-boobyalla
-bourbon
-bowbent
-bowerbird
-brachygnathous
-brail
-branchiferous
-brelaw
-brew
-brideweed
-bridgeable
-brombenzamide
-buddler
-burbankian
-burr
-buskin
-cacochymical
-calefactory
-caliper
-canaliculus
-candidature
-canellaceous
-canniness
-canning
-cantilene
-carbonatation
-carthamic
-caseum
-caudated
-causationist
-ceruleite
-chalder
-chalta
-charmel
-chekan
-chillness
-chirogymnast
-chirpling
-chlorinous
-cholanthrene
-chondroblast
-chromatography
-chromophilous
-chronical
-cicatrice
-cinchonine
-city
-clubbing
-coastal
-coaxially
-coercible
-coeternity
-coff
-coinventor
-collyba
-combinator
-complanation
-comprehensibility
-conchuela
-congenital
-context
-contranatural
-corallum
-cordately
-cornupete
-corolliferous
-coroneted
-corticosterone
-coseat
-cottage
-crocetin
-crossleted
-crottels
-curvedness
-cycadeous
-cyclism
-cylindrically
-cynanche
-cyrtoceratitic
-cystospasm
-danceress
-dancette
-dawny
-daydreamy
-debar
-decarburization
-decorousness
-decrepitness
-delirious
-deozonizer
-dermatosis
-desma
-deutencephalic
-diacetate
-diarthrodial
-diathermy
-dicolic
-dimastigate
-dimidiation
-dipetto
-disavowable
-disintrench
-disman
-dismay
-disorder
-disoxygenation
-dithionous
-dogman
-dragonfly
-dramatical
-drawspan
-drubbly
-drunk
-duskly
-ecderonic
-ectocuniform
-ectocyst
-ehrwaldite
-electrocute
-elemicin
-embracing
-emotionality
-enactment
-enamor
-enclave
-endameba
-endochylous
-endocrinologist
-endolymph
-endothecal
-entasia
-epigeous
-episcopicide
-epitrichial
-erminee
-erraticalness
-eruptivity
-erythrocytoschisis
-esperance
-estuous
-eucrystalline
-eugeny
-evacuant
-everbloomer
-evocation
-exarchateship
-exasperate
-excorticate
-excrementary
-exile
-expandedly
-exponency
-expressionist
-expulsion
-extemporary
-extollation
-extortive
-extrabulbar
-extraprostatic
-facticide
-fairer
-fakery
-fasibitikite
-fatiscent
-fearless
-febrifuge
-ferie
-fibrousness
-fingered
-fisheye
-flagpole
-flagrantness
-fleche
-fluidism
-folliculin
-footbreadth
-forceps
-forecontrive
-forthbring
-foveated
-fuchsin
-fungicidal
-funori
-gamelang
-gametically
-garvanzo
-gasoliner
-gastrophile
-germproof
-gerontism
-gigantical
-glaciology
-godmotherhood
-gooseherd
-gordunite
-gove
-gracilis
-greathead
-grieveship
-guidable
-gyromancy
-gyrostat
-habitus
-hailweed
-handhole
-hangalai
-haznadar
-heliced
-hemihypertrophy
-hemimorphic
-hemistrumectomy
-heptavalent
-heptite
-herbalist
-herpetology
-hesperid
-hexacarbon
-hieromnemon
-hobbyless
-holodactylic
-homoeoarchy
-hopperings
-hospitable
-houseboat
-huh
-huntedly
-hydroponics
-hydrosomal
-hyperdactylia
-hyperperistalsis
-hypogeocarpous
-ideogram
-idiopathical
-illegitimate
-imambarah
-impotently
-improvise
-impuberal
-inaccurately
-incarnant
-inchoation
-incliner
-incredulous
-indiscriminateness
-indulgenced
-inebriation
-inexpressiveness
-infibulate
-inflectedness
-iniome
-ink
-inquietly
-insaturable
-insinuative
-instiller
-institutive
-insultproof
-interactionist
-intercensal
-interpenetrable
-intertranspicuous
-intrinsicality
-inwards
-iridiocyte
-iridoparalysis
-irreportable
-isoprene
-isosmotic
-izard
-jacuaru
-jaculative
-jerkined
-joe
-joyous
-julienne
-justicehood
-kali
-kalidium
-katha
-kathal
-keelage
-keratomycosis
-khaki
-khedival
-kinkily
-knife
-kolo
-kraken
-kwarta
-labba
-labber
-laboress
-lacunar
-latch
-lauric
-lawter
-lectotype
-leeches
-legible
-lepidosteoid
-leucobasalt
-leverer
-libellate
-limnimeter
-lithography
-lithotypic
-locomotor
-logarithmetically
-logistician
-lyncine
-lysogenesis
-machan
-macromyelon
-maharana
-mandibulate
-manganapatite
-marchpane
-mas
-masochistic
-mastaba
-matching
-meditatively
-megalopolitan
-melaniline
-mentum
-mercaptides
-mestome
-metasomatism
-meterless
-micronuclear
-micropetalous
-microreaction
-microsporophore
-mileway
-milliarium
-millisecond
-misbind
-miscollocation
-misreader
-modernicide
-modification
-modulant
-monkfish
-monoamino
-monocarbide
-monographical
-morphinomaniac
-mullein
-munge
-mutilate
-mycophagist
-myelosarcoma
-myospasm
-myriadly
-nagaika
-naphthionate
-natant
-naviculaeform
-nayward
-neallotype
-necrophilia
-nectared
-neigher
-neogamous
-neurodynia
-neurorthopteran
-nidation
-nieceship
-nitrobacteria
-nitrosification
-nogheaded
-nonassertive
-noneuphonious
-nonextant
-nonincrease
-nonintermittent
-nonmetallic
-nonprehensile
-nonremunerative
-nonsocial
-nonvesting
-noontime
-noreaster
-nounal
-nub
-nucleoplasm
-nullisome
-numero
-numerous
-oblongatal
-observe
-obtusilingual
-obvert
-occipitoatlantal
-oceanside
-ochlophobist
-odontiasis
-opalescence
-opticon
-oraculousness
-orarium
-organically
-orthopedically
-ostosis
-overadvance
-overbuilt
-overdiscouragement
-overdoer
-overhardy
-overjocular
-overmagnify
-overofficered
-overpotent
-overprizer
-overrunner
-overshrink
-oversimply
-oversplash
-ovology
-oxskin
-oxychloride
-oxygenant
-ozokerite
-pactional
-palaeoanthropography
-palaeographical
-palaeopsychology
-palliasse
-palpebral
-pandaric
-pantelegraph
-papicolist
-papulate
-parakinetic
-parasitism
-parochialic
-parochialize
-passionlike
-patch
-paucidentate
-pawnbrokeress
-pecite
-pecky
-pedipulation
-pellitory
-perfilograph
-periblast
-perigemmal
-periost
-periplus
-perishable
-periwig
-permansive
-persistingly
-persymmetrical
-phantom
-phasmatrope
-philocaly
-philogyny
-philosophister
-philotherianism
-phorology
-phototrophic
-phrator
-phratral
-phthisipneumony
-physogastry
-phytologic
-phytoptid
-pianograph
-picqueter
-piculet
-pigeoner
-pimaric
-pinesap
-pist
-planometer
-platano
-playful
-plea
-pleuropneumonic
-plowwoman
-plump
-pluviographical
-pneumocele
-podophthalmate
-polyad
-polythalamian
-poppyhead
-portamento
-portmanteau
-portraitlike
-possible
-potassamide
-powderer
-praepubis
-preanesthetic
-prebarbaric
-predealer
-predomination
-prefactory
-preirrigational
-prelector
-presbytership
-presecure
-preservable
-prespecialist
-preventionism
-prewound
-princely
-priorship
-proannexationist
-proanthropos
-probeable
-probouleutic
-profitless
-proplasma
-prosectorial
-protecting
-protochemistry
-protosulphate
-pseudoataxia
-psilology
-psychoneurotic
-pterygial
-publicist
-purgation
-purplishness
-putatively
-pyracene
-pyrenomycete
-pyromancy
-pyrophone
-quadroon
-quailhead
-qualifier
-quaternal
-rabblelike
-rambunctious
-rapidness
-ratably
-rationalism
-razor
-reannoy
-recultivation
-regulable
-reimplant
-reimposition
-reimprison
-reinjure
-reinspiration
-reintroduce
-remantle
-reprehensibility
-reptant
-require
-resteal
-restful
-returnability
-revisableness
-rewash
-rewhirl
-reyield
-rhizotomy
-rhodamine
-rigwiddie
-rimester
-ripper
-rippet
-rockish
-rockwards
-rollicky
-roosters
-rooted
-rosal
-rozum
-saccharated
-sagamore
-sagy
-salesmanship
-salivous
-sallet
-salta
-saprostomous
-satiation
-sauropsid
-sawarra
-sawback
-scabish
-scabrate
-scampavia
-scientificophilosophical
-scirrosity
-scoliometer
-scolopendrelloid
-secantly
-seignioral
-semibull
-semic
-seminarianism
-semiped
-semiprivate
-semispherical
-semispontaneous
-seneschal
-septendecimal
-serotherapist
-servation
-sesquisulphuret
-severish
-sextipartite
-sextubercular
-shipyard
-shuckpen
-siderosis
-silex
-sillyhow
-silverbelly
-silverbelly
-simulacrum
-sisham
-sixte
-skeiner
-skiapod
-slopped
-slubby
-smalts
-sockmaker
-solute
-somethingness
-somnify
-southwester
-spathilla
-spectrochemical
-sphagnology
-spinales
-spiriting
-spirling
-spirochetemia
-spreadboard
-spurflower
-squawdom
-squeezing
-staircase
-staker
-stamphead
-statolith
-stekan
-stellulate
-stinker
-stomodaea
-streamingly
-strikingness
-strouthocamelian
-stuprum
-subacutely
-subboreal
-subcontractor
-subendorsement
-subprofitable
-subserviate
-subsneer
-subungual
-sucuruju
-sugan
-sulphocarbolate
-summerwood
-superficialist
-superinference
-superregenerative
-supplicate
-suspendible
-synchronizer
-syntectic
-tachyglossate
-tailless
-taintment
-takingly
-taletelling
-tarpon
-tasteful
-taxeater
-taxy
-teache
-teachless
-teg
-tegmen
-teletyper
-temperable
-ten
-tenent
-teskere
-testes
-thallogen
-thapsia
-thewness
-thickety
-thiobacteria
-thorniness
-throwing
-thyroprivic
-tinnitus
-tocalote
-tolerationist
-tonalamatl
-torvous
-totality
-tottering
-toug
-tracheopathia
-tragedical
-translucent
-trifoveolate
-trilaurin
-trophoplasmatic
-trunkless
-turbanless
-turnpiker
-twangle
-twitterboned
-ultraornate
-umbilication
-unabatingly
-unabjured
-unadequateness
-unaffectedness
-unarriving
-unassorted
-unattacked
-unbenumbed
-unboasted
-unburning
-uncensorious
-uncongested
-uncontemnedly
-uncontemporary
-uncrook
-uncrystallizability
-uncurb
-uncustomariness
-underbillow
-undercanopy
-underestimation
-underhanging
-underpetticoated
-underpropped
-undersole
-understocking
-underworld
-undevout
-undisappointing
-undistinctive
-unfiscal
-unfluted
-unfreckled
-ungentilize
-unglobe
-unhelped
-unhomogeneously
-unifoliate
-uninflammable
-uninterrogated
-unisonal
-unkindled
-unlikeableness
-unlisty
-unlocked
-unmoving
-unmultipliable
-unnestled
-unnoticed
-unobservable
-unobviated
-unoffensively
-unofficerlike
-unpoetic
-unpractically
-unquestionableness
-unrehearsed
-unrevised
-unrhetorical
-unsadden
-unsaluting
-unscriptural
-unseeking
-unshowed
-unsolicitous
-unsprouted
-unsubjective
-unsubsidized
-unsymbolic
-untenant
-unterrified
-untranquil
-untraversed
-untrusty
-untying
-unwillful
-unwinding
-upspring
-uptwist
-urachovesical
-uropygial
-vagabondism
-varicoid
-varletess
-vasal
-ventrocaudal
-verisimilitude
-vermigerous
-vibrometer
-viminal
-virus
-vocationalism
-voguey
-vulnerability
-waggle
-wamblingly
-warmus
-waxer
-waying
-wedgeable
-wellmaker
-whomever
-wigged
-witchlike
-wokas
-woodrowel
-woodsman
-woolding
-xanthelasmic
-xiphosternum
-yachtman
-yachtsmanlike
-yelp
-zoophytal \ No newline at end of file
diff --git a/tests/phpunit/includes/cache/GenderCacheTest.php b/tests/phpunit/includes/cache/GenderCacheTest.php
deleted file mode 100644
index a8b987e2..00000000
--- a/tests/phpunit/includes/cache/GenderCacheTest.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-
-/**
- * @group Database
- * @group Cache
- */
-class GenderCacheTest extends MediaWikiLangTestCase {
-
- function setUp() {
- global $wgDefaultUserOptions;
- parent::setUp();
- //ensure the correct default gender
- $wgDefaultUserOptions['gender'] = 'unknown';
- }
-
- function addDBData() {
- $user = User::newFromName( 'UTMale' );
- if( $user->getID() == 0 ) {
- $user->addToDatabase();
- $user->setPassword( 'UTMalePassword' );
- }
- //ensure the right gender
- $user->setOption( 'gender', 'male' );
- $user->saveSettings();
-
- $user = User::newFromName( 'UTFemale' );
- if( $user->getID() == 0 ) {
- $user->addToDatabase();
- $user->setPassword( 'UTFemalePassword' );
- }
- //ensure the right gender
- $user->setOption( 'gender', 'female' );
- $user->saveSettings();
-
- $user = User::newFromName( 'UTDefaultGender' );
- if( $user->getID() == 0 ) {
- $user->addToDatabase();
- $user->setPassword( 'UTDefaultGenderPassword' );
- }
- //ensure the default gender
- $user->setOption( 'gender', null );
- $user->saveSettings();
- }
-
- /**
- * test usernames
- *
- * @dataProvider dataUserName
- */
- function testUserName( $username, $expectedGender ) {
- $genderCache = GenderCache::singleton();
- $gender = $genderCache->getGenderOf( $username );
- $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
- }
-
- /**
- * genderCache should work with user objects, too
- *
- * @dataProvider dataUserName
- */
- function testUserObjects( $username, $expectedGender ) {
- $genderCache = GenderCache::singleton();
- $user = User::newFromName( $username );
- $gender = $genderCache->getGenderOf( $user );
- $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
- }
-
- function dataUserName() {
- return array(
- array( 'UTMale', 'male' ),
- array( 'UTFemale', 'female' ),
- array( 'UTDefaultGender', 'unknown' ),
- array( 'UTNotExist', 'unknown' ),
- //some not valid user
- array( '127.0.0.1', 'unknown' ),
- array( 'user@test', 'unknown' ),
- );
- }
-
- /**
- * test strip of subpages to avoid unnecessary queries
- * against the never existing username
- *
- * @dataProvider dataStripSubpages
- */
- function testStripSubpages( $pageWithSubpage, $expectedGender ) {
- $genderCache = GenderCache::singleton();
- $gender = $genderCache->getGenderOf( $pageWithSubpage );
- $this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
- }
-
- function dataStripSubpages() {
- return array(
- array( 'UTMale/subpage', 'male' ),
- array( 'UTFemale/subpage', 'female' ),
- array( 'UTDefaultGender/subpage', 'unknown' ),
- array( 'UTNotExist/subpage', 'unknown' ),
- array( '127.0.0.1/subpage', 'unknown' ),
- );
- }
-}
diff --git a/tests/phpunit/includes/cache/ProcessCacheLRUTest.php b/tests/phpunit/includes/cache/ProcessCacheLRUTest.php
deleted file mode 100644
index 30bfb124..00000000
--- a/tests/phpunit/includes/cache/ProcessCacheLRUTest.php
+++ /dev/null
@@ -1,239 +0,0 @@
-<?php
-
-/**
- * Test for ProcessCacheLRU class.
- *
- * Note that it uses the ProcessCacheLRUTestable class which extends some
- * properties and methods visibility. That class is defined at the end of the
- * file containing this class.
- *
- * @group Cache
- */
-class ProcessCacheLRUTest extends MediaWikiTestCase {
-
- /**
- * Helper to verify emptiness of a cache object.
- * Compare against an array so we get the cache content difference.
- */
- function assertCacheEmpty( $cache, $msg = 'Cache should be empty' ) {
- $this->assertAttributeEquals( array(), 'cache', $cache, $msg );
- }
-
- /**
- * Helper to fill a cache object passed by reference
- */
- function fillCache( &$cache, $numEntries ) {
- // Fill cache with three values
- for( $i=1; $i<=$numEntries; $i++) {
- $cache->set( "cache-key-$i", "prop-$i", "value-$i" );
- }
- }
-
- /**
- * Generates an array of what would be expected in cache for a given cache
- * size and a number of entries filled in sequentially
- */
- function getExpectedCache( $cacheMaxEntries, $entryToFill ) {
- $expected = array();
-
- if( $entryToFill === 0 ) {
- # The cache is empty!
- return array();
- } elseif( $entryToFill <= $cacheMaxEntries ) {
- # Cache is not fully filled
- $firstKey = 1;
- } else {
- # Cache overflowed
- $firstKey = 1 + $entryToFill - $cacheMaxEntries;
- }
-
- $lastKey = $entryToFill;
-
- for( $i=$firstKey; $i<=$lastKey; $i++ ) {
- $expected["cache-key-$i"] = array( "prop-$i" => "value-$i" );
- }
- return $expected;
- }
-
- /**
- * Highlight diff between assertEquals and assertNotSame
- */
- function testPhpUnitArrayEquality() {
- $one = array( 'A' => 1, 'B' => 2 );
- $two = array( 'B' => 2, 'A' => 1 );
- $this->assertEquals( $one, $two ); // ==
- $this->assertNotSame( $one, $two ); // ===
- }
-
- /**
- * @dataProvider provideInvalidConstructorArg
- * @expectedException MWException
- */
- function testConstructorGivenInvalidValue( $maxSize ) {
- $c = new ProcessCacheLRUTestable( $maxSize );
- }
-
- /**
- * Value which are forbidden by the constructor
- */
- function provideInvalidConstructorArg() {
- return array(
- array( null ),
- array( array() ),
- array( new stdClass() ),
- array( 0 ),
- array( '5' ),
- array( -1 ),
- );
- }
-
- function testAddAndGetAKey() {
- $oneCache = new ProcessCacheLRUTestable( 1 );
- $this->assertCacheEmpty( $oneCache );
-
- // First set just one value
- $oneCache->set( 'cache-key', 'prop1', 'value1' );
- $this->assertEquals( 1, $oneCache->getEntriesCount() );
- $this->assertTrue( $oneCache->has( 'cache-key', 'prop1' ) );
- $this->assertEquals( 'value1', $oneCache->get( 'cache-key', 'prop1' ) );
- }
-
- function testDeleteOldKey() {
- $oneCache = new ProcessCacheLRUTestable( 1 );
- $this->assertCacheEmpty( $oneCache );
-
- $oneCache->set( 'cache-key', 'prop1', 'value1' );
- $oneCache->set( 'cache-key', 'prop1', 'value2' );
- $this->assertEquals( 'value2', $oneCache->get( 'cache-key', 'prop1' ) );
- }
-
- /**
- * This test that we properly overflow when filling a cache with
- * a sequence of always different cache-keys. Meant to verify we correclty
- * delete the older key.
- *
- * @dataProvider provideCacheFilling
- * @param $cacheMaxEntries Maximum entry the created cache will hold
- * @param $entryToFill Number of entries to insert in the created cache.
- */
- function testFillingCache( $cacheMaxEntries, $entryToFill, $msg = '' ) {
- $cache = new ProcessCacheLRUTestable( $cacheMaxEntries );
- $this->fillCache( $cache, $entryToFill);
-
- $this->assertSame(
- $this->getExpectedCache( $cacheMaxEntries, $entryToFill ),
- $cache->getCache(),
- "Filling a $cacheMaxEntries entries cache with $entryToFill entries"
- );
-
- }
-
- /**
- * Provider for testFillingCache
- */
- function provideCacheFilling() {
- // ($cacheMaxEntries, $entryToFill, $msg='')
- return array(
- array( 1, 0 ),
- array( 1, 1 ),
- array( 1, 2 ), # overflow
- array( 5, 33 ), # overflow
- );
-
- }
-
- /**
- * Create a cache with only one remaining entry then update
- * the first inserted entry. Should bump it to the top.
- */
- function testReplaceExistingKeyShouldBumpEntryToTop() {
- $maxEntries = 3;
-
- $cache = new ProcessCacheLRUTestable( $maxEntries );
- // Fill cache leaving just one remaining slot
- $this->fillCache( $cache, $maxEntries - 1 );
-
- // Set an existing cache key
- $cache->set( "cache-key-1", "prop-1", "new-value-for-1" );
-
- $this->assertSame(
- array(
- 'cache-key-2' => array( 'prop-2' => 'value-2' ),
- 'cache-key-1' => array( 'prop-1' => 'new-value-for-1' ),
- ),
- $cache->getCache()
- );
- }
-
- function testRecentlyAccessedKeyStickIn() {
- $cache = new ProcessCacheLRUTestable( 2 );
- $cache->set( 'first' , 'prop1', 'value1' );
- $cache->set( 'second', 'prop2', 'value2' );
-
- // Get first
- $cache->get( 'first', 'prop1' );
- // Cache a third value, should invalidate the least used one
- $cache->set( 'third', 'prop3', 'value3' );
-
- $this->assertFalse( $cache->has( 'second', 'prop2' ) );
- }
-
- /**
- * This first create a full cache then update the value for the 2nd
- * filled entry.
- * Given a cache having 1,2,3 as key, updating 2 should bump 2 to
- * the top of the queue with the new value: 1,3,2* (* = updated).
- */
- function testReplaceExistingKeyInAFullCacheShouldBumpToTop() {
- $maxEntries = 3;
-
- $cache = new ProcessCacheLRUTestable( $maxEntries );
- $this->fillCache( $cache, $maxEntries );
-
- // Set an existing cache key
- $cache->set( "cache-key-2", "prop-2", "new-value-for-2" );
- $this->assertSame(
- array(
- 'cache-key-1' => array( 'prop-1' => 'value-1' ),
- 'cache-key-3' => array( 'prop-3' => 'value-3' ),
- 'cache-key-2' => array( 'prop-2' => 'new-value-for-2' ),
- ),
- $cache->getCache()
- );
- $this->assertEquals( 'new-value-for-2',
- $cache->get( 'cache-key-2', 'prop-2' )
- );
- }
-
- function testBumpExistingKeyToTop() {
- $cache = new ProcessCacheLRUTestable( 3 );
- $this->fillCache( $cache, 3 );
-
- // Set the very first cache key to a new value
- $cache->set( "cache-key-1", "prop-1", "new value for 1" );
- $this->assertEquals(
- array(
- 'cache-key-2' => array( 'prop-2' => 'value-2' ),
- 'cache-key-3' => array( 'prop-3' => 'value-3' ),
- 'cache-key-1' => array( 'prop-1' => 'new value for 1' ),
- ),
- $cache->getCache()
- );
-
- }
-
-}
-
-/**
- * Overrides some ProcessCacheLRU methods and properties accessibility.
- */
-class ProcessCacheLRUTestable extends ProcessCacheLRU {
- public $cache = array();
-
- public function getCache() {
- return $this->cache;
- }
- public function getEntriesCount() {
- return count( $this->cache );
- }
-}
diff --git a/tests/phpunit/includes/db/DatabaseSQLTest.php b/tests/phpunit/includes/db/DatabaseSQLTest.php
deleted file mode 100644
index e37cd445..00000000
--- a/tests/phpunit/includes/db/DatabaseSQLTest.php
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-
-/**
- * Test the abstract database layer
- * Using Mysql for the sql at the moment TODO
- *
- * @group Database
- */
-class DatabaseSQLTest extends MediaWikiTestCase {
-
- public function setUp() {
- // TODO support other DBMS or find another way to do it
- if( $this->db->getType() !== 'mysql' ) {
- $this->markTestSkipped( 'No mysql database' );
- }
- }
-
- /**
- * @dataProvider dataSelectSQLText
- */
- function testSelectSQLText( $sql, $sqlText ) {
- $this->assertEquals( trim( $this->db->selectSQLText(
- isset( $sql['tables'] ) ? $sql['tables'] : array(),
- isset( $sql['fields'] ) ? $sql['fields'] : array(),
- isset( $sql['conds'] ) ? $sql['conds'] : array(),
- __METHOD__,
- isset( $sql['options'] ) ? $sql['options'] : array(),
- isset( $sql['join_conds'] ) ? $sql['join_conds'] : array()
- ) ), $sqlText );
- }
-
- function dataSelectSQLText() {
- return array(
- array(
- array(
- 'tables' => 'table',
- 'fields' => array( 'field', 'alias' => 'field2' ),
- 'conds' => array( 'alias' => 'text' ),
- ),
- "SELECT field,field2 AS alias " .
- "FROM `unittest_table` " .
- "WHERE alias = 'text'"
- ),
- array(
- array(
- 'tables' => 'table',
- 'fields' => array( 'field', 'alias' => 'field2' ),
- 'conds' => array( 'alias' => 'text' ),
- 'options' => array( 'LIMIT' => 1, 'ORDER BY' => 'field' ),
- ),
- "SELECT field,field2 AS alias " .
- "FROM `unittest_table` " .
- "WHERE alias = 'text' " .
- "ORDER BY field " .
- "LIMIT 1"
- ),
- array(
- array(
- 'tables' => array( 'table', 't2' => 'table2' ),
- 'fields' => array( 'tid', 'field', 'alias' => 'field2', 't2.id' ),
- 'conds' => array( 'alias' => 'text' ),
- 'options' => array( 'LIMIT' => 1, 'ORDER BY' => 'field' ),
- 'join_conds' => array( 't2' => array(
- 'LEFT JOIN', 'tid = t2.id'
- )),
- ),
- "SELECT tid,field,field2 AS alias,t2.id " .
- "FROM `unittest_table` LEFT JOIN `unittest_table2` `t2` ON ((tid = t2.id)) " .
- "WHERE alias = 'text' " .
- "ORDER BY field " .
- "LIMIT 1"
- ),
- array(
- array(
- 'tables' => array( 'table', 't2' => 'table2' ),
- 'fields' => array( 'tid', 'field', 'alias' => 'field2', 't2.id' ),
- 'conds' => array( 'alias' => 'text' ),
- 'options' => array( 'LIMIT' => 1, 'GROUP BY' => 'field', 'HAVING' => 'COUNT(*) > 1' ),
- 'join_conds' => array( 't2' => array(
- 'LEFT JOIN', 'tid = t2.id'
- )),
- ),
- "SELECT tid,field,field2 AS alias,t2.id " .
- "FROM `unittest_table` LEFT JOIN `unittest_table2` `t2` ON ((tid = t2.id)) " .
- "WHERE alias = 'text' " .
- "GROUP BY field HAVING COUNT(*) > 1 " .
- "LIMIT 1"
- ),
- array(
- array(
- '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 ) ),
- 'join_conds' => array( 't2' => array(
- 'LEFT JOIN', 'tid = t2.id'
- )),
- ),
- "SELECT tid,field,field2 AS alias,t2.id " .
- "FROM `unittest_table` LEFT JOIN `unittest_table2` `t2` ON ((tid = t2.id)) " .
- "WHERE alias = 'text' " .
- "GROUP BY field,field2 HAVING (COUNT(*) > 1) AND field = '1' " .
- "LIMIT 1"
- ),
- );
- }
-
- /**
- * @dataProvider dataConditional
- */
- function testConditional( $sql, $sqlText ) {
- $this->assertEquals( trim( $this->db->conditional(
- $sql['conds'],
- $sql['true'],
- $sql['false']
- ) ), $sqlText );
- }
-
- function dataConditional() {
- return array(
- array(
- array(
- 'conds' => array( 'field' => 'text' ),
- 'true' => 1,
- 'false' => 'NULL',
- ),
- "(CASE WHEN field = 'text' THEN 1 ELSE NULL END)"
- ),
- array(
- array(
- 'conds' => array( 'field' => 'text', 'field2' => 'anothertext' ),
- 'true' => 1,
- 'false' => 'NULL',
- ),
- "(CASE WHEN field = 'text' AND field2 = 'anothertext' THEN 1 ELSE NULL END)"
- ),
- array(
- array(
- 'conds' => 'field=1',
- 'true' => 1,
- 'false' => 'NULL',
- ),
- "(CASE WHEN field=1 THEN 1 ELSE NULL END)"
- ),
- );
- }
-} \ No newline at end of file
diff --git a/tests/phpunit/includes/db/DatabaseSqliteTest.php b/tests/phpunit/includes/db/DatabaseSqliteTest.php
deleted file mode 100644
index d226598b..00000000
--- a/tests/phpunit/includes/db/DatabaseSqliteTest.php
+++ /dev/null
@@ -1,326 +0,0 @@
-<?php
-
-class MockDatabaseSqlite extends DatabaseSqliteStandalone {
- var $lastQuery;
-
- function __construct( ) {
- parent::__construct( ':memory:' );
- }
-
- function query( $sql, $fname = '', $tempIgnore = false ) {
- $this->lastQuery = $sql;
- return true;
- }
-
- function replaceVars( $s ) {
- return parent::replaceVars( $s );
- }
-}
-
-/**
- * @group sqlite
- * @group Database
- */
-class DatabaseSqliteTest extends MediaWikiTestCase {
- var $db;
-
- public function setUp() {
- if ( !Sqlite::isPresent() ) {
- $this->markTestSkipped( 'No SQLite support detected' );
- }
- $this->db = new MockDatabaseSqlite();
- if ( version_compare( $this->db->getServerVersion(), '3.6.0', '<' ) ) {
- $this->markTestSkipped( "SQLite at least 3.6 required, {$this->db->getServerVersion()} found" );
- }
- }
-
- private function replaceVars( $sql ) {
- // normalize spacing to hide implementation details
- return preg_replace( '/\s+/', ' ', $this->db->replaceVars( $sql ) );
- }
-
- private function assertResultIs( $expected, $res ) {
- $this->assertNotNull( $res );
- $i = 0;
- foreach( $res as $row ) {
- foreach( $expected[$i] as $key => $value ) {
- $this->assertTrue( isset( $row->$key ) );
- $this->assertEquals( $value, $row->$key );
- }
- $i++;
- }
- $this->assertEquals( count( $expected ), $i, 'Unexpected number of rows' );
- }
-
- 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, "
- . "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->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 );",
- $this->replaceVars( "CREATE TABLE foo ( foo_binary1 binary(16), foo_binary2 varbinary(32) );" )
- );
-
- $this->assertEquals( "CREATE TABLE text ( text_foo TEXT );",
- $this->replaceVars( "CREATE TABLE text ( text_foo tinytext );" ),
- 'Table name changed'
- );
-
- $this->assertEquals( "CREATE TABLE foo ( foobar INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL );",
- $this->replaceVars("CREATE TABLE foo ( foobar INT PRIMARY KEY NOT NULL AUTO_INCREMENT );" )
- );
- $this->assertEquals( "CREATE TABLE foo ( foobar INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL );",
- $this->replaceVars("CREATE TABLE foo ( foobar INT PRIMARY KEY AUTO_INCREMENT NOT NULL );" )
- );
-
- $this->assertEquals( "CREATE TABLE enums( enum1 TEXT, myenum TEXT)",
- $this->replaceVars( "CREATE TABLE enums( enum1 ENUM('A', 'B'), myenum ENUM ('X', 'Y'))" )
- );
-
- $this->assertEquals( "ALTER TABLE foo ADD COLUMN foo_bar INTEGER DEFAULT 42",
- $this->replaceVars( "ALTER TABLE foo\nADD COLUMN foo_bar int(10) unsigned DEFAULT 42" )
- );
- }
-
- public function testTableName() {
- // @todo Moar!
- $db = new DatabaseSqliteStandalone( ':memory:' );
- $this->assertEquals( 'foo', $db->tableName( 'foo' ) );
- $this->assertEquals( 'sqlite_master', $db->tableName( 'sqlite_master' ) );
- $db->tablePrefix( 'foo' );
- $this->assertEquals( 'sqlite_master', $db->tableName( 'sqlite_master' ) );
- $this->assertEquals( 'foobar', $db->tableName( 'bar' ) );
- }
-
- public function testDuplicateTableStructure() {
- $db = new DatabaseSqliteStandalone( ':memory:' );
- $db->query( 'CREATE TABLE foo(foo, barfoo)' );
-
- $db->duplicateTableStructure( 'foo', 'bar' );
- $this->assertEquals( 'CREATE TABLE "bar"(foo, barfoo)',
- $db->selectField( 'sqlite_master', 'sql', array( 'name' => 'bar' ) ),
- 'Normal table duplication'
- );
-
- $db->duplicateTableStructure( 'foo', 'baz', true );
- $this->assertEquals( 'CREATE TABLE "baz"(foo, barfoo)',
- $db->selectField( 'sqlite_temp_master', 'sql', array( 'name' => 'baz' ) ),
- 'Creation of temporary duplicate'
- );
- $this->assertEquals( 0,
- $db->selectField( 'sqlite_master', 'COUNT(*)', array( 'name' => 'baz' ) ),
- 'Create a temporary duplicate only'
- );
- }
-
- public function testDuplicateTableStructureVirtual() {
- $db = new DatabaseSqliteStandalone( ':memory:' );
- if ( $db->getFulltextSearchModule() != 'FTS3' ) {
- $this->markTestSkipped( 'FTS3 not supported, cannot create virtual tables' );
- }
- $db->query( 'CREATE VIRTUAL TABLE "foo" USING FTS3(foobar)' );
-
- $db->duplicateTableStructure( 'foo', 'bar' );
- $this->assertEquals( 'CREATE VIRTUAL TABLE "bar" USING FTS3(foobar)',
- $db->selectField( 'sqlite_master', 'sql', array( 'name' => 'bar' ) ),
- 'Duplication of virtual tables'
- );
-
- $db->duplicateTableStructure( 'foo', 'baz', true );
- $this->assertEquals( 'CREATE VIRTUAL TABLE "baz" USING FTS3(foobar)',
- $db->selectField( 'sqlite_master', 'sql', array( 'name' => 'baz' ) ),
- "Can't create temporary virtual tables, should fall back to non-temporary duplication"
- );
- }
-
- public function testDeleteJoin() {
- $db = new DatabaseSqliteStandalone( ':memory:' );
- $db->query( 'CREATE TABLE a (a_1)', __METHOD__ );
- $db->query( 'CREATE TABLE b (b_1, b_2)', __METHOD__ );
- $db->insert( 'a', array(
- array( 'a_1' => 1 ),
- array( 'a_1' => 2 ),
- array( 'a_1' => 3 ),
- ),
- __METHOD__
- );
- $db->insert( 'b', array(
- array( 'b_1' => 2, 'b_2' => 'a' ),
- array( 'b_1' => 3, 'b_2' => 'b' ),
- ),
- __METHOD__
- );
- $db->deleteJoin( 'a', 'b', 'a_1', 'b_1', array( 'b_2' => 'a' ), __METHOD__ );
- $res = $db->query( "SELECT * FROM a", __METHOD__ );
- $this->assertResultIs( array(
- array( 'a_1' => 1 ),
- array( 'a_1' => 3 ),
- ),
- $res
- );
- }
-
- public function testEntireSchema() {
- global $IP;
-
- $result = Sqlite::checkSqlSyntax( "$IP/maintenance/tables.sql" );
- if ( $result !== true ) {
- $this->fail( $result );
- }
- $this->assertTrue( true ); // avoid test being marked as incomplete due to lack of assertions
- }
-
- /**
- * Runs upgrades of older databases and compares results with current schema
- * @todo: currently only checks list of tables
- */
- public function testUpgrades() {
- global $IP, $wgVersion;
-
- // Versions tested
- $versions = array(
- //'1.13', disabled for now, was totally screwed up
- // SQLite wasn't included in 1.14
- '1.15',
- '1.16',
- '1.17',
- '1.18',
- );
-
- // Mismatches for these columns we can safely ignore
- $ignoredColumns = array(
- 'user_newtalk.user_last_timestamp', // r84185
- );
-
- $currentDB = new DatabaseSqliteStandalone( ':memory:' );
- $currentDB->sourceFile( "$IP/maintenance/tables.sql" );
- $currentTables = $this->getTables( $currentDB );
- sort( $currentTables );
-
- foreach ( $versions as $version ) {
- $versions = "upgrading from $version to $wgVersion";
- $db = $this->prepareDB( $version );
- $tables = $this->getTables( $db );
- $this->assertEquals( $currentTables, $tables, "Different tables $versions" );
- foreach ( $tables as $table ) {
- $currentCols = $this->getColumns( $currentDB, $table );
- $cols = $this->getColumns( $db, $table );
- $this->assertEquals(
- array_keys( $currentCols ),
- array_keys( $cols ),
- "Mismatching columns for table \"$table\" $versions"
- );
- foreach ( $currentCols as $name => $column ) {
- $fullName = "$table.$name";
- $this->assertEquals(
- (bool)$column->pk,
- (bool)$cols[$name]->pk,
- "PRIMARY KEY status does not match for column $fullName $versions"
- );
- if ( !in_array( $fullName, $ignoredColumns ) ) {
- $this->assertEquals(
- (bool)$column->notnull,
- (bool)$cols[$name]->notnull,
- "NOT NULL status does not match for column $fullName $versions"
- );
- $this->assertEquals(
- $column->dflt_value,
- $cols[$name]->dflt_value,
- "Default values does not match for column $fullName $versions"
- );
- }
- }
- $currentIndexes = $this->getIndexes( $currentDB, $table );
- $indexes = $this->getIndexes( $db, $table );
- $this->assertEquals(
- array_keys( $currentIndexes ),
- array_keys( $indexes ),
- "mismatching indexes for table \"$table\" $versions"
- );
- }
- $db->close();
- }
- }
-
- public function testInsertIdType() {
- $db = new DatabaseSqliteStandalone( ':memory:' );
- $this->assertInstanceOf( 'ResultWrapper',
- $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ ), "Database creationg" );
- $this->assertTrue( $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ ),
- "Insertion worked" );
- $this->assertEquals( "integer", gettype( $db->insertId() ), "Actual typecheck" );
- $this->assertTrue( $db->close(), "closing database" );
- }
-
- private function prepareDB( $version ) {
- static $maint = null;
- if ( $maint === null ) {
- $maint = new FakeMaintenance();
- $maint->loadParamsAndArgs( null, array( 'quiet' => 1 ) );
- }
-
- global $IP;
- $db = new DatabaseSqliteStandalone( ':memory:' );
- $db->sourceFile( "$IP/tests/phpunit/data/db/sqlite/tables-$version.sql" );
- $updater = DatabaseUpdater::newForDB( $db, false, $maint );
- $updater->doUpdates( array( 'core' ) );
- return $db;
- }
-
- private function getTables( $db ) {
- $list = array_flip( $db->listTables() );
- $excluded = array(
- 'math', // moved out of core in 1.18
- 'trackbacks', // removed from core in 1.19
- 'searchindex',
- 'searchindex_content',
- 'searchindex_segments',
- 'searchindex_segdir',
- // FTS4 ready!!1
- 'searchindex_docsize',
- 'searchindex_stat',
- );
- foreach ( $excluded as $t ) {
- unset( $list[$t] );
- }
- $list = array_flip( $list );
- sort( $list );
- return $list;
- }
-
- private function getColumns( $db, $table ) {
- $cols = array();
- $res = $db->query( "PRAGMA table_info($table)" );
- $this->assertNotNull( $res );
- foreach ( $res as $col ) {
- $cols[$col->name] = $col;
- }
- ksort( $cols );
- return $cols;
- }
-
- private function getIndexes( $db, $table ) {
- $indexes = array();
- $res = $db->query( "PRAGMA index_list($table)" );
- $this->assertNotNull( $res );
- foreach ( $res as $index ) {
- $res2 = $db->query( "PRAGMA index_info({$index->name})" );
- $this->assertNotNull( $res2 );
- $index->columns = array();
- foreach ( $res2 as $col ) {
- $index->columns[] = $col;
- }
- $indexes[$index->name] = $index;
- }
- ksort( $indexes );
- return $indexes;
- }
-}
diff --git a/tests/phpunit/includes/db/DatabaseTest.php b/tests/phpunit/includes/db/DatabaseTest.php
deleted file mode 100644
index 379ffb17..00000000
--- a/tests/phpunit/includes/db/DatabaseTest.php
+++ /dev/null
@@ -1,215 +0,0 @@
-<?php
-
-/**
- * @group Database
- * @group DatabaseBase
- */
-class DatabaseTest extends MediaWikiTestCase {
- var $db, $functionTest = false;
-
- function setUp() {
- $this->db = wfGetDB( DB_MASTER );
- }
-
- function tearDown() {
- if ( $this->functionTest ) {
- $this->dropFunctions();
- $this->functionTest = false;
- }
- }
-
- function testAddQuotesNull() {
- $check = "NULL";
- if ( $this->db->getType() === 'sqlite' || $this->db->getType() === 'oracle' ) {
- $check = "''";
- }
- $this->assertEquals( $check, $this->db->addQuotes( null ) );
- }
-
- function testAddQuotesInt() {
- # returning just "1234" should be ok too, though...
- # maybe
- $this->assertEquals(
- "'1234'",
- $this->db->addQuotes( 1234 ) );
- }
-
- function testAddQuotesFloat() {
- # returning just "1234.5678" would be ok too, though
- $this->assertEquals(
- "'1234.5678'",
- $this->db->addQuotes( 1234.5678 ) );
- }
-
- function testAddQuotesString() {
- $this->assertEquals(
- "'string'",
- $this->db->addQuotes( 'string' ) );
- }
-
- function testAddQuotesStringQuote() {
- $check = "'string''s cause trouble'";
- if ( $this->db->getType() === 'mysql' ) {
- $check = "'string\'s cause trouble'";
- }
- $this->assertEquals(
- $check,
- $this->db->addQuotes( "string's cause trouble" ) );
- }
-
- private function getSharedTableName( $table, $database, $prefix, $format = 'quoted' ) {
- global $wgSharedDB, $wgSharedTables, $wgSharedPrefix;
-
- $oldName = $wgSharedDB;
- $oldTables = $wgSharedTables;
- $oldPrefix = $wgSharedPrefix;
-
- $wgSharedDB = $database;
- $wgSharedTables = array( $table );
- $wgSharedPrefix = $prefix;
-
- $ret = $this->db->tableName( $table, $format );
-
- $wgSharedDB = $oldName;
- $wgSharedTables = $oldTables;
- $wgSharedPrefix = $oldPrefix;
-
- return $ret;
- }
-
- private function prefixAndQuote( $table, $database = null, $prefix = null, $format = 'quoted' ) {
- if ( $this->db->getType() === 'sqlite' || $format !== 'quoted' ) {
- $quote = '';
- } elseif ( $this->db->getType() === 'mysql' ) {
- $quote = '`';
- } else {
- $quote = '"';
- }
-
- if ( $database !== null ) {
- $database = $quote . $database . $quote . '.';
- }
-
- if ( $prefix === null ) {
- $prefix = $this->dbPrefix();
- }
-
- return $database . $quote . $prefix . $table . $quote;
- }
-
- function testTableNameLocal() {
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename' ),
- $this->db->tableName( 'tablename' )
- );
- }
-
- function testTableNameRawLocal() {
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', null, null, 'raw' ),
- $this->db->tableName( 'tablename', 'raw' )
- );
- }
-
- function testTableNameShared() {
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', 'sharedatabase', 'sh_' ),
- $this->getSharedTableName( 'tablename', 'sharedatabase', 'sh_' )
- );
-
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', 'sharedatabase', null ),
- $this->getSharedTableName( 'tablename', 'sharedatabase', null )
- );
- }
-
- function testTableNameRawShared() {
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', 'sharedatabase', 'sh_', 'raw' ),
- $this->getSharedTableName( 'tablename', 'sharedatabase', 'sh_', 'raw' )
- );
-
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', 'sharedatabase', null, 'raw' ),
- $this->getSharedTableName( 'tablename', 'sharedatabase', null, 'raw' )
- );
- }
-
- function testTableNameForeign() {
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', 'databasename', '' ),
- $this->db->tableName( 'databasename.tablename' )
- );
- }
-
- function testTableNameRawForeign() {
- $this->assertEquals(
- $this->prefixAndQuote( 'tablename', 'databasename', '', 'raw' ),
- $this->db->tableName( 'databasename.tablename', 'raw' )
- );
- }
-
- function testFillPreparedEmpty() {
- $sql = $this->db->fillPrepared(
- 'SELECT * FROM interwiki', array() );
- $this->assertEquals(
- "SELECT * FROM interwiki",
- $sql );
- }
-
- function testFillPreparedQuestion() {
- $sql = $this->db->fillPrepared(
- 'SELECT * FROM cur WHERE cur_namespace=? AND cur_title=?',
- array( 4, "Snicker's_paradox" ) );
-
- $check = "SELECT * FROM cur WHERE cur_namespace='4' AND cur_title='Snicker''s_paradox'";
- if ( $this->db->getType() === 'mysql' ) {
- $check = "SELECT * FROM cur WHERE cur_namespace='4' AND cur_title='Snicker\'s_paradox'";
- }
- $this->assertEquals( $check, $sql );
- }
-
- function testFillPreparedBang() {
- $sql = $this->db->fillPrepared(
- 'SELECT user_id FROM ! WHERE user_name=?',
- array( '"user"', "Slash's Dot" ) );
-
- $check = "SELECT user_id FROM \"user\" WHERE user_name='Slash''s Dot'";
- if ( $this->db->getType() === 'mysql' ) {
- $check = "SELECT user_id FROM \"user\" WHERE user_name='Slash\'s Dot'";
- }
- $this->assertEquals( $check, $sql );
- }
-
- function testFillPreparedRaw() {
- $sql = $this->db->fillPrepared(
- "SELECT * FROM cur WHERE cur_title='This_\\&_that,_WTF\\?\\!'",
- array( '"user"', "Slash's Dot" ) );
- $this->assertEquals(
- "SELECT * FROM cur WHERE cur_title='This_&_that,_WTF?!'",
- $sql );
- }
-
- /**
- * @group Broken
- */
- function testStoredFunctions() {
- if ( !in_array( wfGetDB( DB_MASTER )->getType(), array( 'mysql', 'postgres' ) ) ) {
- $this->markTestSkipped( 'MySQL or Postgres required' );
- }
- global $IP;
- $this->dropFunctions();
- $this->functionTest = true;
- $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 );
- }
-
- private function dropFunctions() {
- $this->db->query( 'DROP FUNCTION IF EXISTS mw_test_function'
- . ( $this->db->getType() == 'postgres' ? '()' : '' )
- );
- }
-}
-
-
diff --git a/tests/phpunit/includes/db/ORMRowTest.php b/tests/phpunit/includes/db/ORMRowTest.php
deleted file mode 100644
index 9dcaf2b3..00000000
--- a/tests/phpunit/includes/db/ORMRowTest.php
+++ /dev/null
@@ -1,234 +0,0 @@
-<?php
-
-/**
- * Abstract class to construct tests for ORMRow deriving classes.
- *
- * 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
- * @since 1.20
- *
- * @ingroup Test
- *
- * @group ORM
- *
- * The database group has as a side effect that temporal database tables are created. This makes
- * it possible to test without poisoning a production database.
- * @group Database
- *
- * Some of the tests takes more time, and needs therefor longer time before they can be aborted
- * as non-functional. The reason why tests are aborted is assumed to be set up of temporal databases
- * that hold the first tests in a pending state awaiting access to the database.
- * @group medium
- *
- * @licence GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-abstract class ORMRowTest extends \MediaWikiTestCase {
-
- /**
- * @since 1.20
- * @return string
- */
- protected abstract function getRowClass();
-
- /**
- * @since 1.20
- * @return IORMTable
- */
- protected abstract function getTableInstance();
-
- /**
- * @since 1.20
- * @return array
- */
- public abstract function constructorTestProvider();
-
- /**
- * @since 1.20
- * @param IORMRow $row
- * @param array $data
- */
- protected function verifyFields( IORMRow $row, array $data ) {
- foreach ( array_keys( $data ) as $fieldName ) {
- $this->assertEquals( $data[$fieldName], $row->getField( $fieldName ) );
- }
- }
-
- /**
- * @since 1.20
- * @param array $data
- * @param boolean $loadDefaults
- * @return IORMRow
- */
- protected function getRowInstance( array $data, $loadDefaults ) {
- $class = $this->getRowClass();
- return new $class( $this->getTableInstance(), $data, $loadDefaults );
- }
-
- /**
- * @since 1.20
- * @return array
- */
- protected function getMockValues() {
- return array(
- 'id' => 1,
- 'str' => 'foobar4645645',
- 'int' => 42,
- 'float' => 4.2,
- 'bool' => true,
- 'array' => array( 42, 'foobar' ),
- 'blob' => new stdClass()
- );
- }
-
- /**
- * @since 1.20
- * @return array
- */
- protected function getMockFields() {
- $mockValues = $this->getMockValues();
- $mockFields = array();
-
- foreach ( $this->getTableInstance()->getFields() as $name => $type ) {
- if ( $name !== 'id' ) {
- $mockFields[$name] = $mockValues[$type];
- }
- }
-
- return $mockFields;
- }
-
- /**
- * @since 1.20
- * @return array of IORMRow
- */
- public function instanceProvider() {
- $instances = array();
-
- foreach ( $this->constructorTestProvider() as $arguments ) {
- $instances[] = array( call_user_func_array( array( $this, 'getRowInstance' ), $arguments ) );
- }
-
- return $instances;
- }
-
- /**
- * @dataProvider constructorTestProvider
- */
- public function testConstructor( array $data, $loadDefaults ) {
- $this->verifyFields( $this->getRowInstance( $data, $loadDefaults ), $data );
- }
-
- /**
- * @dataProvider constructorTestProvider
- */
- public function testSave( array $data, $loadDefaults ) {
- $item = $this->getRowInstance( $data, $loadDefaults );
-
- $this->assertTrue( $item->save() );
-
- $this->assertTrue( $item->hasIdField() );
- $this->assertTrue( is_integer( $item->getId() ) );
-
- $id = $item->getId();
-
- $this->assertTrue( $item->save() );
-
- $this->assertEquals( $id, $item->getId() );
-
- $this->verifyFields( $item, $data );
- }
-
- /**
- * @dataProvider constructorTestProvider
- */
- public function testRemove( array $data, $loadDefaults ) {
- $item = $this->getRowInstance( $data, $loadDefaults );
-
- $this->assertTrue( $item->save() );
-
- $this->assertTrue( $item->remove() );
-
- $this->assertFalse( $item->hasIdField() );
-
- $this->assertTrue( $item->save() );
-
- $this->verifyFields( $item, $data );
-
- $this->assertTrue( $item->remove() );
-
- $this->assertFalse( $item->hasIdField() );
-
- $this->verifyFields( $item, $data );
- }
-
- /**
- * @dataProvider instanceProvider
- */
- public function testSetField( IORMRow $item ) {
- foreach ( $this->getMockFields() as $name => $value ) {
- $item->setField( $name, $value );
- $this->assertEquals( $value, $item->getField( $name ) );
- }
- }
-
- /**
- * @since 1.20
- * @param array $expected
- * @param IORMRow $item
- */
- protected function assertFieldValues( array $expected, IORMRow $item ) {
- foreach ( $expected as $name => $type ) {
- if ( $name !== 'id' ) {
- $this->assertEquals( $expected[$name], $item->getField( $name ) );
- }
- }
- }
-
- /**
- * @dataProvider instanceProvider
- */
- public function testSetFields( IORMRow $item ) {
- $originalValues = $item->getFields();
-
- $item->setFields( array(), false );
-
- foreach ( $item->getTable()->getFields() as $name => $type ) {
- $originalHas = array_key_exists( $name, $originalValues );
- $newHas = $item->hasField( $name );
-
- $this->assertEquals( $originalHas, $newHas );
-
- if ( $originalHas && $newHas ) {
- $this->assertEquals( $originalValues[$name], $item->getField( $name ) );
- }
- }
-
- $mockFields = $this->getMockFields();
-
- $item->setFields( $mockFields, false );
-
- $this->assertFieldValues( $originalValues, $item );
-
- $item->setFields( $mockFields, true );
-
- $this->assertFieldValues( $mockFields, $item );
- }
-
- // TODO: test all of the methods!
-
-} \ No newline at end of file
diff --git a/tests/phpunit/includes/db/TestORMRowTest.php b/tests/phpunit/includes/db/TestORMRowTest.php
deleted file mode 100644
index afd1cb80..00000000
--- a/tests/phpunit/includes/db/TestORMRowTest.php
+++ /dev/null
@@ -1,174 +0,0 @@
-<?php
-
-/**
- * Tests for the TestORMRow class.
- * TestORMRow is a dummy class to be able to test the abstract ORMRow class.
- *
- * 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
- * @since 1.20
- *
- * @ingroup Test
- *
- * @group ORM
- *
- * The database group has as a side effect that temporal database tables are created. This makes
- * it possible to test without poisoning a production database.
- * @group Database
- *
- * Some of the tests takes more time, and needs therefor longer time before they can be aborted
- * as non-functional. The reason why tests are aborted is assumed to be set up of temporal databases
- * that hold the first tests in a pending state awaiting access to the database.
- * @group medium
- *
- * @licence GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-require_once __DIR__ . "/ORMRowTest.php";
-
-class TestORMRowTest extends ORMRowTest {
-
- /**
- * @since 1.20
- * @return string
- */
- protected function getRowClass() {
- return 'TestORMRow';
- }
-
- /**
- * @since 1.20
- * @return IORMTable
- */
- protected function getTableInstance() {
- return TestORMTable::singleton();
- }
-
- public function setUp() {
- parent::setUp();
-
- $dbw = wfGetDB( DB_MASTER );
-
- $isSqlite = $GLOBALS['wgDBtype'] === 'sqlite';
-
- $idField = $isSqlite ? 'INTEGER' : 'INT unsigned';
- $primaryKey = $isSqlite ? 'PRIMARY KEY AUTOINCREMENT' : 'auto_increment PRIMARY KEY';
-
- $dbw->query(
- 'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . '(
- test_id ' . $idField . ' NOT NULL ' . $primaryKey . ',
- test_name VARCHAR(255) NOT NULL,
- test_age TINYINT unsigned NOT NULL,
- test_height FLOAT NOT NULL,
- test_awesome TINYINT unsigned NOT NULL,
- test_stuff BLOB NOT NULL,
- test_moarstuff BLOB NOT NULL,
- test_time varbinary(14) NOT NULL
- );'
- );
- }
-
- public function constructorTestProvider() {
- return array(
- array(
- array(
- 'name' => 'Foobar',
- 'age' => 42,
- 'height' => 9000.1,
- 'awesome' => true,
- 'stuff' => array( 13, 11, 7, 5, 3, 2 ),
- 'moarstuff' => (object)array( 'foo' => 'bar', 'bar' => array( 4, 2 ), 'baz' => true )
- ),
- true
- ),
- );
- }
-
-}
-
-class TestORMRow extends ORMRow {}
-
-class TestORMTable extends ORMTable {
-
- /**
- * Returns the name of the database table objects of this type are stored in.
- *
- * @since 1.20
- *
- * @return string
- */
- public function getName() {
- return 'orm_test';
- }
-
- /**
- * Returns the name of a IORMRow implementing class that
- * represents single rows in this table.
- *
- * @since 1.20
- *
- * @return string
- */
- public function getRowClass() {
- return 'TestORMRow';
- }
-
- /**
- * Returns an array with the fields and their types this object contains.
- * This corresponds directly to the fields in the database, without prefix.
- *
- * field name => type
- *
- * Allowed types:
- * * id
- * * str
- * * int
- * * float
- * * bool
- * * array
- * * blob
- *
- * @since 1.20
- *
- * @return array
- */
- public function getFields() {
- return array(
- 'id' => 'id',
- 'name' => 'str',
- 'age' => 'int',
- 'height' => 'float',
- 'awesome' => 'bool',
- 'stuff' => 'array',
- 'moarstuff' => 'blob',
- 'time' => 'int', // TS_MW
- );
- }
-
- /**
- * Gets the db field prefix.
- *
- * @since 1.20
- *
- * @return string
- */
- protected function getFieldPrefix() {
- return 'test_';
- }
-
-
-}
diff --git a/tests/phpunit/includes/debug/MWDebugTest.php b/tests/phpunit/includes/debug/MWDebugTest.php
deleted file mode 100644
index 246b2918..00000000
--- a/tests/phpunit/includes/debug/MWDebugTest.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-class MWDebugTest extends MediaWikiTestCase {
-
-
- function setUp() {
- // Make sure MWDebug class is enabled
- static $MWDebugEnabled = false;
- if( !$MWDebugEnabled ) {
- MWDebug::init();
- $MWDebugEnabled = true;
- }
- /** Clear log before each test */
- MWDebug::clearLog();
- wfSuppressWarnings();
- }
-
- function tearDown() {
- wfRestoreWarnings();
- }
-
- function testAddLog() {
- MWDebug::log( 'logging a string' );
- $this->assertEquals( array( array(
- 'msg' => 'logging a string',
- 'type' => 'log',
- 'caller' => __METHOD__ ,
- ) ),
- MWDebug::getLog()
- );
- }
-
- function testAddWarning() {
- MWDebug::warning( 'Warning message' );
- $this->assertEquals( array( array(
- 'msg' => 'Warning message',
- 'type' => 'warn',
- 'caller' => 'MWDebugTest::testAddWarning',
- ) ),
- MWDebug::getLog()
- );
- }
-
- function testAvoidDuplicateDeprecations() {
- MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
- MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
-
- // assertCount() not available on WMF integration server
- $this->assertEquals( 1,
- count( MWDebug::getLog() ),
- "Only one deprecated warning per function should be kept"
- );
- }
-
- function testAvoidNonConsecutivesDuplicateDeprecations() {
- MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
- MWDebug::warning( 'some warning' );
- MWDebug::log( 'we could have logged something too' );
- // Another deprecation
- MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
-
- // assertCount() not available on WMF integration server
- $this->assertEquals( 3,
- count( MWDebug::getLog() ),
- "Only one deprecated warning per function should be kept"
- );
- }
-}
diff --git a/tests/phpunit/includes/filerepo/FileBackendTest.php b/tests/phpunit/includes/filerepo/FileBackendTest.php
deleted file mode 100644
index a2dc5c6c..00000000
--- a/tests/phpunit/includes/filerepo/FileBackendTest.php
+++ /dev/null
@@ -1,1868 +0,0 @@
-<?php
-
-/**
- * @group FileRepo
- * @group FileBackend
- * @group medium
- */
-class FileBackendTest extends MediaWikiTestCase {
- private $backend, $multiBackend;
- private $filesToPrune = array();
- private static $backendToUse;
-
- function setUp() {
- global $wgFileBackends;
- parent::setUp();
- $tmpPrefix = wfTempDir() . '/filebackend-unittest-' . time() . '-' . mt_rand();
- if ( $this->getCliArg( 'use-filebackend=' ) ) {
- if ( self::$backendToUse ) {
- $this->singleBackend = self::$backendToUse;
- } else {
- $name = $this->getCliArg( 'use-filebackend=' );
- $useConfig = array();
- foreach ( $wgFileBackends as $conf ) {
- if ( $conf['name'] == $name ) {
- $useConfig = $conf;
- break;
- }
- }
- $useConfig['name'] = 'localtesting'; // swap name
- $useConfig['shardViaHashLevels'] = array( // test sharding
- 'unittest-cont1' => array( 'levels' => 1, 'base' => 16, 'repeat' => 1 )
- );
- $class = $useConfig['class'];
- self::$backendToUse = new $class( $useConfig );
- $this->singleBackend = self::$backendToUse;
- }
- } else {
- $this->singleBackend = new FSFileBackend( array(
- 'name' => 'localtesting',
- 'lockManager' => 'fsLockManager',
- #'parallelize' => 'implicit',
- 'containerPaths' => array(
- 'unittest-cont1' => "{$tmpPrefix}-localtesting-cont1",
- 'unittest-cont2' => "{$tmpPrefix}-localtesting-cont2" )
- ) );
- }
- $this->multiBackend = new FileBackendMultiWrite( array(
- 'name' => 'localtesting',
- 'lockManager' => 'fsLockManager',
- 'parallelize' => 'implicit',
- 'backends' => array(
- array(
- 'name' => 'localmutlitesting1',
- 'class' => 'FSFileBackend',
- 'lockManager' => 'nullLockManager',
- 'containerPaths' => array(
- 'unittest-cont1' => "{$tmpPrefix}-localtestingmulti1-cont1",
- 'unittest-cont2' => "{$tmpPrefix}-localtestingmulti1-cont2" ),
- 'isMultiMaster' => false
- ),
- array(
- 'name' => 'localmutlitesting2',
- 'class' => 'FSFileBackend',
- 'lockManager' => 'nullLockManager',
- 'containerPaths' => array(
- 'unittest-cont1' => "{$tmpPrefix}-localtestingmulti2-cont1",
- 'unittest-cont2' => "{$tmpPrefix}-localtestingmulti2-cont2" ),
- 'isMultiMaster' => true
- )
- )
- ) );
- $this->filesToPrune = array();
- }
-
- private function baseStorePath() {
- return 'mwstore://localtesting';
- }
-
- private function backendClass() {
- return get_class( $this->backend );
- }
-
- /**
- * @dataProvider provider_testIsStoragePath
- */
- public function testIsStoragePath( $path, $isStorePath ) {
- $this->assertEquals( $isStorePath, FileBackend::isStoragePath( $path ),
- "FileBackend::isStoragePath on path '$path'" );
- }
-
- function provider_testIsStoragePath() {
- return array(
- array( 'mwstore://', true ),
- array( 'mwstore://backend', true ),
- array( 'mwstore://backend/container', true ),
- array( 'mwstore://backend/container/', true ),
- array( 'mwstore://backend/container/path', true ),
- array( 'mwstore://backend//container/', true ),
- array( 'mwstore://backend//container//', true ),
- array( 'mwstore://backend//container//path', true ),
- array( 'mwstore:///', true ),
- array( 'mwstore:/', false ),
- array( 'mwstore:', false ),
- );
- }
-
- /**
- * @dataProvider provider_testSplitStoragePath
- */
- public function testSplitStoragePath( $path, $res ) {
- $this->assertEquals( $res, FileBackend::splitStoragePath( $path ),
- "FileBackend::splitStoragePath on path '$path'" );
- }
-
- function provider_testSplitStoragePath() {
- return array(
- array( 'mwstore://backend/container', array( 'backend', 'container', '' ) ),
- array( 'mwstore://backend/container/', array( 'backend', 'container', '' ) ),
- array( 'mwstore://backend/container/path', array( 'backend', 'container', 'path' ) ),
- array( 'mwstore://backend/container//path', array( 'backend', 'container', '/path' ) ),
- array( 'mwstore://backend//container/path', array( null, null, null ) ),
- array( 'mwstore://backend//container//path', array( null, null, null ) ),
- array( 'mwstore://', array( null, null, null ) ),
- array( 'mwstore://backend', array( null, null, null ) ),
- array( 'mwstore:///', array( null, null, null ) ),
- array( 'mwstore:/', array( null, null, null ) ),
- array( 'mwstore:', array( null, null, null ) )
- );
- }
-
- /**
- * @dataProvider provider_normalizeStoragePath
- */
- public function testNormalizeStoragePath( $path, $res ) {
- $this->assertEquals( $res, FileBackend::normalizeStoragePath( $path ),
- "FileBackend::normalizeStoragePath on path '$path'" );
- }
-
- function provider_normalizeStoragePath() {
- return array(
- array( 'mwstore://backend/container', 'mwstore://backend/container' ),
- array( 'mwstore://backend/container/', 'mwstore://backend/container' ),
- 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://', null ),
- array( 'mwstore://backend', null ),
- array( 'mwstore://backend//container/path', null ),
- array( 'mwstore://backend//container//path', null ),
- array( 'mwstore:///', null ),
- array( 'mwstore:/', null ),
- array( 'mwstore:', null ), )
- );
- }
-
- /**
- * @dataProvider provider_testParentStoragePath
- */
- public function testParentStoragePath( $path, $res ) {
- $this->assertEquals( $res, FileBackend::parentStoragePath( $path ),
- "FileBackend::parentStoragePath on path '$path'" );
- }
-
- function provider_testParentStoragePath() {
- return array(
- array( 'mwstore://backend/container/path/to/obj', 'mwstore://backend/container/path/to' ),
- array( 'mwstore://backend/container/path/to', 'mwstore://backend/container/path' ),
- array( 'mwstore://backend/container/path', 'mwstore://backend/container' ),
- array( 'mwstore://backend/container', null ),
- array( 'mwstore://backend/container/path/to/obj/', 'mwstore://backend/container/path/to' ),
- array( 'mwstore://backend/container/path/to/', 'mwstore://backend/container/path' ),
- array( 'mwstore://backend/container/path/', 'mwstore://backend/container' ),
- array( 'mwstore://backend/container/', null ),
- );
- }
-
- /**
- * @dataProvider provider_testExtensionFromPath
- */
- public function testExtensionFromPath( $path, $res ) {
- $this->assertEquals( $res, FileBackend::extensionFromPath( $path ),
- "FileBackend::extensionFromPath on path '$path'" );
- }
-
- function provider_testExtensionFromPath() {
- return array(
- array( 'mwstore://backend/container/path.txt', 'txt' ),
- array( 'mwstore://backend/container/path.svg.png', 'png' ),
- array( 'mwstore://backend/container/path', '' ),
- array( 'mwstore://backend/container/path.', '' ),
- );
- }
-
- /**
- * @dataProvider provider_testStore
- */
- public function testStore( $op ) {
- $this->filesToPrune[] = $op['src'];
-
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestStore( $op );
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestStore( $op );
- $this->filesToPrune[] = $op['src']; # avoid file leaking
- $this->tearDownFiles();
- }
-
- private function doTestStore( $op ) {
- $backendName = $this->backendClass();
-
- $source = $op['src'];
- $dest = $op['dst'];
- $this->prepare( array( 'dir' => dirname( $dest ) ) );
-
- file_put_contents( $source, "Unit test file" );
-
- if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
- $this->backend->store( $op );
- }
-
- $status = $this->backend->doOperation( $op );
-
- $this->assertGoodStatus( $status,
- "Store from $source to $dest succeeded without warnings ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Store from $source to $dest succeeded ($backendName)." );
- $this->assertEquals( array( 0 => true ), $status->success,
- "Store from $source to $dest has proper 'success' field in Status ($backendName)." );
- $this->assertEquals( true, file_exists( $source ),
- "Source file $source still exists ($backendName)." );
- $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
- "Destination file $dest exists ($backendName)." );
-
- $this->assertEquals( filesize( $source ),
- $this->backend->getFileSize( array( 'src' => $dest ) ),
- "Destination file $dest has correct size ($backendName)." );
-
- $props1 = FSFile::getPropsFromPath( $source );
- $props2 = $this->backend->getFileProps( array( 'src' => $dest ) );
- $this->assertEquals( $props1, $props2,
- "Source and destination have the same props ($backendName)." );
-
- $this->assertBackendPathsConsistent( array( $dest ) );
- }
-
- public function provider_testStore() {
- $cases = array();
-
- $tmpName = TempFSFile::factory( "unittests_", 'txt' )->getPath();
- $toPath = $this->baseStorePath() . '/unittest-cont1/e/fun/obj1.txt';
- $op = array( 'op' => 'store', 'src' => $tmpName, 'dst' => $toPath );
- $cases[] = array(
- $op, // operation
- $tmpName, // source
- $toPath, // dest
- );
-
- $op2 = $op;
- $op2['overwrite'] = true;
- $cases[] = array(
- $op2, // operation
- $tmpName, // source
- $toPath, // dest
- );
-
- $op2 = $op;
- $op2['overwriteSame'] = true;
- $cases[] = array(
- $op2, // operation
- $tmpName, // source
- $toPath, // dest
- );
-
- return $cases;
- }
-
- /**
- * @dataProvider provider_testCopy
- */
- public function testCopy( $op ) {
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestCopy( $op );
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestCopy( $op );
- $this->tearDownFiles();
- }
-
- private function doTestCopy( $op ) {
- $backendName = $this->backendClass();
-
- $source = $op['src'];
- $dest = $op['dst'];
- $this->prepare( array( 'dir' => dirname( $source ) ) );
- $this->prepare( array( 'dir' => dirname( $dest ) ) );
-
- $status = $this->backend->doOperation(
- array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
- $this->assertGoodStatus( $status,
- "Creation of file at $source succeeded ($backendName)." );
-
- if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
- $this->backend->copy( $op );
- }
-
- $status = $this->backend->doOperation( $op );
-
- $this->assertGoodStatus( $status,
- "Copy from $source to $dest succeeded without warnings ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Copy from $source to $dest succeeded ($backendName)." );
- $this->assertEquals( array( 0 => true ), $status->success,
- "Copy from $source to $dest has proper 'success' field in Status ($backendName)." );
- $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $source ) ),
- "Source file $source still exists ($backendName)." );
- $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
- "Destination file $dest exists after copy ($backendName)." );
-
- $this->assertEquals(
- $this->backend->getFileSize( array( 'src' => $source ) ),
- $this->backend->getFileSize( array( 'src' => $dest ) ),
- "Destination file $dest has correct size ($backendName)." );
-
- $props1 = $this->backend->getFileProps( array( 'src' => $source ) );
- $props2 = $this->backend->getFileProps( array( 'src' => $dest ) );
- $this->assertEquals( $props1, $props2,
- "Source and destination have the same props ($backendName)." );
-
- $this->assertBackendPathsConsistent( array( $source, $dest ) );
- }
-
- public function provider_testCopy() {
- $cases = array();
-
- $source = $this->baseStorePath() . '/unittest-cont1/e/file.txt';
- $dest = $this->baseStorePath() . '/unittest-cont2/a/fileMoved.txt';
-
- $op = array( 'op' => 'copy', 'src' => $source, 'dst' => $dest );
- $cases[] = array(
- $op, // operation
- $source, // source
- $dest, // dest
- );
-
- $op2 = $op;
- $op2['overwrite'] = true;
- $cases[] = array(
- $op2, // operation
- $source, // source
- $dest, // dest
- );
-
- $op2 = $op;
- $op2['overwriteSame'] = true;
- $cases[] = array(
- $op2, // operation
- $source, // source
- $dest, // dest
- );
-
- return $cases;
- }
-
- /**
- * @dataProvider provider_testMove
- */
- public function testMove( $op ) {
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestMove( $op );
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestMove( $op );
- $this->tearDownFiles();
- }
-
- private function doTestMove( $op ) {
- $backendName = $this->backendClass();
-
- $source = $op['src'];
- $dest = $op['dst'];
- $this->prepare( array( 'dir' => dirname( $source ) ) );
- $this->prepare( array( 'dir' => dirname( $dest ) ) );
-
- $status = $this->backend->doOperation(
- array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
- $this->assertGoodStatus( $status,
- "Creation of file at $source succeeded ($backendName)." );
-
- if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
- $this->backend->copy( $op );
- }
-
- $status = $this->backend->doOperation( $op );
- $this->assertGoodStatus( $status,
- "Move from $source to $dest succeeded without warnings ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Move from $source to $dest succeeded ($backendName)." );
- $this->assertEquals( array( 0 => true ), $status->success,
- "Move from $source to $dest has proper 'success' field in Status ($backendName)." );
- $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $source ) ),
- "Source file $source does not still exists ($backendName)." );
- $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
- "Destination file $dest exists after move ($backendName)." );
-
- $this->assertNotEquals(
- $this->backend->getFileSize( array( 'src' => $source ) ),
- $this->backend->getFileSize( array( 'src' => $dest ) ),
- "Destination file $dest has correct size ($backendName)." );
-
- $props1 = $this->backend->getFileProps( array( 'src' => $source ) );
- $props2 = $this->backend->getFileProps( array( 'src' => $dest ) );
- $this->assertEquals( false, $props1['fileExists'],
- "Source file does not exist accourding to props ($backendName)." );
- $this->assertEquals( true, $props2['fileExists'],
- "Destination file exists accourding to props ($backendName)." );
-
- $this->assertBackendPathsConsistent( array( $source, $dest ) );
- }
-
- public function provider_testMove() {
- $cases = array();
-
- $source = $this->baseStorePath() . '/unittest-cont1/e/file.txt';
- $dest = $this->baseStorePath() . '/unittest-cont2/a/fileMoved.txt';
-
- $op = array( 'op' => 'move', 'src' => $source, 'dst' => $dest );
- $cases[] = array(
- $op, // operation
- $source, // source
- $dest, // dest
- );
-
- $op2 = $op;
- $op2['overwrite'] = true;
- $cases[] = array(
- $op2, // operation
- $source, // source
- $dest, // dest
- );
-
- $op2 = $op;
- $op2['overwriteSame'] = true;
- $cases[] = array(
- $op2, // operation
- $source, // source
- $dest, // dest
- );
-
- return $cases;
- }
-
- /**
- * @dataProvider provider_testDelete
- */
- public function testDelete( $op, $withSource, $okStatus ) {
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestDelete( $op, $withSource, $okStatus );
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestDelete( $op, $withSource, $okStatus );
- $this->tearDownFiles();
- }
-
- private function doTestDelete( $op, $withSource, $okStatus ) {
- $backendName = $this->backendClass();
-
- $source = $op['src'];
- $this->prepare( array( 'dir' => dirname( $source ) ) );
-
- if ( $withSource ) {
- $status = $this->backend->doOperation(
- array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
- $this->assertGoodStatus( $status,
- "Creation of file at $source succeeded ($backendName)." );
- }
-
- $status = $this->backend->doOperation( $op );
- if ( $okStatus ) {
- $this->assertGoodStatus( $status,
- "Deletion of file at $source succeeded without warnings ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Deletion of file at $source succeeded ($backendName)." );
- $this->assertEquals( array( 0 => true ), $status->success,
- "Deletion of file at $source has proper 'success' field in Status ($backendName)." );
- } else {
- $this->assertEquals( false, $status->isOK(),
- "Deletion of file at $source failed ($backendName)." );
- }
-
- $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $source ) ),
- "Source file $source does not exist after move ($backendName)." );
-
- $this->assertFalse(
- $this->backend->getFileSize( array( 'src' => $source ) ),
- "Source file $source has correct size (false) ($backendName)." );
-
- $props1 = $this->backend->getFileProps( array( 'src' => $source ) );
- $this->assertFalse( $props1['fileExists'],
- "Source file $source does not exist according to props ($backendName)." );
-
- $this->assertBackendPathsConsistent( array( $source ) );
- }
-
- public function provider_testDelete() {
- $cases = array();
-
- $source = $this->baseStorePath() . '/unittest-cont1/e/myfacefile.txt';
-
- $op = array( 'op' => 'delete', 'src' => $source );
- $cases[] = array(
- $op, // operation
- true, // with source
- true // succeeds
- );
-
- $cases[] = array(
- $op, // operation
- false, // without source
- false // fails
- );
-
- $op['ignoreMissingSource'] = true;
- $cases[] = array(
- $op, // operation
- false, // without source
- true // succeeds
- );
-
- return $cases;
- }
-
- /**
- * @dataProvider provider_testCreate
- */
- public function testCreate( $op, $alreadyExists, $okStatus, $newSize ) {
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestCreate( $op, $alreadyExists, $okStatus, $newSize );
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestCreate( $op, $alreadyExists, $okStatus, $newSize );
- $this->tearDownFiles();
- }
-
- private function doTestCreate( $op, $alreadyExists, $okStatus, $newSize ) {
- $backendName = $this->backendClass();
-
- $dest = $op['dst'];
- $this->prepare( array( 'dir' => dirname( $dest ) ) );
-
- $oldText = 'blah...blah...waahwaah';
- if ( $alreadyExists ) {
- $status = $this->backend->doOperation(
- array( 'op' => 'create', 'content' => $oldText, 'dst' => $dest ) );
- $this->assertGoodStatus( $status,
- "Creation of file at $dest succeeded ($backendName)." );
- }
-
- $status = $this->backend->doOperation( $op );
- if ( $okStatus ) {
- $this->assertGoodStatus( $status,
- "Creation of file at $dest succeeded without warnings ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Creation of file at $dest succeeded ($backendName)." );
- $this->assertEquals( array( 0 => true ), $status->success,
- "Creation of file at $dest has proper 'success' field in Status ($backendName)." );
- } else {
- $this->assertEquals( false, $status->isOK(),
- "Creation of file at $dest failed ($backendName)." );
- }
-
- $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
- "Destination file $dest exists after creation ($backendName)." );
-
- $props1 = $this->backend->getFileProps( array( 'src' => $dest ) );
- $this->assertEquals( true, $props1['fileExists'],
- "Destination file $dest exists according to props ($backendName)." );
- if ( $okStatus ) { // file content is what we saved
- $this->assertEquals( $newSize, $props1['size'],
- "Destination file $dest has expected size according to props ($backendName)." );
- $this->assertEquals( $newSize,
- $this->backend->getFileSize( array( 'src' => $dest ) ),
- "Destination file $dest has correct size ($backendName)." );
- } else { // file content is some other previous text
- $this->assertEquals( strlen( $oldText ), $props1['size'],
- "Destination file $dest has original size according to props ($backendName)." );
- $this->assertEquals( strlen( $oldText ),
- $this->backend->getFileSize( array( 'src' => $dest ) ),
- "Destination file $dest has original size according to props ($backendName)." );
- }
-
- $this->assertBackendPathsConsistent( array( $dest ) );
- }
-
- /**
- * @dataProvider provider_testCreate
- */
- public function provider_testCreate() {
- $cases = array();
-
- $dest = $this->baseStorePath() . '/unittest-cont2/a/myspacefile.txt';
-
- $op = array( 'op' => 'create', 'content' => 'test test testing', 'dst' => $dest );
- $cases[] = array(
- $op, // operation
- false, // no dest already exists
- true, // succeeds
- strlen( $op['content'] )
- );
-
- $op2 = $op;
- $op2['content'] = "\n";
- $cases[] = array(
- $op2, // operation
- false, // no dest already exists
- true, // succeeds
- strlen( $op2['content'] )
- );
-
- $op2 = $op;
- $op2['content'] = "fsf\n waf 3kt";
- $cases[] = array(
- $op2, // operation
- true, // dest already exists
- false, // fails
- strlen( $op2['content'] )
- );
-
- $op2 = $op;
- $op2['content'] = "egm'g gkpe gpqg eqwgwqg";
- $op2['overwrite'] = true;
- $cases[] = array(
- $op2, // operation
- true, // dest already exists
- true, // succeeds
- strlen( $op2['content'] )
- );
-
- $op2 = $op;
- $op2['content'] = "39qjmg3-qg";
- $op2['overwriteSame'] = true;
- $cases[] = array(
- $op2, // operation
- true, // dest already exists
- false, // succeeds
- strlen( $op2['content'] )
- );
-
- return $cases;
- }
-
- public function testDoQuickOperations() {
- $this->backend = $this->singleBackend;
- $this->doTestDoQuickOperations();
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->doTestDoQuickOperations();
- $this->tearDownFiles();
- }
-
- private function doTestDoQuickOperations() {
- $backendName = $this->backendClass();
-
- $base = $this->baseStorePath();
- $files = array(
- "$base/unittest-cont1/e/fileA.a",
- "$base/unittest-cont1/e/fileB.a",
- "$base/unittest-cont1/e/fileC.a"
- );
- $ops = array();
- $purgeOps = array();
- foreach ( $files as $path ) {
- $status = $this->prepare( array( 'dir' => dirname( $path ) ) );
- $this->assertGoodStatus( $status,
- "Preparing $path succeeded without warnings ($backendName)." );
- $ops[] = array( 'op' => 'create', 'dst' => $path, 'content' => mt_rand(0,50000) );
- $purgeOps[] = array( 'op' => 'delete', 'src' => $path );
- }
- $purgeOps[] = array( 'op' => 'null' );
- $status = $this->backend->doQuickOperations( $ops );
- $this->assertGoodStatus( $status,
- "Creation of source files succeeded ($backendName)." );
-
- foreach ( $files as $file ) {
- $this->assertTrue( $this->backend->fileExists( array( 'src' => $file ) ),
- "File $file exists." );
- }
-
- $status = $this->backend->doQuickOperations( $purgeOps );
- $this->assertGoodStatus( $status,
- "Quick deletion of source files succeeded ($backendName)." );
-
- foreach ( $files as $file ) {
- $this->assertFalse( $this->backend->fileExists( array( 'src' => $file ) ),
- "File $file purged." );
- }
- }
-
- /**
- * @dataProvider provider_testConcatenate
- */
- public function testConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus ) {
- $this->filesToPrune[] = $op['dst'];
-
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus );
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus );
- $this->filesToPrune[] = $op['dst']; # avoid file leaking
- $this->tearDownFiles();
- }
-
- private function doTestConcatenate( $params, $srcs, $srcsContent, $alreadyExists, $okStatus ) {
- $backendName = $this->backendClass();
-
- $expContent = '';
- // Create sources
- $ops = array();
- foreach ( $srcs as $i => $source ) {
- $this->prepare( array( 'dir' => dirname( $source ) ) );
- $ops[] = array(
- 'op' => 'create', // operation
- 'dst' => $source, // source
- 'content' => $srcsContent[$i]
- );
- $expContent .= $srcsContent[$i];
- }
- $status = $this->backend->doOperations( $ops );
-
- $this->assertGoodStatus( $status,
- "Creation of source files succeeded ($backendName)." );
-
- $dest = $params['dst'];
- if ( $alreadyExists ) {
- $ok = file_put_contents( $dest, 'blah...blah...waahwaah' ) !== false;
- $this->assertEquals( true, $ok,
- "Creation of file at $dest succeeded ($backendName)." );
- } else {
- $ok = file_put_contents( $dest, '' ) !== false;
- $this->assertEquals( true, $ok,
- "Creation of 0-byte file at $dest succeeded ($backendName)." );
- }
-
- // Combine the files into one
- $status = $this->backend->concatenate( $params );
- if ( $okStatus ) {
- $this->assertGoodStatus( $status,
- "Creation of concat file at $dest succeeded without warnings ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Creation of concat file at $dest succeeded ($backendName)." );
- } else {
- $this->assertEquals( false, $status->isOK(),
- "Creation of concat file at $dest failed ($backendName)." );
- }
-
- if ( $okStatus ) {
- $this->assertEquals( true, is_file( $dest ),
- "Dest concat file $dest exists after creation ($backendName)." );
- } else {
- $this->assertEquals( true, is_file( $dest ),
- "Dest concat file $dest exists after failed creation ($backendName)." );
- }
-
- $contents = file_get_contents( $dest );
- $this->assertNotEquals( false, $contents, "File at $dest exists ($backendName)." );
-
- if ( $okStatus ) {
- $this->assertEquals( $expContent, $contents,
- "Concat file at $dest has correct contents ($backendName)." );
- } else {
- $this->assertNotEquals( $expContent, $contents,
- "Concat file at $dest has correct contents ($backendName)." );
- }
- }
-
- function provider_testConcatenate() {
- $cases = array();
-
- $rand = mt_rand( 0, 2000000000 ) . time();
- $dest = wfTempDir() . "/randomfile!$rand.txt";
- $srcs = array(
- $this->baseStorePath() . '/unittest-cont1/e/file1.txt',
- $this->baseStorePath() . '/unittest-cont1/e/file2.txt',
- $this->baseStorePath() . '/unittest-cont1/e/file3.txt',
- $this->baseStorePath() . '/unittest-cont1/e/file4.txt',
- $this->baseStorePath() . '/unittest-cont1/e/file5.txt',
- $this->baseStorePath() . '/unittest-cont1/e/file6.txt',
- $this->baseStorePath() . '/unittest-cont1/e/file7.txt',
- $this->baseStorePath() . '/unittest-cont1/e/file8.txt',
- $this->baseStorePath() . '/unittest-cont1/e/file9.txt',
- $this->baseStorePath() . '/unittest-cont1/e/file10.txt'
- );
- $content = array(
- 'egfage',
- 'ageageag',
- 'rhokohlr',
- 'shgmslkg',
- 'kenga',
- 'owagmal',
- 'kgmae',
- 'g eak;g',
- 'lkaem;a',
- 'legma'
- );
- $params = array( 'srcs' => $srcs, 'dst' => $dest );
-
- $cases[] = array(
- $params, // operation
- $srcs, // sources
- $content, // content for each source
- false, // no dest already exists
- true, // succeeds
- );
-
- $cases[] = array(
- $params, // operation
- $srcs, // sources
- $content, // content for each source
- true, // dest already exists
- false, // succeeds
- );
-
- return $cases;
- }
-
- /**
- * @dataProvider provider_testGetFileStat
- */
- public function testGetFileStat( $path, $content, $alreadyExists ) {
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestGetFileStat( $path, $content, $alreadyExists );
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestGetFileStat( $path, $content, $alreadyExists );
- $this->tearDownFiles();
- }
-
- private function doTestGetFileStat( $path, $content, $alreadyExists ) {
- $backendName = $this->backendClass();
-
- if ( $alreadyExists ) {
- $this->prepare( array( 'dir' => dirname( $path ) ) );
- $status = $this->create( array( 'dst' => $path, 'content' => $content ) );
- $this->assertGoodStatus( $status,
- "Creation of file at $path succeeded ($backendName)." );
-
- $size = $this->backend->getFileSize( array( 'src' => $path ) );
- $time = $this->backend->getFileTimestamp( array( 'src' => $path ) );
- $stat = $this->backend->getFileStat( array( 'src' => $path ) );
-
- $this->assertEquals( strlen( $content ), $size,
- "Correct file size of '$path'" );
- $this->assertTrue( abs( time() - wfTimestamp( TS_UNIX, $time ) ) < 10,
- "Correct file timestamp of '$path'" );
-
- $size = $stat['size'];
- $time = $stat['mtime'];
- $this->assertEquals( strlen( $content ), $size,
- "Correct file size of '$path'" );
- $this->assertTrue( abs( time() - wfTimestamp( TS_UNIX, $time ) ) < 10,
- "Correct file timestamp of '$path'" );
-
- $this->backend->clearCache( array( $path ) );
-
- $size = $this->backend->getFileSize( array( 'src' => $path ) );
-
- $this->assertEquals( strlen( $content ), $size,
- "Correct file size of '$path'" );
-
- $this->backend->preloadCache( array( $path ) );
-
- $size = $this->backend->getFileSize( array( 'src' => $path ) );
-
- $this->assertEquals( strlen( $content ), $size,
- "Correct file size of '$path'" );
- } else {
- $size = $this->backend->getFileSize( array( 'src' => $path ) );
- $time = $this->backend->getFileTimestamp( array( 'src' => $path ) );
- $stat = $this->backend->getFileStat( array( 'src' => $path ) );
-
- $this->assertFalse( $size, "Correct file size of '$path'" );
- $this->assertFalse( $time, "Correct file timestamp of '$path'" );
- $this->assertFalse( $stat, "Correct file stat of '$path'" );
- }
- }
-
- function provider_testGetFileStat() {
- $cases = array();
-
- $base = $this->baseStorePath();
- $cases[] = array( "$base/unittest-cont1/e/b/z/some_file.txt", "some file contents", true );
- $cases[] = array( "$base/unittest-cont1/e/b/some-other_file.txt", "", true );
- $cases[] = array( "$base/unittest-cont1/e/b/some-diff_file.txt", null, false );
-
- return $cases;
- }
-
- /**
- * @dataProvider provider_testGetFileContents
- */
- public function testGetFileContents( $source, $content ) {
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestGetFileContents( $source, $content );
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestGetFileContents( $source, $content );
- $this->tearDownFiles();
- }
-
- private function doTestGetFileContents( $source, $content ) {
- $backendName = $this->backendClass();
-
- $this->prepare( array( 'dir' => dirname( $source ) ) );
-
- $status = $this->backend->doOperation(
- array( 'op' => 'create', 'content' => $content, 'dst' => $source ) );
- $this->assertGoodStatus( $status,
- "Creation of file at $source succeeded ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Creation of file at $source succeeded with OK status ($backendName)." );
-
- $newContents = $this->backend->getFileContents( array( 'src' => $source, 'latest' => 1 ) );
- $this->assertNotEquals( false, $newContents,
- "Read of file at $source succeeded ($backendName)." );
-
- $this->assertEquals( $content, $newContents,
- "Contents read match data at $source ($backendName)." );
- }
-
- function provider_testGetFileContents() {
- $cases = array();
-
- $base = $this->baseStorePath();
- $cases[] = array( "$base/unittest-cont1/e/b/z/some_file.txt", "some file contents" );
- $cases[] = array( "$base/unittest-cont1/e/b/some-other_file.txt", "more file contents" );
-
- return $cases;
- }
-
- /**
- * @dataProvider provider_testGetLocalCopy
- */
- public function testGetLocalCopy( $source, $content ) {
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestGetLocalCopy( $source, $content );
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestGetLocalCopy( $source, $content );
- $this->tearDownFiles();
- }
-
- private function doTestGetLocalCopy( $source, $content ) {
- $backendName = $this->backendClass();
-
- $this->prepare( array( 'dir' => dirname( $source ) ) );
-
- $status = $this->backend->doOperation(
- array( 'op' => 'create', 'content' => $content, 'dst' => $source ) );
- $this->assertGoodStatus( $status,
- "Creation of file at $source succeeded ($backendName)." );
-
- $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)." );
- }
-
- function provider_testGetLocalCopy() {
- $cases = array();
-
- $base = $this->baseStorePath();
- $cases[] = array( "$base/unittest-cont1/e/a/z/some_file.txt", "some file contents" );
- $cases[] = array( "$base/unittest-cont1/e/a/some-other_file.txt", "more file contents" );
-
- return $cases;
- }
-
- /**
- * @dataProvider provider_testGetLocalReference
- */
- public function testGetLocalReference( $source, $content ) {
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestGetLocalReference( $source, $content );
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestGetLocalReference( $source, $content );
- $this->tearDownFiles();
- }
-
- private function doTestGetLocalReference( $source, $content ) {
- $backendName = $this->backendClass();
-
- $this->prepare( array( 'dir' => dirname( $source ) ) );
-
- $status = $this->create( array( 'content' => $content, 'dst' => $source ) );
- $this->assertGoodStatus( $status,
- "Creation of file at $source succeeded ($backendName)." );
-
- $tmpFile = $this->backend->getLocalReference( 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)." );
- }
-
- function provider_testGetLocalReference() {
- $cases = array();
-
- $base = $this->baseStorePath();
- $cases[] = array( "$base/unittest-cont1/e/a/z/some_file.txt", "some file contents" );
- $cases[] = array( "$base/unittest-cont1/e/a/some-other_file.txt", "more file contents" );
-
- return $cases;
- }
-
- /**
- * @dataProvider provider_testPrepareAndClean
- */
- public function testPrepareAndClean( $path, $isOK ) {
- $this->backend = $this->singleBackend;
- $this->doTestPrepareAndClean( $path, $isOK );
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->doTestPrepareAndClean( $path, $isOK );
- $this->tearDownFiles();
- }
-
- function provider_testPrepareAndClean() {
- $base = $this->baseStorePath();
- return array(
- array( "$base/unittest-cont1/e/a/z/some_file1.txt", true ),
- array( "$base/unittest-cont2/a/z/some_file2.txt", true ),
- # Specific to FS backend with no basePath field set
- #array( "$base/unittest-cont3/a/z/some_file3.txt", false ),
- );
- }
-
- private function doTestPrepareAndClean( $path, $isOK ) {
- $backendName = $this->backendClass();
-
- $status = $this->prepare( array( 'dir' => dirname( $path ) ) );
- if ( $isOK ) {
- $this->assertGoodStatus( $status,
- "Preparing dir $path succeeded without warnings ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Preparing dir $path succeeded ($backendName)." );
- } else {
- $this->assertEquals( false, $status->isOK(),
- "Preparing dir $path failed ($backendName)." );
- }
-
- $status = $this->backend->clean( array( 'dir' => dirname( $path ) ) );
- if ( $isOK ) {
- $this->assertGoodStatus( $status,
- "Cleaning dir $path succeeded without warnings ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Cleaning dir $path succeeded ($backendName)." );
- } else {
- $this->assertEquals( false, $status->isOK(),
- "Cleaning dir $path failed ($backendName)." );
- }
- }
-
- public function testRecursiveClean() {
- $this->backend = $this->singleBackend;
- $this->doTestRecursiveClean();
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->doTestRecursiveClean();
- $this->tearDownFiles();
- }
-
- private function doTestRecursiveClean() {
- $backendName = $this->backendClass();
-
- $base = $this->baseStorePath();
- $dirs = array(
- "$base/unittest-cont1/e/a",
- "$base/unittest-cont1/e/a/b",
- "$base/unittest-cont1/e/a/b/c",
- "$base/unittest-cont1/e/a/b/c/d0",
- "$base/unittest-cont1/e/a/b/c/d1",
- "$base/unittest-cont1/e/a/b/c/d2",
- "$base/unittest-cont1/e/a/b/c/d0/1",
- "$base/unittest-cont1/e/a/b/c/d0/2",
- "$base/unittest-cont1/e/a/b/c/d1/3",
- "$base/unittest-cont1/e/a/b/c/d1/4",
- "$base/unittest-cont1/e/a/b/c/d2/5",
- "$base/unittest-cont1/e/a/b/c/d2/6"
- );
- foreach ( $dirs as $dir ) {
- $status = $this->prepare( array( 'dir' => $dir ) );
- $this->assertGoodStatus( $status,
- "Preparing dir $dir succeeded without warnings ($backendName)." );
- }
-
- if ( $this->backend instanceof FSFileBackend ) {
- foreach ( $dirs as $dir ) {
- $this->assertEquals( true, $this->backend->directoryExists( array( 'dir' => $dir ) ),
- "Dir $dir exists ($backendName)." );
- }
- }
-
- $status = $this->backend->clean(
- array( 'dir' => "$base/unittest-cont1", 'recursive' => 1 ) );
- $this->assertGoodStatus( $status,
- "Recursive cleaning of dir $dir succeeded without warnings ($backendName)." );
-
- foreach ( $dirs as $dir ) {
- $this->assertEquals( false, $this->backend->directoryExists( array( 'dir' => $dir ) ),
- "Dir $dir no longer exists ($backendName)." );
- }
- }
-
- // @TODO: testSecure
-
- public function testDoOperations() {
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestDoOperations();
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestDoOperations();
- $this->tearDownFiles();
- }
-
- private function doTestDoOperations() {
- $base = $this->baseStorePath();
-
- $fileA = "$base/unittest-cont1/e/a/b/fileA.txt";
- $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
- $fileB = "$base/unittest-cont1/e/a/b/fileB.txt";
- $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
- $fileC = "$base/unittest-cont1/e/a/b/fileC.txt";
- $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
- $fileD = "$base/unittest-cont1/e/a/b/fileD.txt";
-
- $this->prepare( array( 'dir' => dirname( $fileA ) ) );
- $this->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
- $this->prepare( array( 'dir' => dirname( $fileB ) ) );
- $this->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
- $this->prepare( array( 'dir' => dirname( $fileC ) ) );
- $this->create( array( 'dst' => $fileC, 'content' => $fileCContents ) );
- $this->prepare( array( 'dir' => dirname( $fileD ) ) );
-
- $status = $this->backend->doOperations( array(
- array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
- // Now: A:<A>, B:<B>, C:<A>, D:<empty> (file:<orginal contents>)
- array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileA, 'overwriteSame' => 1 ),
- // Now: A:<A>, B:<B>, C:<A>, D:<empty>
- array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileD, 'overwrite' => 1 ),
- // Now: A:<A>, B:<B>, C:<empty>, D:<A>
- array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileC ),
- // Now: A:<A>, B:<empty>, C:<B>, D:<A>
- array( 'op' => 'move', 'src' => $fileD, 'dst' => $fileA, 'overwriteSame' => 1 ),
- // Now: A:<A>, B:<empty>, C:<B>, D:<empty>
- array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileA, 'overwrite' => 1 ),
- // Now: A:<B>, B:<empty>, C:<empty>, D:<empty>
- array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC ),
- // Now: A:<B>, B:<empty>, C:<B>, D:<empty>
- array( 'op' => 'move', 'src' => $fileA, 'dst' => $fileC, 'overwriteSame' => 1 ),
- // Now: A:<empty>, B:<empty>, C:<B>, D:<empty>
- array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
- // Does nothing
- array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
- // Does nothing
- array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
- // Does nothing
- array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
- // Does nothing
- array( 'op' => 'null' ),
- // Does nothing
- ) );
-
- $this->assertGoodStatus( $status, "Operation batch succeeded" );
- $this->assertEquals( true, $status->isOK(), "Operation batch succeeded" );
- $this->assertEquals( 13, count( $status->success ),
- "Operation batch has correct success array" );
-
- $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileA ) ),
- "File does not exist at $fileA" );
- $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileB ) ),
- "File does not exist at $fileB" );
- $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileD ) ),
- "File does not exist at $fileD" );
-
- $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileC ) ),
- "File exists at $fileC" );
- $this->assertEquals( $fileBContents,
- $this->backend->getFileContents( array( 'src' => $fileC ) ),
- "Correct file contents of $fileC" );
- $this->assertEquals( strlen( $fileBContents ),
- $this->backend->getFileSize( array( 'src' => $fileC ) ),
- "Correct file size of $fileC" );
- $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
- $this->backend->getFileSha1Base36( array( 'src' => $fileC ) ),
- "Correct file SHA-1 of $fileC" );
- }
-
- public function testDoOperationsPipeline() {
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestDoOperationsPipeline();
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestDoOperationsPipeline();
- $this->tearDownFiles();
- }
-
- // concurrency orientated
- private function doTestDoOperationsPipeline() {
- $base = $this->baseStorePath();
-
- $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
- $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
- $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
-
- $tmpNameA = TempFSFile::factory( "unittests_", 'txt' )->getPath();
- file_put_contents( $tmpNameA, $fileAContents );
- $tmpNameB = TempFSFile::factory( "unittests_", 'txt' )->getPath();
- file_put_contents( $tmpNameB, $fileBContents );
- $tmpNameC = TempFSFile::factory( "unittests_", 'txt' )->getPath();
- file_put_contents( $tmpNameC, $fileCContents );
-
- $this->filesToPrune[] = $tmpNameA; # avoid file leaking
- $this->filesToPrune[] = $tmpNameB; # avoid file leaking
- $this->filesToPrune[] = $tmpNameC; # avoid file leaking
-
- $fileA = "$base/unittest-cont1/e/a/b/fileA.txt";
- $fileB = "$base/unittest-cont1/e/a/b/fileB.txt";
- $fileC = "$base/unittest-cont1/e/a/b/fileC.txt";
- $fileD = "$base/unittest-cont1/e/a/b/fileD.txt";
-
- $this->prepare( array( 'dir' => dirname( $fileA ) ) );
- $this->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
- $this->prepare( array( 'dir' => dirname( $fileB ) ) );
- $this->prepare( array( 'dir' => dirname( $fileC ) ) );
- $this->prepare( array( 'dir' => dirname( $fileD ) ) );
-
- $status = $this->backend->doOperations( array(
- array( 'op' => 'store', 'src' => $tmpNameA, 'dst' => $fileA, 'overwriteSame' => 1 ),
- array( 'op' => 'store', 'src' => $tmpNameB, 'dst' => $fileB, 'overwrite' => 1 ),
- array( 'op' => 'store', 'src' => $tmpNameC, 'dst' => $fileC, 'overwrite' => 1 ),
- array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
- // Now: A:<A>, B:<B>, C:<A>, D:<empty> (file:<orginal contents>)
- array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileA, 'overwriteSame' => 1 ),
- // Now: A:<A>, B:<B>, C:<A>, D:<empty>
- array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileD, 'overwrite' => 1 ),
- // Now: A:<A>, B:<B>, C:<empty>, D:<A>
- array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileC ),
- // Now: A:<A>, B:<empty>, C:<B>, D:<A>
- array( 'op' => 'move', 'src' => $fileD, 'dst' => $fileA, 'overwriteSame' => 1 ),
- // Now: A:<A>, B:<empty>, C:<B>, D:<empty>
- array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileA, 'overwrite' => 1 ),
- // Now: A:<B>, B:<empty>, C:<empty>, D:<empty>
- array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC ),
- // Now: A:<B>, B:<empty>, C:<B>, D:<empty>
- array( 'op' => 'move', 'src' => $fileA, 'dst' => $fileC, 'overwriteSame' => 1 ),
- // Now: A:<empty>, B:<empty>, C:<B>, D:<empty>
- array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
- // Does nothing
- array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
- // Does nothing
- array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
- // Does nothing
- array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
- // Does nothing
- array( 'op' => 'null' ),
- // Does nothing
- ) );
-
- $this->assertGoodStatus( $status, "Operation batch succeeded" );
- $this->assertEquals( true, $status->isOK(), "Operation batch succeeded" );
- $this->assertEquals( 16, count( $status->success ),
- "Operation batch has correct success array" );
-
- $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileA ) ),
- "File does not exist at $fileA" );
- $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileB ) ),
- "File does not exist at $fileB" );
- $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileD ) ),
- "File does not exist at $fileD" );
-
- $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileC ) ),
- "File exists at $fileC" );
- $this->assertEquals( $fileBContents,
- $this->backend->getFileContents( array( 'src' => $fileC ) ),
- "Correct file contents of $fileC" );
- $this->assertEquals( strlen( $fileBContents ),
- $this->backend->getFileSize( array( 'src' => $fileC ) ),
- "Correct file size of $fileC" );
- $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
- $this->backend->getFileSha1Base36( array( 'src' => $fileC ) ),
- "Correct file SHA-1 of $fileC" );
- }
-
- public function testDoOperationsFailing() {
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestDoOperationsFailing();
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestDoOperationsFailing();
- $this->tearDownFiles();
- }
-
- private function doTestDoOperationsFailing() {
- $base = $this->baseStorePath();
-
- $fileA = "$base/unittest-cont2/a/b/fileA.txt";
- $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
- $fileB = "$base/unittest-cont2/a/b/fileB.txt";
- $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
- $fileC = "$base/unittest-cont2/a/b/fileC.txt";
- $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
- $fileD = "$base/unittest-cont2/a/b/fileD.txt";
-
- $this->prepare( array( 'dir' => dirname( $fileA ) ) );
- $this->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
- $this->prepare( array( 'dir' => dirname( $fileB ) ) );
- $this->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
- $this->prepare( array( 'dir' => dirname( $fileC ) ) );
- $this->create( array( 'dst' => $fileC, 'content' => $fileCContents ) );
-
- $status = $this->backend->doOperations( array(
- array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
- // Now: A:<A>, B:<B>, C:<A>, D:<empty> (file:<orginal contents>)
- array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileA, 'overwriteSame' => 1 ),
- // Now: A:<A>, B:<B>, C:<A>, D:<empty>
- array( 'op' => 'copy', 'src' => $fileB, 'dst' => $fileD, 'overwrite' => 1 ),
- // Now: A:<A>, B:<B>, C:<A>, D:<B>
- array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileD ),
- // Now: A:<A>, B:<B>, C:<A>, D:<empty> (failed)
- array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileC, 'overwriteSame' => 1 ),
- // Now: A:<A>, B:<B>, C:<A>, D:<empty> (failed)
- array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileA, 'overwrite' => 1 ),
- // Now: A:<B>, B:<empty>, C:<A>, D:<empty>
- array( 'op' => 'delete', 'src' => $fileD ),
- // Now: A:<B>, B:<empty>, C:<A>, D:<empty>
- array( 'op' => 'null' ),
- // Does nothing
- ), array( 'force' => 1 ) );
-
- $this->assertNotEquals( array(), $status->errors, "Operation had warnings" );
- $this->assertEquals( true, $status->isOK(), "Operation batch succeeded" );
- $this->assertEquals( 8, count( $status->success ),
- "Operation batch has correct success array" );
-
- $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileB ) ),
- "File does not exist at $fileB" );
- $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileD ) ),
- "File does not exist at $fileD" );
-
- $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileA ) ),
- "File does not exist at $fileA" );
- $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileC ) ),
- "File exists at $fileC" );
- $this->assertEquals( $fileBContents,
- $this->backend->getFileContents( array( 'src' => $fileA ) ),
- "Correct file contents of $fileA" );
- $this->assertEquals( strlen( $fileBContents ),
- $this->backend->getFileSize( array( 'src' => $fileA ) ),
- "Correct file size of $fileA" );
- $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
- $this->backend->getFileSha1Base36( array( 'src' => $fileA ) ),
- "Correct file SHA-1 of $fileA" );
- }
-
- public function testGetFileList() {
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestGetFileList();
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestGetFileList();
- $this->tearDownFiles();
- }
-
- private function doTestGetFileList() {
- $backendName = $this->backendClass();
- $base = $this->baseStorePath();
-
- // Should have no errors
- $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont-notexists" ) );
-
- $files = array(
- "$base/unittest-cont1/e/test1.txt",
- "$base/unittest-cont1/e/test2.txt",
- "$base/unittest-cont1/e/test3.txt",
- "$base/unittest-cont1/e/subdir1/test1.txt",
- "$base/unittest-cont1/e/subdir1/test2.txt",
- "$base/unittest-cont1/e/subdir2/test3.txt",
- "$base/unittest-cont1/e/subdir2/test4.txt",
- "$base/unittest-cont1/e/subdir2/subdir/test1.txt",
- "$base/unittest-cont1/e/subdir2/subdir/test2.txt",
- "$base/unittest-cont1/e/subdir2/subdir/test3.txt",
- "$base/unittest-cont1/e/subdir2/subdir/test4.txt",
- "$base/unittest-cont1/e/subdir2/subdir/test5.txt",
- "$base/unittest-cont1/e/subdir2/subdir/sub/test0.txt",
- "$base/unittest-cont1/e/subdir2/subdir/sub/120-px-file.txt",
- );
-
- // Add the files
- $ops = array();
- foreach ( $files as $file ) {
- $this->prepare( array( 'dir' => dirname( $file ) ) );
- $ops[] = array( 'op' => 'create', 'content' => 'xxy', 'dst' => $file );
- }
- $status = $this->backend->doQuickOperations( $ops );
- $this->assertGoodStatus( $status,
- "Creation of files succeeded ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Creation of files succeeded with OK status ($backendName)." );
-
- // Expected listing
- $expected = array(
- "e/test1.txt",
- "e/test2.txt",
- "e/test3.txt",
- "e/subdir1/test1.txt",
- "e/subdir1/test2.txt",
- "e/subdir2/test3.txt",
- "e/subdir2/test4.txt",
- "e/subdir2/subdir/test1.txt",
- "e/subdir2/subdir/test2.txt",
- "e/subdir2/subdir/test3.txt",
- "e/subdir2/subdir/test4.txt",
- "e/subdir2/subdir/test5.txt",
- "e/subdir2/subdir/sub/test0.txt",
- "e/subdir2/subdir/sub/120-px-file.txt",
- );
- sort( $expected );
-
- // Actual listing (no trailing slash)
- $list = array();
- $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
-
- // Actual listing (with trailing slash)
- $list = array();
- $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
-
- // Expected listing
- $expected = array(
- "test1.txt",
- "test2.txt",
- "test3.txt",
- "test4.txt",
- "test5.txt",
- "sub/test0.txt",
- "sub/120-px-file.txt",
- );
- sort( $expected );
-
- // Actual listing (no trailing slash)
- $list = array();
- $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
-
- // Actual listing (with trailing slash)
- $list = array();
- $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir/" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
-
- // Actual listing (using iterator second time)
- $list = array();
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct file listing ($backendName), second iteration." );
-
- // Expected listing (top files only)
- $expected = array(
- "test1.txt",
- "test2.txt",
- "test3.txt",
- "test4.txt",
- "test5.txt"
- );
- sort( $expected );
-
- // Actual listing (top files only)
- $list = array();
- $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
-
- foreach ( $files as $file ) { // clean up
- $this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
- }
-
- $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
- foreach ( $iter as $iter ) {} // no errors
- }
-
- public function testGetDirectoryList() {
- $this->backend = $this->singleBackend;
- $this->tearDownFiles();
- $this->doTestGetDirectoryList();
- $this->tearDownFiles();
-
- $this->backend = $this->multiBackend;
- $this->tearDownFiles();
- $this->doTestGetDirectoryList();
- $this->tearDownFiles();
- }
-
- private function doTestGetDirectoryList() {
- $backendName = $this->backendClass();
-
- $base = $this->baseStorePath();
- $files = array(
- "$base/unittest-cont1/e/test1.txt",
- "$base/unittest-cont1/e/test2.txt",
- "$base/unittest-cont1/e/test3.txt",
- "$base/unittest-cont1/e/subdir1/test1.txt",
- "$base/unittest-cont1/e/subdir1/test2.txt",
- "$base/unittest-cont1/e/subdir2/test3.txt",
- "$base/unittest-cont1/e/subdir2/test4.txt",
- "$base/unittest-cont1/e/subdir2/subdir/test1.txt",
- "$base/unittest-cont1/e/subdir3/subdir/test2.txt",
- "$base/unittest-cont1/e/subdir4/subdir/test3.txt",
- "$base/unittest-cont1/e/subdir4/subdir/test4.txt",
- "$base/unittest-cont1/e/subdir4/subdir/test5.txt",
- "$base/unittest-cont1/e/subdir4/subdir/sub/test0.txt",
- "$base/unittest-cont1/e/subdir4/subdir/sub/120-px-file.txt",
- );
-
- // Add the files
- $ops = array();
- foreach ( $files as $file ) {
- $this->prepare( array( 'dir' => dirname( $file ) ) );
- $ops[] = array( 'op' => 'create', 'content' => 'xxy', 'dst' => $file );
- }
- $status = $this->backend->doQuickOperations( $ops );
- $this->assertGoodStatus( $status,
- "Creation of files succeeded ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Creation of files succeeded with OK status ($backendName)." );
-
- $this->assertEquals( true,
- $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/e/subdir1" ) ),
- "Directory exists in ($backendName)." );
- $this->assertEquals( true,
- $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) ),
- "Directory exists in ($backendName)." );
- $this->assertEquals( false,
- $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/e/subdir2/test1.txt" ) ),
- "Directory does not exists in ($backendName)." );
-
- // Expected listing
- $expected = array(
- "e",
- );
- sort( $expected );
-
- // Actual listing (no trailing slash)
- $list = array();
- $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
-
- // Expected listing
- $expected = array(
- "subdir1",
- "subdir2",
- "subdir3",
- "subdir4",
- );
- sort( $expected );
-
- // Actual listing (no trailing slash)
- $list = array();
- $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
-
- // Actual listing (with trailing slash)
- $list = array();
- $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
-
- // Expected listing
- $expected = array(
- "subdir",
- );
- sort( $expected );
-
- // Actual listing (no trailing slash)
- $list = array();
- $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir2" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
-
- // Actual listing (with trailing slash)
- $list = array();
- $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir2/" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
-
- // Actual listing (using iterator second time)
- $list = array();
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName), second iteration." );
-
- // Expected listing (recursive)
- $expected = array(
- "e",
- "e/subdir1",
- "e/subdir2",
- "e/subdir3",
- "e/subdir4",
- "e/subdir2/subdir",
- "e/subdir3/subdir",
- "e/subdir4/subdir",
- "e/subdir4/subdir/sub",
- );
- sort( $expected );
-
- // Actual listing (recursive)
- $list = array();
- $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
-
- // Expected listing (recursive)
- $expected = array(
- "subdir",
- "subdir/sub",
- );
- sort( $expected );
-
- // Actual listing (recursive)
- $list = array();
- $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir4" ) );
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
-
- // Actual listing (recursive, second time)
- $list = array();
- foreach ( $iter as $file ) {
- $list[] = $file;
- }
- sort( $list );
-
- $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
-
- foreach ( $files as $file ) { // clean up
- $this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
- }
-
- $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
- foreach ( $iter as $iter ) {} // no errors
- }
-
- public function testLockCalls() {
- $this->backend = $this->singleBackend;
- $this->doTestLockCalls();
- }
-
- private function doTestLockCalls() {
- $backendName = $this->backendClass();
-
- for ( $i=0; $i<50; $i++ ) {
- $paths = array(
- "test1.txt",
- "test2.txt",
- "test3.txt",
- "subdir1",
- "subdir1", // duplicate
- "subdir1/test1.txt",
- "subdir1/test2.txt",
- "subdir2",
- "subdir2", // duplicate
- "subdir2/test3.txt",
- "subdir2/test4.txt",
- "subdir2/subdir",
- "subdir2/subdir/test1.txt",
- "subdir2/subdir/test2.txt",
- "subdir2/subdir/test3.txt",
- "subdir2/subdir/test4.txt",
- "subdir2/subdir/test5.txt",
- "subdir2/subdir/sub",
- "subdir2/subdir/sub/test0.txt",
- "subdir2/subdir/sub/120-px-file.txt",
- );
-
- $status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
- $this->assertEquals( array(), $status->errors,
- "Locking of files succeeded ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Locking of files succeeded with OK status ($backendName)." );
-
- $status = $this->backend->lockFiles( $paths, LockManager::LOCK_SH );
- $this->assertEquals( array(), $status->errors,
- "Locking of files succeeded ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Locking of files succeeded with OK status ($backendName)." );
-
- $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_SH );
- $this->assertEquals( array(), $status->errors,
- "Locking of files succeeded ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Locking of files succeeded with OK status ($backendName)." );
-
- $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_EX );
- $this->assertEquals( array(), $status->errors,
- "Locking of files succeeded ($backendName)." );
- $this->assertEquals( true, $status->isOK(),
- "Locking of files succeeded with OK status ($backendName)." );
- }
- }
-
- // test helper wrapper for backend prepare() function
- private function prepare( array $params ) {
- return $this->backend->prepare( $params );
- }
-
- // test helper wrapper for backend prepare() function
- private function create( array $params ) {
- $params['op'] = 'create';
- return $this->backend->doQuickOperations( array( $params ) );
- }
-
- function tearDownFiles() {
- foreach ( $this->filesToPrune as $file ) {
- @unlink( $file );
- }
- $containers = array( 'unittest-cont1', 'unittest-cont2', 'unittest-cont3' );
- foreach ( $containers as $container ) {
- $this->deleteFiles( $container );
- }
- $this->filesToPrune = array();
- }
-
- private function deleteFiles( $container ) {
- $base = $this->baseStorePath();
- $iter = $this->backend->getFileList( array( 'dir' => "$base/$container" ) );
- if ( $iter ) {
- foreach ( $iter as $file ) {
- $this->backend->delete( array( 'src' => "$base/$container/$file" ),
- array( 'force' => 1, 'nonLocking' => 1 ) );
- }
- }
- $this->backend->clean( array( 'dir' => "$base/$container", 'recursive' => 1 ) );
- }
-
- function assertBackendPathsConsistent( array $paths ) {
- if ( $this->backend instanceof FileBackendMultiWrite ) {
- $status = $this->backend->consistencyCheck( $paths );
- $this->assertGoodStatus( $status, "Files synced: " . implode( ',', $paths ) );
- }
- }
-
- function assertGoodStatus( $status, $msg ) {
- $this->assertEquals( print_r( array(), 1 ), print_r( $status->errors, 1 ), $msg );
- }
-
- function tearDown() {
- parent::tearDown();
- }
-}
diff --git a/tests/phpunit/includes/filerepo/FileRepoTest.php b/tests/phpunit/includes/filerepo/FileRepoTest.php
deleted file mode 100644
index 8f92c123..00000000
--- a/tests/phpunit/includes/filerepo/FileRepoTest.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-class FileRepoTest extends MediaWikiTestCase {
-
- /**
- * @expectedException MWException
- */
- function testFileRepoConstructionOptionCanNotBeNull() {
- $f = new FileRepo();
- }
- /**
- * @expectedException MWException
- */
- function testFileRepoConstructionOptionCanNotBeAnEmptyArray() {
- $f = new FileRepo( array() );
- }
- /**
- * @expectedException MWException
- */
- function testFileRepoConstructionOptionNeedNameKey() {
- $f = new FileRepo( array(
- 'backend' => 'foobar'
- ) );
- }
- /**
- * @expectedException MWException
- */
- function testFileRepoConstructionOptionNeedBackendKey() {
- $f = new FileRepo( array(
- 'name' => 'foobar'
- ) );
- }
-
- function testFileRepoConstructionWithRequiredOptions() {
- $f = new FileRepo( array(
- 'name' => 'FileRepoTestRepository',
- 'backend' => new FSFileBackend( array(
- 'name' => 'local-testing',
- 'lockManager' => 'nullLockManager',
- 'containerPaths' => array()
- ) )
- ) );
- $this->assertInstanceOf( 'FileRepo', $f );
- }
-}
diff --git a/tests/phpunit/includes/filerepo/StoreBatchTest.php b/tests/phpunit/includes/filerepo/StoreBatchTest.php
deleted file mode 100644
index 3ab56af8..00000000
--- a/tests/phpunit/includes/filerepo/StoreBatchTest.php
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-/**
- * @group FileRepo
- * @group medium
- */
-class StoreBatchTest extends MediaWikiTestCase {
-
- public function setUp() {
- global $wgFileBackends;
- parent::setUp();
-
- # Forge a FSRepo object to not have to rely on local wiki settings
- $tmpPrefix = wfTempDir() . '/storebatch-test-' . time() . '-' . mt_rand();
- if ( $this->getCliArg( 'use-filebackend=' ) ) {
- $name = $this->getCliArg( 'use-filebackend=' );
- $useConfig = array();
- foreach ( $wgFileBackends as $conf ) {
- if ( $conf['name'] == $name ) {
- $useConfig = $conf;
- }
- }
- $useConfig['name'] = 'local-testing'; // swap name
- $class = $useConfig['class'];
- $backend = new $class( $useConfig );
- } else {
- $backend = new FSFileBackend( array(
- 'name' => 'local-testing',
- 'lockManager' => 'nullLockManager',
- 'containerPaths' => array(
- 'unittests-public' => "{$tmpPrefix}-public",
- 'unittests-thumb' => "{$tmpPrefix}-thumb",
- 'unittests-temp' => "{$tmpPrefix}-temp",
- 'unittests-deleted' => "{$tmpPrefix}-deleted",
- )
- ) );
- }
- $this->repo = new FileRepo( array(
- 'name' => 'unittests',
- 'backend' => $backend
- ) );
-
- $this->date = gmdate( "YmdHis" );
- $this->createdFiles = array();
- }
-
- /**
- * Store a file or virtual URL source into a media file name.
- *
- * @param $originalName string The title of the image
- * @param $srcPath string The filepath or virtual URL
- * @param $flags integer Flags to pass into repo::store().
- */
- private function storeit($originalName, $srcPath, $flags) {
- $hashPath = $this->repo->getHashPath( $originalName );
- $dstRel = "$hashPath{$this->date}!$originalName";
- $dstUrlRel = $hashPath . $this->date . '!' . rawurlencode( $originalName );
-
- $result = $this->repo->store( $srcPath, 'temp', $dstRel, $flags );
- $result->value = $this->repo->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
- $this->createdFiles[] = $result->value;
- return $result;
- }
-
- /**
- * Test storing a file using different flags.
- *
- * @param $fn string The title of the image
- * @param $infn string The name of the file (in the filesystem)
- * @param $otherfn string The name of the different file (in the filesystem)
- * @param $fromrepo logical 'true' if we want to copy from a virtual URL out of the Repo.
- */
- private function storecohort($fn, $infn, $otherfn, $fromrepo) {
- $f = $this->storeit( $fn, $infn, 0 );
- $this->assertTrue( $f->isOK(), 'failed to store a new file' );
- $this->assertEquals( $f->failCount, 0, "counts wrong {$f->successCount} {$f->failCount}" );
- $this->assertEquals( $f->successCount, 1 , "counts wrong {$f->successCount} {$f->failCount}" );
- if ( $fromrepo ) {
- $f = $this->storeit( "Other-$fn", $infn, FileRepo::OVERWRITE);
- $infn = $f->value;
- }
- // This should work because we're allowed to overwrite
- $f = $this->storeit( $fn, $infn, FileRepo::OVERWRITE );
- $this->assertTrue( $f->isOK(), 'We should be allowed to overwrite' );
- $this->assertEquals( $f->failCount, 0, "counts wrong {$f->successCount} {$f->failCount}" );
- $this->assertEquals( $f->successCount, 1 , "counts wrong {$f->successCount} {$f->failCount}" );
- // This should fail because we're overwriting.
- $f = $this->storeit( $fn, $infn, 0 );
- $this->assertFalse( $f->isOK(), 'We should not be allowed to overwrite' );
- $this->assertEquals( $f->failCount, 1, "counts wrong {$f->successCount} {$f->failCount}" );
- $this->assertEquals( $f->successCount, 0 , "counts wrong {$f->successCount} {$f->failCount}" );
- // This should succeed because we're overwriting the same content.
- $f = $this->storeit( $fn, $infn, FileRepo::OVERWRITE_SAME );
- $this->assertTrue( $f->isOK(), 'We should be able to overwrite the same content' );
- $this->assertEquals( $f->failCount, 0, "counts wrong {$f->successCount} {$f->failCount}" );
- $this->assertEquals( $f->successCount, 1 , "counts wrong {$f->successCount} {$f->failCount}" );
- // This should fail because we're overwriting different content.
- if ( $fromrepo ) {
- $f = $this->storeit( "Other-$fn", $otherfn, FileRepo::OVERWRITE);
- $otherfn = $f->value;
- }
- $f = $this->storeit( $fn, $otherfn, FileRepo::OVERWRITE_SAME );
- $this->assertFalse( $f->isOK(), 'We should not be allowed to overwrite different content' );
- $this->assertEquals( $f->failCount, 1, "counts wrong {$f->successCount} {$f->failCount}" );
- $this->assertEquals( $f->successCount, 0 , "counts wrong {$f->successCount} {$f->failCount}" );
- }
-
- 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 );
- }
-
- public function tearDown() {
- $this->repo->cleanupBatch( $this->createdFiles ); // delete files
- foreach ( $this->createdFiles as $tmp ) { // delete dirs
- $tmp = $this->repo->resolveVirtualUrl( $tmp );
- while ( $tmp = FileBackend::parentStoragePath( $tmp ) ) {
- $this->repo->getBackend()->clean( array( 'dir' => $tmp ) );
- }
- }
- parent::tearDown();
- }
-}
diff --git a/tests/phpunit/includes/installer/InstallDocFormatterTest.php b/tests/phpunit/includes/installer/InstallDocFormatterTest.php
deleted file mode 100644
index 56485d3e..00000000
--- a/tests/phpunit/includes/installer/InstallDocFormatterTest.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-
-class InstallDocFormatterTest extends MediaWikiTestCase {
- /**
- * @covers InstallDocFormatter::format
- * @dataProvider provideDocFormattingTests
- */
- function testFormat( $expected, $unformattedText, $message = '' ) {
- $this->assertEquals(
- $expected,
- InstallDocFormatter::format( $unformattedText ),
- $message
- );
- }
-
- /**
- * Provider for testFormat()
- */
- function provideDocFormattingTests() {
- # Format: (expected string, unformattedText string, optional message)
- return array(
- # Escape some wikitext
- array( 'Install &lt;tag>' , 'Install <tag>', 'Escaping <' ),
- array( 'Install &#123;&#123;template}}' , 'Install {{template}}', 'Escaping [[' ),
- array( 'Install &#91;&#91;page]]' , 'Install [[page]]', 'Escaping {{' ),
- array( 'Install ' , "Install \r", 'Removing \r' ),
-
- # Transform \t{1,2} into :{1,2}
- array( ':One indentation', "\tOne indentation", 'Replacing a single \t' ),
- array( '::Two indentations', "\t\tTwo indentations", 'Replacing 2 x \t' ),
-
- # Transform 'bug 123' links
- array(
- '<span class="config-plainlink">[https://bugzilla.wikimedia.org/123 bug 123]</span>',
- 'bug 123', 'Testing bug 123 links' ),
- array(
- '(<span class="config-plainlink">[https://bugzilla.wikimedia.org/987654 bug 987654]</span>)',
- '(bug 987654)', 'Testing (bug 987654) links' ),
-
- # "bug abc" shouldn't work
- array( 'bug foobar', 'bug foobar', "Don't match bug followed by non-digits" ),
- array( 'bug !!fakefake!!', 'bug !!fakefake!!', "Don't match bug followed by non-digits" ),
-
- # Transform '$wgFooBar' links
- array(
- '<span class="config-plainlink">[http://www.mediawiki.org/wiki/Manual:$wgFooBar $wgFooBar]</span>',
- '$wgFooBar', 'Testing basic $wgFooBar' ),
- array(
- '<span class="config-plainlink">[http://www.mediawiki.org/wiki/Manual:$wgFooBar45 $wgFooBar45]</span>',
- '$wgFooBar45', 'Testing $wgFooBar45 (with numbers)' ),
- array(
- '<span class="config-plainlink">[http://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( '$()not!a&Var', '$()not!a&Var', 'Testing $()not!a&Var (obviously not a variable)' ),
- );
- }
-}
diff --git a/tests/phpunit/includes/json/ServicesJsonTest.php b/tests/phpunit/includes/json/ServicesJsonTest.php
deleted file mode 100644
index 8f2421a2..00000000
--- a/tests/phpunit/includes/json/ServicesJsonTest.php
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-/*
- * Test cases for our Services_Json library. Requires PHP json support as well,
- * so we can compare output
- */
-class ServicesJsonTest extends MediaWikiTestCase {
- /**
- * Test to make sure core json_encode() and our Services_Json()->encode()
- * produce the same output
- *
- * @dataProvider provideValuesToEncode
- */
- public function testJsonEncode( $input, $desc ) {
- if ( !function_exists( 'json_encode' ) ) {
- $this->markTestIncomplete( 'No PHP json support, unable to test' );
- return;
- } elseif( strtolower( json_encode( "\xf0\xa0\x80\x80" ) ) != '"\ud840\udc00"' ) {
- $this->markTestIncomplete( 'Have buggy PHP json support, unable to test' );
- return;
- } else {
- $jsonObj = new Services_JSON();
- $this->assertEquals(
- $jsonObj->encode( $input ),
- json_encode( $input ),
- $desc
- );
- }
- }
-
- /**
- * Test to make sure core json_decode() and our Services_Json()->decode()
- * produce the same output
- *
- * @dataProvider provideValuesToDecode
- */
- public function testJsonDecode( $input, $desc ) {
- if ( !function_exists( 'json_decode' ) ) {
- $this->markTestIncomplete( 'No PHP json support, unable to test' );
- return;
- } else {
- $jsonObj = new Services_JSON();
- $this->assertEquals(
- $jsonObj->decode( $input ),
- json_decode( $input ),
- $desc
- );
- }
- }
-
- function provideValuesToEncode() {
- $obj = new stdClass();
- $obj->property = 'value';
- $obj->property2 = null;
- $obj->property3 = 1.234;
- return array(
- array( 1, 'basic integer' ),
- array( -1, 'negative integer' ),
- array( 1.1, 'basic float' ),
- array( true, 'basic bool true' ),
- array( false, 'basic bool false' ),
- array( 'some string', 'basic string test' ),
- array( "some string\nwith newline", 'newline string test' ),
- array( '♥ü', 'unicode string test' ),
- array( array( 'some', 'string', 'values' ), 'basic array of strings' ),
- array( array( 'key1' => 'val1', 'key2' => 'val2' ), 'array with string keys' ),
- array( array( 1 => 'val1', 3 => 'val2', '2' => 'val3' ), 'out of order numbered array test' ),
- array( array(), 'empty array test' ),
- array( $obj, 'basic object test' ),
- array( new stdClass, 'empty object test' ),
- array( null, 'null test' ),
- );
- }
-
- function provideValuesToDecode() {
- return array(
- array( '1', 'basic integer' ),
- array( '-1', 'negative integer' ),
- array( '1.1', 'basic float' ),
- array( '1.1e1', 'scientific float' ),
- array( 'true', 'basic bool true' ),
- array( 'false', 'basic bool false' ),
- array( '"some string"', 'basic string test' ),
- array( '"some string\nwith newline"', 'newline string test' ),
- array( '"♥ü"', 'unicode character string test' ),
- array( '"\u2665"', 'unicode \\u string test' ),
- array( '["some","string","values"]', 'basic array of strings' ),
- array( '[]', 'empty array test' ),
- array( '{"key":"value"}', 'Basic key => value test' ),
- array( '{}', 'empty object test' ),
- array( 'null', 'null test' ),
- );
- }
-}
diff --git a/tests/phpunit/includes/libs/CSSJanusTest.php b/tests/phpunit/includes/libs/CSSJanusTest.php
deleted file mode 100644
index 54f66077..00000000
--- a/tests/phpunit/includes/libs/CSSJanusTest.php
+++ /dev/null
@@ -1,560 +0,0 @@
-<?php
-/**
- * Based on the test suite of the original Python
- * CSSJanus libary:
- * http://code.google.com/p/cssjanus/source/browse/trunk/cssjanus_test.py
- * Ported to PHP for ResourceLoader and has been extended since.
- */
-class CSSJanusTest extends MediaWikiTestCase {
- /**
- * @dataProvider provideTransformCases
- */
- function testTransform( $cssA, $cssB = null ) {
-
- if ( $cssB ) {
- $transformedA = CSSJanus::transform( $cssA );
- $this->assertEquals( $transformedA, $cssB, 'Test A-B transformation' );
-
- $transformedB = CSSJanus::transform( $cssB );
- $this->assertEquals( $transformedB, $cssA, 'Test B-A transformation' );
-
- // If no B version is provided, it means
- // the output should equal the input.
- } else {
- $transformedA = CSSJanus::transform( $cssA );
- $this->assertEquals( $transformedA, $cssA, 'Nothing was flipped' );
- }
- }
-
- /**
- * @dataProvider provideTransformAdvancedCases
- */
- function testTransformAdvanced( $code, $expectedOutput, $options = array() ) {
- $swapLtrRtlInURL = isset( $options['swapLtrRtlInURL'] ) ? $options['swapLtrRtlInURL'] : false;
- $swapLeftRightInURL = isset( $options['swapLeftRightInURL'] ) ? $options['swapLeftRightInURL'] : false;
-
- $flipped = CSSJanus::transform( $code, $swapLtrRtlInURL, $swapLeftRightInURL );
-
- $this->assertEquals( $expectedOutput, $flipped,
- 'Test flipping, options: url-ltr-rtl=' . ($swapLtrRtlInURL ? 'true' : 'false')
- . ' url-left-right=' . ($swapLeftRightInURL ? 'true' : 'false')
- );
- }
- /**
- * @dataProvider provideTransformBrokenCases
- * @group Broken
- */
- function testTransformBroken( $code, $expectedOutput ) {
- $flipped = CSSJanus::transform( $code );
-
- $this->assertEquals( $expectedOutput, $flipped, 'Test flipping' );
- }
-
- /**
- * These transform cases are tested *in both directions*
- * No need to declare a principle twice in both directions here.
- */
- function provideTransformCases() {
- return array(
- // Property keys
- array(
- '.foo { left: 0; }',
- '.foo { right: 0; }'
- ),
- // Guard against partial keys
- // (CSS currently doesn't have flippable properties
- // that contain the direction as part of the key without
- // dash separation)
- array(
- '.foo { alright: 0; }'
- ),
- array(
- '.foo { balleft: 0; }'
- ),
-
- // Dashed property keys
- array(
- '.foo { padding-left: 0; }',
- '.foo { padding-right: 0; }'
- ),
- array(
- '.foo { margin-left: 0; }',
- '.foo { margin-right: 0; }'
- ),
- array(
- '.foo { border-left: 0; }',
- '.foo { border-right: 0; }'
- ),
-
- // Double-dashed property keys
- array(
- '.foo { border-left-color: red; }',
- '.foo { border-right-color: red; }'
- ),
- array(
- // Includes unknown properties?
- '.foo { x-left-y: 0; }',
- '.foo { x-right-y: 0; }'
- ),
-
- // Multi-value properties
- array(
- '.foo { padding: 0; }'
- ),
- array(
- '.foo { padding: 0 1px; }'
- ),
- array(
- '.foo { padding: 0 1px 2px; }'
- ),
- array(
- '.foo { padding: 0 1px 2px 3px; }',
- '.foo { padding: 0 3px 2px 1px; }'
- ),
-
- // Shorthand / Four notation
- array(
- '.foo { padding: .25em 15px 0pt 0ex; }',
- '.foo { padding: .25em 0ex 0pt 15px; }'
- ),
- array(
- '.foo { margin: 1px -4px 3px 2px; }',
- '.foo { margin: 1px 2px 3px -4px; }'
- ),
- array(
- '.foo { padding: 0 15px .25em 0; }',
- '.foo { padding: 0 0 .25em 15px; }'
- ),
- array(
- '.foo { padding: 1px 4.1grad 3px 2%; }',
- '.foo { padding: 1px 2% 3px 4.1grad; }'
- ),
- array(
- '.foo { padding: 1px 2px 3px auto; }',
- '.foo { padding: 1px auto 3px 2px; }'
- ),
- array(
- '.foo { padding: 1px inherit 3px auto; }',
- '.foo { padding: 1px auto 3px inherit; }'
- ),
- array(
- '.foo { border-radius: .25em 15px 0pt 0ex; }',
- '.foo { border-radius: .25em 0ex 0pt 15px; }'
- ),
- array(
- '.foo { x-unknown: a b c d; }'
- ),
- array(
- '.foo barpx 0 2% { opacity: 0; }'
- ),
- array(
- '#settings td p strong'
- ),
- array(
- # Not sure how 4+ values should behave,
- # testing to make sure changes are detected
- '.foo { x-unknown: 1 2 3 4 5; }',
- '.foo { x-unknown: 1 4 3 2 5; }',
- ),
- array(
- '.foo { x-unknown: 1 2 3 4 5 6; }',
- '.foo { x-unknown: 1 4 3 2 5 6; }',
- ),
-
- // Shorthand / Three notation
- array(
- '.foo { margin: 1em 0 .25em; }'
- ),
- array(
- '.foo { margin:-1.5em 0 -.75em; }'
- ),
-
- // Shorthand / Two notation
- array(
- '.foo { padding: 1px 2px; }'
- ),
-
- // Shorthand / One notation
- array(
- '.foo { padding: 1px; }'
- ),
-
- // Direction
- // Note: This differs from the Python implementation,
- // see also CSSJanus::fixDirection for more info.
- array(
- '.foo { direction: ltr; }',
- '.foo { direction: rtl; }'
- ),
- array(
- '.foo { direction: rtl; }',
- '.foo { direction: ltr; }'
- ),
- array(
- 'input { direction: ltr; }',
- 'input { direction: rtl; }'
- ),
- array(
- 'input { direction: rtl; }',
- 'input { direction: ltr; }'
- ),
- array(
- 'body { direction: ltr; }',
- 'body { direction: rtl; }'
- ),
- array(
- '.foo, body, input { direction: ltr; }',
- '.foo, body, input { direction: rtl; }'
- ),
- array(
- 'body { padding: 10px; direction: ltr; }',
- 'body { padding: 10px; direction: rtl; }'
- ),
- array(
- 'body { direction: ltr } .myClass { direction: ltr }',
- 'body { direction: rtl } .myClass { direction: rtl }'
- ),
-
- // Left/right values
- array(
- '.foo { float: left; }',
- '.foo { float: right; }'
- ),
- array(
- '.foo { text-align: left; }',
- '.foo { text-align: right; }'
- ),
- array(
- '.foo { -x-unknown: left; }',
- '.foo { -x-unknown: right; }'
- ),
- // Guard against selectors that look flippable
- array(
- '.column-left { width: 0; }'
- ),
- array(
- 'a.left { width: 0; }'
- ),
- array(
- 'a.leftification { width: 0; }'
- ),
- array(
- 'a.ltr { width: 0; }'
- ),
- array(
- # <div class="a-ltr png">
- '.a-ltr.png { width: 0; }'
- ),
- array(
- # <foo-ltr attr="x">
- 'foo-ltr[attr="x"] { width: 0; }'
- ),
- array(
- 'div.left > span.right+span.left { width: 0; }'
- ),
- array(
- '.thisclass .left .myclass { width: 0; }'
- ),
- array(
- '.thisclass .left .myclass #myid { width: 0; }'
- ),
-
- // Cursor values (east/west)
- array(
- '.foo { cursor: e-resize; }',
- '.foo { cursor: w-resize; }'
- ),
- array(
- '.foo { cursor: se-resize; }',
- '.foo { cursor: sw-resize; }'
- ),
- array(
- '.foo { cursor: ne-resize; }',
- '.foo { cursor: nw-resize; }'
- ),
-
- // Background
- array(
- '.foo { background-position: top left; }',
- '.foo { background-position: top right; }'
- ),
- array(
- '.foo { background: url(/foo/bar.png) top left; }',
- '.foo { background: url(/foo/bar.png) top right; }'
- ),
- array(
- '.foo { background: url(/foo/bar.png) top left no-repeat; }',
- '.foo { background: url(/foo/bar.png) top right no-repeat; }'
- ),
- array(
- '.foo { background: url(/foo/bar.png) no-repeat top left; }',
- '.foo { background: url(/foo/bar.png) no-repeat top right; }'
- ),
- array(
- '.foo { background: #fff url(/foo/bar.png) no-repeat top left; }',
- '.foo { background: #fff url(/foo/bar.png) no-repeat top right; }'
- ),
- array(
- '.foo { background-position: 100% 40%; }',
- '.foo { background-position: 0% 40%; }'
- ),
- array(
- '.foo { background-position: 23% 0; }',
- '.foo { background-position: 77% 0; }'
- ),
- array(
- '.foo { background-position: 23% auto; }',
- '.foo { background-position: 77% auto; }'
- ),
- array(
- '.foo { background-position-x: 23%; }',
- '.foo { background-position-x: 77%; }'
- ),
- array(
- '.foo { background-position-y: 23%; }',
- '.foo { background-position-y: 23%; }'
- ),
- array(
- '.foo { background:url(../foo.png) no-repeat 75% 50%; }',
- '.foo { background:url(../foo.png) no-repeat 25% 50%; }'
- ),
- array(
- '.foo { background: 10% 20% } .bar { background: 40% 30% }',
- '.foo { background: 90% 20% } .bar { background: 60% 30% }'
- ),
-
- // Multiple rules
- array(
- 'body { direction: rtl; float: right; } .foo { direction: ltr; float: right; }',
- 'body { direction: ltr; float: left; } .foo { direction: rtl; float: left; }',
- ),
-
- // Duplicate properties
- array(
- '.foo { float: left; float: right; float: left; }',
- '.foo { float: right; float: left; float: right; }',
- ),
-
- // Preserve comments
- array(
- '/* left /* right */left: 10px',
- '/* left /* right */right: 10px'
- ),
- array(
- '/*left*//*left*/left: 10px',
- '/*left*//*left*/right: 10px'
- ),
- array(
- '/* Going right is cool */ .foo { width: 0 }',
- ),
- array(
- "/* padding-right 1 2 3 4 */\n#test { width: 0}\n/*right*/"
- ),
- array(
- "/** Two line comment\n * left\n \*/\n#test {width: 0}"
- ),
-
- // @noflip annotation
- array(
- // before selector (single)
- '/* @noflip */ div { float: left; }'
- ),
- array(
- // before selector (multiple)
- '/* @noflip */ div, .notme { float: left; }'
- ),
- array(
- // inside selector
- 'div, /* @noflip */ .foo { float: left; }'
- ),
- array(
- // after selector
- 'div, .notme /* @noflip */ { float: left; }'
- ),
- array(
- // before multiple rules
- '/* @noflip */ div { float: left; } .foo { float: left; }',
- '/* @noflip */ div { float: left; } .foo { float: right; }'
- ),
- array(
- // after multiple rules
- '.foo { float: left; } /* @noflip */ div { float: left; }',
- '.foo { float: right; } /* @noflip */ div { float: left; }'
- ),
- array(
- // before multiple properties
- 'div { /* @noflip */ float: left; text-align: left; }',
- 'div { /* @noflip */ float: left; text-align: right; }'
- ),
- array(
- // after multiple properties
- 'div { float: left; /* @noflip */ text-align: left; }',
- 'div { float: right; /* @noflip */ text-align: left; }'
- ),
-
- // Guard against css3 stuff
- array(
- 'background-image: -moz-linear-gradient(#326cc1, #234e8c);'
- ),
- array(
- 'background-image: -webkit-gradient(linear, 100% 0%, 0% 0%, from(#666666), to(#ffffff));'
- ),
-
- // CSS syntax / white-space variations
- // spaces, no spaces, tabs, new lines, omitting semi-colons
- array(
- ".foo { left: 0; }",
- ".foo { right: 0; }"
- ),
- array(
- ".foo{ left: 0; }",
- ".foo{ right: 0; }"
- ),
- array(
- ".foo{ left: 0 }",
- ".foo{ right: 0 }"
- ),
- array(
- ".foo{left:0 }",
- ".foo{right:0 }"
- ),
- array(
- ".foo{left:0}",
- ".foo{right:0}"
- ),
- array(
- ".foo { left : 0 ; }",
- ".foo { right : 0 ; }"
- ),
- array(
- ".foo\n { left : 0 ; }",
- ".foo\n { right : 0 ; }"
- ),
- array(
- ".foo\n { \nleft : 0 ; }",
- ".foo\n { \nright : 0 ; }"
- ),
- array(
- ".foo\n { \n left : 0 ; }",
- ".foo\n { \n right : 0 ; }"
- ),
- array(
- ".foo\n { \n left\n : 0; }",
- ".foo\n { \n right\n : 0; }"
- ),
- array(
- ".foo \n { \n left\n : 0; }",
- ".foo \n { \n right\n : 0; }"
- ),
- array(
- ".foo\n{\nleft\n:\n0;}",
- ".foo\n{\nright\n:\n0;}"
- ),
- array(
- ".foo\n.bar {\n\tleft: 0;\n}",
- ".foo\n.bar {\n\tright: 0;\n}"
- ),
- array(
- ".foo\t{\tleft\t:\t0;}",
- ".foo\t{\tright\t:\t0;}"
- ),
- );
- }
-
- /**
- * These cases are tested in one way only (format: actual, expected, msg).
- * If both ways can be tested, either put both versions in here or move
- * it to provideTransformCases().
- */
- function provideTransformAdvancedCases() {
- $bgPairs = array(
- # [ - _ . ] <-> [ left right ltr rtl ]
- 'foo.jpg' => 'foo.jpg',
- 'left.jpg' => 'right.jpg',
- 'ltr.jpg' => 'rtl.jpg',
-
- 'foo-left.png' => 'foo-right.png',
- 'foo_left.png' => 'foo_right.png',
- 'foo.left.png' => 'foo.right.png',
-
- 'foo-ltr.png' => 'foo-rtl.png',
- 'foo_ltr.png' => 'foo_rtl.png',
- 'foo.ltr.png' => 'foo.rtl.png',
-
- 'left-foo.png' => 'right-foo.png',
- 'left_foo.png' => 'right_foo.png',
- 'left.foo.png' => 'right.foo.png',
-
- 'ltr-foo.png' => 'rtl-foo.png',
- 'ltr_foo.png' => 'rtl_foo.png',
- 'ltr.foo.png' => 'rtl.foo.png',
-
- 'foo-ltr-left.gif' => 'foo-rtl-right.gif',
- 'foo_ltr_left.gif' => 'foo_rtl_right.gif',
- 'foo.ltr.left.gif' => 'foo.rtl.right.gif',
- 'foo-ltr_left.gif' => 'foo-rtl_right.gif',
- 'foo_ltr.left.gif' => 'foo_rtl.right.gif',
- );
- $provider = array();
- foreach ( $bgPairs as $left => $right ) {
- # By default '-rtl' and '-left' etc. are not touched,
- # Only when the appropiate parameter is set.
- $provider[] = array(
- ".foo { background: url(images/$left); }",
- ".foo { background: url(images/$left); }"
- );
- $provider[] = array(
- ".foo { background: url(images/$right); }",
- ".foo { background: url(images/$right); }"
- );
- $provider[] = array(
- ".foo { background: url(images/$left); }",
- ".foo { background: url(images/$right); }",
- array(
- 'swapLtrRtlInURL' => true,
- 'swapLeftRightInURL' => true,
- )
- );
- $provider[] = array(
- ".foo { background: url(images/$right); }",
- ".foo { background: url(images/$left); }",
- array(
- 'swapLtrRtlInURL' => true,
- 'swapLeftRightInURL' => true,
- )
- );
- }
-
- return $provider;
- }
-
- /**
- * Cases that are currently failing, but
- * should be looked at in the future as enhancements and/or bug fix
- */
- function provideTransformBrokenCases() {
- return array(
- // Guard against partial keys
- array(
- '.foo { leftxx: 0; }',
- '.foo { leftxx: 0; }'
- ),
- array(
- '.foo { rightxx: 0; }',
- '.foo { rightxx: 0; }'
- ),
-
- // Guard against selectors that look flippable
- array(
- # <foo-left-x attr="x">
- 'foo-left-x[attr="x"] { width: 0; }',
- 'foo-left-x[attr="x"] { width: 0; }'
- ),
- array(
- # <div class="foo" data-left="x">
- '.foo[data-left="x"] { width: 0; }',
- '.foo[data-left="x"] { width: 0; }'
- ),
- );
- }
-}
diff --git a/tests/phpunit/includes/libs/CSSMinTest.php b/tests/phpunit/includes/libs/CSSMinTest.php
deleted file mode 100644
index a3827756..00000000
--- a/tests/phpunit/includes/libs/CSSMinTest.php
+++ /dev/null
@@ -1,142 +0,0 @@
-<?php
-/**
- * This file test the CSSMin library shipped with Mediawiki.
- *
- * @author Timo Tijhof
- */
-
-class CSSMinTest extends MediaWikiTestCase {
- protected $oldServer = null, $oldCanServer = null;
-
- function setUp() {
- parent::setUp();
-
- // Fake $wgServer and $wgCanonicalServer
- global $wgServer, $wgCanonicalServer;
- $this->oldServer = $wgServer;
- $this->oldCanServer = $wgCanonicalServer;
- $wgServer = $wgCanonicalServer = 'http://wiki.example.org';
- }
-
- function tearDown() {
- // Restore $wgServer and $wgCanonicalServer
- global $wgServer, $wgCanonicalServer;
- $wgServer = $this->oldServer;
- $wgCanonicalServer = $this->oldCanServer;
-
- parent::tearDown();
- }
-
- /**
- * @dataProvider provideMinifyCases
- */
- function testMinify( $code, $expectedOutput ) {
- $minified = CSSMin::minify( $code );
-
- $this->assertEquals( $expectedOutput, $minified, 'Minified output should be in the form expected.' );
- }
-
- function provideMinifyCases() {
- return array(
- // Whitespace
- array( "\r\t\f \v\n\r", "" ),
- array( "foo, bar {\n\tprop: value;\n}", "foo,bar{prop:value}" ),
-
- // Loose comments
- array( "/* foo */", "" ),
- array( "/*******\n foo\n *******/", "" ),
- array( "/*!\n foo\n */", "" ),
-
- // Inline comments in various different places
- array( "/* comment */foo, bar {\n\tprop: value;\n}", "foo,bar{prop:value}" ),
- array( "foo/* comment */, bar {\n\tprop: value;\n}", "foo,bar{prop:value}" ),
- array( "foo,/* comment */ bar {\n\tprop: value;\n}", "foo,bar{prop:value}" ),
- array( "foo, bar/* comment */ {\n\tprop: value;\n}", "foo,bar{prop:value}" ),
- array( "foo, bar {\n\t/* comment */prop: value;\n}", "foo,bar{prop:value}" ),
- array( "foo, bar {\n\tprop: /* comment */value;\n}", "foo,bar{prop:value}" ),
- array( "foo, bar {\n\tprop: value /* comment */;\n}", "foo,bar{prop:value }" ),
- array( "foo, bar {\n\tprop: value; /* comment */\n}", "foo,bar{prop:value; }" ),
-
- // Keep track of things that aren't as minified as much as they
- // could be (bug 35493)
- array( 'foo { prop: value ;}', 'foo{prop:value }' ),
- array( 'foo { prop : value; }', 'foo{prop :value}' ),
- array( 'foo { prop: value ; }', 'foo{prop:value }' ),
- array( 'foo { font-family: "foo" , "bar"; }', 'foo{font-family:"foo" ,"bar"}' ),
- array( "foo { src:\n\turl('foo') ,\n\turl('bar') ; }", "foo{src:url('foo') ,url('bar') }" ),
-
- // Interesting cases with string values
- // - Double quotes, single quotes
- array( 'foo { content: ""; }', 'foo{content:""}' ),
- array( "foo { content: ''; }", "foo{content:''}" ),
- array( 'foo { content: "\'"; }', 'foo{content:"\'"}' ),
- array( "foo { content: '\"'; }", "foo{content:'\"'}" ),
- // - Whitespace in string values
- array( 'foo { content: " "; }', 'foo{content:" "}' ),
- );
- }
-
- /**
- * @dataProvider provideRemapCases
- */
- function testRemap( $message, $params, $expectedOutput ) {
- $remapped = call_user_func_array( 'CSSMin::remap', $params );
-
- $messageAdd = " Case: $message";
- $this->assertEquals( $expectedOutput, $remapped, 'CSSMin::remap should return the expected url form.' . $messageAdd );
- }
-
- function provideRemapCases() {
- // Parameter signature:
- // CSSMin::remap( $code, $local, $remote, $embedData = true )
- return array(
- array(
- 'Simple case',
- array( 'foo { prop: url(bar.png); }', false, 'http://example.org', false ),
- 'foo { prop: url(http://example.org/bar.png); }',
- ),
- array(
- 'Without trailing slash',
- array( 'foo { prop: url(../bar.png); }', false, 'http://example.org/quux', false ),
- 'foo { prop: url(http://example.org/quux/../bar.png); }',
- ),
- array(
- 'With trailing slash on remote (bug 27052)',
- array( 'foo { prop: url(../bar.png); }', false, 'http://example.org/quux/', false ),
- 'foo { prop: url(http://example.org/quux/../bar.png); }',
- ),
- array(
- 'Guard against stripping double slashes from query',
- array( 'foo { prop: url(bar.png?corge=//grault); }', false, 'http://example.org/quux/', false ),
- 'foo { prop: url(http://example.org/quux/bar.png?corge=//grault); }',
- ),
- array(
- 'Expand absolute paths',
- array( 'foo { prop: url(/w/skin/images/bar.png); }', false, 'http://example.org/quux', false ),
- 'foo { prop: url(http://wiki.example.org/w/skin/images/bar.png); }',
- ),
- );
- }
-
- /**
- * Seperated because they are currently broken (bug 35492)
- *
- * @group Broken
- * @dataProvider provideStringCases
- */
- function testMinifyWithCSSStringValues( $code, $expectedOutput ) {
- $this->testMinifyOutput( $code, $expectedOutput );
- }
-
- function provideStringCases() {
- return array(
- // String values should be respected
- // - More than one space in a string value
- array( 'foo { content: " "; }', 'foo{content:" "}' ),
- // - 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}' ),
- );
- }
-}
diff --git a/tests/phpunit/includes/libs/GenericArrayObjectTest.php b/tests/phpunit/includes/libs/GenericArrayObjectTest.php
deleted file mode 100644
index 70fce111..00000000
--- a/tests/phpunit/includes/libs/GenericArrayObjectTest.php
+++ /dev/null
@@ -1,245 +0,0 @@
-<?php
-
-/**
- * Tests for the GenericArrayObject and deriving classes.
- *
- * 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
- * @since 1.20
- *
- * @ingroup Test
- * @group GenericArrayObject
- *
- * @licence GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-abstract class GenericArrayObjectTest extends MediaWikiTestCase {
-
- /**
- * Returns objects that can serve as elements in the concrete GenericArrayObject deriving class being tested.
- *
- * @since 1.20
- *
- * @return array
- */
- public abstract function elementInstancesProvider();
-
- /**
- * Returns the name of the concrete class being tested.
- *
- * @since 1.20
- *
- * @return string
- */
- public abstract function getInstanceClass();
-
- /**
- * Provides instances of the concrete class being tested.
- *
- * @since 1.20
- *
- * @return array
- */
- public function instanceProvider() {
- $instances = array();
-
- foreach ( $this->elementInstancesProvider() as $elementInstances ) {
- $instances[] = $this->getNew( $elementInstances );
- }
-
- return $this->arrayWrap( $instances );
- }
-
- /**
- * @since 1.20
- *
- * @param array $elements
- *
- * @return GenericArrayObject
- */
- protected function getNew( array $elements = array() ) {
- $class = $this->getInstanceClass();
- return new $class( $elements );
- }
-
- /**
- * @dataProvider elementInstancesProvider
- *
- * @since 1.20
- *
- * @param array $elements
- */
- public function testConstructor( array $elements ) {
- $arrayObject = $this->getNew( $elements );
-
- $this->assertEquals( count( $elements ), $arrayObject->count() );
- }
-
- /**
- * @dataProvider elementInstancesProvider
- *
- * @since 1.20
- *
- * @param array $elements
- */
- public function testIsEmpty( array $elements ) {
- $arrayObject = $this->getNew( $elements );
-
- $this->assertEquals( $elements === array(), $arrayObject->isEmpty() );
- }
-
- /**
- * @dataProvider instanceProvider
- *
- * @since 1.20
- *
- * @param GenericArrayObject $list
- */
- public function testUnset( GenericArrayObject $list ) {
- if ( !$list->isEmpty() ) {
- $offset = $list->getIterator()->key();
- $count = $list->count();
- $list->offsetUnset( $offset );
- $this->assertEquals( $count - 1, $list->count() );
- }
-
- if ( !$list->isEmpty() ) {
- $offset = $list->getIterator()->key();
- $count = $list->count();
- unset( $list[$offset] );
- $this->assertEquals( $count - 1, $list->count() );
- }
-
- $exception = null;
- try { $list->offsetUnset( 'sdfsedtgsrdysftu' ); } catch ( \Exception $exception ){}
- $this->assertInstanceOf( '\Exception', $exception );
- }
-
- /**
- * @dataProvider elementInstancesProvider
- *
- * @since 1.20
- *
- * @param array $elements
- */
- public function testAppend( array $elements ) {
- $list = $this->getNew();
-
- $listSize = count( $elements );
-
- foreach ( $elements as $element ) {
- $list->append( $element );
- }
-
- $this->assertEquals( $listSize, $list->count() );
-
- $list = $this->getNew();
-
- foreach ( $elements as $element ) {
- $list[] = $element;
- }
-
- $this->assertEquals( $listSize, $list->count() );
-
- $this->checkTypeChecks( function( GenericArrayObject $list, $element ) {
- $list->append( $element );
- } );
- }
-
- /**
- * @since 1.20
- *
- * @param callback $function
- */
- protected function checkTypeChecks( $function ) {
- $excption = null;
- $list = $this->getNew();
-
- $elementClass = $list->getObjectType();
-
- foreach ( array( 42, 'foo', array(), new \stdClass(), 4.2 ) as $element ) {
- $validValid = $element instanceof $elementClass;
-
- try{
- call_user_func( $function, $list, $element );
- $valid = true;
- }
- catch ( InvalidArgumentException $exception ) {
- $valid = false;
- }
-
- $this->assertEquals(
- $validValid,
- $valid,
- 'Object of invalid type got successfully added to a GenericArrayObject'
- );
- }
- }
-
- /**
- * @dataProvider elementInstancesProvider
- *
- * @since 1.20
- *
- * @param array $elements
- */
- public function testOffsetSet( array $elements ) {
- if ( $elements === array() ) {
- $this->assertTrue( true );
- return;
- }
-
- $list = $this->getNew();
-
- $element = reset( $elements );
- $list->offsetSet( 42, $element );
- $this->assertEquals( $element, $list->offsetGet( 42 ) );
-
- $list = $this->getNew();
-
- $element = reset( $elements );
- $list['oHai'] = $element;
- $this->assertEquals( $element, $list['oHai'] );
-
- $list = $this->getNew();
-
- $element = reset( $elements );
- $list->offsetSet( 9001, $element );
- $this->assertEquals( $element, $list[9001] );
-
- $list = $this->getNew();
-
- $element = reset( $elements );
- $list->offsetSet( null, $element );
- $this->assertEquals( $element, $list[0] );
-
- $list = $this->getNew();
- $offset = 0;
-
- foreach ( $elements as $element ) {
- $list->offsetSet( null, $element );
- $this->assertEquals( $element, $list[$offset++] );
- }
-
- $this->assertEquals( count( $elements ), $list->count() );
-
- $this->checkTypeChecks( function( GenericArrayObject $list, $element ) {
- $list->offsetSet( mt_rand(), $element );
- } );
- }
-
-}
diff --git a/tests/phpunit/includes/libs/IEUrlExtensionTest.php b/tests/phpunit/includes/libs/IEUrlExtensionTest.php
deleted file mode 100644
index c6270e90..00000000
--- a/tests/phpunit/includes/libs/IEUrlExtensionTest.php
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-
-/**
- * Tests for IEUrlExtension::findIE6Extension
- */
-class IEUrlExtensionTest extends MediaWikiTestCase {
- function testSimple() {
- $this->assertEquals(
- 'y',
- IEUrlExtension::findIE6Extension( 'x.y' ),
- 'Simple extension'
- );
- }
-
- function testSimpleNoExt() {
- $this->assertEquals(
- '',
- IEUrlExtension::findIE6Extension( 'x' ),
- 'No extension'
- );
- }
-
- function testEmpty() {
- $this->assertEquals(
- '',
- IEUrlExtension::findIE6Extension( '' ),
- 'Empty string'
- );
- }
-
- function testQuestionMark() {
- $this->assertEquals(
- '',
- IEUrlExtension::findIE6Extension( '?' ),
- 'Question mark only'
- );
- }
-
- function testExtQuestionMark() {
- $this->assertEquals(
- 'x',
- IEUrlExtension::findIE6Extension( '.x?' ),
- 'Extension then question mark'
- );
- }
-
- function testQuestionMarkExt() {
- $this->assertEquals(
- 'x',
- IEUrlExtension::findIE6Extension( '?.x' ),
- 'Question mark then extension'
- );
- }
-
- function testInvalidChar() {
- $this->assertEquals(
- '',
- IEUrlExtension::findIE6Extension( '.x*' ),
- 'Extension with invalid character'
- );
- }
-
- function testInvalidCharThenExtension() {
- $this->assertEquals(
- 'x',
- IEUrlExtension::findIE6Extension( '*.x' ),
- 'Invalid character followed by an extension'
- );
- }
-
- function testMultipleQuestionMarks() {
- $this->assertEquals(
- 'c',
- IEUrlExtension::findIE6Extension( 'a?b?.c?.d?e?f' ),
- 'Multiple question marks'
- );
- }
-
- function testExeException() {
- $this->assertEquals(
- 'd',
- IEUrlExtension::findIE6Extension( 'a?b?.exe?.d?.e' ),
- '.exe exception'
- );
- }
-
- function testExeException2() {
- $this->assertEquals(
- 'exe',
- IEUrlExtension::findIE6Extension( 'a?b?.exe' ),
- '.exe exception 2'
- );
- }
-
- function testHash() {
- $this->assertEquals(
- '',
- IEUrlExtension::findIE6Extension( 'a#b.c' ),
- 'Hash character preceding extension'
- );
- }
-
- function testHash2() {
- $this->assertEquals(
- '',
- IEUrlExtension::findIE6Extension( 'a?#b.c' ),
- 'Hash character preceding extension 2'
- );
- }
-
- function testDotAtEnd() {
- $this->assertEquals(
- '',
- IEUrlExtension::findIE6Extension( '.' ),
- 'Dot at end of string'
- );
- }
-}
diff --git a/tests/phpunit/includes/libs/JavaScriptMinifierTest.php b/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
deleted file mode 100644
index f121b018..00000000
--- a/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-
-class JavaScriptMinifierTest extends MediaWikiTestCase {
-
- function provideCases() {
- return array(
-
- // Basic whitespace and comments that should be stripped entirely
- array( "\r\t\f \v\n\r", "" ),
- array( "/* Foo *\n*bar\n*/", "" ),
-
- /**
- * Slashes used inside block comments (bug 26931).
- * 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 */", ""),
-
- /**
- * ' 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 b/ar baz", "" ),
- array( "/ Foo \\/ bar [ / \\] / ] baz / .length", "/ Foo \\/ bar [ / \\] / ] baz /.length" ),
-
- // HTML comments
- array( "<!-- Foo bar", "" ),
- array( "<!-- Foo --> bar", "" ),
- array( "--> Foo", "" ),
- array( "x --> y", "x-->y" ),
-
- // Semicolon insertion
- array( "(function(){return\nx;})", "(function(){return\nx;})" ),
- array( "throw\nx;", "throw\nx;" ),
- array( "while(p){continue\nx;}", "while(p){continue\nx;}" ),
- array( "while(p){break\nx;}", "while(p){break\nx;}" ),
- array( "var\nx;", "var x;" ),
- array( "x\ny;", "x\ny;" ),
- array( "x\n++y;", "x\n++y;" ),
- array( "x\n!y;", "x\n!y;" ),
- array( "x\n{y}", "x\n{y}" ),
- array( "x\n+y;", "x+y;" ),
- array( "x\n(y);", "x(y);" ),
- array( "5.\nx;", "5.\nx;" ),
- array( "0xFF.\nx;", "0xFF.x;" ),
- array( "5.3.\nx;", "5.3.x;" ),
-
- // 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++){}" ),
-
- // Token separation
- array( "x in y", "x in y" ),
- array( "/x/g in y", "/x/g in y" ),
- array( "x in 30", "x in 30" ),
- array( "x + ++ y", "x+ ++y" ),
- array( "x ++ + y", "x++ +y" ),
- array( "x / /y/.exec(z)", "x/ /y/.exec(z)" ),
-
- // State machine
- array( "/ x/g", "/ x/g" ),
- array( "(function(){return/ x/g})", "(function(){return/ x/g})" ),
- array( "+/ x/g", "+/ x/g" ),
- array( "++/ x/g", "++/ x/g" ),
- array( "x/ x/g", "x/x/g" ),
- array( "(/ x/g)", "(/ x/g)" ),
- array( "if(/ x/g);", "if(/ x/g);" ),
- array( "(x/ x/g)", "(x/x/g)" ),
- array( "([/ x/g])", "([/ x/g])" ),
- array( "+x/ x/g", "+x/x/g" ),
- array( "{}/ x/g", "{}/ x/g" ),
- array( "+{}/ x/g", "+{}/x/g" ),
- array( "(x)/ x/g", "(x)/x/g" ),
- array( "if(x)/ x/g", "if(x)/ x/g" ),
- array( "for(x;x;{}/ x/g);", "for(x;x;{}/x/g);" ),
- array( "x;x;{}/ x/g", "x;x;{}/ x/g" ),
- array( "x:{}/ x/g", "x:{}/ x/g" ),
- array( "switch(x){case y?z:{}/ x/g:{}/ x/g;}", "switch(x){case y?z:{}/x/g:{}/ x/g;}" ),
- array( "function x(){}/ x/g", "function x(){}/ x/g" ),
- array( "+function x(){}/ x/g", "+function x(){}/x/g" ),
-
- // Multiline quoted string
- 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 \";" ),
-
- // 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');" ),
-
- // 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');" ),
-
- // Division vs. regex nastiness
- 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
- array( str_repeat( ';', 996 ) . "if(x++);", str_repeat( ';', 996 ) . "if(x++\n);" ),
-
- // Unicode letter characters should pass through ok in identifiers (bug 31187)
- array( "var KaÅSkatolVal = {}", 'var KaÅSkatolVal={}'),
-
- // Per spec unicode char escape values should work in identifiers,
- // as long as it's a valid char. In future it might get normalized.
- array( "var Ka\\u015dSkatolVal = {}", 'var Ka\\u015dSkatolVal={}'),
-
- // Some structures that might look invalid at first sight
- array( "var a = 5.;", "var a=5.;" ),
- array( "5.0.toString();", "5.0.toString();" ),
- array( "5..toString();", "5..toString();" ),
- array( "5...toString();", false ),
- array( "5.\n.toString();", '5..toString();' ),
- );
- }
-
- /**
- * @dataProvider provideCases
- */
- function testJavaScriptMinifierOutput( $code, $expectedOutput ) {
- $minified = JavaScriptMinifier::minify( $code );
-
- // JSMin+'s parser will throw an exception if output is not valid JS.
- // suppression of warnings needed for stupid crap
- wfSuppressWarnings();
- $parser = new JSParser();
- wfRestoreWarnings();
- $parser->parse( $minified, 'minify-test.js', 1 );
-
- $this->assertEquals( $expectedOutput, $minified, "Minified output should be in the form expected." );
- }
-
- function provideBug32548() {
- return array(
- array(
- // This one gets interpreted all together by the prior code;
- // no break at the 'E' happens.
- '1.23456789E55',
- ),
- array(
- // This one breaks under the bad code; splits between 'E' and '+'
- '1.23456789E+5',
- ),
- array(
- // This one breaks under the bad code; splits between 'E' and '-'
- '1.23456789E-5',
- ),
- );
- }
-
- /**
- * @dataProvider provideBug32548
- */
- function testBug32548Exponent( $num ) {
- // Long line breaking was being incorrectly done between the base and
- // exponent part of a number, causing a syntax error. The line should
- // instead break at the start of the number.
- $prefix = 'var longVarName' . str_repeat( '_', 973 ) . '=';
- $suffix = ',shortVarName=0;';
-
- $input = $prefix . $num . $suffix;
- $expected = $prefix . "\n" . $num . $suffix;
-
- $minified = JavaScriptMinifier::minify( $input );
-
- $this->assertEquals( $expected, $minified, "Line breaks must not occur in middle of exponent");
- }
-}
diff --git a/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php b/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
deleted file mode 100644
index 88f87ef9..00000000
--- a/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
+++ /dev/null
@@ -1,146 +0,0 @@
-<?php
-class BitmapMetadataHandlerTest extends MediaWikiTestCase {
-
- public function setUp() {
- $this->filePath = __DIR__ . '/../../data/media/';
- }
-
- /**
- * Test if having conflicting metadata values from different
- * types of metadata, that the right one takes precedence.
- *
- * Basically the file has IPTC and XMP metadata, the
- * IPTC should override the XMP, except for the multilingual
- * translation (to en) where XMP should win.
- */
- public function testMultilingualCascade() {
- if ( !wfDl( 'exif' ) ) {
- $this->markTestSkipped( "This test needs the exif extension." );
- }
- if ( !wfDl( 'xml' ) ) {
- $this->markTestSkipped( "This test needs the xml extension." );
- }
- global $wgShowEXIF;
- $oldExif = $wgShowEXIF;
- $wgShowEXIF = true;
-
- $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
- '/Xmp-exif-multilingual_test.jpg' );
-
- $expected = array(
- 'x-default' => 'right(iptc)',
- 'en' => 'right translation',
- '_type' => 'lang'
- );
-
- $this->assertArrayHasKey( 'ImageDescription', $meta,
- 'Did not extract any ImageDescription info?!' );
-
- $this->assertEquals( $expected, $meta['ImageDescription'] );
-
- $wgShowEXIF = $oldExif;
- }
-
- /**
- * Test for jpeg comments are being handled by
- * BitmapMetadataHandler correctly.
- *
- * There's more extensive tests of comment extraction in
- * JpegMetadataExtractorTests.php
- */
- public function testJpegComment() {
- $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
- 'jpeg-comment-utf.jpg' );
-
- $this->assertEquals( 'UTF-8 JPEG Comment — ¼',
- $meta['JPEGFileComment'][0] );
- }
-
- /**
- * Make sure a bad iptc block doesn't stop the other metadata
- * from being extracted.
- */
- public function testBadIPTC() {
- $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
- 'iptc-invalid-psir.jpg' );
- $this->assertEquals( 'Created with GIMP', $meta['JPEGFileComment'][0] );
- }
-
- public function testIPTCDates() {
- $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
- 'iptc-timetest.jpg' );
-
- $this->assertEquals( '2020:07:14 01:36:05', $meta['DateTimeDigitized'] );
- $this->assertEquals( '1997:03:02 00:01:02', $meta['DateTimeOriginal'] );
- }
- /**
- * File has an invalid time (+ one valid but really weird time)
- * that shouldn't be included
- */
- public function testIPTCDatesInvalid() {
- $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
- 'iptc-timetest-invalid.jpg' );
-
- $this->assertEquals( '1845:03:02 00:01:02', $meta['DateTimeOriginal'] );
- $this->assertFalse( isset( $meta['DateTimeDigitized'] ) );
- }
-
- /**
- * XMP data should take priority over iptc data
- * when hash has been updated, but not when
- * the hash is wrong.
- */
- public function testMerging() {
- $merger = new BitmapMetadataHandler();
- $merger->addMetadata( array( 'foo' => 'xmp' ), 'xmp-general' );
- $merger->addMetadata( array( 'bar' => 'xmp' ), 'xmp-general' );
- $merger->addMetadata( array( 'baz' => 'xmp' ), 'xmp-general' );
- $merger->addMetadata( array( 'fred' => 'xmp' ), 'xmp-general' );
- $merger->addMetadata( array( 'foo' => 'iptc (hash)' ), 'iptc-good-hash' );
- $merger->addMetadata( array( 'bar' => 'iptc (bad hash)' ), 'iptc-bad-hash' );
- $merger->addMetadata( array( 'baz' => 'iptc (bad hash)' ), 'iptc-bad-hash' );
- $merger->addMetadata( array( 'fred' => 'iptc (no hash)' ), 'iptc-no-hash' );
- $merger->addMetadata( array( 'baz' => 'exif' ), 'exif' );
-
- $actual = $merger->getMetadataArray();
- $expected = array(
- 'foo' => 'xmp',
- 'bar' => 'iptc (bad hash)',
- 'baz' => 'exif',
- 'fred' => 'xmp',
- );
- $this->assertEquals( $expected, $actual );
- }
-
- public function testPNGXMP() {
- if ( !wfDl( 'xml' ) ) {
- $this->markTestSkipped( "This test needs the xml extension." );
- }
- $handler = new BitmapMetadataHandler();
- $result = $handler->png( $this->filePath . 'xmp.png' );
- $expected = array (
- 'frameCount' => 0,
- 'loopCount' => 1,
- 'duration' => 0,
- 'bitDepth' => 1,
- 'colorType' => 'index-coloured',
- 'metadata' => array (
- 'SerialNumber' => '123456789',
- '_MW_PNG_VERSION' => 1,
- ),
- );
- $this->assertEquals( $expected, $result );
- }
- public function testPNGNative() {
- $handler = new BitmapMetadataHandler();
- $result = $handler->png( $this->filePath . 'Png-native-test.png' );
- $expected = 'http://example.com/url';
- $this->assertEquals( $expected, $result['metadata']['Identifier']['x-default'] );
- }
- public function testTiffByteOrder() {
- $handler = new BitmapMetadataHandler();
- $res = $handler->getTiffByteOrder( $this->filePath . 'test.tiff' );
- $this->assertEquals( 'LE', $res );
- }
-
-}
diff --git a/tests/phpunit/includes/media/BitmapScalingTest.php b/tests/phpunit/includes/media/BitmapScalingTest.php
deleted file mode 100644
index 11d9dc47..00000000
--- a/tests/phpunit/includes/media/BitmapScalingTest.php
+++ /dev/null
@@ -1,151 +0,0 @@
-<?php
-
-class BitmapScalingTest extends MediaWikiTestCase {
-
- function setUp() {
- global $wgMaxImageArea, $wgCustomConvertCommand;
- $this->oldMaxImageArea = $wgMaxImageArea;
- $this->oldCustomConvertCommand = $wgCustomConvertCommand;
- $wgMaxImageArea = 1.25e7; // 3500x3500
- $wgCustomConvertCommand = 'dummy'; // Set so that we don't get client side rendering
- }
- function tearDown() {
- global $wgMaxImageArea, $wgCustomConvertCommand;
- $wgMaxImageArea = $this->oldMaxImageArea;
- $wgCustomConvertCommand = $this->oldCustomConvertCommand;
- }
- /**
- * @dataProvider provideNormaliseParams
- */
- function testNormaliseParams( $fileDimensions, $expectedParams, $params, $msg ) {
- $file = new FakeDimensionFile( $fileDimensions );
- $handler = new BitmapHandler;
- $valid = $handler->normaliseParams( $file, $params );
- $this->assertTrue( $valid );
- $this->assertEquals( $expectedParams, $params, $msg );
- }
-
- function provideNormaliseParams() {
- return array(
- /* Regular resize operations */
- array(
- array( 1024, 768 ),
- array(
- 'width' => 512, 'height' => 384,
- 'physicalWidth' => 512, 'physicalHeight' => 384,
- 'page' => 1,
- ),
- array( 'width' => 512 ),
- 'Resizing with width set',
- ),
- array(
- array( 1024, 768 ),
- array(
- 'width' => 512, 'height' => 384,
- 'physicalWidth' => 512, 'physicalHeight' => 384,
- 'page' => 1,
- ),
- array( 'width' => 512, 'height' => 768 ),
- 'Resizing with height set too high',
- ),
- array(
- array( 1024, 768 ),
- array(
- 'width' => 512, 'height' => 384,
- 'physicalWidth' => 512, 'physicalHeight' => 384,
- 'page' => 1,
- ),
- array( 'width' => 1024, 'height' => 384 ),
- 'Resizing with height set',
- ),
-
- /* Very tall images */
- array(
- array( 1000, 100 ),
- array(
- 'width' => 5, 'height' => 1,
- 'physicalWidth' => 5, 'physicalHeight' => 1,
- 'page' => 1,
- ),
- array( 'width' => 5 ),
- 'Very wide image',
- ),
-
- array(
- array( 100, 1000 ),
- array(
- 'width' => 1, 'height' => 10,
- 'physicalWidth' => 1, 'physicalHeight' => 10,
- 'page' => 1,
- ),
- array( 'width' => 1 ),
- 'Very high image',
- ),
- array(
- array( 100, 1000 ),
- array(
- 'width' => 1, 'height' => 5,
- 'physicalWidth' => 1, 'physicalHeight' => 10,
- 'page' => 1,
- ),
- array( 'width' => 10, 'height' => 5 ),
- 'Very high image with height set',
- ),
- /* Max image area */
- array(
- array( 4000, 4000 ),
- array(
- 'width' => 5000, 'height' => 5000,
- 'physicalWidth' => 4000, 'physicalHeight' => 4000,
- 'page' => 1,
- ),
- array( 'width' => 5000 ),
- 'Bigger than max image size but doesn\'t need scaling',
- ),
- );
- }
- function testTooBigImage() {
- $file = new FakeDimensionFile( array( 4000, 4000 ) );
- $handler = new BitmapHandler;
- $params = array( 'width' => '3700' ); // Still bigger than max size.
- $this->assertEquals( 'TransformParameterError',
- get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
- }
- function testTooBigMustRenderImage() {
- $file = new FakeDimensionFile( array( 4000, 4000 ) );
- $file->mustRender = true;
- $handler = new BitmapHandler;
- $params = array( 'width' => '5000' ); // Still bigger than max size.
- $this->assertEquals( 'TransformParameterError',
- get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
- }
-
- function testImageArea() {
- $file = new FakeDimensionFile( array( 7, 9 ) );
- $handler = new BitmapHandler;
- $this->assertEquals( 63, $handler->getImageArea( $file ) );
- }
-}
-
-class FakeDimensionFile extends File {
- public $mustRender = false;
-
- public function __construct( $dimensions ) {
- parent::__construct( Title::makeTitle( NS_FILE, 'Test' ),
- new NullRepo( null ) );
-
- $this->dimensions = $dimensions;
- }
- public function getWidth( $page = 1 ) {
- return $this->dimensions[0];
- }
- public function getHeight( $page = 1 ) {
- return $this->dimensions[1];
- }
- public function mustRender() {
- return $this->mustRender;
- }
- public function getPath() {
- return '';
- }
-}
diff --git a/tests/phpunit/includes/media/ExifBitmapTest.php b/tests/phpunit/includes/media/ExifBitmapTest.php
deleted file mode 100644
index b2f6b7ba..00000000
--- a/tests/phpunit/includes/media/ExifBitmapTest.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-
-class ExifBitmapTest extends MediaWikiTestCase {
-
- public function setUp() {
- global $wgShowEXIF;
- $this->showExif = $wgShowEXIF;
- $wgShowEXIF = true;
- $this->handler = new ExifBitmapHandler;
- if ( !wfDl( 'exif' ) ) {
- $this->markTestSkipped( "This test needs the exif extension." );
- }
- }
-
- public function tearDown() {
- global $wgShowEXIF;
- $wgShowEXIF = $this->showExif;
- }
-
- public function testIsOldBroken() {
- $res = $this->handler->isMetadataValid( null, ExifBitmapHandler::OLD_BROKEN_FILE );
- $this->assertEquals( ExifBitmapHandler::METADATA_COMPATIBLE, $res );
- }
- public function testIsBrokenFile() {
- $res = $this->handler->isMetadataValid( null, ExifBitmapHandler::BROKEN_FILE );
- $this->assertEquals( ExifBitmapHandler::METADATA_GOOD, $res );
- }
- public function testIsInvalid() {
- $res = $this->handler->isMetadataValid( null, 'Something Invalid Here.' );
- $this->assertEquals( ExifBitmapHandler::METADATA_BAD, $res );
- }
- public function testGoodMetadata() {
- $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;}';
- $res = $this->handler->isMetadataValid( null, $meta );
- $this->assertEquals( ExifBitmapHandler::METADATA_GOOD, $res );
- }
- public function testIsOldGood() {
- $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;}';
- $res = $this->handler->isMetadataValid( null, $meta );
- $this->assertEquals( ExifBitmapHandler::METADATA_COMPATIBLE, $res );
- }
- // Handle metadata from paged tiff handler (gotten via instant commons)
- // gracefully.
- public function testPagedTiffHandledGracefully() {
- $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";}';
- $res = $this->handler->isMetadataValid( null, $meta );
- $this->assertEquals( ExifBitmapHandler::METADATA_BAD, $res );
- }
-
- function testConvertMetadataLatest() {
- $metadata = array(
- 'foo' => array( 'First', 'Second', '_type' => 'ol' ),
- 'MEDIAWIKI_EXIF_VERSION' => 2
- );
- $res = $this->handler->convertMetadataVersion( $metadata, 2 );
- $this->assertEquals( $metadata, $res );
- }
- function testConvertMetadataToOld() {
- $metadata = array(
- 'foo' => array( 'First', 'Second', '_type' => 'ol' ),
- 'bar' => array( 'First', 'Second', '_type' => 'ul' ),
- 'baz' => array( 'First', 'Second' ),
- 'fred' => 'Single',
- 'MEDIAWIKI_EXIF_VERSION' => 2,
- );
- $expected = array(
- 'foo' => "\n#First\n#Second",
- 'bar' => "\n*First\n*Second",
- 'baz' => "\n*First\n*Second",
- 'fred' => 'Single',
- 'MEDIAWIKI_EXIF_VERSION' => 1,
- );
- $res = $this->handler->convertMetadataVersion( $metadata, 1 );
- $this->assertEquals( $expected, $res );
- }
- function testConvertMetadataSoftware() {
- $metadata = array(
- 'Software' => array( array('GIMP', '1.1' ) ),
- 'MEDIAWIKI_EXIF_VERSION' => 2,
- );
- $expected = array(
- 'Software' => 'GIMP (Version 1.1)',
- 'MEDIAWIKI_EXIF_VERSION' => 1,
- );
- $res = $this->handler->convertMetadataVersion( $metadata, 1 );
- $this->assertEquals( $expected, $res );
- }
- function testConvertMetadataSoftwareNormal() {
- $metadata = array(
- 'Software' => array( "GIMP 1.2", "vim" ),
- 'MEDIAWIKI_EXIF_VERSION' => 2,
- );
- $expected = array(
- 'Software' => "\n*GIMP 1.2\n*vim",
- 'MEDIAWIKI_EXIF_VERSION' => 1,
- );
- $res = $this->handler->convertMetadataVersion( $metadata, 1 );
- $this->assertEquals( $expected, $res );
- }
-}
diff --git a/tests/phpunit/includes/media/ExifRotationTest.php b/tests/phpunit/includes/media/ExifRotationTest.php
deleted file mode 100644
index 6af52dd1..00000000
--- a/tests/phpunit/includes/media/ExifRotationTest.php
+++ /dev/null
@@ -1,260 +0,0 @@
-<?php
-
-/**
- * Tests related to auto rotation
- */
-class ExifRotationTest extends MediaWikiTestCase {
-
- function setUp() {
- parent::setUp();
- $this->handler = new BitmapHandler();
- $filePath = __DIR__ . '/../../data/media';
-
- $tmpDir = $this->getNewTempDirectory();
-
- $this->repo = new FSRepo( array(
- 'name' => 'temp',
- 'url' => 'http://localhost/thumbtest',
- 'backend' => new FSFileBackend( array(
- 'name' => 'localtesting',
- 'lockManager' => 'nullLockManager',
- 'containerPaths' => array( 'temp-thumb' => $tmpDir, 'data' => $filePath )
- ) )
- ) );
- if ( !wfDl( 'exif' ) ) {
- $this->markTestSkipped( "This test needs the exif extension." );
- }
- global $wgShowEXIF;
- $this->show = $wgShowEXIF;
- $wgShowEXIF = true;
-
- global $wgEnableAutoRotation;
- $this->oldAuto = $wgEnableAutoRotation;
- $wgEnableAutoRotation = true;
- }
-
- public function tearDown() {
- global $wgShowEXIF, $wgEnableAutoRotation;
- $wgShowEXIF = $this->show;
- $wgEnableAutoRotation = $this->oldAuto;
-
- parent::tearDown();
- }
-
- /**
- *
- * @dataProvider providerFiles
- */
- function testMetadata( $name, $type, $info ) {
- if ( !BitmapHandler::canRotate() ) {
- $this->markTestSkipped( "This test needs a rasterizer that can auto-rotate." );
- }
- $file = $this->dataFile( $name, $type );
- $this->assertEquals( $info['width'], $file->getWidth(), "$name: width check" );
- $this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
- }
-
- /**
- *
- * @dataProvider providerFiles
- */
- function testRotationRendering( $name, $type, $info, $thumbs ) {
- if ( !BitmapHandler::canRotate() ) {
- $this->markTestSkipped( "This test needs a rasterizer that can auto-rotate." );
- }
- foreach( $thumbs as $size => $out ) {
- if( preg_match('/^(\d+)px$/', $size, $matches ) ) {
- $params = array(
- 'width' => $matches[1],
- );
- } elseif ( preg_match( '/^(\d+)x(\d+)px$/', $size, $matches ) ) {
- $params = array(
- 'width' => $matches[1],
- 'height' => $matches[2]
- );
- } else {
- throw new MWException('bogus test data format ' . $size);
- }
-
- $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" );
-
- $gis = getimagesize( $thumb->getLocalCopyPath() );
- if ($out[0] > $info['width']) {
- // Physical image won't be scaled bigger than the original.
- $this->assertEquals( $info['width'], $gis[0], "$name: thumb actual width check for $size");
- $this->assertEquals( $info['height'], $gis[1], "$name: thumb actual height check for $size");
- } else {
- $this->assertEquals( $out[0], $gis[0], "$name: thumb actual width check for $size");
- $this->assertEquals( $out[1], $gis[1], "$name: thumb actual height check for $size");
- }
- }
- }
-
- private function dataFile( $name, $type ) {
- return new UnregisteredLocalFile( false, $this->repo,
- "mwstore://localtesting/data/$name", $type );
- }
-
- function providerFiles() {
- return array(
- array(
- 'landscape-plain.jpg',
- 'image/jpeg',
- array(
- 'width' => 1024,
- 'height' => 768,
- ),
- array(
- '800x600px' => array( 800, 600 ),
- '9999x800px' => array( 1067, 800 ),
- '800px' => array( 800, 600 ),
- '600px' => array( 600, 450 ),
- )
- ),
- array(
- 'portrait-rotated.jpg',
- 'image/jpeg',
- array(
- 'width' => 768, // as rotated
- 'height' => 1024, // as rotated
- ),
- array(
- '800x600px' => array( 450, 600 ),
- '9999x800px' => array( 600, 800 ),
- '800px' => array( 800, 1067 ),
- '600px' => array( 600, 800 ),
- )
- )
- );
- }
-
- /**
- * Same as before, but with auto-rotation disabled.
- * @dataProvider providerFilesNoAutoRotate
- */
- function testMetadataNoAutoRotate( $name, $type, $info ) {
- global $wgEnableAutoRotation;
- $wgEnableAutoRotation = false;
-
- $file = $this->dataFile( $name, $type );
- $this->assertEquals( $info['width'], $file->getWidth(), "$name: width check" );
- $this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
-
- $wgEnableAutoRotation = true;
- }
-
- /**
- *
- * @dataProvider providerFilesNoAutoRotate
- */
- function testRotationRenderingNoAutoRotate( $name, $type, $info, $thumbs ) {
- global $wgEnableAutoRotation;
- $wgEnableAutoRotation = false;
-
- foreach( $thumbs as $size => $out ) {
- if( preg_match('/^(\d+)px$/', $size, $matches ) ) {
- $params = array(
- 'width' => $matches[1],
- );
- } elseif ( preg_match( '/^(\d+)x(\d+)px$/', $size, $matches ) ) {
- $params = array(
- 'width' => $matches[1],
- 'height' => $matches[2]
- );
- } else {
- throw new MWException('bogus test data format ' . $size);
- }
-
- $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" );
-
- $gis = getimagesize( $thumb->getLocalCopyPath() );
- if ($out[0] > $info['width']) {
- // Physical image won't be scaled bigger than the original.
- $this->assertEquals( $info['width'], $gis[0], "$name: thumb actual width check for $size");
- $this->assertEquals( $info['height'], $gis[1], "$name: thumb actual height check for $size");
- } else {
- $this->assertEquals( $out[0], $gis[0], "$name: thumb actual width check for $size");
- $this->assertEquals( $out[1], $gis[1], "$name: thumb actual height check for $size");
- }
- }
- $wgEnableAutoRotation = true;
- }
-
- function providerFilesNoAutoRotate() {
- return array(
- array(
- 'landscape-plain.jpg',
- 'image/jpeg',
- array(
- 'width' => 1024,
- 'height' => 768,
- ),
- array(
- '800x600px' => array( 800, 600 ),
- '9999x800px' => array( 1067, 800 ),
- '800px' => array( 800, 600 ),
- '600px' => array( 600, 450 ),
- )
- ),
- array(
- 'portrait-rotated.jpg',
- 'image/jpeg',
- array(
- 'width' => 1024, // since not rotated
- 'height' => 768, // since not rotated
- ),
- array(
- '800x600px' => array( 800, 600 ),
- '9999x800px' => array( 1067, 800 ),
- '800px' => array( 800, 600 ),
- '600px' => array( 600, 450 ),
- )
- )
- );
- }
-
-
- const TEST_WIDTH = 100;
- const TEST_HEIGHT = 200;
-
- /**
- * @dataProvider provideBitmapExtractPreRotationDimensions
- */
- function testBitmapExtractPreRotationDimensions( $rotation, $expected ) {
- $result = $this->handler->extractPreRotationDimensions( array(
- 'physicalWidth' => self::TEST_WIDTH,
- 'physicalHeight' => self::TEST_HEIGHT,
- ), $rotation );
- $this->assertEquals( $expected, $result );
- }
-
- function provideBitmapExtractPreRotationDimensions() {
- return array(
- array(
- 0,
- array( self::TEST_WIDTH, self::TEST_HEIGHT )
- ),
- array(
- 90,
- array( self::TEST_HEIGHT, self::TEST_WIDTH )
- ),
- array(
- 180,
- array( self::TEST_WIDTH, self::TEST_HEIGHT )
- ),
- array(
- 270,
- array( self::TEST_HEIGHT, self::TEST_WIDTH )
- ),
- );
- }
-}
-
diff --git a/tests/phpunit/includes/media/ExifTest.php b/tests/phpunit/includes/media/ExifTest.php
deleted file mode 100644
index 045777d7..00000000
--- a/tests/phpunit/includes/media/ExifTest.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-class ExifTest extends MediaWikiTestCase {
-
- public function setUp() {
- $this->mediaPath = __DIR__ . '/../../data/media/';
-
- if ( !wfDl( 'exif' ) ) {
- $this->markTestSkipped( "This test needs the exif extension." );
- }
- global $wgShowEXIF;
- $this->showExif = $wgShowEXIF;
- $wgShowEXIF = true;
- }
-
- public function tearDown() {
- global $wgShowEXIF;
- $wgShowEXIF = $this->showExif;
- }
-
- public function testGPSExtraction() {
- $filename = $this->mediaPath . 'exif-gps.jpg';
- $seg = JpegMetadataExtractor::segmentSplitter( $filename );
- $exif = new Exif( $filename, $seg['byteOrder'] );
- $data = $exif->getFilteredData();
- $expected = array(
- 'GPSLatitude' => 88.5180555556,
- 'GPSLongitude' => -21.12357,
- 'GPSAltitude' => -3.141592653,
- 'GPSDOP' => '5/1',
- 'GPSVersionID' => '2.2.0.0',
- );
- $this->assertEquals( $expected, $data, '', 0.0000000001 );
- }
-
- public function testUnicodeUserComment() {
- $filename = $this->mediaPath . 'exif-user-comment.jpg';
- $seg = JpegMetadataExtractor::segmentSplitter( $filename );
- $exif = new Exif( $filename, $seg['byteOrder'] );
- $data = $exif->getFilteredData();
-
- $expected = array(
- 'UserComment' => 'testâ”comment'
- );
- $this->assertEquals( $expected, $data );
- }
-
-
-}
diff --git a/tests/phpunit/includes/media/FormatMetadataTest.php b/tests/phpunit/includes/media/FormatMetadataTest.php
deleted file mode 100644
index 6ade6702..00000000
--- a/tests/phpunit/includes/media/FormatMetadataTest.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-class FormatMetadataTest extends MediaWikiTestCase {
- public function setUp() {
- if ( !wfDl( 'exif' ) ) {
- $this->markTestSkipped( "This test needs the exif extension." );
- }
- $filePath = __DIR__ . '/../../data/media';
- $this->backend = new FSFileBackend( array(
- 'name' => 'localtesting',
- 'lockManager' => 'nullLockManager',
- 'containerPaths' => array( 'data' => $filePath )
- ) );
- $this->repo = new FSRepo( array(
- 'name' => 'temp',
- 'url' => 'http://localhost/thumbtest',
- 'backend' => $this->backend
- ) );
- global $wgShowEXIF;
- $this->show = $wgShowEXIF;
- $wgShowEXIF = true;
- }
- public function tearDown() {
- global $wgShowEXIF;
- $wgShowEXIF = $this->show;
- }
-
- public function testInvalidDate() {
- $file = $this->dataFile( 'broken_exif_date.jpg', 'image/jpeg' );
-
- // Throws an error if bug hit
- $meta = $file->formatMetadata();
- $this->assertNotEquals( false, $meta, 'Valid metadata extracted' );
-
- // Find date exif entry
- $this->assertArrayHasKey( 'visible', $meta );
- $dateIndex = null;
- foreach ( $meta['visible'] as $i => $data ) {
- if ( $data['id'] == 'exif-datetimeoriginal' ) {
- $dateIndex = $i;
- }
- }
- $this->assertNotNull( $dateIndex, 'Date entry exists in metadata' );
- $this->assertEquals( '0000:01:00 00:02:27',
- $meta['visible'][$dateIndex]['value'],
- 'File with invalid date metadata (bug 29471)' );
- }
-
- private function dataFile( $name, $type ) {
- return new UnregisteredLocalFile( false, $this->repo,
- "mwstore://localtesting/data/$name", $type );
- }
-}
diff --git a/tests/phpunit/includes/media/GIFMetadataExtractorTest.php b/tests/phpunit/includes/media/GIFMetadataExtractorTest.php
deleted file mode 100644
index 650fdd5c..00000000
--- a/tests/phpunit/includes/media/GIFMetadataExtractorTest.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-class GIFMetadataExtractorTest extends MediaWikiTestCase {
-
- public function setUp() {
- $this->mediaPath = __DIR__ . '/../../data/media/';
- }
- /**
- * Put in a file, and see if the metadata coming out is as expected.
- * @param $filename String
- * @param $expected Array The extracted metadata.
- * @dataProvider dataGetMetadata
- */
- public function testGetMetadata( $filename, $expected ) {
- $actual = GIFMetadataExtractor::getMetadata( $this->mediaPath . $filename );
- $this->assertEquals( $expected, $actual );
- }
- public function dataGetMetadata() {
-
- $xmpNugget = <<<EOF
-<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
-<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 7.30'>
-<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-
- <rdf:Description rdf:about=''
- xmlns:Iptc4xmpCore='http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/'>
- <Iptc4xmpCore:Location>The interwebs</Iptc4xmpCore:Location>
- </rdf:Description>
-
- <rdf:Description rdf:about=''
- xmlns:tiff='http://ns.adobe.com/tiff/1.0/'>
- <tiff:Artist>Bawolff</tiff:Artist>
- <tiff:ImageDescription>
- <rdf:Alt>
- <rdf:li xml:lang='x-default'>A file to test GIF</rdf:li>
- </rdf:Alt>
- </tiff:ImageDescription>
- </rdf:Description>
-</rdf:RDF>
-</x:xmpmeta>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<?xpacket end='w'?>
-EOF;
- $xmpNugget = str_replace( "\r", '', $xmpNugget ); // Windows compat
-
- return array(
- array( 'nonanimated.gif', array(
- 'comment' => array( 'GIF test file â• Created with GIMP' ),
- 'duration' => 0.1,
- 'frameCount' => 1,
- 'looped' => false,
- 'xmp' => '',
- )
- ),
- array( 'animated.gif', array(
- 'comment' => array( 'GIF test file . Created with GIMP' ),
- 'duration' => 2.4,
- 'frameCount' => 4,
- 'looped' => true,
- 'xmp' => '',
- )
- ),
-
- array( 'animated-xmp.gif', array(
- 'xmp' => $xmpNugget,
- 'duration' => 2.4,
- 'frameCount' => 4,
- 'looped' => true,
- 'comment' => array( 'GIƒ·test·file' ),
- )
- ),
- );
- }
-}
diff --git a/tests/phpunit/includes/media/GIFTest.php b/tests/phpunit/includes/media/GIFTest.php
deleted file mode 100644
index 5dcbeee0..00000000
--- a/tests/phpunit/includes/media/GIFTest.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-class GIFHandlerTest extends MediaWikiTestCase {
-
- public function setUp() {
- $this->filePath = __DIR__ . '/../../data/media';
- $this->backend = new FSFileBackend( array(
- 'name' => 'localtesting',
- 'lockManager' => 'nullLockManager',
- 'containerPaths' => array( 'data' => $this->filePath )
- ) );
- $this->repo = new FSRepo( array(
- 'name' => 'temp',
- 'url' => 'http://localhost/thumbtest',
- 'backend' => $this->backend
- ) );
- $this->handler = new GIFHandler();
- }
-
- public function testInvalidFile() {
- $res = $this->handler->getMetadata( null, $this->filePath . '/README' );
- $this->assertEquals( GIFHandler::BROKEN_FILE, $res );
- }
- /**
- * @param $filename String basename of the file to check
- * @param $expected boolean Expected result.
- * @dataProvider dataIsAnimated
- */
- public function testIsAnimanted( $filename, $expected ) {
- $file = $this->dataFile( $filename, 'image/gif' );
- $actual = $this->handler->isAnimatedImage( $file );
- $this->assertEquals( $expected, $actual );
- }
- public function dataIsAnimated() {
- return array(
- array( 'animated.gif', true ),
- array( 'nonanimated.gif', false ),
- );
- }
-
- /**
- * @param $filename String
- * @param $expected Integer Total image area
- * @dataProvider dataGetImageArea
- */
- public function testGetImageArea( $filename, $expected ) {
- $file = $this->dataFile( $filename, 'image/gif' );
- $actual = $this->handler->getImageArea( $file, $file->getWidth(), $file->getHeight() );
- $this->assertEquals( $expected, $actual );
- }
- public function dataGetImageArea() {
- return array(
- array( 'animated.gif', 5400 ),
- array( 'nonanimated.gif', 1350 ),
- );
- }
-
- /**
- * @param $metadata String Serialized metadata
- * @param $expected Integer One of the class constants of GIFHandler
- * @dataProvider dataIsMetadataValid
- */
- public function testIsMetadataValid( $metadata, $expected ) {
- $actual = $this->handler->isMetadataValid( null, $metadata );
- $this->assertEquals( $expected, $actual );
- }
- public function dataIsMetadataValid() {
- return array(
- array( GIFHandler::BROKEN_FILE, GIFHandler::METADATA_GOOD ),
- array( '', GIFHandler::METADATA_BAD ),
- array( null, GIFHandler::METADATA_BAD ),
- array( 'Something invalid!', GIFHandler::METADATA_BAD ),
- 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 ),
- );
- }
-
- /**
- * @param $filename String
- * @param $expected String Serialized array
- * @dataProvider dataGetMetadata
- */
- public function testGetMetadata( $filename, $expected ) {
- $file = $this->dataFile( $filename, 'image/gif' );
- $actual = $this->handler->getMetadata( $file, "$this->filePath/$filename" );
- $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
- }
-
- public function dataGetMetadata() {
- return array(
- 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;}}' ),
- );
- }
-
- private function dataFile( $name, $type ) {
- return new UnregisteredLocalFile( false, $this->repo,
- "mwstore://localtesting/data/$name", $type );
- }
-}
diff --git a/tests/phpunit/includes/media/IPTCTest.php b/tests/phpunit/includes/media/IPTCTest.php
deleted file mode 100644
index ec6deeb8..00000000
--- a/tests/phpunit/includes/media/IPTCTest.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-class IPTCTest extends MediaWikiTestCase {
- public function testRecognizeUtf8() {
- // utf-8 is the only one used in practise.
- $res = IPTC::getCharset( "\x1b%G" );
- $this->assertEquals( 'UTF-8', $res );
- }
-
- public function testIPTCParseNoCharset88591() {
- // basically IPTC for keyword with value of 0xBC which is 1/4 in iso-8859-1
- // This data doesn't specify a charset. We're supposed to guess
- // (which basically means utf-8 if valid, windows 1252 (iso 8859-1) if not)
- $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x06\x1c\x02\x19\x00\x01\xBC";
- $res = IPTC::Parse( $iptcData );
- $this->assertEquals( array( '¼' ), $res['Keywords'] );
- }
- /* This one contains a sequence that's valid iso 8859-1 but not valid utf8 */
- /* \xC3 = Ã, \xB8 = ¸ */
- public function testIPTCParseNoCharset88591b() {
- $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x09\x1c\x02\x19\x00\x04\xC3\xC3\xC3\xB8";
- $res = IPTC::Parse( $iptcData );
- $this->assertEquals( array( 'ÃÃø' ), $res['Keywords'] );
- }
- /* Same as testIPTCParseNoCharset88591b, but forcing the charset to utf-8.
- * What should happen is the first "\xC3\xC3" should be dropped as invalid,
- * leaving \xC3\xB8, which is ø
- */
- public function testIPTCParseForcedUTFButInvalid() {
- $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x11\x1c\x02\x19\x00\x04\xC3\xC3\xC3\xB8"
- . "\x1c\x01\x5A\x00\x03\x1B\x25\x47";
- $res = IPTC::Parse( $iptcData );
- $this->assertEquals( array( 'ø' ), $res['Keywords'] );
- }
- public function testIPTCParseNoCharsetUTF8() {
- $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x07\x1c\x02\x19\x00\x02¼";
- $res = IPTC::Parse( $iptcData );
- $this->assertEquals( array( '¼' ), $res['Keywords'] );
- }
- // Testing something that has 2 values for keyword
- public function testIPTCParseMulti() {
- $iptcData = /* identifier */ "Photoshop 3.0\08BIM\4\4"
- /* length */ . "\0\0\0\0\0\x0D"
- . "\x1c\x02\x19" . "\x00\x01" . "\xBC"
- . "\x1c\x02\x19" . "\x00\x02" . "\xBC\xBD";
- $res = IPTC::Parse( $iptcData );
- $this->assertEquals( array( '¼', '¼½' ), $res['Keywords'] );
- }
- 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";
- $res = IPTC::Parse( $iptcData );
- $this->assertEquals( array( '¼' ), $res['Keywords'] );
- }
-
-}
diff --git a/tests/phpunit/includes/media/JpegMetadataExtractorTest.php b/tests/phpunit/includes/media/JpegMetadataExtractorTest.php
deleted file mode 100644
index 41d81190..00000000
--- a/tests/phpunit/includes/media/JpegMetadataExtractorTest.php
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-/**
- * @todo Could use a test of extended XMP segments. Hard to find programs that
- * create example files, and creating my own in vim propbably wouldn't
- * serve as a very good "test". (Adobe photoshop probably creates such files
- * but it costs money). The implementation of it currently in MediaWiki is based
- * solely on reading the standard, without any real world test files.
- */
-class JpegMetadataExtractorTest extends MediaWikiTestCase {
-
- public function setUp() {
- $this->filePath = __DIR__ . '/../../data/media/';
- }
-
- /**
- * We also use this test to test padding bytes don't
- * screw stuff up
- *
- * @param $file filename
- *
- * @dataProvider dataUtf8Comment
- */
- public function testUtf8Comment( $file ) {
- $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . $file );
- $this->assertEquals( array( 'UTF-8 JPEG Comment — ¼' ), $res['COM'] );
- }
- public function dataUtf8Comment() {
- return array(
- array( 'jpeg-comment-utf.jpg' ),
- array( 'jpeg-padding-even.jpg' ),
- array( 'jpeg-padding-odd.jpg' ),
- );
- }
- /** The file is iso-8859-1, but it should get auto converted */
- public function testIso88591Comment() {
- $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-comment-iso8859-1.jpg' );
- $this->assertEquals( array( 'ISO-8859-1 JPEG Comment - ¼' ), $res['COM'] );
- }
- /** Comment values that are non-textual (random binary junk) should not be shown.
- * The example test file has a comment with a 0x5 byte in it which is a control character
- * and considered binary junk for our purposes.
- */
- public function testBinaryCommentStripped() {
- $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-comment-binary.jpg' );
- $this->assertEmpty( $res['COM'] );
- }
- /* Very rarely a file can have multiple comments.
- * Order of comments is based on order inside the file.
- */
- public function testMultipleComment() {
- $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-comment-multiple.jpg' );
- $this->assertEquals( array( 'foo', 'bar' ), $res['COM'] );
- }
- public function testXMPExtraction() {
- $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-psir.jpg' );
- $expected = file_get_contents( $this->filePath . 'jpeg-xmp-psir.xmp' );
- $this->assertEquals( $expected, $res['XMP'] );
- }
- public function testPSIRExtraction() {
- $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-psir.jpg' );
- $expected = '50686f746f73686f7020332e30003842494d04040000000000181c02190004746573741c02190003666f6f1c020000020004';
- $this->assertEquals( $expected, bin2hex( $res['PSIR'][0] ) );
- }
- public function testXMPExtractionAltAppId() {
- $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-alt.jpg' );
- $expected = file_get_contents( $this->filePath . 'jpeg-xmp-psir.xmp' );
- $this->assertEquals( $expected, $res['XMP'] );
- }
-
-
- public function testIPTCHashComparisionNoHash() {
- $segments = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-psir.jpg' );
- $res = JpegMetadataExtractor::doPSIR( $segments['PSIR'][0] );
-
- $this->assertEquals( 'iptc-no-hash', $res );
- }
- public function testIPTCHashComparisionBadHash() {
- $segments = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-iptc-bad-hash.jpg' );
- $res = JpegMetadataExtractor::doPSIR( $segments['PSIR'][0] );
-
- $this->assertEquals( 'iptc-bad-hash', $res );
- }
- public function testIPTCHashComparisionGoodHash() {
- $segments = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-iptc-good-hash.jpg' );
- $res = JpegMetadataExtractor::doPSIR( $segments['PSIR'][0] );
-
- $this->assertEquals( 'iptc-good-hash', $res );
- }
- public function testExifByteOrder() {
- $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'exif-user-comment.jpg' );
- $expected = 'BE';
- $this->assertEquals( $expected, $res['byteOrder'] );
- }
-}
diff --git a/tests/phpunit/includes/media/JpegTest.php b/tests/phpunit/includes/media/JpegTest.php
deleted file mode 100644
index ea007f90..00000000
--- a/tests/phpunit/includes/media/JpegTest.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-class JpegTest extends MediaWikiTestCase {
-
- public function setUp() {
- $this->filePath = __DIR__ . '/../../data/media/';
- if ( !wfDl( 'exif' ) ) {
- $this->markTestSkipped( "This test needs the exif extension." );
- }
- global $wgShowEXIF;
- $this->show = $wgShowEXIF;
- $wgShowEXIF = true;
- }
- public function tearDown() {
- global $wgShowEXIF;
- $wgShowEXIF = $this->show;
- }
-
- public function testInvalidFile() {
- $jpeg = new JpegHandler;
- $res = $jpeg->getMetadata( null, $this->filePath . 'README' );
- $this->assertEquals( ExifBitmapHandler::BROKEN_FILE, $res );
- }
- public function testJpegMetadataExtraction() {
- $h = new JpegHandler;
- $res = $h->getMetadata( null, $this->filePath . 'test.jpg' );
- $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;}';
-
- // Unserialize in case serialization format ever changes.
- $this->assertEquals( unserialize( $expected ), unserialize( $res ) );
- }
-}
diff --git a/tests/phpunit/includes/media/MediaHandlerTest.php b/tests/phpunit/includes/media/MediaHandlerTest.php
deleted file mode 100644
index 99df4f80..00000000
--- a/tests/phpunit/includes/media/MediaHandlerTest.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-class MediaHandlerTest extends MediaWikiTestCase {
- function testFitBoxWidth() {
- $vals = array(
- array(
- 'width' => 50,
- 'height' => 50,
- 'tests' => array(
- 50 => 50,
- 17 => 17,
- 18 => 18 ) ),
- array(
- 'width' => 366,
- 'height' => 300,
- 'tests' => array(
- 50 => 61,
- 17 => 21,
- 18 => 22 ) ),
- array(
- 'width' => 300,
- 'height' => 366,
- 'tests' => array(
- 50 => 41,
- 17 => 14,
- 18 => 15 ) ),
- array(
- 'width' => 100,
- 'height' => 400,
- 'tests' => array(
- 50 => 12,
- 17 => 4,
- 18 => 4 ) ) );
- foreach ( $vals as $row ) {
- $tests = $row['tests'];
- $height = $row['height'];
- $width = $row['width'];
- foreach ( $tests as $max => $expected ) {
- $y = round( $expected * $height / $width );
- $result = MediaHandler::fitBoxWidth( $width, $height, $max );
- $y2 = round( $result * $height / $width );
- $this->assertEquals( $expected,
- $result,
- "($width, $height, $max) wanted: {$expected}x$y, got: {$result}x$y2" );
- }
- }
- }
-}
-
-
diff --git a/tests/phpunit/includes/media/PNGMetadataExtractorTest.php b/tests/phpunit/includes/media/PNGMetadataExtractorTest.php
deleted file mode 100644
index 1b1b2ec3..00000000
--- a/tests/phpunit/includes/media/PNGMetadataExtractorTest.php
+++ /dev/null
@@ -1,141 +0,0 @@
-<?php
-class PNGMetadataExtractorTest extends MediaWikiTestCase {
-
- function setUp() {
- $this->filePath = __DIR__ . '/../../data/media/';
- }
- /**
- * Tests zTXt tag (compressed textual metadata)
- */
- function testPngNativetZtxt() {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- 'Png-native-test.png' );
- $expected = "foo bar baz foo foo foo foof foo foo foo foo";
- $this->assertArrayHasKey( 'text', $meta );
- $meta = $meta['text'];
- $this->assertArrayHasKey( 'Make', $meta );
- $this->assertArrayHasKey( 'x-default', $meta['Make'] );
-
- $this->assertEquals( $expected, $meta['Make']['x-default'] );
- }
-
- /**
- * Test tEXt tag (Uncompressed textual metadata)
- */
- function testPngNativeText() {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- 'Png-native-test.png' );
- $expected = "Some long image desc";
- $this->assertArrayHasKey( 'text', $meta );
- $meta = $meta['text'];
- $this->assertArrayHasKey( 'ImageDescription', $meta );
- $this->assertArrayHasKey( 'x-default', $meta['ImageDescription'] );
- $this->assertArrayHasKey( '_type', $meta['ImageDescription'] );
-
- $this->assertEquals( $expected, $meta['ImageDescription']['x-default'] );
- }
-
- /**
- * tEXt tags must be encoded iso-8859-1 (vs iTXt which are utf-8)
- * Make sure non-ascii characters get converted properly
- */
- function testPngNativeTextNonAscii() {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- 'Png-native-test.png' );
-
- // Note the Copyright symbol here is a utf-8 one
- // (aka \xC2\xA9) where in the file its iso-8859-1
- // encoded as just \xA9.
- $expected = "© 2010 Bawolff";
-
-
- $this->assertArrayHasKey( 'text', $meta );
- $meta = $meta['text'];
- $this->assertArrayHasKey( 'Copyright', $meta );
- $this->assertArrayHasKey( 'x-default', $meta['Copyright'] );
-
- $this->assertEquals( $expected, $meta['Copyright']['x-default'] );
- }
-
- /**
- * Test extraction of pHYs tags, which can tell what the
- * actual resolution of the image is (aka in dots per meter).
- function testPngPhysTag () {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- 'Png-native-test.png' );
-
- $this->assertArrayHasKey( 'text', $meta );
- $meta = $meta['text'];
-
- $this->assertEquals( '2835/100', $meta['XResolution'] );
- $this->assertEquals( '2835/100', $meta['YResolution'] );
- $this->assertEquals( 3, $meta['ResolutionUnit'] ); // 3 = cm
- }
-
- /**
- * Given a normal static PNG, check the animation metadata returned.
- */
- function testStaticPngAnimationMetadata() {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- 'Png-native-test.png' );
-
- $this->assertEquals( 0, $meta['frameCount'] );
- $this->assertEquals( 1, $meta['loopCount'] );
- $this->assertEquals( 0, $meta['duration'] );
- }
-
- /**
- * Given an animated APNG image file
- * check it gets animated metadata right.
- */
- function testApngAnimationMetadata() {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- 'Animated_PNG_example_bouncing_beach_ball.png' );
-
- $this->assertEquals( 20, $meta['frameCount'] );
- // Note loop count of 0 = infinity
- $this->assertEquals( 0, $meta['loopCount'] );
- $this->assertEquals( 1.5, $meta['duration'], '', 0.00001 );
- }
-
- function testPngBitDepth8() {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- 'Png-native-test.png' );
-
- $this->assertEquals( 8, $meta['bitDepth'] );
- }
- function testPngBitDepth1() {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- '1bit-png.png' );
- $this->assertEquals( 1, $meta['bitDepth'] );
- }
-
-
- function testPngIndexColour() {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- 'Png-native-test.png' );
-
- $this->assertEquals( 'index-coloured', $meta['colorType'] );
- }
- function testPngRgbColour() {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- 'rgb-png.png' );
- $this->assertEquals( 'truecolour-alpha', $meta['colorType'] );
- }
- function testPngRgbNoAlphaColour() {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- 'rgb-na-png.png' );
- $this->assertEquals( 'truecolour', $meta['colorType'] );
- }
- function testPngGreyscaleColour() {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- 'greyscale-png.png' );
- $this->assertEquals( 'greyscale-alpha', $meta['colorType'] );
- }
- function testPngGreyscaleNoAlphaColour() {
- $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
- 'greyscale-na-png.png' );
- $this->assertEquals( 'greyscale', $meta['colorType'] );
- }
-
-}
diff --git a/tests/phpunit/includes/media/PNGTest.php b/tests/phpunit/includes/media/PNGTest.php
deleted file mode 100644
index fe73c9c7..00000000
--- a/tests/phpunit/includes/media/PNGTest.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-class PNGHandlerTest extends MediaWikiTestCase {
-
- public function setUp() {
- $this->filePath = __DIR__ . '/../../data/media';
- $this->backend = new FSFileBackend( array(
- 'name' => 'localtesting',
- 'lockManager' => 'nullLockManager',
- 'containerPaths' => array( 'data' => $this->filePath )
- ) );
- $this->repo = new FSRepo( array(
- 'name' => 'temp',
- 'url' => 'http://localhost/thumbtest',
- 'backend' => $this->backend
- ) );
- $this->handler = new PNGHandler();
- }
-
- public function testInvalidFile() {
- $res = $this->handler->getMetadata( null, $this->filePath . '/README' );
- $this->assertEquals( PNGHandler::BROKEN_FILE, $res );
- }
- /**
- * @param $filename String basename of the file to check
- * @param $expected boolean Expected result.
- * @dataProvider dataIsAnimated
- */
- public function testIsAnimanted( $filename, $expected ) {
- $file = $this->dataFile( $filename, 'image/png' );
- $actual = $this->handler->isAnimatedImage( $file );
- $this->assertEquals( $expected, $actual );
- }
- public function dataIsAnimated() {
- return array(
- array( 'Animated_PNG_example_bouncing_beach_ball.png', true ),
- array( '1bit-png.png', false ),
- );
- }
-
- /**
- * @param $filename String
- * @param $expected Integer Total image area
- * @dataProvider dataGetImageArea
- */
- public function testGetImageArea( $filename, $expected ) {
- $file = $this->dataFile($filename, 'image/png' );
- $actual = $this->handler->getImageArea( $file, $file->getWidth(), $file->getHeight() );
- $this->assertEquals( $expected, $actual );
- }
- public function dataGetImageArea() {
- return array(
- array( '1bit-png.png', 2500 ),
- array( 'greyscale-png.png', 2500 ),
- array( 'Png-native-test.png', 126000 ),
- array( 'Animated_PNG_example_bouncing_beach_ball.png', 10000 ),
- );
- }
-
- /**
- * @param $metadata String Serialized metadata
- * @param $expected Integer One of the class constants of PNGHandler
- * @dataProvider dataIsMetadataValid
- */
- public function testIsMetadataValid( $metadata, $expected ) {
- $actual = $this->handler->isMetadataValid( null, $metadata );
- $this->assertEquals( $expected, $actual );
- }
- public function dataIsMetadataValid() {
- return array(
- array( PNGHandler::BROKEN_FILE, PNGHandler::METADATA_GOOD ),
- array( '', PNGHandler::METADATA_BAD ),
- array( null, PNGHandler::METADATA_BAD ),
- array( 'Something invalid!', PNGHandler::METADATA_BAD ),
- 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 ),
- );
- }
-
- /**
- * @param $filename String
- * @param $expected String Serialized array
- * @dataProvider dataGetMetadata
- */
- public function testGetMetadata( $filename, $expected ) {
- $file = $this->dataFile( $filename, 'image/png' );
- $actual = $this->handler->getMetadata( $file, "$this->filePath/$filename" );
-// $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
- $this->assertEquals( ( $expected ), ( $actual ) );
- }
- public function dataGetMetadata() {
- return array(
- 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;}}' ),
- );
- }
-
- private function dataFile( $name, $type ) {
- return new UnregisteredLocalFile( false, $this->repo,
- "mwstore://localtesting/data/$name", $type );
- }
-}
diff --git a/tests/phpunit/includes/media/SVGMetadataExtractorTest.php b/tests/phpunit/includes/media/SVGMetadataExtractorTest.php
deleted file mode 100644
index 2116554e..00000000
--- a/tests/phpunit/includes/media/SVGMetadataExtractorTest.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-
-class SVGMetadataExtractorTest extends MediaWikiTestCase {
-
- function setUp() {
- AutoLoader::loadClass( 'SVGMetadataExtractorTest' );
- }
-
- /**
- * @dataProvider providerSvgFiles
- */
- function testGetMetadata( $infile, $expected ) {
- $this->assertMetadata( $infile, $expected );
- }
-
- /**
- * @dataProvider providerSvgFilesWithXMLMetadata
- */
- function testGetXMLMetadata( $infile, $expected ) {
- $r = new XMLReader();
- if( !method_exists( $r, 'readInnerXML' ) ) {
- $this->markTestSkipped( 'XMLReader::readInnerXML() does not exist (libxml >2.6.20 needed).' );
- return;
- }
- $this->assertMetadata( $infile, $expected );
- }
-
- function assertMetadata( $infile, $expected ) {
- try {
- $data = SVGMetadataExtractor::getMetadata( $infile );
- $this->assertEquals( $expected, $data, 'SVG metadata extraction test' );
- } catch ( MWException $e ) {
- if ( $expected === false ) {
- $this->assertTrue( true, 'SVG metadata extracted test (expected failure)' );
- } else {
- throw $e;
- }
- }
- }
-
- function providerSvgFiles() {
- $base = __DIR__ . '/../../data/media';
- return array(
- array(
- "$base/Wikimedia-logo.svg",
- array(
- 'width' => 1024,
- 'height' => 1024,
- 'originalWidth' => '1024',
- 'originalHeight' => '1024',
- )
- ),
- array(
- "$base/QA_icon.svg",
- array(
- 'width' => 60,
- 'height' => 60,
- 'originalWidth' => '60',
- 'originalHeight' => '60',
- )
- ),
- array(
- "$base/Gtk-media-play-ltr.svg",
- array(
- 'width' => 60,
- 'height' => 60,
- 'originalWidth' => '60.0000000',
- 'originalHeight' => '60.0000000',
- )
- ),
- array(
- "$base/Toll_Texas_1.svg",
- // This file triggered bug 31719, needs entity expansion in the xmlns checks
- array(
- 'width' => 385,
- 'height' => 385,
- 'originalWidth' => '385',
- 'originalHeight' => '385.0004883',
- )
- )
- );
- }
-
- function providerSvgFilesWithXMLMetadata() {
- $base = __DIR__ . '/../../data/media';
- $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>';
- $metadata = str_replace( "\r", '', $metadata ); // Windows compat
- return array(
- array(
- "$base/US_states_by_total_state_tax_revenue.svg",
- array(
- 'height' => 593,
- 'metadata' => $metadata,
- 'width' => 959,
- 'originalWidth' => '958.69',
- 'originalHeight' => '592.78998',
- )
- ),
- );
- }
-}
-
diff --git a/tests/phpunit/includes/media/TiffTest.php b/tests/phpunit/includes/media/TiffTest.php
deleted file mode 100644
index 4c79f66c..00000000
--- a/tests/phpunit/includes/media/TiffTest.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-class TiffTest extends MediaWikiTestCase {
-
- public function setUp() {
- global $wgShowEXIF;
- $this->showExif = $wgShowEXIF;
- $wgShowEXIF = true;
- $this->filePath = __DIR__ . '/../../data/media/';
- $this->handler = new TiffHandler;
- }
-
- public function tearDown() {
- global $wgShowEXIF;
- $wgShowEXIF = $this->showExif;
- }
-
- public function testInvalidFile() {
- if ( !wfDl( 'exif' ) ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
- $res = $this->handler->getMetadata( null, $this->filePath . 'README' );
- $this->assertEquals( ExifBitmapHandler::BROKEN_FILE, $res );
- }
-
- public function testTiffMetadataExtraction() {
- if ( !wfDl( 'exif' ) ) {
- $this->markTestIncomplete( "This test needs the exif extension." );
- }
- $res = $this->handler->getMetadata( null, $this->filePath . 'test.tiff' );
- $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;}';
- // Re-unserialize in case there are subtle differences between how versions
- // of php serialize stuff.
- $this->assertEquals( unserialize( $expected ), unserialize( $res ) );
- }
-}
diff --git a/tests/phpunit/includes/media/XMPTest.php b/tests/phpunit/includes/media/XMPTest.php
deleted file mode 100644
index 8198d3b0..00000000
--- a/tests/phpunit/includes/media/XMPTest.php
+++ /dev/null
@@ -1,158 +0,0 @@
-<?php
-class XMPTest extends MediaWikiTestCase {
-
- function setUp() {
- if ( !wfDl( 'xml' ) ) {
- $this->markTestSkipped( 'Requires libxml to do XMP parsing' );
- }
- }
-
- /**
- * Put XMP in, compare what comes out...
- *
- * @param $xmp String the actual xml data.
- * @param $expected Array expected result of parsing the xmp.
- * @param $info String Short sentence on what's being tested.
- *
- * @dataProvider dataXMPParse
- */
- public function testXMPParse( $xmp, $expected, $info ) {
- if ( !is_string( $xmp ) || !is_array( $expected ) ) {
- throw new Exception( "Invalid data provided to " . __METHOD__ );
- }
- $reader = new XMPReader;
- $reader->parse( $xmp );
- $this->assertEquals( $expected, $reader->getResults(), $info, 0.0000000001 );
- }
-
- public function dataXMPParse() {
- $xmpPath = __DIR__ . '/../../data/xmp/' ;
- $data = array();
-
- // $xmpFiles format: array of arrays with first arg file base name,
- // with the actual file having .xmp on the end for the xmp
- // and .result.php on the end for a php file containing the result
- // array. Second argument is some info on what's being tested.
- $xmpFiles = array(
- array( '1', 'parseType=Resource test' ),
- array( '2', 'Structure with mixed attribute and element props' ),
- array( '3', 'Extra qualifiers (that should be ignored)' ),
- array( '3-invalid', 'Test ignoring qualifiers that look like normal props' ),
- array( '4', 'Flash as qualifier' ),
- array( '5', 'Flash as qualifier 2' ),
- array( '6', 'Multiple rdf:Description' ),
- array( '7', 'Generic test of several property types' ),
- array( 'flash', 'Test of Flash property' ),
- array( 'invalid-child-not-struct', 'Test child props not in struct or ignored' ),
- array( 'no-recognized-props', 'Test namespace and no recognized props' ),
- array( 'no-namespace', 'Test non-namespaced attributes are ignored' ),
- array( 'bag-for-seq', "Allow bag's instead of seq's. (bug 27105)" ),
- array( 'utf16BE', 'UTF-16BE encoding' ),
- array( 'utf16LE', 'UTF-16LE encoding' ),
- array( 'utf32BE', 'UTF-32BE encoding' ),
- array( 'utf32LE', 'UTF-32LE encoding' ),
- array( 'xmpExt', 'Extended XMP missing second part' ),
- array( 'gps', 'Handling of exif GPS parameters in XMP' ),
- );
- foreach( $xmpFiles as $file ) {
- $xmp = file_get_contents( $xmpPath . $file[0] . '.xmp' );
- // I'm not sure if this is the best way to handle getting the
- // result array, but it seems kind of big to put directly in the test
- // file.
- $result = null;
- include( $xmpPath . $file[0] . '.result.php' );
- $data[] = array( $xmp, $result, '[' . $file[0] . '.xmp] ' . $file[1] );
- }
- return $data;
- }
-
- /** Test ExtendedXMP block support. (Used when the XMP has to be split
- * over multiple jpeg segments, due to 64k size limit on jpeg segments.
- *
- * @todo This is based on what the standard says. Need to find a real
- * world example file to double check the support for this is right.
- */
- function testExtendedXMP() {
- $xmpPath = __DIR__ . '/../../data/xmp/';
- $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
- $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
-
- $md5sum = '28C74E0AC2D796886759006FBE2E57B7'; // of xmpExt2.xmp
- $length = pack( 'N', strlen( $extendedXMP ) );
- $offset = pack( 'N', 0 );
- $extendedPacket = $md5sum . $length . $offset . $extendedXMP;
-
- $reader = new XMPReader();
- $reader->parse( $standardXMP );
- $reader->parseExtended( $extendedPacket );
- $actual = $reader->getResults();
-
- $expected = array( 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => 9,
- 'FNumber' => '2/10',
- )
- );
-
- $this->assertEquals( $expected, $actual );
- }
-
- /**
- * This test has an extended XMP block with a wrong guid (md5sum)
- * and thus should only return the StandardXMP, not the ExtendedXMP.
- */
- function testExtendedXMPWithWrongGUID() {
- $xmpPath = __DIR__ . '/../../data/xmp/';
- $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
- $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
-
- $md5sum = '28C74E0AC2D796886759006FBE2E57B9'; // Note last digit.
- $length = pack( 'N', strlen( $extendedXMP ) );
- $offset = pack( 'N', 0 );
- $extendedPacket = $md5sum . $length . $offset . $extendedXMP;
-
- $reader = new XMPReader();
- $reader->parse( $standardXMP );
- $reader->parseExtended( $extendedPacket );
- $actual = $reader->getResults();
-
- $expected = array( 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => 9,
- )
- );
-
- $this->assertEquals( $expected, $actual );
- }
- /**
- * Have a high offset to simulate a missing packet,
- * which should cause it to ignore the ExtendedXMP packet.
- */
- function testExtendedXMPMissingPacket() {
- $xmpPath = __DIR__ . '/../../data/xmp/';
- $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
- $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
-
- $md5sum = '28C74E0AC2D796886759006FBE2E57B7'; // of xmpExt2.xmp
- $length = pack( 'N', strlen( $extendedXMP ) );
- $offset = pack( 'N', 2048 );
- $extendedPacket = $md5sum . $length . $offset . $extendedXMP;
-
- $reader = new XMPReader();
- $reader->parse( $standardXMP );
- $reader->parseExtended( $extendedPacket );
- $actual = $reader->getResults();
-
- $expected = array( 'xmp-exif' =>
- array(
- 'DigitalZoomRatio' => '0/10',
- 'Flash' => 9,
- )
- );
-
- $this->assertEquals( $expected, $actual );
- }
-
-}
diff --git a/tests/phpunit/includes/media/XMPValidateTest.php b/tests/phpunit/includes/media/XMPValidateTest.php
deleted file mode 100644
index e2bb8d8d..00000000
--- a/tests/phpunit/includes/media/XMPValidateTest.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-class XMPValidateTest extends MediaWikiTestCase {
-
- /**
- * @dataProvider providerDate
- */
- function testValidateDate( $value, $expected ) {
- // The method should modify $value.
- XMPValidate::validateDate( array(), $value, true );
- $this->assertEquals( $expected, $value );
- }
-
- function providerDate() {
- /* For reference valid date formats are:
- * YYYY
- * YYYY-MM
- * YYYY-MM-DD
- * YYYY-MM-DDThh:mmTZD
- * YYYY-MM-DDThh:mm:ssTZD
- * YYYY-MM-DDThh:mm:ss.sTZD
- * (Time zone is optional)
- */
- return array(
- array( '1992', '1992' ),
- array( '1992-04', '1992:04' ),
- array( '1992-02-01', '1992:02:01' ),
- array( '2011-09-29', '2011:09:29' ),
- array( '1982-12-15T20:12', '1982:12:15 20:12' ),
- array( '1982-12-15T20:12Z', '1982:12:15 20:12' ),
- array( '1982-12-15T20:12+02:30', '1982:12:15 22:42' ),
- array( '1982-12-15T01:12-02:30', '1982:12:14 22:42' ),
- array( '1982-12-15T20:12:11', '1982:12:15 20:12:11' ),
- array( '1982-12-15T20:12:11Z', '1982:12:15 20:12:11' ),
- array( '1982-12-15T20:12:11+01:10', '1982:12:15 21:22:11' ),
- array( '2045-12-15T20:12:11', '2045:12:15 20:12:11' ),
- array( '1867-06-01T15:00:00', '1867:06:01 15:00:00' ),
- /* some invalid ones */
- array( '2001--12', null ),
- array( '2001-5-12', null ),
- array( '2001-5-12TZ', null ),
- array( '2001-05-12T15', null ),
- array( '2001-12T15:13', null ),
- );
-
- }
-
-}
diff --git a/tests/phpunit/includes/mobile/DeviceDetectionTest.php b/tests/phpunit/includes/mobile/DeviceDetectionTest.php
deleted file mode 100644
index 0e156532..00000000
--- a/tests/phpunit/includes/mobile/DeviceDetectionTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/**
- * @group Mobile
- */
- class DeviceDetectionTest extends MediaWikiTestCase {
-
- /**
- * @dataProvider provideTestFormatName
- */
- public function testFormatName( $format, $userAgent ) {
- $detector = new DeviceDetection();
- $this->assertEquals( $format, $detector->detectFormatName( $userAgent ) );
- }
-
- public function provideTestFormatName() {
- return array(
- array( 'android', 'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' ),
- array( 'iphone2', 'Mozilla/5.0 (ipod: U;CPU iPhone OS 2_2 like Mac OS X: es_es) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3' ),
- array( 'iphone', 'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3' ),
- array( 'nokia', 'Mozilla/5.0 (SymbianOS/9.1; U; [en]; SymbianOS/91 Series60/3.0) AppleWebKit/413 (KHTML, like Gecko) Safari/413' ),
- array( 'palm_pre', 'Mozilla/5.0 (webOS/1.0; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/1.0' ),
- array( 'wii', 'Opera/9.00 (Nintendo Wii; U; ; 1309-9; en)' ),
- array( 'operamini', 'Opera/9.50 (J2ME/MIDP; Opera Mini/4.0.10031/298; U; en)' ),
- array( 'operamobile', 'Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/1718; U; en)' ),
- array( 'kindle', 'Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.3 Kindle/1.0 (screen 600x800)' ),
- array( 'kindle2', 'Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.0 (screen 824x1200; rotate)' ),
- array( 'capable', 'Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1' ),
- array( 'netfront', 'Mozilla/4.08 (Windows; Mobile Content Viewer/1.0) NetFront/3.2' ),
- array( 'wap2', 'SonyEricssonK608i/R2L/SN356841000828910 Browser/SEMC-Browser/4.2 Profile/MIDP-2.0 Configuration/CLDC-1.1' ),
- array( 'wap2', 'NokiaN73-2/3.0-630.0.2 Series60/3.0 Profile/MIDP-2.0 Configuration/CLDC-1.1' ),
- array( 'psp', 'Mozilla/4.0 (PSP (PlayStation Portable); 2.00)' ),
- array( 'ps3', 'Mozilla/5.0 (PLAYSTATION 3; 1.00)' ),
- array( 'ie', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' ),
- array( 'ie', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)' ),
- array( 'blackberry', 'BlackBerry9300/5.0.0.716 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/133' ),
- array( 'blackberry-lt5', 'BlackBerry7250/4.0.0 Profile/MIDP-2.0 Configuration/CLDC-1.1' ),
- );
- }
-}
diff --git a/tests/phpunit/includes/normal/CleanUpTest.php b/tests/phpunit/includes/normal/CleanUpTest.php
deleted file mode 100644
index d5ad18d8..00000000
--- a/tests/phpunit/includes/normal/CleanUpTest.php
+++ /dev/null
@@ -1,382 +0,0 @@
-<?php
-/**
- * Tests for UtfNormal::cleanUp() function.
- *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>
- * http://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Additional tests for UtfNormal::cleanUp() function, inclusion
- * regression checks for known problems.
- * Requires PHPUnit.
- *
- * @ingroup UtfNormal
- */
-class CleanUpTest extends MediaWikiTestCase {
- /** @todo document */
- function testAscii() {
- $text = 'This is plain ASCII text.';
- $this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
- }
-
- /** @todo document */
- function testNull() {
- $text = "a \x00 null";
- $expect = "a \xef\xbf\xbd null";
- $this->assertEquals(
- bin2hex( $expect ),
- bin2hex( UtfNormal::cleanUp( $text ) ) );
- }
-
- /** @todo document */
- function testLatin() {
- $text = "L'\xc3\xa9cole";
- $this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
- }
-
- /** @todo document */
- function testLatinNormal() {
- $text = "L'e\xcc\x81cole";
- $expect = "L'\xc3\xa9cole";
- $this->assertEquals( $expect, UtfNormal::cleanUp( $text ) );
- }
-
- /**
- * This test is *very* expensive!
- * @todo document
- */
- function XtestAllChars() {
- $rep = UTF8_REPLACEMENT;
- for( $i = 0x0; $i < UNICODE_MAX; $i++ ) {
- $char = codepointToUtf8( $i );
- $clean = UtfNormal::cleanUp( $char );
- $x = sprintf( "%04X", $i );
- if( $i % 0x1000 == 0 ) echo "U+$x\n";
- if( $i == 0x0009 ||
- $i == 0x000a ||
- $i == 0x000d ||
- ($i > 0x001f && $i < UNICODE_SURROGATE_FIRST) ||
- ($i > UNICODE_SURROGATE_LAST && $i < 0xfffe ) ||
- ($i > 0xffff && $i <= UNICODE_MAX ) ) {
- if( isset( UtfNormal::$utfCanonicalComp[$char] ) || isset( UtfNormal::$utfCanonicalDecomp[$char] ) ) {
- $comp = UtfNormal::NFC( $char );
- $this->assertEquals(
- bin2hex( $comp ),
- bin2hex( $clean ),
- "U+$x should be decomposed" );
- } else {
- $this->assertEquals(
- bin2hex( $char ),
- bin2hex( $clean ),
- "U+$x should be intact" );
- }
- } else {
- $this->assertEquals( bin2hex( $rep ), bin2hex( $clean ), $x );
- }
- }
- }
-
- /** @todo document */
- function testAllBytes() {
- $this->doTestBytes( '', '' );
- $this->doTestBytes( 'x', '' );
- $this->doTestBytes( '', 'x' );
- $this->doTestBytes( 'x', 'x' );
- }
-
- /** @todo document */
- function doTestBytes( $head, $tail ) {
- for( $i = 0x0; $i < 256; $i++ ) {
- $char = $head . chr( $i ) . $tail;
- $clean = UtfNormal::cleanUp( $char );
- $x = sprintf( "%02X", $i );
- if( $i == 0x0009 ||
- $i == 0x000a ||
- $i == 0x000d ||
- ($i > 0x001f && $i < 0x80) ) {
- $this->assertEquals(
- bin2hex( $char ),
- bin2hex( $clean ),
- "ASCII byte $x should be intact" );
- if( $char != $clean ) return;
- } else {
- $norm = $head . UTF8_REPLACEMENT . $tail;
- $this->assertEquals(
- bin2hex( $norm ),
- bin2hex( $clean ),
- "Forbidden byte $x should be rejected" );
- if( $norm != $clean ) return;
- }
- }
- }
-
- /** @todo document */
- function testDoubleBytes() {
- $this->doTestDoubleBytes( '', '' );
- $this->doTestDoubleBytes( 'x', '' );
- $this->doTestDoubleBytes( '', 'x' );
- $this->doTestDoubleBytes( 'x', 'x' );
- }
-
- /**
- * @todo document
- */
- function doTestDoubleBytes( $head, $tail ) {
- for( $first = 0xc0; $first < 0x100; $first+=2 ) {
- for( $second = 0x80; $second < 0x100; $second+=2 ) {
- $char = $head . chr( $first ) . chr( $second ) . $tail;
- $clean = UtfNormal::cleanUp( $char );
- $x = sprintf( "%02X,%02X", $first, $second );
- if( $first > 0xc1 &&
- $first < 0xe0 &&
- $second < 0xc0 ) {
- $norm = UtfNormal::NFC( $char );
- $this->assertEquals(
- bin2hex( $norm ),
- bin2hex( $clean ),
- "Pair $x should be intact" );
- if( $norm != $clean ) return;
- } elseif( $first > 0xfd || $second > 0xbf ) {
- # fe and ff are not legal head bytes -- expect two replacement chars
- $norm = $head . UTF8_REPLACEMENT . UTF8_REPLACEMENT . $tail;
- $this->assertEquals(
- bin2hex( $norm ),
- bin2hex( $clean ),
- "Forbidden pair $x should be rejected" );
- if( $norm != $clean ) return;
- } else {
- $norm = $head . UTF8_REPLACEMENT . $tail;
- $this->assertEquals(
- bin2hex( $norm ),
- bin2hex( $clean ),
- "Forbidden pair $x should be rejected" );
- if( $norm != $clean ) return;
- }
- }
- }
- }
-
- /** @todo document */
- function testTripleBytes() {
- $this->doTestTripleBytes( '', '' );
- $this->doTestTripleBytes( 'x', '' );
- $this->doTestTripleBytes( '', 'x' );
- $this->doTestTripleBytes( 'x', 'x' );
- }
-
- /** @todo document */
- function doTestTripleBytes( $head, $tail ) {
- for( $first = 0xc0; $first < 0x100; $first+=2 ) {
- for( $second = 0x80; $second < 0x100; $second+=2 ) {
- #for( $third = 0x80; $third < 0x100; $third++ ) {
- for( $third = 0x80; $third < 0x81; $third++ ) {
- $char = $head . chr( $first ) . chr( $second ) . chr( $third ) . $tail;
- $clean = UtfNormal::cleanUp( $char );
- $x = sprintf( "%02X,%02X,%02X", $first, $second, $third );
- if( $first >= 0xe0 &&
- $first < 0xf0 &&
- $second < 0xc0 &&
- $third < 0xc0 ) {
- if( $first == 0xe0 && $second < 0xa0 ) {
- $this->assertEquals(
- bin2hex( $head . UTF8_REPLACEMENT . $tail ),
- bin2hex( $clean ),
- "Overlong triplet $x should be rejected" );
- } elseif( $first == 0xed &&
- ( chr( $first ) . chr( $second ) . chr( $third )) >= UTF8_SURROGATE_FIRST ) {
- $this->assertEquals(
- bin2hex( $head . UTF8_REPLACEMENT . $tail ),
- bin2hex( $clean ),
- "Surrogate triplet $x should be rejected" );
- } else {
- $this->assertEquals(
- bin2hex( UtfNormal::NFC( $char ) ),
- bin2hex( $clean ),
- "Triplet $x should be intact" );
- }
- } elseif( $first > 0xc1 && $first < 0xe0 && $second < 0xc0 ) {
- $this->assertEquals(
- 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( $clean ),
- "Broken head + valid 2-byte $x" );
- } elseif( ( $first > 0xfd || $second > 0xfd ) &&
- ( ( $second > 0xbf && $third > 0xbf ) ||
- ( $second < 0xc0 && $third < 0xc0 ) ||
- ( $second > 0xfd ) ||
- ( $third > 0xfd ) ) ) {
- # fe and ff are not legal head bytes -- expect three replacement chars
- $this->assertEquals(
- bin2hex( $head . UTF8_REPLACEMENT . UTF8_REPLACEMENT . UTF8_REPLACEMENT . $tail ),
- bin2hex( $clean ),
- "Forbidden triplet $x should be rejected" );
- } elseif( $first > 0xc2 && $second < 0xc0 && $third < 0xc0 ) {
- $this->assertEquals(
- bin2hex( $head . UTF8_REPLACEMENT . $tail ),
- bin2hex( $clean ),
- "Forbidden triplet $x should be rejected" );
- } else {
- $this->assertEquals(
- bin2hex( $head . UTF8_REPLACEMENT . UTF8_REPLACEMENT . $tail ),
- bin2hex( $clean ),
- "Forbidden triplet $x should be rejected" );
- }
- }
- }
- }
- }
-
- /** @todo document */
- function testChunkRegression() {
- # Check for regression against a chunking bug
- $text = "\x46\x55\xb8" .
- "\xdc\x96" .
- "\xee" .
- "\xe7" .
- "\x44" .
- "\xaa" .
- "\x2f\x25";
- $expect = "\x46\x55\xef\xbf\xbd" .
- "\xdc\x96" .
- "\xef\xbf\xbd" .
- "\xef\xbf\xbd" .
- "\x44" .
- "\xef\xbf\xbd" .
- "\x2f\x25";
-
- $this->assertEquals(
- bin2hex( $expect ),
- bin2hex( UtfNormal::cleanUp( $text ) ) );
- }
-
- /** @todo document */
- function testInterposeRegression() {
- $text = "\x4e\x30" .
- "\xb1" . # bad tail
- "\x3a" .
- "\x92" . # bad tail
- "\x62\x3a" .
- "\x84" . # bad tail
- "\x43" .
- "\xc6" . # bad head
- "\x3f" .
- "\x92" . # bad tail
- "\xad" . # bad tail
- "\x7d" .
- "\xd9\x95";
-
- $expect = "\x4e\x30" .
- "\xef\xbf\xbd" .
- "\x3a" .
- "\xef\xbf\xbd" .
- "\x62\x3a" .
- "\xef\xbf\xbd" .
- "\x43" .
- "\xef\xbf\xbd" .
- "\x3f" .
- "\xef\xbf\xbd" .
- "\xef\xbf\xbd" .
- "\x7d" .
- "\xd9\x95";
-
- $this->assertEquals(
- bin2hex( $expect ),
- bin2hex( UtfNormal::cleanUp( $text ) ) );
- }
-
- /** @todo document */
- function testOverlongRegression() {
- $text = "\x67" .
- "\x1a" . # forbidden ascii
- "\xea" . # bad head
- "\xc1\xa6" . # overlong sequence
- "\xad" . # bad tail
- "\x1c" . # forbidden ascii
- "\xb0" . # bad tail
- "\x3c" .
- "\x9e"; # bad tail
- $expect = "\x67" .
- "\xef\xbf\xbd" .
- "\xef\xbf\xbd" .
- "\xef\xbf\xbd" .
- "\xef\xbf\xbd" .
- "\xef\xbf\xbd" .
- "\xef\xbf\xbd" .
- "\x3c" .
- "\xef\xbf\xbd";
- $this->assertEquals(
- bin2hex( $expect ),
- bin2hex( UtfNormal::cleanUp( $text ) ) );
- }
-
- /** @todo document */
- function testSurrogateRegression() {
- $text = "\xed\xb4\x96" . # surrogate 0xDD16
- "\x83" . # bad tail
- "\xb4" . # bad tail
- "\xac"; # bad head
- $expect = "\xef\xbf\xbd" .
- "\xef\xbf\xbd" .
- "\xef\xbf\xbd" .
- "\xef\xbf\xbd";
- $this->assertEquals(
- bin2hex( $expect ),
- bin2hex( UtfNormal::cleanUp( $text ) ) );
- }
-
- /** @todo document */
- function testBomRegression() {
- $text = "\xef\xbf\xbe" . # U+FFFE, illegal char
- "\xb2" . # bad tail
- "\xef" . # bad head
- "\x59";
- $expect = "\xef\xbf\xbd" .
- "\xef\xbf\xbd" .
- "\xef\xbf\xbd" .
- "\x59";
- $this->assertEquals(
- bin2hex( $expect ),
- bin2hex( UtfNormal::cleanUp( $text ) ) );
- }
-
- /** @todo document */
- function testForbiddenRegression() {
- $text = "\xef\xbf\xbf"; # U+FFFF, illegal char
- $expect = "\xef\xbf\xbd";
- $this->assertEquals(
- bin2hex( $expect ),
- bin2hex( UtfNormal::cleanUp( $text ) ) );
- }
-
- /** @todo document */
- function testHangulRegression() {
- $text = "\xed\x9c\xaf" . # Hangul char
- "\xe1\x87\x81"; # followed by another final jamo
- $expect = $text; # Should *not* change.
- $this->assertEquals(
- bin2hex( $expect ),
- bin2hex( UtfNormal::cleanUp( $text ) ) );
- }
-}
diff --git a/tests/phpunit/includes/parser/MagicVariableTest.php b/tests/phpunit/includes/parser/MagicVariableTest.php
deleted file mode 100644
index 31645313..00000000
--- a/tests/phpunit/includes/parser/MagicVariableTest.php
+++ /dev/null
@@ -1,201 +0,0 @@
-<?php
-/**
- * This file is intended to test magic variables in the parser
- * It was inspired by Raymond & Matěj Grabovský commenting about r66200
- *
- * As of february 2011, it only tests some revisions and date related
- * magic variables.
- *
- * @author Antoine Musso
- * @copyright Copyright © 2011, Antoine Musso
- * @file
- */
-
-/** */
-class MagicVariableTest extends MediaWikiTestCase {
- /** Will contains a parser object*/
- private $testParser = null;
-
- /**
- * An array of magicword returned as type integer by the parser
- * They are usually returned as a string for i18n since we support
- * persan numbers for example, but some magic explicitly return
- * them as integer.
- * @see MagicVariableTest::assertMagic()
- */
- private $expectedAsInteger = array(
- 'revisionday',
- 'revisionmonth1',
- );
-
- /** setup a basic parser object */
- function setUp() {
- global $wgContLang;
- $wgContLang = Language::factory( 'en' );
-
- $this->testParser = new Parser();
- $this->testParser->Options( new ParserOptions() );
-
- # initialize parser output
- $this->testParser->clearState();
-
- # 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)
-
- $this->testParser->setTitle( $title );
- }
-
- /** destroy parser (TODO: is it really neded?)*/
- function tearDown() {
- unset( $this->testParser );
- }
-
- ############### TESTS #############################################
- # @todo FIXME:
- # - those got copy pasted, we can probably make them cleaner
- # - tests are lacking useful messages
-
- # day
-
- /** @dataProvider MediaWikiProvide::Days */
- function testCurrentdayIsUnPadded( $day ) {
- $this->assertUnPadded( 'currentday', $day );
- }
- /** @dataProvider MediaWikiProvide::Days */
- function testCurrentdaytwoIsZeroPadded( $day ) {
- $this->assertZeroPadded( 'currentday2', $day );
- }
- /** @dataProvider MediaWikiProvide::Days */
- function testLocaldayIsUnPadded( $day ) {
- $this->assertUnPadded( 'localday', $day );
- }
- /** @dataProvider MediaWikiProvide::Days */
- function testLocaldaytwoIsZeroPadded( $day ) {
- $this->assertZeroPadded( 'localday2', $day );
- }
-
- # month
-
- /** @dataProvider MediaWikiProvide::Months */
- function testCurrentmonthIsZeroPadded( $month ) {
- $this->assertZeroPadded( 'currentmonth', $month );
- }
- /** @dataProvider MediaWikiProvide::Months */
- function testCurrentmonthoneIsUnPadded( $month ) {
- $this->assertUnPadded( 'currentmonth1', $month );
- }
- /** @dataProvider MediaWikiProvide::Months */
- function testLocalmonthIsZeroPadded( $month ) {
- $this->assertZeroPadded( 'localmonth', $month );
- }
- /** @dataProvider MediaWikiProvide::Months */
- function testLocalmonthoneIsUnPadded( $month ) {
- $this->assertUnPadded( 'localmonth1', $month );
- }
-
-
- # revision day
-
- /** @dataProvider MediaWikiProvide::Days */
- function testRevisiondayIsUnPadded( $day ) {
- $this->assertUnPadded( 'revisionday', $day );
- }
- /** @dataProvider MediaWikiProvide::Days */
- function testRevisiondaytwoIsZeroPadded( $day ) {
- $this->assertZeroPadded( 'revisionday2', $day );
- }
-
- # revision month
-
- /** @dataProvider MediaWikiProvide::Months */
- function testRevisionmonthIsZeroPadded( $month ) {
- $this->assertZeroPadded( 'revisionmonth', $month );
- }
- /** @dataProvider MediaWikiProvide::Months */
- function testRevisionmonthoneIsUnPadded( $month ) {
- $this->assertUnPadded( 'revisionmonth1', $month );
- }
-
- /**
- * Rough tests for {{SERVERNAME}} magic word
- * Bug 31176
- */
- function testServernameFromDifferentProtocols() {
- global $wgServer;
- $saved_wgServer= $wgServer;
-
- $wgServer = 'http://localhost/';
- $this->assertMagic( 'localhost', 'servername' );
- $wgServer = 'https://localhost/';
- $this->assertMagic( 'localhost', 'servername' );
- $wgServer = '//localhost/'; # bug 31176
- $this->assertMagic( 'localhost', 'servername' );
-
- $wgServer = $saved_wgServer;
- }
-
- ############### HELPERS ############################################
-
- /** assertion helper expecting a magic output which is zero padded */
- PUBLIC function assertZeroPadded( $magic, $value ) {
- $this->assertMagicPadding( $magic, $value, '%02d' );
- }
-
- /** assertion helper expecting a magic output which is unpadded */
- PUBLIC function assertUnPadded( $magic, $value ) {
- $this->assertMagicPadding( $magic, $value, '%d' );
- }
-
- /**
- * Main assertion helper for magic variables padding
- * @param $magic string Magic variable name
- * @param $value mixed Month or day
- * @param $format string sprintf format for $value
- */
- private function assertMagicPadding( $magic, $value, $format ) {
- # Initialize parser timestamp as year 2010 at 12h34 56s.
- # month and day are given by the caller ($value). Month < 12!
- if( $value > 12 ) { $month = $value % 12; }
- else { $month = $value; }
-
- $this->setParserTS(
- sprintf( '2010%02d%02d123456', $month, $value )
- );
-
- # please keep the following commented line of code. It helps debugging.
- //print "\nDEBUG (value $value):" . sprintf( '2010%02d%02d123456', $value, $value ) . "\n";
-
- # format expectation and test it
- $expected = sprintf( $format, $value );
- $this->assertMagic( $expected, $magic );
- }
-
- /** helper to set the parser timestamp and revision timestamp */
- private function setParserTS( $ts ) {
- $this->testParser->Options()->setTimestamp( $ts );
- $this->testParser->mRevisionTimestamp = $ts;
- }
-
- /**
- * Assertion helper to test a magic variable output
- */
- private function assertMagic( $expected, $magic ) {
- if( in_array( $magic, $this->expectedAsInteger ) ) {
- $expected = (int) $expected;
- }
-
- # Generate a message for the assertion
- $msg = sprintf( "Magic %s should be <%s:%s>",
- $magic,
- $expected,
- gettype( $expected )
- );
-
- $this->assertSame(
- $expected,
- $this->testParser->getVariableValue( $magic ),
- $msg
- );
- }
-}
diff --git a/tests/phpunit/includes/parser/MediaWikiParserTest.php b/tests/phpunit/includes/parser/MediaWikiParserTest.php
deleted file mode 100644
index 6a6fded1..00000000
--- a/tests/phpunit/includes/parser/MediaWikiParserTest.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-require_once( __DIR__ . '/NewParserTest.php' );
-
-/**
- * The UnitTest must be either a class that inherits from MediaWikiTestCase
- * or a class that provides a public static suite() method which returns
- * an PHPUnit_Framework_Test object
- *
- * @group Parser
- * @group Database
- */
-class MediaWikiParserTest {
-
- public static function suite() {
- global $wgParserTestFiles;
-
- $suite = new PHPUnit_Framework_TestSuite;
-
- foreach ( $wgParserTestFiles as $filename ) {
- $testsName = basename( $filename, '.txt' );
- /* This used to be ucfirst( basename( dirname( $filename ) ) )
- * and then was ucfirst( basename( $filename, '.txt' )
- * but that didn't work with names like foo.tests.txt
- */
- $className = str_replace( '.', '_', ucfirst( basename( $filename, '.txt' ) ) );
-
- eval( "/** @group Database\n@group Parser\n*/ class $className extends NewParserTest { protected \$file = '" . strtr( $filename, array( "'" => "\\'", '\\' => '\\\\' ) ) . "'; } " );
-
- $parserTester = new $className( $testsName );
- $suite->addTestSuite( new ReflectionClass ( $parserTester ) );
- }
-
-
- return $suite;
- }
-}
diff --git a/tests/phpunit/includes/parser/NewParserTest.php b/tests/phpunit/includes/parser/NewParserTest.php
deleted file mode 100644
index 69a96e66..00000000
--- a/tests/phpunit/includes/parser/NewParserTest.php
+++ /dev/null
@@ -1,895 +0,0 @@
-<?php
-
-/**
- * Although marked as a stub, can work independently.
- *
- * @group Database
- * @group Parser
- * @group Stub
- */
-class NewParserTest extends MediaWikiTestCase {
- static protected $articles = array(); // Array of test articles defined by the tests
- /* The dataProvider is run on a different instance than the test, so it must be static
- * When running tests from several files, all tests will see all articles.
- */
- static protected $backendToUse;
-
- public $keepUploads = false;
- public $runDisabled = false;
- public $regex = '';
- public $showProgress = true;
- public $savedInitialGlobals = array();
- public $savedWeirdGlobals = array();
- public $savedGlobals = array();
- public $hooks = array();
- public $functionHooks = array();
-
- //Fuzz test
- public $maxFuzzTestLength = 300;
- public $fuzzSeed = 0;
- public $memoryLimit = 50;
-
- protected $file = false;
-
- function setUp() {
- global $wgContLang, $wgNamespaceProtection, $wgNamespaceAliases;
- global $wgHooks, $IP;
- $wgContLang = Language::factory( 'en' );
-
- //Setup CLI arguments
- if ( $this->getCliArg( 'regex=' ) ) {
- $this->regex = $this->getCliArg( 'regex=' );
- } else {
- # Matches anything
- $this->regex = '';
- }
-
- $this->keepUploads = $this->getCliArg( 'keep-uploads' );
-
- $tmpGlobals = array();
-
- $tmpGlobals['wgScript'] = '/index.php';
- $tmpGlobals['wgScriptPath'] = '/';
- $tmpGlobals['wgArticlePath'] = '/wiki/$1';
- $tmpGlobals['wgStyleSheetPath'] = '/skins';
- $tmpGlobals['wgStylePath'] = '/skins';
- $tmpGlobals['wgThumbnailScriptPath'] = false;
- $tmpGlobals['wgLocalFileRepo'] = array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'url' => 'http://example.com/images',
- 'hashLevels' => 2,
- 'transformVia404' => false,
- 'backend' => 'local-backend'
- );
- $tmpGlobals['wgForeignFileRepos'] = array();
- $tmpGlobals['wgEnableParserCache'] = false;
- $tmpGlobals['wgHooks'] = $wgHooks;
- $tmpGlobals['wgDeferredUpdateList'] = array();
- $tmpGlobals['wgMemc'] = wfGetMainCache();
- $tmpGlobals['messageMemc'] = wfGetMessageCacheStorage();
- $tmpGlobals['parserMemc'] = wfGetParserCacheStorage();
-
- // $tmpGlobals['wgContLang'] = new StubContLang;
- $tmpGlobals['wgUser'] = new User;
- $context = new RequestContext();
- $tmpGlobals['wgLang'] = $context->getLanguage();
- $tmpGlobals['wgOut'] = $context->getOutput();
- $tmpGlobals['wgParser'] = new StubObject( 'wgParser', $GLOBALS['wgParserConf']['class'], array( $GLOBALS['wgParserConf'] ) );
- $tmpGlobals['wgRequest'] = $context->getRequest();
-
- if ( $GLOBALS['wgStyleDirectory'] === false ) {
- $tmpGlobals['wgStyleDirectory'] = "$IP/skins";
- }
-
-
- foreach ( $tmpGlobals as $var => $val ) {
- if ( array_key_exists( $var, $GLOBALS ) ) {
- $this->savedInitialGlobals[$var] = $GLOBALS[$var];
- }
-
- $GLOBALS[$var] = $val;
- }
-
- $this->savedWeirdGlobals['mw_namespace_protection'] = $wgNamespaceProtection[NS_MEDIAWIKI];
- $this->savedWeirdGlobals['image_alias'] = $wgNamespaceAliases['Image'];
- $this->savedWeirdGlobals['image_talk_alias'] = $wgNamespaceAliases['Image_talk'];
-
- $wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
- $wgNamespaceAliases['Image'] = NS_FILE;
- $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
- }
-
- public function tearDown() {
- foreach ( $this->savedInitialGlobals as $var => $val ) {
- $GLOBALS[$var] = $val;
- }
-
- global $wgNamespaceProtection, $wgNamespaceAliases;
-
- $wgNamespaceProtection[NS_MEDIAWIKI] = $this->savedWeirdGlobals['mw_namespace_protection'];
- $wgNamespaceAliases['Image'] = $this->savedWeirdGlobals['image_alias'];
- $wgNamespaceAliases['Image_talk'] = $this->savedWeirdGlobals['image_talk_alias'];
-
- // Restore backends
- RepoGroup::destroySingleton();
- FileBackendGroup::destroySingleton();
- }
-
- function addDBData() {
- $this->tablesUsed[] = 'site_stats';
- $this->tablesUsed[] = 'interwiki';
- # disabled for performance
- #$this->tablesUsed[] = 'image';
-
- # Hack: insert a few Wikipedia in-project interwiki prefixes,
- # for testing inter-language links
- $this->db->insert( 'interwiki', array(
- array( 'iw_prefix' => 'wikipedia',
- 'iw_url' => 'http://en.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 0 ),
- array( 'iw_prefix' => 'meatball',
- 'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 0 ),
- array( 'iw_prefix' => 'zh',
- 'iw_url' => 'http://zh.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'es',
- 'iw_url' => 'http://es.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'fr',
- 'iw_url' => 'http://fr.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- array( 'iw_prefix' => 'ru',
- 'iw_url' => 'http://ru.wikipedia.org/wiki/$1',
- 'iw_api' => '',
- 'iw_wikiid' => '',
- 'iw_local' => 1 ),
- /**
- * @todo Fixme! Why are we inserting duplicate data here? Shouldn't
- * need this IGNORE or shouldn't need the insert at all.
- */
- ), __METHOD__, array( 'IGNORE' )
- );
-
-
- # Update certain things in site_stats
- $this->db->insert( 'site_stats',
- array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ),
- __METHOD__
- );
-
- # Reinitialise the LocalisationCache to match the database state
- Language::getLocalisationCache()->unloadAll();
-
- # Clear the message cache
- MessageCache::singleton()->clear();
-
- $user = User::newFromId( 0 );
- LinkCache::singleton()->clear(); # Avoids the odd failure at creating the nullRevision
-
- # Upload DB table entries for files.
- # We will upload the actual files later. Note that if anything causes LocalFile::load()
- # to be triggered before then, it will break via maybeUpgrade() setting the fileExists
- # member to false and storing it in cache.
- $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
- if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
- $image->recordUpload2(
- '', // archive name
- 'Upload of some lame file',
- 'Some lame file',
- array(
- 'size' => 12345,
- 'width' => 1941,
- 'height' => 220,
- 'bits' => 24,
- 'media_type' => MEDIATYPE_BITMAP,
- 'mime' => 'image/jpeg',
- 'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
- 'fileExists' => true ),
- $this->db->timestamp( '20010115123500' ), $user
- );
- }
-
- # This image will be blacklisted in [[MediaWiki:Bad image list]]
- $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
- if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
- $image->recordUpload2(
- '', // archive name
- 'zomgnotcensored',
- 'Borderline image',
- array(
- 'size' => 12345,
- 'width' => 320,
- 'height' => 240,
- 'bits' => 24,
- 'media_type' => MEDIATYPE_BITMAP,
- 'mime' => 'image/jpeg',
- 'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
- 'fileExists' => true ),
- $this->db->timestamp( '20010115123500' ), $user
- );
- }
- }
-
-
-
-
- //ParserTest setup/teardown functions
-
- /**
- * Set up the global variables for a consistent environment for each test.
- * Ideally this should replace the global configuration entirely.
- */
- protected function setupGlobals( $opts = '', $config = '' ) {
- global $wgFileBackends;
- # Find out values for some special options.
- $lang =
- self::getOptionValue( 'language', $opts, 'en' );
- $variant =
- self::getOptionValue( 'variant', $opts, false );
- $maxtoclevel =
- self::getOptionValue( 'wgMaxTocLevel', $opts, 999 );
- $linkHolderBatchSize =
- self::getOptionValue( 'wgLinkHolderBatchSize', $opts, 1000 );
-
- $uploadDir = $this->getUploadDir();
- if ( $this->getCliArg( 'use-filebackend=' ) ) {
- if ( self::$backendToUse ) {
- $backend = self::$backendToUse;
- } else {
- $name = $this->getCliArg( 'use-filebackend=' );
- $useConfig = array();
- foreach ( $wgFileBackends as $conf ) {
- if ( $conf['name'] == $name ) {
- $useConfig = $conf;
- }
- }
- $useConfig['name'] = 'local-backend'; // swap name
- $class = $conf['class'];
- self::$backendToUse = new $class( $useConfig );
- $backend = self::$backendToUse;
- }
- } else {
- $backend = new FSFileBackend( array(
- 'name' => 'local-backend',
- 'lockManager' => 'nullLockManager',
- 'containerPaths' => array(
- 'local-public' => "$uploadDir",
- 'local-thumb' => "$uploadDir/thumb",
- )
- ) );
- }
-
- $settings = array(
- 'wgServer' => 'http://Britney-Spears',
- 'wgScript' => '/index.php',
- 'wgScriptPath' => '/',
- 'wgArticlePath' => '/wiki/$1',
- 'wgExtensionAssetsPath' => '/extensions',
- 'wgActionPaths' => array(),
- 'wgLocalFileRepo' => array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'url' => 'http://example.com/images',
- 'hashLevels' => 2,
- 'transformVia404' => false,
- 'backend' => $backend
- ),
- 'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
- 'wgStylePath' => '/skins',
- 'wgStyleSheetPath' => '/skins',
- 'wgSitename' => 'MediaWiki',
- 'wgLanguageCode' => $lang,
- 'wgDBprefix' => $this->db->getType() != 'oracle' ? 'unittest_' : 'ut_',
- 'wgRawHtml' => isset( $opts['rawhtml'] ),
- 'wgLang' => null,
- 'wgContLang' => null,
- 'wgNamespacesWithSubpages' => array( 0 => isset( $opts['subpage'] ) ),
- 'wgMaxTocLevel' => $maxtoclevel,
- 'wgCapitalLinks' => true,
- 'wgNoFollowLinks' => true,
- 'wgNoFollowDomainExceptions' => array(),
- 'wgThumbnailScriptPath' => false,
- 'wgUseImageResize' => false,
- 'wgUseTeX' => isset( $opts['math'] ),
- 'wgMathDirectory' => $uploadDir . '/math',
- 'wgLocaltimezone' => 'UTC',
- 'wgAllowExternalImages' => true,
- 'wgUseTidy' => false,
- 'wgDefaultLanguageVariant' => $variant,
- 'wgVariantArticlePath' => false,
- 'wgGroupPermissions' => array( '*' => array(
- 'createaccount' => true,
- 'read' => true,
- 'edit' => true,
- 'createpage' => true,
- 'createtalk' => true,
- ) ),
- 'wgNamespaceProtection' => array( NS_MEDIAWIKI => 'editinterface' ),
- 'wgDefaultExternalStore' => array(),
- 'wgForeignFileRepos' => array(),
- 'wgLinkHolderBatchSize' => $linkHolderBatchSize,
- 'wgExperimentalHtmlIds' => false,
- 'wgExternalLinkTarget' => false,
- 'wgAlwaysUseTidy' => false,
- 'wgHtml5' => true,
- 'wgWellFormedXml' => true,
- 'wgAllowMicrodataAttributes' => true,
- 'wgAdaptiveMessageCache' => true,
- 'wgUseDatabaseMessages' => true,
- );
-
- if ( $config ) {
- $configLines = explode( "\n", $config );
-
- foreach ( $configLines as $line ) {
- list( $var, $value ) = explode( '=', $line, 2 );
-
- $settings[$var] = eval( "return $value;" ); //???
- }
- }
-
- $this->savedGlobals = array();
-
- /** @since 1.20 */
- wfRunHooks( 'ParserTestGlobals', array( &$settings ) );
-
- foreach ( $settings as $var => $val ) {
- if ( array_key_exists( $var, $GLOBALS ) ) {
- $this->savedGlobals[$var] = $GLOBALS[$var];
- }
-
- $GLOBALS[$var] = $val;
- }
-
- $langObj = Language::factory( $lang );
- $GLOBALS['wgContLang'] = $langObj;
- $context = new RequestContext();
- $GLOBALS['wgLang'] = $context->getLanguage();
-
- $GLOBALS['wgMemc'] = new EmptyBagOStuff;
- $GLOBALS['wgOut'] = $context->getOutput();
- $GLOBALS['wgUser'] = $context->getUser();
-
- global $wgHooks;
-
- $wgHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
- $wgHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
-
- MagicWord::clearCache();
- RepoGroup::destroySingleton();
- FileBackendGroup::destroySingleton();
-
- # Create dummy files in storage
- $this->setupUploads();
-
- # Publish the articles after we have the final language set
- $this->publishTestArticles();
-
- # The entries saved into RepoGroup cache with previous globals will be wrong.
- RepoGroup::destroySingleton();
- FileBackendGroup::destroySingleton();
- MessageCache::destroyInstance();
-
- return $context;
- }
-
- /**
- * Get an FS upload directory (only applies to FSFileBackend)
- *
- * @return String: the directory
- */
- protected function getUploadDir() {
- if ( $this->keepUploads ) {
- $dir = wfTempDir() . '/mwParser-images';
-
- if ( is_dir( $dir ) ) {
- return $dir;
- }
- } else {
- $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
- }
-
- // wfDebug( "Creating upload directory $dir\n" );
- if ( file_exists( $dir ) ) {
- wfDebug( "Already exists!\n" );
- return $dir;
- }
-
- return $dir;
- }
-
- /**
- * Create a dummy uploads directory which will contain a couple
- * of files in order to pass existence tests.
- *
- * @return String: the directory
- */
- protected function setupUploads() {
- global $IP;
-
- $base = $this->getBaseDir();
- $backend = RepoGroup::singleton()->getLocalRepo()->getBackend();
- $backend->prepare( array( 'dir' => "$base/local-public/3/3a" ) );
- $backend->store( array(
- 'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/3/3a/Foobar.jpg"
- ) );
- $backend->prepare( array( 'dir' => "$base/local-public/0/09" ) );
- $backend->store( array(
- 'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/0/09/Bad.jpg"
- ) );
- }
-
- /**
- * Restore default values and perform any necessary clean-up
- * after each test runs.
- */
- protected function teardownGlobals() {
- $this->teardownUploads();
-
- foreach ( $this->savedGlobals as $var => $val ) {
- $GLOBALS[$var] = $val;
- }
-
- RepoGroup::destroySingleton();
- LinkCache::singleton()->clear();
- }
-
- /**
- * Remove the dummy uploads directory
- */
- private function teardownUploads() {
- if ( $this->keepUploads ) {
- return;
- }
-
- $base = $this->getBaseDir();
- // delete the files first, then the dirs.
- self::deleteFiles(
- array (
- "$base/local-public/3/3a/Foobar.jpg",
- "$base/local-thumb/3/3a/Foobar.jpg/180px-Foobar.jpg",
- "$base/local-thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
- "$base/local-thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
- "$base/local-thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
-
- "$base/local-public/0/09/Bad.jpg",
- "$base/local-thumb/0/09/Bad.jpg",
-
- "$base/local-public/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
- )
- );
- }
-
- /**
- * Delete the specified files, if they exist.
- * @param $files Array: full paths to files to delete.
- */
- private static function deleteFiles( $files ) {
- $backend = RepoGroup::singleton()->getLocalRepo()->getBackend();
- foreach ( $files as $file ) {
- $backend->delete( array( 'src' => $file ), array( 'force' => 1 ) );
- }
- foreach ( $files as $file ) {
- $tmp = $file;
- while ( $tmp = FileBackend::parentStoragePath( $tmp ) ) {
- if ( !$backend->clean( array( 'dir' => $tmp ) )->isOK() ) {
- break;
- }
- }
- }
- }
-
- protected function getBaseDir() {
- return 'mwstore://local-backend';
- }
-
- public function parserTestProvider() {
- if ( $this->file === false ) {
- global $wgParserTestFiles;
- $this->file = $wgParserTestFiles[0];
- }
- return new TestFileIterator( $this->file, $this );
- }
-
- /**
- * Set the file from whose tests will be run by this instance
- */
- public function setParserTestFile( $filename ) {
- $this->file = $filename;
- }
-
- /**
- * @group medium
- * @dataProvider parserTestProvider
- */
- public function testParserTest( $desc, $input, $result, $opts, $config ) {
- if ( $this->regex != '' && !preg_match( '/' . $this->regex . '/', $desc ) ) {
- $this->assertTrue( true ); // XXX: don't flood output with "test made no assertions"
- //$this->markTestSkipped( 'Filtered out by the user' );
- return;
- }
-
- wfDebug( "Running parser test: $desc\n" );
-
- $opts = $this->parseOptions( $opts );
- $context = $this->setupGlobals( $opts, $config );
-
- $user = $context->getUser();
- $options = ParserOptions::newFromContext( $context );
-
- if ( isset( $opts['title'] ) ) {
- $titleText = $opts['title'];
- }
- else {
- $titleText = 'Parser test';
- }
-
- $local = isset( $opts['local'] );
- $preprocessor = isset( $opts['preprocessor'] ) ? $opts['preprocessor'] : null;
- $parser = $this->getParser( $preprocessor );
-
- $title = Title::newFromText( $titleText );
-
- if ( isset( $opts['pst'] ) ) {
- $out = $parser->preSaveTransform( $input, $title, $user, $options );
- } elseif ( isset( $opts['msg'] ) ) {
- $out = $parser->transformMsg( $input, $options, $title );
- } elseif ( isset( $opts['section'] ) ) {
- $section = $opts['section'];
- $out = $parser->getSection( $input, $section );
- } elseif ( isset( $opts['replace'] ) ) {
- $section = $opts['replace'][0];
- $replace = $opts['replace'][1];
- $out = $parser->replaceSection( $input, $section, $replace );
- } elseif ( isset( $opts['comment'] ) ) {
- $out = Linker::formatComment( $input, $title, $local );
- } elseif ( isset( $opts['preload'] ) ) {
- $out = $parser->getpreloadText( $input, $title, $options );
- } else {
- $output = $parser->parse( $input, $title, $options, true, true, 1337 );
- $out = $output->getText();
-
- if ( isset( $opts['showtitle'] ) ) {
- if ( $output->getTitleText() ) {
- $title = $output->getTitleText();
- }
-
- $out = "$title\n$out";
- }
-
- if ( isset( $opts['ill'] ) ) {
- $out = $this->tidy( implode( ' ', $output->getLanguageLinks() ) );
- } elseif ( isset( $opts['cat'] ) ) {
- $outputPage = $context->getOutput();
- $outputPage->addCategoryLinks( $output->getCategories() );
- $cats = $outputPage->getCategoryLinks();
-
- if ( isset( $cats['normal'] ) ) {
- $out = $this->tidy( implode( ' ', $cats['normal'] ) );
- } else {
- $out = '';
- }
- }
- $parser->mPreprocessor = null;
-
- $result = $this->tidy( $result );
- }
-
- $this->teardownGlobals();
-
- $this->assertEquals( $result, $out, $desc );
- }
-
- /**
- * Run a fuzz test series
- * Draw input from a set of test files
- *
- * @todo fixme Needs some work to not eat memory until the world explodes
- *
- * @group ParserFuzz
- */
- function testFuzzTests() {
- global $wgParserTestFiles;
-
- $files = $wgParserTestFiles;
-
- if( $this->getCliArg( 'file=' ) ) {
- $files = array( $this->getCliArg( 'file=' ) );
- }
-
- $dict = $this->getFuzzInput( $files );
- $dictSize = strlen( $dict );
- $logMaxLength = log( $this->maxFuzzTestLength );
-
- ini_set( 'memory_limit', $this->memoryLimit * 1048576 );
-
- $user = new User;
- $opts = ParserOptions::newFromUser( $user );
- $title = Title::makeTitle( NS_MAIN, 'Parser_test' );
-
- $id = 1;
-
- while ( true ) {
-
- // Generate test input
- mt_srand( ++$this->fuzzSeed );
- $totalLength = mt_rand( 1, $this->maxFuzzTestLength );
- $input = '';
-
- while ( strlen( $input ) < $totalLength ) {
- $logHairLength = mt_rand( 0, 1000000 ) / 1000000 * $logMaxLength;
- $hairLength = min( intval( exp( $logHairLength ) ), $dictSize );
- $offset = mt_rand( 0, $dictSize - $hairLength );
- $input .= substr( $dict, $offset, $hairLength );
- }
-
- $this->setupGlobals();
- $parser = $this->getParser();
-
- // Run the test
- try {
- $parser->parse( $input, $title, $opts );
- $this->assertTrue( true, "Test $id, fuzz seed {$this->fuzzSeed}" );
- } catch ( Exception $exception ) {
- $input_dump = sprintf( "string(%d) \"%s\"\n", strlen( $input ), $input );
-
- $this->assertTrue( false, "Test $id, fuzz seed {$this->fuzzSeed}. \n\nInput: $input_dump\n\nError: {$exception->getMessage()}\n\nBacktrace: {$exception->getTraceAsString()}" );
- }
-
- $this->teardownGlobals();
- $parser->__destruct();
-
- if ( $id % 100 == 0 ) {
- $usage = intval( memory_get_usage( true ) / $this->memoryLimit / 1048576 * 100 );
- //echo "{$this->fuzzSeed}: $numSuccess/$numTotal (mem: $usage%)\n";
- if ( $usage > 90 ) {
- $ret = "Out of memory:\n";
- $memStats = $this->getMemoryBreakdown();
-
- foreach ( $memStats as $name => $usage ) {
- $ret .= "$name: $usage\n";
- }
-
- throw new MWException( $ret );
- }
- }
-
- $id++;
-
- }
- }
-
- //Various getter functions
-
- /**
- * Get an input dictionary from a set of parser test files
- */
- function getFuzzInput( $filenames ) {
- $dict = '';
-
- foreach ( $filenames as $filename ) {
- $contents = file_get_contents( $filename );
- preg_match_all( '/!!\s*input\n(.*?)\n!!\s*result/s', $contents, $matches );
-
- foreach ( $matches[1] as $match ) {
- $dict .= $match . "\n";
- }
- }
-
- return $dict;
- }
-
- /**
- * Get a memory usage breakdown
- */
- function getMemoryBreakdown() {
- $memStats = array();
-
- foreach ( $GLOBALS as $name => $value ) {
- $memStats['$' . $name] = strlen( serialize( $value ) );
- }
-
- $classes = get_declared_classes();
-
- foreach ( $classes as $class ) {
- $rc = new ReflectionClass( $class );
- $props = $rc->getStaticProperties();
- $memStats[$class] = strlen( serialize( $props ) );
- $methods = $rc->getMethods();
-
- foreach ( $methods as $method ) {
- $memStats[$class] += strlen( serialize( $method->getStaticVariables() ) );
- }
- }
-
- $functions = get_defined_functions();
-
- foreach ( $functions['user'] as $function ) {
- $rf = new ReflectionFunction( $function );
- $memStats["$function()"] = strlen( serialize( $rf->getStaticVariables() ) );
- }
-
- asort( $memStats );
-
- return $memStats;
- }
-
- /**
- * Get a Parser object
- */
- function getParser( $preprocessor = null ) {
- global $wgParserConf;
-
- $class = $wgParserConf['class'];
- $parser = new $class( array( 'preprocessorClass' => $preprocessor ) + $wgParserConf );
-
- wfRunHooks( 'ParserTestParser', array( &$parser ) );
-
- return $parser;
- }
-
- //Various action functions
-
- public function addArticle( $name, $text, $line ) {
- self::$articles[$name] = array( $text, $line );
- }
-
- public function publishTestArticles() {
- if ( empty( self::$articles ) ) {
- return;
- }
-
- foreach ( self::$articles as $name => $info ) {
- list( $text, $line ) = $info;
- ParserTest::addArticle( $name, $text, $line, 'ignoreduplicate' );
- }
- }
-
- /**
- * Steal a callback function from the primary parser, save it for
- * application to our scary parser. If the hook is not installed,
- * abort processing of this file.
- *
- * @param $name String
- * @return Bool true if tag hook is present
- */
- public function requireHook( $name ) {
- global $wgParser;
- $wgParser->firstCallInit( ); // make sure hooks are loaded.
- return isset( $wgParser->mTagHooks[$name] );
- }
-
- public function requireFunctionHook( $name ) {
- global $wgParser;
- $wgParser->firstCallInit( ); // make sure hooks are loaded.
- return isset( $wgParser->mFunctionHooks[$name] );
- }
- //Various "cleanup" functions
-
- /**
- * Run the "tidy" command on text if the $wgUseTidy
- * global is true
- *
- * @param $text String: the text to tidy
- * @return String
- */
- protected function tidy( $text ) {
- global $wgUseTidy;
-
- if ( $wgUseTidy ) {
- $text = MWTidy::tidy( $text );
- }
-
- return $text;
- }
-
- /**
- * Remove last character if it is a newline
- */
- public function removeEndingNewline( $s ) {
- if ( substr( $s, -1 ) === "\n" ) {
- return substr( $s, 0, -1 );
- }
- else {
- return $s;
- }
- }
-
- //Test options parser functions
-
- protected function parseOptions( $instring ) {
- $opts = array();
- // foo
- // foo=bar
- // foo="bar baz"
- // foo=[[bar baz]]
- // foo=bar,"baz quux"
- $regex = '/\b
- ([\w-]+) # Key
- \b
- (?:\s*
- = # First sub-value
- \s*
- (
- "
- [^"]* # Quoted val
- "
- |
- \[\[
- [^]]* # Link target
- \]\]
- |
- [\w-]+ # Plain word
- )
- (?:\s*
- , # Sub-vals 1..N
- \s*
- (
- "[^"]*" # Quoted val
- |
- \[\[[^]]*\]\] # Link target
- |
- [\w-]+ # Plain word
- )
- )*
- )?
- /x';
-
- if ( preg_match_all( $regex, $instring, $matches, PREG_SET_ORDER ) ) {
- foreach ( $matches as $bits ) {
- array_shift( $bits );
- $key = strtolower( array_shift( $bits ) );
- if ( count( $bits ) == 0 ) {
- $opts[$key] = true;
- } elseif ( count( $bits ) == 1 ) {
- $opts[$key] = $this->cleanupOption( array_shift( $bits ) );
- } else {
- // Array!
- $opts[$key] = array_map( array( $this, 'cleanupOption' ), $bits );
- }
- }
- }
- return $opts;
- }
-
- protected function cleanupOption( $opt ) {
- if ( substr( $opt, 0, 1 ) == '"' ) {
- return substr( $opt, 1, -1 );
- }
-
- if ( substr( $opt, 0, 2 ) == '[[' ) {
- return substr( $opt, 2, -2 );
- }
- return $opt;
- }
-
- /**
- * Use a regex to find out the value of an option
- * @param $key String: name of option val to retrieve
- * @param $opts Options array to look in
- * @param $default Mixed: default value returned if not found
- */
- protected static function getOptionValue( $key, $opts, $default ) {
- $key = strtolower( $key );
-
- if ( isset( $opts[$key] ) ) {
- return $opts[$key];
- } else {
- return $default;
- }
- }
-}
diff --git a/tests/phpunit/includes/parser/ParserMethodsTest.php b/tests/phpunit/includes/parser/ParserMethodsTest.php
deleted file mode 100644
index dea406c3..00000000
--- a/tests/phpunit/includes/parser/ParserMethodsTest.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-class ParserMethodsTest extends MediaWikiLangTestCase {
-
- public function dataPreSaveTransform() {
- return array(
- array( 'hello this is ~~~',
- "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
- ),
- array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
- 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
- ),
- );
- }
-
- /**
- * @dataProvider dataPreSaveTransform
- */
- public function testPreSaveTransform( $text, $expected ) {
- global $wgParser;
-
- $title = Title::newFromText( str_replace( '::', '__', __METHOD__ ) );
- $user = new User();
- $user->setName( "127.0.0.1" );
- $popts = ParserOptions::newFromUser( $user );
- $text = $wgParser->preSaveTransform( $text, $title, $user, $popts );
-
- $this->assertEquals( $expected, $text );
- }
-
- // TODO: Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
-}
-
diff --git a/tests/phpunit/includes/parser/ParserPreloadTest.php b/tests/phpunit/includes/parser/ParserPreloadTest.php
deleted file mode 100644
index 0e8ef530..00000000
--- a/tests/phpunit/includes/parser/ParserPreloadTest.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/**
- * Basic tests for Parser::getPreloadText
- * @author Antoine Musso
- */
-class ParserPreloadTest extends MediaWikiTestCase {
- private $testParser;
- private $testParserOptions;
- private $title;
-
- function setUp() {
- $this->testParserOptions = new ParserOptions();
-
- $this->testParser = new Parser();
- $this->testParser->Options( $this->testParserOptions );
- $this->testParser->clearState();
-
- $this->title = Title::newFromText( 'Preload Test' );
- }
-
- function tearDown() {
- unset( $this->testParser );
- unset( $this->title );
- }
-
- /**
- * @covers Parser::getPreloadText
- */
- function testPreloadSimpleText() {
- $this->assertPreloaded( 'simple', 'simple' );
- }
-
- /**
- * @covers Parser::getPreloadText
- */
- function testPreloadedPreIsUnstripped() {
- $this->assertPreloaded(
- '<pre>monospaced</pre>',
- '<pre>monospaced</pre>',
- '<pre> in preloaded text must be unstripped (bug 27467)'
- );
- }
-
- /**
- * @covers Parser::getPreloadText
- */
- function testPreloadedNowikiIsUnstripped() {
- $this->assertPreloaded(
- '<nowiki>[[Dummy title]]</nowiki>',
- '<nowiki>[[Dummy title]]</nowiki>',
- '<nowiki> in preloaded text must be unstripped (bug 27467)'
- );
- }
-
- function assertPreloaded( $expected, $text, $msg='') {
- $this->assertEquals(
- $expected,
- $this->testParser->getPreloadText(
- $text,
- $this->title,
- $this->testParserOptions
- ),
- $msg
- );
- }
-
-}
diff --git a/tests/phpunit/includes/parser/PreprocessorTest.php b/tests/phpunit/includes/parser/PreprocessorTest.php
deleted file mode 100644
index fee56748..00000000
--- a/tests/phpunit/includes/parser/PreprocessorTest.php
+++ /dev/null
@@ -1,233 +0,0 @@
-<?php
-
-class PreprocessorTest extends MediaWikiTestCase {
- var $mTitle = 'Page title';
- var $mPPNodeCount = 0;
- var $mOptions;
-
- function setUp() {
- global $wgParserConf;
- $this->mOptions = new ParserOptions();
- $name = isset( $wgParserConf['preprocessorClass'] ) ? $wgParserConf['preprocessorClass'] : 'Preprocessor_DOM';
-
- $this->mPreprocessor = new $name( $this );
- }
-
- function getStripList() {
- return array( 'gallery', 'display map' /* Used by Maps, see r80025 CR */, '/foo' );
- }
-
- function provideCases() {
- return array(
- array( "Foo", "<root>Foo</root>" ),
- array( "<!-- Foo -->", "<root><comment>&lt;!-- Foo --&gt;</comment></root>" ),
- array( "<!-- Foo --><!-- Bar -->", "<root><comment>&lt;!-- Foo --&gt;</comment><comment>&lt;!-- Bar --&gt;</comment></root>" ),
- array( "<!-- Foo --> <!-- Bar -->", "<root><comment>&lt;!-- Foo --&gt;</comment> <comment>&lt;!-- Bar --&gt;</comment></root>" ),
- array( "<!-- Foo --> \n <!-- Bar -->", "<root><comment>&lt;!-- Foo --&gt;</comment> \n <comment>&lt;!-- Bar --&gt;</comment></root>" ),
- array( "<!-- Foo --> \n <!-- Bar -->\n", "<root><comment>&lt;!-- Foo --&gt;</comment> \n<comment> &lt;!-- Bar --&gt;\n</comment></root>" ),
- array( "<!-- Foo --> <!-- Bar -->\n", "<root><comment>&lt;!-- Foo --&gt;</comment> <comment>&lt;!-- Bar --&gt;</comment>\n</root>" ),
- array( "<!-->Bar", "<root><comment>&lt;!--&gt;Bar</comment></root>" ),
- array( "<!-- Comment -- comment", "<root><comment>&lt;!-- Comment -- comment</comment></root>" ),
- array( "== Foo ==\n <!-- Bar -->\n== Baz ==\n", "<root><h level=\"2\" i=\"1\">== Foo ==</h>\n<comment> &lt;!-- Bar --&gt;\n</comment><h level=\"2\" i=\"2\">== Baz ==</h>\n</root>" ),
- array( "<gallery/>", "<root><ext><name>gallery</name><attr></attr></ext></root>" ),
- array( "Foo <gallery/> Bar", "<root>Foo <ext><name>gallery</name><attr></attr></ext> Bar</root>" ),
- array( "<gallery></gallery>", "<root><ext><name>gallery</name><attr></attr><inner></inner><close>&lt;/gallery&gt;</close></ext></root>" ),
- array( "<foo> <gallery></gallery>", "<root>&lt;foo&gt; <ext><name>gallery</name><attr></attr><inner></inner><close>&lt;/gallery&gt;</close></ext></root>" ),
- array( "<foo> <gallery><gallery></gallery>", "<root>&lt;foo&gt; <ext><name>gallery</name><attr></attr><inner>&lt;gallery&gt;</inner><close>&lt;/gallery&gt;</close></ext></root>" ),
- array( "<noinclude> Foo bar </noinclude>", "<root><ignore>&lt;noinclude&gt;</ignore> Foo bar <ignore>&lt;/noinclude&gt;</ignore></root>" ),
- array( "<noinclude>\n{{Foo}}\n</noinclude>", "<root><ignore>&lt;noinclude&gt;</ignore>\n<template lineStart=\"1\"><title>Foo</title></template>\n<ignore>&lt;/noinclude&gt;</ignore></root>" ),
- array( "<noinclude>\n{{Foo}}\n</noinclude>\n", "<root><ignore>&lt;noinclude&gt;</ignore>\n<template lineStart=\"1\"><title>Foo</title></template>\n<ignore>&lt;/noinclude&gt;</ignore>\n</root>" ),
- array( "<gallery>foo bar", "<root><ext><name>gallery</name><attr></attr><inner>foo bar</inner></ext></root>" ),
- array( "<{{foo}}>", "<root>&lt;<template><title>foo</title></template>&gt;</root>" ),
- array( "<{{{foo}}}>", "<root>&lt;<tplarg><title>foo</title></tplarg>&gt;</root>" ),
- array( "<gallery></gallery</gallery>", "<root><ext><name>gallery</name><attr></attr><inner>&lt;/gallery</inner><close>&lt;/gallery&gt;</close></ext></root>" ),
- array( "=== Foo === ", "<root><h level=\"3\" i=\"1\">=== Foo === </h></root>" ),
- array( "==<!-- -->= Foo === ", "<root><h level=\"2\" i=\"1\">==<comment>&lt;!-- --&gt;</comment>= Foo === </h></root>" ),
- array( "=== Foo ==<!-- -->= ", "<root><h level=\"1\" i=\"1\">=== Foo ==<comment>&lt;!-- --&gt;</comment>= </h></root>" ),
- array( "=== Foo ===<!-- -->\n", "<root><h level=\"3\" i=\"1\">=== Foo ===<comment>&lt;!-- --&gt;</comment></h>\n</root>" ),
- array( "=== Foo ===<!-- --> <!-- -->\n", "<root><h level=\"3\" i=\"1\">=== Foo ===<comment>&lt;!-- --&gt;</comment> <comment>&lt;!-- --&gt;</comment></h>\n</root>" ),
- array( "== Foo ==\n== Bar == \n", "<root><h level=\"2\" i=\"1\">== Foo ==</h>\n<h level=\"2\" i=\"2\">== Bar == </h>\n</root>" ),
- array( "===========", "<root><h level=\"5\" i=\"1\">===========</h></root>" ),
- array( "Foo\n=\n==\n=\n", "<root>Foo\n=\n==\n=\n</root>" ),
- array( "{{Foo}}", "<root><template><title>Foo</title></template></root>" ),
- array( "\n{{Foo}}", "<root>\n<template lineStart=\"1\"><title>Foo</title></template></root>" ),
- array( "{{Foo|bar}}", "<root><template><title>Foo</title><part><name index=\"1\" /><value>bar</value></part></template></root>" ),
- array( "{{Foo|bar}}a", "<root><template><title>Foo</title><part><name index=\"1\" /><value>bar</value></part></template>a</root>" ),
- array( "{{Foo|bar|baz}}", "<root><template><title>Foo</title><part><name index=\"1\" /><value>bar</value></part><part><name index=\"2\" /><value>baz</value></part></template></root>" ),
- array( "{{Foo|1=bar}}", "<root><template><title>Foo</title><part><name>1</name>=<value>bar</value></part></template></root>" ),
- array( "{{Foo|=bar}}", "<root><template><title>Foo</title><part><name></name>=<value>bar</value></part></template></root>" ),
- array( "{{Foo|bar=baz}}", "<root><template><title>Foo</title><part><name>bar</name>=<value>baz</value></part></template></root>" ),
- array( "{{Foo|{{bar}}=baz}}", "<root><template><title>Foo</title><part><name><template><title>bar</title></template></name>=<value>baz</value></part></template></root>" ),
- array( "{{Foo|1=bar|baz}}", "<root><template><title>Foo</title><part><name>1</name>=<value>bar</value></part><part><name index=\"1\" /><value>baz</value></part></template></root>" ),
- array( "{{Foo|1=bar|2=baz}}", "<root><template><title>Foo</title><part><name>1</name>=<value>bar</value></part><part><name>2</name>=<value>baz</value></part></template></root>" ),
- array( "{{Foo|bar|foo=baz}}", "<root><template><title>Foo</title><part><name index=\"1\" /><value>bar</value></part><part><name>foo</name>=<value>baz</value></part></template></root>" ),
- array( "{{{1}}}", "<root><tplarg><title>1</title></tplarg></root>" ),
- array( "{{{1|}}}", "<root><tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg></root>" ),
- array( "{{{Foo}}}", "<root><tplarg><title>Foo</title></tplarg></root>" ),
- array( "{{{Foo|}}}", "<root><tplarg><title>Foo</title><part><name index=\"1\" /><value></value></part></tplarg></root>" ),
- array( "{{{Foo|bar|baz}}}", "<root><tplarg><title>Foo</title><part><name index=\"1\" /><value>bar</value></part><part><name index=\"2\" /><value>baz</value></part></tplarg></root>" ),
- array( "{<!-- -->{Foo}}", "<root>{<comment>&lt;!-- --&gt;</comment>{Foo}}</root>" ),
- array( "{{{{Foobar}}}}", "<root>{<tplarg><title>Foobar</title></tplarg>}</root>" ),
- array( "{{{ {{Foo}} }}}", "<root><tplarg><title> <template><title>Foo</title></template> </title></tplarg></root>" ),
- array( "{{ {{{Foo}}} }}", "<root><template><title> <tplarg><title>Foo</title></tplarg> </title></template></root>" ),
- array( "{{{{{Foo}}}}}", "<root><template><title><tplarg><title>Foo</title></tplarg></title></template></root>" ),
- array( "{{{{{Foo}} }}}", "<root><tplarg><title><template><title>Foo</title></template> </title></tplarg></root>" ),
- array( "{{{{{{Foo}}}}}}", "<root><tplarg><title><tplarg><title>Foo</title></tplarg></title></tplarg></root>" ),
- array( "{{{{{{Foo}}}}}", "<root>{<template><title><tplarg><title>Foo</title></tplarg></title></template></root>" ),
- array( "[[[Foo]]", "<root>[[[Foo]]</root>" ),
- array( "{{Foo|[[[[bar]]|baz]]}}", "<root><template><title>Foo</title><part><name index=\"1\" /><value>[[[[bar]]|baz]]</value></part></template></root>" ), // This test is important, since it means the difference between having the [[ rule stacked or not
- array( "{{Foo|[[[[bar]|baz]]}}", "<root>{{Foo|[[[[bar]|baz]]}}</root>" ),
- array( "{{Foo|Foo [[[[bar]|baz]]}}", "<root>{{Foo|Foo [[[[bar]|baz]]}}</root>" ),
- array( "Foo <display map>Bar</display map >Baz", "<root>Foo <ext><name>display map</name><attr></attr><inner>Bar</inner><close>&lt;/display map &gt;</close></ext>Baz</root>" ),
- array( "Foo <display map foo>Bar</display map >Baz", "<root>Foo <ext><name>display map</name><attr> foo</attr><inner>Bar</inner><close>&lt;/display map &gt;</close></ext>Baz</root>" ),
- array( "Foo <gallery bar=\"baz\" />", "<root>Foo <ext><name>gallery</name><attr> bar=&quot;baz&quot; </attr></ext></root>" ),
- array( "Foo <gallery bar=\"1\" baz=2 />", "<root>Foo <ext><name>gallery</name><attr> bar=&quot;1&quot; baz=2 </attr></ext></root>" ),
- array( "</foo>Foo<//foo>", "<root><ext><name>/foo</name><attr></attr><inner>Foo</inner><close>&lt;//foo&gt;</close></ext></root>" ), # Worth blacklisting IMHO
- array( "{{#ifexpr: ({{{1|1}}} = 2) | Foo | Bar }}", "<root><template><title>#ifexpr: (<tplarg><title>1</title><part><name index=\"1\" /><value>1</value></part></tplarg> = 2) </title><part><name index=\"1\" /><value> Foo </value></part><part><name index=\"2\" /><value> Bar </value></part></template></root>"),
- array( "{{#if: {{{1|}}} | Foo | {{Bar}} }}", "<root><template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> Foo </value></part><part><name index=\"2\" /><value> <template><title>Bar</title></template> </value></part></template></root>"),
- array( "{{#if: {{{1|}}} | Foo | [[Bar]] }}", "<root><template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> Foo </value></part><part><name index=\"2\" /><value> [[Bar]] </value></part></template></root>"),
- array( "{{#if: {{{1|}}} | [[Foo]] | Bar }}", "<root><template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> [[Foo]] </value></part><part><name index=\"2\" /><value> Bar </value></part></template></root>"),
- array( "{{#if: {{{1|}}} | 1 | {{#if: {{{1|}}} | 2 | 3 }} }}", "<root><template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> 1 </value></part><part><name index=\"2\" /><value> <template><title>#if: <tplarg><title>1</title><part><name index=\"1\" /><value></value></part></tplarg> </title><part><name index=\"1\" /><value> 2 </value></part><part><name index=\"2\" /><value> 3 </value></part></template> </value></part></template></root>"),
- array( "{{ {{Foo}}", "<root>{{ <template><title>Foo</title></template></root>"),
- array( "{{Foobar {{Foo}} {{Bar}} {{Baz}} ", "<root>{{Foobar <template><title>Foo</title></template> <template><title>Bar</title></template> <template><title>Baz</title></template> </root>"),
- array( "[[Foo]] |", "<root>[[Foo]] |</root>"),
- array( "{{Foo|Bar|", "<root>{{Foo|Bar|</root>"),
- array( "[[Foo]", "<root>[[Foo]</root>"),
- array( "[[Foo|Bar]", "<root>[[Foo|Bar]</root>"),
- array( "{{Foo| [[Bar] }}", "<root>{{Foo| [[Bar] }}</root>"),
- array( "{{Foo| [[Bar|Baz] }}", "<root>{{Foo| [[Bar|Baz] }}</root>"),
- array( "{{Foo|bar=[[baz]}}", "<root>{{Foo|bar=[[baz]}}</root>"),
- array( "{{foo|", "<root>{{foo|</root>"),
- array( "{{foo|}", "<root>{{foo|}</root>"),
- array( "{{foo|} }}", "<root><template><title>foo</title><part><name index=\"1\" /><value>} </value></part></template></root>"),
- array( "{{foo|bar=|}", "<root>{{foo|bar=|}</root>"),
- array( "{{Foo|} Bar=", "<root>{{Foo|} Bar=</root>"),
- 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' ) ), */
- );
- }
-
- /**
- * Get XML preprocessor tree from the preprocessor (which may not be the
- * native XML-based one).
- *
- * @param string $wikiText
- * @return string
- */
- function preprocessToXml( $wikiText ) {
- if ( method_exists( $this->mPreprocessor, 'preprocessToXml' ) ) {
- return $this->normalizeXml( $this->mPreprocessor->preprocessToXml( $wikiText ) );
- }
-
- $dom = $this->mPreprocessor->preprocessToObj( $wikiText );
- if ( is_callable( array( $dom, 'saveXML' ) ) ) {
- return $dom->saveXML();
- } else {
- return $this->normalizeXml( $dom->__toString() );
- }
- }
-
- /**
- * Normalize XML string to the form that a DOMDocument saves out.
- *
- * @param string $xml
- * @return string
- */
- function normalizeXml( $xml ) {
- return preg_replace( '!<([a-z]+)/>!', '<$1></$1>', str_replace( ' />', '/>', $xml ) );
-
- $dom = new DOMDocument();
- // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
- $dom->loadXML( $xml, 1 << 19 );
- return $dom->saveXML();
- }
-
- /**
- * @dataProvider provideCases
- */
- function testPreprocessorOutput( $wikiText, $expectedXml ) {
- $this->assertEquals( $this->normalizeXml( $expectedXml ), $this->preprocessToXml( $wikiText ) );
- }
-
- /**
- * These are more complex test cases taken out of wiki articles.
- */
- function provideFiles() {
- 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
- array( "All_system_messages" ), # http://tl.wiktionary.org/w/index.php?title=Suleras:All_system_messages&oldid=2765 GPL text generated by MediaWiki
- array( "Fundraising" ), # http://tl.wiktionary.org/w/index.php?title=MediaWiki:Sitenotice&oldid=5716 GFDL + CC-BY-SA, copied there by Sky Harbor.
- );
- }
-
- /**
- * @dataProvider provideFiles
- */
- function testPreprocessorOutputFiles( $filename ) {
- $folder = __DIR__ . "/../../../parser/preprocess";
- $wikiText = file_get_contents( "$folder/$filename.txt" );
- $output = $this->preprocessToXml( $wikiText );
-
- $expectedFilename = "$folder/$filename.expected";
- if ( file_exists( $expectedFilename ) ) {
- $expectedXml = $this->normalizeXml( file_get_contents( $expectedFilename ) );
- $this->assertEquals( $expectedXml, $output );
- } else {
- $tempFilename = tempnam( $folder, "$filename." );
- file_put_contents( $tempFilename, $output );
- $this->markTestIncomplete( "File $expectedFilename missing. Output stored as $tempFilename" );
- }
- }
-
- /**
- * Tests from Bug 28642 · https://bugzilla.wikimedia.org/28642
- */
- function provideHeadings() {
- 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>" ),
- 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>" ),
- array( "== h ==<!--c1--><!--c2-->", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment></h></root>" ),
- array( "== h == <!--c1--><!--c2-->", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment></h></root>" ),
- array( "== h ==<!--c1--><!--c2--> ", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment> </h></root>" ),
- array( "== h == <!--c1--><!--c2--> ", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment> </h></root>" ),
- array( "== h == <!--c1--> <!--c2-->", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment></h></root>" ),
- array( "== h ==<!--c1--> <!--c2--> ", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment> </h></root>" ),
- array( "== h == <!--c1--> <!--c2--> ", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment> </h></root>" ),
- array( "== h ==<!--c1--><!--c2--><!--c3-->", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment></h></root>" ),
- array( "== h ==<!--c1--> <!--c2--><!--c3-->", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment></h></root>" ),
- array( "== h ==<!--c1--><!--c2--> <!--c3-->", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment> <comment>&lt;!--c3--&gt;</comment></h></root>" ),
- array( "== h ==<!--c1--> <!--c2--> <!--c3-->", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment> <comment>&lt;!--c3--&gt;</comment></h></root>" ),
- array( "== h == <!--c1--><!--c2--><!--c3-->", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment></h></root>" ),
- array( "== h == <!--c1--> <!--c2--><!--c3-->", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment></h></root>" ),
- array( "== h == <!--c1--><!--c2--> <!--c3-->", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment> <comment>&lt;!--c3--&gt;</comment></h></root>" ),
- array( "== h == <!--c1--> <!--c2--> <!--c3-->", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment> <comment>&lt;!--c3--&gt;</comment></h></root>" ),
- array( "== h ==<!--c1--><!--c2--><!--c3--> ", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment> </h></root>" ),
- array( "== h ==<!--c1--> <!--c2--><!--c3--> ", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment> </h></root>" ),
- array( "== h ==<!--c1--><!--c2--> <!--c3--> ", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment> <comment>&lt;!--c3--&gt;</comment> </h></root>" ),
- array( "== h ==<!--c1--> <!--c2--> <!--c3--> ", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment> <comment>&lt;!--c3--&gt;</comment> </h></root>" ),
- array( "== h == <!--c1--><!--c2--><!--c3--> ", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment> </h></root>" ),
- array( "== h == <!--c1--> <!--c2--><!--c3--> ", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment> </h></root>" ),
- array( "== h == <!--c1--><!--c2--> <!--c3--> ", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment> <comment>&lt;!--c3--&gt;</comment> </h></root>" ),
- array( "== h == <!--c1--> <!--c2--> <!--c3--> ", "<root><h level=\"2\" i=\"1\">== h == <comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment> <comment>&lt;!--c3--&gt;</comment> </h></root>" ),
-
- /* These are not working: */
- array( "== h ==<!--c1--> <!--c2-->", "<root>== h ==<comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment></root>" ),
- array( "== h == <!--c1--> <!--c2-->", "<root>== h == <comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment></root>" ),
- array( "== h ==<!--c1--> <!--c2--> ", "<root>== h ==<comment>&lt;!--c1--&gt;</comment> <comment>&lt;!--c2--&gt;</comment> </root>" ),
- array( "== h == x <!--c1--><!--c2--><!--c3--> ", "<root>== h == x <comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment> </root>" ),
- 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>" ),
- );
- }
-
- /**
- * @dataProvider provideHeadings
- */
- function testHeadings( $wikiText, $expectedXml ) {
- $this->assertEquals( $this->normalizeXml( $expectedXml ), $this->preprocessToXml( $wikiText ) );
- }
-}
-
diff --git a/tests/phpunit/includes/parser/TagHooksTest.php b/tests/phpunit/includes/parser/TagHooksTest.php
deleted file mode 100644
index 713ce846..00000000
--- a/tests/phpunit/includes/parser/TagHooksTest.php
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-
-/**
- * @group Parser
- */
-class TagHookTest extends MediaWikiTestCase {
-
- public static function provideValidNames() {
- return array( array( 'foo' ), array( 'foo-bar' ), array( 'foo_bar' ), array( 'FOO-BAR' ), array( 'foo bar' ) );
- }
-
- public static function provideBadNames() {
- return array( array( "foo<bar" ), array( "foo>bar" ), array( "foo\nbar" ), array( "foo\rbar" ) );
- }
-
- /**
- * @dataProvider provideValidNames
- */
- function testTagHooks( $tag ) {
- global $wgParserConf;
- $parser = new Parser( $wgParserConf );
-
- $parser->setHook( $tag, array( $this, 'tagCallback' ) );
- $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), new ParserOptions );
- $this->assertEquals( "<p>FooOneBaz\n</p>", $parserOutput->getText() );
-
- $parser->mPreprocessor = null; # Break the Parser <-> Preprocessor cycle
- }
-
- /**
- * @dataProvider provideBadNames
- * @expectedException MWException
- */
- function testBadTagHooks( $tag ) {
- global $wgParserConf;
- $parser = new Parser( $wgParserConf );
-
- $parser->setHook( $tag, array( $this, 'tagCallback' ) );
- $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), new ParserOptions );
- $this->fail('Exception not thrown.');
- }
-
- /**
- * @dataProvider provideValidNames
- */
- function testFunctionTagHooks( $tag ) {
- global $wgParserConf;
- $parser = new Parser( $wgParserConf );
-
- $parser->setFunctionTagHook( $tag, array( $this, 'functionTagCallback' ), 0 );
- $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), new ParserOptions );
- $this->assertEquals( "<p>FooOneBaz\n</p>", $parserOutput->getText() );
-
- $parser->mPreprocessor = null; # Break the Parser <-> Preprocessor cycle
- }
-
- /**
- * @dataProvider provideBadNames
- * @expectedException MWException
- */
- function testBadFunctionTagHooks( $tag ) {
- global $wgParserConf;
- $parser = new Parser( $wgParserConf );
-
- $parser->setFunctionTagHook( $tag, array( $this, 'functionTagCallback' ), SFH_OBJECT_ARGS );
- $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), new ParserOptions );
- $this->fail('Exception not thrown.');
- }
-
- function tagCallback( $text, $params, $parser ) {
- return str_rot13( $text );
- }
-
- function functionTagCallback( &$parser, $frame, $code, $attribs ) {
- return str_rot13( $code );
- }
-}
diff --git a/tests/phpunit/includes/search/SearchEngineTest.php b/tests/phpunit/includes/search/SearchEngineTest.php
deleted file mode 100644
index 957907c7..00000000
--- a/tests/phpunit/includes/search/SearchEngineTest.php
+++ /dev/null
@@ -1,163 +0,0 @@
-<?php
-
-/**
- * This class is not directly tested. Instead it is extended by SearchDbTest.
- * @group Search
- * @group Database
- */
-class SearchEngineTest extends MediaWikiTestCase {
- protected $search, $pageList;
-
- function tearDown() {
- unset( $this->search );
- }
-
- /**
- * Checks for database type & version.
- * Will skip current test if DB does not support search.
- */
- function setUp() {
- parent::setUp();
- // Search tests require MySQL or SQLite with FTS
- # Get database type and version
- $dbType = $this->db->getType();
- $dbSupported =
- ($dbType === 'mysql')
- || ( $dbType === 'sqlite' && $this->db->getFulltextSearchModule() == 'FTS3' );
-
- if( !$dbSupported ) {
- $this->markTestSkipped( "MySQL or SQLite with FTS3 only" );
- }
-
- $searchType = $this->db->getSearchEngine();
- $this->search = new $searchType( $this->db );
- }
-
- function pageExists( $title ) {
- return false;
- }
-
- function addDBData() {
- if ( $this->pageExists( 'Not_Main_Page' ) ) {
- return;
- }
- $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( '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 );
- $this->insertPage( 'Another_page', 'This page also is unrelated.', 0 );
- $this->insertPage( 'Help:Help', 'Help me!', 4 );
- $this->insertPage( 'Thppt', 'Blah blah', 0 );
- $this->insertPage( 'Alan_Smithee', 'yum', 0 );
- $this->insertPage( 'Pages', 'are\'food', 0 );
- $this->insertPage( 'HalfOneUp', 'AZ', 0 );
- $this->insertPage( 'FullOneUp', 'AZ', 0 );
- $this->insertPage( 'HalfTwoLow', 'az', 0 );
- $this->insertPage( 'FullTwoLow', 'ï½ï½š', 0 );
- $this->insertPage( 'HalfNumbers', '1234567890', 0 );
- $this->insertPage( 'FullNumbers', '123456789ï¼', 0 );
- $this->insertPage( 'DomainName', 'example.com', 0 );
- }
-
- function fetchIds( $results ) {
- $this->assertTrue( is_object( $results ) );
-
- $matches = array();
- $row = $results->next();
- while ( $row ) {
- $matches[] = $row->getTitle()->getPrefixedText();
- $row = $results->next();
- }
- $results->free();
- # Search is not guaranteed to return results in a certain order;
- # sort them numerically so we will compare simply that we received
- # the expected matches.
- sort( $matches );
- return $matches;
- }
-
- /**
- * Insert a new page
- *
- * @param $pageName String: page name
- * @param $text String: page's content
- * @param $n Integer: unused
- */
- function insertPage( $pageName, $text, $ns ) {
- $title = Title::newFromText( $pageName );
-
- $user = User::newFromName( 'WikiSysop' );
- $comment = 'Search Test';
-
- // avoid memory leak...?
- LinkCache::singleton()->clear();
-
- $page = WikiPage::factory( $title );
- $page->doEdit( $text, $comment, 0, false, $user );
-
- $this->pageList[] = array( $title, $page->getId() );
-
- return true;
- }
-
- function testFullWidth() {
- $this->assertEquals(
- array( 'FullOneUp', 'FullTwoLow', 'HalfOneUp', 'HalfTwoLow' ),
- $this->fetchIds( $this->search->searchText( 'AZ' ) ),
- "Search for normalized from Half-width Upper" );
- $this->assertEquals(
- array( 'FullOneUp', 'FullTwoLow', 'HalfOneUp', 'HalfTwoLow' ),
- $this->fetchIds( $this->search->searchText( 'az' ) ),
- "Search for normalized from Half-width Lower" );
- $this->assertEquals(
- array( 'FullOneUp', 'FullTwoLow', 'HalfOneUp', 'HalfTwoLow' ),
- $this->fetchIds( $this->search->searchText( 'AZ' ) ),
- "Search for normalized from Full-width Upper" );
- $this->assertEquals(
- array( 'FullOneUp', 'FullTwoLow', 'HalfOneUp', 'HalfTwoLow' ),
- $this->fetchIds( $this->search->searchText( 'ï½ï½š' ) ),
- "Search for normalized from Full-width Lower" );
- }
-
- function testTextSearch() {
- $this->assertEquals(
- array( 'Smithee' ),
- $this->fetchIds( $this->search->searchText( 'smithee' ) ),
- "Plain search failed" );
- }
-
- function testTextPowerSearch() {
- $this->search->setNamespaces( array( 0, 1, 4 ) );
- $this->assertEquals(
- array(
- 'Smithee',
- 'Talk:Not Main Page',
- ),
- $this->fetchIds( $this->search->searchText( 'smithee' ) ),
- "Power search failed" );
- }
-
- function testTitleSearch() {
- $this->assertEquals(
- array(
- 'Alan Smithee',
- 'Smithee',
- ),
- $this->fetchIds( $this->search->searchTitle( 'smithee' ) ),
- "Title search failed" );
- }
-
- function testTextTitlePowerSearch() {
- $this->search->setNamespaces( array( 0, 1, 4 ) );
- $this->assertEquals(
- array(
- 'Alan Smithee',
- 'Smithee',
- 'Talk:Smithee',
- ),
- $this->fetchIds( $this->search->searchTitle( 'smithee' ) ),
- "Title power search failed" );
- }
-
-}
diff --git a/tests/phpunit/includes/search/SearchUpdateTest.php b/tests/phpunit/includes/search/SearchUpdateTest.php
deleted file mode 100644
index 6e49a9a1..00000000
--- a/tests/phpunit/includes/search/SearchUpdateTest.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-class MockSearch extends SearchEngine {
- public static $id;
- public static $title;
- public static $text;
-
- public function __construct( $db ) {
- }
-
- public function update( $id, $title, $text ) {
- self::$id = $id;
- self::$title = $title;
- self::$text = $text;
- }
-}
-
-/**
- * @group Search
- */
-class SearchUpdateTest extends MediaWikiTestCase {
- static $searchType;
-
- function update( $text, $title = 'Test', $id = 1 ) {
- $u = new SearchUpdate( $id, $title, $text );
- $u->doUpdate();
- return array( MockSearch::$title, MockSearch::$text );
- }
-
- function updateText( $text ) {
- list( , $resultText ) = $this->update( $text );
- $resultText = trim( $resultText ); // abstract from some implementation details
- return $resultText;
- }
-
- function setUp() {
- global $wgSearchType;
-
- self::$searchType = $wgSearchType;
- $wgSearchType = 'MockSearch';
- }
-
- function tearDown() {
- global $wgSearchType;
-
- $wgSearchType = self::$searchType;
- }
-
- function testUpdateText() {
- $this->assertEquals(
- 'test',
- $this->updateText( '<div>TeSt</div>' ),
- 'HTML stripped, text lowercased'
- );
-
- $this->assertEquals(
- 'foo bar boz quux',
- $this->updateText( <<<EOT
-<table style="color:red; font-size:100px">
- <tr class="scary"><td><div>foo</div></td><tr>bar</td></tr>
- <tr><td>boz</td><tr>quux</td></tr>
-</table>
-EOT
- ), 'Stripping HTML tables' );
-
- $this->assertEquals(
- 'a b',
- $this->updateText( 'a > b' ),
- 'Handle unclosed tags'
- );
-
- $text = str_pad( "foo <barbarbar \n", 10000, 'x' );
-
- $this->assertNotEquals(
- '',
- $this->updateText( $text ),
- 'Bug 18609'
- );
- }
-
- function testBug32712() {
- $text = "text „http://example.com“ text";
- $result = $this->updateText( $text );
- $processed = preg_replace( '/Q/u', 'Q', $result );
- $this->assertTrue(
- $processed != '',
- 'Link surrounded by unicode quotes should not fail UTF-8 validation'
- );
- }
-}
diff --git a/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php b/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
deleted file mode 100644
index a33c7b68..00000000
--- a/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-/**
- * Test class to run the query of most of all our special pages
- *
- * Copyright © 2011, Antoine Musso
- *
- * @author Antoine Musso
- * @group Database
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
- die( 1 );
-}
-
-global $IP;
-require_once "$IP/includes/QueryPage.php"; // Needed to populate $wgQueryPages
-
-class QueryAllSpecialPagesTest extends MediaWikiTestCase {
-
- /** List query pages that can not be tested automatically */
- protected $manualTest = array(
- 'LinkSearchPage'
- );
-
- /**
- * Pages whose query use the same DB table more than once.
- * This is used to skip testing those pages when run against a MySQL backend
- * which does not support reopening a temporary table. See upstream bug:
- * http://bugs.mysql.com/bug.php?id=10327
- */
- protected $reopensTempTable = array(
- 'BrokenRedirects',
- );
-
- /**
- * Initialize all query page objects
- */
- function __construct() {
- parent::__construct();
-
- global $wgQueryPages;
- foreach( $wgQueryPages as $page ) {
- $class = $page[0];
- if( ! in_array( $class, $this->manualTest ) ) {
- $this->queryPages[$class] = new $class;
- }
- }
- }
-
- /**
- * Test SQL for each of our QueryPages objects
- * @group Database
- */
- function testQuerypageSqlQuery() {
- 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)" );
- continue;
- }
-
- $msg = "SQL query for page {$page->getName()} should give a result wrapper object" ;
-
- $result = $page->reallyDoQuery( 50 );
- if( $result instanceof ResultWrapper ) {
- $this->assertTrue( true, $msg );
- } else {
- $this->assertFalse( false, $msg );
- }
- }
- }
-}
diff --git a/tests/phpunit/includes/specials/SpecialRecentchangesTest.php b/tests/phpunit/includes/specials/SpecialRecentchangesTest.php
deleted file mode 100644
index 2e4f4b09..00000000
--- a/tests/phpunit/includes/specials/SpecialRecentchangesTest.php
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-/**
- * Test class for SpecialRecentchanges class
- *
- * Copyright © 2011, Antoine Musso
- *
- * @author Antoine Musso
- * @group Database
- */
-class SpecialRecentchangesTest extends MediaWikiTestCase {
-
- /**
- * @var SpecialRecentChanges
- */
- protected $rc;
-
- function setUp() {
- }
-
- /** helper to test SpecialRecentchanges::buildMainQueryConds() */
- private function assertConditions( $expected, $requestOptions = null, $message = '' ) {
- $context = new RequestContext;
- $context->setRequest( new FauxRequest( $requestOptions ) );
-
- # setup the rc object
- $this->rc = new SpecialRecentChanges();
- $this->rc->setContext( $context );
- $formOptions = $this->rc->setup( null );
-
- # Filter out rc_timestamp conditions which depends on the test runtime
- # This condition is not needed as of march 2, 2011 -- hashar
- # @todo FIXME: Find a way to generate the correct rc_timestamp
- $queryConditions = array_filter(
- $this->rc->buildMainQueryConds( $formOptions ),
- 'SpecialRecentchangesTest::filterOutRcTimestampCondition'
- );
-
- $this->assertEquals(
- $expected,
- $queryConditions,
- $message
- );
- }
-
- /** return false if condition begin with 'rc_timestamp ' */
- private static function filterOutRcTimestampCondition( $var ) {
- return (false === strpos( $var, 'rc_timestamp ' ));
-
- }
-
- public function testRcNsFilter() {
- $this->assertConditions(
- array( # expected
- 'rc_bot' => 0,
- #0 => "rc_timestamp >= '20110223000000'",
- 1 => "rc_namespace = '0'",
- ),
- array(
- 'namespace' => NS_MAIN,
- ),
- "rc conditions with no options (aka default setting)"
- );
- }
-
- public function testRcNsFilterInversion() {
- $this->assertConditions(
- array( # expected
- #0 => "rc_timestamp >= '20110223000000'",
- 'rc_bot' => 0,
- 1 => sprintf( "rc_namespace != '%s'", NS_MAIN ),
- ),
- array(
- 'namespace' => NS_MAIN,
- 'invert' => 1,
- ),
- "rc conditions with namespace inverted"
- );
- }
-
- /**
- * @bug 2429
- * @dataProvider provideNamespacesAssociations
- */
- public function testRcNsFilterAssociation( $ns1, $ns2 ) {
- $this->assertConditions(
- array( # expected
- #0 => "rc_timestamp >= '20110223000000'",
- 'rc_bot' => 0,
- 1 => sprintf( "(rc_namespace = '%s' OR rc_namespace = '%s')", $ns1, $ns2 ),
- ),
- array(
- 'namespace' => $ns1,
- 'associated' => 1,
- ),
- "rc conditions with namespace inverted"
- );
- }
-
- /**
- * @bug 2429
- * @dataProvider provideNamespacesAssociations
- */
- public function testRcNsFilterAssociationWithInversion( $ns1, $ns2 ) {
- $this->assertConditions(
- array( # expected
- #0 => "rc_timestamp >= '20110223000000'",
- 'rc_bot' => 0,
- 1 => sprintf( "(rc_namespace != '%s' AND rc_namespace != '%s')", $ns1, $ns2 ),
- ),
- array(
- 'namespace' => $ns1,
- 'associated' => 1,
- 'invert' => 1,
- ),
- "rc conditions with namespace inverted"
- );
- }
-
- /**
- * Provides associated namespaces to test recent changes
- * namespaces association filtering.
- */
- public function provideNamespacesAssociations() {
- return array( # (NS => Associated_NS)
- array( NS_MAIN, NS_TALK),
- array( NS_TALK, NS_MAIN),
- );
- }
-
-}
-
-
diff --git a/tests/phpunit/includes/specials/SpecialSearchTest.php b/tests/phpunit/includes/specials/SpecialSearchTest.php
deleted file mode 100644
index 20e42a68..00000000
--- a/tests/phpunit/includes/specials/SpecialSearchTest.php
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php
-/**
- * Test class for SpecialSearch class
- * Copyright © 2012, Antoine Musso
- *
- * @author Antoine Musso
- * @group Database
- */
-
-class SpecialSearchTest extends MediaWikiTestCase {
- private $search;
-
- function setUp() { }
- function tearDown() { }
-
- /**
- * @covers SpecialSearch::load
- * @dataProvider provideSearchOptionsTests
- * @param $requested Array Request parameters. For example array( 'ns5' => true, 'ns6' => true). NULL to use default options.
- * @param $userOptions Array User options to test with. For example array('searchNs5' => 1 );. NULL to use default options.
- * @param $expectedProfile An expected search profile name
- * @param $expectedNs Array Expected namespaces
- */
- function testProfileAndNamespaceLoading(
- $requested, $userOptions, $expectedProfile, $expectedNS,
- $message = 'Profile name and namespaces mismatches!'
- ) {
- $context = new RequestContext;
- $context->setUser(
- $this->newUserWithSearchNS( $userOptions )
- );
- /*
- $context->setRequest( new FauxRequest( array(
- 'ns5'=>true,
- 'ns6'=>true,
- ) ));
- */
- $context->setRequest( new FauxRequest( $requested ));
- $search = new SpecialSearch();
- $search->setContext( $context );
- $search->load();
-
- /**
- * Verify profile name and namespace in the same assertion to make
- * sure we will be able to fully compare the above code. PHPUnit stop
- * after an assertion fail.
- */
- $this->assertEquals(
- array( /** Expected: */
- 'ProfileName' => $expectedProfile,
- 'Namespaces' => $expectedNS,
- )
- , array( /** Actual: */
- 'ProfileName' => $search->getProfile(),
- 'Namespaces' => $search->getNamespaces(),
- )
- , $message
- );
-
- }
-
- function provideSearchOptionsTests() {
- $defaultNS = SearchEngine::defaultNamespaces();
- $EMPTY_REQUEST = array();
- $NO_USER_PREF = null;
-
- return array(
- /**
- * Parameters:
- * <Web Request>, <User options>
- * Followed by expected values:
- * <ProfileName>, <NSList>
- * Then an optional message.
- */
- array(
- $EMPTY_REQUEST, $NO_USER_PREF,
- 'default', $defaultNS,
- 'Bug 33270: No request nor user preferences should give default profile'
- ),
- array(
- array( 'ns5' => 1 ), $NO_USER_PREF,
- 'advanced', array( 5),
- 'Web request with specific NS should override user preference'
- ),
- array(
- $EMPTY_REQUEST, array( 'searchNs2' => 1, 'searchNs14' => 1 ),
- 'advanced', array( 2, 14 ),
- 'Bug 33583: search with no option should honor User search preferences'
- ),
- array(
- $EMPTY_REQUEST, array_fill_keys( array_map( function( $ns ) {
- return "searchNs$ns";
- }, $defaultNS ), 0 ) + array( 'searchNs2' => 1, 'searchNs14' => 1 ),
- 'advanced', array( 2, 14 ),
- 'Bug 33583: search with no option should honor User search preferences'
- . 'and have all other namespace disabled'
- ),
- );
- }
-
- /**
- * Helper to create a new User object with given options
- * User remains anonymous though
- */
- function newUserWithSearchNS( $opt = null ) {
- $u = User::newFromId(0);
- if( $opt === null ) {
- return $u;
- }
- foreach($opt as $name => $value) {
- $u->setOption( $name, $value );
- }
- return $u;
- }
-}
-
diff --git a/tests/phpunit/includes/upload/UploadFromUrlTest.php b/tests/phpunit/includes/upload/UploadFromUrlTest.php
deleted file mode 100644
index f66c387b..00000000
--- a/tests/phpunit/includes/upload/UploadFromUrlTest.php
+++ /dev/null
@@ -1,351 +0,0 @@
-<?php
-
-/**
- * @group Broken
- * @group Upload
- */
-class UploadFromUrlTest extends ApiTestCase {
-
- public function setUp() {
- global $wgEnableUploads, $wgAllowCopyUploads, $wgAllowAsyncCopyUploads;
- parent::setUp();
-
- $wgEnableUploads = true;
- $wgAllowCopyUploads = true;
- $wgAllowAsyncCopyUploads = true;
- wfSetupSession();
-
- if ( wfLocalFile( 'UploadFromUrlTest.png' )->exists() ) {
- $this->deleteFile( 'UploadFromUrlTest.png' );
- }
- }
-
- protected function doApiRequest( Array $params, Array $unused = null, $appendModule = false, User $user = null ) {
- $sessionId = session_id();
- session_write_close();
-
- $req = new FauxRequest( $params, true, $_SESSION );
- $module = new ApiMain( $req, true );
- $module->execute();
-
- wfSetupSession( $sessionId );
- return array( $module->getResultData(), $req );
- }
-
- /**
- * Ensure that the job queue is empty before continuing
- */
- public function testClearQueue() {
- $job = Job::pop();
- while ( $job ) {
- $job = Job::pop();
- }
- $this->assertFalse( $job );
- }
-
- /**
- * @todo Document why we test login, since the $wgUser hack used doesn't
- * require login
- */
- public function testLogin() {
- $data = $this->doApiRequest( array(
- 'action' => 'login',
- 'lgname' => $this->user->userName,
- 'lgpassword' => $this->user->passWord ) );
- $this->assertArrayHasKey( "login", $data[0] );
- $this->assertArrayHasKey( "result", $data[0]['login'] );
- $this->assertEquals( "NeedToken", $data[0]['login']['result'] );
- $token = $data[0]['login']['token'];
-
- $data = $this->doApiRequest( array(
- 'action' => 'login',
- "lgtoken" => $token,
- 'lgname' => $this->user->userName,
- 'lgpassword' => $this->user->passWord ) );
-
- $this->assertArrayHasKey( "login", $data[0] );
- $this->assertArrayHasKey( "result", $data[0]['login'] );
- $this->assertEquals( "Success", $data[0]['login']['result'] );
- $this->assertArrayHasKey( 'lgtoken', $data[0]['login'] );
-
- return $data;
- }
-
- /**
- * @depends testLogin
- * @depends testClearQueue
- */
- public function testSetupUrlDownload( $data ) {
- $token = $this->user->getEditToken();
- $exception = false;
-
- try {
- $this->doApiRequest( array(
- 'action' => 'upload',
- ) );
- } catch ( UsageException $e ) {
- $exception = true;
- $this->assertEquals( "The token parameter must be set", $e->getMessage() );
- }
- $this->assertTrue( $exception, "Got exception" );
-
- $exception = false;
- try {
- $this->doApiRequest( array(
- 'action' => 'upload',
- 'token' => $token,
- ), $data );
- } catch ( UsageException $e ) {
- $exception = true;
- $this->assertEquals( "One of the parameters sessionkey, file, url, statuskey is required",
- $e->getMessage() );
- }
- $this->assertTrue( $exception, "Got exception" );
-
- $exception = false;
- try {
- $this->doApiRequest( array(
- 'action' => 'upload',
- 'url' => 'http://www.example.com/test.png',
- 'token' => $token,
- ), $data );
- } catch ( UsageException $e ) {
- $exception = true;
- $this->assertEquals( "The filename parameter must be set", $e->getMessage() );
- }
- $this->assertTrue( $exception, "Got exception" );
-
- $this->user->removeGroup( 'sysop' );
- $exception = false;
- try {
- $this->doApiRequest( array(
- 'action' => 'upload',
- 'url' => 'http://www.example.com/test.png',
- 'filename' => 'UploadFromUrlTest.png',
- 'token' => $token,
- ), $data );
- } catch ( UsageException $e ) {
- $exception = true;
- $this->assertEquals( "Permission denied", $e->getMessage() );
- }
- $this->assertTrue( $exception, "Got exception" );
-
- $this->user->addGroup( 'sysop' );
- $data = $this->doApiRequest( array(
- 'action' => 'upload',
- 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
- 'asyncdownload' => 1,
- 'filename' => 'UploadFromUrlTest.png',
- 'token' => $token,
- ), $data );
-
- $this->assertEquals( $data[0]['upload']['result'], 'Queued', 'Queued upload' );
-
- $job = Job::pop();
- $this->assertThat( $job, $this->isInstanceOf( 'UploadFromUrlJob' ), 'Queued upload inserted' );
- }
-
- /**
- * @depends testLogin
- * @depends testClearQueue
- */
- public function testAsyncUpload( $data ) {
- $token = $this->user->getEditToken();
-
- $this->user->addGroup( 'users' );
-
- $data = $this->doAsyncUpload( $token, true );
- $this->assertEquals( $data[0]['upload']['result'], 'Success' );
- $this->assertEquals( $data[0]['upload']['filename'], 'UploadFromUrlTest.png' );
- $this->assertTrue( wfLocalFile( $data[0]['upload']['filename'] )->exists() );
-
- $this->deleteFile( 'UploadFromUrlTest.png' );
-
- return $data;
- }
-
- /**
- * @depends testLogin
- * @depends testClearQueue
- */
- public function testAsyncUploadWarning( $data ) {
- $token = $this->user->getEditToken();
-
- $this->user->addGroup( 'users' );
-
-
- $data = $this->doAsyncUpload( $token );
-
- $this->assertEquals( $data[0]['upload']['result'], 'Warning' );
- $this->assertTrue( isset( $data[0]['upload']['sessionkey'] ) );
-
- $data = $this->doApiRequest( array(
- 'action' => 'upload',
- 'sessionkey' => $data[0]['upload']['sessionkey'],
- 'filename' => 'UploadFromUrlTest.png',
- 'ignorewarnings' => 1,
- 'token' => $token,
- ) );
- $this->assertEquals( $data[0]['upload']['result'], 'Success' );
- $this->assertEquals( $data[0]['upload']['filename'], 'UploadFromUrlTest.png' );
- $this->assertTrue( wfLocalFile( $data[0]['upload']['filename'] )->exists() );
-
- $this->deleteFile( 'UploadFromUrlTest.png' );
-
- return $data;
- }
-
- /**
- * @depends testLogin
- * @depends testClearQueue
- */
- public function testSyncDownload( $data ) {
- $token = $this->user->getEditToken();
-
- $job = Job::pop();
- $this->assertFalse( $job, 'Starting with an empty jobqueue' );
-
- $this->user->addGroup( 'users' );
- $data = $this->doApiRequest( array(
- 'action' => 'upload',
- 'filename' => 'UploadFromUrlTest.png',
- 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
- 'ignorewarnings' => true,
- 'token' => $token,
- ), $data );
-
- $job = Job::pop();
- $this->assertFalse( $job );
-
- $this->assertEquals( 'Success', $data[0]['upload']['result'] );
- $this->deleteFile( 'UploadFromUrlTest.png' );
-
- return $data;
- }
-
- public function testLeaveMessage() {
- $token = $this->user->user->getEditToken();
-
- $talk = $this->user->user->getTalkPage();
- if ( $talk->exists() ) {
- $page = WikiPage::factory( $talk );
- $page->doDeleteArticle( '' );
- }
-
- $this->assertFalse( (bool)$talk->getArticleID( Title::GAID_FOR_UPDATE ), 'User talk does not exist' );
-
- $data = $this->doApiRequest( array(
- 'action' => 'upload',
- 'filename' => 'UploadFromUrlTest.png',
- 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
- 'asyncdownload' => 1,
- 'token' => $token,
- 'leavemessage' => 1,
- 'ignorewarnings' => 1,
- ) );
-
- $job = Job::pop();
- $this->assertEquals( 'UploadFromUrlJob', get_class( $job ) );
- $job->run();
-
- $this->assertTrue( wfLocalFile( 'UploadFromUrlTest.png' )->exists() );
- $this->assertTrue( (bool)$talk->getArticleID( Title::GAID_FOR_UPDATE ), 'User talk exists' );
-
- $this->deleteFile( 'UploadFromUrlTest.png' );
-
- $talkRev = Revision::newFromTitle( $talk );
- $talkSize = $talkRev->getSize();
-
- $exception = false;
- try {
- $data = $this->doApiRequest( array(
- 'action' => 'upload',
- 'filename' => 'UploadFromUrlTest.png',
- 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
- 'asyncdownload' => 1,
- 'token' => $token,
- 'leavemessage' => 1,
- ) );
- } catch ( UsageException $e ) {
- $exception = true;
- $this->assertEquals( 'Using leavemessage without ignorewarnings is not supported', $e->getMessage() );
- }
- $this->assertTrue( $exception );
-
- $job = Job::pop();
- $this->assertFalse( $job );
-
- return;
-
- /*
- // Broken until using leavemessage with ignorewarnings is supported
- $job->run();
-
- $this->assertFalse( wfLocalFile( 'UploadFromUrlTest.png' )->exists() );
-
- $talkRev = Revision::newFromTitle( $talk );
- $this->assertTrue( $talkRev->getSize() > $talkSize, 'New message left' );
- */
- }
-
- /**
- * Helper function to perform an async upload, execute the job and fetch
- * the status
- *
- * @return array The result of action=upload&statuskey=key
- */
- private function doAsyncUpload( $token, $ignoreWarnings = false, $leaveMessage = false ) {
- $params = array(
- 'action' => 'upload',
- 'filename' => 'UploadFromUrlTest.png',
- 'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
- 'asyncdownload' => 1,
- 'token' => $token,
- );
- if ( $ignoreWarnings ) {
- $params['ignorewarnings'] = 1;
- }
- if ( $leaveMessage ) {
- $params['leavemessage'] = 1;
- }
-
- $data = $this->doApiRequest( $params );
- $this->assertEquals( $data[0]['upload']['result'], 'Queued' );
- $this->assertTrue( isset( $data[0]['upload']['statuskey'] ) );
- $statusKey = $data[0]['upload']['statuskey'];
-
- $job = Job::pop();
- $this->assertEquals( 'UploadFromUrlJob', get_class( $job ) );
-
- $status = $job->run();
- $this->assertTrue( $status );
-
- $data = $this->doApiRequest( array(
- 'action' => 'upload',
- 'statuskey' => $statusKey,
- 'token' => $token,
- ) );
-
- return $data;
- }
-
-
- /**
- *
- */
- protected function deleteFile( $name ) {
- $t = Title::newFromText( $name, NS_FILE );
- $this->assertTrue($t->exists(), "File '$name' exists");
-
- if ( $t->exists() ) {
- $file = wfFindFile( $name, array( 'ignoreRedirect' => true ) );
- $empty = "";
- FileDeleteForm::doDelete( $t, $file, $empty, "none", true );
- $page = WikiPage::factory( $t );
- $page->doDeleteArticle( "testing" );
- }
- $t = Title::newFromText( $name, NS_FILE );
-
- $this->assertFalse($t->exists(), "File '$name' was deleted");
- }
- }
diff --git a/tests/phpunit/includes/upload/UploadStashTest.php b/tests/phpunit/includes/upload/UploadStashTest.php
deleted file mode 100644
index 66fafaaf..00000000
--- a/tests/phpunit/includes/upload/UploadStashTest.php
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-/**
- * @group Database
- */
-class UploadStashTest extends MediaWikiTestCase {
- /**
- * @var Array of UploadStashTestUser
- */
- public static $users;
-
- public function setUp() {
- parent::setUp();
-
- // Setup a file for bug 29408
- $this->bug29408File = __DIR__ . '/bug29408';
- file_put_contents( $this->bug29408File, "\x00" );
-
- self::$users = array(
- 'sysop' => new TestUser(
- 'Uploadstashtestsysop',
- 'Upload Stash Test Sysop',
- 'upload_stash_test_sysop@example.com',
- array( 'sysop' )
- ),
- 'uploader' => new TestUser(
- 'Uploadstashtestuser',
- 'Upload Stash Test User',
- 'upload_stash_test_user@example.com',
- array()
- )
- );
- }
-
- public function testBug29408() {
- global $wgUser;
- $wgUser = self::$users['uploader']->user;
-
- $repo = RepoGroup::singleton()->getLocalRepo();
- $stash = new UploadStash( $repo );
-
- // Throws exception caught by PHPUnit on failure
- $file = $stash->stashFile( $this->bug29408File );
- // We'll never reach this point if we hit bug 29408
- $this->assertTrue( true, 'Unrecognized file without extension' );
-
- $stash->removeFile( $file->getFileKey() );
- }
-
- public function testValidRequest() {
- $request = new FauxRequest( array( 'wpFileKey' => 'foo') );
- $this->assertFalse( UploadFromStash::isValidRequest($request), 'Check failure on bad wpFileKey' );
-
- $request = new FauxRequest( array( 'wpSessionKey' => 'foo') );
- $this->assertFalse( UploadFromStash::isValidRequest($request), 'Check failure on bad wpSessionKey' );
-
- $request = new FauxRequest( array( 'wpFileKey' => 'testkey-test.test') );
- $this->assertTrue( UploadFromStash::isValidRequest($request), 'Check good wpFileKey' );
-
- $request = new FauxRequest( array( 'wpFileKey' => 'testkey-test.test') );
- $this->assertTrue( UploadFromStash::isValidRequest($request), 'Check good wpSessionKey' );
-
- $request = new FauxRequest( array( 'wpFileKey' => 'testkey-test.test', 'wpSessionKey' => 'foo') );
- $this->assertTrue( UploadFromStash::isValidRequest($request), 'Check key precedence' );
- }
-
- public function tearDown() {
- parent::tearDown();
-
- if( file_exists( $this->bug29408File . "." ) ) {
- unlink( $this->bug29408File . "." );
- }
-
- if( file_exists( $this->bug29408File ) ) {
- unlink( $this->bug29408File );
- }
- }
-}
diff --git a/tests/phpunit/includes/upload/UploadTest.php b/tests/phpunit/includes/upload/UploadTest.php
deleted file mode 100644
index 6948f5b1..00000000
--- a/tests/phpunit/includes/upload/UploadTest.php
+++ /dev/null
@@ -1,141 +0,0 @@
-<?php
-/**
- * @group Upload
- */
-class UploadTest extends MediaWikiTestCase {
- protected $upload;
-
-
- function setUp() {
- global $wgHooks;
- parent::setUp();
-
- $this->upload = new UploadTestHandler;
- $this->hooks = $wgHooks;
- $wgHooks['InterwikiLoadPrefix'][] = function( $prefix, &$data ) {
- return false;
- };
- }
-
- function tearDown() {
- global $wgHooks;
- $wgHooks = $this->hooks;
- }
-
-
- /**
- * First checks the return code
- * of UploadBase::getTitle() and then the actual returned title
- *
- * @dataProvider dataTestTitleValidation
- */
- public function testTitleValidation( $srcFilename, $dstFilename, $code, $msg ) {
- /* Check the result code */
- $this->assertEquals( $code,
- $this->upload->testTitleValidation( $srcFilename ),
- "$msg code" );
-
- /* If we expect a valid title, check the title itself. */
- if ( $code == UploadBase::OK ) {
- $this->assertEquals( $dstFilename,
- $this->upload->getTitle()->getText(),
- "$msg text" );
- }
- }
-
- /**
- * Test various forms of valid and invalid titles that can be supplied.
- */
- public function dataTestTitleValidation() {
- return array(
- /* Test a valid title */
- array( 'ValidTitle.jpg', 'ValidTitle.jpg', UploadBase::OK,
- 'upload valid title' ),
- /* A title with a slash */
- array( 'A/B.jpg', 'B.jpg', UploadBase::OK,
- 'upload title with slash' ),
- /* A title with illegal char */
- array( 'A:B.jpg', 'A-B.jpg', UploadBase::OK,
- 'upload title with colon' ),
- /* Stripping leading File: prefix */
- array( 'File:C.jpg', 'C.jpg', UploadBase::OK,
- 'upload title with File prefix' ),
- /* Test illegal suggested title (r94601) */
- array( '%281%29.JPG', null, UploadBase::ILLEGAL_FILENAME,
- 'illegal title for upload' ),
- /* A title without extension */
- array( 'A', null, UploadBase::FILETYPE_MISSING,
- 'upload title without extension' ),
- /* A title with no basename */
- array( '.jpg', null, UploadBase::MIN_LENGTH_PARTNAME,
- 'upload title without basename' ),
- /* A title that is longer than 255 bytes */
- array( str_repeat( 'a', 255 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG,
- 'upload title longer than 255 bytes' ),
- /* A title that is longer than 240 bytes */
- array( str_repeat( 'a', 240 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG,
- 'upload title longer than 240 bytes' ),
- );
- }
-
- /**
- * Test the upload verification functions
- */
- public function testVerifyUpload() {
- /* Setup with zero file size */
- $this->upload->initializePathInfo( '', '', 0 );
- $result = $this->upload->verifyUpload();
- $this->assertEquals( UploadBase::EMPTY_FILE,
- $result['status'],
- 'upload empty file' );
- }
-
- // Helper used to create an empty file of size $size.
- private function createFileOfSize( $size ) {
- $filename = tempnam( wfTempDir(), "mwuploadtest" );
-
- $fh = fopen( $filename, 'w' );
- ftruncate( $fh, $size );
- fclose( $fh );
-
- return $filename;
- }
-
- /**
- * test uploading a 100 bytes file with $wgMaxUploadSize = 100
- *
- * This method should be abstracted so we can test different settings.
- */
-
- public function testMaxUploadSize() {
- global $wgMaxUploadSize;
- $savedGlobal = $wgMaxUploadSize; // save global
- global $wgFileExtensions;
- $wgFileExtensions[] = 'txt';
-
- $wgMaxUploadSize = 100;
-
- $filename = $this->createFileOfSize( $wgMaxUploadSize );
- $this->upload->initializePathInfo( basename($filename) . '.txt', $filename, 100 );
- $result = $this->upload->verifyUpload();
- unlink( $filename );
-
- $this->assertEquals(
- array( 'status' => UploadBase::OK ), $result );
-
- $wgMaxUploadSize = $savedGlobal; // restore global
- }
-}
-
-class UploadTestHandler extends UploadBase {
- public function initializeFromRequest( &$request ) { }
- public function testTitleValidation( $name ) {
- $this->mTitle = false;
- $this->mDesiredDestName = $name;
- $this->mTitleError = UploadBase::OK;
- $this->getTitle();
- return $this->mTitleError;
- }
-
-
-}
diff --git a/tests/phpunit/install-phpunit.sh b/tests/phpunit/install-phpunit.sh
deleted file mode 100644
index 2d2b53ab..00000000
--- a/tests/phpunit/install-phpunit.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/sh
-
-has_binary () {
- if [ -z `which $1` ]; then
- return 1
- fi
- return 0
-}
-
-if [ `id -u` -ne 0 ]; then
- echo '*** ERROR' Must be root to run
- exit 1
-fi
-
-if ( has_binary phpunit ); then
- echo PHPUnit already installed
-else if ( has_binary pear ); then
- echo Installing phpunit with pear
- pear channel-discover pear.phpunit.de
- pear channel-discover components.ez.no
- pear channel-discover pear.symfony-project.com
- pear install phpunit/PHPUnit
-else if ( has_binary apt-get ); then
- echo Installing phpunit with apt-get
- apt-get install phpunit
-else if ( has_binary yum ); then
- echo Installing phpunit with yum
- yum install phpunit
-else if ( has_binary port ); then
- echo Installing phpunit with macports
- port install php5-unit
-fi
-fi
-fi
-fi
-fi
diff --git a/tests/phpunit/languages/LanguageAmTest.php b/tests/phpunit/languages/LanguageAmTest.php
deleted file mode 100644
index 3a648ded..00000000
--- a/tests/phpunit/languages/LanguageAmTest.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageAm.php */
-class LanguageAmTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Am' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePlural() {
- return array (
- array( 'one', 0 ),
- array( 'one', 1 ),
- array( 'other', 2 ),
- array( 'other', 200 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageArTest.php b/tests/phpunit/languages/LanguageArTest.php
deleted file mode 100644
index b23e0534..00000000
--- a/tests/phpunit/languages/LanguageArTest.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-/**
- * Based on LanguagMlTest
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageAr.php */
-class LanguageArTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Ar' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- function testFormatNum() {
- $this->assertEquals( '١٬٢٣٤٬٥٦٧', $this->lang->formatNum( '1234567' ) );
- $this->assertEquals( '-١٢٫٨٩', $this->lang->formatNum( -12.89 ) );
- }
-
- /**
- * Mostly to test the raw ascii feature.
- * @dataProvider providerSprintfDate
- */
- function testSprintfDate( $format, $date, $expected ) {
- $this->assertEquals( $expected, $this->lang->sprintfDate( $format, $date ) );
- }
-
- function providerSprintfDate() {
- return array(
- array(
- 'xg "vs" g',
- '20120102030410',
- 'يناير vs ٣'
- ),
- array(
- 'xmY',
- '20120102030410',
- '١٤٣٣'
- ),
- array(
- 'xnxmY',
- '20120102030410',
- '1433'
- ),
- array(
- 'xN xmj xmn xN xmY',
- '20120102030410',
- ' 7 2 ١٤٣٣'
- ),
- );
- }
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
- $forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
- function providePlural() {
- return array (
- array( 'zero', 0 ),
- array( 'one', 1 ),
- array( 'two', 2 ),
- array( 'few', 3 ),
- array( 'few', 9 ),
- array( 'few', 110 ),
- array( 'many', 11 ),
- array( 'many', 15 ),
- array( 'many', 99 ),
- array( 'many', 9999 ),
- array( 'other', 100 ),
- array( 'other', 102 ),
- array( 'other', 1000 ),
- array( 'other', 1.7 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageBeTest.php b/tests/phpunit/languages/LanguageBeTest.php
deleted file mode 100644
index 735ccc63..00000000
--- a/tests/phpunit/languages/LanguageBeTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageBe.php */
-class LanguageBeTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Be' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'few', 'many', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePlural() {
- return array (
- array( 'one', 1 ),
- array( 'many', 11 ),
- array( 'one', 91 ),
- array( 'one', 121 ),
- array( 'few', 2 ),
- array( 'few', 3 ),
- array( 'few', 4 ),
- array( 'few', 334 ),
- array( 'many', 5 ),
- array( 'many', 15 ),
- array( 'many', 120 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageBe_taraskTest.php b/tests/phpunit/languages/LanguageBe_taraskTest.php
deleted file mode 100644
index 765cdb8f..00000000
--- a/tests/phpunit/languages/LanguageBe_taraskTest.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-class LanguageBeTaraskTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Be-tarask' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** see bug 23156 & r64981 */
- function testSearchRightSingleQuotationMarkAsApostroph() {
- $this->assertEquals(
- "'",
- $this->lang->normalizeForSearch( '’' ),
- 'bug 23156: U+2019 conversion to U+0027'
- );
- }
- /** see bug 23156 & r64981 */
- function testCommafy() {
- $this->assertEquals( '1,234,567', $this->lang->commafy( '1234567' ) );
- $this->assertEquals( '12,345', $this->lang->commafy( '12345' ) );
- }
- /** see bug 23156 & r64981 */
- function testDoesNotCommafyFourDigitsNumber() {
- $this->assertEquals( '1234', $this->lang->commafy( '1234' ) );
- }
- /** @dataProvider providePluralFourForms */
- function testPluralFourForms( $result, $value ) {
- $forms = array( 'one', 'few', 'many', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePluralFourForms() {
- return array (
- array( 'one', 1 ),
- array( 'many', 11 ),
- array( 'one', 91 ),
- array( 'one', 121 ),
- array( 'few', 2 ),
- array( 'few', 3 ),
- array( 'few', 4 ),
- array( 'few', 334 ),
- array( 'many', 5 ),
- array( 'many', 15 ),
- array( 'many', 120 ),
- );
- }
- /** @dataProvider providePluralTwoForms */
- function testPluralTwoForms( $result, $value ) {
- $forms = array( 'one', 'several' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
- function providePluralTwoForms() {
- return array (
- array( 'one', 1 ),
- array( 'several', 11 ),
- array( 'several', 91 ),
- array( 'several', 121 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageBhTest.php b/tests/phpunit/languages/LanguageBhTest.php
deleted file mode 100644
index e1e2a13e..00000000
--- a/tests/phpunit/languages/LanguageBhTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageBh.php */
-class LanguageBhTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Bh' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePlural() {
- return array (
- array( 'one', 0 ),
- array( 'one', 1 ),
- array( 'other', 2 ),
- array( 'other', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageBsTest.php b/tests/phpunit/languages/LanguageBsTest.php
deleted file mode 100644
index b6631c03..00000000
--- a/tests/phpunit/languages/LanguageBsTest.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageBs.php */
-class LanguageBsTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Bs' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'few', 'many', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePlural() {
- return array (
- array( 'many', 0 ),
- array( 'one', 1 ),
- array( 'few', 2 ),
- array( 'few', 4 ),
- array( 'many', 5 ),
- array( 'many', 11 ),
- array( 'many', 20 ),
- array( 'one', 21 ),
- array( 'few', 24 ),
- array( 'many', 25 ),
- array( 'many', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageCsTest.php b/tests/phpunit/languages/LanguageCsTest.php
deleted file mode 100644
index dda29f9a..00000000
--- a/tests/phpunit/languages/LanguageCsTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/Languagecs.php */
-class LanguageCsTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'cs' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'few', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'few', 2 ),
- array( 'few', 3 ),
- array( 'few', 4 ),
- array( 'other', 5 ),
- array( 'other', 11 ),
- array( 'other', 20 ),
- array( 'other', 25 ),
- array( 'other', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageCuTest.php b/tests/phpunit/languages/LanguageCuTest.php
deleted file mode 100644
index f8186d7b..00000000
--- a/tests/phpunit/languages/LanguageCuTest.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageCu.php */
-class LanguageCuTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'cu' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'few', 'many', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'few', 2 ),
- array( 'many', 3 ),
- array( 'many', 4 ),
- array( 'other', 5 ),
- array( 'one', 11 ),
- array( 'other', 20 ),
- array( 'few', 22 ),
- array( 'many', 223 ),
- array( 'other', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageCyTest.php b/tests/phpunit/languages/LanguageCyTest.php
deleted file mode 100644
index e9f9e410..00000000
--- a/tests/phpunit/languages/LanguageCyTest.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageCy.php */
-class LanguageCyTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'cy' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'zero', 0 ),
- array( 'one', 1 ),
- array( 'two', 2 ),
- array( 'few', 3 ),
- array( 'many', 6 ),
- array( 'other', 4 ),
- array( 'other', 5 ),
- array( 'other', 11 ),
- array( 'other', 20 ),
- array( 'other', 22 ),
- array( 'other', 223 ),
- array( 'other', 200.00 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageDsbTest.php b/tests/phpunit/languages/LanguageDsbTest.php
deleted file mode 100644
index ab7f9313..00000000
--- a/tests/phpunit/languages/LanguageDsbTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageDsb.php */
-class LanguageDsbTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'dsb' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'two', 'few', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePlural() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'one', 101 ),
- array( 'one', 90001 ),
- array( 'two', 2 ),
- array( 'few', 3 ),
- array( 'few', 203 ),
- array( 'few', 4 ),
- array( 'other', 99 ),
- array( 'other', 555 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageFrTest.php b/tests/phpunit/languages/LanguageFrTest.php
deleted file mode 100644
index 8538744e..00000000
--- a/tests/phpunit/languages/LanguageFrTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageFr.php */
-class LanguageFrTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'fr' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePlural() {
- return array (
- array( 'one', 0 ),
- array( 'one', 1 ),
- array( 'other', 2 ),
- array( 'other', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageGaTest.php b/tests/phpunit/languages/LanguageGaTest.php
deleted file mode 100644
index fbd9f11d..00000000
--- a/tests/phpunit/languages/LanguageGaTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageGa.php */
-class LanguageGaTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'ga' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'two', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'two', 2 ),
- array( 'other', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageGdTest.php b/tests/phpunit/languages/LanguageGdTest.php
deleted file mode 100644
index 24574bda..00000000
--- a/tests/phpunit/languages/LanguageGdTest.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageGd.php */
-class LanguageGdTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'gd' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- // The CLDR ticket for this plural forms is not same as mw plural forms. See http://unicode.org/cldr/trac/ticket/2883
- $forms = array( 'Form 1', 'Form 2', 'Form 3', 'Form 4', 'Form 5', 'Form 6' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
- function providerPlural() {
- return array (
- array( 'Form 6', 0 ),
- array( 'Form 1', 1 ),
- array( 'Form 2', 2 ),
- array( 'Form 3', 11 ),
- array( 'Form 4', 12 ),
- array( 'Form 5', 3 ),
- array( 'Form 5', 19 ),
- array( 'Form 6', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageGvTest.php b/tests/phpunit/languages/LanguageGvTest.php
deleted file mode 100644
index 3d298b9b..00000000
--- a/tests/phpunit/languages/LanguageGvTest.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageGv.php */
-class LanguageGvTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'gv' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- // This is not compatible with CLDR plural rules http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#gv
- $forms = array( 'Form 1', 'Form 2', 'Form 3', 'Form 4' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
- function providerPlural() {
- return array (
- array( 'Form 4', 0 ),
- array( 'Form 2', 1 ),
- array( 'Form 3', 2 ),
- array( 'Form 4', 3 ),
- array( 'Form 1', 20 ),
- array( 'Form 2', 21 ),
- array( 'Form 3', 22 ),
- array( 'Form 4', 23 ),
- array( 'Form 4', 50 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageHeTest.php b/tests/phpunit/languages/LanguageHeTest.php
deleted file mode 100644
index 7833da71..00000000
--- a/tests/phpunit/languages/LanguageHeTest.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageHe.php */
-class LanguageHeTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'he' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPluralDual */
- function testPluralDual( $result, $value ) {
- $forms = array( 'one', 'two', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPluralDual() {
- return array (
- array( 'other', 0 ), // Zero -> plural
- array( 'one', 1 ), // Singular
- array( 'two', 2 ), // Dual
- array( 'other', 3 ), // Plural
- );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'other', 0 ), // Zero -> plural
- array( 'one', 1 ), // Singular
- array( 'other', 2 ), // Plural, no dual provided
- array( 'other', 3 ), // Plural
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageHiTest.php b/tests/phpunit/languages/LanguageHiTest.php
deleted file mode 100644
index ead9e020..00000000
--- a/tests/phpunit/languages/LanguageHiTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageHi.php */
-class LanguageHiTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Hi' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePlural() {
- return array (
- array( 'one', 0 ),
- array( 'one', 1 ),
- array( 'other', 2 ),
- array( 'other', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageHrTest.php b/tests/phpunit/languages/LanguageHrTest.php
deleted file mode 100644
index 4f1c66bf..00000000
--- a/tests/phpunit/languages/LanguageHrTest.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageHr.php */
-class LanguageHrTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'hr' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'few', 'many', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'many', 0 ),
- array( 'one', 1 ),
- array( 'few', 2 ),
- array( 'few', 4 ),
- array( 'many', 5 ),
- array( 'many', 11 ),
- array( 'many', 20 ),
- array( 'one', 21 ),
- array( 'few', 24 ),
- array( 'many', 25 ),
- array( 'many', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageHsbTest.php b/tests/phpunit/languages/LanguageHsbTest.php
deleted file mode 100644
index 803c7721..00000000
--- a/tests/phpunit/languages/LanguageHsbTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageHsb.php */
-class LanguageHsbTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'hsb' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'two', 'few', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePlural() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'one', 101 ),
- array( 'one', 90001 ),
- array( 'two', 2 ),
- array( 'few', 3 ),
- array( 'few', 203 ),
- array( 'few', 4 ),
- array( 'other', 99 ),
- array( 'other', 555 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageHuTest.php b/tests/phpunit/languages/LanguageHuTest.php
deleted file mode 100644
index adbd37ec..00000000
--- a/tests/phpunit/languages/LanguageHuTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageHu.php */
-class LanguageHuTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Hu' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePlural() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'other', 2 ),
- array( 'other', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageHyTest.php b/tests/phpunit/languages/LanguageHyTest.php
deleted file mode 100644
index 7990bdfc..00000000
--- a/tests/phpunit/languages/LanguageHyTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageHy.php */
-class LanguageHyTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'hy' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'one', 0 ),
- array( 'one', 1 ),
- array( 'other', 2 ),
- array( 'other', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageKshTest.php b/tests/phpunit/languages/LanguageKshTest.php
deleted file mode 100644
index ab889464..00000000
--- a/tests/phpunit/languages/LanguageKshTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageKsh.php */
-class LanguageKshTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'ksh' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other', 'zero' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'zero', 0 ),
- array( 'one', 1 ),
- array( 'other', 2 ),
- array( 'other', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageLnTest.php b/tests/phpunit/languages/LanguageLnTest.php
deleted file mode 100644
index 0fd9167e..00000000
--- a/tests/phpunit/languages/LanguageLnTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageLn.php */
-class LanguageLnTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'ln' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePlural() {
- return array (
- array( 'one', 0 ),
- array( 'one', 1 ),
- array( 'other', 2 ),
- array( 'other', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageLtTest.php b/tests/phpunit/languages/LanguageLtTest.php
deleted file mode 100644
index 0d7c7d3e..00000000
--- a/tests/phpunit/languages/LanguageLtTest.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageLt.php */
-class LanguageLtTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Lt' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider provideOneFewOtherCases */
- function testOneFewOtherPlural( $result, $value ) {
- $forms = array( 'one', 'few', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- /** @dataProvider provideOneFewCases */
- function testOneFewPlural( $result, $value ) {
- $forms = array( 'one', 'few' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function provideOneFewOtherCases() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'few', 2 ),
- array( 'few', 9 ),
- array( 'other', 10 ),
- array( 'other', 11 ),
- array( 'other', 20 ),
- array( 'one', 21 ),
- array( 'few', 32 ),
- array( 'one', 41 ),
- array( 'one', 40001 ),
- );
- }
-
- function provideOneFewCases() {
- return array (
- array( 'one', 1 ),
- array( 'few', 15 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageLvTest.php b/tests/phpunit/languages/LanguageLvTest.php
deleted file mode 100644
index 0636da5f..00000000
--- a/tests/phpunit/languages/LanguageLvTest.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageLv.php */
-class LanguageLvTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'lv' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'other', 0 ), #this must be zero form as per CLDR
- array( 'one', 1 ),
- array( 'other', 11 ),
- array( 'one', 21 ),
- array( 'other', 411 ),
- array( 'other', 12.345 ),
- array( 'other', 20 ),
- array( 'one', 31 ),
- array( 'other', 200 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageMgTest.php b/tests/phpunit/languages/LanguageMgTest.php
deleted file mode 100644
index 06b56547..00000000
--- a/tests/phpunit/languages/LanguageMgTest.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageMg.php */
-class LanguageMgTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'mg' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePlural() {
- return array (
- array( 'one', 0 ),
- array( 'one', 1 ),
- array( 'other', 2 ),
- array( 'other', 200 ),
- array( 'other', 123.3434 ),
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageMkTest.php b/tests/phpunit/languages/LanguageMkTest.php
deleted file mode 100644
index cf5ec3d9..00000000
--- a/tests/phpunit/languages/LanguageMkTest.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageMk.php */
-class LanguageMkTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'mk' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
-
- function providerPlural() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'other', 11 ),
- array( 'one', 21 ),
- array( 'other', 411 ),
- array( 'other', 12.345 ),
- array( 'other', 20 ),
- array( 'one', 31 ),
- array( 'other', 200 ),
- );
- }
-
-
-}
diff --git a/tests/phpunit/languages/LanguageMlTest.php b/tests/phpunit/languages/LanguageMlTest.php
deleted file mode 100644
index 8c4b0b2f..00000000
--- a/tests/phpunit/languages/LanguageMlTest.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2011, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageMl.php */
-class LanguageMlTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Ml' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** see bug 29495 */
- /** @dataProvider providerFormatNum*/
- function testFormatNum( $result, $value ) {
- $this->assertEquals( $result, $this->lang->formatNum( $value ) );
- }
-
- function providerFormatNum() {
- return array(
- array( '12,34,567', '1234567' ),
- array( '12,345', '12345' ),
- array( '1', '1' ),
- array( '123', '123' ) ,
- array( '1,234', '1234' ),
- array( '12,345.56', '12345.56' ),
- array( '12,34,56,79,81,23,45,678', '12345679812345678' ),
- array( '.12345', '.12345' ),
- array( '-12,00,000', '-1200000' ),
- array( '-98', '-98' ),
- array( '-98', -98 ),
- array( '-1,23,45,678', -12345678 ),
- array( '', '' ),
- array( '', null ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageMoTest.php b/tests/phpunit/languages/LanguageMoTest.php
deleted file mode 100644
index 533e590f..00000000
--- a/tests/phpunit/languages/LanguageMoTest.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageMo.php */
-class LanguageMoTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'mo' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'few', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'few', 0 ),
- array( 'one', 1 ),
- array( 'few', 2 ),
- array( 'few', 19 ),
- array( 'other', 20 ),
- array( 'other', 99 ),
- array( 'other', 100 ),
- array( 'few', 101 ),
- array( 'few', 119 ),
- array( 'other', 120 ),
- array( 'other', 200 ),
- array( 'few', 201 ),
- array( 'few', 219 ),
- array( 'other', 220 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageMtTest.php b/tests/phpunit/languages/LanguageMtTest.php
deleted file mode 100644
index 421bb388..00000000
--- a/tests/phpunit/languages/LanguageMtTest.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageMt.php */
-class LanguageMtTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'mt' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPluralAllForms */
- function testPluralAllForms( $result, $value ) {
- $forms = array( 'one', 'few', 'many', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPluralAllForms() {
- return array (
- array( 'few', 0 ),
- array( 'one', 1 ),
- array( 'few', 2 ),
- array( 'few', 10 ),
- array( 'many', 11 ),
- array( 'many', 19 ),
- array( 'other', 20 ),
- array( 'other', 99 ),
- array( 'other', 100 ),
- array( 'other', 101 ),
- array( 'few', 102 ),
- array( 'few', 110 ),
- array( 'many', 111 ),
- array( 'many', 119 ),
- array( 'other', 120 ),
- array( 'other', 201 ),
- );
- }
-
- /** @dataProvider providerPluralTwoForms */
- function testPluralTwoForms( $result, $value ) {
- $forms = array( 'one', 'many' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPluralTwoForms() {
- return array (
- array( 'many', 0 ),
- array( 'one', 1 ),
- array( 'many', 2 ),
- array( 'many', 10 ),
- array( 'many', 11 ),
- array( 'many', 19 ),
- array( 'many', 20 ),
- array( 'many', 99 ),
- array( 'many', 100 ),
- array( 'many', 101 ),
- array( 'many', 102 ),
- array( 'many', 110 ),
- array( 'many', 111 ),
- array( 'many', 119 ),
- array( 'many', 120 ),
- array( 'many', 201 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageNlTest.php b/tests/phpunit/languages/LanguageNlTest.php
deleted file mode 100644
index cf979cd2..00000000
--- a/tests/phpunit/languages/LanguageNlTest.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2011, Santhosh Thottingal
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageNl.php */
-class LanguageNlTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Nl' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- function testFormatNum() {
- $this->assertEquals( '1.234.567', $this->lang->formatNum( '1234567' ) );
- $this->assertEquals( '12.345', $this->lang->formatNum( '12345' ) );
- $this->assertEquals( '1', $this->lang->formatNum( '1' ) );
- $this->assertEquals( '123', $this->lang->formatNum( '123' ) );
- $this->assertEquals( '1.234', $this->lang->formatNum( '1234' ) );
- $this->assertEquals( '12.345,56', $this->lang->formatNum( '12345.56' ) );
- $this->assertEquals( ',1234556', $this->lang->formatNum( '.1234556' ) );
- }
-}
diff --git a/tests/phpunit/languages/LanguageNsoTest.php b/tests/phpunit/languages/LanguageNsoTest.php
deleted file mode 100644
index ea393628..00000000
--- a/tests/phpunit/languages/LanguageNsoTest.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageNso.php */
-class LanguageNsoTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'nso' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'many' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'one', 0 ),
- array( 'one', 1 ),
- array( 'many', 2 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguagePlTest.php b/tests/phpunit/languages/LanguagePlTest.php
deleted file mode 100644
index e56d4b77..00000000
--- a/tests/phpunit/languages/LanguagePlTest.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguagePl.php */
-class LanguagePlTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'pl' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPluralFourForms */
- function testPluralFourForms( $result, $value ) {
- $forms = array( 'one', 'few', 'many' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPluralFourForms() {
- return array (
- array( 'many', 0 ),
- array( 'one', 1 ),
- array( 'few', 2 ),
- array( 'few', 3 ),
- array( 'few', 4 ),
- array( 'many', 5 ),
- array( 'many', 9 ),
- array( 'many', 10 ),
- array( 'many', 11 ),
- array( 'many', 21 ),
- array( 'few', 22 ),
- array( 'few', 23 ),
- array( 'few', 24 ),
- array( 'many', 25 ),
- array( 'many', 200 ),
- array( 'many', 201 ),
- );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'many' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'many', 0 ),
- array( 'one', 1 ),
- array( 'many', 2 ),
- array( 'many', 3 ),
- array( 'many', 4 ),
- array( 'many', 5 ),
- array( 'many', 9 ),
- array( 'many', 10 ),
- array( 'many', 11 ),
- array( 'many', 21 ),
- array( 'many', 22 ),
- array( 'many', 23 ),
- array( 'many', 24 ),
- array( 'many', 25 ),
- array( 'many', 200 ),
- array( 'many', 201 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageRoTest.php b/tests/phpunit/languages/LanguageRoTest.php
deleted file mode 100644
index 5270f6fe..00000000
--- a/tests/phpunit/languages/LanguageRoTest.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageRo.php */
-class LanguageRoTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'ro' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'few', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'few', 0 ),
- array( 'one', 1 ),
- array( 'few', 2 ),
- array( 'few', 19 ),
- array( 'other', 20 ),
- array( 'other', 99 ),
- array( 'other', 100 ),
- array( 'few', 101 ),
- array( 'few', 119 ),
- array( 'other', 120 ),
- array( 'other', 200 ),
- array( 'few', 201 ),
- array( 'few', 219 ),
- array( 'other', 220 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageRuTest.php b/tests/phpunit/languages/LanguageRuTest.php
deleted file mode 100644
index 7a1f193b..00000000
--- a/tests/phpunit/languages/LanguageRuTest.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * based on LanguageBe_tarask.php
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageRu.php */
-class LanguageRuTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'ru' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePluralFourForms */
- function testPluralFourForms( $result, $value ) {
- $forms = array( 'one', 'few', 'many', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePluralFourForms() {
- return array (
- array( 'one', 1 ),
- array( 'many', 11 ),
- array( 'one', 91 ),
- array( 'one', 121 ),
- array( 'few', 2 ),
- array( 'few', 3 ),
- array( 'few', 4 ),
- array( 'few', 334 ),
- array( 'many', 5 ),
- array( 'many', 15 ),
- array( 'many', 120 ),
- );
- }
- /** @dataProvider providePluralTwoForms */
- function testPluralTwoForms( $result, $value ) {
- $forms = array( 'one', 'several' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
- function providePluralTwoForms() {
- return array (
- array( 'one', 1 ),
- array( 'several', 11 ),
- array( 'several', 91 ),
- array( 'several', 121 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageSeTest.php b/tests/phpunit/languages/LanguageSeTest.php
deleted file mode 100644
index 065ec29e..00000000
--- a/tests/phpunit/languages/LanguageSeTest.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageSe.php */
-class LanguageSeTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'se' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPluralThreeForms */
- function testPluralThreeForms( $result, $value ) {
- $forms = array( 'one', 'two', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPluralThreeForms() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'two', 2 ),
- array( 'other', 3 ),
- );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'other', 2 ),
- array( 'other', 3 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageSgsTest.php b/tests/phpunit/languages/LanguageSgsTest.php
deleted file mode 100644
index 931c82f0..00000000
--- a/tests/phpunit/languages/LanguageSgsTest.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageSgs.php */
-class LanguageSgsTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Sgs' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePluralAllForms */
- function testPluralAllForms( $result, $value ) {
- $forms = array( 'one', 'few', 'many', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePluralAllForms() {
- return array (
- array( 'many', 0 ),
- array( 'one', 1 ),
- array( 'few', 2 ),
- array( 'other', 3 ),
- array( 'many', 10 ),
- array( 'many', 11 ),
- array( 'many', 12 ),
- array( 'many', 19 ),
- array( 'other', 20 ),
- array( 'many', 100 ),
- array( 'one', 101 ),
- array( 'many', 111 ),
- array( 'many', 112 ),
- );
- }
-
- /** @dataProvider providePluralTwoForms */
- function testPluralTwoForms( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePluralTwoForms() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'other', 2 ),
- array( 'other', 3 ),
- array( 'other', 10 ),
- array( 'other', 11 ),
- array( 'other', 12 ),
- array( 'other', 19 ),
- array( 'other', 20 ),
- array( 'other', 100 ),
- array( 'one', 101 ),
- array( 'other', 111 ),
- array( 'other', 112 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageShTest.php b/tests/phpunit/languages/LanguageShTest.php
deleted file mode 100644
index b8169aed..00000000
--- a/tests/phpunit/languages/LanguageShTest.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageSh.php */
-class LanguageShTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'sh' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'many' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'many', 0 ),
- array( 'one', 1 ),
- array( 'many', 2 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageSkTest.php b/tests/phpunit/languages/LanguageSkTest.php
deleted file mode 100644
index 4cfd840e..00000000
--- a/tests/phpunit/languages/LanguageSkTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Amir E. Aharoni
- * based on LanguageSkTest.php
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageSk.php */
-class LanguageSkTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'sk' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'few', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'few', 2 ),
- array( 'few', 3 ),
- array( 'few', 4 ),
- array( 'other', 5 ),
- array( 'other', 11 ),
- array( 'other', 20 ),
- array( 'other', 25 ),
- array( 'other', 200 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageSlTest.php b/tests/phpunit/languages/LanguageSlTest.php
deleted file mode 100644
index c1f75691..00000000
--- a/tests/phpunit/languages/LanguageSlTest.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/**
- * @author Santhosh Thottingal
- * @copyright Copyright © 2012, Amir E. Aharoni
- * based on LanguageSkTest.php
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageSl.php */
-class LanguageSlTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'sl' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'two', 'few', 'other', 'zero' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'zero', 0 ),
- array( 'one', 1 ),
- array( 'two', 2 ),
- array( 'few', 3 ),
- array( 'few', 4 ),
- array( 'other', 5 ),
- array( 'other', 99 ),
- array( 'other', 100 ),
- array( 'one', 101 ),
- array( 'two', 102 ),
- array( 'few', 103 ),
- array( 'one', 201 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageSmaTest.php b/tests/phpunit/languages/LanguageSmaTest.php
deleted file mode 100644
index b7e72e97..00000000
--- a/tests/phpunit/languages/LanguageSmaTest.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageSma.php */
-class LanguageSmaTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'sma' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPluralThreeForms */
- function testPluralThreeForms( $result, $value ) {
- $forms = array( 'one', 'two', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPluralThreeForms() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'two', 2 ),
- array( 'other', 3 ),
- );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'other', 0 ),
- array( 'one', 1 ),
- array( 'other', 2 ),
- array( 'other', 3 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageSrTest.php b/tests/phpunit/languages/LanguageSrTest.php
deleted file mode 100644
index d44ecf8e..00000000
--- a/tests/phpunit/languages/LanguageSrTest.php
+++ /dev/null
@@ -1,223 +0,0 @@
-<?php
-/**
- * PHPUnit tests for the Serbian language.
- * The language can be represented using two scripts:
- * - Latin (SR_el)
- * - Cyrillic (SR_ec)
- * Both representations seems to be bijective, hence MediaWiki can convert
- * from one script to the other.
- *
- * @author Antoine Musso <hashar at free dot fr>
- * @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
- * @file
- */
-
-require_once dirname( __DIR__ ) . '/bootstrap.php';
-
-/** Tests for MediaWiki languages/LanguageSr.php */
-class LanguageSrTest extends MediaWikiTestCase {
- /* Language object. Initialized before each test */
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'sr' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- ##### TESTS #######################################################
-
- function testEasyConversions( ) {
- $this->assertCyrillic(
- 'шђчћжШЂЧЋЖ',
- 'Cyrillic guessing characters'
- );
- $this->assertLatin(
- 'Å¡Ä‘Ä枊ÄČĆŽ',
- 'Latin guessing characters'
- );
- }
-
- function testMixedConversions() {
- $this->assertCyrillic(
- 'шђчћжШЂЧЋЖ - Å¡Ä‘Äćž',
- 'Mostly cyrillic characters'
- );
- $this->assertLatin(
- 'Å¡Ä‘Ä枊ÄČĆŽ - шђчћж',
- 'Mostly latin characters'
- );
- }
-
- function testSameAmountOfLatinAndCyrillicGetConverted() {
- $this->assertConverted(
- '4 latin: Å¡Ä‘Äć | 4 cyrillic: шђчћ',
- 'sr-ec'
- );
- $this->assertConverted(
- '4 latin: Å¡Ä‘Äć | 4 cyrillic: шђчћ',
- 'sr-el'
- );
- }
-
- /**
- * @author Nikola Smolenski
- */
- function testConversionToCyrillic() {
- //A simple convertion of Latin to Cyrillic
- $this->assertEquals( 'абвг',
- $this->convertToCyrillic( 'abvg' )
- );
- //Same as above, but assert that -{}-s must be removed and not converted
- $this->assertEquals( 'ljабnjвгdž',
- $this->convertToCyrillic( '-{lj}-ab-{nj}-vg-{dž}-' )
- );
- //A simple convertion of Cyrillic to Cyrillic
- $this->assertEquals( 'абвг',
- $this->convertToCyrillic( 'абвг' )
- );
- //Same as above, but assert that -{}-s must be removed and not converted
- $this->assertEquals( 'ljабnjвгdž',
- $this->convertToCyrillic( '-{lj}-аб-{nj}-вг-{dž}-' )
- );
- //This text has some Latin, but is recognized as Cyrillic, so it should not be converted
- $this->assertEquals( 'abvgшђжчћ',
- $this->convertToCyrillic( 'abvgшђжчћ' )
- );
- //Same as above, but assert that -{}-s must be removed
- $this->assertEquals( 'љabvgњшђжчћџ',
- $this->convertToCyrillic( '-{љ}-abvg-{њ}-шђжчћ-{џ}-' )
- );
- //This text has some Cyrillic, but is recognized as Latin, so it should be converted
- $this->assertEquals( 'абвгшђжчћ',
- $this->convertToCyrillic( 'абвгšđžÄć' )
- );
- //Same as above, but assert that -{}-s must be removed and not converted
- $this->assertEquals( 'ljабвгnjшђжчћdž',
- $this->convertToCyrillic( '-{lj}-абвг-{nj}-šđžÄć-{dž}-' )
- );
- // Roman numerals are not converted
- $this->assertEquals( 'а I б II в III г IV шђжчћ',
- $this->convertToCyrillic( 'a I b II v III g IV šđžÄć' )
- );
- }
-
- function testConversionToLatin() {
- //A simple convertion of Latin to Latin
- $this->assertEquals( 'abcd',
- $this->convertToLatin( 'abcd' )
- );
- //A simple convertion of Cyrillic to Latin
- $this->assertEquals( 'abcd',
- $this->convertToLatin( 'абцд' )
- );
- //This text has some Latin, but is recognized as Cyrillic, so it should be converted
- $this->assertEquals( 'abcdšđžÄć',
- $this->convertToLatin( 'abcdшђжчћ' )
- );
- //This text has some Cyrillic, but is recognized as Latin, so it should not be converted
- $this->assertEquals( 'абцдšđžÄć',
- $this->convertToLatin( 'абцдšđžÄć' )
- );
- }
-
- /** @dataProvider providePluralFourForms */
- function testPluralFourForms( $result, $value ) {
- $forms = array( 'one', 'few', 'many', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePluralFourForms() {
- return array (
- array( 'one', 1 ),
- array( 'many', 11 ),
- array( 'one', 91 ),
- array( 'one', 121 ),
- array( 'few', 2 ),
- array( 'few', 3 ),
- array( 'few', 4 ),
- array( 'few', 334 ),
- array( 'many', 5 ),
- array( 'many', 15 ),
- array( 'many', 120 ),
- );
- }
- /** @dataProvider providePluralTwoForms */
- function testPluralTwoForms( $result, $value ) {
- $forms = array( 'one', 'several' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
- function providePluralTwoForms() {
- return array (
- array( 'one', 1 ),
- array( 'several', 11 ),
- array( 'several', 91 ),
- array( 'several', 121 ),
- );
- }
-
- ##### HELPERS #####################################################
- /**
- *Wrapper to verify text stay the same after applying conversion
- * @param $text string Text to convert
- * @param $variant string Language variant 'sr-ec' or 'sr-el'
- * @param $msg string Optional message
- */
- function assertUnConverted( $text, $variant, $msg = '' ) {
- $this->assertEquals(
- $text,
- $this->convertTo( $text, $variant ),
- $msg
- );
- }
- /**
- * Wrapper to verify a text is different once converted to a variant.
- * @param $text string Text to convert
- * @param $variant string Language variant 'sr-ec' or 'sr-el'
- * @param $msg string Optional message
- */
- function assertConverted( $text, $variant, $msg = '' ) {
- $this->assertNotEquals(
- $text,
- $this->convertTo( $text, $variant ),
- $msg
- );
- }
-
- /**
- * Verifiy the given Cyrillic text is not converted when using
- * using the cyrillic variant and converted to Latin when using
- * the Latin variant.
- */
- function assertCyrillic( $text, $msg = '' ) {
- $this->assertUnConverted( $text, 'sr-ec', $msg );
- $this->assertConverted( $text, 'sr-el', $msg );
- }
- /**
- * Verifiy the given Latin text is not converted when using
- * using the Latin variant and converted to Cyrillic when using
- * the Cyrillic variant.
- */
- function assertLatin( $text, $msg = '' ) {
- $this->assertUnConverted( $text, 'sr-el', $msg );
- $this->assertConverted( $text, 'sr-ec', $msg );
- }
-
-
- /** Wrapper for converter::convertTo() method*/
- function convertTo( $text, $variant ) {
- return $this
- ->lang
- ->mConverter
- ->convertTo(
- $text, $variant
- );
- }
- function convertToCyrillic( $text ) {
- return $this->convertTo( $text, 'sr-ec' );
- }
- function convertToLatin( $text ) {
- return $this->convertTo( $text, 'sr-el' );
- }
-}
diff --git a/tests/phpunit/languages/LanguageTest.php b/tests/phpunit/languages/LanguageTest.php
deleted file mode 100644
index 2fa3e292..00000000
--- a/tests/phpunit/languages/LanguageTest.php
+++ /dev/null
@@ -1,1069 +0,0 @@
-<?php
-
-class LanguageTest extends MediaWikiTestCase {
-
- /**
- * @var Language
- */
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'en' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- function testLanguageConvertDoubleWidthToSingleWidth() {
- $this->assertEquals(
- "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
- $this->lang->normalizeForSearch(
- "ï¼ï¼‘23456789ABCDEFGHIJKLMNOPQRSTUVWXYZï½ï½‚cdefghijklï½ï½Žï½ï½ï½‘rstuvwxyz"
- ),
- 'convertDoubleWidth() with the full alphabet and digits'
- );
- }
-
- /**
- * @dataProvider provideFormattableTimes
- */
- function testFormatTimePeriod( $seconds, $format, $expected, $desc ) {
- $this->assertEquals( $expected, $this->lang->formatTimePeriod( $seconds, $format ), $desc );
- }
-
- function provideFormattableTimes() {
- return array(
- array(
- 9.45,
- array(),
- '9.5 s',
- 'formatTimePeriod() rounding (<10s)'
- ),
- array(
- 9.45,
- array( 'noabbrevs' => true ),
- '9.5 seconds',
- 'formatTimePeriod() rounding (<10s)'
- ),
- array(
- 9.95,
- array(),
- '10 s',
- 'formatTimePeriod() rounding (<10s)'
- ),
- array(
- 9.95,
- array( 'noabbrevs' => true ),
- '10 seconds',
- 'formatTimePeriod() rounding (<10s)'
- ),
- array(
- 59.55,
- array(),
- '1 min 0 s',
- 'formatTimePeriod() rounding (<60s)'
- ),
- array(
- 59.55,
- array( 'noabbrevs' => true ),
- '1 minute 0 seconds',
- 'formatTimePeriod() rounding (<60s)'
- ),
- array(
- 119.55,
- array(),
- '2 min 0 s',
- 'formatTimePeriod() rounding (<1h)'
- ),
- array(
- 119.55,
- array( 'noabbrevs' => true ),
- '2 minutes 0 seconds',
- 'formatTimePeriod() rounding (<1h)'
- ),
- array(
- 3599.55,
- array(),
- '1 h 0 min 0 s',
- 'formatTimePeriod() rounding (<1h)'
- ),
- array(
- 3599.55,
- array( 'noabbrevs' => true ),
- '1 hour 0 minutes 0 seconds',
- 'formatTimePeriod() rounding (<1h)'
- ),
- array(
- 7199.55,
- array(),
- '2 h 0 min 0 s',
- 'formatTimePeriod() rounding (>=1h)'
- ),
- array(
- 7199.55,
- array( 'noabbrevs' => true ),
- '2 hours 0 minutes 0 seconds',
- 'formatTimePeriod() rounding (>=1h)'
- ),
- array(
- 7199.55,
- 'avoidseconds',
- '2 h 0 min',
- 'formatTimePeriod() rounding (>=1h), avoidseconds'
- ),
- array(
- 7199.55,
- array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
- '2 hours 0 minutes',
- 'formatTimePeriod() rounding (>=1h), avoidseconds'
- ),
- array(
- 7199.55,
- 'avoidminutes',
- '2 h 0 min',
- 'formatTimePeriod() rounding (>=1h), avoidminutes'
- ),
- array(
- 7199.55,
- array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ),
- '2 hours 0 minutes',
- 'formatTimePeriod() rounding (>=1h), avoidminutes'
- ),
- array(
- 172799.55,
- 'avoidseconds',
- '48 h 0 min',
- 'formatTimePeriod() rounding (=48h), avoidseconds'
- ),
- array(
- 172799.55,
- array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
- '48 hours 0 minutes',
- 'formatTimePeriod() rounding (=48h), avoidseconds'
- ),
- array(
- 259199.55,
- 'avoidminutes',
- '3 d 0 h',
- 'formatTimePeriod() rounding (>48h), avoidminutes'
- ),
- array(
- 259199.55,
- array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ),
- '3 days 0 hours',
- 'formatTimePeriod() rounding (>48h), avoidminutes'
- ),
- array(
- 176399.55,
- 'avoidseconds',
- '2 d 1 h 0 min',
- 'formatTimePeriod() rounding (>48h), avoidseconds'
- ),
- array(
- 176399.55,
- array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
- '2 days 1 hour 0 minutes',
- 'formatTimePeriod() rounding (>48h), avoidseconds'
- ),
- array(
- 176399.55,
- 'avoidminutes',
- '2 d 1 h',
- 'formatTimePeriod() rounding (>48h), avoidminutes'
- ),
- array(
- 176399.55,
- array( 'avoid' => 'avoidminutes', 'noabbrevs' => true ),
- '2 days 1 hour',
- 'formatTimePeriod() rounding (>48h), avoidminutes'
- ),
- array(
- 259199.55,
- 'avoidseconds',
- '3 d 0 h 0 min',
- 'formatTimePeriod() rounding (>48h), avoidseconds'
- ),
- array(
- 259199.55,
- array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
- '3 days 0 hours 0 minutes',
- 'formatTimePeriod() rounding (>48h), avoidseconds'
- ),
- array(
- 172801.55,
- 'avoidseconds',
- '2 d 0 h 0 min',
- 'formatTimePeriod() rounding, (>48h), avoidseconds'
- ),
- array(
- 172801.55,
- array( 'avoid' => 'avoidseconds', 'noabbrevs' => true ),
- '2 days 0 hours 0 minutes',
- 'formatTimePeriod() rounding, (>48h), avoidseconds'
- ),
- array(
- 176460.55,
- array(),
- '2 d 1 h 1 min 1 s',
- 'formatTimePeriod() rounding, recursion, (>48h)'
- ),
- array(
- 176460.55,
- array( 'noabbrevs' => true ),
- '2 days 1 hour 1 minute 1 second',
- 'formatTimePeriod() rounding, recursion, (>48h)'
- ),
- );
-
- }
-
- function testTruncate() {
- $this->assertEquals(
- "XXX",
- $this->lang->truncate( "1234567890", 0, 'XXX' ),
- 'truncate prefix, len 0, small ellipsis'
- );
-
- $this->assertEquals(
- "12345XXX",
- $this->lang->truncate( "1234567890", 8, 'XXX' ),
- 'truncate prefix, small ellipsis'
- );
-
- $this->assertEquals(
- "123456789",
- $this->lang->truncate( "123456789", 5, 'XXXXXXXXXXXXXXX' ),
- 'truncate prefix, large ellipsis'
- );
-
- $this->assertEquals(
- "XXX67890",
- $this->lang->truncate( "1234567890", -8, 'XXX' ),
- 'truncate suffix, small ellipsis'
- );
-
- $this->assertEquals(
- "123456789",
- $this->lang->truncate( "123456789", -5, 'XXXXXXXXXXXXXXX' ),
- 'truncate suffix, large ellipsis'
- );
- }
-
- /**
- * @dataProvider provideHTMLTruncateData()
- */
- function testTruncateHtml( $len, $ellipsis, $input, $expected ) {
- // Actual HTML...
- $this->assertEquals(
- $expected,
- $this->lang->truncateHTML( $input, $len, $ellipsis )
- );
- }
-
- /**
- * Array format is ($len, $ellipsis, $input, $expected)
- */
- function provideHTMLTruncateData() {
- return array(
- array( 0, 'XXX', "1234567890", "XXX" ),
- array( 8, 'XXX', "1234567890", "12345XXX" ),
- array( 5, 'XXXXXXXXXXXXXXX', '1234567890', "1234567890" ),
- array( 2, '***',
- '<p><span style="font-weight:bold;"></span></p>',
- '<p><span style="font-weight:bold;"></span></p>',
- ),
- array( 2, '***',
- '<p><span style="font-weight:bold;">123456789</span></p>',
- '<p><span style="font-weight:bold;">***</span></p>',
- ),
- array( 2, '***',
- '<p><span style="font-weight:bold;">&nbsp;23456789</span></p>',
- '<p><span style="font-weight:bold;">***</span></p>',
- ),
- array( 3, '***',
- '<p><span style="font-weight:bold;">123456789</span></p>',
- '<p><span style="font-weight:bold;">***</span></p>',
- ),
- array( 4, '***',
- '<p><span style="font-weight:bold;">123456789</span></p>',
- '<p><span style="font-weight:bold;">1***</span></p>',
- ),
- array( 5, '***',
- '<tt><span style="font-weight:bold;">123456789</span></tt>',
- '<tt><span style="font-weight:bold;">12***</span></tt>',
- ),
- array( 6, '***',
- '<p><a href="www.mediawiki.org">123456789</a></p>',
- '<p><a href="www.mediawiki.org">123***</a></p>',
- ),
- array( 6, '***',
- '<p><a href="www.mediawiki.org">12&nbsp;456789</a></p>',
- '<p><a href="www.mediawiki.org">12&nbsp;***</a></p>',
- ),
- array( 7, '***',
- '<small><span style="font-weight:bold;">123<p id="#moo">456</p>789</span></small>',
- '<small><span style="font-weight:bold;">123<p id="#moo">4***</p></span></small>',
- ),
- array( 8, '***',
- '<div><span style="font-weight:bold;">123<span>4</span>56789</span></div>',
- '<div><span style="font-weight:bold;">123<span>4</span>5***</span></div>',
- ),
- array( 9, '***',
- '<p><table style="font-weight:bold;"><tr><td>123456789</td></tr></table></p>',
- '<p><table style="font-weight:bold;"><tr><td>123456789</td></tr></table></p>',
- ),
- array( 10, '***',
- '<p><font style="font-weight:bold;">123456789</font></p>',
- '<p><font style="font-weight:bold;">123456789</font></p>',
- ),
- );
- }
-
- /**
- * Test Language::isValidBuiltInCode()
- * @dataProvider provideLanguageCodes
- */
- function testBuiltInCodeValidation( $code, $message = '' ) {
- $this->assertTrue(
- (bool) Language::isValidBuiltInCode( $code ),
- "validating code $code $message"
- );
- }
-
- function testBuiltInCodeValidationRejectUnderscore() {
- $this->assertFalse(
- (bool) Language::isValidBuiltInCode( 'be_tarask' ),
- "reject underscore in language code"
- );
- }
-
- function provideLanguageCodes() {
- return array(
- array( 'fr' , 'Two letters, minor case' ),
- array( 'EN' , 'Two letters, upper case' ),
- array( 'tyv' , 'Three letters' ),
- array( 'tokipona' , 'long language code' ),
- array( 'be-tarask', 'With dash' ),
- array( 'Zh-classical', 'Begin with upper case, dash' ),
- array( 'Be-x-old', 'With extension (two dashes)' ),
- );
- }
-
- /**
- * @dataProvider provideSprintfDateSamples
- */
- function testSprintfDate( $format, $ts, $expected, $msg ) {
- $this->assertEquals(
- $expected,
- $this->lang->sprintfDate( $format, $ts ),
- "sprintfDate('$format', '$ts'): $msg"
- );
- }
- /**
- * bug 33454. sprintfDate should always use UTC.
- * @dataProvider provideSprintfDateSamples
- */
- function testSprintfDateTZ( $format, $ts, $expected, $msg ) {
- $oldTZ = date_default_timezone_get();
- $res = date_default_timezone_set( 'Asia/Seoul' );
- if ( !$res ) {
- $this->markTestSkipped( "Error setting Timezone" );
- }
-
- $this->assertEquals(
- $expected,
- $this->lang->sprintfDate( $format, $ts ),
- "sprintfDate('$format', '$ts'): $msg"
- );
-
- date_default_timezone_set( $oldTZ );
- }
-
- function provideSprintfDateSamples() {
- return array(
- array(
- 'xiY',
- '20111212000000',
- '1390', // note because we're testing English locale we get Latin-standard digits
- 'Iranian calendar full year'
- ),
- array(
- 'xiy',
- '20111212000000',
- '90',
- 'Iranian calendar short year'
- ),
- array(
- 'o',
- '20120101235000',
- '2011',
- 'ISO 8601 (week) year'
- ),
- array(
- 'W',
- '20120101235000',
- '52',
- 'Week number'
- ),
- array(
- 'W',
- '20120102235000',
- '1',
- 'Week number'
- ),
- array(
- 'o-\\WW-N',
- '20091231235000',
- '2009-W53-4',
- 'leap week'
- ),
- // What follows is mostly copied from http://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time
- array(
- 'Y',
- '20120102090705',
- '2012',
- 'Full year'
- ),
- array(
- 'y',
- '20120102090705',
- '12',
- '2 digit year'
- ),
- array(
- 'L',
- '20120102090705',
- '1',
- 'Leap year'
- ),
- array(
- 'n',
- '20120102090705',
- '1',
- 'Month index, not zero pad'
- ),
- array(
- 'N',
- '20120102090705',
- '01',
- 'Month index. Zero pad'
- ),
- array(
- 'M',
- '20120102090705',
- 'Jan',
- 'Month abbrev'
- ),
- array(
- 'F',
- '20120102090705',
- 'January',
- 'Full month'
- ),
- array(
- 'xg',
- '20120102090705',
- 'January',
- 'Genitive month name (same in EN)'
- ),
- array(
- 'j',
- '20120102090705',
- '2',
- 'Day of month (not zero pad)'
- ),
- array(
- 'd',
- '20120102090705',
- '02',
- 'Day of month (zero-pad)'
- ),
- array(
- 'z',
- '20120102090705',
- '1',
- 'Day of year (zero-indexed)'
- ),
- array(
- 'D',
- '20120102090705',
- 'Mon',
- 'Day of week (abbrev)'
- ),
- array(
- 'l',
- '20120102090705',
- 'Monday',
- 'Full day of week'
- ),
- array(
- 'N',
- '20120101090705',
- '7',
- 'Day of week (Mon=1, Sun=7)'
- ),
- array(
- 'w',
- '20120101090705',
- '0',
- 'Day of week (Sun=0, Sat=6)'
- ),
- array(
- 'N',
- '20120102090705',
- '1',
- 'Day of week'
- ),
- array(
- 'a',
- '20120102090705',
- 'am',
- 'am vs pm'
- ),
- array(
- 'A',
- '20120102120000',
- 'PM',
- 'AM vs PM'
- ),
- array(
- 'a',
- '20120102000000',
- 'am',
- 'AM vs PM'
- ),
- array(
- 'g',
- '20120102090705',
- '9',
- '12 hour, not Zero'
- ),
- array(
- 'h',
- '20120102090705',
- '09',
- '12 hour, zero padded'
- ),
- array(
- 'G',
- '20120102090705',
- '9',
- '24 hour, not zero'
- ),
- array(
- 'H',
- '20120102090705',
- '09',
- '24 hour, zero'
- ),
- array(
- 'H',
- '20120102110705',
- '11',
- '24 hour, zero'
- ),
- array(
- 'i',
- '20120102090705',
- '07',
- 'Minutes'
- ),
- array(
- 's',
- '20120102090705',
- '05',
- 'seconds'
- ),
- array(
- 'U',
- '20120102090705',
- '1325495225',
- 'unix time'
- ),
- array(
- 't',
- '20120102090705',
- '31',
- 'Days in current month'
- ),
- array(
- 'c',
- '20120102090705',
- '2012-01-02T09:07:05+00:00',
- 'ISO 8601 timestamp'
- ),
- array(
- 'r',
- '20120102090705',
- 'Mon, 02 Jan 2012 09:07:05 +0000',
- 'RFC 5322'
- ),
- array(
- 'xmj xmF xmn xmY',
- '20120102090705',
- '7 Safar 2 1433',
- 'Islamic'
- ),
- array(
- 'xij xiF xin xiY',
- '20120102090705',
- '12 Dey 10 1390',
- 'Iranian'
- ),
- array(
- 'xjj xjF xjn xjY',
- '20120102090705',
- '7 Tevet 4 5772',
- 'Hebrew'
- ),
- array(
- 'xjt',
- '20120102090705',
- '29',
- 'Hebrew number of days in month'
- ),
- array(
- 'xjx',
- '20120102090705',
- 'Tevet',
- 'Hebrew genitive month name (No difference in EN)'
- ),
- array(
- 'xkY',
- '20120102090705',
- '2555',
- 'Thai year'
- ),
- array(
- 'xoY',
- '20120102090705',
- '101',
- 'Minguo'
- ),
- array(
- 'xtY',
- '20120102090705',
- 'å¹³æˆ24',
- 'nengo'
- ),
- array(
- 'xrxkYY',
- '20120102090705',
- 'MMDLV2012',
- 'Roman numerals'
- ),
- array(
- 'xhxjYY',
- '20120102090705',
- 'ה\'תשע"ב2012',
- 'Hebrew numberals'
- ),
- array(
- 'xnY',
- '20120102090705',
- '2012',
- 'Raw numerals (doesn\'t mean much in EN)'
- ),
- array(
- '[[Y "(yea"\\r)]] \\"xx\\"',
- '20120102090705',
- '[[2012 (year)]] "x"',
- 'Various escaping'
- ),
-
- );
- }
-
- /**
- * @dataProvider provideFormatSizes
- */
- function testFormatSize( $size, $expected, $msg ) {
- $this->assertEquals(
- $expected,
- $this->lang->formatSize( $size ),
- "formatSize('$size'): $msg"
- );
- }
-
- function provideFormatSizes() {
- return array(
- array(
- 0,
- "0 B",
- "Zero bytes"
- ),
- array(
- 1024,
- "1 KB",
- "1 kilobyte"
- ),
- array(
- 1024 * 1024,
- "1 MB",
- "1,024 megabytes"
- ),
- array(
- 1024 * 1024 * 1024,
- "1 GB",
- "1 gigabytes"
- ),
- array(
- pow( 1024, 4 ),
- "1 TB",
- "1 terabyte"
- ),
- array(
- pow( 1024, 5 ),
- "1 PB",
- "1 petabyte"
- ),
- array(
- pow( 1024, 6 ),
- "1 EB",
- "1,024 exabyte"
- ),
- array(
- pow( 1024, 7 ),
- "1 ZB",
- "1 zetabyte"
- ),
- array(
- pow( 1024, 8 ),
- "1 YB",
- "1 yottabyte"
- ),
- // How big!? THIS BIG!
- );
- }
-
- /**
- * @dataProvider provideFormatBitrate
- */
- function testFormatBitrate( $bps, $expected, $msg ) {
- $this->assertEquals(
- $expected,
- $this->lang->formatBitrate( $bps ),
- "formatBitrate('$bps'): $msg"
- );
- }
-
- function provideFormatBitrate() {
- return array(
- array(
- 0,
- "0 bps",
- "0 bits per second"
- ),
- array(
- 999,
- "999 bps",
- "999 bits per second"
- ),
- array(
- 1000,
- "1 kbps",
- "1 kilobit per second"
- ),
- array(
- 1000 * 1000,
- "1 Mbps",
- "1 megabit per second"
- ),
- array(
- pow( 10, 9 ),
- "1 Gbps",
- "1 gigabit per second"
- ),
- array(
- pow( 10, 12 ),
- "1 Tbps",
- "1 terabit per second"
- ),
- array(
- pow( 10, 15 ),
- "1 Pbps",
- "1 petabit per second"
- ),
- array(
- pow( 10, 18 ),
- "1 Ebps",
- "1 exabit per second"
- ),
- array(
- pow( 10, 21 ),
- "1 Zbps",
- "1 zetabit per second"
- ),
- array(
- pow( 10, 24 ),
- "1 Ybps",
- "1 yottabit per second"
- ),
- array(
- pow( 10, 27 ),
- "1,000 Ybps",
- "1,000 yottabits per second"
- ),
- );
- }
-
-
-
- /**
- * @dataProvider provideFormatDuration
- */
- function testFormatDuration( $duration, $expected, $intervals = array() ) {
- $this->assertEquals(
- $expected,
- $this->lang->formatDuration( $duration, $intervals ),
- "formatDuration('$duration'): $expected"
- );
- }
-
- function provideFormatDuration() {
- return array(
- array(
- 0,
- '0 seconds',
- ),
- array(
- 1,
- '1 second',
- ),
- array(
- 2,
- '2 seconds',
- ),
- array(
- 60,
- '1 minute',
- ),
- array(
- 2 * 60,
- '2 minutes',
- ),
- array(
- 3600,
- '1 hour',
- ),
- array(
- 2 * 3600,
- '2 hours',
- ),
- array(
- 24 * 3600,
- '1 day',
- ),
- array(
- 2 * 86400,
- '2 days',
- ),
- array(
- 365.25 * 86400, // 365.25 * 86400 = 31557600
- '1 year',
- ),
- array(
- 2 * 31557600,
- '2 years',
- ),
- array(
- 10 * 31557600,
- '1 decade',
- ),
- array(
- 20 * 31557600,
- '2 decades',
- ),
- array(
- 100 * 31557600,
- '1 century',
- ),
- array(
- 200 * 31557600,
- '2 centuries',
- ),
- array(
- 1000 * 31557600,
- '1 millennium',
- ),
- array(
- 2000 * 31557600,
- '2 millennia',
- ),
- array(
- 9001,
- '2 hours, 30 minutes and 1 second'
- ),
- array(
- 3601,
- '1 hour and 1 second'
- ),
- array(
- 31557600 + 2 * 86400 + 9000,
- '1 year, 2 days, 2 hours and 30 minutes'
- ),
- array(
- 42 * 1000 * 31557600 + 42,
- '42 millennia and 42 seconds'
- ),
- array(
- 60,
- '60 seconds',
- array( 'seconds' ),
- ),
- array(
- 61,
- '61 seconds',
- array( 'seconds' ),
- ),
- array(
- 1,
- '1 second',
- array( 'seconds' ),
- ),
- array(
- 31557600 + 2 * 86400 + 9000,
- '1 year, 2 days and 150 minutes',
- array( 'years', 'days', 'minutes' ),
- ),
- array(
- 42,
- '0 days',
- array( 'years', 'days' ),
- ),
- array(
- 31557600 + 2 * 86400 + 9000,
- '1 year, 2 days and 150 minutes',
- array( 'minutes', 'days', 'years' ),
- ),
- array(
- 42,
- '0 days',
- array( 'days', 'years' ),
- ),
- );
- }
-
- /**
- * @dataProvider provideCheckTitleEncodingData
- */
- function testCheckTitleEncoding( $s ) {
- $this->assertEquals(
- $s,
- $this->lang->checkTitleEncoding($s),
- "checkTitleEncoding('$s')"
- );
- }
-
- function provideCheckTitleEncodingData() {
- return array (
- array( "" ),
- array( "United States of America" ), // 7bit ASCII
- array( rawurldecode( "S%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e" ) ),
- array(
- rawurldecode(
- "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn"
- )
- ),
- // The following two data sets come from bug 36839. They fail if checkTitleEncoding uses a regexp to test for
- // valid UTF-8 encoding and the pcre.recursion_limit is low (like, say, 1024). They succeed if checkTitleEncoding
- // uses mb_check_encoding for its test.
- array(
- rawurldecode(
- "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn%7C"
- . "Catherine%20Willows%7CDavid%20Hodges%7CDavid%20Phillips%7CGil%20Grissom%7CGreg%20Sanders%7CHodges%7C"
- . "Internet%20Movie%20Database%7CJim%20Brass%7CLady%20Heather%7C"
- . "Les%20Experts%20(s%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e)%7CLes%20Experts%20:%20Manhattan%7C"
- . "Les%20Experts%20:%20Miami%7CListe%20des%20personnages%20des%20Experts%7C"
- . "Liste%20des%20%C3%A9pisodes%20des%20Experts%7CMod%C3%A8le%20discussion:Palette%20Les%20Experts%7C"
- . "Nick%20Stokes%7CPersonnage%20de%20fiction%7CPersonnage%20fictif%7CPersonnage%20de%20fiction%7C"
- . "Personnages%20r%C3%A9currents%20dans%20Les%20Experts%7CRaymond%20Langston%7CRiley%20Adams%7C"
- . "Saison%201%20des%20Experts%7CSaison%2010%20des%20Experts%7CSaison%2011%20des%20Experts%7C"
- . "Saison%2012%20des%20Experts%7CSaison%202%20des%20Experts%7CSaison%203%20des%20Experts%7C"
- . "Saison%204%20des%20Experts%7CSaison%205%20des%20Experts%7CSaison%206%20des%20Experts%7C"
- . "Saison%207%20des%20Experts%7CSaison%208%20des%20Experts%7CSaison%209%20des%20Experts%7C"
- . "Sara%20Sidle%7CSofia%20Curtis%7CS%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e%7CWallace%20Langham%7C"
- . "Warrick%20Brown%7CWendy%20Simms%7C%C3%89tats-Unis"
- ),
- ),
- array(
- rawurldecode(
- "Mod%C3%A8le%3AArrondissements%20homonymes%7CMod%C3%A8le%3ABandeau%20standard%20pour%20page%20d'homonymie%7C"
- . "Mod%C3%A8le%3ABatailles%20homonymes%7CMod%C3%A8le%3ACantons%20homonymes%7C"
- . "Mod%C3%A8le%3ACommunes%20fran%C3%A7aises%20homonymes%7CMod%C3%A8le%3AFilms%20homonymes%7C"
- . "Mod%C3%A8le%3AGouvernements%20homonymes%7CMod%C3%A8le%3AGuerres%20homonymes%7CMod%C3%A8le%3AHomonymie%7C"
- . "Mod%C3%A8le%3AHomonymie%20bateau%7CMod%C3%A8le%3AHomonymie%20d'%C3%A9tablissements%20scolaires%20ou"
- . "%20universitaires%7CMod%C3%A8le%3AHomonymie%20d'%C3%AEles%7CMod%C3%A8le%3AHomonymie%20de%20clubs%20sportifs%7C"
- . "Mod%C3%A8le%3AHomonymie%20de%20comt%C3%A9s%7CMod%C3%A8le%3AHomonymie%20de%20monument%7C"
- . "Mod%C3%A8le%3AHomonymie%20de%20nom%20romain%7CMod%C3%A8le%3AHomonymie%20de%20parti%20politique%7C"
- . "Mod%C3%A8le%3AHomonymie%20de%20route%7CMod%C3%A8le%3AHomonymie%20dynastique%7C"
- . "Mod%C3%A8le%3AHomonymie%20vid%C3%A9oludique%7CMod%C3%A8le%3AHomonymie%20%C3%A9difice%20religieux%7C"
- . "Mod%C3%A8le%3AInternationalisation%7CMod%C3%A8le%3AIsom%C3%A9rie%7CMod%C3%A8le%3AParonymie%7C"
- . "Mod%C3%A8le%3APatronyme%7CMod%C3%A8le%3APatronyme%20basque%7CMod%C3%A8le%3APatronyme%20italien%7C"
- . "Mod%C3%A8le%3APatronymie%7CMod%C3%A8le%3APersonnes%20homonymes%7CMod%C3%A8le%3ASaints%20homonymes%7C"
- . "Mod%C3%A8le%3ATitres%20homonymes%7CMod%C3%A8le%3AToponymie%7CMod%C3%A8le%3AUnit%C3%A9s%20homonymes%7C"
- . "Mod%C3%A8le%3AVilles%20homonymes%7CMod%C3%A8le%3A%C3%89difices%20religieux%20homonymes"
- )
- )
- );
- }
-
- /**
- * @dataProvider provideRomanNumeralsData
- */
- function testRomanNumerals( $num, $numerals ) {
- $this->assertEquals(
- $numerals,
- Language::romanNumeral( $num ),
- "romanNumeral('$num')"
- );
- }
-
- function provideRomanNumeralsData() {
- return array(
- array( 1, 'I' ),
- array( 2, 'II' ),
- array( 3, 'III' ),
- array( 4, 'IV' ),
- array( 5, 'V' ),
- array( 6, 'VI' ),
- array( 7, 'VII' ),
- array( 8, 'VIII' ),
- array( 9, 'IX' ),
- array( 10, 'X' ),
- array( 20, 'XX' ),
- array( 30, 'XXX' ),
- array( 40, 'XL' ),
- array( 49, 'XLIX' ),
- array( 50, 'L' ),
- array( 60, 'LX' ),
- array( 70, 'LXX' ),
- array( 80, 'LXXX' ),
- array( 90, 'XC' ),
- array( 99, 'XCIX' ),
- array( 100, 'C' ),
- array( 200, 'CC' ),
- array( 300, 'CCC' ),
- array( 400, 'CD' ),
- array( 500, 'D' ),
- array( 600, 'DC' ),
- array( 700, 'DCC' ),
- array( 800, 'DCCC' ),
- array( 900, 'CM' ),
- array( 999, 'CMXCIX' ),
- array( 1000, 'M' ),
- array( 1989, 'MCMLXXXIX' ),
- array( 2000, 'MM' ),
- array( 3000, 'MMM' ),
- array( 4000, 'MMMM' ),
- array( 5000, 'MMMMM' ),
- array( 6000, 'MMMMMM' ),
- array( 7000, 'MMMMMMM' ),
- array( 8000, 'MMMMMMMM' ),
- array( 9000, 'MMMMMMMMM' ),
- array( 9999, 'MMMMMMMMMCMXCIX'),
- array( 10000, 'MMMMMMMMMM' ),
- );
- }
-}
-
diff --git a/tests/phpunit/languages/LanguageTiTest.php b/tests/phpunit/languages/LanguageTiTest.php
deleted file mode 100644
index 4bfaa009..00000000
--- a/tests/phpunit/languages/LanguageTiTest.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageTi.php */
-class LanguageTiTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Ti' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'many' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'one', 0 ),
- array( 'one', 1 ),
- array( 'many', 2 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageTlTest.php b/tests/phpunit/languages/LanguageTlTest.php
deleted file mode 100644
index a1facd14..00000000
--- a/tests/phpunit/languages/LanguageTlTest.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageTl.php */
-class LanguageTlTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Tl' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'many' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'one', 0 ),
- array( 'one', 1 ),
- array( 'many', 2 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageTrTest.php b/tests/phpunit/languages/LanguageTrTest.php
deleted file mode 100644
index bda4c9d9..00000000
--- a/tests/phpunit/languages/LanguageTrTest.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-/**
- * @author Antoine Musso
- * @copyright Copyright © 2011, Antoine Musso
- * @file
- */
-
-/** Tests for MediaWiki languages/LanguageTr.php */
-class LanguageTrTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Tr' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /**
- * See @bug 28040
- * Credits to irc://irc.freenode.net/wikipedia-tr users:
- * - berm
- * - []LuCkY[]
- * - Emperyan
- * @see http://en.wikipedia.org/wiki/Dotted_and_dotless_I
- * @dataProvider provideDottedAndDotlessI
- */
- function testDottedAndDotlessI( $func, $input, $inputCase, $expected ) {
- if( $func == 'ucfirst' ) {
- $res = $this->lang->ucfirst( $input );
- } elseif( $func == 'lcfirst' ) {
- $res = $this->lang->lcfirst( $input );
- } else {
- throw new MWException( __METHOD__ . " given an invalid function name '$func'" );
- }
-
- $msg = "Converting $inputCase case '$input' with $func should give '$expected'";
-
- $this->assertEquals( $expected, $res, $msg );
- }
-
- function provideDottedAndDotlessI() {
- return array(
- # function, input, input case, expected
- # Case changed:
- array( 'ucfirst', 'ı', 'lower', 'I' ),
- array( 'ucfirst', 'i', 'lower', 'Ä°' ),
- array( 'lcfirst', 'I', 'upper', 'ı' ),
- array( 'lcfirst', 'Ä°', 'upper', 'i' ),
-
- # Already using the correct case
- array( 'ucfirst', 'I', 'upper', 'I' ),
- array( 'ucfirst', 'Ä°', 'upper', 'Ä°' ),
- array( 'lcfirst', 'ı', 'lower', 'ı' ),
- array( 'lcfirst', 'i', 'lower', 'i' ),
-
- # A real example taken from bug 28040 using
- # http://tr.wikipedia.org/wiki/%C4%B0Phone
- array( 'lcfirst', 'iPhone', 'lower', 'iPhone' ),
-
- # next case is valid in Turkish but are different words if we
- # consider IPhone is English!
- array( 'lcfirst', 'IPhone', 'upper', 'ıPhone' ),
-
- );
- }
-
-}
diff --git a/tests/phpunit/languages/LanguageUkTest.php b/tests/phpunit/languages/LanguageUkTest.php
deleted file mode 100644
index 60fafb0d..00000000
--- a/tests/phpunit/languages/LanguageUkTest.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * based on LanguageBe_tarask.php
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageUk.php */
-class LanguageUkTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Uk' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providePluralFourForms */
- function testPluralFourForms( $result, $value ) {
- $forms = array( 'one', 'few', 'many', 'other' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providePluralFourForms() {
- return array (
- array( 'one', 1 ),
- array( 'many', 11 ),
- array( 'one', 91 ),
- array( 'one', 121 ),
- array( 'few', 2 ),
- array( 'few', 3 ),
- array( 'few', 4 ),
- array( 'few', 334 ),
- array( 'many', 5 ),
- array( 'many', 15 ),
- array( 'many', 120 ),
- );
- }
- /** @dataProvider providePluralTwoForms */
- function testPluralTwoForms( $result, $value ) {
- $forms = array( 'one', 'several' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
- function providePluralTwoForms() {
- return array (
- array( 'one', 1 ),
- array( 'several', 11 ),
- array( 'several', 91 ),
- array( 'several', 121 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/LanguageUzTest.php b/tests/phpunit/languages/LanguageUzTest.php
deleted file mode 100644
index 72387283..00000000
--- a/tests/phpunit/languages/LanguageUzTest.php
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-/**
- * PHPUnit tests for the Uzbek language.
- * The language can be represented using two scripts:
- * - Latin (uz-latn)
- * - Cyrillic (uz-cyrl)
- *
- * @author Robin Pepermans
- * @author Antoine Musso <hashar at free dot fr>
- * @copyright Copyright © 2012, Robin Pepermans
- * @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
- * @file
- */
-
-require_once dirname( __DIR__ ) . '/bootstrap.php';
-
-/** Tests for MediaWiki languages/LanguageUz.php */
-class LanguageUzTest extends MediaWikiTestCase {
- /* Language object. Initialized before each test */
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'uz' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /**
- * @author Nikola Smolenski
- */
- function testConversionToCyrillic() {
- // A convertion of Latin to Cyrillic
- $this->assertEquals( 'абвгғ',
- $this->convertToCyrillic( 'abvggÊ»' )
- );
- // Same as above, but assert that -{}-s must be removed and not converted
- $this->assertEquals( 'ljабnjвгўоdb',
- $this->convertToCyrillic( '-{lj}-ab-{nj}-vgoʻo-{db}-' )
- );
- // A simple convertion of Cyrillic to Cyrillic
- $this->assertEquals( 'абвг',
- $this->convertToCyrillic( 'абвг' )
- );
- // Same as above, but assert that -{}-s must be removed and not converted
- $this->assertEquals( 'ljабnjвгdaž',
- $this->convertToCyrillic( '-{lj}-аб-{nj}-вг-{da}-ž' )
- );
- }
-
- function testConversionToLatin() {
- // A simple convertion of Latin to Latin
- $this->assertEquals( 'abdef',
- $this->convertToLatin( 'abdef' )
- );
- // A convertion of Cyrillic to Latin
- $this->assertEquals( 'gʻabtsdOʻQyo',
- $this->convertToLatin( 'ғабцдЎҚё' )
- );
- }
-
- ##### HELPERS #####################################################
- /**
- * Wrapper to verify text stay the same after applying conversion
- * @param $text string Text to convert
- * @param $variant string Language variant 'uz-cyrl' or 'uz-latn'
- * @param $msg string Optional message
- */
- function assertUnConverted( $text, $variant, $msg = '' ) {
- $this->assertEquals(
- $text,
- $this->convertTo( $text, $variant ),
- $msg
- );
- }
- /**
- * Wrapper to verify a text is different once converted to a variant.
- * @param $text string Text to convert
- * @param $variant string Language variant 'uz-cyrl' or 'uz-latn'
- * @param $msg string Optional message
- */
- function assertConverted( $text, $variant, $msg = '' ) {
- $this->assertNotEquals(
- $text,
- $this->convertTo( $text, $variant ),
- $msg
- );
- }
-
- /**
- * Verifiy the given Cyrillic text is not converted when using
- * using the cyrillic variant and converted to Latin when using
- * the Latin variant.
- */
- function assertCyrillic( $text, $msg = '' ) {
- $this->assertUnConverted( $text, 'uz-cyrl', $msg );
- $this->assertConverted( $text, 'uz-latn', $msg );
- }
- /**
- * Verifiy the given Latin text is not converted when using
- * using the Latin variant and converted to Cyrillic when using
- * the Cyrillic variant.
- */
- function assertLatin( $text, $msg = '' ) {
- $this->assertUnConverted( $text, 'uz-latn', $msg );
- $this->assertConverted( $text, 'uz-cyrl', $msg );
- }
-
-
- /** Wrapper for converter::convertTo() method*/
- function convertTo( $text, $variant ) {
- return $this->lang->mConverter->convertTo( $text, $variant );
- }
- function convertToCyrillic( $text ) {
- return $this->convertTo( $text, 'uz-cyrl' );
- }
- function convertToLatin( $text ) {
- return $this->convertTo( $text, 'uz-latn' );
- }
-}
diff --git a/tests/phpunit/languages/LanguageWaTest.php b/tests/phpunit/languages/LanguageWaTest.php
deleted file mode 100644
index 172f19b9..00000000
--- a/tests/phpunit/languages/LanguageWaTest.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/**
- * @author Amir E. Aharoni
- * @copyright Copyright © 2012, Amir E. Aharoni
- * @file
- */
-
-/** Tests for MediaWiki languages/classes/LanguageWa.php */
-class LanguageWaTest extends MediaWikiTestCase {
- private $lang;
-
- function setUp() {
- $this->lang = Language::factory( 'Wa' );
- }
- function tearDown() {
- unset( $this->lang );
- }
-
- /** @dataProvider providerPlural */
- function testPlural( $result, $value ) {
- $forms = array( 'one', 'many' );
- $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
- }
-
- function providerPlural() {
- return array (
- array( 'one', 0 ),
- array( 'one', 1 ),
- array( 'many', 2 ),
- );
- }
-}
diff --git a/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php b/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
deleted file mode 100644
index 033164b0..00000000
--- a/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-/**
- * @author Niklas Laxström
- * @file
- */
-
-class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
- /**
- * @dataProvider validTestCases
- */
- function testValidRules( $expected, $rules, $number, $comment ) {
- $result = CLDRPluralRuleEvaluator::evaluate( $number, (array) $rules );
- $this->assertEquals( $expected, $result, $comment );
- }
-
- /**
- * @dataProvider invalidTestCases
- * @expectedException CLDRPluralRuleError
- */
- function testInvalidRules( $rules, $comment ) {
- CLDRPluralRuleEvaluator::evaluate( 1, (array) $rules );
- }
-
- function validTestCases() {
- $tests = array(
- # expected, number, rule, comment
- array( 0, 'n is 1', 1, 'integer number and is' ),
- array( 0, 'n is 1', "1", 'string integer number and is' ),
- array( 0, 'n is 1', 1.0, 'float number and is' ),
- array( 0, 'n is 1', "1.0", 'string float number and is' ),
- array( 1, 'n is 1', 1.1, 'float number and is' ),
- array( 1, 'n is 1', 2, 'float number and is' ),
-
- array( 0, 'n in 1,3,5', 3, '' ),
- array( 1, 'n not in 1,3,5', 5, '' ),
-
- array( 1, 'n in 1,3,5', 2, '' ),
- array( 0, 'n not in 1,3,5', 4, '' ),
-
- array( 0, 'n in 1..3', 2, '' ),
- array( 0, 'n in 1..3', 3, 'in is inclusive' ),
- array( 1, 'n in 1..3', 0, '' ),
-
- array( 1, 'n not in 1..3', 2, '' ),
- array( 1, 'n not in 1..3', 3, 'in is inclusive' ),
- array( 0, 'n not in 1..3', 0, '' ),
-
- array( 1, 'n is not 1 and n is not 2 and n is not 3', 1, 'and relation' ),
- array( 0, 'n is not 1 and n is not 2 and n is not 4', 3, 'and relation' ),
-
- array( 0, 'n is not 1 or n is 1', 1, 'or relation' ),
- array( 1, 'n is 1 or n is 2', 3, 'or relation' ),
-
- array( 0, 'n is 1', 1, 'extra whitespace' ),
-
- array( 0, 'n mod 3 is 1', 7, 'mod' ),
- array( 0, 'n mod 3 is not 1', 4.3, 'mod with floats' ),
-
- array( 0, 'n within 1..3', 2, 'within with integer' ),
- array( 0, 'n within 1..3', 2.5, 'within with float' ),
- array( 0, 'n in 1..3', 2, 'in with integer' ),
- array( 1, 'n in 1..3', 2.5, 'in with float' ),
-
- array( 0, 'n in 3 or n is 4 and n is 5', 3, 'and binds more tightly than or' ),
- array( 1, 'n is 3 or n is 4 and n is 5', 4, 'and binds more tightly than or' ),
-
- array( 0, 'n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99', 24, 'breton rule' ),
- array( 1, 'n mod 10 in 3..4,9 and n mod 100 not in 10..19,70..79,90..99', 25, 'breton rule' ),
-
- array( 0, 'n within 0..2 and n is not 2', 0, 'french rule' ),
- array( 0, 'n within 0..2 and n is not 2', 1, 'french rule' ),
- array( 0, 'n within 0..2 and n is not 2', 1.2, 'french rule' ),
- array( 1, 'n within 0..2 and n is not 2', 2, 'french rule' ),
-
- array( 1, 'n in 3..10,13..19', 2, 'scottish rule - ranges with comma' ),
- array( 0, 'n in 3..10,13..19', 4, 'scottish rule - ranges with comma' ),
- array( 1, 'n in 3..10,13..19', 12.999, 'scottish rule - ranges with comma' ),
- array( 0, 'n in 3..10,13..19', 13, 'scottish rule - ranges with comma' ),
-
- array( 0, '5 mod 3 is n', 2, 'n as result of mod - no need to pass' ),
- );
-
- return $tests;
- }
-
- function invalidTestCases() {
- $tests = array(
- array( 'n mod mod 5 is 1', 'mod mod' ),
- array( 'n', 'just n' ),
- array( 'n is in 5', 'is in' ),
- );
- return $tests;
- }
-
-}
diff --git a/tests/phpunit/maintenance/DumpTestCase.php b/tests/phpunit/maintenance/DumpTestCase.php
deleted file mode 100644
index d1344389..00000000
--- a/tests/phpunit/maintenance/DumpTestCase.php
+++ /dev/null
@@ -1,352 +0,0 @@
-<?php
-
-/**
- * Base TestCase for dumps
- */
-abstract class DumpTestCase extends MediaWikiLangTestCase {
-
- /**
- * exception to be rethrown once in sound PHPUnit surrounding
- *
- * As the current MediaWikiTestCase::run is not robust enough to recover
- * from thrown exceptions directly, we cannot throw frow within
- * self::addDBData, although it would be appropriate. Hence, we catch the
- * exception and store it until we are in setUp and may finally rethrow
- * the exception without crashing the test suite.
- *
- * @var Exception|null
- */
- protected $exceptionFromAddDBData = null;
-
- /**
- * Holds the xmlreader used for analyzing an xml dump
- *
- * @var XMLReader|null
- */
- protected $xml = null;
-
- /**
- * Adds a revision to a page, while returning the resuting revision's id
- *
- * @param $page WikiPage: page to add the revision to
- * @param $text string: revisions text
- * @param $text string: revisions summare
- *
- * @throws MWExcepion
- */
- protected function addRevision( Page $page, $text, $summary ) {
- $status = $page->doEdit( $text, $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() . ")" );
- }
-
-
- /**
- * gunzips the given file and stores the result in the original file name
- *
- * @param $fname string: filename to read the gzipped data from and stored
- * the gunzipped data into
- */
- protected function gunzip( $fname ) {
- $gzipped_contents = file_get_contents( $fname );
- if ( $gzipped_contents === FALSE ) {
- $this->fail( "Could not get contents of $fname" );
- }
- // We resort to use gzinflate instead of gzdecode, as gzdecode
- // need not be available
- $contents = gzinflate( substr( $gzipped_contents, 10, -8 ) );
- $this->assertEquals( strlen( $contents ),
- file_put_contents( $fname, $contents ), "# bytes written" );
- }
-
- /**
- * Default set up function.
- *
- * Clears $wgUser, and reports errors from addDBData to PHPUnit
- */
- public function setUp() {
- global $wgUser;
-
- parent::setUp();
-
- // Check if any Exception is stored for rethrowing from addDBData
- // @see self::exceptionFromAddDBData
- if ( $this->exceptionFromAddDBData !== null ) {
- throw $this->exceptionFromAddDBData;
- }
-
- $wgUser = new User();
- }
-
- /**
- * Checks for test output consisting only of lines containing ETA announcements
- */
- function expectETAOutput() {
- // Newer PHPUnits require assertion about the output using PHPUnit's own
- // expectOutput[...] functions. However, the PHPUnit shipped prediactes
- // do not allow to check /each/ line of the output using /readable/ REs.
- // So we ...
- //
- // 1. ... add a dummy output checking to make PHPUnit not complain
- // about unchecked test output
- $this->expectOutputRegex( '//' );
-
- // 2. Do the real output checking on our own.
- $lines = explode( "\n", $this->getActualOutput() );
- $this->assertGreaterThan( 1, count( $lines ), "Minimal lines of produced output" );
- $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 );
- }
- }
-
-
- /**
- * Step the current XML reader until node end of given name is found.
- *
- * @param $name string: name of the closing element to look for
- * (e.g.: "mediawiki" when looking for </mediawiki>)
- *
- * @return bool: true iff the end node could be found. false otherwise.
- */
- protected function skipToNodeEnd( $name ) {
- while ( $this->xml->read() ) {
- if ( $this->xml->nodeType == XMLReader::END_ELEMENT &&
- $this->xml->name == $name ) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Step the current XML reader to the first element start after the node
- * end of a given name.
- *
- * @param $name string: name of the closing element to look for
- * (e.g.: "mediawiki" when looking for </mediawiki>)
- *
- * @return bool: true iff new element after the closing of $name could be
- * found. false otherwise.
- */
- protected function skipPastNodeEnd( $name ) {
- $this->assertTrue( $this->skipToNodeEnd( $name ),
- "Skipping to end of $name" );
- while ( $this->xml->read() ) {
- if ( $this->xml->nodeType == XMLReader::ELEMENT ) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Opens an XML file to analyze and optionally skips past siteinfo.
- *
- * @param $fname string: name of file to analyze
- * @param $skip_siteinfo bool: (optional) If true, step the xml reader
- * to the first element after </siteinfo>
- */
- protected function assertDumpStart( $fname, $skip_siteinfo = true ) {
- $this->xml = new XMLReader();
- $this->assertTrue( $this->xml->open( $fname ),
- "Opening temporary file $fname via XMLReader failed" );
- if ( $skip_siteinfo ) {
- $this->assertTrue( $this->skipPastNodeEnd( "siteinfo" ),
- "Skipping past end of siteinfo" );
- }
- }
-
- /**
- * Asserts that the xml reader is at the final closing tag of an xml file and
- * closes the reader.
- *
- * @param $tag string: (optional) the name of the final tag
- * (e.g.: "mediawiki" for </mediawiki>)
- */
- protected function assertDumpEnd( $name = "mediawiki" ) {
- $this->assertNodeEnd( $name, false );
- if ( $this->xml->read() ) {
- $this->skipWhitespace();
- }
- $this->assertEquals( $this->xml->nodeType, XMLReader::NONE,
- "No proper entity left to parse" );
- $this->xml->close();
- }
-
- /**
- * Steps the xml reader over white space
- */
- protected function skipWhitespace() {
- $cont = true;
- while ( $cont && ( ( $this->xml->nodeType == XMLReader::WHITESPACE )
- || ( $this->xml->nodeType == XMLReader::SIGNIFICANT_WHITESPACE ) ) ) {
- $cont = $this->xml->read();
- }
- }
-
- /**
- * Asserts that the xml reader is at an element of given name, and optionally
- * skips past it.
- *
- * @param $name string: the name of the element to check for
- * (e.g.: "mediawiki" for <mediawiki>)
- * @param $skip bool: (optional) if true, skip past the found element
- */
- protected function assertNodeStart( $name, $skip = true ) {
- $this->assertEquals( $name, $this->xml->name, "Node name" );
- $this->assertEquals( XMLReader::ELEMENT, $this->xml->nodeType, "Node type" );
- if ( $skip ) {
- $this->assertTrue( $this->xml->read(), "Skipping past start tag" );
- }
- }
-
- /**
- * Asserts that the xml reader is at an closing element of given name, and optionally
- * skips past it.
- *
- * @param $name string: the name of the closing element to check for
- * (e.g.: "mediawiki" for </mediawiki>)
- * @param $skip bool: (optional) if true, skip past the found element
- */
- protected function assertNodeEnd( $name, $skip = true ) {
- $this->assertEquals( $name, $this->xml->name, "Node name" );
- $this->assertEquals( XMLReader::END_ELEMENT, $this->xml->nodeType, "Node type" );
- if ( $skip ) {
- $this->assertTrue( $this->xml->read(), "Skipping past end tag" );
- }
- }
-
-
- /**
- * Asserts that the xml reader is at an element of given tag that contains a given text,
- * and skips over the element.
- *
- * @param $name string: the name of the element to check for
- * (e.g.: "mediawiki" for <mediawiki>...</mediawiki>)
- * @param $text string|false: If string, check if it equals the elements text.
- * If false, ignore the element's text
- * @param $skip_ws bool: (optional) if true, skip past white spaces that trail the
- * closing element.
- */
- protected function assertTextNode( $name, $text, $skip_ws = true ) {
- $this->assertNodeStart( $name );
-
- if ( $text !== false ) {
- $this->assertEquals( $text, $this->xml->value, "Text of node " . $name );
- }
- $this->assertTrue( $this->xml->read(), "Skipping past processed text of " . $name );
- $this->assertNodeEnd( $name );
-
- if ( $skip_ws ) {
- $this->skipWhitespace();
- }
- }
-
- /**
- * Asserts that the xml reader is at the start of a page element and skips over the first
- * tags, after checking them.
- *
- * Besides the opening page element, this function also checks for and skips over the
- * title, ns, and id tags. Hence after this function, the xml reader is at the first
- * revision of the current page.
- *
- * @param $id int: id of the page to assert
- * @param $ns int: number of namespage to assert
- * @param $name string: title of the current page
- */
- protected function assertPageStart( $id, $ns, $name ) {
-
- $this->assertNodeStart( "page" );
- $this->skipWhitespace();
-
- $this->assertTextNode( "title", $name );
- $this->assertTextNode( "ns", $ns );
- $this->assertTextNode( "id", $id );
-
- }
-
- /**
- * Asserts that the xml reader is at the page's closing element and skips to the next
- * element.
- */
- protected function assertPageEnd() {
- $this->assertNodeEnd( "page" );
- $this->skipWhitespace();
- }
-
- /**
- * Asserts that the xml reader is at a revision and checks its representation before
- * skipping over it.
- *
- * @param $id int: id of the revision
- * @param $summary string: summary of the revision
- * @param $text_id int: id of the revision's text
- * @param $text_bytes int: # of bytes in the revision's text
- * @param $text_sha1 string: the base36 SHA-1 of the revision's text
- * @param $text string|false: (optional) The revision's string, or false to check for a
- * revision stub
- * @param $parentid int|false: (optional) id of the parent revision
- */
- protected function assertRevision( $id, $summary, $text_id, $text_bytes, $text_sha1, $text = false, $parentid = false ) {
-
- $this->assertNodeStart( "revision" );
- $this->skipWhitespace();
-
- $this->assertTextNode( "id", $id );
- if ( $parentid !== false ) {
- $this->assertTextNode( "parentid", $parentid );
- }
- $this->assertTextNode( "timestamp", false );
-
- $this->assertNodeStart( "contributor" );
- $this->skipWhitespace();
- $this->assertTextNode( "ip", false );
- $this->assertNodeEnd( "contributor" );
- $this->skipWhitespace();
-
- $this->assertTextNode( "comment", $summary );
-
- $this->assertTextNode( "sha1", $text_sha1 );
-
- $this->assertNodeStart( "text", false );
- if ( $text_bytes !== false ) {
- $this->assertEquals( $this->xml->getAttribute( "bytes" ), $text_bytes,
- "Attribute 'bytes' of revision " . $id );
- }
-
- if ( $text === false ) {
- // Testing for a stub
- $this->assertEquals( $this->xml->getAttribute( "id" ), $text_id,
- "Text id of revision " . $id );
- $this->assertFalse( $this->xml->hasValue, "Revision has text" );
- $this->assertTrue( $this->xml->read(), "Skipping text start tag" );
- if ( ( $this->xml->nodeType == XMLReader::END_ELEMENT )
- && ( $this->xml->name == "text" ) ) {
-
- $this->xml->read();
- }
- $this->skipWhitespace();
- } else {
- // Testing for a real dump
- $this->assertTrue( $this->xml->read(), "Skipping text start tag" );
- $this->assertEquals( $text, $this->xml->value, "Text of revision " . $id );
- $this->assertTrue( $this->xml->read(), "Skipping past text" );
- $this->assertNodeEnd( "text" );
- $this->skipWhitespace();
- }
-
- $this->assertNodeEnd( "revision" );
- $this->skipWhitespace();
- }
-
-}
diff --git a/tests/phpunit/maintenance/MaintenanceTest.php b/tests/phpunit/maintenance/MaintenanceTest.php
deleted file mode 100644
index 4a6f08fa..00000000
--- a/tests/phpunit/maintenance/MaintenanceTest.php
+++ /dev/null
@@ -1,812 +0,0 @@
-<?php
-
-// It would be great if we were able to use PHPUnit's getMockForAbstractClass
-// instead of the MaintenanceFixup hack below. However, we cannot do
-// without changing the visibility and without working around hacks in
-// Maintenance.php
-//
-// For the same reason, we cannot just use FakeMaintenance.
-
-/**
- * makes parts of the API of Maintenance that is hidden by protected visibily
- * visible for testing, and makes up for a stream closing hack in Maintenance.php.
- *
- * This class is solely used for being able to test Maintenance right now
- * without having to apply major refactorings to fix some design issues in
- * Maintenance.php. Before adding more functions here, please consider whether
- * this approach is correct, or a refactoring Maintenance to separate concers
- * is more appropriate.
- *
- * Upon refactoring, keep in mind that besides the maintenance scrits themselves
- * and tests right here, also at least Extension:Maintenance make use of
- * Maintenance.
- *
- * Due to a hack in Maintenance.php using register_shutdown_function, be sure to
- * finally call simulateShutdown on MaintenanceFixup instance before a test
- * ends.
- *
- */
-class MaintenanceFixup extends Maintenance {
-
- // --- Making up for the register_shutdown_function hack in Maintenance.php
-
- /**
- * The test case that generated this instance.
- *
- * This member is motivated by allowing the destructor to check whether or not
- * the test failed, in order to avoid unnecessary nags about omitted shutdown
- * simulation.
- * But as it is already available, we also usi it to flagging tests as failed
- *
- * @var MediaWikiTestCase
- */
- private $testCase;
-
- /**
- * shutdownSimulated === true iff simulateShutdown has done it's work
- *
- * @var bool
- */
- private $shutdownSimulated = false;
-
- /**
- * Simulates what Maintenance wants to happen at script's end.
- */
- public function simulateShutdown() {
-
- if ( $this->shutdownSimulated ) {
- $this->testCase->fail( __METHOD__ . " called more than once" );
- }
-
- // The cleanup action.
- $this->outputChanneled( false );
-
- // Bookkeeping that we simulated the clean up.
- $this->shutdownSimulated = true;
- }
-
- // Note that the "public" here does not change visibility
- public function outputChanneled( $msg, $channel = null ) {
- if ( $this->shutdownSimulated ) {
- if ( $msg !== false ) {
- $this->testCase->fail( "Already past simulated shutdown, but msg is "
- . "not false. Did the hack in Maintenance.php change? Please "
- . "adapt the test case or Maintenance.php" );
- }
-
- // The current call is the one registered via register_shutdown_function.
- // We can safely ignore it, as we simulated this one via simulateShutdown
- // before (if we did not, the destructor of this instance will warn about
- // it)
- return;
- }
-
- return call_user_func_array ( array( "parent", __FUNCTION__ ), func_get_args() );
- }
-
- /**
- * Safety net around register_shutdown_function of Maintenance.php
- */
- public function __destruct() {
- if ( ( ! $this->shutdownSimulated ) && ( ! $this->testCase->hasFailed() ) ) {
- // Someone generated a MaintenanceFixup instance without calling
- // simulateShutdown. We'd have to raise a PHPUnit exception to correctly
- // flag this illegal usage. However, we are already in a destruktor, which
- // would trigger undefined behaviour. Hence, we can only report to the
- // error output :( Hopefully people read the PHPUnit output.
- fwrite( STDERR, "ERROR! Instance of " . __CLASS__ . " destructed without "
- . "calling simulateShutdown method. Call simulateShutdown on the "
- . "instance before it gets destructed." );
- }
-
- // The following guard is required, as PHP does not offer default destructors :(
- if ( is_callable( "parent::__destruct" ) ) {
- parent::__destruct();
- }
- }
-
- public function __construct( MediaWikiTestCase $testCase ) {
- parent::__construct();
- $this->testCase = $testCase;
- }
-
-
-
- // --- Making protected functions visible for test
-
- public function output( $out, $channel = null ) {
- // Just to make PHP not nag about signature mismatches, we copied
- // Maintenance::output signature. However, we do not use (or rely on)
- // those variables. Instead we pass to Maintenance::output whatever we
- // receive at runtime.
- return call_user_func_array ( array( "parent", __FUNCTION__ ), func_get_args() );
- }
-
-
-
- // --- Requirements for getting instance of abstract class
-
- public function execute() {
- $this->testCase->fail( __METHOD__ . " called unexpectedly" );
- }
-
-}
-
-class MaintenanceTest extends MediaWikiTestCase {
-
-
- /**
- * The main Maintenance instance that is used for testing.
- *
- * @var MaintenanceFixup
- */
- private $m;
-
-
- protected function setUp() {
- parent::setUp();
- $this->m = new MaintenanceFixup( $this );
- }
-
-
- /**
- * asserts the output before and after simulating shutdown
- *
- * This function simulates shutdown of self::m.
- *
- * @param $preShutdownOutput string: expected output before simulating shutdown
- * @param $expectNLAppending bool: Whether or not shutdown simulation is expected
- * to add a newline to the output. If false, $preShutdownOutput is the
- * expected output after shutdown simulation. Otherwise,
- * $preShutdownOutput with an appended newline is the expected output
- * after shutdown simulation.
- */
- private function assertOutputPrePostShutdown( $preShutdownOutput, $expectNLAppending ) {
-
- $this->assertEquals( $preShutdownOutput, $this->getActualOutput(),
- "Output before shutdown simulation" );
-
- $this->m->simulateShutdown();
-
- $postShutdownOutput = $preShutdownOutput . ( $expectNLAppending ? "\n" : "" );
- $this->expectOutputString( $postShutdownOutput );
- }
-
-
- // Although the following tests do not seem to be too consistent (compare for
- // example the newlines within the test.*StringString tests, or the
- // test.*Intermittent.* tests), the objective of these tests is not to describe
- // consistent behaviour, but rather currently existing behaviour.
-
-
- function testOutputEmpty() {
- $this->m->output( "" );
- $this->assertOutputPrePostShutdown( "", False );
- }
-
- function testOutputString() {
- $this->m->output( "foo" );
- $this->assertOutputPrePostShutdown( "foo", False );
- }
-
- function testOutputStringString() {
- $this->m->output( "foo" );
- $this->m->output( "bar" );
- $this->assertOutputPrePostShutdown( "foobar", False );
- }
-
- function testOutputStringNL() {
- $this->m->output( "foo\n" );
- $this->assertOutputPrePostShutdown( "foo\n", False );
- }
-
- function testOutputStringNLNL() {
- $this->m->output( "foo\n\n" );
- $this->assertOutputPrePostShutdown( "foo\n\n", False );
- }
-
- function testOutputStringNLString() {
- $this->m->output( "foo\nbar" );
- $this->assertOutputPrePostShutdown( "foo\nbar", False );
- }
-
- function testOutputStringNLStringNL() {
- $this->m->output( "foo\nbar\n" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputStringNLStringNLLinewise() {
- $this->m->output( "foo\n" );
- $this->m->output( "bar\n" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputStringNLStringNLArbitrary() {
- $this->m->output( "" );
- $this->m->output( "foo" );
- $this->m->output( "" );
- $this->m->output( "\n" );
- $this->m->output( "ba" );
- $this->m->output( "" );
- $this->m->output( "r\n" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputStringNLStringNLArbitraryAgain() {
- $this->m->output( "" );
- $this->m->output( "foo" );
- $this->m->output( "" );
- $this->m->output( "\nb" );
- $this->m->output( "a" );
- $this->m->output( "" );
- $this->m->output( "r\n" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputWNullChannelEmpty() {
- $this->m->output( "", null );
- $this->assertOutputPrePostShutdown( "", False );
- }
-
- function testOutputWNullChannelString() {
- $this->m->output( "foo", null );
- $this->assertOutputPrePostShutdown( "foo", False );
- }
-
- function testOutputWNullChannelStringString() {
- $this->m->output( "foo", null );
- $this->m->output( "bar", null );
- $this->assertOutputPrePostShutdown( "foobar", False );
- }
-
- function testOutputWNullChannelStringNL() {
- $this->m->output( "foo\n", null );
- $this->assertOutputPrePostShutdown( "foo\n", False );
- }
-
- function testOutputWNullChannelStringNLNL() {
- $this->m->output( "foo\n\n", null );
- $this->assertOutputPrePostShutdown( "foo\n\n", False );
- }
-
- function testOutputWNullChannelStringNLString() {
- $this->m->output( "foo\nbar", null );
- $this->assertOutputPrePostShutdown( "foo\nbar", False );
- }
-
- function testOutputWNullChannelStringNLStringNL() {
- $this->m->output( "foo\nbar\n", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputWNullChannelStringNLStringNLLinewise() {
- $this->m->output( "foo\n", null );
- $this->m->output( "bar\n", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputWNullChannelStringNLStringNLArbitrary() {
- $this->m->output( "", null );
- $this->m->output( "foo", null );
- $this->m->output( "", null );
- $this->m->output( "\n", null );
- $this->m->output( "ba", null );
- $this->m->output( "", null );
- $this->m->output( "r\n", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputWNullChannelStringNLStringNLArbitraryAgain() {
- $this->m->output( "", null );
- $this->m->output( "foo", null );
- $this->m->output( "", null );
- $this->m->output( "\nb", null );
- $this->m->output( "a", null );
- $this->m->output( "", null );
- $this->m->output( "r\n", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputWChannelString() {
- $this->m->output( "foo", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo", True );
- }
-
- function testOutputWChannelStringNL() {
- $this->m->output( "foo\n", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo", True );
- }
-
- function testOutputWChannelStringNLNL() {
- // If this test fails, note that output takes strings with double line
- // endings (although output's implementation in this situation calls
- // outputChanneled with a string ending in a nl ... which is not allowed
- // according to the documentation of outputChanneled)
- $this->m->output( "foo\n\n", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\n", True );
- }
-
- function testOutputWChannelStringNLString() {
- $this->m->output( "foo\nbar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar", True );
- }
-
- function testOutputWChannelStringNLStringNL() {
- $this->m->output( "foo\nbar\n", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar", True );
- }
-
- function testOutputWChannelStringNLStringNLLinewise() {
- $this->m->output( "foo\n", "bazChannel" );
- $this->m->output( "bar\n", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar", True );
- }
-
- function testOutputWChannelStringNLStringNLArbitrary() {
- $this->m->output( "", "bazChannel" );
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( "", "bazChannel" );
- $this->m->output( "\n", "bazChannel" );
- $this->m->output( "ba", "bazChannel" );
- $this->m->output( "", "bazChannel" );
- $this->m->output( "r\n", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar", True );
- }
-
- function testOutputWChannelStringNLStringNLArbitraryAgain() {
- $this->m->output( "", "bazChannel" );
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( "", "bazChannel" );
- $this->m->output( "\nb", "bazChannel" );
- $this->m->output( "a", "bazChannel" );
- $this->m->output( "", "bazChannel" );
- $this->m->output( "r\n", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar", True );
- }
-
- function testOutputWMultipleChannelsChannelChange() {
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( "bar", "bazChannel" );
- $this->m->output( "qux", "quuxChannel" );
- $this->m->output( "corge", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", True );
- }
-
- function testOutputWMultipleChannelsChannelChangeNL() {
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( "bar\n", "bazChannel" );
- $this->m->output( "qux\n", "quuxChannel" );
- $this->m->output( "corge", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", True );
- }
-
- function testOutputWAndWOChannelStringStartWO() {
- $this->m->output( "foo" );
- $this->m->output( "bar", "bazChannel" );
- $this->m->output( "qux" );
- $this->m->output( "quux", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar\nquxquux", True );
- }
-
- function testOutputWAndWOChannelStringStartW() {
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( "bar" );
- $this->m->output( "qux", "bazChannel" );
- $this->m->output( "quux" );
- $this->assertOutputPrePostShutdown( "foo\nbarqux\nquux", False );
- }
-
- function testOutputWChannelTypeSwitch() {
- $this->m->output( "foo", 1 );
- $this->m->output( "bar", 1.0 );
- $this->assertOutputPrePostShutdown( "foo\nbar", True );
- }
-
- function testOutputIntermittentEmpty() {
- $this->m->output( "foo" );
- $this->m->output( "" );
- $this->m->output( "bar" );
- $this->assertOutputPrePostShutdown( "foobar", False );
- }
-
- function testOutputIntermittentFalse() {
- $this->m->output( "foo" );
- $this->m->output( false );
- $this->m->output( "bar" );
- $this->assertOutputPrePostShutdown( "foobar", False );
- }
-
- function testOutputIntermittentFalseAfterOtherChannel() {
- $this->m->output( "qux", "quuxChannel" );
- $this->m->output( "foo" );
- $this->m->output( false );
- $this->m->output( "bar" );
- $this->assertOutputPrePostShutdown( "qux\nfoobar", False );
- }
-
- function testOutputWNullChannelIntermittentEmpty() {
- $this->m->output( "foo", null );
- $this->m->output( "", null );
- $this->m->output( "bar", null );
- $this->assertOutputPrePostShutdown( "foobar", False );
- }
-
- function testOutputWNullChannelIntermittentFalse() {
- $this->m->output( "foo", null );
- $this->m->output( false, null );
- $this->m->output( "bar", null );
- $this->assertOutputPrePostShutdown( "foobar", False );
- }
-
- function testOutputWChannelIntermittentEmpty() {
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( "", "bazChannel" );
- $this->m->output( "bar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar", True );
- }
-
- function testOutputWChannelIntermittentFalse() {
- $this->m->output( "foo", "bazChannel" );
- $this->m->output( false, "bazChannel" );
- $this->m->output( "bar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar", True );
- }
-
- // Note that (per documentation) outputChanneled does take strings that end
- // in \n, hence we do not test such strings.
-
- function testOutputChanneledEmpty() {
- $this->m->outputChanneled( "" );
- $this->assertOutputPrePostShutdown( "\n", False );
- }
-
- function testOutputChanneledString() {
- $this->m->outputChanneled( "foo" );
- $this->assertOutputPrePostShutdown( "foo\n", False );
- }
-
- function testOutputChanneledStringString() {
- $this->m->outputChanneled( "foo" );
- $this->m->outputChanneled( "bar" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputChanneledStringNLString() {
- $this->m->outputChanneled( "foo\nbar" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputChanneledStringNLStringNLArbitraryAgain() {
- $this->m->outputChanneled( "" );
- $this->m->outputChanneled( "foo" );
- $this->m->outputChanneled( "" );
- $this->m->outputChanneled( "\nb" );
- $this->m->outputChanneled( "a" );
- $this->m->outputChanneled( "" );
- $this->m->outputChanneled( "r" );
- $this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", False );
- }
-
- function testOutputChanneledWNullChannelEmpty() {
- $this->m->outputChanneled( "", null );
- $this->assertOutputPrePostShutdown( "\n", False );
- }
-
- function testOutputChanneledWNullChannelString() {
- $this->m->outputChanneled( "foo", null );
- $this->assertOutputPrePostShutdown( "foo\n", False );
- }
-
- function testOutputChanneledWNullChannelStringString() {
- $this->m->outputChanneled( "foo", null );
- $this->m->outputChanneled( "bar", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputChanneledWNullChannelStringNLString() {
- $this->m->outputChanneled( "foo\nbar", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputChanneledWNullChannelStringNLStringNLArbitraryAgain() {
- $this->m->outputChanneled( "", null );
- $this->m->outputChanneled( "foo", null );
- $this->m->outputChanneled( "", null );
- $this->m->outputChanneled( "\nb", null );
- $this->m->outputChanneled( "a", null );
- $this->m->outputChanneled( "", null );
- $this->m->outputChanneled( "r", null );
- $this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", False );
- }
-
- function testOutputChanneledWChannelString() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo", True );
- }
-
- function testOutputChanneledWChannelStringNLString() {
- $this->m->outputChanneled( "foo\nbar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar", True );
- }
-
- function testOutputChanneledWChannelStringString() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "bar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar", True );
- }
-
- function testOutputChanneledWChannelStringNLStringNLArbitraryAgain() {
- $this->m->outputChanneled( "", "bazChannel" );
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "", "bazChannel" );
- $this->m->outputChanneled( "\nb", "bazChannel" );
- $this->m->outputChanneled( "a", "bazChannel" );
- $this->m->outputChanneled( "", "bazChannel" );
- $this->m->outputChanneled( "r", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar", True );
- }
-
- function testOutputChanneledWMultipleChannelsChannelChange() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "bar", "bazChannel" );
- $this->m->outputChanneled( "qux", "quuxChannel" );
- $this->m->outputChanneled( "corge", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", True );
- }
-
- function testOutputChanneledWMultipleChannelsChannelChangeEnclosedNull() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "bar", null );
- $this->m->outputChanneled( "qux", null );
- $this->m->outputChanneled( "corge", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", True );
- }
-
- function testOutputChanneledWMultipleChannelsChannelAfterNullChange() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "bar", null );
- $this->m->outputChanneled( "qux", null );
- $this->m->outputChanneled( "corge", "quuxChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", True );
- }
-
- function testOutputChanneledWAndWOChannelStringStartWO() {
- $this->m->outputChanneled( "foo" );
- $this->m->outputChanneled( "bar", "bazChannel" );
- $this->m->outputChanneled( "qux" );
- $this->m->outputChanneled( "quux", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux", True );
- }
-
- function testOutputChanneledWAndWOChannelStringStartW() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "bar" );
- $this->m->outputChanneled( "qux", "bazChannel" );
- $this->m->outputChanneled( "quux" );
- $this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux\n", False );
- }
-
- function testOutputChanneledWChannelTypeSwitch() {
- $this->m->outputChanneled( "foo", 1 );
- $this->m->outputChanneled( "bar", 1.0 );
- $this->assertOutputPrePostShutdown( "foo\nbar", True );
- }
-
- function testOutputChanneledWOChannelIntermittentEmpty() {
- $this->m->outputChanneled( "foo" );
- $this->m->outputChanneled( "" );
- $this->m->outputChanneled( "bar" );
- $this->assertOutputPrePostShutdown( "foo\n\nbar\n", False );
- }
-
- function testOutputChanneledWOChannelIntermittentFalse() {
- $this->m->outputChanneled( "foo" );
- $this->m->outputChanneled( false );
- $this->m->outputChanneled( "bar" );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputChanneledWNullChannelIntermittentEmpty() {
- $this->m->outputChanneled( "foo", null );
- $this->m->outputChanneled( "", null );
- $this->m->outputChanneled( "bar", null );
- $this->assertOutputPrePostShutdown( "foo\n\nbar\n", False );
- }
-
- function testOutputChanneledWNullChannelIntermittentFalse() {
- $this->m->outputChanneled( "foo", null );
- $this->m->outputChanneled( false, null );
- $this->m->outputChanneled( "bar", null );
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testOutputChanneledWChannelIntermittentEmpty() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( "", "bazChannel" );
- $this->m->outputChanneled( "bar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foobar", True );
- }
-
- function testOutputChanneledWChannelIntermittentFalse() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->outputChanneled( false, "bazChannel" );
- $this->m->outputChanneled( "bar", "bazChannel" );
- $this->assertOutputPrePostShutdown( "foo\nbar", True );
- }
-
- function testCleanupChanneledClean() {
- $this->m->cleanupChanneled();
- $this->assertOutputPrePostShutdown( "", False );
- }
-
- function testCleanupChanneledAfterOutput() {
- $this->m->output( "foo" );
- $this->m->cleanupChanneled();
- $this->assertOutputPrePostShutdown( "foo", False );
- }
-
- function testCleanupChanneledAfterOutputWNullChannel() {
- $this->m->output( "foo", null );
- $this->m->cleanupChanneled();
- $this->assertOutputPrePostShutdown( "foo", False );
- }
-
- function testCleanupChanneledAfterOutputWChannel() {
- $this->m->output( "foo", "bazChannel" );
- $this->m->cleanupChanneled();
- $this->assertOutputPrePostShutdown( "foo\n", False );
- }
-
- function testCleanupChanneledAfterNLOutput() {
- $this->m->output( "foo\n" );
- $this->m->cleanupChanneled();
- $this->assertOutputPrePostShutdown( "foo\n", False );
- }
-
- function testCleanupChanneledAfterNLOutputWNullChannel() {
- $this->m->output( "foo\n", null );
- $this->m->cleanupChanneled();
- $this->assertOutputPrePostShutdown( "foo\n", False );
- }
-
- function testCleanupChanneledAfterNLOutputWChannel() {
- $this->m->output( "foo\n", "bazChannel" );
- $this->m->cleanupChanneled();
- $this->assertOutputPrePostShutdown( "foo\n", False );
- }
-
- function testCleanupChanneledAfterOutputChanneledWOChannel() {
- $this->m->outputChanneled( "foo" );
- $this->m->cleanupChanneled();
- $this->assertOutputPrePostShutdown( "foo\n", False );
- }
-
- function testCleanupChanneledAfterOutputChanneledWNullChannel() {
- $this->m->outputChanneled( "foo", null );
- $this->m->cleanupChanneled();
- $this->assertOutputPrePostShutdown( "foo\n", False );
- }
-
- function testCleanupChanneledAfterOutputChanneledWChannel() {
- $this->m->outputChanneled( "foo", "bazChannel" );
- $this->m->cleanupChanneled();
- $this->assertOutputPrePostShutdown( "foo\n", False );
- }
-
- function testMultipleMaintenanceObjectsInteractionOutput() {
- $m2 = new MaintenanceFixup( $this );
-
- $this->m->output( "foo" );
- $m2->output( "bar" );
-
- $this->assertEquals( "foobar", $this->getActualOutput(),
- "Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
- $this->assertOutputPrePostShutdown( "foobar", False );
- }
-
- function testMultipleMaintenanceObjectsInteractionOutputWNullChannel() {
- $m2 = new MaintenanceFixup( $this );
-
- $this->m->output( "foo", null );
- $m2->output( "bar", null );
-
- $this->assertEquals( "foobar", $this->getActualOutput(),
- "Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
- $this->assertOutputPrePostShutdown( "foobar", False );
- }
-
- function testMultipleMaintenanceObjectsInteractionOutputWChannel() {
- $m2 = new MaintenanceFixup( $this );
-
- $this->m->output( "foo", "bazChannel" );
- $m2->output( "bar", "bazChannel" );
-
- $this->assertEquals( "foobar", $this->getActualOutput(),
- "Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
- $this->assertOutputPrePostShutdown( "foobar\n", True );
- }
-
- function testMultipleMaintenanceObjectsInteractionOutputWNullChannelNL() {
- $m2 = new MaintenanceFixup( $this );
-
- $this->m->output( "foo\n", null );
- $m2->output( "bar\n", null );
-
- $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
- "Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testMultipleMaintenanceObjectsInteractionOutputWChannelNL() {
- $m2 = new MaintenanceFixup( $this );
-
- $this->m->output( "foo\n", "bazChannel" );
- $m2->output( "bar\n", "bazChannel" );
-
- $this->assertEquals( "foobar", $this->getActualOutput(),
- "Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
- $this->assertOutputPrePostShutdown( "foobar\n", True );
- }
-
- function testMultipleMaintenanceObjectsInteractionOutputChanneled() {
- $m2 = new MaintenanceFixup( $this );
-
- $this->m->outputChanneled( "foo" );
- $m2->outputChanneled( "bar" );
-
- $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
- "Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testMultipleMaintenanceObjectsInteractionOutputChanneledWNullChannel() {
- $m2 = new MaintenanceFixup( $this );
-
- $this->m->outputChanneled( "foo", null );
- $m2->outputChanneled( "bar", null );
-
- $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
- "Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
- $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
- }
-
- function testMultipleMaintenanceObjectsInteractionOutputChanneledWChannel() {
- $m2 = new MaintenanceFixup( $this );
-
- $this->m->outputChanneled( "foo", "bazChannel" );
- $m2->outputChanneled( "bar", "bazChannel" );
-
- $this->assertEquals( "foobar", $this->getActualOutput(),
- "Output before shutdown simulation (m2)" );
- $m2->simulateShutdown();
- $this->assertOutputPrePostShutdown( "foobar\n", True );
- }
-
- function testMultipleMaintenanceObjectsInteractionCleanupChanneledWChannel() {
- $m2 = new MaintenanceFixup( $this );
-
- $this->m->outputChanneled( "foo", "bazChannel" );
- $m2->outputChanneled( "bar", "bazChannel" );
-
- $this->assertEquals( "foobar", $this->getActualOutput(),
- "Output before first cleanup" );
- $this->m->cleanupChanneled();
- $this->assertEquals( "foobar\n", $this->getActualOutput(),
- "Output after first cleanup" );
- $m2->cleanupChanneled();
- $this->assertEquals( "foobar\n\n", $this->getActualOutput(),
- "Output after second cleanup" );
-
- $m2->simulateShutdown();
- $this->assertOutputPrePostShutdown( "foobar\n\n", False );
- }
-
-
-} \ No newline at end of file
diff --git a/tests/phpunit/maintenance/backupPrefetchTest.php b/tests/phpunit/maintenance/backupPrefetchTest.php
deleted file mode 100644
index 8ff85574..00000000
--- a/tests/phpunit/maintenance/backupPrefetchTest.php
+++ /dev/null
@@ -1,270 +0,0 @@
-<?php
-
-require_once __DIR__ . "/../../../maintenance/backupPrefetch.inc";
-
-/**
- * Tests for BaseDump
- *
- * @group Dump
- */
-class BaseDumpTest extends MediaWikiTestCase {
-
- /**
- * @var BaseDump the BaseDump instance used within a test.
- *
- * If set, this BaseDump gets automatically closed in tearDown.
- */
- private $dump = null;
-
- protected function tearDown() {
- if ( $this->dump !== null ) {
- $this->dump->close();
- }
-
- // Bug 37458, parent teardown need to be done after closing the
- // dump or it might cause some permissions errors.
- parent::tearDown();
- }
-
- /**
- * asserts that a prefetch yields an expected string
- *
- * @param $expected string|null: the exepcted result of the prefetch
- * @param $page int: the page number to prefetch the text for
- * @param $revision int: the revision number to prefetch the text for
- */
- private function assertPrefetchEquals( $expected, $page, $revision ) {
- $this->assertEquals( $expected, $this->dump->prefetch( $page, $revision ),
- "Prefetch of page $page revision $revision" );
-
- }
-
- function testSequential() {
- $fname = $this->setUpPrefetch();
- $this->dump = new BaseDump( $fname );
-
- $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
- $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
- $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
- $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
- }
-
- function testSynchronizeRevisionMissToRevision() {
- $fname = $this->setUpPrefetch();
- $this->dump = new BaseDump( $fname );
-
- $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
- $this->assertPrefetchEquals( null, 2, 3 );
- $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
- }
-
- function testSynchronizeRevisionMissToPage() {
- $fname = $this->setUpPrefetch();
- $this->dump = new BaseDump( $fname );
-
- $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
- $this->assertPrefetchEquals( null, 2, 40 );
- $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
- }
-
- function testSynchronizePageMiss() {
- $fname = $this->setUpPrefetch();
- $this->dump = new BaseDump( $fname );
-
- $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
- $this->assertPrefetchEquals( null, 3, 40 );
- $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
- }
-
- function testPageMissAtEnd() {
- $fname = $this->setUpPrefetch();
- $this->dump = new BaseDump( $fname );
-
- $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
- $this->assertPrefetchEquals( null, 6, 40 );
- }
-
- function testRevisionMissAtEnd() {
- $fname = $this->setUpPrefetch();
- $this->dump = new BaseDump( $fname );
-
- $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
- $this->assertPrefetchEquals( null, 4, 40 );
- }
-
- function testSynchronizePageMissAtStart() {
- $fname = $this->setUpPrefetch();
- $this->dump = new BaseDump( $fname );
-
- $this->assertPrefetchEquals( null, 0, 2 );
- $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
- }
-
- function testSynchronizeRevisionMissAtStart() {
- $fname = $this->setUpPrefetch();
- $this->dump = new BaseDump( $fname );
-
- $this->assertPrefetchEquals( null, 1, -2 );
- $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
- }
-
- function testSequentialAcrossFiles() {
- $fname1 = $this->setUpPrefetch( array( 1 ) );
- $fname2 = $this->setUpPrefetch( array( 2, 4 ) );
- $this->dump = new BaseDump( $fname1 . ";" . $fname2 );
-
- $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
- $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
- $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
- $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
- }
-
- function testSynchronizeSkipAcrossFile() {
- $fname1 = $this->setUpPrefetch( array( 1 ) );
- $fname2 = $this->setUpPrefetch( array( 2 ) );
- $fname3 = $this->setUpPrefetch( array( 4 ) );
- $this->dump = new BaseDump( $fname1 . ";" . $fname2 . ";" . $fname3 );
-
- $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
- $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
- }
-
- function testSynchronizeMissInWholeFirstFile() {
- $fname1 = $this->setUpPrefetch( array( 1 ) );
- $fname2 = $this->setUpPrefetch( array( 2 ) );
- $this->dump = new BaseDump( $fname1 . ";" . $fname2 );
-
- $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
- }
-
-
- /**
- * Constructs a temporary file that can be used for prefetching
- *
- * The temporary file is removed by DumpBackup upon tearDown.
- *
- * @param $requested_pages Array The indices of the page parts that should
- * go into the prefetch file. 1,2,4 are available.
- * @return String The file name of the created temporary file
- */
- private function setUpPrefetch( $requested_pages = array( 1, 2, 4 ) ) {
- // The file name, where we store the prepared prefetch file
- $fname = $this->getNewTempFile();
-
- // The header of every prefetch file
- $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>
- <base>http://localhost/wiki-svn/index.php/Main_Page</base>
- <generator>MediaWiki 1.20alpha</generator>
- <case>first-letter</case>
- <namespaces>
- <namespace key="-2" case="first-letter">Media</namespace>
- <namespace key="-1" case="first-letter">Special</namespace>
- <namespace key="0" case="first-letter" />
- <namespace key="1" case="first-letter">Talk</namespace>
- <namespace key="2" case="first-letter">User</namespace>
- <namespace key="3" case="first-letter">User talk</namespace>
- <namespace key="4" case="first-letter">Wikisvn</namespace>
- <namespace key="5" case="first-letter">Wikisvn talk</namespace>
- <namespace key="6" case="first-letter">File</namespace>
- <namespace key="7" case="first-letter">File talk</namespace>
- <namespace key="8" case="first-letter">MediaWiki</namespace>
- <namespace key="9" case="first-letter">MediaWiki talk</namespace>
- <namespace key="10" case="first-letter">Template</namespace>
- <namespace key="11" case="first-letter">Template talk</namespace>
- <namespace key="12" case="first-letter">Help</namespace>
- <namespace key="13" case="first-letter">Help talk</namespace>
- <namespace key="14" case="first-letter">Category</namespace>
- <namespace key="15" case="first-letter">Category talk</namespace>
- </namespaces>
- </siteinfo>
-';
-
-
- // An array holding the pages that are available for prefetch
- $available_pages = array();
-
- // Simple plain page
- $available_pages[1] = ' <page>
- <title>BackupDumperTestP1</title>
- <ns>0</ns>
- <id>1</id>
- <revision>
- <id>1</id>
- <timestamp>2012-04-01T16:46:05Z</timestamp>
- <contributor>
- <ip>127.0.0.1</ip>
- </contributor>
- <comment>BackupDumperTestP1Summary1</comment>
- <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
- <text xml:space="preserve">BackupDumperTestP1Text1</text>
- </revision>
- </page>
-';
- // Page with more than one revisions. Hole in rev ids.
- $available_pages[2] = ' <page>
- <title>BackupDumperTestP2</title>
- <ns>0</ns>
- <id>2</id>
- <revision>
- <id>2</id>
- <timestamp>2012-04-01T16:46:05Z</timestamp>
- <contributor>
- <ip>127.0.0.1</ip>
- </contributor>
- <comment>BackupDumperTestP2Summary1</comment>
- <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
- <text xml:space="preserve">BackupDumperTestP2Text1</text>
- </revision>
- <revision>
- <id>5</id>
- <parentid>2</parentid>
- <timestamp>2012-04-01T16:46:05Z</timestamp>
- <contributor>
- <ip>127.0.0.1</ip>
- </contributor>
- <comment>BackupDumperTestP2Summary4 extra</comment>
- <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
- <text xml:space="preserve">BackupDumperTestP2Text4 some additional Text</text>
- </revision>
- </page>
-';
- // Page with id higher than previous id + 1
- $available_pages[4] = ' <page>
- <title>Talk:BackupDumperTestP1</title>
- <ns>1</ns>
- <id>4</id>
- <revision>
- <id>8</id>
- <timestamp>2012-04-01T16:46:05Z</timestamp>
- <contributor>
- <ip>127.0.0.1</ip>
- </contributor>
- <comment>Talk BackupDumperTestP1 Summary1</comment>
- <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
- <text xml:space="preserve">Talk about BackupDumperTestP1 Text1</text>
- </revision>
- </page>
-';
-
- // The common ending for all files
- $tail = '</mediawiki>
-';
-
- // Putting together the content of the prefetch files
- $content = $header;
- foreach ( $requested_pages as $i ) {
- $this->assertTrue( array_key_exists( $i, $available_pages ),
- "Check for availability of requested page " . $i );
- $content .= $available_pages[ $i ];
- }
- $content .= $tail;
-
- $this->assertEquals( strlen( $content ), file_put_contents(
- $fname, $content ), "Length of prepared prefetch" );
-
- return $fname;
- }
-
-}
diff --git a/tests/phpunit/maintenance/backupTextPassTest.php b/tests/phpunit/maintenance/backupTextPassTest.php
deleted file mode 100644
index a0bbadf9..00000000
--- a/tests/phpunit/maintenance/backupTextPassTest.php
+++ /dev/null
@@ -1,563 +0,0 @@
-<?php
-
-require_once __DIR__ . "/../../../maintenance/backupTextPass.inc";
-
-/**
- * Tests for page dumps of BackupDumper
- *
- * @group Database
- * @group Dump
- */
-class TextPassDumperTest extends DumpTestCase {
-
- // We'll add several pages, revision and texts. The following variables hold the
- // corresponding ids.
- private $pageId1, $pageId2, $pageId3, $pageId4;
- private static $numOfPages = 4;
- private $revId1_1, $textId1_1;
- private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
- private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
- private $revId3_1, $textId3_1, $revId3_2, $textId3_2;
- private $revId4_1, $textId4_1;
- private static $numOfRevs = 8;
-
- function addDBData() {
- $this->tablesUsed[] = 'page';
- $this->tablesUsed[] = 'revision';
- $this->tablesUsed[] = 'text';
-
- try {
- // Simple page
- $title = Title::newFromText( 'BackupDumperTestP1' );
- $page = WikiPage::factory( $title );
- list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
- "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
- $this->pageId1 = $page->getId();
-
- // Page with more than one revision
- $title = Title::newFromText( 'BackupDumperTestP2' );
- $page = WikiPage::factory( $title );
- list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
- "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
- list( $this->revId2_2, $this->textId2_2 ) = $this->addRevision( $page,
- "BackupDumperTestP2Text2", "BackupDumperTestP2Summary2" );
- list( $this->revId2_3, $this->textId2_3 ) = $this->addRevision( $page,
- "BackupDumperTestP2Text3", "BackupDumperTestP2Summary3" );
- list( $this->revId2_4, $this->textId2_4 ) = $this->addRevision( $page,
- "BackupDumperTestP2Text4 some additional Text ",
- "BackupDumperTestP2Summary4 extra " );
- $this->pageId2 = $page->getId();
-
- // Deleted page.
- $title = Title::newFromText( 'BackupDumperTestP3' );
- $page = WikiPage::factory( $title );
- list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
- "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
- list( $this->revId3_2, $this->textId3_2 ) = $this->addRevision( $page,
- "BackupDumperTestP3Text2", "BackupDumperTestP2Summary2" );
- $this->pageId3 = $page->getId();
- $page->doDeleteArticle( "Testing ;)" );
-
- // Page from non-default namespace
- $title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
- $page = WikiPage::factory( $title );
- list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
- "Talk about BackupDumperTestP1 Text1",
- "Talk BackupDumperTestP1 Summary1" );
- $this->pageId4 = $page->getId();
- } catch ( Exception $e ) {
- // We'd love to pass $e directly. However, ... see
- // documentation of exceptionFromAddDBData in
- // DumpTestCase
- $this->exceptionFromAddDBData = $e;
- }
-
- }
-
- public function setUp() {
- parent::setUp();
-
- // Since we will restrict dumping by page ranges (to allow
- // working tests, even if the db gets prepopulated by a base
- // class), we have to assert, that the page id are consecutively
- // increasing
- $this->assertEquals(
- array( $this->pageId2, $this->pageId3, $this->pageId4 ),
- array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
- "Page ids increasing without holes" );
-
- }
-
- function testPlain() {
- // Setting up the dump
- $nameStub = $this->setUpStub();
- $nameFull = $this->getNewTempFile();
- $dumper = new TextPassDumper( array ( "--stub=file:" . $nameStub,
- "--output=file:" . $nameFull ) );
- $dumper->reporting = false;
- $dumper->setDb( $this->db );
-
- // Performing the dump
- $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
-
- // Checking for correctness of the dumped data
- $this->assertDumpStart( $nameFull );
-
- // Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, false, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
- "BackupDumperTestP1Text1" );
- $this->assertPageEnd();
-
- // Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
- $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
- $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
- "BackupDumperTestP2Text1" );
- $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
- $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
- "BackupDumperTestP2Text2", $this->revId2_1 );
- $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
- $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
- "BackupDumperTestP2Text3", $this->revId2_2 );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
- "BackupDumperTestP2Text4 some additional Text", $this->revId2_3 );
- $this->assertPageEnd();
-
- // Page 3
- // -> Page is marked deleted. Hence not visible
-
- // Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, false, "nktofwzd0tl192k3zfepmlzxoax1lpe",
- "Talk about BackupDumperTestP1 Text1" );
- $this->assertPageEnd();
-
- $this->assertDumpEnd();
- }
-
- function testPrefetchPlain() {
- // The mapping between ids and text, for the hits of the prefetch mock
- $prefetchMap = array(
- array( $this->pageId1, $this->revId1_1, "Prefetch_________1Text1" ),
- array( $this->pageId2, $this->revId2_3, "Prefetch_________2Text3" )
- );
-
- // The mock itself
- $prefetchMock = $this->getMock( 'BaseDump', array( 'prefetch' ), array(), '', FALSE );
- $prefetchMock->expects( $this->exactly( 6 ) )
- ->method( 'prefetch' )
- ->will( $this->returnValueMap( $prefetchMap ) );
-
- // Setting up of the dump
- $nameStub = $this->setUpStub();
- $nameFull = $this->getNewTempFile();
- $dumper = new TextPassDumper( array ( "--stub=file:"
- . $nameStub, "--output=file:" . $nameFull ) );
- $dumper->prefetch = $prefetchMock;
- $dumper->reporting = false;
- $dumper->setDb( $this->db );
-
- // Performing the dump
- $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
-
- // Checking for correctness of the dumped data
- $this->assertDumpStart( $nameFull );
-
- // Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
- // Prefetch kicks in. This is still the SHA-1 of the original text,
- // But the actual text (with different SHA-1) comes from prefetch.
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, false, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
- "Prefetch_________1Text1" );
- $this->assertPageEnd();
-
- // Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
- $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
- $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
- "BackupDumperTestP2Text1" );
- $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
- $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
- "BackupDumperTestP2Text2", $this->revId2_1 );
- // Prefetch kicks in. This is still the SHA-1 of the original text,
- // But the actual text (with different SHA-1) comes from prefetch.
- $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
- $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
- "Prefetch_________2Text3", $this->revId2_2 );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
- "BackupDumperTestP2Text4 some additional Text", $this->revId2_3 );
- $this->assertPageEnd();
-
- // Page 3
- // -> Page is marked deleted. Hence not visible
-
- // Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, false, "nktofwzd0tl192k3zfepmlzxoax1lpe",
- "Talk about BackupDumperTestP1 Text1" );
- $this->assertPageEnd();
-
- $this->assertDumpEnd();
-
- }
-
- /**
- * Ensures that checkpoint dumps are used and written, by successively increasing the
- * stub size and dumping until the duration crosses a threshold.
- *
- * @param $checkpointFormat string: Either "file" for plain text or "gzip" for gzipped
- * checkpoint files.
- */
- private function checkpointHelper( $checkpointFormat = "file" ) {
- // Getting temporary names
- $nameStub = $this->getNewTempFile();
- $nameOutputDir = $this->getNewTempDirectory();
-
- $stderr = fopen( 'php://output', 'a' );
- if ( $stderr === FALSE ) {
- $this->fail( "Could not open stream for stderr" );
- }
-
- $iterations = 32; // We'll start with that many iterations of revisions in stub
- $lastDuration = 0;
- $minDuration = 2; // We want the dump to take at least this many seconds
- $checkpointAfter = 0.5; // Generate checkpoint after this many seconds
-
-
- // Until a dump takes at least $minDuration seconds, perform a dump and check
- // duration. If the dump did not take long enough increase the iteration
- // count, to generate a bigger stub file next time.
- while ( $lastDuration < $minDuration ) {
-
- // Setting up the dump
- wfRecursiveRemoveDir( $nameOutputDir );
- $this->assertTrue( wfMkdirParents( $nameOutputDir ),
- "Creating temporary output directory " );
- $this->setUpStub( $nameStub, $iterations );
- $dumper = new TextPassDumper( array ( "--stub=file:" . $nameStub,
- "--output=" . $checkpointFormat . ":" . $nameOutputDir . "/full",
- "--maxtime=1" /*This is in minutes. Fixup is below*/,
- "--checkpointfile=checkpoint-%s-%s.xml.gz" ) );
- $dumper->setDb( $this->db );
- $dumper->maxTimeAllowed = $checkpointAfter; // Patching maxTime from 1 minute
- $dumper->stderr = $stderr;
-
- // The actual dump and taking time
- $ts_before = microtime( true );
- $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
- $ts_after = microtime( true );
- $lastDuration = $ts_after - $ts_before;
-
- // Handling increasing the iteration count for the stubs
- if ( $lastDuration < $minDuration ) {
- $old_iterations = $iterations;
- if ( $lastDuration > 0.2 ) {
- // lastDuration is big enough, to allow an educated guess
- $factor = ( $minDuration + 0.5 ) / $lastDuration;
- if ( ( $factor > 1.1 ) && ( $factor < 100 ) ) {
- // educated guess is reasonable
- $iterations = (int)( $iterations * $factor );
- }
- }
-
- if ( $old_iterations == $iterations ) {
- // Heuristics were not applied, so we just *2.
- $iterations *= 2;
- }
-
- $this->assertLessThan( 50000, $iterations,
- "Emergency stop against infinitely increasing iteration "
- . "count ( last duration: $lastDuration )" );
- }
- }
-
- // The dump (hopefully) did take long enough to produce more than one
- // checkpoint file.
- //
- // We now check all the checkpoint files for validity.
-
- $files = scandir( $nameOutputDir );
- $this->assertTrue( asort( $files ), "Sorting files in temporary directory" );
- $fileOpened = false;
- $lookingForPage = 1;
- $checkpointFiles = 0;
-
- // Each run of the following loop body tries to handle exactly 1 /page/ (not
- // iteration of stub content). $i is only increased after having treated page 4.
- for ( $i = 0 ; $i < $iterations ; ) {
-
- // 1. Assuring a file is opened and ready. Skipping across header if
- // necessary.
- if ( ! $fileOpened ) {
- $this->assertNotEmpty( $files, "No more existing dump files, "
- . "but not yet all pages found" );
- $fname = array_shift( $files );
- while ( $fname == "." || $fname == ".." ) {
- $this->assertNotEmpty( $files, "No more existing dump"
- . " files, but not yet all pages found" );
- $fname = array_shift( $files );
- }
- if ( $checkpointFormat == "gzip" ) {
- $this->gunzip( $nameOutputDir . "/" . $fname );
- }
- $this->assertDumpStart( $nameOutputDir . "/" . $fname );
- $fileOpened = true;
- $checkpointFiles++;
- }
-
- // 2. Performing a single page check
- switch ( $lookingForPage ) {
- case 1:
- // Page 1
- $this->assertPageStart( $this->pageId1 + $i * self::$numOfPages, NS_MAIN,
- "BackupDumperTestP1" );
- $this->assertRevision( $this->revId1_1 + $i * self::$numOfRevs, "BackupDumperTestP1Summary1",
- $this->textId1_1, false, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
- "BackupDumperTestP1Text1" );
- $this->assertPageEnd();
-
- $lookingForPage = 2;
- break;
-
- case 2:
- // Page 2
- $this->assertPageStart( $this->pageId2 + $i * self::$numOfPages, NS_MAIN,
- "BackupDumperTestP2" );
- $this->assertRevision( $this->revId2_1 + $i * self::$numOfRevs, "BackupDumperTestP2Summary1",
- $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
- "BackupDumperTestP2Text1" );
- $this->assertRevision( $this->revId2_2 + $i * self::$numOfRevs, "BackupDumperTestP2Summary2",
- $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
- "BackupDumperTestP2Text2", $this->revId2_1 + $i * self::$numOfRevs );
- $this->assertRevision( $this->revId2_3 + $i * self::$numOfRevs, "BackupDumperTestP2Summary3",
- $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
- "BackupDumperTestP2Text3", $this->revId2_2 + $i * self::$numOfRevs );
- $this->assertRevision( $this->revId2_4 + $i * self::$numOfRevs,
- "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
- "BackupDumperTestP2Text4 some additional Text",
- $this->revId2_3 + $i * self::$numOfRevs );
- $this->assertPageEnd();
-
- $lookingForPage = 4;
- break;
-
- case 4:
- // Page 4
- $this->assertPageStart( $this->pageId4 + $i * self::$numOfPages, NS_TALK,
- "Talk:BackupDumperTestP1" );
- $this->assertRevision( $this->revId4_1 + $i * self::$numOfRevs,
- "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, false, "nktofwzd0tl192k3zfepmlzxoax1lpe",
- "Talk about BackupDumperTestP1 Text1" );
- $this->assertPageEnd();
-
- $lookingForPage = 1;
-
- // We dealt with the whole iteration.
- $i++;
- break;
-
- default:
- $this->fail( "Bad setting for lookingForPage ($lookingForPage)" );
- }
-
- // 3. Checking for the end of the current checkpoint file
- if ( $this->xml->nodeType == XMLReader::END_ELEMENT
- && $this->xml->name == "mediawiki" ) {
-
- $this->assertDumpEnd();
- $fileOpened = false;
- }
- }
-
- // Assuring we completely read all files ...
- $this->assertFalse( $fileOpened, "Currently read file still open?" );
- $this->assertEmpty( $files, "Remaining unchecked files" );
-
- // ... and have dealt with more than one checkpoint file
- $this->assertGreaterThan( 1, $checkpointFiles, "# of checkpoint files" );
-
- $this->expectETAOutput();
- }
-
- /**
- * @group large
- */
- function testCheckpointPlain() {
- $this->checkpointHelper();
- }
-
- /**
- * tests for working checkpoint generation in gzip format work.
- *
- * We keep this test in addition to the simpler self::testCheckpointPlain, as there
- * were once problems when the used sinks were DumpPipeOutputs.
- *
- * xmldumps-backup typically uses bzip2 instead of gzip. However, as bzip2 requires
- * PHP extensions, we go for gzip instead, which triggers the same relevant code
- * paths while still being testable on more systems.
- *
- * @group large
- */
- function testCheckpointGzip() {
- $this->checkpointHelper( "gzip" );
- }
-
-
- /**
- * Creates a stub file that is used for testing the text pass of dumps
- *
- * @param $fname string: (Optional) Absolute name of the file to write
- * the stub into. If this parameter is null, a new temporary
- * file is generated that is automatically removed upon
- * tearDown.
- * @param $iterations integer: (Optional) specifies how often the block
- * of 3 pages should go into the stub file. The page and
- * revision id increase further and further, while the text
- * id of the first iteration is reused. The pages and revision
- * of iteration > 1 have no corresponding representation in the
- * database.
- * @return string absolute filename of the stub
- */
- private function setUpStub( $fname = null, $iterations = 1 ) {
- if ( $fname === null ) {
- $fname = $this->getNewTempFile();
- }
- $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>
- <base>http://localhost/wiki-svn/index.php/Main_Page</base>
- <generator>MediaWiki 1.20alpha</generator>
- <case>first-letter</case>
- <namespaces>
- <namespace key="-2" case="first-letter">Media</namespace>
- <namespace key="-1" case="first-letter">Special</namespace>
- <namespace key="0" case="first-letter" />
- <namespace key="1" case="first-letter">Talk</namespace>
- <namespace key="2" case="first-letter">User</namespace>
- <namespace key="3" case="first-letter">User talk</namespace>
- <namespace key="4" case="first-letter">Wikisvn</namespace>
- <namespace key="5" case="first-letter">Wikisvn talk</namespace>
- <namespace key="6" case="first-letter">File</namespace>
- <namespace key="7" case="first-letter">File talk</namespace>
- <namespace key="8" case="first-letter">MediaWiki</namespace>
- <namespace key="9" case="first-letter">MediaWiki talk</namespace>
- <namespace key="10" case="first-letter">Template</namespace>
- <namespace key="11" case="first-letter">Template talk</namespace>
- <namespace key="12" case="first-letter">Help</namespace>
- <namespace key="13" case="first-letter">Help talk</namespace>
- <namespace key="14" case="first-letter">Category</namespace>
- <namespace key="15" case="first-letter">Category talk</namespace>
- </namespaces>
- </siteinfo>
-';
- $tail = '</mediawiki>
-';
-
- $content = $header;
- $iterations = intval( $iterations );
- for ( $i = 0; $i < $iterations; $i++ ) {
-
- $page1 = ' <page>
- <title>BackupDumperTestP1</title>
- <ns>0</ns>
- <id>' . ( $this->pageId1 + $i * self::$numOfPages ) . '</id>
- <revision>
- <id>' . ( $this->revId1_1 + $i * self::$numOfRevs ) . '</id>
- <timestamp>2012-04-01T16:46:05Z</timestamp>
- <contributor>
- <ip>127.0.0.1</ip>
- </contributor>
- <comment>BackupDumperTestP1Summary1</comment>
- <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
- <text id="' . $this->textId1_1 . '" bytes="23" />
- </revision>
- </page>
-';
- $page2 = ' <page>
- <title>BackupDumperTestP2</title>
- <ns>0</ns>
- <id>' . ( $this->pageId2 + $i * self::$numOfPages ) . '</id>
- <revision>
- <id>' . ( $this->revId2_1 + $i * self::$numOfRevs ) . '</id>
- <timestamp>2012-04-01T16:46:05Z</timestamp>
- <contributor>
- <ip>127.0.0.1</ip>
- </contributor>
- <comment>BackupDumperTestP2Summary1</comment>
- <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
- <text id="' . $this->textId2_1 . '" bytes="23" />
- </revision>
- <revision>
- <id>' . ( $this->revId2_2 + $i * self::$numOfRevs ) . '</id>
- <parentid>' . ( $this->revId2_1 + $i * self::$numOfRevs ) . '</parentid>
- <timestamp>2012-04-01T16:46:05Z</timestamp>
- <contributor>
- <ip>127.0.0.1</ip>
- </contributor>
- <comment>BackupDumperTestP2Summary2</comment>
- <sha1>b7vj5ks32po5m1z1t1br4o7scdwwy95</sha1>
- <text id="' . $this->textId2_2 . '" bytes="23" />
- </revision>
- <revision>
- <id>' . ( $this->revId2_3 + $i * self::$numOfRevs ) . '</id>
- <parentid>' . ( $this->revId2_2 + $i * self::$numOfRevs ) . '</parentid>
- <timestamp>2012-04-01T16:46:05Z</timestamp>
- <contributor>
- <ip>127.0.0.1</ip>
- </contributor>
- <comment>BackupDumperTestP2Summary3</comment>
- <sha1>jfunqmh1ssfb8rs43r19w98k28gg56r</sha1>
- <text id="' . $this->textId2_3 . '" bytes="23" />
- </revision>
- <revision>
- <id>' . ( $this->revId2_4 + $i * self::$numOfRevs ) . '</id>
- <parentid>' . ( $this->revId2_3 + $i * self::$numOfRevs ) . '</parentid>
- <timestamp>2012-04-01T16:46:05Z</timestamp>
- <contributor>
- <ip>127.0.0.1</ip>
- </contributor>
- <comment>BackupDumperTestP2Summary4 extra</comment>
- <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
- <text id="' . $this->textId2_4 . '" bytes="44" />
- </revision>
- </page>
-';
- // page 3 not in stub
-
- $page4 = ' <page>
- <title>Talk:BackupDumperTestP1</title>
- <ns>1</ns>
- <id>' . ( $this->pageId4 + $i * self::$numOfPages ) . '</id>
- <revision>
- <id>' . ( $this->revId4_1 + $i * self::$numOfRevs ) . '</id>
- <timestamp>2012-04-01T16:46:05Z</timestamp>
- <contributor>
- <ip>127.0.0.1</ip>
- </contributor>
- <comment>Talk BackupDumperTestP1 Summary1</comment>
- <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
- <text id="' . $this->textId4_1 . '" bytes="35" />
- </revision>
- </page>
-';
- $content .= $page1 . $page2 . $page4;
- }
- $content .= $tail;
- $this->assertEquals( strlen( $content ), file_put_contents(
- $fname, $content ), "Length of prepared stub" );
- return $fname;
- }
-
-}
diff --git a/tests/phpunit/maintenance/backup_LogTest.php b/tests/phpunit/maintenance/backup_LogTest.php
deleted file mode 100644
index 8a8dea5a..00000000
--- a/tests/phpunit/maintenance/backup_LogTest.php
+++ /dev/null
@@ -1,227 +0,0 @@
-<?php
-/**
- * Tests for log dumps of BackupDumper
- *
- * @group Database
- * @group Dump
- */
-class BackupDumperLoggerTest extends DumpTestCase {
-
-
- // We'll add several log entries and users for this test. The following
- // variables hold the corresponding ids.
- private $userId1, $userId2;
- private $logId1, $logId2, $logId3;
-
- /**
- * adds a log entry to the database.
- *
- * @param $type string: type of the log entry
- * @param $subtype string: subtype of the log entry
- * @param $user User: user that performs the logged operation
- * @param $ns int: number of the namespace for the entry's target's title
- * @param $title string: title of the entry's target
- * @param $comment string: comment of the log entry
- * @param $parameters Array: (optional) accompanying data that is attached
- * to the entry
- *
- * @return int id of the added log entry
- */
- private function addLogEntry( $type, $subtype, User $user, $ns, $title,
- $comment = null, $parameters = null ) {
-
- $logEntry = new ManualLogEntry( $type, $subtype );
- $logEntry->setPerformer( $user );
- $logEntry->setTarget( Title::newFromText( $title, $ns ) );
- if ( $comment !== null ) {
- $logEntry->setComment( $comment );
- }
- if ( $parameters !== null ) {
- $logEntry->setParameters( $parameters );
- }
- return $logEntry->insert();
- }
-
- function addDBData() {
- $this->tablesUsed[] = 'logging';
- $this->tablesUsed[] = 'user';
-
- try {
- $user1 = User::newFromName( 'BackupDumperLogUserA' );
- $this->userId1 = $user1->getId();
- if ( $this->userId1 === 0 ) {
- $user1->addToDatabase();
- $this->userId1 = $user1->getId();
- }
- $this->assertGreaterThan( 0, $this->userId1 );
-
- $user2 = User::newFromName( 'BackupDumperLogUserB' );
- $this->userId2 = $user2->getId();
- if ( $this->userId2 === 0 ) {
- $user2->addToDatabase();
- $this->userId2 = $user2->getId();
- }
- $this->assertGreaterThan( 0, $this->userId2 );
-
- $this->logId1 = $this->addLogEntry( 'type', 'subtype',
- $user1, NS_MAIN, "PageA" );
- $this->assertGreaterThan( 0, $this->logId1 );
-
- $this->logId2 = $this->addLogEntry( 'supress', 'delete',
- $user2, NS_TALK, "PageB", "SomeComment" );
- $this->assertGreaterThan( 0, $this->logId2 );
-
- $this->logId3 = $this->addLogEntry( 'move', 'delete',
- $user2, NS_MAIN, "PageA", "SomeOtherComment",
- array( 'key1' => 1, 3 => 'value3' ) );
- $this->assertGreaterThan( 0, $this->logId3 );
-
- } catch ( Exception $e ) {
- // We'd love to pass $e directly. However, ... see
- // documentation of exceptionFromAddDBData in
- // DumpTestCase
- $this->exceptionFromAddDBData = $e;
- }
-
- }
-
-
- /**
- * asserts that the xml reader is at the beginning of a log entry and skips over
- * it while analyzing it.
- *
- * @param $id int: id of the log entry
- * @param $user_name string: user name of the log entry's performer
- * @param $user_id int: user id of the log entry 's performer
- * @param $comment string|null: comment of the log entry. If null, the comment
- * text is ignored.
- * @param $type string: type of the log entry
- * @param $subtype string: subtype of the log entry
- * @param $title string: title of the log entry's target
- * @param $parameters array: (optional) unserialized data accompanying the log entry
- */
- private function assertLogItem( $id, $user_name, $user_id, $comment, $type,
- $subtype, $title, $parameters = array() ) {
-
- $this->assertNodeStart( "logitem" );
- $this->skipWhitespace();
-
- $this->assertTextNode( "id", $id );
- $this->assertTextNode( "timestamp", false );
-
- $this->assertNodeStart( "contributor" );
- $this->skipWhitespace();
- $this->assertTextNode( "username", $user_name );
- $this->assertTextNode( "id", $user_id );
- $this->assertNodeEnd( "contributor" );
- $this->skipWhitespace();
-
- if ( $comment !== null ) {
- $this->assertTextNode( "comment", $comment );
- }
- $this->assertTextNode( "type", $type );
- $this->assertTextNode( "action", $subtype );
- $this->assertTextNode( "logtitle", $title );
-
- $this->assertNodeStart( "params" );
- $parameters_xml = unserialize( $this->xml->value );
- $this->assertEquals( $parameters, $parameters_xml );
- $this->assertTrue( $this->xml->read(), "Skipping past processed text of params" );
- $this->assertNodeEnd( "params" );
- $this->skipWhitespace();
-
- $this->assertNodeEnd( "logitem" );
- $this->skipWhitespace();
- }
-
- function testPlain () {
- global $wgContLang;
-
- // Preparing the dump
- $fname = $this->getNewTempFile();
- $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
- $dumper->startId = $this->logId1;
- $dumper->endId = $this->logId3 + 1;
- $dumper->reporting = false;
- $dumper->setDb( $this->db );
-
- // Performing the dump
- $dumper->dump( WikiExporter::LOGS, WikiExporter::TEXT );
-
- // Analyzing the dumped data
- $this->assertDumpStart( $fname );
-
- $this->assertLogItem( $this->logId1, "BackupDumperLogUserA",
- $this->userId1, null, "type", "subtype", "PageA" );
-
- $this->assertNotNull( $wgContLang, "Content language object validation" );
- $namespace = $wgContLang->getNsText( NS_TALK );
- $this->assertInternalType( 'string', $namespace );
- $this->assertGreaterThan( 0, strlen( $namespace ) );
- $this->assertLogItem( $this->logId2, "BackupDumperLogUserB",
- $this->userId2, "SomeComment", "supress", "delete",
- $namespace . ":PageB" );
-
- $this->assertLogItem( $this->logId3, "BackupDumperLogUserB",
- $this->userId2, "SomeOtherComment", "move", "delete",
- "PageA", array( 'key1' => 1, 3 => 'value3' ) );
-
- $this->assertDumpEnd();
- }
-
- function testXmlDumpsBackupUseCaseLogging() {
- global $wgContLang;
-
- // Preparing the dump
- $fname = $this->getNewTempFile();
- $dumper = new BackupDumper( array ( "--output=gzip:" . $fname,
- "--reporting=2" ) );
- $dumper->startId = $this->logId1;
- $dumper->endId = $this->logId3 + 1;
- $dumper->setDb( $this->db );
-
- // xmldumps-backup demands reporting, although this is currently not
- // implemented in BackupDumper, when dumping logging data. We
- // nevertheless capture the output of the dump process already now,
- // to be able to alert (once dumping produces reports) that this test
- // needs updates.
- $dumper->stderr = fopen( 'php://output', 'a' );
- if ( $dumper->stderr === FALSE ) {
- $this->fail( "Could not open stream for stderr" );
- }
-
- // Performing the dump
- $dumper->dump( WikiExporter::LOGS, WikiExporter::TEXT );
-
- $this->assertTrue( fclose( $dumper->stderr ), "Closing stderr handle" );
-
- // Analyzing the dumped data
- $this->gunzip( $fname );
-
- $this->assertDumpStart( $fname );
-
- $this->assertLogItem( $this->logId1, "BackupDumperLogUserA",
- $this->userId1, null, "type", "subtype", "PageA" );
-
- $this->assertNotNull( $wgContLang, "Content language object validation" );
- $namespace = $wgContLang->getNsText( NS_TALK );
- $this->assertInternalType( 'string', $namespace );
- $this->assertGreaterThan( 0, strlen( $namespace ) );
- $this->assertLogItem( $this->logId2, "BackupDumperLogUserB",
- $this->userId2, "SomeComment", "supress", "delete",
- $namespace . ":PageB" );
-
- $this->assertLogItem( $this->logId3, "BackupDumperLogUserB",
- $this->userId2, "SomeOtherComment", "move", "delete",
- "PageA", array( 'key1' => 1, 3 => 'value3' ) );
-
- $this->assertDumpEnd();
-
- // Currently, no reporting is implemented. Alert via failure, once
- // this changes.
- // If reporting for log dumps has been implemented, please update
- // the following statement to catch good output
- $this->expectOutputString( '' );
- }
-
-}
diff --git a/tests/phpunit/maintenance/backup_PageTest.php b/tests/phpunit/maintenance/backup_PageTest.php
deleted file mode 100644
index 925e277d..00000000
--- a/tests/phpunit/maintenance/backup_PageTest.php
+++ /dev/null
@@ -1,389 +0,0 @@
-<?php
-/**
- * Tests for page dumps of BackupDumper
- *
- * @group Database
- * @group Dump
- */
-class BackupDumperPageTest extends DumpTestCase {
-
- // We'll add several pages, revision and texts. The following variables hold the
- // corresponding ids.
- private $pageId1, $pageId2, $pageId3, $pageId4, $pageId5;
- private $revId1_1, $textId1_1;
- private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
- private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
- private $revId3_1, $textId3_1, $revId3_2, $textId3_2;
- private $revId4_1, $textId4_1;
-
- function addDBData() {
- $this->tablesUsed[] = 'page';
- $this->tablesUsed[] = 'revision';
- $this->tablesUsed[] = 'text';
-
- try {
- $title = Title::newFromText( 'BackupDumperTestP1' );
- $page = WikiPage::factory( $title );
- list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
- "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
- $this->pageId1 = $page->getId();
-
- $title = Title::newFromText( 'BackupDumperTestP2' );
- $page = WikiPage::factory( $title );
- list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
- "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
- list( $this->revId2_2, $this->textId2_2 ) = $this->addRevision( $page,
- "BackupDumperTestP2Text2", "BackupDumperTestP2Summary2" );
- list( $this->revId2_3, $this->textId2_3 ) = $this->addRevision( $page,
- "BackupDumperTestP2Text3", "BackupDumperTestP2Summary3" );
- list( $this->revId2_4, $this->textId2_4 ) = $this->addRevision( $page,
- "BackupDumperTestP2Text4 some additional Text ",
- "BackupDumperTestP2Summary4 extra " );
- $this->pageId2 = $page->getId();
-
- $title = Title::newFromText( 'BackupDumperTestP3' );
- $page = WikiPage::factory( $title );
- list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
- "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
- list( $this->revId3_2, $this->textId3_2 ) = $this->addRevision( $page,
- "BackupDumperTestP3Text2", "BackupDumperTestP2Summary2" );
- $this->pageId3 = $page->getId();
- $page->doDeleteArticle( "Testing ;)" );
-
- $title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
- $page = WikiPage::factory( $title );
- list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
- "Talk about BackupDumperTestP1 Text1",
- "Talk BackupDumperTestP1 Summary1" );
- $this->pageId4 = $page->getId();
- } catch ( Exception $e ) {
- // We'd love to pass $e directly. However, ... see
- // documentation of exceptionFromAddDBData in
- // DumpTestCase
- $this->exceptionFromAddDBData = $e;
- }
-
- }
-
- public function setUp() {
- parent::setUp();
-
- // Since we will restrict dumping by page ranges (to allow
- // working tests, even if the db gets prepopulated by a base
- // class), we have to assert, that the page id are consecutively
- // increasing
- $this->assertEquals(
- array( $this->pageId2, $this->pageId3, $this->pageId4 ),
- array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
- "Page ids increasing without holes" );
-
- }
-
- function testFullTextPlain () {
- // Preparing the dump
- $fname = $this->getNewTempFile();
- $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
- $dumper->startId = $this->pageId1;
- $dumper->endId = $this->pageId4 + 1;
- $dumper->reporting = false;
- $dumper->setDb( $this->db );
-
- // Performing the dump
- $dumper->dump( WikiExporter::FULL, WikiExporter::TEXT );
-
- // Checking the dumped data
- $this->assertDumpStart( $fname );
-
- // Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
- "BackupDumperTestP1Text1" );
- $this->assertPageEnd();
-
- // Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
- $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
- $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2",
- "BackupDumperTestP2Text1" );
- $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
- $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
- "BackupDumperTestP2Text2", $this->revId2_1 );
- $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
- $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r",
- "BackupDumperTestP2Text3", $this->revId2_2 );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv",
- "BackupDumperTestP2Text4 some additional Text", $this->revId2_3 );
- $this->assertPageEnd();
-
- // Page 3
- // -> Page is marked deleted. Hence not visible
-
- // Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe",
- "Talk about BackupDumperTestP1 Text1" );
- $this->assertPageEnd();
-
- $this->assertDumpEnd();
- }
-
- function testFullStubPlain () {
- // Preparing the dump
- $fname = $this->getNewTempFile();
- $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
- $dumper->startId = $this->pageId1;
- $dumper->endId = $this->pageId4 + 1;
- $dumper->reporting = false;
- $dumper->setDb( $this->db );
-
- // Performing the dump
- $dumper->dump( WikiExporter::FULL, WikiExporter::STUB );
-
- // Checking the dumped data
- $this->assertDumpStart( $fname );
-
- // Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
- $this->assertPageEnd();
-
- // Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
- $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
- $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
- $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
- $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95", false, $this->revId2_1 );
- $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
- $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r", false, $this->revId2_2 );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
- $this->assertPageEnd();
-
- // Page 3
- // -> Page is marked deleted. Hence not visible
-
- // Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
- $this->assertPageEnd();
-
- $this->assertDumpEnd();
- }
-
- function testCurrentStubPlain () {
- // Preparing the dump
- $fname = $this->getNewTempFile();
- $dumper = new BackupDumper( array ( "--output=file:" . $fname ) );
- $dumper->startId = $this->pageId1;
- $dumper->endId = $this->pageId4 + 1;
- $dumper->reporting = false;
- $dumper->setDb( $this->db );
-
- // Performing the dump
- $dumper->dump( WikiExporter::CURRENT, WikiExporter::STUB );
-
- // Checking the dumped data
- $this->assertDumpStart( $fname );
-
- // Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
- $this->assertPageEnd();
-
- // Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
- $this->assertPageEnd();
-
- // Page 3
- // -> Page is marked deleted. Hence not visible
-
- // Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
- $this->assertPageEnd();
-
- $this->assertDumpEnd();
- }
-
- function testCurrentStubGzip () {
- // Preparing the dump
- $fname = $this->getNewTempFile();
- $dumper = new BackupDumper( array ( "--output=gzip:" . $fname ) );
- $dumper->startId = $this->pageId1;
- $dumper->endId = $this->pageId4 + 1;
- $dumper->reporting = false;
- $dumper->setDb( $this->db );
-
- // Performing the dump
- $dumper->dump( WikiExporter::CURRENT, WikiExporter::STUB );
-
- // Checking the dumped data
- $this->gunzip( $fname );
- $this->assertDumpStart( $fname );
-
- // Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
- $this->assertPageEnd();
-
- // Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
- $this->assertPageEnd();
-
- // Page 3
- // -> Page is marked deleted. Hence not visible
-
- // Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
- $this->assertPageEnd();
-
- $this->assertDumpEnd();
- }
-
-
-
- function testXmlDumpsBackupUseCase () {
- // xmldumps-backup typically performs a single dump that that writes
- // out three files
- // * gzipped stubs of everything (meta-history)
- // * gzipped stubs of latest revisions of all pages (meta-current)
- // * gzipped stubs of latest revisions of all pages of namespage 0
- // (articles)
- //
- // We reproduce such a setup with our mini fixture, although we omit
- // chunks, and all the other gimmicks of xmldumps-backup.
- //
- $fnameMetaHistory = $this->getNewTempFile();
- $fnameMetaCurrent = $this->getNewTempFile();
- $fnameArticles = $this->getNewTempFile();
-
- $dumper = new BackupDumper( array ( "--output=gzip:" . $fnameMetaHistory,
- "--output=gzip:" . $fnameMetaCurrent, "--filter=latest",
- "--output=gzip:" . $fnameArticles, "--filter=latest",
- "--filter=notalk", "--filter=namespace:!NS_USER",
- "--reporting=1000" ) );
- $dumper->startId = $this->pageId1;
- $dumper->endId = $this->pageId4 + 1;
- $dumper->setDb( $this->db );
-
- // xmldumps-backup uses reporting. We will not check the exact reported
- // message, as they are dependent on the processing power of the used
- // computer. We only check that reporting does not crash the dumping
- // and that something is reported
- $dumper->stderr = fopen( 'php://output', 'a' );
- if ( $dumper->stderr === FALSE ) {
- $this->fail( "Could not open stream for stderr" );
- }
-
- // Performing the dump
- $dumper->dump( WikiExporter::FULL, WikiExporter::STUB );
-
- $this->assertTrue( fclose( $dumper->stderr ), "Closing stderr handle" );
-
- // Checking meta-history -------------------------------------------------
-
- $this->gunzip( $fnameMetaHistory );
- $this->assertDumpStart( $fnameMetaHistory );
-
- // Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
- $this->assertPageEnd();
-
- // Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
- $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
- $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
- $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
- $this->textId2_2, 23, "b7vj5ks32po5m1z1t1br4o7scdwwy95", false, $this->revId2_1 );
- $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
- $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r", false, $this->revId2_2 );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
- $this->assertPageEnd();
-
- // Page 3
- // -> Page is marked deleted. Hence not visible
-
- // Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
- $this->assertPageEnd();
-
- $this->assertDumpEnd();
-
- // Checking meta-current -------------------------------------------------
-
- $this->gunzip( $fnameMetaCurrent );
- $this->assertDumpStart( $fnameMetaCurrent );
-
- // Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
- $this->assertPageEnd();
-
- // Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
- $this->assertPageEnd();
-
- // Page 3
- // -> Page is marked deleted. Hence not visible
-
- // Page 4
- $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
- $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
- $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
- $this->assertPageEnd();
-
- $this->assertDumpEnd();
-
- // Checking articles -------------------------------------------------
-
- $this->gunzip( $fnameArticles );
- $this->assertDumpStart( $fnameArticles );
-
- // Page 1
- $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
- $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
- $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
- $this->assertPageEnd();
-
- // Page 2
- $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
- $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
- $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
- $this->assertPageEnd();
-
- // Page 3
- // -> Page is marked deleted. Hence not visible
-
- // Page 4
- // -> Page is not in NS_MAIN. Hence not visible
-
- $this->assertDumpEnd();
-
- $this->expectETAOutput();
- }
-
-
-
-}
diff --git a/tests/phpunit/maintenance/fetchTextTest.php b/tests/phpunit/maintenance/fetchTextTest.php
deleted file mode 100644
index e7ffa01c..00000000
--- a/tests/phpunit/maintenance/fetchTextTest.php
+++ /dev/null
@@ -1,243 +0,0 @@
-<?php
-
-require_once __DIR__ . "/../../../maintenance/fetchText.php";
-
-/**
- * Mock for the input/output of FetchText
- *
- * FetchText internally tries to access stdin and stdout. We mock those aspects
- * for testing.
- */
-class SemiMockedFetchText extends FetchText {
-
- /**
- * @var String|null Text to pass as stdin
- */
- private $mockStdinText = null;
-
- /**
- * @var bool Whether or not a text for stdin has been provided
- */
- private $mockSetUp = False;
-
- /**
- * @var Array Invocation counters for the mocked aspects
- */
- private $mockInvocations = array( 'getStdin' => 0 );
-
-
-
- /**
- * Data for the fake stdin
- *
- * @param $stdin String The string to be used instead of stdin
- */
- function mockStdin( $stdin )
- {
- $this->mockStdinText = $stdin;
- $this->mockSetUp = True;
- }
-
- /**
- * Gets invocation counters for mocked methods.
- *
- * @return Array An array, whose keys are function names. The corresponding values
- * denote the number of times the function has been invoked.
- */
- function mockGetInvocations()
- {
- return $this->mockInvocations;
- }
-
- // -----------------------------------------------------------------
- // Mocked functions from FetchText follow.
-
- function getStdin( $len = null )
- {
- $this->mockInvocations['getStdin']++;
- if ( $len !== null ) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- "Tried to get stdin with non null parameter" );
- }
-
- if ( ! $this->mockSetUp ) {
- throw new PHPUnit_Framework_ExpectationFailedException(
- "Tried to get stdin before setting up rerouting" );
- }
-
- return fopen( 'data://text/plain,' . $this->mockStdinText, 'r' );
- }
-
-}
-
-/**
- * TestCase for FetchText
- *
- * @group Database
- * @group Dump
- */
-class FetchTextTest extends MediaWikiTestCase {
-
- // We add 5 Revisions for this test. Their corresponding text id's
- // are stored in the following 5 variables.
- private $textId1;
- private $textId2;
- private $textId3;
- private $textId4;
- private $textId5;
-
-
- /**
- * @var Exception|null As the current MediaWikiTestCase::run is not
- * robust enough to recover from thrown exceptions directly, we cannot
- * throw frow within addDBData, although it would be appropriate. Hence,
- * we catch the exception and store it until we are in setUp and may
- * finally rethrow the exception without crashing the test suite.
- */
- private $exceptionFromAddDBData;
-
- /**
- * @var FetchText the (mocked) FetchText that is to test
- */
- private $fetchText;
-
- /**
- * Adds a revision to a page, while returning the resuting text's id
- *
- * @param $page WikiPage The page to add the revision to
- * @param $text String The revisions text
- * @param $text String The revisions summare
- *
- * @throws MWExcepion
- */
- private function addRevision( $page, $text, $summary ) {
- $status = $page->doEdit( $text, $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" );
- }
-
-
- function addDBData() {
- $this->tablesUsed[] = 'page';
- $this->tablesUsed[] = 'revision';
- $this->tablesUsed[] = 'text';
-
- try {
- $title = Title::newFromText( 'FetchTextTestPage1' );
- $page = WikiPage::factory( $title );
- $this->textId1 = $this->addRevision( $page, "FetchTextTestPage1Text1", "FetchTextTestPage1Summary1" );
-
- $title = Title::newFromText( 'FetchTextTestPage2' );
- $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 " );
- } catch ( Exception $e ) {
- // We'd love to pass $e directly. However, ... see
- // documentation of exceptionFromAddDBData
- $this->exceptionFromAddDBData = $e;
- }
- }
-
-
- protected function setUp() {
- parent::setUp();
-
- // Check if any Exception is stored for rethrowing from addDBData
- if ( $this->exceptionFromAddDBData !== null ) {
- throw $this->exceptionFromAddDBData;
- }
-
- $this->fetchText = new SemiMockedFetchText();
- }
-
-
- /**
- * Helper to relate FetchText's input and output
- */
- private function assertFilter( $input, $expectedOutput ) {
- $this->fetchText->mockStdin( $input );
- $this->fetchText->execute();
- $invocations = $this->fetchText->mockGetInvocations();
- $this->assertEquals( 1, $invocations['getStdin'],
- "getStdin invocation counter" );
- $this->expectOutputString( $expectedOutput );
- }
-
-
-
- // Instead of the following functions, a data provider would be great.
- // However, as data providers are evaluated /before/ addDBData, a data
- // provider would not know the required ids.
-
- function testExistingSimple() {
- $this->assertFilter( $this->textId2,
- $this->textId2 . "\n23\nFetchTextTestPage2Text1" );
- }
-
- function testExistingSimpleWithNewline() {
- $this->assertFilter( $this->textId2 . "\n",
- $this->textId2 . "\n23\nFetchTextTestPage2Text1" );
- }
-
- function testExistingSeveral() {
- $this->assertFilter( "$this->textId1\n$this->textId5\n"
- . "$this->textId3\n$this->textId3",
- implode( "", array(
- $this->textId1 . "\n23\nFetchTextTestPage1Text1",
- $this->textId5 . "\n44\nFetchTextTestPage2Text4 "
- . "some additional Text",
- $this->textId3 . "\n23\nFetchTextTestPage2Text2",
- $this->textId3 . "\n23\nFetchTextTestPage2Text2"
- ) ) );
- }
-
- function testEmpty() {
- $this->assertFilter( "", null );
- }
-
- function testNonExisting() {
- $this->assertFilter( $this->textId5 + 10, ( $this->textId5 + 10 ) . "\n-1\n" );
- }
-
- function testNegativeInteger() {
- $this->assertFilter( "-42", "-42\n-1\n" );
- }
-
- function testFloatingPointNumberExisting() {
- // float -> int -> revision
- $this->assertFilter( $this->textId3 + 0.14159,
- $this->textId3 . "\n23\nFetchTextTestPage2Text2" );
- }
-
- function testFloatingPointNumberNonExisting() {
- $this->assertFilter( $this->textId5 + 3.14159,
- ( $this->textId5 + 3 ) . "\n-1\n" );
- }
-
- function testCharacters() {
- $this->assertFilter( "abc", "0\n-1\n" );
- }
-
- function testMix() {
- $this->assertFilter( "ab\n" . $this->textId4 . ".5cd\n\nefg\n" . $this->textId2
- . "\n" . $this->textId3,
- implode( "", array(
- "0\n-1\n",
- $this->textId4 . "\n23\nFetchTextTestPage2Text3",
- "0\n-1\n",
- "0\n-1\n",
- $this->textId2 . "\n23\nFetchTextTestPage2Text1",
- $this->textId3 . "\n23\nFetchTextTestPage2Text2"
- ) ) );
- }
-
-}
diff --git a/tests/phpunit/maintenance/getSlaveServerTest.php b/tests/phpunit/maintenance/getSlaveServerTest.php
deleted file mode 100644
index 0b7c758c..00000000
--- a/tests/phpunit/maintenance/getSlaveServerTest.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-
-require_once __DIR__ . "/../../../maintenance/getSlaveServer.php";
-
-/**
- * Tests for getSlaveServer
- *
- * @group Database
- */
-class GetSlaveServerTest extends MediaWikiTestCase {
-
- /**
- * Yields a regular expression that matches a good DB server name
- *
- * It matches IPs or hostnames, both optionally followed by a
- * port specification
- *
- * @return String the regular expression
- */
- private function getServerRE() {
- if ( $this->db->getType() === 'sqlite' ) {
- // for SQLite, only the empty string is a good server name
- return '';
- }
-
- $octet = '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])';
- $ip = "(($octet\.){3}$octet)";
-
- $label = '([a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)';
- $hostname = "($label(\.$label)*)";
-
- return "($ip|$hostname)(:[0-9]{1,5})?";
- }
-
- function testPlain() {
- $gss = new GetSlaveServer();
- $gss->execute();
-
- $this->expectOutputRegex( "/^" . self::getServerRE() . "\n$/D" );
- }
-
- function testXmlDumpsBackupUseCase() {
- global $wgDBprefix;
-
- global $argv;
- $argv = array( null, "--globals" );
-
- $gss = new GetSlaveServer();
- $gss->loadParamsAndArgs();
- $gss->execute();
- $gss->globals();
-
- // The main answer
- $output = $this->getActualOutput();
- $firstLineEndPos = strpos( $output,"\n");
- if ( $firstLineEndPos === FALSE ) {
- $this->fail( "Could not find end of first line of output" );
- }
- $firstLine = substr( $output, 0 , $firstLineEndPos );
- $this->assertRegExp( "/^" . self::getServerRE() . "$/D",
- $firstLine, "DB Server" );
-
- // xmldumps-backup relies on the wgDBprefix in the output.
- $this->expectOutputRegex( "/^[[:space:]]*\[wgDBprefix\][[:space:]]*=> "
- . $wgDBprefix . "$/m" );
- }
-
-
-}
diff --git a/tests/phpunit/phpunit.php b/tests/phpunit/phpunit.php
deleted file mode 100644
index bcbf4ec1..00000000
--- a/tests/phpunit/phpunit.php
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/usr/bin/env php
-<?php
-/**
- * Bootstrapping for MediaWiki PHPUnit tests
- *
- * @file
- */
-
-/* Configuration */
-
-// Evaluate the include path relative to this file
-$IP = dirname( dirname( __DIR__ ) );
-
-// 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
-require_once( "$IP/maintenance/Maintenance.php" );
-
-class PHPUnitMaintClass extends Maintenance {
-
- 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`.'
- , false # not required
- , true # need arg
- );
- }
-
- public function finalSetup() {
- parent::finalSetup();
-
- global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
- global $wgLanguageConverterCacheType, $wgUseDatabaseMessages;
- global $wgLocaltimezone, $wgLocalisationCacheConf;
- global $wgDevelopmentWarnings;
-
- // wfWarn should cause tests to fail
- $wgDevelopmentWarnings = true;
-
- $wgMainCacheType = CACHE_NONE;
- $wgMessageCacheType = CACHE_NONE;
- $wgParserCacheType = CACHE_NONE;
- $wgLanguageConverterCacheType = CACHE_NONE;
-
- $wgUseDatabaseMessages = false; # Set for future resets
-
- // Assume UTC for testing purposes
- $wgLocaltimezone = 'UTC';
-
- $wgLocalisationCacheConf['storeClass'] = 'LCStore_Null';
- }
-
- public function execute() {
- global $IP;
-
- # Make sure we have --configuration or PHPUnit might complain
- if( !in_array( '--configuration', $_SERVER['argv'] ) ) {
- //Hack to eliminate the need to use the Makefile (which sucks ATM)
- array_splice( $_SERVER['argv'], 1, 0,
- array( '--configuration', $IP . '/tests/phpunit/suite.xml' ) );
- }
-
- # --with-phpunitdir let us override the default PHPUnit version
- if( $phpunitDir = $this->getOption( 'with-phpunitdir' ) ) {
- # Sanity checks
- if( !is_dir($phpunitDir) ) {
- $this->error( "--with-phpunitdir should be set to an existing directory", 1 );
- }
- if( !is_readable( $phpunitDir."/PHPUnit/Runner/Version.php" ) ) {
- $this->error( "No usable PHPUnit installation in $phpunitDir.\nAborting.\n", 1 );
- }
-
- # Now prepends provided PHPUnit directory
- $this->output( "Will attempt loading PHPUnit from `$phpunitDir`\n" );
- set_include_path( $phpunitDir
- . PATH_SEPARATOR . get_include_path() );
-
- # Cleanup $args array so the option and its value do not
- # pollute PHPUnit
- $key = array_search( '--with-phpunitdir', $_SERVER['argv'] );
- unset( $_SERVER['argv'][$key] ); // the option
- unset( $_SERVER['argv'][$key+1] ); // its value
- $_SERVER['argv'] = array_values( $_SERVER['argv'] );
-
- }
- }
-
- public function getDbType() {
- return Maintenance::DB_ADMIN;
- }
-}
-
-$maintClass = 'PHPUnitMaintClass';
-require( RUN_MAINTENANCE_IF_MAIN );
-
-require_once( 'PHPUnit/Runner/Version.php' );
-
-if( PHPUnit_Runner_Version::id() !== '@package_version@'
- && version_compare( PHPUnit_Runner_Version::id(), '3.6.7', '<' ) ) {
- die( 'PHPUnit 3.6.7 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
-}
-require_once( 'PHPUnit/Autoload.php' );
-
-require_once( "$IP/tests/TestsAutoLoader.php" );
-MediaWikiPHPUnitCommand::main();
diff --git a/tests/phpunit/run-tests.bat b/tests/phpunit/run-tests.bat
deleted file mode 100644
index e6eb3e0c..00000000
--- a/tests/phpunit/run-tests.bat
+++ /dev/null
@@ -1 +0,0 @@
-php phpunit.php --configuration suite.xml %*
diff --git a/tests/phpunit/skins/SideBarTest.php b/tests/phpunit/skins/SideBarTest.php
deleted file mode 100644
index 912d7602..00000000
--- a/tests/phpunit/skins/SideBarTest.php
+++ /dev/null
@@ -1,209 +0,0 @@
-<?php
-
-/**
- * @group Skin
- */
-class SideBarTest extends MediaWikiLangTestCase {
-
- /** A skin template, reinitialized before each test */
- private $skin;
- /** Local cache for sidebar messages */
- private $messages;
-
- function __construct() {
- parent::__construct();
- }
-
- /** Build $this->messages array */
- private function initMessagesHref() {
- # List of default messages for the sidebar:
- $URL_messages = array(
- 'mainpage',
- 'portal-url',
- 'currentevents-url',
- 'recentchanges-url',
- 'randompage-url',
- 'helppage',
- );
-
- foreach( $URL_messages as $m ) {
- $titleName = MessageCache::singleton()->get($m);
- $title = Title::newFromText( $titleName );
- $this->messages[$m]['href'] = $title->getLocalURL();
- }
- }
-
- function setUp() {
- parent::setUp();
- $this->initMessagesHref();
- $this->skin = new SkinTemplate();
- $this->skin->getContext()->setLanguage( Language::factory( 'en' ) );
- }
- function tearDown() {
- parent::tearDown();
- $this->skin = null;
- }
-
- /**
- * Internal helper to test the sidebar
- * @param $expected
- * @param $text
- * @param $message (Default: '')
- */
- private function assertSideBar( $expected, $text, $message = '' ) {
- $bar = array();
- $this->skin->addToSidebarPlain( $bar, $text );
- $this->assertEquals( $expected, $bar, $message );
- }
-
- function testSidebarWithOnlyTwoTitles() {
- $this->assertSideBar(
- array(
- 'Title1' => array(),
- 'Title2' => array(),
- ),
-'* Title1
-* Title2
-'
- );
- }
-
- function testExpandMessages() {
- $this->assertSidebar(
- array( 'Title' => array(
- array(
- 'text' => 'Help',
- 'href' => $this->messages['helppage']['href'],
- 'id' => 'n-help',
- 'active' => null
- )
- )),
-'* Title
-** helppage|help
-'
- );
- }
-
- function testExternalUrlsRequireADescription() {
- $this->assertSidebar(
- array( 'Title' => array(
- # ** http://www.mediawiki.org/| Home
- array(
- 'text' => 'Home',
- 'href' => 'http://www.mediawiki.org/',
- 'id' => 'n-Home',
- 'active' => null,
- 'rel' => 'nofollow',
- ),
- # ** http://valid.no.desc.org/
- # ... skipped since it is missing a pipe with a description
- )),
-'* Title
-** http://www.mediawiki.org/| Home
-** http://valid.no.desc.org/
-'
-
- );
-
- }
- /**
- * bug 33321 - Make sure there's a | after transforming.
- * @group Database
- */
- function testTrickyPipe() {
- $this->assertSidebar(
- array( 'Title' => array(
- # The first 2 are skipped
- # Doesn't really test the url properly
- # because it will vary with $wgArticlePath et al.
- # ** Baz|Fred
- array(
- 'text' => 'Fred',
- 'href' => Title::newFromText( 'Baz' )->getLocalUrl(),
- 'id' => 'n-Fred',
- 'active' => null,
- ),
- array(
- 'text' => 'title-to-display',
- 'href' => Title::newFromText( 'page-to-go-to' )->getLocalUrl(),
- 'id' => 'n-title-to-display',
- 'active' => null,
- ),
- )),
-'* Title
-** {{PAGENAME|Foo}}
-** Bar
-** Baz|Fred
-** {{PLURAL:1|page-to-go-to{{int:pipe-separator/en}}title-to-display|branch not taken}}
-'
- );
-
- }
-
-
- #### Attributes for external links ##########################
- private function getAttribs( ) {
- # Sidebar text we will use everytime
- $text = '* Title
-** http://www.mediawiki.org/| Home';
-
- $bar = array();
- $this->skin->addToSideBarPlain( $bar, $text );
-
- return $bar['Title'][0];
- }
-
- /**
- * Simple test to verify our helper assertAttribs() is functional
- * Please note this assume MediaWiki default settings:
- * $wgNoFollowLinks = true
- * $wgExternalLinkTarget = false
- */
- function testTestAttributesAssertionHelper() {
- $attribs = $this->getAttribs();
-
- $this->assertArrayHasKey( 'rel', $attribs );
- $this->assertEquals( 'nofollow', $attribs['rel'] );
-
- $this->assertArrayNotHasKey( 'target', $attribs );
- }
-
- /**
- * Test $wgNoFollowLinks in sidebar
- */
- function testRespectWgnofollowlinks() {
- global $wgNoFollowLinks;
- $saved = $wgNoFollowLinks;
- $wgNoFollowLinks = false;
-
- $attribs = $this->getAttribs();
- $this->assertArrayNotHasKey( 'rel', $attribs,
- 'External URL in sidebar do not have rel=nofollow when $wgNoFollowLinks = false'
- );
-
- // Restore global
- $wgNoFollowLinks = $saved;
- }
-
- /**
- * Test $wgExternaLinkTarget in sidebar
- */
- function testRespectExternallinktarget() {
- global $wgExternalLinkTarget;
- $saved = $wgExternalLinkTarget;
-
- $wgExternalLinkTarget = '_blank';
- $attribs = $this->getAttribs();
- $this->assertArrayHasKey( 'target', $attribs );
- $this->assertEquals( $attribs['target'], '_blank' );
-
- $wgExternalLinkTarget = '_self';
- $attribs = $this->getAttribs();
- $this->assertArrayHasKey( 'target', $attribs );
- $this->assertEquals( $attribs['target'], '_self' );
-
- // Restore global
- $wgExternalLinkTarget = $saved;
- }
-
-}
diff --git a/tests/phpunit/suite.xml b/tests/phpunit/suite.xml
deleted file mode 100644
index 56f64477..00000000
--- a/tests/phpunit/suite.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- colors don't work on Windows! -->
-<phpunit bootstrap="./bootstrap.php"
- colors="true"
- backupGlobals="false"
- convertErrorsToExceptions="true"
- convertNoticesToExceptions="true"
- convertWarningsToExceptions="true"
- stopOnFailure="false"
- timeoutForSmallTests="10"
- timeoutForMediumTests="30"
- timeoutForLargeTests="60"
- strict="true"
- verbose="true">
- <testsuites>
- <testsuite name="includes">
- <directory>includes</directory>
- </testsuite>
- <testsuite name="languages">
- <directory>languages</directory>
- </testsuite>
- <testsuite name="skins">
- <directory>skins</directory>
- </testsuite>
- <!-- As there is a class Maintenance, we cannot use the
- name "maintenance" directly -->
- <testsuite name="maintenance_suite">
- <directory>maintenance</directory>
- </testsuite>
- <testsuite name="structure">
- <file>StructureTest.php</file>
- </testsuite>
- <testsuite name="uploadfromurl">
- <file>suites/UploadFromUrlTestSuite.php</file>
- </testsuite>
- <testsuite name="extensions">
- <file>suites/ExtensionsTestSuite.php</file>
- </testsuite>
- </testsuites>
- <groups>
- <exclude>
- <group>Utility</group>
- <group>Broken</group>
- <group>ParserFuzz</group>
- <group>Stub</group>
- </exclude>
- </groups>
-</phpunit>
diff --git a/tests/phpunit/suites/ExtensionsTestSuite.php b/tests/phpunit/suites/ExtensionsTestSuite.php
deleted file mode 100644
index d728807f..00000000
--- a/tests/phpunit/suites/ExtensionsTestSuite.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * This test suite runs unit tests registered by extensions.
- * See http://www.mediawiki.org/wiki/Manual:Hooks/UnitTestsList for details of how to register your tests.
- */
-
-class ExtensionsTestSuite extends PHPUnit_Framework_TestSuite {
- public function __construct() {
- parent::__construct();
- $files = array();
- wfRunHooks( 'UnitTestsList', array( &$files ) );
- foreach ( $files as $file ) {
- $this->addTestFile( $file );
- }
- if ( !count( $files ) ) {
- $this->addTest( new DummyExtensionsTest( 'testNothing' ) );
- }
- }
-
- public static function suite() {
- return new self;
- }
-}
-
-/**
- * Needed to avoid warnings like 'No tests found in class "ExtensionsTestSuite".'
- * when no extensions with tests are used.
- */
-class DummyExtensionsTest extends MediaWikiTestCase {
- public function testNothing() {
- $this->assertTrue( true );
- }
-}
diff --git a/tests/phpunit/suites/UploadFromUrlTestSuite.php b/tests/phpunit/suites/UploadFromUrlTestSuite.php
deleted file mode 100644
index f2638111..00000000
--- a/tests/phpunit/suites/UploadFromUrlTestSuite.php
+++ /dev/null
@@ -1,204 +0,0 @@
-<?php
-
-require_once( dirname( __DIR__ ) . '/includes/upload/UploadFromUrlTest.php' );
-
-class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
- public $savedGlobals = array();
-
- public static function addTables( &$tables ) {
- $tables[] = 'user_properties';
- $tables[] = 'filearchive';
- $tables[] = 'logging';
- $tables[] = 'updatelog';
- $tables[] = 'iwlinks';
-
- return true;
- }
-
- function setUp() {
- global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
- $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
- $wgNamespaceAliases, $wgNamespaceProtection, $parserMemc;
-
- $tmpGlobals = array();
-
- $tmpGlobals['wgScript'] = '/index.php';
- $tmpGlobals['wgScriptPath'] = '/';
- $tmpGlobals['wgArticlePath'] = '/wiki/$1';
- $tmpGlobals['wgStyleSheetPath'] = '/skins';
- $tmpGlobals['wgStylePath'] = '/skins';
- $tmpGlobals['wgThumbnailScriptPath'] = false;
- $tmpGlobals['wgLocalFileRepo'] = array(
- 'class' => 'LocalRepo',
- 'name' => 'local',
- 'url' => 'http://example.com/images',
- 'hashLevels' => 2,
- 'transformVia404' => false,
- 'backend' => new FSFileBackend( array(
- 'name' => 'local-backend',
- 'lockManager' => 'fsLockManager',
- 'containerPaths' => array(
- 'local-public' => wfTempDir() . '/test-repo/public',
- 'local-thumb' => wfTempDir() . '/test-repo/thumb',
- 'local-temp' => wfTempDir() . '/test-repo/temp',
- 'local-deleted' => wfTempDir() . '/test-repo/delete',
- )
- ) ),
- );
- foreach ( $tmpGlobals as $var => $val ) {
- if ( array_key_exists( $var, $GLOBALS ) ) {
- $this->savedGlobals[$var] = $GLOBALS[$var];
- }
- $GLOBALS[$var] = $val;
- }
-
- $wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
- $wgNamespaceAliases['Image'] = NS_FILE;
- $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
-
-
- $wgEnableParserCache = false;
- DeferredUpdates::clearPendingUpdates();
- $wgMemc = wfGetMainCache();
- $messageMemc = wfGetMessageCacheStorage();
- $parserMemc = wfGetParserCacheStorage();
-
- // $wgContLang = new StubContLang;
- $wgUser = new User;
- $context = new RequestContext;
- $wgLang = $context->getLanguage();
- $wgOut = $context->getOutput();
- $wgParser = new StubObject( 'wgParser', $wgParserConf['class'], array( $wgParserConf ) );
- $wgRequest = $context->getRequest();
-
- if ( $wgStyleDirectory === false ) {
- $wgStyleDirectory = "$IP/skins";
- }
-
- RepoGroup::destroySingleton();
- FileBackendGroup::destroySingleton();
- }
-
- public function tearDown() {
- foreach ( $this->savedGlobals as $var => $val ) {
- $GLOBALS[$var] = $val;
- }
- // Restore backends
- RepoGroup::destroySingleton();
- FileBackendGroup::destroySingleton();
-
- $this->teardownUploadDir( $this->uploadDir );
- }
-
- private $uploadDir;
- private $keepUploads;
-
- /**
- * Remove the dummy uploads directory
- */
- private function teardownUploadDir( $dir ) {
- if ( $this->keepUploads ) {
- return;
- }
-
- // delete the files first, then the dirs.
- self::deleteFiles(
- array (
- "$dir/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
- "$dir/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
-
- "$dir/0/09/Bad.jpg",
- )
- );
-
- self::deleteDirs(
- array (
- "$dir/3/3a",
- "$dir/3",
- "$dir/thumb/6/65",
- "$dir/thumb/6",
- "$dir/thumb/3/3a/Foobar.jpg",
- "$dir/thumb/3/3a",
- "$dir/thumb/3",
-
- "$dir/0/09/",
- "$dir/0/",
-
- "$dir/thumb",
- "$dir",
- )
- );
- }
-
- /**
- * Delete the specified files, if they exist.
- *
- * @param $files Array: full paths to files to delete.
- */
- private static function deleteFiles( $files ) {
- foreach ( $files as $file ) {
- if ( file_exists( $file ) ) {
- unlink( $file );
- }
- }
- }
-
- /**
- * Delete the specified directories, if they exist. Must be empty.
- *
- * @param $dirs Array: full paths to directories to delete.
- */
- private static function deleteDirs( $dirs ) {
- foreach ( $dirs as $dir ) {
- if ( is_dir( $dir ) ) {
- rmdir( $dir );
- }
- }
- }
-
- /**
- * Create a dummy uploads directory which will contain a couple
- * of files in order to pass existence tests.
- *
- * @return String: the directory
- */
- private function setupUploadDir() {
- global $IP;
-
- if ( $this->keepUploads ) {
- $dir = wfTempDir() . '/mwParser-images';
-
- if ( is_dir( $dir ) ) {
- return $dir;
- }
- } else {
- $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
- }
-
- wfDebug( "Creating upload directory $dir\n" );
-
- if ( file_exists( $dir ) ) {
- wfDebug( "Already exists!\n" );
- return $dir;
- }
-
- wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
-
- wfMkdirParents( $dir . '/0/09', null, __METHOD__ );
- copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
-
- return $dir;
- }
-
- public static function suite() {
- // Hack to invoke the autoloader required to get phpunit to recognize
- // the UploadFromUrlTest class
- class_exists( 'UploadFromUrlTest' );
- $suite = new UploadFromUrlTestSuite( 'UploadFromUrlTest' );
- return $suite;
- }
-}
diff --git a/tests/qunit/.htaccess b/tests/qunit/.htaccess
deleted file mode 100644
index 605d2f4c..00000000
--- a/tests/qunit/.htaccess
+++ /dev/null
@@ -1 +0,0 @@
-Allow from all
diff --git a/tests/qunit/QUnitTestResources.php b/tests/qunit/QUnitTestResources.php
deleted file mode 100644
index 59ae73cd..00000000
--- a/tests/qunit/QUnitTestResources.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-return array(
-
- /* Test suites for MediaWiki core modules */
-
- 'mediawiki.tests.qunit.suites' => array(
- 'scripts' => array(
- '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',
- 'tests/qunit/suites/resources/jquery/jquery.client.test.js',
- 'tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js',
- 'tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js',
- 'tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js',
- 'tests/qunit/suites/resources/jquery/jquery.highlightText.test.js',
- 'tests/qunit/suites/resources/jquery/jquery.localize.test.js',
- 'tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js',
- 'tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js',
- 'tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js',
- 'tests/qunit/suites/resources/jquery/jquery.textSelection.test.js',
- 'tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js',
- 'tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js',
- 'tests/qunit/suites/resources/mediawiki/mediawiki.test.js',
- 'tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js',
- 'tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js',
- 'tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js',
- 'tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js',
- 'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js',
- 'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js',
- 'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
- 'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
- 'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
- ),
- 'dependencies' => array(
- 'jquery.autoEllipsis',
- 'jquery.byteLength',
- 'jquery.byteLimit',
- 'jquery.client',
- 'jquery.colorUtil',
- 'jquery.delayedBind',
- 'jquery.getAttrs',
- 'jquery.highlightText',
- 'jquery.localize',
- 'jquery.mwExtension',
- 'jquery.tabIndex',
- 'jquery.tablesorter',
- 'jquery.textSelection',
- 'mediawiki',
- 'mediawiki.api',
- 'mediawiki.api.parse',
- 'mediawiki.jqueryMsg',
- 'mediawiki.Title',
- 'mediawiki.Uri',
- 'mediawiki.user',
- 'mediawiki.util',
- 'mediawiki.special.recentchanges',
- 'mediawiki.language',
- 'mediawiki.cldr',
- ),
- 'position' => 'top',
- )
-);
diff --git a/tests/qunit/data/callMwLoaderTestCallback.js b/tests/qunit/data/callMwLoaderTestCallback.js
deleted file mode 100644
index 3f2ee92f..00000000
--- a/tests/qunit/data/callMwLoaderTestCallback.js
+++ /dev/null
@@ -1 +0,0 @@
-mw.loader.testCallback();
diff --git a/tests/qunit/data/load.mock.php b/tests/qunit/data/load.mock.php
deleted file mode 100644
index 1c189703..00000000
--- a/tests/qunit/data/load.mock.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * Mock load.php with pre-defined test modules.
- *
- * 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
- * @package MediaWiki
- * @author Lupo
- * @since 1.20
- */
-header( 'Content-Type: text/javascript; charset=utf-8' );
-
-require_once '../../../includes/Xml.php';
-
-$moduleImplementations = array(
- 'testUsesMissing' => "
-mw.loader.implement( 'testUsesMissing', function () {
- QUnit.ok( false, 'Module test.usesMissing script should not run.');
- QUnit.start();
-}, {}, {});
-",
-
- 'testUsesNestedMissing' => "
-mw.loader.implement( 'testUsesNestedMissing', function () {
- QUnit.ok( false, 'Module testUsesNestedMissing script should not run.');
-}, {}, {});
-",
-);
-
-$response = '';
-
-// Only support for non-encoded module names, full module names expected
-if ( isset( $_GET['modules'] ) ) {
- $modules = explode( ',', $_GET['modules'] );
- foreach ( $modules as $module ) {
- if ( isset( $moduleImplementations[$module] ) ) {
- $response .= $moduleImplementations[$module];
- } else {
- $response .= Xml::encodeJsCall( 'mw.loader.state', array( $module, 'missing' ) );
- }
- }
-}
-
-echo $response;
diff --git a/tests/qunit/data/qunitOkCall.js b/tests/qunit/data/qunitOkCall.js
deleted file mode 100644
index 25c42d6a..00000000
--- a/tests/qunit/data/qunitOkCall.js
+++ /dev/null
@@ -1,2 +0,0 @@
-QUnit.start();
-QUnit.assert.ok( true, 'Successfully loaded!');
diff --git a/tests/qunit/data/styleTest.css.php b/tests/qunit/data/styleTest.css.php
deleted file mode 100644
index 1870d5a3..00000000
--- a/tests/qunit/data/styleTest.css.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * Dynamically create a simple stylesheet for unit tests in MediaWiki.
- *
- * 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
- * @package MediaWiki
- * @author Timo Tijhof
- * @since 1.20
- */
-header( 'Content-Type: text/css; charset=utf-8' );
-
-/**
- * Allows characters in ranges [a-z], [A-Z] and [0-9],
- * in addition to a dot ("."), dash ("-"), space (" ") and hash ("#").
- * @since 1.20
- *
- * @param string $val
- * @return string Value with any illegal characters removed.
- */
-function cssfilter( $val ) {
- return preg_replace( '/[^A-Za-z0-9\.\- #]/', '', $val );
-}
-
-// Do basic sanitization
-$params = array_map( 'cssfilter', $_GET );
-
-// Defaults
-$selector = isset( $params['selector'] ) ? $params['selector'] : '.mw-test-example';
-$property = isset( $params['prop'] ) ? $params['prop'] : 'float';
-$value = isset( $params['val'] ) ? $params['val'] : 'right';
-$wait = isset( $params['wait'] ) ? (int)$params['wait'] : 0; // seconds
-
-sleep( $wait );
-
-$css = "
-/**
- * Generated " . gmdate( 'r' ) . ".
- * Waited {$wait}s.
- */
-
-$selector {
- $property: $value;
-}
-";
-
-echo trim( $css ) . "\n";
diff --git a/tests/qunit/data/testrunner.js b/tests/qunit/data/testrunner.js
deleted file mode 100644
index efa65493..00000000
--- a/tests/qunit/data/testrunner.js
+++ /dev/null
@@ -1,266 +0,0 @@
-( function ( $, mw, QUnit, undefined ) {
-/*global CompletenessTest */
-/*jshint evil:true */
-'use strict';
-
-var mwTestIgnore, mwTester, addons;
-
-/**
- * Add bogus to url to prevent IE crazy caching
- *
- * @param value {String} a relative path (eg. 'data/foo.js'
- * or 'data/test.php?foo=bar').
- * @return {String} Such as 'data/foo.js?131031765087663960'
- */
-QUnit.fixurl = function ( value ) {
- return value + (/\?/.test( value ) ? '&' : '?')
- + String( new Date().getTime() )
- + String( parseInt( Math.random() * 100000, 10 ) );
-};
-
-/**
- * Configuration
- */
-
-// When a test() indicates asynchronicity with stop(),
-// allow 10 seconds to pass before killing the test(),
-// and assuming failure.
-QUnit.config.testTimeout = 10 * 1000;
-
-// Add a checkbox to QUnit header to toggle MediaWiki ResourceLoader debug mode.
-QUnit.config.urlConfig.push( {
- id: 'debug',
- label: 'Enable ResourceLoaderDebug',
- tooltip: 'Enable debug mode in ResourceLoader'
-} );
-
-/**
- * Load TestSwarm agent
- */
-// Only if the current url indicates that there is a TestSwarm instance watching us
-// (TestSwarm appends swarmURL to the test suites url it loads in iframes).
-// Otherwise this is just a simple view of Special:JavaScriptTest/qunit directly,
-// no point in loading inject.js in that case. Also, make sure that this instance
-// of MediaWiki has actually been configured with the required url to that inject.js
-// script. By default it is false.
-if ( QUnit.urlParams.swarmURL && mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) {
- document.write( "<scr" + "ipt src='" + QUnit.fixurl( mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) + "'></scr" + "ipt>" );
-}
-
-/**
- * CompletenessTest
- */
-// Adds toggle checkbox to header
-QUnit.config.urlConfig.push( {
- id: 'completenesstest',
- label: 'Run CompletenessTest',
- tooltip: 'Run the completeness test'
-} );
-
-// Initiate when enabled
-if ( QUnit.urlParams.completenesstest ) {
-
- // Return true to ignore
- mwTestIgnore = function ( val, tester, funcPath ) {
-
- // Don't record methods of the properties of constructors,
- // to avoid getting into a loop (prototype.constructor.prototype..).
- // Since we're therefor skipping any injection for
- // "new mw.Foo()", manually set it to true here.
- if ( val instanceof mw.Map ) {
- tester.methodCallTracker.Map = true;
- return true;
- }
- if ( val instanceof mw.Title ) {
- tester.methodCallTracker.Title = true;
- return true;
- }
-
- // Don't record methods of the properties of a jQuery object
- if ( val instanceof $ ) {
- return true;
- }
-
- return false;
- };
-
- mwTester = new CompletenessTest( mw, mwTestIgnore );
-}
-
-/**
- * Test environment recommended for all QUnit test modules
- */
-// Whether to log environment changes to the console
-QUnit.config.urlConfig.push( 'mwlogenv' );
-
-/**
- * Reset mw.config and others to a fresh copy of the live config for each test(),
- * and restore it back to the live one afterwards.
- * @param localEnv {Object} [optional]
- * @example (see test suite at the bottom of this file)
- * </code>
- */
-QUnit.newMwEnvironment = ( function () {
- var log, liveConfig, liveMessages;
-
- liveConfig = mw.config.values;
- liveMessages = mw.messages.values;
-
- function freshConfigCopy( custom ) {
- // "deep=true" is important here.
- // Otherwise we just create a new object with values referring to live config.
- // e.g. mw.config.set( 'wgFileExtensions', [] ) would not effect liveConfig,
- // but mw.config.get( 'wgFileExtensions' ).push( 'png' ) would as the array
- // was passed by reference in $.extend's loop.
- return $.extend( {}, liveConfig, custom, /*deep=*/true );
- }
-
- function freshMessagesCopy( custom ) {
- return $.extend( {}, liveMessages, custom, /*deep=*/true );
- }
-
- log = QUnit.urlParams.mwlogenv ? mw.log : function () {};
-
- return function ( localEnv ) {
- localEnv = $.extend( {
- // QUnit
- setup: $.noop,
- teardown: $.noop,
- // MediaWiki
- config: {},
- messages: {}
- }, localEnv );
-
- return {
- setup: function () {
- log( 'MwEnvironment> SETUP for "' + QUnit.config.current.module
- + ': ' + QUnit.config.current.testName + '"' );
-
- // Greetings, mock environment!
- mw.config.values = freshConfigCopy( localEnv.config );
- mw.messages.values = freshMessagesCopy( localEnv.messages );
-
- localEnv.setup();
- },
-
- teardown: function () {
- log( 'MwEnvironment> TEARDOWN for "' + QUnit.config.current.module
- + ': ' + QUnit.config.current.testName + '"' );
-
- localEnv.teardown();
-
- // Farewell, mock environment!
- mw.config.values = liveConfig;
- mw.messages.values = liveMessages;
- }
- };
- };
-}() );
-
-// $.when stops as soon as one fails, which makes sense in most
-// practical scenarios, but not in a unit test where we really do
-// need to wait until all of them are finished.
-QUnit.whenPromisesComplete = function () {
- var altPromises = [];
-
- $.each( arguments, function ( i, arg ) {
- var alt = $.Deferred();
- altPromises.push( alt );
-
- // Whether this one fails or not, forwards it to
- // the 'done' (resolve) callback of the alternative promise.
- arg.always( alt.resolve );
- });
-
- return $.when.apply( $, altPromises );
-};
-
-/**
- * Add-on assertion helpers
- */
-// Define the add-ons
-addons = {
-
- // Expect boolean true
- assertTrue: function ( actual, message ) {
- QUnit.push( actual === true, actual, true, message );
- },
-
- // Expect boolean false
- assertFalse: function ( actual, message ) {
- QUnit.push( actual === false, actual, false, message );
- },
-
- // Expect numerical value less than X
- lt: function ( actual, expected, message ) {
- QUnit.push( actual < expected, actual, 'less than ' + expected, message );
- },
-
- // Expect numerical value less than or equal to X
- ltOrEq: function ( actual, expected, message ) {
- QUnit.push( actual <= expected, actual, 'less than or equal to ' + expected, message );
- },
-
- // Expect numerical value greater than X
- gt: function ( actual, expected, message ) {
- QUnit.push( actual > expected, actual, 'greater than ' + expected, message );
- },
-
- // Expect numerical value greater than or equal to X
- gtOrEq: function ( actual, expected, message ) {
- QUnit.push( actual >= expected, actual, 'greater than or equal to ' + expected, message );
- }
-};
-
-$.extend( QUnit.assert, addons );
-
-/**
- * Small test suite to confirm proper functionality of the utilities and
- * initializations in this file.
- */
-var envExecCount = 0;
-QUnit.module( 'mediawiki.tests.qunit.testrunner', QUnit.newMwEnvironment({
- setup: function () {
- envExecCount += 1;
- this.mwHtmlLive = mw.html;
- mw.html = {
- escape: function () {
- return 'mocked-' + envExecCount;
- }
- };
- },
- teardown: function () {
- mw.html = this.mwHtmlLive;
- },
- config: {
- testVar: 'foo'
- },
- messages: {
- testMsg: 'Foo.'
- }
-}) );
-
-QUnit.test( 'Setup', 3, function ( assert ) {
- assert.equal( mw.html.escape( 'foo' ), 'mocked-1', 'extra setup() callback was ran.' );
- assert.equal( mw.config.get( 'testVar' ), 'foo', 'config object applied' );
- assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object applied' );
-
- mw.config.set( 'testVar', 'bar' );
- mw.messages.set( 'testMsg', 'Bar.' );
-});
-
-QUnit.test( 'Teardown', 3, function ( assert ) {
- assert.equal( mw.html.escape( 'foo' ), 'mocked-2', 'extra setup() callback was re-ran.' );
- assert.equal( mw.config.get( 'testVar' ), 'foo', 'config object restored and re-applied after test()' );
- assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
-});
-
-QUnit.module( 'mediawiki.tests.qunit.testrunner-after', QUnit.newMwEnvironment() );
-
-QUnit.test( 'Teardown', 3, function ( assert ) {
- assert.equal( mw.html.escape( '<' ), '&lt;', 'extra teardown() callback was ran.' );
- assert.equal( mw.config.get( 'testVar' ), null, 'config object restored to live in next module()' );
- assert.equal( mw.messages.get( 'testMsg' ), null, 'messages object restored to live in next module()' );
-});
-
-}( jQuery, mediaWiki, QUnit ) );
diff --git a/tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js b/tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js
deleted file mode 100644
index 0dee2ef0..00000000
--- a/tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js
+++ /dev/null
@@ -1,52 +0,0 @@
-( function ( mw, $ ) {
-
-QUnit.module( 'jquery.autoEllipsis', QUnit.newMwEnvironment() );
-
-function createWrappedDiv( text, width ) {
- var $wrapper = $( '<div>' ).css( 'width', width );
- var $div = $( '<div>' ).text( text );
- $wrapper.append( $div );
- return $wrapper;
-}
-
-function findDivergenceIndex( a, b ) {
- var i = 0;
- while ( i < a.length && i < b.length && a[i] === b[i] ) {
- i++;
- }
- return i;
-}
-
-QUnit.test( 'Position right', 4, function ( assert ) {
- // We need this thing to be visible, so append it to the DOM
- var origText = 'This is a really long random string and there is no way it fits in 100 pixels.';
- var $wrapper = createWrappedDiv( origText, '100px' );
- $( '#qunit-fixture' ).append( $wrapper );
- $wrapper.autoEllipsis( { position: 'right' } );
-
- // Verify that, and only one, span element was created
- var $span = $wrapper.find( '> span' );
- assert.strictEqual( $span.length, 1, 'autoEllipsis wrapped the contents in a span element' );
-
- // Check that the text fits by turning on word wrapping
- $span.css( 'whiteSpace', 'nowrap' );
- assert.ltOrEq( $span.width(), $span.parent().width(), "Text fits (making the span 'white-space:nowrap' does not make it wider than its parent)" );
-
- // Add two characters using scary black magic
- var spanText = $span.text();
- var d = findDivergenceIndex( origText, spanText );
- var spanTextNew = spanText.substr( 0, d ) + origText[d] + origText[d] + '...';
-
- assert.gt( spanTextNew.length, spanText.length, 'Verify that the new span-length is indeed greater' );
-
- // Put this text in the span and verify it doesn't fit
- $span.text( spanTextNew );
- // In IE6 width works like min-width, allow IE6's width to be "equal to"
- if ( $.browser.msie && Number( $.browser.version ) === 6 ) {
- assert.gtOrEq( $span.width(), $span.parent().width(), 'Fit is maximal (adding two characters makes it not fit any more) - IE6: Maybe equal to as well due to width behaving like min-width in IE6' );
- } else {
- assert.gt( $span.width(), $span.parent().width(), 'Fit is maximal (adding two characters makes it not fit any more)' );
- }
-});
-
-}( mediaWiki, jQuery ) );
diff --git a/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js b/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js
deleted file mode 100644
index a6ddfca6..00000000
--- a/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js
+++ /dev/null
@@ -1,33 +0,0 @@
-QUnit.module( 'jquery.byteLength', QUnit.newMwEnvironment() );
-
-QUnit.test( 'Simple text', 5, function ( assert ) {
- var azLc = 'abcdefghijklmnopqrstuvwxyz',
- azUc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
- num = '0123456789',
- x = '*',
- space = ' ';
-
- assert.equal( $.byteLength( azLc ), 26, 'Lowercase a-z' );
- assert.equal( $.byteLength( azUc ), 26, 'Uppercase A-Z' );
- assert.equal( $.byteLength( num ), 10, 'Numbers 0-9' );
- assert.equal( $.byteLength( x ), 1, 'An asterisk' );
- assert.equal( $.byteLength( space ), 3, '3 spaces' );
-
-} );
-
-QUnit.test( 'Special text', 5, function ( assert ) {
- // http://en.wikipedia.org/wiki/UTF-8
- var U_0024 = '$',
- U_00A2 = '\u00A2',
- U_20AC = '\u20AC',
- U_024B62 = '\u024B62',
- // The normal one doesn't display properly, try the below which is the same
- // according to http://www.fileformat.info/info/unicode/char/24B62/index.htm
- U_024B62_alt = '\uD852\uDF62';
-
- assert.strictEqual( $.byteLength( U_0024 ), 1, 'U+0024: 1 byte. $ (dollar sign)' );
- assert.strictEqual( $.byteLength( U_00A2 ), 2, 'U+00A2: 2 bytes. \u00A2 (cent sign)' );
- assert.strictEqual( $.byteLength( U_20AC ), 3, 'U+20AC: 3 bytes. \u20AC (euro sign)' );
- assert.strictEqual( $.byteLength( U_024B62 ), 4, 'U+024B62: 4 bytes. \uD852\uDF62 (a Han character)' );
- assert.strictEqual( $.byteLength( U_024B62_alt ), 4, 'U+024B62: 4 bytes. \uD852\uDF62 (a Han character) - alternative method' );
-} );
diff --git a/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js b/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
deleted file mode 100644
index 4f86eb96..00000000
--- a/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
+++ /dev/null
@@ -1,234 +0,0 @@
-( function ( $, mw ) {
- var simpleSample, U_20AC, mbSample;
-
- QUnit.module( 'jquery.byteLimit', QUnit.newMwEnvironment() );
-
- // Simple sample (20 chars, 20 bytes)
- simpleSample = '12345678901234567890';
-
- // 3 bytes (euro-symbol)
- U_20AC = '\u20AC';
-
- // Multi-byte sample (22 chars, 26 bytes)
- mbSample = '1234567890' + U_20AC + '1234567890' + U_20AC;
-
- // Basic sendkey-implementation
- function addChars( $input, charstr ) {
- var c, len;
- for ( c = 0, len = charstr.length; c < len; c += 1 ) {
- $input
- .val( function ( i, val ) {
- // Add character to the value
- return val + charstr.charAt( c );
- } )
- .trigger( 'change' );
- }
- }
-
- /**
- * Test factory for $.fn.byteLimit
- *
- * @param $input {jQuery} jQuery object in an input element
- * @param hasLimit {Boolean} Wether a limit should apply at all
- * @param limit {Number} Limit (if used) otherwise undefined
- * The limit should be less than 20 (the sample data's length)
- */
- function byteLimitTest( options ) {
- var opt = $.extend({
- description: '',
- $input: null,
- sample: '',
- hasLimit: false,
- expected: '',
- limit: null
- }, options);
-
- QUnit.asyncTest( opt.description, opt.hasLimit ? 3 : 2, function ( assert ) {
- setTimeout( function () {
- var rawVal, fn, effectiveVal;
-
- opt.$input.appendTo( '#qunit-fixture' );
-
- // Simulate pressing keys for each of the sample characters
- addChars( opt.$input, opt.sample );
-
- rawVal = opt.$input.val();
- fn = opt.$input.data( 'byteLimit.callback' );
- effectiveVal = fn ? fn( rawVal ) : rawVal;
-
- if ( opt.hasLimit ) {
- assert.ltOrEq(
- $.byteLength( effectiveVal ),
- opt.limit,
- 'Prevent keypresses after byteLimit was reached, length never exceeded the limit'
- );
- assert.equal(
- $.byteLength( rawVal ),
- $.byteLength( opt.expected ),
- 'Not preventing keypresses too early, length has reached the expected length'
- );
- assert.equal( rawVal, opt.expected, 'New value matches the expected string' );
-
- } else {
- assert.equal(
- $.byteLength( effectiveVal ),
- $.byteLength( opt.expected ),
- 'Unlimited scenarios are not affected, expected length reached'
- );
- assert.equal( rawVal, opt.expected, 'New value matches the expected string' );
- }
- QUnit.start();
- }, 10 );
- } );
- }
-
- byteLimitTest({
- description: 'Plain text input',
- $input: $( '<input type="text"/>' ),
- sample: simpleSample,
- hasLimit: false,
- expected: simpleSample
- });
-
- byteLimitTest({
- description: 'Plain text input. Calling byteLimit with no parameters and no maxlength attribute (bug 36310)',
- $input: $( '<input type="text"/>' )
- .byteLimit(),
- sample: simpleSample,
- hasLimit: false,
- expected: simpleSample
- });
-
- byteLimitTest({
- description: 'Limit using the maxlength attribute',
- $input: $( '<input type="text"/>' )
- .attr( 'maxlength', '10' )
- .byteLimit(),
- sample: simpleSample,
- hasLimit: true,
- limit: 10,
- expected: '1234567890'
- });
-
- byteLimitTest({
- description: 'Limit using a custom value',
- $input: $( '<input type="text"/>' )
- .byteLimit( 10 ),
- sample: simpleSample,
- hasLimit: true,
- limit: 10,
- expected: '1234567890'
- });
-
- byteLimitTest({
- description: 'Limit using a custom value, overriding maxlength attribute',
- $input: $( '<input type="text"/>' )
- .attr( 'maxlength', '10' )
- .byteLimit( 15 ),
- sample: simpleSample,
- hasLimit: true,
- limit: 15,
- expected: '123456789012345'
- });
-
- byteLimitTest({
- description: 'Limit using a custom value (multibyte)',
- $input: $( '<input type="text"/>' )
- .byteLimit( 14 ),
- sample: mbSample,
- hasLimit: true,
- limit: 14,
- expected: '1234567890' + U_20AC + '1'
- });
-
- byteLimitTest({
- description: 'Limit using a custom value (multibyte) overlapping a byte',
- $input: $( '<input type="text"/>' )
- .byteLimit( 12 ),
- sample: mbSample,
- hasLimit: true,
- limit: 12,
- expected: '1234567890' + '12'
- });
-
- byteLimitTest({
- description: 'Pass the limit and a callback as input filter',
- $input: $( '<input type="text"/>' )
- .byteLimit( 6, function ( val ) {
- // Invalid title
- if ( val === '' ) {
- return '';
- }
-
- // Return without namespace prefix
- return new mw.Title( String( val ) ).getMain();
- } ),
- sample: 'User:Sample',
- hasLimit: true,
- limit: 6, // 'Sample' length
- expected: 'User:Sample'
- });
-
- byteLimitTest({
- description: 'Limit using the maxlength attribute and pass a callback as input filter',
- $input: $( '<input type="text"/>' )
- .attr( 'maxlength', '6' )
- .byteLimit( function ( val ) {
- // Invalid title
- if ( val === '' ) {
- return '';
- }
-
- // Return without namespace prefix
- return new mw.Title( String( val ) ).getMain();
- } ),
- sample: 'User:Sample',
- hasLimit: true,
- limit: 6, // 'Sample' length
- expected: 'User:Sample'
- });
-
- QUnit.test( 'Confirm properties and attributes set', 4, function ( assert ) {
- var $el, $elA, $elB;
-
- $el = $( '<input type="text"/>' )
- .attr( 'maxlength', '7' )
- .appendTo( '#qunit-fixture' )
- .byteLimit();
-
- assert.strictEqual( $el.attr( 'maxlength' ), '7', 'maxlength attribute unchanged for simple limit' );
-
- $el = $( '<input type="text"/>' )
- .attr( 'maxlength', '7' )
- .appendTo( '#qunit-fixture' )
- .byteLimit( 12 );
-
- assert.strictEqual( $el.attr( 'maxlength' ), '12', 'maxlength attribute updated for custom limit' );
-
- $el = $( '<input type="text"/>' )
- .attr( 'maxlength', '7' )
- .appendTo( '#qunit-fixture' )
- .byteLimit( 12, function ( val ) {
- return val;
- } );
-
- assert.strictEqual( $el.attr( 'maxlength' ), undefined, 'maxlength attribute removed for limit with callback' );
-
- $elA = $( '<input type="text"/>' )
- .addClass( 'mw-test-byteLimit-foo' )
- .attr( 'maxlength', '7' )
- .appendTo( '#qunit-fixture' );
-
- $elB = $( '<input type="text"/>' )
- .addClass( 'mw-test-byteLimit-foo' )
- .attr( 'maxlength', '12' )
- .appendTo( '#qunit-fixture' );
-
- $el = $( '.mw-test-byteLimit-foo' );
-
- assert.strictEqual( $el.length, 2, 'Verify that there are no other elements clashing with this test suite' );
-
- $el.byteLimit();
- });
-
-}( jQuery, mediaWiki ) );
diff --git a/tests/qunit/suites/resources/jquery/jquery.client.test.js b/tests/qunit/suites/resources/jquery/jquery.client.test.js
deleted file mode 100644
index bf62b39a..00000000
--- a/tests/qunit/suites/resources/jquery/jquery.client.test.js
+++ /dev/null
@@ -1,317 +0,0 @@
-QUnit.module( 'jquery.client', QUnit.newMwEnvironment() );
-
-/** Number of user-agent defined */
-var uacount = 0;
-
-var uas = (function () {
-
- // Object keyed by userAgent. Value is an array (human-readable name, client-profile object, navigator.platform value)
- // Info based on results from http://toolserver.org/~krinkle/testswarm/job/174/
- var uas = {
- // Internet Explorer 6
- // Internet Explorer 7
- 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)': {
- title: 'Internet Explorer 7',
- platform: 'Win32',
- profile: {
- "name": "msie",
- "layout": "trident",
- "layoutVersion": "unknown",
- "platform": "win",
- "version": "7.0",
- "versionBase": "7",
- "versionNumber": 7
- },
- wikiEditor: {
- ltr: true,
- rtl: false
- }
- },
- // Internet Explorer 8
- // Internet Explorer 9
- // Internet Explorer 10
- 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)': {
- title: 'Internet Explorer 10',
- platform: 'Win32',
- profile: {
- "name": "msie",
- "layout": "trident",
- "layoutVersion": "unknown", // should be able to report 6?
- "platform": "win",
- "version": "10.0",
- "versionBase": "10",
- "versionNumber": 10
- },
- wikiEditor: {
- ltr: true,
- rtl: true
- }
- },
- // Firefox 2
- // Firefox 3.5
- 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19': {
- title: 'Firefox 3.5',
- platform: 'MacIntel',
- profile: {
- "name": "firefox",
- "layout": "gecko",
- "layoutVersion": 20110420,
- "platform": "mac",
- "version": "3.5.19",
- "versionBase": "3",
- "versionNumber": 3.5
- },
- wikiEditor: {
- ltr: true,
- rtl: true
- }
- },
- // Firefox 3.6
- 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.10 (maverick) Firefox/3.6.17': {
- title: 'Firefox 3.6',
- platform: 'Linux i686',
- profile: {
- "name": "firefox",
- "layout": "gecko",
- "layoutVersion": 20110422,
- "platform": "linux",
- "version": "3.6.17",
- "versionBase": "3",
- "versionNumber": 3.6
- },
- wikiEditor: {
- ltr: true,
- rtl: true
- }
- },
- // Firefox 4
- 'Mozilla/5.0 (Windows NT 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1': {
- title: 'Firefox 4',
- platform: 'Win32',
- profile: {
- "name": "firefox",
- "layout": "gecko",
- "layoutVersion": 20100101,
- "platform": "win",
- "version": "4.0.1",
- "versionBase": "4",
- "versionNumber": 4
- },
- wikiEditor: {
- ltr: true,
- rtl: true
- }
- },
- // Firefox 10 nightly build
- 'Mozilla/5.0 (X11; Linux x86_64; rv:10.0a1) Gecko/20111103 Firefox/10.0a1': {
- title: 'Firefox 10 nightly',
- platform: 'Linux',
- profile: {
- "name": "firefox",
- "layout": "gecko",
- "layoutVersion": 20111103,
- "platform": "linux",
- "version": "10.0a1",
- "versionBase": "10",
- "versionNumber": 10
- },
- wikiEditor: {
- ltr: true,
- rtl: true
- }
- },
- // Firefox 5
- // Safari 3
- // Safari 4
- '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': {
- title: 'Safari 4',
- platform: 'MacIntel',
- profile: {
- "name": "safari",
- "layout": "webkit",
- "layoutVersion": 531,
- "platform": "mac",
- "version": "4.0.5",
- "versionBase": "4",
- "versionNumber": 4
- },
- wikiEditor: {
- ltr: true,
- rtl: true
- }
- },
- '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': {
- title: 'Safari 4',
- platform: 'Win32',
- profile: {
- "name": "safari",
- "layout": "webkit",
- "layoutVersion": 533,
- "platform": "win",
- "version": "4.0.5",
- "versionBase": "4",
- "versionNumber": 4
- },
- wikiEditor: {
- ltr: true,
- rtl: true
- }
- },
- // Safari 5
- // Opera 10
- // Chrome 5
- // Chrome 6
- // Chrome 7
- // Chrome 8
- // Chrome 9
- // Chrome 10
- // Chrome 11
- // Chrome 12
- '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': {
- title: 'Chrome 12',
- platform: 'MacIntel',
- profile: {
- "name": "chrome",
- "layout": "webkit",
- "layoutVersion": 534,
- "platform": "mac",
- "version": "12.0.742.112",
- "versionBase": "12",
- "versionNumber": 12
- },
- wikiEditor: {
- ltr: true,
- rtl: true
- }
- },
- 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30': {
- title: 'Chrome 12',
- platform: 'Linux i686',
- profile: {
- "name": "chrome",
- "layout": "webkit",
- "layoutVersion": 534,
- "platform": "linux",
- "version": "12.0.742.68",
- "versionBase": "12",
- "versionNumber": 12
- },
- wikiEditor: {
- ltr: true,
- rtl: true
- }
- },
- // Bug #34924
- 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.34 (KHTML, like Gecko) rekonq Safari/534.34': {
- title: 'Rekonq',
- platform: 'Linux i686',
- profile: {
- "name": "rekonq",
- "layout": "webkit",
- "layoutVersion": 534,
- "platform": "linux",
- "version": "534.34",
- "versionBase": "534",
- "versionNumber": 534.34
- },
- wikiEditor: {
- ltr: true,
- rtl: true
- }
- }
- };
- $.each( uas, function () {
- uacount++;
- });
- return uas;
-}());
-
-QUnit.test( 'profile userAgent support', uacount, function ( assert ) {
- // Generate a client profile object and compare recursively
- var uaTest = function( rawUserAgent, data ) {
- var ret = $.client.profile( {
- userAgent: rawUserAgent,
- platform: data.platform
- } );
- assert.deepEqual( ret, data.profile, 'Client profile support check for ' + data.title + ' (' + data.platform + '): ' + rawUserAgent );
- };
-
- // Loop through and run tests
- $.each( uas, uaTest );
-} );
-
-QUnit.test( 'profile return validation for current user agent', 7, function ( assert ) {
- var p = $.client.profile();
- function unknownOrType( val, type, summary ) {
- assert.ok( typeof val === type || val === 'unknown', summary );
- }
-
- assert.equal( typeof p, 'object', 'profile returns an object' );
- unknownOrType( p.layout, 'string', 'p.layout is a string (or "unknown")' );
- unknownOrType( p.layoutVersion, 'number', 'p.layoutVersion is a number (or "unknown")' );
- unknownOrType( p.platform, 'string', 'p.platform is a string (or "unknown")' );
- unknownOrType( p.version, 'string', 'p.version is a string (or "unknown")' );
- unknownOrType( p.versionBase, 'string', 'p.versionBase is a string (or "unknown")' );
- assert.equal( typeof p.versionNumber, 'number', 'p.versionNumber is a number' );
-});
-
-// Example from WikiEditor
-// Make sure to use raw numbers, a string like "7.0" would fail on a
-// version 10 browser since in string comparaison "10" is before "7.0" :)
-var testMap = {
- 'ltr': {
- 'msie': [['>=', 7.0]],
- 'firefox': [['>=', 2]],
- 'opera': [['>=', 9.6]],
- 'safari': [['>=', 3]],
- 'chrome': [['>=', 3]],
- 'netscape': [['>=', 9]],
- 'blackberry': false,
- 'ipod': false,
- 'iphone': false
- },
- 'rtl': {
- 'msie': [['>=', 8]],
- 'firefox': [['>=', 2]],
- 'opera': [['>=', 9.6]],
- 'safari': [['>=', 3]],
- 'chrome': [['>=', 3]],
- 'netscape': [['>=', 9]],
- 'blackberry': false,
- 'ipod': false,
- 'iphone': false
- }
-};
-
-QUnit.test( 'test', 1, function ( assert ) {
- // .test() uses eval, make sure no exceptions are thrown
- // then do a basic return value type check
- var testMatch = $.client.test( testMap );
-
- assert.equal( typeof testMatch, 'boolean', 'test returns a boolean value' );
-
-});
-
-QUnit.test( 'User-agent matches against WikiEditor\'s compatibility map', uacount * 2, function ( assert ) {
- var $body = $( 'body' ),
- bodyClasses = $body.attr( 'class' );
-
- // Loop through and run tests
- $.each( uas, function ( agent, data ) {
- $.each( ['ltr', 'rtl'], function ( i, dir ) {
- $body.removeClass( 'ltr rtl' ).addClass( dir );
- var profile = $.client.profile( {
- userAgent: agent,
- platform: data.platform
- } );
- var testMatch = $.client.test( testMap, profile );
- $body.removeClass( dir );
-
- assert.equal( testMatch, data.wikiEditor[dir], 'testing comparison based on ' + dir + ', ' + agent );
- });
- });
-
- // Restore body classes
- $body.attr( 'class', bodyClasses );
-});
-
diff --git a/tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js b/tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js
deleted file mode 100644
index 7b37f5a0..00000000
--- a/tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js
+++ /dev/null
@@ -1,58 +0,0 @@
-QUnit.module( 'jquery.colorUtil', QUnit.newMwEnvironment() );
-
-QUnit.test( 'getRGB', 18, function ( assert ) {
- assert.strictEqual( $.colorUtil.getRGB(), undefined, 'No arguments' );
- assert.strictEqual( $.colorUtil.getRGB( '' ), undefined, 'Empty string' );
- assert.deepEqual( $.colorUtil.getRGB( [0, 100, 255] ), [0, 100, 255], 'Parse array of rgb values' );
- assert.deepEqual( $.colorUtil.getRGB( 'rgb(0,100,255)' ), [0, 100, 255], 'Parse simple rgb string' );
- assert.deepEqual( $.colorUtil.getRGB( 'rgb(0, 100, 255)' ), [0, 100, 255], 'Parse simple rgb string with spaces' );
- assert.deepEqual( $.colorUtil.getRGB( 'rgb(0%,20%,40%)' ), [0, 51, 102], 'Parse rgb string with percentages' );
- assert.deepEqual( $.colorUtil.getRGB( 'rgb(0%, 20%, 40%)' ), [0, 51, 102], 'Parse rgb string with percentages and spaces' );
- assert.deepEqual( $.colorUtil.getRGB( '#f2ddee' ), [242, 221, 238], 'Hex string: 6 char lowercase' );
- assert.deepEqual( $.colorUtil.getRGB( '#f2DDEE' ), [242, 221, 238], 'Hex string: 6 char uppercase' );
- assert.deepEqual( $.colorUtil.getRGB( '#f2DdEe' ), [242, 221, 238], 'Hex string: 6 char mixed' );
- assert.deepEqual( $.colorUtil.getRGB( '#eee' ), [238, 238, 238], 'Hex string: 3 char lowercase' );
- assert.deepEqual( $.colorUtil.getRGB( '#EEE' ), [238, 238, 238], 'Hex string: 3 char uppercase' );
- assert.deepEqual( $.colorUtil.getRGB( '#eEe' ), [238, 238, 238], 'Hex string: 3 char mixed' );
- assert.deepEqual( $.colorUtil.getRGB( 'rgba(0, 0, 0, 0)' ), [255, 255, 255], 'Zero rgba for Safari 3; Transparent (whitespace)' );
-
- // Perhaps this is a bug in colorUtil, but it is the current behaviour so, let's keep
- // track of it, so we will know in case it would ever change.
- assert.strictEqual( $.colorUtil.getRGB( 'rgba(0,0,0,0)' ), undefined, 'Zero rgba without whitespace' );
-
- assert.deepEqual( $.colorUtil.getRGB( 'lightGreen' ), [144, 238, 144], 'Color names (lightGreen)' );
- assert.deepEqual( $.colorUtil.getRGB( 'transparent' ), [255, 255, 255], 'Color names (transparent)' );
- assert.strictEqual( $.colorUtil.getRGB( 'mediaWiki' ), undefined, 'Inexisting color name' );
-});
-
-QUnit.test( 'rgbToHsl', 1, function ( assert ) {
- var hsl = $.colorUtil.rgbToHsl( 144, 238, 144 );
-
- // Cross-browser differences in decimals...
- // Round to two decimals so they can be more reliably checked.
- var dualDecimals = function(a,b){
- return Math.round(a*100)/100;
- };
- // Re-create the rgbToHsl return array items, limited to two decimals.
- var ret = [dualDecimals(hsl[0]), dualDecimals(hsl[1]), dualDecimals(hsl[2])];
-
- assert.deepEqual( ret, [0.33, 0.73, 0.75], 'rgb(144, 238, 144): hsl(0.33, 0.73, 0.75)' );
-});
-
-QUnit.test( 'hslToRgb', 1, function ( assert ) {
- var rgb = $.colorUtil.hslToRgb( 0.3, 0.7, 0.8 );
-
- // Cross-browser differences in decimals...
- // Re-create the hslToRgb return array items, rounded to whole numbers.
- var ret = [Math.round(rgb[0]), Math.round(rgb[1]), Math.round(rgb[2])];
-
- assert.deepEqual( ret ,[183, 240, 168], 'hsl(0.3, 0.7, 0.8): rgb(183, 240, 168)' );
-});
-
-QUnit.test( 'getColorBrightness', 2, function ( assert ) {
- var a = $.colorUtil.getColorBrightness( 'red', +0.1 );
- assert.equal( a, 'rgb(255,50,50)', 'Start with named color "red", brighten 10%' );
-
- var b = $.colorUtil.getColorBrightness( 'rgb(200,50,50)', -0.2 );
- assert.equal( b, 'rgb(118,29,29)', 'Start with rgb string "rgb(200,50,50)", darken 20%' );
-});
diff --git a/tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js b/tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js
deleted file mode 100644
index a3079835..00000000
--- a/tests/qunit/suites/resources/jquery/jquery.delayedBind.test.js
+++ /dev/null
@@ -1,35 +0,0 @@
-QUnit.asyncTest('jquery.delayedBind with data option', 2, function ( assert ) {
- var $fixture = $('<div>').appendTo('#qunit-fixture'),
- data = { magic: "beeswax" },
- delay = 50;
-
- $fixture.delayedBind(delay, 'testevent', data, function ( e ) {
- QUnit.start(); // continue!
- assert.ok( true, 'testevent fired');
- assert.ok( e.data === data, 'data is passed through delayedBind');
- });
-
- // We'll trigger it thrice, but it should only happen once.
- $fixture.trigger( 'testevent', {} );
- $fixture.trigger( 'testevent', {} );
- $fixture.trigger( 'testevent', {} );
- $fixture.trigger( 'testevent', {} );
-});
-
-QUnit.asyncTest('jquery.delayedBind without data option', 1, function ( assert ) {
- var $fixture = $('<div>').appendTo('#qunit-fixture'),
- data = { magic: "beeswax" },
- delay = 50;
-
- $fixture.delayedBind(delay, 'testevent', function ( e ) {
- QUnit.start(); // continue!
- assert.ok(true, 'testevent fired');
- });
-
- // We'll trigger it thrice, but it should only happen once.
- $fixture.trigger( 'testevent', {} );
- $fixture.trigger( 'testevent', {} );
- $fixture.trigger( 'testevent', {} );
- $fixture.trigger( 'testevent', {} );
-});
-
diff --git a/tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js b/tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js
deleted file mode 100644
index 6eef1abb..00000000
--- a/tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js
+++ /dev/null
@@ -1,11 +0,0 @@
-QUnit.module( 'jquery.getAttrs', QUnit.newMwEnvironment() );
-
-QUnit.test( 'Check', 1, function ( assert ) {
- var attrs = {
- foo: 'bar',
- 'class': 'lorem'
- },
- $el = jQuery( '<div>', attrs );
-
- assert.deepEqual( $el.getAttrs(), attrs, 'getAttrs() return object should match the attributes set, no more, no less' );
-} );
diff --git a/tests/qunit/suites/resources/jquery/jquery.highlightText.test.js b/tests/qunit/suites/resources/jquery/jquery.highlightText.test.js
deleted file mode 100644
index a94dca31..00000000
--- a/tests/qunit/suites/resources/jquery/jquery.highlightText.test.js
+++ /dev/null
@@ -1,232 +0,0 @@
-QUnit.module( 'jquery.highlightText', QUnit.newMwEnvironment() );
-
-QUnit.test( 'Check', function ( assert ) {
- var $fixture, cases = [
- {
- desc: 'Test 001',
- text: 'Blue Öyster Cult',
- highlight: 'Blue',
- expected: '<span class="highlight">Blue</span> Öyster Cult'
- },
- {
- desc: 'Test 002',
- text: 'Blue Öyster Cult',
- highlight: 'Blue ',
- expected: '<span class="highlight">Blue</span> Öyster Cult'
- },
- {
- desc: 'Test 003',
- text: 'Blue Öyster Cult',
- highlight: 'Blue Ö',
- expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
- },
- {
- desc: 'Test 004',
- text: 'Blue Öyster Cult',
- highlight: 'Blue Öy',
- expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
- },
- {
- desc: 'Test 005',
- text: 'Blue Öyster Cult',
- highlight: ' Blue',
- expected: '<span class="highlight">Blue</span> Öyster Cult'
- },
- {
- desc: 'Test 006',
- text: 'Blue Öyster Cult',
- highlight: ' Blue ',
- expected: '<span class="highlight">Blue</span> Öyster Cult'
- },
- {
- desc: 'Test 007',
- text: 'Blue Öyster Cult',
- highlight: ' Blue Ö',
- expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
- },
- {
- desc: 'Test 008',
- text: 'Blue Öyster Cult',
- highlight: ' Blue Öy',
- expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
- },
- {
- desc: 'Test 009: Highlighter broken on starting Umlaut?',
- text: 'Österreich',
- highlight: 'Österreich',
- expected: '<span class="highlight">Österreich</span>'
- },
- {
- desc: 'Test 010: Highlighter broken on starting Umlaut?',
- text: 'Österreich',
- highlight: 'Ö',
- expected: '<span class="highlight">Ö</span>sterreich'
- },
- {
- desc: 'Test 011: Highlighter broken on starting Umlaut?',
- text: 'Österreich',
- highlight: 'Öst',
- expected: '<span class="highlight">Öst</span>erreich'
- },
- {
- desc: 'Test 012: Highlighter broken on starting Umlaut?',
- text: 'Österreich',
- highlight: 'Oe',
- expected: 'Österreich'
- },
- {
- desc: 'Test 013: Highlighter broken on punctuation mark?',
- text: 'So good. To be there',
- highlight: 'good',
- expected: 'So <span class="highlight">good</span>. To be there'
- },
- {
- desc: 'Test 014: Highlighter broken on space?',
- text: 'So good. To be there',
- highlight: 'be',
- expected: 'So good. To <span class="highlight">be</span> there'
- },
- {
- desc: 'Test 015: Highlighter broken on space?',
- text: 'So good. To be there',
- highlight: ' be',
- expected: 'So good. To <span class="highlight">be</span> there'
- },
- {
- desc: 'Test 016: Highlighter broken on space?',
- text: 'So good. To be there',
- highlight: 'be ',
- expected: 'So good. To <span class="highlight">be</span> there'
- },
- {
- desc: 'Test 017: Highlighter broken on space?',
- text: 'So good. To be there',
- highlight: ' be ',
- expected: 'So good. To <span class="highlight">be</span> there'
- },
- {
- desc: 'Test 018: en de Highlighter broken on special character at the end?',
- text: 'So good. xbß',
- highlight: 'xbß',
- expected: 'So good. <span class="highlight">xbß</span>'
- },
- {
- desc: 'Test 019: en de Highlighter broken on special character at the end?',
- text: 'So good. xbß.',
- highlight: 'xbß.',
- expected: 'So good. <span class="highlight">xbß.</span>'
- },
- {
- desc: 'Test 020: RTL he Hebrew',
- text: 'חסיד ×ומות העול×',
- highlight: 'חסיד ×ומות העול×',
- expected: '<span class="highlight">חסיד</span> <span class="highlight">×ומות</span> <span class="highlight">העול×</span>'
- },
- {
- desc: 'Test 021: RTL he Hebrew',
- text: 'חסיד ×ומות העול×',
- highlight: 'חסי',
- expected: '<span class="highlight">חסי</span>ד ×ומות העול×'
- },
- {
- desc: 'Test 022: ja Japanese',
- text: '諸国民ã®ä¸­ã®æ­£ç¾©ã®äºº',
- highlight: '諸国民ã®ä¸­ã®æ­£ç¾©ã®äºº',
- expected: '<span class="highlight">諸国民ã®ä¸­ã®æ­£ç¾©ã®äºº</span>'
- },
- {
- desc: 'Test 023: ja Japanese',
- text: '諸国民ã®ä¸­ã®æ­£ç¾©ã®äºº',
- highlight: '諸国',
- expected: '<span class="highlight">諸国</span>æ°‘ã®ä¸­ã®æ­£ç¾©ã®äºº'
- },
- {
- desc: 'Test 024: fr French text and « french quotes » (guillemets)',
- text: "« L'oiseau est sur l’île »",
- highlight: "« L'oiseau est sur l’île »",
- expected: '<span class="highlight">«</span> <span class="highlight">L\'oiseau</span> <span class="highlight">est</span> <span class="highlight">sur</span> <span class="highlight">l’île</span> <span class="highlight">»</span>'
- },
- {
- desc: 'Test 025: fr French text and « french quotes » (guillemets)',
- text: "« L'oiseau est sur l’île »",
- highlight: "« L'oise",
- expected: '<span class="highlight">«</span> <span class="highlight">L\'oise</span>au est sur l’île »'
- },
- {
- desc: 'Test 025a: fr French text and « french quotes » (guillemets) - does it match the single strings "«" and "L" separately?',
- text: "« L'oiseau est sur l’île »",
- highlight: "« L",
- expected: '<span class="highlight">«</span> <span class="highlight">L</span>\'oiseau est sur <span class="highlight">l</span>’île »'
- },
- {
- desc: 'Test 026: ru Russian',
- text: 'Праведники мира',
- highlight: 'Праведники мира',
- expected: '<span class="highlight">Праведники</span> <span class="highlight">мира</span>'
- },
- {
- desc: 'Test 027: ru Russian',
- text: 'Праведники мира',
- highlight: 'Праве',
- expected: '<span class="highlight">Праве</span>дники мира'
- },
- {
- desc: 'Test 028 ka Georgian',
- text: 'მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
- highlight: 'მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
- expected: '<span class="highlight">მთáƒáƒ•áƒáƒ áƒ˜</span> <span class="highlight">გვერდი</span>'
- },
- {
- desc: 'Test 029 ka Georgian',
- text: 'მთáƒáƒ•áƒáƒ áƒ˜ გვერდი',
- highlight: 'მთáƒ',
- expected: '<span class="highlight">მთáƒ</span>ვáƒáƒ áƒ˜ გვერდი'
- },
- {
- desc: 'Test 030 hy Armenian',
- text: 'Õ†Õ¸Õ¶Õ¡ Ô³Õ¡ÖƒÖ€Õ«Õ¶Õ¤Õ¡Õ·Õ¾Õ«Õ¬Õ«',
- highlight: 'Õ†Õ¸Õ¶Õ¡ Ô³Õ¡ÖƒÖ€Õ«Õ¶Õ¤Õ¡Õ·Õ¾Õ«Õ¬Õ«',
- expected: '<span class="highlight">Õ†Õ¸Õ¶Õ¡</span> <span class="highlight">Ô³Õ¡ÖƒÖ€Õ«Õ¶Õ¤Õ¡Õ·Õ¾Õ«Õ¬Õ«</span>'
- },
- {
- desc: 'Test 031 hy Armenian',
- text: 'Õ†Õ¸Õ¶Õ¡ Ô³Õ¡ÖƒÖ€Õ«Õ¶Õ¤Õ¡Õ·Õ¾Õ«Õ¬Õ«',
- highlight: 'Õ†Õ¸Õ¶',
- expected: '<span class="highlight">Õ†Õ¸Õ¶</span>Õ¡ Ô³Õ¡ÖƒÖ€Õ«Õ¶Õ¤Õ¡Õ·Õ¾Õ«Õ¬Õ«'
- },
- {
- desc: 'Test 032: th Thai',
- text: 'พอล à¹à¸­à¸£à¹Œà¸”ิช',
- highlight: 'พอล à¹à¸­à¸£à¹Œà¸”ิช',
- expected: '<span class="highlight">พอล</span> <span class="highlight">à¹à¸­à¸£à¹Œà¸”ิช</span>'
- },
- {
- desc: 'Test 033: th Thai',
- text: 'พอล à¹à¸­à¸£à¹Œà¸”ิช',
- highlight: 'พอ',
- expected: '<span class="highlight">พอ</span>ล à¹à¸­à¸£à¹Œà¸”ิช'
- },
- {
- desc: 'Test 034: RTL ar Arabic',
- text: 'بول إيردوس',
- highlight: 'بول إيردوس',
- expected: '<span class="highlight">بول</span> <span class="highlight">إيردوس</span>'
- },
- {
- desc: 'Test 035: RTL ar Arabic',
- text: 'بول إيردوس',
- highlight: 'بو',
- expected: '<span class="highlight">بو</span>ل إيردوس'
- }
- ];
- QUnit.expect( cases.length );
-
- $.each( cases, function ( i, item ) {
- $fixture = $( '<p>' ).text( item.text ).highlightText( item.highlight );
- assert.equal(
- $fixture.html(),
- $( '<p>' ).html( item.expected ).html(), // re-parse to normalize!
- item.desc || undefined
- );
- } );
-} );
diff --git a/tests/qunit/suites/resources/jquery/jquery.localize.test.js b/tests/qunit/suites/resources/jquery/jquery.localize.test.js
deleted file mode 100644
index c8e1d9f9..00000000
--- a/tests/qunit/suites/resources/jquery/jquery.localize.test.js
+++ /dev/null
@@ -1,133 +0,0 @@
-QUnit.module( 'jquery.localize', QUnit.newMwEnvironment() );
-
-QUnit.test( 'Handle basic replacements', 4, function ( assert ) {
- var html, $lc;
- mw.messages.set( 'basic', 'Basic stuff' );
-
- // Tag: html:msg
- html = '<div><span><html:msg key="basic" /></span></div>';
- $lc = $( html ).localize().find( 'span' );
-
- assert.strictEqual( $lc.text(), 'Basic stuff', 'Tag: html:msg' );
-
- // Attribute: title-msg
- html = '<div><span title-msg="basic"></span></div>';
- $lc = $( html ).localize().find( 'span' );
-
- assert.strictEqual( $lc.attr( 'title' ), 'Basic stuff', 'Attribute: title-msg' );
-
- // Attribute: alt-msg
- html = '<div><span alt-msg="basic"></span></div>';
- $lc = $( html ).localize().find( 'span' );
-
- assert.strictEqual( $lc.attr( 'alt' ), 'Basic stuff', 'Attribute: alt-msg' );
-
- // Attribute: placeholder-msg
- html = '<div><input placeholder-msg="basic" /></div>';
- $lc = $( html ).localize().find( 'input' );
-
- assert.strictEqual( $lc.attr( 'placeholder' ), 'Basic stuff', 'Attribute: placeholder-msg' );
-} );
-
-QUnit.test( 'Proper escaping', 2, function ( assert ) {
- var html, $lc;
- mw.messages.set( 'properfoo', '<proper esc="test">' );
-
- // This is handled by jQuery inside $.fn.localize, just a simple sanity checked
- // making sure it is actually using text() and attr() (or something with the same effect)
-
- // Text escaping
- html = '<div><span><html:msg key="properfoo"></span></div>';
- $lc = $( html ).localize().find( 'span' );
-
- assert.strictEqual( $lc.text(), mw.msg( 'properfoo' ), 'Content is inserted as text, not as html.' );
-
- // Attribute escaping
- html = '<div><span title-msg="properfoo"></span></div>';
- $lc = $( html ).localize().find( 'span' );
-
- assert.strictEqual( $lc.attr( 'title' ), mw.msg( 'properfoo' ), 'Attributes are not inserted raw.' );
-} );
-
-QUnit.test( 'Options', 7, function ( assert ) {
- mw.messages.set( {
- 'foo-lorem': 'Lorem',
- 'foo-ipsum': 'Ipsum',
- 'foo-bar-title': 'Read more about bars',
- 'foo-bar-label': 'The Bars',
- 'foo-bazz-title': 'Read more about bazz at $1 (last modified: $2)',
- 'foo-bazz-label': 'The Bazz ($1)',
- 'foo-welcome': 'Welcome to $1! (last visit: $2)'
- } );
- var html, $lc, attrs, x, sitename = 'Wikipedia';
-
- // Message key prefix
- html = '<div><span title-msg="lorem"><html:msg key="ipsum"></span></div>';
- $lc = $( html ).localize( {
- prefix: 'foo-'
- } ).find( 'span' );
-
- assert.strictEqual( $lc.attr( 'title' ), 'Lorem', 'Message key prefix - attr' );
- assert.strictEqual( $lc.text(), 'Ipsum', 'Message key prefix - text' );
-
- // Variable keys mapping
- x = 'bar';
- html = '<div><span title-msg="title"><html:msg key="label"></span></div>';
- $lc = $( html ).localize( {
- keys: {
- 'title': 'foo-' + x + '-title',
- 'label': 'foo-' + x + '-label'
- }
- } ).find( 'span' );
-
- assert.strictEqual( $lc.attr( 'title' ), 'Read more about bars', 'Variable keys mapping - attr' );
- assert.strictEqual( $lc.text(), 'The Bars', 'Variable keys mapping - text' );
-
- // Passing parameteters to mw.msg
- html = '<div><span><html:msg key="foo-welcome"></span></div>';
- $lc = $( html ).localize( {
- params: {
- 'foo-welcome': [sitename, 'yesterday']
- }
- } ).find( 'span' );
-
- assert.strictEqual( $lc.text(), 'Welcome to Wikipedia! (last visit: yesterday)', 'Passing parameteters to mw.msg' );
-
- // Combination of options prefix, params and keys
- x = 'bazz';
- html = '<div><span title-msg="title"><html:msg key="label"></span></div>';
- $lc = $( html ).localize( {
- prefix: 'foo-',
- keys: {
- 'title': x + '-title',
- 'label': x + '-label'
- },
- params: {
- 'title': [sitename, '3 minutes ago'],
- 'label': [sitename, '3 minutes ago']
-
- }
- } ).find( 'span' );
-
- assert.strictEqual( $lc.text(), 'The Bazz (Wikipedia)', 'Combination of options prefix, params and keys - text' );
- assert.strictEqual( $lc.attr( 'title' ), 'Read more about bazz at Wikipedia (last modified: 3 minutes ago)', 'Combination of options prefix, params and keys - attr' );
-} );
-
-QUnit.test( 'Handle data text', 2, function ( assert ) {
- var html, $lc;
- mw.messages.set( 'option-one', 'Item 1' );
- mw.messages.set( 'option-two', 'Item 2' );
- html = '<select><option data-msg-text="option-one"></option><option data-msg-text="option-two"></option></select>';
- $lc = $( html ).localize().find( 'option' );
- assert.strictEqual( $lc.eq( 0 ).text(), mw.msg( 'option-one' ), 'data-msg-text becomes text of options' );
- assert.strictEqual( $lc.eq( 1 ).text(), mw.msg( 'option-two' ), 'data-msg-text becomes text of options' );
-} );
-
-QUnit.test( 'Handle data html', 2, function ( assert ) {
- var html, $lc;
- mw.messages.set( 'html', 'behold... there is a <a>link</a> here!!' );
- html = '<div><div data-msg-html="html"></div></div>';
- $lc = $( html ).localize().find( 'a' );
- assert.strictEqual( $lc.length, 1, 'link is created' );
- assert.strictEqual( $lc.text(), 'link', 'the link text got added' );
-} );
diff --git a/tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js b/tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js
deleted file mode 100644
index 5b566ae0..00000000
--- a/tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js
+++ /dev/null
@@ -1,58 +0,0 @@
-QUnit.module( 'jquery.mwExtension', QUnit.newMwEnvironment() );
-
-QUnit.test( 'String functions', function ( assert ) {
-
- assert.equal( $.trimLeft( ' foo bar ' ), 'foo bar ', 'trimLeft' );
- assert.equal( $.trimRight( ' foo bar ' ), ' foo bar', 'trimRight' );
- assert.equal( $.ucFirst( 'foo' ), 'Foo', 'ucFirst' );
-
- assert.equal( $.escapeRE( '<!-- ([{+mW+}]) $^|?>' ),
- '<!\\-\\- \\(\\[\\{\\+mW\\+\\}\\]\\) \\$\\^\\|\\?>', 'escapeRE - Escape specials' );
- assert.equal( $.escapeRE( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ),
- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'escapeRE - Leave uppercase alone' );
- assert.equal( $.escapeRE( 'abcdefghijklmnopqrstuvwxyz' ),
- 'abcdefghijklmnopqrstuvwxyz', 'escapeRE - Leave lowercase alone' );
- assert.equal( $.escapeRE( '0123456789' ), '0123456789', 'escapeRE - Leave numbers alone' );
-});
-
-QUnit.test( 'Is functions', function ( assert ) {
-
- assert.strictEqual( $.isDomElement( document.getElementById( 'qunit-header' ) ), true,
- 'isDomElement: #qunit-header Node' );
- assert.strictEqual( $.isDomElement( document.getElementById( 'random-name' ) ), false,
- 'isDomElement: #random-name (null)' );
- assert.strictEqual( $.isDomElement( document.getElementsByTagName( 'div' ) ), false,
- 'isDomElement: getElementsByTagName Array' );
- assert.strictEqual( $.isDomElement( document.getElementsByTagName( 'div' )[0] ), true,
- 'isDomElement: getElementsByTagName(..)[0] Node' );
- assert.strictEqual( $.isDomElement( $( 'div' ) ), false,
- 'isDomElement: jQuery object' );
- assert.strictEqual( $.isDomElement( $( 'div' ).get(0) ), true,
- 'isDomElement: jQuery object > Get node' );
- assert.strictEqual( $.isDomElement( document.createElement( 'div' ) ), true,
- 'isDomElement: createElement' );
- assert.strictEqual( $.isDomElement( { foo: 1 } ), false,
- 'isDomElement: Object' );
-
- assert.strictEqual( $.isEmpty( 'string' ), false, 'isEmptry: "string"' );
- assert.strictEqual( $.isEmpty( '0' ), true, 'isEmptry: "0"' );
- assert.strictEqual( $.isEmpty( '' ), true, 'isEmptry: ""' );
- assert.strictEqual( $.isEmpty( 1 ), false, 'isEmptry: 1' );
- assert.strictEqual( $.isEmpty( [] ), true, 'isEmptry: []' );
- assert.strictEqual( $.isEmpty( {} ), true, 'isEmptry: {}' );
-
- // Documented behaviour
- assert.strictEqual( $.isEmpty( { length: 0 } ), true, 'isEmptry: { length: 0 }' );
-});
-
-QUnit.test( 'Comparison functions', function ( assert ) {
-
- assert.ok( $.compareArray( [0, 'a', [], [2, 'b'] ], [0, "a", [], [2, "b"] ] ),
- 'compareArray: Two deep arrays that are excactly the same' );
- assert.ok( !$.compareArray( [1], [2] ), 'compareArray: Two different arrays (false)' );
-
- assert.ok( $.compareObject( {}, {} ), 'compareObject: Two empty objects' );
- assert.ok( $.compareObject( { foo: 1 }, { foo: 1 } ), 'compareObject: Two the same objects' );
- assert.ok( !$.compareObject( { bar: true }, { baz: false } ),
- 'compareObject: Two different objects (false)' );
-});
diff --git a/tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js b/tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js
deleted file mode 100644
index 161f0cd1..00000000
--- a/tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js
+++ /dev/null
@@ -1,33 +0,0 @@
-QUnit.module( 'jquery.tabIndex', QUnit.newMwEnvironment() );
-
-QUnit.test( 'firstTabIndex', 2, function ( assert ) {
- var testEnvironment =
-'<form>' +
- '<input tabindex="7" />' +
- '<input tabindex="9" />' +
- '<textarea tabindex="2">Foobar</textarea>' +
- '<textarea tabindex="5">Foobar</textarea>' +
-'</form>';
-
- var $testA = $( '<div>' ).html( testEnvironment ).appendTo( '#qunit-fixture' );
- assert.strictEqual( $testA.firstTabIndex(), 2, 'First tabindex should be 2 within this context.' );
-
- var $testB = $( '<div>' );
- assert.strictEqual( $testB.firstTabIndex(), null, 'Return null if none available.' );
-});
-
-QUnit.test( 'lastTabIndex', 2, function ( assert ) {
- var testEnvironment =
-'<form>' +
- '<input tabindex="7" />' +
- '<input tabindex="9" />' +
- '<textarea tabindex="2">Foobar</textarea>' +
- '<textarea tabindex="5">Foobar</textarea>' +
-'</form>';
-
- var $testA = $( '<div>' ).html( testEnvironment ).appendTo( '#qunit-fixture' );
- assert.strictEqual( $testA.lastTabIndex(), 9, 'Last tabindex should be 9 within this context.' );
-
- var $testB = $( '<div>' );
- assert.strictEqual( $testB.lastTabIndex(), null, 'Return null if none available.' );
-});
diff --git a/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js b/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
deleted file mode 100644
index 16d81707..00000000
--- a/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
+++ /dev/null
@@ -1,697 +0,0 @@
-( function ( $, mw ) {
-
-var config = {
- wgMonthNames: ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
- wgMonthNamesShort: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
- wgDefaultDateFormat: 'dmy',
- wgContentLanguage: 'en'
-};
-
-QUnit.module( 'jquery.tablesorter', QUnit.newMwEnvironment({ config: config }) );
-
-/**
- * Create an HTML table from an array of row arrays containing text strings.
- * First row will be header row. No fancy rowspan/colspan stuff.
- *
- * @param {String[]} header
- * @param {String[][]} data
- * @return jQuery
- */
-function tableCreate( header, data ) {
- var i,
- $table = $( '<table class="sortable"><thead></thead><tbody></tbody></table>' ),
- $thead = $table.find( 'thead' ),
- $tbody = $table.find( 'tbody' ),
- $tr = $( '<tr>' );
-
- $.each( header, function ( i, str ) {
- var $th = $( '<th>' );
- $th.text( str ).appendTo( $tr );
- });
- $tr.appendTo( $thead );
-
- for ( i = 0; i < data.length; i++ ) {
- $tr = $( '<tr>' );
- $.each( data[i], function ( j, str ) {
- var $td = $( '<td>' );
- $td.text( str ).appendTo( $tr );
- });
- $tr.appendTo( $tbody );
- }
- return $table;
-}
-
-/**
- * Extract text from table.
- *
- * @param {jQuery} $table
- * @return String[][]
- */
-function tableExtract( $table ) {
- var data = [];
-
- $table.find( 'tbody' ).find( 'tr' ).each( function( i, tr ) {
- var row = [];
- $( tr ).find( 'td,th' ).each( function( i, td ) {
- row.push( $( td ).text() );
- });
- data.push( row );
- });
- return data;
-}
-
-/**
- * Run a table test by building a table with the given data,
- * running some callback on it, then checking the results.
- *
- * @param {String} msg text to pass on to qunit for the comparison
- * @param {String[]} header cols to make the table
- * @param {String[][]} data rows/cols to make the table
- * @param {String[][]} expected rows/cols to compare against at end
- * @param {function($table)} callback something to do with the table before we compare
- */
-function tableTest( msg, header, data, expected, callback ) {
- QUnit.test( msg, 1, function ( assert ) {
- var $table = tableCreate( header, data );
-
- // Give caller a chance to set up sorting and manipulate the table.
- callback( $table );
-
- // Table sorting is done synchronously; if it ever needs to change back
- // to asynchronous, we'll need a timeout or a callback here.
- var extracted = tableExtract( $table );
- assert.deepEqual( extracted, expected, msg );
- });
-}
-
-function reversed(arr) {
- // Clone array
- var arr2 = arr.slice(0);
-
- arr2.reverse();
-
- return arr2;
-}
-
-// Sample data set using planets named and their radius
-var header = [ 'Planet' , 'Radius (km)'],
- mercury = [ 'Mercury', '2439.7' ],
- venus = [ 'Venus' , '6051.8' ],
- earth = [ 'Earth' , '6371.0' ],
- mars = [ 'Mars' , '3390.0' ],
- jupiter = [ 'Jupiter', '69911' ],
- saturn = [ 'Saturn' , '58232' ];
-
-// Initial data set
-var planets = [mercury, venus, earth, mars, jupiter, saturn];
-var ascendingName = [earth, jupiter, mars, mercury, saturn, venus];
-var ascendingRadius = [mercury, mars, venus, earth, saturn, jupiter];
-
-tableTest(
- 'Basic planet table: ascending by name',
- header,
- planets,
- ascendingName,
- function ( $table ) {
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-tableTest(
- 'Basic planet table: ascending by name a second time',
- header,
- planets,
- ascendingName,
- function ( $table ) {
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-tableTest(
- 'Basic planet table: descending by name',
- header,
- planets,
- reversed(ascendingName),
- function ( $table ) {
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click().click();
- }
-);
-tableTest(
- 'Basic planet table: ascending radius',
- header,
- planets,
- ascendingRadius,
- function ( $table ) {
- $table.tablesorter();
- $table.find( '.headerSort:eq(1)' ).click();
- }
-);
-tableTest(
- 'Basic planet table: descending radius',
- header,
- planets,
- reversed(ascendingRadius),
- function ( $table ) {
- $table.tablesorter();
- $table.find( '.headerSort:eq(1)' ).click().click();
- }
-);
-
-
-// Regression tests!
-tableTest(
- 'Bug 28775: German-style (dmy) short numeric dates',
- ['Date'],
- [ // German-style dates are day-month-year
- ['11.11.2011'],
- ['01.11.2011'],
- ['02.10.2011'],
- ['03.08.2011'],
- ['09.11.2011']
- ],
- [ // Sorted by ascending date
- ['03.08.2011'],
- ['02.10.2011'],
- ['01.11.2011'],
- ['09.11.2011'],
- ['11.11.2011']
- ],
- function ( $table ) {
- mw.config.set( 'wgDefaultDateFormat', 'dmy' );
- mw.config.set( 'wgContentLanguage', 'de' );
-
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-
-tableTest(
- 'Bug 28775: American-style (mdy) short numeric dates',
- ['Date'],
- [ // American-style dates are month-day-year
- ['11.11.2011'],
- ['01.11.2011'],
- ['02.10.2011'],
- ['03.08.2011'],
- ['09.11.2011']
- ],
- [ // Sorted by ascending date
- ['01.11.2011'],
- ['02.10.2011'],
- ['03.08.2011'],
- ['09.11.2011'],
- ['11.11.2011']
- ],
- function ( $table ) {
- mw.config.set( 'wgDefaultDateFormat', 'mdy' );
-
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-
-var ipv4 = [
- // Some randomly generated fake IPs
- ['45.238.27.109'],
- ['44.172.9.22'],
- ['247.240.82.209'],
- ['204.204.132.158'],
- ['170.38.91.162'],
- ['197.219.164.9'],
- ['45.68.154.72'],
- ['182.195.149.80']
-];
-var ipv4Sorted = [
- // Sort order should go octet by octet
- ['44.172.9.22'],
- ['45.68.154.72'],
- ['45.238.27.109'],
- ['170.38.91.162'],
- ['182.195.149.80'],
- ['197.219.164.9'],
- ['204.204.132.158'],
- ['247.240.82.209']
-];
-
-tableTest(
- 'Bug 17141: IPv4 address sorting',
- ['IP'],
- ipv4,
- ipv4Sorted,
- function ( $table ) {
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-tableTest(
- 'Bug 17141: IPv4 address sorting (reverse)',
- ['IP'],
- ipv4,
- reversed(ipv4Sorted),
- function ( $table ) {
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click().click();
- }
-);
-
-var umlautWords = [
- // Some words with Umlauts
- ['Günther'],
- ['Peter'],
- ['Björn'],
- ['Bjorn'],
- ['Apfel'],
- ['Äpfel'],
- ['Strasse'],
- ['Sträßschen']
-];
-
-var umlautWordsSorted = [
- // Some words with Umlauts
- ['Äpfel'],
- ['Apfel'],
- ['Björn'],
- ['Bjorn'],
- ['Günther'],
- ['Peter'],
- ['Sträßschen'],
- ['Strasse']
-];
-
-tableTest(
- 'Accented Characters with custom collation',
- ['Name'],
- umlautWords,
- umlautWordsSorted,
- function ( $table ) {
- mw.config.set( 'tableSorterCollation', {
- 'ä': 'ae',
- 'ö': 'oe',
- 'ß': 'ss',
- 'ü':'ue'
- } );
-
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-
-var planetsRowspan = [["Earth","6051.8"], jupiter, ["Mars","6051.8"], mercury, saturn, venus];
-var planetsRowspanII = [jupiter, mercury, saturn, venus, ['Venus', '6371.0'], ['Venus', '3390.0']];
-
-tableTest(
- 'Basic planet table: same value for multiple rows via rowspan',
- header,
- planets,
- planetsRowspan,
- function ( $table ) {
- // Modify the table to have a multiuple-row-spanning cell:
- // - Remove 2nd cell of 4th row, and, 2nd cell or 5th row.
- $table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove();
- // - Set rowspan for 2nd cell of 3rd row to 3.
- // This covers the removed cell in the 4th and 5th row.
- $table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan', '3' );
-
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-tableTest(
- 'Basic planet table: Same value for multiple rows via rowspan II',
- header,
- planets,
- planetsRowspanII,
- function ( $table ) {
- // Modify the table to have a multiuple-row-spanning cell:
- // - Remove 1st cell of 4th row, and, 1st cell or 5th row.
- $table.find( 'tr:eq(3) td:eq(0), tr:eq(4) td:eq(0)' ).remove();
- // - Set rowspan for 1st cell of 3rd row to 3.
- // This covers the removed cell in the 4th and 5th row.
- $table.find( 'tr:eq(2) td:eq(0)' ).prop( 'rowspan', '3' );
-
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-
-var complexMDYDates = [
- // Some words with Umlauts
- ['January, 19 2010'],
- ['April 21 1991'],
- ['04 22 1991'],
- ['5.12.1990'],
- ['December 12 \'10']
-];
-
-var complexMDYSorted = [
- ['5.12.1990'],
- ['April 21 1991'],
- ['04 22 1991'],
- ['January, 19 2010'],
- ['December 12 \'10']
-];
-
-tableTest(
- 'Complex date parsing I',
- ['date'],
- complexMDYDates,
- complexMDYSorted,
- function ( $table ) {
- mw.config.set( 'wgDefaultDateFormat', 'mdy' );
-
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-
-var currencyUnsorted = [
- ['1.02 $'],
- ['$ 3.00'],
- ['€ 2,99'],
- ['$ 1.00'],
- ['$3.50'],
- ['$ 1.50'],
- ['€ 0.99']
-];
-
-var currencySorted = [
- ['€ 0.99'],
- ['$ 1.00'],
- ['1.02 $'],
- ['$ 1.50'],
- ['$ 3.00'],
- ['$3.50'],
- // Comma's sort after dots
- // Not intentional but test to detect changes
- ['€ 2,99']
-];
-
-tableTest(
- 'Currency parsing I',
- ['currency'],
- currencyUnsorted,
- currencySorted,
- function ( $table ) {
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-
-var ascendingNameLegacy = ascendingName.slice(0);
-ascendingNameLegacy[4] = ascendingNameLegacy[5];
-ascendingNameLegacy.pop();
-
-tableTest(
- 'Legacy compat with .sortbottom',
- header,
- planets,
- ascendingNameLegacy,
- function( $table ) {
- $table.find( 'tr:last' ).addClass( 'sortbottom' );
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-
-
-/** FIXME: the diff output is not very readeable. */
-QUnit.test( 'bug 32047 - caption must be before thead', function ( assert ) {
- var $table;
- $table = $(
- '<table class="sortable">' +
- '<caption>CAPTION</caption>' +
- '<tr><th>THEAD</th></tr>' +
- '<tr><td>A</td></tr>' +
- '<tr><td>B</td></tr>' +
- '<tr class="sortbottom"><td>TFOOT</td></tr>' +
- '</table>'
- );
- $table.tablesorter();
-
- assert.equal(
- $table.children( ).get( 0 ).nodeName,
- 'CAPTION',
- 'First element after <thead> must be <caption> (bug 32047)'
- );
-});
-
-QUnit.test( 'data-sort-value attribute, when available, should override sorting position', function ( assert ) {
- var $table, data;
-
- // Example 1: All cells except one cell without data-sort-value,
- // which should be sorted at it's text content value.
- $table = $(
- '<table class="sortable"><thead><tr><th>Data</th></tr></thead>' +
- '<tbody>' +
- '<tr><td>Cheetah</td></tr>' +
- '<tr><td data-sort-value="Apple">Bird</td></tr>' +
- '<tr><td data-sort-value="Bananna">Ferret</td></tr>' +
- '<tr><td data-sort-value="Drupe">Elephant</td></tr>' +
- '<tr><td data-sort-value="Cherry">Dolphin</td></tr>' +
- '</tbody></table>'
- );
- $table.tablesorter().find( '.headerSort:eq(0)' ).click();
-
- data = [];
- $table.find( 'tbody > tr' ).each( function( i, tr ) {
- $( tr ).find( 'td' ).each( function( i, td ) {
- data.push( {
- data: $( td ).data( 'sortValue' ),
- text: $( td ).text()
- } );
- });
- });
-
- assert.deepEqual( data, [
- {
- data: 'Apple',
- text: 'Bird'
- }, {
- data: 'Bananna',
- text: 'Ferret'
- }, {
- data: undefined,
- text: 'Cheetah'
- }, {
- data: 'Cherry',
- text: 'Dolphin'
- }, {
- data: 'Drupe',
- text: 'Elephant'
- }
- ], 'Order matches expected order (based on data-sort-value attribute values)' );
-
- // Example 2
- $table = $(
- '<table class="sortable"><thead><tr><th>Data</th></tr></thead>' +
- '<tbody>' +
- '<tr><td>D</td></tr>' +
- '<tr><td data-sort-value="E">A</td></tr>' +
- '<tr><td>B</td></tr>' +
- '<tr><td>G</td></tr>' +
- '<tr><td data-sort-value="F">C</td></tr>' +
- '</tbody></table>'
- );
- $table.tablesorter().find( '.headerSort:eq(0)' ).click();
-
- data = [];
- $table.find( 'tbody > tr' ).each( function ( i, tr ) {
- $( tr ).find( 'td' ).each( function ( i, td ) {
- data.push( {
- data: $( td ).data( 'sortValue' ),
- text: $( td ).text()
- } );
- });
- });
-
- assert.deepEqual( data, [
- {
- data: undefined,
- text: 'B'
- }, {
- data: undefined,
- text: 'D'
- }, {
- data: 'E',
- text: 'A'
- }, {
- data: 'F',
- text: 'C'
- }, {
- data: undefined,
- text: 'G'
- }
- ], 'Order matches expected order (based on data-sort-value attribute values)' );
-
- // Example 3: Test that live changes are used from data-sort-value,
- // even if they change after the tablesorter is constructed (bug 38152).
- $table = $(
- '<table class="sortable"><thead><tr><th>Data</th></tr></thead>' +
- '<tbody>' +
- '<tr><td>D</td></tr>' +
- '<tr><td data-sort-value="1">A</td></tr>' +
- '<tr><td>B</td></tr>' +
- '<tr><td data-sort-value="2">G</td></tr>' +
- '<tr><td>C</td></tr>' +
- '</tbody></table>'
- );
- // initialize table sorter and sort once
- $table
- .tablesorter()
- .find( '.headerSort:eq(0)' ).click();
-
- // Change the sortValue data properties (bug 38152)
- // - change data
- $table.find( 'td:contains(A)' ).data( 'sortValue', 3 );
- // - add data
- $table.find( 'td:contains(B)' ).data( 'sortValue', 1 );
- // - remove data, bring back attribute: 2
- $table.find( 'td:contains(G)' ).removeData( 'sortValue' );
-
- // Now sort again (twice, so it is back at Ascending)
- $table.find( '.headerSort:eq(0)' ).click();
- $table.find( '.headerSort:eq(0)' ).click();
-
- data = [];
- $table.find( 'tbody > tr' ).each( function( i, tr ) {
- $( tr ).find( 'td' ).each( function( i, td ) {
- data.push( {
- data: $( td ).data( 'sortValue' ),
- text: $( td ).text()
- } );
- });
- });
-
- assert.deepEqual( data, [
- {
- data: 1,
- text: "B"
- }, {
- data: 2,
- text: "G"
- }, {
- data: 3,
- text: "A"
- }, {
- data: undefined,
- text: "C"
- }, {
- data: undefined,
- text: "D"
- }
- ], 'Order matches expected order, using the current sortValue in $.data()' );
-
-});
-
-var numbers = [
- [ '12' ],
- [ '7' ],
- [ '13,000'],
- [ '9' ],
- [ '14' ],
- [ '8.0' ]
-];
-var numbersAsc = [
- [ '7' ],
- [ '8.0' ],
- [ '9' ],
- [ '12' ],
- [ '14' ],
- [ '13,000']
-];
-
-tableTest( 'bug 8115: sort numbers with commas (ascending)',
- ['Numbers'], numbers, numbersAsc,
- function( $table ) {
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-
-tableTest( 'bug 8115: sort numbers with commas (descending)',
- ['Numbers'], numbers, reversed(numbersAsc),
- function( $table ) {
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click().click();
- }
-);
-// TODO add numbers sorting tests for bug 8115 with a different language
-
-QUnit.test( 'bug 32888 - Tables inside a tableheader cell', 2, function ( assert ) {
- var $table;
- $table = $(
- '<table class="sortable" id="mw-bug-32888">' +
- '<tr><th>header<table id="mw-bug-32888-2">'+
- '<tr><th>1</th><th>2</th></tr>' +
- '</table></th></tr>' +
- '<tr><td>A</td></tr>' +
- '<tr><td>B</td></tr>' +
- '</table>'
- );
- $table.tablesorter();
-
- assert.equal(
- $table.find('> thead:eq(0) > tr > th.headerSort').length,
- 1,
- 'Child tables inside a headercell should not interfere with sortable headers (bug 32888)'
- );
- assert.equal(
- $( '#mw-bug-32888-2' ).find('th.headerSort').length,
- 0,
- 'The headers of child tables inside a headercell should not be sortable themselves (bug 32888)'
- );
-});
-
-
-var correctDateSorting1 = [
- ['01 January 2010'],
- ['05 February 2010'],
- ['16 January 2010']
-];
-
-var correctDateSortingSorted1 = [
- ['01 January 2010'],
- ['16 January 2010'],
- ['05 February 2010']
-];
-
-tableTest(
- 'Correct date sorting I',
- ['date'],
- correctDateSorting1,
- correctDateSortingSorted1,
- function ( $table ) {
- mw.config.set( 'wgDefaultDateFormat', 'mdy' );
-
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-
-var correctDateSorting2 = [
- ['January 01 2010'],
- ['February 05 2010'],
- ['January 16 2010']
-];
-
-var correctDateSortingSorted2 = [
- ['January 01 2010'],
- ['January 16 2010'],
- ['February 05 2010']
-];
-
-tableTest(
- 'Correct date sorting II',
- ['date'],
- correctDateSorting2,
- correctDateSortingSorted2,
- function ( $table ) {
- mw.config.set( 'wgDefaultDateFormat', 'dmy' );
-
- $table.tablesorter();
- $table.find( '.headerSort:eq(0)' ).click();
- }
-);
-
-}( jQuery, mediaWiki ) );
diff --git a/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js b/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
deleted file mode 100644
index f0a210f5..00000000
--- a/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
+++ /dev/null
@@ -1,275 +0,0 @@
-QUnit.module( 'jquery.textSelection', QUnit.newMwEnvironment() );
-
-/**
- * Test factory for $.fn.textSelection( 'encapsulateText' )
- *
- * @param options {object} associative array containing:
- * description {string}
- * input {string}
- * output {string}
- * start {int} starting char for selection
- * end {int} ending char for selection
- * params {object} add'l parameters for $().textSelection( 'encapsulateText' )
- */
-function encapsulateTest( options ) {
- var opt = $.extend({
- description: '',
- before: {},
- after: {},
- replace: {}
- }, options);
-
- opt.before = $.extend({
- text: '',
- start: 0,
- end: 0
- }, opt.before);
- opt.after = $.extend({
- text: '',
- selected: null
- }, opt.after);
-
- QUnit.test( opt.description, function ( assert ) {
- var tests = 1;
- if ( opt.after.selected !== null ) {
- tests++;
- }
- QUnit.expect( tests );
-
- var $textarea = $( '<textarea>' );
-
- $( '#qunit-fixture' ).append( $textarea );
-
- //$textarea.textSelection( 'setContents', opt.before.text); // this method is actually missing atm...
- $textarea.val( opt.before.text ); // won't work with the WikiEditor iframe?
-
- var start = opt.before.start,
- end = opt.before.end;
- if ( window.opera ) {
- // Compensate for Opera's craziness converting "\n" to "\r\n" and counting that as two chars
- var newLinesBefore = opt.before.text.substring( 0, start ).split( "\n" ).length - 1,
- newLinesInside = opt.before.text.substring( start, end ).split( "\n" ).length - 1;
- start += newLinesBefore;
- end += newLinesBefore + newLinesInside;
- }
-
- var options = $.extend( {}, opt.replace ); // Clone opt.replace
- options.selectionStart = start;
- options.selectionEnd = end;
- $textarea.textSelection( 'encapsulateSelection', options );
-
- var text = $textarea.textSelection( 'getContents' ).replace( /\r\n/g, "\n" );
-
- assert.equal( text, opt.after.text, 'Checking full text after encapsulation' );
-
- if (opt.after.selected !== null) {
- var selected = $textarea.textSelection( 'getSelection' );
- assert.equal( selected, opt.after.selected, 'Checking selected text after encapsulation.' );
- }
-
- } );
-}
-
-var sig = {
- 'pre': "--~~~~"
-}, bold = {
- pre: "'''",
- peri: 'Bold text',
- post: "'''"
-}, h2 = {
- 'pre': '== ',
- 'peri': 'Heading 2',
- 'post': ' ==',
- 'regex': /^(\s*)(={1,6})(.*?)\2(\s*)$/,
- 'regexReplace': "$1==$3==$4",
- 'ownline': true
-}, ulist = {
- 'pre': "* ",
- 'peri': 'Bulleted list item',
- 'post': "",
- 'ownline': true,
- 'splitlines': true
-};
-
-encapsulateTest({
- description: "Adding sig to end of text",
- before: {
- text: "Wikilove dude! ",
- start: 15,
- end: 15
- },
- after: {
- text: "Wikilove dude! --~~~~",
- selected: ""
- },
- replace: sig
-});
-
-encapsulateTest({
- description: "Adding bold to empty",
- before: {
- text: "",
- start: 0,
- end: 0
- },
- after: {
- text: "'''Bold text'''",
- selected: "Bold text" // selected because it's the default
- },
- replace: bold
-});
-
-encapsulateTest({
- description: "Adding bold to existing text",
- before: {
- text: "Now is the time for all good men to come to the aid of their country",
- start: 20,
- end: 32
- },
- after: {
- text: "Now is the time for '''all good men''' to come to the aid of their country",
- selected: "" // empty because it's not the default'
- },
- replace: bold
-});
-
-encapsulateTest({
- description: "ownline option: adding new h2",
- before: {
- text:"Before\nAfter",
- start: 7,
- end: 7
- },
- after: {
- text: "Before\n== Heading 2 ==\nAfter",
- selected: "Heading 2"
- },
- replace: h2
-});
-
-encapsulateTest({
- description: "ownline option: turn a whole line into new h2",
- before: {
- text:"Before\nMy heading\nAfter",
- start: 7,
- end: 17
- },
- after: {
- text: "Before\n== My heading ==\nAfter",
- selected: ""
- },
- replace: h2
-});
-
-
-encapsulateTest({
- description: "ownline option: turn a partial line into new h2",
- before: {
- text:"BeforeMy headingAfter",
- start: 6,
- end: 16
- },
- after: {
- text: "Before\n== My heading ==\nAfter",
- selected: ""
- },
- replace: h2
-});
-
-
-encapsulateTest({
- description: "splitlines option: no selection, insert new list item",
- before: {
- text: "Before\nAfter",
- start: 7,
- end: 7
- },
- after: {
- text: "Before\n* Bulleted list item\nAfter"
- },
- replace: ulist
-});
-
-encapsulateTest({
- description: "splitlines option: single partial line selection, insert new list item",
- before: {
- text: "BeforeMy List ItemAfter",
- start: 6,
- end: 18
- },
- after: {
- text: "Before\n* My List Item\nAfter"
- },
- replace: ulist
-});
-
-encapsulateTest({
- description: "splitlines option: multiple lines",
- before: {
- text: "Before\nFirst\nSecond\nThird\nAfter",
- start: 7,
- end: 25
- },
- after: {
- text: "Before\n* First\n* Second\n* Third\nAfter"
- },
- replace: ulist
-});
-
-
-function caretTest( options ) {
- QUnit.test( options.description, 2, function ( assert ) {
- var $textarea = $( '<textarea>' ).text( options.text );
-
- $( '#qunit-fixture' ).append( $textarea );
-
- if ( options.mode === 'set' ) {
- $textarea.textSelection('setSelection', {
- start: options.start,
- end: options.end
- });
- }
-
- function among( actual, expected, message ) {
- if ( $.isArray( expected ) ) {
- assert.ok( $.inArray( actual, expected ) !== -1 , message + ' (got ' + actual + '; expected one of ' + expected.join(', ') + ')' );
- } else {
- assert.equal( actual, expected, message );
- }
- }
-
- var pos = $textarea.textSelection('getCaretPosition', {startAndEnd: true});
- among(pos[0], options.start, 'Caret start should be where we set it.');
- among(pos[1], options.end, 'Caret end should be where we set it.');
- });
-}
-
-var caretSample = "Some big text that we like to work with. Nothing fancy... you know what I mean?";
-
-/*
- // @broken: Disabled per bug 34820
-caretTest({
- description: 'getCaretPosition with original/empty selection - bug 31847 with IE 6/7/8',
- text: caretSample,
- start: [0, caretSample.length], // Opera and Firefox (prior to FF 6.0) default caret to the end of the box (caretSample.length)
- end: [0, caretSample.length], // Other browsers default it to the beginning (0), so check both.
- mode: 'get'
-});
-*/
-
-caretTest({
- description: 'set/getCaretPosition with forced empty selection',
- text: caretSample,
- start: 7,
- end: 7,
- mode: 'set'
-});
-
-caretTest({
- description: 'set/getCaretPosition with small selection',
- text: caretSample,
- start: 6,
- end: 11,
- mode: 'set'
-});
-
diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js
deleted file mode 100644
index 3d3f630f..00000000
--- a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js
+++ /dev/null
@@ -1,26 +0,0 @@
-QUnit.module( 'mediawiki.api.parse', QUnit.newMwEnvironment() );
-
-QUnit.asyncTest( 'Hello world', function ( assert ) {
- var api;
- QUnit.expect( 6 );
-
- api = new mw.Api();
-
- api.parse( "'''Hello world'''" )
- .done( function ( html ) {
- // Parse into a document fragment instead of comparing HTML, due to
- // presence of Tidy influencing whitespace.
- // Html also contains "NewPP report" comment.
- var $res = $( '<div>' ).html( html ).children(),
- res = $res.get( 0 );
- assert.equal( $res.length, 1, 'Response contains 1 element' );
- assert.equal( res.nodeName.toLowerCase(), 'p', 'Response is a paragraph' );
- assert.equal( $res.children().length, 1, 'Response has 1 child element' );
- assert.equal( $res.children().get( 0 ).nodeName.toLowerCase(), 'b', 'Child element is a bold tag' );
- // Trim since Tidy may or may not mess with the spacing here
- assert.equal( $.trim( $res.text() ), 'Hello world', 'Response contains given text' );
- assert.equal( $res.find( 'b' ).text(), 'Hello world', 'Bold tag wraps the entire, same, text' );
-
- QUnit.start();
- });
-});
diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
deleted file mode 100644
index 79bd7306..00000000
--- a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
+++ /dev/null
@@ -1,59 +0,0 @@
-QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment() );
-
-QUnit.asyncTest( 'Basic functionality', function ( assert ) {
- var api, d1, d2, d3;
- QUnit.expect( 3 );
-
- api = new mw.Api();
-
- d1 = api.get( {} )
- .done( function ( data ) {
- assert.deepEqual( data, [], 'If request succeeds without errors, resolve deferred' );
- });
-
- d2 = api.get({
- action: 'doesntexist'
- })
- .fail( function ( errorCode, details ) {
- assert.equal( errorCode, 'unknown_action', 'API error (e.g. "unknown_action") should reject the deferred' );
- });
-
- d3 = api.post( {} )
- .done( function ( data ) {
- assert.deepEqual( data, [], 'Simple POST request' );
- });
-
- // After all are completed, continue the test suite.
- QUnit.whenPromisesComplete( d1, d2, d3 ).always( function () {
- QUnit.start();
- });
-});
-
-QUnit.asyncTest( 'Deprecated callback methods', function ( assert ) {
- var api, d1, d2, d3;
- QUnit.expect( 3 );
-
- api = new mw.Api();
-
- d1 = api.get( {}, function () {
- assert.ok( true, 'Function argument treated as success callback.' );
- });
-
- d2 = api.get( {}, {
- ok: function ( data ) {
- assert.ok( true, '"ok" property treated as success callback.' );
- }
- });
-
- d3 = api.get({
- action: 'doesntexist'
- }, {
- err: function ( data ) {
- assert.ok( true, '"err" property treated as error callback.' );
- }
- });
-
- QUnit.whenPromisesComplete( d1, d2, d3 ).always( function () {
- QUnit.start();
- });
-});
diff --git a/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js b/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
deleted file mode 100644
index 7fe7baf8..00000000
--- a/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
+++ /dev/null
@@ -1,62 +0,0 @@
-QUnit.module( 'mediawiki.special.recentchanges', QUnit.newMwEnvironment() );
-
-// TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
-
-QUnit.test( '"all" namespace disable checkboxes', function ( assert ) {
-
- // from Special:Recentchanges
- var select =
- '<select id="namespace" name="namespace" class="namespaceselector">'
- + '<option value="" selected="selected">all</option>'
- + '<option value="0">(Main)</option>'
- + '<option value="1">Talk</option>'
- + '<option value="2">User</option>'
- + '<option value="3">User talk</option>'
- + '<option value="4">ProjectName</option>'
- + '<option value="5">ProjectName talk</option>'
- + '</select>'
- + '<input name="invert" type="checkbox" value="1" id="nsinvert" title="no title" />'
- + '<label for="nsinvert" title="no title">Invert selection</label>'
- + '<input name="associated" type="checkbox" value="1" id="nsassociated" title="no title" />'
- + '<label for="nsassociated" title="no title">Associated namespace</label>'
- + '<input type="submit" value="Go" />'
- + '<input type="hidden" value="Special:RecentChanges" name="title" />'
- ;
-
- var $env = $( '<div>' ).html( select ).appendTo( 'body' );
-
- // TODO abstract the double strictEquals
-
- // At first checkboxes are enabled
- assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
- assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
-
- // Initiate the recentchanges module
- mw.special.recentchanges.init();
-
- // By default
- assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
- assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
-
- // select second option...
- var $options = $( '#namespace' ).find( 'option' );
- $options.eq(0).removeProp( 'selected' );
- $options.eq(1).prop( 'selected', true );
- $( '#namespace' ).change();
-
- // ... and checkboxes should be enabled again
- assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
- assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
-
- // select first option ( 'all' namespace)...
- $options.eq(1).removeProp( 'selected' );
- $options.eq(0).prop( 'selected', true );
- $( '#namespace' ).change();
-
- // ... and checkboxes should now be disabled
- assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
- assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
-
- // DOM cleanup
- $env.remove();
-});
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
deleted file mode 100644
index a736e121..00000000
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
+++ /dev/null
@@ -1,200 +0,0 @@
-( function () {
-
-// mw.Title relies on these three config vars
-// Restore them after each test run
-var config = {
- "wgFormattedNamespaces": {
- "-2": "Media",
- "-1": "Special",
- "0": "",
- "1": "Talk",
- "2": "User",
- "3": "User talk",
- "4": "Wikipedia",
- "5": "Wikipedia talk",
- "6": "File",
- "7": "File talk",
- "8": "MediaWiki",
- "9": "MediaWiki talk",
- "10": "Template",
- "11": "Template talk",
- "12": "Help",
- "13": "Help talk",
- "14": "Category",
- "15": "Category talk",
- // testing custom / localized namespace
- "100": "Penguins"
- },
- "wgNamespaceIds": {
- "media": -2,
- "special": -1,
- "": 0,
- "talk": 1,
- "user": 2,
- "user_talk": 3,
- "wikipedia": 4,
- "wikipedia_talk": 5,
- "file": 6,
- "file_talk": 7,
- "mediawiki": 8,
- "mediawiki_talk": 9,
- "template": 10,
- "template_talk": 11,
- "help": 12,
- "help_talk": 13,
- "category": 14,
- "category_talk": 15,
- "image": 6,
- "image_talk": 7,
- "project": 4,
- "project_talk": 5,
- /* testing custom / alias */
- "penguins": 100,
- "antarctic_waterfowl": 100
- },
- "wgCaseSensitiveNamespaces": []
-};
-
-QUnit.module( 'mediawiki.Title', QUnit.newMwEnvironment({ config: config }) );
-
-
-QUnit.test( 'Transformation', 8, function ( assert ) {
- var title;
-
- title = new mw.Title( 'File:quux pif.jpg' );
- assert.equal( title.getName(), 'Quux_pif' );
-
- title = new mw.Title( 'File:Glarg_foo_glang.jpg' );
- assert.equal( title.getNameText(), 'Glarg foo glang' );
-
- title = new mw.Title( 'User:ABC.DEF' );
- assert.equal( title.toText(), 'User:ABC.DEF' );
- assert.equal( title.getNamespaceId(), 2 );
- assert.equal( title.getNamespacePrefix(), 'User:' );
-
- title = new mw.Title( 'uSEr:hAshAr' );
- assert.equal( title.toText(), 'User:HAshAr' );
- assert.equal( title.getNamespaceId(), 2 );
-
- title = new mw.Title( ' MediaWiki: Foo bar .js ' );
- // Don't ask why, it's the way the backend works. One space is kept of each set
- assert.equal( title.getName(), 'Foo_bar_.js', "Merge multiple spaces to a single space." );
-});
-
-QUnit.test( 'Main text for filename', 8, function ( assert ) {
- var title = new mw.Title( 'File:foo_bar.JPG' );
-
- assert.equal( title.getNamespaceId(), 6 );
- assert.equal( title.getNamespacePrefix(), 'File:' );
- assert.equal( title.getName(), 'Foo_bar' );
- assert.equal( title.getNameText(), 'Foo bar' );
- assert.equal( title.getMain(), 'Foo_bar.JPG' );
- assert.equal( title.getMainText(), 'Foo bar.JPG' );
- assert.equal( title.getExtension(), 'JPG' );
- assert.equal( title.getDotExtension(), '.JPG' );
-});
-
-QUnit.test( 'Namespace detection and conversion', 6, function ( assert ) {
- var title;
-
- title = new mw.Title( 'something.PDF', 6 );
- assert.equal( title.toString(), 'File:Something.PDF' );
-
- title = new mw.Title( 'NeilK', 3 );
- assert.equal( title.toString(), 'User_talk:NeilK' );
- assert.equal( title.toText(), 'User talk:NeilK' );
-
- title = new mw.Title( 'Frobisher', 100 );
- assert.equal( title.toString(), 'Penguins:Frobisher' );
-
- title = new mw.Title( 'antarctic_waterfowl:flightless_yet_cute.jpg' );
- assert.equal( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
-
- title = new mw.Title( 'Penguins:flightless_yet_cute.jpg' );
- assert.equal( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
-});
-
-QUnit.test( 'Throw error on invalid title', 1, function ( assert ) {
- assert.throws(function () {
- var title = new mw.Title( '' );
- }, 'Throw error on empty string' );
-});
-
-QUnit.test( 'Case-sensivity', 3, function ( assert ) {
- var title;
-
- // Default config
- mw.config.set( 'wgCaseSensitiveNamespaces', [] );
-
- title = new mw.Title( 'article' );
- assert.equal( title.toString(), 'Article', 'Default config: No sensitive namespaces by default. First-letter becomes uppercase' );
-
- // $wgCapitalLinks = false;
- mw.config.set( 'wgCaseSensitiveNamespaces', [0, -2, 1, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15] );
-
- title = new mw.Title( 'article' );
- assert.equal( title.toString(), 'article', '$wgCapitalLinks=false: Article namespace is sensitive, first-letter case stays lowercase' );
-
- title = new mw.Title( 'john', 2 );
- assert.equal( title.toString(), 'User:John', '$wgCapitalLinks=false: User namespace is insensitive, first-letter becomes uppercase' );
-});
-
-QUnit.test( 'toString / toText', 2, function ( assert ) {
- var title = new mw.Title( 'Some random page' );
-
- assert.equal( title.toString(), title.getPrefixedDb() );
- assert.equal( title.toText(), title.getPrefixedText() );
-});
-
-QUnit.test( 'getExtension', 7, function ( assert ) {
-
- function extTest( pagename, ext, description ) {
- var title = new mw.Title( pagename );
- assert.equal( title.getExtension(), ext, description || pagename );
- }
-
- extTest( 'MediaWiki:Vector.js', 'js' );
- extTest( 'User:Example/common.css', 'css' );
- extTest( 'File:Example.longextension', 'longextension', 'Extension parsing not limited (bug 36151)' );
- extTest( 'Example/information.json', 'json', 'Extension parsing not restricted from any namespace' );
- extTest( 'Foo.', null, 'Trailing dot is not an extension' );
- extTest( 'Foo..', null, 'Trailing dots are not an extension' );
- extTest( 'Foo.a.', null, 'Page name with dots and ending in a dot does not have an extension' );
-
- // @broken: Throws an exception
- // extTest( '.NET', null, 'Leading dot is (or is not?) an extension' );
-});
-
-QUnit.test( 'exists', 3, function ( assert ) {
- var title;
-
- // Empty registry, checks default to null
-
- title = new mw.Title( 'Some random page', 4 );
- assert.strictEqual( title.exists(), null, 'Return null with empty existance registry' );
-
- // Basic registry, checks default to boolean
- mw.Title.exist.set( ['Does_exist', 'User_talk:NeilK', 'Wikipedia:Sandbox_rules'], true );
- mw.Title.exist.set( ['Does_not_exist', 'User:John', 'Foobar'], false );
-
- title = new mw.Title( 'Project:Sandbox rules' );
- assert.assertTrue( title.exists(), 'Return true for page titles marked as existing' );
- title = new mw.Title( 'Foobar' );
- assert.assertFalse( title.exists(), 'Return false for page titles marked as nonexistent' );
-
-});
-
-QUnit.test( 'getUrl', 2, function ( assert ) {
- var title;
-
- // Config
- mw.config.set( 'wgArticlePath', '/wiki/$1' );
-
- title = new mw.Title( 'Foobar' );
- assert.equal( title.getUrl(), '/wiki/Foobar', 'Basic functionally, toString passing to wikiGetlink' );
-
- title = new mw.Title( 'John Doe', 3 );
- assert.equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' );
-});
-
-}() ); \ No newline at end of file
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js
deleted file mode 100644
index 68a9eafb..00000000
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js
+++ /dev/null
@@ -1,388 +0,0 @@
-QUnit.module( 'mediawiki.Uri', QUnit.newMwEnvironment({
- setup: function () {
- this.mwUriOrg = mw.Uri;
- mw.Uri = mw.UriRelative( 'http://example.org/w/index.php' );
- },
- teardown: function () {
- mw.Uri = this.mwUriOrg;
- delete this.mwUriOrg;
- }
-}) );
-
-$.each( [true, false], function ( i, strictMode ) {
- QUnit.test( 'Basic mw.Uri object test in ' + ( strictMode ? '' : 'non-' ) + 'strict mode for a simple HTTP URI', 2, function ( assert ) {
- var uriString, uri;
- uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
- uri = new mw.Uri( uriString, {
- strictMode: strictMode
- });
-
- assert.deepEqual(
- {
- protocol: uri.protocol,
- host: uri.host,
- port: uri.port,
- path: uri.path,
- query: uri.query,
- fragment: uri.fragment
- }, {
- protocol: 'http',
- host: 'www.ietf.org',
- port: undefined,
- path: '/rfc/rfc2396.txt',
- query: {},
- fragment: undefined
- },
- 'basic object properties'
- );
-
- assert.deepEqual(
- {
- userInfo: uri.getUserInfo(),
- authority: uri.getAuthority(),
- hostPort: uri.getHostPort(),
- queryString: uri.getQueryString(),
- relativePath: uri.getRelativePath(),
- toString: uri.toString()
- },
- {
- userInfo: '',
- authority: 'www.ietf.org',
- hostPort: 'www.ietf.org',
- queryString: '',
- relativePath: '/rfc/rfc2396.txt',
- toString: uriString
- },
- 'construct composite components of URI on request'
- );
-
- });
-});
-
-QUnit.test( 'Parse an ftp URI correctly with user and password', 1, function ( assert ) {
- var uri = new mw.Uri( 'ftp://usr:pwd@192.0.2.16/' );
-
- assert.deepEqual(
- {
- protocol: uri.protocol,
- user: uri.user,
- password: uri.password,
- host: uri.host,
- port: uri.port,
- path: uri.path,
- query: uri.query,
- fragment: uri.fragment
- },
- {
- protocol: 'ftp',
- user: 'usr',
- password: 'pwd',
- host: '192.0.2.16',
- port: undefined,
- path: '/',
- query: {},
- fragment: undefined
- },
- 'basic object properties'
- );
-} );
-
-QUnit.test( 'Parse a uri with simple querystring', 1, function ( assert ) {
- var uri = new mw.Uri( 'http://www.google.com/?q=uri' );
-
- assert.deepEqual(
- {
- protocol: uri.protocol,
- host: uri.host,
- port: uri.port,
- path: uri.path,
- query: uri.query,
- fragment: uri.fragment,
- queryString: uri.getQueryString()
- },
- {
- protocol: 'http',
- host: 'www.google.com',
- port: undefined,
- path: '/',
- query: { q: 'uri' },
- fragment: undefined,
- queryString: 'q=uri'
- },
- 'basic object properties'
- );
-} );
-
-QUnit.test( 'Handle multiple query parameter (overrideKeys on)', 5, function ( assert ) {
- var uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
- overrideKeys: true
- });
-
- assert.equal( uri.query.n, '1', 'multiple parameters are parsed' );
- assert.equal( uri.query.m, 'bar', 'last key overrides earlier keys' );
-
- uri.query.n = [ 'x', 'y', 'z' ];
-
- // Verify parts and total length instead of entire string because order
- // of iteration can vary.
- assert.ok( uri.toString().indexOf( 'm=bar' ), 'toString preserves other values' );
- assert.ok( uri.toString().indexOf( 'n=x&n=y&n=z' ), 'toString parameter includes all values of an array query parameter' );
- assert.equal( uri.toString().length, 'http://www.example.com/dir/?m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' );
-} );
-
-QUnit.test( 'Handle multiple query parameter (overrideKeys off)', 9, function ( assert ) {
- var uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
- overrideKeys: false
- });
-
- // Strict comparison so that types are also verified (n should be string '1')
- assert.strictEqual( uri.query.m.length, 2, 'multi-value query should be an array with 2 items' );
- assert.strictEqual( uri.query.m[0], 'foo', 'order and value is correct' );
- assert.strictEqual( uri.query.m[1], 'bar', 'order and value is correct' );
- assert.strictEqual( uri.query.n, '1', 'n=1 is parsed with the correct value of the expected type' );
-
- // Change query values
- uri.query.n = [ 'x', 'y', 'z' ];
-
- // Verify parts and total length instead of entire string because order
- // of iteration can vary.
- assert.ok( uri.toString().indexOf( 'm=foo&m=bar' ) >= 0, 'toString preserves other values' );
- assert.ok( uri.toString().indexOf( 'n=x&n=y&n=z' ) >= 0, 'toString parameter includes all values of an array query parameter' );
- assert.equal( uri.toString().length, 'http://www.example.com/dir/?m=foo&m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' );
-
- // Remove query values
- uri.query.m.splice( 0, 1 );
- delete uri.query.n;
-
- assert.equal( uri.toString(), 'http://www.example.com/dir/?m=bar', 'deletion properties' );
-
- // Remove more query values, leaving an empty array
- uri.query.m.splice( 0, 1 );
- assert.equal( uri.toString(), 'http://www.example.com/dir/', 'empty array value is ommitted' );
-} );
-
-QUnit.test( 'All-dressed URI with everything', 11, function ( assert ) {
- var uri, queryString, relativePath;
-
- uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' );
-
- assert.deepEqual(
- {
- protocol: uri.protocol,
- user: uri.user,
- password: uri.password,
- host: uri.host,
- port: uri.port,
- path: uri.path,
- query: uri.query,
- fragment: uri.fragment
- },
- {
- protocol: 'http',
- user: 'auth',
- password: undefined,
- host: 'www.example.com',
- port: '81',
- path: '/dir/dir.2/index.htm',
- query: { q1: '0', test1: null, test2: 'value (escaped)' },
- fragment: 'top'
- },
- 'basic object properties'
- );
-
- assert.equal( uri.getUserInfo(), 'auth', 'user info' );
-
- assert.equal( uri.getAuthority(), 'auth@www.example.com:81', 'authority equal to auth@hostport' );
-
- assert.equal( uri.getHostPort(), 'www.example.com:81', 'hostport equal to host:port' );
-
- queryString = uri.getQueryString();
- assert.ok( queryString.indexOf( 'q1=0' ) >= 0, 'query param with numbers' );
- assert.ok( queryString.indexOf( 'test1' ) >= 0, 'query param with null value is included' );
- assert.ok( queryString.indexOf( 'test1=' ) === -1, 'query param with null value does not generate equals sign' );
- assert.ok( queryString.indexOf( 'test2=value+%28escaped%29' ) >= 0, 'query param is url escaped' );
-
- relativePath = uri.getRelativePath();
- assert.ok( relativePath.indexOf( uri.path ) >= 0, 'path in relative path' );
- assert.ok( relativePath.indexOf( uri.getQueryString() ) >= 0, 'query string in relative path' );
- assert.ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragement in relative path' );
-} );
-
-QUnit.test( 'Cloning', 6, function ( assert ) {
- var original, clone;
-
- original = new mw.Uri( 'http://foo.example.org/index.php?one=1&two=2' );
- clone = original.clone();
-
- assert.deepEqual( clone, original, 'clone has equivalent properties' );
- assert.equal( original.toString(), clone.toString(), 'toString matches original' );
-
- assert.notStrictEqual( clone, original, 'clone is a different object when compared by reference' );
-
- clone.host = 'bar.example.org';
- assert.notEqual( original.host, clone.host, 'manipulating clone did not effect original' );
- assert.notEqual( original.toString(), clone.toString(), 'Stringified url no longer matches original' );
-
- clone.query.three = 3;
-
- assert.deepEqual(
- original.query,
- { 'one': '1', 'two': '2' },
- 'Properties is deep cloned (bug 37708)'
- );
-} );
-
-QUnit.test( 'Constructing mw.Uri from plain object', 3, function ( assert ) {
- var uri = new mw.Uri({
- protocol: 'http',
- host: 'www.foo.local',
- path: '/this'
- });
- assert.equal( uri.toString(), 'http://www.foo.local/this', 'Basic properties' );
-
- uri = new mw.Uri({
- protocol: 'http',
- host: 'www.foo.local',
- path: '/this',
- query: { hi: 'there' },
- fragment: 'blah'
- });
- assert.equal( uri.toString(), 'http://www.foo.local/this?hi=there#blah', 'More complex properties' );
-
- assert.throws(
- function () {
- var uri = new mw.Uri({
- protocol: 'http',
- host: 'www.foo.local'
- });
- },
- function ( e ) {
- return e.message === 'Bad constructor arguments';
- },
- 'Construction failed when missing required properties'
- );
-} );
-
-QUnit.test( 'Manipulate properties', 8, function ( assert ) {
- var uriBase, uri;
-
- uriBase = new mw.Uri( 'http://en.wiki.local/w/api.php' );
-
- uri = uriBase.clone();
- uri.fragment = 'frag';
- assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php#frag', 'add a fragment' );
-
- uri = uriBase.clone();
- uri.host = 'fr.wiki.local';
- uri.port = '8080';
- assert.equal( uri.toString(), 'http://fr.wiki.local:8080/w/api.php', 'change host and port' );
-
- uri = uriBase.clone();
- uri.query.foo = 'bar';
- assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'add query arguments' );
-
- delete uri.query.foo;
- assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php', 'delete query arguments' );
-
- uri = uriBase.clone();
- uri.query.foo = 'bar';
- assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'extend query arguments' );
- uri.extend({
- foo: 'quux',
- pif: 'paf'
- });
- assert.ok( uri.toString().indexOf( 'foo=quux' ) >= 0, 'extend query arguments' );
- assert.ok( uri.toString().indexOf( 'foo=bar' ) === -1, 'extend query arguments' );
- assert.ok( uri.toString().indexOf( 'pif=paf' ) >= 0 , 'extend query arguments' );
-} );
-
-QUnit.test( 'Handle protocol-relative URLs', 5, function ( assert ) {
- var UriRel, uri;
-
- UriRel = mw.UriRelative( 'glork://en.wiki.local/foo.php' );
-
- uri = new UriRel( '//en.wiki.local/w/api.php' );
- assert.equal( uri.protocol, 'glork', 'create protocol-relative URLs with same protocol as document' );
-
- uri = new UriRel( '/foo.com' );
- assert.equal( uri.toString(), 'glork://en.wiki.local/foo.com', 'handle absolute paths by supplying protocol and host from document in loose mode' );
-
- uri = new UriRel( 'http:/foo.com' );
- assert.equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in loose mode' );
-
- uri = new UriRel( '/foo.com', true );
- assert.equal( uri.toString(), 'glork://en.wiki.local/foo.com', 'handle absolute paths by supplying protocol and host from document in strict mode' );
-
- uri = new UriRel( 'http:/foo.com', true );
- assert.equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in strict mode' );
-} );
-
-QUnit.test( 'Bad calls', 3, function ( assert ) {
- var uri;
-
- assert.throws(
- function () {
- return new mw.Uri( 'glaswegian penguins' );
- },
- function ( e ) {
- return e.message === 'Bad constructor arguments';
- },
- 'throw error on non-URI as argument to constructor'
- );
-
- assert.throws(
- function () {
- return new mw.Uri( 'foo.com/bar/baz', {
- strictMode: true
- });
- },
- function ( e ) {
- return e.message === 'Bad constructor arguments';
- },
- 'throw error on URI without protocol or // or leading / in strict mode'
- );
-
- uri = new mw.Uri( 'foo.com/bar/baz', {
- strictMode: false
- });
- assert.equal( uri.toString(), 'http://foo.com/bar/baz', 'normalize URI without protocol or // in loose mode' );
-});
-
-QUnit.test( 'bug 35658', 2, function ( assert ) {
- var testProtocol, testServer, testPort, testPath, UriClass, uri, href;
-
- testProtocol = 'https://';
- testServer = 'foo.example.org';
- testPort = '3004';
- testPath = '/!1qy';
-
- UriClass = mw.UriRelative( testProtocol + testServer + '/some/path/index.html' );
- uri = new UriClass( testPath );
- href = uri.toString();
- assert.equal( href, testProtocol + testServer + testPath, 'Root-relative URL gets host & protocol supplied' );
-
- UriClass = mw.UriRelative( testProtocol + testServer + ':' + testPort + '/some/path.php' );
- uri = new UriClass( testPath );
- href = uri.toString();
- assert.equal( href, testProtocol + testServer + ':' + testPort + testPath, 'Root-relative URL gets host, protocol, and port supplied' );
-
-} );
-
-QUnit.test( 'Constructor falls back to default location', 4, function ( assert ) {
- var testuri, MyUri, uri;
-
- testuri = 'http://example.org/w/index.php';
- MyUri = mw.UriRelative( testuri );
-
- uri = new MyUri();
- assert.equal( uri.toString(), testuri, 'no arguments' );
-
- uri = new MyUri( undefined );
- assert.equal( uri.toString(), testuri, 'undefined' );
-
- uri = new MyUri( null );
- assert.equal( uri.toString(), testuri, 'null' );
-
- uri = new MyUri( '' );
- assert.equal( uri.toString(), testuri, 'empty string' );
-} );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js
deleted file mode 100644
index e2c66685..00000000
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js
+++ /dev/null
@@ -1,74 +0,0 @@
-QUnit.module( 'mediawiki.cldr', QUnit.newMwEnvironment() );
-
-var pluralTestcases = {
- /*
- * Sample:
- * "languagecode" : [
- * [ number, [ "form1", "form2", ... ], "expected", "description" ]
- * ];
- */
- "en": [
- [ 0, [ "one", "other" ], "other", "English plural test- 0 is other" ],
- [ 1, [ "one", "other" ], "one", "English plural test- 1 is one" ]
- ],
- "fa": [
- [ 0, [ "one", "other" ], "other", "Persian plural test- 0 is other" ],
- [ 1, [ "one", "other" ], "one", "Persian plural test- 1 is one" ],
- [ 2, [ "one", "other" ], "other", "Persian plural test- 2 is other" ]
- ],
- "fr": [
- [ 0, [ "one", "other" ], "other", "French plural test- 0 is other" ],
- [ 1, [ "one", "other" ], "one", "French plural test- 1 is one" ]
- ],
- "hi": [
- [ 0, [ "one", "other" ], "one", "Hindi plural test- 0 is one" ],
- [ 1, [ "one", "other" ], "one", "Hindi plural test- 1 is one" ],
- [ 2, [ "one", "other" ], "other", "Hindi plural test- 2 is other" ]
- ],
- "he": [
- [ 0, [ "one", "other" ], "other", "Hebrew plural test- 0 is other" ],
- [ 1, [ "one", "other" ], "one", "Hebrew plural test- 1 is one" ],
- [ 2, [ "one", "other" ], "other", "Hebrew plural test- 2 is other with 2 forms" ],
- [ 2, [ "one", "dual", "other" ], "dual", "Hebrew plural test- 2 is dual with 3 forms" ]
- ],
- "hu": [
- [ 0, [ "one", "other" ], "other", "Hungarian plural test- 0 is other" ],
- [ 1, [ "one", "other" ], "one", "Hungarian plural test- 1 is one" ],
- [ 2, [ "one", "other" ], "other", "Hungarian plural test- 2 is other" ]
- ],
- "ar": [
- [ 0, [ "zero", "one", "two", "few", "many", "other" ], "zero", "Arabic plural test - 0 is zero" ],
- [ 1, [ "zero", "one", "two", "few", "many", "other" ], "one", "Arabic plural test - 1 is one" ],
- [ 2, [ "zero", "one", "two", "few", "many", "other" ], "two", "Arabic plural test - 2 is two" ],
- [ 3, [ "zero", "one", "two", "few", "many", "other" ], "few", "Arabic plural test - 3 is few" ],
- [ 9, [ "zero", "one", "two", "few", "many", "other" ], "few", "Arabic plural test - 9 is few" ],
- [ "9", [ "zero", "one", "two", "few", "many", "other" ], "few", "Arabic plural test - 9 is few" ],
- [ 110, [ "zero", "one", "two", "few", "many", "other" ], "few", "Arabic plural test - 110 is few" ],
- [ 11, [ "zero", "one", "two", "few", "many", "other" ], "many", "Arabic plural test - 11 is many" ],
- [ 15, [ "zero", "one", "two", "few", "many", "other" ], "many", "Arabic plural test - 15 is many" ],
- [ 99, [ "zero", "one", "two", "few", "many", "other" ], "many", "Arabic plural test - 99 is many" ],
- [ 9999, [ "zero", "one", "two", "few", "many", "other" ], "many", "Arabic plural test - 9999 is many" ],
- [ 100, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 100 is other" ],
- [ 102, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 102 is other" ],
- [ 1000, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 1000 is other" ],
- [ 1.7, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 1.7 is other" ]
- ]
-};
-
-function pluralTest( langCode, tests ) {
- QUnit.test( 'Plural Test for ' + langCode, tests.length, function ( assert ) {
- for ( var i = 0; i < tests.length; i++ ) {
- assert.equal(
- mw.language.convertPlural( tests[i][0], tests[i][1] ),
- tests[i][2],
- tests[i][3]
- );
- }
- } );
-}
-
-$.each( pluralTestcases, function ( langCode, tests ) {
- if ( langCode === mw.config.get( 'wgUserLanguage' ) ) {
- pluralTest( langCode, tests );
- }
-} );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
deleted file mode 100644
index b8193a92..00000000
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
+++ /dev/null
@@ -1,97 +0,0 @@
-QUnit.module( 'mediawiki.jqueryMsg' );
-
-QUnit.test( 'mw.jqueryMsg Plural', 3, function ( assert ) {
- var parser = mw.jqueryMsg.getMessageFunction();
-
- mw.messages.set( 'plural-msg', 'Found $1 {{PLURAL:$1|item|items}}' );
- assert.equal( parser( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
- assert.equal( parser( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
- assert.equal( parser( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
-} );
-
-
-QUnit.test( 'mw.jqueryMsg Gender', 11, function ( assert ) {
- // TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
- // TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
- var user = mw.user,
- parser = mw.jqueryMsg.getMessageFunction();
-
- // The values here are not significant,
- // what matters is which of the values is choosen by the parser
- mw.messages.set( 'gender-msg', '$1: {{GENDER:$2|blue|pink|green}}' );
-
- user.options.set( 'gender', 'male' );
- assert.equal(
- parser( 'gender-msg', 'Bob', 'male' ),
- 'Bob: blue',
- 'Masculine from string "male"'
- );
- assert.equal(
- parser( 'gender-msg', 'Bob', user ),
- 'Bob: blue',
- 'Masculine from mw.user object'
- );
-
- user.options.set( 'gender', 'unknown' );
- assert.equal(
- parser( 'gender-msg', 'Foo', user ),
- 'Foo: green',
- 'Neutral from mw.user object' );
- assert.equal(
- parser( 'gender-msg', 'Alice', 'female' ),
- 'Alice: pink',
- 'Feminine from string "female"' );
- assert.equal(
- parser( 'gender-msg', 'User' ),
- 'User: green',
- 'Neutral when no parameter given' );
- assert.equal(
- parser( 'gender-msg', 'User', 'unknown' ),
- 'User: green',
- 'Neutral from string "unknown"'
- );
-
- mw.messages.set( 'gender-msg-one-form', '{{GENDER:$1|User}}: $2 {{PLURAL:$2|edit|edits}}' );
-
- assert.equal(
- parser( 'gender-msg-one-form', 'male', 10 ),
- 'User: 10 edits',
- 'Gender neutral and plural form'
- );
- assert.equal(
- parser( 'gender-msg-one-form', 'female', 1 ),
- 'User: 1 edit',
- 'Gender neutral and singular form'
- );
-
- mw.messages.set( 'gender-msg-lowercase', '{{gender:$1|he|she}} is awesome' );
- assert.equal(
- parser( 'gender-msg-lowercase', 'male' ),
- 'he is awesome',
- 'Gender masculine'
- );
- assert.equal(
- parser( 'gender-msg-lowercase', 'female' ),
- 'she is awesome',
- 'Gender feminine'
- );
-
- mw.messages.set( 'gender-msg-wrong', '{{gender}} test' );
- assert.equal(
- parser( 'gender-msg-wrong', 'female' ),
- ' test',
- 'Invalid syntax should result in {{gender}} simply being stripped away'
- );
-} );
-
-
-QUnit.test( 'mw.jqueryMsg Grammar', 2, function ( assert ) {
- var parser = mw.jqueryMsg.getMessageFunction();
-
- // Assume the grammar form grammar_case_foo is not valid in any language
- mw.messages.set( 'grammar-msg', 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}' );
- assert.equal( parser( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar Test with sitename' );
-
- mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' );
- assert.equal( parser( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ' , 'Grammar Test with wrong grammar template syntax' );
-} );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
deleted file mode 100644
index 2baa4f37..00000000
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Some misc JavaScript compatibility tests, just to make sure the environments we run in are consistent */
-
-QUnit.module( 'mediawiki.jscompat', QUnit.newMwEnvironment() );
-
-QUnit.test( 'Variable with Unicode letter in name', 3, function ( assert ) {
- var orig = "some token";
- var Åablono = orig;
-
- assert.deepEqual( Åablono, orig, 'Åablono' );
- assert.deepEqual( \u015dablono, orig, '\\u015dablono' );
- assert.deepEqual( \u015Dablono, orig, '\\u015Dablono' );
-});
-
-/*
-// Not that we need this. ;)
-// This fails on IE 6-8
-// Works on IE 9, Firefox 6, Chrome 14
-QUnit.test( 'Keyword workaround: "if" as variable name using Unicode escapes', function ( assert ) {
- var orig = "another token";
- \u0069\u0066 = orig;
- assert.deepEqual( \u0069\u0066, orig, '\\u0069\\u0066' );
-});
-*/
-
-/*
-// Not that we need this. ;)
-// This fails on IE 6-9
-// Works on Firefox 6, Chrome 14
-QUnit.test( 'Keyword workaround: "if" as member variable name using Unicode escapes', function ( assert ) {
- var orig = "another token";
- var foo = {};
- foo.\u0069\u0066 = orig;
- assert.deepEqual( foo.\u0069\u0066, orig, 'foo.\\u0069\\u0066' );
-});
-*/
-
-QUnit.test( 'Stripping of single initial newline from textarea\'s literal contents (bug 12130)', function ( assert ) {
- var maxn = 4;
- QUnit.expect( maxn * 2 );
-
- function repeat( str, n ) {
- if ( n <= 0 ) {
- return '';
- } else {
- var out = new Array(n);
- for ( var i = 0; i < n; i++ ) {
- out[i] = str;
- }
- return out.join('');
- }
- }
-
- for ( var n = 0; n < maxn; n++ ) {
- var expected = repeat('\n', n) + 'some text';
-
- var $textarea = $('<textarea>\n' + expected + '</textarea>');
- assert.equal( $textarea.val(), expected, 'Expecting ' + n + ' newlines (HTML contained ' + (n + 1) + ')' );
-
- var $textarea2 = $('<textarea>').val(expected);
- assert.equal( $textarea2.val(), expected, 'Expecting ' + n + ' newlines (from DOM set with ' + n + ')' );
- }
-});
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
deleted file mode 100644
index 3fa2b099..00000000
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
+++ /dev/null
@@ -1,394 +0,0 @@
-QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment({
- setup: function () {
- this.liveLangData = mw.language.data.values;
- mw.language.data.values = $.extend( true, {}, this.liveLangData );
- },
- teardown: function () {
- // Restore
- mw.language.data.values = this.liveLangData;
- }
-}) );
-
-QUnit.test( 'mw.language getData and setData', function ( assert ) {
- QUnit.expect( 2 );
-
- mw.language.setData( 'en', 'testkey', 'testvalue' );
- assert.equal( mw.language.getData( 'en', 'testkey' ), 'testvalue', 'Getter setter test for mw.language' );
- assert.equal( mw.language.getData( 'en', 'invalidkey' ), undefined, 'Getter setter test for mw.language with invalid key' );
-} );
-
-function grammarTest( langCode, test ) {
- // The test works only if the content language is opt.language
- // because it requires [lang].js to be loaded.
- QUnit.test( 'Grammar test for lang=' + langCode, function ( assert ) {
- QUnit.expect( test.length );
-
- for ( var i = 0 ; i < test.length; i++ ) {
- assert.equal(
- mw.language.convertGrammar( test[i].word, test[i].grammarForm ),
- test[i].expected,
- test[i].description
- );
- }
- });
-}
-
-var grammarTests = {
- bs: [
- {
- word: 'word',
- grammarForm: 'instrumental',
- expected: 's word',
- description: 'Grammar test for instrumental case'
- },
- {
- word: 'word',
- grammarForm: 'lokativ',
- expected: 'o word',
- description: 'Grammar test for lokativ case'
- }
- ],
-
- he: [
- {
- word: "ויקיפדיה",
- grammarForm: 'prefixed',
- expected: "וויקיפדיה",
- description: 'Duplicate the "Waw" if prefixed'
- },
- {
- word: "וולפגנג",
- grammarForm: 'prefixed',
- expected: "וולפגנג",
- description: 'Duplicate the "Waw" if prefixed, but not if it is already duplicated.'
- },
- {
- word: "הקובץ",
- grammarForm: 'prefixed',
- expected: "קובץ",
- description: 'Remove the "He" if prefixed'
- },
- {
- word: 'Wikipedia',
- grammarForm: 'תחילית',
- expected: 'Ö¾Wikipedia',
- description: 'GAdd a hyphen (maqaf) before non-Hebrew letters'
- },
- {
- word: '1995',
- grammarForm: 'תחילית',
- expected: 'Ö¾1995',
- description: 'Add a hyphen (maqaf) before numbers'
- }
- ],
-
- hsb: [
- {
- word: 'word',
- grammarForm: 'instrumental',
- expected: 'z word',
- description: 'Grammar test for instrumental case'
- },
- {
- word: 'word',
- grammarForm: 'lokatiw',
- expected: 'wo word',
- description: 'Grammar test for lokatiw case'
- }
- ],
-
- dsb: [
- {
- word: 'word',
- grammarForm: 'instrumental',
- expected: 'z word',
- description: 'Grammar test for instrumental case'
- },
- {
- word: 'word',
- grammarForm: 'lokatiw',
- expected: 'wo word',
- description: 'Grammar test for lokatiw case'
- }
- ],
-
- hy: [
- {
- word: 'Õ„Õ¡Õ¸Ö‚Õ¶Õ¡',
- grammarForm: 'genitive',
- expected: 'Õ„Õ¡Õ¸Ö‚Õ¶Õ¡ÕµÕ«',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'Õ°Õ¥Õ¿Õ¸',
- grammarForm: 'genitive',
- expected: 'Õ°Õ¥Õ¿Õ¸ÕµÕ«',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'Õ£Õ«Ö€Ö„',
- grammarForm: 'genitive',
- expected: 'Õ£Ö€Ö„Õ«',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ«',
- grammarForm: 'genitive',
- expected: 'ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ«Õ«',
- description: 'Grammar test for genitive case'
- }
- ],
-
- fi: [
- {
- word: 'talo',
- grammarForm: 'genitive',
- expected: 'talon',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'linux',
- grammarForm: 'genitive',
- expected: 'linuxin',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'talo',
- grammarForm: 'elative',
- expected: 'talosta',
- description: 'Grammar test for elative case'
- },
- {
- word: 'pastöroitu',
- grammarForm: 'partitive',
- expected: 'pastöroitua',
- description: 'Grammar test for partitive case'
- },
- {
- word: 'talo',
- grammarForm: 'partitive',
- expected: 'taloa',
- description: 'Grammar test for partitive case'
- },
- {
- word: 'talo',
- grammarForm: 'illative',
- expected: 'taloon',
- description: 'Grammar test for illative case'
- },
- {
- word: 'linux',
- grammarForm: 'inessive',
- expected: 'linuxissa',
- description: 'Grammar test for inessive case'
- }
- ],
-
- ru: [
- {
- word: 'теÑÑ‚ÑŒ',
- grammarForm: 'genitive',
- expected: 'теÑÑ‚Ñ',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'привилегиÑ',
- grammarForm: 'genitive',
- expected: 'привилегии',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'уÑтановка',
- grammarForm: 'genitive',
- expected: 'уÑтановки',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'похоти',
- grammarForm: 'genitive',
- expected: 'похотей',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'доводы',
- grammarForm: 'genitive',
- expected: 'доводов',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'пеÑчаник',
- grammarForm: 'genitive',
- expected: 'пеÑчаника',
- description: 'Grammar test for genitive case'
- }
- ],
-
-
- hu: [
- {
- word: 'Wikipédiá',
- grammarForm: 'rol',
- expected: 'Wikipédiáról',
- description: 'Grammar test for rol case'
- },
- {
- word: 'Wikipédiá',
- grammarForm: 'ba',
- expected: 'Wikipédiába',
- description: 'Grammar test for ba case'
- },
- {
- word: 'Wikipédiá',
- grammarForm: 'k',
- expected: 'Wikipédiák',
- description: 'Grammar test for k case'
- }
- ],
-
- ga: [
- {
- word: 'an Domhnach',
- grammarForm: 'ainmlae',
- expected: 'Dé Domhnaigh',
- description: 'Grammar test for ainmlae case'
- },
- {
- word: 'an Luan',
- grammarForm: 'ainmlae',
- expected: 'Dé Luain',
- description: 'Grammar test for ainmlae case'
- },
- {
- word: 'an Satharn',
- grammarForm: 'ainmlae',
- expected: 'Dé Sathairn',
- description: 'Grammar test for ainmlae case'
- }
- ],
-
- uk: [
- {
- word: 'теÑÑ‚ÑŒ',
- grammarForm: 'genitive',
- expected: 'теÑÑ‚Ñ',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'ВікіпедіÑ',
- grammarForm: 'genitive',
- expected: 'Вікіпедії',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'уÑтановка',
- grammarForm: 'genitive',
- expected: 'уÑтановки',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'похоти',
- grammarForm: 'genitive',
- expected: 'похотей',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'доводы',
- grammarForm: 'genitive',
- expected: 'доводов',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'пеÑчаник',
- grammarForm: 'genitive',
- expected: 'пеÑчаника',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'ВікіпедіÑ',
- grammarForm: 'accusative',
- expected: 'Вікіпедію',
- description: 'Grammar test for accusative case'
- }
- ],
-
- sl: [
- {
- word: 'word',
- grammarForm: 'orodnik',
- expected: 'z word',
- description: 'Grammar test for orodnik case'
- },
- {
- word: 'word',
- grammarForm: 'mestnik',
- expected: 'o word',
- description: 'Grammar test for mestnik case'
- }
- ],
-
- os: [
- {
- word: 'бæÑтæ',
- grammarForm: 'genitive',
- expected: 'бæÑÑ‚Ñ‹',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'бæÑтæ',
- grammarForm: 'allative',
- expected: 'бæÑтæм',
- description: 'Grammar test for allative case'
- },
- {
- word: 'Тигр',
- grammarForm: 'dative',
- expected: 'Тигрæн',
- description: 'Grammar test for dative case'
- },
- {
- word: 'цъити',
- grammarForm: 'dative',
- expected: 'цъитийæн',
- description: 'Grammar test for dative case'
- },
- {
- word: 'лæппу',
- grammarForm: 'genitive',
- expected: 'лæппуйы',
- description: 'Grammar test for genitive case'
- },
- {
- word: '2011',
- grammarForm: 'equative',
- expected: '2011-ау',
- description: 'Grammar test for equative case'
- }
- ],
-
- la: [
- {
- word: 'Translatio',
- grammarForm: 'genitive',
- expected: 'Translationis',
- description: 'Grammar test for genitive case'
- },
- {
- word: 'Translatio',
- grammarForm: 'accusative',
- expected: 'Translationem',
- description: 'Grammar test for accusative case'
- },
- {
- word: 'Translatio',
- grammarForm: 'ablative',
- expected: 'Translatione',
- description: 'Grammar test for ablative case'
- }
- ]
-};
-
-$.each( grammarTests, function ( langCode, test ) {
- if ( langCode === mw.config.get( 'wgUserLanguage' ) ) {
- grammarTest( langCode, test );
- }
-});
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js
deleted file mode 100644
index be59f1ad..00000000
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.test.js
+++ /dev/null
@@ -1,649 +0,0 @@
-( function ( mw ) {
-
-QUnit.module( 'mediawiki', QUnit.newMwEnvironment() );
-
-QUnit.test( 'Initial check', 8, function ( assert ) {
- assert.ok( window.jQuery, 'jQuery defined' );
- assert.ok( window.$, '$j defined' );
- assert.ok( window.$j, '$j defined' );
- assert.strictEqual( window.$, window.jQuery, '$ alias to jQuery' );
- assert.strictEqual( window.$j, window.jQuery, '$j alias to jQuery' );
-
- assert.ok( window.mediaWiki, 'mediaWiki defined' );
- assert.ok( window.mw, 'mw defined' );
- assert.strictEqual( window.mw, window.mediaWiki, 'mw alias to mediaWiki' );
-});
-
-QUnit.test( 'mw.Map', 17, function ( assert ) {
- var arry, conf, funky, globalConf, nummy, someValues;
-
- assert.ok( mw.Map, 'mw.Map defined' );
-
- conf = new mw.Map();
- // Dummy variables
- funky = function () {};
- arry = [];
- nummy = 7;
-
- // Tests for input validation
- assert.strictEqual( conf.get( 'inexistantKey' ), null, 'Map.get returns null if selection was a string and the key was not found' );
- assert.strictEqual( conf.set( 'myKey', 'myValue' ), true, 'Map.set returns boolean true if a value was set for a valid key string' );
- assert.strictEqual( conf.set( funky, 'Funky' ), false, 'Map.set returns boolean false if key was invalid (Function)' );
- assert.strictEqual( conf.set( arry, 'Arry' ), false, 'Map.set returns boolean false if key was invalid (Array)' );
- assert.strictEqual( conf.set( nummy, 'Nummy' ), false, 'Map.set returns boolean false if key was invalid (Number)' );
- assert.equal( conf.get( 'myKey' ), 'myValue', 'Map.get returns a single value value correctly' );
- assert.strictEqual( conf.get( nummy ), null, 'Map.get ruturns null if selection was invalid (Number)' );
- assert.strictEqual( conf.get( funky ), null, 'Map.get ruturns null if selection was invalid (Function)' );
-
- // Multiple values at once
- someValues = {
- 'foo': 'bar',
- 'lorem': 'ipsum',
- 'MediaWiki': true
- };
- assert.strictEqual( conf.set( someValues ), true, 'Map.set returns boolean true if multiple values were set by passing an object' );
- assert.deepEqual( conf.get( ['foo', 'lorem'] ), {
- 'foo': 'bar',
- 'lorem': 'ipsum'
- }, 'Map.get returns multiple values correctly as an object' );
-
- assert.deepEqual( conf.get( ['foo', 'notExist'] ), {
- 'foo': 'bar',
- 'notExist': null
- }, 'Map.get return includes keys that were not found as null values' );
-
- assert.strictEqual( conf.exists( 'foo' ), true, 'Map.exists returns boolean true if a key exists' );
- assert.strictEqual( conf.exists( 'notExist' ), false, 'Map.exists returns boolean false if a key does not exists' );
-
- // Interacting with globals and accessing the values object
- assert.strictEqual( conf.get(), conf.values, 'Map.get returns the entire values object by reference (if called without arguments)' );
-
- conf.set( 'globalMapChecker', 'Hi' );
-
- assert.ok( false === 'globalMapChecker' in window, 'new mw.Map did not store its values in the global window object by default' );
-
- globalConf = new mw.Map( true );
- globalConf.set( 'anotherGlobalMapChecker', 'Hello' );
-
- assert.ok( 'anotherGlobalMapChecker' in window, 'new mw.Map( true ) did store its values in the global window object' );
-
- // Whitelist this global variable for QUnit's 'noglobal' mode
- if ( QUnit.config.noglobals ) {
- QUnit.config.pollution.push( 'anotherGlobalMapChecker' );
- }
-});
-
-QUnit.test( 'mw.config', 1, function ( assert ) {
- assert.ok( mw.config instanceof mw.Map, 'mw.config instance of mw.Map' );
-});
-
-QUnit.test( 'mw.message & mw.messages', 20, function ( assert ) {
- var goodbye, hello, pluralMessage;
-
- assert.ok( mw.messages, 'messages defined' );
- assert.ok( mw.messages instanceof mw.Map, 'mw.messages instance of mw.Map' );
- assert.ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
-
- hello = mw.message( 'hello' );
-
- assert.equal( hello.format, 'plain', 'Message property "format" defaults to "plain"' );
- assert.strictEqual( hello.map, mw.messages, 'Message property "map" defaults to the global instance in mw.messages' );
- assert.equal( hello.key, 'hello', 'Message property "key" (currect key)' );
- assert.deepEqual( hello.parameters, [], 'Message property "parameters" defaults to an empty array' );
-
- // Todo
- assert.ok( hello.params, 'Message prototype "params"' );
-
- hello.format = 'plain';
- assert.equal( hello.toString(), 'Hello <b>awesome</b> world', 'Message.toString returns the message as a string with the current "format"' );
-
- assert.equal( hello.escaped(), 'Hello &lt;b&gt;awesome&lt;/b&gt; world', 'Message.escaped returns the escaped message' );
- assert.equal( hello.format, 'escaped', 'Message.escaped correctly updated the "format" property' );
-
- hello.parse();
- assert.equal( hello.format, 'parse', 'Message.parse correctly updated the "format" property' );
-
- hello.plain();
- assert.equal( hello.format, 'plain', 'Message.plain correctly updated the "format" property' );
-
- assert.strictEqual( hello.exists(), true, 'Message.exists returns true for existing messages' );
-
- goodbye = mw.message( 'goodbye' );
- assert.strictEqual( goodbye.exists(), false, 'Message.exists returns false for nonexistent messages' );
-
- assert.equal( goodbye.plain(), '<goodbye>', 'Message.toString returns plain <key> if format is "plain" and key does not exist' );
- // bug 30684
- assert.equal( goodbye.escaped(), '&lt;goodbye&gt;', 'Message.toString returns properly escaped &lt;key&gt; if format is "escaped" and key does not exist' );
-
- assert.ok( mw.messages.set( 'pluraltestmsg', 'There {{PLURAL:$1|is|are}} $1 {{PLURAL:$1|result|results}}' ), 'mw.messages.set: Register' );
- pluralMessage = mw.message( 'pluraltestmsg' , 6 );
- assert.equal( pluralMessage.plain(), 'There are 6 results', 'plural get resolved when format is plain' );
- assert.equal( pluralMessage.parse(), 'There are 6 results', 'plural get resolved when format is parse' );
-
-});
-
-QUnit.test( 'mw.msg', 11, function ( assert ) {
- assert.ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
- assert.equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
- assert.equal( mw.msg( 'goodbye' ), '<goodbye>', 'Gets message with default options (nonexistent message)' );
-
- assert.ok( mw.messages.set( 'plural-item' , 'Found $1 {{PLURAL:$1|item|items}}' ) );
- assert.equal( mw.msg( 'plural-item', 5 ), 'Found 5 items', 'Apply plural for count 5' );
- assert.equal( mw.msg( 'plural-item', 0 ), 'Found 0 items', 'Apply plural for count 0' );
- assert.equal( mw.msg( 'plural-item', 1 ), 'Found 1 item', 'Apply plural for count 1' );
-
- assert.ok( mw.messages.set('gender-plural-msg' , '{{GENDER:$1|he|she|they}} {{PLURAL:$2|is|are}} awesome' ) );
- assert.equal( mw.msg( 'gender-plural-msg', 'male', 1 ), 'he is awesome', 'Gender test for male, plural count 1' );
- assert.equal( mw.msg( 'gender-plural-msg', 'female', '1' ), 'she is awesome', 'Gender test for female, plural count 1' );
- assert.equal( mw.msg( 'gender-plural-msg', 'unknown', 10 ), 'they are awesome', 'Gender test for neutral, plural count 10' );
-
-});
-
-/**
- * The sync style load test (for @import). This is, in a way, also an open bug for
- * ResourceLoader ("execute js after styles are loaded"), but browsers don't offer a
- * way to get a callback from when a stylesheet is loaded (that is, including any
- * @import rules inside). To work around this, we'll have a little time loop to check
- * if the styles apply.
- * Note: This test originally used new Image() and onerror to get a callback
- * when the url is loaded, but that is fragile since it doesn't monitor the
- * same request as the css @import, and Safari 4 has issues with
- * onerror/onload not being fired at all in weird cases like this.
- */
-function assertStyleAsync( assert, $element, prop, val, fn ) {
- var styleTestStart,
- el = $element.get( 0 ),
- styleTestTimeout = ( QUnit.config.testTimeout - 200 ) || 5000;
-
- function isCssImportApplied() {
- // Trigger reflow, repaint, redraw, whatever (cross-browser)
- var x = $element.css( 'height' );
- x = el.innerHTML;
- el.className = el.className;
- x = document.documentElement.clientHeight;
-
- return $element.css( prop ) === val;
- }
-
- function styleTestLoop() {
- var styleTestSince = new Date().getTime() - styleTestStart;
- // If it is passing or if we timed out, run the real test and stop the loop
- if ( isCssImportApplied() || styleTestSince > styleTestTimeout ) {
- assert.equal( $element.css( prop ), val,
- 'style "' + prop + ': ' + val + '" from url is applied (after ' + styleTestSince + 'ms)'
- );
-
- if ( fn ) {
- fn();
- }
-
- return;
- }
- // Otherwise, keep polling
- setTimeout( styleTestLoop, 150 );
- }
-
- // Start the loop
- styleTestStart = new Date().getTime();
- styleTestLoop();
-}
-
-function urlStyleTest( selector, prop, val ) {
- return QUnit.fixurl(
- mw.config.get( 'wgScriptPath' ) +
- '/tests/qunit/data/styleTest.css.php?' +
- $.param( {
- selector: selector,
- prop: prop,
- val: val
- } )
- );
-}
-
-QUnit.asyncTest( 'mw.loader', 2, function ( assert ) {
- var isAwesomeDone;
-
- mw.loader.testCallback = function () {
- QUnit.start();
- assert.strictEqual( isAwesomeDone, undefined, 'Implementing module is.awesome: isAwesomeDone should still be undefined');
- isAwesomeDone = true;
- };
-
- mw.loader.implement( 'test.callback', [QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/callMwLoaderTestCallback.js' )], {}, {} );
-
- mw.loader.using( 'test.callback', function () {
-
- // /sample/awesome.js declares the "mw.loader.testCallback" function
- // which contains a call to start() and ok()
- assert.strictEqual( isAwesomeDone, true, "test.callback module should've caused isAwesomeDone to be true" );
- delete mw.loader.testCallback;
-
- }, function () {
- QUnit.start();
- assert.ok( false, 'Error callback fired while loader.using "test.callback" module' );
- });
-});
-
-QUnit.test( 'mw.loader.implement( styles={ "css": [text, ..] } )', 2, function ( assert ) {
- var $element = $( '<div class="mw-test-implement-a"></div>' ).appendTo( '#qunit-fixture' );
-
- assert.notEqual(
- $element.css( 'float' ),
- 'right',
- 'style is clear'
- );
-
- mw.loader.implement(
- 'test.implement.a',
- function () {
- assert.equal(
- $element.css( 'float' ),
- 'right',
- 'style is applied'
- );
- },
- {
- 'all': '.mw-test-implement-a { float: right; }'
- },
- {}
- );
-
- mw.loader.load([
- 'test.implement.a'
- ]);
-} );
-
-QUnit.asyncTest( 'mw.loader.implement( styles={ "url": { <media>: [url, ..] } } )', 7, function ( assert ) {
- var $element1 = $( '<div class="mw-test-implement-b1"></div>' ).appendTo( '#qunit-fixture' ),
- $element2 = $( '<div class="mw-test-implement-b2"></div>' ).appendTo( '#qunit-fixture' ),
- $element3 = $( '<div class="mw-test-implement-b3"></div>' ).appendTo( '#qunit-fixture' );
-
- assert.notEqual(
- $element1.css( 'text-align' ),
- 'center',
- 'style is clear'
- );
- assert.notEqual(
- $element2.css( 'float' ),
- 'left',
- 'style is clear'
- );
- assert.notEqual(
- $element3.css( 'text-align' ),
- 'right',
- 'style is clear'
- );
-
- mw.loader.implement(
- 'test.implement.b',
- function () {
- assertStyleAsync( assert, $element2, 'float', 'left', function () {
- assert.notEqual( $element1.css( 'text-align' ), 'center', 'print style is not applied' );
-
- QUnit.start();
- } );
- assertStyleAsync( assert, $element3, 'float', 'right', function () {
- assert.notEqual( $element1.css( 'text-align' ), 'center', 'print style is not applied' );
-
- QUnit.start();
- } );
- },
- {
- 'url': {
- 'print': [urlStyleTest( '.mw-test-implement-b1', 'text-align', 'center' )],
- 'screen': [
- // bug 40834: Make sure it actually works with more than 1 stylesheet reference
- urlStyleTest( '.mw-test-implement-b2', 'float', 'left' ),
- urlStyleTest( '.mw-test-implement-b3', 'float', 'right' )
- ]
- }
- },
- {}
- );
-
- mw.loader.load([
- 'test.implement.b'
- ]);
-} );
-
-// Backwards compatibility
-QUnit.test( 'mw.loader.implement( styles={ <media>: text } ) (back-compat)', 2, function ( assert ) {
- var $element = $( '<div class="mw-test-implement-c"></div>' ).appendTo( '#qunit-fixture' );
-
- assert.notEqual(
- $element.css( 'float' ),
- 'right',
- 'style is clear'
- );
-
- mw.loader.implement(
- 'test.implement.c',
- function () {
- assert.equal(
- $element.css( 'float' ),
- 'right',
- 'style is applied'
- );
- },
- {
- 'all': '.mw-test-implement-c { float: right; }'
- },
- {}
- );
-
- mw.loader.load([
- 'test.implement.c'
- ]);
-} );
-
-// Backwards compatibility
-QUnit.asyncTest( 'mw.loader.implement( styles={ <media>: [url, ..] } ) (back-compat)', 4, function ( assert ) {
- var $element = $( '<div class="mw-test-implement-d"></div>' ).appendTo( '#qunit-fixture' ),
- $element2 = $( '<div class="mw-test-implement-d2"></div>' ).appendTo( '#qunit-fixture' );
-
- assert.notEqual(
- $element.css( 'float' ),
- 'right',
- 'style is clear'
- );
- assert.notEqual(
- $element2.css( 'text-align' ),
- 'center',
- 'style is clear'
- );
-
- mw.loader.implement(
- 'test.implement.d',
- function () {
- assertStyleAsync( assert, $element, 'float', 'right', function () {
-
- assert.notEqual( $element2.css( 'text-align' ), 'center', 'print style is not applied (bug 40500)' );
-
- QUnit.start();
- } );
- },
- {
- 'all': [urlStyleTest( '.mw-test-implement-d', 'float', 'right' )],
- 'print': [urlStyleTest( '.mw-test-implement-d2', 'text-align', 'center' )]
- },
- {}
- );
-
- mw.loader.load([
- 'test.implement.d'
- ]);
-} );
-
-// @import (bug 31676)
-QUnit.asyncTest( 'mw.loader.implement( styles has @import)', 5, function ( assert ) {
- var isJsExecuted, $element;
-
- mw.loader.implement(
- 'test.implement.import',
- function () {
- assert.strictEqual( isJsExecuted, undefined, 'javascript not executed multiple times' );
- isJsExecuted = true;
-
- assert.equal( mw.loader.getState( 'test.implement.import' ), 'ready', 'module state is "ready" while implement() is executing javascript' );
-
- $element = $( '<div class="mw-test-implement-import">Foo bar</div>' ).appendTo( '#qunit-fixture' );
-
- assert.equal( mw.msg( 'test-foobar' ), 'Hello Foobar, $1!', 'Messages are loaded before javascript execution' );
-
- assertStyleAsync( assert, $element, 'float', 'right', function () {
- assert.equal( $element.css( 'text-align' ),'center',
- 'CSS styles after the @import rule are working'
- );
-
- QUnit.start();
- } );
- },
- {
- 'css': [
- '@import url(\''
- + urlStyleTest( '.mw-test-implement-import', 'float', 'right' )
- + '\');\n'
- + '.mw-test-implement-import { text-align: center; }'
- ]
- },
- {
- 'test-foobar': 'Hello Foobar, $1!'
- }
- );
-
- mw.loader.load( 'test.implement' );
-
-});
-
-QUnit.asyncTest( 'mw.loader.implement( only messages )' , 2, function ( assert ) {
- assert.assertFalse( mw.messages.exists( 'bug_29107' ), 'Verify that the test message doesn\'t exist yet' );
-
- mw.loader.implement( 'test.implement.msgs', [], {}, { 'bug_29107': 'loaded' } );
- mw.loader.using( 'test.implement.msgs', function() {
- QUnit.start();
- assert.ok( mw.messages.exists( 'bug_29107' ), 'Bug 29107: messages-only module should implement ok' );
- }, function() {
- QUnit.start();
- assert.ok( false, 'Error callback fired while implementing "test.implement.msgs" module' );
- });
-});
-
-QUnit.test( 'mw.loader erroneous indirect dependency', 3, function ( assert ) {
- mw.loader.register( [
- ['test.module1', '0'],
- ['test.module2', '0', ['test.module1']],
- ['test.module3', '0', ['test.module2']]
- ] );
- mw.loader.implement( 'test.module1', function () { throw new Error( 'expected' ); }, {}, {} );
- assert.strictEqual( mw.loader.getState( 'test.module1' ), 'error', 'Expected "error" state for test.module1' );
- assert.strictEqual( mw.loader.getState( 'test.module2' ), 'error', 'Expected "error" state for test.module2' );
- assert.strictEqual( mw.loader.getState( 'test.module3' ), 'error', 'Expected "error" state for test.module3' );
-} );
-
-QUnit.test( 'mw.loader out-of-order implementation', 9, function ( assert ) {
- mw.loader.register( [
- ['test.module4', '0'],
- ['test.module5', '0', ['test.module4']],
- ['test.module6', '0', ['test.module5']]
- ] );
- mw.loader.implement( 'test.module4', function () {}, {}, {} );
- assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
- assert.strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'Expected "registered" state for test.module5' );
- assert.strictEqual( mw.loader.getState( 'test.module6' ), 'registered', 'Expected "registered" state for test.module6' );
- mw.loader.implement( 'test.module6', function () {}, {}, {} );
- assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
- assert.strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'Expected "registered" state for test.module5' );
- assert.strictEqual( mw.loader.getState( 'test.module6' ), 'loaded', 'Expected "loaded" state for test.module6' );
- mw.loader.implement( 'test.module5', function() {}, {}, {} );
- assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
- assert.strictEqual( mw.loader.getState( 'test.module5' ), 'ready', 'Expected "ready" state for test.module5' );
- assert.strictEqual( mw.loader.getState( 'test.module6' ), 'ready', 'Expected "ready" state for test.module6' );
-} );
-
-QUnit.test( 'mw.loader missing dependency', 13, function ( assert ) {
- mw.loader.register( [
- ['test.module7', '0'],
- ['test.module8', '0', ['test.module7']],
- ['test.module9', '0', ['test.module8']]
- ] );
- mw.loader.implement( 'test.module8', function () {}, {}, {} );
- assert.strictEqual( mw.loader.getState( 'test.module7' ), 'registered', 'Expected "registered" state for test.module7' );
- assert.strictEqual( mw.loader.getState( 'test.module8' ), 'loaded', 'Expected "loaded" state for test.module8' );
- assert.strictEqual( mw.loader.getState( 'test.module9' ), 'registered', 'Expected "registered" state for test.module9' );
- mw.loader.state( 'test.module7', 'missing' );
- assert.strictEqual( mw.loader.getState( 'test.module7' ), 'missing', 'Expected "missing" state for test.module7' );
- assert.strictEqual( mw.loader.getState( 'test.module8' ), 'error', 'Expected "error" state for test.module8' );
- assert.strictEqual( mw.loader.getState( 'test.module9' ), 'error', 'Expected "error" state for test.module9' );
- mw.loader.implement( 'test.module9', function () {}, {}, {} );
- assert.strictEqual( mw.loader.getState( 'test.module7' ), 'missing', 'Expected "missing" state for test.module7' );
- assert.strictEqual( mw.loader.getState( 'test.module8' ), 'error', 'Expected "error" state for test.module8' );
- assert.strictEqual( mw.loader.getState( 'test.module9' ), 'error', 'Expected "error" state for test.module9' );
- mw.loader.using(
- ['test.module7'],
- function () {
- assert.ok( false, "Success fired despite missing dependency" );
- assert.ok( true , "QUnit expected() count dummy" );
- },
- function ( e, dependencies ) {
- assert.strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
- assert.deepEqual( dependencies, ['test.module7'], 'Error callback called with module test.module7' );
- }
- );
- mw.loader.using(
- ['test.module9'],
- function () {
- assert.ok( false, "Success fired despite missing dependency" );
- assert.ok( true , "QUnit expected() count dummy" );
- },
- function ( e, dependencies ) {
- assert.strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
- dependencies.sort();
- assert.deepEqual(
- dependencies,
- ['test.module7', 'test.module8', 'test.module9'],
- 'Error callback called with all three modules as dependencies'
- );
- }
- );
-} );
-
-QUnit.asyncTest( 'mw.loader dependency handling', 5, function ( assert ) {
- mw.loader.addSource(
- 'testloader',
- {
- loadScript: QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/load.mock.php' )
- }
- );
-
- mw.loader.register( [
- // [module, version, dependencies, group, source]
- ['testMissing', '1', [], null, 'testloader'],
- ['testUsesMissing', '1', ['testMissing'], null, 'testloader'],
- ['testUsesNestedMissing', '1', ['testUsesMissing'], null, 'testloader']
- ] );
-
- function verifyModuleStates() {
- assert.equal( mw.loader.getState( 'testMissing' ), 'missing', 'Module not known to server must have state "missing"' );
- assert.equal( mw.loader.getState( 'testUsesMissing' ), 'error', 'Module with missing dependency must have state "error"' );
- assert.equal( mw.loader.getState( 'testUsesNestedMissing' ), 'error', 'Module with indirect missing dependency must have state "error"' );
- }
-
- mw.loader.using( ['testUsesNestedMissing'],
- function () {
- assert.ok( false, 'Error handler should be invoked.' );
- assert.ok( true ); // Dummy to reach QUnit expect()
-
- verifyModuleStates();
-
- QUnit.start();
- },
- function ( e, badmodules ) {
- assert.ok( true, 'Error handler should be invoked.' );
- // As soon as server spits out state('testMissing', 'missing');
- // it will bubble up and trigger the error callback.
- // Therefor the badmodules array is not testUsesMissing or testUsesNestedMissing.
- assert.deepEqual( badmodules, ['testMissing'], 'Bad modules as expected.' );
-
- verifyModuleStates();
-
- QUnit.start();
- }
- );
-} );
-
-QUnit.asyncTest( 'mw.loader( "//protocol-relative" ) (bug 30825)', 2, function ( assert ) {
- // This bug was actually already fixed in 1.18 and later when discovered in 1.17.
- // Test is for regressions!
-
- // Forge an URL to the test callback script
- var target = QUnit.fixurl(
- mw.config.get( 'wgServer' ) + mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/qunitOkCall.js'
- );
-
- // Confirm that mw.loader.load() works with protocol-relative URLs
- target = target.replace( /https?:/, '' );
-
- assert.equal( target.substr( 0, 2 ), '//',
- 'URL must be relative to test relative URLs!'
- );
-
- // Async!
- // The target calls QUnit.start
- mw.loader.load( target );
-});
-
-QUnit.test( 'mw.html', 13, function ( assert ) {
- assert.throws( function () {
- mw.html.escape();
- }, TypeError, 'html.escape throws a TypeError if argument given is not a string' );
-
- assert.equal( mw.html.escape( '<mw awesome="awesome" value=\'test\' />' ),
- '&lt;mw awesome=&quot;awesome&quot; value=&#039;test&#039; /&gt;', 'escape() escapes special characters to html entities' );
-
- assert.equal( mw.html.element(),
- '<undefined/>', 'element() always returns a valid html string (even without arguments)' );
-
- assert.equal( mw.html.element( 'div' ), '<div/>', 'element() Plain DIV (simple)' );
-
- assert.equal( mw.html.element( 'div', {}, '' ), '<div></div>', 'element() Basic DIV (simple)' );
-
- assert.equal(
- mw.html.element(
- 'div', {
- id: 'foobar'
- }
- ),
- '<div id="foobar"/>',
- 'html.element DIV (attribs)' );
-
- assert.equal( mw.html.element( 'p', null, 12 ), '<p>12</p>', 'Numbers are valid content and should be casted to a string' );
-
- assert.equal( mw.html.element( 'p', { title: 12 }, '' ), '<p title="12"></p>', 'Numbers are valid attribute values' );
-
- // Example from https://www.mediawiki.org/wiki/ResourceLoader/Default_modules#mediaWiki.html
- assert.equal(
- mw.html.element(
- 'div',
- {},
- new mw.html.Raw(
- mw.html.element( 'img', { src: '<' } )
- )
- ),
- '<div><img src="&lt;"/></div>',
- 'Raw inclusion of another element'
- );
-
- assert.equal(
- mw.html.element(
- 'option', {
- selected: true
- }, 'Foo'
- ),
- '<option selected="selected">Foo</option>',
- 'Attributes may have boolean values. True copies the attribute name to the value.'
- );
-
- assert.equal(
- mw.html.element(
- 'option', {
- value: 'foo',
- selected: false
- }, 'Foo'
- ),
- '<option value="foo">Foo</option>',
- 'Attributes may have boolean values. False keeps the attribute from output.'
- );
-
- assert.equal( mw.html.element( 'div',
- null, 'a' ),
- '<div>a</div>',
- 'html.element DIV (content)' );
-
- assert.equal( mw.html.element( 'a',
- { href: 'http://mediawiki.org/w/index.php?title=RL&action=history' }, 'a' ),
- '<a href="http://mediawiki.org/w/index.php?title=RL&amp;action=history">a</a>',
- 'html.element DIV (attribs + content)' );
-
-});
-
-}( mediaWiki ) );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
deleted file mode 100644
index 16c97dff..00000000
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
+++ /dev/null
@@ -1,56 +0,0 @@
-( function ( mw ) {
-
-QUnit.module( 'mediawiki.user', QUnit.newMwEnvironment() );
-
-QUnit.test( 'options', 1, function ( assert ) {
- assert.ok( mw.user.options instanceof mw.Map, 'options instance of mw.Map' );
-});
-
-QUnit.test( 'user status', 9, function ( assert ) {
- /**
- * Tests can be run under three different conditions:
- * 1) From tests/qunit/index.html, user will be anonymous.
- * 2) Logged in on [[Special:JavaScriptTest/qunit]]
- * 3) Anonymously at the same special page.
- */
-
- // Forge an anonymous user:
- mw.config.set( 'wgUserName', null );
-
- assert.strictEqual( mw.user.getName(), null, 'user.getName() returns null when anonymous' );
- assert.strictEqual( mw.user.name(), null, 'user.name() compatibility' );
- assert.assertTrue( mw.user.isAnon(), 'user.isAnon() returns true when anonymous' );
- assert.assertTrue( mw.user.anonymous(), 'user.anonymous() compatibility' );
-
- // Not part of startUp module
- mw.config.set( 'wgUserName', 'John' );
-
- assert.equal( mw.user.getName(), 'John', 'user.getName() returns username when logged-in' );
- assert.equal( mw.user.name(), 'John', 'user.name() compatibility' );
- assert.assertFalse( mw.user.isAnon(), 'user.isAnon() returns false when logged-in' );
- assert.assertFalse( mw.user.anonymous(), 'user.anonymous() compatibility' );
-
- assert.equal( mw.user.id(), 'John', 'user.id Returns username when logged-in' );
-});
-
-QUnit.asyncTest( 'getGroups', 3, function ( assert ) {
- mw.user.getGroups( function ( groups ) {
- // First group should always be '*'
- assert.equal( $.type( groups ), 'array', 'Callback gets an array' );
- assert.notStrictEqual( $.inArray( '*', groups ), -1, '"*"" is in the list' );
- // Sort needed because of different methods if creating the arrays,
- // only the content matters.
- assert.deepEqual( groups.sort(), mw.config.get( 'wgUserGroups' ).sort(), 'Array contains all groups, just like wgUserGroups' );
- QUnit.start();
- });
-});
-
-QUnit.asyncTest( 'getRights', 1, function ( assert ) {
- mw.user.getRights( function ( rights ) {
- // First group should always be '*'
- assert.equal( $.type( rights ), 'array', 'Callback gets an array' );
- QUnit.start();
- });
-});
-
-}( mediaWiki ) );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
deleted file mode 100644
index ababa8d9..00000000
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
+++ /dev/null
@@ -1,288 +0,0 @@
-QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment() );
-
-QUnit.test( 'rawurlencode', 1, function ( assert ) {
- assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
-});
-
-QUnit.test( 'wikiUrlencode', 1, function ( assert ) {
- assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
-});
-
-QUnit.test( 'wikiGetlink', 3, function ( assert ) {
- // Not part of startUp module
- mw.config.set( 'wgArticlePath', '/wiki/$1' );
- mw.config.set( 'wgPageName', 'Foobar' );
-
- var hrefA = mw.util.wikiGetlink( 'Sandbox' );
- assert.equal( hrefA, '/wiki/Sandbox', 'Simple title; Get link for "Sandbox"' );
-
- var hrefB = mw.util.wikiGetlink( 'Foo:Sandbox ? 5+5=10 ! (test)/subpage' );
- assert.equal( hrefB, '/wiki/Foo:Sandbox_%3F_5%2B5%3D10_%21_%28test%29/subpage',
- 'Advanced title; Get link for "Foo:Sandbox ? 5+5=10 ! (test)/subpage"' );
-
- var hrefC = mw.util.wikiGetlink();
- assert.equal( hrefC, '/wiki/Foobar', 'Default title; Get link for current page ("Foobar")' );
-});
-
-QUnit.test( 'wikiScript', 4, function ( assert ) {
- mw.config.set({
- 'wgScript': '/w/i.php', // customized wgScript for bug 39103
- 'wgLoadScript': '/w/l.php', // customized wgLoadScript for bug 39103
- 'wgScriptPath': '/w',
- 'wgScriptExtension': '.php'
- });
-
- assert.equal( mw.util.wikiScript(), mw.config.get( 'wgScript' ), 'wikiScript() returns wgScript' );
- assert.equal( mw.util.wikiScript( 'index' ), mw.config.get( 'wgScript' ), "wikiScript( 'index' ) returns wgScript" );
- assert.equal( mw.util.wikiScript( 'load' ), mw.config.get( 'wgLoadScript' ), "wikiScript( 'load' ) returns wgLoadScript" );
- assert.equal( mw.util.wikiScript( 'api' ), '/w/api.php', 'API path' );
-});
-
-QUnit.test( 'addCSS', 3, function ( assert ) {
- var $testEl = $( '<div>' ).attr( 'id', 'mw-addcsstest' ).appendTo( '#qunit-fixture' );
-
- var style = mw.util.addCSS( '#mw-addcsstest { visibility: hidden; }' );
- assert.equal( typeof style, 'object', 'addCSS returned an object' );
- assert.strictEqual( style.disabled, false, 'property "disabled" is available and set to false' );
-
- assert.equal( $testEl.css( 'visibility' ), 'hidden', 'Added style properties are in effect' );
-
- // Clean up
- $( style.ownerNode ).remove();
-});
-
-QUnit.asyncTest( 'toggleToc', 4, function ( assert ) {
- assert.strictEqual( mw.util.toggleToc(), null, 'Return null if there is no table of contents on the page.' );
-
- var tocHtml =
- '<table id="toc" class="toc"><tr><td>' +
- '<div id="toctitle">' +
- '<h2>Contents</h2>' +
- '<span class="toctoggle">&nbsp;[<a href="#" class="internal" id="togglelink">Hide</a>&nbsp;]</span>' +
- '</div>' +
- '<ul><li></li></ul>' +
- '</td></tr></table>',
- $toc = $(tocHtml).appendTo( '#qunit-fixture' ),
- $toggleLink = $( '#togglelink' );
-
- assert.strictEqual( $toggleLink.length, 1, 'Toggle link is appended to the page.' );
-
- var actionC = function() {
- QUnit.start();
- };
- var actionB = function() {
- assert.strictEqual( mw.util.toggleToc( $toggleLink, actionC ), true, 'Return boolean true if the TOC is now visible.' );
- };
- var actionA = function() {
- assert.strictEqual( mw.util.toggleToc( $toggleLink, actionB ), false, 'Return boolean false if the TOC is now hidden.' );
- };
-
- actionA();
-});
-
-QUnit.test( 'getParamValue', 5, function ( assert ) {
- var url1 = 'http://example.org/?foo=wrong&foo=right#&foo=bad';
-
- assert.equal( mw.util.getParamValue( 'foo', url1 ), 'right', 'Use latest one, ignore hash' );
- assert.strictEqual( mw.util.getParamValue( 'bar', url1 ), null, 'Return null when not found' );
-
- var url2 = 'http://example.org/#&foo=bad';
- assert.strictEqual( mw.util.getParamValue( 'foo', url2 ), null, 'Ignore hash if param is not in querystring but in hash (bug 27427)' );
-
- var url3 = 'example.org?' + $.param({ 'TEST': 'a b+c' });
- assert.strictEqual( mw.util.getParamValue( 'TEST', url3 ), 'a b+c', 'Bug 30441: getParamValue must understand "+" encoding of space' );
-
- var url4 = 'example.org?' + $.param({ 'TEST': 'a b+c d' }); // check for sloppy code from r95332 :)
- assert.strictEqual( mw.util.getParamValue( 'TEST', url4 ), 'a b+c d', 'Bug 30441: getParamValue must understand "+" encoding of space (multiple spaces)' );
-});
-
-QUnit.test( 'tooltipAccessKey', 3, function ( assert ) {
- assert.equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'mw.util.tooltipAccessKeyPrefix must be a string' );
- assert.ok( mw.util.tooltipAccessKeyRegexp instanceof RegExp, 'mw.util.tooltipAccessKeyRegexp instance of RegExp' );
- assert.ok( mw.util.updateTooltipAccessKeys, 'mw.util.updateTooltipAccessKeys' );
-});
-
-QUnit.test( '$content', 2, function ( assert ) {
- assert.ok( mw.util.$content instanceof jQuery, 'mw.util.$content instance of jQuery' );
- assert.strictEqual( mw.util.$content.length, 1, 'mw.util.$content must have length of 1' );
-});
-
-
-/**
- * Portlet names are prefixed with 'p-test' to avoid conflict with core
- * when running the test suite under a wiki page.
- * Previously, test elements where invisible to the selector since only
- * one element can have a given id.
- */
-QUnit.test( 'addPortletLink', 8, function ( assert ) {
- var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo;
- pTestTb = '\
- <div class="portlet" id="p-test-tb">\
- <h5>Toolbox</h5>\
- <ul class="body"></ul>\
- </div>';
- pCustom = '\
- <div class="portlet" id="p-test-custom">\
- <h5>Views</h5>\
- <ul class="body">\
- <li id="c-foo"><a href="#">Foo</a></li>\
- <li id="c-barmenu">\
- <ul>\
- <li id="c-bar-baz"><a href="#">Baz</a></a>\
- </ul>\
- </li>\
- </ul>\
- </div>';
- vectorTabs = '\
- <div id="p-test-views" class="vectorTabs">\
- <h5>Views</h5>\
- <ul></ul>\
- </div>';
-
- $( '#qunit-fixture' ).append( pTestTb, pCustom, vectorTabs );
-
- tbRL = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
- 'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l' );
-
- 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 );
- $tbMW = $( tbMW );
-
-
- assert.equal( $tbMW.attr( 'id' ), 't-mworg', 'Link has correct ID set' );
- assert.equal( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
- assert.equal( $tbMW.next().attr( 'id' ), 't-rl', 'Link is in the correct position (by passing nextnode)' );
-
- cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux' );
- $cuQuux = $(cuQuux);
-
- assert.equal(
- $( '#p-test-custom #c-barmenu ul li' ).length,
- 1,
- 'addPortletLink did not add the item to all <ul> elements in the portlet (bug 35082)'
- );
-
- tbRLDM = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
- 'Default modules', 't-rldm', 'List of all default modules ', 'd', '#t-rl' );
-
- assert.equal( $( tbRLDM ).next().attr( 'id' ), 't-rl', 'Link is in the correct position (by passing CSS selector)' );
-
- caFoo = mw.util.addPortletLink( 'p-test-views', '#', 'Foo' );
-
- assert.strictEqual( $tbMW.find( 'span').length, 0, 'No <span> element should be added for porlets without vectorTabs class.' );
- assert.strictEqual( $( caFoo ).find( 'span').length, 1, 'A <span> element should be added for porlets with vectorTabs class.' );
-});
-
-QUnit.test( 'jsMessage', 1, function ( assert ) {
- var a = mw.util.jsMessage( "MediaWiki is <b>Awesome</b>." );
- assert.ok( a, 'Basic checking of return value' );
-
- // Clean up
- $( '#mw-js-message' ).remove();
-});
-
-QUnit.test( 'validateEmail', 6, function ( assert ) {
- assert.strictEqual( mw.util.validateEmail( "" ), null, 'Should return null for empty string ' );
- assert.strictEqual( mw.util.validateEmail( "user@localhost" ), true, 'Return true for a valid e-mail address' );
-
- // testEmailWithCommasAreInvalids
- assert.strictEqual( mw.util.validateEmail( "user,foo@example.org" ), false, 'Emails with commas are invalid' );
- assert.strictEqual( mw.util.validateEmail( "userfoo@ex,ample.org" ), false, 'Emails with commas are invalid' );
-
- // testEmailWithHyphens
- assert.strictEqual( mw.util.validateEmail( "user-foo@example.org" ), true, 'Emails may contain a hyphen' );
- assert.strictEqual( mw.util.validateEmail( "userfoo@ex-ample.org" ), true, 'Emails may contain a hyphen' );
-});
-
-QUnit.test( 'isIPv6Address', 40, function ( assert ) {
- // Shortcuts
- function assertFalseIPv6( addy, summary ) {
- return assert.strictEqual( mw.util.isIPv6Address( addy ), false, summary );
- }
- function assertTrueIPv6( addy, summary ) {
- return assert.strictEqual( mw.util.isIPv6Address( addy ), true, summary );
- }
-
- // Based on IPTest.php > testisIPv6
- assertFalseIPv6( ':fc:100::', 'IPv6 starting with lone ":"' );
- assertFalseIPv6( 'fc:100:::', 'IPv6 ending with a ":::"' );
- assertFalseIPv6( 'fc:300', 'IPv6 with only 2 words' );
- assertFalseIPv6( 'fc:100:300', 'IPv6 with only 3 words' );
-
- $.each(
- ['fc:100::',
- 'fc:100:a::',
- 'fc:100:a:d::',
- 'fc:100:a:d:1::',
- 'fc:100:a:d:1:e::',
- 'fc:100:a:d:1:e:ac::'], function ( i, addy ){
- assertTrueIPv6( addy, addy + ' is a valid IP' );
- });
-
- assertFalseIPv6( 'fc:100:a:d:1:e:ac:0::', 'IPv6 with 8 words ending with "::"' );
- assertFalseIPv6( 'fc:100:a:d:1:e:ac:0:1::', 'IPv6 with 9 words ending with "::"' );
-
- assertFalseIPv6( ':::' );
- assertFalseIPv6( '::0:', 'IPv6 ending in a lone ":"' );
-
- assertTrueIPv6( '::', 'IPv6 zero address' );
- $.each(
- ['::0',
- '::fc',
- '::fc:100',
- '::fc:100:a',
- '::fc:100:a:d',
- '::fc:100:a:d:1',
- '::fc:100:a:d:1:e',
- '::fc:100:a:d:1:e:ac',
-
- 'fc:100:a:d:1:e:ac:0'], function ( i, addy ){
- assertTrueIPv6( addy, addy + ' is a valid IP' );
- });
-
- assertFalseIPv6( '::fc:100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' );
- assertFalseIPv6( '::fc:100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' );
-
- assertFalseIPv6( ':fc::100', 'IPv6 starting with lone ":"' );
- assertFalseIPv6( 'fc::100:', 'IPv6 ending with lone ":"' );
- assertFalseIPv6( 'fc:::100', 'IPv6 with ":::" in the middle' );
-
- assertTrueIPv6( 'fc::100', 'IPv6 with "::" and 2 words' );
- assertTrueIPv6( 'fc::100:a', 'IPv6 with "::" and 3 words' );
- assertTrueIPv6( 'fc::100:a:d', 'IPv6 with "::" and 4 words' );
- assertTrueIPv6( 'fc::100:a:d:1', 'IPv6 with "::" and 5 words' );
- assertTrueIPv6( 'fc::100:a:d:1:e', 'IPv6 with "::" and 6 words' );
- assertTrueIPv6( 'fc::100:a:d:1:e:ac', 'IPv6 with "::" and 7 words' );
- assertTrueIPv6( '2001::df', 'IPv6 with "::" and 2 words' );
- assertTrueIPv6( '2001:5c0:1400:a::df', 'IPv6 with "::" and 5 words' );
- assertTrueIPv6( '2001:5c0:1400:a::df:2', 'IPv6 with "::" and 6 words' );
-
- assertFalseIPv6( 'fc::100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' );
- assertFalseIPv6( 'fc::100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' );
-});
-
-QUnit.test( 'isIPv4Address', 11, function ( assert ) {
- // Shortcuts
- function assertFalseIPv4( addy, summary ) {
- assert.strictEqual( mw.util.isIPv4Address( addy ), false, summary );
- }
- function assertTrueIPv4( addy, summary ) {
- assert.strictEqual( mw.util.isIPv4Address( addy ), true, summary );
- }
-
- // Based on IPTest.php > testisIPv4
- assertFalseIPv4( false, 'Boolean false is not an IP' );
- assertFalseIPv4( true, 'Boolean true is not an IP' );
- assertFalseIPv4( '', 'Empty string is not an IP' );
- assertFalseIPv4( 'abc', '"abc" is not an IP' );
- assertFalseIPv4( ':', 'Colon is not an IP' );
- assertFalseIPv4( '124.24.52', 'IPv4 not enough quads' );
- assertFalseIPv4( '24.324.52.13', 'IPv4 out of range' );
- assertFalseIPv4( '.24.52.13', 'IPv4 starts with period' );
-
- assertTrueIPv4( '124.24.52.13', '124.24.52.134 is a valid IP' );
- assertTrueIPv4( '1.24.52.13', '1.24.52.13 is a valid IP' );
- assertFalseIPv4( '74.24.52.13/20', 'IPv4 ranges are not recogzized as valid IPs' );
-});
diff --git a/tests/selenium/Selenium.php b/tests/selenium/Selenium.php
deleted file mode 100644
index ecf7f9ec..00000000
--- a/tests/selenium/Selenium.php
+++ /dev/null
@@ -1,190 +0,0 @@
-<?php
-/**
- * Selenium connector
- * This is implemented as a singleton.
- */
-
-require( 'Testing/Selenium.php' );
-
-class Selenium {
- protected static $_instance = null;
-
- public $isStarted = false;
- public $tester;
-
- protected $port;
- protected $host;
- protected $browser;
- protected $browsers;
- protected $logger;
- protected $user;
- protected $pass;
- protected $timeout = 30000;
- protected $verbose;
- protected $junitlogfile; //processed by phpUnderControl
- protected $runagainstgrid = false;
-
- /**
- * @todo this shouldn't have to be static
- */
- static protected $url;
-
- /**
- * Override parent
- */
- public function __construct() {
- /**
- * @todo this is an ugly hack to make information available to
- * other tests. It should be fixed.
- */
- if ( null === self::$_instance ) {
- self::$_instance = $this;
- } else {
- throw new MWException( "Already have one Selenium instance." );
- }
- }
-
- public function start() {
- $this->tester = new Testing_Selenium( $this->browser, self::$url, $this->host,
- $this->port, $this->timeout );
- if ( method_exists( $this->tester, "setVerbose" ) ) $this->tester->setVerbose( $this->verbose );
-
- $this->tester->start();
- $this->isStarted = true;
- }
-
- public function stop() {
- $this->tester->stop();
- $this->tester = null;
- $this->isStarted = false;
- }
-
- public function login() {
- if ( strlen( $this->user ) == 0 ) {
- return;
- }
- $this->open( self::$url . '/index.php?title=Special:Userlogin' );
- $this->type( 'wpName1', $this->user );
- $this->type( 'wpPassword1', $this->pass );
- $this->click( "//input[@id='wpLoginAttempt']" );
- $this->waitForPageToLoad( 10000 );
-
- // after login we redirect to the main page. So check whether the "Prefernces" top menu item exists
- $value = $this->isElementPresent( "//li[@id='pt-preferences']" );
-
- if ( $value != true ) {
- throw new Testing_Selenium_Exception( "Login Failed" );
- }
-
- }
-
- public static function getInstance() {
- if ( null === self::$_instance ) {
- throw new MWException( "No instance set yet" );
- }
-
- return self::$_instance;
- }
-
- public function loadPage( $title, $action ) {
- $this->open( self::$url . '/index.php?title=' . $title . '&action=' . $action );
- }
-
- public function setLogger( $logger ) {
- $this->logger = $logger;
- }
-
- public function getLogger( ) {
- return $this->logger;
- }
-
- public function log( $message ) {
- $this->logger->write( $message );
- }
-
- public function setUrl( $url ) {
- self::$url = $url;
- }
-
- static public function getUrl() {
- return self::$url;
- }
-
- public function setPort( $port ) {
- $this->port = $port;
- }
-
- public function getPort() {
- return $this->port;
- }
-
- public function setUser( $user ) {
- $this->user = $user;
- }
-
- // Function to get username
- public function getUser() {
- return $this->user;
- }
-
-
- public function setPass( $pass ) {
- $this->pass = $pass;
- }
-
- //add function to get password
- public function getPass( ) {
- return $this->pass;
- }
-
-
- public function setHost( $host ) {
- $this->host = $host;
- }
-
- public function setVerbose( $verbose ) {
- $this->verbose = $verbose;
- }
-
- public function setAvailableBrowsers( $availableBrowsers ) {
- $this->browsers = $availableBrowsers;
- }
-
- public function setJUnitLogfile( $junitlogfile ) {
- $this->junitlogfile = $junitlogfile;
- }
-
- public function getJUnitLogfile( ) {
- return $this->junitlogfile;
- }
-
- public function setRunAgainstGrid( $runagainstgrid ) {
- $this->runagainstgrid = $runagainstgrid;
- }
-
- public function setBrowser( $b ) {
- if ($this->runagainstgrid) {
- $this->browser = $b;
- return true;
- }
- if ( !isset( $this->browsers[$b] ) ) {
- throw new MWException( "Invalid Browser: $b.\n" );
- }
-
- $this->browser = $this->browsers[$b];
- }
-
- public function getAvailableBrowsers() {
- return $this->browsers;
- }
-
- public function __call( $name, $args ) {
- $t = call_user_func_array( array( $this->tester, $name ), $args );
- return $t;
- }
-
- // Prevent external cloning
- protected function __clone() { }
- // Prevent external construction
- // protected function __construct() {}
-}
diff --git a/tests/selenium/SeleniumConfig.php b/tests/selenium/SeleniumConfig.php
deleted file mode 100644
index 04cf8d88..00000000
--- a/tests/selenium/SeleniumConfig.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-if ( !defined( 'SELENIUMTEST' ) ) {
- die( 1 );
-}
-
-class SeleniumConfig {
-
- /**
- * Retreives the Selenium configuration values from an ini file.
- * See sample config file in selenium_settings.ini.sample
- *
- */
-
- public static function getSeleniumSettings ( &$seleniumSettings,
- &$seleniumBrowsers,
- &$seleniumTestSuites,
- $seleniumConfigFile = null ) {
- if ( strlen( $seleniumConfigFile ) == 0 ) {
- global $wgSeleniumConfigFile;
- if ( isset( $wgSeleniumConfigFile ) ) $seleniumConfigFile = $wgSeleniumConfigFile ;
- }
-
- if ( strlen( $seleniumConfigFile ) == 0 || !file_exists( $seleniumConfigFile ) ) {
- throw new MWException( "Unable to read local Selenium Settings from " . $seleniumConfigFile . "\n" );
- }
-
- $configArray = parse_ini_file( $seleniumConfigFile, true );
- if ( $configArray === false ) {
- throw new MWException( "Error parsing " . $seleniumConfigFile . "\n" );
- }
-
- if ( array_key_exists( 'SeleniumSettings', $configArray) ) {
- wfSuppressWarnings();
- //we may need to change how this is set. But for now leave it in the ini file
- $seleniumBrowsers = $configArray['SeleniumSettings']['browsers'];
-
- $seleniumSettings['host'] = $configArray['SeleniumSettings']['host'];
- $seleniumSettings['port'] = $configArray['SeleniumSettings']['port'];
- $seleniumSettings['wikiUrl'] = $configArray['SeleniumSettings']['wikiUrl'];
- $seleniumSettings['username'] = $configArray['SeleniumSettings']['username'];
- $seleniumSettings['userPassword'] = $configArray['SeleniumSettings']['userPassword'];
- $seleniumSettings['testBrowser'] = $configArray['SeleniumSettings']['testBrowser'];
- $seleniumSettings['startserver'] = $configArray['SeleniumSettings']['startserver'];
- $seleniumSettings['stopserver'] = $configArray['SeleniumSettings']['stopserver'];
- $seleniumSettings['seleniumserverexecpath'] = $configArray['SeleniumSettings']['seleniumserverexecpath'];
- $seleniumSettings['jUnitLogFile'] = $configArray['SeleniumSettings']['jUnitLogFile'];
- $seleniumSettings['runAgainstGrid'] = $configArray['SeleniumSettings']['runAgainstGrid'];
-
- wfRestoreWarnings();
- }
- if ( array_key_exists( 'SeleniumTests', $configArray) ) {
- wfSuppressWarnings();
- $seleniumTestSuites = $configArray['SeleniumTests']['testSuite'];
- wfRestoreWarnings();
- }
- return true;
- }
-
- private static function parse_ini_line( $iniLine ) {
- static $specialValues = array( 'false' => false, 'true' => true, 'null' => null );
- list( $key, $value ) = explode( '=', $iniLine, 2 );
- $key = trim( $key );
- $value = trim( $value );
-
- if ( isset( $specialValues[$value] ) ) {
- $value = $specialValues[$value];
- } else {
- $value = trim( $value, '"' );
- }
-
- /* Support one-level arrays */
- if ( preg_match( '/^([A-Za-z]+)\[([A-Za-z]+)\]/', $key, $m ) ) {
- $key = $m[1];
- $value = array( $m[2] => $value );
- }
-
- return array( $key => $value );
- }
-}
diff --git a/tests/selenium/SeleniumLoader.php b/tests/selenium/SeleniumLoader.php
deleted file mode 100644
index 8d5e7713..00000000
--- a/tests/selenium/SeleniumLoader.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-class SeleniumLoader {
- static function load() {
- require_once( 'Testing/Selenium.php' );
- require_once( 'PHPUnit/Framework.php' );
- require_once( 'PHPUnit/Extensions/SeleniumTestCase.php' );
- }
-}
diff --git a/tests/selenium/SeleniumServerManager.php b/tests/selenium/SeleniumServerManager.php
deleted file mode 100644
index 9e2d4aa8..00000000
--- a/tests/selenium/SeleniumServerManager.php
+++ /dev/null
@@ -1,239 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
- * http://citizendium.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- */
-
-class SeleniumServerManager {
- private $SeleniumStartServer = false;
- private $OS = '';
- private $SeleniumServerPid = 'NaN';
- private $SeleniumServerPort = 4444;
- private $SeleniumServerStartTimeout = 10; // 10 secs.
- private $SeleniumServerExecPath;
-
- public function __construct( $startServer,
- $serverPort,
- $serverExecPath ) {
- $this->OS = (string) PHP_OS;
- if ( isset( $startServer ) )
- $this->SeleniumStartServer = $startServer;
- if ( isset( $serverPort ) )
- $this->SeleniumServerPort = $serverPort;
- if ( isset( $serverExecPath ) )
- $this->SeleniumServerExecPath = $serverExecPath;
- return;
- }
-
- // Getters for certain private attributes. No setters, since they
- // should not change after the manager object is created.
-
- public function getSeleniumStartServer() {
- return $this->SeleniumStartServer;
- }
-
- public function getSeleniumServerPort() {
- return $this->SeleniumServerPort;
- }
-
- public function getSeleniumServerPid() {
- return $this->SeleniumServerPid;
- }
-
- // Changing value of SeleniumStartServer allows starting server after
- // creation of the class instance. Only allow setting SeleniumStartServer
- // to true, since after server is started, it is shut down by stop().
-
- public function setSeleniumStartServer( $startServer ) {
- if ( $startServer == true ) $this->SeleniumStartServer = true;
- }
-
- // return values are: 1) started - server started, 2) failed -
- // server not started, 3) running - instructed to start server, but
- // server already running
-
- public function start() {
-
- if ( !$this->SeleniumStartServer ) return 'failed';
-
- // commented out cases are untested
-
- switch ( $this->OS ) {
- case "Linux":
-# case' CYGWIN_NT-5.1':
- case 'Darwin':
-# case 'FreeBSD':
-# case 'HP-UX':
-# case 'IRIX64':
-# case 'NetBSD':
-# case 'OpenBSD':
-# case 'SunOS':
-# case 'Unix':
- // *nix based OS
- return $this->startServerOnUnix();
- break;
- case "Windows":
- case "WIN32":
- case "WINNT":
- // Windows
- return $this->startServerOnWindows();
- break;
- default:
- // An untested OS
- return 'failed';
- break;
- }
- }
-
- public function stop() {
-
- // commented out cases are untested
-
- switch ( $this->OS ) {
- case "Linux":
-# case' CYGWIN_NT-5.1':
- case 'Darwin':
-# case 'FreeBSD':
-# case 'HP-UX':
-# case 'IRIX64':
-# case 'NetBSD':
-# case 'OpenBSD':
-# case 'SunOS':
-# case 'Unix':
- // *nix based OS
- return $this->stopServerOnUnix();
- break;
- case "Windows":
- case "WIN32":
- case "WINNT":
- // Windows
- return $this->stopServerOnWindows();
- break;
- default:
- // An untested OS
- return 'failed';
- break;
- }
- }
-
- private function startServerOnUnix() {
-
- $output = array();
- $user = $_ENV['USER'];
- // @todo FIXME: This should be a little more generalized :)
- if (PHP_OS == 'Darwin') {
- // Mac OS X's ps barfs on the 'w' param, but doesn't need it.
- $ps = "ps -U %s";
- } else {
- // Good on Linux
- $ps = "ps -U %s w";
- }
- $psCommand = sprintf($ps, escapeshellarg($user));
- exec($psCommand . " | grep -i selenium-server", $output);
-
- // Start server. If there is already a server running,
- // return running.
-
- if ( isset( $this->SeleniumServerExecPath ) ) {
- $found = 0;
- foreach ( $output as $string ) {
- $found += preg_match(
- '~^(.*)java(.+)-jar(.+)selenium-server~',
- $string );
- }
- if ( $found == 0 ) {
-
- // Didn't find the selenium server. Start it up.
- // First set up comamand line suffix.
- // NB: $! is pid of last job run in background
- // The echo guarentees it is put into $op when
- // the exec command is run.
-
- $commandSuffix = ' > /dev/null 2>&1'. ' & echo $!';
- $portText = ' -port ' . $this->SeleniumServerPort;
- $command = "java -jar " .
- escapeshellarg($this->SeleniumServerExecPath) .
- $portText . $commandSuffix;
- exec($command ,$op);
- $pid = (int)$op[0];
- if ( $pid != "" )
- $this->SeleniumServerPid = $pid;
- else {
- $this->SeleniumServerPid = 'NaN';
- // Server start failed.
- return 'failed';
- }
- // Wait for the server to startup and listen
- // on its port. Note: this solution kinda
- // stinks, since it uses a wait loop - dnessett
-
- wfSuppressWarnings();
- for ( $cnt = 1;
- $cnt <= $this->SeleniumServerStartTimeout;
- $cnt++ ) {
- $fp = fsockopen ( 'localhost',
- $this->SeleniumServerPort,
- $errno, $errstr, 0 );
- if ( !$fp ) {
- sleep( 1 );
- continue;
- // Server start succeeded.
- } else {
- fclose ( $fp );
- return 'started';
- }
- }
- wfRestoreWarnings();
- echo ( "Starting Selenium server timed out.\n" );
- return 'failed';
- }
- // server already running.
- else return 'running';
-
- }
- // No Server execution path defined.
- return 'failed';
- }
-
- private function startServerOnWindows() {
- // Unimplemented.
- return 'failed';
- }
-
- private function stopServerOnUnix() {
-
- if ( !empty( $this->SeleniumServerPid ) &&
- $this->SeleniumServerPid != 'NaN' ) {
- exec( "kill -9 " . $this->SeleniumServerPid );
- return 'stopped';
- }
- else return 'failed';
- }
-
- private function stopServerOnWindows() {
- // Unimplemented.
- return 'failed';
-
- }
-}
diff --git a/tests/selenium/SeleniumTestCase.php b/tests/selenium/SeleniumTestCase.php
deleted file mode 100644
index 7976c16a..00000000
--- a/tests/selenium/SeleniumTestCase.php
+++ /dev/null
@@ -1,127 +0,0 @@
-<?php
-include("SeleniumTestConstants.php");
-
-class SeleniumTestCase extends PHPUnit_Framework_TestCase { // PHPUnit_Extensions_SeleniumTestCase
- protected $selenium;
-
- public function setUp() {
- set_time_limit( 60 );
- $this->selenium = Selenium::getInstance();
- }
-
- public function tearDown() {
-
- }
-
- public function __call( $method, $args ) {
- return call_user_func_array( array( $this->selenium, $method ), $args );
- }
-
- public function assertSeleniumAttributeEquals( $attribute, $value ) {
- $attr = $this->getAttribute( $attribute );
- $this->assertEquals( $attr, $value );
- }
-
- public function assertSeleniumHTMLContains( $element, $text ) {
- $innerHTML = $this->getText( $element );
- // or assertContains
- $this->assertRegExp( "/$text/", $innerHTML );
- }
-
-
- /**
- * Create a test fixture page if one does not exist
- * @param $pageName The fixture page name. If none is supplied, it uses SeleniumTestConstants::WIKI_INTERNAL_LINK
- */
- function createTestPageIfMissing( $pageName = null ) {
- if ( $pageName == null ) {
- $pageName = SeleniumTestConstants::WIKI_INTERNAL_LINK;
- }
- $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, $pageName );
- $this->click( SeleniumTestConstants::BUTTON_SEARCH );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( SeleniumTestConstants::LINK_START . $pageName );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $location = $this->getLocation() . "\n";
- if ( strpos( $location, '&redlink=1') !== false ) {
- $this->type( SeleniumTestConstants::TEXT_EDITOR, "Test fixture page. No real content here" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertTrue( $this->isTextPresent( $pageName ),
- $this->getText( SeleniumTestConstants::TEXT_PAGE_HEADING ) );
- }
- }
-
- /**
- * Create a test page using date as part of the name so that it is unique
- * @param $pagePrefix The prefix to use for the page name. The current date will be appended to this to make it unique
- * @param $watchThis Whether to add the page to my watchlist. Defaults to false.
- */
- function createNewTestPage( $pagePrefix, $watchThis = false ) {
- $pageName = $pagePrefix . date("Ymd-His");
- $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, $pageName );
- $this->click( SeleniumTestConstants::BUTTON_SEARCH );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( SeleniumTestConstants::LINK_START . $pageName );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $location = $this->getLocation() . "\n";
- $this->assertContains( '&redlink=1', $location ).
- $this->type( SeleniumTestConstants::TEXT_EDITOR, "Test fixture page. No real content here" );
- if ( $watchThis ) {
- $this->click( "wpWatchthis" );
- }
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertTrue( $this->isTextPresent( $pageName ),
- $this->getText( SeleniumTestConstants::TEXT_PAGE_HEADING ) );
- return $pageName;
- }
-
- public function getExistingPage(){
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->type("searchInput", "new" );
- $this->click("searchGoButton");
- $this->waitForPageToLoad("30000");
- }
-
- public function getNewPage($pageName){
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->type("searchInput", $pageName );
- $this->click("searchGoButton");
- $this->waitForPageToLoad("30000");
- $this->click("link=".$pageName);
- $this->waitForPageToLoad("600000");
-
-
- }
- // Loading the mediawiki editor
- public function loadWikiEditor(){
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- }
-
- // Clear the content of the mediawiki editor
- public function clearWikiEditor(){
- $this->type("wpTextbox1", "");
- }
-
- // Click on the 'Show preview' button of the mediawiki editor
- public function clickShowPreviewBtn(){
- $this->click("wpPreview");
- }
-
- // Click on the 'Save Page' button of the mediawiki editor
- public function clickSavePageBtn(){
- $this->click("wpSave");
- }
-
- // Click on the 'Edit' link
- public function clickEditLink(){
- $this->click("link=Edit");
- $this->waitForPageToLoad("30000");
- }
-
-}
diff --git a/tests/selenium/SeleniumTestConsoleLogger.php b/tests/selenium/SeleniumTestConsoleLogger.php
deleted file mode 100644
index b6f5496c..00000000
--- a/tests/selenium/SeleniumTestConsoleLogger.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-class SeleniumTestConsoleLogger {
- public function __construct() {
- // Prepare testsuite for immediate output
- @ini_set( 'zlib.output_compression', 0 );
- @ini_set( 'implicit_flush', 1 );
- for ( $i = 0; $i < ob_get_level(); $i++ ) {
- ob_end_flush();
- }
- ob_implicit_flush( 1 );
- }
-
- public function write( $message, $mode = false ) {
- $out = '';
- // if ( $mode == SeleniumTestSuite::RESULT_OK ) $out .= '<font color="green">';
- $out .= htmlentities( $message );
- // if ( $mode == SeleniumTestSuite::RESULT_OK ) $out .= '</font>';
- if ( $mode != SeleniumTestSuite::CONTINUE_LINE ) {
- $out .= "\n";
- }
-
- echo $out;
- }
-}
diff --git a/tests/selenium/SeleniumTestConstants.php b/tests/selenium/SeleniumTestConstants.php
deleted file mode 100644
index 1defb73c..00000000
--- a/tests/selenium/SeleniumTestConstants.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-class SeleniumTestConstants {
- const WIKI_TEST_WAIT_TIME = 3000; // Waiting time
-
- //commonly used links
- const LINK_MAIN_PAGE = 'link=Main page';
- const LINK_RANDOM_PAGE = 'link=Random article';
- const TEXT_PAGE_HEADING = 'firstHeading';
-
- const LINK_START = 'link=';
- const TEXT_EDITOR = 'wpTextbox1';
- const LINK_PREVIEW = 'wpPreview';
- const LINK_EDIT = 'link=Edit';
-
- const WIKI_SEARCH_PAGE = 'Hair (musical)'; // Page name to search
- const WIKI_TEXT_SEARCH = 'TV'; // Text to search
- const WIKI_INTERNAL_LINK = 'Wikieditor-Fixture-Page'; // Exisiting page name to add as an internal tag
-
- const INPUT_SEARCH_BOX = 'searchInput';
- const BUTTON_SEARCH = 'mw-searchButton';
- const BUTTON_SAVE = 'wpSave';
-}
-
diff --git a/tests/selenium/SeleniumTestHTMLLogger.php b/tests/selenium/SeleniumTestHTMLLogger.php
deleted file mode 100644
index 21332cf0..00000000
--- a/tests/selenium/SeleniumTestHTMLLogger.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-class SeleniumTestHTMLLogger {
- public function setHeaders() {
- global $wgOut;
- $wgOut->addHeadItem( 'selenium', '<style type="text/css">
- .selenium pre {
- overflow-x: auto; /* Use horizontal scroller if needed; for Firefox 2, not needed in Firefox 3 */
- white-space: pre-wrap; /* css-3 */
- white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
- white-space: -pre-wrap; /* Opera 4-6 */
- white-space: -o-pre-wrap; /* Opera 7 */
- /* width: 99%; */
- word-wrap: break-word; /* Internet Explorer 5.5+ */
- }
- .selenium-success { color: green }
- </style>' );
- }
-
- public function write( $message, $mode = false ) {
- global $wgOut;
- $out = '';
- if ( $mode == SeleniumTestSuite::RESULT_OK ) {
- $out .= '<span class="selenium-success">';
- }
- $out .= htmlspecialchars( $message );
- if ( $mode == SeleniumTestSuite::RESULT_OK ) {
- $out .= '</span>';
- }
- if ( $mode != SeleniumTestSuite::CONTINUE_LINE ) {
- $out .= '<br />';
- }
-
- $wgOut->addHTML( $out );
- }
-}
diff --git a/tests/selenium/SeleniumTestListener.php b/tests/selenium/SeleniumTestListener.php
deleted file mode 100644
index 9436f672..00000000
--- a/tests/selenium/SeleniumTestListener.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-class SeleniumTestListener implements PHPUnit_Framework_TestListener {
- private $logger;
- private $tests_ok = 0;
- private $tests_failed = 0;
-
- public function __construct( $loggerInstance ) {
- $this->logger = $loggerInstance;
- }
-
- public function addError( PHPUnit_Framework_Test $test, Exception $e, $time ) {
- $this->logger->write( 'Error: ' . $e->getMessage() );
- $this->tests_failed++;
- }
-
- public function addFailure( PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time )
- {
- $this->logger->write( 'Failed: ' . $e->getMessage() );
- $this->tests_failed++;
- }
-
- public function addIncompleteTest( PHPUnit_Framework_Test $test, Exception $e, $time )
- {
- $this->logger->write( 'Incomplete.' );
- $this->tests_failed++;
- }
-
- public function addSkippedTest( PHPUnit_Framework_Test $test, Exception $e, $time )
- {
- $this->logger->write( 'Skipped.' );
- $this->tests_failed++;
- }
-
- public function startTest( PHPUnit_Framework_Test $test ) {
- $this->logger->write(
- 'Testing ' . $test->getName() . ' ... ',
- SeleniumTestSuite::CONTINUE_LINE
- );
- }
-
- public function endTest( PHPUnit_Framework_Test $test, $time ) {
- if ( !$test->hasFailed() ) {
- $this->logger->write( 'OK', SeleniumTestSuite::RESULT_OK );
- $this->tests_ok++;
- }
- }
-
- public function startTestSuite( PHPUnit_Framework_TestSuite $suite ) {
- $this->logger->write( 'Testsuite ' . $suite->getName() . ' started.' );
- $this->tests_ok = 0;
- $this->tests_failed = 0;
- }
-
- public function endTestSuite( PHPUnit_Framework_TestSuite $suite ) {
- $this->logger->write('Testsuite ' . $suite->getName() . ' ended.' );
- if ( $this->tests_ok > 0 || $this->tests_failed > 0 ) {
- $this->logger->write( ' OK: ' . $this->tests_ok . ' Failed: ' . $this->tests_failed );
- }
- $this->tests_ok = 0;
- $this->tests_failed = 0;
- }
-
- public function statusMessage( $message ) {
- $this->logger->write( $message );
- }
-}
-
diff --git a/tests/selenium/SeleniumTestSuite.php b/tests/selenium/SeleniumTestSuite.php
deleted file mode 100644
index 81a630f8..00000000
--- a/tests/selenium/SeleniumTestSuite.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-abstract class SeleniumTestSuite extends PHPUnit_Framework_TestSuite {
- private $selenium;
- private $isSetUp = false;
- private $loginBeforeTests = true;
- private $triggerClientTestResources = true;
-
- // Do not add line break after test output
- const CONTINUE_LINE = 1;
- const RESULT_OK = 2;
- const RESULT_ERROR = 3;
-
- public abstract function addTests();
-
- public function setUp() {
- // Hack because because PHPUnit version 3.0.6 which is on prototype does not
- // run setUp as part of TestSuite::run
- if ( $this->isSetUp ) {
- return;
- }
- $this->isSetUp = true;
- $this->selenium = Selenium::getInstance();
- $this->selenium->start();
- if ( $this->triggerClientTestResources ) {
- $this->selenium->open( $this->selenium->getUrl() . '/index.php?setupTestSuite=' . $this->getName() );
- //wait a little longer for the db operation
- $this->selenium->waitForPageToLoad( 6000 );
- }
- if ( $this->loginBeforeTests ) {
- $this->login();
- }
- }
-
- public function tearDown() {
- if ( $this->triggerClientTestResources ) {
- $this->selenium->open( $this->selenium->getUrl() . '/index.php?clearTestSuite=' . $this->getName() );
- }
- $this->selenium->stop();
- }
-
- public function login() {
- $this->selenium->login();
- }
-
- public function loadPage( $title, $action ) {
- $this->selenium->loadPage( $title, $action );
- }
-
- protected function setLoginBeforeTests( $loginBeforeTests = true ) {
- $this->loginBeforeTests = $loginBeforeTests;
- }
-
- protected function setTriggerClientTestResources( $triggerClientTestResources = true ) {
- $this->triggerClientTestResources = $triggerClientTestResources;
- }
-}
diff --git a/tests/selenium/data/SimpleSeleniumTestDB.sql b/tests/selenium/data/SimpleSeleniumTestDB.sql
deleted file mode 100644
index d688c3b9..00000000
--- a/tests/selenium/data/SimpleSeleniumTestDB.sql
+++ /dev/null
@@ -1,1453 +0,0 @@
--- MySQL dump 10.13 Distrib 5.1.41, for debian-linux-gnu (x86_64)
---
--- Host: localhost Database: test_wiki
--- ------------------------------------------------------
--- Server version 5.1.41-3ubuntu12.7
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `mw_archive`
---
-
-DROP TABLE IF EXISTS `mw_archive`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_archive` (
- `ar_namespace` int(11) NOT NULL DEFAULT '0',
- `ar_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `ar_text` mediumblob NOT NULL,
- `ar_comment` tinyblob NOT NULL,
- `ar_user` int(10) unsigned NOT NULL DEFAULT '0',
- `ar_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `ar_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `ar_minor_edit` tinyint(4) NOT NULL DEFAULT '0',
- `ar_flags` tinyblob NOT NULL,
- `ar_rev_id` int(10) unsigned DEFAULT NULL,
- `ar_text_id` int(10) unsigned DEFAULT NULL,
- `ar_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `ar_len` int(10) unsigned DEFAULT NULL,
- `ar_page_id` int(10) unsigned DEFAULT NULL,
- `ar_parent_id` int(10) unsigned DEFAULT NULL,
- KEY `name_title_timestamp` (`ar_namespace`,`ar_title`,`ar_timestamp`),
- KEY `usertext_timestamp` (`ar_user_text`,`ar_timestamp`),
- KEY `ar_revid` (`ar_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_archive`
---
-
-LOCK TABLES `mw_archive` WRITE;
-/*!40000 ALTER TABLE `mw_archive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_archive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_category`
---
-
-DROP TABLE IF EXISTS `mw_category`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_category` (
- `cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `cat_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `cat_pages` int(11) NOT NULL DEFAULT '0',
- `cat_subcats` int(11) NOT NULL DEFAULT '0',
- `cat_files` int(11) NOT NULL DEFAULT '0',
- `cat_hidden` tinyint(3) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`cat_id`),
- UNIQUE KEY `cat_title` (`cat_title`),
- KEY `cat_pages` (`cat_pages`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_category`
---
-
-LOCK TABLES `mw_category` WRITE;
-/*!40000 ALTER TABLE `mw_category` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_category` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_categorylinks`
---
-
-DROP TABLE IF EXISTS `mw_categorylinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_categorylinks` (
- `cl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `cl_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `cl_sortkey` varbinary(230) NOT NULL DEFAULT '',
- `cl_sortkey_prefix` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `cl_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- `cl_collation` varbinary(32) NOT NULL DEFAULT '',
- `cl_type` enum('page','subcat','file') NOT NULL DEFAULT 'page',
- UNIQUE KEY `cl_from` (`cl_from`,`cl_to`),
- KEY `cl_sortkey` (`cl_to`,`cl_type`,`cl_sortkey`,`cl_from`),
- KEY `cl_timestamp` (`cl_to`,`cl_timestamp`),
- KEY `cl_collation` (`cl_collation`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_categorylinks`
---
-
-LOCK TABLES `mw_categorylinks` WRITE;
-/*!40000 ALTER TABLE `mw_categorylinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_categorylinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_change_tag`
---
-
-DROP TABLE IF EXISTS `mw_change_tag`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_change_tag` (
- `ct_rc_id` int(11) DEFAULT NULL,
- `ct_log_id` int(11) DEFAULT NULL,
- `ct_rev_id` int(11) DEFAULT NULL,
- `ct_tag` varchar(255) NOT NULL,
- `ct_params` blob,
- UNIQUE KEY `change_tag_rc_tag` (`ct_rc_id`,`ct_tag`),
- UNIQUE KEY `change_tag_log_tag` (`ct_log_id`,`ct_tag`),
- UNIQUE KEY `change_tag_rev_tag` (`ct_rev_id`,`ct_tag`),
- KEY `change_tag_tag_id` (`ct_tag`,`ct_rc_id`,`ct_rev_id`,`ct_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_change_tag`
---
-
-LOCK TABLES `mw_change_tag` WRITE;
-/*!40000 ALTER TABLE `mw_change_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_change_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_external_user`
---
-
-DROP TABLE IF EXISTS `mw_external_user`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_external_user` (
- `eu_local_id` int(10) unsigned NOT NULL,
- `eu_external_id` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- PRIMARY KEY (`eu_local_id`),
- UNIQUE KEY `eu_external_id` (`eu_external_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_external_user`
---
-
-LOCK TABLES `mw_external_user` WRITE;
-/*!40000 ALTER TABLE `mw_external_user` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_external_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_externallinks`
---
-
-DROP TABLE IF EXISTS `mw_externallinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_externallinks` (
- `el_from` int(10) unsigned NOT NULL DEFAULT '0',
- `el_to` blob NOT NULL,
- `el_index` blob NOT NULL,
- KEY `el_from` (`el_from`,`el_to`(40)),
- KEY `el_to` (`el_to`(60),`el_from`),
- KEY `el_index` (`el_index`(60))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_externallinks`
---
-
-LOCK TABLES `mw_externallinks` WRITE;
-/*!40000 ALTER TABLE `mw_externallinks` DISABLE KEYS */;
-INSERT INTO `mw_externallinks` VALUES (1,'http://meta.wikimedia.org/wiki/Help:Contents','http://org.wikimedia.meta./wiki/Help:Contents'),(1,'http://www.mediawiki.org/wiki/Manual:Configuration_settings','http://org.mediawiki.www./wiki/Manual:Configuration_settings'),(1,'http://www.mediawiki.org/wiki/Manual:FAQ','http://org.mediawiki.www./wiki/Manual:FAQ'),(1,'https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce','https://org.wikimedia.lists./mailman/listinfo/mediawiki-announce');
-/*!40000 ALTER TABLE `mw_externallinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_filearchive`
---
-
-DROP TABLE IF EXISTS `mw_filearchive`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_filearchive` (
- `fa_id` int(11) NOT NULL AUTO_INCREMENT,
- `fa_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `fa_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '',
- `fa_storage_group` varbinary(16) DEFAULT NULL,
- `fa_storage_key` varbinary(64) DEFAULT '',
- `fa_deleted_user` int(11) DEFAULT NULL,
- `fa_deleted_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `fa_deleted_reason` text,
- `fa_size` int(10) unsigned DEFAULT '0',
- `fa_width` int(11) DEFAULT '0',
- `fa_height` int(11) DEFAULT '0',
- `fa_metadata` mediumblob,
- `fa_bits` int(11) DEFAULT '0',
- `fa_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
- `fa_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') DEFAULT 'unknown',
- `fa_minor_mime` varbinary(100) DEFAULT 'unknown',
- `fa_description` tinyblob,
- `fa_user` int(10) unsigned DEFAULT '0',
- `fa_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
- `fa_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `fa_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`fa_id`),
- KEY `fa_name` (`fa_name`,`fa_timestamp`),
- KEY `fa_storage_group` (`fa_storage_group`,`fa_storage_key`),
- KEY `fa_deleted_timestamp` (`fa_deleted_timestamp`),
- KEY `fa_user_timestamp` (`fa_user_text`,`fa_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_filearchive`
---
-
-LOCK TABLES `mw_filearchive` WRITE;
-/*!40000 ALTER TABLE `mw_filearchive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_filearchive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_hitcounter`
---
-
-DROP TABLE IF EXISTS `mw_hitcounter`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_hitcounter` (
- `hc_id` int(10) unsigned NOT NULL
-) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=25000;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_hitcounter`
---
-
-LOCK TABLES `mw_hitcounter` WRITE;
-/*!40000 ALTER TABLE `mw_hitcounter` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_hitcounter` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_image`
---
-
-DROP TABLE IF EXISTS `mw_image`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_image` (
- `img_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `img_size` int(10) unsigned NOT NULL DEFAULT '0',
- `img_width` int(11) NOT NULL DEFAULT '0',
- `img_height` int(11) NOT NULL DEFAULT '0',
- `img_metadata` mediumblob NOT NULL,
- `img_bits` int(11) NOT NULL DEFAULT '0',
- `img_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
- `img_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
- `img_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
- `img_description` tinyblob NOT NULL,
- `img_user` int(10) unsigned NOT NULL DEFAULT '0',
- `img_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `img_timestamp` varbinary(14) NOT NULL DEFAULT '',
- `img_sha1` varbinary(32) NOT NULL DEFAULT '',
- PRIMARY KEY (`img_name`),
- KEY `img_usertext_timestamp` (`img_user_text`,`img_timestamp`),
- KEY `img_size` (`img_size`),
- KEY `img_timestamp` (`img_timestamp`),
- KEY `img_sha1` (`img_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_image`
---
-
-LOCK TABLES `mw_image` WRITE;
-/*!40000 ALTER TABLE `mw_image` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_image` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_imagelinks`
---
-
-DROP TABLE IF EXISTS `mw_imagelinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_imagelinks` (
- `il_from` int(10) unsigned NOT NULL DEFAULT '0',
- `il_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `il_from` (`il_from`,`il_to`),
- UNIQUE KEY `il_to` (`il_to`,`il_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_imagelinks`
---
-
-LOCK TABLES `mw_imagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_imagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_imagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_interwiki`
---
-
-DROP TABLE IF EXISTS `mw_interwiki`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_interwiki` (
- `iw_prefix` varchar(32) NOT NULL,
- `iw_url` blob NOT NULL,
- `iw_api` blob NOT NULL,
- `iw_wikiid` varchar(64) NOT NULL,
- `iw_local` tinyint(1) NOT NULL,
- `iw_trans` tinyint(4) NOT NULL DEFAULT '0',
- UNIQUE KEY `iw_prefix` (`iw_prefix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_interwiki`
---
-
-LOCK TABLES `mw_interwiki` WRITE;
-/*!40000 ALTER TABLE `mw_interwiki` DISABLE KEYS */;
-INSERT INTO `mw_interwiki` VALUES ('acronym','http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1','','',0,0),('advogato','http://www.advogato.org/$1','','',0,0),('annotationwiki','http://www.seedwiki.com/page.cfm?wikiid=368&doc=$1','','',0,0),('arxiv','http://www.arxiv.org/abs/$1','','',0,0),('c2find','http://c2.com/cgi/wiki?FindPage&value=$1','','',0,0),('cache','http://www.google.com/search?q=cache:$1','','',0,0),('commons','http://commons.wikimedia.org/wiki/$1','','',0,0),('corpknowpedia','http://corpknowpedia.org/wiki/index.php/$1','','',0,0),('dictionary','http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1','','',0,0),('disinfopedia','http://www.disinfopedia.org/wiki.phtml?title=$1','','',0,0),('docbook','http://wiki.docbook.org/topic/$1','','',0,0),('doi','http://dx.doi.org/$1','','',0,0),('drumcorpswiki','http://www.drumcorpswiki.com/index.php/$1','','',0,0),('dwjwiki','http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1','','',0,0),('elibre','http://enciclopedia.us.es/index.php/$1','','',0,0),('emacswiki','http://www.emacswiki.org/cgi-bin/wiki.pl?$1','','',0,0),('foldoc','http://foldoc.org/?$1','','',0,0),('foxwiki','http://fox.wikis.com/wc.dll?Wiki~$1','','',0,0),('freebsdman','http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1','','',0,0),('gej','http://www.esperanto.de/cgi-bin/aktivikio/wiki.pl?$1','','',0,0),('gentoo-wiki','http://gentoo-wiki.com/$1','','',0,0),('google','http://www.google.com/search?q=$1','','',0,0),('googlegroups','http://groups.google.com/groups?q=$1','','',0,0),('hammondwiki','http://www.dairiki.org/HammondWiki/$1','','',0,0),('hewikisource','http://he.wikisource.org/wiki/$1','','',1,0),('hrwiki','http://www.hrwiki.org/index.php/$1','','',0,0),('imdb','http://us.imdb.com/Title?$1','','',0,0),('jargonfile','http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1','','',0,0),('jspwiki','http://www.jspwiki.org/wiki/$1','','',0,0),('keiki','http://kei.ki/en/$1','','',0,0),('kmwiki','http://kmwiki.wikispaces.com/$1','','',0,0),('linuxwiki','http://linuxwiki.de/$1','','',0,0),('lojban','http://www.lojban.org/tiki/tiki-index.php?page=$1','','',0,0),('lqwiki','http://wiki.linuxquestions.org/wiki/$1','','',0,0),('lugkr','http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1','','',0,0),('mathsongswiki','http://SeedWiki.com/page.cfm?wikiid=237&doc=$1','','',0,0),('meatball','http://www.usemod.com/cgi-bin/mb.pl?$1','','',0,0),('mediawikiwiki','http://www.mediawiki.org/wiki/$1','','',0,0),('mediazilla','https://bugzilla.wikimedia.org/$1','','',1,0),('memoryalpha','http://www.memory-alpha.org/en/index.php/$1','','',0,0),('metawiki','http://sunir.org/apps/meta.pl?$1','','',0,0),('metawikimedia','http://meta.wikimedia.org/wiki/$1','','',0,0),('moinmoin','http://purl.net/wiki/moin/$1','','',0,0),('mozillawiki','http://wiki.mozilla.org/index.php/$1','','',0,0),('mw','http://www.mediawiki.org/wiki/$1','','',0,0),('oeis','http://www.research.att.com/cgi-bin/access.cgi/as/njas/sequences/eisA.cgi?Anum=$1','','',0,0),('openfacts','http://openfacts.berlios.de/index.phtml?title=$1','','',0,0),('openwiki','http://openwiki.com/?$1','','',0,0),('pmeg','http://www.bertilow.com/pmeg/$1.php','','',0,0),('ppr','http://c2.com/cgi/wiki?$1','','',0,0),('pythoninfo','http://wiki.python.org/moin/$1','','',0,0),('rfc','http://www.rfc-editor.org/rfc/rfc$1.txt','','',0,0),('s23wiki','http://is-root.de/wiki/index.php/$1','','',0,0),('seattlewiki','http://seattle.wikia.com/wiki/$1','','',0,0),('seattlewireless','http://seattlewireless.net/?$1','','',0,0),('senseislibrary','http://senseis.xmp.net/?$1','','',0,0),('sourceforge','http://sourceforge.net/$1','','',0,0),('squeak','http://wiki.squeak.org/squeak/$1','','',0,0),('susning','http://www.susning.nu/$1','','',0,0),('svgwiki','http://wiki.svg.org/$1','','',0,0),('tavi','http://tavi.sourceforge.net/$1','','',0,0),('tejo','http://www.tejo.org/vikio/$1','','',0,0),('theopedia','http://www.theopedia.com/$1','','',0,0),('tmbw','http://www.tmbw.net/wiki/$1','','',0,0),('tmnet','http://www.technomanifestos.net/?$1','','',0,0),('tmwiki','http://www.EasyTopicMaps.com/?page=$1','','',0,0),('twiki','http://twiki.org/cgi-bin/view/$1','','',0,0),('uea','http://www.tejo.org/uea/$1','','',0,0),('unreal','http://wiki.beyondunreal.com/wiki/$1','','',0,0),('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1','','',0,0),('vinismo','http://vinismo.com/en/$1','','',0,0),('webseitzwiki','http://webseitz.fluxent.com/wiki/$1','','',0,0),('why','http://clublet.com/c/c/why?$1','','',0,0),('wiki','http://c2.com/cgi/wiki?$1','','',0,0),('wikia','http://www.wikia.com/wiki/$1','','',0,0),('wikibooks','http://en.wikibooks.org/wiki/$1','','',1,0),('wikicities','http://www.wikia.com/wiki/$1','','',0,0),('wikif1','http://www.wikif1.org/$1','','',0,0),('wikihow','http://www.wikihow.com/$1','','',0,0),('wikimedia','http://wikimediafoundation.org/wiki/$1','','',0,0),('wikinews','http://en.wikinews.org/wiki/$1','','',1,0),('wikinfo','http://www.wikinfo.org/index.php/$1','','',0,0),('wikipedia','http://en.wikipedia.org/wiki/$1','','',1,0),('wikiquote','http://en.wikiquote.org/wiki/$1','','',1,0),('wikisource','http://wikisource.org/wiki/$1','','',1,0),('wikispecies','http://species.wikimedia.org/wiki/$1','','',1,0),('wikitravel','http://wikitravel.org/en/$1','','',0,0),('wikiversity','http://en.wikiversity.org/wiki/$1','','',1,0),('wikt','http://en.wiktionary.org/wiki/$1','','',1,0),('wiktionary','http://en.wiktionary.org/wiki/$1','','',1,0),('wlug','http://www.wlug.org.nz/$1','','',0,0),('zwiki','http://zwiki.org/$1','','',0,0),('zzz wiki','http://wiki.zzz.ee/index.php/$1','','',0,0);
-/*!40000 ALTER TABLE `mw_interwiki` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_ipblocks`
---
-
-DROP TABLE IF EXISTS `mw_ipblocks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_ipblocks` (
- `ipb_id` int(11) NOT NULL AUTO_INCREMENT,
- `ipb_address` tinyblob NOT NULL,
- `ipb_user` int(10) unsigned NOT NULL DEFAULT '0',
- `ipb_by` int(10) unsigned NOT NULL DEFAULT '0',
- `ipb_by_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `ipb_reason` tinyblob NOT NULL,
- `ipb_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `ipb_auto` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_anon_only` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_create_account` tinyint(1) NOT NULL DEFAULT '1',
- `ipb_enable_autoblock` tinyint(1) NOT NULL DEFAULT '1',
- `ipb_expiry` varbinary(14) NOT NULL DEFAULT '',
- `ipb_range_start` tinyblob NOT NULL,
- `ipb_range_end` tinyblob NOT NULL,
- `ipb_deleted` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_block_email` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_allow_usertalk` tinyint(1) NOT NULL DEFAULT '0',
- PRIMARY KEY (`ipb_id`),
- UNIQUE KEY `ipb_address` (`ipb_address`(255),`ipb_user`,`ipb_auto`,`ipb_anon_only`),
- KEY `ipb_user` (`ipb_user`),
- KEY `ipb_range` (`ipb_range_start`(8),`ipb_range_end`(8)),
- KEY `ipb_timestamp` (`ipb_timestamp`),
- KEY `ipb_expiry` (`ipb_expiry`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_ipblocks`
---
-
-LOCK TABLES `mw_ipblocks` WRITE;
-/*!40000 ALTER TABLE `mw_ipblocks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_ipblocks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_iwlinks`
---
-
-DROP TABLE IF EXISTS `mw_iwlinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_iwlinks` (
- `iwl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `iwl_prefix` varbinary(20) NOT NULL DEFAULT '',
- `iwl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `iwl_from` (`iwl_from`,`iwl_prefix`,`iwl_title`),
- UNIQUE KEY `iwl_prefix_title_from` (`iwl_prefix`,`iwl_title`,`iwl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_iwlinks`
---
-
-LOCK TABLES `mw_iwlinks` WRITE;
-/*!40000 ALTER TABLE `mw_iwlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_iwlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_job`
---
-
-DROP TABLE IF EXISTS `mw_job`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_job` (
- `job_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `job_cmd` varbinary(60) NOT NULL DEFAULT '',
- `job_namespace` int(11) NOT NULL,
- `job_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `job_params` blob NOT NULL,
- PRIMARY KEY (`job_id`),
- KEY `job_cmd` (`job_cmd`,`job_namespace`,`job_title`,`job_params`(128))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_job`
---
-
-LOCK TABLES `mw_job` WRITE;
-/*!40000 ALTER TABLE `mw_job` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_job` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_l10n_cache`
---
-
-DROP TABLE IF EXISTS `mw_l10n_cache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_l10n_cache` (
- `lc_lang` varbinary(32) NOT NULL,
- `lc_key` varchar(255) NOT NULL,
- `lc_value` mediumblob NOT NULL,
- KEY `lc_lang_key` (`lc_lang`,`lc_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_l10n_cache`
---
-
-LOCK TABLES `mw_l10n_cache` WRITE;
-/*!40000 ALTER TABLE `mw_l10n_cache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_l10n_cache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_langlinks`
---
-
-DROP TABLE IF EXISTS `mw_langlinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_langlinks` (
- `ll_from` int(10) unsigned NOT NULL DEFAULT '0',
- `ll_lang` varbinary(20) NOT NULL DEFAULT '',
- `ll_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `ll_from` (`ll_from`,`ll_lang`),
- KEY `ll_lang` (`ll_lang`,`ll_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_langlinks`
---
-
-LOCK TABLES `mw_langlinks` WRITE;
-/*!40000 ALTER TABLE `mw_langlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_langlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_log_search`
---
-
-DROP TABLE IF EXISTS `mw_log_search`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_log_search` (
- `ls_field` varbinary(32) NOT NULL,
- `ls_value` varchar(255) NOT NULL,
- `ls_log_id` int(10) unsigned NOT NULL DEFAULT '0',
- UNIQUE KEY `ls_field_val` (`ls_field`,`ls_value`,`ls_log_id`),
- KEY `ls_log_id` (`ls_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_log_search`
---
-
-LOCK TABLES `mw_log_search` WRITE;
-/*!40000 ALTER TABLE `mw_log_search` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_log_search` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_logging`
---
-
-DROP TABLE IF EXISTS `mw_logging`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_logging` (
- `log_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `log_type` varbinary(32) NOT NULL DEFAULT '',
- `log_action` varbinary(32) NOT NULL DEFAULT '',
- `log_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
- `log_user` int(10) unsigned NOT NULL DEFAULT '0',
- `log_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `log_namespace` int(11) NOT NULL DEFAULT '0',
- `log_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `log_page` int(10) unsigned DEFAULT NULL,
- `log_comment` varchar(255) NOT NULL DEFAULT '',
- `log_params` blob NOT NULL,
- `log_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`log_id`),
- KEY `type_time` (`log_type`,`log_timestamp`),
- KEY `user_time` (`log_user`,`log_timestamp`),
- KEY `page_time` (`log_namespace`,`log_title`,`log_timestamp`),
- KEY `times` (`log_timestamp`),
- KEY `log_user_type_time` (`log_user`,`log_type`,`log_timestamp`),
- KEY `log_page_id_time` (`log_page`,`log_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_logging`
---
-
-LOCK TABLES `mw_logging` WRITE;
-/*!40000 ALTER TABLE `mw_logging` DISABLE KEYS */;
-INSERT INTO `mw_logging` VALUES (1,'patrol','patrol','20110110173131',1,'WikiSysop',0,'TestResources',2,'','2\n0\n1',0);
-/*!40000 ALTER TABLE `mw_logging` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_math`
---
-
-DROP TABLE IF EXISTS `mw_math`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_math` (
- `math_inputhash` varbinary(16) NOT NULL,
- `math_outputhash` varbinary(16) NOT NULL,
- `math_html_conservativeness` tinyint(4) NOT NULL,
- `math_html` text,
- `math_mathml` text,
- UNIQUE KEY `math_inputhash` (`math_inputhash`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_math`
---
-
-LOCK TABLES `mw_math` WRITE;
-/*!40000 ALTER TABLE `mw_math` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_math` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_module_deps`
---
-
-DROP TABLE IF EXISTS `mw_module_deps`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_module_deps` (
- `md_module` varbinary(255) NOT NULL,
- `md_skin` varbinary(32) NOT NULL,
- `md_deps` mediumblob NOT NULL,
- UNIQUE KEY `md_module_skin` (`md_module`,`md_skin`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_module_deps`
---
-
-LOCK TABLES `mw_module_deps` WRITE;
-/*!40000 ALTER TABLE `mw_module_deps` DISABLE KEYS */;
-INSERT INTO `mw_module_deps` VALUES ('ext.vector.collapsibleNav','vector','[\"\\/home\\/pdhanda\\/deployment\\/extensions\\/Vector\\/modules\\/.\\/images\\/portal-break.png\",\"\\/home\\/pdhanda\\/deployment\\/extensions\\/Vector\\/modules\\/.\\/images\\/open.png\",\"\\/home\\/pdhanda\\/deployment\\/extensions\\/Vector\\/modules\\/.\\/images\\/closed-ltr.png\"]'),('jquery.wikiEditor','vector','[\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/loading.gif\"]'),('jquery.wikiEditor.toolbar','vector','{\"0\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/base.png\",\"1\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/loading.gif\",\"2\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/button-sprite.png\",\"3\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/arrow-right.png\",\"4\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/arrow-left.png\",\"5\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/arrow-down.png\",\"7\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/loading-small.gif\"}'),('mediawiki.legacy.shared','vector','[\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/feed-icon.png\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/remove.png\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/add.png\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/ajax-loader.gif\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/spinner.gif\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/help-question.gif\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/help-question-hover.gif\"]'),('skins.vector','vector','{\"0\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/page-base.png\",\"1\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/border.png\",\"2\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/page-fade.png\",\"4\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/tab-break.png\",\"5\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/tab-normal-fade.png\",\"6\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/tab-current-fade.png\",\"8\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/arrow-down-icon.png\",\"11\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/search-fade.png\",\"12\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/portal-break.png\",\"14\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/preferences-break.png\",\"16\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/preferences-fade.png\",\"17\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/preferences-base.png\",\"18\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/bullet-icon.png\",\"19\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/external-link-ltr-icon.png\",\"20\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/lock-icon.png\",\"21\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/mail-icon.png\",\"22\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/news-icon.png\",\"23\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/file-icon.png\",\"24\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/talk-icon.png\",\"25\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/audio-icon.png\",\"26\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/video-icon.png\",\"27\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/document-icon.png\",\"28\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/user-icon.png\",\"29\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/watch-icons.png\",\"30\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/watch-icon-loading.gif\"}');
-/*!40000 ALTER TABLE `mw_module_deps` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource` (
- `mr_resource` varbinary(255) NOT NULL,
- `mr_lang` varbinary(32) NOT NULL,
- `mr_blob` mediumblob NOT NULL,
- `mr_timestamp` binary(14) NOT NULL,
- UNIQUE KEY `mr_resource_lang` (`mr_resource`,`mr_lang`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource`
---
-
-LOCK TABLES `mw_msg_resource` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource` DISABLE KEYS */;
-INSERT INTO `mw_msg_resource` VALUES ('ext.vector.collapsibleNav','en','{\"vector-collapsiblenav-more\":\"More languages\"}','20110108005000'),('ext.vector.collapsibleTabs','en','{}','20110108005000'),('ext.vector.simpleSearch','en','{\"vector-simplesearch-search\":\"Search\",\"vector-simplesearch-containing\":\"containing...\"}','20110108005000'),('ext.wikiEditor','en','{}','20110110172914'),('ext.wikiEditor.toolbar','en','{\"wikieditor-toolbar-loading\":\"Loading...\",\"wikieditor-toolbar-tool-bold\":\"Bold\",\"wikieditor-toolbar-tool-bold-example\":\"Bold text\",\"wikieditor-toolbar-tool-italic\":\"Italic\",\"wikieditor-toolbar-tool-italic-example\":\"Italic text\",\"wikieditor-toolbar-tool-ilink\":\"Internal link\",\"wikieditor-toolbar-tool-ilink-example\":\"Link title\",\"wikieditor-toolbar-tool-xlink\":\"External link (remember http:\\/\\/ prefix)\",\"wikieditor-toolbar-tool-xlink-example\":\"http:\\/\\/www.example.com link title\",\"wikieditor-toolbar-tool-link\":\"Link\",\"wikieditor-toolbar-tool-link-title\":\"Insert link\",\"wikieditor-toolbar-tool-link-int\":\"To a wiki page\",\"wikieditor-toolbar-tool-link-int-target\":\"Target page or URL:\",\"wikieditor-toolbar-tool-link-int-target-tooltip\":\"Page title or URL\",\"wikieditor-toolbar-tool-link-int-text\":\"Text to display:\",\"wikieditor-toolbar-tool-link-int-text-tooltip\":\"Text to be displayed\",\"wikieditor-toolbar-tool-link-ext\":\"To an external web page\",\"wikieditor-toolbar-tool-link-ext-target\":\"Link URL:\",\"wikieditor-toolbar-tool-link-ext-text\":\"Link text:\",\"wikieditor-toolbar-tool-link-insert\":\"Insert link\",\"wikieditor-toolbar-tool-link-cancel\":\"Cancel\",\"wikieditor-toolbar-tool-link-int-target-status-exists\":\"Page exists\",\"wikieditor-toolbar-tool-link-int-target-status-notexists\":\"Page does not exist\",\"wikieditor-toolbar-tool-link-int-target-status-invalid\":\"Invalid title\",\"wikieditor-toolbar-tool-link-int-target-status-external\":\"External link\",\"wikieditor-toolbar-tool-link-int-target-status-loading\":\"Checking page existence...\",\"wikieditor-toolbar-tool-link-int-invalid\":\"The title you specified is invalid.\",\"wikieditor-toolbar-tool-link-lookslikeinternal\":\"The URL you specified looks like it was intended as a link to another wiki page.\\nDo you want to make it an internal link?\",\"wikieditor-toolbar-tool-link-lookslikeinternal-int\":\"Internal link\",\"wikieditor-toolbar-tool-link-lookslikeinternal-ext\":\"External link\",\"wikieditor-toolbar-tool-link-empty\":\"You did not enter anything to link to.\",\"wikieditor-toolbar-tool-file\":\"Embedded file\",\"wikieditor-toolbar-tool-file-pre\":\"$1{{ns:file}}:\",\"wikieditor-toolbar-tool-file-example\":\"Example.jpg\",\"wikieditor-toolbar-tool-reference\":\"Reference\",\"wikieditor-toolbar-tool-reference-title\":\"Insert reference\",\"wikieditor-toolbar-tool-reference-cancel\":\"Cancel\",\"wikieditor-toolbar-tool-reference-text\":\"Reference text\",\"wikieditor-toolbar-tool-reference-insert\":\"Insert\",\"wikieditor-toolbar-tool-reference-example\":\"Insert footnote text here\",\"wikieditor-toolbar-tool-signature\":\"Signature and timestamp\",\"wikieditor-toolbar-section-advanced\":\"Advanced\",\"wikieditor-toolbar-tool-heading\":\"Heading\",\"wikieditor-toolbar-tool-heading-1\":\"Level 1\",\"wikieditor-toolbar-tool-heading-2\":\"Level 2\",\"wikieditor-toolbar-tool-heading-3\":\"Level 3\",\"wikieditor-toolbar-tool-heading-4\":\"Level 4\",\"wikieditor-toolbar-tool-heading-5\":\"Level 5\",\"wikieditor-toolbar-tool-heading-example\":\"Heading text\",\"wikieditor-toolbar-group-format\":\"Format\",\"wikieditor-toolbar-tool-ulist\":\"Bulleted list\",\"wikieditor-toolbar-tool-ulist-example\":\"Bulleted list item\",\"wikieditor-toolbar-tool-olist\":\"Numbered list\",\"wikieditor-toolbar-tool-olist-example\":\"Numbered list item\",\"wikieditor-toolbar-tool-indent\":\"Indentation\",\"wikieditor-toolbar-tool-indent-example\":\"Indented line\",\"wikieditor-toolbar-tool-nowiki\":\"No wiki formatting\",\"wikieditor-toolbar-tool-nowiki-example\":\"Insert non-formatted text here\",\"wikieditor-toolbar-tool-redirect\":\"Redirect\",\"wikieditor-toolbar-tool-redirect-example\":\"Target page name\",\"wikieditor-toolbar-tool-big\":\"Big\",\"wikieditor-toolbar-tool-big-example\":\"Big text\",\"wikieditor-toolbar-tool-small\":\"Small\",\"wikieditor-toolbar-tool-small-example\":\"Small text\",\"wikieditor-toolbar-tool-superscript\":\"Superscript\",\"wikieditor-toolbar-tool-superscript-example\":\"Superscript text\",\"wikieditor-toolbar-tool-subscript\":\"Subscript\",\"wikieditor-toolbar-tool-subscript-example\":\"Subscript text\",\"wikieditor-toolbar-group-insert\":\"Insert\",\"wikieditor-toolbar-tool-gallery\":\"Picture gallery\",\"wikieditor-toolbar-tool-gallery-example\":\"{{ns:file}}:Example.jpg|Caption1\\n{{ns:file}}:Example.jpg|Caption2\",\"wikieditor-toolbar-tool-newline\":\"New line\",\"wikieditor-toolbar-tool-table\":\"Table\",\"wikieditor-toolbar-tool-table-example-old\":\"-\\n! header 1\\n! header 2\\n! header 3\\n|-\\n| row 1, cell 1\\n| row 1, cell 2\\n| row 1, cell 3\\n|-\\n| row 2, cell 1\\n| row 2, cell 2\\n| row 2, cell 3\",\"wikieditor-toolbar-tool-table-example-cell-text\":\"Cell text\",\"wikieditor-toolbar-tool-table-example\":\"Example\",\"wikieditor-toolbar-tool-table-example-header\":\"Header text\",\"wikieditor-toolbar-tool-table-title\":\"Insert table\",\"wikieditor-toolbar-tool-table-dimensions-rows\":\"Rows\",\"wikieditor-toolbar-tool-table-dimensions-columns\":\"Columns\",\"wikieditor-toolbar-tool-table-dimensions-header\":\"Add header row\",\"wikieditor-toolbar-tool-table-wikitable\":\"Style with borders\",\"wikieditor-toolbar-tool-table-sortable\":\"Make table sortable\",\"wikieditor-toolbar-tool-table-insert\":\"Insert\",\"wikieditor-toolbar-tool-table-cancel\":\"Cancel\",\"wikieditor-toolbar-tool-table-example-text\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut nec purus diam. Sed aliquam imperdiet nunc quis lacinia. Donec rutrum consectetur placerat. Sed volutpat neque non purus faucibus id ultricies enim euismod.\",\"wikieditor-toolbar-tool-table-toomany\":\"Inserting a table with more than $1 cells is not possible with this dialog.\",\"wikieditor-toolbar-tool-table-invalidnumber\":\"You have not entered a valid number of rows or columns.\",\"wikieditor-toolbar-tool-table-zero\":\"You cannot insert a table with zero rows or columns.\",\"wikieditor-toolbar-tool-replace\":\"Search and replace\",\"wikieditor-toolbar-tool-replace-title\":\"Search and replace\",\"wikieditor-toolbar-tool-replace-search\":\"Search for:\",\"wikieditor-toolbar-tool-replace-replace\":\"Replace with:\",\"wikieditor-toolbar-tool-replace-case\":\"Match case\",\"wikieditor-toolbar-tool-replace-regex\":\"Treat search string as a regular expression\",\"wikieditor-toolbar-tool-replace-button-findnext\":\"Find next\",\"wikieditor-toolbar-tool-replace-button-replacenext\":\"Replace next\",\"wikieditor-toolbar-tool-replace-button-replaceall\":\"Replace all\",\"wikieditor-toolbar-tool-replace-close\":\"Close\",\"wikieditor-toolbar-tool-replace-nomatch\":\"Your search did not match anything.\",\"wikieditor-toolbar-tool-replace-success\":\"$1 replacement(s) made.\",\"wikieditor-toolbar-tool-replace-emptysearch\":\"You did not enter anything to search for.\",\"wikieditor-toolbar-tool-replace-invalidregex\":\"The regular expression you entered is invalid: $1\",\"wikieditor-toolbar-section-characters\":\"Special characters\",\"wikieditor-toolbar-characters-page-latin\":\"Latin\",\"wikieditor-toolbar-characters-page-latinextended\":\"Latin extended\",\"wikieditor-toolbar-characters-page-ipa\":\"IPA\",\"wikieditor-toolbar-characters-page-symbols\":\"Symbols\",\"wikieditor-toolbar-characters-page-greek\":\"Greek\",\"wikieditor-toolbar-characters-page-cyrillic\":\"Cyrillic\",\"wikieditor-toolbar-characters-page-arabic\":\"Arabic\",\"wikieditor-toolbar-characters-page-persian\":\"Persian\",\"wikieditor-toolbar-characters-page-hebrew\":\"Hebrew\",\"wikieditor-toolbar-characters-page-bangla\":\"Bangla\",\"wikieditor-toolbar-characters-page-telugu\":\"Telugu\",\"wikieditor-toolbar-characters-page-sinhala\":\"Sinhala\",\"wikieditor-toolbar-characters-page-gujarati\":\"Gujarati\",\"wikieditor-toolbar-characters-page-thai\":\"Thai\",\"wikieditor-toolbar-characters-page-lao\":\"Lao\",\"wikieditor-toolbar-characters-page-khmer\":\"Khmer\",\"wikieditor-toolbar-section-help\":\"Help\",\"wikieditor-toolbar-help-heading-description\":\"Description\",\"wikieditor-toolbar-help-heading-syntax\":\"What you type\",\"wikieditor-toolbar-help-heading-result\":\"What you get\",\"wikieditor-toolbar-help-page-format\":\"Formatting\",\"wikieditor-toolbar-help-page-link\":\"Links\",\"wikieditor-toolbar-help-page-heading\":\"Headings\",\"wikieditor-toolbar-help-page-list\":\"Lists\",\"wikieditor-toolbar-help-page-file\":\"Files\",\"wikieditor-toolbar-help-page-reference\":\"References\",\"wikieditor-toolbar-help-page-discussion\":\"Discussion\",\"wikieditor-toolbar-help-content-bold-description\":\"Bold\",\"wikieditor-toolbar-help-content-bold-syntax\":\"\'\'\'Bold text\'\'\'\",\"wikieditor-toolbar-help-content-bold-result\":\"<strong>Bold text<\\/strong>\",\"wikieditor-toolbar-help-content-italic-description\":\"Italic\",\"wikieditor-toolbar-help-content-italic-syntax\":\"\'\'Italic text\'\'\",\"wikieditor-toolbar-help-content-italic-result\":\"<em>Italic text<\\/em>\",\"wikieditor-toolbar-help-content-bolditalic-description\":\"Bold &amp; italic\",\"wikieditor-toolbar-help-content-bolditalic-syntax\":\"\'\'\'\'\'Bold &amp; italic text\'\'\'\'\'\",\"wikieditor-toolbar-help-content-bolditalic-result\":\"<strong><em>Bold &amp; italic text<\\/em><\\/strong>\",\"wikieditor-toolbar-help-content-ilink-description\":\"Internal link\",\"wikieditor-toolbar-help-content-ilink-syntax\":\"[[Page title|Link label]]<br \\/>[[Page title]]\",\"wikieditor-toolbar-help-content-ilink-result\":\"<a href=\'#\'>Link label<\\/a><br \\/><a href=\'#\'>Page title<\\/a>\",\"wikieditor-toolbar-help-content-xlink-description\":\"External link\",\"wikieditor-toolbar-help-content-xlink-syntax\":\"[http:\\/\\/www.example.org Link label]<br \\/>[http:\\/\\/www.example.org]<br \\/>http:\\/\\/www.example.org\",\"wikieditor-toolbar-help-content-xlink-result\":\"<a href=\'#\' class=\'external\'>Link label<\\/a><br \\/><a href=\'#\' class=\'external autonumber\'>[1]<\\/a><br \\/><a href=\'#\' class=\'external\'>http:\\/\\/www.example.org<\\/a>\",\"wikieditor-toolbar-help-content-heading1-description\":\"&lt;wikieditor-toolbar-help-content-heading1-description&gt;\",\"wikieditor-toolbar-help-content-heading1-syntax\":\"&lt;wikieditor-toolbar-help-content-heading1-syntax&gt;\",\"wikieditor-toolbar-help-content-heading1-result\":\"&lt;wikieditor-toolbar-help-content-heading1-result&gt;\",\"wikieditor-toolbar-help-content-heading2-description\":\"2nd level heading\",\"wikieditor-toolbar-help-content-heading2-syntax\":\"== Heading text ==\",\"wikieditor-toolbar-help-content-heading2-result\":\"<h2>Heading text<\\/h2>\",\"wikieditor-toolbar-help-content-heading3-description\":\"3rd level heading\",\"wikieditor-toolbar-help-content-heading3-syntax\":\"=== Heading text ===\",\"wikieditor-toolbar-help-content-heading3-result\":\"<h3>Heading text<\\/h3>\",\"wikieditor-toolbar-help-content-heading4-description\":\"4th level heading\",\"wikieditor-toolbar-help-content-heading4-syntax\":\"==== Heading text ====\",\"wikieditor-toolbar-help-content-heading4-result\":\"<h4>Heading text<\\/h4>\",\"wikieditor-toolbar-help-content-heading5-description\":\"5th level heading\",\"wikieditor-toolbar-help-content-heading5-syntax\":\"===== Heading text =====\",\"wikieditor-toolbar-help-content-heading5-result\":\"<h5>Heading text<\\/h5>\",\"wikieditor-toolbar-help-content-ulist-description\":\"Bulleted list\",\"wikieditor-toolbar-help-content-ulist-syntax\":\"* List item<br \\/>* List item\",\"wikieditor-toolbar-help-content-ulist-result\":\"<ul><li>List item<\\/li><li>List item<\\/li><\\/ul>\",\"wikieditor-toolbar-help-content-olist-description\":\"Numbered list\",\"wikieditor-toolbar-help-content-olist-syntax\":\"# List item<br \\/># List item\",\"wikieditor-toolbar-help-content-olist-result\":\"<ol><li>List item<\\/li><li>List item<\\/li><\\/ol>\",\"wikieditor-toolbar-help-content-file-description\":\"Embedded file\",\"wikieditor-toolbar-help-content-file-syntax\":\"[[{{ns:file}}:Example.png|thumb|Caption text]]\",\"wikieditor-toolbar-help-content-file-result\":\"<div style=\'width:104px;\' class=\'thumbinner\'><a title=\'Caption text\' class=\'image\' href=\'#\'><img height=\'50\' width=\'100\' border=\'0\' class=\'thumbimage\' src=\'extensions\\/UsabilityInitiative\\/images\\/wikiEditor\\/toolbar\\/example-image.png\' alt=\'\'\\/><\\/a><div class=\'thumbcaption\'><div class=\'magnify\'><a title=\'Enlarge\' class=\'internal\' href=\'#\'><img height=\'11\' width=\'15\' alt=\'\' src=\'$1\\/common\\/images\\/magnify-clip.png\'\\/><\\/a><\\/div>Caption text<\\/div><\\/div>\",\"wikieditor-toolbar-help-content-reference-description\":\"Reference\",\"wikieditor-toolbar-help-content-reference-syntax\":\"Page text.&lt;ref name=\\\"test\\\"&gt;[http:\\/\\/www.example.org Link text], additional text.&lt;\\/ref&gt;\",\"wikieditor-toolbar-help-content-reference-result\":\"Page text.<sup><a href=\'#\'>[1]<\\/a><\\/sup>\",\"wikieditor-toolbar-help-content-rereference-description\":\"Additional use of same reference\",\"wikieditor-toolbar-help-content-rereference-syntax\":\"&lt;ref name=\\\"test\\\" \\/&gt;\",\"wikieditor-toolbar-help-content-rereference-result\":\"Page text.<sup><a href=\'#\'>[1]<\\/a><\\/sup>\",\"wikieditor-toolbar-help-content-showreferences-description\":\"Display references\",\"wikieditor-toolbar-help-content-showreferences-syntax\":\"&lt;references \\/&gt;\",\"wikieditor-toolbar-help-content-showreferences-result\":\"<ol class=\'references\'><li id=\'cite_note-test-0\'><b><a title=\'\' href=\'#\'>^<\\/a><\\/b> <a rel=\'nofollow\' title=\'http:\\/\\/www.example.org\' class=\'external text\' href=\'#\'>Link text<\\/a>, additional text.<\\/li><\\/ol>\",\"wikieditor-toolbar-help-content-signaturetimestamp-description\":\"Signature with timestamp\",\"wikieditor-toolbar-help-content-signaturetimestamp-syntax\":\"~~~~\",\"wikieditor-toolbar-help-content-signaturetimestamp-result\":\"<a href=\'#\' title=\'{{#special:mypage}}\'>Username<\\/a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk<\\/a>) 15:54, 10 June 2009 (UTC)\",\"wikieditor-toolbar-help-content-signature-description\":\"Signature\",\"wikieditor-toolbar-help-content-signature-syntax\":\"~~~\",\"wikieditor-toolbar-help-content-signature-result\":\"<a href=\'#\' title=\'{{#special:mypage}}\'>Username<\\/a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk<\\/a>)\",\"wikieditor-toolbar-help-content-indent-description\":\"Indent\",\"wikieditor-toolbar-help-content-indent-syntax\":\"Normal text<br \\/>:Indented text<br \\/>::Indented text\",\"wikieditor-toolbar-help-content-indent-result\":\"Normal text<dl><dd>Indented text<dl><dd>Indented text<\\/dd><\\/dl><\\/dd><\\/dl>\"}','20110110172914'),('jquery.async','en','{}','20110110172915'),('jquery.autoEllipsis','en','{}','20110110172915'),('jquery.checkboxShiftClick','en','{}','20110110172915'),('jquery.client','en','{}','20110110172915'),('jquery.collapsibleTabs','en','{}','20110110172915'),('jquery.cookie','en','{}','20110110172915'),('jquery.delayedBind','en','{}','20110110172915'),('jquery.highlightText','en','{}','20110110172915'),('jquery.makeCollapsible','en','{\"collapsible-expand\":\"Expand\",\"collapsible-collapse\":\"Collapse\"}','20110110172915'),('jquery.placeholder','en','{}','20110110172915'),('jquery.suggestions','en','{}','20110110172915'),('jquery.tabIndex','en','{}','20110110172915'),('jquery.textSelection','en','{}','20110110172915'),('jquery.wikiEditor','en','{\"wikieditor-wikitext-tab\":\"Wikitext\",\"wikieditor-loading\":\"Loading\"}','20110110172914'),('jquery.wikiEditor.toolbar','en','{}','20110110172914'),('mediawiki.action.watch.ajax','en','{}','20110110172915'),('mediawiki.language','en','{}','20110110172915'),('mediawiki.legacy.ajax','en','{\"watch\":\"Watch\",\"unwatch\":\"Unwatch\",\"watching\":\"Watching...\",\"unwatching\":\"Unwatching...\",\"tooltip-ca-watch\":\"Add this page to your watchlist\",\"tooltip-ca-unwatch\":\"Remove this page from your watchlist\"}','20110110172915'),('mediawiki.legacy.edit','en','{}','20110110172915'),('mediawiki.legacy.wikibits','en','{\"showtoc\":\"show\",\"hidetoc\":\"hide\"}','20110110172915'),('mediawiki.util','en','{}','20110110172915');
-/*!40000 ALTER TABLE `mw_msg_resource` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource_links`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource_links`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource_links` (
- `mrl_resource` varbinary(255) NOT NULL,
- `mrl_message` varbinary(255) NOT NULL,
- UNIQUE KEY `mrl_message_resource` (`mrl_message`,`mrl_resource`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource_links`
---
-
-LOCK TABLES `mw_msg_resource_links` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource_links` DISABLE KEYS */;
-INSERT INTO `mw_msg_resource_links` VALUES ('jquery.makeCollapsible','collapsible-collapse'),('jquery.makeCollapsible','collapsible-expand'),('mediawiki.legacy.wikibits','hidetoc'),('mediawiki.legacy.wikibits','showtoc'),('mediawiki.legacy.ajax','tooltip-ca-unwatch'),('mediawiki.legacy.ajax','tooltip-ca-watch'),('mediawiki.legacy.ajax','unwatch'),('mediawiki.legacy.ajax','unwatching'),('ext.vector.collapsibleNav','vector-collapsiblenav-more'),('ext.vector.simpleSearch','vector-simplesearch-containing'),('ext.vector.simpleSearch','vector-simplesearch-search'),('mediawiki.legacy.ajax','watch'),('mediawiki.legacy.ajax','watching'),('jquery.wikiEditor','wikieditor-loading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-arabic'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-bangla'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-cyrillic'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-greek'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-gujarati'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-hebrew'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-ipa'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-khmer'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-lao'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-latin'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-latinextended'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-persian'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-sinhala'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-symbols'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-telugu'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-thai'),('ext.wikiEditor.toolbar','wikieditor-toolbar-group-format'),('ext.wikiEditor.toolbar','wikieditor-toolbar-group-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bold-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bold-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bold-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bolditalic-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bolditalic-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bolditalic-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-file-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-file-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-file-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading1-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading1-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading1-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading2-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading2-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading2-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading3-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading3-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading3-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading4-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading4-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading4-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading5-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading5-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading5-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ilink-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ilink-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ilink-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-indent-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-indent-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-indent-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-italic-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-italic-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-italic-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-olist-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-olist-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-olist-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-reference-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-reference-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-reference-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-rereference-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-rereference-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-rereference-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-showreferences-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-showreferences-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-showreferences-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signature-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signature-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signature-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signaturetimestamp-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signaturetimestamp-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signaturetimestamp-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ulist-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ulist-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ulist-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-xlink-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-xlink-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-xlink-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-heading-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-heading-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-heading-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-discussion'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-file'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-format'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-heading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-link'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-list'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-reference'),('ext.wikiEditor.toolbar','wikieditor-toolbar-loading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-section-advanced'),('ext.wikiEditor.toolbar','wikieditor-toolbar-section-characters'),('ext.wikiEditor.toolbar','wikieditor-toolbar-section-help'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-big'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-big-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-bold'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-bold-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-file'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-file-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-file-pre'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-gallery'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-gallery-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-1'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-2'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-3'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-4'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-5'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ilink'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ilink-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-indent'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-indent-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-italic'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-italic-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-cancel'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-empty'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-ext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-ext-target'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-ext-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-invalid'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-exists'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-external'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-invalid'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-loading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-notexists'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-tooltip'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-text-tooltip'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-lookslikeinternal'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-lookslikeinternal-ext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-lookslikeinternal-int'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-newline'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-nowiki'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-nowiki-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-olist'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-olist-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-redirect'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-redirect-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-cancel'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-button-findnext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-button-replaceall'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-button-replacenext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-case'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-close'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-emptysearch'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-invalidregex'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-nomatch'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-regex'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-replace'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-search'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-success'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-signature'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-small'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-small-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-subscript'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-subscript-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-superscript'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-superscript-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-cancel'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-dimensions-columns'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-dimensions-header'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-dimensions-rows'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-cell-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-header'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-old'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-invalidnumber'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-sortable'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-toomany'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-wikitable'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-zero'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ulist'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ulist-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-xlink'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-xlink-example'),('jquery.wikiEditor','wikieditor-wikitext-tab');
-/*!40000 ALTER TABLE `mw_msg_resource_links` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_objectcache`
---
-
-DROP TABLE IF EXISTS `mw_objectcache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_objectcache` (
- `keyname` varbinary(255) NOT NULL DEFAULT '',
- `value` mediumblob,
- `exptime` datetime DEFAULT NULL,
- PRIMARY KEY (`keyname`),
- KEY `exptime` (`exptime`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_objectcache`
---
-
-LOCK TABLES `mw_objectcache` WRITE;
-/*!40000 ALTER TABLE `mw_objectcache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_objectcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_oldimage`
---
-
-DROP TABLE IF EXISTS `mw_oldimage`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_oldimage` (
- `oi_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `oi_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `oi_size` int(10) unsigned NOT NULL DEFAULT '0',
- `oi_width` int(11) NOT NULL DEFAULT '0',
- `oi_height` int(11) NOT NULL DEFAULT '0',
- `oi_bits` int(11) NOT NULL DEFAULT '0',
- `oi_description` tinyblob NOT NULL,
- `oi_user` int(10) unsigned NOT NULL DEFAULT '0',
- `oi_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `oi_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `oi_metadata` mediumblob NOT NULL,
- `oi_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
- `oi_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
- `oi_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
- `oi_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `oi_sha1` varbinary(32) NOT NULL DEFAULT '',
- KEY `oi_usertext_timestamp` (`oi_user_text`,`oi_timestamp`),
- KEY `oi_name_timestamp` (`oi_name`,`oi_timestamp`),
- KEY `oi_name_archive_name` (`oi_name`,`oi_archive_name`(14)),
- KEY `oi_sha1` (`oi_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_oldimage`
---
-
-LOCK TABLES `mw_oldimage` WRITE;
-/*!40000 ALTER TABLE `mw_oldimage` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_oldimage` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page`
---
-
-DROP TABLE IF EXISTS `mw_page`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page` (
- `page_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `page_namespace` int(11) NOT NULL,
- `page_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `page_restrictions` tinyblob NOT NULL,
- `page_counter` bigint(20) unsigned NOT NULL DEFAULT '0',
- `page_is_redirect` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `page_is_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `page_random` double unsigned NOT NULL,
- `page_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `page_latest` int(10) unsigned NOT NULL,
- `page_len` int(10) unsigned NOT NULL,
- PRIMARY KEY (`page_id`),
- UNIQUE KEY `name_title` (`page_namespace`,`page_title`),
- KEY `page_random` (`page_random`),
- KEY `page_len` (`page_len`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page`
---
-
-LOCK TABLES `mw_page` WRITE;
-/*!40000 ALTER TABLE `mw_page` DISABLE KEYS */;
-INSERT INTO `mw_page` VALUES (1,0,'Main_Page','',3,0,1,0.045389076294,'20110107184113',1,438),(2,0,'TestResources','',0,0,1,0.227355086893,'20110110173217',2,57);
-/*!40000 ALTER TABLE `mw_page` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_props`
---
-
-DROP TABLE IF EXISTS `mw_page_props`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_props` (
- `pp_page` int(11) NOT NULL,
- `pp_propname` varbinary(60) NOT NULL,
- `pp_value` blob NOT NULL,
- UNIQUE KEY `pp_page_propname` (`pp_page`,`pp_propname`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_props`
---
-
-LOCK TABLES `mw_page_props` WRITE;
-/*!40000 ALTER TABLE `mw_page_props` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_props` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_restrictions`
---
-
-DROP TABLE IF EXISTS `mw_page_restrictions`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_restrictions` (
- `pr_page` int(11) NOT NULL,
- `pr_type` varbinary(60) NOT NULL,
- `pr_level` varbinary(60) NOT NULL,
- `pr_cascade` tinyint(4) NOT NULL,
- `pr_user` int(11) DEFAULT NULL,
- `pr_expiry` varbinary(14) DEFAULT NULL,
- `pr_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- PRIMARY KEY (`pr_id`),
- UNIQUE KEY `pr_pagetype` (`pr_page`,`pr_type`),
- KEY `pr_typelevel` (`pr_type`,`pr_level`),
- KEY `pr_level` (`pr_level`),
- KEY `pr_cascade` (`pr_cascade`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_restrictions`
---
-
-LOCK TABLES `mw_page_restrictions` WRITE;
-/*!40000 ALTER TABLE `mw_page_restrictions` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_restrictions` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_pagelinks`
---
-
-DROP TABLE IF EXISTS `mw_pagelinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_pagelinks` (
- `pl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `pl_namespace` int(11) NOT NULL DEFAULT '0',
- `pl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `pl_from` (`pl_from`,`pl_namespace`,`pl_title`),
- UNIQUE KEY `pl_namespace` (`pl_namespace`,`pl_title`,`pl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_pagelinks`
---
-
-LOCK TABLES `mw_pagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_pagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_pagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_protected_titles`
---
-
-DROP TABLE IF EXISTS `mw_protected_titles`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_protected_titles` (
- `pt_namespace` int(11) NOT NULL,
- `pt_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `pt_user` int(10) unsigned NOT NULL,
- `pt_reason` tinyblob,
- `pt_timestamp` binary(14) NOT NULL,
- `pt_expiry` varbinary(14) NOT NULL DEFAULT '',
- `pt_create_perm` varbinary(60) NOT NULL,
- UNIQUE KEY `pt_namespace_title` (`pt_namespace`,`pt_title`),
- KEY `pt_timestamp` (`pt_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_protected_titles`
---
-
-LOCK TABLES `mw_protected_titles` WRITE;
-/*!40000 ALTER TABLE `mw_protected_titles` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_protected_titles` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache`
---
-
-DROP TABLE IF EXISTS `mw_querycache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache` (
- `qc_type` varbinary(32) NOT NULL,
- `qc_value` int(10) unsigned NOT NULL DEFAULT '0',
- `qc_namespace` int(11) NOT NULL DEFAULT '0',
- `qc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- KEY `qc_type` (`qc_type`,`qc_value`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache`
---
-
-LOCK TABLES `mw_querycache` WRITE;
-/*!40000 ALTER TABLE `mw_querycache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache_info`
---
-
-DROP TABLE IF EXISTS `mw_querycache_info`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache_info` (
- `qci_type` varbinary(32) NOT NULL DEFAULT '',
- `qci_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
- UNIQUE KEY `qci_type` (`qci_type`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache_info`
---
-
-LOCK TABLES `mw_querycache_info` WRITE;
-/*!40000 ALTER TABLE `mw_querycache_info` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache_info` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycachetwo`
---
-
-DROP TABLE IF EXISTS `mw_querycachetwo`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycachetwo` (
- `qcc_type` varbinary(32) NOT NULL,
- `qcc_value` int(10) unsigned NOT NULL DEFAULT '0',
- `qcc_namespace` int(11) NOT NULL DEFAULT '0',
- `qcc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `qcc_namespacetwo` int(11) NOT NULL DEFAULT '0',
- `qcc_titletwo` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- KEY `qcc_type` (`qcc_type`,`qcc_value`),
- KEY `qcc_title` (`qcc_type`,`qcc_namespace`,`qcc_title`),
- KEY `qcc_titletwo` (`qcc_type`,`qcc_namespacetwo`,`qcc_titletwo`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycachetwo`
---
-
-LOCK TABLES `mw_querycachetwo` WRITE;
-/*!40000 ALTER TABLE `mw_querycachetwo` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycachetwo` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_recentchanges`
---
-
-DROP TABLE IF EXISTS `mw_recentchanges`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_recentchanges` (
- `rc_id` int(11) NOT NULL AUTO_INCREMENT,
- `rc_timestamp` varbinary(14) NOT NULL DEFAULT '',
- `rc_cur_time` varbinary(14) NOT NULL DEFAULT '',
- `rc_user` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `rc_namespace` int(11) NOT NULL DEFAULT '0',
- `rc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rc_comment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rc_minor` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_bot` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_cur_id` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_this_oldid` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_last_oldid` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_type` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_moved_to_ns` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_moved_to_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rc_patrolled` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_ip` varbinary(40) NOT NULL DEFAULT '',
- `rc_old_len` int(11) DEFAULT NULL,
- `rc_new_len` int(11) DEFAULT NULL,
- `rc_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_logid` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_log_type` varbinary(255) DEFAULT NULL,
- `rc_log_action` varbinary(255) DEFAULT NULL,
- `rc_params` blob,
- PRIMARY KEY (`rc_id`),
- KEY `rc_timestamp` (`rc_timestamp`),
- KEY `rc_namespace_title` (`rc_namespace`,`rc_title`),
- KEY `rc_cur_id` (`rc_cur_id`),
- KEY `new_name_timestamp` (`rc_new`,`rc_namespace`,`rc_timestamp`),
- KEY `rc_ip` (`rc_ip`),
- KEY `rc_ns_usertext` (`rc_namespace`,`rc_user_text`),
- KEY `rc_user_text` (`rc_user_text`,`rc_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_recentchanges`
---
-
-LOCK TABLES `mw_recentchanges` WRITE;
-/*!40000 ALTER TABLE `mw_recentchanges` DISABLE KEYS */;
-INSERT INTO `mw_recentchanges` VALUES (1,'20110107184113','20110107184113',0,'MediaWiki Default',0,'Main_Page','',0,0,1,1,1,0,1,0,'',0,'::1',0,438,0,0,NULL,'',''),(2,'20110110173131','20110110173131',1,'WikiSysop',0,'TestResources','Created page with \"Test the the SimpleSelenium database was loaded correctly\"',0,0,1,2,2,0,1,0,'',1,'::1',0,57,0,0,NULL,'','');
-/*!40000 ALTER TABLE `mw_recentchanges` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_redirect`
---
-
-DROP TABLE IF EXISTS `mw_redirect`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_redirect` (
- `rd_from` int(10) unsigned NOT NULL DEFAULT '0',
- `rd_namespace` int(11) NOT NULL DEFAULT '0',
- `rd_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rd_interwiki` varchar(32) DEFAULT NULL,
- `rd_fragment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
- PRIMARY KEY (`rd_from`),
- KEY `rd_ns_title` (`rd_namespace`,`rd_title`,`rd_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_redirect`
---
-
-LOCK TABLES `mw_redirect` WRITE;
-/*!40000 ALTER TABLE `mw_redirect` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_redirect` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_revision`
---
-
-DROP TABLE IF EXISTS `mw_revision`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_revision` (
- `rev_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `rev_page` int(10) unsigned NOT NULL,
- `rev_text_id` int(10) unsigned NOT NULL,
- `rev_comment` tinyblob NOT NULL,
- `rev_user` int(10) unsigned NOT NULL DEFAULT '0',
- `rev_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rev_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `rev_minor_edit` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rev_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rev_len` int(10) unsigned DEFAULT NULL,
- `rev_parent_id` int(10) unsigned DEFAULT NULL,
- PRIMARY KEY (`rev_id`),
- UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`),
- KEY `rev_timestamp` (`rev_timestamp`),
- KEY `page_timestamp` (`rev_page`,`rev_timestamp`),
- KEY `user_timestamp` (`rev_user`,`rev_timestamp`),
- KEY `usertext_timestamp` (`rev_user_text`,`rev_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_revision`
---
-
-LOCK TABLES `mw_revision` WRITE;
-/*!40000 ALTER TABLE `mw_revision` DISABLE KEYS */;
-INSERT INTO `mw_revision` VALUES (1,1,1,'',0,'MediaWiki Default','20110107184113',0,0,438,0),(2,2,2,'Created page with \"Test the the SimpleSelenium database was loaded correctly\"',1,'WikiSysop','20110110173131',0,0,57,0);
-/*!40000 ALTER TABLE `mw_revision` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_searchindex`
---
-
-DROP TABLE IF EXISTS `mw_searchindex`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_searchindex` (
- `si_page` int(10) unsigned NOT NULL,
- `si_title` varchar(255) NOT NULL DEFAULT '',
- `si_text` mediumtext NOT NULL,
- UNIQUE KEY `si_page` (`si_page`),
- FULLTEXT KEY `si_title` (`si_title`),
- FULLTEXT KEY `si_text` (`si_text`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_searchindex`
---
-
-LOCK TABLES `mw_searchindex` WRITE;
-/*!40000 ALTER TABLE `mw_searchindex` DISABLE KEYS */;
-INSERT INTO `mw_searchindex` VALUES (1,'main page',' mediawiki hasu800 been successfully installed. consult theu800 user user\'su800 guide foru800 information onu800 using theu800 wiki software. getting started getting started getting started configuration settings list mediawiki faqu800 mediawiki release mailing list '),(2,'testresources',' test theu800 theu800 simpleselenium database wasu800 loaded correctly ');
-/*!40000 ALTER TABLE `mw_searchindex` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_site_stats`
---
-
-DROP TABLE IF EXISTS `mw_site_stats`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_site_stats` (
- `ss_row_id` int(10) unsigned NOT NULL,
- `ss_total_views` bigint(20) unsigned DEFAULT '0',
- `ss_total_edits` bigint(20) unsigned DEFAULT '0',
- `ss_good_articles` bigint(20) unsigned DEFAULT '0',
- `ss_total_pages` bigint(20) DEFAULT '-1',
- `ss_users` bigint(20) DEFAULT '-1',
- `ss_active_users` bigint(20) DEFAULT '-1',
- `ss_admins` int(11) DEFAULT '-1',
- `ss_images` int(11) DEFAULT '0',
- UNIQUE KEY `ss_row_id` (`ss_row_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_site_stats`
---
-
-LOCK TABLES `mw_site_stats` WRITE;
-/*!40000 ALTER TABLE `mw_site_stats` DISABLE KEYS */;
-INSERT INTO `mw_site_stats` VALUES (1,3,2,1,2,1,-1,-1,0);
-/*!40000 ALTER TABLE `mw_site_stats` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_tag_summary`
---
-
-DROP TABLE IF EXISTS `mw_tag_summary`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_tag_summary` (
- `ts_rc_id` int(11) DEFAULT NULL,
- `ts_log_id` int(11) DEFAULT NULL,
- `ts_rev_id` int(11) DEFAULT NULL,
- `ts_tags` blob NOT NULL,
- UNIQUE KEY `tag_summary_rc_id` (`ts_rc_id`),
- UNIQUE KEY `tag_summary_log_id` (`ts_log_id`),
- UNIQUE KEY `tag_summary_rev_id` (`ts_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_tag_summary`
---
-
-LOCK TABLES `mw_tag_summary` WRITE;
-/*!40000 ALTER TABLE `mw_tag_summary` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_tag_summary` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_templatelinks`
---
-
-DROP TABLE IF EXISTS `mw_templatelinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_templatelinks` (
- `tl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `tl_namespace` int(11) NOT NULL DEFAULT '0',
- `tl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `tl_from` (`tl_from`,`tl_namespace`,`tl_title`),
- UNIQUE KEY `tl_namespace` (`tl_namespace`,`tl_title`,`tl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_templatelinks`
---
-
-LOCK TABLES `mw_templatelinks` WRITE;
-/*!40000 ALTER TABLE `mw_templatelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_templatelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_text`
---
-
-DROP TABLE IF EXISTS `mw_text`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_text` (
- `old_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `old_text` mediumblob NOT NULL,
- `old_flags` tinyblob NOT NULL,
- PRIMARY KEY (`old_id`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_text`
---
-
-LOCK TABLES `mw_text` WRITE;
-/*!40000 ALTER TABLE `mw_text` DISABLE KEYS */;
-INSERT INTO `mw_text` VALUES (1,'\'\'\'MediaWiki has been successfully installed.\'\'\'\n\nConsult the [http://meta.wikimedia.org/wiki/Help:Contents User\'s Guide] for information on using the wiki software.\n\n== Getting started ==\n* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]','utf-8'),(2,'Test the the SimpleSelenium database was loaded correctly','utf-8');
-/*!40000 ALTER TABLE `mw_text` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_trackbacks`
---
-
-DROP TABLE IF EXISTS `mw_trackbacks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_trackbacks` (
- `tb_id` int(11) NOT NULL AUTO_INCREMENT,
- `tb_page` int(11) DEFAULT NULL,
- `tb_title` varchar(255) NOT NULL,
- `tb_url` blob NOT NULL,
- `tb_ex` text,
- `tb_name` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`tb_id`),
- KEY `tb_page` (`tb_page`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_trackbacks`
---
-
-LOCK TABLES `mw_trackbacks` WRITE;
-/*!40000 ALTER TABLE `mw_trackbacks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_trackbacks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_transcache`
---
-
-DROP TABLE IF EXISTS `mw_transcache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_transcache` (
- `tc_url` varbinary(255) NOT NULL,
- `tc_contents` text,
- `tc_time` binary(14) DEFAULT NULL,
- UNIQUE KEY `tc_url_idx` (`tc_url`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_transcache`
---
-
-LOCK TABLES `mw_transcache` WRITE;
-/*!40000 ALTER TABLE `mw_transcache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_transcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_updatelog`
---
-
-DROP TABLE IF EXISTS `mw_updatelog`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_updatelog` (
- `ul_key` varchar(255) NOT NULL,
- `ul_value` blob,
- PRIMARY KEY (`ul_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_updatelog`
---
-
-LOCK TABLES `mw_updatelog` WRITE;
-/*!40000 ALTER TABLE `mw_updatelog` DISABLE KEYS */;
-INSERT INTO `mw_updatelog` VALUES ('cl_fields_update',NULL),('convert transcache field',NULL),('mime_minor_length',NULL),('populate category',NULL),('populate rev_len',NULL),('populate rev_parent_id',NULL),('updatelist-1.18alpha-1294425799','a:128:{i:0;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:6:\"ipb_id\";i:3;s:18:\"patch-ipblocks.sql\";}i:1;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:10:\"ipb_expiry\";i:3;s:20:\"patch-ipb_expiry.sql\";}i:2;a:1:{i:0;s:17:\"doInterwikiUpdate\";}i:3;a:1:{i:0;s:13:\"doIndexUpdate\";}i:4;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"hitcounter\";i:2;s:20:\"patch-hitcounter.sql\";}i:5;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:7:\"rc_type\";i:3;s:17:\"patch-rc_type.sql\";}i:6;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:14:\"user_real_name\";i:3;s:23:\"patch-user-realname.sql\";}i:7;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"querycache\";i:2;s:20:\"patch-querycache.sql\";}i:8;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"objectcache\";i:2;s:21:\"patch-objectcache.sql\";}i:9;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"categorylinks\";i:2;s:23:\"patch-categorylinks.sql\";}i:10;a:1:{i:0;s:16:\"doOldLinksUpdate\";}i:11;a:1:{i:0;s:22:\"doFixAncientImagelinks\";}i:12;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:5:\"rc_ip\";i:3;s:15:\"patch-rc_ip.sql\";}i:13;a:4:{i:0;s:8:\"addIndex\";i:1;s:5:\"image\";i:2;s:7:\"PRIMARY\";i:3;s:28:\"patch-image_name_primary.sql\";}i:14;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:5:\"rc_id\";i:3;s:15:\"patch-rc_id.sql\";}i:15;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:12:\"rc_patrolled\";i:3;s:19:\"patch-rc-patrol.sql\";}i:16;a:3:{i:0;s:8:\"addTable\";i:1;s:7:\"logging\";i:2;s:17:\"patch-logging.sql\";}i:17;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:10:\"user_token\";i:3;s:20:\"patch-user_token.sql\";}i:18;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"watchlist\";i:2;s:24:\"wl_notificationtimestamp\";i:3;s:28:\"patch-email-notification.sql\";}i:19;a:1:{i:0;s:17:\"doWatchlistUpdate\";}i:20;a:4:{i:0;s:9:\"dropField\";i:1;s:4:\"user\";i:2;s:33:\"user_emailauthenticationtimestamp\";i:3;s:30:\"patch-email-authentication.sql\";}i:21;a:1:{i:0;s:21:\"doSchemaRestructuring\";}i:22;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:10:\"log_params\";i:3;s:20:\"patch-log_params.sql\";}i:23;a:4:{i:0;s:8:\"checkBin\";i:1;s:7:\"logging\";i:2;s:9:\"log_title\";i:3;s:23:\"patch-logging-title.sql\";}i:24;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:9:\"ar_rev_id\";i:3;s:24:\"patch-archive-rev_id.sql\";}i:25;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"page\";i:2;s:8:\"page_len\";i:3;s:18:\"patch-page_len.sql\";}i:26;a:4:{i:0;s:9:\"dropField\";i:1;s:8:\"revision\";i:2;s:17:\"inverse_timestamp\";i:3;s:27:\"patch-inverse_timestamp.sql\";}i:27;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:11:\"rev_text_id\";i:3;s:21:\"patch-rev_text_id.sql\";}i:28;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:11:\"rev_deleted\";i:3;s:21:\"patch-rev_deleted.sql\";}i:29;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:9:\"img_width\";i:3;s:19:\"patch-img_width.sql\";}i:30;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:12:\"img_metadata\";i:3;s:22:\"patch-img_metadata.sql\";}i:31;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:16:\"user_email_token\";i:3;s:26:\"patch-user_email_token.sql\";}i:32;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:10:\"ar_text_id\";i:3;s:25:\"patch-archive-text_id.sql\";}i:33;a:1:{i:0;s:15:\"doNamespaceSize\";}i:34;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:14:\"img_media_type\";i:3;s:24:\"patch-img_media_type.sql\";}i:35;a:1:{i:0;s:17:\"doPagelinksUpdate\";}i:36;a:4:{i:0;s:9:\"dropField\";i:1;s:5:\"image\";i:2;s:8:\"img_type\";i:3;s:23:\"patch-drop_img_type.sql\";}i:37;a:1:{i:0;s:18:\"doUserUniqueUpdate\";}i:38;a:1:{i:0;s:18:\"doUserGroupsUpdate\";}i:39;a:4:{i:0;s:8:\"addField\";i:1;s:10:\"site_stats\";i:2;s:14:\"ss_total_pages\";i:3;s:27:\"patch-ss_total_articles.sql\";}i:40;a:3:{i:0;s:8:\"addTable\";i:1;s:12:\"user_newtalk\";i:2;s:22:\"patch-usernewtalk2.sql\";}i:41;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"transcache\";i:2;s:20:\"patch-transcache.sql\";}i:42;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"interwiki\";i:2;s:8:\"iw_trans\";i:3;s:25:\"patch-interwiki-trans.sql\";}i:43;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"trackbacks\";i:2;s:20:\"patch-trackbacks.sql\";}i:44;a:1:{i:0;s:15:\"doWatchlistNull\";}i:45;a:4:{i:0;s:8:\"addIndex\";i:1;s:7:\"logging\";i:2;s:5:\"times\";i:3;s:29:\"patch-logging-times-index.sql\";}i:46;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:15:\"ipb_range_start\";i:3;s:25:\"patch-ipb_range_start.sql\";}i:47;a:1:{i:0;s:18:\"doPageRandomUpdate\";}i:48;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:17:\"user_registration\";i:3;s:27:\"patch-user_registration.sql\";}i:49;a:1:{i:0;s:21:\"doTemplatelinksUpdate\";}i:50;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"externallinks\";i:2;s:23:\"patch-externallinks.sql\";}i:51;a:3:{i:0;s:8:\"addTable\";i:1;s:3:\"job\";i:2;s:13:\"patch-job.sql\";}i:52;a:4:{i:0;s:8:\"addField\";i:1;s:10:\"site_stats\";i:2;s:9:\"ss_images\";i:3;s:19:\"patch-ss_images.sql\";}i:53;a:3:{i:0;s:8:\"addTable\";i:1;s:9:\"langlinks\";i:2;s:19:\"patch-langlinks.sql\";}i:54;a:3:{i:0;s:8:\"addTable\";i:1;s:15:\"querycache_info\";i:2;s:24:\"patch-querycacheinfo.sql\";}i:55;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"filearchive\";i:2;s:21:\"patch-filearchive.sql\";}i:56;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:13:\"ipb_anon_only\";i:3;s:23:\"patch-ipb_anon_only.sql\";}i:57;a:4:{i:0;s:8:\"addIndex\";i:1;s:13:\"recentchanges\";i:2;s:14:\"rc_ns_usertext\";i:3;s:31:\"patch-recentchanges-utindex.sql\";}i:58;a:4:{i:0;s:8:\"addIndex\";i:1;s:13:\"recentchanges\";i:2;s:12:\"rc_user_text\";i:3;s:28:\"patch-rc_user_text-index.sql\";}i:59;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:17:\"user_newpass_time\";i:3;s:27:\"patch-user_newpass_time.sql\";}i:60;a:3:{i:0;s:8:\"addTable\";i:1;s:8:\"redirect\";i:2;s:18:\"patch-redirect.sql\";}i:61;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"querycachetwo\";i:2;s:23:\"patch-querycachetwo.sql\";}i:62;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:20:\"ipb_enable_autoblock\";i:3;s:32:\"patch-ipb_optional_autoblock.sql\";}i:63;a:1:{i:0;s:26:\"doBacklinkingIndicesUpdate\";}i:64;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:10:\"rc_old_len\";i:3;s:16:\"patch-rc_len.sql\";}i:65;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:14:\"user_editcount\";i:3;s:24:\"patch-user_editcount.sql\";}i:66;a:1:{i:0;s:20:\"doRestrictionsUpdate\";}i:67;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:6:\"log_id\";i:3;s:16:\"patch-log_id.sql\";}i:68;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:13:\"rev_parent_id\";i:3;s:23:\"patch-rev_parent_id.sql\";}i:69;a:4:{i:0;s:8:\"addField\";i:1;s:17:\"page_restrictions\";i:2;s:5:\"pr_id\";i:3;s:35:\"patch-page_restrictions_sortkey.sql\";}i:70;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:7:\"rev_len\";i:3;s:17:\"patch-rev_len.sql\";}i:71;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:10:\"rc_deleted\";i:3;s:20:\"patch-rc_deleted.sql\";}i:72;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:11:\"log_deleted\";i:3;s:21:\"patch-log_deleted.sql\";}i:73;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:10:\"ar_deleted\";i:3;s:20:\"patch-ar_deleted.sql\";}i:74;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:11:\"ipb_deleted\";i:3;s:21:\"patch-ipb_deleted.sql\";}i:75;a:4:{i:0;s:8:\"addField\";i:1;s:11:\"filearchive\";i:2;s:10:\"fa_deleted\";i:3;s:20:\"patch-fa_deleted.sql\";}i:76;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:6:\"ar_len\";i:3;s:16:\"patch-ar_len.sql\";}i:77;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:15:\"ipb_block_email\";i:3;s:22:\"patch-ipb_emailban.sql\";}i:78;a:1:{i:0;s:28:\"doCategorylinksIndicesUpdate\";}i:79;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"oldimage\";i:2;s:11:\"oi_metadata\";i:3;s:21:\"patch-oi_metadata.sql\";}i:80;a:4:{i:0;s:8:\"addIndex\";i:1;s:7:\"archive\";i:2;s:18:\"usertext_timestamp\";i:3;s:28:\"patch-archive-user-index.sql\";}i:81;a:4:{i:0;s:8:\"addIndex\";i:1;s:5:\"image\";i:2;s:22:\"img_usertext_timestamp\";i:3;s:26:\"patch-image-user-index.sql\";}i:82;a:4:{i:0;s:8:\"addIndex\";i:1;s:8:\"oldimage\";i:2;s:21:\"oi_usertext_timestamp\";i:3;s:29:\"patch-oldimage-user-index.sql\";}i:83;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:10:\"ar_page_id\";i:3;s:25:\"patch-archive-page_id.sql\";}i:84;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:8:\"img_sha1\";i:3;s:18:\"patch-img_sha1.sql\";}i:85;a:3:{i:0;s:8:\"addTable\";i:1;s:16:\"protected_titles\";i:2;s:26:\"patch-protected_titles.sql\";}i:86;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:11:\"ipb_by_text\";i:3;s:21:\"patch-ipb_by_text.sql\";}i:87;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"page_props\";i:2;s:20:\"patch-page_props.sql\";}i:88;a:3:{i:0;s:8:\"addTable\";i:1;s:9:\"updatelog\";i:2;s:19:\"patch-updatelog.sql\";}i:89;a:3:{i:0;s:8:\"addTable\";i:1;s:8:\"category\";i:2;s:18:\"patch-category.sql\";}i:90;a:1:{i:0;s:20:\"doCategoryPopulation\";}i:91;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:12:\"ar_parent_id\";i:3;s:22:\"patch-ar_parent_id.sql\";}i:92;a:4:{i:0;s:8:\"addField\";i:1;s:12:\"user_newtalk\";i:2;s:19:\"user_last_timestamp\";i:3;s:29:\"patch-user_last_timestamp.sql\";}i:93;a:1:{i:0;s:18:\"doPopulateParentId\";}i:94;a:4:{i:0;s:8:\"checkBin\";i:1;s:16:\"protected_titles\";i:2;s:8:\"pt_title\";i:3;s:27:\"patch-pt_title-encoding.sql\";}i:95;a:1:{i:0;s:28:\"doMaybeProfilingMemoryUpdate\";}i:96;a:1:{i:0;s:26:\"doFilearchiveIndicesUpdate\";}i:97;a:4:{i:0;s:8:\"addField\";i:1;s:10:\"site_stats\";i:2;s:15:\"ss_active_users\";i:3;s:25:\"patch-ss_active_users.sql\";}i:98;a:1:{i:0;s:17:\"doActiveUsersInit\";}i:99;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:18:\"ipb_allow_usertalk\";i:3;s:28:\"patch-ipb_allow_usertalk.sql\";}i:100;a:1:{i:0;s:14:\"doUniquePlTlIl\";}i:101;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"change_tag\";i:2;s:20:\"patch-change_tag.sql\";}i:102;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"tag_summary\";i:2;s:20:\"patch-change_tag.sql\";}i:103;a:3:{i:0;s:8:\"addTable\";i:1;s:9:\"valid_tag\";i:2;s:20:\"patch-change_tag.sql\";}i:104;a:3:{i:0;s:8:\"addTable\";i:1;s:15:\"user_properties\";i:2;s:25:\"patch-user_properties.sql\";}i:105;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"log_search\";i:2;s:20:\"patch-log_search.sql\";}i:106;a:1:{i:0;s:21:\"doLogSearchPopulation\";}i:107;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:13:\"log_user_text\";i:3;s:23:\"patch-log_user_text.sql\";}i:108;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"l10n_cache\";i:2;s:20:\"patch-l10n_cache.sql\";}i:109;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"external_user\";i:2;s:23:\"patch-external_user.sql\";}i:110;a:4:{i:0;s:8:\"addIndex\";i:1;s:10:\"log_search\";i:2;s:12:\"ls_field_val\";i:3;s:33:\"patch-log_search-rename-index.sql\";}i:111;a:4:{i:0;s:8:\"addIndex\";i:1;s:10:\"change_tag\";i:2;s:17:\"change_tag_rc_tag\";i:3;s:28:\"patch-change_tag-indexes.sql\";}i:112;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"redirect\";i:2;s:12:\"rd_interwiki\";i:3;s:22:\"patch-rd_interwiki.sql\";}i:113;a:1:{i:0;s:23:\"doUpdateTranscacheField\";}i:114;a:1:{i:0;s:14:\"renameEuWikiId\";}i:115;a:1:{i:0;s:22:\"doUpdateMimeMinorField\";}i:116;a:1:{i:0;s:16:\"doPopulateRevLen\";}i:117;a:3:{i:0;s:8:\"addTable\";i:1;s:7:\"iwlinks\";i:2;s:17:\"patch-iwlinks.sql\";}i:118;a:4:{i:0;s:8:\"addIndex\";i:1;s:7:\"iwlinks\";i:2;s:21:\"iwl_prefix_title_from\";i:3;s:27:\"patch-rename-iwl_prefix.sql\";}i:119;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"updatelog\";i:2;s:8:\"ul_value\";i:3;s:18:\"patch-ul_value.sql\";}i:120;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"interwiki\";i:2;s:6:\"iw_api\";i:3;s:27:\"patch-iw_api_and_wikiid.sql\";}i:121;a:4:{i:0;s:9:\"dropIndex\";i:1;s:7:\"iwlinks\";i:2;s:10:\"iwl_prefix\";i:3;s:25:\"patch-kill-iwl_prefix.sql\";}i:122;a:4:{i:0;s:9:\"dropIndex\";i:1;s:7:\"iwlinks\";i:2;s:21:\"iwl_prefix_from_title\";i:3;s:22:\"patch-kill-iwl_pft.sql\";}i:123;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"categorylinks\";i:2;s:12:\"cl_collation\";i:3;s:40:\"patch-categorylinks-better-collation.sql\";}i:124;a:1:{i:0;s:16:\"doClFieldsUpdate\";}i:125;a:1:{i:0;s:17:\"doCollationUpdate\";}i:126;a:3:{i:0;s:8:\"addTable\";i:1;s:12:\"msg_resource\";i:2;s:22:\"patch-msg_resource.sql\";}i:127;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"module_deps\";i:2;s:21:\"patch-module_deps.sql\";}}');
-/*!40000 ALTER TABLE `mw_updatelog` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user`
---
-
-DROP TABLE IF EXISTS `mw_user`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user` (
- `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `user_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `user_real_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `user_password` tinyblob NOT NULL,
- `user_newpassword` tinyblob NOT NULL,
- `user_newpass_time` binary(14) DEFAULT NULL,
- `user_email` tinytext NOT NULL,
- `user_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `user_token` binary(32) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `user_email_authenticated` binary(14) DEFAULT NULL,
- `user_email_token` binary(32) DEFAULT NULL,
- `user_email_token_expires` binary(14) DEFAULT NULL,
- `user_registration` binary(14) DEFAULT NULL,
- `user_editcount` int(11) DEFAULT NULL,
- PRIMARY KEY (`user_id`),
- UNIQUE KEY `user_name` (`user_name`),
- KEY `user_email_token` (`user_email_token`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user`
---
-
-LOCK TABLES `mw_user` WRITE;
-/*!40000 ALTER TABLE `mw_user` DISABLE KEYS */;
-INSERT INTO `mw_user` VALUES (1,'WikiSysop','',':B:9c595470:df2c1237ae75896744457e7dfbeb7f90','',NULL,'','','20110110173136','5e3b582786fa8150118cfa78f18de0c5',NULL,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,'20110107184113',1);
-/*!40000 ALTER TABLE `mw_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_groups`
---
-
-DROP TABLE IF EXISTS `mw_user_groups`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_groups` (
- `ug_user` int(10) unsigned NOT NULL DEFAULT '0',
- `ug_group` varbinary(16) NOT NULL DEFAULT '',
- UNIQUE KEY `ug_user_group` (`ug_user`,`ug_group`),
- KEY `ug_group` (`ug_group`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_groups`
---
-
-LOCK TABLES `mw_user_groups` WRITE;
-/*!40000 ALTER TABLE `mw_user_groups` DISABLE KEYS */;
-INSERT INTO `mw_user_groups` VALUES (1,'bureaucrat'),(1,'sysop');
-/*!40000 ALTER TABLE `mw_user_groups` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_newtalk`
---
-
-DROP TABLE IF EXISTS `mw_user_newtalk`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_newtalk` (
- `user_id` int(11) NOT NULL DEFAULT '0',
- `user_ip` varbinary(40) NOT NULL DEFAULT '',
- `user_last_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- KEY `user_id` (`user_id`),
- KEY `user_ip` (`user_ip`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_newtalk`
---
-
-LOCK TABLES `mw_user_newtalk` WRITE;
-/*!40000 ALTER TABLE `mw_user_newtalk` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_newtalk` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_properties`
---
-
-DROP TABLE IF EXISTS `mw_user_properties`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_properties` (
- `up_user` int(11) NOT NULL,
- `up_property` varbinary(32) NOT NULL,
- `up_value` blob,
- UNIQUE KEY `user_properties_user_property` (`up_user`,`up_property`),
- KEY `user_properties_property` (`up_property`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_properties`
---
-
-LOCK TABLES `mw_user_properties` WRITE;
-/*!40000 ALTER TABLE `mw_user_properties` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_properties` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_valid_tag`
---
-
-DROP TABLE IF EXISTS `mw_valid_tag`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_valid_tag` (
- `vt_tag` varchar(255) NOT NULL,
- PRIMARY KEY (`vt_tag`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_valid_tag`
---
-
-LOCK TABLES `mw_valid_tag` WRITE;
-/*!40000 ALTER TABLE `mw_valid_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_valid_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_watchlist`
---
-
-DROP TABLE IF EXISTS `mw_watchlist`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_watchlist` (
- `wl_user` int(10) unsigned NOT NULL,
- `wl_namespace` int(11) NOT NULL DEFAULT '0',
- `wl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `wl_notificationtimestamp` varbinary(14) DEFAULT NULL,
- UNIQUE KEY `wl_user` (`wl_user`,`wl_namespace`,`wl_title`),
- KEY `namespace_title` (`wl_namespace`,`wl_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_watchlist`
---
-
-LOCK TABLES `mw_watchlist` WRITE;
-/*!40000 ALTER TABLE `mw_watchlist` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_watchlist` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2011-01-10 9:34:34
diff --git a/tests/selenium/data/SimpleSeleniumTestImages.zip b/tests/selenium/data/SimpleSeleniumTestImages.zip
deleted file mode 100644
index 0374a1fb..00000000
--- a/tests/selenium/data/SimpleSeleniumTestImages.zip
+++ /dev/null
Binary files differ
diff --git a/tests/selenium/data/Wikipedia-logo-v2-de.png b/tests/selenium/data/Wikipedia-logo-v2-de.png
deleted file mode 100644
index 70385243..00000000
--- a/tests/selenium/data/Wikipedia-logo-v2-de.png
+++ /dev/null
Binary files differ
diff --git a/tests/selenium/data/mediawiki118_fresh_installation.sql b/tests/selenium/data/mediawiki118_fresh_installation.sql
deleted file mode 100644
index 7beb9e6a..00000000
--- a/tests/selenium/data/mediawiki118_fresh_installation.sql
+++ /dev/null
@@ -1,1543 +0,0 @@
--- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)
---
--- Host: localhost Database: test_wiki
--- ------------------------------------------------------
--- Server version 5.1.41
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `mw_archive`
---
-
-DROP TABLE IF EXISTS `mw_archive`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_archive` (
- `ar_namespace` int(11) NOT NULL DEFAULT '0',
- `ar_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `ar_text` mediumblob NOT NULL,
- `ar_comment` tinyblob NOT NULL,
- `ar_user` int(10) unsigned NOT NULL DEFAULT '0',
- `ar_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `ar_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `ar_minor_edit` tinyint(4) NOT NULL DEFAULT '0',
- `ar_flags` tinyblob NOT NULL,
- `ar_rev_id` int(10) unsigned DEFAULT NULL,
- `ar_text_id` int(10) unsigned DEFAULT NULL,
- `ar_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `ar_len` int(10) unsigned DEFAULT NULL,
- `ar_page_id` int(10) unsigned DEFAULT NULL,
- `ar_parent_id` int(10) unsigned DEFAULT NULL,
- KEY `name_title_timestamp` (`ar_namespace`,`ar_title`,`ar_timestamp`),
- KEY `usertext_timestamp` (`ar_user_text`,`ar_timestamp`),
- KEY `ar_page_revid` (`ar_namespace`,`ar_title`,`ar_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_archive`
---
-
-LOCK TABLES `mw_archive` WRITE;
-/*!40000 ALTER TABLE `mw_archive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_archive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_category`
---
-
-DROP TABLE IF EXISTS `mw_category`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_category` (
- `cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `cat_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `cat_pages` int(11) NOT NULL DEFAULT '0',
- `cat_subcats` int(11) NOT NULL DEFAULT '0',
- `cat_files` int(11) NOT NULL DEFAULT '0',
- `cat_hidden` tinyint(3) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`cat_id`),
- UNIQUE KEY `cat_title` (`cat_title`),
- KEY `cat_pages` (`cat_pages`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_category`
---
-
-LOCK TABLES `mw_category` WRITE;
-/*!40000 ALTER TABLE `mw_category` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_category` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_categorylinks`
---
-
-DROP TABLE IF EXISTS `mw_categorylinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_categorylinks` (
- `cl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `cl_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `cl_sortkey` varbinary(230) NOT NULL DEFAULT '',
- `cl_sortkey_prefix` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `cl_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- `cl_collation` varbinary(32) NOT NULL DEFAULT '',
- `cl_type` enum('page','subcat','file') NOT NULL DEFAULT 'page',
- UNIQUE KEY `cl_from` (`cl_from`,`cl_to`),
- KEY `cl_sortkey` (`cl_to`,`cl_type`,`cl_sortkey`,`cl_from`),
- KEY `cl_timestamp` (`cl_to`,`cl_timestamp`),
- KEY `cl_collation` (`cl_collation`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_categorylinks`
---
-
-LOCK TABLES `mw_categorylinks` WRITE;
-/*!40000 ALTER TABLE `mw_categorylinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_categorylinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_change_tag`
---
-
-DROP TABLE IF EXISTS `mw_change_tag`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_change_tag` (
- `ct_rc_id` int(11) DEFAULT NULL,
- `ct_log_id` int(11) DEFAULT NULL,
- `ct_rev_id` int(11) DEFAULT NULL,
- `ct_tag` varchar(255) NOT NULL,
- `ct_params` blob,
- UNIQUE KEY `change_tag_rc_tag` (`ct_rc_id`,`ct_tag`),
- UNIQUE KEY `change_tag_log_tag` (`ct_log_id`,`ct_tag`),
- UNIQUE KEY `change_tag_rev_tag` (`ct_rev_id`,`ct_tag`),
- KEY `change_tag_tag_id` (`ct_tag`,`ct_rc_id`,`ct_rev_id`,`ct_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_change_tag`
---
-
-LOCK TABLES `mw_change_tag` WRITE;
-/*!40000 ALTER TABLE `mw_change_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_change_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_external_user`
---
-
-DROP TABLE IF EXISTS `mw_external_user`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_external_user` (
- `eu_local_id` int(10) unsigned NOT NULL,
- `eu_external_id` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- PRIMARY KEY (`eu_local_id`),
- UNIQUE KEY `eu_external_id` (`eu_external_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_external_user`
---
-
-LOCK TABLES `mw_external_user` WRITE;
-/*!40000 ALTER TABLE `mw_external_user` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_external_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_externallinks`
---
-
-DROP TABLE IF EXISTS `mw_externallinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_externallinks` (
- `el_from` int(10) unsigned NOT NULL DEFAULT '0',
- `el_to` blob NOT NULL,
- `el_index` blob NOT NULL,
- KEY `el_from` (`el_from`,`el_to`(40)),
- KEY `el_to` (`el_to`(60),`el_from`),
- KEY `el_index` (`el_index`(60))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_externallinks`
---
-
-LOCK TABLES `mw_externallinks` WRITE;
-/*!40000 ALTER TABLE `mw_externallinks` DISABLE KEYS */;
-INSERT INTO `mw_externallinks` VALUES (1,'http://meta.wikimedia.org/wiki/Help:Contents','http://org.wikimedia.meta./wiki/Help:Contents');
-INSERT INTO `mw_externallinks` VALUES (1,'http://www.mediawiki.org/wiki/Manual:Configuration_settings','http://org.mediawiki.www./wiki/Manual:Configuration_settings');
-INSERT INTO `mw_externallinks` VALUES (1,'http://www.mediawiki.org/wiki/Manual:FAQ','http://org.mediawiki.www./wiki/Manual:FAQ');
-INSERT INTO `mw_externallinks` VALUES (1,'https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce','https://org.wikimedia.lists./mailman/listinfo/mediawiki-announce');
-/*!40000 ALTER TABLE `mw_externallinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_filearchive`
---
-
-DROP TABLE IF EXISTS `mw_filearchive`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_filearchive` (
- `fa_id` int(11) NOT NULL AUTO_INCREMENT,
- `fa_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `fa_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '',
- `fa_storage_group` varbinary(16) DEFAULT NULL,
- `fa_storage_key` varbinary(64) DEFAULT '',
- `fa_deleted_user` int(11) DEFAULT NULL,
- `fa_deleted_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `fa_deleted_reason` text,
- `fa_size` int(10) unsigned DEFAULT '0',
- `fa_width` int(11) DEFAULT '0',
- `fa_height` int(11) DEFAULT '0',
- `fa_metadata` mediumblob,
- `fa_bits` int(11) DEFAULT '0',
- `fa_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
- `fa_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') DEFAULT 'unknown',
- `fa_minor_mime` varbinary(100) DEFAULT 'unknown',
- `fa_description` tinyblob,
- `fa_user` int(10) unsigned DEFAULT '0',
- `fa_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
- `fa_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `fa_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`fa_id`),
- KEY `fa_name` (`fa_name`,`fa_timestamp`),
- KEY `fa_storage_group` (`fa_storage_group`,`fa_storage_key`),
- KEY `fa_deleted_timestamp` (`fa_deleted_timestamp`),
- KEY `fa_user_timestamp` (`fa_user_text`,`fa_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_filearchive`
---
-
-LOCK TABLES `mw_filearchive` WRITE;
-/*!40000 ALTER TABLE `mw_filearchive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_filearchive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_hitcounter`
---
-
-DROP TABLE IF EXISTS `mw_hitcounter`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_hitcounter` (
- `hc_id` int(10) unsigned NOT NULL
-) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=25000;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_hitcounter`
---
-
-LOCK TABLES `mw_hitcounter` WRITE;
-/*!40000 ALTER TABLE `mw_hitcounter` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_hitcounter` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_image`
---
-
-DROP TABLE IF EXISTS `mw_image`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_image` (
- `img_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `img_size` int(10) unsigned NOT NULL DEFAULT '0',
- `img_width` int(11) NOT NULL DEFAULT '0',
- `img_height` int(11) NOT NULL DEFAULT '0',
- `img_metadata` mediumblob NOT NULL,
- `img_bits` int(11) NOT NULL DEFAULT '0',
- `img_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
- `img_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
- `img_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
- `img_description` tinyblob NOT NULL,
- `img_user` int(10) unsigned NOT NULL DEFAULT '0',
- `img_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `img_timestamp` varbinary(14) NOT NULL DEFAULT '',
- `img_sha1` varbinary(32) NOT NULL DEFAULT '',
- PRIMARY KEY (`img_name`),
- KEY `img_usertext_timestamp` (`img_user_text`,`img_timestamp`),
- KEY `img_size` (`img_size`),
- KEY `img_timestamp` (`img_timestamp`),
- KEY `img_sha1` (`img_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_image`
---
-
-LOCK TABLES `mw_image` WRITE;
-/*!40000 ALTER TABLE `mw_image` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_image` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_imagelinks`
---
-
-DROP TABLE IF EXISTS `mw_imagelinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_imagelinks` (
- `il_from` int(10) unsigned NOT NULL DEFAULT '0',
- `il_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `il_from` (`il_from`,`il_to`),
- UNIQUE KEY `il_to` (`il_to`,`il_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_imagelinks`
---
-
-LOCK TABLES `mw_imagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_imagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_imagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_interwiki`
---
-
-DROP TABLE IF EXISTS `mw_interwiki`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_interwiki` (
- `iw_prefix` varchar(32) NOT NULL,
- `iw_url` blob NOT NULL,
- `iw_api` blob NOT NULL,
- `iw_wikiid` varchar(64) NOT NULL,
- `iw_local` tinyint(1) NOT NULL,
- `iw_trans` tinyint(4) NOT NULL DEFAULT '0',
- UNIQUE KEY `iw_prefix` (`iw_prefix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_interwiki`
---
-
-LOCK TABLES `mw_interwiki` WRITE;
-/*!40000 ALTER TABLE `mw_interwiki` DISABLE KEYS */;
-INSERT INTO `mw_interwiki` VALUES ('acronym','http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('advogato','http://www.advogato.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('annotationwiki','http://www.seedwiki.com/page.cfm?wikiid=368&doc=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('arxiv','http://www.arxiv.org/abs/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('c2find','http://c2.com/cgi/wiki?FindPage&value=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('cache','http://www.google.com/search?q=cache:$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('commons','http://commons.wikimedia.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('corpknowpedia','http://corpknowpedia.org/wiki/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('dictionary','http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('disinfopedia','http://www.disinfopedia.org/wiki.phtml?title=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('docbook','http://wiki.docbook.org/topic/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('doi','http://dx.doi.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('drumcorpswiki','http://www.drumcorpswiki.com/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('dwjwiki','http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('elibre','http://enciclopedia.us.es/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('emacswiki','http://www.emacswiki.org/cgi-bin/wiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('foldoc','http://foldoc.org/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('foxwiki','http://fox.wikis.com/wc.dll?Wiki~$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('freebsdman','http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('gej','http://www.esperanto.de/cgi-bin/aktivikio/wiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('gentoo-wiki','http://gentoo-wiki.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('google','http://www.google.com/search?q=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('googlegroups','http://groups.google.com/groups?q=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('hammondwiki','http://www.dairiki.org/HammondWiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('hewikisource','http://he.wikisource.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('hrwiki','http://www.hrwiki.org/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('imdb','http://us.imdb.com/Title?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('jargonfile','http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('jspwiki','http://www.jspwiki.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('keiki','http://kei.ki/en/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('kmwiki','http://kmwiki.wikispaces.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('linuxwiki','http://linuxwiki.de/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('lojban','http://www.lojban.org/tiki/tiki-index.php?page=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('lqwiki','http://wiki.linuxquestions.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('lugkr','http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mathsongswiki','http://SeedWiki.com/page.cfm?wikiid=237&doc=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('meatball','http://www.usemod.com/cgi-bin/mb.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mediawikiwiki','http://www.mediawiki.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mediazilla','https://bugzilla.wikimedia.org/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('memoryalpha','http://www.memory-alpha.org/en/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('metawiki','http://sunir.org/apps/meta.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('metawikimedia','http://meta.wikimedia.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('moinmoin','http://purl.net/wiki/moin/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mozillawiki','http://wiki.mozilla.org/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mw','http://www.mediawiki.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('oeis','http://www.research.att.com/cgi-bin/access.cgi/as/njas/sequences/eisA.cgi?Anum=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('openfacts','http://openfacts.berlios.de/index.phtml?title=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('openwiki','http://openwiki.com/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('pmeg','http://www.bertilow.com/pmeg/$1.php','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('ppr','http://c2.com/cgi/wiki?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('pythoninfo','http://wiki.python.org/moin/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('rfc','http://www.rfc-editor.org/rfc/rfc$1.txt','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('s23wiki','http://is-root.de/wiki/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('seattlewiki','http://seattle.wikia.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('seattlewireless','http://seattlewireless.net/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('senseislibrary','http://senseis.xmp.net/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('sourceforge','http://sourceforge.net/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('squeak','http://wiki.squeak.org/squeak/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('susning','http://www.susning.nu/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('svgwiki','http://wiki.svg.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tavi','http://tavi.sourceforge.net/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tejo','http://www.tejo.org/vikio/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('theopedia','http://www.theopedia.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tmbw','http://www.tmbw.net/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tmnet','http://www.technomanifestos.net/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tmwiki','http://www.EasyTopicMaps.com/?page=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('twiki','http://twiki.org/cgi-bin/view/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('uea','http://www.tejo.org/uea/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('unreal','http://wiki.beyondunreal.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('vinismo','http://vinismo.com/en/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('webseitzwiki','http://webseitz.fluxent.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('why','http://clublet.com/c/c/why?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wiki','http://c2.com/cgi/wiki?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikia','http://www.wikia.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikibooks','http://en.wikibooks.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikicities','http://www.wikia.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikif1','http://www.wikif1.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikihow','http://www.wikihow.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikimedia','http://wikimediafoundation.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikinews','http://en.wikinews.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikinfo','http://www.wikinfo.org/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikipedia','http://en.wikipedia.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikiquote','http://en.wikiquote.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikisource','http://wikisource.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikispecies','http://species.wikimedia.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikitravel','http://wikitravel.org/en/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikiversity','http://en.wikiversity.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikt','http://en.wiktionary.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wiktionary','http://en.wiktionary.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wlug','http://www.wlug.org.nz/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('zwiki','http://zwiki.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('zzz wiki','http://wiki.zzz.ee/index.php/$1','','',0,0);
-/*!40000 ALTER TABLE `mw_interwiki` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_ipblocks`
---
-
-DROP TABLE IF EXISTS `mw_ipblocks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_ipblocks` (
- `ipb_id` int(11) NOT NULL AUTO_INCREMENT,
- `ipb_address` tinyblob NOT NULL,
- `ipb_user` int(10) unsigned NOT NULL DEFAULT '0',
- `ipb_by` int(10) unsigned NOT NULL DEFAULT '0',
- `ipb_by_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `ipb_reason` tinyblob NOT NULL,
- `ipb_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `ipb_auto` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_anon_only` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_create_account` tinyint(1) NOT NULL DEFAULT '1',
- `ipb_enable_autoblock` tinyint(1) NOT NULL DEFAULT '1',
- `ipb_expiry` varbinary(14) NOT NULL DEFAULT '',
- `ipb_range_start` tinyblob NOT NULL,
- `ipb_range_end` tinyblob NOT NULL,
- `ipb_deleted` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_block_email` tinyint(1) NOT NULL DEFAULT '0',
- `ipb_allow_usertalk` tinyint(1) NOT NULL DEFAULT '0',
- PRIMARY KEY (`ipb_id`),
- UNIQUE KEY `ipb_address` (`ipb_address`(255),`ipb_user`,`ipb_auto`,`ipb_anon_only`),
- KEY `ipb_user` (`ipb_user`),
- KEY `ipb_range` (`ipb_range_start`(8),`ipb_range_end`(8)),
- KEY `ipb_timestamp` (`ipb_timestamp`),
- KEY `ipb_expiry` (`ipb_expiry`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_ipblocks`
---
-
-LOCK TABLES `mw_ipblocks` WRITE;
-/*!40000 ALTER TABLE `mw_ipblocks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_ipblocks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_iwlinks`
---
-
-DROP TABLE IF EXISTS `mw_iwlinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_iwlinks` (
- `iwl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `iwl_prefix` varbinary(20) NOT NULL DEFAULT '',
- `iwl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `iwl_from` (`iwl_from`,`iwl_prefix`,`iwl_title`),
- UNIQUE KEY `iwl_prefix_title_from` (`iwl_prefix`,`iwl_title`,`iwl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_iwlinks`
---
-
-LOCK TABLES `mw_iwlinks` WRITE;
-/*!40000 ALTER TABLE `mw_iwlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_iwlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_job`
---
-
-DROP TABLE IF EXISTS `mw_job`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_job` (
- `job_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `job_cmd` varbinary(60) NOT NULL DEFAULT '',
- `job_namespace` int(11) NOT NULL,
- `job_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `job_params` blob NOT NULL,
- PRIMARY KEY (`job_id`),
- KEY `job_cmd` (`job_cmd`,`job_namespace`,`job_title`,`job_params`(128))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_job`
---
-
-LOCK TABLES `mw_job` WRITE;
-/*!40000 ALTER TABLE `mw_job` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_job` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_l10n_cache`
---
-
-DROP TABLE IF EXISTS `mw_l10n_cache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_l10n_cache` (
- `lc_lang` varbinary(32) NOT NULL,
- `lc_key` varchar(255) NOT NULL,
- `lc_value` mediumblob NOT NULL,
- KEY `lc_lang_key` (`lc_lang`,`lc_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
-
-
---
--- Table structure for table `mw_langlinks`
---
-
-DROP TABLE IF EXISTS `mw_langlinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_langlinks` (
- `ll_from` int(10) unsigned NOT NULL DEFAULT '0',
- `ll_lang` varbinary(20) NOT NULL DEFAULT '',
- `ll_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `ll_from` (`ll_from`,`ll_lang`),
- KEY `ll_lang` (`ll_lang`,`ll_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_langlinks`
---
-
-LOCK TABLES `mw_langlinks` WRITE;
-/*!40000 ALTER TABLE `mw_langlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_langlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_log_search`
---
-
-DROP TABLE IF EXISTS `mw_log_search`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_log_search` (
- `ls_field` varbinary(32) NOT NULL,
- `ls_value` varchar(255) NOT NULL,
- `ls_log_id` int(10) unsigned NOT NULL DEFAULT '0',
- UNIQUE KEY `ls_field_val` (`ls_field`,`ls_value`,`ls_log_id`),
- KEY `ls_log_id` (`ls_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_log_search`
---
-
-LOCK TABLES `mw_log_search` WRITE;
-/*!40000 ALTER TABLE `mw_log_search` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_log_search` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_logging`
---
-
-DROP TABLE IF EXISTS `mw_logging`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_logging` (
- `log_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `log_type` varbinary(32) NOT NULL DEFAULT '',
- `log_action` varbinary(32) NOT NULL DEFAULT '',
- `log_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
- `log_user` int(10) unsigned NOT NULL DEFAULT '0',
- `log_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `log_namespace` int(11) NOT NULL DEFAULT '0',
- `log_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `log_page` int(10) unsigned DEFAULT NULL,
- `log_comment` varchar(255) NOT NULL DEFAULT '',
- `log_params` blob NOT NULL,
- `log_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- PRIMARY KEY (`log_id`),
- KEY `type_time` (`log_type`,`log_timestamp`),
- KEY `user_time` (`log_user`,`log_timestamp`),
- KEY `page_time` (`log_namespace`,`log_title`,`log_timestamp`),
- KEY `times` (`log_timestamp`),
- KEY `log_user_type_time` (`log_user`,`log_type`,`log_timestamp`),
- KEY `log_page_id_time` (`log_page`,`log_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_logging`
---
-
-LOCK TABLES `mw_logging` WRITE;
-/*!40000 ALTER TABLE `mw_logging` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_logging` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_math`
---
-
-DROP TABLE IF EXISTS `mw_math`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_math` (
- `math_inputhash` varbinary(16) NOT NULL,
- `math_outputhash` varbinary(16) NOT NULL,
- `math_html_conservativeness` tinyint(4) NOT NULL,
- `math_html` text,
- `math_mathml` text,
- UNIQUE KEY `math_inputhash` (`math_inputhash`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_math`
---
-
-LOCK TABLES `mw_math` WRITE;
-/*!40000 ALTER TABLE `mw_math` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_math` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_module_deps`
---
-
-DROP TABLE IF EXISTS `mw_module_deps`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_module_deps` (
- `md_module` varbinary(255) NOT NULL,
- `md_skin` varbinary(32) NOT NULL,
- `md_deps` mediumblob NOT NULL,
- UNIQUE KEY `md_module_skin` (`md_module`,`md_skin`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_module_deps`
---
-
-LOCK TABLES `mw_module_deps` WRITE;
-/*!40000 ALTER TABLE `mw_module_deps` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_module_deps` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource` (
- `mr_resource` varbinary(255) NOT NULL,
- `mr_lang` varbinary(32) NOT NULL,
- `mr_blob` mediumblob NOT NULL,
- `mr_timestamp` binary(14) NOT NULL,
- UNIQUE KEY `mr_resource_lang` (`mr_resource`,`mr_lang`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource`
---
-
-LOCK TABLES `mw_msg_resource` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_msg_resource` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource_links`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource_links`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource_links` (
- `mrl_resource` varbinary(255) NOT NULL,
- `mrl_message` varbinary(255) NOT NULL,
- UNIQUE KEY `mrl_message_resource` (`mrl_message`,`mrl_resource`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource_links`
---
-
-LOCK TABLES `mw_msg_resource_links` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource_links` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_msg_resource_links` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_objectcache`
---
-
-DROP TABLE IF EXISTS `mw_objectcache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_objectcache` (
- `keyname` varbinary(255) NOT NULL DEFAULT '',
- `value` mediumblob,
- `exptime` datetime DEFAULT NULL,
- PRIMARY KEY (`keyname`),
- KEY `exptime` (`exptime`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_objectcache`
---
-
-LOCK TABLES `mw_objectcache` WRITE;
-/*!40000 ALTER TABLE `mw_objectcache` DISABLE KEYS */;
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:messages:en','K�2��.�2�R\ns\r\n���S�δ2��\0','2010-12-31 13:16:31');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:pcache:idhash:1-0!*!*!!en!*','�V[o�F�g~�����B��P��m)$TK�U��\0�����8$��9�a\rI�l��X>��ܹ�q�Sa,��ʕ� x��?[~ʃ|�.Z��$�8Y�\'�I�Y�K��-\04�U����J�\'&�uB)�:I������E�m�sk`�`k�Q�v��a���\rZ��t�0����+P%GE�ـ�JX;\n-s�P�@�B�b���8~�첒$��ea�υ��f��+���0[,�F�x��d�\'�z�0��BJ���=���J��c�\\��:��&B��T��\'��C��Fdÿ׆Fq����Gd����%8G�0��A�I��; Ô˜`�7�5�LI\r��(���{�c�����g+��8Qr�&�ͦ��A)�V��ЕPT��\\UƧtn��Z�e�SfJZ(V�P�}����0��O�N �=j�\\H� �y�\\�U[h]T:� ��bd��u��+�j%\'�6k��f:E�;�@Yך��4���Ȁ��q� ��Z�º6<b�3��TU(d��,\n���Y|�e�\'�5��T�fU�8}�\"��m���/���}Uk�9o��;����|*R?�n��� 3d��g1��y�\\f8gk�����w��=��:/Y7���ۋ�^<�Ō����v#���i����C�#��6\Z�.0�Ua$4�=\Z���;��4����Y=���5���:kpÎq��Ŧ4��X���C��qYßµ-��Lj�����D�f���� �:����(3t��14C��J�#����������WXT���Δy:�^�6�v�7����I�U�Ee��(�p0��ga�6Mj��Sc�,Ñ«@��ޅ+R����A��xÐ¥\'6���utÇ·bۛ��`j�8ؚ�G�IC<KS��5�|�krJ\ry�\\b3xP�����ua�@����$SS�`��tQ.gwW��\r@\'���w�� ��xZ(�>5{� ���dw�>�=J)\r�6t ��X����M���B�\n�ŖT����b>�qg���� 7� �z�n7��vwr�-%u�-Qi�iX1��Ne���A#�v��ӧ�3��?','2010-12-31 13:16:31');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:pcache:idoptions:1','E���@ D��`� \"v�ƣ��Wh��,�b�!�⭙7�L+�|}�t ��I�$�<���F\rpSl�4����OJN`\r\Z��� � ծ���)��PY��$�K����գ9�Vjp72��E���c�Wp�2��cVxu7�� ����p#�r=.���[>y)Zp��','2010-12-31 13:16:31');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-css:3832ee25d9c44988461f5f339b9b6a48','+�26�Rr�MM�LTH�ɩV\0�Z(��(3�(R�d\r\0','2038-01-19 03:14:07');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-css:aa0df16258ad99a1d249e796b5067ed9','+�2��Rr�MM�LTH�ɩN��K-�Q.,�L�NJ,R\0��s򋬔�\r���V�\Z\0','2038-01-19 03:14:07');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-js:22814eeadc9cf0a9ebcd844e14198e66','m��r�0 ��y ����r�&Qޡמ!\n�qQ�Xq;}���$��ވ� �c!]]].o5S�\n�)Fq ��L^��?�s�F�!�O�M\\�������\0���N��É���լ����:��-�j��F��{ۅ�G�\"i�� \Z�6�K����!��Y]=�F[�~ç«���䶃����`��9N�Ǵ���@�K��|z�?1�A��@J#_Ô�7\'�l�1) J�͵�).�3 z�f�T�A���Hњ�[#)�BzRA�7֌��\"T�*~SW���/P���B�Ŏ;\Z�ay�6����+U��?.$�6��-uT�v@h��s�&�����NØ¥b�fJ�~�]6��p��/q)�>�E�1��͔A\ne�L�g\ZE�`cW�����`fJ�E�a��>��b\n�ӑd�.u�do��[�\nt��b�+���l\Z?X*��Y�(�օ;�L�JqÅ¥É���d$�\"�WzG�-@b~+�#�kǞَ�Ƃ~������P)B ����q�Җ2���r�Rl����`z �4�����ÃX�m�;�XÝt;r.�sA��R��y)�kA�\nR�JT��J�U��*�W��_ߟ�4@�vt��f���>����x���','2038-01-19 03:14:07');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-js:dd9440c19c575629ac5ec90e489cf62e','+�21�R���Ԕ�����L���Ĕ�\"��ĒT�j��̒T%+���ĔJ�ZMk.%k\0','2038-01-19 03:14:07');
-/*!40000 ALTER TABLE `mw_objectcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_oldimage`
---
-
-DROP TABLE IF EXISTS `mw_oldimage`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_oldimage` (
- `oi_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `oi_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `oi_size` int(10) unsigned NOT NULL DEFAULT '0',
- `oi_width` int(11) NOT NULL DEFAULT '0',
- `oi_height` int(11) NOT NULL DEFAULT '0',
- `oi_bits` int(11) NOT NULL DEFAULT '0',
- `oi_description` tinyblob NOT NULL,
- `oi_user` int(10) unsigned NOT NULL DEFAULT '0',
- `oi_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `oi_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `oi_metadata` mediumblob NOT NULL,
- `oi_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
- `oi_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
- `oi_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
- `oi_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `oi_sha1` varbinary(32) NOT NULL DEFAULT '',
- KEY `oi_usertext_timestamp` (`oi_user_text`,`oi_timestamp`),
- KEY `oi_name_timestamp` (`oi_name`,`oi_timestamp`),
- KEY `oi_name_archive_name` (`oi_name`,`oi_archive_name`(14)),
- KEY `oi_sha1` (`oi_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_oldimage`
---
-
-LOCK TABLES `mw_oldimage` WRITE;
-/*!40000 ALTER TABLE `mw_oldimage` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_oldimage` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page`
---
-
-DROP TABLE IF EXISTS `mw_page`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page` (
- `page_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `page_namespace` int(11) NOT NULL,
- `page_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `page_restrictions` tinyblob NOT NULL,
- `page_counter` bigint(20) unsigned NOT NULL DEFAULT '0',
- `page_is_redirect` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `page_is_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `page_random` double unsigned NOT NULL,
- `page_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `page_latest` int(10) unsigned NOT NULL,
- `page_len` int(10) unsigned NOT NULL,
- PRIMARY KEY (`page_id`),
- UNIQUE KEY `name_title` (`page_namespace`,`page_title`),
- KEY `page_random` (`page_random`),
- KEY `page_len` (`page_len`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page`
---
-
-LOCK TABLES `mw_page` WRITE;
-/*!40000 ALTER TABLE `mw_page` DISABLE KEYS */;
-INSERT INTO `mw_page` VALUES (1,0,'Main_Page','',1,0,1,0.334989576352,'20101230131547',1,438);
-/*!40000 ALTER TABLE `mw_page` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_props`
---
-
-DROP TABLE IF EXISTS `mw_page_props`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_props` (
- `pp_page` int(11) NOT NULL,
- `pp_propname` varbinary(60) NOT NULL,
- `pp_value` blob NOT NULL,
- UNIQUE KEY `pp_page_propname` (`pp_page`,`pp_propname`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_props`
---
-
-LOCK TABLES `mw_page_props` WRITE;
-/*!40000 ALTER TABLE `mw_page_props` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_props` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_restrictions`
---
-
-DROP TABLE IF EXISTS `mw_page_restrictions`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_restrictions` (
- `pr_page` int(11) NOT NULL,
- `pr_type` varbinary(60) NOT NULL,
- `pr_level` varbinary(60) NOT NULL,
- `pr_cascade` tinyint(4) NOT NULL,
- `pr_user` int(11) DEFAULT NULL,
- `pr_expiry` varbinary(14) DEFAULT NULL,
- `pr_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- PRIMARY KEY (`pr_id`),
- UNIQUE KEY `pr_pagetype` (`pr_page`,`pr_type`),
- KEY `pr_typelevel` (`pr_type`,`pr_level`),
- KEY `pr_level` (`pr_level`),
- KEY `pr_cascade` (`pr_cascade`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_restrictions`
---
-
-LOCK TABLES `mw_page_restrictions` WRITE;
-/*!40000 ALTER TABLE `mw_page_restrictions` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_restrictions` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_pagelinks`
---
-
-DROP TABLE IF EXISTS `mw_pagelinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_pagelinks` (
- `pl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `pl_namespace` int(11) NOT NULL DEFAULT '0',
- `pl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `pl_from` (`pl_from`,`pl_namespace`,`pl_title`),
- UNIQUE KEY `pl_namespace` (`pl_namespace`,`pl_title`,`pl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_pagelinks`
---
-
-LOCK TABLES `mw_pagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_pagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_pagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_protected_titles`
---
-
-DROP TABLE IF EXISTS `mw_protected_titles`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_protected_titles` (
- `pt_namespace` int(11) NOT NULL,
- `pt_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `pt_user` int(10) unsigned NOT NULL,
- `pt_reason` tinyblob,
- `pt_timestamp` binary(14) NOT NULL,
- `pt_expiry` varbinary(14) NOT NULL DEFAULT '',
- `pt_create_perm` varbinary(60) NOT NULL,
- UNIQUE KEY `pt_namespace_title` (`pt_namespace`,`pt_title`),
- KEY `pt_timestamp` (`pt_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_protected_titles`
---
-
-LOCK TABLES `mw_protected_titles` WRITE;
-/*!40000 ALTER TABLE `mw_protected_titles` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_protected_titles` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache`
---
-
-DROP TABLE IF EXISTS `mw_querycache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache` (
- `qc_type` varbinary(32) NOT NULL,
- `qc_value` int(10) unsigned NOT NULL DEFAULT '0',
- `qc_namespace` int(11) NOT NULL DEFAULT '0',
- `qc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- KEY `qc_type` (`qc_type`,`qc_value`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache`
---
-
-LOCK TABLES `mw_querycache` WRITE;
-/*!40000 ALTER TABLE `mw_querycache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache_info`
---
-
-DROP TABLE IF EXISTS `mw_querycache_info`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache_info` (
- `qci_type` varbinary(32) NOT NULL DEFAULT '',
- `qci_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
- UNIQUE KEY `qci_type` (`qci_type`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache_info`
---
-
-LOCK TABLES `mw_querycache_info` WRITE;
-/*!40000 ALTER TABLE `mw_querycache_info` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache_info` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycachetwo`
---
-
-DROP TABLE IF EXISTS `mw_querycachetwo`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycachetwo` (
- `qcc_type` varbinary(32) NOT NULL,
- `qcc_value` int(10) unsigned NOT NULL DEFAULT '0',
- `qcc_namespace` int(11) NOT NULL DEFAULT '0',
- `qcc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `qcc_namespacetwo` int(11) NOT NULL DEFAULT '0',
- `qcc_titletwo` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- KEY `qcc_type` (`qcc_type`,`qcc_value`),
- KEY `qcc_title` (`qcc_type`,`qcc_namespace`,`qcc_title`),
- KEY `qcc_titletwo` (`qcc_type`,`qcc_namespacetwo`,`qcc_titletwo`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycachetwo`
---
-
-LOCK TABLES `mw_querycachetwo` WRITE;
-/*!40000 ALTER TABLE `mw_querycachetwo` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycachetwo` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_recentchanges`
---
-
-DROP TABLE IF EXISTS `mw_recentchanges`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_recentchanges` (
- `rc_id` int(11) NOT NULL AUTO_INCREMENT,
- `rc_timestamp` varbinary(14) NOT NULL DEFAULT '',
- `rc_cur_time` varbinary(14) NOT NULL DEFAULT '',
- `rc_user` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
- `rc_namespace` int(11) NOT NULL DEFAULT '0',
- `rc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rc_comment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rc_minor` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_bot` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_cur_id` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_this_oldid` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_last_oldid` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_type` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_moved_to_ns` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_moved_to_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rc_patrolled` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_ip` varbinary(40) NOT NULL DEFAULT '',
- `rc_old_len` int(11) DEFAULT NULL,
- `rc_new_len` int(11) DEFAULT NULL,
- `rc_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rc_logid` int(10) unsigned NOT NULL DEFAULT '0',
- `rc_log_type` varbinary(255) DEFAULT NULL,
- `rc_log_action` varbinary(255) DEFAULT NULL,
- `rc_params` blob,
- PRIMARY KEY (`rc_id`),
- KEY `rc_timestamp` (`rc_timestamp`),
- KEY `rc_namespace_title` (`rc_namespace`,`rc_title`),
- KEY `rc_cur_id` (`rc_cur_id`),
- KEY `new_name_timestamp` (`rc_new`,`rc_namespace`,`rc_timestamp`),
- KEY `rc_ip` (`rc_ip`),
- KEY `rc_ns_usertext` (`rc_namespace`,`rc_user_text`),
- KEY `rc_user_text` (`rc_user_text`,`rc_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_recentchanges`
---
-
-LOCK TABLES `mw_recentchanges` WRITE;
-/*!40000 ALTER TABLE `mw_recentchanges` DISABLE KEYS */;
-INSERT INTO `mw_recentchanges` VALUES (1,'20101230131547','20101230131547',0,'MediaWiki Default',0,'Main_Page','',0,0,1,1,1,0,1,0,'',0,'::1',0,438,0,0,NULL,'','');
-/*!40000 ALTER TABLE `mw_recentchanges` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_redirect`
---
-
-DROP TABLE IF EXISTS `mw_redirect`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_redirect` (
- `rd_from` int(10) unsigned NOT NULL DEFAULT '0',
- `rd_namespace` int(11) NOT NULL DEFAULT '0',
- `rd_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rd_interwiki` varchar(32) DEFAULT NULL,
- `rd_fragment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
- PRIMARY KEY (`rd_from`),
- KEY `rd_ns_title` (`rd_namespace`,`rd_title`,`rd_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_redirect`
---
-
-LOCK TABLES `mw_redirect` WRITE;
-/*!40000 ALTER TABLE `mw_redirect` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_redirect` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_revision`
---
-
-DROP TABLE IF EXISTS `mw_revision`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_revision` (
- `rev_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `rev_page` int(10) unsigned NOT NULL,
- `rev_text_id` int(10) unsigned NOT NULL,
- `rev_comment` tinyblob NOT NULL,
- `rev_user` int(10) unsigned NOT NULL DEFAULT '0',
- `rev_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `rev_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `rev_minor_edit` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rev_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
- `rev_len` int(10) unsigned DEFAULT NULL,
- `rev_parent_id` int(10) unsigned DEFAULT NULL,
- PRIMARY KEY (`rev_id`),
- UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`),
- KEY `rev_timestamp` (`rev_timestamp`),
- KEY `page_timestamp` (`rev_page`,`rev_timestamp`),
- KEY `user_timestamp` (`rev_user`,`rev_timestamp`),
- KEY `usertext_timestamp` (`rev_user_text`,`rev_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_revision`
---
-
-LOCK TABLES `mw_revision` WRITE;
-/*!40000 ALTER TABLE `mw_revision` DISABLE KEYS */;
-INSERT INTO `mw_revision` VALUES (1,1,1,'',0,'MediaWiki Default','20101230131547',0,0,438,0);
-/*!40000 ALTER TABLE `mw_revision` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_searchindex`
---
-
-DROP TABLE IF EXISTS `mw_searchindex`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_searchindex` (
- `si_page` int(10) unsigned NOT NULL,
- `si_title` varchar(255) NOT NULL DEFAULT '',
- `si_text` mediumtext NOT NULL,
- UNIQUE KEY `si_page` (`si_page`),
- FULLTEXT KEY `si_title` (`si_title`),
- FULLTEXT KEY `si_text` (`si_text`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_searchindex`
---
-
-LOCK TABLES `mw_searchindex` WRITE;
-/*!40000 ALTER TABLE `mw_searchindex` DISABLE KEYS */;
-INSERT INTO `mw_searchindex` VALUES (1,'main page',' mediawiki hasu800 been successfully installed. consult theu800 user user\'su800 guide foru800 information onu800 using theu800 wiki software. getting started getting started getting started configuration settings list mediawiki faqu800 mediawiki release mailing list ');
-/*!40000 ALTER TABLE `mw_searchindex` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_site_stats`
---
-
-DROP TABLE IF EXISTS `mw_site_stats`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_site_stats` (
- `ss_row_id` int(10) unsigned NOT NULL,
- `ss_total_views` bigint(20) unsigned DEFAULT '0',
- `ss_total_edits` bigint(20) unsigned DEFAULT '0',
- `ss_good_articles` bigint(20) unsigned DEFAULT '0',
- `ss_total_pages` bigint(20) DEFAULT '-1',
- `ss_users` bigint(20) DEFAULT '-1',
- `ss_active_users` bigint(20) DEFAULT '-1',
- `ss_admins` int(11) DEFAULT '-1',
- `ss_images` int(11) DEFAULT '0',
- UNIQUE KEY `ss_row_id` (`ss_row_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_site_stats`
---
-
-LOCK TABLES `mw_site_stats` WRITE;
-/*!40000 ALTER TABLE `mw_site_stats` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_site_stats` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_tag_summary`
---
-
-DROP TABLE IF EXISTS `mw_tag_summary`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_tag_summary` (
- `ts_rc_id` int(11) DEFAULT NULL,
- `ts_log_id` int(11) DEFAULT NULL,
- `ts_rev_id` int(11) DEFAULT NULL,
- `ts_tags` blob NOT NULL,
- UNIQUE KEY `tag_summary_rc_id` (`ts_rc_id`),
- UNIQUE KEY `tag_summary_log_id` (`ts_log_id`),
- UNIQUE KEY `tag_summary_rev_id` (`ts_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_tag_summary`
---
-
-LOCK TABLES `mw_tag_summary` WRITE;
-/*!40000 ALTER TABLE `mw_tag_summary` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_tag_summary` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_templatelinks`
---
-
-DROP TABLE IF EXISTS `mw_templatelinks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_templatelinks` (
- `tl_from` int(10) unsigned NOT NULL DEFAULT '0',
- `tl_namespace` int(11) NOT NULL DEFAULT '0',
- `tl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- UNIQUE KEY `tl_from` (`tl_from`,`tl_namespace`,`tl_title`),
- UNIQUE KEY `tl_namespace` (`tl_namespace`,`tl_title`,`tl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_templatelinks`
---
-
-LOCK TABLES `mw_templatelinks` WRITE;
-/*!40000 ALTER TABLE `mw_templatelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_templatelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_text`
---
-
-DROP TABLE IF EXISTS `mw_text`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_text` (
- `old_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `old_text` mediumblob NOT NULL,
- `old_flags` tinyblob NOT NULL,
- PRIMARY KEY (`old_id`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_text`
---
-
-LOCK TABLES `mw_text` WRITE;
-/*!40000 ALTER TABLE `mw_text` DISABLE KEYS */;
-INSERT INTO `mw_text` VALUES (1,'\'\'\'MediaWiki has been successfully installed.\'\'\'\n\nConsult the [http://meta.wikimedia.org/wiki/Help:Contents User\'s Guide] for information on using the wiki software.\n\n== Getting started ==\n* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]','utf-8');
-/*!40000 ALTER TABLE `mw_text` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_trackbacks`
---
-
-DROP TABLE IF EXISTS `mw_trackbacks`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_trackbacks` (
- `tb_id` int(11) NOT NULL AUTO_INCREMENT,
- `tb_page` int(11) DEFAULT NULL,
- `tb_title` varchar(255) NOT NULL,
- `tb_url` blob NOT NULL,
- `tb_ex` text,
- `tb_name` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`tb_id`),
- KEY `tb_page` (`tb_page`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_trackbacks`
---
-
-LOCK TABLES `mw_trackbacks` WRITE;
-/*!40000 ALTER TABLE `mw_trackbacks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_trackbacks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_transcache`
---
-
-DROP TABLE IF EXISTS `mw_transcache`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_transcache` (
- `tc_url` varbinary(255) NOT NULL,
- `tc_contents` text,
- `tc_time` binary(14) NOT NULL,
- UNIQUE KEY `tc_url_idx` (`tc_url`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_transcache`
---
-
-LOCK TABLES `mw_transcache` WRITE;
-/*!40000 ALTER TABLE `mw_transcache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_transcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_updatelog`
---
-
-DROP TABLE IF EXISTS `mw_updatelog`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_updatelog` (
- `ul_key` varchar(255) NOT NULL,
- `ul_value` blob,
- PRIMARY KEY (`ul_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_updatelog`
---
-
-LOCK TABLES `mw_updatelog` WRITE;
-/*!40000 ALTER TABLE `mw_updatelog` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_updatelog` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user`
---
-
-DROP TABLE IF EXISTS `mw_user`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user` (
- `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `user_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `user_real_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `user_password` tinyblob NOT NULL,
- `user_newpassword` tinyblob NOT NULL,
- `user_newpass_time` binary(14) DEFAULT NULL,
- `user_email` tinytext NOT NULL,
- `user_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `user_token` binary(32) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- `user_email_authenticated` binary(14) DEFAULT NULL,
- `user_email_token` binary(32) DEFAULT NULL,
- `user_email_token_expires` binary(14) DEFAULT NULL,
- `user_registration` binary(14) DEFAULT NULL,
- `user_editcount` int(11) DEFAULT NULL,
- PRIMARY KEY (`user_id`),
- UNIQUE KEY `user_name` (`user_name`),
- KEY `user_email_token` (`user_email_token`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user`
---
-
-LOCK TABLES `mw_user` WRITE;
-/*!40000 ALTER TABLE `mw_user` DISABLE KEYS */;
-INSERT INTO `mw_user` VALUES (1,'WikiSysop','',':B:b1373470:f7e87db0c9596055f39a1225b0c31508','',NULL,'','','20101230131552','de4ddde7c4eef6e3609f4287324a0a18',NULL,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,'20101230131547',0);
-/*!40000 ALTER TABLE `mw_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_groups`
---
-
-DROP TABLE IF EXISTS `mw_user_groups`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_groups` (
- `ug_user` int(10) unsigned NOT NULL DEFAULT '0',
- `ug_group` varbinary(16) NOT NULL DEFAULT '',
- UNIQUE KEY `ug_user_group` (`ug_user`,`ug_group`),
- KEY `ug_group` (`ug_group`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_groups`
---
-
-LOCK TABLES `mw_user_groups` WRITE;
-/*!40000 ALTER TABLE `mw_user_groups` DISABLE KEYS */;
-INSERT INTO `mw_user_groups` VALUES (1,'bureaucrat');
-INSERT INTO `mw_user_groups` VALUES (1,'sysop');
-/*!40000 ALTER TABLE `mw_user_groups` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_newtalk`
---
-
-DROP TABLE IF EXISTS `mw_user_newtalk`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_newtalk` (
- `user_id` int(11) NOT NULL DEFAULT '0',
- `user_ip` varbinary(40) NOT NULL DEFAULT '',
- `user_last_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
- KEY `user_id` (`user_id`),
- KEY `user_ip` (`user_ip`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_newtalk`
---
-
-LOCK TABLES `mw_user_newtalk` WRITE;
-/*!40000 ALTER TABLE `mw_user_newtalk` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_newtalk` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_properties`
---
-
-DROP TABLE IF EXISTS `mw_user_properties`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_properties` (
- `up_user` int(11) NOT NULL,
- `up_property` varbinary(32) NOT NULL,
- `up_value` blob,
- UNIQUE KEY `user_properties_user_property` (`up_user`,`up_property`),
- KEY `user_properties_property` (`up_property`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_properties`
---
-
-LOCK TABLES `mw_user_properties` WRITE;
-/*!40000 ALTER TABLE `mw_user_properties` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_properties` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_valid_tag`
---
-
-DROP TABLE IF EXISTS `mw_valid_tag`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_valid_tag` (
- `vt_tag` varchar(255) NOT NULL,
- PRIMARY KEY (`vt_tag`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_valid_tag`
---
-
-LOCK TABLES `mw_valid_tag` WRITE;
-/*!40000 ALTER TABLE `mw_valid_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_valid_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_watchlist`
---
-
-DROP TABLE IF EXISTS `mw_watchlist`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_watchlist` (
- `wl_user` int(10) unsigned NOT NULL,
- `wl_namespace` int(11) NOT NULL DEFAULT '0',
- `wl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
- `wl_notificationtimestamp` varbinary(14) DEFAULT NULL,
- UNIQUE KEY `wl_user` (`wl_user`,`wl_namespace`,`wl_title`),
- KEY `namespace_title` (`wl_namespace`,`wl_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_watchlist`
---
-
-LOCK TABLES `mw_watchlist` WRITE;
-/*!40000 ALTER TABLE `mw_watchlist` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_watchlist` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2010-12-31 1:20:11
diff --git a/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php b/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
deleted file mode 100644
index 8bca4b0d..00000000
--- a/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-/**
- * MediaWikiButtonsAvailabilityTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-
-require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
-
-/**
- * Test Case ID : 30 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name :'Back' and 'Continue' button availability
- * Version : MediaWiki 1.18alpha
-*/
-
-
-class MediaWikiButtonsAvailabilityTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
-
- // Verify only 'Continue' button available on 'Language' page
- public function testOnlyContinueButtonAvailability() {
-
- parent::navigateLanguagePage();
-
- // Verify only 'Continue' button avaialble
- $this->assertTrue( $this->isElementPresent( "submit-continue" ));
-
- // 'Back' button is not avaialble
- $this->assertElementNotPresent( "submit-back" );
- }
-
-
- // Verify 'Continue' and 'Back' buttons availability
- public function testBothButtonsAvailability() {
-
- // Verify buttons availability on 'Welcome to MediaWiki' page
- parent::navigateWelcometoMediaWikiPage();
- $this->assertTrue( $this->isElementPresent( "submit-back" ));
- $this->assertTrue( $this->isElementPresent( "submit-continue" ));
- parent::restartInstallation();
-
- // Verify buttons availability on 'Connect to Database' page
- parent::navigateConnetToDatabasePage();
- $this->assertTrue( $this->isElementPresent( "submit-back" ));
- $this->assertTrue( $this->isElementPresent( "submit-continue" ));
- parent::restartInstallation();
-
- // Verify buttons availability on 'Database settings' page
- $databaseName = DB_NAME_PREFIX."_db_settings";
- parent::navigateDatabaseSettingsPage( $databaseName );
- $this->assertTrue( $this->isElementPresent( "submit-back" ));
- $this->assertTrue( $this->isElementPresent( "submit-continue" ));
- parent::restartInstallation();
-
- // Verify buttons availability on 'Name' page
- $databaseName = DB_NAME_PREFIX."_name";
- parent::navigateNamePage( $databaseName );
- $this->assertTrue( $this->isElementPresent( "submit-back" ));
- $this->assertTrue( $this->isElementPresent( "submit-continue" ));
- parent::restartInstallation();
-
- // Verify buttons availability on 'Options' page
- $databaseName = DB_NAME_PREFIX."_options";
- parent::navigateOptionsPage( $databaseName );
- $this->assertTrue( $this->isElementPresent( "submit-back" ));
- $this->assertTrue( $this->isElementPresent( "submit-continue" ));
- parent::restartInstallation();
-
- // Verify buttons availability on 'Install' page
- $databaseName = DB_NAME_PREFIX."_install";
- parent::navigateInstallPage($databaseName);
- $this->assertTrue( $this->isElementPresent( "submit-back" ));
- $this->assertTrue( $this->isElementPresent( "submit-continue" ));
- }
-}
diff --git a/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php b/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
deleted file mode 100644
index 8e2afe73..00000000
--- a/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/**
- * MediaWikiDifferentDatabaseAccountTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 04 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install MediaWiki with different Database accounts for web access.
- * Version : MediaWiki 1.18alpha
-*/
-
-class MediaWikiDifferentDatabaseAccountTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
-
- // Install Mediawiki using 'MySQL' database type.
- public function testDifferentDatabaseAccount() {
-
- $databaseName = DB_NAME_PREFIX."_dif_accounts";
-
- // Navigate to the 'Database settings' page
- parent::navigateDatabaseSettingsPage( $databaseName );
-
- // Click on the 'Use the same account as for installation' check box
- $this->click( "mysql__SameAccount" );
-
- // Change the 'Database username'
- $this->type( "mysql_wgDBuser", DB_WEB_USER );
-
- // Enter 'Database password:'
- $this->type( "mysql_wgDBpassword", DB_WEB_USER_PASSWORD );
-
- // Select 'Create the account if it does not already exist' check box
- $this->click( "mysql__CreateDBAccount" );
- parent::clickContinueButton();
-
- // 'Name' page
- parent::completeNamePage();
-
- // 'Options' page
- parent::clickContinueButton();
-
- // 'Install' page
- $this->assertEquals("Creating database user... done",
- $this->getText( LINK_FORM."ul/li[3]"));
- parent::clickContinueButton();
-
- // 'Complete' page
- parent::completePageSuccessfull();
- $this->chooseCancelOnNextConfirmation();
- }
-}
diff --git a/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php b/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
deleted file mode 100644
index 55ad4612..00000000
--- a/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-/**
- * MediaWikiDifferntDatabasePrefixTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 02 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install MediaWiki with the same database and the different
- * database prefixes(Share one database between multiple wikis).
- * Version : MediaWiki 1.18alpha
-*/
-
-class MediaWikiDifferntDatabasePrefixTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
- // Install Mediawiki using 'MySQL' database type.
- public function testDifferentDatabasePrefix() {
-
- $databaseName = DB_NAME_PREFIX."_db_prefix";
- parent::navigateInstallPage( $databaseName );
-
- // To 'Options' page
- parent::clickBackButton();
-
- // To 'Name' page
- parent::clickBackButton();
-
- // To 'Database settings' page
- parent::clickBackButton();
-
- // To 'Connect to database' page
- parent::clickBackButton();
-
- // From 'Connect to database' page without database prefix
- parent::clickContinueButton();
-
- // Verify upgrade existing message
- $this->assertEquals( "Upgrade existing installation",
- $this->getText( LINK_DIV."h2" ));
-
- // To 'Connect to database' page
- parent::clickBackButton();
-
- // Input the database prefix
- $this->type( "mysql_wgDBprefix", DATABASE_PREFIX );
-
- // From 'Connect to database' page with database prefix
- parent::clickContinueButton();
-
- // To 'Complete' page
- parent::clickContinueButton();
- parent::completeNamePage();
- parent::clickContinueButton();
-
- // Verify already installed warning message
- $this->assertEquals( "Install",
- $this->getText( LINK_DIV."h2" ));
- $this->assertEquals( "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
- $this->getText( LINK_FORM."div[1]" ));
-
- parent::clickContinueButton();
- parent::completePageSuccessfull();
- $this->chooseCancelOnNextConfirmation();
- parent::restartInstallation();
- }
-}
diff --git a/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php b/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
deleted file mode 100644
index 825ca424..00000000
--- a/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
+++ /dev/null
@@ -1,136 +0,0 @@
-<?php
-
-/**
- * MediaWikiErrorsConnectToDatabasePageTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID : 09 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Invalid/ blank values for fields in 'Connect to database' page.
- * Version : MediaWiki 1.18alpha
-*/
-
-class MediaWikiErrorsConnectToDatabasePageTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
- // Verify warning messages for the 'Connet to database' page
- public function testErrorsConnectToDatabasePage() {
-
- parent::navigateConnetToDatabasePage();
-
- // Verify warning mesage for invalid database host
- $this->type( "mysql_wgDBserver", INVALID_DB_HOST );
- parent::clickContinueButton();
- $this->assertEquals( "DB connection error: php_network_getaddresses: getaddrinfo failed: No such host is known. (".INVALID_DB_HOST.").",
- $this->getText( LINK_DIV."div[2]/div[2]/p[1]" ));
- $this->assertEquals( "Check the host, username and password below and try again.",
- $this->getText( LINK_DIV."div[2]/div[2]/p[2]" ));
- // Verify warning message for the blank database host
- $this->type( "mysql_wgDBserver", "" );
- parent::clickContinueButton();
- $this->assertEquals( "MySQL 4.0.14 or later is required, you have .",
- $this->getText( LINK_DIV."div[2]/div[2]" ));
-
- // Valid Database Host
- $this->type( "mysql_wgDBserver", VALID_DB_HOST );
-
- // Verify warning message for the invalid database name
- $this->type( "mysql_wgDBname", INVALID_DB_NAME );
- parent::clickContinueButton();
- $this->assertEquals( "Invalid database name \"".INVALID_DB_NAME."\". Use only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).",
- $this->getText( LINK_DIV."div[2]/div[2]/p" ));
-
- // Verify warning message for the blank database name
- $this->type( "mysql_wgDBname", "");
- parent::clickContinueButton();
- $this->assertEquals( "You must enter a value for \"Database name\"",
- $this->getText( LINK_DIV."div[2]/div[2]" ));
-
- // valid Database name
- $this->type( "mysql_wgDBname", VALID_DB_NAME);
-
- // Verify warning message for the invalid databaase prefix
- $this->type( "mysql_wgDBprefix", INVALID_DB_PREFIX );
- parent::clickContinueButton();
- $this->assertEquals( "Invalid database prefix \"".INVALID_DB_PREFIX."\". Use only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).",
- $this->getText( LINK_DIV."div[2]/div[2]" ));
-
- // Valid Database prefix
- $this->type( "mysql_wgDBprefix", VALID_DB_PREFIX );
-
- // Verify warning message for the invalid database user name
- $this->type( "mysql__InstallUser", INVALID_DB_USER_NAME );
- parent::clickContinueButton();
- $this->assertEquals( "DB connection error: Access denied for user '".INVALID_DB_USER_NAME."'@'localhost' (using password: NO) (localhost).",
- $this->getText( LINK_DIV."div[2]/div[2]/p[1]" ));
- $this->assertEquals( "Check the host, username and password below and try again.",
- $this->getText( LINK_DIV."div[2]/div[2]/p[2]"));
-
- // Verify warning message for the blank database user name
- $this->type( "mysql__InstallUser", "" );
- parent::clickContinueButton();
- $this->assertEquals( "DB connection error: Access denied for user 'SYSTEM'@'localhost' (using password: NO) (localhost).",
- $this->getText( LINK_DIV."div[2]/div[2]/p[1]" ));
- $this->assertEquals( "Check the host, username and password below and try again.",
- $this->getText( LINK_DIV."div[2]/div[2]/p[2]" ));
-
- // Valid Database username
- $this->type( "mysql__InstallUser", VALID_DB_USER_NAME );
-
- // Verify warning message for the invalid password
- $this->type( "mysql__InstallPassword", INVALID_DB_PASSWORD );
- parent::clickContinueButton();
-
- $this->assertEquals( "DB connection error: Access denied for user 'root'@'localhost' (using password: YES) (localhost).",
- $this->getText( LINK_DIV."div[2]/div[2]/p[1]" ));
- $this->assertEquals( "Check the host, username and password below and try again.",
- $this->getText( LINK_DIV."div[2]/div[2]/p[2]" ));
-
- // Verify warning message for the invalid username and password
- $this->type( "mysql__InstallUser", INVALID_DB_USER_NAME );
- $this->type( "mysql__InstallPassword", INVALID_DB_PASSWORD );
- parent::clickContinueButton();
- $this->assertEquals( "DB connection error: Access denied for user '".INVALID_DB_USER_NAME."'@'localhost' (using password: YES) (localhost).",
- $this->getText( LINK_DIV."div[2]/div[2]/p[1]" ));
- $this->assertEquals( "Check the host, username and password below and try again.",
- $this->getText( LINK_DIV."div[2]/div[2]/p[2]" ));
-
- // Valid username and valid password
- $this->type( "mysql__InstallUser", VALID_DB_USER_NAME );
- $this->type( "mysql__InstallPassword", "" );
- parent::clickContinueButton();
-
- // successfully completes the 'Connect to database' page
- $this->assertEquals( "Database settings",
- $this->getText( LINK_DIV."h2" ));
- }
-}
diff --git a/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php b/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
deleted file mode 100644
index c2b35054..00000000
--- a/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-
-/**
- * MediaWikiErrorsNamepageTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-/**
- * Test Case ID : 10 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Invalid/ blank values for fields in 'Name' page.
- * Version : MediaWiki 1.18alpha
-*/
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-class MediaWikiErrorsNamepageTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
- // Verify warning message for the 'Name' page
- public function testErrorsNamePage() {
-
- $databaseName = DB_NAME_PREFIX."_error_name";
-
- parent::navigateNamePage( $databaseName );
-
- // Verify warning message for all blank fields
- parent::clickContinueButton();
- $this->assertEquals( "Enter a site name.",
- $this->getText( LINK_DIV."div[2]/div[2]" ));
- $this->assertEquals( "Enter an administrator username.",
- $this->getText( LINK_DIV."div[3]/div[2]" ));
- $this->assertEquals( "Enter a password for the administrator account.",
- $this->getText( LINK_DIV."div[4]/div[2]" ));
-
- // Verify warning message for the blank 'Site name'
- $this->type( "config__AdminName", VALID_YOUR_NAME );
- $this->type( "config__AdminPassword", VALID_PASSWORD );
- $this->type( "config__AdminPassword2", VALID_PASSWORD_AGAIN );
- parent::clickContinueButton();
- $this->assertEquals( "Enter a site name.",
- $this->getText( LINK_DIV."div[2]/div[2]" ));
-
- // Input valid 'Site name'
- $this->type( "config_wgSitename", VALID_WIKI_NAME );
-
-
- // Verify warning message for the invalid "Project namespace'
- $this->click( "config__NamespaceType_other" );
- $this->type( "config_wgMetaNamespace", INVALID_NAMESPACE );
- parent::clickContinueButton();
- $this->assertEquals( "The specified namespace \"\" is invalid. Specify a different project namespace.",
- $this->getText( LINK_DIV."div[2]/div[2]" ));
-
-
- // Verify warning message for the blank 'Project namespace'
- $this->type( "config_wgSitename", VALID_WIKI_NAME );
- $this->click( "config__NamespaceType_other" );
- $this->type( "config_wgMetaNamespace" , "" );
- parent::clickContinueButton();
- $this->assertEquals( "The specified namespace \"\" is invalid. Specify a different project namespace.",
- $this->getText( LINK_DIV."div[2]/div[2]" ));
-
-
- // Valid 'Project namespace'
- $this->click( "config__NamespaceType_other" );
- $this->type( "config_wgMetaNamespace", VALID_NAMESPACE );
- parent::clickContinueButton();
-
-
- // Valid 'Site name'
- $this->click( "config__NamespaceType_site-name" );
- $this->type( "config_wgSitename", VALID_WIKI_NAME );
-
-
- // Verify warning message for blank 'Your name'
- $this->type( "config__AdminName", " " );
- parent::clickContinueButton();
- $this->assertEquals( "Enter an administrator username.",
- $this->getText( LINK_DIV."div[2]/div[2]" ));
-
- $this->type( "config_wgSitename", VALID_WIKI_NAME );
- // Verify warning message for blank 'Password'
- $this->type( "config__AdminName", VALID_YOUR_NAME );
- $this->type( "config__AdminPassword", " " );
- parent::clickContinueButton();
- $this->assertEquals( "Enter a password for the administrator account.",
- $this->getText( LINK_DIV."div[2]/div[2]" ));
-
-
- // Verify warning message for the blank 'Password again'
- $this->type( "config_wgSitename", VALID_WIKI_NAME );
- $this->type( "config__AdminPassword", VALID_PASSWORD );
- $this->type( "config__AdminPassword2", " " );
- parent::clickContinueButton();
- $this->assertEquals( "The two passwords you entered do not match.",
- $this->getText( LINK_DIV."div[2]/div[2]" ));
-
-
- // Verify warning message for the different'Password' and 'Password again'
- $this->type( "config_wgSitename", VALID_WIKI_NAME );
- $this->type( "config__AdminPassword", VALID_PASSWORD );
- $this->type( "config__AdminPassword2", INVALID_PASSWORD_AGAIN );
- parent::clickContinueButton();
- $this->assertEquals( "The two passwords you entered do not match.",
- $this->getText( LINK_DIV."div[2]/div[2]" ));
- }
-}
diff --git a/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php b/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
deleted file mode 100644
index 78205cf8..00000000
--- a/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
+++ /dev/null
@@ -1,140 +0,0 @@
-<?php
-
-/**
- * MediaWikiHelpFieldHintTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-/**
- * Test Case ID : 29 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Help field hint availability for the fields.
- * Version : MediaWiki 1.18alpha
-*/
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-class MediaWikiHelpFieldHintTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
-
- // Verify help field availability for the fields
- public function testMySQLConnectToDatabaseFieldHint() {
-
- parent::navigateConnetToDatabasePage();
-
- // Verify help field for 'Database host'
- $this->click( "//div[@id='DB_wrapper_mysql']/div/div[1]/div/span[1]" );
- $this->assertEquals( MYSQL_DATABASE_HOST_HELP,
- $this->getText( "//div[@id='DB_wrapper_mysql']/div/div[1]/div/span[2]" ) );
-
- // Verify help field for 'Database name'
- $this->click( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/div/span[1]" );
- $this->assertEquals( MYSQL_DATABASE_NAME_HELP,
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/div/span[2]" ));
-
-
- // Verify help field for 'Database table prefix'
- $this->click("//div[@id='DB_wrapper_mysql']/fieldset[1]/div[2]/div[1]/div/span[1]" );
- $this->assertEquals(MYSQL_DATABASE_TABLE_PREFIX_HELP,
- $this->getText("//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/div/span[2]/p[1]" ));
-
- // Verify help field for 'Database username'
- $this->click( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[1]/div[1]/div/span[1]" );
- $this->assertEquals( MYSQL_DATBASE_USERNAME_HELP,
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[1]/div[1]/div/span[2]" ));
-
- // Verify help field for 'Database password'
- $this->click( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[2]/div[1]/div/span[1]" );
- $this->assertEquals( MYSQL_DATABASE_PASSWORD_HELP,
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[2]/div[1]/div/span[2]/p" ));
- }
-
-
- public function testSQLiteConnectToDatabaseFieldHint() {
-
- parent::navigateConnetToDatabasePage();
- $this->click( "DBType_sqlite" );
-
- // Verify help field for 'SQLite data directory'
- $this->click( "//div[@id='DB_wrapper_sqlite']/div[1]/div[1]/div/span[1]" );
- $this->assertEquals( SQLITE_DATA_DIRECTORY_HELP,
- $this->getText( "//div[@id='DB_wrapper_sqlite']/div[1]/div[1]/div/span[2]" ));
-
- // Verify help field for 'Database name'
- $this->click( "//div[@id='DB_wrapper_sqlite']/div[2]/div[1]/div/span[1]" );
- $this->assertEquals( SQLITE_DATABASE_NAME_HELP , $this->getText( "//div[@id='DB_wrapper_sqlite']/div[2]/div[1]/div/span[2]/p" ));
- }
-
-
- public function testDatabaseSettingsFieldHint() {
-
- $databaseName = DB_NAME_PREFIX."_db_field";
- parent::navigateDatabaseSettingsPage($databaseName);
-
- // Verify help field for 'Search engine'
- $this->click( LINK_FORM."div[2]/span[1]" );
- $this->assertEquals( SEARCH_ENGINE_HELP,
- $this->getText( LINK_FORM."div[2]/span[2]" ));
-
- // Verify help field for 'Database character set'
- $this->click( LINK_FORM."div[4]/span[1]" );
- $this->assertEquals( DATABASE_CHARACTER_SET_HELP,
- $this->getText( LINK_FORM."div[4]/span[2]"));
- parent::restartInstallation();
- }
-
-
- public function testNameFieldHint() {
-
- $databaseName = DB_NAME_PREFIX."_name_field";
- parent::navigateNamePage( $databaseName );
-
- // Verify help field for 'Name of Wiki'
- $this->click( LINK_FORM."div[1]/div[1]/div/span[1]" );
- $this->assertEquals( NAME_OF_WIKI_HELP,
- $this->getText( LINK_FORM."div[1]/div[1]/div/span[2]/p" ));
-
- // Verify help field for 'Project namespace'
- $this->click( LINK_FORM."div[2]/div[1]/div/span[1]" );
- $this->assertEquals( PROJECT_NAMESPACE_HELP,
- $this->getText( LINK_FORM."div[2]/div[1]/div/span[2]/p"));
-
- // Verify help field for 'Your Name'
- $this->click( LINK_FORM."fieldset/div[1]/div[1]/div/span[1]" );
- $this->assertEquals( USER_NAME_HELP,
- $this->getText( LINK_FORM."fieldset/div[1]/div[1]/div/span[2]/p" ));
-
- // Verify help field for 'E mail address'
- $this->click( LINK_FORM."fieldset/div[4]/div[1]/div/span[1]" );
- $this->assertEquals( EMAIL_ADDRESS_HELP,
- $this->getText( LINK_FORM."fieldset/div[4]/div[1]/div/span[2]/p" ));
-
- parent::restartInstallation();
- }
-}
-
diff --git a/tests/selenium/installer/MediaWikiInstallationCommonFunction.php b/tests/selenium/installer/MediaWikiInstallationCommonFunction.php
deleted file mode 100644
index 353fa2ee..00000000
--- a/tests/selenium/installer/MediaWikiInstallationCommonFunction.php
+++ /dev/null
@@ -1,283 +0,0 @@
-<?php
-/**
- * MediaWikiInstallationCommonFunction
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
-require_once ( __DIR__ . '/MediaWikiInstallationConfig.php' );
-require_once ( __DIR__ . '/MediaWikiInstallationMessage.php' );
-require_once ( __DIR__ . '/MediaWikiInstallationVariables.php');
-
-
-class MediaWikiInstallationCommonFunction extends PHPUnit_Extensions_SeleniumTestCase {
-
- function setUp() {
- $this->setBrowser( TEST_BROWSER );
- $this->setBrowserUrl("http://".HOST_NAME.":".PORT."/".DIRECTORY_NAME."/");
- }
-
-
- public function navigateInitialpage() {
- $this->open( "http://".HOST_NAME.":".PORT."/".DIRECTORY_NAME."/" );
- }
-
-
- // Navigate to the 'Language' page
- public function navigateLanguagePage() {
- $this->open( "http://".HOST_NAME.":".PORT."/".DIRECTORY_NAME."/config/index.php" );
- }
-
-
- // Navigate to the 'Welcome to MediaWiki' page
- public function navigateWelcometoMediaWikiPage() {
- $this->open( "http://".HOST_NAME.":".PORT."/".DIRECTORY_NAME."/config/index.php" );
- $this->click( "submit-continue ");
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
-
- // Navigate yo 'Connect to Database' page
- public function navigateConnetToDatabasePage() {
- $this->open( "http://".HOST_NAME.":".PORT."/".DIRECTORY_NAME."/config/index.php" );
-
- // 'Welcome to MediaWiki!' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Connect to Database' page
- $this->click("submit-continue");
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
-
- // Navigate to the 'Database Settings' page
- public function navigateDatabaseSettingsPage( $databaseName ) {
-
- $this->open( "http://".HOST_NAME.":".PORT."/".DIRECTORY_NAME."/config/index.php" );
-
- // 'Welcome to MediaWiki!' page
- $this->click("submit-continue");
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Connect to Database' page
- $this->click("submit-continue");
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- $this->type("mysql_wgDBname", $databaseName );
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
-
- // Navigate to the 'Name' page
- public function navigateNamePage( $databaseName ) {
- $this->open( "http://".HOST_NAME.":".PORT."/".DIRECTORY_NAME."/config/index.php" );
-
- // 'Welcome to MediaWiki!' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Connect to Database' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- $this->type( "mysql_wgDBname", $databaseName );
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Database settings
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
-
- // Navigate 'Options' page
- public function navigateOptionsPage( $databaseName ) {
-
- $this->open( "http://".HOST_NAME.":".PORT."/".DIRECTORY_NAME."/config/index.php" );
-
- // 'Welcome to MediaWiki!' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Connect to Database' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- $this->type( "mysql_wgDBname", $databaseName );
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Database settings
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Name
- $this->type( "config_wgSitename", NAME_OF_WIKI );
- $this->type( "config__AdminName", ADMIN_USER_NAME);
- $this->type( "config__AdminPassword", ADMIN_PASSWORD );
- $this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
- $this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
-
- // Navigate 'Install' page
- public function navigateInstallPage( $databaseName ) {
-
- $this->open( "http://".HOST_NAME.":".PORT."/".DIRECTORY_NAME."/config/index.php" );
-
- // 'Welcome to MediaWiki!' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Connect to Database' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- $this->type( "mysql_wgDBname", $databaseName );
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Database settings
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Name
- $this->type( "config_wgSitename", NAME_OF_WIKI );
- $this->type( "config__AdminName", ADMIN_USER_NAME);
- $this->type( "config__AdminPassword", ADMIN_PASSWORD );
- $this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
- $this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Options page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
-
- // Navigate to 'Complete' page
- public function navigateCompletePage( $databaseName ) {
- $this->open( "http://".HOST_NAME.":".PORT."/".DIRECTORY_NAME."/config/index.php" );
-
- // 'Welcome to MediaWiki!' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Connect to Database' page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- $this->type( "mysql_wgDBname", $databaseName );
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Database settings
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Name
- $this->type( "config_wgSitename", NAME_OF_WIKI );
- $this->type( "config__AdminName", ADMIN_USER_NAME);
- $this->type( "config__AdminPassword", ADMIN_PASSWORD );
- $this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
- $this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Options page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Install page
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- $this->chooseCancelOnNextConfirmation();
- }
-
-
- // Complete the Name page fields
- public function completeNamePage() {
- $this->type( "config_wgSitename", NAME_OF_WIKI );
- $this->type( "config__AdminName", ADMIN_USER_NAME);
- $this->type( "config__AdminPassword", ADMIN_PASSWORD );
- $this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
- $this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME);
- }
-
-
- // Clicking on the 'Continue' button in any MediaWiki page
- public function clickContinueButton() {
- $this->click( "submit-continue" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
-
- // Clicking on the 'Back' button in any MediaWiki page
- public function clickBackButton() {
- $this->click( "submit-back" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
-
- // Restarting the installation
- public function restartInstallation() {
- $this->click( "link=Restart installation" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- $this->click( "submit-restart" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- }
-
-
- // Verify 'MediaWiki' logo available in the initial screen
- public function mediaWikiLogoPresentInitialScreen() {
- $this->assertTrue( $this->isElementPresent( "//img[@alt='The MediaWiki logo']" ));
- }
-
-
- // Verify 'MediaWiki' logo available
- public function mediaWikiLogoPresent() {
- $this->assertTrue( $this->isElementPresent( "//div[@id='p-logo']/a" ));
- }
-
-
- public function completePageSuccessfull() {
- $this->assertEquals( "Complete!",
- $this->getText( "//div[@id='bodyContent']/div/div/h2" ));
-
- // 'Congratulations!' text should be available in the 'Complete!' page.
- $this->assertEquals( "Congratulations!",
- $this->getText( "//div[@id='bodyContent']/div/div/div[2]/form/div[1]/div[2]/p[1]/b" ));
- }
-}
diff --git a/tests/selenium/installer/MediaWikiInstallationConfig.php b/tests/selenium/installer/MediaWikiInstallationConfig.php
deleted file mode 100644
index d86bcb85..00000000
--- a/tests/selenium/installer/MediaWikiInstallationConfig.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-/**
- * MediaWikiInstallationConfig
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-
-/**
- * MediaWikiInstallerTestSuite.php can be run one time successfully
- * with current value of the 'DB_NAME_PREFIX'.
- * If you wish to run the suite more than one time, you need to change
- * the value of the 'DB_NAME_PREFIX'.
-*/
-define('DB_NAME_PREFIX', "database_name" );
-define('DIRECTORY_NAME', "mediawiki" );
-define( 'PORT', "8080" );
-define( 'HOST_NAME', "localhost" );
-
-/**
- * Use the followings to run the test suite in different browsers.
- * Firefox : *firefox
- * IE : *iexplore
- * Google chrome : *googlechrome
- * Opera : *opera
-*/
-define ( 'TEST_BROWSER', "*firefox" );
diff --git a/tests/selenium/installer/MediaWikiInstallationMessage.php b/tests/selenium/installer/MediaWikiInstallationMessage.php
deleted file mode 100644
index a348b542..00000000
--- a/tests/selenium/installer/MediaWikiInstallationMessage.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-/**
- * MediaWikiInstallationConfig
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-
-// 'MySQL' database type help field hint
-define( 'MYSQL_DATABASE_HOST_HELP', "If your database server is on different server, enter the host name or IP address here. \nIf you are using shared web hosting, your hosting provider should give you the correct host name in their documentation. \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." );
-define( 'MYSQL_DATABASE_NAME_HELP', "Choose a name that identifies your wiki. It should not contain spaces or hyphens. \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." );
-define( 'MYSQL_DATABASE_TABLE_PREFIX_HELP', "Choose a name that identifies your wiki. It should not contain spaces or hyphens.");
-define( 'MYSQL_DATBASE_USERNAME_HELP', "Enter the username that will be used to connect to the database during the installation process. This is not the username of the MediaWiki account; this is the username for your database." );
-define( 'MYSQL_DATABASE_PASSWORD_HELP', "Enter the password that will be used to connect to the database during the installation process. This is not the password for the MediaWiki account; this is the password for your database." );
-
-
-// 'SQLite' database type help field hint
-define( 'SQLITE_DATA_DIRECTORY_HELP', "SQLite stores all data in a single file. \nThe directory you provide must be writable by the webserver during installation. \nIt should not be accessible via the web, this is why we're not putting it where your PHP files are. \nThe installer will write a .htaccess file along with it, but if that fails someone can gain access to your raw database. That includes raw user data (e-mail addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki. \nConsider putting the database somewhere else altogether, for example in /var/lib/mediawiki/yourwiki." );
-define( 'SQLITE_DATABASE_NAME_HELP', "Choose a name that identifies your wiki. Do not use spaces or hyphens. This will be used for the SQLite data file name.");
-
-
-// 'Database settings' page hel0p field hint
-define( 'SEARCH_ENGINE_HELP', "InnoDB is almost always the best option, since it has good concurrency support. \nMyISAM may be faster in single-user or read-only installations. MyISAM databases tend to get corrupted more often than InnoDB databases." );
-define( 'DATABASE_CHARACTER_SET_HELP', "In binary mode, MediaWiki stores UTF-8 text to the database in binary fields. This is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters. \nIn UTF-8 mode, 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 Basic Multilingual Plane." );
-
-
-// 'Name' page help field hint
-define( 'NAME_OF_WIKI_HELP', "This will appear in the title bar of the browser and in various other places.");
-define( 'PROJECT_NAMESPACE_HELP', "Following Wikipedia's example, many wikis keep their policy pages separate from their content pages, in a \"project namespace\". All page titles in this namespace start with a certain prefix, which you can specify here. Traditionally, this prefix is derived from the name of the wiki, but it cannot contain punctuation characters such as \"#\" or \":\"." );
-define( 'USER_NAME_HELP', "Enter your preferred username here, for example \"Joe Bloggs\". This is the name you will use to log in to the wiki." );
-define( 'EMAIL_ADDRESS_HELP', "Enter an e-mail address here to allow you to receive e-mail from other users on the wiki, reset your password, and be notified of changes to pages on your watchlist." );
-define( 'SUBSCRIBE_MAILING_LIST_HELP', "This is a low-volume mailing list used for release announcements, including important security announcements. You should subscribe to it and update your MediaWiki installation when new versions come out." );
-
-
-
diff --git a/tests/selenium/installer/MediaWikiInstallationVariables.php b/tests/selenium/installer/MediaWikiInstallationVariables.php
deleted file mode 100644
index bb11d022..00000000
--- a/tests/selenium/installer/MediaWikiInstallationVariables.php
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-
-/**
- * MediaWikiInstallationConfig
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-
-// Common variables
-define('PAGE_LOAD_TIME', "80000" );
-
-// Common links
-define( 'LINK_DIV', "//div[@id='bodyContent']/div/div/");
-define( 'LINK_FORM', "//div[@id='bodyContent']/div/div/div[2]/form/" );
-define( 'LINK_RIGHT_FRAMEWORK', "//div[@id='bodyContent']/div/div/div[1]/ul[1]/");
-
-// 'Name' page input values
-define( 'NAME_OF_WIKI', "Site Name" );
-define( 'ADMIN_USER_NAME', "My Name" );
-define( 'ADMIN_PASSWORD', "12345" );
-define ( 'ADMIN_RETYPE_PASSWORD', "12345" );
-define ( 'ADMIN_EMAIL_ADDRESS', "admin@example.com" );
-
-
-// 'Name' page input values for warning messages
-define( 'VALID_WIKI_NAME', "MyWiki" );
-define( 'VALID_YOUR_NAME', "FirstName LastName" );
-define( 'VALID_PASSWORD', "12345" );
-define( 'VALID_PASSWORD_AGAIN', "12345" );
-define( 'INVALID_PASSWORD_AGAIN', "123" );
-define( 'VALID_NAMESPACE', "Mynamespace" );
-define( 'INVALID_NAMESPACE', "##..##" );
-
-
-// 'Database settings' page input values
-define( 'DB_WEB_USER', "different" );
-define('DB_WEB_USER_PASSWORD', "12345" );
-
-
-// 'Connet to database' page input values
-define( 'DATABASE_PREFIX',"databaseprefix" );
-
-
-// 'Connet to database' page input values for warning messages
-define( 'VALID_DB_HOST', "localhost" );
-define( 'INVALID_DB_HOST', "local" );
-define( 'INVALID_DB_NAME', "my-wiki" );
-define( 'VALID_DB_NAME', "my_wiki1");
-define( 'INVALID_DB_PREFIX', "database prefix" );
-define( 'VALID_DB_PREFIX', "database_prefix");
-define( 'INVALID_DB_USER_NAME', "roots" );
-define( 'VALID_DB_USER_NAME', "root");
-define( 'INVALID_DB_PASSWORD', "12345" );
-
-
diff --git a/tests/selenium/installer/MediaWikiInstallerTestSuite.php b/tests/selenium/installer/MediaWikiInstallerTestSuite.php
deleted file mode 100644
index 58ccc7cd..00000000
--- a/tests/selenium/installer/MediaWikiInstallerTestSuite.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/**
- * MediaWikiInstallerTestSuite
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-require_once 'PHPUnit/Framework.php';
-require_once 'PHPUnit/Framework/TestSuite.php';
-
-require_once ( __DIR__ . '/MediaWikiUserInterfaceTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiButtonsAvailabilityTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiHelpFieldHintTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiRightFrameworkLinksTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiRestartInstallationTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiErrorsConnectToDatabasePageTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiErrorsNamepageTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiMySQLDataBaseTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiMySQLiteDataBaseTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiUpgradeExistingDatabaseTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiDifferntDatabasePrefixTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiDifferentDatabaseAccountTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiOnAlreadyInstalledTestCase.php' );
-
-
-
-
-$suite = new PHPUnit_Framework_TestSuite('ArrayTest');
-$result = new PHPUnit_Framework_TestResult;
-
-$suite->run($result);
diff --git a/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php b/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
deleted file mode 100644
index 16d065c7..00000000
--- a/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-
-/**
- * MediaWikiOnAlreadyInstalledTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-
-require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
-
-/**
- * Test Case ID : 01 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install Mediawiki using 'MySQL' database type successfully
- * Version : MediaWiki 1.18alpha
-*/
-
-class MediaWikiMySQLDataBaseTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
- // Verify MediaWiki installation using 'MySQL' database type
- public function testMySQLDatabaseSuccess() {
-
- $databaseName = DB_NAME_PREFIX."_sql_db";
-
- parent::navigateConnetToDatabasePage();
-
- // Verify 'MySQL" is selected as the default database type
- $this->assertEquals( "MySQL settings", $this->getText( "//div[@id='DB_wrapper_mysql']/h3" ));
-
- // Change 'Database name'
- $defaultDbName = $this->getText( "mysql_wgDBname" );
- $this->type( "mysql_wgDBname", " ");
- $this->type( "mysql_wgDBname", $databaseName );
- $this->assertNotEquals( $defaultDbName, $databaseName );
-
- // 'Database settings' page
- parent::clickContinueButton();
-
- // 'Name' page
- parent::clickContinueButton();
- parent::completeNamePage();
-
- // 'Options page
- parent::clickContinueButton();
-
- // 'Install' page
- parent::clickContinueButton();
-
- // 'Complete' page
- parent::completePageSuccessfull();
- parent::restartInstallation();
- }
-}
diff --git a/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php b/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
deleted file mode 100644
index 4ca69162..00000000
--- a/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-/**
- * MediaWikiMySQLiteataBaseTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-
-require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
-
-/**
- * Test Case ID : 06 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install Mediawiki using 'MySQL' database type successfully
- * Version : MediaWiki 1.18alpha
-*/
-
-class MediaWikiMySQLiteDataBaseTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
- // Verify MediaWiki installation using 'MySQL' database type
- public function testMySQLDatabaseSuccess() {
-
- $databaseName = DB_NAME_PREFIX."_sqlite_db";
-
- parent::navigateConnetToDatabasePage();
- $this->click( "DBType_sqlite" );
-
- // Select 'SQLite' database type
- $this->assertEquals( "SQLite settings", $this->getText( "//div[@id='DB_wrapper_sqlite']/h3" ));
-
- // Change database name
- $defaultDbName = $this->getText( "sqlite_wgDBname" );
- $this->type( "sqlite_wgDBname", " ");
- $this->type( "sqlite_wgDBname", $databaseName );
- $this->assertNotEquals( $defaultDbName, $databaseName );
-
- // 'Database settings' page
- parent::clickContinueButton();
-
- // 'Name' page
- parent::clickContinueButton();
- parent::completeNamePage();
-
- // 'Options page
- parent::clickContinueButton();
-
- // 'Install' page
- parent::clickContinueButton();
-
- // 'Complete' page
- parent::completePageSuccessfull();
- parent::restartInstallation();
- }
-}
diff --git a/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php b/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
deleted file mode 100644
index 7a1b615c..00000000
--- a/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-
-require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
-
-
-/**
- * Test Case ID : 03 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install mediawiki on a already installed Mediawiki.]
- * Version : MediaWiki 1.18alpha
-*/
-
-class MediaWikiOnAlreadyInstalledTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
- // Install Mediawiki using 'MySQL' database type.
- public function testInstallOnAlreadyInstalled() {
-
- $databaseName = DB_NAME_PREFIX."_already_installed";
- parent::navigateInstallPage( $databaseName );
-
- // 'Options' page
- parent::clickBackButton();
-
- // Install page
- parent::clickContinueButton();
-
- // 'Install' page should display after the 'Option' page
- $this->assertEquals( "Install", $this->getText( LINK_DIV."h2" ));
-
- // Verify warning text displayed
- $this->assertEquals( "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
- $this->getText( LINK_FORM."div[1]/div[2]" ));
-
- // Complete page
- parent::clickContinueButton();
- parent::completePageSuccessfull();
- $this->chooseCancelOnNextConfirmation();
- parent::restartInstallation();
- }
-}
diff --git a/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php b/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
deleted file mode 100644
index ea87de08..00000000
--- a/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-/**
- * MediaWikiRestartInstallationTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-
-
-require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
-
-/**
- * Test Case ID : 11, 12 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install mediawiki on a already installed Mediawiki.
- * Version : MediaWiki 1.18alpha
-*/
-
-class MediaWikiRestartInstallationTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
- // Verify restarting the installation
- public function testSuccessRestartInstallation() {
-
- $dbNameBeforeRestart = DB_NAME_PREFIX."_db_before";
- parent::navigateDatabaseSettingsPage( $dbNameBeforeRestart );
-
- // Verify 'Restart installation' link available
- $this->assertTrue($this->isElementPresent( "link=Restart installation" ));
-
- // Click 'Restart installation'
- $this->click( "link=Restart installation ");
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Restart Installation' page displayed
- $this->assertEquals( "Restart installation", $this->getText( LINK_DIV."h2"));
-
- // Restart warning message displayed
- $this->assertTrue($this->isTextPresent( "exact:Do you want to clear all saved data that you have entered and restart the installation process?" ));
-
- // Click on the 'Yes, restart' button
- $this->click( "submit-restart" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Navigate to the initial installation page(Language).
- $this->assertEquals( "Language", $this->getText( LINK_DIV."h2" ));
-
- // 'Welcome to MediaWiki!' page
- parent::clickContinueButton();
-
- // 'Connect to database' page
- parent::clickContinueButton();
-
- // saved data should be deleted
- $dbNameAfterRestart = $this->getValue("mysql_wgDBname");
- $this->assertNotEquals($dbNameBeforeRestart, $dbNameAfterRestart);
- }
-
-
- // Verify cancelling restart
- public function testCancelRestartInstallation() {
-
- $dbNameBeforeRestart = DB_NAME_PREFIX."_cancel_restart";
-
- parent::navigateDatabaseSettingsPage( $dbNameBeforeRestart);
- // Verify 'Restart installation' link available
- $this->assertTrue($this->isElementPresent( "link=Restart installation" ));
-
- $this->click( "link=Restart installation" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Restart Installation' page displayed
- $this->assertEquals( "Restart installation", $this->getText( LINK_DIV."h2" ));
-
- // Restart warning message displayed
- $this->assertTrue( $this->isTextPresent( "Do you want to clear all saved data that you have entered and restart the installation process?"));
-
- // Click on the 'Back' button
- parent::clickBackButton();
-
- // Navigates to the previous page
- $this->assertEquals( "Database settings", $this->getText( LINK_DIV."h2" ));
-
- // 'Connect to database' page
- parent::clickBackButton();
-
- // Saved data remain on the page.
- $dbNameAfterRestart = $this->getValue( "mysql_wgDBname" );
- $this->assertEquals( $dbNameBeforeRestart, $dbNameAfterRestart );
- }
-}
diff --git a/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php b/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
deleted file mode 100644
index 7b0fcf36..00000000
--- a/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-
-/**
- * MediaWikiRightFrameworkLinksTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-
-require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
-
-/**
- * Test Case ID : 14, 15, 16, 17 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : User selects 'Read me' link.
- * User selects 'Release notes' link.
- * User selects 'Copying' link.
- * User selects 'Upgrading' link.
- * Version : MediaWiki 1.18alpha
-*/
-
-
-class MediaWikiRightFrameworkLinksTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
- public function testLinksAvailability() {
-
- $this->open( "http://".HOST_NAME.":".PORT."/".DIRECTORY_NAME."/config/index.php" );
-
- // Verify 'Read me' link availability
- $this->assertTrue($this->isElementPresent( "link=Read me" ));
-
- // Verify 'Release notes' link availability
- $this->assertTrue($this->isElementPresent( "link=Release notes" ));
-
- // Verify 'Copying' link availability
- $this->assertTrue($this->isElementPresent( "link=Copying" ));
- }
-
- public function testPageNavigation() {
-
- $this->open( "http://".HOST_NAME.":".PORT."/".DIRECTORY_NAME."/config/index.php" );
-
- // Navigate to the 'Read me' page
- $this->click( "link=Read me" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- $this->assertEquals( "Read me", $this->getText( LINK_DIV."h2[1]" ));
- $this->assertTrue($this->isElementPresent( "submit-back" ));
- parent::clickBackButton();
-
- // Navigate to the 'Release notes' page
- $this->click( "link=Release notes" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME);
- $this->assertEquals( "Release notes", $this->getText( LINK_DIV."h2[1]" ));
- $this->assertTrue( $this->isElementPresent( "submit-back" ));
- parent::clickBackButton();
-
- // Navigate to the 'Copying' page
- $this->click( "link=Copying" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- $this->assertEquals( "Copying", $this->getText( LINK_DIV."h2[1]" ));
- $this->assertTrue($this->isElementPresent( "submit-back" ));
- parent::clickBackButton();
-
- // Navigate to the 'Upgrading' page
- $this->click( "link=Upgrading" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- $this->assertEquals( "Upgrading", $this->getText( LINK_DIV."h2[1]" ));
- }
-}
diff --git a/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php b/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
deleted file mode 100644
index 5cdc8d42..00000000
--- a/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-
-/**
- * MediaWikiUpgradeExistingDatabaseTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-
-require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
-
-/**
- * Test Case ID : 05 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install Mediawiki by updating the existing database.
- * Version : MediaWiki 1.18alpha
-*/
-
-
-class MediaWikiUpgradeExistingDatabaseTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
- // Install Mediawiki using 'MySQL' database type.
- public function testUpgradeExistingDatabase() {
-
- $databaseName = DB_NAME_PREFIX."_upgrade_existing";
- parent::navigateInstallPage( $databaseName );
-
- $this->open( "http://localhost:".PORT."/".DIRECTORY_NAME."/config/index.php" );
- $this->assertEquals( "Install", $this->getText( LINK_DIV."h2" ));
- $this->assertEquals( "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
- $this->getText( LINK_DIV."div[2]/form/div[1]/div[2]" ));
-
- // 'Optionis' page
- parent::clickBackButton();
-
- // 'Name' page
- parent::clickBackButton();
-
- // 'Database settings' page
- parent::clickBackButton();
-
- // 'Connect to database' page
- parent::clickBackButton();
- $this->type( "mysql_wgDBname", $databaseName );
- parent::clickContinueButton();
-
- // 'Upgrade existing installation' page displayed next to the 'Connect to database' page.
- $this->assertEquals( "Upgrade existing installation", $this->getText( LINK_DIV."h2" ));
-
- // Warning message displayed.
- $this->assertEquals( "There are MediaWiki tables in this database. To upgrade them to MediaWiki 1.18alpha, click Continue.",
- $this->getText( LINK_DIV."div[2]/form/div[1]/div[2]" ));
-
- parent::clickContinueButton();
- $this->assertEquals( "Upgrade existing installation",
- $this->getText( LINK_DIV."h2" ));
-
- // 'Upgrade complete.' text display
- $this->assertEquals("Upgrade complete.",
- $this->getText("//div[@id='bodyContent']/div/div[1]/div[4]/form/div[1]/div[2]/p[1]"));
-
- $this->assertEquals("You can now Folder/index.php start using your wiki.",
- $this->getText("//div[@id='bodyContent']/div/div[1]/div[4]/form/div[1]/div[2]/p[2]" ));
-
- $this->assertEquals( "Folder/index.php start using your wiki",
- $this->getText( "link=Folder/index.php start using your wiki" ));
-
- $this->assertTrue($this->isElementPresent( "submit-regenerate" ));
- $this->click( "submit-regenerate" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
- $this->assertEquals( "Database settings",
- $this->getText( LINK_DIV."h2" ));
-
- // 'Database settings' page
- parent::clickContinueButton();
-
- // Name page
- parent::completeNamePage();
-
- // Options page
- parent::clickContinueButton();
-
- // Install page
- $this->assertEquals( "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
- $this->getText( LINK_FORM."div[1]/div[2]" ));
- parent::clickContinueButton();
-
- // complete
- parent::completePageSuccessfull();
- $this->chooseCancelOnNextConfirmation();
- parent::restartInstallation();
- }
-}
diff --git a/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php b/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
deleted file mode 100644
index 15fad95f..00000000
--- a/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
+++ /dev/null
@@ -1,531 +0,0 @@
-<?php
-
-/**
- * MediaWikiUserInterfaceTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Maintenance
- *
- */
-
-require_once (__DIR__.'/'.'MediaWikiInstallationCommonFunction.php');
-
-/**
- * Test Case ID : 18 - 27 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : UI of MediaWiki initial/ Language/ Welcome to MediaWiki!/ Connect to database/
- * Database settings/ Name/ Options/ Install/ Complete/ Restart Inslation pages
- * Version : MediaWiki 1.18alpha
-*/
-
-
-class MediaWikiUserInterfaceTestCase extends MediaWikiInstallationCommonFunction {
-
- function setUp() {
- parent::setUp();
- }
-
-
- public function testInitialPageUI() {
-
- parent::navigateInitialpage();
-
- // MediaWiki logo available
- $this->assertTrue( $this->isElementPresent( "//img[@alt='The MediaWiki logo']" ));
-
- // 'MediaWiki 1.18alpha' text available
- $this->assertEquals( "MediaWiki 1.18alpha", $this->getText( "//h1" ));
-
- // 'LocalSettings.php not found.' text available
- $this->assertEquals( "LocalSettings.php not found.", $this->getText( "//p[1]" ));
-
- // 'Please set up the wiki first' text available
- $this->assertEquals( "Please set up the wiki first.", $this->getText( "//p[2]" ));
-
- // 'set up the wiki' link available
- $this->assertTrue($this->isElementPresent( "link=set up the wiki" ));
- }
-
-
- public function testlanguagePageUI() {
-
- parent::navigateLanguagePage();
-
- // Verify 'Language' heading
- $this->assertEquals( "Language", $this->getText( LINK_DIV."h2" ));
-
- // 'Your language' label available
- $this->assertEquals( "Your language:",
- $this->getText( LINK_FORM."div[1]/div[1]/label" ));
-
- // 'Your language' dropdown available
- $this->assertTrue( $this->isElementPresent( "UserLang" ));
-
- // 'Wiki language' label available
- $this->assertEquals( "Wiki language:",
- $this->getText( LINK_FORM."div[2]/div[1]/label" ));
-
- // 'Wiki language' dropdown available
- $this->assertTrue($this->isElementPresent( "ContLang" ));
- }
-
-
- public function testWelcometoMediaWikiUI() {
-
- parent::navigateWelcometoMediaWikiPage();
-
- // Verify 'Welcome to MediaWiki!' heading
- $this->assertEquals( "Welcome to MediaWiki!",
- $this->getText( LINK_DIV."h2" ));
-
- // Verify environment ok text displayed.
- $this->assertEquals( "The environment has been checked.You can install MediaWiki.",
- $this->getText( LINK_DIV."div[6]/span" ));
- }
-
-
- public function testConnectToDatabaseUI() {
-
- parent::navigateConnetToDatabasePage();
-
- // 'MYSQL radio button available
- $this->assertEquals( "MySQL",
- $this->getText( LINK_FORM."div[2]/div[2]/ul/li[1]/label" ));
- $this->assertTrue( $this->isElementPresent( LINK_FORM."div[2]/div[2]/ul/li[1]" ));
-
- // 'SQLite' radio button available
- $this->assertTrue( $this->isElementPresent( LINK_FORM."div[2]/div[2]/ul/li[2]" ));
- $this->assertEquals( "SQLite", $this->getText( LINK_FORM."div[2]/div[2]/ul/li[2]/label "));
-
- // 'Database host' label available
- $this->assertEquals( "Database host:", $this->getText( "//div[@id='DB_wrapper_mysql']/div/div[1]/label" ));
-
- // 'Database host' text box default to 'localhost'
- $this->assertEquals( "localhost", $this->getValue( "mysql_wgDBserver" ));
-
- // 'Identify this wiki' section available
- $this->assertTrue( $this->isElementPresent( "//div[@id='DB_wrapper_mysql']/fieldset[1]/legend" ));
-
- // 'Identify this wiki' label available
- $this->assertEquals( "Identify this wiki", $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/legend" ));
-
- // 'Database name' lable available
- $this->assertEquals( "Database name:",
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/label" ));
-
- // Verify 'Database name:' text box is default to 'my_wiki'
- $this->assertEquals( "my_wiki", $this->getValue( "mysql_wgDBname" ));
-
- // Verify 'Database table prefix:' label available
- $this->assertEquals( "Database table prefix:",
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[2]/div[1]/label" ));
-
- // 'User account for installation' section available
- $this->assertTrue( $this->isElementPresent( "//div[@id='DB_wrapper_mysql']/fieldset[2]/legend" ));
-
- // 'User account for installation' label available
- $this->assertEquals( "User account for installation", $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/legend" ));
-
- // 'Database username' label available
- $this->assertEquals( "Database username:",
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[1]/div[1]/label" ));
-
- // 'Database username' text box defaults to 'root'
- $this->assertEquals("root", $this->getValue( "mysql__InstallUser" ));
-
- // 'Database password' label available
- $this->assertEquals( "Database password:",
- $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[2]/div[1]/label" ));
- }
-
-
-
- public function testDatabaseSettingsUI() {
-
- $databaseName = DB_NAME_PREFIX."_db_settings_UI";
- parent::navigateDatabaseSettingsPage( $databaseName );
-
- // 'Database settings' text available.
- $this->assertEquals( "Database settings", $this->getText( LINK_DIV."h2" ));
-
- // 'Database account for web access' section available
- $this->assertTrue( $this->isElementPresent( LINK_FORM."fieldset" ));
-
- // 'Database account for web access' label available
- $this->assertEquals( "Database account for web access", $this->getText( LINK_FORM."fieldset/legend" ));
-
- // 'Use the same account as for installation' check box available
- $this->assertEquals( "Use the same account as for installation", $this->getText( LINK_FORM."fieldset/div[1]/label" ));
-
- // 'Use the same account as for installation' check box is selected by default
- $this->assertEquals( "on", $this->getValue( "mysql__SameAccount" ));
-
- // 'Use the same account as for installation' check box deselected
- $this->click( "mysql__SameAccount" );
-
- // verify 'Use the same account as for installation' check box is not selected
- $this->assertEquals( "off", $this->getValue( "mysql__SameAccount" ));
-
- // 'Database username' label available
- $this->assertEquals( "Database username:", $this->getText( "//div[@id='dbOtherAccount']/div[1]/div[1]/label" ));
-
- // 'Database username' text box is default to the 'wikiuser'
- $this->assertEquals( "wikiuser", $this->getValue( "mysql_wgDBuser" ));
-
- // 'Database password' label available
- $this->assertEquals( "Database password:", $this->getText( "//div[@id='dbOtherAccount']/div[2]/div[1]/label" ));
-
- // 'Create the account if it does not already exist' label available
- $this->assertEquals( "Create the account if it does not already exist", $this->getText( "//div[@id='dbOtherAccount']/div[4]/label" ));
-
- // 'Create the account if it does not already exist' check box is not selected by default
- $this->assertEquals( "off" , $this->getValue( "mysql__CreateDBAccount" ));
-
- // 'Create the account if it does not already exist' check box selected
- $this->click( "mysql__CreateDBAccount" );
-
- // Verify 'Create the account if it does not already exist' check box is selected
- $this->assertEquals( "on" , $this->getValue( "mysql__CreateDBAccount" ));
- $this->click( "mysql__SameAccount" );
- $this->assertEquals( "on", $this->getValue( "mysql__SameAccount" ));
-
- // 'Storage engine' label available
- $this->assertEquals( "Storage engine:",
- $this->getText( LINK_FORM."div[1]/div[1]/label"));
-
- // 'InnoDB' label available
- $this->assertEquals( "InnoDB",
- $this->getText( LINK_FORM."div[1]/div[2]/ul/li[1]/label" ));
-
- // 'InnoDB' radio button available
- $this->assertTrue( $this->isElementPresent( "mysql__MysqlEngine_InnoDB" ));
-
- // 'MyISAM' label available
- $this->assertEquals( "MyISAM", $this->getText( LINK_FORM."div[1]/div[2]/ul/li[2]/label" ));
-
- // 'MyISAM' radio button available
- $this->assertTrue($this->isElementPresent( "mysql__MysqlEngine_MyISAM" ));
-
- // 'Database character set' label available
- $this->assertEquals( "Database character set:",
- $this->getText( LINK_FORM."div[3]/div[1]/label" ));
-
- // 'Binary' radio button available
- $this->assertTrue( $this->isElementPresent( "mysql__MysqlCharset_binary" ));
-
- // 'Binary' radio button available
- $this->assertEquals( "Binary", $this->getText( LINK_FORM."div[3]/div[2]/ul/li[1]/label" ));
-
- // 'UTF-8' radio button available
- $this->assertTrue( $this->isElementPresent( "mysql__MysqlCharset_utf8" ));
-
- // 'UTF-8' label available
- $this->assertEquals( "UTF-8", $this->getText( LINK_FORM."div[3]/div[2]/ul/li[2]/label" ));
-
- // 'Binary' radio button is selected
- $this->assertEquals( "on", $this->getValue( "mysql__MysqlCharset_binary" ));
- }
-
-
-
- public function testNamePageUI() {
-
- $databaseName = DB_NAME_PREFIX."_name_UI";
- parent::navigateNamePage($databaseName);
-
- // 'Name of wiki' text box available
- $this->assertEquals( "Name of wiki:",
- $this->getText( LINK_FORM."div[1]/div[1]/label" ));
-
- $this->assertTrue( $this->isElementPresent( "config_wgSitename" ));
-
- // 'Project namespace' label available
- $this->assertEquals( "Project namespace:",
- $this->getText( LINK_FORM."div[2]/div[1]/label" ));
-
- // 'Same as the wiki name' radio button available
- $this->assertTrue( $this->isElementPresent( "config__NamespaceType_site-name" ));
-
- // 'Project' radio button available
- $this->assertTrue( $this->isElementPresent( "config__NamespaceType_generic" ));
-
- // 'Project' radio button available
- $this->assertTrue( $this->isElementPresent( "config__NamespaceType_other" ));
-
- // 'Same as the wiki name' label available
- $this->assertEquals( "Same as the wiki name:",
- $this->getText( LINK_FORM."div[2]/div[2]/ul/li[1]/label" ));
-
- // 'Project' label available
- $this->assertEquals("Project",
- $this->getText( LINK_FORM."div[2]/div[2]/ul/li[2]/label" ));
-
- // 'Project' label available
- $this->assertEquals( "Other (specify)",
- $this->getText( LINK_FORM."div[2]/div[2]/ul/li[3]/label" ));
-
- // 'Same as the wiki name' radio button selected by default
- $this->assertEquals( "on", $this->getValue( "config__NamespaceType_site-name" ));
-
- // 'Administrator account' section available
- $this->assertTrue( $this->isElementPresent( LINK_FORM."fieldset" ));
-
- // 'Administrator account' label available
- $this->assertEquals( "Administrator account",
- $this->getText( LINK_FORM."fieldset/legend" ));
-
- // 'Your Name' label available
- $this->assertEquals( "Your name:",
- $this->getText( LINK_FORM."fieldset/div[1]/div[1]/label" ));
-
- // 'Your Name' text box available
- $this->assertTrue( $this->isElementPresent( "config__AdminName" ));
-
- // 'Password' label available
- $this->assertEquals( "Password:",
- $this->getText( LINK_FORM."fieldset/div[2]/div[1]/label" ));
-
- // 'Password' text box available
- $this->assertTrue( $this->isElementPresent( "config__AdminPassword" ));
-
- // 'Password again' label available
- $this->assertEquals( "Password again:",
- $this->getText( LINK_FORM."fieldset/div[3]/div[1]/label" ));
-
- // 'Password again' text box available
- $this->assertTrue( $this->isElementPresent( "config__AdminPassword2" ));
-
- // 'Email address' label avaialble
- $this->assertEquals( "E-mail address:",
- $this->getText( LINK_FORM."fieldset/div[4]/div[1]/label" ));
-
- // 'Email address' text box available
- $this->assertTrue( $this->isElementPresent( "config__AdminEmail" ));
-
- // Message displayed
- $this->assertEquals( "You are almost done! You can now skip the remaining configuration and install the wiki right now.",
- $this->getText( LINK_FORM."/div[4]/div[2]/p" ));
-
- // 'Ask me more questions.' radio button available
- $this->assertTrue( $this->isElementPresent( "config__SkipOptional_continue" ));
-
- // 'Ask me more questions.' label available
- $this->assertEquals( "Ask me more questions.",
- $this->getText( LINK_FORM."div[5]/div[2]/ul/li[1]/label" ));
-
- // 'I'm bored already, just install the wiki' radio button is avaiable
- $this->assertTrue( $this->isElementPresent( "config__SkipOptional_skip" ));
-
- // 'I'm bored already, just install the wiki' label available
- $this->assertEquals( "I'm bored already, just install the wiki.",
- $this->getText( LINK_FORM."div[5]/div[2]/ul/li[2]/label" ));
-
- // 'Ask me more questions.' radio button is default selected
- $this->assertEquals( "on", $this->getValue( "config__SkipOptional_continue" ));
- }
-
-
-
- public function testOptionPageUI() {
-
- $databaseName = DB_NAME_PREFIX."_options_UI";
- parent::navigateOptionsPage($databaseName);
-
- // 'Options' label available
- $this->assertEquals( "Options", $this->getText( LINK_DIV."h2"));
-
- // 'Return e-mail address' label available
- $this->assertEquals( "Return e-mail address:", $this->getText( "//div[@id='emailwrapper']/div[1]/div[1]/label" ));
-
- // 'Return e-mail address' text box available
- $this->assertTrue( $this->isElementPresent( "config_wgPasswordSender" ));
-
- // Text 'apache@localhost' is default value of the 'Return e-mail address' text box
- $this->assertEquals( "apache@localhost", $this->getValue( "config_wgPasswordSender" ));
-
- // 'Logo URL' label available
- $this->assertEquals( "Logo URL:", $this->getText( LINK_FORM."fieldset[2]/div[3]/div[1]/label" ));
-
- // 'Logo URL' text box available
- $this->assertTrue( $this->isElementPresent( "config_wgLogo" ));
-
- // Correct path available in the 'Logo URL' text box
- $this->assertEquals( "/wiki/skins/common/images/wiki.png", $this->getValue( "config_wgLogo" ));
-
- // 'Enable file uploads' radio button available
- $this->assertTrue( $this->isElementPresent( "config_wgEnableUploads" ));
-
- // 'Enable file uploads' label available
- $this->assertEquals( "Enable file uploads",
- $this->getText( LINK_FORM."fieldset[2]/div[1]/label" ));
-
- // 'Enable file uploads' check box is not selected
- $this->assertEquals( "off", $this->getValue( "config_wgEnableUploads" ));
-
- $this->click( "config_wgEnableUploads" );
-
- // 'Directory for deleted files' label available
- $this->assertEquals( "Directory for deleted files:",
- $this->getText( "//div[@id='uploadwrapper']/div/div[1]/label" ));
-
- // 'Directory for deleted files' text box available
- $this->assertTrue( $this->isElementPresent( "config_wgDeletedDirectory" ));
-
- // Correct path available in the 'Directory for deleted files' text box
- $this->assertEquals( "C:\\wamp\\www\\".DIRECTORY_NAME."/images/deleted",
- $this->getValue( "config_wgDeletedDirectory" ));
- }
-
-
-
- public function testInstallPageUI() {
-
- $databaseName = DB_NAME_PREFIX."_install_UI";
- parent::navigateInstallPage( $databaseName );
-
- // Verify installation done messages display
- $this->assertEquals( "Setting up database... done",
- $this->getText( LINK_FORM."ul/li[1]" ));
- $this->assertEquals( "Creating tables... done",
- $this->getText( LINK_FORM."ul/li[2]" ));
- $this->assertEquals( "Creating database user... done",
- $this->getText( LINK_FORM."ul/li[3]" ));
- $this->assertEquals( "Populating default interwiki table... done",
- $this->getText( LINK_FORM."ul/li[4]" ));
- $this->assertEquals( "Generating secret key... done",
- $this->getText( LINK_FORM."ul/li[5]" ));
- $this->assertEquals( "Generating default upgrade key... done",
- $this->getText( LINK_FORM."ul/li[6]" ));
- $this->assertEquals( "Creating administrator user account... done",
- $this->getText( LINK_FORM."ul/li[7]" ));
- $this->assertEquals( "Creating main page with default content... done",
- $this->getText( LINK_FORM."ul/li[8]" ));
- }
-
-
-
- public function testCompletePageUI() {
-
- $databaseName = DB_NAME_PREFIX."_complete_UI";
- parent::navigateCompletePage( $databaseName );
-
- // 'Congratulations!' text display
- $this->assertEquals("Congratulations!",
- $this->getText( LINK_FORM."div[1]/div[2]/p[1]/b"));
- // 'LocalSettings.php' generated message display
- $this->assertEquals( "The installer has generated a LocalSettings.php file. It contains all your configuration.",
- $this->getText( LINK_FORM."div[1]/div[2]/p[2]" ));
-
- // 'Download LocalSettings.php'' link available
- $this->assertTrue( $this->isElementPresent( "link=Download LocalSettings.php" ));
-
- // 'enter your wiki' link available
- $this->assertTrue($this->isElementPresent("link=Folder/index.php enter your wiki"));
- }
-
-
-
- public function testRestartInstallation() {
-
- parent::navigateConnetToDatabasePage();
- $this->click( "link=Restart installation" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // Restart installation' label should be available.
- $this->assertEquals( "Restart installation", $this->getText( LINK_DIV."h2" ));
-
- //'Do you want to clear all saved data that you have entered and restart the installation process?' label available
- $this->assertEquals( "Do you want to clear all saved data that you have entered and restart the installation process?",
- $this->getText( "//*[@id='bodyContent']/div/div/div[2]/form/div[1]/div[2]" ));
- // 'Back' button available
- $this->assertTrue($this->isElementPresent( "submit-back" ));
-
- // 'Restart' button available
- $this->assertTrue($this->isElementPresent( "submit-restart" ));
- }
-
-
-
- public function testMediaWikiLogoAvailability() {
-
- $databaseName = DB_NAME_PREFIX."_mediawiki_logo";
- parent::navigateInitialpage();
- parent::mediaWikiLogoPresentInitialScreen();
- $this->click( "link=set up the wiki" );
- $this->waitForPageToLoad( PAGE_LOAD_TIME );
-
- // 'Language' page
- parent::mediaWikiLogoPresent();
- parent::clickContinueButton();
-
- // 'Welcome to MediaWiki' page
- parent::mediaWikiLogoPresent();
- parent::clickContinueButton();
-
- // 'Connet to database' page
- parent::mediaWikiLogoPresent();
- $this->type("mysql_wgDBname", $databaseName );
- parent::clickContinueButton();
-
- // 'Database setting' page
- parent::mediaWikiLogoPresent();
- parent::clickContinueButton();
-
- // 'Name' page
- parent::mediaWikiLogoPresent();
- parent::completeNamePage();
- parent::clickContinueButton();
-
- // 'Options' page
- parent::mediaWikiLogoPresent();
- parent::clickContinueButton();
-
- // 'Install' page
- parent::mediaWikiLogoPresent();
- }
-
-
- public function testRightFramework() {
-
- parent::navigateLanguagePage();
- // Verfy right framework texts display
- $this->assertEquals( "Language",
- $this->getText( LINK_RIGHT_FRAMEWORK."li[1]" ));
- $this->assertEquals( "Existing wiki",
- $this->getText( LINK_RIGHT_FRAMEWORK."li[2]" ));
- $this->assertEquals( "Welcome to MediaWiki!",
- $this->getText( LINK_RIGHT_FRAMEWORK."li[3]" ));
- $this->assertEquals( "Connect to database",
- $this->getText( LINK_RIGHT_FRAMEWORK."li[4]" ));
- $this->assertEquals( "Upgrade existing installation",
- $this->getText( LINK_RIGHT_FRAMEWORK."li[5]" ));
- $this->assertEquals( "Database settings",
- $this->getText( LINK_RIGHT_FRAMEWORK."li[6]" ));
- $this->assertEquals( "Name",
- $this->getText( LINK_RIGHT_FRAMEWORK."li[7]" ));
- $this->assertEquals( "Options",
- $this->getText( LINK_RIGHT_FRAMEWORK."li[8]" ));
- $this->assertEquals( "Install",
- $this->getText( LINK_RIGHT_FRAMEWORK."li[9]" ));
- $this->assertEquals( "Complete!",
- $this->getText( LINK_RIGHT_FRAMEWORK."li[10]/span" ));
- }
-}
diff --git a/tests/selenium/installer/README.txt b/tests/selenium/installer/README.txt
deleted file mode 100644
index bc880a8b..00000000
--- a/tests/selenium/installer/README.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-== Details==
-
-Automated Selenium test scripts written for MediaWiki Installer is available at https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/core.git;a=tree;f=tests/selenium/installer;hb=HEAD.
-Detailed test cases available at http://www.mediawiki.org/wiki/New_installer/Test_plan.
-
-Version : MediaWiki 1.18alpha
-Date : 27/12/2010
-
-== Running tests ==
-
-Test cases can be run independently or can run all the test cases using MediaWikiInstallerTestSuite.php within PHPUnit/Selenium.
-
-
-== Dependencies ==
-
-MediaWikiInstallationConfig.php
-
-Value of the 'DB_NAME_PREFIX' should be replace with the database name prefix. Several DB instances will get created to cover different installation scenarios starting with the above prefix.
-You need to change the value of the 'DB_NAME_PREFIX' in MediaWikiInstallationConfig everytime you planned to
-run the tests.
-'DIRECTORY_NAME', 'PORT' and the 'HOST_NAME' should be replaced with your local values.
-You may specify the test browser you wish to run the test using 'TEST_BROWSER'. Default browser is Firefox.
-
-Note : MediaWikiInstallerTestSuite.php has no dependency on 'Selenium' test framework.
-
-
-== Known problems ==
-
-If you run the MediaWikiInstallerTestSuite.php twice without changing the name of the database, the second run should be falied.
-(Please read the more information on how to change the database name which is avaialable under 'Dependencies' section)
-
-
diff --git a/tests/selenium/selenium_settings.ini.sample b/tests/selenium/selenium_settings.ini.sample
deleted file mode 100644
index b1d88193..00000000
--- a/tests/selenium/selenium_settings.ini.sample
+++ /dev/null
@@ -1,32 +0,0 @@
-[SeleniumSettings]
-
-; Set up the available browsers that Selenium can control.
-browsers[firefox] = "*firefox"
-browsers[iexplorer] = "*iexploreproxy"
-browsers[chrome] = "*chrome"
-
-; The simple configurations above usually work on Linux, but Windows and
-; Mac OS X hosts may need to specify a full path:
-;browsers[firefox] = "*firefox /Applications/Firefox.app/Contents/MacOS/firefox-bin"
-;browsers[firefox] = "*firefox C:\Program Files\Mozilla Firefox\firefox.exe"
-
-host = "localhost"
-port = "4444"
-wikiUrl = "http://localhost/deployment"
-username = "wikiuser"
-userPassword = "wikipass"
-testBrowser = "firefox"
-startserver =
-stopserver =
-jUnitLogFile =
-runAgainstGrid = false
-
-; To let the test runner start and stop the selenium server, it needs the full
-; path to selenium-server.jar from the selenium-remote-control package.
-seleniumserverexecpath = "/opt/local/selenium-remote-control-1.0.3/selenium-server-1.0.3/selenium-server.jar"
-
-[SeleniumTests]
-
-testSuite[SimpleSeleniumTestSuite] = "tests/selenium/suites/SimpleSeleniumTestSuite.php"
-testSuite[WikiEditorTestSuite] = "extensions/WikiEditor/selenium/WikiEditorTestSuite.php"
-
diff --git a/tests/selenium/selenium_settings_grid.ini.sample b/tests/selenium/selenium_settings_grid.ini.sample
deleted file mode 100644
index 3bbd534a..00000000
--- a/tests/selenium/selenium_settings_grid.ini.sample
+++ /dev/null
@@ -1,16 +0,0 @@
-[SeleniumSettings]
-
-host = "grid.tesla.usability.wikimedia.org"
-port = "4444"
-wikiUrl = "http://208.80.152.253:5001"
-username = "wikiuser"
-userPassword = "wikipass"
-testBrowser = "Safari on OS X Snow Leopard"
-jUnitLogFile =
-runAgainstGrid = true
-startserver = false
-stopserver = false
-
-[SeleniumTests]
-
-testSuite[SimpleSeleniumTestSuite] = "tests/selenium/suites/SimpleSeleniumTestSuite.php"
diff --git a/tests/selenium/suites/AddContentToNewPageTestCase.php b/tests/selenium/suites/AddContentToNewPageTestCase.php
deleted file mode 100644
index 72e75e11..00000000
--- a/tests/selenium/suites/AddContentToNewPageTestCase.php
+++ /dev/null
@@ -1,182 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
- */
-
-
-class AddContentToNewPageTestCase extends SeleniumTestCase {
-
-
- // Add bold text and verify output
- public function testAddBoldText() {
-
- $this->getExistingPage();
- $this->clickEditLink();
- $this->loadWikiEditor();
- $this->clearWikiEditor();
- $this->click( "//*[@id='mw-editbutton-bold']" );
- $this->clickShowPreviewBtn();
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify bold text displayed on mediawiki preview
- $this->assertTrue($this->isElementPresent( "//div[@id='wikiPreview']/p/b" ));
- $this->assertTrue($this->isTextPresent( "Bold text" ));
- }
-
- // Add italic text and verify output
- public function testAddItalicText() {
-
- $this->getExistingPage();
- $this->clickEditLink();
- $this->loadWikiEditor();
- $this->clearWikiEditor();
- $this->click( "//*[@id='mw-editbutton-italic']" );
- $this->clickShowPreviewBtn();
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify italic text displayed on mediawiki preview
- $this->assertTrue($this->isElementPresent("//div[@id='wikiPreview']/p/i"));
- $this->assertTrue($this->isTextPresent( "Italic text" ));
- }
-
- // Add internal link for a new page and verify output in the preview
- public function testAddInternalLinkNewPage() {
- $this->getExistingPage();
- $this->clickEditLink();
- $this->loadWikiEditor();
- $this->clearWikiEditor();
- $this->click( "//*[@id='mw-editbutton-link']" );
- $this->clickShowPreviewBtn();
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify internal link displayed on mediawiki preview
- $source = $this->getText( "//*[@id='wikiPreview']/p/a" );
- $correct = strstr( $source, "Link title" );
- $this->assertEquals( $correct, true );
-
- $this->click( SeleniumTestConstants::LINK_START."Link title" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify internal link open as a new page - editing mode
- $source = $this->getText( "firstHeading" );
- $correct = strstr( $source, "Editing Link title" );
- $this->assertEquals( $correct, true );
- }
-
- // Add external link and verify output in the preview
- public function testAddExternalLink() {
- $this->getExistingPage();
- $this->clickEditLink();
- $this->loadWikiEditor();
- $this->clearWikiEditor();
- $this->click( "//*[@id='mw-editbutton-extlink']" );
- $this->type( SeleniumTestConstants::TEXT_EDITOR, "[http://www.google.com Google]" );
- $this->clickShowPreviewBtn();
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify external links displayed on mediawiki preview
- $source = $this->getText( "//*[@id='wikiPreview']/p/a" );
- $correct = strstr( $source, "Google" );
- $this->assertEquals( $correct, true );
-
- $this->click( SeleniumTestConstants::LINK_START."Google" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify external link opens
- $source = $this->getTitle();
- $correct = strstr( $source, "Google" );
- $this->assertEquals( $correct, true);
- }
-
- // Add level 2 headline and verify output in the preview
- public function testAddLevel2HeadLine() {
- $blnElementPresent = false;
- $blnTextPresent = false;
- $this->getExistingPage();
- $this->clickEditLink();
- $this->loadWikiEditor();
- $this->clearWikiEditor();
- $this->click( "mw-editbutton-headline" );
- $this->clickShowPreviewBtn();
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertTrue($this->isElementPresent( "//div[@id='wikiPreview']/h2" ));
-
- // Verify level 2 headline displayed on mediawiki preview
- $source = $this->getText( "//*[@id='Headline_text']" );
- $correct = strstr( $source, "Headline text" );
- $this->assertEquals( $correct, true );
- }
-
- // Add text with ignore wiki format and verify output the preview
- public function testAddNoWikiFormat() {
- $this->getExistingPage();
- $this->clickEditLink();
- $this->loadWikiEditor();
- $this->clearWikiEditor();
- $this->click( "//*[@id='mw-editbutton-nowiki']" );
- $this->clickShowPreviewBtn();
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify ignore wiki format text displayed on mediawiki preview
- $source = $this->getText( "//div[@id='wikiPreview']/p" );
- $correct = strstr( $source, "Insert non-formatted text here" );
- $this->assertEquals( $correct, true );
- }
-
- // Add signature and verify output in the preview
- public function testAddUserSignature() {
- $this->getExistingPage();
- $this->clickEditLink();
- $this->loadWikiEditor();
- $this->clearWikiEditor();
- $this->click( "mw-editbutton-signature" );
- $this->clickShowPreviewBtn();
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify signature displayed on mediawiki preview
- $source = $this->getText( "//*[@id='wikiPreview']/p/a" );
- $username = $this->getText( "//*[@id='pt-userpage']/a" );
- $correct = strstr( $source, $username );
- $this->assertEquals( $correct, true );
- }
-
- // Add horizontal line and verify output in the preview
- public function testHorizontalLine() {
- $this->getExistingPage();
- $this->clickEditLink();
- $this->loadWikiEditor();
- $this->clearWikiEditor();
- $this->click( "mw-editbutton-hr" );
-
- $this->clickShowPreviewBtn();
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify horizontal line displayed on mediawiki preview
- $this->assertTrue( $this->isElementPresent( "//div[@id='wikiPreview']/hr" ));
- $this->deletePage( "new" );
- }
-}
diff --git a/tests/selenium/suites/AddNewPageTestCase.php b/tests/selenium/suites/AddNewPageTestCase.php
deleted file mode 100644
index f3302e5e..00000000
--- a/tests/selenium/suites/AddNewPageTestCase.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
- */
-
-
-class AddNewPageTestCase extends SeleniumTestCase {
-
- // Verify adding a new page
- public function testAddNewPage() {
- $newPage = "new";
- $displayName = "New";
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->type( "searchInput", $newPage );
- $this->click( "searchGoButton" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify 'Search results' text available
- $source = $this->gettext( "firstHeading" );
- $correct = strstr( $source, "Search results" );
- $this->assertEquals( $correct, true);
-
- // Verify 'Create the page "<page name>" on this wiki' text available
- $source = $this->gettext( "//div[@id='bodyContent']/div[4]/p/b" );
- $correct = strstr ( $source, "Create the page \"New\" on this wiki!" );
- $this->assertEquals( $correct, true );
-
- $this->click( SeleniumTestConstants::LINK_START.$displayName );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->assertTrue($this->isElementPresent( SeleniumTestConstants::LINK_START."Create" ));
- $this->type( "wpTextbox1", "add new test page" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
-
- // Verify new page added
- $source = $this->gettext( "firstHeading" );
- $correct = strstr ( $source, $displayName );
- $this->assertEquals( $correct, true );
- }
-}
diff --git a/tests/selenium/suites/CreateAccountTestCase.php b/tests/selenium/suites/CreateAccountTestCase.php
deleted file mode 100644
index 5708bcff..00000000
--- a/tests/selenium/suites/CreateAccountTestCase.php
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
- */
-
-Class CreateAccountTestCase extends SeleniumTestCase {
-
- // Change these values before run the test
- private $userName = "yourname4000";
- private $password = "yourpass4000";
-
- // Verify 'Log in/create account' link existance in Main page.
- public function testMainPageLink() {
-
- $this->click( "link=Log out" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->open( $this->getUrl().'/index.php?title=Main_Page' );
- $this->assertTrue($this->isElementPresent( "link=Log in / create account" ));
- }
-
- // Verify 'Create an account' link existance in 'Log in / create account' Page.
- public function testCreateAccountPageLink() {
-
- $this->click( "link=Log out" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->open( $this->getUrl().'/index.php?title=Main_Page' );
-
- // click Log in / create account link to open Log in / create account' page
- $this->click( "link=Log in / create account" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertTrue($this->isElementPresent( "link=Create an account" ));
- }
-
- // Verify Create account
- public function testCreateAccount() {
-
- $this->click( "link=Log out" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->open( $this->getUrl().'/index.php?title=Main_Page' );
-
- $this->click( "link=Log in / create account" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->click( "link=Create an account" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify for blank user name
- $this->type( "wpName2", "" );
- $this->click( "wpCreateaccount" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertEquals( "Login error\n You have not specified a valid user name.",
- $this->getText( "//div[@id='bodyContent']/div[4]" ));
-
- // Verify for invalid user name
- $this->type( "wpName2", "@" );
- $this->click("wpCreateaccount" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertEquals( "Login error\n You have not specified a valid user name.",
- $this->getText( "//div[@id='bodyContent']/div[4]" ));
-
- // start of test for blank password
- $this->type( "wpName2", $this->userName);
- $this->type( "wpPassword2", "" );
- $this->click( "wpCreateaccount" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertEquals( "Login error\n Passwords must be at least 1 character.",
- $this->getText("//div[@id='bodyContent']/div[4]" ));
-
- $this->type( "wpName2", $this->userName );
- $this->type( "wpPassword2", $this->password );
- $this->click( "wpCreateaccount" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertEquals( "Login error\n The passwords you entered do not match.",
- $this->getText( "//div[@id='bodyContent']/div[4]" ));
-
- $this->type( "wpName2", $this->userName );
- $this->type( "wpPassword2", $this->password );
- $this->type( "wpRetype", $this->password );
- $this->click( "wpCreateaccount" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify successful account creation for valid combination of 'Username', 'Password', 'Retype password'
- $this->assertEquals( "Welcome, ".ucfirst( $this->userName )."!",
- $this->getText( "Welcome,_".ucfirst( $this->userName )."!" ));
- }
-}
-
diff --git a/tests/selenium/suites/DeletePageAdminTestCase.php b/tests/selenium/suites/DeletePageAdminTestCase.php
deleted file mode 100644
index 9898188f..00000000
--- a/tests/selenium/suites/DeletePageAdminTestCase.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
- */
-
-
-class DeletePageAdminTestCase extends SeleniumTestCase {
-
- // Verify adding a new page
- public function testDeletePage() {
-
-
- $newPage = "new";
- $displayName = "New";
-
- $this->open( $this->getUrl().'/index.php?title=Main_Page' );
-
- $this->type( "searchInput", $newPage );
- $this->click( "searchGoButton" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( SeleniumTestConstants::LINK_START.$displayName );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->type( SeleniumTestConstants::TEXT_EDITOR, $newPage." text" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->click( SeleniumTestConstants::LINK_START."Log out" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( SeleniumTestConstants::LINK_START."Log in / create account" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "wpName1", $this->selenium->getUser() );
- $this->type( "wpPassword1", $this->selenium->getPass() );
- $this->click( "wpLoginAttempt" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->type( "searchInput", "new" );
- $this->click( "searchGoButton");
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify 'Delete' link displayed
- $source = $this->gettext( SeleniumTestConstants::LINK_START."Delete" );
- $correct = strstr ( $source, "Delete" );
- $this->assertEquals($correct, true );
-
- $this->click( SeleniumTestConstants::LINK_START."Delete" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify 'Delete' button available
- $this->assertTrue($this->isElementPresent( "wpConfirmB" ));
-
- $this->click( "wpConfirmB" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify 'Action complete' text displayed
- $source = $this->gettext( "firstHeading" );
- $correct = strstr ( $source, "Action complete" );
- $this->assertEquals( $correct, true );
-
- // Verify '<Page Name> has been deleted. See deletion log for a record of recent deletions.' text displayed
- $source = $this->gettext( "//div[@id='bodyContent']/p[1]" );
- $correct = strstr ( $source, "\"New\" has been deleted. See deletion log for a record of recent deletions." );
- $this->assertEquals( $correct, true );
- }
-}
diff --git a/tests/selenium/suites/EmailPasswordTestCase.php b/tests/selenium/suites/EmailPasswordTestCase.php
deleted file mode 100644
index 88d9cf97..00000000
--- a/tests/selenium/suites/EmailPasswordTestCase.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
- */
-
-class EmailPasswordTestCase extends SeleniumTestCase {
-
- // change user name for each and every test (with in 24 hours)
- private $userName = "test1";
-
- public function testEmailPasswordButton() {
-
- $this->click( SeleniumTestConstants::LINK_START."Log out" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->open( $this->getUrl().'/index.php?title=Main_Page' );
-
- // click Log in / create account link to open Log in / create account' page
- $this->click( SeleniumTestConstants::LINK_START."Log in / create account" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertTrue($this->isElementPresent( "wpMailmypassword" ));
- }
-
- // Verify Email password functionality
- public function testEmailPasswordMessages() {
-
- $this->click( SeleniumTestConstants::LINK_START."Log out" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->open( $this->getUrl().'/index.php?title=Main_Page' );
-
- // click Log in / create account link to open Log in / create account' page
- $this->click( SeleniumTestConstants::LINK_START."Log in / create account" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "wpName1", "" );
- $this->click( "wpMailmypassword" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertEquals( "Login error\n You have not specified a valid user name.",
- $this->getText("//div[@id='bodyContent']/div[4]"));
-
- $this->type( "wpName1", $this->userName );
- $this->click( "wpMailmypassword" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Can not run on localhost
- $this->assertEquals( "A new password has been sent to the e-mail address registered for ".ucfirst($this->userName).". Please log in again after you receive it.",
- $this->getText("//div[@id='bodyContent']/div[4]" ));
-
- $this->type( "wpName1", $this->userName );
- $this->click( "wpMailmypassword" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertEquals( "Login error\n A password reminder has already been sent, within the last 24 hours. To prevent abuse, only one password reminder will be sent per 24 hours.",
- $this->getText( "//div[@id='bodyContent']/div[4]" ));
- }
-}
-
diff --git a/tests/selenium/suites/MediaWikiEditorConfig.php b/tests/selenium/suites/MediaWikiEditorConfig.php
deleted file mode 100644
index 072c3cb2..00000000
--- a/tests/selenium/suites/MediaWikiEditorConfig.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
- */
-
-class MediaWikiEditorConfig {
-
- public static function getSettings(&$includeFiles, &$globalConfigs) {
- $includes = array(
- //files that needed to be included would go here
- //commenting out because this does not exist
- //'tests/selenium/suites/MediaWikiCommonFunction.php'
- );
- $configs = array(
- 'wgPageLoadTime' => "600000"
- );
- $includeFiles = array_merge( $includeFiles, $includes );
- $globalConfigs = array_merge( $globalConfigs, $configs);
- return true;
- }
-}
-
-
-
diff --git a/tests/selenium/suites/MediaWikiEditorTestSuite.php b/tests/selenium/suites/MediaWikiEditorTestSuite.php
deleted file mode 100644
index c0aee9f5..00000000
--- a/tests/selenium/suites/MediaWikiEditorTestSuite.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-class MediaWikiEditorTestSuite extends SeleniumTestSuite {
- public function setUp() {
- $this->setLoginBeforeTests( true );
- parent::setUp();
- }
- public function addTests() {
- $testFiles = array(
- 'tests/selenium/suites/AddNewPageTestCase.php',
- 'tests/selenium/suites/AddContentToNewPageTestCase.php',
- 'tests/selenium/suites/PreviewPageTestCase.php',
- 'tests/selenium/suites/SavePageTestCase.php',
- );
- parent::addTestFiles( $testFiles );
- }
-}
-
diff --git a/tests/selenium/suites/MediaWikiExtraTestSuite.php b/tests/selenium/suites/MediaWikiExtraTestSuite.php
deleted file mode 100644
index 5cd0a349..00000000
--- a/tests/selenium/suites/MediaWikiExtraTestSuite.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-class MediaWikiExtraTestSuite extends SeleniumTestSuite {
- public function setUp() {
- $this->setLoginBeforeTests( true );
- parent::setUp();
- }
- public function addTests() {
- $testFiles = array(
- 'tests/selenium/suites/MyContributionsTestCase.php',
- 'tests/selenium/suites/MyWatchListTestCase.php',
- 'tests/selenium/suites/UserPreferencesTestCase.php',
- 'tests/selenium/suites/MovePageTestCase.php',
- 'tests/selenium/suites/PageSearchTestCase.php',
- 'tests/selenium/suites/EmailPasswordTestCase.php',
- 'tests/selenium/suites/CreateAccountTestCase.php'
- );
- parent::addTestFiles( $testFiles );
- }
-}
diff --git a/tests/selenium/suites/MediawikiCoreSmokeTestCase.php b/tests/selenium/suites/MediawikiCoreSmokeTestCase.php
deleted file mode 100644
index 6b8fc974..00000000
--- a/tests/selenium/suites/MediawikiCoreSmokeTestCase.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-/*
- * Stub of tests be need as part of the hack-a-ton
- */
-class MediawikiCoreSmokeTestCase extends SeleniumTestCase {
- public function testUserLogin() {
-
- }
-
- public function testChangeUserPreference() {
-
- }
-
- /**
- * TODO: generalize this test to be reusable for different skins
- */
- public function testCreateNewPageVector() {
-
- }
-
- /**
- * TODO: generalize this test to be reusable for different skins
- */
- public function testEditExistingPageVector() {
-
- }
-
- /**
- * TODO: generalize this test to be reusable for different skins
- */
- public function testCreateNewPageMonobook() {
-
- }
-
- /**
- * TODO: generalize this test to be reusable for different skins
- */
- public function testEditExistingPageMonobook() {
-
- }
-
- public function testImageUpload() {
- $this->login();
- $this->open( $this->getUrl() .
- '/index.php?title=Special:Upload' );
- $this->type( 'wpUploadFile', __DIR__ .
- "\\..\\data\\Wikipedia-logo-v2-de.png" );
- $this->check( 'wpIgnoreWarning' );
- $this->click( 'wpUpload' );
- $this->waitForPageToLoad( 30000 );
-
- $this->assertSeleniumHTMLContains(
- '//h1[@class="firstHeading"]', "Wikipedia-logo-v2-de.png" );
-
- /*
- $this->open( $this->getUrl() . '/index.php?title=Image:'
- . ucfirst( $this->filename ) . '&action=delete' );
- $this->type( 'wpReason', 'Remove test file' );
- $this->click( 'mw-filedelete-submit' );
- $this->waitForPageToLoad( 10000 );
-
- // Todo: This message is localized
- $this->assertSeleniumHTMLContains( '//div[@id="bodyContent"]/p',
- ucfirst( $this->filename ) . '.*has been deleted.' );
- */
- }
-
-
-}
diff --git a/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php b/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php
deleted file mode 100644
index a9a9b4d6..00000000
--- a/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-/**
- * Stubs for now. We're going to start populating this test.
- */
-class MediawikiCoreSmokeTestSuite extends SeleniumTestSuite
-{
- public function setUp() {
- $this->setLoginBeforeTests( false );
- parent::setUp();
- }
- public function addTests() {
- $testFiles = array(
- 'tests/selenium/suites/MediawikiCoreSmokeTestCase.php'
- );
- parent::addTestFiles( $testFiles );
- }
-
-
-}
diff --git a/tests/selenium/suites/MovePageTestCase.php b/tests/selenium/suites/MovePageTestCase.php
deleted file mode 100644
index 5263e7bb..00000000
--- a/tests/selenium/suites/MovePageTestCase.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
- */
-
-class MovePageTestCase extends SeleniumTestCase {
-
- // Verify move(rename) wiki page
- public function testMovePage() {
-
- $newPage = "mypage99";
- $displayName = "Mypage99";
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->type( "searchInput", $newPage );
- $this->click( "searchGoButton" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( "link=".$displayName );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->type( SeleniumTestConstants::TEXT_EDITOR, $newPage." text" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify link 'Move' available
- $this->assertTrue($this->isElementPresent( "link=Move" ));
-
- $this->click( "link=Move" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify correct page name displayed under 'Move Page' field
- $this->assertEquals($displayName,
- $this->getText("//table[@id='mw-movepage-table']/tbody/tr[1]/td[2]/strong/a"));
- $movePageName = $this->getText( "//table[@id='mw-movepage-table']/tbody/tr[1]/td[2]/strong/a" );
-
- // Verify 'To new title' field has current page name as the default name
- $newTitle = $this->getValue( "wpNewTitle" );
- $correct = strstr( $movePageName , $newTitle );
- $this->assertEquals( $correct, true );
-
- $this->type( "wpNewTitle", $displayName );
- $this->click( "wpMove" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify warning message for the same source and destination titles
- $this->assertEquals( "Source and destination titles are the same; cannot move a page over itself.",
- $this->getText("//div[@id='bodyContent']/p[4]/strong" ));
-
- // Verify warning message for the blank title
- $this->type( "wpNewTitle", "" );
- $this->click( "wpMove" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify warning message for the blank title
- $this->assertEquals( "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title. It may contain one or more characters which cannot be used in titles.",
- $this->getText( "//div[@id='bodyContent']/p[4]/strong" ));
-
- // Verify warning messages for the invalid titles
- $this->type( "wpNewTitle", "# < > [ ] | { }" );
- $this->click( "wpMove" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertEquals( "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title. It may contain one or more characters which cannot be used in titles.",
- $this->getText( "//div[@id='bodyContent']/p[4]/strong" ));
-
- $this->type( "wpNewTitle", $displayName."move" );
- $this->click( "wpMove" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify move success message displayed correctly
- $this->assertEquals( "\"".$displayName."\" has been moved to \"".$displayName."move"."\"",
- $this->getText( "//div[@id='bodyContent']/p[1]/b" ));
-
- $this->type( "searchInput", $newPage."move" );
- $this->click( "searchGoButton" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify search using new page name
- $this->assertEquals( $displayName."move", $this->getText( "firstHeading" ));
-
- $this->type( "searchInput", $newPage );
- $this->click( "searchGoButton" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify search using old page name
- $redirectPageName = $this->getText( "//*[@id='contentSub']" );
- $this->assertEquals( "(Redirected from ".$displayName.")" , $redirectPageName );
-
- // newpage delete
- $this->deletePage( $newPage."move" );
- $this->deletePage( $newPage );
- }
-}
-
diff --git a/tests/selenium/suites/MyContributionsTestCase.php b/tests/selenium/suites/MyContributionsTestCase.php
deleted file mode 100644
index b8d2d48d..00000000
--- a/tests/selenium/suites/MyContributionsTestCase.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
- */
-
-require_once dirname( __DIR__ ) . '/SeleniumTestConstants.php';
-
-class MyContributionsTestCase extends SeleniumTestCase {
-
- // Verify user contributions
- public function testRecentChangesAvailability() {
-
- $newPage = $this->createNewTestPage( "MyContributionsTest" );
-
- // Verify My contributions Link available
- $this->assertTrue($this->isElementPresent( "link=Contributions" ));
-
-
- $this->click( "link=Contributions" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify recent page adding available on My Contributions list
- $this->assertEquals( $newPage, $this->getText( "link=".$newPage ));
-
- $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, $newPage );
- $this->click( SeleniumTestConstants::BUTTON_SEARCH );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->click( SeleniumTestConstants::LINK_EDIT );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->type( SeleniumTestConstants::TEXT_EDITOR, $newPage . " text changed" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( "link=Contributions" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify recent page changes available on My Contributions
- $this->assertTrue( $this->isTextPresent( $newPage ) );
- }
-}
-
diff --git a/tests/selenium/suites/MyWatchListTestCase.php b/tests/selenium/suites/MyWatchListTestCase.php
deleted file mode 100644
index 998fab9d..00000000
--- a/tests/selenium/suites/MyWatchListTestCase.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
- */
-
-require_once dirname( __DIR__ ) . '/SeleniumTestConstants.php';
-
-class MyWatchListTestCase extends SeleniumTestCase {
-
- // Verify user watchlist
- public function testMyWatchlist() {
-
- $pageName = $this->createNewTestPage( "MyWatchListTest", true );
- // Verify link 'My Watchlist' available
- $this->assertTrue( $this->isElementPresent( SeleniumTestConstants::LINK_START."Watchlist" ) );
-
- $this->click( SeleniumTestConstants::LINK_START."Watchlist" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify newly added page to the watchlist is available
- $this->assertEquals( $pageName, $this->getText( SeleniumTestConstants::LINK_START.$pageName ));
-
- $this->click( SeleniumTestConstants::LINK_START.$pageName );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( SeleniumTestConstants::LINK_EDIT );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( "wpWatchthis" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
- $this->assertFalse( $this->isElementPresent( SeleniumTestConstants::LINK_START.$pageName ) );
- //todo watch using the dropdown menu
- }
-}
-
diff --git a/tests/selenium/suites/PageDeleteTestSuite.php b/tests/selenium/suites/PageDeleteTestSuite.php
deleted file mode 100644
index 256e3542..00000000
--- a/tests/selenium/suites/PageDeleteTestSuite.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-class PageDeleteTestSuite extends SeleniumTestSuite {
- public function setUp() {
- $this->setLoginBeforeTests( true );
- parent::setUp();
- }
- public function addTests() {
- $testFiles = array(
- 'tests/selenium/suites/DeletePageAdminTestCase.php'
- );
- parent::addTestFiles( $testFiles );
- }
-
-
-}
diff --git a/tests/selenium/suites/PageSearchTestCase.php b/tests/selenium/suites/PageSearchTestCase.php
deleted file mode 100644
index fe71eada..00000000
--- a/tests/selenium/suites/PageSearchTestCase.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
- */
-
-class PageSearchTestCase extends SeleniumTestCase {
-
- // Verify the functionality of the 'Go' button
- public function testPageSearchBtnGo() {
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "calcey qa" );
- $this->click( "searchGoButton" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify no page matched with the entered search text
- $source = $this->gettext( "//div[@id='bodyContent']/div[4]/p/b" );
- $correct = strstr ( $source, "Create the page \"Calcey qa\" on this wiki!" );
- $this->assertEquals( $correct, true );
-
- $this->click( "link=Calcey qa" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( SeleniumTestConstants::TEXT_EDITOR , "Calcey QA team" );
- $this->click( "wpSave" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- }
-
- // Verify the functionality of the 'Search' button
- public function testPageSearchBtnSearch() {
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "Calcey web" );
- $this->click( SeleniumTestConstants::BUTTON_SEARCH );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify no page is available as the search text
- $source = $this->gettext( "//div[@id='bodyContent']/div[4]/p[2]/b" );
- $correct = strstr ( $source, "Create the page \"Calcey web\" on this wiki!" );
- $this->assertEquals( $correct, true );
-
- $this->click( "link=Calcey web" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( SeleniumTestConstants::TEXT_EDITOR, "Calcey web team" );
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify saved page is opened when the exact page name is given
- $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "Calcey web" );
- $this->click( SeleniumTestConstants::BUTTON_SEARCH );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify exact page matched with the entered search text using 'Search' button
- $source = $this->getText( "//*[@id='bodyContent']/div[4]/p/b" );
- $correct = strstr( $source, "There is a page named \"Calcey web\" on this wiki." );
- $this->assertEquals( $correct, true );
-
- // Verify resutls available when partial page name is entered as the search text
- $this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "Calcey" );
- $this->click( SeleniumTestConstants::BUTTON_SEARCH );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify text avaialble in the search result under the page titles
- if($this->isElementPresent( "Page_title_matches" )) {
- $textPageTitle = $this->getText( "//*[@id='bodyContent']/div[4]/ul[1]/li[1]/div[1]/a" );
- $this->assertContains( 'Calcey', $textPageTitle );
- }
-
- // Verify text avaialble in the search result under the page text
- if($this->isElementPresent( "Page_text_matches" )) {
- $textPageText = $this->getText( "//*[@id='bodyContent']/div[4]/ul[2]/li[2]/div[2]/span" );
- $this->assertContains( 'Calcey', $textPageText );
- }
- $this->deletePage("Calcey QA");
- $this->deletePage("Calcey web");
- }
-}
diff --git a/tests/selenium/suites/PreviewPageTestCase.php b/tests/selenium/suites/PreviewPageTestCase.php
deleted file mode 100644
index 32206b98..00000000
--- a/tests/selenium/suites/PreviewPageTestCase.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
- */
-
-class PreviewPageTestCase extends SeleniumTestCase {
-
- // Verify adding a new page
- public function testPreviewPage() {
- $wikiText = "Adding this page to test the \n Preview button functionality";
- $newPage = "Test Preview Page";
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->getNewPage( $newPage );
- $this->type( SeleniumTestConstants::TEXT_EDITOR, $wikiText."" );
- $this->assertTrue($this->isElementPresent( "//*[@id='wpPreview']" ));
-
- $this->click( "wpPreview" );
-
- // Verify saved page available
- $source = $this->gettext( "firstHeading" );
- $correct = strstr( $source, "Test Preview Page" );
- $this->assertEquals( $correct, true);
-
- // Verify page content previewed succesfully
- $contentOfPreviewPage = $this->getText( "//*[@id='content']" );
- $this->assertContains( $wikiText, $contentOfPreviewPage );
- }
-}
diff --git a/tests/selenium/suites/SavePageTestCase.php b/tests/selenium/suites/SavePageTestCase.php
deleted file mode 100644
index 310ff20a..00000000
--- a/tests/selenium/suites/SavePageTestCase.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
- */
-
-class SavePageTestCase extends SeleniumTestCase {
-
- // Verify adding a new page
- public function testSavePage() {
- $wikiText = "Adding this page to test the Save button functionality";
- $newPage = "Test Save Page";
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->getNewPage($newPage);
- $this->type( SeleniumTestConstants::TEXT_EDITOR, $wikiText );
-
- // verify 'Save' button available
- $this->assertTrue($this->isElementPresent( SeleniumTestConstants::BUTTON_SAVE ));
- $this->click( SeleniumTestConstants::BUTTON_SAVE );
-
- // Verify saved page available
- $source = $this->gettext( "firstHeading" );
- $correct = strstr( $source, "Test Save Page" );
-
- // Verify Saved page name displayed correctly
- $this->assertEquals( $correct, true );
-
- // Verify page content saved succesfully
- $contentOfSavedPage = $this->getText( "//*[@id='content']" );
- $this->assertContains( $wikiText, $contentOfSavedPage );
- $this->deletePage( $newPage );
- }
-}
diff --git a/tests/selenium/suites/SimpleSeleniumConfig.php b/tests/selenium/suites/SimpleSeleniumConfig.php
deleted file mode 100644
index 54def35a..00000000
--- a/tests/selenium/suites/SimpleSeleniumConfig.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-class SimpleSeleniumConfig {
-
- public static function getSettings(&$includeFiles, &$globalConfigs, &$resourceFiles) {
- global $IP;
- $includes = array(
- //files that needed to be included would go here
- );
- $configs = array(
- 'wgDBprefix' => 'mw_',
- 'wgDBTableOptions' => 'ENGINE=InnoDB, DEFAULT CHARSET=binary',
- 'wgDBmysql5' => 'false',
- 'wgMainCacheType' => 'CACHE_NONE',
- 'wgParserCacheType' => 'CACHE_NONE',
- 'wgMemCachedServers'=> array(),
- 'wgLanguageCode' => 'en',
- 'wgSitename' => 'test_wiki',
- 'wgDefaultSkin' => 'chick'
- );
- $resources = array(
- 'db' => "$IP/tests/selenium/data/SimpleSeleniumTestDB.sql",
- 'images' => "$IP/tests/selenium/data/SimpleSeleniumTestImages.zip"
- );
-
- $includeFiles = array_merge( $includeFiles, $includes );
- $globalConfigs = array_merge( $globalConfigs, $configs);
- $resourceFiles = array_merge( $resourceFiles, $resources );
- return true;
- }
-} \ No newline at end of file
diff --git a/tests/selenium/suites/SimpleSeleniumTestCase.php b/tests/selenium/suites/SimpleSeleniumTestCase.php
deleted file mode 100644
index b87172e6..00000000
--- a/tests/selenium/suites/SimpleSeleniumTestCase.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/*
- * This test case is part of the SimpleSeleniumTestSuite.
- * Configuration for these tests are documented as part of SimpleSeleniumTestSuite.php
- */
-class SimpleSeleniumTestCase extends SeleniumTestCase {
- public function testBasic() {
- $this->open( $this->getUrl() .
- '/index.php?title=Selenium&action=edit' );
- $this->type( "wpTextbox1", "This is a basic test" );
- $this->click( "wpPreview" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // check result
- $source = $this->getText( "//div[@id='wikiPreview']/p" );
- $correct = strstr( $source, "This is a basic test" );
- $this->assertEquals( $correct, true );
- }
-
- /**
- * All this test really does is verify that a global var was set.
- * It depends on $wgDefaultSkin = 'chick'; being set
- */
- public function testGlobalVariableForDefaultSkin() {
- $this->open( $this->getUrl() . '/index.php' );
- $bodyClass = $this->getAttribute( "//body/@class" );
- $this-> assertContains('skin-chick', $bodyClass, 'Chick skin not set');
- }
-
- /**
- * Just verify that the test db was loaded correctly
- */
- public function testDatabaseResourceLoadedCorrectly() {
- $this->open( $this->getUrl() . '/index.php/TestResources?action=purge' );
- $testString = $this->gettext( "//body//*[@id='firstHeading']" );
- $this-> assertEquals('TestResources', $testString, 'Article that should be present in the test db was not found.');
- }
-
-}
diff --git a/tests/selenium/suites/SimpleSeleniumTestSuite.php b/tests/selenium/suites/SimpleSeleniumTestSuite.php
deleted file mode 100644
index 2e0c4ee2..00000000
--- a/tests/selenium/suites/SimpleSeleniumTestSuite.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Sample test suite.
- * Two ways to configure MW for these tests
- * 1) If you are running multiple test suites, add the following in LocalSettings.php
- * require_once("tests/selenium/SimpleSeleniumConfig.php");
- * $wgSeleniumTestConfigs['SimpleSeleniumTestSuite'] = 'SimpleSeleniumConfig::getSettings';
- * OR
- * 2) Add the following to your Localsettings.php
- * $wgDefaultSkin = 'chick';
- */
-class SimpleSeleniumTestSuite extends SeleniumTestSuite
-{
- public function setUp() {
- $this->setLoginBeforeTests( false );
- parent::setUp();
- }
- public function addTests() {
- $testFiles = array(
- 'selenium/suites/SimpleSeleniumTestCase.php'
- );
- parent::addTestFiles( $testFiles );
- }
-
-
-}
diff --git a/tests/selenium/suites/UserPreferencesTestCase.php b/tests/selenium/suites/UserPreferencesTestCase.php
deleted file mode 100644
index 3ceb3a99..00000000
--- a/tests/selenium/suites/UserPreferencesTestCase.php
+++ /dev/null
@@ -1,179 +0,0 @@
-<?php
-
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @addtogroup Testing
- *
- */
-
-class UserPreferencesTestCase extends SeleniumTestCase {
-
- // Verify user information
- public function testUserInfoDisplay() {
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->click( SeleniumTestConstants::LINK_START."My preferences" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify correct username displayed in User Preferences
- $this->assertEquals( $this->getText( "//li[@id='pt-userpage']/a" ),
- $this->getText( "//table[@id='mw-htmlform-info']/tbody/tr[1]/td[2]" ));
-
- // Verify existing Signature Displayed correctly
- $this->assertEquals( $this->selenium->getUser(),
- $this->getTable( "mw-htmlform-signature.0.1" ) );
- }
-
- // Verify change password
- public function testChangePassword() {
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->click( SeleniumTestConstants::LINK_START."My preferences" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->click( SeleniumTestConstants::LINK_START."Change password" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "wpPassword", "12345" );
- $this->type( "wpNewPassword", "54321" );
- $this->type( "wpRetype", "54321" );
- $this->click( "//input[@value='Change password']" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->assertEquals( "Preferences", $this->getText( "firstHeading" ));
-
- $this->click( SeleniumTestConstants::LINK_START."Change password" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "wpPassword", "54321" );
- $this->type( "wpNewPassword", "12345" );
- $this->type( "wpRetype", "12345" );
- $this->click( "//input[@value='Change password']" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->assertEquals( "Preferences", $this->getText( "firstHeading" ));
-
- $this->click( SeleniumTestConstants::LINK_START."Change password" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "wpPassword", "54321" );
- $this->type( "wpNewPassword", "12345" );
- $this->type( "wpRetype", "12345" );
- $this->click( "//input[@value='Change password']" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- }
-
- // Verify successful preferences save
- public function testSuccessfullSave() {
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->click( SeleniumTestConstants::LINK_START."My preferences" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "mw-input-realname", "Test User" );
- $this->click( "prefcontrol" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify "Your preferences have been saved." message
- $this->assertEquals( "Your preferences have been saved.",
- $this->getText( "//div[@id='bodyContent']/div[4]/strong/p" ));
- $this->type( "mw-input-realname", "" );
- $this->click( "prefcontrol" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- }
-
- // Verify change signature
- public function testChangeSignature() {
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->click( SeleniumTestConstants::LINK_START."My preferences" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->type( "mw-input-nickname", "TestSignature" );
- $this->click( "prefcontrol" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify change user signature
- $this->assertEquals( "TestSignature", $this->getText( SeleniumTestConstants::LINK_START."TestSignature" ));
- $this->type( "mw-input-nickname", "Test" );
- $this->click( "prefcontrol" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- }
-
- // Verify change date format
- public function testChangeDateFormatTimeZone() {
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
-
- $this->click( SeleniumTestConstants::LINK_START."My preferences" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
- $this->click( SeleniumTestConstants::LINK_START."Date and time" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- $this->click( "mw-input-date-dmy" );
- $this->select( "mw-input-timecorrection", "label=Asia/Colombo" );
- $this->click( "prefcontrol" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify Date format and time zome saved
- $this->assertEquals( "Your preferences have been saved.",
- $this->getText( "//div[@id='bodyContent']/div[4]/strong/p" ));
- }
-
- // Verify restoring all default settings
- public function testSetAllDefault() {
-
- $this->open( $this->getUrl() .
- '/index.php?title=Main_Page&action=edit' );
- $this->click( SeleniumTestConstants::LINK_START."My preferences" );
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify restoring all default settings
- $this->assertEquals( "Restore all default settings",
- $this->getText( SeleniumTestConstants::LINK_START."Restore all default settings" ));
-
- $this->click("//*[@id='preferences']/div/a");
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify 'This can not be undone' warning message displayed
- $this->assertTrue($this->isElementPresent("//input[@value='Restore all default settings']"));
-
- // Verify 'Restore all default settings' button available
- $this->assertEquals("You can use this page to reset your preferences to the site defaults. This cannot be undone.",
- $this->getText("//div[@id='bodyContent']/p"));
-
- $this->click("//input[@value='Restore all default settings']");
- $this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
- // Verify preferences saved successfully
- $this->assertEquals("Your preferences have been saved.",
- $this->getText("//div[@id='bodyContent']/div[4]/strong/p"));
- }
-}
-
diff --git a/tests/testHelpers.inc b/tests/testHelpers.inc
deleted file mode 100644
index 39e18c92..00000000
--- a/tests/testHelpers.inc
+++ /dev/null
@@ -1,582 +0,0 @@
-<?php
-
-class TestRecorder {
- var $parent;
- var $term;
-
- function __construct( $parent ) {
- $this->parent = $parent;
- $this->term = $parent->term;
- }
-
- function start() {
- $this->total = 0;
- $this->success = 0;
- }
-
- function record( $test, $result ) {
- $this->total++;
- $this->success += ( $result ? 1 : 0 );
- }
-
- function end() {
- // dummy
- }
-
- function report() {
- if ( $this->total > 0 ) {
- $this->reportPercentage( $this->success, $this->total );
- } else {
- throw new MWException( "No tests found.\n" );
- }
- }
-
- function reportPercentage( $success, $total ) {
- $ratio = wfPercent( 100 * $success / $total );
- print $this->term->color( 1 ) . "Passed $success of $total tests ($ratio)... ";
-
- if ( $success == $total ) {
- print $this->term->color( 32 ) . "ALL TESTS PASSED!";
- } else {
- $failed = $total - $success ;
- print $this->term->color( 31 ) . "$failed tests failed!";
- }
-
- print $this->term->reset() . "\n";
-
- return ( $success == $total );
- }
-}
-
-class DbTestPreviewer extends TestRecorder {
- protected $lb; // /< Database load balancer
- protected $db; // /< Database connection to the main DB
- protected $curRun; // /< run ID number for the current run
- protected $prevRun; // /< run ID number for the previous run, if any
- protected $results; // /< Result array
-
- /**
- * This should be called before the table prefix is changed
- */
- function __construct( $parent ) {
- parent::__construct( $parent );
-
- $this->lb = wfGetLBFactory()->newMainLB();
- // This connection will have the wiki's table prefix, not parsertest_
- $this->db = $this->lb->getConnection( DB_MASTER );
- }
-
- /**
- * Set up result recording; insert a record for the run with the date
- * and all that fun stuff
- */
- function start() {
- parent::start();
-
- if ( ! $this->db->tableExists( 'testrun', __METHOD__ )
- || ! $this->db->tableExists( 'testitem', __METHOD__ ) )
- {
- print "WARNING> `testrun` table not found in database.\n";
- $this->prevRun = false;
- } else {
- // We'll make comparisons against the previous run later...
- $this->prevRun = $this->db->selectField( 'testrun', 'MAX(tr_id)' );
- }
-
- $this->results = array();
- }
-
- function record( $test, $result ) {
- parent::record( $test, $result );
- $this->results[$test] = $result;
- }
-
- function report() {
- if ( $this->prevRun ) {
- // f = fail, p = pass, n = nonexistent
- // codes show before then after
- $table = array(
- 'fp' => 'previously failing test(s) now PASSING! :)',
- 'pn' => 'previously PASSING test(s) removed o_O',
- 'np' => 'new PASSING test(s) :)',
-
- 'pf' => 'previously passing test(s) now FAILING! :(',
- 'fn' => 'previously FAILING test(s) removed O_o',
- 'nf' => 'new FAILING test(s) :(',
- 'ff' => 'still FAILING test(s) :(',
- );
-
- $prevResults = array();
-
- $res = $this->db->select( 'testitem', array( 'ti_name', 'ti_success' ),
- array( 'ti_run' => $this->prevRun ), __METHOD__ );
-
- foreach ( $res as $row ) {
- if ( !$this->parent->regex
- || preg_match( "/{$this->parent->regex}/i", $row->ti_name ) )
- {
- $prevResults[$row->ti_name] = $row->ti_success;
- }
- }
-
- $combined = array_keys( $this->results + $prevResults );
-
- # Determine breakdown by change type
- $breakdown = array();
- foreach ( $combined as $test ) {
- if ( !isset( $prevResults[$test] ) ) {
- $before = 'n';
- } elseif ( $prevResults[$test] == 1 ) {
- $before = 'p';
- } else /* if ( $prevResults[$test] == 0 )*/ {
- $before = 'f';
- }
-
- if ( !isset( $this->results[$test] ) ) {
- $after = 'n';
- } elseif ( $this->results[$test] == 1 ) {
- $after = 'p';
- } else /*if ( $this->results[$test] == 0 ) */ {
- $after = 'f';
- }
-
- $code = $before . $after;
-
- if ( isset( $table[$code] ) ) {
- $breakdown[$code][$test] = $this->getTestStatusInfo( $test, $after );
- }
- }
-
- # Write out results
- foreach ( $table as $code => $label ) {
- if ( !empty( $breakdown[$code] ) ) {
- $count = count( $breakdown[$code] );
- printf( "\n%4d %s\n", $count, $label );
-
- foreach ( $breakdown[$code] as $differing_test_name => $statusInfo ) {
- print " * $differing_test_name [$statusInfo]\n";
- }
- }
- }
- } else {
- print "No previous test runs to compare against.\n";
- }
-
- print "\n";
- parent::report();
- }
-
- /**
- * Returns a string giving information about when a test last had a status change.
- * Could help to track down when regressions were introduced, as distinct from tests
- * which have never passed (which are more change requests than regressions).
- */
- private function getTestStatusInfo( $testname, $after ) {
- // If we're looking at a test that has just been removed, then say when it first appeared.
- if ( $after == 'n' ) {
- $changedRun = $this->db->selectField ( 'testitem',
- 'MIN(ti_run)',
- array( 'ti_name' => $testname ),
- __METHOD__ );
- $appear = $this->db->selectRow ( 'testrun',
- array( 'tr_date', 'tr_mw_version' ),
- array( 'tr_id' => $changedRun ),
- __METHOD__ );
-
- return "First recorded appearance: "
- . date( "d-M-Y H:i:s", strtotime ( $appear->tr_date ) )
- . ", " . $appear->tr_mw_version;
- }
-
- // Otherwise, this test has previous recorded results.
- // See when this test last had a different result to what we're seeing now.
- $conds = array(
- 'ti_name' => $testname,
- 'ti_success' => ( $after == 'f' ? "1" : "0" ) );
-
- if ( $this->curRun ) {
- $conds[] = "ti_run != " . $this->db->addQuotes ( $this->curRun );
- }
-
- $changedRun = $this->db->selectField ( 'testitem', 'MAX(ti_run)', $conds, __METHOD__ );
-
- // If no record of ever having had a different result.
- if ( is_null ( $changedRun ) ) {
- if ( $after == "f" ) {
- return "Has never passed";
- } else {
- return "Has never failed";
- }
- }
-
- // Otherwise, we're looking at a test whose status has changed.
- // (i.e. it used to work, but now doesn't; or used to fail, but is now fixed.)
- // In this situation, give as much info as we can as to when it changed status.
- $pre = $this->db->selectRow ( 'testrun',
- array( 'tr_date', 'tr_mw_version' ),
- array( 'tr_id' => $changedRun ),
- __METHOD__ );
- $post = $this->db->selectRow ( 'testrun',
- array( 'tr_date', 'tr_mw_version' ),
- array( "tr_id > " . $this->db->addQuotes ( $changedRun ) ),
- __METHOD__,
- array( "LIMIT" => 1, "ORDER BY" => 'tr_id' )
- );
-
- if ( $post ) {
- $postDate = date( "d-M-Y H:i:s", strtotime ( $post->tr_date ) ) . ", {$post->tr_mw_version}";
- } else {
- $postDate = 'now';
- }
-
- return ( $after == "f" ? "Introduced" : "Fixed" ) . " between "
- . date( "d-M-Y H:i:s", strtotime ( $pre->tr_date ) ) . ", " . $pre->tr_mw_version
- . " and $postDate";
-
- }
-
- /**
- * Commit transaction and clean up for result recording
- */
- function end() {
- $this->lb->commitMasterChanges();
- $this->lb->closeAll();
- parent::end();
- }
-
-}
-
-class DbTestRecorder extends DbTestPreviewer {
- var $version;
-
- /**
- * Set up result recording; insert a record for the run with the date
- * and all that fun stuff
- */
- function start() {
- $this->db->begin();
-
- if ( ! $this->db->tableExists( 'testrun' )
- || ! $this->db->tableExists( 'testitem' ) )
- {
- print "WARNING> `testrun` table not found in database. Trying to create table.\n";
- $this->db->sourceFile( $this->db->patchPath( 'patch-testrun.sql' ) );
- echo "OK, resuming.\n";
- }
-
- parent::start();
-
- $this->db->insert( 'testrun',
- array(
- 'tr_date' => $this->db->timestamp(),
- 'tr_mw_version' => $this->version,
- 'tr_php_version' => phpversion(),
- 'tr_db_version' => $this->db->getServerVersion(),
- 'tr_uname' => php_uname()
- ),
- __METHOD__ );
- if ( $this->db->getType() === 'postgres' ) {
- $this->curRun = $this->db->currentSequenceValue( 'testrun_id_seq' );
- } else {
- $this->curRun = $this->db->insertId();
- }
- }
-
- /**
- * Record an individual test item's success or failure to the db
- *
- * @param $test String
- * @param $result Boolean
- */
- function record( $test, $result ) {
- parent::record( $test, $result );
-
- $this->db->insert( 'testitem',
- array(
- 'ti_run' => $this->curRun,
- 'ti_name' => $test,
- 'ti_success' => $result ? 1 : 0,
- ),
- __METHOD__ );
- }
-}
-
-class TestFileIterator implements Iterator {
- private $file;
- private $fh;
- private $parserTest; /* An instance of ParserTest (parserTests.php) or MediaWikiParserTest (phpunit) */
- private $index = 0;
- private $test;
- private $section = null; /** String|null: current test section being analyzed */
- private $sectionData = array();
- private $lineNum;
- private $eof;
-
- function __construct( $file, $parserTest ) {
- $this->file = $file;
- $this->fh = fopen( $this->file, "rt" );
-
- if ( !$this->fh ) {
- throw new MWException( "Couldn't open file '$file'\n" );
- }
-
- $this->parserTest = $parserTest;
-
- $this->lineNum = $this->index = 0;
- }
-
- function rewind() {
- if ( fseek( $this->fh, 0 ) ) {
- throw new MWException( "Couldn't fseek to the start of '$this->file'\n" );
- }
-
- $this->index = -1;
- $this->lineNum = 0;
- $this->eof = false;
- $this->next();
-
- return true;
- }
-
- function current() {
- return $this->test;
- }
-
- function key() {
- return $this->index;
- }
-
- function next() {
- if ( $this->readNextTest() ) {
- $this->index++;
- return true;
- } else {
- $this->eof = true;
- }
- }
-
- function valid() {
- return $this->eof != true;
- }
-
- function readNextTest() {
- $this->clearSection();
-
- # Create a fake parser tests which never run anything unless
- # asked to do so. This will avoid running hooks for a disabled test
- $delayedParserTest = new DelayedParserTest();
-
- while ( false !== ( $line = fgets( $this->fh ) ) ) {
- $this->lineNum++;
- $matches = array();
-
- if ( preg_match( '/^!!\s*(\w+)/', $line, $matches ) ) {
- $this->section = strtolower( $matches[1] );
-
- if ( $this->section == 'endarticle' ) {
- $this->checkSection( 'text' );
- $this->checkSection( 'article' );
-
- $this->parserTest->addArticle( ParserTest::chomp( $this->sectionData['article'] ), $this->sectionData['text'], $this->lineNum );
-
- $this->clearSection();
-
- continue;
- }
-
- if ( $this->section == 'endhooks' ) {
- $this->checkSection( 'hooks' );
-
- foreach ( explode( "\n", $this->sectionData['hooks'] ) as $line ) {
- $line = trim( $line );
-
- if ( $line ) {
- $delayedParserTest->requireHook( $line );
- }
- }
-
- $this->clearSection();
-
- continue;
- }
-
- if ( $this->section == 'endfunctionhooks' ) {
- $this->checkSection( 'functionhooks' );
-
- foreach ( explode( "\n", $this->sectionData['functionhooks'] ) as $line ) {
- $line = trim( $line );
-
- if ( $line ) {
- $delayedParserTest->requireFunctionHook( $line );
- }
- }
-
- $this->clearSection();
-
- continue;
- }
-
- if ( $this->section == 'end' ) {
- $this->checkSection( 'test' );
- $this->checkSection( 'input' );
- $this->checkSection( 'result' );
-
- if ( !isset( $this->sectionData['options'] ) ) {
- $this->sectionData['options'] = '';
- }
-
- if ( !isset( $this->sectionData['config'] ) ) {
- $this->sectionData['config'] = '';
- }
-
- if ( ( ( preg_match( '/\\bdisabled\\b/i', $this->sectionData['options'] ) && !$this->parserTest->runDisabled )
- || !preg_match( "/" . $this->parserTest->regex . "/i", $this->sectionData['test'] ) ) ) {
- # disabled test
- $this->clearSection();
-
- # Forget any pending hooks call since test is disabled
- $delayedParserTest->reset();
-
- continue;
- }
-
- # We are really going to run the test, run pending hooks and hooks function
- wfDebug( __METHOD__ . " unleashing delayed test for: {$this->sectionData['test']}" );
- $hooksResult = $delayedParserTest->unleash( $this->parserTest );
- if( !$hooksResult ) {
- # Some hook reported an issue. Abort.
- return false;
- }
-
- $this->test = array(
- 'test' => ParserTest::chomp( $this->sectionData['test'] ),
- 'input' => ParserTest::chomp( $this->sectionData['input'] ),
- 'result' => ParserTest::chomp( $this->sectionData['result'] ),
- 'options' => ParserTest::chomp( $this->sectionData['options'] ),
- 'config' => ParserTest::chomp( $this->sectionData['config'] ),
- );
-
- return true;
- }
-
- if ( isset ( $this->sectionData[$this->section] ) ) {
- throw new MWException( "duplicate section '$this->section' at line {$this->lineNum} of $this->file\n" );
- }
-
- $this->sectionData[$this->section] = '';
-
- continue;
- }
-
- if ( $this->section ) {
- $this->sectionData[$this->section] .= $line;
- }
- }
-
- return false;
- }
-
-
- /**
- * Clear section name and its data
- */
- private function clearSection() {
- $this->sectionData = array();
- $this->section = null;
-
- }
-
- /**
- * Verify the current section data has some value for the given token
- * name (first parameter).
- * Throw an exception if it is not set, referencing current section
- * and adding the current file name and line number
- *
- * @param $token String: expected token that should have been mentionned before closing this section
- */
- private function checkSection( $token ) {
- if( is_null( $this->section ) ) {
- throw new MWException( __METHOD__ . " can not verify a null section!\n" );
- }
-
- if( !isset($this->sectionData[$token]) ) {
- throw new MWException( sprintf(
- "'%s' without '%s' at line %s of %s\n",
- $this->section,
- $token,
- $this->lineNum,
- $this->file
- ));
- }
- return true;
- }
-}
-
-/**
- * A class to delay execution of a parser test hooks.
- */
-class DelayedParserTest {
-
- /** Initialized on construction */
- private $hooks;
- private $fnHooks;
-
- public function __construct() {
- $this->reset();
- }
-
- /**
- * Init/reset or forgot about the current delayed test.
- * Call to this will erase any hooks function that were pending.
- */
- public function reset() {
- $this->hooks = array();
- $this->fnHooks = array();
- }
-
- /**
- * Called whenever we actually want to run the hook.
- * Should be the case if we found the parserTest is not disabled
- */
- public function unleash( &$parserTest ) {
- if( !($parserTest instanceof ParserTest || $parserTest instanceof NewParserTest
- ) ) {
- throw new MWException( __METHOD__ . " must be passed an instance of ParserTest or NewParserTest classes\n" );
- }
-
- # Trigger delayed hooks. Any failure will make us abort
- foreach( $this->hooks as $hook ) {
- $ret = $parserTest->requireHook( $hook );
- if( !$ret ) {
- return false;
- }
- }
-
- # Trigger delayed function hooks. Any failure will make us abort
- foreach( $this->fnHooks as $fnHook ) {
- $ret = $parserTest->requireFunctionHook( $fnHook );
- if( !$ret ) {
- return false;
- }
- }
-
- # Delayed execution was successful.
- return true;
- }
-
- /**
- * Similar to ParserTest object but does not run anything
- * Use unleash() to really execute the hook
- */
- public function requireHook( $hook ) {
- $this->hooks[] = $hook;
- }
- /**
- * Similar to ParserTest object but does not run anything
- * Use unleash() to really execute the hook function
- */
- public function requireFunctionHook( $fnHook ) {
- $this->fnHooks[] = $fnHook;
- }
-
-}
diff --git a/thumb.php b/thumb.php
index c53eb2a5..ede30e6e 100644
--- a/thumb.php
+++ b/thumb.php
@@ -35,9 +35,10 @@ if ( defined( 'THUMB_HANDLER' ) ) {
// Called from thumb_handler.php via 404; extract params from the URI...
wfThumbHandle404();
} else {
- // Called directly, use $_REQUEST params
+ // Called directly, use $_GET params
wfThumbHandleRequest();
}
+
wfLogProfilingData();
//--------------------------------------------------------------------------
@@ -49,8 +50,8 @@ wfLogProfilingData();
*/
function wfThumbHandleRequest() {
$params = get_magic_quotes_gpc()
- ? array_map( 'stripslashes', $_REQUEST )
- : $_REQUEST;
+ ? array_map( 'stripslashes', $_GET )
+ : $_GET;
wfStreamThumb( $params ); // stream the thumbnail
}
@@ -61,28 +62,21 @@ function wfThumbHandleRequest() {
* @return void
*/
function wfThumbHandle404() {
- # lighttpd puts the original request in REQUEST_URI, while sjs sets
- # that to the 404 handler, and puts the original request in REDIRECT_URL.
- if ( isset( $_SERVER['REDIRECT_URL'] ) ) {
- # The URL is un-encoded, so put it back how it was
- $uriPath = str_replace( "%2F", "/", urlencode( $_SERVER['REDIRECT_URL'] ) );
- } else {
- $uriPath = $_SERVER['REQUEST_URI'];
- }
- # Just get the URI path (REDIRECT_URL/REQUEST_URI is either a full URL or a path)
- if ( substr( $uriPath, 0, 1 ) !== '/' ) {
- $bits = wfParseUrl( $uriPath );
- if ( $bits && isset( $bits['path'] ) ) {
- $uriPath = $bits['path'];
- } else {
- wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
- return;
- }
+ global $wgArticlePath;
+
+ # Set action base paths so that WebRequest::getPathInfo()
+ # recognizes the "X" as the 'title' in ../thumb_handler.php/X urls.
+ $wgArticlePath = false; # Don't let a "/*" article path clober our action path
+
+ $matches = WebRequest::getPathInfo();
+ if ( !isset( $matches['title'] ) ) {
+ wfThumbError( 404, 'Could not determine the name of the requested thumbnail.' );
+ return;
}
- $params = wfExtractThumbParams( $uriPath ); // basic wiki URL param extracting
+ $params = wfExtractThumbParams( $matches['title'] ); // basic wiki URL param extracting
if ( $params == null ) {
- wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
+ wfThumbError( 400, 'The specified thumbnail parameters are not recognized.' );
return;
}
@@ -97,6 +91,7 @@ function wfThumbHandle404() {
*/
function wfStreamThumb( array $params ) {
global $wgVaryOnXFP;
+
wfProfileIn( __METHOD__ );
$headers = array(); // HTTP headers to send
@@ -153,6 +148,13 @@ function wfStreamThumb( array $params ) {
$img = wfLocalFile( $fileName );
}
+ // Check the source file title
+ if ( !$img ) {
+ wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+
// Check permissions if there are read restrictions
$varyHeader = array();
if ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) ) {
@@ -167,19 +169,12 @@ function wfStreamThumb( array $params ) {
}
// Check the source file storage path
- if ( !$img ) {
- wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
- wfProfileOut( __METHOD__ );
- return;
- }
if ( !$img->exists() ) {
- wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
+ wfThumbError( 404, "The source file '$fileName' does not exist." );
wfProfileOut( __METHOD__ );
return;
- }
- $sourcePath = $img->getPath();
- if ( $sourcePath === false ) {
- wfThumbError( 500, 'The source file is not locally accessible.' );
+ } elseif ( $img->getPath() === false ) {
+ wfThumbError( 500, "The source file '$fileName' is not locally accessible." );
wfProfileOut( __METHOD__ );
return;
}
@@ -193,66 +188,74 @@ function wfStreamThumb( array $params ) {
wfSuppressWarnings();
$imsUnix = strtotime( $imsString );
wfRestoreWarnings();
- $sourceTsUnix = wfTimestamp( TS_UNIX, $img->getTimestamp() );
- if ( $sourceTsUnix <= $imsUnix ) {
+ if ( wfTimestamp( TS_UNIX, $img->getTimestamp() ) <= $imsUnix ) {
header( 'HTTP/1.1 304 Not Modified' );
wfProfileOut( __METHOD__ );
return;
}
}
- $thumbName = $img->thumbName( $params );
- if ( !strlen( $thumbName ) ) { // invalid params?
- wfThumbError( 400, 'The specified thumbnail parameters are not valid.' );
+ // Get the normalized thumbnail name from the parameters...
+ try {
+ $thumbName = $img->thumbName( $params );
+ if ( !strlen( $thumbName ) ) { // invalid params?
+ wfThumbError( 400, 'The specified thumbnail parameters are not valid.' );
+ wfProfileOut( __METHOD__ );
+ return;
+ }
+ $thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
+ } catch ( MWException $e ) {
+ wfThumbError( 500, $e->getHTML() );
wfProfileOut( __METHOD__ );
return;
}
- $disposition = $img->getThumbDisposition( $thumbName );
- $headers[] = "Content-Disposition: $disposition";
-
- // Stream the file if it exists already...
- try {
- $thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
- // For 404 handled thumbnails, we only use the the base name of the URI
- // for the thumb params and the parent directory for the source file name.
- // Check that the zone relative path matches up so squid caches won't pick
- // up thumbs that would not be purged on source file deletion (bug 34231).
- if ( isset( $params['rel404'] ) ) { // thumbnail was handled via 404
- if ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName ) ) {
- // Request for the canonical thumbnail name
- } elseif ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName2 ) ) {
- // Request for the "long" thumbnail name; redirect to canonical name
- $response = RequestContext::getMain()->getRequest()->response();
- $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
- $response->header( 'Location: ' . wfExpandUrl( $img->getThumbUrl( $thumbName ), PROTO_CURRENT ) );
- $response->header( 'Expires: ' .
- gmdate( 'D, d M Y H:i:s', time() + 7*86400 ) . ' GMT' );
- if ( $wgVaryOnXFP ) {
- $varyHeader[] = 'X-Forwarded-Proto';
- }
+ // For 404 handled thumbnails, we only use the the base name of the URI
+ // for the thumb params and the parent directory for the source file name.
+ // Check that the zone relative path matches up so squid caches won't pick
+ // up thumbs that would not be purged on source file deletion (bug 34231).
+ if ( isset( $params['rel404'] ) ) { // thumbnail was handled via 404
+ if ( rawurldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName ) ) {
+ // Request for the canonical thumbnail name
+ } elseif ( rawurldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName2 ) ) {
+ // Request for the "long" thumbnail name; redirect to canonical name
+ $response = RequestContext::getMain()->getRequest()->response();
+ $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
+ $response->header( 'Location: ' .
+ wfExpandUrl( $img->getThumbUrl( $thumbName ), PROTO_CURRENT ) );
+ $response->header( 'Expires: ' .
+ gmdate( 'D, d M Y H:i:s', time() + 7 * 86400 ) . ' GMT' );
+ if ( $wgVaryOnXFP ) {
+ $varyHeader[] = 'X-Forwarded-Proto';
+ }
+ if ( count( $varyHeader ) ) {
$response->header( 'Vary: ' . implode( ', ', $varyHeader ) );
- wfProfileOut( __METHOD__ );
- return;
- } else {
- wfThumbError( 404, 'The given path of the specified thumbnail is incorrect.' );
- wfProfileOut( __METHOD__ );
- return;
}
- }
- $thumbPath = $img->getThumbPath( $thumbName );
- if ( $img->getRepo()->fileExists( $thumbPath ) ) {
- $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
- $img->getRepo()->streamFile( $thumbPath, $headers );
+ wfProfileOut( __METHOD__ );
+ return;
+ } else {
+ wfThumbError( 404, "The given path of the specified thumbnail is incorrect;
+ expected '" . $img->getThumbRel( $thumbName ) . "' but got '" .
+ rawurldecode( $params['rel404'] ) . "'." );
wfProfileOut( __METHOD__ );
return;
}
- } catch ( MWException $e ) {
- wfThumbError( 500, $e->getHTML() );
+ }
+
+ // Suggest a good name for users downloading this thumbnail
+ $headers[] = "Content-Disposition: {$img->getThumbDisposition( $thumbName )}";
+
+ if ( count( $varyHeader ) ) {
+ $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
+ }
+
+ // Stream the file if it exists already...
+ $thumbPath = $img->getThumbPath( $thumbName );
+ if ( $img->getRepo()->fileExists( $thumbPath ) ) {
+ $img->getRepo()->streamFile( $thumbPath, $headers );
wfProfileOut( __METHOD__ );
return;
}
- $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
// Thumbnail isn't already there, so create the new thumbnail...
try {
@@ -290,43 +293,28 @@ function wfStreamThumb( array $params ) {
* Extract the required params for thumb.php from the thumbnail request URI.
* At least 'width' and 'f' should be set if the result is an array.
*
- * @param $uriPath String Thumbnail request URI path
+ * @param $thumbRel String Thumbnail path relative to the thumb zone
* @return Array|null associative params array or null
*/
-function wfExtractThumbParams( $uriPath ) {
+function wfExtractThumbParams( $thumbRel ) {
$repo = RepoGroup::singleton()->getLocalRepo();
- // Zone URL might be relative ("/images") or protocol-relative ("//lang.site/image")
- $zoneUriPath = $repo->getZoneHandlerUrl( 'thumb' )
- ? $repo->getZoneHandlerUrl( 'thumb' ) // custom URL
- : $repo->getZoneUrl( 'thumb' ); // default to main URL
- $bits = wfParseUrl( wfExpandUrl( $zoneUriPath, PROTO_INTERNAL ) );
- if ( $bits && isset( $bits['path'] ) ) {
- $zoneUriPath = $bits['path'];
- } else {
- return null; // not a valid thumbnail URL
- }
-
$hashDirReg = $subdirReg = '';
for ( $i = 0; $i < $repo->getHashLevels(); $i++ ) {
$subdirReg .= '[0-9a-f]';
$hashDirReg .= "$subdirReg/";
}
- $zoneReg = preg_quote( $zoneUriPath ); // regex for thumb zone URI
// Check if this is a thumbnail of an original in the local file repo
- if ( preg_match( "!^$zoneReg/((archive/)?$hashDirReg([^/]*)/([^/]*))$!", $uriPath, $m ) ) {
+ if ( preg_match( "!^((archive/)?$hashDirReg([^/]*)/([^/]*))$!", $thumbRel, $m ) ) {
list( /*all*/, $rel, $archOrTemp, $filename, $thumbname ) = $m;
// Check if this is a thumbnail of an temp file in the local file repo
- } elseif ( preg_match( "!^$zoneReg/(temp/)($hashDirReg([^/]*)/([^/]*))$!", $uriPath, $m ) ) {
+ } elseif ( preg_match( "!^(temp/)($hashDirReg([^/]*)/([^/]*))$!", $thumbRel, $m ) ) {
list( /*all*/, $archOrTemp, $rel, $filename, $thumbname ) = $m;
} else {
return null; // not a valid looking thumbnail request
}
- $filename = urldecode( $filename );
- $thumbname = urldecode( $thumbname );
-
$params = array( 'f' => $filename, 'rel404' => $rel );
if ( $archOrTemp === 'archive/' ) {
$params['archived'] = 1;
@@ -334,17 +322,18 @@ function wfExtractThumbParams( $uriPath ) {
$params['temp'] = 1;
}
+ // Check hooks if parameters can be extracted
+ // Hooks return false if they manage to *resolve* the parameters
+ if ( !wfRunHooks( 'ExtractThumbParameters', array( $thumbname, &$params ) ) ) {
+ return $params; // valid thumbnail URL (via extension or config)
// Check if the parameters can be extracted from the thumbnail name...
- if ( preg_match( '!^(page(\d*)-)*(\d*)px-[^/]*$!', $thumbname, $matches ) ) {
+ } elseif ( preg_match( '!^(page(\d*)-)*(\d*)px-[^/]*$!', $thumbname, $matches ) ) {
list( /* all */, $pagefull, $pagenum, $size ) = $matches;
$params['width'] = $size;
if ( $pagenum ) {
$params['page'] = $pagenum;
}
return $params; // valid thumbnail URL
- // Hooks return false if they manage to *resolve* the parameters
- } elseif ( !wfRunHooks( 'ExtractThumbParameters', array( $thumbname, &$params ) ) ) {
- return $params; // valid thumbnail URL (via extension or config)
}
return null; // not a valid thumbnail URL
@@ -375,7 +364,7 @@ function wfThumbError( $status, $msg ) {
$hostname = htmlspecialchars( wfHostname() );
$debug = "<!-- $url -->\n<!-- $hostname -->\n";
} else {
- $debug = "";
+ $debug = '';
}
echo <<<EOT
<html><head><title>Error generating thumbnail</title></head>
diff --git a/thumb.php5 b/thumb.php5
index 0c9b702a..2a57d4aa 100644
--- a/thumb.php5
+++ b/thumb.php5
@@ -1,7 +1,7 @@
<?php
/**
* Version of thumb.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
*
* 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
@@ -22,4 +22,4 @@
* @ingroup Media
*/
-require './thumb.php';
+require './thumb.php';
diff --git a/thumb_handler.php5 b/thumb_handler.php5
index 20d681ba..f160c879 100644
--- a/thumb_handler.php5
+++ b/thumb_handler.php5
@@ -1,7 +1,7 @@
<?php
/**
* Version of thumb_handler.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 egine.
+ * to execute scripts with PHP5 engine.
*
* 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